summaryrefslogtreecommitdiffstats
path: root/demos/boxes/boxes.pro
blob: 6c1a33156c86831d48e827574ca4ba174e6993c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
######################################################################
# Automatically generated by qmake (2.01a) ma 3. nov 17:33:30 2008
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += 3rdparty/fbm.h \
           glbuffers.h \
           glextensions.h \
           glshaders.h \
           gltrianglemesh.h \
           qtbox.h \
           roundedbox.h \
           scene.h \
           trackball.h \
           vector.h
SOURCES += 3rdparty/fbm.c \
           glbuffers.cpp \
           glextensions.cpp \
           glshaders.cpp \
           main.cpp \
           qtbox.cpp \
           roundedbox.cpp \
           scene.cpp \
           trackball.cpp

RESOURCES += boxes.qrc

QT += opengl

# install
target.path = $$[QT_INSTALL_DEMOS]/boxes
sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro *.html *.jpg *.png *.fsh *.vsh *.par
sources.files -= 3rdparty/fbm.h 3rdparty/fbm.c
sources.files += 3rdparty
sources.path = $$[QT_INSTALL_DEMOS]/boxes
INSTALLS += target sources

wince*: {
    DEPLOYMENT_PLUGIN += qjpeg
}

win32-msvc* {
    QMAKE_CXXFLAGS += /Zm1200
    QMAKE_CFLAGS += /Zm1200
}
e'>-rw-r--r--Doc/c-api/code.rst6
-rw-r--r--Doc/c-api/conversion.rst4
-rw-r--r--Doc/c-api/datetime.rst25
-rw-r--r--Doc/c-api/dict.rst15
-rw-r--r--Doc/c-api/exceptions.rst252
-rw-r--r--Doc/c-api/function.rst10
-rw-r--r--Doc/c-api/import.rst83
-rw-r--r--Doc/c-api/index.rst1
-rw-r--r--Doc/c-api/init.rst2
-rw-r--r--Doc/c-api/list.rst7
-rw-r--r--Doc/c-api/long.rst14
-rw-r--r--Doc/c-api/memoryview.rst31
-rw-r--r--Doc/c-api/module.rst56
-rw-r--r--Doc/c-api/object.rst29
-rw-r--r--Doc/c-api/set.rst7
-rw-r--r--Doc/c-api/stable.rst39
-rw-r--r--Doc/c-api/type.rst25
-rw-r--r--Doc/c-api/typeobj.rst102
-rw-r--r--Doc/c-api/unicode.rst876
-rw-r--r--Doc/c-api/veryhigh.rst6
-rw-r--r--Doc/conf.py2
-rw-r--r--Doc/data/refcounts.dat5
-rw-r--r--Doc/distutils/apiref.rst13
-rw-r--r--Doc/extending/extending.rst5
-rw-r--r--Doc/extending/newtypes.rst72
-rw-r--r--Doc/faq/design.rst20
-rw-r--r--Doc/faq/extending.rst31
-rw-r--r--Doc/faq/library.rst2
-rw-r--r--Doc/glossary.rst122
-rw-r--r--Doc/howto/descriptor.rst12
-rw-r--r--Doc/howto/functional.rst5
-rw-r--r--Doc/howto/index.rst1
-rw-r--r--Doc/howto/ipaddress.rst341
-rw-r--r--Doc/howto/logging-cookbook.rst29
-rw-r--r--Doc/howto/sockets.rst36
-rw-r--r--Doc/howto/unicode.rst2
-rw-r--r--Doc/howto/urllib2.rst7
-rw-r--r--Doc/includes/mp_benchmarks.py6
-rw-r--r--Doc/includes/noddy2.c50
-rw-r--r--Doc/includes/noddy3.c118
-rw-r--r--Doc/includes/noddy4.c48
-rw-r--r--Doc/library/_thread.rst5
-rw-r--r--Doc/library/abc.rst82
-rw-r--r--Doc/library/archiving.rst6
-rw-r--r--Doc/library/argparse.rst31
-rw-r--r--Doc/library/array.rst78
-rw-r--r--Doc/library/ast.rst3
-rw-r--r--Doc/library/asynchat.rst3
-rw-r--r--Doc/library/asyncore.rst13
-rw-r--r--Doc/library/atexit.rst21
-rw-r--r--Doc/library/base64.rst11
-rw-r--r--Doc/library/binary.rst23
-rw-r--r--Doc/library/binascii.rst9
-rw-r--r--Doc/library/bz2.rst249
-rw-r--r--Doc/library/chunk.rst5
-rw-r--r--Doc/library/cmd.rst4
-rw-r--r--Doc/library/codecs.rst34
-rw-r--r--Doc/library/collections.abc.rst182
-rw-r--r--Doc/library/collections.rst1164
-rw-r--r--Doc/library/concurrency.rst32
-rw-r--r--Doc/library/concurrent.futures.rst38
-rw-r--r--Doc/library/concurrent.rst6
-rw-r--r--Doc/library/contextlib.rst347
-rw-r--r--Doc/library/copyreg.rst8
-rw-r--r--Doc/library/crypt.rst123
-rw-r--r--Doc/library/crypto.rst1
-rw-r--r--Doc/library/csv.rst18
-rw-r--r--Doc/library/ctypes.rst115
-rw-r--r--Doc/library/curses.rst36
-rw-r--r--Doc/library/datatypes.rst3
-rw-r--r--Doc/library/datetime.rst128
-rw-r--r--Doc/library/debug.rst3
-rw-r--r--Doc/library/decimal.rst184
-rw-r--r--Doc/library/depgraph-output.pngbin0 -> 24719 bytes-rw-r--r--Doc/library/development.rst3
-rw-r--r--Doc/library/difflib.rst4
-rw-r--r--Doc/library/dis.rst19
-rw-r--r--Doc/library/distutils.rst12
-rw-r--r--Doc/library/doctest.rst68
-rw-r--r--Doc/library/email.errors.rst21
-rw-r--r--Doc/library/email.generator.rst65
-rw-r--r--Doc/library/email.header.rst6
-rw-r--r--Doc/library/email.headerregistry.rst452
-rw-r--r--Doc/library/email.message.rst8
-rw-r--r--Doc/library/email.mime.rst6
-rw-r--r--Doc/library/email.parser.rst81
-rw-r--r--Doc/library/email.policy.rst497
-rw-r--r--Doc/library/email.rst2
-rw-r--r--Doc/library/email.util.rst57
-rw-r--r--Doc/library/exceptions.rst248
-rw-r--r--Doc/library/faulthandler.rst136
-rw-r--r--Doc/library/fcntl.rst9
-rw-r--r--Doc/library/filecmp.rst21
-rw-r--r--Doc/library/fileinput.rst9
-rw-r--r--Doc/library/ftplib.rst65
-rw-r--r--Doc/library/functions.rst244
-rw-r--r--Doc/library/functools.rst18
-rw-r--r--Doc/library/gc.rst39
-rw-r--r--Doc/library/gettext.rst7
-rw-r--r--Doc/library/gzip.rst51
-rw-r--r--Doc/library/hmac.rst35
-rw-r--r--Doc/library/html.entities.rst23
-rw-r--r--Doc/library/html.parser.rst24
-rw-r--r--Doc/library/html.rst7
-rw-r--r--Doc/library/http.client.rst21
-rw-r--r--Doc/library/http.cookiejar.rst11
-rw-r--r--Doc/library/http.cookies.rst5
-rw-r--r--Doc/library/http.rst11
-rw-r--r--Doc/library/http.server.rst59
-rw-r--r--Doc/library/imaplib.rst27
-rw-r--r--Doc/library/imp.rst128
-rw-r--r--Doc/library/importlib.rst501
-rw-r--r--Doc/library/index.rst5
-rw-r--r--Doc/library/inspect.rst377
-rw-r--r--Doc/library/internet.rst4
-rw-r--r--Doc/library/io.rst169
-rw-r--r--Doc/library/ipaddress.rst804
-rw-r--r--Doc/library/ipc.rst6
-rw-r--r--Doc/library/itertools.rst51
-rw-r--r--Doc/library/locale.rst7
-rw-r--r--Doc/library/logging.handlers.rst109
-rw-r--r--Doc/library/logging.rst41
-rw-r--r--Doc/library/lzma.rst382
-rw-r--r--Doc/library/markup.rst9
-rw-r--r--Doc/library/math.rst13
-rw-r--r--Doc/library/mmap.rst12
-rw-r--r--Doc/library/msvcrt.rst15
-rw-r--r--Doc/library/multiprocessing.rst375
-rw-r--r--Doc/library/nntplib.rst16
-rw-r--r--Doc/library/numeric.rst6
-rw-r--r--Doc/library/os.path.rst14
-rw-r--r--Doc/library/os.rst1482
-rw-r--r--Doc/library/ossaudiodev.rst14
-rw-r--r--Doc/library/pdb.rst5
-rw-r--r--Doc/library/pickle.rst61
-rw-r--r--Doc/library/pkgutil.rst85
-rw-r--r--Doc/library/platform.rst22
-rw-r--r--Doc/library/random.rst9
-rw-r--r--Doc/library/re.rst20
-rw-r--r--Doc/library/readline.rst4
-rw-r--r--Doc/library/resource.rst8
-rw-r--r--Doc/library/sched.rst66
-rw-r--r--Doc/library/select.rst113
-rw-r--r--Doc/library/shlex.rst37
-rw-r--r--Doc/library/shutil.rst295
-rw-r--r--Doc/library/signal.rst169
-rw-r--r--Doc/library/site.rst33
-rw-r--r--Doc/library/smtpd.rst20
-rw-r--r--Doc/library/smtplib.rst65
-rw-r--r--Doc/library/socket.rst414
-rw-r--r--Doc/library/socketserver.rst20
-rw-r--r--Doc/library/someos.rst24
-rw-r--r--Doc/library/sqlite3.rst16
-rw-r--r--Doc/library/ssl.rst269
-rw-r--r--Doc/library/stat.rst11
-rw-r--r--Doc/library/stdtypes.rst1645
-rw-r--r--Doc/library/string.rst2
-rw-r--r--Doc/library/strings.rst27
-rw-r--r--Doc/library/struct.rst21
-rw-r--r--Doc/library/subprocess.rst210
-rw-r--r--Doc/library/sys.rst234
-rw-r--r--Doc/library/syslog.rst10
-rw-r--r--Doc/library/tarfile.rst44
-rw-r--r--Doc/library/telnetlib.rst6
-rw-r--r--Doc/library/tempfile.rst8
-rw-r--r--Doc/library/test.rst167
-rw-r--r--Doc/library/text.rst26
-rw-r--r--Doc/library/textwrap.rst44
-rw-r--r--Doc/library/threading.rst393
-rw-r--r--Doc/library/time.rst227
-rw-r--r--Doc/library/timeit.rst33
-rw-r--r--Doc/library/tkinter.rst64
-rw-r--r--Doc/library/tokenize.rst108
-rw-r--r--Doc/library/types.rst151
-rw-r--r--Doc/library/unicodedata.rst13
-rw-r--r--Doc/library/unittest.mock-examples.rst1246
-rw-r--r--Doc/library/unittest.mock.rst2226
-rw-r--r--Doc/library/unittest.rst80
-rw-r--r--Doc/library/urllib.error.rst12
-rw-r--r--Doc/library/urllib.parse.rst13
-rw-r--r--Doc/library/urllib.request.rst175
-rw-r--r--Doc/library/urllib.rst9
-rw-r--r--Doc/library/venv.rst180
-rw-r--r--Doc/library/warnings.rst3
-rw-r--r--Doc/library/webbrowser.rst97
-rw-r--r--Doc/library/winreg.rst60
-rw-r--r--Doc/library/wsgiref.rst3
-rw-r--r--Doc/library/xml.dom.minidom.rst7
-rw-r--r--Doc/library/xml.etree.elementtree.rst502
-rw-r--r--Doc/library/xml.rst29
-rw-r--r--Doc/library/xml.sax.utils.rst2
-rw-r--r--Doc/library/xmlrpc.client.rst53
-rw-r--r--Doc/library/xmlrpc.rst12
-rw-r--r--Doc/library/xmlrpc.server.rst28
-rw-r--r--Doc/library/zipfile.rst36
-rw-r--r--Doc/library/zipimport.rst5
-rw-r--r--Doc/library/zlib.rst105
-rw-r--r--Doc/license.rst2
-rw-r--r--Doc/make.bat2
-rw-r--r--Doc/reference/datamodel.rst239
-rw-r--r--Doc/reference/expressions.rst33
-rw-r--r--Doc/reference/import.rst697
-rw-r--r--Doc/reference/index.rst1
-rw-r--r--Doc/reference/lexical_analysis.rst41
-rw-r--r--Doc/reference/simple_stmts.rst236
-rw-r--r--Doc/tools/sphinxext/indexsidebar.html2
-rw-r--r--Doc/tools/sphinxext/layout.html57
-rw-r--r--Doc/tools/sphinxext/patchlevel.py6
-rw-r--r--Doc/tools/sphinxext/pyspecific.py49
-rw-r--r--Doc/tools/sphinxext/susp-ignored.csv384
-rw-r--r--Doc/tutorial/classes.rst5
-rw-r--r--Doc/tutorial/datastructures.rst24
-rw-r--r--Doc/tutorial/interpreter.rst14
-rw-r--r--Doc/tutorial/introduction.rst2
-rw-r--r--Doc/tutorial/stdlib.rst4
-rw-r--r--Doc/tutorial/stdlib2.rst6
-rw-r--r--Doc/using/cmdline.rst58
-rw-r--r--Doc/using/index.rst2
-rw-r--r--Doc/using/scripts.rst12
-rw-r--r--Doc/using/venv-create.inc85
-rw-r--r--Doc/using/windows.rst300
-rw-r--r--Doc/whatsnew/2.0.rst10
-rw-r--r--Doc/whatsnew/2.1.rst8
-rw-r--r--Doc/whatsnew/2.2.rst22
-rw-r--r--Doc/whatsnew/2.3.rst40
-rw-r--r--Doc/whatsnew/2.4.rst44
-rw-r--r--Doc/whatsnew/2.5.rst58
-rw-r--r--Doc/whatsnew/3.0.rst2
-rw-r--r--Doc/whatsnew/3.2.rst8
-rw-r--r--Doc/whatsnew/3.3.rst2508
-rw-r--r--Doc/whatsnew/changelog.rst6
-rw-r--r--Doc/whatsnew/index.rst9
-rw-r--r--Grammar/Grammar5
-rw-r--r--Include/Python-ast.h61
-rw-r--r--Include/Python.h39
-rw-r--r--Include/abstract.h40
-rw-r--r--Include/asdl.h9
-rw-r--r--Include/ast.h1
-rw-r--r--Include/bytesobject.h2
-rw-r--r--Include/code.h6
-rw-r--r--Include/codecs.h2
-rw-r--r--Include/compile.h14
-rw-r--r--Include/complexobject.h9
-rw-r--r--Include/datetime.h6
-rw-r--r--Include/descrobject.h1
-rw-r--r--Include/dictobject.h94
-rw-r--r--Include/dtoa.h2
-rw-r--r--Include/errcode.h1
-rw-r--r--Include/fileutils.h2
-rw-r--r--Include/floatobject.h23
-rw-r--r--Include/frameobject.h46
-rw-r--r--Include/funcobject.h2
-rw-r--r--Include/genobject.h24
-rw-r--r--Include/graminit.h1
-rw-r--r--Include/import.h34
-rw-r--r--Include/intrcheck.h6
-rw-r--r--Include/listobject.h3
-rw-r--r--Include/longintrepr.h2
-rw-r--r--Include/longobject.h28
-rw-r--r--Include/memoryobject.h84
-rw-r--r--Include/methodobject.h24
-rw-r--r--Include/modsupport.h5
-rw-r--r--Include/moduleobject.h4
-rw-r--r--Include/namespaceobject.h17
-rw-r--r--Include/node.h1
-rw-r--r--Include/object.h70
-rw-r--r--Include/objimpl.h13
-rw-r--r--Include/opcode.h188
-rw-r--r--Include/parsetok.h9
-rw-r--r--Include/patchlevel.h10
-rw-r--r--Include/py_curses.h1
-rw-r--r--Include/pydebug.h3
-rw-r--r--Include/pyerrors.h85
-rw-r--r--Include/pyexpat.h2
-rw-r--r--Include/pymacro.h69
-rw-r--r--Include/pymath.h6
-rw-r--r--Include/pyport.h2
-rw-r--r--Include/pystate.h18
-rw-r--r--Include/pythonrun.h16
-rw-r--r--Include/pythread.h4
-rw-r--r--Include/pytime.h46
-rw-r--r--Include/setobject.h3
-rw-r--r--Include/structmember.h65
-rw-r--r--Include/symtable.h13
-rw-r--r--Include/timefuncs.h25
-rw-r--r--Include/traceback.h38
-rw-r--r--Include/tupleobject.h3
-rw-r--r--Include/ucnhash.h6
-rw-r--r--Include/unicodeobject.h1116
-rw-r--r--LICENSE1
-rw-r--r--Lib/_dummy_thread.py6
-rw-r--r--Lib/_osx_support.py488
-rw-r--r--Lib/_pyio.py189
-rw-r--r--Lib/_strptime.py6
-rw-r--r--Lib/abc.py27
-rw-r--r--Lib/aifc.py12
-rw-r--r--Lib/argparse.py94
-rw-r--r--Lib/ast.py1
-rw-r--r--Lib/asynchat.py16
-rw-r--r--Lib/asyncore.py18
-rwxr-xr-xLib/base64.py50
-rw-r--r--Lib/binhex.py1
-rw-r--r--Lib/bz2.py504
-rwxr-xr-xLib/cgi.py13
-rw-r--r--Lib/cgitb.py1
-rw-r--r--Lib/code.py19
-rw-r--r--Lib/codecs.py21
-rw-r--r--Lib/collections/__init__.py (renamed from Lib/collections.py)168
-rw-r--r--Lib/collections/__main__.py38
-rw-r--r--Lib/collections/abc.py (renamed from Lib/_abcoll.py)51
-rw-r--r--Lib/concurrent/futures/_base.py27
-rw-r--r--Lib/concurrent/futures/process.py136
-rw-r--r--Lib/concurrent/futures/thread.py2
-rw-r--r--Lib/configparser.py23
-rw-r--r--Lib/contextlib.py126
-rw-r--r--Lib/copy.py77
-rw-r--r--Lib/crypt.py62
-rw-r--r--Lib/ctypes/__init__.py4
-rw-r--r--Lib/ctypes/test/test_callbacks.py2
-rw-r--r--Lib/ctypes/test/test_memfunctions.py2
-rw-r--r--Lib/ctypes/test/test_parameters.py9
-rw-r--r--Lib/ctypes/test/test_pep3118.py76
-rw-r--r--Lib/ctypes/test/test_python_api.py3
-rw-r--r--Lib/ctypes/test/test_refcounts.py3
-rw-r--r--Lib/ctypes/test/test_stringptr.py2
-rw-r--r--Lib/ctypes/test/test_win32.py22
-rw-r--r--Lib/ctypes/util.py37
-rw-r--r--Lib/curses/__init__.py46
-rw-r--r--Lib/curses/wrapper.py50
-rw-r--r--Lib/datetime.py75
-rw-r--r--Lib/decimal.py337
-rw-r--r--Lib/difflib.py23
-rw-r--r--Lib/dis.py6
-rw-r--r--Lib/distutils/__init__.py2
-rw-r--r--Lib/distutils/command/bdist_wininst.py6
-rw-r--r--Lib/distutils/command/build_ext.py18
-rw-r--r--Lib/distutils/command/build_scripts.py7
-rw-r--r--Lib/distutils/command/wininst-10.0-amd64.exebin0 -> 222208 bytes-rw-r--r--Lib/distutils/command/wininst-10.0.exebin0 -> 190976 bytes-rw-r--r--Lib/distutils/cygwinccompiler.py3
-rw-r--r--Lib/distutils/sysconfig.py151
-rw-r--r--Lib/distutils/tests/test_archive_util.py40
-rw-r--r--Lib/distutils/tests/test_bdist_rpm.py9
-rw-r--r--Lib/distutils/tests/test_sysconfig.py51
-rw-r--r--Lib/distutils/tests/test_util.py9
-rw-r--r--Lib/distutils/unixccompiler.py70
-rw-r--r--Lib/distutils/util.py96
-rw-r--r--Lib/doctest.py9
-rw-r--r--Lib/email/_encoded_words.py221
-rw-r--r--Lib/email/_header_value_parser.py2953
-rw-r--r--Lib/email/_parseaddr.py31
-rw-r--r--Lib/email/_policybase.py358
-rw-r--r--Lib/email/architecture.rst216
-rw-r--r--Lib/email/errors.py60
-rw-r--r--Lib/email/feedparser.py73
-rw-r--r--Lib/email/generator.py107
-rw-r--r--Lib/email/header.py45
-rw-r--r--Lib/email/headerregistry.py583
-rw-r--r--Lib/email/message.py86
-rw-r--r--Lib/email/mime/text.py14
-rw-r--r--Lib/email/parser.py43
-rw-r--r--Lib/email/policy.py188
-rw-r--r--Lib/email/utils.py147
-rw-r--r--Lib/encodings/cp037.py1
-rw-r--r--Lib/encodings/cp500.py1
-rw-r--r--Lib/encodings/cp65001.py40
-rw-r--r--Lib/encodings/hp_roman8.py376
-rw-r--r--Lib/encodings/idna.py22
-rw-r--r--Lib/encodings/iso8859_1.py1
-rw-r--r--Lib/encodings/mac_latin2.py409
-rw-r--r--Lib/encodings/palmos.py311
-rw-r--r--Lib/encodings/ptcp154.py399
-rw-r--r--Lib/fileinput.py3
-rw-r--r--Lib/fnmatch.py10
-rw-r--r--Lib/ftplib.py107
-rw-r--r--Lib/functools.py179
-rw-r--r--Lib/getopt.py19
-rw-r--r--Lib/getpass.py4
-rw-r--r--Lib/gettext.py2
-rw-r--r--Lib/gzip.py105
-rw-r--r--Lib/hmac.py4
-rw-r--r--Lib/html/entities.py2236
-rw-r--r--Lib/html/parser.py53
-rw-r--r--Lib/http/client.py175
-rw-r--r--Lib/http/cookiejar.py8
-rw-r--r--Lib/http/cookies.py2
-rw-r--r--Lib/http/server.py97
-rw-r--r--Lib/idlelib/AutoComplete.py3
-rw-r--r--Lib/idlelib/ColorDelegator.py13
-rw-r--r--Lib/idlelib/EditorWindow.py19
-rw-r--r--Lib/idlelib/IOBinding.py8
-rw-r--r--Lib/idlelib/NEWS.txt29
-rw-r--r--Lib/idlelib/PathBrowser.py7
-rw-r--r--Lib/idlelib/PyShell.py16
-rw-r--r--Lib/idlelib/ScriptBinding.py12
-rw-r--r--Lib/idlelib/__main__.py9
-rw-r--r--Lib/idlelib/configHandler.py3
-rw-r--r--Lib/idlelib/idlever.py2
-rw-r--r--Lib/idlelib/macosxSupport.py16
-rw-r--r--Lib/idlelib/rpc.py26
-rw-r--r--Lib/idlelib/run.py14
-rw-r--r--Lib/imaplib.py78
-rw-r--r--Lib/imp.py257
-rw-r--r--Lib/importlib/__init__.py144
-rw-r--r--Lib/importlib/_bootstrap.py1641
-rw-r--r--Lib/importlib/abc.py164
-rw-r--r--Lib/importlib/machinery.py15
-rw-r--r--Lib/importlib/test/__main__.py29
-rw-r--r--Lib/importlib/test/benchmark.py172
-rw-r--r--Lib/importlib/test/extension/test_loader.py59
-rw-r--r--Lib/importlib/test/import_/test_api.py22
-rw-r--r--Lib/importlib/test/import_/test_packages.py37
-rw-r--r--Lib/importlib/test/import_/test_path.py131
-rw-r--r--Lib/importlib/test/regrtest.py35
-rw-r--r--Lib/importlib/util.py16
-rw-r--r--Lib/inspect.py1011
-rw-r--r--Lib/io.py3
-rw-r--r--Lib/ipaddress.py2094
-rw-r--r--Lib/json/decoder.py3
-rw-r--r--Lib/lib2to3/__main__.py4
-rw-r--r--Lib/lib2to3/fixer_base.py4
-rw-r--r--Lib/lib2to3/pytree.py20
-rw-r--r--Lib/lib2to3/refactor.py4
-rw-r--r--Lib/lib2to3/tests/test_pytree.py17
-rw-r--r--Lib/logging/__init__.py164
-rw-r--r--Lib/logging/config.py18
-rw-r--r--Lib/logging/handlers.py152
-rw-r--r--Lib/lzma.py454
-rw-r--r--Lib/mailbox.py22
-rw-r--r--Lib/mailcap.py6
-rw-r--r--Lib/mimetypes.py3
-rw-r--r--Lib/modulefinder.py21
-rw-r--r--Lib/multiprocessing/__init__.py57
-rw-r--r--Lib/multiprocessing/connection.py659
-rw-r--r--Lib/multiprocessing/dummy/__init__.py17
-rw-r--r--Lib/multiprocessing/dummy/connection.py12
-rw-r--r--Lib/multiprocessing/forking.py189
-rw-r--r--Lib/multiprocessing/heap.py45
-rw-r--r--Lib/multiprocessing/managers.py171
-rw-r--r--Lib/multiprocessing/pool.py116
-rw-r--r--Lib/multiprocessing/process.py47
-rw-r--r--Lib/multiprocessing/queues.py46
-rw-r--r--Lib/multiprocessing/reduction.py407
-rw-r--r--Lib/multiprocessing/sharedctypes.py38
-rw-r--r--Lib/multiprocessing/synchronize.py94
-rw-r--r--Lib/multiprocessing/util.py71
-rw-r--r--Lib/nntplib.py20
-rw-r--r--Lib/numbers.py14
-rw-r--r--Lib/opcode.py9
-rw-r--r--Lib/optparse.py31
-rw-r--r--Lib/os.py239
-rwxr-xr-xLib/pdb.py95
-rw-r--r--Lib/pickle.py18
-rw-r--r--Lib/pickletools.py7
-rw-r--r--Lib/pipes.py23
-rw-r--r--Lib/pkgutil.py188
-rw-r--r--Lib/plat-linux/CDROM.py (renamed from Lib/plat-linux2/CDROM.py)0
-rw-r--r--Lib/plat-linux/DLFCN.py (renamed from Lib/plat-linux2/DLFCN.py)0
-rw-r--r--Lib/plat-linux/IN.py (renamed from Lib/plat-linux2/IN.py)0
-rw-r--r--Lib/plat-linux/TYPES.py (renamed from Lib/plat-linux2/TYPES.py)0
-rwxr-xr-xLib/plat-linux/regen (renamed from Lib/plat-linux2/regen)0
-rwxr-xr-xLib/platform.py135
-rw-r--r--Lib/plistlib.py40
-rw-r--r--Lib/poplib.py17
-rw-r--r--Lib/posixpath.py3
-rwxr-xr-xLib/profile.py36
-rw-r--r--Lib/pstats.py3
-rw-r--r--Lib/py_compile.py7
-rw-r--r--Lib/pyclbr.py25
-rwxr-xr-xLib/pydoc.py345
-rw-r--r--Lib/pydoc_data/topics.py49
-rw-r--r--Lib/queue.py140
-rw-r--r--Lib/random.py2
-rw-r--r--Lib/re.py15
-rw-r--r--Lib/runpy.py72
-rw-r--r--Lib/sched.py86
-rw-r--r--Lib/shlex.py20
-rw-r--r--Lib/shutil.py463
-rw-r--r--Lib/site.py110
-rwxr-xr-xLib/smtpd.py297
-rw-r--r--Lib/smtplib.py152
-rw-r--r--Lib/socket.py21
-rw-r--r--Lib/socketserver.py24
-rw-r--r--Lib/sqlite3/test/dbapi.py2
-rw-r--r--Lib/sqlite3/test/factory.py4
-rw-r--r--Lib/sqlite3/test/hooks.py54
-rw-r--r--Lib/sqlite3/test/regression.py2
-rw-r--r--Lib/sqlite3/test/transactions.py2
-rw-r--r--Lib/sqlite3/test/types.py4
-rw-r--r--Lib/sqlite3/test/userfunctions.py2
-rw-r--r--Lib/sre_compile.py4
-rw-r--r--Lib/sre_parse.py68
-rw-r--r--Lib/ssl.py98
-rw-r--r--Lib/stat.py129
-rw-r--r--Lib/string.py24
-rw-r--r--Lib/subprocess.py839
-rw-r--r--Lib/sysconfig.py407
-rwxr-xr-xLib/tabnanny.py3
-rw-r--r--Lib/tarfile.py399
-rw-r--r--Lib/tempfile.py56
-rw-r--r--Lib/test/buffer_tests.py8
-rw-r--r--Lib/test/crashers/README4
-rw-r--r--Lib/test/crashers/borrowed_ref_1.py29
-rw-r--r--Lib/test/crashers/borrowed_ref_2.py38
-rw-r--r--Lib/test/crashers/compiler_recursion.py5
-rw-r--r--Lib/test/crashers/loosing_mro_ref.py35
-rw-r--r--Lib/test/crashers/nasty_eq_vs_dict.py47
-rw-r--r--Lib/test/crashers/recursion_limit_too_high.py16
-rw-r--r--Lib/test/datetimetester.py128
-rw-r--r--Lib/test/decimaltestdata/extra.decTest13
-rw-r--r--Lib/test/dh512.pem9
-rw-r--r--Lib/test/exception_hierarchy.txt21
-rw-r--r--Lib/test/fork_wait.py10
-rw-r--r--Lib/test/future_test1.py (renamed from Lib/test/test_future1.py)0
-rw-r--r--Lib/test/future_test2.py (renamed from Lib/test/test_future2.py)0
-rw-r--r--Lib/test/json_tests/test_dump.py19
-rw-r--r--Lib/test/json_tests/test_scanstring.py11
-rw-r--r--Lib/test/keycert.passwd.pem33
-rw-r--r--Lib/test/list_tests.py41
-rw-r--r--Lib/test/lock_tests.py16
-rw-r--r--Lib/test/mailcap.txt39
-rw-r--r--Lib/test/math_testcases.txt114
-rw-r--r--Lib/test/memory_watchdog.py28
-rw-r--r--Lib/test/mock_socket.py3
-rw-r--r--Lib/test/multibytecodec_support.py (renamed from Lib/test/test_multibytecodec_support.py)17
-rw-r--r--Lib/test/namespace_pkgs/both_portions/foo/one.py1
-rw-r--r--Lib/test/namespace_pkgs/both_portions/foo/two.py1
-rw-r--r--Lib/test/namespace_pkgs/missing_directory.zipbin0 -> 515 bytes-rw-r--r--Lib/test/namespace_pkgs/module_and_namespace_package/a_test.py1
-rw-r--r--Lib/test/namespace_pkgs/module_and_namespace_package/a_test/empty (renamed from Lib/importlib/test/__init__.py)0
-rw-r--r--Lib/test/namespace_pkgs/nested_portion1.zipbin0 -> 556 bytes-rw-r--r--Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/__init__.py (renamed from Lib/email/test/__init__.py)0
-rw-r--r--Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/one.py1
-rw-r--r--Lib/test/namespace_pkgs/portion1/foo/one.py1
-rw-r--r--Lib/test/namespace_pkgs/portion2/foo/two.py1
-rw-r--r--Lib/test/namespace_pkgs/project1/parent/child/one.py1
-rw-r--r--Lib/test/namespace_pkgs/project2/parent/child/two.py1
-rw-r--r--Lib/test/namespace_pkgs/project3/parent/child/three.py1
-rw-r--r--Lib/test/namespace_pkgs/top_level_portion1.zipbin0 -> 332 bytes-rw-r--r--Lib/test/pickletester.py150
-rwxr-xr-xLib/test/regrtest.py281
-rw-r--r--Lib/test/reperf.py4
-rw-r--r--Lib/test/script_helper.py7
-rw-r--r--Lib/test/seq_tests.py7
-rw-r--r--Lib/test/sortperf.py4
-rw-r--r--Lib/test/ssl_key.passwd.pem18
-rw-r--r--Lib/test/ssl_servers.py16
-rw-r--r--Lib/test/string_tests.py85
-rw-r--r--Lib/test/support.py370
-rw-r--r--Lib/test/test__locale.py40
-rw-r--r--Lib/test/test__osx_support.py279
-rw-r--r--Lib/test/test_abc.py196
-rw-r--r--Lib/test/test_abstract_numbers.py2
-rw-r--r--Lib/test/test_aifc.py13
-rw-r--r--Lib/test/test_argparse.py173
-rwxr-xr-xLib/test/test_array.py58
-rw-r--r--Lib/test/test_ast.py442
-rw-r--r--Lib/test/test_asyncore.py197
-rw-r--r--Lib/test/test_base64.py165
-rw-r--r--Lib/test/test_bigmem.py223
-rw-r--r--Lib/test/test_binascii.py34
-rw-r--r--Lib/test/test_bool.py10
-rw-r--r--Lib/test/test_buffer.py4291
-rw-r--r--Lib/test/test_builtin.py157
-rw-r--r--Lib/test/test_bytes.py214
-rw-r--r--Lib/test/test_bz2.py604
-rw-r--r--Lib/test/test_calendar.py223
-rw-r--r--Lib/test/test_capi.py116
-rw-r--r--Lib/test/test_cgi.py19
-rw-r--r--Lib/test/test_cgitb.py70
-rw-r--r--Lib/test/test_cmd.py2
-rw-r--r--Lib/test/test_cmd_line.py16
-rw-r--r--Lib/test/test_cmd_line_script.py120
-rw-r--r--Lib/test/test_code.py2
-rw-r--r--Lib/test/test_code_module.py72
-rw-r--r--Lib/test/test_codeccallbacks.py161
-rw-r--r--Lib/test/test_codecencodings_cn.py39
-rw-r--r--Lib/test/test_codecencodings_hk.py10
-rw-r--r--Lib/test/test_codecencodings_iso2022.py14
-rw-r--r--Lib/test/test_codecencodings_jp.py118
-rw-r--r--Lib/test/test_codecencodings_kr.py39
-rw-r--r--Lib/test/test_codecencodings_tw.py10
-rw-r--r--Lib/test/test_codecmaps_cn.py8
-rw-r--r--Lib/test/test_codecmaps_hk.py4
-rw-r--r--Lib/test/test_codecmaps_jp.py12
-rw-r--r--Lib/test/test_codecmaps_kr.py8
-rw-r--r--Lib/test/test_codecmaps_tw.py9
-rw-r--r--Lib/test/test_codecs.py414
-rw-r--r--Lib/test/test_coding.py4
-rw-r--r--Lib/test/test_collections.py96
-rw-r--r--Lib/test/test_compile.py67
-rw-r--r--Lib/test/test_concurrent_futures.py62
-rw-r--r--Lib/test/test_configparser.py (renamed from Lib/test/test_cfgparser.py)37
-rw-r--r--Lib/test/test_contextlib.py225
-rw-r--r--Lib/test/test_copy.py187
-rw-r--r--Lib/test/test_cprofile.py23
-rw-r--r--Lib/test/test_crashers.py38
-rw-r--r--Lib/test/test_crypt.py19
-rw-r--r--Lib/test/test_csv.py11
-rw-r--r--Lib/test/test_curses.py50
-rw-r--r--Lib/test/test_dbm.py4
-rw-r--r--Lib/test/test_decimal.py3478
-rw-r--r--Lib/test/test_deque.py15
-rw-r--r--Lib/test/test_descr.py204
-rw-r--r--Lib/test/test_descrtut.py3
-rw-r--r--Lib/test/test_devpoll.py94
-rw-r--r--Lib/test/test_dict.py120
-rw-r--r--Lib/test/test_dis.py111
-rw-r--r--Lib/test/test_doctest.py446
-rw-r--r--Lib/test/test_dummy_thread.py4
-rw-r--r--Lib/test/test_email.py14
-rw-r--r--Lib/test/test_email/__init__.py150
-rw-r--r--Lib/test/test_email/__main__.py3
-rw-r--r--Lib/test/test_email/data/PyBanner048.gif (renamed from Lib/email/test/data/PyBanner048.gif)bin954 -> 954 bytes-rw-r--r--Lib/test/test_email/data/audiotest.au (renamed from Lib/email/test/data/audiotest.au)bin28144 -> 28144 bytes-rw-r--r--Lib/test/test_email/data/msg_01.txt (renamed from Lib/email/test/data/msg_01.txt)0
-rw-r--r--Lib/test/test_email/data/msg_02.txt (renamed from Lib/email/test/data/msg_02.txt)0
-rw-r--r--Lib/test/test_email/data/msg_03.txt (renamed from Lib/email/test/data/msg_03.txt)0
-rw-r--r--Lib/test/test_email/data/msg_04.txt (renamed from Lib/email/test/data/msg_04.txt)0
-rw-r--r--Lib/test/test_email/data/msg_05.txt (renamed from Lib/email/test/data/msg_05.txt)0
-rw-r--r--Lib/test/test_email/data/msg_06.txt (renamed from Lib/email/test/data/msg_06.txt)0
-rw-r--r--Lib/test/test_email/data/msg_07.txt (renamed from Lib/email/test/data/msg_07.txt)0
-rw-r--r--Lib/test/test_email/data/msg_08.txt (renamed from Lib/email/test/data/msg_08.txt)0
-rw-r--r--Lib/test/test_email/data/msg_09.txt (renamed from Lib/email/test/data/msg_09.txt)0
-rw-r--r--Lib/test/test_email/data/msg_10.txt (renamed from Lib/email/test/data/msg_10.txt)0
-rw-r--r--Lib/test/test_email/data/msg_11.txt (renamed from Lib/email/test/data/msg_11.txt)0
-rw-r--r--Lib/test/test_email/data/msg_12.txt (renamed from Lib/email/test/data/msg_12.txt)0
-rw-r--r--Lib/test/test_email/data/msg_12a.txt (renamed from Lib/email/test/data/msg_12a.txt)0
-rw-r--r--Lib/test/test_email/data/msg_13.txt (renamed from Lib/email/test/data/msg_13.txt)0
-rw-r--r--Lib/test/test_email/data/msg_14.txt (renamed from Lib/email/test/data/msg_14.txt)0
-rw-r--r--Lib/test/test_email/data/msg_15.txt (renamed from Lib/email/test/data/msg_15.txt)0
-rw-r--r--Lib/test/test_email/data/msg_16.txt (renamed from Lib/email/test/data/msg_16.txt)0
-rw-r--r--Lib/test/test_email/data/msg_17.txt (renamed from Lib/email/test/data/msg_17.txt)0
-rw-r--r--Lib/test/test_email/data/msg_18.txt (renamed from Lib/email/test/data/msg_18.txt)0
-rw-r--r--Lib/test/test_email/data/msg_19.txt (renamed from Lib/email/test/data/msg_19.txt)0
-rw-r--r--Lib/test/test_email/data/msg_20.txt (renamed from Lib/email/test/data/msg_20.txt)0
-rw-r--r--Lib/test/test_email/data/msg_21.txt (renamed from Lib/email/test/data/msg_21.txt)0
-rw-r--r--Lib/test/test_email/data/msg_22.txt (renamed from Lib/email/test/data/msg_22.txt)0
-rw-r--r--Lib/test/test_email/data/msg_23.txt (renamed from Lib/email/test/data/msg_23.txt)0
-rw-r--r--Lib/test/test_email/data/msg_24.txt (renamed from Lib/email/test/data/msg_24.txt)0
-rw-r--r--Lib/test/test_email/data/msg_25.txt (renamed from Lib/email/test/data/msg_25.txt)0
-rw-r--r--Lib/test/test_email/data/msg_26.txt (renamed from Lib/email/test/data/msg_26.txt)0
-rw-r--r--Lib/test/test_email/data/msg_27.txt (renamed from Lib/email/test/data/msg_27.txt)0
-rw-r--r--Lib/test/test_email/data/msg_28.txt (renamed from Lib/email/test/data/msg_28.txt)0
-rw-r--r--Lib/test/test_email/data/msg_29.txt (renamed from Lib/email/test/data/msg_29.txt)0
-rw-r--r--Lib/test/test_email/data/msg_30.txt (renamed from Lib/email/test/data/msg_30.txt)0
-rw-r--r--Lib/test/test_email/data/msg_31.txt (renamed from Lib/email/test/data/msg_31.txt)0
-rw-r--r--Lib/test/test_email/data/msg_32.txt (renamed from Lib/email/test/data/msg_32.txt)0
-rw-r--r--Lib/test/test_email/data/msg_33.txt (renamed from Lib/email/test/data/msg_33.txt)0
-rw-r--r--Lib/test/test_email/data/msg_34.txt (renamed from Lib/email/test/data/msg_34.txt)0
-rw-r--r--Lib/test/test_email/data/msg_35.txt (renamed from Lib/email/test/data/msg_35.txt)0
-rw-r--r--Lib/test/test_email/data/msg_36.txt (renamed from Lib/email/test/data/msg_36.txt)0
-rw-r--r--Lib/test/test_email/data/msg_37.txt (renamed from Lib/email/test/data/msg_37.txt)0
-rw-r--r--Lib/test/test_email/data/msg_38.txt (renamed from Lib/email/test/data/msg_38.txt)0
-rw-r--r--Lib/test/test_email/data/msg_39.txt (renamed from Lib/email/test/data/msg_39.txt)0
-rw-r--r--Lib/test/test_email/data/msg_40.txt (renamed from Lib/email/test/data/msg_40.txt)0
-rw-r--r--Lib/test/test_email/data/msg_41.txt (renamed from Lib/email/test/data/msg_41.txt)0
-rw-r--r--Lib/test/test_email/data/msg_42.txt (renamed from Lib/email/test/data/msg_42.txt)0
-rw-r--r--Lib/test/test_email/data/msg_43.txt (renamed from Lib/email/test/data/msg_43.txt)0
-rw-r--r--Lib/test/test_email/data/msg_44.txt (renamed from Lib/email/test/data/msg_44.txt)0
-rw-r--r--Lib/test/test_email/data/msg_45.txt (renamed from Lib/email/test/data/msg_45.txt)0
-rw-r--r--Lib/test/test_email/data/msg_46.txt (renamed from Lib/email/test/data/msg_46.txt)0
-rw-r--r--Lib/test/test_email/test__encoded_words.py187
-rw-r--r--Lib/test/test_email/test__header_value_parser.py2552
-rw-r--r--Lib/test/test_email/test_asian_codecs.py (renamed from Lib/email/test/test_email_codecs.py)17
-rw-r--r--Lib/test/test_email/test_defect_handling.py320
-rw-r--r--Lib/test/test_email/test_email.py (renamed from Lib/email/test/test_email.py)403
-rw-r--r--Lib/test/test_email/test_generator.py199
-rw-r--r--Lib/test/test_email/test_headerregistry.py1515
-rw-r--r--Lib/test/test_email/test_message.py18
-rw-r--r--Lib/test/test_email/test_parser.py36
-rw-r--r--Lib/test/test_email/test_pickleable.py74
-rw-r--r--Lib/test/test_email/test_policy.py322
-rw-r--r--Lib/test/test_email/test_utils.py136
-rw-r--r--Lib/test/test_email/torture_test.py (renamed from Lib/email/test/test_email_torture.py)0
-rw-r--r--Lib/test/test_enumerate.py30
-rw-r--r--Lib/test/test_epoll.py3
-rw-r--r--Lib/test/test_exceptions.py123
-rw-r--r--Lib/test/test_extcall.py87
-rw-r--r--Lib/test/test_faulthandler.py593
-rw-r--r--Lib/test/test_fileinput.py630
-rw-r--r--Lib/test/test_fileio.py5
-rw-r--r--Lib/test/test_float.py21
-rw-r--r--Lib/test/test_format.py46
-rw-r--r--Lib/test/test_fractions.py12
-rw-r--r--Lib/test/test_frozen.py26
-rw-r--r--Lib/test/test_ftplib.py180
-rw-r--r--Lib/test/test_funcattrs.py55
-rw-r--r--Lib/test/test_functools.py93
-rw-r--r--Lib/test/test_future.py12
-rw-r--r--Lib/test/test_gc.py143
-rw-r--r--Lib/test/test_gdb.py143
-rw-r--r--Lib/test/test_generators.py42
-rw-r--r--Lib/test/test_genericpath.py49
-rw-r--r--Lib/test/test_genexps.py8
-rw-r--r--Lib/test/test_getargs2.py114
-rw-r--r--Lib/test/test_glob.py6
-rw-r--r--Lib/test/test_grammar.py123
-rw-r--r--Lib/test/test_gzip.py137
-rw-r--r--Lib/test/test_hash.py14
-rw-r--r--Lib/test/test_hashlib.py4
-rw-r--r--Lib/test/test_hmac.py123
-rw-r--r--Lib/test/test_htmlparser.py13
-rw-r--r--Lib/test/test_http_cookiejar.py11
-rw-r--r--Lib/test/test_http_cookies.py9
-rw-r--r--Lib/test/test_httplib.py140
-rw-r--r--Lib/test/test_httpservers.py73
-rw-r--r--Lib/test/test_imaplib.py89
-rw-r--r--Lib/test/test_imp.py172
-rw-r--r--Lib/test/test_import.py528
-rw-r--r--Lib/test/test_importhooks.py13
-rw-r--r--Lib/test/test_importlib.py5
-rw-r--r--Lib/test/test_importlib/__init__.py33
-rw-r--r--Lib/test/test_importlib/__main__.py20
-rw-r--r--Lib/test/test_importlib/abc.py (renamed from Lib/importlib/test/abc.py)0
-rw-r--r--Lib/test/test_importlib/builtin/__init__.py (renamed from Lib/importlib/test/builtin/__init__.py)4
-rw-r--r--Lib/test/test_importlib/builtin/test_finder.py (renamed from Lib/importlib/test/builtin/test_finder.py)4
-rw-r--r--Lib/test/test_importlib/builtin/test_loader.py (renamed from Lib/importlib/test/builtin/test_loader.py)19
-rw-r--r--Lib/test/test_importlib/builtin/util.py (renamed from Lib/importlib/test/builtin/util.py)0
-rw-r--r--Lib/test/test_importlib/extension/__init__.py (renamed from Lib/importlib/test/frozen/__init__.py)4
-rw-r--r--Lib/test/test_importlib/extension/test_case_sensitivity.py (renamed from Lib/importlib/test/extension/test_case_sensitivity.py)12
-rw-r--r--Lib/test/test_importlib/extension/test_finder.py (renamed from Lib/importlib/test/extension/test_finder.py)15
-rw-r--r--Lib/test/test_importlib/extension/test_loader.py79
-rw-r--r--Lib/test/test_importlib/extension/test_path_hook.py (renamed from Lib/importlib/test/extension/test_path_hook.py)5
-rw-r--r--Lib/test/test_importlib/extension/util.py (renamed from Lib/importlib/test/extension/util.py)5
-rw-r--r--Lib/test/test_importlib/frozen/__init__.py (renamed from Lib/importlib/test/source/__init__.py)4
-rw-r--r--Lib/test/test_importlib/frozen/test_finder.py (renamed from Lib/importlib/test/frozen/test_finder.py)4
-rw-r--r--Lib/test/test_importlib/frozen/test_loader.py (renamed from Lib/importlib/test/frozen/test_loader.py)40
-rw-r--r--Lib/test/test_importlib/import_/__init__.py (renamed from Lib/importlib/test/import_/__init__.py)4
-rw-r--r--Lib/test/test_importlib/import_/test___package__.py (renamed from Lib/importlib/test/import_/test___package__.py)2
-rw-r--r--Lib/test/test_importlib/import_/test_api.py67
-rw-r--r--Lib/test/test_importlib/import_/test_caching.py (renamed from Lib/importlib/test/import_/test_caching.py)6
-rw-r--r--Lib/test/test_importlib/import_/test_fromlist.py (renamed from Lib/importlib/test/import_/test_fromlist.py)28
-rw-r--r--Lib/test/test_importlib/import_/test_meta_path.py (renamed from Lib/importlib/test/import_/test_meta_path.py)22
-rw-r--r--Lib/test/test_importlib/import_/test_packages.py112
-rw-r--r--Lib/test/test_importlib/import_/test_path.py98
-rw-r--r--Lib/test/test_importlib/import_/test_relative_imports.py (renamed from Lib/importlib/test/import_/test_relative_imports.py)14
-rw-r--r--Lib/test/test_importlib/import_/util.py (renamed from Lib/importlib/test/import_/util.py)1
-rw-r--r--Lib/test/test_importlib/regrtest.py17
-rw-r--r--Lib/test/test_importlib/source/__init__.py (renamed from Lib/importlib/test/extension/__init__.py)4
-rw-r--r--Lib/test/test_importlib/source/test_abc_loader.py (renamed from Lib/importlib/test/source/test_abc_loader.py)90
-rw-r--r--Lib/test/test_importlib/source/test_case_sensitivity.py (renamed from Lib/importlib/test/source/test_case_sensitivity.py)16
-rw-r--r--Lib/test/test_importlib/source/test_file_loader.py (renamed from Lib/importlib/test/source/test_file_loader.py)131
-rw-r--r--Lib/test/test_importlib/source/test_finder.py (renamed from Lib/importlib/test/source/test_finder.py)61
-rw-r--r--Lib/test/test_importlib/source/test_path_hook.py (renamed from Lib/importlib/test/source/test_path_hook.py)12
-rw-r--r--Lib/test/test_importlib/source/test_source_encoding.py (renamed from Lib/importlib/test/source/test_source_encoding.py)8
-rw-r--r--Lib/test/test_importlib/source/util.py (renamed from Lib/importlib/test/source/util.py)0
-rw-r--r--Lib/test/test_importlib/test_abc.py (renamed from Lib/importlib/test/test_abc.py)20
-rw-r--r--Lib/test/test_importlib/test_api.py (renamed from Lib/importlib/test/test_api.py)96
-rw-r--r--Lib/test/test_importlib/test_locks.py129
-rw-r--r--Lib/test/test_importlib/test_util.py (renamed from Lib/importlib/test/test_util.py)100
-rw-r--r--Lib/test/test_importlib/util.py (renamed from Lib/importlib/test/util.py)8
-rw-r--r--Lib/test/test_inspect.py1133
-rw-r--r--Lib/test/test_int.py12
-rw-r--r--Lib/test/test_io.py118
-rw-r--r--Lib/test/test_ipaddress.py1649
-rw-r--r--Lib/test/test_iter.py43
-rw-r--r--Lib/test/test_itertools.py415
-rw-r--r--Lib/test/test_keywordonlyarg.py2
-rw-r--r--Lib/test/test_lib2to3.py4
-rw-r--r--Lib/test/test_list.py28
-rw-r--r--Lib/test/test_locale.py4
-rw-r--r--Lib/test/test_logging.py1787
-rw-r--r--Lib/test/test_long.py80
-rw-r--r--Lib/test/test_lzma.py1517
-rw-r--r--Lib/test/test_mailbox.py56
-rw-r--r--Lib/test/test_mailcap.py221
-rw-r--r--Lib/test/test_marshal.py17
-rw-r--r--Lib/test/test_math.py43
-rw-r--r--Lib/test/test_memoryio.py2
-rw-r--r--Lib/test/test_memoryview.py93
-rw-r--r--Lib/test/test_metaclass.py16
-rw-r--r--Lib/test/test_minidom.py77
-rw-r--r--Lib/test/test_mmap.py32
-rw-r--r--Lib/test/test_module.py99
-rw-r--r--Lib/test/test_modulefinder.py48
-rw-r--r--Lib/test/test_multibytecodec.py16
-rw-r--r--Lib/test/test_multiprocessing.py1041
-rw-r--r--Lib/test/test_mutants.py291
-rw-r--r--Lib/test/test_namespace_pkgs.py294
-rw-r--r--Lib/test/test_nntplib.py27
-rw-r--r--Lib/test/test_ntpath.py7
-rw-r--r--Lib/test/test_numeric_tower.py2
-rw-r--r--Lib/test/test_optparse.py20
-rw-r--r--Lib/test/test_os.py840
-rw-r--r--Lib/test/test_ossaudiodev.py16
-rw-r--r--Lib/test/test_osx_env.py3
-rw-r--r--Lib/test/test_parser.py11
-rw-r--r--Lib/test/test_pdb.py3
-rw-r--r--Lib/test/test_peepholer.py63
-rw-r--r--Lib/test/test_pep277.py66
-rw-r--r--Lib/test/test_pep292.py33
-rw-r--r--Lib/test/test_pep3131.py7
-rw-r--r--Lib/test/test_pep3151.py211
-rw-r--r--Lib/test/test_pep380.py965
-rw-r--r--Lib/test/test_pickle.py28
-rw-r--r--Lib/test/test_pipes.py15
-rw-r--r--Lib/test/test_pkg.py33
-rw-r--r--Lib/test/test_pkgimport.py4
-rw-r--r--Lib/test/test_pkgutil.py102
-rw-r--r--Lib/test/test_platform.py51
-rw-r--r--Lib/test/test_plistlib.py6
-rw-r--r--Lib/test/test_poplib.py15
-rw-r--r--Lib/test/test_posix.py615
-rw-r--r--Lib/test/test_posixpath.py12
-rw-r--r--Lib/test/test_pprint.py4
-rw-r--r--Lib/test/test_print.py26
-rw-r--r--Lib/test/test_property.py23
-rw-r--r--Lib/test/test_pty.py19
-rw-r--r--Lib/test/test_pulldom.py347
-rw-r--r--Lib/test/test_pydoc.py21
-rw-r--r--Lib/test/test_raise.py39
-rw-r--r--Lib/test/test_random.py6
-rw-r--r--Lib/test/test_range.py105
-rw-r--r--Lib/test/test_re.py129
-rw-r--r--Lib/test/test_reprlib.py82
-rw-r--r--Lib/test/test_richcmp.py1
-rw-r--r--Lib/test/test_runpy.py58
-rw-r--r--Lib/test/test_sax.py4
-rw-r--r--Lib/test/test_sched.py36
-rw-r--r--Lib/test/test_scope.py19
-rw-r--r--Lib/test/test_select.py22
-rw-r--r--Lib/test/test_set.py21
-rw-r--r--Lib/test/test_shelve.py6
-rw-r--r--Lib/test/test_shlex.py21
-rw-r--r--Lib/test/test_shutil.py942
-rw-r--r--Lib/test/test_signal.py469
-rw-r--r--Lib/test/test_site.py5
-rw-r--r--Lib/test/test_smtpd.py368
-rw-r--r--Lib/test/test_smtplib.py80
-rw-r--r--Lib/test/test_smtpnet.py42
-rw-r--r--Lib/test/test_socket.py2792
-rw-r--r--Lib/test/test_socketserver.py2
-rw-r--r--Lib/test/test_ssl.py393
-rw-r--r--Lib/test/test_stat.py66
-rw-r--r--Lib/test/test_string.py70
-rw-r--r--Lib/test/test_strlit.py32
-rw-r--r--Lib/test/test_struct.py71
-rw-r--r--Lib/test/test_structseq.py5
-rw-r--r--Lib/test/test_subprocess.py274
-rw-r--r--Lib/test/test_sundry.py1
-rw-r--r--Lib/test/test_super.py49
-rw-r--r--Lib/test/test_support.py199
-rw-r--r--Lib/test/test_sys.py179
-rw-r--r--Lib/test/test_sys_settrace.py10
-rw-r--r--Lib/test/test_sysconfig.py136
-rw-r--r--Lib/test/test_tarfile.py160
-rw-r--r--Lib/test/test_telnetlib.py1
-rw-r--r--Lib/test/test_tempfile.py263
-rw-r--r--Lib/test/test_textwrap.py148
-rw-r--r--Lib/test/test_threaded_import.py50
-rw-r--r--Lib/test/test_threading.py19
-rw-r--r--Lib/test/test_threadsignals.py6
-rw-r--r--Lib/test/test_time.py486
-rw-r--r--Lib/test/test_tokenize.py185
-rw-r--r--Lib/test/test_tools.py37
-rw-r--r--Lib/test/test_trace.py17
-rw-r--r--Lib/test/test_traceback.py15
-rw-r--r--Lib/test/test_tuple.py29
-rw-r--r--Lib/test/test_types.py583
-rw-r--r--Lib/test/test_ucn.py88
-rw-r--r--Lib/test/test_unicode.py556
-rw-r--r--Lib/test/test_unicode_file.py17
-rw-r--r--Lib/test/test_unicodedata.py16
-rw-r--r--Lib/test/test_urllib.py78
-rw-r--r--Lib/test/test_urllib2.py129
-rw-r--r--Lib/test/test_urllib2_localnet.py7
-rw-r--r--Lib/test/test_urllib2net.py13
-rw-r--r--Lib/test/test_urllibnet.py34
-rw-r--r--Lib/test/test_userlist.py6
-rwxr-xr-xLib/test/test_userstring.py4
-rw-r--r--Lib/test/test_uuid.py4
-rw-r--r--Lib/test/test_venv.py203
-rw-r--r--Lib/test/test_wait3.py7
-rw-r--r--Lib/test/test_warnings.py14
-rw-r--r--Lib/test/test_webbrowser.py192
-rw-r--r--Lib/test/test_winsound.py8
-rw-r--r--Lib/test/test_wsgiref.py10
-rw-r--r--Lib/test/test_xml_etree.py1014
-rw-r--r--Lib/test/test_xml_etree_c.py104
-rw-r--r--Lib/test/test_xmlrpc.py119
-rw-r--r--Lib/test/test_xmlrpc_net.py4
-rw-r--r--Lib/test/test_zipfile.py342
-rw-r--r--Lib/test/test_zipfile64.py20
-rw-r--r--Lib/test/test_zipimport.py24
-rw-r--r--Lib/test/test_zipimport_support.py5
-rw-r--r--Lib/test/test_zlib.py73
-rw-r--r--Lib/test/testbz2_bigmem.bz2bin3023 -> 0 bytes-rw-r--r--Lib/test/threaded_import_hangers.py13
-rw-r--r--Lib/test/tokenize_tests.txt8
-rw-r--r--Lib/textwrap.py36
-rw-r--r--Lib/threading.py221
-rw-r--r--Lib/timeit.py30
-rw-r--r--Lib/tkinter/__init__.py155
-rw-r--r--Lib/tkinter/_fix.py4
-rw-r--r--Lib/tkinter/filedialog.py2
-rw-r--r--Lib/tkinter/font.py63
-rw-r--r--Lib/tkinter/test/test_tkinter/test_variables.py165
-rwxr-xr-xLib/token.py2
-rw-r--r--Lib/tokenize.py225
-rw-r--r--Lib/trace.py24
-rw-r--r--Lib/traceback.py13
-rw-r--r--Lib/turtle.py1
-rw-r--r--Lib/types.py60
-rw-r--r--Lib/unittest/__main__.py9
-rw-r--r--Lib/unittest/case.py133
-rw-r--r--Lib/unittest/main.py77
-rw-r--r--Lib/unittest/mock.py2211
-rw-r--r--Lib/unittest/result.py1
-rw-r--r--Lib/unittest/test/__init__.py1
-rw-r--r--Lib/unittest/test/_test_warnings.py1
-rw-r--r--Lib/unittest/test/test_assertions.py73
-rw-r--r--Lib/unittest/test/test_case.py63
-rw-r--r--Lib/unittest/test/test_loader.py4
-rw-r--r--Lib/unittest/test/test_program.py17
-rw-r--r--Lib/unittest/test/testmock/__init__.py17
-rw-r--r--Lib/unittest/test/testmock/support.py23
-rw-r--r--Lib/unittest/test/testmock/testcallable.py147
-rw-r--r--Lib/unittest/test/testmock/testhelpers.py889
-rw-r--r--Lib/unittest/test/testmock/testmagicmethods.py403
-rw-r--r--Lib/unittest/test/testmock/testmock.py1275
-rw-r--r--Lib/unittest/test/testmock/testpatch.py1785
-rw-r--r--Lib/unittest/test/testmock/testsentinel.py28
-rw-r--r--Lib/unittest/test/testmock/testwith.py176
-rw-r--r--Lib/urllib/error.py3
-rw-r--r--Lib/urllib/request.py210
-rw-r--r--Lib/urllib/response.py7
-rw-r--r--Lib/uuid.py2
-rw-r--r--Lib/venv/__init__.py404
-rw-r--r--Lib/venv/__main__.py10
-rw-r--r--Lib/venv/scripts/nt/Activate.ps134
-rw-r--r--Lib/venv/scripts/nt/Deactivate.ps119
-rw-r--r--Lib/venv/scripts/nt/activate.bat31
-rw-r--r--Lib/venv/scripts/nt/deactivate.bat17
-rw-r--r--Lib/venv/scripts/nt/pydoc.py4
-rw-r--r--Lib/venv/scripts/posix/activate76
-rwxr-xr-xLib/venv/scripts/posix/pydoc5
-rw-r--r--Lib/webbrowser.py46
-rw-r--r--Lib/wsgiref.egg-info8
-rw-r--r--Lib/wsgiref/simple_server.py3
-rw-r--r--Lib/xdrlib.py6
-rw-r--r--Lib/xml/dom/__init__.py1
-rw-r--r--Lib/xml/dom/domreg.py2
-rw-r--r--Lib/xml/dom/expatbuilder.py42
-rw-r--r--Lib/xml/dom/minidom.py293
-rw-r--r--Lib/xml/dom/pulldom.py6
-rw-r--r--Lib/xml/etree/ElementTree.py380
-rw-r--r--Lib/xml/etree/cElementTree.py4
-rw-r--r--Lib/xml/parsers/expat.py2
-rw-r--r--Lib/xmlrpc/client.py132
-rw-r--r--Lib/xmlrpc/server.py34
-rw-r--r--Lib/zipfile.py386
-rw-r--r--Mac/BuildScript/README.txt151
-rwxr-xr-xMac/BuildScript/build-installer.py500
-rw-r--r--Mac/BuildScript/ncurses-5.5.patch36
-rw-r--r--Mac/BuildScript/resources/ReadMe.txt28
-rw-r--r--Mac/BuildScript/resources/Welcome.rtf8
-rwxr-xr-xMac/BuildScript/scripts/postflight.documentation9
-rwxr-xr-xMac/BuildScript/scripts/postflight.framework14
-rw-r--r--Mac/Makefile.in19
-rw-r--r--Mac/README206
-rw-r--r--Mac/Tools/fixapplepython23.py131
-rw-r--r--Mac/Tools/pythonw.c48
-rw-r--r--Makefile.pre.in441
-rw-r--r--Misc/ACKS182
-rw-r--r--Misc/HISTORY5397
-rw-r--r--Misc/NEWS8849
-rw-r--r--Misc/README4
-rw-r--r--Misc/RPM/python-3.3.spec (renamed from Misc/RPM/python-3.2.spec)4
-rw-r--r--Misc/python-config.in5
-rw-r--r--Misc/python.man52
-rw-r--r--Misc/svnmap.txt72546
-rw-r--r--Misc/valgrind-python.supp80
-rw-r--r--Modules/Setup.dist12
-rw-r--r--Modules/_bisectmodule.c7
-rw-r--r--Modules/_bz2module.c605
-rw-r--r--Modules/_codecsmodule.c259
-rw-r--r--Modules/_collectionsmodule.c119
-rw-r--r--Modules/_cryptmodule.c (renamed from Modules/cryptmodule.c)4
-rw-r--r--Modules/_csv.c272
-rw-r--r--Modules/_ctypes/_ctypes.c46
-rw-r--r--Modules/_ctypes/callproc.c18
-rw-r--r--Modules/_ctypes/cfield.c84
-rw-r--r--Modules/_ctypes/libffi.diff149
-rw-r--r--Modules/_ctypes/libffi/ChangeLog915
-rw-r--r--Modules/_ctypes/libffi/ChangeLog.libffi33
-rw-r--r--Modules/_ctypes/libffi/LICENSE6
-rw-r--r--Modules/_ctypes/libffi/Makefile.am71
-rw-r--r--Modules/_ctypes/libffi/Makefile.in380
-rw-r--r--Modules/_ctypes/libffi/README59
-rw-r--r--Modules/_ctypes/libffi/aclocal.m4906
-rwxr-xr-xModules/_ctypes/libffi/compile21
-rwxr-xr-xModules/_ctypes/libffi/config.guess225
-rwxr-xr-xModules/_ctypes/libffi/config.sub181
-rwxr-xr-xModules/_ctypes/libffi/configure4955
-rw-r--r--Modules/_ctypes/libffi/configure.ac244
-rwxr-xr-xModules/_ctypes/libffi/depcomp116
-rw-r--r--Modules/_ctypes/libffi/doc/libffi.info76
-rw-r--r--Modules/_ctypes/libffi/doc/libffi.texi40
-rw-r--r--Modules/_ctypes/libffi/doc/stamp-vti8
-rw-r--r--Modules/_ctypes/libffi/doc/version.texi8
-rw-r--r--Modules/_ctypes/libffi/fficonfig.h.in18
-rw-r--r--Modules/_ctypes/libffi/generate-ios-source-and-headers.py160
-rw-r--r--Modules/_ctypes/libffi/generate-osx-source-and-headers.py153
-rw-r--r--Modules/_ctypes/libffi/include/Makefile.in40
-rw-r--r--Modules/_ctypes/libffi/include/ffi.h.in125
-rw-r--r--Modules/_ctypes/libffi/include/ffi_common.h16
-rwxr-xr-xModules/_ctypes/libffi/install-sh531
-rw-r--r--Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj595
-rw-r--r--Modules/_ctypes/libffi/libtool-version2
-rw-r--r--[-rwxr-xr-x]Modules/_ctypes/libffi/ltmain.sh4039
-rw-r--r--Modules/_ctypes/libffi/m4/asmcfi.m413
-rw-r--r--Modules/_ctypes/libffi/m4/ax_append_flag.m469
-rw-r--r--Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4180
-rw-r--r--Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4121
-rw-r--r--Modules/_ctypes/libffi/m4/ax_check_compile_flag.m472
-rw-r--r--Modules/_ctypes/libffi/m4/ax_compiler_vendor.m484
-rw-r--r--Modules/_ctypes/libffi/m4/ax_configure_args.m470
-rw-r--r--Modules/_ctypes/libffi/m4/ax_enable_builddir.m4300
-rw-r--r--Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4215
-rw-r--r--Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m479
-rw-r--r--Modules/_ctypes/libffi/m4/libtool.m42273
-rw-r--r--Modules/_ctypes/libffi/m4/ltoptions.m432
-rw-r--r--Modules/_ctypes/libffi/m4/ltversion.m412
-rw-r--r--Modules/_ctypes/libffi/m4/lt~obsolete.m412
-rw-r--r--Modules/_ctypes/libffi/man/Makefile.am4
-rw-r--r--Modules/_ctypes/libffi/man/Makefile.in40
-rw-r--r--Modules/_ctypes/libffi/man/ffi.310
-rw-r--r--Modules/_ctypes/libffi/man/ffi_prep_cif.38
-rw-r--r--Modules/_ctypes/libffi/man/ffi_prep_cif_var.373
-rwxr-xr-xModules/_ctypes/libffi/missing104
-rwxr-xr-x[-rw-r--r--]Modules/_ctypes/libffi/msvcc.sh30
-rw-r--r--Modules/_ctypes/libffi/src/alpha/ffi.c6
-rw-r--r--Modules/_ctypes/libffi/src/alpha/ffitarget.h7
-rw-r--r--Modules/_ctypes/libffi/src/alpha/osf.S57
-rw-r--r--Modules/_ctypes/libffi/src/arm/ffi.c507
-rw-r--r--Modules/_ctypes/libffi/src/arm/ffitarget.h28
-rw-r--r--Modules/_ctypes/libffi/src/arm/gentramp.sh118
-rw-r--r--Modules/_ctypes/libffi/src/arm/sysv.S226
-rw-r--r--Modules/_ctypes/libffi/src/arm/trampoline.S4450
-rw-r--r--Modules/_ctypes/libffi/src/avr32/ffi.c6
-rw-r--r--Modules/_ctypes/libffi/src/avr32/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/closures.c29
-rw-r--r--Modules/_ctypes/libffi/src/cris/ffi.c15
-rw-r--r--Modules/_ctypes/libffi/src/cris/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/dlmalloc.c70
-rw-r--r--Modules/_ctypes/libffi/src/frv/ffitarget.h15
-rw-r--r--Modules/_ctypes/libffi/src/ia64/ffi.c16
-rw-r--r--Modules/_ctypes/libffi/src/ia64/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/java_raw_api.c2
-rw-r--r--Modules/_ctypes/libffi/src/m32r/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/m68k/ffi.c96
-rw-r--r--Modules/_ctypes/libffi/src/m68k/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/m68k/sysv.S89
-rw-r--r--Modules/_ctypes/libffi/src/mips/ffi.c17
-rw-r--r--Modules/_ctypes/libffi/src/mips/ffitarget.h36
-rw-r--r--Modules/_ctypes/libffi/src/mips/n32.S1
-rw-r--r--Modules/_ctypes/libffi/src/moxie/ffitarget.h56
-rw-r--r--Modules/_ctypes/libffi/src/pa/ffi.c11
-rw-r--r--Modules/_ctypes/libffi/src/pa/ffitarget.h18
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/aix.S6
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/aix_closure.S6
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/asm.h2
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/darwin.S292
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/darwin_closure.S459
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/ffi.c639
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c779
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/ffitarget.h43
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/ppc_closure.S19
-rw-r--r--Modules/_ctypes/libffi/src/powerpc/sysv.S27
-rw-r--r--Modules/_ctypes/libffi/src/prep_cif.c69
-rw-r--r--Modules/_ctypes/libffi/src/s390/ffitarget.h13
-rw-r--r--Modules/_ctypes/libffi/src/sh/ffi.c5
-rw-r--r--Modules/_ctypes/libffi/src/sh/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/sh64/ffi.c5
-rw-r--r--Modules/_ctypes/libffi/src/sh64/ffitarget.h11
-rw-r--r--Modules/_ctypes/libffi/src/sparc/ffi.c66
-rw-r--r--Modules/_ctypes/libffi/src/sparc/ffitarget.h15
-rw-r--r--Modules/_ctypes/libffi/src/sparc/v9.S2
-rw-r--r--Modules/_ctypes/libffi/src/x86/ffi.c258
-rw-r--r--Modules/_ctypes/libffi/src/x86/ffi64.c36
-rw-r--r--Modules/_ctypes/libffi/src/x86/ffitarget.h49
-rw-r--r--Modules/_ctypes/libffi/src/x86/sysv.S66
-rw-r--r--Modules/_ctypes/libffi/src/x86/unix64.S4
-rw-r--r--Modules/_ctypes/libffi/src/x86/win32.S268
-rw-r--r--Modules/_ctypes/libffi/src/x86/win64.S22
-rw-r--r--Modules/_ctypes/libffi/testsuite/Makefile.am129
-rw-r--r--Modules/_ctypes/libffi/testsuite/Makefile.in174
-rw-r--r--Modules/_ctypes/libffi/testsuite/lib/libffi.exp (renamed from Modules/_ctypes/libffi/testsuite/lib/libffi-dg.exp)58
-rw-r--r--Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp22
-rwxr-xr-xModules/_ctypes/libffi/testsuite/libffi.call/a.outbin0 -> 33895 bytes-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/call.exp6
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/closure_stdcall.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/closure_thiscall.c72
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c4
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c2
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c9
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c2
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c8
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c5
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c7
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/fastthis1_win32.c50
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/fastthis2_win32.c50
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/fastthis3_win32.c56
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h41
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c107
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c60
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/many2.c54
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/many2_win32.c63
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c14
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c2
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/strlen2_win32.c44
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c12
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct1_win32.c67
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c10
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct2_win32.c67
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c9
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c13
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c13
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c14
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c14
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c13
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c13
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c4
-rw-r--r--Modules/_ctypes/libffi/testsuite/libffi.special/special.exp4
-rw-r--r--Modules/_ctypes/stgdict.c12
-rw-r--r--Modules/_curses_panel.c122
-rw-r--r--Modules/_cursesmodule.c683
-rw-r--r--Modules/_datetimemodule.c503
-rw-r--r--Modules/_dbmmodule.c12
-rw-r--r--Modules/_decimal/README.txt46
-rw-r--r--Modules/_decimal/_decimal.c5690
-rw-r--r--Modules/_decimal/docstrings.h753
-rw-r--r--Modules/_decimal/libmpdec/README.txt90
-rw-r--r--Modules/_decimal/libmpdec/basearith.c658
-rw-r--r--Modules/_decimal/libmpdec/basearith.h215
-rw-r--r--Modules/_decimal/libmpdec/bits.h192
-rw-r--r--Modules/_decimal/libmpdec/constants.c132
-rw-r--r--Modules/_decimal/libmpdec/constants.h83
-rw-r--r--Modules/_decimal/libmpdec/context.c286
-rw-r--r--Modules/_decimal/libmpdec/convolute.c174
-rw-r--r--Modules/_decimal/libmpdec/convolute.h43
-rw-r--r--Modules/_decimal/libmpdec/crt.c179
-rw-r--r--Modules/_decimal/libmpdec/crt.h40
-rw-r--r--Modules/_decimal/libmpdec/difradix2.c173
-rw-r--r--Modules/_decimal/libmpdec/difradix2.h41
-rw-r--r--Modules/_decimal/libmpdec/fnt.c81
-rw-r--r--Modules/_decimal/libmpdec/fnt.h42
-rw-r--r--Modules/_decimal/libmpdec/fourstep.c257
-rw-r--r--Modules/_decimal/libmpdec/fourstep.h41
-rw-r--r--Modules/_decimal/libmpdec/io.c1575
-rw-r--r--Modules/_decimal/libmpdec/io.h59
-rw-r--r--Modules/_decimal/libmpdec/literature/REFERENCES.txt51
-rw-r--r--Modules/_decimal/libmpdec/literature/bignum.txt83
-rw-r--r--Modules/_decimal/libmpdec/literature/fnt.py208
-rw-r--r--Modules/_decimal/libmpdec/literature/matrix-transform.txt256
-rw-r--r--Modules/_decimal/libmpdec/literature/mulmod-64.txt127
-rw-r--r--Modules/_decimal/libmpdec/literature/mulmod-ppro.txt269
-rw-r--r--Modules/_decimal/libmpdec/literature/six-step.txt63
-rw-r--r--Modules/_decimal/libmpdec/literature/umodarith.lisp692
-rw-r--r--Modules/_decimal/libmpdec/memory.c292
-rw-r--r--Modules/_decimal/libmpdec/memory.h44
-rw-r--r--Modules/_decimal/libmpdec/mpdecimal.c8149
-rw-r--r--Modules/_decimal/libmpdec/mpdecimal.h800
-rw-r--r--Modules/_decimal/libmpdec/numbertheory.c132
-rw-r--r--Modules/_decimal/libmpdec/numbertheory.h71
-rw-r--r--Modules/_decimal/libmpdec/sixstep.c214
-rw-r--r--Modules/_decimal/libmpdec/sixstep.h41
-rw-r--r--Modules/_decimal/libmpdec/transpose.c276
-rw-r--r--Modules/_decimal/libmpdec/transpose.h55
-rw-r--r--Modules/_decimal/libmpdec/typearith.h669
-rw-r--r--Modules/_decimal/libmpdec/umodarith.h650
-rw-r--r--Modules/_decimal/libmpdec/vccompat.h62
-rw-r--r--Modules/_decimal/libmpdec/vcdiv64.asm48
-rw-r--r--Modules/_decimal/libmpdec/vcstdint.h232
-rw-r--r--Modules/_decimal/tests/README.txt15
-rw-r--r--Modules/_decimal/tests/bench.py135
-rw-r--r--Modules/_decimal/tests/bignum.py42
-rw-r--r--Modules/_decimal/tests/deccheck.py1075
-rw-r--r--Modules/_decimal/tests/formathelper.py344
-rw-r--r--Modules/_decimal/tests/randdec.py559
-rw-r--r--Modules/_decimal/tests/randfloat.py250
-rwxr-xr-xModules/_decimal/tests/runall-memorydebugger.sh175
-rwxr-xr-xModules/_decimal/tests/runall.bat111
-rw-r--r--Modules/_elementtree.c2101
-rw-r--r--Modules/_freeze_importlib.c142
-rw-r--r--Modules/_functoolsmodule.c210
-rw-r--r--Modules/_gestalt.c2
-rw-r--r--Modules/_hashopenssl.c8
-rw-r--r--Modules/_io/_iomodule.c166
-rw-r--r--Modules/_io/_iomodule.h17
-rw-r--r--Modules/_io/bufferedio.c318
-rw-r--r--Modules/_io/bytesio.c2
-rw-r--r--Modules/_io/fileio.c153
-rw-r--r--Modules/_io/iobase.c49
-rw-r--r--Modules/_io/stringio.c185
-rw-r--r--Modules/_io/textio.c683
-rw-r--r--Modules/_json.c439
-rw-r--r--Modules/_localemodule.c103
-rw-r--r--Modules/_lsprof.c45
-rw-r--r--Modules/_lzmamodule.c1286
-rw-r--r--Modules/_multiprocessing/connection.h527
-rw-r--r--Modules/_multiprocessing/multiprocessing.c241
-rw-r--r--Modules/_multiprocessing/multiprocessing.h80
-rw-r--r--Modules/_multiprocessing/pipe_connection.c149
-rw-r--r--Modules/_multiprocessing/semaphore.c59
-rw-r--r--Modules/_multiprocessing/socket_connection.c205
-rw-r--r--Modules/_multiprocessing/win32_functions.c267
-rw-r--r--Modules/_pickle.c306
-rw-r--r--Modules/_posixsubprocess.c22
-rw-r--r--Modules/_randommodule.c19
-rw-r--r--Modules/_sqlite/cache.c21
-rw-r--r--Modules/_sqlite/connection.c99
-rw-r--r--Modules/_sqlite/connection.h3
-rw-r--r--Modules/_sqlite/cursor.c31
-rw-r--r--Modules/_sqlite/microprotocols.c8
-rw-r--r--Modules/_sqlite/module.c19
-rw-r--r--Modules/_sqlite/module.h2
-rw-r--r--Modules/_sqlite/row.c10
-rw-r--r--Modules/_sqlite/statement.c12
-rw-r--r--Modules/_sqlite/statement.h4
-rw-r--r--Modules/_sre.c621
-rw-r--r--Modules/_ssl.c829
-rw-r--r--Modules/_ssl_data.h1653
-rw-r--r--Modules/_struct.c90
-rw-r--r--Modules/_testbuffer.c2875
-rw-r--r--Modules/_testcapimodule.c432
-rw-r--r--Modules/_threadmodule.c60
-rw-r--r--Modules/_time.c28
-rw-r--r--Modules/_time.h3
-rw-r--r--Modules/_tkinter.c102
-rw-r--r--Modules/_winapi.c1328
-rw-r--r--Modules/arraymodule.c200
-rw-r--r--Modules/atexitmodule.c10
-rw-r--r--Modules/audioop.c8
-rw-r--r--Modules/binascii.c58
-rw-r--r--Modules/bz2module.c2193
-rw-r--r--Modules/cjkcodecs/_codecs_cn.c14
-rw-r--r--Modules/cjkcodecs/_codecs_hk.c2
-rw-r--r--Modules/cjkcodecs/_codecs_iso2022.c2
-rw-r--r--Modules/cjkcodecs/_codecs_jp.c34
-rw-r--r--Modules/cjkcodecs/_codecs_kr.c18
-rw-r--r--Modules/cjkcodecs/_codecs_tw.c4
-rw-r--r--Modules/cjkcodecs/multibytecodec.c48
-rw-r--r--Modules/config.c.in3
-rw-r--r--Modules/errnomodule.c82
-rw-r--r--Modules/expat/COPYING1
-rw-r--r--Modules/expat/amigaconfig.h64
-rw-r--r--Modules/expat/ascii.h7
-rw-r--r--Modules/expat/expat.h29
-rw-r--r--Modules/expat/expat_external.h10
-rw-r--r--Modules/expat/internal.h2
-rw-r--r--Modules/expat/watcomconfig.h47
-rw-r--r--Modules/expat/xmlparse.c423
-rw-r--r--Modules/expat/xmlrole.c12
-rw-r--r--Modules/expat/xmltok.c22
-rw-r--r--Modules/expat/xmltok_impl.c6
-rw-r--r--Modules/expat/xmltok_ns.c9
-rw-r--r--Modules/faulthandler.c1152
-rw-r--r--Modules/fcntlmodule.c5
-rw-r--r--Modules/fpectlmodule.c11
-rw-r--r--Modules/gc_weakref.txt6
-rw-r--r--Modules/gcmodule.c98
-rw-r--r--Modules/getbuildinfo.c18
-rw-r--r--Modules/getpath.c118
-rw-r--r--Modules/itertoolsmodule.c919
-rw-r--r--Modules/main.c69
-rw-r--r--Modules/mathmodule.c87
-rw-r--r--Modules/md5module.c31
-rw-r--r--Modules/mmapmodule.c90
-rw-r--r--Modules/nismodule.c2
-rw-r--r--Modules/operator.c166
-rw-r--r--Modules/ossaudiodev.c101
-rw-r--r--Modules/parsermodule.c151
-rw-r--r--Modules/posixmodule.c6136
-rw-r--r--Modules/pyexpat.c52
-rw-r--r--Modules/python.c1
-rw-r--r--Modules/readline.c13
-rw-r--r--Modules/resource.c16
-rw-r--r--Modules/selectmodule.c493
-rw-r--r--Modules/sha1module.c30
-rw-r--r--Modules/sha256module.c19
-rw-r--r--Modules/sha512module.c19
-rw-r--r--Modules/signalmodule.c439
-rw-r--r--Modules/socketmodule.c1547
-rw-r--r--Modules/socketmodule.h27
-rw-r--r--Modules/sre.h10
-rw-r--r--Modules/syslogmodule.c22
-rw-r--r--Modules/termios.c5
-rw-r--r--Modules/testcapi_long.h29
-rw-r--r--Modules/timemodule.c950
-rw-r--r--Modules/tkappinit.c6
-rw-r--r--Modules/unicodedata.c306
-rw-r--r--Modules/unicodedata_db.h7148
-rw-r--r--Modules/unicodename_db.h38401
-rw-r--r--Modules/xxlimited.c3
-rw-r--r--Modules/zipimport.c667
-rw-r--r--Modules/zlibmodule.c158
-rw-r--r--Objects/abstract.c335
-rw-r--r--Objects/bytearrayobject.c375
-rw-r--r--Objects/bytes_methods.c12
-rw-r--r--Objects/bytesobject.c447
-rw-r--r--Objects/classobject.c23
-rw-r--r--Objects/codeobject.c134
-rw-r--r--Objects/complexobject.c53
-rw-r--r--Objects/descrobject.c272
-rw-r--r--Objects/dictnotes.txt237
-rw-r--r--Objects/dictobject.c1955
-rw-r--r--Objects/enumobject.c54
-rw-r--r--Objects/exceptions.c946
-rw-r--r--Objects/fileobject.c34
-rw-r--r--Objects/floatobject.c221
-rw-r--r--Objects/frameobject.c32
-rw-r--r--Objects/funcobject.c150
-rw-r--r--Objects/genobject.c204
-rw-r--r--Objects/iterobject.c47
-rw-r--r--Objects/listobject.c161
-rw-r--r--Objects/longobject.c441
-rw-r--r--Objects/memoryobject.c3225
-rw-r--r--Objects/methodobject.c56
-rw-r--r--Objects/moduleobject.c135
-rw-r--r--Objects/namespaceobject.c225
-rw-r--r--Objects/object.c550
-rw-r--r--Objects/obmalloc.c151
-rw-r--r--Objects/rangeobject.c237
-rw-r--r--Objects/setobject.c191
-rw-r--r--Objects/sliceobject.c71
-rw-r--r--Objects/stringlib/asciilib.h30
-rw-r--r--Objects/stringlib/codecs.h661
-rw-r--r--Objects/stringlib/count.h9
-rw-r--r--Objects/stringlib/eq.h23
-rw-r--r--Objects/stringlib/fastsearch.h75
-rw-r--r--Objects/stringlib/find.h89
-rw-r--r--Objects/stringlib/find_max_char.h133
-rw-r--r--Objects/stringlib/formatter.h1516
-rw-r--r--Objects/stringlib/localeutil.h100
-rw-r--r--Objects/stringlib/partition.h12
-rw-r--r--Objects/stringlib/split.h26
-rw-r--r--Objects/stringlib/stringdefs.h8
-rw-r--r--Objects/stringlib/ucs1lib.h31
-rw-r--r--Objects/stringlib/ucs2lib.h30
-rw-r--r--Objects/stringlib/ucs4lib.h30
-rw-r--r--Objects/stringlib/undef.h12
-rw-r--r--Objects/stringlib/unicode_format.h (renamed from Objects/stringlib/string_format.h)429
-rw-r--r--Objects/stringlib/unicodedefs.h8
-rw-r--r--Objects/tupleobject.c74
-rw-r--r--Objects/typeobject.c1130
-rw-r--r--Objects/typeslots.inc2
-rw-r--r--Objects/typeslots.py2
-rw-r--r--Objects/unicodectype.c125
-rw-r--r--Objects/unicodeobject.c12110
-rw-r--r--Objects/unicodetype_db.h4718
-rw-r--r--Objects/weakrefobject.c61
-rw-r--r--PC/VC6/_multiprocessing.dsp8
-rw-r--r--PC/VC6/pythoncore.dsp9
-rw-r--r--PC/VC6/readme.txt8
-rw-r--r--PC/VS7.1/pythoncore.vcproj51
-rw-r--r--PC/VS7.1/readme.txt4
-rw-r--r--PC/VS8.0/_multiprocessing.vcproj12
-rw-r--r--PC/VS8.0/build_ssl.bat4
-rw-r--r--PC/VS8.0/kill_python.c2
-rw-r--r--PC/VS8.0/pyproject.vsprops4
-rw-r--r--PC/VS8.0/pythoncore.vcproj4
-rw-r--r--PC/VS9.0/_bz2.vcproj (renamed from PCbuild/bz2.vcproj)6
-rw-r--r--PC/VS9.0/_ctypes.vcproj (renamed from PCbuild/_ctypes.vcproj)48
-rw-r--r--PC/VS9.0/_ctypes_test.vcproj (renamed from PCbuild/_ctypes_test.vcproj)6
-rw-r--r--PC/VS9.0/_decimal.vcproj743
-rw-r--r--PC/VS9.0/_elementtree.vcproj (renamed from PCbuild/_elementtree.vcproj)56
-rw-r--r--PC/VS9.0/_hashlib.vcproj (renamed from PCbuild/_hashlib.vcproj)4
-rw-r--r--PC/VS9.0/_lzma.vcproj537
-rw-r--r--PC/VS9.0/_msi.vcproj (renamed from PCbuild/_msi.vcproj)4
-rw-r--r--PC/VS9.0/_multiprocessing.vcproj (renamed from PCbuild/_multiprocessing.vcproj)24
-rw-r--r--PC/VS9.0/_socket.vcproj (renamed from PCbuild/_socket.vcproj)6
-rw-r--r--PC/VS9.0/_sqlite3.vcproj (renamed from PCbuild/_sqlite3.vcproj)38
-rw-r--r--PC/VS9.0/_ssl.vcproj (renamed from PCbuild/_ssl.vcproj)4
-rw-r--r--PC/VS9.0/_testbuffer.vcproj521
-rw-r--r--PC/VS9.0/_testcapi.vcproj (renamed from PCbuild/_testcapi.vcproj)4
-rw-r--r--PC/VS9.0/_tkinter.vcproj (renamed from PCbuild/_tkinter.vcproj)6
-rw-r--r--PC/VS9.0/bdist_wininst.vcproj (renamed from PCbuild/bdist_wininst.vcproj)44
-rw-r--r--PC/VS9.0/debug.vsprops (renamed from PCbuild/debug.vsprops)0
-rw-r--r--PC/VS9.0/kill_python.c178
-rw-r--r--PC/VS9.0/kill_python.vcproj (renamed from PCbuild/kill_python.vcproj)0
-rw-r--r--PC/VS9.0/make_buildinfo.c195
-rw-r--r--PC/VS9.0/make_buildinfo.vcproj (renamed from PCbuild/make_buildinfo.vcproj)2
-rw-r--r--PC/VS9.0/make_versioninfo.vcproj (renamed from PCbuild/make_versioninfo.vcproj)28
-rw-r--r--PC/VS9.0/pcbuild.sln658
-rw-r--r--PC/VS9.0/pginstrument.vsprops (renamed from PCbuild/pginstrument.vsprops)0
-rw-r--r--PC/VS9.0/pgupdate.vsprops (renamed from PCbuild/pgupdate.vsprops)0
-rw-r--r--PC/VS9.0/pyd.vsprops (renamed from PCbuild/pyd.vsprops)0
-rw-r--r--PC/VS9.0/pyd_d.vsprops (renamed from PCbuild/pyd_d.vsprops)0
-rw-r--r--PC/VS9.0/pyexpat.vcproj (renamed from PCbuild/pyexpat.vcproj)30
-rw-r--r--PC/VS9.0/pyproject.vsprops (renamed from PCbuild/pyproject.vsprops)16
-rw-r--r--PC/VS9.0/python.vcproj (renamed from PCbuild/python.vcproj)12
-rw-r--r--PC/VS9.0/python3dll.vcproj (renamed from PCbuild/python3dll.vcproj)44
-rw-r--r--PC/VS9.0/pythoncore.vcproj (renamed from PCbuild/pythoncore.vcproj)640
-rw-r--r--PC/VS9.0/pythonw.vcproj (renamed from PCbuild/pythonw.vcproj)6
-rw-r--r--PC/VS9.0/release.vsprops (renamed from PCbuild/release.vsprops)0
-rw-r--r--PC/VS9.0/select.vcproj (renamed from PCbuild/select.vcproj)4
-rw-r--r--PC/VS9.0/sqlite3.vcproj (renamed from PCbuild/sqlite3.vcproj)2
-rw-r--r--PC/VS9.0/sqlite3.vsprops (renamed from PCbuild/sqlite3.vsprops)0
-rw-r--r--PC/VS9.0/ssl.vcproj (renamed from PCbuild/ssl.vcproj)2
-rw-r--r--PC/VS9.0/unicodedata.vcproj (renamed from PCbuild/unicodedata.vcproj)8
-rw-r--r--PC/VS9.0/w9xpopen.vcproj (renamed from PCbuild/w9xpopen.vcproj)4
-rw-r--r--PC/VS9.0/winsound.vcproj (renamed from PCbuild/winsound.vcproj)4
-rw-r--r--PC/VS9.0/x64.vsprops (renamed from PCbuild/x64.vsprops)0
-rw-r--r--PC/VS9.0/xxlimited.vcproj (renamed from PCbuild/xxlimited.vcproj)4
-rw-r--r--PC/_msi.c18
-rw-r--r--PC/_subprocess.c690
-rw-r--r--PC/config.c11
-rw-r--r--PC/dl_nt.c10
-rw-r--r--PC/example_nt/example.vcproj4
-rw-r--r--PC/frozen_dllmain.c6
-rw-r--r--PC/getpathp.c87
-rw-r--r--PC/import_nt.c86
-rw-r--r--PC/launcher.c1365
-rw-r--r--PC/launcher.icobin0 -> 19790 bytes-rwxr-xr-xPC/msvcrtmodule.c27
-rw-r--r--PC/os2emx/Makefile2
-rw-r--r--PC/os2emx/README.os2emx2
-rw-r--r--PC/os2emx/config.c3
-rw-r--r--PC/os2emx/pyconfig.h2
-rw-r--r--PC/os2emx/python33.def (renamed from PC/os2emx/python27.def)250
-rw-r--r--PC/os2vacpp/config.c3
-rw-r--r--PC/pyconfig.h20
-rw-r--r--PC/pylauncher.rc51
-rw-r--r--PC/python3.def1384
-rw-r--r--PC/python3.mak10
-rw-r--r--PC/python33gen.py (renamed from PC/python32gen.py)13
-rw-r--r--PC/python33stub.def (renamed from PC/python32stub.def)11
-rw-r--r--PC/python_nt.rc2
-rw-r--r--PC/readme.txt2
-rw-r--r--PC/winreg.c102
-rw-r--r--PC/winsound.c2
-rw-r--r--PCbuild/_bz2.vcxproj261
-rw-r--r--PCbuild/_bz2.vcxproj.filters48
-rw-r--r--PCbuild/_ctypes.vcxproj294
-rw-r--r--PCbuild/_ctypes.vcxproj.filters65
-rw-r--r--PCbuild/_ctypes_test.vcxproj192
-rw-r--r--PCbuild/_ctypes_test.vcxproj.filters21
-rw-r--r--PCbuild/_decimal.vcxproj308
-rw-r--r--PCbuild/_decimal.vcxproj.filters116
-rw-r--r--PCbuild/_elementtree.vcxproj270
-rw-r--r--PCbuild/_elementtree.vcxproj.filters72
-rw-r--r--PCbuild/_freeze_importlib.vcxproj188
-rw-r--r--PCbuild/_freeze_importlib.vcxproj.filters27
-rw-r--r--PCbuild/_hashlib.vcxproj282
-rw-r--r--PCbuild/_hashlib.vcxproj.filters13
-rw-r--r--PCbuild/_lzma.vcxproj250
-rw-r--r--PCbuild/_lzma.vcxproj.filters13
-rw-r--r--PCbuild/_msi.vcxproj226
-rw-r--r--PCbuild/_msi.vcxproj.filters13
-rw-r--r--PCbuild/_multiprocessing.vcxproj230
-rw-r--r--PCbuild/_multiprocessing.vcxproj.filters24
-rw-r--r--PCbuild/_socket.vcxproj229
-rw-r--r--PCbuild/_socket.vcxproj.filters21
-rw-r--r--PCbuild/_sqlite3.vcxproj274
-rw-r--r--PCbuild/_sqlite3.vcxproj.filters72
-rw-r--r--PCbuild/_ssl.vcxproj286
-rw-r--r--PCbuild/_ssl.vcxproj.filters13
-rw-r--r--PCbuild/_testbuffer.vcxproj217
-rw-r--r--PCbuild/_testbuffer.vcxproj.filters13
-rw-r--r--PCbuild/_testcapi.vcxproj218
-rw-r--r--PCbuild/_testcapi.vcxproj.filters13
-rw-r--r--PCbuild/_tkinter.vcxproj251
-rw-r--r--PCbuild/_tkinter.vcxproj.filters16
-rw-r--r--PCbuild/bdist_wininst.vcxproj158
-rw-r--r--PCbuild/bdist_wininst.vcxproj.filters61
-rw-r--r--PCbuild/build.bat7
-rw-r--r--PCbuild/build_ssl.bat4
-rw-r--r--PCbuild/build_ssl.py8
-rw-r--r--PCbuild/build_tkinter.py6
-rw-r--r--PCbuild/debug.props27
-rw-r--r--PCbuild/env.bat8
-rw-r--r--PCbuild/kill_python.c2
-rw-r--r--PCbuild/kill_python.vcxproj120
-rw-r--r--PCbuild/kill_python.vcxproj.filters13
-rw-r--r--PCbuild/make_buildinfo.c67
-rw-r--r--PCbuild/make_buildinfo.vcxproj52
-rw-r--r--PCbuild/make_buildinfo.vcxproj.filters14
-rw-r--r--PCbuild/make_versioninfo.vcxproj200
-rw-r--r--PCbuild/make_versioninfo.vcxproj.filters13
-rw-r--r--PCbuild/pcbuild.sln273
-rw-r--r--PCbuild/pginstrument.props38
-rw-r--r--PCbuild/pgupdate.props17
-rw-r--r--PCbuild/pyd.props25
-rw-r--r--PCbuild/pyd_d.props31
-rw-r--r--PCbuild/pyexpat.vcxproj237
-rw-r--r--PCbuild/pyexpat.vcxproj.filters33
-rw-r--r--PCbuild/pylauncher.vcxproj311
-rw-r--r--PCbuild/pylauncher.vcxproj.filters32
-rw-r--r--PCbuild/pyproject.props105
-rw-r--r--PCbuild/python.vcxproj368
-rw-r--r--PCbuild/python.vcxproj.filters26
-rw-r--r--PCbuild/python3dll.vcxproj184
-rw-r--r--PCbuild/python3dll.vcxproj.filters32
-rw-r--r--PCbuild/pythoncore.vcxproj680
-rw-r--r--PCbuild/pythoncore.vcxproj.filters925
-rw-r--r--PCbuild/pythonw.vcxproj346
-rw-r--r--PCbuild/pythonw.vcxproj.filters21
-rw-r--r--PCbuild/pywlauncher.vcxproj246
-rw-r--r--PCbuild/pywlauncher.vcxproj.filters32
-rw-r--r--PCbuild/readme.txt37
-rw-r--r--PCbuild/release.props19
-rw-r--r--PCbuild/select.vcxproj234
-rw-r--r--PCbuild/select.vcxproj.filters13
-rw-r--r--PCbuild/sqlite3.props16
-rw-r--r--PCbuild/sqlite3.vcxproj240
-rw-r--r--PCbuild/sqlite3.vcxproj.filters24
-rw-r--r--PCbuild/ssl.vcxproj221
-rw-r--r--PCbuild/unicodedata.vcxproj222
-rw-r--r--PCbuild/unicodedata.vcxproj.filters24
-rw-r--r--PCbuild/vs9to10.py56
-rw-r--r--PCbuild/w9xpopen.vcxproj287
-rw-r--r--PCbuild/w9xpopen.vcxproj.filters13
-rw-r--r--PCbuild/winsound.vcxproj218
-rw-r--r--PCbuild/winsound.vcxproj.filters14
-rw-r--r--PCbuild/x64.props20
-rw-r--r--PCbuild/xxlimited.vcxproj194
-rw-r--r--PCbuild/xxlimited.vcxproj.filters13
-rw-r--r--Parser/Python.asdl203
-rw-r--r--Parser/asdl.py35
-rwxr-xr-xParser/asdl_c.py110
-rw-r--r--Parser/intrcheck.c174
-rw-r--r--Parser/myreadline.c37
-rw-r--r--Parser/node.c2
-rw-r--r--Parser/parsetok.c64
-rw-r--r--Parser/parsetok_pgen.c2
-rw-r--r--Parser/pgenmain.c2
-rw-r--r--Parser/tokenizer.c100
-rw-r--r--Parser/tokenizer.h9
-rw-r--r--Python/Python-ast.c1277
-rw-r--r--Python/_warnings.c97
-rw-r--r--Python/asdl.c4
-rw-r--r--Python/ast.c925
-rw-r--r--Python/bltinmodule.c211
-rw-r--r--Python/ceval.c864
-rw-r--r--Python/ceval_gil.h227
-rw-r--r--Python/codecs.c230
-rw-r--r--Python/compile.c342
-rw-r--r--Python/condvar.h390
-rw-r--r--Python/dtoa.c54
-rw-r--r--Python/dynload_aix.c19
-rw-r--r--Python/dynload_dl.c16
-rw-r--r--Python/dynload_hpux.c20
-rw-r--r--Python/dynload_next.c10
-rw-r--r--Python/dynload_os2.c8
-rw-r--r--Python/dynload_shlib.c43
-rw-r--r--Python/dynload_stub.c4
-rw-r--r--Python/dynload_win.c72
-rw-r--r--Python/errors.c165
-rw-r--r--Python/fileutils.c88
-rw-r--r--Python/formatter_unicode.c1534
-rw-r--r--Python/frozen.c3
-rw-r--r--Python/getargs.c425
-rw-r--r--Python/getcopyright.c2
-rw-r--r--Python/graminit.c190
-rw-r--r--Python/import.c3336
-rw-r--r--Python/importdl.c87
-rw-r--r--Python/importdl.h26
-rw-r--r--Python/importlib.h4404
-rwxr-xr-xPython/makeopcodetargets.py3
-rw-r--r--Python/marshal.c74
-rw-r--r--Python/modsupport.c16
-rw-r--r--Python/opcode_targets.h2
-rw-r--r--Python/peephole.c178
-rw-r--r--Python/pyarena.c8
-rw-r--r--Python/pystate.c49
-rw-r--r--Python/pystrtod.c41
-rw-r--r--Python/pythonrun.c349
-rw-r--r--Python/pytime.c203
-rw-r--r--Python/random.c11
-rw-r--r--Python/symtable.c271
-rw-r--r--Python/sysmodule.c211
-rw-r--r--Python/thread.c126
-rw-r--r--Python/thread_cthread.h112
-rw-r--r--Python/thread_lwp.h113
-rw-r--r--Python/thread_nt.h104
-rw-r--r--Python/thread_pth.h3
-rw-r--r--Python/thread_pthread.h25
-rw-r--r--Python/thread_sgi.h259
-rw-r--r--Python/thread_solaris.h130
-rw-r--r--Python/thread_wince.h136
-rw-r--r--Python/traceback.c294
-rw-r--r--README30
-rw-r--r--Tools/README12
-rw-r--r--Tools/buildbot/build-amd64.bat8
-rw-r--r--Tools/buildbot/build.bat7
-rw-r--r--Tools/buildbot/buildmsi.bat4
-rw-r--r--Tools/buildbot/clean-amd64.bat6
-rw-r--r--Tools/buildbot/clean.bat6
-rw-r--r--Tools/buildbot/external-amd64.bat12
-rw-r--r--Tools/buildbot/external-common.bat26
-rw-r--r--Tools/buildbot/external.bat12
-rw-r--r--Tools/ccbench/ccbench.py119
-rwxr-xr-xTools/demo/life.py89
-rwxr-xr-xTools/demo/ss1.py1
-rw-r--r--Tools/gdb/libpython.py209
-rw-r--r--Tools/hg/hgtouch.py103
-rwxr-xr-xTools/i18n/pygettext.py1
-rw-r--r--Tools/importbench/README6
-rw-r--r--Tools/importbench/importbench.py252
-rw-r--r--Tools/iobench/iobench.py17
-rw-r--r--Tools/msi/msi.py270
-rw-r--r--Tools/msi/msilib.py18
-rw-r--r--Tools/msi/uuids.py99
-rw-r--r--Tools/parser/test_unparse.py31
-rw-r--r--Tools/parser/unparse.py39
-rwxr-xr-xTools/pybench/pybench.py28
-rw-r--r--Tools/scripts/README4
-rwxr-xr-xTools/scripts/diff.py16
-rwxr-xr-xTools/scripts/find_recursionlimit.py7
-rwxr-xr-xTools/scripts/findnocoding.py23
-rwxr-xr-xTools/scripts/highlight.py260
-rwxr-xr-xTools/scripts/import_diagnostics.py37
-rwxr-xr-xTools/scripts/patchcheck.py53
-rwxr-xr-xTools/scripts/pysource.py14
-rwxr-xr-xTools/scripts/pyvenv11
-rwxr-xr-xTools/scripts/reindent.py18
-rwxr-xr-xTools/scripts/run_tests.py51
-rwxr-xr-xTools/scripts/texi2html.py10
-rw-r--r--Tools/ssl/make_ssl_data.py68
-rw-r--r--Tools/stringbench/README68
-rwxr-xr-xTools/stringbench/stringbench.py1482
-rw-r--r--Tools/unicode/comparecodecs.py2
-rw-r--r--Tools/unicode/gencodec.py9
-rw-r--r--Tools/unicode/makeunicodedata.py379
-rw-r--r--Tools/unittestgui/unittestgui.py1
-rwxr-xr-xconfig.guess1530
-rwxr-xr-xconfig.sub1773
-rwxr-xr-xconfigure1857
-rw-r--r--configure.ac802
-rw-r--r--pyconfig.h.in234
-rw-r--r--setup.py481
1693 files changed, 341271 insertions, 84569 deletions
diff --git a/.bzrignore b/.bzrignore
index 959a7df..897084d 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -33,7 +33,6 @@ Modules/Setup.local
Modules/config.c
Modules/ld_so_aix
Parser/pgen
-Parser/pgen.stamp
Lib/test/data/*
Lib/lib2to3/Grammar*.pickle
Lib/lib2to3/PatternGrammar*.pickle
diff --git a/.gitignore b/.gitignore
index c1a8055..49299ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,7 @@ Doc/tools/jinja2/
Doc/tools/pygments/
Doc/tools/sphinx/
Lib/lib2to3/*.pickle
+Lib/_sysconfigdata.py
Lib/plat-mac/errors.rsrc.df.rsrc
Makefile
Makefile.pre
@@ -24,6 +25,7 @@ Modules/Setup.config
Modules/Setup.local
Modules/config.c
Modules/ld_so_aix
+Modules/_freeze_importlib
Modules/_testembed
PCbuild/*.bsc
PCbuild/*.dll
@@ -37,7 +39,6 @@ PCbuild/Win32-temp-*
PCbuild/amd64/
.purify
Parser/pgen
-Parser/pgen.stamp
__pycache__
autom4te.cache
build/
diff --git a/.hgeol b/.hgeol
index ed13171..64bb7cf 100644
--- a/.hgeol
+++ b/.hgeol
@@ -28,8 +28,11 @@
Lib/email/test/data/msg_26.txt = BIN
Lib/test/cjkencodings/* = BIN
-Lib/test/sndhdrdata/sndhdr.* = BIN
Lib/test/decimaltestdata/*.decTest = BIN
+Lib/test/sndhdrdata/sndhdr.* = BIN
+Lib/test/test_email/data/msg_26.txt = BIN
+
+Lib/venv/scripts/nt/* = BIN
# All other files (which presumably are human-editable) are "native".
# This must be the last rule!
diff --git a/.hgignore b/.hgignore
index 24df3b9..967699c 100644
--- a/.hgignore
+++ b/.hgignore
@@ -5,7 +5,8 @@ Makefile$
Makefile.pre$
TAGS$
autom4te.cache$
-build/
+^build/
+^Doc/build/
buildno$
config.cache
config.log
@@ -31,7 +32,6 @@ Modules/Setup.local
Modules/config.c
Modules/ld_so_aix$
Parser/pgen$
-Parser/pgen.stamp$
^core
^python-gdb.py
^python.exe-gdb.py
@@ -54,6 +54,18 @@ PC/python_nt*.h
PC/pythonnt_rc*.h
PC/*.obj
PC/*.exe
+PC/*/*.exe
+PC/*/*.exp
+PC/*/*.lib
+PC/*/*.bsc
+PC/*/*.dll
+PC/*/*.pdb
+PC/*/*.user
+PC/*/*.ncb
+PC/*/*.suo
+PC/*/Win32-temp-*
+PC/*/x64-temp-*
+PC/*/amd64
PCbuild/*.exe
PCbuild/*.dll
PCbuild/*.pdb
@@ -62,8 +74,15 @@ PCbuild/*.exp
PCbuild/*.o
PCbuild/*.ncb
PCbuild/*.bsc
+PCbuild/*.user
+PCbuild/*.suo
+PCbuild/*.*sdf
PCbuild/Win32-temp-*
+PCbuild/x64-temp-*
+PCbuild/amd64
+BuildLog.htm
__pycache__
+Modules/_freeze_importlib
Modules/_testembed
.coverage
coverage/
diff --git a/.hgtags b/.hgtags
index f061b90..efa4d2e 100644
--- a/.hgtags
+++ b/.hgtags
@@ -99,3 +99,13 @@ c860feaa348d663e598986894ee4680480577e15 v3.2.2rc1
7085403daf439adb3f9e70ef13f6bedb1c447376 v3.2.3rc1
428f05cb7277e1d42bb9dd8d1af6b6270ebc6112 v3.2.3rc2
3d0686d90f55a78f96d9403da2c52dc2411419d0 v3.2.3
+f1a9a6505731714f0e157453ff850e3b71615c45 v3.3.0a1
+2f69db52d6de306cdaef0a0cc00cc823fb350b01 v3.3.0a2
+0b53b70a40a00013505eb35e3660057b62be77be v3.3.0a3
+7c51388a3aa7ce76a8541bbbdfc05d2d259a162c v3.3.0a4
+e15c554cd43eb23bc0a528a4e8741da9bbec9607 v3.3.0b1
+4972a8f1b2aa3d7cdd64dc96aa7fa112fe1ea343 v3.3.0b2
+8bb5c7bc46ba43804480f3e328e1fa956672c885 v3.3.0rc1
+88a0792e8ba3e4916b24c7e7a522c277d326d66e v3.3.0rc2
+c191d21cefafb3832c45570e84854e309aa62eaa v3.3.0rc3
+bd8afb90ebf28ba4edc901d4a235f75e7bbc79fd v3.3.0
diff --git a/.hgtouch b/.hgtouch
new file mode 100644
index 0000000..ad936fa
--- /dev/null
+++ b/.hgtouch
@@ -0,0 +1,12 @@
+# -*- Makefile -*-
+# Define dependencies of generated files that are checked into hg.
+# The syntax of this file uses make rule dependencies, without actions
+
+Python/importlib.h: Lib/importlib/_bootstrap.py Python/freeze_importlib.py
+
+Include/ast.h: Parser/Python.asdl Parser/asdl.py Parser/asdl_c.py
+Python/Python-ast.c: Include/ast.h
+
+Python/opcode_targets.h: Python/makeopcodetargets.py Lib/opcode.py
+
+Objects/typeslots.inc: Include/typeslots.h Objects/typeslots.py \ No newline at end of file
diff --git a/Doc/Makefile b/Doc/Makefile
index 13411f2..a774aad 100644
--- a/Doc/Makefile
+++ b/Doc/Makefile
@@ -53,7 +53,7 @@ checkout:
fi
@if [ ! -d tools/pygments ]; then \
echo "Checking out Pygments..."; \
- svn checkout $(SVNROOT)/external/Pygments-1.3.1/pygments tools/pygments; \
+ svn checkout $(SVNROOT)/external/Pygments-1.5dev-20120930/pygments tools/pygments; \
fi
update: clean checkout
@@ -187,6 +187,10 @@ autobuild-dev:
make update
make dist SPHINXOPTS='-A daily=1 -A versionswitcher=1'
+# for quick rebuilds (HTML only)
+autobuild-html:
+ make html SPHINXOPTS='-A daily=1 -A versionswitcher=1'
+
# for stable releases: only build if not in pre-release stage (alpha, beta, rc)
autobuild-stable:
@case $(DISTVERSION) in *[abc]*) \
@@ -194,3 +198,4 @@ autobuild-stable:
exit 1;; \
esac
@make autobuild-dev
+
diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst
index d4dda7c..b28aa5f 100644
--- a/Doc/c-api/arg.rst
+++ b/Doc/c-api/arg.rst
@@ -146,7 +146,7 @@ Unless otherwise stated, buffers are not NUL-terminated.
Like ``u#``, but the Python object may also be ``None``, in which case the
:c:type:`Py_UNICODE` pointer is set to *NULL*.
-``U`` (:class:`str`) [PyUnicodeObject \*]
+``U`` (:class:`str`) [PyObject \*]
Requires that the Python object is a Unicode object, without attempting
any conversion. Raises :exc:`TypeError` if the object is not a Unicode
object. The C variable may also be declared as :c:type:`PyObject\*`.
@@ -260,9 +260,12 @@ Numbers
``n`` (:class:`int`) [Py_ssize_t]
Convert a Python integer to a C :c:type:`Py_ssize_t`.
-``c`` (:class:`bytes` of length 1) [char]
- Convert a Python byte, represented as a :class:`bytes` object of length 1,
- to a C :c:type:`char`.
+``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char]
+ Convert a Python byte, represented as a :class:`bytes` or
+ :class:`bytearray` object of length 1, to a C :c:type:`char`.
+
+ .. versionchanged:: 3.3
+ Allow :class:`bytearray` objects.
``C`` (:class:`str` of length 1) [int]
Convert a Python character, represented as a :class:`str` object of
@@ -315,6 +318,15 @@ Other objects
.. versionchanged:: 3.1
``Py_CLEANUP_SUPPORTED`` was added.
+``p`` (:class:`bool`) [int]
+ Tests the value passed in for truth (a boolean **p**\redicate) and converts
+ the result to its equivalent C true/false integer value.
+ Sets the int to 1 if the expression was true and 0 if it was false.
+ This accepts any valid Python value. See :ref:`truth` for more
+ information about how Python tests values for truth.
+
+ .. versionadded:: 3.3
+
``(items)`` (:class:`tuple`) [*matching-items*]
The object must be a Python sequence whose length is the number of format units
in *items*. The C arguments must correspond to the individual format units in
@@ -336,6 +348,15 @@ inside nested parentheses. They are:
:c:func:`PyArg_ParseTuple` does not touch the contents of the corresponding C
variable(s).
+``$``
+ :c:func:`PyArg_ParseTupleAndKeywords` only:
+ Indicates that the remaining arguments in the Python argument list are
+ keyword-only. Currently, all keyword-only arguments must also be optional
+ arguments, so ``|`` must always be specified before ``$`` in the format
+ string.
+
+ .. versionadded:: 3.3
+
``:``
The list of format units ends here; the string after the colon is used as the
function name in error messages (the "associated value" of the exception that
diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst
index d98ece3..d636935 100644
--- a/Doc/c-api/buffer.rst
+++ b/Doc/c-api/buffer.rst
@@ -7,6 +7,7 @@ Buffer Protocol
.. sectionauthor:: Greg Stein <gstein@lyra.org>
.. sectionauthor:: Benjamin Peterson
+.. sectionauthor:: Stefan Krah
.. index::
@@ -20,7 +21,7 @@ as image processing or numeric analysis.
While each of these types have their own semantics, they share the common
characteristic of being backed by a possibly large memory buffer. It is
-then desireable, in some situations, to access that buffer directly and
+then desirable, in some situations, to access that buffer directly and
without intermediate copying.
Python provides such a facility at the C level in the form of the *buffer
@@ -60,8 +61,10 @@ isn't needed anymore. Failure to do so could lead to various issues such as
resource leaks.
-The buffer structure
-====================
+.. _buffer-structure:
+
+Buffer structure
+================
Buffer structures (or simply "buffers") are useful as a way to expose the
binary data from another object to the Python programmer. They can also be
@@ -78,249 +81,411 @@ allows them to be created and copied very simply. When a generic wrapper
around a buffer is needed, a :ref:`memoryview <memoryview-objects>` object
can be created.
+For short instructions how to write an exporting object, see
+:ref:`Buffer Object Structures <buffer-structs>`. For obtaining
+a buffer, see :c:func:`PyObject_GetBuffer`.
.. c:type:: Py_buffer
- .. c:member:: void *buf
+ .. c:member:: void \*obj
+
+ A new reference to the exporting object. The reference is owned by
+ the consumer and automatically decremented and set to *NULL* by
+ :c:func:`PyBuffer_Release`. The field is the equivalent of the return
+ value of any standard C-API function.
+
+ As a special case, for *temporary* buffers that are wrapped by
+ :c:func:`PyMemoryView_FromBuffer` or :c:func:`PyBuffer_FillInfo`
+ this field is *NULL*. In general, exporting objects MUST NOT
+ use this scheme.
- A pointer to the start of the memory for the object.
+ .. c:member:: void \*buf
+
+ A pointer to the start of the logical structure described by the buffer
+ fields. This can be any location within the underlying physical memory
+ block of the exporter. For example, with negative :c:member:`~Py_buffer.strides`
+ the value may point to the end of the memory block.
+
+ For contiguous arrays, the value points to the beginning of the memory
+ block.
.. c:member:: Py_ssize_t len
- :noindex:
- The total length of the memory in bytes.
+ ``product(shape) * itemsize``. For contiguous arrays, this is the length
+ of the underlying memory block. For non-contiguous arrays, it is the length
+ that the logical structure would have if it were copied to a contiguous
+ representation.
+
+ Accessing ``((char *)buf)[0] up to ((char *)buf)[len-1]`` is only valid
+ if the buffer has been obtained by a request that guarantees contiguity. In
+ most cases such a request will be :c:macro:`PyBUF_SIMPLE` or :c:macro:`PyBUF_WRITABLE`.
.. c:member:: int readonly
- An indicator of whether the buffer is read only.
+ An indicator of whether the buffer is read-only. This field is controlled
+ by the :c:macro:`PyBUF_WRITABLE` flag.
+
+ .. c:member:: Py_ssize_t itemsize
+
+ Item size in bytes of a single element. Same as the value of :func:`struct.calcsize`
+ called on non-NULL :c:member:`~Py_buffer.format` values.
+
+ Important exception: If a consumer requests a buffer without the
+ :c:macro:`PyBUF_FORMAT` flag, :c:member:`~Py_Buffer.format` will
+ be set to *NULL*, but :c:member:`~Py_buffer.itemsize` still has
+ the value for the original format.
+
+ If :c:member:`~Py_Buffer.shape` is present, the equality
+ ``product(shape) * itemsize == len`` still holds and the consumer
+ can use :c:member:`~Py_buffer.itemsize` to navigate the buffer.
+
+ If :c:member:`~Py_Buffer.shape` is *NULL* as a result of a :c:macro:`PyBUF_SIMPLE`
+ or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard
+ :c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``.
- .. c:member:: const char *format
- :noindex:
+ .. c:member:: const char \*format
- A *NULL* terminated string in :mod:`struct` module style syntax giving
- the contents of the elements available through the buffer. If this is
- *NULL*, ``"B"`` (unsigned bytes) is assumed.
+ A *NUL* terminated string in :mod:`struct` module style syntax describing
+ the contents of a single item. If this is *NULL*, ``"B"`` (unsigned bytes)
+ is assumed.
+
+ This field is controlled by the :c:macro:`PyBUF_FORMAT` flag.
.. c:member:: int ndim
- The number of dimensions the memory represents as a multi-dimensional
- array. If it is 0, :c:data:`strides` and :c:data:`suboffsets` must be
- *NULL*.
-
- .. c:member:: Py_ssize_t *shape
-
- An array of :c:type:`Py_ssize_t`\s the length of :c:data:`ndim` giving the
- shape of the memory as a multi-dimensional array. Note that
- ``((*shape)[0] * ... * (*shape)[ndims-1])*itemsize`` should be equal to
- :c:data:`len`.
-
- .. c:member:: Py_ssize_t *strides
-
- An array of :c:type:`Py_ssize_t`\s the length of :c:data:`ndim` giving the
- number of bytes to skip to get to a new element in each dimension.
-
- .. c:member:: Py_ssize_t *suboffsets
-
- An array of :c:type:`Py_ssize_t`\s the length of :c:data:`ndim`. If these
- suboffset numbers are greater than or equal to 0, then the value stored
- along the indicated dimension is a pointer and the suboffset value
- dictates how many bytes to add to the pointer after de-referencing. A
- suboffset value that it negative indicates that no de-referencing should
- occur (striding in a contiguous memory block).
-
- Here is a function that returns a pointer to the element in an N-D array
- pointed to by an N-dimensional index when there are both non-NULL strides
- and suboffsets::
-
- void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
- Py_ssize_t *suboffsets, Py_ssize_t *indices) {
- char *pointer = (char*)buf;
- int i;
- for (i = 0; i < ndim; i++) {
- pointer += strides[i] * indices[i];
- if (suboffsets[i] >=0 ) {
- pointer = *((char**)pointer) + suboffsets[i];
- }
- }
- return (void*)pointer;
- }
+ The number of dimensions the memory represents as an n-dimensional array.
+ If it is 0, :c:member:`~Py_Buffer.buf` points to a single item representing
+ a scalar. In this case, :c:member:`~Py_buffer.shape`, :c:member:`~Py_buffer.strides`
+ and :c:member:`~Py_buffer.suboffsets` MUST be *NULL*.
+ The macro :c:macro:`PyBUF_MAX_NDIM` limits the maximum number of dimensions
+ to 64. Exporters MUST respect this limit, consumers of multi-dimensional
+ buffers SHOULD be able to handle up to :c:macro:`PyBUF_MAX_NDIM` dimensions.
- .. c:member:: Py_ssize_t itemsize
+ .. c:member:: Py_ssize_t \*shape
+
+ An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
+ indicating the shape of the memory as an n-dimensional array. Note that
+ ``shape[0] * ... * shape[ndim-1] * itemsize`` MUST be equal to
+ :c:member:`~Py_buffer.len`.
+
+ Shape values are restricted to ``shape[n] >= 0``. The case
+ ``shape[n] == 0`` requires special attention. See `complex arrays`_
+ for further information.
+
+ The shape array is read-only for the consumer.
+
+ .. c:member:: Py_ssize_t \*strides
+
+ An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
+ giving the number of bytes to skip to get to a new element in each
+ dimension.
+
+ Stride values can be any integer. For regular arrays, strides are
+ usually positive, but a consumer MUST be able to handle the case
+ ``strides[n] <= 0``. See `complex arrays`_ for further information.
+
+ The strides array is read-only for the consumer.
+
+ .. c:member:: Py_ssize_t \*suboffsets
+
+ An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`.
+ If ``suboffsets[n] >= 0``, the values stored along the nth dimension are
+ pointers and the suboffset value dictates how many bytes to add to each
+ pointer after de-referencing. A suboffset value that is negative
+ indicates that no de-referencing should occur (striding in a contiguous
+ memory block).
- This is a storage for the itemsize (in bytes) of each element of the
- shared memory. It is technically un-necessary as it can be obtained
- using :c:func:`PyBuffer_SizeFromFormat`, however an exporter may know
- this information without parsing the format string and it is necessary
- to know the itemsize for proper interpretation of striding. Therefore,
- storing it is more convenient and faster.
+ This type of array representation is used by the Python Imaging Library
+ (PIL). See `complex arrays`_ for further information how to access elements
+ of such an array.
- .. c:member:: void *internal
+ The suboffsets array is read-only for the consumer.
+
+ .. c:member:: void \*internal
This is for use internally by the exporting object. For example, this
might be re-cast as an integer by the exporter and used to store flags
about whether or not the shape, strides, and suboffsets arrays must be
- freed when the buffer is released. The consumer should never alter this
+ freed when the buffer is released. The consumer MUST NOT alter this
value.
+.. _buffer-request-types:
-Buffer-related functions
-========================
+Buffer request types
+====================
+Buffers are usually obtained by sending a buffer request to an exporting
+object via :c:func:`PyObject_GetBuffer`. Since the complexity of the logical
+structure of the memory can vary drastically, the consumer uses the *flags*
+argument to specify the exact buffer type it can handle.
-.. c:function:: int PyObject_CheckBuffer(PyObject *obj)
+All :c:data:`Py_buffer` fields are unambiguously defined by the request
+type.
+
+request-independent fields
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+The following fields are not influenced by *flags* and must always be filled in
+with the correct values: :c:member:`~Py_buffer.obj`, :c:member:`~Py_buffer.buf`,
+:c:member:`~Py_buffer.len`, :c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`.
- Return 1 if *obj* supports the buffer interface otherwise 0. When 1 is
- returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` will
- succeed.
+readonly, format
+~~~~~~~~~~~~~~~~
-.. c:function:: int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
+ .. c:macro:: PyBUF_WRITABLE
- Export a view over some internal data from the target object *obj*.
- *obj* must not be NULL, and *view* must point to an existing
- :c:type:`Py_buffer` structure allocated by the caller (most uses of
- this function will simply declare a local variable of type
- :c:type:`Py_buffer`). The *flags* argument is a bit field indicating
- what kind of buffer is requested. The buffer interface allows
- for complicated memory layout possibilities; however, some callers
- won't want to handle all the complexity and instead request a simple
- view of the target object (using :c:macro:`PyBUF_SIMPLE` for a read-only
- view and :c:macro:`PyBUF_WRITABLE` for a read-write view).
+ Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter
+ MUST provide a writable buffer or else report failure. Otherwise, the
+ exporter MAY provide either a read-only or writable buffer, but the choice
+ MUST be consistent for all consumers.
- Some exporters may not be able to share memory in every possible way and
- may need to raise errors to signal to some consumers that something is
- just not possible. These errors should be a :exc:`BufferError` unless
- there is another error that is actually causing the problem. The
- exporter can use flags information to simplify how much of the
- :c:data:`Py_buffer` structure is filled in with non-default values and/or
- raise an error if the object can't support a simpler view of its memory.
+ .. c:macro:: PyBUF_FORMAT
- On success, 0 is returned and the *view* structure is filled with useful
- values. On error, -1 is returned and an exception is raised; the *view*
- is left in an undefined state.
+ Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST
+ be filled in correctly. Otherwise, this field MUST be *NULL*.
- The following are the possible values to the *flags* arguments.
- .. c:macro:: PyBUF_SIMPLE
+:c:macro:`PyBUF_WRITABLE` can be \|'d to any of the flags in the next section.
+Since :c:macro:`PyBUF_SIMPLE` is defined as 0, :c:macro:`PyBUF_WRITABLE`
+can be used as a stand-alone flag to request a simple writable buffer.
- This is the default flag. The returned buffer exposes a read-only
- memory area. The format of data is assumed to be raw unsigned bytes,
- without any particular structure. This is a "stand-alone" flag
- constant. It never needs to be '|'d to the others. The exporter will
- raise an error if it cannot provide such a contiguous buffer of bytes.
+:c:macro:`PyBUF_FORMAT` can be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`.
+The latter already implies format ``B`` (unsigned bytes).
- .. c:macro:: PyBUF_WRITABLE
- Like :c:macro:`PyBUF_SIMPLE`, but the returned buffer is writable. If
- the exporter doesn't support writable buffers, an error is raised.
+shape, strides, suboffsets
+~~~~~~~~~~~~~~~~~~~~~~~~~~
- .. c:macro:: PyBUF_STRIDES
+The flags that control the logical structure of the memory are listed
+in decreasing order of complexity. Note that each flag contains all bits
+of the flags below it.
- This implies :c:macro:`PyBUF_ND`. The returned buffer must provide
- strides information (i.e. the strides cannot be NULL). This would be
- used when the consumer can handle strided, discontiguous arrays.
- Handling strides automatically assumes you can handle shape. The
- exporter can raise an error if a strided representation of the data is
- not possible (i.e. without the suboffsets).
- .. c:macro:: PyBUF_ND
++-----------------------------+-------+---------+------------+
+| Request | shape | strides | suboffsets |
++=============================+=======+=========+============+
+| .. c:macro:: PyBUF_INDIRECT | yes | yes | if needed |
++-----------------------------+-------+---------+------------+
+| .. c:macro:: PyBUF_STRIDES | yes | yes | NULL |
++-----------------------------+-------+---------+------------+
+| .. c:macro:: PyBUF_ND | yes | NULL | NULL |
++-----------------------------+-------+---------+------------+
+| .. c:macro:: PyBUF_SIMPLE | NULL | NULL | NULL |
++-----------------------------+-------+---------+------------+
- The returned buffer must provide shape information. The memory will be
- assumed C-style contiguous (last dimension varies the fastest). The
- exporter may raise an error if it cannot provide this kind of
- contiguous buffer. If this is not given then shape will be *NULL*.
- .. c:macro:: PyBUF_C_CONTIGUOUS
- PyBUF_F_CONTIGUOUS
- PyBUF_ANY_CONTIGUOUS
+contiguity requests
+~~~~~~~~~~~~~~~~~~~
- These flags indicate that the contiguity returned buffer must be
- respectively, C-contiguous (last dimension varies the fastest), Fortran
- contiguous (first dimension varies the fastest) or either one. All of
- these flags imply :c:macro:`PyBUF_STRIDES` and guarantee that the
- strides buffer info structure will be filled in correctly.
+C or Fortran contiguity can be explicitly requested, with and without stride
+information. Without stride information, the buffer must be C-contiguous.
- .. c:macro:: PyBUF_INDIRECT
++-----------------------------------+-------+---------+------------+--------+
+| Request | shape | strides | suboffsets | contig |
++===================================+=======+=========+============+========+
+| .. c:macro:: PyBUF_C_CONTIGUOUS | yes | yes | NULL | C |
++-----------------------------------+-------+---------+------------+--------+
+| .. c:macro:: PyBUF_F_CONTIGUOUS | yes | yes | NULL | F |
++-----------------------------------+-------+---------+------------+--------+
+| .. c:macro:: PyBUF_ANY_CONTIGUOUS | yes | yes | NULL | C or F |
++-----------------------------------+-------+---------+------------+--------+
+| .. c:macro:: PyBUF_ND | yes | NULL | NULL | C |
++-----------------------------------+-------+---------+------------+--------+
- This flag indicates the returned buffer must have suboffsets
- information (which can be NULL if no suboffsets are needed). This can
- be used when the consumer can handle indirect array referencing implied
- by these suboffsets. This implies :c:macro:`PyBUF_STRIDES`.
- .. c:macro:: PyBUF_FORMAT
+compound requests
+~~~~~~~~~~~~~~~~~
- The returned buffer must have true format information if this flag is
- provided. This would be used when the consumer is going to be checking
- for what 'kind' of data is actually stored. An exporter should always
- be able to provide this information if requested. If format is not
- explicitly requested then the format must be returned as *NULL* (which
- means ``'B'``, or unsigned bytes).
+All possible requests are fully defined by some combination of the flags in
+the previous section. For convenience, the buffer protocol provides frequently
+used combinations as single flags.
- .. c:macro:: PyBUF_STRIDED
+In the following table *U* stands for undefined contiguity. The consumer would
+have to call :c:func:`PyBuffer_IsContiguous` to determine contiguity.
- This is equivalent to ``(PyBUF_STRIDES | PyBUF_WRITABLE)``.
- .. c:macro:: PyBUF_STRIDED_RO
- This is equivalent to ``(PyBUF_STRIDES)``.
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| Request | shape | strides | suboffsets | contig | readonly | format |
++===============================+=======+=========+============+========+==========+========+
+| .. c:macro:: PyBUF_FULL | yes | yes | if needed | U | 0 | yes |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_FULL_RO | yes | yes | if needed | U | 1 or 0 | yes |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_RECORDS | yes | yes | NULL | U | 0 | yes |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_RECORDS_RO | yes | yes | NULL | U | 1 or 0 | yes |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_STRIDED | yes | yes | NULL | U | 0 | NULL |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_STRIDED_RO | yes | yes | NULL | U | 1 or 0 | NULL |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_CONTIG | yes | NULL | NULL | C | 0 | NULL |
++-------------------------------+-------+---------+------------+--------+----------+--------+
+| .. c:macro:: PyBUF_CONTIG_RO | yes | NULL | NULL | C | 1 or 0 | NULL |
++-------------------------------+-------+---------+------------+--------+----------+--------+
- .. c:macro:: PyBUF_RECORDS
- This is equivalent to ``(PyBUF_STRIDES | PyBUF_FORMAT |
- PyBUF_WRITABLE)``.
+Complex arrays
+==============
- .. c:macro:: PyBUF_RECORDS_RO
+NumPy-style: shape and strides
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The logical structure of NumPy-style arrays is defined by :c:member:`~Py_buffer.itemsize`,
+:c:member:`~Py_buffer.ndim`, :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides`.
+
+If ``ndim == 0``, the memory location pointed to by :c:member:`~Py_buffer.buf` is
+interpreted as a scalar of size :c:member:`~Py_buffer.itemsize`. In that case,
+both :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are *NULL*.
+
+If :c:member:`~Py_buffer.strides` is *NULL*, the array is interpreted as
+a standard n-dimensional C-array. Otherwise, the consumer must access an
+n-dimensional array as follows:
+
+ ``ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1]``
+ ``item = *((typeof(item) *)ptr);``
+
+
+As noted above, :c:member:`~Py_buffer.buf` can point to any location within
+the actual memory block. An exporter can check the validity of a buffer with
+this function:
+
+.. code-block:: python
+
+ def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
+ """Verify that the parameters represent a valid array within
+ the bounds of the allocated memory:
+ char *mem: start of the physical memory block
+ memlen: length of the physical memory block
+ offset: (char *)buf - mem
+ """
+ if offset % itemsize:
+ return False
+ if offset < 0 or offset+itemsize > memlen:
+ return False
+ if any(v % itemsize for v in strides):
+ return False
+
+ if ndim <= 0:
+ return ndim == 0 and not shape and not strides
+ if 0 in shape:
+ return True
+
+ imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] <= 0)
+ imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] > 0)
+
+ return 0 <= offset+imin and offset+imax+itemsize <= memlen
+
+
+PIL-style: shape, strides and suboffsets
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In addition to the regular items, PIL-style arrays can contain pointers
+that must be followed in order to get to the next element in a dimension.
+For example, the regular three-dimensional C-array ``char v[2][2][3]`` can
+also be viewed as an array of 2 pointers to 2 two-dimensional arrays:
+``char (*v[2])[2][3]``. In suboffsets representation, those two pointers
+can be embedded at the start of :c:member:`~Py_buffer.buf`, pointing
+to two ``char x[2][3]`` arrays that can be located anywhere in memory.
+
+
+Here is a function that returns a pointer to the element in an N-D array
+pointed to by an N-dimensional index when there are both non-NULL strides
+and suboffsets::
+
+ void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
+ Py_ssize_t *suboffsets, Py_ssize_t *indices) {
+ char *pointer = (char*)buf;
+ int i;
+ for (i = 0; i < ndim; i++) {
+ pointer += strides[i] * indices[i];
+ if (suboffsets[i] >=0 ) {
+ pointer = *((char**)pointer) + suboffsets[i];
+ }
+ }
+ return (void*)pointer;
+ }
- This is equivalent to ``(PyBUF_STRIDES | PyBUF_FORMAT)``.
- .. c:macro:: PyBUF_FULL
+Buffer-related functions
+========================
- This is equivalent to ``(PyBUF_INDIRECT | PyBUF_FORMAT |
- PyBUF_WRITABLE)``.
+.. c:function:: int PyObject_CheckBuffer(PyObject *obj)
- .. c:macro:: PyBUF_FULL_RO
+ Return 1 if *obj* supports the buffer interface otherwise 0. When 1 is
+ returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` will
+ succeed.
- This is equivalent to ``(PyBUF_INDIRECT | PyBUF_FORMAT)``.
- .. c:macro:: PyBUF_CONTIG
+.. c:function:: int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags)
- This is equivalent to ``(PyBUF_ND | PyBUF_WRITABLE)``.
+ Send a request to *exporter* to fill in *view* as specified by *flags*.
+ If the exporter cannot provide a buffer of the exact type, it MUST raise
+ :c:data:`PyExc_BufferError`, set :c:member:`view->obj` to *NULL* and
+ return -1.
- .. c:macro:: PyBUF_CONTIG_RO
+ On success, fill in *view*, set :c:member:`view->obj` to a new reference
+ to *exporter* and return 0. In the case of chained buffer providers
+ that redirect requests to a single object, :c:member:`view->obj` MAY
+ refer to this object instead of *exporter* (See :ref:`Buffer Object Structures <buffer-structs>`).
- This is equivalent to ``(PyBUF_ND)``.
+ Successful calls to :c:func:`PyObject_GetBuffer` must be paired with calls
+ to :c:func:`PyBuffer_Release`, similar to :c:func:`malloc` and :c:func:`free`.
+ Thus, after the consumer is done with the buffer, :c:func:`PyBuffer_Release`
+ must be called exactly once.
.. c:function:: void PyBuffer_Release(Py_buffer *view)
- Release the buffer *view*. This should be called when the buffer is no
- longer being used as it may free memory from it.
+ Release the buffer *view* and decrement the reference count for
+ :c:member:`view->obj`. This function MUST be called when the buffer
+ is no longer being used, otherwise reference leaks may occur.
+
+ It is an error to call this function on a buffer that was not obtained via
+ :c:func:`PyObject_GetBuffer`.
.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *)
- Return the implied :c:data:`~Py_buffer.itemsize` from the struct-stype
- :c:data:`~Py_buffer.format`.
+ Return the implied :c:data:`~Py_buffer.itemsize` from :c:data:`~Py_buffer.format`.
+ This function is not yet implemented.
-.. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char fortran)
+.. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order)
- Return 1 if the memory defined by the *view* is C-style (*fortran* is
- ``'C'``) or Fortran-style (*fortran* is ``'F'``) contiguous or either one
- (*fortran* is ``'A'``). Return 0 otherwise.
+ Return 1 if the memory defined by the *view* is C-style (*order* is
+ ``'C'``) or Fortran-style (*order* is ``'F'``) contiguous or either one
+ (*order* is ``'A'``). Return 0 otherwise.
-.. c:function:: void PyBuffer_FillContiguousStrides(int ndim, Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t itemsize, char fortran)
+.. c:function:: void PyBuffer_FillContiguousStrides(int ndim, Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t itemsize, char order)
Fill the *strides* array with byte-strides of a contiguous (C-style if
- *fortran* is ``'C'`` or Fortran-style if *fortran* is ``'F'``) array of the
+ *order* is ``'C'`` or Fortran-style if *order* is ``'F'``) array of the
given shape with the given number of bytes per element.
-.. c:function:: int PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len, int readonly, int infoflags)
+.. c:function:: int PyBuffer_FillInfo(Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags)
+
+ Handle buffer requests for an exporter that wants to expose *buf* of size *len*
+ with writability set according to *readonly*. *buf* is interpreted as a sequence
+ of unsigned bytes.
+
+ The *flags* argument indicates the request type. This function always fills in
+ *view* as specified by flags, unless *buf* has been designated as read-only
+ and :c:macro:`PyBUF_WRITABLE` is set in *flags*.
+
+ On success, set :c:member:`view->obj` to a new reference to *exporter* and
+ return 0. Otherwise, raise :c:data:`PyExc_BufferError`, set
+ :c:member:`view->obj` to *NULL* and return -1;
+
+ If this function is used as part of a :ref:`getbufferproc <buffer-structs>`,
+ *exporter* MUST be set to the exporting object. Otherwise, *exporter* MUST
+ be NULL.
+
- Fill in a buffer-info structure, *view*, correctly for an exporter that can
- only share a contiguous chunk of memory of "unsigned bytes" of the given
- length. Return 0 on success and -1 (with raising an error) on error.
diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
index 6932bb1..57e8072 100644
--- a/Doc/c-api/code.rst
+++ b/Doc/c-api/code.rst
@@ -31,11 +31,11 @@ bound into a function.
Return true if *co* is a :class:`code` object
-.. c:function:: int PyCode_GetNumFree(PyObject *co)
+.. c:function:: int PyCode_GetNumFree(PyCodeObject *co)
Return the number of free variables in *co*.
-.. c:function:: PyCodeObject *PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab)
+.. c:function:: PyCodeObject* PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab)
Return a new code object. If you need a dummy code object to
create a frame, use :c:func:`PyCode_NewEmpty` instead. Calling
@@ -43,7 +43,7 @@ bound into a function.
version since the definition of the bytecode changes often.
-.. c:function:: int PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
+.. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
Return a new empty code object with the specified filename,
function name, and first line number. It is illegal to
diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst
index dfc0a3a..9578f98 100644
--- a/Doc/c-api/conversion.rst
+++ b/Doc/c-api/conversion.rst
@@ -119,13 +119,13 @@ The following functions provide locale-independent string to number conversions.
.. versionadded:: 3.1
-.. c:function:: char* PyOS_stricmp(char *s1, char *s2)
+.. c:function:: int PyOS_stricmp(char *s1, char *s2)
Case insensitive comparison of strings. The function works almost
identically to :c:func:`strcmp` except that it ignores the case.
-.. c:function:: char* PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
+.. c:function:: int PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
Case insensitive comparison of strings. The function works almost
identically to :c:func:`strncmp` except that it ignores the case.
diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst
index fcd1395..39542bd 100644
--- a/Doc/c-api/datetime.rst
+++ b/Doc/c-api/datetime.rst
@@ -170,6 +170,31 @@ and the type is not checked:
Return the microsecond, as an int from 0 through 999999.
+Macros to extract fields from time delta objects. The argument must be an
+instance of :c:data:`PyDateTime_Delta`, including subclasses. The argument must
+not be *NULL*, and the type is not checked:
+
+.. c:function:: int PyDateTime_DELTA_GET_DAYS(PyDateTime_Delta *o)
+
+ Return the number of days, as an int from -999999999 to 999999999.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyDateTime_DELTA_GET_SECONDS(PyDateTime_Delta *o)
+
+ Return the number of seconds, as an int from 0 through 86399.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyDateTime_DELTA_GET_MICROSECOND(PyDateTime_Delta *o)
+
+ Return the number of microseconds, as an int from 0 through 999999.
+
+ .. versionadded:: 3.3
+
+
Macros for the convenience of modules implementing the DB API:
.. c:function:: PyObject* PyDateTime_FromTimestamp(PyObject *args)
diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst
index 6df84e0..6bacc32 100644
--- a/Doc/c-api/dict.rst
+++ b/Doc/c-api/dict.rst
@@ -36,11 +36,11 @@ Dictionary Objects
Return a new empty dictionary, or *NULL* on failure.
-.. c:function:: PyObject* PyDictProxy_New(PyObject *dict)
+.. c:function:: PyObject* PyDictProxy_New(PyObject *mapping)
- Return a proxy object for a mapping which enforces read-only behavior.
- This is normally used to create a proxy to prevent modification of the
- dictionary for non-dynamic class types.
+ Return a :class:`types.MappingProxyType` object for a mapping which
+ enforces read-only behavior. This is normally used to create a view to
+ prevent modification of the dictionary for non-dynamic class types.
.. c:function:: void PyDict_Clear(PyObject *p)
@@ -209,3 +209,10 @@ Dictionary Objects
for key, value in seq2:
if override or key not in a:
a[key] = value
+
+
+.. c:function:: int PyDict_ClearFreeList()
+
+ Clear the free list. Return the total number of freed items.
+
+ .. versionadded:: 3.3
diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
index 6f13c80..9a66b7f 100644
--- a/Doc/c-api/exceptions.rst
+++ b/Doc/c-api/exceptions.rst
@@ -129,6 +129,41 @@ in various ways. There is a separate error indicator for each thread.
exception state.
+.. c:function:: void PyErr_GetExcInfo(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
+
+ Retrieve the exception info, as known from ``sys.exc_info()``. This refers
+ to an exception that was already caught, not to an exception that was
+ freshly raised. Returns new references for the three objects, any of which
+ may be *NULL*. Does not modify the exception info state.
+
+ .. note::
+
+ This function is not normally used by code that wants to handle exceptions.
+ Rather, it can be used when code needs to save and restore the exception
+ state temporarily. Use :c:func:`PyErr_SetExcInfo` to restore or clear the
+ exception state.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: void PyErr_SetExcInfo(PyObject *type, PyObject *value, PyObject *traceback)
+
+ Set the exception info, as known from ``sys.exc_info()``. This refers
+ to an exception that was already caught, not to an exception that was
+ freshly raised. This function steals the references of the arguments.
+ To clear the exception state, pass *NULL* for all three arguments.
+ For general rules about the three arguments, see :c:func:`PyErr_Restore`.
+
+ .. note::
+
+ This function is not normally used by code that wants to handle exceptions.
+ Rather, it can be used when code needs to save and restore the exception
+ state temporarily. Use :c:func:`PyErr_GetExcInfo` to read the exception
+ state.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: void PyErr_SetString(PyObject *type, const char *message)
This is the most common way to set the error indicator. The first argument
@@ -230,6 +265,16 @@ in various ways. There is a separate error indicator for each thread.
parameter specifying the exception type to be raised. Availability: Windows.
+.. c:function:: PyObject* PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
+
+ This is a convenience function to raise :exc:`ImportError`. *msg* will be
+ set as the exception's message string. *name* and *path*, both of which can
+ be ``NULL``, will be set as the :exc:`ImportError`'s respective ``name``
+ and ``path`` attributes.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: void PyErr_SyntaxLocationEx(char *filename, int lineno, int col_offset)
Set file, line, and offset information for the current exception. If the
@@ -238,7 +283,7 @@ in various ways. There is a separate error indicator for each thread.
is a :exc:`SyntaxError`. *filename* is decoded from the filesystem encoding
(:func:`sys.getfilesystemencoding`).
-.. versionadded:: 3.2
+ .. versionadded:: 3.2
.. c:function:: void PyErr_SyntaxLocation(char *filename, int lineno)
@@ -311,6 +356,7 @@ in various ways. There is a separate error indicator for each thread.
.. versionadded:: 3.2
+
.. c:function:: int PyErr_CheckSignals()
.. index::
@@ -421,17 +467,18 @@ Exception Objects
.. c:function:: PyObject* PyException_GetCause(PyObject *ex)
- Return the cause (another exception instance set by ``raise ... from ...``)
- associated with the exception as a new reference, as accessible from Python
- through :attr:`__cause__`. If there is no cause associated, this returns
- *NULL*.
+ Return the cause (either an exception instance, or :const:`None`,
+ set by ``raise ... from ...``) associated with the exception as a new
+ reference, as accessible from Python through :attr:`__cause__`.
.. c:function:: void PyException_SetCause(PyObject *ex, PyObject *ctx)
Set the cause associated with the exception to *ctx*. Use *NULL* to clear
- it. There is no type check to make sure that *ctx* is an exception instance.
- This steals a reference to *ctx*.
+ it. There is no type check to make sure that *ctx* is either an exception
+ instance or :const:`None`. This steals a reference to *ctx*.
+
+ :attr:`__suppress_context__` is implicitly set to ``True`` by this function.
.. _unicodeexceptions:
@@ -525,7 +572,7 @@ recursion depth automatically).
Marks a point where a recursive C-level call is about to be performed.
- If :const:`USE_STACKCHECK` is defined, this function checks if the the OS
+ If :const:`USE_STACKCHECK` is defined, this function checks if the OS
stack overflowed using :c:func:`PyOS_CheckStack`. In this is the case, it
sets a :exc:`MemoryError` and returns a nonzero value.
@@ -582,65 +629,116 @@ All standard Python exceptions are available as global variables whose names are
:c:type:`PyObject\*`; they are all class objects. For completeness, here are all
the variables:
-+-------------------------------------+----------------------------+----------+
-| C Name | Python Name | Notes |
-+=====================================+============================+==========+
-| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_EOFError` | :exc:`EOFError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_EnvironmentError` | :exc:`EnvironmentError` | \(1) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_IOError` | :exc:`IOError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_ImportError` | :exc:`ImportError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_IndexError` | :exc:`IndexError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_KeyError` | :exc:`KeyError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_NameError` | :exc:`NameError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_OSError` | :exc:`OSError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_SystemError` | :exc:`SystemError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_TypeError` | :exc:`TypeError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_ValueError` | :exc:`ValueError` | |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_WindowsError` | :exc:`WindowsError` | \(3) |
-+-------------------------------------+----------------------------+----------+
-| :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | |
-+-------------------------------------+----------------------------+----------+
++-----------------------------------------+---------------------------------+----------+
+| C Name | Python Name | Notes |
++=========================================+=================================+==========+
+| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_BlockingIOError` | :exc:`BlockingIOError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_BrokenPipeError` | :exc:`BrokenPipeError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ConnectionAbortedError` | :exc:`ConnectionAbortedError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ConnectionRefusedError` | :exc:`ConnectionRefusedError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ConnectionResetError` | :exc:`ConnectionResetError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_FileExistsError` | :exc:`FileExistsError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_FileNotFoundError` | :exc:`FileNotFoundError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_EOFError` | :exc:`EOFError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ImportError` | :exc:`ImportError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_IndexError` | :exc:`IndexError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_InterruptedError` | :exc:`InterruptedError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_IsADirectoryError` | :exc:`IsADirectoryError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_KeyError` | :exc:`KeyError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_NameError` | :exc:`NameError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_NotADirectoryError` | :exc:`NotADirectoryError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_PermissionError` | :exc:`PermissionError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ProcessLookupError` | :exc:`ProcessLookupError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_SystemError` | :exc:`SystemError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_TypeError` | :exc:`TypeError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ValueError` | :exc:`ValueError` | |
++-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | |
++-----------------------------------------+---------------------------------+----------+
+
+.. versionadded:: 3.3
+ :c:data:`PyExc_BlockingIOError`, :c:data:`PyExc_BrokenPipeError`,
+ :c:data:`PyExc_ChildProcessError`, :c:data:`PyExc_ConnectionError`,
+ :c:data:`PyExc_ConnectionAbortedError`, :c:data:`PyExc_ConnectionRefusedError`,
+ :c:data:`PyExc_ConnectionResetError`, :c:data:`PyExc_FileExistsError`,
+ :c:data:`PyExc_FileNotFoundError`, :c:data:`PyExc_InterruptedError`,
+ :c:data:`PyExc_IsADirectoryError`, :c:data:`PyExc_NotADirectoryError`,
+ :c:data:`PyExc_PermissionError`, :c:data:`PyExc_ProcessLookupError`
+ and :c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`.
+
+
+These are compatibility aliases to :c:data:`PyExc_OSError`:
+
++-------------------------------------+----------+
+| C Name | Notes |
++=====================================+==========+
+| :c:data:`PyExc_EnvironmentError` | |
++-------------------------------------+----------+
+| :c:data:`PyExc_IOError` | |
++-------------------------------------+----------+
+| :c:data:`PyExc_WindowsError` | \(3) |
++-------------------------------------+----------+
+
+.. versionchanged:: 3.3
+ These aliases used to be separate exception types.
+
.. index::
single: PyExc_BaseException
@@ -649,28 +747,42 @@ the variables:
single: PyExc_LookupError
single: PyExc_AssertionError
single: PyExc_AttributeError
+ single: PyExc_BlockingIOError
+ single: PyExc_BrokenPipeError
+ single: PyExc_ConnectionError
+ single: PyExc_ConnectionAbortedError
+ single: PyExc_ConnectionRefusedError
+ single: PyExc_ConnectionResetError
single: PyExc_EOFError
- single: PyExc_EnvironmentError
+ single: PyExc_FileExistsError
+ single: PyExc_FileNotFoundError
single: PyExc_FloatingPointError
- single: PyExc_IOError
single: PyExc_ImportError
single: PyExc_IndexError
+ single: PyExc_InterruptedError
+ single: PyExc_IsADirectoryError
single: PyExc_KeyError
single: PyExc_KeyboardInterrupt
single: PyExc_MemoryError
single: PyExc_NameError
+ single: PyExc_NotADirectoryError
single: PyExc_NotImplementedError
single: PyExc_OSError
single: PyExc_OverflowError
+ single: PyExc_PermissionError
+ single: PyExc_ProcessLookupError
single: PyExc_ReferenceError
single: PyExc_RuntimeError
single: PyExc_SyntaxError
single: PyExc_SystemError
single: PyExc_SystemExit
+ single: PyExc_TimeoutError
single: PyExc_TypeError
single: PyExc_ValueError
- single: PyExc_WindowsError
single: PyExc_ZeroDivisionError
+ single: PyExc_EnvironmentError
+ single: PyExc_IOError
+ single: PyExc_WindowsError
Notes:
diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst
index 31805fd..ad98322 100644
--- a/Doc/c-api/function.rst
+++ b/Doc/c-api/function.rst
@@ -38,6 +38,16 @@ There are a few functions specific to Python functions.
object, the argument defaults and closure are set to *NULL*.
+.. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
+
+ As :c:func:`PyFunction_New`, but also allows to set the function object's
+ ``__qualname__`` attribute. *qualname* should be a unicode object or NULL;
+ if NULL, the ``__qualname__`` attribute is set to the same value as its
+ ``__name__`` attribute.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: PyObject* PyFunction_GetCode(PyObject *op)
Return the code object associated with the function object *op*.
diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst
index cf48363..270152e 100644
--- a/Doc/c-api/import.rst
+++ b/Doc/c-api/import.rst
@@ -30,13 +30,13 @@ Importing Modules
.. c:function:: PyObject* PyImport_ImportModuleNoBlock(const char *name)
- This version of :c:func:`PyImport_ImportModule` does not block. It's intended
- to be used in C functions that import other modules to execute a function.
- The import may block if another thread holds the import lock. The function
- :c:func:`PyImport_ImportModuleNoBlock` never blocks. It first tries to fetch
- the module from sys.modules and falls back to :c:func:`PyImport_ImportModule`
- unless the lock is held, in which case the function will raise an
- :exc:`ImportError`.
+ This function is a deprecated alias of :c:func:`PyImport_ImportModule`.
+
+ .. versionchanged:: 3.3
+ This function used to fail immediately when the import lock was held
+ by another thread. In Python 3.3 though, the locking scheme switched
+ to per-module locks for most purposes, so this function's special
+ behaviour isn't needed anymore.
.. c:function:: PyObject* PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
@@ -44,8 +44,7 @@ Importing Modules
.. index:: builtin: __import__
Import a module. This is best described by referring to the built-in Python
- function :func:`__import__`, as the standard :func:`__import__` function calls
- this function directly.
+ function :func:`__import__`.
The return value is a new reference to the imported module or top-level
package, or *NULL* with an exception set on failure. Like for
@@ -57,7 +56,7 @@ Importing Modules
:c:func:`PyImport_ImportModule`.
-.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
+.. c:function:: PyObject* PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
Import a module. This is best described by referring to the built-in Python
function :func:`__import__`, as the standard :func:`__import__` function calls
@@ -68,6 +67,16 @@ Importing Modules
the return value when a submodule of a package was requested is normally the
top-level package, unless a non-empty *fromlist* was given.
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
+
+ Similar to :c:func:`PyImport_ImportModuleLevelObject`, but the name is an
+ UTF-8 encoded string instead of a Unicode object.
+
+ .. versionchanged:: 3.3
+ Negative values for *level* are no longer accepted.
.. c:function:: PyObject* PyImport_Import(PyObject *name)
@@ -86,7 +95,7 @@ Importing Modules
an exception set on failure (the module still exists in this case).
-.. c:function:: PyObject* PyImport_AddModule(const char *name)
+.. c:function:: PyObject* PyImport_AddModuleObject(PyObject *name)
Return the module object corresponding to a module name. The *name* argument
may be of the form ``package.module``. First check the modules dictionary if
@@ -100,6 +109,14 @@ Importing Modules
or one of its variants to import a module. Package structures implied by a
dotted name for *name* are not created if not already present.
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyImport_AddModule(const char *name)
+
+ Similar to :c:func:`PyImport_AddModuleObject`, but the name is a UTF-8
+ encoded string instead of a Unicode object.
+
.. c:function:: PyObject* PyImport_ExecCodeModule(char *name, PyObject *co)
@@ -136,25 +153,43 @@ Importing Modules
See also :c:func:`PyImport_ExecCodeModuleWithPathnames`.
-.. c:function:: PyObject* PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, char *cpathname)
+.. c:function:: PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`__cached__`
attribute of the module object is set to *cpathname* if it is
non-``NULL``. Of the three functions, this is the preferred one to use.
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, char *cpathname)
+
+ Like :c:func:`PyImport_ExecCodeModuleObject`, but *name*, *pathname* and
+ *cpathname* are UTF-8 encoded strings. Attempts are also made to figure out
+ what the value for *pathname* should be from *cpathname* if the former is
+ set to ``NULL``.
+
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Uses :func:`imp.source_from_cache()` in calculating the source path if
+ only the bytecode path is provided.
+
.. c:function:: long PyImport_GetMagicNumber()
Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` and
:file:`.pyo` files). The magic number should be present in the first four bytes
- of the bytecode file, in little-endian byte order.
+ of the bytecode file, in little-endian byte order. Returns -1 on error.
+
+ .. versionchanged:: 3.3
+ Return value of -1 upon failure.
.. c:function:: const char * PyImport_GetMagicTag()
Return the magic tag string for :pep:`3147` format Python bytecode file
- names.
+ names. Keep in mind that the value at ``sys.implementation.cache_tag`` is
+ authoritative and should be used instead of this function.
.. versionadded:: 3.2
@@ -200,7 +235,7 @@ Importing Modules
For internal use only.
-.. c:function:: int PyImport_ImportFrozenModule(char *name)
+.. c:function:: int PyImport_ImportFrozenModuleObject(PyObject *name)
Load a frozen module named *name*. Return ``1`` for success, ``0`` if the
module is not found, and ``-1`` with an exception set if the initialization
@@ -208,6 +243,14 @@ Importing Modules
:c:func:`PyImport_ImportModule`. (Note the misnomer --- this function would
reload the module if it was already imported.)
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyImport_ImportFrozenModule(char *name)
+
+ Similar to :c:func:`PyImport_ImportFrozenModuleObject`, but the name is a
+ UTF-8 encoded string instead of a Unicode object.
+
.. c:type:: struct _frozen
@@ -247,13 +290,13 @@ Importing Modules
Structure describing a single entry in the list of built-in modules. Each of
these structures gives the name and initialization function for a module built
- into the interpreter. Programs which embed Python may use an array of these
- structures in conjunction with :c:func:`PyImport_ExtendInittab` to provide
- additional built-in modules. The structure is defined in
- :file:`Include/import.h` as::
+ into the interpreter. The name is an ASCII encoded string. Programs which
+ embed Python may use an array of these structures in conjunction with
+ :c:func:`PyImport_ExtendInittab` to provide additional built-in modules.
+ The structure is defined in :file:`Include/import.h` as::
struct _inittab {
- char *name;
+ char *name; /* ASCII encoded string */
PyObject* (*initfunc)(void);
};
diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst
index 2ce7b98..7b73e5b 100644
--- a/Doc/c-api/index.rst
+++ b/Doc/c-api/index.rst
@@ -22,3 +22,4 @@ document the API functions in detail.
init.rst
memory.rst
objimpl.rst
+ stable.rst
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index 7507e3b..95ff4ee 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -646,7 +646,7 @@ with sub-interpreters:
:c:func:`PyGILState_Release` on the same thread.
-.. c:function:: PyThreadState PyGILState_GetThisThreadState()
+.. c:function:: PyThreadState* PyGILState_GetThisThreadState()
Get the current thread state for this thread. May return ``NULL`` if no
GILState API has been used on the current thread. Note that the main thread
diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst
index feb9015..5b263a7 100644
--- a/Doc/c-api/list.rst
+++ b/Doc/c-api/list.rst
@@ -142,3 +142,10 @@ List Objects
Return a new tuple object containing the contents of *list*; equivalent to
``tuple(list)``.
+
+
+.. c:function:: int PyList_ClearFreeList()
+
+ Clear the free list. Return the total number of freed items.
+
+ .. versionadded:: 3.3
diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst
index e2f58ad..365abd7 100644
--- a/Doc/c-api/long.rst
+++ b/Doc/c-api/long.rst
@@ -100,6 +100,20 @@ All integers are implemented as "long" integer objects of arbitrary size.
string is first encoded to a byte string using :c:func:`PyUnicode_EncodeDecimal`
and then converted using :c:func:`PyLong_FromString`.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyLong_FromUnicodeObject`.
+
+
+.. c:function:: PyObject* PyLong_FromUnicodeObject(PyObject *u, int base)
+
+ Convert a sequence of Unicode digits in the string *u* to a Python integer
+ value. The Unicode string is first encoded to a byte string using
+ :c:func:`PyUnicode_EncodeDecimal` and then converted using
+ :c:func:`PyLong_FromString`.
+
+ .. versionadded:: 3.3
+
.. c:function:: PyObject* PyLong_FromVoidPtr(void *p)
diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst
index 6b49cdf..5e50977 100644
--- a/Doc/c-api/memoryview.rst
+++ b/Doc/c-api/memoryview.rst
@@ -17,16 +17,21 @@ any other object.
Create a memoryview object from an object that provides the buffer interface.
If *obj* supports writable buffer exports, the memoryview object will be
- readable and writable, otherwise it will be read-only.
+ read/write, otherwise it may be either read-only or read/write at the
+ discretion of the exporter.
+.. c:function:: PyObject *PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
+
+ Create a memoryview object using *mem* as the underlying buffer.
+ *flags* can be one of :c:macro:`PyBUF_READ` or :c:macro:`PyBUF_WRITE`.
+
+ .. versionadded:: 3.3
.. c:function:: PyObject *PyMemoryView_FromBuffer(Py_buffer *view)
Create a memoryview object wrapping the given buffer structure *view*.
- The memoryview object then owns the buffer represented by *view*, which
- means you shouldn't try to call :c:func:`PyBuffer_Release` yourself: it
- will be done on deallocation of the memoryview object.
-
+ For simple byte buffers, :c:func:`PyMemoryView_FromMemory` is the preferred
+ function.
.. c:function:: PyObject *PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char order)
@@ -43,10 +48,16 @@ any other object.
currently allowed to create subclasses of :class:`memoryview`.
-.. c:function:: Py_buffer *PyMemoryView_GET_BUFFER(PyObject *obj)
+.. c:function:: Py_buffer *PyMemoryView_GET_BUFFER(PyObject *mview)
+
+ Return a pointer to the memoryview's private copy of the exporter's buffer.
+ *mview* **must** be a memoryview instance; this macro doesn't check its type,
+ you must do it yourself or you will risk crashes.
+
+.. c:function:: Py_buffer *PyMemoryView_GET_BASE(PyObject *mview)
- Return a pointer to the buffer structure wrapped by the given
- memoryview object. The object **must** be a memoryview instance;
- this macro doesn't check its type, you must do it yourself or you
- will risk crashes.
+ Return either a pointer to the exporting object that the memoryview is based
+ on or *NULL* if the memoryview has been created by one of the functions
+ :c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`.
+ *mview* **must** be a memoryview instance.
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst
index ffd68e3..3be7fe3 100644
--- a/Doc/c-api/module.rst
+++ b/Doc/c-api/module.rst
@@ -29,7 +29,7 @@ There are only a few functions special to module objects.
:c:data:`PyModule_Type`.
-.. c:function:: PyObject* PyModule_New(const char *name)
+.. c:function:: PyObject* PyModule_NewObject(PyObject *name)
.. index::
single: __name__ (module attribute)
@@ -40,6 +40,14 @@ There are only a few functions special to module objects.
Only the module's :attr:`__doc__` and :attr:`__name__` attributes are filled in;
the caller is responsible for providing a :attr:`__file__` attribute.
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyModule_New(const char *name)
+
+ Similar to :c:func:`PyImport_NewObject`, but the name is an UTF-8 encoded
+ string instead of a Unicode object.
+
.. c:function:: PyObject* PyModule_GetDict(PyObject *module)
@@ -52,7 +60,7 @@ There are only a few functions special to module objects.
manipulate a module's :attr:`__dict__`.
-.. c:function:: char* PyModule_GetName(PyObject *module)
+.. c:function:: PyObject* PyModule_GetNameObject(PyObject *module)
.. index::
single: __name__ (module attribute)
@@ -61,15 +69,13 @@ There are only a few functions special to module objects.
Return *module*'s :attr:`__name__` value. If the module does not provide one,
or if it is not a string, :exc:`SystemError` is raised and *NULL* is returned.
+ .. versionadded:: 3.3
-.. c:function:: char* PyModule_GetFilename(PyObject *module)
- Similar to :c:func:`PyModule_GetFilenameObject` but return the filename
- encoded to 'utf-8'.
+.. c:function:: char* PyModule_GetName(PyObject *module)
- .. deprecated:: 3.2
- :c:func:`PyModule_GetFilename` raises :c:type:`UnicodeEncodeError` on
- unencodable filenames, use :c:func:`PyModule_GetFilenameObject` instead.
+ Similar to :c:func:`PyModule_GetNameObject` but return the name encoded to
+ ``'utf-8'``.
.. c:function:: PyObject* PyModule_GetFilenameObject(PyObject *module)
@@ -81,11 +87,21 @@ There are only a few functions special to module objects.
Return the name of the file from which *module* was loaded using *module*'s
:attr:`__file__` attribute. If this is not defined, or if it is not a
unicode string, raise :exc:`SystemError` and return *NULL*; otherwise return
- a reference to a :c:type:`PyUnicodeObject`.
+ a reference to a Unicode object.
.. versionadded:: 3.2
+.. c:function:: char* PyModule_GetFilename(PyObject *module)
+
+ Similar to :c:func:`PyModule_GetFilenameObject` but return the filename
+ encoded to 'utf-8'.
+
+ .. deprecated:: 3.2
+ :c:func:`PyModule_GetFilename` raises :c:type:`UnicodeEncodeError` on
+ unencodable filenames, use :c:func:`PyModule_GetFilenameObject` instead.
+
+
.. c:function:: void* PyModule_GetState(PyObject *module)
Return the "state" of the module, that is, a pointer to the block of memory
@@ -97,8 +113,28 @@ There are only a few functions special to module objects.
Return a pointer to the :c:type:`PyModuleDef` struct from which the module was
created, or *NULL* if the module wasn't created with
- :c:func:`PyModule_Create`.
+ :c:func:`PyModule_Create`.i
+
+.. c:function:: PyObject* PyState_FindModule(PyModuleDef *def)
+
+ Returns the module object that was created from *def* for the current interpreter.
+ This method requires that the module object has been attached to the interpreter state with
+ :c:func:`PyState_AddModule` beforehand. In case the corresponding module object is not
+ found or has not been attached to the interpreter state yet, it returns NULL.
+
+.. c:function:: int PyState_AddModule(PyModuleDef *def, PyObject *module)
+
+ Attaches the module object passed to the function to the interpreter state. This allows
+ the module object to be accessible via
+ :c:func:`PyState_FindModule`.
+
+ .. versionadded:: 3.3
+
+.. c:function:: int PyState_RemoveModule(PyModuleDef *def, PyObject *module)
+
+ Removes the module object created from *def* from the interpreter state.
+ .. versionadded:: 3.3
Initializing C modules
^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst
index d0d45ad..d895547 100644
--- a/Doc/c-api/object.rst
+++ b/Doc/c-api/object.rst
@@ -6,6 +6,19 @@ Object Protocol
===============
+.. c:var:: PyObject* Py_NotImplemented
+
+ The ``NotImplemented`` singleton, used to signal that an operation is
+ not implemented for the given type combination.
+
+
+.. c:macro:: Py_RETURN_NOTIMPLEMENTED
+
+ Properly handle returning :c:data:`Py_NotImplemented` from within a C
+ function (that is, increment the reference count of NotImplemented and
+ return it).
+
+
.. c:function:: int PyObject_Print(PyObject *o, FILE *fp, int flags)
Print an object *o*, on file *fp*. Returns ``-1`` on error. The flags argument
@@ -88,6 +101,22 @@ Object Protocol
This is the equivalent of the Python statement ``del o.attr_name``.
+.. c:function:: PyObject* PyType_GenericGetDict(PyObject *o, void *context)
+
+ A generic implementation for the getter of a ``__dict__`` descriptor. It
+ creates the dictionary if necessary.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyType_GenericSetDict(PyObject *o, void *context)
+
+ A generic implementation for the setter of a ``__dict__`` descriptor. This
+ implementation does not allow the dictionary to be deleted.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: PyObject* PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)
Compare the values of *o1* and *o2* using the operation specified by *opid*,
diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst
index 66b47c4..5f0ef90 100644
--- a/Doc/c-api/set.rst
+++ b/Doc/c-api/set.rst
@@ -157,3 +157,10 @@ subtypes but not for instances of :class:`frozenset` or its subtypes.
.. c:function:: int PySet_Clear(PyObject *set)
Empty an existing set of all elements.
+
+
+.. c:function:: int PySet_ClearFreeList()
+
+ Clear the free list. Return the total number of freed items.
+
+ .. versionadded:: 3.3
diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst
new file mode 100644
index 0000000..2688c1c
--- /dev/null
+++ b/Doc/c-api/stable.rst
@@ -0,0 +1,39 @@
+.. highlightlang:: c
+
+.. _stable:
+
+**********************************
+Stable Appliction Binary Interface
+**********************************
+
+Traditionally, the C API of Python will change with every release.
+Most changes will be source-compatible, typically by only adding API,
+rather than changing existing API or removing API (although some
+interfaces do get removed after being deprecated first).
+
+Unfortunately, the API compatibility does not extend to binary
+compatibility (the ABI). The reason is primarily the evolution of
+struct definitions, where addition of a new field, or changing
+the type of a field, might not break the API, but can break the ABI.
+As a consequence, extension modules need to be recompiled for
+every Python release (although an exception is possible on Unix
+when none of the affected interfaces are used). In addition, on
+Windows, extension modules link with a specific pythonXY.dll and
+need to be recompiled to link with a newer one.
+
+Since Python 3.2, a subset of the API has been declared to guarantee
+a stable ABI. Extension modules wishing to use this API need to define
+Py_LIMITED_API. A number of interpreter details then become hidden
+from the extension module; in return, a module is built that works
+on any 3.x version (x>=2) without recompilation. In some cases, the
+stable ABI needs to be extended with new functions. Extensions modules
+wishing to use these new APIs need to set Py_LIMITED_API to the
+PY_VERSION_HEX value of the minimum Python version they want to
+support (e.g. 0x03030000 for Python 3.3). Such modules will work
+on all subsequent Python releases, but fail to load (because of
+missing symbols) on the older releases.
+
+As of Python 3.2, the set of functions available to the limited API
+is documented in PEP 384.
+
+.. XXX copy exact list here? Into each functions definition?
diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst
index b3386ea..44c731a 100644
--- a/Doc/c-api/type.rst
+++ b/Doc/c-api/type.rst
@@ -51,13 +51,13 @@ Type Objects
modification of the attributes or base classes of the type.
-.. c:function:: int PyType_HasFeature(PyObject *o, int feature)
+.. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature)
Return true if the type object *o* sets the feature *feature*. Type features
are denoted by single bit flags.
-.. c:function:: int PyType_IS_GC(PyObject *o)
+.. c:function:: int PyType_IS_GC(PyTypeObject *o)
Return true if the type object includes support for the cycle detector; this
tests the type flag :const:`Py_TPFLAGS_HAVE_GC`.
@@ -70,13 +70,14 @@ Type Objects
.. c:function:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
- XXX: Document.
-
+ Generic handler for the :attr:`tp_alloc` slot of a type object. Use
+ Python's default memory allocation mechanism to allocate a new instance and
+ initialize all its contents to *NULL*.
.. c:function:: PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
- XXX: Document.
-
+ Generic handler for the :attr:`tp_new` slot of a type object. Create a
+ new instance using the type's :attr:`tp_alloc` slot.
.. c:function:: int PyType_Ready(PyTypeObject *type)
@@ -84,3 +85,15 @@ Type Objects
their initialization. This function is responsible for adding inherited slots
from a type's base class. Return ``0`` on success, or return ``-1`` and sets an
exception on error.
+
+.. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec)
+
+ Creates and returns a heap type object from the *spec* passed to the function.
+
+.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
+
+ Creates and returns a heap type object from the *spec*. In addition to that,
+ the created heap type contains all types contained by the *bases* tuple as base
+ types. This allows the caller to reference other heap types as base types.
+
+ .. versionadded:: 3.3
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index 68ca9ad..ea1a0ad 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -1198,46 +1198,88 @@ Buffer Object Structures
.. sectionauthor:: Greg J. Stein <greg@lyra.org>
.. sectionauthor:: Benjamin Peterson
+.. sectionauthor:: Stefan Krah
+.. c:type:: PyBufferProcs
-The :ref:`buffer interface <bufferobjects>` exports a model where an object can expose its internal
-data.
+ This structure holds pointers to the functions required by the
+ :ref:`Buffer protocol <bufferobjects>`. The protocol defines how
+ an exporter object can expose its internal data to consumer objects.
-If an object does not export the buffer interface, then its :attr:`tp_as_buffer`
-member in the :c:type:`PyTypeObject` structure should be *NULL*. Otherwise, the
-:attr:`tp_as_buffer` will point to a :c:type:`PyBufferProcs` structure.
+.. c:member:: getbufferproc PyBufferProcs.bf_getbuffer
+ The signature of this function is::
-.. c:type:: PyBufferProcs
+ int (PyObject *exporter, Py_buffer *view, int flags);
+
+ Handle a request to *exporter* to fill in *view* as specified by *flags*.
+ Except for point (3), an implementation of this function MUST take these
+ steps:
+
+ (1) Check if the request can be met. If not, raise :c:data:`PyExc_BufferError`,
+ set :c:data:`view->obj` to *NULL* and return -1.
+
+ (2) Fill in the requested fields.
+
+ (3) Increment an internal counter for the number of exports.
+
+ (4) Set :c:data:`view->obj` to *exporter* and increment :c:data:`view->obj`.
+
+ (5) Return 0.
+
+ If *exporter* is part of a chain or tree of buffer providers, two main
+ schemes can be used:
+
+ * Re-export: Each member of the tree acts as the exporting object and
+ sets :c:data:`view->obj` to a new reference to itself.
+
+ * Redirect: The buffer request is redirected to the root object of the
+ tree. Here, :c:data:`view->obj` will be a new reference to the root
+ object.
+
+ The individual fields of *view* are described in section
+ :ref:`Buffer structure <buffer-structure>`, the rules how an exporter
+ must react to specific requests are in section
+ :ref:`Buffer request types <buffer-request-types>`.
+
+ All memory pointed to in the :c:type:`Py_buffer` structure belongs to
+ the exporter and must remain valid until there are no consumers left.
+ :c:member:`~Py_buffer.format`, :c:member:`~Py_buffer.shape`,
+ :c:member:`~Py_buffer.strides`, :c:member:`~Py_buffer.suboffsets`
+ and :c:member:`~Py_buffer.internal`
+ are read-only for the consumer.
+
+ :c:func:`PyBuffer_FillInfo` provides an easy way of exposing a simple
+ bytes buffer while dealing correctly with all request types.
+
+ :c:func:`PyObject_GetBuffer` is the interface for the consumer that
+ wraps this function.
+
+.. c:member:: releasebufferproc PyBufferProcs.bf_releasebuffer
+
+ The signature of this function is::
+
+ void (PyObject *exporter, Py_buffer *view);
- Structure used to hold the function pointers which define an implementation of
- the buffer protocol.
+ Handle a request to release the resources of the buffer. If no resources
+ need to be released, :c:member:`PyBufferProcs.bf_releasebuffer` may be
+ *NULL*. Otherwise, a standard implementation of this function will take
+ these optional steps:
- .. c:member:: getbufferproc bf_getbuffer
+ (1) Decrement an internal counter for the number of exports.
- This should fill a :c:type:`Py_buffer` with the necessary data for
- exporting the type. The signature of :data:`getbufferproc` is ``int
- (PyObject *obj, Py_buffer *view, int flags)``. *obj* is the object to
- export, *view* is the :c:type:`Py_buffer` struct to fill, and *flags* gives
- the conditions the caller wants the memory under. (See
- :c:func:`PyObject_GetBuffer` for all flags.) :c:member:`bf_getbuffer` is
- responsible for filling *view* with the appropriate information.
- (:c:func:`PyBuffer_FillView` can be used in simple cases.) See
- :c:type:`Py_buffer`\s docs for what needs to be filled in.
+ (2) If the counter is 0, free all memory associated with *view*.
+ The exporter MUST use the :c:member:`~Py_buffer.internal` field to keep
+ track of buffer-specific resources. This field is guaranteed to remain
+ constant, while a consumer MAY pass a copy of the original buffer as the
+ *view* argument.
- .. c:member:: releasebufferproc bf_releasebuffer
- This should release the resources of the buffer. The signature of
- :c:data:`releasebufferproc` is ``void (PyObject *obj, Py_buffer *view)``.
- If the :c:data:`bf_releasebuffer` function is not provided (i.e. it is
- *NULL*), then it does not ever need to be called.
+ This function MUST NOT decrement :c:data:`view->obj`, since that is
+ done automatically in :c:func:`PyBuffer_Release` (this scheme is
+ useful for breaking reference cycles).
- The exporter of the buffer interface must make sure that any memory
- pointed to in the :c:type:`Py_buffer` structure remains valid until
- releasebuffer is called. Exporters will need to define a
- :c:data:`bf_releasebuffer` function if they can re-allocate their memory,
- strides, shape, suboffsets, or format variables which they might share
- through the struct bufferinfo.
- See :c:func:`PyBuffer_Release`.
+ :c:func:`PyBuffer_Release` is the interface for the consumer that
+ wraps this function.
diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst
index d1b57d9..2ac51df 100644
--- a/Doc/c-api/unicode.rst
+++ b/Doc/c-api/unicode.rst
@@ -6,38 +6,72 @@ Unicode Objects and Codecs
--------------------------
.. sectionauthor:: Marc-André Lemburg <mal@lemburg.com>
+.. sectionauthor:: Georg Brandl <georg@python.org>
Unicode Objects
^^^^^^^^^^^^^^^
+Since the implementation of :pep:`393` in Python 3.3, Unicode objects internally
+use a variety of representations, in order to allow handling the complete range
+of Unicode characters while staying memory efficient. There are special cases
+for strings where all code points are below 128, 256, or 65536; otherwise, code
+points must be below 1114112 (which is the full Unicode range).
+
+:c:type:`Py_UNICODE*` and UTF-8 representations are created on demand and cached
+in the Unicode object. The :c:type:`Py_UNICODE*` representation is deprecated
+and inefficient; it should be avoided in performance- or memory-sensitive
+situations.
+
+Due to the transition between the old APIs and the new APIs, unicode objects
+can internally be in two states depending on how they were created:
+
+* "canonical" unicode objects are all objects created by a non-deprecated
+ unicode API. They use the most efficient representation allowed by the
+ implementation.
+
+* "legacy" unicode objects have been created through one of the deprecated
+ APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the
+ :c:type:`Py_UNICODE*` representation; you will have to call
+ :c:func:`PyUnicode_READY` on them before calling any other API.
+
+
Unicode Type
""""""""""""
These are the basic Unicode object types used for the Unicode implementation in
Python:
+.. c:type:: Py_UCS4
+ Py_UCS2
+ Py_UCS1
+
+ These types are typedefs for unsigned integer types wide enough to contain
+ characters of 32 bits, 16 bits and 8 bits, respectively. When dealing with
+ single Unicode characters, use :c:type:`Py_UCS4`.
+
+ .. versionadded:: 3.3
+
.. c:type:: Py_UNICODE
- This type represents the storage type which is used by Python internally as
- basis for holding Unicode ordinals. Python's default builds use a 16-bit type
- for :c:type:`Py_UNICODE` and store Unicode values internally as UCS2. It is also
- possible to build a UCS4 version of Python (most recent Linux distributions come
- with UCS4 builds of Python). These builds then use a 32-bit type for
- :c:type:`Py_UNICODE` and store Unicode data internally as UCS4. On platforms
- where :c:type:`wchar_t` is available and compatible with the chosen Python
- Unicode build variant, :c:type:`Py_UNICODE` is a typedef alias for
- :c:type:`wchar_t` to enhance native platform compatibility. On all other
- platforms, :c:type:`Py_UNICODE` is a typedef alias for either :c:type:`unsigned
- short` (UCS2) or :c:type:`unsigned long` (UCS4).
+ This is a typedef of :c:type:`wchar_t`, which is a 16-bit type or 32-bit type
+ depending on the platform.
-Note that UCS2 and UCS4 Python builds are not binary compatible. Please keep
-this in mind when writing extensions or interfaces.
+ .. versionchanged:: 3.3
+ In previous versions, this was a 16-bit type or a 32-bit type depending on
+ whether you selected a "narrow" or "wide" Unicode version of Python at
+ build time.
-.. c:type:: PyUnicodeObject
+.. c:type:: PyASCIIObject
+ PyCompactUnicodeObject
+ PyUnicodeObject
- This subtype of :c:type:`PyObject` represents a Python Unicode object.
+ These subtypes of :c:type:`PyObject` represent a Python Unicode object. In
+ almost all cases, they shouldn't be used directly, since all API functions
+ that deal with Unicode objects take and return :c:type:`PyObject` pointers.
+
+ .. versionadded:: 3.3
.. c:var:: PyTypeObject PyUnicode_Type
@@ -45,10 +79,10 @@ this in mind when writing extensions or interfaces.
This instance of :c:type:`PyTypeObject` represents the Python Unicode type. It
is exposed to Python code as ``str``.
+
The following APIs are really C macros and can be used to do fast checks and to
access internal read-only data of Unicode objects:
-
.. c:function:: int PyUnicode_Check(PyObject *o)
Return true if the object *o* is a Unicode object or an instance of a Unicode
@@ -61,28 +95,106 @@ access internal read-only data of Unicode objects:
subtype.
-.. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o)
+.. c:function:: int PyUnicode_READY(PyObject *o)
- Return the size of the object. *o* has to be a :c:type:`PyUnicodeObject` (not
- checked).
+ Ensure the string object *o* is in the "canonical" representation. This is
+ required before using any of the access macros described below.
+ .. XXX expand on when it is not required
-.. c:function:: Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o)
+ Returns 0 on success and -1 with an exception set on failure, which in
+ particular happens if memory allocation fails.
- Return the size of the object's internal buffer in bytes. *o* has to be a
- :c:type:`PyUnicodeObject` (not checked).
+ .. versionadded:: 3.3
-.. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o)
+.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o)
+
+ Return the length of the Unicode string, in code points. *o* has to be a
+ Unicode object in the "canonical" representation (not checked).
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o)
+ Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o)
+ Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o)
+
+ Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4
+ integer types for direct character access. No checks are performed if the
+ canonical representation has the correct character size; use
+ :c:func:`PyUnicode_KIND` to select the right macro. Make sure
+ :c:func:`PyUnicode_READY` has been called before accessing this.
+
+ .. versionadded:: 3.3
+
+
+.. c:macro:: PyUnicode_WCHAR_KIND
+ PyUnicode_1BYTE_KIND
+ PyUnicode_2BYTE_KIND
+ PyUnicode_4BYTE_KIND
+
+ Return values of the :c:func:`PyUnicode_KIND` macro.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyUnicode_KIND(PyObject *o)
+
+ Return one of the PyUnicode kind constants (see above) that indicate how many
+ bytes per character this Unicode object uses to store its data. *o* has to
+ be a Unicode object in the "canonical" representation (not checked).
+
+ .. XXX document "0" return value?
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: void* PyUnicode_DATA(PyObject *o)
+
+ Return a void pointer to the raw unicode buffer. *o* has to be a Unicode
+ object in the "canonical" representation (not checked).
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \
+ Py_UCS4 value)
+
+ Write into a canonical representation *data* (as obtained with
+ :c:func:`PyUnicode_DATA`). This macro does not do any sanity checks and is
+ intended for usage in loops. The caller should cache the *kind* value and
+ *data* pointer as obtained from other macro calls. *index* is the index in
+ the string (starts at 0) and *value* is the new code point value which should
+ be written to that location.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index)
+
+ Read a code point from a canonical representation *data* (as obtained with
+ :c:func:`PyUnicode_DATA`). No checks or ready calls are performed.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index)
+
+ Read a character from a Unicode object *o*, which must be in the "canonical"
+ representation. This is less efficient than :c:func:`PyUnicode_READ` if you
+ do multiple consecutive reads.
+
+ .. versionadded:: 3.3
- Return a pointer to the internal :c:type:`Py_UNICODE` buffer of the object. *o*
- has to be a :c:type:`PyUnicodeObject` (not checked).
+.. c:function:: PyUnicode_MAX_CHAR_VALUE(PyObject *o)
-.. c:function:: const char* PyUnicode_AS_DATA(PyObject *o)
+ Return the maximum code point that is suitable for creating another string
+ based on *o*, which must be in the "canonical" representation. This is
+ always an approximation but more efficient than iterating over the string.
- Return a pointer to the internal buffer of the object. *o* has to be a
- :c:type:`PyUnicodeObject` (not checked).
+ .. versionadded:: 3.3
.. c:function:: int PyUnicode_ClearFreeList()
@@ -90,6 +202,46 @@ access internal read-only data of Unicode objects:
Clear the free list. Return the total number of freed items.
+.. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o)
+
+ Return the size of the deprecated :c:type:`Py_UNICODE` representation, in
+ code units (this includes surrogate pairs as 2 units). *o* has to be a
+ Unicode object (not checked).
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style Unicode API, please migrate to using
+ :c:func:`PyUnicode_GET_LENGTH`.
+
+
+.. c:function:: Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o)
+
+ Return the size of the deprecated :c:type:`Py_UNICODE` representation in
+ bytes. *o* has to be a Unicode object (not checked).
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style Unicode API, please migrate to using
+ :c:func:`PyUnicode_GET_LENGTH`.
+
+
+.. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o)
+ const char* PyUnicode_AS_DATA(PyObject *o)
+
+ Return a pointer to a :c:type:`Py_UNICODE` representation of the object. The
+ ``AS_DATA`` form casts the pointer to :c:type:`const char *`. *o* has to be
+ a Unicode object (not checked).
+
+ .. versionchanged:: 3.3
+ This macro is now inefficient -- because in many cases the
+ :c:type:`Py_UNICODE` representation does not exist and needs to be created
+ -- and can fail (return *NULL* with an exception set). Try to port the
+ code to use the new :c:func:`PyUnicode_nBYTE_DATA` macros or use
+ :c:func:`PyUnicode_WRITE` or :c:func:`PyUnicode_READ`.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style Unicode API, please migrate to using the
+ :c:func:`PyUnicode_nBYTE_DATA` family of macros.
+
+
Unicode Character Properties
""""""""""""""""""""""""""""
@@ -166,16 +318,25 @@ These APIs can be used for fast direct character conversions:
Return the character *ch* converted to lower case.
+ .. deprecated:: 3.3
+ This function uses simple case mappings.
+
.. c:function:: Py_UNICODE Py_UNICODE_TOUPPER(Py_UNICODE ch)
Return the character *ch* converted to upper case.
+ .. deprecated:: 3.3
+ This function uses simple case mappings.
+
.. c:function:: Py_UNICODE Py_UNICODE_TOTITLE(Py_UNICODE ch)
Return the character *ch* converted to title case.
+ .. deprecated:: 3.3
+ This function uses simple case mappings.
+
.. c:function:: int Py_UNICODE_TODECIMAL(Py_UNICODE ch)
@@ -195,31 +356,66 @@ These APIs can be used for fast direct character conversions:
possible. This macro does not raise exceptions.
-Plain Py_UNICODE
-""""""""""""""""
+These APIs can be used to work with surrogates:
+
+.. c:macro:: Py_UNICODE_IS_SURROGATE(ch)
+
+ Check if *ch* is a surrogate (``0xD800 <= ch <= 0xDFFF``).
+
+.. c:macro:: Py_UNICODE_IS_HIGH_SURROGATE(ch)
+
+ Check if *ch* is an high surrogate (``0xD800 <= ch <= 0xDBFF``).
+
+.. c:macro:: Py_UNICODE_IS_LOW_SURROGATE(ch)
+
+ Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``).
+
+.. c:macro:: Py_UNICODE_JOIN_SURROGATES(high, low)
+
+ Join two surrogate characters and return a single Py_UCS4 value.
+ *high* and *low* are respectively the leading and trailing surrogates in a
+ surrogate pair.
+
+
+Creating and accessing Unicode strings
+""""""""""""""""""""""""""""""""""""""
To create Unicode objects and access their basic sequence properties, use these
APIs:
+.. c:function:: PyObject* PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar)
-.. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
+ Create a new Unicode object. *maxchar* should be the true maximum code point
+ to be placed in the string. As an approximation, it can be rounded up to the
+ nearest value in the sequence 127, 255, 65535, 1114111.
- Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u*
- may be *NULL* which causes the contents to be undefined. It is the user's
- responsibility to fill in the needed data. The buffer is copied into the new
- object. If the buffer is not *NULL*, the return value might be a shared object.
- Therefore, modification of the resulting Unicode object is only allowed when *u*
- is *NULL*.
+ This is the recommended way to allocate a new Unicode object. Objects
+ created using this function are not resizable.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyUnicode_FromKindAndData(int kind, const void *buffer, \
+ Py_ssize_t size)
+
+ Create a new Unicode object with the given *kind* (possible values are
+ :c:macro:`PyUnicode_1BYTE_KIND` etc., as returned by
+ :c:func:`PyUnicode_KIND`). The *buffer* must point to an array of *size*
+ units of 1, 2 or 4 bytes per character, as given by the kind.
+
+ .. versionadded:: 3.3
.. c:function:: PyObject* PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
- Create a Unicode object from the char buffer *u*. The bytes will be interpreted
- as being UTF-8 encoded. *u* may also be *NULL* which
- causes the contents to be undefined. It is the user's responsibility to fill in
- the needed data. The buffer is copied into the new object. If the buffer is not
- *NULL*, the return value might be a shared object. Therefore, modification of
- the resulting Unicode object is only allowed when *u* is *NULL*.
+ Create a Unicode object from the char buffer *u*. The bytes will be
+ interpreted as being UTF-8 encoded. The buffer is copied into the new
+ object. If the buffer is not *NULL*, the return value might be a shared
+ object, i.e. modification of the data is not allowed.
+
+ If *u* is *NULL*, this function behaves like :c:func:`PyUnicode_FromUnicode`
+ with the buffer set to *NULL*. This usage is deprecated in favor of
+ :c:func:`PyUnicode_New`.
.. c:function:: PyObject *PyUnicode_FromString(const char *u)
@@ -260,18 +456,27 @@ APIs:
| :attr:`%ld` | long | Exactly equivalent to |
| | | ``printf("%ld")``. |
+-------------------+---------------------+--------------------------------+
+ | :attr:`%li` | long | Exactly equivalent to |
+ | | | ``printf("%li")``. |
+ +-------------------+---------------------+--------------------------------+
| :attr:`%lu` | unsigned long | Exactly equivalent to |
| | | ``printf("%lu")``. |
+-------------------+---------------------+--------------------------------+
| :attr:`%lld` | long long | Exactly equivalent to |
| | | ``printf("%lld")``. |
+-------------------+---------------------+--------------------------------+
+ | :attr:`%lli` | long long | Exactly equivalent to |
+ | | | ``printf("%lli")``. |
+ +-------------------+---------------------+--------------------------------+
| :attr:`%llu` | unsigned long long | Exactly equivalent to |
| | | ``printf("%llu")``. |
+-------------------+---------------------+--------------------------------+
| :attr:`%zd` | Py_ssize_t | Exactly equivalent to |
| | | ``printf("%zd")``. |
+-------------------+---------------------+--------------------------------+
+ | :attr:`%zi` | Py_ssize_t | Exactly equivalent to |
+ | | | ``printf("%zi")``. |
+ +-------------------+---------------------+--------------------------------+
| :attr:`%zu` | size_t | Exactly equivalent to |
| | | ``printf("%zu")``. |
+-------------------+---------------------+--------------------------------+
@@ -322,27 +527,178 @@ APIs:
.. versionchanged:: 3.2
Support for ``"%lld"`` and ``"%llu"`` added.
+ .. versionchanged:: 3.3
+ Support for ``"%li"``, ``"%lli"`` and ``"%zi"`` added.
+
.. c:function:: PyObject* PyUnicode_FromFormatV(const char *format, va_list vargs)
Identical to :c:func:`PyUnicode_FromFormat` except that it takes exactly two
arguments.
+
+.. c:function:: PyObject* PyUnicode_FromEncodedObject(PyObject *obj, \
+ const char *encoding, const char *errors)
+
+ Coerce an encoded object *obj* to an Unicode object and return a reference with
+ incremented refcount.
+
+ :class:`bytes`, :class:`bytearray` and other char buffer compatible objects
+ are decoded according to the given *encoding* and using the error handling
+ defined by *errors*. Both can be *NULL* to have the interface use the default
+ values (see the next section for details).
+
+ All other objects, including Unicode objects, cause a :exc:`TypeError` to be
+ set.
+
+ The API returns *NULL* if there was an error. The caller is responsible for
+ decref'ing the returned objects.
+
+
+.. c:function:: Py_ssize_t PyUnicode_GetLength(PyObject *unicode)
+
+ Return the length of the Unicode object, in code points.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, \
+ PyObject *to, Py_ssize_t from_start, Py_ssize_t how_many)
+
+ Copy characters from one Unicode object into another. This function performs
+ character conversion when necessary and falls back to :c:func:`memcpy` if
+ possible. Returns ``-1`` and sets an exception on error, otherwise returns
+ ``0``.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_ssize_t PyUnicode_Fill(PyObject *unicode, Py_ssize_t start, \
+ Py_ssize_t length, Py_UCS4 fill_char)
+
+ Fill a string with a character: write *fill_char* into
+ ``unicode[start:start+length]``.
+
+ Fail if *fill_char* is bigger than the string maximum character, or if the
+ string has more than 1 reference.
+
+ Return the number of written character, or return ``-1`` and raise an
+ exception on error.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: int PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, \
+ Py_UCS4 character)
+
+ Write a character to a string. The string must have been created through
+ :c:func:`PyUnicode_New`. Since Unicode strings are supposed to be immutable,
+ the string must not be shared, or have been hashed yet.
+
+ This function checks that *unicode* is a Unicode object, that the index is
+ not out of bounds, and that the object can be modified safely (i.e. that it
+ its reference count is one), in contrast to the macro version
+ :c:func:`PyUnicode_WRITE_CHAR`.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
+
+ Read a character from a string. This function checks that *unicode* is a
+ Unicode object and the index is not out of bounds, in contrast to the macro
+ version :c:func:`PyUnicode_READ_CHAR`.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyUnicode_Substring(PyObject *str, Py_ssize_t start, \
+ Py_ssize_t end)
+
+ Return a substring of *str*, from character index *start* (included) to
+ character index *end* (excluded). Negative indices are not supported.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS4* PyUnicode_AsUCS4(PyObject *u, Py_UCS4 *buffer, \
+ Py_ssize_t buflen, int copy_null)
+
+ Copy the string *u* into a UCS4 buffer, including a null character, if
+ *copy_null* is set. Returns *NULL* and sets an exception on error (in
+ particular, a :exc:`ValueError` if *buflen* is smaller than the length of
+ *u*). *buffer* is returned on success.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *u)
+
+ Copy the string *u* into a new UCS4 buffer that is allocated using
+ :c:func:`PyMem_Malloc`. If this fails, *NULL* is returned with a
+ :exc:`MemoryError` set.
+
+ .. versionadded:: 3.3
+
+
+Deprecated Py_UNICODE APIs
+""""""""""""""""""""""""""
+
+.. deprecated-removed:: 3.3 4.0
+
+These API functions are deprecated with the implementation of :pep:`393`.
+Extension modules can continue using them, as they will not be removed in Python
+3.x, but need to be aware that their use can now cause performance and memory hits.
+
+
+.. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
+
+ Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u*
+ may be *NULL* which causes the contents to be undefined. It is the user's
+ responsibility to fill in the needed data. The buffer is copied into the new
+ object.
+
+ If the buffer is not *NULL*, the return value might be a shared object.
+ Therefore, modification of the resulting Unicode object is only allowed when
+ *u* is *NULL*.
+
+ If the buffer is *NULL*, :c:func:`PyUnicode_READY` must be called once the
+ string content has been filled before using any of the access macros such as
+ :c:func:`PyUnicode_KIND`.
+
+ Please migrate to using :c:func:`PyUnicode_FromKindAndData` or
+ :c:func:`PyUnicode_New`.
+
+
+.. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode)
+
+ Return a read-only pointer to the Unicode object's internal
+ :c:type:`Py_UNICODE` buffer, or *NULL* on error. This will create the
+ :c:type:`Py_UNICODE*` representation of the object if it is not yet
+ available. Note that the resulting :c:type:`Py_UNICODE` string may contain
+ embedded null characters, which would cause the string to be truncated when
+ used in most C functions.
+
+ Please migrate to using :c:func:`PyUnicode_AsUCS4`,
+ :c:func:`PyUnicode_Substring`, :c:func:`PyUnicode_ReadChar` or similar new
+ APIs.
+
+
.. c:function:: PyObject* PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size)
Create a Unicode object by replacing all decimal digits in
:c:type:`Py_UNICODE` buffer of the given *size* by ASCII digits 0--9
- according to their decimal value. Return *NULL* if an exception
- occurs.
+ according to their decimal value. Return *NULL* if an exception occurs.
-.. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode)
+.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size)
- Return a read-only pointer to the Unicode object's internal
- :c:type:`Py_UNICODE` buffer, *NULL* if *unicode* is not a Unicode object.
- Note that the resulting :c:type:`Py_UNICODE*` string may contain embedded
- null characters, which would cause the string to be truncated when used in
- most C functions.
+ Like :c:func:`PyUnicode_AsUnicode`, but also saves the :c:func:`Py_UNICODE`
+ array length in *size*. Note that the resulting :c:type:`Py_UNICODE*` string
+ may contain embedded null characters, which would cause the string to be
+ truncated when used in most C functions.
+
+ .. versionadded:: 3.3
.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode)
@@ -350,44 +706,76 @@ APIs:
Create a copy of a Unicode string ending with a nul character. Return *NULL*
and raise a :exc:`MemoryError` exception on memory allocation failure,
otherwise return a new allocated buffer (use :c:func:`PyMem_Free` to free
- the buffer). Note that the resulting :c:type:`Py_UNICODE*` string may contain
- embedded null characters, which would cause the string to be truncated when
- used in most C functions.
+ the buffer). Note that the resulting :c:type:`Py_UNICODE*` string may
+ contain embedded null characters, which would cause the string to be
+ truncated when used in most C functions.
.. versionadded:: 3.2
+ Please migrate to using :c:func:`PyUnicode_AsUCS4Copy` or similar new APIs.
+
.. c:function:: Py_ssize_t PyUnicode_GetSize(PyObject *unicode)
- Return the length of the Unicode object.
+ Return the size of the deprecated :c:type:`Py_UNICODE` representation, in
+ code units (this includes surrogate pairs as 2 units).
+ Please migrate to using :c:func:`PyUnicode_GetLength`.
-.. c:function:: PyObject* PyUnicode_FromEncodedObject(PyObject *obj, const char *encoding, const char *errors)
- Coerce an encoded object *obj* to an Unicode object and return a reference with
- incremented refcount.
+.. c:function:: PyObject* PyUnicode_FromObject(PyObject *obj)
- :class:`bytes`, :class:`bytearray` and other char buffer compatible objects
- are decoded according to the given *encoding* and using the error handling
- defined by *errors*. Both can be *NULL* to have the interface use the default
- values (see the next section for details).
+ Shortcut for ``PyUnicode_FromEncodedObject(obj, NULL, "strict")`` which is used
+ throughout the interpreter whenever coercion to Unicode is needed.
- All other objects, including Unicode objects, cause a :exc:`TypeError` to be
- set.
- The API returns *NULL* if there was an error. The caller is responsible for
- decref'ing the returned objects.
+Locale Encoding
+"""""""""""""""
+The current locale encoding can be used to decode text from the operating
+system.
-.. c:function:: PyObject* PyUnicode_FromObject(PyObject *obj)
+.. c:function:: PyObject* PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, int surrogateescape)
+
+ Decode a string from the current locale encoding. The decoder is strict if
+ *surrogateescape* is equal to zero, otherwise it uses the
+ ``'surrogateescape'`` error handler (:pep:`383`) to escape undecodable
+ bytes. If a byte sequence can be decoded as a surrogate character and
+ *surrogateescape* is not equal to zero, the byte sequence is escaped using
+ the ``'surrogateescape'`` error handler instead of being decoded. *str*
+ must end with a null character but cannot contain embedded null characters.
+
+ .. seealso::
+
+ Use :c:func:`PyUnicode_DecodeFSDefaultAndSize` to decode a string from
+ :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at
+ Python startup).
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyUnicode_DecodeLocale(const char *str, int surrogateescape)
+
+ Similar to :c:func:`PyUnicode_DecodeLocaleAndSize`, but compute the string
+ length using :c:func:`strlen`.
+
+ .. versionadded:: 3.3
- Shortcut for ``PyUnicode_FromEncodedObject(obj, NULL, "strict")`` which is used
- throughout the interpreter whenever coercion to Unicode is needed.
-If the platform supports :c:type:`wchar_t` and provides a header file wchar.h,
-Python can interface directly to this type using the following functions.
-Support is optimized if Python's own :c:type:`Py_UNICODE` type is identical to
-the system's :c:type:`wchar_t`.
+.. c:function:: PyObject* PyUnicode_EncodeLocale(PyObject *unicode, int surrogateescape)
+
+ Encode a Unicode object to the current locale encoding. The encoder is
+ strict if *surrogateescape* is equal to zero, otherwise it uses the
+ ``'surrogateescape'`` error handler (:pep:`383`). Return a :class:`bytes`
+ object. *str* cannot contain embedded null characters.
+
+ .. seealso::
+
+ Use :c:func:`PyUnicode_EncodeFSDefault` to encode a string to
+ :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at
+ Python startup).
+
+ .. versionadded:: 3.3
File System Encoding
@@ -430,6 +818,13 @@ used, passing :c:func:`PyUnicode_FSDecoder` as the conversion function:
If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the
locale encoding.
+ .. seealso::
+
+ :c:data:`Py_FileSystemDefaultEncoding` is initialized at startup from the
+ locale encoding and cannot be modified later. If you need to decode a
+ string from the current locale encoding, use
+ :c:func:`PyUnicode_DecodeLocaleAndSize`.
+
.. versionchanged:: 3.2
Use ``'strict'`` error handler on Windows.
@@ -458,6 +853,13 @@ used, passing :c:func:`PyUnicode_FSDecoder` as the conversion function:
If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the
locale encoding.
+ .. seealso::
+
+ :c:data:`Py_FileSystemDefaultEncoding` is initialized at startup from the
+ locale encoding and cannot be modified later. If you need to encode a
+ string to the current locale encoding, use
+ :c:func:`PyUnicode_EncodeLocale`.
+
.. versionadded:: 3.2
@@ -479,9 +881,9 @@ wchar_t Support
Copy the Unicode object contents into the :c:type:`wchar_t` buffer *w*. At most
*size* :c:type:`wchar_t` characters are copied (excluding a possibly trailing
0-termination character). Return the number of :c:type:`wchar_t` characters
- copied or -1 in case of an error. Note that the resulting :c:type:`wchar_t`
+ copied or -1 in case of an error. Note that the resulting :c:type:`wchar_t*`
string may or may not be 0-terminated. It is the responsibility of the caller
- to make sure that the :c:type:`wchar_t` string is 0-terminated in case this is
+ to make sure that the :c:type:`wchar_t*` string is 0-terminated in case this is
required by the application. Also, note that the :c:type:`wchar_t*` string
might contain null characters, which would cause the string to be truncated
when used with most C functions.
@@ -497,12 +899,32 @@ wchar_t Support
Returns a buffer allocated by :c:func:`PyMem_Alloc` (use
:c:func:`PyMem_Free` to free it) on success. On error, returns *NULL*,
*\*size* is undefined and raises a :exc:`MemoryError`. Note that the
- resulting :c:type:`wchar_t*` string might contain null characters, which
+ resulting :c:type:`wchar_t` string might contain null characters, which
would cause the string to be truncated when used with most C functions.
.. versionadded:: 3.2
+UCS4 Support
+""""""""""""
+
+.. versionadded:: 3.3
+
+.. XXX are these meant to be public?
+
+.. c:function:: size_t Py_UCS4_strlen(const Py_UCS4 *u)
+ Py_UCS4* Py_UCS4_strcpy(Py_UCS4 *s1, const Py_UCS4 *s2)
+ Py_UCS4* Py_UCS4_strncpy(Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
+ Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2)
+ int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2)
+ int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
+ Py_UCS4* Py_UCS4_strchr(const Py_UCS4 *s, Py_UCS4 c)
+ Py_UCS4* Py_UCS4_strrchr(const Py_UCS4 *s, Py_UCS4 c)
+
+ These utility functions work on strings of :c:type:`Py_UCS4` characters and
+ otherwise behave like the C standard library functions with the same name.
+
+
.. _builtincodecs:
Built-in Codecs
@@ -537,7 +959,8 @@ Generic Codecs
These are the generic codec APIs:
-.. c:function:: PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, const char *encoding, const char *errors)
+.. c:function:: PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, \
+ const char *encoding, const char *errors)
Create a Unicode object by decoding *size* bytes of the encoded string *s*.
*encoding* and *errors* have the same meaning as the parameters of the same name
@@ -546,7 +969,18 @@ These are the generic codec APIs:
the codec.
-.. c:function:: PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, const char *encoding, const char *errors)
+.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, \
+ const char *encoding, const char *errors)
+
+ Encode a Unicode object and return the result as Python bytes object.
+ *encoding* and *errors* have the same meaning as the parameters of the same
+ name in the Unicode :meth:`encode` method. The codec to be used is looked up
+ using the Python codec registry. Return *NULL* if an exception was raised by
+ the codec.
+
+
+.. c:function:: PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, \
+ const char *encoding, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python
bytes object. *encoding* and *errors* have the same meaning as the
@@ -554,14 +988,9 @@ These are the generic codec APIs:
to be used is looked up using the Python codec registry. Return *NULL* if an
exception was raised by the codec.
-
-.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors)
-
- Encode a Unicode object and return the result as Python bytes object.
- *encoding* and *errors* have the same meaning as the parameters of the same
- name in the Unicode :meth:`encode` method. The codec to be used is looked up
- using the Python codec registry. Return *NULL* if an exception was raised by
- the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsEncodedString`.
UTF-8 Codecs
@@ -576,7 +1005,8 @@ These are the UTF-8 codec APIs:
*s*. Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
+.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, Py_ssize_t *consumed)
If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF8`. If
*consumed* is not *NULL*, trailing incomplete UTF-8 byte sequences will not be
@@ -584,18 +1014,45 @@ These are the UTF-8 codec APIs:
that have been decoded will be stored in *consumed*.
+.. c:function:: PyObject* PyUnicode_AsUTF8String(PyObject *unicode)
+
+ Encode a Unicode object using UTF-8 and return the result as Python bytes
+ object. Error handling is "strict". Return *NULL* if an exception was
+ raised by the codec.
+
+
+.. c:function:: char* PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size)
+
+ Return a pointer to the default encoding (UTF-8) of the Unicode object, and
+ store the size of the encoded representation (in bytes) in *size*. *size*
+ can be *NULL*, in this case no size will be stored.
+
+ In the case of an error, *NULL* is returned with an exception set and no
+ *size* is stored.
+
+ This caches the UTF-8 representation of the string in the Unicode object, and
+ subsequent calls will return a pointer to the same buffer. The caller is not
+ responsible for deallocating the buffer.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: char* PyUnicode_AsUTF8(PyObject *unicode)
+
+ As :c:func:`PyUnicode_AsUTF8AndSize`, but does not store the size.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: PyObject* PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* using UTF-8 and
return a Python bytes object. Return *NULL* if an exception was raised by
the codec.
-
-.. c:function:: PyObject* PyUnicode_AsUTF8String(PyObject *unicode)
-
- Encode a Unicode object using UTF-8 and return the result as Python bytes
- object. Error handling is "strict". Return *NULL* if an exception was
- raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsUTF8String` or :c:func:`PyUnicode_AsUTF8AndSize`.
UTF-32 Codecs
@@ -604,7 +1061,8 @@ UTF-32 Codecs
These are the UTF-32 codec APIs:
-.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, const char *errors, int *byteorder)
+.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder)
Decode *size* bytes from a UTF-32 encoded buffer string and return the
corresponding Unicode object. *errors* (if non-*NULL*) defines the error
@@ -625,14 +1083,13 @@ These are the UTF-32 codec APIs:
After completion, *\*byteorder* is set to the current byte order at the end
of input data.
- In a narrow build codepoints outside the BMP will be decoded as surrogate pairs.
-
If *byteorder* is *NULL*, the codec starts in native order mode.
Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
+.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder, Py_ssize_t *consumed)
If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF32`. If
*consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF32Stateful` will not treat
@@ -641,7 +1098,15 @@ These are the UTF-32 codec APIs:
that have been decoded will be stored in *consumed*.
-.. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
+.. c:function:: PyObject* PyUnicode_AsUTF32String(PyObject *unicode)
+
+ Return a Python byte string using the UTF-32 encoding in native byte
+ order. The string always starts with a BOM mark. Error handling is "strict".
+ Return *NULL* if an exception was raised by the codec.
+
+
+.. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, \
+ const char *errors, int byteorder)
Return a Python bytes object holding the UTF-32 encoded value of the Unicode
data in *s*. Output is written according to the following byte order::
@@ -658,12 +1123,9 @@ These are the UTF-32 codec APIs:
Return *NULL* if an exception was raised by the codec.
-
-.. c:function:: PyObject* PyUnicode_AsUTF32String(PyObject *unicode)
-
- Return a Python byte string using the UTF-32 encoding in native byte
- order. The string always starts with a BOM mark. Error handling is "strict".
- Return *NULL* if an exception was raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsUTF32String`.
UTF-16 Codecs
@@ -672,7 +1134,8 @@ UTF-16 Codecs
These are the UTF-16 codec APIs:
-.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors, int *byteorder)
+.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder)
Decode *size* bytes from a UTF-16 encoded buffer string and return the
corresponding Unicode object. *errors* (if non-*NULL*) defines the error
@@ -699,7 +1162,8 @@ These are the UTF-16 codec APIs:
Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
+.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder, Py_ssize_t *consumed)
If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF16`. If
*consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF16Stateful` will not treat
@@ -708,7 +1172,15 @@ These are the UTF-16 codec APIs:
number of bytes that have been decoded will be stored in *consumed*.
-.. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder)
+.. c:function:: PyObject* PyUnicode_AsUTF16String(PyObject *unicode)
+
+ Return a Python byte string using the UTF-16 encoding in native byte
+ order. The string always starts with a BOM mark. Error handling is "strict".
+ Return *NULL* if an exception was raised by the codec.
+
+
+.. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, \
+ const char *errors, int byteorder)
Return a Python bytes object holding the UTF-16 encoded value of the Unicode
data in *s*. Output is written according to the following byte order::
@@ -726,12 +1198,9 @@ These are the UTF-16 codec APIs:
Return *NULL* if an exception was raised by the codec.
-
-.. c:function:: PyObject* PyUnicode_AsUTF16String(PyObject *unicode)
-
- Return a Python byte string using the UTF-16 encoding in native byte
- order. The string always starts with a BOM mark. Error handling is "strict".
- Return *NULL* if an exception was raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsUTF16String`.
UTF-7 Codecs
@@ -746,7 +1215,8 @@ These are the UTF-7 codec APIs:
*s*. Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
+.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, Py_ssize_t *consumed)
If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF7`. If
*consumed* is not *NULL*, trailing incomplete UTF-7 base-64 sections will not
@@ -754,7 +1224,8 @@ These are the UTF-7 codec APIs:
bytes that have been decoded will be stored in *consumed*.
-.. c:function:: PyObject* PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, int base64SetO, int base64WhiteSpace, const char *errors)
+.. c:function:: PyObject* PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, \
+ int base64SetO, int base64WhiteSpace, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer of the given size using UTF-7 and
return a Python bytes object. Return *NULL* if an exception was raised by
@@ -765,6 +1236,11 @@ These are the UTF-7 codec APIs:
nonzero, whitespace will be encoded in base-64. Both are set to zero for the
Python "utf-7" codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API.
+
+ .. XXX replace with what?
+
Unicode-Escape Codecs
"""""""""""""""""""""
@@ -772,24 +1248,29 @@ Unicode-Escape Codecs
These are the "Unicode Escape" codec APIs:
-.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, Py_ssize_t size, const char *errors)
+.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, \
+ Py_ssize_t size, const char *errors)
Create a Unicode object by decoding *size* bytes of the Unicode-Escape encoded
string *s*. Return *NULL* if an exception was raised by the codec.
+.. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
+
+ Encode a Unicode object using Unicode-Escape and return the result as Python
+ string object. Error handling is "strict". Return *NULL* if an exception was
+ raised by the codec.
+
+
.. c:function:: PyObject* PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Unicode-Escape and
return a Python string object. Return *NULL* if an exception was raised by the
codec.
-
-.. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
-
- Encode a Unicode object using Unicode-Escape and return the result as Python
- string object. Error handling is "strict". Return *NULL* if an exception was
- raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsUnicodeEscapeString`.
Raw-Unicode-Escape Codecs
@@ -798,19 +1279,13 @@ Raw-Unicode-Escape Codecs
These are the "Raw Unicode Escape" codec APIs:
-.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, Py_ssize_t size, const char *errors)
+.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, \
+ Py_ssize_t size, const char *errors)
Create a Unicode object by decoding *size* bytes of the Raw-Unicode-Escape
encoded string *s*. Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
-
- Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Raw-Unicode-Escape
- and return a Python string object. Return *NULL* if an exception was raised by
- the codec.
-
-
.. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
Encode a Unicode object using Raw-Unicode-Escape and return the result as
@@ -818,6 +1293,18 @@ These are the "Raw Unicode Escape" codec APIs:
was raised by the codec.
+.. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, \
+ Py_ssize_t size, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Raw-Unicode-Escape
+ and return a Python string object. Return *NULL* if an exception was raised by
+ the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsRawUnicodeEscapeString`.
+
+
Latin-1 Codecs
""""""""""""""
@@ -831,18 +1318,22 @@ ordinals and only these are accepted by the codecs during encoding.
*s*. Return *NULL* if an exception was raised by the codec.
+.. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode)
+
+ Encode a Unicode object using Latin-1 and return the result as Python bytes
+ object. Error handling is "strict". Return *NULL* if an exception was
+ raised by the codec.
+
+
.. c:function:: PyObject* PyUnicode_EncodeLatin1(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Latin-1 and
return a Python bytes object. Return *NULL* if an exception was raised by
the codec.
-
-.. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode)
-
- Encode a Unicode object using Latin-1 and return the result as Python bytes
- object. Error handling is "strict". Return *NULL* if an exception was
- raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsLatin1String`.
ASCII Codecs
@@ -858,18 +1349,22 @@ codes generate errors.
*s*. Return *NULL* if an exception was raised by the codec.
+.. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode)
+
+ Encode a Unicode object using ASCII and return the result as Python bytes
+ object. Error handling is "strict". Return *NULL* if an exception was
+ raised by the codec.
+
+
.. c:function:: PyObject* PyUnicode_EncodeASCII(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer of the given *size* using ASCII and
return a Python bytes object. Return *NULL* if an exception was raised by
the codec.
-
-.. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode)
-
- Encode a Unicode object using ASCII and return the result as Python bytes
- object. Error handling is "strict". Return *NULL* if an exception was
- raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsASCIIString`.
Character Map Codecs
@@ -898,7 +1393,8 @@ characters to different code points.
These are the mapping codec APIs:
-.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, PyObject *mapping, const char *errors)
+.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, \
+ PyObject *mapping, const char *errors)
Create a Unicode object by decoding *size* bytes of the encoded string *s* using
the given *mapping* object. Return *NULL* if an exception was raised by the
@@ -908,13 +1404,6 @@ These are the mapping codec APIs:
treated as "undefined mapping".
-.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors)
-
- Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given
- *mapping* object and return a Python string object. Return *NULL* if an
- exception was raised by the codec.
-
-
.. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping)
Encode a Unicode object using the given *mapping* object and return the result
@@ -924,7 +1413,8 @@ These are the mapping codec APIs:
The following codec API is special in that maps Unicode to Unicode.
-.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *table, const char *errors)
+.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \
+ PyObject *table, const char *errors)
Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a
character mapping *table* to it and return the resulting Unicode object. Return
@@ -937,6 +1427,22 @@ The following codec API is special in that maps Unicode to Unicode.
and sequences work well. Unmapped character ordinals (ones which cause a
:exc:`LookupError`) are left untouched and are copied as-is.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API.
+
+ .. XXX replace with what?
+
+
+.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \
+ PyObject *mapping, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given
+ *mapping* object and return a Python string object. Return *NULL* if an
+ exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsCharmapString`.
MBCS codecs for Windows
@@ -953,7 +1459,8 @@ the user settings on the machine running the codec.
Return *NULL* if an exception was raised by the codec.
-.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, int size, const char *errors, int *consumed)
+.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, int size, \
+ const char *errors, int *consumed)
If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeMBCS`. If
*consumed* is not *NULL*, :c:func:`PyUnicode_DecodeMBCSStateful` will not decode
@@ -961,18 +1468,31 @@ the user settings on the machine running the codec.
in *consumed*.
+.. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode)
+
+ Encode a Unicode object using MBCS and return the result as Python bytes
+ object. Error handling is "strict". Return *NULL* if an exception was
+ raised by the codec.
+
+
+.. c:function:: PyObject* PyUnicode_EncodeCodePage(int code_page, PyObject *unicode, const char *errors)
+
+ Encode the Unicode object using the specified code page and return a Python
+ bytes object. Return *NULL* if an exception was raised by the codec. Use
+ :c:data:`CP_ACP` code page to get the MBCS encoder.
+
+ .. versionadded:: 3.3
+
+
.. c:function:: PyObject* PyUnicode_EncodeMBCS(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
Encode the :c:type:`Py_UNICODE` buffer of the given *size* using MBCS and return
a Python bytes object. Return *NULL* if an exception was raised by the
codec.
-
-.. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode)
-
- Encode a Unicode object using MBCS and return the result as Python bytes
- object. Error handling is "strict". Return *NULL* if an exception was
- raised by the codec.
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+ :c:func:`PyUnicode_AsMBCSString` or :c:func:`PyUnicode_EncodeCodePage`.
Methods & Slots
@@ -1011,7 +1531,8 @@ They all return *NULL* or ``-1`` if an exception occurs.
characters are not included in the resulting strings.
-.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors)
+.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, \
+ const char *errors)
Translate a string by applying a character mapping table to it and return the
resulting Unicode object.
@@ -1033,14 +1554,16 @@ They all return *NULL* or ``-1`` if an exception occurs.
Unicode string.
-.. c:function:: int PyUnicode_Tailmatch(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
+.. c:function:: int PyUnicode_Tailmatch(PyObject *str, PyObject *substr, \
+ Py_ssize_t start, Py_ssize_t end, int direction)
Return 1 if *substr* matches ``str[start:end]`` at the given tail end
(*direction* == -1 means to do a prefix match, *direction* == 1 a suffix match),
0 otherwise. Return ``-1`` if an error occurred.
-.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
+.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, \
+ Py_ssize_t start, Py_ssize_t end, int direction)
Return the first position of *substr* in ``str[start:end]`` using the given
*direction* (*direction* == 1 means to do a forward search, *direction* == -1 a
@@ -1049,13 +1572,27 @@ They all return *NULL* or ``-1`` if an exception occurs.
occurred and an exception has been set.
-.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end)
+.. c:function:: Py_ssize_t PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, \
+ Py_ssize_t start, Py_ssize_t end, int direction)
+
+ Return the first position of the character *ch* in ``str[start:end]`` using
+ the given *direction* (*direction* == 1 means to do a forward search,
+ *direction* == -1 a backward search). The return value is the index of the
+ first match; a value of ``-1`` indicates that no match was found, and ``-2``
+ indicates that an error occurred and an exception has been set.
+
+ .. versionadded:: 3.3
+
+
+.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, \
+ Py_ssize_t start, Py_ssize_t end)
Return the number of non-overlapping occurrences of *substr* in
``str[start:end]``. Return ``-1`` if an error occurred.
-.. c:function:: PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount)
+.. c:function:: PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, \
+ PyObject *replstr, Py_ssize_t maxcount)
Replace at most *maxcount* occurrences of *substr* in *str* with *replstr* and
return the resulting Unicode object. *maxcount* == -1 means replace all
@@ -1076,7 +1613,7 @@ They all return *NULL* or ``-1`` if an exception occurs.
ISO-8859-1 if it contains non-ASCII characters".
-.. c:function:: int PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
+.. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
Rich compare two unicode strings and return one of the following:
@@ -1103,8 +1640,8 @@ They all return *NULL* or ``-1`` if an exception occurs.
Check whether *element* is contained in *container* and return true or false
accordingly.
- *element* has to coerce to a one element Unicode string. ``-1`` is returned if
- there was an error.
+ *element* has to coerce to a one element Unicode string. ``-1`` is returned
+ if there was an error.
.. c:function:: void PyUnicode_InternInPlace(PyObject **string)
@@ -1123,7 +1660,6 @@ They all return *NULL* or ``-1`` if an exception occurs.
.. c:function:: PyObject* PyUnicode_InternFromString(const char *v)
A combination of :c:func:`PyUnicode_FromString` and
- :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string object
- that has been interned, or a new ("owned") reference to an earlier interned
- string object with the same value.
-
+ :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string
+ object that has been interned, or a new ("owned") reference to an earlier
+ interned string object with the same value.
diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst
index 41cdd6b..499eb3e 100644
--- a/Doc/c-api/veryhigh.rst
+++ b/Doc/c-api/veryhigh.rst
@@ -95,12 +95,6 @@ the same library that the Python runtime is using.
leaving *closeit* set to ``0`` and *flags* set to *NULL*.
-.. c:function:: int PyRun_SimpleFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
-
- This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
- leaving *closeit* set to ``0``.
-
-
.. c:function:: int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
diff --git a/Doc/conf.py b/Doc/conf.py
index 555f281..6b085e0 100644
--- a/Doc/conf.py
+++ b/Doc/conf.py
@@ -91,7 +91,7 @@ html_additional_pages = {
}
# Output an OpenSearch description file.
-html_use_opensearch = 'http://docs.python.org/3.2'
+html_use_opensearch = 'http://docs.python.org/' + version
# Additional static files.
html_static_path = ['tools/sphinxext/static']
diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat
index b5dde33..fac89af 100644
--- a/Doc/data/refcounts.dat
+++ b/Doc/data/refcounts.dat
@@ -465,6 +465,11 @@ PyFunction_New:PyObject*::+1:
PyFunction_New:PyObject*:code:+1:
PyFunction_New:PyObject*:globals:+1:
+PyFunction_NewWithQualName:PyObject*::+1:
+PyFunction_NewWithQualName:PyObject*:code:+1:
+PyFunction_NewWithQualName:PyObject*:globals:+1:
+PyFunction_NewWithQualName:PyObject*:qualname:+1:
+
PyFunction_SetClosure:int:::
PyFunction_SetClosure:PyObject*:op:0:
PyFunction_SetClosure:PyObject*:closure:+1:
diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst
index e15dc76..71702e5 100644
--- a/Doc/distutils/apiref.rst
+++ b/Doc/distutils/apiref.rst
@@ -160,7 +160,7 @@ the full reference.
.. class:: Extension
The Extension class describes a single C or C++extension module in a setup
- script. It accepts the following keyword arguments in its constructor
+ script. It accepts the following keyword arguments in its constructor:
+------------------------+--------------------------------+---------------------------+
| argument name | value | type |
@@ -1157,12 +1157,11 @@ other utility module.
.. function:: grok_environment_error(exc[, prefix='error: '])
- Generate a useful error message from an :exc:`EnvironmentError` (:exc:`IOError`
- or :exc:`OSError`) exception object. Handles Python 1.5.1 and later styles,
- and does what it can to deal with exception objects that don't have a filename
- (which happens when the error is due to a two-file operation, such as
- :func:`rename` or :func:`link`). Returns the error message as a string
- prefixed with *prefix*.
+ Generate a useful error message from an :exc:`OSError` exception object.
+ Handles Python 1.5.1 and later styles, and does what it can to deal with
+ exception objects that don't have a filename (which happens when the error
+ is due to a two-file operation, such as :func:`rename` or :func:`link`).
+ Returns the error message as a string prefixed with *prefix*.
.. function:: split_quoted(s)
diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst
index 7fd9f72..ef95ac9 100644
--- a/Doc/extending/extending.rst
+++ b/Doc/extending/extending.rst
@@ -321,7 +321,7 @@ parameters to be passed in as a tuple acceptable for parsing via
The :const:`METH_KEYWORDS` bit may be set in the third field if keyword
arguments should be passed to the function. In this case, the C function should
-accept a third ``PyObject \*`` parameter which will be a dictionary of keywords.
+accept a third ``PyObject *`` parameter which will be a dictionary of keywords.
Use :c:func:`PyArg_ParseTupleAndKeywords` to parse the arguments to such a
function.
@@ -384,9 +384,6 @@ optionally followed by an import of the module::
imports it. */
PyImport_ImportModule("spam");
-An example may be found in the file :file:`Demo/embed/demo.c` in the Python
-source distribution.
-
.. note::
Removing entries from ``sys.modules`` or importing compiled modules into
diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst
index 3001415..376d09a 100644
--- a/Doc/extending/newtypes.rst
+++ b/Doc/extending/newtypes.rst
@@ -26,11 +26,12 @@ The Basics
==========
The Python runtime sees all Python objects as variables of type
-:c:type:`PyObject\*`. A :c:type:`PyObject` is not a very magnificent object - it
-just contains the refcount and a pointer to the object's "type object". This is
-where the action is; the type object determines which (C) functions get called
-when, for instance, an attribute gets looked up on an object or it is multiplied
-by another object. These C functions are called "type methods".
+:c:type:`PyObject\*`, which serves as a "base type" for all Python objects.
+:c:type:`PyObject` itself only contains the refcount and a pointer to the
+object's "type object". This is where the action is; the type object determines
+which (C) functions get called when, for instance, an attribute gets looked
+up on an object or it is multiplied by another object. These C functions
+are called "type methods".
So, if you want to define a new object type, you need to create a new type
object.
@@ -50,15 +51,15 @@ The first bit that will be new is::
PyObject_HEAD
} noddy_NoddyObject;
-This is what a Noddy object will contain---in this case, nothing more than every
-Python object contains, namely a refcount and a pointer to a type object. These
-are the fields the ``PyObject_HEAD`` macro brings in. The reason for the macro
-is to standardize the layout and to enable special debugging fields in debug
-builds. Note that there is no semicolon after the ``PyObject_HEAD`` macro; one
-is included in the macro definition. Be wary of adding one by accident; it's
-easy to do from habit, and your compiler might not complain, but someone else's
-probably will! (On Windows, MSVC is known to call this an error and refuse to
-compile the code.)
+This is what a Noddy object will contain---in this case, nothing more than what
+every Python object contains---a refcount and a pointer to a type object.
+These are the fields the ``PyObject_HEAD`` macro brings in. The reason for the
+macro is to standardize the layout and to enable special debugging fields in
+debug builds. Note that there is no semicolon after the ``PyObject_HEAD``
+macro; one is included in the macro definition. Be wary of adding one by
+accident; it's easy to do from habit, and your compiler might not complain,
+but someone else's probably will! (On Windows, MSVC is known to call this an
+error and refuse to compile the code.)
For contrast, let's take a look at the corresponding definition for standard
Python floats::
@@ -224,7 +225,7 @@ doesn't do anything. It can't even be subclassed.
Adding data and methods to the Basic example
--------------------------------------------
-Let's expend the basic example to add some data and methods. Let's also make
+Let's extend the basic example to add some data and methods. Let's also make
the type usable as a base class. We'll create a new module, :mod:`noddy2` that
adds these capabilities:
@@ -288,18 +289,16 @@ strings, so we provide a new method::
self = (Noddy *)type->tp_alloc(type, 0);
if (self != NULL) {
self->first = PyString_FromString("");
- if (self->first == NULL)
- {
+ if (self->first == NULL) {
Py_DECREF(self);
return NULL;
- }
+ }
self->last = PyString_FromString("");
- if (self->last == NULL)
- {
+ if (self->last == NULL) {
Py_DECREF(self);
return NULL;
- }
+ }
self->number = 0;
}
@@ -327,8 +326,8 @@ any arguments passed when the type was called, and that returns the new object
created. New methods always accept positional and keyword arguments, but they
often ignore the arguments, leaving the argument handling to initializer
methods. Note that if the type supports subclassing, the type passed may not be
-the type being defined. The new method calls the tp_alloc slot to allocate
-memory. We don't fill the :attr:`tp_alloc` slot ourselves. Rather
+the type being defined. The new method calls the :attr:`tp_alloc` slot to
+allocate memory. We don't fill the :attr:`tp_alloc` slot ourselves. Rather
:c:func:`PyType_Ready` fills it for us by inheriting it from our base class,
which is :class:`object` by default. Most types use the default allocation.
@@ -445,15 +444,6 @@ concatenation of the first and last names. ::
static PyObject *
Noddy_name(Noddy* self)
{
- static PyObject *format = NULL;
- PyObject *args, *result;
-
- if (format == NULL) {
- format = PyString_FromString("%s %s");
- if (format == NULL)
- return NULL;
- }
-
if (self->first == NULL) {
PyErr_SetString(PyExc_AttributeError, "first");
return NULL;
@@ -464,20 +454,13 @@ concatenation of the first and last names. ::
return NULL;
}
- args = Py_BuildValue("OO", self->first, self->last);
- if (args == NULL)
- return NULL;
-
- result = PyString_Format(format, args);
- Py_DECREF(args);
-
- return result;
+ return PyUnicode_FromFormat("%S %S", self->first, self->last);
}
The method is implemented as a C function that takes a :class:`Noddy` (or
:class:`Noddy` subclass) instance as the first argument. Methods always take an
instance as the first argument. Methods often take positional and keyword
-arguments as well, but in this cased we don't take any and don't need to accept
+arguments as well, but in this case we don't take any and don't need to accept
a positional argument tuple or keyword argument dictionary. This method is
equivalent to the Python method::
@@ -1124,9 +1107,6 @@ needed for methods inherited from a base type. One additional entry is needed
at the end; it is a sentinel that marks the end of the array. The
:attr:`ml_name` field of the sentinel must be *NULL*.
-XXX Need to refer to some unified discussion of the structure fields, shared
-with the next section.
-
The second table is used to define attributes which map directly to data stored
in the instance. A variety of primitive C types are supported, and access may
be read-only or read-write. The structures in the table are defined as::
@@ -1146,8 +1126,6 @@ type which will be able to extract a value from the instance structure. The
convert Python values to and from C values. The :attr:`flags` field is used to
store flags which control how the attribute can be accessed.
-XXX Need to move some of this to a shared section!
-
The following flag constants are defined in :file:`structmember.h`; they may be
combined using bitwise-OR.
@@ -1372,7 +1350,7 @@ Here is a desultory example of the implementation of the call function. ::
return result;
}
-XXX some fields need to be added here... ::
+::
/* Iterators */
getiterfunc tp_iter;
diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst
index 7c5116d..6b8a8fd 100644
--- a/Doc/faq/design.rst
+++ b/Doc/faq/design.rst
@@ -515,14 +515,16 @@ far) under most circumstances, and the implementation is simpler.
Dictionaries work by computing a hash code for each key stored in the dictionary
using the :func:`hash` built-in function. The hash code varies widely depending
-on the key; for example, "Python" hashes to -539294296 while "python", a string
-that differs by a single bit, hashes to 1142331976. The hash code is then used
-to calculate a location in an internal array where the value will be stored.
-Assuming that you're storing keys that all have different hash values, this
-means that dictionaries take constant time -- O(1), in computer science notation
--- to retrieve a key. It also means that no sorted order of the keys is
-maintained, and traversing the array as the ``.keys()`` and ``.items()`` do will
-output the dictionary's content in some arbitrary jumbled order.
+on the key and a per-process seed; for example, "Python" could hash to
+-539294296 while "python", a string that differs by a single bit, could hash
+to 1142331976. The hash code is then used to calculate a location in an
+internal array where the value will be stored. Assuming that you're storing
+keys that all have different hash values, this means that dictionaries take
+constant time -- O(1), in computer science notation -- to retrieve a key. It
+also means that no sorted order of the keys is maintained, and traversing the
+array as the ``.keys()`` and ``.items()`` do will output the dictionary's
+content in some arbitrary jumbled order that can change with every invocation of
+a program.
Why must dictionary keys be immutable?
@@ -634,7 +636,7 @@ construction of large programs.
Python 2.6 adds an :mod:`abc` module that lets you define Abstract Base Classes
(ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check
whether an instance or a class implements a particular ABC. The
-:mod:`collections` module defines a set of useful ABCs such as
+:mod:`collections.abc` module defines a set of useful ABCs such as
:class:`Iterable`, :class:`Container`, and :class:`MutableMapping`.
For Python, many of the advantages of interface specifications can be obtained
diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst
index 7c684a0..fa245c7 100644
--- a/Doc/faq/extending.rst
+++ b/Doc/faq/extending.rst
@@ -445,34 +445,3 @@ In Python 2.2, you can inherit from built-in classes such as :class:`int`,
The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html)
provides a way of doing this from C++ (i.e. you can inherit from an extension
class written in C++ using the BPL).
-
-
-When importing module X, why do I get "undefined symbol: PyUnicodeUCS2*"?
--------------------------------------------------------------------------
-
-You are using a version of Python that uses a 4-byte representation for Unicode
-characters, but some C extension module you are importing was compiled using a
-Python that uses a 2-byte representation for Unicode characters (the default).
-
-If instead the name of the undefined symbol starts with ``PyUnicodeUCS4``, the
-problem is the reverse: Python was built using 2-byte Unicode characters, and
-the extension module was compiled using a Python with 4-byte Unicode characters.
-
-This can easily occur when using pre-built extension packages. RedHat Linux
-7.x, in particular, provided a "python2" binary that is compiled with 4-byte
-Unicode. This only causes the link failure if the extension uses any of the
-``PyUnicode_*()`` functions. It is also a problem if an extension uses any of
-the Unicode-related format specifiers for :c:func:`Py_BuildValue` (or similar) or
-parameter specifications for :c:func:`PyArg_ParseTuple`.
-
-You can check the size of the Unicode character a Python interpreter is using by
-checking the value of sys.maxunicode:
-
- >>> import sys
- >>> if sys.maxunicode > 65535:
- ... print('UCS4 build')
- ... else:
- ... print('UCS2 build')
-
-The only way to solve this problem is to use extension modules compiled with a
-Python binary built using the same size for Unicode characters.
diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst
index 7385c59..cab2d7b 100644
--- a/Doc/faq/library.rst
+++ b/Doc/faq/library.rst
@@ -351,7 +351,7 @@ When run, this will produce the following output:
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
...
-Consult the module's documentation for more details; the :class:`~queue.Queue``
+Consult the module's documentation for more details; the :class:`~queue.Queue`
class provides a featureful interface.
diff --git a/Doc/glossary.rst b/Doc/glossary.rst
index 3c11de7..35bdb96 100644
--- a/Doc/glossary.rst
+++ b/Doc/glossary.rst
@@ -34,7 +34,7 @@ Glossary
subclasses, which are classes that don't inherit from a class but are
still recognized by :func:`isinstance` and :func:`issubclass`; see the
:mod:`abc` module documentation. Python comes with many built-in ABCs for
- data structures (in the :mod:`collections` module), numbers (in the
+ data structures (in the :mod:`collections.abc` module), numbers (in the
:mod:`numbers` module), streams (in the :mod:`io` module), import finders
and loaders (in the :mod:`importlib.abc` module). You can create your own
ABCs with the :mod:`abc` module.
@@ -209,9 +209,9 @@ Glossary
finder
An object that tries to find the :term:`loader` for a module. It must
- implement a method named :meth:`find_module`. See :pep:`302` for
- details and :class:`importlib.abc.Finder` for an
- :term:`abstract base class`.
+ implement either a method named :meth:`find_loader` or a method named
+ :meth:`find_module`. See :pep:`302` and :pep:`420` for details and
+ :class:`importlib.abc.Finder` for an :term:`abstract base class`.
floor division
Mathematical division that rounds down to nearest integer. The floor
@@ -315,6 +315,17 @@ Glossary
role in places where a constant hash value is needed, for example as a key
in a dictionary.
+ import path
+ A list of locations (or :term:`path entries <path entry>`) that are
+ searched by the :term:`path based finder` for modules to import. During
+ import, this list of locations usually comes from :data:`sys.path`, but
+ for subpackages it may also come from the parent package's ``__path__``
+ attribute.
+
+ importing
+ The process by which Python code in one module is made available to
+ Python code in another module.
+
importer
An object that both finds and loads a module; both a
:term:`finder` and :term:`loader` object.
@@ -434,12 +445,17 @@ Glossary
mapping
A container object that supports arbitrary key lookups and implements the
- methods specified in the :class:`~collections.Mapping` or
- :class:`~collections.MutableMapping`
+ methods specified in the :class:`~collections.abc.Mapping` or
+ :class:`~collections.abc.MutableMapping`
:ref:`abstract base classes <collections-abstract-base-classes>`. Examples
include :class:`dict`, :class:`collections.defaultdict`,
:class:`collections.OrderedDict` and :class:`collections.Counter`.
+ meta path finder
+ A finder returned by a search of :data:`sys.meta_path`. Meta path
+ finders are related to, but different from :term:`path entry finders
+ <path entry finder>`.
+
metaclass
The class of a class. Class definitions create a class name, a class
dictionary, and a list of base classes. The metaclass is responsible for
@@ -464,6 +480,11 @@ Glossary
for a member during lookup. See `The Python 2.3 Method Resolution Order
<http://www.python.org/download/releases/2.3/mro/>`_.
+ module
+ An object that serves as an organizational unit of Python code. Modules
+ have a namespace containing arbitrary Python objects. Modules are loaded
+ into Python by the process of :term:`importing`.
+
MRO
See :term:`method resolution order`.
@@ -496,6 +517,12 @@ Glossary
functions are implemented by the :mod:`random` and :mod:`itertools`
modules, respectively.
+ namespace package
+ A :pep:`420` :term:`package` which serves only as a container for
+ subpackages. Namespace packages may have no physical representation,
+ and specifically are not like a :term:`regular package` because they
+ have no ``__init__.py`` file.
+
nested scope
The ability to refer to a variable in an enclosing definition. For
instance, a function defined inside another function can refer to
@@ -516,6 +543,33 @@ Glossary
(methods). Also the ultimate base class of any :term:`new-style
class`.
+ package
+ A Python module which can contain submodules or recursively,
+ subpackages. Technically, a package is a Python module with an
+ ``__path__`` attribute.
+
+ path entry
+ A single location on the :term:`import path` which the :term:`path
+ based finder` consults to find modules for importing.
+
+ path entry finder
+ A :term:`finder` returned by a callable on :data:`sys.path_hooks`
+ (i.e. a :term:`path entry hook`) which knows how to locate modules given
+ a :term:`path entry`.
+
+ path entry hook
+ A callable on the :data:`sys.path_hook` list which returns a :term:`path
+ entry finder` if it knows how to find modules on a specific :term:`path
+ entry`.
+
+ path based finder
+ One of the default :term:`meta path finders <meta path finder>` which
+ searches an :term:`import path` for modules.
+
+ portion
+ A set of files in a single directory (possibly stored in a zip file)
+ that contribute to a namespace package, as defined in :pep:`420`.
+
positional argument
The arguments assigned to local names inside a function or method,
determined by the order in which they were given in the call. ``*`` is
@@ -523,9 +577,23 @@ Glossary
definition), or pass several arguments as a list to a function. See
:term:`argument`.
+ provisional package
+ A provisional package is one which has been deliberately excluded from
+ the standard library's backwards compatibility guarantees. While major
+ changes to such packages are not expected, as long as they are marked
+ provisional, backwards incompatible changes (up to and including removal
+ of the package) may occur if deemed necessary by core developers. Such
+ changes will not be made gratuitously -- they will occur only if serious
+ flaws are uncovered that were missed prior to the inclusion of the
+ package.
+
+ This process allows the standard library to continue to evolve over
+ time, without locking in problematic design errors for extended periods
+ of time. See :pep:`411` for more details.
+
Python 3000
- Nickname for the Python 3.x release line (coined long ago when the release
- of version 3 was something in the distant future.) This is also
+ Nickname for the Python 3.x release line (coined long ago when the
+ release of version 3 was something in the distant future.) This is also
abbreviated "Py3k".
Pythonic
@@ -544,6 +612,32 @@ Glossary
for piece in food:
print(piece)
+ qualified name
+ A dotted name showing the "path" from a module's global scope to a
+ class, function or method defined in that module, as defined in
+ :pep:`3155`. For top-level functions and classes, the qualified name
+ is the same as the object's name::
+
+ >>> class C:
+ ... class D:
+ ... def meth(self):
+ ... pass
+ ...
+ >>> C.__qualname__
+ 'C'
+ >>> C.D.__qualname__
+ 'C.D'
+ >>> C.D.meth.__qualname__
+ 'C.D.meth'
+
+ When used to refer to modules, the *fully qualified name* means the
+ entire dotted path to the module, including any parent packages,
+ e.g. ``email.mime.text``::
+
+ >>> import email.mime.text
+ >>> email.mime.text.__name__
+ 'email.mime.text'
+
reference count
The number of references to an object. When the reference count of an
object drops to zero, it is deallocated. Reference counting is
@@ -552,6 +646,10 @@ Glossary
:func:`~sys.getrefcount` function that programmers can call to return the
reference count for a particular object.
+ regular package
+ A traditional :term:`package`, such as a directory containing an
+ ``__init__.py`` file.
+
__slots__
A declaration inside a class that saves memory by pre-declaring space for
instance attributes and eliminating instance dictionaries. Though
@@ -586,6 +684,14 @@ Glossary
an :term:`expression` or a one of several constructs with a keyword, such
as :keyword:`if`, :keyword:`while` or :keyword:`for`.
+ struct sequence
+ A tuple with named elements. Struct sequences expose an interface similar
+ to :term:`named tuple` in that elements can either be accessed either by
+ index or as an attribute. However, they do not have any of the named tuple
+ methods like :meth:`~collections.somenamedtuple._make` or
+ :meth:`~collections.somenamedtuple._asdict`. Examples of struct sequences
+ include :data:`sys.float_info` and the return value of :func:`os.stat`.
+
triple-quoted string
A string which is bound by three instances of either a quotation mark
(") or an apostrophe ('). While they don't provide any functionality
diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst
index 1616f67..0b513f9 100644
--- a/Doc/howto/descriptor.rst
+++ b/Doc/howto/descriptor.rst
@@ -36,9 +36,7 @@ continuing through the base classes of ``type(a)`` excluding metaclasses. If the
looked-up value is an object defining one of the descriptor methods, then Python
may override the default behavior and invoke the descriptor method instead.
Where this occurs in the precedence chain depends on which descriptor methods
-were defined. Note that descriptors are only invoked for new style objects or
-classes (a class is new style if it inherits from :class:`object` or
-:class:`type`).
+were defined.
Descriptors are a powerful, general purpose protocol. They are the mechanism
behind properties, methods, static methods, class methods, and :func:`super()`.
@@ -89,8 +87,6 @@ of ``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)`
is invoked according to the precedence rules listed below.
The details of invocation depend on whether ``obj`` is an object or a class.
-Either way, descriptors only work for new style objects and classes. A class is
-new style if it is a subclass of :class:`object`.
For objects, the machinery is in :meth:`object.__getattribute__` which
transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. The
@@ -115,7 +111,6 @@ The important points to remember are:
* descriptors are invoked by the :meth:`__getattribute__` method
* overriding :meth:`__getattribute__` prevents automatic descriptor calls
-* :meth:`__getattribute__` is only available with new style classes and objects
* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make
different calls to :meth:`__get__`.
* data descriptors always override instance dictionaries.
@@ -128,10 +123,7 @@ and then returns ``A.__dict__['m'].__get__(obj, A)``. If not a descriptor,
``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a
search using :meth:`object.__getattribute__`.
-Note, in Python 2.2, ``super(B, obj).m()`` would only invoke :meth:`__get__` if
-``m`` was a data descriptor. In Python 2.3, non-data descriptors also get
-invoked unless an old-style class is involved. The implementation details are
-in :c:func:`super_getattro()` in
+The implementation details are in :c:func:`super_getattro()` in
`Objects/typeobject.c <http://svn.python.org/view/python/trunk/Objects/typeobject.c?view=markup>`_
and a pure Python equivalent can be found in `Guido's Tutorial`_.
diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst
index ebbb229..b621a84 100644
--- a/Doc/howto/functional.rst
+++ b/Doc/howto/functional.rst
@@ -292,13 +292,14 @@ ordering of the objects in the dictionary.
Applying :func:`iter` to a dictionary always loops over the keys, but
dictionaries have methods that return other iterators. If you want to iterate
over values or key/value pairs, you can explicitly call the
-:meth:`~dict.values` or :meth:`~dict.items` methods to get an appropriate iterator.
+:meth:`~dict.values` or :meth:`~dict.items` methods to get an appropriate
+iterator.
The :func:`dict` constructor can accept an iterator that returns a finite stream
of ``(key, value)`` tuples:
>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
- >>> dict(iter(L))
+ >>> dict(iter(L)) #doctest: +SKIP
{'Italy': 'Rome', 'US': 'Washington DC', 'France': 'Paris'}
Files also support iteration by calling the :meth:`~io.TextIOBase.readline`
diff --git a/Doc/howto/index.rst b/Doc/howto/index.rst
index a11d3da..f44e8c0 100644
--- a/Doc/howto/index.rst
+++ b/Doc/howto/index.rst
@@ -28,4 +28,5 @@ Currently, the HOWTOs are:
urllib2.rst
webservers.rst
argparse.rst
+ ipaddress.rst
diff --git a/Doc/howto/ipaddress.rst b/Doc/howto/ipaddress.rst
new file mode 100644
index 0000000..5e0ff3e
--- /dev/null
+++ b/Doc/howto/ipaddress.rst
@@ -0,0 +1,341 @@
+.. _ipaddress-howto:
+
+***************************************
+An introduction to the ipaddress module
+***************************************
+
+:author: Peter Moody
+:author: Nick Coghlan
+
+.. topic:: Overview
+
+ This document aims to provide a gentle introduction to the
+ :mod:`ipaddress` module. It is aimed primarily at users that aren't
+ already familiar with IP networking terminology, but may also be useful
+ to network engineers wanting an overview of how :mod:`ipaddress`
+ represents IP network addressing concepts.
+
+
+Creating Address/Network/Interface objects
+==========================================
+
+Since :mod:`ipaddress` is a module for inspecting and manipulating IP addresses,
+the first thing you'll want to do is create some objects. You can use
+:mod:`ipaddress` to create objects from strings and integers.
+
+
+A Note on IP Versions
+---------------------
+
+For readers that aren't particularly familiar with IP addressing, it's
+important to know that the Internet Protocol is currently in the process
+of moving from version 4 of the protocol to version 6. This transition is
+occurring largely because version 4 of the protocol doesn't provide enough
+addresses to handle the needs of the whole world, especially given the
+increasing number of devices with direct connections to the internet.
+
+Explaining the details of the differences between the two versions of the
+protocol is beyond the scope of this introduction, but readers need to at
+least be aware that these two versions exist, and it will sometimes be
+necessary to force the use of one version or the other.
+
+
+IP Host Addresses
+-----------------
+
+Addresses, often referred to as "host addresses" are the most basic unit
+when working with IP addressing. The simplest way to create addresses is
+to use the :func:`ipaddress.ip_address` factory function, which automatically
+determines whether to create an IPv4 or IPv6 address based on the passed in
+value:
+
+.. testsetup::
+ >>> import ipaddress
+
+::
+
+ >>> ipaddress.ip_address('192.0.2.1')
+ IPv4Address('192.0.2.1')
+ >>> ipaddress.ip_address('2001:DB8::1')
+ IPv6Address('2001:db8::1')
+
+Addresses can also be created directly from integers. Values that will
+fit within 32 bits are assumed to be IPv4 addresses::
+
+ >>> ipaddress.ip_address(3221225985)
+ IPv4Address('192.0.2.1')
+ >>> ipaddress.ip_address(42540766411282592856903984951653826561)
+ IPv6Address('2001:db8::1')
+
+To force the use of IPv4 or IPv6 addresses, the relevant classes can be
+invoked directly. This is particularly useful to force creation of IPv6
+addresses for small integers::
+
+ >>> ipaddress.ip_address(1)
+ IPv4Address('0.0.0.1')
+ >>> ipaddress.IPv4Address(1)
+ IPv4Address('0.0.0.1')
+ >>> ipaddress.IPv6Address(1)
+ IPv6Address('::1')
+
+
+Defining Networks
+-----------------
+
+Host addresses are usually grouped together into IP networks, so
+:mod:`ipaddress` provides a way to create, inspect and manipulate network
+definitions. IP network objects are constructed from strings that define the
+range of host addresses that are part of that network. The simplest form
+for that information is a "network address/network prefix" pair, where the
+prefix defines the number of leading bits that are compared to determine
+whether or not an address is part of the network and the network address
+defines the expected value of those bits.
+
+As for addresses, a factory function is provided that determines the correct
+IP version automatically::
+
+ >>> ipaddress.ip_network('192.0.2.0/24')
+ IPv4Network('192.0.2.0/24')
+ >>> ipaddress.ip_network('2001:db8::0/96')
+ IPv6Network('2001:db8::/96')
+
+Network objects cannot have any host bits set. The practical effect of this
+is that ``192.0.2.1/24`` does not describe a network. Such definitions are
+referred to as interface objects since the ip-on-a-network notation is
+commonly used to describe network interfaces of a computer on a given network
+and are described further in the next section.
+
+By default, attempting to create a network object with host bits set will
+result in :exc:`ValueError` being raised. To request that the
+additional bits instead be coerced to zero, the flag ``strict=False`` can
+be passed to the constructor::
+
+ >>> ipaddress.ip_network('192.0.2.1/24')
+ Traceback (most recent call last):
+ ...
+ ValueError: 192.0.2.1/24 has host bits set
+ >>> ipaddress.ip_network('192.0.2.1/24', strict=False)
+ IPv4Network('192.0.2.0/24')
+
+While the string form offers significantly more flexibility, networks can
+also be defined with integers, just like host addresses. In this case, the
+network is considered to contain only the single address identified by the
+integer, so the network prefix includes the entire network address::
+
+ >>> ipaddress.ip_network(3221225984)
+ IPv4Network('192.0.2.0/32')
+ >>> ipaddress.ip_network(42540766411282592856903984951653826560)
+ IPv6Network('2001:db8::/128')
+
+As with addresses, creation of a particular kind of network can be forced
+by calling the class constructor directly instead of using the factory
+function.
+
+
+Host Interfaces
+---------------
+
+As mentioned just above, if you need to describe an address on a particular
+network, neither the address nor the network classes are sufficient.
+Notation like ``192.0.2.1/24`` is commonly used by network engineers and the
+people who write tools for firewalls and routers as shorthand for "the host
+``192.0.2.1`` on the network ``192.0.2.0/24``", Accordingly, :mod:`ipaddress`
+provides a set of hybrid classes that associate an address with a particular
+network. The interface for creation is identical to that for defining network
+objects, except that the address portion isn't constrained to being a network
+address.
+
+ >>> ipaddress.ip_interface('192.0.2.1/24')
+ IPv4Interface('192.0.2.1/24')
+ >>> ipaddress.ip_interface('2001:db8::1/96')
+ IPv6Interface('2001:db8::1/96')
+
+Integer inputs are accepted (as with networks), and use of a particular IP
+version can be forced by calling the relevant constructor directly.
+
+
+Inspecting Address/Network/Interface Objects
+============================================
+
+You've gone to the trouble of creating an IPv(4|6)(Address|Network|Interface)
+object, so you probably want to get information about it. :mod:`ipaddress`
+tries to make doing this easy and intuitive.
+
+Extracting the IP version::
+
+ >>> addr4 = ipaddress.ip_address('192.0.2.1')
+ >>> addr6 = ipaddress.ip_address('2001:db8::1')
+ >>> addr6.version
+ 6
+ >>> addr4.version
+ 4
+
+Obtaining the network from an interface::
+
+ >>> host4 = ipaddress.ip_interface('192.0.2.1/24')
+ >>> host4.network
+ IPv4Network('192.0.2.0/24')
+ >>> host6 = ipaddress.ip_interface('2001:db8::1/96')
+ >>> host6.network
+ IPv6Network('2001:db8::/96')
+
+Finding out how many individual addresses are in a network::
+
+ >>> net4 = ipaddress.ip_network('192.0.2.0/24')
+ >>> net4.num_addresses
+ 256
+ >>> net6 = ipaddress.ip_network('2001:db8::0/96')
+ >>> net6.num_addresses
+ 4294967296
+
+Iterating through the "usable" addresses on a network::
+
+ >>> net4 = ipaddress.ip_network('192.0.2.0/24')
+ >>> for x in net4.hosts():
+ ... print(x) # doctest: +ELLIPSIS
+ 192.0.2.1
+ 192.0.2.2
+ 192.0.2.3
+ 192.0.2.4
+ ...
+ 192.0.2.252
+ 192.0.2.253
+ 192.0.2.254
+
+
+Obtaining the netmask (i.e. set bits corresponding to the network prefix) or
+the hostmask (any bits that are not part of the netmask):
+
+ >>> net4 = ipaddress.ip_network('192.0.2.0/24')
+ >>> net4.netmask
+ IPv4Address('255.255.255.0')
+ >>> net4.hostmask
+ IPv4Address('0.0.0.255')
+ >>> net6 = ipaddress.ip_network('2001:db8::0/96')
+ >>> net6.netmask
+ IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
+ >>> net6.hostmask
+ IPv6Address('::ffff:ffff')
+
+
+Exploding or compressing the address::
+
+ >>> addr6.exploded
+ '2001:0db8:0000:0000:0000:0000:0000:0001'
+ >>> addr6.compressed
+ '2001:db8::1'
+ >>> net6.exploded
+ '2001:0db8:0000:0000:0000:0000:0000:0000/96'
+ >>> net6.compressed
+ '2001:db8::/96'
+
+While IPv4 doesn't support explosion or compression, the associated objects
+still provide the relevant properties so that version neutral code can
+easily ensure the most concise or most verbose form is used for IPv6
+addresses while still correctly handling IPv4 addresses.
+
+
+Networks as lists of Addresses
+==============================
+
+It's sometimes useful to treat networks as lists. This means it is possible
+to index them like this::
+
+ >>> net4[1]
+ IPv4Address('192.0.2.1')
+ >>> net4[-1]
+ IPv4Address('192.0.2.255')
+ >>> net6[1]
+ IPv6Address('2001:db8::1')
+ >>> net6[-1]
+ IPv6Address('2001:db8::ffff:ffff')
+
+
+It also means that network objects lend themselves to using the list
+membership test syntax like this::
+
+ if address in network:
+ # do something
+
+Containment testing is done efficiently based on the network prefix::
+
+ >>> addr4 = ipaddress.ip_address('192.0.2.1')
+ >>> addr4 in ipaddress.ip_network('192.0.2.0/24')
+ True
+ >>> addr4 in ipaddress.ip_network('192.0.3.0/24')
+ False
+
+
+Comparisons
+===========
+
+:mod:`ipaddress` provides some simple, hopefully intuitive ways to compare
+objects, where it makes sense::
+
+ >>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')
+ True
+
+A :exc:`TypeError` exception is raised if you try to compare objects of
+different versions or different types.
+
+
+Using IP Addresses with other modules
+=====================================
+
+Other modules that use IP addresses (such as :mod:`socket`) usually won't
+accept objects from this module directly. Instead, they must be coerced to
+an integer or string that the other module will accept::
+
+ >>> addr4 = ipaddress.ip_address('192.0.2.1')
+ >>> str(addr4)
+ '192.0.2.1'
+ >>> int(addr4)
+ 3221225985
+
+
+Getting more detail when instance creation fails
+================================================
+
+When creating address/network/interface objects using the version-agnostic
+factory functions, any errors will be reported as :exc:`ValueError` with
+a generic error message that simply says the passed in value was not
+recognized as an object of that type. The lack of a specific error is
+because it's necessary to know whether the value is *supposed* to be IPv4
+or IPv6 in order to provide more detail on why it has been rejected.
+
+To support use cases where it is useful to have access to this additional
+detail, the individual class constructors actually raise the
+:exc:`ValueError` subclasses :exc:`ipaddress.AddressValueError` and
+:exc:`ipaddress.NetmaskValueError` to indicate exactly which part of
+the definition failed to parse correctly.
+
+The error messages are significantly more detailed when using the
+class constructors directly. For example::
+
+ >>> ipaddress.ip_address("192.168.0.256")
+ Traceback (most recent call last):
+ ...
+ ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
+ >>> ipaddress.IPv4Address("192.168.0.256")
+ Traceback (most recent call last):
+ ...
+ ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'
+
+ >>> ipaddress.ip_network("192.168.0.1/64")
+ Traceback (most recent call last):
+ ...
+ ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
+ >>> ipaddress.IPv4Network("192.168.0.1/64")
+ Traceback (most recent call last):
+ ...
+ ipaddress.NetmaskValueError: '64' is not a valid netmask
+
+However, both of the module specific exceptions have :exc:`ValueError` as their
+parent class, so if you're not concerned with the particular type of error,
+you can still write code like the following::
+
+ try:
+ network = ipaddress.IPv4Network(address)
+ except ValueError:
+ print('address/netmask is invalid for IPv4:', address)
+
diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
index 370c757..92af0ec 100644
--- a/Doc/howto/logging-cookbook.rst
+++ b/Doc/howto/logging-cookbook.rst
@@ -1316,6 +1316,33 @@ For more information about this configuration, you can see the `relevant
section <https://docs.djangoproject.com/en/1.3/topics/logging/#configuring-logging>`_
of the Django documentation.
+.. _cookbook-rotator-namer:
+
+Using a rotator and namer to customise log rotation processing
+--------------------------------------------------------------
+
+An example of how you can define a namer and rotator is given in the following
+snippet, which shows zlib-based compression of the log file::
+
+ def namer(name):
+ return name + ".gz"
+
+ def rotator(source, dest):
+ with open(source, "rb") as sf:
+ data = sf.read()
+ compressed = zlib.compress(data, 9)
+ with open(dest, "wb") as df:
+ df.write(compressed)
+ os.remove(source)
+
+ rh = logging.handlers.RotatingFileHandler(...)
+ rh.rotator = rotator
+ rh.namer = namer
+
+These are not "true" .gz files, as they are bare compressed data, with no
+"container" such as you’d find in an actual gzip file. This snippet is just
+for illustration purposes.
+
A more elaborate multiprocessing example
----------------------------------------
@@ -1572,7 +1599,7 @@ UTF-8, then you need to do the following:
'ASCII section\ufeffUnicode section'
- The Unicode code point ``'\feff```, when encoded using UTF-8, will be
+ The Unicode code point ``'\feff'``, when encoded using UTF-8, will be
encoded as a UTF-8 BOM -- the byte-string ``b'\xef\xbb\xbf'``.
#. Replace the ASCII section with whatever placeholders you like, but make sure
diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst
index 279bb3e..ca6528b 100644
--- a/Doc/howto/sockets.rst
+++ b/Doc/howto/sockets.rst
@@ -25,8 +25,8 @@ It's not really a tutorial - you'll still have work to do in getting things
working. It doesn't cover the fine points (and there are a lot of them), but I
hope it will give you enough background to begin using them decently.
-I'm only going to talk about INET sockets, but they account for at least 99% of
-the sockets in use. And I'll only talk about STREAM sockets - unless you really
+I'm only going to talk about INET (i.e. IPv4) sockets, but they account for at least 99% of
+the sockets in use. And I'll only talk about STREAM (i.e. TCP) sockets - unless you really
know what you're doing (in which case this HOWTO isn't for you!), you'll get
better behavior and performance from a STREAM socket than anything else. I will
try to clear up the mystery of what a socket is, as well as some hints on how to
@@ -208,10 +208,10 @@ length message::
totalsent = totalsent + sent
def myreceive(self):
- msg = ''
+ msg = b''
while len(msg) < MSGLEN:
chunk = self.sock.recv(MSGLEN-len(msg))
- if chunk == '':
+ if chunk == b'':
raise RuntimeError("socket connection broken")
msg = msg + chunk
return msg
@@ -371,12 +371,6 @@ have created a new socket to ``connect`` to someone else, put it in the
potential_writers list. If it shows up in the writable list, you have a decent
chance that it has connected.
-One very nasty problem with ``select``: if somewhere in those input lists of
-sockets is one which has died a nasty death, the ``select`` will fail. You then
-need to loop through every single damn socket in all those lists and do a
-``select([sock],[],[],0)`` until you find the bad one. That timeout of 0 means
-it won't take long, but it's ugly.
-
Actually, ``select`` can be handy even with blocking sockets. It's one way of
determining whether you will block - the socket returns as readable when there's
something in the buffers. However, this still doesn't help with the problem of
@@ -386,26 +380,6 @@ determining whether the other end is done, or just busy with something else.
files. Don't try this on Windows. On Windows, ``select`` works with sockets
only. Also note that in C, many of the more advanced socket options are done
differently on Windows. In fact, on Windows I usually use threads (which work
-very, very well) with my sockets. Face it, if you want any kind of performance,
-your code will look very different on Windows than on Unix.
-
-
-Performance
------------
+very, very well) with my sockets.
-There's no question that the fastest sockets code uses non-blocking sockets and
-select to multiplex them. You can put together something that will saturate a
-LAN connection without putting any strain on the CPU.
-
-The trouble is that an app written this way can't do much of anything else -
-it needs to be ready to shuffle bytes around at all times. Assuming that your
-app is actually supposed to do something more than that, threading is the
-optimal solution, (and using non-blocking sockets will be faster than using
-blocking sockets).
-
-Finally, remember that even though blocking sockets are somewhat slower than
-non-blocking, in many cases they are the "right" solution. After all, if your
-app is driven by the data it receives over a socket, there's not much sense in
-complicating the logic just so your app can wait on ``select`` instead of
-``recv``.
diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst
index f9eeae4..5d9e027 100644
--- a/Doc/howto/unicode.rst
+++ b/Doc/howto/unicode.rst
@@ -414,7 +414,7 @@ References
----------
The ``str`` type is described in the Python library reference at
-:ref:`typesseq`.
+:ref:`textseq`.
The documentation for the :mod:`unicodedata` module.
diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
index 87f42ba..955e455 100644
--- a/Doc/howto/urllib2.rst
+++ b/Doc/howto/urllib2.rst
@@ -56,6 +56,13 @@ The simplest way to use urllib.request is as follows::
response = urllib.request.urlopen('http://python.org/')
html = response.read()
+If you wish to retrieve a resource via URL and store it in a temporary location,
+you can do so via the :func:`urlretrieve` function::
+
+ import urllib.request
+ local_filename, headers = urllib.request.urlretrieve('http://python.org/')
+ html = open(local_filename)
+
Many uses of urllib will be that simple (note that instead of an 'http:' URL we
could have used an URL starting with 'ftp:', 'file:', etc.). However, it's the
purpose of this tutorial to explain the more complicated cases, concentrating on
diff --git a/Doc/includes/mp_benchmarks.py b/Doc/includes/mp_benchmarks.py
index acdf642..3763ea9 100644
--- a/Doc/includes/mp_benchmarks.py
+++ b/Doc/includes/mp_benchmarks.py
@@ -6,16 +6,12 @@
#
import time
-import sys
import multiprocessing
import threading
import queue
import gc
-if sys.platform == 'win32':
- _timer = time.clock
-else:
- _timer = time.time
+_timer = time.perf_counter
delta = 1
diff --git a/Doc/includes/noddy2.c b/Doc/includes/noddy2.c
index 9b8eafb..9641558 100644
--- a/Doc/includes/noddy2.c
+++ b/Doc/includes/noddy2.c
@@ -24,18 +24,16 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self = (Noddy *)type->tp_alloc(type, 0);
if (self != NULL) {
self->first = PyUnicode_FromString("");
- if (self->first == NULL)
- {
+ if (self->first == NULL) {
Py_DECREF(self);
return NULL;
- }
-
+ }
+
self->last = PyUnicode_FromString("");
- if (self->last == NULL)
- {
+ if (self->last == NULL) {
Py_DECREF(self);
return NULL;
- }
+ }
self->number = 0;
}
@@ -50,10 +48,10 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"first", "last", "number", NULL};
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
- &first, &last,
+ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
+ &first, &last,
&self->number))
- return -1;
+ return -1;
if (first) {
tmp = self->first;
@@ -86,15 +84,6 @@ static PyMemberDef Noddy_members[] = {
static PyObject *
Noddy_name(Noddy* self)
{
- static PyObject *format = NULL;
- PyObject *args, *result;
-
- if (format == NULL) {
- format = PyUnicode_FromString("%s %s");
- if (format == NULL)
- return NULL;
- }
-
if (self->first == NULL) {
PyErr_SetString(PyExc_AttributeError, "first");
return NULL;
@@ -105,14 +94,7 @@ Noddy_name(Noddy* self)
return NULL;
}
- args = Py_BuildValue("OO", self->first, self->last);
- if (args == NULL)
- return NULL;
-
- result = PyUnicode_Format(format, args);
- Py_DECREF(args);
-
- return result;
+ return PyUnicode_FromFormat("%S %S", self->first, self->last);
}
static PyMethodDef Noddy_methods[] = {
@@ -145,12 +127,12 @@ static PyTypeObject NoddyType = {
Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"Noddy objects", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
Noddy_methods, /* tp_methods */
Noddy_members, /* tp_members */
0, /* tp_getset */
@@ -173,7 +155,7 @@ static PyModuleDef noddy2module = {
};
PyMODINIT_FUNC
-PyInit_noddy2(void)
+PyInit_noddy2(void)
{
PyObject* m;
diff --git a/Doc/includes/noddy3.c b/Doc/includes/noddy3.c
index 89f3a77..8a5a753 100644
--- a/Doc/includes/noddy3.c
+++ b/Doc/includes/noddy3.c
@@ -24,18 +24,16 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self = (Noddy *)type->tp_alloc(type, 0);
if (self != NULL) {
self->first = PyUnicode_FromString("");
- if (self->first == NULL)
- {
+ if (self->first == NULL) {
Py_DECREF(self);
return NULL;
- }
-
+ }
+
self->last = PyUnicode_FromString("");
- if (self->last == NULL)
- {
+ if (self->last == NULL) {
Py_DECREF(self);
return NULL;
- }
+ }
self->number = 0;
}
@@ -50,10 +48,10 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"first", "last", "number", NULL};
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist,
- &first, &last,
+ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist,
+ &first, &last,
&self->number))
- return -1;
+ return -1;
if (first) {
tmp = self->first;
@@ -88,22 +86,22 @@ Noddy_getfirst(Noddy *self, void *closure)
static int
Noddy_setfirst(Noddy *self, PyObject *value, void *closure)
{
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
- return -1;
- }
-
- if (! PyUnicode_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "The first attribute value must be a string");
- return -1;
- }
-
- Py_DECREF(self->first);
- Py_INCREF(value);
- self->first = value;
-
- return 0;
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
+ return -1;
+ }
+
+ if (! PyUnicode_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "The first attribute value must be a string");
+ return -1;
+ }
+
+ Py_DECREF(self->first);
+ Py_INCREF(value);
+ self->first = value;
+
+ return 0;
}
static PyObject *
@@ -116,30 +114,30 @@ Noddy_getlast(Noddy *self, void *closure)
static int
Noddy_setlast(Noddy *self, PyObject *value, void *closure)
{
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
- return -1;
- }
-
- if (! PyUnicode_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "The last attribute value must be a string");
- return -1;
- }
-
- Py_DECREF(self->last);
- Py_INCREF(value);
- self->last = value;
-
- return 0;
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
+ return -1;
+ }
+
+ if (! PyUnicode_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "The last attribute value must be a string");
+ return -1;
+ }
+
+ Py_DECREF(self->last);
+ Py_INCREF(value);
+ self->last = value;
+
+ return 0;
}
static PyGetSetDef Noddy_getseters[] = {
- {"first",
+ {"first",
(getter)Noddy_getfirst, (setter)Noddy_setfirst,
"first name",
NULL},
- {"last",
+ {"last",
(getter)Noddy_getlast, (setter)Noddy_setlast,
"last name",
NULL},
@@ -149,23 +147,7 @@ static PyGetSetDef Noddy_getseters[] = {
static PyObject *
Noddy_name(Noddy* self)
{
- static PyObject *format = NULL;
- PyObject *args, *result;
-
- if (format == NULL) {
- format = PyUnicode_FromString("%s %s");
- if (format == NULL)
- return NULL;
- }
-
- args = Py_BuildValue("OO", self->first, self->last);
- if (args == NULL)
- return NULL;
-
- result = PyUnicode_Format(format, args);
- Py_DECREF(args);
-
- return result;
+ return PyUnicode_FromFormat("%S %S", self->first, self->last);
}
static PyMethodDef Noddy_methods[] = {
@@ -198,12 +180,12 @@ static PyTypeObject NoddyType = {
Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"Noddy objects", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
Noddy_methods, /* tp_methods */
Noddy_members, /* tp_members */
Noddy_getseters, /* tp_getset */
@@ -226,7 +208,7 @@ static PyModuleDef noddy3module = {
};
PyMODINIT_FUNC
-PyInit_noddy3(void)
+PyInit_noddy3(void)
{
PyObject* m;
diff --git a/Doc/includes/noddy4.c b/Doc/includes/noddy4.c
index 6a96fac..eb9622a 100644
--- a/Doc/includes/noddy4.c
+++ b/Doc/includes/noddy4.c
@@ -27,7 +27,7 @@ Noddy_traverse(Noddy *self, visitproc visit, void *arg)
return 0;
}
-static int
+static int
Noddy_clear(Noddy *self)
{
PyObject *tmp;
@@ -58,18 +58,16 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self = (Noddy *)type->tp_alloc(type, 0);
if (self != NULL) {
self->first = PyUnicode_FromString("");
- if (self->first == NULL)
- {
+ if (self->first == NULL) {
Py_DECREF(self);
return NULL;
- }
-
+ }
+
self->last = PyUnicode_FromString("");
- if (self->last == NULL)
- {
+ if (self->last == NULL) {
Py_DECREF(self);
return NULL;
- }
+ }
self->number = 0;
}
@@ -84,10 +82,10 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"first", "last", "number", NULL};
- if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
- &first, &last,
+ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
+ &first, &last,
&self->number))
- return -1;
+ return -1;
if (first) {
tmp = self->first;
@@ -120,15 +118,6 @@ static PyMemberDef Noddy_members[] = {
static PyObject *
Noddy_name(Noddy* self)
{
- static PyObject *format = NULL;
- PyObject *args, *result;
-
- if (format == NULL) {
- format = PyUnicode_FromString("%s %s");
- if (format == NULL)
- return NULL;
- }
-
if (self->first == NULL) {
PyErr_SetString(PyExc_AttributeError, "first");
return NULL;
@@ -139,14 +128,7 @@ Noddy_name(Noddy* self)
return NULL;
}
- args = Py_BuildValue("OO", self->first, self->last);
- if (args == NULL)
- return NULL;
-
- result = PyUnicode_Format(format, args);
- Py_DECREF(args);
-
- return result;
+ return PyUnicode_FromFormat("%S %S", self->first, self->last);
}
static PyMethodDef Noddy_methods[] = {
@@ -182,10 +164,10 @@ static PyTypeObject NoddyType = {
"Noddy objects", /* tp_doc */
(traverseproc)Noddy_traverse, /* tp_traverse */
(inquiry)Noddy_clear, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
Noddy_methods, /* tp_methods */
Noddy_members, /* tp_members */
0, /* tp_getset */
@@ -208,7 +190,7 @@ static PyModuleDef noddy4module = {
};
PyMODINIT_FUNC
-PyInit_noddy4(void)
+PyInit_noddy4(void)
{
PyObject* m;
diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst
index 369e9cd..751c3e8 100644
--- a/Doc/library/_thread.rst
+++ b/Doc/library/_thread.rst
@@ -35,6 +35,9 @@ It defines the following constants and functions:
Raised on thread-specific errors.
+ .. versionchanged:: 3.3
+ This is now a synonym of the built-in :exc:`RuntimeError`.
+
.. data:: LockType
@@ -91,7 +94,7 @@ It defines the following constants and functions:
*size* argument specifies the stack size to be used for subsequently created
threads, and must be 0 (use platform or configured default) or a positive
integer value of at least 32,768 (32kB). If changing the thread stack size is
- unsupported, a :exc:`ThreadError` is raised. If the specified stack size is
+ unsupported, a :exc:`RuntimeError` is raised. If the specified stack size is
invalid, a :exc:`ValueError` is raised and the stack size is unmodified. 32kB
is currently the minimum supported stack size value to guarantee sufficient
stack space for the interpreter itself. Note that some platforms may have
diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst
index 1048b24..dca6993 100644
--- a/Doc/library/abc.rst
+++ b/Doc/library/abc.rst
@@ -18,7 +18,7 @@ regarding a type hierarchy for numbers based on ABCs.)
The :mod:`collections` module has some concrete classes that derive from
ABCs; these can, of course, be further derived. In addition the
-:mod:`collections` module has some ABCs that can be used to test whether
+:mod:`collections.abc` submodule has some ABCs that can be used to test whether
a class or instance provides a particular interface, for example, is it
hashable or a mapping.
@@ -55,6 +55,9 @@ This module provides the following class:
assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
+ .. versionchanged:: 3.3
+ Returns the registered subclass, to allow usage as a class decorator.
+
You can also override this method in an abstract base class:
.. method:: __subclasshook__(subclass)
@@ -124,19 +127,18 @@ This module provides the following class:
available as a method of ``Foo``, so it is provided separately.
-It also provides the following decorators:
+The :mod:`abc` module also provides the following decorators:
.. decorator:: abstractmethod(function)
A decorator indicating abstract methods.
- Using this decorator requires that the class's metaclass is :class:`ABCMeta` or
- is derived from it.
- A class that has a metaclass derived from :class:`ABCMeta`
- cannot be instantiated unless all of its abstract methods and
- properties are overridden.
- The abstract methods can be called using any of the normal 'super' call
- mechanisms.
+ Using this decorator requires that the class's metaclass is :class:`ABCMeta`
+ or is derived from it. A class that has a metaclass derived from
+ :class:`ABCMeta` cannot be instantiated unless all of its abstract methods
+ and properties are overridden. The abstract methods can be called using any
+ of the normal 'super' call mechanisms. :func:`abstractmethod` may be used
+ to declare abstract methods for properties and descriptors.
Dynamically adding abstract methods to a class, or attempting to modify the
abstraction status of a method or class once it is created, are not
@@ -144,12 +146,52 @@ It also provides the following decorators:
regular inheritance; "virtual subclasses" registered with the ABC's
:meth:`register` method are not affected.
- Usage::
+ When :func:`abstractmethod` is applied in combination with other method
+ descriptors, it should be applied as the innermost decorator, as shown in
+ the following usage examples::
class C(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self, ...):
...
+ @classmethod
+ @abstractmethod
+ def my_abstract_classmethod(cls, ...):
+ ...
+ @staticmethod
+ @abstractmethod
+ def my_abstract_staticmethod(...):
+ ...
+
+ @property
+ @abstractmethod
+ def my_abstract_property(self):
+ ...
+ @my_abstract_property.setter
+ @abstractmethod
+ def my_abstract_property(self, val):
+ ...
+
+ @abstractmethod
+ def _get_x(self):
+ ...
+ @abstractmethod
+ def _set_x(self, val):
+ ...
+ x = property(_get_x, _set_x)
+
+ In order to correctly interoperate with the abstract base class machinery,
+ the descriptor must identify itself as abstract using
+ :attr:`__isabstractmethod__`. In general, this attribute should be ``True``
+ if any of the methods used to compose the descriptor are abstract. For
+ example, Python's built-in property does the equivalent of::
+
+ class Descriptor:
+ ...
+ @property
+ def __isabstractmethod__(self):
+ return any(getattr(f, '__isabstractmethod__', False) for
+ f in (self._fget, self._fset, self._fdel))
.. note::
@@ -174,6 +216,8 @@ It also provides the following decorators:
...
.. versionadded:: 3.2
+ .. deprecated:: 3.3
+ Use :class:`classmethod` with :func:`abstractmethod` instead.
.. decorator:: abstractstaticmethod(function)
@@ -189,18 +233,19 @@ It also provides the following decorators:
...
.. versionadded:: 3.2
+ .. deprecated:: 3.3
+ Use :class:`staticmethod` with :func:`abstractmethod` instead.
-.. function:: abstractproperty(fget=None, fset=None, fdel=None, doc=None)
+.. decorator:: abstractproperty(fget=None, fset=None, fdel=None, doc=None)
A subclass of the built-in :func:`property`, indicating an abstract property.
- Using this function requires that the class's metaclass is :class:`ABCMeta` or
- is derived from it.
- A class that has a metaclass derived from :class:`ABCMeta` cannot be
- instantiated unless all of its abstract methods and properties are overridden.
- The abstract properties can be called using any of the normal
- 'super' call mechanisms.
+ Using this function requires that the class's metaclass is :class:`ABCMeta`
+ or is derived from it. A class that has a metaclass derived from
+ :class:`ABCMeta` cannot be instantiated unless all of its abstract methods
+ and properties are overridden. The abstract properties can be called using
+ any of the normal 'super' call mechanisms.
Usage::
@@ -217,6 +262,9 @@ It also provides the following decorators:
def setx(self, value): ...
x = abstractproperty(getx, setx)
+ .. deprecated:: 3.3
+ Use :class:`property` with :func:`abstractmethod` instead
+
.. rubric:: Footnotes
diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst
index 75d137c..c928494 100644
--- a/Doc/library/archiving.rst
+++ b/Doc/library/archiving.rst
@@ -5,8 +5,9 @@ Data Compression and Archiving
******************************
The modules described in this chapter support data compression with the zlib,
-gzip, and bzip2 algorithms, and the creation of ZIP- and tar-format archives.
-See also :ref:`archiving-operations` provided by the :mod:`shutil` module.
+gzip, bzip2 and lzma algorithms, and the creation of ZIP- and tar-format
+archives. See also :ref:`archiving-operations` provided by the :mod:`shutil`
+module.
.. toctree::
@@ -14,5 +15,6 @@ See also :ref:`archiving-operations` provided by the :mod:`shutil` module.
zlib.rst
gzip.rst
bz2.rst
+ lzma.rst
zipfile.rst
tarfile.rst
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
index 5273e9b..9f6a1ea 100644
--- a/Doc/library/argparse.rst
+++ b/Doc/library/argparse.rst
@@ -371,16 +371,16 @@ formatter_class
^^^^^^^^^^^^^^^
:class:`ArgumentParser` objects allow the help formatting to be customized by
-specifying an alternate formatting class. Currently, there are three such
+specifying an alternate formatting class. Currently, there are four such
classes:
.. class:: RawDescriptionHelpFormatter
RawTextHelpFormatter
ArgumentDefaultsHelpFormatter
+ MetavarTypeHelpFormatter
-The first two allow more control over how textual descriptions are displayed,
-while the last automatically adds information about argument default values.
-
+:class:`RawDescriptionHelpFormatter` and :class:`RawTextHelpFormatter` give
+more control over how textual descriptions are displayed.
By default, :class:`ArgumentParser` objects line-wrap the description_ and
epilog_ texts in command-line help messages::
@@ -433,8 +433,8 @@ should not be line-wrapped::
:class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text,
including argument descriptions.
-The other formatter class available, :class:`ArgumentDefaultsHelpFormatter`,
-will add information about the default value of each of the arguments::
+:class:`ArgumentDefaultsHelpFormatter` automatically adds information about
+default values to each of the argument help messages::
>>> parser = argparse.ArgumentParser(
... prog='PROG',
@@ -451,6 +451,25 @@ will add information about the default value of each of the arguments::
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
+:class:`MetavarTypeHelpFormatter` uses the name of the type_ argument for each
+argument as the display name for its values (rather than using the dest_
+as the regular formatter does)::
+
+ >>> parser = argparse.ArgumentParser(
+ ... prog='PROG',
+ ... formatter_class=argparse.MetavarTypeHelpFormatter)
+ >>> parser.add_argument('--foo', type=int)
+ >>> parser.add_argument('bar', type=float)
+ >>> parser.print_help()
+ usage: PROG [-h] [--foo int] float
+
+ positional arguments:
+ float
+
+ optional arguments:
+ -h, --help show this help message and exit
+ --foo int
+
conflict_handler
^^^^^^^^^^^^^^^^
diff --git a/Doc/library/array.rst b/Doc/library/array.rst
index d563cce..8f6943a 100644
--- a/Doc/library/array.rst
+++ b/Doc/library/array.rst
@@ -14,36 +14,54 @@ them is constrained. The type is specified at object creation time by using a
:dfn:`type code`, which is a single character. The following type codes are
defined:
-+-----------+----------------+-------------------+-----------------------+
-| Type code | C Type | Python Type | Minimum size in bytes |
-+===========+================+===================+=======================+
-| ``'b'`` | signed char | int | 1 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'B'`` | unsigned char | int | 1 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'u'`` | Py_UNICODE | Unicode character | 2 (see note) |
-+-----------+----------------+-------------------+-----------------------+
-| ``'h'`` | signed short | int | 2 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'H'`` | unsigned short | int | 2 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'i'`` | signed int | int | 2 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'I'`` | unsigned int | int | 2 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'l'`` | signed long | int | 4 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'L'`` | unsigned long | int | 4 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'f'`` | float | float | 4 |
-+-----------+----------------+-------------------+-----------------------+
-| ``'d'`` | double | float | 8 |
-+-----------+----------------+-------------------+-----------------------+
-
-.. note::
-
- The ``'u'`` typecode corresponds to Python's unicode character. On narrow
- Unicode builds this is 2-bytes, on wide builds this is 4-bytes.
++-----------+--------------------+-------------------+-----------------------+-------+
+| Type code | C Type | Python Type | Minimum size in bytes | Notes |
++===========+====================+===================+=======================+=======+
+| ``'b'`` | signed char | int | 1 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'B'`` | unsigned char | int | 1 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'u'`` | Py_UNICODE | Unicode character | 2 | \(1) |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'h'`` | signed short | int | 2 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'H'`` | unsigned short | int | 2 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'i'`` | signed int | int | 2 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'I'`` | unsigned int | int | 2 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'l'`` | signed long | int | 4 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'L'`` | unsigned long | int | 4 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'q'`` | signed long long | int | 8 | \(2) |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'Q'`` | unsigned long long | int | 8 | \(2) |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'f'`` | float | float | 4 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+| ``'d'`` | double | float | 8 | |
++-----------+--------------------+-------------------+-----------------------+-------+
+
+Notes:
+
+(1)
+ The ``'u'`` type code corresponds to Python's obsolete unicode character
+ (:c:type:`Py_UNICODE` which is :c:type:`wchar_t`). Depending on the
+ platform, it can be 16 bits or 32 bits.
+
+ ``'u'`` will be removed together with the rest of the :c:type:`Py_UNICODE`
+ API.
+
+ .. deprecated-removed:: 3.3 4.0
+
+(2)
+ The ``'q'`` and ``'Q'`` type codes are available only if
+ the platform C compiler used to build Python supports C :c:type:`long long`,
+ or, on Windows, :c:type:`__int64`.
+
+ .. versionadded:: 3.3
The actual representation of values is determined by the machine architecture
(strictly speaking, by the C implementation). The actual size can be accessed
diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst
index e2c0b6d..16de3ca 100644
--- a/Doc/library/ast.rst
+++ b/Doc/library/ast.rst
@@ -96,9 +96,6 @@ Node classes
Abstract Grammar
----------------
-The module defines a string constant ``__version__`` which is the decimal
-Subversion revision number of the file shown below.
-
The abstract grammar is currently defined as follows:
.. literalinclude:: ../../Parser/Python.asdl
diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst
index 75b3cda..55c61d7 100644
--- a/Doc/library/asynchat.rst
+++ b/Doc/library/asynchat.rst
@@ -197,6 +197,9 @@ The :meth:`handle_request` method is called once all relevant input has been
marshalled, after setting the channel terminator to ``None`` to ensure that
any extraneous data sent by the web client are ignored. ::
+
+ import asynchat
+
class http_request_handler(asynchat.async_chat):
def __init__(self, sock, addr, sessions, log):
diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst
index 619b7bb..7cacca1 100644
--- a/Doc/library/asyncore.rst
+++ b/Doc/library/asyncore.rst
@@ -184,12 +184,15 @@ any that have been added to the map during asynchronous service) is closed.
Most of these are nearly identical to their socket partners.
- .. method:: create_socket(family, type)
+ .. method:: create_socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
This is identical to the creation of a normal socket, and will use the
same options for creation. Refer to the :mod:`socket` documentation for
information on creating sockets.
+ .. versionchanged:: 3.3
+ *family* and *type* arguments can be omitted.
+
.. method:: connect(address)
@@ -274,13 +277,13 @@ asyncore Example basic HTTP client
Here is a very basic HTTP client that uses the :class:`dispatcher` class to
implement its socket handling::
- import asyncore, socket
+ import asyncore
class HTTPClient(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.create_socket()
self.connect( (host, 80) )
self.buffer = bytes('GET %s HTTP/1.0\r\nHost: %s\r\n\r\n' %
(path, host), 'ascii')
@@ -314,7 +317,6 @@ Here is a basic echo server that uses the :class:`dispatcher` class to accept
connections and dispatches the incoming connections to a handler::
import asyncore
- import socket
class EchoHandler(asyncore.dispatcher_with_send):
@@ -327,7 +329,7 @@ connections and dispatches the incoming connections to a handler::
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.create_socket()
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
@@ -338,4 +340,3 @@ connections and dispatches the incoming connections to a handler::
server = EchoServer('localhost', 8080)
asyncore.loop()
-
diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst
index 7c76bab..2e22cab 100644
--- a/Doc/library/atexit.rst
+++ b/Doc/library/atexit.rst
@@ -9,13 +9,14 @@
The :mod:`atexit` module defines functions to register and unregister cleanup
functions. Functions thus registered are automatically executed upon normal
-interpreter termination. The order in which the functions are called is not
-defined; if you have cleanup operations that depend on each other, you should
-wrap them in a function and register that one. This keeps :mod:`atexit` simple.
+interpreter termination. :mod:`atexit` runs these functions in the *reverse*
+order in which they were registered; if you register ``A``, ``B``, and ``C``,
+at interpreter termination time they will be run in the order ``C``, ``B``,
+``A``.
-Note: the functions registered via this module are not called when the program
-is killed by a signal not handled by Python, when a Python fatal internal error
-is detected, or when :func:`os._exit` is called.
+**Note:** The functions registered via this module are not called when the
+program is killed by a signal not handled by Python, when a Python fatal
+internal error is detected, or when :func:`os._exit` is called.
.. function:: register(func, *args, **kargs)
@@ -67,8 +68,9 @@ automatically when the program terminates without relying on the application
making an explicit call into this module at termination. ::
try:
- _count = int(open("/tmp/counter").read())
- except IOError:
+ with open("/tmp/counter") as infile:
+ _count = int(infile.read())
+ except FileNotFoundError:
_count = 0
def incrcounter(n):
@@ -76,7 +78,8 @@ making an explicit call into this module at termination. ::
_count = _count + n
def savecounter():
- open("/tmp/counter", "w").write("%d" % _count)
+ with open("/tmp/counter", "w") as outfile:
+ outfile.write("%d" % _count)
import atexit
atexit.register(savecounter)
diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst
index c08df15..ade0f07 100644
--- a/Doc/library/base64.rst
+++ b/Doc/library/base64.rst
@@ -18,9 +18,14 @@ POST request. The encoding algorithm is not the same as the
There are two interfaces provided by this module. The modern interface
supports encoding and decoding ASCII byte string objects using all three
-alphabets. The legacy interface provides for encoding and decoding to and from
-file-like objects as well as byte strings, but only using the Base64 standard
-alphabet.
+alphabets. Additionally, the decoding functions of the modern interface also
+accept Unicode strings containing only ASCII characters. The legacy interface
+provides for encoding and decoding to and from file-like objects as well as
+byte strings, but only using the Base64 standard alphabet.
+
+.. versionchanged:: 3.3
+ ASCII-only Unicode strings are now accepted by the decoding functions of
+ the modern interface.
The modern interface provides:
diff --git a/Doc/library/binary.rst b/Doc/library/binary.rst
new file mode 100644
index 0000000..51fbdc1
--- /dev/null
+++ b/Doc/library/binary.rst
@@ -0,0 +1,23 @@
+.. _binaryservices:
+
+********************
+Binary Data Services
+********************
+
+The modules described in this chapter provide some basic services operations
+for manipulation of binary data. Other operations on binary data, specifically
+in relation to file formats and network protocols, are described in the
+relevant sections.
+
+Some libraries described under :ref:`textservices` also work with either
+ASCII-compatible binary formats (for example, :mod:`re`) or all binary data
+(for example, :mod:`difflib`).
+
+In addition, see the documentation for Python's built-in binary data types in
+:ref:`binaryseq`.
+
+.. toctree::
+
+ struct.rst
+ codecs.rst
+
diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst
index 2aa3702..baf430d 100644
--- a/Doc/library/binascii.rst
+++ b/Doc/library/binascii.rst
@@ -20,8 +20,13 @@ higher-level modules.
.. note::
- Encoding and decoding functions do not accept Unicode strings. Only bytestring
- and bytearray objects can be processed.
+ ``a2b_*`` functions accept Unicode strings containing only ASCII characters.
+ Other functions only accept bytes and bytes-compatible objects (such as
+ bytearray objects and other objects implementing the buffer API).
+
+ .. versionchanged:: 3.3
+ ASCII-only unicode strings are now accepted by the ``a2b_*`` functions.
+
The :mod:`binascii` module defines the following functions:
diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst
index 93144b6..d06a39a 100644
--- a/Doc/library/bz2.rst
+++ b/Doc/library/bz2.rst
@@ -1,201 +1,202 @@
-:mod:`bz2` --- Compression compatible with :program:`bzip2`
-===========================================================
+:mod:`bz2` --- Support for :program:`bzip2` compression
+=======================================================
.. module:: bz2
- :synopsis: Interface to compression and decompression routines
- compatible with bzip2.
+ :synopsis: Interfaces for bzip2 compression and decompression.
.. moduleauthor:: Gustavo Niemeyer <niemeyer@conectiva.com>
+.. moduleauthor:: Nadeem Vawda <nadeem.vawda@gmail.com>
.. sectionauthor:: Gustavo Niemeyer <niemeyer@conectiva.com>
+.. sectionauthor:: Nadeem Vawda <nadeem.vawda@gmail.com>
-This module provides a comprehensive interface for the bz2 compression library.
-It implements a complete file interface, one-shot (de)compression functions, and
-types for sequential (de)compression.
+This module provides a comprehensive interface for compressing and
+decompressing data using the bzip2 compression algorithm.
-Here is a summary of the features offered by the bz2 module:
+The :mod:`bz2` module contains:
-* :class:`BZ2File` class implements a complete file interface, including
- :meth:`~BZ2File.readline`, :meth:`~BZ2File.readlines`,
- :meth:`~BZ2File.writelines`, :meth:`~BZ2File.seek`, etc;
+* The :func:`.open` function and :class:`BZ2File` class for reading and
+ writing compressed files.
+* The :class:`BZ2Compressor` and :class:`BZ2Decompressor` classes for
+ incremental (de)compression.
+* The :func:`compress` and :func:`decompress` functions for one-shot
+ (de)compression.
-* :class:`BZ2File` class implements emulated :meth:`~BZ2File.seek` support;
-
-* :class:`BZ2File` class implements universal newline support;
-
-* :class:`BZ2File` class offers an optimized line iteration using a readahead
- algorithm;
-
-* Sequential (de)compression supported by :class:`BZ2Compressor` and
- :class:`BZ2Decompressor` classes;
-
-* One-shot (de)compression supported by :func:`compress` and :func:`decompress`
- functions;
-
-* Thread safety uses individual locking mechanism.
+All of the classes in this module may safely be accessed from multiple threads.
(De)compression of files
------------------------
-Handling of compressed files is offered by the :class:`BZ2File` class.
+.. function:: open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None)
+ Open a bzip2-compressed file in binary or text mode, returning a :term:`file
+ object`.
-.. index::
- single: universal newlines; bz2.BZ2File class
+ As with the constructor for :class:`BZ2File`, the *filename* argument can be
+ an actual filename (a :class:`str` or :class:`bytes` object), or an existing
+ file object to read from or write to.
-.. class:: BZ2File(filename, mode='r', buffering=0, compresslevel=9)
+ The *mode* argument can be any of ``'r'``, ``'rb'``, ``'w'``, ``'wb'``,
+ ``'a'``, or ``'ab'`` for binary mode, or ``'rt'``, ``'wt'``, or ``'at'`` for
+ text mode. The default is ``'rb'``.
- Open a bz2 file. Mode can be either ``'r'`` or ``'w'``, for reading (default)
- or writing. When opened for writing, the file will be created if it doesn't
- exist, and truncated otherwise. If *buffering* is given, ``0`` means
- unbuffered, and larger numbers specify the buffer size; the default is
- ``0``. If *compresslevel* is given, it must be a number between ``1`` and
- ``9``; the default is ``9``. Add a ``'U'`` to mode to open the file for input
- in :term:`universal newlines` mode. Any line ending in the input file will be
- seen as a ``'\n'`` in Python. Also, a file so opened gains the attribute
- :attr:`newlines`; the value for this attribute is one of ``None`` (no newline
- read yet), ``'\r'``, ``'\n'``, ``'\r\n'`` or a tuple containing all the
- newline types seen. Universal newlines are available only when
- reading. Instances support iteration in the same way as normal :class:`file`
- instances.
+ The *compresslevel* argument is an integer from 1 to 9, as for the
+ :class:`BZ2File` constructor.
- :class:`BZ2File` supports the :keyword:`with` statement.
+ For binary mode, this function is equivalent to the :class:`BZ2File`
+ constructor: ``BZ2File(filename, mode, compresslevel=compresslevel)``. In
+ this case, the *encoding*, *errors* and *newline* arguments must not be
+ provided.
- .. versionchanged:: 3.1
- Support for the :keyword:`with` statement was added.
+ For text mode, a :class:`BZ2File` object is created, and wrapped in an
+ :class:`io.TextIOWrapper` instance with the specified encoding, error
+ handling behavior, and line ending(s).
+ .. versionadded:: 3.3
- .. note::
- This class does not support input files containing multiple streams (such
- as those produced by the :program:`pbzip2` tool). When reading such an
- input file, only the first stream will be accessible. If you require
- support for multi-stream files, consider using the third-party
- :mod:`bz2file` module (available from
- `PyPI <http://pypi.python.org/pypi/bz2file>`_). This module provides a
- backport of Python 3.3's :class:`BZ2File` class, which does support
- multi-stream files.
+.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9)
+ Open a bzip2-compressed file in binary mode.
- .. method:: close()
+ If *filename* is a :class:`str` or :class:`bytes` object, open the named file
+ directly. Otherwise, *filename* should be a :term:`file object`, which will
+ be used to read or write the compressed data.
- Close the file. Sets data attribute :attr:`closed` to true. A closed file
- cannot be used for further I/O operations. :meth:`close` may be called
- more than once without error.
+ The *mode* argument can be either ``'r'`` for reading (default), ``'w'`` for
+ overwriting, or ``'a'`` for appending. These can equivalently be given as
+ ``'rb'``, ``'wb'``, and ``'ab'`` respectively.
+ If *filename* is a file object (rather than an actual file name), a mode of
+ ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``.
- .. method:: read([size])
+ The *buffering* argument is ignored. Its use is deprecated.
- Read at most *size* uncompressed bytes, returned as a byte string. If the
- *size* argument is negative or omitted, read until EOF is reached.
+ If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be a number between
+ ``1`` and ``9`` specifying the level of compression: ``1`` produces the
+ least compression, and ``9`` (default) produces the most compression.
+ If *mode* is ``'r'``, the input file may be the concatenation of multiple
+ compressed streams.
- .. method:: readline([size])
+ :class:`BZ2File` provides all of the members specified by the
+ :class:`io.BufferedIOBase`, except for :meth:`detach` and :meth:`truncate`.
+ Iteration and the :keyword:`with` statement are supported.
- Return the next line from the file, as a byte string, retaining newline.
- A non-negative *size* argument limits the maximum number of bytes to
- return (an incomplete line may be returned then). Return an empty byte
- string at EOF.
+ :class:`BZ2File` also provides the following method:
+ .. method:: peek([n])
- .. method:: readlines([size])
+ Return buffered data without advancing the file position. At least one
+ byte of data will be returned (unless at EOF). The exact number of bytes
+ returned is unspecified.
- Return a list of lines read. The optional *size* argument, if given, is an
- approximate bound on the total number of bytes in the lines returned.
+ .. versionadded:: 3.3
+ .. versionchanged:: 3.1
+ Support for the :keyword:`with` statement was added.
- .. method:: seek(offset[, whence])
+ .. versionchanged:: 3.3
+ The :meth:`fileno`, :meth:`readable`, :meth:`seekable`, :meth:`writable`,
+ :meth:`read1` and :meth:`readinto` methods were added.
- Move to new file position. Argument *offset* is a byte count. Optional
- argument *whence* defaults to ``os.SEEK_SET`` or ``0`` (offset from start
- of file; offset should be ``>= 0``); other values are ``os.SEEK_CUR`` or
- ``1`` (move relative to current position; offset can be positive or
- negative), and ``os.SEEK_END`` or ``2`` (move relative to end of file;
- offset is usually negative, although many platforms allow seeking beyond
- the end of a file).
+ .. versionchanged:: 3.3
+ Support was added for *filename* being a :term:`file object` instead of an
+ actual filename.
- Note that seeking of bz2 files is emulated, and depending on the
- parameters the operation may be extremely slow.
+ .. versionchanged:: 3.3
+ The ``'a'`` (append) mode was added, along with support for reading
+ multi-stream files.
- .. method:: tell()
+Incremental (de)compression
+---------------------------
- Return the current file position, an integer.
+.. class:: BZ2Compressor(compresslevel=9)
+ Create a new compressor object. This object may be used to compress data
+ incrementally. For one-shot compression, use the :func:`compress` function
+ instead.
- .. method:: write(data)
+ *compresslevel*, if given, must be a number between ``1`` and ``9``. The
+ default is ``9``.
- Write the byte string *data* to file. Note that due to buffering,
- :meth:`close` may be needed before the file on disk reflects the data
- written.
+ .. method:: compress(data)
+ Provide data to the compressor object. Returns a chunk of compressed data
+ if possible, or an empty byte string otherwise.
- .. method:: writelines(sequence_of_byte_strings)
+ When you have finished providing data to the compressor, call the
+ :meth:`flush` method to finish the compression process.
- Write the sequence of byte strings to the file. Note that newlines are not
- added. The sequence can be any iterable object producing byte strings.
- This is equivalent to calling write() for each byte string.
+ .. method:: flush()
-Sequential (de)compression
---------------------------
+ Finish the compression process. Returns the compressed data left in
+ internal buffers.
-Sequential compression and decompression is done using the classes
-:class:`BZ2Compressor` and :class:`BZ2Decompressor`.
+ The compressor object may not be used after this method has been called.
-.. class:: BZ2Compressor(compresslevel=9)
+.. class:: BZ2Decompressor()
- Create a new compressor object. This object may be used to compress data
- sequentially. If you want to compress data in one shot, use the
- :func:`compress` function instead. The *compresslevel* parameter, if given,
- must be a number between ``1`` and ``9``; the default is ``9``.
+ Create a new decompressor object. This object may be used to decompress data
+ incrementally. For one-shot compression, use the :func:`decompress` function
+ instead.
- .. method:: compress(data)
+ .. note::
+ This class does not transparently handle inputs containing multiple
+ compressed streams, unlike :func:`decompress` and :class:`BZ2File`. If
+ you need to decompress a multi-stream input with :class:`BZ2Decompressor`,
+ you must use a new decompressor for each stream.
- Provide more data to the compressor object. It will return chunks of
- compressed data whenever possible. When you've finished providing data to
- compress, call the :meth:`flush` method to finish the compression process,
- and return what is left in internal buffers.
+ .. method:: decompress(data)
+ Provide data to the decompressor object. Returns a chunk of decompressed
+ data if possible, or an empty byte string otherwise.
- .. method:: flush()
+ Attempting to decompress data after the end of the current stream is
+ reached raises an :exc:`EOFError`. If any data is found after the end of
+ the stream, it is ignored and saved in the :attr:`unused_data` attribute.
- Finish the compression process and return what is left in internal
- buffers. You must not use the compressor object after calling this method.
+ .. attribute:: eof
-.. class:: BZ2Decompressor()
+ True if the end-of-stream marker has been reached.
- Create a new decompressor object. This object may be used to decompress data
- sequentially. If you want to decompress data in one shot, use the
- :func:`decompress` function instead.
+ .. versionadded:: 3.3
- .. method:: decompress(data)
- Provide more data to the decompressor object. It will return chunks of
- decompressed data whenever possible. If you try to decompress data after
- the end of stream is found, :exc:`EOFError` will be raised. If any data
- was found after the end of stream, it'll be ignored and saved in
- :attr:`unused_data` attribute.
+ .. attribute:: unused_data
+
+ Data found after the end of the compressed stream.
+
+ If this attribute is accessed before the end of the stream has been
+ reached, its value will be ``b''``.
One-shot (de)compression
------------------------
-One-shot compression and decompression is provided through the :func:`compress`
-and :func:`decompress` functions.
+.. function:: compress(data, compresslevel=9)
+ Compress *data*.
-.. function:: compress(data, compresslevel=9)
+ *compresslevel*, if given, must be a number between ``1`` and ``9``. The
+ default is ``9``.
- Compress *data* in one shot. If you want to compress data sequentially, use
- an instance of :class:`BZ2Compressor` instead. The *compresslevel* parameter,
- if given, must be a number between ``1`` and ``9``; the default is ``9``.
+ For incremental compression, use a :class:`BZ2Compressor` instead.
.. function:: decompress(data)
- Decompress *data* in one shot. If you want to decompress data sequentially,
- use an instance of :class:`BZ2Decompressor` instead.
+ Decompress *data*.
+
+ If *data* is the concatenation of multiple compressed streams, decompress
+ all of the streams.
+
+ For incremental decompression, use a :class:`BZ2Decompressor` instead.
+
+ .. versionchanged:: 3.3
+ Support for multi-stream inputs was added.
diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst
index d3558a4..c1ba497 100644
--- a/Doc/library/chunk.rst
+++ b/Doc/library/chunk.rst
@@ -84,8 +84,9 @@ instance will fail with a :exc:`EOFError` exception.
Close and skip to the end of the chunk. This does not close the
underlying file.
- The remaining methods will raise :exc:`IOError` if called after the
- :meth:`close` method has been called.
+ The remaining methods will raise :exc:`OSError` if called after the
+ :meth:`close` method has been called. Before Python 3.3, they used to
+ raise :exc:`IOError`, now an alias of :exc:`OSError`.
.. method:: isatty()
diff --git a/Doc/library/cmd.rst b/Doc/library/cmd.rst
index 943c04a..9722928 100644
--- a/Doc/library/cmd.rst
+++ b/Doc/library/cmd.rst
@@ -285,8 +285,8 @@ immediate playback::
def do_playback(self, arg):
'Playback commands from a file: PLAYBACK rose.cmd'
self.close()
- cmds = open(arg).read().splitlines()
- self.cmdqueue.extend(cmds)
+ with open(arg) as f:
+ self.cmdqueue.extend(f.read().splitlines())
def precmd(self, line):
line = line.lower()
if self.file and 'playback' not in line:
diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst
index 762bb98..071fc23 100644
--- a/Doc/library/codecs.rst
+++ b/Doc/library/codecs.rst
@@ -458,7 +458,8 @@ define in order to be compatible with the Python codec registry.
.. method:: reset()
- Reset the encoder to the initial state.
+ Reset the encoder to the initial state. The output is discarded: call
+ ``.encode('', final=True)`` to reset the encoder and to get the output.
.. method:: IncrementalEncoder.getstate()
@@ -786,11 +787,9 @@ methods and attributes from the underlying stream.
Encodings and Unicode
---------------------
-Strings are stored internally as sequences of codepoints (to be precise
-as :c:type:`Py_UNICODE` arrays). Depending on the way Python is compiled (either
-via ``--without-wide-unicode`` or ``--with-wide-unicode``, with the
-former being the default) :c:type:`Py_UNICODE` is either a 16-bit or 32-bit data
-type. Once a string object is used outside of CPU and memory, CPU endianness
+Strings are stored internally as sequences of codepoints in range ``0 - 10FFFF``
+(see :pep:`393` for more details about the implementation).
+Once a string object is used outside of CPU and memory, CPU endianness
and how these arrays are stored as bytes become an issue. Transforming a
string object into a sequence of bytes is called encoding and recreating the
string object from the sequence of bytes is known as decoding. There are many
@@ -901,6 +900,15 @@ is meant to be exhaustive. Notice that spelling alternatives that only differ in
case or use a hyphen instead of an underscore are also valid aliases; therefore,
e.g. ``'utf-8'`` is a valid alias for the ``'utf_8'`` codec.
+.. impl-detail::
+
+ Some common encodings can bypass the codecs lookup machinery to
+ improve performance. These optimization opportunities are only
+ recognized by CPython for a limited set of aliases: utf-8, utf8,
+ latin-1, latin1, iso-8859-1, mbcs (Windows only), ascii, utf-16,
+ and utf-32. Using alternative spellings for these encodings may
+ result in slower execution.
+
Many of the character sets support the same languages. They vary in individual
characters (e.g. whether the EURO SIGN is supported or not), and in the
assignment of characters to code positions. For the European languages in
@@ -1003,6 +1011,11 @@ particular, the following variants typically exist:
+-----------------+--------------------------------+--------------------------------+
| cp1258 | windows-1258 | Vietnamese |
+-----------------+--------------------------------+--------------------------------+
+| cp65001 | | Windows only: Windows UTF-8 |
+| | | (``CP_UTF8``) |
+| | | |
+| | | .. versionadded:: 3.3 |
++-----------------+--------------------------------+--------------------------------+
| euc_jp | eucjp, ujis, u-jis | Japanese |
+-----------------+--------------------------------+--------------------------------+
| euc_jis_2004 | jisx0213, eucjis2004 | Japanese |
@@ -1160,6 +1173,8 @@ particular, the following variants typically exist:
| unicode_internal | | Return the internal |
| | | representation of the |
| | | operand |
+| | | |
+| | | .. deprecated:: 3.3 |
+--------------------+---------+---------------------------+
The following codecs provide bytes-to-bytes mappings.
@@ -1272,12 +1287,13 @@ functions can be used directly if desired.
.. module:: encodings.mbcs
:synopsis: Windows ANSI codepage
-Encode operand according to the ANSI codepage (CP_ACP). This codec only
-supports ``'strict'`` and ``'replace'`` error handlers to encode, and
-``'strict'`` and ``'ignore'`` error handlers to decode.
+Encode operand according to the ANSI codepage (CP_ACP).
Availability: Windows only.
+.. versionchanged:: 3.3
+ Support any error handler.
+
.. versionchanged:: 3.2
Before 3.2, the *errors* argument was ignored; ``'replace'`` was always used
to encode, and ``'ignore'`` to decode.
diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst
new file mode 100644
index 0000000..9873489
--- /dev/null
+++ b/Doc/library/collections.abc.rst
@@ -0,0 +1,182 @@
+:mod:`collections.abc` --- Abstract Base Classes for Containers
+===============================================================
+
+.. module:: collections.abc
+ :synopsis: Abstract base classes for containers
+.. moduleauthor:: Raymond Hettinger <python at rcn.com>
+.. sectionauthor:: Raymond Hettinger <python at rcn.com>
+
+.. versionadded:: 3.3
+ Formerly, this module was part of the :mod:`collections` module.
+
+.. testsetup:: *
+
+ from collections import *
+ import itertools
+ __name__ = '<doctest>'
+
+**Source code:** :source:`Lib/collections/abc.py`
+
+--------------
+
+This module provides :term:`abstract base classes <abstract base class>` that
+can be used to test whether a class provides a particular interface; for
+example, whether it is hashable or whether it is a mapping.
+
+
+.. _collections-abstract-base-classes:
+
+Collections Abstract Base Classes
+---------------------------------
+
+The collections module offers the following :term:`ABCs <abstract base class>`:
+
+========================= ===================== ====================== ====================================================
+ABC Inherits from Abstract Methods Mixin Methods
+========================= ===================== ====================== ====================================================
+:class:`Container` ``__contains__``
+:class:`Hashable` ``__hash__``
+:class:`Iterable` ``__iter__``
+:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__``
+:class:`Sized` ``__len__``
+:class:`Callable` ``__call__``
+
+:class:`Sequence` :class:`Sized`, ``__getitem__`` ``__contains__``, ``__iter__``, ``__reversed__``,
+ :class:`Iterable`, ``index``, and ``count``
+ :class:`Container`
+
+:class:`MutableSequence` :class:`Sequence` ``__setitem__``, Inherited :class:`Sequence` methods and
+ ``__delitem__``, ``append``, ``reverse``, ``extend``, ``pop``,
+ ``insert`` ``remove``, ``clear``, and ``__iadd__``
+
+:class:`Set` :class:`Sized`, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
+ :class:`Iterable`, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
+ :class:`Container` ``__sub__``, ``__xor__``, and ``isdisjoint``
+
+:class:`MutableSet` :class:`Set` ``add``, Inherited :class:`Set` methods and
+ ``discard`` ``clear``, ``pop``, ``remove``, ``__ior__``,
+ ``__iand__``, ``__ixor__``, and ``__isub__``
+
+:class:`Mapping` :class:`Sized`, ``__getitem__`` ``__contains__``, ``keys``, ``items``, ``values``,
+ :class:`Iterable`, ``get``, ``__eq__``, and ``__ne__``
+ :class:`Container`
+
+:class:`MutableMapping` :class:`Mapping` ``__setitem__``, Inherited :class:`Mapping` methods and
+ ``__delitem__`` ``pop``, ``popitem``, ``clear``, ``update``,
+ and ``setdefault``
+
+
+:class:`MappingView` :class:`Sized` ``__len__``
+:class:`ItemsView` :class:`MappingView`, ``__contains__``,
+ :class:`Set` ``__iter__``
+:class:`KeysView` :class:`MappingView`, ``__contains__``,
+ :class:`Set` ``__iter__``
+:class:`ValuesView` :class:`MappingView` ``__contains__``, ``__iter__``
+========================= ===================== ====================== ====================================================
+
+
+.. class:: Container
+ Hashable
+ Sized
+ Callable
+
+ ABCs for classes that provide respectively the methods :meth:`__contains__`,
+ :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`.
+
+.. class:: Iterable
+
+ ABC for classes that provide the :meth:`__iter__` method.
+ See also the definition of :term:`iterable`.
+
+.. class:: Iterator
+
+ ABC for classes that provide the :meth:`__iter__` and :meth:`next` methods.
+ See also the definition of :term:`iterator`.
+
+.. class:: Sequence
+ MutableSequence
+
+ ABCs for read-only and mutable :term:`sequences <sequence>`.
+
+.. class:: Set
+ MutableSet
+
+ ABCs for read-only and mutable sets.
+
+.. class:: Mapping
+ MutableMapping
+
+ ABCs for read-only and mutable :term:`mappings <mapping>`.
+
+.. class:: MappingView
+ ItemsView
+ KeysView
+ ValuesView
+
+ ABCs for mapping, items, keys, and values :term:`views <view>`.
+
+
+These ABCs allow us to ask classes or instances if they provide
+particular functionality, for example::
+
+ size = None
+ if isinstance(myvar, collections.Sized):
+ size = len(myvar)
+
+Several of the ABCs are also useful as mixins that make it easier to develop
+classes supporting container APIs. For example, to write a class supporting
+the full :class:`Set` API, it only necessary to supply the three underlying
+abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
+The ABC supplies the remaining methods such as :meth:`__and__` and
+:meth:`isdisjoint` ::
+
+ class ListBasedSet(collections.Set):
+ ''' Alternate set implementation favoring space over speed
+ and not requiring the set elements to be hashable. '''
+ def __init__(self, iterable):
+ self.elements = lst = []
+ for value in iterable:
+ if value not in lst:
+ lst.append(value)
+ def __iter__(self):
+ return iter(self.elements)
+ def __contains__(self, value):
+ return value in self.elements
+ def __len__(self):
+ return len(self.elements)
+
+ s1 = ListBasedSet('abcdef')
+ s2 = ListBasedSet('defghi')
+ overlap = s1 & s2 # The __and__() method is supported automatically
+
+Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
+
+(1)
+ Since some set operations create new sets, the default mixin methods need
+ a way to create new instances from an iterable. The class constructor is
+ assumed to have a signature in the form ``ClassName(iterable)``.
+ That assumption is factored-out to an internal classmethod called
+ :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
+ If the :class:`Set` mixin is being used in a class with a different
+ constructor signature, you will need to override :meth:`_from_iterable`
+ with a classmethod that can construct new instances from
+ an iterable argument.
+
+(2)
+ To override the comparisons (presumably for speed, as the
+ semantics are fixed), redefine :meth:`__le__` and
+ then the other operations will automatically follow suit.
+
+(3)
+ The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
+ for the set; however, :meth:`__hash__` is not defined because not all sets
+ are hashable or immutable. To add set hashabilty using mixins,
+ inherit from both :meth:`Set` and :meth:`Hashable`, then define
+ ``__hash__ = Set._hash``.
+
+.. seealso::
+
+ * `OrderedSet recipe <http://code.activestate.com/recipes/576694/>`_ for an
+ example built on :class:`MutableSet`.
+
+ * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index 57e0481..45da4e5 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -2,17 +2,17 @@
==========================================
.. module:: collections
- :synopsis: Container datatypes
+ :synopsis: Container datatypes
.. moduleauthor:: Raymond Hettinger <python@rcn.com>
.. sectionauthor:: Raymond Hettinger <python@rcn.com>
.. testsetup:: *
- from collections import *
- import itertools
- __name__ = '<doctest>'
+ from collections import *
+ import itertools
+ __name__ = '<doctest>'
-**Source code:** :source:`Lib/collections.py` and :source:`Lib/_abcoll.py`
+**Source code:** :source:`Lib/collections/__init__.py`
--------------
@@ -23,6 +23,7 @@ Python's general purpose built-in containers, :class:`dict`, :class:`list`,
===================== ====================================================================
:func:`namedtuple` factory function for creating tuple subclasses with named fields
:class:`deque` list-like container with fast appends and pops on either end
+:class:`ChainMap` dict-like class for creating a single view of multiple mappings
:class:`Counter` dict subclass for counting hashable objects
:class:`OrderedDict` dict subclass that remembers the order entries were added
:class:`defaultdict` dict subclass that calls a factory function to supply missing values
@@ -31,10 +32,167 @@ Python's general purpose built-in containers, :class:`dict`, :class:`list`,
:class:`UserString` wrapper around string objects for easier string subclassing
===================== ====================================================================
-In addition to the concrete container classes, the collections module provides
-:ref:`abstract base classes <collections-abstract-base-classes>` that can be
-used to test whether a class provides a particular interface, for example,
-whether it is hashable or a mapping.
+.. versionchanged:: 3.3
+ Moved :ref:`collections-abstract-base-classes` to the :mod:`collections.abc` module.
+ For backwards compatibility, they continue to be visible in this module
+ as well.
+
+
+:class:`ChainMap` objects
+-------------------------
+
+.. versionadded:: 3.3
+
+A :class:`ChainMap` class is provided for quickly linking a number of mappings
+so they can be treated as a single unit. It is often much faster than creating
+a new dictionary and running multiple :meth:`~dict.update` calls.
+
+The class can be used to simulate nested scopes and is useful in templating.
+
+.. class:: ChainMap(*maps)
+
+ A :class:`ChainMap` groups multiple dicts or other mappings together to
+ create a single, updateable view. If no *maps* are specified, a single empty
+ dictionary is provided so that a new chain always has at least one mapping.
+
+ The underlying mappings are stored in a list. That list is public and can
+ accessed or updated using the *maps* attribute. There is no other state.
+
+ Lookups search the underlying mappings successively until a key is found. In
+ contrast, writes, updates, and deletions only operate on the first mapping.
+
+ A :class:`ChainMap` incorporates the underlying mappings by reference. So, if
+ one of the underlying mappings gets updated, those changes will be reflected
+ in :class:`ChainMap`.
+
+ All of the usual dictionary methods are supported. In addition, there is a
+ *maps* attribute, a method for creating new subcontexts, and a property for
+ accessing all but the first mapping:
+
+ .. attribute:: maps
+
+ A user updateable list of mappings. The list is ordered from
+ first-searched to last-searched. It is the only stored state and can
+ be modified to change which mappings are searched. The list should
+ always contain at least one mapping.
+
+ .. method:: new_child()
+
+ Returns a new :class:`ChainMap` containing a new :class:`dict` followed by
+ all of the maps in the current instance. A call to ``d.new_child()`` is
+ equivalent to: ``ChainMap({}, *d.maps)``. This method is used for
+ creating subcontexts that can be updated without altering values in any
+ of the parent mappings.
+
+ .. attribute:: parents
+
+ Property returning a new :class:`ChainMap` containing all of the maps in
+ the current instance except the first one. This is useful for skipping
+ the first map in the search. Use cases are similar to those for the
+ :keyword:`nonlocal` keyword used in :term:`nested scopes <nested
+ scope>`. The use cases also parallel those for the built-in
+ :func:`super` function. A reference to ``d.parents`` is equivalent to:
+ ``ChainMap(*d.maps[1:])``.
+
+
+.. seealso::
+
+ * The `MultiContext class
+ <https://github.com/enthought/codetools/blob/4.0.0/codetools/contexts/multi_context.py>`_
+ in the Enthought `CodeTools package
+ <https://github.com/enthought/codetools>`_ has options to support
+ writing to any mapping in the chain.
+
+ * Django's `Context class
+ <http://code.djangoproject.com/browser/django/trunk/django/template/context.py>`_
+ for templating is a read-only chain of mappings. It also features
+ pushing and popping of contexts similar to the
+ :meth:`~collections.ChainMap.new_child` method and the
+ :meth:`~collections.ChainMap.parents` property.
+
+ * The `Nested Contexts recipe
+ <http://code.activestate.com/recipes/577434/>`_ has options to control
+ whether writes and other mutations apply only to the first mapping or to
+ any mapping in the chain.
+
+ * A `greatly simplified read-only version of Chainmap
+ <http://code.activestate.com/recipes/305268/>`_.
+
+
+:class:`ChainMap` Examples and Recipes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This section shows various approaches to working with chained maps.
+
+
+Example of simulating Python's internal lookup chain::
+
+ import builtins
+ pylookup = ChainMap(locals(), globals(), vars(builtins))
+
+Example of letting user specified command-line arguments take precedence over
+environment variables which in turn take precedence over default values::
+
+ import os, argparse
+
+ defaults = {'color': 'red', 'user': 'guest'}
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-u', '--user')
+ parser.add_argument('-c', '--color')
+ namespace = parser.parse_args()
+ command_line_args = {k:v for k, v in vars(namespace).items() if v}
+
+ combined = ChainMap(command_line_args, os.environ, defaults)
+ print(combined['color'])
+ print(combined['user'])
+
+Example patterns for using the :class:`ChainMap` class to simulate nested
+contexts::
+
+ c = ChainMap() # Create root context
+ d = c.new_child() # Create nested child context
+ e = c.new_child() # Child of c, independent from d
+ e.maps[0] # Current context dictionary -- like Python's locals()
+ e.maps[-1] # Root context -- like Python's globals()
+ e.parents # Enclosing context chain -- like Python's nonlocals
+
+ d['x'] # Get first key in the chain of contexts
+ d['x'] = 1 # Set value in current context
+ del d['x'] # Delete from current context
+ list(d) # All nested values
+ k in d # Check all nested values
+ len(d) # Number of nested values
+ d.items() # All nested items
+ dict(d) # Flatten into a regular dictionary
+
+The :class:`ChainMap` class only makes updates (writes and deletions) to the
+first mapping in the chain while lookups will search the full chain. However,
+if deep writes and deletions are desired, it is easy to make a subclass that
+updates keys found deeper in the chain::
+
+ class DeepChainMap(ChainMap):
+ 'Variant of ChainMap that allows direct updates to inner scopes'
+
+ def __setitem__(self, key, value):
+ for mapping in self.maps:
+ if key in mapping:
+ mapping[key] = value
+ return
+ self.maps[0][key] = value
+
+ def __delitem__(self, key):
+ for mapping in self.maps:
+ if key in mapping:
+ del mapping[key]
+ return
+ raise KeyError(key)
+
+ >>> d = DeepChainMap({'zebra': 'black'}, {'elephant' : 'blue'}, {'lion' : 'yellow'})
+ >>> d['lion'] = 'orange' # update an existing key two levels down
+ >>> d['snake'] = 'red' # new keys get added to the topmost dict
+ >>> del d['elephant'] # remove an existing key one level down
+ DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'})
:class:`Counter` objects
@@ -59,85 +217,85 @@ For example::
.. class:: Counter([iterable-or-mapping])
- A :class:`Counter` is a :class:`dict` subclass for counting hashable objects.
- It is an unordered collection where elements are stored as dictionary keys
- and their counts are stored as dictionary values. Counts are allowed to be
- any integer value including zero or negative counts. The :class:`Counter`
- class is similar to bags or multisets in other languages.
+ A :class:`Counter` is a :class:`dict` subclass for counting hashable objects.
+ It is an unordered collection where elements are stored as dictionary keys
+ and their counts are stored as dictionary values. Counts are allowed to be
+ any integer value including zero or negative counts. The :class:`Counter`
+ class is similar to bags or multisets in other languages.
- Elements are counted from an *iterable* or initialized from another
- *mapping* (or counter):
+ Elements are counted from an *iterable* or initialized from another
+ *mapping* (or counter):
>>> c = Counter() # a new, empty counter
>>> c = Counter('gallahad') # a new counter from an iterable
>>> c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping
>>> c = Counter(cats=4, dogs=8) # a new counter from keyword args
- Counter objects have a dictionary interface except that they return a zero
- count for missing items instead of raising a :exc:`KeyError`:
+ Counter objects have a dictionary interface except that they return a zero
+ count for missing items instead of raising a :exc:`KeyError`:
>>> c = Counter(['eggs', 'ham'])
>>> c['bacon'] # count of a missing element is zero
0
- Setting a count to zero does not remove an element from a counter.
- Use ``del`` to remove it entirely:
+ Setting a count to zero does not remove an element from a counter.
+ Use ``del`` to remove it entirely:
>>> c['sausage'] = 0 # counter entry with a zero count
>>> del c['sausage'] # del actually removes the entry
- .. versionadded:: 3.1
+ .. versionadded:: 3.1
- Counter objects support three methods beyond those available for all
- dictionaries:
+ Counter objects support three methods beyond those available for all
+ dictionaries:
- .. method:: elements()
+ .. method:: elements()
- Return an iterator over elements repeating each as many times as its
- count. Elements are returned in arbitrary order. If an element's count
- is less than one, :meth:`elements` will ignore it.
+ Return an iterator over elements repeating each as many times as its
+ count. Elements are returned in arbitrary order. If an element's count
+ is less than one, :meth:`elements` will ignore it.
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
- .. method:: most_common([n])
+ .. method:: most_common([n])
- Return a list of the *n* most common elements and their counts from the
- most common to the least. If *n* is not specified, :func:`most_common`
- returns *all* elements in the counter. Elements with equal counts are
- ordered arbitrarily:
+ Return a list of the *n* most common elements and their counts from the
+ most common to the least. If *n* is not specified, :func:`most_common`
+ returns *all* elements in the counter. Elements with equal counts are
+ ordered arbitrarily:
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
- .. method:: subtract([iterable-or-mapping])
+ .. method:: subtract([iterable-or-mapping])
- Elements are subtracted from an *iterable* or from another *mapping*
- (or counter). Like :meth:`dict.update` but subtracts counts instead
- of replacing them. Both inputs and outputs may be zero or negative.
+ Elements are subtracted from an *iterable* or from another *mapping*
+ (or counter). Like :meth:`dict.update` but subtracts counts instead
+ of replacing them. Both inputs and outputs may be zero or negative.
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
- .. versionadded:: 3.2
+ .. versionadded:: 3.2
- The usual dictionary methods are available for :class:`Counter` objects
- except for two which work differently for counters.
+ The usual dictionary methods are available for :class:`Counter` objects
+ except for two which work differently for counters.
- .. method:: fromkeys(iterable)
+ .. method:: fromkeys(iterable)
- This class method is not implemented for :class:`Counter` objects.
+ This class method is not implemented for :class:`Counter` objects.
- .. method:: update([iterable-or-mapping])
+ .. method:: update([iterable-or-mapping])
- Elements are counted from an *iterable* or added-in from another
- *mapping* (or counter). Like :meth:`dict.update` but adds counts
- instead of replacing them. Also, the *iterable* is expected to be a
- sequence of elements, not a sequence of ``(key, value)`` pairs.
+ Elements are counted from an *iterable* or added-in from another
+ *mapping* (or counter). Like :meth:`dict.update` but adds counts
+ instead of replacing them. Also, the *iterable* is expected to be a
+ sequence of elements, not a sequence of ``(key, value)`` pairs.
Common patterns for working with :class:`Counter` objects::
@@ -149,7 +307,7 @@ Common patterns for working with :class:`Counter` objects::
c.items() # convert to a list of (elem, cnt) pairs
Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs
c.most_common()[:-n:-1] # n least common elements
- c += Counter() # remove zero and negative counts
+ +c # remove zero and negative counts
Several mathematical operations are provided for combining :class:`Counter`
objects to produce multisets (counters that have counts greater than zero).
@@ -169,32 +327,44 @@ counts, but the output will exclude results with counts of zero or less.
>>> c | d # union: max(c[x], d[x])
Counter({'a': 3, 'b': 2})
+Unary addition and substraction are shortcuts for adding an empty counter
+or subtracting from an empty counter.
+
+ >>> c = Counter(a=2, b=-4)
+ >>> +c
+ Counter({'a': 2})
+ >>> -c
+ Counter({'b': 4})
+
+.. versionadded:: 3.3
+ Added support for unary plus, unary minus, and in-place multiset operations.
+
.. note::
- Counters were primarily designed to work with positive integers to represent
- running counts; however, care was taken to not unnecessarily preclude use
- cases needing other types or negative values. To help with those use cases,
- this section documents the minimum range and type restrictions.
+ Counters were primarily designed to work with positive integers to represent
+ running counts; however, care was taken to not unnecessarily preclude use
+ cases needing other types or negative values. To help with those use cases,
+ this section documents the minimum range and type restrictions.
- * The :class:`Counter` class itself is a dictionary subclass with no
- restrictions on its keys and values. The values are intended to be numbers
- representing counts, but you *could* store anything in the value field.
+ * The :class:`Counter` class itself is a dictionary subclass with no
+ restrictions on its keys and values. The values are intended to be numbers
+ representing counts, but you *could* store anything in the value field.
- * The :meth:`most_common` method requires only that the values be orderable.
+ * The :meth:`most_common` method requires only that the values be orderable.
- * For in-place operations such as ``c[key] += 1``, the value type need only
- support addition and subtraction. So fractions, floats, and decimals would
- work and negative values are supported. The same is also true for
- :meth:`update` and :meth:`subtract` which allow negative and zero values
- for both inputs and outputs.
+ * For in-place operations such as ``c[key] += 1``, the value type need only
+ support addition and subtraction. So fractions, floats, and decimals would
+ work and negative values are supported. The same is also true for
+ :meth:`update` and :meth:`subtract` which allow negative and zero values
+ for both inputs and outputs.
- * The multiset methods are designed only for use cases with positive values.
- The inputs may be negative or zero, but only outputs with positive values
- are created. There are no type restrictions, but the value type needs to
- support addition, subtraction, and comparison.
+ * The multiset methods are designed only for use cases with positive values.
+ The inputs may be negative or zero, but only outputs with positive values
+ are created. There are no type restrictions, but the value type needs to
+ support addition, subtraction, and comparison.
- * The :meth:`elements` method requires integer counts. It ignores zero and
- negative counts.
+ * The :meth:`elements` method requires integer counts. It ignores zero and
+ negative counts.
.. seealso::
@@ -217,7 +387,7 @@ counts, but the output will exclude results with counts of zero or less.
* To enumerate all distinct multisets of a given size over a given set of
elements, see :func:`itertools.combinations_with_replacement`.
- map(Counter, combinations_with_replacement('ABC', 2)) --> AA AB AC BB BC CC
+ map(Counter, combinations_with_replacement('ABC', 2)) --> AA AB AC BB BC CC
:class:`deque` objects
@@ -225,105 +395,105 @@ counts, but the output will exclude results with counts of zero or less.
.. class:: deque([iterable, [maxlen]])
- Returns a new deque object initialized left-to-right (using :meth:`append`) with
- data from *iterable*. If *iterable* is not specified, the new deque is empty.
+ Returns a new deque object initialized left-to-right (using :meth:`append`) with
+ data from *iterable*. If *iterable* is not specified, the new deque is empty.
- Deques are a generalization of stacks and queues (the name is pronounced "deck"
- and is short for "double-ended queue"). Deques support thread-safe, memory
- efficient appends and pops from either side of the deque with approximately the
- same O(1) performance in either direction.
+ Deques are a generalization of stacks and queues (the name is pronounced "deck"
+ and is short for "double-ended queue"). Deques support thread-safe, memory
+ efficient appends and pops from either side of the deque with approximately the
+ same O(1) performance in either direction.
- Though :class:`list` objects support similar operations, they are optimized for
- fast fixed-length operations and incur O(n) memory movement costs for
- ``pop(0)`` and ``insert(0, v)`` operations which change both the size and
- position of the underlying data representation.
+ Though :class:`list` objects support similar operations, they are optimized for
+ fast fixed-length operations and incur O(n) memory movement costs for
+ ``pop(0)`` and ``insert(0, v)`` operations which change both the size and
+ position of the underlying data representation.
- If *maxlen* is not specified or is *None*, deques may grow to an
- arbitrary length. Otherwise, the deque is bounded to the specified maximum
- length. Once a bounded length deque is full, when new items are added, a
- corresponding number of items are discarded from the opposite end. Bounded
- length deques provide functionality similar to the ``tail`` filter in
- Unix. They are also useful for tracking transactions and other pools of data
- where only the most recent activity is of interest.
+ If *maxlen* is not specified or is *None*, deques may grow to an
+ arbitrary length. Otherwise, the deque is bounded to the specified maximum
+ length. Once a bounded length deque is full, when new items are added, a
+ corresponding number of items are discarded from the opposite end. Bounded
+ length deques provide functionality similar to the ``tail`` filter in
+ Unix. They are also useful for tracking transactions and other pools of data
+ where only the most recent activity is of interest.
- Deque objects support the following methods:
+ Deque objects support the following methods:
- .. method:: append(x)
+ .. method:: append(x)
- Add *x* to the right side of the deque.
+ Add *x* to the right side of the deque.
- .. method:: appendleft(x)
+ .. method:: appendleft(x)
- Add *x* to the left side of the deque.
+ Add *x* to the left side of the deque.
- .. method:: clear()
+ .. method:: clear()
- Remove all elements from the deque leaving it with length 0.
+ Remove all elements from the deque leaving it with length 0.
- .. method:: count(x)
+ .. method:: count(x)
- Count the number of deque elements equal to *x*.
+ Count the number of deque elements equal to *x*.
- .. versionadded:: 3.2
+ .. versionadded:: 3.2
- .. method:: extend(iterable)
+ .. method:: extend(iterable)
- Extend the right side of the deque by appending elements from the iterable
- argument.
+ Extend the right side of the deque by appending elements from the iterable
+ argument.
- .. method:: extendleft(iterable)
+ .. method:: extendleft(iterable)
- Extend the left side of the deque by appending elements from *iterable*.
- Note, the series of left appends results in reversing the order of
- elements in the iterable argument.
+ Extend the left side of the deque by appending elements from *iterable*.
+ Note, the series of left appends results in reversing the order of
+ elements in the iterable argument.
- .. method:: pop()
+ .. method:: pop()
- Remove and return an element from the right side of the deque. If no
- elements are present, raises an :exc:`IndexError`.
+ Remove and return an element from the right side of the deque. If no
+ elements are present, raises an :exc:`IndexError`.
- .. method:: popleft()
+ .. method:: popleft()
- Remove and return an element from the left side of the deque. If no
- elements are present, raises an :exc:`IndexError`.
+ Remove and return an element from the left side of the deque. If no
+ elements are present, raises an :exc:`IndexError`.
- .. method:: remove(value)
+ .. method:: remove(value)
- Removed the first occurrence of *value*. If not found, raises a
- :exc:`ValueError`.
+ Removed the first occurrence of *value*. If not found, raises a
+ :exc:`ValueError`.
- .. method:: reverse()
+ .. method:: reverse()
- Reverse the elements of the deque in-place and then return ``None``.
+ Reverse the elements of the deque in-place and then return ``None``.
- .. versionadded:: 3.2
+ .. versionadded:: 3.2
- .. method:: rotate(n)
+ .. method:: rotate(n)
- Rotate the deque *n* steps to the right. If *n* is negative, rotate to
- the left. Rotating one step to the right is equivalent to:
- ``d.appendleft(d.pop())``.
+ Rotate the deque *n* steps to the right. If *n* is negative, rotate to
+ the left. Rotating one step to the right is equivalent to:
+ ``d.appendleft(d.pop())``.
- Deque objects also provide one read-only attribute:
+ Deque objects also provide one read-only attribute:
- .. attribute:: maxlen
+ .. attribute:: maxlen
- Maximum size of a deque or *None* if unbounded.
+ Maximum size of a deque or *None* if unbounded.
- .. versionadded:: 3.1
+ .. versionadded:: 3.1
In addition to the above, deques support iteration, pickling, ``len(d)``,
@@ -336,56 +506,56 @@ Example:
.. doctest::
- >>> from collections import deque
- >>> d = deque('ghi') # make a new deque with three items
- >>> for elem in d: # iterate over the deque's elements
- ... print(elem.upper())
- G
- H
- I
-
- >>> d.append('j') # add a new entry to the right side
- >>> d.appendleft('f') # add a new entry to the left side
- >>> d # show the representation of the deque
- deque(['f', 'g', 'h', 'i', 'j'])
-
- >>> d.pop() # return and remove the rightmost item
- 'j'
- >>> d.popleft() # return and remove the leftmost item
- 'f'
- >>> list(d) # list the contents of the deque
- ['g', 'h', 'i']
- >>> d[0] # peek at leftmost item
- 'g'
- >>> d[-1] # peek at rightmost item
- 'i'
-
- >>> list(reversed(d)) # list the contents of a deque in reverse
- ['i', 'h', 'g']
- >>> 'h' in d # search the deque
- True
- >>> d.extend('jkl') # add multiple elements at once
- >>> d
- deque(['g', 'h', 'i', 'j', 'k', 'l'])
- >>> d.rotate(1) # right rotation
- >>> d
- deque(['l', 'g', 'h', 'i', 'j', 'k'])
- >>> d.rotate(-1) # left rotation
- >>> d
- deque(['g', 'h', 'i', 'j', 'k', 'l'])
-
- >>> deque(reversed(d)) # make a new deque in reverse order
- deque(['l', 'k', 'j', 'i', 'h', 'g'])
- >>> d.clear() # empty the deque
- >>> d.pop() # cannot pop from an empty deque
- Traceback (most recent call last):
- File "<pyshell#6>", line 1, in -toplevel-
- d.pop()
- IndexError: pop from an empty deque
-
- >>> d.extendleft('abc') # extendleft() reverses the input order
- >>> d
- deque(['c', 'b', 'a'])
+ >>> from collections import deque
+ >>> d = deque('ghi') # make a new deque with three items
+ >>> for elem in d: # iterate over the deque's elements
+ ... print(elem.upper())
+ G
+ H
+ I
+
+ >>> d.append('j') # add a new entry to the right side
+ >>> d.appendleft('f') # add a new entry to the left side
+ >>> d # show the representation of the deque
+ deque(['f', 'g', 'h', 'i', 'j'])
+
+ >>> d.pop() # return and remove the rightmost item
+ 'j'
+ >>> d.popleft() # return and remove the leftmost item
+ 'f'
+ >>> list(d) # list the contents of the deque
+ ['g', 'h', 'i']
+ >>> d[0] # peek at leftmost item
+ 'g'
+ >>> d[-1] # peek at rightmost item
+ 'i'
+
+ >>> list(reversed(d)) # list the contents of a deque in reverse
+ ['i', 'h', 'g']
+ >>> 'h' in d # search the deque
+ True
+ >>> d.extend('jkl') # add multiple elements at once
+ >>> d
+ deque(['g', 'h', 'i', 'j', 'k', 'l'])
+ >>> d.rotate(1) # right rotation
+ >>> d
+ deque(['l', 'g', 'h', 'i', 'j', 'k'])
+ >>> d.rotate(-1) # left rotation
+ >>> d
+ deque(['g', 'h', 'i', 'j', 'k', 'l'])
+
+ >>> deque(reversed(d)) # make a new deque in reverse order
+ deque(['l', 'k', 'j', 'i', 'h', 'g'])
+ >>> d.clear() # empty the deque
+ >>> d.pop() # cannot pop from an empty deque
+ Traceback (most recent call last):
+ File "<pyshell#6>", line 1, in -toplevel-
+ d.pop()
+ IndexError: pop from an empty deque
+
+ >>> d.extendleft('abc') # extendleft() reverses the input order
+ >>> d
+ deque(['c', 'b', 'a'])
:class:`deque` Recipes
@@ -396,9 +566,10 @@ This section shows various approaches to working with deques.
Bounded length deques provide functionality similar to the ``tail`` filter
in Unix::
- def tail(filename, n=10):
- 'Return the last n lines of a file'
- return deque(open(filename), n)
+ def tail(filename, n=10):
+ 'Return the last n lines of a file'
+ with open(filename) as f:
+ return deque(f, n)
Another approach to using deques is to maintain a sequence of recently
added elements by appending to the right and popping to the left::
@@ -419,10 +590,10 @@ The :meth:`rotate` method provides a way to implement :class:`deque` slicing and
deletion. For example, a pure Python implementation of ``del d[n]`` relies on
the :meth:`rotate` method to position elements to be popped::
- def delete_nth(d, n):
- d.rotate(-n)
- d.popleft()
- d.rotate(n)
+ def delete_nth(d, n):
+ d.rotate(-n)
+ d.popleft()
+ d.rotate(n)
To implement :class:`deque` slicing, use a similar approach applying
:meth:`rotate` to bring a target element to the left side of the deque. Remove
@@ -438,50 +609,50 @@ stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``,
.. class:: defaultdict([default_factory[, ...]])
- Returns a new dictionary-like object. :class:`defaultdict` is a subclass of the
- built-in :class:`dict` class. It overrides one method and adds one writable
- instance variable. The remaining functionality is the same as for the
- :class:`dict` class and is not documented here.
+ Returns a new dictionary-like object. :class:`defaultdict` is a subclass of the
+ built-in :class:`dict` class. It overrides one method and adds one writable
+ instance variable. The remaining functionality is the same as for the
+ :class:`dict` class and is not documented here.
- The first argument provides the initial value for the :attr:`default_factory`
- attribute; it defaults to ``None``. All remaining arguments are treated the same
- as if they were passed to the :class:`dict` constructor, including keyword
- arguments.
+ The first argument provides the initial value for the :attr:`default_factory`
+ attribute; it defaults to ``None``. All remaining arguments are treated the same
+ as if they were passed to the :class:`dict` constructor, including keyword
+ arguments.
- :class:`defaultdict` objects support the following method in addition to the
- standard :class:`dict` operations:
+ :class:`defaultdict` objects support the following method in addition to the
+ standard :class:`dict` operations:
- .. method:: __missing__(key)
+ .. method:: __missing__(key)
- If the :attr:`default_factory` attribute is ``None``, this raises a
- :exc:`KeyError` exception with the *key* as argument.
+ If the :attr:`default_factory` attribute is ``None``, this raises a
+ :exc:`KeyError` exception with the *key* as argument.
- If :attr:`default_factory` is not ``None``, it is called without arguments
- to provide a default value for the given *key*, this value is inserted in
- the dictionary for the *key*, and returned.
+ If :attr:`default_factory` is not ``None``, it is called without arguments
+ to provide a default value for the given *key*, this value is inserted in
+ the dictionary for the *key*, and returned.
- If calling :attr:`default_factory` raises an exception this exception is
- propagated unchanged.
+ If calling :attr:`default_factory` raises an exception this exception is
+ propagated unchanged.
- This method is called by the :meth:`__getitem__` method of the
- :class:`dict` class when the requested key is not found; whatever it
- returns or raises is then returned or raised by :meth:`__getitem__`.
+ This method is called by the :meth:`__getitem__` method of the
+ :class:`dict` class when the requested key is not found; whatever it
+ returns or raises is then returned or raised by :meth:`__getitem__`.
- Note that :meth:`__missing__` is *not* called for any operations besides
- :meth:`__getitem__`. This means that :meth:`get` will, like normal
- dictionaries, return ``None`` as a default rather than using
- :attr:`default_factory`.
+ Note that :meth:`__missing__` is *not* called for any operations besides
+ :meth:`__getitem__`. This means that :meth:`get` will, like normal
+ dictionaries, return ``None`` as a default rather than using
+ :attr:`default_factory`.
- :class:`defaultdict` objects support the following instance variable:
+ :class:`defaultdict` objects support the following instance variable:
- .. attribute:: default_factory
+ .. attribute:: default_factory
- This attribute is used by the :meth:`__missing__` method; it is
- initialized from the first argument to the constructor, if present, or to
- ``None``, if absent.
+ This attribute is used by the :meth:`__missing__` method; it is
+ initialized from the first argument to the constructor, if present, or to
+ ``None``, if absent.
:class:`defaultdict` Examples
@@ -490,13 +661,13 @@ stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``,
Using :class:`list` as the :attr:`default_factory`, it is easy to group a
sequence of key-value pairs into a dictionary of lists:
- >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
- >>> d = defaultdict(list)
- >>> for k, v in s:
- ... d[k].append(v)
- ...
- >>> list(d.items())
- [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
+ >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
+ >>> d = defaultdict(list)
+ >>> for k, v in s:
+ ... d[k].append(v)
+ ...
+ >>> list(d.items())
+ [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
When each key is encountered for the first time, it is not already in the
mapping; so an entry is automatically created using the :attr:`default_factory`
@@ -506,24 +677,24 @@ again, the look-up proceeds normally (returning the list for that key) and the
:meth:`list.append` operation adds another value to the list. This technique is
simpler and faster than an equivalent technique using :meth:`dict.setdefault`:
- >>> d = {}
- >>> for k, v in s:
- ... d.setdefault(k, []).append(v)
- ...
- >>> list(d.items())
- [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
+ >>> d = {}
+ >>> for k, v in s:
+ ... d.setdefault(k, []).append(v)
+ ...
+ >>> list(d.items())
+ [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Setting the :attr:`default_factory` to :class:`int` makes the
:class:`defaultdict` useful for counting (like a bag or multiset in other
languages):
- >>> s = 'mississippi'
- >>> d = defaultdict(int)
- >>> for k in s:
- ... d[k] += 1
- ...
- >>> list(d.items())
- [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
+ >>> s = 'mississippi'
+ >>> d = defaultdict(int)
+ >>> for k in s:
+ ... d[k] += 1
+ ...
+ >>> list(d.items())
+ [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
When a letter is first encountered, it is missing from the mapping, so the
:attr:`default_factory` function calls :func:`int` to supply a default count of
@@ -534,23 +705,23 @@ constant functions. A faster and more flexible way to create constant functions
is to use a lambda function which can supply any constant value (not just
zero):
- >>> def constant_factory(value):
- ... return lambda: value
- >>> d = defaultdict(constant_factory('<missing>'))
- >>> d.update(name='John', action='ran')
- >>> '%(name)s %(action)s to %(object)s' % d
- 'John ran to <missing>'
+ >>> def constant_factory(value):
+ ... return lambda: value
+ >>> d = defaultdict(constant_factory('<missing>'))
+ >>> d.update(name='John', action='ran')
+ >>> '%(name)s %(action)s to %(object)s' % d
+ 'John ran to <missing>'
Setting the :attr:`default_factory` to :class:`set` makes the
:class:`defaultdict` useful for building a dictionary of sets:
- >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
- >>> d = defaultdict(set)
- >>> for k, v in s:
- ... d[k].add(v)
- ...
- >>> list(d.items())
- [('blue', set([2, 4])), ('red', set([1, 3]))]
+ >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
+ >>> d = defaultdict(set)
+ >>> for k, v in s:
+ ... d[k].add(v)
+ ...
+ >>> list(d.items())
+ [('blue', {2, 4}), ('red', {1, 3})]
:func:`namedtuple` Factory Function for Tuples with Named Fields
@@ -562,168 +733,131 @@ they add the ability to access fields by name instead of position index.
.. function:: namedtuple(typename, field_names, verbose=False, rename=False)
- Returns a new tuple subclass named *typename*. The new subclass is used to
- create tuple-like objects that have fields accessible by attribute lookup as
- well as being indexable and iterable. Instances of the subclass also have a
- helpful docstring (with typename and field_names) and a helpful :meth:`__repr__`
- method which lists the tuple contents in a ``name=value`` format.
+ Returns a new tuple subclass named *typename*. The new subclass is used to
+ create tuple-like objects that have fields accessible by attribute lookup as
+ well as being indexable and iterable. Instances of the subclass also have a
+ helpful docstring (with typename and field_names) and a helpful :meth:`__repr__`
+ method which lists the tuple contents in a ``name=value`` format.
- The *field_names* are a single string with each fieldname separated by whitespace
- and/or commas, for example ``'x y'`` or ``'x, y'``. Alternatively, *field_names*
- can be a sequence of strings such as ``['x', 'y']``.
+ The *field_names* are a single string with each fieldname separated by whitespace
+ and/or commas, for example ``'x y'`` or ``'x, y'``. Alternatively, *field_names*
+ can be a sequence of strings such as ``['x', 'y']``.
- Any valid Python identifier may be used for a fieldname except for names
- starting with an underscore. Valid identifiers consist of letters, digits,
- and underscores but do not start with a digit or underscore and cannot be
- a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*,
- or *raise*.
+ Any valid Python identifier may be used for a fieldname except for names
+ starting with an underscore. Valid identifiers consist of letters, digits,
+ and underscores but do not start with a digit or underscore and cannot be
+ a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*,
+ or *raise*.
- If *rename* is true, invalid fieldnames are automatically replaced
- with positional names. For example, ``['abc', 'def', 'ghi', 'abc']`` is
- converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword
- ``def`` and the duplicate fieldname ``abc``.
+ If *rename* is true, invalid fieldnames are automatically replaced
+ with positional names. For example, ``['abc', 'def', 'ghi', 'abc']`` is
+ converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword
+ ``def`` and the duplicate fieldname ``abc``.
- If *verbose* is true, the class definition is printed just before being built.
+ If *verbose* is true, the class definition is printed after it is
+ built. This option is outdated; instead, it is simpler to print the
+ :attr:`_source` attribute.
- Named tuple instances do not have per-instance dictionaries, so they are
- lightweight and require no more memory than regular tuples.
+ Named tuple instances do not have per-instance dictionaries, so they are
+ lightweight and require no more memory than regular tuples.
- .. versionchanged:: 3.1
- Added support for *rename*.
+ .. versionchanged:: 3.1
+ Added support for *rename*.
.. doctest::
- :options: +NORMALIZE_WHITESPACE
-
- >>> # Basic example
- >>> Point = namedtuple('Point', ['x', 'y'])
- >>> p = Point(x=10, y=11)
-
- >>> # Example using the verbose option to print the class definition
- >>> Point = namedtuple('Point', 'x y', verbose=True)
- class Point(tuple):
- 'Point(x, y)'
- <BLANKLINE>
- __slots__ = ()
- <BLANKLINE>
- _fields = ('x', 'y')
- <BLANKLINE>
- def __new__(_cls, x, y):
- 'Create a new instance of Point(x, y)'
- return _tuple.__new__(_cls, (x, y))
- <BLANKLINE>
- @classmethod
- def _make(cls, iterable, new=tuple.__new__, len=len):
- 'Make a new Point object from a sequence or iterable'
- result = new(cls, iterable)
- if len(result) != 2:
- raise TypeError('Expected 2 arguments, got %d' % len(result))
- return result
- <BLANKLINE>
- def __repr__(self):
- 'Return a nicely formatted representation string'
- return self.__class__.__name__ + '(x=%r, y=%r)' % self
- <BLANKLINE>
- def _asdict(self):
- 'Return a new OrderedDict which maps field names to their values'
- return OrderedDict(zip(self._fields, self))
- <BLANKLINE>
- __dict__ = property(_asdict)
- <BLANKLINE>
- def _replace(_self, **kwds):
- 'Return a new Point object replacing specified fields with new values'
- result = _self._make(map(kwds.pop, ('x', 'y'), _self))
- if kwds:
- raise ValueError('Got unexpected field names: %r' % list(kwds.keys()))
- return result
- <BLANKLINE>
- def __getnewargs__(self):
- 'Return self as a plain tuple. Used by copy and pickle.'
- return tuple(self)
- <BLANKLINE>
- x = _property(_itemgetter(0), doc='Alias for field number 0')
- y = _property(_itemgetter(1), doc='Alias for field number 1')
-
- >>> p = Point(11, y=22) # instantiate with positional or keyword arguments
- >>> p[0] + p[1] # indexable like the plain tuple (11, 22)
- 33
- >>> x, y = p # unpack like a regular tuple
- >>> x, y
- (11, 22)
- >>> p.x + p.y # fields also accessible by name
- 33
- >>> p # readable __repr__ with a name=value style
- Point(x=11, y=22)
+ :options: +NORMALIZE_WHITESPACE
+
+ >>> # Basic example
+ >>> Point = namedtuple('Point', ['x', 'y'])
+ >>> p = Point(11, y=22) # instantiate with positional or keyword arguments
+ >>> p[0] + p[1] # indexable like the plain tuple (11, 22)
+ 33
+ >>> x, y = p # unpack like a regular tuple
+ >>> x, y
+ (11, 22)
+ >>> p.x + p.y # fields also accessible by name
+ 33
+ >>> p # readable __repr__ with a name=value style
+ Point(x=11, y=22)
Named tuples are especially useful for assigning field names to result tuples returned
by the :mod:`csv` or :mod:`sqlite3` modules::
- EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
+ EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
- import csv
- for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
- print(emp.name, emp.title)
+ import csv
+ for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
+ print(emp.name, emp.title)
- import sqlite3
- conn = sqlite3.connect('/companydata')
- cursor = conn.cursor()
- cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
- for emp in map(EmployeeRecord._make, cursor.fetchall()):
- print(emp.name, emp.title)
+ import sqlite3
+ conn = sqlite3.connect('/companydata')
+ cursor = conn.cursor()
+ cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
+ for emp in map(EmployeeRecord._make, cursor.fetchall()):
+ print(emp.name, emp.title)
In addition to the methods inherited from tuples, named tuples support
-three additional methods and one attribute. To prevent conflicts with
+three additional methods and two attributes. To prevent conflicts with
field names, the method and attribute names start with an underscore.
.. classmethod:: somenamedtuple._make(iterable)
- Class method that makes a new instance from an existing sequence or iterable.
+ Class method that makes a new instance from an existing sequence or iterable.
-.. doctest::
+ .. doctest::
- >>> t = [11, 22]
- >>> Point._make(t)
- Point(x=11, y=22)
+ >>> t = [11, 22]
+ >>> Point._make(t)
+ Point(x=11, y=22)
.. method:: somenamedtuple._asdict()
- Return a new :class:`OrderedDict` which maps field names to their corresponding
- values::
+ Return a new :class:`OrderedDict` which maps field names to their corresponding
+ values. Note, this method is no longer needed now that the same effect can
+ be achieved by using the built-in :func:`vars` function::
- >>> p._asdict()
- OrderedDict([('x', 11), ('y', 22)])
+ >>> vars(p)
+ OrderedDict([('x', 11), ('y', 22)])
- .. versionchanged:: 3.1
- Returns an :class:`OrderedDict` instead of a regular :class:`dict`.
+ .. versionchanged:: 3.1
+ Returns an :class:`OrderedDict` instead of a regular :class:`dict`.
.. method:: somenamedtuple._replace(kwargs)
- Return a new instance of the named tuple replacing specified fields with new
- values:
+ Return a new instance of the named tuple replacing specified fields with new
+ values::
+
+ >>> p = Point(x=11, y=22)
+ >>> p._replace(x=33)
+ Point(x=33, y=22)
+
+ >>> for partnum, record in inventory.items():
+ ... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
-::
+.. attribute:: somenamedtuple._source
- >>> p = Point(x=11, y=22)
- >>> p._replace(x=33)
- Point(x=33, y=22)
+ A string with the pure Python source code used to create the named
+ tuple class. The source makes the named tuple self-documenting.
+ It can be printed, executed using :func:`exec`, or saved to a file
+ and imported.
- >>> for partnum, record in inventory.items():
- ... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
+ .. versionadded:: 3.3
.. attribute:: somenamedtuple._fields
- Tuple of strings listing the field names. Useful for introspection
- and for creating new named tuple types from existing named tuples.
+ Tuple of strings listing the field names. Useful for introspection
+ and for creating new named tuple types from existing named tuples.
-.. doctest::
+ .. doctest::
- >>> p._fields # view the field names
- ('x', 'y')
+ >>> p._fields # view the field names
+ ('x', 'y')
- >>> Color = namedtuple('Color', 'red green blue')
- >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
- >>> Pixel(11, 22, 128, 255, 0)
- Pixel(x=11, y=22, red=128, green=255, blue=0)
+ >>> Color = namedtuple('Color', 'red green blue')
+ >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
+ >>> Pixel(11, 22, 128, 255, 0)
+ Pixel(x=11, y=22, red=128, green=255, blue=0)
To retrieve a field whose name is stored in a string, use the :func:`getattr`
function:
@@ -734,31 +868,30 @@ function:
To convert a dictionary to a named tuple, use the double-star-operator
(as described in :ref:`tut-unpacking-arguments`):
- >>> d = {'x': 11, 'y': 22}
- >>> Point(**d)
- Point(x=11, y=22)
+ >>> d = {'x': 11, 'y': 22}
+ >>> Point(**d)
+ Point(x=11, y=22)
Since a named tuple is a regular Python class, it is easy to add or change
functionality with a subclass. Here is how to add a calculated field and
a fixed-width print format:
>>> class Point(namedtuple('Point', 'x y')):
- __slots__ = ()
- @property
- def hypot(self):
- return (self.x ** 2 + self.y ** 2) ** 0.5
- def __str__(self):
- return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
+ __slots__ = ()
+ @property
+ def hypot(self):
+ return (self.x ** 2 + self.y ** 2) ** 0.5
+ def __str__(self):
+ return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
>>> for p in Point(3, 4), Point(14, 5/7):
- print(p)
+ print(p)
Point: x= 3.000 y= 4.000 hypot= 5.000
Point: x=14.000 y= 0.714 hypot=14.018
The subclass shown above sets ``__slots__`` to an empty tuple. This helps
keep memory requirements low by preventing the creation of instance dictionaries.
-
Subclassing is not useful for adding new, stored fields. Instead, simply
create a new named tuple type from the :attr:`_fields` attribute:
@@ -770,6 +903,7 @@ customize a prototype instance:
>>> Account = namedtuple('Account', 'owner balance transaction_count')
>>> default_account = Account('<owner name>', 0.0, 0)
>>> johns_account = default_account._replace(owner='John')
+ >>> janes_account = default_account._replace(owner='Jane')
Enumerated constants can be implemented with named tuples, but it is simpler
and more efficient to use a simple class declaration:
@@ -778,19 +912,19 @@ and more efficient to use a simple class declaration:
>>> Status.open, Status.pending, Status.closed
(0, 1, 2)
>>> class Status:
- open, pending, closed = range(3)
+ open, pending, closed = range(3)
.. seealso::
- * `Named tuple recipe <http://code.activestate.com/recipes/500261/>`_
- adapted for Python 2.4.
+ * `Named tuple recipe <http://code.activestate.com/recipes/500261/>`_
+ adapted for Python 2.4.
- * `Recipe for named tuple abstract base class with a metaclass mix-in
- <http://code.activestate.com/recipes/577629-namedtupleabc-abstract-base-class-mix-in-for-named/>`_
- by Jan Kaliszewski. Besides providing an :term:`abstract base class` for
- named tuples, it also supports an alternate :term:`metaclass`-based
- constructor that is convenient for use cases where named tuples are being
- subclassed.
+ * `Recipe for named tuple abstract base class with a metaclass mix-in
+ <http://code.activestate.com/recipes/577629-namedtupleabc-abstract-base-class-mix-in-for-named/>`_
+ by Jan Kaliszewski. Besides providing an :term:`abstract base class` for
+ named tuples, it also supports an alternate :term:`metaclass`-based
+ constructor that is convenient for use cases where named tuples are being
+ subclassed.
:class:`OrderedDict` objects
@@ -802,36 +936,36 @@ the items are returned in the order their keys were first added.
.. class:: OrderedDict([items])
- Return an instance of a dict subclass, supporting the usual :class:`dict`
- methods. An *OrderedDict* is a dict that remembers the order that keys
- were first inserted. If a new entry overwrites an existing entry, the
- original insertion position is left unchanged. Deleting an entry and
- reinserting it will move it to the end.
+ Return an instance of a dict subclass, supporting the usual :class:`dict`
+ methods. An *OrderedDict* is a dict that remembers the order that keys
+ were first inserted. If a new entry overwrites an existing entry, the
+ original insertion position is left unchanged. Deleting an entry and
+ reinserting it will move it to the end.
- .. versionadded:: 3.1
+ .. versionadded:: 3.1
- .. method:: popitem(last=True)
+ .. method:: popitem(last=True)
- The :meth:`popitem` method for ordered dictionaries returns and removes a
- (key, value) pair. The pairs are returned in LIFO order if *last* is true
- or FIFO order if false.
+ The :meth:`popitem` method for ordered dictionaries returns and removes a
+ (key, value) pair. The pairs are returned in LIFO order if *last* is true
+ or FIFO order if false.
- .. method:: move_to_end(key, last=True)
+ .. method:: move_to_end(key, last=True)
- Move an existing *key* to either end of an ordered dictionary. The item
- is moved to the right end if *last* is true (the default) or to the
- beginning if *last* is false. Raises :exc:`KeyError` if the *key* does
- not exist::
+ Move an existing *key* to either end of an ordered dictionary. The item
+ is moved to the right end if *last* is true (the default) or to the
+ beginning if *last* is false. Raises :exc:`KeyError` if the *key* does
+ not exist::
- >>> d = OrderedDict.fromkeys('abcde')
- >>> d.move_to_end('b')
- >>> ''.join(d.keys())
- 'acdeb'
- >>> d.move_to_end('b', last=False)
- >>> ''.join(d.keys())
- 'bacde'
+ >>> d = OrderedDict.fromkeys('abcde')
+ >>> d.move_to_end('b')
+ >>> ''.join(d.keys())
+ 'acdeb'
+ >>> d.move_to_end('b', last=False)
+ >>> ''.join(d.keys())
+ 'bacde'
- .. versionadded:: 3.2
+ .. versionadded:: 3.2
In addition to the usual mapping methods, ordered dictionaries also support
reverse iteration using :func:`reversed`.
@@ -849,8 +983,8 @@ semantics pass-in keyword arguments using a regular unordered dictionary.
.. seealso::
- `Equivalent OrderedDict recipe <http://code.activestate.com/recipes/576693/>`_
- that runs on Python 2.4 or later.
+ `Equivalent OrderedDict recipe <http://code.activestate.com/recipes/576693/>`_
+ that runs on Python 2.4 or later.
:class:`OrderedDict` Examples and Recipes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -893,7 +1027,7 @@ original insertion position is changed and moved to the end::
An ordered dictionary can be combined with the :class:`Counter` class
so that the counter remembers the order elements are first encountered::
- class OrderedCounter(Counter, OrderedDict):
+ class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
@@ -914,19 +1048,19 @@ attribute.
.. class:: UserDict([initialdata])
- Class that simulates a dictionary. The instance's contents are kept in a
- regular dictionary, which is accessible via the :attr:`data` attribute of
- :class:`UserDict` instances. If *initialdata* is provided, :attr:`data` is
- initialized with its contents; note that a reference to *initialdata* will not
- be kept, allowing it be used for other purposes.
+ Class that simulates a dictionary. The instance's contents are kept in a
+ regular dictionary, which is accessible via the :attr:`data` attribute of
+ :class:`UserDict` instances. If *initialdata* is provided, :attr:`data` is
+ initialized with its contents; note that a reference to *initialdata* will not
+ be kept, allowing it be used for other purposes.
- In addition to supporting the methods and operations of mappings,
- :class:`UserDict` instances provide the following attribute:
+ In addition to supporting the methods and operations of mappings,
+ :class:`UserDict` instances provide the following attribute:
- .. attribute:: data
+ .. attribute:: data
- A real dictionary used to store the contents of the :class:`UserDict`
- class.
+ A real dictionary used to store the contents of the :class:`UserDict`
+ class.
@@ -944,19 +1078,19 @@ to work with because the underlying list is accessible as an attribute.
.. class:: UserList([list])
- Class that simulates a list. The instance's contents are kept in a regular
- list, which is accessible via the :attr:`data` attribute of :class:`UserList`
- instances. The instance's contents are initially set to a copy of *list*,
- defaulting to the empty list ``[]``. *list* can be any iterable, for
- example a real Python list or a :class:`UserList` object.
+ Class that simulates a list. The instance's contents are kept in a regular
+ list, which is accessible via the :attr:`data` attribute of :class:`UserList`
+ instances. The instance's contents are initially set to a copy of *list*,
+ defaulting to the empty list ``[]``. *list* can be any iterable, for
+ example a real Python list or a :class:`UserList` object.
- In addition to supporting the methods and operations of mutable sequences,
- :class:`UserList` instances provide the following attribute:
+ In addition to supporting the methods and operations of mutable sequences,
+ :class:`UserList` instances provide the following attribute:
- .. attribute:: data
+ .. attribute:: data
- A real :class:`list` object used to store the contents of the
- :class:`UserList` class.
+ A real :class:`list` object used to store the contents of the
+ :class:`UserList` class.
**Subclassing requirements:** Subclasses of :class:`UserList` are expect to
offer a constructor which can be called with either no arguments or one
@@ -981,168 +1115,10 @@ attribute.
.. class:: UserString([sequence])
- Class that simulates a string or a Unicode string object. The instance's
- content is kept in a regular string object, which is accessible via the
- :attr:`data` attribute of :class:`UserString` instances. The instance's
- contents are initially set to a copy of *sequence*. The *sequence* can
- be an instance of :class:`bytes`, :class:`str`, :class:`UserString` (or a
- subclass) or an arbitrary sequence which can be converted into a string using
- the built-in :func:`str` function.
-
-
-.. _collections-abstract-base-classes:
-
-ABCs - abstract base classes
-----------------------------
-
-The collections module offers the following :term:`ABCs <abstract base class>`:
-
-========================= ===================== ====================== ====================================================
-ABC Inherits from Abstract Methods Mixin Methods
-========================= ===================== ====================== ====================================================
-:class:`Container` ``__contains__``
-:class:`Hashable` ``__hash__``
-:class:`Iterable` ``__iter__``
-:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__``
-:class:`Sized` ``__len__``
-:class:`Callable` ``__call__``
-
-:class:`Sequence` :class:`Sized`, ``__getitem__`` ``__contains__``, ``__iter__``, ``__reversed__``,
- :class:`Iterable`, ``index``, and ``count``
- :class:`Container`
-
-:class:`MutableSequence` :class:`Sequence` ``__setitem__``, Inherited :class:`Sequence` methods and
- ``__delitem__``, ``append``, ``reverse``, ``extend``, ``pop``,
- ``insert`` ``remove``, and ``__iadd__``
-
-:class:`Set` :class:`Sized`, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
- :class:`Iterable`, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
- :class:`Container` ``__sub__``, ``__xor__``, and ``isdisjoint``
-
-:class:`MutableSet` :class:`Set` ``add``, Inherited :class:`Set` methods and
- ``discard`` ``clear``, ``pop``, ``remove``, ``__ior__``,
- ``__iand__``, ``__ixor__``, and ``__isub__``
-
-:class:`Mapping` :class:`Sized`, ``__getitem__`` ``__contains__``, ``keys``, ``items``, ``values``,
- :class:`Iterable`, ``get``, ``__eq__``, and ``__ne__``
- :class:`Container`
-
-:class:`MutableMapping` :class:`Mapping` ``__setitem__``, Inherited :class:`Mapping` methods and
- ``__delitem__`` ``pop``, ``popitem``, ``clear``, ``update``,
- and ``setdefault``
-
-
-:class:`MappingView` :class:`Sized` ``__len__``
-:class:`ItemsView` :class:`MappingView`, ``__contains__``,
- :class:`Set` ``__iter__``
-:class:`KeysView` :class:`MappingView`, ``__contains__``,
- :class:`Set` ``__iter__``
-:class:`ValuesView` :class:`MappingView` ``__contains__``, ``__iter__``
-========================= ===================== ====================== ====================================================
-
-
-.. class:: Container
- Hashable
- Sized
- Callable
-
- ABCs for classes that provide respectively the methods :meth:`__contains__`,
- :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`.
-
-.. class:: Iterable
-
- ABC for classes that provide the :meth:`__iter__` method.
- See also the definition of :term:`iterable`.
-
-.. class:: Iterator
-
- ABC for classes that provide the :meth:`__iter__` and :meth:`next` methods.
- See also the definition of :term:`iterator`.
-
-.. class:: Sequence
- MutableSequence
-
- ABCs for read-only and mutable :term:`sequences <sequence>`.
-
-.. class:: Set
- MutableSet
-
- ABCs for read-only and mutable sets.
-
-.. class:: Mapping
- MutableMapping
-
- ABCs for read-only and mutable :term:`mappings <mapping>`.
-
-.. class:: MappingView
- ItemsView
- KeysView
- ValuesView
-
- ABCs for mapping, items, keys, and values :term:`views <view>`.
-
-
-These ABCs allow us to ask classes or instances if they provide
-particular functionality, for example::
-
- size = None
- if isinstance(myvar, collections.Sized):
- size = len(myvar)
-
-Several of the ABCs are also useful as mixins that make it easier to develop
-classes supporting container APIs. For example, to write a class supporting
-the full :class:`Set` API, it only necessary to supply the three underlying
-abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
-The ABC supplies the remaining methods such as :meth:`__and__` and
-:meth:`isdisjoint` ::
-
- class ListBasedSet(collections.Set):
- ''' Alternate set implementation favoring space over speed
- and not requiring the set elements to be hashable. '''
- def __init__(self, iterable):
- self.elements = lst = []
- for value in iterable:
- if value not in lst:
- lst.append(value)
- def __iter__(self):
- return iter(self.elements)
- def __contains__(self, value):
- return value in self.elements
- def __len__(self):
- return len(self.elements)
-
- s1 = ListBasedSet('abcdef')
- s2 = ListBasedSet('defghi')
- overlap = s1 & s2 # The __and__() method is supported automatically
-
-Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
-
-(1)
- Since some set operations create new sets, the default mixin methods need
- a way to create new instances from an iterable. The class constructor is
- assumed to have a signature in the form ``ClassName(iterable)``.
- That assumption is factored-out to an internal classmethod called
- :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
- If the :class:`Set` mixin is being used in a class with a different
- constructor signature, you will need to override :meth:`_from_iterable`
- with a classmethod that can construct new instances from
- an iterable argument.
-
-(2)
- To override the comparisons (presumably for speed, as the
- semantics are fixed), redefine :meth:`__le__` and
- then the other operations will automatically follow suit.
-
-(3)
- The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
- for the set; however, :meth:`__hash__` is not defined because not all sets
- are hashable or immutable. To add set hashabilty using mixins,
- inherit from both :meth:`Set` and :meth:`Hashable`, then define
- ``__hash__ = Set._hash``.
-
-.. seealso::
-
- * `OrderedSet recipe <http://code.activestate.com/recipes/576694/>`_ for an
- example built on :class:`MutableSet`.
-
- * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.
+ Class that simulates a string or a Unicode string object. The instance's
+ content is kept in a regular string object, which is accessible via the
+ :attr:`data` attribute of :class:`UserString` instances. The instance's
+ contents are initially set to a copy of *sequence*. The *sequence* can
+ be an instance of :class:`bytes`, :class:`str`, :class:`UserString` (or a
+ subclass) or an arbitrary sequence which can be converted into a string using
+ the built-in :func:`str` function.
diff --git a/Doc/library/concurrency.rst b/Doc/library/concurrency.rst
new file mode 100644
index 0000000..fd2dae2
--- /dev/null
+++ b/Doc/library/concurrency.rst
@@ -0,0 +1,32 @@
+.. _concurrency:
+
+********************
+Concurrent Execution
+********************
+
+The modules described in this chapter provide support for concurrent
+execution of code. The appropriate choice of tool will depend on the
+task to be executed (CPU bound vs IO bound) and preferred style of
+development (event driven cooperative multitasking vs preemptive
+multitasking) Here's an overview:
+
+
+.. toctree::
+
+ threading.rst
+ multiprocessing.rst
+ concurrent.rst
+ concurrent.futures.rst
+ subprocess.rst
+ sched.rst
+ queue.rst
+ select.rst
+
+
+The following are support modules for some of the above services:
+
+.. toctree::
+
+ dummy_threading.rst
+ _thread.rst
+ _dummy_thread.rst
diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst
index eee2285..7ed99d5 100644
--- a/Doc/library/concurrent.futures.rst
+++ b/Doc/library/concurrent.futures.rst
@@ -136,20 +136,23 @@ ThreadPoolExecutor Example
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
+ # Retrieve a single page and report the url and contents
def load_url(url, timeout):
- return urllib.request.urlopen(url, timeout=timeout).read()
+ conn = urllib.request.urlopen(url, timeout=timeout)
+ return conn.readall()
+ # We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
- future_to_url = dict((executor.submit(load_url, url, 60), url)
- for url in URLS)
-
+ # Start the load operations and mark each future with its URL
+ future_to_url = {executor.submit(load_url, url, 60):url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
- if future.exception() is not None:
- print('%r generated an exception: %s' % (url,
- future.exception()))
+ try:
+ data = future.result()
+ except Exception as exc:
+ print('%r generated an exception: %s' % (url, exc))
else:
- print('%r page is %d bytes' % (url, len(future.result())))
+ print('%r page is %d bytes' % (url, len(data)))
ProcessPoolExecutor
@@ -170,6 +173,12 @@ to a :class:`ProcessPoolExecutor` will result in deadlock.
of at most *max_workers* processes. If *max_workers* is ``None`` or not
given, it will default to the number of processors on the machine.
+ .. versionchanged:: 3.3
+ When one of the worker processes terminates abruptly, a
+ :exc:`BrokenProcessPool` error is now raised. Previously, behaviour
+ was undefined but operations on the executor or its futures would often
+ freeze or deadlock.
+
.. _processpoolexecutor-example:
@@ -371,3 +380,16 @@ Module Functions
:pep:`3148` -- futures - execute computations asynchronously
The proposal which described this feature for inclusion in the Python
standard library.
+
+
+Exception classes
+-----------------
+
+.. exception:: BrokenProcessPool
+
+ Derived from :exc:`RuntimeError`, this exception class is raised when
+ one of the workers of a :class:`ProcessPoolExecutor` has terminated
+ in a non-clean fashion (for example, if it was killed from the outside).
+
+ .. versionadded:: 3.3
+
diff --git a/Doc/library/concurrent.rst b/Doc/library/concurrent.rst
new file mode 100644
index 0000000..2eba536
--- /dev/null
+++ b/Doc/library/concurrent.rst
@@ -0,0 +1,6 @@
+The :mod:`concurrent` package
+=============================
+
+Currently, there is only one module in this package:
+
+* :mod:`concurrent.futures` -- Launching parallel tasks
diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst
index e8dc17f..ed9ebb8 100644
--- a/Doc/library/contextlib.rst
+++ b/Doc/library/contextlib.rst
@@ -12,8 +12,11 @@ This module provides utilities for common tasks involving the :keyword:`with`
statement. For more information see also :ref:`typecontextmanager` and
:ref:`context-managers`.
-Functions provided:
+Utilities
+---------
+
+Functions and classes provided:
.. decorator:: contextmanager
@@ -168,6 +171,348 @@ Functions provided:
.. versionadded:: 3.2
+.. class:: ExitStack()
+
+ A context manager that is designed to make it easy to programmatically
+ combine other context managers and cleanup functions, especially those
+ that are optional or otherwise driven by input data.
+
+ For example, a set of files may easily be handled in a single with
+ statement as follows::
+
+ with ExitStack() as stack:
+ files = [stack.enter_context(open(fname)) for fname in filenames]
+ # All opened files will automatically be closed at the end of
+ # the with statement, even if attempts to open files later
+ # in the list throw an exception
+
+ Each instance maintains a stack of registered callbacks that are called in
+ reverse order when the instance is closed (either explicitly or implicitly
+ at the end of a :keyword:`with` statement). Note that callbacks are *not*
+ invoked implicitly when the context stack instance is garbage collected.
+
+ This stack model is used so that context managers that acquire their
+ resources in their ``__init__`` method (such as file objects) can be
+ handled correctly.
+
+ Since registered callbacks are invoked in the reverse order of
+ registration, this ends up behaving as if multiple nested :keyword:`with`
+ statements had been used with the registered set of callbacks. This even
+ extends to exception handling - if an inner callback suppresses or replaces
+ an exception, then outer callbacks will be passed arguments based on that
+ updated state.
+
+ This is a relatively low level API that takes care of the details of
+ correctly unwinding the stack of exit callbacks. It provides a suitable
+ foundation for higher level context managers that manipulate the exit
+ stack in application specific ways.
+
+ .. versionadded:: 3.3
+
+ .. method:: enter_context(cm)
+
+ Enters a new context manager and adds its :meth:`__exit__` method to
+ the callback stack. The return value is the result of the context
+ manager's own :meth:`__enter__` method.
+
+ These context managers may suppress exceptions just as they normally
+ would if used directly as part of a :keyword:`with` statement.
+
+ .. method:: push(exit)
+
+ Adds a context manager's :meth:`__exit__` method to the callback stack.
+
+ As ``__enter__`` is *not* invoked, this method can be used to cover
+ part of an :meth:`__enter__` implementation with a context manager's own
+ :meth:`__exit__` method.
+
+ If passed an object that is not a context manager, this method assumes
+ it is a callback with the same signature as a context manager's
+ :meth:`__exit__` method and adds it directly to the callback stack.
+
+ By returning true values, these callbacks can suppress exceptions the
+ same way context manager :meth:`__exit__` methods can.
+
+ The passed in object is returned from the function, allowing this
+ method to be used as a function decorator.
+
+ .. method:: callback(callback, *args, **kwds)
+
+ Accepts an arbitrary callback function and arguments and adds it to
+ the callback stack.
+
+ Unlike the other methods, callbacks added this way cannot suppress
+ exceptions (as they are never passed the exception details).
+
+ The passed in callback is returned from the function, allowing this
+ method to be used as a function decorator.
+
+ .. method:: pop_all()
+
+ Transfers the callback stack to a fresh :class:`ExitStack` instance
+ and returns it. No callbacks are invoked by this operation - instead,
+ they will now be invoked when the new stack is closed (either
+ explicitly or implicitly at the end of a :keyword:`with` statement).
+
+ For example, a group of files can be opened as an "all or nothing"
+ operation as follows::
+
+ with ExitStack() as stack:
+ files = [stack.enter_context(open(fname)) for fname in filenames]
+ close_files = stack.pop_all().close
+ # If opening any file fails, all previously opened files will be
+ # closed automatically. If all files are opened successfully,
+ # they will remain open even after the with statement ends.
+ # close_files() can then be invoked explicitly to close them all
+
+ .. method:: close()
+
+ Immediately unwinds the callback stack, invoking callbacks in the
+ reverse order of registration. For any context managers and exit
+ callbacks registered, the arguments passed in will indicate that no
+ exception occurred.
+
+
+Examples and Recipes
+--------------------
+
+This section describes some examples and recipes for making effective use of
+the tools provided by :mod:`contextlib`.
+
+
+Supporting a variable number of context managers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The primary use case for :class:`ExitStack` is the one given in the class
+documentation: supporting a variable number of context managers and other
+cleanup operations in a single :keyword:`with` statement. The variability
+may come from the number of context managers needed being driven by user
+input (such as opening a user specified collection of files), or from
+some of the context managers being optional::
+
+ with ExitStack() as stack:
+ for resource in resources:
+ stack.enter_context(resource)
+ if need_special resource:
+ special = acquire_special_resource()
+ stack.callback(release_special_resource, special)
+ # Perform operations that use the acquired resources
+
+As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`
+statements to manage arbitrary resources that don't natively support the
+context management protocol.
+
+
+Simplifying support for single optional context managers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In the specific case of a single optional context manager, :class:`ExitStack`
+instances can be used as a "do nothing" context manager, allowing a context
+manager to easily be omitted without affecting the overall structure of
+the source code::
+
+ def debug_trace(details):
+ if __debug__:
+ return TraceContext(details)
+ # Don't do anything special with the context in release mode
+ return ExitStack()
+
+ with debug_trace():
+ # Suite is traced in debug mode, but runs normally otherwise
+
+
+Catching exceptions from ``__enter__`` methods
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+It is occasionally desirable to catch exceptions from an ``__enter__``
+method implementation, *without* inadvertently catching exceptions from
+the :keyword:`with` statement body or the context manager's ``__exit__``
+method. By using :class:`ExitStack` the steps in the context management
+protocol can be separated slightly in order to allow this::
+
+ stack = ExitStack()
+ try:
+ x = stack.enter_context(cm)
+ except Exception:
+ # handle __enter__ exception
+ else:
+ with stack:
+ # Handle normal case
+
+Actually needing to do this is likely to indicate that the underlying API
+should be providing a direct resource management interface for use with
+:keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not
+all APIs are well designed in that regard. When a context manager is the
+only resource management API provided, then :class:`ExitStack` can make it
+easier to handle various situations that can't be handled directly in a
+:keyword:`with` statement.
+
+
+Cleaning up in an ``__enter__`` implementation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As noted in the documentation of :meth:`ExitStack.push`, this
+method can be useful in cleaning up an already allocated resource if later
+steps in the :meth:`__enter__` implementation fail.
+
+Here's an example of doing this for a context manager that accepts resource
+acquisition and release functions, along with an optional validation function,
+and maps them to the context management protocol::
+
+ from contextlib import contextmanager, ExitStack
+
+ class ResourceManager(object):
+
+ def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
+ self.acquire_resource = acquire_resource
+ self.release_resource = release_resource
+ if check_resource_ok is None:
+ def check_resource_ok(resource):
+ return True
+ self.check_resource_ok = check_resource_ok
+
+ @contextmanager
+ def _cleanup_on_error(self):
+ with ExitStack() as stack:
+ stack.push(self)
+ yield
+ # The validation check passed and didn't raise an exception
+ # Accordingly, we want to keep the resource, and pass it
+ # back to our caller
+ stack.pop_all()
+
+ def __enter__(self):
+ resource = self.acquire_resource()
+ with self._cleanup_on_error():
+ if not self.check_resource_ok(resource):
+ msg = "Failed validation for {!r}"
+ raise RuntimeError(msg.format(resource))
+ return resource
+
+ def __exit__(self, *exc_details):
+ # We don't need to duplicate any of our resource release logic
+ self.release_resource()
+
+
+Replacing any use of ``try-finally`` and flag variables
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A pattern you will sometimes see is a ``try-finally`` statement with a flag
+variable to indicate whether or not the body of the ``finally`` clause should
+be executed. In its simplest form (that can't already be handled just by
+using an ``except`` clause instead), it looks something like this::
+
+ cleanup_needed = True
+ try:
+ result = perform_operation()
+ if result:
+ cleanup_needed = False
+ finally:
+ if cleanup_needed:
+ cleanup_resources()
+
+As with any ``try`` statement based code, this can cause problems for
+development and review, because the setup code and the cleanup code can end
+up being separated by arbitrarily long sections of code.
+
+:class:`ExitStack` makes it possible to instead register a callback for
+execution at the end of a ``with`` statement, and then later decide to skip
+executing that callback::
+
+ from contextlib import ExitStack
+
+ with ExitStack() as stack:
+ stack.callback(cleanup_resources)
+ result = perform_operation()
+ if result:
+ stack.pop_all()
+
+This allows the intended cleanup up behaviour to be made explicit up front,
+rather than requiring a separate flag variable.
+
+If a particular application uses this pattern a lot, it can be simplified
+even further by means of a small helper class::
+
+ from contextlib import ExitStack
+
+ class Callback(ExitStack):
+ def __init__(self, callback, *args, **kwds):
+ super(Callback, self).__init__()
+ self.callback(callback, *args, **kwds)
+
+ def cancel(self):
+ self.pop_all()
+
+ with Callback(cleanup_resources) as cb:
+ result = perform_operation()
+ if result:
+ cb.cancel()
+
+If the resource cleanup isn't already neatly bundled into a standalone
+function, then it is still possible to use the decorator form of
+:meth:`ExitStack.callback` to declare the resource cleanup in
+advance::
+
+ from contextlib import ExitStack
+
+ with ExitStack() as stack:
+ @stack.callback
+ def cleanup_resources():
+ ...
+ result = perform_operation()
+ if result:
+ stack.pop_all()
+
+Due to the way the decorator protocol works, a callback function
+declared this way cannot take any parameters. Instead, any resources to
+be released must be accessed as closure variables
+
+
+Using a context manager as a function decorator
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:class:`ContextDecorator` makes it possible to use a context manager in
+both an ordinary ``with`` statement and also as a function decorator.
+
+For example, it is sometimes useful to wrap functions or groups of statements
+with a logger that can track the time of entry and time of exit. Rather than
+writing both a function decorator and a context manager for the task,
+inheriting from :class:`ContextDecorator` provides both capabilities in a
+single definition::
+
+ from contextlib import ContextDecorator
+ import logging
+
+ logging.basicConfig(level=logging.INFO)
+
+ class track_entry_and_exit(ContextDecorator):
+ def __init__(self, name):
+ self.name = name
+
+ def __enter__(self):
+ logging.info('Entering: {}'.format(name))
+
+ def __exit__(self, exc_type, exc, exc_tb):
+ logging.info('Exiting: {}'.format(name))
+
+Instances of this class can be used as both a context manager::
+
+ with track_entry_and_exit('widget loader'):
+ print('Some time consuming activity goes here')
+ load_widget()
+
+And also as a function decorator::
+
+ @track_entry_and_exit('widget loader')
+ def activity():
+ print('Some time consuming activity goes here')
+ load_widget()
+
+Note that there is one additional limitation when using context managers
+as function decorators: there's no way to access the return value of
+:meth:`__enter__`. If that value is needed, then it is still necessary to use
+an explicit ``with`` statement.
+
.. seealso::
:pep:`0343` - The "with" statement
diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst
index f3721d1..50d5879 100644
--- a/Doc/library/copyreg.rst
+++ b/Doc/library/copyreg.rst
@@ -33,9 +33,11 @@ Such constructors may be factory functions or class instances.
returned by *function* at pickling time. :exc:`TypeError` will be raised if
*object* is a class or *constructor* is not callable.
- See the :mod:`pickle` module for more details on the interface expected of
- *function* and *constructor*.
-
+ See the :mod:`pickle` module for more details on the interface
+ expected of *function* and *constructor*. Note that the
+ :attr:`~pickle.Pickler.dispatch_table` attribute of a pickler
+ object or subclass of :class:`pickle.Pickler` can also be used for
+ declaring reduction functions.
Example
-------
diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst
index 0be571e..b4c90cd 100644
--- a/Doc/library/crypt.rst
+++ b/Doc/library/crypt.rst
@@ -15,9 +15,9 @@
This module implements an interface to the :manpage:`crypt(3)` routine, which is
a one-way hash function based upon a modified DES algorithm; see the Unix man
-page for further details. Possible uses include allowing Python scripts to
-accept typed passwords from the user, or attempting to crack Unix passwords with
-a dictionary.
+page for further details. Possible uses include storing hashed passwords
+so you can check passwords without storing the actual password, or attempting
+to crack Unix passwords with a dictionary.
.. index:: single: crypt(3)
@@ -26,15 +26,74 @@ the :manpage:`crypt(3)` routine in the running system. Therefore, any
extensions available on the current implementation will also be available on
this module.
+Hashing Methods
+---------------
-.. function:: crypt(word, salt)
+.. versionadded:: 3.3
+
+The :mod:`crypt` module defines the list of hashing methods (not all methods
+are available on all platforms):
+
+.. data:: METHOD_SHA512
+
+ A Modular Crypt Format method with 16 character salt and 86 character
+ hash. This is the strongest method.
+
+.. data:: METHOD_SHA256
+
+ Another Modular Crypt Format method with 16 character salt and 43
+ character hash.
+
+.. data:: METHOD_MD5
+
+ Another Modular Crypt Format method with 8 character salt and 22
+ character hash.
+
+.. data:: METHOD_CRYPT
+
+ The traditional method with a 2 character salt and 13 characters of
+ hash. This is the weakest method.
+
+
+Module Attributes
+-----------------
+
+.. versionadded:: 3.3
+
+.. attribute:: methods
+
+ A list of available password hashing algorithms, as
+ ``crypt.METHOD_*`` objects. This list is sorted from strongest to
+ weakest, and is guaranteed to have at least ``crypt.METHOD_CRYPT``.
+
+
+Module Functions
+----------------
+
+The :mod:`crypt` module defines the following functions:
+
+.. function:: crypt(word, salt=None)
*word* will usually be a user's password as typed at a prompt or in a graphical
- interface. *salt* is usually a random two-character string which will be used
- to perturb the DES algorithm in one of 4096 ways. The characters in *salt* must
- be in the set ``[./a-zA-Z0-9]``. Returns the hashed password as a string, which
- will be composed of characters from the same alphabet as the salt (the first two
- characters represent the salt itself).
+ interface. The optional *salt* is either a string as returned from
+ :func:`mksalt`, one of the ``crypt.METHOD_*`` values (though not all
+ may be available on all platforms), or a full encrypted password
+ including salt, as returned by this function. If *salt* is not
+ provided, the strongest method will be used (as returned by
+ :func:`methods`.
+
+ Checking a password is usually done by passing the plain-text password
+ as *word* and the full results of a previous :func:`crypt` call,
+ which should be the same as the results of this call.
+
+ *salt* (either a random 2 or 16 character string, possibly prefixed with
+ ``$digit$`` to indicate the method) which will be used to perturb the
+ encryption algorithm. The characters in *salt* must be in the set
+ ``[./a-zA-Z0-9]``, with the exception of Modular Crypt Format which
+ prefixes a ``$digit$``.
+
+ Returns the hashed password as a string, which will be composed of
+ characters from the same alphabet as the salt.
.. index:: single: crypt(3)
@@ -42,18 +101,52 @@ this module.
different sizes in the *salt*, it is recommended to use the full crypted
password as salt when checking for a password.
-A simple example illustrating typical use::
+ .. versionchanged:: 3.3
+ Accept ``crypt.METHOD_*`` values in addition to strings for *salt*.
+
+
+.. function:: mksalt(method=None)
- import crypt, getpass, pwd
+ Return a randomly generated salt of the specified method. If no
+ *method* is given, the strongest method available as returned by
+ :func:`methods` is used.
+
+ The return value is a string either of 2 characters in length for
+ ``crypt.METHOD_CRYPT``, or 19 characters starting with ``$digit$`` and
+ 16 random characters from the set ``[./a-zA-Z0-9]``, suitable for
+ passing as the *salt* argument to :func:`crypt`.
+
+ .. versionadded:: 3.3
+
+Examples
+--------
+
+A simple example illustrating typical use (a constant-time comparison
+operation is needed to limit exposure to timing attacks.
+:func:`hmac.compare_digest` is suitable for this purpose)::
+
+ import pwd
+ import crypt
+ import getpass
+ from hmac import compare_digest as compare_hash
def login():
- username = input('Python login:')
+ username = input('Python login: ')
cryptedpasswd = pwd.getpwnam(username)[1]
if cryptedpasswd:
if cryptedpasswd == 'x' or cryptedpasswd == '*':
- raise "Sorry, currently no support for shadow passwords"
+ raise ValueError('no support for shadow passwords')
cleartext = getpass.getpass()
- return crypt.crypt(cleartext, cryptedpasswd) == cryptedpasswd
+ return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)
else:
- return 1
+ return True
+
+To generate a hash of a password using the strongest available method and
+check it against the original::
+
+ import crypt
+ from hmac import compare_digest as compare_hash
+ hashed = crypt.crypt(plaintext)
+ if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
+ raise ValueError("hashed version doesn't validate against original")
diff --git a/Doc/library/crypto.rst b/Doc/library/crypto.rst
index a233561..469ede49 100644
--- a/Doc/library/crypto.rst
+++ b/Doc/library/crypto.rst
@@ -8,6 +8,7 @@ Cryptographic Services
The modules described in this chapter implement various algorithms of a
cryptographic nature. They are available at the discretion of the installation.
+On Unix systems, the :mod:`crypt` module may also be available.
Here's an overview:
diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst
index d8df7fc..4f19cee 100644
--- a/Doc/library/csv.rst
+++ b/Doc/library/csv.rst
@@ -11,15 +11,15 @@
pair: data; tabular
The so-called CSV (Comma Separated Values) format is the most common import and
-export format for spreadsheets and databases. There is no "CSV standard", so
-the format is operationally defined by the many applications which read and
-write it. The lack of a standard means that subtle differences often exist in
-the data produced and consumed by different applications. These differences can
-make it annoying to process CSV files from multiple sources. Still, while the
-delimiters and quoting characters vary, the overall format is similar enough
-that it is possible to write a single module which can efficiently manipulate
-such data, hiding the details of reading and writing the data from the
-programmer.
+export format for spreadsheets and databases. CSV format was used for many
+years prior to attempts to describe the format in a standardized way in
+:rfc:`4180`. The lack of a well-defined standard means that subtle differences
+often exist in the data produced and consumed by different applications. These
+differences can make it annoying to process CSV files from multiple sources.
+Still, while the delimiters and quoting characters vary, the overall format is
+similar enough that it is possible to write a single module which can
+efficiently manipulate such data, hiding the details of reading and writing the
+data from the programmer.
The :mod:`csv` module implements classes to read and write tabular data in CSV
format. It allows programmers to say, "write this data in the format preferred
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 3887ee1..e848723 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -39,9 +39,14 @@ loads libraries which export functions using the standard ``cdecl`` calling
convention, while *windll* libraries call functions using the ``stdcall``
calling convention. *oledll* also uses the ``stdcall`` calling convention, and
assumes the functions return a Windows :c:type:`HRESULT` error code. The error
-code is used to automatically raise a :class:`WindowsError` exception when the
+code is used to automatically raise a :class:`OSError` exception when the
function call fails.
+.. versionchanged:: 3.3
+ Windows errors used to raise :exc:`WindowsError`, which is now an alias
+ of :exc:`OSError`.
+
+
Here are some examples for Windows. Note that ``msvcrt`` is the MS standard C
library containing most standard C functions, and uses the cdecl calling
convention::
@@ -189,7 +194,7 @@ argument values::
>>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS
Traceback (most recent call last):
File "<stdin>", line 1, in ?
- WindowsError: exception: access violation reading 0x00000020
+ OSError: exception: access violation reading 0x00000020
>>>
There are, however, enough ways to crash Python with :mod:`ctypes`, so you
@@ -496,7 +501,7 @@ useful to check for error return values and automatically raise an exception::
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in ValidHandle
- WindowsError: [Errno 126] The specified module could not be found.
+ OSError: [Errno 126] The specified module could not be found.
>>>
``WinError`` is a function which will call Windows ``FormatMessage()`` api to
@@ -926,21 +931,21 @@ Callback functions
:mod:`ctypes` allows to create C callable function pointers from Python callables.
These are sometimes called *callback functions*.
-First, you must create a class for the callback function, the class knows the
+First, you must create a class for the callback function. The class knows the
calling convention, the return type, and the number and types of arguments this
function will receive.
-The CFUNCTYPE factory function creates types for callback functions using the
-normal cdecl calling convention, and, on Windows, the WINFUNCTYPE factory
-function creates types for callback functions using the stdcall calling
-convention.
+The :func:`CFUNCTYPE` factory function creates types for callback functions
+using the ``cdecl`` calling convention. On Windows, the :func:`WINFUNCTYPE`
+factory function creates types for callback functions using the ``stdcall``
+calling convention.
Both of these factory functions are called with the result type as first
argument, and the callback functions expected argument types as the remaining
arguments.
I will present an example here which uses the standard C library's
-:c:func:`qsort` function, this is used to sort items with the help of a callback
+:c:func:`qsort` function, that is used to sort items with the help of a callback
function. :c:func:`qsort` will be used to sort an array of integers::
>>> IntArray5 = c_int * 5
@@ -953,7 +958,7 @@ function. :c:func:`qsort` will be used to sort an array of integers::
items in the data array, the size of one item, and a pointer to the comparison
function, the callback. The callback will then be called with two pointers to
items, and it must return a negative integer if the first item is smaller than
-the second, a zero if they are equal, and a positive integer else.
+the second, a zero if they are equal, and a positive integer otherwise.
So our callback function receives pointers to integers, and must return an
integer. First we create the ``type`` for the callback function::
@@ -961,36 +966,8 @@ integer. First we create the ``type`` for the callback function::
>>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
>>>
-For the first implementation of the callback function, we simply print the
-arguments we get, and return 0 (incremental development ;-)::
-
- >>> def py_cmp_func(a, b):
- ... print("py_cmp_func", a, b)
- ... return 0
- ...
- >>>
-
-Create the C callable callback::
-
- >>> cmp_func = CMPFUNC(py_cmp_func)
- >>>
-
-And we're ready to go::
-
- >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +WINDOWS
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- py_cmp_func <ctypes.LP_c_long object at 0x00...> <ctypes.LP_c_long object at 0x00...>
- >>>
-
-We know how to access the contents of a pointer, so lets redefine our callback::
+To get started, here is a simple callback that shows the values it gets
+passed::
>>> def py_cmp_func(a, b):
... print("py_cmp_func", a[0], b[0])
@@ -999,23 +976,7 @@ We know how to access the contents of a pointer, so lets redefine our callback::
>>> cmp_func = CMPFUNC(py_cmp_func)
>>>
-Here is what we get on Windows::
-
- >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +WINDOWS
- py_cmp_func 7 1
- py_cmp_func 33 1
- py_cmp_func 99 1
- py_cmp_func 5 1
- py_cmp_func 7 5
- py_cmp_func 33 5
- py_cmp_func 99 5
- py_cmp_func 7 99
- py_cmp_func 33 99
- py_cmp_func 7 33
- >>>
-
-It is funny to see that on linux the sort function seems to work much more
-efficiently, it is doing less comparisons::
+The result::
>>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +LINUX
py_cmp_func 5 1
@@ -1025,32 +986,13 @@ efficiently, it is doing less comparisons::
py_cmp_func 1 7
>>>
-Ah, we're nearly done! The last step is to actually compare the two items and
-return a useful result::
+Now we can actually compare the two items and return a useful result::
>>> def py_cmp_func(a, b):
... print("py_cmp_func", a[0], b[0])
... return a[0] - b[0]
...
>>>
-
-Final run on Windows::
-
- >>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func)) # doctest: +WINDOWS
- py_cmp_func 33 7
- py_cmp_func 99 33
- py_cmp_func 5 99
- py_cmp_func 1 99
- py_cmp_func 33 7
- py_cmp_func 1 33
- py_cmp_func 5 33
- py_cmp_func 5 7
- py_cmp_func 1 7
- py_cmp_func 5 1
- >>>
-
-and on Linux::
-
>>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func)) # doctest: +LINUX
py_cmp_func 5 1
py_cmp_func 33 99
@@ -1059,9 +1001,6 @@ and on Linux::
py_cmp_func 5 7
>>>
-It is quite interesting to see that the Windows :func:`qsort` function needs
-more comparisons than the linux version!
-
As we can easily check, our array is sorted now::
>>> for i in ia: print(i, end=" ")
@@ -1071,9 +1010,9 @@ As we can easily check, our array is sorted now::
**Important note for callback functions:**
-Make sure you keep references to CFUNCTYPE objects as long as they are used from
-C code. :mod:`ctypes` doesn't, and if you don't, they may be garbage collected,
-crashing your program when a callback is made.
+Make sure you keep references to :func:`CFUNCTYPE` objects as long as they are
+used from C code. :mod:`ctypes` doesn't, and if you don't, they may be garbage
+collected, crashing your program when a callback is made.
.. _ctypes-accessing-values-exported-from-dlls:
@@ -1350,7 +1289,10 @@ way is to instantiate one of the following classes:
assumed to return the windows specific :class:`HRESULT` code. :class:`HRESULT`
values contain information specifying whether the function call failed or
succeeded, together with additional error code. If the return value signals a
- failure, an :class:`WindowsError` is automatically raised.
+ failure, an :class:`OSError` is automatically raised.
+
+ .. versionchanged:: 3.3
+ :exc:`WindowsError` used to be raised.
.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False)
@@ -1967,11 +1909,14 @@ Utility functions
.. function:: WinError(code=None, descr=None)
Windows only: this function is probably the worst-named thing in ctypes. It
- creates an instance of WindowsError. If *code* is not specified,
+ creates an instance of OSError. If *code* is not specified,
``GetLastError`` is called to determine the error code. If *descr* is not
specified, :func:`FormatError` is called to get a textual description of the
error.
+ .. versionchanged:: 3.3
+ An instance of :exc:`WindowsError` used to be created.
+
.. function:: wstring_at(address, size=-1)
diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst
index 11ab5d0..9e5cb55 100644
--- a/Doc/library/curses.rst
+++ b/Doc/library/curses.rst
@@ -599,6 +599,17 @@ The module :mod:`curses` defines the following functions:
Only one *ch* can be pushed before :meth:`getch` is called.
+.. function:: unget_wch(ch)
+
+ Push *ch* so the next :meth:`get_wch` will return it.
+
+ .. note::
+
+ Only one *ch* can be pushed before :meth:`get_wch` is called.
+
+ .. versionadded:: 3.3
+
+
.. function:: ungetmouse(id, x, y, z, bstate)
Push a :const:`KEY_MOUSE` event onto the input queue, associating the given
@@ -643,7 +654,7 @@ Window Objects
--------------
Window objects, as returned by :func:`initscr` and :func:`newwin` above, have
-the following methods:
+the following methods and attributes:
.. method:: window.addch(ch[, attr])
@@ -831,6 +842,16 @@ the following methods:
event.
+.. attribute:: window.encoding
+
+ Encoding used to encode method arguments (Unicode strings and characters).
+ The encoding attribute is inherited from the parent window when a subwindow
+ is created, for example with :meth:`window.subwin`. By default, the locale
+ encoding is used (see :func:`locale.getpreferredencoding`).
+
+ .. versionadded:: 3.3
+
+
.. method:: window.erase()
Clear the window.
@@ -854,11 +875,20 @@ the following methods:
until a key is pressed.
+.. method:: window.get_wch([y, x])
+
+ Get a wide character. Return a character for most keys, or an integer for
+ function keys, keypad keys, and other special keys.
+
+ .. versionadded:: 3.3
+
+
.. method:: window.getkey([y, x])
Get a character, returning a string instead of an integer, as :meth:`getch`
- does. Function keys, keypad keys and so on return a multibyte string containing
- the key name. In no-delay mode, an exception is raised if there is no input.
+ does. Function keys, keypad keys and other special keys return a multibyte
+ string containing the key name. In no-delay mode, an exception is raised if
+ there is no input.
.. method:: window.getmaxyx()
diff --git a/Doc/library/datatypes.rst b/Doc/library/datatypes.rst
index 6b4a71a..d0382e0 100644
--- a/Doc/library/datatypes.rst
+++ b/Doc/library/datatypes.rst
@@ -21,11 +21,10 @@ The following modules are documented in this chapter:
datetime.rst
calendar.rst
collections.rst
+ collections.abc.rst
heapq.rst
bisect.rst
array.rst
- sched.rst
- queue.rst
weakref.rst
types.rst
copy.rst
diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst
index 88fa01c..7c0aac3 100644
--- a/Doc/library/datetime.rst
+++ b/Doc/library/datetime.rst
@@ -404,12 +404,19 @@ Other constructors, all class methods:
.. classmethod:: date.fromtimestamp(timestamp)
Return the local date corresponding to the POSIX timestamp, such as is returned
- by :func:`time.time`. This may raise :exc:`ValueError`, if the timestamp is out
- of the range of values supported by the platform C :c:func:`localtime` function.
+ by :func:`time.time`. This may raise :exc:`OverflowError`, if the timestamp is out
+ of the range of values supported by the platform C :c:func:`localtime` function,
+ and :exc:`OSError` on :c:func:`localtime` failure.
It's common for this to be restricted to years from 1970 through 2038. Note
that on non-POSIX systems that include leap seconds in their notion of a
timestamp, leap seconds are ignored by :meth:`fromtimestamp`.
+ .. versionchanged:: 3.3
+ Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
+ is out of the range of values supported by the platform C
+ :c:func:`localtime` function. Raise :exc:`OSError` instead of
+ :exc:`ValueError` on :c:func:`localtime` failure.
+
.. classmethod:: date.fromordinal(ordinal)
@@ -713,23 +720,44 @@ Other constructors, all class methods:
equivalent to
``tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))``.
- :meth:`fromtimestamp` may raise :exc:`ValueError`, if the timestamp is out of
+ :meth:`fromtimestamp` may raise :exc:`OverflowError`, if the timestamp is out of
the range of values supported by the platform C :c:func:`localtime` or
- :c:func:`gmtime` functions. It's common for this to be restricted to years in
+ :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or
+ :c:func:`gmtime` failure.
+ It's common for this to be restricted to years in
1970 through 2038. Note that on non-POSIX systems that include leap seconds in
their notion of a timestamp, leap seconds are ignored by :meth:`fromtimestamp`,
and then it's possible to have two timestamps differing by a second that yield
identical :class:`.datetime` objects. See also :meth:`utcfromtimestamp`.
+ .. versionchanged:: 3.3
+ Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
+ is out of the range of values supported by the platform C
+ :c:func:`localtime` or :c:func:`gmtime` functions. Raise :exc:`OSError`
+ instead of :exc:`ValueError` on :c:func:`localtime` or :c:func:`gmtime`
+ failure.
+
.. classmethod:: datetime.utcfromtimestamp(timestamp)
Return the UTC :class:`.datetime` corresponding to the POSIX timestamp, with
- :attr:`tzinfo` ``None``. This may raise :exc:`ValueError`, if the timestamp is
- out of the range of values supported by the platform C :c:func:`gmtime` function.
+ :attr:`tzinfo` ``None``. This may raise :exc:`OverflowError`, if the timestamp is
+ out of the range of values supported by the platform C :c:func:`gmtime` function,
+ and :exc:`OSError` on :c:func:`gmtime` failure.
It's common for this to be restricted to years in 1970 through 2038. See also
:meth:`fromtimestamp`.
+ On the POSIX compliant platforms, ``utcfromtimestamp(timestamp)``
+ is equivalent to the following expression::
+
+ datetime(1970, 1, 1) + timedelta(seconds=timestamp)
+
+ .. versionchanged:: 3.3
+ Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
+ is out of the range of values supported by the platform C
+ :c:func:`gmtime` function. Raise :exc:`OSError` instead of
+ :exc:`ValueError` on :c:func:`gmtime` failure.
+
.. classmethod:: datetime.fromordinal(ordinal)
@@ -873,13 +901,20 @@ Supported operations:
*datetime1* is considered less than *datetime2* when *datetime1* precedes
*datetime2* in time.
- If one comparand is naive and the other is aware, :exc:`TypeError` is raised.
+ If one comparand is naive and the other is aware, :exc:`TypeError`
+ is raised if an order comparison is attempted. For equality
+ comparisons, naive instances are never equal to aware instances.
+
If both comparands are aware, and have the same :attr:`tzinfo` attribute, the
common :attr:`tzinfo` attribute is ignored and the base datetimes are
compared. If both comparands are aware and have different :attr:`tzinfo`
attributes, the comparands are first adjusted by subtracting their UTC
offsets (obtained from ``self.utcoffset()``).
+ .. versionchanged:: 3.3
+ Equality comparisons between naive and aware :class:`datetime`
+ instances don't raise :exc:`TypeError`.
+
.. note::
In order to stop comparison from falling back to the default scheme of comparing
@@ -922,17 +957,22 @@ Instance methods:
datetime with no conversion of date and time data.
-.. method:: datetime.astimezone(tz)
+.. method:: datetime.astimezone(tz=None)
- Return a :class:`.datetime` object with new :attr:`tzinfo` attribute *tz*,
+ Return a :class:`datetime` object with new :attr:`tzinfo` attribute *tz*,
adjusting the date and time data so the result is the same UTC time as
*self*, but in *tz*'s local time.
- *tz* must be an instance of a :class:`tzinfo` subclass, and its
+ If provided, *tz* must be an instance of a :class:`tzinfo` subclass, and its
:meth:`utcoffset` and :meth:`dst` methods must not return ``None``. *self* must
be aware (``self.tzinfo`` must not be ``None``, and ``self.utcoffset()`` must
not return ``None``).
+ If called without arguments (or with ``tz=None``) the system local
+ timezone is assumed. The ``tzinfo`` attribute of the converted
+ datetime instance will be set to an instance of :class:`timezone`
+ with the zone name and offset obtained from the OS.
+
If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no
adjustment of date or time data is performed. Else the result is local
time in time zone *tz*, representing the same UTC time as *self*: after
@@ -959,6 +999,9 @@ Instance methods:
# Convert from UTC to tz's local time.
return tz.fromutc(utc)
+ .. versionchanged:: 3.3
+ *tz* now can be omitted.
+
.. method:: datetime.utcoffset()
@@ -1015,6 +1058,39 @@ Instance methods:
Return the proleptic Gregorian ordinal of the date. The same as
``self.date().toordinal()``.
+.. method:: datetime.timestamp()
+
+ Return POSIX timestamp corresponding to the :class:`datetime`
+ instance. The return value is a :class:`float` similar to that
+ returned by :func:`time.time`.
+
+ Naive :class:`datetime` instances are assumed to represent local
+ time and this method relies on the platform C :c:func:`mktime`
+ function to perform the conversion. Since :class:`datetime`
+ supports wider range of values than :c:func:`mktime` on many
+ platforms, this method may raise :exc:`OverflowError` for times far
+ in the past or far in the future.
+
+ For aware :class:`datetime` instances, the return value is computed
+ as::
+
+ (dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
+
+ .. versionadded:: 3.3
+
+ .. note::
+
+ There is no method to obtain the POSIX timestamp directly from a
+ naive :class:`datetime` instance representing UTC time. If your
+ application uses this convention and your system timezone is not
+ set to UTC, you can obtain the POSIX timestamp by supplying
+ ``tzinfo=timezone.utc``::
+
+ timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
+
+ or by calculating the timestamp directly::
+
+ timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
.. method:: datetime.weekday()
@@ -1254,7 +1330,10 @@ Supported operations:
* comparison of :class:`.time` to :class:`.time`, where *a* is considered less
than *b* when *a* precedes *b* in time. If one comparand is naive and the other
- is aware, :exc:`TypeError` is raised. If both comparands are aware, and have
+ is aware, :exc:`TypeError` is raised if an order comparison is attempted. For equality
+ comparisons, naive instances are never equal to aware instances.
+
+ If both comparands are aware, and have
the same :attr:`tzinfo` attribute, the common :attr:`tzinfo` attribute is
ignored and the base times are compared. If both comparands are aware and
have different :attr:`tzinfo` attributes, the comparands are first adjusted by
@@ -1264,6 +1343,10 @@ Supported operations:
different type, :exc:`TypeError` is raised unless the comparison is ``==`` or
``!=``. The latter cases return :const:`False` or :const:`True`, respectively.
+ .. versionchanged:: 3.3
+ Equality comparisons between naive and aware :class:`time` instances
+ don't raise :exc:`TypeError`.
+
* hash, use as dict key
* efficient pickling
@@ -1587,11 +1670,12 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)).
:class:`timezone` Objects
--------------------------
-A :class:`timezone` object represents a timezone that is defined by a
-fixed offset from UTC. Note that objects of this class cannot be used
-to represent timezone information in the locations where different
-offsets are used in different days of the year or where historical
-changes have been made to civil time.
+The :class:`timezone` class is a subclass of :class:`tzinfo`, each
+instance of which represents a timezone defined by a fixed offset from
+UTC. Note that objects of this class cannot be used to represent
+timezone information in the locations where different offsets are used
+in different days of the year or where historical changes have been
+made to civil time.
.. class:: timezone(offset[, name])
@@ -1760,8 +1844,7 @@ format codes.
| | decimal number [00,99]. | |
+-----------+--------------------------------+-------+
| ``%Y`` | Year with century as a decimal | \(5) |
-| | number [0001,9999] (strptime), | |
-| | [1000,9999] (strftime). | |
+| | number [0001,9999]. | |
+-----------+--------------------------------+-------+
| ``%z`` | UTC offset in the form +HHMM | \(6) |
| | or -HHMM (empty string if the | |
@@ -1795,10 +1878,7 @@ Notes:
calculations when the day of the week and the year are specified.
(5)
- For technical reasons, :meth:`strftime` method does not support
- dates before year 1000: ``t.strftime(format)`` will raise a
- :exc:`ValueError` when ``t.year < 1000`` even if ``format`` does
- not contain ``%Y`` directive. The :meth:`strptime` method can
+ The :meth:`strptime` method can
parse years in the full [1, 9999] range, but years < 1000 must be
zero-filled to 4-digit width.
@@ -1806,6 +1886,10 @@ Notes:
In previous versions, :meth:`strftime` method was restricted to
years >= 1900.
+ .. versionchanged:: 3.3
+ In version 3.2, :meth:`strftime` method was restricted to
+ years >= 1000.
+
(6)
For example, if :meth:`utcoffset` returns ``timedelta(hours=-3, minutes=-30)``,
``%z`` is replaced with the string ``'-0330'``.
diff --git a/Doc/library/debug.rst b/Doc/library/debug.rst
index b2ee4fa..c69fb1c 100644
--- a/Doc/library/debug.rst
+++ b/Doc/library/debug.rst
@@ -10,7 +10,8 @@ allowing you to identify bottlenecks in your programs.
.. toctree::
bdb.rst
+ faulthandler.rst
pdb.rst
profile.rst
timeit.rst
- trace.rst \ No newline at end of file
+ trace.rst
diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst
index 919ebe4..1fc56ad 100644
--- a/Doc/library/decimal.rst
+++ b/Doc/library/decimal.rst
@@ -9,6 +9,7 @@
.. moduleauthor:: Raymond Hettinger <python at rcn.com>
.. moduleauthor:: Aahz <aahz at pobox.com>
.. moduleauthor:: Tim Peters <tim.one at comcast.net>
+.. moduleauthor:: Stefan Krah <skrah at bytereef.org>
.. sectionauthor:: Raymond D. Hettinger <python at rcn.com>
.. import modules for testing inline doctests with the Sphinx doctest builder
@@ -20,8 +21,9 @@
# make sure each group gets a fresh context
setcontext(Context())
-The :mod:`decimal` module provides support for decimal floating point
-arithmetic. It offers several advantages over the :class:`float` datatype:
+The :mod:`decimal` module provides support for fast correctly-rounded
+decimal floating point arithmetic. It offers several advantages over the
+:class:`float` datatype:
* Decimal "is based on a floating-point model which was designed with people
in mind, and necessarily has a paramount guiding principle -- computers must
@@ -92,7 +94,7 @@ computation. Depending on the needs of the application, signals may be ignored,
considered as informational, or treated as exceptions. The signals in the
decimal module are: :const:`Clamped`, :const:`InvalidOperation`,
:const:`DivisionByZero`, :const:`Inexact`, :const:`Rounded`, :const:`Subnormal`,
-:const:`Overflow`, and :const:`Underflow`.
+:const:`Overflow`, :const:`Underflow` and :const:`FloatOperation`.
For each signal there is a flag and a trap enabler. When a signal is
encountered, its flag is set to one, then, if the trap enabler is
@@ -122,7 +124,7 @@ precision, rounding, or enabled traps::
>>> from decimal import *
>>> getcontext()
- Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
+ Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
InvalidOperation])
@@ -132,7 +134,7 @@ Decimal instances can be constructed from integers, strings, floats, or tuples.
Construction from an integer or a float performs an exact conversion of the
value of that integer or float. Decimal numbers include special values such as
:const:`NaN` which stands for "Not a number", positive and negative
-:const:`Infinity`, and :const:`-0`.
+:const:`Infinity`, and :const:`-0`::
>>> getcontext().prec = 28
>>> Decimal(10)
@@ -152,6 +154,25 @@ value of that integer or float. Decimal numbers include special values such as
>>> Decimal('-Infinity')
Decimal('-Infinity')
+If the :exc:`FloatOperation` signal is trapped, accidental mixing of
+decimals and floats in constructors or ordering comparisons raises
+an exception::
+
+ >>> c = getcontext()
+ >>> c.traps[FloatOperation] = True
+ >>> Decimal(3.14)
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
+ >>> Decimal('3.5') < 3.7
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
+ >>> Decimal('3.5') == 3.5
+ True
+
+.. versionadded:: 3.3
+
The significance of a new Decimal is determined solely by the number of digits
input. Context precision and rounding only come into play during arithmetic
operations.
@@ -169,6 +190,16 @@ operations.
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
+If the internal limits of the C version are exceeded, constructing
+a decimal raises :class:`InvalidOperation`::
+
+ >>> Decimal("1e9999999999999999999")
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
+
+.. versionchanged:: 3.3
+
Decimals interact well with much of the rest of Python. Here is a small decimal
floating point flying circus:
@@ -244,7 +275,7 @@ enabled:
Decimal('0.142857142857142857142857142857142857142857142857142857142857')
>>> ExtendedContext
- Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
+ Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[], traps=[])
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(7)
@@ -269,7 +300,7 @@ using the :meth:`clear_flags` method. ::
>>> Decimal(355) / Decimal(113)
Decimal('3.14159292')
>>> getcontext()
- Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
+ Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])
The *flags* entry shows that the rational approximation to :const:`Pi` was
@@ -358,6 +389,10 @@ Decimal objects
The argument to the constructor is now permitted to be a :class:`float`
instance.
+ .. versionchanged:: 3.3
+ :class:`float` arguments raise an exception if the :exc:`FloatOperation`
+ trap is set. By default the trap is off.
+
Decimal floating point objects share many properties with the other built-in
numeric types such as :class:`float` and :class:`int`. All of the usual math
operations and special methods apply. Likewise, decimal objects can be
@@ -702,6 +737,11 @@ Decimal objects
resulting exponent is greater than :attr:`Emax` or less than
:attr:`Etiny`.
+ .. deprecated:: 3.3
+ *watchexp* is an implementation detail from the pure Python version
+ and is not present in the C version. It will be removed in version
+ 3.4, where it defaults to ``True``.
+
.. method:: radix()
Return ``Decimal(10)``, the radix (base) in which the :class:`Decimal`
@@ -889,39 +929,33 @@ described below. In addition, the module provides three pre-made contexts:
In single threaded environments, it is preferable to not use this context at
all. Instead, simply create contexts explicitly as described below.
- The default values are precision=28, rounding=ROUND_HALF_EVEN, and enabled traps
- for Overflow, InvalidOperation, and DivisionByZero.
+ The default values are :attr:`prec`\ =\ :const:`28`,
+ :attr:`rounding`\ =\ :const:`ROUND_HALF_EVEN`,
+ and enabled traps for :class:`Overflow`, :class:`InvalidOperation`, and
+ :class:`DivisionByZero`.
In addition to the three supplied contexts, new contexts can be created with the
:class:`Context` constructor.
-.. class:: Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=None, clamp=None)
+.. class:: Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)
Creates a new context. If a field is not specified or is :const:`None`, the
default values are copied from the :const:`DefaultContext`. If the *flags*
field is not specified or is :const:`None`, all flags are cleared.
- The *prec* field is a positive integer that sets the precision for arithmetic
- operations in the context.
+ *prec* is an integer in the range [:const:`1`, :const:`MAX_PREC`] that sets
+ the precision for arithmetic operations in the context.
- The *rounding* option is one of:
-
- * :const:`ROUND_CEILING` (towards :const:`Infinity`),
- * :const:`ROUND_DOWN` (towards zero),
- * :const:`ROUND_FLOOR` (towards :const:`-Infinity`),
- * :const:`ROUND_HALF_DOWN` (to nearest with ties going towards zero),
- * :const:`ROUND_HALF_EVEN` (to nearest with ties going to nearest even integer),
- * :const:`ROUND_HALF_UP` (to nearest with ties going away from zero), or
- * :const:`ROUND_UP` (away from zero).
- * :const:`ROUND_05UP` (away from zero if last digit after rounding towards zero
- would have been 0 or 5; otherwise towards zero)
+ The *rounding* option is one of the constants listed in the section
+ `Rounding Modes`_.
The *traps* and *flags* fields list any signals to be set. Generally, new
contexts should only set traps and leave the flags clear.
The *Emin* and *Emax* fields are integers specifying the outer limits allowable
- for exponents.
+ for exponents. *Emin* must be in the range [:const:`MIN_EMIN`, :const:`0`],
+ *Emax* in the range [:const:`0`, :const:`MAX_EMAX`].
The *capitals* field is either :const:`0` or :const:`1` (the default). If set to
:const:`1`, exponents are printed with a capital :const:`E`; otherwise, a
@@ -960,6 +994,12 @@ In addition to the three supplied contexts, new contexts can be created with the
Resets all of the flags to :const:`0`.
+ .. method:: clear_traps()
+
+ Resets all of the traps to :const:`0`.
+
+ .. versionadded:: 3.3
+
.. method:: copy()
Return a duplicate of the context.
@@ -1259,8 +1299,13 @@ In addition to the three supplied contexts, new contexts can be created with the
With two arguments, compute ``x**y``. If ``x`` is negative then ``y``
must be integral. The result will be inexact unless ``y`` is integral and
the result is finite and can be expressed exactly in 'precision' digits.
- The result should always be correctly rounded, using the rounding mode of
- the current thread's context.
+ The rounding mode of the context is used. Results are always correctly-rounded
+ in the Python version.
+
+ .. versionchanged:: 3.3
+ The C module computes :meth:`power` in terms of the correctly-rounded
+ :meth:`exp` and :meth:`ln` functions. The result is well-defined but
+ only "almost always correctly-rounded".
With three arguments, compute ``(x**y) % modulo``. For the three argument
form, the following restrictions on the arguments hold:
@@ -1348,6 +1393,69 @@ In addition to the three supplied contexts, new contexts can be created with the
.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+.. _decimal-rounding-modes:
+
+Constants
+---------
+
+The constants in this section are only relevant for the C module. They
+are also included in the pure Python version for compatibility.
+
++---------------------+---------------------+-------------------------------+
+| | 32-bit | 64-bit |
++=====================+=====================+===============================+
+| .. data:: MAX_PREC | :const:`425000000` | :const:`999999999999999999` |
++---------------------+---------------------+-------------------------------+
+| .. data:: MAX_EMAX | :const:`425000000` | :const:`999999999999999999` |
++---------------------+---------------------+-------------------------------+
+| .. data:: MIN_EMIN | :const:`-425000000` | :const:`-999999999999999999` |
++---------------------+---------------------+-------------------------------+
+| .. data:: MIN_ETINY | :const:`-849999999` | :const:`-1999999999999999997` |
++---------------------+---------------------+-------------------------------+
+
+
+.. data:: HAVE_THREADS
+
+ The default value is True. If Python is compiled without threads, the
+ C version automatically disables the expensive thread local context
+ machinery. In this case, the value is False.
+
+Rounding modes
+--------------
+
+.. data:: ROUND_CEILING
+
+ Round towards :const:`Infinity`.
+
+.. data:: ROUND_DOWN
+
+ Round towards zero.
+
+.. data:: ROUND_FLOOR
+
+ Round towards :const:`-Infinity`.
+
+.. data:: ROUND_HALF_DOWN
+
+ Round to nearest with ties going towards zero.
+
+.. data:: ROUND_HALF_EVEN
+
+ Round to nearest with ties going to nearest even integer.
+
+.. data:: ROUND_HALF_UP
+
+ Round to nearest with ties going away from zero.
+
+.. data:: ROUND_UP
+
+ Round away from zero.
+
+.. data:: ROUND_05UP
+
+ Round away from zero if last digit after rounding towards zero would have
+ been 0 or 5; otherwise round towards zero.
+
.. _decimal-signals:
@@ -1412,7 +1520,6 @@ condition.
Infinity / Infinity
x % 0
Infinity % x
- x._rescale( non-integer )
sqrt(-x) and x > 0
0 ** 0
x ** (non-integer)
@@ -1455,6 +1562,23 @@ condition.
Occurs when a subnormal result is pushed to zero by rounding. :class:`Inexact`
and :class:`Subnormal` are also signaled.
+
+.. class:: FloatOperation
+
+ Enable stricter semantics for mixing floats and Decimals.
+
+ If the signal is not trapped (default), mixing floats and Decimals is
+ permitted in the :class:`~decimal.Decimal` constructor,
+ :meth:`~decimal.Context.create_decimal` and all comparison operators.
+ Both conversion and comparisons are exact. Any occurrence of a mixed
+ operation is silently recorded by setting :exc:`FloatOperation` in the
+ context flags. Explicit conversions with :meth:`~decimal.Decimal.from_float`
+ or :meth:`~decimal.Context.create_decimal_from_float` do not set the flag.
+
+ Otherwise (the signal is trapped), only equality comparisons and explicit
+ conversions are silent. All other mixed operations raise :exc:`FloatOperation`.
+
+
The following table summarizes the hierarchy of signals::
exceptions.ArithmeticError(exceptions.Exception)
@@ -1467,10 +1591,12 @@ The following table summarizes the hierarchy of signals::
InvalidOperation
Rounded
Subnormal
+ FloatOperation(DecimalException, exceptions.TypeError)
.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
.. _decimal-notes:
Floating Point Notes
@@ -1580,7 +1706,7 @@ normalized floating point representations, it is not immediately obvious that
the following calculation returns a value equal to zero:
>>> 1 / Decimal('Infinity')
- Decimal('0E-1000000026')
+ Decimal('0E-1000026')
.. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1592,7 +1718,7 @@ Working with threads
The :func:`getcontext` function accesses a different :class:`Context` object for
each thread. Having separate thread contexts means that threads may make
-changes (such as ``getcontext.prec=10``) without interfering with other threads.
+changes (such as ``getcontext().prec=10``) without interfering with other threads.
Likewise, the :func:`setcontext` function automatically assigns its target to
the current thread.
diff --git a/Doc/library/depgraph-output.png b/Doc/library/depgraph-output.png
new file mode 100644
index 0000000..960bb1b
--- /dev/null
+++ b/Doc/library/depgraph-output.png
Binary files differ
diff --git a/Doc/library/development.rst b/Doc/library/development.rst
index c822e08..2368769 100644
--- a/Doc/library/development.rst
+++ b/Doc/library/development.rst
@@ -19,5 +19,8 @@ The list of modules described in this chapter is:
pydoc.rst
doctest.rst
unittest.rst
+ unittest.mock.rst
+ unittest.mock-examples.rst
2to3.rst
test.rst
+ venv.rst
diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst
index bdc37b3..836e240 100644
--- a/Doc/library/difflib.rst
+++ b/Doc/library/difflib.rst
@@ -752,8 +752,8 @@ It is also contained in the Python source distribution, as
# we're passing these as arguments to the diff function
fromdate = time.ctime(os.stat(fromfile).st_mtime)
todate = time.ctime(os.stat(tofile).st_mtime)
- fromlines = open(fromfile, 'U').readlines()
- tolines = open(tofile, 'U').readlines()
+ with open(fromlines) as fromf, open(tofile) as tof:
+ fromlines, tolines = list(fromf), list(tof)
if options.u:
diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile,
diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst
index 108cda7..854c521 100644
--- a/Doc/library/dis.rst
+++ b/Doc/library/dis.rst
@@ -171,11 +171,6 @@ The Python compiler currently generates the following bytecode instructions.
**General instructions**
-.. opcode:: STOP_CODE
-
- Indicates end-of-code to the compiler, not used by the interpreter.
-
-
.. opcode:: NOP
Do nothing code. Used as a placeholder by the bytecode optimizer.
@@ -436,6 +431,13 @@ the stack so that it is available for further iterations of the loop.
Pops ``TOS`` and yields it from a :term:`generator`.
+.. opcode:: YIELD_FROM
+
+ Pops ``TOS`` and delegates to it as a subiterator from a :term:`generator`.
+
+ .. versionadded:: 3.3
+
+
.. opcode:: IMPORT_STAR
Loads all symbols not starting with ``'_'`` directly from the module TOS to the
@@ -752,9 +754,10 @@ the more significant byte last.
.. opcode:: MAKE_FUNCTION (argc)
- Pushes a new function object on the stack. TOS is the code associated with the
- function. The function object is defined to have *argc* default parameters,
- which are found below TOS.
+ Pushes a new function object on the stack. TOS is the
+ :term:`qualified name` of the function; TOS1 is the code associated with
+ the function. The function object is defined to have *argc* default parameters,
+ which are found below TOS1.
.. opcode:: MAKE_CLOSURE (argc)
diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst
index 238b79d..11a2949 100644
--- a/Doc/library/distutils.rst
+++ b/Doc/library/distutils.rst
@@ -12,18 +12,14 @@ additional modules into a Python installation. The new modules may be either
100%-pure Python, or may be extension modules written in C, or may be
collections of Python packages which include modules coded in both Python and C.
-This package is discussed in two separate chapters:
+User documentation and API reference are provided in another document:
.. seealso::
:ref:`distutils-index`
The manual for developers and packagers of Python modules. This describes
how to prepare :mod:`distutils`\ -based packages so that they may be
- easily installed into an existing Python installation.
-
- :ref:`install-index`
- An "administrators" manual which includes information on installing
- modules into an existing Python installation. You do not need to be a
- Python programmer to read this manual.
-
+ easily installed into an existing Python installation. If also contains
+ instructions for end-users wanting to install a distutils-based package,
+ :ref:`install-index`.
diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst
index ec8edbe..222c719 100644
--- a/Doc/library/doctest.rst
+++ b/Doc/library/doctest.rst
@@ -320,7 +320,8 @@ The fine print:
Tabs in output generated by the tested code are not modified. Because any
hard tabs in the sample output *are* expanded, this means that if the code
output includes hard tabs, the only way the doctest can pass is if the
- :const:`NORMALIZE_WHITESPACE` option or directive is in effect.
+ :const:`NORMALIZE_WHITESPACE` option or :ref:`directive <doctest-directives>`
+ is in effect.
Alternatively, the test can be rewritten to capture the output and compare it
to an expected value as part of the test. This handling of tabs in the
source was arrived at through trial and error, and has proven to be the least
@@ -485,15 +486,16 @@ Some details you should read once, but won't need to remember:
SyntaxError: invalid syntax
+.. _option-flags-and-directives:
.. _doctest-options:
-Option Flags and Directives
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Option Flags
+^^^^^^^^^^^^
A number of option flags control various aspects of doctest's behavior.
Symbolic names for the flags are supplied as module constants, which can be
or'ed together and passed to various functions. The names can also be used in
-doctest directives (see below).
+:ref:`doctest directives <doctest-directives>`.
The first group of options define test semantics, controlling aspects of how
doctest decides whether actual output matches an example's expected output:
@@ -547,14 +549,14 @@ doctest decides whether actual output matches an example's expected output:
:exc:`TypeError` is raised.
It will also ignore the module name used in Python 3 doctest reports. Hence
- both these variations will work regardless of whether the test is run under
- Python 2.7 or Python 3.2 (or later versions):
+ both of these variations will work with the flag specified, regardless of
+ whether the test is run under Python 2.7 or Python 3.2 (or later versions)::
- >>> raise CustomError('message') #doctest: +IGNORE_EXCEPTION_DETAIL
+ >>> raise CustomError('message')
Traceback (most recent call last):
CustomError: message
- >>> raise CustomError('message') #doctest: +IGNORE_EXCEPTION_DETAIL
+ >>> raise CustomError('message')
Traceback (most recent call last):
my_module.CustomError: message
@@ -564,15 +566,16 @@ doctest decides whether actual output matches an example's expected output:
exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details
from Python 2.3 is also the only clear way to write a doctest that doesn't
care about the exception detail yet continues to pass under Python 2.3 or
- earlier (those releases do not support doctest directives and ignore them
- as irrelevant comments). For example, ::
+ earlier (those releases do not support :ref:`doctest directives
+ <doctest-directives>` and ignore them as irrelevant comments). For example::
- >>> (1, 2)[3] = 'moo' #doctest: +IGNORE_EXCEPTION_DETAIL
+ >>> (1, 2)[3] = 'moo'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
- passes under Python 2.3 and later Python versions, even though the detail
+ passes under Python 2.3 and later Python versions with the flag specified,
+ even though the detail
changed in Python 2.4 to say "does not" instead of "doesn't".
.. versionchanged:: 3.2
@@ -634,9 +637,30 @@ The second group of options controls how test failures are reported:
A bitmask or'ing together all the reporting flags above.
-"Doctest directives" may be used to modify the option flags for individual
-examples. Doctest directives are expressed as a special Python comment
-following an example's source code:
+
+There is also a way to register new option flag names, though this isn't
+useful unless you intend to extend :mod:`doctest` internals via subclassing:
+
+
+.. function:: register_optionflag(name)
+
+ Create a new option flag with a given name, and return the new flag's integer
+ value. :func:`register_optionflag` can be used when subclassing
+ :class:`OutputChecker` or :class:`DocTestRunner` to create new options that are
+ supported by your subclasses. :func:`register_optionflag` should always be
+ called using the following idiom::
+
+ MY_FLAG = register_optionflag('MY_FLAG')
+
+
+.. _doctest-directives:
+
+Directives
+^^^^^^^^^^
+
+Doctest directives may be used to modify the :ref:`option flags
+<doctest-options>` for an individual example. Doctest directives are
+special Python comments following an example's source code:
.. productionlist:: doctest
directive: "#" "doctest:" `directive_options`
@@ -693,20 +717,6 @@ usually the only meaningful choice. However, option flags can also be passed to
functions that run doctests, establishing different defaults. In such cases,
disabling an option via ``-`` in a directive can be useful.
-There's also a way to register new option flag names, although this isn't useful
-unless you intend to extend :mod:`doctest` internals via subclassing:
-
-
-.. function:: register_optionflag(name)
-
- Create a new option flag with a given name, and return the new flag's integer
- value. :func:`register_optionflag` can be used when subclassing
- :class:`OutputChecker` or :class:`DocTestRunner` to create new options that are
- supported by your subclasses. :func:`register_optionflag` should always be
- called using the following idiom::
-
- MY_FLAG = register_optionflag('MY_FLAG')
-
.. _doctest-warnings:
diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst
index d8f330f..9f0a9e2 100644
--- a/Doc/library/email.errors.rst
+++ b/Doc/library/email.errors.rst
@@ -73,17 +73,38 @@ this class is *not* an exception!
* :class:`StartBoundaryNotFoundDefect` -- The start boundary claimed in the
:mailheader:`Content-Type` header was never found.
+* :class:`CloseBoundaryNotFoundDefect` -- A start boundary was found, but
+ no corresponding close boundary was ever found.
+
+ .. versionadded:: 3.3
+
* :class:`FirstHeaderLineIsContinuationDefect` -- The message had a continuation
line as its first header line.
* :class:`MisplacedEnvelopeHeaderDefect` - A "Unix From" header was found in the
middle of a header block.
+* :class:`MissingHeaderBodySeparatorDefect` - A line was found while parsing
+ headers that had no leading white space but contained no ':'. Parsing
+ continues assuming that the line represents the first line of the body.
+
+ .. versionadded:: 3.3
+
* :class:`MalformedHeaderDefect` -- A header was found that was missing a colon,
or was otherwise malformed.
+ .. deprecated:: 3.3
+ This defect has not been used for several Python versions.
+
* :class:`MultipartInvariantViolationDefect` -- A message claimed to be a
:mimetype:`multipart`, but no subparts were found. Note that when a message has
this defect, its :meth:`is_multipart` method may return false even though its
content type claims to be :mimetype:`multipart`.
+* :class:`InvalidBase64PaddingDefect` -- When decoding a block of base64
+ enocded bytes, the padding was not correct. Enough padding is added to
+ perform the decode, but the resulting decoded bytes may be invalid.
+
+* :class:`InvalidBase64CharactersDefect` -- When decoding a block of base64
+ enocded bytes, characters outside the base64 alphebet were encountered.
+ The characters are ignored, but the resulting decoded bytes may be invalid.
diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst
index 88c62a2..c172acb 100644
--- a/Doc/library/email.generator.rst
+++ b/Doc/library/email.generator.rst
@@ -32,7 +32,7 @@ Here are the public methods of the :class:`Generator` class, imported from the
:mod:`email.generator` module:
-.. class:: Generator(outfp, mangle_from_=True, maxheaderlen=78)
+.. class:: Generator(outfp, mangle_from_=True, maxheaderlen=78, *, policy=None)
The constructor for the :class:`Generator` class takes a :term:`file-like object`
called *outfp* for an argument. *outfp* must support the :meth:`write` method
@@ -53,10 +53,17 @@ Here are the public methods of the :class:`Generator` class, imported from the
:class:`~email.header.Header` class. Set to zero to disable header wrapping.
The default is 78, as recommended (but not required) by :rfc:`2822`.
+ The *policy* keyword specifies a :mod:`~email.policy` object that controls a
+ number of aspects of the generator's operation. If no *policy* is specified,
+ then the *policy* attached to the message object passed to :attr:`flatten`
+ is used.
+
+ .. versionchanged:: 3.3 Added the *policy* keyword.
+
The other public :class:`Generator` methods are:
- .. method:: flatten(msg, unixfrom=False, linesep='\\n')
+ .. method:: flatten(msg, unixfrom=False, linesep=None)
Print the textual representation of the message object structure rooted at
*msg* to the output file specified when the :class:`Generator` instance
@@ -72,19 +79,20 @@ Here are the public methods of the :class:`Generator` class, imported from the
Note that for subparts, no envelope header is ever printed.
Optional *linesep* specifies the line separator character used to
- terminate lines in the output. It defaults to ``\n`` because that is
- the most useful value for Python application code (other library packages
- expect ``\n`` separated lines). ``linesep=\r\n`` can be used to
- generate output with RFC-compliant line separators.
+ terminate lines in the output. If specified it overrides the value
+ specified by the *msg*\'s or ``Generator``\'s ``policy``.
- Messages parsed with a Bytes parser that have a
- :mailheader:`Content-Transfer-Encoding` of 8bit will be converted to a
- use a 7bit Content-Transfer-Encoding. Non-ASCII bytes in the headers
- will be :rfc:`2047` encoded with a charset of `unknown-8bit`.
+ Because strings cannot represent non-ASCII bytes, if the policy that
+ applies when ``flatten`` is run has :attr:`~email.policy.Policy.cte_type`
+ set to ``8bit``, ``Generator`` will operate as if it were set to
+ ``7bit``. This means that messages parsed with a Bytes parser that have
+ a :mailheader:`Content-Transfer-Encoding` of ``8bit`` will be converted
+ to a use a ``7bit`` Content-Transfer-Encoding. Non-ASCII bytes in the
+ headers will be :rfc:`2047` encoded with a charset of ``unknown-8bit``.
.. versionchanged:: 3.2
- Added support for re-encoding 8bit message bodies, and the *linesep*
- argument.
+ Added support for re-encoding ``8bit`` message bodies, and the
+ *linesep* argument.
.. method:: clone(fp)
@@ -103,7 +111,8 @@ As a convenience, see the :class:`~email.message.Message` methods
formatted string representation of a message object. For more detail, see
:mod:`email.message`.
-.. class:: BytesGenerator(outfp, mangle_from_=True, maxheaderlen=78)
+.. class:: BytesGenerator(outfp, mangle_from_=True, maxheaderlen=78, *, \
+ policy=policy.default)
The constructor for the :class:`BytesGenerator` class takes a binary
:term:`file-like object` called *outfp* for an argument. *outfp* must
@@ -125,19 +134,31 @@ formatted string representation of a message object. For more detail, see
wrapping. The default is 78, as recommended (but not required) by
:rfc:`2822`.
+ The *policy* keyword specifies a :mod:`~email.policy` object that controls a
+ number of aspects of the generator's operation. The default policy
+ maintains backward compatibility.
+
+ .. versionchanged:: 3.3 Added the *policy* keyword.
+
The other public :class:`BytesGenerator` methods are:
- .. method:: flatten(msg, unixfrom=False, linesep='\n')
+ .. method:: flatten(msg, unixfrom=False, linesep=None)
Print the textual representation of the message object structure rooted
at *msg* to the output file specified when the :class:`BytesGenerator`
instance was created. Subparts are visited depth-first and the resulting
- text will be properly MIME encoded. If the input that created the *msg*
- contained bytes with the high bit set and those bytes have not been
- modified, they will be copied faithfully to the output, even if doing so
- is not strictly RFC compliant. (To produce strictly RFC compliant
- output, use the :class:`Generator` class.)
+ text will be properly MIME encoded. If the :mod:`~email.policy` option
+ :attr:`~email.policy.Policy.cte_type` is ``8bit`` (the default),
+ then any bytes with the high bit set in the original parsed message that
+ have not been modified will be copied faithfully to the output. If
+ ``cte_type`` is ``7bit``, the bytes will be converted as needed
+ using an ASCII-compatible Content-Transfer-Encoding. In particular,
+ RFC-invalid non-ASCII bytes in headers will be encoded using the MIME
+ ``unknown-8bit`` character set, thus rendering them RFC-compliant.
+
+ .. XXX: There should be a complementary option that just does the RFC
+ compliance transformation but leaves CTE 8bit parts alone.
Messages parsed with a Bytes parser that have a
:mailheader:`Content-Transfer-Encoding` of 8bit will be reconstructed
@@ -152,10 +173,8 @@ formatted string representation of a message object. For more detail, see
Note that for subparts, no envelope header is ever printed.
Optional *linesep* specifies the line separator character used to
- terminate lines in the output. It defaults to ``\n`` because that is
- the most useful value for Python application code (other library packages
- expect ``\n`` separated lines). ``linesep=\r\n`` can be used to
- generate output with RFC-compliant line separators.
+ terminate lines in the output. If specified it overrides the value
+ specified by the ``Generator``\ 's ``policy``.
.. method:: clone(fp)
diff --git a/Doc/library/email.header.rst b/Doc/library/email.header.rst
index 7d2dc2e..346d23f 100644
--- a/Doc/library/email.header.rst
+++ b/Doc/library/email.header.rst
@@ -31,8 +31,8 @@ For example::
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
- >>> print(msg.as_string())
- Subject: =?iso-8859-1?q?p=F6stal?=
+ >>> msg.as_string()
+ 'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'
@@ -176,7 +176,7 @@ The :mod:`email.header` module also provides the following convenient functions.
>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
- [('p\xf6stal', 'iso-8859-1')]
+ [(b'p\xf6stal', 'iso-8859-1')]
.. function:: make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')
diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst
new file mode 100644
index 0000000..c884159
--- /dev/null
+++ b/Doc/library/email.headerregistry.rst
@@ -0,0 +1,452 @@
+:mod:`email.headerregistry`: Custom Header Objects
+--------------------------------------------------
+
+.. module:: email.headerregistry
+ :synopsis: Automatic Parsing of headers based on the field name
+
+.. moduleauthor:: R. David Murray <rdmurray@bitdance.com>
+.. sectionauthor:: R. David Murray <rdmurray@bitdance.com>
+
+
+.. note::
+
+ The headerregistry module has been included in the standard library on a
+ :term:`provisional basis <provisional package>`. Backwards incompatible
+ changes (up to and including removal of the module) may occur if deemed
+ necessary by the core developers.
+
+.. versionadded:: 3.3
+ as a :term:`provisional module <provisional package>`.
+
+Headers are represented by customized subclasses of :class:`str`. The
+particular class used to represent a given header is determined by the
+:attr:`~email.policy.EmailPolicy.header_factory` of the :mod:`~email.policy` in
+effect when the headers are created. This section documents the particular
+``header_factory`` implemented by the email package for handling :RFC:`5322`
+compliant email messages, which not only provides customized header objects for
+various header types, but also provides an extension mechanism for applications
+to add their own custom header types.
+
+When using any of the policy objects derived from
+:data:`~email.policy.EmailPolicy`, all headers are produced by
+:class:`.HeaderRegistry` and have :class:`.BaseHeader` as their last base
+class. Each header class has an additional base class that is determined by
+the type of the header. For example, many headers have the class
+:class:`.UnstructuredHeader` as their other base class. The specialized second
+class for a header is determined by the name of the header, using a lookup
+table stored in the :class:`.HeaderRegistry`. All of this is managed
+transparently for the typical application program, but interfaces are provided
+for modifying the default behavior for use by more complex applications.
+
+The sections below first document the header base classes and their attributes,
+followed by the API for modifying the behavior of :class:`.HeaderRegistry`, and
+finally the support classes used to represent the data parsed from structured
+headers.
+
+
+.. class:: BaseHeader(name, value)
+
+ *name* and *value* are passed to ``BaseHeader`` from the
+ :attr:`~email.policy.EmailPolicy.header_factory` call. The string value of
+ any header object is the *value* fully decoded to unicode.
+
+ This base class defines the following read-only properties:
+
+
+ .. attribute:: name
+
+ The name of the header (the portion of the field before the ':'). This
+ is exactly the value passed in the :attr:`~EmailPolicy.header_factory`
+ call for *name*; that is, case is preserved.
+
+
+ .. attribute:: defects
+
+ A tuple of :exc:`~email.errors.HeaderDefect` instances reporting any
+ RFC compliance problems found during parsing. The email package tries to
+ be complete about detecting compliance issues. See the :mod:`errors`
+ module for a discussion of the types of defects that may be reported.
+
+
+ .. attribute:: max_count
+
+ The maximum number of headers of this type that can have the same
+ ``name``. A value of ``None`` means unlimited. The ``BaseHeader`` value
+ for this attribute is ``None``; it is expected that specialized header
+ classes will override this value as needed.
+
+ ``BaseHeader`` also provides the following method, which is called by the
+ email library code and should not in general be called by application
+ programs:
+
+ .. method:: fold(*, policy)
+
+ Return a string containing :attr:`~email.policy.Policy.linesep`
+ characters as required to correctly fold the header according
+ to *policy*. A :attr:`~email.policy.Policy.cte_type` of
+ ``8bit`` will be treated as if it were ``7bit``, since strings
+ may not contain binary data.
+
+
+ ``BaseHeader`` by itself cannot be used to create a header object. It
+ defines a protocol that each specialized header cooperates with in order to
+ produce the header object. Specifically, ``BaseHeader`` requires that
+ the specialized class provide a :func:`classmethod` named ``parse``. This
+ method is called as follows::
+
+ parse(string, kwds)
+
+ ``kwds`` is a dictionary containing one pre-initialized key, ``defects``.
+ ``defects`` is an empty list. The parse method should append any detected
+ defects to this list. On return, the ``kwds`` dictionary *must* contain
+ values for at least the keys ``decoded`` and ``defects``. ``decoded``
+ should be the string value for the header (that is, the header value fully
+ decoded to unicode). The parse method should assume that *string* may
+ contain transport encoded parts, but should correctly handle all valid
+ unicode characters as well so that it can parse un-encoded header values.
+
+ ``BaseHeader``'s ``__new__`` then creates the header instance, and calls its
+ ``init`` method. The specialized class only needs to provide an ``init``
+ method if it wishes to set additional attributes beyond those provided by
+ ``BaseHeader`` itself. Such an ``init`` method should look like this::
+
+ def init(self, *args, **kw):
+ self._myattr = kw.pop('myattr')
+ super().init(*args, **kw)
+
+ That is, anything extra that the specialized class puts in to the ``kwds``
+ dictionary should be removed and handled, and the remaining contents of
+ ``kw`` (and ``args``) passed to the ``BaseHeader`` ``init`` method.
+
+
+.. class:: UnstructuredHeader
+
+ An "unstructured" header is the default type of header in :rfc:`5322`.
+ Any header that does not have a specified syntax is treated as
+ unstructured. The classic example of an unstructured header is the
+ :mailheader:`Subject` header.
+
+ In :rfc:`5322`, an unstructured header is a run of arbitrary text in the
+ ASCII character set. :rfc:`2047`, however, has an :rfc:`5322` compatible
+ mechanism for encoding non-ASCII text as ASCII characters within a header
+ value. When a *value* containing encoded words is passed to the
+ constructor, the ``UnstructuredHeader`` parser converts such encoded words
+ back in to the original unicode, following the :rfc:`2047` rules for
+ unstructured text. The parser uses heuristics to attempt to decode certain
+ non-compliant encoded words. Defects are registered in such cases, as well
+ as defects for issues such as invalid characters within the encoded words or
+ the non-encoded text.
+
+ This header type provides no additional attributes.
+
+
+.. class:: DateHeader
+
+ :rfc:`5322` specifies a very specific format for dates within email headers.
+ The ``DateHeader`` parser recognizes that date format, as well as
+ recognizing a number of variant forms that are sometimes found "in the
+ wild".
+
+ This header type provides the following additional attributes:
+
+ .. attribute:: datetime
+
+ If the header value can be recognized as a valid date of one form or
+ another, this attribute will contain a :class:`~datetime.datetime`
+ instance representing that date. If the timezone of the input date is
+ specified as ``-0000`` (indicating it is in UTC but contains no
+ information about the source timezone), then :attr:`.datetime` will be a
+ naive :class:`~datetime.datetime`. If a specific timezone offset is
+ found (including `+0000`), then :attr:`.datetime` will contain an aware
+ ``datetime`` that uses :class:`datetime.timezone` to record the timezone
+ offset.
+
+ The ``decoded`` value of the header is determined by formatting the
+ ``datetime`` according to the :rfc:`5322` rules; that is, it is set to::
+
+ email.utils.format_datetime(self.datetime)
+
+ When creating a ``DateHeader``, *value* may be
+ :class:`~datetime.datetime` instance. This means, for example, that
+ the following code is valid and does what one would expect::
+
+ msg['Date'] = datetime(2011, 7, 15, 21)
+
+ Because this is a naive ``datetime`` it will be interpreted as a UTC
+ timestamp, and the resulting value will have a timezone of ``-0000``. Much
+ more useful is to use the :func:`~email.utils.localtime` function from the
+ :mod:`~email.utils` module::
+
+ msg['Date'] = utils.localtime()
+
+ This example sets the date header to the current time and date using
+ the current timezone offset.
+
+
+.. class:: AddressHeader
+
+ Address headers are one of the most complex structured header types.
+ The ``AddressHeader`` class provides a generic interface to any address
+ header.
+
+ This header type provides the following additional attributes:
+
+
+ .. attribute:: groups
+
+ A tuple of :class:`.Group` objects encoding the
+ addresses and groups found in the header value. Addresses that are
+ not part of a group are represented in this list as single-address
+ ``Groups`` whose :attr:`~.Group.display_name` is ``None``.
+
+
+ .. attribute:: addresses
+
+ A tuple of :class:`.Address` objects encoding all
+ of the individual addresses from the header value. If the header value
+ contains any groups, the individual addresses from the group are included
+ in the list at the point where the group occurs in the value (that is,
+ the list of addresses is "flattened" into a one dimensional list).
+
+ The ``decoded`` value of the header will have all encoded words decoded to
+ unicode. :class:`~encodings.idna` encoded domain names are also decoded to unicode. The
+ ``decoded`` value is set by :attr:`~str.join`\ ing the :class:`str` value of
+ the elements of the ``groups`` attribute with ``', '``.
+
+ A list of :class:`.Address` and :class:`.Group` objects in any combination
+ may be used to set the value of an address header. ``Group`` objects whose
+ ``display_name`` is ``None`` will be interpreted as single addresses, which
+ allows an address list to be copied with groups intact by using the list
+ obtained ``groups`` attribute of the source header.
+
+
+.. class:: SingleAddressHeader
+
+ A subclass of :class:`.AddressHeader` that adds one
+ additional attribute:
+
+
+ .. attribute:: address
+
+ The single address encoded by the header value. If the header value
+ actually contains more than one address (which would be a violation of
+ the RFC under the default :mod:`policy`), accessing this attribute will
+ result in a :exc:`ValueError`.
+
+
+Many of the above classes also have a ``Unique`` variant (for example,
+``UniqueUnstructuredHeader``). The only difference is that in the ``Unique``
+variant, :attr:`~.BaseHeader.max_count` is set to 1.
+
+
+.. class:: MIMEVersionHeader
+
+ There is really only one valid value for the :mailheader:`MIME-Version`
+ header, and that is ``1.0``. For future proofing, this header class
+ supports other valid version numbers. If a version number has a valid value
+ per :rfc:`2045`, then the header object will have non-``None`` values for
+ the following attributes:
+
+ .. attribute:: version
+
+ The version number as a string, with any whitespace and/or comments
+ removed.
+
+ .. attribute:: major
+
+ The major version number as an integer
+
+ .. attribute:: minor
+
+ The minor version number as an integer
+
+
+.. class:: ParameterizedMIMEHeader
+
+ MOME headers all start with the prefix 'Content-'. Each specific header has
+ a certain value, described under the class for that header. Some can
+ also take a list of supplemental parameters, which have a common format.
+ This class serves as a base for all the MIME headers that take parameters.
+
+ .. attribute:: params
+
+ A dictionary mapping parameter names to parameter values.
+
+
+.. class:: ContentTypeHeader
+
+ A :class:`ParameterizedMIMEHheader` class that handles the
+ :mailheader:`Content-Type` header.
+
+ .. attribute:: content_type
+
+ The content type string, in the form ``maintype/subtype``.
+
+ .. attribute:: maintype
+
+ .. attribute:: subtype
+
+
+.. class:: ContentDispositionHeader
+
+ A :class:`ParameterizedMIMEHheader` class that handles the
+ :mailheader:`Content-Disposition` header.
+
+ .. attribute:: content-disposition
+
+ ``inline`` and ``attachment`` are the only valid values in common use.
+
+
+.. class:: ContentTransferEncoding
+
+ Handles the :mailheader:`Content-Transfer-Encoding` header.
+
+ .. attribute:: cte
+
+ Valid values are ``7bit``, ``8bit``, ``base64``, and
+ ``quoted-printable``. See :rfc:`2045` for more information.
+
+
+
+.. class:: HeaderRegistry(base_class=BaseHeader, \
+ default_class=UnstructuredHeader, \
+ use_default_map=True)
+
+ This is the factory used by :class:`~email.policy.EmailPolicy` by default.
+ ``HeaderRegistry`` builds the class used to create a header instance
+ dynamically, using *base_class* and a specialized class retrieved from a
+ registry that it holds. When a given header name does not appear in the
+ registry, the class specified by *default_class* is used as the specialized
+ class. When *use_default_map* is ``True`` (the default), the standard
+ mapping of header names to classes is copied in to the registry during
+ initialization. *base_class* is always the last class in the generated
+ class's ``__bases__`` list.
+
+ The default mappings are:
+
+ :subject: UniqueUnstructuredHeader
+ :date: UniqueDateHeader
+ :resent-date: DateHeader
+ :orig-date: UniqueDateHeader
+ :sender: UniqueSingleAddressHeader
+ :resent-sender: SingleAddressHeader
+ :to: UniqueAddressHeader
+ :resent-to: AddressHeader
+ :cc: UniqueAddressHeader
+ :resent-cc: AddressHeader
+ :from: UniqueAddressHeader
+ :resent-from: AddressHeader
+ :reply-to: UniqueAddressHeader
+
+ ``HeaderRegistry`` has the following methods:
+
+
+ .. method:: map_to_type(self, name, cls)
+
+ *name* is the name of the header to be mapped. It will be converted to
+ lower case in the registry. *cls* is the specialized class to be used,
+ along with *base_class*, to create the class used to instantiate headers
+ that match *name*.
+
+
+ .. method:: __getitem__(name)
+
+ Construct and return a class to handle creating a *name* header.
+
+
+ .. method:: __call__(name, value)
+
+ Retrieves the specialized header associated with *name* from the
+ registry (using *default_class* if *name* does not appear in the
+ registry) and composes it with *base_class* to produce a class,
+ calls the constructed class's constructor, passing it the same
+ argument list, and finally returns the class instance created thereby.
+
+
+The following classes are the classes used to represent data parsed from
+structured headers and can, in general, be used by an application program to
+construct structured values to assign to specific headers.
+
+
+.. class:: Address(display_name='', username='', domain='', addr_spec=None)
+
+ The class used to represent an email address. The general form of an
+ address is::
+
+ [display_name] <username@domain>
+
+ or::
+
+ username@domain
+
+ where each part must conform to specific syntax rules spelled out in
+ :rfc:`5322`.
+
+ As a convenience *addr_spec* can be specified instead of *username* and
+ *domain*, in which case *username* and *domain* will be parsed from the
+ *addr_spec*. An *addr_spec* must be a properly RFC quoted string; if it is
+ not ``Address`` will raise an error. Unicode characters are allowed and
+ will be property encoded when serialized. However, per the RFCs, unicode is
+ *not* allowed in the username portion of the address.
+
+ .. attribute:: display_name
+
+ The display name portion of the address, if any, with all quoting
+ removed. If the address does not have a display name, this attribute
+ will be an empty string.
+
+ .. attribute:: username
+
+ The ``username`` portion of the address, with all quoting removed.
+
+ .. attribute:: domain
+
+ The ``domain`` portion of the address.
+
+ .. attribute:: addr_spec
+
+ The ``username@domain`` portion of the address, correctly quoted
+ for use as a bare address (the second form shown above). This
+ attribute is not mutable.
+
+ .. method:: __str__()
+
+ The ``str`` value of the object is the address quoted according to
+ :rfc:`5322` rules, but with no Content Transfer Encoding of any non-ASCII
+ characters.
+
+ To support SMTP (:rfc:`5321`), ``Address`` handles one special case: if
+ ``username`` and ``domain`` are both the empty string (or ``None``), then
+ the string value of the ``Address`` is ``<>``.
+
+
+.. class:: Group(display_name=None, addresses=None)
+
+ The class used to represent an address group. The general form of an
+ address group is::
+
+ display_name: [address-list];
+
+ As a convenience for processing lists of addresses that consist of a mixture
+ of groups and single addresses, a ``Group`` may also be used to represent
+ single addresses that are not part of a group by setting *display_name* to
+ ``None`` and providing a list of the single address as *addresses*.
+
+ .. attribute:: display_name
+
+ The ``display_name`` of the group. If it is ``None`` and there is
+ exactly one ``Address`` in ``addresses``, then the ``Group`` represents a
+ single address that is not in a group.
+
+ .. attribute:: addresses
+
+ A possibly empty tuple of :class:`.Address` objects representing the
+ addresses in the group.
+
+ .. method:: __str__()
+
+ The ``str`` value of a ``Group`` is formatted according to :rfc:`5322`,
+ but with no Content Transfer Encoding of any non-ASCII characters. If
+ ``display_name`` is none and there is a single ``Address`` in the
+ ``addresses`` list, the ``str`` value will be the same as the ``str`` of
+ that single ``Address``.
diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst
index f685e54..59ab47d 100644
--- a/Doc/library/email.message.rst
+++ b/Doc/library/email.message.rst
@@ -111,10 +111,14 @@ Here are the methods of the :class:`Message` class:
header. When ``True`` and the message is not a multipart, the payload will
be decoded if this header's value is ``quoted-printable`` or ``base64``.
If some other encoding is used, or :mailheader:`Content-Transfer-Encoding`
- header is missing, or if the payload has bogus base64 data, the payload is
+ header is missing, the payload is
returned as-is (undecoded). In all cases the returned value is binary
data. If the message is a multipart and the *decode* flag is ``True``,
- then ``None`` is returned.
+ then ``None`` is returned. If the payload is base64 and it was not
+ perfectly formed (missing padding, characters outside the base64
+ alphabet), then an appropriate defect will be added to the message's
+ defect property (:class:`~email.errors.InvalidBase64PaddingDefect` or
+ :class:`~email.errors.InvalidBase64CharactersDefect`, respectively).
When *decode* is ``False`` (the default) the body is returned as a string
without decoding the :mailheader:`Content-Transfer-Encoding`. However,
diff --git a/Doc/library/email.mime.rst b/Doc/library/email.mime.rst
index ae340f7..db5584c 100644
--- a/Doc/library/email.mime.rst
+++ b/Doc/library/email.mime.rst
@@ -175,7 +175,7 @@ Here are the classes:
.. currentmodule:: email.mime.text
-.. class:: MIMEText(_text, _subtype='plain', _charset='us-ascii')
+.. class:: MIMEText(_text, _subtype='plain', _charset=None)
Module: :mod:`email.mime.text`
@@ -185,5 +185,5 @@ Here are the classes:
minor type and defaults to :mimetype:`plain`. *_charset* is the character
set of the text and is passed as a parameter to the
:class:`~email.mime.nonmultipart.MIMENonMultipart` constructor; it defaults
- to ``us-ascii``. No guessing or encoding is performed on the text data.
-
+ to ``us-ascii`` if the string contains only ``ascii`` codepoints, and
+ ``utf-8`` otherwise.
diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst
index 49a59c0..6a43561 100644
--- a/Doc/library/email.parser.rst
+++ b/Doc/library/email.parser.rst
@@ -58,12 +58,18 @@ list of defects that it can find.
Here is the API for the :class:`FeedParser`:
-.. class:: FeedParser(_factory=email.message.Message)
+.. class:: FeedParser(_factory=email.message.Message, *, policy=policy.default)
Create a :class:`FeedParser` instance. Optional *_factory* is a no-argument
callable that will be called whenever a new message object is needed. It
defaults to the :class:`email.message.Message` class.
+ The *policy* keyword specifies a :mod:`~email.policy` object that controls a
+ number of aspects of the parser's operation. The default policy maintains
+ backward compatibility.
+
+ .. versionchanged:: 3.3 Added the *policy* keyword.
+
.. method:: feed(data)
Feed the :class:`FeedParser` some more data. *data* should be a string
@@ -94,15 +100,18 @@ Parser class API
The :class:`Parser` class, imported from the :mod:`email.parser` module,
provides an API that can be used to parse a message when the complete contents
of the message are available in a string or file. The :mod:`email.parser`
-module also provides a second class, called :class:`HeaderParser` which can be
-used if you're only interested in the headers of the message.
-:class:`HeaderParser` can be much faster in these situations, since it does not
-attempt to parse the message body, instead setting the payload to the raw body
-as a string. :class:`HeaderParser` has the same API as the :class:`Parser`
-class.
+module also provides header-only parsers, called :class:`HeaderParser` and
+:class:`BytesHeaderParser`, which can be used if you're only interested in the
+headers of the message. :class:`HeaderParser` and :class:`BytesHeaderParser`
+can be much faster in these situations, since they do not attempt to parse the
+message body, instead setting the payload to the raw body as a string. They
+have the same API as the :class:`Parser` and :class:`BytesParser` classes.
+.. versionadded:: 3.3
+ The BytesHeaderParser class.
-.. class:: Parser(_class=email.message.Message, strict=None)
+
+.. class:: Parser(_class=email.message.Message, *, policy=policy.default)
The constructor for the :class:`Parser` class takes an optional argument
*_class*. This must be a callable factory (such as a function or a class), and
@@ -110,13 +119,13 @@ class.
:class:`~email.message.Message` (see :mod:`email.message`). The factory will
be called without arguments.
- The optional *strict* flag is ignored.
+ The *policy* keyword specifies a :mod:`~email.policy` object that controls a
+ number of aspects of the parser's operation. The default policy maintains
+ backward compatibility.
- .. deprecated:: 2.4
- Because the :class:`Parser` class is a backward compatible API wrapper
- around the new-in-Python 2.4 :class:`FeedParser`, *all* parsing is
- effectively non-strict. You should simply stop passing a *strict* flag to
- the :class:`Parser` constructor.
+ .. versionchanged:: 3.3
+ Removed the *strict* argument that was deprecated in 2.4. Added the
+ *policy* keyword.
The other public :class:`Parser` methods are:
@@ -147,12 +156,18 @@ class.
Optional *headersonly* is as with the :meth:`parse` method.
-.. class:: BytesParser(_class=email.message.Message, strict=None)
+.. class:: BytesParser(_class=email.message.Message, *, policy=policy.default)
This class is exactly parallel to :class:`Parser`, but handles bytes input.
The *_class* and *strict* arguments are interpreted in the same way as for
- the :class:`Parser` constructor. *strict* is supported only to make porting
- code easier; it is deprecated.
+ the :class:`Parser` constructor.
+
+ The *policy* keyword specifies a :mod:`~email.policy` object that
+ controls a number of aspects of the parser's operation. The default
+ policy maintains backward compatibility.
+
+ .. versionchanged:: 3.3
+ Removed the *strict* argument. Added the *policy* keyword.
.. method:: parse(fp, headeronly=False)
@@ -190,39 +205,53 @@ in the top-level :mod:`email` package namespace.
.. currentmodule:: email
-.. function:: message_from_string(s, _class=email.message.Message, strict=None)
+.. function:: message_from_string(s, _class=email.message.Message, *, \
+ policy=policy.default)
Return a message object structure from a string. This is exactly equivalent to
- ``Parser().parsestr(s)``. Optional *_class* and *strict* are interpreted as
+ ``Parser().parsestr(s)``. *_class* and *policy* are interpreted as
with the :class:`Parser` class constructor.
-.. function:: message_from_bytes(s, _class=email.message.Message, strict=None)
+ .. versionchanged:: 3.3
+ Removed the *strict* argument. Added the *policy* keyword.
+
+.. function:: message_from_bytes(s, _class=email.message.Message, *, \
+ policy=policy.default)
Return a message object structure from a byte string. This is exactly
equivalent to ``BytesParser().parsebytes(s)``. Optional *_class* and
*strict* are interpreted as with the :class:`Parser` class constructor.
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Removed the *strict* argument. Added the *policy* keyword.
-.. function:: message_from_file(fp, _class=email.message.Message, strict=None)
+.. function:: message_from_file(fp, _class=email.message.Message, *, \
+ policy=policy.default)
Return a message object structure tree from an open :term:`file object`.
- This is exactly equivalent to ``Parser().parse(fp)``. Optional *_class*
- and *strict* are interpreted as with the :class:`Parser` class constructor.
+ This is exactly equivalent to ``Parser().parse(fp)``. *_class*
+ and *policy* are interpreted as with the :class:`Parser` class constructor.
+
+ .. versionchanged::
+ Removed the *strict* argument. Added the *policy* keyword.
-.. function:: message_from_binary_file(fp, _class=email.message.Message, strict=None)
+.. function:: message_from_binary_file(fp, _class=email.message.Message, *, \
+ policy=policy.default)
Return a message object structure tree from an open binary :term:`file
object`. This is exactly equivalent to ``BytesParser().parse(fp)``.
- Optional *_class* and *strict* are interpreted as with the :class:`Parser`
+ *_class* and *policy* are interpreted as with the :class:`Parser`
class constructor.
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Removed the *strict* argument. Added the *policy* keyword.
Here's an example of how you might use this at an interactive Python prompt::
>>> import email
- >>> msg = email.message_from_string(myString)
+ >>> msg = email.message_from_string(myString) # doctest: +SKIP
Additional notes
diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst
new file mode 100644
index 0000000..31b13c1
--- /dev/null
+++ b/Doc/library/email.policy.rst
@@ -0,0 +1,497 @@
+:mod:`email.policy`: Policy Objects
+-----------------------------------
+
+.. module:: email.policy
+ :synopsis: Controlling the parsing and generating of messages
+
+.. moduleauthor:: R. David Murray <rdmurray@bitdance.com>
+.. sectionauthor:: R. David Murray <rdmurray@bitdance.com>
+
+.. versionadded:: 3.3
+
+
+The :mod:`email` package's prime focus is the handling of email messages as
+described by the various email and MIME RFCs. However, the general format of
+email messages (a block of header fields each consisting of a name followed by
+a colon followed by a value, the whole block followed by a blank line and an
+arbitrary 'body'), is a format that has found utility outside of the realm of
+email. Some of these uses conform fairly closely to the main RFCs, some do
+not. And even when working with email, there are times when it is desirable to
+break strict compliance with the RFCs.
+
+Policy objects give the email package the flexibility to handle all these
+disparate use cases.
+
+A :class:`Policy` object encapsulates a set of attributes and methods that
+control the behavior of various components of the email package during use.
+:class:`Policy` instances can be passed to various classes and methods in the
+email package to alter the default behavior. The settable values and their
+defaults are described below.
+
+There is a default policy used by all classes in the email package. This
+policy is named :class:`Compat32`, with a corresponding pre-defined instance
+named :const:`compat32`. It provides for complete backward compatibility (in
+some cases, including bug compatibility) with the pre-Python3.3 version of the
+email package.
+
+The first part of this documentation covers the features of :class:`Policy`, an
+:term:`abstract base class` that defines the features that are common to all
+policy objects, including :const:`compat32`. This includes certain hook
+methods that are called internally by the email package, which a custom policy
+could override to obtain different behavior.
+
+When a :class:`~email.message.Message` object is created, it acquires a policy.
+By default this will be :const:`compat32`, but a different policy can be
+specified. If the ``Message`` is created by a :mod:`~email.parser`, a policy
+passed to the parser will be the policy used by the ``Message`` it creates. If
+the ``Message`` is created by the program, then the policy can be specified
+when it is created. When a ``Message`` is passed to a :mod:`~email.generator`,
+the generator uses the policy from the ``Message`` by default, but you can also
+pass a specific policy to the generator that will override the one stored on
+the ``Message`` object.
+
+:class:`Policy` instances are immutable, but they can be cloned, accepting the
+same keyword arguments as the class constructor and returning a new
+:class:`Policy` instance that is a copy of the original but with the specified
+attributes values changed.
+
+As an example, the following code could be used to read an email message from a
+file on disk and pass it to the system ``sendmail`` program on a Unix system::
+
+ >>> from email import msg_from_binary_file
+ >>> from email.generator import BytesGenerator
+ >>> from subprocess import Popen, PIPE
+ >>> with open('mymsg.txt', 'b') as f:
+ ... msg = msg_from_binary_file(f)
+ >>> p = Popen(['sendmail', msg['To'][0].address], stdin=PIPE)
+ >>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))
+ >>> g.flatten(msg)
+ >>> p.stdin.close()
+ >>> rc = p.wait()
+
+Here we are telling :class:`~email.generator.BytesGenerator` to use the RFC
+correct line separator characters when creating the binary string to feed into
+``sendmail's`` ``stdin``, where the default policy would use ``\n`` line
+separators.
+
+Some email package methods accept a *policy* keyword argument, allowing the
+policy to be overridden for that method. For example, the following code uses
+the :meth:`~email.message.Message.as_string` method of the *msg* object from
+the previous example and writes the message to a file using the native line
+separators for the platform on which it is running::
+
+ >>> import os
+ >>> with open('converted.txt', 'wb') as f:
+ ... f.write(msg.as_string(policy=msg.policy.clone(linesep=os.linesep))
+
+Policy objects can also be combined using the addition operator, producing a
+policy object whose settings are a combination of the non-default values of the
+summed objects::
+
+ >>> compat_SMTP = email.policy.clone(linesep='\r\n')
+ >>> compat_strict = email.policy.clone(raise_on_defect=True)
+ >>> compat_strict_SMTP = compat_SMTP + compat_strict
+
+This operation is not commutative; that is, the order in which the objects are
+added matters. To illustrate::
+
+ >>> policy100 = compat32.clone(max_line_length=100)
+ >>> policy80 = compat32.clone(max_line_length=80)
+ >>> apolicy = policy100 + Policy80
+ >>> apolicy.max_line_length
+ 80
+ >>> apolicy = policy80 + policy100
+ >>> apolicy.max_line_length
+ 100
+
+
+.. class:: Policy(**kw)
+
+ This is the :term:`abstract base class` for all policy classes. It provides
+ default implementations for a couple of trivial methods, as well as the
+ implementation of the immutability property, the :meth:`clone` method, and
+ the constructor semantics.
+
+ The constructor of a policy class can be passed various keyword arguments.
+ The arguments that may be specified are any non-method properties on this
+ class, plus any additional non-method properties on the concrete class. A
+ value specified in the constructor will override the default value for the
+ corresponding attribute.
+
+ This class defines the following properties, and thus values for the
+ following may be passed in the constructor of any policy class:
+
+ .. attribute:: max_line_length
+
+ The maximum length of any line in the serialized output, not counting the
+ end of line character(s). Default is 78, per :rfc:`5322`. A value of
+ ``0`` or :const:`None` indicates that no line wrapping should be
+ done at all.
+
+ .. attribute:: linesep
+
+ The string to be used to terminate lines in serialized output. The
+ default is ``\n`` because that's the internal end-of-line discipline used
+ by Python, though ``\r\n`` is required by the RFCs.
+
+ .. attribute:: cte_type
+
+ Controls the type of Content Transfer Encodings that may be or are
+ required to be used. The possible values are:
+
+ ======== ===============================================================
+ ``7bit`` all data must be "7 bit clean" (ASCII-only). This means that
+ where necessary data will be encoded using either
+ quoted-printable or base64 encoding.
+
+ ``8bit`` data is not constrained to be 7 bit clean. Data in headers is
+ still required to be ASCII-only and so will be encoded (see
+ 'binary_fold' below for an exception), but body parts may use
+ the ``8bit`` CTE.
+ ======== ===============================================================
+
+ A ``cte_type`` value of ``8bit`` only works with ``BytesGenerator``, not
+ ``Generator``, because strings cannot contain binary data. If a
+ ``Generator`` is operating under a policy that specifies
+ ``cte_type=8bit``, it will act as if ``cte_type`` is ``7bit``.
+
+ .. attribute:: raise_on_defect
+
+ If :const:`True`, any defects encountered will be raised as errors. If
+ :const:`False` (the default), defects will be passed to the
+ :meth:`register_defect` method.
+
+ The following :class:`Policy` method is intended to be called by code using
+ the email library to create policy instances with custom settings:
+
+ .. method:: clone(**kw)
+
+ Return a new :class:`Policy` instance whose attributes have the same
+ values as the current instance, except where those attributes are
+ given new values by the keyword arguments.
+
+ The remaining :class:`Policy` methods are called by the email package code,
+ and are not intended to be called by an application using the email package.
+ A custom policy must implement all of these methods.
+
+ .. method:: handle_defect(obj, defect)
+
+ Handle a *defect* found on *obj*. When the email package calls this
+ method, *defect* will always be a subclass of
+ :class:`~email.errors.Defect`.
+
+ The default implementation checks the :attr:`raise_on_defect` flag. If
+ it is ``True``, *defect* is raised as an exception. If it is ``False``
+ (the default), *obj* and *defect* are passed to :meth:`register_defect`.
+
+ .. method:: register_defect(obj, defect)
+
+ Register a *defect* on *obj*. In the email package, *defect* will always
+ be a subclass of :class:`~email.errors.Defect`.
+
+ The default implementation calls the ``append`` method of the ``defects``
+ attribute of *obj*. When the email package calls :attr:`handle_defect`,
+ *obj* will normally have a ``defects`` attribute that has an ``append``
+ method. Custom object types used with the email package (for example,
+ custom ``Message`` objects) should also provide such an attribute,
+ otherwise defects in parsed messages will raise unexpected errors.
+
+ .. method:: header_max_count(name)
+
+ Return the maximum allowed number of headers named *name*.
+
+ Called when a header is added to a :class:`~email.message.Message`
+ object. If the returned value is not ``0`` or ``None``, and there are
+ already a number of headers with the name *name* equal to the value
+ returned, a :exc:`ValueError` is raised.
+
+ Because the default behavior of ``Message.__setitem__`` is to append the
+ value to the list of headers, it is easy to create duplicate headers
+ without realizing it. This method allows certain headers to be limited
+ in the number of instances of that header that may be added to a
+ ``Message`` programmatically. (The limit is not observed by the parser,
+ which will faithfully produce as many headers as exist in the message
+ being parsed.)
+
+ The default implementation returns ``None`` for all header names.
+
+ .. method:: header_source_parse(sourcelines)
+
+ The email package calls this method with a list of strings, each string
+ ending with the line separation characters found in the source being
+ parsed. The first line includes the field header name and separator.
+ All whitespace in the source is preserved. The method should return the
+ ``(name, value)`` tuple that is to be stored in the ``Message`` to
+ represent the parsed header.
+
+ If an implementation wishes to retain compatibility with the existing
+ email package policies, *name* should be the case preserved name (all
+ characters up to the '``:``' separator), while *value* should be the
+ unfolded value (all line separator characters removed, but whitespace
+ kept intact), stripped of leading whitespace.
+
+ *sourcelines* may contain surrogateescaped binary data.
+
+ There is no default implementation
+
+ .. method:: header_store_parse(name, value)
+
+ The email package calls this method with the name and value provided by
+ the application program when the application program is modifying a
+ ``Message`` programmatically (as opposed to a ``Message`` created by a
+ parser). The method should return the ``(name, value)`` tuple that is to
+ be stored in the ``Message`` to represent the header.
+
+ If an implementation wishes to retain compatibility with the existing
+ email package policies, the *name* and *value* should be strings or
+ string subclasses that do not change the content of the passed in
+ arguments.
+
+ There is no default implementation
+
+ .. method:: header_fetch_parse(name, value)
+
+ The email package calls this method with the *name* and *value* currently
+ stored in the ``Message`` when that header is requested by the
+ application program, and whatever the method returns is what is passed
+ back to the application as the value of the header being retrieved.
+ Note that there may be more than one header with the same name stored in
+ the ``Message``; the method is passed the specific name and value of the
+ header destined to be returned to the application.
+
+ *value* may contain surrogateescaped binary data. There should be no
+ surrogateescaped binary data in the value returned by the method.
+
+ There is no default implementation
+
+ .. method:: fold(name, value)
+
+ The email package calls this method with the *name* and *value* currently
+ stored in the ``Message`` for a given header. The method should return a
+ string that represents that header "folded" correctly (according to the
+ policy settings) by composing the *name* with the *value* and inserting
+ :attr:`linesep` characters at the appropriate places. See :rfc:`5322`
+ for a discussion of the rules for folding email headers.
+
+ *value* may contain surrogateescaped binary data. There should be no
+ surrogateescaped binary data in the string returned by the method.
+
+ .. method:: fold_binary(name, value)
+
+ The same as :meth:`fold`, except that the returned value should be a
+ bytes object rather than a string.
+
+ *value* may contain surrogateescaped binary data. These could be
+ converted back into binary data in the returned bytes object.
+
+
+.. class:: Compat32(**kw)
+
+ This concrete :class:`Policy` is the backward compatibility policy. It
+ replicates the behavior of the email package in Python 3.2. The
+ :mod:`policy` module also defines an instance of this class,
+ :const:`compat32`, that is used as the default policy. Thus the default
+ behavior of the email package is to maintain compatibility with Python 3.2.
+
+ The class provides the following concrete implementations of the
+ abstract methods of :class:`Policy`:
+
+ .. method:: header_source_parse(sourcelines)
+
+ The name is parsed as everything up to the '``:``' and returned
+ unmodified. The value is determined by stripping leading whitespace off
+ the remainder of the first line, joining all subsequent lines together,
+ and stripping any trailing carriage return or linefeed characters.
+
+ .. method:: header_store_parse(name, value)
+
+ The name and value are returned unmodified.
+
+ .. method:: header_fetch_parse(name, value)
+
+ If the value contains binary data, it is converted into a
+ :class:`~email.header.Header` object using the ``unknown-8bit`` charset.
+ Otherwise it is returned unmodified.
+
+ .. method:: fold(name, value)
+
+ Headers are folded using the :class:`~email.header.Header` folding
+ algorithm, which preserves existing line breaks in the value, and wraps
+ each resulting line to the ``max_line_length``. Non-ASCII binary data are
+ CTE encoded using the ``unknown-8bit`` charset.
+
+ .. method:: fold_binary(name, value)
+
+ Headers are folded using the :class:`~email.header.Header` folding
+ algorithm, which preserves existing line breaks in the value, and wraps
+ each resulting line to the ``max_line_length``. If ``cte_type`` is
+ ``7bit``, non-ascii binary data is CTE encoded using the ``unknown-8bit``
+ charset. Otherwise the original source header is used, with its existing
+ line breaks and and any (RFC invalid) binary data it may contain.
+
+
+.. note::
+
+ The documentation below describes new policies that are included in the
+ standard library on a :term:`provisional basis <provisional package>`.
+ Backwards incompatible changes (up to and including removal of the feature)
+ may occur if deemed necessary by the core developers.
+
+
+.. class:: EmailPolicy(**kw)
+
+ This concrete :class:`Policy` provides behavior that is intended to be fully
+ compliant with the current email RFCs. These include (but are not limited
+ to) :rfc:`5322`, :rfc:`2047`, and the current MIME RFCs.
+
+ This policy adds new header parsing and folding algorithms. Instead of
+ simple strings, headers are custom objects with custom attributes depending
+ on the type of the field. The parsing and folding algorithm fully implement
+ :rfc:`2047` and :rfc:`5322`.
+
+ In addition to the settable attributes listed above that apply to all
+ policies, this policy adds the following additional attributes:
+
+ .. attribute:: refold_source
+
+ If the value for a header in the ``Message`` object originated from a
+ :mod:`~email.parser` (as opposed to being set by a program), this
+ attribute indicates whether or not a generator should refold that value
+ when transforming the message back into stream form. The possible values
+ are:
+
+ ======== ===============================================================
+ ``none`` all source values use original folding
+
+ ``long`` source values that have any line that is longer than
+ ``max_line_length`` will be refolded
+
+ ``all`` all values are refolded.
+ ======== ===============================================================
+
+ The default is ``long``.
+
+ .. attribute:: header_factory
+
+ A callable that takes two arguments, ``name`` and ``value``, where
+ ``name`` is a header field name and ``value`` is an unfolded header field
+ value, and returns a string subclass that represents that header. A
+ default ``header_factory`` (see :mod:`~email.headerregistry`) is provided
+ that understands some of the :RFC:`5322` header field types. (Currently
+ address fields and date fields have special treatment, while all other
+ fields are treated as unstructured. This list will be completed before
+ the extension is marked stable.)
+
+ The class provides the following concrete implementations of the abstract
+ methods of :class:`Policy`:
+
+ .. method:: header_max_count(name)
+
+ Returns the value of the
+ :attr:`~email.headerregistry.BaseHeader.max_count` attribute of the
+ specialized class used to represent the header with the given name.
+
+ .. method:: header_source_parse(sourcelines)
+
+ The implementation of this method is the same as that for the
+ :class:`Compat32` policy.
+
+ .. method:: header_store_parse(name, value)
+
+ The name is returned unchanged. If the input value has a ``name``
+ attribute and it matches *name* ignoring case, the value is returned
+ unchanged. Otherwise the *name* and *value* are passed to
+ ``header_factory``, and the resulting custom header object is returned as
+ the value. In this case a ``ValueError`` is raised if the input value
+ contains CR or LF characters.
+
+ .. method:: header_fetch_parse(name, value)
+
+ If the value has a ``name`` attribute, it is returned to unmodified.
+ Otherwise the *name*, and the *value* with any CR or LF characters
+ removed, are passed to the ``header_factory``, and the resulting custom
+ header object is returned. Any surrogateescaped bytes get turned into
+ the unicode unknown-character glyph.
+
+ .. method:: fold(name, value)
+
+ Header folding is controlled by the :attr:`refold_source` policy setting.
+ A value is considered to be a 'source value' if and only if it does not
+ have a ``name`` attribute (having a ``name`` attribute means it is a
+ header object of some sort). If a source value needs to be refolded
+ according to the policy, it is converted into a custom header object by
+ passing the *name* and the *value* with any CR and LF characters removed
+ to the ``header_factory``. Folding of a custom header object is done by
+ calling its ``fold`` method with the current policy.
+
+ Source values are split into lines using :meth:`~str.splitlines`. If
+ the value is not to be refolded, the lines are rejoined using the
+ ``linesep`` from the policy and returned. The exception is lines
+ containing non-ascii binary data. In that case the value is refolded
+ regardless of the ``refold_source`` setting, which causes the binary data
+ to be CTE encoded using the ``unknown-8bit`` charset.
+
+ .. method:: fold_binary(name, value)
+
+ The same as :meth:`fold` if :attr:`cte_type` is ``7bit``, except that
+ the returned value is bytes.
+
+ If :attr:`cte_type` is ``8bit``, non-ASCII binary data is converted back
+ into bytes. Headers with binary data are not refolded, regardless of the
+ ``refold_header`` setting, since there is no way to know whether the
+ binary data consists of single byte characters or multibyte characters.
+
+The following instances of :class:`EmailPolicy` provide defaults suitable for
+specific application domains. Note that in the future the behavior of these
+instances (in particular the ``HTTP`` instance) may be adjusted to conform even
+more closely to the RFCs relevant to their domains.
+
+.. data:: default
+
+ An instance of ``EmailPolicy`` with all defaults unchanged. This policy
+ uses the standard Python ``\n`` line endings rather than the RFC-correct
+ ``\r\n``.
+
+.. data:: SMTP
+
+ Suitable for serializing messages in conformance with the email RFCs.
+ Like ``default``, but with ``linesep`` set to ``\r\n``, which is RFC
+ compliant.
+
+.. data:: HTTP
+
+ Suitable for serializing headers with for use in HTTP traffic. Like
+ ``SMTP`` except that ``max_line_length`` is set to ``None`` (unlimited).
+
+.. data:: strict
+
+ Convenience instance. The same as ``default`` except that
+ ``raise_on_defect`` is set to ``True``. This allows any policy to be made
+ strict by writing::
+
+ somepolicy + policy.strict
+
+With all of these :class:`EmailPolicies <.EmailPolicy>`, the effective API of
+the email package is changed from the Python 3.2 API in the following ways:
+
+ * Setting a header on a :class:`~email.message.Message` results in that
+ header being parsed and a custom header object created.
+
+ * Fetching a header value from a :class:`~email.message.Message` results
+ in that header being parsed and a custom header object created and
+ returned.
+
+ * Any custom header object, or any header that is refolded due to the
+ policy settings, is folded using an algorithm that fully implements the
+ RFC folding algorithms, including knowing where encoded words are required
+ and allowed.
+
+From the application view, this means that any header obtained through the
+:class:`~email.message.Message` is a custom header object with custom
+attributes, whose string value is the fully decoded unicode value of the
+header. Likewise, a header may be assigned a new value, or a new header
+created, using a unicode string, and the policy will take care of converting
+the unicode string into the correct RFC encoded form.
+
+The custom header objects and their attributes are described in
+:mod:`~email.headerregistry`.
diff --git a/Doc/library/email.rst b/Doc/library/email.rst
index 4530b95..ef5354f 100644
--- a/Doc/library/email.rst
+++ b/Doc/library/email.rst
@@ -51,6 +51,8 @@ Contents of the :mod:`email` package documentation:
email.message.rst
email.parser.rst
email.generator.rst
+ email.policy.rst
+ email.headerregistry.rst
email.mime.rst
email.header.rst
email.charset.rst
diff --git a/Doc/library/email.util.rst b/Doc/library/email.util.rst
index 11bf3b2..bad0b24 100644
--- a/Doc/library/email.util.rst
+++ b/Doc/library/email.util.rst
@@ -29,13 +29,21 @@ There are several useful utilities provided in the :mod:`email.utils` module:
fails, in which case a 2-tuple of ``('', '')`` is returned.
-.. function:: formataddr(pair)
+.. function:: formataddr(pair, charset='utf-8')
The inverse of :meth:`parseaddr`, this takes a 2-tuple of the form ``(realname,
email_address)`` and returns the string value suitable for a :mailheader:`To` or
:mailheader:`Cc` header. If the first element of *pair* is false, then the
second element is returned unmodified.
+ Optional *charset* is the character set that will be used in the :rfc:`2047`
+ encoding of the ``realname`` if the ``realname`` contains non-ASCII
+ characters. Can be an instance of :class:`str` or a
+ :class:`~email.charset.Charset`. Defaults to ``utf-8``.
+
+ .. versionchanged:: 3.3
+ Added the *charset* option.
+
.. function:: getaddresses(fieldvalues)
@@ -74,6 +82,20 @@ There are several useful utilities provided in the :mod:`email.utils` module:
indexes 6, 7, and 8 of the result tuple are not usable.
+.. function:: parsedate_to_datetime(date)
+
+ The inverse of :func:`format_datetime`. Performs the same function as
+ :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`. If
+ the input date has a timezone of ``-0000``, the ``datetime`` will be a naive
+ ``datetime``, and if the date is conforming to the RFCs it will represent a
+ time in UTC but with no indication of the actual source timezone of the
+ message the date comes from. If the input date has any other valid timezone
+ offset, the ``datetime`` will be an aware ``datetime`` with the
+ corresponding a :class:`~datetime.timezone` :class:`~datetime.tzinfo`.
+
+ .. versionadded:: 3.3
+
+
.. function:: mktime_tz(tuple)
Turn a 10-tuple as returned by :func:`parsedate_tz` into a UTC timestamp. It
@@ -105,6 +127,36 @@ There are several useful utilities provided in the :mod:`email.utils` module:
``False``. The default is ``False``.
+.. function:: format_datetime(dt, usegmt=False)
+
+ Like ``formatdate``, but the input is a :mod:`datetime` instance. If it is
+ a naive datetime, it is assumed to be "UTC with no information about the
+ source timezone", and the conventional ``-0000`` is used for the timezone.
+ If it is an aware ``datetime``, then the numeric timezone offset is used.
+ If it is an aware timezone with offset zero, then *usegmt* may be set to
+ ``True``, in which case the string ``GMT`` is used instead of the numeric
+ timezone offset. This provides a way to generate standards conformant HTTP
+ date headers.
+
+ .. versionadded:: 3.3
+
+
+.. function:: localtime(dt=None)
+
+ Return local time as an aware datetime object. If called without
+ arguments, return current time. Otherwise *dt* argument should be a
+ :class:`~datetime.datetime` instance, and it is converted to the local time
+ zone according to the system time zone database. If *dt* is naive (that
+ is, ``dt.tzinfo`` is ``None``), it is assumed to be in local time. In this
+ case, a positive or zero value for *isdst* causes ``localtime`` to presume
+ initially that summer time (for example, Daylight Saving Time) is or is not
+ (respectively) in effect for the specified time. A negative value for
+ *isdst* causes the ``localtime`` to attempt to divine whether summer time
+ is in effect for the specified time.
+
+ .. versionadded:: 3.3
+
+
.. function:: make_msgid(idstring=None, domain=None)
Returns a string suitable for an :rfc:`2822`\ -compliant
@@ -115,7 +167,8 @@ There are several useful utilities provided in the :mod:`email.utils` module:
may be useful certain cases, such as a constructing distributed system that
uses a consistent domain name across multiple hosts.
- .. versionchanged:: 3.2 domain keyword added
+ .. versionchanged:: 3.2
+ Added the *domain* keyword.
.. function:: decode_rfc2231(s)
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index 7d622c2..053ba56 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -34,6 +34,27 @@ programmers are encouraged to at least derive new exceptions from the
defining exceptions is available in the Python Tutorial under
:ref:`tut-userexceptions`.
+When raising (or re-raising) an exception in an :keyword:`except` clause
+:attr:`__context__` is automatically set to the last exception caught; if the
+new exception is not handled the traceback that is eventually displayed will
+include the originating exception(s) and the final exception.
+
+This implicit exception chain can be made explicit by using :keyword:`from` with
+:keyword:`raise`. The single argument to :keyword:`from` must be an exception
+or ``None``. It will be set as :attr:`__cause__` on the raised exception.
+Setting :attr:`__cause__` implicitly sets the :attr:`__suppress_context__` to
+``True``. If :attr:`__cause__` is an exception, it will be displayed. If
+:attr:`__cause__` is present or :attr:`__suppress_context__` has a true value,
+:attr:`__context__` will not be displayed.
+
+In either case, the default exception handling code will not display any of the
+remaining links in the :attr:`__context__` chain if :attr:`__cause__` has been
+set.
+
+
+Base classes
+------------
+
The following exceptions are used mostly as base classes for other exceptions.
.. exception:: BaseException
@@ -90,27 +111,8 @@ The following exceptions are used mostly as base classes for other exceptions.
can be raised directly by :func:`codecs.lookup`.
-.. exception:: EnvironmentError
-
- The base class for exceptions that can occur outside the Python system:
- :exc:`IOError`, :exc:`OSError`. When exceptions of this type are created with a
- 2-tuple, the first item is available on the instance's :attr:`errno` attribute
- (it is assumed to be an error number), and the second item is available on the
- :attr:`strerror` attribute (it is usually the associated error message). The
- tuple itself is also available on the :attr:`args` attribute.
-
- When an :exc:`EnvironmentError` exception is instantiated with a 3-tuple, the
- first two items are available as above, while the third item is available on the
- :attr:`filename` attribute. However, for backwards compatibility, the
- :attr:`args` attribute contains only a 2-tuple of the first two constructor
- arguments.
-
- The :attr:`filename` attribute is ``None`` when this exception is created with
- other than 3 arguments. The :attr:`errno` and :attr:`strerror` attributes are
- also ``None`` when the instance was created with other than 2 or 3 arguments.
- In this last case, :attr:`args` contains the verbatim constructor arguments as a
- tuple.
-
+Concrete exceptions
+-------------------
The following exceptions are the exceptions that are usually raised.
@@ -151,21 +153,19 @@ The following exceptions are the exceptions that are usually raised.
it is technically not an error.
-.. exception:: IOError
-
- Raised when an I/O operation (such as the built-in :func:`print` or
- :func:`open` functions or a method of a :term:`file object`) fails for an
- I/O-related reason, e.g., "file not found" or "disk full".
-
- This class is derived from :exc:`EnvironmentError`. See the discussion above
- for more information on exception instance attributes.
-
-
.. exception:: ImportError
Raised when an :keyword:`import` statement fails to find the module definition
or when a ``from ... import`` fails to find a name that is to be imported.
+ The :attr:`name` and :attr:`path` attributes can be set using keyword-only
+ arguments to the constructor. When set they represent the name of the module
+ that was attempted to be imported and the path to any file which triggered
+ the exception, respectively.
+
+ .. versionchanged:: 3.3
+ Added the :attr:`name` and :attr:`path` attributes.
+
.. exception:: IndexError
@@ -221,17 +221,30 @@ The following exceptions are the exceptions that are usually raised.
.. index:: module: errno
- This exception is derived from :exc:`EnvironmentError`. It is raised when a
- function returns a system-related error (not for illegal argument types or
- other incidental errors). The :attr:`errno` attribute is a numeric error
- code from :c:data:`errno`, and the :attr:`strerror` attribute is the
- corresponding string, as would be printed by the C function :c:func:`perror`.
- See the module :mod:`errno`, which contains names for the error codes defined
- by the underlying operating system.
+ This exception is raised when a system function returns a system-related
+ error, including I/O failures such as "file not found" or "disk full"
+ (not for illegal argument types or other incidental errors). Often a
+ subclass of :exc:`OSError` will actually be raised as described in
+ `OS exceptions`_ below. The :attr:`errno` attribute is a numeric error
+ code from the C variable :c:data:`errno`.
+
+ Under Windows, the :attr:`winerror` attribute gives you the native
+ Windows error code. The :attr:`errno` attribute is then an approximate
+ translation, in POSIX terms, of that native error code.
+
+ Under all platforms, the :attr:`strerror` attribute is the corresponding
+ error message as provided by the operating system (as formatted by the C
+ functions :c:func:`perror` under POSIX, and :c:func:`FormatMessage`
+ Windows).
- For exceptions that involve a file system path (such as :func:`chdir` or
- :func:`unlink`), the exception instance will contain a third attribute,
- :attr:`filename`, which is the file name passed to the function.
+ For exceptions that involve a file system path (such as :func:`open` or
+ :func:`os.unlink`), the exception instance will contain an additional
+ attribute, :attr:`filename`, which is the file name passed to the function.
+
+ .. versionchanged:: 3.3
+ :exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`,
+ :exc:`VMSError`, :exc:`socket.error`, :exc:`select.error` and
+ :exc:`mmap.error` have been merged into :exc:`OSError`.
.. exception:: OverflowError
@@ -262,8 +275,20 @@ The following exceptions are the exceptions that are usually raised.
.. exception:: StopIteration
Raised by built-in function :func:`next` and an :term:`iterator`\'s
- :meth:`~iterator.__next__` method to signal that there are no further values.
+ :meth:`~iterator.__next__` method to signal that there are no further
+ items produced by the iterator.
+
+ The exception object has a single attribute :attr:`value`, which is
+ given as an argument when constructing the exception, and defaults
+ to :const:`None`.
+
+ When a generator function returns, a new :exc:`StopIteration` instance is
+ raised, and the value returned by the function is used as the
+ :attr:`value` parameter to the constructor of the exception.
+ .. versionchanged:: 3.3
+ Added ``value`` attribute and the ability for generator functions to
+ use it to return a value.
.. exception:: SyntaxError
@@ -372,27 +397,142 @@ The following exceptions are the exceptions that are usually raised.
more precise exception such as :exc:`IndexError`.
-.. exception:: VMSError
+.. exception:: ZeroDivisionError
+
+ Raised when the second argument of a division or modulo operation is zero. The
+ associated value is a string indicating the type of the operands and the
+ operation.
+
- Only available on VMS. Raised when a VMS-specific error occurs.
+The following exceptions are kept for compatibility with previous versions;
+starting from Python 3.3, they are aliases of :exc:`OSError`.
+.. exception:: EnvironmentError
+
+.. exception:: IOError
+
+.. exception:: VMSError
+
+ Only available on VMS.
.. exception:: WindowsError
- Raised when a Windows-specific error occurs or when the error number does not
- correspond to an :c:data:`errno` value. The :attr:`winerror` and
- :attr:`strerror` values are created from the return values of the
- :c:func:`GetLastError` and :c:func:`FormatMessage` functions from the Windows
- Platform API. The :attr:`errno` value maps the :attr:`winerror` value to
- corresponding ``errno.h`` values. This is a subclass of :exc:`OSError`.
+ Only available on Windows.
-.. exception:: ZeroDivisionError
+OS exceptions
+^^^^^^^^^^^^^
+
+The following exceptions are subclasses of :exc:`OSError`, they get raised
+depending on the system error code.
+
+.. exception:: BlockingIOError
+
+ Raised when an operation would block on an object (e.g. socket) set
+ for non-blocking operation.
+ Corresponds to :c:data:`errno` ``EAGAIN``, ``EALREADY``,
+ ``EWOULDBLOCK`` and ``EINPROGRESS``.
+
+ In addition to those of :exc:`OSError`, :exc:`BlockingIOError` can have
+ one more attribute:
+
+ .. attribute:: characters_written
+
+ An integer containing the number of characters written to the stream
+ before it blocked. This attribute is available when using the
+ buffered I/O classes from the :mod:`io` module.
+
+.. exception:: ChildProcessError
+
+ Raised when an operation on a child process failed.
+ Corresponds to :c:data:`errno` ``ECHILD``.
+
+.. exception:: ConnectionError
+
+ A base class for connection-related issues.
+
+ Subclasses are :exc:`BrokenPipeError`, :exc:`ConnectionAbortedError`,
+ :exc:`ConnectionRefusedError` and :exc:`ConnectionResetError`.
+
+.. exception:: BrokenPipeError
+
+ A subclass of :exc:`ConnectionError`, raised when trying to write on a
+ pipe while the other end has been closed, or trying to write on a socket
+ which has been shutdown for writing.
+ Corresponds to :c:data:`errno` ``EPIPE`` and ``ESHUTDOWN``.
+
+.. exception:: ConnectionAbortedError
+
+ A subclass of :exc:`ConnectionError`, raised when a connection attempt
+ is aborted by the peer.
+ Corresponds to :c:data:`errno` ``ECONNABORTED``.
+
+.. exception:: ConnectionRefusedError
+
+ A subclass of :exc:`ConnectionError`, raised when a connection attempt
+ is refused by the peer.
+ Corresponds to :c:data:`errno` ``ECONNREFUSED``.
+
+.. exception:: ConnectionResetError
+
+ A subclass of :exc:`ConnectionError`, raised when a connection is
+ reset by the peer.
+ Corresponds to :c:data:`errno` ``ECONNRESET``.
+
+.. exception:: FileExistsError
+
+ Raised when trying to create a file or directory which already exists.
+ Corresponds to :c:data:`errno` ``EEXIST``.
+
+.. exception:: FileNotFoundError
+
+ Raised when a file or directory is requested but doesn't exist.
+ Corresponds to :c:data:`errno` ``ENOENT``.
+
+.. exception:: InterruptedError
+
+ Raised when a system call is interrupted by an incoming signal.
+ Corresponds to :c:data:`errno` ``EEINTR``.
+
+.. exception:: IsADirectoryError
+
+ Raised when a file operation (such as :func:`os.remove`) is requested
+ on a directory.
+ Corresponds to :c:data:`errno` ``EISDIR``.
+
+.. exception:: NotADirectoryError
+
+ Raised when a directory operation (such as :func:`os.listdir`) is requested
+ on something which is not a directory.
+ Corresponds to :c:data:`errno` ``ENOTDIR``.
+
+.. exception:: PermissionError
+
+ Raised when trying to run an operation without the adequate access
+ rights - for example filesystem permissions.
+ Corresponds to :c:data:`errno` ``EACCES`` and ``EPERM``.
+
+.. exception:: ProcessLookupError
+
+ Raised when a given process doesn't exist.
+ Corresponds to :c:data:`errno` ``ESRCH``.
+
+.. exception:: TimeoutError
+
+ Raised when a system function timed out at the system level.
+ Corresponds to :c:data:`errno` ``ETIMEDOUT``.
+
+.. versionadded:: 3.3
+ All the above :exc:`OSError` subclasses were added.
+
+
+.. seealso::
+
+ :pep:`3151` - Reworking the OS and IO exception hierarchy
- Raised when the second argument of a division or modulo operation is zero. The
- associated value is a string indicating the type of the operands and the
- operation.
+Warnings
+--------
The following exceptions are used as warning categories; see the :mod:`warnings`
module for more information.
diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst
new file mode 100644
index 0000000..3c33621
--- /dev/null
+++ b/Doc/library/faulthandler.rst
@@ -0,0 +1,136 @@
+:mod:`faulthandler` --- Dump the Python traceback
+=================================================
+
+.. module:: faulthandler
+ :synopsis: Dump the Python traceback.
+
+This module contains functions to dump Python tracebacks explicitly, on a fault,
+after a timeout, or on a user signal. Call :func:`faulthandler.enable` to
+install fault handlers for the :const:`SIGSEGV`, :const:`SIGFPE`,
+:const:`SIGABRT`, :const:`SIGBUS`, and :const:`SIGILL` signals. You can also
+enable them at startup by setting the :envvar:`PYTHONFAULTHANDLER` environment
+variable or by using :option:`-X` ``faulthandler`` command line option.
+
+The fault handler is compatible with system fault handlers like Apport or the
+Windows fault handler. The module uses an alternative stack for signal handlers
+if the :c:func:`sigaltstack` function is available. This allows it to dump the
+traceback even on a stack overflow.
+
+The fault handler is called on catastrophic cases and therefore can only use
+signal-safe functions (e.g. it cannot allocate memory on the heap). Because of
+this limitation traceback dumping is minimal compared to normal Python
+tracebacks:
+
+* Only ASCII is supported. The ``backslashreplace`` error handler is used on
+ encoding.
+* Each string is limited to 500 characters.
+* Only the filename, the function name and the line number are
+ displayed. (no source code)
+* It is limited to 100 frames and 100 threads.
+
+By default, the Python traceback is written to :data:`sys.stderr`. To see
+tracebacks, applications must be run in the terminal. A log file can
+alternatively be passed to :func:`faulthandler.enable`.
+
+The module is implemented in C, so tracebacks can be dumped on a crash or when
+Python is deadlocked.
+
+.. versionadded:: 3.3
+
+
+Dump the traceback
+------------------
+
+.. function:: dump_traceback(file=sys.stderr, all_threads=True)
+
+ Dump the tracebacks of all threads into *file*. If *all_threads* is
+ ``False``, dump only the current thread.
+
+
+Fault handler state
+-------------------
+
+.. function:: enable(file=sys.stderr, all_threads=True)
+
+ Enable the fault handler: install handlers for the :const:`SIGSEGV`,
+ :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL`
+ signals to dump the Python traceback. If *all_threads* is ``True``,
+ produce tracebacks for every running thread. Otherwise, dump only the current
+ thread.
+
+.. function:: disable()
+
+ Disable the fault handler: uninstall the signal handlers installed by
+ :func:`enable`.
+
+.. function:: is_enabled()
+
+ Check if the fault handler is enabled.
+
+
+Dump the tracebacks after a timeout
+-----------------------------------
+
+.. function:: dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)
+
+ Dump the tracebacks of all threads, after a timeout of *timeout* seconds, or
+ every *timeout* seconds if *repeat* is ``True``. If *exit* is ``True``, call
+ :c:func:`_exit` with status=1 after dumping the tracebacks. (Note
+ :c:func:`_exit` exits the process immediately, which means it doesn't do any
+ cleanup like flushing file buffers.) If the function is called twice, the new
+ call replaces previous parameters and resets the timeout. The timer has a
+ sub-second resolution.
+
+ This function is implemented using a watchdog thread and therefore is not
+ available if Python is compiled with threads disabled.
+
+.. function:: cancel_dump_traceback_later()
+
+ Cancel the last call to :func:`dump_traceback_later`.
+
+
+Dump the traceback on a user signal
+-----------------------------------
+
+.. function:: register(signum, file=sys.stderr, all_threads=True, chain=False)
+
+ Register a user signal: install a handler for the *signum* signal to dump
+ the traceback of all threads, or of the current thread if *all_threads* is
+ ``False``, into *file*. Call the previous handler if chain is ``True``.
+
+ Not available on Windows.
+
+.. function:: unregister(signum)
+
+ Unregister a user signal: uninstall the handler of the *signum* signal
+ installed by :func:`register`. Return ``True`` if the signal was registered,
+ ``False`` otherwise.
+
+ Not available on Windows.
+
+
+File descriptor issue
+---------------------
+
+:func:`enable`, :func:`dump_traceback_later` and :func:`register` keep the
+file descriptor of their *file* argument. If the file is closed and its file
+descriptor is reused by a new file, or if :func:`os.dup2` is used to replace
+the file descriptor, the traceback will be written into a different file. Call
+these functions again each time that the file is replaced.
+
+
+Example
+-------
+
+Example of a segmentation fault on Linux: ::
+
+ $ python -q -X faulthandler
+ >>> import ctypes
+ >>> ctypes.string_at(0)
+ Fatal Python error: Segmentation fault
+
+ Current thread 0x00007fb899f39700:
+ File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
+ File "<stdin>", line 1 in <module>
+ Segmentation fault
+
diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst
index 6192400..9a9cdc1 100644
--- a/Doc/library/fcntl.rst
+++ b/Doc/library/fcntl.rst
@@ -19,6 +19,11 @@ argument. This can be an integer file descriptor, such as returned by
``sys.stdin.fileno()``, or a :class:`io.IOBase` object, such as ``sys.stdin``
itself, which provides a :meth:`fileno` that returns a genuine file descriptor.
+.. versionchanged:: 3.3
+ Operations in this module used to raise a :exc:`IOError` where they now
+ raise a :exc:`OSError`.
+
+
The module defines the following functions:
@@ -40,7 +45,7 @@ The module defines the following functions:
larger than 1024 bytes, this is most likely to result in a segmentation
violation or a more subtle data corruption.
- If the :c:func:`fcntl` fails, an :exc:`IOError` is raised.
+ If the :c:func:`fcntl` fails, an :exc:`OSError` is raised.
.. function:: ioctl(fd, op[, arg[, mutate_flag]])
@@ -107,7 +112,7 @@ The module defines the following functions:
When *operation* is :const:`LOCK_SH` or :const:`LOCK_EX`, it can also be
bitwise ORed with :const:`LOCK_NB` to avoid blocking on lock acquisition.
If :const:`LOCK_NB` is used and the lock cannot be acquired, an
- :exc:`IOError` will be raised and the exception will have an *errno*
+ :exc:`OSError` will be raised and the exception will have an *errno*
attribute set to :const:`EACCES` or :const:`EAGAIN` (depending on the
operating system; for portability, check for both values). On at least some
systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a
diff --git a/Doc/library/filecmp.rst b/Doc/library/filecmp.rst
index de20fb1..add68a3 100644
--- a/Doc/library/filecmp.rst
+++ b/Doc/library/filecmp.rst
@@ -21,11 +21,8 @@ The :mod:`filecmp` module defines the following functions:
Compare the files named *f1* and *f2*, returning ``True`` if they seem equal,
``False`` otherwise.
- Unless *shallow* is given and is false, files with identical :func:`os.stat`
- signatures are taken to be equal.
-
- Files that were compared using this function will not be compared again unless
- their :func:`os.stat` signature changes.
+ If *shallow* is true, files with identical :func:`os.stat` signatures are
+ taken to be equal. Otherwise, the contents of the files are compared.
Note that no external programs are called from this function, giving it
portability and efficiency.
@@ -51,23 +48,11 @@ The :mod:`filecmp` module defines the following functions:
one of the three returned lists.
-Example::
-
- >>> import filecmp
- >>> filecmp.cmp('undoc.rst', 'undoc.rst')
- True
- >>> filecmp.cmp('undoc.rst', 'index.rst')
- False
-
-
.. _dircmp-objects:
The :class:`dircmp` class
-------------------------
-:class:`dircmp` instances are built using this constructor:
-
-
.. class:: dircmp(a, b, ignore=None, hide=None)
Construct a new directory comparison object, to compare the directories *a* and
@@ -83,7 +68,7 @@ The :class:`dircmp` class
.. method:: report()
- Print (to ``sys.stdout``) a comparison between *a* and *b*.
+ Print (to :data:`sys.stdout`) a comparison between *a* and *b*.
.. method:: report_partial_closure()
diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst
index ac44311..f8ec436 100644
--- a/Doc/library/fileinput.rst
+++ b/Doc/library/fileinput.rst
@@ -28,7 +28,10 @@ as the first argument to :func:`.input`. A single file name is also allowed.
All files are opened in text mode by default, but you can override this by
specifying the *mode* parameter in the call to :func:`.input` or
:class:`FileInput`. If an I/O error occurs during opening or reading a file,
-:exc:`IOError` is raised.
+:exc:`OSError` is raised.
+
+.. versionchanged:: 3.3
+ :exc:`IOError` used to be raised; it is now an alias of :exc:`OSError`.
If ``sys.stdin`` is used more than once, the second and further use will return
no lines, except perhaps for interactive use, or if it has been explicitly reset
@@ -168,10 +171,6 @@ and the backup file remains around; by default, the extension is ``'.bak'`` and
it is deleted when the output file is closed. In-place filtering is disabled
when standard input is read.
-.. note::
-
- The current implementation does not work for MS-DOS 8+3 filesystems.
-
The two following opening hooks are provided by this module:
diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst
index a669b1b..1419af7 100644
--- a/Doc/library/ftplib.rst
+++ b/Doc/library/ftplib.rst
@@ -40,7 +40,7 @@ Here's a sample session using the :mod:`ftplib` module::
The module defines the following items:
-.. class:: FTP(host='', user='', passwd='', acct=''[, timeout])
+.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)
Return a new instance of the :class:`FTP` class. When *host* is given, the
method call ``connect(host)`` is made. When *user* is given, additionally
@@ -48,7 +48,8 @@ The module defines the following items:
*acct* default to the empty string when not given). The optional *timeout*
parameter specifies a timeout in seconds for blocking operations like the
connection attempt (if is not specified, the global default timeout setting
- will be used).
+ will be used). *source_address* is a 2-tuple ``(host, port)`` for the socket
+ to bind to as its source address before connecting.
:class:`FTP` class supports the :keyword:`with` statement. Here is a sample
on how using it:
@@ -68,8 +69,11 @@ The module defines the following items:
.. versionchanged:: 3.2
Support for the :keyword:`with` statement was added.
+ .. versionchanged:: 3.3
+ *source_address* parameter was added.
-.. class:: FTP_TLS(host='', user='', passwd='', acct='', [keyfile[, certfile[, context[, timeout]]]])
+
+.. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None)
A :class:`FTP` subclass which adds TLS support to FTP as described in
:rfc:`4217`.
@@ -80,10 +84,15 @@ The module defines the following items:
private key and certificate chain file name for the SSL connection.
*context* parameter is a :class:`ssl.SSLContext` object which allows
bundling SSL configuration options, certificates and private keys into a
- single (potentially long-lived) structure.
+ single (potentially long-lived) structure. *source_address* is a 2-tuple
+ ``(host, port)`` for the socket to bind to as its source address before
+ connecting.
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ *source_address* parameter was added.
+
Here's a sample session using the :class:`FTP_TLS` class:
>>> from ftplib import FTP_TLS
@@ -135,8 +144,7 @@ The module defines the following items:
The set of all exceptions (as a tuple) that methods of :class:`FTP`
instances may raise as a result of problems with the FTP connection (as
opposed to programming errors made by the caller). This set includes the
- four exceptions listed above as well as :exc:`socket.error` and
- :exc:`IOError`.
+ four exceptions listed above as well as :exc:`OSError`.
.. seealso::
@@ -174,7 +182,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
debugging output, logging each line sent and received on the control connection.
-.. method:: FTP.connect(host='', port=0[, timeout])
+.. method:: FTP.connect(host='', port=0, timeout=None, source_address=None)
Connect to the given host and port. The default port number is ``21``, as
specified by the FTP protocol specification. It is rarely needed to specify a
@@ -182,10 +190,14 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
instance; it should not be called at all if a host was given when the instance
was created. All other methods can only be used after a connection has been
made.
-
The optional *timeout* parameter specifies a timeout in seconds for the
connection attempt. If no *timeout* is passed, the global default timeout
setting will be used.
+ *source_address* is a 2-tuple ``(host, port)`` for the socket to bind to as
+ its source address before connecting.
+
+ .. versionchanged:: 3.3
+ *source_address* parameter was added.
.. method:: FTP.getwelcome()
@@ -241,13 +253,12 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
Retrieve a file or directory listing in ASCII transfer mode. *cmd* should be
an appropriate ``RETR`` command (see :meth:`retrbinary`) or a command such as
- ``LIST``, ``NLST`` or ``MLSD`` (usually just the string ``'LIST'``).
+ ``LIST`` or ``NLST`` (usually just the string ``'LIST'``).
``LIST`` retrieves a list of files and information about those files.
- ``NLST`` retrieves a list of file names. On some servers, ``MLSD`` retrieves
- a machine readable list of files and information about those files. The
- *callback* function is called for each line with a string argument containing
- the line with the trailing CRLF stripped. The default *callback* prints the
- line to ``sys.stdout``.
+ ``NLST`` retrieves a list of file names.
+ The *callback* function is called for each line with a string argument
+ containing the line with the trailing CRLF stripped. The default *callback*
+ prints the line to ``sys.stdout``.
.. method:: FTP.set_pasv(boolean)
@@ -307,6 +318,20 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
in :meth:`transfercmd`.
+.. method:: FTP.mlsd(path="", facts=[])
+
+ List a directory in a standardized format by using MLSD command
+ (:rfc:`3659`). If *path* is omitted the current directory is assumed.
+ *facts* is a list of strings representing the type of information desired
+ (e.g. ``["type", "size", "perm"]``). Return a generator object yielding a
+ tuple of two elements for every file found in path. First element is the
+ file name, the second one is a dictionary containing facts about the file
+ name. Content of this dictionary might be limited by the *facts* argument
+ but server is not guaranteed to return all requested facts.
+
+ .. versionadded:: 3.3
+
+
.. method:: FTP.nlst(argument[, ...])
Return a list of file names as returned by the ``NLST`` command. The
@@ -314,6 +339,8 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
directory). Multiple arguments can be used to pass non-standard options to
the ``NLST`` command.
+ .. deprecated:: 3.3 use :meth:`mlsd` instead.
+
.. method:: FTP.dir(argument[, ...])
@@ -324,6 +351,8 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
as a *callback* function as for :meth:`retrlines`; the default prints to
``sys.stdout``. This method returns ``None``.
+ .. deprecated:: 3.3 use :meth:`mlsd` instead.
+
.. method:: FTP.rename(fromname, toname)
@@ -396,6 +425,14 @@ FTP_TLS Objects
Set up secure control connection by using TLS or SSL, depending on what specified in :meth:`ssl_version` attribute.
+.. method:: FTP_TLS.ccc()
+
+ Revert control channel back to plaintext. This can be useful to take
+ advantage of firewalls that know how to handle NAT with non-secure FTP
+ without opening fixed ports.
+
+ .. versionadded:: 3.3
+
.. method:: FTP_TLS.prot_p()
Set up secure data connection.
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index f9e0d0a..024ef0f 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -17,9 +17,9 @@ are always available. They are listed here in alphabetical order.
:func:`bin` :func:`eval` :func:`int` :func:`open` :func:`str`
:func:`bool` :func:`exec` :func:`isinstance` :func:`ord` :func:`sum`
:func:`bytearray` :func:`filter` :func:`issubclass` :func:`pow` :func:`super`
-:func:`bytes` :func:`float` :func:`iter` :func:`print` :func:`tuple`
+:func:`bytes` :func:`float` :func:`iter` :func:`print` |func-tuple|_
:func:`callable` :func:`format` :func:`len` :func:`property` :func:`type`
-:func:`chr` |func-frozenset|_ :func:`list` :func:`range` :func:`vars`
+:func:`chr` |func-frozenset|_ |func-list|_ |func-range|_ :func:`vars`
:func:`classmethod` :func:`getattr` :func:`locals` :func:`repr` :func:`zip`
:func:`compile` :func:`globals` :func:`map` :func:`reversed` :func:`__import__`
:func:`complex` :func:`hasattr` :func:`max` :func:`round`
@@ -33,6 +33,9 @@ are always available. They are listed here in alphabetical order.
.. |func-frozenset| replace:: ``frozenset()``
.. |func-memoryview| replace:: ``memoryview()``
.. |func-set| replace:: ``set()``
+.. |func-list| replace:: ``list()``
+.. |func-tuple| replace:: ``tuple()``
+.. |func-range| replace:: ``range()``
.. function:: abs(x)
@@ -93,6 +96,7 @@ are always available. They are listed here in alphabetical order.
.. index:: pair: Boolean; type
+.. _func-bytearray:
.. function:: bytearray([source[, encoding[, errors]]])
Return a new array of bytes. The :class:`bytearray` type is a mutable
@@ -118,7 +122,10 @@ are always available. They are listed here in alphabetical order.
Without an argument, an array of size 0 is created.
+ See also :ref:`binaryseq` and :ref:`typebytearray`.
+
+.. _func-bytes:
.. function:: bytes([source[, encoding[, errors]]])
Return a new "bytes" object, which is an immutable sequence of integers in
@@ -130,6 +137,8 @@ are always available. They are listed here in alphabetical order.
Bytes objects can also be created with literals, see :ref:`strings`.
+ See also :ref:`binaryseq`, :ref:`typebytes`, and :ref:`bytes-methods`.
+
.. function:: callable(object)
@@ -152,10 +161,6 @@ are always available. They are listed here in alphabetical order.
1,114,111 (0x10FFFF in base 16). :exc:`ValueError` will be raised if *i* is
outside that range.
- Note that on narrow Unicode builds, the result is a string of
- length two for *i* greater than 65,535 (0xFFFF in hexadecimal).
-
-
.. function:: classmethod(function)
@@ -312,17 +317,18 @@ are always available. They are listed here in alphabetical order.
>>> import struct
>>> dir() # show the names in the module namespace
- ['__builtins__', '__doc__', '__name__', 'struct']
- >>> dir(struct) # show the names in the struct module
- ['Struct', '__builtins__', '__doc__', '__file__', '__name__',
- '__package__', '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
+ ['__builtins__', '__name__', 'struct']
+ >>> dir(struct) # show the names in the struct module # doctest: +SKIP
+ ['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
+ '__initializing__', '__loader__', '__name__', '__package__',
+ '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
'unpack', 'unpack_from']
>>> class Shape(object):
- def __dir__(self):
- return ['area', 'perimeter', 'location']
+ ... def __dir__(self):
+ ... return ['area', 'perimeter', 'location']
>>> s = Shape()
>>> dir(s)
- ['area', 'perimeter', 'location']
+ ['area', 'location', 'perimeter']
.. note::
@@ -623,9 +629,9 @@ are always available. They are listed here in alphabetical order.
to a string (stripping a trailing newline), and returns that. When EOF is
read, :exc:`EOFError` is raised. Example::
- >>> s = input('--> ')
+ >>> s = input('--> ') # doctest: +SKIP
--> Monty Python's Flying Circus
- >>> s
+ >>> s # doctest: +SKIP
"Monty Python's Flying Circus"
If the :mod:`readline` module was loaded, then :func:`input` will use it
@@ -691,6 +697,8 @@ are always available. They are listed here in alphabetical order.
*sentinel*, :exc:`StopIteration` will be raised, otherwise the value will
be returned.
+ See also :ref:`typeiter`.
+
One useful application of the second form of :func:`iter` is to read lines of
a file until a certain line is reached. The following example reads a file
until the :meth:`readline` method returns an empty string::
@@ -706,16 +714,12 @@ are always available. They are listed here in alphabetical order.
sequence (string, tuple or list) or a mapping (dictionary).
+.. _func-list:
.. function:: list([iterable])
+ :noindex:
- Return a list whose items are the same and in the same order as *iterable*'s
- items. *iterable* may be either a sequence, a container that supports
- iteration, or an iterator object. If *iterable* is already a list, a copy is
- made and returned, similar to ``iterable[:]``. For instance, ``list('abc')``
- returns ``['a', 'b', 'c']`` and ``list( (1, 2, 3) )`` returns ``[1, 2, 3]``.
- If no argument is given, returns a new empty list, ``[]``.
-
- :class:`list` is a mutable sequence type, as documented in :ref:`typesseq`.
+ Rather than being a function, :class:`list` is actually a mutable
+ sequence type, as documented in :ref:`typesseq-list` and :ref:`typesseq`.
.. function:: locals()
@@ -814,10 +818,10 @@ are always available. They are listed here in alphabetical order.
.. index::
single: file object; open() built-in function
-.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
+.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Open *file* and return a corresponding :term:`file object`. If the file
- cannot be opened, an :exc:`IOError` is raised.
+ cannot be opened, an :exc:`OSError` is raised.
*file* is either a string or bytes object giving the pathname (absolute or
relative to the current working directory) of the file to be opened or
@@ -828,17 +832,20 @@ are always available. They are listed here in alphabetical order.
*mode* is an optional string that specifies the mode in which the file is
opened. It defaults to ``'r'`` which means open for reading in text mode.
Other common values are ``'w'`` for writing (truncating the file if it
- already exists), and ``'a'`` for appending (which on *some* Unix systems,
- means that *all* writes append to the end of the file regardless of the
- current seek position). In text mode, if *encoding* is not specified the
- encoding used is platform dependent. (For reading and writing raw bytes use
- binary mode and leave *encoding* unspecified.) The available modes are:
+ already exists), ``'x'`` for exclusive creation and ``'a'`` for appending
+ (which on *some* Unix systems, means that *all* writes append to the end of
+ the file regardless of the current seek position). In text mode, if
+ *encoding* is not specified the encoding used is platform dependent:
+ ``locale.getpreferredencoding(False)`` is called to get the current locale
+ encoding. (For reading and writing raw bytes use binary mode and leave
+ *encoding* unspecified.) The available modes are:
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
``'r'`` open for reading (default)
``'w'`` open for writing, truncating the file first
+ ``'x'`` open for exclusive creation, failing if the file already exists
``'a'`` open for writing, appending to the end of the file if it exists
``'b'`` binary mode
``'t'`` text mode (default)
@@ -924,6 +931,47 @@ are always available. They are listed here in alphabetical order.
closed. If a filename is given *closefd* has no effect and must be ``True``
(the default).
+ A custom opener can be used by passing a callable as *opener*. The underlying
+ file descriptor for the file object is then obtained by calling *opener* with
+ (*file*, *flags*). *opener* must return an open file descriptor (passing
+ :mod:`os.open` as *opener* results in functionality similar to passing
+ ``None``).
+
+ The following example is an alternative implementation for opening files
+ for exclusive writing. If we did not have support for the ``'x'`` mode,
+ we could implement it with this opener::
+
+ >>> import os
+ >>> def open_exclusive(path, mode):
+ ... return os.open(path, mode | os.O_CREAT | os.O_EXCL)
+ ...
+ >>> filename = 'spam.txt'
+ >>> fp = open(filename, 'w', opener=open_exclusive)
+ >>> fp2 = open(filename, 'w', opener=open_exclusive)
+ Traceback (most recent call last):
+ ...
+ FileExistsError: [Errno 17] File exists: 'spam.txt'
+
+ This other example uses the :ref:`dir_fd` parameter of the
+ :func:`os.open` function to open a file relative to a given directory::
+
+ >>> import os
+ >>> def open_relative(dirname):
+ ... dir_fd = os.open(dirname, os.O_RDONLY)
+ ... def opener(path, flags):
+ ... return os.open(path, flags, dir_fd=dir_fd)
+ ... return opener, dir_fd
+ ...
+ >>> opener, dir_fd = open_relative('somedir')
+ >>> with open('spamspam.txt', 'w', opener=opener) as f:
+ ... print('This will be written to somedir/spamspam.txt', file=f)
+ ...
+ >>> os.close(dir_fd) # don't leak a file descriptor
+
+ .. versionchanged:: 3.3
+ The *opener* parameter was added.
+ The ``'x'`` mode was added.
+
The type of :term:`file object` returned by the :func:`open` function
depends on the mode. When :func:`open` is used to open a file in a text
mode (``'w'``, ``'r'``, ``'wt'``, ``'rt'``, etc.), it returns a subclass of
@@ -949,6 +997,11 @@ are always available. They are listed here in alphabetical order.
(where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`,
and :mod:`shutil`.
+ .. versionchanged:: 3.3
+ :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`.
+ :exc:`FileExistsError` is now raised if the file opened in exclusive
+ creation mode (``'x'``) already exists.
+
.. XXX works for bytes too, but should it?
.. function:: ord(c)
@@ -958,9 +1011,6 @@ are always available. They are listed here in alphabetical order.
point of that character. For example, ``ord('a')`` returns the integer ``97``
and ``ord('\u2020')`` returns ``8224``. This is the inverse of :func:`chr`.
- On wide Unicode builds, if the argument length is not one, a
- :exc:`TypeError` will be raised. On narrow Unicode builds, strings
- of length two are accepted when they form a UTF-16 surrogate pair.
.. function:: pow(x, y[, z])
@@ -978,7 +1028,7 @@ are always available. They are listed here in alphabetical order.
must be of integer types, and *y* must be non-negative.
-.. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout)
+.. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False)
Print *objects* to the stream *file*, separated by *sep* and followed by
*end*. *sep*, *end* and *file*, if present, must be given as keyword
@@ -991,9 +1041,12 @@ are always available. They are listed here in alphabetical order.
*end*.
The *file* argument must be an object with a ``write(string)`` method; if it
- is not present or ``None``, :data:`sys.stdout` will be used. Output buffering
- is determined by *file*. Use ``file.flush()`` to ensure, for instance,
- immediate appearance on a screen.
+ is not present or ``None``, :data:`sys.stdout` will be used. Whether output
+ is buffered is usually determined by *file*, but if the *flush* keyword
+ argument is true, the stream is forcibly flushed.
+
+ .. versionchanged:: 3.3
+ Added the *flush* keyword argument.
.. function:: property(fget=None, fset=None, fdel=None, doc=None)
@@ -1065,63 +1118,13 @@ are always available. They are listed here in alphabetical order.
``fdel`` corresponding to the constructor arguments.
-.. XXX does accept objects with __index__ too
+.. _func-range:
.. function:: range(stop)
range(start, stop[, step])
+ :noindex:
- This is a versatile function to create iterables yielding arithmetic
- progressions. It is most often used in :keyword:`for` loops. The arguments
- must be integers. If the *step* argument is omitted, it defaults to ``1``.
- If the *start* argument is omitted, it defaults to ``0``. The full form
- returns an iterable of integers ``[start, start + step, start + 2 * step,
- ...]``. If *step* is positive, the last element is the largest ``start + i *
- step`` less than *stop*; if *step* is negative, the last element is the
- smallest ``start + i * step`` greater than *stop*. *step* must not be zero
- (or else :exc:`ValueError` is raised). Example:
-
- >>> list(range(10))
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> list(range(1, 11))
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- >>> list(range(0, 30, 5))
- [0, 5, 10, 15, 20, 25]
- >>> list(range(0, 10, 3))
- [0, 3, 6, 9]
- >>> list(range(0, -10, -1))
- [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
- >>> list(range(0))
- []
- >>> list(range(1, 0))
- []
-
- Range objects implement the :class:`collections.Sequence` ABC, and provide
- features such as containment tests, element index lookup, slicing and
- support for negative indices (see :ref:`typesseq`):
-
- >>> r = range(0, 20, 2)
- >>> r
- range(0, 20, 2)
- >>> 11 in r
- False
- >>> 10 in r
- True
- >>> r.index(10)
- 5
- >>> r[5]
- 10
- >>> r[:5]
- range(0, 10, 2)
- >>> r[-1]
- 18
-
- Ranges containing absolute values larger than :data:`sys.maxsize` are permitted
- but some features (such as :func:`len`) will raise :exc:`OverflowError`.
-
- .. versionchanged:: 3.2
- Implement the Sequence ABC.
- Support slicing and negative indices.
- Test integers for membership in constant time instead of iterating
- through all items.
+ Rather than being a function, :class:`range` is actually an immutable
+ sequence type, as documented in :ref:`typesseq-range` and :ref:`typesseq`.
.. function:: repr(object)
@@ -1247,10 +1250,12 @@ are always available. They are listed here in alphabetical order.
standard type hierarchy in :ref:`types`.
+.. _func-str:
.. function:: str(object='')
str(object[, encoding[, errors]])
- Return a string version of an object, using one of the following modes:
+ Return a :ref:`string <textseq>` version of an object, using one of the
+ following modes:
If *encoding* and/or *errors* are given, :func:`str` will decode the
*object* which can either be a byte string or a character buffer using
@@ -1273,11 +1278,9 @@ are always available. They are listed here in alphabetical order.
Objects can specify what ``str(object)`` returns by defining a :meth:`__str__`
special method.
- For more information on strings see :ref:`typesseq` which describes sequence
- functionality (strings are sequences), and also the string-specific methods
- described in the :ref:`string-methods` section. To output formatted strings,
- see the :ref:`string-formatting` section. In addition see the
- :ref:`stringservices` section.
+ For more information on strings and string methods, see the :ref:`textseq`
+ section. To output formatted strings, see the :ref:`string-formatting`
+ section. In addition, see the :ref:`stringservices` section.
.. function:: sum(iterable[, start])
@@ -1337,26 +1340,24 @@ are always available. They are listed here in alphabetical order.
Accordingly, :func:`super` is undefined for implicit lookups using statements or
operators such as ``super()[name]``.
- Also note that :func:`super` is not limited to use inside methods. The two
- argument form specifies the arguments exactly and makes the appropriate
- references. The zero argument form automatically searches the stack frame
- for the class (``__class__``) and the first argument.
+ Also note that, aside from the zero argument form, :func:`super` is not
+ limited to use inside methods. The two argument form specifies the
+ arguments exactly and makes the appropriate references. The zero
+ argument form only works inside a class definition, as the compiler fills
+ in the necessary details to correctly retrieve the class being defined,
+ as well as accessing the current instance for ordinary methods.
For practical suggestions on how to design cooperative classes using
:func:`super`, see `guide to using super()
<http://rhettinger.wordpress.com/2011/05/26/super-considered-super/>`_.
+.. _func-tuple:
.. function:: tuple([iterable])
+ :noindex:
- Return a tuple whose items are the same and in the same order as *iterable*'s
- items. *iterable* may be a sequence, a container that supports iteration, or an
- iterator object. If *iterable* is already a tuple, it is returned unchanged.
- For instance, ``tuple('abc')`` returns ``('a', 'b', 'c')`` and ``tuple([1, 2,
- 3])`` returns ``(1, 2, 3)``. If no argument is given, returns a new empty
- tuple, ``()``.
-
- :class:`tuple` is an immutable sequence type, as documented in :ref:`typesseq`.
+ Rather than being a function, :class:`tuple` is actually an immutable
+ sequence type, as documented in :ref:`typesseq-tuple` and :ref:`typesseq`.
.. function:: type(object)
@@ -1385,6 +1386,8 @@ are always available. They are listed here in alphabetical order.
...
>>> X = type('X', (object,), dict(a=1))
+ See also :ref:`bltin-type-objects`.
+
.. function:: vars([object])
@@ -1441,7 +1444,7 @@ are always available. They are listed here in alphabetical order.
True
-.. function:: __import__(name, globals={}, locals={}, fromlist=[], level=-1)
+.. function:: __import__(name, globals=None, locals=None, fromlist=(), level=0)
.. index::
statement: import
@@ -1456,8 +1459,9 @@ are always available. They are listed here in alphabetical order.
replaced (by importing the :mod:`builtins` module and assigning to
``builtins.__import__``) in order to change semantics of the
:keyword:`import` statement, but nowadays it is usually simpler to use import
- hooks (see :pep:`302`). Direct use of :func:`__import__` is rare, except in
- cases where you want to import a module whose name is only known at runtime.
+ hooks (see :pep:`302`) to attain the same goals. Direct use of
+ :func:`__import__` is entirely discouraged in favor of
+ :func:`importlib.import_module`.
The function imports the module *name*, potentially using the given *globals*
and *locals* to determine how to interpret the name in a package context.
@@ -1466,13 +1470,11 @@ are always available. They are listed here in alphabetical order.
not use its *locals* argument at all, and uses its *globals* only to
determine the package context of the :keyword:`import` statement.
- *level* specifies whether to use absolute or relative imports. ``0``
- means only perform absolute imports. Positive values for *level* indicate the
- number of parent directories to search relative to the directory of the
- module calling :func:`__import__`. Negative values attempt both an implicit
- relative import and an absolute import (usage of negative values for *level*
- are strongly discouraged as future versions of Python do not support such
- values). Import statements only use values of 0 or greater.
+ *level* specifies whether to use absolute or relative imports. ``0`` (the
+ default) means only perform absolute imports. Positive values for
+ *level* indicate the number of parent directories to search relative to the
+ directory of the module calling :func:`__import__` (see :pep:`328` for the
+ details).
When the *name* variable is of the form ``package.module``, normally, the
top-level package (the name up till the first dot) is returned, *not* the
@@ -1505,6 +1507,10 @@ are always available. They are listed here in alphabetical order.
If you simply want to import a module (potentially within a package) by name,
use :func:`importlib.import_module`.
+ .. versionchanged:: 3.3
+ Negative values for *level* are no longer supported (which also changes
+ the default value to 0).
+
.. rubric:: Footnotes
diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst
index 04743d3..f5c6608 100644
--- a/Doc/library/functools.rst
+++ b/Doc/library/functools.rst
@@ -40,7 +40,7 @@ The :mod:`functools` module defines the following functions:
.. versionadded:: 3.2
-.. decorator:: lru_cache(maxsize=100)
+.. decorator:: lru_cache(maxsize=128, typed=False)
Decorator to wrap a function with a memoizing callable that saves up to the
*maxsize* most recent calls. It can save time when an expensive or I/O bound
@@ -49,8 +49,13 @@ The :mod:`functools` module defines the following functions:
Since a dictionary is used to cache results, the positional and keyword
arguments to the function must be hashable.
- If *maxsize* is set to None, the LRU feature is disabled and the cache
- can grow without bound.
+ If *maxsize* is set to None, the LRU feature is disabled and the cache can
+ grow without bound. The LRU feature performs best when *maxsize* is a
+ power-of-two.
+
+ If *typed* is set to True, function arguments of different types will be
+ cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated
+ as distinct calls with distinct results.
To help measure the effectiveness of the cache and tune the *maxsize*
parameter, the wrapped function is instrumented with a :func:`cache_info`
@@ -67,8 +72,8 @@ The :mod:`functools` module defines the following functions:
An `LRU (least recently used) cache
<http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used>`_ works
- best when more recent calls are the best predictors of upcoming calls (for
- example, the most popular articles on a news server tend to change daily).
+ best when the most recent calls are the best predictors of upcoming calls (for
+ example, the most popular articles on a news server tend to change each day).
The cache's size limit assures that the cache does not grow without bound on
long-running processes such as web servers.
@@ -111,6 +116,9 @@ The :mod:`functools` module defines the following functions:
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Added the *typed* option.
+
.. decorator:: total_ordering
Given a class defining one or more rich comparison ordering methods, this
diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst
index 0281bb7..41bda1e 100644
--- a/Doc/library/gc.rst
+++ b/Doc/library/gc.rst
@@ -153,8 +153,8 @@ The :mod:`gc` module provides the following functions:
.. versionadded:: 3.1
-The following variable is provided for read-only access (you can mutate its
-value but should not rebind it):
+The following variables are provided for read-only access (you can mutate the
+values but should not rebind them):
.. data:: garbage
@@ -183,6 +183,41 @@ value but should not rebind it):
:const:`DEBUG_UNCOLLECTABLE` is set, in addition all uncollectable objects
are printed.
+.. data:: callbacks
+
+ A list of callbacks that will be invoked by the garbage collector before and
+ after collection. The callbacks will be called with two arguments,
+ *phase* and *info*.
+
+ *phase* can be one of two values:
+
+ "start": The garbage collection is about to start.
+
+ "stop": The garbage collection has finished.
+
+ *info* is a dict providing more information for the callback. The following
+ keys are currently defined:
+
+ "generation": The oldest generation being collected.
+
+ "collected": When *phase* is "stop", the number of objects
+ successfully collected.
+
+ "uncollectable": When *phase* is "stop", the number of objects
+ that could not be collected and were put in :data:`garbage`.
+
+ Applications can add their own callbacks to this list. The primary
+ use cases are:
+
+ Gathering statistics about garbage collection, such as how often
+ various generations are collected, and how long the collection
+ takes.
+
+ Allowing applications to identify and clear their own uncollectable
+ types when they appear in :data:`garbage`.
+
+ .. versionadded:: 3.3
+
The following constants are provided for use with :func:`set_debug`:
diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst
index 0fa022c..825311b 100644
--- a/Doc/library/gettext.rst
+++ b/Doc/library/gettext.rst
@@ -185,10 +185,13 @@ class can also install themselves in the built-in namespace as the function
translation object from the cache; the actual instance data is still shared with
the cache.
- If no :file:`.mo` file is found, this function raises :exc:`IOError` if
+ If no :file:`.mo` file is found, this function raises :exc:`OSError` if
*fallback* is false (which is the default), and returns a
:class:`NullTranslations` instance if *fallback* is true.
+ .. versionchanged:: 3.3
+ :exc:`IOError` used to be raised instead of :exc:`OSError`.
+
.. function:: install(domain, localedir=None, codeset=None, names=None)
@@ -342,7 +345,7 @@ The entire set of key/value pairs are placed into a dictionary and set as the
If the :file:`.mo` file's magic number is invalid, or if other problems occur
while reading the file, instantiating a :class:`GNUTranslations` class can raise
-:exc:`IOError`.
+:exc:`OSError`.
The following methods are overridden from the base class implementation:
diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst
index 9422ea9..50d0462 100644
--- a/Doc/library/gzip.rst
+++ b/Doc/library/gzip.rst
@@ -13,9 +13,11 @@ like the GNU programs :program:`gzip` and :program:`gunzip` would.
The data compression is provided by the :mod:`zlib` module.
-The :mod:`gzip` module provides the :class:`GzipFile` class. The :class:`GzipFile`
-class reads and writes :program:`gzip`\ -format files, automatically compressing
-or decompressing the data so that it looks like an ordinary :term:`file object`.
+The :mod:`gzip` module provides the :class:`GzipFile` class, as well as the
+:func:`.open`, :func:`compress` and :func:`decompress` convenience functions.
+The :class:`GzipFile` class reads and writes :program:`gzip`\ -format files,
+automatically compressing or decompressing the data so that it looks like an
+ordinary :term:`file object`.
Note that additional file formats which can be decompressed by the
:program:`gzip` and :program:`gunzip` programs, such as those produced by
@@ -24,6 +26,34 @@ Note that additional file formats which can be decompressed by the
The module defines the following items:
+.. function:: open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)
+
+ Open a gzip-compressed file in binary or text mode, returning a :term:`file
+ object`.
+
+ The *filename* argument can be an actual filename (a :class:`str` or
+ :class:`bytes` object), or an existing file object to read from or write to.
+
+ The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``,
+ ``'w'``, or ``'wb'`` for binary mode, or ``'rt'``, ``'at'``, or ``'wt'`` for
+ text mode. The default is ``'rb'``.
+
+ The *compresslevel* argument is an integer from 1 to 9, as for the
+ :class:`GzipFile` constructor.
+
+ For binary mode, this function is equivalent to the :class:`GzipFile`
+ constructor: ``GzipFile(filename, mode, compresslevel)``. In this case, the
+ *encoding*, *errors* and *newline* arguments must not be provided.
+
+ For text mode, a :class:`GzipFile` object is created, and wrapped in an
+ :class:`io.TextIOWrapper` instance with the specified encoding, error
+ handling behavior, and line ending(s).
+
+ .. versionchanged:: 3.3
+ Added support for *filename* being a file object, support for text mode,
+ and the *encoding*, *errors* and *newline* arguments.
+
+
.. class:: GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)
Constructor for the :class:`GzipFile` class, which simulates most of the
@@ -46,9 +76,9 @@ The module defines the following items:
or ``'wb'``, depending on whether the file will be read or written. The default
is the mode of *fileobj* if discernible; otherwise, the default is ``'rb'``.
- Note that the file is always opened in binary mode; text mode is not
- supported. If you need to read a compressed file in text mode, wrap your
- :class:`GzipFile` with an :class:`io.TextIOWrapper`.
+ Note that the file is always opened in binary mode. To open a compressed file
+ in text mode, use :func:`.open` (or wrap your :class:`GzipFile` with an
+ :class:`io.TextIOWrapper`).
The *compresslevel* argument is an integer from ``1`` to ``9`` controlling the
level of compression; ``1`` is fastest and produces the least compression, and
@@ -71,7 +101,7 @@ The module defines the following items:
:class:`GzipFile` supports the :class:`io.BufferedIOBase` interface,
including iteration and the :keyword:`with` statement. Only the
- :meth:`read1` and :meth:`truncate` methods aren't implemented.
+ :meth:`truncate` method isn't implemented.
:class:`GzipFile` also provides the following method:
@@ -93,12 +123,9 @@ The module defines the following items:
.. versionchanged:: 3.2
Support for unseekable files was added.
+ .. versionchanged:: 3.3
+ The :meth:`io.BufferedIOBase.read1` method is now implemented.
-.. function:: open(filename, mode='rb', compresslevel=9)
-
- This is a shorthand for ``GzipFile(filename,`` ``mode,`` ``compresslevel)``.
- The *filename* argument is required; *mode* defaults to ``'rb'`` and
- *compresslevel* defaults to ``9``.
.. function:: compress(data, compresslevel=9)
diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst
index eff2724..0706ff4 100644
--- a/Doc/library/hmac.rst
+++ b/Doc/library/hmac.rst
@@ -38,6 +38,13 @@ An HMAC object has the following methods:
given to the constructor. It may contain non-ASCII bytes, including NUL
bytes.
+ .. warning::
+
+ When comparing the output of :meth:`digest` to an externally-supplied
+ digest during a verification routine, it is recommended to use the
+ :func:`compare_digest` function instead of the ``==`` operator
+ to reduce the vulnerability to timing attacks.
+
.. method:: HMAC.hexdigest()
@@ -45,6 +52,13 @@ An HMAC object has the following methods:
length containing only hexadecimal digits. This may be used to exchange the
value safely in email or other non-binary environments.
+ .. warning::
+
+ When comparing the output of :meth:`hexdigest` to an externally-supplied
+ digest during a verification routine, it is recommended to use the
+ :func:`compare_digest` function instead of the ``==`` operator
+ to reduce the vulnerability to timing attacks.
+
.. method:: HMAC.copy()
@@ -52,6 +66,27 @@ An HMAC object has the following methods:
compute the digests of strings that share a common initial substring.
+This module also provides the following helper function:
+
+.. function:: compare_digest(a, b)
+
+ Return ``a == b``. This function uses an approach designed to prevent
+ timing analysis by avoiding content-based short circuiting behaviour,
+ making it appropriate for cryptography. *a* and *b* must both be of the
+ same type: either :class:`str` (ASCII only, as e.g. returned by
+ :meth:`HMAC.hexdigest`), or any type that supports the buffer protocol
+ (e.g. :class:`bytes`).
+
+ .. note::
+
+ If *a* and *b* are of different lengths, or if an error occurs,
+ a timing attack could theoretically reveal information about the
+ types and lengths of *a* and *b*--but not their values.
+
+
+ .. versionadded:: 3.3
+
+
.. seealso::
Module :mod:`hashlib`
diff --git a/Doc/library/html.entities.rst b/Doc/library/html.entities.rst
index b8b4aa8..65ce817 100644
--- a/Doc/library/html.entities.rst
+++ b/Doc/library/html.entities.rst
@@ -9,11 +9,19 @@
--------------
-This module defines three dictionaries, ``name2codepoint``, ``codepoint2name``,
-and ``entitydefs``. ``entitydefs`` is used to provide the :attr:`entitydefs`
-attribute of the :class:`html.parser.HTMLParser` class. The definition provided
-here contains all the entities defined by XHTML 1.0 that can be handled using
-simple textual substitution in the Latin-1 character set (ISO-8859-1).
+This module defines four dictionaries, :data:`html5`,
+:data:`name2codepoint`, :data:`codepoint2name`, and :data:`entitydefs`.
+
+
+.. data:: html5
+
+ A dictionary that maps HTML5 named character references [#]_ to the
+ equivalent Unicode character(s), e.g. ``html5['gt;'] == '>'``.
+ Note that the trailing semicolon is included in the name (e.g. ``'gt;'``),
+ however some of the names are accepted by the standard even without the
+ semicolon: in this case the name is present with and without the ``';'``.
+
+ .. versionadded:: 3.3
.. data:: entitydefs
@@ -30,3 +38,8 @@ simple textual substitution in the Latin-1 character set (ISO-8859-1).
.. data:: codepoint2name
A dictionary that maps Unicode codepoints to HTML entity names.
+
+
+.. rubric:: Footnotes
+
+.. [#] See http://www.w3.org/TR/html5/named-character-references.html
diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst
index f3c36ec..e4154ef 100644
--- a/Doc/library/html.parser.rst
+++ b/Doc/library/html.parser.rst
@@ -16,13 +16,14 @@
This module defines a class :class:`HTMLParser` which serves as the basis for
parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML.
-.. class:: HTMLParser(strict=True)
+.. class:: HTMLParser(strict=False)
- Create a parser instance. If *strict* is ``True`` (the default), invalid
- HTML results in :exc:`~html.parser.HTMLParseError` exceptions [#]_. If
- *strict* is ``False``, the parser uses heuristics to make a best guess at
- the intention of any invalid HTML it encounters, similar to the way most
- browsers do. Using ``strict=False`` is advised.
+ Create a parser instance. If *strict* is ``False`` (the default), the parser
+ will accept and parse invalid markup. If *strict* is ``True`` the parser
+ will raise an :exc:`~html.parser.HTMLParseError` exception instead [#]_ when
+ it's not able to parse the markup.
+ The use of ``strict=True`` is discouraged and the *strict* argument is
+ deprecated.
An :class:`.HTMLParser` instance is fed HTML data and calls handler methods
when start tags, end tags, text, comments, and other markup elements are
@@ -32,7 +33,12 @@ parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML.
This parser does not check that end tags match start tags or call the end-tag
handler for elements which are closed implicitly by closing an outer element.
- .. versionchanged:: 3.2 *strict* keyword added
+ .. versionchanged:: 3.2
+ *strict* keyword added.
+
+ .. deprecated-removed:: 3.3 3.5
+ The *strict* argument and the strict mode have been deprecated.
+ The parser is now able to accept and parse invalid markup too.
An exception is defined as well:
@@ -46,6 +52,10 @@ An exception is defined as well:
detected, and :attr:`offset` is the number of characters into the line at
which the construct starts.
+ .. deprecated-removed:: 3.3 3.5
+ This exception has been deprecated because it's never raised by the parser
+ (when the default non-strict mode is used).
+
Example HTML Parser Application
-------------------------------
diff --git a/Doc/library/html.rst b/Doc/library/html.rst
index 3ad1c0c..1107ca9 100644
--- a/Doc/library/html.rst
+++ b/Doc/library/html.rst
@@ -19,3 +19,10 @@ This module defines utilities to manipulate HTML.
attribute value delimited by quotes, as in ``<a href="...">``.
.. versionadded:: 3.2
+
+--------------
+
+Submodules in the ``html`` package are:
+
+* :mod:`html.parser` -- HTML/XHTML parser with lenient parsing mode
+* :mod:`html.entities` -- HTML entity definitions
diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
index d439f24..5599dac 100644
--- a/Doc/library/http.client.rst
+++ b/Doc/library/http.client.rst
@@ -343,6 +343,15 @@ and also the following constants for integer status codes:
| :const:`UPGRADE_REQUIRED` | ``426`` | HTTP Upgrade to TLS, |
| | | :rfc:`2817`, Section 6 |
+------------------------------------------+---------+-----------------------------------------------------------------------+
+| :const:`PRECONDITION_REQUIRED` | ``428`` | Additional HTTP Status Codes, |
+| | | :rfc:`6585`, Section 3 |
++------------------------------------------+---------+-----------------------------------------------------------------------+
+| :const:`TOO_MANY_REQUESTS` | ``429`` | Additional HTTP Status Codes, |
+| | | :rfc:`6585`, Section 4 |
++------------------------------------------+---------+-----------------------------------------------------------------------+
+| :const:`REQUEST_HEADER_FIELDS_TOO_LARGE` | ``431`` | Additional HTTP Status Codes, |
+| | | :rfc:`6585`, Section 5 |
++------------------------------------------+---------+-----------------------------------------------------------------------+
| :const:`INTERNAL_SERVER_ERROR` | ``500`` | HTTP/1.1, `RFC 2616, Section |
| | | 10.5.1 |
| | | <http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1>`_ |
@@ -373,6 +382,12 @@ and also the following constants for integer status codes:
| :const:`NOT_EXTENDED` | ``510`` | An HTTP Extension Framework, |
| | | :rfc:`2774`, Section 7 |
+------------------------------------------+---------+-----------------------------------------------------------------------+
+| :const:`NETWORK_AUTHENTICATION_REQUIRED` | ``511`` | Additional HTTP Status Codes, |
+| | | :rfc:`6585`, Section 6 |
++------------------------------------------+---------+-----------------------------------------------------------------------+
+
+.. versionchanged:: 3.3
+ Added codes ``428``, ``429``, ``431`` and ``511`` from :rfc:`6585`.
.. data:: responses
@@ -506,6 +521,12 @@ statement.
Reads and returns the response body, or up to the next *amt* bytes.
+.. method:: HTTPResponse.readinto(b)
+
+ Reads up to the next len(b) bytes of the response body into the buffer *b*.
+ Returns the number of bytes read.
+
+ .. versionadded:: 3.3
.. method:: HTTPResponse.getheader(name, default=None)
diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst
index cc8f251..40f24f2 100644
--- a/Doc/library/http.cookiejar.rst
+++ b/Doc/library/http.cookiejar.rst
@@ -40,7 +40,11 @@ The module defines the following exception:
.. exception:: LoadError
Instances of :class:`FileCookieJar` raise this exception on failure to load
- cookies from a file. :exc:`LoadError` is a subclass of :exc:`IOError`.
+ cookies from a file. :exc:`LoadError` is a subclass of :exc:`OSError`.
+
+ .. versionchanged:: 3.3
+ LoadError was made a subclass of :exc:`OSError` instead of
+ :exc:`IOError`.
The following classes are provided:
@@ -257,9 +261,12 @@ contained :class:`Cookie` objects.
Arguments are as for :meth:`save`.
The named file must be in the format understood by the class, or
- :exc:`LoadError` will be raised. Also, :exc:`IOError` may be raised, for
+ :exc:`LoadError` will be raised. Also, :exc:`OSError` may be raised, for
example if the file does not exist.
+ .. versionchanged:: 3.3
+ :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`.
+
.. method:: FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)
diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst
index 5ae3fd4..646f2e8 100644
--- a/Doc/library/http.cookies.rst
+++ b/Doc/library/http.cookies.rst
@@ -22,9 +22,12 @@ many current day browsers and servers have relaxed parsing rules when comes to
Cookie handling. As a result, the parsing rules used are a bit less strict.
The character set, :data:`string.ascii_letters`, :data:`string.digits` and
-``!#$%&'*+-.^_`|~`` denote the set of valid characters allowed by this module
+``!#$%&'*+-.^_`|~:`` denote the set of valid characters allowed by this module
in Cookie name (as :attr:`~Morsel.key`).
+.. versionchanged:: 3.3
+ Allowed ':' as a valid Cookie name character.
+
.. note::
diff --git a/Doc/library/http.rst b/Doc/library/http.rst
new file mode 100644
index 0000000..a387a37
--- /dev/null
+++ b/Doc/library/http.rst
@@ -0,0 +1,11 @@
+:mod:`http` --- HTTP modules
+============================
+
+``http`` is a package that collects several modules for working with the
+HyperText Transfer Protocol:
+
+* :mod:`http.client` is a low-level HTTP protocol client; for high-level URL
+ opening use :mod:`urllib.request`
+* :mod:`http.server` contains basic HTTP server classes based on :mod:`socketserver`
+* :mod:`http.cookies` has utilities for implementing state management with cookies
+* :mod:`http.cookiejar` provides persistence of cookies
diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst
index 300e332..cbad3ed 100644
--- a/Doc/library/http.server.rst
+++ b/Doc/library/http.server.rst
@@ -179,19 +179,30 @@ of which this module provides three different variants:
.. method:: send_response(code, message=None)
- Sends a response header and logs the accepted request. The HTTP response
- line is sent, followed by *Server* and *Date* headers. The values for
- these two headers are picked up from the :meth:`version_string` and
- :meth:`date_time_string` methods, respectively.
+ Adds a response header to the headers buffer and logs the accepted
+ request. The HTTP response line is written to the internal buffer,
+ followed by *Server* and *Date* headers. The values for these two headers
+ are picked up from the :meth:`version_string` and
+ :meth:`date_time_string` methods, respectively. If the server does not
+ intend to send any other headers using the :meth:`send_header` method,
+ then :meth:`send_response` should be followed by a :meth:`end_headers`
+ call.
+
+ .. versionchanged:: 3.3
+ Headers are stored to an internal buffer and :meth:`end_headers`
+ needs to be called explicitly.
+
.. method:: send_header(keyword, value)
- Stores the HTTP header to an internal buffer which will be written to the
- output stream when :meth:`end_headers` method is invoked.
- *keyword* should specify the header keyword, with *value*
- specifying its value.
+ Adds the HTTP header to an internal buffer which will be written to the
+ output stream when either :meth:`end_headers` or :meth:`flush_headers` is
+ invoked. *keyword* should specify the header keyword, with *value*
+ specifying its value. Note that, after the send_header calls are done,
+ :meth:`end_headers` MUST BE called in order to complete the operation.
- .. versionchanged:: 3.2 Storing the headers in an internal buffer
+ .. versionchanged:: 3.2
+ Headers are stored in an internal buffer.
.. method:: send_response_only(code, message=None)
@@ -205,10 +216,19 @@ of which this module provides three different variants:
.. method:: end_headers()
- Write the buffered HTTP headers to the output stream and send a blank
- line, indicating the end of the HTTP headers in the response.
+ Adds a blank line
+ (indicating the end of the HTTP headers in the response)
+ to the headers buffer and calls :meth:`flush_headers()`.
+
+ .. versionchanged:: 3.2
+ The buffered headers are written to the output stream.
+
+ .. method:: flush_headers()
+
+ Finally send the headers to the output stream and flush the internal
+ headers buffer.
- .. versionchanged:: 3.2 Writing the buffered headers to the output stream.
+ .. versionadded:: 3.3
.. method:: log_request(code='-', size='-')
@@ -250,8 +270,11 @@ of which this module provides three different variants:
.. method:: address_string()
- Returns the client address, formatted for logging. A name lookup is
- performed on the client's IP address.
+ Returns the client address.
+
+ .. versionchanged:: 3.3
+ Previously, a name lookup was performed. To avoid name resolution
+ delays, it now always returns the IP address.
.. class:: SimpleHTTPRequestHandler(request, client_address, server)
@@ -299,7 +322,7 @@ of which this module provides three different variants:
response if the :func:`listdir` fails.
If the request was mapped to a file, it is opened and the contents are
- returned. Any :exc:`IOError` exception in opening the requested file is
+ returned. Any :exc:`OSError` exception in opening the requested file is
mapped to a ``404``, ``'File not found'`` error. Otherwise, the content
type is guessed by calling the :meth:`guess_type` method, which in turn
uses the *extensions_map* variable.
@@ -378,3 +401,9 @@ the previous example, this serves files relative to the current directory. ::
Note that CGI scripts will be run with UID of user nobody, for security
reasons. Problems with the CGI script will be translated to error 403.
+
+:class:`CGIHTTPRequestHandler` can be enabled in the command line by passing
+the ``--cgi`` option.::
+
+ python -m http.server --cgi 8000
+
diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst
index 3f45c95..fefb284 100644
--- a/Doc/library/imaplib.rst
+++ b/Doc/library/imaplib.rst
@@ -64,14 +64,21 @@ Three exceptions are defined as attributes of the :class:`IMAP4` class:
There's also a subclass for secure connections:
-.. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None)
+.. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None)
This is a subclass derived from :class:`IMAP4` that connects over an SSL
encrypted socket (to use this class you need a socket module that was compiled
with SSL support). If *host* is not specified, ``''`` (the local host) is used.
If *port* is omitted, the standard IMAP4-over-SSL port (993) is used. *keyfile*
and *certfile* are also optional - they can contain a PEM formatted private key
- and certificate chain file for the SSL connection.
+ and certificate chain file for the SSL connection. *ssl_context* parameter is a
+ :class:`ssl.SSLContext` object which allows bundling SSL configuration
+ options, certificates and private keys into a single (potentially long-lived)
+ structure. Note that the *keyfile*/*certfile* parameters are mutually exclusive with *ssl_context*,
+ a :class:`ValueError` is thrown if *keyfile*/*certfile* is provided along with *ssl_context*.
+
+ .. versionchanged:: 3.3
+ *ssl_context* parameter added.
The second subclass allows for connections created by a child process:
@@ -106,13 +113,15 @@ The following utility functions are defined:
.. function:: Time2Internaldate(date_time)
- Convert *date_time* to an IMAP4 ``INTERNALDATE`` representation. The
- return value is a string in the form: ``"DD-Mmm-YYYY HH:MM:SS
- +HHMM"`` (including double-quotes). The *date_time* argument can be a
- number (int or float) representing seconds since epoch (as returned
- by :func:`time.time`), a 9-tuple representing local time (as returned by
- :func:`time.localtime`), or a double-quoted string. In the last case, it
- is assumed to already be in the correct format.
+ Convert *date_time* to an IMAP4 ``INTERNALDATE`` representation.
+ The return value is a string in the form: ``"DD-Mmm-YYYY HH:MM:SS
+ +HHMM"`` (including double-quotes). The *date_time* argument can
+ be a number (int or float) representing seconds since epoch (as
+ returned by :func:`time.time`), a 9-tuple representing local time
+ an instance of :class:`time.struct_time` (as returned by
+ :func:`time.localtime`), an aware instance of
+ :class:`datetime.datetime`, or a double-quoted string. In the last
+ case, it is assumed to already be in the correct format.
Note that IMAP4 message numbers change as the mailbox changes; in particular,
after an ``EXPUNGE`` command performs deletions the remaining messages are
diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst
index 1345b25..5cadda9 100644
--- a/Doc/library/imp.rst
+++ b/Doc/library/imp.rst
@@ -30,6 +30,9 @@ This module provides an interface to the mechanisms used to implement the
:const:`PY_SOURCE`, :const:`PY_COMPILED`, or :const:`C_EXTENSION`, described
below.
+ .. deprecated:: 3.3
+ Use the constants defined on :mod:`importlib.machinery` instead.
+
.. function:: find_module(name[, path])
@@ -69,6 +72,9 @@ This module provides an interface to the mechanisms used to implement the
then use :func:`find_module` with the *path* argument set to ``P.__path__``.
When *P* itself has a dotted name, apply this recipe recursively.
+ .. deprecated:: 3.3
+ Use :func:`importlib.find_loader` instead.
+
.. function:: load_module(name, file, pathname, description)
@@ -90,6 +96,10 @@ This module provides an interface to the mechanisms used to implement the
it was not ``None``, even when an exception is raised. This is best done
using a :keyword:`try` ... :keyword:`finally` statement.
+ .. deprecated:: 3.3
+ Unneeded as loaders should be used to load modules and
+ :func:`find_module` is deprecated.
+
.. function:: new_module(name)
@@ -97,37 +107,6 @@ This module provides an interface to the mechanisms used to implement the
in ``sys.modules``.
-.. function:: lock_held()
-
- Return ``True`` if the import lock is currently held, else ``False``. On
- platforms without threads, always return ``False``.
-
- On platforms with threads, a thread executing an import holds an internal lock
- until the import is complete. This lock blocks other threads from doing an
- import until the original import completes, which in turn prevents other threads
- from seeing incomplete module objects constructed by the original thread while
- in the process of completing its import (and the imports, if any, triggered by
- that).
-
-
-.. function:: acquire_lock()
-
- Acquire the interpreter's import lock for the current thread. This lock should
- be used by import hooks to ensure thread-safety when importing modules.
-
- Once a thread has acquired the import lock, the same thread may acquire it
- again without blocking; the thread must release it once for each time it has
- acquired it.
-
- On platforms without threads, this function does nothing.
-
-
-.. function:: release_lock()
-
- Release the interpreter's import lock. On platforms without threads, this
- function does nothing.
-
-
.. function:: reload(module)
Reload a previously imported *module*. The argument must be a module object, so
@@ -201,14 +180,19 @@ file paths.
source *path*. For example, if *path* is ``/foo/bar/baz.py`` the return
value would be ``/foo/bar/__pycache__/baz.cpython-32.pyc`` for Python 3.2.
The ``cpython-32`` string comes from the current magic tag (see
- :func:`get_tag`). The returned path will end in ``.pyc`` when
- ``__debug__`` is True or ``.pyo`` for an optimized Python
+ :func:`get_tag`; if :attr:`sys.implementation.cache_tag` is not defined then
+ :exc:`NotImplementedError` will be raised). The returned path will end in
+ ``.pyc`` when ``__debug__`` is True or ``.pyo`` for an optimized Python
(i.e. ``__debug__`` is False). By passing in True or False for
*debug_override* you can override the system's value for ``__debug__`` for
extension selection.
*path* need not exist.
+ .. versionchanged:: 3.3
+ If :attr:`sys.implementation.cache_tag` is ``None``, then
+ :exc:`NotImplementedError` is raised.
+
.. function:: source_from_cache(path)
@@ -216,7 +200,13 @@ file paths.
file path. For example, if *path* is
``/foo/bar/__pycache__/baz.cpython-32.pyc`` the returned path would be
``/foo/bar/baz.py``. *path* need not exist, however if it does not conform
- to :pep:`3147` format, a ``ValueError`` is raised.
+ to :pep:`3147` format, a ``ValueError`` is raised. If
+ :attr:`sys.implementation.cache_tag` is not defined,
+ :exc:`NotImplementedError` is raised.
+
+ .. versionchanged:: 3.3
+ Raise :exc:`NotImplementedError` when
+ :attr:`sys.implementation.cache_tag` is not defined.
.. function:: get_tag()
@@ -224,6 +214,64 @@ file paths.
Return the :pep:`3147` magic tag string matching this version of Python's
magic number, as returned by :func:`get_magic`.
+ .. note::
+ You may use :attr:`sys.implementation.cache_tag` directly starting
+ in Python 3.3.
+
+
+The following functions help interact with the import system's internal
+locking mechanism. Locking semantics of imports are an implementation
+detail which may vary from release to release. However, Python ensures
+that circular imports work without any deadlocks.
+
+
+.. function:: lock_held()
+
+ Return ``True`` if the global import lock is currently held, else
+ ``False``. On platforms without threads, always return ``False``.
+
+ On platforms with threads, a thread executing an import first holds a
+ global import lock, then sets up a per-module lock for the rest of the
+ import. This blocks other threads from importing the same module until
+ the original import completes, preventing other threads from seeing
+ incomplete module objects constructed by the original thread. An
+ exception is made for circular imports, which by construction have to
+ expose an incomplete module object at some point.
+
+.. versionchanged:: 3.3
+ The locking scheme has changed to per-module locks for
+ the most part. A global import lock is kept for some critical tasks,
+ such as initializing the per-module locks.
+
+
+.. function:: acquire_lock()
+
+ Acquire the interpreter's global import lock for the current thread.
+ This lock should be used by import hooks to ensure thread-safety when
+ importing modules.
+
+ Once a thread has acquired the import lock, the same thread may acquire it
+ again without blocking; the thread must release it once for each time it has
+ acquired it.
+
+ On platforms without threads, this function does nothing.
+
+.. versionchanged:: 3.3
+ The locking scheme has changed to per-module locks for
+ the most part. A global import lock is kept for some critical tasks,
+ such as initializing the per-module locks.
+
+
+.. function:: release_lock()
+
+ Release the interpreter's global import lock. On platforms without
+ threads, this function does nothing.
+
+.. versionchanged:: 3.3
+ The locking scheme has changed to per-module locks for
+ the most part. A global import lock is kept for some critical tasks,
+ such as initializing the per-module locks.
+
The following constants with integer values, defined in this module, are used
to indicate the search result of :func:`find_module`.
@@ -233,31 +281,43 @@ to indicate the search result of :func:`find_module`.
The module was found as a source file.
+ .. deprecated:: 3.3
+
.. data:: PY_COMPILED
The module was found as a compiled code object file.
+ .. deprecated:: 3.3
+
.. data:: C_EXTENSION
The module was found as dynamically loadable shared library.
+ .. deprecated:: 3.3
+
.. data:: PKG_DIRECTORY
The module was found as a package directory.
+ .. deprecated:: 3.3
+
.. data:: C_BUILTIN
The module was found as a built-in module.
+ .. deprecated:: 3.3
+
.. data:: PY_FROZEN
The module was found as a frozen module.
+ .. deprecated:: 3.3
+
.. class:: NullImporter(path_string)
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index 1649063..681f1d9 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -63,7 +63,7 @@ Details on custom importers can be found in :pep:`302`.
Functions
---------
-.. function:: __import__(name, globals={}, locals={}, fromlist=list(), level=0)
+.. function:: __import__(name, globals=None, locals=None, fromlist=(), level=0)
An implementation of the built-in :func:`__import__` function.
@@ -86,6 +86,30 @@ Functions
that was imported (e.g. ``pkg.mod``), while :func:`__import__` returns the
top-level package or module (e.g. ``pkg``).
+.. function:: find_loader(name, path=None)
+
+ Find the loader for a module, optionally within the specified *path*. If the
+ module is in :attr:`sys.modules`, then ``sys.modules[name].__loader__`` is
+ returned (unless the loader would be ``None``, in which case
+ :exc:`ValueError` is raised). Otherwise a search using :attr:`sys.meta_path`
+ is done. ``None`` is returned if no loader is found.
+
+ A dotted name does not have its parent's implicitly imported. If that is
+ desired (although not nessarily required to find the loader, it will most
+ likely be needed if the loader actually is used to load the module), then
+ you will have to import the packages containing the module prior to calling
+ this function.
+
+.. function:: invalidate_caches()
+
+ Invalidate the internal caches of finders stored at
+ :data:`sys.meta_path`. If a finder implements ``invalidate_caches()`` then it
+ will be called to perform the invalidation. This function may be needed if
+ some modules are installed while your program is running and you expect the
+ program to notice the changes.
+
+ .. versionadded:: 3.3
+
:mod:`importlib.abc` -- Abstract base classes related to import
---------------------------------------------------------------
@@ -97,19 +121,90 @@ The :mod:`importlib.abc` module contains all of the core abstract base classes
used by :keyword:`import`. Some subclasses of the core abstract base classes
are also provided to help in implementing the core ABCs.
+ABC hierarchy::
+
+ object
+ +-- Finder (deprecated)
+ | +-- MetaPathFinder
+ | +-- PathEntryFinder
+ +-- Loader
+ +-- ResourceLoader --------+
+ +-- InspectLoader |
+ +-- ExecutionLoader --+
+ +-- FileLoader
+ +-- SourceLoader
+ +-- PyLoader (deprecated)
+ +-- PyPycLoader (deprecated)
+
.. class:: Finder
- An abstract base class representing a :term:`finder`.
- See :pep:`302` for the exact definition for a finder.
+ An abstract base class representing a :term:`finder`.
+
+ .. deprecated:: 3.3
+ Use :class:`MetaPathFinder` or :class:`PathEntryFinder` instead.
+
+ .. method:: find_module(fullname, path=None)
+
+ An abstact method for finding a :term:`loader` for the specified
+ module. Originally specified in :pep:`302`, this method was meant
+ for use in :data:`sys.meta_path` and in the path-based import subsystem.
+
+
+.. class:: MetaPathFinder
+
+ An abstract base class representing a :term:`meta path finder`. For
+ compatibility, this is a subclass of :class:`Finder`.
+
+ .. versionadded:: 3.3
+
+ .. method:: find_module(fullname, path)
+
+ An abstract method for finding a :term:`loader` for the specified
+ module. If this is a top-level import, *path* will be ``None``.
+ Otherwise, this is a search for a subpackage or module and *path*
+ will be the value of :attr:`__path__` from the parent
+ package. If a loader cannot be found, ``None`` is returned.
+
+ .. method:: invalidate_caches()
+
+ An optional method which, when called, should invalidate any internal
+ cache used by the finder. Used by :func:`importlib.invalidate_caches`
+ when invalidating the caches of all finders on :data:`sys.meta_path`.
+
- .. method:: find_module(fullname, path=None)
+.. class:: PathEntryFinder
- An abstract method for finding a :term:`loader` for the specified
- module. If the :term:`finder` is found on :data:`sys.meta_path` and the
- module to be searched for is a subpackage or module then *path* will
- be the value of :attr:`__path__` from the parent package. If a loader
- cannot be found, ``None`` is returned.
+ An abstract base class representing a :term:`path entry finder`. Though
+ it bears some similarities to :class:`MetaPathFinder`, ``PathEntryFinder``
+ is meant for use only within the path-based import subsystem provided
+ by :class:`PathFinder`. This ABC is a subclass of :class:`Finder` for
+ compatibility.
+
+ .. versionadded:: 3.3
+
+ .. method:: find_loader(fullname):
+
+ An abstract method for finding a :term:`loader` for the specified
+ module. Returns a 2-tuple of ``(loader, portion)`` where ``portion``
+ is a sequence of file system locations contributing to part of a namespace
+ package. The loader may be ``None`` while specifying ``portion`` to
+ signify the contribution of the file system locations to a namespace
+ package. An empty list can be used for ``portion`` to signify the loader
+ is not part of a package. If ``loader`` is ``None`` and ``portion`` is
+ the empty list then no loader or location for a namespace package were
+ found (i.e. failure to find anything for the module).
+
+ .. method:: find_module(fullname):
+
+ A concrete implementation of :meth:`Finder.find_module` which is
+ equivalent to ``self.find_loader(fullname)[0]``.
+
+ .. method:: invalidate_caches()
+
+ An optional method which, when called, should invalidate any internal
+ cache used by the finder. Used by :meth:`PathFinder.invalidate_caches`
+ when invalidating the caches of all cached finders.
.. class:: Loader
@@ -159,6 +254,13 @@ are also provided to help in implementing the core ABCs.
(This is not set by the built-in import machinery,
but it should be set whenever a :term:`loader` is used.)
+ .. method:: module_repr(module)
+
+ An abstract method which when implemented calculates and returns the
+ given module's repr, as a string.
+
+ .. versionadded: 3.3
+
.. class:: ResourceLoader
@@ -224,6 +326,38 @@ are also provided to help in implementing the core ABCs.
module.
+.. class:: FileLoader(fullname, path)
+
+ An abstract base class which inherits from :class:`ResourceLoader` and
+ :class:`ExecutionLoader`, providing concreate implementations of
+ :meth:`ResourceLoader.get_data` and :meth:`ExecutionLoader.get_filename`.
+
+ The *fullname* argument is a fully resolved name of the module the loader is
+ to handle. The *path* argument is the path to the file for the module.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: name
+
+ The name of the module the loader can handle.
+
+ .. attribute:: path
+
+ Path to the file of the module.
+
+ .. method:: load_module(fullname)
+
+ Calls super's ``load_module()``.
+
+ .. method:: get_filename(fullname)
+
+ Returns :attr:`path`.
+
+ .. method:: get_data(path)
+
+ Returns the open, binary file for *path*.
+
+
.. class:: SourceLoader
An abstract base class for implementing source (and optionally bytecode)
@@ -243,12 +377,31 @@ are also provided to help in implementing the core ABCs.
optimization to speed up loading by removing the parsing step of Python's
compiler, and so no bytecode-specific API is exposed.
- .. method:: path_mtime(self, path)
+ .. method:: path_stats(path)
+
+ Optional abstract method which returns a :class:`dict` containing
+ metadata about the specifed path. Supported dictionary keys are:
+
+ - ``'mtime'`` (mandatory): an integer or floating-point number
+ representing the modification time of the source code;
+ - ``'size'`` (optional): the size in bytes of the source code.
+
+ Any other keys in the dictionary are ignored, to allow for future
+ extensions.
+
+ .. versionadded:: 3.3
+
+ .. method:: path_mtime(path)
Optional abstract method which returns the modification time for the
specified path.
- .. method:: set_data(self, path, data)
+ .. deprecated:: 3.3
+ This method is deprecated in favour of :meth:`path_stats`. You don't
+ have to implement it, but it is still available for compatibility
+ purposes.
+
+ .. method:: set_data(path, data)
Optional abstract method which writes the specified bytes to a file
path. Any intermediate directories which do not exist are to be created
@@ -257,23 +410,25 @@ are also provided to help in implementing the core ABCs.
When writing to the path fails because the path is read-only
(:attr:`errno.EACCES`), do not propagate the exception.
- .. method:: get_code(self, fullname)
+ .. method:: get_code(fullname)
Concrete implementation of :meth:`InspectLoader.get_code`.
- .. method:: load_module(self, fullname)
+ .. method:: load_module(fullname)
Concrete implementation of :meth:`Loader.load_module`.
- .. method:: get_source(self, fullname)
+ .. method:: get_source(fullname)
Concrete implementation of :meth:`InspectLoader.get_source`.
- .. method:: is_package(self, fullname)
+ .. method:: is_package(fullname)
Concrete implementation of :meth:`InspectLoader.is_package`. A module
- is determined to be a package if its file path is a file named
- ``__init__`` when the file extension is removed.
+ is determined to be a package if its file path (as provided by
+ :meth:`ExecutionLoader.get_filename`) is a file named
+ ``__init__`` when the file extension is removed **and** the module name
+ itself does not end in ``__init__``.
.. class:: PyLoader
@@ -374,6 +529,10 @@ are also provided to help in implementing the core ABCs.
:class:`PyLoader`. Do note that this solution will not support
sourceless/bytecode-only loading; only source *and* bytecode loading.
+ .. versionchanged:: 3.3
+ Updated to parse (but not use) the new source size field in bytecode
+ files when reading and to write out the field properly when writing.
+
.. method:: source_mtime(fullname)
An abstract method which returns the modification time for the source
@@ -417,12 +576,59 @@ are also provided to help in implementing the core ABCs.
This module contains the various objects that help :keyword:`import`
find and load modules.
+.. attribute:: SOURCE_SUFFIXES
+
+ A list of strings representing the recognized file suffixes for source
+ modules.
+
+ .. versionadded:: 3.3
+
+.. attribute:: DEBUG_BYTECODE_SUFFIXES
+
+ A list of strings representing the file suffixes for non-optimized bytecode
+ modules.
+
+ .. versionadded:: 3.3
+
+.. attribute:: OPTIMIZED_BYTECODE_SUFFIXES
+
+ A list of strings representing the file suffixes for optimized bytecode
+ modules.
+
+ .. versionadded:: 3.3
+
+.. attribute:: BYTECODE_SUFFIXES
+
+ A list of strings representing the recognized file suffixes for bytecode
+ modules. Set to either :attr:`DEBUG_BYTECODE_SUFFIXES` or
+ :attr:`OPTIMIZED_BYTECODE_SUFFIXES` based on whether ``__debug__`` is true.
+
+ .. versionadded:: 3.3
+
+.. attribute:: EXTENSION_SUFFIXES
+
+ A list of strings representing the recognized file suffixes for
+ extension modules.
+
+ .. versionadded:: 3.3
+
+.. function:: all_suffixes()
+
+ Returns a combined list of strings representing all file suffixes for
+ modules recognized by the standard import machinery. This is a
+ helper for code which simply needs to know if a filesystem path
+ potentially refers to a module without needing any details on the kind
+ of module (for example, :func:`inspect.getmodulename`)
+
+ .. versionadded:: 3.3
+
+
.. class:: BuiltinImporter
An :term:`importer` for built-in modules. All known built-in modules are
listed in :data:`sys.builtin_module_names`. This class implements the
- :class:`importlib.abc.Finder` and :class:`importlib.abc.InspectLoader`
- ABCs.
+ :class:`importlib.abc.MetaPathFinder` and
+ :class:`importlib.abc.InspectLoader` ABCs.
Only class methods are defined by this class to alleviate the need for
instantiation.
@@ -431,48 +637,223 @@ find and load modules.
.. class:: FrozenImporter
An :term:`importer` for frozen modules. This class implements the
- :class:`importlib.abc.Finder` and :class:`importlib.abc.InspectLoader`
- ABCs.
+ :class:`importlib.abc.MetaPathFinder` and
+ :class:`importlib.abc.InspectLoader` ABCs.
Only class methods are defined by this class to alleviate the need for
instantiation.
+.. class:: WindowsRegistryFinder
+
+ :term:`Finder` for modules declared in the Windows registry. This class
+ implements the :class:`importlib.abc.Finder` ABC.
+
+ Only class methods are defined by this class to alleviate the need for
+ instantiation.
+
+ .. versionadded:: 3.3
+
+
.. class:: PathFinder
- :term:`Finder` for :data:`sys.path`. This class implements the
- :class:`importlib.abc.Finder` ABC.
+ A :term:`Finder` for :data:`sys.path` and package ``__path__`` attributes.
+ This class implements the :class:`importlib.abc.MetaPathFinder` ABC.
- This class does not perfectly mirror the semantics of :keyword:`import` in
- terms of :data:`sys.path`. No implicit path hooks are assumed for
- simplification of the class and its semantics.
+ Only class methods are defined by this class to alleviate the need for
+ instantiation.
- Only class methods are defined by this class to alleviate the need for
- instantiation.
+ .. classmethod:: find_module(fullname, path=None)
+
+ Class method that attempts to find a :term:`loader` for the module
+ specified by *fullname* on :data:`sys.path` or, if defined, on
+ *path*. For each path entry that is searched,
+ :data:`sys.path_importer_cache` is checked. If a non-false object is
+ found then it is used as the :term:`finder` to look for the module
+ being searched for. If no entry is found in
+ :data:`sys.path_importer_cache`, then :data:`sys.path_hooks` is
+ searched for a finder for the path entry and, if found, is stored in
+ :data:`sys.path_importer_cache` along with being queried about the
+ module. If no finder is ever found then ``None`` is both stored in
+ the cache and returned.
+
+ .. classmethod:: invalidate_caches()
+
+ Calls :meth:`importlib.abc.PathEntryFinder.invalidate_caches` on all
+ finders stored in :attr:`sys.path_importer_cache`.
+
+
+.. class:: FileFinder(path, \*loader_details)
+
+ A concrete implementation of :class:`importlib.abc.PathEntryFinder` which
+ caches results from the file system.
+
+ The *path* argument is the directory for which the finder is in charge of
+ searching.
+
+ The *loader_details* argument is a variable number of 2-item tuples each
+ containing a loader and a sequence of file suffixes the loader recognizes.
+
+ The finder will cache the directory contents as necessary, making stat calls
+ for each module search to verify the cache is not outdated. Because cache
+ staleness relies upon the granularity of the operating system's state
+ information of the file system, there is a potential race condition of
+ searching for a module, creating a new file, and then searching for the
+ module the new file represents. If the operations happen fast enough to fit
+ within the granularity of stat calls, then the module search will fail. To
+ prevent this from happening, when you create a module dynamically, make sure
+ to call :func:`importlib.invalidate_caches`.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: path
+
+ The path the finder will search in.
+
+ .. method:: find_module(fullname)
+
+ Attempt to find the loader to handle *fullname* within :attr:`path`.
+
+ .. method:: invalidate_caches()
+
+ Clear out the internal cache.
+
+ .. classmethod:: path_hook(\*loader_details)
+
+ A class method which returns a closure for use on :attr:`sys.path_hooks`.
+ An instance of :class:`FileFinder` is returned by the closure using the
+ path argument given to the closure directly and *loader_details*
+ indirectly.
+
+ If the argument to the closure is not an existing directory,
+ :exc:`ImportError` is raised.
+
+
+.. class:: SourceFileLoader(fullname, path)
+
+ A concrete implementation of :class:`importlib.abc.SourceLoader` by
+ subclassing :class:`importlib.abc.FileLoader` and providing some concrete
+ implementations of other methods.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: name
+
+ The name of the module that this loader will handle.
+
+ .. attribute:: path
+
+ The path to the source file.
+
+ .. method:: is_package(fullname)
+
+ Return true if :attr:`path` appears to be for a package.
+
+ .. method:: path_stats(path)
+
+ Concrete implementation of :meth:`importlib.abc.SourceLoader.path_stats`.
+
+ .. method:: set_data(path, data)
+
+ Concrete implementation of :meth:`importlib.abc.SourceLoader.set_data`.
+
+
+.. class:: SourcelessFileLoader(fullname, path)
- .. classmethod:: find_module(fullname, path=None)
+ A concrete implementation of :class:`importlib.abc.FileLoader` which can
+ import bytecode files (i.e. no source code files exist).
- Class method that attempts to find a :term:`loader` for the module
- specified by *fullname* on :data:`sys.path` or, if defined, on
- *path*. For each path entry that is searched,
- :data:`sys.path_importer_cache` is checked. If an non-false object is
- found then it is used as the :term:`finder` to look for the module
- being searched for. If no entry is found in
- :data:`sys.path_importer_cache`, then :data:`sys.path_hooks` is
- searched for a finder for the path entry and, if found, is stored in
- :data:`sys.path_importer_cache` along with being queried about the
- module. If no finder is ever found then ``None`` is returned.
+ Please note that direct use of bytecode files (and thus not source code
+ files) inhibits your modules from being usable by all Python
+ implementations or new versions of Python which change the bytecode
+ format.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: name
+
+ The name of the module the loader will handle.
+
+ .. attribute:: path
+
+ The path to the bytecode file.
+
+ .. method:: is_package(fullname)
+
+ Determines if the module is a package based on :attr:`path`.
+
+ .. method:: get_code(fullname)
+
+ Returns the code object for :attr:`name` created from :attr:`path`.
+
+ .. method:: get_source(fullname)
+
+ Returns ``None`` as bytecode files have no source when this loader is
+ used.
+
+
+.. class:: ExtensionFileLoader(fullname, path)
+
+ A concrete implementation of :class:`importlib.abc.InspectLoader` for
+ extension modules.
+
+ The *fullname* argument specifies the name of the module the loader is to
+ support. The *path* argument is the path to the extension module's file.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: name
+
+ Name of the module the loader supports.
+
+ .. attribute:: path
+
+ Path to the extension module.
+
+ .. method:: load_module(fullname)
+
+ Loads the extension module if and only if *fullname* is the same as
+ :attr:`name` or is ``None``.
+
+ .. method:: is_package(fullname)
+
+ Returns ``True`` if the file path points to a package's ``__init__``
+ module based on :attr:`EXTENSION_SUFFIXES`.
+
+ .. method:: get_code(fullname)
+
+ Returns ``None`` as extension modules lack a code object.
+
+ .. method:: get_source(fullname)
+
+ Returns ``None`` as extension modules do not have source code.
:mod:`importlib.util` -- Utility code for importers
---------------------------------------------------
.. module:: importlib.util
- :synopsis: Importers and path hooks
+ :synopsis: Utility code for importers
This module contains the various objects that help in the construction of
an :term:`importer`.
+.. function:: resolve_name(name, package)
+
+ Resolve a relative module name to an absolute one.
+
+ If **name** has no leading dots, then **name** is simply returned. This
+ allows for usage such as
+ ``importlib.util.resolve_name('sys', __package__)`` without doing a
+ check to see if the **package** argument is needed.
+
+ :exc:`ValueError` is raised if **name** is a relative module name but
+ package is a false value (e.g. ``None`` or the empty string).
+ :exc:`ValueError` is also raised a relative name would escape its containing
+ package (e.g. requesting ``..bacon`` from within the ``spam`` package).
+
+ .. versionadded:: 3.3
+
.. decorator:: module_for_loader
A :term:`decorator` for a :term:`loader` method,
@@ -481,22 +862,30 @@ an :term:`importer`.
signature taking two positional arguments
(e.g. ``load_module(self, module)``) for which the second argument
will be the module **object** to be used by the loader.
- Note that the decorator
- will not work on static methods because of the assumption of two
- arguments.
+ Note that the decorator will not work on static methods because of the
+ assumption of two arguments.
The decorated method will take in the **name** of the module to be loaded
as expected for a :term:`loader`. If the module is not found in
:data:`sys.modules` then a new one is constructed with its
- :attr:`__name__` attribute set. Otherwise the module found in
- :data:`sys.modules` will be passed into the method. If an
- exception is raised by the decorated method and a module was added to
+ :attr:`__name__` attribute set to **name**, :attr:`__loader__` set to
+ **self**, and :attr:`__package__` set if
+ :meth:`importlib.abc.InspectLoader.is_package` is defined for **self** and
+ does not raise :exc:`ImportError` for **name**. If a new module is not
+ needed then the module found in :data:`sys.modules` will be passed into the
+ method.
+
+ If an exception is raised by the decorated method and a module was added to
:data:`sys.modules` it will be removed to prevent a partially initialized
module from being in left in :data:`sys.modules`. If the module was already
in :data:`sys.modules` then it is left alone.
Use of this decorator handles all the details of which module object a
- loader should initialize as specified by :pep:`302`.
+ loader should initialize as specified by :pep:`302` as best as possible.
+
+ .. versionchanged:: 3.3
+ :attr:`__loader__` and :attr:`__package__` are automatically set
+ (when possible).
.. decorator:: set_loader
@@ -504,7 +893,13 @@ an :term:`importer`.
to set the :attr:`__loader__`
attribute on loaded modules. If the attribute is already set the decorator
does nothing. It is assumed that the first positional argument to the
- wrapped method is what :attr:`__loader__` should be set to.
+ wrapped method (i.e. ``self``) is what :attr:`__loader__` should be set to.
+
+ .. note::
+
+ It is recommended that :func:`module_for_loader` be used over this
+ decorator as it subsumes this functionality.
+
.. decorator:: set_package
@@ -515,8 +910,12 @@ an :term:`importer`.
set on and not the module found in :data:`sys.modules`.
Reliance on this decorator is discouraged when it is possible to set
- :attr:`__package__` before the execution of the code is possible. By
- setting it before the code for the module is executed it allows the
- attribute to be used at the global level of the module during
+ :attr:`__package__` before importing. By
+ setting it beforehand the code for the module is executed with the
+ attribute set and thus can be used by global level code during
initialization.
+ .. note::
+
+ It is recommended that :func:`module_for_loader` be used over this
+ decorator as it subsumes this functionality.
diff --git a/Doc/library/index.rst b/Doc/library/index.rst
index b6a5559..1b25c6e 100644
--- a/Doc/library/index.rst
+++ b/Doc/library/index.rst
@@ -43,7 +43,8 @@ the `Python Package Index <http://pypi.python.org/pypi>`_.
stdtypes.rst
exceptions.rst
- strings.rst
+ text.rst
+ binary.rst
datatypes.rst
numeric.rst
functional.rst
@@ -53,7 +54,7 @@ the `Python Package Index <http://pypi.python.org/pypi>`_.
fileformats.rst
crypto.rst
allos.rst
- someos.rst
+ concurrency.rst
ipc.rst
netdata.rst
markup.rst
diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index d127ce8..01bbce8 100644
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -190,13 +190,26 @@ attributes:
compared to the constants defined in the :mod:`imp` module; see the
documentation for that module for more information on module types.
+ .. deprecated:: 3.3
+ You may check the file path's suffix against the supported suffixes
+ listed in :mod:`importlib.machinery` to infer the same information.
+
.. function:: getmodulename(path)
Return the name of the module named by the file *path*, without including the
- names of enclosing packages. This uses the same algorithm as the interpreter
- uses when searching for modules. If the name cannot be matched according to the
- interpreter's rules, ``None`` is returned.
+ names of enclosing packages. The file extension is checked against all of
+ the entries in :func:`importlib.machinery.all_suffixes`. If it matches,
+ the final path component is returned with the extension removed.
+ Otherwise, ``None`` is returned.
+
+ Note that this function *only* returns a meaningful name for actual
+ Python modules - paths that potentially refer to Python packages will
+ still return ``None``.
+
+ .. versionchanged:: 3.3
+ This function is now based directly on :mod:`importlib` rather than the
+ deprecated :func:`getmoduleinfo`.
.. function:: ismodule(object)
@@ -355,17 +368,25 @@ Retrieving source code
argument may be a module, class, method, function, traceback, frame, or code
object. The source code is returned as a list of the lines corresponding to the
object and the line number indicates where in the original source file the first
- line of code was found. An :exc:`IOError` is raised if the source code cannot
+ line of code was found. An :exc:`OSError` is raised if the source code cannot
be retrieved.
+ .. versionchanged:: 3.3
+ :exc:`OSError` is raised instead of :exc:`IOError`, now an alias of the
+ former.
+
.. function:: getsource(object)
Return the text of the source code for an object. The argument may be a module,
class, method, function, traceback, frame, or code object. The source code is
- returned as a single string. An :exc:`IOError` is raised if the source code
+ returned as a single string. An :exc:`OSError` is raised if the source code
cannot be retrieved.
+ .. versionchanged:: 3.3
+ :exc:`OSError` is raised instead of :exc:`IOError`, now an alias of the
+ former.
+
.. function:: cleandoc(doc)
@@ -374,6 +395,264 @@ Retrieving source code
onwards is removed. Also, all tabs are expanded to spaces.
+.. _inspect-signature-object:
+
+Introspecting callables with the Signature object
+-------------------------------------------------
+
+.. versionadded:: 3.3
+
+The Signature object represents the call signature of a callable object and its
+return annotation. To retrieve a Signature object, use the :func:`signature`
+function.
+
+.. function:: signature(callable)
+
+ Return a :class:`Signature` object for the given ``callable``::
+
+ >>> from inspect import signature
+ >>> def foo(a, *, b:int, **kwargs):
+ ... pass
+
+ >>> sig = signature(foo)
+
+ >>> str(sig)
+ '(a, *, b:int, **kwargs)'
+
+ >>> str(sig.parameters['b'])
+ 'b:int'
+
+ >>> sig.parameters['b'].annotation
+ <class 'int'>
+
+ Accepts a wide range of python callables, from plain functions and classes to
+ :func:`functools.partial` objects.
+
+ .. note::
+
+ Some callables may not be introspectable in certain implementations of
+ Python. For example, in CPython, built-in functions defined in C provide
+ no metadata about their arguments.
+
+
+.. class:: Signature
+
+ A Signature object represents the call signature of a function and its return
+ annotation. For each parameter accepted by the function it stores a
+ :class:`Parameter` object in its :attr:`parameters` collection.
+
+ Signature objects are *immutable*. Use :meth:`Signature.replace` to make a
+ modified copy.
+
+ .. attribute:: Signature.empty
+
+ A special class-level marker to specify absence of a return annotation.
+
+ .. attribute:: Signature.parameters
+
+ An ordered mapping of parameters' names to the corresponding
+ :class:`Parameter` objects.
+
+ .. attribute:: Signature.return_annotation
+
+ The "return" annotation for the callable. If the callable has no "return"
+ annotation, this attribute is set to :attr:`Signature.empty`.
+
+ .. method:: Signature.bind(*args, **kwargs)
+
+ Create a mapping from positional and keyword arguments to parameters.
+ Returns :class:`BoundArguments` if ``*args`` and ``**kwargs`` match the
+ signature, or raises a :exc:`TypeError`.
+
+ .. method:: Signature.bind_partial(*args, **kwargs)
+
+ Works the same way as :meth:`Signature.bind`, but allows the omission of
+ some required arguments (mimics :func:`functools.partial` behavior.)
+ Returns :class:`BoundArguments`, or raises a :exc:`TypeError` if the
+ passed arguments do not match the signature.
+
+ .. method:: Signature.replace(*[, parameters][, return_annotation])
+
+ Create a new Signature instance based on the instance replace was invoked
+ on. It is possible to pass different ``parameters`` and/or
+ ``return_annotation`` to override the corresponding properties of the base
+ signature. To remove return_annotation from the copied Signature, pass in
+ :attr:`Signature.empty`.
+
+ ::
+
+ >>> def test(a, b):
+ ... pass
+ >>> sig = signature(test)
+ >>> new_sig = sig.replace(return_annotation="new return anno")
+ >>> str(new_sig)
+ "(a, b) -> 'new return anno'"
+
+
+.. class:: Parameter
+
+ Parameter objects are *immutable*. Instead of modifying a Parameter object,
+ you can use :meth:`Parameter.replace` to create a modified copy.
+
+ .. attribute:: Parameter.empty
+
+ A special class-level marker to specify absence of default values and
+ annotations.
+
+ .. attribute:: Parameter.name
+
+ The name of the parameter as a string. Must be a valid python identifier
+ name (with the exception of ``POSITIONAL_ONLY`` parameters, which can have
+ it set to ``None``).
+
+ .. attribute:: Parameter.default
+
+ The default value for the parameter. If the parameter has no default
+ value, this attribute is set to :attr:`Parameter.empty`.
+
+ .. attribute:: Parameter.annotation
+
+ The annotation for the parameter. If the parameter has no annotation,
+ this attribute is set to :attr:`Parameter.empty`.
+
+ .. attribute:: Parameter.kind
+
+ Describes how argument values are bound to the parameter. Possible values
+ (accessible via :class:`Parameter`, like ``Parameter.KEYWORD_ONLY``):
+
+ +------------------------+----------------------------------------------+
+ | Name | Meaning |
+ +========================+==============================================+
+ | *POSITIONAL_ONLY* | Value must be supplied as a positional |
+ | | argument. |
+ | | |
+ | | Python has no explicit syntax for defining |
+ | | positional-only parameters, but many built-in|
+ | | and extension module functions (especially |
+ | | those that accept only one or two parameters)|
+ | | accept them. |
+ +------------------------+----------------------------------------------+
+ | *POSITIONAL_OR_KEYWORD*| Value may be supplied as either a keyword or |
+ | | positional argument (this is the standard |
+ | | binding behaviour for functions implemented |
+ | | in Python.) |
+ +------------------------+----------------------------------------------+
+ | *VAR_POSITIONAL* | A tuple of positional arguments that aren't |
+ | | bound to any other parameter. This |
+ | | corresponds to a ``*args`` parameter in a |
+ | | Python function definition. |
+ +------------------------+----------------------------------------------+
+ | *KEYWORD_ONLY* | Value must be supplied as a keyword argument.|
+ | | Keyword only parameters are those which |
+ | | appear after a ``*`` or ``*args`` entry in a |
+ | | Python function definition. |
+ +------------------------+----------------------------------------------+
+ | *VAR_KEYWORD* | A dict of keyword arguments that aren't bound|
+ | | to any other parameter. This corresponds to a|
+ | | ``**kwargs`` parameter in a Python function |
+ | | definition. |
+ +------------------------+----------------------------------------------+
+
+ Example: print all keyword-only arguments without default values::
+
+ >>> def foo(a, b, *, c, d=10):
+ ... pass
+
+ >>> sig = signature(foo)
+ >>> for param in sig.parameters.values():
+ ... if (param.kind == param.KEYWORD_ONLY and
+ ... param.default is param.empty):
+ ... print('Parameter:', param)
+ Parameter: c
+
+ .. method:: Parameter.replace(*[, name][, kind][, default][, annotation])
+
+ Create a new Parameter instance based on the instance replaced was invoked
+ on. To override a :class:`Parameter` attribute, pass the corresponding
+ argument. To remove a default value or/and an annotation from a
+ Parameter, pass :attr:`Parameter.empty`.
+
+ ::
+
+ >>> from inspect import Parameter
+ >>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
+ >>> str(param)
+ 'foo=42'
+
+ >>> str(param.replace()) # Will create a shallow copy of 'param'
+ 'foo=42'
+
+ >>> str(param.replace(default=Parameter.empty, annotation='spam'))
+ "foo:'spam'"
+
+
+.. class:: BoundArguments
+
+ Result of a :meth:`Signature.bind` or :meth:`Signature.bind_partial` call.
+ Holds the mapping of arguments to the function's parameters.
+
+ .. attribute:: BoundArguments.arguments
+
+ An ordered, mutable mapping (:class:`collections.OrderedDict`) of
+ parameters' names to arguments' values. Contains only explicitly bound
+ arguments. Changes in :attr:`arguments` will reflect in :attr:`args` and
+ :attr:`kwargs`.
+
+ Should be used in conjunction with :attr:`Signature.parameters` for any
+ argument processing purposes.
+
+ .. note::
+
+ Arguments for which :meth:`Signature.bind` or
+ :meth:`Signature.bind_partial` relied on a default value are skipped.
+ However, if needed, it is easy to include them.
+
+ ::
+
+ >>> def foo(a, b=10):
+ ... pass
+
+ >>> sig = signature(foo)
+ >>> ba = sig.bind(5)
+
+ >>> ba.args, ba.kwargs
+ ((5,), {})
+
+ >>> for param in sig.parameters.values():
+ ... if param.name not in ba.arguments:
+ ... ba.arguments[param.name] = param.default
+
+ >>> ba.args, ba.kwargs
+ ((5, 10), {})
+
+
+ .. attribute:: BoundArguments.args
+
+ A tuple of positional arguments values. Dynamically computed from the
+ :attr:`arguments` attribute.
+
+ .. attribute:: BoundArguments.kwargs
+
+ A dict of keyword arguments values. Dynamically computed from the
+ :attr:`arguments` attribute.
+
+ The :attr:`args` and :attr:`kwargs` properties can be used to invoke
+ functions::
+
+ def test(a, *, b):
+ ...
+
+ sig = signature(test)
+ ba = sig.bind(10, b=20)
+ test(*ba.args, **ba.kwargs)
+
+
+.. seealso::
+
+ :pep:`362` - Function Signature Object.
+ The detailed specification, implementation details and examples.
+
+
.. _inspect-classes-functions:
Classes and functions
@@ -396,9 +675,9 @@ Classes and functions
:term:`named tuple` ``ArgSpec(args, varargs, keywords, defaults)`` is
returned. *args* is a list of the argument names. *varargs* and *keywords*
are the names of the ``*`` and ``**`` arguments or ``None``. *defaults* is a
- tuple of default argument values or None if there are no default arguments;
- if this tuple has *n* elements, they correspond to the last *n* elements
- listed in *args*.
+ tuple of default argument values or ``None`` if there are no default
+ arguments; if this tuple has *n* elements, they correspond to the last
+ *n* elements listed in *args*.
.. deprecated:: 3.0
Use :func:`getfullargspec` instead, which provides information about
@@ -414,14 +693,19 @@ Classes and functions
annotations)``
*args* is a list of the argument names. *varargs* and *varkw* are the names
- of the ``*`` and ``**`` arguments or ``None``. *defaults* is an n-tuple of
- the default values of the last n arguments. *kwonlyargs* is a list of
+ of the ``*`` and ``**`` arguments or ``None``. *defaults* is an *n*-tuple
+ of the default values of the last *n* arguments, or ``None`` if there are no
+ default arguments. *kwonlyargs* is a list of
keyword-only argument names. *kwonlydefaults* is a dictionary mapping names
from kwonlyargs to defaults. *annotations* is a dictionary mapping argument
names to annotations.
The first four items in the tuple correspond to :func:`getargspec`.
+ .. note::
+ Consider using the new :ref:`Signature Object <inspect-signature-object>`
+ interface, which provides a better way of introspecting functions.
+
.. function:: getargvalues(frame)
@@ -432,11 +716,23 @@ Classes and functions
locals dictionary of the given frame.
-.. function:: formatargspec(args[, varargs, varkw, defaults, formatarg, formatvarargs, formatvarkw, formatvalue])
+.. function:: formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]])
- Format a pretty argument spec from the four values returned by
- :func:`getargspec`. The format\* arguments are the corresponding optional
- formatting functions that are called to turn names and values into strings.
+ Format a pretty argument spec from the values returned by
+ :func:`getargspec` or :func:`getfullargspec`.
+
+ The first seven arguments are (``args``, ``varargs``, ``varkw``,
+ ``defaults``, ``kwonlyargs``, ``kwonlydefaults``, ``annotations``). The
+ other five arguments are the corresponding optional formatting functions
+ that are called to turn names and values into strings. The last argument
+ is an optional function to format the sequence of arguments. For example::
+
+ >>> from inspect import formatargspec, getfullargspec
+ >>> def f(a: int, b: float):
+ ... pass
+ ...
+ >>> formatargspec(*getfullargspec(f))
+ '(a: int, b: float)'
.. function:: formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])
@@ -468,17 +764,36 @@ Classes and functions
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
... pass
- >>> getcallargs(f, 1, 2, 3)
- {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
- >>> getcallargs(f, a=2, x=4)
- {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
+ >>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
+ True
+ >>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
+ True
>>> getcallargs(f)
Traceback (most recent call last):
...
- TypeError: f() takes at least 1 argument (0 given)
+ TypeError: f() missing 1 required positional argument: 'a'
.. versionadded:: 3.2
+ .. note::
+ Consider using the new :meth:`Signature.bind` instead.
+
+
+.. function:: getclosurevars(func)
+
+ Get the mapping of external name references in a Python function or
+ method *func* to their current values. A
+ :term:`named tuple` ``ClosureVars(nonlocals, globals, builtins, unbound)``
+ is returned. *nonlocals* maps referenced names to lexical closure
+ variables, *globals* to the function's module globals and *builtins* to
+ the builtins visible from the function body. *unbound* is the set of names
+ referenced in the function that could not be resolved at all given the
+ current module globals and builtins.
+
+ :exc:`TypeError` is raised if *func* is not a Python function or method.
+
+ .. versionadded:: 3.3
+
.. _inspect-stack:
@@ -643,3 +958,27 @@ generator to be determined easily.
* GEN_CLOSED: Execution has completed.
.. versionadded:: 3.2
+
+The current internal state of the generator can also be queried. This is
+mostly useful for testing purposes, to ensure that internal state is being
+updated as expected:
+
+.. function:: getgeneratorlocals(generator)
+
+ Get the mapping of live local variables in *generator* to their current
+ values. A dictionary is returned that maps from variable names to values.
+ This is the equivalent of calling :func:`locals` in the body of the
+ generator, and all the same caveats apply.
+
+ If *generator* is a :term:`generator` with no currently associated frame,
+ then an empty dictionary is returned. :exc:`TypeError` is raised if
+ *generator* is not a Python generator object.
+
+ .. impl-detail::
+
+ This function relies on the generator exposing a Python stack frame
+ for introspection, which isn't guaranteed to be the case in all
+ implementations of Python. In such cases, this function will always
+ return an empty dictionary.
+
+ .. versionadded:: 3.3
diff --git a/Doc/library/internet.rst b/Doc/library/internet.rst
index 6fa7873..b8950bb 100644
--- a/Doc/library/internet.rst
+++ b/Doc/library/internet.rst
@@ -23,10 +23,12 @@ is currently supported on most popular platforms. Here is an overview:
cgi.rst
cgitb.rst
wsgiref.rst
+ urllib.rst
urllib.request.rst
urllib.parse.rst
urllib.error.rst
urllib.robotparser.rst
+ http.rst
http.client.rst
ftplib.rst
poplib.rst
@@ -40,5 +42,7 @@ is currently supported on most popular platforms. Here is an overview:
http.server.rst
http.cookies.rst
http.cookiejar.rst
+ xmlrpc.rst
xmlrpc.client.rst
xmlrpc.server.rst
+ ipaddress.rst
diff --git a/Doc/library/io.rst b/Doc/library/io.rst
index 62eaf6d..44e663d 100644
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -37,6 +37,10 @@ giving a :class:`str` object to the ``write()`` method of a binary stream
will raise a ``TypeError``. So will giving a :class:`bytes` object to the
``write()`` method of a text stream.
+.. versionchanged:: 3.3
+ Operations that used to raise :exc:`IOError` now raise :exc:`OSError`, since
+ :exc:`IOError` is now an alias of :exc:`OSError`.
+
Text I/O
^^^^^^^^
@@ -55,7 +59,7 @@ In-memory text streams are also available as :class:`StringIO` objects::
f = io.StringIO("some initial text data")
-The text stream API is described in detail in the documentation for the
+The text stream API is described in detail in the documentation of
:class:`TextIOBase`.
@@ -113,21 +117,13 @@ High-level Module Interface
.. exception:: BlockingIOError
- Error raised when blocking would occur on a non-blocking stream. It inherits
- :exc:`IOError`.
-
- In addition to those of :exc:`IOError`, :exc:`BlockingIOError` has one
- attribute:
-
- .. attribute:: characters_written
-
- An integer containing the number of characters written to the stream
- before it blocked.
+ This is a compatibility alias for the builtin :exc:`BlockingIOError`
+ exception.
.. exception:: UnsupportedOperation
- An exception inheriting :exc:`IOError` and :exc:`ValueError` that is raised
+ An exception inheriting :exc:`OSError` and :exc:`ValueError` that is raised
when an unsupported operation is called on a stream.
@@ -206,8 +202,8 @@ I/O Base Classes
Even though :class:`IOBase` does not declare :meth:`read`, :meth:`readinto`,
or :meth:`write` because their signatures will vary, implementations and
clients should consider those methods part of the interface. Also,
- implementations may raise a :exc:`IOError` when operations they do not
- support are called.
+ implementations may raise a :exc:`ValueError` (or :exc:`UnsupportedOperation`)
+ when operations they do not support are called.
The basic type used for binary data read from or written to a file is
:class:`bytes`. :class:`bytearray`\s are accepted too, and in some cases
@@ -215,15 +211,15 @@ I/O Base Classes
:class:`str` data.
Note that calling any method (even inquiries) on a closed stream is
- undefined. Implementations may raise :exc:`IOError` in this case.
+ undefined. Implementations may raise :exc:`ValueError` in this case.
- IOBase (and its subclasses) support the iterator protocol, meaning that an
- :class:`IOBase` object can be iterated over yielding the lines in a stream.
- Lines are defined slightly differently depending on whether the stream is
- a binary stream (yielding bytes), or a text stream (yielding character
- strings). See :meth:`~IOBase.readline` below.
+ :class:`IOBase` (and its subclasses) support the iterator protocol, meaning
+ that an :class:`IOBase` object can be iterated over yielding the lines in a
+ stream. Lines are defined slightly differently depending on whether the
+ stream is a binary stream (yielding bytes), or a text stream (yielding
+ character strings). See :meth:`~IOBase.readline` below.
- IOBase is also a context manager and therefore supports the
+ :class:`IOBase` is also a context manager and therefore supports the
:keyword:`with` statement. In this example, *file* is closed after the
:keyword:`with` statement's suite is finished---even if an exception occurs::
@@ -243,12 +239,12 @@ I/O Base Classes
.. attribute:: closed
- True if the stream is closed.
+ ``True`` if the stream is closed.
.. method:: fileno()
Return the underlying file descriptor (an integer) of the stream if it
- exists. An :exc:`IOError` is raised if the IO object does not use a file
+ exists. An :exc:`OSError` is raised if the IO object does not use a file
descriptor.
.. method:: flush()
@@ -264,7 +260,7 @@ I/O Base Classes
.. method:: readable()
Return ``True`` if the stream can be read from. If False, :meth:`read`
- will raise :exc:`IOError`.
+ will raise :exc:`OSError`.
.. method:: readline(limit=-1)
@@ -299,10 +295,15 @@ I/O Base Classes
.. versionadded:: 3.1
The ``SEEK_*`` constants.
+ .. versionadded:: 3.3
+ Some operating systems could support additional values, like
+ :data:`os.SEEK_HOLE` or :data:`os.SEEK_DATA`. The valid values
+ for a file could depend on it being open in text or binary mode.
+
.. method:: seekable()
Return ``True`` if the stream supports random access. If ``False``,
- :meth:`seek`, :meth:`tell` and :meth:`truncate` will raise :exc:`IOError`.
+ :meth:`seek`, :meth:`tell` and :meth:`truncate` will raise :exc:`OSError`.
.. method:: tell()
@@ -320,7 +321,7 @@ I/O Base Classes
.. method:: writable()
Return ``True`` if the stream supports writing. If ``False``,
- :meth:`write` and :meth:`truncate` will raise :exc:`IOError`.
+ :meth:`write` and :meth:`truncate` will raise :exc:`OSError`.
.. method:: writelines(lines)
@@ -339,7 +340,7 @@ I/O Base Classes
(this is left to Buffered I/O and Text I/O, described later in this page).
In addition to the attributes and methods from :class:`IOBase`,
- RawIOBase provides the following methods:
+ :class:`RawIOBase` provides the following methods:
.. method:: read(n=-1)
@@ -359,18 +360,18 @@ I/O Base Classes
.. method:: readinto(b)
- Read up to len(b) bytes into bytearray *b* and return the number
- of bytes read. If the object is in non-blocking mode and no
+ Read up to ``len(b)`` bytes into :class:`bytearray` *b* and return the
+ number of bytes read. If the object is in non-blocking mode and no
bytes are available, ``None`` is returned.
.. method:: write(b)
- Write the given bytes or bytearray object, *b*, to the underlying raw
- stream and return the number of bytes written. This can be less than
- ``len(b)``, depending on specifics of the underlying raw stream, and
- especially if it is in non-blocking mode. ``None`` is returned if the
- raw stream is set not to block and no single byte could be readily
- written to it.
+ Write the given :class:`bytes` or :class:`bytearray` object, *b*, to the
+ underlying raw stream and return the number of bytes written. This can
+ be less than ``len(b)``, depending on specifics of the underlying raw
+ stream, and especially if it is in non-blocking mode. ``None`` is
+ returned if the raw stream is set not to block and no single byte could
+ be readily written to it.
.. class:: BufferedIOBase
@@ -420,8 +421,8 @@ I/O Base Classes
.. method:: read(n=-1)
Read and return up to *n* bytes. If the argument is omitted, ``None``, or
- negative, data is read and returned until EOF is reached. An empty bytes
- object is returned if the stream is already at EOF.
+ negative, data is read and returned until EOF is reached. An empty
+ :class:`bytes` object is returned if the stream is already at EOF.
If the argument is positive, and the underlying raw stream is not
interactive, multiple raw reads may be issued to satisfy the byte count
@@ -441,22 +442,23 @@ I/O Base Classes
.. method:: readinto(b)
- Read up to len(b) bytes into bytearray *b* and return the number of bytes
- read.
+ Read up to ``len(b)`` bytes into bytearray *b* and return the number of
+ bytes read.
Like :meth:`read`, multiple reads may be issued to the underlying raw
- stream, unless the latter is 'interactive'.
+ stream, unless the latter is interactive.
A :exc:`BlockingIOError` is raised if the underlying raw stream is in
non blocking-mode, and has no data available at the moment.
.. method:: write(b)
- Write the given bytes or bytearray object, *b* and return the number
- of bytes written (never less than ``len(b)``, since if the write fails
- an :exc:`IOError` will be raised). Depending on the actual
- implementation, these bytes may be readily written to the underlying
- stream, or held in a buffer for performance and latency reasons.
+ Write the given :class:`bytes` or :class:`bytearray` object, *b* and
+ return the number of bytes written (never less than ``len(b)``, since if
+ the write fails an :exc:`OSError` will be raised). Depending on the
+ actual implementation, these bytes may be readily written to the
+ underlying stream, or held in a buffer for performance and latency
+ reasons.
When in non-blocking mode, a :exc:`BlockingIOError` is raised if the
data needed to be written to the raw stream but it couldn't accept
@@ -466,7 +468,7 @@ I/O Base Classes
Raw File I/O
^^^^^^^^^^^^
-.. class:: FileIO(name, mode='r', closefd=True)
+.. class:: FileIO(name, mode='r', closefd=True, opener=None)
:class:`FileIO` represents an OS-level file containing bytes data.
It implements the :class:`RawIOBase` interface (and therefore the
@@ -474,22 +476,38 @@ Raw File I/O
The *name* can be one of two things:
- * a character string or bytes object representing the path to the file
- which will be opened;
+ * a character string or :class:`bytes` object representing the path to the
+ file which will be opened;
* an integer representing the number of an existing OS-level file descriptor
to which the resulting :class:`FileIO` object will give access.
- The *mode* can be ``'r'``, ``'w'`` or ``'a'`` for reading (default), writing,
- or appending. The file will be created if it doesn't exist when opened for
- writing or appending; it will be truncated when opened for writing. Add a
+ The *mode* can be ``'r'``, ``'w'``, ``'x'`` or ``'a'`` for reading
+ (default), writing, exclusive creation or appending. The file will be
+ created if it doesn't exist when opened for writing or appending; it will be
+ truncated when opened for writing. :exc:`FileExistsError` will be raised if
+ it already exists when opened for creating. Opening a file for creating
+ implies writing, so this mode behaves in a similar way to ``'w'``. Add a
``'+'`` to the mode to allow simultaneous reading and writing.
The :meth:`read` (when called with a positive argument), :meth:`readinto`
and :meth:`write` methods on this class will only make one system call.
+ A custom opener can be used by passing a callable as *opener*. The underlying
+ file descriptor for the file object is then obtained by calling *opener* with
+ (*name*, *flags*). *opener* must return an open file descriptor (passing
+ :mod:`os.open` as *opener* results in functionality similar to passing
+ ``None``).
+
+ See the :func:`open` built-in function for examples on using the *opener*
+ parameter.
+
+ .. versionchanged:: 3.3
+ The *opener* parameter was added.
+ The ``'x'`` mode was added.
+
In addition to the attributes and methods from :class:`IOBase` and
:class:`RawIOBase`, :class:`FileIO` provides the following data
- attributes and methods:
+ attributes:
.. attribute:: mode
@@ -537,7 +555,7 @@ than raw I/O does.
.. method:: getvalue()
- Return ``bytes`` containing the entire contents of the buffer.
+ Return :class:`bytes` containing the entire contents of the buffer.
.. method:: read1()
@@ -581,7 +599,7 @@ than raw I/O does.
A buffer providing higher-level access to a writeable, sequential
:class:`RawIOBase` object. It inherits :class:`BufferedIOBase`.
- When writing to this object, data is normally held into an internal
+ When writing to this object, data is normally placed into an internal
buffer. The buffer will be written out to the underlying :class:`RawIOBase`
object under various conditions, including:
@@ -594,8 +612,6 @@ than raw I/O does.
*raw* stream. If the *buffer_size* is not given, it defaults to
:data:`DEFAULT_BUFFER_SIZE`.
- A third argument, *max_buffer_size*, is supported, but unused and deprecated.
-
:class:`BufferedWriter` provides or overrides these methods in addition to
those from :class:`BufferedIOBase` and :class:`IOBase`:
@@ -606,9 +622,10 @@ than raw I/O does.
.. method:: write(b)
- Write the bytes or bytearray object, *b* and return the number of bytes
- written. When in non-blocking mode, a :exc:`BlockingIOError` is raised
- if the buffer needs to be written out but the raw stream blocks.
+ Write the :class:`bytes` or :class:`bytearray` object, *b* and return the
+ number of bytes written. When in non-blocking mode, a
+ :exc:`BlockingIOError` is raised if the buffer needs to be written out but
+ the raw stream blocks.
.. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)
@@ -621,8 +638,6 @@ than raw I/O does.
in the first argument. If the *buffer_size* is omitted it defaults to
:data:`DEFAULT_BUFFER_SIZE`.
- A third argument, *max_buffer_size*, is supported, but unused and deprecated.
-
:class:`BufferedRandom` is capable of anything :class:`BufferedReader` or
:class:`BufferedWriter` can do.
@@ -637,9 +652,6 @@ than raw I/O does.
writeable respectively. If the *buffer_size* is omitted it defaults to
:data:`DEFAULT_BUFFER_SIZE`.
- A fourth argument, *max_buffer_size*, is supported, but unused and
- deprecated.
-
:class:`BufferedRWPair` implements all of :class:`BufferedIOBase`\'s methods
except for :meth:`~BufferedIOBase.detach`, which raises
:exc:`UnsupportedOperation`.
@@ -682,7 +694,7 @@ Text I/O
The underlying binary buffer (a :class:`BufferedIOBase` instance) that
:class:`TextIOBase` deals with. This is not part of the
- :class:`TextIOBase` API and may not exist on some implementations.
+ :class:`TextIOBase` API and may not exist in some implementations.
.. method:: detach()
@@ -742,13 +754,15 @@ Text I/O
written.
-.. class:: TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False)
+.. class:: TextIOWrapper(buffer, encoding=None, errors=None, newline=None, \
+ line_buffering=False, write_through=False)
A buffered text stream over a :class:`BufferedIOBase` binary stream.
It inherits :class:`TextIOBase`.
*encoding* gives the name of the encoding that the stream will be decoded or
- encoded with. It defaults to :func:`locale.getpreferredencoding`.
+ encoded with. It defaults to
+ :func:`locale.getpreferredencoding(False) <locale.getpreferredencoding>`.
*errors* is an optional string that specifies how encoding and decoding
errors are to be handled. Pass ``'strict'`` to raise a :exc:`ValueError`
@@ -785,6 +799,19 @@ Text I/O
If *line_buffering* is ``True``, :meth:`flush` is implied when a call to
write contains a newline character.
+ If *write_through* is ``True``, calls to :meth:`write` are guaranteed
+ not to be buffered: any data written on the :class:`TextIOWrapper`
+ object is immediately handled to its underlying binary *buffer*.
+
+ .. versionchanged:: 3.3
+ The *write_through* argument has been added.
+
+ .. versionchanged:: 3.3
+ The default *encoding* is now ``locale.getpreferredencoding(False)``
+ instead of ``locale.getpreferredencoding()``. Don't change temporary the
+ locale encoding using :func:`locale.setlocale`, use the current locale
+ encoding instead of the user preferred encoding.
+
:class:`TextIOWrapper` provides one attribute in addition to those of
:class:`TextIOBase` and its parents:
@@ -851,8 +878,8 @@ operating system's unbuffered I/O routines. The gain depends on the OS and the
kind of I/O which is performed. For example, on some modern OSes such as Linux,
unbuffered disk I/O can be as fast as buffered I/O. The bottom line, however,
is that buffered I/O offers predictable performance regardless of the platform
-and the backing device. Therefore, it is most always preferable to use buffered
-I/O rather than unbuffered I/O for binary datal
+and the backing device. Therefore, it is almost always preferable to use
+buffered I/O rather than unbuffered I/O for binary data.
Text I/O
^^^^^^^^
@@ -887,8 +914,8 @@ Binary buffered objects (instances of :class:`BufferedReader`,
:class:`BufferedWriter`, :class:`BufferedRandom` and :class:`BufferedRWPair`)
are not reentrant. While reentrant calls will not happen in normal situations,
they can arise from doing I/O in a :mod:`signal` handler. If a thread tries to
-renter a buffered object which it is already accessing, a :exc:`RuntimeError` is
-raised. Note this doesn't prohibit a different thread from entering the
+re-enter a buffered object which it is already accessing, a :exc:`RuntimeError`
+is raised. Note this doesn't prohibit a different thread from entering the
buffered object.
The above implicitly extends to text files, since the :func:`open()` function
diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst
new file mode 100644
index 0000000..86d84af
--- /dev/null
+++ b/Doc/library/ipaddress.rst
@@ -0,0 +1,804 @@
+:mod:`ipaddress` --- IPv4/IPv6 manipulation library
+===================================================
+
+.. module:: ipaddress
+ :synopsis: IPv4/IPv6 manipulation library.
+.. moduleauthor:: Peter Moody
+
+**Source code:** :source:`Lib/ipaddress.py`
+
+--------------
+
+.. note::
+
+ The ``ipaddress`` module has been included in the standard library on a
+ :term:`provisional basis <provisional package>`. Backwards incompatible
+ changes (up to and including removal of the package) may occur if deemed
+ necessary by the core developers.
+
+:mod:`ipaddress` provides the capabilities to create, manipulate and
+operate on IPv4 and IPv6 addresses and networks.
+
+The functions and classes in this module make it straightforward to handle
+various tasks related to IP addresses, including checking whether or not two
+hosts are on the same subnet, iterating over all hosts in a particular
+subnet, checking whether or not a string represents a valid IP address or
+network definition, and so on.
+
+This is the full module API reference - for an overview and introduction,
+see :ref:`ipaddress-howto`.
+
+.. versionadded:: 3.3
+
+
+Convenience factory functions
+-----------------------------
+
+The :mod:`ipaddress` module provides factory functions to conveniently create
+IP addresses, networks and interfaces:
+
+.. function:: ip_address(address)
+
+ Return an :class:`IPv4Address` or :class:`IPv6Address` object depending on
+ the IP address passed as argument. Either IPv4 or IPv6 addresses may be
+ supplied; integers less than 2**32 will be considered to be IPv4 by default.
+ A :exc:`ValueError` is raised if *address* does not represent a valid IPv4
+ or IPv6 address.
+
+.. testsetup::
+ >>> import ipaddress
+ >>> from ipaddress import (ip_network, IPv4Address, IPv4Interface,
+ ... IPv4Network)
+
+::
+
+ >>> ipaddress.ip_address('192.168.0.1')
+ IPv4Address('192.168.0.1')
+ >>> ipaddress.ip_address('2001:db8::')
+ IPv6Address('2001:db8::')
+
+
+.. function:: ip_network(address, strict=True)
+
+ Return an :class:`IPv4Network` or :class:`IPv6Network` object depending on
+ the IP address passed as argument. *address* is a string or integer
+ representing the IP network. Either IPv4 or IPv6 networks may be supplied;
+ integers less than 2**32 will be considered to be IPv4 by default. *strict*
+ is passed to :class:`IPv4Network` or :class:`IPv6Network` constructor. A
+ :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
+ IPv6 address, or if the network has host bits set.
+
+ >>> ipaddress.ip_network('192.168.0.0/28')
+ IPv4Network('192.168.0.0/28')
+
+
+.. function:: ip_interface(address)
+
+ Return an :class:`IPv4Interface` or :class:`IPv6Interface` object depending
+ on the IP address passed as argument. *address* is a string or integer
+ representing the IP address. Either IPv4 or IPv6 addresses may be supplied;
+ integers less than 2**32 will be considered to be IPv4 by default. A
+ :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
+ IPv6 address.
+
+One downside of these convenience functions is that the need to handle both
+IPv4 and IPv6 formats means that error messages provide minimal
+information on the precise error, as the functions don't know whether the
+IPv4 or IPv6 format was intended. More detailed error reporting can be
+obtained by calling the appropriate version specific class constructors
+directly.
+
+
+IP Addresses
+------------
+
+Address objects
+^^^^^^^^^^^^^^^
+
+The :class:`IPv4Address` and :class:`IPv6Address` objects share a lot of common
+attributes. Some attributes that are only meaningful for IPv6 addresses are
+also implemented by :class:`IPv4Address` objects, in order to make it easier to
+write code that handles both IP versions correctly.
+
+.. class:: IPv4Address(address)
+
+ Construct an IPv4 address. An :exc:`AddressValueError` is raised if
+ *address* is not a valid IPv4 address.
+
+ The following constitutes a valid IPv4 address:
+
+ 1. A string in decimal-dot notation, consisting of four decimal integers in
+ the inclusive range 0-255, separated by dots (e.g. ``192.168.0.1``). Each
+ integer represents an octet (byte) in the address. Leading zeroes are
+ tolerated only for values less then 8 (as there is no ambiguity
+ between the decimal and octal interpretations of such strings).
+ 2. An integer that fits into 32 bits.
+ 3. An integer packed into a :class:`bytes` object of length 4 (most
+ significant octet first).
+
+ >>> ipaddress.IPv4Address('192.168.0.1')
+ IPv4Address('192.168.0.1')
+ >>> ipaddress.IPv4Address(3232235521)
+ IPv4Address('192.168.0.1')
+ >>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
+ IPv4Address('192.168.0.1')
+
+ .. attribute:: version
+
+ The appropriate version number: ``4`` for IPv4, ``6`` for IPv6.
+
+ .. attribute:: max_prefixlen
+
+ The total number of bits in the address representation for this
+ version: ``32`` for IPv4, ``128`` for IPv6.
+
+ The prefix defines the number of leading bits in an address that
+ are compared to determine whether or not an address is part of a
+ network.
+
+ .. attribute:: compressed
+ .. attribute:: exploded
+
+ The string representation in dotted decimal notation. Leading zeroes
+ are never included in the representation.
+
+ As IPv4 does not define a shorthand notation for addresses with octets
+ set to zero, these two attributes are always the same as ``str(addr)``
+ for IPv4 addresses. Exposing these attributes makes it easier to
+ write display code that can handle both IPv4 and IPv6 addresses.
+
+ .. attribute:: packed
+
+ The binary representation of this address - a :class:`bytes` object of
+ the appropriate length (most significant octet first). This is 4 bytes
+ for IPv4 and 16 bytes for IPv6.
+
+ .. attribute:: is_multicast
+
+ ``True`` if the address is reserved for multicast use. See
+ :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6).
+
+ .. attribute:: is_private
+
+ ``True`` if the address is allocated for private networks. See
+ :RFC:`1918` (for IPv4) or :RFC:`4193` (for IPv6).
+
+ .. attribute:: is_unspecified
+
+ ``True`` if the address is unspecified. See :RFC:`5375` (for IPv4)
+ or :RFC:`2373` (for IPv6).
+
+ .. attribute:: is_reserved
+
+ ``True`` if the address is otherwise IETF reserved.
+
+ .. attribute:: is_loopback
+
+ ``True`` if this is a loopback address. See :RFC:`3330` (for IPv4)
+ or :RFC:`2373` (for IPv6).
+
+ .. attribute:: is_link_local
+
+ ``True`` if the address is reserved for link-local usage. See
+ :RFC:`3927`.
+
+
+.. class:: IPv6Address(address)
+
+ Construct an IPv6 address. An :exc:`AddressValueError` is raised if
+ *address* is not a valid IPv6 address.
+
+ The following constitutes a valid IPv6 address:
+
+ 1. A string consisting of eight groups of four hexadecimal digits, each
+ group representing 16 bits. The groups are separated by colons.
+ This describes an *exploded* (longhand) notation. The string can
+ also be *compressed* (shorthand notation) by various means. See
+ :RFC:`4291` for details. For example,
+ ``"0000:0000:0000:0000:0000:0abc:0007:0def"`` can be compressed to
+ ``"::abc:7:def"``.
+ 2. An integer that fits into 128 bits.
+ 3. An integer packed into a :class:`bytes` object of length 16, big-endian.
+
+ >>> ipaddress.IPv6Address('2001:db8::1000')
+ IPv6Address('2001:db8::1000')
+
+ .. attribute:: compressed
+
+ The short form of the address representation, with leading zeroes in
+ groups omitted and the longest sequence of groups consisting entirely of
+ zeroes collapsed to a single empty group.
+
+ This is also the value returned by ``str(addr)`` for IPv6 addresses.
+
+ .. attribute:: exploded
+
+ The long form of the address representation, with all leading zeroes and
+ groups consisting entirely of zeroes included.
+
+ .. attribute:: packed
+ .. attribute:: version
+ .. attribute:: max_prefixlen
+ .. attribute:: is_multicast
+ .. attribute:: is_private
+ .. attribute:: is_unspecified
+ .. attribute:: is_reserved
+ .. attribute:: is_loopback
+ .. attribute:: is_link_local
+
+ Refer to the corresponding attribute documentation in
+ :class:`IPv4Address`
+
+ .. attribute:: is_site_local
+
+ ``True`` if the address is reserved for site-local usage. Note that
+ the site-local address space has been deprecated by :RFC:`3879`. Use
+ :attr:`~IPv4Address.is_private` to test if this address is in the
+ space of unique local addresses as defined by :RFC:`4193`.
+
+ .. attribute:: ipv4_mapped
+
+ For addresses that appear to be IPv4 mapped addresses (starting with
+ ``::FFFF/96``), this property will report the embedded IPv4 address.
+ For any other address, this property will be ``None``.
+
+ .. attribute:: sixtofour
+
+ For addresses that appear to be 6to4 addresses (starting with
+ ``2002::/16``) as defined by :RFC:`3056`, this property will report
+ the embedded IPv4 address. For any other address, this property will
+ be ``None``.
+
+ .. attribute:: teredo
+
+ For addresses that appear to be Teredo addresses (starting with
+ ``2001::/32``) as defined by :RFC:`4380`, this property will report
+ the embedded ``(server, client)`` IP address pair. For any other
+ address, this property will be ``None``.
+
+
+Conversion to Strings and Integers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To interoperate with networking interfaces such as the socket module,
+addresses must be converted to strings or integers. This is handled using
+the :func:`str` and :func:`int` builtin functions::
+
+ >>> str(ipaddress.IPv4Address('192.168.0.1'))
+ '192.168.0.1'
+ >>> int(ipaddress.IPv4Address('192.168.0.1'))
+ 3232235521
+ >>> str(ipaddress.IPv6Address('::1'))
+ '::1'
+ >>> int(ipaddress.IPv6Address('::1'))
+ 1
+
+
+Operators
+^^^^^^^^^
+
+Address objects support some operators. Unless stated otherwise, operators can
+only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
+IPv6).
+
+
+Logical operators
+"""""""""""""""""
+
+Address objects can be compared with the usual set of logical operators. Some
+examples::
+
+ >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
+ True
+ >>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
+ False
+ >>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
+ True
+
+
+Arithmetic operators
+""""""""""""""""""""
+
+Integers can be added to or subtracted from address objects. Some examples::
+
+ >>> IPv4Address('127.0.0.2') + 3
+ IPv4Address('127.0.0.5')
+ >>> IPv4Address('127.0.0.2') - 3
+ IPv4Address('126.255.255.255')
+ >>> IPv4Address('255.255.255.255') + 1
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
+
+
+IP Network definitions
+----------------------
+
+The :class:`IPv4Network` and :class:`IPv6Network` objects provide a mechanism
+for defining and inspecting IP network definitions. A network definition
+consists of a *mask* and a *network address*, and as such defines a range of
+IP addresses that equal the network address when masked (binary AND) with the
+mask. For example, a network definition with the mask ``255.255.255.0`` and
+the network address ``192.168.1.0`` consists of IP addresses in the inclusive
+range ``192.168.1.0`` to ``192.168.1.255``.
+
+
+Prefix, net mask and host mask
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+There are several equivalent ways to specify IP network masks. A *prefix*
+``/<nbits>`` is a notation that denotes how many high-order bits are set in
+the network mask. A *net mask* is an IP address with some number of
+high-order bits set. Thus the prefix ``/24`` is equivalent to the net mask
+``255.255.255.0`` in IPv4, or ``ffff:ff00::`` in IPv6. In addition, a
+*host mask* is the logical inverse of a *net mask*, and is sometimes used
+(for example in Cisco access control lists) to denote a network mask. The
+host mask equivalent to ``/24`` in IPv4 is ``0.0.0.255``.
+
+
+Network objects
+^^^^^^^^^^^^^^^
+
+All attributes implemented by address objects are implemented by network
+objects as well. In addition, network objects implement additional attributes.
+All of these are common between :class:`IPv4Network` and :class:`IPv6Network`,
+so to avoid duplication they are only documented for :class:`IPv4Network`.
+
+.. class:: IPv4Network(address, strict=True)
+
+ Construct an IPv4 network definition. *address* can be one of the following:
+
+ 1. A string consisting of an IP address and an optional mask, separated by
+ a slash (``/``). The IP address is the network address, and the mask
+ can be either a single number, which means it's a *prefix*, or a string
+ representation of an IPv4 address. If it's the latter, the mask is
+ interpreted as a *net mask* if it starts with a non-zero field, or as
+ a *host mask* if it starts with a zero field. If no mask is provided,
+ it's considered to be ``/32``.
+
+ For example, the following *address* specifications are equivalent:
+ ``192.168.1.0/24``, ``192.168.1.0/255.255.255.0`` and
+ ``192.168.1.0/0.0.0.255``.
+
+ 2. An integer that fits into 32 bits. This is equivalent to a
+ single-address network, with the network address being *address* and
+ the mask being ``/32``.
+
+ 3. An integer packed into a :class:`bytes` object of length 4, big-endian.
+ The interpretation is similar to an integer *address*.
+
+ An :exc:`AddressValueError` is raised if *address* is not a valid IPv4
+ address. A :exc:`NetmaskValueError` is raised if the mask is not valid for
+ an IPv4 address.
+
+ If *strict* is ``True`` and host bits are set in the supplied address,
+ then :exc:`ValueError` is raised. Otherwise, the host bits are masked out
+ to determine the appropriate network address.
+
+ Unless stated otherwise, all network methods accepting other network/address
+ objects will raise :exc:`TypeError` if the argument's IP version is
+ incompatible to ``self``
+
+ .. attribute:: version
+ .. attribute:: max_prefixlen
+
+ Refer to the corresponding attribute documentation in
+ :class:`IPv4Address`
+
+ .. attribute:: is_multicast
+ .. attribute:: is_private
+ .. attribute:: is_unspecified
+ .. attribute:: is_reserved
+ .. attribute:: is_loopback
+ .. attribute:: is_link_local
+
+ These attributes are true for the network as a whole if they are true
+ true for both the network address and the broadcast address
+
+ .. attribute:: network_address
+
+ The network address for the network. The network address and the
+ prefix length together uniquely define a network.
+
+ .. attribute:: broadcast_address
+
+ The broadcast address for the network. Packets sent to the broadcast
+ address should be received by every host on the network.
+
+ .. attribute:: host mask
+
+ The host mask, as a string.
+
+ .. attribute:: with_prefixlen
+ .. attribute:: compressed
+ .. attribute:: exploded
+
+ A string representation of the network, with the mask in prefix
+ notation.
+
+ ``with_prefixlen`` and ``compressed`` are always the same as
+ ``str(network)``.
+ ``exploded`` uses the exploded form the network address.
+
+ .. attribute:: with_netmask
+
+ A string representation of the network, with the mask in net mask
+ notation.
+
+ .. attribute:: with_hostmask
+
+ A string representation of the network, with the mask in host mask
+ notation.
+
+ .. attribute:: num_addresses
+
+ The total number of addresses in the network.
+
+ .. attribute:: prefixlen
+
+ Length of the network prefix, in bits.
+
+ .. method:: hosts()
+
+ Returns an iterator over the usable hosts in the network. The usable
+ hosts are all the IP addresses that belong to the network, except the
+ network address itself and the network broadcast address.
+
+ >>> list(ip_network('192.0.2.0/29').hosts()) #doctest: +NORMALIZE_WHITESPACE
+ [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
+ IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
+ IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
+
+ .. method:: overlaps(other)
+
+ ``True`` if this network is partly or wholly contained in *other* or
+ or *other* is wholly contained in this network.
+
+ .. method:: address_exclude(network)
+
+ Computes the network definitions resulting from removing the given
+ *network* from this one. Returns an iterator of network objects.
+ Raises :exc:`ValueError` if *network* is not completely contained in
+ this network.
+
+ >>> n1 = ip_network('192.0.2.0/28')
+ >>> n2 = ip_network('192.0.2.1/32')
+ >>> list(n1.address_exclude(n2)) #doctest: +NORMALIZE_WHITESPACE
+ [IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
+ IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
+
+ .. method:: subnets(prefixlen_diff=1, new_prefix=None)
+
+ The subnets that join to make the current network definition, depending
+ on the argument values. *prefixlen_diff* is the amount our prefix
+ length should be increased by. *new_prefix* is the desired new
+ prefix of the subnets; it must be larger than our prefix. One and
+ only one of *prefixlen_diff* and *new_prefix* must be set. Returns an
+ iterator of network objects.
+
+ >>> list(ip_network('192.0.2.0/24').subnets())
+ [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
+ >>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2)) #doctest: +NORMALIZE_WHITESPACE
+ [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
+ IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
+ >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26)) #doctest: +NORMALIZE_WHITESPACE
+ [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
+ IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
+ >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ raise ValueError('new prefix must be longer')
+ ValueError: new prefix must be longer
+ >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
+ [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
+
+ .. method:: supernet(prefixlen_diff=1, new_prefix=None)
+
+ The supernet containing this network definition, depending on the
+ argument values. *prefixlen_diff* is the amount our prefix length
+ should be decreased by. *new_prefix* is the desired new prefix of
+ the supernet; it must be smaller than our prefix. One and only one
+ of *prefixlen_diff* and *new_prefix* must be set. Returns a single
+ network object.
+
+ >>> ip_network('192.0.2.0/24').supernet()
+ IPv4Network('192.0.2.0/23')
+ >>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
+ IPv4Network('192.0.0.0/22')
+ >>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
+ IPv4Network('192.0.0.0/20')
+
+ .. method:: compare_networks(other)
+
+ Compare this network to *other*. In this comparison only the network
+ addresses are considered; host bits aren't. Returns either ``-1``,
+ ``0`` or ``1``.
+
+ >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
+ -1
+ >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
+ 1
+ >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
+ 0
+
+
+.. class:: IPv6Network(address, strict=True)
+
+ Construct an IPv6 network definition. *address* can be one of the following:
+
+ 1. A string consisting of an IP address and an optional mask, separated by
+ a slash (``/``). The IP address is the network address, and the mask
+ can be either a single number, which means it's a *prefix*, or a string
+ representation of an IPv6 address. If it's the latter, the mask is
+ interpreted as a *net mask*. If no mask is provided, it's considered to
+ be ``/128``.
+
+ For example, the following *address* specifications are equivalent:
+ ``2001:db00::0/24`` and ``2001:db00::0/ffff:ff00::``.
+
+ 2. An integer that fits into 128 bits. This is equivalent to a
+ single-address network, with the network address being *address* and
+ the mask being ``/128``.
+
+ 3. An integer packed into a :class:`bytes` object of length 16, bit-endian.
+ The interpretation is similar to an integer *address*.
+
+ An :exc:`AddressValueError` is raised if *address* is not a valid IPv6
+ address. A :exc:`NetmaskValueError` is raised if the mask is not valid for
+ an IPv6 address.
+
+ If *strict* is ``True`` and host bits are set in the supplied address,
+ then :exc:`ValueError` is raised. Otherwise, the host bits are masked out
+ to determine the appropriate network address.
+
+ .. attribute:: version
+ .. attribute:: max_prefixlen
+ .. attribute:: is_multicast
+ .. attribute:: is_private
+ .. attribute:: is_unspecified
+ .. attribute:: is_reserved
+ .. attribute:: is_loopback
+ .. attribute:: is_link_local
+ .. attribute:: network_address
+ .. attribute:: broadcast_address
+ .. attribute:: host mask
+ .. attribute:: with_prefixlen
+ .. attribute:: compressed
+ .. attribute:: exploded
+ .. attribute:: with_netmask
+ .. attribute:: with_hostmask
+ .. attribute:: num_addresses
+ .. attribute:: prefixlen
+ .. method:: hosts()
+ .. method:: overlaps(other)
+ .. method:: address_exclude(network)
+ .. method:: subnets(prefixlen_diff=1, new_prefix=None)
+ .. method:: supernet(prefixlen_diff=1, new_prefix=None)
+ .. method:: compare_networks(other)
+
+ Refer to the corresponding attribute documentation in
+ :class:`IPv4Network`
+
+ .. attribute:: is_site_local
+
+ These attribute is true for the network as a whole if it is true
+ true for both the network address and the broadcast address
+
+
+Operators
+^^^^^^^^^
+
+Network objects support some operators. Unless stated otherwise, operators can
+only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
+IPv6).
+
+
+Logical operators
+"""""""""""""""""
+
+Network objects can be compared with the usual set of logical operators,
+similarly to address objects.
+
+
+Iteration
+"""""""""
+
+Network objects can be iterated to list all the addresses belonging to the
+network. For iteration, *all* hosts are returned, including unusable hosts
+(for usable hosts, use the :meth:`~IPv4Network.hosts` method). An
+example::
+
+ >>> for addr in IPv4Network('192.0.2.0/28'):
+ ... addr
+ ...
+ IPv4Address('192.0.2.0')
+ IPv4Address('192.0.2.1')
+ IPv4Address('192.0.2.2')
+ IPv4Address('192.0.2.3')
+ IPv4Address('192.0.2.4')
+ IPv4Address('192.0.2.5')
+ IPv4Address('192.0.2.6')
+ IPv4Address('192.0.2.7')
+ IPv4Address('192.0.2.8')
+ IPv4Address('192.0.2.9')
+ IPv4Address('192.0.2.10')
+ IPv4Address('192.0.2.11')
+ IPv4Address('192.0.2.12')
+ IPv4Address('192.0.2.13')
+ IPv4Address('192.0.2.14')
+ IPv4Address('192.0.2.15')
+
+
+Networks as containers of addresses
+"""""""""""""""""""""""""""""""""""
+
+Network objects can act as containers of addresses. Some examples::
+
+ >>> IPv4Network('192.0.2.0/28')[0]
+ IPv4Address('192.0.2.0')
+ >>> IPv4Network('192.0.2.0/28')[15]
+ IPv4Address('192.0.2.15')
+ >>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
+ True
+ >>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
+ False
+
+
+Interface objects
+-----------------
+
+.. class:: IPv4Interface(address)
+
+ Construct an IPv4 interface. The meaning of *address* is as in the
+ constructor of :class:`IPv4Network`, except that arbitrary host addresses
+ are always accepted.
+
+ :class:`IPv4Interface` is a subclass of :class:`IPv4Address`, so it inherits
+ all the attributes from that class. In addition, the following attributes
+ are available:
+
+ .. attribute:: ip
+
+ The address (:class:`IPv4Address`) without network information.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.ip
+ IPv4Address('192.0.2.5')
+
+ .. attribute:: network
+
+ The network (:class:`IPv4Network`) this interface belongs to.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.network
+ IPv4Network('192.0.2.0/24')
+
+ .. attribute:: with_prefixlen
+
+ A string representation of the interface with the mask in prefix notation.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_prefixlen
+ '192.0.2.5/24'
+
+ .. attribute:: with_netmask
+
+ A string representation of the interface with the network as a net mask.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_netmask
+ '192.0.2.5/255.255.255.0'
+
+ .. attribute:: with_hostmask
+
+ A string representation of the interface with the network as a host mask.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_hostmask
+ '192.0.2.5/0.0.0.255'
+
+
+.. class:: IPv6Interface(address)
+
+ Construct an IPv6 interface. The meaning of *address* is as in the
+ constructor of :class:`IPv6Network`, except that arbitrary host addresses
+ are always accepted.
+
+ :class:`IPv6Interface` is a subclass of :class:`IPv6Address`, so it inherits
+ all the attributes from that class. In addition, the following attributes
+ are available:
+
+ .. attribute:: ip
+ .. attribute:: network
+ .. attribute:: with_prefixlen
+ .. attribute:: with_netmask
+ .. attribute:: with_hostmask
+
+ Refer to the corresponding attribute documentation in
+ :class:`IPv4Interface`.
+
+
+Other Module Level Functions
+----------------------------
+
+The module also provides the following module level functions:
+
+.. function:: v4_int_to_packed(address)
+
+ Represent an address as 4 packed bytes in network (big-endian) order.
+ *address* is an integer representation of an IPv4 IP address. A
+ :exc:`ValueError` is raised if the integer is negative or too large to be an
+ IPv4 IP address.
+
+ >>> ipaddress.ip_address(3221225985)
+ IPv4Address('192.0.2.1')
+ >>> ipaddress.v4_int_to_packed(3221225985)
+ b'\xc0\x00\x02\x01'
+
+
+.. function:: v6_int_to_packed(address)
+
+ Represent an address as 16 packed bytes in network (big-endian) order.
+ *address* is an integer representation of an IPv6 IP address. A
+ :exc:`ValueError` is raised if the integer is negative or too large to be an
+ IPv6 IP address.
+
+
+.. function:: summarize_address_range(first, last)
+
+ Return an iterator of the summarized network range given the first and last
+ IP addresses. *first* is the first :class:`IPv4Address` or
+ :class:`IPv6Address` in the range and *last* is the last :class:`IPv4Address`
+ or :class:`IPv6Address` in the range. A :exc:`TypeError` is raised if
+ *first* or *last* are not IP addresses or are not of the same version. A
+ :exc:`ValueError` is raised if *last* is not greater than *first* or if
+ *first* address version is not 4 or 6.
+
+ >>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
+ ... ipaddress.IPv4Address('192.0.2.0'),
+ ... ipaddress.IPv4Address('192.0.2.130'))]
+ [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
+
+
+.. function:: collapse_addresses(addresses)
+
+ Return an iterator of the collapsed :class:`IPv4Network` or
+ :class:`IPv6Network` objects. *addresses* is an iterator of
+ :class:`IPv4Network` or :class:`IPv6Network` objects. A :exc:`TypeError` is
+ raised if *addresses* contains mixed version objects.
+
+ >>> [ipaddr for ipaddr in
+ ... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
+ ... ipaddress.IPv4Network('192.0.2.128/25')])]
+ [IPv4Network('192.0.2.0/24')]
+
+
+.. function:: get_mixed_type_key(obj)
+
+ Return a key suitable for sorting between networks and addresses. Address
+ and Network objects are not sortable by default; they're fundamentally
+ different, so the expression::
+
+ IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
+
+ doesn't make sense. There are some times however, where you may wish to
+ have :mod:`ipaddress` sort these anyway. If you need to do this, you can use
+ this function as the ``key`` argument to :func:`sorted()`.
+
+ *obj* is either a network or address object.
+
+
+Custom Exceptions
+-----------------
+
+To support more specific error reporting from class constructors, the
+module defines the following exceptions:
+
+.. exception:: AddressValueError(ValueError)
+
+ Any value error related to the address.
+
+
+.. exception:: NetmaskValueError(ValueError)
+
+ Any value error related to the netmask.
diff --git a/Doc/library/ipc.rst b/Doc/library/ipc.rst
index c873065..91ec693 100644
--- a/Doc/library/ipc.rst
+++ b/Doc/library/ipc.rst
@@ -8,7 +8,7 @@ The modules described in this chapter provide mechanisms for different processes
to communicate.
Some modules only work for two processes that are on the same machine, e.g.
-:mod:`signal` and :mod:`subprocess`. Other modules support networking protocols
+:mod:`signal` and :mod:`mmap`. Other modules support networking protocols
that two or more processes can used to communicate across machines.
The list of modules described in this chapter is:
@@ -16,9 +16,9 @@ The list of modules described in this chapter is:
.. toctree::
- subprocess.rst
socket.rst
ssl.rst
- signal.rst
asyncore.rst
asynchat.rst
+ signal.rst
+ mmap.rst
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index 308f925..1eb554a 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -46,7 +46,7 @@ Iterator Arguments Results
==================== ============================ ================================================= =============================================================
Iterator Arguments Results Example
==================== ============================ ================================================= =============================================================
-:func:`accumulate` p p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) --> 1 3 6 10 15``
+:func:`accumulate` p [,func] p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) --> 1 3 6 10 15``
:func:`chain` p, q, ... p0, p1, ... plast, q0, q1, ... ``chain('ABC', 'DEF') --> A B C D E F``
:func:`compress` data, selectors (d[0] if s[0]), (d[1] if s[1]), ... ``compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F``
:func:`dropwhile` pred, seq seq[n], seq[n+1], starting when pred fails ``dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1``
@@ -84,23 +84,61 @@ The following module functions all construct and return iterators. Some provide
streams of infinite length, so they should only be accessed by functions or
loops that truncate the stream.
-.. function:: accumulate(iterable)
+.. function:: accumulate(iterable[, func])
Make an iterator that returns accumulated sums. Elements may be any addable
- type including :class:`Decimal` or :class:`Fraction`. Equivalent to::
+ type including :class:`Decimal` or :class:`Fraction`. If the optional
+ *func* argument is supplied, it should be a function of two arguments
+ and it will be used instead of addition.
- def accumulate(iterable):
+ Equivalent to::
+
+ def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
+ # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = next(it)
yield total
for element in it:
- total = total + element
+ total = func(total, element)
yield total
+ There are a number of uses for the *func* argument. It can be set to
+ :func:`min` for a running minimum, :func:`max` for a running maximum, or
+ :func:`operator.mul` for a running product. Amortization tables can be
+ built by accumulating interest and applying payments. First-order
+ `recurrence relations <http://en.wikipedia.org/wiki/Recurrence_relation>`_
+ can be modeled by supplying the initial value in the iterable and using only
+ the accumulated total in *func* argument::
+
+ >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
+ >>> list(accumulate(data, operator.mul)) # running product
+ [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
+ >>> list(accumulate(data, max)) # running maximum
+ [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
+
+ # Amortize a 5% loan of 1000 with 4 annual payments of 90
+ >>> cashflows = [1000, -90, -90, -90, -90]
+ >>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt))
+ [1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]
+
+ # Chaotic recurrence relation http://en.wikipedia.org/wiki/Logistic_map
+ >>> logistic_map = lambda x, _: r * x * (1 - x)
+ >>> r = 3.8
+ >>> x0 = 0.4
+ >>> inputs = repeat(x0, 36) # only the initial value is used
+ >>> [format(x, '.2f') for x in accumulate(inputs, logistic_map)]
+ ['0.40', '0.91', '0.30', '0.81', '0.60', '0.92', '0.29', '0.79', '0.63',
+ '0.88' ,'0.39', '0.90', '0.33', '0.84', '0.52', '0.95', '0.18', '0.57',
+ '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32',
+ '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60']
+
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Added the optional *func* parameter.
+
.. function:: chain(*iterables)
Make an iterator that returns elements from the first iterable until it is
@@ -668,7 +706,8 @@ which incur interpreter overhead.
return zip(a, b)
def grouper(n, iterable, fillvalue=None):
- "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
+ "Collect data into fixed-length chunks or blocks"
+ # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst
index 45aba0a..d46f1cf 100644
--- a/Doc/library/locale.rst
+++ b/Doc/library/locale.rst
@@ -475,8 +475,11 @@ in such a way that frequent locale changes may cause core dumps. This makes the
locale somewhat painful to use correctly.
Initially, when a program is started, the locale is the ``C`` locale, no matter
-what the user's preferred locale is. The program must explicitly say that it
-wants the user's preferred locale settings by calling ``setlocale(LC_ALL, '')``.
+what the user's preferred locale is. There is one exception: the
+:data:`LC_CTYPE` category is changed at startup to set the current locale
+encoding to the user's preferred locale encoding. The program must explicitly
+say that it wants the user's preferred locale settings for other categories by
+calling ``setlocale(LC_ALL, '')``.
It is generally a bad idea to call :func:`setlocale` in some library routine,
since as a side effect it affects the entire program. Saving and restoring it
diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst
index ef65cfa..537b8c7 100644
--- a/Doc/library/logging.handlers.rst
+++ b/Doc/library/logging.handlers.rst
@@ -164,6 +164,87 @@ this value.
changed. If it has, the existing stream is flushed and closed and the
file opened again, before outputting the record to the file.
+.. _base-rotating-handler:
+
+BaseRotatingHandler
+^^^^^^^^^^^^^^^^^^^
+
+The :class:`BaseRotatingHandler` class, located in the :mod:`logging.handlers`
+module, is the base class for the rotating file handlers,
+:class:`RotatingFileHandler` and :class:`TimedRotatingFileHandler`. You should
+not need to instantiate this class, but it has attributes and methods you may
+need to override.
+
+.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False)
+
+ The parameters are as for :class:`FileHandler`. The attributes are:
+
+ .. attribute:: namer
+
+ If this attribute is set to a callable, the :meth:`rotation_filename`
+ method delegates to this callable. The parameters passed to the callable
+ are those passed to :meth:`rotation_filename`.
+
+ .. note:: The namer function is called quite a few times during rollover,
+ so it should be as simple and as fast as possible. It should also
+ return the same output every time for a given input, otherwise the
+ rollover behaviour may not work as expected.
+
+ .. versionadded:: 3.3
+
+
+ .. attribute:: BaseRotatingHandler.rotator
+
+ If this attribute is set to a callable, the :meth:`rotate` method
+ delegates to this callable. The parameters passed to the callable are
+ those passed to :meth:`rotate`.
+
+ .. versionadded:: 3.3
+
+ .. method:: BaseRotatingHandler.rotation_filename(default_name)
+
+ Modify the filename of a log file when rotating.
+
+ This is provided so that a custom filename can be provided.
+
+ The default implementation calls the 'namer' attribute of the handler,
+ if it's callable, passing the default name to it. If the attribute isn't
+ callable (the default is ``None``), the name is returned unchanged.
+
+ :param default_name: The default name for the log file.
+
+ .. versionadded:: 3.3
+
+
+ .. method:: BaseRotatingHandler.rotate(source, dest)
+
+ When rotating, rotate the current log.
+
+ The default implementation calls the 'rotator' attribute of the handler,
+ if it's callable, passing the source and dest arguments to it. If the
+ attribute isn't callable (the default is ``None``), the source is simply
+ renamed to the destination.
+
+ :param source: The source filename. This is normally the base
+ filename, e.g. 'test.log'
+ :param dest: The destination filename. This is normally
+ what the source is rotated to, e.g. 'test.log.1'.
+
+ .. versionadded:: 3.3
+
+The reason the attributes exist is to save you having to subclass - you can use
+the same callables for instances of :class:`RotatingFileHandler` and
+:class:`TimedRotatingFileHandler`. If either the namer or rotator callable
+raises an exception, this will be handled in the same way as any other
+exception during an :meth:`emit` call, i.e. via the :meth:`handleError` method
+of the handler.
+
+If you need to make more significant changes to rotation processing, you can
+override the methods.
+
+For an example, see :ref:`cookbook-rotator-namer`.
+
+
.. _rotating-file-handler:
RotatingFileHandler
@@ -452,6 +533,15 @@ supports sending logging messages to a remote or local Unix syslog.
behaviour) but can be set to ``False`` on a ``SysLogHandler`` instance
in order for that instance to *not* append the NUL terminator.
+ .. versionchanged:: 3.3
+ (See: :issue:`12419`.) In earlier versions, there was no facility for
+ an "ident" or "tag" prefix to identify the source of the message. This
+ can now be specified using a class-level attribute, defaulting to
+ ``""`` to preserve existing behaviour, but which can be overridden on
+ a ``SysLogHandler`` instance in order for that instance to prepend
+ the ident to every message handled. Note that the provided ident must
+ be text, not bytes, and is prepended to the message exactly as is.
+
.. method:: encodePriority(facility, priority)
Encodes the facility and priority into an integer. You can pass in strings
@@ -614,7 +704,7 @@ The :class:`SMTPHandler` class, located in the :mod:`logging.handlers` module,
supports sending logging messages to an email address via SMTP.
-.. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None)
+.. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)
Returns a new instance of the :class:`SMTPHandler` class. The instance is
initialized with the from and to addresses and subject line of the email. The
@@ -630,6 +720,12 @@ supports sending logging messages to an email address via SMTP.
and certificate file. (This tuple is passed to the
:meth:`smtplib.SMTP.starttls` method.)
+ A timeout can be specified for communication with the SMTP server using the
+ *timeout* argument.
+
+ .. versionadded:: 3.3
+ The *timeout* argument was added.
+
.. method:: emit(record)
Formats the record and sends it to the specified addressees.
@@ -690,7 +786,7 @@ should, then :meth:`flush` is expected to do the flushing.
.. method:: close()
- Calls :meth:`flush`, sets the target to :const:`None` and clears the
+ Calls :meth:`flush`, sets the target to ``None`` and clears the
buffer.
@@ -859,6 +955,15 @@ possible, while any potentially slow operations (such as sending an email via
Note that if you don't call this before your application exits, there
may be some records still left on the queue, which won't be processed.
+ .. method:: enqueue_sentinel()
+
+ Writes a sentinel to the queue to tell the listener to quit. This
+ implementation uses ``put_nowait()``. You may want to override this
+ method if you want to use timeouts or work with custom queue
+ implementations.
+
+ .. versionadded:: 3.3
+
.. seealso::
diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
index b6622e3..0d956b0 100644
--- a/Doc/library/logging.rst
+++ b/Doc/library/logging.rst
@@ -213,6 +213,9 @@ is the module's name in the Python package namespace.
Logs a message with level :const:`WARNING` on this logger. The arguments are
interpreted as for :meth:`debug`.
+ .. note:: There is an obsolete method ``warn`` which is functionally
+ identical to ``warning``. As ``warn`` is deprecated, please do not use
+ it - use ``warning`` instead.
.. method:: Logger.error(msg, *args, **kwargs)
@@ -492,6 +495,19 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on
want all logging times to be shown in GMT, set the ``converter``
attribute in the ``Formatter`` class.
+ .. versionchanged:: 3.3
+ Previously, the default ISO 8601 format was hard-coded as in this
+ example: ``2010-09-06 22:38:15,292`` where the part before the comma is
+ handled by a strptime format string (``'%Y-%m-%d %H:%M:%S'``), and the
+ part after the comma is a millisecond value. Because strptime does not
+ have a format placeholder for milliseconds, the millisecond value is
+ appended using another format string, ``'%s,%03d'`` – and both of these
+ format strings have been hardcoded into this method. With the change,
+ these strings are defined as class-level attributes which can be
+ overridden at the instance level when desired. The names of the
+ attributes are ``default_time_format`` (for the strptime format string)
+ and ``default_msec_format`` (for appending the millisecond value).
+
.. method:: formatException(exc_info)
Formats the specified exception information (a standard exception tuple as
@@ -901,8 +917,12 @@ functions.
.. function:: warning(msg, *args, **kwargs)
- Logs a message with level :const:`WARNING` on the root logger. The arguments are
- interpreted as for :func:`debug`.
+ Logs a message with level :const:`WARNING` on the root logger. The arguments
+ are interpreted as for :func:`debug`.
+
+ .. note:: There is an obsolete function ``warn`` which is functionally
+ identical to ``warning``. As ``warn`` is deprecated, please do not use
+ it - use ``warning`` instead.
.. function:: error(msg, *args, **kwargs)
@@ -1028,12 +1048,27 @@ functions.
| ``stream`` | Use the specified stream to initialize the |
| | StreamHandler. Note that this argument is |
| | incompatible with 'filename' - if both are |
- | | present, 'stream' is ignored. |
+ | | present, a ``ValueError`` is raised. |
+ +--------------+---------------------------------------------+
+ | ``handlers`` | If specified, this should be an iterable of |
+ | | already created handlers to add to the root |
+ | | logger. Any handlers which don't already |
+ | | have a formatter set will be assigned the |
+ | | default formatter created in this function. |
+ | | Note that this argument is incompatible |
+ | | with 'filename' or 'stream' - if both are |
+ | | present, a ``ValueError`` is raised. |
+--------------+---------------------------------------------+
.. versionchanged:: 3.2
The ``style`` argument was added.
+ .. versionchanged:: 3.3
+ The ``handlers`` argument was added. Additional checks were added to
+ catch situations where incompatible arguments are specified (e.g.
+ ``handlers`` together with ``stream`` or ``filename``, or ``stream``
+ together with ``filename``).
+
.. function:: shutdown()
diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst
new file mode 100644
index 0000000..f09fa08
--- /dev/null
+++ b/Doc/library/lzma.rst
@@ -0,0 +1,382 @@
+:mod:`lzma` --- Compression using the LZMA algorithm
+====================================================
+
+.. module:: lzma
+ :synopsis: A Python wrapper for the liblzma compression library.
+.. moduleauthor:: Nadeem Vawda <nadeem.vawda@gmail.com>
+.. sectionauthor:: Nadeem Vawda <nadeem.vawda@gmail.com>
+
+.. versionadded:: 3.3
+
+
+This module provides classes and convenience functions for compressing and
+decompressing data using the LZMA compression algorithm. Also included is a file
+interface supporting the ``.xz`` and legacy ``.lzma`` file formats used by the
+:program:`xz` utility, as well as raw compressed streams.
+
+The interface provided by this module is very similar to that of the :mod:`bz2`
+module. However, note that :class:`LZMAFile` is *not* thread-safe, unlike
+:class:`bz2.BZ2File`, so if you need to use a single :class:`LZMAFile` instance
+from multiple threads, it is necessary to protect it with a lock.
+
+
+.. exception:: LZMAError
+
+ This exception is raised when an error occurs during compression or
+ decompression, or while initializing the compressor/decompressor state.
+
+
+Reading and writing compressed files
+------------------------------------
+
+.. function:: open(filename, mode="rb", \*, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)
+
+ Open an LZMA-compressed file in binary or text mode, returning a :term:`file
+ object`.
+
+ The *filename* argument can be either an actual file name (given as a
+ :class:`str` or :class:`bytes` object), in which case the named file is
+ opened, or it can be an existing file object to read from or write to.
+
+ The *mode* argument can be any of ``"r"``, ``"rb"``, ``"w"``, ``"wb"``,
+ ``"a"`` or ``"ab"`` for binary mode, or ``"rt"``, ``"wt"``, or ``"at"`` for
+ text mode. The default is ``"rb"``.
+
+ When opening a file for reading, the *format* and *filters* arguments have
+ the same meanings as for :class:`LZMADecompressor`. In this case, the *check*
+ and *preset* arguments should not be used.
+
+ When opening a file for writing, the *format*, *check*, *preset* and
+ *filters* arguments have the same meanings as for :class:`LZMACompressor`.
+
+ For binary mode, this function is equivalent to the :class:`LZMAFile`
+ constructor: ``LZMAFile(filename, mode, ...)``. In this case, the *encoding*,
+ *errors* and *newline* arguments must not be provided.
+
+ For text mode, a :class:`LZMAFile` object is created, and wrapped in an
+ :class:`io.TextIOWrapper` instance with the specified encoding, error
+ handling behavior, and line ending(s).
+
+
+.. class:: LZMAFile(filename=None, mode="r", \*, format=None, check=-1, preset=None, filters=None)
+
+ Open an LZMA-compressed file in binary mode.
+
+ An :class:`LZMAFile` can wrap an already-open :term:`file object`, or operate
+ directly on a named file. The *filename* argument specifies either the file
+ object to wrap, or the name of the file to open (as a :class:`str` or
+ :class:`bytes` object). When wrapping an existing file object, the wrapped
+ file will not be closed when the :class:`LZMAFile` is closed.
+
+ The *mode* argument can be either ``"r"`` for reading (default), ``"w"`` for
+ overwriting, or ``"a"`` for appending. These can equivalently be given as
+ ``"rb"``, ``"wb"``, and ``"ab"`` respectively.
+
+ If *filename* is a file object (rather than an actual file name), a mode of
+ ``"w"`` does not truncate the file, and is instead equivalent to ``"a"``.
+
+ When opening a file for reading, the input file may be the concatenation of
+ multiple separate compressed streams. These are transparently decoded as a
+ single logical stream.
+
+ When opening a file for reading, the *format* and *filters* arguments have
+ the same meanings as for :class:`LZMADecompressor`. In this case, the *check*
+ and *preset* arguments should not be used.
+
+ When opening a file for writing, the *format*, *check*, *preset* and
+ *filters* arguments have the same meanings as for :class:`LZMACompressor`.
+
+ :class:`LZMAFile` supports all the members specified by
+ :class:`io.BufferedIOBase`, except for :meth:`detach` and :meth:`truncate`.
+ Iteration and the :keyword:`with` statement are supported.
+
+ The following method is also provided:
+
+ .. method:: peek(size=-1)
+
+ Return buffered data without advancing the file position. At least one
+ byte of data will be returned, unless EOF has been reached. The exact
+ number of bytes returned is unspecified (the *size* argument is ignored).
+
+
+Compressing and decompressing data in memory
+--------------------------------------------
+
+.. class:: LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)
+
+ Create a compressor object, which can be used to compress data incrementally.
+
+ For a more convenient way of compressing a single chunk of data, see
+ :func:`compress`.
+
+ The *format* argument specifies what container format should be used.
+ Possible values are:
+
+ * :const:`FORMAT_XZ`: The ``.xz`` container format.
+ This is the default format.
+
+ * :const:`FORMAT_ALONE`: The legacy ``.lzma`` container format.
+ This format is more limited than ``.xz`` -- it does not support integrity
+ checks or multiple filters.
+
+ * :const:`FORMAT_RAW`: A raw data stream, not using any container format.
+ This format specifier does not support integrity checks, and requires that
+ you always specify a custom filter chain (for both compression and
+ decompression). Additionally, data compressed in this manner cannot be
+ decompressed using :const:`FORMAT_AUTO` (see :class:`LZMADecompressor`).
+
+ The *check* argument specifies the type of integrity check to include in the
+ compressed data. This check is used when decompressing, to ensure that the
+ data has not been corrupted. Possible values are:
+
+ * :const:`CHECK_NONE`: No integrity check.
+ This is the default (and the only acceptable value) for
+ :const:`FORMAT_ALONE` and :const:`FORMAT_RAW`.
+
+ * :const:`CHECK_CRC32`: 32-bit Cyclic Redundancy Check.
+
+ * :const:`CHECK_CRC64`: 64-bit Cyclic Redundancy Check.
+ This is the default for :const:`FORMAT_XZ`.
+
+ * :const:`CHECK_SHA256`: 256-bit Secure Hash Algorithm.
+
+ If the specified check is not supported, an :class:`LZMAError` is raised.
+
+ The compression settings can be specified either as a preset compression
+ level (with the *preset* argument), or in detail as a custom filter chain
+ (with the *filters* argument).
+
+ The *preset* argument (if provided) should be an integer between ``0`` and
+ ``9`` (inclusive), optionally OR-ed with the constant
+ :const:`PRESET_EXTREME`. If neither *preset* nor *filters* are given, the
+ default behavior is to use :const:`PRESET_DEFAULT` (preset level ``6``).
+ Higher presets produce smaller output, but make the compression process
+ slower.
+
+ .. note::
+
+ In addition to being more CPU-intensive, compression with higher presets
+ also requires much more memory (and produces output that needs more memory
+ to decompress). With preset ``9`` for example, the overhead for an
+ :class:`LZMACompressor` object can be as high as 800MiB. For this reason,
+ it is generally best to stick with the default preset.
+
+ The *filters* argument (if provided) should be a filter chain specifier.
+ See :ref:`filter-chain-specs` for details.
+
+ .. method:: compress(data)
+
+ Compress *data* (a :class:`bytes` object), returning a :class:`bytes`
+ object containing compressed data for at least part of the input. Some of
+ *data* may be buffered internally, for use in later calls to
+ :meth:`compress` and :meth:`flush`. The returned data should be
+ concatenated with the output of any previous calls to :meth:`compress`.
+
+ .. method:: flush()
+
+ Finish the compression process, returning a :class:`bytes` object
+ containing any data stored in the compressor's internal buffers.
+
+ The compressor cannot be used after this method has been called.
+
+
+.. class:: LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)
+
+ Create a decompressor object, which can be used to decompress data
+ incrementally.
+
+ For a more convenient way of decompressing an entire compressed stream at
+ once, see :func:`decompress`.
+
+ The *format* argument specifies the container format that should be used. The
+ default is :const:`FORMAT_AUTO`, which can decompress both ``.xz`` and
+ ``.lzma`` files. Other possible values are :const:`FORMAT_XZ`,
+ :const:`FORMAT_ALONE`, and :const:`FORMAT_RAW`.
+
+ The *memlimit* argument specifies a limit (in bytes) on the amount of memory
+ that the decompressor can use. When this argument is used, decompression will
+ fail with an :class:`LZMAError` if it is not possible to decompress the input
+ within the given memory limit.
+
+ The *filters* argument specifies the filter chain that was used to create
+ the stream being decompressed. This argument is required if *format* is
+ :const:`FORMAT_RAW`, but should not be used for other formats.
+ See :ref:`filter-chain-specs` for more information about filter chains.
+
+ .. note::
+ This class does not transparently handle inputs containing multiple
+ compressed streams, unlike :func:`decompress` and :class:`LZMAFile`. To
+ decompress a multi-stream input with :class:`LZMADecompressor`, you must
+ create a new decompressor for each stream.
+
+ .. method:: decompress(data)
+
+ Decompress *data* (a :class:`bytes` object), returning a :class:`bytes`
+ object containing the decompressed data for at least part of the input.
+ Some of *data* may be buffered internally, for use in later calls to
+ :meth:`decompress`. The returned data should be concatenated with the
+ output of any previous calls to :meth:`decompress`.
+
+ .. attribute:: check
+
+ The ID of the integrity check used by the input stream. This may be
+ :const:`CHECK_UNKNOWN` until enough of the input has been decoded to
+ determine what integrity check it uses.
+
+ .. attribute:: eof
+
+ True if the end-of-stream marker has been reached.
+
+ .. attribute:: unused_data
+
+ Data found after the end of the compressed stream.
+
+ Before the end of the stream is reached, this will be ``b""``.
+
+
+.. function:: compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None)
+
+ Compress *data* (a :class:`bytes` object), returning the compressed data as a
+ :class:`bytes` object.
+
+ See :class:`LZMACompressor` above for a description of the *format*, *check*,
+ *preset* and *filters* arguments.
+
+
+.. function:: decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None)
+
+ Decompress *data* (a :class:`bytes` object), returning the uncompressed data
+ as a :class:`bytes` object.
+
+ If *data* is the concatenation of multiple distinct compressed streams,
+ decompress all of these streams, and return the concatenation of the results.
+
+ See :class:`LZMADecompressor` above for a description of the *format*,
+ *memlimit* and *filters* arguments.
+
+
+Miscellaneous
+-------------
+
+.. function:: is_check_supported(check)
+
+ Returns true if the given integrity check is supported on this system.
+
+ :const:`CHECK_NONE` and :const:`CHECK_CRC32` are always supported.
+ :const:`CHECK_CRC64` and :const:`CHECK_SHA256` may be unavailable if you are
+ using a version of :program:`liblzma` that was compiled with a limited
+ feature set.
+
+
+.. _filter-chain-specs:
+
+Specifying custom filter chains
+-------------------------------
+
+A filter chain specifier is a sequence of dictionaries, where each dictionary
+contains the ID and options for a single filter. Each dictionary must contain
+the key ``"id"``, and may contain additional keys to specify filter-dependent
+options. Valid filter IDs are as follows:
+
+* Compression filters:
+ * :const:`FILTER_LZMA1` (for use with :const:`FORMAT_ALONE`)
+ * :const:`FILTER_LZMA2` (for use with :const:`FORMAT_XZ` and :const:`FORMAT_RAW`)
+
+* Delta filter:
+ * :const:`FILTER_DELTA`
+
+* Branch-Call-Jump (BCJ) filters:
+ * :const:`FILTER_X86`
+ * :const:`FILTER_IA64`
+ * :const:`FILTER_ARM`
+ * :const:`FILTER_ARMTHUMB`
+ * :const:`FILTER_POWERPC`
+ * :const:`FILTER_SPARC`
+
+A filter chain can consist of up to 4 filters, and cannot be empty. The last
+filter in the chain must be a compression filter, and any other filters must be
+delta or BCJ filters.
+
+Compression filters support the following options (specified as additional
+entries in the dictionary representing the filter):
+
+ * ``preset``: A compression preset to use as a source of default values for
+ options that are not specified explicitly.
+ * ``dict_size``: Dictionary size in bytes. This should be between 4KiB and
+ 1.5GiB (inclusive).
+ * ``lc``: Number of literal context bits.
+ * ``lp``: Number of literal position bits. The sum ``lc + lp`` must be at
+ most 4.
+ * ``pb``: Number of position bits; must be at most 4.
+ * ``mode``: :const:`MODE_FAST` or :const:`MODE_NORMAL`.
+ * ``nice_len``: What should be considered a "nice length" for a match.
+ This should be 273 or less.
+ * ``mf``: What match finder to use -- :const:`MF_HC3`, :const:`MF_HC4`,
+ :const:`MF_BT2`, :const:`MF_BT3`, or :const:`MF_BT4`.
+ * ``depth``: Maximum search depth used by match finder. 0 (default) means to
+ select automatically based on other filter options.
+
+The delta filter stores the differences between bytes, producing more repetitive
+input for the compressor in certain circumstances. It only supports a single
+The delta filter supports only one option, ``dist``. This indicates the distance
+between bytes to be subtracted. The default is 1, i.e. take the differences
+between adjacent bytes.
+
+The BCJ filters are intended to be applied to machine code. They convert
+relative branches, calls and jumps in the code to use absolute addressing, with
+the aim of increasing the redundancy that can be exploited by the compressor.
+These filters support one option, ``start_offset``. This specifies the address
+that should be mapped to the beginning of the input data. The default is 0.
+
+
+Examples
+--------
+
+Reading in a compressed file::
+
+ import lzma
+ with lzma.open("file.xz") as f:
+ file_content = f.read()
+
+Creating a compressed file::
+
+ import lzma
+ data = b"Insert Data Here"
+ with lzma.open("file.xz", "w") as f:
+ f.write(data)
+
+Compressing data in memory::
+
+ import lzma
+ data_in = b"Insert Data Here"
+ data_out = lzma.compress(data_in)
+
+Incremental compression::
+
+ import lzma
+ lzc = lzma.LZMACompressor()
+ out1 = lzc.compress(b"Some data\n")
+ out2 = lzc.compress(b"Another piece of data\n")
+ out3 = lzc.compress(b"Even more data\n")
+ out4 = lzc.flush()
+ # Concatenate all the partial results:
+ result = b"".join([out1, out2, out3, out4])
+
+Writing compressed data to an already-open file::
+
+ import lzma
+ with open("file.xz", "wb") as f:
+ f.write(b"This data will not be compressed\n")
+ with lzma.open(f, "w") as lzf:
+ lzf.write(b"This *will* be compressed\n")
+ f.write(b"Not compressed\n")
+
+Creating a compressed file using a custom filter chain::
+
+ import lzma
+ my_filters = [
+ {"id": lzma.FILTER_DELTA, "dist": 5},
+ {"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME},
+ ]
+ with lzma.open("file.xz", "w", filters=my_filters) as f:
+ f.write(b"blah blah blah")
diff --git a/Doc/library/markup.rst b/Doc/library/markup.rst
index 1b4cca5..1588aa8 100644
--- a/Doc/library/markup.rst
+++ b/Doc/library/markup.rst
@@ -9,20 +9,13 @@ data markup. This includes modules to work with the Standard Generalized Markup
Language (SGML) and the Hypertext Markup Language (HTML), and several interfaces
for working with the Extensible Markup Language (XML).
-It is important to note that modules in the :mod:`xml` package require that
-there be at least one SAX-compliant XML parser available. The Expat parser is
-included with Python, so the :mod:`xml.parsers.expat` module will always be
-available.
-
-The documentation for the :mod:`xml.dom` and :mod:`xml.sax` packages are the
-definition of the Python bindings for the DOM and SAX interfaces.
-
.. toctree::
html.rst
html.parser.rst
html.entities.rst
+ xml.rst
xml.etree.elementtree.rst
xml.dom.rst
xml.dom.minidom.rst
diff --git a/Doc/library/math.rst b/Doc/library/math.rst
index 98c5b33..62c0f34 100644
--- a/Doc/library/math.rst
+++ b/Doc/library/math.rst
@@ -184,6 +184,19 @@ Power and logarithmic functions
result is calculated in a way which is accurate for *x* near zero.
+.. function:: log2(x)
+
+ Return the base-2 logarithm of *x*. This is usually more accurate than
+ ``log(x, 2)``.
+
+ .. versionadded:: 3.3
+
+ .. seealso::
+
+ :meth:`int.bit_length` returns the number of bits necessary to represent
+ an integer in binary, excluding the sign and leading zeros.
+
+
.. function:: log10(x)
Return the base-10 logarithm of *x*. This is usually more accurate
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst
index 5f0f004..1a19a7e 100644
--- a/Doc/library/mmap.rst
+++ b/Doc/library/mmap.rst
@@ -196,12 +196,16 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
move will raise a :exc:`TypeError` exception.
- .. method:: read(num)
+ .. method:: read([n])
- Return a :class:`bytes` containing up to *num* bytes starting from the
- current file position; the file position is updated to point after the
- bytes that were returned.
+ Return a :class:`bytes` containing up to *n* bytes starting from the
+ current file position. If the argument is omitted, *None* or negative,
+ return all bytes from the current file position to the end of the
+ mapping. The file position is updated to point after the bytes that were
+ returned.
+ .. versionchanged:: 3.3
+ Argument can be omitted or *None*.
.. method:: read_byte()
diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst
index 889a0c5..9d23720 100644
--- a/Doc/library/msvcrt.rst
+++ b/Doc/library/msvcrt.rst
@@ -20,6 +20,11 @@ api. The normal API deals only with ASCII characters and is of limited use
for internationalized applications. The wide char API should be used where
ever possible
+.. versionchanged:: 3.3
+ Operations in this module now raise :exc:`OSError` where :exc:`IOError`
+ was raised.
+
+
.. _msvcrt-files:
File Operations
@@ -29,7 +34,7 @@ File Operations
.. function:: locking(fd, mode, nbytes)
Lock part of a file based on file descriptor *fd* from the C runtime. Raises
- :exc:`IOError` on failure. The locked region of the file extends from the
+ :exc:`OSError` on failure. The locked region of the file extends from the
current file position for *nbytes* bytes, and may continue beyond the end of the
file. *mode* must be one of the :const:`LK_\*` constants listed below. Multiple
regions in a file may be locked at the same time, but may not overlap. Adjacent
@@ -41,13 +46,13 @@ File Operations
Locks the specified bytes. If the bytes cannot be locked, the program
immediately tries again after 1 second. If, after 10 attempts, the bytes cannot
- be locked, :exc:`IOError` is raised.
+ be locked, :exc:`OSError` is raised.
.. data:: LK_NBLCK
LK_NBRLCK
- Locks the specified bytes. If the bytes cannot be locked, :exc:`IOError` is
+ Locks the specified bytes. If the bytes cannot be locked, :exc:`OSError` is
raised.
@@ -73,7 +78,7 @@ File Operations
.. function:: get_osfhandle(fd)
- Return the file handle for the file descriptor *fd*. Raises :exc:`IOError` if
+ Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if
*fd* is not recognized.
@@ -144,4 +149,4 @@ Other Functions
.. function:: heapmin()
Force the :c:func:`malloc` heap to clean itself up and return unused blocks to
- the operating system. On failure, this raises :exc:`IOError`.
+ the operating system. On failure, this raises :exc:`OSError`.
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
index 4271fc2..82c8610 100644
--- a/Doc/library/multiprocessing.rst
+++ b/Doc/library/multiprocessing.rst
@@ -29,7 +29,7 @@ Windows.
Functionality within this package requires that the ``__main__`` module be
importable by the children. This is covered in :ref:`multiprocessing-programming`
however it is worth pointing out here. This means that some examples, such
- as the :class:`multiprocessing.Pool` examples will not work in the
+ as the :class:`multiprocessing.pool.Pool` examples will not work in the
interactive interpreter. For example::
>>> from multiprocessing import Pool
@@ -121,9 +121,7 @@ processes:
print(q.get()) # prints "[42, None, 'hello']"
p.join()
- Queues are thread and process safe, but note that they must never
- be instantiated as a side effect of importing a module: this can lead
- to a deadlock! (see :ref:`threaded-imports`)
+ Queues are thread and process safe.
**Pipes**
@@ -229,11 +227,11 @@ However, if you really do need to use some shared data then
holds Python objects and allows other processes to manipulate them using
proxies.
- A manager returned by :func:`Manager` will support types :class:`list`,
- :class:`dict`, :class:`Namespace`, :class:`Lock`, :class:`RLock`,
- :class:`Semaphore`, :class:`BoundedSemaphore`, :class:`Condition`,
- :class:`Event`, :class:`Queue`, :class:`Value` and :class:`Array`. For
- example, ::
+ A manager returned by :func:`Manager` will support types
+ :class:`list`, :class:`dict`, :class:`Namespace`, :class:`Lock`,
+ :class:`RLock`, :class:`Semaphore`, :class:`BoundedSemaphore`,
+ :class:`Condition`, :class:`Event`, :class:`Barrier`,
+ :class:`Queue`, :class:`Value` and :class:`Array`. For example, ::
from multiprocessing import Process, Manager
@@ -244,17 +242,16 @@ However, if you really do need to use some shared data then
l.reverse()
if __name__ == '__main__':
- manager = Manager()
+ with Manager() as manager:
+ d = manager.dict()
+ l = manager.list(range(10))
- d = manager.dict()
- l = manager.list(range(10))
+ p = Process(target=f, args=(d, l))
+ p.start()
+ p.join()
- p = Process(target=f, args=(d, l))
- p.start()
- p.join()
-
- print(d)
- print(l)
+ print(d)
+ print(l)
will print ::
@@ -282,10 +279,10 @@ For example::
return x*x
if __name__ == '__main__':
- pool = Pool(processes=4) # start 4 worker processes
- result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
- print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
- print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
+ with Pool(processes=4) as pool # start 4 worker processes
+ result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
+ print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
+ print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
Reference
@@ -298,7 +295,8 @@ The :mod:`multiprocessing` package mostly replicates the API of the
:class:`Process` and exceptions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. class:: Process(group=None, target=None, name=None, args=(), kwargs={})
+.. class:: Process(group=None, target=None, name=None, args=(), kwargs={}, \
+ *, daemon=None)
Process objects represent activity that is run in a separate process. The
:class:`Process` class has equivalents of all the methods of
@@ -308,18 +306,22 @@ The :mod:`multiprocessing` package mostly replicates the API of the
should always be ``None``; it exists solely for compatibility with
:class:`threading.Thread`. *target* is the callable object to be invoked by
the :meth:`run()` method. It defaults to ``None``, meaning nothing is
- called. *name* is the process name. By default, a unique name is constructed
- of the form 'Process-N\ :sub:`1`:N\ :sub:`2`:...:N\ :sub:`k`' where N\
- :sub:`1`,N\ :sub:`2`,...,N\ :sub:`k` is a sequence of integers whose length
- is determined by the *generation* of the process. *args* is the argument
- tuple for the target invocation. *kwargs* is a dictionary of keyword
- arguments for the target invocation. By default, no arguments are passed to
- *target*.
+ called. *name* is the process name (see :attr:`name` for more details).
+ *args* is the argument tuple for the target invocation. *kwargs* is a
+ dictionary of keyword arguments for the target invocation. If provided,
+ the keyword-only *daemon* argument sets the process :attr:`daemon` flag
+ to ``True`` or ``False``. If ``None`` (the default), this flag will be
+ inherited from the creating process.
+
+ By default, no arguments are passed to *target*.
If a subclass overrides the constructor, it must make sure it invokes the
base class constructor (:meth:`Process.__init__`) before doing anything else
to the process.
+ .. versionchanged:: 3.3
+ Added the *daemon* argument.
+
.. method:: run()
Method representing the process's activity.
@@ -338,10 +340,9 @@ The :mod:`multiprocessing` package mostly replicates the API of the
.. method:: join([timeout])
- Block the calling thread until the process whose :meth:`join` method is
- called terminates or until the optional timeout occurs.
-
- If *timeout* is ``None`` then there is no timeout.
+ If the optional argument *timeout* is ``None`` (the default), the method
+ blocks until the process whose :meth:`join` method is called terminates.
+ If *timeout* is a positive number, it blocks at most *timeout* seconds.
A process can be joined many times.
@@ -350,11 +351,14 @@ The :mod:`multiprocessing` package mostly replicates the API of the
.. attribute:: name
- The process's name.
+ The process's name. The name is a string used for identification purposes
+ only. It has no semantics. Multiple processes may be given the same
+ name.
- The name is a string used for identification purposes only. It has no
- semantics. Multiple processes may be given the same name. The initial
- name is set by the constructor.
+ The initial name is set by the constructor. If no explicit name is
+ provided to the constructor, a name of the form
+ 'Process-N\ :sub:`1`:N\ :sub:`2`:...:N\ :sub:`k`' is constructed, where
+ each N\ :sub:`k` is the N-th child of its parent.
.. method:: is_alive
@@ -406,6 +410,21 @@ The :mod:`multiprocessing` package mostly replicates the API of the
See :ref:`multiprocessing-auth-keys`.
+ .. attribute:: sentinel
+
+ A numeric handle of a system object which will become "ready" when
+ the process ends.
+
+ You can use this value if you want to wait on several events at
+ once using :func:`multiprocessing.connection.wait`. Otherwise
+ calling :meth:`join()` is simpler.
+
+ On Windows, this is an OS handle usable with the ``WaitForSingleObject``
+ and ``WaitForMultipleObjects`` family of API calls. On Unix, this is
+ a file descriptor usable with primitives from the :mod:`select` module.
+
+ .. versionadded:: 3.3
+
.. method:: terminate()
Terminate the process. On Unix this is done using the ``SIGTERM`` signal;
@@ -445,6 +464,9 @@ The :mod:`multiprocessing` package mostly replicates the API of the
>>> p.exitcode == -signal.SIGTERM
True
+.. exception:: ProcessError
+
+ The base class of all :mod:`multiprocessing` exceptions.
.. exception:: BufferTooShort
@@ -454,6 +476,13 @@ The :mod:`multiprocessing` package mostly replicates the API of the
If ``e`` is an instance of :exc:`BufferTooShort` then ``e.args[0]`` will give
the message as a byte string.
+.. exception:: AuthenticationError
+
+ Raised when there is an authentication error.
+
+.. exception:: TimeoutError
+
+ Raised by methods with a timeout when the timeout expires.
Pipes and Queues
~~~~~~~~~~~~~~~~
@@ -465,7 +494,7 @@ primitives like locks.
For passing messages one can use :func:`Pipe` (for a connection between two
processes) or a queue (which allows multiple producers and consumers).
-The :class:`Queue`, :class:`multiprocessing.queues.SimpleQueue` and :class:`JoinableQueue` types are multi-producer,
+The :class:`Queue`, :class:`SimpleQueue` and :class:`JoinableQueue` types are multi-producer,
multi-consumer FIFO queues modelled on the :class:`queue.Queue` class in the
standard library. They differ in that :class:`Queue` lacks the
:meth:`~queue.Queue.task_done` and :meth:`~queue.Queue.join` methods introduced
@@ -611,7 +640,7 @@ For an example of the usage of queues for interprocess communication see
exits -- see :meth:`join_thread`.
-.. class:: multiprocessing.queues.SimpleQueue()
+.. class:: SimpleQueue()
It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`.
@@ -635,8 +664,8 @@ For an example of the usage of queues for interprocess communication see
.. method:: task_done()
- Indicate that a formerly enqueued task is complete. Used by queue consumer
- threads. For each :meth:`~Queue.get` used to fetch a task, a subsequent
+ Indicate that a formerly enqueued task is complete. Used by queue
+ consumers. For each :meth:`~Queue.get` used to fetch a task, a subsequent
call to :meth:`task_done` tells the queue that the processing on the task
is complete.
@@ -653,7 +682,7 @@ For an example of the usage of queues for interprocess communication see
Block until all items in the queue have been gotten and processed.
The count of unfinished tasks goes up whenever an item is added to the
- queue. The count goes down whenever a consumer thread calls
+ queue. The count goes down whenever a consumer calls
:meth:`task_done` to indicate that the item was retrieved and all work on
it is complete. When the count of unfinished tasks drops to zero,
:meth:`~Queue.join` unblocks.
@@ -767,6 +796,9 @@ Connection objects are usually created using :func:`Pipe` -- see also
*timeout* is a number then this specifies the maximum time in seconds to
block. If *timeout* is ``None`` then an infinite timeout is used.
+ Note that multiple connection objects may be polled at once by
+ using :func:`multiprocessing.connection.wait`.
+
.. method:: send_bytes(buffer[, offset[, size]])
Send byte data from an object supporting the buffer interface as a
@@ -785,9 +817,14 @@ Connection objects are usually created using :func:`Pipe` -- see also
to receive and the other end has closed.
If *maxlength* is specified and the message is longer than *maxlength*
- then :exc:`IOError` is raised and the connection will no longer be
+ then :exc:`OSError` is raised and the connection will no longer be
readable.
+ .. versionchanged:: 3.3
+ This function used to raise a :exc:`IOError`, which is now an
+ alias of :exc:`OSError`.
+
+
.. method:: recv_bytes_into(buffer[, offset])
Read into *buffer* a complete message of byte data sent from the other end
@@ -805,6 +842,14 @@ Connection objects are usually created using :func:`Pipe` -- see also
raised and the complete message is available as ``e.args[0]`` where ``e``
is the exception instance.
+ .. versionchanged:: 3.3
+ Connection objects themselves can now be transferred between processes
+ using :meth:`Connection.send` and :meth:`Connection.recv`.
+
+ .. versionadded:: 3.3
+ Connection objects now support the context manager protocol -- see
+ :ref:`typecontextmanager`. :meth:`__enter__` returns the
+ connection object, and :meth:`__exit__` calls :meth:`close`.
For example:
@@ -856,6 +901,12 @@ program as they are in a multithreaded program. See the documentation for
Note that one can also create synchronization primitives by using a manager
object -- see :ref:`multiprocessing-managers`.
+.. class:: Barrier(parties[, action[, timeout]])
+
+ A barrier object: a clone of :class:`threading.Barrier`.
+
+ .. versionadded:: 3.3
+
.. class:: BoundedSemaphore([value])
A bounded semaphore object: a clone of :class:`threading.BoundedSemaphore`.
@@ -865,20 +916,17 @@ object -- see :ref:`multiprocessing-managers`.
.. class:: Condition([lock])
- A condition variable: a clone of :class:`threading.Condition`.
+ A condition variable: an alias for :class:`threading.Condition`.
If *lock* is specified then it should be a :class:`Lock` or :class:`RLock`
object from :mod:`multiprocessing`.
+ .. versionchanged:: 3.3
+ The :meth:`wait_for` method was added.
+
.. class:: Event()
A clone of :class:`threading.Event`.
- This method returns the state of the internal semaphore on exit, so it
- will always return ``True`` except if a timeout is given and the operation
- times out.
-
- .. versionchanged:: 3.1
- Previously, the method always returned ``None``.
.. class:: Lock()
@@ -894,6 +942,12 @@ object -- see :ref:`multiprocessing-managers`.
.. note::
+ The :meth:`acquire` and :meth:`wait` methods of each of these types
+ treat negative timeouts as zero timeouts. This differs from
+ :mod:`threading` where, since version 3.2, the equivalent
+ :meth:`acquire` methods treat negative timeouts as infinite
+ timeouts.
+
On Mac OS X, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with
a timeout will emulate that function's behavior using a sleeping loop.
@@ -915,10 +969,11 @@ Shared :mod:`ctypes` Objects
It is possible to create shared objects using shared memory which can be
inherited by child processes.
-.. function:: Value(typecode_or_type, *args[, lock])
+.. function:: Value(typecode_or_type, *args, lock=True)
Return a :mod:`ctypes` object allocated from shared memory. By default the
- return value is actually a synchronized wrapper for the object.
+ return value is actually a synchronized wrapper for the object. The object
+ itself can be accessed via the *value* attribute of a :class:`Value`.
*typecode_or_type* determines the type of the returned object: it is either a
ctypes type or a one character typecode of the kind used by the :mod:`array`
@@ -1007,7 +1062,7 @@ processes.
attributes which allow one to use it to store and retrieve strings -- see
documentation for :mod:`ctypes`.
-.. function:: Array(typecode_or_type, size_or_initializer, *args[, lock])
+.. function:: Array(typecode_or_type, size_or_initializer, *, lock=True)
The same as :func:`RawArray` except that depending on the value of *lock* a
process-safe synchronization wrapper may be returned instead of a raw ctypes
@@ -1022,7 +1077,7 @@ processes.
Note that *lock* is a keyword-only argument.
-.. function:: Value(typecode_or_type, *args[, lock])
+.. function:: Value(typecode_or_type, *args, lock=True)
The same as :func:`RawValue` except that depending on the value of *lock* a
process-safe synchronization wrapper may be returned instead of a raw ctypes
@@ -1124,8 +1179,10 @@ Managers
~~~~~~~~
Managers provide a way to create data which can be shared between different
-processes. A manager object controls a server process which manages *shared
-objects*. Other processes can access the shared objects by using proxies.
+processes, including sharing over a network between processes running on
+different machines. A manager object controls a server process which manages
+*shared objects*. Other processes can access the shared objects by using
+proxies.
.. function:: multiprocessing.Manager()
@@ -1198,9 +1255,10 @@ their parent process exits. The manager classes are defined in the
type of shared object. This must be a string.
*callable* is a callable used for creating objects for this type
- identifier. If a manager instance will be created using the
- :meth:`from_address` classmethod or if the *create_method* argument is
- ``False`` then this can be left as ``None``.
+ identifier. If a manager instance will be connected to the
+ server using the :meth:`connect` method, or if the
+ *create_method* argument is ``False`` then this can be left as
+ ``None``.
*proxytype* is a subclass of :class:`BaseProxy` which is used to create
proxies for shared objects with this *typeid*. If ``None`` then a proxy
@@ -1232,6 +1290,14 @@ their parent process exits. The manager classes are defined in the
The address used by the manager.
+ .. versionchanged:: 3.3
+ Manager objects support the context manager protocol -- see
+ :ref:`typecontextmanager`. :meth:`__enter__` starts the server
+ process (if it has not already started) and then returns the
+ manager object. :meth:`__exit__` calls :meth:`shutdown`.
+
+ In previous versions :meth:`__enter__` did not start the
+ manager's server process if it was not already started.
.. class:: SyncManager
@@ -1241,6 +1307,13 @@ their parent process exits. The manager classes are defined in the
It also supports creation of shared lists and dictionaries.
+ .. method:: Barrier(parties[, action[, timeout]])
+
+ Create a shared :class:`threading.Barrier` object and return a
+ proxy for it.
+
+ .. versionadded:: 3.3
+
.. method:: BoundedSemaphore([value])
Create a shared :class:`threading.BoundedSemaphore` object and return a
@@ -1254,6 +1327,9 @@ their parent process exits. The manager classes are defined in the
If *lock* is supplied then it should be a proxy for a
:class:`threading.Lock` or :class:`threading.RLock` object.
+ .. versionchanged:: 3.3
+ The :meth:`wait_for` method was added.
+
.. method:: Event()
Create a shared :class:`threading.Event` object and return a proxy for it.
@@ -1359,11 +1435,10 @@ callables with the manager class. For example::
MyManager.register('Maths', MathsClass)
if __name__ == '__main__':
- manager = MyManager()
- manager.start()
- maths = manager.Maths()
- print(maths.add(4, 3)) # prints 7
- print(maths.mul(7, 8)) # prints 56
+ with MyManager() as manager:
+ maths = manager.Maths()
+ print(maths.add(4, 3)) # prints 7
+ print(maths.mul(7, 8)) # prints 56
Using a remote manager
@@ -1563,7 +1638,7 @@ Process Pools
One can create a pool of processes which will carry out tasks submitted to it
with the :class:`Pool` class.
-.. class:: multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
+.. class:: Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
A process pool object which controls a pool of worker processes to which jobs
can be submitted. It supports asynchronous results with timeouts and
@@ -1658,6 +1733,24 @@ with the :class:`Pool` class.
returned iterator should be considered arbitrary. (Only when there is
only one worker process is the order guaranteed to be "correct".)
+ .. method:: starmap(func, iterable[, chunksize])
+
+ Like :meth:`map` except that the elements of the `iterable` are expected
+ to be iterables that are unpacked as arguments.
+
+ Hence an `iterable` of `[(1,2), (3, 4)]` results in `[func(1,2),
+ func(3,4)]`.
+
+ .. versionadded:: 3.3
+
+ .. method:: starmap_async(func, iterable[, chunksize[, callback[, error_back]]])
+
+ A combination of :meth:`starmap` and :meth:`map_async` that iterates over
+ `iterable` of iterables and calls `func` with the iterables unpacked.
+ Returns a result object.
+
+ .. versionadded:: 3.3
+
.. method:: close()
Prevents any more tasks from being submitted to the pool. Once all the
@@ -1674,6 +1767,11 @@ with the :class:`Pool` class.
Wait for the worker processes to exit. One must call :meth:`close` or
:meth:`terminate` before using :meth:`join`.
+ .. versionadded:: 3.3
+ Pool objects now support the context manager protocol -- see
+ :ref:`typecontextmanager`. :meth:`__enter__` returns the pool
+ object, and :meth:`__exit__` calls :meth:`terminate`.
+
.. class:: AsyncResult
@@ -1708,21 +1806,20 @@ The following example demonstrates the use of a pool::
return x*x
if __name__ == '__main__':
- pool = Pool(processes=4) # start 4 worker processes
+ with Pool(processes=4) as pool: # start 4 worker processes
+ result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously
+ print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
- result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously
- print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
+ print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
- print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
+ it = pool.imap(f, range(10))
+ print(next(it)) # prints "0"
+ print(next(it)) # prints "1"
+ print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
- it = pool.imap(f, range(10))
- print(next(it)) # prints "0"
- print(next(it)) # prints "1"
- print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
-
- import time
- result = pool.apply_async(time.sleep, (10,))
- print(result.get(timeout=1)) # raises TimeoutError
+ import time
+ result = pool.apply_async(time.sleep, (10,))
+ print(result.get(timeout=1)) # raises TimeoutError
.. _multiprocessing-listeners-clients:
@@ -1738,8 +1835,9 @@ Usually message passing between processes is done using queues or by using
However, the :mod:`multiprocessing.connection` module allows some extra
flexibility. It basically gives a high level message oriented API for dealing
-with sockets or Windows named pipes, and also has support for *digest
-authentication* using the :mod:`hmac` module.
+with sockets or Windows named pipes. It also has support for *digest
+authentication* using the :mod:`hmac` module, and for polling
+multiple connections at the same time.
.. function:: deliver_challenge(connection, authkey)
@@ -1749,15 +1847,15 @@ authentication* using the :mod:`hmac` module.
If the reply matches the digest of the message using *authkey* as the key
then a welcome message is sent to the other end of the connection. Otherwise
- :exc:`AuthenticationError` is raised.
+ :exc:`~multiprocessing.AuthenticationError` is raised.
.. function:: answerChallenge(connection, authkey)
Receive a message, calculate the digest of the message using *authkey* as the
key, and then send the digest back.
- If a welcome message is not received, then :exc:`AuthenticationError` is
- raised.
+ If a welcome message is not received, then
+ :exc:`~multiprocessing.AuthenticationError` is raised.
.. function:: Client(address[, family[, authenticate[, authkey]]])
@@ -1771,7 +1869,8 @@ authentication* using the :mod:`hmac` module.
If *authenticate* is ``True`` or *authkey* is a byte string then digest
authentication is used. The key used for authentication will be either
*authkey* or ``current_process().authkey`` if *authkey* is ``None``.
- If authentication fails then :exc:`AuthenticationError` is raised. See
+ If authentication fails then
+ :exc:`~multiprocessing.AuthenticationError` is raised. See
:ref:`multiprocessing-auth-keys`.
.. class:: Listener([address[, family[, backlog[, authenticate[, authkey]]]]])
@@ -1812,13 +1911,15 @@ authentication* using the :mod:`hmac` module.
``current_process().authkey`` is used as the authentication key. If
*authkey* is ``None`` and *authenticate* is ``False`` then no
authentication is done. If authentication fails then
- :exc:`AuthenticationError` is raised. See :ref:`multiprocessing-auth-keys`.
+ :exc:`~multiprocessing.AuthenticationError` is raised.
+ See :ref:`multiprocessing-auth-keys`.
.. method:: accept()
Accept a connection on the bound socket or named pipe of the listener
object and return a :class:`Connection` object. If authentication is
- attempted and fails, then :exc:`AuthenticationError` is raised.
+ attempted and fails, then
+ :exc:`~multiprocessing.AuthenticationError` is raised.
.. method:: close()
@@ -1837,12 +1938,44 @@ authentication* using the :mod:`hmac` module.
The address from which the last accepted connection came. If this is
unavailable then it is ``None``.
+ .. versionadded:: 3.3
+ Listener objects now support the context manager protocol -- see
+ :ref:`typecontextmanager`. :meth:`__enter__` returns the
+ listener object, and :meth:`__exit__` calls :meth:`close`.
-The module defines two exceptions:
+.. function:: wait(object_list, timeout=None)
-.. exception:: AuthenticationError
+ Wait till an object in *object_list* is ready. Returns the list of
+ those objects in *object_list* which are ready. If *timeout* is a
+ float then the call blocks for at most that many seconds. If
+ *timeout* is ``None`` then it will block for an unlimited period.
+ A negative timeout is equivalent to a zero timeout.
+
+ For both Unix and Windows, an object can appear in *object_list* if
+ it is
+
+ * a readable :class:`~multiprocessing.Connection` object;
+ * a connected and readable :class:`socket.socket` object; or
+ * the :attr:`~multiprocessing.Process.sentinel` attribute of a
+ :class:`~multiprocessing.Process` object.
+
+ A connection or socket object is ready when there is data available
+ to be read from it, or the other end has been closed.
+
+ **Unix**: ``wait(object_list, timeout)`` almost equivalent
+ ``select.select(object_list, [], [], timeout)``. The difference is
+ that, if :func:`select.select` is interrupted by a signal, it can
+ raise :exc:`OSError` with an error number of ``EINTR``, whereas
+ :func:`wait` will not.
+
+ **Windows**: An item in *object_list* must either be an integer
+ handle which is waitable (according to the definition used by the
+ documentation of the Win32 function ``WaitForMultipleObjects()``)
+ or it can be an object with a :meth:`fileno` method which returns a
+ socket handle or pipe handle. (Note that pipe handles and socket
+ handles are **not** waitable handles.)
- Exception raised when there is an authentication error.
+ .. versionadded:: 3.3
**Examples**
@@ -1855,19 +1988,16 @@ the client::
from array import array
address = ('localhost', 6000) # family is deduced to be 'AF_INET'
- listener = Listener(address, authkey=b'secret password')
- conn = listener.accept()
- print('connection accepted from', listener.last_accepted)
+ with Listener(address, authkey=b'secret password') as listener:
+ with listener.accept() as conn:
+ print('connection accepted from', listener.last_accepted)
- conn.send([2.25, None, 'junk', float])
+ conn.send([2.25, None, 'junk', float])
- conn.send_bytes(b'hello')
+ conn.send_bytes(b'hello')
- conn.send_bytes(array('i', [42, 1729]))
-
- conn.close()
- listener.close()
+ conn.send_bytes(array('i', [42, 1729]))
The following code connects to the server and receives some data from the
server::
@@ -1876,17 +2006,50 @@ server::
from array import array
address = ('localhost', 6000)
- conn = Client(address, authkey=b'secret password')
- print(conn.recv()) # => [2.25, None, 'junk', float]
+ with Client(address, authkey=b'secret password') as conn:
+ print(conn.recv()) # => [2.25, None, 'junk', float]
+
+ print(conn.recv_bytes()) # => 'hello'
+
+ arr = array('i', [0, 0, 0, 0, 0])
+ print(conn.recv_bytes_into(arr)) # => 8
+ print(arr) # => array('i', [42, 1729, 0, 0, 0])
+
+The following code uses :func:`~multiprocessing.connection.wait` to
+wait for messages from multiple processes at once::
- print(conn.recv_bytes()) # => 'hello'
+ import time, random
+ from multiprocessing import Process, Pipe, current_process
+ from multiprocessing.connection import wait
- arr = array('i', [0, 0, 0, 0, 0])
- print(conn.recv_bytes_into(arr)) # => 8
- print(arr) # => array('i', [42, 1729, 0, 0, 0])
+ def foo(w):
+ for i in range(10):
+ w.send((i, current_process().name))
+ w.close()
- conn.close()
+ if __name__ == '__main__':
+ readers = []
+
+ for i in range(4):
+ r, w = Pipe(duplex=False)
+ readers.append(r)
+ p = Process(target=foo, args=(w,))
+ p.start()
+ # We close the writable end of the pipe now to be sure that
+ # p is the only process which owns a handle for it. This
+ # ensures that when p closes its handle for the writable end,
+ # wait() will promptly report the readable end as being ready.
+ w.close()
+
+ while readers:
+ for r in wait(readers):
+ try:
+ msg = r.recv()
+ except EOFError:
+ readers.remove(r)
+ else:
+ print(msg)
.. _multiprocessing-address-formats:
@@ -2047,7 +2210,7 @@ Avoid shared state
It is probably best to stick to using queues or pipes for communication
between processes rather than using the lower level synchronization
- primitives from the :mod:`threading` module.
+ primitives.
Picklability
diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst
index 247efb7..87a50b0 100644
--- a/Doc/library/nntplib.rst
+++ b/Doc/library/nntplib.rst
@@ -70,10 +70,23 @@ The module itself defines the following classes:
connecting to an NNTP server on the local machine and intend to call
reader-specific commands, such as ``group``. If you get unexpected
:exc:`NNTPPermanentError`\ s, you might need to set *readermode*.
+ :class:`NNTP` class supports the :keyword:`with` statement to
+ unconditionally consume :exc:`socket.error` exceptions and to close the NNTP
+ connection when done. Here is a sample on how using it:
+
+ >>> from nntplib import NNTP
+ >>> with NNTP('news.gmane.org') as n:
+ ... n.group('gmane.comp.python.committers')
+ ...
+ ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
+ >>>
+
.. versionchanged:: 3.2
*usenetrc* is now False by default.
+ .. versionchanged:: 3.3
+ Support for the :keyword:`with` statement was added.
.. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout])
@@ -504,6 +517,9 @@ them have been superseded by newer commands in :rfc:`3977`.
article with message ID *id*. Most of the time, this extension is not
enabled by NNTP server administrators.
+ .. deprecated:: 3.3
+ The XPATH extension is not actively used.
+
.. XXX deprecated:
diff --git a/Doc/library/numeric.rst b/Doc/library/numeric.rst
index ba22cb6..2732a84 100644
--- a/Doc/library/numeric.rst
+++ b/Doc/library/numeric.rst
@@ -8,9 +8,9 @@ Numeric and Mathematical Modules
The modules described in this chapter provide numeric and math-related functions
and data types. The :mod:`numbers` module defines an abstract hierarchy of
numeric types. The :mod:`math` and :mod:`cmath` modules contain various
-mathematical functions for floating-point and complex numbers. For users more
-interested in decimal accuracy than in speed, the :mod:`decimal` module supports
-exact representations of decimal numbers.
+mathematical functions for floating-point and complex numbers. The :mod:`decimal`
+module supports exact representations of decimal numbers, using arbitrary precision
+arithmetic.
The following modules are documented in this chapter:
diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst
index 214e27c..20a84b6 100644
--- a/Doc/library/os.path.rst
+++ b/Doc/library/os.path.rst
@@ -70,11 +70,16 @@ applications should use string objects to access all files.
.. function:: exists(path)
- Return ``True`` if *path* refers to an existing path. Returns ``False`` for
- broken symbolic links. On some platforms, this function may return ``False`` if
- permission is not granted to execute :func:`os.stat` on the requested file, even
+ Return ``True`` if *path* refers to an existing path or an open
+ file descriptor. Returns ``False`` for broken symbolic links. On
+ some platforms, this function may return ``False`` if permission is
+ not granted to execute :func:`os.stat` on the requested file, even
if the *path* physically exists.
+ .. versionchanged:: 3.3
+ *path* can now be an integer: ``True`` is returned if it is an
+ open file descriptor, ``False`` otherwise.
+
.. function:: lexists(path)
@@ -254,7 +259,8 @@ applications should use string objects to access all files.
Availability: Unix, Windows.
- .. versionchanged:: 3.2 Added Windows support.
+ .. versionchanged:: 3.2
+ Added Windows support.
.. function:: samestat(stat1, stat2)
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 9429810..e253aac 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -96,6 +96,13 @@ These functions and data items provide information and operate on the current
process and user.
+.. function:: ctermid()
+
+ Return the filename corresponding to the controlling terminal of the process.
+
+ Availability: Unix.
+
+
.. data:: environ
A :term:`mapping` object representing the string environment. For example,
@@ -177,6 +184,28 @@ process and user.
.. versionadded:: 3.2
+.. function:: getenv(key, default=None)
+
+ Return the value of the environment variable *key* if it exists, or
+ *default* if it doesn't. *key*, *default* and the result are str.
+
+ On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding`
+ and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you
+ would like to use a different encoding.
+
+ Availability: most flavors of Unix, Windows.
+
+
+.. function:: getenvb(key, default=None)
+
+ Return the value of the environment variable *key* if it exists, or
+ *default* if it doesn't. *key*, *default* and the result are bytes.
+
+ Availability: most flavors of Unix.
+
+ .. versionadded:: 3.2
+
+
.. function:: get_exec_path(env=None)
Returns the list of directories that will be searched for a named
@@ -188,13 +217,6 @@ process and user.
.. versionadded:: 3.2
-.. function:: ctermid()
-
- Return the filename corresponding to the controlling terminal of the process.
-
- Availability: Unix.
-
-
.. function:: getegid()
Return the effective group id of the current process. This corresponds to the
@@ -221,6 +243,17 @@ process and user.
Availability: Unix.
+.. function:: getgrouplist(user, group)
+
+ Return list of group ids that *user* belongs to. If *group* is not in the
+ list, it is included; typically, *group* is specified as the group ID
+ field from the password record for *user*.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
.. function:: getgroups()
Return list of supplemental group ids associated with the current process.
@@ -242,17 +275,6 @@ process and user.
obtained with :func:`sysconfig.get_config_var`.
-.. function:: initgroups(username, gid)
-
- Call the system initgroups() to initialize the group access list with all of
- the groups of which the specified username is a member, plus the specified
- group id.
-
- Availability: Unix.
-
- .. versionadded:: 3.2
-
-
.. function:: getlogin()
Return the name of the user logged in on the controlling terminal of the
@@ -297,11 +319,40 @@ process and user.
the id returned is the one of the init process (1), on Windows it is still
the same id, which may be already reused by another process.
- Availability: Unix, Windows
+ Availability: Unix, Windows.
.. versionchanged:: 3.2
Added support for Windows.
+
+.. function:: getpriority(which, who)
+
+ .. index:: single: process; scheduling priority
+
+ Get program scheduling priority. The value *which* is one of
+ :const:`PRIO_PROCESS`, :const:`PRIO_PGRP`, or :const:`PRIO_USER`, and *who*
+ is interpreted relative to *which* (a process identifier for
+ :const:`PRIO_PROCESS`, process group identifier for :const:`PRIO_PGRP`, and a
+ user ID for :const:`PRIO_USER`). A zero value for *who* denotes
+ (respectively) the calling process, the process group of the calling process,
+ or the real user ID of the calling process.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: PRIO_PROCESS
+ PRIO_PGRP
+ PRIO_USER
+
+ Parameters for the :func:`getpriority` and :func:`setpriority` functions.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
.. function:: getresuid()
Return a tuple (ruid, euid, suid) denoting the current process's
@@ -331,24 +382,13 @@ process and user.
Availability: Unix.
-.. function:: getenv(key, default=None)
-
- Return the value of the environment variable *key* if it exists, or
- *default* if it doesn't. *key*, *default* and the result are str.
-
- On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding`
- and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you
- would like to use a different encoding.
-
- Availability: most flavors of Unix, Windows.
-
-
-.. function:: getenvb(key, default=None)
+.. function:: initgroups(username, gid)
- Return the value of the environment variable *key* if it exists, or
- *default* if it doesn't. *key*, *default* and the result are bytes.
+ Call the system initgroups() to initialize the group access list with all of
+ the groups of which the specified username is a member, plus the specified
+ group id.
- Availability: most flavors of Unix.
+ Availability: Unix.
.. versionadded:: 3.2
@@ -410,7 +450,7 @@ process and user.
.. function:: setpgrp()
- Call the system call :c:func:`setpgrp` or :c:func:`setpgrp(0, 0)` depending on
+ Call the system call :c:func:`setpgrp` or ``setpgrp(0, 0)`` depending on
which version is implemented (if any). See the Unix manual for the semantics.
Availability: Unix.
@@ -425,6 +465,25 @@ process and user.
Availability: Unix.
+.. function:: setpriority(which, who, priority)
+
+ .. index:: single: process; scheduling priority
+
+ Set program scheduling priority. The value *which* is one of
+ :const:`PRIO_PROCESS`, :const:`PRIO_PGRP`, or :const:`PRIO_USER`, and *who*
+ is interpreted relative to *which* (a process identifier for
+ :const:`PRIO_PROCESS`, process group identifier for :const:`PRIO_PGRP`, and a
+ user ID for :const:`PRIO_USER`). A zero value for *who* denotes
+ (respectively) the calling process, the process group of the calling process,
+ or the real user ID of the calling process.
+ *priority* is a value in the range -20 to 19. The default priority is 0;
+ lower priorities cause more favorable scheduling.
+
+ Availability: Unix
+
+ .. versionadded:: 3.3
+
+
.. function:: setregid(rgid, egid)
Set the current process's real and effective group ids.
@@ -511,15 +570,31 @@ process and user.
single: gethostname() (in module socket)
single: gethostbyaddr() (in module socket)
- Return a 5-tuple containing information identifying the current operating
- system. The tuple contains 5 strings: ``(sysname, nodename, release, version,
- machine)``. Some systems truncate the nodename to 8 characters or to the
+ Returns information identifying the current operating system.
+ The return value is an object with five attributes:
+
+ * :attr:`sysname` - operating system name
+ * :attr:`nodename` - name of machine on network (implementation-defined)
+ * :attr:`release` - operating system release
+ * :attr:`version` - operating system version
+ * :attr:`machine` - hardware identifier
+
+ For backwards compatibility, this object is also iterable, behaving
+ like a five-tuple containing :attr:`sysname`, :attr:`nodename`,
+ :attr:`release`, :attr:`version`, and :attr:`machine`
+ in that order.
+
+ Some systems truncate :attr:`nodename` to 8 characters or to the
leading component; a better way to get the hostname is
:func:`socket.gethostname` or even
``socket.gethostbyaddr(socket.gethostname())``.
Availability: recent flavors of Unix.
+ .. versionchanged:: 3.3
+ Return type changed from a tuple to a tuple-like object
+ with named attributes.
+
.. function:: unsetenv(key)
@@ -542,15 +617,16 @@ process and user.
File Object Creation
--------------------
-These functions create new :term:`file objects <file object>`. (See also :func:`open`.)
+This function creates new :term:`file objects <file object>`. (See also
+:func:`~os.open` for opening file descriptors.)
.. function:: fdopen(fd, *args, **kwargs)
- Return an open file object connected to the file descriptor *fd*.
- This is an alias of :func:`open` and accepts the same arguments.
- The only difference is that the first argument of :func:`fdopen`
- must always be an integer.
+ Return an open file object connected to the file descriptor *fd*. This is an
+ alias of the :func:`open` built-in function and accepts the same arguments.
+ The only difference is that the first argument of :func:`fdopen` must always
+ be an integer.
.. _os-fd-ops:
@@ -572,6 +648,7 @@ associated with a :term:`file object` when required. Note that using the file
descriptor directly will bypass the file object methods, ignoring aspects such
as internal buffering of data.
+
.. function:: close(fd)
Close file descriptor *fd*.
@@ -589,7 +666,7 @@ as internal buffering of data.
.. function:: closerange(fd_low, fd_high)
Close all file descriptors from *fd_low* (inclusive) to *fd_high* (exclusive),
- ignoring errors. Equivalent to::
+ ignoring errors. Equivalent to (but much faster than)::
for fd in range(fd_low, fd_high):
try:
@@ -622,8 +699,9 @@ as internal buffering of data.
.. function:: fchmod(fd, mode)
- Change the mode of the file given by *fd* to the numeric *mode*. See the docs
- for :func:`chmod` for possible values of *mode*.
+ Change the mode of the file given by *fd* to the numeric *mode*. See the
+ docs for :func:`chmod` for possible values of *mode*. As of Python 3.3, this
+ is equivalent to ``os.chmod(fd, mode)``.
Availability: Unix.
@@ -631,7 +709,9 @@ as internal buffering of data.
.. function:: fchown(fd, uid, gid)
Change the owner and group id of the file given by *fd* to the numeric *uid*
- and *gid*. To leave one of the ids unchanged, set it to -1.
+ and *gid*. To leave one of the ids unchanged, set it to -1. See
+ :func:`chown`. As of Python 3.3, this is equivalent to ``os.chown(fd, uid,
+ gid)``.
Availability: Unix.
@@ -662,20 +742,24 @@ as internal buffering of data.
included in ``pathconf_names``, an :exc:`OSError` is raised with
:const:`errno.EINVAL` for the error number.
+ As of Python 3.3, this is equivalent to ``os.pathconf(fd, name)``.
+
Availability: Unix.
.. function:: fstat(fd)
- Return status for file descriptor *fd*, like :func:`~os.stat`.
+ Return status for file descriptor *fd*, like :func:`~os.stat`. As of Python
+ 3.3, this is equivalent to ``os.stat(fd)``.
Availability: Unix, Windows.
.. function:: fstatvfs(fd)
- Return information about the filesystem containing the file associated with file
- descriptor *fd*, like :func:`statvfs`.
+ Return information about the filesystem containing the file associated with
+ file descriptor *fd*, like :func:`statvfs`. As of Python 3.3, this is
+ equivalent to ``os.statvfs(fd)``.
Availability: Unix.
@@ -689,13 +773,14 @@ as internal buffering of data.
``f.flush()``, and then do ``os.fsync(f.fileno())``, to ensure that all internal
buffers associated with *f* are written to disk.
- Availability: Unix, and Windows.
+ Availability: Unix, Windows.
.. function:: ftruncate(fd, length)
- Truncate the file corresponding to file descriptor *fd*, so that it is at most
- *length* bytes in size.
+ Truncate the file corresponding to file descriptor *fd*, so that it is at
+ most *length* bytes in size. As of Python 3.3, this is equivalent to
+ ``os.truncate(fd, length)``.
Availability: Unix.
@@ -708,6 +793,31 @@ as internal buffering of data.
Availability: Unix.
+.. function:: lockf(fd, cmd, len)
+
+ Apply, test or remove a POSIX lock on an open file descriptor.
+ *fd* is an open file descriptor.
+ *cmd* specifies the command to use - one of :data:`F_LOCK`, :data:`F_TLOCK`,
+ :data:`F_ULOCK` or :data:`F_TEST`.
+ *len* specifies the section of the file to lock.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: F_LOCK
+ F_TLOCK
+ F_ULOCK
+ F_TEST
+
+ Flags that specify what action :func:`lockf` will take.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
.. function:: lseek(fd, pos, how)
Set the current position of file descriptor *fd* to position *pos*, modified
@@ -724,21 +834,29 @@ as internal buffering of data.
SEEK_END
Parameters to the :func:`lseek` function. Their values are 0, 1, and 2,
- respectively. Availability: Windows, Unix.
+ respectively.
+
+ Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ Some operating systems could support additional values, like
+ :data:`os.SEEK_HOLE` or :data:`os.SEEK_DATA`.
-.. function:: open(file, flags[, mode])
+
+.. function:: open(file, flags, mode=0o777, *, dir_fd=None)
Open the file *file* and set various flags according to *flags* and possibly
- its mode according to *mode*. The default *mode* is ``0o777`` (octal), and
- the current umask value is first masked out. Return the file descriptor for
- the newly opened file.
+ its mode according to *mode*. When computing *mode*, the current umask value
+ is first masked out. Return the file descriptor for the newly opened file.
For a description of the flag and mode values, see the C run-time documentation;
flag constants (like :const:`O_RDONLY` and :const:`O_WRONLY`) are defined in
this module too (see :ref:`open-constants`). In particular, on Windows adding
:const:`O_BINARY` is needed to open files in binary mode.
+ This function can support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
Availability: Unix, Windows.
.. note::
@@ -748,6 +866,9 @@ as internal buffering of data.
:meth:`~file.read` and :meth:`~file.write` methods (and many more). To
wrap a file descriptor in a file object, use :func:`fdopen`.
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
.. function:: openpty()
@@ -768,6 +889,79 @@ as internal buffering of data.
Availability: Unix, Windows.
+.. function:: pipe2(flags)
+
+ Create a pipe with *flags* set atomically.
+ *flags* can be constructed by ORing together one or more of these values:
+ :data:`O_NONBLOCK`, :data:`O_CLOEXEC`.
+ Return a pair of file descriptors ``(r, w)`` usable for reading and writing,
+ respectively.
+
+ Availability: some flavors of Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: posix_fallocate(fd, offset, len)
+
+ Ensures that enough disk space is allocated for the file specified by *fd*
+ starting from *offset* and continuing for *len* bytes.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: posix_fadvise(fd, offset, len, advice)
+
+ Announces an intention to access data in a specific pattern thus allowing
+ the kernel to make optimizations.
+ The advice applies to the region of the file specified by *fd* starting at
+ *offset* and continuing for *len* bytes.
+ *advice* is one of :data:`POSIX_FADV_NORMAL`, :data:`POSIX_FADV_SEQUENTIAL`,
+ :data:`POSIX_FADV_RANDOM`, :data:`POSIX_FADV_NOREUSE`,
+ :data:`POSIX_FADV_WILLNEED` or :data:`POSIX_FADV_DONTNEED`.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: POSIX_FADV_NORMAL
+ POSIX_FADV_SEQUENTIAL
+ POSIX_FADV_RANDOM
+ POSIX_FADV_NOREUSE
+ POSIX_FADV_WILLNEED
+ POSIX_FADV_DONTNEED
+
+ Flags that can be used in *advice* in :func:`posix_fadvise` that specify
+ the access pattern that is likely to be used.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: pread(fd, buffersize, offset)
+
+ Read from a file descriptor, *fd*, at a position of *offset*. It will read up
+ to *buffersize* number of bytes. The file offset remains unchanged.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: pwrite(fd, string, offset)
+
+ Write *string* to a file descriptor, *fd*, from *offset*, leaving the file
+ offset unchanged.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
.. function:: read(fd, n)
Read at most *n* bytes from file descriptor *fd*. Return a bytestring containing the
@@ -779,10 +973,62 @@ as internal buffering of data.
.. note::
This function is intended for low-level I/O and must be applied to a file
- descriptor as returned by :func:`os.open` or :func:`pipe`. To read a "file object"
- returned by the built-in function :func:`open` or by :func:`popen` or
- :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or
- :meth:`~file.readline` methods.
+ descriptor as returned by :func:`os.open` or :func:`pipe`. To read a
+ "file object" returned by the built-in function :func:`open` or by
+ :func:`popen` or :func:`fdopen`, or :data:`sys.stdin`, use its
+ :meth:`~file.read` or :meth:`~file.readline` methods.
+
+
+.. function:: sendfile(out, in, offset, nbytes)
+ sendfile(out, in, offset, nbytes, headers=None, trailers=None, flags=0)
+
+ Copy *nbytes* bytes from file descriptor *in* to file descriptor *out*
+ starting at *offset*.
+ Return the number of bytes sent. When EOF is reached return 0.
+
+ The first function notation is supported by all platforms that define
+ :func:`sendfile`.
+
+ On Linux, if *offset* is given as ``None``, the bytes are read from the
+ current position of *in* and the position of *in* is updated.
+
+ The second case may be used on Mac OS X and FreeBSD where *headers* and
+ *trailers* are arbitrary sequences of buffers that are written before and
+ after the data from *in* is written. It returns the same as the first case.
+
+ On Mac OS X and FreeBSD, a value of 0 for *nbytes* specifies to send until
+ the end of *in* is reached.
+
+ On Solaris, *out* may be the file descriptor of a regular file or the file
+ descriptor of a socket. On all other platforms, *out* must be the file
+ descriptor of an open socket.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: SF_NODISKIO
+ SF_MNOWAIT
+ SF_SYNC
+
+ Parameters to the :func:`sendfile` function, if the implementation supports
+ them.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: readv(fd, buffers)
+
+ Read from a file descriptor into a number of writable buffers. *buffers* is
+ an arbitrary sequence of writable buffers. Returns the total number of bytes
+ read.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
.. function:: tcgetpgrp(fd)
@@ -826,6 +1072,17 @@ as internal buffering of data.
:meth:`~file.write` method.
+.. function:: writev(fd, buffers)
+
+ Write the contents of *buffers* to file descriptor *fd*, where *buffers*
+ is an arbitrary sequence of buffers.
+ Returns the total number of bytes written.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
.. _open-constants:
``open()`` flag constants
@@ -857,9 +1114,12 @@ or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>`_ on Window
O_NOCTTY
O_SHLOCK
O_EXLOCK
+ O_CLOEXEC
These constants are only available on Unix.
+ .. versionchanged:: 3.3
+ Add :data:`O_CLOEXEC` constant.
.. data:: O_BINARY
O_NOINHERIT
@@ -882,12 +1142,106 @@ or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>`_ on Window
the C library.
+.. data:: RTLD_LAZY
+ RTLD_NOW
+ RTLD_GLOBAL
+ RTLD_LOCAL
+ RTLD_NODELETE
+ RTLD_NOLOAD
+ RTLD_DEEPBIND
+
+ See the Unix manual page :manpage:`dlopen(3)`.
+
+ .. versionadded:: 3.3
+
+
+.. _terminal-size:
+
+Querying the size of a terminal
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 3.3
+
+.. function:: get_terminal_size(fd=STDOUT_FILENO)
+
+ Return the size of the terminal window as ``(columns, lines)``,
+ tuple of type :class:`terminal_size`.
+
+ The optional argument ``fd`` (default ``STDOUT_FILENO``, or standard
+ output) specifies which file descriptor should be queried.
+
+ If the file descriptor is not connected to a terminal, an :exc:`OSError`
+ is thrown.
+
+ :func:`shutil.get_terminal_size` is the high-level function which
+ should normally be used, ``os.get_terminal_size`` is the low-level
+ implementation.
+
+ Availability: Unix, Windows.
+
+.. class:: terminal_size
+
+ A subclass of tuple, holding ``(columns, lines)`` of the terminal window size.
+
+ .. attribute:: columns
+
+ Width of the terminal window in characters.
+
+ .. attribute:: lines
+
+ Height of the terminal window in characters.
+
+
.. _os-file-dir:
Files and Directories
---------------------
-.. function:: access(path, mode)
+On some Unix platforms, many of these functions support one or more of these
+features:
+
+.. _path_fd:
+
+* **specifying a file descriptor:**
+ For some functions, the *path* argument can be not only a string giving a path
+ name, but also a file descriptor. The function will then operate on the file
+ referred to by the descriptor. (For POSIX systems, Python will call the
+ ``f...`` version of the function.)
+
+ You can check whether or not *path* can be specified as a file descriptor on
+ your platform using :data:`os.supports_fd`. If it is unavailable, using it
+ will raise a :exc:`NotImplementedError`.
+
+ If the function also supports *dir_fd* or *follow_symlinks* arguments, it is
+ an error to specify one of those when supplying *path* as a file descriptor.
+
+.. _dir_fd:
+
+* **paths relative to directory descriptors:** If *dir_fd* is not ``None``, it
+ should be a file descriptor referring to a directory, and the path to operate
+ on should be relative; path will then be relative to that directory. If the
+ path is absolute, *dir_fd* is ignored. (For POSIX systems, Python will call
+ the ``...at`` or ``f...at`` version of the function.)
+
+ You can check whether or not *dir_fd* is supported on your platform using
+ :data:`os.supports_dir_fd`. If it is unavailable, using it will raise a
+ :exc:`NotImplementedError`.
+
+.. _follow_symlinks:
+
+* **not following symlinks:** If *follow_symlinks* is
+ ``False``, and the last element of the path to operate on is a symbolic link,
+ the function will operate on the symbolic link itself instead of the file the
+ link points to. (For POSIX systems, Python will call the ``l...`` version of
+ the function.)
+
+ You can check whether or not *follow_symlinks* is supported on your platform
+ using :data:`os.supports_follow_symlinks`. If it is unavailable, using it
+ will raise a :exc:`NotImplementedError`.
+
+
+
+.. function:: access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)
Use the real uid/gid to test for access to *path*. Note that most operations
will use the effective uid/gid, therefore this routine can be used in a
@@ -898,6 +1252,15 @@ Files and Directories
:const:`False` if not. See the Unix man page :manpage:`access(2)` for more
information.
+ This function can support specifying :ref:`paths relative to directory
+ descriptors <dir_fd>` and :ref:`not following symlinks <follow_symlinks>`.
+
+ If *effective_ids* is ``True``, :func:`access` will perform its access
+ checks using the effective uid/gid instead of the real uid/gid.
+ *effective_ids* may not be supported on your platform; you can check whether
+ or not it is available using :data:`os.supports_effective_ids`. If it is
+ unavailable, using it will raise a :exc:`NotImplementedError`.
+
Availability: Unix, Windows.
.. note::
@@ -917,11 +1280,8 @@ Files and Directories
try:
fp = open("myfile")
- except IOError as e:
- if e.errno == errno.EACCES:
- return "some default data"
- # Not a permission error.
- raise
+ except PermissionError:
+ return "some default data"
else:
with fp:
return fp.read()
@@ -932,29 +1292,18 @@ Files and Directories
succeed, particularly for operations on network filesystems which may have
permissions semantics beyond the usual POSIX permission-bit model.
+ .. versionchanged:: 3.3
+ Added the *dir_fd*, *effective_ids*, and *follow_symlinks* parameters.
-.. data:: F_OK
-
- Value to pass as the *mode* parameter of :func:`access` to test the existence of
- *path*.
-
-
-.. data:: R_OK
-
- Value to include in the *mode* parameter of :func:`access` to test the
- readability of *path*.
+.. data:: F_OK
+ R_OK
+ W_OK
+ X_OK
-.. data:: W_OK
-
- Value to include in the *mode* parameter of :func:`access` to test the
- writability of *path*.
-
-
-.. data:: X_OK
-
- Value to include in the *mode* parameter of :func:`access` to determine if
- *path* can be executed.
+ Values to pass as the *mode* parameter of :func:`access` to test the
+ existence, readability, writability and executability of *path*,
+ respectively.
.. function:: chdir(path)
@@ -963,33 +1312,17 @@ Files and Directories
Change the current working directory to *path*.
- Availability: Unix, Windows.
-
-
-.. function:: fchdir(fd)
-
- Change the current working directory to the directory represented by the file
- descriptor *fd*. The descriptor must refer to an opened directory, not an open
- file.
-
- Availability: Unix.
-
-
-.. function:: getcwd()
-
- Return a string representing the current working directory.
+ This function can support :ref:`specifying a file descriptor <path_fd>`. The
+ descriptor must refer to an opened directory, not an open file.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ Added support for specifying *path* as a file descriptor
+ on some platforms.
-.. function:: getcwdb()
-
- Return a bytestring representing the current working directory.
-
- Availability: Unix, Windows.
-
-.. function:: chflags(path, flags)
+.. function:: chflags(path, flags, *, follow_symlinks=True)
Set the flags of *path* to the numeric *flags*. *flags* may take a combination
(bitwise OR) of the following values (as defined in the :mod:`stat` module):
@@ -1007,16 +1340,15 @@ Files and Directories
* :data:`stat.SF_NOUNLINK`
* :data:`stat.SF_SNAPSHOT`
- Availability: Unix.
-
+ This function can support :ref:`not following symlinks <follow_symlinks>`.
-.. function:: chroot(path)
+ Availability: Unix.
- Change the root directory of the current process to *path*. Availability:
- Unix.
+ .. versionadded:: 3.3
+ The *follow_symlinks* argument.
-.. function:: chmod(path, mode)
+.. function:: chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
Change the mode of *path* to the numeric *mode*. *mode* may take one of the
following values (as defined in the :mod:`stat` module) or bitwise ORed
@@ -1042,28 +1374,77 @@ Files and Directories
* :data:`stat.S_IWOTH`
* :data:`stat.S_IXOTH`
+ This function can support :ref:`specifying a file descriptor <path_fd>`,
+ :ref:`paths relative to directory descriptors <dir_fd>` and :ref:`not
+ following symlinks <follow_symlinks>`.
+
Availability: Unix, Windows.
.. note::
- Although Windows supports :func:`chmod`, you can only set the file's read-only
- flag with it (via the ``stat.S_IWRITE`` and ``stat.S_IREAD``
- constants or a corresponding integer value). All other bits are
- ignored.
+ Although Windows supports :func:`chmod`, you can only set the file's
+ read-only flag with it (via the ``stat.S_IWRITE`` and ``stat.S_IREAD``
+ constants or a corresponding integer value). All other bits are ignored.
+
+ .. versionadded:: 3.3
+ Added support for specifying *path* as an open file descriptor,
+ and the *dir_fd* and *follow_symlinks* arguments.
+
+
+.. function:: chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)
+
+ Change the owner and group id of *path* to the numeric *uid* and *gid*. To
+ leave one of the ids unchanged, set it to -1.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>`,
+ :ref:`paths relative to directory descriptors <dir_fd>` and :ref:`not
+ following symlinks <follow_symlinks>`.
+
+ See :func:`shutil.chown` for a higher-level function that accepts names in
+ addition to numeric ids.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+ Added support for specifying an open file descriptor for *path*,
+ and the *dir_fd* and *follow_symlinks* arguments.
+
+
+.. function:: chroot(path)
+
+ Change the root directory of the current process to *path*.
+ Availability: Unix.
-.. function:: chown(path, uid, gid)
- Change the owner and group id of *path* to the numeric *uid* and *gid*. To leave
- one of the ids unchanged, set it to -1.
+.. function:: fchdir(fd)
+
+ Change the current working directory to the directory represented by the file
+ descriptor *fd*. The descriptor must refer to an opened directory, not an
+ open file. As of Python 3.3, this is equivalent to ``os.chdir(fd)``.
Availability: Unix.
+.. function:: getcwd()
+
+ Return a string representing the current working directory.
+
+ Availability: Unix, Windows.
+
+
+.. function:: getcwdb()
+
+ Return a bytestring representing the current working directory.
+
+ Availability: Unix, Windows.
+
+
.. function:: lchflags(path, flags)
- Set the flags of *path* to the numeric *flags*, like :func:`chflags`, but do not
- follow symbolic links.
+ Set the flags of *path* to the numeric *flags*, like :func:`chflags`, but do
+ not follow symbolic links. As of Python 3.3, this is equivalent to
+ ``os.chflags(path, flags, follow_symlinks=False)``.
Availability: Unix.
@@ -1071,110 +1452,101 @@ Files and Directories
.. function:: lchmod(path, mode)
Change the mode of *path* to the numeric *mode*. If path is a symlink, this
- affects the symlink rather than the target. See the docs for :func:`chmod`
- for possible values of *mode*.
+ affects the symlink rather than the target. See the docs for :func:`chmod`
+ for possible values of *mode*. As of Python 3.3, this is equivalent to
+ ``os.chmod(path, mode, follow_symlinks=False)``.
Availability: Unix.
.. function:: lchown(path, uid, gid)
- Change the owner and group id of *path* to the numeric *uid* and *gid*. This
- function will not follow symbolic links.
+ Change the owner and group id of *path* to the numeric *uid* and *gid*. This
+ function will not follow symbolic links. As of Python 3.3, this is equivalent
+ to ``os.chown(path, uid, gid, follow_symlinks=False)``.
Availability: Unix.
-.. function:: link(source, link_name)
+.. function:: link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)
+
+ Create a hard link pointing to *src* named *dst*.
- Create a hard link pointing to *source* named *link_name*.
+ This function can support specifying *src_dir_fd* and/or *dst_dir_fd* to
+ supply :ref:`paths relative to directory descriptors <dir_fd>`, and :ref:`not
+ following symlinks <follow_symlinks>`.
Availability: Unix, Windows.
.. versionchanged:: 3.2
Added Windows support.
+ .. versionadded:: 3.3
+ Added the *src_dir_fd*, *dst_dir_fd*, and *follow_symlinks* arguments.
+
.. function:: listdir(path='.')
Return a list containing the names of the entries in the directory given by
- *path* (default: ``'.'``). The list is in arbitrary order. It does not include the special
+ *path*. The list is in arbitrary order, and does not include the special
entries ``'.'`` and ``'..'`` even if they are present in the directory.
- This function can be called with a bytes or string argument, and returns
- filenames of the same datatype.
+ *path* may be either of type ``str`` or of type ``bytes``. If *path*
+ is of type ``bytes``, the filenames returned will also be of type ``bytes``;
+ in all other circumstances, they will be of type ``str``.
+
+ This function can also support :ref:`specifying a file descriptor
+ <path_fd>`; the file descriptor must refer to a directory.
+
+ .. note::
+ To encode ``str`` filenames to ``bytes``, use :func:`~os.fsencode`.
Availability: Unix, Windows.
.. versionchanged:: 3.2
The *path* parameter became optional.
-.. function:: lstat(path)
+ .. versionadded:: 3.3
+ Added support for specifying an open file descriptor for *path*.
+
+
+.. function:: lstat(path, *, dir_fd=None)
Perform the equivalent of an :c:func:`lstat` system call on the given path.
Similar to :func:`~os.stat`, but does not follow symbolic links. On
platforms that do not support symbolic links, this is an alias for
- :func:`~os.stat`.
+ :func:`~os.stat`. As of Python 3.3, this is equivalent to ``os.stat(path,
+ dir_fd=dir_fd, follow_symlinks=False)``.
+
+ This function can also support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
.. versionchanged:: 3.2
Added support for Windows 6.0 (Vista) symbolic links.
+ .. versionchanged:: 3.3
+ Added the *dir_fd* parameter.
-.. function:: mkfifo(path[, mode])
-
- Create a FIFO (a named pipe) named *path* with numeric mode *mode*. The
- default *mode* is ``0o666`` (octal). The current umask value is first masked
- out from the mode.
-
- FIFOs are pipes that can be accessed like regular files. FIFOs exist until they
- are deleted (for example with :func:`os.unlink`). Generally, FIFOs are used as
- rendezvous between "client" and "server" type processes: the server opens the
- FIFO for reading, and the client opens it for writing. Note that :func:`mkfifo`
- doesn't open the FIFO --- it just creates the rendezvous point.
-
- Availability: Unix.
-
-
-.. function:: mknod(filename[, mode=0o600[, device=0]])
-
- Create a filesystem node (file, device special file or named pipe) named
- *filename*. *mode* specifies both the permissions to use and the type of node
- to be created, being combined (bitwise OR) with one of ``stat.S_IFREG``,
- ``stat.S_IFCHR``, ``stat.S_IFBLK``, and ``stat.S_IFIFO`` (those constants are
- available in :mod:`stat`). For ``stat.S_IFCHR`` and ``stat.S_IFBLK``,
- *device* defines the newly created device special file (probably using
- :func:`os.makedev`), otherwise it is ignored.
-
-
-.. function:: major(device)
-
- Extract the device major number from a raw device number (usually the
- :attr:`st_dev` or :attr:`st_rdev` field from :c:type:`stat`).
-
-
-.. function:: minor(device)
-
- Extract the device minor number from a raw device number (usually the
- :attr:`st_dev` or :attr:`st_rdev` field from :c:type:`stat`).
-
-
-.. function:: makedev(major, minor)
- Compose a raw device number from the major and minor device numbers.
+.. function:: mkdir(path, mode=0o777, *, dir_fd=None)
+ Create a directory named *path* with numeric mode *mode*.
-.. function:: mkdir(path[, mode])
+ On some systems, *mode* is ignored. Where it is used, the current umask
+ value is first masked out. If the directory already exists, :exc:`OSError`
+ is raised.
- Create a directory named *path* with numeric mode *mode*. The default *mode*
- is ``0o777`` (octal). On some systems, *mode* is ignored. Where it is used,
- the current umask value is first masked out. If the directory already
- exists, :exc:`OSError` is raised.
+ This function can also support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
It is also possible to create temporary directories; see the
:mod:`tempfile` module's :func:`tempfile.mkdtemp` function.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
.. function:: makedirs(path, mode=0o777, exist_ok=False)
@@ -1205,6 +1577,60 @@ Files and Directories
The *exist_ok* parameter.
+.. function:: mkfifo(path, mode=0o666, *, dir_fd=None)
+
+ Create a FIFO (a named pipe) named *path* with numeric mode *mode*.
+ The current umask value is first masked out from the mode.
+
+ This function can also support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
+ FIFOs are pipes that can be accessed like regular files. FIFOs exist until they
+ are deleted (for example with :func:`os.unlink`). Generally, FIFOs are used as
+ rendezvous between "client" and "server" type processes: the server opens the
+ FIFO for reading, and the client opens it for writing. Note that :func:`mkfifo`
+ doesn't open the FIFO --- it just creates the rendezvous point.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
+
+.. function:: mknod(filename, mode=0o600, device=0, *, dir_fd=None)
+
+ Create a filesystem node (file, device special file or named pipe) named
+ *filename*. *mode* specifies both the permissions to use and the type of node
+ to be created, being combined (bitwise OR) with one of ``stat.S_IFREG``,
+ ``stat.S_IFCHR``, ``stat.S_IFBLK``, and ``stat.S_IFIFO`` (those constants are
+ available in :mod:`stat`). For ``stat.S_IFCHR`` and ``stat.S_IFBLK``,
+ *device* defines the newly created device special file (probably using
+ :func:`os.makedev`), otherwise it is ignored.
+
+ This function can also support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
+
+.. function:: major(device)
+
+ Extract the device major number from a raw device number (usually the
+ :attr:`st_dev` or :attr:`st_rdev` field from :c:type:`stat`).
+
+
+.. function:: minor(device)
+
+ Extract the device minor number from a raw device number (usually the
+ :attr:`st_dev` or :attr:`st_rdev` field from :c:type:`stat`).
+
+
+.. function:: makedev(major, minor)
+
+ Compose a raw device number from the major and minor device numbers.
+
+
.. function:: pathconf(path, name)
Return system configuration information relevant to a named file. *name*
@@ -1220,6 +1646,9 @@ Files and Directories
included in ``pathconf_names``, an :exc:`OSError` is raised with
:const:`errno.EINVAL` for the error number.
+ This function can support :ref:`specifying a file descriptor
+ <path_fd>`.
+
Availability: Unix.
@@ -1227,38 +1656,53 @@ Files and Directories
Dictionary mapping names accepted by :func:`pathconf` and :func:`fpathconf` to
the integer values defined for those names by the host operating system. This
- can be used to determine the set of names known to the system. Availability:
- Unix.
+ can be used to determine the set of names known to the system.
+
+ Availability: Unix.
-.. function:: readlink(path)
+.. function:: readlink(path, *, dir_fd=None)
Return a string representing the path to which the symbolic link points. The
- result may be either an absolute or relative pathname; if it is relative, it may
- be converted to an absolute pathname using ``os.path.join(os.path.dirname(path),
- result)``.
+ result may be either an absolute or relative pathname; if it is relative, it
+ may be converted to an absolute pathname using
+ ``os.path.join(os.path.dirname(path), result)``.
If the *path* is a string object, the result will also be a string object,
and the call may raise an UnicodeDecodeError. If the *path* is a bytes
object, the result will be a bytes object.
+ This function can also support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
Availability: Unix, Windows
.. versionchanged:: 3.2
Added support for Windows 6.0 (Vista) symbolic links.
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
-.. function:: remove(path)
+.. function:: remove(path, *, dir_fd=None)
Remove (delete) the file *path*. If *path* is a directory, :exc:`OSError` is
- raised; see :func:`rmdir` below to remove a directory. This is identical to
- the :func:`unlink` function documented below. On Windows, attempting to
- remove a file that is in use causes an exception to be raised; on Unix, the
- directory entry is removed but the storage allocated to the file is not made
- available until the original file is no longer in use.
+ raised. Use :func:`rmdir` to remove directories.
+
+ This function can support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
+ On Windows, attempting to remove a file that is in use causes an exception to
+ be raised; on Unix, the directory entry is removed but the storage allocated
+ to the file is not made available until the original file is no longer in use.
+
+ This function is identical to :func:`unlink`.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ The *dir_fd* argument.
+
.. function:: removedirs(path)
@@ -1274,7 +1718,7 @@ Files and Directories
successfully removed.
-.. function:: rename(src, dst)
+.. function:: rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Rename the file or directory *src* to *dst*. If *dst* is a directory,
:exc:`OSError` will be raised. On Unix, if *dst* exists and is a file, it will
@@ -1282,11 +1726,18 @@ Files and Directories
Unix flavors if *src* and *dst* are on different filesystems. If successful,
the renaming will be an atomic operation (this is a POSIX requirement). On
Windows, if *dst* already exists, :exc:`OSError` will be raised even if it is a
- file; there may be no way to implement an atomic rename when *dst* names an
- existing file.
+ file.
+
+ This function can support specifying *src_dir_fd* and/or *dst_dir_fd* to
+ supply :ref:`paths relative to directory descriptors <dir_fd>`.
+
+ If you want cross-platform overwriting of the destination, use :func:`replace`.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ The *src_dir_fd* and *dst_dir_fd* arguments.
+
.. function:: renames(old, new)
@@ -1301,22 +1752,46 @@ Files and Directories
permissions needed to remove the leaf directory or file.
-.. function:: rmdir(path)
+.. function:: replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
+
+ Rename the file or directory *src* to *dst*. If *dst* is a directory,
+ :exc:`OSError` will be raised. If *dst* exists and is a file, it will
+ be replaced silently if the user has permission. The operation may fail
+ if *src* and *dst* are on different filesystems. If successful,
+ the renaming will be an atomic operation (this is a POSIX requirement).
+
+ This function can support specifying *src_dir_fd* and/or *dst_dir_fd* to
+ supply :ref:`paths relative to directory descriptors <dir_fd>`.
+
+ Availability: Unix, Windows.
+
+ .. versionadded:: 3.3
+
+
+.. function:: rmdir(path, *, dir_fd=None)
Remove (delete) the directory *path*. Only works when the directory is
empty, otherwise, :exc:`OSError` is raised. In order to remove whole
directory trees, :func:`shutil.rmtree` can be used.
+ This function can support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ The *dir_fd* parameter.
-.. function:: stat(path)
+
+.. function:: stat(path, *, dir_fd=None, follow_symlinks=True)
Perform the equivalent of a :c:func:`stat` system call on the given path.
- (This function follows symlinks; to stat a symlink use :func:`lstat`.)
+ *path* may be specified as either a string or as an open file descriptor.
+ (This function normally follows symlinks; to stat a symlink add the argument
+ ``follow_symlinks=False``, or use :func:`lstat`.)
- The return value is an object whose attributes correspond to the members
- of the :c:type:`stat` structure, namely:
+ The return value is an object whose attributes correspond roughly
+ to the members of the :c:type:`stat` structure, namely:
* :attr:`st_mode` - protection bits,
* :attr:`st_ino` - inode number,
@@ -1325,10 +1800,18 @@ Files and Directories
* :attr:`st_uid` - user id of owner,
* :attr:`st_gid` - group id of owner,
* :attr:`st_size` - size of file, in bytes,
- * :attr:`st_atime` - time of most recent access,
- * :attr:`st_mtime` - time of most recent content modification,
- * :attr:`st_ctime` - platform dependent; time of most recent metadata change on
- Unix, or the time of creation on Windows)
+ * :attr:`st_atime` - time of most recent access expressed in seconds,
+ * :attr:`st_mtime` - time of most recent content modification
+ expressed in seconds,
+ * :attr:`st_ctime` - platform dependent; time of most recent metadata
+ change on Unix, or the time of creation on Windows, expressed in seconds
+ * :attr:`st_atime_ns` - time of most recent access
+ expressed in nanoseconds as an integer,
+ * :attr:`st_mtime_ns` - time of most recent content modification
+ expressed in nanoseconds as an integer,
+ * :attr:`st_ctime_ns` - platform dependent; time of most recent metadata
+ change on Unix, or the time of creation on Windows,
+ expressed in nanoseconds as an integer
On some Unix systems (such as Linux), the following attributes may also be
available:
@@ -1358,13 +1841,25 @@ Files and Directories
or FAT32 file systems, :attr:`st_mtime` has 2-second resolution, and
:attr:`st_atime` has only 1-day resolution. See your operating system
documentation for details.
-
- For backward compatibility, the return value of :func:`~os.stat` is also accessible
- as a tuple of at least 10 integers giving the most important (and portable)
- members of the :c:type:`stat` structure, in the order :attr:`st_mode`,
- :attr:`st_ino`, :attr:`st_dev`, :attr:`st_nlink`, :attr:`st_uid`,
- :attr:`st_gid`, :attr:`st_size`, :attr:`st_atime`, :attr:`st_mtime`,
- :attr:`st_ctime`. More items may be added at the end by some implementations.
+ Similarly, although :attr:`st_atime_ns`, :attr:`st_mtime_ns`,
+ and :attr:`st_ctime_ns` are always expressed in nanoseconds, many
+ systems do not provide nanosecond precision. On systems that do
+ provide nanosecond precision, the floating-point object used to
+ store :attr:`st_atime`, :attr:`st_mtime`, and :attr:`st_ctime`
+ cannot preserve all of it, and as such will be slightly inexact.
+ If you need the exact timestamps you should always use
+ :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns`.
+
+ For backward compatibility, the return value of :func:`~os.stat` is also
+ accessible as a tuple of at least 10 integers giving the most important (and
+ portable) members of the :c:type:`stat` structure, in the order
+ :attr:`st_mode`, :attr:`st_ino`, :attr:`st_dev`, :attr:`st_nlink`,
+ :attr:`st_uid`, :attr:`st_gid`, :attr:`st_size`, :attr:`st_atime`,
+ :attr:`st_mtime`, :attr:`st_ctime`. More items may be added at the end by
+ some implementations.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>` and
+ :ref:`not following symlinks <follow_symlinks>`.
.. index:: module: stat
@@ -1385,6 +1880,12 @@ Files and Directories
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ Added the *dir_fd* and *follow_symlinks* arguments,
+ specifying a file descriptor instead of a path,
+ and the :attr:`st_atime_ns`, :attr:`st_mtime_ns`,
+ and :attr:`st_ctime_ns` members.
+
.. function:: stat_float_times([newvalue])
@@ -1410,6 +1911,8 @@ Files and Directories
are processed, this application should turn the feature off until the library
has been corrected.
+ .. deprecated:: 3.3
+
.. function:: statvfs(path)
@@ -1425,34 +1928,118 @@ Files and Directories
read-only, and if :const:`ST_NOSUID` is set, the semantics of
setuid/setgid bits are disabled or not supported.
+ This function can support :ref:`specifying a file descriptor <path_fd>`.
+
.. versionchanged:: 3.2
The :const:`ST_RDONLY` and :const:`ST_NOSUID` constants were added.
Availability: Unix.
+ .. versionadded:: 3.3
+ Added support for specifying an open file descriptor for *path*.
-.. function:: symlink(source, link_name)
- symlink(source, link_name, target_is_directory=False)
- Create a symbolic link pointing to *source* named *link_name*.
+.. data:: supports_dir_fd
+
+ A :class:`~collections.Set` object indicating which functions in the
+ :mod:`os` module permit use of their *dir_fd* parameter. Different platforms
+ provide different functionality, and an option that might work on one might
+ be unsupported on another. For consistency's sakes, functions that support
+ *dir_fd* always allow specifying the parameter, but will throw an exception
+ if the functionality is not actually available.
+
+ To check whether a particular function permits use of its *dir_fd*
+ parameter, use the ``in`` operator on ``supports_dir_fd``. As an example,
+ this expression determines whether the *dir_fd* parameter of :func:`os.stat`
+ is locally available::
+
+ os.stat in os.supports_dir_fd
+
+ Currently *dir_fd* parameters only work on Unix platforms; none of them work
+ on Windows.
+
+ .. versionadded:: 3.3
+
+
+.. data:: supports_effective_ids
+
+ A :class:`~collections.Set` object indicating which functions in the
+ :mod:`os` module permit use of the *effective_ids* parameter for
+ :func:`os.access`. If the local platform supports it, the collection will
+ contain :func:`os.access`, otherwise it will be empty.
+
+ To check whether you can use the *effective_ids* parameter for
+ :func:`os.access`, use the ``in`` operator on ``supports_dir_fd``, like so::
+
+ os.access in os.supports_effective_ids
+
+ Currently *effective_ids* only works on Unix platforms; it does not work on
+ Windows.
+
+ .. versionadded:: 3.3
+
+
+.. data:: supports_fd
+
+ A :class:`~collections.Set` object indicating which functions in the
+ :mod:`os` module permit specifying their *path* parameter as an open file
+ descriptor. Different platforms provide different functionality, and an
+ option that might work on one might be unsupported on another. For
+ consistency's sakes, functions that support *fd* always allow specifying
+ the parameter, but will throw an exception if the functionality is not
+ actually available.
- On Windows, symlink version takes an additional optional parameter,
- *target_is_directory*, which defaults to ``False``.
+ To check whether a particular function permits specifying an open file
+ descriptor for its *path* parameter, use the ``in`` operator on
+ ``supports_fd``. As an example, this expression determines whether
+ :func:`os.chdir` accepts open file descriptors when called on your local
+ platform::
- On Windows, a symlink represents a file or a directory, and does not morph to
- the target dynamically. If *target_is_directory* is set to ``True``, the
- symlink will be created as a directory symlink, otherwise as a file symlink
- (the default).
+ os.chdir in os.supports_fd
+
+ .. versionadded:: 3.3
+
+
+.. data:: supports_follow_symlinks
+
+ A :class:`~collections.Set` object indicating which functions in the
+ :mod:`os` module permit use of their *follow_symlinks* parameter. Different
+ platforms provide different functionality, and an option that might work on
+ one might be unsupported on another. For consistency's sakes, functions that
+ support *follow_symlinks* always allow specifying the parameter, but will
+ throw an exception if the functionality is not actually available.
+
+ To check whether a particular function permits use of its *follow_symlinks*
+ parameter, use the ``in`` operator on ``supports_follow_symlinks``. As an
+ example, this expression determines whether the *follow_symlinks* parameter
+ of :func:`os.stat` is locally available::
+
+ os.stat in os.supports_follow_symlinks
+
+ .. versionadded:: 3.3
+
+
+.. function:: symlink(source, link_name, target_is_directory=False, *, dir_fd=None)
+
+ Create a symbolic link pointing to *source* named *link_name*.
+
+ On Windows, a symlink represents either a file or a directory, and does not
+ morph to the target dynamically. If *target_is_directory* is set to ``True``,
+ the symlink will be created as a directory symlink, otherwise as a file symlink
+ (the default). On non-Window platforms, *target_is_directory* is ignored.
Symbolic link support was introduced in Windows 6.0 (Vista). :func:`symlink`
will raise a :exc:`NotImplementedError` on Windows versions earlier than 6.0.
+ This function can support :ref:`paths relative to directory descriptors
+ <dir_fd>`.
+
.. note::
- The *SeCreateSymbolicLinkPrivilege* is required in order to successfully
- create symlinks. This privilege is not typically granted to regular
- users but is available to accounts which can escalate privileges to the
- administrator level. Either obtaining the privilege or running your
+ On Windows, the *SeCreateSymbolicLinkPrivilege* is required in order to
+ successfully create symlinks. This privilege is not typically granted to
+ regular users but is available to accounts which can escalate privileges
+ to the administrator level. Either obtaining the privilege or running your
application as an administrator are ways to successfully create symlinks.
:exc:`OSError` is raised when the function is called by an unprivileged
@@ -1463,31 +2050,85 @@ Files and Directories
.. versionchanged:: 3.2
Added support for Windows 6.0 (Vista) symbolic links.
+ .. versionadded:: 3.3
+ Added the *dir_fd* argument, and now allow *target_is_directory*
+ on non-Windows platforms.
+
+
+.. function:: sync()
+
+ Force write of everything to disk.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
-.. function:: unlink(path)
- Remove (delete) the file *path*. This is the same function as
- :func:`remove`; the :func:`unlink` name is its traditional Unix
- name.
+.. function:: truncate(path, length)
+
+ Truncate the file corresponding to *path*, so that it is at most
+ *length* bytes in size.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>`.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: unlink(path, *, dir_fd=None)
+
+ Remove (delete) the file *path*. This function is identical to
+ :func:`remove`; the ``unlink`` name is its traditional Unix
+ name. Please see the documentation for :func:`remove` for
+ further information.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ The *dir_fd* parameter.
+
-.. function:: utime(path, times)
+.. function:: utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)
- Set the access and modified times of the file specified by *path*. If *times*
- is ``None``, then the file's access and modified times are set to the current
- time. (The effect is similar to running the Unix program :program:`touch` on
- the path.) Otherwise, *times* must be a 2-tuple of numbers, of the form
- ``(atime, mtime)`` which is used to set the access and modified times,
- respectively. Whether a directory can be given for *path* depends on whether
- the operating system implements directories as files (for example, Windows
- does not). Note that the exact times you set here may not be returned by a
- subsequent :func:`~os.stat` call, depending on the resolution with which your
- operating system records access and modification times; see :func:`~os.stat`.
+ Set the access and modified times of the file specified by *path*.
+
+ :func:`utime` takes two optional parameters, *times* and *ns*.
+ These specify the times set on *path* and are used as follows:
+
+ - If *ns* is not ``None``,
+ it must be a 2-tuple of the form ``(atime_ns, mtime_ns)``
+ where each member is an int expressing nanoseconds.
+ - If *times* is not ``None``,
+ it must be a 2-tuple of the form ``(atime, mtime)``
+ where each member is an int or float expressing seconds.
+ - If *times* and *ns* are both ``None``,
+ this is equivalent to specifying ``ns=(atime_ns, mtime_ns)``
+ where both times are the current time.
+ (The effect is similar to running the Unix program
+ :program:`touch` on *path*.)
+
+ It is an error to specify tuples for both *times* and *ns*.
+
+ Whether a directory can be given for *path*
+ depends on whether the operating system implements directories as files
+ (for example, Windows does not). Note that the exact times you set here may
+ not be returned by a subsequent :func:`~os.stat` call, depending on the
+ resolution with which your operating system records access and modification
+ times; see :func:`~os.stat`. The best way to preserve exact times is to
+ use the *st_atime_ns* and *st_mtime_ns* fields from the :func:`os.stat`
+ result object with the *ns* parameter to `utime`.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>`,
+ :ref:`paths relative to directory descriptors <dir_fd>` and :ref:`not
+ following symlinks <follow_symlinks>`.
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ Added support for specifying an open file descriptor for *path*,
+ and the *dir_fd*, *follow_symlinks*, and *ns* parameters.
+
.. function:: walk(top, topdown=True, onerror=None, followlinks=False)
@@ -1534,9 +2175,9 @@ Files and Directories
.. note::
- Be aware that setting *followlinks* to ``True`` can lead to infinite recursion if a
- link points to a parent directory of itself. :func:`walk` does not keep track of
- the directories it visited already.
+ Be aware that setting *followlinks* to ``True`` can lead to infinite
+ recursion if a link points to a parent directory of itself. :func:`walk`
+ does not keep track of the directories it visited already.
.. note::
@@ -1572,6 +2213,137 @@ Files and Directories
os.rmdir(os.path.join(root, name))
+.. function:: fwalk(top='.', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None)
+
+ .. index::
+ single: directory; walking
+ single: directory; traversal
+
+ This behaves exactly like :func:`walk`, except that it yields a 4-tuple
+ ``(dirpath, dirnames, filenames, dirfd)``, and it supports ``dir_fd``.
+
+ *dirpath*, *dirnames* and *filenames* are identical to :func:`walk` output,
+ and *dirfd* is a file descriptor referring to the directory *dirpath*.
+
+ This function always supports :ref:`paths relative to directory descriptors
+ <dir_fd>` and :ref:`not following symlinks <follow_symlinks>`. Note however
+ that, unlike other functions, the :func:`fwalk` default value for
+ *follow_symlinks* is ``False``.
+
+ .. note::
+
+ Since :func:`fwalk` yields file descriptors, those are only valid until
+ the next iteration step, so you should duplicate them (e.g. with
+ :func:`dup`) if you want to keep them longer.
+
+ This example displays the number of bytes taken by non-directory files in each
+ directory under the starting directory, except that it doesn't look under any
+ CVS subdirectory::
+
+ import os
+ for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
+ print(root, "consumes", end="")
+ print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
+ end="")
+ print("bytes in", len(files), "non-directory files")
+ if 'CVS' in dirs:
+ dirs.remove('CVS') # don't visit CVS directories
+
+ In the next example, walking the tree bottom-up is essential:
+ :func:`rmdir` doesn't allow deleting a directory before the directory is
+ empty::
+
+ # Delete everything reachable from the directory named in "top",
+ # assuming there are no symbolic links.
+ # CAUTION: This is dangerous! For example, if top == '/', it
+ # could delete all your disk files.
+ import os
+ for root, dirs, files, rootfd in os.fwalk(top, topdown=False):
+ for name in files:
+ os.unlink(name, dir_fd=rootfd)
+ for name in dirs:
+ os.rmdir(name, dir_fd=rootfd)
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+Linux extended attributes
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 3.3
+
+These functions are all available on Linux only.
+
+.. function:: getxattr(path, attribute, *, follow_symlinks=True)
+
+ Return the value of the extended filesystem attribute *attribute* for
+ *path*. *attribute* can be bytes or str. If it is str, it is encoded
+ with the filesystem encoding.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>` and
+ :ref:`not following symlinks <follow_symlinks>`.
+
+
+.. function:: listxattr(path=None, *, follow_symlinks=True)
+
+ Return a list of the extended filesystem attributes on *path*. The
+ attributes in the list are represented as strings decoded with the filesystem
+ encoding. If *path* is ``None``, :func:`listxattr` will examine the current
+ directory.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>` and
+ :ref:`not following symlinks <follow_symlinks>`.
+
+
+.. function:: removexattr(path, attribute, *, follow_symlinks=True)
+
+ Removes the extended filesystem attribute *attribute* from *path*.
+ *attribute* should be bytes or str. If it is a string, it is encoded
+ with the filesystem encoding.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>` and
+ :ref:`not following symlinks <follow_symlinks>`.
+
+
+.. function:: setxattr(path, attribute, value, flags=0, *, follow_symlinks=True)
+
+ Set the extended filesystem attribute *attribute* on *path* to *value*.
+ *attribute* must be a bytes or str with no embedded NULs. If it is a str,
+ it is encoded with the filesystem encoding. *flags* may be
+ :data:`XATTR_REPLACE` or :data:`XATTR_CREATE`. If :data:`XATTR_REPLACE` is
+ given and the attribute does not exist, ``EEXISTS`` will be raised.
+ If :data:`XATTR_CREATE` is given and the attribute already exists, the
+ attribute will not be created and ``ENODATA`` will be raised.
+
+ This function can support :ref:`specifying a file descriptor <path_fd>` and
+ :ref:`not following symlinks <follow_symlinks>`.
+
+ .. note::
+
+ A bug in Linux kernel versions less than 2.6.39 caused the flags argument
+ to be ignored on some filesystems.
+
+
+.. data:: XATTR_SIZE_MAX
+
+ The maximum size the value of an extended attribute can be. Currently, this
+ is 64 kilobytes on Linux.
+
+
+.. data:: XATTR_CREATE
+
+ This is a possible value for the flags argument in :func:`setxattr`. It
+ indicates the operation must create an attribute.
+
+
+.. data:: XATTR_REPLACE
+
+ This is a possible value for the flags argument in :func:`setxattr`. It
+ indicates the operation must replace an existing attribute.
+
+
.. _os-process:
Process Management
@@ -1645,8 +2417,16 @@ to be ignored.
:func:`execlp`, :func:`execv`, and :func:`execvp` all cause the new process to
inherit the environment of the current process.
+ For :func:`execve` on some platforms, *path* may also be specified as an open
+ file descriptor. This functionality may not be supported on your platform;
+ you can check whether or not it is available using :data:`os.supports_fd`.
+ If it is unavailable, using it will raise a :exc:`NotImplementedError`.
+
Availability: Unix, Windows.
+ .. versionadded:: 3.3
+ Added support for specifying an open file descriptor for *path*
+ for :func:`execve`.
.. function:: _exit(n)
@@ -1836,6 +2616,8 @@ written in Python, such as a mail server's external command delivery program.
will be set to *sig*. The Windows version of :func:`kill` additionally takes
process handles to be killed.
+ See also :func:`signal.pthread_kill`.
+
.. versionadded:: 3.2
Windows support.
@@ -2026,14 +2808,30 @@ written in Python, such as a mail server's external command delivery program.
.. function:: times()
- Return a 5-tuple of floating point numbers indicating accumulated (processor
- or other) times, in seconds. The items are: user time, system time,
- children's user time, children's system time, and elapsed real time since a
- fixed point in the past, in that order. See the Unix manual page
+ Returns the current global process times.
+ The return value is an object with five attributes:
+
+ * :attr:`user` - user time
+ * :attr:`system` - system time
+ * :attr:`children_user` - user time of all child processes
+ * :attr:`children_system` - system time of all child processes
+ * :attr:`elapsed` - elapsed real time since a fixed point in the past
+
+ For backwards compatibility, this object also behaves like a five-tuple
+ containing :attr:`user`, :attr:`system`, :attr:`children_user`,
+ :attr:`children_system`, and :attr:`elapsed` in that order.
+
+ See the Unix manual page
:manpage:`times(2)` or the corresponding Windows Platform API documentation.
- On Windows, only the first two items are filled, the others are zero.
+ On Windows, only :attr:`user` and :attr:`system` are known; the other
+ attributes are zero.
+ On OS/2, only :attr:`elapsed` is known; the other attributes are zero.
- Availability: Unix, Windows
+ Availability: Unix, Windows.
+
+ .. versionchanged:: 3.3
+ Return type changed from a tuple to a tuple-like object
+ with named attributes.
.. function:: wait()
@@ -2046,6 +2844,58 @@ written in Python, such as a mail server's external command delivery program.
Availability: Unix.
+.. function:: waitid(idtype, id, options)
+
+ Wait for the completion of one or more child processes.
+ *idtype* can be :data:`P_PID`, :data:`P_PGID` or :data:`P_ALL`.
+ *id* specifies the pid to wait on.
+ *options* is constructed from the ORing of one or more of :data:`WEXITED`,
+ :data:`WSTOPPED` or :data:`WCONTINUED` and additionally may be ORed with
+ :data:`WNOHANG` or :data:`WNOWAIT`. The return value is an object
+ representing the data contained in the :c:type:`siginfo_t` structure, namely:
+ :attr:`si_pid`, :attr:`si_uid`, :attr:`si_signo`, :attr:`si_status`,
+ :attr:`si_code` or ``None`` if :data:`WNOHANG` is specified and there are no
+ children in a waitable state.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+.. data:: P_PID
+ P_PGID
+ P_ALL
+
+ These are the possible values for *idtype* in :func:`waitid`. They affect
+ how *id* is interpreted.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+.. data:: WEXITED
+ WSTOPPED
+ WNOWAIT
+
+ Flags that can be used in *options* in :func:`waitid` that specify what
+ child signal to wait for.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLD_EXITED
+ CLD_DUMPED
+ CLD_TRAPPED
+ CLD_CONTINUED
+
+ These are the possible values for :attr:`si_code` in the result returned by
+ :func:`waitid`.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
.. function:: waitpid(pid, options)
@@ -2110,7 +2960,7 @@ written in Python, such as a mail server's external command delivery program.
This option causes child processes to be reported if they have been continued
from a job control stop since their status was last reported.
- Availability: Some Unix systems.
+ Availability: some Unix systems.
.. data:: WUNTRACED
@@ -2187,6 +3037,129 @@ used to determine the disposition of a process.
Availability: Unix.
+Interface to the scheduler
+--------------------------
+
+These functions control how a process is allocated CPU time by the operating
+system. They are only available on some Unix platforms. For more detailed
+information, consult your Unix manpages.
+
+.. versionadded:: 3.3
+
+The following scheduling policies are exposed if they are a supported by the
+operating system.
+
+.. data:: SCHED_OTHER
+
+ The default scheduling policy.
+
+.. data:: SCHED_BATCH
+
+ Scheduling policy for CPU-intensive processes that tries to preserve
+ interactivity on the rest of the computer.
+
+.. data:: SCHED_IDLE
+
+ Scheduling policy for extremely low priority background tasks.
+
+.. data:: SCHED_SPORADIC
+
+ Scheduling policy for sporadic server programs.
+
+.. data:: SCHED_FIFO
+
+ A First In First Out scheduling policy.
+
+.. data:: SCHED_RR
+
+ A round-robin scheduling policy.
+
+.. data:: SCHED_RESET_ON_FORK
+
+ This flag can OR'ed with any other scheduling policy. When a process with
+ this flag set forks, its child's scheduling policy and priority are reset to
+ the default.
+
+
+.. class:: sched_param(sched_priority)
+
+ This class represents tunable scheduling parameters used in
+ :func:`sched_setparam`, :func:`sched_setscheduler`, and
+ :func:`sched_getparam`. It is immutable.
+
+ At the moment, there is only one possible parameter:
+
+ .. attribute:: sched_priority
+
+ The scheduling priority for a scheduling policy.
+
+
+.. function:: sched_get_priority_min(policy)
+
+ Get the minimum priority value for *policy*. *policy* is one of the
+ scheduling policy constants above.
+
+
+.. function:: sched_get_priority_max(policy)
+
+ Get the maximum priority value for *policy*. *policy* is one of the
+ scheduling policy constants above.
+
+
+.. function:: sched_setscheduler(pid, policy, param)
+
+ Set the scheduling policy for the process with PID *pid*. A *pid* of 0 means
+ the calling process. *policy* is one of the scheduling policy constants
+ above. *param* is a :class:`sched_param` instance.
+
+
+.. function:: sched_getscheduler(pid)
+
+ Return the scheduling policy for the process with PID *pid*. A *pid* of 0
+ means the calling process. The result is one of the scheduling policy
+ constants above.
+
+
+.. function:: sched_setparam(pid, param)
+
+ Set a scheduling parameters for the process with PID *pid*. A *pid* of 0 means
+ the calling process. *param* is a :class:`sched_param` instance.
+
+
+.. function:: sched_getparam(pid)
+
+ Return the scheduling parameters as a :class:`sched_param` instance for the
+ process with PID *pid*. A *pid* of 0 means the calling process.
+
+
+.. function:: sched_rr_get_interval(pid)
+
+ Return the round-robin quantum in seconds for the process with PID *pid*. A
+ *pid* of 0 means the calling process.
+
+
+.. function:: sched_yield()
+
+ Voluntarily relinquish the CPU.
+
+
+.. function:: sched_setaffinity(pid, mask)
+
+ Restrict the process with PID *pid* (or the current process if zero) to a
+ set of CPUs. *mask* is an iterable of integers representing the set of
+ CPUs to which the process should be restricted.
+
+
+.. function:: sched_getaffinity(pid)
+
+ Return the set of CPUs the process with PID *pid* (or the current process
+ if zero) is restricted to.
+
+ .. seealso::
+ :func:`multiprocessing.cpu_count` returns the number of CPUs in the
+ system.
+
+
.. _os-path:
Miscellaneous System Information
@@ -2211,7 +3184,7 @@ Miscellaneous System Information
included in ``confstr_names``, an :exc:`OSError` is raised with
:const:`errno.EINVAL` for the error number.
- Availability: Unix
+ Availability: Unix.
.. data:: confstr_names
@@ -2333,6 +3306,9 @@ Miscellaneous Functions
This function returns random bytes from an OS-specific randomness source. The
returned data should be unpredictable enough for cryptographic applications,
- though its exact quality depends on the OS implementation. On a UNIX-like
+ though its exact quality depends on the OS implementation. On a Unix-like
system this will query /dev/urandom, and on Windows it will use CryptGenRandom.
If a randomness source is not found, :exc:`NotImplementedError` will be raised.
+
+ For an easy-to-use interface to the random number generator
+ provided by your platform, please see :class:`random.SystemRandom`.
diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst
index ed84413..3002700 100644
--- a/Doc/library/ossaudiodev.rst
+++ b/Doc/library/ossaudiodev.rst
@@ -38,6 +38,10 @@ the standard audio interface for Linux and recent versions of FreeBSD.
This probably all warrants a footnote or two, but I don't understand
things well enough right now to write it! --GPW
+.. versionchanged:: 3.3
+ Operations in this module now raise :exc:`OSError` where :exc:`IOError`
+ was raised.
+
.. seealso::
@@ -56,7 +60,7 @@ the standard audio interface for Linux and recent versions of FreeBSD.
what went wrong.
(If :mod:`ossaudiodev` receives an error from a system call such as
- :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`IOError`.
+ :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`OSError`.
Errors detected directly by :mod:`ossaudiodev` result in :exc:`OSSAudioError`.)
(For backwards compatibility, the exception class is also available as
@@ -169,7 +173,7 @@ The following methods each map to exactly one :func:`ioctl` system call. The
correspondence is obvious: for example, :meth:`setfmt` corresponds to the
``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can
be useful when consulting the OSS documentation). If the underlying
-:func:`ioctl` fails, they all raise :exc:`IOError`.
+:func:`ioctl` fails, they all raise :exc:`OSError`.
.. method:: oss_audio_device.nonblock()
@@ -345,7 +349,7 @@ The mixer object provides two file-like methods:
.. method:: oss_mixer_device.close()
This method closes the open mixer device file. Any further attempts to use the
- mixer after this file is closed will raise an :exc:`IOError`.
+ mixer after this file is closed will raise an :exc:`OSError`.
.. method:: oss_mixer_device.fileno()
@@ -404,7 +408,7 @@ The remaining methods are specific to audio mixing:
returned, but both volumes are the same.
Raises :exc:`OSSAudioError` if an invalid control was is specified, or
- :exc:`IOError` if an unsupported control is specified.
+ :exc:`OSError` if an unsupported control is specified.
.. method:: oss_mixer_device.set(control, (left, right))
@@ -428,7 +432,7 @@ The remaining methods are specific to audio mixing:
.. method:: oss_mixer_device.set_recsrc(bitmask)
Call this function to specify a recording source. Returns a bitmask indicating
- the new recording source (or sources) if successful; raises :exc:`IOError` if an
+ the new recording source (or sources) if successful; raises :exc:`OSError` if an
invalid source was specified. To set the current recording source to the
microphone input::
diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst
index 1e9de63..f4e37ac 100644
--- a/Doc/library/pdb.rst
+++ b/Doc/library/pdb.rst
@@ -38,6 +38,11 @@ of the debugger is::
> <string>(1)?()
(Pdb)
+.. versionchanged:: 3.3
+ Tab-completion via the :mod:`readline` module is available for commands and
+ command arguments, e.g. the current global and local names are offered as
+ arguments of the ``print`` command.
+
:file:`pdb.py` can also be invoked as a script to debug other scripts. For
example::
diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst
index a1f9af2..287a08b 100644
--- a/Doc/library/pickle.rst
+++ b/Doc/library/pickle.rst
@@ -287,6 +287,29 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and
See :ref:`pickle-persistent` for details and examples of uses.
+ .. attribute:: dispatch_table
+
+ A pickler object's dispatch table is a registry of *reduction
+ functions* of the kind which can be declared using
+ :func:`copyreg.pickle`. It is a mapping whose keys are classes
+ and whose values are reduction functions. A reduction function
+ takes a single argument of the associated class and should
+ conform to the same interface as a :meth:`~object.__reduce__`
+ method.
+
+ By default, a pickler object will not have a
+ :attr:`dispatch_table` attribute, and it will instead use the
+ global dispatch table managed by the :mod:`copyreg` module.
+ However, to customize the pickling for a specific pickler object
+ one can set the :attr:`dispatch_table` attribute to a dict-like
+ object. Alternatively, if a subclass of :class:`Pickler` has a
+ :attr:`dispatch_table` attribute then this will be used as the
+ default dispatch table for instances of that class.
+
+ See :ref:`pickle-dispatch` for usage examples.
+
+ .. versionadded:: 3.3
+
.. attribute:: fast
Deprecated. Enable fast mode if set to a true value. The fast mode
@@ -577,6 +600,44 @@ pickle external objects by reference.
.. literalinclude:: ../includes/dbpickle.py
+.. _pickle-dispatch:
+
+Dispatch Tables
+^^^^^^^^^^^^^^^
+
+If one wants to customize pickling of some classes without disturbing
+any other code which depends on pickling, then one can create a
+pickler with a private dispatch table.
+
+The global dispatch table managed by the :mod:`copyreg` module is
+available as :data:`copyreg.dispatch_table`. Therefore, one may
+choose to use a modified copy of :data:`copyreg.dispatch_table` as a
+private dispatch table.
+
+For example ::
+
+ f = io.BytesIO()
+ p = pickle.Pickler(f)
+ p.dispatch_table = copyreg.dispatch_table.copy()
+ p.dispatch_table[SomeClass] = reduce_SomeClass
+
+creates an instance of :class:`pickle.Pickler` with a private dispatch
+table which handles the ``SomeClass`` class specially. Alternatively,
+the code ::
+
+ class MyPickler(pickle.Pickler):
+ dispatch_table = copyreg.dispatch_table.copy()
+ dispatch_table[SomeClass] = reduce_SomeClass
+ f = io.BytesIO()
+ p = MyPickler(f)
+
+does the same, but all instances of ``MyPickler`` will by default
+share the same dispatch table. The equivalent code using the
+:mod:`copyreg` module is ::
+
+ copyreg.pickle(SomeClass, reduce_SomeClass)
+ f = io.BytesIO()
+ p = pickle.Pickler(f)
.. _pickle-state:
diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst
index 3118ff2..22d44eb 100644
--- a/Doc/library/pkgutil.rst
+++ b/Doc/library/pkgutil.rst
@@ -56,21 +56,32 @@ support.
Note that :class:`ImpImporter` does not currently support being used by
placement on :data:`sys.meta_path`.
+ .. deprecated:: 3.3
+ This emulation is no longer needed, as the standard import mechanism
+ is now fully PEP 302 compliant and available in :mod:`importlib`
+
.. class:: ImpLoader(fullname, file, filename, etc)
:pep:`302` Loader that wraps Python's "classic" import algorithm.
+ .. deprecated:: 3.3
+ This emulation is no longer needed, as the standard import mechanism
+ is now fully PEP 302 compliant and available in :mod:`importlib`
+
.. function:: find_loader(fullname)
- Find a :pep:`302` "loader" object for *fullname*.
+ Retrieve a :pep:`302` module loader for the given *fullname*.
- If *fullname* contains dots, path must be the containing package's
- ``__path__``. Returns ``None`` if the module cannot be found or imported.
- This function uses :func:`iter_importers`, and is thus subject to the same
- limitations regarding platform-specific special import locations such as the
- Windows registry.
+ This is a convenience wrapper around :func:`importlib.find_loader` that
+ sets the *path* argument correctly when searching for submodules, and
+ also ensures parent packages (if any) are imported before searching for
+ submodules.
+
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
.. function:: get_importer(path_item)
@@ -80,13 +91,13 @@ support.
The returned importer is cached in :data:`sys.path_importer_cache` if it was
newly created by a path hook.
- If there is no importer, a wrapper around the basic import machinery is
- returned. This wrapper is never inserted into the importer cache (``None``
- is inserted instead).
-
The cache (or part of it) can be cleared manually if a rescan of
:data:`sys.path_hooks` is necessary.
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
+
.. function:: get_loader(module_or_name)
@@ -102,46 +113,52 @@ support.
limitations regarding platform-specific special import locations such as the
Windows registry.
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
+
.. function:: iter_importers(fullname='')
Yield :pep:`302` importers for the given module name.
- If fullname contains a '.', the importers will be for the package containing
- fullname, otherwise they will be importers for :data:`sys.meta_path`,
- :data:`sys.path`, and Python's "classic" import machinery, in that order. If
- the named module is in a package, that package is imported as a side effect
- of invoking this function.
+ If fullname contains a '.', the importers will be for the package
+ containing fullname, otherwise they will be all registered top level
+ importers (i.e. those on both sys.meta_path and sys.path_hooks).
- Non-:pep:`302` mechanisms (e.g. the Windows registry) used by the standard
- import machinery to find files in alternative locations are partially
- supported, but are searched *after* :data:`sys.path`. Normally, these
- locations are searched *before* :data:`sys.path`, preventing :data:`sys.path`
- entries from shadowing them.
+ If the named module is in a package, that package is imported as a side
+ effect of invoking this function.
- For this to cause a visible difference in behaviour, there must be a module
- or package name that is accessible via both :data:`sys.path` and one of the
- non-:pep:`302` file system mechanisms. In this case, the emulation will find
- the former version, while the builtin import mechanism will find the latter.
+ If no module name is specified, all top level importers are produced.
- Items of the following types can be affected by this discrepancy:
- ``imp.C_EXTENSION``, ``imp.PY_SOURCE``, ``imp.PY_COMPILED``,
- ``imp.PKG_DIRECTORY``.
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
.. function:: iter_modules(path=None, prefix='')
- Yields ``(module_loader, name, ispkg)`` for all submodules on *path*, or, if
+ Yields ``(module_finder, name, ispkg)`` for all submodules on *path*, or, if
path is ``None``, all top-level modules on ``sys.path``.
*path* should be either ``None`` or a list of paths to look for modules in.
*prefix* is a string to output on the front of every module name on output.
+ .. note::
+ Only works for a :term:`finder` which defines an ``iter_modules()``
+ method. This interface is non-standard, so the module also provides
+ implementations for :class:`importlib.machinery.FileFinder` and
+ :class:`zipimport.zipimporter`.
+
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
+
.. function:: walk_packages(path=None, prefix='', onerror=None)
- Yields ``(module_loader, name, ispkg)`` for all modules recursively on
+ Yields ``(module_finder, name, ispkg)`` for all modules recursively on
*path*, or, if path is ``None``, all accessible modules.
*path* should be either ``None`` or a list of paths to look for modules in.
@@ -166,6 +183,16 @@ support.
# list all submodules of ctypes
walk_packages(ctypes.__path__, ctypes.__name__ + '.')
+ .. note::
+ Only works for a :term:`finder` which defines an ``iter_modules()``
+ method. This interface is non-standard, so the module also provides
+ implementations for :class:`importlib.machinery.FileFinder` and
+ :class:`zipimport.zipimporter`.
+
+ .. versionchanged:: 3.3
+ Updated to be based directly on :mod:`importlib` rather than relying
+ on the package internal PEP 302 import emulation.
+
.. function:: get_data(package, resource)
diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst
index 157ac3a..a6a98f1 100644
--- a/Doc/library/platform.rst
+++ b/Doc/library/platform.rst
@@ -30,8 +30,8 @@ Cross Platform
returned as strings.
Values that cannot be determined are returned as given by the parameter presets.
- If bits is given as ``''``, the :c:func:`sizeof(pointer)` (or
- :c:func:`sizeof(long)` on Python version < 1.5.2) is used as indicator for the
+ If bits is given as ``''``, the ``sizeof(pointer)`` (or
+ ``sizeof(long)`` on Python version < 1.5.2) is used as indicator for the
supported pointer size.
The function relies on the system's :file:`file` command to do the actual work.
@@ -158,14 +158,20 @@ Cross Platform
.. function:: uname()
- Fairly portable uname interface. Returns a tuple of strings ``(system, node,
- release, version, machine, processor)`` identifying the underlying platform.
+ Fairly portable uname interface. Returns a :func:`~collections.namedtuple`
+ containing six attributes: :attr:`system`, :attr:`node`, :attr:`release`,
+ :attr:`version`, :attr:`machine`, and :attr:`processor`.
- Note that unlike the :func:`os.uname` function this also returns possible
- processor information as additional tuple entry.
+ Note that this adds a sixth attribute (:attr:`processor`) not present
+ in the :func:`os.uname` result. Also, the attribute names are different
+ for the first two attributes; :func:`os.uname` names them
+ :attr:`sysname` and :attr:`nodename`.
Entries which cannot be determined are set to ``''``.
+ .. versionchanged:: 3.3
+ Result changed from a tuple to a namedtuple.
+
Java Platform
-------------
@@ -214,6 +220,10 @@ Win95/98 specific
preferring :func:`win32pipe.popen`. On Windows NT, :func:`win32pipe.popen`
should work; on Windows 9x it hangs due to bugs in the MS C library.
+ .. deprecated:: 3.3
+ This function is obsolete. Use the :mod:`subprocess` module. Check
+ especially the :ref:`subprocess-replacements` section.
+
Mac OS Platform
---------------
diff --git a/Doc/library/random.rst b/Doc/library/random.rst
index 1cd4d26..55c9d70 100644
--- a/Doc/library/random.rst
+++ b/Doc/library/random.rst
@@ -43,6 +43,12 @@ The :mod:`random` module also provides the :class:`SystemRandom` class which
uses the system function :func:`os.urandom` to generate random numbers
from sources provided by the operating system.
+.. warning::
+
+ The generators of the :mod:`random` module should not be used for security
+ purposes. Use :func:`ssl.RAND_bytes` if you require a cryptographically
+ secure pseudorandom number generator.
+
Bookkeeping functions:
@@ -145,6 +151,9 @@ Functions for sequences:
argument. This is especially fast and space efficient for sampling from a large
population: ``sample(range(10000000), 60)``.
+ If the sample size is larger than the population size, a :exc:`ValueError`
+ is raised.
+
The following functions generate specific real-valued distributions. Function
parameters are named after the corresponding variables in the distribution's
equation, as used in common mathematical practice; most of these equations can
diff --git a/Doc/library/re.rst b/Doc/library/re.rst
index 26f2a38..b0cb870 100644
--- a/Doc/library/re.rst
+++ b/Doc/library/re.rst
@@ -414,17 +414,24 @@ Most of the standard escapes supported by Python string literals are also
accepted by the regular expression parser::
\a \b \f \n
- \r \t \v \x
- \\
+ \r \t \u \U
+ \v \x \\
(Note that ``\b`` is used to represent word boundaries, and means "backspace"
only inside character classes.)
+``'\u'`` and ``'\U'`` escape sequences are only recognized in Unicode
+patterns. In bytes patterns they are not treated specially.
+
Octal escapes are included in a limited form. If the first digit is a 0, or if
there are three octal digits, it is considered an octal escape. Otherwise, it is
a group reference. As for string literals, octal escapes are always at most
three digits in length.
+.. versionchanged:: 3.3
+ The ``'\u'`` and ``'\U'`` escape sequences have been added.
+
+
.. _contents-of-module-re:
@@ -684,9 +691,12 @@ form.
.. function:: escape(string)
- Return *string* with all non-alphanumerics backslashed; this is useful if you
- want to match an arbitrary literal string that may have regular expression
- metacharacters in it.
+ Escape all the characters in pattern except ASCII letters, numbers and ``'_'``.
+ This is useful if you want to match an arbitrary literal string that may
+ have regular expression metacharacters in it.
+
+ .. versionchanged:: 3.3
+ The ``'_'`` character is no longer escaped.
.. function:: purge()
diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst
index ab55197..1134619 100644
--- a/Doc/library/readline.rst
+++ b/Doc/library/readline.rst
@@ -199,7 +199,7 @@ normally be executed automatically during interactive sessions from the user's
histfile = os.path.join(os.path.expanduser("~"), ".pyhist")
try:
readline.read_history_file(histfile)
- except IOError:
+ except FileNotFoundError:
pass
import atexit
atexit.register(readline.write_history_file, histfile)
@@ -224,7 +224,7 @@ support history save/restore. ::
if hasattr(readline, "read_history_file"):
try:
readline.read_history_file(histfile)
- except IOError:
+ except FileNotFoundError:
pass
atexit.register(self.save_history, histfile)
diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst
index c16b013..03a7cb5 100644
--- a/Doc/library/resource.rst
+++ b/Doc/library/resource.rst
@@ -14,13 +14,15 @@ resources utilized by a program.
Symbolic constants are used to specify particular system resources and to
request usage information about either the current process or its children.
-A single exception is defined for errors:
+An :exc:`OSError` is raised on syscall failure.
.. exception:: error
- The functions described below may raise this error if the underlying system call
- failures unexpectedly.
+ A deprecated alias of :exc:`OSError`.
+
+ .. versionchanged:: 3.3
+ Following :pep:`3151`, this class was made an alias of :exc:`OSError`.
Resource Limits
diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst
index 000dba0..d6c86c7 100644
--- a/Doc/library/sched.rst
+++ b/Doc/library/sched.rst
@@ -14,7 +14,7 @@
The :mod:`sched` module defines a class which implements a general purpose event
scheduler:
-.. class:: scheduler(timefunc, delayfunc)
+.. class:: scheduler(timefunc=time.time, delayfunc=time.sleep)
The :class:`scheduler` class defines a generic interface to scheduling events.
It needs two functions to actually deal with the "outside world" --- *timefunc*
@@ -25,6 +25,12 @@ scheduler:
event is run to allow other threads an opportunity to run in multi-threaded
applications.
+ .. versionchanged:: 3.3
+ *timefunc* and *delayfunc* parameters are optional.
+ .. versionchanged:: 3.3
+ :class:`scheduler` class can be safely used in multi-threaded
+ environments.
+
Example::
>>> import sched, time
@@ -44,33 +50,6 @@ Example::
From print_time 930343700.273
930343700.276
-In multi-threaded environments, the :class:`scheduler` class has limitations
-with respect to thread-safety, inability to insert a new task before
-the one currently pending in a running scheduler, and holding up the main
-thread until the event queue is empty. Instead, the preferred approach
-is to use the :class:`threading.Timer` class instead.
-
-Example::
-
- >>> import time
- >>> from threading import Timer
- >>> def print_time():
- ... print("From print_time", time.time())
- ...
- >>> def print_some_times():
- ... print(time.time())
- ... Timer(5, print_time, ()).start()
- ... Timer(10, print_time, ()).start()
- ... time.sleep(11) # sleep while time-delay events execute
- ... print(time.time())
- ...
- >>> print_some_times()
- 930343690.257
- From print_time 930343695.274
- From print_time 930343700.273
- 930343701.301
-
-
.. _scheduler-objects:
Scheduler Objects
@@ -79,26 +58,38 @@ Scheduler Objects
:class:`scheduler` instances have the following methods and attributes:
-.. method:: scheduler.enterabs(time, priority, action, argument)
+.. method:: scheduler.enterabs(time, priority, action, argument=[], kwargs={})
Schedule a new event. The *time* argument should be a numeric type compatible
with the return value of the *timefunc* function passed to the constructor.
Events scheduled for the same *time* will be executed in the order of their
*priority*.
- Executing the event means executing ``action(*argument)``. *argument* must be a
- sequence holding the parameters for *action*.
+ Executing the event means executing ``action(*argument, **kwargs)``.
+ *argument* must be a sequence holding the parameters for *action*.
+ *kwargs* must be a dictionary holding the keyword parameters for *action*.
Return value is an event which may be used for later cancellation of the event
(see :meth:`cancel`).
+ .. versionchanged:: 3.3
+ *argument* parameter is optional.
-.. method:: scheduler.enter(delay, priority, action, argument)
+ .. versionadded:: 3.3
+ *kwargs* parameter was added.
+
+
+.. method:: scheduler.enter(delay, priority, action, argument=[], kwargs={})
Schedule an event for *delay* more time units. Other than the relative time, the
other arguments, the effect and the return value are the same as those for
:meth:`enterabs`.
+ .. versionchanged:: 3.3
+ *argument* parameter is optional.
+
+ .. versionadded:: 3.3
+ *kwargs* parameter was added.
.. method:: scheduler.cancel(event)
@@ -111,12 +102,16 @@ Scheduler Objects
Return true if the event queue is empty.
-.. method:: scheduler.run()
+.. method:: scheduler.run(blocking=True)
- Run all scheduled events. This function will wait (using the :func:`delayfunc`
+ Run all scheduled events. This method will wait (using the :func:`delayfunc`
function passed to the constructor) for the next event, then execute it and so
on until there are no more scheduled events.
+ If *blocking* is False executes the scheduled events due to expire soonest
+ (if any) and then return the deadline of the next scheduled call in the
+ scheduler (if any).
+
Either *action* or *delayfunc* can raise an exception. In either case, the
scheduler will maintain a consistent state and propagate the exception. If an
exception is raised by *action*, the event will not be attempted in future calls
@@ -127,6 +122,9 @@ Scheduler Objects
the calling code is responsible for canceling events which are no longer
pertinent.
+ .. versionadded:: 3.3
+ *blocking* parameter was added.
+
.. attribute:: scheduler.queue
Read-only attribute returning a list of upcoming events in the order they
diff --git a/Doc/library/select.rst b/Doc/library/select.rst
index a450ec2..4e60f4a 100644
--- a/Doc/library/select.rst
+++ b/Doc/library/select.rst
@@ -6,7 +6,8 @@
This module provides access to the :c:func:`select` and :c:func:`poll` functions
-available in most operating systems, :c:func:`epoll` available on Linux 2.5+ and
+available in most operating systems, :c:func:`devpoll` available on
+Solaris and derivatives, :c:func:`epoll` available on Linux 2.5+ and
:c:func:`kqueue` available on most BSD.
Note that on Windows, it only works for sockets; on other operating systems,
it also works for other file types (in particular, on Unix, it works on pipes).
@@ -18,17 +19,38 @@ The module defines the following:
.. exception:: error
- The exception raised when an error occurs. The accompanying value is a pair
- containing the numeric error code from :c:data:`errno` and the corresponding
- string, as would be printed by the C function :c:func:`perror`.
+ A deprecated alias of :exc:`OSError`.
+ .. versionchanged:: 3.3
+ Following :pep:`3151`, this class was made an alias of :exc:`OSError`.
-.. function:: epoll(sizehint=-1)
- (Only supported on Linux 2.5.44 and newer.) Returns an edge polling object,
- which can be used as Edge or Level Triggered interface for I/O events; see
- section :ref:`epoll-objects` below for the methods supported by epolling
- objects.
+.. function:: devpoll()
+
+ (Only supported on Solaris and derivatives.) Returns a ``/dev/poll``
+ polling object; see section :ref:`devpoll-objects` below for the
+ methods supported by devpoll objects.
+
+ :c:func:`devpoll` objects are linked to the number of file
+ descriptors allowed at the time of instantiation. If your program
+ reduces this value, :c:func:`devpoll` will fail. If your program
+ increases this value, :c:func:`devpoll` may return an
+ incomplete list of active file descriptors.
+
+ .. versionadded:: 3.3
+
+.. function:: epoll(sizehint=-1, flags=0)
+
+ (Only supported on Linux 2.5.44 and newer.) Return an edge polling object,
+ which can be used as Edge or Level Triggered interface for I/O
+ events. *sizehint* is deprecated and completely ignored. *flags* can be set
+ to :const:`EPOLL_CLOEXEC`, which causes the epoll descriptor to be closed
+ automatically when :func:`os.execve` is called. See section
+ :ref:`epoll-objects` below for the methods supported by epolling objects.
+
+
+ .. versionchanged:: 3.3
+ Added the *flags* parameter.
.. function:: poll()
@@ -106,6 +128,74 @@ The module defines the following:
.. versionadded:: 3.2
+.. _devpoll-objects:
+
+``/dev/poll`` Polling Objects
+----------------------------------------------
+
+ http://developers.sun.com/solaris/articles/using_devpoll.html
+ http://developers.sun.com/solaris/articles/polling_efficient.html
+
+Solaris and derivatives have ``/dev/poll``. While :c:func:`select` is
+O(highest file descriptor) and :c:func:`poll` is O(number of file
+descriptors), ``/dev/poll`` is O(active file descriptors).
+
+``/dev/poll`` behaviour is very close to the standard :c:func:`poll`
+object.
+
+
+.. method:: devpoll.register(fd[, eventmask])
+
+ Register a file descriptor with the polling object. Future calls to the
+ :meth:`poll` method will then check whether the file descriptor has any pending
+ I/O events. *fd* can be either an integer, or an object with a :meth:`fileno`
+ method that returns an integer. File objects implement :meth:`fileno`, so they
+ can also be used as the argument.
+
+ *eventmask* is an optional bitmask describing the type of events you want to
+ check for. The constants are the same that with :c:func:`poll`
+ object. The default value is a combination of the constants :const:`POLLIN`,
+ :const:`POLLPRI`, and :const:`POLLOUT`.
+
+ .. warning::
+
+ Registering a file descriptor that's already registered is not an
+ error, but the result is undefined. The appropiate action is to
+ unregister or modify it first. This is an important difference
+ compared with :c:func:`poll`.
+
+
+.. method:: devpoll.modify(fd[, eventmask])
+
+ This method does an :meth:`unregister` followed by a
+ :meth:`register`. It is (a bit) more efficient that doing the same
+ explicitly.
+
+
+.. method:: devpoll.unregister(fd)
+
+ Remove a file descriptor being tracked by a polling object. Just like the
+ :meth:`register` method, *fd* can be an integer or an object with a
+ :meth:`fileno` method that returns an integer.
+
+ Attempting to remove a file descriptor that was never registered is
+ safely ignored.
+
+
+.. method:: devpoll.poll([timeout])
+
+ Polls the set of registered file descriptors, and returns a possibly-empty list
+ containing ``(fd, event)`` 2-tuples for the descriptors that have events or
+ errors to report. *fd* is the file descriptor, and *event* is a bitmask with
+ bits set for the reported events for that descriptor --- :const:`POLLIN` for
+ waiting input, :const:`POLLOUT` to indicate that the descriptor can be written
+ to, and so forth. An empty list indicates that the call timed out and no file
+ descriptors had any events to report. If *timeout* is given, it specifies the
+ length of time in milliseconds which the system will wait for events before
+ returning. If *timeout* is omitted, -1, or :const:`None`, the call will
+ block until there is an event for this poll object.
+
+
.. _epoll-objects:
Edge and Level Trigger Polling (epoll) Objects
@@ -165,11 +255,6 @@ Edge and Level Trigger Polling (epoll) Objects
Register a fd descriptor with the epoll object.
- .. note::
-
- Registering a file descriptor that's already registered raises an
- IOError -- contrary to :ref:`poll-objects`'s register.
-
.. method:: epoll.modify(fd, eventmask)
diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst
index 0113fb7..941e090 100644
--- a/Doc/library/shlex.rst
+++ b/Doc/library/shlex.rst
@@ -34,6 +34,40 @@ The :mod:`shlex` module defines the following functions:
passing ``None`` for *s* will read the string to split from standard
input.
+
+.. function:: quote(s)
+
+ Return a shell-escaped version of the string *s*. The returned value is a
+ string that can safely be used as one token in a shell command line, for
+ cases where you cannot use a list.
+
+ This idiom would be unsafe::
+
+ >>> filename = 'somefile; rm -rf ~'
+ >>> command = 'ls -l {}'.format(filename)
+ >>> print(command) # executed by a shell: boom!
+ ls -l somefile; rm -rf ~
+
+ :func:`quote` lets you plug the security hole::
+
+ >>> command = 'ls -l {}'.format(quote(filename))
+ >>> print(command)
+ ls -l 'somefile; rm -rf ~'
+ >>> remote_command = 'ssh home {}'.format(quote(command))
+ >>> print(remote_command)
+ ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''
+
+ The quoting is compatible with UNIX shells and with :func:`split`:
+
+ >>> remote_command = split(remote_command)
+ >>> remote_command
+ ['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
+ >>> command = split(remote_command[-1])
+ >>> command
+ ['ls', '-l', 'somefile; rm -rf ~']
+
+ .. versionadded:: 3.3
+
The :mod:`shlex` module defines the following class:
@@ -282,5 +316,4 @@ parsing rules.
* EOF is signaled with a :const:`None` value;
-* Quoted empty strings (``''``) are allowed;
-
+* Quoted empty strings (``''``) are allowed.
diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst
index 18f6485..080c923 100644
--- a/Doc/library/shutil.rst
+++ b/Doc/library/shutil.rst
@@ -47,45 +47,129 @@ Directory and files operations
be copied.
-.. function:: copyfile(src, dst)
+.. function:: copyfile(src, dst, *, follow_symlinks=True)
Copy the contents (no metadata) of the file named *src* to a file named
- *dst*. *dst* must be the complete target file name; look at
- :func:`shutil.copy` for a copy that accepts a target directory path. If
- *src* and *dst* are the same files, :exc:`Error` is raised.
- The destination location must be writable; otherwise, an :exc:`IOError` exception
- will be raised. If *dst* already exists, it will be replaced. Special files
- such as character or block devices and pipes cannot be copied with this
- function. *src* and *dst* are path names given as strings.
+ *dst* and return *dst*. *src* and *dst* are path names given as strings.
+ *dst* must be the complete target file name; look at :func:`shutil.copy`
+ for a copy that accepts a target directory path. If *src* and *dst*
+ specify the same file, :exc:`Error` is raised.
+ The destination location must be writable; otherwise, an :exc:`OSError`
+ exception will be raised. If *dst* already exists, it will be replaced.
+ Special files such as character or block devices and pipes cannot be
+ copied with this function.
-.. function:: copymode(src, dst)
+ If *follow_symlinks* is false and *src* is a symbolic link,
+ a new symbolic link will be created instead of copying the
+ file *src* points to.
+
+ .. versionchanged:: 3.3
+ :exc:`IOError` used to be raised instead of :exc:`OSError`.
+ Added *follow_symlinks* argument.
+ Now returns *dst*.
+
+.. function:: copymode(src, dst, *, follow_symlinks=True)
Copy the permission bits from *src* to *dst*. The file contents, owner, and
group are unaffected. *src* and *dst* are path names given as strings.
+ If *follow_symlinks* is false, and both *src* and *dst* are symbolic links,
+ :func:`copymode` will attempt to modify the mode of *dst* itself (rather
+ than the file it points to). This functionality is not available on every
+ platform; please see :func:`copystat` for more information. If
+ :func:`copymode` cannot modify symbolic links on the local platform, and it
+ is asked to do so, it will do nothing and return.
+
+ .. versionchanged:: 3.3
+ Added *follow_symlinks* argument.
+
+.. function:: copystat(src, dst, *, follow_symlinks=True)
+
+ Copy the permission bits, last access time, last modification time, and
+ flags from *src* to *dst*. On Linux, :func:`copystat` also copies the
+ "extended attributes" where possible. The file contents, owner, and
+ group are unaffected. *src* and *dst* are path names given as strings.
+
+ If *follow_symlinks* is false, and *src* and *dst* both
+ refer to symbolic links, :func:`copystat` will operate on
+ the symbolic links themselves rather than the files the
+ symbolic links refer to--reading the information from the
+ *src* symbolic link, and writing the information to the
+ *dst* symbolic link.
+
+ .. note::
+
+ Not all platforms provide the ability to examine and
+ modify symbolic links. Python itself can tell you what
+ functionality is locally available.
+ * If ``os.chmod in os.supports_follow_symlinks`` is
+ ``True``, :func:`copystat` can modify the permission
+ bits of a symbolic link.
-.. function:: copystat(src, dst)
+ * If ``os.utime in os.supports_follow_symlinks`` is
+ ``True``, :func:`copystat` can modify the last access
+ and modification times of a symbolic link.
- Copy the permission bits, last access time, last modification time, and flags
- from *src* to *dst*. The file contents, owner, and group are unaffected. *src*
- and *dst* are path names given as strings.
+ * If ``os.chflags in os.supports_follow_symlinks`` is
+ ``True``, :func:`copystat` can modify the flags of
+ a symbolic link. (``os.chflags`` is not available on
+ all platforms.)
+ On platforms where some or all of this functionality
+ is unavailable, when asked to modify a symbolic link,
+ :func:`copystat` will copy everything it can.
+ :func:`copystat` never returns failure.
-.. function:: copy(src, dst)
+ Please see :data:`os.supports_follow_symlinks`
+ for more information.
- Copy the file *src* to the file or directory *dst*. If *dst* is a directory, a
- file with the same basename as *src* is created (or overwritten) in the
- directory specified. Permission bits are copied. *src* and *dst* are path
- names given as strings.
+ .. versionchanged:: 3.3
+ Added *follow_symlinks* argument and support for Linux extended attributes.
+.. function:: copy(src, dst, *, follow_symlinks=True)
-.. function:: copy2(src, dst)
+ Copies the file *src* to the file or directory *dst*. *src* and *dst*
+ should be strings. If *dst* specifies a directory, the file will be
+ copied into *dst* using the base filename from *src*. Returns the
+ path to the newly created file.
- Similar to :func:`shutil.copy`, but metadata is copied as well -- in fact,
- this is just :func:`shutil.copy` followed by :func:`copystat`. This is
- similar to the Unix command :program:`cp -p`.
+ If *follow_symlinks* is false, and *src* is a symbolic link,
+ *dst* will be created as a symbolic link. If *follow_symlinks*
+ is true and *src* is a symbolic link, *dst* will be a copy of
+ the file *src* refers to.
+ :func:`copy` copies the file data and the file's permission
+ mode (see :func:`os.chmod`). Other metadata, like the
+ file's creation and modification times, is not preserved.
+ To preserve all file metadata from the original, use
+ :func:`~shutil.copy2` instead.
+
+ .. versionchanged:: 3.3
+ Added *follow_symlinks* argument.
+ Now returns path to the newly created file.
+
+.. function:: copy2(src, dst, *, follow_symlinks=True)
+
+ Identical to :func:`~shutil.copy` except that :func:`copy2`
+ also attempts to preserve all file metadata.
+
+ When *follow_symlinks* is false, and *src* is a symbolic
+ link, :func:`copy2` attempts to copy all metadata from the
+ *src* symbolic link to the newly-created *dst* symbolic link.
+ However, this functionality is not available on all platforms.
+ On platforms where some or all of this functionality is
+ unavailable, :func:`copy2` will preserve all the metadata
+ it can; :func:`copy2` never returns failure.
+
+ :func:`copy2` uses :func:`copystat` to copy the file metadata.
+ Please see :func:`copystat` for more information
+ about platform support for modifying symbolic link metadata.
+
+ .. versionchanged:: 3.3
+ Added *follow_symlinks* argument, try to copy extended
+ file system attributes too (currently Linux only).
+ Now returns path to the newly created file.
.. function:: ignore_patterns(\*patterns)
@@ -96,16 +180,17 @@ Directory and files operations
.. function:: copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
- Recursively copy an entire directory tree rooted at *src*. The destination
+ Recursively copy an entire directory tree rooted at *src*, returning the
+ destination directory. The destination
directory, named by *dst*, must not already exist; it will be created as
well as missing parent directories. Permissions and times of directories
are copied with :func:`copystat`, individual files are copied using
:func:`shutil.copy2`.
If *symlinks* is true, symbolic links in the source tree are represented as
- symbolic links in the new tree, but the metadata of the original links is NOT
- copied; if false or omitted, the contents and metadata of the linked files
- are copied to the new tree.
+ symbolic links in the new tree and the metadata of the original links will
+ be copied as far as the platform allows; if false or omitted, the contents
+ and metadata of the linked files are copied to the new tree.
When *symlinks* is false, if the file pointed by the symlink doesn't
exist, a exception will be added in the list of errors raised in
@@ -129,13 +214,15 @@ Directory and files operations
If *copy_function* is given, it must be a callable that will be used to copy
each file. It will be called with the source path and the destination path
as arguments. By default, :func:`shutil.copy2` is used, but any function
- that supports the same signature (like :func:`copy`) can be used.
+ that supports the same signature (like :func:`shutil.copy`) can be used.
+
+ .. versionchanged:: 3.3
+ Copy metadata when *symlinks* is false.
+ Now returns *dst*.
.. versionchanged:: 3.2
Added the *copy_function* argument to be able to provide a custom copy
function.
-
- .. versionchanged:: 3.2
Added the *ignore_dangling_symlinks* argument to silent dangling symlinks
errors when *symlinks* is false.
@@ -150,19 +237,42 @@ Directory and files operations
handled by calling a handler specified by *onerror* or, if that is omitted,
they raise an exception.
+ .. note::
+
+ On platforms that support the necessary fd-based functions a symlink
+ attack resistant version of :func:`rmtree` is used by default. On other
+ platforms, the :func:`rmtree` implementation is susceptible to a symlink
+ attack: given proper timing and circumstances, attackers can manipulate
+ symlinks on the filesystem to delete files they wouldn't be able to access
+ otherwise. Applications can use the :data:`rmtree.avoids_symlink_attacks`
+ function attribute to determine which case applies.
+
If *onerror* is provided, it must be a callable that accepts three
- parameters: *function*, *path*, and *excinfo*. The first parameter,
- *function*, is the function which raised the exception; it will be
- :func:`os.path.islink`, :func:`os.listdir`, :func:`os.remove` or
- :func:`os.rmdir`. The second parameter, *path*, will be the path name passed
- to *function*. The third parameter, *excinfo*, will be the exception
- information return by :func:`sys.exc_info`. Exceptions raised by *onerror*
- will not be caught.
+ parameters: *function*, *path*, and *excinfo*.
+
+ The first parameter, *function*, is the function which raised the exception;
+ it depends on the platform and implementation. The second parameter,
+ *path*, will be the path name passed to *function*. The third parameter,
+ *excinfo*, will be the exception information returned by
+ :func:`sys.exc_info`. Exceptions raised by *onerror* will not be caught.
+
+ .. versionchanged:: 3.3
+ Added a symlink attack resistant version that is used automatically
+ if platform supports fd-based functions.
+
+ .. attribute:: rmtree.avoids_symlink_attacks
+
+ Indicates whether the current platform and implementation provides a
+ symlink attack resistant version of :func:`rmtree`. Currently this is
+ only true for platforms supporting fd-based directory access functions.
+
+ .. versionadded:: 3.3
.. function:: move(src, dst)
- Recursively move a file or directory (*src*) to another location (*dst*).
+ Recursively move a file or directory (*src*) to another location (*dst*)
+ and return the destination.
If the destination is a directory or a symlink to a directory, then *src* is
moved inside that directory.
@@ -173,7 +283,61 @@ Directory and files operations
If the destination is on the current filesystem, then :func:`os.rename` is
used. Otherwise, *src* is copied (using :func:`shutil.copy2`) to *dst* and
- then removed.
+ then removed. In case of symlinks, a new symlink pointing to the target of
+ *src* will be created in or as *dst* and *src* will be removed.
+
+ .. versionchanged:: 3.3
+ Added explicit symlink handling for foreign filesystems, thus adapting
+ it to the behavior of GNU's :program:`mv`.
+ Now returns *dst*.
+
+.. function:: disk_usage(path)
+
+ Return disk usage statistics about the given path as a :term:`named tuple`
+ with the attributes *total*, *used* and *free*, which are the amount of
+ total, used and free space, in bytes.
+
+ .. versionadded:: 3.3
+
+ Availability: Unix, Windows.
+
+.. function:: chown(path, user=None, group=None)
+
+ Change owner *user* and/or *group* of the given *path*.
+
+ *user* can be a system user name or a uid; the same applies to *group*. At
+ least one argument is required.
+
+ See also :func:`os.chown`, the underlying function.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: which(cmd, mode=os.F_OK | os.X_OK, path=None)
+
+ Return the path to an executable which would be run if the given *cmd* was
+ called. If no *cmd* would be called, return ``None``.
+
+ *mode* is a permission mask passed a to :func:`os.access`, by default
+ determining if the file exists and executable.
+
+ When no *path* is specified, the results of :func:`os.environ` are used,
+ returning either the "PATH" value or a fallback of :attr:`os.defpath`.
+
+ On Windows, the current directory is always prepended to the *path* whether
+ or not you use the default or provide your own, which is the behavior the
+ command shell uses when finding executables. Additionaly, when finding the
+ *cmd* in the *path*, the ``PATHEXT`` environment variable is checked. For
+ example, if you call ``shutil.which("python")``, :func:`which` will search
+ ``PATHEXT`` to know that it should look for ``python.exe`` within the *path*
+ directories. For example, on Windows::
+
+ >>> shutil.which("python")
+ 'c:\\python33\\python.exe'
+
+ .. versionadded:: 3.3
.. exception:: Error
@@ -186,7 +350,7 @@ Directory and files operations
.. _shutil-copytree-example:
copytree example
-::::::::::::::::
+~~~~~~~~~~~~~~~~
This example is the implementation of the :func:`copytree` function, described
above, with the docstring omitted. It demonstrates many of the other functions
@@ -250,6 +414,8 @@ Another example that uses the *ignore* argument to add a logging call::
Archiving operations
--------------------
+.. versionadded:: 3.2
+
High-level utilities to create and read compressed and archived files are also
provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
@@ -277,8 +443,6 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
*logger* must be an object compatible with :pep:`282`, usually an instance of
:class:`logging.Logger`.
- .. versionadded:: 3.2
-
.. function:: get_archive_formats()
@@ -295,8 +459,6 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
You can register new formats or provide your own archiver for any existing
formats, by using :func:`register_archive_format`.
- .. versionadded:: 3.2
-
.. function:: register_archive_format(name, function, [extra_args, [description]])
@@ -309,15 +471,11 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
*description* is used by :func:`get_archive_formats` which returns the
list of archivers. Defaults to an empty list.
- .. versionadded:: 3.2
-
.. function:: unregister_archive_format(name)
Remove the archive format *name* from the list of supported formats.
- .. versionadded:: 3.2
-
.. function:: unpack_archive(filename[, extract_dir[, format]])
@@ -332,8 +490,6 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
and see if an unpacker was registered for that extension. In case none is
found, a :exc:`ValueError` is raised.
- .. versionadded:: 3.2
-
.. function:: register_unpack_format(name, extensions, function[, extra_args[, description]])
@@ -351,15 +507,11 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
*description* can be provided to describe the format, and will be returned
by the :func:`get_unpack_formats` function.
- .. versionadded:: 3.2
-
.. function:: unregister_unpack_format(name)
Unregister an unpack format. *name* is the name of the format.
- .. versionadded:: 3.2
-
.. function:: get_unpack_formats()
@@ -377,13 +529,11 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
You can register new formats or provide your own unpacker for any existing
formats, by using :func:`register_unpack_format`.
- .. versionadded:: 3.2
-
.. _shutil-archiving-example:
Archiving example
-:::::::::::::::::
+~~~~~~~~~~~~~~~~~
In this example, we create a gzip'ed tar-file archive containing all files
found in the :file:`.ssh` directory of the user::
@@ -406,3 +556,36 @@ The resulting archive contains::
-rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts
+
+
+Querying the size of the output terminal
+----------------------------------------
+
+.. versionadded:: 3.3
+
+.. function:: get_terminal_size(fallback=(columns, lines))
+
+ Get the size of the terminal window.
+
+ For each of the two dimensions, the environment variable, ``COLUMNS``
+ and ``LINES`` respectively, is checked. If the variable is defined and
+ the value is a positive integer, it is used.
+
+ When ``COLUMNS`` or ``LINES`` is not defined, which is the common case,
+ the terminal connected to :data:`sys.__stdout__` is queried
+ by invoking :func:`os.get_terminal_size`.
+
+ If the terminal size cannot be successfully queried, either because
+ the system doesn't support querying, or because we are not
+ connected to a terminal, the value given in ``fallback`` parameter
+ is used. ``fallback`` defaults to ``(80, 24)`` which is the default
+ size used by many terminal emulators.
+
+ The value returned is a named tuple of type :class:`os.terminal_size`.
+
+ See also: The Single UNIX Specification, Version 2,
+ `Other Environment Variables`_.
+
+.. _`Other Environment Variables`:
+ http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html#tag_002_003
+
diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst
index d1cae13..2a472fe 100644
--- a/Doc/library/signal.rst
+++ b/Doc/library/signal.rst
@@ -44,6 +44,9 @@ This has consequences:
signal handlers will be called when the calculation finishes.
+.. _signals-and-threads:
+
+
Signals and threads
^^^^^^^^^^^^^^^^^^^
@@ -131,6 +134,28 @@ The variables defined in the :mod:`signal` module are:
in user and kernel space. SIGPROF is delivered upon expiration.
+.. data:: SIG_BLOCK
+
+ A possible value for the *how* parameter to :func:`pthread_sigmask`
+ indicating that signals are to be blocked.
+
+ .. versionadded:: 3.3
+
+.. data:: SIG_UNBLOCK
+
+ A possible value for the *how* parameter to :func:`pthread_sigmask`
+ indicating that signals are to be unblocked.
+
+ .. versionadded:: 3.3
+
+.. data:: SIG_SETMASK
+
+ A possible value for the *how* parameter to :func:`pthread_sigmask`
+ indicating that the signal mask is to be replaced.
+
+ .. versionadded:: 3.3
+
+
The :mod:`signal` module defines one exception:
.. exception:: ItimerError
@@ -138,7 +163,11 @@ The :mod:`signal` module defines one exception:
Raised to signal an error from the underlying :func:`setitimer` or
:func:`getitimer` implementation. Expect this error if an invalid
interval timer or a negative time is passed to :func:`setitimer`.
- This error is a subtype of :exc:`IOError`.
+ This error is a subtype of :exc:`OSError`.
+
+ .. versionadded:: 3.3
+ This error used to be a subtype of :exc:`IOError`, which is now an
+ alias of :exc:`OSError`.
The :mod:`signal` module defines the following functions:
@@ -172,6 +201,65 @@ The :mod:`signal` module defines the following functions:
will then be called. Returns nothing. Not on Windows. (See the Unix man page
:manpage:`signal(2)`.)
+ See also :func:`sigwait`, :func:`sigwaitinfo`, :func:`sigtimedwait` and
+ :func:`sigpending`.
+
+
+.. function:: pthread_kill(thread_id, signum)
+
+ Send the signal *signum* to the thread *thread_id*, another thread in the
+ same process as the caller. The target thread can be executing any code
+ (Python or not). However, if the target thread is executing the Python
+ interpreter, the Python signal handlers will be :ref:`executed by the main
+ thread <signals-and-threads>`. Therefore, the only point of sending a signal to a particular
+ Python thread would be to force a running system call to fail with
+ :exc:`InterruptedError`.
+
+ Use :func:`threading.get_ident()` or the :attr:`~threading.Thread.ident`
+ attribute of :class:`threading.Thread` objects to get a suitable value
+ for *thread_id*.
+
+ If *signum* is 0, then no signal is sent, but error checking is still
+ performed; this can be used to check if the target thread is still running.
+
+ Availability: Unix (see the man page :manpage:`pthread_kill(3)` for further
+ information).
+
+ See also :func:`os.kill`.
+
+ .. versionadded:: 3.3
+
+
+.. function:: pthread_sigmask(how, mask)
+
+ Fetch and/or change the signal mask of the calling thread. The signal mask
+ is the set of signals whose delivery is currently blocked for the caller.
+ Return the old signal mask as a set of signals.
+
+ The behavior of the call is dependent on the value of *how*, as follows.
+
+ * :data:`SIG_BLOCK`: The set of blocked signals is the union of the current
+ set and the *mask* argument.
+ * :data:`SIG_UNBLOCK`: The signals in *mask* are removed from the current
+ set of blocked signals. It is permissible to attempt to unblock a
+ signal which is not blocked.
+ * :data:`SIG_SETMASK`: The set of blocked signals is set to the *mask*
+ argument.
+
+ *mask* is a set of signal numbers (e.g. {:const:`signal.SIGINT`,
+ :const:`signal.SIGTERM`}). Use ``range(1, signal.NSIG)`` for a full mask
+ including all signals.
+
+ For example, ``signal.pthread_sigmask(signal.SIG_BLOCK, [])`` reads the
+ signal mask of the calling thread.
+
+ Availability: Unix. See the man page :manpage:`sigprocmask(3)` and
+ :manpage:`pthread_sigmask(3)` for further information.
+
+ See also :func:`pause`, :func:`sigpending` and :func:`sigwait`.
+
+ .. versionadded:: 3.3
+
.. function:: setitimer(which, seconds[, interval])
@@ -201,13 +289,17 @@ The :mod:`signal` module defines the following functions:
.. function:: set_wakeup_fd(fd)
- Set the wakeup fd to *fd*. When a signal is received, a ``'\0'`` byte is
- written to the fd. This can be used by a library to wakeup a poll or select
- call, allowing the signal to be fully processed.
+ Set the wakeup file descriptor to *fd*. When a signal is received, the
+ signal number is written as a single byte into the fd. This can be used by
+ a library to wakeup a poll or select call, allowing the signal to be fully
+ processed.
The old wakeup fd is returned. *fd* must be non-blocking. It is up to the
library to remove any bytes before calling poll or select again.
+ Use for example ``struct.unpack('%uB' % len(data), data)`` to decode the
+ signal numbers list.
+
When threads are enabled, this function can only be called from the main thread;
attempting to call it from other threads will cause a :exc:`ValueError`
exception to be raised.
@@ -247,6 +339,73 @@ The :mod:`signal` module defines the following functions:
:const:`SIGTERM`. A :exc:`ValueError` will be raised in any other case.
+.. function:: sigpending()
+
+ Examine the set of signals that are pending for delivery to the calling
+ thread (i.e., the signals which have been raised while blocked). Return the
+ set of the pending signals.
+
+ Availability: Unix (see the man page :manpage:`sigpending(2)` for further
+ information).
+
+ See also :func:`pause`, :func:`pthread_sigmask` and :func:`sigwait`.
+
+ .. versionadded:: 3.3
+
+
+.. function:: sigwait(sigset)
+
+ Suspend execution of the calling thread until the delivery of one of the
+ signals specified in the signal set *sigset*. The function accepts the signal
+ (removes it from the pending list of signals), and returns the signal number.
+
+ Availability: Unix (see the man page :manpage:`sigwait(3)` for further
+ information).
+
+ See also :func:`pause`, :func:`pthread_sigmask`, :func:`sigpending`,
+ :func:`sigwaitinfo` and :func:`sigtimedwait`.
+
+ .. versionadded:: 3.3
+
+
+.. function:: sigwaitinfo(sigset)
+
+ Suspend execution of the calling thread until the delivery of one of the
+ signals specified in the signal set *sigset*. The function accepts the
+ signal and removes it from the pending list of signals. If one of the
+ signals in *sigset* is already pending for the calling thread, the function
+ will return immediately with information about that signal. The signal
+ handler is not called for the delivered signal. The function raises an
+ :exc:`InterruptedError` if it is interrupted by a signal that is not in
+ *sigset*.
+
+ The return value is an object representing the data contained in the
+ :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`,
+ :attr:`si_errno`, :attr:`si_pid`, :attr:`si_uid`, :attr:`si_status`,
+ :attr:`si_band`.
+
+ Availability: Unix (see the man page :manpage:`sigwaitinfo(2)` for further
+ information).
+
+ See also :func:`pause`, :func:`sigwait` and :func:`sigtimedwait`.
+
+ .. versionadded:: 3.3
+
+
+.. function:: sigtimedwait(sigset, timeout)
+
+ Like :func:`sigwaitinfo`, but takes an additional *timeout* argument
+ specifying a timeout. If *timeout* is specified as :const:`0`, a poll is
+ performed. Returns :const:`None` if a timeout occurs.
+
+ Availability: Unix (see the man page :manpage:`sigtimedwait(2)` for further
+ information).
+
+ See also :func:`pause`, :func:`sigwait` and :func:`sigwaitinfo`.
+
+ .. versionadded:: 3.3
+
+
.. _signal-example:
Example
@@ -263,7 +422,7 @@ be sent, and the handler raises an exception. ::
def handler(signum, frame):
print('Signal handler called with signal', signum)
- raise IOError("Couldn't open device!")
+ raise OSError("Couldn't open device!")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
diff --git a/Doc/library/site.rst b/Doc/library/site.rst
index 579571a..36b80c3 100644
--- a/Doc/library/site.rst
+++ b/Doc/library/site.rst
@@ -16,7 +16,14 @@ import can be suppressed using the interpreter's :option:`-S` option.
.. index:: triple: module; search; path
Importing this module will append site-specific paths to the module search path
-and add a few builtins.
+and add a few builtins, unless :option:`-S` was used. In that case, this module
+can be safely imported with no automatic modifications to the module search path
+or additions to the builtins. To explicitly trigger the usual site-specific
+additions, call the :func:`site.main` function.
+
+.. versionchanged:: 3.3
+ Importing the module used to trigger paths manipulation even when using
+ :option:`-S`.
.. index::
pair: site-python; directory
@@ -31,6 +38,15 @@ Unix and Macintosh). For each of the distinct head-tail combinations, it sees
if it refers to an existing directory, and if so, adds it to ``sys.path`` and
also inspects the newly added path for configuration files.
+If a file named "pyvenv.cfg" exists one directory above sys.executable,
+sys.prefix and sys.exec_prefix are set to that directory and
+it is also checked for site-packages and site-python (sys.base_prefix and
+sys.base_exec_prefix will always be the "real" prefixes of the Python
+installation). If "pyvenv.cfg" (a bootstrap configuration file) contains
+the key "include-system-site-packages" set to anything other than "false"
+(case-insensitive), the system-level prefixes will still also be
+searched for site-packages; otherwise they won't.
+
A path configuration file is a file whose name has the form :file:`{name}.pth`
and exists in one of the four directories mentioned above; its contents are
additional items (one per line) to be added to ``sys.path``. Non-existing items
@@ -129,8 +145,19 @@ empty, and the path manipulations are skipped; however the import of
:file:`~/Library/Python/{X.Y}` for Mac framework builds, and
:file:`{%APPDATA%}\\Python` for Windows. This value is used by Distutils to
compute the installation directories for scripts, data files, Python modules,
- etc. for the :ref:`user installation scheme <inst-alt-install-user>`. See
- also :envvar:`PYTHONUSERBASE`.
+ etc. for the :ref:`user installation scheme <inst-alt-install-user>`.
+ See also :envvar:`PYTHONUSERBASE`.
+
+
+.. function:: main()
+
+ Adds all the standard site-specific directories to the module search
+ path. This function is called automatically when this module is imported,
+ unless the :program:`python` interpreter was started with the :option:`-S`
+ flag.
+
+ .. versionchanged:: 3.3
+ This function used to be called unconditionnally.
.. function:: addsitedir(sitedir, known_paths=None)
diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst
index bfdc727..2ca71ff 100644
--- a/Doc/library/smtpd.rst
+++ b/Doc/library/smtpd.rst
@@ -20,17 +20,24 @@ specific mail-sending strategies.
Additionally the SMTPChannel may be extended to implement very specific
interaction behaviour with SMTP clients.
+The code supports :RFC:`5321`, plus the :rfc:`1870` SIZE extension.
+
+
SMTPServer Objects
------------------
-.. class:: SMTPServer(localaddr, remoteaddr)
+.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432)
Create a new :class:`SMTPServer` object, which binds to local address
*localaddr*. It will treat *remoteaddr* as an upstream SMTP relayer. It
inherits from :class:`asyncore.dispatcher`, and so will insert itself into
:mod:`asyncore`'s event loop on instantiation.
+ *data_size_limit* specifies the maximum number of bytes that will be
+ accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
+ limit.
+
.. method:: process_message(peer, mailfrom, rcpttos, data)
Raise :exc:`NotImplementedError` exception. Override this in subclasses to
@@ -156,11 +163,15 @@ SMTPChannel Objects
Command Action taken
======== ===================================================================
HELO Accepts the greeting from the client and stores it in
- :attr:`seen_greeting`.
+ :attr:`seen_greeting`. Sets server to base command mode.
+ EHLO Accepts the greeting from the client and stores it in
+ :attr:`seen_greeting`. Sets server to extended command mode.
NOOP Takes no action.
QUIT Closes the connection cleanly.
MAIL Accepts the "MAIL FROM:" syntax and stores the supplied address as
- :attr:`mailfrom`.
+ :attr:`mailfrom`. In extended command mode, accepts the
+ :rfc:`1870` SIZE attribute and responds appropriately based on the
+ value of *data_size_limit*.
RCPT Accepts the "RCPT TO:" syntax and stores the supplied addresses in
the :attr:`rcpttos` list.
RSET Resets the :attr:`mailfrom`, :attr:`rcpttos`, and
@@ -168,4 +179,7 @@ SMTPChannel Objects
DATA Sets the internal state to :attr:`DATA` and stores remaining lines
from the client in :attr:`received_data` until the terminator
``"\r\n.\r\n"`` is received.
+ HELP Returns minimal information on command syntax
+ VRFY Returns code 252 (the server doesn't know if the address is valid)
+ EXPN Reports that the command is not implemented.
======== ===================================================================
diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst
index 3101ab7..711981f 100644
--- a/Doc/library/smtplib.rst
+++ b/Doc/library/smtplib.rst
@@ -20,7 +20,7 @@ details of SMTP and ESMTP operation, consult :rfc:`821` (Simple Mail Transfer
Protocol) and :rfc:`1869` (SMTP Service Extensions).
-.. class:: SMTP(host='', port=0, local_hostname=None[, timeout])
+.. class:: SMTP(host='', port=0, local_hostname=None[, timeout], source_address=None)
A :class:`SMTP` instance encapsulates an SMTP connection. It has methods
that support a full repertoire of SMTP and ESMTP operations. If the optional
@@ -29,13 +29,34 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
raised if the specified host doesn't respond correctly. The optional
*timeout* parameter specifies a timeout in seconds for blocking operations
like the connection attempt (if not specified, the global default timeout
- setting will be used).
+ setting will be used). The optional source_address parameter allows to bind to some
+ specific source address in a machine with multiple network interfaces,
+ and/or to some specific source TCP port. It takes a 2-tuple (host, port),
+ for the socket to bind to as its source address before connecting. If
+ omitted (or if host or port are ``''`` and/or 0 respectively) the OS default
+ behavior will be used.
For normal use, you should only require the initialization/connect,
:meth:`sendmail`, and :meth:`quit` methods. An example is included below.
+ The :class:`SMTP` class supports the :keyword:`with` statement. When used
+ like this, the SMTP ``QUIT`` command is issued automatically when the
+ :keyword:`with` statement exits. E.g.::
-.. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None[, timeout])
+ >>> from smtplib import SMTP
+ >>> with SMTP("domain.org") as smtp:
+ ... smtp.noop()
+ ...
+ (250, b'Ok')
+ >>>
+
+ .. versionchanged:: 3.3
+ Support for the :keyword:`with` statement was added.
+
+ .. versionchanged:: 3.3
+ source_address argument was added.
+
+.. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None[, timeout], context=None, source_address=None)
A :class:`SMTP_SSL` instance behaves exactly the same as instances of
:class:`SMTP`. :class:`SMTP_SSL` should be used for situations where SSL is
@@ -43,18 +64,33 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
not appropriate. If *host* is not specified, the local host is used. If
*port* is zero, the standard SMTP-over-SSL port (465) is used. *keyfile*
and *certfile* are also optional, and can contain a PEM formatted private key
- and certificate chain file for the SSL connection. The optional *timeout*
+ and certificate chain file for the SSL connection. *context* also optional, can contain
+ a SSLContext, and is an alternative to keyfile and certfile; If it is specified both
+ keyfile and certfile must be None. The optional *timeout*
parameter specifies a timeout in seconds for blocking operations like the
connection attempt (if not specified, the global default timeout setting
- will be used).
+ will be used). The optional source_address parameter allows to bind to some
+ specific source address in a machine with multiple network interfaces,
+ and/or to some specific source tcp port. It takes a 2-tuple (host, port),
+ for the socket to bind to as its source address before connecting. If
+ omitted (or if host or port are ``''`` and/or 0 respectively) the OS default
+ behavior will be used.
+
+ .. versionchanged:: 3.3
+ *context* was added.
+ .. versionchanged:: 3.3
+ source_address argument was added.
-.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None)
+
+.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None)
The LMTP protocol, which is very similar to ESMTP, is heavily based on the
- standard SMTP client. It's common to use Unix sockets for LMTP, so our :meth:`connect`
- method must support that as well as a regular host:port server. To specify a
- Unix socket, you must use an absolute path for *host*, starting with a '/'.
+ standard SMTP client. It's common to use Unix sockets for LMTP, so our
+ :meth:`connect` method must support that as well as a regular host:port
+ server. The optional arguments local_hostname and source_address have the
+ same meaning as that of SMTP client. To specify a Unix socket, you must use
+ an absolute path for *host*, starting with a '/'.
Authentication is supported, using the regular SMTP mechanism. When using a Unix
socket, LMTP generally don't support or require any authentication, but your
@@ -242,7 +278,7 @@ An :class:`SMTP` instance has the following methods:
No suitable authentication method was found.
-.. method:: SMTP.starttls(keyfile=None, certfile=None)
+.. method:: SMTP.starttls(keyfile=None, certfile=None, context=None)
Put the SMTP connection in TLS (Transport Layer Security) mode. All SMTP
commands that follow will be encrypted. You should then call :meth:`ehlo`
@@ -251,6 +287,9 @@ An :class:`SMTP` instance has the following methods:
If *keyfile* and *certfile* are provided, these are passed to the :mod:`socket`
module's :func:`ssl` function.
+ Optional *context* parameter is a :class:`ssl.SSLContext` object; This is an alternative to
+ using a keyfile and a certfile and if specified both *keyfile* and *certfile* should be None.
+
If there has been no previous ``EHLO`` or ``HELO`` command this session,
this method tries ESMTP ``EHLO`` first.
@@ -263,6 +302,9 @@ An :class:`SMTP` instance has the following methods:
:exc:`RuntimeError`
SSL/TLS support is not available to your Python interpreter.
+ .. versionchanged:: 3.3
+ *context* was added.
+
.. method:: SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
@@ -320,7 +362,8 @@ An :class:`SMTP` instance has the following methods:
Unless otherwise noted, the connection will be open even after an exception is
raised.
- .. versionchanged:: 3.2 *msg* may be a byte string.
+ .. versionchanged:: 3.2
+ *msg* may be a byte string.
.. method:: SMTP.send_message(msg, from_addr=None, to_addrs=None, \
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 344a29f..5737b40 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -40,9 +40,23 @@ Socket families
Depending on the system and the build options, various socket families
are supported by this module.
-Socket addresses are represented as follows:
-
-- A single string is used for the :const:`AF_UNIX` address family.
+The address format required by a particular socket object is automatically
+selected based on the address family specified when the socket object was
+created. Socket addresses are represented as follows:
+
+- The address of an :const:`AF_UNIX` socket bound to a file system node
+ is represented as a string, using the file system encoding and the
+ ``'surrogateescape'`` error handler (see :pep:`383`). An address in
+ Linux's abstract namespace is returned as a :class:`bytes` object with
+ an initial null byte; note that sockets in this namespace can
+ communicate with normal file system sockets, so programs intended to
+ run on Linux may need to deal with both types of address. A string or
+ :class:`bytes` object can be used for either type of address when
+ passing it as an argument.
+
+ .. versionchanged:: 3.3
+ Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8
+ encoding.
- A pair ``(host, port)`` is used for the :const:`AF_INET` address family,
where *host* is a string representing either a hostname in Internet domain
@@ -80,6 +94,19 @@ Socket addresses are represented as follows:
If *addr_type* is :const:`TIPC_ADDR_ID`, then *v1* is the node, *v2* is the
reference, and *v3* should be set to 0.
+- A tuple ``(interface, )`` is used for the :const:`AF_CAN` address family,
+ where *interface* is a string representing a network interface name like
+ ``'can0'``. The network interface name ``''`` can be used to receive packets
+ from all network interfaces of this family.
+
+- A string or a tuple ``(id, unit)`` is used for the :const:`SYSPROTO_CONTROL`
+ protocol of the :const:`PF_SYSTEM` family. The string is the name of a
+ kernel control using a dynamically-assigned ID. The tuple can be used if ID
+ and unit number of the kernel control are known or if a registered ID is
+ used.
+
+ .. versionadded:: 3.3
+
- Certain other address families (:const:`AF_BLUETOOTH`, :const:`AF_PACKET`)
support specific representations.
@@ -99,8 +126,9 @@ resolution and/or the host configuration. For deterministic behavior use a
numeric address in *host* portion.
All errors raise exceptions. The normal exceptions for invalid argument types
-and out-of-memory conditions can be raised; errors related to socket or address
-semantics raise :exc:`socket.error` or one of its subclasses.
+and out-of-memory conditions can be raised; starting from Python 3.3, errors
+related to socket or address semantics raise :exc:`OSError` or one of its
+subclasses (they used to raise :exc:`socket.error`).
Non-blocking mode is supported through :meth:`~socket.setblocking`. A
generalization of this based on timeouts is supported through
@@ -115,20 +143,15 @@ The module :mod:`socket` exports the following constants and functions:
.. exception:: error
- .. index:: module: errno
-
- A subclass of :exc:`IOError`, this exception is raised for socket-related
- errors. It is recommended that you inspect its ``errno`` attribute to
- discriminate between different kinds of errors.
+ A deprecated alias of :exc:`OSError`.
- .. seealso::
- The :mod:`errno` module contains symbolic names for the error codes
- defined by the underlying operating system.
+ .. versionchanged:: 3.3
+ Following :pep:`3151`, this class was made an alias of :exc:`OSError`.
.. exception:: herror
- A subclass of :exc:`socket.error`, this exception is raised for
+ A subclass of :exc:`OSError`, this exception is raised for
address-related errors, i.e. for functions that use *h_errno* in the POSIX
C API, including :func:`gethostbyname_ex` and :func:`gethostbyaddr`.
The accompanying value is a pair ``(h_errno, string)`` representing an
@@ -136,10 +159,12 @@ The module :mod:`socket` exports the following constants and functions:
*string* represents the description of *h_errno*, as returned by the
:c:func:`hstrerror` C function.
+ .. versionchanged:: 3.3
+ This class was made a subclass of :exc:`OSError`.
.. exception:: gaierror
- A subclass of :exc:`socket.error`, this exception is raised for
+ A subclass of :exc:`OSError`, this exception is raised for
address-related errors by :func:`getaddrinfo` and :func:`getnameinfo`.
The accompanying value is a pair ``(error, string)`` representing an error
returned by a library call. *string* represents the description of
@@ -147,15 +172,19 @@ The module :mod:`socket` exports the following constants and functions:
numeric *error* value will match one of the :const:`EAI_\*` constants
defined in this module.
+ .. versionchanged:: 3.3
+ This class was made a subclass of :exc:`OSError`.
.. exception:: timeout
- A subclass of :exc:`socket.error`, this exception is raised when a timeout
+ A subclass of :exc:`OSError`, this exception is raised when a timeout
occurs on a socket which has had timeouts enabled via a prior call to
:meth:`~socket.settimeout` (or implicitly through
:func:`~socket.setdefaulttimeout`). The accompanying value is a string
whose value is currently always "timed out".
+ .. versionchanged:: 3.3
+ This class was made a subclass of :exc:`OSError`.
.. data:: AF_UNIX
AF_INET
@@ -198,6 +227,7 @@ The module :mod:`socket` exports the following constants and functions:
SOMAXCONN
MSG_*
SOL_*
+ SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
@@ -215,6 +245,32 @@ The module :mod:`socket` exports the following constants and functions:
in the Unix header files are defined; for a few symbols, default values are
provided.
+.. data:: AF_CAN
+ PF_CAN
+ SOL_CAN_*
+ CAN_*
+
+ Many constants of these forms, documented in the Linux documentation, are
+ also defined in the socket module.
+
+ Availability: Linux >= 2.6.25.
+
+ .. versionadded:: 3.3
+
+
+.. data:: AF_RDS
+ PF_RDS
+ SOL_RDS
+ RDS_*
+
+ Many constants of these forms, documented in the Linux documentation, are
+ also defined in the socket module.
+
+ Availability: Linux >= 2.6.30.
+
+ .. versionadded:: 3.3
+
+
.. data:: SIO_*
RCVALL_*
@@ -393,10 +449,15 @@ The module :mod:`socket` exports the following constants and functions:
Create a new socket using the given address family, socket type and protocol
number. The address family should be :const:`AF_INET` (the default),
- :const:`AF_INET6` or :const:`AF_UNIX`. The socket type should be
- :const:`SOCK_STREAM` (the default), :const:`SOCK_DGRAM` or perhaps one of the
- other ``SOCK_`` constants. The protocol number is usually zero and may be
- omitted in that case.
+ :const:`AF_INET6`, :const:`AF_UNIX`, :const:`AF_CAN` or :const:`AF_RDS`. The
+ socket type should be :const:`SOCK_STREAM` (the default),
+ :const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other ``SOCK_``
+ constants. The protocol number is usually zero and may be omitted in that
+ case or :const:`CAN_RAW` in case the address family is :const:`AF_CAN`.
+
+ .. versionchanged:: 3.3
+ The AF_CAN family was added.
+ The AF_RDS family was added.
.. function:: socketpair([family[, type[, proto]]])
@@ -464,7 +525,7 @@ The module :mod:`socket` exports the following constants and functions:
Unix manual page :manpage:`inet(3)` for details.
If the IPv4 address string passed to this function is invalid,
- :exc:`socket.error` will be raised. Note that exactly what is valid depends on
+ :exc:`OSError` will be raised. Note that exactly what is valid depends on
the underlying C implementation of :c:func:`inet_aton`.
:func:`inet_aton` does not support IPv6, and :func:`inet_pton` should be used
@@ -481,7 +542,7 @@ The module :mod:`socket` exports the following constants and functions:
argument.
If the byte sequence passed to this function is not exactly 4 bytes in
- length, :exc:`socket.error` will be raised. :func:`inet_ntoa` does not
+ length, :exc:`OSError` will be raised. :func:`inet_ntoa` does not
support IPv6, and :func:`inet_ntop` should be used instead for IPv4/v6 dual
stack support.
@@ -495,7 +556,7 @@ The module :mod:`socket` exports the following constants and functions:
Supported values for *address_family* are currently :const:`AF_INET` and
:const:`AF_INET6`. If the IP address string *ip_string* is invalid,
- :exc:`socket.error` will be raised. Note that exactly what is valid depends on
+ :exc:`OSError` will be raised. Note that exactly what is valid depends on
both the value of *address_family* and the underlying implementation of
:c:func:`inet_pton`.
@@ -513,11 +574,54 @@ The module :mod:`socket` exports the following constants and functions:
Supported values for *address_family* are currently :const:`AF_INET` and
:const:`AF_INET6`. If the string *packed_ip* is not the correct length for the
specified address family, :exc:`ValueError` will be raised. A
- :exc:`socket.error` is raised for errors from the call to :func:`inet_ntop`.
+ :exc:`OSError` is raised for errors from the call to :func:`inet_ntop`.
Availability: Unix (maybe not all platforms).
+..
+ XXX: Are sendmsg(), recvmsg() and CMSG_*() available on any
+ non-Unix platforms? The old (obsolete?) 4.2BSD form of the
+ interface, in which struct msghdr has no msg_control or
+ msg_controllen members, is not currently supported.
+
+.. function:: CMSG_LEN(length)
+
+ Return the total length, without trailing padding, of an ancillary
+ data item with associated data of the given *length*. This value
+ can often be used as the buffer size for :meth:`~socket.recvmsg` to
+ receive a single item of ancillary data, but :rfc:`3542` requires
+ portable applications to use :func:`CMSG_SPACE` and thus include
+ space for padding, even when the item will be the last in the
+ buffer. Raises :exc:`OverflowError` if *length* is outside the
+ permissible range of values.
+
+ Availability: most Unix platforms, possibly others.
+
+ .. versionadded:: 3.3
+
+
+.. function:: CMSG_SPACE(length)
+
+ Return the buffer size needed for :meth:`~socket.recvmsg` to
+ receive an ancillary data item with associated data of the given
+ *length*, along with any trailing padding. The buffer space needed
+ to receive multiple items is the sum of the :func:`CMSG_SPACE`
+ values for their associated data lengths. Raises
+ :exc:`OverflowError` if *length* is outside the permissible range
+ of values.
+
+ Note that some systems might support ancillary data without
+ providing this function. Also note that setting the buffer size
+ using the results of this function may not precisely limit the
+ amount of ancillary data that can be received, since additional
+ data may be able to fit into the padding area.
+
+ Availability: most Unix platforms, possibly others.
+
+ .. versionadded:: 3.3
+
+
.. function:: getdefaulttimeout()
Return the default timeout in seconds (float) for new socket objects. A value
@@ -533,6 +637,59 @@ The module :mod:`socket` exports the following constants and functions:
meanings.
+.. function:: sethostname(name)
+
+ Set the machine's hostname to *name*. This will raise a
+ :exc:`OSError` if you don't have enough rights.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: if_nameindex()
+
+ Return a list of network interface information
+ (index int, name string) tuples.
+ :exc:`OSError` if the system call fails.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: if_nametoindex(if_name)
+
+ Return a network interface index number corresponding to an
+ interface name.
+ :exc:`OSError` if no interface with the given name exists.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: if_indextoname(if_index)
+
+ Return a network interface name corresponding to a
+ interface index number.
+ :exc:`OSError` if no interface with the given index exists.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: fromshare(data)
+
+ Instantiate a socket from data obtained from :meth:`~socket.share`.
+ The socket is assumed to be in blocking mode.
+
+ Availability: Windows.
+
+ .. versionadded:: 3.3
+
+
.. data:: SocketType
This is a Python type object that represents the socket object type. It is the
@@ -706,6 +863,109 @@ correspond to Unix system calls applicable to sockets.
to zero. (The format of *address* depends on the address family --- see above.)
+.. method:: socket.recvmsg(bufsize[, ancbufsize[, flags]])
+
+ Receive normal data (up to *bufsize* bytes) and ancillary data from
+ the socket. The *ancbufsize* argument sets the size in bytes of
+ the internal buffer used to receive the ancillary data; it defaults
+ to 0, meaning that no ancillary data will be received. Appropriate
+ buffer sizes for ancillary data can be calculated using
+ :func:`CMSG_SPACE` or :func:`CMSG_LEN`, and items which do not fit
+ into the buffer might be truncated or discarded. The *flags*
+ argument defaults to 0 and has the same meaning as for
+ :meth:`recv`.
+
+ The return value is a 4-tuple: ``(data, ancdata, msg_flags,
+ address)``. The *data* item is a :class:`bytes` object holding the
+ non-ancillary data received. The *ancdata* item is a list of zero
+ or more tuples ``(cmsg_level, cmsg_type, cmsg_data)`` representing
+ the ancillary data (control messages) received: *cmsg_level* and
+ *cmsg_type* are integers specifying the protocol level and
+ protocol-specific type respectively, and *cmsg_data* is a
+ :class:`bytes` object holding the associated data. The *msg_flags*
+ item is the bitwise OR of various flags indicating conditions on
+ the received message; see your system documentation for details.
+ If the receiving socket is unconnected, *address* is the address of
+ the sending socket, if available; otherwise, its value is
+ unspecified.
+
+ On some systems, :meth:`sendmsg` and :meth:`recvmsg` can be used to
+ pass file descriptors between processes over an :const:`AF_UNIX`
+ socket. When this facility is used (it is often restricted to
+ :const:`SOCK_STREAM` sockets), :meth:`recvmsg` will return, in its
+ ancillary data, items of the form ``(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS, fds)``, where *fds* is a :class:`bytes` object
+ representing the new file descriptors as a binary array of the
+ native C :c:type:`int` type. If :meth:`recvmsg` raises an
+ exception after the system call returns, it will first attempt to
+ close any file descriptors received via this mechanism.
+
+ Some systems do not indicate the truncated length of ancillary data
+ items which have been only partially received. If an item appears
+ to extend beyond the end of the buffer, :meth:`recvmsg` will issue
+ a :exc:`RuntimeWarning`, and will return the part of it which is
+ inside the buffer provided it has not been truncated before the
+ start of its associated data.
+
+ On systems which support the :const:`SCM_RIGHTS` mechanism, the
+ following function will receive up to *maxfds* file descriptors,
+ returning the message data and a list containing the descriptors
+ (while ignoring unexpected conditions such as unrelated control
+ messages being received). See also :meth:`sendmsg`. ::
+
+ import socket, array
+
+ def recv_fds(sock, msglen, maxfds):
+ fds = array.array("i") # Array of ints
+ msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
+ for cmsg_level, cmsg_type, cmsg_data in ancdata:
+ if (cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS):
+ # Append data, ignoring any truncated integers at the end.
+ fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
+ return msg, list(fds)
+
+ Availability: most Unix platforms, possibly others.
+
+ .. versionadded:: 3.3
+
+
+.. method:: socket.recvmsg_into(buffers[, ancbufsize[, flags]])
+
+ Receive normal data and ancillary data from the socket, behaving as
+ :meth:`recvmsg` would, but scatter the non-ancillary data into a
+ series of buffers instead of returning a new bytes object. The
+ *buffers* argument must be an iterable of objects that export
+ writable buffers (e.g. :class:`bytearray` objects); these will be
+ filled with successive chunks of the non-ancillary data until it
+ has all been written or there are no more buffers. The operating
+ system may set a limit (:func:`~os.sysconf` value ``SC_IOV_MAX``)
+ on the number of buffers that can be used. The *ancbufsize* and
+ *flags* arguments have the same meaning as for :meth:`recvmsg`.
+
+ The return value is a 4-tuple: ``(nbytes, ancdata, msg_flags,
+ address)``, where *nbytes* is the total number of bytes of
+ non-ancillary data written into the buffers, and *ancdata*,
+ *msg_flags* and *address* are the same as for :meth:`recvmsg`.
+
+ Example::
+
+ >>> import socket
+ >>> s1, s2 = socket.socketpair()
+ >>> b1 = bytearray(b'----')
+ >>> b2 = bytearray(b'0123456789')
+ >>> b3 = bytearray(b'--------------')
+ >>> s1.send(b'Mary had a little lamb')
+ 22
+ >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
+ (22, [], 0, None)
+ >>> [b1, b2, b3]
+ [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
+
+ Availability: most Unix platforms, possibly others.
+
+ .. versionadded:: 3.3
+
+
.. method:: socket.recvfrom_into(buffer[, nbytes[, flags]])
Receive data from the socket, writing it into *buffer* instead of creating a
@@ -755,6 +1015,41 @@ correspond to Unix system calls applicable to sockets.
above.)
+.. method:: socket.sendmsg(buffers[, ancdata[, flags[, address]]])
+
+ Send normal and ancillary data to the socket, gathering the
+ non-ancillary data from a series of buffers and concatenating it
+ into a single message. The *buffers* argument specifies the
+ non-ancillary data as an iterable of buffer-compatible objects
+ (e.g. :class:`bytes` objects); the operating system may set a limit
+ (:func:`~os.sysconf` value ``SC_IOV_MAX``) on the number of buffers
+ that can be used. The *ancdata* argument specifies the ancillary
+ data (control messages) as an iterable of zero or more tuples
+ ``(cmsg_level, cmsg_type, cmsg_data)``, where *cmsg_level* and
+ *cmsg_type* are integers specifying the protocol level and
+ protocol-specific type respectively, and *cmsg_data* is a
+ buffer-compatible object holding the associated data. Note that
+ some systems (in particular, systems without :func:`CMSG_SPACE`)
+ might support sending only one control message per call. The
+ *flags* argument defaults to 0 and has the same meaning as for
+ :meth:`send`. If *address* is supplied and not ``None``, it sets a
+ destination address for the message. The return value is the
+ number of bytes of non-ancillary data sent.
+
+ The following function sends the list of file descriptors *fds*
+ over an :const:`AF_UNIX` socket, on systems which support the
+ :const:`SCM_RIGHTS` mechanism. See also :meth:`recvmsg`. ::
+
+ import socket, array
+
+ def send_fds(sock, msg, fds):
+ return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
+
+ Availability: most Unix platforms, possibly others.
+
+ .. versionadded:: 3.3
+
+
.. method:: socket.setblocking(flag)
Set blocking or non-blocking mode of the socket: if *flag* is false, the
@@ -796,9 +1091,22 @@ correspond to Unix system calls applicable to sockets.
Shut down one or both halves of the connection. If *how* is :const:`SHUT_RD`,
further receives are disallowed. If *how* is :const:`SHUT_WR`, further sends
are disallowed. If *how* is :const:`SHUT_RDWR`, further sends and receives are
- disallowed. Depending on the platform, shutting down one half of the connection
- can also close the opposite half (e.g. on Mac OS X, ``shutdown(SHUT_WR)`` does
- not allow further reads on the other end of the connection).
+ disallowed.
+
+
+.. method:: socket.share(process_id)
+
+ :platform: Windows
+
+ Duplacet a socket and prepare it for sharing with a target process. The
+ target process must be provided with *process_id*. The resulting bytes object
+ can then be passed to the target process using some form of interprocess
+ communication and the socket can be recreated there using :func:`fromshare`.
+ Once this method has been called, it is safe to close the socket since
+ the operating system has already duplicated it for the target process.
+
+ .. versionadded:: 3.3
+
Note that there are no methods :meth:`read` or :meth:`write`; use
:meth:`~socket.recv` and :meth:`~socket.send` without *flags* argument instead.
@@ -943,13 +1251,13 @@ sends traffic to the first one connected successfully. ::
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
- except socket.error as msg:
+ except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
- except socket.error as msg:
+ except OSError as msg:
s.close()
s = None
continue
@@ -978,12 +1286,12 @@ sends traffic to the first one connected successfully. ::
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
- except socket.error as msg:
+ except OSError as msg:
s = None
continue
try:
s.connect(sa)
- except socket.error as msg:
+ except OSError as msg:
s.close()
s = None
continue
@@ -997,7 +1305,7 @@ sends traffic to the first one connected successfully. ::
print('Received', repr(data))
-The last example shows how to write a very simple network sniffer with raw
+The next example shows how to write a very simple network sniffer with raw
sockets on Windows. The example requires administrator privileges to modify
the interface::
@@ -1022,11 +1330,51 @@ the interface::
# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
+The last example shows how to use the socket interface to communicate to a CAN
+network. This example might require special priviledge::
+
+ import socket
+ import struct
+
+
+ # CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
+
+ can_frame_fmt = "=IB3x8s"
+ can_frame_size = struct.calcsize(can_frame_fmt)
+
+ def build_can_frame(can_id, data):
+ can_dlc = len(data)
+ data = data.ljust(8, b'\x00')
+ return struct.pack(can_frame_fmt, can_id, can_dlc, data)
+
+ def dissect_can_frame(frame):
+ can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
+ return (can_id, can_dlc, data[:can_dlc])
+
+
+ # create a raw socket and bind it to the 'vcan0' interface
+ s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ s.bind(('vcan0',))
+
+ while True:
+ cf, addr = s.recvfrom(can_frame_size)
+
+ print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
+
+ try:
+ s.send(cf)
+ except OSError:
+ print('Error sending CAN frame')
+
+ try:
+ s.send(build_can_frame(0x01, b'\x01\x02\x03'))
+ except OSError:
+ print('Error sending CAN frame')
Running an example several times with too small delay between executions, could
lead to this error::
- socket.error: [Errno 98] Address already in use
+ OSError: [Errno 98] Address already in use
This is because the previous execution has left the socket in a ``TIME_WAIT``
state, and can't be immediately reused.
diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst
index 5287f17..28e8a0a 100644
--- a/Doc/library/socketserver.rst
+++ b/Doc/library/socketserver.rst
@@ -153,10 +153,24 @@ Server Objects
.. method:: BaseServer.serve_forever(poll_interval=0.5)
- Handle requests until an explicit :meth:`shutdown` request.
- Poll for shutdown every *poll_interval* seconds. Ignores :attr:`self.timeout`.
- If you need to do periodic tasks, do them in another thread.
+ Handle requests until an explicit :meth:`shutdown` request. Poll for
+ shutdown every *poll_interval* seconds. Ignores :attr:`self.timeout`. It
+ also calls :meth:`service_actions`, which may be used by a subclass or mixin
+ to provide actions specific to a given service. For example, the
+ :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
+ child processes.
+ .. versionchanged:: 3.3
+ Added ``service_actions`` call to the ``serve_forever`` method.
+
+
+.. method:: BaseServer.service_actions()
+
+ This is called in the :meth:`serve_forever` loop. This method is can be
+ overridden by subclasses or mixin classes to perform actions specific to
+ a given service, such as cleanup actions.
+
+ .. versionadded:: 3.3
.. method:: BaseServer.shutdown()
diff --git a/Doc/library/someos.rst b/Doc/library/someos.rst
deleted file mode 100644
index d2009bb..0000000
--- a/Doc/library/someos.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _someos:
-
-**********************************
-Optional Operating System Services
-**********************************
-
-The modules described in this chapter provide interfaces to operating system
-features that are available on selected operating systems only. The interfaces
-are generally modeled after the Unix or C interfaces but they are available on
-some other systems as well (e.g. Windows). Here's an overview:
-
-
-.. toctree::
-
- select.rst
- threading.rst
- multiprocessing.rst
- concurrent.futures.rst
- mmap.rst
- readline.rst
- rlcompleter.rst
- dummy_threading.rst
- _thread.rst
- _dummy_thread.rst
diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst
index 93f6d82..7d156def 100644
--- a/Doc/library/sqlite3.rst
+++ b/Doc/library/sqlite3.rst
@@ -369,6 +369,22 @@ Connection Objects
method with :const:`None` for *handler*.
+ .. method:: set_trace_callback(trace_callback)
+
+ Registers *trace_callback* to be called for each SQL statement that is
+ actually executed by the SQLite backend.
+
+ The only argument passed to the callback is the statement (as string) that
+ is being executed. The return value of the callback is ignored. Note that
+ the backend does not only run statements passed to the :meth:`Cursor.execute`
+ methods. Other sources include the transaction management of the Python
+ module and the execution of triggers defined in the current database.
+
+ Passing :const:`None` as *trace_callback* will disable the trace callback.
+
+ .. versionadded:: 3.3
+
+
.. method:: enable_load_extension(enabled)
This routine allows/disallows the SQLite engine to load SQLite extensions
diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
index 0f5cea2..77196e1 100644
--- a/Doc/library/ssl.rst
+++ b/Doc/library/ssl.rst
@@ -53,9 +53,69 @@ Functions, Constants, and Exceptions
(currently provided by the OpenSSL library). This signifies some
problem in the higher-level encryption and authentication layer that's
superimposed on the underlying network connection. This error
- is a subtype of :exc:`socket.error`, which in turn is a subtype of
- :exc:`IOError`. The error code and message of :exc:`SSLError` instances
- are provided by the OpenSSL library.
+ is a subtype of :exc:`OSError`. The error code and message of
+ :exc:`SSLError` instances are provided by the OpenSSL library.
+
+ .. versionchanged:: 3.3
+ :exc:`SSLError` used to be a subtype of :exc:`socket.error`.
+
+ .. attribute:: library
+
+ A string mnemonic designating the OpenSSL submodule in which the error
+ occurred, such as ``SSL``, ``PEM`` or ``X509``. The range of possible
+ values depends on the OpenSSL version.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: reason
+
+ A string mnemonic designating the reason this error occurred, for
+ example ``CERTIFICATE_VERIFY_FAILED``. The range of possible
+ values depends on the OpenSSL version.
+
+ .. versionadded:: 3.3
+
+.. exception:: SSLZeroReturnError
+
+ A subclass of :exc:`SSLError` raised when trying to read or write and
+ the SSL connection has been closed cleanly. Note that this doesn't
+ mean that the underlying transport (read TCP) has been closed.
+
+ .. versionadded:: 3.3
+
+.. exception:: SSLWantReadError
+
+ A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket
+ <ssl-nonblocking>` when trying to read or write data, but more data needs
+ to be received on the underlying TCP transport before the request can be
+ fulfilled.
+
+ .. versionadded:: 3.3
+
+.. exception:: SSLWantWriteError
+
+ A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket
+ <ssl-nonblocking>` when trying to read or write data, but more data needs
+ to be sent on the underlying TCP transport before the request can be
+ fulfilled.
+
+ .. versionadded:: 3.3
+
+.. exception:: SSLSyscallError
+
+ A subclass of :exc:`SSLError` raised when a system error was encountered
+ while trying to fulfill an operation on a SSL socket. Unfortunately,
+ there is no easy way to inspect the original errno number.
+
+ .. versionadded:: 3.3
+
+.. exception:: SSLEOFError
+
+ A subclass of :exc:`SSLError` raised when the SSL connection has been
+ terminated abruptly. Generally, you shouldn't try to reuse the underlying
+ transport when this error is encountered.
+
+ .. versionadded:: 3.3
.. exception:: CertificateError
@@ -161,6 +221,35 @@ instead.
Random generation
^^^^^^^^^^^^^^^^^
+.. function:: RAND_bytes(num)
+
+ Returns *num* cryptographically strong pseudo-random bytes. Raises an
+ :class:`SSLError` if the PRNG has not been seeded with enough data or if the
+ operation is not supported by the current RAND method. :func:`RAND_status`
+ can be used to check the status of the PRNG and :func:`RAND_add` can be used
+ to seed the PRNG.
+
+ Read the Wikipedia article, `Cryptographically secure pseudorandom number
+ generator (CSPRNG)
+ <http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator>`_,
+ to get the requirements of a cryptographically generator.
+
+ .. versionadded:: 3.3
+
+.. function:: RAND_pseudo_bytes(num)
+
+ Returns (bytes, is_cryptographic): bytes are *num* pseudo-random bytes,
+ is_cryptographic is True if the bytes generated are cryptographically
+ strong. Raises an :class:`SSLError` if the operation is not supported by the
+ current RAND method.
+
+ Generated pseudo-random byte sequences will be unique if they are of
+ sufficient length, but are not necessarily unpredictable. They can be used
+ for non-cryptographic purposes and for certain purposes in cryptographic
+ protocols, but usually not for key generation etc.
+
+ .. versionadded:: 3.3
+
.. function:: RAND_status()
Returns True if the SSL pseudo-random number generator has been seeded with
@@ -170,7 +259,7 @@ Random generation
.. function:: RAND_egd(path)
- If you are running an entropy-gathering daemon (EGD) somewhere, and ``path``
+ If you are running an entropy-gathering daemon (EGD) somewhere, and *path*
is the pathname of a socket connection open to it, this will read 256 bytes
of randomness from the socket, and add it to the SSL pseudo-random number
generator to increase the security of generated secret keys. This is
@@ -181,8 +270,8 @@ Random generation
.. function:: RAND_add(bytes, entropy)
- Mixes the given ``bytes`` into the SSL pseudo-random number generator. The
- parameter ``entropy`` (a float) is a lower bound on the entropy contained in
+ Mixes the given *bytes* into the SSL pseudo-random number generator. The
+ parameter *entropy* (a float) is a lower bound on the entropy contained in
string (so you can always use :const:`0.0`). See :rfc:`1750` for more
information on sources of entropy.
@@ -238,6 +327,9 @@ Certificate handling
will attempt to validate the server certificate against that set of root
certificates, and will fail if the validation attempt fails.
+ .. versionchanged:: 3.3
+ This function is now IPv6-compatible.
+
.. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded
@@ -345,6 +437,46 @@ Constants
.. versionadded:: 3.2
+.. data:: OP_CIPHER_SERVER_PREFERENCE
+
+ Use the server's cipher ordering preference, rather than the client's.
+ This option has no effect on client sockets and SSLv2 server sockets.
+
+ .. versionadded:: 3.3
+
+.. data:: OP_SINGLE_DH_USE
+
+ Prevents re-use of the same DH key for distinct SSL sessions. This
+ improves forward secrecy but requires more computational resources.
+ This option only applies to server sockets.
+
+ .. versionadded:: 3.3
+
+.. data:: OP_SINGLE_ECDH_USE
+
+ Prevents re-use of the same ECDH key for distinct SSL sessions. This
+ improves forward secrecy but requires more computational resources.
+ This option only applies to server sockets.
+
+ .. versionadded:: 3.3
+
+.. data:: OP_NO_COMPRESSION
+
+ Disable compression on the SSL channel. This is useful if the application
+ protocol supports its own compression scheme.
+
+ This option is only available with OpenSSL 1.0.0 and later.
+
+ .. versionadded:: 3.3
+
+.. data:: HAS_ECDH
+
+ Whether the OpenSSL library has built-in support for Elliptic Curve-based
+ Diffie-Hellman key exchange. This should be true unless the feature was
+ explicitly disabled by the distributor.
+
+ .. versionadded:: 3.3
+
.. data:: HAS_SNI
Whether the OpenSSL library has built-in support for the *Server Name
@@ -354,6 +486,23 @@ Constants
.. versionadded:: 3.2
+.. data:: HAS_NPN
+
+ Whether the OpenSSL library has built-in support for *Next Protocol
+ Negotiation* as described in the `NPN draft specification
+ <http://tools.ietf.org/html/draft-agl-tls-nextprotoneg>`_. When true,
+ you can use the :meth:`SSLContext.set_npn_protocols` method to advertise
+ which protocols you want to support.
+
+ .. versionadded:: 3.3
+
+.. data:: CHANNEL_BINDING_TYPES
+
+ List of supported TLS channel binding types. Strings in this list
+ can be used as arguments to :meth:`SSLSocket.get_channel_binding`.
+
+ .. versionadded:: 3.3
+
.. data:: OPENSSL_VERSION
The version string of the OpenSSL library loaded by the interpreter::
@@ -479,6 +628,37 @@ SSL sockets also have the following additional methods and attributes:
version of the SSL protocol that defines its use, and the number of secret
bits being used. If no connection has been established, returns ``None``.
+.. method:: SSLSocket.compression()
+
+ Return the compression algorithm being used as a string, or ``None``
+ if the connection isn't compressed.
+
+ If the higher-level protocol supports its own compression mechanism,
+ you can use :data:`OP_NO_COMPRESSION` to disable SSL-level compression.
+
+ .. versionadded:: 3.3
+
+.. method:: SSLSocket.get_channel_binding(cb_type="tls-unique")
+
+ Get channel binding data for current connection, as a bytes object. Returns
+ ``None`` if not connected or the handshake has not been completed.
+
+ The *cb_type* parameter allow selection of the desired channel binding
+ type. Valid channel binding types are listed in the
+ :data:`CHANNEL_BINDING_TYPES` list. Currently only the 'tls-unique' channel
+ binding, defined by :rfc:`5929`, is supported. :exc:`ValueError` will be
+ raised if an unsupported channel binding type is requested.
+
+ .. versionadded:: 3.3
+
+.. method:: SSLSocket.selected_npn_protocol()
+
+ Returns the protocol that was selected during the TLS/SSL handshake. If
+ :meth:`SSLContext.set_npn_protocols` was not called, or if the other party
+ does not support NPN, or if the handshake has not yet happened, this will
+ return ``None``.
+
+ .. versionadded:: 3.3
.. method:: SSLSocket.unwrap()
@@ -488,7 +668,6 @@ SSL sockets also have the following additional methods and attributes:
returned socket should always be used for further communication with the
other side of the connection, rather than the original socket.
-
.. attribute:: SSLSocket.context
The :class:`SSLContext` object this SSL socket is tied to. If the SSL
@@ -518,7 +697,7 @@ to speed up repeated connections from the same clients.
:class:`SSLContext` objects have the following methods and attributes:
-.. method:: SSLContext.load_cert_chain(certfile, keyfile=None)
+.. method:: SSLContext.load_cert_chain(certfile, keyfile=None, password=None)
Load a private key and the corresponding certificate. The *certfile*
string must be the path to a single file in PEM format containing the
@@ -529,9 +708,25 @@ to speed up repeated connections from the same clients.
:ref:`ssl-certificates` for more information on how the certificate
is stored in the *certfile*.
+ The *password* argument may be a function to call to get the password for
+ decrypting the private key. It will only be called if the private key is
+ encrypted and a password is necessary. It will be called with no arguments,
+ and it should return a string, bytes, or bytearray. If the return value is
+ a string it will be encoded as UTF-8 before using it to decrypt the key.
+ Alternatively a string, bytes, or bytearray value may be supplied directly
+ as the *password* argument. It will be ignored if the private key is not
+ encrypted and no password is needed.
+
+ If the *password* argument is not specified and a password is required,
+ OpenSSL's built-in password prompting mechanism will be used to
+ interactively prompt the user for a password.
+
An :class:`SSLError` is raised if the private key doesn't
match with the certificate.
+ .. versionchanged:: 3.3
+ New optional argument *password*.
+
.. method:: SSLContext.load_verify_locations(cafile=None, capath=None)
Load a set of "certification authority" (CA) certificates used to validate
@@ -570,6 +765,53 @@ to speed up repeated connections from the same clients.
when connected, the :meth:`SSLSocket.cipher` method of SSL sockets will
give the currently selected cipher.
+.. method:: SSLContext.set_npn_protocols(protocols)
+
+ Specify which protocols the socket should avertise during the SSL/TLS
+ handshake. It should be a list of strings, like ``['http/1.1', 'spdy/2']``,
+ ordered by preference. The selection of a protocol will happen during the
+ handshake, and will play out according to the `NPN draft specification
+ <http://tools.ietf.org/html/draft-agl-tls-nextprotoneg>`_. After a
+ successful handshake, the :meth:`SSLSocket.selected_npn_protocol` method will
+ return the agreed-upon protocol.
+
+ This method will raise :exc:`NotImplementedError` if :data:`HAS_NPN` is
+ False.
+
+ .. versionadded:: 3.3
+
+.. method:: SSLContext.load_dh_params(dhfile)
+
+ Load the key generation parameters for Diffie-Helman (DH) key exchange.
+ Using DH key exchange improves forward secrecy at the expense of
+ computational resources (both on the server and on the client).
+ The *dhfile* parameter should be the path to a file containing DH
+ parameters in PEM format.
+
+ This setting doesn't apply to client sockets. You can also use the
+ :data:`OP_SINGLE_DH_USE` option to further improve security.
+
+ .. versionadded:: 3.3
+
+.. method:: SSLContext.set_ecdh_curve(curve_name)
+
+ Set the curve name for Elliptic Curve-based Diffie-Hellman (ECDH) key
+ exchange. ECDH is significantly faster than regular DH while arguably
+ as secure. The *curve_name* parameter should be a string describing
+ a well-known elliptic curve, for example ``prime256v1`` for a widely
+ supported curve.
+
+ This setting doesn't apply to client sockets. You can also use the
+ :data:`OP_SINGLE_ECDH_USE` option to further improve security.
+
+ This method is not available if :data:`HAS_ECDH` is False.
+
+ .. versionadded:: 3.3
+
+ .. seealso::
+ `SSL/TLS & Perfect Forward Secrecy <http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html>`_
+ Vincent Bernat.
+
.. method:: SSLContext.wrap_socket(sock, server_side=False, \
do_handshake_on_connect=True, suppress_ragged_eofs=True, \
server_hostname=None)
@@ -984,13 +1226,10 @@ to be aware of:
try:
sock.do_handshake()
break
- except ssl.SSLError as err:
- if err.args[0] == ssl.SSL_ERROR_WANT_READ:
- select.select([sock], [], [])
- elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
- select.select([], [sock], [])
- else:
- raise
+ except ssl.SSLWantReadError:
+ select.select([sock], [], [])
+ except ssl.SSLWantWriteError:
+ select.select([], [sock], [])
.. _ssl-security:
diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst
index 7de98b6..f47f464 100644
--- a/Doc/library/stat.rst
+++ b/Doc/library/stat.rst
@@ -104,6 +104,16 @@ Example::
if __name__ == '__main__':
walktree(sys.argv[1], visitfile)
+An additional utility function is provided to covert a file's mode in a human
+readable string:
+
+.. function:: filemode(mode)
+
+ Convert a file's mode to a string of the form '-rwxrwxrwx'.
+
+ .. versionadded:: 3.3
+
+
All the variables below are simply symbolic indexes into the 10-tuple returned
by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`.
@@ -344,4 +354,3 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`:
The file is a snapshot file.
See the \*BSD or Mac OS systems man page :manpage:`chflags(2)` for more information.
-
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index f6eca56..27be4f5 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -15,6 +15,10 @@ interpreter.
The principal built-in types are numerics, sequences, mappings, classes,
instances and exceptions.
+Some collection classes are mutable. The methods that add, subtract, or
+rearrange their members in place, and don't return a specific item, never return
+the collection instance itself but ``None``.
+
Some operations are supported by several object types; in particular,
practically all objects can be compared, tested for truth value, and converted
to a string (with the :func:`repr` function or the slightly different
@@ -641,34 +645,34 @@ made available to Python as the :attr:`modulus` attribute of
Here are the rules in detail:
- - If ``x = m / n`` is a nonnegative rational number and ``n`` is not divisible
- by ``P``, define ``hash(x)`` as ``m * invmod(n, P) % P``, where ``invmod(n,
- P)`` gives the inverse of ``n`` modulo ``P``.
+- If ``x = m / n`` is a nonnegative rational number and ``n`` is not divisible
+ by ``P``, define ``hash(x)`` as ``m * invmod(n, P) % P``, where ``invmod(n,
+ P)`` gives the inverse of ``n`` modulo ``P``.
- - If ``x = m / n`` is a nonnegative rational number and ``n`` is
- divisible by ``P`` (but ``m`` is not) then ``n`` has no inverse
- modulo ``P`` and the rule above doesn't apply; in this case define
- ``hash(x)`` to be the constant value ``sys.hash_info.inf``.
+- If ``x = m / n`` is a nonnegative rational number and ``n`` is
+ divisible by ``P`` (but ``m`` is not) then ``n`` has no inverse
+ modulo ``P`` and the rule above doesn't apply; in this case define
+ ``hash(x)`` to be the constant value ``sys.hash_info.inf``.
- - If ``x = m / n`` is a negative rational number define ``hash(x)``
- as ``-hash(-x)``. If the resulting hash is ``-1``, replace it with
- ``-2``.
+- If ``x = m / n`` is a negative rational number define ``hash(x)``
+ as ``-hash(-x)``. If the resulting hash is ``-1``, replace it with
+ ``-2``.
- - The particular values ``sys.hash_info.inf``, ``-sys.hash_info.inf``
- and ``sys.hash_info.nan`` are used as hash values for positive
- infinity, negative infinity, or nans (respectively). (All hashable
- nans have the same hash value.)
+- The particular values ``sys.hash_info.inf``, ``-sys.hash_info.inf``
+ and ``sys.hash_info.nan`` are used as hash values for positive
+ infinity, negative infinity, or nans (respectively). (All hashable
+ nans have the same hash value.)
- - For a :class:`complex` number ``z``, the hash values of the real
- and imaginary parts are combined by computing ``hash(z.real) +
- sys.hash_info.imag * hash(z.imag)``, reduced modulo
- ``2**sys.hash_info.width`` so that it lies in
- ``range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width -
- 1))``. Again, if the result is ``-1``, it's replaced with ``-2``.
+- For a :class:`complex` number ``z``, the hash values of the real
+ and imaginary parts are combined by computing ``hash(z.real) +
+ sys.hash_info.imag * hash(z.imag)``, reduced modulo
+ ``2**sys.hash_info.width`` so that it lies in
+ ``range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width -
+ 1))``. Again, if the result is ``-1``, it's replaced with ``-2``.
To clarify the above rules, here's some example Python code,
-equivalent to the builtin hash, for computing the hash of a rational
+equivalent to the built-in hash, for computing the hash of a rational
number, :class:`float`, or :class:`complex`::
@@ -796,110 +800,35 @@ the yield expression <yieldexpr>`.
.. _typesseq:
-Sequence Types --- :class:`str`, :class:`bytes`, :class:`bytearray`, :class:`list`, :class:`tuple`, :class:`range`
-==================================================================================================================
+Sequence Types --- :class:`list`, :class:`tuple`, :class:`range`
+================================================================
-There are six sequence types: strings, byte sequences (:class:`bytes` objects),
-byte arrays (:class:`bytearray` objects), lists, tuples, and range objects. For
-other containers see the built in :class:`dict` and :class:`set` classes, and
-the :mod:`collections` module.
+There are three basic sequence types: lists, tuples, and range objects.
+Additional sequence types tailored for processing of
+:ref:`binary data <binaryseq>` and :ref:`text strings <textseq>` are
+described in dedicated sections.
-.. index::
- object: sequence
- object: string
- object: bytes
- object: bytearray
- object: tuple
- object: list
- object: range
-
-Strings contain Unicode characters. Their literals are written in single or
-double quotes: ``'xyzzy'``, ``"frobozz"``. See :ref:`strings` for more about
-string literals. In addition to the functionality described here, there are
-also string-specific methods described in the :ref:`string-methods` section.
-
-Bytes and bytearray objects contain single bytes -- the former is immutable
-while the latter is a mutable sequence.
-Bytes objects can be constructed by using the
-constructor, :func:`bytes`, and from literals; use a ``b`` prefix with normal
-string syntax: ``b'xyzzy'``. To construct byte arrays, use the
-:func:`bytearray` function.
-
-While string objects are sequences of characters (represented by strings of
-length 1), bytes and bytearray objects are sequences of *integers* (between 0
-and 255), representing the ASCII value of single bytes. That means that for
-a bytes or bytearray object *b*, ``b[0]`` will be an integer, while
-``b[0:1]`` will be a bytes or bytearray object of length 1. The
-representation of bytes objects uses the literal format (``b'...'``) since it
-is generally more useful than e.g. ``bytes([50, 19, 100])``. You can always
-convert a bytes object into a list of integers using ``list(b)``.
-
-Also, while in previous Python versions, byte strings and Unicode strings
-could be exchanged for each other rather freely (barring encoding issues),
-strings and bytes are now completely separate concepts. There's no implicit
-en-/decoding if you pass an object of the wrong type. A string always
-compares unequal to a bytes or bytearray object.
-
-Lists are constructed with square brackets, separating items with commas: ``[a,
-b, c]``. Tuples are constructed by the comma operator (not within square
-brackets), with or without enclosing parentheses, but an empty tuple must have
-the enclosing parentheses, such as ``a, b, c`` or ``()``. A single item tuple
-must have a trailing comma, such as ``(d,)``.
-
-Objects of type range are created using the :func:`range` function. They don't
-support concatenation or repetition, and using :func:`min` or :func:`max` on
-them is inefficient.
-
-Most sequence types support the following operations. The ``in`` and ``not in``
-operations have the same priorities as the comparison operations. The ``+`` and
-``*`` operations have the same priority as the corresponding numeric operations.
-[3]_ Additional methods are provided for :ref:`typesseq-mutable`.
+.. _typesseq-common:
+
+Common Sequence Operations
+--------------------------
+
+.. index:: object: sequence
+
+The operations in the following table are supported by most sequence types,
+both mutable and immutable. The :class:`collections.abc.Sequence` ABC is
+provided to make it easier to correctly implement these operations on
+custom sequence types.
This table lists the sequence operations sorted in ascending priority
(operations in the same box have the same priority). In the table, *s* and *t*
-are sequences of the same type; *n*, *i*, *j* and *k* are integers.
-
-+------------------+--------------------------------+----------+
-| Operation | Result | Notes |
-+==================+================================+==========+
-| ``x in s`` | ``True`` if an item of *s* is | \(1) |
-| | equal to *x*, else ``False`` | |
-+------------------+--------------------------------+----------+
-| ``x not in s`` | ``False`` if an item of *s* is | \(1) |
-| | equal to *x*, else ``True`` | |
-+------------------+--------------------------------+----------+
-| ``s + t`` | the concatenation of *s* and | \(6) |
-| | *t* | |
-+------------------+--------------------------------+----------+
-| ``s * n, n * s`` | *n* shallow copies of *s* | \(2) |
-| | concatenated | |
-+------------------+--------------------------------+----------+
-| ``s[i]`` | *i*\ th item of *s*, origin 0 | \(3) |
-+------------------+--------------------------------+----------+
-| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |
-+------------------+--------------------------------+----------+
-| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |
-| | with step *k* | |
-+------------------+--------------------------------+----------+
-| ``len(s)`` | length of *s* | |
-+------------------+--------------------------------+----------+
-| ``min(s)`` | smallest item of *s* | |
-+------------------+--------------------------------+----------+
-| ``max(s)`` | largest item of *s* | |
-+------------------+--------------------------------+----------+
-| ``s.index(i)`` | index of the first occurence | |
-| | of *i* in *s* | |
-+------------------+--------------------------------+----------+
-| ``s.count(i)`` | total number of occurences of | |
-| | *i* in *s* | |
-+------------------+--------------------------------+----------+
-
-Sequence types also support comparisons. In particular, tuples and lists are
-compared lexicographically by comparing corresponding elements. This means that
-to compare equal, every element must compare equal and the two sequences must be
-of the same type and have the same length. (For full details see
-:ref:`comparisons` in the language reference.)
+are sequences of the same type, *n*, *i*, *j* and *k* are integers and *x* is
+an arbitrary object that meets any type and value restrictions imposed by *s*.
+
+The ``in`` and ``not in`` operations have the same priorities as the
+comparison operations. The ``+`` (concatenation) and ``*`` (repetition)
+operations have the same priority as the corresponding numeric operations.
.. index::
triple: operations on; sequence; types
@@ -912,18 +841,67 @@ of the same type and have the same length. (For full details see
pair: slice; operation
operator: in
operator: not in
+ single: count() (sequence method)
+ single: index() (sequence method)
+
++--------------------------+--------------------------------+----------+
+| Operation | Result | Notes |
++==========================+================================+==========+
+| ``x in s`` | ``True`` if an item of *s* is | \(1) |
+| | equal to *x*, else ``False`` | |
++--------------------------+--------------------------------+----------+
+| ``x not in s`` | ``False`` if an item of *s* is | \(1) |
+| | equal to *x*, else ``True`` | |
++--------------------------+--------------------------------+----------+
+| ``s + t`` | the concatenation of *s* and | (6)(7) |
+| | *t* | |
++--------------------------+--------------------------------+----------+
+| ``s * n`` or | *n* shallow copies of *s* | (2)(7) |
+| ``n * s`` | concatenated | |
++--------------------------+--------------------------------+----------+
+| ``s[i]`` | *i*\ th item of *s*, origin 0 | \(3) |
++--------------------------+--------------------------------+----------+
+| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |
++--------------------------+--------------------------------+----------+
+| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |
+| | with step *k* | |
++--------------------------+--------------------------------+----------+
+| ``len(s)`` | length of *s* | |
++--------------------------+--------------------------------+----------+
+| ``min(s)`` | smallest item of *s* | |
++--------------------------+--------------------------------+----------+
+| ``max(s)`` | largest item of *s* | |
++--------------------------+--------------------------------+----------+
+| ``s.index(x[, i[, j]])`` | index of the first occurence | \(8) |
+| | of *x* in *s* (at or after | |
+| | index *i* and before index *j*)| |
++--------------------------+--------------------------------+----------+
+| ``s.count(x)`` | total number of occurences of | |
+| | *x* in *s* | |
++--------------------------+--------------------------------+----------+
+
+Sequences of the same type also support comparisons. In particular, tuples
+and lists are compared lexicographically by comparing corresponding elements.
+This means that to compare equal, every element must compare equal and the
+two sequences must be of the same type and have the same length. (For full
+details see :ref:`comparisons` in the language reference.)
Notes:
(1)
- When *s* is a string object, the ``in`` and ``not in`` operations act like a
- substring test.
+ While the ``in`` and ``not in`` operations are used only for simple
+ containment testing in the general case, some specialised sequences
+ (such as :class:`str`, :class:`bytes` and :class:`bytearray`) also use
+ them for subsequence testing::
+
+ >>> "gg" in "eggs"
+ True
(2)
Values of *n* less than ``0`` are treated as ``0`` (which yields an empty
sequence of the same type as *s*). Note also that the copies are shallow;
nested structures are not copied. This often haunts new Python programmers;
- consider:
+ consider::
>>> lists = [[]] * 3
>>> lists
@@ -935,7 +913,7 @@ Notes:
What has happened is that ``[[]]`` is a one-element list containing an empty
list, so all three elements of ``[[]] * 3`` are (pointers to) this single empty
list. Modifying any of the elements of ``lists`` modifies this single list.
- You can create a list of different lists this way:
+ You can create a list of different lists this way::
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
@@ -966,33 +944,476 @@ Notes:
If *k* is ``None``, it is treated like ``1``.
(6)
- Concatenating immutable strings always results in a new object. This means
- that building up a string by repeated concatenation will have a quadratic
- runtime cost in the total string length. To get a linear runtime cost,
- you must switch to one of the alternatives below:
+ Concatenating immutable sequences always results in a new object. This
+ means that building up a sequence by repeated concatenation will have a
+ quadratic runtime cost in the total sequence length. To get a linear
+ runtime cost, you must switch to one of the alternatives below:
* if concatenating :class:`str` objects, you can build a list and use
- :meth:`str.join` at the end;
+ :meth:`str.join` at the end or else write to a :class:`io.StringIO`
+ instance and retrieve its value when complete
* if concatenating :class:`bytes` objects, you can similarly use
- :meth:`bytes.join`, or you can do in-place concatenation with a
- :class:`bytearray` object. :class:`bytearray` objects are mutable and
- have an efficient overallocation mechanism.
+ :meth:`bytes.join` or :class:`io.BytesIO`, or you can do in-place
+ concatenation with a :class:`bytearray` object. :class:`bytearray`
+ objects are mutable and have an efficient overallocation mechanism
+
+ * if concatenating :class:`tuple` objects, extend a :class:`list` instead
+
+ * for other types, investigate the relevant class documentation
+
+
+(7)
+ Some sequence types (such as :class:`range`) only support item sequences
+ that follow specific patterns, and hence don't support sequence
+ concatenation or repetition.
+
+(8)
+ ``index`` raises :exc:`ValueError` when *x* is not found in *s*.
+ When supported, the additional arguments to the index method allow
+ efficient searching of subsections of the sequence. Passing the extra
+ arguments is roughly equivalent to using ``s[i:j].index(x)``, only
+ without copying any data and with the returned index being relative to
+ the start of the sequence rather than the start of the slice.
+
+
+.. _typesseq-immutable:
+
+Immutable Sequence Types
+------------------------
+
+.. index::
+ triple: immutable; sequence; types
+ object: tuple
+ builtin: hash
+
+The only operation that immutable sequence types generally implement that is
+not also implemented by mutable sequence types is support for the :func:`hash`
+built-in.
+
+This support allows immutable sequences, such as :class:`tuple` instances, to
+be used as :class:`dict` keys and stored in :class:`set` and :class:`frozenset`
+instances.
+
+Attempting to hash an immutable sequence that contains unhashable values will
+result in :exc:`TypeError`.
+
+
+.. _typesseq-mutable:
+
+Mutable Sequence Types
+----------------------
+
+.. index::
+ triple: mutable; sequence; types
+ object: list
+ object: bytearray
+
+The operations in the following table are defined on mutable sequence types.
+The :class:`collections.abc.MutableSequence` ABC is provided to make it
+easier to correctly implement these operations on custom sequence types.
+
+In the table *s* is an instance of a mutable sequence type, *t* is any
+iterable object and *x* is an arbitrary object that meets any type
+and value restrictions imposed by *s* (for example, :class:`bytearray` only
+accepts integers that meet the value restriction ``0 <= x <= 255``).
+
+
+.. index::
+ triple: operations on; sequence; types
+ triple: operations on; list; type
+ pair: subscript; assignment
+ pair: slice; assignment
+ statement: del
+ single: append() (sequence method)
+ single: clear() (sequence method)
+ single: copy() (sequence method)
+ single: extend() (sequence method)
+ single: insert() (sequence method)
+ single: pop() (sequence method)
+ single: remove() (sequence method)
+ single: reverse() (sequence method)
+
++------------------------------+--------------------------------+---------------------+
+| Operation | Result | Notes |
++==============================+================================+=====================+
+| ``s[i] = x`` | item *i* of *s* is replaced by | |
+| | *x* | |
++------------------------------+--------------------------------+---------------------+
+| ``s[i:j] = t`` | slice of *s* from *i* to *j* | |
+| | is replaced by the contents of | |
+| | the iterable *t* | |
++------------------------------+--------------------------------+---------------------+
+| ``del s[i:j]`` | same as ``s[i:j] = []`` | |
++------------------------------+--------------------------------+---------------------+
+| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` | \(1) |
+| | are replaced by those of *t* | |
++------------------------------+--------------------------------+---------------------+
+| ``del s[i:j:k]`` | removes the elements of | |
+| | ``s[i:j:k]`` from the list | |
++------------------------------+--------------------------------+---------------------+
+| ``s.append(x)`` | appends *x* to the end of the | |
+| | sequence (same as | |
+| | ``s[len(s):len(s)] = [x]``) | |
++------------------------------+--------------------------------+---------------------+
+| ``s.clear()`` | removes all items from ``s`` | \(5) |
+| | (same as ``del s[:]``) | |
++------------------------------+--------------------------------+---------------------+
+| ``s.copy()`` | creates a shallow copy of ``s``| \(5) |
+| | (same as ``s[:]``) | |
++------------------------------+--------------------------------+---------------------+
+| ``s.extend(t)`` | extends *s* with the | |
+| | contents of *t* (same as | |
+| | ``s[len(s):len(s)] = t``) | |
++------------------------------+--------------------------------+---------------------+
+| ``s.insert(i, x)`` | inserts *x* into *s* at the | |
+| | index given by *i* | |
+| | (same as ``s[i:i] = [x]``) | |
++------------------------------+--------------------------------+---------------------+
+| ``s.pop([i])`` | retrieves the item at *i* and | \(2) |
+| | also removes it from *s* | |
++------------------------------+--------------------------------+---------------------+
+| ``s.remove(x)`` | remove the first item from *s* | \(3) |
+| | where ``s[i] == x`` | |
++------------------------------+--------------------------------+---------------------+
+| ``s.reverse()`` | reverses the items of *s* in | \(4) |
+| | place | |
++------------------------------+--------------------------------+---------------------+
+
+
+Notes:
+
+(1)
+ *t* must have the same length as the slice it is replacing.
+
+(2)
+ The optional argument *i* defaults to ``-1``, so that by default the last
+ item is removed and returned.
+
+(3)
+ ``remove`` raises :exc:`ValueError` when *x* is not found in *s*.
+
+(4)
+ The :meth:`reverse` method modifies the sequence in place for economy of
+ space when reversing a large sequence. To remind users that it operates by
+ side effect, it does not return the reversed sequence.
+
+(5)
+ :meth:`clear` and :meth:`!copy` are included for consistency with the
+ interfaces of mutable containers that don't support slicing operations
+ (such as :class:`dict` and :class:`set`)
+
+ .. versionadded:: 3.3
+ :meth:`clear` and :meth:`!copy` methods.
+
+
+.. _typesseq-list:
+
+Lists
+-----
+
+.. index:: object: list
+
+Lists are mutable sequences, typically used to store collections of
+homogeneous items (where the precise degree of similarity will vary by
+application).
+
+.. class:: list([iterable])
+
+ Lists may be constructed in several ways:
+
+ * Using a pair of square brackets to denote the empty list: ``[]``
+ * Using square brackets, separating items with commas: ``[a]``, ``[a, b, c]``
+ * Using a list comprehension: ``[x for x in iterable]``
+ * Using the type constructor: ``list()`` or ``list(iterable)``
+
+ The constructor builds a list whose items are the same and in the same
+ order as *iterable*'s items. *iterable* may be either a sequence, a
+ container that supports iteration, or an iterator object. If *iterable*
+ is already a list, a copy is made and returned, similar to ``iterable[:]``.
+ For example, ``list('abc')`` returns ``['a', 'b', 'c']`` and
+ ``list( (1, 2, 3) )`` returns ``[1, 2, 3]``.
+ If no argument is given, the constructor creates a new empty list, ``[]``.
+
+
+ Many other operations also produce lists, including the :func:`sorted`
+ built-in.
+
+ Lists implement all of the :ref:`common <typesseq-common>` and
+ :ref:`mutable <typesseq-mutable>` sequence operations. Lists also provide the
+ following additional method:
+
+ .. method:: list.sort(*, key=None, reverse=None)
+
+ This method sorts the list in place, using only ``<`` comparisons
+ between items. Exceptions are not suppressed - if any comparison operations
+ fail, the entire sort operation will fail (and the list will likely be left
+ in a partially modified state).
+
+ *key* specifies a function of one argument that is used to extract a
+ comparison key from each list element (for example, ``key=str.lower``).
+ The key corresponding to each item in the list is calculated once and
+ then used for the entire sorting process. The default value of ``None``
+ means that list items are sorted directly without calculating a separate
+ key value.
+
+ The :func:`functools.cmp_to_key` utility is available to convert a 2.x
+ style *cmp* function to a *key* function.
+
+ *reverse* is a boolean value. If set to ``True``, then the list elements
+ are sorted as if each comparison were reversed.
+
+ This method modifies the sequence in place for economy of space when
+ sorting a large sequence. To remind users that it operates by side
+ effect, it does not return the sorted sequence (use :func:`sorted` to
+ explicitly request a new sorted list instance).
+
+ The :meth:`sort` method is guaranteed to be stable. A sort is stable if it
+ guarantees not to change the relative order of elements that compare equal
+ --- this is helpful for sorting in multiple passes (for example, sort by
+ department, then by salary grade).
+
+ .. impl-detail::
+
+ While a list is being sorted, the effect of attempting to mutate, or even
+ inspect, the list is undefined. The C implementation of Python makes the
+ list appear empty for the duration, and raises :exc:`ValueError` if it can
+ detect that the list has been mutated during a sort.
+
+
+.. _typesseq-tuple:
+
+Tuples
+------
+
+.. index:: object: tuple
+
+Tuples are immutable sequences, typically used to store collections of
+heterogeneous data (such as the 2-tuples produced by the :func:`enumerate`
+built-in). Tuples are also used for cases where an immutable sequence of
+homogeneous data is needed (such as allowing storage in a :class:`set` or
+:class:`dict` instance).
+
+.. class:: tuple([iterable])
+
+ Tuples may be constructed in a number of ways:
+
+ * Using a pair of parentheses to denote the empty tuple: ``()``
+ * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``
+ * Separating items with commas: ``a, b, c`` or ``(a, b, c)``
+ * Using the :func:`tuple` built-in: ``tuple()`` or ``tuple(iterable)``
+
+ The constructor builds a tuple whose items are the same and in the same
+ order as *iterable*'s items. *iterable* may be either a sequence, a
+ container that supports iteration, or an iterator object. If *iterable*
+ is already a tuple, it is returned unchanged. For example,
+ ``tuple('abc')`` returns ``('a', 'b', 'c')`` and
+ ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``.
+ If no argument is given, the constructor creates a new empty tuple, ``()``.
+
+ Note that it is actually the comma which makes a tuple, not the parentheses.
+ The parentheses are optional, except in the empty tuple case, or
+ when they are needed to avoid syntactic ambiguity. For example,
+ ``f(a, b, c)`` is a function call with three arguments, while
+ ``f((a, b, c))`` is a function call with a 3-tuple as the sole argument.
+
+ Tuples implement all of the :ref:`common <typesseq-common>` sequence
+ operations.
+
+For heterogeneous collections of data where access by name is clearer than
+access by index, :func:`collections.namedtuple` may be a more appropriate
+choice than a simple tuple object.
+.. _typesseq-range:
+
+Ranges
+------
+
+.. index:: object: range
+
+The :class:`range` type represents an immutable sequence of numbers and is
+commonly used for looping a specific number of times in :keyword:`for`
+loops.
+
+.. class:: range(stop)
+ range(start, stop[, step])
+
+ The arguments to the range constructor must be integers (either built-in
+ :class:`int` or any object that implements the ``__index__`` special
+ method). If the *step* argument is omitted, it defaults to ``1``.
+ If the *start* argument is omitted, it defaults to ``0``.
+ If *step* is zero, :exc:`ValueError` is raised.
+
+ For a positive *step*, the contents of a range ``r`` are determined by the
+ formula ``r[i] = start + step*i`` where ``i >= 0`` and
+ ``r[i] < stop``.
+
+ For a negative *step*, the contents of the range are still determined by
+ the formula ``r[i] = start + step*i``, but the constraints are ``i >= 0``
+ and ``r[i] > stop``.
+
+ A range object will be empty if ``r[0]`` does not meant the value
+ constraint. Ranges do support negative indices, but these are interpreted
+ as indexing from the end of the sequence determined by the positive
+ indices.
+
+ Ranges containing absolute values larger than :data:`sys.maxsize` are
+ permitted but some features (such as :func:`len`) may raise
+ :exc:`OverflowError`.
+
+ Range examples::
+
+ >>> list(range(10))
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ >>> list(range(1, 11))
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ >>> list(range(0, 30, 5))
+ [0, 5, 10, 15, 20, 25]
+ >>> list(range(0, 10, 3))
+ [0, 3, 6, 9]
+ >>> list(range(0, -10, -1))
+ [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
+ >>> list(range(0))
+ []
+ >>> list(range(1, 0))
+ []
+
+ Ranges implement all of the :ref:`common <typesseq-common>` sequence operations
+ except concatenation and repetition (due to the fact that range objects can
+ only represent sequences that follow a strict pattern and repetition and
+ concatenation will usually violate that pattern).
+
+ .. data: start
+
+ The value of the *start* parameter (or ``0`` if the parameter was
+ not supplied)
+
+ .. data: stop
+
+ The value of the *stop* parameter
+
+ .. data: step
+
+ The value of the *step* parameter (or ``1`` if the parameter was
+ not supplied)
+
+The advantage of the :class:`range` type over a regular :class:`list` or
+:class:`tuple` is that a :class:`range` object will always take the same
+(small) amount of memory, no matter the size of the range it represents (as it
+only stores the ``start``, ``stop`` and ``step`` values, calculating individual
+items and subranges as needed).
+
+Range objects implement the :class:`collections.Sequence` ABC, and provide
+features such as containment tests, element index lookup, slicing and
+support for negative indices (see :ref:`typesseq`):
+
+ >>> r = range(0, 20, 2)
+ >>> r
+ range(0, 20, 2)
+ >>> 11 in r
+ False
+ >>> 10 in r
+ True
+ >>> r.index(10)
+ 5
+ >>> r[5]
+ 10
+ >>> r[:5]
+ range(0, 10, 2)
+ >>> r[-1]
+ 18
+
+Testing range objects for equality with ``==`` and ``!=`` compares
+them as sequences. That is, two range objects are considered equal if
+they represent the same sequence of values. (Note that two range
+objects that compare equal might have different :attr:`start`,
+:attr:`stop` and :attr:`step` attributes, for example ``range(0) ==
+range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.)
+
+.. versionchanged:: 3.2
+ Implement the Sequence ABC.
+ Support slicing and negative indices.
+ Test :class:`int` objects for membership in constant time instead of
+ iterating through all items.
+
+.. versionchanged:: 3.3
+ Define '==' and '!=' to compare range objects based on the
+ sequence of values they define (instead of comparing based on
+ object identity).
+
+.. versionadded:: 3.3
+ The :attr:`start`, :attr:`stop` and :attr:`step` attributes.
+
+
+.. _textseq:
+
+Text Sequence Type --- :class:`str`
+===================================
+
+.. index::
+ object: string
+ object: bytes
+ object: bytearray
+ object: io.StringIO
+
+
+Textual data in Python is handled with ``str`` objects, which are immutable
+:ref:`sequences <typesseq>` of Unicode code points. String literals are
+written in a variety of ways:
+
+* Single quotes: ``'allows embedded "double" quotes'``
+* Double quotes: ``"allows embedded 'single' quotes"``.
+* Triple quoted: ``'''Three single quotes'''``, ``"""Three double quotes"""``
+
+Triple quoted strings may span multiple lines - all associated whitespace will
+be included in the string literal.
+
+String literals that are part of a single expression and have only whitespace
+between them will be implicitly converted to a single string literal. That
+is, ``("spam " "eggs") == "spam eggs"``.
+
+See :ref:`strings` for more about the various forms of string literal,
+including supported escape sequences, and the ``r`` ("raw") prefix that
+disables most escape sequence processing.
+
+Strings may also be created from other objects with the built-in
+function :func:`str`.
+
+Since there is no separate "character" type, indexing a string produces
+strings of length 1. That is, for a non-empty string *s*, ``s[0] == s[0:1]``.
+
+There is also no mutable string type, but :meth:`str.join` or
+:class:`io.StringIO` can be used to efficiently construct strings from
+multiple fragments.
+
+.. versionchanged:: 3.3
+ For backwards compatibility with the Python 2 series, the ``u`` prefix is
+ once again permitted on string literals. It has no effect on the meaning
+ of string literals and cannot be combined with the ``r`` prefix.
+
.. _string-methods:
String Methods
--------------
-.. index:: pair: string; methods
+.. index::
+ pair: string; methods
+ module: re
-String objects support the methods listed below.
+Strings implement all of the :ref:`common <typesseq-common>` sequence
+operations, along with the additional methods described below.
-In addition, Python's strings support the sequence type methods described in the
-:ref:`typesseq` section. To output formatted strings, see the
-:ref:`string-formatting` section. Also, see the :mod:`re` module for string
-functions based on regular expressions.
+Strings also support two styles of string formatting, one providing a large
+degree of flexibility and customization (see :meth:`str.format`,
+:ref:`formatstrings` and :ref:`string-formatting`) and the other based on C
+``printf`` style formatting that handles a narrower range of types and is
+slightly harder to use correctly, but is often faster for the cases it can
+handle (:ref:`old-string-formatting`).
+
+The :ref:`textservices` section of the standard library covers a number of
+other modules that provide various text related utilities (including regular
+expression support in the :mod:`re` module).
.. method:: str.capitalize()
@@ -1000,6 +1421,23 @@ functions based on regular expressions.
rest lowercased.
+.. method:: str.casefold()
+
+ Return a casefolded copy of the string. Casefolded strings may be used for
+ caseless matching.
+
+ Casefolding is similar to lowercasing but more aggressive because it is
+ intended to remove all case distinctions in a string. For example, the German
+ lowercase letter ``'ß'`` is equivalent to ``"ss"``. Since it is already
+ lowercase, :meth:`lower` would do nothing to ``'ß'``; :meth:`casefold`
+ converts it to ``"ss"``.
+
+ The casefolding algorithm is described in section 3.13 of the Unicode
+ Standard.
+
+ .. versionadded:: 3.3
+
+
.. method:: str.center(width[, fillchar])
Return centered in a string of length *width*. Padding is done using the
@@ -1207,6 +1645,9 @@ functions based on regular expressions.
Return a copy of the string with all the cased characters [4]_ converted to
lowercase.
+ The lowercasing algorithm used is described in section 3.13 of the Unicode
+ Standard.
+
.. method:: str.lstrip([chars])
@@ -1279,7 +1720,7 @@ functions based on regular expressions.
two empty strings, followed by the string itself.
-.. method:: str.rsplit([sep[, maxsplit]])
+.. method:: str.rsplit(sep=None, maxsplit=-1)
Return a list of the words in the string, using *sep* as the delimiter string.
If *maxsplit* is given, at most *maxsplit* splits are done, the *rightmost*
@@ -1301,7 +1742,7 @@ functions based on regular expressions.
'mississ'
-.. method:: str.split([sep[, maxsplit]])
+.. method:: str.split(sep=None, maxsplit=-1)
Return a list of the words in the string, using *sep* as the delimiter
string. If *maxsplit* is given, at most *maxsplit* splits are done (thus,
@@ -1370,7 +1811,8 @@ functions based on regular expressions.
.. method:: str.swapcase()
Return a copy of the string with uppercase characters converted to lowercase and
- vice versa.
+ vice versa. Note that it is not necessarily true that
+ ``s.swapcase().swapcase() == s``.
.. method:: str.title()
@@ -1421,7 +1863,11 @@ functions based on regular expressions.
Return a copy of the string with all the cased characters [4]_ converted to
uppercase. Note that ``str.upper().isupper()`` might be ``False`` if ``s``
contains uncased characters or if the Unicode category of the resulting
- character(s) is not "Lu" (Letter, uppercase), but e.g. "Lt" (Letter, titlecase).
+ character(s) is not "Lu" (Letter, uppercase), but e.g. "Lt" (Letter,
+ titlecase).
+
+ The uppercasing algorithm used is described in section 3.13 of the Unicode
+ Standard.
.. method:: str.zfill(width)
@@ -1434,8 +1880,8 @@ functions based on regular expressions.
.. _old-string-formatting:
-Old String Formatting Operations
---------------------------------
+``printf``-style String Formatting
+----------------------------------
.. index::
single: formatting, string (%)
@@ -1447,23 +1893,19 @@ Old String Formatting Operations
single: % formatting
single: % interpolation
-.. XXX is the note enough?
-
.. note::
- The formatting operations described here are modelled on C's printf()
- syntax. They only support formatting of certain builtin types. The
- use of a binary operator means that care may be needed in order to
- format tuples and dictionaries correctly. As the new
- :ref:`string-formatting` syntax is more flexible and handles tuples and
- dictionaries naturally, it is recommended for new code. However, there
- are no current plans to deprecate printf-style formatting.
+ The formatting operations described here exhibit a variety of quirks that
+ lead to a number of common errors (such as failing to display tuples and
+ dictionaries correctly). Using the newer :meth:`str.format` interface
+ helps avoid these errors, and also provides a generally more powerful,
+ flexible and extensible approach to formatting text.
String objects have one unique built-in operation: the ``%`` operator (modulo).
This is also known as the string *formatting* or *interpolation* operator.
Given ``format % values`` (where *format* is a string), ``%`` conversion
specifications in *format* are replaced with zero or more elements of *values*.
-The effect is similar to the using :c:func:`sprintf` in the C language.
+The effect is similar to using the :c:func:`sprintf` in the C language.
If *format* requires a single argument, *values* may be a single non-tuple
object. [5]_ Otherwise, *values* must be a tuple with exactly the number of
@@ -1621,211 +2063,178 @@ that ``'\0'`` is the end of the string.
``%f`` conversions for numbers whose absolute value is over 1e50 are no
longer replaced by ``%g`` conversions.
-.. index::
- module: string
- module: re
-Additional string operations are defined in standard modules :mod:`string` and
-:mod:`re`.
+.. _binaryseq:
+Binary Sequence Types --- :class:`bytes`, :class:`bytearray`, :class:`memoryview`
+=================================================================================
-.. _typesseq-range:
-
-Range Type
-----------
-
-.. index:: object: range
-
-The :class:`range` type is an immutable sequence which is commonly used for
-looping. The advantage of the :class:`range` type is that an :class:`range`
-object will always take the same amount of memory, no matter the size of the
-range it represents.
-
-Range objects have relatively little behavior: they support indexing, contains,
-iteration, the :func:`len` function, and the following methods:
-
-.. method:: range.count(x)
-
- Return the number of *i*'s for which ``s[i] == x``.
-
- .. versionadded:: 3.2
+.. index::
+ object: bytes
+ object: bytearray
+ object: memoryview
+ module: array
-.. method:: range.index(x)
+The core built-in types for manipulating binary data are :class:`bytes` and
+:class:`bytearray`. They are supported by :class:`memoryview` which uses
+the buffer protocol to access the memory of other binary objects without
+needing to make a copy.
- Return the smallest *i* such that ``s[i] == x``. Raises
- :exc:`ValueError` when *x* is not in the range.
+The :mod:`array` module supports efficient storage of basic data types like
+32-bit integers and IEEE754 double-precision floating values.
- .. versionadded:: 3.2
+.. _typebytes:
-.. _typesseq-mutable:
+Bytes
+-----
-Mutable Sequence Types
-----------------------
+.. index:: object: bytes
-.. index::
- triple: mutable; sequence; types
- object: list
- object: bytearray
+Bytes objects are immutable sequences of single bytes. Since many major
+binary protocols are based on the ASCII text encoding, bytes objects offer
+several methods that are only valid when working with ASCII compatible
+data and are closely related to string objects in a variety of other ways.
-List and bytearray objects support additional operations that allow in-place
-modification of the object. Other mutable sequence types (when added to the
-language) should also support these operations. Strings and tuples are
-immutable sequence types: such objects cannot be modified once created. The
-following operations are defined on mutable sequence types (where *x* is an
-arbitrary object).
+Firstly, the syntax for bytes literals is largely the same as that for string
+literals, except that a ``b`` prefix is added:
-Note that while lists allow their items to be of any type, bytearray object
-"items" are all integers in the range 0 <= x < 256.
+* Single quotes: ``b'still allows embedded "double" quotes'``
+* Double quotes: ``b"still allows embedded 'single' quotes"``.
+* Triple quoted: ``b'''3 single quotes'''``, ``b"""3 double quotes"""``
-.. index::
- triple: operations on; sequence; types
- triple: operations on; list; type
- pair: subscript; assignment
- pair: slice; assignment
- statement: del
- single: append() (sequence method)
- single: extend() (sequence method)
- single: count() (sequence method)
- single: index() (sequence method)
- single: insert() (sequence method)
- single: pop() (sequence method)
- single: remove() (sequence method)
- single: reverse() (sequence method)
- single: sort() (sequence method)
+Only ASCII characters are permitted in bytes literals (regardless of the
+declared source code encoding). Any binary values over 127 must be entered
+into bytes literals using the appropriate escape sequence.
-+------------------------------+--------------------------------+---------------------+
-| Operation | Result | Notes |
-+==============================+================================+=====================+
-| ``s[i] = x`` | item *i* of *s* is replaced by | |
-| | *x* | |
-+------------------------------+--------------------------------+---------------------+
-| ``s[i:j] = t`` | slice of *s* from *i* to *j* | |
-| | is replaced by the contents of | |
-| | the iterable *t* | |
-+------------------------------+--------------------------------+---------------------+
-| ``del s[i:j]`` | same as ``s[i:j] = []`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` | \(1) |
-| | are replaced by those of *t* | |
-+------------------------------+--------------------------------+---------------------+
-| ``del s[i:j:k]`` | removes the elements of | |
-| | ``s[i:j:k]`` from the list | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.append(x)`` | same as ``s[len(s):len(s)] = | |
-| | [x]`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.extend(x)`` | same as ``s[len(s):len(s)] = | \(2) |
-| | x`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.count(x)`` | return number of *i*'s for | |
-| | which ``s[i] == x`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.index(x[, i[, j]])`` | return smallest *k* such that | \(3) |
-| | ``s[k] == x`` and ``i <= k < | |
-| | j`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | \(4) |
-+------------------------------+--------------------------------+---------------------+
-| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | \(5) |
-| | return x`` | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | \(3) |
-+------------------------------+--------------------------------+---------------------+
-| ``s.reverse()`` | reverses the items of *s* in | \(6) |
-| | place | |
-+------------------------------+--------------------------------+---------------------+
-| ``s.sort([key[, reverse]])`` | sort the items of *s* in place | (6), (7), (8) |
-+------------------------------+--------------------------------+---------------------+
+As with string literals, bytes literals may also use a ``r`` prefix to disable
+processing of escape sequences. See :ref:`strings` for more about the various
+forms of bytes literal, including supported escape sequences.
+While bytes literals and representations are based on ASCII text, bytes
+objects actually behave like immutable sequences of integers, with each
+value in the sequence restricted such that ``0 <= x < 256`` (attempts to
+violate this restriction will trigger :exc:`ValueError`. This is done
+deliberately to emphasise that while many binary formats include ASCII based
+elements and can be usefully manipulated with some text-oriented algorithms,
+this is not generally the case for arbitrary binary data (blindly applying
+text processing algorithms to binary data formats that are not ASCII
+compatible will usually lead to data corruption).
-Notes:
+In addition to the literal forms, bytes objects can be created in a number of
+other ways:
-(1)
- *t* must have the same length as the slice it is replacing.
+* A zero-filled bytes object of a specified length: ``bytes(10)``
+* From an iterable of integers: ``bytes(range(20))``
+* Copying existing binary data via the buffer protocol: ``bytes(obj)``
-(2)
- *x* can be any iterable object.
+Also see the :ref:`bytes <func-bytes>` built-in.
-(3)
- Raises :exc:`ValueError` when *x* is not found in *s*. When a negative index is
- passed as the second or third parameter to the :meth:`index` method, the sequence
- length is added, as for slice indices. If it is still negative, it is truncated
- to zero, as for slice indices.
+Since bytes objects are sequences of integers, for a bytes object *b*,
+``b[0]`` will be an integer, while ``b[0:1]`` will be a bytes object of
+length 1. (This contrasts with text strings, where both indexing and
+slicing will produce a string of length 1)
-(4)
- When a negative index is passed as the first parameter to the :meth:`insert`
- method, the sequence length is added, as for slice indices. If it is still
- negative, it is truncated to zero, as for slice indices.
+The representation of bytes objects uses the literal format (``b'...'``)
+since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can
+always convert a bytes object into a list of integers using ``list(b)``.
-(5)
- The optional argument *i* defaults to ``-1``, so that by default the last
- item is removed and returned.
-(6)
- The :meth:`sort` and :meth:`reverse` methods modify the sequence in place for
- economy of space when sorting or reversing a large sequence. To remind you
- that they operate by side effect, they don't return the sorted or reversed
- sequence.
+.. note::
+ For Python 2.x users: In the Python 2.x series, a variety of implicit
+ conversions between 8-bit strings (the closest thing 2.x offers to a
+ built-in binary data type) and Unicode strings were permitted. This was a
+ backwards compatibility workaround to account for the fact that Python
+ originally only supported 8-bit text, and Unicode text was a later
+ addition. In Python 3.x, those implicit conversions are gone - conversions
+ between 8-bit binary data and Unicode text must be explicit, and bytes and
+ string objects will always compare unequal.
-(7)
- The :meth:`sort` method takes optional arguments for controlling the
- comparisons. Each must be specified as a keyword argument.
- *key* specifies a function of one argument that is used to extract a comparison
- key from each list element: ``key=str.lower``. The default value is ``None``.
- Use :func:`functools.cmp_to_key` to convert an
- old-style *cmp* function to a *key* function.
+.. _typebytearray:
+Bytearray Objects
+-----------------
- *reverse* is a boolean value. If set to ``True``, then the list elements are
- sorted as if each comparison were reversed.
+.. index:: object: bytearray
- The :meth:`sort` method is guaranteed to be stable. A
- sort is stable if it guarantees not to change the relative order of elements
- that compare equal --- this is helpful for sorting in multiple passes (for
- example, sort by department, then by salary grade).
+:class:`bytearray` objects are a mutable counterpart to :class:`bytes`
+objects. There is no dedicated literal syntax for bytearray objects, instead
+they are always created by calling the constructor:
- .. impl-detail::
+* Creating an empty instance: ``bytearray()``
+* Creating a zero-filled instance with a given length: ``bytearray(10)``
+* From an iterable of integers: ``bytearray(range(20))``
+* Copying existing binary data via the buffer protocol: ``bytearray(b'Hi!')``
- While a list is being sorted, the effect of attempting to mutate, or even
- inspect, the list is undefined. The C implementation of Python makes the
- list appear empty for the duration, and raises :exc:`ValueError` if it can
- detect that the list has been mutated during a sort.
+As bytearray objects are mutable, they support the
+:ref:`mutable <typesseq-mutable>` sequence operations in addition to the
+common bytes and bytearray operations described in :ref:`bytes-methods`.
-(8)
- :meth:`sort` is not supported by :class:`bytearray` objects.
+Also see the :ref:`bytearray <func-bytearray>` built-in.
.. _bytes-methods:
-Bytes and Byte Array Methods
-----------------------------
+Bytes and Bytearray Operations
+------------------------------
.. index:: pair: bytes; methods
pair: bytearray; methods
-Bytes and bytearray objects, being "strings of bytes", have all methods found on
-strings, with the exception of :func:`encode`, :func:`format` and
-:func:`isidentifier`, which do not make sense with these types. For converting
-the objects to strings, they have a :func:`decode` method.
+Both bytes and bytearray objects support the :ref:`common <typesseq-common>`
+sequence operations. They interoperate not just with operands of the same
+type, but with any object that supports the
+:ref:`buffer protocol <bufferobjects>`. Due to this flexibility, they can be
+freely mixed in operations without causing errors. However, the return type
+of the result may depend on the order of operands.
+
+Due to the common use of ASCII text as the basis for binary protocols, bytes
+and bytearray objects provide almost all methods found on text strings, with
+the exceptions of:
+
+* :meth:`str.encode` (which converts text strings to bytes objects)
+* :meth:`str.format` and :meth:`str.format_map` (which are used to format
+ text for display to users)
+* :meth:`str.isidentifier`, :meth:`str.isnumeric`, :meth:`str.isdecimal`,
+ :meth:`str.isprintable` (which are used to check various properties of
+ text strings which are not typically applicable to binary protocols).
-Wherever one of these methods needs to interpret the bytes as characters
-(e.g. the :func:`is...` methods), the ASCII character set is assumed.
+All other string methods are supported, although sometimes with slight
+differences in functionality and semantics (as described below).
.. note::
The methods on bytes and bytearray objects don't accept strings as their
arguments, just as the methods on strings don't accept bytes as their
- arguments. For example, you have to write ::
+ arguments. For example, you have to write::
a = "abc"
b = a.replace("a", "f")
- and ::
+ and::
a = b"abc"
b = a.replace(b"a", b"f")
+Whenever a bytes or bytearray method needs to interpret the bytes as
+characters (e.g. the :meth:`is...` methods, :meth:`split`, :meth:`strip`),
+the ASCII character set is assumed (text strings use Unicode semantics).
+
+.. note::
+ Using these ASCII based methods to manipulate binary data that is not
+ stored in an ASCII based format may lead to data corruption.
+
+The search operations (:keyword:`in`, :meth:`count`, :meth:`find`,
+:meth:`index`, :meth:`rfind` and :meth:`rindex`) all accept both integers
+in the range 0 to 255 (inclusive) as well as bytes and byte array sequences.
+
+.. versionchanged:: 3.3
+ All of the search methods also accept an integer in the range 0 to 255
+ (inclusive) as their first argument.
+
+
+Each bytes and bytearray instance provides a :meth:`decode` convenience
+method that is the inverse of :meth:`str.encode`:
.. method:: bytes.decode(encoding="utf-8", errors="strict")
bytearray.decode(encoding="utf-8", errors="strict")
@@ -1841,8 +2250,10 @@ Wherever one of these methods needs to interpret the bytes as characters
.. versionchanged:: 3.1
Added support for keyword arguments.
-
-The bytes and bytearray types have an additional class method:
+Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal
+numbers are a commonly used format for describing binary data. Accordingly,
+the bytes and bytearray types have an additional class method to read data in
+that format:
.. classmethod:: bytes.fromhex(string)
bytearray.fromhex(string)
@@ -1851,8 +2262,8 @@ The bytes and bytearray types have an additional class method:
decoding the given string object. The string must contain two hexadecimal
digits per byte, spaces are ignored.
- >>> bytes.fromhex('f0 f1f2 ')
- b'\xf0\xf1\xf2'
+ >>> bytes.fromhex('2Ef0 F1f2 ')
+ b'.\xf0\xf1\xf2'
The maketrans and translate methods differ in semantics from the versions
@@ -1886,6 +2297,428 @@ available on strings:
.. versionadded:: 3.1
+.. _typememoryview:
+
+Memory Views
+------------
+
+:class:`memoryview` objects allow Python code to access the internal data
+of an object that supports the :ref:`buffer protocol <bufferobjects>` without
+copying.
+
+.. class:: memoryview(obj)
+
+ Create a :class:`memoryview` that references *obj*. *obj* must support the
+ buffer protocol. Built-in objects that support the buffer protocol include
+ :class:`bytes` and :class:`bytearray`.
+
+ A :class:`memoryview` has the notion of an *element*, which is the
+ atomic memory unit handled by the originating object *obj*. For many
+ simple types such as :class:`bytes` and :class:`bytearray`, an element
+ is a single byte, but other types such as :class:`array.array` may have
+ bigger elements.
+
+ ``len(view)`` is equal to the length of :class:`~memoryview.tolist`.
+ If ``view.ndim = 0``, the length is 1. If ``view.ndim = 1``, the length
+ is equal to the number of elements in the view. For higher dimensions,
+ the length is equal to the length of the nested list representation of
+ the view. The :class:`~memoryview.itemsize` attribute will give you the
+ number of bytes in a single element.
+
+ A :class:`memoryview` supports slicing to expose its data. If
+ :class:`~memoryview.format` is one of the native format specifiers
+ from the :mod:`struct` module, indexing will return a single element
+ with the correct type. Full slicing will result in a subview::
+
+ >>> v = memoryview(b'abcefg')
+ >>> v[1]
+ 98
+ >>> v[-1]
+ 103
+ >>> v[1:4]
+ <memory at 0x7f3ddc9f4350>
+ >>> bytes(v[1:4])
+ b'bce'
+
+ Other native formats::
+
+ >>> import array
+ >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
+ >>> a[0]
+ -11111111
+ >>> a[-1]
+ 44444444
+ >>> a[2:3].tolist()
+ [-33333333]
+ >>> a[::2].tolist()
+ [-11111111, -33333333]
+ >>> a[::-1].tolist()
+ [44444444, -33333333, 22222222, -11111111]
+
+ .. versionadded:: 3.3
+
+ If the underlying object is writable, the memoryview supports slice
+ assignment. Resizing is not allowed::
+
+ >>> data = bytearray(b'abcefg')
+ >>> v = memoryview(data)
+ >>> v.readonly
+ False
+ >>> v[0] = ord(b'z')
+ >>> data
+ bytearray(b'zbcefg')
+ >>> v[1:4] = b'123'
+ >>> data
+ bytearray(b'z123fg')
+ >>> v[2:3] = b'spam'
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ValueError: memoryview assignment: lvalue and rvalue have different structures
+ >>> v[2:6] = b'spam'
+ >>> data
+ bytearray(b'z1spam')
+
+ One-dimensional memoryviews of hashable (read-only) types with formats
+ 'B', 'b' or 'c' are also hashable. The hash is defined as
+ ``hash(m) == hash(m.tobytes())``::
+
+ >>> v = memoryview(b'abcefg')
+ >>> hash(v) == hash(b'abcefg')
+ True
+ >>> hash(v[2:4]) == hash(b'ce')
+ True
+ >>> hash(v[::-2]) == hash(b'abcefg'[::-2])
+ True
+
+ .. versionchanged:: 3.3
+ One-dimensional memoryviews with formats 'B', 'b' or 'c' are now hashable.
+
+ :class:`memoryview` has several methods:
+
+ .. method:: __eq__(exporter)
+
+ A memoryview and a :pep:`3118` exporter are equal if their shapes are
+ equivalent and if all corresponding values are equal when the operands'
+ respective format codes are interpreted using :mod:`struct` syntax.
+
+ For the subset of :mod:`struct` format strings currently supported by
+ :meth:`tolist`, ``v`` and ``w`` are equal if ``v.tolist() == w.tolist()``::
+
+ >>> import array
+ >>> a = array.array('I', [1, 2, 3, 4, 5])
+ >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
+ >>> c = array.array('b', [5, 3, 1])
+ >>> x = memoryview(a)
+ >>> y = memoryview(b)
+ >>> x == a == y == b
+ True
+ >>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
+ True
+ >>> z = y[::-2]
+ >>> z == c
+ True
+ >>> z.tolist() == c.tolist()
+ True
+
+ If either format string is not supported by the :mod:`struct` module,
+ then the objects will always compare as unequal (even if the format
+ strings and buffer contents are identical)::
+
+ >>> from ctypes import BigEndianStructure, c_long
+ >>> class BEPoint(BigEndianStructure):
+ ... _fields_ = [("x", c_long), ("y", c_long)]
+ ...
+ >>> point = BEPoint(100, 200)
+ >>> a = memoryview(point)
+ >>> b = memoryview(point)
+ >>> a == point
+ False
+ >>> a == b
+ False
+
+ Note that, as with floating point numbers, ``v is w`` does *not* imply
+ ``v == w`` for memoryview objects.
+
+ .. versionchanged:: 3.3
+ Previous versions compared the raw memory disregarding the item format
+ and the logical array structure.
+
+ .. method:: tobytes()
+
+ Return the data in the buffer as a bytestring. This is equivalent to
+ calling the :class:`bytes` constructor on the memoryview. ::
+
+ >>> m = memoryview(b"abc")
+ >>> m.tobytes()
+ b'abc'
+ >>> bytes(m)
+ b'abc'
+
+ For non-contiguous arrays the result is equal to the flattened list
+ representation with all elements converted to bytes. :meth:`tobytes`
+ supports all format strings, including those that are not in
+ :mod:`struct` module syntax.
+
+ .. method:: tolist()
+
+ Return the data in the buffer as a list of elements. ::
+
+ >>> memoryview(b'abc').tolist()
+ [97, 98, 99]
+ >>> import array
+ >>> a = array.array('d', [1.1, 2.2, 3.3])
+ >>> m = memoryview(a)
+ >>> m.tolist()
+ [1.1, 2.2, 3.3]
+
+ .. versionchanged:: 3.3
+ :meth:`tolist` now supports all single character native formats in
+ :mod:`struct` module syntax as well as multi-dimensional
+ representations.
+
+ .. method:: release()
+
+ Release the underlying buffer exposed by the memoryview object. Many
+ objects take special actions when a view is held on them (for example,
+ a :class:`bytearray` would temporarily forbid resizing); therefore,
+ calling release() is handy to remove these restrictions (and free any
+ dangling resources) as soon as possible.
+
+ After this method has been called, any further operation on the view
+ raises a :class:`ValueError` (except :meth:`release()` itself which can
+ be called multiple times)::
+
+ >>> m = memoryview(b'abc')
+ >>> m.release()
+ >>> m[0]
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ValueError: operation forbidden on released memoryview object
+
+ The context management protocol can be used for a similar effect,
+ using the ``with`` statement::
+
+ >>> with memoryview(b'abc') as m:
+ ... m[0]
+ ...
+ 97
+ >>> m[0]
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ValueError: operation forbidden on released memoryview object
+
+ .. versionadded:: 3.2
+
+ .. method:: cast(format[, shape])
+
+ Cast a memoryview to a new format or shape. *shape* defaults to
+ ``[byte_length//new_itemsize]``, which means that the result view
+ will be one-dimensional. The return value is a new memoryview, but
+ the buffer itself is not copied. Supported casts are 1D -> C-contiguous
+ and C-contiguous -> 1D.
+
+ Both formats are restricted to single element native formats in
+ :mod:`struct` syntax. One of the formats must be a byte format
+ ('B', 'b' or 'c'). The byte length of the result must be the same
+ as the original length.
+
+ Cast 1D/long to 1D/unsigned bytes::
+
+ >>> import array
+ >>> a = array.array('l', [1,2,3])
+ >>> x = memoryview(a)
+ >>> x.format
+ 'l'
+ >>> x.itemsize
+ 8
+ >>> len(x)
+ 3
+ >>> x.nbytes
+ 24
+ >>> y = x.cast('B')
+ >>> y.format
+ 'B'
+ >>> y.itemsize
+ 1
+ >>> len(y)
+ 24
+ >>> y.nbytes
+ 24
+
+ Cast 1D/unsigned bytes to 1D/char::
+
+ >>> b = bytearray(b'zyz')
+ >>> x = memoryview(b)
+ >>> x[0] = b'a'
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ ValueError: memoryview: invalid value for format "B"
+ >>> y = x.cast('c')
+ >>> y[0] = b'a'
+ >>> b
+ bytearray(b'ayz')
+
+ Cast 1D/bytes to 3D/ints to 1D/signed char::
+
+ >>> import struct
+ >>> buf = struct.pack("i"*12, *list(range(12)))
+ >>> x = memoryview(buf)
+ >>> y = x.cast('i', shape=[2,2,3])
+ >>> y.tolist()
+ [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
+ >>> y.format
+ 'i'
+ >>> y.itemsize
+ 4
+ >>> len(y)
+ 2
+ >>> y.nbytes
+ 48
+ >>> z = y.cast('b')
+ >>> z.format
+ 'b'
+ >>> z.itemsize
+ 1
+ >>> len(z)
+ 48
+ >>> z.nbytes
+ 48
+
+ Cast 1D/unsigned char to to 2D/unsigned long::
+
+ >>> buf = struct.pack("L"*6, *list(range(6)))
+ >>> x = memoryview(buf)
+ >>> y = x.cast('L', shape=[2,3])
+ >>> len(y)
+ 2
+ >>> y.nbytes
+ 48
+ >>> y.tolist()
+ [[0, 1, 2], [3, 4, 5]]
+
+ .. versionadded:: 3.3
+
+ There are also several readonly attributes available:
+
+ .. attribute:: obj
+
+ The underlying object of the memoryview::
+
+ >>> b = bytearray(b'xyz')
+ >>> m = memoryview(b)
+ >>> m.obj is b
+ True
+
+ .. versionadded:: 3.3
+
+ .. attribute:: nbytes
+
+ ``nbytes == product(shape) * itemsize == len(m.tobytes())``. This is
+ the amount of space in bytes that the array would use in a contiguous
+ representation. It is not necessarily equal to len(m)::
+
+ >>> import array
+ >>> a = array.array('i', [1,2,3,4,5])
+ >>> m = memoryview(a)
+ >>> len(m)
+ 5
+ >>> m.nbytes
+ 20
+ >>> y = m[::2]
+ >>> len(y)
+ 3
+ >>> y.nbytes
+ 12
+ >>> len(y.tobytes())
+ 12
+
+ Multi-dimensional arrays::
+
+ >>> import struct
+ >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
+ >>> x = memoryview(buf)
+ >>> y = x.cast('d', shape=[3,4])
+ >>> y.tolist()
+ [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
+ >>> len(y)
+ 3
+ >>> y.nbytes
+ 96
+
+ .. versionadded:: 3.3
+
+ .. attribute:: readonly
+
+ A bool indicating whether the memory is read only.
+
+ .. attribute:: format
+
+ A string containing the format (in :mod:`struct` module style) for each
+ element in the view. A memoryview can be created from exporters with
+ arbitrary format strings, but some methods (e.g. :meth:`tolist`) are
+ restricted to native single element formats.
+
+ .. versionchanged:: 3.3
+ format ``'B'`` is now handled according to the struct module syntax.
+ This means that ``memoryview(b'abc')[0] == b'abc'[0] == 97``.
+
+ .. attribute:: itemsize
+
+ The size in bytes of each element of the memoryview::
+
+ >>> import array, struct
+ >>> m = memoryview(array.array('H', [32000, 32001, 32002]))
+ >>> m.itemsize
+ 2
+ >>> m[0]
+ 32000
+ >>> struct.calcsize('H') == m.itemsize
+ True
+
+ .. attribute:: ndim
+
+ An integer indicating how many dimensions of a multi-dimensional array the
+ memory represents.
+
+ .. attribute:: shape
+
+ A tuple of integers the length of :attr:`ndim` giving the shape of the
+ memory as an N-dimensional array.
+
+ .. versionchanged:: 3.3
+ An empty tuple instead of None when ndim = 0.
+
+ .. attribute:: strides
+
+ A tuple of integers the length of :attr:`ndim` giving the size in bytes to
+ access each element for each dimension of the array.
+
+ .. versionchanged:: 3.3
+ An empty tuple instead of None when ndim = 0.
+
+ .. attribute:: suboffsets
+
+ Used internally for PIL-style arrays. The value is informational only.
+
+ .. attribute:: c_contiguous
+
+ A bool indicating whether the memory is C-contiguous.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: f_contiguous
+
+ A bool indicating whether the memory is Fortran contiguous.
+
+ .. versionadded:: 3.3
+
+ .. attribute:: contiguous
+
+ A bool indicating whether the memory is contiguous.
+
+ .. versionadded:: 3.3
+
+
.. _types-set:
Set Types --- :class:`set`, :class:`frozenset`
@@ -1897,7 +2730,7 @@ A :dfn:`set` object is an unordered collection of distinct :term:`hashable` obje
Common uses include membership testing, removing duplicates from a sequence, and
computing mathematical operations such as intersection, union, difference, and
symmetric difference.
-(For other containers see the built in :class:`dict`, :class:`list`,
+(For other containers see the built-in :class:`dict`, :class:`list`,
and :class:`tuple` classes, and the :mod:`collections` module.)
Like other collections, sets support ``x in set``, ``len(set)``, and ``for x in
@@ -2097,7 +2930,7 @@ Mapping Types --- :class:`dict`
A :term:`mapping` object maps :term:`hashable` values to arbitrary objects.
Mappings are mutable objects. There is currently only one standard mapping
-type, the :dfn:`dictionary`. (For other containers see the built in
+type, the :dfn:`dictionary`. (For other containers see the built-in
:class:`list`, :class:`set`, and :class:`tuple` classes, and the
:mod:`collections` module.)
@@ -2229,13 +3062,13 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
.. method:: items()
- Return a new view of the dictionary's items (``(key, value)`` pairs). See
- below for documentation of view objects.
+ Return a new view of the dictionary's items (``(key, value)`` pairs).
+ See the :ref:`documentation of view objects <dict-views>`.
.. method:: keys()
- Return a new view of the dictionary's keys. See below for documentation of
- view objects.
+ Return a new view of the dictionary's keys. See the :ref:`documentation
+ of view objects <dict-views>`.
.. method:: pop(key[, default])
@@ -2269,8 +3102,12 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
.. method:: values()
- Return a new view of the dictionary's values. See below for documentation of
- view objects.
+ Return a new view of the dictionary's values. See the
+ :ref:`documentation of view objects <dict-views>`.
+
+.. seealso::
+ :class:`types.MappingProxyType` can be used to create a read-only view
+ of a :class:`dict`.
.. _dict-views:
@@ -2316,7 +3153,7 @@ Keys views are set-like since their entries are unique and hashable. If all
values are hashable, so that ``(key, value)`` pairs are unique and hashable,
then the items view is also set-like. (Values views are not treated as set-like
since the entries are generally not unique.) For set-like views, all of the
-operations defined for the abstract base class :class:`collections.Set` are
+operations defined for the abstract base class :class:`collections.abc.Set` are
available (for example, ``==``, ``<``, or ``^``).
An example of dictionary view usage::
@@ -2351,159 +3188,6 @@ An example of dictionary view usage::
{'juice', 'sausage', 'bacon', 'spam'}
-.. _typememoryview:
-
-memoryview type
-===============
-
-:class:`memoryview` objects allow Python code to access the internal data
-of an object that supports the :ref:`buffer protocol <bufferobjects>` without
-copying. Memory is generally interpreted as simple bytes.
-
-.. class:: memoryview(obj)
-
- Create a :class:`memoryview` that references *obj*. *obj* must support the
- buffer protocol. Built-in objects that support the buffer protocol include
- :class:`bytes` and :class:`bytearray`.
-
- A :class:`memoryview` has the notion of an *element*, which is the
- atomic memory unit handled by the originating object *obj*. For many
- simple types such as :class:`bytes` and :class:`bytearray`, an element
- is a single byte, but other types such as :class:`array.array` may have
- bigger elements.
-
- ``len(view)`` returns the total number of elements in the memoryview,
- *view*. The :class:`~memoryview.itemsize` attribute will give you the
- number of bytes in a single element.
-
- A :class:`memoryview` supports slicing to expose its data. Taking a single
- index will return a single element as a :class:`bytes` object. Full
- slicing will result in a subview::
-
- >>> v = memoryview(b'abcefg')
- >>> v[1]
- b'b'
- >>> v[-1]
- b'g'
- >>> v[1:4]
- <memory at 0x77ab28>
- >>> bytes(v[1:4])
- b'bce'
-
- If the object the memoryview is over supports changing its data, the
- memoryview supports slice assignment::
-
- >>> data = bytearray(b'abcefg')
- >>> v = memoryview(data)
- >>> v.readonly
- False
- >>> v[0] = b'z'
- >>> data
- bytearray(b'zbcefg')
- >>> v[1:4] = b'123'
- >>> data
- bytearray(b'z123fg')
- >>> v[2] = b'spam'
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ValueError: cannot modify size of memoryview object
-
- Notice how the size of the memoryview object cannot be changed.
-
- :class:`memoryview` has several methods:
-
- .. method:: tobytes()
-
- Return the data in the buffer as a bytestring. This is equivalent to
- calling the :class:`bytes` constructor on the memoryview. ::
-
- >>> m = memoryview(b"abc")
- >>> m.tobytes()
- b'abc'
- >>> bytes(m)
- b'abc'
-
- .. method:: tolist()
-
- Return the data in the buffer as a list of integers. ::
-
- >>> memoryview(b'abc').tolist()
- [97, 98, 99]
-
- .. method:: release()
-
- Release the underlying buffer exposed by the memoryview object. Many
- objects take special actions when a view is held on them (for example,
- a :class:`bytearray` would temporarily forbid resizing); therefore,
- calling release() is handy to remove these restrictions (and free any
- dangling resources) as soon as possible.
-
- After this method has been called, any further operation on the view
- raises a :class:`ValueError` (except :meth:`release()` itself which can
- be called multiple times)::
-
- >>> m = memoryview(b'abc')
- >>> m.release()
- >>> m[0]
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ValueError: operation forbidden on released memoryview object
-
- The context management protocol can be used for a similar effect,
- using the ``with`` statement::
-
- >>> with memoryview(b'abc') as m:
- ... m[0]
- ...
- b'a'
- >>> m[0]
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ValueError: operation forbidden on released memoryview object
-
- .. versionadded:: 3.2
-
- There are also several readonly attributes available:
-
- .. attribute:: format
-
- A string containing the format (in :mod:`struct` module style) for each
- element in the view. This defaults to ``'B'``, a simple bytestring.
-
- .. attribute:: itemsize
-
- The size in bytes of each element of the memoryview::
-
- >>> m = memoryview(array.array('H', [1,2,3]))
- >>> m.itemsize
- 2
- >>> m[0]
- b'\x01\x00'
- >>> len(m[0]) == m.itemsize
- True
-
- .. attribute:: shape
-
- A tuple of integers the length of :attr:`ndim` giving the shape of the
- memory as a N-dimensional array.
-
- .. attribute:: ndim
-
- An integer indicating how many dimensions of a multi-dimensional array the
- memory represents.
-
- .. attribute:: strides
-
- A tuple of integers the length of :attr:`ndim` giving the size in bytes to
- access each element for each dimension of the array.
-
- .. attribute:: readonly
-
- A bool indicating whether the memory is read only.
-
- .. memoryview.suboffsets isn't documented because it only seems useful for C
-
-
.. _typecontextmanager:
Context Manager Types
@@ -2731,7 +3415,7 @@ The Null Object
This object is returned by functions that don't explicitly return a value. It
supports no special operations. There is exactly one null object, named
-``None`` (a built-in name).
+``None`` (a built-in name). ``type(None)()`` produces the same singleton.
It is written as ``None``.
@@ -2743,7 +3427,8 @@ The Ellipsis Object
This object is commonly used by slicing (see :ref:`slicings`). It supports no
special operations. There is exactly one ellipsis object, named
-:const:`Ellipsis` (a built-in name).
+:const:`Ellipsis` (a built-in name). ``type(Ellipsis)()`` produces the
+:const:`Ellipsis` singleton.
It is written as ``Ellipsis`` or ``...``.
@@ -2755,7 +3440,8 @@ The NotImplemented Object
This object is returned from comparisons and binary operations when they are
asked to operate on types they don't support. See :ref:`comparisons` for more
-information.
+information. There is exactly one ``NotImplemented`` object.
+``type(NotImplemented)()`` produces the singleton instance.
It is written as ``NotImplemented``.
@@ -2821,6 +3507,13 @@ types, where they are relevant. Some of these are not reported by the
The name of the class or type.
+.. attribute:: class.__qualname__
+
+ The :term:`qualified name` of the class or type.
+
+ .. versionadded:: 3.3
+
+
.. attribute:: class.__mro__
This attribute is a tuple of classes that are considered when looking for
diff --git a/Doc/library/string.rst b/Doc/library/string.rst
index 79d4e3f..9c63272 100644
--- a/Doc/library/string.rst
+++ b/Doc/library/string.rst
@@ -10,7 +10,7 @@
.. seealso::
- :ref:`typesseq`
+ :ref:`textseq`
:ref:`string-methods`
diff --git a/Doc/library/strings.rst b/Doc/library/strings.rst
deleted file mode 100644
index 08f1658..0000000
--- a/Doc/library/strings.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. _stringservices:
-
-***************
-String Services
-***************
-
-The modules described in this chapter provide a wide range of string
-manipulation operations.
-
-In addition, Python's built-in string classes support the sequence type methods
-described in the :ref:`typesseq` section, and also the string-specific methods
-described in the :ref:`string-methods` section. To output formatted strings,
-see the :ref:`string-formatting` section. Also, see the :mod:`re` module for
-string functions based on regular expressions.
-
-
-.. toctree::
-
- string.rst
- re.rst
- struct.rst
- difflib.rst
- textwrap.rst
- codecs.rst
- unicodedata.rst
- stringprep.rst
-
diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst
index 12820e0..994506c 100644
--- a/Doc/library/struct.rst
+++ b/Doc/library/struct.rst
@@ -187,17 +187,24 @@ platform-dependent.
| ``Q`` | :c:type:`unsigned long | integer | 8 | \(2), \(3) |
| | long` | | | |
+--------+--------------------------+--------------------+----------------+------------+
-| ``f`` | :c:type:`float` | float | 4 | \(4) |
+| ``n`` | :c:type:`ssize_t` | integer | | \(4) |
+--------+--------------------------+--------------------+----------------+------------+
-| ``d`` | :c:type:`double` | float | 8 | \(4) |
+| ``N`` | :c:type:`size_t` | integer | | \(4) |
++--------+--------------------------+--------------------+----------------+------------+
+| ``f`` | :c:type:`float` | float | 4 | \(5) |
++--------+--------------------------+--------------------+----------------+------------+
+| ``d`` | :c:type:`double` | float | 8 | \(5) |
+--------+--------------------------+--------------------+----------------+------------+
| ``s`` | :c:type:`char[]` | bytes | | |
+--------+--------------------------+--------------------+----------------+------------+
| ``p`` | :c:type:`char[]` | bytes | | |
+--------+--------------------------+--------------------+----------------+------------+
-| ``P`` | :c:type:`void \*` | integer | | \(5) |
+| ``P`` | :c:type:`void \*` | integer | | \(6) |
+--------+--------------------------+--------------------+----------------+------------+
+.. versionchanged:: 3.3
+ Added support for the ``'n'`` and ``'N'`` formats.
+
Notes:
(1)
@@ -219,11 +226,17 @@ Notes:
Use of the :meth:`__index__` method for non-integers is new in 3.2.
(4)
+ The ``'n'`` and ``'N'`` conversion codes are only available for the native
+ size (selected as the default or with the ``'@'`` byte order character).
+ For the standard size, you can use whichever of the other integer formats
+ fits your application.
+
+(5)
For the ``'f'`` and ``'d'`` conversion codes, the packed representation uses
the IEEE 754 binary32 (for ``'f'``) or binary64 (for ``'d'``) format,
regardless of the floating-point format used by the platform.
-(5)
+(6)
The ``'P'`` format character is only available for the native byte ordering
(selected as the default or with the ``'@'`` byte order character). The byte
order character ``'='`` chooses to use little- or big-endian ordering based
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index fc456a1..b09c642 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -30,16 +30,21 @@ convenience functions for all use cases they can handle. For more advanced
use cases, the underlying :class:`Popen` interface can be used directly.
-.. function:: call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
+.. function:: call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
Run the command described by *args*. Wait for command to complete, then
return the :attr:`returncode` attribute.
The arguments shown above are merely the most common ones, described below
- in :ref:`frequently-used-arguments` (hence the slightly odd notation in
- the abbreviated signature). The full function signature is the same as
- that of the :class:`Popen` constructor - this functions passes all
- supplied arguments directly through to that interface.
+ in :ref:`frequently-used-arguments` (hence the use of keyword-only notation
+ in the abbreviated signature). The full function signature is largely the
+ same as that of the :class:`Popen` constructor - this function passes all
+ supplied arguments other than *timeout* directly through to that interface.
+
+ The *timeout* argument is passed to :meth:`Popen.wait`. If the timeout
+ expires, the child process will be killed and then waited for again. The
+ :exc:`TimeoutExpired` exception will be re-raised after the child process
+ has terminated.
Examples::
@@ -62,8 +67,11 @@ use cases, the underlying :class:`Popen` interface can be used directly.
process may block if it generates enough output to a pipe to fill up
the OS pipe buffer.
+ .. versionchanged:: 3.3
+ *timeout* was added.
+
-.. function:: check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
+.. function:: check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
Run command with arguments. Wait for command to complete. If the return
code was zero then return, otherwise raise :exc:`CalledProcessError`. The
@@ -71,10 +79,15 @@ use cases, the underlying :class:`Popen` interface can be used directly.
:attr:`returncode` attribute.
The arguments shown above are merely the most common ones, described below
- in :ref:`frequently-used-arguments` (hence the slightly odd notation in
- the abbreviated signature). The full function signature is the same as
- that of the :class:`Popen` constructor - this functions passes all
- supplied arguments directly through to that interface.
+ in :ref:`frequently-used-arguments` (hence the use of keyword-only notation
+ in the abbreviated signature). The full function signature is largely the
+ same as that of the :class:`Popen` constructor - this function passes all
+ supplied arguments other than *timeout* directly through to that interface.
+
+ The *timeout* argument is passed to :meth:`Popen.wait`. If the timeout
+ expires, the child process will be killed and then waited for again. The
+ :exc:`TimeoutExpired` exception will be re-raised after the child process
+ has terminated.
Examples::
@@ -86,8 +99,6 @@ use cases, the underlying :class:`Popen` interface can be used directly.
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
- .. versionadded:: 2.5
-
.. warning::
Invoking the system shell with ``shell=True`` can be a security hazard
@@ -101,8 +112,11 @@ use cases, the underlying :class:`Popen` interface can be used directly.
process may block if it generates enough output to a pipe to fill up
the OS pipe buffer.
+ .. versionchanged:: 3.3
+ *timeout* was added.
+
-.. function:: check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
+.. function:: check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)
Run command with arguments and return its output as a byte string.
@@ -112,11 +126,17 @@ use cases, the underlying :class:`Popen` interface can be used directly.
attribute.
The arguments shown above are merely the most common ones, described below
- in :ref:`frequently-used-arguments` (hence the slightly odd notation in
- the abbreviated signature). The full function signature is largely the
- same as that of the :class:`Popen` constructor, except that *stdout* is
- not permitted as it is used internally. All other supplied arguments are
- passed directly through to the :class:`Popen` constructor.
+ in :ref:`frequently-used-arguments` (hence the use of keyword-only notation
+ in the abbreviated signature). The full function signature is largely the
+ same as that of the :class:`Popen` constructor - this functions passes all
+ supplied arguments other than *timeout* directly through to that interface.
+ In addition, *stdout* is not permitted as an argument, as it is used
+ internally to collect the output from the subprocess.
+
+ The *timeout* argument is passed to :meth:`Popen.wait`. If the timeout
+ expires, the child process will be killed and then waited for again. The
+ :exc:`TimeoutExpired` exception will be re-raised after the child process
+ has terminated.
Examples::
@@ -147,7 +167,7 @@ use cases, the underlying :class:`Popen` interface can be used directly.
... shell=True)
'ls: non_existent_file: No such file or directory\n'
- .. versionadded:: 2.7
+ .. versionadded:: 3.1
.. warning::
@@ -161,6 +181,18 @@ use cases, the underlying :class:`Popen` interface can be used directly.
read in the current process, the child process may block if it
generates enough output to the pipe to fill up the OS pipe buffer.
+ .. versionchanged:: 3.3
+ *timeout* was added.
+
+
+.. data:: DEVNULL
+
+ Special value that can be used as the *stdin*, *stdout* or *stderr* argument
+ to :class:`Popen` and indicates that the special file :data:`os.devnull`
+ will be used.
+
+ .. versionadded:: 3.3
+
.. data:: PIPE
@@ -176,10 +208,38 @@ use cases, the underlying :class:`Popen` interface can be used directly.
output.
+.. exception:: SubprocessError
+
+ Base class for all other exceptions from this module.
+
+ .. versionadded:: 3.3
+
+
+.. exception:: TimeoutExpired
+
+ Subclass of :exc:`SubprocessError`, raised when a timeout expires
+ while waiting for a child process.
+
+ .. attribute:: cmd
+
+ Command that was used to spawn the child process.
+
+ .. attribute:: timeout
+
+ Timeout in seconds.
+
+ .. attribute:: output
+
+ Output of the child process if this exception is raised by
+ :func:`check_output`. Otherwise, ``None``.
+
+ .. versionadded:: 3.3
+
+
.. exception:: CalledProcessError
- Exception raised when a process run by :func:`check_call` or
- :func:`check_output` returns a non-zero exit status.
+ Subclass of :exc:`SubprocessError`, raised when a process run by
+ :func:`check_call` or :func:`check_output` returns a non-zero exit status.
.. attribute:: returncode
@@ -216,25 +276,27 @@ default values. The arguments that are most commonly needed are:
*stdin*, *stdout* and *stderr* specify the executed program's standard input,
standard output and standard error file handles, respectively. Valid values
- are :data:`PIPE`, an existing file descriptor (a positive integer), an
- existing file object, and ``None``. :data:`PIPE` indicates that a new pipe
- to the child should be created. With the default settings of ``None``, no
- redirection will occur; the child's file handles will be inherited from the
- parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that
- the stderr data from the child process should be captured into the same file
- handle as for stdout.
+ are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive
+ integer), an existing file object, and ``None``. :data:`PIPE` indicates
+ that a new pipe to the child should be created. :data:`DEVNULL` indicates
+ that the special file :data:`os.devnull` will be used. With the default
+ settings of ``None``, no redirection will occur; the child's file handles
+ will be inherited from the parent. Additionally, *stderr* can be
+ :data:`STDOUT`, which indicates that the stderr data from the child
+ process should be captured into the same file handle as for *stdout*.
.. index::
single: universal newlines; subprocess module
- If *universal_newlines* is ``True``, the file objects *stdin*, *stdout*
- and *stderr* will be opened as text streams in :term:`universal newlines`
- mode using the encoding returned by :func:`locale.getpreferredencoding`.
- For *stdin*, line ending characters ``'\n'`` in the input will be converted
- to the default line separator :data:`os.linesep`. For *stdout* and
- *stderr*, all line endings in the output will be converted to ``'\n'``.
- For more information see the documentation of the :class:`io.TextIOWrapper`
- class when the *newline* argument to its constructor is ``None``.
+ If *universal_newlines* is ``True``, the file objects *stdin*, *stdout* and
+ *stderr* will be opened as text streams in :term:`universal newlines` mode
+ using the encoding returned by :func:`locale.getpreferredencoding(False)
+ <locale.getpreferredencoding>`. For *stdin*, line ending characters
+ ``'\n'`` in the input will be converted to the default line separator
+ :data:`os.linesep`. For *stdout* and *stderr*, all line endings in the
+ output will be converted to ``'\n'``. For more information see the
+ documentation of the :class:`io.TextIOWrapper` class when the *newline*
+ argument to its constructor is ``None``.
.. note::
@@ -254,6 +316,12 @@ default values. The arguments that are most commonly needed are:
:mod:`fnmatch`, :func:`os.walk`, :func:`os.path.expandvars`,
:func:`os.path.expanduser`, and :mod:`shutil`).
+ .. versionchanged:: 3.3
+ When *universal_newlines* is ``True``, the class uses the encoding
+ :func:`locale.getpreferredencoding(False) <locale.getpreferredencoding>`
+ instead of ``locale.getpreferredencoding()``. See the
+ :class:`io.TextIOWrapper` class for more information on this change.
+
.. warning::
Executing shell commands that incorporate unsanitized input from an
@@ -273,6 +341,10 @@ default values. The arguments that are most commonly needed are:
from this vulnerability; see the Note in the :class:`Popen` constructor
documentation for helpful hints in getting ``shell=False`` to work.
+ When using ``shell=True``, :func:`shlex.quote` can be used to properly
+ escape whitespace and shell metacharacters in strings that are going to
+ be used to construct shell commands.
+
These options, along with all of the other options, are described in more
detail in the :class:`Popen` constructor documentation.
@@ -382,13 +454,14 @@ functions.
*stdin*, *stdout* and *stderr* specify the executed program's standard input,
standard output and standard error file handles, respectively. Valid values
- are :data:`PIPE`, an existing file descriptor (a positive integer), an
- existing :term:`file object`, and ``None``. :data:`PIPE` indicates that a
- new pipe to the child should be created. With the default settings of
- ``None``, no redirection will occur; the child's file handles will be
- inherited from the parent. Additionally, *stderr* can be :data:`STDOUT`,
- which indicates that the stderr data from the applications should be
- captured into the same file handle as for stdout.
+ are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive
+ integer), an existing :term:`file object`, and ``None``. :data:`PIPE`
+ indicates that a new pipe to the child should be created. :data:`DEVNULL`
+ indicates that the special file :data:`os.devnull` will be used. With the
+ default settings of ``None``, no redirection will occur; the child's file
+ handles will be inherited from the parent. Additionally, *stderr* can be
+ :data:`STDOUT`, which indicates that the stderr data from the applications
+ should be captured into the same file handle as for stdout.
If *preexec_fn* is set to a callable object, this object will be called in the
child process just before the child is executed.
@@ -498,6 +571,15 @@ arguments.
:exc:`CalledProcessError` if the called process returns a non-zero return
code.
+All of the functions and methods that accept a *timeout* parameter, such as
+:func:`call` and :meth:`Popen.communicate` will raise :exc:`TimeoutExpired` if
+the timeout expires before the process exits.
+
+Exceptions defined in this module all inherit from :exc:`SubprocessError`.
+
+ .. versionadded:: 3.3
+ The :exc:`SubprocessError` base class was added.
+
Security
^^^^^^^^
@@ -521,11 +603,15 @@ Instances of the :class:`Popen` class have the following methods:
attribute.
-.. method:: Popen.wait()
+.. method:: Popen.wait(timeout=None)
Wait for child process to terminate. Set and return :attr:`returncode`
attribute.
+ If the process does not terminate after *timeout* seconds, raise a
+ :exc:`TimeoutExpired` exception. It is safe to catch this exception and
+ retry the wait.
+
.. warning::
This will deadlock when using ``stdout=PIPE`` and/or
@@ -533,13 +619,17 @@ Instances of the :class:`Popen` class have the following methods:
a pipe such that it blocks waiting for the OS pipe buffer to
accept more data. Use :meth:`communicate` to avoid that.
+ .. versionchanged:: 3.3
+ *timeout* was added.
+
-.. method:: Popen.communicate(input=None)
+.. method:: Popen.communicate(input=None, timeout=None)
Interact with process: Send data to stdin. Read data from stdout and stderr,
- until end-of-file is reached. Wait for process to terminate. The optional
- *input* argument should be a byte string to be sent to the child process, or
- ``None``, if no data should be sent to the child.
+ until end-of-file is reached. Wait for process to terminate. The optional
+ *input* argument should be data to be sent to the child process, or
+ ``None``, if no data should be sent to the child. The type of *input*
+ must be bytes or, if *universal_newlines* was ``True``, a string.
:meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
@@ -548,11 +638,29 @@ Instances of the :class:`Popen` class have the following methods:
``None`` in the result tuple, you need to give ``stdout=PIPE`` and/or
``stderr=PIPE`` too.
+ If the process does not terminate after *timeout* seconds, a
+ :exc:`TimeoutExpired` exception will be raised. Catching this exception and
+ retrying communication will not lose any output.
+
+ The child process is not killed if the timeout expires, so in order to
+ cleanup properly a well-behaved application should kill the child process and
+ finish communication::
+
+ proc = subprocess.Popen(...)
+ try:
+ outs, errs = proc.communicate(timeout=15)
+ except TimeoutExpired:
+ proc.kill()
+ outs, errs = proc.communicate()
+
.. note::
The data read is buffered in memory, so do not use this method if the data
size is large or unlimited.
+ .. versionchanged:: 3.3
+ *timeout* was added.
+
.. method:: Popen.send_signal(signal)
@@ -994,3 +1102,9 @@ runtime):
backslash. If the number of backslashes is odd, the last
backslash escapes the next double quotation mark as
described in rule 3.
+
+
+.. seealso::
+
+ :mod:`shlex`
+ Module which provides function to parse and escape command lines.
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 0e4adec..cd6d4bf 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -29,6 +29,33 @@ always available.
command line, see the :mod:`fileinput` module.
+.. data:: base_exec_prefix
+
+ Set during Python startup, before ``site.py`` is run, to the same value as
+ :data:`exec_prefix`. If not running in a
+ :ref:`virtual environment <venv-def>`, the values will stay the same; if
+ ``site.py`` finds that a virtual environment is in use, the values of
+ :data:`prefix` and :data:`exec_prefix` will be changed to point to the
+ virtual environment, whereas :data:`base_prefix` and
+ :data:`base_exec_prefix` will remain pointing to the base Python
+ installation (the one which the virtual environment was created from).
+
+ .. versionadded:: 3.3
+
+
+.. data:: base_prefix
+
+ Set during Python startup, before ``site.py`` is run, to the same value as
+ :data:`prefix`. If not running in a :ref:`virtual environment <venv-def>`, the values
+ will stay the same; if ``site.py`` finds that a virtual environment is in
+ use, the values of :data:`prefix` and :data:`exec_prefix` will be changed to
+ point to the virtual environment, whereas :data:`base_prefix` and
+ :data:`base_exec_prefix` will remain pointing to the base Python
+ installation (the one which the virtual environment was created from).
+
+ .. versionadded:: 3.3
+
+
.. data:: byteorder
An indicator of the native byte order. This will have the value ``'big'`` on
@@ -80,6 +107,22 @@ always available.
This function should be used for internal and specialized purposes only.
+.. function:: _debugmallocstats()
+
+ Print low-level information to stderr about the state of CPython's memory
+ allocator.
+
+ If Python is configured --with-pydebug, it also performs some expensive
+ internal consistency checks.
+
+ .. versionadded:: 3.3
+
+ .. impl-detail::
+
+ This function is specific to CPython. The exact output format is not
+ defined here, and may change.
+
+
.. data:: dllhandle
Integer specifying the handle of the Python DLL. Availability: Windows.
@@ -199,6 +242,11 @@ always available.
installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y*
is the version number of Python, for example ``3.2``.
+ .. note:: If a :ref:`virtual environment <venv-def>` is in effect, this
+ value will be changed in ``site.py`` to point to the virtual environment.
+ The value for the Python installation will still be available, via
+ :data:`base_exec_prefix`.
+
.. data:: executable
@@ -235,14 +283,13 @@ always available.
.. data:: flags
- The struct sequence *flags* exposes the status of command line flags. The
- attributes are read only.
+ The :term:`struct sequence` *flags* exposes the status of command line
+ flags. The attributes are read only.
============================= =============================
attribute flag
============================= =============================
:const:`debug` :option:`-d`
- :const:`division_warning` :option:`-Q`
:const:`inspect` :option:`-i`
:const:`interactive` :option:`-i`
:const:`optimize` :option:`-O` or :option:`-OO`
@@ -262,15 +309,18 @@ always available.
.. versionadded:: 3.2.3
The ``hash_randomization`` attribute.
+ .. versionchanged:: 3.3
+ Removed obsolete ``division_warning`` attribute.
+
.. data:: float_info
- A structseq holding information about the float type. It contains low level
- information about the precision and internal representation. The values
- correspond to the various floating-point constants defined in the standard
- header file :file:`float.h` for the 'C' programming language; see section
- 5.2.4.2.2 of the 1999 ISO/IEC C standard [C99]_, 'Characteristics of
- floating types', for details.
+ A :term:`struct sequence` holding information about the float type. It
+ contains low level information about the precision and internal
+ representation. The values correspond to the various floating-point
+ constants defined in the standard header file :file:`float.h` for the 'C'
+ programming language; see section 5.2.4.2.2 of the 1999 ISO/IEC C standard
+ [C99]_, 'Characteristics of floating types', for details.
+---------------------+----------------+--------------------------------------------------+
| attribute | float.h macro | explanation |
@@ -409,6 +459,9 @@ always available.
does not have to hold true for third-party extensions as it is implementation
specific.
+ Only the memory consumption directly attributed to the object is
+ accounted for, not the memory consumption of objects it refers to.
+
If given, *default* will be returned if the object does not provide means to
retrieve the size. Otherwise a :exc:`TypeError` will be raised.
@@ -520,8 +573,9 @@ always available.
.. data:: hash_info
- A structseq giving parameters of the numeric hash implementation. For
- more details about hashing of numeric types, see :ref:`numeric-hash`.
+ A :term:`struct sequence` giving parameters of the numeric hash
+ implementation. For more details about hashing of numeric types, see
+ :ref:`numeric-hash`.
+---------------------+--------------------------------------------------+
| attribute | explanation |
@@ -556,8 +610,8 @@ always available.
This is called ``hexversion`` since it only really looks meaningful when viewed
as the result of passing it to the built-in :func:`hex` function. The
- struct sequence :data:`sys.version_info` may be used for a more human-friendly
- encoding of the same information.
+ :term:`struct sequence` :data:`sys.version_info` may be used for a more
+ human-friendly encoding of the same information.
The ``hexversion`` is a 32-bit number with the following layout:
@@ -583,10 +637,51 @@ always available.
Thus ``2.1.0a3`` is hexversion ``0x020100a3``.
+
+.. data:: implementation
+
+ An object containing information about the implementation of the
+ currently running Python interpreter. The following attributes are
+ required to exist in all Python implementations.
+
+ *name* is the implementation's identifier, e.g. ``'cpython'``. The actual
+ string is defined by the Python implementation, but it is guaranteed to be
+ lower case.
+
+ *version* is a named tuple, in the same format as
+ :data:`sys.version_info`. It represents the version of the Python
+ *implementation*. This has a distinct meaning from the specific
+ version of the Python *language* to which the currently running
+ interpreter conforms, which ``sys.version_info`` represents. For
+ example, for PyPy 1.8 ``sys.implementation.version`` might be
+ ``sys.version_info(1, 8, 0, 'final', 0)``, whereas ``sys.version_info``
+ would be ``sys.version_info(2, 7, 2, 'final', 0)``. For CPython they
+ are the same value, since it is the reference implementation.
+
+ *hexversion* is the implementation version in hexadecimal format, like
+ :data:`sys.hexversion`.
+
+ *cache_tag* is the tag used by the import machinery in the filenames of
+ cached modules. By convention, it would be a composite of the
+ implementation's name and version, like ``'cpython-33'``. However, a
+ Python implementation may use some other value if appropriate. If
+ ``cache_tag`` is set to ``None``, it indicates that module caching should
+ be disabled.
+
+ :data:`sys.implementation` may contain additional attributes specific to
+ the Python implementation. These non-standard attributes must start with
+ an underscore, and are not described here. Regardless of its contents,
+ :data:`sys.implementation` will not change during a run of the interpreter,
+ nor between implementation versions. (It may change between Python
+ language versions, however.) See `PEP 421` for more information.
+
+ .. versionadded:: 3.3
+
+
.. data:: int_info
- A struct sequence that holds information about Python's
- internal representation of integers. The attributes are read only.
+ A :term:`struct sequence` that holds information about Python's internal
+ representation of integers. The attributes are read only.
+-------------------------+----------------------------------------------+
| Attribute | Explanation |
@@ -641,9 +736,13 @@ always available.
.. data:: maxunicode
- An integer giving the largest supported code point for a Unicode character. The
- value of this depends on the configuration option that specifies whether Unicode
- characters are stored as UCS-2 or UCS-4.
+ An integer giving the value of the largest Unicode code point,
+ i.e. ``1114111`` (``0x10FFFF`` in hexadecimal).
+
+ .. versionchanged:: 3.3
+ Before :pep:`393`, ``sys.maxunicode`` used to be either ``0xFFFF``
+ or ``0x10FFFF``, depending on the configuration option that specified
+ whether Unicode characters were stored as UCS-2 or UCS-4.
.. data:: meta_path
@@ -718,36 +817,35 @@ always available.
This string contains a platform identifier that can be used to append
platform-specific components to :data:`sys.path`, for instance.
- For most Unix systems, this is the lowercased OS name as returned by ``uname
- -s`` with the first part of the version as returned by ``uname -r`` appended,
- e.g. ``'sunos5'``, *at the time when Python was built*. Unless you want to
- test for a specific system version, it is therefore recommended to use the
- following idiom::
+ For Unix systems, except on Linux, this is the lowercased OS name as
+ returned by ``uname -s`` with the first part of the version as returned by
+ ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, *at the time
+ when Python was built*. Unless you want to test for a specific system
+ version, it is therefore recommended to use the following idiom::
if sys.platform.startswith('freebsd'):
# FreeBSD-specific code here...
elif sys.platform.startswith('linux'):
# Linux-specific code here...
- .. versionchanged:: 3.2.2
- Since lots of code check for ``sys.platform == 'linux2'``, and there is
- no essential change between Linux 2.x and 3.x, ``sys.platform`` is always
- set to ``'linux2'``, even on Linux 3.x. In Python 3.3 and later, the
- value will always be set to ``'linux'``, so it is recommended to always
- use the ``startswith`` idiom presented above.
-
For other systems, the values are:
- ====================== ===========================
- System :data:`platform` value
- ====================== ===========================
- Linux (2.x *and* 3.x) ``'linux2'``
- Windows ``'win32'``
- Windows/Cygwin ``'cygwin'``
- Mac OS X ``'darwin'``
- OS/2 ``'os2'``
- OS/2 EMX ``'os2emx'``
- ====================== ===========================
+ ================ ===========================
+ System :data:`platform` value
+ ================ ===========================
+ Linux ``'linux'``
+ Windows ``'win32'``
+ Windows/Cygwin ``'cygwin'``
+ Mac OS X ``'darwin'``
+ OS/2 ``'os2'``
+ OS/2 EMX ``'os2emx'``
+ ================ ===========================
+
+ .. versionchanged:: 3.3
+ On Linux, :attr:`sys.platform` doesn't contain the major version anymore.
+ It is always ``'linux'``, instead of ``'linux2'`` or ``'linux3'``. Since
+ older Python versions include the version number, it is recommended to
+ always use the ``startswith`` idiom presented above.
.. seealso::
@@ -764,11 +862,16 @@ always available.
independent Python files are installed; by default, this is the string
``'/usr/local'``. This can be set at build time with the ``--prefix``
argument to the :program:`configure` script. The main collection of Python
- library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}``
+ library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`
while the platform independent header files (all except :file:`pyconfig.h`) are
stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version
number of Python, for example ``3.2``.
+ .. note:: If a :ref:`virtual environment <venv-def>` is in effect, this
+ value will be changed in ``site.py`` to point to the virtual
+ environment. The value for the Python installation will still be
+ available, via :data:`base_prefix`.
+
.. data:: ps1
ps2
@@ -806,11 +909,11 @@ always available.
the interpreter loads extension modules. Among other things, this will enable a
lazy resolving of symbols when importing a module, if called as
``sys.setdlopenflags(0)``. To share symbols across extension modules, call as
- ``sys.setdlopenflags(ctypes.RTLD_GLOBAL)``. Symbolic names for the
- flag modules can be either found in the :mod:`ctypes` module, or in the :mod:`DLFCN`
- module. If :mod:`DLFCN` is not available, it can be generated from
- :file:`/usr/include/dlfcn.h` using the :program:`h2py` script. Availability:
- Unix.
+ ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag modules
+ can be found in the :mod:`os` module (``RTLD_xxx`` constants, e.g.
+ :data:`os.RTLD_LAZY`).
+
+ Availability: Unix.
.. function:: setprofile(profilefunc)
@@ -1003,22 +1106,33 @@ always available.
to a console and Python apps started with :program:`pythonw`.
-.. data:: subversion
+.. data:: thread_info
- A triple (repo, branch, version) representing the Subversion information of the
- Python interpreter. *repo* is the name of the repository, ``'CPython'``.
- *branch* is a string of one of the forms ``'trunk'``, ``'branches/name'`` or
- ``'tags/name'``. *version* is the output of ``svnversion``, if the interpreter
- was built from a Subversion checkout; it contains the revision number (range)
- and possibly a trailing 'M' if there were local modifications. If the tree was
- exported (or svnversion was not available), it is the revision of
- ``Include/patchlevel.h`` if the branch is a tag. Otherwise, it is ``None``.
+ A :term:`struct sequence` holding information about the thread
+ implementation.
- .. deprecated:: 3.2.1
- Python is now `developed <http://docs.python.org/devguide/>`_ using
- Mercurial. In recent Python 3.2 bugfix releases, :data:`subversion`
- therefore contains placeholder information. It is removed in Python
- 3.3.
+ +------------------+---------------------------------------------------------+
+ | Attribute | Explanation |
+ +==================+=========================================================+
+ | :const:`name` | Name of the thread implementation: |
+ | | |
+ | | * ``'nt'``: Windows threads |
+ | | * ``'os2'``: OS/2 threads |
+ | | * ``'pthread'``: POSIX threads |
+ | | * ``'solaris'``: Solaris threads |
+ +------------------+---------------------------------------------------------+
+ | :const:`lock` | Name of the lock implementation: |
+ | | |
+ | | * ``'semaphore'``: a lock uses a semaphore |
+ | | * ``'mutex+cond'``: a lock uses a mutex |
+ | | and a condition variable |
+ | | * ``None`` if this information is unknown |
+ +------------------+---------------------------------------------------------+
+ | :const:`version` | Name and version of the thread library. It is a string, |
+ | | or ``None`` if these informations are unknown. |
+ +------------------+---------------------------------------------------------+
+
+ .. versionadded:: 3.3
.. data:: tracebacklimit
diff --git a/Doc/library/syslog.rst b/Doc/library/syslog.rst
index 974ecf9..6e90dc0 100644
--- a/Doc/library/syslog.rst
+++ b/Doc/library/syslog.rst
@@ -79,12 +79,14 @@ Priority levels (high to low):
Facilities:
:const:`LOG_KERN`, :const:`LOG_USER`, :const:`LOG_MAIL`, :const:`LOG_DAEMON`,
:const:`LOG_AUTH`, :const:`LOG_LPR`, :const:`LOG_NEWS`, :const:`LOG_UUCP`,
- :const:`LOG_CRON`, :const:`LOG_SYSLOG` and :const:`LOG_LOCAL0` to
- :const:`LOG_LOCAL7`.
+ :const:`LOG_CRON`, :const:`LOG_SYSLOG`, :const:`LOG_LOCAL0` to
+ :const:`LOG_LOCAL7`, and, if defined in ``<syslog.h>``,
+ :const:`LOG_AUTHPRIV`.
Log options:
- :const:`LOG_PID`, :const:`LOG_CONS`, :const:`LOG_NDELAY`, :const:`LOG_NOWAIT`
- and :const:`LOG_PERROR` if defined in ``<syslog.h>``.
+ :const:`LOG_PID`, :const:`LOG_CONS`, :const:`LOG_NDELAY`, and, if defined
+ in ``<syslog.h>``, :const:`LOG_ODELAY`, :const:`LOG_NOWAIT`, and
+ :const:`LOG_PERROR`.
Examples
diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst
index 46e4900..86dd33d 100644
--- a/Doc/library/tarfile.rst
+++ b/Doc/library/tarfile.rst
@@ -13,13 +13,13 @@
--------------
The :mod:`tarfile` module makes it possible to read and write tar
-archives, including those using gzip or bz2 compression.
+archives, including those using gzip, bz2 and lzma compression.
Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the
higher-level functions in :ref:`shutil <archiving-operations>`.
Some facts and figures:
-* reads and writes :mod:`gzip` and :mod:`bz2` compressed archives.
+* reads and writes :mod:`gzip`, :mod:`bz2` and :mod:`lzma` compressed archives.
* read/write support for the POSIX.1-1988 (ustar) format.
@@ -33,6 +33,9 @@ Some facts and figures:
character devices and block devices and is able to acquire and restore file
information like timestamp, access permissions and owner.
+.. versionchanged:: 3.3
+ Added support for :mod:`lzma` compression.
+
.. function:: open(name=None, mode='r', fileobj=None, bufsize=10240, \*\*kwargs)
@@ -56,6 +59,8 @@ Some facts and figures:
+------------------+---------------------------------------------+
| ``'r:bz2'`` | Open for reading with bzip2 compression. |
+------------------+---------------------------------------------+
+ | ``'r:xz'`` | Open for reading with lzma compression. |
+ +------------------+---------------------------------------------+
| ``'a' or 'a:'`` | Open for appending with no compression. The |
| | file is created if it does not exist. |
+------------------+---------------------------------------------+
@@ -65,11 +70,13 @@ Some facts and figures:
+------------------+---------------------------------------------+
| ``'w:bz2'`` | Open for bzip2 compressed writing. |
+------------------+---------------------------------------------+
+ | ``'w:xz'`` | Open for lzma compressed writing. |
+ +------------------+---------------------------------------------+
- Note that ``'a:gz'`` or ``'a:bz2'`` is not possible. If *mode* is not suitable
- to open a certain (compressed) file for reading, :exc:`ReadError` is raised. Use
- *mode* ``'r'`` to avoid this. If a compression method is not supported,
- :exc:`CompressionError` is raised.
+ Note that ``'a:gz'``, ``'a:bz2'`` or ``'a:xz'`` is not possible. If *mode*
+ is not suitable to open a certain (compressed) file for reading,
+ :exc:`ReadError` is raised. Use *mode* ``'r'`` to avoid this. If a
+ compression method is not supported, :exc:`CompressionError` is raised.
If *fileobj* is specified, it is used as an alternative to a :term:`file object`
opened in binary mode for *name*. It is supposed to be at position 0.
@@ -100,6 +107,9 @@ Some facts and figures:
| ``'r|bz2'`` | Open a bzip2 compressed *stream* for |
| | reading. |
+-------------+--------------------------------------------+
+ | ``'r|xz'`` | Open a lzma compressed *stream* for |
+ | | reading. |
+ +-------------+--------------------------------------------+
| ``'w|'`` | Open an uncompressed *stream* for writing. |
+-------------+--------------------------------------------+
| ``'w|gz'`` | Open a gzip compressed *stream* for |
@@ -108,6 +118,9 @@ Some facts and figures:
| ``'w|bz2'`` | Open a bzip2 compressed *stream* for |
| | writing. |
+-------------+--------------------------------------------+
+ | ``'w|xz'`` | Open an lzma compressed *stream* for |
+ | | writing. |
+ +-------------+--------------------------------------------+
.. class:: TarFile
@@ -263,9 +276,9 @@ be finalized; only the internally used file object will be closed. See the
If *errorlevel* is ``0``, all errors are ignored when using :meth:`TarFile.extract`.
Nevertheless, they appear as error messages in the debug output, when debugging
- is enabled. If ``1``, all *fatal* errors are raised as :exc:`OSError` or
- :exc:`IOError` exceptions. If ``2``, all *non-fatal* errors are raised as
- :exc:`TarError` exceptions as well.
+ is enabled. If ``1``, all *fatal* errors are raised as :exc:`OSError`
+ exceptions. If ``2``, all *non-fatal* errors are raised as :exc:`TarError`
+ exceptions as well.
The *encoding* and *errors* arguments define the character encoding to be
used for reading or writing the archive and how conversion errors are going
@@ -363,15 +376,12 @@ be finalized; only the internally used file object will be closed. See the
.. method:: TarFile.extractfile(member)
Extract a member from the archive as a file object. *member* may be a filename
- or a :class:`TarInfo` object. If *member* is a regular file, a :term:`file-like
- object` is returned. If *member* is a link, a file-like object is constructed from
- the link's target. If *member* is none of the above, :const:`None` is returned.
-
- .. note::
+ or a :class:`TarInfo` object. If *member* is a regular file or a link, an
+ :class:`io.BufferedReader` object is returned. Otherwise, :const:`None` is
+ returned.
- The file-like object is read-only. It provides the methods
- :meth:`read`, :meth:`readline`, :meth:`readlines`, :meth:`seek`, :meth:`tell`,
- and :meth:`close`, and also supports iteration over its lines.
+ .. versionchanged:: 3.3
+ Return an :class:`io.BufferedReader` object.
.. method:: TarFile.add(name, arcname=None, recursive=True, exclude=None, *, filter=None)
diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst
index 646634d..9bc79c5 100644
--- a/Doc/library/telnetlib.rst
+++ b/Doc/library/telnetlib.rst
@@ -162,9 +162,13 @@ Telnet Objects
.. method:: Telnet.write(buffer)
Write a byte string to the socket, doubling any IAC characters. This can
- block if the connection is blocked. May raise :exc:`socket.error` if the
+ block if the connection is blocked. May raise :exc:`OSError` if the
connection is closed.
+ .. versionchanged:: 3.3
+ This method used to raise :exc:`socket.error`, which is now an alias
+ of :exc:`OSError`.
+
.. method:: Telnet.interact()
diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst
index c143b88..96ead1f 100644
--- a/Doc/library/tempfile.rst
+++ b/Doc/library/tempfile.rst
@@ -25,7 +25,7 @@ instead a string of six random characters is used.
Also, all the user-callable functions now take additional arguments which
allow direct control over the location and name of temporary files. It is
-no longer necessary to use the global *tempdir* and *template* variables.
+no longer necessary to use the global *tempdir* variable.
To maintain backward compatibility, the argument order is somewhat odd; it
is recommended to use keyword arguments for clarity.
@@ -76,8 +76,7 @@ The module defines the following user-callable items:
data is spooled in memory until the file size exceeds *max_size*, or
until the file's :func:`fileno` method is called, at which point the
contents are written to disk and operation proceeds as with
- :func:`TemporaryFile`. Also, it's ``truncate`` method does not
- accept a ``size`` argument.
+ :func:`TemporaryFile`.
The resulting file has one additional method, :func:`rollover`, which
causes the file to roll over to an on-disk file regardless of its size.
@@ -87,6 +86,9 @@ The module defines the following user-callable items:
whether :func:`rollover` has been called. This file-like object can be
used in a :keyword:`with` statement, just like a normal file.
+ .. versionchanged:: 3.3
+ the truncate method now accepts a ``size`` argument.
+
.. function:: TemporaryDirectory(suffix='', prefix='tmp', dir=None)
diff --git a/Doc/library/test.rst b/Doc/library/test.rst
index 40f4115..2e8ba32 100644
--- a/Doc/library/test.rst
+++ b/Doc/library/test.rst
@@ -80,17 +80,12 @@ A basic boilerplate is often used::
... more test classes ...
- def test_main():
- support.run_unittest(MyTestCase1,
- MyTestCase2,
- ... list other tests ...
- )
-
if __name__ == '__main__':
- test_main()
+ unittest.main()
-This boilerplate code allows the testing suite to be run by :mod:`test.regrtest`
-as well as on its own as a script.
+This code pattern allows the testing suite to be run by :mod:`test.regrtest`,
+on its own as a script that supports the :mod:`unittest` CLI, or via the
+`python -m unittest` CLI.
The goal for regression testing is to try to break code. This leads to a few
guidelines to be followed:
@@ -129,22 +124,27 @@ guidelines to be followed:
as what type of input is used. Minimize code duplication by subclassing a
basic test class with a class that specifies the input::
- class TestFuncAcceptsSequences(unittest.TestCase):
+ class TestFuncAcceptsSequencesMixin:
func = mySuperWhammyFunction
def test_func(self):
self.func(self.arg)
- class AcceptLists(TestFuncAcceptsSequences):
+ class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = [1, 2, 3]
- class AcceptStrings(TestFuncAcceptsSequences):
+ class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = 'abc'
- class AcceptTuples(TestFuncAcceptsSequences):
+ class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = (1, 2, 3)
+ When using this pattern, remember that all classes that inherit from
+ `unittest.TestCase` are run as tests. The `Mixin` class in the example above
+ does not have any data and so can't be run by itself, thus it does not
+ inherit from `unittest.TestCase`.
+
.. seealso::
@@ -160,14 +160,15 @@ Running tests using the command-line interface
The :mod:`test` package can be run as a script to drive Python's regression
test suite, thanks to the :option:`-m` option: :program:`python -m test`. Under
the hood, it uses :mod:`test.regrtest`; the call :program:`python -m
-test.regrtest` used in previous Python versions still works).
-Running the script by itself automatically starts running all regression
-tests in the :mod:`test` package. It does this by finding all modules in the
-package whose name starts with ``test_``, importing them, and executing the
-function :func:`test_main` if present. The names of tests to execute may also
-be passed to the script. Specifying a single regression test (:program:`python
--m test test_spam`) will minimize output and only print
-whether the test passed or failed and thus minimize output.
+test.regrtest` used in previous Python versions still works). Running the
+script by itself automatically starts running all regression tests in the
+:mod:`test` package. It does this by finding all modules in the package whose
+name starts with ``test_``, importing them, and executing the function
+:func:`test_main` if present or loading the tests via
+unittest.TestLoader.loadTestsFromModule if ``test_main`` does not exist. The
+names of tests to execute may also be passed to the script. Specifying a single
+regression test (:program:`python -m test test_spam`) will minimize output and
+only print whether the test passed or failed.
Running :mod:`test` directly allows what resources are available for
tests to use to be set. You do this by using the ``-u`` command-line
@@ -223,14 +224,14 @@ The :mod:`test.support` module defines the following constants:
.. data:: verbose
- :const:`True` when verbose output is enabled. Should be checked when more
+ ``True`` when verbose output is enabled. Should be checked when more
detailed information is desired about a running test. *verbose* is set by
:mod:`test.regrtest`.
.. data:: is_jython
- :const:`True` if the running interpreter is Jython.
+ ``True`` if the running interpreter is Jython.
.. data:: TESTFN
@@ -249,7 +250,7 @@ The :mod:`test.support` module defines the following functions:
.. function:: is_resource_enabled(resource)
- Return :const:`True` if *resource* is enabled and available. The list of
+ Return ``True`` if *resource* is enabled and available. The list of
available resources is only set when :mod:`test.regrtest` is executing the
tests.
@@ -258,7 +259,7 @@ The :mod:`test.support` module defines the following functions:
Raise :exc:`ResourceDenied` if *resource* is not available. *msg* is the
argument to :exc:`ResourceDenied` if it is raised. Always returns
- :const:`True` if called by a function whose ``__name__`` is ``'__main__'``.
+ ``True`` if called by a function whose ``__name__`` is ``'__main__'``.
Used when tests are executed by :mod:`test.regrtest`.
@@ -286,6 +287,15 @@ The :mod:`test.support` module defines the following functions:
This will run all tests defined in the named module.
+.. function:: run_doctest(module, verbosity=None)
+
+ Run :func:`doctest.testmod` on the given *module*. Return
+ ``(failure_count, test_count)``.
+
+ If *verbosity* is ``None``, :func:`doctest.testmod` is run with verbosity
+ set to :data:`verbose`. Otherwise, it is run with verbosity set to
+ ``None``.
+
.. function:: check_warnings(\*filters, quiet=True)
A convenience wrapper for :func:`warnings.catch_warnings()` that makes it
@@ -296,12 +306,12 @@ The :mod:`test.support` module defines the following functions:
``check_warnings`` accepts 2-tuples of the form ``("message regexp",
WarningCategory)`` as positional arguments. If one or more *filters* are
- provided, or if the optional keyword argument *quiet* is :const:`False`,
+ provided, or if the optional keyword argument *quiet* is ``False``,
it checks to make sure the warnings are as expected: each specified filter
must match at least one of the warnings raised by the enclosed code or the
test fails, and if any warnings are raised that do not match any of the
specified filters the test fails. To disable the first of these checks,
- set *quiet* to :const:`True`.
+ set *quiet* to ``True``.
If no arguments are specified, it defaults to::
@@ -316,7 +326,7 @@ The :mod:`test.support` module defines the following functions:
representing the most recent warning can also be accessed directly through
the recorder object (see example below). If no warning has been raised,
then any of the attributes that would otherwise be expected on an object
- representing a warning will return :const:`None`.
+ representing a warning will return ``None``.
The recorder object also has a :meth:`reset` method, which clears the
warnings list.
@@ -354,7 +364,7 @@ The :mod:`test.support` module defines the following functions:
.. function:: captured_stdout()
- This is a context manager that runs the :keyword:`with` statement body using
+ A context manager that runs the :keyword:`with` statement body using
a :class:`StringIO.StringIO` object as sys.stdout. That object can be
retrieved using the ``as`` clause of the :keyword:`with` statement.
@@ -365,6 +375,57 @@ The :mod:`test.support` module defines the following functions:
assert s.getvalue() == "hello\n"
+.. function:: temp_cwd(name='tempcwd', quiet=False, path=None)
+
+ A context manager that temporarily changes the current working
+ directory (CWD).
+
+ An existing path may be provided as *path*, in which case this function
+ makes no changes to the file system.
+
+ Otherwise, the new CWD is created in the current directory and it's named
+ *name*. If *quiet* is ``False`` and it's not possible to create or
+ change the CWD, an error is raised. If it's ``True``, only a warning
+ is raised and the original CWD is used.
+
+
+.. function:: temp_umask(umask)
+
+ A context manager that temporarily sets the process umask.
+
+
+.. function:: can_symlink()
+
+ Return ``True`` if the OS supports symbolic links, ``False``
+ otherwise.
+
+
+.. decorator:: skip_unless_symlink()
+
+ A decorator for running tests that require support for symbolic links.
+
+
+.. decorator:: anticipate_failure(condition)
+
+ A decorator to conditionally mark tests with
+ :func:`unittest.expectedFailure`. Any use of this decorator should
+ have an associated comment identifying the relevant tracker issue.
+
+
+.. decorator:: run_with_locale(catstr, *locales)
+
+ A decorator for running a function in a different locale, correctly
+ resetting it after it has finished. *catstr* is the locale category as
+ a string (for example ``"LC_ALL"``). The *locales* passed will be tried
+ sequentially, and the first valid locale will be used.
+
+
+.. function:: make_bad_fd()
+
+ Create an invalid file descriptor by opening and closing a temporary file,
+ and returning its descripor.
+
+
.. function:: import_module(name, deprecated=False)
This function imports and returns the named module. Unlike a normal
@@ -372,7 +433,7 @@ The :mod:`test.support` module defines the following functions:
cannot be imported.
Module and package deprecation messages are suppressed during this import
- if *deprecated* is :const:`True`.
+ if *deprecated* is ``True``.
.. versionadded:: 3.1
@@ -396,9 +457,9 @@ The :mod:`test.support` module defines the following functions:
``sys.modules`` when the fresh import is complete.
Module and package deprecation messages are suppressed during this import
- if *deprecated* is :const:`True`.
+ if *deprecated* is ``True``.
- This function will raise :exc:`unittest.SkipTest` is the named module
+ This function will raise :exc:`unittest.SkipTest` if the named module
cannot be imported.
Example use::
@@ -413,6 +474,48 @@ The :mod:`test.support` module defines the following functions:
.. versionadded:: 3.1
+.. function:: bind_port(sock, host=HOST)
+
+ Bind the socket to a free port and return the port number. Relies on
+ ephemeral ports in order to ensure we are using an unbound port. This is
+ important as many tests may be running simultaneously, especially in a
+ buildbot environment. This method raises an exception if the
+ ``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is
+ :const:`~socket.SOCK_STREAM`, and the socket has
+ :const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it.
+ Tests should never set these socket options for TCP/IP sockets.
+ The only case for setting these options is testing multicasting via
+ multiple UDP sockets.
+
+ Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is
+ available (i.e. on Windows), it will be set on the socket. This will
+ prevent anyone else from binding to our host/port for the duration of the
+ test.
+
+
+.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)
+
+ Returns an unused port that should be suitable for binding. This is
+ achieved by creating a temporary socket with the same family and type as
+ the ``sock`` parameter (default is :const:`~socket.AF_INET`,
+ :const:`~socket.SOCK_STREAM`),
+ and binding it to the specified host address (defaults to ``0.0.0.0``)
+ with the port set to 0, eliciting an unused ephemeral port from the OS.
+ The temporary socket is then closed and deleted, and the ephemeral port is
+ returned.
+
+ Either this method or :func:`bind_port` should be used for any tests
+ where a server socket needs to be bound to a particular port for the
+ duration of the test.
+ Which one to use depends on whether the calling code is creating a python
+ socket, or if an unused port needs to be provided in a constructor
+ or passed to an external program (i.e. the ``-accept`` argument to
+ openssl's s_server mode). Always prefer :func:`bind_port` over
+ :func:`find_unused_port` where possible. Using a hard coded port is
+ discouraged since it can makes multiple instances of the test impossible to
+ run simultaneously, which is a problem for buildbots.
+
+
The :mod:`test.support` module defines the following classes:
.. class:: TransientResource(exc, **kwargs)
diff --git a/Doc/library/text.rst b/Doc/library/text.rst
new file mode 100644
index 0000000..47b6784
--- /dev/null
+++ b/Doc/library/text.rst
@@ -0,0 +1,26 @@
+.. _stringservices:
+.. _textservices:
+
+************************
+Text Processing Services
+************************
+
+The modules described in this chapter provide a wide range of string
+manipulation operations and other text processing services.
+
+The :mod:`codecs` module described under :ref:`binaryservices` is also
+highly relevant to text processing. In addition, see the documentation for
+Python's built-in string type in :ref:`textseq`.
+
+
+.. toctree::
+
+ string.rst
+ re.rst
+ difflib.rst
+ textwrap.rst
+ unicodedata.rst
+ stringprep.rst
+ readline.rst
+ rlcompleter.rst
+
diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst
index 3c1ecf6..c625254 100644
--- a/Doc/library/textwrap.rst
+++ b/Doc/library/textwrap.rst
@@ -12,7 +12,7 @@
The :mod:`textwrap` module provides two convenience functions, :func:`wrap` and
:func:`fill`, as well as :class:`TextWrapper`, the class that does all the work,
-and a utility function :func:`dedent`. If you're just wrapping or filling one
+and two utility functions, :func:`dedent` and :func:`indent`. If you're just wrapping or filling one
or two text strings, the convenience functions should be good enough;
otherwise, you should use an instance of :class:`TextWrapper` for efficiency.
@@ -48,9 +48,10 @@ Text is preferably wrapped on whitespaces and right after the hyphens in
hyphenated words; only then will long words be broken if necessary, unless
:attr:`TextWrapper.break_long_words` is set to false.
-An additional utility function, :func:`dedent`, is provided to remove
-indentation from strings that have unwanted whitespace to the left of the text.
-
+Two additional utility function, :func:`dedent` and :func:`indent`, are
+provided to remove indentation from strings that have unwanted whitespace
+to the left of the text and to add an arbitrary prefix to selected lines
+in a block of text.
.. function:: dedent(text)
@@ -75,6 +76,32 @@ indentation from strings that have unwanted whitespace to the left of the text.
print(repr(dedent(s))) # prints 'hello\n world\n'
+.. function:: indent(text, prefix, predicate=None)
+
+ Add *prefix* to the beginning of selected lines in *text*.
+
+ Lines are separated by calling ``text.splitlines(True)``.
+
+ By default, *prefix* is added to all lines that do not consist
+ solely of whitespace (including any line endings).
+
+ For example::
+
+ >>> s = 'hello\n\n \nworld'
+ >>> indent(s, ' ')
+ ' hello\n\n \n world'
+
+ The optional *predicate* argument can be used to control which lines
+ are indented. For example, it is easy to add *prefix* to even empty
+ and whitespace-only lines::
+
+ >>> print(indent(s, '+ ', lambda line: True))
+ + hello
+ +
+ +
+ + world
+
+
.. class:: TextWrapper(**kwargs)
The :class:`TextWrapper` constructor accepts a number of optional keyword
@@ -110,6 +137,15 @@ indentation from strings that have unwanted whitespace to the left of the text.
expanded to spaces using the :meth:`expandtabs` method of *text*.
+ .. attribute:: tabsize
+
+ (default: ``8``) If :attr:`expand_tabs` is true, then all tab characters
+ in *text* will be expanded to zero or more spaces, depending on the
+ current column and the given tab size.
+
+ .. versionadded:: 3.3
+
+
.. attribute:: replace_whitespace
(default: ``True``) If true, after tab expansion but before wrapping,
diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst
index 43087ef..05863a0 100644
--- a/Doc/library/threading.rst
+++ b/Doc/library/threading.rst
@@ -20,19 +20,8 @@ The :mod:`dummy_threading` module is provided for situations where
methods and functions in this module in the Python 2.x series are still
supported by this module.
-.. impl-detail::
-
- Due to the :term:`Global Interpreter Lock`, in CPython only one thread
- can execute Python code at once (even though certain performance-oriented
- libraries might overcome this limitation).
- If you want your application to make better of use of the computational
- resources of multi-core machines, you are advised to use
- :mod:`multiprocessing` or :class:`concurrent.futures.ProcessPoolExecutor`.
- However, threading is still an appropriate model if you want to run
- multiple I/O-bound tasks simultaneously.
-
-This module defines the following functions and objects:
+This module defines the following functions:
.. function:: active_count()
@@ -41,16 +30,6 @@ This module defines the following functions and objects:
count is equal to the length of the list returned by :func:`.enumerate`.
-.. function:: Condition()
- :noindex:
-
- A factory function that returns a new condition variable object. A condition
- variable allows one or more threads to wait until they are notified by another
- thread.
-
- See :ref:`condition-objects`.
-
-
.. function:: current_thread()
Return the current :class:`Thread` object, corresponding to the caller's thread
@@ -59,6 +38,17 @@ This module defines the following functions and objects:
returned.
+.. function:: get_ident()
+
+ Return the 'thread identifier' of the current thread. This is a nonzero
+ integer. Its value has no direct meaning; it is intended as a magic cookie
+ to be used e.g. to index a dictionary of thread-specific data. Thread
+ identifiers may be recycled when a thread exits and another thread is
+ created.
+
+ .. versionadded:: 3.3
+
+
.. function:: enumerate()
Return a list of all :class:`Thread` objects currently alive. The list
@@ -67,89 +57,6 @@ This module defines the following functions and objects:
and threads that have not yet been started.
-.. function:: Event()
- :noindex:
-
- A factory function that returns a new event object. An event manages a flag
- that can be set to true with the :meth:`~Event.set` method and reset to false
- with the :meth:`clear` method. The :meth:`wait` method blocks until the flag
- is true.
-
- See :ref:`event-objects`.
-
-
-.. class:: local
-
- A class that represents thread-local data. Thread-local data are data whose
- values are thread specific. To manage thread-local data, just create an
- instance of :class:`local` (or a subclass) and store attributes on it::
-
- mydata = threading.local()
- mydata.x = 1
-
- The instance's values will be different for separate threads.
-
- For more details and extensive examples, see the documentation string of the
- :mod:`_threading_local` module.
-
-
-.. function:: Lock()
-
- A factory function that returns a new primitive lock object. Once a thread has
- acquired it, subsequent attempts to acquire it block, until it is released; any
- thread may release it.
-
- See :ref:`lock-objects`.
-
-
-.. function:: RLock()
-
- A factory function that returns a new reentrant lock object. A reentrant lock
- must be released by the thread that acquired it. Once a thread has acquired a
- reentrant lock, the same thread may acquire it again without blocking; the
- thread must release it once for each time it has acquired it.
-
- See :ref:`rlock-objects`.
-
-
-.. function:: Semaphore(value=1)
- :noindex:
-
- A factory function that returns a new semaphore object. A semaphore manages a
- counter representing the number of :meth:`release` calls minus the number of
- :meth:`acquire` calls, plus an initial value. The :meth:`acquire` method blocks
- if necessary until it can return without making the counter negative. If not
- given, *value* defaults to 1.
-
- See :ref:`semaphore-objects`.
-
-
-.. function:: BoundedSemaphore(value=1)
-
- A factory function that returns a new bounded semaphore object. A bounded
- semaphore checks to make sure its current value doesn't exceed its initial
- value. If it does, :exc:`ValueError` is raised. In most situations semaphores
- are used to guard resources with limited capacity. If the semaphore is released
- too many times it's a sign of a bug. If not given, *value* defaults to 1.
-
-
-.. class:: Thread
- :noindex:
-
- A class that represents a thread of control. This class can be safely
- subclassed in a limited fashion.
-
- See :ref:`thread-objects`.
-
-
-.. class:: Timer
- :noindex:
-
- A thread that executes a function after a specified interval has passed.
-
- See :ref:`timer-objects`.
-
-
.. function:: settrace(func)
.. index:: single: trace function
@@ -174,7 +81,7 @@ This module defines the following functions and objects:
*size* argument specifies the stack size to be used for subsequently created
threads, and must be 0 (use platform or configured default) or a positive
integer value of at least 32,768 (32kB). If changing the thread stack size is
- unsupported, a :exc:`ThreadError` is raised. If the specified stack size is
+ unsupported, a :exc:`RuntimeError` is raised. If the specified stack size is
invalid, a :exc:`ValueError` is raised and the stack size is unmodified. 32kB
is currently the minimum supported stack size value to guarantee sufficient
stack space for the interpreter itself. Note that some platforms may have
@@ -198,7 +105,8 @@ This module also defines the following constant:
.. versionadded:: 3.2
-Detailed interfaces for the objects are documented below.
+This module defines a number of classes, which are detailed in the sections
+below.
The design of this module is loosely based on Java's threading model. However,
where Java makes locks and condition variables basic behavior of every object,
@@ -211,17 +119,38 @@ when implemented, are mapped to module-level functions.
All of the methods described below are executed atomically.
+Thread-Local Data
+-----------------
+
+Thread-local data is data whose values are thread specific. To manage
+thread-local data, just create an instance of :class:`local` (or a
+subclass) and store attributes on it::
+
+ mydata = threading.local()
+ mydata.x = 1
+
+The instance's values will be different for separate threads.
+
+
+.. class:: local()
+
+ A class that represents thread-local data.
+
+ For more details and extensive examples, see the documentation string of the
+ :mod:`_threading_local` module.
+
+
.. _thread-objects:
Thread Objects
--------------
-This class represents an activity that is run in a separate thread of control.
-There are two ways to specify the activity: by passing a callable object to the
-constructor, or by overriding the :meth:`~Thread.run` method in a subclass.
-No other methods (except for the constructor) should be overridden in a
-subclass. In other words, *only* override the :meth:`~Thread.__init__`
-and :meth:`~Thread.run` methods of this class.
+The :class:`Thread` class represents an activity that is run in a separate
+thread of control. There are two ways to specify the activity: by passing a
+callable object to the constructor, or by overriding the :meth:`~Thread.run`
+method in a subclass. No other methods (except for the constructor) should be
+overridden in a subclass. In other words, *only* override the
+:meth:`~Thread.__init__` and :meth:`~Thread.run` methods of this class.
Once a thread object is created, its activity must be started by calling the
thread's :meth:`~Thread.start` method. This invokes the :meth:`~Thread.run`
@@ -239,10 +168,11 @@ called is terminated.
A thread has a name. The name can be passed to the constructor, and read or
changed through the :attr:`~Thread.name` attribute.
-A thread can be flagged as a "daemon thread". The significance of this flag
-is that the entire Python program exits when only daemon threads are left.
-The initial value is inherited from the creating thread. The flag can be
-set through the :attr:`~Thread.daemon` property.
+A thread can be flagged as a "daemon thread". The significance of this flag is
+that the entire Python program exits when only daemon threads are left. The
+initial value is inherited from the creating thread. The flag can be set
+through the :attr:`~Thread.daemon` property or the *daemon* constructor
+argument.
There is a "main thread" object; this corresponds to the initial thread of
control in the Python program. It is not a daemon thread.
@@ -255,7 +185,8 @@ daemonic, and cannot be :meth:`~Thread.join`\ ed. They are never deleted,
since it is impossible to detect the termination of alien threads.
-.. class:: Thread(group=None, target=None, name=None, args=(), kwargs={})
+.. class:: Thread(group=None, target=None, name=None, args=(), kwargs={}, *, \
+ daemon=None)
This constructor should always be called with keyword arguments. Arguments
are:
@@ -274,10 +205,17 @@ since it is impossible to detect the termination of alien threads.
*kwargs* is a dictionary of keyword arguments for the target invocation.
Defaults to ``{}``.
+ If not ``None``, *daemon* explicitly sets whether the thread is daemonic.
+ If ``None`` (the default), the daemonic property is inherited from the
+ current thread.
+
If the subclass overrides the constructor, it must make sure to invoke the
base class constructor (``Thread.__init__()``) before doing anything else to
the thread.
+ .. versionchanged:: 3.3
+ Added the *daemon* argument.
+
.. method:: start()
Start the thread's activity.
@@ -368,6 +306,18 @@ since it is impossible to detect the termination of alien threads.
property instead.
+.. impl-detail::
+
+ Due to the :term:`Global Interpreter Lock`, in CPython only one thread
+ can execute Python code at once (even though certain performance-oriented
+ libraries might overcome this limitation).
+ If you want your application to make better of use of the computational
+ resources of multi-core machines, you are advised to use
+ :mod:`multiprocessing` or :class:`concurrent.futures.ProcessPoolExecutor`.
+ However, threading is still an appropriate model if you want to run
+ multiple I/O-bound tasks simultaneously.
+
+
.. _lock-objects:
Lock Objects
@@ -399,45 +349,55 @@ is not defined, and may vary across implementations.
All methods are executed atomically.
-.. method:: Lock.acquire(blocking=True, timeout=-1)
+.. class:: Lock()
+
+ The class implementing primitive lock objects. Once a thread has acquired a
+ lock, subsequent attempts to acquire it block, until it is released; any
+ thread may release it.
+
+ .. versionchanged:: 3.3
+ Changed from a factory function to a class.
+
- Acquire a lock, blocking or non-blocking.
+ .. method:: acquire(blocking=True, timeout=-1)
- When invoked with the *blocking* argument set to ``True`` (the default),
- block until the lock is unlocked, then set it to locked and return ``True``.
+ Acquire a lock, blocking or non-blocking.
- When invoked with the *blocking* argument set to ``False``, do not block.
- If a call with *blocking* set to ``True`` would block, return ``False``
- immediately; otherwise, set the lock to locked and return ``True``.
+ When invoked with the *blocking* argument set to ``True`` (the default),
+ block until the lock is unlocked, then set it to locked and return ``True``.
- When invoked with the floating-point *timeout* argument set to a positive
- value, block for at most the number of seconds specified by *timeout*
- and as long as the lock cannot be acquired. A negative *timeout* argument
- specifies an unbounded wait. It is forbidden to specify a *timeout*
- when *blocking* is false.
+ When invoked with the *blocking* argument set to ``False``, do not block.
+ If a call with *blocking* set to ``True`` would block, return ``False``
+ immediately; otherwise, set the lock to locked and return ``True``.
- The return value is ``True`` if the lock is acquired successfully,
- ``False`` if not (for example if the *timeout* expired).
+ When invoked with the floating-point *timeout* argument set to a positive
+ value, block for at most the number of seconds specified by *timeout*
+ and as long as the lock cannot be acquired. A negative *timeout* argument
+ specifies an unbounded wait. It is forbidden to specify a *timeout*
+ when *blocking* is false.
- .. versionchanged:: 3.2
- The *timeout* parameter is new.
+ The return value is ``True`` if the lock is acquired successfully,
+ ``False`` if not (for example if the *timeout* expired).
- .. versionchanged:: 3.2
- Lock acquires can now be interrupted by signals on POSIX.
+ .. versionchanged:: 3.2
+ The *timeout* parameter is new.
+
+ .. versionchanged:: 3.2
+ Lock acquires can now be interrupted by signals on POSIX.
-.. method:: Lock.release()
+ .. method:: release()
- Release a lock. This can be called from any thread, not only the thread
- which has acquired the lock.
+ Release a lock. This can be called from any thread, not only the thread
+ which has acquired the lock.
- When the lock is locked, reset it to unlocked, and return. If any other threads
- are blocked waiting for the lock to become unlocked, allow exactly one of them
- to proceed.
+ When the lock is locked, reset it to unlocked, and return. If any other threads
+ are blocked waiting for the lock to become unlocked, allow exactly one of them
+ to proceed.
- When invoked on an unlocked lock, a :exc:`ThreadError` is raised.
+ When invoked on an unlocked lock, a :exc:`RuntimeError` is raised.
- There is no return value.
+ There is no return value.
.. _rlock-objects:
@@ -461,47 +421,59 @@ allows another thread blocked in :meth:`~Lock.acquire` to proceed.
Reentrant locks also support the :ref:`context manager protocol <with-locks>`.
-.. method:: RLock.acquire(blocking=True, timeout=-1)
+.. class:: RLock()
- Acquire a lock, blocking or non-blocking.
+ This class implements reentrant lock objects. A reentrant lock must be
+ released by the thread that acquired it. Once a thread has acquired a
+ reentrant lock, the same thread may acquire it again without blocking; the
+ thread must release it once for each time it has acquired it.
- When invoked without arguments: if this thread already owns the lock, increment
- the recursion level by one, and return immediately. Otherwise, if another
- thread owns the lock, block until the lock is unlocked. Once the lock is
- unlocked (not owned by any thread), then grab ownership, set the recursion level
- to one, and return. If more than one thread is blocked waiting until the lock
- is unlocked, only one at a time will be able to grab ownership of the lock.
- There is no return value in this case.
+ Note that ``RLock`` is actually a factory function which returns an instance
+ of the most efficient version of the concrete RLock class that is supported
+ by the platform.
- When invoked with the *blocking* argument set to true, do the same thing as when
- called without arguments, and return true.
- When invoked with the *blocking* argument set to false, do not block. If a call
- without an argument would block, return false immediately; otherwise, do the
- same thing as when called without arguments, and return true.
+ .. method:: acquire(blocking=True, timeout=-1)
- When invoked with the floating-point *timeout* argument set to a positive
- value, block for at most the number of seconds specified by *timeout*
- and as long as the lock cannot be acquired. Return true if the lock has
- been acquired, false if the timeout has elapsed.
+ Acquire a lock, blocking or non-blocking.
- .. versionchanged:: 3.2
- The *timeout* parameter is new.
+ When invoked without arguments: if this thread already owns the lock, increment
+ the recursion level by one, and return immediately. Otherwise, if another
+ thread owns the lock, block until the lock is unlocked. Once the lock is
+ unlocked (not owned by any thread), then grab ownership, set the recursion level
+ to one, and return. If more than one thread is blocked waiting until the lock
+ is unlocked, only one at a time will be able to grab ownership of the lock.
+ There is no return value in this case.
+ When invoked with the *blocking* argument set to true, do the same thing as when
+ called without arguments, and return true.
-.. method:: RLock.release()
+ When invoked with the *blocking* argument set to false, do not block. If a call
+ without an argument would block, return false immediately; otherwise, do the
+ same thing as when called without arguments, and return true.
- Release a lock, decrementing the recursion level. If after the decrement it is
- zero, reset the lock to unlocked (not owned by any thread), and if any other
- threads are blocked waiting for the lock to become unlocked, allow exactly one
- of them to proceed. If after the decrement the recursion level is still
- nonzero, the lock remains locked and owned by the calling thread.
+ When invoked with the floating-point *timeout* argument set to a positive
+ value, block for at most the number of seconds specified by *timeout*
+ and as long as the lock cannot be acquired. Return true if the lock has
+ been acquired, false if the timeout has elapsed.
- Only call this method when the calling thread owns the lock. A
- :exc:`RuntimeError` is raised if this method is called when the lock is
- unlocked.
+ .. versionchanged:: 3.2
+ The *timeout* parameter is new.
+
+
+ .. method:: release()
- There is no return value.
+ Release a lock, decrementing the recursion level. If after the decrement it is
+ zero, reset the lock to unlocked (not owned by any thread), and if any other
+ threads are blocked waiting for the lock to become unlocked, allow exactly one
+ of them to proceed. If after the decrement the recursion level is still
+ nonzero, the lock remains locked and owned by the calling thread.
+
+ Only call this method when the calling thread owns the lock. A
+ :exc:`RuntimeError` is raised if this method is called when the lock is
+ unlocked.
+
+ There is no return value.
.. _condition-objects:
@@ -536,10 +508,6 @@ not return from their :meth:`~Condition.wait` call immediately, but only when
the thread that called :meth:`~Condition.notify` or :meth:`~Condition.notify_all`
finally relinquishes ownership of the lock.
-
-Usage
-^^^^^
-
The typical programming style using condition variables uses the lock to
synchronize access to some shared state; threads that are interested in a
particular change of state call :meth:`~Condition.wait` repeatedly until they
@@ -578,15 +546,18 @@ waiting threads. E.g. in a typical producer-consumer situation, adding one
item to the buffer only needs to wake up one consumer thread.
-Interface
-^^^^^^^^^
-
.. class:: Condition(lock=None)
+ This class implements condition variable objects. A condition variable
+ allows one or more threads to wait until they are notified by another thread.
+
If the *lock* argument is given and not ``None``, it must be a :class:`Lock`
or :class:`RLock` object, and it is used as the underlying lock. Otherwise,
a new :class:`RLock` object is created and used as the underlying lock.
+ .. versionchanged:: 3.3
+ changed from a factory function to a class.
+
.. method:: acquire(*args)
Acquire the underlying lock. This method calls the corresponding method on
@@ -696,10 +667,19 @@ Semaphores also support the :ref:`context manager protocol <with-locks>`.
.. class:: Semaphore(value=1)
+ This class implements semaphore objects. A semaphore manages a counter
+ representing the number of :meth:`release` calls minus the number of
+ :meth:`acquire` calls, plus an initial value. The :meth:`acquire` method
+ blocks if necessary until it can return without making the counter negative.
+ If not given, *value* defaults to 1.
+
The optional argument gives the initial *value* for the internal counter; it
defaults to ``1``. If the *value* given is less than 0, :exc:`ValueError` is
raised.
+ .. versionchanged:: 3.3
+ changed from a factory function to a class.
+
.. method:: acquire(blocking=True, timeout=None)
Acquire a semaphore.
@@ -732,6 +712,18 @@ Semaphores also support the :ref:`context manager protocol <with-locks>`.
than zero again, wake up that thread.
+.. class:: BoundedSemaphore(value=1)
+
+ Class implementing bounded semaphore objects. A bounded semaphore checks to
+ make sure its current value doesn't exceed its initial value. If it does,
+ :exc:`ValueError` is raised. In most situations semaphores are used to guard
+ resources with limited capacity. If the semaphore is released too many times
+ it's a sign of a bug. If not given, *value* defaults to 1.
+
+ .. versionchanged:: 3.3
+ changed from a factory function to a class.
+
+
.. _semaphore-examples:
:class:`Semaphore` Example
@@ -743,7 +735,7 @@ you should use a bounded semaphore. Before spawning any worker threads, your
main thread would initialize the semaphore::
maxconnections = 5
- ...
+ # ...
pool_sema = BoundedSemaphore(value=maxconnections)
Once spawned, worker threads call the semaphore's acquire and release methods
@@ -752,7 +744,7 @@ when they need to connect to the server::
with pool_sema:
conn = connectdb()
try:
- ... use connection ...
+ # ... use connection ...
finally:
conn.close()
@@ -775,7 +767,13 @@ method. The :meth:`~Event.wait` method blocks until the flag is true.
.. class:: Event()
- The internal flag is initially false.
+ Class implementing event objects. An event manages a flag that can be set to
+ true with the :meth:`~Event.set` method and reset to false with the
+ :meth:`clear` method. The :meth:`wait` method blocks until the flag is true.
+ The flag is initially false.
+
+ .. versionchanged:: 3.3
+ changed from a factory function to a class.
.. method:: is_set()
@@ -840,6 +838,9 @@ For example::
Create a timer that will run *function* with arguments *args* and keyword
arguments *kwargs*, after *interval* seconds have passed.
+ .. versionchanged:: 3.3
+ changed from a factory function to a class.
+
.. method:: cancel()
Stop the timer, and cancel the execution of the timer's action. This will
@@ -973,27 +974,3 @@ is equivalent to::
Currently, :class:`Lock`, :class:`RLock`, :class:`Condition`,
:class:`Semaphore`, and :class:`BoundedSemaphore` objects may be used as
:keyword:`with` statement context managers.
-
-
-.. _threaded-imports:
-
-Importing in threaded code
---------------------------
-
-While the import machinery is thread-safe, there are two key restrictions on
-threaded imports due to inherent limitations in the way that thread-safety is
-provided:
-
-* Firstly, other than in the main module, an import should not have the
- side effect of spawning a new thread and then waiting for that thread in
- any way. Failing to abide by this restriction can lead to a deadlock if
- the spawned thread directly or indirectly attempts to import a module.
-* Secondly, all import attempts must be completed before the interpreter
- starts shutting itself down. This can be most easily achieved by only
- performing imports from non-daemon threads created through the threading
- module. Daemon threads and threads created directly with the thread
- module will require some other form of synchronization to ensure they do
- not attempt imports after system shutdown has commenced. Failure to
- abide by this restriction will lead to intermittent exceptions and
- crashes during interpreter shutdown (as the late imports attempt to
- access machinery which is no longer in a valid state).
diff --git a/Doc/library/time.rst b/Doc/library/time.rst
index e0c7007..d7d8230 100644
--- a/Doc/library/time.rst
+++ b/Doc/library/time.rst
@@ -41,25 +41,6 @@ An explanation of some terminology and conventions is in order.
parsed, they are converted according to the POSIX and ISO C standards: values
69--99 are mapped to 1969--1999, and values 0--68 are mapped to 2000--2068.
- For backward compatibility, years with less than 4 digits are treated
- specially by :func:`asctime`, :func:`mktime`, and :func:`strftime` functions
- that operate on a 9-tuple or :class:`struct_time` values. If year (the first
- value in the 9-tuple) is specified with less than 4 digits, its interpretation
- depends on the value of ``accept2dyear`` variable.
-
- If ``accept2dyear`` is true (default), a backward compatibility behavior is
- invoked as follows:
-
- - for 2-digit year, century is guessed according to POSIX rules for
- ``%y`` strptime format. A deprecation warning is issued when century
- information is guessed in this way.
-
- - for 3-digit or negative year, a :exc:`ValueError` exception is raised.
-
- If ``accept2dyear`` is false (set by the program or as a result of a
- non-empty value assigned to ``PYTHONY2K`` environment variable) all year
- values are interpreted as given.
-
.. index::
single: UTC
single: Coordinated Universal Time
@@ -96,6 +77,11 @@ An explanation of some terminology and conventions is in order.
See :class:`struct_time` for a description of these objects.
+ .. versionchanged:: 3.3
+ The :class:`struct_time` type was extended to provide the :attr:`tm_gmtoff`
+ and :attr:`tm_zone` attributes when platform supports corresponding
+ ``struct tm`` members.
+
* Use the following functions to convert between time representations:
+-------------------------+-------------------------+-------------------------+
@@ -117,24 +103,6 @@ An explanation of some terminology and conventions is in order.
The module defines the following functions and data items:
-
-.. data:: accept2dyear
-
- Boolean value indicating whether two-digit year values will be
- mapped to 1969--2068 range by :func:`asctime`, :func:`mktime`, and
- :func:`strftime` functions. This is true by default, but will be
- set to false if the environment variable :envvar:`PYTHONY2K` has
- been set to a non-empty string. It may also be modified at run
- time.
-
- .. deprecated:: 3.2
- Mapping of 2-digit year values by :func:`asctime`,
- :func:`mktime`, and :func:`strftime` functions to 1969--2068
- range is deprecated. Programs that need to process 2-digit
- years should use ``%y`` code available in :func:`strptime`
- function or convert 2-digit year values to 4-digit themselves.
-
-
.. data:: altzone
The offset of the local DST timezone, in seconds west of UTC, if one is defined.
@@ -152,7 +120,8 @@ The module defines the following functions and data items:
.. note::
- Unlike the C function of the same name, there is no trailing newline.
+ Unlike the C function of the same name, :func:`asctime` does not add a
+ trailing newline.
.. function:: clock()
@@ -172,6 +141,97 @@ The module defines the following functions and data items:
:c:func:`QueryPerformanceCounter`. The resolution is typically better than one
microsecond.
+ .. deprecated:: 3.3
+ The behaviour of this function depends on the platform: use
+ :func:`perf_counter` or :func:`process_time` instead, depending on your
+ requirements, to have a well defined behaviour.
+
+
+.. function:: clock_getres(clk_id)
+
+ Return the resolution (precision) of the specified clock *clk_id*.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: clock_gettime(clk_id)
+
+ Return the time of the specified clock *clk_id*.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. function:: clock_settime(clk_id, time)
+
+ Set the time of the specified clock *clk_id*.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_HIGHRES
+
+ The Solaris OS has a CLOCK_HIGHRES timer that attempts to use an optimal
+ hardware source, and may give close to nanosecond resolution. CLOCK_HIGHRES
+ is the nonadjustable, high-resolution clock.
+
+ Availability: Solaris.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_MONOTONIC
+
+ Clock that cannot be set and represents monotonic time since some unspecified
+ starting point.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_MONOTONIC_RAW
+
+ Similar to :data:`CLOCK_MONOTONIC`, but provides access to a raw
+ hardware-based time that is not subject to NTP adjustments.
+
+ Availability: Linux 2.6.28 or later.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_PROCESS_CPUTIME_ID
+
+ High-resolution per-process timer from the CPU.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_REALTIME
+
+ System-wide real-time clock. Setting this clock requires appropriate
+ privileges.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
+
+.. data:: CLOCK_THREAD_CPUTIME_ID
+
+ Thread-specific CPU-time clock.
+
+ Availability: Unix.
+
+ .. versionadded:: 3.3
+
.. function:: ctime([secs])
@@ -186,6 +246,31 @@ The module defines the following functions and data items:
Nonzero if a DST timezone is defined.
+.. function:: get_clock_info(name)
+
+ Get information on the specified clock as a namespace object.
+ Supported clock names and the corresponding functions to read their value
+ are:
+
+ * ``'clock'``: :func:`time.clock`
+ * ``'monotonic'``: :func:`time.monotonic`
+ * ``'perf_counter'``: :func:`time.perf_counter`
+ * ``'process_time'``: :func:`time.process_time`
+ * ``'time'``: :func:`time.time`
+
+ The result has the following attributes:
+
+ - *adjustable*: ``True`` if the clock can be changed automatically (e.g. by
+ a NTP daemon) or manually by the system administrator, ``False`` otherwise
+ - *implementation*: The name of the underlying C function used to get
+ the clock value
+ - *monotonic*: ``True`` if the clock cannot go backward,
+ ``False`` otherwise
+ - *resolution*: The resolution of the clock in seconds (:class:`float`)
+
+ .. versionadded:: 3.3
+
+
.. function:: gmtime([secs])
Convert a time expressed in seconds since the epoch to a :class:`struct_time` in
@@ -215,6 +300,47 @@ The module defines the following functions and data items:
The earliest date for which it can generate a time is platform-dependent.
+.. function:: monotonic()
+
+ Return the value (in fractional seconds) of a monotonic clock, i.e. a clock
+ that cannot go backwards. The clock is not affected by system clock updates.
+ The reference point of the returned value is undefined, so that only the
+ difference between the results of consecutive calls is valid.
+
+ On Windows versions older than Vista, :func:`monotonic` detects
+ :c:func:`GetTickCount` integer overflow (32 bits, roll-over after 49.7 days).
+ It increases an internal epoch (reference time) by 2\ :sup:`32` each time
+ that an overflow is detected. The epoch is stored in the process-local state
+ and so the value of :func:`monotonic` may be different in two Python
+ processes running for more than 49 days. On more recent versions of Windows
+ and on other operating systems, :func:`monotonic` is system-wide.
+
+ Availability: Windows, Mac OS X, Linux, FreeBSD, OpenBSD, Solaris.
+
+ .. versionadded:: 3.3
+
+
+.. function:: perf_counter()
+
+ Return the value (in fractional seconds) of a performance counter, i.e. a
+ clock with the highest available resolution to measure a short duration. It
+ does include time elapsed during sleep and is system-wide. The reference
+ point of the returned value is undefined, so that only the difference between
+ the results of consecutive calls is valid.
+
+ .. versionadded:: 3.3
+
+
+.. function:: process_time()
+
+ Return the value (in fractional seconds) of the sum of the system and user
+ CPU time of the current process. It does not include time elapsed during
+ sleep. It is process-wide by definition. The reference point of the
+ returned value is undefined, so that only the difference between the results
+ of consecutive calls is valid.
+
+ .. versionadded:: 3.3
+
.. function:: sleep(secs)
Suspend execution for the given number of seconds. The argument may be a
@@ -308,9 +434,15 @@ The module defines the following functions and data items:
| ``%y`` | Year without century as a decimal number | |
| | [00,99]. | |
+-----------+------------------------------------------------+-------+
- | ``%Y`` | Year with century as a decimal number. | \(4) |
+ | ``%Y`` | Year with century as a decimal number. | |
| | | |
+-----------+------------------------------------------------+-------+
+ | ``%z`` | Time zone offset indicating a positive or | |
+ | | negative time difference from UTC/GMT of the | |
+ | | form +HHMM or -HHMM, where H represents decimal| |
+ | | hour digits and M represents decimal minute | |
+ | | digits [-23:59, +23:59]. | |
+ +-----------+------------------------------------------------+-------+
| ``%Z`` | Time zone name (no characters if no time zone | |
| | exists). | |
+-----------+------------------------------------------------+-------+
@@ -332,12 +464,6 @@ The module defines the following functions and data items:
When used with the :func:`strptime` function, ``%U`` and ``%W`` are only used in
calculations when the day of the week and the year are specified.
- (4)
- Produces different results depending on the value of
- ``time.accept2dyear`` variable. See :ref:`Year 2000 (Y2K)
- issues <time-y2kissues>` for details.
-
-
Here is an example, a format for dates compatible with that specified in the
:rfc:`2822` Internet email standard. [#]_ ::
@@ -416,10 +542,13 @@ The module defines the following functions and data items:
+-------+-------------------+---------------------------------+
| 8 | :attr:`tm_isdst` | 0, 1 or -1; see below |
+-------+-------------------+---------------------------------+
+ | N/A | :attr:`tm_zone` | abbreviation of timezone name |
+ +-------+-------------------+---------------------------------+
+ | N/A | :attr:`tm_gmtoff` | offset east of UTC in seconds |
+ +-------+-------------------+---------------------------------+
Note that unlike the C structure, the month value is a range of [1, 12], not
- [0, 11]. A year value will be handled as described under :ref:`Year 2000
- (Y2K) issues <time-y2kissues>` above. A ``-1`` argument as the daylight
+ [0, 11]. A ``-1`` argument as the daylight
savings flag, passed to :func:`mktime` will usually result in the correct
daylight savings state to be filled in.
@@ -427,6 +556,9 @@ The module defines the following functions and data items:
:class:`struct_time`, or having elements of the wrong type, a
:exc:`TypeError` is raised.
+ .. versionchanged:: 3.3
+ :attr:`tm_gmtoff` and :attr:`tm_zone` attributes are available on platforms
+ with C library supporting the corresponding fields in ``struct tm``.
.. function:: time()
@@ -437,7 +569,6 @@ The module defines the following functions and data items:
lower value than a previous call if the system clock has been set back between
the two calls.
-
.. data:: timezone
The offset of the local (non-DST) timezone, in seconds west of UTC (negative in
diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst
index a3ec66f..a487917 100644
--- a/Doc/library/timeit.rst
+++ b/Doc/library/timeit.rst
@@ -73,13 +73,10 @@ The module defines three convenience functions and a public class:
.. function:: default_timer()
- Define a default timer, in a platform-specific manner. On Windows,
- :func:`time.clock` has microsecond granularity, but :func:`time.time`'s
- granularity is 1/60th of a second. On Unix, :func:`time.clock` has 1/100th of
- a second granularity, and :func:`time.time` is much more precise. On either
- platform, :func:`default_timer` measures wall clock time, not the CPU
- time. This means that other processes running on the same computer may
- interfere with the timing.
+ The default timer, which is always :func:`time.perf_counter`.
+
+ .. versionchanged:: 3.3
+ :func:`time.perf_counter` is now the default timer.
.. class:: Timer(stmt='pass', setup='pass', timer=<timer function>)
@@ -187,13 +184,20 @@ Where the following options are understood:
statement to be executed once initially (default ``pass``)
+.. cmdoption:: -p, --process
+
+ measure process time, not wallclock time, using :func:`time.process_time`
+ instead of :func:`time.perf_counter`, which is the default
+
+ .. versionadded:: 3.3
+
.. cmdoption:: -t, --time
- use :func:`time.time` (default on all platforms but Windows)
+ use :func:`time.time` (deprecated)
.. cmdoption:: -c, --clock
- use :func:`time.clock` (default on Windows)
+ use :func:`time.clock` (deprecated)
.. cmdoption:: -v, --verbose
@@ -211,12 +215,11 @@ similarly.
If :option:`-n` is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
-:func:`default_timer` measurations can be affected by other programs running on
-the same machine, so
-the best thing to do when accurate timing is necessary is to repeat
-the timing a few times and use the best time. The :option:`-r` option is good
-for this; the default of 3 repetitions is probably enough in most cases. On
-Unix, you can use :func:`time.clock` to measure CPU time.
+:func:`default_timer` measurements can be affected by other programs running on
+the same machine, so the best thing to do when accurate timing is necessary is
+to repeat the timing a few times and use the best time. The :option:`-r`
+option is good for this; the default of 3 repetitions is probably enough in
+most cases. You can use :func:`time.process_time` to measure CPU time.
.. note::
diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst
index f6e095a..83a5375 100644
--- a/Doc/library/tkinter.rst
+++ b/Doc/library/tkinter.rst
@@ -194,35 +194,30 @@ A Simple Hello World Program
::
- from tkinter import *
-
- class Application(Frame):
- def say_hi(self):
- print("hi there, everyone!")
-
- def createWidgets(self):
- self.QUIT = Button(self)
- self.QUIT["text"] = "QUIT"
- self.QUIT["fg"] = "red"
- self.QUIT["command"] = self.quit
+ import tkinter as tk
- self.QUIT.pack({"side": "left"})
+ class Application(tk.Frame):
+ def __init__(self, master=None):
+ tk.Frame.__init__(self, master)
+ self.pack()
+ self.createWidgets()
- self.hi_there = Button(self)
- self.hi_there["text"] = "Hello",
- self.hi_there["command"] = self.say_hi
+ def createWidgets(self):
+ self.hi_there = tk.Button(self)
+ self.hi_there["text"] = "Hello World\n(click me)"
+ self.hi_there["command"] = self.say_hi
+ self.hi_there.pack(side="top")
- self.hi_there.pack({"side": "left"})
+ self.QUIT = tk.Button(self, text="QUIT", fg="red",
+ command=root.destroy)
+ self.QUIT.pack(side="bottom")
- def __init__(self, master=None):
- Frame.__init__(self, master)
- self.pack()
- self.createWidgets()
+ def say_hi(self):
+ print("hi there, everyone!")
- root = Tk()
- app = Application(master=root)
- app.mainloop()
- root.destroy()
+ root = tk.Tk()
+ app = Application(master=root)
+ app.mainloop()
A (Very) Quick Look at Tcl/Tk
@@ -755,22 +750,32 @@ Entry widget indexes (index, view index, etc.)
displayed. You can use these :mod:`tkinter` functions to access these special
points in text widgets:
- AtEnd()
+.. function:: AtEnd()
refers to the last position in the text
- AtInsert()
+ .. deprecated:: 3.3
+
+.. function:: AtInsert()
refers to the point where the text cursor is
- AtSelFirst()
+ .. deprecated:: 3.3
+
+.. function:: AtSelFirst()
indicates the beginning point of the selected text
- AtSelLast()
+ .. deprecated:: 3.3
+
+.. function:: AtSelLast()
denotes the last point of the selected text and finally
- At(x[, y])
+ .. deprecated:: 3.3
+
+.. function:: At(x[, y])
refers to the character at pixel location *x*, *y* (with *y* not used in the
case of a text entry widget, which contains a single line of text).
+ .. deprecated:: 3.3
+
Text widget indexes
The index notation for Text widgets is very rich and is best described in the Tk
man pages.
@@ -818,4 +823,3 @@ some widget (e.g. labels, buttons, menus). In these cases, Tk will not keep a
reference to the image. When the last Python reference to the image object is
deleted, the image data is deleted as well, and Tk will display an empty box
wherever the image was used.
-
diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst
index 70919ca..37d9f41 100644
--- a/Doc/library/tokenize.rst
+++ b/Doc/library/tokenize.rst
@@ -17,9 +17,11 @@ colorizers for on-screen displays.
To simplify token stream handling, all :ref:`operators` and :ref:`delimiters`
tokens are returned using the generic :data:`token.OP` token type. The exact
-type can be determined by checking the token ``string`` field on the
-:term:`named tuple` returned from :func:`tokenize.tokenize` for the character
-sequence that identifies a specific operator token.
+type can be determined by checking the ``exact_type`` property on the
+:term:`named tuple` returned from :func:`tokenize.tokenize`.
+
+Tokenizing Input
+----------------
The primary entry point is a :term:`generator`:
@@ -39,9 +41,17 @@ The primary entry point is a :term:`generator`:
returned as a :term:`named tuple` with the field names:
``type string start end line``.
+ The returned :term:`named tuple` has a additional property named
+ ``exact_type`` that contains the exact operator type for
+ :data:`token.OP` tokens. For all other token types ``exact_type``
+ equals the named tuple ``type`` field.
+
.. versionchanged:: 3.1
Added support for named tuples.
+ .. versionchanged:: 3.3
+ Added support for ``exact_type``.
+
:func:`tokenize` determines the source encoding of the file by looking for a
UTF-8 BOM or encoding cookie, according to :pep:`263`.
@@ -122,6 +132,38 @@ function it uses to do this is available:
.. versionadded:: 3.2
+.. _tokenize-cli:
+
+Command-Line Usage
+------------------
+
+.. versionadded:: 3.3
+
+The :mod:`tokenize` module can be executed as a script from the command line.
+It is as simple as:
+
+.. code-block:: sh
+
+ python -m tokenize [-e] [filename.py]
+
+The following options are accepted:
+
+.. program:: tokenize
+
+.. cmdoption:: -h, --help
+
+ show this help message and exit
+
+.. cmdoption:: -e, --exact
+
+ display token names using the exact type
+
+If :file:`filename.py` is specified its contents are tokenized to stdout.
+Otherwise, tokenization is performed on stdin.
+
+Examples
+------------------
+
Example of a script rewriter that transforms float literals into Decimal
objects::
@@ -164,3 +206,63 @@ objects::
result.append((toknum, tokval))
return untokenize(result).decode('utf-8')
+Example of tokenizing from the command line. The script::
+
+ def say_hello():
+ print("Hello, World!")
+
+ say_hello()
+
+will be tokenized to the following output where the first column is the range
+of the line/column coordinates where the token is found, the second column is
+the name of the token, and the final column is the value of the token (if any)
+
+.. code-block:: sh
+
+ $ python -m tokenize hello.py
+ 0,0-0,0: ENCODING 'utf-8'
+ 1,0-1,3: NAME 'def'
+ 1,4-1,13: NAME 'say_hello'
+ 1,13-1,14: OP '('
+ 1,14-1,15: OP ')'
+ 1,15-1,16: OP ':'
+ 1,16-1,17: NEWLINE '\n'
+ 2,0-2,4: INDENT ' '
+ 2,4-2,9: NAME 'print'
+ 2,9-2,10: OP '('
+ 2,10-2,25: STRING '"Hello, World!"'
+ 2,25-2,26: OP ')'
+ 2,26-2,27: NEWLINE '\n'
+ 3,0-3,1: NL '\n'
+ 4,0-4,0: DEDENT ''
+ 4,0-4,9: NAME 'say_hello'
+ 4,9-4,10: OP '('
+ 4,10-4,11: OP ')'
+ 4,11-4,12: NEWLINE '\n'
+ 5,0-5,0: ENDMARKER ''
+
+The exact token type names can be displayed using the ``-e`` option:
+
+.. code-block:: sh
+
+ $ python -m tokenize -e hello.py
+ 0,0-0,0: ENCODING 'utf-8'
+ 1,0-1,3: NAME 'def'
+ 1,4-1,13: NAME 'say_hello'
+ 1,13-1,14: LPAR '('
+ 1,14-1,15: RPAR ')'
+ 1,15-1,16: COLON ':'
+ 1,16-1,17: NEWLINE '\n'
+ 2,0-2,4: INDENT ' '
+ 2,4-2,9: NAME 'print'
+ 2,9-2,10: LPAR '('
+ 2,10-2,25: STRING '"Hello, World!"'
+ 2,25-2,26: RPAR ')'
+ 2,26-2,27: NEWLINE '\n'
+ 3,0-3,1: NL '\n'
+ 4,0-4,0: DEDENT ''
+ 4,0-4,9: NAME 'say_hello'
+ 4,9-4,10: LPAR '('
+ 4,10-4,11: RPAR ')'
+ 4,11-4,12: NEWLINE '\n'
+ 5,0-5,0: ENDMARKER ''
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index d4a76b6..695480f 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -1,5 +1,5 @@
-:mod:`types` --- Names for built-in types
-=========================================
+:mod:`types` --- Dynamic type creation and names for built-in types
+===================================================================
.. module:: types
:synopsis: Names for built-in types.
@@ -8,20 +8,77 @@
--------------
-This module defines names for some object types that are used by the standard
+This module defines utility function to assist in dynamic creation of
+new types.
+
+It also defines names for some object types that are used by the standard
Python interpreter, but not exposed as builtins like :class:`int` or
-:class:`str` are. Also, it does not include some of the types that arise
-transparently during processing such as the ``listiterator`` type.
+:class:`str` are.
+
+
+Dynamic Type Creation
+---------------------
+
+.. function:: new_class(name, bases=(), kwds=None, exec_body=None)
+
+ Creates a class object dynamically using the appropriate metaclass.
+
+ The first three arguments are the components that make up a class
+ definition header: the class name, the base classes (in order), the
+ keyword arguments (such as ``metaclass``).
+
+ The *exec_body* argument is a callback that is used to populate the
+ freshly created class namespace. It should accept the class namespace
+ as its sole argument and update the namespace directly with the class
+ contents. If no callback is provided, it has the same effect as passing
+ in ``lambda ns: ns``.
+
+ .. versionadded:: 3.3
+
+.. function:: prepare_class(name, bases=(), kwds=None)
+
+ Calculates the appropriate metaclass and creates the class namespace.
+
+ The arguments are the components that make up a class definition header:
+ the class name, the base classes (in order) and the keyword arguments
+ (such as ``metaclass``).
+
+ The return value is a 3-tuple: ``metaclass, namespace, kwds``
+
+ *metaclass* is the appropriate metaclass, *namespace* is the
+ prepared class namespace and *kwds* is an updated copy of the passed
+ in *kwds* argument with any ``'metaclass'`` entry removed. If no *kwds*
+ argument is passed in, this will be an empty dict.
-Typical use is for :func:`isinstance` or :func:`issubclass` checks.
+ .. versionadded:: 3.3
-The module defines the following names:
+.. seealso::
+
+ :ref:`metaclasses`
+ Full details of the class creation process supported by these functions
+
+ :pep:`3115` - Metaclasses in Python 3000
+ Introduced the ``__prepare__`` namespace hook
+
+
+Standard Interpreter Types
+--------------------------
+
+This module provides names for many of the types that are required to
+implement a Python interpreter. It deliberately avoids including some of
+the types that arise only incidentally during processing such as the
+``listiterator`` type.
+
+Typical use of these names is for :func:`isinstance` or
+:func:`issubclass` checks.
+
+Standard names are defined for the following types:
.. data:: FunctionType
LambdaType
- The type of user-defined functions and functions created by :keyword:`lambda`
- expressions.
+ The type of user-defined functions and functions created by
+ :keyword:`lambda` expressions.
.. data:: GeneratorType
@@ -85,3 +142,79 @@ The module defines the following names:
In other implementations of Python, this type may be identical to
``GetSetDescriptorType``.
+
+.. class:: MappingProxyType(mapping)
+
+ Read-only proxy of a mapping. It provides a dynamic view on the mapping's
+ entries, which means that when the mapping changes, the view reflects these
+ changes.
+
+ .. versionadded:: 3.3
+
+ .. describe:: key in proxy
+
+ Return ``True`` if the underlying mapping has a key *key*, else
+ ``False``.
+
+ .. describe:: proxy[key]
+
+ Return the item of the underlying mapping with key *key*. Raises a
+ :exc:`KeyError` if *key* is not in the underlying mapping.
+
+ .. describe:: iter(proxy)
+
+ Return an iterator over the keys of the underlying mapping. This is a
+ shortcut for ``iter(proxy.keys())``.
+
+ .. describe:: len(proxy)
+
+ Return the number of items in the underlying mapping.
+
+ .. method:: copy()
+
+ Return a shallow copy of the underlying mapping.
+
+ .. method:: get(key[, default])
+
+ Return the value for *key* if *key* is in the underlying mapping, else
+ *default*. If *default* is not given, it defaults to ``None``, so that
+ this method never raises a :exc:`KeyError`.
+
+ .. method:: items()
+
+ Return a new view of the underlying mapping's items (``(key, value)``
+ pairs).
+
+ .. method:: keys()
+
+ Return a new view of the underlying mapping's keys.
+
+ .. method:: values()
+
+ Return a new view of the underlying mapping's values.
+
+
+.. class:: SimpleNamespace
+
+ A simple :class:`object` subclass that provides attribute access to its
+ namespace, as well as a meaningful repr.
+
+ Unlike :class:`object`, with ``SimpleNamespace`` you can add and remove
+ attributes. If a ``SimpleNamespace`` object is initialized with keyword
+ arguments, those are directly added to the underlying namespace.
+
+ The type is roughly equivalent to the following code::
+
+ class SimpleNamespace:
+ def __init__(self, **kwargs):
+ self.__dict__.update(kwargs)
+ def __repr__(self):
+ keys = sorted(self.__dict__)
+ items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
+ return "{}({})".format(type(self).__name__, ", ".join(items))
+
+ ``SimpleNamespace`` may be useful as a replacement for ``class NS: pass``.
+ However, for a structured record type use :func:`~collections.namedtuple`
+ instead.
+
+ .. versionadded:: 3.3
diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst
index 3b1bbe0..3787c36 100644
--- a/Doc/library/unicodedata.rst
+++ b/Doc/library/unicodedata.rst
@@ -15,8 +15,8 @@
This module provides access to the Unicode Character Database (UCD) which
defines character properties for all Unicode characters. The data contained in
-this database is compiled from the `UCD version 6.0.0
-<http://www.unicode.org/Public/6.0.0/ucd>`_.
+this database is compiled from the `UCD version 6.1.0
+<http://www.unicode.org/Public/6.1.0/ucd>`_.
The module uses the same names and symbols as defined by Unicode
Standard Annex #44, `"Unicode Character Database"
@@ -29,6 +29,9 @@ following functions:
Look up character by name. If a character with the given name is found, return
the corresponding character. If not found, :exc:`KeyError` is raised.
+ .. versionchanged:: 3.3
+ Support for name aliases [#]_ and named sequences [#]_ has been added.
+
.. function:: name(chr[, default])
@@ -160,3 +163,9 @@ Examples:
>>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber
'AN'
+
+.. rubric:: Footnotes
+
+.. [#] http://www.unicode.org/Public/6.1.0/ucd/NameAliases.txt
+
+.. [#] http://www.unicode.org/Public/6.1.0/ucd/NamedSequences.txt
diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst
new file mode 100644
index 0000000..8e1e88a
--- /dev/null
+++ b/Doc/library/unittest.mock-examples.rst
@@ -0,0 +1,1246 @@
+:mod:`unittest.mock` --- getting started
+========================================
+
+.. moduleauthor:: Michael Foord <michael@python.org>
+.. currentmodule:: unittest.mock
+
+.. versionadded:: 3.3
+
+
+.. _getting-started:
+
+Using Mock
+----------
+
+Mock Patching Methods
+~~~~~~~~~~~~~~~~~~~~~
+
+Common uses for :class:`Mock` objects include:
+
+* Patching methods
+* Recording method calls on objects
+
+You might want to replace a method on an object to check that
+it is called with the correct arguments by another part of the system:
+
+ >>> real = SomeClass()
+ >>> real.method = MagicMock(name='method')
+ >>> real.method(3, 4, 5, key='value')
+ <MagicMock name='method()' id='...'>
+
+Once our mock has been used (`real.method` in this example) it has methods
+and attributes that allow you to make assertions about how it has been used.
+
+.. note::
+
+ In most of these examples the :class:`Mock` and :class:`MagicMock` classes
+ are interchangeable. As the `MagicMock` is the more capable class it makes
+ a sensible one to use by default.
+
+Once the mock has been called its :attr:`~Mock.called` attribute is set to
+`True`. More importantly we can use the :meth:`~Mock.assert_called_with` or
+:meth:`~Mock.assert_called_once_with` method to check that it was called with
+the correct arguments.
+
+This example tests that calling `ProductionClass().method` results in a call to
+the `something` method:
+
+ >>> class ProductionClass(object):
+ ... def method(self):
+ ... self.something(1, 2, 3)
+ ... def something(self, a, b, c):
+ ... pass
+ ...
+ >>> real = ProductionClass()
+ >>> real.something = MagicMock()
+ >>> real.method()
+ >>> real.something.assert_called_once_with(1, 2, 3)
+
+
+
+Mock for Method Calls on an Object
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In the last example we patched a method directly on an object to check that it
+was called correctly. Another common use case is to pass an object into a
+method (or some part of the system under test) and then check that it is used
+in the correct way.
+
+The simple `ProductionClass` below has a `closer` method. If it is called with
+an object then it calls `close` on it.
+
+ >>> class ProductionClass(object):
+ ... def closer(self, something):
+ ... something.close()
+ ...
+
+So to test it we need to pass in an object with a `close` method and check
+that it was called correctly.
+
+ >>> real = ProductionClass()
+ >>> mock = Mock()
+ >>> real.closer(mock)
+ >>> mock.close.assert_called_with()
+
+We don't have to do any work to provide the 'close' method on our mock.
+Accessing close creates it. So, if 'close' hasn't already been called then
+accessing it in the test will create it, but :meth:`~Mock.assert_called_with`
+will raise a failure exception.
+
+
+Mocking Classes
+~~~~~~~~~~~~~~~
+
+A common use case is to mock out classes instantiated by your code under test.
+When you patch a class, then that class is replaced with a mock. Instances
+are created by *calling the class*. This means you access the "mock instance"
+by looking at the return value of the mocked class.
+
+In the example below we have a function `some_function` that instantiates `Foo`
+and calls a method on it. The call to `patch` replaces the class `Foo` with a
+mock. The `Foo` instance is the result of calling the mock, so it is configured
+by modifying the mock :attr:`~Mock.return_value`.
+
+ >>> def some_function():
+ ... instance = module.Foo()
+ ... return instance.method()
+ ...
+ >>> with patch('module.Foo') as mock:
+ ... instance = mock.return_value
+ ... instance.method.return_value = 'the result'
+ ... result = some_function()
+ ... assert result == 'the result'
+
+
+Naming your mocks
+~~~~~~~~~~~~~~~~~
+
+It can be useful to give your mocks a name. The name is shown in the repr of
+the mock and can be helpful when the mock appears in test failure messages. The
+name is also propagated to attributes or methods of the mock:
+
+ >>> mock = MagicMock(name='foo')
+ >>> mock
+ <MagicMock name='foo' id='...'>
+ >>> mock.method
+ <MagicMock name='foo.method' id='...'>
+
+
+Tracking all Calls
+~~~~~~~~~~~~~~~~~~
+
+Often you want to track more than a single call to a method. The
+:attr:`~Mock.mock_calls` attribute records all calls
+to child attributes of the mock - and also to their children.
+
+ >>> mock = MagicMock()
+ >>> mock.method()
+ <MagicMock name='mock.method()' id='...'>
+ >>> mock.attribute.method(10, x=53)
+ <MagicMock name='mock.attribute.method()' id='...'>
+ >>> mock.mock_calls
+ [call.method(), call.attribute.method(10, x=53)]
+
+If you make an assertion about `mock_calls` and any unexpected methods
+have been called, then the assertion will fail. This is useful because as well
+as asserting that the calls you expected have been made, you are also checking
+that they were made in the right order and with no additional calls:
+
+You use the :data:`call` object to construct lists for comparing with
+`mock_calls`:
+
+ >>> expected = [call.method(), call.attribute.method(10, x=53)]
+ >>> mock.mock_calls == expected
+ True
+
+
+Setting Return Values and Attributes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setting the return values on a mock object is trivially easy:
+
+ >>> mock = Mock()
+ >>> mock.return_value = 3
+ >>> mock()
+ 3
+
+Of course you can do the same for methods on the mock:
+
+ >>> mock = Mock()
+ >>> mock.method.return_value = 3
+ >>> mock.method()
+ 3
+
+The return value can also be set in the constructor:
+
+ >>> mock = Mock(return_value=3)
+ >>> mock()
+ 3
+
+If you need an attribute setting on your mock, just do it:
+
+ >>> mock = Mock()
+ >>> mock.x = 3
+ >>> mock.x
+ 3
+
+Sometimes you want to mock up a more complex situation, like for example
+`mock.connection.cursor().execute("SELECT 1")`. If we wanted this call to
+return a list, then we have to configure the result of the nested call.
+
+We can use :data:`call` to construct the set of calls in a "chained call" like
+this for easy assertion afterwards:
+
+ >>> mock = Mock()
+ >>> cursor = mock.connection.cursor.return_value
+ >>> cursor.execute.return_value = ['foo']
+ >>> mock.connection.cursor().execute("SELECT 1")
+ ['foo']
+ >>> expected = call.connection.cursor().execute("SELECT 1").call_list()
+ >>> mock.mock_calls
+ [call.connection.cursor(), call.connection.cursor().execute('SELECT 1')]
+ >>> mock.mock_calls == expected
+ True
+
+It is the call to `.call_list()` that turns our call object into a list of
+calls representing the chained calls.
+
+
+Raising exceptions with mocks
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A useful attribute is :attr:`~Mock.side_effect`. If you set this to an
+exception class or instance then the exception will be raised when the mock
+is called.
+
+ >>> mock = Mock(side_effect=Exception('Boom!'))
+ >>> mock()
+ Traceback (most recent call last):
+ ...
+ Exception: Boom!
+
+
+Side effect functions and iterables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+`side_effect` can also be set to a function or an iterable. The use case for
+`side_effect` as an iterable is where your mock is going to be called several
+times, and you want each call to return a different value. When you set
+`side_effect` to an iterable every call to the mock returns the next value
+from the iterable:
+
+ >>> mock = MagicMock(side_effect=[4, 5, 6])
+ >>> mock()
+ 4
+ >>> mock()
+ 5
+ >>> mock()
+ 6
+
+
+For more advanced use cases, like dynamically varying the return values
+depending on what the mock is called with, `side_effect` can be a function.
+The function will be called with the same arguments as the mock. Whatever the
+function returns is what the call returns:
+
+ >>> vals = {(1, 2): 1, (2, 3): 2}
+ >>> def side_effect(*args):
+ ... return vals[args]
+ ...
+ >>> mock = MagicMock(side_effect=side_effect)
+ >>> mock(1, 2)
+ 1
+ >>> mock(2, 3)
+ 2
+
+
+Creating a Mock from an Existing Object
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+One problem with over use of mocking is that it couples your tests to the
+implementation of your mocks rather than your real code. Suppose you have a
+class that implements `some_method`. In a test for another class, you
+provide a mock of this object that *also* provides `some_method`. If later
+you refactor the first class, so that it no longer has `some_method` - then
+your tests will continue to pass even though your code is now broken!
+
+`Mock` allows you to provide an object as a specification for the mock,
+using the `spec` keyword argument. Accessing methods / attributes on the
+mock that don't exist on your specification object will immediately raise an
+attribute error. If you change the implementation of your specification, then
+tests that use that class will start failing immediately without you having to
+instantiate the class in those tests.
+
+ >>> mock = Mock(spec=SomeClass)
+ >>> mock.old_method()
+ Traceback (most recent call last):
+ ...
+ AttributeError: object has no attribute 'old_method'
+
+If you want a stronger form of specification that prevents the setting
+of arbitrary attributes as well as the getting of them then you can use
+`spec_set` instead of `spec`.
+
+
+
+Patch Decorators
+----------------
+
+.. note::
+
+ With `patch` it matters that you patch objects in the namespace where they
+ are looked up. This is normally straightforward, but for a quick guide
+ read :ref:`where to patch <where-to-patch>`.
+
+
+A common need in tests is to patch a class attribute or a module attribute,
+for example patching a builtin or patching a class in a module to test that it
+is instantiated. Modules and classes are effectively global, so patching on
+them has to be undone after the test or the patch will persist into other
+tests and cause hard to diagnose problems.
+
+mock provides three convenient decorators for this: `patch`, `patch.object` and
+`patch.dict`. `patch` takes a single string, of the form
+`package.module.Class.attribute` to specify the attribute you are patching. It
+also optionally takes a value that you want the attribute (or class or
+whatever) to be replaced with. 'patch.object' takes an object and the name of
+the attribute you would like patched, plus optionally the value to patch it
+with.
+
+`patch.object`:
+
+ >>> original = SomeClass.attribute
+ >>> @patch.object(SomeClass, 'attribute', sentinel.attribute)
+ ... def test():
+ ... assert SomeClass.attribute == sentinel.attribute
+ ...
+ >>> test()
+ >>> assert SomeClass.attribute == original
+
+ >>> @patch('package.module.attribute', sentinel.attribute)
+ ... def test():
+ ... from package.module import attribute
+ ... assert attribute is sentinel.attribute
+ ...
+ >>> test()
+
+If you are patching a module (including `__builtin__`) then use `patch`
+instead of `patch.object`:
+
+ >>> mock = MagicMock(return_value = sentinel.file_handle)
+ >>> with patch('__builtin__.open', mock):
+ ... handle = open('filename', 'r')
+ ...
+ >>> mock.assert_called_with('filename', 'r')
+ >>> assert handle == sentinel.file_handle, "incorrect file handle returned"
+
+The module name can be 'dotted', in the form `package.module` if needed:
+
+ >>> @patch('package.module.ClassName.attribute', sentinel.attribute)
+ ... def test():
+ ... from package.module import ClassName
+ ... assert ClassName.attribute == sentinel.attribute
+ ...
+ >>> test()
+
+A nice pattern is to actually decorate test methods themselves:
+
+ >>> class MyTest(unittest2.TestCase):
+ ... @patch.object(SomeClass, 'attribute', sentinel.attribute)
+ ... def test_something(self):
+ ... self.assertEqual(SomeClass.attribute, sentinel.attribute)
+ ...
+ >>> original = SomeClass.attribute
+ >>> MyTest('test_something').test_something()
+ >>> assert SomeClass.attribute == original
+
+If you want to patch with a Mock, you can use `patch` with only one argument
+(or `patch.object` with two arguments). The mock will be created for you and
+passed into the test function / method:
+
+ >>> class MyTest(unittest2.TestCase):
+ ... @patch.object(SomeClass, 'static_method')
+ ... def test_something(self, mock_method):
+ ... SomeClass.static_method()
+ ... mock_method.assert_called_with()
+ ...
+ >>> MyTest('test_something').test_something()
+
+You can stack up multiple patch decorators using this pattern:
+
+ >>> class MyTest(unittest2.TestCase):
+ ... @patch('package.module.ClassName1')
+ ... @patch('package.module.ClassName2')
+ ... def test_something(self, MockClass2, MockClass1):
+ ... self.assertTrue(package.module.ClassName1 is MockClass1)
+ ... self.assertTrue(package.module.ClassName2 is MockClass2)
+ ...
+ >>> MyTest('test_something').test_something()
+
+When you nest patch decorators the mocks are passed in to the decorated
+function in the same order they applied (the normal *python* order that
+decorators are applied). This means from the bottom up, so in the example
+above the mock for `test_module.ClassName2` is passed in first.
+
+There is also :func:`patch.dict` for setting values in a dictionary just
+during a scope and restoring the dictionary to its original state when the test
+ends:
+
+ >>> foo = {'key': 'value'}
+ >>> original = foo.copy()
+ >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True):
+ ... assert foo == {'newkey': 'newvalue'}
+ ...
+ >>> assert foo == original
+
+`patch`, `patch.object` and `patch.dict` can all be used as context managers.
+
+Where you use `patch` to create a mock for you, you can get a reference to the
+mock using the "as" form of the with statement:
+
+ >>> class ProductionClass(object):
+ ... def method(self):
+ ... pass
+ ...
+ >>> with patch.object(ProductionClass, 'method') as mock_method:
+ ... mock_method.return_value = None
+ ... real = ProductionClass()
+ ... real.method(1, 2, 3)
+ ...
+ >>> mock_method.assert_called_with(1, 2, 3)
+
+
+As an alternative `patch`, `patch.object` and `patch.dict` can be used as
+class decorators. When used in this way it is the same as applying the
+decorator indvidually to every method whose name starts with "test".
+
+
+.. _further-examples:
+
+Further Examples
+================
+
+
+Here are some more examples for some slightly more advanced scenarios.
+
+
+Mocking chained calls
+---------------------
+
+Mocking chained calls is actually straightforward with mock once you
+understand the :attr:`~Mock.return_value` attribute. When a mock is called for
+the first time, or you fetch its `return_value` before it has been called, a
+new `Mock` is created.
+
+This means that you can see how the object returned from a call to a mocked
+object has been used by interrogating the `return_value` mock:
+
+ >>> mock = Mock()
+ >>> mock().foo(a=2, b=3)
+ <Mock name='mock().foo()' id='...'>
+ >>> mock.return_value.foo.assert_called_with(a=2, b=3)
+
+From here it is a simple step to configure and then make assertions about
+chained calls. Of course another alternative is writing your code in a more
+testable way in the first place...
+
+So, suppose we have some code that looks a little bit like this:
+
+ >>> class Something(object):
+ ... def __init__(self):
+ ... self.backend = BackendProvider()
+ ... def method(self):
+ ... response = self.backend.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
+ ... # more code
+
+Assuming that `BackendProvider` is already well tested, how do we test
+`method()`? Specifically, we want to test that the code section `# more
+code` uses the response object in the correct way.
+
+As this chain of calls is made from an instance attribute we can monkey patch
+the `backend` attribute on a `Something` instance. In this particular case
+we are only interested in the return value from the final call to
+`start_call` so we don't have much configuration to do. Let's assume the
+object it returns is 'file-like', so we'll ensure that our response object
+uses the builtin `file` as its `spec`.
+
+To do this we create a mock instance as our mock backend and create a mock
+response object for it. To set the response as the return value for that final
+`start_call` we could do this:
+
+ `mock_backend.get_endpoint.return_value.create_call.return_value.start_call.return_value = mock_response`.
+
+We can do that in a slightly nicer way using the :meth:`~Mock.configure_mock`
+method to directly set the return value for us:
+
+ >>> something = Something()
+ >>> mock_response = Mock(spec=file)
+ >>> mock_backend = Mock()
+ >>> config = {'get_endpoint.return_value.create_call.return_value.start_call.return_value': mock_response}
+ >>> mock_backend.configure_mock(**config)
+
+With these we monkey patch the "mock backend" in place and can make the real
+call:
+
+ >>> something.backend = mock_backend
+ >>> something.method()
+
+Using :attr:`~Mock.mock_calls` we can check the chained call with a single
+assert. A chained call is several calls in one line of code, so there will be
+several entries in `mock_calls`. We can use :meth:`call.call_list` to create
+this list of calls for us:
+
+ >>> chained = call.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
+ >>> call_list = chained.call_list()
+ >>> assert mock_backend.mock_calls == call_list
+
+
+Partial mocking
+---------------
+
+In some tests I wanted to mock out a call to `datetime.date.today()
+<http://docs.python.org/library/datetime.html#datetime.date.today>`_ to return
+a known date, but I didn't want to prevent the code under test from
+creating new date objects. Unfortunately `datetime.date` is written in C, and
+so I couldn't just monkey-patch out the static `date.today` method.
+
+I found a simple way of doing this that involved effectively wrapping the date
+class with a mock, but passing through calls to the constructor to the real
+class (and returning real instances).
+
+The :func:`patch decorator <patch>` is used here to
+mock out the `date` class in the module under test. The :attr:`side_effect`
+attribute on the mock date class is then set to a lambda function that returns
+a real date. When the mock date class is called a real date will be
+constructed and returned by `side_effect`.
+
+ >>> from datetime import date
+ >>> with patch('mymodule.date') as mock_date:
+ ... mock_date.today.return_value = date(2010, 10, 8)
+ ... mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
+ ...
+ ... assert mymodule.date.today() == date(2010, 10, 8)
+ ... assert mymodule.date(2009, 6, 8) == date(2009, 6, 8)
+ ...
+
+Note that we don't patch `datetime.date` globally, we patch `date` in the
+module that *uses* it. See :ref:`where to patch <where-to-patch>`.
+
+When `date.today()` is called a known date is returned, but calls to the
+`date(...)` constructor still return normal dates. Without this you can find
+yourself having to calculate an expected result using exactly the same
+algorithm as the code under test, which is a classic testing anti-pattern.
+
+Calls to the date constructor are recorded in the `mock_date` attributes
+(`call_count` and friends) which may also be useful for your tests.
+
+An alternative way of dealing with mocking dates, or other builtin classes,
+is discussed in `this blog entry
+<http://williamjohnbert.com/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/>`_.
+
+
+Mocking a Generator Method
+--------------------------
+
+A Python generator is a function or method that uses the `yield statement
+<http://docs.python.org/reference/simple_stmts.html#the-yield-statement>`_ to
+return a series of values when iterated over [#]_.
+
+A generator method / function is called to return the generator object. It is
+the generator object that is then iterated over. The protocol method for
+iteration is `__iter__
+<http://docs.python.org/library/stdtypes.html#container.__iter__>`_, so we can
+mock this using a `MagicMock`.
+
+Here's an example class with an "iter" method implemented as a generator:
+
+ >>> class Foo(object):
+ ... def iter(self):
+ ... for i in [1, 2, 3]:
+ ... yield i
+ ...
+ >>> foo = Foo()
+ >>> list(foo.iter())
+ [1, 2, 3]
+
+
+How would we mock this class, and in particular its "iter" method?
+
+To configure the values returned from the iteration (implicit in the call to
+`list`), we need to configure the object returned by the call to `foo.iter()`.
+
+ >>> mock_foo = MagicMock()
+ >>> mock_foo.iter.return_value = iter([1, 2, 3])
+ >>> list(mock_foo.iter())
+ [1, 2, 3]
+
+.. [#] There are also generator expressions and more `advanced uses
+ <http://www.dabeaz.com/coroutines/index.html>`_ of generators, but we aren't
+ concerned about them here. A very good introduction to generators and how
+ powerful they are is: `Generator Tricks for Systems Programmers
+ <http://www.dabeaz.com/generators/>`_.
+
+
+Applying the same patch to every test method
+--------------------------------------------
+
+If you want several patches in place for multiple test methods the obvious way
+is to apply the patch decorators to every method. This can feel like unnecessary
+repetition. For Python 2.6 or more recent you can use `patch` (in all its
+various forms) as a class decorator. This applies the patches to all test
+methods on the class. A test method is identified by methods whose names start
+with `test`:
+
+ >>> @patch('mymodule.SomeClass')
+ ... class MyTest(TestCase):
+ ...
+ ... def test_one(self, MockSomeClass):
+ ... self.assertTrue(mymodule.SomeClass is MockSomeClass)
+ ...
+ ... def test_two(self, MockSomeClass):
+ ... self.assertTrue(mymodule.SomeClass is MockSomeClass)
+ ...
+ ... def not_a_test(self):
+ ... return 'something'
+ ...
+ >>> MyTest('test_one').test_one()
+ >>> MyTest('test_two').test_two()
+ >>> MyTest('test_two').not_a_test()
+ 'something'
+
+An alternative way of managing patches is to use the :ref:`start-and-stop`.
+These allow you to move the patching into your `setUp` and `tearDown` methods.
+
+ >>> class MyTest(TestCase):
+ ... def setUp(self):
+ ... self.patcher = patch('mymodule.foo')
+ ... self.mock_foo = self.patcher.start()
+ ...
+ ... def test_foo(self):
+ ... self.assertTrue(mymodule.foo is self.mock_foo)
+ ...
+ ... def tearDown(self):
+ ... self.patcher.stop()
+ ...
+ >>> MyTest('test_foo').run()
+
+If you use this technique you must ensure that the patching is "undone" by
+calling `stop`. This can be fiddlier than you might think, because if an
+exception is raised in the setUp then tearDown is not called.
+:meth:`unittest.TestCase.addCleanup` makes this easier:
+
+ >>> class MyTest(TestCase):
+ ... def setUp(self):
+ ... patcher = patch('mymodule.foo')
+ ... self.addCleanup(patcher.stop)
+ ... self.mock_foo = patcher.start()
+ ...
+ ... def test_foo(self):
+ ... self.assertTrue(mymodule.foo is self.mock_foo)
+ ...
+ >>> MyTest('test_foo').run()
+
+
+Mocking Unbound Methods
+-----------------------
+
+Whilst writing tests today I needed to patch an *unbound method* (patching the
+method on the class rather than on the instance). I needed self to be passed
+in as the first argument because I want to make asserts about which objects
+were calling this particular method. The issue is that you can't patch with a
+mock for this, because if you replace an unbound method with a mock it doesn't
+become a bound method when fetched from the instance, and so it doesn't get
+self passed in. The workaround is to patch the unbound method with a real
+function instead. The :func:`patch` decorator makes it so simple to
+patch out methods with a mock that having to create a real function becomes a
+nuisance.
+
+If you pass `autospec=True` to patch then it does the patching with a
+*real* function object. This function object has the same signature as the one
+it is replacing, but delegates to a mock under the hood. You still get your
+mock auto-created in exactly the same way as before. What it means though, is
+that if you use it to patch out an unbound method on a class the mocked
+function will be turned into a bound method if it is fetched from an instance.
+It will have `self` passed in as the first argument, which is exactly what I
+wanted:
+
+ >>> class Foo(object):
+ ... def foo(self):
+ ... pass
+ ...
+ >>> with patch.object(Foo, 'foo', autospec=True) as mock_foo:
+ ... mock_foo.return_value = 'foo'
+ ... foo = Foo()
+ ... foo.foo()
+ ...
+ 'foo'
+ >>> mock_foo.assert_called_once_with(foo)
+
+If we don't use `autospec=True` then the unbound method is patched out
+with a Mock instance instead, and isn't called with `self`.
+
+
+Checking multiple calls with mock
+---------------------------------
+
+mock has a nice API for making assertions about how your mock objects are used.
+
+ >>> mock = Mock()
+ >>> mock.foo_bar.return_value = None
+ >>> mock.foo_bar('baz', spam='eggs')
+ >>> mock.foo_bar.assert_called_with('baz', spam='eggs')
+
+If your mock is only being called once you can use the
+:meth:`assert_called_once_with` method that also asserts that the
+:attr:`call_count` is one.
+
+ >>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
+ >>> mock.foo_bar()
+ >>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected to be called once. Called 2 times.
+
+Both `assert_called_with` and `assert_called_once_with` make assertions about
+the *most recent* call. If your mock is going to be called several times, and
+you want to make assertions about *all* those calls you can use
+:attr:`~Mock.call_args_list`:
+
+ >>> mock = Mock(return_value=None)
+ >>> mock(1, 2, 3)
+ >>> mock(4, 5, 6)
+ >>> mock()
+ >>> mock.call_args_list
+ [call(1, 2, 3), call(4, 5, 6), call()]
+
+The :data:`call` helper makes it easy to make assertions about these calls. You
+can build up a list of expected calls and compare it to `call_args_list`. This
+looks remarkably similar to the repr of the `call_args_list`:
+
+ >>> expected = [call(1, 2, 3), call(4, 5, 6), call()]
+ >>> mock.call_args_list == expected
+ True
+
+
+Coping with mutable arguments
+-----------------------------
+
+Another situation is rare, but can bite you, is when your mock is called with
+mutable arguments. `call_args` and `call_args_list` store *references* to the
+arguments. If the arguments are mutated by the code under test then you can no
+longer make assertions about what the values were when the mock was called.
+
+Here's some example code that shows the problem. Imagine the following functions
+defined in 'mymodule'::
+
+ def frob(val):
+ pass
+
+ def grob(val):
+ "First frob and then clear val"
+ frob(val)
+ val.clear()
+
+When we try to test that `grob` calls `frob` with the correct argument look
+what happens:
+
+ >>> with patch('mymodule.frob') as mock_frob:
+ ... val = set([6])
+ ... mymodule.grob(val)
+ ...
+ >>> val
+ set([])
+ >>> mock_frob.assert_called_with(set([6]))
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected: ((set([6]),), {})
+ Called with: ((set([]),), {})
+
+One possibility would be for mock to copy the arguments you pass in. This
+could then cause problems if you do assertions that rely on object identity
+for equality.
+
+Here's one solution that uses the :attr:`side_effect`
+functionality. If you provide a `side_effect` function for a mock then
+`side_effect` will be called with the same args as the mock. This gives us an
+opportunity to copy the arguments and store them for later assertions. In this
+example I'm using *another* mock to store the arguments so that I can use the
+mock methods for doing the assertion. Again a helper function sets this up for
+me.
+
+ >>> from copy import deepcopy
+ >>> from unittest.mock import Mock, patch, DEFAULT
+ >>> def copy_call_args(mock):
+ ... new_mock = Mock()
+ ... def side_effect(*args, **kwargs):
+ ... args = deepcopy(args)
+ ... kwargs = deepcopy(kwargs)
+ ... new_mock(*args, **kwargs)
+ ... return DEFAULT
+ ... mock.side_effect = side_effect
+ ... return new_mock
+ ...
+ >>> with patch('mymodule.frob') as mock_frob:
+ ... new_mock = copy_call_args(mock_frob)
+ ... val = set([6])
+ ... mymodule.grob(val)
+ ...
+ >>> new_mock.assert_called_with(set([6]))
+ >>> new_mock.call_args
+ call(set([6]))
+
+`copy_call_args` is called with the mock that will be called. It returns a new
+mock that we do the assertion on. The `side_effect` function makes a copy of
+the args and calls our `new_mock` with the copy.
+
+.. note::
+
+ If your mock is only going to be used once there is an easier way of
+ checking arguments at the point they are called. You can simply do the
+ checking inside a `side_effect` function.
+
+ >>> def side_effect(arg):
+ ... assert arg == set([6])
+ ...
+ >>> mock = Mock(side_effect=side_effect)
+ >>> mock(set([6]))
+ >>> mock(set())
+ Traceback (most recent call last):
+ ...
+ AssertionError
+
+An alternative approach is to create a subclass of `Mock` or `MagicMock` that
+copies (using :func:`copy.deepcopy`) the arguments.
+Here's an example implementation:
+
+ >>> from copy import deepcopy
+ >>> class CopyingMock(MagicMock):
+ ... def __call__(self, *args, **kwargs):
+ ... args = deepcopy(args)
+ ... kwargs = deepcopy(kwargs)
+ ... return super(CopyingMock, self).__call__(*args, **kwargs)
+ ...
+ >>> c = CopyingMock(return_value=None)
+ >>> arg = set()
+ >>> c(arg)
+ >>> arg.add(1)
+ >>> c.assert_called_with(set())
+ >>> c.assert_called_with(arg)
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected call: mock(set([1]))
+ Actual call: mock(set([]))
+ >>> c.foo
+ <CopyingMock name='mock.foo' id='...'>
+
+When you subclass `Mock` or `MagicMock` all dynamically created attributes,
+and the `return_value` will use your subclass automatically. That means all
+children of a `CopyingMock` will also have the type `CopyingMock`.
+
+
+Nesting Patches
+---------------
+
+Using patch as a context manager is nice, but if you do multiple patches you
+can end up with nested with statements indenting further and further to the
+right:
+
+ >>> class MyTest(TestCase):
+ ...
+ ... def test_foo(self):
+ ... with patch('mymodule.Foo') as mock_foo:
+ ... with patch('mymodule.Bar') as mock_bar:
+ ... with patch('mymodule.Spam') as mock_spam:
+ ... assert mymodule.Foo is mock_foo
+ ... assert mymodule.Bar is mock_bar
+ ... assert mymodule.Spam is mock_spam
+ ...
+ >>> original = mymodule.Foo
+ >>> MyTest('test_foo').test_foo()
+ >>> assert mymodule.Foo is original
+
+With unittest `cleanup` functions and the :ref:`start-and-stop` we can
+achieve the same effect without the nested indentation. A simple helper
+method, `create_patch`, puts the patch in place and returns the created mock
+for us:
+
+ >>> class MyTest(TestCase):
+ ...
+ ... def create_patch(self, name):
+ ... patcher = patch(name)
+ ... thing = patcher.start()
+ ... self.addCleanup(patcher.stop)
+ ... return thing
+ ...
+ ... def test_foo(self):
+ ... mock_foo = self.create_patch('mymodule.Foo')
+ ... mock_bar = self.create_patch('mymodule.Bar')
+ ... mock_spam = self.create_patch('mymodule.Spam')
+ ...
+ ... assert mymodule.Foo is mock_foo
+ ... assert mymodule.Bar is mock_bar
+ ... assert mymodule.Spam is mock_spam
+ ...
+ >>> original = mymodule.Foo
+ >>> MyTest('test_foo').run()
+ >>> assert mymodule.Foo is original
+
+
+Mocking a dictionary with MagicMock
+-----------------------------------
+
+You may want to mock a dictionary, or other container object, recording all
+access to it whilst having it still behave like a dictionary.
+
+We can do this with :class:`MagicMock`, which will behave like a dictionary,
+and using :data:`~Mock.side_effect` to delegate dictionary access to a real
+underlying dictionary that is under our control.
+
+When the `__getitem__` and `__setitem__` methods of our `MagicMock` are called
+(normal dictionary access) then `side_effect` is called with the key (and in
+the case of `__setitem__` the value too). We can also control what is returned.
+
+After the `MagicMock` has been used we can use attributes like
+:data:`~Mock.call_args_list` to assert about how the dictionary was used:
+
+ >>> my_dict = {'a': 1, 'b': 2, 'c': 3}
+ >>> def getitem(name):
+ ... return my_dict[name]
+ ...
+ >>> def setitem(name, val):
+ ... my_dict[name] = val
+ ...
+ >>> mock = MagicMock()
+ >>> mock.__getitem__.side_effect = getitem
+ >>> mock.__setitem__.side_effect = setitem
+
+.. note::
+
+ An alternative to using `MagicMock` is to use `Mock` and *only* provide
+ the magic methods you specifically want:
+
+ >>> mock = Mock()
+ >>> mock.__setitem__ = Mock(side_effect=getitem)
+ >>> mock.__getitem__ = Mock(side_effect=setitem)
+
+ A *third* option is to use `MagicMock` but passing in `dict` as the `spec`
+ (or `spec_set`) argument so that the `MagicMock` created only has
+ dictionary magic methods available:
+
+ >>> mock = MagicMock(spec_set=dict)
+ >>> mock.__getitem__.side_effect = getitem
+ >>> mock.__setitem__.side_effect = setitem
+
+With these side effect functions in place, the `mock` will behave like a normal
+dictionary but recording the access. It even raises a `KeyError` if you try
+to access a key that doesn't exist.
+
+ >>> mock['a']
+ 1
+ >>> mock['c']
+ 3
+ >>> mock['d']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'd'
+ >>> mock['b'] = 'fish'
+ >>> mock['d'] = 'eggs'
+ >>> mock['b']
+ 'fish'
+ >>> mock['d']
+ 'eggs'
+
+After it has been used you can make assertions about the access using the normal
+mock methods and attributes:
+
+ >>> mock.__getitem__.call_args_list
+ [call('a'), call('c'), call('d'), call('b'), call('d')]
+ >>> mock.__setitem__.call_args_list
+ [call('b', 'fish'), call('d', 'eggs')]
+ >>> my_dict
+ {'a': 1, 'c': 3, 'b': 'fish', 'd': 'eggs'}
+
+
+Mock subclasses and their attributes
+------------------------------------
+
+There are various reasons why you might want to subclass `Mock`. One reason
+might be to add helper methods. Here's a silly example:
+
+ >>> class MyMock(MagicMock):
+ ... def has_been_called(self):
+ ... return self.called
+ ...
+ >>> mymock = MyMock(return_value=None)
+ >>> mymock
+ <MyMock id='...'>
+ >>> mymock.has_been_called()
+ False
+ >>> mymock()
+ >>> mymock.has_been_called()
+ True
+
+The standard behaviour for `Mock` instances is that attributes and the return
+value mocks are of the same type as the mock they are accessed on. This ensures
+that `Mock` attributes are `Mocks` and `MagicMock` attributes are `MagicMocks`
+[#]_. So if you're subclassing to add helper methods then they'll also be
+available on the attributes and return value mock of instances of your
+subclass.
+
+ >>> mymock.foo
+ <MyMock name='mock.foo' id='...'>
+ >>> mymock.foo.has_been_called()
+ False
+ >>> mymock.foo()
+ <MyMock name='mock.foo()' id='...'>
+ >>> mymock.foo.has_been_called()
+ True
+
+Sometimes this is inconvenient. For example, `one user
+<https://code.google.com/p/mock/issues/detail?id=105>`_ is subclassing mock to
+created a `Twisted adaptor
+<http://twistedmatrix.com/documents/11.0.0/api/twisted.python.components.html>`_.
+Having this applied to attributes too actually causes errors.
+
+`Mock` (in all its flavours) uses a method called `_get_child_mock` to create
+these "sub-mocks" for attributes and return values. You can prevent your
+subclass being used for attributes by overriding this method. The signature is
+that it takes arbitrary keyword arguments (`**kwargs`) which are then passed
+onto the mock constructor:
+
+ >>> class Subclass(MagicMock):
+ ... def _get_child_mock(self, **kwargs):
+ ... return MagicMock(**kwargs)
+ ...
+ >>> mymock = Subclass()
+ >>> mymock.foo
+ <MagicMock name='mock.foo' id='...'>
+ >>> assert isinstance(mymock, Subclass)
+ >>> assert not isinstance(mymock.foo, Subclass)
+ >>> assert not isinstance(mymock(), Subclass)
+
+.. [#] An exception to this rule are the non-callable mocks. Attributes use the
+ callable variant because otherwise non-callable mocks couldn't have callable
+ methods.
+
+
+Mocking imports with patch.dict
+-------------------------------
+
+One situation where mocking can be hard is where you have a local import inside
+a function. These are harder to mock because they aren't using an object from
+the module namespace that we can patch out.
+
+Generally local imports are to be avoided. They are sometimes done to prevent
+circular dependencies, for which there is *usually* a much better way to solve
+the problem (refactor the code) or to prevent "up front costs" by delaying the
+import. This can also be solved in better ways than an unconditional local
+import (store the module as a class or module attribute and only do the import
+on first use).
+
+That aside there is a way to use `mock` to affect the results of an import.
+Importing fetches an *object* from the `sys.modules` dictionary. Note that it
+fetches an *object*, which need not be a module. Importing a module for the
+first time results in a module object being put in `sys.modules`, so usually
+when you import something you get a module back. This need not be the case
+however.
+
+This means you can use :func:`patch.dict` to *temporarily* put a mock in place
+in `sys.modules`. Any imports whilst this patch is active will fetch the mock.
+When the patch is complete (the decorated function exits, the with statement
+body is complete or `patcher.stop()` is called) then whatever was there
+previously will be restored safely.
+
+Here's an example that mocks out the 'fooble' module.
+
+ >>> mock = Mock()
+ >>> with patch.dict('sys.modules', {'fooble': mock}):
+ ... import fooble
+ ... fooble.blob()
+ ...
+ <Mock name='mock.blob()' id='...'>
+ >>> assert 'fooble' not in sys.modules
+ >>> mock.blob.assert_called_once_with()
+
+As you can see the `import fooble` succeeds, but on exit there is no 'fooble'
+left in `sys.modules`.
+
+This also works for the `from module import name` form:
+
+ >>> mock = Mock()
+ >>> with patch.dict('sys.modules', {'fooble': mock}):
+ ... from fooble import blob
+ ... blob.blip()
+ ...
+ <Mock name='mock.blob.blip()' id='...'>
+ >>> mock.blob.blip.assert_called_once_with()
+
+With slightly more work you can also mock package imports:
+
+ >>> mock = Mock()
+ >>> modules = {'package': mock, 'package.module': mock.module}
+ >>> with patch.dict('sys.modules', modules):
+ ... from package.module import fooble
+ ... fooble()
+ ...
+ <Mock name='mock.module.fooble()' id='...'>
+ >>> mock.module.fooble.assert_called_once_with()
+
+
+Tracking order of calls and less verbose call assertions
+--------------------------------------------------------
+
+The :class:`Mock` class allows you to track the *order* of method calls on
+your mock objects through the :attr:`~Mock.method_calls` attribute. This
+doesn't allow you to track the order of calls between separate mock objects,
+however we can use :attr:`~Mock.mock_calls` to achieve the same effect.
+
+Because mocks track calls to child mocks in `mock_calls`, and accessing an
+arbitrary attribute of a mock creates a child mock, we can create our separate
+mocks from a parent one. Calls to those child mock will then all be recorded,
+in order, in the `mock_calls` of the parent:
+
+ >>> manager = Mock()
+ >>> mock_foo = manager.foo
+ >>> mock_bar = manager.bar
+
+ >>> mock_foo.something()
+ <Mock name='mock.foo.something()' id='...'>
+ >>> mock_bar.other.thing()
+ <Mock name='mock.bar.other.thing()' id='...'>
+
+ >>> manager.mock_calls
+ [call.foo.something(), call.bar.other.thing()]
+
+We can then assert about the calls, including the order, by comparing with
+the `mock_calls` attribute on the manager mock:
+
+ >>> expected_calls = [call.foo.something(), call.bar.other.thing()]
+ >>> manager.mock_calls == expected_calls
+ True
+
+If `patch` is creating, and putting in place, your mocks then you can attach
+them to a manager mock using the :meth:`~Mock.attach_mock` method. After
+attaching calls will be recorded in `mock_calls` of the manager.
+
+ >>> manager = MagicMock()
+ >>> with patch('mymodule.Class1') as MockClass1:
+ ... with patch('mymodule.Class2') as MockClass2:
+ ... manager.attach_mock(MockClass1, 'MockClass1')
+ ... manager.attach_mock(MockClass2, 'MockClass2')
+ ... MockClass1().foo()
+ ... MockClass2().bar()
+ ...
+ <MagicMock name='mock.MockClass1().foo()' id='...'>
+ <MagicMock name='mock.MockClass2().bar()' id='...'>
+ >>> manager.mock_calls
+ [call.MockClass1(),
+ call.MockClass1().foo(),
+ call.MockClass2(),
+ call.MockClass2().bar()]
+
+If many calls have been made, but you're only interested in a particular
+sequence of them then an alternative is to use the
+:meth:`~Mock.assert_has_calls` method. This takes a list of calls (constructed
+with the :data:`call` object). If that sequence of calls are in
+:attr:`~Mock.mock_calls` then the assert succeeds.
+
+ >>> m = MagicMock()
+ >>> m().foo().bar().baz()
+ <MagicMock name='mock().foo().bar().baz()' id='...'>
+ >>> m.one().two().three()
+ <MagicMock name='mock.one().two().three()' id='...'>
+ >>> calls = call.one().two().three().call_list()
+ >>> m.assert_has_calls(calls)
+
+Even though the chained call `m.one().two().three()` aren't the only calls that
+have been made to the mock, the assert still succeeds.
+
+Sometimes a mock may have several calls made to it, and you are only interested
+in asserting about *some* of those calls. You may not even care about the
+order. In this case you can pass `any_order=True` to `assert_has_calls`:
+
+ >>> m = MagicMock()
+ >>> m(1), m.two(2, 3), m.seven(7), m.fifty('50')
+ (...)
+ >>> calls = [call.fifty('50'), call(1), call.seven(7)]
+ >>> m.assert_has_calls(calls, any_order=True)
+
+
+More complex argument matching
+------------------------------
+
+Using the same basic concept as :data:`ANY` we can implement matchers to do more
+complex assertions on objects used as arguments to mocks.
+
+Suppose we expect some object to be passed to a mock that by default
+compares equal based on object identity (which is the Python default for user
+defined classes). To use :meth:`~Mock.assert_called_with` we would need to pass
+in the exact same object. If we are only interested in some of the attributes
+of this object then we can create a matcher that will check these attributes
+for us.
+
+You can see in this example how a 'standard' call to `assert_called_with` isn't
+sufficient:
+
+ >>> class Foo(object):
+ ... def __init__(self, a, b):
+ ... self.a, self.b = a, b
+ ...
+ >>> mock = Mock(return_value=None)
+ >>> mock(Foo(1, 2))
+ >>> mock.assert_called_with(Foo(1, 2))
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected: call(<__main__.Foo object at 0x...>)
+ Actual call: call(<__main__.Foo object at 0x...>)
+
+A comparison function for our `Foo` class might look something like this:
+
+ >>> def compare(self, other):
+ ... if not type(self) == type(other):
+ ... return False
+ ... if self.a != other.a:
+ ... return False
+ ... if self.b != other.b:
+ ... return False
+ ... return True
+ ...
+
+And a matcher object that can use comparison functions like this for its
+equality operation would look something like this:
+
+ >>> class Matcher(object):
+ ... def __init__(self, compare, some_obj):
+ ... self.compare = compare
+ ... self.some_obj = some_obj
+ ... def __eq__(self, other):
+ ... return self.compare(self.some_obj, other)
+ ...
+
+Putting all this together:
+
+ >>> match_foo = Matcher(compare, Foo(1, 2))
+ >>> mock.assert_called_with(match_foo)
+
+The `Matcher` is instantiated with our compare function and the `Foo` object
+we want to compare against. In `assert_called_with` the `Matcher` equality
+method will be called, which compares the object the mock was called with
+against the one we created our matcher with. If they match then
+`assert_called_with` passes, and if they don't an `AssertionError` is raised:
+
+ >>> match_wrong = Matcher(compare, Foo(3, 4))
+ >>> mock.assert_called_with(match_wrong)
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected: ((<Matcher object at 0x...>,), {})
+ Called with: ((<Foo object at 0x...>,), {})
+
+With a bit of tweaking you could have the comparison function raise the
+`AssertionError` directly and provide a more useful failure message.
+
+As of version 1.5, the Python testing library `PyHamcrest
+<http://pypi.python.org/pypi/PyHamcrest>`_ provides similar functionality,
+that may be useful here, in the form of its equality matcher
+(`hamcrest.library.integration.match_equality
+<http://packages.python.org/PyHamcrest/integration.html#hamcrest.library.integration.match_equality>`_).
diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst
new file mode 100644
index 0000000..8e72696
--- /dev/null
+++ b/Doc/library/unittest.mock.rst
@@ -0,0 +1,2226 @@
+
+:mod:`unittest.mock` --- mock object library
+============================================
+
+.. module:: unittest.mock
+ :synopsis: Mock object library.
+.. moduleauthor:: Michael Foord <michael@python.org>
+.. currentmodule:: unittest.mock
+
+.. versionadded:: 3.3
+
+:mod:`unittest.mock` is a library for testing in Python. It allows you to
+replace parts of your system under test with mock objects and make assertions
+about how they have been used.
+
+`unittest.mock` provides a core :class:`Mock` class removing the need to
+create a host of stubs throughout your test suite. After performing an
+action, you can make assertions about which methods / attributes were used
+and arguments they were called with. You can also specify return values and
+set needed attributes in the normal way.
+
+Additionally, mock provides a :func:`patch` decorator that handles patching
+module and class level attributes within the scope of a test, along with
+:const:`sentinel` for creating unique objects. See the `quick guide`_ for
+some examples of how to use :class:`Mock`, :class:`MagicMock` and
+:func:`patch`.
+
+Mock is very easy to use and is designed for use with :mod:`unittest`. Mock
+is based on the 'action -> assertion' pattern instead of `'record -> replay'`
+used by many mocking frameworks.
+
+There is a backport of `unittest.mock` for earlier versions of Python,
+available as `mock on PyPI <http://pypi.python.org/pypi/mock>`_.
+
+**Source code:** :source:`Lib/unittest/mock.py`
+
+
+Quick Guide
+-----------
+
+:class:`Mock` and :class:`MagicMock` objects create all attributes and
+methods as you access them and store details of how they have been used. You
+can configure them, to specify return values or limit what attributes are
+available, and then make assertions about how they have been used:
+
+ >>> from unittest.mock import MagicMock
+ >>> thing = ProductionClass()
+ >>> thing.method = MagicMock(return_value=3)
+ >>> thing.method(3, 4, 5, key='value')
+ 3
+ >>> thing.method.assert_called_with(3, 4, 5, key='value')
+
+:attr:`side_effect` allows you to perform side effects, including raising an
+exception when a mock is called:
+
+ >>> mock = Mock(side_effect=KeyError('foo'))
+ >>> mock()
+ Traceback (most recent call last):
+ ...
+ KeyError: 'foo'
+
+ >>> values = {'a': 1, 'b': 2, 'c': 3}
+ >>> def side_effect(arg):
+ ... return values[arg]
+ ...
+ >>> mock.side_effect = side_effect
+ >>> mock('a'), mock('b'), mock('c')
+ (1, 2, 3)
+ >>> mock.side_effect = [5, 4, 3, 2, 1]
+ >>> mock(), mock(), mock()
+ (5, 4, 3)
+
+Mock has many other ways you can configure it and control its behaviour. For
+example the `spec` argument configures the mock to take its specification
+from another object. Attempting to access attributes or methods on the mock
+that don't exist on the spec will fail with an `AttributeError`.
+
+The :func:`patch` decorator / context manager makes it easy to mock classes or
+objects in a module under test. The object you specify will be replaced with a
+mock (or other object) during the test and restored when the test ends:
+
+ >>> from unittest.mock import patch
+ >>> @patch('module.ClassName2')
+ ... @patch('module.ClassName1')
+ ... def test(MockClass1, MockClass2):
+ ... module.ClassName1()
+ ... module.ClassName2()
+ ... assert MockClass1 is module.ClassName1
+ ... assert MockClass2 is module.ClassName2
+ ... assert MockClass1.called
+ ... assert MockClass2.called
+ ...
+ >>> test()
+
+.. note::
+
+ When you nest patch decorators the mocks are passed in to the decorated
+ function in the same order they applied (the normal *python* order that
+ decorators are applied). This means from the bottom up, so in the example
+ above the mock for `module.ClassName1` is passed in first.
+
+ With `patch` it matters that you patch objects in the namespace where they
+ are looked up. This is normally straightforward, but for a quick guide
+ read :ref:`where to patch <where-to-patch>`.
+
+As well as a decorator `patch` can be used as a context manager in a with
+statement:
+
+ >>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
+ ... thing = ProductionClass()
+ ... thing.method(1, 2, 3)
+ ...
+ >>> mock_method.assert_called_once_with(1, 2, 3)
+
+
+There is also :func:`patch.dict` for setting values in a dictionary just
+during a scope and restoring the dictionary to its original state when the test
+ends:
+
+ >>> foo = {'key': 'value'}
+ >>> original = foo.copy()
+ >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True):
+ ... assert foo == {'newkey': 'newvalue'}
+ ...
+ >>> assert foo == original
+
+Mock supports the mocking of Python :ref:`magic methods <magic-methods>`. The
+easiest way of using magic methods is with the :class:`MagicMock` class. It
+allows you to do things like:
+
+ >>> mock = MagicMock()
+ >>> mock.__str__.return_value = 'foobarbaz'
+ >>> str(mock)
+ 'foobarbaz'
+ >>> mock.__str__.assert_called_with()
+
+Mock allows you to assign functions (or other Mock instances) to magic methods
+and they will be called appropriately. The `MagicMock` class is just a Mock
+variant that has all of the magic methods pre-created for you (well, all the
+useful ones anyway).
+
+The following is an example of using magic methods with the ordinary Mock
+class:
+
+ >>> mock = Mock()
+ >>> mock.__str__ = Mock(return_value='wheeeeee')
+ >>> str(mock)
+ 'wheeeeee'
+
+For ensuring that the mock objects in your tests have the same api as the
+objects they are replacing, you can use :ref:`auto-speccing <auto-speccing>`.
+Auto-speccing can be done through the `autospec` argument to patch, or the
+:func:`create_autospec` function. Auto-speccing creates mock objects that
+have the same attributes and methods as the objects they are replacing, and
+any functions and methods (including constructors) have the same call
+signature as the real object.
+
+This ensures that your mocks will fail in the same way as your production
+code if they are used incorrectly:
+
+ >>> from unittest.mock import create_autospec
+ >>> def function(a, b, c):
+ ... pass
+ ...
+ >>> mock_function = create_autospec(function, return_value='fishy')
+ >>> mock_function(1, 2, 3)
+ 'fishy'
+ >>> mock_function.assert_called_once_with(1, 2, 3)
+ >>> mock_function('wrong arguments')
+ Traceback (most recent call last):
+ ...
+ TypeError: <lambda>() takes exactly 3 arguments (1 given)
+
+`create_autospec` can also be used on classes, where it copies the signature of
+the `__init__` method, and on callable objects where it copies the signature of
+the `__call__` method.
+
+
+
+The Mock Class
+--------------
+
+
+`Mock` is a flexible mock object intended to replace the use of stubs and
+test doubles throughout your code. Mocks are callable and create attributes as
+new mocks when you access them [#]_. Accessing the same attribute will always
+return the same mock. Mocks record how you use them, allowing you to make
+assertions about what your code has done to them.
+
+:class:`MagicMock` is a subclass of `Mock` with all the magic methods
+pre-created and ready to use. There are also non-callable variants, useful
+when you are mocking out objects that aren't callable:
+:class:`NonCallableMock` and :class:`NonCallableMagicMock`
+
+The :func:`patch` decorators makes it easy to temporarily replace classes
+in a particular module with a `Mock` object. By default `patch` will create
+a `MagicMock` for you. You can specify an alternative class of `Mock` using
+the `new_callable` argument to `patch`.
+
+
+.. class:: Mock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, **kwargs)
+
+ Create a new `Mock` object. `Mock` takes several optional arguments
+ that specify the behaviour of the Mock object:
+
+ * `spec`: This can be either a list of strings or an existing object (a
+ class or instance) that acts as the specification for the mock object. If
+ you pass in an object then a list of strings is formed by calling dir on
+ the object (excluding unsupported magic attributes and methods).
+ Accessing any attribute not in this list will raise an `AttributeError`.
+
+ If `spec` is an object (rather than a list of strings) then
+ :attr:`__class__` returns the class of the spec object. This allows mocks
+ to pass `isinstance` tests.
+
+ * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
+ or get an attribute on the mock that isn't on the object passed as
+ `spec_set` will raise an `AttributeError`.
+
+ * `side_effect`: A function to be called whenever the Mock is called. See
+ the :attr:`~Mock.side_effect` attribute. Useful for raising exceptions or
+ dynamically changing return values. The function is called with the same
+ arguments as the mock, and unless it returns :data:`DEFAULT`, the return
+ value of this function is used as the return value.
+
+ Alternatively `side_effect` can be an exception class or instance. In
+ this case the exception will be raised when the mock is called.
+
+ If `side_effect` is an iterable then each call to the mock will return
+ the next value from the iterable.
+
+ A `side_effect` can be cleared by setting it to `None`.
+
+ * `return_value`: The value returned when the mock is called. By default
+ this is a new Mock (created on first access). See the
+ :attr:`return_value` attribute.
+
+ * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
+ calling the Mock will pass the call through to the wrapped object
+ (returning the real result). Attribute access on the mock will return a
+ Mock object that wraps the corresponding attribute of the wrapped
+ object (so attempting to access an attribute that doesn't exist will
+ raise an `AttributeError`).
+
+ If the mock has an explicit `return_value` set then calls are not passed
+ to the wrapped object and the `return_value` is returned instead.
+
+ * `name`: If the mock has a name then it will be used in the repr of the
+ mock. This can be useful for debugging. The name is propagated to child
+ mocks.
+
+ Mocks can also be called with arbitrary keyword arguments. These will be
+ used to set attributes on the mock after it is created. See the
+ :meth:`configure_mock` method for details.
+
+
+ .. method:: assert_called_with(*args, **kwargs)
+
+ This method is a convenient way of asserting that calls are made in a
+ particular way:
+
+ >>> mock = Mock()
+ >>> mock.method(1, 2, 3, test='wow')
+ <Mock name='mock.method()' id='...'>
+ >>> mock.method.assert_called_with(1, 2, 3, test='wow')
+
+
+ .. method:: assert_called_once_with(*args, **kwargs)
+
+ Assert that the mock was called exactly once and with the specified
+ arguments.
+
+ >>> mock = Mock(return_value=None)
+ >>> mock('foo', bar='baz')
+ >>> mock.assert_called_once_with('foo', bar='baz')
+ >>> mock('foo', bar='baz')
+ >>> mock.assert_called_once_with('foo', bar='baz')
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected 'mock' to be called once. Called 2 times.
+
+
+ .. method:: assert_any_call(*args, **kwargs)
+
+ assert the mock has been called with the specified arguments.
+
+ The assert passes if the mock has *ever* been called, unlike
+ :meth:`assert_called_with` and :meth:`assert_called_once_with` that
+ only pass if the call is the most recent one.
+
+ >>> mock = Mock(return_value=None)
+ >>> mock(1, 2, arg='thing')
+ >>> mock('some', 'thing', 'else')
+ >>> mock.assert_any_call(1, 2, arg='thing')
+
+
+ .. method:: assert_has_calls(calls, any_order=False)
+
+ assert the mock has been called with the specified calls.
+ The `mock_calls` list is checked for the calls.
+
+ If `any_order` is False (the default) then the calls must be
+ sequential. There can be extra calls before or after the
+ specified calls.
+
+ If `any_order` is True then the calls can be in any order, but
+ they must all appear in :attr:`mock_calls`.
+
+ >>> mock = Mock(return_value=None)
+ >>> mock(1)
+ >>> mock(2)
+ >>> mock(3)
+ >>> mock(4)
+ >>> calls = [call(2), call(3)]
+ >>> mock.assert_has_calls(calls)
+ >>> calls = [call(4), call(2), call(3)]
+ >>> mock.assert_has_calls(calls, any_order=True)
+
+
+ .. method:: reset_mock()
+
+ The reset_mock method resets all the call attributes on a mock object:
+
+ >>> mock = Mock(return_value=None)
+ >>> mock('hello')
+ >>> mock.called
+ True
+ >>> mock.reset_mock()
+ >>> mock.called
+ False
+
+ This can be useful where you want to make a series of assertions that
+ reuse the same object. Note that `reset_mock` *doesn't* clear the
+ return value, :attr:`side_effect` or any child attributes you have
+ set using normal assignment. Child mocks and the return value mock
+ (if any) are reset as well.
+
+
+ .. method:: mock_add_spec(spec, spec_set=False)
+
+ Add a spec to a mock. `spec` can either be an object or a
+ list of strings. Only attributes on the `spec` can be fetched as
+ attributes from the mock.
+
+ If `spec_set` is `True` then only attributes on the spec can be set.
+
+
+ .. method:: attach_mock(mock, attribute)
+
+ Attach a mock as an attribute of this one, replacing its name and
+ parent. Calls to the attached mock will be recorded in the
+ :attr:`method_calls` and :attr:`mock_calls` attributes of this one.
+
+
+ .. method:: configure_mock(**kwargs)
+
+ Set attributes on the mock through keyword arguments.
+
+ Attributes plus return values and side effects can be set on child
+ mocks using standard dot notation and unpacking a dictionary in the
+ method call:
+
+ >>> mock = Mock()
+ >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
+ >>> mock.configure_mock(**attrs)
+ >>> mock.method()
+ 3
+ >>> mock.other()
+ Traceback (most recent call last):
+ ...
+ KeyError
+
+ The same thing can be achieved in the constructor call to mocks:
+
+ >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
+ >>> mock = Mock(some_attribute='eggs', **attrs)
+ >>> mock.some_attribute
+ 'eggs'
+ >>> mock.method()
+ 3
+ >>> mock.other()
+ Traceback (most recent call last):
+ ...
+ KeyError
+
+ `configure_mock` exists to make it easier to do configuration
+ after the mock has been created.
+
+
+ .. method:: __dir__()
+
+ `Mock` objects limit the results of `dir(some_mock)` to useful results.
+ For mocks with a `spec` this includes all the permitted attributes
+ for the mock.
+
+ See :data:`FILTER_DIR` for what this filtering does, and how to
+ switch it off.
+
+
+ .. method:: _get_child_mock(**kw)
+
+ Create the child mocks for attributes and return value.
+ By default child mocks will be the same type as the parent.
+ Subclasses of Mock may want to override this to customize the way
+ child mocks are made.
+
+ For non-callable mocks the callable variant will be used (rather than
+ any custom subclass).
+
+
+ .. attribute:: called
+
+ A boolean representing whether or not the mock object has been called:
+
+ >>> mock = Mock(return_value=None)
+ >>> mock.called
+ False
+ >>> mock()
+ >>> mock.called
+ True
+
+ .. attribute:: call_count
+
+ An integer telling you how many times the mock object has been called:
+
+ >>> mock = Mock(return_value=None)
+ >>> mock.call_count
+ 0
+ >>> mock()
+ >>> mock()
+ >>> mock.call_count
+ 2
+
+
+ .. attribute:: return_value
+
+ Set this to configure the value returned by calling the mock:
+
+ >>> mock = Mock()
+ >>> mock.return_value = 'fish'
+ >>> mock()
+ 'fish'
+
+ The default return value is a mock object and you can configure it in
+ the normal way:
+
+ >>> mock = Mock()
+ >>> mock.return_value.attribute = sentinel.Attribute
+ >>> mock.return_value()
+ <Mock name='mock()()' id='...'>
+ >>> mock.return_value.assert_called_with()
+
+ `return_value` can also be set in the constructor:
+
+ >>> mock = Mock(return_value=3)
+ >>> mock.return_value
+ 3
+ >>> mock()
+ 3
+
+
+ .. attribute:: side_effect
+
+ This can either be a function to be called when the mock is called,
+ or an exception (class or instance) to be raised.
+
+ If you pass in a function it will be called with same arguments as the
+ mock and unless the function returns the :data:`DEFAULT` singleton the
+ call to the mock will then return whatever the function returns. If the
+ function returns :data:`DEFAULT` then the mock will return its normal
+ value (from the :attr:`return_value`.
+
+ An example of a mock that raises an exception (to test exception
+ handling of an API):
+
+ >>> mock = Mock()
+ >>> mock.side_effect = Exception('Boom!')
+ >>> mock()
+ Traceback (most recent call last):
+ ...
+ Exception: Boom!
+
+ Using `side_effect` to return a sequence of values:
+
+ >>> mock = Mock()
+ >>> mock.side_effect = [3, 2, 1]
+ >>> mock(), mock(), mock()
+ (3, 2, 1)
+
+ The `side_effect` function is called with the same arguments as the
+ mock (so it is wise for it to take arbitrary args and keyword
+ arguments) and whatever it returns is used as the return value for
+ the call. The exception is if `side_effect` returns :data:`DEFAULT`,
+ in which case the normal :attr:`return_value` is used.
+
+ >>> mock = Mock(return_value=3)
+ >>> def side_effect(*args, **kwargs):
+ ... return DEFAULT
+ ...
+ >>> mock.side_effect = side_effect
+ >>> mock()
+ 3
+
+ `side_effect` can be set in the constructor. Here's an example that
+ adds one to the value the mock is called with and returns it:
+
+ >>> side_effect = lambda value: value + 1
+ >>> mock = Mock(side_effect=side_effect)
+ >>> mock(3)
+ 4
+ >>> mock(-8)
+ -7
+
+ Setting `side_effect` to `None` clears it:
+
+ >>> m = Mock(side_effect=KeyError, return_value=3)
+ >>> m()
+ Traceback (most recent call last):
+ ...
+ KeyError
+ >>> m.side_effect = None
+ >>> m()
+ 3
+
+
+ .. attribute:: call_args
+
+ This is either `None` (if the mock hasn't been called), or the
+ arguments that the mock was last called with. This will be in the
+ form of a tuple: the first member is any ordered arguments the mock
+ was called with (or an empty tuple) and the second member is any
+ keyword arguments (or an empty dictionary).
+
+ >>> mock = Mock(return_value=None)
+ >>> print mock.call_args
+ None
+ >>> mock()
+ >>> mock.call_args
+ call()
+ >>> mock.call_args == ()
+ True
+ >>> mock(3, 4)
+ >>> mock.call_args
+ call(3, 4)
+ >>> mock.call_args == ((3, 4),)
+ True
+ >>> mock(3, 4, 5, key='fish', next='w00t!')
+ >>> mock.call_args
+ call(3, 4, 5, key='fish', next='w00t!')
+
+ `call_args`, along with members of the lists :attr:`call_args_list`,
+ :attr:`method_calls` and :attr:`mock_calls` are :data:`call` objects.
+ These are tuples, so they can be unpacked to get at the individual
+ arguments and make more complex assertions. See
+ :ref:`calls as tuples <calls-as-tuples>`.
+
+
+ .. attribute:: call_args_list
+
+ This is a list of all the calls made to the mock object in sequence
+ (so the length of the list is the number of times it has been
+ called). Before any calls have been made it is an empty list. The
+ :data:`call` object can be used for conveniently constructing lists of
+ calls to compare with `call_args_list`.
+
+ >>> mock = Mock(return_value=None)
+ >>> mock()
+ >>> mock(3, 4)
+ >>> mock(key='fish', next='w00t!')
+ >>> mock.call_args_list
+ [call(), call(3, 4), call(key='fish', next='w00t!')]
+ >>> expected = [(), ((3, 4),), ({'key': 'fish', 'next': 'w00t!'},)]
+ >>> mock.call_args_list == expected
+ True
+
+ Members of `call_args_list` are :data:`call` objects. These can be
+ unpacked as tuples to get at the individual arguments. See
+ :ref:`calls as tuples <calls-as-tuples>`.
+
+
+ .. attribute:: method_calls
+
+ As well as tracking calls to themselves, mocks also track calls to
+ methods and attributes, and *their* methods and attributes:
+
+ >>> mock = Mock()
+ >>> mock.method()
+ <Mock name='mock.method()' id='...'>
+ >>> mock.property.method.attribute()
+ <Mock name='mock.property.method.attribute()' id='...'>
+ >>> mock.method_calls
+ [call.method(), call.property.method.attribute()]
+
+ Members of `method_calls` are :data:`call` objects. These can be
+ unpacked as tuples to get at the individual arguments. See
+ :ref:`calls as tuples <calls-as-tuples>`.
+
+
+ .. attribute:: mock_calls
+
+ `mock_calls` records *all* calls to the mock object, its methods, magic
+ methods *and* return value mocks.
+
+ >>> mock = MagicMock()
+ >>> result = mock(1, 2, 3)
+ >>> mock.first(a=3)
+ <MagicMock name='mock.first()' id='...'>
+ >>> mock.second()
+ <MagicMock name='mock.second()' id='...'>
+ >>> int(mock)
+ 1
+ >>> result(1)
+ <MagicMock name='mock()()' id='...'>
+ >>> expected = [call(1, 2, 3), call.first(a=3), call.second(),
+ ... call.__int__(), call()(1)]
+ >>> mock.mock_calls == expected
+ True
+
+ Members of `mock_calls` are :data:`call` objects. These can be
+ unpacked as tuples to get at the individual arguments. See
+ :ref:`calls as tuples <calls-as-tuples>`.
+
+
+ .. attribute:: __class__
+
+ Normally the `__class__` attribute of an object will return its type.
+ For a mock object with a `spec` `__class__` returns the spec class
+ instead. This allows mock objects to pass `isinstance` tests for the
+ object they are replacing / masquerading as:
+
+ >>> mock = Mock(spec=3)
+ >>> isinstance(mock, int)
+ True
+
+ `__class__` is assignable to, this allows a mock to pass an
+ `isinstance` check without forcing you to use a spec:
+
+ >>> mock = Mock()
+ >>> mock.__class__ = dict
+ >>> isinstance(mock, dict)
+ True
+
+.. class:: NonCallableMock(spec=None, wraps=None, name=None, spec_set=None, **kwargs)
+
+ A non-callable version of `Mock`. The constructor parameters have the same
+ meaning of `Mock`, with the exception of `return_value` and `side_effect`
+ which have no meaning on a non-callable mock.
+
+Mock objects that use a class or an instance as a `spec` or `spec_set` are able
+to pass `isinstance` tests:
+
+ >>> mock = Mock(spec=SomeClass)
+ >>> isinstance(mock, SomeClass)
+ True
+ >>> mock = Mock(spec_set=SomeClass())
+ >>> isinstance(mock, SomeClass)
+ True
+
+The `Mock` classes have support for mocking magic methods. See :ref:`magic
+methods <magic-methods>` for the full details.
+
+The mock classes and the :func:`patch` decorators all take arbitrary keyword
+arguments for configuration. For the `patch` decorators the keywords are
+passed to the constructor of the mock being created. The keyword arguments
+are for configuring attributes of the mock:
+
+ >>> m = MagicMock(attribute=3, other='fish')
+ >>> m.attribute
+ 3
+ >>> m.other
+ 'fish'
+
+The return value and side effect of child mocks can be set in the same way,
+using dotted notation. As you can't use dotted names directly in a call you
+have to create a dictionary and unpack it using `**`:
+
+ >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
+ >>> mock = Mock(some_attribute='eggs', **attrs)
+ >>> mock.some_attribute
+ 'eggs'
+ >>> mock.method()
+ 3
+ >>> mock.other()
+ Traceback (most recent call last):
+ ...
+ KeyError
+
+
+.. class:: PropertyMock(*args, **kwargs)
+
+ A mock intended to be used as a property, or other descriptor, on a class.
+ `PropertyMock` provides `__get__` and `__set__` methods so you can specify
+ a return value when it is fetched.
+
+ Fetching a `PropertyMock` instance from an object calls the mock, with
+ no args. Setting it calls the mock with the value being set.
+
+ >>> class Foo(object):
+ ... @property
+ ... def foo(self):
+ ... return 'something'
+ ... @foo.setter
+ ... def foo(self, value):
+ ... pass
+ ...
+ >>> with patch('__main__.Foo.foo', new_callable=PropertyMock) as mock_foo:
+ ... mock_foo.return_value = 'mockity-mock'
+ ... this_foo = Foo()
+ ... print this_foo.foo
+ ... this_foo.foo = 6
+ ...
+ mockity-mock
+ >>> mock_foo.mock_calls
+ [call(), call(6)]
+
+Because of the way mock attributes are stored you can't directly attach a
+`PropertyMock` to a mock object. Instead you can attach it to the mock type
+object::
+
+ >>> m = MagicMock()
+ >>> p = PropertyMock(return_value=3)
+ >>> type(m).foo = p
+ >>> m.foo
+ 3
+ >>> p.assert_called_once_with()
+
+
+Calling
+~~~~~~~
+
+Mock objects are callable. The call will return the value set as the
+:attr:`~Mock.return_value` attribute. The default return value is a new Mock
+object; it is created the first time the return value is accessed (either
+explicitly or by calling the Mock) - but it is stored and the same one
+returned each time.
+
+Calls made to the object will be recorded in the attributes
+like :attr:`~Mock.call_args` and :attr:`~Mock.call_args_list`.
+
+If :attr:`~Mock.side_effect` is set then it will be called after the call has
+been recorded, so if `side_effect` raises an exception the call is still
+recorded.
+
+The simplest way to make a mock raise an exception when called is to make
+:attr:`~Mock.side_effect` an exception class or instance:
+
+ >>> m = MagicMock(side_effect=IndexError)
+ >>> m(1, 2, 3)
+ Traceback (most recent call last):
+ ...
+ IndexError
+ >>> m.mock_calls
+ [call(1, 2, 3)]
+ >>> m.side_effect = KeyError('Bang!')
+ >>> m('two', 'three', 'four')
+ Traceback (most recent call last):
+ ...
+ KeyError: 'Bang!'
+ >>> m.mock_calls
+ [call(1, 2, 3), call('two', 'three', 'four')]
+
+If `side_effect` is a function then whatever that function returns is what
+calls to the mock return. The `side_effect` function is called with the
+same arguments as the mock. This allows you to vary the return value of the
+call dynamically, based on the input:
+
+ >>> def side_effect(value):
+ ... return value + 1
+ ...
+ >>> m = MagicMock(side_effect=side_effect)
+ >>> m(1)
+ 2
+ >>> m(2)
+ 3
+ >>> m.mock_calls
+ [call(1), call(2)]
+
+If you want the mock to still return the default return value (a new mock), or
+any set return value, then there are two ways of doing this. Either return
+`mock.return_value` from inside `side_effect`, or return :data:`DEFAULT`:
+
+ >>> m = MagicMock()
+ >>> def side_effect(*args, **kwargs):
+ ... return m.return_value
+ ...
+ >>> m.side_effect = side_effect
+ >>> m.return_value = 3
+ >>> m()
+ 3
+ >>> def side_effect(*args, **kwargs):
+ ... return DEFAULT
+ ...
+ >>> m.side_effect = side_effect
+ >>> m()
+ 3
+
+To remove a `side_effect`, and return to the default behaviour, set the
+`side_effect` to `None`:
+
+ >>> m = MagicMock(return_value=6)
+ >>> def side_effect(*args, **kwargs):
+ ... return 3
+ ...
+ >>> m.side_effect = side_effect
+ >>> m()
+ 3
+ >>> m.side_effect = None
+ >>> m()
+ 6
+
+The `side_effect` can also be any iterable object. Repeated calls to the mock
+will return values from the iterable (until the iterable is exhausted and
+a `StopIteration` is raised):
+
+ >>> m = MagicMock(side_effect=[1, 2, 3])
+ >>> m()
+ 1
+ >>> m()
+ 2
+ >>> m()
+ 3
+ >>> m()
+ Traceback (most recent call last):
+ ...
+ StopIteration
+
+If any members of the iterable are exceptions they will be raised instead of
+returned::
+
+ >>> iterable = (33, ValueError, 66)
+ >>> m = MagicMock(side_effect=iterable)
+ >>> m()
+ 33
+ >>> m()
+ Traceback (most recent call last):
+ ...
+ ValueError
+ >>> m()
+ 66
+
+
+.. _deleting-attributes:
+
+Deleting Attributes
+~~~~~~~~~~~~~~~~~~~
+
+Mock objects create attributes on demand. This allows them to pretend to be
+objects of any type.
+
+You may want a mock object to return `False` to a `hasattr` call, or raise an
+`AttributeError` when an attribute is fetched. You can do this by providing
+an object as a `spec` for a mock, but that isn't always convenient.
+
+You "block" attributes by deleting them. Once deleted, accessing an attribute
+will raise an `AttributeError`.
+
+ >>> mock = MagicMock()
+ >>> hasattr(mock, 'm')
+ True
+ >>> del mock.m
+ >>> hasattr(mock, 'm')
+ False
+ >>> del mock.f
+ >>> mock.f
+ Traceback (most recent call last):
+ ...
+ AttributeError: f
+
+
+Attaching Mocks as Attributes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you attach a mock as an attribute of another mock (or as the return
+value) it becomes a "child" of that mock. Calls to the child are recorded in
+the :attr:`~Mock.method_calls` and :attr:`~Mock.mock_calls` attributes of the
+parent. This is useful for configuring child mocks and then attaching them to
+the parent, or for attaching mocks to a parent that records all calls to the
+children and allows you to make assertions about the order of calls between
+mocks:
+
+ >>> parent = MagicMock()
+ >>> child1 = MagicMock(return_value=None)
+ >>> child2 = MagicMock(return_value=None)
+ >>> parent.child1 = child1
+ >>> parent.child2 = child2
+ >>> child1(1)
+ >>> child2(2)
+ >>> parent.mock_calls
+ [call.child1(1), call.child2(2)]
+
+The exception to this is if the mock has a name. This allows you to prevent
+the "parenting" if for some reason you don't want it to happen.
+
+ >>> mock = MagicMock()
+ >>> not_a_child = MagicMock(name='not-a-child')
+ >>> mock.attribute = not_a_child
+ >>> mock.attribute()
+ <MagicMock name='not-a-child()' id='...'>
+ >>> mock.mock_calls
+ []
+
+Mocks created for you by :func:`patch` are automatically given names. To
+attach mocks that have names to a parent you use the :meth:`~Mock.attach_mock`
+method:
+
+ >>> thing1 = object()
+ >>> thing2 = object()
+ >>> parent = MagicMock()
+ >>> with patch('__main__.thing1', return_value=None) as child1:
+ ... with patch('__main__.thing2', return_value=None) as child2:
+ ... parent.attach_mock(child1, 'child1')
+ ... parent.attach_mock(child2, 'child2')
+ ... child1('one')
+ ... child2('two')
+ ...
+ >>> parent.mock_calls
+ [call.child1('one'), call.child2('two')]
+
+
+.. [#] The only exceptions are magic methods and attributes (those that have
+ leading and trailing double underscores). Mock doesn't create these but
+ instead of raises an ``AttributeError``. This is because the interpreter
+ will often implicitly request these methods, and gets *very* confused to
+ get a new Mock object when it expects a magic method. If you need magic
+ method support see :ref:`magic methods <magic-methods>`.
+
+
+The patchers
+============
+
+The patch decorators are used for patching objects only within the scope of
+the function they decorate. They automatically handle the unpatching for you,
+even if exceptions are raised. All of these functions can also be used in with
+statements or as class decorators.
+
+
+patch
+-----
+
+.. note::
+
+ `patch` is straightforward to use. The key is to do the patching in the
+ right namespace. See the section `where to patch`_.
+
+.. function:: patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
+
+ `patch` acts as a function decorator, class decorator or a context
+ manager. Inside the body of the function or with statement, the `target`
+ is patched with a `new` object. When the function/with statement exits
+ the patch is undone.
+
+ If `new` is omitted, then the target is replaced with a
+ :class:`MagicMock`. If `patch` is used as a decorator and `new` is
+ omitted, the created mock is passed in as an extra argument to the
+ decorated function. If `patch` is used as a context manager the created
+ mock is returned by the context manager.
+
+ `target` should be a string in the form `'package.module.ClassName'`. The
+ `target` is imported and the specified object replaced with the `new`
+ object, so the `target` must be importable from the environment you are
+ calling `patch` from. The target is imported when the decorated function
+ is executed, not at decoration time.
+
+ The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
+ if patch is creating one for you.
+
+ In addition you can pass `spec=True` or `spec_set=True`, which causes
+ patch to pass in the object being mocked as the spec/spec_set object.
+
+ `new_callable` allows you to specify a different class, or callable object,
+ that will be called to create the `new` object. By default `MagicMock` is
+ used.
+
+ A more powerful form of `spec` is `autospec`. If you set `autospec=True`
+ then the mock with be created with a spec from the object being replaced.
+ All attributes of the mock will also have the spec of the corresponding
+ attribute of the object being replaced. Methods and functions being mocked
+ will have their arguments checked and will raise a `TypeError` if they are
+ called with the wrong signature. For mocks
+ replacing a class, their return value (the 'instance') will have the same
+ spec as the class. See the :func:`create_autospec` function and
+ :ref:`auto-speccing`.
+
+ Instead of `autospec=True` you can pass `autospec=some_object` to use an
+ arbitrary object as the spec instead of the one being replaced.
+
+ By default `patch` will fail to replace attributes that don't exist. If
+ you pass in `create=True`, and the attribute doesn't exist, patch will
+ create the attribute for you when the patched function is called, and
+ delete it again afterwards. This is useful for writing tests against
+ attributes that your production code creates at runtime. It is off by by
+ default because it can be dangerous. With it switched on you can write
+ passing tests against APIs that don't actually exist!
+
+ Patch can be used as a `TestCase` class decorator. It works by
+ decorating each test method in the class. This reduces the boilerplate
+ code when your test methods share a common patchings set. `patch` finds
+ tests by looking for method names that start with `patch.TEST_PREFIX`.
+ By default this is `test`, which matches the way `unittest` finds tests.
+ You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
+
+ Patch can be used as a context manager, with the with statement. Here the
+ patching applies to the indented block after the with statement. If you
+ use "as" then the patched object will be bound to the name after the
+ "as"; very useful if `patch` is creating a mock object for you.
+
+ `patch` takes arbitrary keyword arguments. These will be passed to
+ the `Mock` (or `new_callable`) on construction.
+
+ `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
+ available for alternate use-cases.
+
+`patch` as function decorator, creating the mock for you and passing it into
+the decorated function:
+
+ >>> @patch('__main__.SomeClass')
+ ... def function(normal_argument, mock_class):
+ ... print(mock_class is SomeClass)
+ ...
+ >>> function(None)
+ True
+
+Patching a class replaces the class with a `MagicMock` *instance*. If the
+class is instantiated in the code under test then it will be the
+:attr:`~Mock.return_value` of the mock that will be used.
+
+If the class is instantiated multiple times you could use
+:attr:`~Mock.side_effect` to return a new mock each time. Alternatively you
+can set the `return_value` to be anything you want.
+
+To configure return values on methods of *instances* on the patched class
+you must do this on the `return_value`. For example:
+
+ >>> class Class(object):
+ ... def method(self):
+ ... pass
+ ...
+ >>> with patch('__main__.Class') as MockClass:
+ ... instance = MockClass.return_value
+ ... instance.method.return_value = 'foo'
+ ... assert Class() is instance
+ ... assert Class().method() == 'foo'
+ ...
+
+If you use `spec` or `spec_set` and `patch` is replacing a *class*, then the
+return value of the created mock will have the same spec.
+
+ >>> Original = Class
+ >>> patcher = patch('__main__.Class', spec=True)
+ >>> MockClass = patcher.start()
+ >>> instance = MockClass()
+ >>> assert isinstance(instance, Original)
+ >>> patcher.stop()
+
+The `new_callable` argument is useful where you want to use an alternative
+class to the default :class:`MagicMock` for the created mock. For example, if
+you wanted a :class:`NonCallableMock` to be used:
+
+ >>> thing = object()
+ >>> with patch('__main__.thing', new_callable=NonCallableMock) as mock_thing:
+ ... assert thing is mock_thing
+ ... thing()
+ ...
+ Traceback (most recent call last):
+ ...
+ TypeError: 'NonCallableMock' object is not callable
+
+Another use case might be to replace an object with a `StringIO` instance:
+
+ >>> from StringIO import StringIO
+ >>> def foo():
+ ... print 'Something'
+ ...
+ >>> @patch('sys.stdout', new_callable=StringIO)
+ ... def test(mock_stdout):
+ ... foo()
+ ... assert mock_stdout.getvalue() == 'Something\n'
+ ...
+ >>> test()
+
+When `patch` is creating a mock for you, it is common that the first thing
+you need to do is to configure the mock. Some of that configuration can be done
+in the call to patch. Any arbitrary keywords you pass into the call will be
+used to set attributes on the created mock:
+
+ >>> patcher = patch('__main__.thing', first='one', second='two')
+ >>> mock_thing = patcher.start()
+ >>> mock_thing.first
+ 'one'
+ >>> mock_thing.second
+ 'two'
+
+As well as attributes on the created mock attributes, like the
+:attr:`~Mock.return_value` and :attr:`~Mock.side_effect`, of child mocks can
+also be configured. These aren't syntactically valid to pass in directly as
+keyword arguments, but a dictionary with these as keys can still be expanded
+into a `patch` call using `**`:
+
+ >>> config = {'method.return_value': 3, 'other.side_effect': KeyError}
+ >>> patcher = patch('__main__.thing', **config)
+ >>> mock_thing = patcher.start()
+ >>> mock_thing.method()
+ 3
+ >>> mock_thing.other()
+ Traceback (most recent call last):
+ ...
+ KeyError
+
+
+patch.object
+------------
+
+.. function:: patch.object(target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
+
+ patch the named member (`attribute`) on an object (`target`) with a mock
+ object.
+
+ `patch.object` can be used as a decorator, class decorator or a context
+ manager. Arguments `new`, `spec`, `create`, `spec_set`, `autospec` and
+ `new_callable` have the same meaning as for `patch`. Like `patch`,
+ `patch.object` takes arbitrary keyword arguments for configuring the mock
+ object it creates.
+
+ When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
+ for choosing which methods to wrap.
+
+You can either call `patch.object` with three arguments or two arguments. The
+three argument form takes the object to be patched, the attribute name and the
+object to replace the attribute with.
+
+When calling with the two argument form you omit the replacement object, and a
+mock is created for you and passed in as an extra argument to the decorated
+function:
+
+ >>> @patch.object(SomeClass, 'class_method')
+ ... def test(mock_method):
+ ... SomeClass.class_method(3)
+ ... mock_method.assert_called_with(3)
+ ...
+ >>> test()
+
+`spec`, `create` and the other arguments to `patch.object` have the same
+meaning as they do for `patch`.
+
+
+patch.dict
+----------
+
+.. function:: patch.dict(in_dict, values=(), clear=False, **kwargs)
+
+ Patch a dictionary, or dictionary like object, and restore the dictionary
+ to its original state after the test.
+
+ `in_dict` can be a dictionary or a mapping like container. If it is a
+ mapping then it must at least support getting, setting and deleting items
+ plus iterating over keys.
+
+ `in_dict` can also be a string specifying the name of the dictionary, which
+ will then be fetched by importing it.
+
+ `values` can be a dictionary of values to set in the dictionary. `values`
+ can also be an iterable of `(key, value)` pairs.
+
+ If `clear` is True then the dictionary will be cleared before the new
+ values are set.
+
+ `patch.dict` can also be called with arbitrary keyword arguments to set
+ values in the dictionary.
+
+ `patch.dict` can be used as a context manager, decorator or class
+ decorator. When used as a class decorator `patch.dict` honours
+ `patch.TEST_PREFIX` for choosing which methods to wrap.
+
+`patch.dict` can be used to add members to a dictionary, or simply let a test
+change a dictionary, and ensure the dictionary is restored when the test
+ends.
+
+ >>> foo = {}
+ >>> with patch.dict(foo, {'newkey': 'newvalue'}):
+ ... assert foo == {'newkey': 'newvalue'}
+ ...
+ >>> assert foo == {}
+
+ >>> import os
+ >>> with patch.dict('os.environ', {'newkey': 'newvalue'}):
+ ... print os.environ['newkey']
+ ...
+ newvalue
+ >>> assert 'newkey' not in os.environ
+
+Keywords can be used in the `patch.dict` call to set values in the dictionary:
+
+ >>> mymodule = MagicMock()
+ >>> mymodule.function.return_value = 'fish'
+ >>> with patch.dict('sys.modules', mymodule=mymodule):
+ ... import mymodule
+ ... mymodule.function('some', 'args')
+ ...
+ 'fish'
+
+`patch.dict` can be used with dictionary like objects that aren't actually
+dictionaries. At the very minimum they must support item getting, setting,
+deleting and either iteration or membership test. This corresponds to the
+magic methods `__getitem__`, `__setitem__`, `__delitem__` and either
+`__iter__` or `__contains__`.
+
+ >>> class Container(object):
+ ... def __init__(self):
+ ... self.values = {}
+ ... def __getitem__(self, name):
+ ... return self.values[name]
+ ... def __setitem__(self, name, value):
+ ... self.values[name] = value
+ ... def __delitem__(self, name):
+ ... del self.values[name]
+ ... def __iter__(self):
+ ... return iter(self.values)
+ ...
+ >>> thing = Container()
+ >>> thing['one'] = 1
+ >>> with patch.dict(thing, one=2, two=3):
+ ... assert thing['one'] == 2
+ ... assert thing['two'] == 3
+ ...
+ >>> assert thing['one'] == 1
+ >>> assert list(thing) == ['one']
+
+
+patch.multiple
+--------------
+
+.. function:: patch.multiple(target, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
+
+ Perform multiple patches in a single call. It takes the object to be
+ patched (either as an object or a string to fetch the object by importing)
+ and keyword arguments for the patches::
+
+ with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
+ ...
+
+ Use :data:`DEFAULT` as the value if you want `patch.multiple` to create
+ mocks for you. In this case the created mocks are passed into a decorated
+ function by keyword, and a dictionary is returned when `patch.multiple` is
+ used as a context manager.
+
+ `patch.multiple` can be used as a decorator, class decorator or a context
+ manager. The arguments `spec`, `spec_set`, `create`, `autospec` and
+ `new_callable` have the same meaning as for `patch`. These arguments will
+ be applied to *all* patches done by `patch.multiple`.
+
+ When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
+ for choosing which methods to wrap.
+
+If you want `patch.multiple` to create mocks for you, then you can use
+:data:`DEFAULT` as the value. If you use `patch.multiple` as a decorator
+then the created mocks are passed into the decorated function by keyword.
+
+ >>> thing = object()
+ >>> other = object()
+
+ >>> @patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
+ ... def test_function(thing, other):
+ ... assert isinstance(thing, MagicMock)
+ ... assert isinstance(other, MagicMock)
+ ...
+ >>> test_function()
+
+`patch.multiple` can be nested with other `patch` decorators, but put arguments
+passed by keyword *after* any of the standard arguments created by `patch`:
+
+ >>> @patch('sys.exit')
+ ... @patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
+ ... def test_function(mock_exit, other, thing):
+ ... assert 'other' in repr(other)
+ ... assert 'thing' in repr(thing)
+ ... assert 'exit' in repr(mock_exit)
+ ...
+ >>> test_function()
+
+If `patch.multiple` is used as a context manager, the value returned by the
+context manger is a dictionary where created mocks are keyed by name:
+
+ >>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values:
+ ... assert 'other' in repr(values['other'])
+ ... assert 'thing' in repr(values['thing'])
+ ... assert values['thing'] is thing
+ ... assert values['other'] is other
+ ...
+
+
+.. _start-and-stop:
+
+patch methods: start and stop
+-----------------------------
+
+All the patchers have `start` and `stop` methods. These make it simpler to do
+patching in `setUp` methods or where you want to do multiple patches without
+nesting decorators or with statements.
+
+To use them call `patch`, `patch.object` or `patch.dict` as normal and keep a
+reference to the returned `patcher` object. You can then call `start` to put
+the patch in place and `stop` to undo it.
+
+If you are using `patch` to create a mock for you then it will be returned by
+the call to `patcher.start`.
+
+ >>> patcher = patch('package.module.ClassName')
+ >>> from package import module
+ >>> original = module.ClassName
+ >>> new_mock = patcher.start()
+ >>> assert module.ClassName is not original
+ >>> assert module.ClassName is new_mock
+ >>> patcher.stop()
+ >>> assert module.ClassName is original
+ >>> assert module.ClassName is not new_mock
+
+
+A typical use case for this might be for doing multiple patches in the `setUp`
+method of a `TestCase`:
+
+ >>> class MyTest(TestCase):
+ ... def setUp(self):
+ ... self.patcher1 = patch('package.module.Class1')
+ ... self.patcher2 = patch('package.module.Class2')
+ ... self.MockClass1 = self.patcher1.start()
+ ... self.MockClass2 = self.patcher2.start()
+ ...
+ ... def tearDown(self):
+ ... self.patcher1.stop()
+ ... self.patcher2.stop()
+ ...
+ ... def test_something(self):
+ ... assert package.module.Class1 is self.MockClass1
+ ... assert package.module.Class2 is self.MockClass2
+ ...
+ >>> MyTest('test_something').run()
+
+.. caution::
+
+ If you use this technique you must ensure that the patching is "undone" by
+ calling `stop`. This can be fiddlier than you might think, because if an
+ exception is raised in the ``setUp`` then ``tearDown`` is not called.
+ :meth:`unittest.TestCase.addCleanup` makes this easier:
+
+ >>> class MyTest(TestCase):
+ ... def setUp(self):
+ ... patcher = patch('package.module.Class')
+ ... self.MockClass = patcher.start()
+ ... self.addCleanup(patcher.stop)
+ ...
+ ... def test_something(self):
+ ... assert package.module.Class is self.MockClass
+ ...
+
+ As an added bonus you no longer need to keep a reference to the `patcher`
+ object.
+
+It is also possible to stop all patches which have been started by using
+`patch.stopall`.
+
+.. function:: patch.stopall
+
+ Stop all active patches. Only stops patches started with `start`.
+
+
+TEST_PREFIX
+-----------
+
+All of the patchers can be used as class decorators. When used in this way
+they wrap every test method on the class. The patchers recognise methods that
+start with `test` as being test methods. This is the same way that the
+:class:`unittest.TestLoader` finds test methods by default.
+
+It is possible that you want to use a different prefix for your tests. You can
+inform the patchers of the different prefix by setting `patch.TEST_PREFIX`:
+
+ >>> patch.TEST_PREFIX = 'foo'
+ >>> value = 3
+ >>>
+ >>> @patch('__main__.value', 'not three')
+ ... class Thing(object):
+ ... def foo_one(self):
+ ... print value
+ ... def foo_two(self):
+ ... print value
+ ...
+ >>>
+ >>> Thing().foo_one()
+ not three
+ >>> Thing().foo_two()
+ not three
+ >>> value
+ 3
+
+
+Nesting Patch Decorators
+------------------------
+
+If you want to perform multiple patches then you can simply stack up the
+decorators.
+
+You can stack up multiple patch decorators using this pattern:
+
+ >>> @patch.object(SomeClass, 'class_method')
+ ... @patch.object(SomeClass, 'static_method')
+ ... def test(mock1, mock2):
+ ... assert SomeClass.static_method is mock1
+ ... assert SomeClass.class_method is mock2
+ ... SomeClass.static_method('foo')
+ ... SomeClass.class_method('bar')
+ ... return mock1, mock2
+ ...
+ >>> mock1, mock2 = test()
+ >>> mock1.assert_called_once_with('foo')
+ >>> mock2.assert_called_once_with('bar')
+
+
+Note that the decorators are applied from the bottom upwards. This is the
+standard way that Python applies decorators. The order of the created mocks
+passed into your test function matches this order.
+
+
+.. _where-to-patch:
+
+Where to patch
+--------------
+
+`patch` works by (temporarily) changing the object that a *name* points to with
+another one. There can be many names pointing to any individual object, so
+for patching to work you must ensure that you patch the name used by the system
+under test.
+
+The basic principle is that you patch where an object is *looked up*, which
+is not necessarily the same place as where it is defined. A couple of
+examples will help to clarify this.
+
+Imagine we have a project that we want to test with the following structure::
+
+ a.py
+ -> Defines SomeClass
+
+ b.py
+ -> from a import SomeClass
+ -> some_function instantiates SomeClass
+
+Now we want to test `some_function` but we want to mock out `SomeClass` using
+`patch`. The problem is that when we import module b, which we will have to
+do then it imports `SomeClass` from module a. If we use `patch` to mock out
+`a.SomeClass` then it will have no effect on our test; module b already has a
+reference to the *real* `SomeClass` and it looks like our patching had no
+effect.
+
+The key is to patch out `SomeClass` where it is used (or where it is looked up
+). In this case `some_function` will actually look up `SomeClass` in module b,
+where we have imported it. The patching should look like::
+
+ @patch('b.SomeClass')
+
+However, consider the alternative scenario where instead of `from a import
+SomeClass` module b does `import a` and `some_function` uses `a.SomeClass`. Both
+of these import forms are common. In this case the class we want to patch is
+being looked up on the a module and so we have to patch `a.SomeClass` instead::
+
+ @patch('a.SomeClass')
+
+
+Patching Descriptors and Proxy Objects
+--------------------------------------
+
+Both patch_ and patch.object_ correctly patch and restore descriptors: class
+methods, static methods and properties. You should patch these on the *class*
+rather than an instance. They also work with *some* objects
+that proxy attribute access, like the `django setttings object
+<http://www.voidspace.org.uk/python/weblog/arch_d7_2010_12_04.shtml#e1198>`_.
+
+
+MagicMock and magic method support
+==================================
+
+.. _magic-methods:
+
+Mocking Magic Methods
+---------------------
+
+:class:`Mock` supports mocking the Python protocol methods, also known as
+"magic methods". This allows mock objects to replace containers or other
+objects that implement Python protocols.
+
+Because magic methods are looked up differently from normal methods [#]_, this
+support has been specially implemented. This means that only specific magic
+methods are supported. The supported list includes *almost* all of them. If
+there are any missing that you need please let us know.
+
+You mock magic methods by setting the method you are interested in to a function
+or a mock instance. If you are using a function then it *must* take ``self`` as
+the first argument [#]_.
+
+ >>> def __str__(self):
+ ... return 'fooble'
+ ...
+ >>> mock = Mock()
+ >>> mock.__str__ = __str__
+ >>> str(mock)
+ 'fooble'
+
+ >>> mock = Mock()
+ >>> mock.__str__ = Mock()
+ >>> mock.__str__.return_value = 'fooble'
+ >>> str(mock)
+ 'fooble'
+
+ >>> mock = Mock()
+ >>> mock.__iter__ = Mock(return_value=iter([]))
+ >>> list(mock)
+ []
+
+One use case for this is for mocking objects used as context managers in a
+`with` statement:
+
+ >>> mock = Mock()
+ >>> mock.__enter__ = Mock(return_value='foo')
+ >>> mock.__exit__ = Mock(return_value=False)
+ >>> with mock as m:
+ ... assert m == 'foo'
+ ...
+ >>> mock.__enter__.assert_called_with()
+ >>> mock.__exit__.assert_called_with(None, None, None)
+
+Calls to magic methods do not appear in :attr:`~Mock.method_calls`, but they
+are recorded in :attr:`~Mock.mock_calls`.
+
+.. note::
+
+ If you use the `spec` keyword argument to create a mock then attempting to
+ set a magic method that isn't in the spec will raise an `AttributeError`.
+
+The full list of supported magic methods is:
+
+* ``__hash__``, ``__sizeof__``, ``__repr__`` and ``__str__``
+* ``__dir__``, ``__format__`` and ``__subclasses__``
+* ``__floor__``, ``__trunc__`` and ``__ceil__``
+* Comparisons: ``__cmp__``, ``__lt__``, ``__gt__``, ``__le__``, ``__ge__``,
+ ``__eq__`` and ``__ne__``
+* Container methods: ``__getitem__``, ``__setitem__``, ``__delitem__``,
+ ``__contains__``, ``__len__``, ``__iter__``, ``__getslice__``,
+ ``__setslice__``, ``__reversed__`` and ``__missing__``
+* Context manager: ``__enter__`` and ``__exit__``
+* Unary numeric methods: ``__neg__``, ``__pos__`` and ``__invert__``
+* The numeric methods (including right hand and in-place variants):
+ ``__add__``, ``__sub__``, ``__mul__``, ``__div__``,
+ ``__floordiv__``, ``__mod__``, ``__divmod__``, ``__lshift__``,
+ ``__rshift__``, ``__and__``, ``__xor__``, ``__or__``, and ``__pow__``
+* Numeric conversion methods: ``__complex__``, ``__int__``, ``__float__``,
+ ``__index__`` and ``__coerce__``
+* Descriptor methods: ``__get__``, ``__set__`` and ``__delete__``
+* Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``,
+ ``__getnewargs__``, ``__getstate__`` and ``__setstate__``
+
+
+The following methods exist but are *not* supported as they are either in use
+by mock, can't be set dynamically, or can cause problems:
+
+* ``__getattr__``, ``__setattr__``, ``__init__`` and ``__new__``
+* ``__prepare__``, ``__instancecheck__``, ``__subclasscheck__``, ``__del__``
+
+
+
+Magic Mock
+----------
+
+There are two `MagicMock` variants: `MagicMock` and `NonCallableMagicMock`.
+
+
+.. class:: MagicMock(*args, **kw)
+
+ ``MagicMock`` is a subclass of :class:`Mock` with default implementations
+ of most of the magic methods. You can use ``MagicMock`` without having to
+ configure the magic methods yourself.
+
+ The constructor parameters have the same meaning as for :class:`Mock`.
+
+ If you use the `spec` or `spec_set` arguments then *only* magic methods
+ that exist in the spec will be created.
+
+
+.. class:: NonCallableMagicMock(*args, **kw)
+
+ A non-callable version of `MagicMock`.
+
+ The constructor parameters have the same meaning as for
+ :class:`MagicMock`, with the exception of `return_value` and
+ `side_effect` which have no meaning on a non-callable mock.
+
+The magic methods are setup with `MagicMock` objects, so you can configure them
+and use them in the usual way:
+
+ >>> mock = MagicMock()
+ >>> mock[3] = 'fish'
+ >>> mock.__setitem__.assert_called_with(3, 'fish')
+ >>> mock.__getitem__.return_value = 'result'
+ >>> mock[2]
+ 'result'
+
+By default many of the protocol methods are required to return objects of a
+specific type. These methods are preconfigured with a default return value, so
+that they can be used without you having to do anything if you aren't interested
+in the return value. You can still *set* the return value manually if you want
+to change the default.
+
+Methods and their defaults:
+
+* ``__lt__``: NotImplemented
+* ``__gt__``: NotImplemented
+* ``__le__``: NotImplemented
+* ``__ge__``: NotImplemented
+* ``__int__`` : 1
+* ``__contains__`` : False
+* ``__len__`` : 1
+* ``__iter__`` : iter([])
+* ``__exit__`` : False
+* ``__complex__`` : 1j
+* ``__float__`` : 1.0
+* ``__bool__`` : True
+* ``__index__`` : 1
+* ``__hash__`` : default hash for the mock
+* ``__str__`` : default str for the mock
+* ``__sizeof__``: default sizeof for the mock
+
+For example:
+
+ >>> mock = MagicMock()
+ >>> int(mock)
+ 1
+ >>> len(mock)
+ 0
+ >>> list(mock)
+ []
+ >>> object() in mock
+ False
+
+The two equality method, `__eq__` and `__ne__`, are special.
+They do the default equality comparison on identity, using a side
+effect, unless you change their return value to return something else:
+
+ >>> MagicMock() == 3
+ False
+ >>> MagicMock() != 3
+ True
+ >>> mock = MagicMock()
+ >>> mock.__eq__.return_value = True
+ >>> mock == 3
+ True
+
+The return value of `MagicMock.__iter__` can be any iterable object and isn't
+required to be an iterator:
+
+ >>> mock = MagicMock()
+ >>> mock.__iter__.return_value = ['a', 'b', 'c']
+ >>> list(mock)
+ ['a', 'b', 'c']
+ >>> list(mock)
+ ['a', 'b', 'c']
+
+If the return value *is* an iterator, then iterating over it once will consume
+it and subsequent iterations will result in an empty list:
+
+ >>> mock.__iter__.return_value = iter(['a', 'b', 'c'])
+ >>> list(mock)
+ ['a', 'b', 'c']
+ >>> list(mock)
+ []
+
+``MagicMock`` has all of the supported magic methods configured except for some
+of the obscure and obsolete ones. You can still set these up if you want.
+
+Magic methods that are supported but not setup by default in ``MagicMock`` are:
+
+* ``__subclasses__``
+* ``__dir__``
+* ``__format__``
+* ``__get__``, ``__set__`` and ``__delete__``
+* ``__reversed__`` and ``__missing__``
+* ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, ``__getnewargs__``,
+ ``__getstate__`` and ``__setstate__``
+* ``__getformat__`` and ``__setformat__``
+
+
+
+.. [#] Magic methods *should* be looked up on the class rather than the
+ instance. Different versions of Python are inconsistent about applying this
+ rule. The supported protocol methods should work with all supported versions
+ of Python.
+.. [#] The function is basically hooked up to the class, but each ``Mock``
+ instance is kept isolated from the others.
+
+
+Helpers
+=======
+
+sentinel
+--------
+
+.. data:: sentinel
+
+ The ``sentinel`` object provides a convenient way of providing unique
+ objects for your tests.
+
+ Attributes are created on demand when you access them by name. Accessing
+ the same attribute will always return the same object. The objects
+ returned have a sensible repr so that test failure messages are readable.
+
+Sometimes when testing you need to test that a specific object is passed as an
+argument to another method, or returned. It can be common to create named
+sentinel objects to test this. `sentinel` provides a convenient way of
+creating and testing the identity of objects like this.
+
+In this example we monkey patch `method` to return `sentinel.some_object`:
+
+ >>> real = ProductionClass()
+ >>> real.method = Mock(name="method")
+ >>> real.method.return_value = sentinel.some_object
+ >>> result = real.method()
+ >>> assert result is sentinel.some_object
+ >>> sentinel.some_object
+ sentinel.some_object
+
+
+DEFAULT
+-------
+
+
+.. data:: DEFAULT
+
+ The `DEFAULT` object is a pre-created sentinel (actually
+ `sentinel.DEFAULT`). It can be used by :attr:`~Mock.side_effect`
+ functions to indicate that the normal return value should be used.
+
+
+
+call
+----
+
+.. function:: call(*args, **kwargs)
+
+ `call` is a helper object for making simpler assertions, for comparing with
+ :attr:`~Mock.call_args`, :attr:`~Mock.call_args_list`,
+ :attr:`~Mock.mock_calls` and :attr:`~Mock.method_calls`. `call` can also be
+ used with :meth:`~Mock.assert_has_calls`.
+
+ >>> m = MagicMock(return_value=None)
+ >>> m(1, 2, a='foo', b='bar')
+ >>> m()
+ >>> m.call_args_list == [call(1, 2, a='foo', b='bar'), call()]
+ True
+
+.. method:: call.call_list()
+
+ For a call object that represents multiple calls, `call_list`
+ returns a list of all the intermediate calls as well as the
+ final call.
+
+`call_list` is particularly useful for making assertions on "chained calls". A
+chained call is multiple calls on a single line of code. This results in
+multiple entries in :attr:`~Mock.mock_calls` on a mock. Manually constructing
+the sequence of calls can be tedious.
+
+:meth:`~call.call_list` can construct the sequence of calls from the same
+chained call:
+
+ >>> m = MagicMock()
+ >>> m(1).method(arg='foo').other('bar')(2.0)
+ <MagicMock name='mock().method().other()()' id='...'>
+ >>> kall = call(1).method(arg='foo').other('bar')(2.0)
+ >>> kall.call_list()
+ [call(1),
+ call().method(arg='foo'),
+ call().method().other('bar'),
+ call().method().other()(2.0)]
+ >>> m.mock_calls == kall.call_list()
+ True
+
+.. _calls-as-tuples:
+
+A `call` object is either a tuple of (positional args, keyword args) or
+(name, positional args, keyword args) depending on how it was constructed. When
+you construct them yourself this isn't particularly interesting, but the `call`
+objects that are in the :attr:`Mock.call_args`, :attr:`Mock.call_args_list` and
+:attr:`Mock.mock_calls` attributes can be introspected to get at the individual
+arguments they contain.
+
+The `call` objects in :attr:`Mock.call_args` and :attr:`Mock.call_args_list`
+are two-tuples of (positional args, keyword args) whereas the `call` objects
+in :attr:`Mock.mock_calls`, along with ones you construct yourself, are
+three-tuples of (name, positional args, keyword args).
+
+You can use their "tupleness" to pull out the individual arguments for more
+complex introspection and assertions. The positional arguments are a tuple
+(an empty tuple if there are no positional arguments) and the keyword
+arguments are a dictionary:
+
+ >>> m = MagicMock(return_value=None)
+ >>> m(1, 2, 3, arg='one', arg2='two')
+ >>> kall = m.call_args
+ >>> args, kwargs = kall
+ >>> args
+ (1, 2, 3)
+ >>> kwargs
+ {'arg2': 'two', 'arg': 'one'}
+ >>> args is kall[0]
+ True
+ >>> kwargs is kall[1]
+ True
+
+ >>> m = MagicMock()
+ >>> m.foo(4, 5, 6, arg='two', arg2='three')
+ <MagicMock name='mock.foo()' id='...'>
+ >>> kall = m.mock_calls[0]
+ >>> name, args, kwargs = kall
+ >>> name
+ 'foo'
+ >>> args
+ (4, 5, 6)
+ >>> kwargs
+ {'arg2': 'three', 'arg': 'two'}
+ >>> name is m.mock_calls[0][0]
+ True
+
+
+create_autospec
+---------------
+
+.. function:: create_autospec(spec, spec_set=False, instance=False, **kwargs)
+
+ Create a mock object using another object as a spec. Attributes on the
+ mock will use the corresponding attribute on the `spec` object as their
+ spec.
+
+ Functions or methods being mocked will have their arguments checked to
+ ensure that they are called with the correct signature.
+
+ If `spec_set` is `True` then attempting to set attributes that don't exist
+ on the spec object will raise an `AttributeError`.
+
+ If a class is used as a spec then the return value of the mock (the
+ instance of the class) will have the same spec. You can use a class as the
+ spec for an instance object by passing `instance=True`. The returned mock
+ will only be callable if instances of the mock are callable.
+
+ `create_autospec` also takes arbitrary keyword arguments that are passed to
+ the constructor of the created mock.
+
+See :ref:`auto-speccing` for examples of how to use auto-speccing with
+`create_autospec` and the `autospec` argument to :func:`patch`.
+
+
+ANY
+---
+
+.. data:: ANY
+
+Sometimes you may need to make assertions about *some* of the arguments in a
+call to mock, but either not care about some of the arguments or want to pull
+them individually out of :attr:`~Mock.call_args` and make more complex
+assertions on them.
+
+To ignore certain arguments you can pass in objects that compare equal to
+*everything*. Calls to :meth:`~Mock.assert_called_with` and
+:meth:`~Mock.assert_called_once_with` will then succeed no matter what was
+passed in.
+
+ >>> mock = Mock(return_value=None)
+ >>> mock('foo', bar=object())
+ >>> mock.assert_called_once_with('foo', bar=ANY)
+
+`ANY` can also be used in comparisons with call lists like
+:attr:`~Mock.mock_calls`:
+
+ >>> m = MagicMock(return_value=None)
+ >>> m(1)
+ >>> m(1, 2)
+ >>> m(object())
+ >>> m.mock_calls == [call(1), call(1, 2), ANY]
+ True
+
+
+
+FILTER_DIR
+----------
+
+.. data:: FILTER_DIR
+
+`FILTER_DIR` is a module level variable that controls the way mock objects
+respond to `dir` (only for Python 2.6 or more recent). The default is `True`,
+which uses the filtering described below, to only show useful members. If you
+dislike this filtering, or need to switch it off for diagnostic purposes, then
+set `mock.FILTER_DIR = False`.
+
+With filtering on, `dir(some_mock)` shows only useful attributes and will
+include any dynamically created attributes that wouldn't normally be shown.
+If the mock was created with a `spec` (or `autospec` of course) then all the
+attributes from the original are shown, even if they haven't been accessed
+yet:
+
+ >>> dir(Mock())
+ ['assert_any_call',
+ 'assert_called_once_with',
+ 'assert_called_with',
+ 'assert_has_calls',
+ 'attach_mock',
+ ...
+ >>> from urllib import request
+ >>> dir(Mock(spec=request))
+ ['AbstractBasicAuthHandler',
+ 'AbstractDigestAuthHandler',
+ 'AbstractHTTPHandler',
+ 'BaseHandler',
+ ...
+
+Many of the not-very-useful (private to `Mock` rather than the thing being
+mocked) underscore and double underscore prefixed attributes have been
+filtered from the result of calling `dir` on a `Mock`. If you dislike this
+behaviour you can switch it off by setting the module level switch
+`FILTER_DIR`:
+
+ >>> from unittest import mock
+ >>> mock.FILTER_DIR = False
+ >>> dir(mock.Mock())
+ ['_NonCallableMock__get_return_value',
+ '_NonCallableMock__get_side_effect',
+ '_NonCallableMock__return_value_doc',
+ '_NonCallableMock__set_return_value',
+ '_NonCallableMock__set_side_effect',
+ '__call__',
+ '__class__',
+ ...
+
+Alternatively you can just use `vars(my_mock)` (instance members) and
+`dir(type(my_mock))` (type members) to bypass the filtering irrespective of
+`mock.FILTER_DIR`.
+
+
+mock_open
+---------
+
+.. function:: mock_open(mock=None, read_data=None)
+
+ A helper function to create a mock to replace the use of `open`. It works
+ for `open` called directly or used as a context manager.
+
+ The `mock` argument is the mock object to configure. If `None` (the
+ default) then a `MagicMock` will be created for you, with the API limited
+ to methods or attributes available on standard file handles.
+
+ `read_data` is a string for the `read` method of the file handle to return.
+ This is an empty string by default.
+
+Using `open` as a context manager is a great way to ensure your file handles
+are closed properly and is becoming common::
+
+ with open('/some/path', 'w') as f:
+ f.write('something')
+
+The issue is that even if you mock out the call to `open` it is the
+*returned object* that is used as a context manager (and has `__enter__` and
+`__exit__` called).
+
+Mocking context managers with a :class:`MagicMock` is common enough and fiddly
+enough that a helper function is useful.
+
+ >>> m = mock_open()
+ >>> with patch('__main__.open', m, create=True):
+ ... with open('foo', 'w') as h:
+ ... h.write('some stuff')
+ ...
+ >>> m.mock_calls
+ [call('foo', 'w'),
+ call().__enter__(),
+ call().write('some stuff'),
+ call().__exit__(None, None, None)]
+ >>> m.assert_called_once_with('foo', 'w')
+ >>> handle = m()
+ >>> handle.write.assert_called_once_with('some stuff')
+
+And for reading files:
+
+ >>> with patch('__main__.open', mock_open(read_data='bibble'), create=True) as m:
+ ... with open('foo') as h:
+ ... result = h.read()
+ ...
+ >>> m.assert_called_once_with('foo')
+ >>> assert result == 'bibble'
+
+
+.. _auto-speccing:
+
+Autospeccing
+------------
+
+Autospeccing is based on the existing `spec` feature of mock. It limits the
+api of mocks to the api of an original object (the spec), but it is recursive
+(implemented lazily) so that attributes of mocks only have the same api as
+the attributes of the spec. In addition mocked functions / methods have the
+same call signature as the original so they raise a `TypeError` if they are
+called incorrectly.
+
+Before I explain how auto-speccing works, here's why it is needed.
+
+`Mock` is a very powerful and flexible object, but it suffers from two flaws
+when used to mock out objects from a system under test. One of these flaws is
+specific to the `Mock` api and the other is a more general problem with using
+mock objects.
+
+First the problem specific to `Mock`. `Mock` has two assert methods that are
+extremely handy: :meth:`~Mock.assert_called_with` and
+:meth:`~Mock.assert_called_once_with`.
+
+ >>> mock = Mock(name='Thing', return_value=None)
+ >>> mock(1, 2, 3)
+ >>> mock.assert_called_once_with(1, 2, 3)
+ >>> mock(1, 2, 3)
+ >>> mock.assert_called_once_with(1, 2, 3)
+ Traceback (most recent call last):
+ ...
+ AssertionError: Expected 'mock' to be called once. Called 2 times.
+
+Because mocks auto-create attributes on demand, and allow you to call them
+with arbitrary arguments, if you misspell one of these assert methods then
+your assertion is gone:
+
+.. code-block:: pycon
+
+ >>> mock = Mock(name='Thing', return_value=None)
+ >>> mock(1, 2, 3)
+ >>> mock.assret_called_once_with(4, 5, 6)
+
+Your tests can pass silently and incorrectly because of the typo.
+
+The second issue is more general to mocking. If you refactor some of your
+code, rename members and so on, any tests for code that is still using the
+*old api* but uses mocks instead of the real objects will still pass. This
+means your tests can all pass even though your code is broken.
+
+Note that this is another reason why you need integration tests as well as
+unit tests. Testing everything in isolation is all fine and dandy, but if you
+don't test how your units are "wired together" there is still lots of room
+for bugs that tests might have caught.
+
+`mock` already provides a feature to help with this, called speccing. If you
+use a class or instance as the `spec` for a mock then you can only access
+attributes on the mock that exist on the real class:
+
+ >>> from urllib import request
+ >>> mock = Mock(spec=request.Request)
+ >>> mock.assret_called_with
+ Traceback (most recent call last):
+ ...
+ AttributeError: Mock object has no attribute 'assret_called_with'
+
+The spec only applies to the mock itself, so we still have the same issue
+with any methods on the mock:
+
+.. code-block:: pycon
+
+ >>> mock.has_data()
+ <mock.Mock object at 0x...>
+ >>> mock.has_data.assret_called_with()
+
+Auto-speccing solves this problem. You can either pass `autospec=True` to
+`patch` / `patch.object` or use the `create_autospec` function to create a
+mock with a spec. If you use the `autospec=True` argument to `patch` then the
+object that is being replaced will be used as the spec object. Because the
+speccing is done "lazily" (the spec is created as attributes on the mock are
+accessed) you can use it with very complex or deeply nested objects (like
+modules that import modules that import modules) without a big performance
+hit.
+
+Here's an example of it in use:
+
+ >>> from urllib import request
+ >>> patcher = patch('__main__.request', autospec=True)
+ >>> mock_request = patcher.start()
+ >>> request is mock_request
+ True
+ >>> mock_request.Request
+ <MagicMock name='request.Request' spec='Request' id='...'>
+
+You can see that `request.Request` has a spec. `request.Request` takes two
+arguments in the constructor (one of which is `self`). Here's what happens if
+we try to call it incorrectly:
+
+ >>> req = request.Request()
+ Traceback (most recent call last):
+ ...
+ TypeError: <lambda>() takes at least 2 arguments (1 given)
+
+The spec also applies to instantiated classes (i.e. the return value of
+specced mocks):
+
+ >>> req = request.Request('foo')
+ >>> req
+ <NonCallableMagicMock name='request.Request()' spec='Request' id='...'>
+
+`Request` objects are not callable, so the return value of instantiating our
+mocked out `request.Request` is a non-callable mock. With the spec in place
+any typos in our asserts will raise the correct error:
+
+ >>> req.add_header('spam', 'eggs')
+ <MagicMock name='request.Request().add_header()' id='...'>
+ >>> req.add_header.assret_called_with
+ Traceback (most recent call last):
+ ...
+ AttributeError: Mock object has no attribute 'assret_called_with'
+ >>> req.add_header.assert_called_with('spam', 'eggs')
+
+In many cases you will just be able to add `autospec=True` to your existing
+`patch` calls and then be protected against bugs due to typos and api
+changes.
+
+As well as using `autospec` through `patch` there is a
+:func:`create_autospec` for creating autospecced mocks directly:
+
+ >>> from urllib import request
+ >>> mock_request = create_autospec(request)
+ >>> mock_request.Request('foo', 'bar')
+ <NonCallableMagicMock name='mock.Request()' spec='Request' id='...'>
+
+This isn't without caveats and limitations however, which is why it is not
+the default behaviour. In order to know what attributes are available on the
+spec object, autospec has to introspect (access attributes) the spec. As you
+traverse attributes on the mock a corresponding traversal of the original
+object is happening under the hood. If any of your specced objects have
+properties or descriptors that can trigger code execution then you may not be
+able to use autospec. On the other hand it is much better to design your
+objects so that introspection is safe [#]_.
+
+A more serious problem is that it is common for instance attributes to be
+created in the `__init__` method and not to exist on the class at all.
+`autospec` can't know about any dynamically created attributes and restricts
+the api to visible attributes.
+
+ >>> class Something(object):
+ ... def __init__(self):
+ ... self.a = 33
+ ...
+ >>> with patch('__main__.Something', autospec=True):
+ ... thing = Something()
+ ... thing.a
+ ...
+ Traceback (most recent call last):
+ ...
+ AttributeError: Mock object has no attribute 'a'
+
+There are a few different ways of resolving this problem. The easiest, but
+not necessarily the least annoying, way is to simply set the required
+attributes on the mock after creation. Just because `autospec` doesn't allow
+you to fetch attributes that don't exist on the spec it doesn't prevent you
+setting them:
+
+ >>> with patch('__main__.Something', autospec=True):
+ ... thing = Something()
+ ... thing.a = 33
+ ...
+
+There is a more aggressive version of both `spec` and `autospec` that *does*
+prevent you setting non-existent attributes. This is useful if you want to
+ensure your code only *sets* valid attributes too, but obviously it prevents
+this particular scenario:
+
+ >>> with patch('__main__.Something', autospec=True, spec_set=True):
+ ... thing = Something()
+ ... thing.a = 33
+ ...
+ Traceback (most recent call last):
+ ...
+ AttributeError: Mock object has no attribute 'a'
+
+Probably the best way of solving the problem is to add class attributes as
+default values for instance members initialised in `__init__`. Note that if
+you are only setting default attributes in `__init__` then providing them via
+class attributes (shared between instances of course) is faster too. e.g.
+
+.. code-block:: python
+
+ class Something(object):
+ a = 33
+
+This brings up another issue. It is relatively common to provide a default
+value of `None` for members that will later be an object of a different type.
+`None` would be useless as a spec because it wouldn't let you access *any*
+attributes or methods on it. As `None` is *never* going to be useful as a
+spec, and probably indicates a member that will normally of some other type,
+`autospec` doesn't use a spec for members that are set to `None`. These will
+just be ordinary mocks (well - `MagicMocks`):
+
+ >>> class Something(object):
+ ... member = None
+ ...
+ >>> mock = create_autospec(Something)
+ >>> mock.member.foo.bar.baz()
+ <MagicMock name='mock.member.foo.bar.baz()' id='...'>
+
+If modifying your production classes to add defaults isn't to your liking
+then there are more options. One of these is simply to use an instance as the
+spec rather than the class. The other is to create a subclass of the
+production class and add the defaults to the subclass without affecting the
+production class. Both of these require you to use an alternative object as
+the spec. Thankfully `patch` supports this - you can simply pass the
+alternative object as the `autospec` argument:
+
+ >>> class Something(object):
+ ... def __init__(self):
+ ... self.a = 33
+ ...
+ >>> class SomethingForTest(Something):
+ ... a = 33
+ ...
+ >>> p = patch('__main__.Something', autospec=SomethingForTest)
+ >>> mock = p.start()
+ >>> mock.a
+ <NonCallableMagicMock name='Something.a' spec='int' id='...'>
+
+
+.. [#] This only applies to classes or already instantiated objects. Calling
+ a mocked class to create a mock instance *does not* create a real instance.
+ It is only attribute lookups - along with calls to `dir` - that are done.
+
diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst
index 4422533..06f3d83 100644
--- a/Doc/library/unittest.rst
+++ b/Doc/library/unittest.rst
@@ -793,11 +793,14 @@ Test cases
Run the test, collecting the result into the test result object passed as
*result*. If *result* is omitted or ``None``, a temporary result
object is created (by calling the :meth:`defaultTestResult` method) and
- used. The result object is not returned to :meth:`run`'s caller.
+ used. The result object is returned to :meth:`run`'s caller.
The same effect may be had by simply calling the :class:`TestCase`
instance.
+ .. versionchanged:: 3.3
+ Previous versions of ``run`` did not return the result. Neither did
+ calling an instance.
.. method:: skipTest(reason)
@@ -858,10 +861,11 @@ Test cases
| <TestCase.assertNotIsInstance>` | | |
+-----------------------------------------+-----------------------------+---------------+
- All the assert methods (except :meth:`assertRaises`,
- :meth:`assertRaisesRegex`, :meth:`assertWarns`, :meth:`assertWarnsRegex`)
- accept a *msg* argument that, if specified, is used as the error message on
- failure (see also :data:`longMessage`).
+ All the assert methods accept a *msg* argument that, if specified, is used
+ as the error message on failure (see also :data:`longMessage`).
+ Note that the *msg* keyword argument can be passed to :meth:`assertRaises`,
+ :meth:`assertRaisesRegex`, :meth:`assertWarns`, :meth:`assertWarnsRegex`
+ only when they are used as a context manager.
.. method:: assertEqual(first, second, msg=None)
@@ -956,7 +960,7 @@ Test cases
+---------------------------------------------------------+--------------------------------------+------------+
.. method:: assertRaises(exception, callable, *args, **kwds)
- assertRaises(exception)
+ assertRaises(exception, msg=None)
Test that an exception is raised when *callable* is called with any
positional or keyword arguments that are also passed to
@@ -965,12 +969,16 @@ Test cases
To catch any of a group of exceptions, a tuple containing the exception
classes may be passed as *exception*.
- If only the *exception* argument is given, returns a context manager so
- that the code under test can be written inline rather than as a function::
+ If only the *exception* and possibly the *msg* arguments are given,
+ return a context manager so that the code under test can be written
+ inline rather than as a function::
with self.assertRaises(SomeException):
do_something()
+ When used as a context manager, :meth:`assertRaises` accepts the
+ additional keyword argument *msg*.
+
The context manager will store the caught exception object in its
:attr:`exception` attribute. This can be useful if the intention
is to perform additional checks on the exception raised::
@@ -987,9 +995,12 @@ Test cases
.. versionchanged:: 3.2
Added the :attr:`exception` attribute.
+ .. versionchanged:: 3.3
+ Added the *msg* keyword argument when used as a context manager.
+
.. method:: assertRaisesRegex(exception, regex, callable, *args, **kwds)
- assertRaisesRegex(exception, regex)
+ assertRaisesRegex(exception, regex, msg=None)
Like :meth:`assertRaises` but also tests that *regex* matches
on the string representation of the raised exception. *regex* may be
@@ -1006,12 +1017,16 @@ Test cases
.. versionadded:: 3.1
under the name ``assertRaisesRegexp``.
+
.. versionchanged:: 3.2
Renamed to :meth:`assertRaisesRegex`.
+ .. versionchanged:: 3.3
+ Added the *msg* keyword argument when used as a context manager.
+
.. method:: assertWarns(warning, callable, *args, **kwds)
- assertWarns(warning)
+ assertWarns(warning, msg=None)
Test that a warning is triggered when *callable* is called with any
positional or keyword arguments that are also passed to
@@ -1020,12 +1035,16 @@ Test cases
To catch any of a group of warnings, a tuple containing the warning
classes may be passed as *warnings*.
- If only the *warning* argument is given, returns a context manager so
- that the code under test can be written inline rather than as a function::
+ If only the *warning* and possibly the *msg* arguments are given,
+ returns a context manager so that the code under test can be written
+ inline rather than as a function::
with self.assertWarns(SomeWarning):
do_something()
+ When used as a context manager, :meth:`assertRaises` accepts the
+ additional keyword argument *msg*.
+
The context manager will store the caught warning object in its
:attr:`warning` attribute, and the source line which triggered the
warnings in the :attr:`filename` and :attr:`lineno` attributes.
@@ -1043,9 +1062,12 @@ Test cases
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Added the *msg* keyword argument when used as a context manager.
+
.. method:: assertWarnsRegex(warning, regex, callable, *args, **kwds)
- assertWarnsRegex(warning, regex)
+ assertWarnsRegex(warning, regex, msg=None)
Like :meth:`assertWarns` but also tests that *regex* matches on the
message of the triggered warning. *regex* may be a regular expression
@@ -1063,6 +1085,8 @@ Test cases
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ Added the *msg* keyword argument when used as a context manager.
There are also other methods used to perform more specific checks, such as:
@@ -1152,21 +1176,6 @@ Test cases
:meth:`.assertNotRegex`.
- .. method:: assertDictContainsSubset(subset, dictionary, msg=None)
-
- Tests whether the key/value pairs in *dictionary* are a superset of
- those in *subset*. If not, an error message listing the missing keys
- and mismatched values is generated.
-
- Note, the arguments are in the opposite order of what the method name
- dictates. Instead, consider using the set-methods on :ref:`dictionary
- views <dict-views>`, for example: ``d.keys() <= e.keys()`` or
- ``d.items() <= d.items()``.
-
- .. versionadded:: 3.1
- .. deprecated:: 3.2
-
-
.. method:: assertCountEqual(first, second, msg=None)
Test that sequence *first* contains the same elements as *second*,
@@ -1181,21 +1190,6 @@ Test cases
.. versionadded:: 3.2
- .. method:: assertSameElements(first, second, msg=None)
-
- Test that sequence *first* contains the same elements as *second*,
- regardless of their order. When they don't, an error message listing
- the differences between the sequences will be generated.
-
- Duplicate elements are ignored when comparing *first* and *second*.
- It is the equivalent of ``assertEqual(set(first), set(second))``
- but it works with sequences of unhashable objects as well. Because
- duplicates are ignored, this method has been deprecated in favour of
- :meth:`assertCountEqual`.
-
- .. versionadded:: 3.1
- .. deprecated:: 3.2
-
.. _type-specific-methods:
diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst
index 282329f..e20db27 100644
--- a/Doc/library/urllib.error.rst
+++ b/Doc/library/urllib.error.rst
@@ -8,21 +8,23 @@
The :mod:`urllib.error` module defines the exception classes for exceptions
-raised by :mod:`urllib.request`. The base exception class is :exc:`URLError`,
-which inherits from :exc:`IOError`.
+raised by :mod:`urllib.request`. The base exception class is :exc:`URLError`.
The following exceptions are raised by :mod:`urllib.error` as appropriate:
.. exception:: URLError
The handlers raise this exception (or derived exceptions) when they run into
- a problem. It is a subclass of :exc:`IOError`.
+ a problem. It is a subclass of :exc:`OSError`.
.. attribute:: reason
The reason for this error. It can be a message string or another
- exception instance (:exc:`socket.error` for remote URLs, :exc:`OSError`
- for local URLs).
+ exception instance.
+
+ .. versionchanged:: 3.3
+ :exc:`URLError` has been made a subclass of :exc:`OSError` instead
+ of :exc:`IOError`.
.. exception:: HTTPError
diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst
index bc1da62..208cb97 100644
--- a/Doc/library/urllib.parse.rst
+++ b/Doc/library/urllib.parse.rst
@@ -81,8 +81,7 @@ or on combining URL components into a URL string.
this argument is the empty string.
If the *allow_fragments* argument is false, fragment identifiers are not
- allowed, even if the URL's addressing scheme normally does support them. The
- default value for this argument is :const:`True`.
+ allowed. The default value for this argument is :const:`True`.
The return value is actually an instance of a subclass of :class:`tuple`. This
class has the following additional read-only convenience attributes:
@@ -119,6 +118,11 @@ or on combining URL components into a URL string.
.. versionchanged:: 3.2
Added IPv6 URL parsing capabilities.
+ .. versionchanged:: 3.3
+ The fragment is now parsed for all URL schemes (unless *allow_fragment* is
+ false), in accordance with :rfc:`3986`. Previously, a whitelist of
+ schemes that support fragments existed.
+
.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
@@ -141,8 +145,9 @@ or on combining URL components into a URL string.
percent-encoded sequences into Unicode characters, as accepted by the
:meth:`bytes.decode` method.
- Use the :func:`urllib.parse.urlencode` function to convert such
- dictionaries into query strings.
+ Use the :func:`urllib.parse.urlencode` function (with the ``doseq``
+ parameter set to ``True``) to convert such dictionaries into query
+ strings.
.. versionchanged:: 3.2
diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
index b4764cc..21255e5 100644
--- a/Doc/library/urllib.request.rst
+++ b/Doc/library/urllib.request.rst
@@ -16,7 +16,7 @@ authentication, redirections, cookies and more.
The :mod:`urllib.request` module defines the following functions:
-.. function:: urlopen(url, data=None[, timeout], *, cafile=None, capath=None)
+.. function:: urlopen(url, data=None[, timeout], *, cafile=None, capath=None, cadefault=True)
Open the URL *url*, which can be either a string or a
:class:`Request` object.
@@ -53,9 +53,15 @@ The :mod:`urllib.request` module defines the following functions:
point to a directory of hashed certificate files. More information can
be found in :meth:`ssl.SSLContext.load_verify_locations`.
+ The *cadefault* parameter specifies whether to fall back to loading a
+ default certificate store defined by the underlying OpenSSL library if the
+ *cafile* and *capath* parameters are omitted. This will only work on
+ some non-Windows platforms.
+
.. warning::
- If neither *cafile* nor *capath* is specified, an HTTPS request
- will not do any verification of the server's certificate.
+ If neither *cafile* nor *capath* is specified, and *cadefault* is False,
+ an HTTPS request will not do any verification of the server's
+ certificate.
This function returns a file-like object that works as a :term:`context manager`,
with two additional methods from the :mod:`urllib.response` module
@@ -92,6 +98,9 @@ The :mod:`urllib.request` module defines the following functions:
.. versionadded:: 3.2
*data* can be an iterable object.
+ .. versionchanged:: 3.3
+ *cadefault* was added.
+
.. function:: install_opener(opener)
Install an :class:`OpenerDirector` instance as the default global opener.
@@ -145,7 +154,7 @@ The :mod:`urllib.request` module defines the following functions:
The following classes are provided:
-.. class:: Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False)
+.. class:: Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
This class is an abstraction of a URL request.
@@ -198,6 +207,13 @@ The following classes are provided:
document, and the user had no option to approve the automatic
fetching of the image, this should be true.
+ *method* should be a string that indicates the HTTP request method that
+ will be used (e.g. ``'HEAD'``). Its value is stored in the
+ :attr:`~Request.method` attribute and is used by :meth:`get_method()`.
+
+ .. versionchanged:: 3.3
+ :attr:`Request.method` argument is added to the Request class.
+
.. class:: OpenerDirector()
@@ -263,10 +279,11 @@ The following classes are provided:
.. class:: HTTPBasicAuthHandler(password_mgr=None)
- Handle authentication with the remote host. *password_mgr*, if given, should be
- something that is compatible with :class:`HTTPPasswordMgr`; refer to section
- :ref:`http-password-mgr` for information on the interface that must be
- supported.
+ Handle authentication with the remote host. *password_mgr*, if given, should
+ be something that is compatible with :class:`HTTPPasswordMgr`; refer to
+ section :ref:`http-password-mgr` for information on the interface that must
+ be supported. HTTPBasicAuthHandler will raise a :exc:`ValueError` when
+ presented with a wrong Authentication scheme.
.. class:: ProxyBasicAuthHandler(password_mgr=None)
@@ -288,10 +305,19 @@ The following classes are provided:
.. class:: HTTPDigestAuthHandler(password_mgr=None)
- Handle authentication with the remote host. *password_mgr*, if given, should be
- something that is compatible with :class:`HTTPPasswordMgr`; refer to section
- :ref:`http-password-mgr` for information on the interface that must be
- supported.
+ Handle authentication with the remote host. *password_mgr*, if given, should
+ be something that is compatible with :class:`HTTPPasswordMgr`; refer to
+ section :ref:`http-password-mgr` for information on the interface that must
+ be supported. When both Digest Authentication Handler and Basic
+ Authentication Handler are both added, Digest Authentication is always tried
+ first. If the Digest Authentication returns a 40x response again, it is sent
+ to Basic Authentication handler to Handle. This Handler method will raise a
+ :exc:`ValueError` when presented with an authentication scheme other than
+ Digest or Basic.
+
+ .. versionchanged:: 3.3
+ Raise :exc:`ValueError` on unsupported Authentication Scheme.
+
.. class:: ProxyDigestAuthHandler(password_mgr=None)
@@ -382,27 +408,25 @@ request.
boolean, indicates whether the request is unverifiable as defined
by RFC 2965.
-.. method:: Request.add_data(data)
-
- Set the :class:`Request` data to *data*. This is ignored by all handlers except
- HTTP handlers --- and there it should be a byte string, and will change the
- request to be ``POST`` rather than ``GET``.
-
-
-.. method:: Request.get_method()
-
- Return a string indicating the HTTP request method. This is only meaningful for
- HTTP requests, and currently always returns ``'GET'`` or ``'POST'``.
+.. attribute:: Request.method
+ The HTTP request method to use. This value is used by
+ :meth:`~Request.get_method` to override the computed HTTP request
+ method that would otherwise be returned. This attribute is initialized with
+ the value of the *method* argument passed to the constructor.
-.. method:: Request.has_data()
+ .. versionadded:: 3.3
- Return whether the instance has a non-\ ``None`` data.
+.. method:: Request.get_method()
-.. method:: Request.get_data()
+ Return a string indicating the HTTP request method. If
+ :attr:`Request.method` is not ``None``, return its value, otherwise return
+ ``'GET'`` if :attr:`Request.data` is ``None``, or ``'POST'`` if it's not.
+ This is only meaningful for HTTP requests.
- Return the instance's data.
+ .. versionchanged:: 3.3
+ get_method now looks at the value of :attr:`Request.method`.
.. method:: Request.add_header(key, val)
@@ -432,20 +456,60 @@ request.
Return the URL given in the constructor.
+.. method:: Request.set_proxy(host, type)
+
+ Prepare the request by connecting to a proxy server. The *host* and *type* will
+ replace those of the instance, and the instance's selector will be the original
+ URL given in the constructor.
+
+
+.. method:: Request.add_data(data)
+
+ Set the :class:`Request` data to *data*. This is ignored by all handlers except
+ HTTP handlers --- and there it should be a byte string, and will change the
+ request to be ``POST`` rather than ``GET``. Deprecated in 3.3, use
+ :attr:`Request.data`.
+
+ .. deprecated:: 3.3
+
+
+.. method:: Request.has_data()
+
+ Return whether the instance has a non-\ ``None`` data. Deprecated in 3.3,
+ use :attr:`Request.data`.
+
+ .. deprecated:: 3.3
+
+
+.. method:: Request.get_data()
+
+ Return the instance's data. Deprecated in 3.3, use :attr:`Request.data`.
+
+ .. deprecated:: 3.3
+
+
.. method:: Request.get_type()
- Return the type of the URL --- also known as the scheme.
+ Return the type of the URL --- also known as the scheme. Deprecated in 3.3,
+ use :attr:`Request.type`.
+
+ .. deprecated:: 3.3
.. method:: Request.get_host()
- Return the host to which a connection will be made.
+ Return the host to which a connection will be made. Deprecated in 3.3, use
+ :attr:`Request.host`.
+
+ .. deprecated:: 3.3
.. method:: Request.get_selector()
Return the selector --- the part of the URL that is sent to the server.
+ Deprecated in 3.3, use :attr:`Request.selector`.
+ .. deprecated:: 3.3
.. method:: Request.get_header(header_name, default=None)
@@ -460,21 +524,22 @@ request.
.. method:: Request.set_proxy(host, type)
- Prepare the request by connecting to a proxy server. The *host* and *type* will
- replace those of the instance, and the instance's selector will be the original
- URL given in the constructor.
-
-
.. method:: Request.get_origin_req_host()
- Return the request-host of the origin transaction, as defined by :rfc:`2965`.
- See the documentation for the :class:`Request` constructor.
+ Return the request-host of the origin transaction, as defined by
+ :rfc:`2965`. See the documentation for the :class:`Request` constructor.
+ Deprecated in 3.3, use :attr:`Request.origin_req_host`.
+
+ .. deprecated:: 3.3
.. method:: Request.is_unverifiable()
Return whether the request is unverifiable, as defined by RFC 2965. See the
- documentation for the :class:`Request` constructor.
+ documentation for the :class:`Request` constructor. Deprecated in 3.3, use
+ :attr:`Request.unverifiable`.
+
+ .. deprecated:: 3.3
.. _opener-director-objects:
@@ -1138,16 +1203,14 @@ The following functions and classes are ported from the Python 2 module
``urllib`` (as opposed to ``urllib2``). They might become deprecated at
some point in the future.
-
.. function:: urlretrieve(url, filename=None, reporthook=None, data=None)
- Copy a network object denoted by a URL to a local file, if necessary. If the URL
- points to a local file, or a valid cached copy of the object exists, the object
- is not copied. Return a tuple ``(filename, headers)`` where *filename* is the
+ Copy a network object denoted by a URL to a local file. If the URL
+ points to a local file, the object will not be copied unless filename is supplied.
+ Return a tuple ``(filename, headers)`` where *filename* is the
local file name under which the object can be found, and *headers* is whatever
the :meth:`info` method of the object returned by :func:`urlopen` returned (for
- a remote object, possibly cached). Exceptions are the same as for
- :func:`urlopen`.
+ a remote object). Exceptions are the same as for :func:`urlopen`.
The second argument, if present, specifies the file location to copy to (if
absent, the location will be a tempfile with a generated name). The third
@@ -1158,6 +1221,13 @@ some point in the future.
third argument may be ``-1`` on older FTP servers which do not return a file
size in response to a retrieval request.
+ The following example illustrates the most common usage scenario::
+
+ >>> import urllib.request
+ >>> local_filename, headers = urllib.request.urlretrieve('http://python.org/')
+ >>> html = open(local_filename)
+ >>> html.close()
+
If the *url* uses the :file:`http:` scheme identifier, the optional *data*
argument may be given to specify a ``POST`` request (normally the request
type is ``GET``). The *data* argument must be a bytes object in standard
@@ -1170,20 +1240,20 @@ some point in the future.
the download is interrupted.
The *Content-Length* is treated as a lower bound: if there's more data to read,
- :func:`urlretrieve` reads more data, but if less data is available, it raises
- the exception.
+ urlretrieve reads more data, but if less data is available, it raises the
+ exception.
You can still retrieve the downloaded data in this case, it is stored in the
:attr:`content` attribute of the exception instance.
- If no *Content-Length* header was supplied, :func:`urlretrieve` can not check
- the size of the data it has downloaded, and just returns it. In this case
- you just have to assume that the download was successful.
+ If no *Content-Length* header was supplied, urlretrieve can not check the size
+ of the data it has downloaded, and just returns it. In this case you just have
+ to assume that the download was successful.
.. function:: urlcleanup()
- Clear the cache that may have been built up by previous calls to
- :func:`urlretrieve`.
+ Cleans up temporary files that may have been left behind by previous
+ calls to :func:`urlretrieve`.
.. class:: URLopener(proxies=None, **x509)
@@ -1207,7 +1277,7 @@ some point in the future.
*key_file* and *cert_file* are supported to provide an SSL key and certificate;
both are needed to support client authentication.
- :class:`URLopener` objects will raise an :exc:`IOError` exception if the server
+ :class:`URLopener` objects will raise an :exc:`OSError` exception if the server
returns an error code.
.. method:: open(fullurl, data=None)
@@ -1235,7 +1305,8 @@ some point in the future.
*filename* is not given, the filename is the output of :func:`tempfile.mktemp`
with a suffix that matches the suffix of the last path component of the input
URL. If *reporthook* is given, it must be a function accepting three numeric
- parameters. It will be called after each chunk of data is read from the
+ parameters: A chunk number, the maximum size chunks are read in and the total size of the download
+ (-1 if unknown). It will be called once at the start and after each chunk of data is read from the
network. *reporthook* is ignored for local URLs.
If the *url* uses the :file:`http:` scheme identifier, the optional *data*
diff --git a/Doc/library/urllib.rst b/Doc/library/urllib.rst
new file mode 100644
index 0000000..9ca74b8
--- /dev/null
+++ b/Doc/library/urllib.rst
@@ -0,0 +1,9 @@
+:mod:`urllib` --- URL handling modules
+======================================
+
+``urllib`` is a package that collects several modules for working with URLs:
+
+* :mod:`urllib.request` for opening and reading URLs
+* :mod:`urllib.error` containing the exceptions raised by :mod:`urllib.request`
+* :mod:`urllib.parse` for parsing URLs
+* :mod:`urllib.robotparser` for parsing ``robots.txt`` files
diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst
new file mode 100644
index 0000000..2499962
--- /dev/null
+++ b/Doc/library/venv.rst
@@ -0,0 +1,180 @@
+:mod:`venv` --- Creation of virtual environments
+================================================
+
+.. module:: venv
+ :synopsis: Creation of virtual environments.
+.. moduleauthor:: Vinay Sajip <vinay_sajip@yahoo.co.uk>
+.. sectionauthor:: Vinay Sajip <vinay_sajip@yahoo.co.uk>
+
+
+.. index:: pair: Environments; virtual
+
+.. versionadded:: 3.3
+
+**Source code:** :source:`Lib/venv.py`
+
+--------------
+
+The :mod:`venv` module provides support for creating lightweight "virtual
+environments" with their own site directories, optionally isolated from system
+site directories. Each virtual environment has its own Python binary (allowing
+creation of environments with various Python versions) and can have its own
+independent set of installed Python packages in its site directories.
+
+
+Creating virtual environments
+-----------------------------
+
+.. include:: /using/venv-create.inc
+
+
+.. _venv-def:
+
+.. note:: A virtual environment (also called a ``venv``) is a Python
+ environment such that the Python interpreter, libraries and scripts
+ installed into it are isolated from those installed in other virtual
+ environments, and (by default) any libraries installed in a "system" Python,
+ i.e. one which is installed as part of your operating system.
+
+ A venv is a directory tree which contains Python executable files and
+ other files which indicate that it is a venv.
+
+ Common installation tools such as ``Distribute`` and ``pip`` work as
+ expected with venvs - i.e. when a venv is active, they install Python
+ packages into the venv without needing to be told to do so explicitly.
+ Of course, you need to install them into the venv first: this could be
+ done by running ``distribute_setup.py`` with the venv activated,
+ followed by running ``easy_install pip``. Alternatively, you could download
+ the source tarballs and run ``python setup.py install`` after unpacking,
+ with the venv activated.
+
+ When a venv is active (i.e. the venv's Python interpreter is running), the
+ attributes :attr:`sys.prefix` and :attr:`sys.exec_prefix` point to the base
+ directory of the venv, whereas :attr:`sys.base_prefix` and
+ :attr:`sys.base_exec_prefix` point to the non-venv Python installation
+ which was used to create the venv. If a venv is not active, then
+ :attr:`sys.prefix` is the same as :attr:`sys.base_prefix` and
+ :attr:`sys.exec_prefix` is the same as :attr:`sys.base_exec_prefix` (they
+ all point to a non-venv Python installation).
+
+
+API
+---
+
+.. highlight:: python
+
+The high-level method described above makes use of a simple API which provides
+mechanisms for third-party virtual environment creators to customize environment
+creation according to their needs, the :class:`EnvBuilder` class.
+
+.. class:: EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False)
+
+ The :class:`EnvBuilder` class accepts the following keyword arguments on
+ instantiation:
+
+ * ``system_site_packages`` -- a Boolean value indicating that the system Python
+ site-packages should be available to the environment (defaults to ``False``).
+
+ * ``clear`` -- a Boolean value which, if True, will delete any existing target
+ directory instead of raising an exception (defaults to ``False``).
+
+ * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
+ Python binary (and any necessary DLLs or other binaries,
+ e.g. ``pythonw.exe``), rather than copying. Defaults to ``True`` on Linux and
+ Unix systems, but ``False`` on Windows.
+
+ * ``upgrade`` -- a Boolean value which, if True, will upgrade an existing
+ environment with the running Python - for use when that Python has been
+ upgraded in-place (defaults to ``False``).
+
+
+
+ Creators of third-party virtual environment tools will be free to use the
+ provided ``EnvBuilder`` class as a base class.
+
+ The returned env-builder is an object which has a method, ``create``:
+
+ .. method:: create(env_dir)
+
+ This method takes as required argument the path (absolute or relative to
+ the current directory) of the target directory which is to contain the
+ virtual environment. The ``create`` method will either create the
+ environment in the specified directory, or raise an appropriate
+ exception.
+
+ The ``create`` method of the ``EnvBuilder`` class illustrates the hooks
+ available for subclass customization::
+
+ def create(self, env_dir):
+ """
+ Create a virtualized Python environment in a directory.
+ env_dir is the target directory to create an environment in.
+ """
+ env_dir = os.path.abspath(env_dir)
+ context = self.create_directories(env_dir)
+ self.create_configuration(context)
+ self.setup_python(context)
+ self.setup_scripts(context)
+ self.post_setup(context)
+
+ Each of the methods :meth:`create_directories`,
+ :meth:`create_configuration`, :meth:`setup_python`,
+ :meth:`setup_scripts` and :meth:`post_setup` can be overridden.
+
+ .. method:: create_directories(env_dir)
+
+ Creates the environment directory and all necessary directories, and
+ returns a context object. This is just a holder for attributes (such as
+ paths), for use by the other methods.
+
+ .. method:: create_configuration(context)
+
+ Creates the ``pyvenv.cfg`` configuration file in the environment.
+
+ .. method:: setup_python(context)
+
+ Creates a copy of the Python executable (and, under Windows, DLLs) in
+ the environment.
+
+ .. method:: setup_scripts(context)
+
+ Installs activation scripts appropriate to the platform into the virtual
+ environment.
+
+ .. method:: post_setup(context)
+
+ A placeholder method which can be overridden in third party
+ implementations to pre-install packages in the virtual environment or
+ perform other post-creation steps.
+
+ In addition, :class:`EnvBuilder` provides this utility method that can be
+ called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to
+ assist in installing custom scripts into the virtual environment.
+
+ .. method:: install_scripts(context, path)
+
+ *path* is the path to a directory that should contain subdirectories
+ "common", "posix", "nt", each containing scripts destined for the bin
+ directory in the environment. The contents of "common" and the
+ directory corresponding to :data:`os.name` are copied after some text
+ replacement of placeholders:
+
+ * ``__VENV_DIR__`` is replaced with the absolute path of the environment
+ directory.
+
+ * ``__VENV_NAME__`` is replaced with the environment name (final path
+ segment of environment directory).
+
+ * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
+ (either ``bin`` or ``Scripts``).
+
+ * ``__VENV_PYTHON__`` is replaced with the absolute path of the
+ environment's executable.
+
+
+There is also a module-level convenience function:
+
+.. function:: create(env_dir, system_site_packages=False, clear=False, symlinks=False)
+
+ Create an :class:`EnvBuilder` with the given keyword arguments, and call its
+ :meth:`~EnvBuilder.create` method with the *env_dir* argument.
diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst
index 8af19a2..8387f5a 100644
--- a/Doc/library/warnings.rst
+++ b/Doc/library/warnings.rst
@@ -339,8 +339,7 @@ Available Functions
Write a warning to a file. The default implementation calls
``formatwarning(message, category, filename, lineno, line)`` and writes the
resulting string to *file*, which defaults to ``sys.stderr``. You may replace
- this function with an alternative implementation by assigning to
- ``warnings.showwarning``.
+ this function with any callable by assigning to ``warnings.showwarning``.
*line* is a line of source code to be included in the warning
message; if *line* is not supplied, :func:`showwarning` will
try to read the line specified by *filename* and *lineno*.
diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst
index b2dcf8f..9c2b3ab 100644
--- a/Doc/library/webbrowser.rst
+++ b/Doc/library/webbrowser.rst
@@ -98,47 +98,55 @@ A number of browser types are predefined. This table gives the type names that
may be passed to the :func:`get` function and the corresponding instantiations
for the controller classes, all defined in this module.
-+-----------------------+-----------------------------------------+-------+
-| Type Name | Class Name | Notes |
-+=======================+=========================================+=======+
-| ``'mozilla'`` | :class:`Mozilla('mozilla')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'firefox'`` | :class:`Mozilla('mozilla')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'netscape'`` | :class:`Mozilla('netscape')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'galeon'`` | :class:`Galeon('galeon')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'epiphany'`` | :class:`Galeon('epiphany')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'skipstone'`` | :class:`BackgroundBrowser('skipstone')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'kfmclient'`` | :class:`Konqueror()` | \(1) |
-+-----------------------+-----------------------------------------+-------+
-| ``'konqueror'`` | :class:`Konqueror()` | \(1) |
-+-----------------------+-----------------------------------------+-------+
-| ``'kfm'`` | :class:`Konqueror()` | \(1) |
-+-----------------------+-----------------------------------------+-------+
-| ``'mosaic'`` | :class:`BackgroundBrowser('mosaic')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'opera'`` | :class:`Opera()` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'grail'`` | :class:`Grail()` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'links'`` | :class:`GenericBrowser('links')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'elinks'`` | :class:`Elinks('elinks')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'lynx'`` | :class:`GenericBrowser('lynx')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'w3m'`` | :class:`GenericBrowser('w3m')` | |
-+-----------------------+-----------------------------------------+-------+
-| ``'windows-default'`` | :class:`WindowsDefault` | \(2) |
-+-----------------------+-----------------------------------------+-------+
-| ``'macosx'`` | :class:`MacOSX('default')` | \(3) |
-+-----------------------+-----------------------------------------+-------+
-| ``'safari'`` | :class:`MacOSX('safari')` | \(3) |
-+-----------------------+-----------------------------------------+-------+
++------------------------+-----------------------------------------+-------+
+| Type Name | Class Name | Notes |
++========================+=========================================+=======+
+| ``'mozilla'`` | :class:`Mozilla('mozilla')` | |
++------------------------+-----------------------------------------+-------+
+| ``'firefox'`` | :class:`Mozilla('mozilla')` | |
++------------------------+-----------------------------------------+-------+
+| ``'netscape'`` | :class:`Mozilla('netscape')` | |
++------------------------+-----------------------------------------+-------+
+| ``'galeon'`` | :class:`Galeon('galeon')` | |
++------------------------+-----------------------------------------+-------+
+| ``'epiphany'`` | :class:`Galeon('epiphany')` | |
++------------------------+-----------------------------------------+-------+
+| ``'skipstone'`` | :class:`BackgroundBrowser('skipstone')` | |
++------------------------+-----------------------------------------+-------+
+| ``'kfmclient'`` | :class:`Konqueror()` | \(1) |
++------------------------+-----------------------------------------+-------+
+| ``'konqueror'`` | :class:`Konqueror()` | \(1) |
++------------------------+-----------------------------------------+-------+
+| ``'kfm'`` | :class:`Konqueror()` | \(1) |
++------------------------+-----------------------------------------+-------+
+| ``'mosaic'`` | :class:`BackgroundBrowser('mosaic')` | |
++------------------------+-----------------------------------------+-------+
+| ``'opera'`` | :class:`Opera()` | |
++------------------------+-----------------------------------------+-------+
+| ``'grail'`` | :class:`Grail()` | |
++------------------------+-----------------------------------------+-------+
+| ``'links'`` | :class:`GenericBrowser('links')` | |
++------------------------+-----------------------------------------+-------+
+| ``'elinks'`` | :class:`Elinks('elinks')` | |
++------------------------+-----------------------------------------+-------+
+| ``'lynx'`` | :class:`GenericBrowser('lynx')` | |
++------------------------+-----------------------------------------+-------+
+| ``'w3m'`` | :class:`GenericBrowser('w3m')` | |
++------------------------+-----------------------------------------+-------+
+| ``'windows-default'`` | :class:`WindowsDefault` | \(2) |
++------------------------+-----------------------------------------+-------+
+| ``'macosx'`` | :class:`MacOSX('default')` | \(3) |
++------------------------+-----------------------------------------+-------+
+| ``'safari'`` | :class:`MacOSX('safari')` | \(3) |
++------------------------+-----------------------------------------+-------+
+| ``'google-chrome'`` | :class:`Chrome('google-chrome')` | |
++------------------------+-----------------------------------------+-------+
+| ``'chrome'`` | :class:`Chrome('chrome')` | |
++------------------------+-----------------------------------------+-------+
+| ``'chromium'`` | :class:`Chromium('chromium')` | |
++------------------------+-----------------------------------------+-------+
+| ``'chromium-browser'`` | :class:`Chromium('chromium-browser')` | |
++------------------------+-----------------------------------------+-------+
Notes:
@@ -155,12 +163,15 @@ Notes:
(3)
Only on Mac OS X platform.
+.. versionadded:: 3.3
+ Support for Chrome/Chromium has been added.
+
Here are some simple examples::
- url = 'http://www.python.org/'
+ url = 'http://docs.python.org/'
# Open URL in a new tab, if a browser window is already open.
- webbrowser.open_new_tab(url + 'doc/')
+ webbrowser.open_new_tab(url)
# Open URL in new window, raising the window if possible.
webbrowser.open_new(url)
diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst
index cdc07b1..60f3bd9 100644
--- a/Doc/library/winreg.rst
+++ b/Doc/library/winreg.rst
@@ -12,6 +12,17 @@ integer as the registry handle, a :ref:`handle object <handle-object>` is used
to ensure that the handles are closed correctly, even if the programmer neglects
to explicitly close them.
+.. _exception-changed:
+
+.. versionchanged:: 3.3
+ Several functions in this module used to raise a
+ :exc:`WindowsError`, which is now an alias of :exc:`OSError`.
+
+.. _functions:
+
+Functions
+------------------
+
This module offers the following functions:
@@ -37,8 +48,11 @@ This module offers the following functions:
*key* is the predefined handle to connect to.
- The return value is the handle of the opened key. If the function fails, a
- :exc:`WindowsError` exception is raised.
+ The return value is the handle of the opened key. If the function fails, an
+ :exc:`OSError` exception is raised.
+
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
.. function:: CreateKey(key, sub_key)
@@ -56,8 +70,11 @@ This module offers the following functions:
If the key already exists, this function opens the existing key.
- The return value is the handle of the opened key. If the function fails, a
- :exc:`WindowsError` exception is raised.
+ The return value is the handle of the opened key. If the function fails, an
+ :exc:`OSError` exception is raised.
+
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
.. function:: CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE)
@@ -81,11 +98,14 @@ This module offers the following functions:
If the key already exists, this function opens the existing key.
- The return value is the handle of the opened key. If the function fails, a
- :exc:`WindowsError` exception is raised.
+ The return value is the handle of the opened key. If the function fails, an
+ :exc:`OSError` exception is raised.
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
+
.. function:: DeleteKey(key, sub_key)
@@ -100,7 +120,10 @@ This module offers the following functions:
*This method can not delete keys with subkeys.*
If the method succeeds, the entire key, including all of its values, is removed.
- If the method fails, a :exc:`WindowsError` exception is raised.
+ If the method fails, an :exc:`OSError` exception is raised.
+
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
.. function:: DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)
@@ -129,12 +152,15 @@ This module offers the following functions:
*This method can not delete keys with subkeys.*
If the method succeeds, the entire key, including all of its values, is
- removed. If the method fails, a :exc:`WindowsError` exception is raised.
+ removed. If the method fails, an :exc:`OSError` exception is raised.
On unsupported Windows versions, :exc:`NotImplementedError` is raised.
.. versionadded:: 3.2
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
+
.. function:: DeleteValue(key, value)
@@ -156,9 +182,12 @@ This module offers the following functions:
*index* is an integer that identifies the index of the key to retrieve.
The function retrieves the name of one subkey each time it is called. It is
- typically called repeatedly until a :exc:`WindowsError` exception is
+ typically called repeatedly until an :exc:`OSError` exception is
raised, indicating, no more values are available.
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
+
.. function:: EnumValue(key, index)
@@ -170,7 +199,7 @@ This module offers the following functions:
*index* is an integer that identifies the index of the value to retrieve.
The function retrieves the name of one subkey each time it is called. It is
- typically called repeatedly, until a :exc:`WindowsError` exception is
+ typically called repeatedly, until an :exc:`OSError` exception is
raised, indicating no more values.
The result is a tuple of 3 items:
@@ -189,6 +218,9 @@ This module offers the following functions:
| | :meth:`SetValueEx`) |
+-------+--------------------------------------------+
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
+
.. function:: ExpandEnvironmentStrings(str)
@@ -261,9 +293,13 @@ This module offers the following functions:
The result is a new handle to the specified key.
- If the function fails, :exc:`WindowsError` is raised.
+ If the function fails, :exc:`OSError` is raised.
+
+ .. versionchanged:: 3.2
+ Allow the use of named arguments.
- .. versionchanged:: 3.2 Allow the use of named arguments.
+ .. versionchanged:: 3.3
+ See :ref:`above <exception-changed>`.
.. function:: QueryInfoKey(key)
diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst
index 1fd3451..1cef2e9 100644
--- a/Doc/library/wsgiref.rst
+++ b/Doc/library/wsgiref.rst
@@ -609,6 +609,9 @@ input, output, and error streams.
as :class:`BaseCGIHandler` and :class:`CGIHandler`) that are not HTTP origin
servers.
+ .. versionchanged:: 3.3
+ The term "Python" is replaced with implementation specific term like
+ "CPython", "Jython" etc.
.. method:: BaseHandler.get_scheme()
diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst
index ae286b0..a5c6fb2 100644
--- a/Doc/library/xml.dom.minidom.rst
+++ b/Doc/library/xml.dom.minidom.rst
@@ -147,12 +147,7 @@ module documentation. This section lists the differences between the API and
the DOM node.
With an explicit *encoding* [1]_ argument, the result is a byte
- string in the specified encoding. It is recommended that you
- always specify an encoding; you may use any encoding you like, but
- an argument of "utf-8" is the most common choice, avoiding
- :exc:`UnicodeError` exceptions in case of unrepresentable text
- data.
-
+ string in the specified encoding.
With no *encoding* argument, the result is a Unicode string, and the
XML declaration in the resulting string does not specify an
encoding. Encoding this string in an encoding other than UTF-8 is
diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
index c5c8802..26f1fbe 100644
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -5,49 +5,323 @@
:synopsis: Implementation of the ElementTree API.
.. moduleauthor:: Fredrik Lundh <fredrik@pythonware.com>
-**Source code:** :source:`Lib/xml/etree/ElementTree.py`
+The :mod:`xml.etree.ElementTree` module implements a simple and efficient API
+for parsing and creating XML data.
+
+.. versionchanged:: 3.3
+ This module will use a fast implementation whenever available.
+ The :mod:`xml.etree.cElementTree` module is deprecated.
+
+Tutorial
+--------
+
+This is a short tutorial for using :mod:`xml.etree.ElementTree` (``ET`` in
+short). The goal is to demonstrate some of the building blocks and basic
+concepts of the module.
+
+XML tree and elements
+^^^^^^^^^^^^^^^^^^^^^
+
+XML is an inherently hierarchical data format, and the most natural way to
+represent it is with a tree. ``ET`` has two classes for this purpose -
+:class:`ElementTree` represents the whole XML document as a tree, and
+:class:`Element` represents a single node in this tree. Interactions with
+the whole document (reading and writing to/from files) are usually done
+on the :class:`ElementTree` level. Interactions with a single XML element
+and its sub-elements are done on the :class:`Element` level.
+
+.. _elementtree-parsing-xml:
+
+Parsing XML
+^^^^^^^^^^^
+
+We'll be using the following XML document as the sample data for this section:
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <data>
+ <country name="Liechtenstein">
+ <rank>1</rank>
+ <year>2008</year>
+ <gdppc>141100</gdppc>
+ <neighbor name="Austria" direction="E"/>
+ <neighbor name="Switzerland" direction="W"/>
+ </country>
+ <country name="Singapore">
+ <rank>4</rank>
+ <year>2011</year>
+ <gdppc>59900</gdppc>
+ <neighbor name="Malaysia" direction="N"/>
+ </country>
+ <country name="Panama">
+ <rank>68</rank>
+ <year>2011</year>
+ <gdppc>13600</gdppc>
+ <neighbor name="Costa Rica" direction="W"/>
+ <neighbor name="Colombia" direction="E"/>
+ </country>
+ </data>
+
+We can import this data by reading from a file::
+
+ import xml.etree.ElementTree as ET
+ tree = ET.parse('country_data.xml')
+ root = tree.getroot()
+
+Or directly from a string::
+
+ root = ET.fromstring(country_data_as_string)
+
+:func:`fromstring` parses XML from a string directly into an :class:`Element`,
+which is the root element of the parsed tree. Other parsing functions may
+create an :class:`ElementTree`. Check the documentation to be sure.
+
+As an :class:`Element`, ``root`` has a tag and a dictionary of attributes::
+
+ >>> root.tag
+ 'data'
+ >>> root.attrib
+ {}
+
+It also has children nodes over which we can iterate::
+
+ >>> for child in root:
+ ... print(child.tag, child.attrib)
+ ...
+ country {'name': 'Liechtenstein'}
+ country {'name': 'Singapore'}
+ country {'name': 'Panama'}
+
+Children are nested, and we can access specific child nodes by index::
+
+ >>> root[0][1].text
+ '2008'
+
+Finding interesting elements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+:class:`Element` has some useful methods that help iterate recursively over all
+the sub-tree below it (its children, their children, and so on). For example,
+:meth:`Element.iter`::
+
+ >>> for neighbor in root.iter('neighbor'):
+ ... print(neighbor.attrib)
+ ...
+ {'name': 'Austria', 'direction': 'E'}
+ {'name': 'Switzerland', 'direction': 'W'}
+ {'name': 'Malaysia', 'direction': 'N'}
+ {'name': 'Costa Rica', 'direction': 'W'}
+ {'name': 'Colombia', 'direction': 'E'}
+
+:meth:`Element.findall` finds only elements with a tag which are direct
+children of the current element. :meth:`Element.find` finds the *first* child
+with a particular tag, and :meth:`Element.text` accesses the element's text
+content. :meth:`Element.get` accesses the element's attributes::
+
+ >>> for country in root.findall('country'):
+ ... rank = country.find('rank').text
+ ... name = country.get('name')
+ ... print(name, rank)
+ ...
+ Liechtenstein 1
+ Singapore 4
+ Panama 68
+
+More sophisticated specification of which elements to look for is possible by
+using :ref:`XPath <elementtree-xpath>`.
+
+Modifying an XML File
+^^^^^^^^^^^^^^^^^^^^^
+
+:class:`ElementTree` provides a simple way to build XML documents and write them to files.
+The :meth:`ElementTree.write` method serves this purpose.
+
+Once created, an :class:`Element` object may be manipulated by directly changing
+its fields (such as :attr:`Element.text`), adding and modifying attributes
+(:meth:`Element.set` method), as well as adding new children (for example
+with :meth:`Element.append`).
+
+Let's say we want to add one to each country's rank, and add an ``updated``
+attribute to the rank element::
+
+ >>> for rank in root.iter('rank'):
+ ... new_rank = int(rank.text) + 1
+ ... rank.text = str(new_rank)
+ ... rank.set('updated', 'yes')
+ ...
+ >>> tree.write('output.xml')
+
+Our XML now looks like this:
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <data>
+ <country name="Liechtenstein">
+ <rank updated="yes">2</rank>
+ <year>2008</year>
+ <gdppc>141100</gdppc>
+ <neighbor name="Austria" direction="E"/>
+ <neighbor name="Switzerland" direction="W"/>
+ </country>
+ <country name="Singapore">
+ <rank updated="yes">5</rank>
+ <year>2011</year>
+ <gdppc>59900</gdppc>
+ <neighbor name="Malaysia" direction="N"/>
+ </country>
+ <country name="Panama">
+ <rank updated="yes">69</rank>
+ <year>2011</year>
+ <gdppc>13600</gdppc>
+ <neighbor name="Costa Rica" direction="W"/>
+ <neighbor name="Colombia" direction="E"/>
+ </country>
+ </data>
+
+We can remove elements using :meth:`Element.remove`. Let's say we want to
+remove all countries with a rank higher than 50::
+
+ >>> for country in root.findall('country'):
+ ... rank = int(country.find('rank').text)
+ ... if rank > 50:
+ ... root.remove(country)
+ ...
+ >>> tree.write('output.xml')
+
+Our XML now looks like this:
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <data>
+ <country name="Liechtenstein">
+ <rank updated="yes">2</rank>
+ <year>2008</year>
+ <gdppc>141100</gdppc>
+ <neighbor name="Austria" direction="E"/>
+ <neighbor name="Switzerland" direction="W"/>
+ </country>
+ <country name="Singapore">
+ <rank updated="yes">5</rank>
+ <year>2011</year>
+ <gdppc>59900</gdppc>
+ <neighbor name="Malaysia" direction="N"/>
+ </country>
+ </data>
+
+Building XML documents
+^^^^^^^^^^^^^^^^^^^^^^
+
+The :func:`SubElement` function also provides a convenient way to create new
+sub-elements for a given element::
+
+ >>> a = ET.Element('a')
+ >>> b = ET.SubElement(a, 'b')
+ >>> c = ET.SubElement(a, 'c')
+ >>> d = ET.SubElement(c, 'd')
+ >>> ET.dump(a)
+ <a><b /><c><d /></c></a>
+
+Additional resources
+^^^^^^^^^^^^^^^^^^^^
---------------
-
-The :class:`Element` type is a flexible container object, designed to store
-hierarchical data structures in memory. The type can be described as a cross
-between a list and a dictionary.
-
-Each element has a number of properties associated with it:
-
-* a tag which is a string identifying what kind of data this element represents
- (the element type, in other words).
-
-* a number of attributes, stored in a Python dictionary.
-
-* a text string.
-
-* an optional tail string.
-
-* a number of child elements, stored in a Python sequence
-
-To create an element instance, use the :class:`Element` constructor or the
-:func:`SubElement` factory function.
-
-The :class:`ElementTree` class can be used to wrap an element structure, and
-convert it from and to XML.
+See http://effbot.org/zone/element-index.htm for tutorials and links to other
+docs.
-A C implementation of this API is available as :mod:`xml.etree.cElementTree`.
-See http://effbot.org/zone/element-index.htm for tutorials and links to other
-docs. Fredrik Lundh's page is also the location of the development version of
-the xml.etree.ElementTree.
+.. _elementtree-xpath:
-.. versionchanged:: 3.2
- The ElementTree API is updated to 1.3. For more information, see
- `Introducing ElementTree 1.3
- <http://effbot.org/zone/elementtree-13-intro.htm>`_.
+XPath support
+-------------
+This module provides limited support for
+`XPath expressions <http://www.w3.org/TR/xpath>`_ for locating elements in a
+tree. The goal is to support a small subset of the abbreviated syntax; a full
+XPath engine is outside the scope of the module.
+
+Example
+^^^^^^^
+
+Here's an example that demonstrates some of the XPath capabilities of the
+module. We'll be using the ``countrydata`` XML document from the
+:ref:`Parsing XML <elementtree-parsing-xml>` section::
+
+ import xml.etree.ElementTree as ET
+
+ root = ET.fromstring(countrydata)
+
+ # Top-level elements
+ root.findall(".")
+
+ # All 'neighbor' grand-children of 'country' children of the top-level
+ # elements
+ root.findall("./country/neighbor")
+
+ # Nodes with name='Singapore' that have a 'year' child
+ root.findall(".//year/..[@name='Singapore']")
+
+ # 'year' nodes that are children of nodes with name='Singapore'
+ root.findall(".//*[@name='Singapore']/year")
+
+ # All 'neighbor' nodes that are the second child of their parent
+ root.findall(".//neighbor[2]")
+
+Supported XPath syntax
+^^^^^^^^^^^^^^^^^^^^^^
+
++-----------------------+------------------------------------------------------+
+| Syntax | Meaning |
++=======================+======================================================+
+| ``tag`` | Selects all child elements with the given tag. |
+| | For example, ``spam`` selects all child elements |
+| | named ``spam``, ``spam/egg`` selects all |
+| | grandchildren named ``egg`` in all children named |
+| | ``spam``. |
++-----------------------+------------------------------------------------------+
+| ``*`` | Selects all child elements. For example, ``*/egg`` |
+| | selects all grandchildren named ``egg``. |
++-----------------------+------------------------------------------------------+
+| ``.`` | Selects the current node. This is mostly useful |
+| | at the beginning of the path, to indicate that it's |
+| | a relative path. |
++-----------------------+------------------------------------------------------+
+| ``//`` | Selects all subelements, on all levels beneath the |
+| | current element. For example, ``.//egg`` selects |
+| | all ``egg`` elements in the entire tree. |
++-----------------------+------------------------------------------------------+
+| ``..`` | Selects the parent element. Returns ``None`` if the |
+| | path attempts to reach the ancestors of the start |
+| | element (the element ``find`` was called on). |
++-----------------------+------------------------------------------------------+
+| ``[@attrib]`` | Selects all elements that have the given attribute. |
++-----------------------+------------------------------------------------------+
+| ``[@attrib='value']`` | Selects all elements for which the given attribute |
+| | has the given value. The value cannot contain |
+| | quotes. |
++-----------------------+------------------------------------------------------+
+| ``[tag]`` | Selects all elements that have a child named |
+| | ``tag``. Only immediate children are supported. |
++-----------------------+------------------------------------------------------+
+| ``[position]`` | Selects all elements that are located at the given |
+| | position. The position can be either an integer |
+| | (1 is the first position), the expression ``last()`` |
+| | (for the last position), or a position relative to |
+| | the last position (e.g. ``last()-1``). |
++-----------------------+------------------------------------------------------+
+
+Predicates (expressions within square brackets) must be preceded by a tag
+name, an asterisk, or another predicate. ``position`` predicates must be
+preceded by a tag name.
+
+Reference
+---------
.. _elementtree-functions:
Functions
----------
+^^^^^^^^^
.. function:: Comment(text=None)
@@ -159,9 +433,9 @@ Functions
Generates a string representation of an XML element, including all
subelements. *element* is an :class:`Element` instance. *encoding* [1]_ is
the output encoding (default is US-ASCII). Use ``encoding="unicode"`` to
- generate a Unicode string. *method* is either ``"xml"``,
- ``"html"`` or ``"text"`` (default is ``"xml"``). Returns an (optionally)
- encoded string containing the XML data.
+ generate a Unicode string (otherwise, a bytestring is generated). *method*
+ is either ``"xml"``, ``"html"`` or ``"text"`` (default is ``"xml"``).
+ Returns an (optionally) encoded string containing the XML data.
.. function:: tostringlist(element, encoding="us-ascii", method="xml")
@@ -169,11 +443,11 @@ Functions
Generates a string representation of an XML element, including all
subelements. *element* is an :class:`Element` instance. *encoding* [1]_ is
the output encoding (default is US-ASCII). Use ``encoding="unicode"`` to
- generate a Unicode string. *method* is either ``"xml"``,
- ``"html"`` or ``"text"`` (default is ``"xml"``). Returns a list of
- (optionally) encoded strings containing the XML data. It does not guarantee
- any specific sequence, except that ``"".join(tostringlist(element)) ==
- tostring(element)``.
+ generate a Unicode string (otherwise, a bytestring is generated). *method*
+ is either ``"xml"``, ``"html"`` or ``"text"`` (default is ``"xml"``).
+ Returns a list of (optionally) encoded strings containing the XML data.
+ It does not guarantee any specific sequence, except that
+ ``"".join(tostringlist(element)) == tostring(element)``.
.. versionadded:: 3.2
@@ -198,8 +472,7 @@ Functions
.. _elementtree-element-objects:
Element Objects
----------------
-
+^^^^^^^^^^^^^^^
.. class:: Element(tag, attrib={}, **extra)
@@ -250,7 +523,7 @@ Element Objects
.. method:: clear()
Resets an element. This function removes all subelements, clears all
- attributes, and sets the text and tail attributes to None.
+ attributes, and sets the text and tail attributes to ``None``.
.. method:: get(key, default=None)
@@ -281,36 +554,43 @@ Element Objects
.. method:: append(subelement)
- Adds the element *subelement* to the end of this elements internal list
- of subelements.
+ Adds the element *subelement* to the end of this element's internal list
+ of subelements. Raises :exc:`TypeError` if *subelement* is not an
+ :class:`Element`.
.. method:: extend(subelements)
Appends *subelements* from a sequence object with zero or more elements.
- Raises :exc:`AssertionError` if a subelement is not a valid object.
+ Raises :exc:`TypeError` if a subelement is not an :class:`Element`.
.. versionadded:: 3.2
- .. method:: find(match)
+ .. method:: find(match, namespaces=None)
Finds the first subelement matching *match*. *match* may be a tag name
- or path. Returns an element instance or ``None``.
+ or a :ref:`path <elementtree-xpath>`. Returns an element instance
+ or ``None``. *namespaces* is an optional mapping from namespace prefix
+ to full name.
- .. method:: findall(match)
+ .. method:: findall(match, namespaces=None)
- Finds all matching subelements, by tag name or path. Returns a list
- containing all matching elements in document order.
+ Finds all matching subelements, by tag name or
+ :ref:`path <elementtree-xpath>`. Returns a list containing all matching
+ elements in document order. *namespaces* is an optional mapping from
+ namespace prefix to full name.
- .. method:: findtext(match, default=None)
+ .. method:: findtext(match, default=None, namespaces=None)
Finds text for the first subelement matching *match*. *match* may be
- a tag name or path. Returns the text content of the first matching
- element, or *default* if no element was found. Note that if the matching
- element has no text content an empty string is returned.
+ a tag name or a :ref:`path <elementtree-xpath>`. Returns the text content
+ of the first matching element, or *default* if no element was found.
+ Note that if the matching element has no text content an empty string
+ is returned. *namespaces* is an optional mapping from namespace prefix
+ to full name.
.. method:: getchildren()
@@ -325,9 +605,10 @@ Element Objects
Use method :meth:`Element.iter` instead.
- .. method:: insert(index, element)
+ .. method:: insert(index, subelement)
- Inserts a subelement at the given position in this element.
+ Inserts *subelement* at the given position in this element. Raises
+ :exc:`TypeError` if *subelement* is not an :class:`Element`.
.. method:: iter(tag=None)
@@ -341,10 +622,13 @@ Element Objects
.. versionadded:: 3.2
- .. method:: iterfind(match)
+ .. method:: iterfind(match, namespaces=None)
+
+ Finds all matching subelements, by tag name or
+ :ref:`path <elementtree-xpath>`. Returns an iterable yielding all
+ matching elements in document order. *namespaces* is an optional mapping
+ from namespace prefix to full name.
- Finds all matching subelements, by tag name or path. Returns an iterable
- yielding all matching elements in document order.
.. versionadded:: 3.2
@@ -389,7 +673,7 @@ Element Objects
.. _elementtree-elementtree-objects:
ElementTree Objects
--------------------
+^^^^^^^^^^^^^^^^^^^
.. class:: ElementTree(element=None, file=None)
@@ -409,28 +693,19 @@ ElementTree Objects
care. *element* is an element instance.
- .. method:: find(match)
+ .. method:: find(match, namespaces=None)
- Finds the first toplevel element matching *match*. *match* may be a tag
- name or path. Same as getroot().find(match). Returns the first matching
- element, or ``None`` if no element was found.
+ Same as :meth:`Element.find`, starting at the root of the tree.
- .. method:: findall(match)
+ .. method:: findall(match, namespaces=None)
- Finds all matching subelements, by tag name or path. Same as
- getroot().findall(match). *match* may be a tag name or path. Returns a
- list containing all matching elements, in document order.
+ Same as :meth:`Element.findall`, starting at the root of the tree.
- .. method:: findtext(match, default=None)
+ .. method:: findtext(match, default=None, namespaces=None)
- Finds the element text for the first toplevel element with given tag.
- Same as getroot().findtext(match). *match* may be a tag name or path.
- *default* is the value to return if the element was not found. Returns
- the text content of the first matching element, or the default value no
- element was found. Note that if the element is found, but has no text
- content, this method returns an empty string.
+ Same as :meth:`Element.findtext`, starting at the root of the tree.
.. method:: getiterator(tag=None)
@@ -451,11 +726,9 @@ ElementTree Objects
to look for (default is to return all elements)
- .. method:: iterfind(match)
+ .. method:: iterfind(match, namespaces=None)
- Finds all matching subelements, by tag name or path. Same as
- getroot().iterfind(match). Returns an iterable yielding all matching
- elements in document order.
+ Same as :meth:`Element.iterfind`, starting at the root of the tree.
.. versionadded:: 3.2
@@ -464,20 +737,29 @@ ElementTree Objects
Loads an external XML section into this element tree. *source* is a file
name or :term:`file object`. *parser* is an optional parser instance.
- If not given, the standard XMLParser parser is used. Returns the section
- root element.
+ If not given, the standard :class:`XMLParser` parser is used. Returns the
+ section root element.
- .. method:: write(file, encoding="us-ascii", xml_declaration=None, method="xml")
+ .. method:: write(file, encoding="us-ascii", xml_declaration=None, \
+ method="xml")
Writes the element tree to a file, as XML. *file* is a file name, or a
- :term:`file object` opened for writing. *encoding* [1]_ is the output encoding
- (default is US-ASCII). Use ``encoding="unicode"`` to write a Unicode string.
- *xml_declaration* controls if an XML declaration
- should be added to the file. Use False for never, True for always, None
- for only if not US-ASCII or UTF-8 or Unicode (default is None). *method* is
- either ``"xml"``, ``"html"`` or ``"text"`` (default is ``"xml"``).
- Returns an (optionally) encoded string.
+ :term:`file object` opened for writing. *encoding* [1]_ is the output
+ encoding (default is US-ASCII).
+ *xml_declaration* controls if an XML declaration should be added to the
+ file. Use ``False`` for never, ``True`` for always, ``None``
+ for only if not US-ASCII or UTF-8 or Unicode (default is ``None``).
+ *method* is either ``"xml"``, ``"html"`` or ``"text"`` (default is
+ ``"xml"``).
+
+ The output is either a string (:class:`str`) or binary (:class:`bytes`).
+ This is controlled by the *encoding* argument. If *encoding* is
+ ``"unicode"``, the output is a string; otherwise, it's binary. Note that
+ this may conflict with the type of *file* if it's an open
+ :term:`file object`; make sure you do not try to write a string to a
+ binary stream and vice versa.
+
This is the XML file that is going to be manipulated::
@@ -510,7 +792,7 @@ Example of changing the attribute "target" of every link in first paragraph::
.. _elementtree-qname-objects:
QName Objects
--------------
+^^^^^^^^^^^^^
.. class:: QName(text_or_uri, tag=None)
@@ -526,7 +808,7 @@ QName Objects
.. _elementtree-treebuilder-objects:
TreeBuilder Objects
--------------------
+^^^^^^^^^^^^^^^^^^^
.. class:: TreeBuilder(element_factory=None)
@@ -534,9 +816,9 @@ TreeBuilder Objects
Generic element structure builder. This builder converts a sequence of
start, data, and end method calls to a well-formed element structure. You
can use this class to build an element structure using a custom XML parser,
- or a parser for some other XML-like format. The *element_factory* is called
- to create new :class:`Element` instances when given.
-
+ or a parser for some other XML-like format. *element_factory*, when given,
+ must be a callable accepting two positional arguments: a tag and
+ a dict of attributes. It is expected to return a new element instance.
.. method:: close()
@@ -577,7 +859,7 @@ TreeBuilder Objects
.. _elementtree-xmlparser-objects:
XMLParser Objects
------------------
+^^^^^^^^^^^^^^^^^
.. class:: XMLParser(html=0, target=None, encoding=None)
@@ -585,9 +867,9 @@ XMLParser Objects
:class:`Element` structure builder for XML source data, based on the expat
parser. *html* are predefined HTML entities. This flag is not supported by
the current implementation. *target* is the target object. If omitted, the
- builder uses an instance of the standard TreeBuilder class. *encoding* [1]_
- is optional. If given, the value overrides the encoding specified in the
- XML file.
+ builder uses an instance of the standard :class:`TreeBuilder` class.
+ *encoding* [1]_ is optional. If given, the value overrides the encoding
+ specified in the XML file.
.. method:: close()
@@ -645,6 +927,24 @@ This is an example of counting the maximum depth of an XML file::
>>> parser.close()
4
+Exceptions
+^^^^^^^^^^
+
+.. class:: ParseError
+
+ XML parse error, raised by the various parsing methods in this module when
+ parsing fails. The string representation of an instance of this exception
+ will contain a user-friendly error message. In addition, it will have
+ the following attributes available:
+
+ .. attribute:: code
+
+ A numeric error code from the expat parser. See the documentation of
+ :mod:`xml.parsers.expat` for the list of error codes and their meanings.
+
+ .. attribute:: position
+
+ A tuple of *line*, *column* numbers, specifying where the error occurred.
.. rubric:: Footnotes
diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst
new file mode 100644
index 0000000..21b2e23
--- /dev/null
+++ b/Doc/library/xml.rst
@@ -0,0 +1,29 @@
+.. _xml:
+
+XML Processing Modules
+======================
+
+Python's interfaces for processing XML are grouped in the ``xml`` package.
+
+It is important to note that modules in the :mod:`xml` package require that
+there be at least one SAX-compliant XML parser available. The Expat parser is
+included with Python, so the :mod:`xml.parsers.expat` module will always be
+available.
+
+The documentation for the :mod:`xml.dom` and :mod:`xml.sax` packages are the
+definition of the Python bindings for the DOM and SAX interfaces.
+
+The XML handling submodules are:
+
+* :mod:`xml.etree.ElementTree`: the ElementTree API, a simple and lightweight
+
+..
+
+* :mod:`xml.dom`: the DOM API definition
+* :mod:`xml.dom.minidom`: a lightweight DOM implementation
+* :mod:`xml.dom.pulldom`: support for building partial DOM trees
+
+..
+
+* :mod:`xml.sax`: SAX2 base classes and convenience functions
+* :mod:`xml.parsers.expat`: the Expat parser binding
diff --git a/Doc/library/xml.sax.utils.rst b/Doc/library/xml.sax.utils.rst
index ff36fd8..0a4038c 100644
--- a/Doc/library/xml.sax.utils.rst
+++ b/Doc/library/xml.sax.utils.rst
@@ -62,7 +62,7 @@ or as base classes.
tags, if set to *True* they are emitted as a single self-closed tag.
.. versionadded:: 3.2
- short_empty_elements
+ The *short_empty_elements* parameter.
.. class:: XMLFilterBase(base)
diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst
index e72770a..1871c99 100644
--- a/Doc/library/xmlrpc.client.rst
+++ b/Doc/library/xmlrpc.client.rst
@@ -8,7 +8,7 @@
.. XXX Not everything is documented yet. It might be good to describe
- Marshaller, Unmarshaller, getparser, dumps, loads, and Transport.
+ Marshaller, Unmarshaller, getparser and Transport.
**Source code:** :source:`Lib/xmlrpc/client.py`
@@ -21,7 +21,12 @@ supports writing XML-RPC client code; it handles all the details of translating
between conformable Python objects and XML on the wire.
-.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False)
+.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, \
+ allow_none=False, use_datetime=False, \
+ use_builtin_types=False)
+
+ .. versionchanged:: 3.3
+ The *use_builtin_types* flag was added.
A :class:`ServerProxy` instance is an object that manages communication with a
remote XML-RPC server. The required first argument is a URI (Uniform Resource
@@ -34,9 +39,13 @@ between conformable Python objects and XML on the wire.
XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
a commonly-used extension to the XML-RPC specification, but isn't supported by
all clients and servers; see http://ontosys.com/xml-rpc/extensions.php for a
- description. The *use_datetime* flag can be used to cause date/time values to
- be presented as :class:`datetime.datetime` objects; this is false by default.
- :class:`datetime.datetime` objects may be passed to calls.
+ description. The *use_builtin_types* flag can be used to cause date/time values
+ to be presented as :class:`datetime.datetime` objects and binary data to be
+ presented as :class:`bytes` objects; this flag is false by default.
+ :class:`datetime.datetime` and :class:`bytes` objects may be passed to calls.
+
+ The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
+ applies only to date/time values.
Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass``
@@ -78,12 +87,12 @@ between conformable Python objects and XML on the wire.
| | only their *__dict__* attribute is |
| | transmitted. |
+---------------------------------+---------------------------------------------+
- | :const:`dates` | in seconds since the epoch (pass in an |
- | | instance of the :class:`DateTime` class) or |
+ | :const:`dates` | In seconds since the epoch. Pass in an |
+ | | instance of the :class:`DateTime` class or |
| | a :class:`datetime.datetime` instance. |
+---------------------------------+---------------------------------------------+
- | :const:`binary data` | pass in an instance of the :class:`Binary` |
- | | wrapper class |
+ | :const:`binary data` | Pass in an instance of the :class:`Binary` |
+ | | wrapper class or a :class:`bytes` instance. |
+---------------------------------+---------------------------------------------+
This is the full set of data types supported by XML-RPC. Method calls may also
@@ -98,8 +107,9 @@ between conformable Python objects and XML on the wire.
ensure that the string is free of characters that aren't allowed in XML, such as
the control characters with ASCII values between 0 and 31 (except, of course,
tab, newline and carriage return); failing to do this will result in an XML-RPC
- request that isn't well-formed XML. If you have to pass arbitrary strings via
- XML-RPC, use the :class:`Binary` wrapper class described below.
+ request that isn't well-formed XML. If you have to pass arbitrary bytes
+ via XML-RPC, use the :class:`bytes` class or the class:`Binary` wrapper class
+ described below.
:class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
compatibility. New code should use :class:`ServerProxy`.
@@ -249,7 +259,7 @@ The client code for the preceding server::
Binary Objects
--------------
-This class may be initialized from string data (which may include NULs). The
+This class may be initialized from bytes data (which may include NULs). The
primary access to the content of a :class:`Binary` object is provided by an
attribute:
@@ -257,15 +267,15 @@ attribute:
.. attribute:: Binary.data
The binary data encapsulated by the :class:`Binary` instance. The data is
- provided as an 8-bit string.
+ provided as a :class:`bytes` object.
:class:`Binary` objects have the following methods, supported mainly for
internal use by the marshalling/unmarshalling code:
-.. method:: Binary.decode(string)
+.. method:: Binary.decode(bytes)
- Accept a base64 string and decode it as the instance's new data.
+ Accept a base64 :class:`bytes` object and decode it as the instance's new data.
.. method:: Binary.encode(out)
@@ -471,14 +481,21 @@ Convenience Functions
it via an extension, provide a true value for *allow_none*.
-.. function:: loads(data, use_datetime=False)
+.. function:: loads(data, use_datetime=False, use_builtin_types=False)
Convert an XML-RPC request or response into Python objects, a ``(params,
methodname)``. *params* is a tuple of argument; *methodname* is a string, or
``None`` if no method name is present in the packet. If the XML-RPC packet
represents a fault condition, this function will raise a :exc:`Fault` exception.
- The *use_datetime* flag can be used to cause date/time values to be presented as
- :class:`datetime.datetime` objects; this is false by default.
+ The *use_builtin_types* flag can be used to cause date/time values to be
+ presented as :class:`datetime.datetime` objects and binary data to be
+ presented as :class:`bytes` objects; this flag is false by default.
+
+ The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
+ applies only to date/time values.
+
+ .. versionchanged:: 3.3
+ The *use_builtin_types* flag was added.
.. _xmlrpc-client-example:
diff --git a/Doc/library/xmlrpc.rst b/Doc/library/xmlrpc.rst
new file mode 100644
index 0000000..ae68157
--- /dev/null
+++ b/Doc/library/xmlrpc.rst
@@ -0,0 +1,12 @@
+:mod:`xmlrpc` --- XMLRPC server and client modules
+==================================================
+
+XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a
+transport. With it, a client can call methods with parameters on a remote
+server (the server is named by a URI) and get back structured data.
+
+``xmlrpc`` is a package that collects server and client modules implementing
+XML-RPC. The modules are:
+
+* :mod:`xmlrpc.client`
+* :mod:`xmlrpc.server`
diff --git a/Doc/library/xmlrpc.server.rst b/Doc/library/xmlrpc.server.rst
index 67feba6..6493fd4 100644
--- a/Doc/library/xmlrpc.server.rst
+++ b/Doc/library/xmlrpc.server.rst
@@ -16,7 +16,9 @@ servers written in Python. Servers can either be free standing, using
:class:`CGIXMLRPCRequestHandler`.
-.. class:: SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)
+.. class:: SimpleXMLRPCServer(addr, requestHandler=SimpleXMLRPCRequestHandler,\
+ logRequests=True, allow_none=False, encoding=None,\
+ bind_and_activate=True, use_builtin_types=False)
Create a new server instance. This class provides methods for registration of
functions that can be called by the XML-RPC protocol. The *requestHandler*
@@ -25,18 +27,31 @@ servers written in Python. Servers can either be free standing, using
are passed to the :class:`socketserver.TCPServer` constructor. If *logRequests*
is true (the default), requests will be logged; setting this parameter to false
will turn off logging. The *allow_none* and *encoding* parameters are passed
- on to :mod:`xmlrpc.client` and control the XML-RPC responses that will be returned
+ on to :mod:`xmlrpc.client` and control the XML-RPC responses that will be returned
from the server. The *bind_and_activate* parameter controls whether
:meth:`server_bind` and :meth:`server_activate` are called immediately by the
constructor; it defaults to true. Setting it to false allows code to manipulate
the *allow_reuse_address* class variable before the address is bound.
+ The *use_builtin_types* parameter is passed to the
+ :func:`~xmlrpc.client.loads` function and controls which types are processed
+ when date/times values or binary data are received; it defaults to false.
+ .. versionchanged:: 3.3
+ The *use_builtin_types* flag was added.
-.. class:: CGIXMLRPCRequestHandler(allow_none=False, encoding=None)
+
+.. class:: CGIXMLRPCRequestHandler(allow_none=False, encoding=None,\
+ use_builtin_types=False)
Create a new instance to handle XML-RPC requests in a CGI environment. The
*allow_none* and *encoding* parameters are passed on to :mod:`xmlrpc.client`
and control the XML-RPC responses that will be returned from the server.
+ The *use_builtin_types* parameter is passed to the
+ :func:`~xmlrpc.client.loads` function and controls which types are processed
+ when date/times values or binary data are received; it defaults to false.
+
+ .. versionchanged:: 3.3
+ The *use_builtin_types* flag was added.
.. class:: SimpleXMLRPCRequestHandler()
@@ -233,12 +248,17 @@ to HTTP GET requests. Servers can either be free standing, using
:class:`DocCGIXMLRPCRequestHandler`.
-.. class:: DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True)
+.. class:: DocXMLRPCServer(addr, requestHandler=DocXMLRPCRequestHandler,\
+ logRequests=True, allow_none=False, encoding=None,\
+ bind_and_activate=True, use_builtin_types=True)
Create a new server instance. All parameters have the same meaning as for
:class:`SimpleXMLRPCServer`; *requestHandler* defaults to
:class:`DocXMLRPCRequestHandler`.
+ .. versionchanged:: 3.3
+ The *use_builtin_types* flag was added.
+
.. class:: DocCGIXMLRPCRequestHandler()
diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst
index 264cd47..9f6e077 100644
--- a/Doc/library/zipfile.rst
+++ b/Doc/library/zipfile.rst
@@ -87,7 +87,30 @@ The module defines the following items:
.. data:: ZIP_DEFLATED
The numeric constant for the usual ZIP compression method. This requires the
- :mod:`zlib` module. No other compression methods are currently supported.
+ :mod:`zlib` module.
+
+
+.. data:: ZIP_BZIP2
+
+ The numeric constant for the BZIP2 compression method. This requires the
+ :mod:`bz2` module.
+
+ .. versionadded:: 3.3
+
+.. data:: ZIP_LZMA
+
+ The numeric constant for the LZMA compression method. This requires the
+ :mod:`lzma` module.
+
+ .. versionadded:: 3.3
+
+ .. note::
+
+ The ZIP file format specification has included support for bzip2 compression
+ since 2001, and for LZMA compression since 2006. However, some tools
+ (including older Python releases) do not support these compression
+ methods, and may either refuse to process the ZIP file altogether,
+ or fail to extract individual files.
.. seealso::
@@ -118,9 +141,11 @@ ZipFile Objects
adding a ZIP archive to another file (such as :file:`python.exe`). If
*mode* is ``a`` and the file does not exist at all, it is created.
*compression* is the ZIP compression method to use when writing the archive,
- and should be :const:`ZIP_STORED` or :const:`ZIP_DEFLATED`; unrecognized
- values will cause :exc:`RuntimeError` to be raised. If :const:`ZIP_DEFLATED`
- is specified but the :mod:`zlib` module is not available, :exc:`RuntimeError`
+ and should be :const:`ZIP_STORED`, :const:`ZIP_DEFLATED`,
+ :const:`ZIP_BZIP2` or :const:`ZIP_LZMA`; unrecognized
+ values will cause :exc:`RuntimeError` to be raised. If :const:`ZIP_DEFLATED`,
+ :const:`ZIP_BZIP2` or :const:`ZIP_LZMA` is specified but the corresponded module
+ (:mod:`zlib`, :mod:`bz2` or :mod:`lzma`) is not available, :exc:`RuntimeError`
is also raised. The default is :const:`ZIP_STORED`. If *allowZip64* is
``True`` zipfile will create ZIP files that use the ZIP64 extensions when
the zipfile is larger than 2 GB. If it is false (the default) :mod:`zipfile`
@@ -143,6 +168,9 @@ ZipFile Objects
.. versionadded:: 3.2
Added the ability to use :class:`ZipFile` as a context manager.
+ .. versionchanged:: 3.3
+ Added support for :mod:`bzip2 <bz2>` and :mod:`lzma` compression.
+
.. method:: ZipFile.close()
diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst
index 4f17092..b47c35b 100644
--- a/Doc/library/zipimport.rst
+++ b/Doc/library/zipimport.rst
@@ -85,9 +85,12 @@ zipimporter Objects
.. method:: get_data(pathname)
- Return the data associated with *pathname*. Raise :exc:`IOError` if the
+ Return the data associated with *pathname*. Raise :exc:`OSError` if the
file wasn't found.
+ .. versionchanged:: 3.3
+ :exc:`IOError` used to be raised instead of :exc:`OSError`.
+
.. method:: get_filename(fullname)
diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst
index 897d919..42535a0 100644
--- a/Doc/library/zlib.rst
+++ b/Doc/library/zlib.rst
@@ -58,12 +58,37 @@ The available exception and functions in this module are:
exception if any error occurs.
-.. function:: compressobj([level])
+.. function:: compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])
Returns a compression object, to be used for compressing data streams that won't
- fit into memory at once. *level* is an integer from ``1`` to ``9`` controlling
- the level of compression; ``1`` is fastest and produces the least compression,
- ``9`` is slowest and produces the most. The default value is ``6``.
+ fit into memory at once.
+
+ *level* is the compression level -- an integer from ``1`` to ``9``. A value
+ of ``1`` is fastest and produces the least compression, while a value of
+ ``9`` is slowest and produces the most. The default value is ``6``.
+
+ *method* is the compression algorithm. Currently, the only supported value is
+ ``DEFLATED``.
+
+ *wbits* is the base two logarithm of the size of the window buffer. This
+ should be an integer from ``8`` to ``15``. Higher values give better
+ compression, but use more memory.
+
+ *memlevel* controls the amount of memory used for internal compression state.
+ Valid values range from ``1`` to ``9``. Higher values using more memory,
+ but are faster and produce smaller output.
+
+ *strategy* is used to tune the compression algorithm. Possible values are
+ ``Z_DEFAULT_STRATEGY``, ``Z_FILTERED``, and ``Z_HUFFMAN_ONLY``.
+
+ *zdict* is a predefined compression dictionary. This is a sequence of bytes
+ (such as a :class:`bytes` object) containing subsequences that are expected
+ to occur frequently in the data that is to be compressed. Those subsequences
+ that are expected to be most common should come at the end of the dictionary.
+
+ .. versionchanged:: 3.3
+ Added the *method*, *wbits*, *memlevel*, *strategy* and *zdict*
+ parameters.
.. function:: crc32(data[, value])
@@ -82,12 +107,13 @@ The available exception and functions in this module are:
Always returns an unsigned 32-bit integer.
-.. note::
- To generate the same numeric value across all Python versions and
- platforms use crc32(data) & 0xffffffff. If you are only using
- the checksum in packed binary format this is not necessary as the
- return value is the correct 32bit binary representation
- regardless of sign.
+ .. note::
+
+ To generate the same numeric value across all Python versions and
+ platforms, use ``crc32(data) & 0xffffffff``. If you are only using
+ the checksum in packed binary format this is not necessary as the
+ return value is the correct 32-bit binary representation
+ regardless of sign.
.. function:: decompress(data[, wbits[, bufsize]])
@@ -114,11 +140,26 @@ The available exception and functions in this module are:
to :c:func:`malloc`. The default size is 16384.
-.. function:: decompressobj([wbits])
+.. function:: decompressobj(wbits=15[, zdict])
Returns a decompression object, to be used for decompressing data streams that
- won't fit into memory at once. The *wbits* parameter controls the size of the
- window buffer.
+ won't fit into memory at once.
+
+ The *wbits* parameter controls the size of the window buffer.
+
+ The *zdict* parameter specifies a predefined compression dictionary. If
+ provided, this must be the same dictionary as was used by the compressor that
+ produced the data that is to be decompressed.
+
+ .. note::
+
+ If *zdict* is a mutable object (such as a :class:`bytearray`), you must not
+ modify its contents between the call to :func:`decompressobj` and the first
+ call to the decompressor's ``decompress()`` method.
+
+ .. versionchanged:: 3.3
+ Added the *zdict* parameter.
+
Compression objects support the following methods:
@@ -150,7 +191,7 @@ Compression objects support the following methods:
compress a set of data that share a common initial prefix.
-Decompression objects support the following methods, and two attributes:
+Decompression objects support the following methods and attributes:
.. attribute:: Decompress.unused_data
@@ -160,13 +201,6 @@ Decompression objects support the following methods, and two attributes:
available. If the whole bytestring turned out to contain compressed data, this is
``b""``, an empty bytes object.
- The only way to determine where a bytestring of compressed data ends is by actually
- decompressing it. This means that when compressed data is contained part of a
- larger file, you can only find the end of it by reading data and feeding it
- followed by some non-empty bytestring into a decompression object's
- :meth:`decompress` method until the :attr:`unused_data` attribute is no longer
- empty.
-
.. attribute:: Decompress.unconsumed_tail
@@ -177,6 +211,17 @@ Decompression objects support the following methods, and two attributes:
:meth:`decompress` method call in order to get correct output.
+.. attribute:: Decompress.eof
+
+ A boolean indicating whether the end of the compressed data stream has been
+ reached.
+
+ This makes it possible to distinguish between a properly-formed compressed
+ stream, and an incomplete or truncated one.
+
+ .. versionadded:: 3.3
+
+
.. method:: Decompress.decompress(data[, max_length])
Decompress *data*, returning a bytes object containing the uncompressed data
@@ -211,6 +256,24 @@ Decompression objects support the following methods, and two attributes:
seeks into the stream at a future point.
+Information about the version of the zlib library in use is available through
+the following constants:
+
+
+.. data:: ZLIB_VERSION
+
+ The version string of the zlib library that was used for building the module.
+ This may be different from the zlib library actually used at runtime, which
+ is available as :const:`ZLIB_RUNTIME_VERSION`.
+
+
+.. data:: ZLIB_RUNTIME_VERSION
+
+ The version string of the zlib library actually loaded by the interpreter.
+
+ .. versionadded:: 3.3
+
+
.. seealso::
Module :mod:`gzip`
diff --git a/Doc/license.rst b/Doc/license.rst
index a44fa04..6326ce4 100644
--- a/Doc/license.rst
+++ b/Doc/license.rst
@@ -120,6 +120,8 @@ been GPL-compatible; the table below summarizes the various releases.
+----------------+--------------+------------+------------+-----------------+
| 3.2.3 | 3.2.2 | 2012 | PSF | yes |
+----------------+--------------+------------+------------+-----------------+
+| 3.3.0 | 3.2 | 2012 | PSF | yes |
++----------------+--------------+------------+------------+-----------------+
.. note::
diff --git a/Doc/make.bat b/Doc/make.bat
index 4ea2d51..a2220c0 100644
--- a/Doc/make.bat
+++ b/Doc/make.bat
@@ -37,7 +37,7 @@ goto end
svn co %SVNROOT%/external/Sphinx-1.0.7/sphinx tools/sphinx
svn co %SVNROOT%/external/docutils-0.6/docutils tools/docutils
svn co %SVNROOT%/external/Jinja-2.3.1/jinja2 tools/jinja2
-svn co %SVNROOT%/external/Pygments-1.3.1/pygments tools/pygments
+svn co %SVNROOT%/external/Pygments-1.5dev-20120930/pygments tools/pygments
goto end
:update
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
index 322e8c8..d093383 100644
--- a/Doc/reference/datamodel.rst
+++ b/Doc/reference/datamodel.rst
@@ -35,12 +35,19 @@ represented by objects.)
Every object has an identity, a type and a value. An object's *identity* never
changes once it has been created; you may think of it as the object's address in
memory. The ':keyword:`is`' operator compares the identity of two objects; the
-:func:`id` function returns an integer representing its identity (currently
-implemented as its address). An object's :dfn:`type` is also unchangeable. [#]_
+:func:`id` function returns an integer representing its identity.
+
+.. impl-detail::
+
+ For CPython, ``id(x)`` is the memory address where ``x`` is stored.
+
An object's type determines the operations that the object supports (e.g., "does
it have a length?") and also defines the possible values for objects of that
type. The :func:`type` function returns an object's type (which is an object
-itself). The *value* of some objects can change. Objects whose value can
+itself). Like its identity, an object's :dfn:`type` is also unchangeable.
+[#]_
+
+The *value* of some objects can change. Objects whose value can
change are said to be *mutable*; objects whose value is unchangeable once they
are created are called *immutable*. (The value of an immutable container object
that contains a reference to a mutable object can change when the latter's value
@@ -276,16 +283,16 @@ Sequences
single: integer
single: Unicode
- The items of a string object are Unicode code units. A Unicode code
- unit is represented by a string object of one item and can hold either
- a 16-bit or 32-bit value representing a Unicode ordinal (the maximum
- value for the ordinal is given in ``sys.maxunicode``, and depends on
- how Python is configured at compile time). Surrogate pairs may be
- present in the Unicode object, and will be reported as two separate
- items. The built-in functions :func:`chr` and :func:`ord` convert
- between code units and nonnegative integers representing the Unicode
- ordinals as defined in the Unicode Standard 3.0. Conversion from and to
- other encodings are possible through the string method :meth:`encode`.
+ A string is a sequence of values that represent Unicode codepoints.
+ All the codepoints in range ``U+0000 - U+10FFFF`` can be represented
+ in a string. Python doesn't have a :c:type:`chr` type, and
+ every character in the string is represented as a string object
+ with length ``1``. The built-in function :func:`ord` converts a
+ character to its codepoint (as an integer); :func:`chr` converts
+ an integer in range ``0 - 10FFFF`` to the corresponding character.
+ :meth:`str.encode` can be used to convert a :class:`str` to
+ :class:`bytes` using the given encoding, and :meth:`bytes.decode` can
+ be used to achieve the opposite.
Tuples
.. index::
@@ -448,6 +455,11 @@ Callable types
+-------------------------+-------------------------------+-----------+
| :attr:`__name__` | The function's name | Writable |
+-------------------------+-------------------------------+-----------+
+ | :attr:`__qualname__` | The function's | Writable |
+ | | :term:`qualified name` | |
+ | | | |
+ | | .. versionadded:: 3.3 | |
+ +-------------------------+-------------------------------+-----------+
| :attr:`__module__` | The name of the module the | Writable |
| | function was defined in, or | |
| | ``None`` if unavailable. | |
@@ -639,17 +651,20 @@ Modules
statement: import
object: module
- Modules are imported by the :keyword:`import` statement (see section
- :ref:`import`). A module object has a
- namespace implemented by a dictionary object (this is the dictionary referenced
- by the __globals__ attribute of functions defined in the module). Attribute
- references are translated to lookups in this dictionary, e.g., ``m.x`` is
- equivalent to ``m.__dict__["x"]``. A module object does not contain the code
- object used to initialize the module (since it isn't needed once the
- initialization is done).
-
- Attribute assignment updates the module's namespace dictionary, e.g., ``m.x =
- 1`` is equivalent to ``m.__dict__["x"] = 1``.
+ Modules are a basic organizational unit of Python code, and are created by
+ the :ref:`import system <importsystem>` as invoked either by the
+ :keyword:`import` statement (see :keyword:`import`), or by calling
+ functions such as :func:`importlib.import_module` and built-in
+ :func:`__import__`. A module object has a namespace implemented by a
+ dictionary object (this is the dictionary referenced by the ``__globals__``
+ attribute of functions defined in the module). Attribute references are
+ translated to lookups in this dictionary, e.g., ``m.x`` is equivalent to
+ ``m.__dict__["x"]``. A module object does not contain the code object used
+ to initialize the module (since it isn't needed once the initialization is
+ done).
+
+ Attribute assignment updates the module's namespace dictionary, e.g.,
+ ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.
.. index:: single: __dict__ (module attribute)
@@ -671,11 +686,12 @@ Modules
Predefined (writable) attributes: :attr:`__name__` is the module's name;
:attr:`__doc__` is the module's documentation string, or ``None`` if
- unavailable; :attr:`__file__` is the pathname of the file from which the module
- was loaded, if it was loaded from a file. The :attr:`__file__` attribute is not
- present for C modules that are statically linked into the interpreter; for
- extension modules loaded dynamically from a shared library, it is the pathname
- of the shared library file.
+ unavailable; :attr:`__file__` is the pathname of the file from which the
+ module was loaded, if it was loaded from a file. The :attr:`__file__`
+ attribute may be missing for certain types of modules, such as C modules
+ that are statically linked into the interpreter; for extension modules
+ loaded dynamically from a shared library, it is the pathname of the shared
+ library file.
Custom classes
Custom class types are typically created by class definitions (see section
@@ -1250,10 +1266,10 @@ Basic customization
immutable (if the object's hash value changes, it will be in the wrong hash
bucket).
-
User-defined classes have :meth:`__eq__` and :meth:`__hash__` methods
by default; with them, all objects compare unequal (except with themselves)
- and ``x.__hash__()`` returns ``id(x)``.
+ and ``x.__hash__()`` returns an appropriate value such that ``x == y``
+ implies both that ``x is y`` and ``hash(x) == hash(y)``.
A class that overrides :meth:`__eq__` and does not define :meth:`__hash__`
will have its :meth:`__hash__` implicitly set to ``None``. When the
@@ -1272,7 +1288,27 @@ Basic customization
a :exc:`TypeError` would be incorrectly identified as hashable by
an ``isinstance(obj, collections.Hashable)`` call.
- See also the :option:`-R` command-line option.
+
+ .. note::
+
+ By default, the :meth:`__hash__` values of str, bytes and datetime
+ objects are "salted" with an unpredictable random value. Although they
+ remain constant within an individual Python process, they are not
+ predictable between repeated invocations of Python.
+
+ This is intended to provide protection against a denial-of-service caused
+ by carefully-chosen inputs that exploit the worst case performance of a
+ dict insertion, O(n^2) complexity. See
+ http://www.ocert.org/advisories/ocert-2011-003.html for details.
+
+ Changing hash values affects the iteration order of dicts, sets and
+ other mappings. Python has never made guarantees about this ordering
+ (and it typically varies between 32-bit and 64-bit builds).
+
+ See also :envvar:`PYTHONHASHSEED`.
+
+ .. versionchanged:: 3.3
+ Hash randomization is enabled by default.
.. method:: object.__bool__(self)
@@ -1353,7 +1389,8 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances.
.. method:: object.__dir__(self)
- Called when :func:`dir` is called on the object. A list must be returned.
+ Called when :func:`dir` is called on the object. A sequence must be
+ returned. :func:`dir` converts the returned sequence to a list and sorts it.
.. _descriptors:
@@ -1524,53 +1561,115 @@ Notes on using *__slots__*
Customizing class creation
--------------------------
-By default, classes are constructed using :func:`type`. A class definition is
-read into a separate namespace and the value of class name is bound to the
-result of ``type(name, bases, dict)``.
+By default, classes are constructed using :func:`type`. The class body is
+executed in a new namespace and the class name is bound locally to the
+result of ``type(name, bases, namespace)``.
+
+The class creation process can be customised by passing the ``metaclass``
+keyword argument in the class definition line, or by inheriting from an
+existing class that included such an argument. In the following example,
+both ``MyClass`` and ``MySubclass`` are instances of ``Meta``::
+
+ class Meta(type):
+ pass
+
+ class MyClass(metaclass=Meta):
+ pass
+
+ class MySubclass(MyClass):
+ pass
-When the class definition is read, if a callable ``metaclass`` keyword argument
-is passed after the bases in the class definition, the callable given will be
-called instead of :func:`type`. If other keyword arguments are passed, they
-will also be passed to the metaclass. This allows classes or functions to be
-written which monitor or alter the class creation process:
+Any other keyword arguments that are specified in the class definition are
+passed through to all metaclass operations described below.
-* Modifying the class dictionary prior to the class being created.
+When a class definition is executed, the following steps occur:
-* Returning an instance of another class -- essentially performing the role of a
- factory function.
+* the appropriate metaclass is determined
+* the class namespace is prepared
+* the class body is executed
+* the class object is created
-These steps will have to be performed in the metaclass's :meth:`__new__` method
--- :meth:`type.__new__` can then be called from this method to create a class
-with different properties. This example adds a new element to the class
-dictionary before creating the class::
+Determining the appropriate metaclass
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- class metacls(type):
- def __new__(mcs, name, bases, dict):
- dict['foo'] = 'metacls was here'
- return type.__new__(mcs, name, bases, dict)
+The appropriate metaclass for a class definition is determined as follows:
-You can of course also override other class methods (or add new methods); for
-example defining a custom :meth:`__call__` method in the metaclass allows custom
-behavior when the class is called, e.g. not always creating a new instance.
+* if no bases and no explicit metaclass are given, then :func:`type` is used
+* if an explicit metaclass is given and it is *not* an instance of
+ :func:`type`, then it is used directly as the metaclass
+* if an instance of :func:`type` is given as the explicit metaclass, or
+ bases are defined, then the most derived metaclass is used
-If the metaclass has a :meth:`__prepare__` attribute (usually implemented as a
-class or static method), it is called before the class body is evaluated with
-the name of the class and a tuple of its bases for arguments. It should return
-an object that supports the mapping interface that will be used to store the
-namespace of the class. The default is a plain dictionary. This could be used,
-for example, to keep track of the order that class attributes are declared in by
-returning an ordered dictionary.
+The most derived metaclass is selected from the explicitly specified
+metaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all specified
+base classes. The most derived metaclass is one which is a subtype of *all*
+of these candidate metaclasses. If none of the candidate metaclasses meets
+that criterion, then the class definition will fail with ``TypeError``.
-The appropriate metaclass is determined by the following precedence rules:
-* If the ``metaclass`` keyword argument is passed with the bases, it is used.
+Preparing the class namespace
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Once the appropriate metaclass has been identified, then the class namespace
+is prepared. If the metaclass has a ``__prepare__`` attribute, it is called
+as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the
+additional keyword arguments, if any, come from the class definition).
+
+If the metaclass has no ``__prepare__`` attribute, then the class namespace
+is initialised as an empty :func:`dict` instance.
+
+.. seealso::
+
+ :pep:`3115` - Metaclasses in Python 3000
+ Introduced the ``__prepare__`` namespace hook
+
+
+Executing the class body
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The class body is executed (approximately) as
+``exec(body, globals(), namespace)``. The key difference from a normal
+call to :func:`exec` is that lexical scoping allows the class body (including
+any methods) to reference names from the current and outer scopes when the
+class definition occurs inside a function.
+
+However, even when the class definition occurs inside the function, methods
+defined inside the class still cannot see names defined at the class scope.
+Class variables must be accessed through the first parameter of instance or
+class methods, and cannot be accessed at all from static methods.
+
+
+Creating the class object
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Once the class namespace has been populated by executing the class body,
+the class object is created by calling
+``metaclass(name, bases, namespace, **kwds)`` (the additional keywords
+passed here are the same as those passed to ``__prepare__``).
+
+This class object is the one that will be referenced by the zero-argument
+form of :func:`super`. ``__class__`` is an implicit closure reference
+created by the compiler if any methods in a class body refer to either
+``__class__`` or ``super``. This allows the zero argument form of
+:func:`super` to correctly identify the class being defined based on
+lexical scoping, while the class or instance that was used to make the
+current call is identified based on the first argument passed to the method.
+
+After the class object is created, it is passed to the class decorators
+included in the class definition (if any) and the resulting object is bound
+in the local namespace as the defined class.
+
+.. seealso::
+
+ :pep:`3135` - New super
+ Describes the implicit ``__class__`` closure reference
-* Otherwise, if there is at least one base class, its metaclass is used.
-* Otherwise, the default metaclass (:class:`type`) is used.
+Metaclass example
+^^^^^^^^^^^^^^^^^
The potential uses for metaclasses are boundless. Some ideas that have been
-explored including logging, interface checking, automatic delegation, automatic
+explored include logging, interface checking, automatic delegation, automatic
property creation, proxies, frameworks, and automatic resource
locking/synchronization.
@@ -1583,9 +1682,9 @@ to remember the order that class members were defined::
def __prepare__(metacls, name, bases, **kwds):
return collections.OrderedDict()
- def __new__(cls, name, bases, classdict):
- result = type.__new__(cls, name, bases, dict(classdict))
- result.members = tuple(classdict)
+ def __new__(cls, name, bases, namespace, **kwds):
+ result = type.__new__(cls, name, bases, dict(namespace))
+ result.members = tuple(namespace)
return result
class A(metaclass=OrderedClass):
diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst
index 2c6acb6..41523cb 100644
--- a/Doc/reference/expressions.rst
+++ b/Doc/reference/expressions.rst
@@ -318,7 +318,7 @@ Yield expressions
.. productionlist::
yield_atom: "(" `yield_expression` ")"
- yield_expression: "yield" [`expression_list`]
+ yield_expression: "yield" [`expression_list` | "from" `expression`]
The :keyword:`yield` expression is only used when defining a generator function,
and can only be used in the body of a function definition. Using a
@@ -336,7 +336,10 @@ the internal evaluation stack. When the execution is resumed by calling one of
the generator's methods, the function can proceed exactly as if the
:keyword:`yield` expression was just another external call. The value of the
:keyword:`yield` expression after resuming depends on the method which resumed
-the execution.
+the execution. If :meth:`__next__` is used (typically via either a
+:keyword:`for` or the :func:`next` builtin) then the result is :const:`None`,
+otherwise, if :meth:`send` is used, then the result will be the value passed
+in to that method.
.. index:: single: coroutine
@@ -346,12 +349,32 @@ suspended. The only difference is that a generator function cannot control
where should the execution continue after it yields; the control is always
transferred to the generator's caller.
-The :keyword:`yield` statement is allowed in the :keyword:`try` clause of a
+:keyword:`yield` expressions are allowed in the :keyword:`try` clause of a
:keyword:`try` ... :keyword:`finally` construct. If the generator is not
resumed before it is finalized (by reaching a zero reference count or by being
garbage collected), the generator-iterator's :meth:`close` method will be
called, allowing any pending :keyword:`finally` clauses to execute.
+When ``yield from <expr>`` is used, it treats the supplied expression as
+a subiterator. All values produced by that subiterator are passed directly
+to the caller of the current generator's methods. Any values passed in with
+:meth:`send` and any exceptions passed in with :meth:`throw` are passed to
+the underlying iterator if it has the appropriate methods. If this is not the
+case, then :meth:`send` will raise :exc:`AttributeError` or :exc:`TypeError`,
+while :meth:`throw` will just raise the passed in exception immediately.
+
+When the underlying iterator is complete, the :attr:`~StopIteration.value`
+attribute of the raised :exc:`StopIteration` instance becomes the value of
+the yield expression. It can be either set explicitly when raising
+:exc:`StopIteration`, or automatically when the sub-iterator is a generator
+(by returning a value from the sub-generator).
+
+ .. versionchanged:: 3.3
+ Added ``yield from <expr>`` to delegate control flow to a subiterator
+
+The parentheses can be omitted when the :keyword:`yield` expression is the
+sole expression on the right hand side of an assignment statement.
+
.. index:: object: generator
@@ -452,6 +475,10 @@ generator functions::
The proposal to enhance the API and syntax of generators, making them
usable as simple coroutines.
+ :pep:`0380` - Syntax for Delegating to a Subgenerator
+ The proposal to introduce the :token:`yield_from` syntax, making delegation
+ to sub-generators easy.
+
.. _primaries:
diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst
new file mode 100644
index 0000000..4688e78
--- /dev/null
+++ b/Doc/reference/import.rst
@@ -0,0 +1,697 @@
+
+.. _importsystem:
+
+*****************
+The import system
+*****************
+
+.. index:: single: import machinery
+
+Python code in one :term:`module` gains access to the code in another module
+by the process of :term:`importing` it. The :keyword:`import` statement is
+the most common way of invoking the import machinery, but it is not the only
+way. Functions such as :func:`importlib.import_module` and built-in
+:func:`__import__` can also be used to invoke the import machinery.
+
+The :keyword:`import` statement combines two operations; it searches for the
+named module, then it binds the results of that search to a name in the local
+scope. The search operation of the :keyword:`import` statement is defined as
+a call to the :func:`__import__` function, with the appropriate arguments.
+The return value of :func:`__import__` is used to perform the name
+binding operation of the :keyword:`import` statement. See the
+:keyword:`import` statement for the exact details of that name binding
+operation.
+
+A direct call to :func:`__import__` performs only the module search and, if
+found, the module creation operation. While certain side-effects may occur,
+such as the importing of parent packages, and the updating of various caches
+(including :data:`sys.modules`), only the :keyword:`import` statement performs
+a name binding operation.
+
+When calling :func:`__import__` as part of an import statement, the
+import system first checks the module global namespace for a function by
+that name. If it is not found, then the standard builtin :func:`__import__`
+is called. Other mechanisms for invoking the import system (such as
+:func:`importlib.import_module`) do not perform this check and will always
+use the standard import system.
+
+When a module is first imported, Python searches for the module and if found,
+it creates a module object [#fnmo]_, initializing it. If the named module
+cannot be found, an :exc:`ImportError` is raised. Python implements various
+strategies to search for the named module when the import machinery is
+invoked. These strategies can be modified and extended by using various hooks
+described in the sections below.
+
+.. versionchanged:: 3.3
+ The import system has been updated to fully implement the second phase
+ of PEP 302. There is no longer any implicit import machinery - the full
+ import system is exposed through :data:`sys.meta_path`. In addition,
+ native namespace package support has been implemented (see PEP 420).
+
+
+:mod:`importlib`
+================
+
+The :mod:`importlib` module provides a rich API for interacting with the
+import system. For example :func:`importlib.import_module` provides a
+recommended, simpler API than built-in :func:`__import__` for invoking the
+import machinery. Refer to the :mod:`importlib` library documentation for
+additional detail.
+
+
+
+Packages
+========
+
+.. index::
+ single: package
+
+Python has only one type of module object, and all modules are of this type,
+regardless of whether the module is implemented in Python, C, or something
+else. To help organize modules and provide a naming hierarchy, Python has a
+concept of :term:`packages <package>`.
+
+You can think of packages as the directories on a file system and modules as
+files within directories, but don't take this analogy too literally since
+packages and modules need not originate from the file system. For the
+purposes of this documentation, we'll use this convenient analogy of
+directories and files. Like file system directories, packages are organized
+hierarchically, and packages may themselves contain subpackages, as well as
+regular modules.
+
+It's important to keep in mind that all packages are modules, but not all
+modules are packages. Or put another way, packages are just a special kind of
+module. Specifically, any module that contains a ``__path__`` attribute is
+considered a package.
+
+All modules have a name. Subpackage names are separated from their parent
+package name by dots, akin to Python's standard attribute access syntax. Thus
+you might have a module called :mod:`sys` and a package called :mod:`email`,
+which in turn has a subpackage called :mod:`email.mime` and a module within
+that subpackage called :mod:`email.mime.text`.
+
+
+Regular packages
+----------------
+
+.. index::
+ pair: package; regular
+
+Python defines two types of packages, :term:`regular packages <regular
+package>` and :term:`namespace packages <namespace package>`. Regular
+packages are traditional packages as they existed in Python 3.2 and earlier.
+A regular package is typically implemented as a directory containing an
+``__init__.py`` file. When a regular package is imported, this
+``__init__.py`` file is implicitly executed, and the objects it defines are
+bound to names in the package's namespace. The ``__init__.py`` file can
+contain the same Python code that any other module can contain, and Python
+will add some additional attributes to the module when it is imported.
+
+For example, the following file system layout defines a top level ``parent``
+package with three subpackages::
+
+ parent/
+ __init__.py
+ one/
+ __init__.py
+ two/
+ __init__.py
+ three/
+ __init__.py
+
+Importing ``parent.one`` will implicitly execute ``parent/__init__.py`` and
+``parent/one/__init__.py``. Subsequent imports of ``parent.two`` or
+``parent.three`` will execute ``parent/two/__init__.py`` and
+``parent/three/__init__.py`` respectively.
+
+
+Namespace packages
+------------------
+
+.. index::
+ pair:: package; namespace
+ pair:: package; portion
+
+A namespace package is a composite of various :term:`portions <portion>`,
+where each portion contributes a subpackage to the parent package. Portions
+may reside in different locations on the file system. Portions may also be
+found in zip files, on the network, or anywhere else that Python searches
+during import. Namespace packages may or may not correspond directly to
+objects on the file system; they may be virtual modules that have no concrete
+representation.
+
+Namespace packages do not use an ordinary list for their ``__path__``
+attribute. They instead use a custom iterable type which will automatically
+perform a new search for package portions on the next import attempt within
+that package if the path of their parent package (or :data:`sys.path` for a
+top level package) changes.
+
+With namespace packages, there is no ``parent/__init__.py`` file. In fact,
+there may be multiple ``parent`` directories found during import search, where
+each one is provided by a different portion. Thus ``parent/one`` may not be
+physically located next to ``parent/two``. In this case, Python will create a
+namespace package for the top-level ``parent`` package whenever it or one of
+its subpackages is imported.
+
+See also :pep:`420` for the namespace package specification.
+
+
+Searching
+=========
+
+To begin the search, Python needs the :term:`fully qualified <qualified name>`
+name of the module (or package, but for the purposes of this discussion, the
+difference is immaterial) being imported. This name may come from various
+arguments to the :keyword:`import` statement, or from the parameters to the
+:func:`importlib.import_module` or :func:`__import__` functions.
+
+This name will be used in various phases of the import search, and it may be
+the dotted path to a submodule, e.g. ``foo.bar.baz``. In this case, Python
+first tries to import ``foo``, then ``foo.bar``, and finally ``foo.bar.baz``.
+If any of the intermediate imports fail, an :exc:`ImportError` is raised.
+
+
+The module cache
+----------------
+
+.. index::
+ single: sys.modules
+
+The first place checked during import search is :data:`sys.modules`. This
+mapping serves as a cache of all modules that have been previously imported,
+including the intermediate paths. So if ``foo.bar.baz`` was previously
+imported, :data:`sys.modules` will contain entries for ``foo``, ``foo.bar``,
+and ``foo.bar.baz``. Each key will have as its value the corresponding module
+object.
+
+During import, the module name is looked up in :data:`sys.modules` and if
+present, the associated value is the module satisfying the import, and the
+process completes. However, if the value is ``None``, then an
+:exc:`ImportError` is raised. If the module name is missing, Python will
+continue searching for the module.
+
+:data:`sys.modules` is writable. Deleting a key may not destroy the
+associated module (as other modules may hold references to it),
+but it will invalidate the cache entry for the named module, causing
+Python to search anew for the named module upon its next
+import. The key can also be assigned to ``None``, forcing the next import
+of the module to result in an :exc:`ImportError`.
+
+Beware though, as if you keep a reference to the module object,
+invalidate its cache entry in :data:`sys.modules`, and then re-import the
+named module, the two module objects will *not* be the same. By contrast,
+:func:`imp.reload` will reuse the *same* module object, and simply
+reinitialise the module contents by rerunning the module's code.
+
+
+Finders and loaders
+-------------------
+
+.. index::
+ single: finder
+ single: loader
+
+If the named module is not found in :data:`sys.modules`, then Python's import
+protocol is invoked to find and load the module. This protocol consists of
+two conceptual objects, :term:`finders <finder>` and :term:`loaders <loader>`.
+A finder's job is to determine whether it can find the named module using
+whatever strategy it knows about. Objects that implement both of these
+interfaces are referred to as :term:`importers <importer>` - they return
+themselves when they find that they can load the requested module.
+
+Python includes a number of default finders and importers. One
+knows how to locate frozen modules, and another knows how to locate
+built-in modules. A third default finder searches an :term:`import path`
+for modules. The :term:`import path` is a list of locations that may
+name file system paths or zip files. It can also be extended to search
+for any locatable resource, such as those identified by URLs.
+
+The import machinery is extensible, so new finders can be added to extend the
+range and scope of module searching.
+
+Finders do not actually load modules. If they can find the named module, they
+return a :term:`loader`, which the import machinery then invokes to load the
+module and create the corresponding module object.
+
+The following sections describe the protocol for finders and loaders in more
+detail, including how you can create and register new ones to extend the
+import machinery.
+
+
+Import hooks
+------------
+
+.. index::
+ single: import hooks
+ single: meta hooks
+ single: path hooks
+ pair: hooks; import
+ pair: hooks; meta
+ pair: hooks; path
+
+The import machinery is designed to be extensible; the primary mechanism for
+this are the *import hooks*. There are two types of import hooks: *meta
+hooks* and *import path hooks*.
+
+Meta hooks are called at the start of import processing, before any other
+import processing has occurred, other than :data:`sys.modules` cache look up.
+This allows meta hooks to override :data:`sys.path` processing, frozen
+modules, or even built-in modules. Meta hooks are registered by adding new
+finder objects to :data:`sys.meta_path`, as described below.
+
+Import path hooks are called as part of :data:`sys.path` (or
+``package.__path__``) processing, at the point where their associated path
+item is encountered. Import path hooks are registered by adding new callables
+to :data:`sys.path_hooks` as described below.
+
+
+The meta path
+-------------
+
+.. index::
+ single: sys.meta_path
+ pair: finder; find_module
+ pair: finder; find_loader
+
+When the named module is not found in :data:`sys.modules`, Python next
+searches :data:`sys.meta_path`, which contains a list of meta path finder
+objects. These finders are queried in order to see if they know how to handle
+the named module. Meta path finders must implement a method called
+:meth:`find_module()` which takes two arguments, a name and an import path.
+The meta path finder can use any strategy it wants to determine whether it can
+handle the named module or not.
+
+If the meta path finder knows how to handle the named module, it returns a
+loader object. If it cannot handle the named module, it returns ``None``. If
+:data:`sys.meta_path` processing reaches the end of its list without returning
+a loader, then an :exc:`ImportError` is raised. Any other exceptions raised
+are simply propagated up, aborting the import process.
+
+The :meth:`find_module()` method of meta path finders is called with two
+arguments. The first is the fully qualified name of the module being
+imported, for example ``foo.bar.baz``. The second argument is the path
+entries to use for the module search. For top-level modules, the second
+argument is ``None``, but for submodules or subpackages, the second
+argument is the value of the parent package's ``__path__`` attribute. If
+the appropriate ``__path__`` attribute cannot be accessed, an
+:exc:`ImportError` is raised.
+
+The meta path may be traversed multiple times for a single import request.
+For example, assuming none of the modules involved has already been cached,
+importing ``foo.bar.baz`` will first perform a top level import, calling
+``mpf.find_module("foo", None)`` on each meta path finder (``mpf``). After
+``foo`` has been imported, ``foo.bar`` will be imported by traversing the
+meta path a second time, calling
+``mpf.find_module("foo.bar", foo.__path__)``. Once ``foo.bar`` has been
+imported, the final traversal will call
+``mpf.find_module("foo.bar.baz", foo.bar.__path__)``.
+
+Some meta path finders only support top level imports. These importers will
+always return ``None`` when anything other than ``None`` is passed as the
+second argument.
+
+Python's default :data:`sys.meta_path` has three meta path finders, one that
+knows how to import built-in modules, one that knows how to import frozen
+modules, and one that knows how to import modules from an :term:`import path`
+(i.e. the :term:`path based finder`).
+
+
+Loaders
+=======
+
+If and when a module loader is found its
+:meth:`~importlib.abc.Loader.load_module` method is called, with a single
+argument, the fully qualified name of the module being imported. This method
+has several responsibilities, and should return the module object it has
+loaded [#fnlo]_. If it cannot load the module, it should raise an
+:exc:`ImportError`, although any other exception raised during
+:meth:`load_module()` will be propagated.
+
+In many cases, the finder and loader can be the same object; in such cases the
+:meth:`finder.find_module()` would just return ``self``.
+
+Loaders must satisfy the following requirements:
+
+ * If there is an existing module object with the given name in
+ :data:`sys.modules`, the loader must use that existing module. (Otherwise,
+ :func:`imp.reload` will not work correctly.) If the named module does
+ not exist in :data:`sys.modules`, the loader must create a new module
+ object and add it to :data:`sys.modules`.
+
+ Note that the module *must* exist in :data:`sys.modules` before the loader
+ executes the module code. This is crucial because the module code may
+ (directly or indirectly) import itself; adding it to :data:`sys.modules`
+ beforehand prevents unbounded recursion in the worst case and multiple
+ loading in the best.
+
+ If loading fails, the loader must remove any modules it has inserted into
+ :data:`sys.modules`, but it must remove **only** the failing module, and
+ only if the loader itself has loaded it explicitly. Any module already in
+ the :data:`sys.modules` cache, and any module that was successfully loaded
+ as a side-effect, must remain in the cache.
+
+ * The loader may set the ``__file__`` attribute of the module. If set, this
+ attribute's value must be a string. The loader may opt to leave
+ ``__file__`` unset if it has no semantic meaning (e.g. a module loaded from
+ a database).
+
+ * The loader may set the ``__name__`` attribute of the module. While not
+ required, setting this attribute is highly recommended so that the
+ :meth:`repr()` of the module is more informative.
+
+ * If the module is a package (either regular or namespace), the loader must
+ set the module object's ``__path__`` attribute. The value must be
+ iterable, but may be empty if ``__path__`` has no further significance
+ to the loader. If ``__path__`` is not empty, it must produce strings
+ when iterated over. More details on the semantics of ``__path__`` are
+ given :ref:`below <package-path-rules>`.
+
+ * The ``__loader__`` attribute must be set to the loader object that loaded
+ the module. This is mostly for introspection and reloading, but can be
+ used for additional loader-specific functionality, for example getting
+ data associated with a loader.
+
+ * The module's ``__package__`` attribute should be set. Its value must be a
+ string, but it can be the same value as its ``__name__``. If the attribute
+ is set to ``None`` or is missing, the import system will fill it in with a
+ more appropriate value. When the module is a package, its ``__package__``
+ value should be set to its ``__name__``. When the module is not a package,
+ ``__package__`` should be set to the empty string for top-level modules, or
+ for submodules, to the parent package's name. See :pep:`366` for further
+ details.
+
+ This attribute is used instead of ``__name__`` to calculate explicit
+ relative imports for main modules, as defined in :pep:`366`.
+
+ * If the module is a Python module (as opposed to a built-in module or a
+ dynamically loaded extension), the loader should execute the module's code
+ in the module's global name space (``module.__dict__``).
+
+
+Module reprs
+------------
+
+By default, all modules have a usable repr, however depending on the
+attributes set above, and hooks in the loader, you can more explicitly control
+the repr of module objects.
+
+Loaders may implement a :meth:`module_repr()` method which takes a single
+argument, the module object. When ``repr(module)`` is called for a module
+with a loader supporting this protocol, whatever is returned from
+``module.__loader__.module_repr(module)`` is returned as the module's repr
+without further processing. This return value must be a string.
+
+If the module has no ``__loader__`` attribute, or the loader has no
+:meth:`module_repr()` method, then the module object implementation itself
+will craft a default repr using whatever information is available. It will
+try to use the ``module.__name__``, ``module.__file__``, and
+``module.__loader__`` as input into the repr, with defaults for whatever
+information is missing.
+
+Here are the exact rules used:
+
+ * If the module has a ``__loader__`` and that loader has a
+ :meth:`module_repr()` method, call it with a single argument, which is the
+ module object. The value returned is used as the module's repr.
+
+ * If an exception occurs in :meth:`module_repr()`, the exception is caught
+ and discarded, and the calculation of the module's repr continues as if
+ :meth:`module_repr()` did not exist.
+
+ * If the module has a ``__file__`` attribute, this is used as part of the
+ module's repr.
+
+ * If the module has no ``__file__`` but does have a ``__loader__``, then the
+ loader's repr is used as part of the module's repr.
+
+ * Otherwise, just use the module's ``__name__`` in the repr.
+
+This example, from :pep:`420` shows how a loader can craft its own module
+repr::
+
+ class NamespaceLoader:
+ @classmethod
+ def module_repr(cls, module):
+ return "<module '{}' (namespace)>".format(module.__name__)
+
+
+.. _package-path-rules:
+
+module.__path__
+---------------
+
+By definition, if a module has an ``__path__`` attribute, it is a package,
+regardless of its value.
+
+A package's ``__path__`` attribute is used during imports of its subpackages.
+Within the import machinery, it functions much the same as :data:`sys.path`,
+i.e. providing a list of locations to search for modules during import.
+However, ``__path__`` is typically much more constrained than
+:data:`sys.path`.
+
+``__path__`` must be an iterable of strings, but it may be empty.
+The same rules used for :data:`sys.path` also apply to a package's
+``__path__``, and :data:`sys.path_hooks` (described below) are
+consulted when traversing a package's ``__path__``.
+
+A package's ``__init__.py`` file may set or alter the package's ``__path__``
+attribute, and this was typically the way namespace packages were implemented
+prior to :pep:`420`. With the adoption of :pep:`420`, namespace packages no
+longer need to supply ``__init__.py`` files containing only ``__path__``
+manipulation code; the namespace loader automatically sets ``__path__``
+correctly for the namespace package.
+
+
+The Path Based Finder
+=====================
+
+.. index::
+ single: path based finder
+
+As mentioned previously, Python comes with several default meta path finders.
+One of these, called the :term:`path based finder`, searches an :term:`import
+path`, which contains a list of :term:`path entries <path entry>`. Each path
+entry names a location to search for modules.
+
+The path based finder itself doesn't know how to import anything. Instead, it
+traverses the individual path entries, associating each of them with a
+path entry finder that knows how to handle that particular kind of path.
+
+The default set of path entry finders implement all the semantics for finding
+modules on the file system, handling special file types such as Python source
+code (``.py`` files), Python byte code (``.pyc`` and ``.pyo`` files) and
+shared libraries (e.g. ``.so`` files). When supported by the :mod:`zipimport`
+module in the standard library, the default path entry finders also handle
+loading all of these file types (other than shared libraries) from zipfiles.
+
+Path entries need not be limited to file system locations. They can refer to
+URLs, database queries, or any other location that can be specified as a
+string.
+
+The path based finder provides additional hooks and protocols so that you
+can extend and customize the types of searchable path entries. For example,
+if you wanted to support path entries as network URLs, you could write a hook
+that implements HTTP semantics to find modules on the web. This hook (a
+callable) would return a :term:`path entry finder` supporting the protocol
+described below, which was then used to get a loader for the module from the
+web.
+
+A word of warning: this section and the previous both use the term *finder*,
+distinguishing between them by using the terms :term:`meta path finder` and
+:term:`path entry finder`. These two types of finders are very similar,
+support similar protocols, and function in similar ways during the import
+process, but it's important to keep in mind that they are subtly different.
+In particular, meta path finders operate at the beginning of the import
+process, as keyed off the :data:`sys.meta_path` traversal.
+
+By contrast, path entry finders are in a sense an implementation detail
+of the path based finder, and in fact, if the path based finder were to be
+removed from :data:`sys.meta_path`, none of the path entry finder semantics
+would be invoked.
+
+
+Path entry finders
+------------------
+
+.. index::
+ single: sys.path
+ single: sys.path_hooks
+ single: sys.path_importer_cache
+ single: PYTHONPATH
+
+The :term:`path based finder` is responsible for finding and loading Python
+modules and packages whose location is specified with a string :term:`path
+entry`. Most path entries name locations in the file system, but they need
+not be limited to this.
+
+As a meta path finder, the :term:`path based finder` implements the
+:meth:`find_module()` protocol previously described, however it exposes
+additional hooks that can be used to customize how modules are found and
+loaded from the :term:`import path`.
+
+Three variables are used by the :term:`path based finder`, :data:`sys.path`,
+:data:`sys.path_hooks` and :data:`sys.path_importer_cache`. The ``__path__``
+attributes on package objects are also used. These provide additional ways
+that the import machinery can be customized.
+
+:data:`sys.path` contains a list of strings providing search locations for
+modules and packages. It is initialized from the :data:`PYTHONPATH`
+environment variable and various other installation- and
+implementation-specific defaults. Entries in :data:`sys.path` can name
+directories on the file system, zip files, and potentially other "locations"
+(see the :mod:`site` module) that should be searched for modules, such as
+URLs, or database queries.
+
+The :term:`path based finder` is a :term:`meta path finder`, so the import
+machinery begins the :term:`import path` search by calling the path
+based finder's :meth:`find_module()` method as described previously. When
+the ``path`` argument to :meth:`find_module()` is given, it will be a
+list of string paths to traverse - typically a package's ``__path__``
+attribute for an import within that package. If the ``path`` argument
+is ``None``, this indicates a top level import and :data:`sys.path` is used.
+
+The path based finder iterates over every entry in the search path, and
+for each of these, looks for an appropriate :term:`path entry finder` for the
+path entry. Because this can be an expensive operation (e.g. there may be
+`stat()` call overheads for this search), the path based finder maintains
+a cache mapping path entries to path entry finders. This cache is maintained
+in :data:`sys.path_importer_cache` (despite the name, this cache actually
+stores finder objects rather than being limited to :term:`importer` objects).
+In this way, the expensive search for a particular :term:`path entry`
+location's :term:`path entry finder` need only be done once. User code is
+free to remove cache entries from :data:`sys.path_importer_cache` forcing
+the path based finder to perform the path entry search again [#fnpic]_.
+
+If the path entry is not present in the cache, the path based finder iterates
+over every callable in :data:`sys.path_hooks`. Each of the
+:term:`path entry hooks <path entry hook>` in this list is called with a
+single argument, the path entry to be searched. This callable may either
+return a :term:`path entry finder` that can handle the path entry, or it may
+raise :exc:`ImportError`.
+An :exc:`ImportError` is used by the path based finder to signal that the hook
+cannot find a :term:`path entry finder` for that :term:`path entry`. The
+exception is ignored and :term:`import path` iteration continues.
+
+If :data:`sys.path_hooks` iteration ends with no :term:`path entry finder`
+being returned, then the path based finder's :meth:`find_module()` method
+will store ``None`` in :data:`sys.path_importer_cache` (to indicate that
+there is no finder for this path entry) and return ``None``, indicating that
+this :term:`meta path finder` could not find the module.
+
+If a :term:`path entry finder` *is* returned by one of the :term:`path entry
+hook` callables on :data:`sys.path_hooks`, then the following protocol is used
+to ask the finder for a module loader, which is then used to load the module.
+
+
+Path entry finder protocol
+--------------------------
+
+In order to support imports of modules and initialized packages and also to
+contribute portions to namespace packages, path entry finders must implement
+the :meth:`find_loader()` method.
+
+:meth:`find_loader()` takes one argument, the fully qualified name of the
+module being imported. :meth:`find_loader()` returns a 2-tuple where the
+first item is the loader and the second item is a namespace :term:`portion`.
+When the first item (i.e. the loader) is ``None``, this means that while the
+path entry finder does not have a loader for the named module, it knows that the
+path entry contributes to a namespace portion for the named module. This will
+almost always be the case where Python is asked to import a namespace package
+that has no physical presence on the file system. When a path entry finder
+returns ``None`` for the loader, the second item of the 2-tuple return value
+must be a sequence, although it can be empty.
+
+If :meth:`find_loader()` returns a non-``None`` loader value, the portion is
+ignored and the loader is returned from the path based finder, terminating
+the search through the path entries.
+
+For backwards compatibility with other implementations of the import
+protocol, many path entry finders also support the same,
+traditional :meth:`find_module()` method that meta path finders support.
+However path entry finder :meth:`find_module()` methods are never called
+with a ``path`` argument (they are expected to record the appropriate
+path information from the initial call to the path hook).
+
+The :meth:`find_module()` method on path entry finders is deprecated,
+as it does not allow the path entry finder to contribute portions to
+namespace packages. Instead path entry finders should implement the
+:meth:`find_loader()` method as described above. If it exists on the path
+entry finder, the import system will always call :meth:`find_loader()`
+in preference to :meth:`find_module()`.
+
+
+Replacing the standard import system
+====================================
+
+The most reliable mechanism for replacing the entire import system is to
+delete the default contents of :data:`sys.meta_path`, replacing them
+entirely with a custom meta path hook.
+
+If it is acceptable to only alter the behaviour of import statements
+without affecting other APIs that access the import system, then replacing
+the builtin :func:`__import__` function may be sufficient. This technique
+may also be employed at the module level to only alter the behaviour of
+import statements within that module.
+
+To selectively prevent import of some modules from a hook early on the
+meta path (rather than disabling the standard import system entirely),
+it is sufficient to raise :exc:`ImportError` directly from
+:meth:`find_module` instead of returning ``None``. The latter indicates
+that the meta path search should continue. while raising an exception
+terminates it immediately.
+
+
+Open issues
+===========
+
+XXX It would be really nice to have a diagram.
+
+XXX * (import_machinery.rst) how about a section devoted just to the
+attributes of modules and packages, perhaps expanding upon or supplanting the
+related entries in the data model reference page?
+
+XXX runpy, pkgutil, et al in the library manual should all get "See Also"
+links at the top pointing to the new import system section.
+
+
+References
+==========
+
+The import machinery has evolved considerably since Python's early days. The
+original `specification for packages
+<http://www.python.org/doc/essays/packages.html>`_ is still available to read,
+although some details have changed since the writing of that document.
+
+The original specification for :data:`sys.meta_path` was :pep:`302`, with
+subsequent extension in :pep:`420`.
+
+:pep:`420` introduced :term:`namespace packages <namespace package>` for
+Python 3.3. :pep:`420` also introduced the :meth:`find_loader` protocol as an
+alternative to :meth:`find_module`.
+
+:pep:`366` describes the addition of the ``__package__`` attribute for
+explicit relative imports in main modules.
+
+:pep:`328` introduced absolute and explicit relative imports and initially
+proposed ``__name__`` for semantics :pep:`366` would eventually specify for
+``__package__``.
+
+:pep:`338` defines executing modules as scripts.
+
+
+Footnotes
+=========
+
+.. [#fnmo] See :class:`types.ModuleType`.
+
+.. [#fnlo] The importlib implementation avoids using the return value
+ directly. Instead, it gets the module object by looking the module name up
+ in :data:`sys.modules`. The indirect effect of this is that an imported
+ module may replace itself in :data:`sys.modules`. This is
+ implementation-specific behavior that is not guaranteed to work in other
+ Python implementations.
+
+.. [#fnpic] In legacy code, it is possible to find instances of
+ :class:`imp.NullImporter` in the :data:`sys.path_importer_cache`. It
+ is recommended that code be changed to use ``None`` instead. See
+ :ref:`portingpythoncode` for more details.
diff --git a/Doc/reference/index.rst b/Doc/reference/index.rst
index 513e445..a66673b 100644
--- a/Doc/reference/index.rst
+++ b/Doc/reference/index.rst
@@ -21,6 +21,7 @@ interfaces available to C/C++ programmers in detail.
lexical_analysis.rst
datamodel.rst
executionmodel.rst
+ import.rst
expressions.rst
simple_stmts.rst
compound_stmts.rst
diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst
index 4b49738..94f219b 100644
--- a/Doc/reference/lexical_analysis.rst
+++ b/Doc/reference/lexical_analysis.rst
@@ -401,7 +401,7 @@ String literals are described by the following lexical definitions:
.. productionlist::
stringliteral: [`stringprefix`](`shortstring` | `longstring`)
- stringprefix: "r" | "R"
+ stringprefix: "r" | "u" | "R" | "U"
shortstring: "'" `shortstringitem`* "'" | '"' `shortstringitem`* '"'
longstring: "'''" `longstringitem`* "'''" | '"""' `longstringitem`* '"""'
shortstringitem: `shortstringchar` | `stringescapeseq`
@@ -412,7 +412,7 @@ String literals are described by the following lexical definitions:
.. productionlist::
bytesliteral: `bytesprefix`(`shortbytes` | `longbytes`)
- bytesprefix: "b" | "B" | "br" | "Br" | "bR" | "BR"
+ bytesprefix: "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes: "'" `shortbytesitem`* "'" | '"' `shortbytesitem`* '"'
longbytes: "'''" `longbytesitem`* "'''" | '"""' `longbytesitem`* '"""'
shortbytesitem: `shortbyteschar` | `bytesescapeseq`
@@ -441,10 +441,24 @@ instance of the :class:`bytes` type instead of the :class:`str` type. They
may only contain ASCII characters; bytes with a numeric value of 128 or greater
must be expressed with escapes.
+As of Python 3.3 it is possible again to prefix unicode strings with a
+``u`` prefix to simplify maintenance of dual 2.x and 3.x codebases.
+
Both string and bytes literals may optionally be prefixed with a letter ``'r'``
or ``'R'``; such strings are called :dfn:`raw strings` and treat backslashes as
literal characters. As a result, in string literals, ``'\U'`` and ``'\u'``
-escapes in raw strings are not treated specially.
+escapes in raw strings are not treated specially. Given that Python 2.x's raw
+unicode literals behave differently than Python 3.x's the ``'ur'`` syntax
+is not supported.
+
+ .. versionadded:: 3.3
+ The ``'rb'`` prefix of raw bytes literals has been added as a synonym
+ of ``'br'``.
+
+ .. versionadded:: 3.3
+ Support for the unicode legacy literal (``u'value'``) was reintroduced
+ to simplify the maintenance of dual Python 2.x and 3.x codebases.
+ See :pep:`414` for more information.
In triple-quoted strings, unescaped newlines and quotes are allowed (and are
retained), except that three unescaped quotes in a row terminate the string. (A
@@ -492,13 +506,13 @@ Escape sequences only recognized in string literals are:
+-----------------+---------------------------------+-------+
| Escape Sequence | Meaning | Notes |
+=================+=================================+=======+
-| ``\N{name}`` | Character named *name* in the | |
+| ``\N{name}`` | Character named *name* in the | \(4) |
| | Unicode database | |
+-----------------+---------------------------------+-------+
-| ``\uxxxx`` | Character with 16-bit hex value | \(4) |
+| ``\uxxxx`` | Character with 16-bit hex value | \(5) |
| | *xxxx* | |
+-----------------+---------------------------------+-------+
-| ``\Uxxxxxxxx`` | Character with 32-bit hex value | \(5) |
+| ``\Uxxxxxxxx`` | Character with 32-bit hex value | \(6) |
| | *xxxxxxxx* | |
+-----------------+---------------------------------+-------+
@@ -516,13 +530,15 @@ Notes:
with the given value.
(4)
+ .. versionchanged:: 3.3
+ Support for name aliases [#]_ has been added.
+
+(5)
Individual code units which form parts of a surrogate pair can be encoded using
this escape sequence. Exactly four hex digits are required.
-(5)
- Any Unicode character can be encoded this way, but characters outside the Basic
- Multilingual Plane (BMP) will be encoded using a surrogate pair if Python is
- compiled to use 16-bit code units (the default). Exactly eight hex digits
+(6)
+ Any Unicode character can be encoded this way. Exactly eight hex digits
are required.
@@ -706,3 +722,8 @@ The following printing ASCII characters are not used in Python. Their
occurrence outside string literals and comments is an unconditional error::
$ ? `
+
+
+.. rubric:: Footnotes
+
+.. [#] http://www.unicode.org/Public/6.1.0/ucd/NameAliases.txt
diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst
index 73183d5..81dc748 100644
--- a/Doc/reference/simple_stmts.rst
+++ b/Doc/reference/simple_stmts.rst
@@ -424,10 +424,10 @@ When :keyword:`return` passes control out of a :keyword:`try` statement with a
:keyword:`finally` clause, that :keyword:`finally` clause is executed before
really leaving the function.
-In a generator function, the :keyword:`return` statement is not allowed to
-include an :token:`expression_list`. In that context, a bare :keyword:`return`
-indicates that the generator is done and will cause :exc:`StopIteration` to be
-raised.
+In a generator function, the :keyword:`return` statement indicates that the
+generator is done and will cause :exc:`StopIteration` to be raised. The returned
+value (if any) is used as an argument to construct :exc:`StopIteration` and
+becomes the :attr:`StopIteration.value` attribute.
.. _yield:
@@ -449,6 +449,7 @@ The :keyword:`yield` statement is only used when defining a generator function,
and is only used in the body of the generator function. Using a :keyword:`yield`
statement in a function definition is sufficient to cause that definition to
create a generator function instead of a normal function.
+
When a generator function is called, it returns an iterator known as a generator
iterator, or more commonly, a generator. The body of the generator function is
executed by calling the :func:`next` function on the generator repeatedly until
@@ -468,14 +469,28 @@ resumed before it is finalized (by reaching a zero reference count or by being
garbage collected), the generator-iterator's :meth:`close` method will be
called, allowing any pending :keyword:`finally` clauses to execute.
+When ``yield from <expr>`` is used, it treats the supplied expression as
+a subiterator, producing values from it until the underlying iterator is
+exhausted.
+
+ .. versionchanged:: 3.3
+ Added ``yield from <expr>`` to delegate control flow to a subiterator
+
+For full details of :keyword:`yield` semantics, refer to the :ref:`yieldexpr`
+section.
+
.. seealso::
:pep:`0255` - Simple Generators
The proposal for adding generators and the :keyword:`yield` statement to Python.
:pep:`0342` - Coroutines via Enhanced Generators
- The proposal that, among other generator enhancements, proposed allowing
- :keyword:`yield` to appear inside a :keyword:`try` ... :keyword:`finally` block.
+ The proposal to enhance the API and syntax of generators, making them
+ usable as simple coroutines.
+
+ :pep:`0380` - Syntax for Delegating to a Subgenerator
+ The proposal to introduce the :token:`yield_from` syntax, making delegation
+ to sub-generators easy.
.. _raise:
@@ -645,161 +660,98 @@ The :keyword:`import` statement
relative_module: "."* `module` | "."+
name: `identifier`
-Import statements are executed in two steps: (1) find a module, and initialize
-it if necessary; (2) define a name or names in the local namespace (of the scope
-where the :keyword:`import` statement occurs). The statement comes in two
-forms differing on whether it uses the :keyword:`from` keyword. The first form
-(without :keyword:`from`) repeats these steps for each identifier in the list.
-The form with :keyword:`from` performs step (1) once, and then performs step
-(2) repeatedly. For a reference implementation of step (1), see the
-:mod:`importlib` module.
+The basic import statement (no :keyword:`from` clause) is executed in two
+steps:
-.. index::
- single: package
+#. find a module, loading and initializing it if necessary
+#. define a name or names in the local namespace for the scope where
+ the :keyword:`import` statement occurs.
-To understand how step (1) occurs, one must first understand how Python handles
-hierarchical naming of modules. To help organize modules and provide a
-hierarchy in naming, Python has a concept of packages. A package can contain
-other packages and modules while modules cannot contain other modules or
-packages. From a file system perspective, packages are directories and modules
-are files. The original `specification for packages
-<http://www.python.org/doc/essays/packages.html>`_ is still available to read,
-although minor details have changed since the writing of that document.
+When the statement contains multiple clauses (separated by
+commas) the two steps are carried out separately for each clause, just
+as though the clauses had been separated out into individiual import
+statements.
-.. index::
- single: sys.modules
+The details of the first step, finding and loading modules is described in
+greater detail in the section on the :ref:`import system <importsystem>`,
+which also describes the various types of packages and modules that can
+be imported, as well as all the hooks that can be used to customize
+the import system. Note that failures in this step may indicate either
+that the module could not be located, *or* that an error occurred while
+initializing the module, which includes execution of the module's code.
-Once the name of the module is known (unless otherwise specified, the term
-"module" will refer to both packages and modules), searching
-for the module or package can begin. The first place checked is
-:data:`sys.modules`, the cache of all modules that have been imported
-previously. If the module is found there then it is used in step (2) of import
-unless ``None`` is found in :data:`sys.modules`, in which case
-:exc:`ImportError` is raised.
+If the requested module is retrieved successfully, it will be made
+available in the local namespace in one of three ways:
-.. index::
- single: sys.meta_path
- single: finder
- pair: finder; find_module
- single: __path__
-
-If the module is not found in the cache, then :data:`sys.meta_path` is searched
-(the specification for :data:`sys.meta_path` can be found in :pep:`302`).
-The object is a list of :term:`finder` objects which are queried in order as to
-whether they know how to load the module by calling their :meth:`find_module`
-method with the name of the module. If the module happens to be contained
-within a package (as denoted by the existence of a dot in the name), then a
-second argument to :meth:`find_module` is given as the value of the
-:attr:`__path__` attribute from the parent package (everything up to the last
-dot in the name of the module being imported). If a finder can find the module
-it returns a :term:`loader` (discussed later) or returns ``None``.
+* If the module name is followed by :keyword:`as`, then the name
+ following :keyword:`as` is bound directly to the imported module.
+* If no other name is specified, and the module being imported is a top
+ level module, the module's name is bound in the local namespace as a
+ reference to the imported module
+* If the module being imported is *not* a top level module, then the name
+ of the top level package that contains the module is bound in the local
+ namespace as a reference to the top level package. The imported module
+ must be accessed using its full qualified name rather than directly
-.. index::
- single: sys.path_hooks
- single: sys.path_importer_cache
- single: sys.path
-
-If none of the finders on :data:`sys.meta_path` are able to find the module
-then some implicitly defined finders are queried. Implementations of Python
-vary in what implicit meta path finders are defined. The one they all do
-define, though, is one that handles :data:`sys.path_hooks`,
-:data:`sys.path_importer_cache`, and :data:`sys.path`.
-
-The implicit finder searches for the requested module in the "paths" specified
-in one of two places ("paths" do not have to be file system paths). If the
-module being imported is supposed to be contained within a package then the
-second argument passed to :meth:`find_module`, :attr:`__path__` on the parent
-package, is used as the source of paths. If the module is not contained in a
-package then :data:`sys.path` is used as the source of paths.
-
-Once the source of paths is chosen it is iterated over to find a finder that
-can handle that path. The dict at :data:`sys.path_importer_cache` caches
-finders for paths and is checked for a finder. If the path does not have a
-finder cached then :data:`sys.path_hooks` is searched by calling each object in
-the list with a single argument of the path, returning a finder or raises
-:exc:`ImportError`. If a finder is returned then it is cached in
-:data:`sys.path_importer_cache` and then used for that path entry. If no finder
-can be found but the path exists then a value of ``None`` is
-stored in :data:`sys.path_importer_cache` to signify that an implicit,
-file-based finder that handles modules stored as individual files should be
-used for that path. If the path does not exist then a finder which always
-returns ``None`` is placed in the cache for the path.
.. index::
- single: loader
- pair: loader; load_module
- exception: ImportError
-
-If no finder can find the module then :exc:`ImportError` is raised. Otherwise
-some finder returned a loader whose :meth:`load_module` method is called with
-the name of the module to load (see :pep:`302` for the original definition of
-loaders). A loader has several responsibilities to perform on a module it
-loads. First, if the module already exists in :data:`sys.modules` (a
-possibility if the loader is called outside of the import machinery) then it
-is to use that module for initialization and not a new module. But if the
-module does not exist in :data:`sys.modules` then it is to be added to that
-dict before initialization begins. If an error occurs during loading of the
-module and it was added to :data:`sys.modules` it is to be removed from the
-dict. If an error occurs but the module was already in :data:`sys.modules` it
-is left in the dict.
+ pair: name; binding
+ keyword: from
+ exception: ImportError
-.. index::
- single: __name__
- single: __file__
- single: __path__
- single: __package__
- single: __loader__
-
-The loader must set several attributes on the module. :data:`__name__` is to be
-set to the name of the module. :data:`__file__` is to be the "path" to the file
-unless the module is built-in (and thus listed in
-:data:`sys.builtin_module_names`) in which case the attribute is not set.
-If what is being imported is a package then :data:`__path__` is to be set to a
-list of paths to be searched when looking for modules and packages contained
-within the package being imported. :data:`__package__` is optional but should
-be set to the name of package that contains the module or package (the empty
-string is used for module not contained in a package). :data:`__loader__` is
-also optional but should be set to the loader object that is loading the
-module.
+The :keyword:`from` form uses a slightly more complex process:
-.. index::
- exception: ImportError
+#. find the module specified in the :keyword:`from` clause loading and
+ initializing it if necessary;
+#. for each of the identifiers specified in the :keyword:`import` clauses:
-If an error occurs during loading then the loader raises :exc:`ImportError` if
-some other exception is not already being propagated. Otherwise the loader
-returns the module that was loaded and initialized.
+ #. check if the imported module has an attribute by that name
+ #. if not, attempt to import a submodule with that name and then
+ check the imported module again for that attribute
+ #. if the attribute is not found, :exc:`ImportError` is raised.
+ #. otherwise, a reference to that value is bound in the local namespace,
+ using the name in the :keyword:`as` clause if it is present,
+ otherwise using the attribute name
-When step (1) finishes without raising an exception, step (2) can begin.
+Examples::
-The first form of :keyword:`import` statement binds the module name in the local
-namespace to the module object, and then goes on to import the next identifier,
-if any. If the module name is followed by :keyword:`as`, the name following
-:keyword:`as` is used as the local name for the module.
+ import foo # foo imported and bound locally
+ import foo.bar.baz # foo.bar.baz imported, foo bound locally
+ import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb
+ from foo.bar import baz # foo.bar.baz imported and bound as baz
+ from foo import attr # foo imported and foo.attr bound as attr
-.. index::
- pair: name; binding
- exception: ImportError
+If the list of identifiers is replaced by a star (``'*'``), all public
+names defined in the module are bound in the local namespace for the scope
+where the :keyword:`import` statement occurs.
-The :keyword:`from` form does not bind the module name: it goes through the list
-of identifiers, looks each one of them up in the module found in step (1), and
-binds the name in the local namespace to the object thus found. As with the
-first form of :keyword:`import`, an alternate local name can be supplied by
-specifying ":keyword:`as` localname". If a name is not found,
-:exc:`ImportError` is raised. If the list of identifiers is replaced by a star
-(``'*'``), all public names defined in the module are bound in the local
-namespace of the :keyword:`import` statement.
+.. index:: single: __all__ (optional module attribute)
+
+The *public names* defined by a module are determined by checking the module's
+namespace for a variable named ``__all__``; if defined, it must be a sequence
+of strings which are names defined or imported by that module. The names
+given in ``__all__`` are all considered public and are required to exist. If
+``__all__`` is not defined, the set of public names includes all names found
+in the module's namespace which do not begin with an underscore character
+(``'_'``). ``__all__`` should contain the entire public API. It is intended
+to avoid accidentally exporting items that are not part of the API (such as
+library modules which were imported and used within the module).
+
+The :keyword:`from` form with ``*`` may only occur in a module scope.
+Attempting to use it in class or function definitions will raise a
+:exc:`SyntaxError`.
.. index:: single: __all__ (optional module attribute)
The *public names* defined by a module are determined by checking the module's
-namespace for a variable named ``__all__``; if defined, it must be a sequence of
-strings which are names defined or imported by that module. The names given in
-``__all__`` are all considered public and are required to exist. If ``__all__``
-is not defined, the set of public names includes all names found in the module's
-namespace which do not begin with an underscore character (``'_'``).
-``__all__`` should contain the entire public API. It is intended to avoid
-accidentally exporting items that are not part of the API (such as library
-modules which were imported and used within the module).
+namespace for a variable named ``__all__``; if defined, it must be a sequence
+of strings which are names defined or imported by that module. The names
+given in ``__all__`` are all considered public and are required to exist. If
+``__all__`` is not defined, the set of public names includes all names found
+in the module's namespace which do not begin with an underscore character
+(``'_'``). ``__all__`` should contain the entire public API. It is intended
+to avoid accidentally exporting items that are not part of the API (such as
+library modules which were imported and used within the module).
The :keyword:`from` form with ``*`` may only occur in a module scope. The wild
card form of import --- ``import *`` --- is only allowed at the module level.
diff --git a/Doc/tools/sphinxext/indexsidebar.html b/Doc/tools/sphinxext/indexsidebar.html
index 748cb91..a0ec32f 100644
--- a/Doc/tools/sphinxext/indexsidebar.html
+++ b/Doc/tools/sphinxext/indexsidebar.html
@@ -3,7 +3,7 @@
<h3>Docs for other versions</h3>
<ul>
<li><a href="http://docs.python.org/2.7/">Python 2.7 (stable)</a></li>
- <li><a href="http://docs.python.org/3.3/">Python 3.3 (in development)</a></li>
+ <li><a href="http://docs.python.org/3.4/">Python 3.4 (in development)</a></li>
<li><a href="http://www.python.org/doc/versions/">Old versions</a></li>
</ul>
diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html
index 4b16b3f..16a9212 100644
--- a/Doc/tools/sphinxext/layout.html
+++ b/Doc/tools/sphinxext/layout.html
@@ -16,6 +16,63 @@
<link rel="shortcut icon" type="image/png" href="{{ pathto('_static/py.png', 1) }}" />
{% if not embedded %}<script type="text/javascript" src="{{ pathto('_static/copybutton.js', 1) }}"></script>{% endif %}
{% if versionswitcher is defined and not embedded %}<script type="text/javascript" src="{{ pathto('_static/version_switch.js', 1) }}"></script>{% endif %}
+ {% if pagename == 'whatsnew/changelog' %}
+ <script type="text/javascript">
+ $(document).ready(function() {
+ // add the search form and bind the events
+ $('h1').after([
+ '<p>Filter entries by content:',
+ '<input type="text" value="" id="searchbox" style="width: 50%">',
+ '<input type="submit" id="searchbox-submit" value="Filter"></p>'
+ ].join('\n'));
+
+ function dofilter() {
+ try {
+ var query = new RegExp($('#searchbox').val(), 'i');
+ }
+ catch (e) {
+ return; // not a valid regex (yet)
+ }
+ // find headers for the versions (What's new in Python X.Y.Z?)
+ $('#changelog h2').each(function(index1, h2) {
+ var h2_parent = $(h2).parent();
+ var sections_found = 0;
+ // find headers for the sections (Core, Library, etc.)
+ h2_parent.find('h3').each(function(index2, h3) {
+ var h3_parent = $(h3).parent();
+ var entries_found = 0;
+ // find all the entries
+ h3_parent.find('li').each(function(index3, li) {
+ var li = $(li);
+ // check if the query matches the entry
+ if (query.test(li.text())) {
+ li.show();
+ entries_found++;
+ }
+ else {
+ li.hide();
+ }
+ });
+ // if there are entries, show the section, otherwise hide it
+ if (entries_found > 0) {
+ h3_parent.show();
+ sections_found++;
+ }
+ else {
+ h3_parent.hide();
+ }
+ });
+ if (sections_found > 0)
+ h2_parent.show();
+ else
+ h2_parent.hide();
+ });
+ }
+ $('#searchbox').keyup(dofilter);
+ $('#searchbox-submit').click(dofilter);
+ });
+ </script>
+ {% endif %}
{{ super() }}
{% endblock %}
{% block footer %}
diff --git a/Doc/tools/sphinxext/patchlevel.py b/Doc/tools/sphinxext/patchlevel.py
index b070d60..bca2eb8 100644
--- a/Doc/tools/sphinxext/patchlevel.py
+++ b/Doc/tools/sphinxext/patchlevel.py
@@ -34,8 +34,7 @@ def get_header_version_info(srcdir):
release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION'])
micro = int(d['PY_MICRO_VERSION'])
- if micro != 0:
- release += '.' + str(micro)
+ release += '.' + str(micro)
level = d['PY_RELEASE_LEVEL']
suffixes = {
@@ -51,8 +50,7 @@ def get_header_version_info(srcdir):
def get_sys_version_info():
major, minor, micro, level, serial = sys.version_info
release = version = '%s.%s' % (major, minor)
- if micro:
- release += '.%s' % micro
+ release += '.%s' % micro
if level != 'final':
release += '%s%s' % (level[0], serial)
return version, release
diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/sphinxext/pyspecific.py
index 9b2cc47..e8eb703 100644
--- a/Doc/tools/sphinxext/pyspecific.py
+++ b/Doc/tools/sphinxext/pyspecific.py
@@ -5,12 +5,12 @@
Sphinx extension with Python doc-specific markup.
- :copyright: 2008, 2009, 2010 by Georg Brandl.
+ :copyright: 2008, 2009, 2010, 2011, 2012 by Georg Brandl.
:license: Python license.
"""
ISSUE_URI = 'http://bugs.python.org/issue%s'
-SOURCE_URI = 'http://hg.python.org/cpython/file/3.2/%s'
+SOURCE_URI = 'http://hg.python.org/cpython/file/3.3/%s'
from docutils import nodes, utils
from sphinx.util.nodes import split_explicit_title
@@ -174,6 +174,47 @@ class DeprecatedRemoved(Directive):
return ret
+# Support for including Misc/NEWS
+
+import re
+import codecs
+
+issue_re = re.compile('([Ii])ssue #([0-9]+)')
+whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$")
+
+class MiscNews(Directive):
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec = {}
+
+ def run(self):
+ fname = self.arguments[0]
+ source = self.state_machine.input_lines.source(
+ self.lineno - self.state_machine.input_offset - 1)
+ source_dir = path.dirname(path.abspath(source))
+ fpath = path.join(source_dir, fname)
+ self.state.document.settings.record_dependencies.add(fpath)
+ try:
+ fp = codecs.open(fpath, encoding='utf-8')
+ try:
+ content = fp.read()
+ finally:
+ fp.close()
+ except Exception:
+ text = 'The NEWS file is not available.'
+ node = nodes.strong(text, text)
+ return [node]
+ content = issue_re.sub(r'`\1ssue #\2 <http://bugs.python.org/\2>`__',
+ content)
+ content = whatsnew_re.sub(r'\1', content)
+ # remove first 3 lines as they are the main heading
+ lines = ['.. default-role:: obj', ''] + content.splitlines()[3:]
+ self.state_machine.insert_input(lines, fname)
+ return []
+
+
# Support for building "topic help" for pydoc
pydoc_topic_labels = [
@@ -230,11 +271,12 @@ class PydocTopicsBuilder(Builder):
document.append(doctree.ids[labelid])
destination = StringOutput(encoding='utf-8')
writer.write(document, destination)
- self.topics[label] = str(writer.output)
+ self.topics[label] = writer.output.encode('utf-8')
def finish(self):
f = open(path.join(self.outdir, 'topics.py'), 'w')
try:
+ f.write('# -*- coding: utf-8 -*-\n')
f.write('# Autogenerated by Sphinx on %s\n' % asctime())
f.write('topics = ' + pformat(self.topics) + '\n')
finally:
@@ -304,3 +346,4 @@ def setup(app):
app.add_description_unit('2to3fixer', '2to3fixer', '%s (2to3 fixer)')
app.add_directive_to_domain('py', 'decorator', PyDecoratorFunction)
app.add_directive_to_domain('py', 'decoratormethod', PyDecoratorMethod)
+ app.add_directive('miscnews', MiscNews)
diff --git a/Doc/tools/sphinxext/susp-ignored.csv b/Doc/tools/sphinxext/susp-ignored.csv
index 5076aed..2c15a5c 100644
--- a/Doc/tools/sphinxext/susp-ignored.csv
+++ b/Doc/tools/sphinxext/susp-ignored.csv
@@ -1,16 +1,24 @@
c-api/arg,,:ref,"PyArg_ParseTuple(args, ""O|O:ref"", &object, &callback)"
c-api/list,,:high,list[low:high]
c-api/list,,:high,list[low:high] = itemlist
+c-api/sequence,,:i2,del o[i1:i2]
c-api/sequence,,:i2,o[i1:i2]
c-api/sequence,,:i2,o[i1:i2] = v
-c-api/sequence,,:i2,del o[i1:i2]
c-api/unicode,,:end,str[start:end]
+c-api/unicode,,:start,unicode[start:start+length]
+distutils/examples,267,`,This is the description of the ``foobar`` package.
distutils/setupscript,,::,
extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))"
-extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {"
extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);"
+extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {"
extending/newtypes,,:call,"if (!PyArg_ParseTuple(args, ""sss:call"", &arg1, &arg2, &arg3)) {"
extending/windows,,:initspam,/export:initspam
+faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr("
+faq/programming,,::,for x in sequence[::-1]:
+faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,"
+faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,"
+faq/windows,229,:EOF,@setlocal enableextensions & python -x %~f0 %* & goto :EOF
+faq/windows,393,:REG,.py :REG_SZ: c:\<path to python>\python.exe -u %s %s
howto/cporting,,:add,"if (!PyArg_ParseTuple(args, ""ii:add_ints"", &one, &two))"
howto/cporting,,:encode,"if (!PyArg_ParseTuple(args, ""O:encode_object"", &myobj))"
howto/cporting,,:say,"if (!PyArg_ParseTuple(args, ""U:say_hello"", &name))"
@@ -22,19 +30,91 @@ howto/curses,,:magenta,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:m
howto/curses,,:red,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
howto/curses,,:white,"7:white."
howto/curses,,:yellow,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
+howto/ipaddress,,:DB8,>>> ipaddress.ip_address('2001:DB8::1')
+howto/ipaddress,,::,>>> ipaddress.ip_address('2001:DB8::1')
+howto/ipaddress,,:db8,IPv6Address('2001:db8::1')
+howto/ipaddress,,::,IPv6Address('2001:db8::1')
+howto/ipaddress,,:db8,IPv6Address('2001:db8::1')
+howto/ipaddress,,::,IPv6Address('2001:db8::1')
+howto/ipaddress,,::,IPv6Address('::1')
+howto/ipaddress,,:db8,>>> ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,::,>>> ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,:db8,IPv6Network('2001:db8::/96')
+howto/ipaddress,,::,IPv6Network('2001:db8::/96')
+howto/ipaddress,,:db8,IPv6Network('2001:db8::/128')
+howto/ipaddress,,::,IPv6Network('2001:db8::/128')
+howto/ipaddress,,:db8,>>> ipaddress.ip_network('2001:db8::1/96')
+howto/ipaddress,,::,>>> ipaddress.ip_network('2001:db8::1/96')
+howto/ipaddress,,:db8,IPv6Interface('2001:db8::1/96')
+howto/ipaddress,,::,IPv6Interface('2001:db8::1/96')
+howto/ipaddress,,:db8,>>> addr6 = ipaddress.ip_address('2001:db8::1')
+howto/ipaddress,,::,>>> addr6 = ipaddress.ip_address('2001:db8::1')
+howto/ipaddress,,:db8,>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
+howto/ipaddress,,::,>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
+howto/ipaddress,,:db8,IPv6Network('2001:db8::/96')
+howto/ipaddress,,::,IPv6Network('2001:db8::/96')
+howto/ipaddress,,:db8,>>> net6 = ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,::,>>> net6 = ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,:db8,>>> net6 = ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,::,>>> net6 = ipaddress.ip_network('2001:db8::0/96')
+howto/ipaddress,,:ffff,IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
+howto/ipaddress,,::,IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
+howto/ipaddress,,::,IPv6Address('::ffff:ffff')
+howto/ipaddress,,:ffff,IPv6Address('::ffff:ffff')
+howto/ipaddress,,::,IPv6Address('2001::1')
+howto/ipaddress,,::,IPv6Address('2001::ffff:ffff')
+howto/ipaddress,,:ffff,IPv6Address('2001::ffff:ffff')
+howto/ipaddress,,:db8,'2001:db8::'
+howto/ipaddress,,::,'2001:db8::'
+howto/ipaddress,,:db8,'2001:db8::/96'
+howto/ipaddress,,::,'2001:db8::/96'
+howto/logging,,:And,"WARNING:And this, too"
+howto/logging,,:And,"WARNING:root:And this, too"
+howto/logging,,:Doing,INFO:root:Doing something
+howto/logging,,:Finished,INFO:root:Finished
+howto/logging,,:logger,severity:logger name:message
+howto/logging,,:Look,WARNING:root:Look before you leap!
+howto/logging,,:message,severity:logger name:message
+howto/logging,,:root,DEBUG:root:This message should go to the log file
+howto/logging,,:root,INFO:root:Doing something
+howto/logging,,:root,INFO:root:Finished
+howto/logging,,:root,INFO:root:So should this
+howto/logging,,:root,INFO:root:Started
+howto/logging,,:root,"WARNING:root:And this, too"
+howto/logging,,:root,WARNING:root:Look before you leap!
+howto/logging,,:root,WARNING:root:Watch out!
+howto/logging,,:So,INFO:root:So should this
+howto/logging,,:So,INFO:So should this
+howto/logging,,:Started,INFO:root:Started
+howto/logging,,:This,DEBUG:root:This message should go to the log file
+howto/logging,,:This,DEBUG:This message should appear on the console
+howto/logging,,:Watch,WARNING:root:Watch out!
+howto/pyporting,75,::,# make sure to use :: Python *and* :: Python :: 3 so
+howto/pyporting,75,::,"'Programming Language :: Python',"
+howto/pyporting,75,::,'Programming Language :: Python :: 3'
howto/regex,,::,
howto/regex,,:foo,(?:foo)
howto/urllib2,,:example,"for example ""joe@password:example.com"""
howto/webservers,,.. image:,.. image:: http.png
library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)],"
+library/bisect,32,:hi,all(val >= x for val in a[i:hi])
+library/bisect,42,:hi,all(val > x for val in a[i:hi])
+library/configparser,,:home,my_dir: ${Common:home_dir}/twosheds
+library/configparser,,:option,${section:option}
+library/configparser,,:path,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
+library/configparser,,:Python,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
+library/configparser,,`,# Set the optional `raw` argument of get() to True if you wish to disable
+library/configparser,,:system,path: ${Common:system_dir}/Library/Frameworks/
+library/configparser,,`,# The optional `fallback` argument can be used to provide a fallback value
+library/configparser,,`,# The optional `vars` argument is a dict with members that will take
library/datetime,,:MM,
library/datetime,,:SS,
library/decimal,,:optional,"trailneg:optional trailing minus indicator"
library/difflib,,:ahi,a[alo:ahi]
library/difflib,,:bhi,b[blo:bhi]
+library/difflib,,:i1,
library/difflib,,:i2,
library/difflib,,:j2,
-library/difflib,,:i1,
library/dis,,:TOS,
library/dis,,`,TOS = `TOS`
library/doctest,,`,``factorial`` from the ``example`` module:
@@ -44,96 +124,186 @@ library/functions,,:step,a[start:stop:step]
library/functions,,:stop,"a[start:stop, i]"
library/functions,,:stop,a[start:stop:step]
library/hotshot,,:lineno,"ncalls tottime percall cumtime percall filename:lineno(function)"
-library/httplib,,:port,host:port
-library/imaplib,,:MM,"""DD-Mmm-YYYY HH:MM:SS +HHMM"""
-library/imaplib,,:SS,"""DD-Mmm-YYYY HH:MM:SS +HHMM"""
-library/itertools,,:stop,elements from seq[start:stop:step]
+library/http.client,,:port,host:port
+library/http.cookies,,`,!#$%&'*+-.^_`|~:
+library/imaplib,,:MM,"""DD-Mmm-YYYY HH:MM:SS"
+library/imaplib,,:SS,"""DD-Mmm-YYYY HH:MM:SS"
+library/inspect,,:int,">>> def foo(a, *, b:int, **kwargs):"
+library/inspect,,:int,"'(a, *, b:int, **kwargs)'"
+library/inspect,,:int,'b:int'
+library/ipaddress,,:db8,>>> ipaddress.ip_address('2001:db8::')
+library/ipaddress,,::,>>> ipaddress.ip_address('2001:db8::')
+library/ipaddress,,:db8,IPv6Address('2001:db8::')
+library/ipaddress,,::,IPv6Address('2001:db8::')
+library/ipaddress,,:db8,>>> ipaddress.IPv6Address('2001:db8::1000')
+library/ipaddress,,::,>>> ipaddress.IPv6Address('2001:db8::1000')
+library/ipaddress,,:db8,IPv6Address('2001:db8::1000')
+library/ipaddress,,::,IPv6Address('2001:db8::1000')
+library/ipaddress,,:db8,>>> ipaddress.IPv6Interface('2001:db8::1000/96')
+library/ipaddress,,::,>>> ipaddress.IPv6Interface('2001:db8::1000/96')
+library/ipaddress,,:db8,IPv6Interface('2001:db8::1000/96')
+library/ipaddress,,::,IPv6Interface('2001:db8::1000/96')
+library/ipaddress,,:db8,>>> ipaddress.IPv6Interface('2001:db8::1000/96').network
+library/ipaddress,,::,>>> ipaddress.IPv6Interface('2001:db8::1000/96').network
+library/ipaddress,,:db8,IPv6Network('2001:db8::/96')
+library/ipaddress,,::,IPv6Network('2001:db8::/96')
+library/ipaddress,,:db8,>>> ipaddress.IPv6Network('2001:db8::/96')
+library/ipaddress,,::,>>> ipaddress.IPv6Network('2001:db8::/96')
+library/ipaddress,,:db8,IPv6Network('2001:db8::/96')
+library/ipaddress,,::,IPv6Network('2001:db8::/96')
+library/ipaddress,,:db8,>>> ipaddress.IPv6Network('2001:db8::/96').netmask
+library/ipaddress,,::,>>> ipaddress.IPv6Network('2001:db8::/96').netmask
+library/ipaddress,,:ffff,IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
+library/ipaddress,,::,IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
+library/ipaddress,,:db8,">>> ipaddress.IPv6Network('2001:db8::1000/96', strict=False)"
+library/ipaddress,,::,">>> ipaddress.IPv6Network('2001:db8::1000/96', strict=False)"
+library/ipaddress,,::,"""::abc:7:def"""
+library/ipaddress,,:def,"""::abc:7:def"""
+library/ipaddress,,::,::FFFF/96
+library/ipaddress,,::,2002::/16
+library/ipaddress,,::,2001::/32
+library/ipaddress,,::,>>> str(ipaddress.IPv6Address('::1'))
+library/ipaddress,,::,'::1'
+library/ipaddress,,::,>>> int(ipaddress.IPv6Address('::1'))
+library/ipaddress,,:ff00,ffff:ff00::
+library/ipaddress,,:db00,2001:db00::0/24
+library/ipaddress,,::,2001:db00::0/24
+library/ipaddress,,:db00,2001:db00::0/ffff:ff00::
+library/ipaddress,,::,2001:db00::0/ffff:ff00::
+library/ipaddress,,:ff00,2001:db00::0/ffff:ff00::
library/itertools,,:step,elements from seq[start:stop:step]
+library/itertools,,:stop,elements from seq[start:stop:step]
library/linecache,,:sys,"sys:x:3:3:sys:/dev:/bin/sh"
library/logging,,:And,
+library/logging,,:Doing,INFO:root:Doing something
+library/logging,,:Finished,INFO:root:Finished
+library/logging,,:logger,severity:logger name:message
+library/logging,,:Look,WARNING:root:Look before you leap!
+library/logging,,:message,severity:logger name:message
library/logging,,:package1,
library/logging,,:package2,
+library/logging,,:port,host:port
library/logging,,:root,
+library/logging,,:So,INFO:root:So should this
+library/logging,,:So,INFO:So should this
+library/logging,,:Started,INFO:root:Started
library/logging,,:This,
-library/logging,,:port,host:port
+library/logging,,:Watch,WARNING:root:Watch out!
+library/logging.handlers,,:port,host:port
library/mmap,,:i2,obj[i1:i2]
-library/multiprocessing,,:queue,">>> QueueManager.register('get_queue', callable=lambda:queue)"
-library/multiprocessing,,`,">>> l._callmethod('__getitem__', (20,)) # equiv to `l[20]`"
-library/multiprocessing,,`,">>> l._callmethod('__getslice__', (2, 7)) # equiv to `l[2:7]`"
-library/multiprocessing,,`,# `BaseManager`.
-library/multiprocessing,,`,# `Pool.imap()` (which will save on the amount of code needed anyway).
+library/multiprocessing,,`,# Add more tasks using `put()`
library/multiprocessing,,`,# A test file for the `multiprocessing` package
library/multiprocessing,,`,# A test of `multiprocessing.Pool` class
-library/multiprocessing,,`,# Add more tasks using `put()`
+library/multiprocessing,,`,# `BaseManager`.
+library/multiprocessing,,`,`Cluster` is a subclass of `SyncManager` so it allows creation of
library/multiprocessing,,`,# create server for a `HostManager` object
library/multiprocessing,,`,# Depends on `multiprocessing` package -- tested with `processing-0.60`
+library/multiprocessing,,`,`hostname` gives the name of the host. If hostname is not
library/multiprocessing,,`,# in the original order then consider using `Pool.map()` or
+library/multiprocessing,,`,">>> l._callmethod('__getitem__', (20,)) # equiv to `l[20]`"
+library/multiprocessing,,`,">>> l._callmethod('__getslice__', (2, 7)) # equiv to `l[2:7]`"
library/multiprocessing,,`,# Not sure if we should synchronize access to `socket.accept()` method by
library/multiprocessing,,`,# object. (We import `multiprocessing.reduction` to enable this pickling.)
+library/multiprocessing,,`,# `Pool.imap()` (which will save on the amount of code needed anyway).
+library/multiprocessing,,:queue,">>> QueueManager.register('get_queue', callable=lambda:queue)"
library/multiprocessing,,`,# register the Foo class; make `f()` and `g()` accessible via proxy
library/multiprocessing,,`,# register the Foo class; make `g()` and `_h()` accessible via proxy
library/multiprocessing,,`,# register the generator function baz; use `GeneratorProxy` to make proxies
-library/multiprocessing,,`,`Cluster` is a subclass of `SyncManager` so it allows creation of
-library/multiprocessing,,`,`hostname` gives the name of the host. If hostname is not
library/multiprocessing,,`,`slots` is used to specify the number of slots for processes on
+library/nntplib,,:bytes,:bytes
+library/nntplib,,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
+library/nntplib,,:lines,:lines
+library/nntplib,,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
library/optparse,,:len,"del parser.rargs[:len(value)]"
library/os.path,,:foo,c:foo
library/parser,,`,"""Make a function that raises an argument to the exponent `exp`."""
+library/pdb,,:lineno,filename:lineno
+library/pdb,,:lineno,[filename:lineno | bpnumber [bpnumber ...]]
+library/pickle,,:memory,"conn = sqlite3.connect("":memory:"")"
library/posix,,`,"CFLAGS=""`getconf LFS_CFLAGS`"" OPT=""-g -O2 $CFLAGS"""
-library/profile,,:lineno,ncalls tottime percall cumtime percall filename:lineno(function)
+library/pprint,209,::,"'classifiers': ['Development Status :: 4 - Beta',"
+library/pprint,209,::,"'Intended Audience :: Developers',"
+library/pprint,209,::,"'License :: OSI Approved :: MIT License',"
+library/pprint,209,::,"'Natural Language :: English',"
+library/pprint,209,::,"'Operating System :: OS Independent',"
+library/pprint,209,::,"'Programming Language :: Python',"
+library/pprint,209,::,"'Programming Language :: Python :: 2',"
+library/pprint,209,::,"'Programming Language :: Python :: 2.6',"
+library/pprint,209,::,"'Programming Language :: Python :: 2.7',"
+library/pprint,209,::,"'Topic :: Software Development :: Libraries',"
+library/pprint,209,::,"'Topic :: Software Development :: Libraries :: Python Modules'],"
library/profile,,:lineno,filename:lineno(function)
+library/profile,,:lineno,ncalls tottime percall cumtime percall filename:lineno(function)
+library/profile,,:lineno,"(sort by filename:lineno),"
library/pyexpat,,:elem1,<py:elem1 />
library/pyexpat,,:py,"xmlns:py = ""http://www.python.org/ns/"">"
library/repr,,`,"return `obj`"
library/smtplib,,:port,"as well as a regular host:port server."
+library/smtplib,,:port,method must support that as well as a regular host:port
+library/socket,,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]"
library/socket,,::,'5aef:2b::8'
-library/sqlite3,,:memory,
+library/socket,,:can,"return (can_id, can_dlc, data[:can_dlc])"
+library/socket,,:len,fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
+library/sqlite3,,:age,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})"
library/sqlite3,,:age,"select name_last, age from people where name_last=:who and age=:age"
-library/sqlite3,,:who,"select name_last, age from people where name_last=:who and age=:age"
-library/ssl,,:My,"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc."
+library/sqlite3,,:memory,
+library/sqlite3,,:who,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})"
library/ssl,,:My,"Organizational Unit Name (eg, section) []:My Group"
+library/ssl,,:My,"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc."
library/ssl,,:myserver,"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com"
library/ssl,,:MyState,State or Province Name (full name) [Some-State]:MyState
library/ssl,,:ops,Email Address []:ops@myserver.mygroup.myorganization.com
library/ssl,,:Some,"Locality Name (eg, city) []:Some City"
library/ssl,,:US,Country Name (2 letter code) [AU]:US
+library/stdtypes,,::,>>> a[::-1].tolist()
+library/stdtypes,,::,>>> a[::2].tolist()
+library/stdtypes,,:end,s[start:end]
+library/stdtypes,,::,>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
library/stdtypes,,:len,s[len(s):len(s)]
-library/stdtypes,,:len,s[len(s):len(s)]
-library/string,,:end,s[start:end]
+library/stdtypes,,::,>>> y = m[::2]
+library/stdtypes,,::,>>> z = y[::-2]
library/string,,:end,s[start:end]
-library/subprocess,,`,"output=`mycmd myarg`"
library/subprocess,,`,"output=`dmesg | grep hda`"
+library/subprocess,,`,"output=`mycmd myarg`"
+library/tarfile,,:bz2,
library/tarfile,,:compression,filemode[:compression]
library/tarfile,,:gz,
-library/tarfile,,:bz2,
+library/tarfile,,:xz,'a:xz'
+library/tarfile,,:xz,'r:xz'
+library/tarfile,,:xz,'w:xz'
library/time,,:mm,
library/time,,:ss,
library/turtle,,::,Example::
-library/urllib,,:port,:port
library/urllib2,,:password,"""joe:password@python.org"""
+library/urllib,,:port,:port
+library/urllib.request,,:close,Connection:close
+library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n<head>\n"
+library/urllib.request,,:password,"""joe:password@python.org"""
library/uuid,,:uuid,urn:uuid:12345678-1234-5678-1234-567812345678
-library/xmlrpclib,,:pass,http://user:pass@host:port/path
-library/xmlrpclib,,:pass,user:pass
-library/xmlrpclib,,:port,http://user:pass@host:port/path
+library/xmlrpc.client,,:pass,http://user:pass@host:port/path
+library/xmlrpc.client,,:pass,user:pass
+library/xmlrpc.client,,:port,http://user:pass@host:port/path
+license,,`,"``Software''), to deal in the Software without restriction, including"
+license,,`,"THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,"
+license,,`,* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+license,,`,THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+license,,`,* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
license,,`,THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
license,,:zooko,mailto:zooko@zooko.com
-license,,`,THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-reference/datamodel,,:step,a[i:j:step]
reference/datamodel,,:max,
-reference/expressions,,:index,x[index:index]
+reference/datamodel,,:step,a[i:j:step]
reference/expressions,,:datum,{key:datum...}
reference/expressions,,`,`expressions...`
+reference/expressions,,:index,x[index:index]
reference/grammar,,:output,#diagram:output
reference/grammar,,:rules,#diagram:rules
-reference/grammar,,:token,#diagram:token
reference/grammar,,`,'`' testlist1 '`'
-reference/lexical_analysis,,:fileencoding,# vim:fileencoding=<encoding-name>
+reference/grammar,,:token,#diagram:token
reference/lexical_analysis,,`,", : . ` = ;"
-tutorial/datastructures,,:value,key:value pairs within the braces adds initial key:value pairs
+reference/lexical_analysis,,`,$ ? `
+reference/lexical_analysis,,:fileencoding,# vim:fileencoding=<encoding-name>
tutorial/datastructures,,:value,It is also possible to delete a key:value
-tutorial/stdlib2,,:start,"fields = struct.unpack('<IIIHH', data[start:start+16])"
-tutorial/stdlib2,,:start,extra = data[start:start+extra_size]
-tutorial/stdlib2,,:start,filename = data[start:start+filenamesize]
+tutorial/datastructures,,:value,key:value pairs within the braces adds initial key:value pairs
tutorial/stdlib2,,:config,"logging.warning('Warning:config file %s not found', 'server.conf')"
tutorial/stdlib2,,:config,WARNING:root:Warning:config file server.conf not found
tutorial/stdlib2,,:Critical,CRITICAL:root:Critical error -- shutting down
@@ -141,15 +311,16 @@ tutorial/stdlib2,,:Error,ERROR:root:Error occurred
tutorial/stdlib2,,:root,CRITICAL:root:Critical error -- shutting down
tutorial/stdlib2,,:root,ERROR:root:Error occurred
tutorial/stdlib2,,:root,WARNING:root:Warning:config file server.conf not found
+tutorial/stdlib2,,:start,extra = data[start:start+extra_size]
+tutorial/stdlib2,,:start,"fields = struct.unpack('<IIIHH', data[start:start+16])"
+tutorial/stdlib2,,:start,filename = data[start:start+filenamesize]
tutorial/stdlib2,,:Warning,WARNING:root:Warning:config file server.conf not found
-using/cmdline,,:line,file:line: category: message
using/cmdline,,:category,action:message:category:module:line
+using/cmdline,,:errorhandler,:errorhandler
using/cmdline,,:line,action:message:category:module:line
+using/cmdline,,:line,file:line: category: message
using/cmdline,,:message,action:message:category:module:line
using/cmdline,,:module,action:message:category:module:line
-using/cmdline,,:errorhandler,:errorhandler
-using/windows,162,`,`` this fixes syntax highlighting errors in some editors due to the \\\\ hackery
-using/windows,170,`,``
whatsnew/2.0,418,:len,
whatsnew/2.3,,::,
whatsnew/2.3,,:config,
@@ -163,113 +334,38 @@ whatsnew/2.4,,:System,
whatsnew/2.5,,:memory,:memory:
whatsnew/2.5,,:step,[start:stop:step]
whatsnew/2.5,,:stop,[start:stop:step]
-distutils/examples,267,`,This is the description of the ``foobar`` package.
-faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,"
-faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,"
-faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr("
-faq/programming,,::,for x in sequence[::-1]:
-faq/windows,229,:EOF,@setlocal enableextensions & python -x %~f0 %* & goto :EOF
-faq/windows,393,:REG,.py :REG_SZ: c:\<path to python>\python.exe -u %s %s
-library/bisect,32,:hi,all(val >= x for val in a[i:hi])
-library/bisect,42,:hi,all(val > x for val in a[i:hi])
-library/http.client,52,:port,host:port
-library/nntplib,,:bytes,:bytes
-library/nntplib,,:lines,:lines
-library/nntplib,,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
-library/nntplib,,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
-library/pickle,,:memory,"conn = sqlite3.connect("":memory:"")"
-library/profile,,:lineno,"(sort by filename:lineno),"
-library/socket,,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]"
-library/stdtypes,,:end,s[start:end]
-library/stdtypes,,:end,s[start:end]
-library/urllib.request,,:close,Connection:close
-library/urllib.request,,:password,"""joe:password@python.org"""
-library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n<head>\n"
-library/xmlrpc.client,103,:pass,http://user:pass@host:port/path
-library/xmlrpc.client,103,:port,http://user:pass@host:port/path
-library/xmlrpc.client,103,:pass,user:pass
-license,,`,* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
-license,,`,* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
-license,,`,"``Software''), to deal in the Software without restriction, including"
-license,,`,"THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,"
-reference/lexical_analysis,704,`,$ ? `
+whatsnew/2.7,1619,::,"ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',"
+whatsnew/2.7,1619,::,>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
whatsnew/2.7,735,:Sunday,'2009:4:Sunday'
-whatsnew/2.7,862,::,"export PYTHONWARNINGS=all,error:::Cookie:0"
whatsnew/2.7,862,:Cookie,"export PYTHONWARNINGS=all,error:::Cookie:0"
-whatsnew/2.7,1619,::,>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
-whatsnew/2.7,1619,::,"ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',"
-library/configparser,,`,# Set the optional `raw` argument of get() to True if you wish to disable
-library/configparser,,`,# The optional `vars` argument is a dict with members that will take
-library/configparser,,`,# The optional `fallback` argument can be used to provide a fallback value
-library/configparser,,:option,${section:option}
-library/configparser,,:system,path: ${Common:system_dir}/Library/Frameworks/
-library/configparser,,:home,my_dir: ${Common:home_dir}/twosheds
-library/configparser,,:path,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
-library/configparser,,:Python,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
-library/pdb,,:lineno,[filename:lineno | bpnumber [bpnumber ...]]
-library/pdb,,:lineno,filename:lineno
-library/logging,,:Watch,WARNING:root:Watch out!
-library/logging,,:So,INFO:root:So should this
-library/logging,,:Started,INFO:root:Started
-library/logging,,:Doing,INFO:root:Doing something
-library/logging,,:Finished,INFO:root:Finished
-library/logging,,:Look,WARNING:root:Look before you leap!
-library/logging,,:So,INFO:So should this
-library/logging,,:logger,severity:logger name:message
-library/logging,,:message,severity:logger name:message
-whatsnew/3.2,,:directory,... ${buildout:directory}/downloads/dist
-whatsnew/3.2,,:location,... zope9-location = ${zope9:location}
-whatsnew/3.2,,:prefix,... zope-conf = ${custom:prefix}/etc/zope.conf
-howto/logging,,:root,WARNING:root:Watch out!
-howto/logging,,:Watch,WARNING:root:Watch out!
-howto/logging,,:root,DEBUG:root:This message should go to the log file
-howto/logging,,:This,DEBUG:root:This message should go to the log file
-howto/logging,,:root,INFO:root:So should this
-howto/logging,,:So,INFO:root:So should this
-howto/logging,,:root,"WARNING:root:And this, too"
-howto/logging,,:And,"WARNING:root:And this, too"
-howto/logging,,:root,INFO:root:Started
-howto/logging,,:Started,INFO:root:Started
-howto/logging,,:root,INFO:root:Doing something
-howto/logging,,:Doing,INFO:root:Doing something
-howto/logging,,:root,INFO:root:Finished
-howto/logging,,:Finished,INFO:root:Finished
-howto/logging,,:root,WARNING:root:Look before you leap!
-howto/logging,,:Look,WARNING:root:Look before you leap!
-howto/logging,,:This,DEBUG:This message should appear on the console
-howto/logging,,:So,INFO:So should this
-howto/logging,,:And,"WARNING:And this, too"
-howto/logging,,:logger,severity:logger name:message
-howto/logging,,:message,severity:logger name:message
-library/logging.handlers,,:port,host:port
-library/imaplib,116,:MM,"""DD-Mmm-YYYY HH:MM:SS"
-library/imaplib,116,:SS,"""DD-Mmm-YYYY HH:MM:SS"
-whatsnew/3.2,,::,"$ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'"
-howto/pyporting,75,::,# make sure to use :: Python *and* :: Python :: 3 so
-howto/pyporting,75,::,"'Programming Language :: Python',"
-howto/pyporting,75,::,'Programming Language :: Python :: 3'
-whatsnew/3.2,,:gz,">>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:"
-whatsnew/3.2,,:directory,${buildout:directory}/downloads/dist
-whatsnew/3.2,,:location,zope9-location = ${zope9:location}
-whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf
-whatsnew/3.2,,:beef,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
-whatsnew/3.2,,:cafe,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
+whatsnew/2.7,862,::,"export PYTHONWARNINGS=all,error:::Cookie:0"
+whatsnew/3.2,,:affe,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
whatsnew/3.2,,:affe,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
-whatsnew/3.2,,:deaf,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
-whatsnew/3.2,,:feed,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
whatsnew/3.2,,:beef,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
+whatsnew/3.2,,:beef,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
whatsnew/3.2,,:cafe,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
-whatsnew/3.2,,:affe,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
+whatsnew/3.2,,:cafe,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
whatsnew/3.2,,:deaf,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
+whatsnew/3.2,,:deaf,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
+whatsnew/3.2,,:directory,... ${buildout:directory}/downloads/dist
+whatsnew/3.2,,:directory,${buildout:directory}/downloads/dist
+whatsnew/3.2,,::,"$ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'"
whatsnew/3.2,,:feed,"netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',"
-library/pprint,209,::,"'classifiers': ['Development Status :: 4 - Beta',"
-library/pprint,209,::,"'Intended Audience :: Developers',"
-library/pprint,209,::,"'License :: OSI Approved :: MIT License',"
-library/pprint,209,::,"'Natural Language :: English',"
-library/pprint,209,::,"'Operating System :: OS Independent',"
-library/pprint,209,::,"'Programming Language :: Python',"
-library/pprint,209,::,"'Programming Language :: Python :: 2',"
-library/pprint,209,::,"'Programming Language :: Python :: 2.6',"
-library/pprint,209,::,"'Programming Language :: Python :: 2.7',"
-library/pprint,209,::,"'Topic :: Software Development :: Libraries',"
-library/pprint,209,::,"'Topic :: Software Development :: Libraries :: Python Modules'],"
+whatsnew/3.2,,:feed,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
+whatsnew/3.2,,:gz,">>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:"
+whatsnew/3.2,,:location,... zope9-location = ${zope9:location}
+whatsnew/3.2,,:location,zope9-location = ${zope9:location}
+whatsnew/3.2,,:prefix,... zope-conf = ${custom:prefix}/etc/zope.conf
+whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf
+whatsnew/news,,:platform,:platform:
+whatsnew/news,,:password,: Unquote before b64encoding user:password during Basic
+whatsnew/news,,:close,Connection:close header.
+whatsnew/news,,:PythonCmd,"With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused"
+whatsnew/news,,:close,: Connection:close header is sent by requests using URLOpener
+whatsnew/news,,::,": Fix FTP tests for IPv6, bind to ""::1"" instead of ""localhost""."
+whatsnew/news,,:test,: test_subprocess:test_leaking_fds_on_error no longer gives a
+whatsnew/news,,:test,: Fix test_posix:test_getgroups failure under Solaris. Patch
+whatsnew/news,,:Olimit,Drop -OPT:Olimit compiler option.
+whatsnew/news,,:MAXYEAR,timedelta from date or datetime falls outside of the MINYEAR:MAXYEAR range.
+whatsnew/news,,:bz2,with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
+whatsnew/news,,:db2,: Add configure option --with-dbmliborder=db1:db2:... to specify
diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst
index cff2710..3283e54 100644
--- a/Doc/tutorial/classes.rst
+++ b/Doc/tutorial/classes.rst
@@ -184,7 +184,6 @@ The output of the example code is:
.. code-block:: none
-
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
@@ -698,9 +697,9 @@ example, the following code will print B, C, D in that order::
class D(C):
pass
- for c in [B, C, D]:
+ for cls in [B, C, D]:
try:
- raise c()
+ raise cls()
except D:
print("D")
except C:
diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst
index e008dd8..36abc9c 100644
--- a/Doc/tutorial/datastructures.rst
+++ b/Doc/tutorial/datastructures.rst
@@ -19,13 +19,13 @@ objects:
.. method:: list.append(x)
:noindex:
- Add an item to the end of the list; equivalent to ``a[len(a):] = [x]``.
+ Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``.
.. method:: list.extend(L)
:noindex:
- Extend the list by appending all the items in the given list; equivalent to
+ Extend the list by appending all the items in the given list. Equivalent to
``a[len(a):] = L``.
@@ -40,8 +40,8 @@ objects:
.. method:: list.remove(x)
:noindex:
- Remove the first item from the list whose value is *x*. It is an error if there
- is no such item.
+ Remove the first item from the list whose value is *x*. It is an error if
+ there is no such item.
.. method:: list.pop([i])
@@ -70,13 +70,14 @@ objects:
.. method:: list.sort()
:noindex:
- Sort the items of the list, in place.
+ Sort the items of the list in place.
.. method:: list.reverse()
:noindex:
- Reverse the elements of the list, in place.
+ Reverse the elements of the list in place.
+
An example that uses most of the list methods::
@@ -99,6 +100,10 @@ An example that uses most of the list methods::
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
+You might have noticed that methods like ``insert``, ``remove`` or ``sort`` that
+modify the list have no return value printed -- they return ``None``. [1]_ This
+is a design principle for all mutable data structures in Python.
+
.. _tut-lists-as-stacks:
@@ -480,7 +485,7 @@ using a non-existent key.
Performing ``list(d.keys())`` on a dictionary returns a list of all the keys
used in the dictionary, in arbitrary order (if you want it sorted, just use
-``sorted(d.keys())`` instead). [1]_ To check whether a single key is in the
+``sorted(d.keys())`` instead). [2]_ To check whether a single key is in the
dictionary, use the :keyword:`in` keyword.
Here is a small example using a dictionary::
@@ -677,6 +682,9 @@ interpreter will raise a :exc:`TypeError` exception.
.. rubric:: Footnotes
-.. [1] Calling ``d.keys()`` will return a :dfn:`dictionary view` object. It
+.. [1] Other languages may return the mutated object, which allows method
+ chaining, such as ``d->insert("a")->remove("b")->sort();``.
+
+.. [2] Calling ``d.keys()`` will return a :dfn:`dictionary view` object. It
supports operations like membership test and iteration, but its contents
are not independent of the original dictionary -- it is only a *view*.
diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst
index d61dafc..cdc2bf2 100644
--- a/Doc/tutorial/interpreter.rst
+++ b/Doc/tutorial/interpreter.rst
@@ -10,13 +10,13 @@ Using the Python Interpreter
Invoking the Interpreter
========================
-The Python interpreter is usually installed as :file:`/usr/local/bin/python3.2`
+The Python interpreter is usually installed as :file:`/usr/local/bin/python3.3`
on those machines where it is available; putting :file:`/usr/local/bin` in your
Unix shell's search path makes it possible to start it by typing the command:
.. code-block:: text
- python3.2
+ python3.3
to the shell. [#]_ Since the choice of the directory where the interpreter lives
is an installation option, other places are possible; check with your local
@@ -24,11 +24,11 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a
popular alternative location.)
On Windows machines, the Python installation is usually placed in
-:file:`C:\\Python32`, though you can change this when you're running the
+:file:`C:\\Python33`, though you can change this when you're running the
installer. To add this directory to your path, you can type the following
command into the command prompt in a DOS box::
- set path=%path%;C:\python32
+ set path=%path%;C:\python33
Typing an end-of-file character (:kbd:`Control-D` on Unix, :kbd:`Control-Z` on
Windows) at the primary prompt causes the interpreter to exit with a zero exit
@@ -95,8 +95,8 @@ with the *secondary prompt*, by default three dots (``...``). The interpreter
prints a welcome message stating its version number and a copyright notice
before printing the first prompt::
- $ python3.2
- Python 3.2.3 (default, May 3 2012, 15:54:42)
+ $ python3.3
+ Python 3.3 (default, Sep 24 2012, 09:25:04)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
@@ -149,7 +149,7 @@ Executable Python Scripts
On BSD'ish Unix systems, Python scripts can be made directly executable, like
shell scripts, by putting the line ::
- #! /usr/bin/env python3.2
+ #! /usr/bin/env python3.3
(assuming that the interpreter is on the user's :envvar:`PATH`) at the beginning
of the script and giving the file an executable mode. The ``#!`` must be the
diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst
index b6d94ac..c07a668 100644
--- a/Doc/tutorial/introduction.rst
+++ b/Doc/tutorial/introduction.rst
@@ -390,7 +390,7 @@ The built-in function :func:`len` returns the length of a string::
.. seealso::
- :ref:`typesseq`
+ :ref:`textseq`
Strings are examples of *sequence types*, and support the common
operations supported by such types.
diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst
index 128e6a6..1ebf792 100644
--- a/Doc/tutorial/stdlib.rst
+++ b/Doc/tutorial/stdlib.rst
@@ -15,7 +15,7 @@ operating system::
>>> import os
>>> os.getcwd() # Return the current working directory
- 'C:\\Python31'
+ 'C:\\Python33'
>>> os.chdir('/server/accesslogs') # Change current working directory
>>> os.system('mkdir today') # Run the command mkdir in the system shell
0
@@ -203,7 +203,7 @@ Data Compression
================
Common data archiving and compression formats are directly supported by modules
-including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`zipfile` and
+including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` and
:mod:`tarfile`. ::
>>> import zlib
diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst
index 2265cd0..4b6e036 100644
--- a/Doc/tutorial/stdlib2.rst
+++ b/Doc/tutorial/stdlib2.rst
@@ -141,7 +141,9 @@ standard size and in little-endian byte order::
import struct
- data = open('myfile.zip', 'rb').read()
+ with open('myfile.zip', 'rb') as f:
+ data = f.read()
+
start = 0
for i in range(3): # show the first 3 file headers
start += 14
@@ -273,7 +275,7 @@ applications include caching objects that are expensive to create::
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
d['primary'] # entry was automatically removed
- File "C:/python31/lib/weakref.py", line 46, in __getitem__
+ File "C:/python33/lib/weakref.py", line 46, in __getitem__
o = self.data[key]()
KeyError: 'primary'
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
index cd4d02f..2703684 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -24,7 +24,7 @@ Command line
When invoking Python, you may specify any of these options::
- python [-bBdEhiORqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
+ python [-bBdEhiOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
The most common use case is, of course, a simple invocation of a script::
@@ -229,23 +229,22 @@ Miscellaneous options
.. cmdoption:: -R
- Turn on hash randomization, so that the :meth:`__hash__` values of str, bytes
- and datetime objects are "salted" with an unpredictable random value.
- Although they remain constant within an individual Python process, they are
- not predictable between repeated invocations of Python.
+ Kept for compatibility. On Python 3.3 and greater, hash randomization is
+ turned on by default.
- This is intended to provide protection against a denial-of-service caused by
- carefully-chosen inputs that exploit the worst case performance of a dict
- construction, O(n^2) complexity. See
- http://www.ocert.org/advisories/ocert-2011-003.html for details.
+ On previous versions of Python, this option turns on hash randomization,
+ so that the :meth:`__hash__` values of str, bytes and datetime
+ are "salted" with an unpredictable random value. Although they remain
+ constant within an individual Python process, they are not predictable
+ between repeated invocations of Python.
- Changing hash values affects the order in which keys are retrieved from a
- dict. Although Python has never made guarantees about this ordering (and it
- typically varies between 32-bit and 64-bit builds), enough real-world code
- implicitly relies on this non-guaranteed behavior that the randomization is
- disabled by default.
+ Hash randomization is intended to provide protection against a
+ denial-of-service caused by carefully-chosen inputs that exploit the worst
+ case performance of a dict construction, O(n^2) complexity. See
+ http://www.ocert.org/advisories/ocert-2011-003.html for details.
- See also :envvar:`PYTHONHASHSEED`.
+ :envvar:`PYTHONHASHSEED` allows you to set a fixed value for the hash
+ seed secret.
.. versionadded:: 3.2.3
@@ -263,7 +262,9 @@ Miscellaneous options
.. cmdoption:: -S
Disable the import of the module :mod:`site` and the site-dependent
- manipulations of :data:`sys.path` that it entails.
+ manipulations of :data:`sys.path` that it entails. Also disable these
+ manipulations if :mod:`site` is explicitly imported later (call
+ :func:`site.main` if you want them to be triggered).
.. cmdoption:: -u
@@ -357,7 +358,8 @@ Miscellaneous options
.. cmdoption:: -X
Reserved for various implementation-specific options. CPython currently
- defines none of them, but allows to pass arbitrary values and retrieve
+ defines just one, you can use ``-X faulthander`` to enable
+ :data:`faulthandler`. It also allows to pass arbitrary values and retrieve
them through the :data:`sys._xoptions` dictionary.
.. versionchanged:: 3.2
@@ -475,7 +477,7 @@ conflict.
.. envvar:: PYTHONCASEOK
If this is set, Python ignores case in :keyword:`import` statements. This
- only works on Windows, OS X, and OS/2.
+ only works on Windows and OS X.
.. envvar:: PYTHONDONTWRITEBYTECODE
@@ -487,9 +489,8 @@ conflict.
.. envvar:: PYTHONHASHSEED
- If this variable is set to ``random``, the effect is the same as specifying
- the :option:`-R` option: a random value is used to seed the hashes of str,
- bytes and datetime objects.
+ If this variable is not set or set to ``random``, a random value is used
+ to seed the hashes of str, bytes and datetime objects.
If :envvar:`PYTHONHASHSEED` is set to an integer value, it is used as a fixed
seed for generating the hash() of the types covered by the hash
@@ -500,8 +501,7 @@ conflict.
values.
The integer must be a decimal number in the range [0,4294967295]. Specifying
- the value 0 will lead to the same hash values as when hash randomization is
- disabled.
+ the value 0 will disable hash randomization.
.. versionadded:: 3.2.3
@@ -531,8 +531,8 @@ conflict.
Defines the :data:`user base directory <site.USER_BASE>`, which is used to
compute the path of the :data:`user site-packages directory <site.USER_SITE>`
- and :ref:`Distutils installation paths <inst-alt-install-user>` for ``python
- setup.py install --user``.
+ and :ref:`Distutils installation paths <inst-alt-install-user>` for
+ ``python setup.py install --user``.
.. seealso::
@@ -551,6 +551,14 @@ conflict.
separated string, it is equivalent to specifying :option:`-W` multiple
times.
+.. envvar:: PYTHONFAULTHANDLER
+
+ If this environment variable is set, :func:`faulthandler.enable` is called
+ at startup: install a handler for :const:`SIGSEGV`, :const:`SIGFPE`,
+ :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL` signals to dump the
+ Python traceback. This is equivalent to :option:`-X` ``faulthandler``
+ option.
+
Debug-mode variables
~~~~~~~~~~~~~~~~~~~~
diff --git a/Doc/using/index.rst b/Doc/using/index.rst
index 1201153..502afa9 100644
--- a/Doc/using/index.rst
+++ b/Doc/using/index.rst
@@ -17,4 +17,4 @@ interpreter and things that make working with Python easier.
unix.rst
windows.rst
mac.rst
-
+ scripts.rst
diff --git a/Doc/using/scripts.rst b/Doc/using/scripts.rst
new file mode 100644
index 0000000..2c87416
--- /dev/null
+++ b/Doc/using/scripts.rst
@@ -0,0 +1,12 @@
+.. _tools-and-scripts:
+
+Additional Tools and Scripts
+============================
+
+.. _scripts-pyvenv:
+
+pyvenv - Creating virtual environments
+--------------------------------------
+
+.. include:: venv-create.inc
+
diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc
new file mode 100644
index 0000000..5fdbc9b
--- /dev/null
+++ b/Doc/using/venv-create.inc
@@ -0,0 +1,85 @@
+Creation of :ref:`virtual environments <venv-def>` is done by executing the
+``pyvenv`` script::
+
+ pyvenv /path/to/new/virtual/environment
+
+Running this command creates the target directory (creating any parent
+directories that don't exist already) and places a ``pyvenv.cfg`` file in it
+with a ``home`` key pointing to the Python installation the command was run
+from. It also creates a ``bin`` (or ``Scripts`` on Windows) subdirectory
+containing a copy of the ``python`` binary (or binaries, in the case of
+Windows). It also creates an (initially empty) ``lib/pythonX.Y/site-packages``
+subdirectory (on Windows, this is ``Lib\site-packages``).
+
+.. highlight:: none
+
+On Windows, you may have to invoke the ``pyvenv`` script as follows, if you
+don't have the relevant PATH and PATHEXT settings::
+
+ c:\Temp>c:\Python33\python c:\Python33\Tools\Scripts\pyvenv.py myenv
+
+or equivalently::
+
+ c:\Temp>c:\Python33\python -m venv myenv
+
+The command, if run with ``-h``, will show the available options::
+
+ usage: pyvenv [-h] [--system-site-packages] [--symlinks] [--clear]
+ [--upgrade] ENV_DIR [ENV_DIR ...]
+
+ Creates virtual Python environments in one or more target directories.
+
+ positional arguments:
+ ENV_DIR A directory to create the environment in.
+
+ optional arguments:
+ -h, --help show this help message and exit
+ --system-site-packages Give access to the global site-packages dir to the
+ virtual environment.
+ --symlinks Try to use symlinks rather than copies, when symlinks
+ are not the default for the platform.
+ --clear Delete the environment directory if it already exists.
+ If not specified and the directory exists, an error is
+ raised.
+ --upgrade Upgrade the environment directory to use this version
+ of Python, assuming Python has been upgraded in-place.
+
+If the target directory already exists an error will be raised, unless
+the ``--clear`` or ``--upgrade`` option was provided.
+
+The created ``pyvenv.cfg`` file also includes the
+``include-system-site-packages`` key, set to ``true`` if ``venv`` is
+run with the ``--system-site-packages`` option, ``false`` otherwise.
+
+Multiple paths can be given to ``pyvenv``, in which case an identical
+virtualenv will be created, according to the given options, at each
+provided path.
+
+Once a venv has been created, it can be "activated" using a script in the
+venv's binary directory. The invocation of the script is platform-specific: on
+a Posix platform, you would typically do::
+
+ $ source <venv>/bin/activate
+
+whereas on Windows, you might do::
+
+ C:\> <venv>/Scripts/activate
+
+if you are using the ``cmd.exe`` shell, or perhaps::
+
+ PS C:\> <venv>/Scripts/Activate.ps1
+
+if you use PowerShell.
+
+You don't specifically *need* to activate an environment; activation just
+prepends the venv's binary directory to your path, so that "python" invokes the
+venv's Python interpreter and you can run installed scripts without having to
+use their full path. However, all scripts installed in a venv should be
+runnable without activating it, and run with the venv's Python automatically.
+
+You can deactivate a venv by typing "deactivate" in your shell. The exact
+mechanism is platform-specific: for example, the Bash activation script defines
+a "deactivate" function, whereas on Windows there are separate scripts called
+``deactivate.bat`` and ``Deactivate.ps1`` which are installed when the venv is
+created.
+
diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst
index 742a290..ae25215 100644
--- a/Doc/using/windows.rst
+++ b/Doc/using/windows.rst
@@ -82,6 +82,8 @@ In order to run Python flawlessly, you might have to change certain environment
settings in Windows.
+.. _setting-envvars:
+
Excursus: Setting environment variables
---------------------------------------
@@ -130,21 +132,33 @@ Consult :command:`set /?` for details on this behaviour.
Setting Environment variables, Louis J. Farrugia
+.. _windows-path-mod:
+
Finding the Python executable
-----------------------------
+.. versionchanged:: 3.3
+
Besides using the automatically created start menu entry for the Python
-interpreter, you might want to start Python in the DOS prompt. To make this
-work, you need to set your :envvar:`%PATH%` environment variable to include the
-directory of your Python distribution, delimited by a semicolon from other
-entries. An example variable could look like this (assuming the first two
-entries are Windows' default)::
+interpreter, you might want to start Python in the command prompt. As of
+Python 3.3, the installer has an option to set that up for you.
- C:\WINDOWS\system32;C:\WINDOWS;C:\Python25
+At the "Customize Python 3.3" screen, an option called
+"Add python.exe to search path" can be enabled to have the installer place
+your installation into the :envvar:`%PATH%`. This allows you to type
+:command:`python` to run the interpreter. Thus, you can also execute your
+scripts with command line options, see :ref:`using-on-cmdline` documentation.
-Typing :command:`python` on your command prompt will now fire up the Python
-interpreter. Thus, you can also execute your scripts with command line options,
-see :ref:`using-on-cmdline` documentation.
+If you don't enable this option at install time, you can always re-run the
+installer to choose it.
+
+The alternative is manually modifying the :envvar:`%PATH%` using the
+directions in :ref:`setting-envvars`. You need to set your :envvar:`%PATH%`
+environment variable to include the directory of your Python distribution,
+delimited by a semicolon from other entries. An example variable could look
+like this (assuming the first two entries are Windows' default)::
+
+ C:\WINDOWS\system32;C:\WINDOWS;C:\Python33
Finding modules
@@ -203,13 +217,19 @@ The end result of all this is:
Executing scripts
-----------------
-Python scripts (files with the extension ``.py``) will be executed by
-:program:`python.exe` by default. This executable opens a terminal, which stays
-open even if the program uses a GUI. If you do not want this to happen, use the
-extension ``.pyw`` which will cause the script to be executed by
-:program:`pythonw.exe` by default (both executables are located in the top-level
-of your Python installation directory). This suppresses the terminal window on
-startup.
+As of Python 3.3, Python includes a launcher which facilitates running Python
+scripts. See :ref:`launcher` for more information.
+
+Executing scripts without the Python launcher
+---------------------------------------------
+
+Without the Python launcher installed, Python scripts (files with the extension
+``.py``) will be executed by :program:`python.exe` by default. This executable
+opens a terminal, which stays open even if the program uses a GUI. If you do
+not want this to happen, use the extension ``.pyw`` which will cause the script
+to be executed by :program:`pythonw.exe` by default (both executables are
+located in the top-level of your Python installation directory). This
+suppresses the terminal window on startup.
You can also make all ``.py`` scripts execute with :program:`pythonw.exe`,
setting this through the usual facilities, for example (might require
@@ -225,6 +245,250 @@ administrative rights):
ftype Python.File=C:\Path\to\pythonw.exe "%1" %*
+.. _launcher:
+
+Python Launcher for Windows
+===========================
+
+.. versionadded:: 3.3
+
+The Python launcher for Windows is a utility which aids in the location and
+execution of different Python versions. It allows scripts (or the
+command-line) to indicate a preference for a specific Python version, and
+will locate and execute that version.
+
+Getting started
+---------------
+
+From the command-line
+^^^^^^^^^^^^^^^^^^^^^
+
+You should ensure the launcher is on your PATH - depending on how it was
+installed it may already be there, but check just in case it is not.
+
+From a command-prompt, execute the following command:
+
+::
+
+ py
+
+You should find that the latest version of Python 2.x you have installed is
+started - it can be exited as normal, and any additional command-line
+arguments specified will be sent directly to Python.
+
+If you have multiple versions of Python 2.x installed (e.g., 2.6 and 2.7) you
+will have noticed that Python 2.7 was started - to launch Python 2.6, try the
+command:
+
+::
+
+ py -2.6
+
+If you have a Python 3.x installed, try the command:
+
+::
+
+ py -3
+
+You should find the latest version of Python 3.x starts.
+
+From a script
+^^^^^^^^^^^^^
+
+Let's create a test Python script - create a file called ``hello.py`` with the
+following contents
+
+::
+
+ #! python
+ import sys
+ sys.stdout.write("hello from Python %s\n" % (sys.version,))
+
+From the directory in which hello.py lives, execute the command:
+
+::
+
+ py hello.py
+
+You should notice the version number of your latest Python 2.x installation
+is printed. Now try changing the first line to be:
+
+::
+
+ #! python3
+
+Re-executing the command should now print the latest Python 3.x information.
+As with the above command-line examples, you can specify a more explicit
+version qualifier. Assuming you have Python 2.6 installed, try changing the
+first line to ``#! python2.6`` and you should find the 2.6 version
+information printed.
+
+From file associations
+^^^^^^^^^^^^^^^^^^^^^^
+
+The launcher should have been associated with Python files (i.e. ``.py``,
+``.pyw``, ``.pyc``, ``.pyo`` files) when it was installed. This means that
+when you double-click on one of these files from Windows explorer the launcher
+will be used, and therefore you can use the same facilities described above to
+have the script specify the version which should be used.
+
+The key benefit of this is that a single launcher can support multiple Python
+versions at the same time depending on the contents of the first line.
+
+Shebang Lines
+-------------
+
+If the first line of a script file starts with ``#!``, it is known as a
+"shebang" line. Linux and other Unix like operating systems have native
+support for such lines and are commonly used on such systems to indicate how
+a script should be executed. This launcher allows the same facilities to be
+using with Python scripts on Windows and the examples above demonstrate their
+use.
+
+To allow shebang lines in Python scripts to be portable between Unix and
+Windows, this launcher supports a number of 'virtual' commands to specify
+which interpreter to use. The supported virtual commands are:
+
+* ``/usr/bin/env python``
+* ``/usr/bin/python``
+* ``/usr/local/bin/python``
+* ``python``
+
+For example, if the first line of your script starts with
+
+::
+
+ #! /usr/bin/python
+
+The default Python will be located and used. As many Python scripts written
+to work on Unix will already have this line, you should find these scripts can
+be used by the launcher without modification. If you are writing a new script
+on Windows which you hope will be useful on Unix, you should use one of the
+shebang lines starting with ``/usr``.
+
+Arguments in shebang lines
+--------------------------
+
+The shebang lines can also specify additional options to be passed to the
+Python interpreter. For example, if you have a shebang line:
+
+::
+
+ #! /usr/bin/python -v
+
+Then Python will be started with the ``-v`` option
+
+Customization
+-------------
+
+Customization via INI files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Two .ini files will be searched by the launcher - ``py.ini`` in the
+ current user's "application data" directory (i.e. the directory returned
+ by calling the Windows function SHGetFolderPath with CSIDL_LOCAL_APPDATA)
+ and ``py.ini`` in the same directory as the launcher. The same .ini
+ files are used for both the 'console' version of the launcher (i.e.
+ py.exe) and for the 'windows' version (i.e. pyw.exe)
+
+ Customization specified in the "application directory" will have
+ precedence over the one next to the executable, so a user, who may not
+ have write access to the .ini file next to the launcher, can override
+ commands in that global .ini file)
+
+Customizing default Python versions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In some cases, a version qualifier can be included in a command to dictate
+which version of Python will be used by the command. A version qualifier
+starts with a major version number and can optionally be followed by a period
+('.') and a minor version specifier. If the minor qualifier is specified, it
+may optionally be followed by "-32" to indicate the 32-bit implementation of
+that version be used.
+
+For example, a shebang line of ``#!python`` has no version qualifier, while
+``#!python3`` has a version qualifier which specifies only a major version.
+
+If no version qualifiers are found in a command, the environment variable
+``PY_PYTHON`` can be set to specify the default version qualifier - the default
+value is "2". Note this value could specify just a major version (e.g. "2") or
+a major.minor qualifier (e.g. "2.6"), or even major.minor-32.
+
+If no minor version qualifiers are found, the environment variable
+``PY_PYTHON{major}`` (where ``{major}`` is the current major version qualifier
+as determined above) can be set to specify the full version. If no such option
+is found, the launcher will enumerate the installed Python versions and use
+the latest minor release found for the major version, which is likely,
+although not guaranteed, to be the most recently installed version in that
+family.
+
+On 64-bit Windows with both 32-bit and 64-bit implementations of the same
+(major.minor) Python version installed, the 64-bit version will always be
+preferred. This will be true for both 32-bit and 64-bit implementations of the
+launcher - a 32-bit launcher will prefer to execute a 64-bit Python installation
+of the specified version if available. This is so the behavior of the launcher
+can be predicted knowing only what versions are installed on the PC and
+without regard to the order in which they were installed (i.e., without knowing
+whether a 32 or 64-bit version of Python and corresponding launcher was
+installed last). As noted above, an optional "-32" suffix can be used on a
+version specifier to change this behaviour.
+
+Examples:
+
+* If no relevant options are set, the commands ``python`` and
+ ``python2`` will use the latest Python 2.x version installed and
+ the command ``python3`` will use the latest Python 3.x installed.
+
+* The commands ``python3.1`` and ``python2.7`` will not consult any
+ options at all as the versions are fully specified.
+
+* If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use
+ the latest installed Python 3 version.
+
+* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit
+ implementation of 3.1 whereas the command ``python3`` will use the latest
+ installed Python (PY_PYTHON was not considered at all as a major
+ version was specified.)
+
+* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands
+ ``python`` and ``python3`` will both use specifically 3.1
+
+In addition to environment variables, the same settings can be configured
+in the .INI file used by the launcher. The section in the INI file is
+called ``[defaults]`` and the key name will be the same as the
+environment variables without the leading ``PY_`` prefix (and note that
+the key names in the INI file are case insensitive.) The contents of
+an environment variable will override things specified in the INI file.
+
+For example:
+
+* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing:
+
+::
+
+ [defaults]
+ python=3.1
+
+* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file
+ containing:
+
+::
+
+ [defaults]
+ python=3
+ python3=3.1
+
+Diagnostics
+-----------
+
+If an environment variable ``PYLAUNCH_DEBUG`` is set (to any value), the
+launcher will print diagnostic information to stderr (i.e. to the console).
+While this information manages to be simultaneously verbose *and* terse, it
+should allow you to see what versions of Python were located, why a
+particular version was chosen and the exact command-line used to execute the
+target Python.
+
+
Additional modules
==================
@@ -341,3 +605,7 @@ Other resources
`A Python for Windows Tutorial <http://www.imladris.com/Scripts/PythonForWindows.html>`_
by Amanda Birmingham, 2004
+ :pep:`397` - Python launcher for Windows
+ The proposal for the launcher to be included in the Python distribution.
+
+
diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst
index 850e57d..64b908b 100644
--- a/Doc/whatsnew/2.0.rst
+++ b/Doc/whatsnew/2.0.rst
@@ -166,7 +166,7 @@ encoding. Encodings are named by strings, such as ``'ascii'``, ``'utf-8'``,
registering new encodings that are then available throughout a Python program.
If an encoding isn't specified, the default encoding is usually 7-bit ASCII,
though it can be changed for your Python installation by calling the
-:func:`sys.setdefaultencoding(encoding)` function in a customised version of
+``sys.setdefaultencoding(encoding)`` function in a customised version of
:file:`site.py`.
Combining 8-bit and Unicode strings always coerces to Unicode, using the default
@@ -203,7 +203,7 @@ U+0660 is an Arabic number.
The :mod:`codecs` module contains functions to look up existing encodings and
register new ones. Unless you want to implement a new encoding, you'll most
-often use the :func:`codecs.lookup(encoding)` function, which returns a
+often use the ``codecs.lookup(encoding)`` function, which returns a
4-element tuple: ``(encode_func, decode_func, stream_reader, stream_writer)``.
* *encode_func* is a function that takes a Unicode string, and returns a 2-tuple
@@ -600,7 +600,7 @@ Python code is found to be improperly indented.
Changes to Built-in Functions
-----------------------------
-A new built-in, :func:`zip(seq1, seq2, ...)`, has been added. :func:`zip`
+A new built-in, ``zip(seq1, seq2, ...)``, has been added. :func:`zip`
returns a list of tuples where each tuple contains the i-th element from each of
the argument sequences. The difference between :func:`zip` and ``map(None,
seq1, seq2)`` is that :func:`map` pads the sequences with ``None`` if the
@@ -619,7 +619,7 @@ level, serial)`` For example, in a hypothetical 2.0.1beta1, ``sys.version_info``
would be ``(2, 0, 1, 'beta', 1)``. *level* is a string such as ``"alpha"``,
``"beta"``, or ``"final"`` for a final release.
-Dictionaries have an odd new method, :meth:`setdefault(key, default)`, which
+Dictionaries have an odd new method, ``setdefault(key, default)``, which
behaves similarly to the existing :meth:`get` method. However, if the key is
missing, :meth:`setdefault` both returns the value of *default* as :meth:`get`
would do, and also inserts it into the dictionary as the value for *key*. Thus,
@@ -1038,7 +1038,7 @@ Brian Gallew contributed OpenSSL support for the :mod:`socket` module. OpenSSL
is an implementation of the Secure Socket Layer, which encrypts the data being
sent over a socket. When compiling Python, you can edit :file:`Modules/Setup`
to include SSL support, which adds an additional function to the :mod:`socket`
-module: :func:`socket.ssl(socket, keyfile, certfile)`, which takes a socket
+module: ``socket.ssl(socket, keyfile, certfile)``, which takes a socket
object and returns an SSL socket. The :mod:`httplib` and :mod:`urllib` modules
were also changed to support ``https://`` URLs, though no one has implemented
FTP or SMTP over SSL.
diff --git a/Doc/whatsnew/2.1.rst b/Doc/whatsnew/2.1.rst
index 117af10..b1ab48e 100644
--- a/Doc/whatsnew/2.1.rst
+++ b/Doc/whatsnew/2.1.rst
@@ -204,7 +204,7 @@ Each of these magic methods can return anything at all: a Boolean, a matrix, a
list, or any other Python object. Alternatively they can raise an exception if
the comparison is impossible, inconsistent, or otherwise meaningless.
-The built-in :func:`cmp(A,B)` function can use the rich comparison machinery,
+The built-in ``cmp(A,B)`` function can use the rich comparison machinery,
and now accepts an optional argument specifying which comparison operation to
use; this is given as one of the strings ``"<"``, ``"<="``, ``">"``, ``">="``,
``"=="``, or ``"!="``. If called without the optional third argument,
@@ -350,7 +350,7 @@ where this behaviour is undesirable, object caches being the most common one,
and another being circular references in data structures such as trees.
For example, consider a memoizing function that caches the results of another
-function :func:`f(x)` by storing the function's argument and its result in a
+function ``f(x)`` by storing the function's argument and its result in a
dictionary::
_cache = {}
@@ -656,7 +656,7 @@ New and Improved Modules
use :mod:`ftplib` to retrieve files and then don't work from behind a firewall.
It's deemed unlikely that this will cause problems for anyone, because Netscape
defaults to passive mode and few people complain, but if passive mode is
- unsuitable for your application or network setup, call :meth:`set_pasv(0)` on
+ unsuitable for your application or network setup, call ``set_pasv(0)`` on
FTP objects to disable passive mode.
* Support for raw socket access has been added to the :mod:`socket` module,
@@ -666,7 +666,7 @@ New and Improved Modules
for displaying timing profiles for Python programs, invoked when the module is
run as a script. Contributed by Eric S. Raymond.
-* A new implementation-dependent function, :func:`sys._getframe([depth])`, has
+* A new implementation-dependent function, ``sys._getframe([depth])``, has
been added to return a given frame object from the current call stack.
:func:`sys._getframe` returns the frame at the top of the call stack; if the
optional integer argument *depth* is supplied, the function returns the frame
diff --git a/Doc/whatsnew/2.2.rst b/Doc/whatsnew/2.2.rst
index 1db1ee7..2e7069d 100644
--- a/Doc/whatsnew/2.2.rst
+++ b/Doc/whatsnew/2.2.rst
@@ -173,12 +173,12 @@ attributes of their own:
* :attr:`__doc__` is the attribute's docstring.
-* :meth:`__get__(object)` is a method that retrieves the attribute value from
+* ``__get__(object)`` is a method that retrieves the attribute value from
*object*.
-* :meth:`__set__(object, value)` sets the attribute on *object* to *value*.
+* ``__set__(object, value)`` sets the attribute on *object* to *value*.
-* :meth:`__delete__(object, value)` deletes the *value* attribute of *object*.
+* ``__delete__(object, value)`` deletes the *value* attribute of *object*.
For example, when you write ``obj.x``, the steps that Python actually performs
are::
@@ -288,7 +288,7 @@ Following this rule, referring to :meth:`D.save` will return :meth:`C.save`,
which is the behaviour we're after. This lookup rule is the same as the one
followed by Common Lisp. A new built-in function, :func:`super`, provides a way
to get at a class's superclasses without having to reimplement Python's
-algorithm. The most commonly used form will be :func:`super(class, obj)`, which
+algorithm. The most commonly used form will be ``super(class, obj)``, which
returns a bound superclass object (not the actual class object). This form
will be used in methods to call a method in the superclass; for example,
:class:`D`'s :meth:`save` method would look like this::
@@ -301,7 +301,7 @@ will be used in methods to call a method in the superclass; for example,
...
:func:`super` can also return unbound superclass objects when called as
-:func:`super(class)` or :func:`super(class1, class2)`, but this probably won't
+``super(class)`` or ``super(class1, class2)``, but this probably won't
often be useful.
@@ -314,13 +314,13 @@ code more readable by automatically mapping an attribute access such as
``obj.parent`` into a method call such as ``obj.get_parent``. Python 2.2 adds
some new ways of controlling attribute access.
-First, :meth:`__getattr__(attr_name)` is still supported by new-style classes,
+First, ``__getattr__(attr_name)`` is still supported by new-style classes,
and nothing about it has changed. As before, it will be called when an attempt
is made to access ``obj.foo`` and no attribute named ``foo`` is found in the
instance's dictionary.
New-style classes also support a new method,
-:meth:`__getattribute__(attr_name)`. The difference between the two methods is
+``__getattribute__(attr_name)``. The difference between the two methods is
that :meth:`__getattribute__` is *always* called whenever any attribute is
accessed, while the old :meth:`__getattr__` is only called if ``foo`` isn't
found in the instance's dictionary.
@@ -441,8 +441,8 @@ work, though it really should.
In Python 2.2, iteration can be implemented separately, and :meth:`__getitem__`
methods can be limited to classes that really do support random access. The
-basic idea of iterators is simple. A new built-in function, :func:`iter(obj)`
-or ``iter(C, sentinel)``, is used to get an iterator. :func:`iter(obj)` returns
+basic idea of iterators is simple. A new built-in function, ``iter(obj)``
+or ``iter(C, sentinel)``, is used to get an iterator. ``iter(obj)`` returns
an iterator for the object *obj*, while ``iter(C, sentinel)`` returns an
iterator that will invoke the callable object *C* until it returns *sentinel* to
signal that the iterator is done.
@@ -793,7 +793,7 @@ further details.
Another change is simpler to explain. Since their introduction, Unicode strings
have supported an :meth:`encode` method to convert the string to a selected
-encoding such as UTF-8 or Latin-1. A symmetric :meth:`decode([*encoding*])`
+encoding such as UTF-8 or Latin-1. A symmetric ``decode([*encoding*])``
method has been added to 8-bit strings (though not to Unicode strings) in 2.2.
:meth:`decode` assumes that the string is in the specified encoding and decodes
it, returning whatever is returned by the codec.
@@ -1203,7 +1203,7 @@ Some of the more notable changes are:
to an MBCS encoded string, as used by the Microsoft file APIs. As MBCS is
explicitly used by the file APIs, Python's choice of ASCII as the default
encoding turns out to be an annoyance. On Unix, the locale's character set is
- used if :func:`locale.nl_langinfo(CODESET)` is available. (Windows support was
+ used if ``locale.nl_langinfo(CODESET)`` is available. (Windows support was
contributed by Mark Hammond with assistance from Marc-André Lemburg. Unix
support was added by Martin von Löwis.)
diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst
index f4c79e4..f0e48d9 100644
--- a/Doc/whatsnew/2.3.rst
+++ b/Doc/whatsnew/2.3.rst
@@ -504,8 +504,8 @@ This produces the following output::
ZeroDivisionError: integer division or modulo by zero
Slightly more advanced programs will use a logger other than the root logger.
-The :func:`getLogger(name)` function is used to get a particular log, creating
-it if it doesn't exist yet. :func:`getLogger(None)` returns the root logger. ::
+The ``getLogger(name)`` function is used to get a particular log, creating
+it if it doesn't exist yet. ``getLogger(None)`` returns the root logger. ::
log = logging.getLogger('server')
...
@@ -724,10 +724,10 @@ module:
objects to it. Additional built-in and frozen modules can be imported by an
object added to this list.
-Importer objects must have a single method, :meth:`find_module(fullname,
-path=None)`. *fullname* will be a module or package name, e.g. ``string`` or
+Importer objects must have a single method, ``find_module(fullname,
+path=None)``. *fullname* will be a module or package name, e.g. ``string`` or
``distutils.core``. :meth:`find_module` must return a loader object that has a
-single method, :meth:`load_module(fullname)`, that creates and returns the
+single method, ``load_module(fullname)``, that creates and returns the
corresponding module object.
Pseudo-code for Python's new import logic, therefore, looks something like this
@@ -935,7 +935,7 @@ Or use slice objects directly in subscripts::
[0, 2, 4]
To simplify implementing sequences that support extended slicing, slice objects
-now have a method :meth:`indices(length)` which, given the length of a sequence,
+now have a method ``indices(length)`` which, given the length of a sequence,
returns a ``(start, stop, step)`` tuple that can be passed directly to
:func:`range`. :meth:`indices` handles omitted and out-of-bounds indices in a
manner consistent with regular slices (and this innocuous phrase hides a welter
@@ -984,7 +984,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language.
* Built-in types now support the extended slicing syntax, as described in
section :ref:`section-slices` of this document.
-* A new built-in function, :func:`sum(iterable, start=0)`, adds up the numeric
+* A new built-in function, ``sum(iterable, start=0)``, adds up the numeric
items in the iterable object and returns their sum. :func:`sum` only accepts
numbers, meaning that you can't use it to concatenate a bunch of strings.
(Contributed by Alex Martelli.)
@@ -998,7 +998,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language.
its index, now takes optional *start* and *stop* arguments to limit the search
to only part of the list.
-* Dictionaries have a new method, :meth:`pop(key[, *default*])`, that returns
+* Dictionaries have a new method, ``pop(key[, *default*])``, that returns
the value corresponding to *key* and removes that key/value pair from the
dictionary. If the requested key isn't present in the dictionary, *default* is
returned if it's specified and :exc:`KeyError` raised if it isn't. ::
@@ -1020,7 +1020,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language.
{}
>>>
- There's also a new class method, :meth:`dict.fromkeys(iterable, value)`, that
+ There's also a new class method, ``dict.fromkeys(iterable, value)``, that
creates a dictionary with keys taken from the supplied iterator *iterable* and
all values set to *value*, defaulting to ``None``.
@@ -1093,7 +1093,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language.
100 bytecodes, speeding up single-threaded applications by reducing the
switching overhead. Some multithreaded applications may suffer slower response
time, but that's easily fixed by setting the limit back to a lower number using
- :func:`sys.setcheckinterval(N)`. The limit can be retrieved with the new
+ ``sys.setcheckinterval(N)``. The limit can be retrieved with the new
:func:`sys.getcheckinterval` function.
* One minor but far-reaching change is that the names of extension types defined
@@ -1272,10 +1272,10 @@ complete list of changes, or look through the CVS logs for all the details.
* Previously the :mod:`doctest` module would only search the docstrings of
public methods and functions for test cases, but it now also examines private
- ones as well. The :func:`DocTestSuite(` function creates a
+ ones as well. The :func:`DocTestSuite` function creates a
:class:`unittest.TestSuite` object from a set of :mod:`doctest` tests.
-* The new :func:`gc.get_referents(object)` function returns a list of all the
+* The new ``gc.get_referents(object)`` function returns a list of all the
objects referenced by *object*.
* The :mod:`getopt` module gained a new function, :func:`gnu_getopt`, that
@@ -1347,8 +1347,8 @@ complete list of changes, or look through the CVS logs for all the details.
documentation for details.
(Contributed by Raymond Hettinger.)
-* Two new functions in the :mod:`math` module, :func:`degrees(rads)` and
- :func:`radians(degs)`, convert between radians and degrees. Other functions in
+* Two new functions in the :mod:`math` module, ``degrees(rads)`` and
+ ``radians(degs)``, convert between radians and degrees. Other functions in
the :mod:`math` module such as :func:`math.sin` and :func:`math.cos` have always
required input values measured in radians. Also, an optional *base* argument
was added to :func:`math.log` to make it easier to compute logarithms for bases
@@ -1405,7 +1405,7 @@ complete list of changes, or look through the CVS logs for all the details.
and therefore faster performance. Setting the parser object's
:attr:`buffer_text` attribute to :const:`True` will enable buffering.
-* The :func:`sample(population, k)` function was added to the :mod:`random`
+* The ``sample(population, k)`` function was added to the :mod:`random`
module. *population* is a sequence or :class:`xrange` object containing the
elements of a population, and :func:`sample` chooses *k* elements from the
population without replacing chosen elements. *k* can be any value up to
@@ -1451,7 +1451,7 @@ complete list of changes, or look through the CVS logs for all the details.
encryption is not believed to be secure. If you need encryption, use one of the
several AES Python modules that are available separately.
-* The :mod:`shutil` module gained a :func:`move(src, dest)` function that
+* The :mod:`shutil` module gained a ``move(src, dest)`` function that
recursively moves a file or directory to a new location.
* Support for more advanced POSIX signal handling was added to the :mod:`signal`
@@ -1459,7 +1459,7 @@ complete list of changes, or look through the CVS logs for all the details.
platforms.
* The :mod:`socket` module now supports timeouts. You can call the
- :meth:`settimeout(t)` method on a socket object to set a timeout of *t* seconds.
+ ``settimeout(t)`` method on a socket object to set a timeout of *t* seconds.
Subsequent socket operations that take longer than *t* seconds to complete will
abort and raise a :exc:`socket.timeout` exception.
@@ -1480,9 +1480,9 @@ complete list of changes, or look through the CVS logs for all the details.
:program:`tar`\ -format archive files. (Contributed by Lars Gustäbel.)
* The new :mod:`textwrap` module contains functions for wrapping strings
- containing paragraphs of text. The :func:`wrap(text, width)` function takes a
+ containing paragraphs of text. The ``wrap(text, width)`` function takes a
string and returns a list containing the text split into lines of no more than
- the chosen width. The :func:`fill(text, width)` function returns a single
+ the chosen width. The ``fill(text, width)`` function returns a single
string, reformatted to fit into lines no longer than the chosen width. (As you
can guess, :func:`fill` is built on top of :func:`wrap`. For example::
@@ -1903,7 +1903,7 @@ Changes to Python's build process and to the C API include:
short int`, ``I`` for :c:type:`unsigned int`, and ``K`` for :c:type:`unsigned
long long`.
-* A new function, :c:func:`PyObject_DelItemString(mapping, char \*key)` was added
+* A new function, ``PyObject_DelItemString(mapping, char *key)`` was added
as shorthand for ``PyObject_DelItem(mapping, PyString_New(key))``.
* File objects now manage their internal string buffer differently, increasing
diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst
index 9d339a5..5a28f89 100644
--- a/Doc/whatsnew/2.4.rst
+++ b/Doc/whatsnew/2.4.rst
@@ -37,7 +37,7 @@ PEP 218: Built-In Set Objects
Python 2.3 introduced the :mod:`sets` module. C implementations of set data
types have now been added to the Python core as two new built-in types,
-:func:`set(iterable)` and :func:`frozenset(iterable)`. They provide high speed
+``set(iterable)`` and ``frozenset(iterable)``. They provide high speed
operations for membership testing, for eliminating duplicates from sequences,
and for mathematical operations like unions, intersections, differences, and
symmetric differences. ::
@@ -346,7 +346,7 @@ returned.
PEP 322: Reverse Iteration
==========================
-A new built-in function, :func:`reversed(seq)`, takes a sequence and returns an
+A new built-in function, ``reversed(seq)``, takes a sequence and returns an
iterator that loops over the elements of the sequence in reverse order. ::
>>> for i in reversed(xrange(1,4)):
@@ -384,7 +384,7 @@ PEP 324: New subprocess Module
The standard library provides a number of ways to execute a subprocess, offering
different features and different levels of complexity.
-:func:`os.system(command)` is easy to use, but slow (it runs a shell process
+``os.system(command)`` is easy to use, but slow (it runs a shell process
which executes the command) and dangerous (you have to be careful about escaping
the shell's metacharacters). The :mod:`popen2` module offers classes that can
capture standard output and standard error from the subprocess, but the naming
@@ -431,8 +431,8 @@ The constructor has a number of handy options:
Once you've created the :class:`Popen` instance, you can call its :meth:`wait`
method to pause until the subprocess has exited, :meth:`poll` to check if it's
-exited without pausing, or :meth:`communicate(data)` to send the string *data*
-to the subprocess's standard input. :meth:`communicate(data)` then reads any
+exited without pausing, or ``communicate(data)`` to send the string *data*
+to the subprocess's standard input. ``communicate(data)`` then reads any
data that the subprocess has sent to its standard output or standard error,
returning a tuple ``(stdout_data, stderr_data)``.
@@ -749,10 +749,10 @@ numbers in the current locale.
The solution described in the PEP is to add three new functions to the Python
API that perform ASCII-only conversions, ignoring the locale setting:
-* :c:func:`PyOS_ascii_strtod(str, ptr)` and :c:func:`PyOS_ascii_atof(str, ptr)`
+* ``PyOS_ascii_strtod(str, ptr)`` and ``PyOS_ascii_atof(str, ptr)``
both convert a string to a C :c:type:`double`.
-* :c:func:`PyOS_ascii_formatd(buffer, buf_len, format, d)` converts a
+* ``PyOS_ascii_formatd(buffer, buf_len, format, d)`` converts a
:c:type:`double` to an ASCII string.
The code for these functions came from the GLib library
@@ -778,7 +778,7 @@ Here are all of the changes that Python 2.4 makes to the core Python language.
* Decorators for functions and methods were added (:pep:`318`).
* Built-in :func:`set` and :func:`frozenset` types were added (:pep:`218`).
- Other new built-ins include the :func:`reversed(seq)` function (:pep:`322`).
+ Other new built-ins include the ``reversed(seq)`` function (:pep:`322`).
* Generator expressions were added (:pep:`289`).
@@ -857,7 +857,7 @@ Here are all of the changes that Python 2.4 makes to the core Python language.
(All changes to :meth:`sort` contributed by Raymond Hettinger.)
-* There is a new built-in function :func:`sorted(iterable)` that works like the
+* There is a new built-in function ``sorted(iterable)`` that works like the
in-place :meth:`list.sort` method but can be used in expressions. The
differences are:
@@ -898,8 +898,8 @@ Here are all of the changes that Python 2.4 makes to the core Python language.
For example, you can now run the Python profiler with ``python -m profile``.
(Contributed by Nick Coghlan.)
-* The :func:`eval(expr, globals, locals)` and :func:`execfile(filename, globals,
- locals)` functions and the ``exec`` statement now accept any mapping type
+* The ``eval(expr, globals, locals)`` and ``execfile(filename, globals,
+ locals)`` functions and the ``exec`` statement now accept any mapping type
for the *locals* parameter. Previously this had to be a regular Python
dictionary. (Contributed by Raymond Hettinger.)
@@ -1090,7 +1090,7 @@ complete list of changes, or look through the CVS logs for all the details.
Yves Dionne) and new :meth:`deleteacl` and :meth:`myrights` methods (contributed
by Arnaud Mazin).
-* The :mod:`itertools` module gained a :func:`groupby(iterable[, *func*])`
+* The :mod:`itertools` module gained a ``groupby(iterable[, *func*])``
function. *iterable* is something that can be iterated over to return a stream
of elements, and the optional *func* parameter is a function that takes an
element and returns a key value; if omitted, the key is simply the element
@@ -1139,7 +1139,7 @@ complete list of changes, or look through the CVS logs for all the details.
(Contributed by Hye-Shik Chang.)
-* :mod:`itertools` also gained a function named :func:`tee(iterator, N)` that
+* :mod:`itertools` also gained a function named ``tee(iterator, N)`` that
returns *N* independent iterators that replicate *iterator*. If *N* is omitted,
the default is 2. ::
@@ -1177,7 +1177,7 @@ complete list of changes, or look through the CVS logs for all the details.
level=0, # Log all messages
format='%(levelname):%(process):%(thread):%(message)')
- Other additions to the :mod:`logging` package include a :meth:`log(level, msg)`
+ Other additions to the :mod:`logging` package include a ``log(level, msg)``
convenience method, as well as a :class:`TimedRotatingFileHandler` class that
rotates its log files at a timed interval. The module already had
:class:`RotatingFileHandler`, which rotated logs once the file exceeded a
@@ -1196,7 +1196,7 @@ complete list of changes, or look through the CVS logs for all the details.
group or for a range of groups. (Contributed by Jürgen A. Erhard.)
* Two new functions were added to the :mod:`operator` module,
- :func:`attrgetter(attr)` and :func:`itemgetter(index)`. Both functions return
+ ``attrgetter(attr)`` and ``itemgetter(index)``. Both functions return
callables that take a single argument and return the corresponding attribute or
item; these callables make excellent data extractors when used with :func:`map`
or :func:`sorted`. For example::
@@ -1223,14 +1223,14 @@ complete list of changes, or look through the CVS logs for all the details.
replacement for :func:`rfc822.formatdate`. You may want to write new e-mail
processing code with this in mind. (Change implemented by Anthony Baxter.)
-* A new :func:`urandom(n)` function was added to the :mod:`os` module, returning
+* A new ``urandom(n)`` function was added to the :mod:`os` module, returning
a string containing *n* bytes of random data. This function provides access to
platform-specific sources of randomness such as :file:`/dev/urandom` on Linux or
the Windows CryptoAPI. (Contributed by Trevor Perrin.)
-* Another new function: :func:`os.path.lexists(path)` returns true if the file
+* Another new function: ``os.path.lexists(path)`` returns true if the file
specified by *path* exists, whether or not it's a symbolic link. This differs
- from the existing :func:`os.path.exists(path)` function, which returns false if
+ from the existing ``os.path.exists(path)`` function, which returns false if
*path* is a symlink that points to a destination that doesn't exist.
(Contributed by Beni Cherniavsky.)
@@ -1243,7 +1243,7 @@ complete list of changes, or look through the CVS logs for all the details.
* The :mod:`profile` module can now profile C extension functions. (Contributed
by Nick Bastin.)
-* The :mod:`random` module has a new method called :meth:`getrandbits(N)` that
+* The :mod:`random` module has a new method called ``getrandbits(N)`` that
returns a long integer *N* bits in length. The existing :meth:`randrange`
method now uses :meth:`getrandbits` where appropriate, making generation of
arbitrarily large random numbers more efficient. (Contributed by Raymond
@@ -1272,7 +1272,7 @@ complete list of changes, or look through the CVS logs for all the details.
this, but 2.4 will raise a :exc:`RuntimeError` exception.
* Two new functions were added to the :mod:`socket` module. :func:`socketpair`
- returns a pair of connected sockets and :func:`getservbyport(port)` looks up the
+ returns a pair of connected sockets and ``getservbyport(port)`` looks up the
service name for a given port number. (Contributed by Dave Cole and Barry
Warsaw.)
@@ -1454,11 +1454,11 @@ Some of the changes to Python's build process and to the C API are:
* Another new macro, :c:macro:`Py_CLEAR(obj)`, decreases the reference count of
*obj* and sets *obj* to the null pointer. (Contributed by Jim Fulton.)
-* A new function, :c:func:`PyTuple_Pack(N, obj1, obj2, ..., objN)`, constructs
+* A new function, ``PyTuple_Pack(N, obj1, obj2, ..., objN)``, constructs
tuples from a variable length argument list of Python objects. (Contributed by
Raymond Hettinger.)
-* A new function, :c:func:`PyDict_Contains(d, k)`, implements fast dictionary
+* A new function, ``PyDict_Contains(d, k)``, implements fast dictionary
lookups without masking exceptions raised during the look-up process.
(Contributed by Raymond Hettinger.)
diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst
index e059cd5..b91e647 100644
--- a/Doc/whatsnew/2.5.rst
+++ b/Doc/whatsnew/2.5.rst
@@ -171,7 +171,7 @@ method, where the first argument has been provided. ::
popup_menu.append( ("Open", open_func, 1) )
Another function in the :mod:`functools` module is the
-:func:`update_wrapper(wrapper, wrapped)` function that helps you write well-
+``update_wrapper(wrapper, wrapped)`` function that helps you write well-
behaved decorators. :func:`update_wrapper` copies the name, module, and
docstring attribute to a wrapper function so that tracebacks inside the wrapped
function are easier to understand. For example, you might write::
@@ -454,7 +454,7 @@ expression on the right-hand side of an assignment. This means you can write
``val = yield i`` but have to use parentheses when there's an operation, as in
``val = (yield i) + 12``.)
-Values are sent into a generator by calling its :meth:`send(value)` method. The
+Values are sent into a generator by calling its ``send(value)`` method. The
generator's code is then resumed and the :keyword:`yield` expression returns the
specified *value*. If the regular :meth:`next` method is called, the
:keyword:`yield` returns :const:`None`.
@@ -496,7 +496,7 @@ function.
In addition to :meth:`send`, there are two other new methods on generators:
-* :meth:`throw(type, value=None, traceback=None)` is used to raise an exception
+* ``throw(type, value=None, traceback=None)`` is used to raise an exception
inside the generator; the exception is raised by the :keyword:`yield` expression
where the generator's execution is paused.
@@ -660,7 +660,7 @@ A high-level explanation of the context management protocol is:
* The code in *BLOCK* is executed.
-* If *BLOCK* raises an exception, the :meth:`__exit__(type, value, traceback)`
+* If *BLOCK* raises an exception, the ``__exit__(type, value, traceback)``
is called with the exception details, the same values returned by
:func:`sys.exc_info`. The method's return value controls whether the exception
is re-raised: any false value re-raises the exception, and ``True`` will result
@@ -773,7 +773,7 @@ decorator as::
with db_transaction(db) as cursor:
...
-The :mod:`contextlib` module also has a :func:`nested(mgr1, mgr2, ...)` function
+The :mod:`contextlib` module also has a ``nested(mgr1, mgr2, ...)`` function
that combines a number of context managers so you don't need to write nested
':keyword:`with`' statements. In this example, the single ':keyword:`with`'
statement both starts a database transaction and acquires a thread lock::
@@ -782,7 +782,7 @@ statement both starts a database transaction and acquires a thread lock::
with nested (db_transaction(db), lock) as (cursor, locked):
...
-Finally, the :func:`closing(object)` function returns *object* so that it can be
+Finally, the ``closing(object)`` function returns *object* so that it can be
bound to a variable, and calls ``object.close`` at the end of the block. ::
import urllib, sys
@@ -955,7 +955,7 @@ interpreter will check that the type returned is correct, and raises a
A corresponding :attr:`nb_index` slot was added to the C-level
:c:type:`PyNumberMethods` structure to let C extensions implement this protocol.
-:c:func:`PyNumber_Index(obj)` can be used in extension code to call the
+``PyNumber_Index(obj)`` can be used in extension code to call the
:meth:`__index__` function and retrieve its result.
@@ -976,7 +976,7 @@ Here are all of the changes that Python 2.5 makes to the core Python language.
* The :class:`dict` type has a new hook for letting subclasses provide a default
value when a key isn't contained in the dictionary. When a key isn't found, the
- dictionary's :meth:`__missing__(key)` method will be called. This hook is used
+ dictionary's ``__missing__(key)`` method will be called. This hook is used
to implement the new :class:`defaultdict` class in the :mod:`collections`
module. The following example defines a dictionary that returns zero for any
missing key::
@@ -989,16 +989,16 @@ Here are all of the changes that Python 2.5 makes to the core Python language.
print d[1], d[2] # Prints 1, 2
print d[3], d[4] # Prints 0, 0
-* Both 8-bit and Unicode strings have new :meth:`partition(sep)` and
- :meth:`rpartition(sep)` methods that simplify a common use case.
+* Both 8-bit and Unicode strings have new ``partition(sep)`` and
+ ``rpartition(sep)`` methods that simplify a common use case.
- The :meth:`find(S)` method is often used to get an index which is then used to
+ The ``find(S)`` method is often used to get an index which is then used to
slice the string and obtain the pieces that are before and after the separator.
- :meth:`partition(sep)` condenses this pattern into a single method call that
+ ``partition(sep)`` condenses this pattern into a single method call that
returns a 3-tuple containing the substring before the separator, the separator
itself, and the substring after the separator. If the separator isn't found,
the first element of the tuple is the entire string and the other two elements
- are empty. :meth:`rpartition(sep)` also returns a 3-tuple but starts searching
+ are empty. ``rpartition(sep)`` also returns a 3-tuple but starts searching
from the end of the string; the ``r`` stands for 'reverse'.
Some examples::
@@ -1157,7 +1157,7 @@ marked in the following list.
.. Patch 1313939, 1359618
-* The :func:`long(str, base)` function is now faster on long digit strings
+* The ``long(str, base)`` function is now faster on long digit strings
because fewer intermediate results are calculated. The peak is for strings of
around 800--1000 digits where the function is 6 times faster. (Contributed by
Alan McIntyre and committed at the NeedForSpeed sprint.)
@@ -1268,7 +1268,7 @@ complete list of changes, or look through the SVN logs for all the details.
(Contributed by Guido van Rossum.)
* The :class:`deque` double-ended queue type supplied by the :mod:`collections`
- module now has a :meth:`remove(value)` method that removes the first occurrence
+ module now has a ``remove(value)`` method that removes the first occurrence
of *value* in the queue, raising :exc:`ValueError` if the value isn't found.
(Contributed by Raymond Hettinger.)
@@ -1291,7 +1291,7 @@ complete list of changes, or look through the SVN logs for all the details.
* The :mod:`csv` module, which parses files in comma-separated value format,
received several enhancements and a number of bugfixes. You can now set the
maximum size in bytes of a field by calling the
- :meth:`csv.field_size_limit(new_limit)` function; omitting the *new_limit*
+ ``csv.field_size_limit(new_limit)`` function; omitting the *new_limit*
argument will return the currently-set limit. The :class:`reader` class now has
a :attr:`line_num` attribute that counts the number of physical lines read from
the source; records can span multiple physical lines, so :attr:`line_num` is not
@@ -1308,7 +1308,7 @@ complete list of changes, or look through the SVN logs for all the details.
(Contributed by Skip Montanaro and Andrew McNamara.)
* The :class:`datetime` class in the :mod:`datetime` module now has a
- :meth:`strptime(string, format)` method for parsing date strings, contributed
+ ``strptime(string, format)`` method for parsing date strings, contributed
by Josh Spoerri. It uses the same format characters as :func:`time.strptime` and
:func:`time.strftime`::
@@ -1403,7 +1403,7 @@ complete list of changes, or look through the SVN logs for all the details.
* The :mod:`mailbox` module underwent a massive rewrite to add the capability to
modify mailboxes in addition to reading them. A new set of classes that include
:class:`mbox`, :class:`MH`, and :class:`Maildir` are used to read mailboxes, and
- have an :meth:`add(message)` method to add messages, :meth:`remove(key)` to
+ have an ``add(message)`` method to add messages, ``remove(key)`` to
remove messages, and :meth:`lock`/:meth:`unlock` to lock/unlock the mailbox.
The following example converts a maildir-format mailbox into an mbox-format
one::
@@ -1458,7 +1458,7 @@ complete list of changes, or look through the SVN logs for all the details.
:func:`wait4` return additional information. :func:`wait3` doesn't take a
process ID as input, so it waits for any child process to exit and returns a
3-tuple of *process-id*, *exit-status*, *resource-usage* as returned from the
- :func:`resource.getrusage` function. :func:`wait4(pid)` does take a process ID.
+ :func:`resource.getrusage` function. ``wait4(pid)`` does take a process ID.
(Contributed by Chad J. Schroeder.)
On FreeBSD, the :func:`os.stat` function now returns times with nanosecond
@@ -1532,8 +1532,8 @@ complete list of changes, or look through the SVN logs for all the details.
In Python code, netlink addresses are represented as a tuple of 2 integers,
``(pid, group_mask)``.
- Two new methods on socket objects, :meth:`recv_into(buffer)` and
- :meth:`recvfrom_into(buffer)`, store the received data in an object that
+ Two new methods on socket objects, ``recv_into(buffer)`` and
+ ``recvfrom_into(buffer)``, store the received data in an object that
supports the buffer protocol instead of returning the data as a string. This
means you can put the data directly into an array or a memory-mapped file.
@@ -1557,8 +1557,8 @@ complete list of changes, or look through the SVN logs for all the details.
year, number, name = s.unpack(data)
You can also pack and unpack data to and from buffer objects directly using the
- :meth:`pack_into(buffer, offset, v1, v2, ...)` and :meth:`unpack_from(buffer,
- offset)` methods. This lets you store data directly into an array or a memory-
+ ``pack_into(buffer, offset, v1, v2, ...)`` and ``unpack_from(buffer,
+ offset)`` methods. This lets you store data directly into an array or a memory-
mapped file.
(:class:`Struct` objects were implemented by Bob Ippolito at the NeedForSpeed
@@ -1592,7 +1592,7 @@ complete list of changes, or look through the SVN logs for all the details.
.. patch 918101
* The :mod:`threading` module now lets you set the stack size used when new
- threads are created. The :func:`stack_size([*size*])` function returns the
+ threads are created. The ``stack_size([*size*])`` function returns the
currently configured stack size, and supplying the optional *size* parameter
sets a new value. Not all platforms support changing the stack size, but
Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.)
@@ -1911,7 +1911,7 @@ differently. ::
h = hashlib.new('md5') # Provide algorithm as a string
Once a hash object has been created, its methods are the same as before:
-:meth:`update(string)` hashes the specified string into the current digest
+``update(string)`` hashes the specified string into the current digest
state, :meth:`digest` and :meth:`hexdigest` return the digest value as a binary
string or a string of hex digits, and :meth:`copy` returns a new hashing object
with the same digest state.
@@ -2168,20 +2168,20 @@ Changes to Python's build process and to the C API include:
* Two new macros can be used to indicate C functions that are local to the
current file so that a faster calling convention can be used.
- :c:func:`Py_LOCAL(type)` declares the function as returning a value of the
+ ``Py_LOCAL(type)`` declares the function as returning a value of the
specified *type* and uses a fast-calling qualifier.
- :c:func:`Py_LOCAL_INLINE(type)` does the same thing and also requests the
+ ``Py_LOCAL_INLINE(type)`` does the same thing and also requests the
function be inlined. If :c:func:`PY_LOCAL_AGGRESSIVE` is defined before
:file:`python.h` is included, a set of more aggressive optimizations are enabled
for the module; you should benchmark the results to find out if these
optimizations actually make the code faster. (Contributed by Fredrik Lundh at
the NeedForSpeed sprint.)
-* :c:func:`PyErr_NewException(name, base, dict)` can now accept a tuple of base
+* ``PyErr_NewException(name, base, dict)`` can now accept a tuple of base
classes as its *base* argument. (Contributed by Georg Brandl.)
* The :c:func:`PyErr_Warn` function for issuing warnings is now deprecated in
- favour of :c:func:`PyErr_WarnEx(category, message, stacklevel)` which lets you
+ favour of ``PyErr_WarnEx(category, message, stacklevel)`` which lets you
specify the number of stack frames separating this function and the caller. A
*stacklevel* of 1 is the function calling :c:func:`PyErr_WarnEx`, 2 is the
function above that, and so forth. (Added by Neal Norwitz.)
diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst
index 133ecab..71b87b8 100644
--- a/Doc/whatsnew/3.0.rst
+++ b/Doc/whatsnew/3.0.rst
@@ -810,7 +810,7 @@ Builtins
* The :func:`round` function rounding strategy and return type have
changed. Exact halfway cases are now rounded to the nearest even
result instead of away from zero. (For example, ``round(2.5)`` now
- returns ``2`` rather than ``3``.) :func:`round(x[, n])` now
+ returns ``2`` rather than ``3``.) ``round(x[, n])`` now
delegates to ``x.__round__([n])`` instead of always returning a
float. It generally returns an integer when called with a single
argument and a value of the same type as ``x`` when called with two
diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst
index 09640f6..a2ee112 100644
--- a/Doc/whatsnew/3.2.rst
+++ b/Doc/whatsnew/3.2.rst
@@ -268,7 +268,7 @@ launch of four parallel threads for copying files::
e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
- e.submit(shutil.copy, 'src4.txt', 'dest4.txt')
+ e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
.. seealso::
@@ -2352,7 +2352,7 @@ A number of small performance enhancements have been added:
(Contributed by Antoine Pitrou; :issue:`3001`.)
* The fast-search algorithm in stringlib is now used by the :meth:`split`,
- :meth:`splitlines` and :meth:`replace` methods on
+ :meth:`rsplit`, :meth:`splitlines` and :meth:`replace` methods on
:class:`bytes`, :class:`bytearray` and :class:`str` objects. Likewise, the
algorithm is also used by :meth:`rfind`, :meth:`rindex`, :meth:`rsplit` and
:meth:`rpartition`.
@@ -2469,14 +2469,14 @@ Code Repository
In addition to the existing Subversion code repository at http://svn.python.org
there is now a `Mercurial <http://mercurial.selenic.com/>`_ repository at
-http://hg.python.org/\.
+http://hg.python.org/ .
After the 3.2 release, there are plans to switch to Mercurial as the primary
repository. This distributed version control system should make it easier for
members of the community to create and share external changesets. See
:pep:`385` for details.
-To learn the new version control system, see the `tutorial by Joel
+To learn to use the new version control system, see the `tutorial by Joel
Spolsky <http://hginit.com>`_ or the `Guide to Mercurial Workflows
<http://mercurial.selenic.com/guide/>`_.
diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst
new file mode 100644
index 0000000..485cdea
--- /dev/null
+++ b/Doc/whatsnew/3.3.rst
@@ -0,0 +1,2508 @@
+****************************
+ What's New In Python 3.3
+****************************
+
+.. Rules for maintenance:
+
+ * Anyone can add text to this document. Do not spend very much time
+ on the wording of your changes, because your text will probably
+ get rewritten to some degree.
+
+ * The maintainer will go through Misc/NEWS periodically and add
+ changes; it's therefore more important to add your changes to
+ Misc/NEWS than to this file.
+
+ * This is not a complete list of every single change; completeness
+ is the purpose of Misc/NEWS. Some changes I consider too small
+ or esoteric to include. If such a change is added to the text,
+ I'll just remove it. (This is another reason you shouldn't spend
+ too much time on writing your addition.)
+
+ * If you want to draw your new text to the attention of the
+ maintainer, add 'XXX' to the beginning of the paragraph or
+ section.
+
+ * It's OK to just add a fragmentary note about a change. For
+ example: "XXX Describe the transmogrify() function added to the
+ socket module." The maintainer will research the change and
+ write the necessary text.
+
+ * You can comment out your additions if you like, but it's not
+ necessary (especially when a final release is some months away).
+
+ * Credit the author of a patch or bugfix. Just the name is
+ sufficient; the e-mail address isn't necessary.
+
+ * It's helpful to add the bug/patch number as a comment:
+
+ XXX Describe the transmogrify() function added to the socket
+ module.
+ (Contributed by P.Y. Developer in :issue:`12345`.)
+
+ This saves the maintainer the effort of going through the Mercurial log
+ when researching a change.
+
+This article explains the new features in Python 3.3, compared to 3.2.
+Python 3.3 was released on September 29, 2012. For full details,
+see the :source:`Misc/NEWS` file.
+
+.. seealso::
+
+ :pep:`398` - Python 3.3 Release Schedule
+
+
+Summary -- Release highlights
+=============================
+
+.. This section singles out the most important changes in Python 3.3.
+ Brevity is key.
+
+New syntax features:
+
+* New ``yield from`` expression for :ref:`generator delegation <pep-380>`.
+* The ``u'unicode'`` syntax is accepted again for :class:`str` objects.
+
+New library modules:
+
+* :mod:`faulthandler` (helps debugging low-level crashes)
+* :mod:`ipaddress` (high-level objects representing IP addresses and masks)
+* :mod:`lzma` (compress data using the XZ / LZMA algorithm)
+* :mod:`unittest.mock` (replace parts of your system under test with mock objects)
+* :mod:`venv` (Python :ref:`virtual environments <pep-405>`, as in the
+ popular ``virtualenv`` package)
+
+New built-in features:
+
+* Reworked :ref:`I/O exception hierarchy <pep-3151>`.
+
+Implementation improvements:
+
+* Rewritten :ref:`import machinery <importlib>` based on :mod:`importlib`.
+* More compact :ref:`unicode strings <pep-393>`.
+* More compact :ref:`attribute dictionaries <pep-412>`.
+
+Significantly Improved Library Modules:
+
+* C Accelerator for the :ref:`decimal <new-decimal>` module.
+* Better unicode handling in the :ref:`email <new-email>` module
+ (:term:`provisional <provisional package>`).
+
+Security improvements:
+
+* Hash randomization is switched on by default.
+
+Please read on for a comprehensive list of user-facing changes.
+
+
+.. _pep-405:
+
+PEP 405: Virtual Environments
+=============================
+
+Virtual environments help create separate Python setups while sharing a
+system-wide base install, for ease of maintenance. Virtual environments
+have their own set of private site packages (i.e. locally-installed
+libraries), and are optionally segregated from the system-wide site
+packages. Their concept and implementation are inspired by the popular
+``virtualenv`` third-party package, but benefit from tighter integration
+with the interpreter core.
+
+This PEP adds the :mod:`venv` module for programmatic access, and the
+:ref:`pyvenv <scripts-pyvenv>` script for command-line access and
+administration. The Python interpreter checks for a ``pyvenv.cfg``,
+file whose existence signals the base of a virtual environment's directory
+tree.
+
+.. seealso::
+
+ :pep:`405` - Python Virtual Environments
+ PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip
+
+
+PEP 420: Implicit Namespace Packages
+====================================
+
+Native support for package directories that don't require ``__init__.py``
+marker files and can automatically span multiple path segments (inspired by
+various third party approaches to namespace packages, as described in
+:pep:`420`)
+
+.. seealso::
+
+ :pep:`420` - Implicit Namespace Packages
+ PEP written by Eric V. Smith; implementation by Eric V. Smith
+ and Barry Warsaw
+
+
+.. _pep-3118-update:
+
+PEP 3118: New memoryview implementation and buffer protocol documentation
+=========================================================================
+
+The implementation of :pep:`3118` has been significantly improved.
+
+The new memoryview implementation comprehensively fixes all ownership and
+lifetime issues of dynamically allocated fields in the Py_buffer struct
+that led to multiple crash reports. Additionally, several functions that
+crashed or returned incorrect results for non-contiguous or multi-dimensional
+input have been fixed.
+
+The memoryview object now has a PEP-3118 compliant getbufferproc()
+that checks the consumer's request type. Many new features have been
+added, most of them work in full generality for non-contiguous arrays
+and arrays with suboffsets.
+
+The documentation has been updated, clearly spelling out responsibilities
+for both exporters and consumers. Buffer request flags are grouped into
+basic and compound flags. The memory layout of non-contiguous and
+multi-dimensional NumPy-style arrays is explained.
+
+Features
+--------
+
+* All native single character format specifiers in struct module syntax
+ (optionally prefixed with '@') are now supported.
+
+* With some restrictions, the cast() method allows changing of format and
+ shape of C-contiguous arrays.
+
+* Multi-dimensional list representations are supported for any array type.
+
+* Multi-dimensional comparisons are supported for any array type.
+
+* One-dimensional memoryviews of hashable (read-only) types with formats B,
+ b or c are now hashable. (Contributed by Antoine Pitrou in :issue:`13411`)
+
+* Arbitrary slicing of any 1-D arrays type is supported. For example, it
+ is now possible to reverse a memoryview in O(1) by using a negative step.
+
+API changes
+-----------
+
+* The maximum number of dimensions is officially limited to 64.
+
+* The representation of empty shape, strides and suboffsets is now
+ an empty tuple instead of None.
+
+* Accessing a memoryview element with format 'B' (unsigned bytes)
+ now returns an integer (in accordance with the struct module syntax).
+ For returning a bytes object the view must be cast to 'c' first.
+
+* memoryview comparisons now use the logical structure of the operands
+ and compare all array elements by value. All format strings in struct
+ module syntax are supported. Views with unrecognised format strings
+ are still permitted, but will always compare as unequal, regardless
+ of view contents.
+
+* For further changes see `Build and C API Changes`_ and `Porting C code`_ .
+
+(Contributed by Stefan Krah in :issue:`10181`)
+
+.. seealso::
+
+ :pep:`3118` - Revising the Buffer Protocol
+
+
+.. _pep-393:
+
+PEP 393: Flexible String Representation
+=======================================
+
+The Unicode string type is changed to support multiple internal
+representations, depending on the character with the largest Unicode ordinal
+(1, 2, or 4 bytes) in the represented string. This allows a space-efficient
+representation in common cases, but gives access to full UCS-4 on all
+systems. For compatibility with existing APIs, several representations may
+exist in parallel; over time, this compatibility should be phased out.
+
+On the Python side, there should be no downside to this change.
+
+On the C API side, PEP 393 is fully backward compatible. The legacy API
+should remain available at least five years. Applications using the legacy
+API will not fully benefit of the memory reduction, or - worse - may use
+a bit more memory, because Python may have to maintain two versions of each
+string (in the legacy format and in the new efficient storage).
+
+Functionality
+-------------
+
+Changes introduced by :pep:`393` are the following:
+
+* Python now always supports the full range of Unicode codepoints, including
+ non-BMP ones (i.e. from ``U+0000`` to ``U+10FFFF``). The distinction between
+ narrow and wide builds no longer exists and Python now behaves like a wide
+ build, even under Windows.
+
+* With the death of narrow builds, the problems specific to narrow builds have
+ also been fixed, for example:
+
+ * :func:`len` now always returns 1 for non-BMP characters,
+ so ``len('\U0010FFFF') == 1``;
+
+ * surrogate pairs are not recombined in string literals,
+ so ``'\uDBFF\uDFFF' != '\U0010FFFF'``;
+
+ * indexing or slicing non-BMP characters returns the expected value,
+ so ``'\U0010FFFF'[0]`` now returns ``'\U0010FFFF'`` and not ``'\uDBFF'``;
+
+ * all other functions in the standard library now correctly handle
+ non-BMP codepoints.
+
+* The value of :data:`sys.maxunicode` is now always ``1114111`` (``0x10FFFF``
+ in hexadecimal). The :c:func:`PyUnicode_GetMax` function still returns
+ either ``0xFFFF`` or ``0x10FFFF`` for backward compatibility, and it should
+ not be used with the new Unicode API (see :issue:`13054`).
+
+* The :file:`./configure` flag ``--with-wide-unicode`` has been removed.
+
+Performance and resource usage
+------------------------------
+
+The storage of Unicode strings now depends on the highest codepoint in the string:
+
+* pure ASCII and Latin1 strings (``U+0000-U+00FF``) use 1 byte per codepoint;
+
+* BMP strings (``U+0000-U+FFFF``) use 2 bytes per codepoint;
+
+* non-BMP strings (``U+10000-U+10FFFF``) use 4 bytes per codepoint.
+
+The net effect is that for most applications, memory usage of string
+storage should decrease significantly - especially compared to former
+wide unicode builds - as, in many cases, strings will be pure ASCII
+even in international contexts (because many strings store non-human
+language data, such as XML fragments, HTTP headers, JSON-encoded data,
+etc.). We also hope that it will, for the same reasons, increase CPU
+cache efficiency on non-trivial applications. The memory usage of
+Python 3.3 is two to three times smaller than Python 3.2, and a little
+bit better than Python 2.7, on a Django benchmark (see the PEP for
+details).
+
+.. seealso::
+
+ :pep:`393` - Flexible String Representation
+ PEP written by Martin von Löwis; implementation by Torsten Becker
+ and Martin von Löwis.
+
+
+.. _pep-397:
+
+PEP 397: Python Launcher for Windows
+====================================
+
+The Python 3.3 Windows installer now includes a ``py`` launcher application
+that can be used to launch Python applications in a version independent
+fashion.
+
+This launcher is invoked implicitly when double-clicking ``*.py`` files.
+If only a single Python version is installed on the system, that version
+will be used to run the file. If multiple versions are installed, the most
+recent version is used by default, but this can be overridden by including
+a Unix-style "shebang line" in the Python script.
+
+The launcher can also be used explicitly from the command line as the ``py``
+application. Running ``py`` follows the same version selection rules as
+implicitly launching scripts, but a more specific version can be selected
+by passing appropriate arguments (such as ``-3`` to request Python 3 when
+Python 2 is also installed, or ``-2.6`` to specifclly request an earlier
+Python version when a more recent version is installed).
+
+In addition to the launcher, the Windows installer now includes an
+option to add the newly installed Python to the system PATH (contributed
+by Brian Curtin in :issue:`3561`).
+
+.. seealso::
+
+ :pep:`397` - Python Launcher for Windows
+ PEP written by Mark Hammond and Martin v. Löwis; implementation by
+ Vinay Sajip.
+
+ Launcher documentation: :ref:`launcher`
+
+ Installer PATH modification: :ref:`windows-path-mod`
+
+
+.. _pep-3151:
+
+PEP 3151: Reworking the OS and IO exception hierarchy
+=====================================================
+
+The hierarchy of exceptions raised by operating system errors is now both
+simplified and finer-grained.
+
+You don't have to worry anymore about choosing the appropriate exception
+type between :exc:`OSError`, :exc:`IOError`, :exc:`EnvironmentError`,
+:exc:`WindowsError`, :exc:`mmap.error`, :exc:`socket.error` or
+:exc:`select.error`. All these exception types are now only one:
+:exc:`OSError`. The other names are kept as aliases for compatibility
+reasons.
+
+Also, it is now easier to catch a specific error condition. Instead of
+inspecting the ``errno`` attribute (or ``args[0]``) for a particular
+constant from the :mod:`errno` module, you can catch the adequate
+:exc:`OSError` subclass. The available subclasses are the following:
+
+* :exc:`BlockingIOError`
+* :exc:`ChildProcessError`
+* :exc:`ConnectionError`
+* :exc:`FileExistsError`
+* :exc:`FileNotFoundError`
+* :exc:`InterruptedError`
+* :exc:`IsADirectoryError`
+* :exc:`NotADirectoryError`
+* :exc:`PermissionError`
+* :exc:`ProcessLookupError`
+* :exc:`TimeoutError`
+
+And the :exc:`ConnectionError` itself has finer-grained subclasses:
+
+* :exc:`BrokenPipeError`
+* :exc:`ConnectionAbortedError`
+* :exc:`ConnectionRefusedError`
+* :exc:`ConnectionResetError`
+
+Thanks to the new exceptions, common usages of the :mod:`errno` can now be
+avoided. For example, the following code written for Python 3.2::
+
+ from errno import ENOENT, EACCES, EPERM
+
+ try:
+ with open("document.txt") as f:
+ content = f.read()
+ except IOError as err:
+ if err.errno == ENOENT:
+ print("document.txt file is missing")
+ elif err.errno in (EACCES, EPERM):
+ print("You are not allowed to read document.txt")
+ else:
+ raise
+
+can now be written without the :mod:`errno` import and without manual
+inspection of exception attributes::
+
+ try:
+ with open("document.txt") as f:
+ content = f.read()
+ except FileNotFoundError:
+ print("document.txt file is missing")
+ except PermissionError:
+ print("You are not allowed to read document.txt")
+
+.. seealso::
+
+ :pep:`3151` - Reworking the OS and IO Exception Hierarchy
+ PEP written and implemented by Antoine Pitrou
+
+
+.. _pep-380:
+
+PEP 380: Syntax for Delegating to a Subgenerator
+================================================
+
+PEP 380 adds the ``yield from`` expression, allowing a generator to delegate
+part of its operations to another generator. This allows a section of code
+containing 'yield' to be factored out and placed in another generator.
+Additionally, the subgenerator is allowed to return with a value, and the
+value is made available to the delegating generator.
+
+While designed primarily for use in delegating to a subgenerator, the ``yield
+from`` expression actually allows delegation to arbitrary subiterators.
+
+For simple iterators, ``yield from iterable`` is essentially just a shortened
+form of ``for item in iterable: yield item``::
+
+ >>> def g(x):
+ ... yield from range(x, 0, -1)
+ ... yield from range(x)
+ ...
+ >>> list(g(5))
+ [5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
+
+However, unlike an ordinary loop, ``yield from`` allows subgenerators to
+receive sent and thrown values directly from the calling scope, and
+return a final value to the outer generator::
+
+ >>> def accumulate(start=0):
+ ... tally = start
+ ... while 1:
+ ... next = yield
+ ... if next is None:
+ ... return tally
+ ... tally += next
+ ...
+ >>> def gather_tallies(tallies, start=0):
+ ... while 1:
+ ... tally = yield from accumulate()
+ ... tallies.append(tally)
+ ...
+ >>> tallies = []
+ >>> acc = gather_tallies(tallies)
+ >>> next(acc) # Ensure the accumulator is ready to accept values
+ >>> for i in range(10):
+ ... acc.send(i)
+ ...
+ >>> acc.send(None) # Finish the first tally
+ >>> for i in range(5):
+ ... acc.send(i)
+ ...
+ >>> acc.send(None) # Finish the second tally
+ >>> tallies
+ [45, 10]
+
+The main principle driving this change is to allow even generators that are
+designed to be used with the ``send`` and ``throw`` methods to be split into
+multiple subgenerators as easily as a single large function can be split into
+multiple subfunctions.
+
+.. seealso::
+
+ :pep:`380` - Syntax for Delegating to a Subgenerator
+ PEP written by Greg Ewing; implementation by Greg Ewing, integrated into
+ 3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by
+ Zbigniew Jędrzejewski-Szmek and Nick Coghlan
+
+
+PEP 409: Suppressing exception context
+======================================
+
+PEP 409 introduces new syntax that allows the display of the chained
+exception context to be disabled. This allows cleaner error messages in
+applications that convert between exception types::
+
+ >>> class D:
+ ... def __init__(self, extra):
+ ... self._extra_attributes = extra
+ ... def __getattr__(self, attr):
+ ... try:
+ ... return self._extra_attributes[attr]
+ ... except KeyError:
+ ... raise AttributeError(attr) from None
+ ...
+ >>> D({}).x
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ File "<stdin>", line 8, in __getattr__
+ AttributeError: x
+
+Without the ``from None`` suffix to suppress the cause, the original
+exception would be displayed by default::
+
+ >>> class C:
+ ... def __init__(self, extra):
+ ... self._extra_attributes = extra
+ ... def __getattr__(self, attr):
+ ... try:
+ ... return self._extra_attributes[attr]
+ ... except KeyError:
+ ... raise AttributeError(attr)
+ ...
+ >>> C({}).x
+ Traceback (most recent call last):
+ File "<stdin>", line 6, in __getattr__
+ KeyError: 'x'
+
+ During handling of the above exception, another exception occurred:
+
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ File "<stdin>", line 8, in __getattr__
+ AttributeError: x
+
+No debugging capability is lost, as the original exception context remains
+available if needed (for example, if an intervening library has incorrectly
+suppressed valuable underlying details)::
+
+ >>> try:
+ ... D({}).x
+ ... except AttributeError as exc:
+ ... print(repr(exc.__context__))
+ ...
+ KeyError('x',)
+
+.. seealso::
+
+ :pep:`409` - Suppressing exception context
+ PEP written by Ethan Furman; implemented by Ethan Furman and Nick
+ Coghlan.
+
+
+PEP 414: Explicit Unicode literals
+======================================
+
+To ease the transition from Python 2 for Unicode aware Python applications
+that make heavy use of Unicode literals, Python 3.3 once again supports the
+"``u``" prefix for string literals. This prefix has no semantic significance
+in Python 3, it is provided solely to reduce the number of purely mechanical
+changes in migrating to Python 3, making it easier for developers to focus on
+the more significant semantic changes (such as the stricter default
+separation of binary and text data).
+
+.. seealso::
+
+ :pep:`414` - Explicit Unicode literals
+ PEP written by Armin Ronacher.
+
+
+PEP 3155: Qualified name for classes and functions
+==================================================
+
+Functions and class objects have a new ``__qualname__`` attribute representing
+the "path" from the module top-level to their definition. For global functions
+and classes, this is the same as ``__name__``. For other functions and classes,
+it provides better information about where they were actually defined, and
+how they might be accessible from the global scope.
+
+Example with (non-bound) methods::
+
+ >>> class C:
+ ... def meth(self):
+ ... pass
+ >>> C.meth.__name__
+ 'meth'
+ >>> C.meth.__qualname__
+ 'C.meth'
+
+Example with nested classes::
+
+ >>> class C:
+ ... class D:
+ ... def meth(self):
+ ... pass
+ ...
+ >>> C.D.__name__
+ 'D'
+ >>> C.D.__qualname__
+ 'C.D'
+ >>> C.D.meth.__name__
+ 'meth'
+ >>> C.D.meth.__qualname__
+ 'C.D.meth'
+
+Example with nested functions::
+
+ >>> def outer():
+ ... def inner():
+ ... pass
+ ... return inner
+ ...
+ >>> outer().__name__
+ 'inner'
+ >>> outer().__qualname__
+ 'outer.<locals>.inner'
+
+The string representation of those objects is also changed to include the
+new, more precise information::
+
+ >>> str(C.D)
+ "<class '__main__.C.D'>"
+ >>> str(C.D.meth)
+ '<function C.D.meth at 0x7f46b9fe31e0>'
+
+.. seealso::
+
+ :pep:`3155` - Qualified name for classes and functions
+ PEP written and implemented by Antoine Pitrou.
+
+
+.. _pep-412:
+
+PEP 412: Key-Sharing Dictionary
+===============================
+
+Dictionaries used for the storage of objects' attributes are now able to
+share part of their internal storage between each other (namely, the part
+which stores the keys and their respective hashes). This reduces the memory
+consumption of programs creating many instances of non-builtin types.
+
+.. seealso::
+
+ :pep:`412` - Key-Sharing Dictionary
+ PEP written and implemented by Mark Shannon.
+
+
+PEP 362: Function Signature Object
+==================================
+
+A new function :func:`inspect.signature` makes introspection of python
+callables easy and straightforward. A broad range of callables is supported:
+python functions, decorated or not, classes, and :func:`functools.partial`
+objects. New classes :class:`inspect.Signature`, :class:`inspect.Parameter`
+and :class:`inspect.BoundArguments` hold information about the call signatures,
+such as, annotations, default values, parameters kinds, and bound arguments,
+which considerably simplifies writing decorators and any code that validates
+or amends calling signatures or arguments.
+
+.. seealso::
+
+ :pep:`362`: - Function Signature Object
+ PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo;
+ implemented by Yury Selivanov.
+
+
+PEP 421: Adding sys.implementation
+==================================
+
+A new attribute on the :mod:`sys` module exposes details specific to the
+implementation of the currently running interpreter. The initial set of
+attributes on :attr:`sys.implementation` are ``name``, ``version``,
+``hexversion``, and ``cache_tag``.
+
+The intention of ``sys.implementation`` is to consolidate into one namespace
+the implementation-specific data used by the standard library. This allows
+different Python implementations to share a single standard library code base
+much more easily. In its initial state, ``sys.implementation`` holds only a
+small portion of the implementation-specific data. Over time that ratio will
+shift in order to make the standard library more portable.
+
+One example of improved standard library portability is ``cache_tag``. As of
+Python 3.3, ``sys.implementation.cache_tag`` is used by :mod:`importlib` to
+support :pep:`3147` compliance. Any Python implementation that uses
+``importlib`` for its built-in import system may use ``cache_tag`` to control
+the caching behavior for modules.
+
+SimpleNamespace
+---------------
+
+The implementation of ``sys.implementation`` also introduces a new type to
+Python: :class:`types.SimpleNamespace`. In contrast to a mapping-based
+namespace, like :class:`dict`, ``SimpleNamespace`` is attribute-based, like
+:class:`object`. However, unlike ``object``, ``SimpleNamespace`` instances
+are writable. This means that you can add, remove, and modify the namespace
+through normal attribute access.
+
+.. seealso::
+
+ :pep:`421` - Adding sys.implementation
+ PEP written and implemented by Eric Snow.
+
+
+.. _importlib:
+
+Using importlib as the Implementation of Import
+===============================================
+:issue:`2377` - Replace __import__ w/ importlib.__import__
+:issue:`13959` - Re-implement parts of :mod:`imp` in pure Python
+:issue:`14605` - Make import machinery explicit
+:issue:`14646` - Require loaders set __loader__ and __package__
+
+The :func:`__import__` function is now powered by :func:`importlib.__import__`.
+This work leads to the completion of "phase 2" of :pep:`302`. There are
+multiple benefits to this change. First, it has allowed for more of the
+machinery powering import to be exposed instead of being implicit and hidden
+within the C code. It also provides a single implementation for all Python VMs
+supporting Python 3.3 to use, helping to end any VM-specific deviations in
+import semantics. And finally it eases the maintenance of import, allowing for
+future growth to occur.
+
+For the common user, there should be no visible change in semantics. For
+those whose code currently manipulates import or calls import
+programmatically, the code changes that might possibly be required are covered
+in the `Porting Python code`_ section of this document.
+
+New APIs
+--------
+One of the large benefits of this work is the exposure of what goes into
+making the import statement work. That means the various importers that were
+once implicit are now fully exposed as part of the :mod:`importlib` package.
+
+The abstract base classes defined in :mod:`importlib.abc` have been expanded
+to properly delineate between :term:`meta path finders <meta path finder>`
+and :term:`path entry finders <path entry finder>` by introducing
+:class:`importlib.abc.MetaPathFinder` and
+:class:`importlib.abc.PathEntryFinder`, respectively. The old ABC of
+:class:`importlib.abc.Finder` is now only provided for backwards-compatibility
+and does not enforce any method requirements.
+
+In terms of finders, :class:`importlib.machinery.FileFinder` exposes the
+mechanism used to search for source and bytecode files of a module. Previously
+this class was an implicit member of :attr:`sys.path_hooks`.
+
+For loaders, the new abstract base class :class:`importlib.abc.FileLoader` helps
+write a loader that uses the file system as the storage mechanism for a module's
+code. The loader for source files
+(:class:`importlib.machinery.SourceFileLoader`), sourceless bytecode files
+(:class:`importlib.machinery.SourcelessFileLoader`), and extension modules
+(:class:`importlib.machinery.ExtensionFileLoader`) are now available for
+direct use.
+
+:exc:`ImportError` now has ``name`` and ``path`` attributes which are set when
+there is relevant data to provide. The message for failed imports will also
+provide the full name of the module now instead of just the tail end of the
+module's name.
+
+The :func:`importlib.invalidate_caches` function will now call the method with
+the same name on all finders cached in :attr:`sys.path_importer_cache` to help
+clean up any stored state as necessary.
+
+Visible Changes
+---------------
+
+For potential required changes to code, see the `Porting Python code`_
+section.
+
+Beyond the expanse of what :mod:`importlib` now exposes, there are other
+visible changes to import. The biggest is that :attr:`sys.meta_path` and
+:attr:`sys.path_hooks` now store all of the meta path finders and path entry
+hooks used by import. Previously the finders were implicit and hidden within
+the C code of import instead of being directly exposed. This means that one can
+now easily remove or change the order of the various finders to fit one's needs.
+
+Another change is that all modules have a ``__loader__`` attribute, storing the
+loader used to create the module. :pep:`302` has been updated to make this
+attribute mandatory for loaders to implement, so in the future once 3rd-party
+loaders have been updated people will be able to rely on the existence of the
+attribute. Until such time, though, import is setting the module post-load.
+
+Loaders are also now expected to set the ``__package__`` attribute from
+:pep:`366`. Once again, import itself is already setting this on all loaders
+from :mod:`importlib` and import itself is setting the attribute post-load.
+
+``None`` is now inserted into :attr:`sys.path_importer_cache` when no finder
+can be found on :attr:`sys.path_hooks`. Since :class:`imp.NullImporter` is not
+directly exposed on :attr:`sys.path_hooks` it could no longer be relied upon to
+always be available to use as a value representing no finder found.
+
+All other changes relate to semantic changes which should be taken into
+consideration when updating code for Python 3.3, and thus should be read about
+in the `Porting Python code`_ section of this document.
+
+(Implementation by Brett Cannon)
+
+
+Other Language Changes
+======================
+
+Some smaller changes made to the core Python language are:
+
+* Added support for Unicode name aliases and named sequences.
+ Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases,
+ and :func:`unicodedata.lookup()` resolves named sequences too.
+
+ (Contributed by Ezio Melotti in :issue:`12753`)
+
+* Unicode database updated to UCD version 6.1.0
+
+* Equality comparisons on :func:`range` objects now return a result reflecting
+ the equality of the underlying sequences generated by those range objects.
+ (:issue:`13201`)
+
+* The ``count()``, ``find()``, ``rfind()``, ``index()`` and ``rindex()``
+ methods of :class:`bytes` and :class:`bytearray` objects now accept an
+ integer between 0 and 255 as their first argument.
+
+ (Contributed by Petri Lehtinen in :issue:`12170`)
+
+* The ``rjust()``, ``ljust()``, and ``center()`` methods of :class:`bytes`
+ and :class:`bytearray` now accept a :class:`bytearray` for the ``fill``
+ argument. (Contributed by Petri Lehtinen in :issue:`12380`.)
+
+* New methods have been added to :class:`list` and :class:`bytearray`:
+ ``copy()`` and ``clear()`` (:issue:`10516`). Consequently,
+ :class:`~collections.abc.MutableSequence` now also defines a
+ :meth:`~collections.abc.MutableSequence.clear` method (:issue:`11388`).
+
+* Raw bytes literals can now be written ``rb"..."`` as well as ``br"..."``.
+
+ (Contributed by Antoine Pitrou in :issue:`13748`.)
+
+* :meth:`dict.setdefault` now does only one lookup for the given key, making
+ it atomic when used with built-in types.
+
+ (Contributed by Filip Gruszczyński in :issue:`13521`.)
+
+* The error messages produced when a function call does not match the function
+ signature have been significantly improved.
+
+ (Contributed by Benjamin Peterson.)
+
+
+A Finer-Grained Import Lock
+===========================
+
+Previous versions of CPython have always relied on a global import lock.
+This led to unexpected annoyances, such as deadlocks when importing a module
+would trigger code execution in a different thread as a side-effect.
+Clumsy workarounds were sometimes employed, such as the
+:c:func:`PyImport_ImportModuleNoBlock` C API function.
+
+In Python 3.3, importing a module takes a per-module lock. This correctly
+serializes importation of a given module from multiple threads (preventing
+the exposure of incompletely initialized modules), while eliminating the
+aforementioned annoyances.
+
+(Contributed by Antoine Pitrou in :issue:`9260`.)
+
+
+Builtin functions and types
+===========================
+
+* :func:`open` gets a new *opener* parameter: the underlying file descriptor
+ for the file object is then obtained by calling *opener* with (*file*,
+ *flags*). It can be used to use custom flags like :data:`os.O_CLOEXEC` for
+ example. The ``'x'`` mode was added: open for exclusive creation, failing if
+ the file already exists.
+* :func:`print`: added the *flush* keyword argument. If the *flush* keyword
+ argument is true, the stream is forcibly flushed.
+* :func:`hash`: hash randomization is enabled by default, see
+ :meth:`object.__hash__` and :envvar:`PYTHONHASHSEED`.
+* The :class:`str` type gets a new :meth:`~str.casefold` method: return a
+ casefolded copy of the string, casefolded strings may be used for caseless
+ matching. For example, ``'ß'.casefold()`` returns ``'ss'``.
+* The sequence documentation has been substantially rewritten to better
+ explain the binary/text sequence distinction and to provide specific
+ documentation sections for the individual builtin sequence types
+ (:issue:`4966`)
+
+
+New Modules
+===========
+
+faulthandler
+------------
+
+This new debug module :mod:`faulthandler` contains functions to dump Python tracebacks explicitly,
+on a fault (a crash like a segmentation fault), after a timeout, or on a user
+signal. Call :func:`faulthandler.enable` to install fault handlers for the
+:const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS`, and
+:const:`SIGILL` signals. You can also enable them at startup by setting the
+:envvar:`PYTHONFAULTHANDLER` environment variable or by using :option:`-X`
+``faulthandler`` command line option.
+
+Example of a segmentation fault on Linux: ::
+
+ $ python -q -X faulthandler
+ >>> import ctypes
+ >>> ctypes.string_at(0)
+ Fatal Python error: Segmentation fault
+
+ Current thread 0x00007fb899f39700:
+ File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
+ File "<stdin>", line 1 in <module>
+ Segmentation fault
+
+
+ipaddress
+---------
+
+The new :mod:`ipaddress` module provides tools for creating and manipulating
+objects representing IPv4 and IPv6 addresses, networks and interfaces (i.e.
+an IP address associated with a specific IP subnet).
+
+(Contributed by Google and Peter Moody in :pep:`3144`)
+
+lzma
+----
+
+The newly-added :mod:`lzma` module provides data compression and decompression
+using the LZMA algorithm, including support for the ``.xz`` and ``.lzma``
+file formats.
+
+(Contributed by Nadeem Vawda and Per Øyvind Karlsen in :issue:`6715`)
+
+
+Improved Modules
+================
+
+abc
+---
+
+Improved support for abstract base classes containing descriptors composed with
+abstract methods. The recommended approach to declaring abstract descriptors is
+now to provide :attr:`__isabstractmethod__` as a dynamically updated
+property. The built-in descriptors have been updated accordingly.
+
+ * :class:`abc.abstractproperty` has been deprecated, use :class:`property`
+ with :func:`abc.abstractmethod` instead.
+ * :class:`abc.abstractclassmethod` has been deprecated, use
+ :class:`classmethod` with :func:`abc.abstractmethod` instead.
+ * :class:`abc.abstractstaticmethod` has been deprecated, use
+ :class:`staticmethod` with :func:`abc.abstractmethod` instead.
+
+(Contributed by Darren Dale in :issue:`11610`)
+
+:meth:`abc.ABCMeta.register` now returns the registered subclass, which means
+it can now be used as a class decorator (:issue:`10868`).
+
+
+array
+-----
+
+The :mod:`array` module supports the :c:type:`long long` type using ``q`` and
+``Q`` type codes.
+
+(Contributed by Oren Tirosh and Hirokazu Yamamoto in :issue:`1172711`)
+
+
+base64
+------
+
+ASCII-only Unicode strings are now accepted by the decoding functions of the
+:mod:`base64` modern interface. For example, ``base64.b64decode('YWJj')``
+returns ``b'abc'``. (Contributed by Catalin Iacob in :issue:`13641`.)
+
+
+binascii
+--------
+
+In addition to the binary objects they normally accept, the ``a2b_`` functions
+now all also accept ASCII-only strings as input. (Contributed by Antoine
+Pitrou in :issue:`13637`.)
+
+
+bz2
+---
+
+The :mod:`bz2` module has been rewritten from scratch. In the process, several
+new features have been added:
+
+* New :func:`bz2.open` function: open a bzip2-compressed file in binary or
+ text mode.
+
+* :class:`bz2.BZ2File` can now read from and write to arbitrary file-like
+ objects, by means of its constructor's *fileobj* argument.
+
+ (Contributed by Nadeem Vawda in :issue:`5863`)
+
+* :class:`bz2.BZ2File` and :func:`bz2.decompress` can now decompress
+ multi-stream inputs (such as those produced by the :program:`pbzip2` tool).
+ :class:`bz2.BZ2File` can now also be used to create this type of file, using
+ the ``'a'`` (append) mode.
+
+ (Contributed by Nir Aides in :issue:`1625`)
+
+* :class:`bz2.BZ2File` now implements all of the :class:`io.BufferedIOBase` API,
+ except for the :meth:`detach` and :meth:`truncate` methods.
+
+
+codecs
+------
+
+The :mod:`~encodings.mbcs` codec has been rewritten to handle correctly
+``replace`` and ``ignore`` error handlers on all Windows versions. The
+:mod:`~encodings.mbcs` codec now supports all error handlers, instead of only
+``replace`` to encode and ``ignore`` to decode.
+
+A new Windows-only codec has been added: ``cp65001`` (:issue:`13216`). It is the
+Windows code page 65001 (Windows UTF-8, ``CP_UTF8``). For example, it is used
+by ``sys.stdout`` if the console output code page is set to cp65001 (e.g., using
+``chcp 65001`` command).
+
+Multibyte CJK decoders now resynchronize faster. They only ignore the first
+byte of an invalid byte sequence. For example, ``b'\xff\n'.decode('gb2312',
+'replace')`` now returns a ``\n`` after the replacement character.
+
+(:issue:`12016`)
+
+Incremental CJK codec encoders are no longer reset at each call to their
+encode() methods. For example::
+
+ $ ./python -q
+ >>> import codecs
+ >>> encoder = codecs.getincrementalencoder('hz')('strict')
+ >>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
+ b'~{NpJ)l6HK!#~} Bye.'
+
+This example gives ``b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'`` with older Python
+versions.
+
+(:issue:`12100`)
+
+The ``unicode_internal`` codec has been deprecated.
+
+
+collections
+-----------
+
+Addition of a new :class:`~collections.ChainMap` class to allow treating a
+number of mappings as a single unit. (Written by Raymond Hettinger for
+:issue:`11089`, made public in :issue:`11297`)
+
+The abstract base classes have been moved in a new :mod:`collections.abc`
+module, to better differentiate between the abstract and the concrete
+collections classes. Aliases for ABCs are still present in the
+:mod:`collections` module to preserve existing imports. (:issue:`11085`)
+
+.. XXX addition of __slots__ to ABCs not recorded here: internal detail
+
+The :class:`~collections.Counter` class now supports the unary ``+`` and ``-``
+operators, as well as the in-place operators ``+=``, ``-=``, ``|=``, and
+``&=``. (Contributed by Raymond Hettinger in :issue:`13121`.)
+
+
+contextlib
+----------
+
+:class:`~contextlib.ExitStack` now provides a solid foundation for
+programmatic manipulation of context managers and similar cleanup
+functionality. Unlike the previous ``contextlib.nested`` API (which was
+deprecated and removed), the new API is designed to work correctly
+regardless of whether context managers acquire their resources in
+their ``__init__`` method (for example, file objects) or in their
+``__enter__`` method (for example, synchronisation objects from the
+:mod:`threading` module).
+
+(:issue:`13585`)
+
+
+crypt
+-----
+
+Addition of salt and modular crypt format (hashing method) and the :func:`~crypt.mksalt`
+function to the :mod:`crypt` module.
+
+(:issue:`10924`)
+
+curses
+------
+
+ * If the :mod:`curses` module is linked to the ncursesw library, use Unicode
+ functions when Unicode strings or characters are passed (e.g.
+ :c:func:`waddwstr`), and bytes functions otherwise (e.g. :c:func:`waddstr`).
+ * Use the locale encoding instead of ``utf-8`` to encode Unicode strings.
+ * :class:`curses.window` has a new :attr:`curses.window.encoding` attribute.
+ * The :class:`curses.window` class has a new :meth:`~curses.window.get_wch`
+ method to get a wide character
+ * The :mod:`curses` module has a new :meth:`~curses.unget_wch` function to
+ push a wide character so the next :meth:`~curses.window.get_wch` will return
+ it
+
+(Contributed by Iñigo Serna in :issue:`6755`)
+
+datetime
+--------
+
+ * Equality comparisons between naive and aware :class:`~datetime.datetime`
+ instances now return :const:`False` instead of raising :exc:`TypeError`
+ (:issue:`15006`).
+ * New :meth:`datetime.datetime.timestamp` method: Return POSIX timestamp
+ corresponding to the :class:`~datetime.datetime` instance.
+ * The :meth:`datetime.datetime.strftime` method supports formatting years
+ older than 1000.
+ * The :meth:`datetime.datetime.astimezone` method can now be
+ called without arguments to convert datetime instance to the system
+ timezone.
+
+
+.. _new-decimal:
+
+decimal
+-------
+
+:issue:`7652` - integrate fast native decimal arithmetic.
+ C-module and libmpdec written by Stefan Krah.
+
+The new C version of the decimal module integrates the high speed libmpdec
+library for arbitrary precision correctly-rounded decimal floating point
+arithmetic. libmpdec conforms to IBM's General Decimal Arithmetic Specification.
+
+Performance gains range from 10x for database applications to 100x for
+numerically intensive applications. These numbers are expected gains
+for standard precisions used in decimal floating point arithmetic. Since
+the precision is user configurable, the exact figures may vary. For example,
+in integer bignum arithmetic the differences can be significantly higher.
+
+The following table is meant as an illustration. Benchmarks are available
+at http://www.bytereef.org/mpdecimal/quickstart.html.
+
+ +---------+-------------+--------------+-------------+
+ | | decimal.py | _decimal | speedup |
+ +=========+=============+==============+=============+
+ | pi | 42.02s | 0.345s | 120x |
+ +---------+-------------+--------------+-------------+
+ | telco | 172.19s | 5.68s | 30x |
+ +---------+-------------+--------------+-------------+
+ | psycopg | 3.57s | 0.29s | 12x |
+ +---------+-------------+--------------+-------------+
+
+Features
+~~~~~~~~
+
+* The :exc:`~decimal.FloatOperation` signal optionally enables stricter
+ semantics for mixing floats and Decimals.
+
+* If Python is compiled without threads, the C version automatically
+ disables the expensive thread local context machinery. In this case,
+ the variable :data:`~decimal.HAVE_THREADS` is set to False.
+
+API changes
+~~~~~~~~~~~
+
+* The C module has the following context limits, depending on the machine
+ architecture:
+
+ +-------------------+---------------------+------------------------------+
+ | | 32-bit | 64-bit |
+ +===================+=====================+==============================+
+ | :const:`MAX_PREC` | :const:`425000000` | :const:`999999999999999999` |
+ +-------------------+---------------------+------------------------------+
+ | :const:`MAX_EMAX` | :const:`425000000` | :const:`999999999999999999` |
+ +-------------------+---------------------+------------------------------+
+ | :const:`MIN_EMIN` | :const:`-425000000` | :const:`-999999999999999999` |
+ +-------------------+---------------------+------------------------------+
+
+* In the context templates (:class:`~decimal.DefaultContext`,
+ :class:`~decimal.BasicContext` and :class:`~decimal.ExtendedContext`)
+ the magnitude of :attr:`~decimal.Context.Emax` and
+ :attr:`~decimal.Context.Emin` has changed to :const:`999999`.
+
+* The :class:`~decimal.Decimal` constructor in decimal.py does not observe
+ the context limits and converts values with arbitrary exponents or precision
+ exactly. Since the C version has internal limits, the following scheme is
+ used: If possible, values are converted exactly, otherwise
+ :exc:`~decimal.InvalidOperation` is raised and the result is NaN. In the
+ latter case it is always possible to use :meth:`~decimal.Context.create_decimal`
+ in order to obtain a rounded or inexact value.
+
+
+* The power function in decimal.py is always correctly-rounded. In the
+ C version, it is defined in terms of the correctly-rounded
+ :meth:`~decimal.Decimal.exp` and :meth:`~decimal.Decimal.ln` functions,
+ but the final result is only "almost always correctly rounded".
+
+
+* In the C version, the context dictionary containing the signals is a
+ :class:`~collections.abc.MutableMapping`. For speed reasons,
+ :attr:`~decimal.Context.flags` and :attr:`~decimal.Context.traps` always
+ refer to the same :class:`~collections.abc.MutableMapping` that the context
+ was initialized with. If a new signal dictionary is assigned,
+ :attr:`~decimal.Context.flags` and :attr:`~decimal.Context.traps`
+ are updated with the new values, but they do not reference the RHS
+ dictionary.
+
+
+* Pickling a :class:`~decimal.Context` produces a different output in order
+ to have a common interchange format for the Python and C versions.
+
+
+* The order of arguments in the :class:`~decimal.Context` constructor has been
+ changed to match the order displayed by :func:`repr`.
+
+
+* The ``watchexp`` parameter in the :meth:`~decimal.Decimal.quantize` method
+ is deprecated.
+
+
+.. _new-email:
+
+email
+-----
+
+Policy Framework
+~~~~~~~~~~~~~~~~
+
+The email package now has a :mod:`~email.policy` framework. A
+:class:`~email.policy.Policy` is an object with several methods and properties
+that control how the email package behaves. The primary policy for Python 3.3
+is the :class:`~email.policy.Compat32` policy, which provides backward
+compatibility with the email package in Python 3.2. A ``policy`` can be
+specified when an email message is parsed by a :mod:`~email.parser`, or when a
+:class:`~email.message.Message` object is created, or when an email is
+serialized using a :mod:`~email.generator`. Unless overridden, a policy passed
+to a ``parser`` is inherited by all the ``Message`` object and sub-objects
+created by the ``parser``. By default a ``generator`` will use the policy of
+the ``Message`` object it is serializing. The default policy is
+:data:`~email.policy.compat32`.
+
+The minimum set of controls implemented by all ``policy`` objects are:
+
+ =============== =======================================================
+ max_line_length The maximum length, excluding the linesep character(s),
+ individual lines may have when a ``Message`` is
+ serialized. Defaults to 78.
+
+ linesep The character used to separate individual lines when a
+ ``Message`` is serialized. Defaults to ``\n``.
+
+ cte_type ``7bit`` or ``8bit``. ``8bit`` applies only to a
+ ``Bytes`` ``generator``, and means that non-ASCII may
+ be used where allowed by the protocol (or where it
+ exists in the original input).
+
+ raise_on_defect Causes a ``parser`` to raise error when defects are
+ encountered instead of adding them to the ``Message``
+ object's ``defects`` list.
+ =============== =======================================================
+
+A new policy instance, with new settings, is created using the
+:meth:`~email.policy.Policy.clone` method of policy objects. ``clone`` takes
+any of the above controls as keyword arguments. Any control not specified in
+the call retains its default value. Thus you can create a policy that uses
+``\r\n`` linesep characters like this::
+
+ mypolicy = compat32.clone(linesep='\r\n')
+
+Policies can be used to make the generation of messages in the format needed by
+your application simpler. Instead of having to remember to specify
+``linesep='\r\n'`` in all the places you call a ``generator``, you can specify
+it once, when you set the policy used by the ``parser`` or the ``Message``,
+whichever your program uses to create ``Message`` objects. On the other hand,
+if you need to generate messages in multiple forms, you can still specify the
+parameters in the appropriate ``generator`` call. Or you can have custom
+policy instances for your different cases, and pass those in when you create
+the ``generator``.
+
+
+Provisional Policy with New Header API
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+While the policy framework is worthwhile all by itself, the main motivation for
+introducing it is to allow the creation of new policies that implement new
+features for the email package in a way that maintains backward compatibility
+for those who do not use the new policies. Because the new policies introduce a
+new API, we are releasing them in Python 3.3 as a :term:`provisional policy
+<provisional package>`. Backwards incompatible changes (up to and including
+removal of the code) may occur if deemed necessary by the core developers.
+
+The new policies are instances of :class:`~email.policy.EmailPolicy`,
+and add the following additional controls:
+
+ =============== =======================================================
+ refold_source Controls whether or not headers parsed by a
+ :mod:`~email.parser` are refolded by the
+ :mod:`~email.generator`. It can be ``none``, ``long``,
+ or ``all``. The default is ``long``, which means that
+ source headers with a line longer than
+ ``max_line_length`` get refolded. ``none`` means no
+ line get refolded, and ``all`` means that all lines
+ get refolded.
+
+ header_factory A callable that take a ``name`` and ``value`` and
+ produces a custom header object.
+ =============== =======================================================
+
+The ``header_factory`` is the key to the new features provided by the new
+policies. When one of the new policies is used, any header retrieved from
+a ``Message`` object is an object produced by the ``header_factory``, and any
+time you set a header on a ``Message`` it becomes an object produced by
+``header_factory``. All such header objects have a ``name`` attribute equal
+to the header name. Address and Date headers have additional attributes
+that give you access to the parsed data of the header. This means you can now
+do things like this::
+
+ >>> m = Message(policy=SMTP)
+ >>> m['To'] = 'Éric <foo@example.com>'
+ >>> m['to']
+ 'Éric <foo@example.com>'
+ >>> m['to'].addresses
+ (Address(display_name='Éric', username='foo', domain='example.com'),)
+ >>> m['to'].addresses[0].username
+ 'foo'
+ >>> m['to'].addresses[0].display_name
+ 'Éric'
+ >>> m['Date'] = email.utils.localtime()
+ >>> m['Date'].datetime
+ datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
+ >>> m['Date']
+ 'Fri, 25 May 2012 21:44:27 -0400'
+ >>> print(m)
+ To: =?utf-8?q?=C3=89ric?= <foo@example.com>
+ Date: Fri, 25 May 2012 21:44:27 -0400
+
+You will note that the unicode display name is automatically encoded as
+``utf-8`` when the message is serialized, but that when the header is accessed
+directly, you get the unicode version. This eliminates any need to deal with
+the :mod:`email.header` :meth:`~email.header.decode_header` or
+:meth:`~email.header.make_header` functions.
+
+You can also create addresses from parts::
+
+ >>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
+ ... Address('Sally', 'sally', 'example.com')]),
+ ... Address('Bonzo', addr_spec='bonz@laugh.com')]
+ >>> print(m)
+ To: =?utf-8?q?=C3=89ric?= <foo@example.com>
+ Date: Fri, 25 May 2012 21:44:27 -0400
+ cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
+
+Decoding to unicode is done automatically::
+
+ >>> m2 = message_from_string(str(m))
+ >>> m2['to']
+ 'Éric <foo@example.com>'
+
+When you parse a message, you can use the ``addresses`` and ``groups``
+attributes of the header objects to access the groups and individual
+addresses::
+
+ >>> m2['cc'].addresses
+ (Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
+ >>> m2['cc'].groups
+ (Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
+
+In summary, if you use one of the new policies, header manipulation works the
+way it ought to: your application works with unicode strings, and the email
+package transparently encodes and decodes the unicode to and from the RFC
+standard Content Transfer Encodings.
+
+Other API Changes
+~~~~~~~~~~~~~~~~~
+
+New :class:`~email.parser.BytesHeaderParser`, added to the :mod:`~email.parser`
+module to complement :class:`~email.parser.HeaderParser` and complete the Bytes
+API.
+
+New utility functions:
+
+ * :func:`~email.utils.format_datetime`: given a :class:`~datetime.datetime`,
+ produce a string formatted for use in an email header.
+
+ * :func:`~email.utils.parsedate_to_datetime`: given a date string from
+ an email header, convert it into an aware :class:`~datetime.datetime`,
+ or a naive :class:`~datetime.datetime` if the offset is ``-0000``.
+
+ * :func:`~email.utils.localtime`: With no argument, returns the
+ current local time as an aware :class:`~datetime.datetime` using the local
+ :class:`~datetime.timezone`. Given an aware :class:`~datetime.datetime`,
+ converts it into an aware :class:`~datetime.datetime` using the
+ local :class:`~datetime.timezone`.
+
+
+ftplib
+------
+
+* :class:`ftplib.FTP` now accepts a ``source_address`` keyword argument to
+ specify the ``(host, port)`` to use as the source address in the bind call
+ when creating the outgoing socket. (Contributed by Giampaolo Rodolà
+ in :issue:`8594`.)
+
+* The :class:`~ftplib.FTP_TLS` class now provides a new
+ :func:`~ftplib.FTP_TLS.ccc` function to revert control channel back to
+ plaintext. This can be useful to take advantage of firewalls that know how
+ to handle NAT with non-secure FTP without opening fixed ports. (Contributed
+ by Giampaolo Rodolà in :issue:`12139`)
+
+* Added :meth:`ftplib.FTP.mlsd` method which provides a parsable directory
+ listing format and deprecates :meth:`ftplib.FTP.nlst` and
+ :meth:`ftplib.FTP.dir`. (Contributed by Giampaolo Rodolà in :issue:`11072`)
+
+
+functools
+---------
+
+The :func:`functools.lru_cache` decorator now accepts a ``typed`` keyword
+argument (that defaults to ``False`` to ensure that it caches values of
+different types that compare equal in separate cache slots. (Contributed
+by Raymond Hettinger in :issue:`13227`.)
+
+
+gc
+--
+
+It is now possible to register callbacks invoked by the garbage collector
+before and after collection using the new :data:`~gc.callbacks` list.
+
+
+hmac
+----
+
+A new :func:`~hmac.compare_digest` function has been added to prevent side
+channel attacks on digests through timing analysis. (Contributed by Nick
+Coghlan and Christian Heimes in :issue:`15061`)
+
+
+http
+----
+
+:class:`http.server.BaseHTTPRequestHandler` now buffers the headers and writes
+them all at once when :meth:`~http.server.BaseHTTPRequestHandler.end_headers` is
+called. A new method :meth:`~http.server.BaseHTTPRequestHandler.flush_headers`
+can be used to directly manage when the accumlated headers are sent.
+(Contributed by Andrew Schaaf in :issue:`3709`.)
+
+:class:`http.server` now produces valid ``HTML 4.01 strict`` output.
+(Contributed by Ezio Melotti in :issue:`13295`.)
+
+:class:`http.client.HTTPResponse` now has a
+:meth:`~http.client.HTTPResponse.readinto` method, which means it can be used
+as a :class:`io.RawIOBase` class. (Contributed by John Kuhn in
+:issue:`13464`.)
+
+
+html
+----
+
+:class:`html.parser.HTMLParser` is now able to parse broken markup without
+raising errors, therefore the *strict* argument of the constructor and the
+:exc:`~html.parser.HTMLParseError` exception are now deprecated.
+The ability to parse broken markup is the result of a number of bug fixes that
+are also available on the latest bug fix releases of Python 2.7/3.2.
+(Contributed by Ezio Melotti in :issue:`15114`, and :issue:`14538`,
+:issue:`13993`, :issue:`13960`, :issue:`13358`, :issue:`1745761`,
+:issue:`755670`, :issue:`13357`, :issue:`12629`, :issue:`1200313`,
+:issue:`670664`, :issue:`13273`, :issue:`12888`, :issue:`7311`)
+
+A new :data:`~html.entities.html5` dictionary that maps HTML5 named character
+references to the equivalent Unicode character(s) (e.g. ``html5['gt;'] ==
+'>'``) has been added to the :mod:`html.entities` module. The dictionary is
+now also used by :class:`~html.parser.HTMLParser`. (Contributed by Ezio
+Melotti in :issue:`11113` and :issue:`15156`)
+
+
+imaplib
+-------
+
+The :class:`~imaplib.IMAP4_SSL` constructor now accepts an SSLContext
+parameter to control parameters of the secure channel.
+
+(Contributed by Sijin Joseph in :issue:`8808`)
+
+
+inspect
+-------
+
+A new :func:`~inspect.getclosurevars` function has been added. This function
+reports the current binding of all names referenced from the function body and
+where those names were resolved, making it easier to verify correct internal
+state when testing code that relies on stateful closures.
+
+(Contributed by Meador Inge and Nick Coghlan in :issue:`13062`)
+
+A new :func:`~inspect.getgeneratorlocals` function has been added. This
+function reports the current binding of local variables in the generator's
+stack frame, making it easier to verify correct internal state when testing
+generators.
+
+(Contributed by Meador Inge in :issue:`15153`)
+
+io
+--
+
+The :func:`~io.open` function has a new ``'x'`` mode that can be used to
+exclusively create a new file, and raise a :exc:`FileExistsError` if the file
+already exists. It is based on the C11 'x' mode to fopen().
+
+(Contributed by David Townshend in :issue:`12760`)
+
+The constructor of the :class:`~io.TextIOWrapper` class has a new
+*write_through* optional argument. If *write_through* is ``True``, calls to
+:meth:`~io.TextIOWrapper.write` are guaranteed not to be buffered: any data
+written on the :class:`~io.TextIOWrapper` object is immediately handled to its
+underlying binary buffer.
+
+
+itertools
+---------
+
+:func:`~itertools.accumulate` now takes an optional ``func`` argument for
+providing a user-supplied binary function.
+
+
+logging
+-------
+
+The :func:`~logging.basicConfig` function now supports an optional ``handlers``
+argument taking an iterable of handlers to be added to the root logger.
+
+A class level attribute :attr:`~logging.handlers.SysLogHandler.append_nul` has
+been added to :class:`~logging.handlers.SysLogHandler` to allow control of the
+appending of the ``NUL`` (``\000``) byte to syslog records, since for some
+deamons it is required while for others it is passed through to the log.
+
+
+
+math
+----
+
+The :mod:`math` module has a new function, :func:`~math.log2`, which returns
+the base-2 logarithm of *x*.
+
+(Written by Mark Dickinson in :issue:`11888`).
+
+
+mmap
+----
+
+The :meth:`~mmap.mmap.read` method is now more compatible with other file-like
+objects: if the argument is omitted or specified as ``None``, it returns the
+bytes from the current file position to the end of the mapping. (Contributed
+by Petri Lehtinen in :issue:`12021`.)
+
+
+multiprocessing
+---------------
+
+The new :func:`multiprocessing.connection.wait` function allows to poll
+multiple objects (such as connections, sockets and pipes) with a timeout.
+(Contributed by Richard Oudkerk in :issue:`12328`.)
+
+:class:`multiprocessing.Connection` objects can now be transferred over
+multiprocessing connections.
+(Contributed by Richard Oudkerk in :issue:`4892`.)
+
+:class:`multiprocessing.Process` now accepts a ``daemon`` keyword argument
+to override the default behavior of inheriting the ``daemon`` flag from
+the parent process (:issue:`6064`).
+
+New attribute attribute :data:`multiprocessing.Process.sentinel` allows a
+program to wait on multiple :class:`~multiprocessing.Process` objects at one
+time using the appropriate OS primitives (for example, :mod:`select` on
+posix systems).
+
+New methods :meth:`multiprocessing.pool.Pool.starmap` and
+:meth:`~multiprocessing.pool.Pool.starmap_async` provide
+:func:`itertools.starmap` equivalents to the existing
+:meth:`multiprocessing.pool.Pool.map` and
+:meth:`~multiprocessing.pool.Pool.map_async` functions. (Contributed by Hynek
+Schlawack in :issue:`12708`.)
+
+
+nntplib
+-------
+
+The :class:`nntplib.NNTP` class now supports the context manager protocol to
+unconditionally consume :exc:`socket.error` exceptions and to close the NNTP
+connection when done::
+
+ >>> from nntplib import NNTP
+ >>> with NNTP('news.gmane.org') as n:
+ ... n.group('gmane.comp.python.committers')
+ ...
+ ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
+ >>>
+
+(Contributed by Giampaolo Rodolà in :issue:`9795`)
+
+
+os
+--
+
+* The :mod:`os` module has a new :func:`~os.pipe2` function that makes it
+ possible to create a pipe with :data:`~os.O_CLOEXEC` or
+ :data:`~os.O_NONBLOCK` flags set atomically. This is especially useful to
+ avoid race conditions in multi-threaded programs.
+
+* The :mod:`os` module has a new :func:`~os.sendfile` function which provides
+ an efficent "zero-copy" way for copying data from one file (or socket)
+ descriptor to another. The phrase "zero-copy" refers to the fact that all of
+ the copying of data between the two descriptors is done entirely by the
+ kernel, with no copying of data into userspace buffers. :func:`~os.sendfile`
+ can be used to efficiently copy data from a file on disk to a network socket,
+ e.g. for downloading a file.
+
+ (Patch submitted by Ross Lagerwall and Giampaolo Rodolà in :issue:`10882`.)
+
+* To avoid race conditions like symlink attacks and issues with temporary
+ files and directories, it is more reliable (and also faster) to manipulate
+ file descriptors instead of file names. Python 3.3 enhances existing functions
+ and introduces new functions to work on file descriptors (:issue:`4761`,
+ :issue:`10755` and :issue:`14626`).
+
+ - The :mod:`os` module has a new :func:`~os.fwalk` function similar to
+ :func:`~os.walk` except that it also yields file descriptors referring to the
+ directories visited. This is especially useful to avoid symlink races.
+
+ - The following functions get new optional *dir_fd* (:ref:`paths relative to
+ directory descriptors <dir_fd>`) and/or *follow_symlinks* (:ref:`not
+ following symlinks <follow_symlinks>`):
+ :func:`~os.access`, :func:`~os.chflags`, :func:`~os.chmod`, :func:`~os.chown`,
+ :func:`~os.link`, :func:`~os.lstat`, :func:`~os.mkdir`, :func:`~os.mkfifo`,
+ :func:`~os.mknod`, :func:`~os.open`, :func:`~os.readlink`, :func:`~os.remove`,
+ :func:`~os.rename`, :func:`~os.replace`, :func:`~os.rmdir`, :func:`~os.stat`,
+ :func:`~os.symlink`, :func:`~os.unlink`, :func:`~os.utime`. Platform
+ support for using these parameters can be checked via the sets
+ :data:`os.supports_dir_fd` and :data:`os.supports_follows_symlinks`.
+
+ - The following functions now support a file descriptor for their path argument:
+ :func:`~os.chdir`, :func:`~os.chmod`, :func:`~os.chown`,
+ :func:`~os.execve`, :func:`~os.listdir`, :func:`~os.pathconf`, :func:`~os.path.exists`,
+ :func:`~os.stat`, :func:`~os.statvfs`, :func:`~os.utime`. Platform support
+ for this can be checked via the :data:`os.supports_fd` set.
+
+* :func:`~os.access` accepts an ``effective_ids`` keyword argument to turn on
+ using the effective uid/gid rather than the real uid/gid in the access check.
+ Platform support for this can be checked via the
+ :data:`~os.supports_effective_ids` set.
+
+* The :mod:`os` module has two new functions: :func:`~os.getpriority` and
+ :func:`~os.setpriority`. They can be used to get or set process
+ niceness/priority in a fashion similar to :func:`os.nice` but extended to all
+ processes instead of just the current one.
+
+ (Patch submitted by Giampaolo Rodolà in :issue:`10784`.)
+
+* The new :func:`os.replace` function allows cross-platform renaming of a
+ file with overwriting the destination. With :func:`os.rename`, an existing
+ destination file is overwritten under POSIX, but raises an error under
+ Windows.
+ (Contributed by Antoine Pitrou in :issue:`8828`.)
+
+* The stat family of functions (:func:`~os.stat`, :func:`~os.fstat`,
+ and :func:`~os.lstat`) now support reading a file's timestamps
+ with nanosecond precision. Symmetrically, :func:`~os.utime`
+ can now write file timestamps with nanosecond precision. (Contributed by
+ Larry Hastings in :issue:`14127`.)
+
+* The new :func:`os.get_terminal_size` function queries the size of the
+ terminal attached to a file descriptor. See also
+ :func:`shutil.get_terminal_size`.
+ (Contributed by Zbigniew Jędrzejewski-Szmek in :issue:`13609`.)
+
+.. XXX sort out this mess after beta1
+
+* New functions to support Linux extended attributes (:issue:`12720`):
+ :func:`~os.getxattr`, :func:`~os.listxattr`, :func:`~os.removexattr`,
+ :func:`~os.setxattr`.
+
+* New interface to the scheduler. These functions
+ control how a process is allocated CPU time by the operating system. New
+ functions:
+ :func:`~os.sched_get_priority_max`, :func:`~os.sched_get_priority_min`,
+ :func:`~os.sched_getaffinity`, :func:`~os.sched_getparam`,
+ :func:`~os.sched_getscheduler`, :func:`~os.sched_rr_get_interval`,
+ :func:`~os.sched_setaffinity`, :func:`~os.sched_setparam`,
+ :func:`~os.sched_setscheduler`, :func:`~os.sched_yield`,
+
+* New functions to control the file system:
+
+ * :func:`~os.posix_fadvise`: Announces an intention to access data in a
+ specific pattern thus allowing the kernel to make optimizations.
+ * :func:`~os.posix_fallocate`: Ensures that enough disk space is allocated
+ for a file.
+ * :func:`~os.sync`: Force write of everything to disk.
+
+* Additional new posix functions:
+
+ * :func:`~os.lockf`: Apply, test or remove a POSIX lock on an open file descriptor.
+ * :func:`~os.pread`: Read from a file descriptor at an offset, the file
+ offset remains unchanged.
+ * :func:`~os.pwrite`: Write to a file descriptor from an offset, leaving
+ the file offset unchanged.
+ * :func:`~os.readv`: Read from a file descriptor into a number of writable buffers.
+ * :func:`~os.truncate`: Truncate the file corresponding to *path*, so that
+ it is at most *length* bytes in size.
+ * :func:`~os.waitid`: Wait for the completion of one or more child processes.
+ * :func:`~os.writev`: Write the contents of *buffers* to a file descriptor,
+ where *buffers* is an arbitrary sequence of buffers.
+ * :func:`~os.getgrouplist` (:issue:`9344`): Return list of group ids that
+ specified user belongs to.
+
+* :func:`~os.times` and :func:`~os.uname`: Return type changed from a tuple to
+ a tuple-like object with named attributes.
+
+* Some platforms now support additional constants for the :func:`~os.lseek`
+ function, such as ``os.SEEK_HOLE`` and ``os.SEEK_DATA``.
+
+* New constants :data:`~os.RTLD_LAZY`, :data:`~os.RTLD_NOW`,
+ :data:`~os.RTLD_GLOBAL`, :data:`~os.RTLD_LOCAL`, :data:`~os.RTLD_NODELETE`,
+ :data:`~os.RTLD_NOLOAD`, and :data:`~os.RTLD_DEEPBIND` are available on
+ platforms that support them. These are for use with the
+ :func:`sys.setdlopenflags` function, and supersede the similar constants
+ defined in :mod:`ctypes` and :mod:`DLFCN`. (Contributed by Victor Stinner
+ in :issue:`13226`.)
+
+* :func:`os.symlink` now accepts (and ignores) the ``target_is_directory``
+ keyword argument on non-Windows platforms, to ease cross-platform support.
+
+
+pdb
+---
+
+Tab-completion is now available not only for command names, but also their
+arguments. For example, for the ``break`` command, function and file names
+are completed.
+
+(Contributed by Georg Brandl in :issue:`14210`)
+
+
+pickle
+------
+
+:class:`pickle.Pickler` objects now have an optional
+:attr:`~pickle.Pickler.dispatch_table` attribute allowing to set per-pickler
+reduction functions.
+
+(Contributed by Richard Oudkerk in :issue:`14166`.)
+
+
+pydoc
+-----
+
+The Tk GUI and the :func:`~pydoc.serve` function have been removed from the
+:mod:`pydoc` module: ``pydoc -g`` and :func:`~pydoc.serve` have been deprecated
+in Python 3.2.
+
+
+re
+--
+
+:class:`str` regular expressions now support ``\u`` and ``\U`` escapes.
+
+(Contributed by Serhiy Storchaka in :issue:`3665`.)
+
+
+sched
+-----
+
+* :meth:`~sched.scheduler.run` now accepts a *blocking* parameter which when
+ set to False makes the method execute the scheduled events due to expire
+ soonest (if any) and then return immediately.
+ This is useful in case you want to use the :class:`~sched.scheduler` in
+ non-blocking applications. (Contributed by Giampaolo Rodolà in :issue:`13449`)
+
+* :class:`~sched.scheduler` class can now be safely used in multi-threaded
+ environments. (Contributed by Josiah Carlson and Giampaolo Rodolà in
+ :issue:`8684`)
+
+* *timefunc* and *delayfunct* parameters of :class:`~sched.scheduler` class
+ constructor are now optional and defaults to :func:`time.time` and
+ :func:`time.sleep` respectively. (Contributed by Chris Clark in
+ :issue:`13245`)
+
+* :meth:`~sched.scheduler.enter` and :meth:`~sched.scheduler.enterabs`
+ *argument* parameter is now optional. (Contributed by Chris Clark in
+ :issue:`13245`)
+
+* :meth:`~sched.scheduler.enter` and :meth:`~sched.scheduler.enterabs`
+ now accept a *kwargs* parameter. (Contributed by Chris Clark in
+ :issue:`13245`)
+
+
+select
+------
+
+Solaris and derivatives platforms have a new class :class:`select.devpoll`
+for high performance asynchronous sockets via :file:`/dev/poll`.
+(Contributed by Jesús Cea Avión in :issue:`6397`.)
+
+
+shlex
+-----
+
+The previously undocumented helper function ``quote`` from the
+:mod:`pipes` modules has been moved to the :mod:`shlex` module and
+documented. :func:`~shlex.quote` properly escapes all characters in a string
+that might be otherwise given special meaning by the shell.
+
+
+shutil
+------
+
+* New functions:
+
+ * :func:`~shutil.disk_usage`: provides total, used and free disk space
+ statistics. (Contributed by Giampaolo Rodolà in :issue:`12442`)
+ * :func:`~shutil.chown`: allows one to change user and/or group of the given
+ path also specifying the user/group names and not only their numeric
+ ids. (Contributed by Sandro Tosi in :issue:`12191`)
+ * :func:`shutil.get_terminal_size`: returns the size of the terminal window
+ to which the interpreter is attached. (Contributed by Zbigniew
+ Jędrzejewski-Szmek in :issue:`13609`.)
+
+* :func:`~shutil.copy2` and :func:`~shutil.copystat` now preserve file
+ timestamps with nanosecond precision on platforms that support it.
+ They also preserve file "extended attributes" on Linux. (Contributed
+ by Larry Hastings in :issue:`14127` and :issue:`15238`.)
+
+* Several functions now take an optional ``symlinks`` argument: when that
+ parameter is true, symlinks aren't dereferenced and the operation instead
+ acts on the symlink itself (or creates one, if relevant).
+ (Contributed by Hynek Schlawack in :issue:`12715`.)
+
+* When copying files to a different file system, :func:`~shutil.move` now
+ handles symlinks the way the posix ``mv`` command does, recreating the
+ symlink rather than copying the target file contents. (Contributed by
+ Jonathan Niehof in :issue:`9993`.) :func:`~shutil.move` now also returns
+ the ``dst`` argument as its result.
+
+* :func:`~shutil.rmtree` is now resistant to symlink attacks on platforms
+ which support the new ``dir_fd`` parameter in :func:`os.open` and
+ :func:`os.unlink`. (Contributed by Martin von Löwis and Hynek Schlawack
+ in :issue:`4489`.)
+
+
+signal
+------
+
+* The :mod:`signal` module has new functions:
+
+ * :func:`~signal.pthread_sigmask`: fetch and/or change the signal mask of the
+ calling thread (Contributed by Jean-Paul Calderone in :issue:`8407`) ;
+ * :func:`~signal.pthread_kill`: send a signal to a thread ;
+ * :func:`~signal.sigpending`: examine pending functions ;
+ * :func:`~signal.sigwait`: wait a signal.
+ * :func:`~signal.sigwaitinfo`: wait for a signal, returning detailed
+ information about it.
+ * :func:`~signal.sigtimedwait`: like :func:`~signal.sigwaitinfo` but with a
+ timeout.
+
+* The signal handler writes the signal number as a single byte instead of
+ a nul byte into the wakeup file descriptor. So it is possible to wait more
+ than one signal and know which signals were raised.
+
+* :func:`signal.signal` and :func:`signal.siginterrupt` raise an OSError,
+ instead of a RuntimeError: OSError has an errno attribute.
+
+
+smtpd
+-----
+
+The :mod:`smtpd` module now supports :rfc:`5321` (extended SMTP) and :rfc:`1870`
+(size extension). Per the standard, these extensions are enabled if and only
+if the client initiates the session with an ``EHLO`` command.
+
+(Initial ``ELHO`` support by Alberto Trevino. Size extension by Juhana
+Jauhiainen. Substantial additional work on the patch contributed by Michele
+Orrù and Dan Boswell. :issue:`8739`)
+
+
+smtplib
+-------
+
+The :class:`~smtplib.SMTP`, :class:`~smtplib.SMTP_SSL`, and
+:class:`~smtplib.LMTP` classes now accept a ``source_address`` keyword argument
+to specify the ``(host, port)`` to use as the source address in the bind call
+when creating the outgoing socket. (Contributed by Paulo Scardine in
+:issue:`11281`.)
+
+:class:`~smtplib.SMTP` now supports the context manager protocol, allowing an
+``SMTP`` instance to be used in a ``with`` statement. (Contributed
+by Giampaolo Rodolà in :issue:`11289`.)
+
+The :class:`~smtplib.SMTP_SSL` constructor and the :meth:`~smtplib.SMTP.starttls`
+method now accept an SSLContext parameter to control parameters of the secure
+channel. (Contributed by Kasun Herath in :issue:`8809`)
+
+
+socket
+------
+
+* The :class:`~socket.socket` class now exposes additional methods to process
+ ancillary data when supported by the underlying platform:
+
+ * :func:`~socket.socket.sendmsg`
+ * :func:`~socket.socket.recvmsg`
+ * :func:`~socket.socket.recvmsg_into`
+
+ (Contributed by David Watson in :issue:`6560`, based on an earlier patch by
+ Heiko Wundram)
+
+* The :class:`~socket.socket` class now supports the PF_CAN protocol family
+ (http://en.wikipedia.org/wiki/Socketcan), on Linux
+ (http://lwn.net/Articles/253425).
+
+ (Contributed by Matthias Fuchs, updated by Tiago Gonçalves in :issue:`10141`)
+
+* The :class:`~socket.socket` class now supports the PF_RDS protocol family
+ (http://en.wikipedia.org/wiki/Reliable_Datagram_Sockets and
+ http://oss.oracle.com/projects/rds/).
+
+* The :class:`~socket.socket` class now supports the ``PF_SYSTEM`` protocol
+ family on OS X. (Contributed by Michael Goderbauer in :issue:`13777`.)
+
+* New function :func:`~socket.sethostname` allows the hostname to be set
+ on unix systems if the calling process has sufficient privileges.
+ (Contributed by Ross Lagerwall in :issue:`10866`.)
+
+
+socketserver
+------------
+
+:class:`~socketserver.BaseServer` now has an overridable method
+:meth:`~socketserver.BaseServer.service_actions` that is called by the
+:meth:`~socketserver.BaseServer.serve_forever` method in the service loop.
+:class:`~socketserver.ForkingMixIn` now uses this to clean up zombie
+child proceses. (Contributed by Justin Warkentin in :issue:`11109`.)
+
+
+sqlite3
+-------
+
+New :class:`sqlite3.Connection` method
+:meth:`~sqlite3.Connection.set_trace_callback` can be used to capture a trace of
+all sql commands processed by sqlite. (Contributed by Torsten Landschoff
+in :issue:`11688`.)
+
+
+ssl
+---
+
+* The :mod:`ssl` module has two new random generation functions:
+
+ * :func:`~ssl.RAND_bytes`: generate cryptographically strong
+ pseudo-random bytes.
+ * :func:`~ssl.RAND_pseudo_bytes`: generate pseudo-random bytes.
+
+ (Contributed by Victor Stinner in :issue:`12049`)
+
+* The :mod:`ssl` module now exposes a finer-grained exception hierarchy
+ in order to make it easier to inspect the various kinds of errors.
+ (Contributed by Antoine Pitrou in :issue:`11183`)
+
+* :meth:`~ssl.SSLContext.load_cert_chain` now accepts a *password* argument
+ to be used if the private key is encrypted.
+ (Contributed by Adam Simpkins in :issue:`12803`)
+
+* Diffie-Hellman key exchange, both regular and Elliptic Curve-based, is
+ now supported through the :meth:`~ssl.SSLContext.load_dh_params` and
+ :meth:`~ssl.SSLContext.set_ecdh_curve` methods.
+ (Contributed by Antoine Pitrou in :issue:`13626` and :issue:`13627`)
+
+* SSL sockets have a new :meth:`~ssl.SSLSocket.get_channel_binding` method
+ allowing the implementation of certain authentication mechanisms such as
+ SCRAM-SHA-1-PLUS. (Contributed by Jacek Konieczny in :issue:`12551`)
+
+* You can query the SSL compression algorithm used by an SSL socket, thanks
+ to its new :meth:`~ssl.SSLSocket.compression` method. The new attribute
+ :attr:`~ssl.OP_NO_COMPRESSION` can be used to disable compression.
+ (Contributed by Antoine Pitrou in :issue:`13634`)
+
+* Support has been added for the Next Procotol Negotiation extension using
+ the :meth:`ssl.SSLContext.set_npn_protocols` method.
+ (Contributed by Colin Marc in :issue:`14204`)
+
+* SSL errors can now be introspected more easily thanks to
+ :attr:`~ssl.SSLError.library` and :attr:`~ssl.SSLError.reason` attributes.
+ (Contributed by Antoine Pitrou in :issue:`14837`)
+
+* The :func:`~ssl.get_server_certificate` function now supports IPv6.
+ (Contributed by Charles-François Natali in :issue:`11811`.)
+
+* New attribute :attr:`~ssl.OP_CIPHER_SERVER_PREFERENCE` allows setting
+ SSLv3 server sockets to use the server's cipher ordering preference rather
+ than the client's (:issue:`13635`).
+
+
+stat
+----
+
+The undocumented tarfile.filemode function has been moved to
+:func:`stat.filemode`. It can be used to convert a file's mode to a string of
+the form '-rwxrwxrwx'.
+
+(Contributed by Giampaolo Rodolà in :issue:`14807`)
+
+
+struct
+------
+
+The :mod:`struct` module now supports ``ssize_t`` and ``size_t`` via the
+new codes ``n`` and ``N``, respectively. (Contributed by Antoine Pitrou
+in :issue:`3163`.)
+
+
+subprocess
+----------
+
+Command strings can now be bytes objects on posix platforms. (Contributed by
+Victor Stinner in :issue:`8513`.)
+
+A new constant :data:`~subprocess.DEVNULL` allows suppressing output in a
+platform-independent fashion. (Contributed by Ross Lagerwall in
+:issue:`5870`.)
+
+
+sys
+---
+
+The :mod:`sys` module has a new :data:`~sys.thread_info` :term:`struct
+sequence` holding informations about the thread implementation
+(:issue:`11223`).
+
+
+tarfile
+-------
+
+:mod:`tarfile` now supports ``lzma`` encoding via the :mod:`lzma` module.
+(Contributed by Lars Gustäbel in :issue:`5689`.)
+
+
+tempfile
+--------
+
+:class:`tempfile.SpooledTemporaryFile`\'s
+:meth:`~tempfile.SpooledTemporaryFile.trucate` method now accepts
+a ``size`` parameter. (Contributed by Ryan Kelly in :issue:`9957`.)
+
+
+textwrap
+--------
+
+The :mod:`textwrap` module has a new :func:`~textwrap.indent` that makes
+it straightforward to add a common prefix to selected lines in a block
+of text (:issue:`13857`).
+
+
+threading
+---------
+
+:class:`threading.Condition`, :class:`threading.Semaphore`,
+:class:`threading.BoundedSemaphore`, :class:`threading.Event`, and
+:class:`threading.Timer`, all of which used to be factory functions returning a
+class instance, are now classes and may be subclassed. (Contributed by Éric
+Araujo in :issue:`10968`).
+
+The :class:`threading.Thread` constructor now accepts a ``daemon`` keyword
+argument to override the default behavior of inheriting the ``deamon`` flag
+value from the parent thread (:issue:`6064`).
+
+The formerly private function ``_thread.get_ident`` is now available as the
+public function :func:`threading.get_ident`. This eliminates several cases of
+direct access to the ``_thread`` module in the stdlib. Third party code that
+used ``_thread.get_ident`` should likewise be changed to use the new public
+interface.
+
+
+time
+----
+
+The :pep:`418` added new functions to the :mod:`time` module:
+
+* :func:`~time.get_clock_info`: Get information on a clock.
+* :func:`~time.monotonic`: Monotonic clock (cannot go backward), not affected
+ by system clock updates.
+* :func:`~time.perf_counter`: Performance counter with the highest available
+ resolution to measure a short duration.
+* :func:`~time.process_time`: Sum of the system and user CPU time of the
+ current process.
+
+Other new functions:
+
+* :func:`~time.clock_getres`, :func:`~time.clock_gettime` and
+ :func:`~time.clock_settime` functions with ``CLOCK_xxx`` constants.
+ (Contributed by Victor Stinner in :issue:`10278`)
+
+To improve cross platform consistency, :func:`~time.sleep` now raises a
+:exc:`ValueError` when passed a negative sleep value. Previously this was an
+error on posix, but produced an infinite sleep on Windows.
+
+
+types
+-----
+
+Add a new :class:`types.MappingProxyType` class: Read-only proxy of a mapping.
+(:issue:`14386`)
+
+
+The new functions `types.new_class` and `types.prepare_class` provide support
+for PEP 3115 compliant dynamic type creation. (:issue:`14588`)
+
+
+unittest
+--------
+
+:meth:`.assertRaises`, :meth:`.assertRaisesRegex`, :meth:`.assertWarns`, and
+:meth:`.assertWarnsRegex` now accept a keyword argument *msg* when used as
+context managers. (Contributed by Ezio Melotti and Winston Ewert in
+:issue:`10775`)
+
+:meth:`unittest.TestCase.run` now returns the :class:`~unittest.TestResult`
+object.
+
+
+urllib
+------
+
+The :class:`~urllib.request.Request` class, now accepts a *method* argument
+used by :meth:`~urllib.request.Request.get_method` to determine what HTTP method
+should be used. For example, this will send a ``'HEAD'`` request::
+
+ >>> urlopen(Request('http://www.python.org', method='HEAD'))
+
+(:issue:`1673007`)
+
+
+webbrowser
+----------
+
+The :mod:`webbrowser` module supports more "browsers": Google Chrome (named
+:program:`chrome`, :program:`chromium`, :program:`chrome-browser` or
+:program:`chromium-browser` depending on the version and operating system),
+and the generic launchers :program:`xdg-open`, from the FreeDesktop.org
+project, and :program:`gvfs-open`, which is the default URI handler for GNOME
+3. (The former contributed by Arnaud Calmettes in :issue:`13620`, the latter
+by Matthias Klose in :issue:`14493`)
+
+
+xml.etree.ElementTree
+---------------------
+
+The :mod:`xml.etree.ElementTree` module now imports its C accelerator by
+default; there is no longer a need to explicitly import
+:mod:`xml.etree.cElementTree` (this module stays for backwards compatibility,
+but is now deprecated). In addition, the ``iter`` family of methods of
+:class:`~xml.etree.ElementTree.Element` has been optimized (rewritten in C).
+The module's documentation has also been greatly improved with added examples
+and a more detailed reference.
+
+
+zlib
+----
+
+New attribute :attr:`zlib.Decompress.eof` makes it possible to distinguish
+between a properly-formed compressed stream and an incomplete or truncated one.
+(Contributed by Nadeem Vawda in :issue:`12646`.)
+
+New attribute :attr:`zlib.ZLIB_RUNTIME_VERSION` reports the version string of
+the underlying ``zlib`` library that is loaded at runtime. (Contributed by
+Torsten Landschoff in :issue:`12306`.)
+
+
+Optimizations
+=============
+
+Major performance enhancements have been added:
+
+* Thanks to :pep:`393`, some operations on Unicode strings have been optimized:
+
+ * the memory footprint is divided by 2 to 4 depending on the text
+ * encode an ASCII string to UTF-8 doesn't need to encode characters anymore,
+ the UTF-8 representation is shared with the ASCII representation
+ * the UTF-8 encoder has been optimized
+ * repeating a single ASCII letter and getting a substring of a ASCII strings
+ is 4 times faster
+
+* UTF-8 is now 2x to 4x faster. UTF-16 encoding is now up to 10x faster.
+
+ (contributed by Serhiy Storchaka, :issue:`14624`, :issue:`14738` and
+ :issue:`15026`.)
+
+
+Build and C API Changes
+=======================
+
+Changes to Python's build process and to the C API include:
+
+* New :pep:`3118` related function:
+
+ * :c:func:`PyMemoryView_FromMemory`
+
+* :pep:`393` added new Unicode types, macros and functions:
+
+ * High-level API:
+
+ * :c:func:`PyUnicode_CopyCharacters`
+ * :c:func:`PyUnicode_FindChar`
+ * :c:func:`PyUnicode_GetLength`, :c:macro:`PyUnicode_GET_LENGTH`
+ * :c:func:`PyUnicode_New`
+ * :c:func:`PyUnicode_Substring`
+ * :c:func:`PyUnicode_ReadChar`, :c:func:`PyUnicode_WriteChar`
+
+ * Low-level API:
+
+ * :c:type:`Py_UCS1`, :c:type:`Py_UCS2`, :c:type:`Py_UCS4` types
+ * :c:type:`PyASCIIObject` and :c:type:`PyCompactUnicodeObject` structures
+ * :c:macro:`PyUnicode_READY`
+ * :c:func:`PyUnicode_FromKindAndData`
+ * :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsUCS4Copy`
+ * :c:macro:`PyUnicode_DATA`, :c:macro:`PyUnicode_1BYTE_DATA`,
+ :c:macro:`PyUnicode_2BYTE_DATA`, :c:macro:`PyUnicode_4BYTE_DATA`
+ * :c:macro:`PyUnicode_KIND` with :c:type:`PyUnicode_Kind` enum:
+ :c:data:`PyUnicode_WCHAR_KIND`, :c:data:`PyUnicode_1BYTE_KIND`,
+ :c:data:`PyUnicode_2BYTE_KIND`, :c:data:`PyUnicode_4BYTE_KIND`
+ * :c:macro:`PyUnicode_READ`, :c:macro:`PyUnicode_READ_CHAR`, :c:macro:`PyUnicode_WRITE`
+ * :c:macro:`PyUnicode_MAX_CHAR_VALUE`
+
+* :c:macro:`PyArg_ParseTuple` now accepts a :class:`bytearray` for the ``c``
+ format (:issue:`12380`).
+
+
+
+Deprecated
+==========
+
+Unsupported Operating Systems
+-----------------------------
+
+OS/2 and VMS are no longer supported due to the lack of a maintainer.
+
+Windows 2000 and Windows platforms which set ``COMSPEC`` to ``command.com``
+are no longer supported due to maintenance burden.
+
+OSF support, which was deprecated in 3.2, has been completely removed.
+
+
+Deprecated Python modules, functions and methods
+------------------------------------------------
+
+* Passing a non-empty string to ``object.__format__()`` is deprecated, and
+ will produce a :exc:`TypeError` in Python 3.4 (:issue:`9856`).
+* The ``unicode_internal`` codec has been deprecated because of the
+ :pep:`393`, use UTF-8, UTF-16 (``utf-16-le`` or ``utf-16-be``), or UTF-32
+ (``utf-32-le`` or ``utf-32-be``)
+* :meth:`ftplib.FTP.nlst` and :meth:`ftplib.FTP.dir`: use
+ :meth:`ftplib.FTP.mlsd`
+* :func:`platform.popen`: use the :mod:`subprocess` module. Check especially
+ the :ref:`subprocess-replacements` section (:issue:`11377`).
+* :issue:`13374`: The Windows bytes API has been deprecated in the :mod:`os`
+ module. Use Unicode filenames, instead of bytes filenames, to not depend on
+ the ANSI code page anymore and to support any filename.
+* :issue:`13988`: The :mod:`xml.etree.cElementTree` module is deprecated. The
+ accelerator is used automatically whenever available.
+* The behaviour of :func:`time.clock` depends on the platform: use the new
+ :func:`time.perf_counter` or :func:`time.process_time` function instead,
+ depending on your requirements, to have a well defined behaviour.
+* The :func:`os.stat_float_times` function is deprecated.
+* :mod:`abc` module:
+
+ * :class:`abc.abstractproperty` has been deprecated, use :class:`property`
+ with :func:`abc.abstractmethod` instead.
+ * :class:`abc.abstractclassmethod` has been deprecated, use
+ :class:`classmethod` with :func:`abc.abstractmethod` instead.
+ * :class:`abc.abstractstaticmethod` has been deprecated, use
+ :class:`staticmethod` with :func:`abc.abstractmethod` instead.
+
+* :mod:`importlib` package:
+
+ * :meth:`importlib.abc.SourceLoader.path_mtime` is now deprecated in favour of
+ :meth:`importlib.abc.SourceLoader.path_stats` as bytecode files now store
+ both the modification time and size of the source file the bytecode file was
+ compiled from.
+
+
+
+
+
+Deprecated functions and types of the C API
+-------------------------------------------
+
+The :c:type:`Py_UNICODE` has been deprecated by :pep:`393` and will be
+removed in Python 4. All functions using this type are deprecated:
+
+Unicode functions and methods using :c:type:`Py_UNICODE` and
+:c:type:`Py_UNICODE*` types:
+
+* :c:macro:`PyUnicode_FromUnicode`: use :c:func:`PyUnicode_FromWideChar` or
+ :c:func:`PyUnicode_FromKindAndData`
+* :c:macro:`PyUnicode_AS_UNICODE`, :c:func:`PyUnicode_AsUnicode`,
+ :c:func:`PyUnicode_AsUnicodeAndSize`: use :c:func:`PyUnicode_AsWideCharString`
+* :c:macro:`PyUnicode_AS_DATA`: use :c:macro:`PyUnicode_DATA` with
+ :c:macro:`PyUnicode_READ` and :c:macro:`PyUnicode_WRITE`
+* :c:macro:`PyUnicode_GET_SIZE`, :c:func:`PyUnicode_GetSize`: use
+ :c:macro:`PyUnicode_GET_LENGTH` or :c:func:`PyUnicode_GetLength`
+* :c:macro:`PyUnicode_GET_DATA_SIZE`: use
+ ``PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)`` (only work on ready
+ strings)
+* :c:func:`PyUnicode_AsUnicodeCopy`: use :c:func:`PyUnicode_AsUCS4Copy` or
+ :c:func:`PyUnicode_AsWideCharString`
+* :c:func:`PyUnicode_GetMax`
+
+
+Functions and macros manipulating Py_UNICODE* strings:
+
+* :c:macro:`Py_UNICODE_strlen`: use :c:func:`PyUnicode_GetLength` or
+ :c:macro:`PyUnicode_GET_LENGTH`
+* :c:macro:`Py_UNICODE_strcat`: use :c:func:`PyUnicode_CopyCharacters` or
+ :c:func:`PyUnicode_FromFormat`
+* :c:macro:`Py_UNICODE_strcpy`, :c:macro:`Py_UNICODE_strncpy`,
+ :c:macro:`Py_UNICODE_COPY`: use :c:func:`PyUnicode_CopyCharacters` or
+ :c:func:`PyUnicode_Substring`
+* :c:macro:`Py_UNICODE_strcmp`: use :c:func:`PyUnicode_Compare`
+* :c:macro:`Py_UNICODE_strncmp`: use :c:func:`PyUnicode_Tailmatch`
+* :c:macro:`Py_UNICODE_strchr`, :c:macro:`Py_UNICODE_strrchr`: use
+ :c:func:`PyUnicode_FindChar`
+* :c:macro:`Py_UNICODE_FILL`: use :c:func:`PyUnicode_Fill`
+* :c:macro:`Py_UNICODE_MATCH`
+
+Encoders:
+
+* :c:func:`PyUnicode_Encode`: use :c:func:`PyUnicode_AsEncodedObject`
+* :c:func:`PyUnicode_EncodeUTF7`
+* :c:func:`PyUnicode_EncodeUTF8`: use :c:func:`PyUnicode_AsUTF8` or
+ :c:func:`PyUnicode_AsUTF8String`
+* :c:func:`PyUnicode_EncodeUTF32`
+* :c:func:`PyUnicode_EncodeUTF16`
+* :c:func:`PyUnicode_EncodeUnicodeEscape:` use
+ :c:func:`PyUnicode_AsUnicodeEscapeString`
+* :c:func:`PyUnicode_EncodeRawUnicodeEscape:` use
+ :c:func:`PyUnicode_AsRawUnicodeEscapeString`
+* :c:func:`PyUnicode_EncodeLatin1`: use :c:func:`PyUnicode_AsLatin1String`
+* :c:func:`PyUnicode_EncodeASCII`: use :c:func:`PyUnicode_AsASCIIString`
+* :c:func:`PyUnicode_EncodeCharmap`
+* :c:func:`PyUnicode_TranslateCharmap`
+* :c:func:`PyUnicode_EncodeMBCS`: use :c:func:`PyUnicode_AsMBCSString` or
+ :c:func:`PyUnicode_EncodeCodePage` (with ``CP_ACP`` code_page)
+* :c:func:`PyUnicode_EncodeDecimal`,
+ :c:func:`PyUnicode_TransformDecimalToASCII`
+
+
+Deprecated features
+-------------------
+
+The :mod:`array` module's ``'u'`` format code is now deprecated and will be
+removed in Python 4 together with the rest of the (:c:type:`Py_UNICODE`) API.
+
+
+Porting to Python 3.3
+=====================
+
+This section lists previously described changes and other bugfixes
+that may require changes to your code.
+
+.. _portingpythoncode:
+
+Porting Python code
+-------------------
+
+* Hash randomization is enabled by default. Set the :envvar:`PYTHONHASHSEED`
+ environment variable to ``0`` to disable hash randomization. See also the
+ :meth:`object.__hash__` method.
+
+* :issue:`12326`: On Linux, sys.platform doesn't contain the major version
+ anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending
+ on the Linux version used to build Python. Replace sys.platform == 'linux2'
+ with sys.platform.startswith('linux'), or directly sys.platform == 'linux' if
+ you don't need to support older Python versions.
+
+* :issue:`13847`, :issue:`14180`: :mod:`time` and :mod:`datetime`:
+ :exc:`OverflowError` is now raised instead of :exc:`ValueError` if a
+ timestamp is out of range. :exc:`OSError` is now raised if C functions
+ :c:func:`gmtime` or :c:func:`localtime` failed.
+
+* The default finders used by import now utilize a cache of what is contained
+ within a specific directory. If you create a Python source file or sourceless
+ bytecode file, make sure to call :func:`importlib.invalidate_caches` to clear
+ out the cache for the finders to notice the new file.
+
+* :exc:`ImportError` now uses the full name of the module that was attemped to
+ be imported. Doctests that check ImportErrors' message will need to be
+ updated to use the full name of the module instead of just the tail of the
+ name.
+
+* The *index* argument to :func:`__import__` now defaults to 0 instead of -1
+ and no longer support negative values. It was an oversight when :pep:`328` was
+ implemented that the default value remained -1. If you need to continue to
+ perform a relative import followed by an absolute import, then perform the
+ relative import using an index of 1, followed by another import using an
+ index of 0. It is preferred, though, that you use
+ :func:`importlib.import_module` rather than call :func:`__import__` directly.
+
+* :func:`__import__` no longer allows one to use an index value other than 0
+ for top-level modules. E.g. ``__import__('sys', level=1)`` is now an error.
+
+* Because :attr:`sys.meta_path` and :attr:`sys.path_hooks` now have finders on
+ them by default, you will most likely want to use :meth:`list.insert` instead
+ of :meth:`list.append` to add to those lists.
+
+* Because ``None`` is now inserted into :attr:`sys.path_importer_cache`, if you
+ are clearing out entries in the dictionary of paths that do not have a
+ finder, you will need to remove keys paired with values of ``None`` **and**
+ :class:`imp.NullImporter` to be backwards-compatible. This will lead to extra
+ overhead on older versions of Python that re-insert ``None`` into
+ :attr:`sys.path_importer_cache` where it repesents the use of implicit
+ finders, but semantically it should not change anything.
+
+* :class:`importlib.abc.Finder` no longer specifies a `find_module()` abstract
+ method that must be implemented. If you were relying on subclasses to
+ implement that method, make sure to check for the method's existence first.
+ You will probably want to check for `find_loader()` first, though, in the
+ case of working with :term:`path entry finders <path entry finder>`.
+
+* :mod:`pkgutil` has been converted to use :mod:`importlib` internally. This
+ eliminates many edge cases where the old behaviour of the PEP 302 import
+ emulation failed to match the behaviour of the real import system. The
+ import emulation itself is still present, but is now deprecated. The
+ :func:`pkgutil.iter_importers` and :func:`pkgutil.walk_packages` functions
+ special case the standard import hooks so they are still supported even
+ though they do not provide the non-standard ``iter_modules()`` method.
+
+* A longstanding RFC-compliance bug (:issue:`1079`) in the parsing done by
+ :func:`email.header.decode_header` has been fixed. Code that uses the
+ standard idiom to convert encoded headers into unicode
+ (``str(make_header(decode_header(h))``) will see no change, but code that
+ looks at the individual tuples returned by decode_header will see that
+ whitespace that precedes or follows ``ASCII`` sections is now included in the
+ ``ASCII`` section. Code that builds headers using ``make_header`` should
+ also continue to work without change, since ``make_header`` continues to add
+ whitespace between ``ASCII`` and non-``ASCII`` sections if it is not already
+ present in the input strings.
+
+* :func:`email.utils.formataddr` now does the correct content transfer
+ encoding when passed non-``ASCII`` display names. Any code that depended on
+ the previous buggy behavior that preserved the non-``ASCII`` unicode in the
+ formatted output string will need to be changed (:issue:`1690608`).
+
+* :meth:`poplib.POP3.quit` may now raise protocol errors like all other
+ ``poplib`` methods. Code that assumes ``quit`` does not raise
+ :exc:`poplib.error_proto` errors may need to be changed if errors on ``quit``
+ are encountered by a particular application (:issue:`11291`).
+
+* The ``strict`` argument to :class:`email.parser.Parser`, deprecated since
+ Python 2.4, has finally been removed.
+
+* The deprecated method ``unittest.TestCase.assertSameElements`` has been
+ removed.
+
+* The deprecated variable ``time.accept2dyear`` has been removed.
+
+* The deprecated ``Context._clamp`` attribute has been removed from the
+ :mod:`decimal` module. It was previously replaced by the public attribute
+ :attr:`~decimal.Context.clamp`. (See :issue:`8540`.)
+
+* The undocumented internal helper class ``SSLFakeFile`` has been removed
+ from :mod:`smtplib`, since its functionality has long been provided directly
+ by :meth:`socket.socket.makefile`.
+
+* Passing a negative value to :func:`time.sleep` on Windows now raises an
+ error instead of sleeping forever. It has always raised an error on posix.
+
+* The ``ast.__version__`` constant has been removed. If you need to
+ make decisions affected by the AST version, use :attr:`sys.version_info`
+ to make the decision.
+
+* Code that used to work around the fact that the :mod:`threading` module used
+ factory functions by subclassing the private classes will need to change to
+ subclass the now-public classes.
+
+* The undocumented debugging machinery in the threading module has been
+ removed, simplifying the code. This should have no effect on production
+ code, but is mentioned here in case any application debug frameworks were
+ interacting with it (:issue:`13550`).
+
+
+Porting C code
+--------------
+
+* In the course of changes to the buffer API the undocumented
+ :c:member:`~Py_buffer.smalltable` member of the
+ :c:type:`Py_buffer` structure has been removed and the
+ layout of the :c:type:`PyMemoryViewObject` has changed.
+
+ All extensions relying on the relevant parts in ``memoryobject.h``
+ or ``object.h`` must be rebuilt.
+
+* Due to :ref:`PEP 393 <pep-393>`, the :c:type:`Py_UNICODE` type and all
+ functions using this type are deprecated (but will stay available for
+ at least five years). If you were using low-level Unicode APIs to
+ construct and access unicode objects and you want to benefit of the
+ memory footprint reduction provided by PEP 393, you have to convert
+ your code to the new :doc:`Unicode API <../c-api/unicode>`.
+
+ However, if you only have been using high-level functions such as
+ :c:func:`PyUnicode_Concat()`, :c:func:`PyUnicode_Join` or
+ :c:func:`PyUnicode_FromFormat()`, your code will automatically take
+ advantage of the new unicode representations.
+
+* :c:func:`PyImport_GetMagicNumber` now returns -1 upon failure.
+
+* As a negative value for the *level* argument to :func:`__import__` is no
+ longer valid, the same now holds for :c:func:`PyImport_ImportModuleLevel`.
+ This also means that the value of *level* used by
+ :c:func:`PyImport_ImportModuleEx` is now 0 instead of -1.
+
+
+Building C extensions
+---------------------
+
+* The range of possible file names for C extensions has been narrowed.
+ Very rarely used spellings have been suppressed: under POSIX, files
+ named ``xxxmodule.so``, ``xxxmodule.abi3.so`` and
+ ``xxxmodule.cpython-*.so`` are no longer recognized as implementing
+ the ``xxx`` module. If you had been generating such files, you have
+ to switch to the other spellings (i.e., remove the ``module`` string
+ from the file names).
+
+ (implemented in :issue:`14040`.)
+
+
+Command Line Switch Changes
+---------------------------
+
+* The -Q command-line flag and related artifacts have been removed. Code
+ checking sys.flags.division_warning will need updating.
+
+ (:issue:`10998`, contributed by Éric Araujo.)
+
+* When :program:`python` is started with :option:`-S`, ``import site``
+ will no longer add site-specific paths to the module search paths. In
+ previous versions, it did.
+
+ (:issue:`11591`, contributed by Carl Meyer with editions by Éric Araujo.)
diff --git a/Doc/whatsnew/changelog.rst b/Doc/whatsnew/changelog.rst
new file mode 100644
index 0000000..57e2dab
--- /dev/null
+++ b/Doc/whatsnew/changelog.rst
@@ -0,0 +1,6 @@
++++++++++
+Changelog
++++++++++
+
+.. miscnews:: ../../Misc/NEWS
+
diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst
index 8220bd2..bc1206b 100644
--- a/Doc/whatsnew/index.rst
+++ b/Doc/whatsnew/index.rst
@@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release.
.. toctree::
:maxdepth: 2
+ 3.3.rst
3.2.rst
3.1.rst
3.0.rst
@@ -22,3 +23,11 @@ anyone wishing to stay up-to-date after a new release.
2.2.rst
2.1.rst
2.0.rst
+
+The "Changelog" is a HTML version of the file :source:`Misc/NEWS` which
+contains *all* nontrivial changes to Python for the current version.
+
+.. toctree::
+ :maxdepth: 2
+
+ changelog.rst
diff --git a/Grammar/Grammar b/Grammar/Grammar
index cea68de..d7aaffd 100644
--- a/Grammar/Grammar
+++ b/Grammar/Grammar
@@ -13,7 +13,7 @@
# Start symbols for the grammar:
# single_input is a single interactive statement;
# file_input is a module or sequence of commands read from an input file;
-# eval_input is the input for the eval() and input() functions.
+# eval_input is the input for the eval() functions.
# NB: compound_stmt in single_input is followed by extra NEWLINE!
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
file_input: (NEWLINE | stmt)* ENDMARKER
@@ -129,4 +129,5 @@ comp_if: 'if' test_nocond [comp_iter]
# not used in grammar, but may appear in "node" passed from Parser to Compiler
encoding_decl: NAME
-yield_expr: 'yield' [testlist]
+yield_expr: 'yield' [yield_arg]
+yield_arg: 'from' test | testlist
diff --git a/Include/Python-ast.h b/Include/Python-ast.h
index 0ad788b..7ad6cb3 100644
--- a/Include/Python-ast.h
+++ b/Include/Python-ast.h
@@ -36,6 +36,8 @@ typedef struct _keyword *keyword_ty;
typedef struct _alias *alias_ty;
+typedef struct _withitem *withitem_ty;
+
enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3,
Suite_kind=4};
@@ -64,10 +66,9 @@ struct _mod {
enum _stmt_kind {FunctionDef_kind=1, ClassDef_kind=2, Return_kind=3,
Delete_kind=4, Assign_kind=5, AugAssign_kind=6, For_kind=7,
While_kind=8, If_kind=9, With_kind=10, Raise_kind=11,
- TryExcept_kind=12, TryFinally_kind=13, Assert_kind=14,
- Import_kind=15, ImportFrom_kind=16, Global_kind=17,
- Nonlocal_kind=18, Expr_kind=19, Pass_kind=20, Break_kind=21,
- Continue_kind=22};
+ Try_kind=12, Assert_kind=13, Import_kind=14,
+ ImportFrom_kind=15, Global_kind=16, Nonlocal_kind=17,
+ Expr_kind=18, Pass_kind=19, Break_kind=20, Continue_kind=21};
struct _stmt {
enum _stmt_kind kind;
union {
@@ -128,8 +129,7 @@ struct _stmt {
} If;
struct {
- expr_ty context_expr;
- expr_ty optional_vars;
+ asdl_seq *items;
asdl_seq *body;
} With;
@@ -142,12 +142,8 @@ struct _stmt {
asdl_seq *body;
asdl_seq *handlers;
asdl_seq *orelse;
- } TryExcept;
-
- struct {
- asdl_seq *body;
asdl_seq *finalbody;
- } TryFinally;
+ } Try;
struct {
expr_ty test;
@@ -184,10 +180,10 @@ struct _stmt {
enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4,
IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8,
SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11,
- Yield_kind=12, Compare_kind=13, Call_kind=14, Num_kind=15,
- Str_kind=16, Bytes_kind=17, Ellipsis_kind=18,
- Attribute_kind=19, Subscript_kind=20, Starred_kind=21,
- Name_kind=22, List_kind=23, Tuple_kind=24};
+ Yield_kind=12, YieldFrom_kind=13, Compare_kind=14,
+ Call_kind=15, Num_kind=16, Str_kind=17, Bytes_kind=18,
+ Ellipsis_kind=19, Attribute_kind=20, Subscript_kind=21,
+ Starred_kind=22, Name_kind=23, List_kind=24, Tuple_kind=25};
struct _expr {
enum _expr_kind kind;
union {
@@ -253,6 +249,10 @@ struct _expr {
} Yield;
struct {
+ expr_ty value;
+ } YieldFrom;
+
+ struct {
expr_ty left;
asdl_int_seq *ops;
asdl_seq *comparators;
@@ -275,7 +275,7 @@ struct _expr {
} Str;
struct {
- string s;
+ bytes s;
} Bytes;
struct {
@@ -383,6 +383,11 @@ struct _alias {
identifier asname;
};
+struct _withitem {
+ expr_ty context_expr;
+ expr_ty optional_vars;
+};
+
#define Module(a0, a1) _Py_Module(a0, a1)
mod_ty _Py_Module(asdl_seq * body, PyArena *arena);
@@ -421,18 +426,16 @@ stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno,
#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5)
stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno,
int col_offset, PyArena *arena);
-#define With(a0, a1, a2, a3, a4, a5) _Py_With(a0, a1, a2, a3, a4, a5)
-stmt_ty _Py_With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body,
- int lineno, int col_offset, PyArena *arena);
+#define With(a0, a1, a2, a3, a4) _Py_With(a0, a1, a2, a3, a4)
+stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
+ PyArena *arena);
#define Raise(a0, a1, a2, a3, a4) _Py_Raise(a0, a1, a2, a3, a4)
stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset,
PyArena *arena);
-#define TryExcept(a0, a1, a2, a3, a4, a5) _Py_TryExcept(a0, a1, a2, a3, a4, a5)
-stmt_ty _Py_TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse,
- int lineno, int col_offset, PyArena *arena);
-#define TryFinally(a0, a1, a2, a3, a4) _Py_TryFinally(a0, a1, a2, a3, a4)
-stmt_ty _Py_TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int
- col_offset, PyArena *arena);
+#define Try(a0, a1, a2, a3, a4, a5, a6) _Py_Try(a0, a1, a2, a3, a4, a5, a6)
+stmt_ty _Py_Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse,
+ asdl_seq * finalbody, int lineno, int col_offset, PyArena
+ *arena);
#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4)
stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset,
PyArena *arena);
@@ -490,6 +493,9 @@ expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int
col_offset, PyArena *arena);
#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3)
expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena);
+#define YieldFrom(a0, a1, a2, a3) _Py_YieldFrom(a0, a1, a2, a3)
+expr_ty _Py_YieldFrom(expr_ty value, int lineno, int col_offset, PyArena
+ *arena);
#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5)
expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators,
int lineno, int col_offset, PyArena *arena);
@@ -502,7 +508,7 @@ expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena);
#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3)
expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena);
#define Bytes(a0, a1, a2, a3) _Py_Bytes(a0, a1, a2, a3)
-expr_ty _Py_Bytes(string s, int lineno, int col_offset, PyArena *arena);
+expr_ty _Py_Bytes(bytes s, int lineno, int col_offset, PyArena *arena);
#define Ellipsis(a0, a1, a2) _Py_Ellipsis(a0, a1, a2)
expr_ty _Py_Ellipsis(int lineno, int col_offset, PyArena *arena);
#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5)
@@ -547,6 +553,9 @@ arg_ty _Py_arg(identifier arg, expr_ty annotation, PyArena *arena);
keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena);
#define alias(a0, a1, a2) _Py_alias(a0, a1, a2)
alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena);
+#define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2)
+withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena
+ *arena);
PyObject* PyAST_mod2obj(mod_ty t);
mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);
diff --git a/Include/Python.h b/Include/Python.h
index d6e47c2..a78a721 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -48,6 +48,7 @@
#include <assert.h>
#include "pyport.h"
+#include "pymacro.h"
#include "pyatomic.h"
@@ -100,6 +101,7 @@
#include "warnings.h"
#include "weakrefobject.h"
#include "structseq.h"
+#include "namespaceobject.h"
#include "codecs.h"
#include "pyerrors.h"
@@ -125,43 +127,6 @@
#include "pystrcmp.h"
#include "dtoa.h"
#include "fileutils.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* _Py_Mangle is defined in compile.c */
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
-#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
-
#include "pyfpe.h"
-/* These definitions must match corresponding definitions in graminit.h.
- There's code in compile.c that checks that they are the same. */
-#define Py_single_input 256
-#define Py_file_input 257
-#define Py_eval_input 258
-
-#ifdef HAVE_PTH
-/* GNU pth user-space thread support */
-#include <pth.h>
-#endif
-
-/* Define macros for inline documentation. */
-#define PyDoc_VAR(name) static char name[]
-#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
-#ifdef WITH_DOC_STRINGS
-#define PyDoc_STR(str) str
-#else
-#define PyDoc_STR(str) ""
-#endif
-
#endif /* !Py_PYTHON_H */
diff --git a/Include/abstract.h b/Include/abstract.h
index 0fe0956..44b5af7 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -7,6 +7,7 @@ extern "C" {
#ifdef PY_SSIZE_T_CLEAN
#define PyObject_CallFunction _PyObject_CallFunction_SizeT
#define PyObject_CallMethod _PyObject_CallMethod_SizeT
+#define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT
#endif
/* Abstract Object Interface (many thanks to Jim Fulton) */
@@ -307,11 +308,22 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
Python expression: o.method(args).
*/
+ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o, _Py_Identifier *method,
+ char *format, ...);
+
+ /*
+ Like PyObject_CallMethod, but expect a _Py_Identifier* as the
+ method name.
+ */
+
PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable,
char *format, ...);
PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o,
char *name,
char *format, ...);
+ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o,
+ _Py_Identifier *name,
+ char *format, ...);
PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable,
...);
@@ -327,6 +339,10 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o,
PyObject *method, ...);
+ PyAPI_FUNC(PyObject *) _PyObject_CallMethodObjIdArgs(PyObject *o,
+ struct _Py_Identifier *method,
+ ...);
+
/*
Call the method named m of object o with a variable number of
@@ -519,11 +535,12 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
+ /* Implementation in memoryobject.c */
PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view,
- Py_ssize_t len, char fort);
+ Py_ssize_t len, char order);
PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf,
- Py_ssize_t len, char fort);
+ Py_ssize_t len, char order);
/* Copy len bytes of data from the contiguous chunk of memory
@@ -547,7 +564,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
/* Copy the data from the src buffer to the buffer of destination
*/
- PyAPI_FUNC(int) PyBuffer_IsContiguous(Py_buffer *view, char fort);
+ PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort);
PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims,
@@ -761,21 +778,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc);
/*
- Returns the Integral instance converted to an int. The
- instance is expected to be int or long or have an __int__
- method. Steals integral's reference. error_format will be
- used to create the TypeError if integral isn't actually an
- Integral instance. error_format should be a format string
- that can accept a char* naming integral's type.
- */
-
-#ifndef Py_LIMITED_API
- PyAPI_FUNC(PyObject *) _PyNumber_ConvertIntegralToInt(
- PyObject *integral,
- const char* error_format);
-#endif
-
- /*
Returns the object converted to Py_ssize_t by going through
PyNumber_Index first. If an overflow error occurs while
converting the int-or-long to Py_ssize_t, then the second argument
@@ -1014,7 +1016,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m);
/*
- Returns the sequence, o, as a tuple, unless it's already a
+ Returns the sequence, o, as a list, unless it's already a
tuple or list. Use PySequence_Fast_GET_ITEM to access the
members of this list, and PySequence_Fast_GET_SIZE to get its length.
diff --git a/Include/asdl.h b/Include/asdl.h
index 9bb0697..6bf618f 100644
--- a/Include/asdl.h
+++ b/Include/asdl.h
@@ -3,6 +3,7 @@
typedef PyObject * identifier;
typedef PyObject * string;
+typedef PyObject * bytes;
typedef PyObject * object;
/* It would be nice if the code generated by asdl_c.py was completely
@@ -14,17 +15,17 @@ typedef PyObject * object;
/* XXX A sequence should be typed so that its use can be typechecked. */
typedef struct {
- int size;
+ Py_ssize_t size;
void *elements[1];
} asdl_seq;
typedef struct {
- int size;
+ Py_ssize_t size;
int elements[1];
} asdl_int_seq;
-asdl_seq *asdl_seq_new(int size, PyArena *arena);
-asdl_int_seq *asdl_int_seq_new(int size, PyArena *arena);
+asdl_seq *asdl_seq_new(Py_ssize_t size, PyArena *arena);
+asdl_int_seq *asdl_int_seq_new(Py_ssize_t size, PyArena *arena);
#define asdl_seq_GET(S, I) (S)->elements[(I)]
#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
diff --git a/Include/ast.h b/Include/ast.h
index a015336..055e8dc 100644
--- a/Include/ast.h
+++ b/Include/ast.h
@@ -4,6 +4,7 @@
extern "C" {
#endif
+PyAPI_FUNC(int) PyAST_Validate(mod_ty);
PyAPI_FUNC(mod_ty) PyAST_FromNode(
const node *n,
PyCompilerFlags *flags,
diff --git a/Include/bytesobject.h b/Include/bytesobject.h
index e1af89f..d7c7ffd 100644
--- a/Include/bytesobject.h
+++ b/Include/bytesobject.h
@@ -62,8 +62,6 @@ PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *);
PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *);
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t);
-PyAPI_FUNC(PyObject *) _PyBytes_FormatLong(PyObject*, int, int,
- int, char**, int*);
#endif
PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t,
const char *, Py_ssize_t,
diff --git a/Include/code.h b/Include/code.h
index e773b6a..7c7e5bf 100644
--- a/Include/code.h
+++ b/Include/code.h
@@ -22,6 +22,7 @@ typedef struct {
PyObject *co_freevars; /* tuple of strings (free variable names) */
PyObject *co_cellvars; /* tuple of strings (cell variable names) */
/* The rest doesn't count for hash or comparisons */
+ unsigned char *co_cell2arg; /* Maps cell vars which are arguments. */
PyObject *co_filename; /* unicode (where it was loaded from) */
PyObject *co_name; /* unicode (name, for reference) */
int co_firstlineno; /* first source line number */
@@ -57,6 +58,11 @@ typedef struct {
#define CO_FUTURE_BARRY_AS_BDFL 0x40000
+/* This value is found in the co_cell2arg array when the associated cell
+ variable does not correspond to an argument. The maximum number of
+ arguments is 255 (indexed up to 254), so 255 work as a special flag.*/
+#define CO_CELL_NOT_AN_ARG 255
+
/* This should be defined if a future statement modifies the syntax.
For example, when a keyword is added.
*/
diff --git a/Include/codecs.h b/Include/codecs.h
index dff09e7..0d9e9b4 100644
--- a/Include/codecs.h
+++ b/Include/codecs.h
@@ -174,6 +174,8 @@ PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc);
/* replace the unicode encode error with backslash escapes (\x, \u and \U) */
PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc);
+PyAPI_DATA(const char *) Py_hexdigits;
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/compile.h b/Include/compile.h
index bc53b39..ac2636d 100644
--- a/Include/compile.h
+++ b/Include/compile.h
@@ -1,7 +1,7 @@
-#ifndef Py_LIMITED_API
#ifndef Py_COMPILE_H
#define Py_COMPILE_H
+#ifndef Py_LIMITED_API
#include "code.h"
#ifdef __cplusplus
@@ -38,9 +38,19 @@ PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx(
PyArena *arena);
PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *);
+/* _Py_Mangle is defined in compile.c */
+PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
#ifdef __cplusplus
}
#endif
-#endif /* !Py_COMPILE_H */
+
#endif /* !Py_LIMITED_API */
+
+/* These definitions must match corresponding definitions in graminit.h.
+ There's code in compile.c that checks that they are the same. */
+#define Py_single_input 256
+#define Py_file_input 257
+#define Py_eval_input 258
+
+#endif /* !Py_COMPILE_H */
diff --git a/Include/complexobject.h b/Include/complexobject.h
index c379b08..1934f3b 100644
--- a/Include/complexobject.h
+++ b/Include/complexobject.h
@@ -63,9 +63,12 @@ PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op);
/* Format the object based on the format_spec, as defined in PEP 3101
(Advanced String Formatting). */
#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) _PyComplex_FormatAdvanced(PyObject *obj,
- Py_UNICODE *format_spec,
- Py_ssize_t format_spec_len);
+PyAPI_FUNC(int) _PyComplex_FormatAdvancedWriter(
+ _PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start,
+ Py_ssize_t end);
#endif
#ifdef __cplusplus
diff --git a/Include/datetime.h b/Include/datetime.h
index db57a18..41e3bcf 100644
--- a/Include/datetime.h
+++ b/Include/datetime.h
@@ -135,6 +135,12 @@ typedef struct
(((PyDateTime_Time*)o)->data[4] << 8) | \
((PyDateTime_Time*)o)->data[5])
+/* Apply for time delta instances */
+#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days)
+#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds)
+#define PyDateTime_DELTA_GET_MICROSECONDS(o) \
+ (((PyDateTime_Delta*)o)->microseconds)
+
/* Define structure for C API. */
typedef struct {
diff --git a/Include/descrobject.h b/Include/descrobject.h
index 646b3cc..e2ba97f 100644
--- a/Include/descrobject.h
+++ b/Include/descrobject.h
@@ -42,6 +42,7 @@ typedef struct {
PyObject_HEAD
PyTypeObject *d_type;
PyObject *d_name;
+ PyObject *d_qualname;
} PyDescrObject;
#define PyDescr_COMMON PyDescrObject d_common
diff --git a/Include/dictobject.h b/Include/dictobject.h
index b026785..d89aac8 100644
--- a/Include/dictobject.h
+++ b/Include/dictobject.h
@@ -13,78 +13,20 @@ extern "C" {
tuning dictionaries, and several ideas for possible optimizations.
*/
-/*
-There are three kinds of slots in the table:
-
-1. Unused. me_key == me_value == NULL
- Does not hold an active (key, value) pair now and never did. Unused can
- transition to Active upon key insertion. This is the only case in which
- me_key is NULL, and is each slot's initial state.
-
-2. Active. me_key != NULL and me_key != dummy and me_value != NULL
- Holds an active (key, value) pair. Active can transition to Dummy upon
- key deletion. This is the only case in which me_value != NULL.
-
-3. Dummy. me_key == dummy and me_value == NULL
- Previously held an active (key, value) pair, but that was deleted and an
- active pair has not yet overwritten the slot. Dummy can transition to
- Active upon key insertion. Dummy slots cannot be made Unused again
- (cannot have me_key set to NULL), else the probe sequence in case of
- collision would have no way to know they were once active.
-
-Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
-hold a search finger. The me_hash field of Unused or Dummy slots has no
-meaning otherwise.
-*/
-
-/* PyDict_MINSIZE is the minimum size of a dictionary. This many slots are
- * allocated directly in the dict object (in the ma_smalltable member).
- * It must be a power of 2, and at least 4. 8 allows dicts with no more
- * than 5 active entries to live in ma_smalltable (and so avoid an
- * additional malloc); instrumentation suggested this suffices for the
- * majority of dicts (consisting mostly of usually-small instance dicts and
- * usually-small dicts created to pass keyword arguments).
- */
#ifndef Py_LIMITED_API
-#define PyDict_MINSIZE 8
+typedef struct _dictkeysobject PyDictKeysObject;
+
+/* The ma_values pointer is NULL for a combined table
+ * or points to an array of PyObject* for a split table
+ */
typedef struct {
- /* Cached hash code of me_key. */
- Py_hash_t me_hash;
- PyObject *me_key;
- PyObject *me_value;
-} PyDictEntry;
-
-/*
-To ensure the lookup algorithm terminates, there must be at least one Unused
-slot (NULL key) in the table.
-The value ma_fill is the number of non-NULL keys (sum of Active and Dummy);
-ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL
-values == the number of Active items).
-To avoid slowing down lookups on a near-full table, we resize the table when
-it's two-thirds full.
-*/
-typedef struct _dictobject PyDictObject;
-struct _dictobject {
PyObject_HEAD
- Py_ssize_t ma_fill; /* # Active + # Dummy */
- Py_ssize_t ma_used; /* # Active */
-
- /* The table contains ma_mask + 1 slots, and that's a power of 2.
- * We store the mask instead of the size because the mask is more
- * frequently needed.
- */
- Py_ssize_t ma_mask;
-
- /* ma_table points to ma_smalltable for small tables, else to
- * additional malloc'ed memory. ma_table is never NULL! This rule
- * saves repeated runtime null-tests in the workhorse getitem and
- * setitem calls.
- */
- PyDictEntry *ma_table;
- PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, Py_hash_t hash);
- PyDictEntry ma_smalltable[PyDict_MINSIZE];
-};
+ Py_ssize_t ma_used;
+ PyDictKeysObject *ma_keys;
+ PyObject **ma_values;
+} PyDictObject;
+
#endif /* Py_LIMITED_API */
PyAPI_DATA(PyTypeObject) PyDict_Type;
@@ -109,12 +51,16 @@ PyAPI_DATA(PyTypeObject) PyDictValues_Type;
PyAPI_FUNC(PyObject *) PyDict_New(void);
PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key);
PyAPI_FUNC(PyObject *) PyDict_GetItemWithError(PyObject *mp, PyObject *key);
+PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp,
+ struct _Py_Identifier *key);
PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item);
PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key);
PyAPI_FUNC(void) PyDict_Clear(PyObject *mp);
PyAPI_FUNC(int) PyDict_Next(
PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value);
#ifndef Py_LIMITED_API
+PyDictKeysObject *_PyDict_NewKeysForClass(void);
+PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *);
PyAPI_FUNC(int) _PyDict_Next(
PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash);
#endif
@@ -129,6 +75,10 @@ PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash);
PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp);
PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp);
+Py_ssize_t _PyDict_KeysSize(PyDictKeysObject *keys);
+#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL)
+
+PyAPI_FUNC(int) PyDict_ClearFreeList(void);
#endif
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
@@ -153,9 +103,17 @@ PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d,
int override);
PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key);
+PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key);
PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item);
+PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item);
PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key);
+#ifndef Py_LIMITED_API
+int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value);
+PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *);
+PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/dtoa.h b/Include/dtoa.h
index 819bd0f..9bfb625 100644
--- a/Include/dtoa.h
+++ b/Include/dtoa.h
@@ -8,6 +8,8 @@ PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr);
PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits,
int *decpt, int *sign, char **rve);
PyAPI_FUNC(void) _Py_dg_freedtoa(char *s);
+PyAPI_FUNC(double) _Py_dg_stdnan(int sign);
+PyAPI_FUNC(double) _Py_dg_infinity(int sign);
#ifdef __cplusplus
diff --git a/Include/errcode.h b/Include/errcode.h
index 6bb3cc1..5946686 100644
--- a/Include/errcode.h
+++ b/Include/errcode.h
@@ -30,6 +30,7 @@ extern "C" {
#define E_EOLS 24 /* EOL in single-quoted string */
#define E_LINECONT 25 /* Unexpected characters after a line continuation */
#define E_IDENTIFIER 26 /* Invalid characters in identifier */
+#define E_BADSINGLE 27 /* Ill-formed single statement input */
#ifdef __cplusplus
}
diff --git a/Include/fileutils.h b/Include/fileutils.h
index 2fade9b..7c18cf2 100644
--- a/Include/fileutils.h
+++ b/Include/fileutils.h
@@ -5,6 +5,8 @@
extern "C" {
#endif
+PyAPI_FUNC(PyObject *) _Py_device_encoding(int);
+
PyAPI_FUNC(wchar_t *) _Py_char2wchar(
const char *arg,
size_t *size);
diff --git a/Include/floatobject.h b/Include/floatobject.h
index 90f0a45..e240fdb 100644
--- a/Include/floatobject.h
+++ b/Include/floatobject.h
@@ -27,12 +27,12 @@ PyAPI_DATA(PyTypeObject) PyFloat_Type;
#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN)
#endif
-#define Py_RETURN_INF(sign) do \
- if (copysign(1., sign) == 1.) { \
- return PyFloat_FromDouble(Py_HUGE_VAL); \
- } else { \
- return PyFloat_FromDouble(-Py_HUGE_VAL); \
- } while(0)
+#define Py_RETURN_INF(sign) do \
+ if (copysign(1., sign) == 1.) { \
+ return PyFloat_FromDouble(Py_HUGE_VAL); \
+ } else { \
+ return PyFloat_FromDouble(-Py_HUGE_VAL); \
+ } while(0)
PyAPI_FUNC(double) PyFloat_GetMax(void);
PyAPI_FUNC(double) PyFloat_GetMin(void);
@@ -110,11 +110,16 @@ PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le);
/* free list api */
PyAPI_FUNC(int) PyFloat_ClearFreeList(void);
+PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out);
+
/* Format the object based on the format_spec, as defined in PEP 3101
(Advanced String Formatting). */
-PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj,
- Py_UNICODE *format_spec,
- Py_ssize_t format_spec_len);
+PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter(
+ _PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start,
+ Py_ssize_t end);
#endif /* Py_LIMITED_API */
#ifdef __cplusplus
diff --git a/Include/frameobject.h b/Include/frameobject.h
index 1fb64bb..ac2f790 100644
--- a/Include/frameobject.h
+++ b/Include/frameobject.h
@@ -9,45 +9,45 @@ extern "C" {
#endif
typedef struct {
- int b_type; /* what kind of block this is */
- int b_handler; /* where to jump to find handler */
- int b_level; /* value stack level to pop to */
+ int b_type; /* what kind of block this is */
+ int b_handler; /* where to jump to find handler */
+ int b_level; /* value stack level to pop to */
} PyTryBlock;
typedef struct _frame {
PyObject_VAR_HEAD
- struct _frame *f_back; /* previous frame, or NULL */
- PyCodeObject *f_code; /* code segment */
- PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
- PyObject *f_globals; /* global symbol table (PyDictObject) */
- PyObject *f_locals; /* local symbol table (any mapping) */
- PyObject **f_valuestack; /* points after the last local */
+ struct _frame *f_back; /* previous frame, or NULL */
+ PyCodeObject *f_code; /* code segment */
+ PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
+ PyObject *f_globals; /* global symbol table (PyDictObject) */
+ PyObject *f_locals; /* local symbol table (any mapping) */
+ PyObject **f_valuestack; /* points after the last local */
/* Next free slot in f_valuestack. Frame creation sets to f_valuestack.
Frame evaluation usually NULLs it, but a frame that yields sets it
to the current stack top. */
PyObject **f_stacktop;
- PyObject *f_trace; /* Trace function */
-
- /* In a generator, we need to be able to swap between the exception
- state inside the generator and the exception state of the calling
- frame (which shouldn't be impacted when the generator "yields"
- from an except handler).
- These three fields exist exactly for that, and are unused for
- non-generator frames. See the SAVE_EXC_STATE and SWAP_EXC_STATE
- macros in ceval.c for details of their use. */
+ PyObject *f_trace; /* Trace function */
+
+ /* In a generator, we need to be able to swap between the exception
+ state inside the generator and the exception state of the calling
+ frame (which shouldn't be impacted when the generator "yields"
+ from an except handler).
+ These three fields exist exactly for that, and are unused for
+ non-generator frames. See the SAVE_EXC_STATE and SWAP_EXC_STATE
+ macros in ceval.c for details of their use. */
PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
PyThreadState *f_tstate;
- int f_lasti; /* Last instruction if called */
+ int f_lasti; /* Last instruction if called */
/* Call PyFrame_GetLineNumber() instead of reading this field
directly. As of 2.3 f_lineno is only valid when tracing is
active (i.e. when f_trace is set). At other times we use
PyCode_Addr2Line to calculate the line from the current
bytecode index. */
- int f_lineno; /* Current line number */
- int f_iblock; /* index in f_blockstack */
+ int f_lineno; /* Current line number */
+ int f_iblock; /* index in f_blockstack */
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
- PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
+ PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
} PyFrameObject;
@@ -79,6 +79,8 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
+PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
+
/* Return the line of code the frame is currently executing. */
PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
diff --git a/Include/funcobject.h b/Include/funcobject.h
index 521d87b..cc1426c 100644
--- a/Include/funcobject.h
+++ b/Include/funcobject.h
@@ -31,6 +31,7 @@ typedef struct {
PyObject *func_weakreflist; /* List of weak references */
PyObject *func_module; /* The __module__ attribute, can be anything */
PyObject *func_annotations; /* Annotations, a dict or NULL */
+ PyObject *func_qualname; /* The qualified name */
/* Invariant:
* func_closure contains the bindings for func_code->co_freevars, so
@@ -44,6 +45,7 @@ PyAPI_DATA(PyTypeObject) PyFunction_Type;
#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type)
PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *);
+PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *);
PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *);
PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *);
PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *);
diff --git a/Include/genobject.h b/Include/genobject.h
index d29fb1e..ed451ba 100644
--- a/Include/genobject.h
+++ b/Include/genobject.h
@@ -11,20 +11,20 @@ extern "C" {
struct _frame; /* Avoid including frameobject.h */
typedef struct {
- PyObject_HEAD
- /* The gi_ prefix is intended to remind of generator-iterator. */
+ PyObject_HEAD
+ /* The gi_ prefix is intended to remind of generator-iterator. */
- /* Note: gi_frame can be NULL if the generator is "finished" */
- struct _frame *gi_frame;
+ /* Note: gi_frame can be NULL if the generator is "finished" */
+ struct _frame *gi_frame;
- /* True if generator is being executed. */
- int gi_running;
-
- /* The code object backing the generator */
- PyObject *gi_code;
+ /* True if generator is being executed. */
+ char gi_running;
- /* List of weak reference. */
- PyObject *gi_weakreflist;
+ /* The code object backing the generator */
+ PyObject *gi_code;
+
+ /* List of weak reference. */
+ PyObject *gi_weakreflist;
} PyGenObject;
PyAPI_DATA(PyTypeObject) PyGen_Type;
@@ -34,6 +34,8 @@ PyAPI_DATA(PyTypeObject) PyGen_Type;
PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *);
PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *);
+PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **);
+PyObject *_PyGen_Send(PyGenObject *, PyObject *);
#ifdef __cplusplus
}
diff --git a/Include/graminit.h b/Include/graminit.h
index e0e27f9..3ec949a 100644
--- a/Include/graminit.h
+++ b/Include/graminit.h
@@ -81,3 +81,4 @@
#define comp_if 334
#define encoding_decl 335
#define yield_expr 336
+#define yield_arg 337
diff --git a/Include/import.h b/Include/import.h
index 400e97c..fdc2733 100644
--- a/Include/import.h
+++ b/Include/import.h
@@ -7,6 +7,9 @@
extern "C" {
#endif
+PyAPI_FUNC(void) _PyImportZip_Init(void);
+
+PyMODINIT_FUNC PyInit_imp(void);
PyAPI_FUNC(long) PyImport_GetMagicNumber(void);
PyAPI_FUNC(const char *) PyImport_GetMagicTag(void);
PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule(
@@ -24,7 +27,16 @@ PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames(
char *pathname, /* decoded from the filesystem encoding */
char *cpathname /* decoded from the filesystem encoding */
);
+PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject(
+ PyObject *name,
+ PyObject *co,
+ PyObject *pathname,
+ PyObject *cpathname
+ );
PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void);
+PyAPI_FUNC(PyObject *) PyImport_AddModuleObject(
+ PyObject *name
+ );
PyAPI_FUNC(PyObject *) PyImport_AddModule(
const char *name /* UTF-8 encoded string */
);
@@ -35,7 +47,14 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock(
const char *name /* UTF-8 encoded string */
);
PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
- char *name, /* UTF-8 encoded string */
+ const char *name, /* UTF-8 encoded string */
+ PyObject *globals,
+ PyObject *locals,
+ PyObject *fromlist,
+ int level
+ );
+PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject(
+ PyObject *name,
PyObject *globals,
PyObject *locals,
PyObject *fromlist,
@@ -43,12 +62,15 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
);
#define PyImport_ImportModuleEx(n, g, l, f) \
- PyImport_ImportModuleLevel(n, g, l, f, -1)
+ PyImport_ImportModuleLevel(n, g, l, f, 0)
PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path);
PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name);
PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m);
PyAPI_FUNC(void) PyImport_Cleanup(void);
+PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject(
+ PyObject *name
+ );
PyAPI_FUNC(int) PyImport_ImportFrozenModule(
char *name /* UTF-8 encoded string */
);
@@ -65,17 +87,17 @@ PyAPI_FUNC(int) _PyImport_ReleaseLock(void);
PyAPI_FUNC(void) _PyImport_ReInitLock(void);
PyAPI_FUNC(PyObject *)_PyImport_FindBuiltin(
- char *name /* UTF-8 encoded string */
+ const char *name /* UTF-8 encoded string */
);
-PyAPI_FUNC(PyObject *)_PyImport_FindExtensionUnicode(char *, PyObject *);
+PyAPI_FUNC(PyObject *)_PyImport_FindExtensionObject(PyObject *, PyObject *);
PyAPI_FUNC(int)_PyImport_FixupBuiltin(
PyObject *mod,
char *name /* UTF-8 encoded string */
);
-PyAPI_FUNC(int)_PyImport_FixupExtensionUnicode(PyObject*, char *, PyObject *);
+PyAPI_FUNC(int)_PyImport_FixupExtensionObject(PyObject*, PyObject *, PyObject *);
struct _inittab {
- char *name;
+ char *name; /* ASCII encoded string */
PyObject* (*initfunc)(void);
};
PyAPI_DATA(struct _inittab *) PyImport_Inittab;
diff --git a/Include/intrcheck.h b/Include/intrcheck.h
index 3b67ed0..f53fee1 100644
--- a/Include/intrcheck.h
+++ b/Include/intrcheck.h
@@ -8,6 +8,12 @@ extern "C" {
PyAPI_FUNC(int) PyOS_InterruptOccurred(void);
PyAPI_FUNC(void) PyOS_InitInterrupts(void);
PyAPI_FUNC(void) PyOS_AfterFork(void);
+PyAPI_FUNC(int) _PyOS_IsMainThread(void);
+
+#ifdef MS_WINDOWS
+/* windows.h is not included by Python.h so use void* instead of HANDLE */
+PyAPI_FUNC(void*) _PyOS_SigintEvent(void);
+#endif
#ifdef __cplusplus
}
diff --git a/Include/listobject.h b/Include/listobject.h
index 949b1a3..dc62aee 100644
--- a/Include/listobject.h
+++ b/Include/listobject.h
@@ -62,6 +62,9 @@ PyAPI_FUNC(int) PyList_Reverse(PyObject *);
PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *);
+
+PyAPI_FUNC(int) PyList_ClearFreeList(void);
+PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
#endif
/* Macro, trading safety for speed */
diff --git a/Include/longintrepr.h b/Include/longintrepr.h
index b94f7b2..3a45bad 100644
--- a/Include/longintrepr.h
+++ b/Include/longintrepr.h
@@ -6,7 +6,7 @@ extern "C" {
#endif
-/* This is published for the benefit of "friend" marshal.c only. */
+/* This is published for the benefit of "friends" marshal.c and _decimal.c. */
/* Parameters of the long integer representation. There are two different
sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit
diff --git a/Include/longobject.h b/Include/longobject.h
index c09565a..d741f1b 100644
--- a/Include/longobject.h
+++ b/Include/longobject.h
@@ -12,7 +12,7 @@ typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */
PyAPI_DATA(PyTypeObject) PyLong_Type;
#define PyLong_Check(op) \
- PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS)
+ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS)
#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type)
PyAPI_FUNC(PyObject *) PyLong_FromLong(long);
@@ -80,6 +80,7 @@ PyAPI_FUNC(PY_LONG_LONG) PyLong_AsLongLongAndOverflow(PyObject *, int *);
PyAPI_FUNC(PyObject *) PyLong_FromString(char *, char **, int);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int);
+PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base);
#endif
#ifndef Py_LIMITED_API
@@ -121,8 +122,8 @@ PyAPI_FUNC(PyObject *) _PyLong_DivmodNear(PyObject *, PyObject *);
enough memory to create the Python long.
*/
PyAPI_FUNC(PyObject *) _PyLong_FromByteArray(
- const unsigned char* bytes, size_t n,
- int little_endian, int is_signed);
+ const unsigned char* bytes, size_t n,
+ int little_endian, int is_signed);
/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long
v to a base-256 integer, stored in array bytes. Normally return 0,
@@ -144,19 +145,28 @@ PyAPI_FUNC(PyObject *) _PyLong_FromByteArray(
case, but bytes holds the least-signficant n bytes of the true value.
*/
PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v,
- unsigned char* bytes, size_t n,
- int little_endian, int is_signed);
+ unsigned char* bytes, size_t n,
+ int little_endian, int is_signed);
/* _PyLong_Format: Convert the long to a string object with given base,
appending a base prefix of 0[box] if base is 2, 8 or 16. */
-PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *aa, int base);
+PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base);
+
+PyAPI_FUNC(int) _PyLong_FormatWriter(
+ _PyUnicodeWriter *writer,
+ PyObject *obj,
+ int base,
+ int alternate);
/* Format the object based on the format_spec, as defined in PEP 3101
(Advanced String Formatting). */
-PyAPI_FUNC(PyObject *) _PyLong_FormatAdvanced(PyObject *obj,
- Py_UNICODE *format_spec,
- Py_ssize_t format_spec_len);
+PyAPI_FUNC(int) _PyLong_FormatAdvancedWriter(
+ _PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start,
+ Py_ssize_t end);
#endif /* Py_LIMITED_API */
/* These aren't really part of the long object, but they're handy. The
diff --git a/Include/memoryobject.h b/Include/memoryobject.h
index 62ecbd6..c2e1194 100644
--- a/Include/memoryobject.h
+++ b/Include/memoryobject.h
@@ -6,69 +6,65 @@
extern "C" {
#endif
+#ifndef Py_LIMITED_API
+PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type;
+#endif
PyAPI_DATA(PyTypeObject) PyMemoryView_Type;
#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type)
#ifndef Py_LIMITED_API
-/* Get a pointer to the underlying Py_buffer of a memoryview object. */
+/* Get a pointer to the memoryview's private copy of the exporter's buffer. */
#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view)
-/* Get a pointer to the PyObject from which originates a memoryview object. */
+/* Get a pointer to the exporting object (this may be NULL!). */
#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj)
#endif
-
-PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
- int buffertype,
- char fort);
-
- /* Return a contiguous chunk of memory representing the buffer
- from an object in a memory view object. If a copy is made then the
- base object for the memory view will be a *new* bytes object.
-
- Otherwise, the base-object will be the object itself and no
- data-copying will be done.
-
- The buffertype argument can be PyBUF_READ, PyBUF_WRITE,
- PyBUF_SHADOW to determine whether the returned buffer
- should be READONLY, WRITABLE, or set to update the
- original buffer if a copy must be made. If buffertype is
- PyBUF_WRITE and the buffer is not contiguous an error will
- be raised. In this circumstance, the user can use
- PyBUF_SHADOW to ensure that a a writable temporary
- contiguous buffer is returned. The contents of this
- contiguous buffer will be copied back into the original
- object after the memoryview object is deleted as long as
- the original object is writable and allows setting an
- exclusive write lock. If this is not allowed by the
- original object, then a BufferError is raised.
-
- If the object is multi-dimensional and if fortran is 'F',
- the first dimension of the underlying array will vary the
- fastest in the buffer. If fortran is 'C', then the last
- dimension will vary the fastest (C-style contiguous). If
- fortran is 'A', then it does not matter and you will get
- whatever the object decides is more efficient.
-
- A new reference is returned that must be DECREF'd when finished.
- */
-
PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base);
-
+PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size,
+ int flags);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info);
- /* create new if bufptr is NULL
- will be a new bytesobject in base */
#endif
+PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
+ int buffertype,
+ char order);
-/* The struct is declared here so that macros can work, but it shouldn't
- be considered public. Don't access those fields directly, use the macros
+/* The structs are declared here so that macros can work, but they shouldn't
+ be considered public. Don't access their fields directly, use the macros
and functions instead! */
#ifndef Py_LIMITED_API
+#define _Py_MANAGED_BUFFER_RELEASED 0x001 /* access to exporter blocked */
+#define _Py_MANAGED_BUFFER_FREE_FORMAT 0x002 /* free format */
typedef struct {
PyObject_HEAD
- Py_buffer view;
+ int flags; /* state flags */
+ Py_ssize_t exports; /* number of direct memoryview exports */
+ Py_buffer master; /* snapshot buffer obtained from the original exporter */
+} _PyManagedBufferObject;
+
+
+/* static storage used for casting between formats */
+#define _Py_MEMORYVIEW_MAX_FORMAT 3 /* must be >= 3 */
+
+/* memoryview state flags */
+#define _Py_MEMORYVIEW_RELEASED 0x001 /* access to master buffer blocked */
+#define _Py_MEMORYVIEW_C 0x002 /* C-contiguous layout */
+#define _Py_MEMORYVIEW_FORTRAN 0x004 /* Fortran contiguous layout */
+#define _Py_MEMORYVIEW_SCALAR 0x008 /* scalar: ndim = 0 */
+#define _Py_MEMORYVIEW_PIL 0x010 /* PIL-style layout */
+
+typedef struct {
+ PyObject_VAR_HEAD
+ _PyManagedBufferObject *mbuf; /* managed buffer */
+ Py_hash_t hash; /* hash value for read-only views */
+ int flags; /* state flags */
+ Py_ssize_t exports; /* number of buffer re-exports */
+ Py_buffer view; /* private copy of the exporter's view */
+ char format[_Py_MEMORYVIEW_MAX_FORMAT]; /* used for casting */
+ PyObject *weakreflist;
+ Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */
} PyMemoryViewObject;
#endif
diff --git a/Include/methodobject.h b/Include/methodobject.h
index 7e67c0b..3cc2ea9 100644
--- a/Include/methodobject.h
+++ b/Include/methodobject.h
@@ -17,7 +17,7 @@ PyAPI_DATA(PyTypeObject) PyCFunction_Type;
typedef PyObject *(*PyCFunction)(PyObject *, PyObject *);
typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *,
- PyObject *);
+ PyObject *);
typedef PyObject *(*PyNoArgsFunction)(PyObject *);
PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *);
@@ -30,24 +30,25 @@ PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *);
#define PyCFunction_GET_FUNCTION(func) \
(((PyCFunctionObject *)func) -> m_ml -> ml_meth)
#define PyCFunction_GET_SELF(func) \
- (((PyCFunctionObject *)func) -> m_self)
+ (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \
+ NULL : ((PyCFunctionObject *)func) -> m_self)
#define PyCFunction_GET_FLAGS(func) \
- (((PyCFunctionObject *)func) -> m_ml -> ml_flags)
+ (((PyCFunctionObject *)func) -> m_ml -> ml_flags)
#endif
PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *);
struct PyMethodDef {
- const char *ml_name; /* The name of the built-in function/method */
- PyCFunction ml_meth; /* The C function that implements it */
- int ml_flags; /* Combination of METH_xxx flags, which mostly
- describe the args expected by the C func */
- const char *ml_doc; /* The __doc__ attribute, or NULL */
+ const char *ml_name; /* The name of the built-in function/method */
+ PyCFunction ml_meth; /* The C function that implements it */
+ int ml_flags; /* Combination of METH_xxx flags, which mostly
+ describe the args expected by the C func */
+ const char *ml_doc; /* The __doc__ attribute, or NULL */
};
typedef struct PyMethodDef PyMethodDef;
#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL)
PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *,
- PyObject *);
+ PyObject *);
/* Flag passed to newmethodobject */
/* #define METH_OLDARGS 0x0000 -- unsupported now */
@@ -81,6 +82,11 @@ typedef struct {
PyAPI_FUNC(int) PyCFunction_ClearFreeList(void);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out);
+PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/modsupport.h b/Include/modsupport.h
index bf6478f..ecf1dcc 100644
--- a/Include/modsupport.h
+++ b/Include/modsupport.h
@@ -23,6 +23,8 @@ extern "C" {
PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list);
#endif
+/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */
+#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...);
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...) Py_FORMAT_PARSETUPLE(PyArg_ParseTuple, 2, 3);
PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
@@ -31,13 +33,14 @@ PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *);
PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...);
PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
+#endif
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw);
-#endif
PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list);
PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
const char *, char **, va_list);
+#endif
PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list);
PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *);
diff --git a/Include/moduleobject.h b/Include/moduleobject.h
index 7b2bf1c..8013dd9 100644
--- a/Include/moduleobject.h
+++ b/Include/moduleobject.h
@@ -12,10 +12,14 @@ PyAPI_DATA(PyTypeObject) PyModule_Type;
#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type)
#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type)
+PyAPI_FUNC(PyObject *) PyModule_NewObject(
+ PyObject *name
+ );
PyAPI_FUNC(PyObject *) PyModule_New(
const char *name /* UTF-8 encoded string */
);
PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *);
+PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *);
PyAPI_FUNC(const char *) PyModule_GetName(PyObject *);
PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *);
PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *);
diff --git a/Include/namespaceobject.h b/Include/namespaceobject.h
new file mode 100644
index 0000000..a412f05
--- /dev/null
+++ b/Include/namespaceobject.h
@@ -0,0 +1,17 @@
+
+/* simple namespace object interface */
+
+#ifndef NAMESPACEOBJECT_H
+#define NAMESPACEOBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PyAPI_DATA(PyTypeObject) _PyNamespace_Type;
+
+PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !NAMESPACEOBJECT_H */
diff --git a/Include/node.h b/Include/node.h
index 9f6760c..99c13f7 100644
--- a/Include/node.h
+++ b/Include/node.h
@@ -31,6 +31,7 @@ Py_ssize_t _PyNode_SizeOf(node *n);
#define RCHILD(n, i) (CHILD(n, NCH(n) + i))
#define TYPE(n) ((n)->n_type)
#define STR(n) ((n)->n_str)
+#define LINENO(n) ((n)->n_lineno)
/* Assert that the type of a node is what we expect */
#define REQ(n, type) assert(TYPE(n) == (type))
diff --git a/Include/object.h b/Include/object.h
index 6120ab813..387cadb 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -117,6 +117,35 @@ typedef struct {
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
+/********************* String Literals ****************************************/
+/* This structure helps managing static strings. The basic usage goes like this:
+ Instead of doing
+
+ r = PyObject_CallMethod(o, "foo", "args", ...);
+
+ do
+
+ _Py_IDENTIFIER(foo);
+ ...
+ r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...);
+
+ PyId_foo is a static variable, either on block level or file level. On first
+ usage, the string "foo" is interned, and the structures are linked. On interpreter
+ shutdown, all strings are released (through _PyUnicode_ClearStaticStrings).
+
+ Alternatively, _Py_static_string allows to choose the variable name.
+ _PyUnicode_FromId returns a borrowed reference to the interned string.
+ _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*.
+*/
+typedef struct _Py_Identifier {
+ struct _Py_Identifier *next;
+ const char* string;
+ PyObject *object;
+} _Py_Identifier;
+
+#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 }
+#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname)
+
/*
Type objects contain a string containing the type name (to help somewhat
in debugging), the allocation parameters (see PyObject_New() and
@@ -157,15 +186,16 @@ typedef struct bufferinfo {
Py_ssize_t *shape;
Py_ssize_t *strides;
Py_ssize_t *suboffsets;
- Py_ssize_t smalltable[2]; /* static store for shape and strides of
- mono-dimensional buffers. */
void *internal;
} Py_buffer;
typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
- /* Flags for getting buffers */
+/* Maximum number of dimensions */
+#define PyBUF_MAX_NDIM 64
+
+/* Flags for getting buffers */
#define PyBUF_SIMPLE 0
#define PyBUF_WRITABLE 0x0001
/* we used to include an E, backwards compatible alias */
@@ -403,6 +433,9 @@ typedef struct{
} PyType_Spec;
PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*);
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
+PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*);
+#endif
#ifndef Py_LIMITED_API
/* The *real* layout of a type object when allocated on the heap */
@@ -418,7 +451,8 @@ typedef struct _heaptypeobject {
a given operator (e.g. __getitem__).
see add_operators() in typeobject.c . */
PyBufferProcs as_buffer;
- PyObject *ht_name, *ht_slots;
+ PyObject *ht_name, *ht_slots, *ht_qualname;
+ struct _dictkeysobject *ht_cached_keys;
/* here are optional user slots, followed by the members. */
} PyHeapTypeObject;
@@ -448,13 +482,14 @@ PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *,
PyObject *, PyObject *);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
-PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, char *, PyObject **);
+PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *);
PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *);
#endif
PyAPI_FUNC(unsigned int) PyType_ClearCache(void);
PyAPI_FUNC(void) PyType_Modified(PyTypeObject *);
/* Generic operations on objects */
+struct _Py_Identifier;
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
PyAPI_FUNC(void) _Py_BreakPoint(void);
@@ -472,6 +507,10 @@ PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *);
PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);
PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *);
+PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *);
+PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *);
+PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *);
+PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *);
#endif
@@ -482,6 +521,7 @@ PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *);
PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);
PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *,
PyObject *, PyObject *);
+PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *);
PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *);
PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *);
PyAPI_FUNC(int) PyObject_IsTrue(PyObject *);
@@ -498,6 +538,11 @@ PyAPI_FUNC(int)
_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,
PyObject *, PyObject *);
+/* Helper to look up a builtin object */
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject *)
+_PyObject_GetBuiltin(const char *name);
+#endif
/* PyObject_Dir(obj) acts like Python builtins.dir(obj), returning a
list of strings. PyObject_Dir(NULL) is like builtins.dir(),
@@ -515,6 +560,7 @@ PyAPI_FUNC(void) Py_ReprLeave(PyObject *);
#ifndef Py_LIMITED_API
PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double);
PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*);
+PyAPI_FUNC(Py_hash_t) _Py_HashBytes(unsigned char*, Py_ssize_t);
#endif
typedef struct {
@@ -803,6 +849,10 @@ not implemented for a given type combination.
PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */
#define Py_NotImplemented (&_Py_NotImplementedStruct)
+/* Macro for returning Py_NotImplemented from a function */
+#define Py_RETURN_NOTIMPLEMENTED \
+ return Py_INCREF(Py_NotImplemented), Py_NotImplemented
+
/* Rich comparison opcodes */
#define Py_LT 0
#define Py_LE 1
@@ -912,7 +962,7 @@ with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL.
*/
/* This is the old private API, invoked by the macros before 3.2.4.
- Kept for binary compatibility of extensions. */
+ Kept for binary compatibility of extensions using the stable ABI. */
PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*);
PyAPI_FUNC(void) _PyTrash_destroy_chain(void);
PyAPI_DATA(int) _PyTrash_delete_nesting;
@@ -939,6 +989,14 @@ PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void);
_PyTrash_thread_deposit_object((PyObject*)op); \
} while (0);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void)
+_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks,
+ size_t sizeof_block);
+PyAPI_FUNC(void)
+_PyObject_DebugTypeStats(FILE *out);
+#endif /* ifndef Py_LIMITED_API */
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 8fc3fc1..3d5f509 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -101,13 +101,15 @@ PyAPI_FUNC(void) PyObject_Free(void *);
/* Macros */
#ifdef WITH_PYMALLOC
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void) _PyObject_DebugMallocStats(FILE *out);
+#endif /* #ifndef Py_LIMITED_API */
#ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */
PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes);
PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes);
PyAPI_FUNC(void) _PyObject_DebugFree(void *p);
PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p);
PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p);
-PyAPI_FUNC(void) _PyObject_DebugMallocStats(void);
PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes);
PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes);
PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p);
@@ -179,12 +181,9 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
#endif
#define _PyObject_VAR_SIZE(typeobj, nitems) \
- (size_t) \
- ( ( (typeobj)->tp_basicsize + \
- (nitems)*(typeobj)->tp_itemsize + \
- (SIZEOF_VOID_P - 1) \
- ) & ~(SIZEOF_VOID_P - 1) \
- )
+ _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \
+ (nitems)*(typeobj)->tp_itemsize, \
+ SIZEOF_VOID_P)
#define PyObject_NEW(type, typeobj) \
( (type *) PyObject_Init( \
diff --git a/Include/opcode.h b/Include/opcode.h
index 6b10944..a90184d 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -7,117 +7,117 @@ extern "C" {
/* Instruction opcodes for compiled code */
-#define STOP_CODE 0
-#define POP_TOP 1
-#define ROT_TWO 2
-#define ROT_THREE 3
-#define DUP_TOP 4
+#define POP_TOP 1
+#define ROT_TWO 2
+#define ROT_THREE 3
+#define DUP_TOP 4
#define DUP_TOP_TWO 5
-#define NOP 9
+#define NOP 9
-#define UNARY_POSITIVE 10
-#define UNARY_NEGATIVE 11
-#define UNARY_NOT 12
+#define UNARY_POSITIVE 10
+#define UNARY_NEGATIVE 11
+#define UNARY_NOT 12
-#define UNARY_INVERT 15
+#define UNARY_INVERT 15
-#define BINARY_POWER 19
+#define BINARY_POWER 19
-#define BINARY_MULTIPLY 20
+#define BINARY_MULTIPLY 20
-#define BINARY_MODULO 22
-#define BINARY_ADD 23
-#define BINARY_SUBTRACT 24
-#define BINARY_SUBSCR 25
+#define BINARY_MODULO 22
+#define BINARY_ADD 23
+#define BINARY_SUBTRACT 24
+#define BINARY_SUBSCR 25
#define BINARY_FLOOR_DIVIDE 26
#define BINARY_TRUE_DIVIDE 27
#define INPLACE_FLOOR_DIVIDE 28
#define INPLACE_TRUE_DIVIDE 29
-#define STORE_MAP 54
-#define INPLACE_ADD 55
-#define INPLACE_SUBTRACT 56
-#define INPLACE_MULTIPLY 57
-
-#define INPLACE_MODULO 59
-#define STORE_SUBSCR 60
-#define DELETE_SUBSCR 61
-
-#define BINARY_LSHIFT 62
-#define BINARY_RSHIFT 63
-#define BINARY_AND 64
-#define BINARY_XOR 65
-#define BINARY_OR 66
-#define INPLACE_POWER 67
-#define GET_ITER 68
-#define STORE_LOCALS 69
-#define PRINT_EXPR 70
+#define STORE_MAP 54
+#define INPLACE_ADD 55
+#define INPLACE_SUBTRACT 56
+#define INPLACE_MULTIPLY 57
+
+#define INPLACE_MODULO 59
+#define STORE_SUBSCR 60
+#define DELETE_SUBSCR 61
+
+#define BINARY_LSHIFT 62
+#define BINARY_RSHIFT 63
+#define BINARY_AND 64
+#define BINARY_XOR 65
+#define BINARY_OR 66
+#define INPLACE_POWER 67
+#define GET_ITER 68
+#define STORE_LOCALS 69
+#define PRINT_EXPR 70
#define LOAD_BUILD_CLASS 71
-
-#define INPLACE_LSHIFT 75
-#define INPLACE_RSHIFT 76
-#define INPLACE_AND 77
-#define INPLACE_XOR 78
-#define INPLACE_OR 79
-#define BREAK_LOOP 80
+#define YIELD_FROM 72
+
+#define INPLACE_LSHIFT 75
+#define INPLACE_RSHIFT 76
+#define INPLACE_AND 77
+#define INPLACE_XOR 78
+#define INPLACE_OR 79
+#define BREAK_LOOP 80
#define WITH_CLEANUP 81
-#define RETURN_VALUE 83
-#define IMPORT_STAR 84
+#define RETURN_VALUE 83
+#define IMPORT_STAR 84
-#define YIELD_VALUE 86
-#define POP_BLOCK 87
-#define END_FINALLY 88
-#define POP_EXCEPT 89
+#define YIELD_VALUE 86
+#define POP_BLOCK 87
+#define END_FINALLY 88
+#define POP_EXCEPT 89
-#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */
+#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */
-#define STORE_NAME 90 /* Index in name list */
-#define DELETE_NAME 91 /* "" */
-#define UNPACK_SEQUENCE 92 /* Number of sequence items */
-#define FOR_ITER 93
+#define STORE_NAME 90 /* Index in name list */
+#define DELETE_NAME 91 /* "" */
+#define UNPACK_SEQUENCE 92 /* Number of sequence items */
+#define FOR_ITER 93
#define UNPACK_EX 94 /* Num items before variable part +
(Num items after variable part << 8) */
-#define STORE_ATTR 95 /* Index in name list */
-#define DELETE_ATTR 96 /* "" */
-#define STORE_GLOBAL 97 /* "" */
-#define DELETE_GLOBAL 98 /* "" */
-
-#define LOAD_CONST 100 /* Index in const list */
-#define LOAD_NAME 101 /* Index in name list */
-#define BUILD_TUPLE 102 /* Number of tuple items */
-#define BUILD_LIST 103 /* Number of list items */
-#define BUILD_SET 104 /* Number of set items */
-#define BUILD_MAP 105 /* Always zero for now */
-#define LOAD_ATTR 106 /* Index in name list */
-#define COMPARE_OP 107 /* Comparison operator */
-#define IMPORT_NAME 108 /* Index in name list */
-#define IMPORT_FROM 109 /* Index in name list */
-
-#define JUMP_FORWARD 110 /* Number of bytes to skip */
-#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning of code */
-#define JUMP_IF_TRUE_OR_POP 112 /* "" */
-#define JUMP_ABSOLUTE 113 /* "" */
-#define POP_JUMP_IF_FALSE 114 /* "" */
-#define POP_JUMP_IF_TRUE 115 /* "" */
-
-#define LOAD_GLOBAL 116 /* Index in name list */
-
-#define CONTINUE_LOOP 119 /* Start of loop (absolute) */
-#define SETUP_LOOP 120 /* Target address (relative) */
-#define SETUP_EXCEPT 121 /* "" */
-#define SETUP_FINALLY 122 /* "" */
-
-#define LOAD_FAST 124 /* Local variable number */
-#define STORE_FAST 125 /* Local variable number */
-#define DELETE_FAST 126 /* Local variable number */
-
-#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */
+#define STORE_ATTR 95 /* Index in name list */
+#define DELETE_ATTR 96 /* "" */
+#define STORE_GLOBAL 97 /* "" */
+#define DELETE_GLOBAL 98 /* "" */
+
+#define LOAD_CONST 100 /* Index in const list */
+#define LOAD_NAME 101 /* Index in name list */
+#define BUILD_TUPLE 102 /* Number of tuple items */
+#define BUILD_LIST 103 /* Number of list items */
+#define BUILD_SET 104 /* Number of set items */
+#define BUILD_MAP 105 /* Always zero for now */
+#define LOAD_ATTR 106 /* Index in name list */
+#define COMPARE_OP 107 /* Comparison operator */
+#define IMPORT_NAME 108 /* Index in name list */
+#define IMPORT_FROM 109 /* Index in name list */
+
+#define JUMP_FORWARD 110 /* Number of bytes to skip */
+#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning of code */
+#define JUMP_IF_TRUE_OR_POP 112 /* "" */
+#define JUMP_ABSOLUTE 113 /* "" */
+#define POP_JUMP_IF_FALSE 114 /* "" */
+#define POP_JUMP_IF_TRUE 115 /* "" */
+
+#define LOAD_GLOBAL 116 /* Index in name list */
+
+#define CONTINUE_LOOP 119 /* Start of loop (absolute) */
+#define SETUP_LOOP 120 /* Target address (relative) */
+#define SETUP_EXCEPT 121 /* "" */
+#define SETUP_FINALLY 122 /* "" */
+
+#define LOAD_FAST 124 /* Local variable number */
+#define STORE_FAST 125 /* Local variable number */
+#define DELETE_FAST 126 /* Local variable number */
+
+#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */
/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
-#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */
-#define MAKE_FUNCTION 132 /* #defaults + #kwdefaults<<8 + #annotations<<16 */
-#define BUILD_SLICE 133 /* Number of items */
+#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */
+#define MAKE_FUNCTION 132 /* #defaults + #kwdefaults<<8 + #annotations<<16 */
+#define BUILD_SLICE 133 /* Number of items */
#define MAKE_CLOSURE 134 /* same as MAKE_FUNCTION */
#define LOAD_CLOSURE 135 /* Load free variable from closure */
@@ -127,9 +127,9 @@ extern "C" {
/* The next 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
-#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */
-#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */
-#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */
+#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */
+#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */
+#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */
#define SETUP_WITH 143
@@ -149,7 +149,7 @@ extern "C" {
enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, PyCmp_GT=Py_GT, PyCmp_GE=Py_GE,
- PyCmp_IN, PyCmp_NOT_IN, PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD};
+ PyCmp_IN, PyCmp_NOT_IN, PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD};
#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
diff --git a/Include/parsetok.h b/Include/parsetok.h
index 4b7694f..911dfc1 100644
--- a/Include/parsetok.h
+++ b/Include/parsetok.h
@@ -9,7 +9,10 @@ extern "C" {
typedef struct {
int error;
- const char *filename; /* decoded from the filesystem encoding */
+#ifndef PGEN
+ /* The filename is useless for pgen, see comment in tok_state structure */
+ PyObject *filename;
+#endif
int lineno;
int offset;
char *text; /* UTF-8-encoded string */
@@ -66,8 +69,10 @@ PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx(
perrdetail *err_ret,
int *flags);
-/* Note that he following function is defined in pythonrun.c not parsetok.c. */
+/* Note that the following functions are defined in pythonrun.c,
+ not in parsetok.c */
PyAPI_FUNC(void) PyParser_SetError(perrdetail *);
+PyAPI_FUNC(void) PyParser_ClearError(perrdetail *);
#ifdef __cplusplus
}
diff --git a/Include/patchlevel.h b/Include/patchlevel.h
index 0839071..b5919a4 100644
--- a/Include/patchlevel.h
+++ b/Include/patchlevel.h
@@ -17,19 +17,15 @@
/* Version parsed out into numeric values */
/*--start constants--*/
#define PY_MAJOR_VERSION 3
-#define PY_MINOR_VERSION 2
-#define PY_MICRO_VERSION 3
+#define PY_MINOR_VERSION 3
+#define PY_MICRO_VERSION 0
#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL
#define PY_RELEASE_SERIAL 0
/* Version as a string */
-#define PY_VERSION "3.2.3+"
+#define PY_VERSION "3.3.0+"
/*--end constants--*/
-/* Subversion Revision number of this file (not of the repository). Empty
- since Mercurial migration. */
-#define PY_PATCHLEVEL_REVISION ""
-
/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */
#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \
diff --git a/Include/py_curses.h b/Include/py_curses.h
index a891c42..f2c08f6 100644
--- a/Include/py_curses.h
+++ b/Include/py_curses.h
@@ -76,6 +76,7 @@ extern "C" {
typedef struct {
PyObject_HEAD
WINDOW *win;
+ char *encoding;
} PyCursesWindowObject;
#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type)
diff --git a/Include/pydebug.h b/Include/pydebug.h
index e23cbdc..97c2f8c 100644
--- a/Include/pydebug.h
+++ b/Include/pydebug.h
@@ -16,7 +16,6 @@ PyAPI_DATA(int) Py_BytesWarningFlag;
PyAPI_DATA(int) Py_UseClassExceptionsFlag;
PyAPI_DATA(int) Py_FrozenFlag;
PyAPI_DATA(int) Py_IgnoreEnvironmentFlag;
-PyAPI_DATA(int) Py_DivisionWarningFlag;
PyAPI_DATA(int) Py_DontWriteBytecodeFlag;
PyAPI_DATA(int) Py_NoUserSiteDirectory;
PyAPI_DATA(int) Py_UnbufferedStdioFlag;
@@ -27,8 +26,6 @@ PyAPI_DATA(int) Py_HashRandomizationFlag;
PYTHONPATH and PYTHONHOME from the environment */
#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s))
-PyAPI_FUNC(void) Py_FatalError(const char *message);
-
#ifdef __cplusplus
}
#endif
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
index 4bb3c01..af37410 100644
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -10,7 +10,8 @@ extern "C" {
/* PyException_HEAD defines the initial segment of every exception class. */
#define PyException_HEAD PyObject_HEAD PyObject *dict;\
PyObject *args; PyObject *traceback;\
- PyObject *context; PyObject *cause;
+ PyObject *context; PyObject *cause;\
+ char suppress_context;
typedef struct {
PyException_HEAD
@@ -28,6 +29,13 @@ typedef struct {
typedef struct {
PyException_HEAD
+ PyObject *msg;
+ PyObject *name;
+ PyObject *path;
+} PyImportErrorObject;
+
+typedef struct {
+ PyException_HEAD
PyObject *encoding;
PyObject *object;
Py_ssize_t start;
@@ -45,18 +53,23 @@ typedef struct {
PyObject *myerrno;
PyObject *strerror;
PyObject *filename;
-} PyEnvironmentErrorObject;
-
#ifdef MS_WINDOWS
-typedef struct {
- PyException_HEAD
- PyObject *myerrno;
- PyObject *strerror;
- PyObject *filename;
PyObject *winerror;
-} PyWindowsErrorObject;
#endif
+ Py_ssize_t written; /* only for BlockingIOError, -1 otherwise */
+} PyOSErrorObject;
+
+typedef struct {
+ PyException_HEAD
+ PyObject *value;
+} PyStopIterationObject;
+
+/* Compatibility typedefs */
+typedef PyOSErrorObject PyEnvironmentErrorObject;
+#ifdef MS_WINDOWS
+typedef PyOSErrorObject PyWindowsErrorObject;
#endif
+#endif /* !Py_LIMITED_API */
/* Error handling definitions */
@@ -70,7 +83,19 @@ PyAPI_FUNC(PyObject *) PyErr_Occurred(void);
PyAPI_FUNC(void) PyErr_Clear(void);
PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **);
PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *);
-PyAPI_FUNC(void) Py_FatalError(const char *message);
+PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
+PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
+
+#if defined(__clang__) || \
+ (defined(__GNUC_MAJOR__) && \
+ ((__GNUC_MAJOR__ >= 3) || \
+ (__GNUC_MAJOR__ == 2) && (__GNUC_MINOR__ >= 5)))
+#define _Py_NO_RETURN __attribute__((__noreturn__))
+#else
+#define _Py_NO_RETURN
+#endif
+
+PyAPI_FUNC(void) Py_FatalError(const char *message) _Py_NO_RETURN;
#if defined(Py_DEBUG) || defined(Py_LIMITED_API)
#define _PyErr_OCCURRED() PyErr_Occurred()
@@ -122,10 +147,9 @@ PyAPI_DATA(PyObject *) PyExc_LookupError;
PyAPI_DATA(PyObject *) PyExc_AssertionError;
PyAPI_DATA(PyObject *) PyExc_AttributeError;
+PyAPI_DATA(PyObject *) PyExc_BufferError;
PyAPI_DATA(PyObject *) PyExc_EOFError;
PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
-PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
-PyAPI_DATA(PyObject *) PyExc_IOError;
PyAPI_DATA(PyObject *) PyExc_OSError;
PyAPI_DATA(PyObject *) PyExc_ImportError;
PyAPI_DATA(PyObject *) PyExc_IndexError;
@@ -150,6 +174,27 @@ PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError;
PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
PyAPI_DATA(PyObject *) PyExc_ValueError;
PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
+
+PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
+PyAPI_DATA(PyObject *) PyExc_BrokenPipeError;
+PyAPI_DATA(PyObject *) PyExc_ChildProcessError;
+PyAPI_DATA(PyObject *) PyExc_ConnectionError;
+PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError;
+PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError;
+PyAPI_DATA(PyObject *) PyExc_ConnectionResetError;
+PyAPI_DATA(PyObject *) PyExc_FileExistsError;
+PyAPI_DATA(PyObject *) PyExc_FileNotFoundError;
+PyAPI_DATA(PyObject *) PyExc_InterruptedError;
+PyAPI_DATA(PyObject *) PyExc_IsADirectoryError;
+PyAPI_DATA(PyObject *) PyExc_NotADirectoryError;
+PyAPI_DATA(PyObject *) PyExc_PermissionError;
+PyAPI_DATA(PyObject *) PyExc_ProcessLookupError;
+PyAPI_DATA(PyObject *) PyExc_TimeoutError;
+
+
+/* Compatibility aliases */
+PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
+PyAPI_DATA(PyObject *) PyExc_IOError;
#ifdef MS_WINDOWS
PyAPI_DATA(PyObject *) PyExc_WindowsError;
#endif
@@ -157,8 +202,6 @@ PyAPI_DATA(PyObject *) PyExc_WindowsError;
PyAPI_DATA(PyObject *) PyExc_VMSError;
#endif
-PyAPI_DATA(PyObject *) PyExc_BufferError;
-
PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst;
/* Predefined warning categories */
@@ -198,8 +241,6 @@ PyAPI_FUNC(PyObject *) PyErr_Format(
);
#ifdef MS_WINDOWS
-PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject(
- int, const char *);
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(
int ierr,
const char *filename /* decoded from the filesystem encoding */
@@ -224,6 +265,11 @@ PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename(
PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
#endif /* MS_WINDOWS */
+PyAPI_FUNC(PyObject *) PyErr_SetExcWithArgsKwargs(PyObject *, PyObject *,
+ PyObject *);
+PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
+ PyObject *);
+
/* Export the old function so that the existing API remains available: */
PyAPI_FUNC(void) PyErr_BadInternalCall(void);
PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno);
@@ -293,6 +339,12 @@ PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create(
Py_ssize_t end,
const char *reason /* UTF-8 encoded string */
);
+PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create(
+ PyObject *object,
+ Py_ssize_t start,
+ Py_ssize_t end,
+ const char *reason /* UTF-8 encoded string */
+ );
#endif
/* get the encoding attribute */
@@ -348,7 +400,6 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason(
const char *reason /* UTF-8 encoded string */
);
-
/* These APIs aren't really part of the error implementation, but
often needed to format error messages; the native C lib APIs are
not available on all platforms, which is why we provide emulations
diff --git a/Include/pyexpat.h b/Include/pyexpat.h
index 5340ef5..168b5b2 100644
--- a/Include/pyexpat.h
+++ b/Include/pyexpat.h
@@ -43,6 +43,8 @@ struct PyExpat_CAPI
XML_Parser parser, XML_UnknownEncodingHandler handler,
void *encodingHandlerData);
void (*SetUserData)(XML_Parser parser, void *userData);
+ void (*SetStartDoctypeDeclHandler)(XML_Parser parser,
+ XML_StartDoctypeDeclHandler start);
/* always add new stuff to the end! */
};
diff --git a/Include/pymacro.h b/Include/pymacro.h
new file mode 100644
index 0000000..52e8ee3
--- /dev/null
+++ b/Include/pymacro.h
@@ -0,0 +1,69 @@
+#ifndef Py_PYMACRO_H
+#define Py_PYMACRO_H
+
+#define Py_MIN(x, y) (((x) > (y)) ? (y) : (x))
+#define Py_MAX(x, y) (((x) > (y)) ? (x) : (y))
+
+/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
+#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
+
+
+/* Assert a build-time dependency, as an expression.
+
+ Your compile will fail if the condition isn't true, or can't be evaluated
+ by the compiler. This can be used in an expression: its value is 0.
+
+ Example:
+
+ #define foo_to_char(foo) \
+ ((char *)(foo) \
+ + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
+
+ Written by Rusty Russell, public domain, http://ccodearchive.net/ */
+#define Py_BUILD_ASSERT_EXPR(cond) \
+ (sizeof(char [1 - 2*!(cond)]) - 1)
+
+/* Get the number of elements in a visible array
+
+ This does not work on pointers, or arrays declared as [], or function
+ parameters. With correct compiler support, such usage will cause a build
+ error (see Py_BUILD_ASSERT_EXPR).
+
+ Written by Rusty Russell, public domain, http://ccodearchive.net/ */
+#if (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+/* Two gcc extensions.
+ &a[0] degrades to a pointer: a different type from an array */
+#define Py_ARRAY_LENGTH(array) \
+ (sizeof(array) / sizeof((array)[0]) \
+ + Py_BUILD_ASSERT_EXPR(!__builtin_types_compatible_p(typeof(array), \
+ typeof(&(array)[0]))))
+#else
+#define Py_ARRAY_LENGTH(array) \
+ (sizeof(array) / sizeof((array)[0]))
+#endif
+
+
+/* Define macros for inline documentation. */
+#define PyDoc_VAR(name) static char name[]
+#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
+#ifdef WITH_DOC_STRINGS
+#define PyDoc_STR(str) str
+#else
+#define PyDoc_STR(str) ""
+#endif
+
+/* Below "a" is a power of 2. */
+/* Round down size "n" to be a multiple of "a". */
+#define _Py_SIZE_ROUND_DOWN(n, a) ((size_t)(n) & ~(size_t)((a) - 1))
+/* Round up size "n" to be a multiple of "a". */
+#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \
+ (size_t)((a) - 1)) & ~(size_t)((a) - 1))
+/* Round pointer "p" down to the closest "a"-aligned address <= "p". */
+#define _Py_ALIGN_DOWN(p, a) ((void *)((Py_uintptr_t)(p) & ~(Py_uintptr_t)((a) - 1)))
+/* Round pointer "p" up to the closest "a"-aligned address >= "p". */
+#define _Py_ALIGN_UP(p, a) ((void *)(((Py_uintptr_t)(p) + \
+ (Py_uintptr_t)((a) - 1)) & ~(Py_uintptr_t)((a) - 1)))
+/* Check if pointer "p" is aligned to "a"-bytes boundary. */
+#define _Py_IS_ALIGNED(p, a) (!((Py_uintptr_t)(p) & (Py_uintptr_t)((a) - 1)))
+
+#endif /* Py_PYMACRO_H */
diff --git a/Include/pymath.h b/Include/pymath.h
index b4eda66..62a6c42 100644
--- a/Include/pymath.h
+++ b/Include/pymath.h
@@ -37,12 +37,6 @@ extern double pow(double, double);
#endif /* __STDC__ */
#endif /* _MSC_VER */
-#ifdef _OSF_SOURCE
-/* OSF1 5.1 doesn't make these available with XOPEN_SOURCE_EXTENDED defined */
-extern int finite(double);
-extern double copysign(double, double);
-#endif
-
/* High precision defintion of pi and e (Euler)
* The values are taken from libc6's math.h.
*/
diff --git a/Include/pyport.h b/Include/pyport.h
index 4ef0db2..eba34f9 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -135,7 +135,7 @@ Used in: PY_LONG_LONG
#define _PyHASH_MULTIPLIER 1000003 /* 0xf4243 */
/* Parameters used for the numeric hash implementation. See notes for
- _PyHash_Double in Objects/object.c. Numeric hashes are based on
+ _Py_HashDouble in Objects/object.c. Numeric hashes are based on
reduction modulo the prime 2**_PyHASH_BITS - 1. */
#if SIZEOF_VOID_P >= 8
diff --git a/Include/pystate.h b/Include/pystate.h
index 060efa7..2017b02 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -25,7 +25,7 @@ typedef struct _is {
PyObject *modules_by_index;
PyObject *sysdict;
PyObject *builtins;
- PyObject *modules_reloading;
+ PyObject *importlib;
PyObject *codec_search_path;
PyObject *codec_search_cache;
@@ -33,6 +33,7 @@ typedef struct _is {
int codecs_initialized;
int fscodec_initialized;
+
#ifdef HAVE_DLOPEN
int dlopenflags;
#endif
@@ -74,9 +75,9 @@ typedef struct _ts {
struct _frame *frame;
int recursion_depth;
char overflowed; /* The stack has overflowed. Allow 50 more calls
- to handle the runtime error. */
- char recursion_critical; /* The current calls must not cause
- a stack overflow. */
+ to handle the runtime error. */
+ char recursion_critical; /* The current calls must not cause
+ a stack overflow. */
/* 'tracing' keeps track of the execution depth when tracing/profiling.
This is to prevent the actual trace/profile code from being recorded in
the trace/profile. */
@@ -126,6 +127,11 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*);
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
+/* New in 3.3 */
+PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
+PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*);
+#endif
PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*);
PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
@@ -163,6 +169,8 @@ typedef
enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
PyGILState_STATE;
+#ifdef WITH_THREAD
+
/* Ensure that the current thread is ready to call the Python
C API, regardless of the current state of Python, or of its
thread lock. This may be called as many times as desired
@@ -204,6 +212,8 @@ PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
*/
PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
+#endif /* #ifdef WITH_THREAD */
+
/* The implementation of sys._current_frames() Returns a dict mapping
thread id to that thread's current frame.
*/
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index e244ce7..4d24b2d 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -30,6 +30,9 @@ PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
PyAPI_FUNC(void) Py_Initialize(void);
PyAPI_FUNC(void) Py_InitializeEx(int);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void) _Py_InitializeEx_Private(int, int);
+#endif
PyAPI_FUNC(void) Py_Finalize(void);
PyAPI_FUNC(int) Py_IsInitialized(void);
PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void);
@@ -82,9 +85,12 @@ PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(
PyParser_SimpleParseFileFlags(FP, S, B, 0)
#endif
PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int,
- int);
+ int);
+PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *,
+ const char *,
+ int, int);
PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *,
- int, int);
+ int, int);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *,
@@ -179,9 +185,6 @@ PyAPI_FUNC(const char *) Py_GetCopyright(void);
PyAPI_FUNC(const char *) Py_GetCompiler(void);
PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
#ifndef Py_LIMITED_API
-PyAPI_FUNC(const char *) _Py_svnversion(void);
-PyAPI_FUNC(const char *) Py_SubversionRevision(void);
-PyAPI_FUNC(const char *) Py_SubversionShortBranch(void);
PyAPI_FUNC(const char *) _Py_hgidentifier(void);
PyAPI_FUNC(const char *) _Py_hgversion(void);
#endif
@@ -191,7 +194,7 @@ PyAPI_FUNC(const char *) _Py_hgversion(void);
PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void);
PyAPI_FUNC(PyObject *) _PySys_Init(void);
PyAPI_FUNC(void) _PyImport_Init(void);
-PyAPI_FUNC(void) _PyExc_Init(void);
+PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
PyAPI_FUNC(void) _PyImportHooks_Init(void);
PyAPI_FUNC(int) _PyFrame_Init(void);
PyAPI_FUNC(void) _PyFloat_Init(void);
@@ -215,6 +218,7 @@ PyAPI_FUNC(void) PyByteArray_Fini(void);
PyAPI_FUNC(void) PyFloat_Fini(void);
PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
PyAPI_FUNC(void) _PyGC_Fini(void);
+PyAPI_FUNC(void) PySlice_Fini(void);
PyAPI_DATA(PyThreadState *) _Py_Finalizing;
#endif
diff --git a/Include/pythread.h b/Include/pythread.h
index 9806c61..6e9f303 100644
--- a/Include/pythread.h
+++ b/Include/pythread.h
@@ -32,7 +32,7 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int);
on a lock (see PyThread_acquire_lock_timed() below).
PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that
type, and depends on the system threading API.
-
+
NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread
module exposes a higher-level API, with timeouts expressed in seconds
and floating-point numbers allowed.
@@ -74,6 +74,8 @@ PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock);
PyAPI_FUNC(size_t) PyThread_get_stacksize(void);
PyAPI_FUNC(int) PyThread_set_stacksize(size_t);
+PyAPI_FUNC(PyObject*) PyThread_GetInfo(void);
+
/* Thread Local Storage (TLS) API */
PyAPI_FUNC(int) PyThread_create_key(void);
PyAPI_FUNC(void) PyThread_delete_key(int);
diff --git a/Include/pytime.h b/Include/pytime.h
index d707bdb..52902f5 100644
--- a/Include/pytime.h
+++ b/Include/pytime.h
@@ -3,6 +3,7 @@
#define Py_PYTIME_H
#include "pyconfig.h" /* include for defines */
+#include "object.h"
/**************************************************************************
Symbols and macros to supply platform-independent interfaces to time related
@@ -21,11 +22,25 @@ typedef struct {
} _PyTime_timeval;
#endif
+/* Structure used by time.get_clock_info() */
+typedef struct {
+ const char *implementation;
+ int monotonic;
+ int adjustable;
+ double resolution;
+} _Py_clock_info_t;
+
/* Similar to POSIX gettimeofday but cannot fail. If system gettimeofday
* fails or is not available, fall back to lower resolution clocks.
*/
PyAPI_FUNC(void) _PyTime_gettimeofday(_PyTime_timeval *tp);
+/* Similar to _PyTime_gettimeofday() but retrieve also information on the
+ * clock used to get the current time. */
+PyAPI_FUNC(void) _PyTime_gettimeofday_info(
+ _PyTime_timeval *tp,
+ _Py_clock_info_t *info);
+
#define _PyTime_ADD_SECONDS(tv, interval) \
do { \
tv.tv_usec += (long) (((long) interval - interval) * 1000000); \
@@ -37,6 +52,37 @@ do { \
((tv_end.tv_sec - tv_start.tv_sec) + \
(tv_end.tv_usec - tv_start.tv_usec) * 0.000001)
+#ifndef Py_LIMITED_API
+/* Convert a number of seconds, int or float, to time_t. */
+PyAPI_FUNC(int) _PyTime_ObjectToTime_t(
+ PyObject *obj,
+ time_t *sec);
+
+/* Convert a time_t to a PyLong. */
+PyAPI_FUNC(PyObject *) _PyLong_FromTime_t(
+ time_t sec);
+
+/* Convert a PyLong to a time_t. */
+PyAPI_FUNC(time_t) _PyLong_AsTime_t(
+ PyObject *obj);
+
+/* Convert a number of seconds, int or float, to a timeval structure.
+ usec is in the range [0; 999999] and rounded towards zero.
+ For example, -1.2 is converted to (-2, 800000). */
+PyAPI_FUNC(int) _PyTime_ObjectToTimeval(
+ PyObject *obj,
+ time_t *sec,
+ long *usec);
+
+/* Convert a number of seconds, int or float, to a timespec structure.
+ nsec is in the range [0; 999999999] and rounded towards zero.
+ For example, -1.2 is converted to (-2, 800000000). */
+PyAPI_FUNC(int) _PyTime_ObjectToTimespec(
+ PyObject *obj,
+ time_t *sec,
+ long *nsec);
+#endif
+
/* Dummy to force linking. */
PyAPI_FUNC(void) _PyTime_Init(void);
diff --git a/Include/setobject.h b/Include/setobject.h
index 6234111..a14874b 100644
--- a/Include/setobject.h
+++ b/Include/setobject.h
@@ -99,6 +99,9 @@ PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key,
PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set);
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);
+
+PyAPI_FUNC(int) PySet_ClearFreeList(void);
+PyAPI_FUNC(void) _PySet_DebugMallocStats(FILE *out);
#endif
#ifdef __cplusplus
diff --git a/Include/structmember.h b/Include/structmember.h
index 0b85b2a..948f690 100644
--- a/Include/structmember.h
+++ b/Include/structmember.h
@@ -9,16 +9,6 @@ extern "C" {
#include <stddef.h> /* For offsetof */
-/* The offsetof() macro calculates the offset of a structure member
- in its structure. Unfortunately this cannot be written down
- portably, hence it is provided by a Standard C header file.
- For pre-Standard C compilers, here is a version that usually works
- (but watch out!): */
-
-#ifndef offsetof
-#define offsetof(type, member) ( (int) & ((type*)0) -> member )
-#endif
-
/* An array of PyMemberDef structures defines the name, type and offset
of selected members of a C structure. These can be read by
PyMember_GetOne() and set by PyMember_SetOne() (except if their READONLY
@@ -26,42 +16,41 @@ extern "C" {
pointer is NULL. */
typedef struct PyMemberDef {
- /* Current version, use this */
- char *name;
- int type;
- Py_ssize_t offset;
- int flags;
- char *doc;
+ char *name;
+ int type;
+ Py_ssize_t offset;
+ int flags;
+ char *doc;
} PyMemberDef;
/* Types */
-#define T_SHORT 0
-#define T_INT 1
-#define T_LONG 2
-#define T_FLOAT 3
-#define T_DOUBLE 4
-#define T_STRING 5
-#define T_OBJECT 6
+#define T_SHORT 0
+#define T_INT 1
+#define T_LONG 2
+#define T_FLOAT 3
+#define T_DOUBLE 4
+#define T_STRING 5
+#define T_OBJECT 6
/* XXX the ordering here is weird for binary compatibility */
-#define T_CHAR 7 /* 1-character string */
-#define T_BYTE 8 /* 8-bit signed int */
+#define T_CHAR 7 /* 1-character string */
+#define T_BYTE 8 /* 8-bit signed int */
/* unsigned variants: */
-#define T_UBYTE 9
-#define T_USHORT 10
-#define T_UINT 11
-#define T_ULONG 12
+#define T_UBYTE 9
+#define T_USHORT 10
+#define T_UINT 11
+#define T_ULONG 12
/* Added by Jack: strings contained in the structure */
-#define T_STRING_INPLACE 13
+#define T_STRING_INPLACE 13
/* Added by Lillo: bools contained in the structure (assumed char) */
-#define T_BOOL 14
+#define T_BOOL 14
-#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError
- when the value is NULL, instead of
- converting to None. */
+#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError
+ when the value is NULL, instead of
+ converting to None. */
#ifdef HAVE_LONG_LONG
-#define T_LONGLONG 17
+#define T_LONGLONG 17
#define T_ULONGLONG 18
#endif /* HAVE_LONG_LONG */
@@ -70,10 +59,10 @@ typedef struct PyMemberDef {
/* Flags */
-#define READONLY 1
-#define READ_RESTRICTED 2
+#define READONLY 1
+#define READ_RESTRICTED 2
#define PY_WRITE_RESTRICTED 4
-#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED)
+#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED)
/* Current API, use this */
diff --git a/Include/symtable.h b/Include/symtable.h
index fd7de04..6ed3a2b 100644
--- a/Include/symtable.h
+++ b/Include/symtable.h
@@ -23,10 +23,15 @@ struct symtable {
PyObject *st_blocks; /* dict: map AST node addresses
* to symbol table entries */
PyObject *st_stack; /* list: stack of namespace info */
- PyObject *st_global; /* borrowed ref to st_top->st_symbols */
- int st_nblocks; /* number of blocks used */
+ PyObject *st_global; /* borrowed ref to st_top->ste_symbols */
+ int st_nblocks; /* number of blocks used. kept for
+ consistency with the corresponding
+ compiler structure */
PyObject *st_private; /* name of current class or NULL */
- PyFutureFeatures *st_future; /* module's future features */
+ PyFutureFeatures *st_future; /* module's future features that affect
+ the symbol table */
+ int recursion_depth; /* current recursion depth */
+ int recursion_limit; /* recursion limit */
};
typedef struct _symtable_entry {
@@ -34,7 +39,7 @@ typedef struct _symtable_entry {
PyObject *ste_id; /* int: key in ste_table->st_blocks */
PyObject *ste_symbols; /* dict: variable names to flags */
PyObject *ste_name; /* string: name of current block */
- PyObject *ste_varnames; /* list of variable names */
+ PyObject *ste_varnames; /* list of function parameters */
PyObject *ste_children; /* list of child blocks */
_Py_block_ty ste_type; /* module, class, or function */
int ste_unoptimized; /* false if namespace is optimized */
diff --git a/Include/timefuncs.h b/Include/timefuncs.h
deleted file mode 100644
index 3c43575..0000000
--- a/Include/timefuncs.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* timefuncs.h
- */
-
-/* Utility function related to timemodule.c. */
-
-#ifndef TIMEFUNCS_H
-#define TIMEFUNCS_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Cast double x to time_t, but raise ValueError if x is too large
- * to fit in a time_t. ValueError is set on return iff the return
- * value is (time_t)-1 and PyErr_Occurred().
- */
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(time_t) _PyTime_DoubleToTimet(double x);
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* TIMEFUNCS_H */
diff --git a/Include/traceback.h b/Include/traceback.h
index 69e3d05..7734707 100644
--- a/Include/traceback.h
+++ b/Include/traceback.h
@@ -5,6 +5,8 @@
extern "C" {
#endif
+#include "pystate.h"
+
struct _frame;
/* Traceback interface */
@@ -28,6 +30,42 @@ PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int);
PyAPI_DATA(PyTypeObject) PyTraceBack_Type;
#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type)
+/* Write the Python traceback into the file 'fd'. For example:
+
+ Traceback (most recent call first):
+ File "xxx", line xxx in <xxx>
+ File "xxx", line xxx in <xxx>
+ ...
+ File "xxx", line xxx in <xxx>
+
+ This function is written for debug purpose only, to dump the traceback in
+ the worst case: after a segmentation fault, at fatal error, etc. That's why,
+ it is very limited. Strings are truncated to 100 characters and encoded to
+ ASCII with backslashreplace. It doesn't write the source code, only the
+ function name, filename and line number of each frame. Write only the first
+ 100 frames: if the traceback is truncated, write the line " ...".
+
+ This function is signal safe. */
+
+PyAPI_DATA(void) _Py_DumpTraceback(
+ int fd,
+ PyThreadState *tstate);
+
+/* Write the traceback of all threads into the file 'fd'. current_thread can be
+ NULL. Return NULL on success, or an error message on error.
+
+ This function is written for debug purpose only. It calls
+ _Py_DumpTraceback() for each thread, and so has the same limitations. It
+ only write the traceback of the first 100 threads: write "..." if there are
+ more threads.
+
+ This function is signal safe. */
+
+PyAPI_DATA(const char*) _Py_DumpTracebackThreads(
+ int fd, PyInterpreterState *interp,
+ PyThreadState *current_thread);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/tupleobject.h b/Include/tupleobject.h
index f17b788..c273ce7 100644
--- a/Include/tupleobject.h
+++ b/Include/tupleobject.h
@@ -63,6 +63,9 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *);
#endif
PyAPI_FUNC(int) PyTuple_ClearFreeList(void);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out);
+#endif /* Py_LIMITED_API */
#ifdef __cplusplus
}
diff --git a/Include/ucnhash.h b/Include/ucnhash.h
index 70fdf13..8de9ba0 100644
--- a/Include/ucnhash.h
+++ b/Include/ucnhash.h
@@ -19,11 +19,13 @@ typedef struct {
success, zero if not. Does not set Python exceptions.
If self is NULL, data come from the default version of the database.
If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */
- int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen);
+ int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
+ int with_alias_and_seq);
/* Get character code for a given name. Same error handling
as for getname. */
- int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code);
+ int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code,
+ int with_named_seq);
} _PyUnicode_Name_CAPI;
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index 379a90c..a8f5b5d 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -64,16 +64,15 @@ Copyright (c) Corporation for National Research Initiatives.
/* Python 3.x requires unicode */
#define Py_USING_UNICODE
-/* FIXME: MvL's new implementation assumes that Py_UNICODE_SIZE is
- properly set, but the default rules below doesn't set it. I'll
- sort this out some other day -- fredrik@pythonware.com */
-
-#ifndef Py_UNICODE_SIZE
-#error Must define Py_UNICODE_SIZE
+#ifndef SIZEOF_WCHAR_T
+#error Must define SIZEOF_WCHAR_T
#endif
-/* Setting Py_UNICODE_WIDE enables UCS-4 storage. Otherwise, Unicode
- strings are stored as UCS-2 (with limited support for UTF-16) */
+#define Py_UNICODE_SIZE SIZEOF_WCHAR_T
+
+/* If wchar_t can be used for UCS-4 storage, set Py_UNICODE_WIDE.
+ Otherwise, Unicode strings are stored as UCS-2 (with limited support
+ for UTF-16) */
#if Py_UNICODE_SIZE >= 4
#define Py_UNICODE_WIDE
@@ -84,19 +83,14 @@ Copyright (c) Corporation for National Research Initiatives.
/* #define HAVE_WCHAR_H */
/* #define HAVE_USABLE_WCHAR_T */
-/* Defaults for various platforms */
-#ifndef PY_UNICODE_TYPE
-
-/* Windows has a usable wchar_t type (unless we're using UCS-4) */
-# if defined(MS_WIN32) && Py_UNICODE_SIZE == 2
-# define HAVE_USABLE_WCHAR_T
-# define PY_UNICODE_TYPE wchar_t
-# endif
-
-# if defined(Py_UNICODE_WIDE)
-# define PY_UNICODE_TYPE Py_UCS4
-# endif
+/* Py_UNICODE was the native Unicode storage format (code unit) used by
+ Python and represents a single Unicode element in the Unicode type.
+ With PEP 393, Py_UNICODE is deprecated and replaced with a
+ typedef to wchar_t. */
+#ifndef Py_LIMITED_API
+#define PY_UNICODE_TYPE wchar_t
+typedef wchar_t Py_UNICODE;
#endif
/* If the compiler provides a wchar_t type we try to support it
@@ -109,6 +103,10 @@ Copyright (c) Corporation for National Research Initiatives.
# endif
#endif
+#if defined(MS_WINDOWS)
+# define HAVE_MBCS
+#endif
+
#ifdef HAVE_WCHAR_H
/* Work around a cosmetic bug in BSDI 4.x wchar.h; thanks to Thomas Wouters */
# ifdef _HAVE_BSDI
@@ -117,201 +115,24 @@ Copyright (c) Corporation for National Research Initiatives.
# include <wchar.h>
#endif
-/*
- * Use this typedef when you need to represent a UTF-16 surrogate pair
- * as single unsigned integer.
- */
-#if SIZEOF_INT >= 4
+/* Py_UCS4 and Py_UCS2 are typedefs for the respective
+ unicode representations. */
+#if SIZEOF_INT == 4
typedef unsigned int Py_UCS4;
-#elif SIZEOF_LONG >= 4
+#elif SIZEOF_LONG == 4
typedef unsigned long Py_UCS4;
+#else
+#error "Could not find a proper typedef for Py_UCS4"
#endif
-/* Py_UNICODE is the native Unicode storage format (code unit) used by
- Python and represents a single Unicode element in the Unicode
- type. */
-
-#ifndef Py_LIMITED_API
-typedef PY_UNICODE_TYPE Py_UNICODE;
-#endif
-
-/* --- UCS-2/UCS-4 Name Mangling ------------------------------------------ */
-
-/* Unicode API names are mangled to assure that UCS-2 and UCS-4 builds
- produce different external names and thus cause import errors in
- case Python interpreters and extensions with mixed compiled in
- Unicode width assumptions are combined. */
-
-#ifndef Py_UNICODE_WIDE
-
-# define PyUnicode_AsASCIIString PyUnicodeUCS2_AsASCIIString
-# define PyUnicode_AsCharmapString PyUnicodeUCS2_AsCharmapString
-# define PyUnicode_AsDecodedObject PyUnicodeUCS2_AsDecodedObject
-# define PyUnicode_AsDecodedUnicode PyUnicodeUCS2_AsDecodedUnicode
-# define PyUnicode_AsEncodedObject PyUnicodeUCS2_AsEncodedObject
-# define PyUnicode_AsEncodedString PyUnicodeUCS2_AsEncodedString
-# define PyUnicode_AsEncodedUnicode PyUnicodeUCS2_AsEncodedUnicode
-# define PyUnicode_AsLatin1String PyUnicodeUCS2_AsLatin1String
-# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS2_AsRawUnicodeEscapeString
-# define PyUnicode_AsUTF32String PyUnicodeUCS2_AsUTF32String
-# define PyUnicode_AsUTF16String PyUnicodeUCS2_AsUTF16String
-# define PyUnicode_AsUTF8String PyUnicodeUCS2_AsUTF8String
-# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode
-# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString
-# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar
-# define PyUnicode_AsWideCharString PyUnicodeUCS2_AsWideCharString
-# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
-# define PyUnicode_Compare PyUnicodeUCS2_Compare
-# define PyUnicode_CompareWithASCIIString PyUnicodeUCS2_CompareWithASCIIString
-# define PyUnicode_Concat PyUnicodeUCS2_Concat
-# define PyUnicode_Append PyUnicodeUCS2_Append
-# define PyUnicode_AppendAndDel PyUnicodeUCS2_AppendAndDel
-# define PyUnicode_Contains PyUnicodeUCS2_Contains
-# define PyUnicode_Count PyUnicodeUCS2_Count
-# define PyUnicode_Decode PyUnicodeUCS2_Decode
-# define PyUnicode_DecodeASCII PyUnicodeUCS2_DecodeASCII
-# define PyUnicode_DecodeCharmap PyUnicodeUCS2_DecodeCharmap
-# define PyUnicode_DecodeLatin1 PyUnicodeUCS2_DecodeLatin1
-# define PyUnicode_DecodeFSDefault PyUnicodeUCS2_DecodeFSDefault
-# define PyUnicode_DecodeFSDefaultAndSize PyUnicodeUCS2_DecodeFSDefaultAndSize
-# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS2_DecodeRawUnicodeEscape
-# define PyUnicode_DecodeUTF32 PyUnicodeUCS2_DecodeUTF32
-# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS2_DecodeUTF32Stateful
-# define PyUnicode_DecodeUTF16 PyUnicodeUCS2_DecodeUTF16
-# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS2_DecodeUTF16Stateful
-# define PyUnicode_DecodeUTF8 PyUnicodeUCS2_DecodeUTF8
-# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS2_DecodeUTF8Stateful
-# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS2_DecodeUnicodeEscape
-# define PyUnicode_Encode PyUnicodeUCS2_Encode
-# define PyUnicode_EncodeASCII PyUnicodeUCS2_EncodeASCII
-# define PyUnicode_EncodeCharmap PyUnicodeUCS2_EncodeCharmap
-# define PyUnicode_EncodeDecimal PyUnicodeUCS2_EncodeDecimal
-# define PyUnicode_EncodeLatin1 PyUnicodeUCS2_EncodeLatin1
-# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS2_EncodeRawUnicodeEscape
-# define PyUnicode_EncodeUTF32 PyUnicodeUCS2_EncodeUTF32
-# define PyUnicode_EncodeUTF16 PyUnicodeUCS2_EncodeUTF16
-# define PyUnicode_EncodeUTF8 PyUnicodeUCS2_EncodeUTF8
-# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS2_EncodeUnicodeEscape
-# define PyUnicode_Find PyUnicodeUCS2_Find
-# define PyUnicode_Format PyUnicodeUCS2_Format
-# define PyUnicode_FromEncodedObject PyUnicodeUCS2_FromEncodedObject
-# define PyUnicode_FromFormat PyUnicodeUCS2_FromFormat
-# define PyUnicode_FromFormatV PyUnicodeUCS2_FromFormatV
-# define PyUnicode_FromObject PyUnicodeUCS2_FromObject
-# define PyUnicode_FromOrdinal PyUnicodeUCS2_FromOrdinal
-# define PyUnicode_FromString PyUnicodeUCS2_FromString
-# define PyUnicode_FromStringAndSize PyUnicodeUCS2_FromStringAndSize
-# define PyUnicode_FromUnicode PyUnicodeUCS2_FromUnicode
-# define PyUnicode_FromWideChar PyUnicodeUCS2_FromWideChar
-# define PyUnicode_FSConverter PyUnicodeUCS2_FSConverter
-# define PyUnicode_FSDecoder PyUnicodeUCS2_FSDecoder
-# define PyUnicode_GetDefaultEncoding PyUnicodeUCS2_GetDefaultEncoding
-# define PyUnicode_GetMax PyUnicodeUCS2_GetMax
-# define PyUnicode_GetSize PyUnicodeUCS2_GetSize
-# define PyUnicode_IsIdentifier PyUnicodeUCS2_IsIdentifier
-# define PyUnicode_Join PyUnicodeUCS2_Join
-# define PyUnicode_Partition PyUnicodeUCS2_Partition
-# define PyUnicode_RPartition PyUnicodeUCS2_RPartition
-# define PyUnicode_RSplit PyUnicodeUCS2_RSplit
-# define PyUnicode_Replace PyUnicodeUCS2_Replace
-# define PyUnicode_Resize PyUnicodeUCS2_Resize
-# define PyUnicode_RichCompare PyUnicodeUCS2_RichCompare
-# define PyUnicode_Split PyUnicodeUCS2_Split
-# define PyUnicode_Splitlines PyUnicodeUCS2_Splitlines
-# define PyUnicode_Tailmatch PyUnicodeUCS2_Tailmatch
-# define PyUnicode_Translate PyUnicodeUCS2_Translate
-# define PyUnicode_TranslateCharmap PyUnicodeUCS2_TranslateCharmap
-# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS2_AsDefaultEncodedString
-# define _PyUnicode_Fini _PyUnicodeUCS2_Fini
-# define _PyUnicode_Init _PyUnicodeUCS2_Init
-# define PyUnicode_strdup PyUnicodeUCS2_strdup
-
+#if SIZEOF_SHORT == 2
+typedef unsigned short Py_UCS2;
#else
-
-# define PyUnicode_AsASCIIString PyUnicodeUCS4_AsASCIIString
-# define PyUnicode_AsCharmapString PyUnicodeUCS4_AsCharmapString
-# define PyUnicode_AsDecodedObject PyUnicodeUCS4_AsDecodedObject
-# define PyUnicode_AsDecodedUnicode PyUnicodeUCS4_AsDecodedUnicode
-# define PyUnicode_AsEncodedObject PyUnicodeUCS4_AsEncodedObject
-# define PyUnicode_AsEncodedString PyUnicodeUCS4_AsEncodedString
-# define PyUnicode_AsEncodedUnicode PyUnicodeUCS4_AsEncodedUnicode
-# define PyUnicode_AsLatin1String PyUnicodeUCS4_AsLatin1String
-# define PyUnicode_AsRawUnicodeEscapeString PyUnicodeUCS4_AsRawUnicodeEscapeString
-# define PyUnicode_AsUTF32String PyUnicodeUCS4_AsUTF32String
-# define PyUnicode_AsUTF16String PyUnicodeUCS4_AsUTF16String
-# define PyUnicode_AsUTF8String PyUnicodeUCS4_AsUTF8String
-# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode
-# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString
-# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar
-# define PyUnicode_AsWideCharString PyUnicodeUCS4_AsWideCharString
-# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist
-# define PyUnicode_Compare PyUnicodeUCS4_Compare
-# define PyUnicode_CompareWithASCIIString PyUnicodeUCS4_CompareWithASCIIString
-# define PyUnicode_Concat PyUnicodeUCS4_Concat
-# define PyUnicode_Append PyUnicodeUCS4_Append
-# define PyUnicode_AppendAndDel PyUnicodeUCS4_AppendAndDel
-# define PyUnicode_Contains PyUnicodeUCS4_Contains
-# define PyUnicode_Count PyUnicodeUCS4_Count
-# define PyUnicode_Decode PyUnicodeUCS4_Decode
-# define PyUnicode_DecodeASCII PyUnicodeUCS4_DecodeASCII
-# define PyUnicode_DecodeCharmap PyUnicodeUCS4_DecodeCharmap
-# define PyUnicode_DecodeLatin1 PyUnicodeUCS4_DecodeLatin1
-# define PyUnicode_DecodeFSDefault PyUnicodeUCS4_DecodeFSDefault
-# define PyUnicode_DecodeFSDefaultAndSize PyUnicodeUCS4_DecodeFSDefaultAndSize
-# define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS4_DecodeRawUnicodeEscape
-# define PyUnicode_DecodeUTF32 PyUnicodeUCS4_DecodeUTF32
-# define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS4_DecodeUTF32Stateful
-# define PyUnicode_DecodeUTF16 PyUnicodeUCS4_DecodeUTF16
-# define PyUnicode_DecodeUTF16Stateful PyUnicodeUCS4_DecodeUTF16Stateful
-# define PyUnicode_DecodeUTF8 PyUnicodeUCS4_DecodeUTF8
-# define PyUnicode_DecodeUTF8Stateful PyUnicodeUCS4_DecodeUTF8Stateful
-# define PyUnicode_DecodeUnicodeEscape PyUnicodeUCS4_DecodeUnicodeEscape
-# define PyUnicode_Encode PyUnicodeUCS4_Encode
-# define PyUnicode_EncodeASCII PyUnicodeUCS4_EncodeASCII
-# define PyUnicode_EncodeCharmap PyUnicodeUCS4_EncodeCharmap
-# define PyUnicode_EncodeDecimal PyUnicodeUCS4_EncodeDecimal
-# define PyUnicode_EncodeLatin1 PyUnicodeUCS4_EncodeLatin1
-# define PyUnicode_EncodeRawUnicodeEscape PyUnicodeUCS4_EncodeRawUnicodeEscape
-# define PyUnicode_EncodeUTF32 PyUnicodeUCS4_EncodeUTF32
-# define PyUnicode_EncodeUTF16 PyUnicodeUCS4_EncodeUTF16
-# define PyUnicode_EncodeUTF8 PyUnicodeUCS4_EncodeUTF8
-# define PyUnicode_EncodeUnicodeEscape PyUnicodeUCS4_EncodeUnicodeEscape
-# define PyUnicode_Find PyUnicodeUCS4_Find
-# define PyUnicode_Format PyUnicodeUCS4_Format
-# define PyUnicode_FromEncodedObject PyUnicodeUCS4_FromEncodedObject
-# define PyUnicode_FromFormat PyUnicodeUCS4_FromFormat
-# define PyUnicode_FromFormatV PyUnicodeUCS4_FromFormatV
-# define PyUnicode_FromObject PyUnicodeUCS4_FromObject
-# define PyUnicode_FromOrdinal PyUnicodeUCS4_FromOrdinal
-# define PyUnicode_FromString PyUnicodeUCS4_FromString
-# define PyUnicode_FromStringAndSize PyUnicodeUCS4_FromStringAndSize
-# define PyUnicode_FromUnicode PyUnicodeUCS4_FromUnicode
-# define PyUnicode_FromWideChar PyUnicodeUCS4_FromWideChar
-# define PyUnicode_FSConverter PyUnicodeUCS4_FSConverter
-# define PyUnicode_FSDecoder PyUnicodeUCS4_FSDecoder
-# define PyUnicode_GetDefaultEncoding PyUnicodeUCS4_GetDefaultEncoding
-# define PyUnicode_GetMax PyUnicodeUCS4_GetMax
-# define PyUnicode_GetSize PyUnicodeUCS4_GetSize
-# define PyUnicode_IsIdentifier PyUnicodeUCS4_IsIdentifier
-# define PyUnicode_Join PyUnicodeUCS4_Join
-# define PyUnicode_Partition PyUnicodeUCS4_Partition
-# define PyUnicode_RPartition PyUnicodeUCS4_RPartition
-# define PyUnicode_RSplit PyUnicodeUCS4_RSplit
-# define PyUnicode_Replace PyUnicodeUCS4_Replace
-# define PyUnicode_Resize PyUnicodeUCS4_Resize
-# define PyUnicode_RichCompare PyUnicodeUCS4_RichCompare
-# define PyUnicode_Split PyUnicodeUCS4_Split
-# define PyUnicode_Splitlines PyUnicodeUCS4_Splitlines
-# define PyUnicode_Tailmatch PyUnicodeUCS4_Tailmatch
-# define PyUnicode_Translate PyUnicodeUCS4_Translate
-# define PyUnicode_TranslateCharmap PyUnicodeUCS4_TranslateCharmap
-# define _PyUnicode_AsDefaultEncodedString _PyUnicodeUCS4_AsDefaultEncodedString
-# define _PyUnicode_Fini _PyUnicodeUCS4_Fini
-# define _PyUnicode_Init _PyUnicodeUCS4_Init
-# define PyUnicode_strdup PyUnicodeUCS4_strdup
-
+#error "Could not find a proper typedef for Py_UCS2"
#endif
+typedef unsigned char Py_UCS1;
+
/* --- Internal Unicode Operations ---------------------------------------- */
/* Since splitting on whitespace is an important use case, and
@@ -350,7 +171,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
Py_UNICODE_ISDIGIT(ch) || \
Py_UNICODE_ISNUMERIC(ch))
-#define Py_UNICODE_COPY(target, source, length) \
+#define Py_UNICODE_COPY(target, source, length) \
Py_MEMCPY((target), (source), (length)*sizeof(Py_UNICODE))
#define Py_UNICODE_FILL(target, value, length) \
@@ -358,13 +179,27 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\
} while (0)
+/* macros to work with surrogates */
+#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= ch && ch <= 0xDFFF)
+#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= ch && ch <= 0xDBFF)
+#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= ch && ch <= 0xDFFF)
+/* Join two surrogate characters and return a single Py_UCS4 value. */
+#define Py_UNICODE_JOIN_SURROGATES(high, low) \
+ (((((Py_UCS4)(high) & 0x03FF) << 10) | \
+ ((Py_UCS4)(low) & 0x03FF)) + 0x10000)
+/* high surrogate = top 10 bits added to D800 */
+#define Py_UNICODE_HIGH_SURROGATE(ch) (0xD800 - (0x10000 >> 10) + ((ch) >> 10))
+/* low surrogate = bottom 10 bits added to DC00 */
+#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF))
+
/* Check if substring matches at given offset. The offset must be
valid, and the substring must not be empty. */
#define Py_UNICODE_MATCH(string, offset, substring) \
- ((*((string)->str + (offset)) == *((substring)->str)) && \
- ((*((string)->str + (offset) + (substring)->length-1) == *((substring)->str + (substring)->length-1))) && \
- !memcmp((string)->str + (offset), (substring)->str, (substring)->length*sizeof(Py_UNICODE)))
+ ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \
+ ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \
+ !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE)))
+
#endif /* Py_LIMITED_API */
#ifdef __cplusplus
@@ -374,41 +209,374 @@ extern "C" {
/* --- Unicode Type ------------------------------------------------------- */
#ifndef Py_LIMITED_API
+
+/* ASCII-only strings created through PyUnicode_New use the PyASCIIObject
+ structure. state.ascii and state.compact are set, and the data
+ immediately follow the structure. utf8_length and wstr_length can be found
+ in the length field; the utf8 pointer is equal to the data pointer. */
typedef struct {
+ /* There are 4 forms of Unicode strings:
+
+ - compact ascii:
+
+ * structure = PyASCIIObject
+ * test: PyUnicode_IS_COMPACT_ASCII(op)
+ * kind = PyUnicode_1BYTE_KIND
+ * compact = 1
+ * ascii = 1
+ * ready = 1
+ * (length is the length of the utf8 and wstr strings)
+ * (data starts just after the structure)
+ * (since ASCII is decoded from UTF-8, the utf8 string are the data)
+
+ - compact:
+
+ * structure = PyCompactUnicodeObject
+ * test: PyUnicode_IS_COMPACT(op) && !PyUnicode_IS_ASCII(op)
+ * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or
+ PyUnicode_4BYTE_KIND
+ * compact = 1
+ * ready = 1
+ * ascii = 0
+ * utf8 is not shared with data
+ * utf8_length = 0 if utf8 is NULL
+ * wstr is shared with data and wstr_length=length
+ if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2
+ or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_t)=4
+ * wstr_length = 0 if wstr is NULL
+ * (data starts just after the structure)
+
+ - legacy string, not ready:
+
+ * structure = PyUnicodeObject
+ * test: kind == PyUnicode_WCHAR_KIND
+ * length = 0 (use wstr_length)
+ * hash = -1
+ * kind = PyUnicode_WCHAR_KIND
+ * compact = 0
+ * ascii = 0
+ * ready = 0
+ * interned = SSTATE_NOT_INTERNED
+ * wstr is not NULL
+ * data.any is NULL
+ * utf8 is NULL
+ * utf8_length = 0
+
+ - legacy string, ready:
+
+ * structure = PyUnicodeObject structure
+ * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND
+ * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or
+ PyUnicode_4BYTE_KIND
+ * compact = 0
+ * ready = 1
+ * data.any is not NULL
+ * utf8 is shared and utf8_length = length with data.any if ascii = 1
+ * utf8_length = 0 if utf8 is NULL
+ * wstr is shared with data.any and wstr_length = length
+ if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2
+ or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4
+ * wstr_length = 0 if wstr is NULL
+
+ Compact strings use only one memory block (structure + characters),
+ whereas legacy strings use one block for the structure and one block
+ for characters.
+
+ Legacy strings are created by PyUnicode_FromUnicode() and
+ PyUnicode_FromStringAndSize(NULL, size) functions. They become ready
+ when PyUnicode_READY() is called.
+
+ See also _PyUnicode_CheckConsistency().
+ */
PyObject_HEAD
- Py_ssize_t length; /* Length of raw Unicode data in buffer */
- Py_UNICODE *str; /* Raw Unicode buffer */
+ Py_ssize_t length; /* Number of code points in the string */
Py_hash_t hash; /* Hash value; -1 if not set */
- int state; /* != 0 if interned. In this case the two
- * references from the dictionary to this object
- * are *not* counted in ob_refcnt. */
- PyObject *defenc; /* (Default) Encoded version as Python
- string, or NULL; this is used for
- implementing the buffer protocol */
+ struct {
+ /*
+ SSTATE_NOT_INTERNED (0)
+ SSTATE_INTERNED_MORTAL (1)
+ SSTATE_INTERNED_IMMORTAL (2)
+
+ If interned != SSTATE_NOT_INTERNED, the two references from the
+ dictionary to this object are *not* counted in ob_refcnt.
+ */
+ unsigned int interned:2;
+ /* Character size:
+
+ - PyUnicode_WCHAR_KIND (0):
+
+ * character type = wchar_t (16 or 32 bits, depending on the
+ platform)
+
+ - PyUnicode_1BYTE_KIND (1):
+
+ * character type = Py_UCS1 (8 bits, unsigned)
+ * all characters are in the range U+0000-U+00FF (latin1)
+ * if ascii is set, all characters are in the range U+0000-U+007F
+ (ASCII), otherwise at least one character is in the range
+ U+0080-U+00FF
+
+ - PyUnicode_2BYTE_KIND (2):
+
+ * character type = Py_UCS2 (16 bits, unsigned)
+ * all characters are in the range U+0000-U+FFFF (BMP)
+ * at least one character is in the range U+0100-U+FFFF
+
+ - PyUnicode_4BYTE_KIND (4):
+
+ * character type = Py_UCS4 (32 bits, unsigned)
+ * all characters are in the range U+0000-U+10FFFF
+ * at least one character is in the range U+10000-U+10FFFF
+ */
+ unsigned int kind:3;
+ /* Compact is with respect to the allocation scheme. Compact unicode
+ objects only require one memory block while non-compact objects use
+ one block for the PyUnicodeObject struct and another for its data
+ buffer. */
+ unsigned int compact:1;
+ /* The string only contains characters in the range U+0000-U+007F (ASCII)
+ and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is
+ set, use the PyASCIIObject structure. */
+ unsigned int ascii:1;
+ /* The ready flag indicates whether the object layout is initialized
+ completely. This means that this is either a compact object, or
+ the data pointer is filled out. The bit is redundant, and helps
+ to minimize the test in PyUnicode_IS_READY(). */
+ unsigned int ready:1;
+ } state;
+ wchar_t *wstr; /* wchar_t representation (null-terminated) */
+} PyASCIIObject;
+
+/* Non-ASCII strings allocated through PyUnicode_New use the
+ PyCompactUnicodeObject structure. state.compact is set, and the data
+ immediately follow the structure. */
+typedef struct {
+ PyASCIIObject _base;
+ Py_ssize_t utf8_length; /* Number of bytes in utf8, excluding the
+ * terminating \0. */
+ char *utf8; /* UTF-8 representation (null-terminated) */
+ Py_ssize_t wstr_length; /* Number of code points in wstr, possible
+ * surrogates count as two code points. */
+} PyCompactUnicodeObject;
+
+/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the
+ PyUnicodeObject structure. The actual string data is initially in the wstr
+ block, and copied into the data block using _PyUnicode_Ready. */
+typedef struct {
+ PyCompactUnicodeObject _base;
+ union {
+ void *any;
+ Py_UCS1 *latin1;
+ Py_UCS2 *ucs2;
+ Py_UCS4 *ucs4;
+ } data; /* Canonical, smallest-form Unicode buffer */
} PyUnicodeObject;
#endif
PyAPI_DATA(PyTypeObject) PyUnicode_Type;
PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
-#define SSTATE_NOT_INTERNED 0
-#define SSTATE_INTERNED_MORTAL 1
-#define SSTATE_INTERNED_IMMORTAL 2
-
#define PyUnicode_Check(op) \
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS)
#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type)
/* Fast access macros */
#ifndef Py_LIMITED_API
-#define PyUnicode_GET_SIZE(op) \
- (assert(PyUnicode_Check(op)),(((PyUnicodeObject *)(op))->length))
+
+#define PyUnicode_WSTR_LENGTH(op) \
+ (PyUnicode_IS_COMPACT_ASCII(op) ? \
+ ((PyASCIIObject*)op)->length : \
+ ((PyCompactUnicodeObject*)op)->wstr_length)
+
+/* Returns the deprecated Py_UNICODE representation's size in code units
+ (this includes surrogate pairs as 2 units).
+ If the Py_UNICODE representation is not available, it will be computed
+ on request. Use PyUnicode_GET_LENGTH() for the length in code points. */
+
+#define PyUnicode_GET_SIZE(op) \
+ (assert(PyUnicode_Check(op)), \
+ (((PyASCIIObject *)(op))->wstr) ? \
+ PyUnicode_WSTR_LENGTH(op) : \
+ ((void)PyUnicode_AsUnicode((PyObject *)(op)), \
+ assert(((PyASCIIObject *)(op))->wstr), \
+ PyUnicode_WSTR_LENGTH(op)))
+
#define PyUnicode_GET_DATA_SIZE(op) \
- (assert(PyUnicode_Check(op)),(((PyUnicodeObject *)(op))->length * sizeof(Py_UNICODE)))
+ (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE)
+
+/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE
+ representation on demand. Using this macro is very inefficient now,
+ try to port your code to use the new PyUnicode_*BYTE_DATA() macros or
+ use PyUnicode_WRITE() and PyUnicode_READ(). */
+
#define PyUnicode_AS_UNICODE(op) \
- (assert(PyUnicode_Check(op)),(((PyUnicodeObject *)(op))->str))
+ (assert(PyUnicode_Check(op)), \
+ (((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \
+ PyUnicode_AsUnicode((PyObject *)(op)))
+
#define PyUnicode_AS_DATA(op) \
- (assert(PyUnicode_Check(op)),((const char *)((PyUnicodeObject *)(op))->str))
+ ((const char *)(PyUnicode_AS_UNICODE(op)))
+
+
+/* --- Flexible String Representation Helper Macros (PEP 393) -------------- */
+
+/* Values for PyASCIIObject.state: */
+
+/* Interning state. */
+#define SSTATE_NOT_INTERNED 0
+#define SSTATE_INTERNED_MORTAL 1
+#define SSTATE_INTERNED_IMMORTAL 2
+
+/* Return true if the string contains only ASCII characters, or 0 if not. The
+ string may be compact (PyUnicode_IS_COMPACT_ASCII) or not, but must be
+ ready. */
+#define PyUnicode_IS_ASCII(op) \
+ (assert(PyUnicode_Check(op)), \
+ assert(PyUnicode_IS_READY(op)), \
+ ((PyASCIIObject*)op)->state.ascii)
+
+/* Return true if the string is compact or 0 if not.
+ No type checks or Ready calls are performed. */
+#define PyUnicode_IS_COMPACT(op) \
+ (((PyASCIIObject*)(op))->state.compact)
+
+/* Return true if the string is a compact ASCII string (use PyASCIIObject
+ structure), or 0 if not. No type checks or Ready calls are performed. */
+#define PyUnicode_IS_COMPACT_ASCII(op) \
+ (((PyASCIIObject*)op)->state.ascii && PyUnicode_IS_COMPACT(op))
+
+enum PyUnicode_Kind {
+/* String contains only wstr byte characters. This is only possible
+ when the string was created with a legacy API and _PyUnicode_Ready()
+ has not been called yet. */
+ PyUnicode_WCHAR_KIND = 0,
+/* Return values of the PyUnicode_KIND() macro: */
+ PyUnicode_1BYTE_KIND = 1,
+ PyUnicode_2BYTE_KIND = 2,
+ PyUnicode_4BYTE_KIND = 4
+};
+
+/* Return pointers to the canonical representation cast to unsigned char,
+ Py_UCS2, or Py_UCS4 for direct character access.
+ No checks are performed, use PyUnicode_KIND() before to ensure
+ these will work correctly. */
+
+#define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op))
+#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op))
+#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op))
+
+/* Return one of the PyUnicode_*_KIND values defined above. */
+#define PyUnicode_KIND(op) \
+ (assert(PyUnicode_Check(op)), \
+ assert(PyUnicode_IS_READY(op)), \
+ ((PyASCIIObject *)(op))->state.kind)
+
+/* Return a void pointer to the raw unicode buffer. */
+#define _PyUnicode_COMPACT_DATA(op) \
+ (PyUnicode_IS_ASCII(op) ? \
+ ((void*)((PyASCIIObject*)(op) + 1)) : \
+ ((void*)((PyCompactUnicodeObject*)(op) + 1)))
+
+#define _PyUnicode_NONCOMPACT_DATA(op) \
+ (assert(((PyUnicodeObject*)(op))->data.any), \
+ ((((PyUnicodeObject *)(op))->data.any)))
+
+#define PyUnicode_DATA(op) \
+ (assert(PyUnicode_Check(op)), \
+ PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \
+ _PyUnicode_NONCOMPACT_DATA(op))
+
+/* In the access macros below, "kind" may be evaluated more than once.
+ All other macro parameters are evaluated exactly once, so it is safe
+ to put side effects into them (such as increasing the index). */
+
+/* Write into the canonical representation, this macro does not do any sanity
+ checks and is intended for usage in loops. The caller should cache the
+ kind and data pointers obtained from other macro calls.
+ index is the index in the string (starts at 0) and value is the new
+ code point value which should be written to that location. */
+#define PyUnicode_WRITE(kind, data, index, value) \
+ do { \
+ switch ((kind)) { \
+ case PyUnicode_1BYTE_KIND: { \
+ ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \
+ break; \
+ } \
+ case PyUnicode_2BYTE_KIND: { \
+ ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \
+ break; \
+ } \
+ default: { \
+ assert((kind) == PyUnicode_4BYTE_KIND); \
+ ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \
+ } \
+ } \
+ } while (0)
+
+/* Read a code point from the string's canonical representation. No checks
+ or ready calls are performed. */
+#define PyUnicode_READ(kind, data, index) \
+ ((Py_UCS4) \
+ ((kind) == PyUnicode_1BYTE_KIND ? \
+ ((const Py_UCS1 *)(data))[(index)] : \
+ ((kind) == PyUnicode_2BYTE_KIND ? \
+ ((const Py_UCS2 *)(data))[(index)] : \
+ ((const Py_UCS4 *)(data))[(index)] \
+ ) \
+ ))
+
+/* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it
+ calls PyUnicode_KIND() and might call it twice. For single reads, use
+ PyUnicode_READ_CHAR, for multiple consecutive reads callers should
+ cache kind and use PyUnicode_READ instead. */
+#define PyUnicode_READ_CHAR(unicode, index) \
+ (assert(PyUnicode_Check(unicode)), \
+ assert(PyUnicode_IS_READY(unicode)), \
+ (Py_UCS4) \
+ (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \
+ ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \
+ (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \
+ ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \
+ ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \
+ ) \
+ ))
+
+/* Returns the length of the unicode string. The caller has to make sure that
+ the string has it's canonical representation set before calling
+ this macro. Call PyUnicode_(FAST_)Ready to ensure that. */
+#define PyUnicode_GET_LENGTH(op) \
+ (assert(PyUnicode_Check(op)), \
+ assert(PyUnicode_IS_READY(op)), \
+ ((PyASCIIObject *)(op))->length)
+
+
+/* Fast check to determine whether an object is ready. Equivalent to
+ PyUnicode_IS_COMPACT(op) || ((PyUnicodeObject*)(op))->data.any) */
+
+#define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready)
+
+/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best
+ case. If the canonical representation is not yet set, it will still call
+ _PyUnicode_Ready().
+ Returns 0 on success and -1 on errors. */
+#define PyUnicode_READY(op) \
+ (assert(PyUnicode_Check(op)), \
+ (PyUnicode_IS_READY(op) ? \
+ 0 : _PyUnicode_Ready((PyObject *)(op))))
+
+/* Return a maximum character value which is suitable for creating another
+ string based on op. This is always an approximation but more efficient
+ than iterating over the string. */
+#define PyUnicode_MAX_CHAR_VALUE(op) \
+ (assert(PyUnicode_IS_READY(op)), \
+ (PyUnicode_IS_ASCII(op) ? \
+ (0x7f) : \
+ (PyUnicode_KIND(op) == PyUnicode_1BYTE_KIND ? \
+ (0xffU) : \
+ (PyUnicode_KIND(op) == PyUnicode_2BYTE_KIND ? \
+ (0xffffU) : \
+ (0x10ffffU)))))
+
#endif
/* --- Constants ---------------------------------------------------------- */
@@ -418,12 +586,107 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
Unicode character U+FFFD is the official REPLACEMENT CHARACTER in
Unicode 3.0. */
-#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD)
+#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UCS4) 0xFFFD)
/* === Public API ========================================================= */
/* --- Plain Py_UNICODE --------------------------------------------------- */
+/* With PEP 393, this is the recommended way to allocate a new unicode object.
+ This function will allocate the object and its buffer in a single memory
+ block. Objects created using this function are not resizable. */
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) PyUnicode_New(
+ Py_ssize_t size, /* Number of code points in the new string */
+ Py_UCS4 maxchar /* maximum code point value in the string */
+ );
+#endif
+
+/* Initializes the canonical string representation from a the deprecated
+ wstr/Py_UNICODE representation. This function is used to convert Unicode
+ objects which were created using the old API to the new flexible format
+ introduced with PEP 393.
+
+ Don't call this function directly, use the public PyUnicode_READY() macro
+ instead. */
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(int) _PyUnicode_Ready(
+ PyObject *unicode /* Unicode object */
+ );
+#endif
+
+/* Get a copy of a Unicode string. */
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) _PyUnicode_Copy(
+ PyObject *unicode
+ );
+#endif
+
+/* Copy character from one unicode object into another, this function performs
+ character conversion when necessary and falls back to memcpy() if possible.
+
+ Fail if to is too small (smaller than *how_many* or smaller than
+ len(from)-from_start), or if kind(from[from_start:from_start+how_many]) >
+ kind(to), or if *to* has more than 1 reference.
+
+ Return the number of written character, or return -1 and raise an exception
+ on error.
+
+ Pseudo-code:
+
+ how_many = min(how_many, len(from) - from_start)
+ to[to_start:to_start+how_many] = from[from_start:from_start+how_many]
+ return how_many
+
+ Note: The function doesn't write a terminating null character.
+ */
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(Py_ssize_t) PyUnicode_CopyCharacters(
+ PyObject *to,
+ Py_ssize_t to_start,
+ PyObject *from,
+ Py_ssize_t from_start,
+ Py_ssize_t how_many
+ );
+
+/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so
+ may crash if parameters are invalid (e.g. if the output string
+ is too short). */
+PyAPI_FUNC(void) _PyUnicode_FastCopyCharacters(
+ PyObject *to,
+ Py_ssize_t to_start,
+ PyObject *from,
+ Py_ssize_t from_start,
+ Py_ssize_t how_many
+ );
+#endif
+
+#ifndef Py_LIMITED_API
+/* Fill a string with a character: write fill_char into
+ unicode[start:start+length].
+
+ Fail if fill_char is bigger than the string maximum character, or if the
+ string has more than 1 reference.
+
+ Return the number of written character, or return -1 and raise an exception
+ on error. */
+PyAPI_FUNC(Py_ssize_t) PyUnicode_Fill(
+ PyObject *unicode,
+ Py_ssize_t start,
+ Py_ssize_t length,
+ Py_UCS4 fill_char
+ );
+
+/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash
+ if parameters are invalid (e.g. if length is longer than the string). */
+PyAPI_FUNC(void) _PyUnicode_FastFill(
+ PyObject *unicode,
+ Py_ssize_t start,
+ Py_ssize_t length,
+ Py_UCS4 fill_char
+ );
+#endif
+
/* Create a Unicode Object from the Py_UNICODE buffer u of the given
size.
@@ -448,13 +711,60 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize(
);
/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated
- UTF-8 encoded bytes */
+ UTF-8 encoded bytes. The size is determined with strlen(). */
PyAPI_FUNC(PyObject*) PyUnicode_FromString(
const char *u /* UTF-8 encoded string */
);
+#ifndef Py_LIMITED_API
+/* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters.
+ Scan the string to find the maximum character. */
+PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData(
+ int kind,
+ const void *buffer,
+ Py_ssize_t size);
+
+/* Create a new string from a buffer of ASCII characters.
+ WARNING: Don't check if the string contains any non-ASCII character. */
+PyAPI_FUNC(PyObject*) _PyUnicode_FromASCII(
+ const char *buffer,
+ Py_ssize_t size);
+#endif
+
+PyAPI_FUNC(PyObject*) PyUnicode_Substring(
+ PyObject *str,
+ Py_ssize_t start,
+ Py_ssize_t end);
+
+#ifndef Py_LIMITED_API
+/* Compute the maximum character of the substring unicode[start:end].
+ Return 127 for an empty string. */
+PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar (
+ PyObject *unicode,
+ Py_ssize_t start,
+ Py_ssize_t end);
+#endif
+
+/* Copy the string into a UCS4 buffer including the null character if copy_null
+ is set. Return NULL and raise an exception on error. Raise a ValueError if
+ the buffer is smaller than the string. Return buffer on success.
+
+ buflen is the length of the buffer in (Py_UCS4) characters. */
+PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4(
+ PyObject *unicode,
+ Py_UCS4* buffer,
+ Py_ssize_t buflen,
+ int copy_null);
+
+/* Copy the string into a UCS4 buffer. A new buffer is allocated using
+ * PyMem_Malloc; if this fails, NULL is returned with a memory error
+ exception set. */
+PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4Copy(PyObject *unicode);
+
/* Return a read-only pointer to the Unicode object's internal
- Py_UNICODE buffer. */
+ Py_UNICODE buffer.
+ If the wchar_t/Py_UNICODE representation is not yet available, this
+ function will calculate it. */
#ifndef Py_LIMITED_API
PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
@@ -462,30 +772,69 @@ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
);
#endif
+/* Return a read-only pointer to the Unicode object's internal
+ Py_UNICODE buffer and save the length at size.
+ If the wchar_t/Py_UNICODE representation is not yet available, this
+ function will calculate it. */
+
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize(
+ PyObject *unicode, /* Unicode object */
+ Py_ssize_t *size /* location where to save the length */
+ );
+#endif
+
/* Get the length of the Unicode object. */
+PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength(
+ PyObject *unicode
+);
+
+/* Get the number of Py_UNICODE units in the
+ string representation. */
+
PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize(
PyObject *unicode /* Unicode object */
);
+/* Read a character from the string. */
+
+PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar(
+ PyObject *unicode,
+ Py_ssize_t index
+ );
+
+/* Write a character to the string. The string must have been created through
+ PyUnicode_New, must not be shared, and must not have been hashed yet.
+
+ Return 0 on success, -1 on error. */
+
+PyAPI_FUNC(int) PyUnicode_WriteChar(
+ PyObject *unicode,
+ Py_ssize_t index,
+ Py_UCS4 character
+ );
+
#ifndef Py_LIMITED_API
/* Get the maximum ordinal for a Unicode character. */
PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void);
#endif
-/* Resize an already allocated Unicode object to the new size length.
+/* Resize an Unicode object. The length is the number of characters, except
+ if the kind of the string is PyUnicode_WCHAR_KIND: in this case, the length
+ is the number of Py_UNICODE characters.
*unicode is modified to point to the new (resized) object and 0
returned on success.
- This API may only be called by the function which also called the
- Unicode constructor. The refcount on the object must be 1. Otherwise,
- an error is returned.
+ Try to resize the string in place (which is usually faster than allocating
+ a new string and copy characters), or create a new string.
Error handling is implemented as follows: an exception is set, -1
is returned and *unicode left untouched.
-*/
+ WARNING: The function doesn't check string content, the result may not be a
+ string in canonical representation. */
PyAPI_FUNC(int) PyUnicode_Resize(
PyObject **unicode, /* Pointer to the Unicode object */
@@ -542,11 +891,67 @@ PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(
);
#ifndef Py_LIMITED_API
+typedef struct {
+ PyObject *buffer;
+ void *data;
+ enum PyUnicode_Kind kind;
+ Py_UCS4 maxchar;
+ Py_ssize_t size;
+ Py_ssize_t pos;
+ /* minimum length of the buffer when overallocation is enabled,
+ see _PyUnicodeWriter_Init() */
+ Py_ssize_t min_length;
+ unsigned char overallocate;
+ /* If readonly is 1, buffer is a shared string (cannot be modified)
+ and size is set to 0. */
+ unsigned char readonly;
+} _PyUnicodeWriter ;
+
+/* Initialize a Unicode writer.
+
+ If min_length is greater than zero, _PyUnicodeWriter_Prepare()
+ overallocates the buffer and min_length is the minimum length in characters
+ of the buffer. */
+PyAPI_FUNC(void)
+_PyUnicodeWriter_Init(_PyUnicodeWriter *writer, Py_ssize_t min_length);
+
+/* Prepare the buffer to write 'length' characters
+ with the specified maximum character.
+
+ Return 0 on success, raise an exception and return -1 on error. */
+#define _PyUnicodeWriter_Prepare(WRITER, LENGTH, MAXCHAR) \
+ (((MAXCHAR) <= (WRITER)->maxchar \
+ && (LENGTH) <= (WRITER)->size - (WRITER)->pos) \
+ ? 0 \
+ : (((LENGTH) == 0) \
+ ? 0 \
+ : _PyUnicodeWriter_PrepareInternal((WRITER), (LENGTH), (MAXCHAR))))
+
+/* Don't call this function directly, use the _PyUnicodeWriter_Prepare() macro
+ instead. */
+PyAPI_FUNC(int)
+_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
+ Py_ssize_t length, Py_UCS4 maxchar);
+
+PyAPI_FUNC(int)
+_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str);
+
+PyAPI_FUNC(PyObject *)
+_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer);
+
+PyAPI_FUNC(void)
+_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer);
+#endif
+
+#ifndef Py_LIMITED_API
/* Format the object based on the format_spec, as defined in PEP 3101
(Advanced String Formatting). */
-PyAPI_FUNC(PyObject *) _PyUnicode_FormatAdvanced(PyObject *obj,
- Py_UNICODE *format_spec,
- Py_ssize_t format_spec_len);
+PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter(
+ _PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start,
+ Py_ssize_t end);
#endif
PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **);
@@ -559,7 +964,8 @@ PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void);
#endif
/* Use only if you know it's a string */
-#define PyUnicode_CHECK_INTERNED(op) (((PyUnicodeObject *)(op))->state)
+#define PyUnicode_CHECK_INTERNED(op) \
+ (((PyASCIIObject *)(op))->state.interned)
/* --- wchar_t support for platforms which support it --------------------- */
@@ -606,14 +1012,17 @@ PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString(
Py_ssize_t *size /* number of characters of the result */
);
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind);
+#endif
+
#endif
/* --- Unicode ordinals --------------------------------------------------- */
/* Create a Unicode Object from the given Unicode code point ordinal.
- The ordinal must be in range(0x10000) on narrow Python builds
- (UCS2), and range(0x110000) on wide builds (UCS4). A ValueError is
+ The ordinal must be in range(0x110000). A ValueError is
raised in case it is not.
*/
@@ -651,50 +1060,42 @@ PyAPI_FUNC(int) PyUnicode_ClearFreeList(void);
/* --- Manage the default encoding ---------------------------------------- */
-/* Return a Python string holding the default encoded value of the
- Unicode object.
-
- Same as PyUnicode_AsUTF8String() except
- the resulting string is cached in the Unicode object for subsequent
- usage by this function. The cached version is needed to implement
- the character buffer interface and will live (at least) as long as
- the Unicode object itself.
-
- The refcount of the string is *not* incremented.
-
- *** Exported for internal use by the interpreter only !!! ***
-
-*/
-
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) _PyUnicode_AsDefaultEncodedString(
- PyObject *unicode,
- const char *errors);
-#endif
-
/* Returns a pointer to the default encoding (UTF-8) of the
Unicode object unicode and the size of the encoded representation
in bytes stored in *size.
In case of an error, no *size is set.
+ This function caches the UTF-8 encoded string in the unicodeobject
+ and subsequent calls will return the same string. The memory is released
+ when the unicodeobject is deallocated.
+
+ _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to
+ support the previous internal function with the same behaviour.
+
*** This API is for interpreter INTERNAL USE ONLY and will likely
*** be removed or changed in the future.
*** If you need to access the Unicode object as UTF-8 bytes string,
*** please use PyUnicode_AsUTF8String() instead.
-
*/
#ifndef Py_LIMITED_API
-PyAPI_FUNC(char *) _PyUnicode_AsStringAndSize(
+PyAPI_FUNC(char *) PyUnicode_AsUTF8AndSize(
PyObject *unicode,
Py_ssize_t *size);
+#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize
#endif
/* Returns a pointer to the default encoding (UTF-8) of the
Unicode object unicode.
+ Like PyUnicode_AsUTF8AndSize(), this also caches the UTF-8 representation
+ in the unicodeobject.
+
+ _PyUnicode_AsString is a #define for PyUnicode_AsUTF8 to
+ support the previous internal function with the same behaviour.
+
Use of this API is DEPRECATED since no size information can be
extracted from the returned data.
@@ -707,7 +1108,8 @@ PyAPI_FUNC(char *) _PyUnicode_AsStringAndSize(
*/
#ifndef Py_LIMITED_API
-PyAPI_FUNC(char *) _PyUnicode_AsString(PyObject *unicode);
+PyAPI_FUNC(char *) PyUnicode_AsUTF8(PyObject *unicode);
+#define _PyUnicode_AsString PyUnicode_AsUTF8
#endif
/* Returns "utf-8". */
@@ -812,6 +1214,12 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7(
int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */
const char *errors /* error handling */
);
+PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7(
+ PyObject *unicode, /* Unicode object */
+ int base64SetO, /* Encode RFC2152 Set O characters in base64 */
+ int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */
+ const char *errors /* error handling */
+ );
#endif
/* --- UTF-8 Codecs ------------------------------------------------------- */
@@ -834,6 +1242,10 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String(
);
#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String(
+ PyObject *unicode,
+ const char *errors);
+
PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8(
const Py_UNICODE *data, /* Unicode char buffer */
Py_ssize_t length, /* number of Py_UNICODE chars to encode */
@@ -915,6 +1327,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32(
const char *errors, /* error handling */
int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */
);
+PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32(
+ PyObject *object, /* Unicode object */
+ const char *errors, /* error handling */
+ int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */
+ );
#endif
/* --- UTF-16 Codecs ------------------------------------------------------ */
@@ -995,6 +1412,11 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16(
const char *errors, /* error handling */
int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */
);
+PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16(
+ PyObject* unicode, /* Unicode object */
+ const char *errors, /* error handling */
+ int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */
+ );
#endif
/* --- Unicode-Escape Codecs ---------------------------------------------- */
@@ -1064,6 +1486,10 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String(
);
#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String(
+ PyObject* unicode,
+ const char* errors);
+
PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1(
const Py_UNICODE *data, /* Unicode char buffer */
Py_ssize_t length, /* Number of Py_UNICODE chars to encode */
@@ -1088,6 +1514,10 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString(
);
#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString(
+ PyObject* unicode,
+ const char* errors);
+
PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII(
const Py_UNICODE *data, /* Unicode char buffer */
Py_ssize_t length, /* Number of Py_UNICODE chars to encode */
@@ -1139,6 +1569,12 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap(
(unicode ordinal -> char ordinal) */
const char *errors /* error handling */
);
+PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap(
+ PyObject *unicode, /* Unicode object */
+ PyObject *mapping, /* character mapping
+ (unicode ordinal -> char ordinal) */
+ const char *errors /* error handling */
+ );
#endif
/* Translate a Py_UNICODE buffer of the given length by applying a
@@ -1163,7 +1599,7 @@ PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap(
);
#endif
-#ifdef MS_WIN32
+#ifdef HAVE_MBCS
/* --- MBCS codecs for Windows -------------------------------------------- */
@@ -1180,6 +1616,14 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful(
Py_ssize_t *consumed /* bytes consumed */
);
+PyAPI_FUNC(PyObject*) PyUnicode_DecodeCodePageStateful(
+ int code_page, /* code page number */
+ const char *string, /* encoded string */
+ Py_ssize_t length, /* size of string */
+ const char *errors, /* error handling */
+ Py_ssize_t *consumed /* bytes consumed */
+ );
+
PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString(
PyObject *unicode /* Unicode object */
);
@@ -1187,12 +1631,18 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString(
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS(
const Py_UNICODE *data, /* Unicode char buffer */
- Py_ssize_t length, /* Number of Py_UNICODE chars to encode */
+ Py_ssize_t length, /* number of Py_UNICODE chars to encode */
const char *errors /* error handling */
);
#endif
-#endif /* MS_WIN32 */
+PyAPI_FUNC(PyObject*) PyUnicode_EncodeCodePage(
+ int code_page, /* code page number */
+ PyObject *unicode, /* Unicode object */
+ const char *errors /* error handling */
+ );
+
+#endif /* HAVE_MBCS */
/* --- Decimal Encoder ---------------------------------------------------- */
@@ -1240,6 +1690,49 @@ PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII(
);
#endif
+/* Similar to PyUnicode_TransformDecimalToASCII(), but takes a PyObject
+ as argument instead of a raw buffer and length. This function additionally
+ transforms spaces to ASCII because this is what the callers in longobject,
+ floatobject, and complexobject did anyways. */
+
+#ifndef Py_LIMITED_API
+PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII(
+ PyObject *unicode /* Unicode object */
+ );
+#endif
+
+/* --- Locale encoding --------------------------------------------------- */
+
+/* Decode a string from the current locale encoding. The decoder is strict if
+ *surrogateescape* is equal to zero, otherwise it uses the 'surrogateescape'
+ error handler (PEP 383) to escape undecodable bytes. If a byte sequence can
+ be decoded as a surrogate character and *surrogateescape* is not equal to
+ zero, the byte sequence is escaped using the 'surrogateescape' error handler
+ instead of being decoded. *str* must end with a null character but cannot
+ contain embedded null characters. */
+
+PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocaleAndSize(
+ const char *str,
+ Py_ssize_t len,
+ const char *errors);
+
+/* Similar to PyUnicode_DecodeLocaleAndSize(), but compute the string
+ length using strlen(). */
+
+PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocale(
+ const char *str,
+ const char *errors);
+
+/* Encode a Unicode object to the current locale encoding. The encoder is
+ strict is *surrogateescape* is equal to zero, otherwise the
+ "surrogateescape" error handler is used. Return a bytes object. The string
+ cannot contain embedded null characters.. */
+
+PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale(
+ PyObject *unicode,
+ const char *errors
+ );
+
/* --- File system encoding ---------------------------------------------- */
/* ParseTuple converter: encode str objects to bytes using
@@ -1292,7 +1785,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault(
These are capable of handling Unicode objects and strings on input
(we refer to them as strings in the descriptions) and return
- Unicode objects or integers as apporpriate. */
+ Unicode objects or integers as appropriate. */
/* Concat two strings giving a new Unicode string. */
@@ -1427,6 +1920,15 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_Find(
int direction /* Find direction: +1 forward, -1 backward */
);
+/* Like PyUnicode_Find, but search for single character only. */
+PyAPI_FUNC(Py_ssize_t) PyUnicode_FindChar(
+ PyObject *str,
+ Py_UCS4 ch,
+ Py_ssize_t start,
+ Py_ssize_t end,
+ int direction
+ );
+
/* Count the number of occurrences of substr in str[start:end]. */
PyAPI_FUNC(Py_ssize_t) PyUnicode_Count(
@@ -1463,7 +1965,7 @@ PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString(
/* Rich compare two strings and return one of the following:
- NULL in case an exception was raised
- - Py_True or Py_False for successfuly comparisons
+ - Py_True or Py_False for successfully comparisons
- Py_NotImplemented in case the type combination is unknown
Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in
@@ -1514,35 +2016,26 @@ PyAPI_FUNC(int) PyUnicode_IsIdentifier(PyObject *s);
#ifndef Py_LIMITED_API
/* Externally visible for str.strip(unicode) */
PyAPI_FUNC(PyObject *) _PyUnicode_XStrip(
- PyUnicodeObject *self,
+ PyObject *self,
int striptype,
PyObject *sepobj
);
#endif
-/* Using the current locale, insert the thousands grouping
- into the string pointed to by buffer. For the argument descriptions,
- see Objects/stringlib/localeutil.h */
-
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGroupingLocale(Py_UNICODE *buffer,
- Py_ssize_t n_buffer,
- Py_UNICODE *digits,
- Py_ssize_t n_digits,
- Py_ssize_t min_width);
-#endif
-
/* Using explicit passed-in values, insert the thousands grouping
into the string pointed to by buffer. For the argument descriptions,
see Objects/stringlib/localeutil.h */
#ifndef Py_LIMITED_API
-PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping(Py_UNICODE *buffer,
- Py_ssize_t n_buffer,
- Py_UNICODE *digits,
- Py_ssize_t n_digits,
- Py_ssize_t min_width,
- const char *grouping,
- const char *thousands_sep);
+PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping(
+ PyObject *unicode,
+ Py_ssize_t index,
+ Py_ssize_t n_buffer,
+ void *digits,
+ Py_ssize_t n_digits,
+ Py_ssize_t min_width,
+ const char *grouping,
+ PyObject *thousands_sep,
+ Py_UCS4 *maxchar);
#endif
/* === Characters Type APIs =============================================== */
@@ -1598,6 +2091,34 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase(
Py_UCS4 ch /* Unicode character */
);
+PyAPI_FUNC(int) _PyUnicode_ToLowerFull(
+ Py_UCS4 ch, /* Unicode character */
+ Py_UCS4 *res
+ );
+
+PyAPI_FUNC(int) _PyUnicode_ToTitleFull(
+ Py_UCS4 ch, /* Unicode character */
+ Py_UCS4 *res
+ );
+
+PyAPI_FUNC(int) _PyUnicode_ToUpperFull(
+ Py_UCS4 ch, /* Unicode character */
+ Py_UCS4 *res
+ );
+
+PyAPI_FUNC(int) _PyUnicode_ToFoldedFull(
+ Py_UCS4 ch, /* Unicode character */
+ Py_UCS4 *res
+ );
+
+PyAPI_FUNC(int) _PyUnicode_IsCaseIgnorable(
+ Py_UCS4 ch /* Unicode character */
+ );
+
+PyAPI_FUNC(int) _PyUnicode_IsCased(
+ Py_UCS4 ch /* Unicode character */
+ );
+
PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit(
Py_UCS4 ch /* Unicode character */
);
@@ -1676,6 +2197,17 @@ PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy(
);
#endif /* Py_LIMITED_API */
+#if defined(Py_DEBUG) && !defined(Py_LIMITED_API)
+PyAPI_FUNC(int) _PyUnicode_CheckConsistency(
+ PyObject *op,
+ int check_content);
+#endif
+
+/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/
+PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*);
+/* Clear all static strings. */
+PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/LICENSE b/LICENSE
index 43388e7..88eed1f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -74,6 +74,7 @@ the various releases.
3.2.1 3.2 2011 PSF yes
3.2.2 3.2.1 2011 PSF yes
3.2.3 3.2.2 2012 PSF yes
+ 3.3.0 3.2 2012 PSF yes
Footnotes:
diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py
index ed50520..13b1f26 100644
--- a/Lib/_dummy_thread.py
+++ b/Lib/_dummy_thread.py
@@ -24,11 +24,7 @@ TIMEOUT_MAX = 2**31
# imports are done when needed on a function-by-function basis. Since threads
# are disabled, the import lock should not be an issue anyway (??).
-class error(Exception):
- """Dummy implementation of _thread.error."""
-
- def __init__(self, *args):
- self.args = args
+error = RuntimeError
def start_new_thread(function, args, kwargs={}):
"""Dummy implementation of _thread.start_new_thread().
diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py
new file mode 100644
index 0000000..b3aad56
--- /dev/null
+++ b/Lib/_osx_support.py
@@ -0,0 +1,488 @@
+"""Shared OS X support functions."""
+
+import os
+import re
+import sys
+
+__all__ = [
+ 'compiler_fixup',
+ 'customize_config_vars',
+ 'customize_compiler',
+ 'get_platform_osx',
+]
+
+# configuration variables that may contain universal build flags,
+# like "-arch" or "-isdkroot", that may need customization for
+# the user environment
+_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS',
+ 'BLDSHARED', 'LDSHARED', 'CC', 'CXX',
+ 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
+ 'PY_CORE_CFLAGS')
+
+# configuration variables that may contain compiler calls
+_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX')
+
+# prefix added to original configuration variable names
+_INITPRE = '_OSX_SUPPORT_INITIAL_'
+
+
+def _find_executable(executable, path=None):
+ """Tries to find 'executable' in the directories listed in 'path'.
+
+ A string listing directories separated by 'os.pathsep'; defaults to
+ os.environ['PATH']. Returns the complete filename or None if not found.
+ """
+ if path is None:
+ path = os.environ['PATH']
+
+ paths = path.split(os.pathsep)
+ base, ext = os.path.splitext(executable)
+
+ if (sys.platform == 'win32' or os.name == 'os2') and (ext != '.exe'):
+ executable = executable + '.exe'
+
+ if not os.path.isfile(executable):
+ for p in paths:
+ f = os.path.join(p, executable)
+ if os.path.isfile(f):
+ # the file exists, we have a shot at spawn working
+ return f
+ return None
+ else:
+ return executable
+
+
+def _read_output(commandstring):
+ """Output from succesful command execution or None"""
+ # Similar to os.popen(commandstring, "r").read(),
+ # but without actually using os.popen because that
+ # function is not usable during python bootstrap.
+ # tempfile is also not available then.
+ import contextlib
+ try:
+ import tempfile
+ fp = tempfile.NamedTemporaryFile()
+ except ImportError:
+ fp = open("/tmp/_osx_support.%s"%(
+ os.getpid(),), "w+b")
+
+ with contextlib.closing(fp) as fp:
+ cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name)
+ return fp.read().decode('utf-8').strip() if not os.system(cmd) else None
+
+
+def _find_build_tool(toolname):
+ """Find a build tool on current path or using xcrun"""
+ return (_find_executable(toolname)
+ or _read_output("/usr/bin/xcrun -find %s" % (toolname,))
+ or ''
+ )
+
+_SYSTEM_VERSION = None
+
+def _get_system_version():
+ """Return the OS X system version as a string"""
+ # Reading this plist is a documented way to get the system
+ # version (see the documentation for the Gestalt Manager)
+ # We avoid using platform.mac_ver to avoid possible bootstrap issues during
+ # the build of Python itself (distutils is used to build standard library
+ # extensions).
+
+ global _SYSTEM_VERSION
+
+ if _SYSTEM_VERSION is None:
+ _SYSTEM_VERSION = ''
+ try:
+ f = open('/System/Library/CoreServices/SystemVersion.plist')
+ except IOError:
+ # We're on a plain darwin box, fall back to the default
+ # behaviour.
+ pass
+ else:
+ try:
+ m = re.search(r'<key>ProductUserVisibleVersion</key>\s*'
+ r'<string>(.*?)</string>', f.read())
+ finally:
+ f.close()
+ if m is not None:
+ _SYSTEM_VERSION = '.'.join(m.group(1).split('.')[:2])
+ # else: fall back to the default behaviour
+
+ return _SYSTEM_VERSION
+
+def _remove_original_values(_config_vars):
+ """Remove original unmodified values for testing"""
+ # This is needed for higher-level cross-platform tests of get_platform.
+ for k in list(_config_vars):
+ if k.startswith(_INITPRE):
+ del _config_vars[k]
+
+def _save_modified_value(_config_vars, cv, newvalue):
+ """Save modified and original unmodified value of configuration var"""
+
+ oldvalue = _config_vars.get(cv, '')
+ if (oldvalue != newvalue) and (_INITPRE + cv not in _config_vars):
+ _config_vars[_INITPRE + cv] = oldvalue
+ _config_vars[cv] = newvalue
+
+def _supports_universal_builds():
+ """Returns True if universal builds are supported on this system"""
+ # As an approximation, we assume that if we are running on 10.4 or above,
+ # then we are running with an Xcode environment that supports universal
+ # builds, in particular -isysroot and -arch arguments to the compiler. This
+ # is in support of allowing 10.4 universal builds to run on 10.3.x systems.
+
+ osx_version = _get_system_version()
+ if osx_version:
+ try:
+ osx_version = tuple(int(i) for i in osx_version.split('.'))
+ except ValueError:
+ osx_version = ''
+ return bool(osx_version >= (10, 4)) if osx_version else False
+
+
+def _find_appropriate_compiler(_config_vars):
+ """Find appropriate C compiler for extension module builds"""
+
+ # Issue #13590:
+ # The OSX location for the compiler varies between OSX
+ # (or rather Xcode) releases. With older releases (up-to 10.5)
+ # the compiler is in /usr/bin, with newer releases the compiler
+ # can only be found inside Xcode.app if the "Command Line Tools"
+ # are not installed.
+ #
+ # Futhermore, the compiler that can be used varies between
+ # Xcode releases. Upto Xcode 4 it was possible to use 'gcc-4.2'
+ # as the compiler, after that 'clang' should be used because
+ # gcc-4.2 is either not present, or a copy of 'llvm-gcc' that
+ # miscompiles Python.
+
+ # skip checks if the compiler was overriden with a CC env variable
+ if 'CC' in os.environ:
+ return _config_vars
+
+ # The CC config var might contain additional arguments.
+ # Ignore them while searching.
+ cc = oldcc = _config_vars['CC'].split()[0]
+ if not _find_executable(cc):
+ # Compiler is not found on the shell search PATH.
+ # Now search for clang, first on PATH (if the Command LIne
+ # Tools have been installed in / or if the user has provided
+ # another location via CC). If not found, try using xcrun
+ # to find an uninstalled clang (within a selected Xcode).
+
+ # NOTE: Cannot use subprocess here because of bootstrap
+ # issues when building Python itself (and os.popen is
+ # implemented on top of subprocess and is therefore not
+ # usable as well)
+
+ cc = _find_build_tool('clang')
+
+ elif os.path.basename(cc).startswith('gcc'):
+ # Compiler is GCC, check if it is LLVM-GCC
+ data = _read_output("'%s' --version"
+ % (cc.replace("'", "'\"'\"'"),))
+ if 'llvm-gcc' in data:
+ # Found LLVM-GCC, fall back to clang
+ cc = _find_build_tool('clang')
+
+ if not cc:
+ raise SystemError(
+ "Cannot locate working compiler")
+
+ if cc != oldcc:
+ # Found a replacement compiler.
+ # Modify config vars using new compiler, if not already explictly
+ # overriden by an env variable, preserving additional arguments.
+ for cv in _COMPILER_CONFIG_VARS:
+ if cv in _config_vars and cv not in os.environ:
+ cv_split = _config_vars[cv].split()
+ cv_split[0] = cc if cv != 'CXX' else cc + '++'
+ _save_modified_value(_config_vars, cv, ' '.join(cv_split))
+
+ return _config_vars
+
+
+def _remove_universal_flags(_config_vars):
+ """Remove all universal build arguments from config vars"""
+
+ for cv in _UNIVERSAL_CONFIG_VARS:
+ # Do not alter a config var explicitly overriden by env var
+ if cv in _config_vars and cv not in os.environ:
+ flags = _config_vars[cv]
+ flags = re.sub('-arch\s+\w+\s', ' ', flags, re.ASCII)
+ flags = re.sub('-isysroot [^ \t]*', ' ', flags)
+ _save_modified_value(_config_vars, cv, flags)
+
+ return _config_vars
+
+
+def _remove_unsupported_archs(_config_vars):
+ """Remove any unsupported archs from config vars"""
+ # Different Xcode releases support different sets for '-arch'
+ # flags. In particular, Xcode 4.x no longer supports the
+ # PPC architectures.
+ #
+ # This code automatically removes '-arch ppc' and '-arch ppc64'
+ # when these are not supported. That makes it possible to
+ # build extensions on OSX 10.7 and later with the prebuilt
+ # 32-bit installer on the python.org website.
+
+ # skip checks if the compiler was overriden with a CC env variable
+ if 'CC' in os.environ:
+ return _config_vars
+
+ if re.search('-arch\s+ppc', _config_vars['CFLAGS']) is not None:
+ # NOTE: Cannot use subprocess here because of bootstrap
+ # issues when building Python itself
+ status = os.system("'%s' -arch ppc -x c /dev/null 2>/dev/null"%(
+ _config_vars['CC'].replace("'", "'\"'\"'"),))
+ # The Apple compiler drivers return status 255 if no PPC
+ if (status >> 8) == 255:
+ # Compiler doesn't support PPC, remove the related
+ # '-arch' flags if not explicitly overridden by an
+ # environment variable
+ for cv in _UNIVERSAL_CONFIG_VARS:
+ if cv in _config_vars and cv not in os.environ:
+ flags = _config_vars[cv]
+ flags = re.sub('-arch\s+ppc\w*\s', ' ', flags)
+ _save_modified_value(_config_vars, cv, flags)
+
+ return _config_vars
+
+
+def _override_all_archs(_config_vars):
+ """Allow override of all archs with ARCHFLAGS env var"""
+ # NOTE: This name was introduced by Apple in OSX 10.5 and
+ # is used by several scripting languages distributed with
+ # that OS release.
+ if 'ARCHFLAGS' in os.environ:
+ arch = os.environ['ARCHFLAGS']
+ for cv in _UNIVERSAL_CONFIG_VARS:
+ if cv in _config_vars and '-arch' in _config_vars[cv]:
+ flags = _config_vars[cv]
+ flags = re.sub('-arch\s+\w+\s', ' ', flags)
+ flags = flags + ' ' + arch
+ _save_modified_value(_config_vars, cv, flags)
+
+ return _config_vars
+
+
+def _check_for_unavailable_sdk(_config_vars):
+ """Remove references to any SDKs not available"""
+ # If we're on OSX 10.5 or later and the user tries to
+ # compile an extension using an SDK that is not present
+ # on the current machine it is better to not use an SDK
+ # than to fail. This is particularly important with
+ # the standalong Command Line Tools alternative to a
+ # full-blown Xcode install since the CLT packages do not
+ # provide SDKs. If the SDK is not present, it is assumed
+ # that the header files and dev libs have been installed
+ # to /usr and /System/Library by either a standalone CLT
+ # package or the CLT component within Xcode.
+ cflags = _config_vars.get('CFLAGS', '')
+ m = re.search(r'-isysroot\s+(\S+)', cflags)
+ if m is not None:
+ sdk = m.group(1)
+ if not os.path.exists(sdk):
+ for cv in _UNIVERSAL_CONFIG_VARS:
+ # Do not alter a config var explicitly overriden by env var
+ if cv in _config_vars and cv not in os.environ:
+ flags = _config_vars[cv]
+ flags = re.sub(r'-isysroot\s+\S+(?:\s|$)', ' ', flags)
+ _save_modified_value(_config_vars, cv, flags)
+
+ return _config_vars
+
+
+def compiler_fixup(compiler_so, cc_args):
+ """
+ This function will strip '-isysroot PATH' and '-arch ARCH' from the
+ compile flags if the user has specified one them in extra_compile_flags.
+
+ This is needed because '-arch ARCH' adds another architecture to the
+ build, without a way to remove an architecture. Furthermore GCC will
+ barf if multiple '-isysroot' arguments are present.
+ """
+ stripArch = stripSysroot = False
+
+ compiler_so = list(compiler_so)
+
+ if not _supports_universal_builds():
+ # OSX before 10.4.0, these don't support -arch and -isysroot at
+ # all.
+ stripArch = stripSysroot = True
+ else:
+ stripArch = '-arch' in cc_args
+ stripSysroot = '-isysroot' in cc_args
+
+ if stripArch or 'ARCHFLAGS' in os.environ:
+ while True:
+ try:
+ index = compiler_so.index('-arch')
+ # Strip this argument and the next one:
+ del compiler_so[index:index+2]
+ except ValueError:
+ break
+
+ if 'ARCHFLAGS' in os.environ and not stripArch:
+ # User specified different -arch flags in the environ,
+ # see also distutils.sysconfig
+ compiler_so = compiler_so + os.environ['ARCHFLAGS'].split()
+
+ if stripSysroot:
+ while True:
+ try:
+ index = compiler_so.index('-isysroot')
+ # Strip this argument and the next one:
+ del compiler_so[index:index+2]
+ except ValueError:
+ break
+
+ # Check if the SDK that is used during compilation actually exists,
+ # the universal build requires the usage of a universal SDK and not all
+ # users have that installed by default.
+ sysroot = None
+ if '-isysroot' in cc_args:
+ idx = cc_args.index('-isysroot')
+ sysroot = cc_args[idx+1]
+ elif '-isysroot' in compiler_so:
+ idx = compiler_so.index('-isysroot')
+ sysroot = compiler_so[idx+1]
+
+ if sysroot and not os.path.isdir(sysroot):
+ from distutils import log
+ log.warn("Compiling with an SDK that doesn't seem to exist: %s",
+ sysroot)
+ log.warn("Please check your Xcode installation")
+
+ return compiler_so
+
+
+def customize_config_vars(_config_vars):
+ """Customize Python build configuration variables.
+
+ Called internally from sysconfig with a mutable mapping
+ containing name/value pairs parsed from the configured
+ makefile used to build this interpreter. Returns
+ the mapping updated as needed to reflect the environment
+ in which the interpreter is running; in the case of
+ a Python from a binary installer, the installed
+ environment may be very different from the build
+ environment, i.e. different OS levels, different
+ built tools, different available CPU architectures.
+
+ This customization is performed whenever
+ distutils.sysconfig.get_config_vars() is first
+ called. It may be used in environments where no
+ compilers are present, i.e. when installing pure
+ Python dists. Customization of compiler paths
+ and detection of unavailable archs is deferred
+ until the first extention module build is
+ requested (in distutils.sysconfig.customize_compiler).
+
+ Currently called from distutils.sysconfig
+ """
+
+ if not _supports_universal_builds():
+ # On Mac OS X before 10.4, check if -arch and -isysroot
+ # are in CFLAGS or LDFLAGS and remove them if they are.
+ # This is needed when building extensions on a 10.3 system
+ # using a universal build of python.
+ _remove_universal_flags(_config_vars)
+
+ # Allow user to override all archs with ARCHFLAGS env var
+ _override_all_archs(_config_vars)
+
+ # Remove references to sdks that are not found
+ _check_for_unavailable_sdk(_config_vars)
+
+ return _config_vars
+
+
+def customize_compiler(_config_vars):
+ """Customize compiler path and configuration variables.
+
+ This customization is performed when the first
+ extension module build is requested
+ in distutils.sysconfig.customize_compiler).
+ """
+
+ # Find a compiler to use for extension module builds
+ _find_appropriate_compiler(_config_vars)
+
+ # Remove ppc arch flags if not supported here
+ _remove_unsupported_archs(_config_vars)
+
+ # Allow user to override all archs with ARCHFLAGS env var
+ _override_all_archs(_config_vars)
+
+ return _config_vars
+
+
+def get_platform_osx(_config_vars, osname, release, machine):
+ """Filter values for get_platform()"""
+ # called from get_platform() in sysconfig and distutils.util
+ #
+ # For our purposes, we'll assume that the system version from
+ # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
+ # to. This makes the compatibility story a bit more sane because the
+ # machine is going to compile and link as if it were
+ # MACOSX_DEPLOYMENT_TARGET.
+
+ macver = _config_vars.get('MACOSX_DEPLOYMENT_TARGET', '')
+ macrelease = _get_system_version() or macver
+ macver = macver or macrelease
+
+ if macver:
+ release = macver
+ osname = "macosx"
+
+ # Use the original CFLAGS value, if available, so that we
+ # return the same machine type for the platform string.
+ # Otherwise, distutils may consider this a cross-compiling
+ # case and disallow installs.
+ cflags = _config_vars.get(_INITPRE+'CFLAGS',
+ _config_vars.get('CFLAGS', ''))
+ if ((macrelease + '.') >= '10.4.' and
+ '-arch' in cflags.strip()):
+ # The universal build will build fat binaries, but not on
+ # systems before 10.4
+
+ machine = 'fat'
+
+ archs = re.findall('-arch\s+(\S+)', cflags)
+ archs = tuple(sorted(set(archs)))
+
+ if len(archs) == 1:
+ machine = archs[0]
+ elif archs == ('i386', 'ppc'):
+ machine = 'fat'
+ elif archs == ('i386', 'x86_64'):
+ machine = 'intel'
+ elif archs == ('i386', 'ppc', 'x86_64'):
+ machine = 'fat3'
+ elif archs == ('ppc64', 'x86_64'):
+ machine = 'fat64'
+ elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
+ machine = 'universal'
+ else:
+ raise ValueError(
+ "Don't know machine value for archs=%r" % (archs,))
+
+ elif machine == 'i386':
+ # On OSX the machine type returned by uname is always the
+ # 32-bit variant, even if the executable architecture is
+ # the 64-bit variant
+ if sys.maxsize >= 2**32:
+ machine = 'x86_64'
+
+ elif machine in ('PowerPC', 'Power_Macintosh'):
+ # Pick a sane name for the PPC architecture.
+ # See 'i386' case
+ if sys.maxsize >= 2**32:
+ machine = 'ppc64'
+ else:
+ machine = 'ppc'
+
+ return (osname, release, machine)
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 2d376d8..fa77ec1 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -5,7 +5,6 @@ Python implementation of the io module.
import os
import abc
import codecs
-import warnings
import errno
# Import _thread instead of threading to reduce startup cost
try:
@@ -15,7 +14,11 @@ except ImportError:
import io
from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END)
-from errno import EINTR
+
+valid_seek_flags = {0, 1, 2} # Hardwired values
+if hasattr(os, 'SEEK_HOLE') :
+ valid_seek_flags.add(os.SEEK_HOLE)
+ valid_seek_flags.add(os.SEEK_DATA)
# open() uses st_blksize whenever we can
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
@@ -24,20 +27,12 @@ DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
# defined in io.py. We don't use real inheritance though, because we don't
# want to inherit the C implementations.
-
-class BlockingIOError(IOError):
-
- """Exception raised when I/O would block on a non-blocking I/O stream."""
-
- def __init__(self, errno, strerror, characters_written=0):
- super().__init__(errno, strerror)
- if not isinstance(characters_written, int):
- raise TypeError("characters_written must be a integer")
- self.characters_written = characters_written
+# Rebind for compatibility
+BlockingIOError = BlockingIOError
def open(file, mode="r", buffering=-1, encoding=None, errors=None,
- newline=None, closefd=True):
+ newline=None, closefd=True, opener=None):
r"""Open file and return a stream. Raise IOError upon failure.
@@ -47,21 +42,22 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
wrapped. (If a file descriptor is given, it is closed when the
returned I/O object is closed, unless closefd is set to False.)
- mode is an optional string that specifies the mode in which the file
- is opened. It defaults to 'r' which means open for reading in text
- mode. Other common values are 'w' for writing (truncating the file if
- it already exists), and 'a' for appending (which on some Unix systems,
- means that all writes append to the end of the file regardless of the
- current seek position). In text mode, if encoding is not specified the
- encoding used is platform dependent. (For reading and writing raw
- bytes use binary mode and leave encoding unspecified.) The available
- modes are:
+ mode is an optional string that specifies the mode in which the file is
+ opened. It defaults to 'r' which means open for reading in text mode. Other
+ common values are 'w' for writing (truncating the file if it already
+ exists), 'x' for exclusive creation of a new file, and 'a' for appending
+ (which on some Unix systems, means that all writes append to the end of the
+ file regardless of the current seek position). In text mode, if encoding is
+ not specified the encoding used is platform dependent. (For reading and
+ writing raw bytes use binary mode and leave encoding unspecified.) The
+ available modes are:
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
+ 'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
@@ -72,7 +68,8 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
The default mode is 'rt' (open for reading text). For binary random
access, the mode 'w+b' opens and truncates the file to 0 bytes, while
- 'r+b' opens the file without truncation.
+ 'r+b' opens the file without truncation. The 'x' mode implies 'w' and
+ raises an `FileExistsError` if the file already exists.
Python distinguishes between files opened in binary and text modes,
even when the underlying operating system doesn't. Files opened in
@@ -132,6 +129,12 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
be kept open when the file is closed. This does not work when a file name is
given and must be True in that case.
+ A custom opener can be used by passing a callable as *opener*. The
+ underlying file descriptor for the file object is then obtained by calling
+ *opener* with (*file*, *flags*). *opener* must return an open file
+ descriptor (passing os.open as *opener* results in functionality similar to
+ passing None).
+
open() returns a file object whose type depends on the mode, and
through which the standard file operations such as reading and writing
are performed. When open() is used to open a file in a text mode ('w',
@@ -157,8 +160,9 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
if errors is not None and not isinstance(errors, str):
raise TypeError("invalid errors: %r" % errors)
modes = set(mode)
- if modes - set("arwb+tU") or len(mode) > len(modes):
+ if modes - set("axrwb+tU") or len(mode) > len(modes):
raise ValueError("invalid mode: %r" % mode)
+ creating = "x" in modes
reading = "r" in modes
writing = "w" in modes
appending = "a" in modes
@@ -166,14 +170,14 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
text = "t" in modes
binary = "b" in modes
if "U" in modes:
- if writing or appending:
+ if creating or writing or appending:
raise ValueError("can't use U and writing mode at once")
reading = True
if text and binary:
raise ValueError("can't have text and binary mode at once")
- if reading + writing + appending > 1:
+ if creating + reading + writing + appending > 1:
raise ValueError("can't have read/write/append mode at once")
- if not (reading or writing or appending):
+ if not (creating or reading or writing or appending):
raise ValueError("must have exactly one of read/write/append mode")
if binary and encoding is not None:
raise ValueError("binary mode doesn't take an encoding argument")
@@ -182,11 +186,12 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
if binary and newline is not None:
raise ValueError("binary mode doesn't take a newline argument")
raw = FileIO(file,
+ (creating and "x" or "") +
(reading and "r" or "") +
(writing and "w" or "") +
(appending and "a" or "") +
(updating and "+" or ""),
- closefd)
+ closefd, opener=opener)
line_buffering = False
if buffering == 1 or buffering < 0 and raw.isatty():
buffering = -1
@@ -208,7 +213,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
raise ValueError("can't have unbuffered text I/O")
if updating:
buffer = BufferedRandom(raw, buffering)
- elif writing or appending:
+ elif creating or writing or appending:
buffer = BufferedWriter(raw, buffering)
elif reading:
buffer = BufferedReader(raw, buffering)
@@ -305,6 +310,7 @@ class IOBase(metaclass=abc.ABCMeta):
* 0 -- start of stream (the default); offset should be zero or positive
* 1 -- current stream position; offset may be negative
* 2 -- end of stream; offset is usually negative
+ Some operating systems / file systems could provide additional values.
Return an int indicating the new absolute position.
"""
@@ -865,7 +871,7 @@ class BytesIO(BufferedIOBase):
elif whence == 2:
self._pos = max(0, len(self._buffer) + pos)
else:
- raise ValueError("invalid whence value")
+ raise ValueError("unsupported whence value")
return self._pos
def tell(self):
@@ -954,15 +960,19 @@ class BufferedReader(_BufferedIOMixin):
# Special case for when the number of bytes to read is unspecified.
if n is None or n == -1:
self._reset_read_buf()
+ if hasattr(self.raw, 'readall'):
+ chunk = self.raw.readall()
+ if chunk is None:
+ return buf[pos:] or None
+ else:
+ return buf[pos:] + chunk
chunks = [buf[pos:]] # Strip the consumed bytes.
current_size = 0
while True:
# Read until EOF or until read() would block.
try:
chunk = self.raw.read()
- except IOError as e:
- if e.errno != EINTR:
- raise
+ except InterruptedError:
continue
if chunk in empty_values:
nodata_val = chunk
@@ -984,9 +994,7 @@ class BufferedReader(_BufferedIOMixin):
while avail < n:
try:
chunk = self.raw.read(wanted)
- except IOError as e:
- if e.errno != EINTR:
- raise
+ except InterruptedError:
continue
if chunk in empty_values:
nodata_val = chunk
@@ -1019,9 +1027,7 @@ class BufferedReader(_BufferedIOMixin):
while True:
try:
current = self.raw.read(to_read)
- except IOError as e:
- if e.errno != EINTR:
- raise
+ except InterruptedError:
continue
break
if current:
@@ -1046,7 +1052,7 @@ class BufferedReader(_BufferedIOMixin):
return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos
def seek(self, pos, whence=0):
- if not (0 <= whence <= 2):
+ if whence not in valid_seek_flags:
raise ValueError("invalid whence value")
with self._read_lock:
if whence == 1:
@@ -1064,19 +1070,13 @@ class BufferedWriter(_BufferedIOMixin):
DEFAULT_BUFFER_SIZE.
"""
- _warning_stack_offset = 2
-
- def __init__(self, raw,
- buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
+ def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
if not raw.writable():
raise IOError('"raw" argument must be writable.')
_BufferedIOMixin.__init__(self, raw)
if buffer_size <= 0:
raise ValueError("invalid buffer size")
- if max_buffer_size is not None:
- warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
- self._warning_stack_offset)
self.buffer_size = buffer_size
self._write_buf = bytearray()
self._write_lock = Lock()
@@ -1126,13 +1126,11 @@ class BufferedWriter(_BufferedIOMixin):
while self._write_buf:
try:
n = self.raw.write(self._write_buf)
+ except InterruptedError:
+ continue
except BlockingIOError:
raise RuntimeError("self.raw should implement RawIOBase: it "
"should not raise BlockingIOError")
- except IOError as e:
- if e.errno != EINTR:
- raise
- continue
if n is None:
raise BlockingIOError(
errno.EAGAIN,
@@ -1145,8 +1143,8 @@ class BufferedWriter(_BufferedIOMixin):
return _BufferedIOMixin.tell(self) + len(self._write_buf)
def seek(self, pos, whence=0):
- if not (0 <= whence <= 2):
- raise ValueError("invalid whence")
+ if whence not in valid_seek_flags:
+ raise ValueError("invalid whence value")
with self._write_lock:
self._flush_unlocked()
return _BufferedIOMixin.seek(self, pos, whence)
@@ -1168,15 +1166,11 @@ class BufferedRWPair(BufferedIOBase):
# XXX The usefulness of this (compared to having two separate IO
# objects) is questionable.
- def __init__(self, reader, writer,
- buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
+ def __init__(self, reader, writer, buffer_size=DEFAULT_BUFFER_SIZE):
"""Constructor.
The arguments are two RawIO instances.
"""
- if max_buffer_size is not None:
- warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2)
-
if not reader.readable():
raise IOError('"reader" argument must be readable.')
@@ -1233,17 +1227,14 @@ class BufferedRandom(BufferedWriter, BufferedReader):
defaults to DEFAULT_BUFFER_SIZE.
"""
- _warning_stack_offset = 3
-
- def __init__(self, raw,
- buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
+ def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
raw._checkSeekable()
BufferedReader.__init__(self, raw, buffer_size)
- BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
+ BufferedWriter.__init__(self, raw, buffer_size)
def seek(self, pos, whence=0):
- if not (0 <= whence <= 2):
- raise ValueError("invalid whence")
+ if whence not in valid_seek_flags:
+ raise ValueError("invalid whence value")
self.flush()
if self._read_buf:
# Undo read ahead.
@@ -1455,7 +1446,7 @@ class TextIOWrapper(TextIOBase):
r"""Character and line based layer over a BufferedIOBase object, buffer.
encoding gives the name of the encoding that the stream will be
- decoded or encoded with. It defaults to locale.getpreferredencoding.
+ decoded or encoded with. It defaults to locale.getpreferredencoding(False).
errors determines the strictness of encoding and decoding (see the
codecs.register) and defaults to "strict".
@@ -1476,6 +1467,9 @@ class TextIOWrapper(TextIOBase):
_CHUNK_SIZE = 2048
+ # The write_through argument has no effect here since this
+ # implementation always writes through. The argument is present only
+ # so that the signature can match the signature of the C version.
def __init__(self, buffer, encoding=None, errors=None, newline=None,
line_buffering=False, write_through=False):
if newline is not None and not isinstance(newline, str):
@@ -1494,7 +1488,7 @@ class TextIOWrapper(TextIOBase):
# Importing locale may fail if Python is being built
encoding = "ascii"
else:
- encoding = locale.getpreferredencoding()
+ encoding = locale.getpreferredencoding(False)
if not isinstance(encoding, str):
raise ValueError("invalid encoding: %r" % encoding)
@@ -1521,6 +1515,7 @@ class TextIOWrapper(TextIOBase):
self._snapshot = None # info for reconstructing decoder state
self._seekable = self._telling = self.buffer.seekable()
self._has_read1 = hasattr(self.buffer, 'read1')
+ self._b2cratio = 0.0
if self._seekable and self.writable():
position = self.buffer.tell()
@@ -1693,7 +1688,12 @@ class TextIOWrapper(TextIOBase):
else:
input_chunk = self.buffer.read(self._CHUNK_SIZE)
eof = not input_chunk
- self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
+ decoded_chars = self._decoder.decode(input_chunk, eof)
+ self._set_decoded_chars(decoded_chars)
+ if decoded_chars:
+ self._b2cratio = len(input_chunk) / len(self._decoded_chars)
+ else:
+ self._b2cratio = 0.0
if self._telling:
# At the snapshot point, len(dec_buffer) bytes before the read,
@@ -1747,20 +1747,56 @@ class TextIOWrapper(TextIOBase):
# forward until it gives us enough decoded characters.
saved_state = decoder.getstate()
try:
+ # Fast search for an acceptable start point, close to our
+ # current pos.
+ # Rationale: calling decoder.decode() has a large overhead
+ # regardless of chunk size; we want the number of such calls to
+ # be O(1) in most situations (common decoders, non-crazy input).
+ # Actually, it will be exactly 1 for fixed-size codecs (all
+ # 8-bit codecs, also UTF-16 and UTF-32).
+ skip_bytes = int(self._b2cratio * chars_to_skip)
+ skip_back = 1
+ assert skip_bytes <= len(next_input)
+ while skip_bytes > 0:
+ decoder.setstate((b'', dec_flags))
+ # Decode up to temptative start point
+ n = len(decoder.decode(next_input[:skip_bytes]))
+ if n <= chars_to_skip:
+ b, d = decoder.getstate()
+ if not b:
+ # Before pos and no bytes buffered in decoder => OK
+ dec_flags = d
+ chars_to_skip -= n
+ break
+ # Skip back by buffered amount and reset heuristic
+ skip_bytes -= len(b)
+ skip_back = 1
+ else:
+ # We're too far ahead, skip back a bit
+ skip_bytes -= skip_back
+ skip_back = skip_back * 2
+ else:
+ skip_bytes = 0
+ decoder.setstate((b'', dec_flags))
+
# Note our initial start point.
- decoder.setstate((b'', dec_flags))
- start_pos = position
- start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0
- need_eof = 0
+ start_pos = position + skip_bytes
+ start_flags = dec_flags
+ if chars_to_skip == 0:
+ # We haven't moved from the start point.
+ return self._pack_cookie(start_pos, start_flags)
# Feed the decoder one byte at a time. As we go, note the
# nearest "safe start point" before the current location
# (a point where the decoder has nothing buffered, so seek()
# can safely start from there and advance to this location).
- next_byte = bytearray(1)
- for next_byte[0] in next_input:
+ bytes_fed = 0
+ need_eof = 0
+ # Chars decoded since `start_pos`
+ chars_decoded = 0
+ for i in range(skip_bytes, len(next_input)):
bytes_fed += 1
- chars_decoded += len(decoder.decode(next_byte))
+ chars_decoded += len(decoder.decode(next_input[i:i+1]))
dec_buffer, dec_flags = decoder.getstate()
if not dec_buffer and chars_decoded <= chars_to_skip:
# Decoder buffer is empty, so this is a safe start point.
@@ -1819,8 +1855,7 @@ class TextIOWrapper(TextIOBase):
self._decoder.reset()
return position
if whence != 0:
- raise ValueError("invalid whence (%r, should be 0, 1 or 2)" %
- (whence,))
+ raise ValueError("unsupported whence (%r)" % (whence,))
if cookie < 0:
raise ValueError("negative seek position %r" % (cookie,))
self.flush()
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index fa06376..b0cd3d6 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -486,19 +486,19 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
return (year, month, day,
hour, minute, second,
- weekday, julian, tz, gmtoff, tzname), fraction
+ weekday, julian, tz, tzname, gmtoff), fraction
def _strptime_time(data_string, format="%a %b %d %H:%M:%S %Y"):
"""Return a time struct based on the input string and the
format string."""
tt = _strptime(data_string, format)[0]
- return time.struct_time(tt[:9])
+ return time.struct_time(tt[:time._STRUCT_TM_ITEMS])
def _strptime_datetime(cls, data_string, format="%a %b %d %H:%M:%S %Y"):
"""Return a class cls instance based on the input string and the
format string."""
tt, fraction = _strptime(data_string, format)
- gmtoff, tzname = tt[-2:]
+ tzname, gmtoff = tt[-2:]
args = tt[:6] + (fraction,)
if gmtoff is not None:
tzdelta = datetime_timedelta(seconds=gmtoff)
diff --git a/Lib/abc.py b/Lib/abc.py
index a6c2dc4..09778e8 100644
--- a/Lib/abc.py
+++ b/Lib/abc.py
@@ -26,7 +26,8 @@ def abstractmethod(funcobj):
class abstractclassmethod(classmethod):
- """A decorator indicating abstract classmethods.
+ """
+ A decorator indicating abstract classmethods.
Similar to abstractmethod.
@@ -36,6 +37,9 @@ class abstractclassmethod(classmethod):
@abstractclassmethod
def my_abstract_classmethod(cls, ...):
...
+
+ 'abstractclassmethod' is deprecated. Use 'classmethod' with
+ 'abstractmethod' instead.
"""
__isabstractmethod__ = True
@@ -46,7 +50,8 @@ class abstractclassmethod(classmethod):
class abstractstaticmethod(staticmethod):
- """A decorator indicating abstract staticmethods.
+ """
+ A decorator indicating abstract staticmethods.
Similar to abstractmethod.
@@ -56,6 +61,9 @@ class abstractstaticmethod(staticmethod):
@abstractstaticmethod
def my_abstract_staticmethod(...):
...
+
+ 'abstractstaticmethod' is deprecated. Use 'staticmethod' with
+ 'abstractmethod' instead.
"""
__isabstractmethod__ = True
@@ -66,7 +74,8 @@ class abstractstaticmethod(staticmethod):
class abstractproperty(property):
- """A decorator indicating abstract properties.
+ """
+ A decorator indicating abstract properties.
Requires that the metaclass is ABCMeta or derived from it. A
class that has a metaclass derived from ABCMeta cannot be
@@ -88,7 +97,11 @@ class abstractproperty(property):
def getx(self): ...
def setx(self, value): ...
x = abstractproperty(getx, setx)
+
+ 'abstractproperty' is deprecated. Use 'property' with 'abstractmethod'
+ instead.
"""
+
__isabstractmethod__ = True
@@ -133,11 +146,14 @@ class ABCMeta(type):
return cls
def register(cls, subclass):
- """Register a virtual subclass of an ABC."""
+ """Register a virtual subclass of an ABC.
+
+ Returns the subclass, to allow usage as a class decorator.
+ """
if not isinstance(subclass, type):
raise TypeError("Can only register classes")
if issubclass(subclass, cls):
- return # Already a subclass
+ return subclass # Already a subclass
# Subtle: test for cycles *after* testing for "already a subclass";
# this means we allow X.register(X) and interpret it as a no-op.
if issubclass(cls, subclass):
@@ -145,6 +161,7 @@ class ABCMeta(type):
raise RuntimeError("Refusing to create an inheritance cycle")
cls._abc_registry.add(subclass)
ABCMeta._abc_invalidation_counter += 1 # Invalidate negative cache
+ return subclass
def _dump_registry(cls, file=None):
"""Debug helper to print the ABC registry."""
diff --git a/Lib/aifc.py b/Lib/aifc.py
index 775f39c..ec4f822 100644
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -136,6 +136,7 @@ writeframesraw.
import struct
import builtins
+import warnings
__all__ = ["Error", "open", "openfp"]
@@ -440,7 +441,7 @@ class Aifc_read:
kludge = 0
if chunk.chunksize == 18:
kludge = 1
- print('Warning: bad COMM chunk size')
+ warnings.warn('Warning: bad COMM chunk size')
chunk.chunksize = 23
#DEBUG end
self._comptype = chunk.read(4)
@@ -484,11 +485,10 @@ class Aifc_read:
# a position 0 and name ''
self._markers.append((id, pos, name))
except EOFError:
- print('Warning: MARK chunk contains only', end=' ')
- print(len(self._markers), end=' ')
- if len(self._markers) == 1: print('marker', end=' ')
- else: print('markers', end=' ')
- print('instead of', nmarkers)
+ w = ('Warning: MARK chunk contains only %s marker%s instead of %s' %
+ (len(self._markers), '' if len(self._markers) == 1 else 's',
+ nmarkers))
+ warnings.warn(w)
class Aifc_write:
# Variables used in this class:
diff --git a/Lib/argparse.py b/Lib/argparse.py
index eb894ca..f25b1b6 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -71,6 +71,7 @@ __all__ = [
'ArgumentDefaultsHelpFormatter',
'RawDescriptionHelpFormatter',
'RawTextHelpFormatter',
+ 'MetavarTypeHelpFormatter',
'Namespace',
'Action',
'ONE_OR_MORE',
@@ -419,7 +420,8 @@ class HelpFormatter(object):
# produce all arg strings
elif not action.option_strings:
- part = self._format_args(action, action.dest)
+ default = self._get_default_metavar_for_positional(action)
+ part = self._format_args(action, default)
# if it's in a group, strip the outer []
if action in group_actions:
@@ -441,7 +443,7 @@ class HelpFormatter(object):
# if the Optional takes a value, format is:
# -s ARGS or --long ARGS
else:
- default = action.dest.upper()
+ default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
part = '%s %s' % (option_string, args_string)
@@ -527,7 +529,8 @@ class HelpFormatter(object):
def _format_action_invocation(self, action):
if not action.option_strings:
- metavar, = self._metavar_formatter(action, action.dest)(1)
+ default = self._get_default_metavar_for_positional(action)
+ metavar, = self._metavar_formatter(action, default)(1)
return metavar
else:
@@ -541,7 +544,7 @@ class HelpFormatter(object):
# if the Optional takes a value, format is:
# -s ARGS, --long ARGS
else:
- default = action.dest.upper()
+ default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
for option_string in action.option_strings:
parts.append('%s %s' % (option_string, args_string))
@@ -619,6 +622,12 @@ class HelpFormatter(object):
def _get_help_string(self, action):
return action.help
+ def _get_default_metavar_for_optional(self, action):
+ return action.dest.upper()
+
+ def _get_default_metavar_for_positional(self, action):
+ return action.dest
+
class RawDescriptionHelpFormatter(HelpFormatter):
"""Help message formatter which retains any formatting in descriptions.
@@ -628,7 +637,7 @@ class RawDescriptionHelpFormatter(HelpFormatter):
"""
def _fill_text(self, text, width, indent):
- return ''.join([indent + line for line in text.splitlines(True)])
+ return ''.join(indent + line for line in text.splitlines(keepends=True))
class RawTextHelpFormatter(RawDescriptionHelpFormatter):
@@ -659,6 +668,22 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter):
return help
+class MetavarTypeHelpFormatter(HelpFormatter):
+ """Help message formatter which uses the argument 'type' as the default
+ metavar value (instead of the argument 'dest')
+
+ Only the name of this class is considered a public API. All the methods
+ provided by the class are considered an implementation detail.
+ """
+
+ def _get_default_metavar_for_optional(self, action):
+ return action.type.__name__
+
+ def _get_default_metavar_for_positional(self, action):
+ return action.type.__name__
+
+
+
# =====================
# Options and Arguments
# =====================
@@ -1554,7 +1579,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
usage=None,
description=None,
epilog=None,
- version=None,
parents=[],
formatter_class=HelpFormatter,
prefix_chars='-',
@@ -1563,14 +1587,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
conflict_handler='error',
add_help=True):
- if version is not None:
- import warnings
- warnings.warn(
- """The "version" argument to ArgumentParser is deprecated. """
- """Please use """
- """"add_argument(..., action='version', version="N", ...)" """
- """instead""", DeprecationWarning)
-
superinit = super(ArgumentParser, self).__init__
superinit(description=description,
prefix_chars=prefix_chars,
@@ -1584,7 +1600,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
self.prog = prog
self.usage = usage
self.epilog = epilog
- self.version = version
self.formatter_class = formatter_class
self.fromfile_prefix_chars = fromfile_prefix_chars
self.add_help = add_help
@@ -1599,7 +1614,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
return string
self.register('type', None, identity)
- # add help and version arguments if necessary
+ # add help argument if necessary
# (using explicit default to override global argument_default)
default_prefix = '-' if '-' in prefix_chars else prefix_chars[0]
if self.add_help:
@@ -1607,12 +1622,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
default_prefix+'h', default_prefix*2+'help',
action='help', default=SUPPRESS,
help=_('show this help message and exit'))
- if self.version:
- self.add_argument(
- default_prefix+'v', default_prefix*2+'version',
- action='version', default=SUPPRESS,
- version=self.version,
- help=_("show program's version number and exit"))
# add parent arguments and defaults
for parent in parents:
@@ -1632,7 +1641,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
'prog',
'usage',
'description',
- 'version',
'formatter_class',
'conflict_handler',
'add_help',
@@ -1940,29 +1948,29 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# if we didn't consume all the argument strings, there were extras
extras.extend(arg_strings[stop_index:])
- # if we didn't use all the Positional objects, there were too few
- # arg strings supplied.
- if positionals:
- self.error(_('too few arguments'))
-
- # make sure all required actions were present, and convert defaults.
+ # make sure all required actions were present and also convert
+ # action defaults which were not given as arguments
+ required_actions = []
for action in self._actions:
if action not in seen_actions:
if action.required:
- name = _get_action_name(action)
- self.error(_('argument %s is required') % name)
+ required_actions.append(_get_action_name(action))
else:
# Convert action default now instead of doing it before
# parsing arguments to avoid calling convert functions
# twice (which may fail) if the argument was given, but
# only if it was defined already in the namespace
if (action.default is not None and
- isinstance(action.default, str) and
- hasattr(namespace, action.dest) and
- action.default is getattr(namespace, action.dest)):
+ isinstance(action.default, str) and
+ hasattr(namespace, action.dest) and
+ action.default is getattr(namespace, action.dest)):
setattr(namespace, action.dest,
self._get_value(action, action.default))
+ if required_actions:
+ self.error(_('the following arguments are required: %s') %
+ ', '.join(required_actions))
+
# make sure all required groups had one option present
for group in self._mutually_exclusive_groups:
if group.required:
@@ -2314,16 +2322,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# determine help from format above
return formatter.format_help()
- def format_version(self):
- import warnings
- warnings.warn(
- 'The format_version method is deprecated -- the "version" '
- 'argument to ArgumentParser is no longer supported.',
- DeprecationWarning)
- formatter = self._get_formatter()
- formatter.add_text(self.version)
- return formatter.format_help()
-
def _get_formatter(self):
return self.formatter_class(prog=self.prog)
@@ -2340,14 +2338,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
file = _sys.stdout
self._print_message(self.format_help(), file)
- def print_version(self, file=None):
- import warnings
- warnings.warn(
- 'The print_version method is deprecated -- the "version" '
- 'argument to ArgumentParser is no longer supported.',
- DeprecationWarning)
- self._print_message(self.format_version(), file)
-
def _print_message(self, message, file=None):
if message:
if file is None:
diff --git a/Lib/ast.py b/Lib/ast.py
index fb5adac..13f59f9 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -25,7 +25,6 @@
:license: Python License.
"""
from _ast import *
-from _ast import __version__
def parse(source, filename='<unknown>', mode='exec'):
diff --git a/Lib/asynchat.py b/Lib/asynchat.py
index 6558512..4e26bb5 100644
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -49,18 +49,6 @@ import socket
import asyncore
from collections import deque
-def buffer(obj, start=None, stop=None):
- # if memoryview objects gain slicing semantics,
- # this function will change for the better
- # memoryview used for the TypeError
- memoryview(obj)
- if start == None:
- start = 0
- if stop == None:
- stop = len(obj)
- x = obj[start:stop]
- ## print("buffer type is: %s"%(type(x),))
- return x
class async_chat (asyncore.dispatcher):
"""This is an abstract class. You must derive from this class, and add
@@ -75,7 +63,7 @@ class async_chat (asyncore.dispatcher):
# sign of an application bug that we don't want to pass silently
use_encoding = 0
- encoding = 'latin1'
+ encoding = 'latin-1'
def __init__ (self, sock=None, map=None):
# for string terminator matching
@@ -240,7 +228,7 @@ class async_chat (asyncore.dispatcher):
# handle classic producer behavior
obs = self.ac_out_buffer_size
try:
- data = buffer(first, 0, obs)
+ data = first[:obs]
except TypeError:
data = first.more()
if data:
diff --git a/Lib/asyncore.py b/Lib/asyncore.py
index b06077f..2cac88b 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -54,7 +54,7 @@ import warnings
import os
from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \
- ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
+ ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
errorcode
_DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE,
@@ -143,11 +143,8 @@ def poll(timeout=0.0, map=None):
try:
r, w, e = select.select(r, w, e, timeout)
- except select.error as err:
- if err.args[0] != EINTR:
- raise
- else:
- return
+ except InterruptedError:
+ return
for fd in r:
obj = map.get(fd)
@@ -184,15 +181,10 @@ def poll2(timeout=0.0, map=None):
if obj.writable() and not obj.accepting:
flags |= select.POLLOUT
if flags:
- # Only check for exceptions if object was either readable
- # or writable.
- flags |= select.POLLERR | select.POLLHUP | select.POLLNVAL
pollster.register(fd, flags)
try:
r = pollster.poll(timeout)
- except select.error as err:
- if err.args[0] != EINTR:
- raise
+ except InterruptedError:
r = []
for fd, flags in r:
obj = map.get(fd)
@@ -292,7 +284,7 @@ class dispatcher:
del map[fd]
self._fileno = None
- def create_socket(self, family, type):
+ def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM):
self.family_and_type = family, type
sock = socket.socket(family, type)
sock.setblocking(0)
diff --git a/Lib/base64.py b/Lib/base64.py
index 895d813..4042f00 100755
--- a/Lib/base64.py
+++ b/Lib/base64.py
@@ -29,14 +29,16 @@ __all__ = [
bytes_types = (bytes, bytearray) # Types acceptable as binary data
-
-def _translate(s, altchars):
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- translation = bytearray(range(256))
- for k, v in altchars.items():
- translation[ord(k)] = v[0]
- return s.translate(translation)
+def _bytes_from_decode_data(s):
+ if isinstance(s, str):
+ try:
+ return s.encode('ascii')
+ except UnicodeEncodeError:
+ raise ValueError('string argument should contain only ASCII characters')
+ elif isinstance(s, bytes_types):
+ return s
+ else:
+ raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__)
@@ -61,7 +63,7 @@ def b64encode(s, altchars=None):
raise TypeError("expected bytes, not %s"
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars)
- return _translate(encoded, {'+': altchars[0:1], '/': altchars[1:2]})
+ return encoded.translate(bytes.maketrans(b'+/', altchars))
return encoded
@@ -79,14 +81,11 @@ def b64decode(s, altchars=None, validate=False):
discarded prior to the padding check. If validate is True,
non-base64-alphabet characters in the input result in a binascii.Error.
"""
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
+ s = _bytes_from_decode_data(s)
if altchars is not None:
- if not isinstance(altchars, bytes_types):
- raise TypeError("expected bytes, not %s"
- % altchars.__class__.__name__)
+ altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
- s = _translate(s, {chr(altchars[0]): b'+', chr(altchars[1]): b'/'})
+ s = s.translate(bytes.maketrans(altchars, b'+/'))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
raise binascii.Error('Non-base64 digit found')
return binascii.a2b_base64(s)
@@ -109,6 +108,10 @@ def standard_b64decode(s):
"""
return b64decode(s)
+
+_urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_')
+_urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/')
+
def urlsafe_b64encode(s):
"""Encode a byte string using a url-safe Base64 alphabet.
@@ -116,7 +119,7 @@ def urlsafe_b64encode(s):
returned. The alphabet uses '-' instead of '+' and '_' instead of
'/'.
"""
- return b64encode(s, b'-_')
+ return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
@@ -128,7 +131,9 @@ def urlsafe_b64decode(s):
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
- return b64decode(s, b'-_')
+ s = _bytes_from_decode_data(s)
+ s = s.translate(_urlsafe_decode_translation)
+ return b64decode(s)
@@ -211,8 +216,7 @@ def b32decode(s, casefold=False, map01=None):
the input is incorrectly padded or if there are non-alphabet
characters present in the input.
"""
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
+ s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8)
if leftover:
raise binascii.Error('Incorrect padding')
@@ -220,10 +224,9 @@ def b32decode(s, casefold=False, map01=None):
# False, or the character to map the digit 1 (one) to. It should be
# either L (el) or I (eye).
if map01 is not None:
- if not isinstance(map01, bytes_types):
- raise TypeError("expected bytes, not %s" % map01.__class__.__name__)
+ map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01)
- s = _translate(s, {b'0': b'O', b'1': map01})
+ s = s.translate(bytes.maketrans(b'01', b'O' + map01))
if casefold:
s = s.upper()
# Strip off pad characters from the right. We need to count the pad
@@ -292,8 +295,7 @@ def b16decode(s, casefold=False):
s were incorrectly padded or if there are non-alphabet characters
present in the string.
"""
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
+ s = _bytes_from_decode_data(s)
if casefold:
s = s.upper()
if re.search(b'[^0-9A-F]', s):
diff --git a/Lib/binhex.py b/Lib/binhex.py
index 999a675..7bf9278 100644
--- a/Lib/binhex.py
+++ b/Lib/binhex.py
@@ -23,7 +23,6 @@ hexbin(inputfilename, outputfilename)
#
import io
import os
-import sys
import struct
import binascii
diff --git a/Lib/bz2.py b/Lib/bz2.py
new file mode 100644
index 0000000..c307507
--- /dev/null
+++ b/Lib/bz2.py
@@ -0,0 +1,504 @@
+"""Interface to the libbzip2 compression library.
+
+This module provides a file interface, classes for incremental
+(de)compression, and functions for one-shot (de)compression.
+"""
+
+__all__ = ["BZ2File", "BZ2Compressor", "BZ2Decompressor",
+ "open", "compress", "decompress"]
+
+__author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
+
+import builtins
+import io
+import warnings
+
+try:
+ from threading import RLock
+except ImportError:
+ from dummy_threading import RLock
+
+from _bz2 import BZ2Compressor, BZ2Decompressor
+
+
+_MODE_CLOSED = 0
+_MODE_READ = 1
+_MODE_READ_EOF = 2
+_MODE_WRITE = 3
+
+_BUFFER_SIZE = 8192
+
+
+class BZ2File(io.BufferedIOBase):
+
+ """A file object providing transparent bzip2 (de)compression.
+
+ A BZ2File can act as a wrapper for an existing file object, or refer
+ directly to a named file on disk.
+
+ Note that BZ2File provides a *binary* file interface - data read is
+ returned as bytes, and data to be written should be given as bytes.
+ """
+
+ def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
+ """Open a bzip2-compressed file.
+
+ If filename is a str or bytes object, is gives the name of the file to
+ be opened. Otherwise, it should be a file object, which will be used to
+ read or write the compressed data.
+
+ mode can be 'r' for reading (default), 'w' for (over)writing, or 'a' for
+ appending. These can equivalently be given as 'rb', 'wb', and 'ab'.
+
+ buffering is ignored. Its use is deprecated.
+
+ If mode is 'w' or 'a', compresslevel can be a number between 1
+ and 9 specifying the level of compression: 1 produces the least
+ compression, and 9 (default) produces the most compression.
+
+ If mode is 'r', the input file may be the concatenation of
+ multiple compressed streams.
+ """
+ # This lock must be recursive, so that BufferedIOBase's
+ # readline(), readlines() and writelines() don't deadlock.
+ self._lock = RLock()
+ self._fp = None
+ self._closefp = False
+ self._mode = _MODE_CLOSED
+ self._pos = 0
+ self._size = -1
+
+ if buffering is not None:
+ warnings.warn("Use of 'buffering' argument is deprecated",
+ DeprecationWarning)
+
+ if not (1 <= compresslevel <= 9):
+ raise ValueError("compresslevel must be between 1 and 9")
+
+ if mode in ("", "r", "rb"):
+ mode = "rb"
+ mode_code = _MODE_READ
+ self._decompressor = BZ2Decompressor()
+ self._buffer = b""
+ self._buffer_offset = 0
+ elif mode in ("w", "wb"):
+ mode = "wb"
+ mode_code = _MODE_WRITE
+ self._compressor = BZ2Compressor(compresslevel)
+ elif mode in ("a", "ab"):
+ mode = "ab"
+ mode_code = _MODE_WRITE
+ self._compressor = BZ2Compressor(compresslevel)
+ else:
+ raise ValueError("Invalid mode: {!r}".format(mode))
+
+ if isinstance(filename, (str, bytes)):
+ self._fp = builtins.open(filename, mode)
+ self._closefp = True
+ self._mode = mode_code
+ elif hasattr(filename, "read") or hasattr(filename, "write"):
+ self._fp = filename
+ self._mode = mode_code
+ else:
+ raise TypeError("filename must be a str or bytes object, or a file")
+
+ def close(self):
+ """Flush and close the file.
+
+ May be called more than once without error. Once the file is
+ closed, any other operation on it will raise a ValueError.
+ """
+ with self._lock:
+ if self._mode == _MODE_CLOSED:
+ return
+ try:
+ if self._mode in (_MODE_READ, _MODE_READ_EOF):
+ self._decompressor = None
+ elif self._mode == _MODE_WRITE:
+ self._fp.write(self._compressor.flush())
+ self._compressor = None
+ finally:
+ try:
+ if self._closefp:
+ self._fp.close()
+ finally:
+ self._fp = None
+ self._closefp = False
+ self._mode = _MODE_CLOSED
+ self._buffer = b""
+ self._buffer_offset = 0
+
+ @property
+ def closed(self):
+ """True if this file is closed."""
+ return self._mode == _MODE_CLOSED
+
+ def fileno(self):
+ """Return the file descriptor for the underlying file."""
+ self._check_not_closed()
+ return self._fp.fileno()
+
+ def seekable(self):
+ """Return whether the file supports seeking."""
+ return self.readable() and self._fp.seekable()
+
+ def readable(self):
+ """Return whether the file was opened for reading."""
+ self._check_not_closed()
+ return self._mode in (_MODE_READ, _MODE_READ_EOF)
+
+ def writable(self):
+ """Return whether the file was opened for writing."""
+ self._check_not_closed()
+ return self._mode == _MODE_WRITE
+
+ # Mode-checking helper functions.
+
+ def _check_not_closed(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file")
+
+ def _check_can_read(self):
+ if self._mode not in (_MODE_READ, _MODE_READ_EOF):
+ self._check_not_closed()
+ raise io.UnsupportedOperation("File not open for reading")
+
+ def _check_can_write(self):
+ if self._mode != _MODE_WRITE:
+ self._check_not_closed()
+ raise io.UnsupportedOperation("File not open for writing")
+
+ def _check_can_seek(self):
+ if self._mode not in (_MODE_READ, _MODE_READ_EOF):
+ self._check_not_closed()
+ raise io.UnsupportedOperation("Seeking is only supported "
+ "on files open for reading")
+ if not self._fp.seekable():
+ raise io.UnsupportedOperation("The underlying file object "
+ "does not support seeking")
+
+ # Fill the readahead buffer if it is empty. Returns False on EOF.
+ def _fill_buffer(self):
+ if self._mode == _MODE_READ_EOF:
+ return False
+ # Depending on the input data, our call to the decompressor may not
+ # return any data. In this case, try again after reading another block.
+ while self._buffer_offset == len(self._buffer):
+ rawblock = (self._decompressor.unused_data or
+ self._fp.read(_BUFFER_SIZE))
+
+ if not rawblock:
+ if self._decompressor.eof:
+ self._mode = _MODE_READ_EOF
+ self._size = self._pos
+ return False
+ else:
+ raise EOFError("Compressed file ended before the "
+ "end-of-stream marker was reached")
+
+ # Continue to next stream.
+ if self._decompressor.eof:
+ self._decompressor = BZ2Decompressor()
+
+ self._buffer = self._decompressor.decompress(rawblock)
+ self._buffer_offset = 0
+ return True
+
+ # Read data until EOF.
+ # If return_data is false, consume the data without returning it.
+ def _read_all(self, return_data=True):
+ # The loop assumes that _buffer_offset is 0. Ensure that this is true.
+ self._buffer = self._buffer[self._buffer_offset:]
+ self._buffer_offset = 0
+
+ blocks = []
+ while self._fill_buffer():
+ if return_data:
+ blocks.append(self._buffer)
+ self._pos += len(self._buffer)
+ self._buffer = b""
+ if return_data:
+ return b"".join(blocks)
+
+ # Read a block of up to n bytes.
+ # If return_data is false, consume the data without returning it.
+ def _read_block(self, n, return_data=True):
+ # If we have enough data buffered, return immediately.
+ end = self._buffer_offset + n
+ if end <= len(self._buffer):
+ data = self._buffer[self._buffer_offset : end]
+ self._buffer_offset = end
+ self._pos += len(data)
+ return data if return_data else None
+
+ # The loop assumes that _buffer_offset is 0. Ensure that this is true.
+ self._buffer = self._buffer[self._buffer_offset:]
+ self._buffer_offset = 0
+
+ blocks = []
+ while n > 0 and self._fill_buffer():
+ if n < len(self._buffer):
+ data = self._buffer[:n]
+ self._buffer_offset = n
+ else:
+ data = self._buffer
+ self._buffer = b""
+ if return_data:
+ blocks.append(data)
+ self._pos += len(data)
+ n -= len(data)
+ if return_data:
+ return b"".join(blocks)
+
+ def peek(self, n=0):
+ """Return buffered data without advancing the file position.
+
+ Always returns at least one byte of data, unless at EOF.
+ The exact number of bytes returned is unspecified.
+ """
+ with self._lock:
+ self._check_can_read()
+ if not self._fill_buffer():
+ return b""
+ return self._buffer[self._buffer_offset:]
+
+ def read(self, size=-1):
+ """Read up to size uncompressed bytes from the file.
+
+ If size is negative or omitted, read until EOF is reached.
+ Returns b'' if the file is already at EOF.
+ """
+ with self._lock:
+ self._check_can_read()
+ if size == 0:
+ return b""
+ elif size < 0:
+ return self._read_all()
+ else:
+ return self._read_block(size)
+
+ def read1(self, size=-1):
+ """Read up to size uncompressed bytes, while trying to avoid
+ making multiple reads from the underlying stream.
+
+ Returns b'' if the file is at EOF.
+ """
+ # Usually, read1() calls _fp.read() at most once. However, sometimes
+ # this does not give enough data for the decompressor to make progress.
+ # In this case we make multiple reads, to avoid returning b"".
+ with self._lock:
+ self._check_can_read()
+ if (size == 0 or
+ # Only call _fill_buffer() if the buffer is actually empty.
+ # This gives a significant speedup if *size* is small.
+ (self._buffer_offset == len(self._buffer) and not self._fill_buffer())):
+ return b""
+ if size > 0:
+ data = self._buffer[self._buffer_offset :
+ self._buffer_offset + size]
+ self._buffer_offset += len(data)
+ else:
+ data = self._buffer[self._buffer_offset:]
+ self._buffer = b""
+ self._buffer_offset = 0
+ self._pos += len(data)
+ return data
+
+ def readinto(self, b):
+ """Read up to len(b) bytes into b.
+
+ Returns the number of bytes read (0 for EOF).
+ """
+ with self._lock:
+ return io.BufferedIOBase.readinto(self, b)
+
+ def readline(self, size=-1):
+ """Read a line of uncompressed bytes from the file.
+
+ The terminating newline (if present) is retained. If size is
+ non-negative, no more than size bytes will be read (in which
+ case the line may be incomplete). Returns b'' if already at EOF.
+ """
+ if not isinstance(size, int):
+ if not hasattr(size, "__index__"):
+ raise TypeError("Integer argument expected")
+ size = size.__index__()
+ with self._lock:
+ self._check_can_read()
+ # Shortcut for the common case - the whole line is in the buffer.
+ if size < 0:
+ end = self._buffer.find(b"\n", self._buffer_offset) + 1
+ if end > 0:
+ line = self._buffer[self._buffer_offset : end]
+ self._buffer_offset = end
+ self._pos += len(line)
+ return line
+ return io.BufferedIOBase.readline(self, size)
+
+ def readlines(self, size=-1):
+ """Read a list of lines of uncompressed bytes from the file.
+
+ size can be specified to control the number of lines read: no
+ further lines will be read once the total size of the lines read
+ so far equals or exceeds size.
+ """
+ if not isinstance(size, int):
+ if not hasattr(size, "__index__"):
+ raise TypeError("Integer argument expected")
+ size = size.__index__()
+ with self._lock:
+ return io.BufferedIOBase.readlines(self, size)
+
+ def write(self, data):
+ """Write a byte string to the file.
+
+ Returns the number of uncompressed bytes written, which is
+ always len(data). Note that due to buffering, the file on disk
+ may not reflect the data written until close() is called.
+ """
+ with self._lock:
+ self._check_can_write()
+ compressed = self._compressor.compress(data)
+ self._fp.write(compressed)
+ self._pos += len(data)
+ return len(data)
+
+ def writelines(self, seq):
+ """Write a sequence of byte strings to the file.
+
+ Returns the number of uncompressed bytes written.
+ seq can be any iterable yielding byte strings.
+
+ Line separators are not added between the written byte strings.
+ """
+ with self._lock:
+ return io.BufferedIOBase.writelines(self, seq)
+
+ # Rewind the file to the beginning of the data stream.
+ def _rewind(self):
+ self._fp.seek(0, 0)
+ self._mode = _MODE_READ
+ self._pos = 0
+ self._decompressor = BZ2Decompressor()
+ self._buffer = b""
+ self._buffer_offset = 0
+
+ def seek(self, offset, whence=0):
+ """Change the file position.
+
+ The new position is specified by offset, relative to the
+ position indicated by whence. Values for whence are:
+
+ 0: start of stream (default); offset must not be negative
+ 1: current stream position
+ 2: end of stream; offset must not be positive
+
+ Returns the new file position.
+
+ Note that seeking is emulated, so depending on the parameters,
+ this operation may be extremely slow.
+ """
+ with self._lock:
+ self._check_can_seek()
+
+ # Recalculate offset as an absolute file position.
+ if whence == 0:
+ pass
+ elif whence == 1:
+ offset = self._pos + offset
+ elif whence == 2:
+ # Seeking relative to EOF - we need to know the file's size.
+ if self._size < 0:
+ self._read_all(return_data=False)
+ offset = self._size + offset
+ else:
+ raise ValueError("Invalid value for whence: {}".format(whence))
+
+ # Make it so that offset is the number of bytes to skip forward.
+ if offset < self._pos:
+ self._rewind()
+ else:
+ offset -= self._pos
+
+ # Read and discard data until we reach the desired position.
+ self._read_block(offset, return_data=False)
+
+ return self._pos
+
+ def tell(self):
+ """Return the current file position."""
+ with self._lock:
+ self._check_not_closed()
+ return self._pos
+
+
+def open(filename, mode="rb", compresslevel=9,
+ encoding=None, errors=None, newline=None):
+ """Open a bzip2-compressed file in binary or text mode.
+
+ The filename argument can be an actual filename (a str or bytes object), or
+ an existing file object to read from or write to.
+
+ The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for binary mode,
+ or "rt", "wt" or "at" for text mode. The default mode is "rb", and the
+ default compresslevel is 9.
+
+ For binary mode, this function is equivalent to the BZ2File constructor:
+ BZ2File(filename, mode, compresslevel). In this case, the encoding, errors
+ and newline arguments must not be provided.
+
+ For text mode, a BZ2File object is created, and wrapped in an
+ io.TextIOWrapper instance with the specified encoding, error handling
+ behavior, and line ending(s).
+
+ """
+ if "t" in mode:
+ if "b" in mode:
+ raise ValueError("Invalid mode: %r" % (mode,))
+ else:
+ if encoding is not None:
+ raise ValueError("Argument 'encoding' not supported in binary mode")
+ if errors is not None:
+ raise ValueError("Argument 'errors' not supported in binary mode")
+ if newline is not None:
+ raise ValueError("Argument 'newline' not supported in binary mode")
+
+ bz_mode = mode.replace("t", "")
+ binary_file = BZ2File(filename, bz_mode, compresslevel=compresslevel)
+
+ if "t" in mode:
+ return io.TextIOWrapper(binary_file, encoding, errors, newline)
+ else:
+ return binary_file
+
+
+def compress(data, compresslevel=9):
+ """Compress a block of data.
+
+ compresslevel, if given, must be a number between 1 and 9.
+
+ For incremental compression, use a BZ2Compressor object instead.
+ """
+ comp = BZ2Compressor(compresslevel)
+ return comp.compress(data) + comp.flush()
+
+
+def decompress(data):
+ """Decompress a block of data.
+
+ For incremental decompression, use a BZ2Decompressor object instead.
+ """
+ if len(data) == 0:
+ return b""
+
+ results = []
+ while True:
+ decomp = BZ2Decompressor()
+ results.append(decomp.decompress(data))
+ if not decomp.eof:
+ raise ValueError("Compressed data ended before the "
+ "end-of-stream marker was reached")
+ if not decomp.unused_data:
+ return b"".join(results)
+ # There is unused data left over. Proceed to next stream.
+ data = decomp.unused_data
diff --git a/Lib/cgi.py b/Lib/cgi.py
index 90a3345..e964f0c 100755
--- a/Lib/cgi.py
+++ b/Lib/cgi.py
@@ -76,7 +76,7 @@ def initlog(*allargs):
send an error message).
"""
- global logfp, log
+ global log, logfile, logfp
if logfile and not logfp:
try:
logfp = open(logfile, "a")
@@ -96,6 +96,15 @@ def nolog(*allargs):
"""Dummy function, assigned to log when logging is disabled."""
pass
+def closelog():
+ """Close the log file."""
+ global log, logfile, logfp
+ logfile = ''
+ if logfp:
+ logfp.close()
+ logfp = None
+ log = initlog
+
log = initlog # The current logging function
@@ -1003,7 +1012,7 @@ environment as well. Here are some common variable names:
def escape(s, quote=None):
"""Deprecated API."""
warn("cgi.escape is deprecated, use html.escape instead",
- PendingDeprecationWarning, stacklevel=2)
+ DeprecationWarning, stacklevel=2)
s = s.replace("&", "&amp;") # Must be done first!
s = s.replace("<", "&lt;")
s = s.replace(">", "&gt;")
diff --git a/Lib/cgitb.py b/Lib/cgitb.py
index 6da40e8..6eb52e7 100644
--- a/Lib/cgitb.py
+++ b/Lib/cgitb.py
@@ -31,7 +31,6 @@ import tempfile
import time
import tokenize
import traceback
-import types
def reset():
"""Return a string that resets the CGI and browser to a known state."""
diff --git a/Lib/code.py b/Lib/code.py
index 605aede..9020aab 100644
--- a/Lib/code.py
+++ b/Lib/code.py
@@ -105,9 +105,10 @@ class InteractiveInterpreter:
The output is written by self.write(), below.
"""
- type, value, sys.last_traceback = sys.exc_info()
+ type, value, tb = sys.exc_info()
sys.last_type = type
sys.last_value = value
+ sys.last_traceback = tb
if filename and type is SyntaxError:
# Work hard to stuff the correct filename in the exception
try:
@@ -119,8 +120,13 @@ class InteractiveInterpreter:
# Stuff in the right filename
value = SyntaxError(msg, (filename, lineno, offset, line))
sys.last_value = value
- lines = traceback.format_exception_only(type, value)
- self.write(''.join(lines))
+ if sys.excepthook is sys.__excepthook__:
+ lines = traceback.format_exception_only(type, value)
+ self.write(''.join(lines))
+ else:
+ # If someone has set sys.excepthook, we let that take precedence
+ # over self.write
+ sys.excepthook(type, value, tb)
def showtraceback(self):
"""Display the exception that just occurred.
@@ -143,7 +149,12 @@ class InteractiveInterpreter:
lines.extend(traceback.format_exception_only(type, value))
finally:
tblist = tb = None
- self.write(''.join(lines))
+ if sys.excepthook is sys.__excepthook__:
+ self.write(''.join(lines))
+ else:
+ # If someone has set sys.excepthook, we let that take precedence
+ # over self.write
+ sys.excepthook(type, value, tb)
def write(self, data):
"""Write a string.
diff --git a/Lib/codecs.py b/Lib/codecs.py
index b150d64..48d4c9c 100644
--- a/Lib/codecs.py
+++ b/Lib/codecs.py
@@ -461,7 +461,7 @@ class StreamReader(Codec):
# read until we get the required number of characters (if available)
while True:
- # can the request can be satisfied from the character buffer?
+ # can the request be satisfied from the character buffer?
if chars < 0:
if size < 0:
if self.charbuffer:
@@ -484,7 +484,7 @@ class StreamReader(Codec):
if firstline:
newchars, decodedbytes = \
self.decode(data[:exc.start], self.errors)
- lines = newchars.splitlines(True)
+ lines = newchars.splitlines(keepends=True)
if len(lines)<=1:
raise
else:
@@ -526,7 +526,7 @@ class StreamReader(Codec):
self.charbuffer = self.linebuffer[0]
self.linebuffer = None
if not keepends:
- line = line.splitlines(False)[0]
+ line = line.splitlines(keepends=False)[0]
return line
readsize = size or 72
@@ -543,7 +543,7 @@ class StreamReader(Codec):
data += self.read(size=1, chars=1)
line += data
- lines = line.splitlines(True)
+ lines = line.splitlines(keepends=True)
if lines:
if len(lines) > 1:
# More than one line result; the first line is a full line
@@ -559,10 +559,10 @@ class StreamReader(Codec):
# only one remaining line, put it back into charbuffer
self.charbuffer = lines[0] + self.charbuffer
if not keepends:
- line = line.splitlines(False)[0]
+ line = line.splitlines(keepends=False)[0]
break
line0withend = lines[0]
- line0withoutend = lines[0].splitlines(False)[0]
+ line0withoutend = lines[0].splitlines(keepends=False)[0]
if line0withend != line0withoutend: # We really have a line end
# Put the rest back together and keep it until the next call
self.charbuffer = self._empty_charbuffer.join(lines[1:]) + \
@@ -575,7 +575,7 @@ class StreamReader(Codec):
# we didn't get anything or this was our only try
if not data or size is not None:
if line and not keepends:
- line = line.splitlines(False)[0]
+ line = line.splitlines(keepends=False)[0]
break
if readsize < 8000:
readsize *= 2
@@ -803,7 +803,7 @@ class StreamRecoder:
data = self.reader.read()
data, bytesencoded = self.encode(data, self.errors)
- return data.splitlines(1)
+ return data.splitlines(keepends=True)
def __next__(self):
@@ -1042,10 +1042,7 @@ def make_identity_dict(rng):
mapped to themselves.
"""
- res = {}
- for i in rng:
- res[i]=i
- return res
+ return {i:i for i in rng}
def make_encoding_map(decoding_map):
diff --git a/Lib/collections.py b/Lib/collections/__init__.py
index eb20243..e5f9599 100644
--- a/Lib/collections.py
+++ b/Lib/collections/__init__.py
@@ -1,13 +1,14 @@
__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
- 'UserString', 'Counter', 'OrderedDict']
-# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
-# They should however be considered an integral part of collections.py.
-from _abcoll import *
-import _abcoll
-__all__ += _abcoll.__all__
+ 'UserString', 'Counter', 'OrderedDict', 'ChainMap']
+
+# For backwards compatibility, continue to make the collections ABCs
+# available through the collections module.
+from collections.abc import *
+import collections.abc
+__all__ += collections.abc.__all__
from _collections import deque, defaultdict
-from operator import itemgetter as _itemgetter
+from operator import itemgetter as _itemgetter, eq as _eq
from keyword import iskeyword as _iskeyword
import sys as _sys
import heapq as _heapq
@@ -228,7 +229,7 @@ class OrderedDict(dict):
'''
if isinstance(other, OrderedDict):
return len(self)==len(other) and \
- all(p==q for p, q in zip(self.items(), other.items()))
+ all(map(_eq, self.items(), other.items()))
return dict.__eq__(self, other)
@@ -314,10 +315,10 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
"""
- # Parse and validate the field names. Validation serves two purposes,
- # generating informative error messages and preventing template injection attacks.
+ # Validate the field names. At the user's option, either generate an error
+ # message or automatically replace the field name with a valid name.
if isinstance(field_names, str):
- field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
+ field_names = field_names.replace(',', ' ').split()
field_names = list(map(str, field_names))
if rename:
seen = set()
@@ -332,15 +333,19 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
seen.add(name)
for name in [typename] + field_names:
if not all(c.isalnum() or c=='_' for c in name):
- raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
+ raise ValueError('Type names and field names can only contain '
+ 'alphanumeric characters and underscores: %r' % name)
if _iskeyword(name):
- raise ValueError('Type names and field names cannot be a keyword: %r' % name)
+ raise ValueError('Type names and field names cannot be a '
+ 'keyword: %r' % name)
if name[0].isdigit():
- raise ValueError('Type names and field names cannot start with a number: %r' % name)
+ raise ValueError('Type names and field names cannot start with '
+ 'a number: %r' % name)
seen = set()
for name in field_names:
if name.startswith('_') and not rename:
- raise ValueError('Field names cannot start with an underscore: %r' % name)
+ raise ValueError('Field names cannot start with an underscore: '
+ '%r' % name)
if name in seen:
raise ValueError('Encountered duplicate field name: %r' % name)
seen.add(name)
@@ -351,21 +356,23 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
field_names = tuple(field_names),
num_fields = len(field_names),
arg_list = repr(tuple(field_names)).replace("'", "")[1:-1],
- repr_fmt = ', '.join(_repr_template.format(name=name) for name in field_names),
+ repr_fmt = ', '.join(_repr_template.format(name=name)
+ for name in field_names),
field_defs = '\n'.join(_field_template.format(index=index, name=name)
for index, name in enumerate(field_names))
)
- # Execute the template string in a temporary namespace and
- # support tracing utilities by setting a value for frame.f_globals['__name__']
+ # Execute the template string in a temporary namespace and support
+ # tracing utilities by setting a value for frame.f_globals['__name__']
namespace = dict(__name__='namedtuple_%s' % typename)
try:
exec(class_definition, namespace)
except SyntaxError as e:
raise SyntaxError(e.msg + ':\n\n' + class_definition)
result = namespace[typename]
+ result._source = class_definition
if verbose:
- print(class_definition)
+ print(result._source)
# For pickling to work, the __module__ variable needs to be set to the frame
# where the named tuple is created. Bypass this step in enviroments where
@@ -674,12 +681,86 @@ class Counter(dict):
result[elem] = newcount
return result
+ def __pos__(self):
+ 'Adds an empty counter, effectively stripping negative and zero counts'
+ return self + Counter()
+
+ def __neg__(self):
+ '''Subtracts from an empty counter. Strips positive and zero counts,
+ and flips the sign on negative counts.
+
+ '''
+ return Counter() - self
+
+ def _keep_positive(self):
+ '''Internal method to strip elements with a negative or zero count'''
+ nonpositive = [elem for elem, count in self.items() if not count > 0]
+ for elem in nonpositive:
+ del self[elem]
+ return self
+
+ def __iadd__(self, other):
+ '''Inplace add from another counter, keeping only positive counts.
+
+ >>> c = Counter('abbb')
+ >>> c += Counter('bcc')
+ >>> c
+ Counter({'b': 4, 'c': 2, 'a': 1})
+
+ '''
+ for elem, count in other.items():
+ self[elem] += count
+ return self._keep_positive()
+
+ def __isub__(self, other):
+ '''Inplace subtract counter, but keep only results with positive counts.
+
+ >>> c = Counter('abbbc')
+ >>> c -= Counter('bccd')
+ >>> c
+ Counter({'b': 2, 'a': 1})
+
+ '''
+ for elem, count in other.items():
+ self[elem] -= count
+ return self._keep_positive()
+
+ def __ior__(self, other):
+ '''Inplace union is the maximum of value from either counter.
+
+ >>> c = Counter('abbb')
+ >>> c |= Counter('bcc')
+ >>> c
+ Counter({'b': 3, 'c': 2, 'a': 1})
+
+ '''
+ for elem, other_count in other.items():
+ count = self[elem]
+ if other_count > count:
+ self[elem] = other_count
+ return self._keep_positive()
+
+ def __iand__(self, other):
+ '''Inplace intersection is the minimum of corresponding counts.
+
+ >>> c = Counter('abbb')
+ >>> c &= Counter('bcc')
+ >>> c
+ Counter({'b': 1})
+
+ '''
+ for elem, count in self.items():
+ other_count = other[elem]
+ if other_count < count:
+ self[elem] = other_count
+ return self._keep_positive()
+
########################################################################
-### ChainMap (helper for configparser)
+### ChainMap (helper for configparser and string.Template)
########################################################################
-class _ChainMap(MutableMapping):
+class ChainMap(MutableMapping):
''' A ChainMap groups multiple dicts (or other mappings) together
to create a single, updateable view.
@@ -890,6 +971,8 @@ class UserList(MutableSequence):
def insert(self, i, item): self.data.insert(i, item)
def pop(self, i=-1): return self.data.pop(i)
def remove(self, item): self.data.remove(item)
+ def clear(self): self.data.clear()
+ def copy(self): return self.__class__(self)
def count(self, item): return self.data.count(item)
def index(self, item, *args): return self.data.index(item, *args)
def reverse(self): self.data.reverse()
@@ -1034,7 +1117,7 @@ class UserString(Sequence):
return self.data.split(sep, maxsplit)
def rsplit(self, sep=None, maxsplit=-1):
return self.data.rsplit(sep, maxsplit)
- def splitlines(self, keepends=0): return self.data.splitlines(keepends)
+ def splitlines(self, keepends=False): return self.data.splitlines(keepends)
def startswith(self, prefix, start=0, end=_sys.maxsize):
return self.data.startswith(prefix, start, end)
def strip(self, chars=None): return self.__class__(self.data.strip(chars))
@@ -1044,44 +1127,3 @@ class UserString(Sequence):
return self.__class__(self.data.translate(*args))
def upper(self): return self.__class__(self.data.upper())
def zfill(self, width): return self.__class__(self.data.zfill(width))
-
-
-
-################################################################################
-### Simple tests
-################################################################################
-
-if __name__ == '__main__':
- # verify that instances can be pickled
- from pickle import loads, dumps
- Point = namedtuple('Point', 'x, y', True)
- p = Point(x=10, y=20)
- assert p == loads(dumps(p))
-
- # test and demonstrate ability to override methods
- class Point(namedtuple('Point', 'x y')):
- __slots__ = ()
- @property
- def hypot(self):
- return (self.x ** 2 + self.y ** 2) ** 0.5
- def __str__(self):
- return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
-
- for p in Point(3, 4), Point(14, 5/7.):
- print (p)
-
- class Point(namedtuple('Point', 'x y')):
- 'Point class with optimized _make() and _replace() without error-checking'
- __slots__ = ()
- _make = classmethod(tuple.__new__)
- def _replace(self, _map=map, **kwds):
- return self._make(_map(kwds.get, ('x', 'y'), self))
-
- print(Point(11, 22)._replace(x=100))
-
- Point3D = namedtuple('Point3D', Point._fields + ('z',))
- print(Point3D.__doc__)
-
- import doctest
- TestResults = namedtuple('TestResults', 'failed attempted')
- print(TestResults(*doctest.testmod()))
diff --git a/Lib/collections/__main__.py b/Lib/collections/__main__.py
new file mode 100644
index 0000000..763e38e
--- /dev/null
+++ b/Lib/collections/__main__.py
@@ -0,0 +1,38 @@
+################################################################################
+### Simple tests
+################################################################################
+
+# verify that instances can be pickled
+from collections import namedtuple
+from pickle import loads, dumps
+Point = namedtuple('Point', 'x, y', True)
+p = Point(x=10, y=20)
+assert p == loads(dumps(p))
+
+# test and demonstrate ability to override methods
+class Point(namedtuple('Point', 'x y')):
+ __slots__ = ()
+ @property
+ def hypot(self):
+ return (self.x ** 2 + self.y ** 2) ** 0.5
+ def __str__(self):
+ return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
+
+for p in Point(3, 4), Point(14, 5/7.):
+ print (p)
+
+class Point(namedtuple('Point', 'x y')):
+ 'Point class with optimized _make() and _replace() without error-checking'
+ __slots__ = ()
+ _make = classmethod(tuple.__new__)
+ def _replace(self, _map=map, **kwds):
+ return self._make(_map(kwds.get, ('x', 'y'), self))
+
+print(Point(11, 22)._replace(x=100))
+
+Point3D = namedtuple('Point3D', Point._fields + ('z',))
+print(Point3D.__doc__)
+
+import doctest, collections
+TestResults = namedtuple('TestResults', 'failed attempted')
+print(TestResults(*doctest.testmod(collections)))
diff --git a/Lib/_abcoll.py b/Lib/collections/abc.py
index 5ddcea3..c23b7dd 100644
--- a/Lib/_abcoll.py
+++ b/Lib/collections/abc.py
@@ -3,9 +3,7 @@
"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
-DON'T USE THIS MODULE DIRECTLY! The classes here should be imported
-via collections; they are defined here only to alleviate certain
-bootstrapping issues. Unit tests are in test_collections.
+Unit tests are in test_collections.
"""
from abc import ABCMeta, abstractmethod
@@ -20,9 +18,13 @@ __all__ = ["Hashable", "Iterable", "Iterator",
"ByteString",
]
-
-### collection related types which are not exposed through builtin ###
-## iterators ##
+# Private list of types that we want to register with the various ABCs
+# so that they will pass tests like:
+# it = iter(somebytearray)
+# assert isinstance(it, Iterable)
+# Note: in other implementations, these types many not be distinct
+# and they make have their own implementation specific types that
+# are not included on this list.
bytes_iterator = type(iter(b''))
bytearray_iterator = type(iter(bytearray()))
#callable_iterator = ???
@@ -41,13 +43,15 @@ dict_keys = type({}.keys())
dict_values = type({}.values())
dict_items = type({}.items())
## misc ##
-dict_proxy = type(type.__dict__)
+mappingproxy = type(type.__dict__)
### ONE-TRICK PONIES ###
class Hashable(metaclass=ABCMeta):
+ __slots__ = ()
+
@abstractmethod
def __hash__(self):
return 0
@@ -65,6 +69,8 @@ class Hashable(metaclass=ABCMeta):
class Iterable(metaclass=ABCMeta):
+ __slots__ = ()
+
@abstractmethod
def __iter__(self):
while False:
@@ -80,6 +86,8 @@ class Iterable(metaclass=ABCMeta):
class Iterator(Iterable):
+ __slots__ = ()
+
@abstractmethod
def __next__(self):
raise StopIteration
@@ -111,6 +119,8 @@ Iterator.register(zip_iterator)
class Sized(metaclass=ABCMeta):
+ __slots__ = ()
+
@abstractmethod
def __len__(self):
return 0
@@ -125,6 +135,8 @@ class Sized(metaclass=ABCMeta):
class Container(metaclass=ABCMeta):
+ __slots__ = ()
+
@abstractmethod
def __contains__(self, x):
return False
@@ -139,6 +151,8 @@ class Container(metaclass=ABCMeta):
class Callable(metaclass=ABCMeta):
+ __slots__ = ()
+
@abstractmethod
def __call__(self, *args, **kwds):
return False
@@ -166,6 +180,8 @@ class Set(Sized, Iterable, Container):
then the other operations will automatically follow suit.
"""
+ __slots__ = ()
+
def __le__(self, other):
if not isinstance(other, Set):
return NotImplemented
@@ -277,6 +293,8 @@ Set.register(frozenset)
class MutableSet(Set):
+ __slots__ = ()
+
@abstractmethod
def add(self, value):
"""Add an element."""
@@ -350,6 +368,8 @@ MutableSet.register(set)
class Mapping(Sized, Iterable, Container):
+ __slots__ = ()
+
@abstractmethod
def __getitem__(self, key):
raise KeyError
@@ -385,6 +405,8 @@ class Mapping(Sized, Iterable, Container):
def __ne__(self, other):
return not (self == other)
+Mapping.register(mappingproxy)
+
class MappingView(Sized):
@@ -453,6 +475,8 @@ ValuesView.register(dict_values)
class MutableMapping(Mapping):
+ __slots__ = ()
+
@abstractmethod
def __setitem__(self, key, value):
raise KeyError
@@ -532,6 +556,8 @@ class Sequence(Sized, Iterable, Container):
__getitem__, and __len__.
"""
+ __slots__ = ()
+
@abstractmethod
def __getitem__(self, index):
raise IndexError
@@ -577,12 +603,16 @@ class ByteString(Sequence):
XXX Should add all their methods.
"""
+ __slots__ = ()
+
ByteString.register(bytes)
ByteString.register(bytearray)
class MutableSequence(Sequence):
+ __slots__ = ()
+
@abstractmethod
def __setitem__(self, index, value):
raise IndexError
@@ -598,6 +628,13 @@ class MutableSequence(Sequence):
def append(self, value):
self.insert(len(self), value)
+ def clear(self):
+ try:
+ while True:
+ self.pop()
+ except IndexError:
+ pass
+
def reverse(self):
n = len(self)
for i in range(n//2):
diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py
index 9f11f69..1e098be 100644
--- a/Lib/concurrent/futures/_base.py
+++ b/Lib/concurrent/futures/_base.py
@@ -4,7 +4,6 @@
__author__ = 'Brian Quinlan (brian@sweetapp.com)'
import collections
-import functools
import logging
import threading
import time
@@ -471,8 +470,8 @@ class Future(object):
return True
else:
LOGGER.critical('Future %s in unexpected state: %s',
- id(self.future),
- self.future._state)
+ id(self),
+ self._state)
raise RuntimeError('Future in unexpected state')
def set_result(self, result):
@@ -538,15 +537,19 @@ class Executor(object):
fs = [self.submit(fn, *args) for args in zip(*iterables)]
- try:
- for future in fs:
- if timeout is None:
- yield future.result()
- else:
- yield future.result(end_time - time.time())
- finally:
- for future in fs:
- future.cancel()
+ # Yield must be hidden in closure so that the futures are submitted
+ # before the first iterator value is required.
+ def result_iterator():
+ try:
+ for future in fs:
+ if timeout is None:
+ yield future.result()
+ else:
+ yield future.result(end_time - time.time())
+ finally:
+ for future in fs:
+ future.cancel()
+ return result_iterator()
def shutdown(self, wait=True):
"""Clean-up the resources associated with the Executor.
diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py
index d3bbe2c..04238a7 100644
--- a/Lib/concurrent/futures/process.py
+++ b/Lib/concurrent/futures/process.py
@@ -46,9 +46,12 @@ Process #1..n:
__author__ = 'Brian Quinlan (brian@sweetapp.com)'
import atexit
+import os
from concurrent.futures import _base
import queue
import multiprocessing
+from multiprocessing.queues import SimpleQueue, Full
+from multiprocessing.connection import wait
import threading
import weakref
@@ -121,7 +124,7 @@ def _process_worker(call_queue, result_queue):
call_item = call_queue.get(block=True)
if call_item is None:
# Wake up queue management thread
- result_queue.put(None)
+ result_queue.put(os.getpid())
return
try:
r = call_item.fn(*call_item.args, **call_item.kwargs)
@@ -193,46 +196,92 @@ def _queue_management_worker(executor_reference,
result_queue: A multiprocessing.Queue of _ResultItems generated by the
process workers.
"""
- nb_shutdown_processes = 0
- def shutdown_one_process():
- """Tell a worker to terminate, which will in turn wake us again"""
- nonlocal nb_shutdown_processes
- call_queue.put(None)
- nb_shutdown_processes += 1
+ executor = None
+
+ def shutting_down():
+ return _shutdown or executor is None or executor._shutdown_thread
+
+ def shutdown_worker():
+ # This is an upper bound
+ nb_children_alive = sum(p.is_alive() for p in processes.values())
+ for i in range(0, nb_children_alive):
+ call_queue.put_nowait(None)
+ # Release the queue's resources as soon as possible.
+ call_queue.close()
+ # If .join() is not called on the created processes then
+ # some multiprocessing.Queue methods may deadlock on Mac OS X.
+ for p in processes.values():
+ p.join()
+
+ reader = result_queue._reader
+
while True:
_add_call_item_to_queue(pending_work_items,
work_ids_queue,
call_queue)
- result_item = result_queue.get(block=True)
- if result_item is not None:
- work_item = pending_work_items[result_item.work_id]
- del pending_work_items[result_item.work_id]
-
- if result_item.exception:
- work_item.future.set_exception(result_item.exception)
- else:
- work_item.future.set_result(result_item.result)
+ sentinels = [p.sentinel for p in processes.values()]
+ assert sentinels
+ ready = wait([reader] + sentinels)
+ if reader in ready:
+ result_item = reader.recv()
+ else:
+ # Mark the process pool broken so that submits fail right now.
+ executor = executor_reference()
+ if executor is not None:
+ executor._broken = True
+ executor._shutdown_thread = True
+ executor = None
+ # All futures in flight must be marked failed
+ for work_id, work_item in pending_work_items.items():
+ work_item.future.set_exception(
+ BrokenProcessPool(
+ "A process in the process pool was "
+ "terminated abruptly while the future was "
+ "running or pending."
+ ))
+ pending_work_items.clear()
+ # Terminate remaining workers forcibly: the queues or their
+ # locks may be in a dirty state and block forever.
+ for p in processes.values():
+ p.terminate()
+ shutdown_worker()
+ return
+ if isinstance(result_item, int):
+ # Clean shutdown of a worker using its PID
+ # (avoids marking the executor broken)
+ assert shutting_down()
+ p = processes.pop(result_item)
+ p.join()
+ if not processes:
+ shutdown_worker()
+ return
+ elif result_item is not None:
+ work_item = pending_work_items.pop(result_item.work_id, None)
+ # work_item can be None if another process terminated (see above)
+ if work_item is not None:
+ if result_item.exception:
+ work_item.future.set_exception(result_item.exception)
+ else:
+ work_item.future.set_result(result_item.result)
# Check whether we should start shutting down.
executor = executor_reference()
# No more work items can be added if:
# - The interpreter is shutting down OR
# - The executor that owns this worker has been collected OR
# - The executor that owns this worker has been shutdown.
- if _shutdown or executor is None or executor._shutdown_thread:
- # Since no new work items can be added, it is safe to shutdown
- # this thread if there are no pending work items.
- if not pending_work_items:
- while nb_shutdown_processes < len(processes):
- shutdown_one_process()
- # If .join() is not called on the created processes then
- # some multiprocessing.Queue methods may deadlock on Mac OS
- # X.
- for p in processes:
- p.join()
- call_queue.close()
- return
- del executor
+ if shutting_down():
+ try:
+ # Since no new work items can be added, it is safe to shutdown
+ # this thread if there are no pending work items.
+ if not pending_work_items:
+ shutdown_worker()
+ return
+ except Full:
+ # This is not a problem: we will eventually be woken up (in
+ # result_queue.get()) and be able to send a sentinel again.
+ pass
+ executor = None
_system_limits_checked = False
_system_limited = None
@@ -243,7 +292,6 @@ def _check_system_limits():
raise NotImplementedError(_system_limited)
_system_limits_checked = True
try:
- import os
nsems_max = os.sysconf("SC_SEM_NSEMS_MAX")
except (AttributeError, ValueError):
# sysconf not available or setting not available
@@ -259,6 +307,14 @@ def _check_system_limits():
_system_limited = "system provides too few semaphores (%d available, 256 necessary)" % nsems_max
raise NotImplementedError(_system_limited)
+
+class BrokenProcessPool(RuntimeError):
+ """
+ Raised when a process in a ProcessPoolExecutor terminated abruptly
+ while a future was in the running state.
+ """
+
+
class ProcessPoolExecutor(_base.Executor):
def __init__(self, max_workers=None):
"""Initializes a new ProcessPoolExecutor instance.
@@ -280,14 +336,20 @@ class ProcessPoolExecutor(_base.Executor):
# because futures in the call queue cannot be cancelled.
self._call_queue = multiprocessing.Queue(self._max_workers +
EXTRA_QUEUED_CALLS)
- self._result_queue = multiprocessing.Queue()
+ # Killed worker processes can produce spurious "broken pipe"
+ # tracebacks in the queue's own worker thread. But we detect killed
+ # processes anyway, so silence the tracebacks.
+ self._call_queue._ignore_epipe = True
+ self._result_queue = SimpleQueue()
self._work_ids = queue.Queue()
self._queue_management_thread = None
- self._processes = set()
+ # Map of pids to processes
+ self._processes = {}
# Shutdown is a two-step process.
self._shutdown_thread = False
self._shutdown_lock = threading.Lock()
+ self._broken = False
self._queue_count = 0
self._pending_work_items = {}
@@ -297,6 +359,8 @@ class ProcessPoolExecutor(_base.Executor):
def weakref_cb(_, q=self._result_queue):
q.put(None)
if self._queue_management_thread is None:
+ # Start the processes so that their sentinels are known.
+ self._adjust_process_count()
self._queue_management_thread = threading.Thread(
target=_queue_management_worker,
args=(weakref.ref(self, weakref_cb),
@@ -316,10 +380,13 @@ class ProcessPoolExecutor(_base.Executor):
args=(self._call_queue,
self._result_queue))
p.start()
- self._processes.add(p)
+ self._processes[p.pid] = p
def submit(self, fn, *args, **kwargs):
with self._shutdown_lock:
+ if self._broken:
+ raise BrokenProcessPool('A child process terminated '
+ 'abruptly, the process pool is not usable anymore')
if self._shutdown_thread:
raise RuntimeError('cannot schedule new futures after shutdown')
@@ -333,7 +400,6 @@ class ProcessPoolExecutor(_base.Executor):
self._result_queue.put(None)
self._start_queue_management_thread()
- self._adjust_process_count()
return f
submit.__doc__ = _base.Executor.submit.__doc__
diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py
index fbac088..95bb682 100644
--- a/Lib/concurrent/futures/thread.py
+++ b/Lib/concurrent/futures/thread.py
@@ -74,7 +74,7 @@ def _worker(executor_reference, work_queue):
work_queue.put(None)
return
del executor
- except BaseException as e:
+ except BaseException:
_base.LOGGER.critical('Exception in worker', exc_info=True)
class ThreadPoolExecutor(_base.Executor):
diff --git a/Lib/configparser.py b/Lib/configparser.py
index d148b88..9d5f779 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -119,7 +119,8 @@ ConfigParser -- responsible for parsing a list of
between keys and values are surrounded by spaces.
"""
-from collections import MutableMapping, OrderedDict as _default_dict, _ChainMap
+from collections.abc import MutableMapping
+from collections import OrderedDict as _default_dict, ChainMap as _ChainMap
import functools
import io
import itertools
@@ -992,18 +993,26 @@ class RawConfigParser(MutableMapping):
indent_level = 0
e = None # None, or an exception
for lineno, line in enumerate(fp, start=1):
- comment_start = None
+ comment_start = sys.maxsize
# strip inline comments
- for prefix in self._inline_comment_prefixes:
- index = line.find(prefix)
- if index == 0 or (index > 0 and line[index-1].isspace()):
- comment_start = index
- break
+ inline_prefixes = {p: -1 for p in self._inline_comment_prefixes}
+ while comment_start == sys.maxsize and inline_prefixes:
+ next_prefixes = {}
+ for prefix, index in inline_prefixes.items():
+ index = line.find(prefix, index+1)
+ if index == -1:
+ continue
+ next_prefixes[prefix] = index
+ if index == 0 or (index > 0 and line[index-1].isspace()):
+ comment_start = min(comment_start, index)
+ inline_prefixes = next_prefixes
# strip full line comments
for prefix in self._comment_prefixes:
if line.strip().startswith(prefix):
comment_start = 0
break
+ if comment_start == sys.maxsize:
+ comment_start = None
value = line[:comment_start].strip()
if not value:
if self._empty_lines_in_values:
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index 5ebbbc6..bde2feb 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -1,10 +1,10 @@
"""Utilities for with-statement contexts. See PEP 343."""
import sys
+from collections import deque
from functools import wraps
-from warnings import warn
-__all__ = ["contextmanager", "closing", "ContextDecorator"]
+__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack"]
class ContextDecorator(object):
@@ -13,12 +13,12 @@ class ContextDecorator(object):
def _recreate_cm(self):
"""Return a recreated instance of self.
- Allows otherwise one-shot context managers like
+ Allows an otherwise one-shot context manager like
_GeneratorContextManager to support use as
- decorators via implicit recreation.
+ a decorator via implicit recreation.
- Note: this is a private interface just for _GCM in 3.2 but will be
- renamed and documented for third party use in 3.3
+ This is a private interface just for _GeneratorContextManager.
+ See issue #11647 for details.
"""
return self
@@ -139,3 +139,117 @@ class closing(object):
return self.thing
def __exit__(self, *exc_info):
self.thing.close()
+
+
+# Inspired by discussions on http://bugs.python.org/issue13585
+class ExitStack(object):
+ """Context manager for dynamic management of a stack of exit callbacks
+
+ For example:
+
+ with ExitStack() as stack:
+ files = [stack.enter_context(open(fname)) for fname in filenames]
+ # All opened files will automatically be closed at the end of
+ # the with statement, even if attempts to open files later
+ # in the list throw an exception
+
+ """
+ def __init__(self):
+ self._exit_callbacks = deque()
+
+ def pop_all(self):
+ """Preserve the context stack by transferring it to a new instance"""
+ new_stack = type(self)()
+ new_stack._exit_callbacks = self._exit_callbacks
+ self._exit_callbacks = deque()
+ return new_stack
+
+ def _push_cm_exit(self, cm, cm_exit):
+ """Helper to correctly register callbacks to __exit__ methods"""
+ def _exit_wrapper(*exc_details):
+ return cm_exit(cm, *exc_details)
+ _exit_wrapper.__self__ = cm
+ self.push(_exit_wrapper)
+
+ def push(self, exit):
+ """Registers a callback with the standard __exit__ method signature
+
+ Can suppress exceptions the same way __exit__ methods can.
+
+ Also accepts any object with an __exit__ method (registering a call
+ to the method instead of the object itself)
+ """
+ # We use an unbound method rather than a bound method to follow
+ # the standard lookup behaviour for special methods
+ _cb_type = type(exit)
+ try:
+ exit_method = _cb_type.__exit__
+ except AttributeError:
+ # Not a context manager, so assume its a callable
+ self._exit_callbacks.append(exit)
+ else:
+ self._push_cm_exit(exit, exit_method)
+ return exit # Allow use as a decorator
+
+ def callback(self, callback, *args, **kwds):
+ """Registers an arbitrary callback and arguments.
+
+ Cannot suppress exceptions.
+ """
+ def _exit_wrapper(exc_type, exc, tb):
+ callback(*args, **kwds)
+ # We changed the signature, so using @wraps is not appropriate, but
+ # setting __wrapped__ may still help with introspection
+ _exit_wrapper.__wrapped__ = callback
+ self.push(_exit_wrapper)
+ return callback # Allow use as a decorator
+
+ def enter_context(self, cm):
+ """Enters the supplied context manager
+
+ If successful, also pushes its __exit__ method as a callback and
+ returns the result of the __enter__ method.
+ """
+ # We look up the special methods on the type to match the with statement
+ _cm_type = type(cm)
+ _exit = _cm_type.__exit__
+ result = _cm_type.__enter__(cm)
+ self._push_cm_exit(cm, _exit)
+ return result
+
+ def close(self):
+ """Immediately unwind the context stack"""
+ self.__exit__(None, None, None)
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *exc_details):
+ # We manipulate the exception state so it behaves as though
+ # we were actually nesting multiple with statements
+ frame_exc = sys.exc_info()[1]
+ def _fix_exception_context(new_exc, old_exc):
+ while 1:
+ exc_context = new_exc.__context__
+ if exc_context in (None, frame_exc):
+ break
+ new_exc = exc_context
+ new_exc.__context__ = old_exc
+
+ # Callbacks are invoked in LIFO order to match the behaviour of
+ # nested context managers
+ suppressed_exc = False
+ while self._exit_callbacks:
+ cb = self._exit_callbacks.pop()
+ try:
+ if cb(*exc_details):
+ suppressed_exc = True
+ exc_details = (None, None, None)
+ except:
+ new_exc_details = sys.exc_info()
+ # simulate the stack of exceptions by setting the context
+ _fix_exception_context(new_exc_details[1], exc_details[1])
+ if not self._exit_callbacks:
+ raise
+ exc_details = new_exc_details
+ return suppressed_exc
diff --git a/Lib/copy.py b/Lib/copy.py
index 089d101..d96201e 100644
--- a/Lib/copy.py
+++ b/Lib/copy.py
@@ -173,8 +173,10 @@ def deepcopy(x, memo=None, _nil=[]):
"un(deep)copyable object of type %s" % cls)
y = _reconstruct(x, rv, 1, memo)
- memo[d] = y
- _keep_alive(x, memo) # Make sure x lives at least as long as d
+ # If is its own copy, don't memoize.
+ if y is not x:
+ memo[d] = y
+ _keep_alive(x, memo) # Make sure x lives at least as long as d
return y
_deepcopy_dispatch = d = {}
@@ -214,9 +216,10 @@ def _deepcopy_tuple(x, memo):
y = []
for a in x:
y.append(deepcopy(a, memo))
- d = id(x)
+ # We're not going to put the tuple in the memo, but it's still important we
+ # check for it, in case the tuple contains recursive mutable structures.
try:
- return memo[d]
+ return memo[id(x)]
except KeyError:
pass
for i in range(len(x)):
@@ -225,7 +228,6 @@ def _deepcopy_tuple(x, memo):
break
else:
y = x
- memo[d] = y
return y
d[tuple] = _deepcopy_tuple
@@ -321,68 +323,3 @@ del types
# Helper for instance creation without calling __init__
class _EmptyClass:
pass
-
-def _test():
- l = [None, 1, 2, 3.14, 'xyzzy', (1, 2), [3.14, 'abc'],
- {'abc': 'ABC'}, (), [], {}]
- l1 = copy(l)
- print(l1==l)
- l1 = map(copy, l)
- print(l1==l)
- l1 = deepcopy(l)
- print(l1==l)
- class C:
- def __init__(self, arg=None):
- self.a = 1
- self.arg = arg
- if __name__ == '__main__':
- import sys
- file = sys.argv[0]
- else:
- file = __file__
- self.fp = open(file)
- self.fp.close()
- def __getstate__(self):
- return {'a': self.a, 'arg': self.arg}
- def __setstate__(self, state):
- for key, value in state.items():
- setattr(self, key, value)
- def __deepcopy__(self, memo=None):
- new = self.__class__(deepcopy(self.arg, memo))
- new.a = self.a
- return new
- c = C('argument sketch')
- l.append(c)
- l2 = copy(l)
- print(l == l2)
- print(l)
- print(l2)
- l2 = deepcopy(l)
- print(l == l2)
- print(l)
- print(l2)
- l.append({l[1]: l, 'xyz': l[2]})
- l3 = copy(l)
- import reprlib
- print(map(reprlib.repr, l))
- print(map(reprlib.repr, l1))
- print(map(reprlib.repr, l2))
- print(map(reprlib.repr, l3))
- l3 = deepcopy(l)
- print(map(reprlib.repr, l))
- print(map(reprlib.repr, l1))
- print(map(reprlib.repr, l2))
- print(map(reprlib.repr, l3))
- class odict(dict):
- def __init__(self, d = {}):
- self.a = 99
- dict.__init__(self, d)
- def __setitem__(self, k, i):
- dict.__setitem__(self, k, i)
- self.a
- o = odict({"A" : "B"})
- x = deepcopy(o)
- print(o, x)
-
-if __name__ == '__main__':
- _test()
diff --git a/Lib/crypt.py b/Lib/crypt.py
new file mode 100644
index 0000000..b90c81c
--- /dev/null
+++ b/Lib/crypt.py
@@ -0,0 +1,62 @@
+"""Wrapper to the POSIX crypt library call and associated functionality."""
+
+import _crypt
+import string as _string
+from random import SystemRandom as _SystemRandom
+from collections import namedtuple as _namedtuple
+
+
+_saltchars = _string.ascii_letters + _string.digits + './'
+_sr = _SystemRandom()
+
+
+class _Method(_namedtuple('_Method', 'name ident salt_chars total_size')):
+
+ """Class representing a salt method per the Modular Crypt Format or the
+ legacy 2-character crypt method."""
+
+ def __repr__(self):
+ return '<crypt.METHOD_{}>'.format(self.name)
+
+
+def mksalt(method=None):
+ """Generate a salt for the specified method.
+
+ If not specified, the strongest available method will be used.
+
+ """
+ if method is None:
+ method = methods[0]
+ s = '${}$'.format(method.ident) if method.ident else ''
+ s += ''.join(_sr.sample(_saltchars, method.salt_chars))
+ return s
+
+
+def crypt(word, salt=None):
+ """Return a string representing the one-way hash of a password, with a salt
+ prepended.
+
+ If ``salt`` is not specified or is ``None``, the strongest
+ available method will be selected and a salt generated. Otherwise,
+ ``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as
+ returned by ``crypt.mksalt()``.
+
+ """
+ if salt is None or isinstance(salt, _Method):
+ salt = mksalt(salt)
+ return _crypt.crypt(word, salt)
+
+
+# available salting/crypto methods
+METHOD_CRYPT = _Method('CRYPT', None, 2, 13)
+METHOD_MD5 = _Method('MD5', '1', 8, 34)
+METHOD_SHA256 = _Method('SHA256', '5', 16, 63)
+METHOD_SHA512 = _Method('SHA512', '6', 16, 106)
+
+methods = []
+for _method in (METHOD_SHA512, METHOD_SHA256, METHOD_MD5):
+ _result = crypt('', _method)
+ if _result and len(_result) == _method.total_size:
+ methods.append(_method)
+methods.append(METHOD_CRYPT)
+del _result, _method
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index 111209a..c92e130 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -26,7 +26,7 @@ if _os.name == "posix" and _sys.platform == "darwin":
# libraries. OS X 10.3 is Darwin 7, so we check for
# that.
- if int(_os.uname()[2].split('.')[0]) < 8:
+ if int(_os.uname().release.split('.')[0]) < 8:
DEFAULT_MODE = RTLD_GLOBAL
from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \
@@ -456,7 +456,7 @@ if _os.name in ("nt", "ce"):
code = GetLastError()
if descr is None:
descr = FormatError(code).strip()
- return WindowsError(code, descr)
+ return WindowsError(None, descr, None, code)
if sizeof(c_uint) == sizeof(c_void_p):
c_size_t = c_uint
diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py
index c7207ea..5600b43 100644
--- a/Lib/ctypes/test/test_callbacks.py
+++ b/Lib/ctypes/test/test_callbacks.py
@@ -140,7 +140,7 @@ class Callbacks(unittest.TestCase):
def __del__(self):
gc.collect()
CFUNCTYPE(None)(lambda x=Nasty(): None)
-
+
try:
WINFUNCTYPE
diff --git a/Lib/ctypes/test/test_memfunctions.py b/Lib/ctypes/test/test_memfunctions.py
index aa2113b..aec4aaa 100644
--- a/Lib/ctypes/test/test_memfunctions.py
+++ b/Lib/ctypes/test/test_memfunctions.py
@@ -1,4 +1,5 @@
import sys
+from test import support
import unittest
from ctypes import *
@@ -49,6 +50,7 @@ class MemFunctionsTest(unittest.TestCase):
self.assertEqual(cast(a, POINTER(c_byte))[:7:7],
[97])
+ @support.refcount_test
def test_string_at(self):
s = string_at(b"foo bar")
# XXX The following may be wrong, depending on how Python
diff --git a/Lib/ctypes/test/test_parameters.py b/Lib/ctypes/test/test_parameters.py
index e83fd9a..9762fb9 100644
--- a/Lib/ctypes/test/test_parameters.py
+++ b/Lib/ctypes/test/test_parameters.py
@@ -73,13 +73,10 @@ class SimpleTypesTestCase(unittest.TestCase):
except ImportError:
## print "(No c_wchar_p)"
return
- s = "123"
- if sys.platform == "win32":
- self.assertTrue(c_wchar_p.from_param(s)._obj is s)
- self.assertRaises(TypeError, c_wchar_p.from_param, 42)
- # new in 0.9.1: convert (decode) ascii to unicode
- self.assertEqual(c_wchar_p.from_param("123")._obj, "123")
+ c_wchar_p.from_param("123")
+
+ self.assertRaises(TypeError, c_wchar_p.from_param, 42)
self.assertRaises(TypeError, c_wchar_p.from_param, b"123\377")
pa = c_wchar_p.from_param(c_wchar_p("123"))
diff --git a/Lib/ctypes/test/test_pep3118.py b/Lib/ctypes/test/test_pep3118.py
index fa6461f..ad13b01 100644
--- a/Lib/ctypes/test/test_pep3118.py
+++ b/Lib/ctypes/test/test_pep3118.py
@@ -25,14 +25,17 @@ class Test(unittest.TestCase):
v = memoryview(ob)
try:
self.assertEqual(normalize(v.format), normalize(fmt))
- if shape is not None:
+ if shape:
self.assertEqual(len(v), shape[0])
else:
self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob))
self.assertEqual(v.itemsize, sizeof(itemtp))
self.assertEqual(v.shape, shape)
- # ctypes object always have a non-strided memory block
- self.assertEqual(v.strides, None)
+ # XXX Issue #12851: PyCData_NewGetBuffer() must provide strides
+ # if requested. memoryview currently reconstructs missing
+ # stride information, so this assert will fail.
+ # self.assertEqual(v.strides, ())
+
# they are always read/write
self.assertFalse(v.readonly)
@@ -52,14 +55,15 @@ class Test(unittest.TestCase):
v = memoryview(ob)
try:
self.assertEqual(v.format, fmt)
- if shape is not None:
+ if shape:
self.assertEqual(len(v), shape[0])
else:
self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob))
self.assertEqual(v.itemsize, sizeof(itemtp))
self.assertEqual(v.shape, shape)
- # ctypes object always have a non-strided memory block
- self.assertEqual(v.strides, None)
+ # XXX Issue #12851
+ # self.assertEqual(v.strides, ())
+
# they are always read/write
self.assertFalse(v.readonly)
@@ -110,34 +114,34 @@ native_types = [
## simple types
- (c_char, "<c", None, c_char),
- (c_byte, "<b", None, c_byte),
- (c_ubyte, "<B", None, c_ubyte),
- (c_short, "<h", None, c_short),
- (c_ushort, "<H", None, c_ushort),
+ (c_char, "<c", (), c_char),
+ (c_byte, "<b", (), c_byte),
+ (c_ubyte, "<B", (), c_ubyte),
+ (c_short, "<h", (), c_short),
+ (c_ushort, "<H", (), c_ushort),
# c_int and c_uint may be aliases to c_long
- #(c_int, "<i", None, c_int),
- #(c_uint, "<I", None, c_uint),
+ #(c_int, "<i", (), c_int),
+ #(c_uint, "<I", (), c_uint),
- (c_long, "<l", None, c_long),
- (c_ulong, "<L", None, c_ulong),
+ (c_long, "<l", (), c_long),
+ (c_ulong, "<L", (), c_ulong),
# c_longlong and c_ulonglong are aliases on 64-bit platforms
#(c_longlong, "<q", None, c_longlong),
#(c_ulonglong, "<Q", None, c_ulonglong),
- (c_float, "<f", None, c_float),
- (c_double, "<d", None, c_double),
+ (c_float, "<f", (), c_float),
+ (c_double, "<d", (), c_double),
# c_longdouble may be an alias to c_double
- (c_bool, "<?", None, c_bool),
- (py_object, "<O", None, py_object),
+ (c_bool, "<?", (), c_bool),
+ (py_object, "<O", (), py_object),
## pointers
- (POINTER(c_byte), "&<b", None, POINTER(c_byte)),
- (POINTER(POINTER(c_long)), "&&<l", None, POINTER(POINTER(c_long))),
+ (POINTER(c_byte), "&<b", (), POINTER(c_byte)),
+ (POINTER(POINTER(c_long)), "&&<l", (), POINTER(POINTER(c_long))),
## arrays and pointers
@@ -145,32 +149,32 @@ native_types = [
(c_float * 4 * 3 * 2, "(2,3,4)<f", (2,3,4), c_float),
(POINTER(c_short) * 2, "(2)&<h", (2,), POINTER(c_short)),
(POINTER(c_short) * 2 * 3, "(3,2)&<h", (3,2,), POINTER(c_short)),
- (POINTER(c_short * 2), "&(2)<h", None, POINTER(c_short)),
+ (POINTER(c_short * 2), "&(2)<h", (), POINTER(c_short)),
## structures and unions
- (Point, "T{<l:x:<l:y:}", None, Point),
+ (Point, "T{<l:x:<l:y:}", (), Point),
# packed structures do not implement the pep
- (PackedPoint, "B", None, PackedPoint),
- (Point2, "T{<l:x:<l:y:}", None, Point2),
- (EmptyStruct, "T{}", None, EmptyStruct),
+ (PackedPoint, "B", (), PackedPoint),
+ (Point2, "T{<l:x:<l:y:}", (), Point2),
+ (EmptyStruct, "T{}", (), EmptyStruct),
# the pep does't support unions
- (aUnion, "B", None, aUnion),
+ (aUnion, "B", (), aUnion),
## pointer to incomplete structure
- (Incomplete, "B", None, Incomplete),
- (POINTER(Incomplete), "&B", None, POINTER(Incomplete)),
+ (Incomplete, "B", (), Incomplete),
+ (POINTER(Incomplete), "&B", (), POINTER(Incomplete)),
# 'Complete' is a structure that starts incomplete, but is completed after the
# pointer type to it has been created.
- (Complete, "T{<l:a:}", None, Complete),
+ (Complete, "T{<l:a:}", (), Complete),
# Unfortunately the pointer format string is not fixed...
- (POINTER(Complete), "&B", None, POINTER(Complete)),
+ (POINTER(Complete), "&B", (), POINTER(Complete)),
## other
# function signatures are not implemented
- (CFUNCTYPE(None), "X{}", None, CFUNCTYPE(None)),
+ (CFUNCTYPE(None), "X{}", (), CFUNCTYPE(None)),
]
@@ -186,10 +190,10 @@ class LEPoint(LittleEndianStructure):
# and little endian machines.
#
endian_types = [
- (BEPoint, "T{>l:x:>l:y:}", None, BEPoint),
- (LEPoint, "T{<l:x:<l:y:}", None, LEPoint),
- (POINTER(BEPoint), "&T{>l:x:>l:y:}", None, POINTER(BEPoint)),
- (POINTER(LEPoint), "&T{<l:x:<l:y:}", None, POINTER(LEPoint)),
+ (BEPoint, "T{>l:x:>l:y:}", (), BEPoint),
+ (LEPoint, "T{<l:x:<l:y:}", (), LEPoint),
+ (POINTER(BEPoint), "&T{>l:x:>l:y:}", (), POINTER(BEPoint)),
+ (POINTER(LEPoint), "&T{<l:x:<l:y:}", (), POINTER(LEPoint)),
]
if __name__ == "__main__":
diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py
index 1f4c603..9de3980 100644
--- a/Lib/ctypes/test/test_python_api.py
+++ b/Lib/ctypes/test/test_python_api.py
@@ -1,5 +1,6 @@
from ctypes import *
import unittest, sys
+from test import support
from ctypes.test import is_resource_enabled
################################################################
@@ -25,6 +26,7 @@ class PythonAPITestCase(unittest.TestCase):
self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc")
+ @support.refcount_test
def test_PyString_FromString(self):
pythonapi.PyBytes_FromString.restype = py_object
pythonapi.PyBytes_FromString.argtypes = (c_char_p,)
@@ -56,6 +58,7 @@ class PythonAPITestCase(unittest.TestCase):
del res
self.assertEqual(grc(42), ref42)
+ @support.refcount_test
def test_PyObj_FromPtr(self):
s = "abc def ghi jkl"
ref = grc(s)
diff --git a/Lib/ctypes/test/test_refcounts.py b/Lib/ctypes/test/test_refcounts.py
index 35a81aa..5613e7a 100644
--- a/Lib/ctypes/test/test_refcounts.py
+++ b/Lib/ctypes/test/test_refcounts.py
@@ -1,4 +1,5 @@
import unittest
+from test import support
import ctypes
import gc
@@ -10,6 +11,7 @@ dll = ctypes.CDLL(_ctypes_test.__file__)
class RefcountTestCase(unittest.TestCase):
+ @support.refcount_test
def test_1(self):
from sys import getrefcount as grc
@@ -34,6 +36,7 @@ class RefcountTestCase(unittest.TestCase):
self.assertEqual(grc(callback), 2)
+ @support.refcount_test
def test_refcount(self):
from sys import getrefcount as grc
def func(*args):
diff --git a/Lib/ctypes/test/test_stringptr.py b/Lib/ctypes/test/test_stringptr.py
index 3d25fa5..95cd161 100644
--- a/Lib/ctypes/test/test_stringptr.py
+++ b/Lib/ctypes/test/test_stringptr.py
@@ -1,4 +1,5 @@
import unittest
+from test import support
from ctypes import *
import _ctypes_test
@@ -7,6 +8,7 @@ lib = CDLL(_ctypes_test.__file__)
class StringPtrTestCase(unittest.TestCase):
+ @support.refcount_test
def test__POINTER_c_char(self):
class X(Structure):
_fields_ = [("str", POINTER(c_char))]
diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py
index 2534a74..128914e 100644
--- a/Lib/ctypes/test/test_win32.py
+++ b/Lib/ctypes/test/test_win32.py
@@ -67,6 +67,28 @@ if sys.platform == "win32":
self.assertEqual(ex.text, "text")
self.assertEqual(ex.details, ("details",))
+ class TestWinError(unittest.TestCase):
+ def test_winerror(self):
+ # see Issue 16169
+ import errno
+ ERROR_INVALID_PARAMETER = 87
+ msg = FormatError(ERROR_INVALID_PARAMETER).strip()
+ args = (errno.EINVAL, msg, None, ERROR_INVALID_PARAMETER)
+
+ e = WinError(ERROR_INVALID_PARAMETER)
+ self.assertEqual(e.args, args)
+ self.assertEqual(e.errno, errno.EINVAL)
+ self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER)
+
+ windll.kernel32.SetLastError(ERROR_INVALID_PARAMETER)
+ try:
+ raise WinError()
+ except OSError as exc:
+ e = exc
+ self.assertEqual(e.args, args)
+ self.assertEqual(e.errno, errno.EINVAL)
+ self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER)
+
class Structures(unittest.TestCase):
def test_struct_by_value(self):
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index 1bb7d1d..5555b2e 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -1,5 +1,6 @@
import sys, os
import contextlib
+import subprocess
# find_library(name) returns the pathname of a library, or None.
if os.name == "nt":
@@ -39,8 +40,8 @@ if os.name == "nt":
clibname = 'msvcr%d' % (version * 10)
# If python was built with in debug mode
- import imp
- if imp.get_suffixes()[0][0] == '_d.pyd':
+ import importlib.machinery
+ if '_d.pyd' in importlib.machinery.EXTENSION_SUFFIXES:
clibname += 'd'
return clibname+'.dll'
@@ -136,16 +137,12 @@ elif os.name == "posix":
rv = f.close()
if rv == 10:
raise OSError('objdump command not found')
- with contextlib.closing(os.popen(cmd)) as f:
- data = f.read()
- res = re.search(r'\sSONAME\s+([^\s]+)', data)
+ res = re.search(r'\sSONAME\s+([^\s]+)', dump)
if not res:
return None
return res.group(1)
- if (sys.platform.startswith("freebsd")
- or sys.platform.startswith("openbsd")
- or sys.platform.startswith("dragonfly")):
+ if sys.platform.startswith(("freebsd", "openbsd", "dragonfly")):
def _num_version(libname):
# "libxyz.so.MAJOR.MINOR" => [ MAJOR, MINOR ]
@@ -174,9 +171,9 @@ elif os.name == "posix":
def _findSoname_ldconfig(name):
import struct
if struct.calcsize('l') == 4:
- machine = os.uname()[4] + '-32'
+ machine = os.uname().machine + '-32'
else:
- machine = os.uname()[4] + '-64'
+ machine = os.uname().machine + '-64'
mach_map = {
'x86_64-64': 'libc6,x86-64',
'ppc64-64': 'libc6,64bit',
@@ -187,13 +184,19 @@ elif os.name == "posix":
abi_type = mach_map.get(machine, 'libc6')
# XXX assuming GLIBC's ldconfig (with option -p)
- expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type)
- with contextlib.closing(os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')) as f:
- data = f.read()
- res = re.search(expr, data)
- if not res:
- return None
- return res.group(1)
+ regex = os.fsencode(
+ '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type))
+ try:
+ with subprocess.Popen(['/sbin/ldconfig', '-p'],
+ stdin=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ env={'LC_ALL': 'C', 'LANG': 'C'}) as p:
+ res = re.search(regex, p.stdout.read())
+ if res:
+ return os.fsdecode(res.group(1))
+ except OSError:
+ pass
def find_library(name):
return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))
diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py
index a3e9def..7bfa667 100644
--- a/Lib/curses/__init__.py
+++ b/Lib/curses/__init__.py
@@ -11,7 +11,6 @@ the package, and perhaps a particular module inside it.
"""
from _curses import *
-from curses.wrapper import wrapper
import os as _os
import sys as _sys
@@ -55,3 +54,48 @@ try:
has_key
except NameError:
from .has_key import has_key
+
+# Wrapper for the entire curses-based application. Runs a function which
+# should be the rest of your curses-based application. If the application
+# raises an exception, wrapper() will restore the terminal to a sane state so
+# you can read the resulting traceback.
+
+def wrapper(func, *args, **kwds):
+ """Wrapper function that initializes curses and calls another function,
+ restoring normal keyboard/screen behavior on error.
+ The callable object 'func' is then passed the main window 'stdscr'
+ as its first argument, followed by any other arguments passed to
+ wrapper().
+ """
+
+ try:
+ # Initialize curses
+ stdscr = initscr()
+
+ # Turn off echoing of keys, and enter cbreak mode,
+ # where no buffering is performed on keyboard input
+ noecho()
+ cbreak()
+
+ # In keypad mode, escape sequences for special keys
+ # (like the cursor keys) will be interpreted and
+ # a special value like curses.KEY_LEFT will be returned
+ stdscr.keypad(1)
+
+ # Start color, too. Harmless if the terminal doesn't have
+ # color; user can test with has_color() later on. The try/catch
+ # works around a minor bit of over-conscientiousness in the curses
+ # module -- the error return from C start_color() is ignorable.
+ try:
+ start_color()
+ except:
+ pass
+
+ return func(stdscr, *args, **kwds)
+ finally:
+ # Set everything back to normal
+ if 'stdscr' in locals():
+ stdscr.keypad(0)
+ echo()
+ nocbreak()
+ endwin()
diff --git a/Lib/curses/wrapper.py b/Lib/curses/wrapper.py
deleted file mode 100644
index 5183ce7..0000000
--- a/Lib/curses/wrapper.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""curses.wrapper
-
-Contains one function, wrapper(), which runs another function which
-should be the rest of your curses-based application. If the
-application raises an exception, wrapper() will restore the terminal
-to a sane state so you can read the resulting traceback.
-
-"""
-
-import curses
-
-def wrapper(func, *args, **kwds):
- """Wrapper function that initializes curses and calls another function,
- restoring normal keyboard/screen behavior on error.
- The callable object 'func' is then passed the main window 'stdscr'
- as its first argument, followed by any other arguments passed to
- wrapper().
- """
-
- try:
- # Initialize curses
- stdscr = curses.initscr()
-
- # Turn off echoing of keys, and enter cbreak mode,
- # where no buffering is performed on keyboard input
- curses.noecho()
- curses.cbreak()
-
- # In keypad mode, escape sequences for special keys
- # (like the cursor keys) will be interpreted and
- # a special value like curses.KEY_LEFT will be returned
- stdscr.keypad(1)
-
- # Start color, too. Harmless if the terminal doesn't have
- # color; user can test with has_color() later on. The try/catch
- # works around a minor bit of over-conscientiousness in the curses
- # module -- the error return from C start_color() is ignorable.
- try:
- curses.start_color()
- except:
- pass
-
- return func(stdscr, *args, **kwds)
- finally:
- # Set everything back to normal
- if 'stdscr' in locals():
- stdscr.keypad(0)
- curses.echo()
- curses.nocbreak()
- curses.endwin()
diff --git a/Lib/datetime.py b/Lib/datetime.py
index bf23e50..f506e9a 100644
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -172,10 +172,6 @@ def _format_time(hh, mm, ss, us):
# Correctly substitute for %z and %Z escapes in strftime formats.
def _wrap_strftime(object, format, timetuple):
- year = timetuple[0]
- if year < 1000:
- raise ValueError("year=%d is before 1000; the datetime strftime() "
- "methods require year >= 1000" % year)
# Don't call utcoffset() or tzname() unless actually needed.
freplace = None # the string to use for %f
zreplace = None # the string to use for %z
@@ -1069,13 +1065,13 @@ class time:
def __eq__(self, other):
if isinstance(other, time):
- return self._cmp(other) == 0
+ return self._cmp(other, allow_mixed=True) == 0
else:
return False
def __ne__(self, other):
if isinstance(other, time):
- return self._cmp(other) != 0
+ return self._cmp(other, allow_mixed=True) != 0
else:
return True
@@ -1103,7 +1099,7 @@ class time:
else:
_cmperror(self, other)
- def _cmp(self, other):
+ def _cmp(self, other, allow_mixed=False):
assert isinstance(other, time)
mytz = self._tzinfo
ottz = other._tzinfo
@@ -1122,7 +1118,10 @@ class time:
(other._hour, other._minute, other._second,
other._microsecond))
if myoff is None or otoff is None:
- raise TypeError("cannot compare naive and aware times")
+ if allow_mixed:
+ return 2 # arbitrary non-zero value
+ else:
+ raise TypeError("cannot compare naive and aware times")
myhhmm = self._hour * 60 + self._minute - myoff//timedelta(minutes=1)
othhmm = other._hour * 60 + other._minute - otoff//timedelta(minutes=1)
return _cmp((myhhmm, self._second, self._microsecond),
@@ -1364,7 +1363,7 @@ class datetime(date):
converter = _time.localtime if tz is None else _time.gmtime
t, frac = divmod(t, 1.0)
- us = round(frac * 1e6)
+ us = int(frac * 1e6)
# If timestamp is less than one microsecond smaller than a
# full second, us can be rounded up to 1000000. In this case,
@@ -1384,7 +1383,7 @@ class datetime(date):
def utcfromtimestamp(cls, t):
"Construct a UTC datetime from a POSIX timestamp (like time.time())."
t, frac = divmod(t, 1.0)
- us = round(frac * 1e6)
+ us = int(frac * 1e6)
# If timestamp is less than one microsecond smaller than a
# full second, us can be rounded up to 1000000. In this case,
@@ -1438,6 +1437,15 @@ class datetime(date):
self.hour, self.minute, self.second,
dst)
+ def timestamp(self):
+ "Return POSIX timestamp as float"
+ if self._tzinfo is None:
+ return _time.mktime((self.year, self.month, self.day,
+ self.hour, self.minute, self.second,
+ -1, -1, -1)) + self.microsecond / 1e6
+ else:
+ return (self - _EPOCH).total_seconds()
+
def utctimetuple(self):
"Return UTC time tuple compatible with time.gmtime()."
offset = self.utcoffset()
@@ -1485,8 +1493,32 @@ class datetime(date):
return datetime(year, month, day, hour, minute, second,
microsecond, tzinfo)
- def astimezone(self, tz):
- if not isinstance(tz, tzinfo):
+ def astimezone(self, tz=None):
+ if tz is None:
+ if self.tzinfo is None:
+ raise ValueError("astimezone() requires an aware datetime")
+ ts = (self - _EPOCH) // timedelta(seconds=1)
+ localtm = _time.localtime(ts)
+ local = datetime(*localtm[:6])
+ try:
+ # Extract TZ data if available
+ gmtoff = localtm.tm_gmtoff
+ zone = localtm.tm_zone
+ except AttributeError:
+ # Compute UTC offset and compare with the value implied
+ # by tm_isdst. If the values match, use the zone name
+ # implied by tm_isdst.
+ delta = local - datetime(*_time.gmtime(ts)[:6])
+ dst = _time.daylight and localtm.tm_isdst > 0
+ gmtoff = -(_time.altzone if dst else _time.timezone)
+ if delta == timedelta(seconds=gmtoff):
+ tz = timezone(delta, _time.tzname[dst])
+ else:
+ tz = timezone(delta)
+ else:
+ tz = timezone(timedelta(seconds=gmtoff), zone)
+
+ elif not isinstance(tz, tzinfo):
raise TypeError("tz argument must be an instance of tzinfo")
mytz = self.tzinfo
@@ -1610,7 +1642,7 @@ class datetime(date):
def __eq__(self, other):
if isinstance(other, datetime):
- return self._cmp(other) == 0
+ return self._cmp(other, allow_mixed=True) == 0
elif not isinstance(other, date):
return NotImplemented
else:
@@ -1618,7 +1650,7 @@ class datetime(date):
def __ne__(self, other):
if isinstance(other, datetime):
- return self._cmp(other) != 0
+ return self._cmp(other, allow_mixed=True) != 0
elif not isinstance(other, date):
return NotImplemented
else:
@@ -1656,7 +1688,7 @@ class datetime(date):
else:
_cmperror(self, other)
- def _cmp(self, other):
+ def _cmp(self, other, allow_mixed=False):
assert isinstance(other, datetime)
mytz = self._tzinfo
ottz = other._tzinfo
@@ -1665,10 +1697,8 @@ class datetime(date):
if mytz is ottz:
base_compare = True
else:
- if mytz is not None:
- myoff = self.utcoffset()
- if ottz is not None:
- otoff = other.utcoffset()
+ myoff = self.utcoffset()
+ otoff = other.utcoffset()
base_compare = myoff == otoff
if base_compare:
@@ -1679,7 +1709,10 @@ class datetime(date):
other._hour, other._minute, other._second,
other._microsecond))
if myoff is None or otoff is None:
- raise TypeError("cannot compare naive and aware datetimes")
+ if allow_mixed:
+ return 2 # arbitrary non-zero value
+ else:
+ raise TypeError("cannot compare naive and aware datetimes")
# XXX What follows could be done more efficiently...
diff = self - other # this will take offsets into account
if diff.days < 0:
@@ -1895,7 +1928,7 @@ class timezone(tzinfo):
timezone.utc = timezone._create(timedelta(0))
timezone.min = timezone._create(timezone._minoffset)
timezone.max = timezone._create(timezone._maxoffset)
-
+_EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc)
"""
Some time zone algebra. For a datetime x, let
x.n = x stripped of its timezone -- its naive time.
diff --git a/Lib/decimal.py b/Lib/decimal.py
index 49de535..b74ab01 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -46,8 +46,8 @@ Decimal('1')
Decimal('-0.0123')
>>> Decimal(123456)
Decimal('123456')
->>> Decimal('123.45e12345678901234567890')
-Decimal('1.2345E+12345678901234567892')
+>>> Decimal('123.45e12345678')
+Decimal('1.2345E+12345680')
>>> Decimal('1.33') + Decimal('1.27')
Decimal('2.60')
>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
@@ -122,13 +122,20 @@ __all__ = [
# Exceptions
'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
+ 'FloatOperation',
# Constants for use in setting up contexts
'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
# Functions for manipulating contexts
- 'setcontext', 'getcontext', 'localcontext'
+ 'setcontext', 'getcontext', 'localcontext',
+
+ # Limits for the C version for compatibility
+ 'MAX_PREC', 'MAX_EMAX', 'MIN_EMIN', 'MIN_ETINY',
+
+ # C version: compile time choice that enables the thread local context
+ 'HAVE_THREADS'
]
__version__ = '1.70' # Highest version of the spec this complies with
@@ -137,6 +144,7 @@ __version__ = '1.70' # Highest version of the spec this complies with
import copy as _copy
import math as _math
import numbers as _numbers
+import sys
try:
from collections import namedtuple as _namedtuple
@@ -154,6 +162,19 @@ ROUND_UP = 'ROUND_UP'
ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
ROUND_05UP = 'ROUND_05UP'
+# Compatibility with the C version
+HAVE_THREADS = True
+if sys.maxsize == 2**63-1:
+ MAX_PREC = 999999999999999999
+ MAX_EMAX = 999999999999999999
+ MIN_EMIN = -999999999999999999
+else:
+ MAX_PREC = 425000000
+ MAX_EMAX = 425000000
+ MIN_EMIN = -425000000
+
+MIN_ETINY = MIN_EMIN - (MAX_PREC-1)
+
# Errors
class DecimalException(ArithmeticError):
@@ -370,9 +391,24 @@ class Underflow(Inexact, Rounded, Subnormal):
In all cases, Inexact, Rounded, and Subnormal will also be raised.
"""
+class FloatOperation(DecimalException, TypeError):
+ """Enable stricter semantics for mixing floats and Decimals.
+
+ If the signal is not trapped (default), mixing floats and Decimals is
+ permitted in the Decimal() constructor, context.create_decimal() and
+ all comparison operators. Both conversion and comparisons are exact.
+ Any occurrence of a mixed operation is silently recorded by setting
+ FloatOperation in the context flags. Explicit conversions with
+ Decimal.from_float() or context.create_decimal_from_float() do not
+ set the flag.
+
+ Otherwise (the signal is trapped), only equality comparisons and explicit
+ conversions are silent. All other mixed operations raise FloatOperation.
+ """
+
# List of public traps and flags
_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
- Underflow, InvalidOperation, Subnormal]
+ Underflow, InvalidOperation, Subnormal, FloatOperation]
# Map conditions (per the spec) to signals
_condition_map = {ConversionSyntax:InvalidOperation,
@@ -380,6 +416,10 @@ _condition_map = {ConversionSyntax:InvalidOperation,
DivisionUndefined:InvalidOperation,
InvalidContext:InvalidOperation}
+# Valid rounding modes
+_rounding_modes = (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_CEILING,
+ ROUND_FLOOR, ROUND_UP, ROUND_HALF_DOWN, ROUND_05UP)
+
##### Context Functions ##################################################
# The getcontext() and setcontext() function manage access to a thread-local
@@ -392,12 +432,11 @@ try:
import threading
except ImportError:
# Python was compiled without threads; create a mock object instead
- import sys
class MockThreading(object):
def local(self, sys=sys):
return sys.modules[__name__]
threading = MockThreading()
- del sys, MockThreading
+ del MockThreading
try:
threading.local
@@ -650,6 +689,11 @@ class Decimal(object):
return self
if isinstance(value, float):
+ if context is None:
+ context = getcontext()
+ context._raise_error(FloatOperation,
+ "strict semantics for mixing floats and Decimals are "
+ "enabled")
value = Decimal.from_float(value)
self._exp = value._exp
self._sign = value._sign
@@ -684,7 +728,9 @@ class Decimal(object):
"""
if isinstance(f, int): # handle integer inputs
return cls(f)
- if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
+ if not isinstance(f, float):
+ raise TypeError("argument must be int or float.")
+ if _math.isinf(f) or _math.isnan(f):
return cls(repr(f))
if _math.copysign(1.0, f) == 1.0:
sign = 0
@@ -1877,6 +1923,7 @@ class Decimal(object):
"""
other = _convert_other(other, raiseit=True)
+ third = _convert_other(third, raiseit=True)
# compute product; raise InvalidOperation if either operand is
# a signaling NaN or if the product is zero times infinity.
@@ -1906,17 +1953,17 @@ class Decimal(object):
str(int(self._int) * int(other._int)),
self._exp + other._exp)
- third = _convert_other(third, raiseit=True)
return product.__add__(third, context)
def _power_modulo(self, other, modulo, context=None):
"""Three argument version of __pow__"""
- # if can't convert other and modulo to Decimal, raise
- # TypeError; there's no point returning NotImplemented (no
- # equivalent of __rpow__ for three argument pow)
- other = _convert_other(other, raiseit=True)
- modulo = _convert_other(modulo, raiseit=True)
+ other = _convert_other(other)
+ if other is NotImplemented:
+ return other
+ modulo = _convert_other(modulo)
+ if modulo is NotImplemented:
+ return modulo
if context is None:
context = getcontext()
@@ -2007,9 +2054,9 @@ class Decimal(object):
nonzero. For efficiency, other._exp should not be too large,
so that 10**abs(other._exp) is a feasible calculation."""
- # In the comments below, we write x for the value of self and
- # y for the value of other. Write x = xc*10**xe and y =
- # yc*10**ye.
+ # In the comments below, we write x for the value of self and y for the
+ # value of other. Write x = xc*10**xe and abs(y) = yc*10**ye, with xc
+ # and yc positive integers not divisible by 10.
# The main purpose of this method is to identify the *failure*
# of x**y to be exactly representable with as little effort as
@@ -2017,13 +2064,12 @@ class Decimal(object):
# eliminate the possibility of x**y being exact. Only if all
# these tests are passed do we go on to actually compute x**y.
- # Here's the main idea. First normalize both x and y. We
- # express y as a rational m/n, with m and n relatively prime
- # and n>0. Then for x**y to be exactly representable (at
- # *any* precision), xc must be the nth power of a positive
- # integer and xe must be divisible by n. If m is negative
- # then additionally xc must be a power of either 2 or 5, hence
- # a power of 2**n or 5**n.
+ # Here's the main idea. Express y as a rational number m/n, with m and
+ # n relatively prime and n>0. Then for x**y to be exactly
+ # representable (at *any* precision), xc must be the nth power of a
+ # positive integer and xe must be divisible by n. If y is negative
+ # then additionally xc must be a power of either 2 or 5, hence a power
+ # of 2**n or 5**n.
#
# There's a limit to how small |y| can be: if y=m/n as above
# then:
@@ -2095,21 +2141,43 @@ class Decimal(object):
return None
# now xc is a power of 2; e is its exponent
e = _nbits(xc)-1
- # find e*y and xe*y; both must be integers
- if ye >= 0:
- y_as_int = yc*10**ye
- e = e*y_as_int
- xe = xe*y_as_int
- else:
- ten_pow = 10**-ye
- e, remainder = divmod(e*yc, ten_pow)
- if remainder:
- return None
- xe, remainder = divmod(xe*yc, ten_pow)
- if remainder:
- return None
-
- if e*65 >= p*93: # 93/65 > log(10)/log(5)
+
+ # We now have:
+ #
+ # x = 2**e * 10**xe, e > 0, and y < 0.
+ #
+ # The exact result is:
+ #
+ # x**y = 5**(-e*y) * 10**(e*y + xe*y)
+ #
+ # provided that both e*y and xe*y are integers. Note that if
+ # 5**(-e*y) >= 10**p, then the result can't be expressed
+ # exactly with p digits of precision.
+ #
+ # Using the above, we can guard against large values of ye.
+ # 93/65 is an upper bound for log(10)/log(5), so if
+ #
+ # ye >= len(str(93*p//65))
+ #
+ # then
+ #
+ # -e*y >= -y >= 10**ye > 93*p/65 > p*log(10)/log(5),
+ #
+ # so 5**(-e*y) >= 10**p, and the coefficient of the result
+ # can't be expressed in p digits.
+
+ # emax >= largest e such that 5**e < 10**p.
+ emax = p*93//65
+ if ye >= len(str(emax)):
+ return None
+
+ # Find -e*y and -xe*y; both must be integers
+ e = _decimal_lshift_exact(e * yc, ye)
+ xe = _decimal_lshift_exact(xe * yc, ye)
+ if e is None or xe is None:
+ return None
+
+ if e > emax:
return None
xc = 5**e
@@ -2123,19 +2191,20 @@ class Decimal(object):
while xc % 5 == 0:
xc //= 5
e -= 1
- if ye >= 0:
- y_as_integer = yc*10**ye
- e = e*y_as_integer
- xe = xe*y_as_integer
- else:
- ten_pow = 10**-ye
- e, remainder = divmod(e*yc, ten_pow)
- if remainder:
- return None
- xe, remainder = divmod(xe*yc, ten_pow)
- if remainder:
- return None
- if e*3 >= p*10: # 10/3 > log(10)/log(2)
+
+ # Guard against large values of ye, using the same logic as in
+ # the 'xc is a power of 2' branch. 10/3 is an upper bound for
+ # log(10)/log(2).
+ emax = p*10//3
+ if ye >= len(str(emax)):
+ return None
+
+ e = _decimal_lshift_exact(e * yc, ye)
+ xe = _decimal_lshift_exact(xe * yc, ye)
+ if e is None or xe is None:
+ return None
+
+ if e > emax:
return None
xc = 2**e
else:
@@ -3816,11 +3885,9 @@ class Context(object):
clamp - If 1, change exponents if too high (Default 0)
"""
- def __init__(self, prec=None, rounding=None,
- traps=None, flags=None,
- Emin=None, Emax=None,
- capitals=None, clamp=None,
- _ignored_flags=None):
+ def __init__(self, prec=None, rounding=None, Emin=None, Emax=None,
+ capitals=None, clamp=None, flags=None, traps=None,
+ _ignored_flags=None):
# Set defaults; for everything except flags and _ignored_flags,
# inherit from DefaultContext.
try:
@@ -3843,17 +3910,78 @@ class Context(object):
if traps is None:
self.traps = dc.traps.copy()
elif not isinstance(traps, dict):
- self.traps = dict((s, int(s in traps)) for s in _signals)
+ self.traps = dict((s, int(s in traps)) for s in _signals + traps)
else:
self.traps = traps
if flags is None:
self.flags = dict.fromkeys(_signals, 0)
elif not isinstance(flags, dict):
- self.flags = dict((s, int(s in flags)) for s in _signals)
+ self.flags = dict((s, int(s in flags)) for s in _signals + flags)
else:
self.flags = flags
+ def _set_integer_check(self, name, value, vmin, vmax):
+ if not isinstance(value, int):
+ raise TypeError("%s must be an integer" % name)
+ if vmin == '-inf':
+ if value > vmax:
+ raise ValueError("%s must be in [%s, %d]. got: %s" % (name, vmin, vmax, value))
+ elif vmax == 'inf':
+ if value < vmin:
+ raise ValueError("%s must be in [%d, %s]. got: %s" % (name, vmin, vmax, value))
+ else:
+ if value < vmin or value > vmax:
+ raise ValueError("%s must be in [%d, %d]. got %s" % (name, vmin, vmax, value))
+ return object.__setattr__(self, name, value)
+
+ def _set_signal_dict(self, name, d):
+ if not isinstance(d, dict):
+ raise TypeError("%s must be a signal dict" % d)
+ for key in d:
+ if not key in _signals:
+ raise KeyError("%s is not a valid signal dict" % d)
+ for key in _signals:
+ if not key in d:
+ raise KeyError("%s is not a valid signal dict" % d)
+ return object.__setattr__(self, name, d)
+
+ def __setattr__(self, name, value):
+ if name == 'prec':
+ return self._set_integer_check(name, value, 1, 'inf')
+ elif name == 'Emin':
+ return self._set_integer_check(name, value, '-inf', 0)
+ elif name == 'Emax':
+ return self._set_integer_check(name, value, 0, 'inf')
+ elif name == 'capitals':
+ return self._set_integer_check(name, value, 0, 1)
+ elif name == 'clamp':
+ return self._set_integer_check(name, value, 0, 1)
+ elif name == 'rounding':
+ if not value in _rounding_modes:
+ # raise TypeError even for strings to have consistency
+ # among various implementations.
+ raise TypeError("%s: invalid rounding mode" % value)
+ return object.__setattr__(self, name, value)
+ elif name == 'flags' or name == 'traps':
+ return self._set_signal_dict(name, value)
+ elif name == '_ignored_flags':
+ return object.__setattr__(self, name, value)
+ else:
+ raise AttributeError(
+ "'decimal.Context' object has no attribute '%s'" % name)
+
+ def __delattr__(self, name):
+ raise AttributeError("%s cannot be deleted" % name)
+
+ # Support for pickling, copy, and deepcopy
+ def __reduce__(self):
+ flags = [sig for sig, v in self.flags.items() if v]
+ traps = [sig for sig, v in self.traps.items() if v]
+ return (self.__class__,
+ (self.prec, self.rounding, self.Emin, self.Emax,
+ self.capitals, self.clamp, flags, traps))
+
def __repr__(self):
"""Show the current context."""
s = []
@@ -3872,43 +4000,27 @@ class Context(object):
for flag in self.flags:
self.flags[flag] = 0
+ def clear_traps(self):
+ """Reset all traps to zero"""
+ for flag in self.traps:
+ self.traps[flag] = 0
+
def _shallow_copy(self):
"""Returns a shallow copy from self."""
- nc = Context(self.prec, self.rounding, self.traps,
- self.flags, self.Emin, self.Emax,
- self.capitals, self.clamp, self._ignored_flags)
+ nc = Context(self.prec, self.rounding, self.Emin, self.Emax,
+ self.capitals, self.clamp, self.flags, self.traps,
+ self._ignored_flags)
return nc
def copy(self):
"""Returns a deep copy from self."""
- nc = Context(self.prec, self.rounding, self.traps.copy(),
- self.flags.copy(), self.Emin, self.Emax,
- self.capitals, self.clamp, self._ignored_flags)
+ nc = Context(self.prec, self.rounding, self.Emin, self.Emax,
+ self.capitals, self.clamp,
+ self.flags.copy(), self.traps.copy(),
+ self._ignored_flags)
return nc
__copy__ = copy
- # _clamp is provided for backwards compatibility with third-party
- # code. May be removed in Python >= 3.3.
- def _get_clamp(self):
- "_clamp mirrors the clamp attribute. Its use is deprecated."
- import warnings
- warnings.warn('Use of the _clamp attribute is deprecated. '
- 'Please use clamp instead.',
- DeprecationWarning)
- return self.clamp
-
- def _set_clamp(self, clamp):
- "_clamp mirrors the clamp attribute. Its use is deprecated."
- import warnings
- warnings.warn('Use of the _clamp attribute is deprecated. '
- 'Please use clamp instead.',
- DeprecationWarning)
- self.clamp = clamp
-
- # don't bother with _del_clamp; no sane 3rd party code should
- # be deleting the _clamp attribute
- _clamp = property(_get_clamp, _set_clamp)
-
def _raise_error(self, condition, explanation = None, *args):
"""Handles an error
@@ -4068,6 +4180,8 @@ class Context(object):
>>> ExtendedContext.canonical(Decimal('2.50'))
Decimal('2.50')
"""
+ if not isinstance(a, Decimal):
+ raise TypeError("canonical requires a Decimal as an argument.")
return a.canonical(context=self)
def compare(self, a, b):
@@ -4378,6 +4492,8 @@ class Context(object):
>>> ExtendedContext.is_canonical(Decimal('2.50'))
True
"""
+ if not isinstance(a, Decimal):
+ raise TypeError("is_canonical requires a Decimal as an argument.")
return a.is_canonical()
def is_finite(self, a):
@@ -4970,7 +5086,7 @@ class Context(object):
+Normal
+Infinity
- >>> c = Context(ExtendedContext)
+ >>> c = ExtendedContext.copy()
>>> c.Emin = -999
>>> c.Emax = 999
>>> c.number_class(Decimal('Infinity'))
@@ -5535,6 +5651,27 @@ def _normalize(op1, op2, prec = 0):
_nbits = int.bit_length
+def _decimal_lshift_exact(n, e):
+ """ Given integers n and e, return n * 10**e if it's an integer, else None.
+
+ The computation is designed to avoid computing large powers of 10
+ unnecessarily.
+
+ >>> _decimal_lshift_exact(3, 4)
+ 30000
+ >>> _decimal_lshift_exact(300, -999999999) # returns None
+
+ """
+ if n == 0:
+ return 0
+ elif e >= 0:
+ return n * 10**e
+ else:
+ # val_n = largest power of 10 dividing n.
+ str_n = str(abs(n))
+ val_n = len(str_n) - len(str_n.rstrip('0'))
+ return None if val_n < -e else n // 10**-e
+
def _sqrt_nearest(n, a):
"""Closest integer to the square root of the positive integer n. a is
an initial approximation to the square root. Any positive integer
@@ -5901,6 +6038,12 @@ def _convert_for_comparison(self, other, equality_op=False):
if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0:
other = other.real
if isinstance(other, float):
+ context = getcontext()
+ if equality_op:
+ context.flags[FloatOperation] = 1
+ else:
+ context._raise_error(FloatOperation,
+ "strict semantics for mixing floats and Decimals are enabled")
return self, Decimal.from_float(other)
return NotImplemented, NotImplemented
@@ -5914,8 +6057,8 @@ DefaultContext = Context(
prec=28, rounding=ROUND_HALF_EVEN,
traps=[DivisionByZero, Overflow, InvalidOperation],
flags=[],
- Emax=999999999,
- Emin=-999999999,
+ Emax=999999,
+ Emin=-999999,
capitals=1,
clamp=0
)
@@ -6065,7 +6208,7 @@ def _parse_format_specifier(format_spec, _localeconv=None):
# if format type is 'g' or 'G' then a precision of 0 makes little
# sense; convert it to 1. Same if format type is unspecified.
if format_dict['precision'] == 0:
- if format_dict['type'] is None or format_dict['type'] in 'gG':
+ if format_dict['type'] is None or format_dict['type'] in 'gGn':
format_dict['precision'] = 1
# determine thousands separator, grouping, and decimal separator, and
@@ -6239,16 +6382,26 @@ _SignedInfinity = (_Infinity, _NegativeInfinity)
# Constants related to the hash implementation; hash(x) is based
# on the reduction of x modulo _PyHASH_MODULUS
-import sys
_PyHASH_MODULUS = sys.hash_info.modulus
# hash values to use for positive and negative infinities, and nans
_PyHASH_INF = sys.hash_info.inf
_PyHASH_NAN = sys.hash_info.nan
-del sys
# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
+del sys
+try:
+ import _decimal
+except ImportError:
+ pass
+else:
+ s1 = set(dir())
+ s2 = set(dir(_decimal))
+ for name in s1 - s2:
+ del globals()[name]
+ del s1, s2, name
+ from _decimal import *
if __name__ == '__main__':
import doctest, decimal
diff --git a/Lib/difflib.py b/Lib/difflib.py
index e6cc6ee..ae377d7 100644
--- a/Lib/difflib.py
+++ b/Lib/difflib.py
@@ -204,7 +204,7 @@ class SequenceMatcher:
# returning true iff the element is "junk" -- this has
# subtle but helpful effects on the algorithm, which I'll
# get around to writing up someday <0.9 wink>.
- # DON'T USE! Only __chain_b uses this. Use isbjunk.
+ # DON'T USE! Only __chain_b uses this. Use "in self.bjunk".
# bjunk
# the items in b for which isjunk is True.
# bpopular
@@ -287,7 +287,6 @@ class SequenceMatcher:
# when self.isjunk is defined, junk elements don't show up in this
# map at all, which stops the central find_longest_match method
# from starting any matching block at a junk element ...
- # also creates the fast isbjunk function ...
# b2j also does not contain entries for "popular" elements, meaning
# elements that account for more than 1 + 1% of the total elements, and
# when the sequence is reasonably large (>= 200 elements); this can
@@ -800,7 +799,7 @@ class Differ:
... 2. Explicit is better than implicit.
... 3. Simple is better than complex.
... 4. Complex is better than complicated.
- ... '''.splitlines(1)
+ ... '''.splitlines(keepends=True)
>>> len(text1)
4
>>> text1[0][-1]
@@ -809,7 +808,7 @@ class Differ:
... 3. Simple is better than complex.
... 4. Complicated is better than complex.
... 5. Flat is better than nested.
- ... '''.splitlines(1)
+ ... '''.splitlines(keepends=True)
Next we instantiate a Differ object:
@@ -896,8 +895,8 @@ class Differ:
Example:
- >>> print(''.join(Differ().compare('one\ntwo\nthree\n'.splitlines(1),
- ... 'ore\ntree\nemu\n'.splitlines(1))),
+ >>> print(''.join(Differ().compare('one\ntwo\nthree\n'.splitlines(True),
+ ... 'ore\ntree\nemu\n'.splitlines(True))),
... end="")
- one
? ^
@@ -1269,8 +1268,8 @@ def context_diff(a, b, fromfile='', tofile='',
Example:
- >>> print(''.join(context_diff('one\ntwo\nthree\nfour\n'.splitlines(1),
- ... 'zero\none\ntree\nfour\n'.splitlines(1), 'Original', 'Current')),
+ >>> print(''.join(context_diff('one\ntwo\nthree\nfour\n'.splitlines(True),
+ ... 'zero\none\ntree\nfour\n'.splitlines(True), 'Original', 'Current')),
... end="")
*** Original
--- Current
@@ -1339,8 +1338,8 @@ def ndiff(a, b, linejunk=None, charjunk=IS_CHARACTER_JUNK):
Example:
- >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
- ... 'ore\ntree\nemu\n'.splitlines(1))
+ >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
+ ... 'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print(''.join(diff), end="")
- one
? ^
@@ -2034,8 +2033,8 @@ def restore(delta, which):
Examples:
- >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
- ... 'ore\ntree\nemu\n'.splitlines(1))
+ >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
+ ... 'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff)
>>> print(''.join(restore(diff, 1)), end="")
one
diff --git a/Lib/dis.py b/Lib/dis.py
index f64bae6..543fdc7 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -190,6 +190,9 @@ def disassemble(co, lasti=-1):
if free is None:
free = co.co_cellvars + co.co_freevars
print('(' + free[oparg] + ')', end=' ')
+ elif op in hasnargs:
+ print('(%d positional, %d keyword pair)'
+ % (code[i-2], code[i-1]), end=' ')
print()
def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
@@ -229,6 +232,9 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
print('(%d)' % oparg, end=' ')
elif op in hascompare:
print('(' + cmp_op[oparg] + ')', end=' ')
+ elif op in hasnargs:
+ print('(%d positional, %d keyword pair)'
+ % (code[i-2], code[i-1]), end=' ')
print()
def _disassemble_str(source):
diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py
index b52a9fe..345ac4f 100644
--- a/Lib/distutils/__init__.py
+++ b/Lib/distutils/__init__.py
@@ -13,5 +13,5 @@ used from a setup script as
# Updated automatically by the Python release process.
#
#--start constants--
-__version__ = "3.2.3"
+__version__ = "3.3.0"
#--end constants--
diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py
index e3ed3ad..959a8bf 100644
--- a/Lib/distutils/command/bdist_wininst.py
+++ b/Lib/distutils/command/bdist_wininst.py
@@ -265,11 +265,11 @@ class bdist_wininst(Command):
cfgdata = cfgdata + b"\0"
if self.pre_install_script:
# We need to normalize newlines, so we open in text mode and
- # convert back to bytes. "latin1" simply avoids any possible
+ # convert back to bytes. "latin-1" simply avoids any possible
# failures.
with open(self.pre_install_script, "r",
- encoding="latin1") as script:
- script_data = script.read().encode("latin1")
+ encoding="latin-1") as script:
+ script_data = script.read().encode("latin-1")
cfgdata = cfgdata + script_data + b"\n\0"
else:
# empty pre-install script
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index 34b61bd..b1d951e 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -8,6 +8,7 @@ import sys, os, re
from distutils.core import Command
from distutils.errors import *
from distutils.sysconfig import customize_compiler, get_python_version
+from distutils.sysconfig import get_config_h_filename
from distutils.dep_util import newer_group
from distutils.extension import Extension
from distutils.util import get_platform
@@ -159,6 +160,11 @@ class build_ext(Command):
if isinstance(self.include_dirs, str):
self.include_dirs = self.include_dirs.split(os.pathsep)
+ # If in a virtualenv, add its include directory
+ # Issue 16116
+ if sys.exec_prefix != sys.base_exec_prefix:
+ self.include_dirs.append(os.path.join(sys.exec_prefix, 'include'))
+
# Put the Python "system" include dir at the end, so that
# any local include dirs take precedence.
self.include_dirs.append(py_include)
@@ -189,6 +195,8 @@ class build_ext(Command):
# must be the *native* platform. But we don't really support
# cross-compiling via a binary install anyway, so we let it go.
self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs'))
+ if sys.base_exec_prefix != sys.prefix: # Issue 16116
+ self.library_dirs.append(os.path.join(sys.base_exec_prefix, 'libs'))
if self.debug:
self.build_temp = os.path.join(self.build_temp, "Debug")
else:
@@ -196,8 +204,11 @@ class build_ext(Command):
# Append the source distribution include and library directories,
# this allows distutils on windows to work in the source tree
- self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
- if MSVC_VERSION == 9:
+ self.include_dirs.append(os.path.dirname(get_config_h_filename()))
+ _sys_home = getattr(sys, '_home', None)
+ if _sys_home:
+ self.library_dirs.append(_sys_home)
+ if MSVC_VERSION >= 9:
# Use the .lib files for the correct architecture
if self.plat_name == 'win32':
suffix = ''
@@ -239,8 +250,7 @@ class build_ext(Command):
# for extensions under Linux or Solaris with a shared Python library,
# Python's library directory must be appended to library_dirs
sysconfig.get_config_var('Py_ENABLE_SHARED')
- if ((sys.platform.startswith('linux') or sys.platform.startswith('gnu')
- or sys.platform.startswith('sunos'))
+ if (sys.platform.startswith(('linux', 'gnu', 'sunos'))
and sysconfig.get_config_var('Py_ENABLE_SHARED')):
if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
# building third party extensions
diff --git a/Lib/distutils/command/build_scripts.py b/Lib/distutils/command/build_scripts.py
index ec43477..4b5b22e 100644
--- a/Lib/distutils/command/build_scripts.py
+++ b/Lib/distutils/command/build_scripts.py
@@ -126,10 +126,9 @@ class build_scripts(Command):
"The shebang ({!r}) is not decodable "
"from the script encoding ({})"
.format(shebang, encoding))
- outf = open(outfile, "wb")
- outf.write(shebang)
- outf.writelines(f.readlines())
- outf.close()
+ with open(outfile, "wb") as outf:
+ outf.write(shebang)
+ outf.writelines(f.readlines())
if f:
f.close()
else:
diff --git a/Lib/distutils/command/wininst-10.0-amd64.exe b/Lib/distutils/command/wininst-10.0-amd64.exe
new file mode 100644
index 0000000..6fa0dce
--- /dev/null
+++ b/Lib/distutils/command/wininst-10.0-amd64.exe
Binary files differ
diff --git a/Lib/distutils/command/wininst-10.0.exe b/Lib/distutils/command/wininst-10.0.exe
new file mode 100644
index 0000000..afc3bc6
--- /dev/null
+++ b/Lib/distutils/command/wininst-10.0.exe
Binary files differ
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
index 819e1a9..0bdd539 100644
--- a/Lib/distutils/cygwinccompiler.py
+++ b/Lib/distutils/cygwinccompiler.py
@@ -78,6 +78,9 @@ def get_msvcr():
elif msc_ver == '1500':
# VS2008 / MSVC 9.0
return ['msvcr90']
+ elif msc_ver == '1600':
+ # VS2010 / MSVC 10.0
+ return ['msvcr100']
else:
raise ValueError("Unknown MS Compiler version %s " % msc_ver)
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index 16902ca..317640c 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -18,6 +18,8 @@ from .errors import DistutilsPlatformError
# These are needed in a couple of spots, so just compute them once.
PREFIX = os.path.normpath(sys.prefix)
EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+BASE_PREFIX = os.path.normpath(sys.base_prefix)
+BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
# Path to the base directory of the project. On Windows the binary may
# live in project/PCBuild9. If we're dealing with an x64 Windows build,
@@ -39,11 +41,21 @@ if os.name == "nt" and "\\pcbuild\\amd64" in project_base[-14:].lower():
# different (hard-wired) directories.
# Setup.local is available for Makefile builds including VPATH builds,
# Setup.dist is available on Windows
-def _python_build():
+def _is_python_source_dir(d):
for fn in ("Setup.dist", "Setup.local"):
- if os.path.isfile(os.path.join(project_base, "Modules", fn)):
+ if os.path.isfile(os.path.join(d, "Modules", fn)):
return True
return False
+_sys_home = getattr(sys, '_home', None)
+if _sys_home and os.name == 'nt' and \
+ _sys_home.lower().endswith(('pcbuild', 'pcbuild\\amd64')):
+ _sys_home = os.path.dirname(_sys_home)
+ if _sys_home.endswith('pcbuild'): # must be amd64
+ _sys_home = os.path.dirname(_sys_home)
+def _python_build():
+ if _sys_home:
+ return _is_python_source_dir(_sys_home)
+ return _is_python_source_dir(project_base)
python_build = _python_build()
# Calculate the build qualifier flags if they are defined. Adding the flags
@@ -74,11 +86,11 @@ def get_python_inc(plat_specific=0, prefix=None):
otherwise, this is the path to platform-specific header files
(namely pyconfig.h).
- If 'prefix' is supplied, use it instead of sys.prefix or
- sys.exec_prefix -- i.e., ignore 'plat_specific'.
+ If 'prefix' is supplied, use it instead of sys.base_prefix or
+ sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
"""
if prefix is None:
- prefix = plat_specific and EXEC_PREFIX or PREFIX
+ prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
if os.name == "posix":
if python_build:
# Assume the executable is in the build directory. The
@@ -86,12 +98,14 @@ def get_python_inc(plat_specific=0, prefix=None):
# the build directory may not be the source directory, we
# must use "srcdir" from the makefile to find the "Include"
# directory.
- base = os.path.dirname(os.path.abspath(sys.executable))
+ base = _sys_home or os.path.dirname(os.path.abspath(sys.executable))
if plat_specific:
return base
+ if _sys_home:
+ incdir = os.path.join(_sys_home, get_config_var('AST_H_DIR'))
else:
incdir = os.path.join(get_config_var('srcdir'), 'Include')
- return os.path.normpath(incdir)
+ return os.path.normpath(incdir)
python_dir = 'python' + get_python_version() + build_flags
return os.path.join(prefix, "include", python_dir)
elif os.name == "nt":
@@ -115,11 +129,14 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
containing standard Python library modules; otherwise, return the
directory for site-specific modules.
- If 'prefix' is supplied, use it instead of sys.prefix or
- sys.exec_prefix -- i.e., ignore 'plat_specific'.
+ If 'prefix' is supplied, use it instead of sys.base_prefix or
+ sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
"""
if prefix is None:
- prefix = plat_specific and EXEC_PREFIX or PREFIX
+ if standard_lib:
+ prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
+ else:
+ prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
libpython = os.path.join(prefix,
@@ -146,7 +163,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
"I don't know where Python installs its library "
"on platform '%s'" % os.name)
-_USE_CLANG = None
+
def customize_compiler(compiler):
"""Do any platform-specific customization of a CCompiler instance.
@@ -155,42 +172,28 @@ def customize_compiler(compiler):
varies across Unices and is stored in Python's Makefile.
"""
if compiler.compiler_type == "unix":
+ if sys.platform == "darwin":
+ # Perform first-time customization of compiler-related
+ # config vars on OS X now that we know we need a compiler.
+ # This is primarily to support Pythons from binary
+ # installers. The kind and paths to build tools on
+ # the user system may vary significantly from the system
+ # that Python itself was built on. Also the user OS
+ # version and build tools may not support the same set
+ # of CPU architectures for universal builds.
+ global _config_vars
+ if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''):
+ import _osx_support
+ _osx_support.customize_compiler(_config_vars)
+ _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
+
(cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \
get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS')
newcc = None
if 'CC' in os.environ:
- newcc = os.environ['CC']
- elif sys.platform == 'darwin' and cc == 'gcc-4.2':
- # Issue #13590:
- # Since Apple removed gcc-4.2 in Xcode 4.2, we can no
- # longer assume it is available for extension module builds.
- # If Python was built with gcc-4.2, check first to see if
- # it is available on this system; if not, try to use clang
- # instead unless the caller explicitly set CC.
- global _USE_CLANG
- if _USE_CLANG is None:
- from distutils import log
- from subprocess import Popen, PIPE
- p = Popen("! type gcc-4.2 && type clang && exit 2",
- shell=True, stdout=PIPE, stderr=PIPE)
- p.wait()
- if p.returncode == 2:
- _USE_CLANG = True
- log.warn("gcc-4.2 not found, using clang instead")
- else:
- _USE_CLANG = False
- if _USE_CLANG:
- newcc = 'clang'
- if newcc:
- # On OS X, if CC is overridden, use that as the default
- # command for LDSHARED as well
- if (sys.platform == 'darwin'
- and 'LDSHARED' not in os.environ
- and ldshared.startswith(cc)):
- ldshared = newcc + ldshared[len(cc):]
- cc = newcc
+ cc = os.environ['CC']
if 'CXX' in os.environ:
cxx = os.environ['CXX']
if 'LDSHARED' in os.environ:
@@ -232,9 +235,9 @@ def get_config_h_filename():
"""Return full pathname of installed pyconfig.h file."""
if python_build:
if os.name == "nt":
- inc_dir = os.path.join(project_base, "PC")
+ inc_dir = os.path.join(_sys_home or project_base, "PC")
else:
- inc_dir = project_base
+ inc_dir = _sys_home or project_base
else:
inc_dir = get_python_inc(plat_specific=1)
if get_python_version() < '2.2':
@@ -248,7 +251,8 @@ def get_config_h_filename():
def get_makefile_filename():
"""Return full pathname of installed Makefile from the Python build."""
if python_build:
- return os.path.join(os.path.dirname(sys.executable), "Makefile")
+ return os.path.join(_sys_home or os.path.dirname(sys.executable),
+ "Makefile")
lib_dir = get_python_lib(plat_specific=0, standard_lib=1)
config_file = 'config-{}{}'.format(get_python_version(), build_flags)
return os.path.join(lib_dir, config_file, 'Makefile')
@@ -510,7 +514,7 @@ def get_config_vars(*args):
variables relevant for the current platform. Generally this includes
everything needed to build extensions and install both pure modules and
extensions. On Unix, this means every variable defined in Python's
- installed Makefile; on Windows and Mac OS it's a much smaller set.
+ installed Makefile; on Windows it's a much smaller set.
With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
@@ -529,6 +533,23 @@ def get_config_vars(*args):
_config_vars['prefix'] = PREFIX
_config_vars['exec_prefix'] = EXEC_PREFIX
+ # Always convert srcdir to an absolute path
+ srcdir = _config_vars.get('srcdir', project_base)
+ if os.name == 'posix':
+ if python_build:
+ # If srcdir is a relative path (typically '.' or '..')
+ # then it should be interpreted relative to the directory
+ # containing Makefile.
+ base = os.path.dirname(get_makefile_filename())
+ srcdir = os.path.join(base, srcdir)
+ else:
+ # srcdir is not meaningful since the installation is
+ # spread about the filesystem. We choose the
+ # directory containing the Makefile since we know it
+ # exists.
+ srcdir = os.path.dirname(get_makefile_filename())
+ _config_vars['srcdir'] = os.path.abspath(os.path.normpath(srcdir))
+
# Convert srcdir into an absolute path if it appears necessary.
# Normally it is relative to the build directory. However, during
# testing, for example, we might be running a non-installed python
@@ -543,43 +564,11 @@ def get_config_vars(*args):
srcdir = os.path.join(base, _config_vars['srcdir'])
_config_vars['srcdir'] = os.path.normpath(srcdir)
+ # OS X platforms require special customization to handle
+ # multi-architecture, multi-os-version installers
if sys.platform == 'darwin':
- kernel_version = os.uname()[2] # Kernel version (8.4.3)
- major_version = int(kernel_version.split('.')[0])
-
- if major_version < 8:
- # On Mac OS X before 10.4, check if -arch and -isysroot
- # are in CFLAGS or LDFLAGS and remove them if they are.
- # This is needed when building extensions on a 10.3 system
- # using a universal build of python.
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
- flags = _config_vars[key]
- flags = re.sub('-arch\s+\w+\s', ' ', flags, re.ASCII)
- flags = re.sub('-isysroot [^ \t]*', ' ', flags)
- _config_vars[key] = flags
-
- else:
-
- # Allow the user to override the architecture flags using
- # an environment variable.
- # NOTE: This name was introduced by Apple in OSX 10.5 and
- # is used by several scripting languages distributed with
- # that OS release.
-
- if 'ARCHFLAGS' in os.environ:
- arch = os.environ['ARCHFLAGS']
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
- flags = _config_vars[key]
- flags = re.sub('-arch\s+\w+\s', ' ', flags)
- flags = flags + ' ' + arch
- _config_vars[key] = flags
+ import _osx_support
+ _osx_support.customize_config_vars(_config_vars)
if args:
vals = []
diff --git a/Lib/distutils/tests/test_archive_util.py b/Lib/distutils/tests/test_archive_util.py
index 8edfab4..1afdd46 100644
--- a/Lib/distutils/tests/test_archive_util.py
+++ b/Lib/distutils/tests/test_archive_util.py
@@ -1,6 +1,8 @@
+# -*- coding: utf-8 -*-
"""Tests for distutils.archive_util."""
import unittest
import os
+import sys
import tarfile
from os.path import splitdrive
import warnings
@@ -25,6 +27,18 @@ try:
except ImportError:
ZLIB_SUPPORT = False
+def can_fs_encode(filename):
+ """
+ Return True if the filename can be saved in the file system.
+ """
+ if os.path.supports_unicode_filenames:
+ return True
+ try:
+ filename.encode(sys.getfilesystemencoding())
+ except UnicodeEncodeError:
+ return False
+ return True
+
class ArchiveUtilTestCase(support.TempdirManager,
support.LoggingSilencer,
@@ -32,6 +46,28 @@ class ArchiveUtilTestCase(support.TempdirManager,
@unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
def test_make_tarball(self):
+ self._make_tarball('archive')
+
+ @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
+ @unittest.skipUnless(can_fs_encode('Ã¥rchiv'),
+ 'File system cannot handle this filename')
+ def test_make_tarball_latin1(self):
+ """
+ Mirror test_make_tarball, except filename contains latin characters.
+ """
+ self._make_tarball('Ã¥rchiv') # note this isn't a real word
+
+ @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
+ @unittest.skipUnless(can_fs_encode('ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–'),
+ 'File system cannot handle this filename')
+ def test_make_tarball_extended(self):
+ """
+ Mirror test_make_tarball, except filename contains extended
+ characters outside the latin charset.
+ """
+ self._make_tarball('ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–') # japanese for archive
+
+ def _make_tarball(self, target_name):
# creating something to tar
tmpdir = self.mkdtemp()
self.write_file([tmpdir, 'file1'], 'xxx')
@@ -43,7 +79,7 @@ class ArchiveUtilTestCase(support.TempdirManager,
unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
"Source and target should be on same drive")
- base_name = os.path.join(tmpdir2, 'archive')
+ base_name = os.path.join(tmpdir2, target_name)
# working with relative paths to avoid tar warnings
old_dir = os.getcwd()
@@ -58,7 +94,7 @@ class ArchiveUtilTestCase(support.TempdirManager,
self.assertTrue(os.path.exists(tarball))
# trying an uncompressed one
- base_name = os.path.join(tmpdir2, 'archive')
+ base_name = os.path.join(tmpdir2, target_name)
old_dir = os.getcwd()
os.chdir(tmpdir)
try:
diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py
index ab7a1bf..b090b79 100644
--- a/Lib/distutils/tests/test_bdist_rpm.py
+++ b/Lib/distutils/tests/test_bdist_rpm.py
@@ -28,6 +28,11 @@ class BuildRpmTestCase(support.TempdirManager,
unittest.TestCase):
def setUp(self):
+ try:
+ sys.executable.encode("UTF-8")
+ except UnicodeEncodeError:
+ raise unittest.SkipTest("sys.executable is not encodable to UTF-8")
+
super(BuildRpmTestCase, self).setUp()
self.old_location = os.getcwd()
self.old_sys_argv = sys.argv, sys.argv[:]
@@ -42,7 +47,7 @@ class BuildRpmTestCase(support.TempdirManager,
# XXX I am unable yet to make this test work without
# spurious sdtout/stderr output under Mac OS X
- if sys.platform != 'linux2':
+ if not sys.platform.startswith('linux'):
return
# this test will run only if the rpm commands are found
@@ -86,7 +91,7 @@ class BuildRpmTestCase(support.TempdirManager,
# XXX I am unable yet to make this test work without
# spurious sdtout/stderr output under Mac OS X
- if sys.platform != 'linux2':
+ if not sys.platform.startswith('linux'):
return
# http://bugs.python.org/issue1533164
diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py
index fbe26bf..826ea42 100644
--- a/Lib/distutils/tests/test_sysconfig.py
+++ b/Lib/distutils/tests/test_sysconfig.py
@@ -53,6 +53,35 @@ class SysconfigTestCase(support.EnvironGuard,
self.assertTrue(isinstance(cvars, dict))
self.assertTrue(cvars)
+ def test_srcdir(self):
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+
+ self.assertTrue(os.path.isabs(srcdir), srcdir)
+ self.assertTrue(os.path.isdir(srcdir), srcdir)
+
+ if sysconfig.python_build:
+ # The python executable has not been installed so srcdir
+ # should be a full source checkout.
+ Python_h = os.path.join(srcdir, 'Include', 'Python.h')
+ self.assertTrue(os.path.exists(Python_h), Python_h)
+ self.assertTrue(sysconfig._is_python_source_dir(srcdir))
+ elif os.name == 'posix':
+ self.assertEqual(os.path.dirname(sysconfig.get_makefile_filename()),
+ srcdir)
+
+ def test_srcdir_independent_of_cwd(self):
+ # srcdir should be independent of the current working directory
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+ cwd = os.getcwd()
+ try:
+ os.chdir('..')
+ srcdir2 = sysconfig.get_config_var('srcdir')
+ finally:
+ os.chdir(cwd)
+ self.assertEqual(srcdir, srcdir2)
+
def test_customize_compiler(self):
# not testing if default compiler is not unix
@@ -102,7 +131,27 @@ class SysconfigTestCase(support.EnvironGuard,
import sysconfig as global_sysconfig
self.assertEqual(global_sysconfig.get_config_var('CFLAGS'), sysconfig.get_config_var('CFLAGS'))
self.assertEqual(global_sysconfig.get_config_var('LDFLAGS'), sysconfig.get_config_var('LDFLAGS'))
- self.assertEqual(global_sysconfig.get_config_var('LDSHARED'),sysconfig.get_config_var('LDSHARED'))
+
+ @unittest.skipIf(sysconfig.get_config_var('CUSTOMIZED_OSX_COMPILER'),'compiler flags customized')
+ def test_sysconfig_compiler_vars(self):
+ # On OS X, binary installers support extension module building on
+ # various levels of the operating system with differing Xcode
+ # configurations. This requires customization of some of the
+ # compiler configuration directives to suit the environment on
+ # the installed machine. Some of these customizations may require
+ # running external programs and, so, are deferred until needed by
+ # the first extension module build. With Python 3.3, only
+ # the Distutils version of sysconfig is used for extension module
+ # builds, which happens earlier in the Distutils tests. This may
+ # cause the following tests to fail since no tests have caused
+ # the global version of sysconfig to call the customization yet.
+ # The solution for now is to simply skip this test in this case.
+ # The longer-term solution is to only have one version of sysconfig.
+
+ import sysconfig as global_sysconfig
+ if sysconfig.get_config_var('CUSTOMIZED_OSX_COMPILER'):
+ return
+ self.assertEqual(global_sysconfig.get_config_var('LDSHARED'), sysconfig.get_config_var('LDSHARED'))
self.assertEqual(global_sysconfig.get_config_var('CC'), sysconfig.get_config_var('CC'))
diff --git a/Lib/distutils/tests/test_util.py b/Lib/distutils/tests/test_util.py
index 1a06d4c..eac9b51 100644
--- a/Lib/distutils/tests/test_util.py
+++ b/Lib/distutils/tests/test_util.py
@@ -13,6 +13,7 @@ from distutils import util # used to patch _environ_checked
from distutils.sysconfig import get_config_vars
from distutils import sysconfig
from distutils.tests import support
+import _osx_support
class UtilTestCase(support.EnvironGuard, unittest.TestCase):
@@ -92,6 +93,7 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
('Darwin Kernel Version 8.11.1: '
'Wed Oct 10 18:23:28 PDT 2007; '
'root:xnu-792.25.20~1/RELEASE_I386'), 'i386'))
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g '
@@ -105,6 +107,7 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
sys.maxsize = cursize
# macbook with fat binaries (fat, universal or fat64)
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.4'
get_config_vars()['CFLAGS'] = ('-arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
@@ -113,10 +116,12 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-fat')
+ _osx_support._remove_original_values(get_config_vars())
os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.1'
self.assertEqual(get_platform(), 'macosx-10.4-fat')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
@@ -124,18 +129,21 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-intel')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
'-dynamic -DNDEBUG -g -O3')
self.assertEqual(get_platform(), 'macosx-10.4-fat3')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch ppc64 -arch x86_64 -arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
'-dynamic -DNDEBUG -g -O3')
self.assertEqual(get_platform(), 'macosx-10.4-universal')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc64 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
@@ -144,6 +152,7 @@ class UtilTestCase(support.EnvironGuard, unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-fat64')
for arch in ('ppc', 'i386', 'x86_64', 'ppc64'):
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch %s -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
index c70a3cc..094a2f0 100644
--- a/Lib/distutils/unixccompiler.py
+++ b/Lib/distutils/unixccompiler.py
@@ -23,6 +23,9 @@ from distutils.errors import \
DistutilsExecError, CompileError, LibError, LinkError
from distutils import log
+if sys.platform == 'darwin':
+ import _osx_support
+
# XXX Things not currently handled:
# * optimization/debug/warning flags; we just use whatever's in Python's
# Makefile and live with it. Is this adequate? If not, we might
@@ -38,68 +41,6 @@ from distutils import log
# should just happily stuff them into the preprocessor/compiler/linker
# options and carry on.
-def _darwin_compiler_fixup(compiler_so, cc_args):
- """
- This function will strip '-isysroot PATH' and '-arch ARCH' from the
- compile flags if the user has specified one them in extra_compile_flags.
-
- This is needed because '-arch ARCH' adds another architecture to the
- build, without a way to remove an architecture. Furthermore GCC will
- barf if multiple '-isysroot' arguments are present.
- """
- stripArch = stripSysroot = False
-
- compiler_so = list(compiler_so)
- kernel_version = os.uname()[2] # 8.4.3
- major_version = int(kernel_version.split('.')[0])
-
- if major_version < 8:
- # OSX before 10.4.0, these don't support -arch and -isysroot at
- # all.
- stripArch = stripSysroot = True
- else:
- stripArch = '-arch' in cc_args
- stripSysroot = '-isysroot' in cc_args
-
- if stripArch or 'ARCHFLAGS' in os.environ:
- while True:
- try:
- index = compiler_so.index('-arch')
- # Strip this argument and the next one:
- del compiler_so[index:index+2]
- except ValueError:
- break
-
- if 'ARCHFLAGS' in os.environ and not stripArch:
- # User specified different -arch flags in the environ,
- # see also distutils.sysconfig
- compiler_so = compiler_so + os.environ['ARCHFLAGS'].split()
-
- if stripSysroot:
- try:
- index = compiler_so.index('-isysroot')
- # Strip this argument and the next one:
- del compiler_so[index:index+2]
- except ValueError:
- pass
-
- # Check if the SDK that is used during compilation actually exists,
- # the universal build requires the usage of a universal SDK and not all
- # users have that installed by default.
- sysroot = None
- if '-isysroot' in cc_args:
- idx = cc_args.index('-isysroot')
- sysroot = cc_args[idx+1]
- elif '-isysroot' in compiler_so:
- idx = compiler_so.index('-isysroot')
- sysroot = compiler_so[idx+1]
-
- if sysroot and not os.path.isdir(sysroot):
- log.warn("Compiling with an SDK that doesn't seem to exist: %s",
- sysroot)
- log.warn("Please check your Xcode installation")
-
- return compiler_so
class UnixCCompiler(CCompiler):
@@ -168,7 +109,8 @@ class UnixCCompiler(CCompiler):
def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
compiler_so = self.compiler_so
if sys.platform == 'darwin':
- compiler_so = _darwin_compiler_fixup(compiler_so, cc_args + extra_postargs)
+ compiler_so = _osx_support.compiler_fixup(compiler_so,
+ cc_args + extra_postargs)
try:
self.spawn(compiler_so + cc_args + [src, '-o', obj] +
extra_postargs)
@@ -247,7 +189,7 @@ class UnixCCompiler(CCompiler):
linker[i] = self.compiler_cxx[i]
if sys.platform == 'darwin':
- linker = _darwin_compiler_fixup(linker, ld_args)
+ linker = _osx_support.compiler_fixup(linker, ld_args)
self.spawn(linker + ld_args)
except DistutilsExecError as msg:
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index bce8402..67d8166 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -53,6 +53,10 @@ def get_platform ():
return 'win-ia64'
return sys.platform
+ # Set for cross builds explicitly
+ if "_PYTHON_HOST_PLATFORM" in os.environ:
+ return os.environ["_PYTHON_HOST_PLATFORM"]
+
if os.name != "posix" or not hasattr(os, 'uname'):
# XXX what about the architecture? NT is Intel or Alpha,
# Mac OS is M68k or PPC, etc.
@@ -94,94 +98,10 @@ def get_platform ():
if m:
release = m.group()
elif osname[:6] == "darwin":
- #
- # For our purposes, we'll assume that the system version from
- # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
- # to. This makes the compatibility story a bit more sane because the
- # machine is going to compile and link as if it were
- # MACOSX_DEPLOYMENT_TARGET.
- from distutils.sysconfig import get_config_vars
- cfgvars = get_config_vars()
-
- macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
-
- if 1:
- # Always calculate the release of the running machine,
- # needed to determine if we can build fat binaries or not.
-
- macrelease = macver
- # Get the system version. Reading this plist is a documented
- # way to get the system version (see the documentation for
- # the Gestalt Manager)
- try:
- f = open('/System/Library/CoreServices/SystemVersion.plist')
- except IOError:
- # We're on a plain darwin box, fall back to the default
- # behaviour.
- pass
- else:
- try:
- m = re.search(
- r'<key>ProductUserVisibleVersion</key>\s*' +
- r'<string>(.*?)</string>', f.read())
- if m is not None:
- macrelease = '.'.join(m.group(1).split('.')[:2])
- # else: fall back to the default behaviour
- finally:
- f.close()
-
- if not macver:
- macver = macrelease
-
- if macver:
- from distutils.sysconfig import get_config_vars
- release = macver
- osname = "macosx"
-
- if (macrelease + '.') >= '10.4.' and \
- '-arch' in get_config_vars().get('CFLAGS', '').strip():
- # The universal build will build fat binaries, but not on
- # systems before 10.4
- #
- # Try to detect 4-way universal builds, those have machine-type
- # 'universal' instead of 'fat'.
-
- machine = 'fat'
- cflags = get_config_vars().get('CFLAGS')
-
- archs = re.findall('-arch\s+(\S+)', cflags)
- archs = tuple(sorted(set(archs)))
-
- if len(archs) == 1:
- machine = archs[0]
- elif archs == ('i386', 'ppc'):
- machine = 'fat'
- elif archs == ('i386', 'x86_64'):
- machine = 'intel'
- elif archs == ('i386', 'ppc', 'x86_64'):
- machine = 'fat3'
- elif archs == ('ppc64', 'x86_64'):
- machine = 'fat64'
- elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
- machine = 'universal'
- else:
- raise ValueError(
- "Don't know machine value for archs=%r"%(archs,))
-
- elif machine == 'i386':
- # On OSX the machine type returned by uname is always the
- # 32-bit variant, even if the executable architecture is
- # the 64-bit variant
- if sys.maxsize >= 2**32:
- machine = 'x86_64'
-
- elif machine in ('PowerPC', 'Power_Macintosh'):
- # Pick a sane name for the PPC architecture.
- machine = 'ppc'
-
- # See 'i386' case
- if sys.maxsize >= 2**32:
- machine = 'ppc64'
+ import _osx_support, distutils.sysconfig
+ osname, release, machine = _osx_support.get_platform_osx(
+ distutils.sysconfig.get_config_vars(),
+ osname, release, machine)
return "%s-%s-%s" % (osname, release, machine)
diff --git a/Lib/doctest.py b/Lib/doctest.py
index e189c8f..3af05fb 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -458,7 +458,6 @@ class Example:
return hash((self.source, self.want, self.lineno, self.indent,
self.exc_msg))
-
class DocTest:
"""
A collection of doctest examples that should be run in a single
@@ -1367,7 +1366,7 @@ class DocTestRunner:
m = self.__LINECACHE_FILENAME_RE.match(filename)
if m and m.group('name') == self.test.name:
example = self.test.examples[int(m.group('examplenum'))]
- return example.source.splitlines(True)
+ return example.source.splitlines(keepends=True)
else:
return self.save_linecache_getlines(filename, module_globals)
@@ -1413,6 +1412,7 @@ class DocTestRunner:
# Note that the interactive output will go to *our*
# save_stdout, even if that's not the real sys.stdout; this
# allows us to write test cases for the set_trace behavior.
+ save_trace = sys.gettrace()
save_set_trace = pdb.set_trace
self.debugger = _OutputRedirectingPdb(save_stdout)
self.debugger.reset()
@@ -1432,6 +1432,7 @@ class DocTestRunner:
finally:
sys.stdout = save_stdout
pdb.set_trace = save_set_trace
+ sys.settrace(save_trace)
linecache.getlines = self.save_linecache_getlines
sys.displayhook = save_displayhook
if clear_globs:
@@ -1628,8 +1629,8 @@ class OutputChecker:
# Check if we should use diff.
if self._do_a_fancy_diff(want, got, optionflags):
# Split want & got into lines.
- want_lines = want.splitlines(True) # True == keep line ends
- got_lines = got.splitlines(True)
+ want_lines = want.splitlines(keepends=True)
+ got_lines = got.splitlines(keepends=True)
# Use difflib to find their differences.
if optionflags & REPORT_UDIFF:
diff = difflib.unified_diff(want_lines, got_lines, n=2)
diff --git a/Lib/email/_encoded_words.py b/Lib/email/_encoded_words.py
new file mode 100644
index 0000000..e9f6e20
--- /dev/null
+++ b/Lib/email/_encoded_words.py
@@ -0,0 +1,221 @@
+""" Routines for manipulating RFC2047 encoded words.
+
+This is currently a package-private API, but will be considered for promotion
+to a public API if there is demand.
+
+"""
+
+# An ecoded word looks like this:
+#
+# =?charset[*lang]?cte?encoded_string?=
+#
+# for more information about charset see the charset module. Here it is one
+# of the preferred MIME charset names (hopefully; you never know when parsing).
+# cte (Content Transfer Encoding) is either 'q' or 'b' (ignoring case). In
+# theory other letters could be used for other encodings, but in practice this
+# (almost?) never happens. There could be a public API for adding entries
+# to to the CTE tables, but YAGNI for now. 'q' is Quoted Printable, 'b' is
+# Base64. The meaning of encoded_string should be obvious. 'lang' is optional
+# as indicated by the brackets (they are not part of the syntax) but is almost
+# never encountered in practice.
+#
+# The general interface for a CTE decoder is that it takes the encoded_string
+# as its argument, and returns a tuple (cte_decoded_string, defects). The
+# cte_decoded_string is the original binary that was encoded using the
+# specified cte. 'defects' is a list of MessageDefect instances indicating any
+# problems encountered during conversion. 'charset' and 'lang' are the
+# corresponding strings extracted from the EW, case preserved.
+#
+# The general interface for a CTE encoder is that it takes a binary sequence
+# as input and returns the cte_encoded_string, which is an ascii-only string.
+#
+# Each decoder must also supply a length function that takes the binary
+# sequence as its argument and returns the length of the resulting encoded
+# string.
+#
+# The main API functions for the module are decode, which calls the decoder
+# referenced by the cte specifier, and encode, which adds the appropriate
+# RFC 2047 "chrome" to the encoded string, and can optionally automatically
+# select the shortest possible encoding. See their docstrings below for
+# details.
+
+import re
+import base64
+import binascii
+import functools
+from string import ascii_letters, digits
+from email import errors
+
+__all__ = ['decode_q',
+ 'encode_q',
+ 'decode_b',
+ 'encode_b',
+ 'len_q',
+ 'len_b',
+ 'decode',
+ 'encode',
+ ]
+
+#
+# Quoted Printable
+#
+
+# regex based decoder.
+_q_byte_subber = functools.partial(re.compile(br'=([a-fA-F0-9]{2})').sub,
+ lambda m: bytes([int(m.group(1), 16)]))
+
+def decode_q(encoded):
+ encoded = encoded.replace(b'_', b' ')
+ return _q_byte_subber(encoded), []
+
+
+# dict mapping bytes to their encoded form
+class _QByteMap(dict):
+
+ safe = b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii')
+
+ def __missing__(self, key):
+ if key in self.safe:
+ self[key] = chr(key)
+ else:
+ self[key] = "={:02X}".format(key)
+ return self[key]
+
+_q_byte_map = _QByteMap()
+
+# In headers spaces are mapped to '_'.
+_q_byte_map[ord(' ')] = '_'
+
+def encode_q(bstring):
+ return ''.join(_q_byte_map[x] for x in bstring)
+
+def len_q(bstring):
+ return sum(len(_q_byte_map[x]) for x in bstring)
+
+
+#
+# Base64
+#
+
+def decode_b(encoded):
+ defects = []
+ pad_err = len(encoded) % 4
+ if pad_err:
+ defects.append(errors.InvalidBase64PaddingDefect())
+ padded_encoded = encoded + b'==='[:4-pad_err]
+ else:
+ padded_encoded = encoded
+ try:
+ return base64.b64decode(padded_encoded, validate=True), defects
+ except binascii.Error:
+ # Since we had correct padding, this must an invalid char error.
+ defects = [errors.InvalidBase64CharactersDefect()]
+ # The non-alphabet characters are ignored as far as padding
+ # goes, but we don't know how many there are. So we'll just
+ # try various padding lengths until something works.
+ for i in 0, 1, 2, 3:
+ try:
+ return base64.b64decode(encoded+b'='*i, validate=False), defects
+ except binascii.Error:
+ if i==0:
+ defects.append(errors.InvalidBase64PaddingDefect())
+ else:
+ # This should never happen.
+ raise AssertionError("unexpected binascii.Error")
+
+def encode_b(bstring):
+ return base64.b64encode(bstring).decode('ascii')
+
+def len_b(bstring):
+ groups_of_3, leftover = divmod(len(bstring), 3)
+ # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in.
+ return groups_of_3 * 4 + (4 if leftover else 0)
+
+
+_cte_decoders = {
+ 'q': decode_q,
+ 'b': decode_b,
+ }
+
+def decode(ew):
+ """Decode encoded word and return (string, charset, lang, defects) tuple.
+
+ An RFC 2047/2243 encoded word has the form:
+
+ =?charset*lang?cte?encoded_string?=
+
+ where '*lang' may be omitted but the other parts may not be.
+
+ This function expects exactly such a string (that is, it does not check the
+ syntax and may raise errors if the string is not well formed), and returns
+ the encoded_string decoded first from its Content Transfer Encoding and
+ then from the resulting bytes into unicode using the specified charset. If
+ the cte-decoded string does not successfully decode using the specified
+ character set, a defect is added to the defects list and the unknown octets
+ are replaced by the unicode 'unknown' character \uFDFF.
+
+ The specified charset and language are returned. The default for language,
+ which is rarely if ever encountered, is the empty string.
+
+ """
+ _, charset, cte, cte_string, _ = ew.split('?')
+ charset, _, lang = charset.partition('*')
+ cte = cte.lower()
+ # Recover the original bytes and do CTE decoding.
+ bstring = cte_string.encode('ascii', 'surrogateescape')
+ bstring, defects = _cte_decoders[cte](bstring)
+ # Turn the CTE decoded bytes into unicode.
+ try:
+ string = bstring.decode(charset)
+ except UnicodeError:
+ defects.append(errors.UndecodableBytesDefect("Encoded word "
+ "contains bytes not decodable using {} charset".format(charset)))
+ string = bstring.decode(charset, 'surrogateescape')
+ except LookupError:
+ string = bstring.decode('ascii', 'surrogateescape')
+ if charset.lower() != 'unknown-8bit':
+ defects.append(errors.CharsetError("Unknown charset {} "
+ "in encoded word; decoded as unknown bytes".format(charset)))
+ return string, charset, lang, defects
+
+
+_cte_encoders = {
+ 'q': encode_q,
+ 'b': encode_b,
+ }
+
+_cte_encode_length = {
+ 'q': len_q,
+ 'b': len_b,
+ }
+
+def encode(string, charset='utf-8', encoding=None, lang=''):
+ """Encode string using the CTE encoding that produces the shorter result.
+
+ Produces an RFC 2047/2243 encoded word of the form:
+
+ =?charset*lang?cte?encoded_string?=
+
+ where '*lang' is omitted unless the 'lang' parameter is given a value.
+ Optional argument charset (defaults to utf-8) specifies the charset to use
+ to encode the string to binary before CTE encoding it. Optional argument
+ 'encoding' is the cte specifier for the encoding that should be used ('q'
+ or 'b'); if it is None (the default) the encoding which produces the
+ shortest encoded sequence is used, except that 'q' is preferred if it is up
+ to five characters longer. Optional argument 'lang' (default '') gives the
+ RFC 2243 language string to specify in the encoded word.
+
+ """
+ if charset == 'unknown-8bit':
+ bstring = string.encode('ascii', 'surrogateescape')
+ else:
+ bstring = string.encode(charset)
+ if encoding is None:
+ qlen = _cte_encode_length['q'](bstring)
+ blen = _cte_encode_length['b'](bstring)
+ # Bias toward q. 5 is arbitrary.
+ encoding = 'q' if qlen - blen < 5 else 'b'
+ encoded = _cte_encoders[encoding](bstring)
+ if lang:
+ lang = '*' + lang
+ return "=?{}{}?{}?{}?=".format(charset, lang, encoding, encoded)
diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
new file mode 100644
index 0000000..1924ed1
--- /dev/null
+++ b/Lib/email/_header_value_parser.py
@@ -0,0 +1,2953 @@
+"""Header value parser implementing various email-related RFC parsing rules.
+
+The parsing methods defined in this module implement various email related
+parsing rules. Principal among them is RFC 5322, which is the followon
+to RFC 2822 and primarily a clarification of the former. It also implements
+RFC 2047 encoded word decoding.
+
+RFC 5322 goes to considerable trouble to maintain backward compatibility with
+RFC 822 in the parse phase, while cleaning up the structure on the generation
+phase. This parser supports correct RFC 5322 generation by tagging white space
+as folding white space only when folding is allowed in the non-obsolete rule
+sets. Actually, the parser is even more generous when accepting input than RFC
+5322 mandates, following the spirit of Postel's Law, which RFC 5322 encourages.
+Where possible deviations from the standard are annotated on the 'defects'
+attribute of tokens that deviate.
+
+The general structure of the parser follows RFC 5322, and uses its terminology
+where there is a direct correspondence. Where the implementation requires a
+somewhat different structure than that used by the formal grammar, new terms
+that mimic the closest existing terms are used. Thus, it really helps to have
+a copy of RFC 5322 handy when studying this code.
+
+Input to the parser is a string that has already been unfolded according to
+RFC 5322 rules. According to the RFC this unfolding is the very first step, and
+this parser leaves the unfolding step to a higher level message parser, which
+will have already detected the line breaks that need unfolding while
+determining the beginning and end of each header.
+
+The output of the parser is a TokenList object, which is a list subclass. A
+TokenList is a recursive data structure. The terminal nodes of the structure
+are Terminal objects, which are subclasses of str. These do not correspond
+directly to terminal objects in the formal grammar, but are instead more
+practical higher level combinations of true terminals.
+
+All TokenList and Terminal objects have a 'value' attribute, which produces the
+semantically meaningful value of that part of the parse subtree. The value of
+all whitespace tokens (no matter how many sub-tokens they may contain) is a
+single space, as per the RFC rules. This includes 'CFWS', which is herein
+included in the general class of whitespace tokens. There is one exception to
+the rule that whitespace tokens are collapsed into single spaces in values: in
+the value of a 'bare-quoted-string' (a quoted-string with no leading or
+trailing whitespace), any whitespace that appeared between the quotation marks
+is preserved in the returned value. Note that in all Terminal strings quoted
+pairs are turned into their unquoted values.
+
+All TokenList and Terminal objects also have a string value, which attempts to
+be a "canonical" representation of the RFC-compliant form of the substring that
+produced the parsed subtree, including minimal use of quoted pair quoting.
+Whitespace runs are not collapsed.
+
+Comment tokens also have a 'content' attribute providing the string found
+between the parens (including any nested comments) with whitespace preserved.
+
+All TokenList and Terminal objects have a 'defects' attribute which is a
+possibly empty list all of the defects found while creating the token. Defects
+may appear on any token in the tree, and a composite list of all defects in the
+subtree is available through the 'all_defects' attribute of any node. (For
+Terminal notes x.defects == x.all_defects.)
+
+Each object in a parse tree is called a 'token', and each has a 'token_type'
+attribute that gives the name from the RFC 5322 grammar that it represents.
+Not all RFC 5322 nodes are produced, and there is one non-RFC 5322 node that
+may be produced: 'ptext'. A 'ptext' is a string of printable ascii characters.
+It is returned in place of lists of (ctext/quoted-pair) and
+(qtext/quoted-pair).
+
+XXX: provide complete list of token types.
+"""
+
+import re
+import urllib # For urllib.parse.unquote
+from collections import namedtuple, OrderedDict
+from email import _encoded_words as _ew
+from email import errors
+from email import utils
+
+#
+# Useful constants and functions
+#
+
+WSP = set(' \t')
+CFWS_LEADER = WSP | set('(')
+SPECIALS = set(r'()<>@,:;.\"[]')
+ATOM_ENDS = SPECIALS | WSP
+DOT_ATOM_ENDS = ATOM_ENDS - set('.')
+# '.', '"', and '(' do not end phrases in order to support obs-phrase
+PHRASE_ENDS = SPECIALS - set('."(')
+TSPECIALS = (SPECIALS | set('/?=')) - set('.')
+TOKEN_ENDS = TSPECIALS | WSP
+ASPECIALS = TSPECIALS | set("*'%")
+ATTRIBUTE_ENDS = ASPECIALS | WSP
+EXTENDED_ATTRIBUTE_ENDS = ATTRIBUTE_ENDS - set('%')
+
+def quote_string(value):
+ return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"'
+
+#
+# Accumulator for header folding
+#
+
+class _Folded:
+
+ def __init__(self, maxlen, policy):
+ self.maxlen = maxlen
+ self.policy = policy
+ self.lastlen = 0
+ self.stickyspace = None
+ self.firstline = True
+ self.done = []
+ self.current = []
+
+ def newline(self):
+ self.done.extend(self.current)
+ self.done.append(self.policy.linesep)
+ self.current.clear()
+ self.lastlen = 0
+
+ def finalize(self):
+ if self.current:
+ self.newline()
+
+ def __str__(self):
+ return ''.join(self.done)
+
+ def append(self, stoken):
+ self.current.append(stoken)
+
+ def append_if_fits(self, token, stoken=None):
+ if stoken is None:
+ stoken = str(token)
+ l = len(stoken)
+ if self.stickyspace is not None:
+ stickyspace_len = len(self.stickyspace)
+ if self.lastlen + stickyspace_len + l <= self.maxlen:
+ self.current.append(self.stickyspace)
+ self.lastlen += stickyspace_len
+ self.current.append(stoken)
+ self.lastlen += l
+ self.stickyspace = None
+ self.firstline = False
+ return True
+ if token.has_fws:
+ ws = token.pop_leading_fws()
+ if ws is not None:
+ self.stickyspace += str(ws)
+ stickyspace_len += len(ws)
+ token._fold(self)
+ return True
+ if stickyspace_len and l + 1 <= self.maxlen:
+ margin = self.maxlen - l
+ if 0 < margin < stickyspace_len:
+ trim = stickyspace_len - margin
+ self.current.append(self.stickyspace[:trim])
+ self.stickyspace = self.stickyspace[trim:]
+ stickyspace_len = trim
+ self.newline()
+ self.current.append(self.stickyspace)
+ self.current.append(stoken)
+ self.lastlen = l + stickyspace_len
+ self.stickyspace = None
+ self.firstline = False
+ return True
+ if not self.firstline:
+ self.newline()
+ self.current.append(self.stickyspace)
+ self.current.append(stoken)
+ self.stickyspace = None
+ self.firstline = False
+ return True
+ if self.lastlen + l <= self.maxlen:
+ self.current.append(stoken)
+ self.lastlen += l
+ return True
+ if l < self.maxlen:
+ self.newline()
+ self.current.append(stoken)
+ self.lastlen = l
+ return True
+ return False
+
+#
+# TokenList and its subclasses
+#
+
+class TokenList(list):
+
+ token_type = None
+
+ def __init__(self, *args, **kw):
+ super().__init__(*args, **kw)
+ self.defects = []
+
+ def __str__(self):
+ return ''.join(str(x) for x in self)
+
+ def __repr__(self):
+ return '{}({})'.format(self.__class__.__name__,
+ super().__repr__())
+
+ @property
+ def value(self):
+ return ''.join(x.value for x in self if x.value)
+
+ @property
+ def all_defects(self):
+ return sum((x.all_defects for x in self), self.defects)
+
+ #
+ # Folding API
+ #
+ # parts():
+ #
+ # return a list of objects that constitute the "higher level syntactic
+ # objects" specified by the RFC as the best places to fold a header line.
+ # The returned objects must include leading folding white space, even if
+ # this means mutating the underlying parse tree of the object. Each object
+ # is only responsible for returning *its* parts, and should not drill down
+ # to any lower level except as required to meet the leading folding white
+ # space constraint.
+ #
+ # _fold(folded):
+ #
+ # folded: the result accumulator. This is an instance of _Folded.
+ # (XXX: I haven't finished factoring this out yet, the folding code
+ # pretty much uses this as a state object.) When the folded.current
+ # contains as much text as will fit, the _fold method should call
+ # folded.newline.
+ # folded.lastlen: the current length of the test stored in folded.current.
+ # folded.maxlen: The maximum number of characters that may appear on a
+ # folded line. Differs from the policy setting in that "no limit" is
+ # represented by +inf, which means it can be used in the trivially
+ # logical fashion in comparisons.
+ #
+ # Currently no subclasses implement parts, and I think this will remain
+ # true. A subclass only needs to implement _fold when the generic version
+ # isn't sufficient. _fold will need to be implemented primarily when it is
+ # possible for encoded words to appear in the specialized token-list, since
+ # there is no generic algorithm that can know where exactly the encoded
+ # words are allowed. A _fold implementation is responsible for filling
+ # lines in the same general way that the top level _fold does. It may, and
+ # should, call the _fold method of sub-objects in a similar fashion to that
+ # of the top level _fold.
+ #
+ # XXX: I'm hoping it will be possible to factor the existing code further
+ # to reduce redundancy and make the logic clearer.
+
+ @property
+ def parts(self):
+ klass = self.__class__
+ this = []
+ for token in self:
+ if token.startswith_fws():
+ if this:
+ yield this[0] if len(this)==1 else klass(this)
+ this.clear()
+ end_ws = token.pop_trailing_ws()
+ this.append(token)
+ if end_ws:
+ yield klass(this)
+ this = [end_ws]
+ if this:
+ yield this[0] if len(this)==1 else klass(this)
+
+ def startswith_fws(self):
+ return self[0].startswith_fws()
+
+ def pop_leading_fws(self):
+ if self[0].token_type == 'fws':
+ return self.pop(0)
+ return self[0].pop_leading_fws()
+
+ def pop_trailing_ws(self):
+ if self[-1].token_type == 'cfws':
+ return self.pop(-1)
+ return self[-1].pop_trailing_ws()
+
+ @property
+ def has_fws(self):
+ for part in self:
+ if part.has_fws:
+ return True
+ return False
+
+ def has_leading_comment(self):
+ return self[0].has_leading_comment()
+
+ @property
+ def comments(self):
+ comments = []
+ for token in self:
+ comments.extend(token.comments)
+ return comments
+
+ def fold(self, *, policy):
+ # max_line_length 0/None means no limit, ie: infinitely long.
+ maxlen = policy.max_line_length or float("+inf")
+ folded = _Folded(maxlen, policy)
+ self._fold(folded)
+ folded.finalize()
+ return str(folded)
+
+ def as_encoded_word(self, charset):
+ # This works only for things returned by 'parts', which include
+ # the leading fws, if any, that should be used.
+ res = []
+ ws = self.pop_leading_fws()
+ if ws:
+ res.append(ws)
+ trailer = self.pop(-1) if self[-1].token_type=='fws' else ''
+ res.append(_ew.encode(str(self), charset))
+ res.append(trailer)
+ return ''.join(res)
+
+ def cte_encode(self, charset, policy):
+ res = []
+ for part in self:
+ res.append(part.cte_encode(charset, policy))
+ return ''.join(res)
+
+ def _fold(self, folded):
+ for part in self.parts:
+ tstr = str(part)
+ tlen = len(tstr)
+ try:
+ str(part).encode('us-ascii')
+ except UnicodeEncodeError:
+ if any(isinstance(x, errors.UndecodableBytesDefect)
+ for x in part.all_defects):
+ charset = 'unknown-8bit'
+ else:
+ # XXX: this should be a policy setting
+ charset = 'utf-8'
+ tstr = part.cte_encode(charset, folded.policy)
+ tlen = len(tstr)
+ if folded.append_if_fits(part, tstr):
+ continue
+ # Peel off the leading whitespace if any and make it sticky, to
+ # avoid infinite recursion.
+ ws = part.pop_leading_fws()
+ if ws is not None:
+ # Peel off the leading whitespace and make it sticky, to
+ # avoid infinite recursion.
+ folded.stickyspace = str(part.pop(0))
+ if folded.append_if_fits(part):
+ continue
+ if part.has_fws:
+ part._fold(folded)
+ continue
+ # There are no fold points in this one; it is too long for a single
+ # line and can't be split...we just have to put it on its own line.
+ folded.append(tstr)
+ folded.newline()
+
+ def pprint(self, indent=''):
+ print('\n'.join(self._pp(indent='')))
+
+ def ppstr(self, indent=''):
+ return '\n'.join(self._pp(indent=''))
+
+ def _pp(self, indent=''):
+ yield '{}{}/{}('.format(
+ indent,
+ self.__class__.__name__,
+ self.token_type)
+ for token in self:
+ if not hasattr(token, '_pp'):
+ yield (indent + ' !! invalid element in token '
+ 'list: {!r}'.format(token))
+ else:
+ for line in token._pp(indent+' '):
+ yield line
+ if self.defects:
+ extra = ' Defects: {}'.format(self.defects)
+ else:
+ extra = ''
+ yield '{}){}'.format(indent, extra)
+
+
+class WhiteSpaceTokenList(TokenList):
+
+ @property
+ def value(self):
+ return ' '
+
+ @property
+ def comments(self):
+ return [x.content for x in self if x.token_type=='comment']
+
+
+class UnstructuredTokenList(TokenList):
+
+ token_type = 'unstructured'
+
+ def _fold(self, folded):
+ if any(x.token_type=='encoded-word' for x in self):
+ return self._fold_encoded(folded)
+ # Here we can have either a pure ASCII string that may or may not
+ # have surrogateescape encoded bytes, or a unicode string.
+ last_ew = None
+ for part in self.parts:
+ tstr = str(part)
+ is_ew = False
+ try:
+ str(part).encode('us-ascii')
+ except UnicodeEncodeError:
+ if any(isinstance(x, errors.UndecodableBytesDefect)
+ for x in part.all_defects):
+ charset = 'unknown-8bit'
+ else:
+ charset = 'utf-8'
+ if last_ew is not None:
+ # We've already done an EW, combine this one with it
+ # if there's room.
+ chunk = get_unstructured(
+ ''.join(folded.current[last_ew:]+[tstr])).as_encoded_word(charset)
+ oldlastlen = sum(len(x) for x in folded.current[:last_ew])
+ schunk = str(chunk)
+ lchunk = len(schunk)
+ if oldlastlen + lchunk <= folded.maxlen:
+ del folded.current[last_ew:]
+ folded.append(schunk)
+ folded.lastlen = oldlastlen + lchunk
+ continue
+ tstr = part.as_encoded_word(charset)
+ is_ew = True
+ if folded.append_if_fits(part, tstr):
+ if is_ew:
+ last_ew = len(folded.current) - 1
+ continue
+ if is_ew or last_ew:
+ # It's too big to fit on the line, but since we've
+ # got encoded words we can use encoded word folding.
+ part._fold_as_ew(folded)
+ continue
+ # Peel off the leading whitespace if any and make it sticky, to
+ # avoid infinite recursion.
+ ws = part.pop_leading_fws()
+ if ws is not None:
+ folded.stickyspace = str(ws)
+ if folded.append_if_fits(part):
+ continue
+ if part.has_fws:
+ part.fold(folded)
+ continue
+ # It can't be split...we just have to put it on its own line.
+ folded.append(tstr)
+ folded.newline()
+ last_ew = None
+
+ def cte_encode(self, charset, policy):
+ res = []
+ last_ew = None
+ for part in self:
+ spart = str(part)
+ try:
+ spart.encode('us-ascii')
+ res.append(spart)
+ except UnicodeEncodeError:
+ if last_ew is None:
+ res.append(part.cte_encode(charset, policy))
+ last_ew = len(res)
+ else:
+ tl = get_unstructured(''.join(res[last_ew:] + [spart]))
+ res.append(tl.as_encoded_word())
+ return ''.join(res)
+
+
+class Phrase(TokenList):
+
+ token_type = 'phrase'
+
+ def _fold(self, folded):
+ # As with Unstructured, we can have pure ASCII with or without
+ # surrogateescape encoded bytes, or we could have unicode. But this
+ # case is more complicated, since we have to deal with the various
+ # sub-token types and how they can be composed in the face of
+ # unicode-that-needs-CTE-encoding, and the fact that if a token a
+ # comment that becomes a barrier across which we can't compose encoded
+ # words.
+ last_ew = None
+ for part in self.parts:
+ tstr = str(part)
+ tlen = len(tstr)
+ has_ew = False
+ try:
+ str(part).encode('us-ascii')
+ except UnicodeEncodeError:
+ if any(isinstance(x, errors.UndecodableBytesDefect)
+ for x in part.all_defects):
+ charset = 'unknown-8bit'
+ else:
+ charset = 'utf-8'
+ if last_ew is not None and not part.has_leading_comment():
+ # We've already done an EW, let's see if we can combine
+ # this one with it. The last_ew logic ensures that all we
+ # have at this point is atoms, no comments or quoted
+ # strings. So we can treat the text between the last
+ # encoded word and the content of this token as
+ # unstructured text, and things will work correctly. But
+ # we have to strip off any trailing comment on this token
+ # first, and if it is a quoted string we have to pull out
+ # the content (we're encoding it, so it no longer needs to
+ # be quoted).
+ if part[-1].token_type == 'cfws' and part.comments:
+ remainder = part.pop(-1)
+ else:
+ remainder = ''
+ for i, token in enumerate(part):
+ if token.token_type == 'bare-quoted-string':
+ part[i] = UnstructuredTokenList(token[:])
+ chunk = get_unstructured(
+ ''.join(folded.current[last_ew:]+[tstr])).as_encoded_word(charset)
+ schunk = str(chunk)
+ lchunk = len(schunk)
+ if last_ew + lchunk <= folded.maxlen:
+ del folded.current[last_ew:]
+ folded.append(schunk)
+ folded.lastlen = sum(len(x) for x in folded.current)
+ continue
+ tstr = part.as_encoded_word(charset)
+ tlen = len(tstr)
+ has_ew = True
+ if folded.append_if_fits(part, tstr):
+ if has_ew and not part.comments:
+ last_ew = len(folded.current) - 1
+ elif part.comments or part.token_type == 'quoted-string':
+ # If a comment is involved we can't combine EWs. And if a
+ # quoted string is involved, it's not worth the effort to
+ # try to combine them.
+ last_ew = None
+ continue
+ part._fold(folded)
+
+ def cte_encode(self, charset, policy):
+ res = []
+ last_ew = None
+ is_ew = False
+ for part in self:
+ spart = str(part)
+ try:
+ spart.encode('us-ascii')
+ res.append(spart)
+ except UnicodeEncodeError:
+ is_ew = True
+ if last_ew is None:
+ if not part.comments:
+ last_ew = len(res)
+ res.append(part.cte_encode(charset, policy))
+ elif not part.has_leading_comment():
+ if part[-1].token_type == 'cfws' and part.comments:
+ remainder = part.pop(-1)
+ else:
+ remainder = ''
+ for i, token in enumerate(part):
+ if token.token_type == 'bare-quoted-string':
+ part[i] = UnstructuredTokenList(token[:])
+ tl = get_unstructured(''.join(res[last_ew:] + [spart]))
+ res[last_ew:] = [tl.as_encoded_word(charset)]
+ if part.comments or (not is_ew and part.token_type == 'quoted-string'):
+ last_ew = None
+ return ''.join(res)
+
+class Word(TokenList):
+
+ token_type = 'word'
+
+
+class CFWSList(WhiteSpaceTokenList):
+
+ token_type = 'cfws'
+
+ def has_leading_comment(self):
+ return bool(self.comments)
+
+
+class Atom(TokenList):
+
+ token_type = 'atom'
+
+
+class Token(TokenList):
+
+ token_type = 'token'
+
+
+class EncodedWord(TokenList):
+
+ token_type = 'encoded-word'
+ cte = None
+ charset = None
+ lang = None
+
+ @property
+ def encoded(self):
+ if self.cte is not None:
+ return self.cte
+ _ew.encode(str(self), self.charset)
+
+
+
+class QuotedString(TokenList):
+
+ token_type = 'quoted-string'
+
+ @property
+ def content(self):
+ for x in self:
+ if x.token_type == 'bare-quoted-string':
+ return x.value
+
+ @property
+ def quoted_value(self):
+ res = []
+ for x in self:
+ if x.token_type == 'bare-quoted-string':
+ res.append(str(x))
+ else:
+ res.append(x.value)
+ return ''.join(res)
+
+ @property
+ def stripped_value(self):
+ for token in self:
+ if token.token_type == 'bare-quoted-string':
+ return token.value
+
+
+class BareQuotedString(QuotedString):
+
+ token_type = 'bare-quoted-string'
+
+ def __str__(self):
+ return quote_string(''.join(str(x) for x in self))
+
+ @property
+ def value(self):
+ return ''.join(str(x) for x in self)
+
+
+class Comment(WhiteSpaceTokenList):
+
+ token_type = 'comment'
+
+ def __str__(self):
+ return ''.join(sum([
+ ["("],
+ [self.quote(x) for x in self],
+ [")"],
+ ], []))
+
+ def quote(self, value):
+ if value.token_type == 'comment':
+ return str(value)
+ return str(value).replace('\\', '\\\\').replace(
+ '(', '\(').replace(
+ ')', '\)')
+
+ @property
+ def content(self):
+ return ''.join(str(x) for x in self)
+
+ @property
+ def comments(self):
+ return [self.content]
+
+class AddressList(TokenList):
+
+ token_type = 'address-list'
+
+ @property
+ def addresses(self):
+ return [x for x in self if x.token_type=='address']
+
+ @property
+ def mailboxes(self):
+ return sum((x.mailboxes
+ for x in self if x.token_type=='address'), [])
+
+ @property
+ def all_mailboxes(self):
+ return sum((x.all_mailboxes
+ for x in self if x.token_type=='address'), [])
+
+
+class Address(TokenList):
+
+ token_type = 'address'
+
+ @property
+ def display_name(self):
+ if self[0].token_type == 'group':
+ return self[0].display_name
+
+ @property
+ def mailboxes(self):
+ if self[0].token_type == 'mailbox':
+ return [self[0]]
+ elif self[0].token_type == 'invalid-mailbox':
+ return []
+ return self[0].mailboxes
+
+ @property
+ def all_mailboxes(self):
+ if self[0].token_type == 'mailbox':
+ return [self[0]]
+ elif self[0].token_type == 'invalid-mailbox':
+ return [self[0]]
+ return self[0].all_mailboxes
+
+class MailboxList(TokenList):
+
+ token_type = 'mailbox-list'
+
+ @property
+ def mailboxes(self):
+ return [x for x in self if x.token_type=='mailbox']
+
+ @property
+ def all_mailboxes(self):
+ return [x for x in self
+ if x.token_type in ('mailbox', 'invalid-mailbox')]
+
+
+class GroupList(TokenList):
+
+ token_type = 'group-list'
+
+ @property
+ def mailboxes(self):
+ if not self or self[0].token_type != 'mailbox-list':
+ return []
+ return self[0].mailboxes
+
+ @property
+ def all_mailboxes(self):
+ if not self or self[0].token_type != 'mailbox-list':
+ return []
+ return self[0].all_mailboxes
+
+
+class Group(TokenList):
+
+ token_type = "group"
+
+ @property
+ def mailboxes(self):
+ if self[2].token_type != 'group-list':
+ return []
+ return self[2].mailboxes
+
+ @property
+ def all_mailboxes(self):
+ if self[2].token_type != 'group-list':
+ return []
+ return self[2].all_mailboxes
+
+ @property
+ def display_name(self):
+ return self[0].display_name
+
+
+class NameAddr(TokenList):
+
+ token_type = 'name-addr'
+
+ @property
+ def display_name(self):
+ if len(self) == 1:
+ return None
+ return self[0].display_name
+
+ @property
+ def local_part(self):
+ return self[-1].local_part
+
+ @property
+ def domain(self):
+ return self[-1].domain
+
+ @property
+ def route(self):
+ return self[-1].route
+
+ @property
+ def addr_spec(self):
+ return self[-1].addr_spec
+
+
+class AngleAddr(TokenList):
+
+ token_type = 'angle-addr'
+
+ @property
+ def local_part(self):
+ for x in self:
+ if x.token_type == 'addr-spec':
+ return x.local_part
+
+ @property
+ def domain(self):
+ for x in self:
+ if x.token_type == 'addr-spec':
+ return x.domain
+
+ @property
+ def route(self):
+ for x in self:
+ if x.token_type == 'obs-route':
+ return x.domains
+
+ @property
+ def addr_spec(self):
+ for x in self:
+ if x.token_type == 'addr-spec':
+ return x.addr_spec
+ else:
+ return '<>'
+
+
+class ObsRoute(TokenList):
+
+ token_type = 'obs-route'
+
+ @property
+ def domains(self):
+ return [x.domain for x in self if x.token_type == 'domain']
+
+
+class Mailbox(TokenList):
+
+ token_type = 'mailbox'
+
+ @property
+ def display_name(self):
+ if self[0].token_type == 'name-addr':
+ return self[0].display_name
+
+ @property
+ def local_part(self):
+ return self[0].local_part
+
+ @property
+ def domain(self):
+ return self[0].domain
+
+ @property
+ def route(self):
+ if self[0].token_type == 'name-addr':
+ return self[0].route
+
+ @property
+ def addr_spec(self):
+ return self[0].addr_spec
+
+
+class InvalidMailbox(TokenList):
+
+ token_type = 'invalid-mailbox'
+
+ @property
+ def display_name(self):
+ return None
+
+ local_part = domain = route = addr_spec = display_name
+
+
+class Domain(TokenList):
+
+ token_type = 'domain'
+
+ @property
+ def domain(self):
+ return ''.join(super().value.split())
+
+
+class DotAtom(TokenList):
+
+ token_type = 'dot-atom'
+
+
+class DotAtomText(TokenList):
+
+ token_type = 'dot-atom-text'
+
+
+class AddrSpec(TokenList):
+
+ token_type = 'addr-spec'
+
+ @property
+ def local_part(self):
+ return self[0].local_part
+
+ @property
+ def domain(self):
+ if len(self) < 3:
+ return None
+ return self[-1].domain
+
+ @property
+ def value(self):
+ if len(self) < 3:
+ return self[0].value
+ return self[0].value.rstrip()+self[1].value+self[2].value.lstrip()
+
+ @property
+ def addr_spec(self):
+ nameset = set(self.local_part)
+ if len(nameset) > len(nameset-DOT_ATOM_ENDS):
+ lp = quote_string(self.local_part)
+ else:
+ lp = self.local_part
+ if self.domain is not None:
+ return lp + '@' + self.domain
+ return lp
+
+
+class ObsLocalPart(TokenList):
+
+ token_type = 'obs-local-part'
+
+
+class DisplayName(Phrase):
+
+ token_type = 'display-name'
+
+ @property
+ def display_name(self):
+ res = TokenList(self)
+ if res[0].token_type == 'cfws':
+ res.pop(0)
+ else:
+ if res[0][0].token_type == 'cfws':
+ res[0] = TokenList(res[0][1:])
+ if res[-1].token_type == 'cfws':
+ res.pop()
+ else:
+ if res[-1][-1].token_type == 'cfws':
+ res[-1] = TokenList(res[-1][:-1])
+ return res.value
+
+ @property
+ def value(self):
+ quote = False
+ if self.defects:
+ quote = True
+ else:
+ for x in self:
+ if x.token_type == 'quoted-string':
+ quote = True
+ if quote:
+ pre = post = ''
+ if self[0].token_type=='cfws' or self[0][0].token_type=='cfws':
+ pre = ' '
+ if self[-1].token_type=='cfws' or self[-1][-1].token_type=='cfws':
+ post = ' '
+ return pre+quote_string(self.display_name)+post
+ else:
+ return super().value
+
+
+class LocalPart(TokenList):
+
+ token_type = 'local-part'
+
+ @property
+ def value(self):
+ if self[0].token_type == "quoted-string":
+ return self[0].quoted_value
+ else:
+ return self[0].value
+
+ @property
+ def local_part(self):
+ # Strip whitespace from front, back, and around dots.
+ res = [DOT]
+ last = DOT
+ last_is_tl = False
+ for tok in self[0] + [DOT]:
+ if tok.token_type == 'cfws':
+ continue
+ if (last_is_tl and tok.token_type == 'dot' and
+ last[-1].token_type == 'cfws'):
+ res[-1] = TokenList(last[:-1])
+ is_tl = isinstance(tok, TokenList)
+ if (is_tl and last.token_type == 'dot' and
+ tok[0].token_type == 'cfws'):
+ res.append(TokenList(tok[1:]))
+ else:
+ res.append(tok)
+ last = res[-1]
+ last_is_tl = is_tl
+ res = TokenList(res[1:-1])
+ return res.value
+
+
+class DomainLiteral(TokenList):
+
+ token_type = 'domain-literal'
+
+ @property
+ def domain(self):
+ return ''.join(super().value.split())
+
+ @property
+ def ip(self):
+ for x in self:
+ if x.token_type == 'ptext':
+ return x.value
+
+
+class MIMEVersion(TokenList):
+
+ token_type = 'mime-version'
+ major = None
+ minor = None
+
+
+class Parameter(TokenList):
+
+ token_type = 'parameter'
+ sectioned = False
+ extended = False
+ charset = 'us-ascii'
+
+ @property
+ def section_number(self):
+ # Because the first token, the attribute (name) eats CFWS, the second
+ # token is always the section if there is one.
+ return self[1].number if self.sectioned else 0
+
+ @property
+ def param_value(self):
+ # This is part of the "handle quoted extended parameters" hack.
+ for token in self:
+ if token.token_type == 'value':
+ return token.stripped_value
+ if token.token_type == 'quoted-string':
+ for token in token:
+ if token.token_type == 'bare-quoted-string':
+ for token in token:
+ if token.token_type == 'value':
+ return token.stripped_value
+ return ''
+
+
+class InvalidParameter(Parameter):
+
+ token_type = 'invalid-parameter'
+
+
+class Attribute(TokenList):
+
+ token_type = 'attribute'
+
+ @property
+ def stripped_value(self):
+ for token in self:
+ if token.token_type.endswith('attrtext'):
+ return token.value
+
+class Section(TokenList):
+
+ token_type = 'section'
+ number = None
+
+
+class Value(TokenList):
+
+ token_type = 'value'
+
+ @property
+ def stripped_value(self):
+ token = self[0]
+ if token.token_type == 'cfws':
+ token = self[1]
+ if token.token_type.endswith(
+ ('quoted-string', 'attribute', 'extended-attribute')):
+ return token.stripped_value
+ return self.value
+
+
+class MimeParameters(TokenList):
+
+ token_type = 'mime-parameters'
+
+ @property
+ def params(self):
+ # The RFC specifically states that the ordering of parameters is not
+ # guaranteed and may be reordered by the transport layer. So we have
+ # to assume the RFC 2231 pieces can come in any order. However, we
+ # output them in the order that we first see a given name, which gives
+ # us a stable __str__.
+ params = OrderedDict()
+ for token in self:
+ if not token.token_type.endswith('parameter'):
+ continue
+ if token[0].token_type != 'attribute':
+ continue
+ name = token[0].value.strip()
+ if name not in params:
+ params[name] = []
+ params[name].append((token.section_number, token))
+ for name, parts in params.items():
+ parts = sorted(parts)
+ # XXX: there might be more recovery we could do here if, for
+ # example, this is really a case of a duplicate attribute name.
+ value_parts = []
+ charset = parts[0][1].charset
+ for i, (section_number, param) in enumerate(parts):
+ if section_number != i:
+ param.defects.append(errors.InvalidHeaderDefect(
+ "inconsistent multipart parameter numbering"))
+ value = param.param_value
+ if param.extended:
+ try:
+ value = urllib.parse.unquote_to_bytes(value)
+ except UnicodeEncodeError:
+ # source had surrogate escaped bytes. What we do now
+ # is a bit of an open question. I'm not sure this is
+ # the best choice, but it is what the old algorithm did
+ value = urllib.parse.unquote(value, encoding='latin-1')
+ else:
+ try:
+ value = value.decode(charset, 'surrogateescape')
+ except LookupError:
+ # XXX: there should really be a custom defect for
+ # unknown character set to make it easy to find,
+ # because otherwise unknown charset is a silent
+ # failure.
+ value = value.decode('us-ascii', 'surrogateescape')
+ if utils._has_surrogates(value):
+ param.defects.append(errors.UndecodableBytesDefect())
+ value_parts.append(value)
+ value = ''.join(value_parts)
+ yield name, value
+
+ def __str__(self):
+ params = []
+ for name, value in self.params:
+ if value:
+ params.append('{}={}'.format(name, quote_string(value)))
+ else:
+ params.append(name)
+ params = '; '.join(params)
+ return ' ' + params if params else ''
+
+
+class ParameterizedHeaderValue(TokenList):
+
+ @property
+ def params(self):
+ for token in reversed(self):
+ if token.token_type == 'mime-parameters':
+ return token.params
+ return {}
+
+ @property
+ def parts(self):
+ if self and self[-1].token_type == 'mime-parameters':
+ # We don't want to start a new line if all of the params don't fit
+ # after the value, so unwrap the parameter list.
+ return TokenList(self[:-1] + self[-1])
+ return TokenList(self).parts
+
+
+class ContentType(ParameterizedHeaderValue):
+
+ token_type = 'content-type'
+ maintype = 'text'
+ subtype = 'plain'
+
+
+class ContentDisposition(ParameterizedHeaderValue):
+
+ token_type = 'content-disposition'
+ content_disposition = None
+
+
+class ContentTransferEncoding(TokenList):
+
+ token_type = 'content-transfer-encoding'
+ cte = '7bit'
+
+
+class HeaderLabel(TokenList):
+
+ token_type = 'header-label'
+
+
+class Header(TokenList):
+
+ token_type = 'header'
+
+ def _fold(self, folded):
+ folded.append(str(self.pop(0)))
+ folded.lastlen = len(folded.current[0])
+ # The first line of the header is different from all others: we don't
+ # want to start a new object on a new line if it has any fold points in
+ # it that would allow part of it to be on the first header line.
+ # Further, if the first fold point would fit on the new line, we want
+ # to do that, but if it doesn't we want to put it on the first line.
+ # Folded supports this via the stickyspace attribute. If this
+ # attribute is not None, it does the special handling.
+ folded.stickyspace = str(self.pop(0)) if self[0].token_type == 'cfws' else ''
+ rest = self.pop(0)
+ if self:
+ raise ValueError("Malformed Header token list")
+ rest._fold(folded)
+
+
+#
+# Terminal classes and instances
+#
+
+class Terminal(str):
+
+ def __new__(cls, value, token_type):
+ self = super().__new__(cls, value)
+ self.token_type = token_type
+ self.defects = []
+ return self
+
+ def __repr__(self):
+ return "{}({})".format(self.__class__.__name__, super().__repr__())
+
+ @property
+ def all_defects(self):
+ return list(self.defects)
+
+ def _pp(self, indent=''):
+ return ["{}{}/{}({}){}".format(
+ indent,
+ self.__class__.__name__,
+ self.token_type,
+ super().__repr__(),
+ '' if not self.defects else ' {}'.format(self.defects),
+ )]
+
+ def cte_encode(self, charset, policy):
+ value = str(self)
+ try:
+ value.encode('us-ascii')
+ return value
+ except UnicodeEncodeError:
+ return _ew.encode(value, charset)
+
+ def pop_trailing_ws(self):
+ # This terminates the recursion.
+ return None
+
+ def pop_leading_fws(self):
+ # This terminates the recursion.
+ return None
+
+ @property
+ def comments(self):
+ return []
+
+ def has_leading_comment(self):
+ return False
+
+ def __getnewargs__(self):
+ return(str(self), self.token_type)
+
+
+class WhiteSpaceTerminal(Terminal):
+
+ @property
+ def value(self):
+ return ' '
+
+ def startswith_fws(self):
+ return True
+
+ has_fws = True
+
+
+class ValueTerminal(Terminal):
+
+ @property
+ def value(self):
+ return self
+
+ def startswith_fws(self):
+ return False
+
+ has_fws = False
+
+ def as_encoded_word(self, charset):
+ return _ew.encode(str(self), charset)
+
+
+class EWWhiteSpaceTerminal(WhiteSpaceTerminal):
+
+ @property
+ def value(self):
+ return ''
+
+ @property
+ def encoded(self):
+ return self[:]
+
+ def __str__(self):
+ return ''
+
+ has_fws = True
+
+
+# XXX these need to become classes and used as instances so
+# that a program can't change them in a parse tree and screw
+# up other parse trees. Maybe should have tests for that, too.
+DOT = ValueTerminal('.', 'dot')
+ListSeparator = ValueTerminal(',', 'list-separator')
+RouteComponentMarker = ValueTerminal('@', 'route-component-marker')
+
+#
+# Parser
+#
+
+"""Parse strings according to RFC822/2047/2822/5322 rules.
+
+This is a stateless parser. Each get_XXX function accepts a string and
+returns either a Terminal or a TokenList representing the RFC object named
+by the method and a string containing the remaining unparsed characters
+from the input. Thus a parser method consumes the next syntactic construct
+of a given type and returns a token representing the construct plus the
+unparsed remainder of the input string.
+
+For example, if the first element of a structured header is a 'phrase',
+then:
+
+ phrase, value = get_phrase(value)
+
+returns the complete phrase from the start of the string value, plus any
+characters left in the string after the phrase is removed.
+
+"""
+
+_wsp_splitter = re.compile(r'([{}]+)'.format(''.join(WSP))).split
+_non_atom_end_matcher = re.compile(r"[^{}]+".format(
+ ''.join(ATOM_ENDS).replace('\\','\\\\').replace(']','\]'))).match
+_non_printable_finder = re.compile(r"[\x00-\x20\x7F]").findall
+_non_token_end_matcher = re.compile(r"[^{}]+".format(
+ ''.join(TOKEN_ENDS).replace('\\','\\\\').replace(']','\]'))).match
+_non_attribute_end_matcher = re.compile(r"[^{}]+".format(
+ ''.join(ATTRIBUTE_ENDS).replace('\\','\\\\').replace(']','\]'))).match
+_non_extended_attribute_end_matcher = re.compile(r"[^{}]+".format(
+ ''.join(EXTENDED_ATTRIBUTE_ENDS).replace(
+ '\\','\\\\').replace(']','\]'))).match
+
+def _validate_xtext(xtext):
+ """If input token contains ASCII non-printables, register a defect."""
+
+ non_printables = _non_printable_finder(xtext)
+ if non_printables:
+ xtext.defects.append(errors.NonPrintableDefect(non_printables))
+ if utils._has_surrogates(xtext):
+ xtext.defects.append(errors.UndecodableBytesDefect(
+ "Non-ASCII characters found in header token"))
+
+def _get_ptext_to_endchars(value, endchars):
+ """Scan printables/quoted-pairs until endchars and return unquoted ptext.
+
+ This function turns a run of qcontent, ccontent-without-comments, or
+ dtext-with-quoted-printables into a single string by unquoting any
+ quoted printables. It returns the string, the remaining value, and
+ a flag that is True iff there were any quoted printables decoded.
+
+ """
+ fragment, *remainder = _wsp_splitter(value, 1)
+ vchars = []
+ escape = False
+ had_qp = False
+ for pos in range(len(fragment)):
+ if fragment[pos] == '\\':
+ if escape:
+ escape = False
+ had_qp = True
+ else:
+ escape = True
+ continue
+ if escape:
+ escape = False
+ elif fragment[pos] in endchars:
+ break
+ vchars.append(fragment[pos])
+ else:
+ pos = pos + 1
+ return ''.join(vchars), ''.join([fragment[pos:]] + remainder), had_qp
+
+def _decode_ew_run(value):
+ """ Decode a run of RFC2047 encoded words.
+
+ _decode_ew_run(value) -> (text, value, defects)
+
+ Scans the supplied value for a run of tokens that look like they are RFC
+ 2047 encoded words, decodes those words into text according to RFC 2047
+ rules (whitespace between encoded words is discarded), and returns the text
+ and the remaining value (including any leading whitespace on the remaining
+ value), as well as a list of any defects encountered while decoding. The
+ input value may not have any leading whitespace.
+
+ """
+ res = []
+ defects = []
+ last_ws = ''
+ while value:
+ try:
+ tok, ws, value = _wsp_splitter(value, 1)
+ except ValueError:
+ tok, ws, value = value, '', ''
+ if not (tok.startswith('=?') and tok.endswith('?=')):
+ return ''.join(res), last_ws + tok + ws + value, defects
+ text, charset, lang, new_defects = _ew.decode(tok)
+ res.append(text)
+ defects.extend(new_defects)
+ last_ws = ws
+ return ''.join(res), last_ws, defects
+
+def get_fws(value):
+ """FWS = 1*WSP
+
+ This isn't the RFC definition. We're using fws to represent tokens where
+ folding can be done, but when we are parsing the *un*folding has already
+ been done so we don't need to watch out for CRLF.
+
+ """
+ newvalue = value.lstrip()
+ fws = WhiteSpaceTerminal(value[:len(value)-len(newvalue)], 'fws')
+ return fws, newvalue
+
+def get_encoded_word(value):
+ """ encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
+
+ """
+ ew = EncodedWord()
+ if not value.startswith('=?'):
+ raise errors.HeaderParseError(
+ "expected encoded word but found {}".format(value))
+ tok, *remainder = value[2:].split('?=', 1)
+ if tok == value[2:]:
+ raise errors.HeaderParseError(
+ "expected encoded word but found {}".format(value))
+ remstr = ''.join(remainder)
+ if remstr[:2].isdigit():
+ rest, *remainder = remstr.split('?=', 1)
+ tok = tok + '?=' + rest
+ if len(tok.split()) > 1:
+ ew.defects.append(errors.InvalidHeaderDefect(
+ "whitespace inside encoded word"))
+ ew.cte = value
+ value = ''.join(remainder)
+ try:
+ text, charset, lang, defects = _ew.decode('=?' + tok + '?=')
+ except ValueError:
+ raise errors.HeaderParseError(
+ "encoded word format invalid: '{}'".format(ew.cte))
+ ew.charset = charset
+ ew.lang = lang
+ ew.defects.extend(defects)
+ while text:
+ if text[0] in WSP:
+ token, text = get_fws(text)
+ ew.append(token)
+ continue
+ chars, *remainder = _wsp_splitter(text, 1)
+ vtext = ValueTerminal(chars, 'vtext')
+ _validate_xtext(vtext)
+ ew.append(vtext)
+ text = ''.join(remainder)
+ return ew, value
+
+def get_unstructured(value):
+ """unstructured = (*([FWS] vchar) *WSP) / obs-unstruct
+ obs-unstruct = *((*LF *CR *(obs-utext) *LF *CR)) / FWS)
+ obs-utext = %d0 / obs-NO-WS-CTL / LF / CR
+
+ obs-NO-WS-CTL is control characters except WSP/CR/LF.
+
+ So, basically, we have printable runs, plus control characters or nulls in
+ the obsolete syntax, separated by whitespace. Since RFC 2047 uses the
+ obsolete syntax in its specification, but requires whitespace on either
+ side of the encoded words, I can see no reason to need to separate the
+ non-printable-non-whitespace from the printable runs if they occur, so we
+ parse this into xtext tokens separated by WSP tokens.
+
+ Because an 'unstructured' value must by definition constitute the entire
+ value, this 'get' routine does not return a remaining value, only the
+ parsed TokenList.
+
+ """
+ # XXX: but what about bare CR and LF? They might signal the start or
+ # end of an encoded word. YAGNI for now, since out current parsers
+ # will never send us strings with bard CR or LF.
+
+ unstructured = UnstructuredTokenList()
+ while value:
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ unstructured.append(token)
+ continue
+ if value.startswith('=?'):
+ try:
+ token, value = get_encoded_word(value)
+ except errors.HeaderParseError:
+ pass
+ else:
+ have_ws = True
+ if len(unstructured) > 0:
+ if unstructured[-1].token_type != 'fws':
+ unstructured.defects.append(errors.InvalidHeaderDefect(
+ "missing whitespace before encoded word"))
+ have_ws = False
+ if have_ws and len(unstructured) > 1:
+ if unstructured[-2].token_type == 'encoded-word':
+ unstructured[-1] = EWWhiteSpaceTerminal(
+ unstructured[-1], 'fws')
+ unstructured.append(token)
+ continue
+ tok, *remainder = _wsp_splitter(value, 1)
+ vtext = ValueTerminal(tok, 'vtext')
+ _validate_xtext(vtext)
+ unstructured.append(vtext)
+ value = ''.join(remainder)
+ return unstructured
+
+def get_qp_ctext(value):
+ """ctext = <printable ascii except \ ( )>
+
+ This is not the RFC ctext, since we are handling nested comments in comment
+ and unquoting quoted-pairs here. We allow anything except the '()'
+ characters, but if we find any ASCII other than the RFC defined printable
+ ASCII an NonPrintableDefect is added to the token's defects list. Since
+ quoted pairs are converted to their unquoted values, what is returned is
+ a 'ptext' token. In this case it is a WhiteSpaceTerminal, so it's value
+ is ' '.
+
+ """
+ ptext, value, _ = _get_ptext_to_endchars(value, '()')
+ ptext = WhiteSpaceTerminal(ptext, 'ptext')
+ _validate_xtext(ptext)
+ return ptext, value
+
+def get_qcontent(value):
+ """qcontent = qtext / quoted-pair
+
+ We allow anything except the DQUOTE character, but if we find any ASCII
+ other than the RFC defined printable ASCII an NonPrintableDefect is
+ added to the token's defects list. Any quoted pairs are converted to their
+ unquoted values, so what is returned is a 'ptext' token. In this case it
+ is a ValueTerminal.
+
+ """
+ ptext, value, _ = _get_ptext_to_endchars(value, '"')
+ ptext = ValueTerminal(ptext, 'ptext')
+ _validate_xtext(ptext)
+ return ptext, value
+
+def get_atext(value):
+ """atext = <matches _atext_matcher>
+
+ We allow any non-ATOM_ENDS in atext, but add an InvalidATextDefect to
+ the token's defects list if we find non-atext characters.
+ """
+ m = _non_atom_end_matcher(value)
+ if not m:
+ raise errors.HeaderParseError(
+ "expected atext but found '{}'".format(value))
+ atext = m.group()
+ value = value[len(atext):]
+ atext = ValueTerminal(atext, 'atext')
+ _validate_xtext(atext)
+ return atext, value
+
+def get_bare_quoted_string(value):
+ """bare-quoted-string = DQUOTE *([FWS] qcontent) [FWS] DQUOTE
+
+ A quoted-string without the leading or trailing white space. Its
+ value is the text between the quote marks, with whitespace
+ preserved and quoted pairs decoded.
+ """
+ if value[0] != '"':
+ raise errors.HeaderParseError(
+ "expected '\"' but found '{}'".format(value))
+ bare_quoted_string = BareQuotedString()
+ value = value[1:]
+ while value and value[0] != '"':
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ else:
+ token, value = get_qcontent(value)
+ bare_quoted_string.append(token)
+ if not value:
+ bare_quoted_string.defects.append(errors.InvalidHeaderDefect(
+ "end of header inside quoted string"))
+ return bare_quoted_string, value
+ return bare_quoted_string, value[1:]
+
+def get_comment(value):
+ """comment = "(" *([FWS] ccontent) [FWS] ")"
+ ccontent = ctext / quoted-pair / comment
+
+ We handle nested comments here, and quoted-pair in our qp-ctext routine.
+ """
+ if value and value[0] != '(':
+ raise errors.HeaderParseError(
+ "expected '(' but found '{}'".format(value))
+ comment = Comment()
+ value = value[1:]
+ while value and value[0] != ")":
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ elif value[0] == '(':
+ token, value = get_comment(value)
+ else:
+ token, value = get_qp_ctext(value)
+ comment.append(token)
+ if not value:
+ comment.defects.append(errors.InvalidHeaderDefect(
+ "end of header inside comment"))
+ return comment, value
+ return comment, value[1:]
+
+def get_cfws(value):
+ """CFWS = (1*([FWS] comment) [FWS]) / FWS
+
+ """
+ cfws = CFWSList()
+ while value and value[0] in CFWS_LEADER:
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ else:
+ token, value = get_comment(value)
+ cfws.append(token)
+ return cfws, value
+
+def get_quoted_string(value):
+ """quoted-string = [CFWS] <bare-quoted-string> [CFWS]
+
+ 'bare-quoted-string' is an intermediate class defined by this
+ parser and not by the RFC grammar. It is the quoted string
+ without any attached CFWS.
+ """
+ quoted_string = QuotedString()
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ quoted_string.append(token)
+ token, value = get_bare_quoted_string(value)
+ quoted_string.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ quoted_string.append(token)
+ return quoted_string, value
+
+def get_atom(value):
+ """atom = [CFWS] 1*atext [CFWS]
+
+ """
+ atom = Atom()
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ atom.append(token)
+ if value and value[0] in ATOM_ENDS:
+ raise errors.HeaderParseError(
+ "expected atom but found '{}'".format(value))
+ token, value = get_atext(value)
+ atom.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ atom.append(token)
+ return atom, value
+
+def get_dot_atom_text(value):
+ """ dot-text = 1*atext *("." 1*atext)
+
+ """
+ dot_atom_text = DotAtomText()
+ if not value or value[0] in ATOM_ENDS:
+ raise errors.HeaderParseError("expected atom at a start of "
+ "dot-atom-text but found '{}'".format(value))
+ while value and value[0] not in ATOM_ENDS:
+ token, value = get_atext(value)
+ dot_atom_text.append(token)
+ if value and value[0] == '.':
+ dot_atom_text.append(DOT)
+ value = value[1:]
+ if dot_atom_text[-1] is DOT:
+ raise errors.HeaderParseError("expected atom at end of dot-atom-text "
+ "but found '{}'".format('.'+value))
+ return dot_atom_text, value
+
+def get_dot_atom(value):
+ """ dot-atom = [CFWS] dot-atom-text [CFWS]
+
+ """
+ dot_atom = DotAtom()
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ dot_atom.append(token)
+ token, value = get_dot_atom_text(value)
+ dot_atom.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ dot_atom.append(token)
+ return dot_atom, value
+
+def get_word(value):
+ """word = atom / quoted-string
+
+ Either atom or quoted-string may start with CFWS. We have to peel off this
+ CFWS first to determine which type of word to parse. Afterward we splice
+ the leading CFWS, if any, into the parsed sub-token.
+
+ If neither an atom or a quoted-string is found before the next special, a
+ HeaderParseError is raised.
+
+ The token returned is either an Atom or a QuotedString, as appropriate.
+ This means the 'word' level of the formal grammar is not represented in the
+ parse tree; this is because having that extra layer when manipulating the
+ parse tree is more confusing than it is helpful.
+
+ """
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ else:
+ leader = None
+ if value[0]=='"':
+ token, value = get_quoted_string(value)
+ elif value[0] in SPECIALS:
+ raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' "
+ "but found '{}'".format(value))
+ else:
+ token, value = get_atom(value)
+ if leader is not None:
+ token[:0] = [leader]
+ return token, value
+
+def get_phrase(value):
+ """ phrase = 1*word / obs-phrase
+ obs-phrase = word *(word / "." / CFWS)
+
+ This means a phrase can be a sequence of words, periods, and CFWS in any
+ order as long as it starts with at least one word. If anything other than
+ words is detected, an ObsoleteHeaderDefect is added to the token's defect
+ list. We also accept a phrase that starts with CFWS followed by a dot;
+ this is registered as an InvalidHeaderDefect, since it is not supported by
+ even the obsolete grammar.
+
+ """
+ phrase = Phrase()
+ try:
+ token, value = get_word(value)
+ phrase.append(token)
+ except errors.HeaderParseError:
+ phrase.defects.append(errors.InvalidHeaderDefect(
+ "phrase does not start with word"))
+ while value and value[0] not in PHRASE_ENDS:
+ if value[0]=='.':
+ phrase.append(DOT)
+ phrase.defects.append(errors.ObsoleteHeaderDefect(
+ "period in 'phrase'"))
+ value = value[1:]
+ else:
+ try:
+ token, value = get_word(value)
+ except errors.HeaderParseError:
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ phrase.defects.append(errors.ObsoleteHeaderDefect(
+ "comment found without atom"))
+ else:
+ raise
+ phrase.append(token)
+ return phrase, value
+
+def get_local_part(value):
+ """ local-part = dot-atom / quoted-string / obs-local-part
+
+ """
+ local_part = LocalPart()
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ raise errors.HeaderParseError(
+ "expected local-part but found '{}'".format(value))
+ try:
+ token, value = get_dot_atom(value)
+ except errors.HeaderParseError:
+ try:
+ token, value = get_word(value)
+ except errors.HeaderParseError:
+ if value[0] != '\\' and value[0] in PHRASE_ENDS:
+ raise
+ token = TokenList()
+ if leader is not None:
+ token[:0] = [leader]
+ local_part.append(token)
+ if value and (value[0]=='\\' or value[0] not in PHRASE_ENDS):
+ obs_local_part, value = get_obs_local_part(str(local_part) + value)
+ if obs_local_part.token_type == 'invalid-obs-local-part':
+ local_part.defects.append(errors.InvalidHeaderDefect(
+ "local-part is not dot-atom, quoted-string, or obs-local-part"))
+ else:
+ local_part.defects.append(errors.ObsoleteHeaderDefect(
+ "local-part is not a dot-atom (contains CFWS)"))
+ local_part[0] = obs_local_part
+ try:
+ local_part.value.encode('ascii')
+ except UnicodeEncodeError:
+ local_part.defects.append(errors.NonASCIILocalPartDefect(
+ "local-part contains non-ASCII characters)"))
+ return local_part, value
+
+def get_obs_local_part(value):
+ """ obs-local-part = word *("." word)
+ """
+ obs_local_part = ObsLocalPart()
+ last_non_ws_was_dot = False
+ while value and (value[0]=='\\' or value[0] not in PHRASE_ENDS):
+ if value[0] == '.':
+ if last_non_ws_was_dot:
+ obs_local_part.defects.append(errors.InvalidHeaderDefect(
+ "invalid repeated '.'"))
+ obs_local_part.append(DOT)
+ last_non_ws_was_dot = True
+ value = value[1:]
+ continue
+ elif value[0]=='\\':
+ obs_local_part.append(ValueTerminal(value[0],
+ 'misplaced-special'))
+ value = value[1:]
+ obs_local_part.defects.append(errors.InvalidHeaderDefect(
+ "'\\' character outside of quoted-string/ccontent"))
+ last_non_ws_was_dot = False
+ continue
+ if obs_local_part and obs_local_part[-1].token_type != 'dot':
+ obs_local_part.defects.append(errors.InvalidHeaderDefect(
+ "missing '.' between words"))
+ try:
+ token, value = get_word(value)
+ last_non_ws_was_dot = False
+ except errors.HeaderParseError:
+ if value[0] not in CFWS_LEADER:
+ raise
+ token, value = get_cfws(value)
+ obs_local_part.append(token)
+ if (obs_local_part[0].token_type == 'dot' or
+ obs_local_part[0].token_type=='cfws' and
+ obs_local_part[1].token_type=='dot'):
+ obs_local_part.defects.append(errors.InvalidHeaderDefect(
+ "Invalid leading '.' in local part"))
+ if (obs_local_part[-1].token_type == 'dot' or
+ obs_local_part[-1].token_type=='cfws' and
+ obs_local_part[-2].token_type=='dot'):
+ obs_local_part.defects.append(errors.InvalidHeaderDefect(
+ "Invalid trailing '.' in local part"))
+ if obs_local_part.defects:
+ obs_local_part.token_type = 'invalid-obs-local-part'
+ return obs_local_part, value
+
+def get_dtext(value):
+ """ dtext = <printable ascii except \ [ ]> / obs-dtext
+ obs-dtext = obs-NO-WS-CTL / quoted-pair
+
+ We allow anything except the excluded characters, but but if we find any
+ ASCII other than the RFC defined printable ASCII an NonPrintableDefect is
+ added to the token's defects list. Quoted pairs are converted to their
+ unquoted values, so what is returned is a ptext token, in this case a
+ ValueTerminal. If there were quoted-printables, an ObsoleteHeaderDefect is
+ added to the returned token's defect list.
+
+ """
+ ptext, value, had_qp = _get_ptext_to_endchars(value, '[]')
+ ptext = ValueTerminal(ptext, 'ptext')
+ if had_qp:
+ ptext.defects.append(errors.ObsoleteHeaderDefect(
+ "quoted printable found in domain-literal"))
+ _validate_xtext(ptext)
+ return ptext, value
+
+def _check_for_early_dl_end(value, domain_literal):
+ if value:
+ return False
+ domain_literal.append(errors.InvalidHeaderDefect(
+ "end of input inside domain-literal"))
+ domain_literal.append(ValueTerminal(']', 'domain-literal-end'))
+ return True
+
+def get_domain_literal(value):
+ """ domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
+
+ """
+ domain_literal = DomainLiteral()
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ domain_literal.append(token)
+ if not value:
+ raise errors.HeaderParseError("expected domain-literal")
+ if value[0] != '[':
+ raise errors.HeaderParseError("expected '[' at start of domain-literal "
+ "but found '{}'".format(value))
+ value = value[1:]
+ if _check_for_early_dl_end(value, domain_literal):
+ return domain_literal, value
+ domain_literal.append(ValueTerminal('[', 'domain-literal-start'))
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ domain_literal.append(token)
+ token, value = get_dtext(value)
+ domain_literal.append(token)
+ if _check_for_early_dl_end(value, domain_literal):
+ return domain_literal, value
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ domain_literal.append(token)
+ if _check_for_early_dl_end(value, domain_literal):
+ return domain_literal, value
+ if value[0] != ']':
+ raise errors.HeaderParseError("expected ']' at end of domain-literal "
+ "but found '{}'".format(value))
+ domain_literal.append(ValueTerminal(']', 'domain-literal-end'))
+ value = value[1:]
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ domain_literal.append(token)
+ return domain_literal, value
+
+def get_domain(value):
+ """ domain = dot-atom / domain-literal / obs-domain
+ obs-domain = atom *("." atom))
+
+ """
+ domain = Domain()
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ raise errors.HeaderParseError(
+ "expected domain but found '{}'".format(value))
+ if value[0] == '[':
+ token, value = get_domain_literal(value)
+ if leader is not None:
+ token[:0] = [leader]
+ domain.append(token)
+ return domain, value
+ try:
+ token, value = get_dot_atom(value)
+ except errors.HeaderParseError:
+ token, value = get_atom(value)
+ if leader is not None:
+ token[:0] = [leader]
+ domain.append(token)
+ if value and value[0] == '.':
+ domain.defects.append(errors.ObsoleteHeaderDefect(
+ "domain is not a dot-atom (contains CFWS)"))
+ if domain[0].token_type == 'dot-atom':
+ domain[:] = domain[0]
+ while value and value[0] == '.':
+ domain.append(DOT)
+ token, value = get_atom(value[1:])
+ domain.append(token)
+ return domain, value
+
+def get_addr_spec(value):
+ """ addr-spec = local-part "@" domain
+
+ """
+ addr_spec = AddrSpec()
+ token, value = get_local_part(value)
+ addr_spec.append(token)
+ if not value or value[0] != '@':
+ addr_spec.defects.append(errors.InvalidHeaderDefect(
+ "add-spec local part with no domain"))
+ return addr_spec, value
+ addr_spec.append(ValueTerminal('@', 'address-at-symbol'))
+ token, value = get_domain(value[1:])
+ addr_spec.append(token)
+ return addr_spec, value
+
+def get_obs_route(value):
+ """ obs-route = obs-domain-list ":"
+ obs-domain-list = *(CFWS / ",") "@" domain *("," [CFWS] ["@" domain])
+
+ Returns an obs-route token with the appropriate sub-tokens (that is,
+ there is no obs-domain-list in the parse tree).
+ """
+ obs_route = ObsRoute()
+ while value and (value[0]==',' or value[0] in CFWS_LEADER):
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ obs_route.append(token)
+ elif value[0] == ',':
+ obs_route.append(ListSeparator)
+ value = value[1:]
+ if not value or value[0] != '@':
+ raise errors.HeaderParseError(
+ "expected obs-route domain but found '{}'".format(value))
+ obs_route.append(RouteComponentMarker)
+ token, value = get_domain(value[1:])
+ obs_route.append(token)
+ while value and value[0]==',':
+ obs_route.append(ListSeparator)
+ value = value[1:]
+ if not value:
+ break
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ obs_route.append(token)
+ if value[0] == '@':
+ obs_route.append(RouteComponentMarker)
+ token, value = get_domain(value[1:])
+ obs_route.append(token)
+ if not value:
+ raise errors.HeaderParseError("end of header while parsing obs-route")
+ if value[0] != ':':
+ raise errors.HeaderParseError( "expected ':' marking end of "
+ "obs-route but found '{}'".format(value))
+ obs_route.append(ValueTerminal(':', 'end-of-obs-route-marker'))
+ return obs_route, value[1:]
+
+def get_angle_addr(value):
+ """ angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr
+ obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS]
+
+ """
+ angle_addr = AngleAddr()
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ angle_addr.append(token)
+ if not value or value[0] != '<':
+ raise errors.HeaderParseError(
+ "expected angle-addr but found '{}'".format(value))
+ angle_addr.append(ValueTerminal('<', 'angle-addr-start'))
+ value = value[1:]
+ # Although it is not legal per RFC5322, SMTP uses '<>' in certain
+ # circumstances.
+ if value[0] == '>':
+ angle_addr.append(ValueTerminal('>', 'angle-addr-end'))
+ angle_addr.defects.append(errors.InvalidHeaderDefect(
+ "null addr-spec in angle-addr"))
+ value = value[1:]
+ return angle_addr, value
+ try:
+ token, value = get_addr_spec(value)
+ except errors.HeaderParseError:
+ try:
+ token, value = get_obs_route(value)
+ angle_addr.defects.append(errors.ObsoleteHeaderDefect(
+ "obsolete route specification in angle-addr"))
+ except errors.HeaderParseError:
+ raise errors.HeaderParseError(
+ "expected addr-spec or obs-route but found '{}'".format(value))
+ angle_addr.append(token)
+ token, value = get_addr_spec(value)
+ angle_addr.append(token)
+ if value and value[0] == '>':
+ value = value[1:]
+ else:
+ angle_addr.defects.append(errors.InvalidHeaderDefect(
+ "missing trailing '>' on angle-addr"))
+ angle_addr.append(ValueTerminal('>', 'angle-addr-end'))
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ angle_addr.append(token)
+ return angle_addr, value
+
+def get_display_name(value):
+ """ display-name = phrase
+
+ Because this is simply a name-rule, we don't return a display-name
+ token containing a phrase, but rather a display-name token with
+ the content of the phrase.
+
+ """
+ display_name = DisplayName()
+ token, value = get_phrase(value)
+ display_name.extend(token[:])
+ display_name.defects = token.defects[:]
+ return display_name, value
+
+
+def get_name_addr(value):
+ """ name-addr = [display-name] angle-addr
+
+ """
+ name_addr = NameAddr()
+ # Both the optional display name and the angle-addr can start with cfws.
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ raise errors.HeaderParseError(
+ "expected name-addr but found '{}'".format(leader))
+ if value[0] != '<':
+ if value[0] in PHRASE_ENDS:
+ raise errors.HeaderParseError(
+ "expected name-addr but found '{}'".format(value))
+ token, value = get_display_name(value)
+ if not value:
+ raise errors.HeaderParseError(
+ "expected name-addr but found '{}'".format(token))
+ if leader is not None:
+ token[0][:0] = [leader]
+ leader = None
+ name_addr.append(token)
+ token, value = get_angle_addr(value)
+ if leader is not None:
+ token[:0] = [leader]
+ name_addr.append(token)
+ return name_addr, value
+
+def get_mailbox(value):
+ """ mailbox = name-addr / addr-spec
+
+ """
+ # The only way to figure out if we are dealing with a name-addr or an
+ # addr-spec is to try parsing each one.
+ mailbox = Mailbox()
+ try:
+ token, value = get_name_addr(value)
+ except errors.HeaderParseError:
+ try:
+ token, value = get_addr_spec(value)
+ except errors.HeaderParseError:
+ raise errors.HeaderParseError(
+ "expected mailbox but found '{}'".format(value))
+ if any(isinstance(x, errors.InvalidHeaderDefect)
+ for x in token.all_defects):
+ mailbox.token_type = 'invalid-mailbox'
+ mailbox.append(token)
+ return mailbox, value
+
+def get_invalid_mailbox(value, endchars):
+ """ Read everything up to one of the chars in endchars.
+
+ This is outside the formal grammar. The InvalidMailbox TokenList that is
+ returned acts like a Mailbox, but the data attributes are None.
+
+ """
+ invalid_mailbox = InvalidMailbox()
+ while value and value[0] not in endchars:
+ if value[0] in PHRASE_ENDS:
+ invalid_mailbox.append(ValueTerminal(value[0],
+ 'misplaced-special'))
+ value = value[1:]
+ else:
+ token, value = get_phrase(value)
+ invalid_mailbox.append(token)
+ return invalid_mailbox, value
+
+def get_mailbox_list(value):
+ """ mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
+ obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS])
+
+ For this routine we go outside the formal grammar in order to improve error
+ handling. We recognize the end of the mailbox list only at the end of the
+ value or at a ';' (the group terminator). This is so that we can turn
+ invalid mailboxes into InvalidMailbox tokens and continue parsing any
+ remaining valid mailboxes. We also allow all mailbox entries to be null,
+ and this condition is handled appropriately at a higher level.
+
+ """
+ mailbox_list = MailboxList()
+ while value and value[0] != ';':
+ try:
+ token, value = get_mailbox(value)
+ mailbox_list.append(token)
+ except errors.HeaderParseError:
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value or value[0] in ',;':
+ mailbox_list.append(leader)
+ mailbox_list.defects.append(errors.ObsoleteHeaderDefect(
+ "empty element in mailbox-list"))
+ else:
+ token, value = get_invalid_mailbox(value, ',;')
+ if leader is not None:
+ token[:0] = [leader]
+ mailbox_list.append(token)
+ mailbox_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid mailbox in mailbox-list"))
+ elif value[0] == ',':
+ mailbox_list.defects.append(errors.ObsoleteHeaderDefect(
+ "empty element in mailbox-list"))
+ else:
+ token, value = get_invalid_mailbox(value, ',;')
+ if leader is not None:
+ token[:0] = [leader]
+ mailbox_list.append(token)
+ mailbox_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid mailbox in mailbox-list"))
+ if value and value[0] not in ',;':
+ # Crap after mailbox; treat it as an invalid mailbox.
+ # The mailbox info will still be available.
+ mailbox = mailbox_list[-1]
+ mailbox.token_type = 'invalid-mailbox'
+ token, value = get_invalid_mailbox(value, ',;')
+ mailbox.extend(token)
+ mailbox_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid mailbox in mailbox-list"))
+ if value and value[0] == ',':
+ mailbox_list.append(ListSeparator)
+ value = value[1:]
+ return mailbox_list, value
+
+
+def get_group_list(value):
+ """ group-list = mailbox-list / CFWS / obs-group-list
+ obs-group-list = 1*([CFWS] ",") [CFWS]
+
+ """
+ group_list = GroupList()
+ if not value:
+ group_list.defects.append(errors.InvalidHeaderDefect(
+ "end of header before group-list"))
+ return group_list, value
+ leader = None
+ if value and value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ # This should never happen in email parsing, since CFWS-only is a
+ # legal alternative to group-list in a group, which is the only
+ # place group-list appears.
+ group_list.defects.append(errors.InvalidHeaderDefect(
+ "end of header in group-list"))
+ group_list.append(leader)
+ return group_list, value
+ if value[0] == ';':
+ group_list.append(leader)
+ return group_list, value
+ token, value = get_mailbox_list(value)
+ if len(token.all_mailboxes)==0:
+ if leader is not None:
+ group_list.append(leader)
+ group_list.extend(token)
+ group_list.defects.append(errors.ObsoleteHeaderDefect(
+ "group-list with empty entries"))
+ return group_list, value
+ if leader is not None:
+ token[:0] = [leader]
+ group_list.append(token)
+ return group_list, value
+
+def get_group(value):
+ """ group = display-name ":" [group-list] ";" [CFWS]
+
+ """
+ group = Group()
+ token, value = get_display_name(value)
+ if not value or value[0] != ':':
+ raise errors.HeaderParseError("expected ':' at end of group "
+ "display name but found '{}'".format(value))
+ group.append(token)
+ group.append(ValueTerminal(':', 'group-display-name-terminator'))
+ value = value[1:]
+ if value and value[0] == ';':
+ group.append(ValueTerminal(';', 'group-terminator'))
+ return group, value[1:]
+ token, value = get_group_list(value)
+ group.append(token)
+ if not value:
+ group.defects.append(errors.InvalidHeaderDefect(
+ "end of header in group"))
+ if value[0] != ';':
+ raise errors.HeaderParseError(
+ "expected ';' at end of group but found {}".format(value))
+ group.append(ValueTerminal(';', 'group-terminator'))
+ value = value[1:]
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ group.append(token)
+ return group, value
+
+def get_address(value):
+ """ address = mailbox / group
+
+ Note that counter-intuitively, an address can be either a single address or
+ a list of addresses (a group). This is why the returned Address object has
+ a 'mailboxes' attribute which treats a single address as a list of length
+ one. When you need to differentiate between to two cases, extract the single
+ element, which is either a mailbox or a group token.
+
+ """
+ # The formal grammar isn't very helpful when parsing an address. mailbox
+ # and group, especially when allowing for obsolete forms, start off very
+ # similarly. It is only when you reach one of @, <, or : that you know
+ # what you've got. So, we try each one in turn, starting with the more
+ # likely of the two. We could perhaps make this more efficient by looking
+ # for a phrase and then branching based on the next character, but that
+ # would be a premature optimization.
+ address = Address()
+ try:
+ token, value = get_group(value)
+ except errors.HeaderParseError:
+ try:
+ token, value = get_mailbox(value)
+ except errors.HeaderParseError:
+ raise errors.HeaderParseError(
+ "expected address but found '{}'".format(value))
+ address.append(token)
+ return address, value
+
+def get_address_list(value):
+ """ address_list = (address *("," address)) / obs-addr-list
+ obs-addr-list = *([CFWS] ",") address *("," [address / CFWS])
+
+ We depart from the formal grammar here by continuing to parse until the end
+ of the input, assuming the input to be entirely composed of an
+ address-list. This is always true in email parsing, and allows us
+ to skip invalid addresses to parse additional valid ones.
+
+ """
+ address_list = AddressList()
+ while value:
+ try:
+ token, value = get_address(value)
+ address_list.append(token)
+ except errors.HeaderParseError as err:
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value or value[0] == ',':
+ address_list.append(leader)
+ address_list.defects.append(errors.ObsoleteHeaderDefect(
+ "address-list entry with no content"))
+ else:
+ token, value = get_invalid_mailbox(value, ',')
+ if leader is not None:
+ token[:0] = [leader]
+ address_list.append(Address([token]))
+ address_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid address in address-list"))
+ elif value[0] == ',':
+ address_list.defects.append(errors.ObsoleteHeaderDefect(
+ "empty element in address-list"))
+ else:
+ token, value = get_invalid_mailbox(value, ',')
+ if leader is not None:
+ token[:0] = [leader]
+ address_list.append(Address([token]))
+ address_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid address in address-list"))
+ if value and value[0] != ',':
+ # Crap after address; treat it as an invalid mailbox.
+ # The mailbox info will still be available.
+ mailbox = address_list[-1][0]
+ mailbox.token_type = 'invalid-mailbox'
+ token, value = get_invalid_mailbox(value, ',')
+ mailbox.extend(token)
+ address_list.defects.append(errors.InvalidHeaderDefect(
+ "invalid address in address-list"))
+ if value: # Must be a , at this point.
+ address_list.append(ValueTerminal(',', 'list-separator'))
+ value = value[1:]
+ return address_list, value
+
+#
+# XXX: As I begin to add additional header parsers, I'm realizing we probably
+# have two level of parser routines: the get_XXX methods that get a token in
+# the grammar, and parse_XXX methods that parse an entire field value. So
+# get_address_list above should really be a parse_ method, as probably should
+# be get_unstructured.
+#
+
+def parse_mime_version(value):
+ """ mime-version = [CFWS] 1*digit [CFWS] "." [CFWS] 1*digit [CFWS]
+
+ """
+ # The [CFWS] is implicit in the RFC 2045 BNF.
+ # XXX: This routine is a bit verbose, should factor out a get_int method.
+ mime_version = MIMEVersion()
+ if not value:
+ mime_version.defects.append(errors.HeaderMissingRequiredValue(
+ "Missing MIME version number (eg: 1.0)"))
+ return mime_version
+ if value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mime_version.append(token)
+ if not value:
+ mime_version.defects.append(errors.HeaderMissingRequiredValue(
+ "Expected MIME version number but found only CFWS"))
+ digits = ''
+ while value and value[0] != '.' and value[0] not in CFWS_LEADER:
+ digits += value[0]
+ value = value[1:]
+ if not digits.isdigit():
+ mime_version.defects.append(errors.InvalidHeaderDefect(
+ "Expected MIME major version number but found {!r}".format(digits)))
+ mime_version.append(ValueTerminal(digits, 'xtext'))
+ else:
+ mime_version.major = int(digits)
+ mime_version.append(ValueTerminal(digits, 'digits'))
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mime_version.append(token)
+ if not value or value[0] != '.':
+ if mime_version.major is not None:
+ mime_version.defects.append(errors.InvalidHeaderDefect(
+ "Incomplete MIME version; found only major number"))
+ if value:
+ mime_version.append(ValueTerminal(value, 'xtext'))
+ return mime_version
+ mime_version.append(ValueTerminal('.', 'version-separator'))
+ value = value[1:]
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mime_version.append(token)
+ if not value:
+ if mime_version.major is not None:
+ mime_version.defects.append(errors.InvalidHeaderDefect(
+ "Incomplete MIME version; found only major number"))
+ return mime_version
+ digits = ''
+ while value and value[0] not in CFWS_LEADER:
+ digits += value[0]
+ value = value[1:]
+ if not digits.isdigit():
+ mime_version.defects.append(errors.InvalidHeaderDefect(
+ "Expected MIME minor version number but found {!r}".format(digits)))
+ mime_version.append(ValueTerminal(digits, 'xtext'))
+ else:
+ mime_version.minor = int(digits)
+ mime_version.append(ValueTerminal(digits, 'digits'))
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mime_version.append(token)
+ if value:
+ mime_version.defects.append(errors.InvalidHeaderDefect(
+ "Excess non-CFWS text after MIME version"))
+ mime_version.append(ValueTerminal(value, 'xtext'))
+ return mime_version
+
+def get_invalid_parameter(value):
+ """ Read everything up to the next ';'.
+
+ This is outside the formal grammar. The InvalidParameter TokenList that is
+ returned acts like a Parameter, but the data attributes are None.
+
+ """
+ invalid_parameter = InvalidParameter()
+ while value and value[0] != ';':
+ if value[0] in PHRASE_ENDS:
+ invalid_parameter.append(ValueTerminal(value[0],
+ 'misplaced-special'))
+ value = value[1:]
+ else:
+ token, value = get_phrase(value)
+ invalid_parameter.append(token)
+ return invalid_parameter, value
+
+def get_ttext(value):
+ """ttext = <matches _ttext_matcher>
+
+ We allow any non-TOKEN_ENDS in ttext, but add defects to the token's
+ defects list if we find non-ttext characters. We also register defects for
+ *any* non-printables even though the RFC doesn't exclude all of them,
+ because we follow the spirit of RFC 5322.
+
+ """
+ m = _non_token_end_matcher(value)
+ if not m:
+ raise errors.HeaderParseError(
+ "expected ttext but found '{}'".format(value))
+ ttext = m.group()
+ value = value[len(ttext):]
+ ttext = ValueTerminal(ttext, 'ttext')
+ _validate_xtext(ttext)
+ return ttext, value
+
+def get_token(value):
+ """token = [CFWS] 1*ttext [CFWS]
+
+ The RFC equivalent of ttext is any US-ASCII chars except space, ctls, or
+ tspecials. We also exclude tabs even though the RFC doesn't.
+
+ The RFC implies the CFWS but is not explicit about it in the BNF.
+
+ """
+ mtoken = Token()
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mtoken.append(token)
+ if value and value[0] in TOKEN_ENDS:
+ raise errors.HeaderParseError(
+ "expected token but found '{}'".format(value))
+ token, value = get_ttext(value)
+ mtoken.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ mtoken.append(token)
+ return mtoken, value
+
+def get_attrtext(value):
+ """attrtext = 1*(any non-ATTRIBUTE_ENDS character)
+
+ We allow any non-ATTRIBUTE_ENDS in attrtext, but add defects to the
+ token's defects list if we find non-attrtext characters. We also register
+ defects for *any* non-printables even though the RFC doesn't exclude all of
+ them, because we follow the spirit of RFC 5322.
+
+ """
+ m = _non_attribute_end_matcher(value)
+ if not m:
+ raise errors.HeaderParseError(
+ "expected attrtext but found {!r}".format(value))
+ attrtext = m.group()
+ value = value[len(attrtext):]
+ attrtext = ValueTerminal(attrtext, 'attrtext')
+ _validate_xtext(attrtext)
+ return attrtext, value
+
+def get_attribute(value):
+ """ [CFWS] 1*attrtext [CFWS]
+
+ This version of the BNF makes the CFWS explicit, and as usual we use a
+ value terminal for the actual run of characters. The RFC equivalent of
+ attrtext is the token characters, with the subtraction of '*', "'", and '%'.
+ We include tab in the excluded set just as we do for token.
+
+ """
+ attribute = Attribute()
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ attribute.append(token)
+ if value and value[0] in ATTRIBUTE_ENDS:
+ raise errors.HeaderParseError(
+ "expected token but found '{}'".format(value))
+ token, value = get_attrtext(value)
+ attribute.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ attribute.append(token)
+ return attribute, value
+
+def get_extended_attrtext(value):
+ """attrtext = 1*(any non-ATTRIBUTE_ENDS character plus '%')
+
+ This is a special parsing routine so that we get a value that
+ includes % escapes as a single string (which we decode as a single
+ string later).
+
+ """
+ m = _non_extended_attribute_end_matcher(value)
+ if not m:
+ raise errors.HeaderParseError(
+ "expected extended attrtext but found {!r}".format(value))
+ attrtext = m.group()
+ value = value[len(attrtext):]
+ attrtext = ValueTerminal(attrtext, 'extended-attrtext')
+ _validate_xtext(attrtext)
+ return attrtext, value
+
+def get_extended_attribute(value):
+ """ [CFWS] 1*extended_attrtext [CFWS]
+
+ This is like the non-extended version except we allow % characters, so that
+ we can pick up an encoded value as a single string.
+
+ """
+ # XXX: should we have an ExtendedAttribute TokenList?
+ attribute = Attribute()
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ attribute.append(token)
+ if value and value[0] in EXTENDED_ATTRIBUTE_ENDS:
+ raise errors.HeaderParseError(
+ "expected token but found '{}'".format(value))
+ token, value = get_extended_attrtext(value)
+ attribute.append(token)
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ attribute.append(token)
+ return attribute, value
+
+def get_section(value):
+ """ '*' digits
+
+ The formal BNF is more complicated because leading 0s are not allowed. We
+ check for that and add a defect. We also assume no CFWS is allowed between
+ the '*' and the digits, though the RFC is not crystal clear on that.
+ The caller should already have dealt with leading CFWS.
+
+ """
+ section = Section()
+ if not value or value[0] != '*':
+ raise errors.HeaderParseError("Expected section but found {}".format(
+ value))
+ section.append(ValueTerminal('*', 'section-marker'))
+ value = value[1:]
+ if not value or not value[0].isdigit():
+ raise errors.HeaderParseError("Expected section number but "
+ "found {}".format(value))
+ digits = ''
+ while value and value[0].isdigit():
+ digits += value[0]
+ value = value[1:]
+ if digits[0] == '0' and digits != '0':
+ section.defects.append(errors.InvalidHeaderError("section number"
+ "has an invalid leading 0"))
+ section.number = int(digits)
+ section.append(ValueTerminal(digits, 'digits'))
+ return section, value
+
+
+def get_value(value):
+ """ quoted-string / attribute
+
+ """
+ v = Value()
+ if not value:
+ raise errors.HeaderParseError("Expected value but found end of string")
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ raise errors.HeaderParseError("Expected value but found "
+ "only {}".format(leader))
+ if value[0] == '"':
+ token, value = get_quoted_string(value)
+ else:
+ token, value = get_extended_attribute(value)
+ if leader is not None:
+ token[:0] = [leader]
+ v.append(token)
+ return v, value
+
+def get_parameter(value):
+ """ attribute [section] ["*"] [CFWS] "=" value
+
+ The CFWS is implied by the RFC but not made explicit in the BNF. This
+ simplified form of the BNF from the RFC is made to conform with the RFC BNF
+ through some extra checks. We do it this way because it makes both error
+ recovery and working with the resulting parse tree easier.
+ """
+ # It is possible CFWS would also be implicitly allowed between the section
+ # and the 'extended-attribute' marker (the '*') , but we've never seen that
+ # in the wild and we will therefore ignore the possibility.
+ param = Parameter()
+ token, value = get_attribute(value)
+ param.append(token)
+ if not value or value[0] == ';':
+ param.defects.append(errors.InvalidHeaderDefect("Parameter contains "
+ "name ({}) but no value".format(token)))
+ return param, value
+ if value[0] == '*':
+ try:
+ token, value = get_section(value)
+ param.sectioned = True
+ param.append(token)
+ except errors.HeaderParseError:
+ pass
+ if not value:
+ raise errors.HeaderParseError("Incomplete parameter")
+ if value[0] == '*':
+ param.append(ValueTerminal('*', 'extended-parameter-marker'))
+ value = value[1:]
+ param.extended = True
+ if value[0] != '=':
+ raise errors.HeaderParseError("Parameter not followed by '='")
+ param.append(ValueTerminal('=', 'parameter-separator'))
+ value = value[1:]
+ leader = None
+ if value and value[0] in CFWS_LEADER:
+ token, value = get_cfws(value)
+ param.append(token)
+ remainder = None
+ appendto = param
+ if param.extended and value and value[0] == '"':
+ # Now for some serious hackery to handle the common invalid case of
+ # double quotes around an extended value. We also accept (with defect)
+ # a value marked as encoded that isn't really.
+ qstring, remainder = get_quoted_string(value)
+ inner_value = qstring.stripped_value
+ semi_valid = False
+ if param.section_number == 0:
+ if inner_value and inner_value[0] == "'":
+ semi_valid = True
+ else:
+ token, rest = get_attrtext(inner_value)
+ if rest and rest[0] == "'":
+ semi_valid = True
+ else:
+ try:
+ token, rest = get_extended_attrtext(inner_value)
+ except:
+ pass
+ else:
+ if not rest:
+ semi_valid = True
+ if semi_valid:
+ param.defects.append(errors.InvalidHeaderDefect(
+ "Quoted string value for extended parameter is invalid"))
+ param.append(qstring)
+ for t in qstring:
+ if t.token_type == 'bare-quoted-string':
+ t[:] = []
+ appendto = t
+ break
+ value = inner_value
+ else:
+ remainder = None
+ param.defects.append(errors.InvalidHeaderDefect(
+ "Parameter marked as extended but appears to have a "
+ "quoted string value that is non-encoded"))
+ if value and value[0] == "'":
+ token = None
+ else:
+ token, value = get_value(value)
+ if not param.extended or param.section_number > 0:
+ if not value or value[0] != "'":
+ appendto.append(token)
+ if remainder is not None:
+ assert not value, value
+ value = remainder
+ return param, value
+ param.defects.append(errors.InvalidHeaderDefect(
+ "Apparent initial-extended-value but attribute "
+ "was not marked as extended or was not initial section"))
+ if not value:
+ # Assume the charset/lang is missing and the token is the value.
+ param.defects.append(errors.InvalidHeaderDefect(
+ "Missing required charset/lang delimiters"))
+ appendto.append(token)
+ if remainder is None:
+ return param, value
+ else:
+ if token is not None:
+ for t in token:
+ if t.token_type == 'extended-attrtext':
+ break
+ t.token_type == 'attrtext'
+ appendto.append(t)
+ param.charset = t.value
+ if value[0] != "'":
+ raise errors.HeaderParseError("Expected RFC2231 char/lang encoding "
+ "delimiter, but found {!r}".format(value))
+ appendto.append(ValueTerminal("'", 'RFC2231 delimiter'))
+ value = value[1:]
+ if value and value[0] != "'":
+ token, value = get_attrtext(value)
+ appendto.append(token)
+ param.lang = token.value
+ if not value or value[0] != "'":
+ raise errors.HeaderParseError("Expected RFC2231 char/lang encoding "
+ "delimiter, but found {}".format(value))
+ appendto.append(ValueTerminal("'", 'RFC2231 delimiter'))
+ value = value[1:]
+ if remainder is not None:
+ # Treat the rest of value as bare quoted string content.
+ v = Value()
+ while value:
+ if value[0] in WSP:
+ token, value = get_fws(value)
+ else:
+ token, value = get_qcontent(value)
+ v.append(token)
+ token = v
+ else:
+ token, value = get_value(value)
+ appendto.append(token)
+ if remainder is not None:
+ assert not value, value
+ value = remainder
+ return param, value
+
+def parse_mime_parameters(value):
+ """ parameter *( ";" parameter )
+
+ That BNF is meant to indicate this routine should only be called after
+ finding and handling the leading ';'. There is no corresponding rule in
+ the formal RFC grammar, but it is more convenient for us for the set of
+ parameters to be treated as its own TokenList.
+
+ This is 'parse' routine because it consumes the reminaing value, but it
+ would never be called to parse a full header. Instead it is called to
+ parse everything after the non-parameter value of a specific MIME header.
+
+ """
+ mime_parameters = MimeParameters()
+ while value:
+ try:
+ token, value = get_parameter(value)
+ mime_parameters.append(token)
+ except errors.HeaderParseError as err:
+ leader = None
+ if value[0] in CFWS_LEADER:
+ leader, value = get_cfws(value)
+ if not value:
+ mime_parameters.append(leader)
+ return mime_parameters
+ if value[0] == ';':
+ if leader is not None:
+ mime_parameters.append(leader)
+ mime_parameters.defects.append(errors.InvalidHeaderDefect(
+ "parameter entry with no content"))
+ else:
+ token, value = get_invalid_parameter(value)
+ if leader:
+ token[:0] = [leader]
+ mime_parameters.append(token)
+ mime_parameters.defects.append(errors.InvalidHeaderDefect(
+ "invalid parameter {!r}".format(token)))
+ if value and value[0] != ';':
+ # Junk after the otherwise valid parameter. Mark it as
+ # invalid, but it will have a value.
+ param = mime_parameters[-1]
+ param.token_type = 'invalid-parameter'
+ token, value = get_invalid_parameter(value)
+ param.extend(token)
+ mime_parameters.defects.append(errors.InvalidHeaderDefect(
+ "parameter with invalid trailing text {!r}".format(token)))
+ if value:
+ # Must be a ';' at this point.
+ mime_parameters.append(ValueTerminal(';', 'parameter-separator'))
+ value = value[1:]
+ return mime_parameters
+
+def _find_mime_parameters(tokenlist, value):
+ """Do our best to find the parameters in an invalid MIME header
+
+ """
+ while value and value[0] != ';':
+ if value[0] in PHRASE_ENDS:
+ tokenlist.append(ValueTerminal(value[0], 'misplaced-special'))
+ value = value[1:]
+ else:
+ token, value = get_phrase(value)
+ tokenlist.append(token)
+ if not value:
+ return
+ tokenlist.append(ValueTerminal(';', 'parameter-separator'))
+ tokenlist.append(parse_mime_parameters(value[1:]))
+
+def parse_content_type_header(value):
+ """ maintype "/" subtype *( ";" parameter )
+
+ The maintype and substype are tokens. Theoretically they could
+ be checked against the official IANA list + x-token, but we
+ don't do that.
+ """
+ ctype = ContentType()
+ recover = False
+ if not value:
+ ctype.defects.append(errors.HeaderMissingRequiredValue(
+ "Missing content type specification"))
+ return ctype
+ try:
+ token, value = get_token(value)
+ except errors.HeaderParseError:
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Expected content maintype but found {!r}".format(value)))
+ _find_mime_parameters(ctype, value)
+ return ctype
+ ctype.append(token)
+ # XXX: If we really want to follow the formal grammer we should make
+ # mantype and subtype specialized TokenLists here. Probably not worth it.
+ if not value or value[0] != '/':
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Invalid content type"))
+ if value:
+ _find_mime_parameters(ctype, value)
+ return ctype
+ ctype.maintype = token.value.strip().lower()
+ ctype.append(ValueTerminal('/', 'content-type-separator'))
+ value = value[1:]
+ try:
+ token, value = get_token(value)
+ except errors.HeaderParseError:
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Expected content subtype but found {!r}".format(value)))
+ _find_mime_parameters(ctype, value)
+ return ctype
+ ctype.append(token)
+ ctype.subtype = token.value.strip().lower()
+ if not value:
+ return ctype
+ if value[0] != ';':
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Only parameters are valid after content type, but "
+ "found {!r}".format(value)))
+ # The RFC requires that a syntactically invalid content-type be treated
+ # as text/plain. Perhaps we should postel this, but we should probably
+ # only do that if we were checking the subtype value against IANA.
+ del ctype.maintype, ctype.subtype
+ _find_mime_parameters(ctype, value)
+ return ctype
+ ctype.append(ValueTerminal(';', 'parameter-separator'))
+ ctype.append(parse_mime_parameters(value[1:]))
+ return ctype
+
+def parse_content_disposition_header(value):
+ """ disposition-type *( ";" parameter )
+
+ """
+ disp_header = ContentDisposition()
+ if not value:
+ disp_header.defects.append(errors.HeaderMissingRequiredValue(
+ "Missing content disposition"))
+ return disp_header
+ try:
+ token, value = get_token(value)
+ except errors.HeaderParseError:
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Expected content disposition but found {!r}".format(value)))
+ _find_mime_parameters(disp_header, value)
+ return disp_header
+ disp_header.append(token)
+ disp_header.content_disposition = token.value.strip().lower()
+ if not value:
+ return disp_header
+ if value[0] != ';':
+ disp_header.defects.append(errors.InvalidHeaderDefect(
+ "Only parameters are valid after content disposition, but "
+ "found {!r}".format(value)))
+ _find_mime_parameters(disp_header, value)
+ return disp_header
+ disp_header.append(ValueTerminal(';', 'parameter-separator'))
+ disp_header.append(parse_mime_parameters(value[1:]))
+ return disp_header
+
+def parse_content_transfer_encoding_header(value):
+ """ mechanism
+
+ """
+ # We should probably validate the values, since the list is fixed.
+ cte_header = ContentTransferEncoding()
+ if not value:
+ cte_header.defects.append(errors.HeaderMissingRequiredValue(
+ "Missing content transfer encoding"))
+ return cte_header
+ try:
+ token, value = get_token(value)
+ except errors.HeaderParseError:
+ ctype.defects.append(errors.InvalidHeaderDefect(
+ "Expected content trnasfer encoding but found {!r}".format(value)))
+ else:
+ cte_header.append(token)
+ cte_header.cte = token.value.strip().lower()
+ if not value:
+ return cte_header
+ while value:
+ cte_header.defects.append(errors.InvalidHeaderDefect(
+ "Extra text after content transfer encoding"))
+ if value[0] in PHRASE_ENDS:
+ cte_header.append(ValueTerminal(value[0], 'misplaced-special'))
+ value = value[1:]
+ else:
+ token, value = get_phrase(value)
+ cte_header.append(token)
+ return cte_header
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
index 79573c6..cdfa372 100644
--- a/Lib/email/_parseaddr.py
+++ b/Lib/email/_parseaddr.py
@@ -47,6 +47,25 @@ def parsedate_tz(data):
Accounts for military timezones.
"""
+ res = _parsedate_tz(data)
+ if not res:
+ return
+ if res[9] is None:
+ res[9] = 0
+ return tuple(res)
+
+def _parsedate_tz(data):
+ """Convert date to extended time tuple.
+
+ The last (additional) element is the time zone offset in seconds, except if
+ the timezone was specified as -0000. In that case the last element is
+ None. This indicates a UTC timestamp that explicitly declaims knowledge of
+ the source timezone, as opposed to a +0000 timestamp that indicates the
+ source timezone really was UTC.
+
+ """
+ if not data:
+ return
data = data.split()
# The FWS after the comma after the day-of-week is optional, so search and
# adjust for this.
@@ -99,6 +118,14 @@ def parsedate_tz(data):
tss = '0'
elif len(tm) == 3:
[thh, tmm, tss] = tm
+ elif len(tm) == 1 and '.' in tm[0]:
+ # Some non-compliant MUAs use '.' to separate time elements.
+ tm = tm[0].split('.')
+ if len(tm) == 2:
+ [thh, tmm] = tm
+ tss = 0
+ elif len(tm) == 3:
+ [thh, tmm, tss] = tm
else:
return None
try:
@@ -130,6 +157,8 @@ def parsedate_tz(data):
tzoffset = int(tz)
except ValueError:
pass
+ if tzoffset==0 and tz.startswith('-'):
+ tzoffset = None
# Convert a timezone offset into seconds ; -0500 -> -18000
if tzoffset:
if tzoffset < 0:
@@ -139,7 +168,7 @@ def parsedate_tz(data):
tzsign = 1
tzoffset = tzsign * ( (tzoffset//100)*3600 + (tzoffset % 100)*60)
# Daylight Saving Time flag is set to -1, since DST is unknown.
- return yy, mm, dd, thh, tmm, tss, 0, 1, -1, tzoffset
+ return [yy, mm, dd, thh, tmm, tss, 0, 1, -1, tzoffset]
def parsedate(data):
diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py
new file mode 100644
index 0000000..8106114
--- /dev/null
+++ b/Lib/email/_policybase.py
@@ -0,0 +1,358 @@
+"""Policy framework for the email package.
+
+Allows fine grained feature control of how the package parses and emits data.
+"""
+
+import abc
+from email import header
+from email import charset as _charset
+from email.utils import _has_surrogates
+
+__all__ = [
+ 'Policy',
+ 'Compat32',
+ 'compat32',
+ ]
+
+
+class _PolicyBase:
+
+ """Policy Object basic framework.
+
+ This class is useless unless subclassed. A subclass should define
+ class attributes with defaults for any values that are to be
+ managed by the Policy object. The constructor will then allow
+ non-default values to be set for these attributes at instance
+ creation time. The instance will be callable, taking these same
+ attributes keyword arguments, and returning a new instance
+ identical to the called instance except for those values changed
+ by the keyword arguments. Instances may be added, yielding new
+ instances with any non-default values from the right hand
+ operand overriding those in the left hand operand. That is,
+
+ A + B == A(<non-default values of B>)
+
+ The repr of an instance can be used to reconstruct the object
+ if and only if the repr of the values can be used to reconstruct
+ those values.
+
+ """
+
+ def __init__(self, **kw):
+ """Create new Policy, possibly overriding some defaults.
+
+ See class docstring for a list of overridable attributes.
+
+ """
+ for name, value in kw.items():
+ if hasattr(self, name):
+ super(_PolicyBase,self).__setattr__(name, value)
+ else:
+ raise TypeError(
+ "{!r} is an invalid keyword argument for {}".format(
+ name, self.__class__.__name__))
+
+ def __repr__(self):
+ args = [ "{}={!r}".format(name, value)
+ for name, value in self.__dict__.items() ]
+ return "{}({})".format(self.__class__.__name__, ', '.join(args))
+
+ def clone(self, **kw):
+ """Return a new instance with specified attributes changed.
+
+ The new instance has the same attribute values as the current object,
+ except for the changes passed in as keyword arguments.
+
+ """
+ newpolicy = self.__class__.__new__(self.__class__)
+ for attr, value in self.__dict__.items():
+ object.__setattr__(newpolicy, attr, value)
+ for attr, value in kw.items():
+ if not hasattr(self, attr):
+ raise TypeError(
+ "{!r} is an invalid keyword argument for {}".format(
+ attr, self.__class__.__name__))
+ object.__setattr__(newpolicy, attr, value)
+ return newpolicy
+
+ def __setattr__(self, name, value):
+ if hasattr(self, name):
+ msg = "{!r} object attribute {!r} is read-only"
+ else:
+ msg = "{!r} object has no attribute {!r}"
+ raise AttributeError(msg.format(self.__class__.__name__, name))
+
+ def __add__(self, other):
+ """Non-default values from right operand override those from left.
+
+ The object returned is a new instance of the subclass.
+
+ """
+ return self.clone(**other.__dict__)
+
+
+def _append_doc(doc, added_doc):
+ doc = doc.rsplit('\n', 1)[0]
+ added_doc = added_doc.split('\n', 1)[1]
+ return doc + '\n' + added_doc
+
+def _extend_docstrings(cls):
+ if cls.__doc__ and cls.__doc__.startswith('+'):
+ cls.__doc__ = _append_doc(cls.__bases__[0].__doc__, cls.__doc__)
+ for name, attr in cls.__dict__.items():
+ if attr.__doc__ and attr.__doc__.startswith('+'):
+ for c in (c for base in cls.__bases__ for c in base.mro()):
+ doc = getattr(getattr(c, name), '__doc__')
+ if doc:
+ attr.__doc__ = _append_doc(doc, attr.__doc__)
+ break
+ return cls
+
+
+class Policy(_PolicyBase, metaclass=abc.ABCMeta):
+
+ r"""Controls for how messages are interpreted and formatted.
+
+ Most of the classes and many of the methods in the email package accept
+ Policy objects as parameters. A Policy object contains a set of values and
+ functions that control how input is interpreted and how output is rendered.
+ For example, the parameter 'raise_on_defect' controls whether or not an RFC
+ violation results in an error being raised or not, while 'max_line_length'
+ controls the maximum length of output lines when a Message is serialized.
+
+ Any valid attribute may be overridden when a Policy is created by passing
+ it as a keyword argument to the constructor. Policy objects are immutable,
+ but a new Policy object can be created with only certain values changed by
+ calling the Policy instance with keyword arguments. Policy objects can
+ also be added, producing a new Policy object in which the non-default
+ attributes set in the right hand operand overwrite those specified in the
+ left operand.
+
+ Settable attributes:
+
+ raise_on_defect -- If true, then defects should be raised as errors.
+ Default: False.
+
+ linesep -- string containing the value to use as separation
+ between output lines. Default '\n'.
+
+ cte_type -- Type of allowed content transfer encodings
+
+ 7bit -- ASCII only
+ 8bit -- Content-Transfer-Encoding: 8bit is allowed
+
+ Default: 8bit. Also controls the disposition of
+ (RFC invalid) binary data in headers; see the
+ documentation of the binary_fold method.
+
+ max_line_length -- maximum length of lines, excluding 'linesep',
+ during serialization. None or 0 means no line
+ wrapping is done. Default is 78.
+
+ """
+
+ raise_on_defect = False
+ linesep = '\n'
+ cte_type = '8bit'
+ max_line_length = 78
+
+ def handle_defect(self, obj, defect):
+ """Based on policy, either raise defect or call register_defect.
+
+ handle_defect(obj, defect)
+
+ defect should be a Defect subclass, but in any case must be an
+ Exception subclass. obj is the object on which the defect should be
+ registered if it is not raised. If the raise_on_defect is True, the
+ defect is raised as an error, otherwise the object and the defect are
+ passed to register_defect.
+
+ This method is intended to be called by parsers that discover defects.
+ The email package parsers always call it with Defect instances.
+
+ """
+ if self.raise_on_defect:
+ raise defect
+ self.register_defect(obj, defect)
+
+ def register_defect(self, obj, defect):
+ """Record 'defect' on 'obj'.
+
+ Called by handle_defect if raise_on_defect is False. This method is
+ part of the Policy API so that Policy subclasses can implement custom
+ defect handling. The default implementation calls the append method of
+ the defects attribute of obj. The objects used by the email package by
+ default that get passed to this method will always have a defects
+ attribute with an append method.
+
+ """
+ obj.defects.append(defect)
+
+ def header_max_count(self, name):
+ """Return the maximum allowed number of headers named 'name'.
+
+ Called when a header is added to a Message object. If the returned
+ value is not 0 or None, and there are already a number of headers with
+ the name 'name' equal to the value returned, a ValueError is raised.
+
+ Because the default behavior of Message's __setitem__ is to append the
+ value to the list of headers, it is easy to create duplicate headers
+ without realizing it. This method allows certain headers to be limited
+ in the number of instances of that header that may be added to a
+ Message programmatically. (The limit is not observed by the parser,
+ which will faithfully produce as many headers as exist in the message
+ being parsed.)
+
+ The default implementation returns None for all header names.
+ """
+ return None
+
+ @abc.abstractmethod
+ def header_source_parse(self, sourcelines):
+ """Given a list of linesep terminated strings constituting the lines of
+ a single header, return the (name, value) tuple that should be stored
+ in the model. The input lines should retain their terminating linesep
+ characters. The lines passed in by the email package may contain
+ surrogateescaped binary data.
+ """
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def header_store_parse(self, name, value):
+ """Given the header name and the value provided by the application
+ program, return the (name, value) that should be stored in the model.
+ """
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def header_fetch_parse(self, name, value):
+ """Given the header name and the value from the model, return the value
+ to be returned to the application program that is requesting that
+ header. The value passed in by the email package may contain
+ surrogateescaped binary data if the lines were parsed by a BytesParser.
+ The returned value should not contain any surrogateescaped data.
+
+ """
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def fold(self, name, value):
+ """Given the header name and the value from the model, return a string
+ containing linesep characters that implement the folding of the header
+ according to the policy controls. The value passed in by the email
+ package may contain surrogateescaped binary data if the lines were
+ parsed by a BytesParser. The returned value should not contain any
+ surrogateescaped data.
+
+ """
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def fold_binary(self, name, value):
+ """Given the header name and the value from the model, return binary
+ data containing linesep characters that implement the folding of the
+ header according to the policy controls. The value passed in by the
+ email package may contain surrogateescaped binary data.
+
+ """
+ raise NotImplementedError
+
+
+@_extend_docstrings
+class Compat32(Policy):
+
+ """+
+ This particular policy is the backward compatibility Policy. It
+ replicates the behavior of the email package version 5.1.
+ """
+
+ def _sanitize_header(self, name, value):
+ # If the header value contains surrogates, return a Header using
+ # the unknown-8bit charset to encode the bytes as encoded words.
+ if not isinstance(value, str):
+ # Assume it is already a header object
+ return value
+ if _has_surrogates(value):
+ return header.Header(value, charset=_charset.UNKNOWN8BIT,
+ header_name=name)
+ else:
+ return value
+
+ def header_source_parse(self, sourcelines):
+ """+
+ The name is parsed as everything up to the ':' and returned unmodified.
+ The value is determined by stripping leading whitespace off the
+ remainder of the first line, joining all subsequent lines together, and
+ stripping any trailing carriage return or linefeed characters.
+
+ """
+ name, value = sourcelines[0].split(':', 1)
+ value = value.lstrip(' \t') + ''.join(sourcelines[1:])
+ return (name, value.rstrip('\r\n'))
+
+ def header_store_parse(self, name, value):
+ """+
+ The name and value are returned unmodified.
+ """
+ return (name, value)
+
+ def header_fetch_parse(self, name, value):
+ """+
+ If the value contains binary data, it is converted into a Header object
+ using the unknown-8bit charset. Otherwise it is returned unmodified.
+ """
+ return self._sanitize_header(name, value)
+
+ def fold(self, name, value):
+ """+
+ Headers are folded using the Header folding algorithm, which preserves
+ existing line breaks in the value, and wraps each resulting line to the
+ max_line_length. Non-ASCII binary data are CTE encoded using the
+ unknown-8bit charset.
+
+ """
+ return self._fold(name, value, sanitize=True)
+
+ def fold_binary(self, name, value):
+ """+
+ Headers are folded using the Header folding algorithm, which preserves
+ existing line breaks in the value, and wraps each resulting line to the
+ max_line_length. If cte_type is 7bit, non-ascii binary data is CTE
+ encoded using the unknown-8bit charset. Otherwise the original source
+ header is used, with its existing line breaks and/or binary data.
+
+ """
+ folded = self._fold(name, value, sanitize=self.cte_type=='7bit')
+ return folded.encode('ascii', 'surrogateescape')
+
+ def _fold(self, name, value, sanitize):
+ parts = []
+ parts.append('%s: ' % name)
+ if isinstance(value, str):
+ if _has_surrogates(value):
+ if sanitize:
+ h = header.Header(value,
+ charset=_charset.UNKNOWN8BIT,
+ header_name=name)
+ else:
+ # If we have raw 8bit data in a byte string, we have no idea
+ # what the encoding is. There is no safe way to split this
+ # string. If it's ascii-subset, then we could do a normal
+ # ascii split, but if it's multibyte then we could break the
+ # string. There's no way to know so the least harm seems to
+ # be to not split the string and risk it being too long.
+ parts.append(value)
+ h = None
+ else:
+ h = header.Header(value, header_name=name)
+ else:
+ # Assume it is a Header-like object.
+ h = value
+ if h is not None:
+ parts.append(h.encode(linesep=self.linesep,
+ maxlinelen=self.max_line_length))
+ parts.append(self.linesep)
+ return ''.join(parts)
+
+
+compat32 = Compat32()
diff --git a/Lib/email/architecture.rst b/Lib/email/architecture.rst
new file mode 100644
index 0000000..80d24fe
--- /dev/null
+++ b/Lib/email/architecture.rst
@@ -0,0 +1,216 @@
+:mod:`email` Package Architecture
+=================================
+
+Overview
+--------
+
+The email package consists of three major components:
+
+ Model
+ An object structure that represents an email message, and provides an
+ API for creating, querying, and modifying a message.
+
+ Parser
+ Takes a sequence of characters or bytes and produces a model of the
+ email message represented by those characters or bytes.
+
+ Generator
+ Takes a model and turns it into a sequence of characters or bytes. The
+ sequence can either be intended for human consumption (a printable
+ unicode string) or bytes suitable for transmission over the wire. In
+ the latter case all data is properly encoded using the content transfer
+ encodings specified by the relevant RFCs.
+
+Conceptually the package is organized around the model. The model provides both
+"external" APIs intended for use by application programs using the library,
+and "internal" APIs intended for use by the Parser and Generator components.
+This division is intentionally a bit fuzy; the API described by this documentation
+is all a public, stable API. This allows for an application with special needs
+to implement its own parser and/or generator.
+
+In addition to the three major functional components, there is a third key
+component to the architecture:
+
+ Policy
+ An object that specifies various behavioral settings and carries
+ implementations of various behavior-controlling methods.
+
+The Policy framework provides a simple and convenient way to control the
+behavior of the library, making it possible for the library to be used in a
+very flexible fashion while leveraging the common code required to parse,
+represent, and generate message-like objects. For example, in addition to the
+default :rfc:`5322` email message policy, we also have a policy that manages
+HTTP headers in a fashion compliant with :rfc:`2616`. Individual policy
+controls, such as the maximum line length produced by the generator, can also
+be controlled individually to meet specialized application requirements.
+
+
+The Model
+---------
+
+The message model is implemented by the :class:`~email.message.Message` class.
+The model divides a message into the two fundamental parts discussed by the
+RFC: the header section and the body. The `Message` object acts as a
+pseudo-dictionary of named headers. Its dictionary interface provides
+convenient access to individual headers by name. However, all headers are kept
+internally in an ordered list, so that the information about the order of the
+headers in the original message is preserved.
+
+The `Message` object also has a `payload` that holds the body. A `payload` can
+be one of two things: data, or a list of `Message` objects. The latter is used
+to represent a multipart MIME message. Lists can be nested arbitrarily deeply
+in order to represent the message, with all terminal leaves having non-list
+data payloads.
+
+
+Message Lifecycle
+-----------------
+
+The general lifecyle of a message is:
+
+ Creation
+ A `Message` object can be created by a Parser, or it can be
+ instantiated as an empty message by an application.
+
+ Manipulation
+ The application may examine one or more headers, and/or the
+ payload, and it may modify one or more headers and/or
+ the payload. This may be done on the top level `Message`
+ object, or on any sub-object.
+
+ Finalization
+ The Model is converted into a unicode or binary stream,
+ or the model is discarded.
+
+
+
+Header Policy Control During Lifecycle
+--------------------------------------
+
+One of the major controls exerted by the Policy is the management of headers
+during the `Message` lifecycle. Most applications don't need to be aware of
+this.
+
+A header enters the model in one of two ways: via a Parser, or by being set to
+a specific value by an application program after the Model already exists.
+Similarly, a header exits the model in one of two ways: by being serialized by
+a Generator, or by being retrieved from a Model by an application program. The
+Policy object provides hooks for all four of these pathways.
+
+The model storage for headers is a list of (name, value) tuples.
+
+The Parser identifies headers during parsing, and passes them to the
+:meth:`~email.policy.Policy.header_source_parse` method of the Policy. The
+result of that method is the (name, value) tuple to be stored in the model.
+
+When an application program supplies a header value (for example, through the
+`Message` object `__setitem__` interface), the name and the value are passed to
+the :meth:`~email.policy.Policy.header_store_parse` method of the Policy, which
+returns the (name, value) tuple to be stored in the model.
+
+When an application program retrieves a header (through any of the dict or list
+interfaces of `Message`), the name and value are passed to the
+:meth:`~email.policy.Policy.header_fetch_parse` method of the Policy to
+obtain the value returned to the application.
+
+When a Generator requests a header during serialization, the name and value are
+passed to the :meth:`~email.policy.Policy.fold` method of the Policy, which
+returns a string containing line breaks in the appropriate places. The
+:meth:`~email.policy.Policy.cte_type` Policy control determines whether or
+not Content Transfer Encoding is performed on the data in the header. There is
+also a :meth:`~email.policy.Policy.binary_fold` method for use by generators
+that produce binary output, which returns the folded header as binary data,
+possibly folded at different places than the corresponding string would be.
+
+
+Handling Binary Data
+--------------------
+
+In an ideal world all message data would conform to the RFCs, meaning that the
+parser could decode the message into the idealized unicode message that the
+sender originally wrote. In the real world, the email package must also be
+able to deal with badly formatted messages, including messages containing
+non-ASCII characters that either have no indicated character set or are not
+valid characters in the indicated character set.
+
+Since email messages are *primarily* text data, and operations on message data
+are primarily text operations (except for binary payloads of course), the model
+stores all text data as unicode strings. Un-decodable binary inside text
+data is handled by using the `surrogateescape` error handler of the ASCII
+codec. As with the binary filenames the error handler was introduced to
+handle, this allows the email package to "carry" the binary data received
+during parsing along until the output stage, at which time it is regenerated
+in its original form.
+
+This carried binary data is almost entirely an implementation detail. The one
+place where it is visible in the API is in the "internal" API. A Parser must
+do the `surrogateescape` encoding of binary input data, and pass that data to
+the appropriate Policy method. The "internal" interface used by the Generator
+to access header values preserves the `surrogateescaped` bytes. All other
+interfaces convert the binary data either back into bytes or into a safe form
+(losing information in some cases).
+
+
+Backward Compatibility
+----------------------
+
+The :class:`~email.policy.Policy.Compat32` Policy provides backward
+compatibility with version 5.1 of the email package. It does this via the
+following implementation of the four+1 Policy methods described above:
+
+header_source_parse
+ Splits the first line on the colon to obtain the name, discards any spaces
+ after the colon, and joins the remainder of the line with all of the
+ remaining lines, preserving the linesep characters to obtain the value.
+ Trailing carriage return and/or linefeed characters are stripped from the
+ resulting value string.
+
+header_store_parse
+ Returns the name and value exactly as received from the application.
+
+header_fetch_parse
+ If the value contains any `surrogateescaped` binary data, return the value
+ as a :class:`~email.header.Header` object, using the character set
+ `unknown-8bit`. Otherwise just returns the value.
+
+fold
+ Uses :class:`~email.header.Header`'s folding to fold headers in the
+ same way the email5.1 generator did.
+
+binary_fold
+ Same as fold, but encodes to 'ascii'.
+
+
+New Algorithm
+-------------
+
+header_source_parse
+ Same as legacy behavior.
+
+header_store_parse
+ Same as legacy behavior.
+
+header_fetch_parse
+ If the value is already a header object, returns it. Otherwise, parses the
+ value using the new parser, and returns the resulting object as the value.
+ `surrogateescaped` bytes get turned into unicode unknown character code
+ points.
+
+fold
+ Uses the new header folding algorithm, respecting the policy settings.
+ surrogateescaped bytes are encoded using the ``unknown-8bit`` charset for
+ ``cte_type=7bit`` or ``8bit``. Returns a string.
+
+ At some point there will also be a ``cte_type=unicode``, and for that
+ policy fold will serialize the idealized unicode message with RFC-like
+ folding, converting any surrogateescaped bytes into the unicode
+ unknown character glyph.
+
+binary_fold
+ Uses the new header folding algorithm, respecting the policy settings.
+ surrogateescaped bytes are encoded using the `unknown-8bit` charset for
+ ``cte_type=7bit``, and get turned back into bytes for ``cte_type=8bit``.
+ Returns bytes.
+
+ At some point there will also be a ``cte_type=unicode``, and for that
+ policy binary_fold will serialize the message according to :rfc:``5335``.
diff --git a/Lib/email/errors.py b/Lib/email/errors.py
index d52a624..791239f 100644
--- a/Lib/email/errors.py
+++ b/Lib/email/errors.py
@@ -5,7 +5,6 @@
"""email package exception classes."""
-
class MessageError(Exception):
"""Base class for errors in the email package."""
@@ -30,12 +29,13 @@ class CharsetError(MessageError):
"""An illegal charset was given."""
-
# These are parsing defects which the parser was able to work around.
-class MessageDefect:
+class MessageDefect(ValueError):
"""Base class for a message defect."""
def __init__(self, line=None):
+ if line is not None:
+ super().__init__(line)
self.line = line
class NoBoundaryInMultipartDefect(MessageDefect):
@@ -44,14 +44,64 @@ class NoBoundaryInMultipartDefect(MessageDefect):
class StartBoundaryNotFoundDefect(MessageDefect):
"""The claimed start boundary was never found."""
+class CloseBoundaryNotFoundDefect(MessageDefect):
+ """A start boundary was found, but not the corresponding close boundary."""
+
class FirstHeaderLineIsContinuationDefect(MessageDefect):
"""A message had a continuation line as its first header line."""
class MisplacedEnvelopeHeaderDefect(MessageDefect):
"""A 'Unix-from' header was found in the middle of a header block."""
-class MalformedHeaderDefect(MessageDefect):
- """Found a header that was missing a colon, or was otherwise malformed."""
+class MissingHeaderBodySeparatorDefect(MessageDefect):
+ """Found line with no leading whitespace and no colon before blank line."""
+# XXX: backward compatibility, just in case (it was never emitted).
+MalformedHeaderDefect = MissingHeaderBodySeparatorDefect
class MultipartInvariantViolationDefect(MessageDefect):
"""A message claimed to be a multipart but no subparts were found."""
+
+class InvalidMultipartContentTransferEncodingDefect(MessageDefect):
+ """An invalid content transfer encoding was set on the multipart itself."""
+
+class UndecodableBytesDefect(MessageDefect):
+ """Header contained bytes that could not be decoded"""
+
+class InvalidBase64PaddingDefect(MessageDefect):
+ """base64 encoded sequence had an incorrect length"""
+
+class InvalidBase64CharactersDefect(MessageDefect):
+ """base64 encoded sequence had characters not in base64 alphabet"""
+
+# These errors are specific to header parsing.
+
+class HeaderDefect(MessageDefect):
+ """Base class for a header defect."""
+
+ def __init__(self, *args, **kw):
+ super().__init__(*args, **kw)
+
+class InvalidHeaderDefect(HeaderDefect):
+ """Header is not valid, message gives details."""
+
+class HeaderMissingRequiredValue(HeaderDefect):
+ """A header that must have a value had none"""
+
+class NonPrintableDefect(HeaderDefect):
+ """ASCII characters outside the ascii-printable range found"""
+
+ def __init__(self, non_printables):
+ super().__init__(non_printables)
+ self.non_printables = non_printables
+
+ def __str__(self):
+ return ("the following ASCII non-printables found in header: "
+ "{}".format(self.non_printables))
+
+class ObsoleteHeaderDefect(HeaderDefect):
+ """Header uses syntax declared obsolete by RFC 5322"""
+
+class NonASCIILocalPartDefect(HeaderDefect):
+ """local_part contains non-ASCII characters"""
+ # This defect only occurs during unicode parsing, not when
+ # parsing messages decoded from binary.
diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py
index aa8a2ff..56f50df 100644
--- a/Lib/email/feedparser.py
+++ b/Lib/email/feedparser.py
@@ -25,6 +25,7 @@ import re
from email import errors
from email import message
+from email._policybase import compat32
NLCRE = re.compile('\r\n|\r|\n')
NLCRE_bol = re.compile('(\r\n|\r|\n)')
@@ -120,9 +121,6 @@ class BufferedSubFile(object):
# Reverse and insert at the front of the lines.
self._lines[:0] = lines[::-1]
- def is_closed(self):
- return self._closed
-
def __iter__(self):
return self
@@ -137,9 +135,22 @@ class BufferedSubFile(object):
class FeedParser:
"""A feed-style parser of email."""
- def __init__(self, _factory=message.Message):
- """_factory is called with no arguments to create a new message obj"""
+ def __init__(self, _factory=message.Message, *, policy=compat32):
+ """_factory is called with no arguments to create a new message obj
+
+ The policy keyword specifies a policy object that controls a number of
+ aspects of the parser's operation. The default policy maintains
+ backward compatibility.
+
+ """
self._factory = _factory
+ self.policy = policy
+ try:
+ _factory(policy=self.policy)
+ self._factory_kwds = lambda: {'policy': self.policy}
+ except TypeError:
+ # Assume this is an old-style factory
+ self._factory_kwds = lambda: {}
self._input = BufferedSubFile()
self._msgstack = []
self._parse = self._parsegen().__next__
@@ -171,11 +182,12 @@ class FeedParser:
# Look for final set of defects
if root.get_content_maintype() == 'multipart' \
and not root.is_multipart():
- root.defects.append(errors.MultipartInvariantViolationDefect())
+ defect = errors.MultipartInvariantViolationDefect()
+ self.policy.handle_defect(root, defect)
return root
def _new_message(self):
- msg = self._factory()
+ msg = self._factory(**self._factory_kwds())
if self._cur and self._cur.get_content_type() == 'multipart/digest':
msg.set_default_type('message/rfc822')
if self._msgstack:
@@ -207,6 +219,8 @@ class FeedParser:
# (i.e. newline), just throw it away. Otherwise the line is
# part of the body so push it back.
if not NLCRE.match(line):
+ defect = errors.MissingHeaderBodySeparatorDefect()
+ self.policy.handle_defect(self._cur, defect)
self._input.unreadline(line)
break
headers.append(line)
@@ -284,7 +298,8 @@ class FeedParser:
# defined a boundary. That's a problem which we'll handle by
# reading everything until the EOF and marking the message as
# defective.
- self._cur.defects.append(errors.NoBoundaryInMultipartDefect())
+ defect = errors.NoBoundaryInMultipartDefect()
+ self.policy.handle_defect(self._cur, defect)
lines = []
for line in self._input:
if line is NeedMoreData:
@@ -293,6 +308,11 @@ class FeedParser:
lines.append(line)
self._cur.set_payload(EMPTYSTRING.join(lines))
return
+ # Make sure a valid content type was specified per RFC 2045:6.4.
+ if (self._cur.get('content-transfer-encoding', '8bit').lower()
+ not in ('7bit', '8bit', 'binary')):
+ defect = errors.InvalidMultipartContentTransferEncodingDefect()
+ self.policy.handle_defect(self._cur, defect)
# Create a line match predicate which matches the inter-part
# boundary as well as the end-of-multipart boundary. Don't push
# this onto the input stream until we've scanned past the
@@ -304,6 +324,7 @@ class FeedParser:
capturing_preamble = True
preamble = []
linesep = False
+ close_boundary_seen = False
while True:
line = self._input.readline()
if line is NeedMoreData:
@@ -318,6 +339,7 @@ class FeedParser:
# the closing boundary, then we need to initialize the
# epilogue with the empty string (see below).
if mo.group('end'):
+ close_boundary_seen = True
linesep = mo.group('linesep')
break
# We saw an inter-part boundary. Were we in the preamble?
@@ -386,9 +408,9 @@ class FeedParser:
# We've seen either the EOF or the end boundary. If we're still
# capturing the preamble, we never saw the start boundary. Note
# that as a defect and store the captured text as the payload.
- # Everything from here to the EOF is epilogue.
if capturing_preamble:
- self._cur.defects.append(errors.StartBoundaryNotFoundDefect())
+ defect = errors.StartBoundaryNotFoundDefect()
+ self.policy.handle_defect(self._cur, defect)
self._cur.set_payload(EMPTYSTRING.join(preamble))
epilogue = []
for line in self._input:
@@ -397,8 +419,15 @@ class FeedParser:
continue
self._cur.epilogue = EMPTYSTRING.join(epilogue)
return
- # If the end boundary ended in a newline, we'll need to make sure
- # the epilogue isn't None
+ # If we're not processing the preamble, then we might have seen
+ # EOF without seeing that end boundary...that is also a defect.
+ if not close_boundary_seen:
+ defect = errors.CloseBoundaryNotFoundDefect()
+ self.policy.handle_defect(self._cur, defect)
+ return
+ # Everything from here to the EOF is epilogue. If the end boundary
+ # ended in a newline, we'll need to make sure the epilogue isn't
+ # None
if linesep:
epilogue = ['']
else:
@@ -440,14 +469,12 @@ class FeedParser:
# is illegal, so let's note the defect, store the illegal
# line, and ignore it for purposes of headers.
defect = errors.FirstHeaderLineIsContinuationDefect(line)
- self._cur.defects.append(defect)
+ self.policy.handle_defect(self._cur, defect)
continue
lastvalue.append(line)
continue
if lastheader:
- # XXX reconsider the joining of folded lines
- lhdr = EMPTYSTRING.join(lastvalue)[:-1].rstrip('\r\n')
- self._cur[lastheader] = lhdr
+ self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
lastheader, lastvalue = '', []
# Check for envelope header, i.e. unix-from
if line.startswith('From '):
@@ -471,19 +498,17 @@ class FeedParser:
self._cur.defects.append(defect)
continue
# Split the line on the colon separating field name from value.
+ # There will always be a colon, because if there wasn't the part of
+ # the parser that calls us would have started parsing the body.
i = line.find(':')
- if i < 0:
- defect = errors.MalformedHeaderDefect(line)
- self._cur.defects.append(defect)
- continue
+ assert i>0, "_parse_headers fed line with no : and no leading WS"
lastheader = line[:i]
- lastvalue = [line[i+1:].lstrip()]
+ lastvalue = [line]
# Done with all the lines, so handle the last header.
if lastheader:
- # XXX reconsider the joining of folded lines
- self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip('\r\n')
+ self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
+
-
class BytesFeedParser(FeedParser):
"""Like FeedParser, but feed accepts bytes."""
diff --git a/Lib/email/generator.py b/Lib/email/generator.py
index c6bfb70..899adbc 100644
--- a/Lib/email/generator.py
+++ b/Lib/email/generator.py
@@ -13,8 +13,10 @@ import random
import warnings
from io import StringIO, BytesIO
+from email._policybase import compat32
from email.header import Header
-from email.message import _has_surrogates
+from email.utils import _has_surrogates
+import email.charset as _charset
UNDERSCORE = '_'
NL = '\n' # XXX: no longer used by the code below.
@@ -33,7 +35,8 @@ class Generator:
# Public interface
#
- def __init__(self, outfp, mangle_from_=True, maxheaderlen=78):
+ def __init__(self, outfp, mangle_from_=True, maxheaderlen=None, *,
+ policy=None):
"""Create the generator for message flattening.
outfp is the output file-like object for writing the message to. It
@@ -49,16 +52,22 @@ class Generator:
defined in the Header class. Set maxheaderlen to zero to disable
header wrapping. The default is 78, as recommended (but not required)
by RFC 2822.
+
+ The policy keyword specifies a policy object that controls a number of
+ aspects of the generator's operation. The default policy maintains
+ backward compatibility.
+
"""
self._fp = outfp
self._mangle_from_ = mangle_from_
- self._maxheaderlen = maxheaderlen
+ self.maxheaderlen = maxheaderlen
+ self.policy = policy
def write(self, s):
# Just delegate to the file object
self._fp.write(s)
- def flatten(self, msg, unixfrom=False, linesep='\n'):
+ def flatten(self, msg, unixfrom=False, linesep=None):
r"""Print the message object tree rooted at msg to the output file
specified when the Generator instance was created.
@@ -70,29 +79,47 @@ class Generator:
Note that for subobjects, no From_ line is printed.
linesep specifies the characters used to indicate a new line in
- the output. The default value is the most useful for typical
- Python applications, but it can be set to \r\n to produce RFC-compliant
- line separators when needed.
+ the output. The default value is determined by the policy.
"""
# We use the _XXX constants for operating on data that comes directly
# from the msg, and _encoded_XXX constants for operating on data that
# has already been converted (to bytes in the BytesGenerator) and
# inserted into a temporary buffer.
- self._NL = linesep
- self._encoded_NL = self._encode(linesep)
+ policy = msg.policy if self.policy is None else self.policy
+ if linesep is not None:
+ policy = policy.clone(linesep=linesep)
+ if self.maxheaderlen is not None:
+ policy = policy.clone(max_line_length=self.maxheaderlen)
+ self._NL = policy.linesep
+ self._encoded_NL = self._encode(self._NL)
self._EMPTY = ''
self._encoded_EMTPY = self._encode('')
- if unixfrom:
- ufrom = msg.get_unixfrom()
- if not ufrom:
- ufrom = 'From nobody ' + time.ctime(time.time())
- self.write(ufrom + self._NL)
- self._write(msg)
+ # Because we use clone (below) when we recursively process message
+ # subparts, and because clone uses the computed policy (not None),
+ # submessages will automatically get set to the computed policy when
+ # they are processed by this code.
+ old_gen_policy = self.policy
+ old_msg_policy = msg.policy
+ try:
+ self.policy = policy
+ msg.policy = policy
+ if unixfrom:
+ ufrom = msg.get_unixfrom()
+ if not ufrom:
+ ufrom = 'From nobody ' + time.ctime(time.time())
+ self.write(ufrom + self._NL)
+ self._write(msg)
+ finally:
+ self.policy = old_gen_policy
+ msg.policy = old_msg_policy
def clone(self, fp):
"""Clone this generator with the exact same options."""
- return self.__class__(fp, self._mangle_from_, self._maxheaderlen)
+ return self.__class__(fp,
+ self._mangle_from_,
+ None, # Use policy setting, which we've adjusted
+ policy=self.policy)
#
# Protected interface - undocumented ;/
@@ -167,16 +194,8 @@ class Generator:
#
def _write_headers(self, msg):
- for h, v in msg.items():
- self.write('%s: ' % h)
- if isinstance(v, Header):
- self.write(v.encode(
- maxlinelen=self._maxheaderlen, linesep=self._NL)+self._NL)
- else:
- # Header's got lots of smarts, so use it.
- header = Header(v, maxlinelen=self._maxheaderlen,
- header_name=h)
- self.write(header.encode(linesep=self._NL)+self._NL)
+ for h, v in msg.raw_items():
+ self.write(self.policy.fold(h, v))
# A blank line always separates headers from body
self.write(self._NL)
@@ -265,12 +284,12 @@ class Generator:
# The contents of signed parts has to stay unmodified in order to keep
# the signature intact per RFC1847 2.1, so we disable header wrapping.
# RDM: This isn't enough to completely preserve the part, but it helps.
- old_maxheaderlen = self._maxheaderlen
+ p = self.policy
+ self.policy = p.clone(max_line_length=0)
try:
- self._maxheaderlen = 0
self._handle_multipart(msg)
finally:
- self._maxheaderlen = old_maxheaderlen
+ self.policy = p
def _handle_message_delivery_status(self, msg):
# We can't just write the headers directly to self's file object
@@ -305,10 +324,12 @@ class Generator:
# message/rfc822. Such messages are generated by, for example,
# Groupwise when forwarding unadorned messages. (Issue 7970.) So
# in that case we just emit the string body.
- payload = msg.get_payload()
+ payload = msg._payload
if isinstance(payload, list):
g.flatten(msg.get_payload(0), unixfrom=False, linesep=self._NL)
payload = s.getvalue()
+ else:
+ payload = self._encode(payload)
self._fp.write(payload)
# This used to be a module level function; we use a classmethod for this
@@ -344,7 +365,10 @@ class BytesGenerator(Generator):
Functionally identical to the base Generator except that the output is
bytes and not string. When surrogates were used in the input to encode
- bytes, these are decoded back to bytes for output.
+ bytes, these are decoded back to bytes for output. If the policy has
+ cte_type set to 7bit, then the message is transformed such that the
+ non-ASCII bytes are properly content transfer encoded, using the charset
+ unknown-8bit.
The outfp object must accept bytes in its write method.
"""
@@ -365,23 +389,8 @@ class BytesGenerator(Generator):
def _write_headers(self, msg):
# This is almost the same as the string version, except for handling
# strings with 8bit bytes.
- for h, v in msg._headers:
- self.write('%s: ' % h)
- if isinstance(v, Header):
- self.write(v.encode(maxlinelen=self._maxheaderlen)+self._NL)
- elif _has_surrogates(v):
- # If we have raw 8bit data in a byte string, we have no idea
- # what the encoding is. There is no safe way to split this
- # string. If it's ascii-subset, then we could do a normal
- # ascii split, but if it's multibyte then we could break the
- # string. There's no way to know so the least harm seems to
- # be to not split the string and risk it being too long.
- self.write(v+NL)
- else:
- # Header's got lots of smarts and this string is safe...
- header = Header(v, maxlinelen=self._maxheaderlen,
- header_name=h)
- self.write(header.encode(linesep=self._NL)+self._NL)
+ for h, v in msg.raw_items():
+ self._fp.write(self.policy.fold_binary(h, v))
# A blank line always separates headers from body
self.write(self._NL)
@@ -390,7 +399,7 @@ class BytesGenerator(Generator):
# just write it back out.
if msg._payload is None:
return
- if _has_surrogates(msg._payload):
+ if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit':
if self._mangle_from_:
msg._payload = fcre.sub(">From ", msg._payload)
self.write(msg._payload)
diff --git a/Lib/email/header.py b/Lib/email/header.py
index 3250d36..a89219d 100644
--- a/Lib/email/header.py
+++ b/Lib/email/header.py
@@ -40,7 +40,6 @@ ecre = re.compile(r'''
\? # literal ?
(?P<encoded>.*?) # non-greedy up to the next ?= is the encoded string
\?= # literal ?=
- (?=[ \t]|$) # whitespace or the end of the string
''', re.VERBOSE | re.IGNORECASE | re.MULTILINE)
# Field name regexp, including trailing colon, but not separating whitespace,
@@ -86,8 +85,12 @@ def decode_header(header):
words = []
for line in header.splitlines():
parts = ecre.split(line)
+ first = True
while parts:
- unencoded = parts.pop(0).strip()
+ unencoded = parts.pop(0)
+ if first:
+ unencoded = unencoded.lstrip()
+ first = False
if unencoded:
words.append((unencoded, None, None))
if parts:
@@ -95,6 +98,16 @@ def decode_header(header):
encoding = parts.pop(0).lower()
encoded = parts.pop(0)
words.append((encoded, encoding, charset))
+ # Now loop over words and remove words that consist of whitespace
+ # between two encoded strings.
+ import sys
+ droplist = []
+ for n, w in enumerate(words):
+ if n>1 and w[1] and words[n-2][1] and words[n-1][0].isspace():
+ droplist.append(n-1)
+ for d in reversed(droplist):
+ del words[d]
+
# The next step is to decode each encoded word by applying the reverse
# base64 or quopri transformation. decoded_words is now a list of the
# form (decoded_word, charset).
@@ -217,22 +230,27 @@ class Header:
self._normalize()
uchunks = []
lastcs = None
+ lastspace = None
for string, charset in self._chunks:
# We must preserve spaces between encoded and non-encoded word
# boundaries, which means for us we need to add a space when we go
# from a charset to None/us-ascii, or from None/us-ascii to a
# charset. Only do this for the second and subsequent chunks.
+ # Don't add a space if the None/us-ascii string already has
+ # a space (trailing or leading depending on transition)
nextcs = charset
if nextcs == _charset.UNKNOWN8BIT:
original_bytes = string.encode('ascii', 'surrogateescape')
string = original_bytes.decode('ascii', 'replace')
if uchunks:
+ hasspace = string and self._nonctext(string[0])
if lastcs not in (None, 'us-ascii'):
- if nextcs in (None, 'us-ascii'):
+ if nextcs in (None, 'us-ascii') and not hasspace:
uchunks.append(SPACE)
nextcs = None
- elif nextcs not in (None, 'us-ascii'):
+ elif nextcs not in (None, 'us-ascii') and not lastspace:
uchunks.append(SPACE)
+ lastspace = string and self._nonctext(string[-1])
lastcs = nextcs
uchunks.append(string)
return EMPTYSTRING.join(uchunks)
@@ -291,6 +309,11 @@ class Header:
charset = UTF8
self._chunks.append((s, charset))
+ def _nonctext(self, s):
+ """True if string s is not a ctext character of RFC822.
+ """
+ return s.isspace() or s in ('(', ')', '\\')
+
def encode(self, splitchars=';, \t', maxlinelen=None, linesep='\n'):
r"""Encode a message header into an RFC-compliant format.
@@ -334,7 +357,20 @@ class Header:
maxlinelen = 1000000
formatter = _ValueFormatter(self._headerlen, maxlinelen,
self._continuation_ws, splitchars)
+ lastcs = None
+ hasspace = lastspace = None
for string, charset in self._chunks:
+ if hasspace is not None:
+ hasspace = string and self._nonctext(string[0])
+ import sys
+ if lastcs not in (None, 'us-ascii'):
+ if not hasspace or charset not in (None, 'us-ascii'):
+ formatter.add_transition()
+ elif charset not in (None, 'us-ascii') and not lastspace:
+ formatter.add_transition()
+ lastspace = string and self._nonctext(string[-1])
+ lastcs = charset
+ hasspace = False
lines = string.splitlines()
if lines:
formatter.feed('', lines[0], charset)
@@ -351,6 +387,7 @@ class Header:
formatter.feed(fws, sline, charset)
if len(lines) > 1:
formatter.newline()
+ if self._chunks:
formatter.add_transition()
value = formatter._str(linesep)
if _embeded_header.search(value):
diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py
new file mode 100644
index 0000000..1fae950
--- /dev/null
+++ b/Lib/email/headerregistry.py
@@ -0,0 +1,583 @@
+"""Representing and manipulating email headers via custom objects.
+
+This module provides an implementation of the HeaderRegistry API.
+The implementation is designed to flexibly follow RFC5322 rules.
+
+Eventually HeaderRegistry will be a public API, but it isn't yet,
+and will probably change some before that happens.
+
+"""
+
+from email import utils
+from email import errors
+from email import _header_value_parser as parser
+
+class Address:
+
+ def __init__(self, display_name='', username='', domain='', addr_spec=None):
+ """Create an object represeting a full email address.
+
+ An address can have a 'display_name', a 'username', and a 'domain'. In
+ addition to specifying the username and domain separately, they may be
+ specified together by using the addr_spec keyword *instead of* the
+ username and domain keywords. If an addr_spec string is specified it
+ must be properly quoted according to RFC 5322 rules; an error will be
+ raised if it is not.
+
+ An Address object has display_name, username, domain, and addr_spec
+ attributes, all of which are read-only. The addr_spec and the string
+ value of the object are both quoted according to RFC5322 rules, but
+ without any Content Transfer Encoding.
+
+ """
+ # This clause with its potential 'raise' may only happen when an
+ # application program creates an Address object using an addr_spec
+ # keyword. The email library code itself must always supply username
+ # and domain.
+ if addr_spec is not None:
+ if username or domain:
+ raise TypeError("addrspec specified when username and/or "
+ "domain also specified")
+ a_s, rest = parser.get_addr_spec(addr_spec)
+ if rest:
+ raise ValueError("Invalid addr_spec; only '{}' "
+ "could be parsed from '{}'".format(
+ a_s, addr_spec))
+ if a_s.all_defects:
+ raise a_s.all_defects[0]
+ username = a_s.local_part
+ domain = a_s.domain
+ self._display_name = display_name
+ self._username = username
+ self._domain = domain
+
+ @property
+ def display_name(self):
+ return self._display_name
+
+ @property
+ def username(self):
+ return self._username
+
+ @property
+ def domain(self):
+ return self._domain
+
+ @property
+ def addr_spec(self):
+ """The addr_spec (username@domain) portion of the address, quoted
+ according to RFC 5322 rules, but with no Content Transfer Encoding.
+ """
+ nameset = set(self.username)
+ if len(nameset) > len(nameset-parser.DOT_ATOM_ENDS):
+ lp = parser.quote_string(self.username)
+ else:
+ lp = self.username
+ if self.domain:
+ return lp + '@' + self.domain
+ if not lp:
+ return '<>'
+ return lp
+
+ def __repr__(self):
+ return "Address(display_name={!r}, username={!r}, domain={!r})".format(
+ self.display_name, self.username, self.domain)
+
+ def __str__(self):
+ nameset = set(self.display_name)
+ if len(nameset) > len(nameset-parser.SPECIALS):
+ disp = parser.quote_string(self.display_name)
+ else:
+ disp = self.display_name
+ if disp:
+ addr_spec = '' if self.addr_spec=='<>' else self.addr_spec
+ return "{} <{}>".format(disp, addr_spec)
+ return self.addr_spec
+
+ def __eq__(self, other):
+ if type(other) != type(self):
+ return False
+ return (self.display_name == other.display_name and
+ self.username == other.username and
+ self.domain == other.domain)
+
+
+class Group:
+
+ def __init__(self, display_name=None, addresses=None):
+ """Create an object representing an address group.
+
+ An address group consists of a display_name followed by colon and an
+ list of addresses (see Address) terminated by a semi-colon. The Group
+ is created by specifying a display_name and a possibly empty list of
+ Address objects. A Group can also be used to represent a single
+ address that is not in a group, which is convenient when manipulating
+ lists that are a combination of Groups and individual Addresses. In
+ this case the display_name should be set to None. In particular, the
+ string representation of a Group whose display_name is None is the same
+ as the Address object, if there is one and only one Address object in
+ the addresses list.
+
+ """
+ self._display_name = display_name
+ self._addresses = tuple(addresses) if addresses else tuple()
+
+ @property
+ def display_name(self):
+ return self._display_name
+
+ @property
+ def addresses(self):
+ return self._addresses
+
+ def __repr__(self):
+ return "Group(display_name={!r}, addresses={!r}".format(
+ self.display_name, self.addresses)
+
+ def __str__(self):
+ if self.display_name is None and len(self.addresses)==1:
+ return str(self.addresses[0])
+ disp = self.display_name
+ if disp is not None:
+ nameset = set(disp)
+ if len(nameset) > len(nameset-parser.SPECIALS):
+ disp = parser.quote_string(disp)
+ adrstr = ", ".join(str(x) for x in self.addresses)
+ adrstr = ' ' + adrstr if adrstr else adrstr
+ return "{}:{};".format(disp, adrstr)
+
+ def __eq__(self, other):
+ if type(other) != type(self):
+ return False
+ return (self.display_name == other.display_name and
+ self.addresses == other.addresses)
+
+
+# Header Classes #
+
+class BaseHeader(str):
+
+ """Base class for message headers.
+
+ Implements generic behavior and provides tools for subclasses.
+
+ A subclass must define a classmethod named 'parse' that takes an unfolded
+ value string and a dictionary as its arguments. The dictionary will
+ contain one key, 'defects', initialized to an empty list. After the call
+ the dictionary must contain two additional keys: parse_tree, set to the
+ parse tree obtained from parsing the header, and 'decoded', set to the
+ string value of the idealized representation of the data from the value.
+ (That is, encoded words are decoded, and values that have canonical
+ representations are so represented.)
+
+ The defects key is intended to collect parsing defects, which the message
+ parser will subsequently dispose of as appropriate. The parser should not,
+ insofar as practical, raise any errors. Defects should be added to the
+ list instead. The standard header parsers register defects for RFC
+ compliance issues, for obsolete RFC syntax, and for unrecoverable parsing
+ errors.
+
+ The parse method may add additional keys to the dictionary. In this case
+ the subclass must define an 'init' method, which will be passed the
+ dictionary as its keyword arguments. The method should use (usually by
+ setting them as the value of similarly named attributes) and remove all the
+ extra keys added by its parse method, and then use super to call its parent
+ class with the remaining arguments and keywords.
+
+ The subclass should also make sure that a 'max_count' attribute is defined
+ that is either None or 1. XXX: need to better define this API.
+
+ """
+
+ def __new__(cls, name, value):
+ kwds = {'defects': []}
+ cls.parse(value, kwds)
+ if utils._has_surrogates(kwds['decoded']):
+ kwds['decoded'] = utils._sanitize(kwds['decoded'])
+ self = str.__new__(cls, kwds['decoded'])
+ del kwds['decoded']
+ self.init(name, **kwds)
+ return self
+
+ def init(self, name, *, parse_tree, defects):
+ self._name = name
+ self._parse_tree = parse_tree
+ self._defects = defects
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def defects(self):
+ return tuple(self._defects)
+
+ def __reduce__(self):
+ return (
+ _reconstruct_header,
+ (
+ self.__class__.__name__,
+ self.__class__.__bases__,
+ str(self),
+ ),
+ self.__dict__)
+
+ @classmethod
+ def _reconstruct(cls, value):
+ return str.__new__(cls, value)
+
+ def fold(self, *, policy):
+ """Fold header according to policy.
+
+ The parsed representation of the header is folded according to
+ RFC5322 rules, as modified by the policy. If the parse tree
+ contains surrogateescaped bytes, the bytes are CTE encoded using
+ the charset 'unknown-8bit".
+
+ Any non-ASCII characters in the parse tree are CTE encoded using
+ charset utf-8. XXX: make this a policy setting.
+
+ The returned value is an ASCII-only string possibly containing linesep
+ characters, and ending with a linesep character. The string includes
+ the header name and the ': ' separator.
+
+ """
+ # At some point we need to only put fws here if it was in the source.
+ header = parser.Header([
+ parser.HeaderLabel([
+ parser.ValueTerminal(self.name, 'header-name'),
+ parser.ValueTerminal(':', 'header-sep')]),
+ parser.CFWSList([parser.WhiteSpaceTerminal(' ', 'fws')]),
+ self._parse_tree])
+ return header.fold(policy=policy)
+
+
+def _reconstruct_header(cls_name, bases, value):
+ return type(cls_name, bases, {})._reconstruct(value)
+
+
+class UnstructuredHeader:
+
+ max_count = None
+ value_parser = staticmethod(parser.get_unstructured)
+
+ @classmethod
+ def parse(cls, value, kwds):
+ kwds['parse_tree'] = cls.value_parser(value)
+ kwds['decoded'] = str(kwds['parse_tree'])
+
+
+class UniqueUnstructuredHeader(UnstructuredHeader):
+
+ max_count = 1
+
+
+class DateHeader:
+
+ """Header whose value consists of a single timestamp.
+
+ Provides an additional attribute, datetime, which is either an aware
+ datetime using a timezone, or a naive datetime if the timezone
+ in the input string is -0000. Also accepts a datetime as input.
+ The 'value' attribute is the normalized form of the timestamp,
+ which means it is the output of format_datetime on the datetime.
+ """
+
+ max_count = None
+
+ # This is used only for folding, not for creating 'decoded'.
+ value_parser = staticmethod(parser.get_unstructured)
+
+ @classmethod
+ def parse(cls, value, kwds):
+ if not value:
+ kwds['defects'].append(errors.HeaderMissingRequiredValue())
+ kwds['datetime'] = None
+ kwds['decoded'] = ''
+ kwds['parse_tree'] = parser.TokenList()
+ return
+ if isinstance(value, str):
+ value = utils.parsedate_to_datetime(value)
+ kwds['datetime'] = value
+ kwds['decoded'] = utils.format_datetime(kwds['datetime'])
+ kwds['parse_tree'] = cls.value_parser(kwds['decoded'])
+
+ def init(self, *args, **kw):
+ self._datetime = kw.pop('datetime')
+ super().init(*args, **kw)
+
+ @property
+ def datetime(self):
+ return self._datetime
+
+
+class UniqueDateHeader(DateHeader):
+
+ max_count = 1
+
+
+class AddressHeader:
+
+ max_count = None
+
+ @staticmethod
+ def value_parser(value):
+ address_list, value = parser.get_address_list(value)
+ assert not value, 'this should not happen'
+ return address_list
+
+ @classmethod
+ def parse(cls, value, kwds):
+ if isinstance(value, str):
+ # We are translating here from the RFC language (address/mailbox)
+ # to our API language (group/address).
+ kwds['parse_tree'] = address_list = cls.value_parser(value)
+ groups = []
+ for addr in address_list.addresses:
+ groups.append(Group(addr.display_name,
+ [Address(mb.display_name or '',
+ mb.local_part or '',
+ mb.domain or '')
+ for mb in addr.all_mailboxes]))
+ defects = list(address_list.all_defects)
+ else:
+ # Assume it is Address/Group stuff
+ if not hasattr(value, '__iter__'):
+ value = [value]
+ groups = [Group(None, [item]) if not hasattr(item, 'addresses')
+ else item
+ for item in value]
+ defects = []
+ kwds['groups'] = groups
+ kwds['defects'] = defects
+ kwds['decoded'] = ', '.join([str(item) for item in groups])
+ if 'parse_tree' not in kwds:
+ kwds['parse_tree'] = cls.value_parser(kwds['decoded'])
+
+ def init(self, *args, **kw):
+ self._groups = tuple(kw.pop('groups'))
+ self._addresses = None
+ super().init(*args, **kw)
+
+ @property
+ def groups(self):
+ return self._groups
+
+ @property
+ def addresses(self):
+ if self._addresses is None:
+ self._addresses = tuple([address for group in self._groups
+ for address in group.addresses])
+ return self._addresses
+
+
+class UniqueAddressHeader(AddressHeader):
+
+ max_count = 1
+
+
+class SingleAddressHeader(AddressHeader):
+
+ @property
+ def address(self):
+ if len(self.addresses)!=1:
+ raise ValueError(("value of single address header {} is not "
+ "a single address").format(self.name))
+ return self.addresses[0]
+
+
+class UniqueSingleAddressHeader(SingleAddressHeader):
+
+ max_count = 1
+
+
+class MIMEVersionHeader:
+
+ max_count = 1
+
+ value_parser = staticmethod(parser.parse_mime_version)
+
+ @classmethod
+ def parse(cls, value, kwds):
+ kwds['parse_tree'] = parse_tree = cls.value_parser(value)
+ kwds['decoded'] = str(parse_tree)
+ kwds['defects'].extend(parse_tree.all_defects)
+ kwds['major'] = None if parse_tree.minor is None else parse_tree.major
+ kwds['minor'] = parse_tree.minor
+ if parse_tree.minor is not None:
+ kwds['version'] = '{}.{}'.format(kwds['major'], kwds['minor'])
+ else:
+ kwds['version'] = None
+
+ def init(self, *args, **kw):
+ self._version = kw.pop('version')
+ self._major = kw.pop('major')
+ self._minor = kw.pop('minor')
+ super().init(*args, **kw)
+
+ @property
+ def major(self):
+ return self._major
+
+ @property
+ def minor(self):
+ return self._minor
+
+ @property
+ def version(self):
+ return self._version
+
+
+class ParameterizedMIMEHeader:
+
+ # Mixin that handles the params dict. Must be subclassed and
+ # a property value_parser for the specific header provided.
+
+ max_count = 1
+
+ @classmethod
+ def parse(cls, value, kwds):
+ kwds['parse_tree'] = parse_tree = cls.value_parser(value)
+ kwds['decoded'] = str(parse_tree)
+ kwds['defects'].extend(parse_tree.all_defects)
+ if parse_tree.params is None:
+ kwds['params'] = {}
+ else:
+ # The MIME RFCs specify that parameter ordering is arbitrary.
+ kwds['params'] = {utils._sanitize(name).lower():
+ utils._sanitize(value)
+ for name, value in parse_tree.params}
+
+ def init(self, *args, **kw):
+ self._params = kw.pop('params')
+ super().init(*args, **kw)
+
+ @property
+ def params(self):
+ return self._params.copy()
+
+
+class ContentTypeHeader(ParameterizedMIMEHeader):
+
+ value_parser = staticmethod(parser.parse_content_type_header)
+
+ def init(self, *args, **kw):
+ super().init(*args, **kw)
+ self._maintype = utils._sanitize(self._parse_tree.maintype)
+ self._subtype = utils._sanitize(self._parse_tree.subtype)
+
+ @property
+ def maintype(self):
+ return self._maintype
+
+ @property
+ def subtype(self):
+ return self._subtype
+
+ @property
+ def content_type(self):
+ return self.maintype + '/' + self.subtype
+
+
+class ContentDispositionHeader(ParameterizedMIMEHeader):
+
+ value_parser = staticmethod(parser.parse_content_disposition_header)
+
+ def init(self, *args, **kw):
+ super().init(*args, **kw)
+ cd = self._parse_tree.content_disposition
+ self._content_disposition = cd if cd is None else utils._sanitize(cd)
+
+ @property
+ def content_disposition(self):
+ return self._content_disposition
+
+
+class ContentTransferEncodingHeader:
+
+ max_count = 1
+
+ value_parser = staticmethod(parser.parse_content_transfer_encoding_header)
+
+ @classmethod
+ def parse(cls, value, kwds):
+ kwds['parse_tree'] = parse_tree = cls.value_parser(value)
+ kwds['decoded'] = str(parse_tree)
+ kwds['defects'].extend(parse_tree.all_defects)
+
+ def init(self, *args, **kw):
+ super().init(*args, **kw)
+ self._cte = utils._sanitize(self._parse_tree.cte)
+
+ @property
+ def cte(self):
+ return self._cte
+
+
+# The header factory #
+
+_default_header_map = {
+ 'subject': UniqueUnstructuredHeader,
+ 'date': UniqueDateHeader,
+ 'resent-date': DateHeader,
+ 'orig-date': UniqueDateHeader,
+ 'sender': UniqueSingleAddressHeader,
+ 'resent-sender': SingleAddressHeader,
+ 'to': UniqueAddressHeader,
+ 'resent-to': AddressHeader,
+ 'cc': UniqueAddressHeader,
+ 'resent-cc': AddressHeader,
+ 'bcc': UniqueAddressHeader,
+ 'resent-bcc': AddressHeader,
+ 'from': UniqueAddressHeader,
+ 'resent-from': AddressHeader,
+ 'reply-to': UniqueAddressHeader,
+ 'mime-version': MIMEVersionHeader,
+ 'content-type': ContentTypeHeader,
+ 'content-disposition': ContentDispositionHeader,
+ 'content-transfer-encoding': ContentTransferEncodingHeader,
+ }
+
+class HeaderRegistry:
+
+ """A header_factory and header registry."""
+
+ def __init__(self, base_class=BaseHeader, default_class=UnstructuredHeader,
+ use_default_map=True):
+ """Create a header_factory that works with the Policy API.
+
+ base_class is the class that will be the last class in the created
+ header class's __bases__ list. default_class is the class that will be
+ used if "name" (see __call__) does not appear in the registry.
+ use_default_map controls whether or not the default mapping of names to
+ specialized classes is copied in to the registry when the factory is
+ created. The default is True.
+
+ """
+ self.registry = {}
+ self.base_class = base_class
+ self.default_class = default_class
+ if use_default_map:
+ self.registry.update(_default_header_map)
+
+ def map_to_type(self, name, cls):
+ """Register cls as the specialized class for handling "name" headers.
+
+ """
+ self.registry[name.lower()] = cls
+
+ def __getitem__(self, name):
+ cls = self.registry.get(name.lower(), self.default_class)
+ return type('_'+cls.__name__, (cls, self.base_class), {})
+
+ def __call__(self, name, value):
+ """Create a header instance for header 'name' from 'value'.
+
+ Creates a header instance by creating a specialized class for parsing
+ and representing the specified header by combining the factory
+ base_class with a specialized class from the registry or the
+ default_class, and passing the name and value to the constructed
+ class's constructor.
+
+ """
+ return self[name](name, value)
diff --git a/Lib/email/message.py b/Lib/email/message.py
index f1ffcdb..3feab52 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -10,14 +10,14 @@ import re
import uu
import base64
import binascii
-import warnings
from io import BytesIO, StringIO
# Intrapackage imports
from email import utils
from email import errors
-from email import header
+from email._policybase import compat32
from email import charset as _charset
+from email._encoded_words import decode_b
Charset = _charset.Charset
SEMISPACE = '; '
@@ -26,24 +26,6 @@ SEMISPACE = '; '
# existence of which force quoting of the parameter value.
tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
-# How to figure out if we are processing strings that come from a byte
-# source with undecodable characters.
-_has_surrogates = re.compile(
- '([^\ud800-\udbff]|\A)[\udc00-\udfff]([^\udc00-\udfff]|\Z)').search
-
-
-# Helper functions
-def _sanitize_header(name, value):
- # If the header value contains surrogates, return a Header using
- # the unknown-8bit charset to encode the bytes as encoded words.
- if not isinstance(value, str):
- # Assume it is already a header object
- return value
- if _has_surrogates(value):
- return header.Header(value, charset=_charset.UNKNOWN8BIT,
- header_name=name)
- else:
- return value
def _splitparam(param):
# Split header parameters. BAW: this may be too simple. It isn't
@@ -136,7 +118,8 @@ class Message:
you must use the explicit API to set or get all the headers. Not all of
the mapping methods are implemented.
"""
- def __init__(self):
+ def __init__(self, policy=compat32):
+ self.policy = policy
self._headers = []
self._unixfrom = None
self._payload = None
@@ -246,7 +229,7 @@ class Message:
cte = str(self.get('content-transfer-encoding', '')).lower()
# payload may be bytes here.
if isinstance(payload, str):
- if _has_surrogates(payload):
+ if utils._has_surrogates(payload):
bpayload = payload.encode('ascii', 'surrogateescape')
if not decode:
try:
@@ -267,11 +250,12 @@ class Message:
if cte == 'quoted-printable':
return utils._qdecode(bpayload)
elif cte == 'base64':
- try:
- return base64.b64decode(bpayload)
- except binascii.Error:
- # Incorrect padding
- return bpayload
+ # XXX: this is a bit of a hack; decode_b should probably be factored
+ # out somewhere, but I haven't figured out where yet.
+ value, defects = decode_b(b''.join(bpayload.splitlines()))
+ for defect in defects:
+ self.policy.handle_defect(self, defect)
+ return value
elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
in_file = BytesIO(bpayload)
out_file = BytesIO()
@@ -362,7 +346,17 @@ class Message:
Note: this does not overwrite an existing header with the same field
name. Use __delitem__() first to delete any existing headers.
"""
- self._headers.append((name, val))
+ max_count = self.policy.header_max_count(name)
+ if max_count:
+ lname = name.lower()
+ found = 0
+ for k, v in self._headers:
+ if k.lower() == lname:
+ found += 1
+ if found >= max_count:
+ raise ValueError("There may be at most {} {} headers "
+ "in a message".format(max_count, name))
+ self._headers.append(self.policy.header_store_parse(name, val))
def __delitem__(self, name):
"""Delete all occurrences of a header, if present.
@@ -401,7 +395,8 @@ class Message:
Any fields deleted and re-inserted are always appended to the header
list.
"""
- return [_sanitize_header(k, v) for k, v in self._headers]
+ return [self.policy.header_fetch_parse(k, v)
+ for k, v in self._headers]
def items(self):
"""Get all the message's header fields and values.
@@ -411,7 +406,8 @@ class Message:
Any fields deleted and re-inserted are always appended to the header
list.
"""
- return [(k, _sanitize_header(k, v)) for k, v in self._headers]
+ return [(k, self.policy.header_fetch_parse(k, v))
+ for k, v in self._headers]
def get(self, name, failobj=None):
"""Get a header value.
@@ -422,10 +418,29 @@ class Message:
name = name.lower()
for k, v in self._headers:
if k.lower() == name:
- return _sanitize_header(k, v)
+ return self.policy.header_fetch_parse(k, v)
return failobj
#
+ # "Internal" methods (public API, but only intended for use by a parser
+ # or generator, not normal application code.
+ #
+
+ def set_raw(self, name, value):
+ """Store name and value in the model without modification.
+
+ This is an "internal" API, intended only for use by a parser.
+ """
+ self._headers.append((name, value))
+
+ def raw_items(self):
+ """Return the (name, value) header pairs without modification.
+
+ This is an "internal" API, intended only for use by a generator.
+ """
+ return iter(self._headers.copy())
+
+ #
# Additional useful stuff
#
@@ -442,7 +457,7 @@ class Message:
name = name.lower()
for k, v in self._headers:
if k.lower() == name:
- values.append(_sanitize_header(k, v))
+ values.append(self.policy.header_fetch_parse(k, v))
if not values:
return failobj
return values
@@ -475,7 +490,7 @@ class Message:
parts.append(_formatparam(k.replace('_', '-'), v))
if _value is not None:
parts.insert(0, _value)
- self._headers.append((_name, SEMISPACE.join(parts)))
+ self[_name] = SEMISPACE.join(parts)
def replace_header(self, _name, _value):
"""Replace a header.
@@ -487,7 +502,7 @@ class Message:
_name = _name.lower()
for i, (k, v) in zip(range(len(self._headers)), self._headers):
if k.lower() == _name:
- self._headers[i] = (k, _value)
+ self._headers[i] = self.policy.header_store_parse(k, _value)
break
else:
raise KeyError(_name)
@@ -803,7 +818,8 @@ class Message:
parts.append(k)
else:
parts.append('%s=%s' % (k, v))
- newheaders.append((h, SEMISPACE.join(parts)))
+ val = SEMISPACE.join(parts)
+ newheaders.append(self.policy.header_store_parse(h, val))
else:
newheaders.append((h, v))
diff --git a/Lib/email/mime/text.py b/Lib/email/mime/text.py
index 5747db5..80ff950 100644
--- a/Lib/email/mime/text.py
+++ b/Lib/email/mime/text.py
@@ -14,7 +14,7 @@ from email.mime.nonmultipart import MIMENonMultipart
class MIMEText(MIMENonMultipart):
"""Class for generating text/* type MIME documents."""
- def __init__(self, _text, _subtype='plain', _charset='us-ascii'):
+ def __init__(self, _text, _subtype='plain', _charset=None):
"""Create a text/* type MIME document.
_text is the string for this message object.
@@ -25,6 +25,18 @@ class MIMEText(MIMENonMultipart):
header. This defaults to "us-ascii". Note that as a side-effect, the
Content-Transfer-Encoding header will also be set.
"""
+
+ # If no _charset was specified, check to see see if there are non-ascii
+ # characters present. If not, use 'us-ascii', otherwise use utf-8.
+ # XXX: This can be removed once #7304 is fixed.
+ if _charset is None:
+ try:
+ _text.encode('us-ascii')
+ _charset = 'us-ascii'
+ except UnicodeEncodeError:
+ _charset = 'utf-8'
+
MIMENonMultipart.__init__(self, 'text', _subtype,
**{'charset': _charset})
+
self.set_payload(_text, _charset)
diff --git a/Lib/email/parser.py b/Lib/email/parser.py
index 1c931ea..1aab012 100644
--- a/Lib/email/parser.py
+++ b/Lib/email/parser.py
@@ -4,18 +4,19 @@
"""A parser of RFC 2822 and MIME email messages."""
-__all__ = ['Parser', 'HeaderParser', 'BytesParser']
+__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser']
import warnings
from io import StringIO, TextIOWrapper
from email.feedparser import FeedParser
from email.message import Message
+from email._policybase import compat32
class Parser:
- def __init__(self, *args, **kws):
+ def __init__(self, _class=Message, *, policy=compat32):
"""Parser of RFC 2822 and MIME email messages.
Creates an in-memory object tree representing the email message, which
@@ -30,28 +31,14 @@ class Parser:
_class is the class to instantiate for new message objects when they
must be created. This class must have a constructor that can take
zero arguments. Default is Message.Message.
+
+ The policy keyword specifies a policy object that controls a number of
+ aspects of the parser's operation. The default policy maintains
+ backward compatibility.
+
"""
- if len(args) >= 1:
- if '_class' in kws:
- raise TypeError("Multiple values for keyword arg '_class'")
- kws['_class'] = args[0]
- if len(args) == 2:
- if 'strict' in kws:
- raise TypeError("Multiple values for keyword arg 'strict'")
- kws['strict'] = args[1]
- if len(args) > 2:
- raise TypeError('Too many arguments')
- if '_class' in kws:
- self._class = kws['_class']
- del kws['_class']
- else:
- self._class = Message
- if 'strict' in kws:
- warnings.warn("'strict' argument is deprecated (and ignored)",
- DeprecationWarning, 2)
- del kws['strict']
- if kws:
- raise TypeError('Unexpected keyword arguments')
+ self._class = _class
+ self.policy = policy
def parse(self, fp, headersonly=False):
"""Create a message structure from the data in a file.
@@ -61,7 +48,7 @@ class Parser:
parsing after reading the headers or not. The default is False,
meaning it parses the entire contents of the file.
"""
- feedparser = FeedParser(self._class)
+ feedparser = FeedParser(self._class, policy=self.policy)
if headersonly:
feedparser._set_headersonly()
while True:
@@ -134,3 +121,11 @@ class BytesParser:
"""
text = text.decode('ASCII', errors='surrogateescape')
return self.parser.parsestr(text, headersonly)
+
+
+class BytesHeaderParser(BytesParser):
+ def parse(self, fp, headersonly=True):
+ return BytesParser.parse(self, fp, headersonly=True)
+
+ def parsebytes(self, text, headersonly=True):
+ return BytesParser.parsebytes(self, text, headersonly=True)
diff --git a/Lib/email/policy.py b/Lib/email/policy.py
new file mode 100644
index 0000000..32cad0d
--- /dev/null
+++ b/Lib/email/policy.py
@@ -0,0 +1,188 @@
+"""This will be the home for the policy that hooks in the new
+code that adds all the email6 features.
+"""
+
+from email._policybase import Policy, Compat32, compat32, _extend_docstrings
+from email.utils import _has_surrogates
+from email.headerregistry import HeaderRegistry as HeaderRegistry
+
+__all__ = [
+ 'Compat32',
+ 'compat32',
+ 'Policy',
+ 'EmailPolicy',
+ 'default',
+ 'strict',
+ 'SMTP',
+ 'HTTP',
+ ]
+
+@_extend_docstrings
+class EmailPolicy(Policy):
+
+ """+
+ PROVISIONAL
+
+ The API extensions enabled by this this policy are currently provisional.
+ Refer to the documentation for details.
+
+ This policy adds new header parsing and folding algorithms. Instead of
+ simple strings, headers are custom objects with custom attributes
+ depending on the type of the field. The folding algorithm fully
+ implements RFCs 2047 and 5322.
+
+ In addition to the settable attributes listed above that apply to
+ all Policies, this policy adds the following additional attributes:
+
+ refold_source -- if the value for a header in the Message object
+ came from the parsing of some source, this attribute
+ indicates whether or not a generator should refold
+ that value when transforming the message back into
+ stream form. The possible values are:
+
+ none -- all source values use original folding
+ long -- source values that have any line that is
+ longer than max_line_length will be
+ refolded
+ all -- all values are refolded.
+
+ The default is 'long'.
+
+ header_factory -- a callable that takes two arguments, 'name' and
+ 'value', where 'name' is a header field name and
+ 'value' is an unfolded header field value, and
+ returns a string-like object that represents that
+ header. A default header_factory is provided that
+ understands some of the RFC5322 header field types.
+ (Currently address fields and date fields have
+ special treatment, while all other fields are
+ treated as unstructured. This list will be
+ completed before the extension is marked stable.)
+ """
+
+ refold_source = 'long'
+ header_factory = HeaderRegistry()
+
+ def __init__(self, **kw):
+ # Ensure that each new instance gets a unique header factory
+ # (as opposed to clones, which share the factory).
+ if 'header_factory' not in kw:
+ object.__setattr__(self, 'header_factory', HeaderRegistry())
+ super().__init__(**kw)
+
+ def header_max_count(self, name):
+ """+
+ The implementation for this class returns the max_count attribute from
+ the specialized header class that would be used to construct a header
+ of type 'name'.
+ """
+ return self.header_factory[name].max_count
+
+ # The logic of the next three methods is chosen such that it is possible to
+ # switch a Message object between a Compat32 policy and a policy derived
+ # from this class and have the results stay consistent. This allows a
+ # Message object constructed with this policy to be passed to a library
+ # that only handles Compat32 objects, or to receive such an object and
+ # convert it to use the newer style by just changing its policy. It is
+ # also chosen because it postpones the relatively expensive full rfc5322
+ # parse until as late as possible when parsing from source, since in many
+ # applications only a few headers will actually be inspected.
+
+ def header_source_parse(self, sourcelines):
+ """+
+ The name is parsed as everything up to the ':' and returned unmodified.
+ The value is determined by stripping leading whitespace off the
+ remainder of the first line, joining all subsequent lines together, and
+ stripping any trailing carriage return or linefeed characters. (This
+ is the same as Compat32).
+
+ """
+ name, value = sourcelines[0].split(':', 1)
+ value = value.lstrip(' \t') + ''.join(sourcelines[1:])
+ return (name, value.rstrip('\r\n'))
+
+ def header_store_parse(self, name, value):
+ """+
+ The name is returned unchanged. If the input value has a 'name'
+ attribute and it matches the name ignoring case, the value is returned
+ unchanged. Otherwise the name and value are passed to header_factory
+ method, and the resulting custom header object is returned as the
+ value. In this case a ValueError is raised if the input value contains
+ CR or LF characters.
+
+ """
+ if hasattr(value, 'name') and value.name.lower() == name.lower():
+ return (name, value)
+ if isinstance(value, str) and len(value.splitlines())>1:
+ raise ValueError("Header values may not contain linefeed "
+ "or carriage return characters")
+ return (name, self.header_factory(name, value))
+
+ def header_fetch_parse(self, name, value):
+ """+
+ If the value has a 'name' attribute, it is returned to unmodified.
+ Otherwise the name and the value with any linesep characters removed
+ are passed to the header_factory method, and the resulting custom
+ header object is returned. Any surrogateescaped bytes get turned
+ into the unicode unknown-character glyph.
+
+ """
+ if hasattr(value, 'name'):
+ return value
+ return self.header_factory(name, ''.join(value.splitlines()))
+
+ def fold(self, name, value):
+ """+
+ Header folding is controlled by the refold_source policy setting. A
+ value is considered to be a 'source value' if and only if it does not
+ have a 'name' attribute (having a 'name' attribute means it is a header
+ object of some sort). If a source value needs to be refolded according
+ to the policy, it is converted into a custom header object by passing
+ the name and the value with any linesep characters removed to the
+ header_factory method. Folding of a custom header object is done by
+ calling its fold method with the current policy.
+
+ Source values are split into lines using splitlines. If the value is
+ not to be refolded, the lines are rejoined using the linesep from the
+ policy and returned. The exception is lines containing non-ascii
+ binary data. In that case the value is refolded regardless of the
+ refold_source setting, which causes the binary data to be CTE encoded
+ using the unknown-8bit charset.
+
+ """
+ return self._fold(name, value, refold_binary=True)
+
+ def fold_binary(self, name, value):
+ """+
+ The same as fold if cte_type is 7bit, except that the returned value is
+ bytes.
+
+ If cte_type is 8bit, non-ASCII binary data is converted back into
+ bytes. Headers with binary data are not refolded, regardless of the
+ refold_header setting, since there is no way to know whether the binary
+ data consists of single byte characters or multibyte characters.
+
+ """
+ folded = self._fold(name, value, refold_binary=self.cte_type=='7bit')
+ return folded.encode('ascii', 'surrogateescape')
+
+ def _fold(self, name, value, refold_binary=False):
+ if hasattr(value, 'name'):
+ return value.fold(policy=self)
+ maxlen = self.max_line_length if self.max_line_length else float('inf')
+ lines = value.splitlines()
+ refold = (self.refold_source == 'all' or
+ self.refold_source == 'long' and
+ (len(lines[0])+len(name)+2 > maxlen or
+ any(len(x) > maxlen for x in lines[1:])))
+ if refold or refold_binary and _has_surrogates(value):
+ return self.header_factory(name, ''.join(lines)).fold(policy=self)
+ return name + ': ' + self.linesep.join(lines) + self.linesep
+
+
+default = EmailPolicy()
+# Make the default policy use the class default header_factory
+del default.header_factory
+strict = default.clone(raise_on_defect=True)
+SMTP = default.clone(linesep='\r\n')
+HTTP = default.clone(linesep='\r\n', max_line_length=None)
diff --git a/Lib/email/utils.py b/Lib/email/utils.py
index ac4da37..6b6d7f4 100644
--- a/Lib/email/utils.py
+++ b/Lib/email/utils.py
@@ -11,12 +11,14 @@ __all__ = [
'encode_rfc2231',
'formataddr',
'formatdate',
+ 'format_datetime',
'getaddresses',
'make_msgid',
'mktime_tz',
'parseaddr',
'parsedate',
'parsedate_tz',
+ 'parsedate_to_datetime',
'unquote',
]
@@ -26,6 +28,7 @@ import time
import base64
import random
import socket
+import datetime
import urllib.parse
import warnings
from io import StringIO
@@ -34,14 +37,13 @@ from email._parseaddr import quote
from email._parseaddr import AddressList as _AddressList
from email._parseaddr import mktime_tz
-# We need wormarounds for bugs in these methods in older Pythons (see below)
-from email._parseaddr import parsedate as _parsedate
-from email._parseaddr import parsedate_tz as _parsedate_tz
+from email._parseaddr import parsedate, parsedate_tz, _parsedate_tz
from quopri import decodestring as _qdecode
# Intrapackage imports
from email.encoders import _bencode, _qencode
+from email.charset import Charset
COMMASPACE = ', '
EMPTYSTRING = ''
@@ -50,27 +52,53 @@ CRLF = '\r\n'
TICK = "'"
specialsre = re.compile(r'[][\\()<>@,:;".]')
-escapesre = re.compile(r'[][\\()"]')
+escapesre = re.compile(r'[\\"]')
+# How to figure out if we are processing strings that come from a byte
+# source with undecodable characters.
+_has_surrogates = re.compile(
+ '([^\ud800-\udbff]|\A)[\udc00-\udfff]([^\udc00-\udfff]|\Z)').search
+
+# How to deal with a string containing bytes before handing it to the
+# application through the 'normal' interface.
+def _sanitize(string):
+ # Turn any escaped bytes into unicode 'unknown' char.
+ original_bytes = string.encode('ascii', 'surrogateescape')
+ return original_bytes.decode('ascii', 'replace')
# Helpers
-def formataddr(pair):
+def formataddr(pair, charset='utf-8'):
"""The inverse of parseaddr(), this takes a 2-tuple of the form
(realname, email_address) and returns the string value suitable
for an RFC 2822 From, To or Cc header.
If the first element of pair is false, then the second element is
returned unmodified.
+
+ Optional charset if given is the character set that is used to encode
+ realname in case realname is not ASCII safe. Can be an instance of str or
+ a Charset-like object which has a header_encode method. Default is
+ 'utf-8'.
"""
name, address = pair
+ # The address MUST (per RFC) be ascii, so throw a UnicodeError if it isn't.
+ address.encode('ascii')
if name:
- quotes = ''
- if specialsre.search(name):
- quotes = '"'
- name = escapesre.sub(r'\\\g<0>', name)
- return '%s%s%s <%s>' % (quotes, name, quotes, address)
+ try:
+ name.encode('ascii')
+ except UnicodeEncodeError:
+ if isinstance(charset, str):
+ charset = Charset(charset)
+ encoded_name = charset.header_encode(name)
+ return "%s <%s>" % (encoded_name, address)
+ else:
+ quotes = ''
+ if specialsre.search(name):
+ quotes = '"'
+ name = escapesre.sub(r'\\\g<0>', name)
+ return '%s%s%s <%s>' % (quotes, name, quotes, address)
return address
@@ -94,6 +122,14 @@ ecre = re.compile(r'''
''', re.VERBOSE | re.IGNORECASE)
+def _format_timetuple_and_zone(timetuple, zone):
+ return '%s, %02d %s %04d %02d:%02d:%02d %s' % (
+ ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][timetuple[6]],
+ timetuple[2],
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][timetuple[1] - 1],
+ timetuple[0], timetuple[3], timetuple[4], timetuple[5],
+ zone)
def formatdate(timeval=None, localtime=False, usegmt=False):
"""Returns a date string as specified by RFC 2822, e.g.:
@@ -138,14 +174,25 @@ def formatdate(timeval=None, localtime=False, usegmt=False):
zone = 'GMT'
else:
zone = '-0000'
- return '%s, %02d %s %04d %02d:%02d:%02d %s' % (
- ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][now[6]],
- now[2],
- ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
- 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][now[1] - 1],
- now[0], now[3], now[4], now[5],
- zone)
+ return _format_timetuple_and_zone(now, zone)
+def format_datetime(dt, usegmt=False):
+ """Turn a datetime into a date string as specified in RFC 2822.
+
+ If usegmt is True, dt must be an aware datetime with an offset of zero. In
+ this case 'GMT' will be rendered instead of the normal +0000 required by
+ RFC2822. This is to support HTTP headers involving date stamps.
+ """
+ now = dt.timetuple()
+ if usegmt:
+ if dt.tzinfo is None or dt.tzinfo != datetime.timezone.utc:
+ raise ValueError("usegmt option requires a UTC datetime")
+ zone = 'GMT'
+ elif dt.tzinfo is None:
+ zone = '-0000'
+ else:
+ zone = dt.strftime("%z")
+ return _format_timetuple_and_zone(now, zone)
def make_msgid(idstring=None, domain=None):
@@ -172,20 +219,12 @@ def make_msgid(idstring=None, domain=None):
return msgid
-
-# These functions are in the standalone mimelib version only because they've
-# subsequently been fixed in the latest Python versions. We use this to worm
-# around broken older Pythons.
-def parsedate(data):
- if not data:
- return None
- return _parsedate(data)
-
-
-def parsedate_tz(data):
- if not data:
- return None
- return _parsedate_tz(data)
+def parsedate_to_datetime(data):
+ *dtuple, tz = _parsedate_tz(data)
+ if tz is None:
+ return datetime.datetime(*dtuple[:6])
+ return datetime.datetime(*dtuple[:6],
+ tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
def parseaddr(addr):
@@ -304,3 +343,49 @@ def collapse_rfc2231_value(value, errors='replace',
except LookupError:
# charset is not a known codec.
return unquote(text)
+
+
+#
+# datetime doesn't provide a localtime function yet, so provide one. Code
+# adapted from the patch in issue 9527. This may not be perfect, but it is
+# better than not having it.
+#
+
+def localtime(dt=None, isdst=-1):
+ """Return local time as an aware datetime object.
+
+ If called without arguments, return current time. Otherwise *dt*
+ argument should be a datetime instance, and it is converted to the
+ local time zone according to the system time zone database. If *dt* is
+ naive (that is, dt.tzinfo is None), it is assumed to be in local time.
+ In this case, a positive or zero value for *isdst* causes localtime to
+ presume initially that summer time (for example, Daylight Saving Time)
+ is or is not (respectively) in effect for the specified time. A
+ negative value for *isdst* causes the localtime() function to attempt
+ to divine whether summer time is in effect for the specified time.
+
+ """
+ if dt is None:
+ return datetime.datetime.now(datetime.timezone.utc).astimezone()
+ if dt.tzinfo is not None:
+ return dt.astimezone()
+ # We have a naive datetime. Convert to a (localtime) timetuple and pass to
+ # system mktime together with the isdst hint. System mktime will return
+ # seconds since epoch.
+ tm = dt.timetuple()[:-1] + (isdst,)
+ seconds = time.mktime(tm)
+ localtm = time.localtime(seconds)
+ try:
+ delta = datetime.timedelta(seconds=localtm.tm_gmtoff)
+ tz = datetime.timezone(delta, localtm.tm_zone)
+ except AttributeError:
+ # Compute UTC offset and compare with the value implied by tm_isdst.
+ # If the values match, use the zone name implied by tm_isdst.
+ delta = dt - datetime.datetime(*time.gmtime(seconds)[:6])
+ dst = time.daylight and localtm.tm_isdst > 0
+ gmtoff = -(time.altzone if dst else time.timezone)
+ if delta == datetime.timedelta(seconds=gmtoff):
+ tz = datetime.timezone(delta, time.tzname[dst])
+ else:
+ tz = datetime.timezone(delta)
+ return dt.replace(tzinfo=tz)
diff --git a/Lib/encodings/cp037.py b/Lib/encodings/cp037.py
index 4edd708..bfe2c1e 100644
--- a/Lib/encodings/cp037.py
+++ b/Lib/encodings/cp037.py
@@ -301,6 +301,7 @@ decoding_table = (
'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE
'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE
'\x9f' # 0xFF -> CONTROL
+ '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/encodings/cp500.py b/Lib/encodings/cp500.py
index 5f61535..a975be7 100644
--- a/Lib/encodings/cp500.py
+++ b/Lib/encodings/cp500.py
@@ -301,6 +301,7 @@ decoding_table = (
'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE
'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE
'\x9f' # 0xFF -> CONTROL
+ '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/encodings/cp65001.py b/Lib/encodings/cp65001.py
new file mode 100644
index 0000000..287eb87
--- /dev/null
+++ b/Lib/encodings/cp65001.py
@@ -0,0 +1,40 @@
+"""
+Code page 65001: Windows UTF-8 (CP_UTF8).
+"""
+
+import codecs
+import functools
+
+if not hasattr(codecs, 'code_page_encode'):
+ raise LookupError("cp65001 encoding is only available on Windows")
+
+### Codec APIs
+
+encode = functools.partial(codecs.code_page_encode, 65001)
+decode = functools.partial(codecs.code_page_decode, 65001)
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+ def encode(self, input, final=False):
+ return encode(input, self.errors)[0]
+
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+ _buffer_decode = decode
+
+class StreamWriter(codecs.StreamWriter):
+ encode = encode
+
+class StreamReader(codecs.StreamReader):
+ decode = decode
+
+### encodings module API
+
+def getregentry():
+ return codecs.CodecInfo(
+ name='cp65001',
+ encode=encode,
+ decode=decode,
+ incrementalencoder=IncrementalEncoder,
+ incrementaldecoder=IncrementalDecoder,
+ streamreader=StreamReader,
+ streamwriter=StreamWriter,
+ )
diff --git a/Lib/encodings/hp_roman8.py b/Lib/encodings/hp_roman8.py
index dbaaa72..2334208 100644
--- a/Lib/encodings/hp_roman8.py
+++ b/Lib/encodings/hp_roman8.py
@@ -14,18 +14,18 @@ import codecs
class Codec(codecs.Codec):
def encode(self,input,errors='strict'):
- return codecs.charmap_encode(input,errors,encoding_map)
+ return codecs.charmap_encode(input,errors,encoding_table)
def decode(self,input,errors='strict'):
- return codecs.charmap_decode(input,errors,decoding_map)
+ return codecs.charmap_decode(input,errors,decoding_table)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
- return codecs.charmap_encode(input,self.errors,encoding_map)[0]
+ return codecs.charmap_encode(input,self.errors,encoding_table)[0]
class IncrementalDecoder(codecs.IncrementalDecoder):
def decode(self, input, final=False):
- return codecs.charmap_decode(input,self.errors,decoding_map)[0]
+ return codecs.charmap_decode(input,self.errors,decoding_table)[0]
class StreamWriter(Codec,codecs.StreamWriter):
pass
@@ -46,107 +46,267 @@ def getregentry():
streamreader=StreamReader,
)
-### Decoding Map
-
-decoding_map = codecs.make_identity_dict(range(256))
-decoding_map.update({
- 0x00a1: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE
- 0x00a2: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- 0x00a3: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE
- 0x00a4: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- 0x00a5: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS
- 0x00a6: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- 0x00a7: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS
- 0x00a8: 0x00b4, # ACUTE ACCENT
- 0x00a9: 0x02cb, # MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)
- 0x00aa: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT
- 0x00ab: 0x00a8, # DIAERESIS
- 0x00ac: 0x02dc, # SMALL TILDE
- 0x00ad: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE
- 0x00ae: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- 0x00af: 0x20a4, # LIRA SIGN
- 0x00b0: 0x00af, # MACRON
- 0x00b1: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE
- 0x00b2: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE
- 0x00b3: 0x00b0, # DEGREE SIGN
- 0x00b4: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA
- 0x00b5: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA
- 0x00b6: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE
- 0x00b7: 0x00f1, # LATIN SMALL LETTER N WITH TILDE
- 0x00b8: 0x00a1, # INVERTED EXCLAMATION MARK
- 0x00b9: 0x00bf, # INVERTED QUESTION MARK
- 0x00ba: 0x00a4, # CURRENCY SIGN
- 0x00bb: 0x00a3, # POUND SIGN
- 0x00bc: 0x00a5, # YEN SIGN
- 0x00bd: 0x00a7, # SECTION SIGN
- 0x00be: 0x0192, # LATIN SMALL LETTER F WITH HOOK
- 0x00bf: 0x00a2, # CENT SIGN
- 0x00c0: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX
- 0x00c1: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX
- 0x00c2: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX
- 0x00c3: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX
- 0x00c4: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE
- 0x00c5: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE
- 0x00c6: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE
- 0x00c7: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE
- 0x00c8: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE
- 0x00c9: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE
- 0x00ca: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE
- 0x00cb: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE
- 0x00cc: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS
- 0x00cd: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS
- 0x00ce: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS
- 0x00cf: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS
- 0x00d0: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE
- 0x00d1: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX
- 0x00d2: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE
- 0x00d3: 0x00c6, # LATIN CAPITAL LETTER AE
- 0x00d4: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE
- 0x00d5: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE
- 0x00d6: 0x00f8, # LATIN SMALL LETTER O WITH STROKE
- 0x00d7: 0x00e6, # LATIN SMALL LETTER AE
- 0x00d8: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS
- 0x00d9: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE
- 0x00da: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS
- 0x00db: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS
- 0x00dc: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE
- 0x00dd: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS
- 0x00de: 0x00df, # LATIN SMALL LETTER SHARP S (German)
- 0x00df: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- 0x00e0: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE
- 0x00e1: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE
- 0x00e2: 0x00e3, # LATIN SMALL LETTER A WITH TILDE
- 0x00e3: 0x00d0, # LATIN CAPITAL LETTER ETH (Icelandic)
- 0x00e4: 0x00f0, # LATIN SMALL LETTER ETH (Icelandic)
- 0x00e5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE
- 0x00e6: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE
- 0x00e7: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE
- 0x00e8: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE
- 0x00e9: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE
- 0x00ea: 0x00f5, # LATIN SMALL LETTER O WITH TILDE
- 0x00eb: 0x0160, # LATIN CAPITAL LETTER S WITH CARON
- 0x00ec: 0x0161, # LATIN SMALL LETTER S WITH CARON
- 0x00ed: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE
- 0x00ee: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS
- 0x00ef: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS
- 0x00f0: 0x00de, # LATIN CAPITAL LETTER THORN (Icelandic)
- 0x00f1: 0x00fe, # LATIN SMALL LETTER THORN (Icelandic)
- 0x00f2: 0x00b7, # MIDDLE DOT
- 0x00f3: 0x00b5, # MICRO SIGN
- 0x00f4: 0x00b6, # PILCROW SIGN
- 0x00f5: 0x00be, # VULGAR FRACTION THREE QUARTERS
- 0x00f6: 0x2014, # EM DASH
- 0x00f7: 0x00bc, # VULGAR FRACTION ONE QUARTER
- 0x00f8: 0x00bd, # VULGAR FRACTION ONE HALF
- 0x00f9: 0x00aa, # FEMININE ORDINAL INDICATOR
- 0x00fa: 0x00ba, # MASCULINE ORDINAL INDICATOR
- 0x00fb: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x00fc: 0x25a0, # BLACK SQUARE
- 0x00fd: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x00fe: 0x00b1, # PLUS-MINUS SIGN
- 0x00ff: None,
-})
-
-### Encoding Map
-
-encoding_map = codecs.make_encoding_map(decoding_map)
+
+### Decoding Table
+
+decoding_table = (
+ '\x00' # 0x00 -> NULL
+ '\x01' # 0x01 -> START OF HEADING
+ '\x02' # 0x02 -> START OF TEXT
+ '\x03' # 0x03 -> END OF TEXT
+ '\x04' # 0x04 -> END OF TRANSMISSION
+ '\x05' # 0x05 -> ENQUIRY
+ '\x06' # 0x06 -> ACKNOWLEDGE
+ '\x07' # 0x07 -> BELL
+ '\x08' # 0x08 -> BACKSPACE
+ '\t' # 0x09 -> HORIZONTAL TABULATION
+ '\n' # 0x0A -> LINE FEED
+ '\x0b' # 0x0B -> VERTICAL TABULATION
+ '\x0c' # 0x0C -> FORM FEED
+ '\r' # 0x0D -> CARRIAGE RETURN
+ '\x0e' # 0x0E -> SHIFT OUT
+ '\x0f' # 0x0F -> SHIFT IN
+ '\x10' # 0x10 -> DATA LINK ESCAPE
+ '\x11' # 0x11 -> DEVICE CONTROL ONE
+ '\x12' # 0x12 -> DEVICE CONTROL TWO
+ '\x13' # 0x13 -> DEVICE CONTROL THREE
+ '\x14' # 0x14 -> DEVICE CONTROL FOUR
+ '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE
+ '\x16' # 0x16 -> SYNCHRONOUS IDLE
+ '\x17' # 0x17 -> END OF TRANSMISSION BLOCK
+ '\x18' # 0x18 -> CANCEL
+ '\x19' # 0x19 -> END OF MEDIUM
+ '\x1a' # 0x1A -> SUBSTITUTE
+ '\x1b' # 0x1B -> ESCAPE
+ '\x1c' # 0x1C -> FILE SEPARATOR
+ '\x1d' # 0x1D -> GROUP SEPARATOR
+ '\x1e' # 0x1E -> RECORD SEPARATOR
+ '\x1f' # 0x1F -> UNIT SEPARATOR
+ ' ' # 0x20 -> SPACE
+ '!' # 0x21 -> EXCLAMATION MARK
+ '"' # 0x22 -> QUOTATION MARK
+ '#' # 0x23 -> NUMBER SIGN
+ '$' # 0x24 -> DOLLAR SIGN
+ '%' # 0x25 -> PERCENT SIGN
+ '&' # 0x26 -> AMPERSAND
+ "'" # 0x27 -> APOSTROPHE
+ '(' # 0x28 -> LEFT PARENTHESIS
+ ')' # 0x29 -> RIGHT PARENTHESIS
+ '*' # 0x2A -> ASTERISK
+ '+' # 0x2B -> PLUS SIGN
+ ',' # 0x2C -> COMMA
+ '-' # 0x2D -> HYPHEN-MINUS
+ '.' # 0x2E -> FULL STOP
+ '/' # 0x2F -> SOLIDUS
+ '0' # 0x30 -> DIGIT ZERO
+ '1' # 0x31 -> DIGIT ONE
+ '2' # 0x32 -> DIGIT TWO
+ '3' # 0x33 -> DIGIT THREE
+ '4' # 0x34 -> DIGIT FOUR
+ '5' # 0x35 -> DIGIT FIVE
+ '6' # 0x36 -> DIGIT SIX
+ '7' # 0x37 -> DIGIT SEVEN
+ '8' # 0x38 -> DIGIT EIGHT
+ '9' # 0x39 -> DIGIT NINE
+ ':' # 0x3A -> COLON
+ ';' # 0x3B -> SEMICOLON
+ '<' # 0x3C -> LESS-THAN SIGN
+ '=' # 0x3D -> EQUALS SIGN
+ '>' # 0x3E -> GREATER-THAN SIGN
+ '?' # 0x3F -> QUESTION MARK
+ '@' # 0x40 -> COMMERCIAL AT
+ 'A' # 0x41 -> LATIN CAPITAL LETTER A
+ 'B' # 0x42 -> LATIN CAPITAL LETTER B
+ 'C' # 0x43 -> LATIN CAPITAL LETTER C
+ 'D' # 0x44 -> LATIN CAPITAL LETTER D
+ 'E' # 0x45 -> LATIN CAPITAL LETTER E
+ 'F' # 0x46 -> LATIN CAPITAL LETTER F
+ 'G' # 0x47 -> LATIN CAPITAL LETTER G
+ 'H' # 0x48 -> LATIN CAPITAL LETTER H
+ 'I' # 0x49 -> LATIN CAPITAL LETTER I
+ 'J' # 0x4A -> LATIN CAPITAL LETTER J
+ 'K' # 0x4B -> LATIN CAPITAL LETTER K
+ 'L' # 0x4C -> LATIN CAPITAL LETTER L
+ 'M' # 0x4D -> LATIN CAPITAL LETTER M
+ 'N' # 0x4E -> LATIN CAPITAL LETTER N
+ 'O' # 0x4F -> LATIN CAPITAL LETTER O
+ 'P' # 0x50 -> LATIN CAPITAL LETTER P
+ 'Q' # 0x51 -> LATIN CAPITAL LETTER Q
+ 'R' # 0x52 -> LATIN CAPITAL LETTER R
+ 'S' # 0x53 -> LATIN CAPITAL LETTER S
+ 'T' # 0x54 -> LATIN CAPITAL LETTER T
+ 'U' # 0x55 -> LATIN CAPITAL LETTER U
+ 'V' # 0x56 -> LATIN CAPITAL LETTER V
+ 'W' # 0x57 -> LATIN CAPITAL LETTER W
+ 'X' # 0x58 -> LATIN CAPITAL LETTER X
+ 'Y' # 0x59 -> LATIN CAPITAL LETTER Y
+ 'Z' # 0x5A -> LATIN CAPITAL LETTER Z
+ '[' # 0x5B -> LEFT SQUARE BRACKET
+ '\\' # 0x5C -> REVERSE SOLIDUS
+ ']' # 0x5D -> RIGHT SQUARE BRACKET
+ '^' # 0x5E -> CIRCUMFLEX ACCENT
+ '_' # 0x5F -> LOW LINE
+ '`' # 0x60 -> GRAVE ACCENT
+ 'a' # 0x61 -> LATIN SMALL LETTER A
+ 'b' # 0x62 -> LATIN SMALL LETTER B
+ 'c' # 0x63 -> LATIN SMALL LETTER C
+ 'd' # 0x64 -> LATIN SMALL LETTER D
+ 'e' # 0x65 -> LATIN SMALL LETTER E
+ 'f' # 0x66 -> LATIN SMALL LETTER F
+ 'g' # 0x67 -> LATIN SMALL LETTER G
+ 'h' # 0x68 -> LATIN SMALL LETTER H
+ 'i' # 0x69 -> LATIN SMALL LETTER I
+ 'j' # 0x6A -> LATIN SMALL LETTER J
+ 'k' # 0x6B -> LATIN SMALL LETTER K
+ 'l' # 0x6C -> LATIN SMALL LETTER L
+ 'm' # 0x6D -> LATIN SMALL LETTER M
+ 'n' # 0x6E -> LATIN SMALL LETTER N
+ 'o' # 0x6F -> LATIN SMALL LETTER O
+ 'p' # 0x70 -> LATIN SMALL LETTER P
+ 'q' # 0x71 -> LATIN SMALL LETTER Q
+ 'r' # 0x72 -> LATIN SMALL LETTER R
+ 's' # 0x73 -> LATIN SMALL LETTER S
+ 't' # 0x74 -> LATIN SMALL LETTER T
+ 'u' # 0x75 -> LATIN SMALL LETTER U
+ 'v' # 0x76 -> LATIN SMALL LETTER V
+ 'w' # 0x77 -> LATIN SMALL LETTER W
+ 'x' # 0x78 -> LATIN SMALL LETTER X
+ 'y' # 0x79 -> LATIN SMALL LETTER Y
+ 'z' # 0x7A -> LATIN SMALL LETTER Z
+ '{' # 0x7B -> LEFT CURLY BRACKET
+ '|' # 0x7C -> VERTICAL LINE
+ '}' # 0x7D -> RIGHT CURLY BRACKET
+ '~' # 0x7E -> TILDE
+ '\x7f' # 0x7F -> DELETE
+ '\x80' # 0x80 -> <control>
+ '\x81' # 0x81 -> <control>
+ '\x82' # 0x82 -> <control>
+ '\x83' # 0x83 -> <control>
+ '\x84' # 0x84 -> <control>
+ '\x85' # 0x85 -> <control>
+ '\x86' # 0x86 -> <control>
+ '\x87' # 0x87 -> <control>
+ '\x88' # 0x88 -> <control>
+ '\x89' # 0x89 -> <control>
+ '\x8a' # 0x8A -> <control>
+ '\x8b' # 0x8B -> <control>
+ '\x8c' # 0x8C -> <control>
+ '\x8d' # 0x8D -> <control>
+ '\x8e' # 0x8E -> <control>
+ '\x8f' # 0x8F -> <control>
+ '\x90' # 0x90 -> <control>
+ '\x91' # 0x91 -> <control>
+ '\x92' # 0x92 -> <control>
+ '\x93' # 0x93 -> <control>
+ '\x94' # 0x94 -> <control>
+ '\x95' # 0x95 -> <control>
+ '\x96' # 0x96 -> <control>
+ '\x97' # 0x97 -> <control>
+ '\x98' # 0x98 -> <control>
+ '\x99' # 0x99 -> <control>
+ '\x9a' # 0x9A -> <control>
+ '\x9b' # 0x9B -> <control>
+ '\x9c' # 0x9C -> <control>
+ '\x9d' # 0x9D -> <control>
+ '\x9e' # 0x9E -> <control>
+ '\x9f' # 0x9F -> <control>
+ '\xa0' # 0xA0 -> NO-BREAK SPACE
+ '\xc0' # 0xA1 -> LATIN CAPITAL LETTER A WITH GRAVE
+ '\xc2' # 0xA2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ '\xc8' # 0xA3 -> LATIN CAPITAL LETTER E WITH GRAVE
+ '\xca' # 0xA4 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ '\xcb' # 0xA5 -> LATIN CAPITAL LETTER E WITH DIAERESIS
+ '\xce' # 0xA6 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ '\xcf' # 0xA7 -> LATIN CAPITAL LETTER I WITH DIAERESIS
+ '\xb4' # 0xA8 -> ACUTE ACCENT
+ '\u02cb' # 0xA9 -> MODIFIER LETTER GRAVE ACCENT (MANDARIN CHINESE FOURTH TONE)
+ '\u02c6' # 0xAA -> MODIFIER LETTER CIRCUMFLEX ACCENT
+ '\xa8' # 0xAB -> DIAERESIS
+ '\u02dc' # 0xAC -> SMALL TILDE
+ '\xd9' # 0xAD -> LATIN CAPITAL LETTER U WITH GRAVE
+ '\xdb' # 0xAE -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ '\u20a4' # 0xAF -> LIRA SIGN
+ '\xaf' # 0xB0 -> MACRON
+ '\xdd' # 0xB1 -> LATIN CAPITAL LETTER Y WITH ACUTE
+ '\xfd' # 0xB2 -> LATIN SMALL LETTER Y WITH ACUTE
+ '\xb0' # 0xB3 -> DEGREE SIGN
+ '\xc7' # 0xB4 -> LATIN CAPITAL LETTER C WITH CEDILLA
+ '\xe7' # 0xB5 -> LATIN SMALL LETTER C WITH CEDILLA
+ '\xd1' # 0xB6 -> LATIN CAPITAL LETTER N WITH TILDE
+ '\xf1' # 0xB7 -> LATIN SMALL LETTER N WITH TILDE
+ '\xa1' # 0xB8 -> INVERTED EXCLAMATION MARK
+ '\xbf' # 0xB9 -> INVERTED QUESTION MARK
+ '\xa4' # 0xBA -> CURRENCY SIGN
+ '\xa3' # 0xBB -> POUND SIGN
+ '\xa5' # 0xBC -> YEN SIGN
+ '\xa7' # 0xBD -> SECTION SIGN
+ '\u0192' # 0xBE -> LATIN SMALL LETTER F WITH HOOK
+ '\xa2' # 0xBF -> CENT SIGN
+ '\xe2' # 0xC0 -> LATIN SMALL LETTER A WITH CIRCUMFLEX
+ '\xea' # 0xC1 -> LATIN SMALL LETTER E WITH CIRCUMFLEX
+ '\xf4' # 0xC2 -> LATIN SMALL LETTER O WITH CIRCUMFLEX
+ '\xfb' # 0xC3 -> LATIN SMALL LETTER U WITH CIRCUMFLEX
+ '\xe1' # 0xC4 -> LATIN SMALL LETTER A WITH ACUTE
+ '\xe9' # 0xC5 -> LATIN SMALL LETTER E WITH ACUTE
+ '\xf3' # 0xC6 -> LATIN SMALL LETTER O WITH ACUTE
+ '\xfa' # 0xC7 -> LATIN SMALL LETTER U WITH ACUTE
+ '\xe0' # 0xC8 -> LATIN SMALL LETTER A WITH GRAVE
+ '\xe8' # 0xC9 -> LATIN SMALL LETTER E WITH GRAVE
+ '\xf2' # 0xCA -> LATIN SMALL LETTER O WITH GRAVE
+ '\xf9' # 0xCB -> LATIN SMALL LETTER U WITH GRAVE
+ '\xe4' # 0xCC -> LATIN SMALL LETTER A WITH DIAERESIS
+ '\xeb' # 0xCD -> LATIN SMALL LETTER E WITH DIAERESIS
+ '\xf6' # 0xCE -> LATIN SMALL LETTER O WITH DIAERESIS
+ '\xfc' # 0xCF -> LATIN SMALL LETTER U WITH DIAERESIS
+ '\xc5' # 0xD0 -> LATIN CAPITAL LETTER A WITH RING ABOVE
+ '\xee' # 0xD1 -> LATIN SMALL LETTER I WITH CIRCUMFLEX
+ '\xd8' # 0xD2 -> LATIN CAPITAL LETTER O WITH STROKE
+ '\xc6' # 0xD3 -> LATIN CAPITAL LETTER AE
+ '\xe5' # 0xD4 -> LATIN SMALL LETTER A WITH RING ABOVE
+ '\xed' # 0xD5 -> LATIN SMALL LETTER I WITH ACUTE
+ '\xf8' # 0xD6 -> LATIN SMALL LETTER O WITH STROKE
+ '\xe6' # 0xD7 -> LATIN SMALL LETTER AE
+ '\xc4' # 0xD8 -> LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\xec' # 0xD9 -> LATIN SMALL LETTER I WITH GRAVE
+ '\xd6' # 0xDA -> LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\xdc' # 0xDB -> LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\xc9' # 0xDC -> LATIN CAPITAL LETTER E WITH ACUTE
+ '\xef' # 0xDD -> LATIN SMALL LETTER I WITH DIAERESIS
+ '\xdf' # 0xDE -> LATIN SMALL LETTER SHARP S (GERMAN)
+ '\xd4' # 0xDF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ '\xc1' # 0xE0 -> LATIN CAPITAL LETTER A WITH ACUTE
+ '\xc3' # 0xE1 -> LATIN CAPITAL LETTER A WITH TILDE
+ '\xe3' # 0xE2 -> LATIN SMALL LETTER A WITH TILDE
+ '\xd0' # 0xE3 -> LATIN CAPITAL LETTER ETH (ICELANDIC)
+ '\xf0' # 0xE4 -> LATIN SMALL LETTER ETH (ICELANDIC)
+ '\xcd' # 0xE5 -> LATIN CAPITAL LETTER I WITH ACUTE
+ '\xcc' # 0xE6 -> LATIN CAPITAL LETTER I WITH GRAVE
+ '\xd3' # 0xE7 -> LATIN CAPITAL LETTER O WITH ACUTE
+ '\xd2' # 0xE8 -> LATIN CAPITAL LETTER O WITH GRAVE
+ '\xd5' # 0xE9 -> LATIN CAPITAL LETTER O WITH TILDE
+ '\xf5' # 0xEA -> LATIN SMALL LETTER O WITH TILDE
+ '\u0160' # 0xEB -> LATIN CAPITAL LETTER S WITH CARON
+ '\u0161' # 0xEC -> LATIN SMALL LETTER S WITH CARON
+ '\xda' # 0xED -> LATIN CAPITAL LETTER U WITH ACUTE
+ '\u0178' # 0xEE -> LATIN CAPITAL LETTER Y WITH DIAERESIS
+ '\xff' # 0xEF -> LATIN SMALL LETTER Y WITH DIAERESIS
+ '\xde' # 0xF0 -> LATIN CAPITAL LETTER THORN (ICELANDIC)
+ '\xfe' # 0xF1 -> LATIN SMALL LETTER THORN (ICELANDIC)
+ '\xb7' # 0xF2 -> MIDDLE DOT
+ '\xb5' # 0xF3 -> MICRO SIGN
+ '\xb6' # 0xF4 -> PILCROW SIGN
+ '\xbe' # 0xF5 -> VULGAR FRACTION THREE QUARTERS
+ '\u2014' # 0xF6 -> EM DASH
+ '\xbc' # 0xF7 -> VULGAR FRACTION ONE QUARTER
+ '\xbd' # 0xF8 -> VULGAR FRACTION ONE HALF
+ '\xaa' # 0xF9 -> FEMININE ORDINAL INDICATOR
+ '\xba' # 0xFA -> MASCULINE ORDINAL INDICATOR
+ '\xab' # 0xFB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u25a0' # 0xFC -> BLACK SQUARE
+ '\xbb' # 0xFD -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\xb1' # 0xFE -> PLUS-MINUS SIGN
+ '\ufffe'
+)
+
+### Encoding table
+encoding_table=codecs.charmap_build(decoding_table)
diff --git a/Lib/encodings/idna.py b/Lib/encodings/idna.py
index 583bdf1..ea40585 100644
--- a/Lib/encodings/idna.py
+++ b/Lib/encodings/idna.py
@@ -153,6 +153,20 @@ class Codec(codecs.Codec):
if not input:
return b'', 0
+ try:
+ result = input.encode('ascii')
+ except UnicodeEncodeError:
+ pass
+ else:
+ # ASCII name: fast path
+ labels = result.split(b'.')
+ for label in labels[:-1]:
+ if not (0 < len(label) < 64):
+ raise UnicodeError("label empty or too long")
+ if len(labels[-1]) >= 64:
+ raise UnicodeError("label too long")
+ return result, len(input)
+
result = bytearray()
labels = dots.split(input)
if labels and not labels[-1]:
@@ -179,6 +193,14 @@ class Codec(codecs.Codec):
if not isinstance(input, bytes):
# XXX obviously wrong, see #3232
input = bytes(input)
+
+ if ace_prefix not in input:
+ # Fast path
+ try:
+ return input.decode('ascii'), len(input)
+ except UnicodeDecodeError:
+ pass
+
labels = input.split(b".")
if labels and len(labels[-1]) == 0:
diff --git a/Lib/encodings/iso8859_1.py b/Lib/encodings/iso8859_1.py
index 8cfc01f..d9cc516 100644
--- a/Lib/encodings/iso8859_1.py
+++ b/Lib/encodings/iso8859_1.py
@@ -301,6 +301,7 @@ decoding_table = (
'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE
'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic)
'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS
+ '\ufffe' ## Widen to UCS2 for optimization
)
### Encoding table
diff --git a/Lib/encodings/mac_latin2.py b/Lib/encodings/mac_latin2.py
index e322be2..da9d4b1 100644
--- a/Lib/encodings/mac_latin2.py
+++ b/Lib/encodings/mac_latin2.py
@@ -1,4 +1,4 @@
-""" Python Character Mapping Codec generated from 'LATIN2.TXT' with gencodec.py.
+""" Python Character Mapping Codec mac_latin2 generated from 'MAPPINGS/VENDORS/MICSFT/MAC/LATIN2.TXT' with gencodec.py.
Written by Marc-Andre Lemburg (mal@lemburg.com).
@@ -14,18 +14,18 @@ import codecs
class Codec(codecs.Codec):
def encode(self,input,errors='strict'):
- return codecs.charmap_encode(input,errors,encoding_map)
+ return codecs.charmap_encode(input,errors,encoding_table)
def decode(self,input,errors='strict'):
- return codecs.charmap_decode(input,errors,decoding_map)
+ return codecs.charmap_decode(input,errors,decoding_table)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
- return codecs.charmap_encode(input,self.errors,encoding_map)[0]
+ return codecs.charmap_encode(input,self.errors,encoding_table)[0]
class IncrementalDecoder(codecs.IncrementalDecoder):
def decode(self, input, final=False):
- return codecs.charmap_decode(input,self.errors,decoding_map)[0]
+ return codecs.charmap_decode(input,self.errors,decoding_table)[0]
class StreamWriter(Codec,codecs.StreamWriter):
pass
@@ -46,138 +46,267 @@ def getregentry():
streamwriter=StreamWriter,
)
-### Decoding Map
-
-decoding_map = codecs.make_identity_dict(range(256))
-decoding_map.update({
- 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS
- 0x0081: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON
- 0x0082: 0x0101, # LATIN SMALL LETTER A WITH MACRON
- 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE
- 0x0084: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK
- 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS
- 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS
- 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE
- 0x0088: 0x0105, # LATIN SMALL LETTER A WITH OGONEK
- 0x0089: 0x010c, # LATIN CAPITAL LETTER C WITH CARON
- 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS
- 0x008b: 0x010d, # LATIN SMALL LETTER C WITH CARON
- 0x008c: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE
- 0x008d: 0x0107, # LATIN SMALL LETTER C WITH ACUTE
- 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE
- 0x008f: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE
- 0x0090: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE
- 0x0091: 0x010e, # LATIN CAPITAL LETTER D WITH CARON
- 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE
- 0x0093: 0x010f, # LATIN SMALL LETTER D WITH CARON
- 0x0094: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON
- 0x0095: 0x0113, # LATIN SMALL LETTER E WITH MACRON
- 0x0096: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE
- 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE
- 0x0098: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE
- 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX
- 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS
- 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE
- 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE
- 0x009d: 0x011a, # LATIN CAPITAL LETTER E WITH CARON
- 0x009e: 0x011b, # LATIN SMALL LETTER E WITH CARON
- 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS
- 0x00a0: 0x2020, # DAGGER
- 0x00a1: 0x00b0, # DEGREE SIGN
- 0x00a2: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK
- 0x00a4: 0x00a7, # SECTION SIGN
- 0x00a5: 0x2022, # BULLET
- 0x00a6: 0x00b6, # PILCROW SIGN
- 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S
- 0x00a8: 0x00ae, # REGISTERED SIGN
- 0x00aa: 0x2122, # TRADE MARK SIGN
- 0x00ab: 0x0119, # LATIN SMALL LETTER E WITH OGONEK
- 0x00ac: 0x00a8, # DIAERESIS
- 0x00ad: 0x2260, # NOT EQUAL TO
- 0x00ae: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA
- 0x00af: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK
- 0x00b0: 0x012f, # LATIN SMALL LETTER I WITH OGONEK
- 0x00b1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON
- 0x00b2: 0x2264, # LESS-THAN OR EQUAL TO
- 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO
- 0x00b4: 0x012b, # LATIN SMALL LETTER I WITH MACRON
- 0x00b5: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA
- 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL
- 0x00b7: 0x2211, # N-ARY SUMMATION
- 0x00b8: 0x0142, # LATIN SMALL LETTER L WITH STROKE
- 0x00b9: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA
- 0x00ba: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA
- 0x00bb: 0x013d, # LATIN CAPITAL LETTER L WITH CARON
- 0x00bc: 0x013e, # LATIN SMALL LETTER L WITH CARON
- 0x00bd: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE
- 0x00be: 0x013a, # LATIN SMALL LETTER L WITH ACUTE
- 0x00bf: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA
- 0x00c0: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA
- 0x00c1: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE
- 0x00c2: 0x00ac, # NOT SIGN
- 0x00c3: 0x221a, # SQUARE ROOT
- 0x00c4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE
- 0x00c5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON
- 0x00c6: 0x2206, # INCREMENT
- 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS
- 0x00ca: 0x00a0, # NO-BREAK SPACE
- 0x00cb: 0x0148, # LATIN SMALL LETTER N WITH CARON
- 0x00cc: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
- 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE
- 0x00ce: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE
- 0x00cf: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON
- 0x00d0: 0x2013, # EN DASH
- 0x00d1: 0x2014, # EM DASH
- 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK
- 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK
- 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK
- 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK
- 0x00d6: 0x00f7, # DIVISION SIGN
- 0x00d7: 0x25ca, # LOZENGE
- 0x00d8: 0x014d, # LATIN SMALL LETTER O WITH MACRON
- 0x00d9: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE
- 0x00da: 0x0155, # LATIN SMALL LETTER R WITH ACUTE
- 0x00db: 0x0158, # LATIN CAPITAL LETTER R WITH CARON
- 0x00dc: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- 0x00dd: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- 0x00de: 0x0159, # LATIN SMALL LETTER R WITH CARON
- 0x00df: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA
- 0x00e0: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA
- 0x00e1: 0x0160, # LATIN CAPITAL LETTER S WITH CARON
- 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK
- 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK
- 0x00e4: 0x0161, # LATIN SMALL LETTER S WITH CARON
- 0x00e5: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE
- 0x00e6: 0x015b, # LATIN SMALL LETTER S WITH ACUTE
- 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE
- 0x00e8: 0x0164, # LATIN CAPITAL LETTER T WITH CARON
- 0x00e9: 0x0165, # LATIN SMALL LETTER T WITH CARON
- 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE
- 0x00eb: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON
- 0x00ec: 0x017e, # LATIN SMALL LETTER Z WITH CARON
- 0x00ed: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON
- 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE
- 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- 0x00f0: 0x016b, # LATIN SMALL LETTER U WITH MACRON
- 0x00f1: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE
- 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE
- 0x00f3: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE
- 0x00f4: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
- 0x00f5: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE
- 0x00f6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK
- 0x00f7: 0x0173, # LATIN SMALL LETTER U WITH OGONEK
- 0x00f8: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE
- 0x00f9: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE
- 0x00fa: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA
- 0x00fb: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE
- 0x00fc: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE
- 0x00fd: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE
- 0x00fe: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA
- 0x00ff: 0x02c7, # CARON
-})
-
-### Encoding Map
-
-encoding_map = codecs.make_encoding_map(decoding_map)
+
+### Decoding Table
+
+decoding_table = (
+ '\x00' # 0x00 -> NULL
+ '\x01' # 0x01 -> START OF HEADING
+ '\x02' # 0x02 -> START OF TEXT
+ '\x03' # 0x03 -> END OF TEXT
+ '\x04' # 0x04 -> END OF TRANSMISSION
+ '\x05' # 0x05 -> ENQUIRY
+ '\x06' # 0x06 -> ACKNOWLEDGE
+ '\x07' # 0x07 -> BELL
+ '\x08' # 0x08 -> BACKSPACE
+ '\t' # 0x09 -> HORIZONTAL TABULATION
+ '\n' # 0x0A -> LINE FEED
+ '\x0b' # 0x0B -> VERTICAL TABULATION
+ '\x0c' # 0x0C -> FORM FEED
+ '\r' # 0x0D -> CARRIAGE RETURN
+ '\x0e' # 0x0E -> SHIFT OUT
+ '\x0f' # 0x0F -> SHIFT IN
+ '\x10' # 0x10 -> DATA LINK ESCAPE
+ '\x11' # 0x11 -> DEVICE CONTROL ONE
+ '\x12' # 0x12 -> DEVICE CONTROL TWO
+ '\x13' # 0x13 -> DEVICE CONTROL THREE
+ '\x14' # 0x14 -> DEVICE CONTROL FOUR
+ '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE
+ '\x16' # 0x16 -> SYNCHRONOUS IDLE
+ '\x17' # 0x17 -> END OF TRANSMISSION BLOCK
+ '\x18' # 0x18 -> CANCEL
+ '\x19' # 0x19 -> END OF MEDIUM
+ '\x1a' # 0x1A -> SUBSTITUTE
+ '\x1b' # 0x1B -> ESCAPE
+ '\x1c' # 0x1C -> FILE SEPARATOR
+ '\x1d' # 0x1D -> GROUP SEPARATOR
+ '\x1e' # 0x1E -> RECORD SEPARATOR
+ '\x1f' # 0x1F -> UNIT SEPARATOR
+ ' ' # 0x20 -> SPACE
+ '!' # 0x21 -> EXCLAMATION MARK
+ '"' # 0x22 -> QUOTATION MARK
+ '#' # 0x23 -> NUMBER SIGN
+ '$' # 0x24 -> DOLLAR SIGN
+ '%' # 0x25 -> PERCENT SIGN
+ '&' # 0x26 -> AMPERSAND
+ "'" # 0x27 -> APOSTROPHE
+ '(' # 0x28 -> LEFT PARENTHESIS
+ ')' # 0x29 -> RIGHT PARENTHESIS
+ '*' # 0x2A -> ASTERISK
+ '+' # 0x2B -> PLUS SIGN
+ ',' # 0x2C -> COMMA
+ '-' # 0x2D -> HYPHEN-MINUS
+ '.' # 0x2E -> FULL STOP
+ '/' # 0x2F -> SOLIDUS
+ '0' # 0x30 -> DIGIT ZERO
+ '1' # 0x31 -> DIGIT ONE
+ '2' # 0x32 -> DIGIT TWO
+ '3' # 0x33 -> DIGIT THREE
+ '4' # 0x34 -> DIGIT FOUR
+ '5' # 0x35 -> DIGIT FIVE
+ '6' # 0x36 -> DIGIT SIX
+ '7' # 0x37 -> DIGIT SEVEN
+ '8' # 0x38 -> DIGIT EIGHT
+ '9' # 0x39 -> DIGIT NINE
+ ':' # 0x3A -> COLON
+ ';' # 0x3B -> SEMICOLON
+ '<' # 0x3C -> LESS-THAN SIGN
+ '=' # 0x3D -> EQUALS SIGN
+ '>' # 0x3E -> GREATER-THAN SIGN
+ '?' # 0x3F -> QUESTION MARK
+ '@' # 0x40 -> COMMERCIAL AT
+ 'A' # 0x41 -> LATIN CAPITAL LETTER A
+ 'B' # 0x42 -> LATIN CAPITAL LETTER B
+ 'C' # 0x43 -> LATIN CAPITAL LETTER C
+ 'D' # 0x44 -> LATIN CAPITAL LETTER D
+ 'E' # 0x45 -> LATIN CAPITAL LETTER E
+ 'F' # 0x46 -> LATIN CAPITAL LETTER F
+ 'G' # 0x47 -> LATIN CAPITAL LETTER G
+ 'H' # 0x48 -> LATIN CAPITAL LETTER H
+ 'I' # 0x49 -> LATIN CAPITAL LETTER I
+ 'J' # 0x4A -> LATIN CAPITAL LETTER J
+ 'K' # 0x4B -> LATIN CAPITAL LETTER K
+ 'L' # 0x4C -> LATIN CAPITAL LETTER L
+ 'M' # 0x4D -> LATIN CAPITAL LETTER M
+ 'N' # 0x4E -> LATIN CAPITAL LETTER N
+ 'O' # 0x4F -> LATIN CAPITAL LETTER O
+ 'P' # 0x50 -> LATIN CAPITAL LETTER P
+ 'Q' # 0x51 -> LATIN CAPITAL LETTER Q
+ 'R' # 0x52 -> LATIN CAPITAL LETTER R
+ 'S' # 0x53 -> LATIN CAPITAL LETTER S
+ 'T' # 0x54 -> LATIN CAPITAL LETTER T
+ 'U' # 0x55 -> LATIN CAPITAL LETTER U
+ 'V' # 0x56 -> LATIN CAPITAL LETTER V
+ 'W' # 0x57 -> LATIN CAPITAL LETTER W
+ 'X' # 0x58 -> LATIN CAPITAL LETTER X
+ 'Y' # 0x59 -> LATIN CAPITAL LETTER Y
+ 'Z' # 0x5A -> LATIN CAPITAL LETTER Z
+ '[' # 0x5B -> LEFT SQUARE BRACKET
+ '\\' # 0x5C -> REVERSE SOLIDUS
+ ']' # 0x5D -> RIGHT SQUARE BRACKET
+ '^' # 0x5E -> CIRCUMFLEX ACCENT
+ '_' # 0x5F -> LOW LINE
+ '`' # 0x60 -> GRAVE ACCENT
+ 'a' # 0x61 -> LATIN SMALL LETTER A
+ 'b' # 0x62 -> LATIN SMALL LETTER B
+ 'c' # 0x63 -> LATIN SMALL LETTER C
+ 'd' # 0x64 -> LATIN SMALL LETTER D
+ 'e' # 0x65 -> LATIN SMALL LETTER E
+ 'f' # 0x66 -> LATIN SMALL LETTER F
+ 'g' # 0x67 -> LATIN SMALL LETTER G
+ 'h' # 0x68 -> LATIN SMALL LETTER H
+ 'i' # 0x69 -> LATIN SMALL LETTER I
+ 'j' # 0x6A -> LATIN SMALL LETTER J
+ 'k' # 0x6B -> LATIN SMALL LETTER K
+ 'l' # 0x6C -> LATIN SMALL LETTER L
+ 'm' # 0x6D -> LATIN SMALL LETTER M
+ 'n' # 0x6E -> LATIN SMALL LETTER N
+ 'o' # 0x6F -> LATIN SMALL LETTER O
+ 'p' # 0x70 -> LATIN SMALL LETTER P
+ 'q' # 0x71 -> LATIN SMALL LETTER Q
+ 'r' # 0x72 -> LATIN SMALL LETTER R
+ 's' # 0x73 -> LATIN SMALL LETTER S
+ 't' # 0x74 -> LATIN SMALL LETTER T
+ 'u' # 0x75 -> LATIN SMALL LETTER U
+ 'v' # 0x76 -> LATIN SMALL LETTER V
+ 'w' # 0x77 -> LATIN SMALL LETTER W
+ 'x' # 0x78 -> LATIN SMALL LETTER X
+ 'y' # 0x79 -> LATIN SMALL LETTER Y
+ 'z' # 0x7A -> LATIN SMALL LETTER Z
+ '{' # 0x7B -> LEFT CURLY BRACKET
+ '|' # 0x7C -> VERTICAL LINE
+ '}' # 0x7D -> RIGHT CURLY BRACKET
+ '~' # 0x7E -> TILDE
+ '\x7f' # 0x7F -> DELETE
+ '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON
+ '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON
+ '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE
+ '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK
+ '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE
+ '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK
+ '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON
+ '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS
+ '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON
+ '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE
+ '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE
+ '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE
+ '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE
+ '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE
+ '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON
+ '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE
+ '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON
+ '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON
+ '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON
+ '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE
+ '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE
+ '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE
+ '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX
+ '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS
+ '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE
+ '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE
+ '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON
+ '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON
+ '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS
+ '\u2020' # 0xA0 -> DAGGER
+ '\xb0' # 0xA1 -> DEGREE SIGN
+ '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK
+ '\xa3' # 0xA3 -> POUND SIGN
+ '\xa7' # 0xA4 -> SECTION SIGN
+ '\u2022' # 0xA5 -> BULLET
+ '\xb6' # 0xA6 -> PILCROW SIGN
+ '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S
+ '\xae' # 0xA8 -> REGISTERED SIGN
+ '\xa9' # 0xA9 -> COPYRIGHT SIGN
+ '\u2122' # 0xAA -> TRADE MARK SIGN
+ '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK
+ '\xa8' # 0xAC -> DIAERESIS
+ '\u2260' # 0xAD -> NOT EQUAL TO
+ '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA
+ '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK
+ '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK
+ '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON
+ '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO
+ '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO
+ '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON
+ '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA
+ '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL
+ '\u2211' # 0xB7 -> N-ARY SUMMATION
+ '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE
+ '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA
+ '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA
+ '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON
+ '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON
+ '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE
+ '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE
+ '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA
+ '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA
+ '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE
+ '\xac' # 0xC2 -> NOT SIGN
+ '\u221a' # 0xC3 -> SQUARE ROOT
+ '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE
+ '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON
+ '\u2206' # 0xC6 -> INCREMENT
+ '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS
+ '\xa0' # 0xCA -> NO-BREAK SPACE
+ '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON
+ '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE
+ '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON
+ '\u2013' # 0xD0 -> EN DASH
+ '\u2014' # 0xD1 -> EM DASH
+ '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK
+ '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK
+ '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK
+ '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK
+ '\xf7' # 0xD6 -> DIVISION SIGN
+ '\u25ca' # 0xD7 -> LOZENGE
+ '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON
+ '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE
+ '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE
+ '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON
+ '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON
+ '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA
+ '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA
+ '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON
+ '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK
+ '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK
+ '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON
+ '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE
+ '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE
+ '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE
+ '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON
+ '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON
+ '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE
+ '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON
+ '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON
+ '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON
+ '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE
+ '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON
+ '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE
+ '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE
+ '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE
+ '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK
+ '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK
+ '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE
+ '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE
+ '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA
+ '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE
+ '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE
+ '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA
+ '\u02c7' # 0xFF -> CARON
+)
+
+### Encoding table
+encoding_table=codecs.charmap_build(decoding_table)
diff --git a/Lib/encodings/palmos.py b/Lib/encodings/palmos.py
index 4b77e2b..c506d65 100644
--- a/Lib/encodings/palmos.py
+++ b/Lib/encodings/palmos.py
@@ -10,18 +10,18 @@ import codecs
class Codec(codecs.Codec):
def encode(self,input,errors='strict'):
- return codecs.charmap_encode(input,errors,encoding_map)
+ return codecs.charmap_encode(input,errors,encoding_table)
def decode(self,input,errors='strict'):
- return codecs.charmap_decode(input,errors,decoding_map)
+ return codecs.charmap_decode(input,errors,decoding_table)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
- return codecs.charmap_encode(input,self.errors,encoding_map)[0]
+ return codecs.charmap_encode(input,self.errors,encoding_table)[0]
class IncrementalDecoder(codecs.IncrementalDecoder):
def decode(self, input, final=False):
- return codecs.charmap_decode(input,self.errors,decoding_map)[0]
+ return codecs.charmap_decode(input,self.errors,decoding_table)[0]
class StreamWriter(Codec,codecs.StreamWriter):
pass
@@ -42,42 +42,267 @@ def getregentry():
streamwriter=StreamWriter,
)
-### Decoding Map
-
-decoding_map = codecs.make_identity_dict(range(256))
-
-# The PalmOS character set is mostly iso-8859-1 with some differences.
-decoding_map.update({
- 0x0080: 0x20ac, # EURO SIGN
- 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK
- 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK
- 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK
- 0x0085: 0x2026, # HORIZONTAL ELLIPSIS
- 0x0086: 0x2020, # DAGGER
- 0x0087: 0x2021, # DOUBLE DAGGER
- 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT
- 0x0089: 0x2030, # PER MILLE SIGN
- 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON
- 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE
- 0x008d: 0x2666, # BLACK DIAMOND SUIT
- 0x008e: 0x2663, # BLACK CLUB SUIT
- 0x008f: 0x2665, # BLACK HEART SUIT
- 0x0090: 0x2660, # BLACK SPADE SUIT
- 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK
- 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK
- 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK
- 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK
- 0x0095: 0x2022, # BULLET
- 0x0096: 0x2013, # EN DASH
- 0x0097: 0x2014, # EM DASH
- 0x0098: 0x02dc, # SMALL TILDE
- 0x0099: 0x2122, # TRADE MARK SIGN
- 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON
- 0x009c: 0x0153, # LATIN SMALL LIGATURE OE
- 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS
-})
-
-### Encoding Map
-
-encoding_map = codecs.make_encoding_map(decoding_map)
+
+### Decoding Table
+
+decoding_table = (
+ '\x00' # 0x00 -> NULL
+ '\x01' # 0x01 -> START OF HEADING
+ '\x02' # 0x02 -> START OF TEXT
+ '\x03' # 0x03 -> END OF TEXT
+ '\x04' # 0x04 -> END OF TRANSMISSION
+ '\x05' # 0x05 -> ENQUIRY
+ '\x06' # 0x06 -> ACKNOWLEDGE
+ '\x07' # 0x07 -> BELL
+ '\x08' # 0x08 -> BACKSPACE
+ '\t' # 0x09 -> HORIZONTAL TABULATION
+ '\n' # 0x0A -> LINE FEED
+ '\x0b' # 0x0B -> VERTICAL TABULATION
+ '\x0c' # 0x0C -> FORM FEED
+ '\r' # 0x0D -> CARRIAGE RETURN
+ '\x0e' # 0x0E -> SHIFT OUT
+ '\x0f' # 0x0F -> SHIFT IN
+ '\x10' # 0x10 -> DATA LINK ESCAPE
+ '\x11' # 0x11 -> DEVICE CONTROL ONE
+ '\x12' # 0x12 -> DEVICE CONTROL TWO
+ '\x13' # 0x13 -> DEVICE CONTROL THREE
+ '\x14' # 0x14 -> DEVICE CONTROL FOUR
+ '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE
+ '\x16' # 0x16 -> SYNCHRONOUS IDLE
+ '\x17' # 0x17 -> END OF TRANSMISSION BLOCK
+ '\x18' # 0x18 -> CANCEL
+ '\x19' # 0x19 -> END OF MEDIUM
+ '\x1a' # 0x1A -> SUBSTITUTE
+ '\x1b' # 0x1B -> ESCAPE
+ '\x1c' # 0x1C -> FILE SEPARATOR
+ '\x1d' # 0x1D -> GROUP SEPARATOR
+ '\x1e' # 0x1E -> RECORD SEPARATOR
+ '\x1f' # 0x1F -> UNIT SEPARATOR
+ ' ' # 0x20 -> SPACE
+ '!' # 0x21 -> EXCLAMATION MARK
+ '"' # 0x22 -> QUOTATION MARK
+ '#' # 0x23 -> NUMBER SIGN
+ '$' # 0x24 -> DOLLAR SIGN
+ '%' # 0x25 -> PERCENT SIGN
+ '&' # 0x26 -> AMPERSAND
+ "'" # 0x27 -> APOSTROPHE
+ '(' # 0x28 -> LEFT PARENTHESIS
+ ')' # 0x29 -> RIGHT PARENTHESIS
+ '*' # 0x2A -> ASTERISK
+ '+' # 0x2B -> PLUS SIGN
+ ',' # 0x2C -> COMMA
+ '-' # 0x2D -> HYPHEN-MINUS
+ '.' # 0x2E -> FULL STOP
+ '/' # 0x2F -> SOLIDUS
+ '0' # 0x30 -> DIGIT ZERO
+ '1' # 0x31 -> DIGIT ONE
+ '2' # 0x32 -> DIGIT TWO
+ '3' # 0x33 -> DIGIT THREE
+ '4' # 0x34 -> DIGIT FOUR
+ '5' # 0x35 -> DIGIT FIVE
+ '6' # 0x36 -> DIGIT SIX
+ '7' # 0x37 -> DIGIT SEVEN
+ '8' # 0x38 -> DIGIT EIGHT
+ '9' # 0x39 -> DIGIT NINE
+ ':' # 0x3A -> COLON
+ ';' # 0x3B -> SEMICOLON
+ '<' # 0x3C -> LESS-THAN SIGN
+ '=' # 0x3D -> EQUALS SIGN
+ '>' # 0x3E -> GREATER-THAN SIGN
+ '?' # 0x3F -> QUESTION MARK
+ '@' # 0x40 -> COMMERCIAL AT
+ 'A' # 0x41 -> LATIN CAPITAL LETTER A
+ 'B' # 0x42 -> LATIN CAPITAL LETTER B
+ 'C' # 0x43 -> LATIN CAPITAL LETTER C
+ 'D' # 0x44 -> LATIN CAPITAL LETTER D
+ 'E' # 0x45 -> LATIN CAPITAL LETTER E
+ 'F' # 0x46 -> LATIN CAPITAL LETTER F
+ 'G' # 0x47 -> LATIN CAPITAL LETTER G
+ 'H' # 0x48 -> LATIN CAPITAL LETTER H
+ 'I' # 0x49 -> LATIN CAPITAL LETTER I
+ 'J' # 0x4A -> LATIN CAPITAL LETTER J
+ 'K' # 0x4B -> LATIN CAPITAL LETTER K
+ 'L' # 0x4C -> LATIN CAPITAL LETTER L
+ 'M' # 0x4D -> LATIN CAPITAL LETTER M
+ 'N' # 0x4E -> LATIN CAPITAL LETTER N
+ 'O' # 0x4F -> LATIN CAPITAL LETTER O
+ 'P' # 0x50 -> LATIN CAPITAL LETTER P
+ 'Q' # 0x51 -> LATIN CAPITAL LETTER Q
+ 'R' # 0x52 -> LATIN CAPITAL LETTER R
+ 'S' # 0x53 -> LATIN CAPITAL LETTER S
+ 'T' # 0x54 -> LATIN CAPITAL LETTER T
+ 'U' # 0x55 -> LATIN CAPITAL LETTER U
+ 'V' # 0x56 -> LATIN CAPITAL LETTER V
+ 'W' # 0x57 -> LATIN CAPITAL LETTER W
+ 'X' # 0x58 -> LATIN CAPITAL LETTER X
+ 'Y' # 0x59 -> LATIN CAPITAL LETTER Y
+ 'Z' # 0x5A -> LATIN CAPITAL LETTER Z
+ '[' # 0x5B -> LEFT SQUARE BRACKET
+ '\\' # 0x5C -> REVERSE SOLIDUS
+ ']' # 0x5D -> RIGHT SQUARE BRACKET
+ '^' # 0x5E -> CIRCUMFLEX ACCENT
+ '_' # 0x5F -> LOW LINE
+ '`' # 0x60 -> GRAVE ACCENT
+ 'a' # 0x61 -> LATIN SMALL LETTER A
+ 'b' # 0x62 -> LATIN SMALL LETTER B
+ 'c' # 0x63 -> LATIN SMALL LETTER C
+ 'd' # 0x64 -> LATIN SMALL LETTER D
+ 'e' # 0x65 -> LATIN SMALL LETTER E
+ 'f' # 0x66 -> LATIN SMALL LETTER F
+ 'g' # 0x67 -> LATIN SMALL LETTER G
+ 'h' # 0x68 -> LATIN SMALL LETTER H
+ 'i' # 0x69 -> LATIN SMALL LETTER I
+ 'j' # 0x6A -> LATIN SMALL LETTER J
+ 'k' # 0x6B -> LATIN SMALL LETTER K
+ 'l' # 0x6C -> LATIN SMALL LETTER L
+ 'm' # 0x6D -> LATIN SMALL LETTER M
+ 'n' # 0x6E -> LATIN SMALL LETTER N
+ 'o' # 0x6F -> LATIN SMALL LETTER O
+ 'p' # 0x70 -> LATIN SMALL LETTER P
+ 'q' # 0x71 -> LATIN SMALL LETTER Q
+ 'r' # 0x72 -> LATIN SMALL LETTER R
+ 's' # 0x73 -> LATIN SMALL LETTER S
+ 't' # 0x74 -> LATIN SMALL LETTER T
+ 'u' # 0x75 -> LATIN SMALL LETTER U
+ 'v' # 0x76 -> LATIN SMALL LETTER V
+ 'w' # 0x77 -> LATIN SMALL LETTER W
+ 'x' # 0x78 -> LATIN SMALL LETTER X
+ 'y' # 0x79 -> LATIN SMALL LETTER Y
+ 'z' # 0x7A -> LATIN SMALL LETTER Z
+ '{' # 0x7B -> LEFT CURLY BRACKET
+ '|' # 0x7C -> VERTICAL LINE
+ '}' # 0x7D -> RIGHT CURLY BRACKET
+ '~' # 0x7E -> TILDE
+ '\x7f' # 0x7F -> DELETE
+ '\u20ac' # 0x80 -> EURO SIGN
+ '\x81' # 0x81 -> <control>
+ '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK
+ '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK
+ '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK
+ '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS
+ '\u2020' # 0x86 -> DAGGER
+ '\u2021' # 0x87 -> DOUBLE DAGGER
+ '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT
+ '\u2030' # 0x89 -> PER MILLE SIGN
+ '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON
+ '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE
+ '\u2666' # 0x8D -> BLACK DIAMOND SUIT
+ '\u2663' # 0x8E -> BLACK CLUB SUIT
+ '\u2665' # 0x8F -> BLACK HEART SUIT
+ '\u2660' # 0x90 -> BLACK SPADE SUIT
+ '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK
+ '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK
+ '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK
+ '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK
+ '\u2022' # 0x95 -> BULLET
+ '\u2013' # 0x96 -> EN DASH
+ '\u2014' # 0x97 -> EM DASH
+ '\u02dc' # 0x98 -> SMALL TILDE
+ '\u2122' # 0x99 -> TRADE MARK SIGN
+ '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON
+ '\x9b' # 0x9B -> <control>
+ '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE
+ '\x9d' # 0x9D -> <control>
+ '\x9e' # 0x9E -> <control>
+ '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS
+ '\xa0' # 0xA0 -> NO-BREAK SPACE
+ '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK
+ '\xa2' # 0xA2 -> CENT SIGN
+ '\xa3' # 0xA3 -> POUND SIGN
+ '\xa4' # 0xA4 -> CURRENCY SIGN
+ '\xa5' # 0xA5 -> YEN SIGN
+ '\xa6' # 0xA6 -> BROKEN BAR
+ '\xa7' # 0xA7 -> SECTION SIGN
+ '\xa8' # 0xA8 -> DIAERESIS
+ '\xa9' # 0xA9 -> COPYRIGHT SIGN
+ '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR
+ '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\xac' # 0xAC -> NOT SIGN
+ '\xad' # 0xAD -> SOFT HYPHEN
+ '\xae' # 0xAE -> REGISTERED SIGN
+ '\xaf' # 0xAF -> MACRON
+ '\xb0' # 0xB0 -> DEGREE SIGN
+ '\xb1' # 0xB1 -> PLUS-MINUS SIGN
+ '\xb2' # 0xB2 -> SUPERSCRIPT TWO
+ '\xb3' # 0xB3 -> SUPERSCRIPT THREE
+ '\xb4' # 0xB4 -> ACUTE ACCENT
+ '\xb5' # 0xB5 -> MICRO SIGN
+ '\xb6' # 0xB6 -> PILCROW SIGN
+ '\xb7' # 0xB7 -> MIDDLE DOT
+ '\xb8' # 0xB8 -> CEDILLA
+ '\xb9' # 0xB9 -> SUPERSCRIPT ONE
+ '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR
+ '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER
+ '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF
+ '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS
+ '\xbf' # 0xBF -> INVERTED QUESTION MARK
+ '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE
+ '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE
+ '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE
+ '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS
+ '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE
+ '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE
+ '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA
+ '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE
+ '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE
+ '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS
+ '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE
+ '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE
+ '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS
+ '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic)
+ '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE
+ '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE
+ '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE
+ '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE
+ '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS
+ '\xd7' # 0xD7 -> MULTIPLICATION SIGN
+ '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE
+ '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE
+ '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE
+ '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS
+ '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE
+ '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic)
+ '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German)
+ '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE
+ '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE
+ '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX
+ '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE
+ '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS
+ '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE
+ '\xe6' # 0xE6 -> LATIN SMALL LETTER AE
+ '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA
+ '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE
+ '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE
+ '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX
+ '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS
+ '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE
+ '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE
+ '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX
+ '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS
+ '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic)
+ '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE
+ '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE
+ '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE
+ '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX
+ '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE
+ '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS
+ '\xf7' # 0xF7 -> DIVISION SIGN
+ '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE
+ '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE
+ '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE
+ '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX
+ '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS
+ '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE
+ '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic)
+ '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS
+)
+
+### Encoding table
+encoding_table=codecs.charmap_build(decoding_table)
diff --git a/Lib/encodings/ptcp154.py b/Lib/encodings/ptcp154.py
index aef8975..656b79d 100644
--- a/Lib/encodings/ptcp154.py
+++ b/Lib/encodings/ptcp154.py
@@ -14,18 +14,18 @@ import codecs
class Codec(codecs.Codec):
def encode(self,input,errors='strict'):
- return codecs.charmap_encode(input,errors,encoding_map)
+ return codecs.charmap_encode(input,errors,encoding_table)
def decode(self,input,errors='strict'):
- return codecs.charmap_decode(input,errors,decoding_map)
+ return codecs.charmap_decode(input,errors,decoding_table)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
- return codecs.charmap_encode(input,self.errors,encoding_map)[0]
+ return codecs.charmap_encode(input,self.errors,encoding_table)[0]
class IncrementalDecoder(codecs.IncrementalDecoder):
def decode(self, input, final=False):
- return codecs.charmap_decode(input,self.errors,decoding_map)[0]
+ return codecs.charmap_decode(input,self.errors,decoding_table)[0]
class StreamWriter(Codec,codecs.StreamWriter):
pass
@@ -46,130 +46,267 @@ def getregentry():
streamwriter=StreamWriter,
)
-### Decoding Map
-
-decoding_map = codecs.make_identity_dict(range(256))
-decoding_map.update({
- 0x0080: 0x0496, # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
- 0x0081: 0x0492, # CYRILLIC CAPITAL LETTER GHE WITH STROKE
- 0x0082: 0x04ee, # CYRILLIC CAPITAL LETTER U WITH MACRON
- 0x0083: 0x0493, # CYRILLIC SMALL LETTER GHE WITH STROKE
- 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK
- 0x0085: 0x2026, # HORIZONTAL ELLIPSIS
- 0x0086: 0x04b6, # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
- 0x0087: 0x04ae, # CYRILLIC CAPITAL LETTER STRAIGHT U
- 0x0088: 0x04b2, # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
- 0x0089: 0x04af, # CYRILLIC SMALL LETTER STRAIGHT U
- 0x008a: 0x04a0, # CYRILLIC CAPITAL LETTER BASHKIR KA
- 0x008b: 0x04e2, # CYRILLIC CAPITAL LETTER I WITH MACRON
- 0x008c: 0x04a2, # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
- 0x008d: 0x049a, # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
- 0x008e: 0x04ba, # CYRILLIC CAPITAL LETTER SHHA
- 0x008f: 0x04b8, # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
- 0x0090: 0x0497, # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
- 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK
- 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK
- 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK
- 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK
- 0x0095: 0x2022, # BULLET
- 0x0096: 0x2013, # EN DASH
- 0x0097: 0x2014, # EM DASH
- 0x0098: 0x04b3, # CYRILLIC SMALL LETTER HA WITH DESCENDER
- 0x0099: 0x04b7, # CYRILLIC SMALL LETTER CHE WITH DESCENDER
- 0x009a: 0x04a1, # CYRILLIC SMALL LETTER BASHKIR KA
- 0x009b: 0x04e3, # CYRILLIC SMALL LETTER I WITH MACRON
- 0x009c: 0x04a3, # CYRILLIC SMALL LETTER EN WITH DESCENDER
- 0x009d: 0x049b, # CYRILLIC SMALL LETTER KA WITH DESCENDER
- 0x009e: 0x04bb, # CYRILLIC SMALL LETTER SHHA
- 0x009f: 0x04b9, # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
- 0x00a1: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
- 0x00a2: 0x045e, # CYRILLIC SMALL LETTER SHORT U (Byelorussian)
- 0x00a3: 0x0408, # CYRILLIC CAPITAL LETTER JE
- 0x00a4: 0x04e8, # CYRILLIC CAPITAL LETTER BARRED O
- 0x00a5: 0x0498, # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
- 0x00a6: 0x04b0, # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
- 0x00a8: 0x0401, # CYRILLIC CAPITAL LETTER IO
- 0x00aa: 0x04d8, # CYRILLIC CAPITAL LETTER SCHWA
- 0x00ad: 0x04ef, # CYRILLIC SMALL LETTER U WITH MACRON
- 0x00af: 0x049c, # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
- 0x00b1: 0x04b1, # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
- 0x00b2: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
- 0x00b3: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
- 0x00b4: 0x0499, # CYRILLIC SMALL LETTER ZE WITH DESCENDER
- 0x00b5: 0x04e9, # CYRILLIC SMALL LETTER BARRED O
- 0x00b8: 0x0451, # CYRILLIC SMALL LETTER IO
- 0x00b9: 0x2116, # NUMERO SIGN
- 0x00ba: 0x04d9, # CYRILLIC SMALL LETTER SCHWA
- 0x00bc: 0x0458, # CYRILLIC SMALL LETTER JE
- 0x00bd: 0x04aa, # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
- 0x00be: 0x04ab, # CYRILLIC SMALL LETTER ES WITH DESCENDER
- 0x00bf: 0x049d, # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
- 0x00c0: 0x0410, # CYRILLIC CAPITAL LETTER A
- 0x00c1: 0x0411, # CYRILLIC CAPITAL LETTER BE
- 0x00c2: 0x0412, # CYRILLIC CAPITAL LETTER VE
- 0x00c3: 0x0413, # CYRILLIC CAPITAL LETTER GHE
- 0x00c4: 0x0414, # CYRILLIC CAPITAL LETTER DE
- 0x00c5: 0x0415, # CYRILLIC CAPITAL LETTER IE
- 0x00c6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE
- 0x00c7: 0x0417, # CYRILLIC CAPITAL LETTER ZE
- 0x00c8: 0x0418, # CYRILLIC CAPITAL LETTER I
- 0x00c9: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I
- 0x00ca: 0x041a, # CYRILLIC CAPITAL LETTER KA
- 0x00cb: 0x041b, # CYRILLIC CAPITAL LETTER EL
- 0x00cc: 0x041c, # CYRILLIC CAPITAL LETTER EM
- 0x00cd: 0x041d, # CYRILLIC CAPITAL LETTER EN
- 0x00ce: 0x041e, # CYRILLIC CAPITAL LETTER O
- 0x00cf: 0x041f, # CYRILLIC CAPITAL LETTER PE
- 0x00d0: 0x0420, # CYRILLIC CAPITAL LETTER ER
- 0x00d1: 0x0421, # CYRILLIC CAPITAL LETTER ES
- 0x00d2: 0x0422, # CYRILLIC CAPITAL LETTER TE
- 0x00d3: 0x0423, # CYRILLIC CAPITAL LETTER U
- 0x00d4: 0x0424, # CYRILLIC CAPITAL LETTER EF
- 0x00d5: 0x0425, # CYRILLIC CAPITAL LETTER HA
- 0x00d6: 0x0426, # CYRILLIC CAPITAL LETTER TSE
- 0x00d7: 0x0427, # CYRILLIC CAPITAL LETTER CHE
- 0x00d8: 0x0428, # CYRILLIC CAPITAL LETTER SHA
- 0x00d9: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA
- 0x00da: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN
- 0x00db: 0x042b, # CYRILLIC CAPITAL LETTER YERU
- 0x00dc: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN
- 0x00dd: 0x042d, # CYRILLIC CAPITAL LETTER E
- 0x00de: 0x042e, # CYRILLIC CAPITAL LETTER YU
- 0x00df: 0x042f, # CYRILLIC CAPITAL LETTER YA
- 0x00e0: 0x0430, # CYRILLIC SMALL LETTER A
- 0x00e1: 0x0431, # CYRILLIC SMALL LETTER BE
- 0x00e2: 0x0432, # CYRILLIC SMALL LETTER VE
- 0x00e3: 0x0433, # CYRILLIC SMALL LETTER GHE
- 0x00e4: 0x0434, # CYRILLIC SMALL LETTER DE
- 0x00e5: 0x0435, # CYRILLIC SMALL LETTER IE
- 0x00e6: 0x0436, # CYRILLIC SMALL LETTER ZHE
- 0x00e7: 0x0437, # CYRILLIC SMALL LETTER ZE
- 0x00e8: 0x0438, # CYRILLIC SMALL LETTER I
- 0x00e9: 0x0439, # CYRILLIC SMALL LETTER SHORT I
- 0x00ea: 0x043a, # CYRILLIC SMALL LETTER KA
- 0x00eb: 0x043b, # CYRILLIC SMALL LETTER EL
- 0x00ec: 0x043c, # CYRILLIC SMALL LETTER EM
- 0x00ed: 0x043d, # CYRILLIC SMALL LETTER EN
- 0x00ee: 0x043e, # CYRILLIC SMALL LETTER O
- 0x00ef: 0x043f, # CYRILLIC SMALL LETTER PE
- 0x00f0: 0x0440, # CYRILLIC SMALL LETTER ER
- 0x00f1: 0x0441, # CYRILLIC SMALL LETTER ES
- 0x00f2: 0x0442, # CYRILLIC SMALL LETTER TE
- 0x00f3: 0x0443, # CYRILLIC SMALL LETTER U
- 0x00f4: 0x0444, # CYRILLIC SMALL LETTER EF
- 0x00f5: 0x0445, # CYRILLIC SMALL LETTER HA
- 0x00f6: 0x0446, # CYRILLIC SMALL LETTER TSE
- 0x00f7: 0x0447, # CYRILLIC SMALL LETTER CHE
- 0x00f8: 0x0448, # CYRILLIC SMALL LETTER SHA
- 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA
- 0x00fa: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN
- 0x00fb: 0x044b, # CYRILLIC SMALL LETTER YERU
- 0x00fc: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN
- 0x00fd: 0x044d, # CYRILLIC SMALL LETTER E
- 0x00fe: 0x044e, # CYRILLIC SMALL LETTER YU
- 0x00ff: 0x044f, # CYRILLIC SMALL LETTER YA
-})
-
-### Encoding Map
-
-encoding_map = codecs.make_encoding_map(decoding_map)
+
+### Decoding Table
+
+decoding_table = (
+ '\x00' # 0x00 -> NULL
+ '\x01' # 0x01 -> START OF HEADING
+ '\x02' # 0x02 -> START OF TEXT
+ '\x03' # 0x03 -> END OF TEXT
+ '\x04' # 0x04 -> END OF TRANSMISSION
+ '\x05' # 0x05 -> ENQUIRY
+ '\x06' # 0x06 -> ACKNOWLEDGE
+ '\x07' # 0x07 -> BELL
+ '\x08' # 0x08 -> BACKSPACE
+ '\t' # 0x09 -> HORIZONTAL TABULATION
+ '\n' # 0x0A -> LINE FEED
+ '\x0b' # 0x0B -> VERTICAL TABULATION
+ '\x0c' # 0x0C -> FORM FEED
+ '\r' # 0x0D -> CARRIAGE RETURN
+ '\x0e' # 0x0E -> SHIFT OUT
+ '\x0f' # 0x0F -> SHIFT IN
+ '\x10' # 0x10 -> DATA LINK ESCAPE
+ '\x11' # 0x11 -> DEVICE CONTROL ONE
+ '\x12' # 0x12 -> DEVICE CONTROL TWO
+ '\x13' # 0x13 -> DEVICE CONTROL THREE
+ '\x14' # 0x14 -> DEVICE CONTROL FOUR
+ '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE
+ '\x16' # 0x16 -> SYNCHRONOUS IDLE
+ '\x17' # 0x17 -> END OF TRANSMISSION BLOCK
+ '\x18' # 0x18 -> CANCEL
+ '\x19' # 0x19 -> END OF MEDIUM
+ '\x1a' # 0x1A -> SUBSTITUTE
+ '\x1b' # 0x1B -> ESCAPE
+ '\x1c' # 0x1C -> FILE SEPARATOR
+ '\x1d' # 0x1D -> GROUP SEPARATOR
+ '\x1e' # 0x1E -> RECORD SEPARATOR
+ '\x1f' # 0x1F -> UNIT SEPARATOR
+ ' ' # 0x20 -> SPACE
+ '!' # 0x21 -> EXCLAMATION MARK
+ '"' # 0x22 -> QUOTATION MARK
+ '#' # 0x23 -> NUMBER SIGN
+ '$' # 0x24 -> DOLLAR SIGN
+ '%' # 0x25 -> PERCENT SIGN
+ '&' # 0x26 -> AMPERSAND
+ "'" # 0x27 -> APOSTROPHE
+ '(' # 0x28 -> LEFT PARENTHESIS
+ ')' # 0x29 -> RIGHT PARENTHESIS
+ '*' # 0x2A -> ASTERISK
+ '+' # 0x2B -> PLUS SIGN
+ ',' # 0x2C -> COMMA
+ '-' # 0x2D -> HYPHEN-MINUS
+ '.' # 0x2E -> FULL STOP
+ '/' # 0x2F -> SOLIDUS
+ '0' # 0x30 -> DIGIT ZERO
+ '1' # 0x31 -> DIGIT ONE
+ '2' # 0x32 -> DIGIT TWO
+ '3' # 0x33 -> DIGIT THREE
+ '4' # 0x34 -> DIGIT FOUR
+ '5' # 0x35 -> DIGIT FIVE
+ '6' # 0x36 -> DIGIT SIX
+ '7' # 0x37 -> DIGIT SEVEN
+ '8' # 0x38 -> DIGIT EIGHT
+ '9' # 0x39 -> DIGIT NINE
+ ':' # 0x3A -> COLON
+ ';' # 0x3B -> SEMICOLON
+ '<' # 0x3C -> LESS-THAN SIGN
+ '=' # 0x3D -> EQUALS SIGN
+ '>' # 0x3E -> GREATER-THAN SIGN
+ '?' # 0x3F -> QUESTION MARK
+ '@' # 0x40 -> COMMERCIAL AT
+ 'A' # 0x41 -> LATIN CAPITAL LETTER A
+ 'B' # 0x42 -> LATIN CAPITAL LETTER B
+ 'C' # 0x43 -> LATIN CAPITAL LETTER C
+ 'D' # 0x44 -> LATIN CAPITAL LETTER D
+ 'E' # 0x45 -> LATIN CAPITAL LETTER E
+ 'F' # 0x46 -> LATIN CAPITAL LETTER F
+ 'G' # 0x47 -> LATIN CAPITAL LETTER G
+ 'H' # 0x48 -> LATIN CAPITAL LETTER H
+ 'I' # 0x49 -> LATIN CAPITAL LETTER I
+ 'J' # 0x4A -> LATIN CAPITAL LETTER J
+ 'K' # 0x4B -> LATIN CAPITAL LETTER K
+ 'L' # 0x4C -> LATIN CAPITAL LETTER L
+ 'M' # 0x4D -> LATIN CAPITAL LETTER M
+ 'N' # 0x4E -> LATIN CAPITAL LETTER N
+ 'O' # 0x4F -> LATIN CAPITAL LETTER O
+ 'P' # 0x50 -> LATIN CAPITAL LETTER P
+ 'Q' # 0x51 -> LATIN CAPITAL LETTER Q
+ 'R' # 0x52 -> LATIN CAPITAL LETTER R
+ 'S' # 0x53 -> LATIN CAPITAL LETTER S
+ 'T' # 0x54 -> LATIN CAPITAL LETTER T
+ 'U' # 0x55 -> LATIN CAPITAL LETTER U
+ 'V' # 0x56 -> LATIN CAPITAL LETTER V
+ 'W' # 0x57 -> LATIN CAPITAL LETTER W
+ 'X' # 0x58 -> LATIN CAPITAL LETTER X
+ 'Y' # 0x59 -> LATIN CAPITAL LETTER Y
+ 'Z' # 0x5A -> LATIN CAPITAL LETTER Z
+ '[' # 0x5B -> LEFT SQUARE BRACKET
+ '\\' # 0x5C -> REVERSE SOLIDUS
+ ']' # 0x5D -> RIGHT SQUARE BRACKET
+ '^' # 0x5E -> CIRCUMFLEX ACCENT
+ '_' # 0x5F -> LOW LINE
+ '`' # 0x60 -> GRAVE ACCENT
+ 'a' # 0x61 -> LATIN SMALL LETTER A
+ 'b' # 0x62 -> LATIN SMALL LETTER B
+ 'c' # 0x63 -> LATIN SMALL LETTER C
+ 'd' # 0x64 -> LATIN SMALL LETTER D
+ 'e' # 0x65 -> LATIN SMALL LETTER E
+ 'f' # 0x66 -> LATIN SMALL LETTER F
+ 'g' # 0x67 -> LATIN SMALL LETTER G
+ 'h' # 0x68 -> LATIN SMALL LETTER H
+ 'i' # 0x69 -> LATIN SMALL LETTER I
+ 'j' # 0x6A -> LATIN SMALL LETTER J
+ 'k' # 0x6B -> LATIN SMALL LETTER K
+ 'l' # 0x6C -> LATIN SMALL LETTER L
+ 'm' # 0x6D -> LATIN SMALL LETTER M
+ 'n' # 0x6E -> LATIN SMALL LETTER N
+ 'o' # 0x6F -> LATIN SMALL LETTER O
+ 'p' # 0x70 -> LATIN SMALL LETTER P
+ 'q' # 0x71 -> LATIN SMALL LETTER Q
+ 'r' # 0x72 -> LATIN SMALL LETTER R
+ 's' # 0x73 -> LATIN SMALL LETTER S
+ 't' # 0x74 -> LATIN SMALL LETTER T
+ 'u' # 0x75 -> LATIN SMALL LETTER U
+ 'v' # 0x76 -> LATIN SMALL LETTER V
+ 'w' # 0x77 -> LATIN SMALL LETTER W
+ 'x' # 0x78 -> LATIN SMALL LETTER X
+ 'y' # 0x79 -> LATIN SMALL LETTER Y
+ 'z' # 0x7A -> LATIN SMALL LETTER Z
+ '{' # 0x7B -> LEFT CURLY BRACKET
+ '|' # 0x7C -> VERTICAL LINE
+ '}' # 0x7D -> RIGHT CURLY BRACKET
+ '~' # 0x7E -> TILDE
+ '\x7f' # 0x7F -> DELETE (DEL)
+ '\u0496' # 0x80 -> CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+ '\u0492' # 0x81 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE
+ '\u04ee' # 0x82 -> CYRILLIC CAPITAL LETTER U WITH MACRON
+ '\u0493' # 0x83 -> CYRILLIC SMALL LETTER GHE WITH STROKE
+ '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK
+ '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS
+ '\u04b6' # 0x86 -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+ '\u04ae' # 0x87 -> CYRILLIC CAPITAL LETTER STRAIGHT U
+ '\u04b2' # 0x88 -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+ '\u04af' # 0x89 -> CYRILLIC SMALL LETTER STRAIGHT U
+ '\u04a0' # 0x8A -> CYRILLIC CAPITAL LETTER BASHKIR KA
+ '\u04e2' # 0x8B -> CYRILLIC CAPITAL LETTER I WITH MACRON
+ '\u04a2' # 0x8C -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+ '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+ '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA
+ '\u04b8' # 0x8F -> CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+ '\u0497' # 0x90 -> CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+ '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK
+ '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK
+ '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK
+ '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK
+ '\u2022' # 0x95 -> BULLET
+ '\u2013' # 0x96 -> EN DASH
+ '\u2014' # 0x97 -> EM DASH
+ '\u04b3' # 0x98 -> CYRILLIC SMALL LETTER HA WITH DESCENDER
+ '\u04b7' # 0x99 -> CYRILLIC SMALL LETTER CHE WITH DESCENDER
+ '\u04a1' # 0x9A -> CYRILLIC SMALL LETTER BASHKIR KA
+ '\u04e3' # 0x9B -> CYRILLIC SMALL LETTER I WITH MACRON
+ '\u04a3' # 0x9C -> CYRILLIC SMALL LETTER EN WITH DESCENDER
+ '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER
+ '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA
+ '\u04b9' # 0x9F -> CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+ '\xa0' # 0xA0 -> NO-BREAK SPACE
+ '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+ '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+ '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE
+ '\u04e8' # 0xA4 -> CYRILLIC CAPITAL LETTER BARRED O
+ '\u0498' # 0xA5 -> CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+ '\u04b0' # 0xA6 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+ '\xa7' # 0xA7 -> SECTION SIGN
+ '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO
+ '\xa9' # 0xA9 -> COPYRIGHT SIGN
+ '\u04d8' # 0xAA -> CYRILLIC CAPITAL LETTER SCHWA
+ '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\xac' # 0xAC -> NOT SIGN
+ '\u04ef' # 0xAD -> CYRILLIC SMALL LETTER U WITH MACRON
+ '\xae' # 0xAE -> REGISTERED SIGN
+ '\u049c' # 0xAF -> CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+ '\xb0' # 0xB0 -> DEGREE SIGN
+ '\u04b1' # 0xB1 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+ '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ '\u0499' # 0xB4 -> CYRILLIC SMALL LETTER ZE WITH DESCENDER
+ '\u04e9' # 0xB5 -> CYRILLIC SMALL LETTER BARRED O
+ '\xb6' # 0xB6 -> PILCROW SIGN
+ '\xb7' # 0xB7 -> MIDDLE DOT
+ '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO
+ '\u2116' # 0xB9 -> NUMERO SIGN
+ '\u04d9' # 0xBA -> CYRILLIC SMALL LETTER SCHWA
+ '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE
+ '\u04aa' # 0xBD -> CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+ '\u04ab' # 0xBE -> CYRILLIC SMALL LETTER ES WITH DESCENDER
+ '\u049d' # 0xBF -> CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+ '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A
+ '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE
+ '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE
+ '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE
+ '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE
+ '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE
+ '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE
+ '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE
+ '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I
+ '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I
+ '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA
+ '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL
+ '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM
+ '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN
+ '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O
+ '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE
+ '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER
+ '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES
+ '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE
+ '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U
+ '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF
+ '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA
+ '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE
+ '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE
+ '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA
+ '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA
+ '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN
+ '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU
+ '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN
+ '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E
+ '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU
+ '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA
+ '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A
+ '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE
+ '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE
+ '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE
+ '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE
+ '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE
+ '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE
+ '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE
+ '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I
+ '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I
+ '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA
+ '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL
+ '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM
+ '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN
+ '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O
+ '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE
+ '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER
+ '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES
+ '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE
+ '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U
+ '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF
+ '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA
+ '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE
+ '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE
+ '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA
+ '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA
+ '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN
+ '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU
+ '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN
+ '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E
+ '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU
+ '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA
+)
+
+### Encoding table
+encoding_table=codecs.charmap_build(decoding_table)
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 554beb2..dbbbb21 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -398,9 +398,8 @@ def hook_compressed(filename, mode):
def hook_encoded(encoding):
- import codecs
def openhook(filename, mode):
- return codecs.open(filename, mode, encoding)
+ return open(filename, mode, encoding=encoding)
return openhook
diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py
index 726fbe5..f446769 100644
--- a/Lib/fnmatch.py
+++ b/Lib/fnmatch.py
@@ -35,9 +35,9 @@ def fnmatch(name, pat):
pat = os.path.normcase(pat)
return fnmatchcase(name, pat)
-@functools.lru_cache(maxsize=250)
-def _compile_pattern(pat, is_bytes=False):
- if is_bytes:
+@functools.lru_cache(maxsize=250, typed=True)
+def _compile_pattern(pat):
+ if isinstance(pat, bytes):
pat_str = str(pat, 'ISO-8859-1')
res_str = translate(pat_str)
res = bytes(res_str, 'ISO-8859-1')
@@ -49,7 +49,7 @@ def filter(names, pat):
"""Return the subset of the list NAMES that match PAT."""
result = []
pat = os.path.normcase(pat)
- match = _compile_pattern(pat, isinstance(pat, bytes))
+ match = _compile_pattern(pat)
if os.path is posixpath:
# normcase on posix is NOP. Optimize it away from the loop.
for name in names:
@@ -67,7 +67,7 @@ def fnmatchcase(name, pat):
This is a version of fnmatch() which doesn't case-normalize
its arguments.
"""
- match = _compile_pattern(pat, isinstance(pat, bytes))
+ match = _compile_pattern(pat)
return match(name) is not None
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index 8e53023..18887a6 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -100,14 +100,15 @@ class FTP:
file = None
welcome = None
passiveserver = 1
- encoding = "latin1"
+ encoding = "latin-1"
# Initialization method (called by class instantiation).
# Initialize host to localhost, port to standard ftp port
# Optional arguments are host (for connect()),
# and user, passwd, acct (for login())
def __init__(self, host='', user='', passwd='', acct='',
- timeout=_GLOBAL_DEFAULT_TIMEOUT):
+ timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None):
+ self.source_address = source_address
self.timeout = timeout
if host:
self.connect(host)
@@ -128,10 +129,12 @@ class FTP:
if self.sock is not None:
self.close()
- def connect(self, host='', port=0, timeout=-999):
+ def connect(self, host='', port=0, timeout=-999, source_address=None):
'''Connect to host. Arguments are:
- host: hostname to connect to (string, default previous host)
- port: port to connect to (integer, default previous port)
+ - source_address: a 2-tuple (host, port) for the socket to bind
+ to as its source address before connecting.
'''
if host != '':
self.host = host
@@ -139,7 +142,10 @@ class FTP:
self.port = port
if timeout != -999:
self.timeout = timeout
- self.sock = socket.create_connection((self.host, self.port), self.timeout)
+ if source_address is not None:
+ self.source_address = source_address
+ self.sock = socket.create_connection((self.host, self.port), self.timeout,
+ source_address=self.source_address)
self.af = self.sock.family
self.file = self.sock.makefile('r', encoding=self.encoding)
self.welcome = self.getresp()
@@ -169,10 +175,8 @@ class FTP:
# Internal: "sanitize" a string for printing
def sanitize(self, s):
- if s[:5] == 'pass ' or s[:5] == 'PASS ':
- i = len(s)
- while i > 5 and s[i-1] in {'\r', '\n'}:
- i = i-1
+ if s[:5] in {'pass ', 'PASS '}:
+ i = len(s.rstrip('\r\n'))
s = s[:5] + '*'*(i-5) + s[i:]
return repr(s)
@@ -335,7 +339,8 @@ class FTP:
size = None
if self.passiveserver:
host, port = self.makepasv()
- conn = socket.create_connection((host, port), self.timeout)
+ conn = socket.create_connection((host, port), self.timeout,
+ source_address=self.source_address)
try:
if rest is not None:
self.sendcmd("REST %s" % rest)
@@ -354,8 +359,7 @@ class FTP:
conn.close()
raise
else:
- sock = self.makeport()
- try:
+ with self.makeport() as sock:
if rest is not None:
self.sendcmd("REST %s" % rest)
resp = self.sendcmd(cmd)
@@ -367,8 +371,6 @@ class FTP:
conn, sockaddr = sock.accept()
if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT:
conn.settimeout(self.timeout)
- finally:
- sock.close()
if resp[:3] == '150':
# this is conditional in case we received a 125
size = parse150(resp)
@@ -426,7 +428,7 @@ class FTP:
"""Retrieve data in line mode. A new port is created for you.
Args:
- cmd: A RETR, LIST, NLST, or MLSD command.
+ cmd: A RETR, LIST, or NLST command.
callback: An optional single parameter callable that is called
for each line with the trailing CRLF stripped.
[default: print_line()]
@@ -527,6 +529,34 @@ class FTP:
cmd = cmd + (' ' + arg)
self.retrlines(cmd, func)
+ def mlsd(self, path="", facts=[]):
+ '''List a directory in a standardized format by using MLSD
+ command (RFC-3659). If path is omitted the current directory
+ is assumed. "facts" is a list of strings representing the type
+ of information desired (e.g. ["type", "size", "perm"]).
+
+ Return a generator object yielding a tuple of two elements
+ for every file found in path.
+ First element is the file name, the second one is a dictionary
+ including a variable number of "facts" depending on the server
+ and whether "facts" argument has been provided.
+ '''
+ if facts:
+ self.sendcmd("OPTS MLST " + ";".join(facts) + ";")
+ if path:
+ cmd = "MLSD %s" % path
+ else:
+ cmd = "MLSD"
+ lines = []
+ self.retrlines(cmd, lines.append)
+ for line in lines:
+ facts_found, _, name = line.rstrip(CRLF).partition(' ')
+ entry = {}
+ for fact in facts_found[:-1].split(";"):
+ key, _, value = fact.partition("=")
+ entry[key.lower()] = value
+ yield (name, entry)
+
def rename(self, fromname, toname):
'''Rename a file.'''
resp = self.sendcmd('RNFR ' + fromname)
@@ -561,10 +591,7 @@ class FTP:
resp = self.sendcmd('SIZE ' + filename)
if resp[:3] == '213':
s = resp[3:].strip()
- try:
- return int(s)
- except (OverflowError, ValueError):
- return int(s)
+ return int(s)
def mkd(self, dirname):
'''Make a directory, return its full pathname.'''
@@ -596,11 +623,11 @@ class FTP:
def close(self):
'''Close the connection without assuming anything about it.'''
- if self.file:
+ if self.file is not None:
self.file.close()
+ if self.sock is not None:
self.sock.close()
- self.file = self.sock = None
-
+ self.file = self.sock = None
try:
import ssl
@@ -644,7 +671,7 @@ else:
def __init__(self, host='', user='', passwd='', acct='', keyfile=None,
certfile=None, context=None,
- timeout=_GLOBAL_DEFAULT_TIMEOUT):
+ timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None):
if context is not None and keyfile is not None:
raise ValueError("context and keyfile arguments are mutually "
"exclusive")
@@ -655,7 +682,7 @@ else:
self.certfile = certfile
self.context = context
self._prot_p = False
- FTP.__init__(self, host, user, passwd, acct, timeout)
+ FTP.__init__(self, host, user, passwd, acct, timeout, source_address)
def login(self, user='', passwd='', acct='', secure=True):
if secure and not isinstance(self.sock, ssl.SSLSocket):
@@ -679,6 +706,14 @@ else:
self.file = self.sock.makefile(mode='r', encoding=self.encoding)
return resp
+ def ccc(self):
+ '''Switch back to a clear-text control connection.'''
+ if not isinstance(self.sock, ssl.SSLSocket):
+ raise ValueError("not using TLS")
+ resp = self.voidcmd('CCC')
+ self.sock = self.sock.unwrap()
+ return resp
+
def prot_p(self):
'''Set up secure data connection.'''
# PROT defines whether or not the data channel is to be protected.
@@ -715,8 +750,7 @@ else:
def retrbinary(self, cmd, callback, blocksize=8192, rest=None):
self.voidcmd('TYPE I')
- conn = self.transfercmd(cmd, rest)
- try:
+ with self.transfercmd(cmd, rest) as conn:
while 1:
data = conn.recv(blocksize)
if not data:
@@ -725,8 +759,6 @@ else:
# shutdown ssl layer
if isinstance(conn, ssl.SSLSocket):
conn.unwrap()
- finally:
- conn.close()
return self.voidresp()
def retrlines(self, cmd, callback = None):
@@ -734,7 +766,7 @@ else:
resp = self.sendcmd('TYPE A')
conn = self.transfercmd(cmd)
fp = conn.makefile('r', encoding=self.encoding)
- try:
+ with fp, conn:
while 1:
line = fp.readline()
if self.debugging > 2: print('*retr*', repr(line))
@@ -748,15 +780,11 @@ else:
# shutdown ssl layer
if isinstance(conn, ssl.SSLSocket):
conn.unwrap()
- finally:
- fp.close()
- conn.close()
return self.voidresp()
def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
self.voidcmd('TYPE I')
- conn = self.transfercmd(cmd, rest)
- try:
+ with self.transfercmd(cmd, rest) as conn:
while 1:
buf = fp.read(blocksize)
if not buf: break
@@ -765,14 +793,11 @@ else:
# shutdown ssl layer
if isinstance(conn, ssl.SSLSocket):
conn.unwrap()
- finally:
- conn.close()
return self.voidresp()
def storlines(self, cmd, fp, callback=None):
self.voidcmd('TYPE A')
- conn = self.transfercmd(cmd)
- try:
+ with self.transfercmd(cmd) as conn:
while 1:
buf = fp.readline()
if not buf: break
@@ -784,8 +809,6 @@ else:
# shutdown ssl layer
if isinstance(conn, ssl.SSLSocket):
conn.unwrap()
- finally:
- conn.close()
return self.voidresp()
def abort(self):
@@ -818,11 +841,7 @@ def parse150(resp):
m = _150_re.match(resp)
if not m:
return None
- s = m.group(1)
- try:
- return int(s)
- except (OverflowError, ValueError):
- return int(s)
+ return int(m.group(1))
_227_re = None
diff --git a/Lib/functools.py b/Lib/functools.py
index 85ea257..226a46e 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -12,16 +12,22 @@ __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial']
from _functools import partial, reduce
-from collections import OrderedDict, namedtuple
+from collections import namedtuple
try:
from _thread import allocate_lock as Lock
except:
from _dummy_thread import allocate_lock as Lock
+
+################################################################################
+### update_wrapper() and wraps() decorator
+################################################################################
+
# update_wrapper() and wraps() are tools to help write
# wrapper functions that can handle naive introspection
-WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__', '__annotations__')
+WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
+ '__annotations__')
WRAPPER_UPDATES = ('__dict__',)
def update_wrapper(wrapper,
wrapped,
@@ -65,6 +71,11 @@ def wraps(wrapped,
return partial(update_wrapper, wrapped=wrapped,
assigned=assigned, updated=updated)
+
+################################################################################
+### total_ordering class decorator
+################################################################################
+
def total_ordering(cls):
"""Class decorator that fills in missing ordering methods"""
convert = {
@@ -93,6 +104,11 @@ def total_ordering(cls):
setattr(cls, opname, opfunc)
return cls
+
+################################################################################
+### cmp_to_key() function converter
+################################################################################
+
def cmp_to_key(mycmp):
"""Convert a cmp= function into a key= function"""
class K(object):
@@ -114,95 +130,174 @@ def cmp_to_key(mycmp):
__hash__ = None
return K
-_CacheInfo = namedtuple("CacheInfo", "hits misses maxsize currsize")
+try:
+ from _functools import cmp_to_key
+except ImportError:
+ pass
+
+
+################################################################################
+### LRU Cache function decorator
+################################################################################
+
+_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
+
+class _HashedSeq(list):
+ __slots__ = 'hashvalue'
+
+ def __init__(self, tup, hash=hash):
+ self[:] = tup
+ self.hashvalue = hash(tup)
+
+ def __hash__(self):
+ return self.hashvalue
-def lru_cache(maxsize=100):
+def _make_key(args, kwds, typed,
+ kwd_mark = (object(),),
+ fasttypes = {int, str, frozenset, type(None)},
+ sorted=sorted, tuple=tuple, type=type, len=len):
+ 'Make a cache key from optionally typed positional and keyword arguments'
+ key = args
+ if kwds:
+ sorted_items = sorted(kwds.items())
+ key += kwd_mark
+ for item in sorted_items:
+ key += item
+ if typed:
+ key += tuple(type(v) for v in args)
+ if kwds:
+ key += tuple(type(v) for k, v in sorted_items)
+ elif len(key) == 1 and type(key[0]) in fasttypes:
+ return key[0]
+ return _HashedSeq(key)
+
+def lru_cache(maxsize=128, typed=False):
"""Least-recently-used cache decorator.
If *maxsize* is set to None, the LRU features are disabled and the cache
can grow without bound.
+ If *typed* is True, arguments of different types will be cached separately.
+ For example, f(3.0) and f(3) will be treated as distinct calls with
+ distinct results.
+
Arguments to the cached function must be hashable.
- View the cache statistics named tuple (hits, misses, maxsize, currsize) with
- f.cache_info(). Clear the cache and statistics with f.cache_clear().
+ View the cache statistics named tuple (hits, misses, maxsize, currsize)
+ with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Access the underlying function with f.__wrapped__.
See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
"""
+
# Users should only access the lru_cache through its public API:
# cache_info, cache_clear, and f.__wrapped__
# The internals of the lru_cache are encapsulated for thread safety and
# to allow the implementation to change (including a possible C version).
- def decorating_function(user_function,
- tuple=tuple, sorted=sorted, len=len, KeyError=KeyError):
+ # Constants shared by all lru cache instances:
+ sentinel = object() # unique object used to signal cache misses
+ make_key = _make_key # build a key from the function arguments
+ PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
+
+ def decorating_function(user_function):
- hits = misses = 0
- kwd_mark = (object(),) # separates positional and keyword args
- lock = Lock() # needed because OrderedDict isn't threadsafe
+ cache = {}
+ hits = misses = currsize = 0
+ full = False
+ cache_get = cache.get # bound method to lookup a key or return None
+ lock = Lock() # because linkedlist updates aren't threadsafe
+ root = [] # root of the circular doubly linked list
+ root[:] = [root, root, None, None] # initialize by pointing to self
- if maxsize is None:
- cache = dict() # simple cache without ordering or size limit
+ if maxsize == 0:
- @wraps(user_function)
def wrapper(*args, **kwds):
- nonlocal hits, misses
- key = args
- if kwds:
- key += kwd_mark + tuple(sorted(kwds.items()))
- try:
- result = cache[key]
+ # no caching, just a statistics update after a successful call
+ nonlocal misses
+ result = user_function(*args, **kwds)
+ misses += 1
+ return result
+
+ elif maxsize is None:
+
+ def wrapper(*args, **kwds):
+ # simple caching without ordering or size limit
+ nonlocal hits, misses, currsize
+ key = make_key(args, kwds, typed)
+ result = cache_get(key, sentinel)
+ if result is not sentinel:
hits += 1
return result
- except KeyError:
- pass
result = user_function(*args, **kwds)
cache[key] = result
misses += 1
+ currsize += 1
return result
+
else:
- cache = OrderedDict() # ordered least recent to most recent
- cache_popitem = cache.popitem
- cache_renew = cache.move_to_end
- @wraps(user_function)
def wrapper(*args, **kwds):
- nonlocal hits, misses
- key = args
- if kwds:
- key += kwd_mark + tuple(sorted(kwds.items()))
+ # size limited caching that tracks accesses by recency
+ nonlocal root, hits, misses, currsize, full
+ key = make_key(args, kwds, typed)
with lock:
- try:
- result = cache[key]
- cache_renew(key) # record recent use of this key
+ link = cache_get(key)
+ if link is not None:
+ # move the link to the front of the circular queue
+ link_prev, link_next, key, result = link
+ link_prev[NEXT] = link_next
+ link_next[PREV] = link_prev
+ last = root[PREV]
+ last[NEXT] = root[PREV] = link
+ link[PREV] = last
+ link[NEXT] = root
hits += 1
return result
- except KeyError:
- pass
result = user_function(*args, **kwds)
with lock:
- cache[key] = result # record recent use of this key
+ if key in cache:
+ # getting here means that this same key was added to the
+ # cache while the lock was released. since the link
+ # update is already done, we need only return the
+ # computed result and update the count of misses.
+ pass
+ elif full:
+ # use root to store the new key and result
+ root[KEY] = key
+ root[RESULT] = result
+ cache[key] = root
+ # empty the oldest link and make it the new root
+ root = root[NEXT]
+ del cache[root[KEY]]
+ root[KEY] = root[RESULT] = None
+ else:
+ # put result in a new link at the front of the queue
+ last = root[PREV]
+ link = [last, root, key, result]
+ cache[key] = last[NEXT] = root[PREV] = link
+ currsize += 1
+ full = (currsize == maxsize)
misses += 1
- if len(cache) > maxsize:
- cache_popitem(0) # purge least recently used cache entry
return result
def cache_info():
"""Report cache statistics"""
with lock:
- return _CacheInfo(hits, misses, maxsize, len(cache))
+ return _CacheInfo(hits, misses, maxsize, currsize)
def cache_clear():
"""Clear the cache and cache statistics"""
- nonlocal hits, misses
+ nonlocal hits, misses, currsize, full
with lock:
cache.clear()
- hits = misses = 0
+ root[:] = [root, root, None, None]
+ hits = misses = currsize = 0
+ full = False
wrapper.cache_info = cache_info
wrapper.cache_clear = cache_clear
- return wrapper
+ return update_wrapper(wrapper, user_function)
return decorating_function
diff --git a/Lib/getopt.py b/Lib/getopt.py
index 980861d..3d6ecbd 100644
--- a/Lib/getopt.py
+++ b/Lib/getopt.py
@@ -19,7 +19,7 @@ option involved with the exception.
# Gerrit Holl <gerrit@nl.linux.org> moved the string-based exceptions
# to class-based exceptions.
#
-# Peter Åstrand <astrand@lysator.liu.se> added gnu_getopt().
+# Peter Ã…strand <astrand@lysator.liu.se> added gnu_getopt().
#
# TODO for gnu_getopt():
#
@@ -34,6 +34,11 @@ option involved with the exception.
__all__ = ["GetoptError","error","getopt","gnu_getopt"]
import os
+try:
+ from gettext import gettext as _
+except ImportError:
+ # Bootstrapping Python: gettext's dependencies not built yet
+ def _(s): return s
class GetoptError(Exception):
opt = ''
@@ -153,10 +158,10 @@ def do_longs(opts, opt, longopts, args):
if has_arg:
if optarg is None:
if not args:
- raise GetoptError('option --%s requires argument' % opt, opt)
+ raise GetoptError(_('option --%s requires argument') % opt, opt)
optarg, args = args[0], args[1:]
elif optarg is not None:
- raise GetoptError('option --%s must not have an argument' % opt, opt)
+ raise GetoptError(_('option --%s must not have an argument') % opt, opt)
opts.append(('--' + opt, optarg or ''))
return opts, args
@@ -166,7 +171,7 @@ def do_longs(opts, opt, longopts, args):
def long_has_args(opt, longopts):
possibilities = [o for o in longopts if o.startswith(opt)]
if not possibilities:
- raise GetoptError('option --%s not recognized' % opt, opt)
+ raise GetoptError(_('option --%s not recognized') % opt, opt)
# Is there an exact match?
if opt in possibilities:
return False, opt
@@ -176,7 +181,7 @@ def long_has_args(opt, longopts):
if len(possibilities) > 1:
# XXX since possibilities contains all valid continuations, might be
# nice to work them into the error msg
- raise GetoptError('option --%s not a unique prefix' % opt, opt)
+ raise GetoptError(_('option --%s not a unique prefix') % opt, opt)
assert len(possibilities) == 1
unique_match = possibilities[0]
has_arg = unique_match.endswith('=')
@@ -190,7 +195,7 @@ def do_shorts(opts, optstring, shortopts, args):
if short_has_arg(opt, shortopts):
if optstring == '':
if not args:
- raise GetoptError('option -%s requires argument' % opt,
+ raise GetoptError(_('option -%s requires argument') % opt,
opt)
optstring, args = args[0], args[1:]
optarg, optstring = optstring, ''
@@ -203,7 +208,7 @@ def short_has_arg(opt, shortopts):
for i in range(len(shortopts)):
if opt == shortopts[i] != ':':
return shortopts.startswith(':', i+1)
- raise GetoptError('option -%s not recognized' % opt, opt)
+ raise GetoptError(_('option -%s not recognized') % opt, opt)
if __name__ == '__main__':
import sys
diff --git a/Lib/getpass.py b/Lib/getpass.py
index dc02bd1..0044742 100644
--- a/Lib/getpass.py
+++ b/Lib/getpass.py
@@ -72,7 +72,7 @@ def unix_getpass(prompt='Password: ', stream=None):
finally:
termios.tcsetattr(fd, tcsetattr_flags, old)
stream.flush() # issue7208
- except termios.error as e:
+ except termios.error:
if passwd is not None:
# _raw_input succeeded. The final tcsetattr failed. Reraise
# instead of leaving the terminal in an unknown state.
@@ -145,8 +145,6 @@ def getuser():
"""
- import os
-
for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
user = os.environ.get(name)
if user:
diff --git a/Lib/gettext.py b/Lib/gettext.py
index 256e331..e43f044 100644
--- a/Lib/gettext.py
+++ b/Lib/gettext.py
@@ -55,7 +55,7 @@ __all__ = ['NullTranslations', 'GNUTranslations', 'Catalog',
'dgettext', 'dngettext', 'gettext', 'ngettext',
]
-_default_localedir = os.path.join(sys.prefix, 'share', 'locale')
+_default_localedir = os.path.join(sys.base_prefix, 'share', 'locale')
def c2py(plural):
diff --git a/Lib/gzip.py b/Lib/gzip.py
index e1b43a5..d8abffd 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -16,17 +16,49 @@ FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16
READ, WRITE = 1, 2
-def U32(i):
- """Return i as an unsigned integer, assuming it fits in 32 bits.
- If it's >= 2GB when viewed as a 32-bit unsigned int, return a long.
- """
- if i < 0:
- i += 1 << 32
- return i
+def open(filename, mode="rb", compresslevel=9,
+ encoding=None, errors=None, newline=None):
+ """Open a gzip-compressed file in binary or text mode.
+
+ The filename argument can be an actual filename (a str or bytes object), or
+ an existing file object to read from or write to.
+
+ The mode argument can be "r", "rb", "w", "wb", "a" or "ab" for binary mode,
+ or "rt", "wt" or "at" for text mode. The default mode is "rb", and the
+ default compresslevel is 9.
-def LOWU32(i):
- """Return the low-order 32 bits, as a non-negative int"""
- return i & 0xFFFFFFFF
+ For binary mode, this function is equivalent to the GzipFile constructor:
+ GzipFile(filename, mode, compresslevel). In this case, the encoding, errors
+ and newline arguments must not be provided.
+
+ For text mode, a GzipFile object is created, and wrapped in an
+ io.TextIOWrapper instance with the specified encoding, error handling
+ behavior, and line ending(s).
+
+ """
+ if "t" in mode:
+ if "b" in mode:
+ raise ValueError("Invalid mode: %r" % (mode,))
+ else:
+ if encoding is not None:
+ raise ValueError("Argument 'encoding' not supported in binary mode")
+ if errors is not None:
+ raise ValueError("Argument 'errors' not supported in binary mode")
+ if newline is not None:
+ raise ValueError("Argument 'newline' not supported in binary mode")
+
+ gz_mode = mode.replace("t", "")
+ if isinstance(filename, (str, bytes)):
+ binary_file = GzipFile(filename, gz_mode, compresslevel)
+ elif hasattr(filename, "read") or hasattr(filename, "write"):
+ binary_file = GzipFile(None, gz_mode, compresslevel, filename)
+ else:
+ raise TypeError("filename must be a str or bytes object, or a file")
+
+ if "t" in mode:
+ return io.TextIOWrapper(binary_file, encoding, errors, newline)
+ else:
+ return binary_file
def write32u(output, value):
# The L format writes the bit pattern correctly whether signed
@@ -36,15 +68,6 @@ def write32u(output, value):
def read32(input):
return struct.unpack("<I", input.read(4))[0]
-def open(filename, mode="rb", compresslevel=9):
- """Shorthand for GzipFile(filename, mode, compresslevel).
-
- The filename argument is required; mode defaults to 'rb'
- and compresslevel defaults to 9.
-
- """
- return GzipFile(filename, mode, compresslevel)
-
class _PaddedFile:
"""Minimal read-only file object that prepends a string to the contents
of an actual file. Shouldn't be used outside of gzip.py, as it lacks
@@ -106,7 +129,7 @@ class GzipFile(io.BufferedIOBase):
the exception of the readinto() and truncate() methods.
This class only supports opening files in binary mode. If you need to open a
- compressed file in text mode, wrap your GzipFile with an io.TextIOWrapper.
+ compressed file in text mode, use the gzip.open() function.
"""
@@ -153,7 +176,7 @@ class GzipFile(io.BufferedIOBase):
"""
if mode and ('t' in mode or 'U' in mode):
- raise IOError("Mode " + mode + " not supported")
+ raise ValueError("Invalid mode: {!r}".format(mode))
if mode and 'b' not in mode:
mode += 'b'
if fileobj is None:
@@ -163,10 +186,9 @@ class GzipFile(io.BufferedIOBase):
if not isinstance(filename, (str, bytes)):
filename = ''
if mode is None:
- if hasattr(fileobj, 'mode'): mode = fileobj.mode
- else: mode = 'rb'
+ mode = getattr(fileobj, 'mode', 'rb')
- if mode[0:1] == 'r':
+ if mode.startswith('r'):
self.mode = READ
# Set flag indicating start of a new member
self._new_member = True
@@ -181,7 +203,7 @@ class GzipFile(io.BufferedIOBase):
self.min_readsize = 100
fileobj = _PaddedFile(fileobj)
- elif mode[0:1] == 'w' or mode[0:1] == 'a':
+ elif mode.startswith(('w', 'a')):
self.mode = WRITE
self._init_write(filename)
self.compress = zlib.compressobj(compresslevel,
@@ -190,7 +212,7 @@ class GzipFile(io.BufferedIOBase):
zlib.DEF_MEM_LEVEL,
0)
else:
- raise IOError("Mode " + mode + " not supported")
+ raise ValueError("Invalid mode: {!r}".format(mode))
self.fileobj = fileobj
self.offset = 0
@@ -353,6 +375,31 @@ class GzipFile(io.BufferedIOBase):
self.offset += size
return chunk
+ def read1(self, size=-1):
+ self._check_closed()
+ if self.mode != READ:
+ import errno
+ raise IOError(errno.EBADF, "read1() on write-only GzipFile object")
+
+ if self.extrasize <= 0 and self.fileobj is None:
+ return b''
+
+ try:
+ # For certain input data, a single call to _read() may not return
+ # any data. In this case, retry until we get some data or reach EOF.
+ while self.extrasize <= 0:
+ self._read()
+ except EOFError:
+ pass
+ if size < 0 or size > self.extrasize:
+ size = self.extrasize
+
+ offset = self.offset - self.extrastart
+ chunk = self.extrabuf[offset: offset + size]
+ self.extrasize -= size
+ self.offset += size
+ return chunk
+
def peek(self, n):
if self.mode != READ:
import errno
@@ -366,8 +413,10 @@ class GzipFile(io.BufferedIOBase):
if self.fileobj is None:
return b''
try:
- # 1024 is the same buffering heuristic used in read()
- self._read(max(n, 1024))
+ # Ensure that we don't return b"" if we haven't reached EOF.
+ while self.extrasize == 0:
+ # 1024 is the same buffering heuristic used in read()
+ self._read(max(n, 1024))
except EOFError:
pass
offset = self.offset - self.extrastart
diff --git a/Lib/hmac.py b/Lib/hmac.py
index 956fc65..4297a71 100644
--- a/Lib/hmac.py
+++ b/Lib/hmac.py
@@ -4,6 +4,7 @@ Implements the HMAC algorithm as described by RFC 2104.
"""
import warnings as _warnings
+from operator import _compare_digest as compare_digest
trans_5C = bytes((x ^ 0x5C) for x in range(256))
trans_36 = bytes((x ^ 0x36) for x in range(256))
@@ -13,6 +14,7 @@ trans_36 = bytes((x ^ 0x36) for x in range(256))
digest_size = None
+
class HMAC:
"""RFC 2104 HMAC class. Also complies with RFC 4231.
@@ -33,7 +35,7 @@ class HMAC:
"""
if not isinstance(key, bytes):
- raise TypeError("expected bytes, but got %r" % type(key).__name__)
+ raise TypeError("key: expected bytes, but got %r" % type(key).__name__)
if digestmod is None:
import hashlib
diff --git a/Lib/html/entities.py b/Lib/html/entities.py
index e2b7bf1..e891ad6 100644
--- a/Lib/html/entities.py
+++ b/Lib/html/entities.py
@@ -256,6 +256,2242 @@ name2codepoint = {
'zwnj': 0x200c, # zero width non-joiner, U+200C NEW RFC 2070
}
+
+# maps the HTML5 named character references to the equivalent Unicode character(s)
+html5 = {
+ 'Aacute': '\xc1',
+ 'aacute': '\xe1',
+ 'Aacute;': '\xc1',
+ 'aacute;': '\xe1',
+ 'Abreve;': '\u0102',
+ 'abreve;': '\u0103',
+ 'ac;': '\u223e',
+ 'acd;': '\u223f',
+ 'acE;': '\u223e\u0333',
+ 'Acirc': '\xc2',
+ 'acirc': '\xe2',
+ 'Acirc;': '\xc2',
+ 'acirc;': '\xe2',
+ 'acute': '\xb4',
+ 'acute;': '\xb4',
+ 'Acy;': '\u0410',
+ 'acy;': '\u0430',
+ 'AElig': '\xc6',
+ 'aelig': '\xe6',
+ 'AElig;': '\xc6',
+ 'aelig;': '\xe6',
+ 'af;': '\u2061',
+ 'Afr;': '\U0001d504',
+ 'afr;': '\U0001d51e',
+ 'Agrave': '\xc0',
+ 'agrave': '\xe0',
+ 'Agrave;': '\xc0',
+ 'agrave;': '\xe0',
+ 'alefsym;': '\u2135',
+ 'aleph;': '\u2135',
+ 'Alpha;': '\u0391',
+ 'alpha;': '\u03b1',
+ 'Amacr;': '\u0100',
+ 'amacr;': '\u0101',
+ 'amalg;': '\u2a3f',
+ 'AMP': '&',
+ 'amp': '&',
+ 'AMP;': '&',
+ 'amp;': '&',
+ 'And;': '\u2a53',
+ 'and;': '\u2227',
+ 'andand;': '\u2a55',
+ 'andd;': '\u2a5c',
+ 'andslope;': '\u2a58',
+ 'andv;': '\u2a5a',
+ 'ang;': '\u2220',
+ 'ange;': '\u29a4',
+ 'angle;': '\u2220',
+ 'angmsd;': '\u2221',
+ 'angmsdaa;': '\u29a8',
+ 'angmsdab;': '\u29a9',
+ 'angmsdac;': '\u29aa',
+ 'angmsdad;': '\u29ab',
+ 'angmsdae;': '\u29ac',
+ 'angmsdaf;': '\u29ad',
+ 'angmsdag;': '\u29ae',
+ 'angmsdah;': '\u29af',
+ 'angrt;': '\u221f',
+ 'angrtvb;': '\u22be',
+ 'angrtvbd;': '\u299d',
+ 'angsph;': '\u2222',
+ 'angst;': '\xc5',
+ 'angzarr;': '\u237c',
+ 'Aogon;': '\u0104',
+ 'aogon;': '\u0105',
+ 'Aopf;': '\U0001d538',
+ 'aopf;': '\U0001d552',
+ 'ap;': '\u2248',
+ 'apacir;': '\u2a6f',
+ 'apE;': '\u2a70',
+ 'ape;': '\u224a',
+ 'apid;': '\u224b',
+ 'apos;': "'",
+ 'ApplyFunction;': '\u2061',
+ 'approx;': '\u2248',
+ 'approxeq;': '\u224a',
+ 'Aring': '\xc5',
+ 'aring': '\xe5',
+ 'Aring;': '\xc5',
+ 'aring;': '\xe5',
+ 'Ascr;': '\U0001d49c',
+ 'ascr;': '\U0001d4b6',
+ 'Assign;': '\u2254',
+ 'ast;': '*',
+ 'asymp;': '\u2248',
+ 'asympeq;': '\u224d',
+ 'Atilde': '\xc3',
+ 'atilde': '\xe3',
+ 'Atilde;': '\xc3',
+ 'atilde;': '\xe3',
+ 'Auml': '\xc4',
+ 'auml': '\xe4',
+ 'Auml;': '\xc4',
+ 'auml;': '\xe4',
+ 'awconint;': '\u2233',
+ 'awint;': '\u2a11',
+ 'backcong;': '\u224c',
+ 'backepsilon;': '\u03f6',
+ 'backprime;': '\u2035',
+ 'backsim;': '\u223d',
+ 'backsimeq;': '\u22cd',
+ 'Backslash;': '\u2216',
+ 'Barv;': '\u2ae7',
+ 'barvee;': '\u22bd',
+ 'Barwed;': '\u2306',
+ 'barwed;': '\u2305',
+ 'barwedge;': '\u2305',
+ 'bbrk;': '\u23b5',
+ 'bbrktbrk;': '\u23b6',
+ 'bcong;': '\u224c',
+ 'Bcy;': '\u0411',
+ 'bcy;': '\u0431',
+ 'bdquo;': '\u201e',
+ 'becaus;': '\u2235',
+ 'Because;': '\u2235',
+ 'because;': '\u2235',
+ 'bemptyv;': '\u29b0',
+ 'bepsi;': '\u03f6',
+ 'bernou;': '\u212c',
+ 'Bernoullis;': '\u212c',
+ 'Beta;': '\u0392',
+ 'beta;': '\u03b2',
+ 'beth;': '\u2136',
+ 'between;': '\u226c',
+ 'Bfr;': '\U0001d505',
+ 'bfr;': '\U0001d51f',
+ 'bigcap;': '\u22c2',
+ 'bigcirc;': '\u25ef',
+ 'bigcup;': '\u22c3',
+ 'bigodot;': '\u2a00',
+ 'bigoplus;': '\u2a01',
+ 'bigotimes;': '\u2a02',
+ 'bigsqcup;': '\u2a06',
+ 'bigstar;': '\u2605',
+ 'bigtriangledown;': '\u25bd',
+ 'bigtriangleup;': '\u25b3',
+ 'biguplus;': '\u2a04',
+ 'bigvee;': '\u22c1',
+ 'bigwedge;': '\u22c0',
+ 'bkarow;': '\u290d',
+ 'blacklozenge;': '\u29eb',
+ 'blacksquare;': '\u25aa',
+ 'blacktriangle;': '\u25b4',
+ 'blacktriangledown;': '\u25be',
+ 'blacktriangleleft;': '\u25c2',
+ 'blacktriangleright;': '\u25b8',
+ 'blank;': '\u2423',
+ 'blk12;': '\u2592',
+ 'blk14;': '\u2591',
+ 'blk34;': '\u2593',
+ 'block;': '\u2588',
+ 'bne;': '=\u20e5',
+ 'bnequiv;': '\u2261\u20e5',
+ 'bNot;': '\u2aed',
+ 'bnot;': '\u2310',
+ 'Bopf;': '\U0001d539',
+ 'bopf;': '\U0001d553',
+ 'bot;': '\u22a5',
+ 'bottom;': '\u22a5',
+ 'bowtie;': '\u22c8',
+ 'boxbox;': '\u29c9',
+ 'boxDL;': '\u2557',
+ 'boxDl;': '\u2556',
+ 'boxdL;': '\u2555',
+ 'boxdl;': '\u2510',
+ 'boxDR;': '\u2554',
+ 'boxDr;': '\u2553',
+ 'boxdR;': '\u2552',
+ 'boxdr;': '\u250c',
+ 'boxH;': '\u2550',
+ 'boxh;': '\u2500',
+ 'boxHD;': '\u2566',
+ 'boxHd;': '\u2564',
+ 'boxhD;': '\u2565',
+ 'boxhd;': '\u252c',
+ 'boxHU;': '\u2569',
+ 'boxHu;': '\u2567',
+ 'boxhU;': '\u2568',
+ 'boxhu;': '\u2534',
+ 'boxminus;': '\u229f',
+ 'boxplus;': '\u229e',
+ 'boxtimes;': '\u22a0',
+ 'boxUL;': '\u255d',
+ 'boxUl;': '\u255c',
+ 'boxuL;': '\u255b',
+ 'boxul;': '\u2518',
+ 'boxUR;': '\u255a',
+ 'boxUr;': '\u2559',
+ 'boxuR;': '\u2558',
+ 'boxur;': '\u2514',
+ 'boxV;': '\u2551',
+ 'boxv;': '\u2502',
+ 'boxVH;': '\u256c',
+ 'boxVh;': '\u256b',
+ 'boxvH;': '\u256a',
+ 'boxvh;': '\u253c',
+ 'boxVL;': '\u2563',
+ 'boxVl;': '\u2562',
+ 'boxvL;': '\u2561',
+ 'boxvl;': '\u2524',
+ 'boxVR;': '\u2560',
+ 'boxVr;': '\u255f',
+ 'boxvR;': '\u255e',
+ 'boxvr;': '\u251c',
+ 'bprime;': '\u2035',
+ 'Breve;': '\u02d8',
+ 'breve;': '\u02d8',
+ 'brvbar': '\xa6',
+ 'brvbar;': '\xa6',
+ 'Bscr;': '\u212c',
+ 'bscr;': '\U0001d4b7',
+ 'bsemi;': '\u204f',
+ 'bsim;': '\u223d',
+ 'bsime;': '\u22cd',
+ 'bsol;': '\\',
+ 'bsolb;': '\u29c5',
+ 'bsolhsub;': '\u27c8',
+ 'bull;': '\u2022',
+ 'bullet;': '\u2022',
+ 'bump;': '\u224e',
+ 'bumpE;': '\u2aae',
+ 'bumpe;': '\u224f',
+ 'Bumpeq;': '\u224e',
+ 'bumpeq;': '\u224f',
+ 'Cacute;': '\u0106',
+ 'cacute;': '\u0107',
+ 'Cap;': '\u22d2',
+ 'cap;': '\u2229',
+ 'capand;': '\u2a44',
+ 'capbrcup;': '\u2a49',
+ 'capcap;': '\u2a4b',
+ 'capcup;': '\u2a47',
+ 'capdot;': '\u2a40',
+ 'CapitalDifferentialD;': '\u2145',
+ 'caps;': '\u2229\ufe00',
+ 'caret;': '\u2041',
+ 'caron;': '\u02c7',
+ 'Cayleys;': '\u212d',
+ 'ccaps;': '\u2a4d',
+ 'Ccaron;': '\u010c',
+ 'ccaron;': '\u010d',
+ 'Ccedil': '\xc7',
+ 'ccedil': '\xe7',
+ 'Ccedil;': '\xc7',
+ 'ccedil;': '\xe7',
+ 'Ccirc;': '\u0108',
+ 'ccirc;': '\u0109',
+ 'Cconint;': '\u2230',
+ 'ccups;': '\u2a4c',
+ 'ccupssm;': '\u2a50',
+ 'Cdot;': '\u010a',
+ 'cdot;': '\u010b',
+ 'cedil': '\xb8',
+ 'cedil;': '\xb8',
+ 'Cedilla;': '\xb8',
+ 'cemptyv;': '\u29b2',
+ 'cent': '\xa2',
+ 'cent;': '\xa2',
+ 'CenterDot;': '\xb7',
+ 'centerdot;': '\xb7',
+ 'Cfr;': '\u212d',
+ 'cfr;': '\U0001d520',
+ 'CHcy;': '\u0427',
+ 'chcy;': '\u0447',
+ 'check;': '\u2713',
+ 'checkmark;': '\u2713',
+ 'Chi;': '\u03a7',
+ 'chi;': '\u03c7',
+ 'cir;': '\u25cb',
+ 'circ;': '\u02c6',
+ 'circeq;': '\u2257',
+ 'circlearrowleft;': '\u21ba',
+ 'circlearrowright;': '\u21bb',
+ 'circledast;': '\u229b',
+ 'circledcirc;': '\u229a',
+ 'circleddash;': '\u229d',
+ 'CircleDot;': '\u2299',
+ 'circledR;': '\xae',
+ 'circledS;': '\u24c8',
+ 'CircleMinus;': '\u2296',
+ 'CirclePlus;': '\u2295',
+ 'CircleTimes;': '\u2297',
+ 'cirE;': '\u29c3',
+ 'cire;': '\u2257',
+ 'cirfnint;': '\u2a10',
+ 'cirmid;': '\u2aef',
+ 'cirscir;': '\u29c2',
+ 'ClockwiseContourIntegral;': '\u2232',
+ 'CloseCurlyDoubleQuote;': '\u201d',
+ 'CloseCurlyQuote;': '\u2019',
+ 'clubs;': '\u2663',
+ 'clubsuit;': '\u2663',
+ 'Colon;': '\u2237',
+ 'colon;': ':',
+ 'Colone;': '\u2a74',
+ 'colone;': '\u2254',
+ 'coloneq;': '\u2254',
+ 'comma;': ',',
+ 'commat;': '@',
+ 'comp;': '\u2201',
+ 'compfn;': '\u2218',
+ 'complement;': '\u2201',
+ 'complexes;': '\u2102',
+ 'cong;': '\u2245',
+ 'congdot;': '\u2a6d',
+ 'Congruent;': '\u2261',
+ 'Conint;': '\u222f',
+ 'conint;': '\u222e',
+ 'ContourIntegral;': '\u222e',
+ 'Copf;': '\u2102',
+ 'copf;': '\U0001d554',
+ 'coprod;': '\u2210',
+ 'Coproduct;': '\u2210',
+ 'COPY': '\xa9',
+ 'copy': '\xa9',
+ 'COPY;': '\xa9',
+ 'copy;': '\xa9',
+ 'copysr;': '\u2117',
+ 'CounterClockwiseContourIntegral;': '\u2233',
+ 'crarr;': '\u21b5',
+ 'Cross;': '\u2a2f',
+ 'cross;': '\u2717',
+ 'Cscr;': '\U0001d49e',
+ 'cscr;': '\U0001d4b8',
+ 'csub;': '\u2acf',
+ 'csube;': '\u2ad1',
+ 'csup;': '\u2ad0',
+ 'csupe;': '\u2ad2',
+ 'ctdot;': '\u22ef',
+ 'cudarrl;': '\u2938',
+ 'cudarrr;': '\u2935',
+ 'cuepr;': '\u22de',
+ 'cuesc;': '\u22df',
+ 'cularr;': '\u21b6',
+ 'cularrp;': '\u293d',
+ 'Cup;': '\u22d3',
+ 'cup;': '\u222a',
+ 'cupbrcap;': '\u2a48',
+ 'CupCap;': '\u224d',
+ 'cupcap;': '\u2a46',
+ 'cupcup;': '\u2a4a',
+ 'cupdot;': '\u228d',
+ 'cupor;': '\u2a45',
+ 'cups;': '\u222a\ufe00',
+ 'curarr;': '\u21b7',
+ 'curarrm;': '\u293c',
+ 'curlyeqprec;': '\u22de',
+ 'curlyeqsucc;': '\u22df',
+ 'curlyvee;': '\u22ce',
+ 'curlywedge;': '\u22cf',
+ 'curren': '\xa4',
+ 'curren;': '\xa4',
+ 'curvearrowleft;': '\u21b6',
+ 'curvearrowright;': '\u21b7',
+ 'cuvee;': '\u22ce',
+ 'cuwed;': '\u22cf',
+ 'cwconint;': '\u2232',
+ 'cwint;': '\u2231',
+ 'cylcty;': '\u232d',
+ 'Dagger;': '\u2021',
+ 'dagger;': '\u2020',
+ 'daleth;': '\u2138',
+ 'Darr;': '\u21a1',
+ 'dArr;': '\u21d3',
+ 'darr;': '\u2193',
+ 'dash;': '\u2010',
+ 'Dashv;': '\u2ae4',
+ 'dashv;': '\u22a3',
+ 'dbkarow;': '\u290f',
+ 'dblac;': '\u02dd',
+ 'Dcaron;': '\u010e',
+ 'dcaron;': '\u010f',
+ 'Dcy;': '\u0414',
+ 'dcy;': '\u0434',
+ 'DD;': '\u2145',
+ 'dd;': '\u2146',
+ 'ddagger;': '\u2021',
+ 'ddarr;': '\u21ca',
+ 'DDotrahd;': '\u2911',
+ 'ddotseq;': '\u2a77',
+ 'deg': '\xb0',
+ 'deg;': '\xb0',
+ 'Del;': '\u2207',
+ 'Delta;': '\u0394',
+ 'delta;': '\u03b4',
+ 'demptyv;': '\u29b1',
+ 'dfisht;': '\u297f',
+ 'Dfr;': '\U0001d507',
+ 'dfr;': '\U0001d521',
+ 'dHar;': '\u2965',
+ 'dharl;': '\u21c3',
+ 'dharr;': '\u21c2',
+ 'DiacriticalAcute;': '\xb4',
+ 'DiacriticalDot;': '\u02d9',
+ 'DiacriticalDoubleAcute;': '\u02dd',
+ 'DiacriticalGrave;': '`',
+ 'DiacriticalTilde;': '\u02dc',
+ 'diam;': '\u22c4',
+ 'Diamond;': '\u22c4',
+ 'diamond;': '\u22c4',
+ 'diamondsuit;': '\u2666',
+ 'diams;': '\u2666',
+ 'die;': '\xa8',
+ 'DifferentialD;': '\u2146',
+ 'digamma;': '\u03dd',
+ 'disin;': '\u22f2',
+ 'div;': '\xf7',
+ 'divide': '\xf7',
+ 'divide;': '\xf7',
+ 'divideontimes;': '\u22c7',
+ 'divonx;': '\u22c7',
+ 'DJcy;': '\u0402',
+ 'djcy;': '\u0452',
+ 'dlcorn;': '\u231e',
+ 'dlcrop;': '\u230d',
+ 'dollar;': '$',
+ 'Dopf;': '\U0001d53b',
+ 'dopf;': '\U0001d555',
+ 'Dot;': '\xa8',
+ 'dot;': '\u02d9',
+ 'DotDot;': '\u20dc',
+ 'doteq;': '\u2250',
+ 'doteqdot;': '\u2251',
+ 'DotEqual;': '\u2250',
+ 'dotminus;': '\u2238',
+ 'dotplus;': '\u2214',
+ 'dotsquare;': '\u22a1',
+ 'doublebarwedge;': '\u2306',
+ 'DoubleContourIntegral;': '\u222f',
+ 'DoubleDot;': '\xa8',
+ 'DoubleDownArrow;': '\u21d3',
+ 'DoubleLeftArrow;': '\u21d0',
+ 'DoubleLeftRightArrow;': '\u21d4',
+ 'DoubleLeftTee;': '\u2ae4',
+ 'DoubleLongLeftArrow;': '\u27f8',
+ 'DoubleLongLeftRightArrow;': '\u27fa',
+ 'DoubleLongRightArrow;': '\u27f9',
+ 'DoubleRightArrow;': '\u21d2',
+ 'DoubleRightTee;': '\u22a8',
+ 'DoubleUpArrow;': '\u21d1',
+ 'DoubleUpDownArrow;': '\u21d5',
+ 'DoubleVerticalBar;': '\u2225',
+ 'DownArrow;': '\u2193',
+ 'Downarrow;': '\u21d3',
+ 'downarrow;': '\u2193',
+ 'DownArrowBar;': '\u2913',
+ 'DownArrowUpArrow;': '\u21f5',
+ 'DownBreve;': '\u0311',
+ 'downdownarrows;': '\u21ca',
+ 'downharpoonleft;': '\u21c3',
+ 'downharpoonright;': '\u21c2',
+ 'DownLeftRightVector;': '\u2950',
+ 'DownLeftTeeVector;': '\u295e',
+ 'DownLeftVector;': '\u21bd',
+ 'DownLeftVectorBar;': '\u2956',
+ 'DownRightTeeVector;': '\u295f',
+ 'DownRightVector;': '\u21c1',
+ 'DownRightVectorBar;': '\u2957',
+ 'DownTee;': '\u22a4',
+ 'DownTeeArrow;': '\u21a7',
+ 'drbkarow;': '\u2910',
+ 'drcorn;': '\u231f',
+ 'drcrop;': '\u230c',
+ 'Dscr;': '\U0001d49f',
+ 'dscr;': '\U0001d4b9',
+ 'DScy;': '\u0405',
+ 'dscy;': '\u0455',
+ 'dsol;': '\u29f6',
+ 'Dstrok;': '\u0110',
+ 'dstrok;': '\u0111',
+ 'dtdot;': '\u22f1',
+ 'dtri;': '\u25bf',
+ 'dtrif;': '\u25be',
+ 'duarr;': '\u21f5',
+ 'duhar;': '\u296f',
+ 'dwangle;': '\u29a6',
+ 'DZcy;': '\u040f',
+ 'dzcy;': '\u045f',
+ 'dzigrarr;': '\u27ff',
+ 'Eacute': '\xc9',
+ 'eacute': '\xe9',
+ 'Eacute;': '\xc9',
+ 'eacute;': '\xe9',
+ 'easter;': '\u2a6e',
+ 'Ecaron;': '\u011a',
+ 'ecaron;': '\u011b',
+ 'ecir;': '\u2256',
+ 'Ecirc': '\xca',
+ 'ecirc': '\xea',
+ 'Ecirc;': '\xca',
+ 'ecirc;': '\xea',
+ 'ecolon;': '\u2255',
+ 'Ecy;': '\u042d',
+ 'ecy;': '\u044d',
+ 'eDDot;': '\u2a77',
+ 'Edot;': '\u0116',
+ 'eDot;': '\u2251',
+ 'edot;': '\u0117',
+ 'ee;': '\u2147',
+ 'efDot;': '\u2252',
+ 'Efr;': '\U0001d508',
+ 'efr;': '\U0001d522',
+ 'eg;': '\u2a9a',
+ 'Egrave': '\xc8',
+ 'egrave': '\xe8',
+ 'Egrave;': '\xc8',
+ 'egrave;': '\xe8',
+ 'egs;': '\u2a96',
+ 'egsdot;': '\u2a98',
+ 'el;': '\u2a99',
+ 'Element;': '\u2208',
+ 'elinters;': '\u23e7',
+ 'ell;': '\u2113',
+ 'els;': '\u2a95',
+ 'elsdot;': '\u2a97',
+ 'Emacr;': '\u0112',
+ 'emacr;': '\u0113',
+ 'empty;': '\u2205',
+ 'emptyset;': '\u2205',
+ 'EmptySmallSquare;': '\u25fb',
+ 'emptyv;': '\u2205',
+ 'EmptyVerySmallSquare;': '\u25ab',
+ 'emsp13;': '\u2004',
+ 'emsp14;': '\u2005',
+ 'emsp;': '\u2003',
+ 'ENG;': '\u014a',
+ 'eng;': '\u014b',
+ 'ensp;': '\u2002',
+ 'Eogon;': '\u0118',
+ 'eogon;': '\u0119',
+ 'Eopf;': '\U0001d53c',
+ 'eopf;': '\U0001d556',
+ 'epar;': '\u22d5',
+ 'eparsl;': '\u29e3',
+ 'eplus;': '\u2a71',
+ 'epsi;': '\u03b5',
+ 'Epsilon;': '\u0395',
+ 'epsilon;': '\u03b5',
+ 'epsiv;': '\u03f5',
+ 'eqcirc;': '\u2256',
+ 'eqcolon;': '\u2255',
+ 'eqsim;': '\u2242',
+ 'eqslantgtr;': '\u2a96',
+ 'eqslantless;': '\u2a95',
+ 'Equal;': '\u2a75',
+ 'equals;': '=',
+ 'EqualTilde;': '\u2242',
+ 'equest;': '\u225f',
+ 'Equilibrium;': '\u21cc',
+ 'equiv;': '\u2261',
+ 'equivDD;': '\u2a78',
+ 'eqvparsl;': '\u29e5',
+ 'erarr;': '\u2971',
+ 'erDot;': '\u2253',
+ 'Escr;': '\u2130',
+ 'escr;': '\u212f',
+ 'esdot;': '\u2250',
+ 'Esim;': '\u2a73',
+ 'esim;': '\u2242',
+ 'Eta;': '\u0397',
+ 'eta;': '\u03b7',
+ 'ETH': '\xd0',
+ 'eth': '\xf0',
+ 'ETH;': '\xd0',
+ 'eth;': '\xf0',
+ 'Euml': '\xcb',
+ 'euml': '\xeb',
+ 'Euml;': '\xcb',
+ 'euml;': '\xeb',
+ 'euro;': '\u20ac',
+ 'excl;': '!',
+ 'exist;': '\u2203',
+ 'Exists;': '\u2203',
+ 'expectation;': '\u2130',
+ 'ExponentialE;': '\u2147',
+ 'exponentiale;': '\u2147',
+ 'fallingdotseq;': '\u2252',
+ 'Fcy;': '\u0424',
+ 'fcy;': '\u0444',
+ 'female;': '\u2640',
+ 'ffilig;': '\ufb03',
+ 'fflig;': '\ufb00',
+ 'ffllig;': '\ufb04',
+ 'Ffr;': '\U0001d509',
+ 'ffr;': '\U0001d523',
+ 'filig;': '\ufb01',
+ 'FilledSmallSquare;': '\u25fc',
+ 'FilledVerySmallSquare;': '\u25aa',
+ 'fjlig;': 'fj',
+ 'flat;': '\u266d',
+ 'fllig;': '\ufb02',
+ 'fltns;': '\u25b1',
+ 'fnof;': '\u0192',
+ 'Fopf;': '\U0001d53d',
+ 'fopf;': '\U0001d557',
+ 'ForAll;': '\u2200',
+ 'forall;': '\u2200',
+ 'fork;': '\u22d4',
+ 'forkv;': '\u2ad9',
+ 'Fouriertrf;': '\u2131',
+ 'fpartint;': '\u2a0d',
+ 'frac12': '\xbd',
+ 'frac12;': '\xbd',
+ 'frac13;': '\u2153',
+ 'frac14': '\xbc',
+ 'frac14;': '\xbc',
+ 'frac15;': '\u2155',
+ 'frac16;': '\u2159',
+ 'frac18;': '\u215b',
+ 'frac23;': '\u2154',
+ 'frac25;': '\u2156',
+ 'frac34': '\xbe',
+ 'frac34;': '\xbe',
+ 'frac35;': '\u2157',
+ 'frac38;': '\u215c',
+ 'frac45;': '\u2158',
+ 'frac56;': '\u215a',
+ 'frac58;': '\u215d',
+ 'frac78;': '\u215e',
+ 'frasl;': '\u2044',
+ 'frown;': '\u2322',
+ 'Fscr;': '\u2131',
+ 'fscr;': '\U0001d4bb',
+ 'gacute;': '\u01f5',
+ 'Gamma;': '\u0393',
+ 'gamma;': '\u03b3',
+ 'Gammad;': '\u03dc',
+ 'gammad;': '\u03dd',
+ 'gap;': '\u2a86',
+ 'Gbreve;': '\u011e',
+ 'gbreve;': '\u011f',
+ 'Gcedil;': '\u0122',
+ 'Gcirc;': '\u011c',
+ 'gcirc;': '\u011d',
+ 'Gcy;': '\u0413',
+ 'gcy;': '\u0433',
+ 'Gdot;': '\u0120',
+ 'gdot;': '\u0121',
+ 'gE;': '\u2267',
+ 'ge;': '\u2265',
+ 'gEl;': '\u2a8c',
+ 'gel;': '\u22db',
+ 'geq;': '\u2265',
+ 'geqq;': '\u2267',
+ 'geqslant;': '\u2a7e',
+ 'ges;': '\u2a7e',
+ 'gescc;': '\u2aa9',
+ 'gesdot;': '\u2a80',
+ 'gesdoto;': '\u2a82',
+ 'gesdotol;': '\u2a84',
+ 'gesl;': '\u22db\ufe00',
+ 'gesles;': '\u2a94',
+ 'Gfr;': '\U0001d50a',
+ 'gfr;': '\U0001d524',
+ 'Gg;': '\u22d9',
+ 'gg;': '\u226b',
+ 'ggg;': '\u22d9',
+ 'gimel;': '\u2137',
+ 'GJcy;': '\u0403',
+ 'gjcy;': '\u0453',
+ 'gl;': '\u2277',
+ 'gla;': '\u2aa5',
+ 'glE;': '\u2a92',
+ 'glj;': '\u2aa4',
+ 'gnap;': '\u2a8a',
+ 'gnapprox;': '\u2a8a',
+ 'gnE;': '\u2269',
+ 'gne;': '\u2a88',
+ 'gneq;': '\u2a88',
+ 'gneqq;': '\u2269',
+ 'gnsim;': '\u22e7',
+ 'Gopf;': '\U0001d53e',
+ 'gopf;': '\U0001d558',
+ 'grave;': '`',
+ 'GreaterEqual;': '\u2265',
+ 'GreaterEqualLess;': '\u22db',
+ 'GreaterFullEqual;': '\u2267',
+ 'GreaterGreater;': '\u2aa2',
+ 'GreaterLess;': '\u2277',
+ 'GreaterSlantEqual;': '\u2a7e',
+ 'GreaterTilde;': '\u2273',
+ 'Gscr;': '\U0001d4a2',
+ 'gscr;': '\u210a',
+ 'gsim;': '\u2273',
+ 'gsime;': '\u2a8e',
+ 'gsiml;': '\u2a90',
+ 'GT': '>',
+ 'gt': '>',
+ 'GT;': '>',
+ 'Gt;': '\u226b',
+ 'gt;': '>',
+ 'gtcc;': '\u2aa7',
+ 'gtcir;': '\u2a7a',
+ 'gtdot;': '\u22d7',
+ 'gtlPar;': '\u2995',
+ 'gtquest;': '\u2a7c',
+ 'gtrapprox;': '\u2a86',
+ 'gtrarr;': '\u2978',
+ 'gtrdot;': '\u22d7',
+ 'gtreqless;': '\u22db',
+ 'gtreqqless;': '\u2a8c',
+ 'gtrless;': '\u2277',
+ 'gtrsim;': '\u2273',
+ 'gvertneqq;': '\u2269\ufe00',
+ 'gvnE;': '\u2269\ufe00',
+ 'Hacek;': '\u02c7',
+ 'hairsp;': '\u200a',
+ 'half;': '\xbd',
+ 'hamilt;': '\u210b',
+ 'HARDcy;': '\u042a',
+ 'hardcy;': '\u044a',
+ 'hArr;': '\u21d4',
+ 'harr;': '\u2194',
+ 'harrcir;': '\u2948',
+ 'harrw;': '\u21ad',
+ 'Hat;': '^',
+ 'hbar;': '\u210f',
+ 'Hcirc;': '\u0124',
+ 'hcirc;': '\u0125',
+ 'hearts;': '\u2665',
+ 'heartsuit;': '\u2665',
+ 'hellip;': '\u2026',
+ 'hercon;': '\u22b9',
+ 'Hfr;': '\u210c',
+ 'hfr;': '\U0001d525',
+ 'HilbertSpace;': '\u210b',
+ 'hksearow;': '\u2925',
+ 'hkswarow;': '\u2926',
+ 'hoarr;': '\u21ff',
+ 'homtht;': '\u223b',
+ 'hookleftarrow;': '\u21a9',
+ 'hookrightarrow;': '\u21aa',
+ 'Hopf;': '\u210d',
+ 'hopf;': '\U0001d559',
+ 'horbar;': '\u2015',
+ 'HorizontalLine;': '\u2500',
+ 'Hscr;': '\u210b',
+ 'hscr;': '\U0001d4bd',
+ 'hslash;': '\u210f',
+ 'Hstrok;': '\u0126',
+ 'hstrok;': '\u0127',
+ 'HumpDownHump;': '\u224e',
+ 'HumpEqual;': '\u224f',
+ 'hybull;': '\u2043',
+ 'hyphen;': '\u2010',
+ 'Iacute': '\xcd',
+ 'iacute': '\xed',
+ 'Iacute;': '\xcd',
+ 'iacute;': '\xed',
+ 'ic;': '\u2063',
+ 'Icirc': '\xce',
+ 'icirc': '\xee',
+ 'Icirc;': '\xce',
+ 'icirc;': '\xee',
+ 'Icy;': '\u0418',
+ 'icy;': '\u0438',
+ 'Idot;': '\u0130',
+ 'IEcy;': '\u0415',
+ 'iecy;': '\u0435',
+ 'iexcl': '\xa1',
+ 'iexcl;': '\xa1',
+ 'iff;': '\u21d4',
+ 'Ifr;': '\u2111',
+ 'ifr;': '\U0001d526',
+ 'Igrave': '\xcc',
+ 'igrave': '\xec',
+ 'Igrave;': '\xcc',
+ 'igrave;': '\xec',
+ 'ii;': '\u2148',
+ 'iiiint;': '\u2a0c',
+ 'iiint;': '\u222d',
+ 'iinfin;': '\u29dc',
+ 'iiota;': '\u2129',
+ 'IJlig;': '\u0132',
+ 'ijlig;': '\u0133',
+ 'Im;': '\u2111',
+ 'Imacr;': '\u012a',
+ 'imacr;': '\u012b',
+ 'image;': '\u2111',
+ 'ImaginaryI;': '\u2148',
+ 'imagline;': '\u2110',
+ 'imagpart;': '\u2111',
+ 'imath;': '\u0131',
+ 'imof;': '\u22b7',
+ 'imped;': '\u01b5',
+ 'Implies;': '\u21d2',
+ 'in;': '\u2208',
+ 'incare;': '\u2105',
+ 'infin;': '\u221e',
+ 'infintie;': '\u29dd',
+ 'inodot;': '\u0131',
+ 'Int;': '\u222c',
+ 'int;': '\u222b',
+ 'intcal;': '\u22ba',
+ 'integers;': '\u2124',
+ 'Integral;': '\u222b',
+ 'intercal;': '\u22ba',
+ 'Intersection;': '\u22c2',
+ 'intlarhk;': '\u2a17',
+ 'intprod;': '\u2a3c',
+ 'InvisibleComma;': '\u2063',
+ 'InvisibleTimes;': '\u2062',
+ 'IOcy;': '\u0401',
+ 'iocy;': '\u0451',
+ 'Iogon;': '\u012e',
+ 'iogon;': '\u012f',
+ 'Iopf;': '\U0001d540',
+ 'iopf;': '\U0001d55a',
+ 'Iota;': '\u0399',
+ 'iota;': '\u03b9',
+ 'iprod;': '\u2a3c',
+ 'iquest': '\xbf',
+ 'iquest;': '\xbf',
+ 'Iscr;': '\u2110',
+ 'iscr;': '\U0001d4be',
+ 'isin;': '\u2208',
+ 'isindot;': '\u22f5',
+ 'isinE;': '\u22f9',
+ 'isins;': '\u22f4',
+ 'isinsv;': '\u22f3',
+ 'isinv;': '\u2208',
+ 'it;': '\u2062',
+ 'Itilde;': '\u0128',
+ 'itilde;': '\u0129',
+ 'Iukcy;': '\u0406',
+ 'iukcy;': '\u0456',
+ 'Iuml': '\xcf',
+ 'iuml': '\xef',
+ 'Iuml;': '\xcf',
+ 'iuml;': '\xef',
+ 'Jcirc;': '\u0134',
+ 'jcirc;': '\u0135',
+ 'Jcy;': '\u0419',
+ 'jcy;': '\u0439',
+ 'Jfr;': '\U0001d50d',
+ 'jfr;': '\U0001d527',
+ 'jmath;': '\u0237',
+ 'Jopf;': '\U0001d541',
+ 'jopf;': '\U0001d55b',
+ 'Jscr;': '\U0001d4a5',
+ 'jscr;': '\U0001d4bf',
+ 'Jsercy;': '\u0408',
+ 'jsercy;': '\u0458',
+ 'Jukcy;': '\u0404',
+ 'jukcy;': '\u0454',
+ 'Kappa;': '\u039a',
+ 'kappa;': '\u03ba',
+ 'kappav;': '\u03f0',
+ 'Kcedil;': '\u0136',
+ 'kcedil;': '\u0137',
+ 'Kcy;': '\u041a',
+ 'kcy;': '\u043a',
+ 'Kfr;': '\U0001d50e',
+ 'kfr;': '\U0001d528',
+ 'kgreen;': '\u0138',
+ 'KHcy;': '\u0425',
+ 'khcy;': '\u0445',
+ 'KJcy;': '\u040c',
+ 'kjcy;': '\u045c',
+ 'Kopf;': '\U0001d542',
+ 'kopf;': '\U0001d55c',
+ 'Kscr;': '\U0001d4a6',
+ 'kscr;': '\U0001d4c0',
+ 'lAarr;': '\u21da',
+ 'Lacute;': '\u0139',
+ 'lacute;': '\u013a',
+ 'laemptyv;': '\u29b4',
+ 'lagran;': '\u2112',
+ 'Lambda;': '\u039b',
+ 'lambda;': '\u03bb',
+ 'Lang;': '\u27ea',
+ 'lang;': '\u27e8',
+ 'langd;': '\u2991',
+ 'langle;': '\u27e8',
+ 'lap;': '\u2a85',
+ 'Laplacetrf;': '\u2112',
+ 'laquo': '\xab',
+ 'laquo;': '\xab',
+ 'Larr;': '\u219e',
+ 'lArr;': '\u21d0',
+ 'larr;': '\u2190',
+ 'larrb;': '\u21e4',
+ 'larrbfs;': '\u291f',
+ 'larrfs;': '\u291d',
+ 'larrhk;': '\u21a9',
+ 'larrlp;': '\u21ab',
+ 'larrpl;': '\u2939',
+ 'larrsim;': '\u2973',
+ 'larrtl;': '\u21a2',
+ 'lat;': '\u2aab',
+ 'lAtail;': '\u291b',
+ 'latail;': '\u2919',
+ 'late;': '\u2aad',
+ 'lates;': '\u2aad\ufe00',
+ 'lBarr;': '\u290e',
+ 'lbarr;': '\u290c',
+ 'lbbrk;': '\u2772',
+ 'lbrace;': '{',
+ 'lbrack;': '[',
+ 'lbrke;': '\u298b',
+ 'lbrksld;': '\u298f',
+ 'lbrkslu;': '\u298d',
+ 'Lcaron;': '\u013d',
+ 'lcaron;': '\u013e',
+ 'Lcedil;': '\u013b',
+ 'lcedil;': '\u013c',
+ 'lceil;': '\u2308',
+ 'lcub;': '{',
+ 'Lcy;': '\u041b',
+ 'lcy;': '\u043b',
+ 'ldca;': '\u2936',
+ 'ldquo;': '\u201c',
+ 'ldquor;': '\u201e',
+ 'ldrdhar;': '\u2967',
+ 'ldrushar;': '\u294b',
+ 'ldsh;': '\u21b2',
+ 'lE;': '\u2266',
+ 'le;': '\u2264',
+ 'LeftAngleBracket;': '\u27e8',
+ 'LeftArrow;': '\u2190',
+ 'Leftarrow;': '\u21d0',
+ 'leftarrow;': '\u2190',
+ 'LeftArrowBar;': '\u21e4',
+ 'LeftArrowRightArrow;': '\u21c6',
+ 'leftarrowtail;': '\u21a2',
+ 'LeftCeiling;': '\u2308',
+ 'LeftDoubleBracket;': '\u27e6',
+ 'LeftDownTeeVector;': '\u2961',
+ 'LeftDownVector;': '\u21c3',
+ 'LeftDownVectorBar;': '\u2959',
+ 'LeftFloor;': '\u230a',
+ 'leftharpoondown;': '\u21bd',
+ 'leftharpoonup;': '\u21bc',
+ 'leftleftarrows;': '\u21c7',
+ 'LeftRightArrow;': '\u2194',
+ 'Leftrightarrow;': '\u21d4',
+ 'leftrightarrow;': '\u2194',
+ 'leftrightarrows;': '\u21c6',
+ 'leftrightharpoons;': '\u21cb',
+ 'leftrightsquigarrow;': '\u21ad',
+ 'LeftRightVector;': '\u294e',
+ 'LeftTee;': '\u22a3',
+ 'LeftTeeArrow;': '\u21a4',
+ 'LeftTeeVector;': '\u295a',
+ 'leftthreetimes;': '\u22cb',
+ 'LeftTriangle;': '\u22b2',
+ 'LeftTriangleBar;': '\u29cf',
+ 'LeftTriangleEqual;': '\u22b4',
+ 'LeftUpDownVector;': '\u2951',
+ 'LeftUpTeeVector;': '\u2960',
+ 'LeftUpVector;': '\u21bf',
+ 'LeftUpVectorBar;': '\u2958',
+ 'LeftVector;': '\u21bc',
+ 'LeftVectorBar;': '\u2952',
+ 'lEg;': '\u2a8b',
+ 'leg;': '\u22da',
+ 'leq;': '\u2264',
+ 'leqq;': '\u2266',
+ 'leqslant;': '\u2a7d',
+ 'les;': '\u2a7d',
+ 'lescc;': '\u2aa8',
+ 'lesdot;': '\u2a7f',
+ 'lesdoto;': '\u2a81',
+ 'lesdotor;': '\u2a83',
+ 'lesg;': '\u22da\ufe00',
+ 'lesges;': '\u2a93',
+ 'lessapprox;': '\u2a85',
+ 'lessdot;': '\u22d6',
+ 'lesseqgtr;': '\u22da',
+ 'lesseqqgtr;': '\u2a8b',
+ 'LessEqualGreater;': '\u22da',
+ 'LessFullEqual;': '\u2266',
+ 'LessGreater;': '\u2276',
+ 'lessgtr;': '\u2276',
+ 'LessLess;': '\u2aa1',
+ 'lesssim;': '\u2272',
+ 'LessSlantEqual;': '\u2a7d',
+ 'LessTilde;': '\u2272',
+ 'lfisht;': '\u297c',
+ 'lfloor;': '\u230a',
+ 'Lfr;': '\U0001d50f',
+ 'lfr;': '\U0001d529',
+ 'lg;': '\u2276',
+ 'lgE;': '\u2a91',
+ 'lHar;': '\u2962',
+ 'lhard;': '\u21bd',
+ 'lharu;': '\u21bc',
+ 'lharul;': '\u296a',
+ 'lhblk;': '\u2584',
+ 'LJcy;': '\u0409',
+ 'ljcy;': '\u0459',
+ 'Ll;': '\u22d8',
+ 'll;': '\u226a',
+ 'llarr;': '\u21c7',
+ 'llcorner;': '\u231e',
+ 'Lleftarrow;': '\u21da',
+ 'llhard;': '\u296b',
+ 'lltri;': '\u25fa',
+ 'Lmidot;': '\u013f',
+ 'lmidot;': '\u0140',
+ 'lmoust;': '\u23b0',
+ 'lmoustache;': '\u23b0',
+ 'lnap;': '\u2a89',
+ 'lnapprox;': '\u2a89',
+ 'lnE;': '\u2268',
+ 'lne;': '\u2a87',
+ 'lneq;': '\u2a87',
+ 'lneqq;': '\u2268',
+ 'lnsim;': '\u22e6',
+ 'loang;': '\u27ec',
+ 'loarr;': '\u21fd',
+ 'lobrk;': '\u27e6',
+ 'LongLeftArrow;': '\u27f5',
+ 'Longleftarrow;': '\u27f8',
+ 'longleftarrow;': '\u27f5',
+ 'LongLeftRightArrow;': '\u27f7',
+ 'Longleftrightarrow;': '\u27fa',
+ 'longleftrightarrow;': '\u27f7',
+ 'longmapsto;': '\u27fc',
+ 'LongRightArrow;': '\u27f6',
+ 'Longrightarrow;': '\u27f9',
+ 'longrightarrow;': '\u27f6',
+ 'looparrowleft;': '\u21ab',
+ 'looparrowright;': '\u21ac',
+ 'lopar;': '\u2985',
+ 'Lopf;': '\U0001d543',
+ 'lopf;': '\U0001d55d',
+ 'loplus;': '\u2a2d',
+ 'lotimes;': '\u2a34',
+ 'lowast;': '\u2217',
+ 'lowbar;': '_',
+ 'LowerLeftArrow;': '\u2199',
+ 'LowerRightArrow;': '\u2198',
+ 'loz;': '\u25ca',
+ 'lozenge;': '\u25ca',
+ 'lozf;': '\u29eb',
+ 'lpar;': '(',
+ 'lparlt;': '\u2993',
+ 'lrarr;': '\u21c6',
+ 'lrcorner;': '\u231f',
+ 'lrhar;': '\u21cb',
+ 'lrhard;': '\u296d',
+ 'lrm;': '\u200e',
+ 'lrtri;': '\u22bf',
+ 'lsaquo;': '\u2039',
+ 'Lscr;': '\u2112',
+ 'lscr;': '\U0001d4c1',
+ 'Lsh;': '\u21b0',
+ 'lsh;': '\u21b0',
+ 'lsim;': '\u2272',
+ 'lsime;': '\u2a8d',
+ 'lsimg;': '\u2a8f',
+ 'lsqb;': '[',
+ 'lsquo;': '\u2018',
+ 'lsquor;': '\u201a',
+ 'Lstrok;': '\u0141',
+ 'lstrok;': '\u0142',
+ 'LT': '<',
+ 'lt': '<',
+ 'LT;': '<',
+ 'Lt;': '\u226a',
+ 'lt;': '<',
+ 'ltcc;': '\u2aa6',
+ 'ltcir;': '\u2a79',
+ 'ltdot;': '\u22d6',
+ 'lthree;': '\u22cb',
+ 'ltimes;': '\u22c9',
+ 'ltlarr;': '\u2976',
+ 'ltquest;': '\u2a7b',
+ 'ltri;': '\u25c3',
+ 'ltrie;': '\u22b4',
+ 'ltrif;': '\u25c2',
+ 'ltrPar;': '\u2996',
+ 'lurdshar;': '\u294a',
+ 'luruhar;': '\u2966',
+ 'lvertneqq;': '\u2268\ufe00',
+ 'lvnE;': '\u2268\ufe00',
+ 'macr': '\xaf',
+ 'macr;': '\xaf',
+ 'male;': '\u2642',
+ 'malt;': '\u2720',
+ 'maltese;': '\u2720',
+ 'Map;': '\u2905',
+ 'map;': '\u21a6',
+ 'mapsto;': '\u21a6',
+ 'mapstodown;': '\u21a7',
+ 'mapstoleft;': '\u21a4',
+ 'mapstoup;': '\u21a5',
+ 'marker;': '\u25ae',
+ 'mcomma;': '\u2a29',
+ 'Mcy;': '\u041c',
+ 'mcy;': '\u043c',
+ 'mdash;': '\u2014',
+ 'mDDot;': '\u223a',
+ 'measuredangle;': '\u2221',
+ 'MediumSpace;': '\u205f',
+ 'Mellintrf;': '\u2133',
+ 'Mfr;': '\U0001d510',
+ 'mfr;': '\U0001d52a',
+ 'mho;': '\u2127',
+ 'micro': '\xb5',
+ 'micro;': '\xb5',
+ 'mid;': '\u2223',
+ 'midast;': '*',
+ 'midcir;': '\u2af0',
+ 'middot': '\xb7',
+ 'middot;': '\xb7',
+ 'minus;': '\u2212',
+ 'minusb;': '\u229f',
+ 'minusd;': '\u2238',
+ 'minusdu;': '\u2a2a',
+ 'MinusPlus;': '\u2213',
+ 'mlcp;': '\u2adb',
+ 'mldr;': '\u2026',
+ 'mnplus;': '\u2213',
+ 'models;': '\u22a7',
+ 'Mopf;': '\U0001d544',
+ 'mopf;': '\U0001d55e',
+ 'mp;': '\u2213',
+ 'Mscr;': '\u2133',
+ 'mscr;': '\U0001d4c2',
+ 'mstpos;': '\u223e',
+ 'Mu;': '\u039c',
+ 'mu;': '\u03bc',
+ 'multimap;': '\u22b8',
+ 'mumap;': '\u22b8',
+ 'nabla;': '\u2207',
+ 'Nacute;': '\u0143',
+ 'nacute;': '\u0144',
+ 'nang;': '\u2220\u20d2',
+ 'nap;': '\u2249',
+ 'napE;': '\u2a70\u0338',
+ 'napid;': '\u224b\u0338',
+ 'napos;': '\u0149',
+ 'napprox;': '\u2249',
+ 'natur;': '\u266e',
+ 'natural;': '\u266e',
+ 'naturals;': '\u2115',
+ 'nbsp': '\xa0',
+ 'nbsp;': '\xa0',
+ 'nbump;': '\u224e\u0338',
+ 'nbumpe;': '\u224f\u0338',
+ 'ncap;': '\u2a43',
+ 'Ncaron;': '\u0147',
+ 'ncaron;': '\u0148',
+ 'Ncedil;': '\u0145',
+ 'ncedil;': '\u0146',
+ 'ncong;': '\u2247',
+ 'ncongdot;': '\u2a6d\u0338',
+ 'ncup;': '\u2a42',
+ 'Ncy;': '\u041d',
+ 'ncy;': '\u043d',
+ 'ndash;': '\u2013',
+ 'ne;': '\u2260',
+ 'nearhk;': '\u2924',
+ 'neArr;': '\u21d7',
+ 'nearr;': '\u2197',
+ 'nearrow;': '\u2197',
+ 'nedot;': '\u2250\u0338',
+ 'NegativeMediumSpace;': '\u200b',
+ 'NegativeThickSpace;': '\u200b',
+ 'NegativeThinSpace;': '\u200b',
+ 'NegativeVeryThinSpace;': '\u200b',
+ 'nequiv;': '\u2262',
+ 'nesear;': '\u2928',
+ 'nesim;': '\u2242\u0338',
+ 'NestedGreaterGreater;': '\u226b',
+ 'NestedLessLess;': '\u226a',
+ 'NewLine;': '\n',
+ 'nexist;': '\u2204',
+ 'nexists;': '\u2204',
+ 'Nfr;': '\U0001d511',
+ 'nfr;': '\U0001d52b',
+ 'ngE;': '\u2267\u0338',
+ 'nge;': '\u2271',
+ 'ngeq;': '\u2271',
+ 'ngeqq;': '\u2267\u0338',
+ 'ngeqslant;': '\u2a7e\u0338',
+ 'nges;': '\u2a7e\u0338',
+ 'nGg;': '\u22d9\u0338',
+ 'ngsim;': '\u2275',
+ 'nGt;': '\u226b\u20d2',
+ 'ngt;': '\u226f',
+ 'ngtr;': '\u226f',
+ 'nGtv;': '\u226b\u0338',
+ 'nhArr;': '\u21ce',
+ 'nharr;': '\u21ae',
+ 'nhpar;': '\u2af2',
+ 'ni;': '\u220b',
+ 'nis;': '\u22fc',
+ 'nisd;': '\u22fa',
+ 'niv;': '\u220b',
+ 'NJcy;': '\u040a',
+ 'njcy;': '\u045a',
+ 'nlArr;': '\u21cd',
+ 'nlarr;': '\u219a',
+ 'nldr;': '\u2025',
+ 'nlE;': '\u2266\u0338',
+ 'nle;': '\u2270',
+ 'nLeftarrow;': '\u21cd',
+ 'nleftarrow;': '\u219a',
+ 'nLeftrightarrow;': '\u21ce',
+ 'nleftrightarrow;': '\u21ae',
+ 'nleq;': '\u2270',
+ 'nleqq;': '\u2266\u0338',
+ 'nleqslant;': '\u2a7d\u0338',
+ 'nles;': '\u2a7d\u0338',
+ 'nless;': '\u226e',
+ 'nLl;': '\u22d8\u0338',
+ 'nlsim;': '\u2274',
+ 'nLt;': '\u226a\u20d2',
+ 'nlt;': '\u226e',
+ 'nltri;': '\u22ea',
+ 'nltrie;': '\u22ec',
+ 'nLtv;': '\u226a\u0338',
+ 'nmid;': '\u2224',
+ 'NoBreak;': '\u2060',
+ 'NonBreakingSpace;': '\xa0',
+ 'Nopf;': '\u2115',
+ 'nopf;': '\U0001d55f',
+ 'not': '\xac',
+ 'Not;': '\u2aec',
+ 'not;': '\xac',
+ 'NotCongruent;': '\u2262',
+ 'NotCupCap;': '\u226d',
+ 'NotDoubleVerticalBar;': '\u2226',
+ 'NotElement;': '\u2209',
+ 'NotEqual;': '\u2260',
+ 'NotEqualTilde;': '\u2242\u0338',
+ 'NotExists;': '\u2204',
+ 'NotGreater;': '\u226f',
+ 'NotGreaterEqual;': '\u2271',
+ 'NotGreaterFullEqual;': '\u2267\u0338',
+ 'NotGreaterGreater;': '\u226b\u0338',
+ 'NotGreaterLess;': '\u2279',
+ 'NotGreaterSlantEqual;': '\u2a7e\u0338',
+ 'NotGreaterTilde;': '\u2275',
+ 'NotHumpDownHump;': '\u224e\u0338',
+ 'NotHumpEqual;': '\u224f\u0338',
+ 'notin;': '\u2209',
+ 'notindot;': '\u22f5\u0338',
+ 'notinE;': '\u22f9\u0338',
+ 'notinva;': '\u2209',
+ 'notinvb;': '\u22f7',
+ 'notinvc;': '\u22f6',
+ 'NotLeftTriangle;': '\u22ea',
+ 'NotLeftTriangleBar;': '\u29cf\u0338',
+ 'NotLeftTriangleEqual;': '\u22ec',
+ 'NotLess;': '\u226e',
+ 'NotLessEqual;': '\u2270',
+ 'NotLessGreater;': '\u2278',
+ 'NotLessLess;': '\u226a\u0338',
+ 'NotLessSlantEqual;': '\u2a7d\u0338',
+ 'NotLessTilde;': '\u2274',
+ 'NotNestedGreaterGreater;': '\u2aa2\u0338',
+ 'NotNestedLessLess;': '\u2aa1\u0338',
+ 'notni;': '\u220c',
+ 'notniva;': '\u220c',
+ 'notnivb;': '\u22fe',
+ 'notnivc;': '\u22fd',
+ 'NotPrecedes;': '\u2280',
+ 'NotPrecedesEqual;': '\u2aaf\u0338',
+ 'NotPrecedesSlantEqual;': '\u22e0',
+ 'NotReverseElement;': '\u220c',
+ 'NotRightTriangle;': '\u22eb',
+ 'NotRightTriangleBar;': '\u29d0\u0338',
+ 'NotRightTriangleEqual;': '\u22ed',
+ 'NotSquareSubset;': '\u228f\u0338',
+ 'NotSquareSubsetEqual;': '\u22e2',
+ 'NotSquareSuperset;': '\u2290\u0338',
+ 'NotSquareSupersetEqual;': '\u22e3',
+ 'NotSubset;': '\u2282\u20d2',
+ 'NotSubsetEqual;': '\u2288',
+ 'NotSucceeds;': '\u2281',
+ 'NotSucceedsEqual;': '\u2ab0\u0338',
+ 'NotSucceedsSlantEqual;': '\u22e1',
+ 'NotSucceedsTilde;': '\u227f\u0338',
+ 'NotSuperset;': '\u2283\u20d2',
+ 'NotSupersetEqual;': '\u2289',
+ 'NotTilde;': '\u2241',
+ 'NotTildeEqual;': '\u2244',
+ 'NotTildeFullEqual;': '\u2247',
+ 'NotTildeTilde;': '\u2249',
+ 'NotVerticalBar;': '\u2224',
+ 'npar;': '\u2226',
+ 'nparallel;': '\u2226',
+ 'nparsl;': '\u2afd\u20e5',
+ 'npart;': '\u2202\u0338',
+ 'npolint;': '\u2a14',
+ 'npr;': '\u2280',
+ 'nprcue;': '\u22e0',
+ 'npre;': '\u2aaf\u0338',
+ 'nprec;': '\u2280',
+ 'npreceq;': '\u2aaf\u0338',
+ 'nrArr;': '\u21cf',
+ 'nrarr;': '\u219b',
+ 'nrarrc;': '\u2933\u0338',
+ 'nrarrw;': '\u219d\u0338',
+ 'nRightarrow;': '\u21cf',
+ 'nrightarrow;': '\u219b',
+ 'nrtri;': '\u22eb',
+ 'nrtrie;': '\u22ed',
+ 'nsc;': '\u2281',
+ 'nsccue;': '\u22e1',
+ 'nsce;': '\u2ab0\u0338',
+ 'Nscr;': '\U0001d4a9',
+ 'nscr;': '\U0001d4c3',
+ 'nshortmid;': '\u2224',
+ 'nshortparallel;': '\u2226',
+ 'nsim;': '\u2241',
+ 'nsime;': '\u2244',
+ 'nsimeq;': '\u2244',
+ 'nsmid;': '\u2224',
+ 'nspar;': '\u2226',
+ 'nsqsube;': '\u22e2',
+ 'nsqsupe;': '\u22e3',
+ 'nsub;': '\u2284',
+ 'nsubE;': '\u2ac5\u0338',
+ 'nsube;': '\u2288',
+ 'nsubset;': '\u2282\u20d2',
+ 'nsubseteq;': '\u2288',
+ 'nsubseteqq;': '\u2ac5\u0338',
+ 'nsucc;': '\u2281',
+ 'nsucceq;': '\u2ab0\u0338',
+ 'nsup;': '\u2285',
+ 'nsupE;': '\u2ac6\u0338',
+ 'nsupe;': '\u2289',
+ 'nsupset;': '\u2283\u20d2',
+ 'nsupseteq;': '\u2289',
+ 'nsupseteqq;': '\u2ac6\u0338',
+ 'ntgl;': '\u2279',
+ 'Ntilde': '\xd1',
+ 'ntilde': '\xf1',
+ 'Ntilde;': '\xd1',
+ 'ntilde;': '\xf1',
+ 'ntlg;': '\u2278',
+ 'ntriangleleft;': '\u22ea',
+ 'ntrianglelefteq;': '\u22ec',
+ 'ntriangleright;': '\u22eb',
+ 'ntrianglerighteq;': '\u22ed',
+ 'Nu;': '\u039d',
+ 'nu;': '\u03bd',
+ 'num;': '#',
+ 'numero;': '\u2116',
+ 'numsp;': '\u2007',
+ 'nvap;': '\u224d\u20d2',
+ 'nVDash;': '\u22af',
+ 'nVdash;': '\u22ae',
+ 'nvDash;': '\u22ad',
+ 'nvdash;': '\u22ac',
+ 'nvge;': '\u2265\u20d2',
+ 'nvgt;': '>\u20d2',
+ 'nvHarr;': '\u2904',
+ 'nvinfin;': '\u29de',
+ 'nvlArr;': '\u2902',
+ 'nvle;': '\u2264\u20d2',
+ 'nvlt;': '<\u20d2',
+ 'nvltrie;': '\u22b4\u20d2',
+ 'nvrArr;': '\u2903',
+ 'nvrtrie;': '\u22b5\u20d2',
+ 'nvsim;': '\u223c\u20d2',
+ 'nwarhk;': '\u2923',
+ 'nwArr;': '\u21d6',
+ 'nwarr;': '\u2196',
+ 'nwarrow;': '\u2196',
+ 'nwnear;': '\u2927',
+ 'Oacute': '\xd3',
+ 'oacute': '\xf3',
+ 'Oacute;': '\xd3',
+ 'oacute;': '\xf3',
+ 'oast;': '\u229b',
+ 'ocir;': '\u229a',
+ 'Ocirc': '\xd4',
+ 'ocirc': '\xf4',
+ 'Ocirc;': '\xd4',
+ 'ocirc;': '\xf4',
+ 'Ocy;': '\u041e',
+ 'ocy;': '\u043e',
+ 'odash;': '\u229d',
+ 'Odblac;': '\u0150',
+ 'odblac;': '\u0151',
+ 'odiv;': '\u2a38',
+ 'odot;': '\u2299',
+ 'odsold;': '\u29bc',
+ 'OElig;': '\u0152',
+ 'oelig;': '\u0153',
+ 'ofcir;': '\u29bf',
+ 'Ofr;': '\U0001d512',
+ 'ofr;': '\U0001d52c',
+ 'ogon;': '\u02db',
+ 'Ograve': '\xd2',
+ 'ograve': '\xf2',
+ 'Ograve;': '\xd2',
+ 'ograve;': '\xf2',
+ 'ogt;': '\u29c1',
+ 'ohbar;': '\u29b5',
+ 'ohm;': '\u03a9',
+ 'oint;': '\u222e',
+ 'olarr;': '\u21ba',
+ 'olcir;': '\u29be',
+ 'olcross;': '\u29bb',
+ 'oline;': '\u203e',
+ 'olt;': '\u29c0',
+ 'Omacr;': '\u014c',
+ 'omacr;': '\u014d',
+ 'Omega;': '\u03a9',
+ 'omega;': '\u03c9',
+ 'Omicron;': '\u039f',
+ 'omicron;': '\u03bf',
+ 'omid;': '\u29b6',
+ 'ominus;': '\u2296',
+ 'Oopf;': '\U0001d546',
+ 'oopf;': '\U0001d560',
+ 'opar;': '\u29b7',
+ 'OpenCurlyDoubleQuote;': '\u201c',
+ 'OpenCurlyQuote;': '\u2018',
+ 'operp;': '\u29b9',
+ 'oplus;': '\u2295',
+ 'Or;': '\u2a54',
+ 'or;': '\u2228',
+ 'orarr;': '\u21bb',
+ 'ord;': '\u2a5d',
+ 'order;': '\u2134',
+ 'orderof;': '\u2134',
+ 'ordf': '\xaa',
+ 'ordf;': '\xaa',
+ 'ordm': '\xba',
+ 'ordm;': '\xba',
+ 'origof;': '\u22b6',
+ 'oror;': '\u2a56',
+ 'orslope;': '\u2a57',
+ 'orv;': '\u2a5b',
+ 'oS;': '\u24c8',
+ 'Oscr;': '\U0001d4aa',
+ 'oscr;': '\u2134',
+ 'Oslash': '\xd8',
+ 'oslash': '\xf8',
+ 'Oslash;': '\xd8',
+ 'oslash;': '\xf8',
+ 'osol;': '\u2298',
+ 'Otilde': '\xd5',
+ 'otilde': '\xf5',
+ 'Otilde;': '\xd5',
+ 'otilde;': '\xf5',
+ 'Otimes;': '\u2a37',
+ 'otimes;': '\u2297',
+ 'otimesas;': '\u2a36',
+ 'Ouml': '\xd6',
+ 'ouml': '\xf6',
+ 'Ouml;': '\xd6',
+ 'ouml;': '\xf6',
+ 'ovbar;': '\u233d',
+ 'OverBar;': '\u203e',
+ 'OverBrace;': '\u23de',
+ 'OverBracket;': '\u23b4',
+ 'OverParenthesis;': '\u23dc',
+ 'par;': '\u2225',
+ 'para': '\xb6',
+ 'para;': '\xb6',
+ 'parallel;': '\u2225',
+ 'parsim;': '\u2af3',
+ 'parsl;': '\u2afd',
+ 'part;': '\u2202',
+ 'PartialD;': '\u2202',
+ 'Pcy;': '\u041f',
+ 'pcy;': '\u043f',
+ 'percnt;': '%',
+ 'period;': '.',
+ 'permil;': '\u2030',
+ 'perp;': '\u22a5',
+ 'pertenk;': '\u2031',
+ 'Pfr;': '\U0001d513',
+ 'pfr;': '\U0001d52d',
+ 'Phi;': '\u03a6',
+ 'phi;': '\u03c6',
+ 'phiv;': '\u03d5',
+ 'phmmat;': '\u2133',
+ 'phone;': '\u260e',
+ 'Pi;': '\u03a0',
+ 'pi;': '\u03c0',
+ 'pitchfork;': '\u22d4',
+ 'piv;': '\u03d6',
+ 'planck;': '\u210f',
+ 'planckh;': '\u210e',
+ 'plankv;': '\u210f',
+ 'plus;': '+',
+ 'plusacir;': '\u2a23',
+ 'plusb;': '\u229e',
+ 'pluscir;': '\u2a22',
+ 'plusdo;': '\u2214',
+ 'plusdu;': '\u2a25',
+ 'pluse;': '\u2a72',
+ 'PlusMinus;': '\xb1',
+ 'plusmn': '\xb1',
+ 'plusmn;': '\xb1',
+ 'plussim;': '\u2a26',
+ 'plustwo;': '\u2a27',
+ 'pm;': '\xb1',
+ 'Poincareplane;': '\u210c',
+ 'pointint;': '\u2a15',
+ 'Popf;': '\u2119',
+ 'popf;': '\U0001d561',
+ 'pound': '\xa3',
+ 'pound;': '\xa3',
+ 'Pr;': '\u2abb',
+ 'pr;': '\u227a',
+ 'prap;': '\u2ab7',
+ 'prcue;': '\u227c',
+ 'prE;': '\u2ab3',
+ 'pre;': '\u2aaf',
+ 'prec;': '\u227a',
+ 'precapprox;': '\u2ab7',
+ 'preccurlyeq;': '\u227c',
+ 'Precedes;': '\u227a',
+ 'PrecedesEqual;': '\u2aaf',
+ 'PrecedesSlantEqual;': '\u227c',
+ 'PrecedesTilde;': '\u227e',
+ 'preceq;': '\u2aaf',
+ 'precnapprox;': '\u2ab9',
+ 'precneqq;': '\u2ab5',
+ 'precnsim;': '\u22e8',
+ 'precsim;': '\u227e',
+ 'Prime;': '\u2033',
+ 'prime;': '\u2032',
+ 'primes;': '\u2119',
+ 'prnap;': '\u2ab9',
+ 'prnE;': '\u2ab5',
+ 'prnsim;': '\u22e8',
+ 'prod;': '\u220f',
+ 'Product;': '\u220f',
+ 'profalar;': '\u232e',
+ 'profline;': '\u2312',
+ 'profsurf;': '\u2313',
+ 'prop;': '\u221d',
+ 'Proportion;': '\u2237',
+ 'Proportional;': '\u221d',
+ 'propto;': '\u221d',
+ 'prsim;': '\u227e',
+ 'prurel;': '\u22b0',
+ 'Pscr;': '\U0001d4ab',
+ 'pscr;': '\U0001d4c5',
+ 'Psi;': '\u03a8',
+ 'psi;': '\u03c8',
+ 'puncsp;': '\u2008',
+ 'Qfr;': '\U0001d514',
+ 'qfr;': '\U0001d52e',
+ 'qint;': '\u2a0c',
+ 'Qopf;': '\u211a',
+ 'qopf;': '\U0001d562',
+ 'qprime;': '\u2057',
+ 'Qscr;': '\U0001d4ac',
+ 'qscr;': '\U0001d4c6',
+ 'quaternions;': '\u210d',
+ 'quatint;': '\u2a16',
+ 'quest;': '?',
+ 'questeq;': '\u225f',
+ 'QUOT': '"',
+ 'quot': '"',
+ 'QUOT;': '"',
+ 'quot;': '"',
+ 'rAarr;': '\u21db',
+ 'race;': '\u223d\u0331',
+ 'Racute;': '\u0154',
+ 'racute;': '\u0155',
+ 'radic;': '\u221a',
+ 'raemptyv;': '\u29b3',
+ 'Rang;': '\u27eb',
+ 'rang;': '\u27e9',
+ 'rangd;': '\u2992',
+ 'range;': '\u29a5',
+ 'rangle;': '\u27e9',
+ 'raquo': '\xbb',
+ 'raquo;': '\xbb',
+ 'Rarr;': '\u21a0',
+ 'rArr;': '\u21d2',
+ 'rarr;': '\u2192',
+ 'rarrap;': '\u2975',
+ 'rarrb;': '\u21e5',
+ 'rarrbfs;': '\u2920',
+ 'rarrc;': '\u2933',
+ 'rarrfs;': '\u291e',
+ 'rarrhk;': '\u21aa',
+ 'rarrlp;': '\u21ac',
+ 'rarrpl;': '\u2945',
+ 'rarrsim;': '\u2974',
+ 'Rarrtl;': '\u2916',
+ 'rarrtl;': '\u21a3',
+ 'rarrw;': '\u219d',
+ 'rAtail;': '\u291c',
+ 'ratail;': '\u291a',
+ 'ratio;': '\u2236',
+ 'rationals;': '\u211a',
+ 'RBarr;': '\u2910',
+ 'rBarr;': '\u290f',
+ 'rbarr;': '\u290d',
+ 'rbbrk;': '\u2773',
+ 'rbrace;': '}',
+ 'rbrack;': ']',
+ 'rbrke;': '\u298c',
+ 'rbrksld;': '\u298e',
+ 'rbrkslu;': '\u2990',
+ 'Rcaron;': '\u0158',
+ 'rcaron;': '\u0159',
+ 'Rcedil;': '\u0156',
+ 'rcedil;': '\u0157',
+ 'rceil;': '\u2309',
+ 'rcub;': '}',
+ 'Rcy;': '\u0420',
+ 'rcy;': '\u0440',
+ 'rdca;': '\u2937',
+ 'rdldhar;': '\u2969',
+ 'rdquo;': '\u201d',
+ 'rdquor;': '\u201d',
+ 'rdsh;': '\u21b3',
+ 'Re;': '\u211c',
+ 'real;': '\u211c',
+ 'realine;': '\u211b',
+ 'realpart;': '\u211c',
+ 'reals;': '\u211d',
+ 'rect;': '\u25ad',
+ 'REG': '\xae',
+ 'reg': '\xae',
+ 'REG;': '\xae',
+ 'reg;': '\xae',
+ 'ReverseElement;': '\u220b',
+ 'ReverseEquilibrium;': '\u21cb',
+ 'ReverseUpEquilibrium;': '\u296f',
+ 'rfisht;': '\u297d',
+ 'rfloor;': '\u230b',
+ 'Rfr;': '\u211c',
+ 'rfr;': '\U0001d52f',
+ 'rHar;': '\u2964',
+ 'rhard;': '\u21c1',
+ 'rharu;': '\u21c0',
+ 'rharul;': '\u296c',
+ 'Rho;': '\u03a1',
+ 'rho;': '\u03c1',
+ 'rhov;': '\u03f1',
+ 'RightAngleBracket;': '\u27e9',
+ 'RightArrow;': '\u2192',
+ 'Rightarrow;': '\u21d2',
+ 'rightarrow;': '\u2192',
+ 'RightArrowBar;': '\u21e5',
+ 'RightArrowLeftArrow;': '\u21c4',
+ 'rightarrowtail;': '\u21a3',
+ 'RightCeiling;': '\u2309',
+ 'RightDoubleBracket;': '\u27e7',
+ 'RightDownTeeVector;': '\u295d',
+ 'RightDownVector;': '\u21c2',
+ 'RightDownVectorBar;': '\u2955',
+ 'RightFloor;': '\u230b',
+ 'rightharpoondown;': '\u21c1',
+ 'rightharpoonup;': '\u21c0',
+ 'rightleftarrows;': '\u21c4',
+ 'rightleftharpoons;': '\u21cc',
+ 'rightrightarrows;': '\u21c9',
+ 'rightsquigarrow;': '\u219d',
+ 'RightTee;': '\u22a2',
+ 'RightTeeArrow;': '\u21a6',
+ 'RightTeeVector;': '\u295b',
+ 'rightthreetimes;': '\u22cc',
+ 'RightTriangle;': '\u22b3',
+ 'RightTriangleBar;': '\u29d0',
+ 'RightTriangleEqual;': '\u22b5',
+ 'RightUpDownVector;': '\u294f',
+ 'RightUpTeeVector;': '\u295c',
+ 'RightUpVector;': '\u21be',
+ 'RightUpVectorBar;': '\u2954',
+ 'RightVector;': '\u21c0',
+ 'RightVectorBar;': '\u2953',
+ 'ring;': '\u02da',
+ 'risingdotseq;': '\u2253',
+ 'rlarr;': '\u21c4',
+ 'rlhar;': '\u21cc',
+ 'rlm;': '\u200f',
+ 'rmoust;': '\u23b1',
+ 'rmoustache;': '\u23b1',
+ 'rnmid;': '\u2aee',
+ 'roang;': '\u27ed',
+ 'roarr;': '\u21fe',
+ 'robrk;': '\u27e7',
+ 'ropar;': '\u2986',
+ 'Ropf;': '\u211d',
+ 'ropf;': '\U0001d563',
+ 'roplus;': '\u2a2e',
+ 'rotimes;': '\u2a35',
+ 'RoundImplies;': '\u2970',
+ 'rpar;': ')',
+ 'rpargt;': '\u2994',
+ 'rppolint;': '\u2a12',
+ 'rrarr;': '\u21c9',
+ 'Rrightarrow;': '\u21db',
+ 'rsaquo;': '\u203a',
+ 'Rscr;': '\u211b',
+ 'rscr;': '\U0001d4c7',
+ 'Rsh;': '\u21b1',
+ 'rsh;': '\u21b1',
+ 'rsqb;': ']',
+ 'rsquo;': '\u2019',
+ 'rsquor;': '\u2019',
+ 'rthree;': '\u22cc',
+ 'rtimes;': '\u22ca',
+ 'rtri;': '\u25b9',
+ 'rtrie;': '\u22b5',
+ 'rtrif;': '\u25b8',
+ 'rtriltri;': '\u29ce',
+ 'RuleDelayed;': '\u29f4',
+ 'ruluhar;': '\u2968',
+ 'rx;': '\u211e',
+ 'Sacute;': '\u015a',
+ 'sacute;': '\u015b',
+ 'sbquo;': '\u201a',
+ 'Sc;': '\u2abc',
+ 'sc;': '\u227b',
+ 'scap;': '\u2ab8',
+ 'Scaron;': '\u0160',
+ 'scaron;': '\u0161',
+ 'sccue;': '\u227d',
+ 'scE;': '\u2ab4',
+ 'sce;': '\u2ab0',
+ 'Scedil;': '\u015e',
+ 'scedil;': '\u015f',
+ 'Scirc;': '\u015c',
+ 'scirc;': '\u015d',
+ 'scnap;': '\u2aba',
+ 'scnE;': '\u2ab6',
+ 'scnsim;': '\u22e9',
+ 'scpolint;': '\u2a13',
+ 'scsim;': '\u227f',
+ 'Scy;': '\u0421',
+ 'scy;': '\u0441',
+ 'sdot;': '\u22c5',
+ 'sdotb;': '\u22a1',
+ 'sdote;': '\u2a66',
+ 'searhk;': '\u2925',
+ 'seArr;': '\u21d8',
+ 'searr;': '\u2198',
+ 'searrow;': '\u2198',
+ 'sect': '\xa7',
+ 'sect;': '\xa7',
+ 'semi;': ';',
+ 'seswar;': '\u2929',
+ 'setminus;': '\u2216',
+ 'setmn;': '\u2216',
+ 'sext;': '\u2736',
+ 'Sfr;': '\U0001d516',
+ 'sfr;': '\U0001d530',
+ 'sfrown;': '\u2322',
+ 'sharp;': '\u266f',
+ 'SHCHcy;': '\u0429',
+ 'shchcy;': '\u0449',
+ 'SHcy;': '\u0428',
+ 'shcy;': '\u0448',
+ 'ShortDownArrow;': '\u2193',
+ 'ShortLeftArrow;': '\u2190',
+ 'shortmid;': '\u2223',
+ 'shortparallel;': '\u2225',
+ 'ShortRightArrow;': '\u2192',
+ 'ShortUpArrow;': '\u2191',
+ 'shy': '\xad',
+ 'shy;': '\xad',
+ 'Sigma;': '\u03a3',
+ 'sigma;': '\u03c3',
+ 'sigmaf;': '\u03c2',
+ 'sigmav;': '\u03c2',
+ 'sim;': '\u223c',
+ 'simdot;': '\u2a6a',
+ 'sime;': '\u2243',
+ 'simeq;': '\u2243',
+ 'simg;': '\u2a9e',
+ 'simgE;': '\u2aa0',
+ 'siml;': '\u2a9d',
+ 'simlE;': '\u2a9f',
+ 'simne;': '\u2246',
+ 'simplus;': '\u2a24',
+ 'simrarr;': '\u2972',
+ 'slarr;': '\u2190',
+ 'SmallCircle;': '\u2218',
+ 'smallsetminus;': '\u2216',
+ 'smashp;': '\u2a33',
+ 'smeparsl;': '\u29e4',
+ 'smid;': '\u2223',
+ 'smile;': '\u2323',
+ 'smt;': '\u2aaa',
+ 'smte;': '\u2aac',
+ 'smtes;': '\u2aac\ufe00',
+ 'SOFTcy;': '\u042c',
+ 'softcy;': '\u044c',
+ 'sol;': '/',
+ 'solb;': '\u29c4',
+ 'solbar;': '\u233f',
+ 'Sopf;': '\U0001d54a',
+ 'sopf;': '\U0001d564',
+ 'spades;': '\u2660',
+ 'spadesuit;': '\u2660',
+ 'spar;': '\u2225',
+ 'sqcap;': '\u2293',
+ 'sqcaps;': '\u2293\ufe00',
+ 'sqcup;': '\u2294',
+ 'sqcups;': '\u2294\ufe00',
+ 'Sqrt;': '\u221a',
+ 'sqsub;': '\u228f',
+ 'sqsube;': '\u2291',
+ 'sqsubset;': '\u228f',
+ 'sqsubseteq;': '\u2291',
+ 'sqsup;': '\u2290',
+ 'sqsupe;': '\u2292',
+ 'sqsupset;': '\u2290',
+ 'sqsupseteq;': '\u2292',
+ 'squ;': '\u25a1',
+ 'Square;': '\u25a1',
+ 'square;': '\u25a1',
+ 'SquareIntersection;': '\u2293',
+ 'SquareSubset;': '\u228f',
+ 'SquareSubsetEqual;': '\u2291',
+ 'SquareSuperset;': '\u2290',
+ 'SquareSupersetEqual;': '\u2292',
+ 'SquareUnion;': '\u2294',
+ 'squarf;': '\u25aa',
+ 'squf;': '\u25aa',
+ 'srarr;': '\u2192',
+ 'Sscr;': '\U0001d4ae',
+ 'sscr;': '\U0001d4c8',
+ 'ssetmn;': '\u2216',
+ 'ssmile;': '\u2323',
+ 'sstarf;': '\u22c6',
+ 'Star;': '\u22c6',
+ 'star;': '\u2606',
+ 'starf;': '\u2605',
+ 'straightepsilon;': '\u03f5',
+ 'straightphi;': '\u03d5',
+ 'strns;': '\xaf',
+ 'Sub;': '\u22d0',
+ 'sub;': '\u2282',
+ 'subdot;': '\u2abd',
+ 'subE;': '\u2ac5',
+ 'sube;': '\u2286',
+ 'subedot;': '\u2ac3',
+ 'submult;': '\u2ac1',
+ 'subnE;': '\u2acb',
+ 'subne;': '\u228a',
+ 'subplus;': '\u2abf',
+ 'subrarr;': '\u2979',
+ 'Subset;': '\u22d0',
+ 'subset;': '\u2282',
+ 'subseteq;': '\u2286',
+ 'subseteqq;': '\u2ac5',
+ 'SubsetEqual;': '\u2286',
+ 'subsetneq;': '\u228a',
+ 'subsetneqq;': '\u2acb',
+ 'subsim;': '\u2ac7',
+ 'subsub;': '\u2ad5',
+ 'subsup;': '\u2ad3',
+ 'succ;': '\u227b',
+ 'succapprox;': '\u2ab8',
+ 'succcurlyeq;': '\u227d',
+ 'Succeeds;': '\u227b',
+ 'SucceedsEqual;': '\u2ab0',
+ 'SucceedsSlantEqual;': '\u227d',
+ 'SucceedsTilde;': '\u227f',
+ 'succeq;': '\u2ab0',
+ 'succnapprox;': '\u2aba',
+ 'succneqq;': '\u2ab6',
+ 'succnsim;': '\u22e9',
+ 'succsim;': '\u227f',
+ 'SuchThat;': '\u220b',
+ 'Sum;': '\u2211',
+ 'sum;': '\u2211',
+ 'sung;': '\u266a',
+ 'sup1': '\xb9',
+ 'sup1;': '\xb9',
+ 'sup2': '\xb2',
+ 'sup2;': '\xb2',
+ 'sup3': '\xb3',
+ 'sup3;': '\xb3',
+ 'Sup;': '\u22d1',
+ 'sup;': '\u2283',
+ 'supdot;': '\u2abe',
+ 'supdsub;': '\u2ad8',
+ 'supE;': '\u2ac6',
+ 'supe;': '\u2287',
+ 'supedot;': '\u2ac4',
+ 'Superset;': '\u2283',
+ 'SupersetEqual;': '\u2287',
+ 'suphsol;': '\u27c9',
+ 'suphsub;': '\u2ad7',
+ 'suplarr;': '\u297b',
+ 'supmult;': '\u2ac2',
+ 'supnE;': '\u2acc',
+ 'supne;': '\u228b',
+ 'supplus;': '\u2ac0',
+ 'Supset;': '\u22d1',
+ 'supset;': '\u2283',
+ 'supseteq;': '\u2287',
+ 'supseteqq;': '\u2ac6',
+ 'supsetneq;': '\u228b',
+ 'supsetneqq;': '\u2acc',
+ 'supsim;': '\u2ac8',
+ 'supsub;': '\u2ad4',
+ 'supsup;': '\u2ad6',
+ 'swarhk;': '\u2926',
+ 'swArr;': '\u21d9',
+ 'swarr;': '\u2199',
+ 'swarrow;': '\u2199',
+ 'swnwar;': '\u292a',
+ 'szlig': '\xdf',
+ 'szlig;': '\xdf',
+ 'Tab;': '\t',
+ 'target;': '\u2316',
+ 'Tau;': '\u03a4',
+ 'tau;': '\u03c4',
+ 'tbrk;': '\u23b4',
+ 'Tcaron;': '\u0164',
+ 'tcaron;': '\u0165',
+ 'Tcedil;': '\u0162',
+ 'tcedil;': '\u0163',
+ 'Tcy;': '\u0422',
+ 'tcy;': '\u0442',
+ 'tdot;': '\u20db',
+ 'telrec;': '\u2315',
+ 'Tfr;': '\U0001d517',
+ 'tfr;': '\U0001d531',
+ 'there4;': '\u2234',
+ 'Therefore;': '\u2234',
+ 'therefore;': '\u2234',
+ 'Theta;': '\u0398',
+ 'theta;': '\u03b8',
+ 'thetasym;': '\u03d1',
+ 'thetav;': '\u03d1',
+ 'thickapprox;': '\u2248',
+ 'thicksim;': '\u223c',
+ 'ThickSpace;': '\u205f\u200a',
+ 'thinsp;': '\u2009',
+ 'ThinSpace;': '\u2009',
+ 'thkap;': '\u2248',
+ 'thksim;': '\u223c',
+ 'THORN': '\xde',
+ 'thorn': '\xfe',
+ 'THORN;': '\xde',
+ 'thorn;': '\xfe',
+ 'Tilde;': '\u223c',
+ 'tilde;': '\u02dc',
+ 'TildeEqual;': '\u2243',
+ 'TildeFullEqual;': '\u2245',
+ 'TildeTilde;': '\u2248',
+ 'times': '\xd7',
+ 'times;': '\xd7',
+ 'timesb;': '\u22a0',
+ 'timesbar;': '\u2a31',
+ 'timesd;': '\u2a30',
+ 'tint;': '\u222d',
+ 'toea;': '\u2928',
+ 'top;': '\u22a4',
+ 'topbot;': '\u2336',
+ 'topcir;': '\u2af1',
+ 'Topf;': '\U0001d54b',
+ 'topf;': '\U0001d565',
+ 'topfork;': '\u2ada',
+ 'tosa;': '\u2929',
+ 'tprime;': '\u2034',
+ 'TRADE;': '\u2122',
+ 'trade;': '\u2122',
+ 'triangle;': '\u25b5',
+ 'triangledown;': '\u25bf',
+ 'triangleleft;': '\u25c3',
+ 'trianglelefteq;': '\u22b4',
+ 'triangleq;': '\u225c',
+ 'triangleright;': '\u25b9',
+ 'trianglerighteq;': '\u22b5',
+ 'tridot;': '\u25ec',
+ 'trie;': '\u225c',
+ 'triminus;': '\u2a3a',
+ 'TripleDot;': '\u20db',
+ 'triplus;': '\u2a39',
+ 'trisb;': '\u29cd',
+ 'tritime;': '\u2a3b',
+ 'trpezium;': '\u23e2',
+ 'Tscr;': '\U0001d4af',
+ 'tscr;': '\U0001d4c9',
+ 'TScy;': '\u0426',
+ 'tscy;': '\u0446',
+ 'TSHcy;': '\u040b',
+ 'tshcy;': '\u045b',
+ 'Tstrok;': '\u0166',
+ 'tstrok;': '\u0167',
+ 'twixt;': '\u226c',
+ 'twoheadleftarrow;': '\u219e',
+ 'twoheadrightarrow;': '\u21a0',
+ 'Uacute': '\xda',
+ 'uacute': '\xfa',
+ 'Uacute;': '\xda',
+ 'uacute;': '\xfa',
+ 'Uarr;': '\u219f',
+ 'uArr;': '\u21d1',
+ 'uarr;': '\u2191',
+ 'Uarrocir;': '\u2949',
+ 'Ubrcy;': '\u040e',
+ 'ubrcy;': '\u045e',
+ 'Ubreve;': '\u016c',
+ 'ubreve;': '\u016d',
+ 'Ucirc': '\xdb',
+ 'ucirc': '\xfb',
+ 'Ucirc;': '\xdb',
+ 'ucirc;': '\xfb',
+ 'Ucy;': '\u0423',
+ 'ucy;': '\u0443',
+ 'udarr;': '\u21c5',
+ 'Udblac;': '\u0170',
+ 'udblac;': '\u0171',
+ 'udhar;': '\u296e',
+ 'ufisht;': '\u297e',
+ 'Ufr;': '\U0001d518',
+ 'ufr;': '\U0001d532',
+ 'Ugrave': '\xd9',
+ 'ugrave': '\xf9',
+ 'Ugrave;': '\xd9',
+ 'ugrave;': '\xf9',
+ 'uHar;': '\u2963',
+ 'uharl;': '\u21bf',
+ 'uharr;': '\u21be',
+ 'uhblk;': '\u2580',
+ 'ulcorn;': '\u231c',
+ 'ulcorner;': '\u231c',
+ 'ulcrop;': '\u230f',
+ 'ultri;': '\u25f8',
+ 'Umacr;': '\u016a',
+ 'umacr;': '\u016b',
+ 'uml': '\xa8',
+ 'uml;': '\xa8',
+ 'UnderBar;': '_',
+ 'UnderBrace;': '\u23df',
+ 'UnderBracket;': '\u23b5',
+ 'UnderParenthesis;': '\u23dd',
+ 'Union;': '\u22c3',
+ 'UnionPlus;': '\u228e',
+ 'Uogon;': '\u0172',
+ 'uogon;': '\u0173',
+ 'Uopf;': '\U0001d54c',
+ 'uopf;': '\U0001d566',
+ 'UpArrow;': '\u2191',
+ 'Uparrow;': '\u21d1',
+ 'uparrow;': '\u2191',
+ 'UpArrowBar;': '\u2912',
+ 'UpArrowDownArrow;': '\u21c5',
+ 'UpDownArrow;': '\u2195',
+ 'Updownarrow;': '\u21d5',
+ 'updownarrow;': '\u2195',
+ 'UpEquilibrium;': '\u296e',
+ 'upharpoonleft;': '\u21bf',
+ 'upharpoonright;': '\u21be',
+ 'uplus;': '\u228e',
+ 'UpperLeftArrow;': '\u2196',
+ 'UpperRightArrow;': '\u2197',
+ 'Upsi;': '\u03d2',
+ 'upsi;': '\u03c5',
+ 'upsih;': '\u03d2',
+ 'Upsilon;': '\u03a5',
+ 'upsilon;': '\u03c5',
+ 'UpTee;': '\u22a5',
+ 'UpTeeArrow;': '\u21a5',
+ 'upuparrows;': '\u21c8',
+ 'urcorn;': '\u231d',
+ 'urcorner;': '\u231d',
+ 'urcrop;': '\u230e',
+ 'Uring;': '\u016e',
+ 'uring;': '\u016f',
+ 'urtri;': '\u25f9',
+ 'Uscr;': '\U0001d4b0',
+ 'uscr;': '\U0001d4ca',
+ 'utdot;': '\u22f0',
+ 'Utilde;': '\u0168',
+ 'utilde;': '\u0169',
+ 'utri;': '\u25b5',
+ 'utrif;': '\u25b4',
+ 'uuarr;': '\u21c8',
+ 'Uuml': '\xdc',
+ 'uuml': '\xfc',
+ 'Uuml;': '\xdc',
+ 'uuml;': '\xfc',
+ 'uwangle;': '\u29a7',
+ 'vangrt;': '\u299c',
+ 'varepsilon;': '\u03f5',
+ 'varkappa;': '\u03f0',
+ 'varnothing;': '\u2205',
+ 'varphi;': '\u03d5',
+ 'varpi;': '\u03d6',
+ 'varpropto;': '\u221d',
+ 'vArr;': '\u21d5',
+ 'varr;': '\u2195',
+ 'varrho;': '\u03f1',
+ 'varsigma;': '\u03c2',
+ 'varsubsetneq;': '\u228a\ufe00',
+ 'varsubsetneqq;': '\u2acb\ufe00',
+ 'varsupsetneq;': '\u228b\ufe00',
+ 'varsupsetneqq;': '\u2acc\ufe00',
+ 'vartheta;': '\u03d1',
+ 'vartriangleleft;': '\u22b2',
+ 'vartriangleright;': '\u22b3',
+ 'Vbar;': '\u2aeb',
+ 'vBar;': '\u2ae8',
+ 'vBarv;': '\u2ae9',
+ 'Vcy;': '\u0412',
+ 'vcy;': '\u0432',
+ 'VDash;': '\u22ab',
+ 'Vdash;': '\u22a9',
+ 'vDash;': '\u22a8',
+ 'vdash;': '\u22a2',
+ 'Vdashl;': '\u2ae6',
+ 'Vee;': '\u22c1',
+ 'vee;': '\u2228',
+ 'veebar;': '\u22bb',
+ 'veeeq;': '\u225a',
+ 'vellip;': '\u22ee',
+ 'Verbar;': '\u2016',
+ 'verbar;': '|',
+ 'Vert;': '\u2016',
+ 'vert;': '|',
+ 'VerticalBar;': '\u2223',
+ 'VerticalLine;': '|',
+ 'VerticalSeparator;': '\u2758',
+ 'VerticalTilde;': '\u2240',
+ 'VeryThinSpace;': '\u200a',
+ 'Vfr;': '\U0001d519',
+ 'vfr;': '\U0001d533',
+ 'vltri;': '\u22b2',
+ 'vnsub;': '\u2282\u20d2',
+ 'vnsup;': '\u2283\u20d2',
+ 'Vopf;': '\U0001d54d',
+ 'vopf;': '\U0001d567',
+ 'vprop;': '\u221d',
+ 'vrtri;': '\u22b3',
+ 'Vscr;': '\U0001d4b1',
+ 'vscr;': '\U0001d4cb',
+ 'vsubnE;': '\u2acb\ufe00',
+ 'vsubne;': '\u228a\ufe00',
+ 'vsupnE;': '\u2acc\ufe00',
+ 'vsupne;': '\u228b\ufe00',
+ 'Vvdash;': '\u22aa',
+ 'vzigzag;': '\u299a',
+ 'Wcirc;': '\u0174',
+ 'wcirc;': '\u0175',
+ 'wedbar;': '\u2a5f',
+ 'Wedge;': '\u22c0',
+ 'wedge;': '\u2227',
+ 'wedgeq;': '\u2259',
+ 'weierp;': '\u2118',
+ 'Wfr;': '\U0001d51a',
+ 'wfr;': '\U0001d534',
+ 'Wopf;': '\U0001d54e',
+ 'wopf;': '\U0001d568',
+ 'wp;': '\u2118',
+ 'wr;': '\u2240',
+ 'wreath;': '\u2240',
+ 'Wscr;': '\U0001d4b2',
+ 'wscr;': '\U0001d4cc',
+ 'xcap;': '\u22c2',
+ 'xcirc;': '\u25ef',
+ 'xcup;': '\u22c3',
+ 'xdtri;': '\u25bd',
+ 'Xfr;': '\U0001d51b',
+ 'xfr;': '\U0001d535',
+ 'xhArr;': '\u27fa',
+ 'xharr;': '\u27f7',
+ 'Xi;': '\u039e',
+ 'xi;': '\u03be',
+ 'xlArr;': '\u27f8',
+ 'xlarr;': '\u27f5',
+ 'xmap;': '\u27fc',
+ 'xnis;': '\u22fb',
+ 'xodot;': '\u2a00',
+ 'Xopf;': '\U0001d54f',
+ 'xopf;': '\U0001d569',
+ 'xoplus;': '\u2a01',
+ 'xotime;': '\u2a02',
+ 'xrArr;': '\u27f9',
+ 'xrarr;': '\u27f6',
+ 'Xscr;': '\U0001d4b3',
+ 'xscr;': '\U0001d4cd',
+ 'xsqcup;': '\u2a06',
+ 'xuplus;': '\u2a04',
+ 'xutri;': '\u25b3',
+ 'xvee;': '\u22c1',
+ 'xwedge;': '\u22c0',
+ 'Yacute': '\xdd',
+ 'yacute': '\xfd',
+ 'Yacute;': '\xdd',
+ 'yacute;': '\xfd',
+ 'YAcy;': '\u042f',
+ 'yacy;': '\u044f',
+ 'Ycirc;': '\u0176',
+ 'ycirc;': '\u0177',
+ 'Ycy;': '\u042b',
+ 'ycy;': '\u044b',
+ 'yen': '\xa5',
+ 'yen;': '\xa5',
+ 'Yfr;': '\U0001d51c',
+ 'yfr;': '\U0001d536',
+ 'YIcy;': '\u0407',
+ 'yicy;': '\u0457',
+ 'Yopf;': '\U0001d550',
+ 'yopf;': '\U0001d56a',
+ 'Yscr;': '\U0001d4b4',
+ 'yscr;': '\U0001d4ce',
+ 'YUcy;': '\u042e',
+ 'yucy;': '\u044e',
+ 'yuml': '\xff',
+ 'Yuml;': '\u0178',
+ 'yuml;': '\xff',
+ 'Zacute;': '\u0179',
+ 'zacute;': '\u017a',
+ 'Zcaron;': '\u017d',
+ 'zcaron;': '\u017e',
+ 'Zcy;': '\u0417',
+ 'zcy;': '\u0437',
+ 'Zdot;': '\u017b',
+ 'zdot;': '\u017c',
+ 'zeetrf;': '\u2128',
+ 'ZeroWidthSpace;': '\u200b',
+ 'Zeta;': '\u0396',
+ 'zeta;': '\u03b6',
+ 'Zfr;': '\u2128',
+ 'zfr;': '\U0001d537',
+ 'ZHcy;': '\u0416',
+ 'zhcy;': '\u0436',
+ 'zigrarr;': '\u21dd',
+ 'Zopf;': '\u2124',
+ 'zopf;': '\U0001d56b',
+ 'Zscr;': '\U0001d4b5',
+ 'zscr;': '\U0001d4cf',
+ 'zwj;': '\u200d',
+ 'zwnj;': '\u200c',
+}
+
# maps the Unicode codepoint to the HTML entity name
codepoint2name = {}
diff --git a/Lib/html/parser.py b/Lib/html/parser.py
index de504ab..f8ac828 100644
--- a/Lib/html/parser.py
+++ b/Lib/html/parser.py
@@ -10,6 +10,7 @@
import _markupbase
import re
+import warnings
# Regular expressions used for parsing
@@ -113,14 +114,16 @@ class HTMLParser(_markupbase.ParserBase):
CDATA_CONTENT_ELEMENTS = ("script", "style")
- def __init__(self, strict=True):
+ def __init__(self, strict=False):
"""Initialize and reset this instance.
- If strict is set to True (the default), errors are raised when invalid
- HTML is encountered. If set to False, an attempt is instead made to
- continue parsing, making "best guesses" about the intended meaning, in
- a fashion similar to what browsers typically do.
+ If strict is set to False (the default) the parser will parse invalid
+ markup, otherwise it will raise an error. Note that the strict mode
+ is deprecated.
"""
+ if strict:
+ warnings.warn("The strict mode is deprecated.",
+ DeprecationWarning, stacklevel=2)
self.strict = strict
self.reset()
@@ -271,8 +274,8 @@ class HTMLParser(_markupbase.ParserBase):
# See also parse_declaration in _markupbase
def parse_html_declaration(self, i):
rawdata = self.rawdata
- if rawdata[i:i+2] != '<!':
- self.error('unexpected call to parse_html_declaration()')
+ assert rawdata[i:i+2] == '<!', ('unexpected call to '
+ 'parse_html_declaration()')
if rawdata[i:i+4] == '<!--':
# this case is actually already handled in goahead()
return self.parse_comment(i)
@@ -292,8 +295,8 @@ class HTMLParser(_markupbase.ParserBase):
# see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state
def parse_bogus_comment(self, i, report=1):
rawdata = self.rawdata
- if rawdata[i:i+2] not in ('<!', '</'):
- self.error('unexpected call to parse_comment()')
+ assert rawdata[i:i+2] in ('<!', '</'), ('unexpected call to '
+ 'parse_comment()')
pos = rawdata.find('>', i+2)
if pos == -1:
return -1
@@ -497,7 +500,6 @@ class HTMLParser(_markupbase.ParserBase):
self.error("unknown declaration: %r" % (data,))
# Internal -- helper to remove special character quoting
- entitydefs = None
def unescape(self, s):
if '&' not in s:
return s
@@ -507,24 +509,23 @@ class HTMLParser(_markupbase.ParserBase):
if s[0] == "#":
s = s[1:]
if s[0] in ['x','X']:
- c = int(s[1:], 16)
+ c = int(s[1:].rstrip(';'), 16)
else:
- c = int(s)
+ c = int(s.rstrip(';'))
return chr(c)
except ValueError:
- return '&#'+ s +';'
+ return '&#' + s
else:
- # Cannot use name2codepoint directly, because HTMLParser
- # supports apos, which is not part of HTML 4
- import html.entities
- if HTMLParser.entitydefs is None:
- entitydefs = HTMLParser.entitydefs = {'apos':"'"}
- for k, v in html.entities.name2codepoint.items():
- entitydefs[k] = chr(v)
- try:
- return self.entitydefs[s]
- except KeyError:
- return '&'+s+';'
-
- return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));",
+ from html.entities import html5
+ if s in html5:
+ return html5[s]
+ elif s.endswith(';'):
+ return '&' + s
+ for x in range(2, len(s)):
+ if s[:x] in html5:
+ return html5[s[:x]] + s[x:]
+ else:
+ return '&' + s
+
+ return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+;|\w{1,32};?))",
replaceEntities, s, flags=re.ASCII)
diff --git a/Lib/http/client.py b/Lib/http/client.py
index 97a7155..9b01704 100644
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -141,6 +141,9 @@ UNPROCESSABLE_ENTITY = 422
LOCKED = 423
FAILED_DEPENDENCY = 424
UPGRADE_REQUIRED = 426
+PRECONDITION_REQUIRED = 428
+TOO_MANY_REQUESTS = 429
+REQUEST_HEADER_FIELDS_TOO_LARGE = 431
# server error
INTERNAL_SERVER_ERROR = 500
@@ -151,6 +154,7 @@ GATEWAY_TIMEOUT = 504
HTTP_VERSION_NOT_SUPPORTED = 505
INSUFFICIENT_STORAGE = 507
NOT_EXTENDED = 510
+NETWORK_AUTHENTICATION_REQUIRED = 511
# Mapping status codes to official W3C names
responses = {
@@ -192,6 +196,9 @@ responses = {
415: 'Unsupported Media Type',
416: 'Requested Range Not Satisfiable',
417: 'Expectation Failed',
+ 428: 'Precondition Required',
+ 429: 'Too Many Requests',
+ 431: 'Request Header Fields Too Large',
500: 'Internal Server Error',
501: 'Not Implemented',
@@ -199,6 +206,7 @@ responses = {
503: 'Service Unavailable',
504: 'Gateway Timeout',
505: 'HTTP Version Not Supported',
+ 511: 'Network Authentication Required',
}
# maximal amount of data to read at one time in _safe_read
@@ -485,11 +493,17 @@ class HTTPResponse(io.RawIOBase):
self.close()
return b""
- if self.chunked:
- return self._read_chunked(amt)
+ if amt is not None:
+ # Amount is given, so call base class version
+ # (which is implemented in terms of self.readinto)
+ return super(HTTPResponse, self).read(amt)
+ else:
+ # Amount is not given (unbounded read) so we must check self.length
+ # and self.chunked
+
+ if self.chunked:
+ return self._readall_chunked()
- if amt is None:
- # unbounded read
if self.length is None:
s = self.fp.read()
else:
@@ -498,78 +512,127 @@ class HTTPResponse(io.RawIOBase):
self.close() # we read everything
return s
+ def readinto(self, b):
+ if self.fp is None:
+ return 0
+
+ if self._method == "HEAD":
+ self.close()
+ return 0
+
+ if self.chunked:
+ return self._readinto_chunked(b)
+
if self.length is not None:
- if amt > self.length:
+ if len(b) > self.length:
# clip the read to the "end of response"
- amt = self.length
+ b = memoryview(b)[0:self.length]
# we do not use _safe_read() here because this may be a .will_close
# connection, and the user is reading more bytes than will be provided
# (for example, reading in 1k chunks)
- s = self.fp.read(amt)
+ n = self.fp.readinto(b)
if self.length is not None:
- self.length -= len(s)
+ self.length -= n
if not self.length:
self.close()
- return s
+ return n
+
+ def _read_next_chunk_size(self):
+ # Read the next chunk size from the file
+ line = self.fp.readline(_MAXLINE + 1)
+ if len(line) > _MAXLINE:
+ raise LineTooLong("chunk size")
+ i = line.find(b";")
+ if i >= 0:
+ line = line[:i] # strip chunk-extensions
+ try:
+ return int(line, 16)
+ except ValueError:
+ # close the connection as protocol synchronisation is
+ # probably lost
+ self.close()
+ raise
- def _read_chunked(self, amt):
+ def _read_and_discard_trailer(self):
+ # read and discard trailer up to the CRLF terminator
+ ### note: we shouldn't have any trailers!
+ while True:
+ line = self.fp.readline(_MAXLINE + 1)
+ if len(line) > _MAXLINE:
+ raise LineTooLong("trailer line")
+ if not line:
+ # a vanishingly small number of sites EOF without
+ # sending the trailer
+ break
+ if line in (b'\r\n', b'\n', b''):
+ break
+
+ def _readall_chunked(self):
assert self.chunked != _UNKNOWN
chunk_left = self.chunk_left
value = []
while True:
if chunk_left is None:
- line = self.fp.readline(_MAXLINE + 1)
- if len(line) > _MAXLINE:
- raise LineTooLong("chunk size")
- i = line.find(b";")
- if i >= 0:
- line = line[:i] # strip chunk-extensions
try:
- chunk_left = int(line, 16)
+ chunk_left = self._read_next_chunk_size()
+ if chunk_left == 0:
+ break
except ValueError:
- # close the connection as protocol synchronisation is
- # probably lost
- self.close()
raise IncompleteRead(b''.join(value))
- if chunk_left == 0:
- break
- if amt is None:
- value.append(self._safe_read(chunk_left))
- elif amt < chunk_left:
- value.append(self._safe_read(amt))
- self.chunk_left = chunk_left - amt
- return b''.join(value)
- elif amt == chunk_left:
- value.append(self._safe_read(amt))
+ value.append(self._safe_read(chunk_left))
+
+ # we read the whole chunk, get another
+ self._safe_read(2) # toss the CRLF at the end of the chunk
+ chunk_left = None
+
+ self._read_and_discard_trailer()
+
+ # we read everything; close the "file"
+ self.close()
+
+ return b''.join(value)
+
+ def _readinto_chunked(self, b):
+ assert self.chunked != _UNKNOWN
+ chunk_left = self.chunk_left
+
+ total_bytes = 0
+ mvb = memoryview(b)
+ while True:
+ if chunk_left is None:
+ try:
+ chunk_left = self._read_next_chunk_size()
+ if chunk_left == 0:
+ break
+ except ValueError:
+ raise IncompleteRead(bytes(b[0:total_bytes]))
+
+ if len(mvb) < chunk_left:
+ n = self._safe_readinto(mvb)
+ self.chunk_left = chunk_left - n
+ return total_bytes + n
+ elif len(mvb) == chunk_left:
+ n = self._safe_readinto(mvb)
self._safe_read(2) # toss the CRLF at the end of the chunk
self.chunk_left = None
- return b''.join(value)
+ return total_bytes + n
else:
- value.append(self._safe_read(chunk_left))
- amt -= chunk_left
+ temp_mvb = mvb[0:chunk_left]
+ n = self._safe_readinto(temp_mvb)
+ mvb = mvb[n:]
+ total_bytes += n
# we read the whole chunk, get another
self._safe_read(2) # toss the CRLF at the end of the chunk
chunk_left = None
- # read and discard trailer up to the CRLF terminator
- ### note: we shouldn't have any trailers!
- while True:
- line = self.fp.readline(_MAXLINE + 1)
- if len(line) > _MAXLINE:
- raise LineTooLong("trailer line")
- if not line:
- # a vanishingly small number of sites EOF without
- # sending the trailer
- break
- if line in (b'\r\n', b'\n', b''):
- break
+ self._read_and_discard_trailer()
# we read everything; close the "file"
self.close()
- return b''.join(value)
+ return total_bytes
def _safe_read(self, amt):
"""Read the number of bytes requested, compensating for partial reads.
@@ -594,6 +657,22 @@ class HTTPResponse(io.RawIOBase):
amt -= len(chunk)
return b"".join(s)
+ def _safe_readinto(self, b):
+ """Same as _safe_read, but for reading into a buffer."""
+ total_bytes = 0
+ mvb = memoryview(b)
+ while total_bytes < len(b):
+ if MAXAMOUNT < len(mvb):
+ temp_mvb = mvb[0:MAXAMOUNT]
+ n = self.fp.readinto(temp_mvb)
+ else:
+ n = self.fp.readinto(mvb)
+ if not n:
+ raise IncompleteRead(bytes(mvb[0:total_bytes]), len(b))
+ mvb = mvb[n:]
+ total_bytes += n
+ return total_bytes
+
def fileno(self):
return self.fp.fileno()
@@ -700,7 +779,7 @@ class HTTPConnection:
self.send(connect_bytes)
for header, value in self._tunnel_headers.items():
header_str = "%s: %s\r\n" % (header, value)
- header_bytes = header_str.encode("latin1")
+ header_bytes = header_str.encode("latin-1")
self.send(header_bytes)
self.send(b'\r\n')
@@ -943,7 +1022,7 @@ class HTTPConnection:
values = list(values)
for i, one_value in enumerate(values):
if hasattr(one_value, 'encode'):
- values[i] = one_value.encode('latin1')
+ values[i] = one_value.encode('latin-1')
elif isinstance(one_value, int):
values[i] = str(one_value).encode('ascii')
value = b'\r\n\t'.join(values)
diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py
index b6cfc35..901e762 100644
--- a/Lib/http/cookiejar.py
+++ b/Lib/http/cookiejar.py
@@ -625,7 +625,7 @@ def request_path(request):
return path
def request_port(request):
- host = request.get_host()
+ host = request.host
i = host.find(':')
if i >= 0:
port = host[i+1:]
@@ -949,7 +949,7 @@ class DefaultCookiePolicy(CookiePolicy):
return True
def set_ok_verifiability(self, cookie, request):
- if request.is_unverifiable() and is_third_party(request):
+ if request.unverifiable and is_third_party(request):
if cookie.version > 0 and self.strict_rfc2965_unverifiable:
_debug(" third-party RFC 2965 cookie during "
"unverifiable transaction")
@@ -1088,7 +1088,7 @@ class DefaultCookiePolicy(CookiePolicy):
return True
def return_ok_verifiability(self, cookie, request):
- if request.is_unverifiable() and is_third_party(request):
+ if request.unverifiable and is_third_party(request):
if cookie.version > 0 and self.strict_rfc2965_unverifiable:
_debug(" third-party RFC 2965 cookie during unverifiable "
"transaction")
@@ -1100,7 +1100,7 @@ class DefaultCookiePolicy(CookiePolicy):
return True
def return_ok_secure(self, cookie, request):
- if cookie.secure and request.get_type() != "https":
+ if cookie.secure and request.type != "https":
_debug(" secure cookie with non-secure request")
return False
return True
diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py
index ddbcbf8..d291678 100644
--- a/Lib/http/cookies.py
+++ b/Lib/http/cookies.py
@@ -159,7 +159,7 @@ class CookieError(Exception):
# _LegalChars is the list of chars which don't require "'s
# _Translator hash-table for fast quoting
#
-_LegalChars = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~"
+_LegalChars = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~:"
_Translator = {
'\000' : '\\000', '\001' : '\\001', '\002' : '\\002',
'\003' : '\\003', '\004' : '\\004', '\005' : '\\005',
diff --git a/Lib/http/server.py b/Lib/http/server.py
index 5569037..c4ac703 100644
--- a/Lib/http/server.py
+++ b/Lib/http/server.py
@@ -100,11 +100,14 @@ import sys
import time
import urllib.parse
import copy
+import argparse
+
# Default error message template
DEFAULT_ERROR_MESSAGE = """\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
+<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Error response</title>
@@ -352,6 +355,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
"""
self.send_response_only(100)
+ self.flush_headers()
return True
def handle_one_request(self):
@@ -429,7 +433,8 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
self.wfile.write(content.encode('UTF-8', 'replace'))
def send_response(self, code, message=None):
- """Send the response header and log the response code.
+ """Add the response header to the headers buffer and log the
+ response code.
Also send two standard headers with the server software
version and the current date.
@@ -448,16 +453,19 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
else:
message = ''
if self.request_version != 'HTTP/0.9':
- self.wfile.write(("%s %d %s\r\n" %
- (self.protocol_version, code, message)).encode('latin1', 'strict'))
+ if not hasattr(self, '_headers_buffer'):
+ self._headers_buffer = []
+ self._headers_buffer.append(("%s %d %s\r\n" %
+ (self.protocol_version, code, message)).encode(
+ 'latin-1', 'strict'))
def send_header(self, keyword, value):
- """Send a MIME header."""
+ """Send a MIME header to the headers buffer."""
if self.request_version != 'HTTP/0.9':
if not hasattr(self, '_headers_buffer'):
self._headers_buffer = []
self._headers_buffer.append(
- ("%s: %s\r\n" % (keyword, value)).encode('latin1', 'strict'))
+ ("%s: %s\r\n" % (keyword, value)).encode('latin-1', 'strict'))
if keyword.lower() == 'connection':
if value.lower() == 'close':
@@ -469,6 +477,10 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
"""Send the blank line ending the MIME headers."""
if self.request_version != 'HTTP/0.9':
self._headers_buffer.append(b"\r\n")
+ self.flush_headers()
+
+ def flush_headers(self):
+ if hasattr(self, '_headers_buffer'):
self.wfile.write(b"".join(self._headers_buffer))
self._headers_buffer = []
@@ -514,7 +526,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
"""
sys.stderr.write("%s - - [%s] %s\n" %
- (self.client_address[0],
+ (self.address_string(),
self.log_date_time_string(),
format%args))
@@ -548,15 +560,9 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
def address_string(self):
- """Return the client address formatted for logging.
-
- This version looks up the full hostname using gethostbyaddr(),
- and tries to find a name that contains at least one dot.
-
- """
+ """Return the client address."""
- host, port = self.client_address[:2]
- return socket.getfqdn(host)
+ return self.client_address[0]
# Essentially static class variables
@@ -569,7 +575,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
# Table mapping response codes to messages; entries have the
# form {code: (shortmessage, longmessage)}.
- # See RFC 2616.
+ # See RFC 2616 and 6585.
responses = {
100: ('Continue', 'Request received, please continue'),
101: ('Switching Protocols',
@@ -624,6 +630,12 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
'Cannot satisfy request range.'),
417: ('Expectation Failed',
'Expect condition could not be satisfied.'),
+ 428: ('Precondition Required',
+ 'The origin server requires the request to be conditional.'),
+ 429: ('Too Many Requests', 'The user has sent too many requests '
+ 'in a given amount of time ("rate limiting").'),
+ 431: ('Request Header Fields Too Large', 'The server is unwilling to '
+ 'process the request because its header fields are too large.'),
500: ('Internal Server Error', 'Server got itself in trouble'),
501: ('Not Implemented',
@@ -634,6 +646,8 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
504: ('Gateway Timeout',
'The gateway server did not receive a timely response'),
505: ('HTTP Version Not Supported', 'Cannot fulfill request.'),
+ 511: ('Network Authentication Required',
+ 'The client needs to authenticate to gain network access.'),
}
@@ -722,10 +736,16 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
list.sort(key=lambda a: a.lower())
r = []
displaypath = html.escape(urllib.parse.unquote(self.path))
- r.append('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
- r.append("<html>\n<title>Directory listing for %s</title>\n" % displaypath)
- r.append("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath)
- r.append("<hr>\n<ul>\n")
+ enc = sys.getfilesystemencoding()
+ title = 'Directory listing for %s' % displaypath
+ r.append('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
+ '"http://www.w3.org/TR/html4/strict.dtd">')
+ r.append('<html>\n<head>')
+ r.append('<meta http-equiv="Content-Type" '
+ 'content="text/html; charset=%s">' % enc)
+ r.append('<title>%s</title>\n</head>' % title)
+ r.append('<body>\n<h1>%s</h1>' % title)
+ r.append('<hr>\n<ul>')
for name in list:
fullname = os.path.join(path, name)
displayname = linkname = name
@@ -736,11 +756,10 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
if os.path.islink(fullname):
displayname = name + "@"
# Note: a link to a directory displays with @ and links with /
- r.append('<li><a href="%s">%s</a>\n'
+ r.append('<li><a href="%s">%s</a></li>'
% (urllib.parse.quote(linkname), html.escape(displayname)))
- r.append("</ul>\n<hr>\n</body>\n</html>\n")
- enc = sys.getfilesystemencoding()
- encoded = ''.join(r).encode(enc)
+ r.append('</ul>\n<hr>\n</body>\n</html>\n')
+ encoded = '\n'.join(r).encode(enc)
f = io.BytesIO()
f.write(encoded)
f.seek(0)
@@ -888,11 +907,7 @@ def nobody_uid():
def executable(path):
"""Test for executable file."""
- try:
- st = os.stat(path)
- except os.error:
- return False
- return st.st_mode & 0o111 != 0
+ return os.access(path, os.X_OK)
class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
@@ -1008,7 +1023,7 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
scriptname)
return
ispy = self.is_python(scriptname)
- if not ispy:
+ if self.have_fork or not ispy:
if not self.is_executable(scriptfile):
self.send_error(403, "CGI script is not executable (%r)" %
scriptname)
@@ -1029,9 +1044,6 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
env['SCRIPT_NAME'] = scriptname
if query:
env['QUERY_STRING'] = query
- host = self.address_string()
- if host != self.client_address[0]:
- env['REMOTE_HOST'] = host
env['REMOTE_ADDR'] = self.client_address[0]
authorization = self.headers.get("authorization")
if authorization:
@@ -1083,6 +1095,7 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
env.setdefault(k, "")
self.send_response(200, "Script output follows")
+ self.flush_headers()
decoded_query = query.replace('+', ' ')
@@ -1162,18 +1175,13 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler):
def test(HandlerClass = BaseHTTPRequestHandler,
- ServerClass = HTTPServer, protocol="HTTP/1.0"):
+ ServerClass = HTTPServer, protocol="HTTP/1.0", port=8000):
"""Test the HTTP request handler class.
This runs an HTTP server on port 8000 (or the first command line
argument).
"""
-
- if sys.argv[1:]:
- port = int(sys.argv[1])
- else:
- port = 8000
server_address = ('', port)
HandlerClass.protocol_version = protocol
@@ -1189,4 +1197,15 @@ def test(HandlerClass = BaseHTTPRequestHandler,
sys.exit(0)
if __name__ == '__main__':
- test(HandlerClass=SimpleHTTPRequestHandler)
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--cgi', action='store_true',
+ help='Run as CGI Server')
+ parser.add_argument('port', action='store',
+ default=8000, type=int,
+ nargs='?',
+ help='Specify alternate port [default: 8000]')
+ args = parser.parse_args()
+ if args.cgi:
+ test(HandlerClass=CGIHTTPRequestHandler, port=args.port)
+ else:
+ test(HandlerClass=SimpleHTTPRequestHandler, port=args.port)
diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py
index e4c1aff..929d358 100644
--- a/Lib/idlelib/AutoComplete.py
+++ b/Lib/idlelib/AutoComplete.py
@@ -9,9 +9,6 @@ import string
from idlelib.configHandler import idleConf
-# This string includes all chars that may be in a file name (without a path
-# separator)
-FILENAME_CHARS = string.ascii_letters + string.digits + os.curdir + "._~#$:-"
# This string includes all chars that may be in an identifier
ID_CHARS = string.ascii_letters + string.digits + "_"
diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py
index e188192..e4ccb42 100644
--- a/Lib/idlelib/ColorDelegator.py
+++ b/Lib/idlelib/ColorDelegator.py
@@ -21,10 +21,11 @@ def make_pat():
# 1st 'file' colorized normal, 2nd as builtin, 3rd as string
builtin = r"([^.'\"\\#]\b|^)" + any("BUILTIN", builtinlist) + r"\b"
comment = any("COMMENT", [r"#[^\n]*"])
- sqstring = r"(\b[rRbB])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
- dqstring = r'(\b[rRbB])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
- sq3string = r"(\b[rRbB])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
- dq3string = r'(\b[rRbB])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
+ stringprefix = r"(\br|u|ur|R|U|UR|Ur|uR|b|B|br|Br|bR|BR|rb|rB|Rb|RB)?"
+ sqstring = stringprefix + r"'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+ dqstring = stringprefix + r'"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+ sq3string = stringprefix + r"'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
+ dq3string = stringprefix + r'"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
string = any("STRING", [sq3string, dq3string, sqstring, dqstring])
return kw + "|" + builtin + "|" + comment + "|" + string +\
"|" + any("SYNC", [r"\n"])
@@ -149,9 +150,9 @@ class ColorDelegator(Delegator):
self.stop_colorizing = False
self.colorizing = True
if DEBUG: print("colorizing...")
- t0 = time.clock()
+ t0 = time.perf_counter()
self.recolorize_main()
- t1 = time.clock()
+ t1 = time.perf_counter()
if DEBUG: print("%.3f seconds" % (t1-t0))
finally:
self.colorizing = False
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index ab62f91..e74b619 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -1,8 +1,9 @@
-import sys
+import imp
+import importlib
import os
import re
import string
-import imp
+import sys
from tkinter import *
import tkinter.simpledialog as tkSimpleDialog
import tkinter.messagebox as tkMessageBox
@@ -27,8 +28,7 @@ def _sphinx_version():
"Format sys.version_info to produce the Sphinx version string used to install the chm docs"
major, minor, micro, level, serial = sys.version_info
release = '%s%s' % (major, minor)
- if micro:
- release += '%s' % (micro,)
+ release += '%s' % (micro,)
if level == 'candidate':
release += 'rc%s' % (serial,)
elif level != 'final':
@@ -120,7 +120,7 @@ class EditorWindow(object):
def __init__(self, flist=None, filename=None, key=None, root=None):
if EditorWindow.help_url is None:
- dochome = os.path.join(sys.prefix, 'Doc', 'index.html')
+ dochome = os.path.join(sys.base_prefix, 'Doc', 'index.html')
if sys.platform.count('linux'):
# look for html docs in a couple of standard places
pyver = 'python-docs-' + '%s.%s.%s' % sys.version_info[:3]
@@ -131,13 +131,13 @@ class EditorWindow(object):
dochome = os.path.join(basepath, pyver,
'Doc', 'index.html')
elif sys.platform[:3] == 'win':
- chmfile = os.path.join(sys.prefix, 'Doc',
+ chmfile = os.path.join(sys.base_prefix, 'Doc',
'Python%s.chm' % _sphinx_version())
if os.path.isfile(chmfile):
dochome = chmfile
elif macosxSupport.runningAsOSXApp():
# documentation is stored inside the python framework
- dochome = os.path.join(sys.prefix,
+ dochome = os.path.join(sys.base_prefix,
'Resources/English.lproj/Documentation/index.html')
dochome = os.path.normpath(dochome)
if os.path.isfile(dochome):
@@ -1034,7 +1034,10 @@ class EditorWindow(object):
def load_extension(self, name):
try:
- mod = __import__(name, globals(), locals(), [])
+ try:
+ mod = importlib.import_module('.' + name, package=__package__)
+ except ImportError:
+ mod = importlib.import_module(name)
except ImportError:
print("\nFailed to import extension: ", name)
raise
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
index 9528c9a..ec50eb2 100644
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -485,6 +485,8 @@ class IOBinding:
("All files", "*"),
]
+ defaultextension = '.py' if sys.platform == 'darwin' else ''
+
def askopenfile(self):
dir, base = self.defaultfilename("open")
if not self.opendialog:
@@ -508,8 +510,10 @@ class IOBinding:
def asksavefile(self):
dir, base = self.defaultfilename("save")
if not self.savedialog:
- self.savedialog = tkFileDialog.SaveAs(master=self.text,
- filetypes=self.filetypes)
+ self.savedialog = tkFileDialog.SaveAs(
+ master=self.text,
+ filetypes=self.filetypes,
+ defaultextension=self.defaultextension)
filename = self.savedialog.show(initialdir=dir, initialfile=base)
return filename
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index f234b64..f6e8917d 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -1,10 +1,23 @@
-What's New in IDLE 3.2.4?
+What's New in IDLE 3.3.1?
+=========================
+
+- Issue #16226: Fix IDLE Path Browser crash.
+ (Patch by Roger Serwy)
+
+- Issue #15853: Prevent IDLE crash on OS X when opening Preferences menu
+ with certain versions of Tk 8.5. Initial patch by Kevin Walzer.
+
+
+What's New in IDLE 3.3.0?
=========================
- Issue #7163: Propagate return value of sys.stdout.write.
- Issue #15318: Prevent writing to sys.stdin.
+- Issue #4832: Modify IDLE to save files with .py extension by
+ default on Windows and OS X (Tk 8.5) as it already does with X11 Tk.
+
- Issue #13532, #15319: Check that arguments to sys.stdout.write are strings.
- Issue # 12510: Attempt to get certain tool tips no longer crashes IDLE.
@@ -18,15 +31,10 @@ What's New in IDLE 3.2.4?
- Issue #14937: Perform auto-completion of filenames in strings even for
non-ASCII filenames. Likewise for identifiers.
-- Issue #14018: Update checks for unstable system Tcl/Tk versions on OS X
- to include versions shipped with OS X 10.7 and 10.8 in addition to 10.6.
-
-- Issue #15853: Prevent IDLE crash on OS X when opening Preferences menu
- with certain versions of Tk 8.5. Initial patch by Kevin Walzer.
+- Issue #8515: Set __file__ when run file in IDLE.
+ Initial patch by Bruce Frederiksen.
-
-What's New in IDLE 3.2.3?
-=========================
+- IDLE can be launched as `python -m idlelib`
- Issue #14409: IDLE now properly executes commands in the Shell window
when it cannot read the normal config files on startup and
@@ -36,6 +44,9 @@ What's New in IDLE 3.2.3?
- Issue #3573: IDLE hangs when passing invalid command line args
(directory(ies) instead of file(s)).
+- Issue #14018: Update checks for unstable system Tcl/Tk versions on OS X
+ to include versions shipped with OS X 10.7 and 10.8 in addition to 10.6.
+
What's New in IDLE 3.2.1?
=========================
diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py
index d88a48e..55bf1aa 100644
--- a/Lib/idlelib/PathBrowser.py
+++ b/Lib/idlelib/PathBrowser.py
@@ -1,6 +1,7 @@
import os
import sys
import imp
+import importlib.machinery
from idlelib.TreeWidget import TreeItem
from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
@@ -70,9 +71,11 @@ class DirBrowserTreeItem(TreeItem):
def listmodules(self, allnames):
modules = {}
- suffixes = imp.get_suffixes()
+ suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
+ suffixes += importlib.machinery.SOURCE_SUFFIXES[:]
+ suffixes += importlib.machinery.BYTECODE_SUFFIXES[:]
sorted = []
- for suff, mode, flag in suffixes:
+ for suff in suffixes:
i = -len(suff)
for name in allnames[:]:
normed_name = os.path.normcase(name)
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index fb47b99..3b78f38 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -483,6 +483,10 @@ class ModifiedInterpreter(InteractiveInterpreter):
def kill_subprocess(self):
try:
+ self.rpcclt.listening_sock.close()
+ except AttributeError: # no socket
+ pass
+ try:
self.rpcclt.close()
except AttributeError: # no socket
pass
@@ -1011,6 +1015,8 @@ class PyShell(OutputWindow):
return False
else:
nosub = "==== No Subprocess ===="
+ sys.displayhook = rpc.displayhook
+
self.write("Python %s on %s\n%s\n%s" %
(sys.version, sys.platform, self.COPYRIGHT, nosub))
self.showprompt()
@@ -1233,6 +1239,16 @@ class PyShell(OutputWindow):
self.set_line_and_column()
def write(self, s, tags=()):
+ if isinstance(s, str) and len(s) and max(s) > '\uffff':
+ # Tk doesn't support outputting non-BMP characters
+ # Let's assume what printed string is not very long,
+ # find first non-BMP character and construct informative
+ # UnicodeEncodeError exception.
+ for start, char in enumerate(s):
+ if char > '\uffff':
+ break
+ raise UnicodeEncodeError("UCS-2", char, start, start+1,
+ 'Non-BMP character not supported in Tk')
try:
self.text.mark_gravity("iomark", "right")
count = OutputWindow.write(self, s, tags, "iomark")
diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
index 18ce965..528adf6 100644
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -150,16 +150,16 @@ class ScriptBinding:
dirname = os.path.dirname(filename)
# XXX Too often this discards arguments the user just set...
interp.runcommand("""if 1:
- _filename = %r
+ __file__ = {filename!r}
import sys as _sys
from os.path import basename as _basename
if (not _sys.argv or
- _basename(_sys.argv[0]) != _basename(_filename)):
- _sys.argv = [_filename]
+ _basename(_sys.argv[0]) != _basename(__file__)):
+ _sys.argv = [__file__]
import os as _os
- _os.chdir(%r)
- del _filename, _sys, _basename, _os
- \n""" % (filename, dirname))
+ _os.chdir({dirname!r})
+ del _sys, _basename, _os
+ \n""".format(filename=filename, dirname=dirname))
interp.prepend_syspath(filename)
# XXX KBK 03Jul04 When run w/o subprocess, runtime warnings still
# go to __stderr__. With subprocess, they go to the shell.
diff --git a/Lib/idlelib/__main__.py b/Lib/idlelib/__main__.py
new file mode 100644
index 0000000..0666f2f
--- /dev/null
+++ b/Lib/idlelib/__main__.py
@@ -0,0 +1,9 @@
+"""
+IDLE main entry point
+
+Run IDLE as python -m idlelib
+"""
+
+
+import idlelib.PyShell
+idlelib.PyShell.main()
diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py
index da92726..4049004 100644
--- a/Lib/idlelib/configHandler.py
+++ b/Lib/idlelib/configHandler.py
@@ -145,7 +145,8 @@ class IdleUserConfParser(IdleConfParser):
except IOError:
os.unlink(fname)
cfgFile = open(fname, 'w')
- self.write(cfgFile)
+ with cfgFile:
+ self.write(cfgFile)
else:
self.RemoveFile()
diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py
index 17455db..8d8317d 100644
--- a/Lib/idlelib/idlever.py
+++ b/Lib/idlelib/idlever.py
@@ -1 +1 @@
-IDLE_VERSION = "3.2.3"
+IDLE_VERSION = "3.3.0"
diff --git a/Lib/idlelib/macosxSupport.py b/Lib/idlelib/macosxSupport.py
index 9690442..67069fa 100644
--- a/Lib/idlelib/macosxSupport.py
+++ b/Lib/idlelib/macosxSupport.py
@@ -12,12 +12,22 @@ _appbundle = None
def runningAsOSXApp():
"""
Returns True if Python is running from within an app on OSX.
- If so, assume that Python was built with Aqua Tcl/Tk rather than
- X11 Tcl/Tk.
+ If so, the various OS X customizations will be triggered later (menu
+ fixup, et al). (Originally, this test was supposed to condition
+ behavior on whether IDLE was running under Aqua Tk rather than
+ under X11 Tk but that does not work since a framework build
+ could be linked with X11. For several releases, this test actually
+ differentiates between whether IDLE is running from a framework or
+ not. As a future enhancement, it should be considered whether there
+ should be a difference based on framework and any needed X11 adaptions
+ should be made dependent on a new function that actually tests for X11.)
"""
global _appbundle
if _appbundle is None:
- _appbundle = (sys.platform == 'darwin' and '.app' in sys.executable)
+ _appbundle = sys.platform == 'darwin'
+ if _appbundle:
+ import sysconfig
+ _appbundle = bool(sysconfig.get_config_var('PYTHONFRAMEWORK'))
return _appbundle
_carbonaquatk = None
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index def4394..77cb3ac 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -40,6 +40,7 @@ import traceback
import copyreg
import types
import marshal
+import builtins
def unpickle_code(ms):
@@ -196,8 +197,12 @@ class SocketIO(object):
return ("ERROR", "Unsupported message type: %s" % how)
except SystemExit:
raise
+ except KeyboardInterrupt:
+ raise
except socket.error:
raise
+ except Exception as ex:
+ return ("CALLEXC", ex)
except:
msg = "*** Internal Error: rpc.py:SocketIO.localcall()\n\n"\
" Object: %s \n Method: %s \n Args: %s\n"
@@ -257,6 +262,9 @@ class SocketIO(object):
if how == "ERROR":
self.debug("decoderesponse: Internal ERROR:", what)
raise RuntimeError(what)
+ if how == "CALLEXC":
+ self.debug("decoderesponse: Call Exception:", what)
+ raise what
raise SystemError(how, what)
def decode_interrupthook(self):
@@ -596,3 +604,21 @@ class MethodProxy(object):
# XXX KBK 09Sep03 We need a proper unit test for this module. Previously
# existing test code was removed at Rev 1.27 (r34098).
+
+def displayhook(value):
+ """Override standard display hook to use non-locale encoding"""
+ if value is None:
+ return
+ # Set '_' to None to avoid recursion
+ builtins._ = None
+ text = repr(value)
+ try:
+ sys.stdout.write(text)
+ except UnicodeEncodeError:
+ # let's use ascii while utf8-bmp codec doesn't present
+ encoding = 'ascii'
+ bytes = text.encode(encoding, 'backslashreplace')
+ text = bytes.decode(encoding, 'strict')
+ sys.stdout.write(text)
+ sys.stdout.write("\n")
+ builtins._ = value
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 5365680..9872af4 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -7,6 +7,7 @@ import traceback
import _thread as thread
import threading
import queue
+import tkinter
from idlelib import CallTips
from idlelib import AutoComplete
@@ -39,6 +40,17 @@ else:
return s
warnings.formatwarning = idle_formatwarning_subproc
+
+tcl = tkinter.Tcl()
+
+
+def handle_tk_events(tcl=tcl):
+ """Process any tk events that are ready to be dispatched if tkinter
+ has been imported, a tcl interpreter has been created and tk has been
+ loaded."""
+ tcl.eval("update")
+
+
# Thread shared globals: Establish a queue between a subthread (which handles
# the socket) and the main thread (which runs user code), plus global
# completion, exit and interruptable (the main thread) flags:
@@ -94,6 +106,7 @@ def main(del_exitfunc=False):
try:
seq, request = rpc.request_queue.get(block=True, timeout=0.05)
except queue.Empty:
+ handle_tk_events()
continue
method, args, kwargs = request
ret = method(*args, **kwargs)
@@ -295,6 +308,7 @@ class MyHandler(rpc.RPCHandler):
sys.stdin = _RPCInputFile(self.console)
sys.stdout = _RPCOutputFile(self.get_remote_proxy("stdout"))
sys.stderr = _RPCOutputFile(self.get_remote_proxy("stderr"))
+ sys.displayhook = rpc.displayhook
# page help() text to shell.
import pydoc # import must be done here to capture i/o binding
pydoc.pager = pydoc.plainpager
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index c0334d8..e16fb95 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -23,7 +23,7 @@ Public functions: Internaldate2tuple
__version__ = "2.58"
import binascii, errno, random, re, socket, subprocess, sys, time, calendar
-
+from datetime import datetime, timezone, timedelta
try:
import ssl
HAVE_SSL = True
@@ -249,15 +249,7 @@ class IMAP4:
def read(self, size):
"""Read 'size' bytes from remote."""
- chunks = []
- read = 0
- while read < size:
- data = self.file.read(min(size-read, 4096))
- if not data:
- break
- read += len(data)
- chunks.append(data)
- return b''.join(chunks)
+ return self.file.read(size)
def readline(self):
@@ -1177,25 +1169,40 @@ if HAVE_SSL:
"""IMAP4 client class over SSL connection
- Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile]]]])
+ Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]])
host - host's name (default: localhost);
- port - port number (default: standard IMAP4 SSL port).
+ port - port number (default: standard IMAP4 SSL port);
keyfile - PEM formatted file that contains your private key (default: None);
certfile - PEM formatted certificate chain file (default: None);
+ ssl_context - a SSLContext object that contains your certificate chain
+ and private key (default: None)
+ Note: if ssl_context is provided, then parameters keyfile or
+ certfile should not be set otherwise ValueError is thrown.
for more documentation see the docstring of the parent class IMAP4.
"""
- def __init__(self, host = '', port = IMAP4_SSL_PORT, keyfile = None, certfile = None):
+ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None):
+ if ssl_context is not None and keyfile is not None:
+ raise ValueError("ssl_context and keyfile arguments are mutually "
+ "exclusive")
+ if ssl_context is not None and certfile is not None:
+ raise ValueError("ssl_context and certfile arguments are mutually "
+ "exclusive")
+
self.keyfile = keyfile
self.certfile = certfile
+ self.ssl_context = ssl_context
IMAP4.__init__(self, host, port)
def _create_socket(self):
sock = IMAP4._create_socket(self)
- return ssl.wrap_socket(sock, self.keyfile, self.certfile)
+ if self.ssl_context:
+ return self.ssl_context.wrap_socket(sock)
+ else:
+ return ssl.wrap_socket(sock, self.keyfile, self.certfile)
def open(self, host='', port=IMAP4_SSL_PORT):
"""Setup connection to remote server on "host:port".
@@ -1306,10 +1313,8 @@ class _Authenticator:
return ''
return binascii.a2b_base64(inp)
-
-
-Mon2num = {b'Jan': 1, b'Feb': 2, b'Mar': 3, b'Apr': 4, b'May': 5, b'Jun': 6,
- b'Jul': 7, b'Aug': 8, b'Sep': 9, b'Oct': 10, b'Nov': 11, b'Dec': 12}
+Months = ' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ')
+Mon2num = {s.encode():n+1 for n, s in enumerate(Months[1:])}
def Internaldate2tuple(resp):
"""Parse an IMAP4 INTERNALDATE string.
@@ -1377,28 +1382,37 @@ def Time2Internaldate(date_time):
Return string in form: '"DD-Mmm-YYYY HH:MM:SS +HHMM"'. The
date_time argument can be a number (int or float) representing
seconds since epoch (as returned by time.time()), a 9-tuple
- representing local time (as returned by time.localtime()), or a
+ representing local time, an instance of time.struct_time (as
+ returned by time.localtime()), an aware datetime instance or a
double-quoted string. In the last case, it is assumed to already
be in the correct format.
"""
-
if isinstance(date_time, (int, float)):
- tt = time.localtime(date_time)
- elif isinstance(date_time, (tuple, time.struct_time)):
- tt = date_time
+ dt = datetime.fromtimestamp(date_time,
+ timezone.utc).astimezone()
+ elif isinstance(date_time, tuple):
+ try:
+ gmtoff = date_time.tm_gmtoff
+ except AttributeError:
+ if time.daylight:
+ dst = date_time[8]
+ if dst == -1:
+ dst = time.localtime(time.mktime(date_time))[8]
+ gmtoff = -(time.timezone, time.altzone)[dst]
+ else:
+ gmtoff = -time.timezone
+ delta = timedelta(seconds=gmtoff)
+ dt = datetime(*date_time[:6], tzinfo=timezone(delta))
+ elif isinstance(date_time, datetime):
+ if date_time.tzinfo is None:
+ raise ValueError("date_time must be aware")
+ dt = date_time
elif isinstance(date_time, str) and (date_time[0],date_time[-1]) == ('"','"'):
return date_time # Assume in correct format
else:
raise ValueError("date_time not of a known type")
-
- dt = time.strftime("%d-%b-%Y %H:%M:%S", tt)
- if dt[0] == '0':
- dt = ' ' + dt[1:]
- if time.daylight and tt[-1]:
- zone = -time.altzone
- else:
- zone = -time.timezone
- return '"' + dt + " %+03d%02d" % divmod(zone//60, 60) + '"'
+ fmt = '"%d-{}-%Y %H:%M:%S %z"'.format(Months[dt.month])
+ return dt.strftime(fmt)
diff --git a/Lib/imp.py b/Lib/imp.py
new file mode 100644
index 0000000..da9c84e
--- /dev/null
+++ b/Lib/imp.py
@@ -0,0 +1,257 @@
+"""This module provides the components needed to build your own __import__
+function. Undocumented functions are obsolete.
+
+In most cases it is preferred you consider using the importlib module's
+functionality over this module.
+
+"""
+# (Probably) need to stay in _imp
+from _imp import (lock_held, acquire_lock, release_lock,
+ load_dynamic, get_frozen_object, is_frozen_package,
+ init_builtin, init_frozen, is_builtin, is_frozen,
+ _fix_co_filename)
+
+# Directly exposed by this module
+from importlib._bootstrap import new_module
+from importlib._bootstrap import cache_from_source, source_from_cache
+
+
+from importlib import _bootstrap
+from importlib import machinery
+import os
+import sys
+import tokenize
+import warnings
+
+
+# DEPRECATED
+SEARCH_ERROR = 0
+PY_SOURCE = 1
+PY_COMPILED = 2
+C_EXTENSION = 3
+PY_RESOURCE = 4
+PKG_DIRECTORY = 5
+C_BUILTIN = 6
+PY_FROZEN = 7
+PY_CODERESOURCE = 8
+IMP_HOOK = 9
+
+
+def get_magic():
+ """Return the magic number for .pyc or .pyo files."""
+ return _bootstrap._MAGIC_BYTES
+
+
+def get_tag():
+ """Return the magic tag for .pyc or .pyo files."""
+ return sys.implementation.cache_tag
+
+
+def get_suffixes():
+ warnings.warn('imp.get_suffixes() is deprecated; use the constants '
+ 'defined on importlib.machinery instead',
+ DeprecationWarning, 2)
+ extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES]
+ source = [(s, 'U', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES]
+ bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES]
+
+ return extensions + source + bytecode
+
+
+class NullImporter:
+
+ """Null import object."""
+
+ def __init__(self, path):
+ if path == '':
+ raise ImportError('empty pathname', path='')
+ elif os.path.isdir(path):
+ raise ImportError('existing directory', path=path)
+
+ def find_module(self, fullname):
+ """Always returns None."""
+ return None
+
+
+class _HackedGetData:
+
+ """Compatibiilty support for 'file' arguments of various load_*()
+ functions."""
+
+ def __init__(self, fullname, path, file=None):
+ super().__init__(fullname, path)
+ self.file = file
+
+ def get_data(self, path):
+ """Gross hack to contort loader to deal w/ load_*()'s bad API."""
+ if self.file and path == self.path:
+ with self.file:
+ # Technically should be returning bytes, but
+ # SourceLoader.get_code() just passed what is returned to
+ # compile() which can handle str. And converting to bytes would
+ # require figuring out the encoding to decode to and
+ # tokenize.detect_encoding() only accepts bytes.
+ return self.file.read()
+ else:
+ return super().get_data(path)
+
+
+class _LoadSourceCompatibility(_HackedGetData, _bootstrap.SourceFileLoader):
+
+ """Compatibility support for implementing load_source()."""
+
+
+def load_source(name, pathname, file=None):
+ msg = ('imp.load_source() is deprecated; use '
+ 'importlib.machinery.SourceFileLoader(name, pathname).load_module()'
+ ' instead')
+ warnings.warn(msg, DeprecationWarning, 2)
+ return _LoadSourceCompatibility(name, pathname, file).load_module(name)
+
+
+class _LoadCompiledCompatibility(_HackedGetData,
+ _bootstrap.SourcelessFileLoader):
+
+ """Compatibility support for implementing load_compiled()."""
+
+
+def load_compiled(name, pathname, file=None):
+ msg = ('imp.load_compiled() is deprecated; use '
+ 'importlib.machinery.SourcelessFileLoader(name, pathname).'
+ 'load_module() instead ')
+ warnings.warn(msg, DeprecationWarning, 2)
+ return _LoadCompiledCompatibility(name, pathname, file).load_module(name)
+
+
+def load_package(name, path):
+ msg = ('imp.load_package() is deprecated; use either '
+ 'importlib.machinery.SourceFileLoader() or '
+ 'importlib.machinery.SourcelessFileLoader() instead')
+ warnings.warn(msg, DeprecationWarning, 2)
+ if os.path.isdir(path):
+ extensions = (machinery.SOURCE_SUFFIXES[:] +
+ machinery.BYTECODE_SUFFIXES[:])
+ for extension in extensions:
+ path = os.path.join(path, '__init__'+extension)
+ if os.path.exists(path):
+ break
+ else:
+ raise ValueError('{!r} is not a package'.format(path))
+ return _bootstrap.SourceFileLoader(name, path).load_module(name)
+
+
+def load_module(name, file, filename, details):
+ """**DEPRECATED**
+
+ Load a module, given information returned by find_module().
+
+ The module name must include the full package name, if any.
+
+ """
+ suffix, mode, type_ = details
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ if mode and (not mode.startswith(('r', 'U')) or '+' in mode):
+ raise ValueError('invalid file open mode {!r}'.format(mode))
+ elif file is None and type_ in {PY_SOURCE, PY_COMPILED, C_EXTENSION}:
+ msg = 'file object required for import (type code {})'.format(type_)
+ raise ValueError(msg)
+ elif type_ == PY_SOURCE:
+ return load_source(name, filename, file)
+ elif type_ == PY_COMPILED:
+ return load_compiled(name, filename, file)
+ elif type_ == C_EXTENSION:
+ return load_dynamic(name, filename, file)
+ elif type_ == PKG_DIRECTORY:
+ return load_package(name, filename)
+ elif type_ == C_BUILTIN:
+ return init_builtin(name)
+ elif type_ == PY_FROZEN:
+ return init_frozen(name)
+ else:
+ msg = "Don't know how to import {} (type code {})".format(name, type_)
+ raise ImportError(msg, name=name)
+
+
+def find_module(name, path=None):
+ """**DEPRECATED**
+
+ Search for a module.
+
+ If path is omitted or None, search for a built-in, frozen or special
+ module and continue search in sys.path. The module name cannot
+ contain '.'; to search for a submodule of a package, pass the
+ submodule name and the package's __path__.
+
+ """
+ if not isinstance(name, str):
+ raise TypeError("'name' must be a str, not {}".format(type(name)))
+ elif not isinstance(path, (type(None), list)):
+ # Backwards-compatibility
+ raise RuntimeError("'list' must be None or a list, "
+ "not {}".format(type(name)))
+
+ if path is None:
+ if is_builtin(name):
+ return None, None, ('', '', C_BUILTIN)
+ elif is_frozen(name):
+ return None, None, ('', '', PY_FROZEN)
+ else:
+ path = sys.path
+
+ for entry in path:
+ package_directory = os.path.join(entry, name)
+ for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]:
+ package_file_name = '__init__' + suffix
+ file_path = os.path.join(package_directory, package_file_name)
+ if os.path.isfile(file_path):
+ return None, package_directory, ('', '', PKG_DIRECTORY)
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ for suffix, mode, type_ in get_suffixes():
+ file_name = name + suffix
+ file_path = os.path.join(entry, file_name)
+ if os.path.isfile(file_path):
+ break
+ else:
+ continue
+ break # Break out of outer loop when breaking out of inner loop.
+ else:
+ raise ImportError(_bootstrap._ERR_MSG.format(name), name=name)
+
+ encoding = None
+ if mode == 'U':
+ with open(file_path, 'rb') as file:
+ encoding = tokenize.detect_encoding(file.readline)[0]
+ file = open(file_path, mode, encoding=encoding)
+ return file, file_path, (suffix, mode, type_)
+
+
+_RELOADING = {}
+
+def reload(module):
+ """Reload the module and return it.
+
+ The module must have been successfully imported before.
+
+ """
+ if not module or type(module) != type(sys):
+ raise TypeError("reload() argument must be module")
+ name = module.__name__
+ if name not in sys.modules:
+ msg = "module {} not in sys.modules"
+ raise ImportError(msg.format(name), name=name)
+ if name in _RELOADING:
+ return _RELOADING[name]
+ _RELOADING[name] = module
+ try:
+ parent_name = name.rpartition('.')[0]
+ if parent_name and parent_name not in sys.modules:
+ msg = "parent {!r} not in sys.modules"
+ raise ImportError(msg.format(parentname), name=parent_name)
+ return module.__loader__.load_module(name)
+ finally:
+ try:
+ del _RELOADING[name]
+ except KeyError:
+ pass
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py
index 2baaf93..6f40dac 100644
--- a/Lib/importlib/__init__.py
+++ b/Lib/importlib/__init__.py
@@ -1,108 +1,72 @@
-"""A pure Python implementation of import.
-
-References on import:
-
- * Language reference
- http://docs.python.org/ref/import.html
- * __import__ function
- http://docs.python.org/lib/built-in-funcs.html
- * Packages
- http://www.python.org/doc/essays/packages.html
- * PEP 235: Import on Case-Insensitive Platforms
- http://www.python.org/dev/peps/pep-0235
- * PEP 275: Import Modules from Zip Archives
- http://www.python.org/dev/peps/pep-0273
- * PEP 302: New Import Hooks
- http://www.python.org/dev/peps/pep-0302/
- * PEP 328: Imports: Multi-line and Absolute/Relative
- http://www.python.org/dev/peps/pep-0328
-
-"""
-__all__ = ['__import__', 'import_module']
-
-from . import _bootstrap
-
-import os
-import re
-import tokenize
+"""A pure Python implementation of import."""
+__all__ = ['__import__', 'import_module', 'invalidate_caches']
# Bootstrap help #####################################################
-def _case_ok(directory, check):
- """Check if the directory contains something matching 'check'.
+# Until bootstrapping is complete, DO NOT import any modules that attempt
+# to import importlib._bootstrap (directly or indirectly). Since this
+# partially initialised package would be present in sys.modules, those
+# modules would get an uninitialised copy of the source version, instead
+# of a fully initialised version (either the frozen one or the one
+# initialised below if the frozen one is not available).
+import _imp # Just the builtin component, NOT the full Python module
+import sys
- No check is done if the file/directory exists or not.
+try:
+ import _frozen_importlib as _bootstrap
+except ImportError:
+ from . import _bootstrap
+ _bootstrap._setup(sys, _imp)
+else:
+ # importlib._bootstrap is the built-in import, ensure we don't create
+ # a second copy of the module.
+ _bootstrap.__name__ = 'importlib._bootstrap'
+ _bootstrap.__package__ = 'importlib'
+ _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py')
+ sys.modules['importlib._bootstrap'] = _bootstrap
+
+# To simplify imports in test code
+_w_long = _bootstrap._w_long
+_r_long = _bootstrap._r_long
+
+# Fully bootstrapped at this point, import whatever you like, circular
+# dependencies and startup overhead minimisation permitting :)
- """
- if 'PYTHONCASEOK' in os.environ:
- return True
- elif check in os.listdir(directory if directory else os.getcwd()):
- return True
- return False
+# Public API #########################################################
+from ._bootstrap import __import__
-def _w_long(x):
- """Convert a 32-bit integer to little-endian.
- XXX Temporary until marshal's long functions are exposed.
+def invalidate_caches():
+ """Call the invalidate_caches() method on all meta path finders stored in
+ sys.meta_path (where implemented)."""
+ for finder in sys.meta_path:
+ if hasattr(finder, 'invalidate_caches'):
+ finder.invalidate_caches()
- """
- x = int(x)
- int_bytes = []
- int_bytes.append(x & 0xFF)
- int_bytes.append((x >> 8) & 0xFF)
- int_bytes.append((x >> 16) & 0xFF)
- int_bytes.append((x >> 24) & 0xFF)
- return bytearray(int_bytes)
+def find_loader(name, path=None):
+ """Find the loader for the specified module.
-def _r_long(int_bytes):
- """Convert 4 bytes in little-endian to an integer.
+ First, sys.modules is checked to see if the module was already imported. If
+ so, then sys.modules[name].__loader__ is returned. If that happens to be
+ set to None, then ValueError is raised. If the module is not in
+ sys.modules, then sys.meta_path is searched for a suitable loader with the
+ value of 'path' given to the finders. None is returned if no loader could
+ be found.
- XXX Temporary until marshal's long function are exposed.
+ Dotted names do not have their parent packages implicitly imported.
"""
- x = int_bytes[0]
- x |= int_bytes[1] << 8
- x |= int_bytes[2] << 16
- x |= int_bytes[3] << 24
- return x
-
-
-# Required built-in modules.
-try:
- import posix as _os
-except ImportError:
try:
- import nt as _os
- except ImportError:
- try:
- import os2 as _os
- except ImportError:
- raise ImportError('posix, nt, or os2 module required for importlib')
-_bootstrap._os = _os
-import imp, sys, marshal, errno, _io
-_bootstrap.imp = imp
-_bootstrap.sys = sys
-_bootstrap.marshal = marshal
-_bootstrap.errno = errno
-_bootstrap._io = _io
-import _warnings
-_bootstrap._warnings = _warnings
-
-
-from os import sep
-# For os.path.join replacement; pull from Include/osdefs.h:SEP .
-_bootstrap.path_sep = sep
-
-_bootstrap._case_ok = _case_ok
-marshal._w_long = _w_long
-marshal._r_long = _r_long
-
-
-# Public API #########################################################
-
-from ._bootstrap import __import__
+ loader = sys.modules[name].__loader__
+ if loader is None:
+ raise ValueError('{}.__loader__ is None'.format(name))
+ else:
+ return loader
+ except KeyError:
+ pass
+ return _bootstrap._find_module(name, path)
def import_module(name, package=None):
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 90eb1a7..26d9250 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -6,33 +6,93 @@ such it requires the injection of specific modules and attributes in order to
work. One should use importlib as the public-facing version of this module.
"""
-
-# Injected modules are '_warnings', 'imp', 'sys', 'marshal', 'errno', '_io',
-# and '_os' (a.k.a. 'posix', 'nt' or 'os2').
-# Injected attribute is path_sep.
#
+# IMPORTANT: Whenever making changes to this module, be sure to run
+# a top-level make in order to get the frozen version of the module
+# update. Not doing so, will result in the Makefile to fail for
+# all others who don't have a ./python around to freeze the module
+# in the early stages of compilation.
+#
+
+# See importlib._setup() for what is injected into the global namespace.
+
# When editing this code be aware that code executed at import time CANNOT
# reference any injected objects! This includes not only global code but also
# anything specified at the class level.
+# XXX Make sure all public names have no single leading underscore and all
+# others do.
+
# Bootstrap-related code ######################################################
-# XXX Could also expose Modules/getpath.c:joinpath()
-def _path_join(*args):
- """Replacement for os.path.join."""
- return path_sep.join(x[:-len(path_sep)] if x.endswith(path_sep) else x
- for x in args if x)
+_CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin'
-def _path_exists(path):
- """Replacement for os.path.exists."""
- try:
- _os.stat(path)
- except OSError:
- return False
+def _make_relax_case():
+ if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
+ def _relax_case():
+ """True if filenames must be checked case-insensitively."""
+ return b'PYTHONCASEOK' in _os.environ
else:
- return True
+ def _relax_case():
+ """True if filenames must be checked case-insensitively."""
+ return False
+ return _relax_case
+
+
+# TODO: Expose from marshal
+def _w_long(x):
+ """Convert a 32-bit integer to little-endian.
+
+ XXX Temporary until marshal's long functions are exposed.
+
+ """
+ x = int(x)
+ int_bytes = []
+ int_bytes.append(x & 0xFF)
+ int_bytes.append((x >> 8) & 0xFF)
+ int_bytes.append((x >> 16) & 0xFF)
+ int_bytes.append((x >> 24) & 0xFF)
+ return bytearray(int_bytes)
+
+
+# TODO: Expose from marshal
+def _r_long(int_bytes):
+ """Convert 4 bytes in little-endian to an integer.
+
+ XXX Temporary until marshal's long function are exposed.
+
+ """
+ x = int_bytes[0]
+ x |= int_bytes[1] << 8
+ x |= int_bytes[2] << 16
+ x |= int_bytes[3] << 24
+ return x
+
+
+def _path_join(*path_parts):
+ """Replacement for os.path.join()."""
+ new_parts = []
+ for part in path_parts:
+ if not part:
+ continue
+ new_parts.append(part)
+ if part[-1] not in path_separators:
+ new_parts.append(path_sep)
+ return ''.join(new_parts[:-1]) # Drop superfluous path separator.
+
+
+def _path_split(path):
+ """Replacement for os.path.split()."""
+ for x in reversed(path):
+ if x in path_separators:
+ sep = x
+ break
+ else:
+ sep = path_sep
+ front, _, tail = path.rpartition(sep)
+ return front, tail
def _path_is_mode_type(path, mode):
@@ -58,61 +118,401 @@ def _path_isdir(path):
return _path_is_mode_type(path, 0o040000)
-def _path_without_ext(path, ext_type):
- """Replacement for os.path.splitext()[0]."""
- for suffix in _suffix_list(ext_type):
- if path.endswith(suffix):
- return path[:-len(suffix)]
- else:
- raise ValueError("path is not of the specified type")
+def _write_atomic(path, data, mode=0o666):
+ """Best-effort function to write data to a path atomically.
+ Be prepared to handle a FileExistsError if concurrent writing of the
+ temporary file is attempted."""
+ # id() is used to generate a pseudo-random filename.
+ path_tmp = '{}.{}'.format(path, id(path))
+ fd = _os.open(path_tmp,
+ _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666)
+ try:
+ # We first write data to a temporary file, and then use os.replace() to
+ # perform an atomic rename.
+ with _io.FileIO(fd, 'wb') as file:
+ file.write(data)
+ _os.replace(path_tmp, path)
+ except OSError:
+ try:
+ _os.unlink(path_tmp)
+ except OSError:
+ pass
+ raise
-def _path_absolute(path):
- """Replacement for os.path.abspath."""
- if not path:
- path = _os.getcwd()
+def _wrap(new, old):
+ """Simple substitute for functools.update_wrapper."""
+ for replace in ['__module__', '__name__', '__qualname__', '__doc__']:
+ if hasattr(old, replace):
+ setattr(new, replace, getattr(old, replace))
+ new.__dict__.update(old.__dict__)
+
+
+_code_type = type(_wrap.__code__)
+
+
+def new_module(name):
+ """Create a new module.
+
+ The module is not entered into sys.modules.
+
+ """
+ return type(_io)(name)
+
+
+# Module-level locking ########################################################
+
+# A dict mapping module names to weakrefs of _ModuleLock instances
+_module_locks = {}
+# A dict mapping thread ids to _ModuleLock instances
+_blocking_on = {}
+
+
+class _DeadlockError(RuntimeError):
+ pass
+
+
+class _ModuleLock:
+ """A recursive lock implementation which is able to detect deadlocks
+ (e.g. thread 1 trying to take locks A then B, and thread 2 trying to
+ take locks B then A).
+ """
+
+ def __init__(self, name):
+ self.lock = _thread.allocate_lock()
+ self.wakeup = _thread.allocate_lock()
+ self.name = name
+ self.owner = None
+ self.count = 0
+ self.waiters = 0
+
+ def has_deadlock(self):
+ # Deadlock avoidance for concurrent circular imports.
+ me = _thread.get_ident()
+ tid = self.owner
+ while True:
+ lock = _blocking_on.get(tid)
+ if lock is None:
+ return False
+ tid = lock.owner
+ if tid == me:
+ return True
+
+ def acquire(self):
+ """
+ Acquire the module lock. If a potential deadlock is detected,
+ a _DeadlockError is raised.
+ Otherwise, the lock is always acquired and True is returned.
+ """
+ tid = _thread.get_ident()
+ _blocking_on[tid] = self
+ try:
+ while True:
+ with self.lock:
+ if self.count == 0 or self.owner == tid:
+ self.owner = tid
+ self.count += 1
+ return True
+ if self.has_deadlock():
+ raise _DeadlockError("deadlock detected by %r" % self)
+ if self.wakeup.acquire(False):
+ self.waiters += 1
+ # Wait for a release() call
+ self.wakeup.acquire()
+ self.wakeup.release()
+ finally:
+ del _blocking_on[tid]
+
+ def release(self):
+ tid = _thread.get_ident()
+ with self.lock:
+ if self.owner != tid:
+ raise RuntimeError("cannot release un-acquired lock")
+ assert self.count > 0
+ self.count -= 1
+ if self.count == 0:
+ self.owner = None
+ if self.waiters:
+ self.waiters -= 1
+ self.wakeup.release()
+
+ def __repr__(self):
+ return "_ModuleLock(%r) at %d" % (self.name, id(self))
+
+
+class _DummyModuleLock:
+ """A simple _ModuleLock equivalent for Python builds without
+ multi-threading support."""
+
+ def __init__(self, name):
+ self.name = name
+ self.count = 0
+
+ def acquire(self):
+ self.count += 1
+ return True
+
+ def release(self):
+ if self.count == 0:
+ raise RuntimeError("cannot release un-acquired lock")
+ self.count -= 1
+
+ def __repr__(self):
+ return "_DummyModuleLock(%r) at %d" % (self.name, id(self))
+
+
+# The following two functions are for consumption by Python/import.c.
+
+def _get_module_lock(name):
+ """Get or create the module lock for a given module name.
+
+ Should only be called with the import lock taken."""
+ lock = None
try:
- return _os._getfullpathname(path)
- except AttributeError:
- if path.startswith('/'):
- return path
+ lock = _module_locks[name]()
+ except KeyError:
+ pass
+ if lock is None:
+ if _thread is None:
+ lock = _DummyModuleLock(name)
else:
- return _path_join(_os.getcwd(), path)
+ lock = _ModuleLock(name)
+ def cb(_):
+ del _module_locks[name]
+ _module_locks[name] = _weakref.ref(lock, cb)
+ return lock
+
+def _lock_unlock_module(name):
+ """Release the global import lock, and acquires then release the
+ module lock for a given module name.
+ This is used to ensure a module is completely initialized, in the
+ event it is being imported by another thread.
+
+ Should only be called with the import lock taken."""
+ lock = _get_module_lock(name)
+ _imp.release_lock()
+ try:
+ lock.acquire()
+ except _DeadlockError:
+ # Concurrent circular import, we'll accept a partially initialized
+ # module object.
+ pass
+ else:
+ lock.release()
+# Frame stripping magic ###############################################
-def _wrap(new, old):
- """Simple substitute for functools.wraps."""
- for replace in ['__module__', '__name__', '__doc__']:
- setattr(new, replace, getattr(old, replace))
- new.__dict__.update(old.__dict__)
+def _call_with_frames_removed(f, *args, **kwds):
+ """remove_importlib_frames in import.c will always remove sequences
+ of importlib frames that end with a call to this function
+
+ Use it instead of a normal call in places where including the importlib
+ frames introduces unwanted noise into the traceback (e.g. when executing
+ module code)
+ """
+ return f(*args, **kwds)
+
+
+# Finder/loader utility code ###############################################
+
+"""Magic word to reject .pyc files generated by other Python versions.
+It should change for each incompatible change to the bytecode.
+
+The value of CR and LF is incorporated so if you ever read or write
+a .pyc file in text mode the magic number will be wrong; also, the
+Apple MPW compiler swaps their values, botching string constants.
+
+The magic numbers must be spaced apart at least 2 values, as the
+-U interpeter flag will cause MAGIC+1 being used. They have been
+odd numbers for some time now.
+
+There were a variety of old schemes for setting the magic number.
+The current working scheme is to increment the previous value by
+10.
+
+Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
+number also includes a new "magic tag", i.e. a human readable string used
+to represent the magic number in __pycache__ directories. When you change
+the magic number, you must also set a new unique magic tag. Generally this
+can be named after the Python major version of the magic number bump, but
+it can really be anything, as long as it's different than anything else
+that's come before. The tags are included in the following table, starting
+with Python 3.2a0.
+
+Known values:
+ Python 1.5: 20121
+ Python 1.5.1: 20121
+ Python 1.5.2: 20121
+ Python 1.6: 50428
+ Python 2.0: 50823
+ Python 2.0.1: 50823
+ Python 2.1: 60202
+ Python 2.1.1: 60202
+ Python 2.1.2: 60202
+ Python 2.2: 60717
+ Python 2.3a0: 62011
+ Python 2.3a0: 62021
+ Python 2.3a0: 62011 (!)
+ Python 2.4a0: 62041
+ Python 2.4a3: 62051
+ Python 2.4b1: 62061
+ Python 2.5a0: 62071
+ Python 2.5a0: 62081 (ast-branch)
+ Python 2.5a0: 62091 (with)
+ Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
+ Python 2.5b3: 62101 (fix wrong code: for x, in ...)
+ Python 2.5b3: 62111 (fix wrong code: x += yield)
+ Python 2.5c1: 62121 (fix wrong lnotab with for loops and
+ storing constants that should have been removed)
+ Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
+ Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
+ Python 2.6a1: 62161 (WITH_CLEANUP optimization)
+ Python 3000: 3000
+ 3010 (removed UNARY_CONVERT)
+ 3020 (added BUILD_SET)
+ 3030 (added keyword-only parameters)
+ 3040 (added signature annotations)
+ 3050 (print becomes a function)
+ 3060 (PEP 3115 metaclass syntax)
+ 3061 (string literals become unicode)
+ 3071 (PEP 3109 raise changes)
+ 3081 (PEP 3137 make __file__ and __name__ unicode)
+ 3091 (kill str8 interning)
+ 3101 (merge from 2.6a0, see 62151)
+ 3103 (__file__ points to source file)
+ Python 3.0a4: 3111 (WITH_CLEANUP optimization).
+ Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
+ Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
+ change LIST_APPEND and SET_ADD, add MAP_ADD)
+ Python 3.1a0: 3151 (optimize conditional branches:
+ introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
+ Python 3.2a0: 3160 (add SETUP_WITH)
+ tag: cpython-32
+ Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
+ tag: cpython-32
+ Python 3.2a2 3180 (add DELETE_DEREF)
+ Python 3.3a0 3190 __class__ super closure changed
+ Python 3.3a0 3200 (__qualname__ added)
+ 3210 (added size modulo 2**32 to the pyc header)
+ Python 3.3a1 3220 (changed PEP 380 implementation)
+ Python 3.3a4 3230 (revert changes to implicit __class__ closure)
+
+MAGIC must change whenever the bytecode emitted by the compiler may no
+longer be understood by older implementations of the eval loop (usually
+due to the addition of new opcodes).
+
+"""
+_RAW_MAGIC_NUMBER = 3230 | ord('\r') << 16 | ord('\n') << 24
+_MAGIC_BYTES = bytes(_RAW_MAGIC_NUMBER >> n & 0xff for n in range(0, 25, 8))
+
+_PYCACHE = '__pycache__'
+
+SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed.
+
+DEBUG_BYTECODE_SUFFIXES = ['.pyc']
+OPTIMIZED_BYTECODE_SUFFIXES = ['.pyo']
+
+def cache_from_source(path, debug_override=None):
+ """Given the path to a .py file, return the path to its .pyc/.pyo file.
+
+ The .py file does not need to exist; this simply returns the path to the
+ .pyc/.pyo file calculated as if the .py file were imported. The extension
+ will be .pyc unless sys.flags.optimize is non-zero, then it will be .pyo.
+
+ If debug_override is not None, then it must be a boolean and is used in
+ place of sys.flags.optimize.
+
+ If sys.implementation.cache_tag is None then NotImplementedError is raised.
+
+ """
+ debug = not sys.flags.optimize if debug_override is None else debug_override
+ if debug:
+ suffixes = DEBUG_BYTECODE_SUFFIXES
+ else:
+ suffixes = OPTIMIZED_BYTECODE_SUFFIXES
+ head, tail = _path_split(path)
+ base_filename, sep, _ = tail.partition('.')
+ tag = sys.implementation.cache_tag
+ if tag is None:
+ raise NotImplementedError('sys.implementation.cache_tag is None')
+ filename = ''.join([base_filename, sep, tag, suffixes[0]])
+ return _path_join(head, _PYCACHE, filename)
+
+
+def source_from_cache(path):
+ """Given the path to a .pyc./.pyo file, return the path to its .py file.
+
+ The .pyc/.pyo file does not need to exist; this simply returns the path to
+ the .py file calculated to correspond to the .pyc/.pyo file. If path does
+ not conform to PEP 3147 format, ValueError will be raised. If
+ sys.implementation.cache_tag is None then NotImplementedError is raised.
+
+ """
+ if sys.implementation.cache_tag is None:
+ raise NotImplementedError('sys.implementation.cache_tag is None')
+ head, pycache_filename = _path_split(path)
+ head, pycache = _path_split(head)
+ if pycache != _PYCACHE:
+ raise ValueError('{} not bottom-level directory in '
+ '{!r}'.format(_PYCACHE, path))
+ if pycache_filename.count('.') != 2:
+ raise ValueError('expected only 2 dots in '
+ '{!r}'.format(pycache_filename))
+ base_filename = pycache_filename.partition('.')[0]
+ return _path_join(head, base_filename + SOURCE_SUFFIXES[0])
+
+
+def _get_sourcefile(bytecode_path):
+ """Convert a bytecode file path to a source path (if possible).
+
+ This function exists purely for backwards-compatibility for
+ PyImport_ExecCodeModuleWithFilenames() in the C API.
+
+ """
+ if len(bytecode_path) == 0:
+ return None
+ rest, _, extension = bytecode_path.rparition('.')
+ if not rest or extension.lower()[-3:-1] != '.py':
+ return bytecode_path
+
+ try:
+ source_path = source_from_cache(bytecode_path)
+ except (NotImplementedError, ValueError):
+ source_path = bytcode_path[-1:]
+
+ return source_path if _path_isfile(source_stats) else bytecode_path
-code_type = type(_wrap.__code__)
+def _verbose_message(message, *args):
+ """Print the message to stderr if -v/PYTHONVERBOSE is turned on."""
+ if sys.flags.verbose:
+ if not message.startswith(('#', 'import ')):
+ message = '# ' + message
+ print(message.format(*args), file=sys.stderr)
-# Finder/loader utility code ##################################################
def set_package(fxn):
"""Set __package__ on the returned module."""
- def wrapper(*args, **kwargs):
+ def set_package_wrapper(*args, **kwargs):
module = fxn(*args, **kwargs)
- if not hasattr(module, '__package__') or module.__package__ is None:
+ if getattr(module, '__package__', None) is None:
module.__package__ = module.__name__
if not hasattr(module, '__path__'):
module.__package__ = module.__package__.rpartition('.')[0]
return module
- _wrap(wrapper, fxn)
- return wrapper
+ _wrap(set_package_wrapper, fxn)
+ return set_package_wrapper
def set_loader(fxn):
"""Set __loader__ on the returned module."""
- def wrapper(self, *args, **kwargs):
+ def set_loader_wrapper(self, *args, **kwargs):
module = fxn(self, *args, **kwargs)
if not hasattr(module, '__loader__'):
module.__loader__ = self
return module
- _wrap(wrapper, fxn)
- return wrapper
+ _wrap(set_loader_wrapper, fxn)
+ return set_loader_wrapper
def module_for_loader(fxn):
@@ -120,31 +520,54 @@ def module_for_loader(fxn):
The decorated function is passed the module to use instead of the module
name. The module passed in to the function is either from sys.modules if
- it already exists or is a new module which has __name__ set and is inserted
- into sys.modules. If an exception is raised and the decorator created the
- module it is subsequently removed from sys.modules.
+ it already exists or is a new module. If the module is new, then __name__
+ is set the first argument to the method, __loader__ is set to self, and
+ __package__ is set accordingly (if self.is_package() is defined) will be set
+ before it is passed to the decorated function (if self.is_package() does
+ not work for the module it will be set post-load).
+
+ If an exception is raised and the decorator created the module it is
+ subsequently removed from sys.modules.
The decorator assumes that the decorated function takes the module name as
the second argument.
"""
- def decorated(self, fullname, *args, **kwargs):
+ def module_for_loader_wrapper(self, fullname, *args, **kwargs):
module = sys.modules.get(fullname)
- is_reload = bool(module)
+ is_reload = module is not None
if not is_reload:
# This must be done before open() is called as the 'io' module
# implicitly imports 'locale' and would otherwise trigger an
# infinite loop.
- module = imp.new_module(fullname)
+ module = new_module(fullname)
+ # This must be done before putting the module in sys.modules
+ # (otherwise an optimization shortcut in import.c becomes wrong)
+ module.__initializing__ = True
sys.modules[fullname] = module
+ module.__loader__ = self
+ try:
+ is_package = self.is_package(fullname)
+ except (ImportError, AttributeError):
+ pass
+ else:
+ if is_package:
+ module.__package__ = fullname
+ else:
+ module.__package__ = fullname.rpartition('.')[0]
+ else:
+ module.__initializing__ = True
try:
+ # If __package__ was not set above, __import__() will do it later.
return fxn(self, module, *args, **kwargs)
except:
if not is_reload:
del sys.modules[fullname]
raise
- _wrap(decorated, fxn)
- return decorated
+ finally:
+ module.__initializing__ = False
+ _wrap(module_for_loader_wrapper, fxn)
+ return module_for_loader_wrapper
def _check_name(method):
@@ -155,38 +578,51 @@ def _check_name(method):
compared against. If the comparison fails then ImportError is raised.
"""
- def inner(self, name, *args, **kwargs):
- if self._name != name:
- raise ImportError("loader cannot handle %s" % name)
+ def _check_name_wrapper(self, name=None, *args, **kwargs):
+ if name is None:
+ name = self.name
+ elif self.name != name:
+ raise ImportError("loader cannot handle %s" % name, name=name)
return method(self, name, *args, **kwargs)
- _wrap(inner, method)
- return inner
+ _wrap(_check_name_wrapper, method)
+ return _check_name_wrapper
def _requires_builtin(fxn):
"""Decorator to verify the named module is built-in."""
- def wrapper(self, fullname):
+ def _requires_builtin_wrapper(self, fullname):
if fullname not in sys.builtin_module_names:
- raise ImportError("{0} is not a built-in module".format(fullname))
+ raise ImportError("{} is not a built-in module".format(fullname),
+ name=fullname)
return fxn(self, fullname)
- _wrap(wrapper, fxn)
- return wrapper
+ _wrap(_requires_builtin_wrapper, fxn)
+ return _requires_builtin_wrapper
def _requires_frozen(fxn):
"""Decorator to verify the named module is frozen."""
- def wrapper(self, fullname):
- if not imp.is_frozen(fullname):
- raise ImportError("{0} is not a frozen module".format(fullname))
+ def _requires_frozen_wrapper(self, fullname):
+ if not _imp.is_frozen(fullname):
+ raise ImportError("{} is not a frozen module".format(fullname),
+ name=fullname)
return fxn(self, fullname)
- _wrap(wrapper, fxn)
- return wrapper
+ _wrap(_requires_frozen_wrapper, fxn)
+ return _requires_frozen_wrapper
+
+
+def _find_module_shim(self, fullname):
+ """Try to find a loader for the specified module by delegating to
+ self.find_loader()."""
+ # Call find_loader(). If it returns a string (indicating this
+ # is a namespace package portion), generate a warning and
+ # return None.
+ loader, portions = self.find_loader(fullname)
+ if loader is None and len(portions):
+ msg = "Not importing directory {}: missing __init__"
+ _warnings.warn(msg.format(portions[0]), ImportWarning)
+ return loader
-def _suffix_list(suffix_type):
- """Return a list of file suffixes based on the imp file type."""
- return [suffix[0] for suffix in imp.get_suffixes()
- if suffix[2] == suffix_type]
# Loaders #####################################################################
@@ -201,6 +637,10 @@ class BuiltinImporter:
"""
@classmethod
+ def module_repr(cls, module):
+ return "<module '{}' (built-in)>".format(module.__name__)
+
+ @classmethod
def find_module(cls, fullname, path=None):
"""Find the built-in module.
@@ -209,7 +649,7 @@ class BuiltinImporter:
"""
if path is not None:
return None
- return cls if imp.is_builtin(fullname) else None
+ return cls if _imp.is_builtin(fullname) else None
@classmethod
@set_package
@@ -219,7 +659,7 @@ class BuiltinImporter:
"""Load a built-in module."""
is_reload = fullname in sys.modules
try:
- return imp.init_builtin(fullname)
+ return _call_with_frames_removed(_imp.init_builtin, fullname)
except:
if not is_reload and fullname in sys.modules:
del sys.modules[fullname]
@@ -240,7 +680,7 @@ class BuiltinImporter:
@classmethod
@_requires_builtin
def is_package(cls, fullname):
- """Return None as built-in module are never packages."""
+ """Return False as built-in modules are never packages."""
return False
@@ -254,9 +694,13 @@ class FrozenImporter:
"""
@classmethod
+ def module_repr(cls, m):
+ return "<module '{}' (frozen)>".format(m.__name__)
+
+ @classmethod
def find_module(cls, fullname, path=None):
"""Find a frozen module."""
- return cls if imp.is_frozen(fullname) else None
+ return cls if _imp.is_frozen(fullname) else None
@classmethod
@set_package
@@ -266,7 +710,10 @@ class FrozenImporter:
"""Load a frozen module."""
is_reload = fullname in sys.modules
try:
- return imp.init_frozen(fullname)
+ m = _call_with_frames_removed(_imp.init_frozen, fullname)
+ # Let our own module_repr() method produce a suitable repr.
+ del m.__file__
+ return m
except:
if not is_reload and fullname in sys.modules:
del sys.modules[fullname]
@@ -276,7 +723,7 @@ class FrozenImporter:
@_requires_frozen
def get_code(cls, fullname):
"""Return the code object for the frozen module."""
- return imp.get_frozen_object(fullname)
+ return _imp.get_frozen_object(fullname)
@classmethod
@_requires_frozen
@@ -287,40 +734,117 @@ class FrozenImporter:
@classmethod
@_requires_frozen
def is_package(cls, fullname):
- """Return if the frozen module is a package."""
- return imp.is_frozen_package(fullname)
+ """Return True if the frozen module is a package."""
+ return _imp.is_frozen_package(fullname)
+
+
+class WindowsRegistryFinder:
+
+ """Meta path finder for modules declared in the Windows registry.
+ """
+
+ REGISTRY_KEY = (
+ "Software\\Python\\PythonCore\\{sys_version}"
+ "\\Modules\\{fullname}")
+ REGISTRY_KEY_DEBUG = (
+ "Software\\Python\\PythonCore\\{sys_version}"
+ "\\Modules\\{fullname}\\Debug")
+ DEBUG_BUILD = False # Changed in _setup()
+
+ @classmethod
+ def _open_registry(cls, key):
+ try:
+ return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key)
+ except WindowsError:
+ return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key)
+
+ @classmethod
+ def _search_registry(cls, fullname):
+ if cls.DEBUG_BUILD:
+ registry_key = cls.REGISTRY_KEY_DEBUG
+ else:
+ registry_key = cls.REGISTRY_KEY
+ key = registry_key.format(fullname=fullname,
+ sys_version=sys.version[:3])
+ try:
+ with cls._open_registry(key) as hkey:
+ filepath = _winreg.QueryValue(hkey, "")
+ except WindowsError:
+ return None
+ return filepath
+
+ @classmethod
+ def find_module(cls, fullname, path=None):
+ """Find module named in the registry."""
+ filepath = cls._search_registry(fullname)
+ if filepath is None:
+ return None
+ try:
+ _os.stat(filepath)
+ except OSError:
+ return None
+ for loader, suffixes, _ in _get_supported_file_loaders():
+ if filepath.endswith(tuple(suffixes)):
+ return loader(fullname, filepath)
class _LoaderBasics:
"""Base class of common code needed by both SourceLoader and
- _SourcelessFileLoader."""
+ SourcelessFileLoader."""
def is_package(self, fullname):
"""Concrete implementation of InspectLoader.is_package by checking if
the path returned by get_filename has a filename of '__init__.py'."""
- filename = self.get_filename(fullname).rpartition(path_sep)[2]
- return filename.rsplit('.', 1)[0] == '__init__'
+ filename = _path_split(self.get_filename(fullname))[1]
+ filename_base = filename.rsplit('.', 1)[0]
+ tail_name = fullname.rpartition('.')[2]
+ return filename_base == '__init__' and tail_name != '__init__'
- def _bytes_from_bytecode(self, fullname, data, source_mtime):
+ def _bytes_from_bytecode(self, fullname, data, bytecode_path, source_stats):
"""Return the marshalled bytes from bytecode, verifying the magic
- number and timestamp along the way.
+ number, timestamp and source size along the way.
- If source_mtime is None then skip the timestamp check.
+ If source_stats is None then skip the timestamp check.
"""
magic = data[:4]
raw_timestamp = data[4:8]
- if len(magic) != 4 or magic != imp.get_magic():
- raise ImportError("bad magic number in {}".format(fullname))
+ raw_size = data[8:12]
+ if magic != _MAGIC_BYTES:
+ msg = 'bad magic number in {!r}: {!r}'.format(fullname, magic)
+ raise ImportError(msg, name=fullname, path=bytecode_path)
elif len(raw_timestamp) != 4:
- raise EOFError("bad timestamp in {}".format(fullname))
- elif source_mtime is not None:
- if marshal._r_long(raw_timestamp) != source_mtime:
- raise ImportError("bytecode is stale for {}".format(fullname))
+ message = 'bad timestamp in {}'.format(fullname)
+ _verbose_message(message)
+ raise EOFError(message)
+ elif len(raw_size) != 4:
+ message = 'bad size in {}'.format(fullname)
+ _verbose_message(message)
+ raise EOFError(message)
+ if source_stats is not None:
+ try:
+ source_mtime = int(source_stats['mtime'])
+ except KeyError:
+ pass
+ else:
+ if _r_long(raw_timestamp) != source_mtime:
+ message = 'bytecode is stale for {}'.format(fullname)
+ _verbose_message(message)
+ raise ImportError(message, name=fullname,
+ path=bytecode_path)
+ try:
+ source_size = source_stats['size'] & 0xFFFFFFFF
+ except KeyError:
+ pass
+ else:
+ if _r_long(raw_size) != source_size:
+ raise ImportError(
+ "bytecode is stale for {}".format(fullname),
+ name=fullname, path=bytecode_path)
# Can't return the code object as errors from marshal loading need to
# propagate even when source is available.
- return data[8:]
+ return data[12:]
@module_for_loader
def _load_module(self, module, *, sourceless=False):
@@ -330,16 +854,19 @@ class _LoaderBasics:
code_object = self.get_code(name)
module.__file__ = self.get_filename(name)
if not sourceless:
- module.__cached__ = imp.cache_from_source(module.__file__)
+ try:
+ module.__cached__ = cache_from_source(module.__file__)
+ except NotImplementedError:
+ module.__cached__ = module.__file__
else:
module.__cached__ = module.__file__
module.__package__ = name
if self.is_package(name):
- module.__path__ = [module.__file__.rsplit(path_sep, 1)[0]]
+ module.__path__ = [_path_split(module.__file__)[0]]
else:
module.__package__ = module.__package__.rpartition('.')[0]
module.__loader__ = self
- exec(code_object, module.__dict__)
+ _call_with_frames_removed(exec, code_object, module.__dict__)
return module
@@ -348,11 +875,30 @@ class SourceLoader(_LoaderBasics):
def path_mtime(self, path):
"""Optional method that returns the modification time (an int) for the
specified path, where path is a str.
+ """
+ raise NotImplementedError
+
+ def path_stats(self, path):
+ """Optional method returning a metadata dict for the specified path
+ to by the path (str).
+ Possible keys:
+ - 'mtime' (mandatory) is the numeric timestamp of last source
+ code modification;
+ - 'size' (optional) is the size in bytes of the source code.
Implementing this method allows the loader to read bytecode files.
+ """
+ return {'mtime': self.path_mtime(path)}
+ def _cache_bytecode(self, source_path, cache_path, data):
+ """Optional method which writes data (bytes) to a file path (a str).
+
+ Implementing this method allows for the writing of bytecode files.
+
+ The source path is needed in order to correctly transfer permissions
"""
- raise NotImplementedError
+ # For backwards compatibility, we delegate to set_data()
+ return self.set_data(cache_path, data)
def set_data(self, path, data):
"""Optional method which writes data (bytes) to a file path (a str).
@@ -369,28 +915,42 @@ class SourceLoader(_LoaderBasics):
path = self.get_filename(fullname)
try:
source_bytes = self.get_data(path)
- except IOError:
- raise ImportError("source not available through get_data()")
- encoding = tokenize.detect_encoding(_io.BytesIO(source_bytes).readline)
+ except IOError as exc:
+ raise ImportError("source not available through get_data()",
+ name=fullname) from exc
+ readsource = _io.BytesIO(source_bytes).readline
+ try:
+ encoding = tokenize.detect_encoding(readsource)
+ except SyntaxError as exc:
+ raise ImportError("Failed to detect encoding",
+ name=fullname) from exc
newline_decoder = _io.IncrementalNewlineDecoder(None, True)
- return newline_decoder.decode(source_bytes.decode(encoding[0]))
+ try:
+ return newline_decoder.decode(source_bytes.decode(encoding[0]))
+ except UnicodeDecodeError as exc:
+ raise ImportError("Failed to decode source file",
+ name=fullname) from exc
def get_code(self, fullname):
"""Concrete implementation of InspectLoader.get_code.
- Reading of bytecode requires path_mtime to be implemented. To write
+ Reading of bytecode requires path_stats to be implemented. To write
bytecode, set_data must also be implemented.
"""
source_path = self.get_filename(fullname)
- bytecode_path = imp.cache_from_source(source_path)
source_mtime = None
- if bytecode_path is not None:
+ try:
+ bytecode_path = cache_from_source(source_path)
+ except NotImplementedError:
+ bytecode_path = None
+ else:
try:
- source_mtime = self.path_mtime(source_path)
+ st = self.path_stats(source_path)
except NotImplementedError:
pass
else:
+ source_mtime = int(st['mtime'])
try:
data = self.get_data(bytecode_path)
except IOError:
@@ -398,29 +958,37 @@ class SourceLoader(_LoaderBasics):
else:
try:
bytes_data = self._bytes_from_bytecode(fullname, data,
- source_mtime)
+ bytecode_path,
+ st)
except (ImportError, EOFError):
pass
else:
+ _verbose_message('{} matches {}', bytecode_path,
+ source_path)
found = marshal.loads(bytes_data)
- if isinstance(found, code_type):
+ if isinstance(found, _code_type):
+ _imp._fix_co_filename(found, source_path)
+ _verbose_message('code object from {}',
+ bytecode_path)
return found
else:
msg = "Non-code object in {}"
- raise ImportError(msg.format(bytecode_path))
+ raise ImportError(msg.format(bytecode_path),
+ name=fullname, path=bytecode_path)
source_bytes = self.get_data(source_path)
- code_object = compile(source_bytes, source_path, 'exec',
- dont_inherit=True)
+ code_object = _call_with_frames_removed(compile,
+ source_bytes, source_path, 'exec',
+ dont_inherit=True)
+ _verbose_message('code object from {}', source_path)
if (not sys.dont_write_bytecode and bytecode_path is not None and
- source_mtime is not None):
- # If e.g. Jython ever implements imp.cache_from_source to have
- # their own cached file format, this block of code will most likely
- # throw an exception.
- data = bytearray(imp.get_magic())
- data.extend(marshal._w_long(source_mtime))
+ source_mtime is not None):
+ data = bytearray(_MAGIC_BYTES)
+ data.extend(_w_long(source_mtime))
+ data.extend(_w_long(len(source_bytes)))
data.extend(marshal.dumps(code_object))
try:
- self.set_data(bytecode_path, data)
+ self._cache_bytecode(source_path, bytecode_path, data)
+ _verbose_message('wrote {!r}', bytecode_path)
except NotImplementedError:
pass
return code_object
@@ -436,7 +1004,7 @@ class SourceLoader(_LoaderBasics):
return self._load_module(fullname)
-class _FileLoader:
+class FileLoader:
"""Base file loader class which implements the loader protocol methods that
require file system usage."""
@@ -444,13 +1012,20 @@ class _FileLoader:
def __init__(self, fullname, path):
"""Cache the module name and the path to the file found by the
finder."""
- self._name = fullname
- self._path = path
+ self.name = fullname
+ self.path = path
+
+ @_check_name
+ def load_module(self, fullname):
+ """Load a module from a file."""
+ # Issue #14857: Avoid the zero-argument form so the implementation
+ # of that form can be updated without breaking the frozen module
+ return super(FileLoader, self).load_module(fullname)
@_check_name
def get_filename(self, fullname):
"""Return the path to the source file as found by the finder."""
- return self._path
+ return self.path
def get_data(self, path):
"""Return the data from path as raw bytes."""
@@ -458,52 +1033,56 @@ class _FileLoader:
return file.read()
-class _SourceFileLoader(_FileLoader, SourceLoader):
+class SourceFileLoader(FileLoader, SourceLoader):
"""Concrete implementation of SourceLoader using the file system."""
- def path_mtime(self, path):
- """Return the modification time for the path."""
- return int(_os.stat(path).st_mtime)
+ def path_stats(self, path):
+ """Return the metadata for the path."""
+ st = _os.stat(path)
+ return {'mtime': st.st_mtime, 'size': st.st_size}
- def set_data(self, path, data):
+ def _cache_bytecode(self, source_path, bytecode_path, data):
+ # Adapt between the two APIs
+ try:
+ mode = _os.stat(source_path).st_mode
+ except OSError:
+ mode = 0o666
+ # We always ensure write access so we can update cached files
+ # later even when the source files are read-only on Windows (#6074)
+ mode |= 0o200
+ return self.set_data(bytecode_path, data, _mode=mode)
+
+ def set_data(self, path, data, *, _mode=0o666):
"""Write bytes data to a file."""
- parent, _, filename = path.rpartition(path_sep)
+ parent, filename = _path_split(path)
path_parts = []
# Figure out what directories are missing.
while parent and not _path_isdir(parent):
- parent, _, part = parent.rpartition(path_sep)
+ parent, part = _path_split(parent)
path_parts.append(part)
# Create needed directories.
for part in reversed(path_parts):
parent = _path_join(parent, part)
try:
_os.mkdir(parent)
- except OSError as exc:
+ except FileExistsError:
# Probably another Python process already created the dir.
- if exc.errno == errno.EEXIST:
- continue
- else:
- raise
- except IOError as exc:
- # If can't get proper access, then just forget about writing
- # the data.
- if exc.errno == errno.EACCES:
- return
- else:
- raise
- try:
- with _io.FileIO(path, 'wb') as file:
- file.write(data)
- except IOError as exc:
- # Don't worry if you can't write bytecode.
- if exc.errno == errno.EACCES:
+ continue
+ except OSError as exc:
+ # Could be a permission error, read-only filesystem: just forget
+ # about writing the data.
+ _verbose_message('could not create {!r}: {!r}', parent, exc)
return
- else:
- raise
+ try:
+ _write_atomic(path, data, _mode)
+ _verbose_message('created {!r}', path)
+ except OSError as exc:
+ # Same as above: just don't write the bytecode.
+ _verbose_message('could not create {!r}: {!r}', path, exc)
-class _SourcelessFileLoader(_FileLoader, _LoaderBasics):
+class SourcelessFileLoader(FileLoader, _LoaderBasics):
"""Loader which handles sourceless file imports."""
@@ -513,19 +1092,25 @@ class _SourcelessFileLoader(_FileLoader, _LoaderBasics):
def get_code(self, fullname):
path = self.get_filename(fullname)
data = self.get_data(path)
- bytes_data = self._bytes_from_bytecode(fullname, data, None)
+ bytes_data = self._bytes_from_bytecode(fullname, data, path, None)
found = marshal.loads(bytes_data)
- if isinstance(found, code_type):
+ if isinstance(found, _code_type):
+ _verbose_message('code object from {!r}', path)
return found
else:
- raise ImportError("Non-code object in {}".format(path))
+ raise ImportError("Non-code object in {}".format(path),
+ name=fullname, path=path)
def get_source(self, fullname):
"""Return None as there is no source code."""
return None
-class _ExtensionFileLoader:
+# Filled in by _setup().
+EXTENSION_SUFFIXES = []
+
+
+class ExtensionFileLoader:
"""Loader for extension modules.
@@ -534,14 +1119,8 @@ class _ExtensionFileLoader:
"""
def __init__(self, name, path):
- """Initialize the loader.
-
- If is_pkg is True then an exception is raised as extension modules
- cannot be the __init__ module for an extension module.
-
- """
- self._name = name
- self._path = path
+ self.name = name
+ self.path = path
@_check_name
@set_package
@@ -550,297 +1129,525 @@ class _ExtensionFileLoader:
"""Load an extension module."""
is_reload = fullname in sys.modules
try:
- return imp.load_dynamic(fullname, self._path)
+ module = _call_with_frames_removed(_imp.load_dynamic,
+ fullname, self.path)
+ _verbose_message('extension module loaded from {!r}', self.path)
+ if self.is_package(fullname) and not hasattr(module, '__path__'):
+ module.__path__ = [_path_split(self.path)[0]]
+ return module
except:
if not is_reload and fullname in sys.modules:
del sys.modules[fullname]
raise
- @_check_name
def is_package(self, fullname):
- """Return False as an extension module can never be a package."""
- return False
+ """Return True if the extension module is a package."""
+ file_name = _path_split(self.path)[1]
+ return any(file_name == '__init__' + suffix
+ for suffix in EXTENSION_SUFFIXES)
- @_check_name
def get_code(self, fullname):
"""Return None as an extension module cannot create a code object."""
return None
- @_check_name
def get_source(self, fullname):
"""Return None as extension modules have no source code."""
return None
+class _NamespacePath:
+ """Represents a namespace package's path. It uses the module name
+ to find its parent module, and from there it looks up the parent's
+ __path__. When this changes, the module's own path is recomputed,
+ using path_finder. For top-leve modules, the parent module's path
+ is sys.path."""
+
+ def __init__(self, name, path, path_finder):
+ self._name = name
+ self._path = path
+ self._last_parent_path = tuple(self._get_parent_path())
+ self._path_finder = path_finder
+
+ def _find_parent_path_names(self):
+ """Returns a tuple of (parent-module-name, parent-path-attr-name)"""
+ parent, dot, me = self._name.rpartition('.')
+ if dot == '':
+ # This is a top-level module. sys.path contains the parent path.
+ return 'sys', 'path'
+ # Not a top-level module. parent-module.__path__ contains the
+ # parent path.
+ return parent, '__path__'
+
+ def _get_parent_path(self):
+ parent_module_name, path_attr_name = self._find_parent_path_names()
+ return getattr(sys.modules[parent_module_name], path_attr_name)
+
+ def _recalculate(self):
+ # If the parent's path has changed, recalculate _path
+ parent_path = tuple(self._get_parent_path()) # Make a copy
+ if parent_path != self._last_parent_path:
+ loader, new_path = self._path_finder(self._name, parent_path)
+ # Note that no changes are made if a loader is returned, but we
+ # do remember the new parent path
+ if loader is None:
+ self._path = new_path
+ self._last_parent_path = parent_path # Save the copy
+ return self._path
+
+ def __iter__(self):
+ return iter(self._recalculate())
+
+ def __len__(self):
+ return len(self._recalculate())
+
+ def __repr__(self):
+ return "_NamespacePath({!r})".format(self._path)
+
+ def __contains__(self, item):
+ return item in self._recalculate()
+
+ def append(self, item):
+ self._path.append(item)
+
+
+class NamespaceLoader:
+ def __init__(self, name, path, path_finder):
+ self._path = _NamespacePath(name, path, path_finder)
+
+ @classmethod
+ def module_repr(cls, module):
+ return "<module '{}' (namespace)>".format(module.__name__)
+
+ @module_for_loader
+ def load_module(self, module):
+ """Load a namespace module."""
+ _verbose_message('namespace module loaded with path {!r}', self._path)
+ module.__path__ = self._path
+ return module
+
+
# Finders #####################################################################
class PathFinder:
- """Meta path finder for sys.(path|path_hooks|path_importer_cache)."""
+ """Meta path finder for sys.path and package __path__ attributes."""
+
+ @classmethod
+ def invalidate_caches(cls):
+ """Call the invalidate_caches() method on all path entry finders
+ stored in sys.path_importer_caches (where implemented)."""
+ for finder in sys.path_importer_cache.values():
+ if hasattr(finder, 'invalidate_caches'):
+ finder.invalidate_caches()
@classmethod
- def _path_hooks(cls, path, hooks=None):
+ def _path_hooks(cls, path):
"""Search sequence of hooks for a finder for 'path'.
If 'hooks' is false then use sys.path_hooks.
"""
- if not hooks:
- hooks = sys.path_hooks
- for hook in hooks:
+ if not sys.path_hooks:
+ _warnings.warn('sys.path_hooks is empty', ImportWarning)
+ for hook in sys.path_hooks:
try:
return hook(path)
except ImportError:
continue
else:
- raise ImportError("no path hook found for {0}".format(path))
+ return None
@classmethod
- def _path_importer_cache(cls, path, default=None):
- """Get the finder for the path from sys.path_importer_cache.
-
- If the path is not in the cache, find the appropriate finder and cache
- it. If None is cached, get the default finder and cache that
- (if applicable).
+ def _path_importer_cache(cls, path):
+ """Get the finder for the path entry from sys.path_importer_cache.
- Because of NullImporter, some finder should be returned. The only
- explicit fail case is if None is cached but the path cannot be used for
- the default hook, for which ImportError is raised.
+ If the path entry is not in the cache, find the appropriate finder
+ and cache it. If no finder is available, store None.
"""
+ if path == '':
+ path = '.'
try:
finder = sys.path_importer_cache[path]
except KeyError:
finder = cls._path_hooks(path)
sys.path_importer_cache[path] = finder
- else:
- if finder is None and default:
- # Raises ImportError on failure.
- finder = default(path)
- sys.path_importer_cache[path] = finder
return finder
@classmethod
+ def _get_loader(cls, fullname, path):
+ """Find the loader or namespace_path for this module/package name."""
+ # If this ends up being a namespace package, namespace_path is
+ # the list of paths that will become its __path__
+ namespace_path = []
+ for entry in path:
+ finder = cls._path_importer_cache(entry)
+ if finder is not None:
+ if hasattr(finder, 'find_loader'):
+ loader, portions = finder.find_loader(fullname)
+ else:
+ loader = finder.find_module(fullname)
+ portions = []
+ if loader is not None:
+ # We found a loader: return it immediately.
+ return loader, namespace_path
+ # This is possibly part of a namespace package.
+ # Remember these path entries (if any) for when we
+ # create a namespace package, and continue iterating
+ # on path.
+ namespace_path.extend(portions)
+ else:
+ return None, namespace_path
+
+ @classmethod
def find_module(cls, fullname, path=None):
"""Find the module on sys.path or 'path' based on sys.path_hooks and
sys.path_importer_cache."""
- if not path:
+ if path is None:
path = sys.path
- for entry in path:
- try:
- finder = cls._path_importer_cache(entry)
- except ImportError:
- continue
- if finder:
- loader = finder.find_module(fullname)
- if loader:
- return loader
+ loader, namespace_path = cls._get_loader(fullname, path)
+ if loader is not None:
+ return loader
else:
- return None
+ if namespace_path:
+ # We found at least one namespace path. Return a
+ # loader which can create the namespace package.
+ return NamespaceLoader(fullname, namespace_path, cls._get_loader)
+ else:
+ return None
-class _FileFinder:
+class FileFinder:
"""File-based finder.
- Constructor takes a list of objects detailing what file extensions their
- loader supports along with whether it can be used for a package.
+ Interactions with the file system are cached for performance, being
+ refreshed when the directory the finder is handling has been modified.
"""
def __init__(self, path, *details):
- """Initialize with finder details."""
- packages = []
- modules = []
- for detail in details:
- modules.extend((suffix, detail.loader) for suffix in detail.suffixes)
- if detail.supports_packages:
- packages.extend((suffix, detail.loader)
- for suffix in detail.suffixes)
- self.packages = packages
- self.modules = modules
- self.path = path
-
- def find_module(self, fullname):
- """Try to find a loader for the specified module."""
+ """Initialize with the path to search on and a variable number of
+ 3-tuples containing the loader, file suffixes the loader recognizes,
+ and a boolean of whether the loader handles packages."""
+ loaders = []
+ for loader, suffixes in details:
+ loaders.extend((suffix, loader) for suffix in suffixes)
+ self._loaders = loaders
+ # Base (directory) path
+ self.path = path or '.'
+ self._path_mtime = -1
+ self._path_cache = set()
+ self._relaxed_path_cache = set()
+
+ def invalidate_caches(self):
+ """Invalidate the directory mtime."""
+ self._path_mtime = -1
+
+ find_module = _find_module_shim
+
+ def find_loader(self, fullname):
+ """Try to find a loader for the specified module, or the namespace
+ package portions. Returns (loader, list-of-portions)."""
+ is_namespace = False
tail_module = fullname.rpartition('.')[2]
- base_path = _path_join(self.path, tail_module)
- if _path_isdir(base_path) and _case_ok(self.path, tail_module):
- for suffix, loader in self.packages:
- init_filename = '__init__' + suffix
- full_path = _path_join(base_path, init_filename)
- if (_path_isfile(full_path) and
- _case_ok(base_path, init_filename)):
- return loader(fullname, full_path)
- else:
- msg = "Not importing directory {}: missing __init__"
- _warnings.warn(msg.format(base_path), ImportWarning)
- for suffix, loader in self.modules:
- mod_filename = tail_module + suffix
- full_path = _path_join(self.path, mod_filename)
- if _path_isfile(full_path) and _case_ok(self.path, mod_filename):
- return loader(fullname, full_path)
- return None
-
-class _SourceFinderDetails:
-
- loader = _SourceFileLoader
- supports_packages = True
-
- def __init__(self):
- self.suffixes = _suffix_list(imp.PY_SOURCE)
-
-class _SourcelessFinderDetails:
-
- loader = _SourcelessFileLoader
- supports_packages = True
+ try:
+ mtime = _os.stat(self.path).st_mtime
+ except OSError:
+ mtime = -1
+ if mtime != self._path_mtime:
+ self._fill_cache()
+ self._path_mtime = mtime
+ # tail_module keeps the original casing, for __file__ and friends
+ if _relax_case():
+ cache = self._relaxed_path_cache
+ cache_module = tail_module.lower()
+ else:
+ cache = self._path_cache
+ cache_module = tail_module
+ # Check if the module is the name of a directory (and thus a package).
+ if cache_module in cache:
+ base_path = _path_join(self.path, tail_module)
+ if _path_isdir(base_path):
+ for suffix, loader in self._loaders:
+ init_filename = '__init__' + suffix
+ full_path = _path_join(base_path, init_filename)
+ if _path_isfile(full_path):
+ return (loader(fullname, full_path), [base_path])
+ else:
+ # A namespace package, return the path if we don't also
+ # find a module in the next section.
+ is_namespace = True
+ # Check for a file w/ a proper suffix exists.
+ for suffix, loader in self._loaders:
+ if cache_module + suffix in cache:
+ full_path = _path_join(self.path, tail_module + suffix)
+ if _path_isfile(full_path):
+ return (loader(fullname, full_path), [])
+ if is_namespace:
+ return (None, [base_path])
+ return (None, [])
+
+ def _fill_cache(self):
+ """Fill the cache of potential modules and packages for this directory."""
+ path = self.path
+ try:
+ contents = _os.listdir(path)
+ except FileNotFoundError:
+ # Directory has been removed since last import
+ contents = []
+ # We store two cached versions, to handle runtime changes of the
+ # PYTHONCASEOK environment variable.
+ if not sys.platform.startswith('win'):
+ self._path_cache = set(contents)
+ else:
+ # Windows users can import modules with case-insensitive file
+ # suffixes (for legacy reasons). Make the suffix lowercase here
+ # so it's done once instead of for every import. This is safe as
+ # the specified suffixes to check against are always specified in a
+ # case-sensitive manner.
+ lower_suffix_contents = set()
+ for item in contents:
+ name, dot, suffix = item.partition('.')
+ if dot:
+ new_name = '{}.{}'.format(name, suffix.lower())
+ else:
+ new_name = name
+ lower_suffix_contents.add(new_name)
+ self._path_cache = lower_suffix_contents
+ if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS):
+ self._relaxed_path_cache = set(fn.lower() for fn in contents)
- def __init__(self):
- self.suffixes = _suffix_list(imp.PY_COMPILED)
+ @classmethod
+ def path_hook(cls, *loader_details):
+ """A class method which returns a closure to use on sys.path_hook
+ which will return an instance using the specified loaders and the path
+ called on the closure.
+ If the path called on the closure is not a directory, ImportError is
+ raised.
-class _ExtensionFinderDetails:
+ """
+ def path_hook_for_FileFinder(path):
+ """Path hook for importlib.machinery.FileFinder."""
+ if not _path_isdir(path):
+ raise ImportError("only directories are supported", path=path)
+ return cls(path, *loader_details)
- loader = _ExtensionFileLoader
- supports_packages = False
+ return path_hook_for_FileFinder
- def __init__(self):
- self.suffixes = _suffix_list(imp.C_EXTENSION)
+ def __repr__(self):
+ return "FileFinder(%r)" % (self.path,)
# Import itself ###############################################################
-def _file_path_hook(path):
- """If the path is a directory, return a file-based finder."""
- if _path_isdir(path):
- return _FileFinder(path, _ExtensionFinderDetails(),
- _SourceFinderDetails(),
- _SourcelessFinderDetails())
- else:
- raise ImportError("only directories are supported")
+class _ImportLockContext:
+ """Context manager for the import lock."""
-_DEFAULT_PATH_HOOK = _file_path_hook
+ def __enter__(self):
+ """Acquire the import lock."""
+ _imp.acquire_lock()
-class _DefaultPathFinder(PathFinder):
+ def __exit__(self, exc_type, exc_value, exc_traceback):
+ """Release the import lock regardless of any raised exceptions."""
+ _imp.release_lock()
- """Subclass of PathFinder that implements implicit semantics for
- __import__."""
- @classmethod
- def _path_hooks(cls, path):
- """Search sys.path_hooks as well as implicit path hooks."""
- try:
- return super()._path_hooks(path)
- except ImportError:
- implicit_hooks = [_DEFAULT_PATH_HOOK, imp.NullImporter]
- return super()._path_hooks(path, implicit_hooks)
+def _resolve_name(name, package, level):
+ """Resolve a relative module name to an absolute one."""
+ bits = package.rsplit('.', level - 1)
+ if len(bits) < level:
+ raise ValueError('attempted relative import beyond top-level package')
+ base = bits[0]
+ return '{}.{}'.format(base, name) if name else base
- @classmethod
- def _path_importer_cache(cls, path):
- """Use the default path hook when None is stored in
- sys.path_importer_cache."""
- return super()._path_importer_cache(path, _DEFAULT_PATH_HOOK)
+def _find_module(name, path):
+ """Find a module's loader."""
+ if not sys.meta_path:
+ _warnings.warn('sys.meta_path is empty', ImportWarning)
+ for finder in sys.meta_path:
+ with _ImportLockContext():
+ loader = finder.find_module(name, path)
+ if loader is not None:
+ # The parent import may have already imported this module.
+ if name not in sys.modules:
+ return loader
+ else:
+ return sys.modules[name].__loader__
+ else:
+ return None
-class _ImportLockContext:
- """Context manager for the import lock."""
+def _sanity_check(name, package, level):
+ """Verify arguments are "sane"."""
+ if not isinstance(name, str):
+ raise TypeError("module name must be str, not {}".format(type(name)))
+ if level < 0:
+ raise ValueError('level must be >= 0')
+ if package:
+ if not isinstance(package, str):
+ raise TypeError("__package__ not set to a string")
+ elif package not in sys.modules:
+ msg = ("Parent module {!r} not loaded, cannot perform relative "
+ "import")
+ raise SystemError(msg.format(package))
+ if not name and level == 0:
+ raise ValueError("Empty module name")
- def __enter__(self):
- """Acquire the import lock."""
- imp.acquire_lock()
- def __exit__(self, exc_type, exc_value, exc_traceback):
- """Release the import lock regardless of any raised exceptions."""
- imp.release_lock()
+_ERR_MSG = 'No module named {!r}'
+def _find_and_load_unlocked(name, import_):
+ path = None
+ parent = name.rpartition('.')[0]
+ if parent:
+ if parent not in sys.modules:
+ _call_with_frames_removed(import_, parent)
+ # Crazy side-effects!
+ if name in sys.modules:
+ return sys.modules[name]
+ # Backwards-compatibility; be nicer to skip the dict lookup.
+ parent_module = sys.modules[parent]
+ try:
+ path = parent_module.__path__
+ except AttributeError:
+ msg = (_ERR_MSG + '; {} is not a package').format(name, parent)
+ raise ImportError(msg, name=name)
+ loader = _find_module(name, path)
+ if loader is None:
+ exc = ImportError(_ERR_MSG.format(name), name=name)
+ # TODO(brett): switch to a proper ModuleNotFound exception in Python
+ # 3.4.
+ exc._not_found = True
+ raise exc
+ elif name not in sys.modules:
+ # The parent import may have already imported this module.
+ loader.load_module(name)
+ _verbose_message('import {!r} # {!r}', name, loader)
+ # Backwards-compatibility; be nicer to skip the dict lookup.
+ module = sys.modules[name]
+ if parent:
+ # Set the module as an attribute on its parent.
+ parent_module = sys.modules[parent]
+ setattr(parent_module, name.rpartition('.')[2], module)
+ # Set __package__ if the loader did not.
+ if getattr(module, '__package__', None) is None:
+ try:
+ module.__package__ = module.__name__
+ if not hasattr(module, '__path__'):
+ module.__package__ = module.__package__.rpartition('.')[0]
+ except AttributeError:
+ pass
+ # Set loader if need be.
+ if not hasattr(module, '__loader__'):
+ try:
+ module.__loader__ = loader
+ except AttributeError:
+ pass
+ return module
-_IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder]
-_ERR_MSG = 'No module named {}'
+def _find_and_load(name, import_):
+ """Find and load the module, and release the import lock."""
+ try:
+ lock = _get_module_lock(name)
+ finally:
+ _imp.release_lock()
+ lock.acquire()
+ try:
+ return _find_and_load_unlocked(name, import_)
+ finally:
+ lock.release()
+
def _gcd_import(name, package=None, level=0):
"""Import and return the module based on its name, the package the call is
being made from, and the level adjustment.
This function represents the greatest common denominator of functionality
- between import_module and __import__. This includes settting __package__ if
+ between import_module and __import__. This includes setting __package__ if
the loader did not.
"""
- if package:
- if not hasattr(package, 'rindex'):
- raise ValueError("__package__ not set to a string")
- elif package not in sys.modules:
- msg = ("Parent module {0!r} not loaded, cannot perform relative "
- "import")
- raise SystemError(msg.format(package))
- if not name and level == 0:
- raise ValueError("Empty module name")
+ _sanity_check(name, package, level)
if level > 0:
- dot = len(package)
- for x in range(level, 1, -1):
- try:
- dot = package.rindex('.', 0, dot)
- except ValueError:
- raise ValueError("attempted relative import beyond "
- "top-level package")
- if name:
- name = "{0}.{1}".format(package[:dot], name)
- else:
- name = package[:dot]
- with _ImportLockContext():
- try:
- module = sys.modules[name]
- if module is None:
- message = ("import of {} halted; "
- "None in sys.modules".format(name))
- raise ImportError(message)
- return module
- except KeyError:
- pass
- parent = name.rpartition('.')[0]
- path = None
- if parent:
- if parent not in sys.modules:
- _gcd_import(parent)
- # Backwards-compatibility; be nicer to skip the dict lookup.
- parent_module = sys.modules[parent]
- try:
- path = parent_module.__path__
- except AttributeError:
- msg = (_ERR_MSG + '; {} is not a package').format(name, parent)
- raise ImportError(msg)
- meta_path = sys.meta_path + _IMPLICIT_META_PATH
- for finder in meta_path:
- loader = finder.find_module(name, path)
- if loader is not None:
- # The parent import may have already imported this module.
- if name not in sys.modules:
- loader.load_module(name)
- break
- else:
- raise ImportError(_ERR_MSG.format(name))
- # Backwards-compatibility; be nicer to skip the dict lookup.
- module = sys.modules[name]
- if parent:
- # Set the module as an attribute on its parent.
- setattr(parent_module, name.rpartition('.')[2], module)
- # Set __package__ if the loader did not.
- if not hasattr(module, '__package__') or module.__package__ is None:
- # Watch out for what comes out of sys.modules to not be a module,
- # e.g. an int.
- try:
- module.__package__ = module.__name__
- if not hasattr(module, '__path__'):
- module.__package__ = module.__package__.rpartition('.')[0]
- except AttributeError:
- pass
- return module
+ name = _resolve_name(name, package, level)
+ _imp.acquire_lock()
+ if name not in sys.modules:
+ return _find_and_load(name, _gcd_import)
+ module = sys.modules[name]
+ if module is None:
+ _imp.release_lock()
+ message = ("import of {} halted; "
+ "None in sys.modules".format(name))
+ raise ImportError(message, name=name)
+ _lock_unlock_module(name)
+ return module
+
+def _handle_fromlist(module, fromlist, import_):
+ """Figure out what __import__ should return.
+
+ The import_ parameter is a callable which takes the name of module to
+ import. It is required to decouple the function from assuming importlib's
+ import implementation is desired.
+
+ """
+ # The hell that is fromlist ...
+ # If a package was imported, try to import stuff from fromlist.
+ if hasattr(module, '__path__'):
+ if '*' in fromlist:
+ fromlist = list(fromlist)
+ fromlist.remove('*')
+ if hasattr(module, '__all__'):
+ fromlist.extend(module.__all__)
+ for x in fromlist:
+ if not hasattr(module, x):
+ from_name = '{}.{}'.format(module.__name__, x)
+ try:
+ _call_with_frames_removed(import_, from_name)
+ except ImportError as exc:
+ # Backwards-compatibility dictates we ignore failed
+ # imports triggered by fromlist for modules that don't
+ # exist.
+ # TODO(brett): In Python 3.4, have import raise
+ # ModuleNotFound and catch that.
+ if getattr(exc, '_not_found', False):
+ if exc.name == from_name:
+ continue
+ raise
+ return module
+
+
+def _calc___package__(globals):
+ """Calculate what __package__ should be.
+
+ __package__ is not guaranteed to be defined or could be set to None
+ to represent that its proper value is unknown.
+
+ """
+ package = globals.get('__package__')
+ if package is None:
+ package = globals['__name__']
+ if '__path__' not in globals:
+ package = package.rpartition('.')[0]
+ return package
-def __import__(name, globals={}, locals={}, fromlist=[], level=0):
+def _get_supported_file_loaders():
+ """Returns a list of file-based module loaders.
+
+ Each item is a tuple (loader, suffixes, allow_packages).
+ """
+ extensions = ExtensionFileLoader, _imp.extension_suffixes()
+ source = SourceFileLoader, SOURCE_SUFFIXES
+ bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
+ return [extensions, source, bytecode]
+
+
+def __import__(name, globals=None, locals=None, fromlist=(), level=0):
"""Import a module.
The 'globals' argument is used to infer where the import is occuring from
@@ -851,40 +1658,112 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0):
import (e.g. ``from ..pkg import mod`` would have a 'level' of 2).
"""
- if not hasattr(name, 'rpartition'):
- raise TypeError("module name must be str, not {}".format(type(name)))
if level == 0:
module = _gcd_import(name)
else:
- # __package__ is not guaranteed to be defined or could be set to None
- # to represent that it's proper value is unknown
- package = globals.get('__package__')
- if package is None:
- package = globals['__name__']
- if '__path__' not in globals:
- package = package.rpartition('.')[0]
+ globals_ = globals if globals is not None else {}
+ package = _calc___package__(globals_)
module = _gcd_import(name, package, level)
- # The hell that is fromlist ...
if not fromlist:
# Return up to the first dot in 'name'. This is complicated by the fact
# that 'name' may be relative.
if level == 0:
- return sys.modules[name.partition('.')[0]]
+ return _gcd_import(name.partition('.')[0])
elif not name:
return module
else:
+ # Figure out where to slice the module's name up to the first dot
+ # in 'name'.
cut_off = len(name) - len(name.partition('.')[0])
- return sys.modules[module.__name__[:-cut_off]]
+ # Slice end needs to be positive to alleviate need to special-case
+ # when ``'.' not in name``.
+ return sys.modules[module.__name__[:len(module.__name__)-cut_off]]
else:
- # If a package was imported, try to import stuff from fromlist.
- if hasattr(module, '__path__'):
- if '*' in fromlist and hasattr(module, '__all__'):
- fromlist = list(fromlist)
- fromlist.remove('*')
- fromlist.extend(module.__all__)
- for x in (y for y in fromlist if not hasattr(module,y)):
- try:
- _gcd_import('{0}.{1}'.format(module.__name__, x))
- except ImportError:
- pass
- return module
+ return _handle_fromlist(module, fromlist, _gcd_import)
+
+
+
+def _setup(sys_module, _imp_module):
+ """Setup importlib by importing needed built-in modules and injecting them
+ into the global namespace.
+
+ As sys is needed for sys.modules access and _imp is needed to load built-in
+ modules, those two modules must be explicitly passed in.
+
+ """
+ global _imp, sys, BYTECODE_SUFFIXES
+ _imp = _imp_module
+ sys = sys_module
+
+ if sys.flags.optimize:
+ BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES
+ else:
+ BYTECODE_SUFFIXES = DEBUG_BYTECODE_SUFFIXES
+
+ for module in (_imp, sys):
+ if not hasattr(module, '__loader__'):
+ module.__loader__ = BuiltinImporter
+
+ self_module = sys.modules[__name__]
+ for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'):
+ if builtin_name not in sys.modules:
+ builtin_module = BuiltinImporter.load_module(builtin_name)
+ else:
+ builtin_module = sys.modules[builtin_name]
+ setattr(self_module, builtin_name, builtin_module)
+
+ os_details = ('posix', ['/']), ('nt', ['\\', '/']), ('os2', ['\\', '/'])
+ for builtin_os, path_separators in os_details:
+ # Assumption made in _path_join()
+ assert all(len(sep) == 1 for sep in path_separators)
+ path_sep = path_separators[0]
+ if builtin_os in sys.modules:
+ os_module = sys.modules[builtin_os]
+ break
+ else:
+ try:
+ os_module = BuiltinImporter.load_module(builtin_os)
+ # TODO: rip out os2 code after 3.3 is released as per PEP 11
+ if builtin_os == 'os2' and 'EMX GCC' in sys.version:
+ path_sep = path_separators[1]
+ break
+ except ImportError:
+ continue
+ else:
+ raise ImportError('importlib requires posix or nt')
+
+ try:
+ thread_module = BuiltinImporter.load_module('_thread')
+ except ImportError:
+ # Python was built without threads
+ thread_module = None
+ weakref_module = BuiltinImporter.load_module('_weakref')
+
+ if builtin_os == 'nt':
+ winreg_module = BuiltinImporter.load_module('winreg')
+ setattr(self_module, '_winreg', winreg_module)
+
+ setattr(self_module, '_os', os_module)
+ setattr(self_module, '_thread', thread_module)
+ setattr(self_module, '_weakref', weakref_module)
+ setattr(self_module, 'path_sep', path_sep)
+ setattr(self_module, 'path_separators', set(path_separators))
+ # Constants
+ setattr(self_module, '_relax_case', _make_relax_case())
+ EXTENSION_SUFFIXES.extend(_imp.extension_suffixes())
+ if builtin_os == 'nt':
+ SOURCE_SUFFIXES.append('.pyw')
+ if '_d.pyd' in EXTENSION_SUFFIXES:
+ WindowsRegistryFinder.DEBUG_BUILD = True
+
+
+def _install(sys_module, _imp_module):
+ """Install importlib as the implementation of import."""
+ _setup(sys_module, _imp_module)
+ supported_loaders = _get_supported_file_loaders()
+ sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)])
+ sys.meta_path.append(BuiltinImporter)
+ sys.meta_path.append(FrozenImporter)
+ if _os.__name__ == 'nt':
+ sys.meta_path.append(WindowsRegistryFinder)
+ sys.meta_path.append(PathFinder)
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
index fa343f8..387567a 100644
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -1,44 +1,109 @@
"""Abstract base classes related to import."""
from . import _bootstrap
from . import machinery
-from . import util
+try:
+ import _frozen_importlib
+except ImportError as exc:
+ if exc.name != '_frozen_importlib':
+ raise
+ _frozen_importlib = None
import abc
import imp
-import io
import marshal
-import os.path
import sys
import tokenize
-import types
import warnings
-class Loader(metaclass=abc.ABCMeta):
+def _register(abstract_cls, *classes):
+ for cls in classes:
+ abstract_cls.register(cls)
+ if _frozen_importlib is not None:
+ frozen_cls = getattr(_frozen_importlib, cls.__name__)
+ abstract_cls.register(frozen_cls)
- """Abstract base class for import loaders."""
+
+class Finder(metaclass=abc.ABCMeta):
+
+ """Legacy abstract base class for import finders.
+
+ It may be subclassed for compatibility with legacy third party
+ reimplementations of the import system. Otherwise, finder
+ implementations should derive from the more specific MetaPathFinder
+ or PathEntryFinder ABCs.
+ """
@abc.abstractmethod
- def load_module(self, fullname):
- """Abstract method which when implemented should load a module.
- The fullname is a str."""
+ def find_module(self, fullname, path=None):
+ """An abstract method that should find a module.
+ The fullname is a str and the optional path is a str or None.
+ Returns a Loader object.
+ """
raise NotImplementedError
-class Finder(metaclass=abc.ABCMeta):
+class MetaPathFinder(Finder):
- """Abstract base class for import finders."""
+ """Abstract base class for import finders on sys.meta_path."""
@abc.abstractmethod
- def find_module(self, fullname, path=None):
- """Abstract method which when implemented should find a module.
- The fullname is a str and the optional path is a str or None.
+ def find_module(self, fullname, path):
+ """Abstract method which, when implemented, should find a module.
+ The fullname is a str and the path is a str or None.
Returns a Loader object.
"""
raise NotImplementedError
-Finder.register(machinery.BuiltinImporter)
-Finder.register(machinery.FrozenImporter)
-Finder.register(machinery.PathFinder)
+ def invalidate_caches(self):
+ """An optional method for clearing the finder's cache, if any.
+ This method is used by importlib.invalidate_caches().
+ """
+ return NotImplemented
+
+_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter,
+ machinery.PathFinder, machinery.WindowsRegistryFinder)
+
+
+class PathEntryFinder(Finder):
+
+ """Abstract base class for path entry finders used by PathFinder."""
+
+ @abc.abstractmethod
+ def find_loader(self, fullname):
+ """Abstract method which, when implemented, returns a module loader.
+ The fullname is a str. Returns a 2-tuple of (Loader, portion) where
+ portion is a sequence of file system locations contributing to part of
+ a namespace package. The sequence may be empty and the loader may be
+ None.
+ """
+ raise NotImplementedError
+
+ find_module = _bootstrap._find_module_shim
+
+ def invalidate_caches(self):
+ """An optional method for clearing the finder's cache, if any.
+ This method is used by PathFinder.invalidate_caches().
+ """
+ return NotImplemented
+
+_register(PathEntryFinder, machinery.FileFinder)
+
+
+class Loader(metaclass=abc.ABCMeta):
+
+ """Abstract base class for import loaders."""
+
+ @abc.abstractmethod
+ def load_module(self, fullname):
+ """Abstract method which when implemented should load a module.
+ The fullname is a str."""
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def module_repr(self, module):
+ """Abstract method which when implemented calculates and returns the
+ given module's repr."""
+ raise NotImplementedError
class ResourceLoader(Loader):
@@ -84,8 +149,8 @@ class InspectLoader(Loader):
module. The fullname is a str. Returns a str."""
raise NotImplementedError
-InspectLoader.register(machinery.BuiltinImporter)
-InspectLoader.register(machinery.FrozenImporter)
+_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
+ machinery.ExtensionFileLoader)
class ExecutionLoader(InspectLoader):
@@ -104,6 +169,15 @@ class ExecutionLoader(InspectLoader):
raise NotImplementedError
+class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader):
+
+ """Abstract base class partially implementing the ResourceLoader and
+ ExecutionLoader ABCs."""
+
+_register(FileLoader, machinery.SourceFileLoader,
+ machinery.SourcelessFileLoader)
+
+
class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
"""Abstract base class for loading source code (and optionally any
@@ -123,7 +197,20 @@ class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
def path_mtime(self, path):
"""Return the (int) modification time for the path (str)."""
- raise NotImplementedError
+ if self.path_stats.__func__ is SourceLoader.path_stats:
+ raise NotImplementedError
+ return int(self.path_stats(path)['mtime'])
+
+ def path_stats(self, path):
+ """Return a metadata dict for the source pointed to by the path (str).
+ Possible keys:
+ - 'mtime' (mandatory) is the numeric timestamp of last source
+ code modification;
+ - 'size' (optional) is the size in bytes of the source code.
+ """
+ if self.path_mtime.__func__ is SourceLoader.path_mtime:
+ raise NotImplementedError
+ return {'mtime': self.path_mtime(path)}
def set_data(self, path, data):
"""Write the bytes to the path (if possible).
@@ -137,6 +224,7 @@ class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader):
"""
raise NotImplementedError
+_register(SourceLoader, machinery.SourceFileLoader)
class PyLoader(SourceLoader):
@@ -195,10 +283,10 @@ class PyLoader(SourceLoader):
"use SourceLoader instead. "
"See the importlib documentation on how to be "
"compatible with Python 3.1 onwards.",
- PendingDeprecationWarning)
+ DeprecationWarning)
path = self.source_path(fullname)
if path is None:
- raise ImportError
+ raise ImportError(name=fullname)
else:
return path
@@ -226,7 +314,7 @@ class PyPycLoader(PyLoader):
if path is not None:
return path
raise ImportError("no source or bytecode path available for "
- "{0!r}".format(fullname))
+ "{0!r}".format(fullname), name=fullname)
def get_code(self, fullname):
"""Get a code object from source or bytecode."""
@@ -234,7 +322,7 @@ class PyPycLoader(PyLoader):
"removal in Python 3.4; use SourceLoader instead. "
"If Python 3.1 compatibility is required, see the "
"latest documentation for PyLoader.",
- PendingDeprecationWarning)
+ DeprecationWarning)
source_timestamp = self.source_mtime(fullname)
# Try to use bytecode if it is available.
bytecode_path = self.bytecode_path(fullname)
@@ -243,20 +331,30 @@ class PyPycLoader(PyLoader):
try:
magic = data[:4]
if len(magic) < 4:
- raise ImportError("bad magic number in {}".format(fullname))
+ raise ImportError(
+ "bad magic number in {}".format(fullname),
+ name=fullname, path=bytecode_path)
raw_timestamp = data[4:8]
if len(raw_timestamp) < 4:
raise EOFError("bad timestamp in {}".format(fullname))
- pyc_timestamp = marshal._r_long(raw_timestamp)
- bytecode = data[8:]
+ pyc_timestamp = _bootstrap._r_long(raw_timestamp)
+ raw_source_size = data[8:12]
+ if len(raw_source_size) != 4:
+ raise EOFError("bad file size in {}".format(fullname))
+ # Source size is unused as the ABC does not provide a way to
+ # get the size of the source ahead of reading it.
+ bytecode = data[12:]
# Verify that the magic number is valid.
if imp.get_magic() != magic:
- raise ImportError("bad magic number in {}".format(fullname))
+ raise ImportError(
+ "bad magic number in {}".format(fullname),
+ name=fullname, path=bytecode_path)
# Verify that the bytecode is not stale (only matters when
# there is source to fall back on.
if source_timestamp:
if pyc_timestamp < source_timestamp:
- raise ImportError("bytecode is stale")
+ raise ImportError("bytecode is stale", name=fullname,
+ path=bytecode_path)
except (ImportError, EOFError):
# If source is available give it a shot.
if source_timestamp is not None:
@@ -268,18 +366,20 @@ class PyPycLoader(PyLoader):
return marshal.loads(bytecode)
elif source_timestamp is None:
raise ImportError("no source or bytecode available to create code "
- "object for {0!r}".format(fullname))
+ "object for {0!r}".format(fullname),
+ name=fullname)
# Use the source.
source_path = self.source_path(fullname)
if source_path is None:
message = "a source path must exist to load {0}".format(fullname)
- raise ImportError(message)
+ raise ImportError(message, name=fullname)
source = self.get_data(source_path)
code_object = compile(source, source_path, 'exec', dont_inherit=True)
# Generate bytecode and write it out.
if not sys.dont_write_bytecode:
data = bytearray(imp.get_magic())
- data.extend(marshal._w_long(source_timestamp))
+ data.extend(_bootstrap._w_long(source_timestamp))
+ data.extend(_bootstrap._w_long(len(source) & 0xFFFFFFFF))
data.extend(marshal.dumps(code_object))
self.write_bytecode(fullname, data)
return code_object
diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
index 5197744..ff826e4 100644
--- a/Lib/importlib/machinery.py
+++ b/Lib/importlib/machinery.py
@@ -1,5 +1,20 @@
"""The machinery of importlib: finders, loaders, hooks, etc."""
+import _imp
+
+from ._bootstrap import (SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES,
+ OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES,
+ EXTENSION_SUFFIXES)
from ._bootstrap import BuiltinImporter
from ._bootstrap import FrozenImporter
+from ._bootstrap import WindowsRegistryFinder
from ._bootstrap import PathFinder
+from ._bootstrap import FileFinder
+from ._bootstrap import SourceFileLoader
+from ._bootstrap import SourcelessFileLoader
+from ._bootstrap import ExtensionFileLoader
+
+
+def all_suffixes():
+ """Returns a list of all recognized module suffixes for this process"""
+ return SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES
diff --git a/Lib/importlib/test/__main__.py b/Lib/importlib/test/__main__.py
deleted file mode 100644
index decc53d..0000000
--- a/Lib/importlib/test/__main__.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""Run importlib's test suite.
-
-Specifying the ``--builtin`` flag will run tests, where applicable, with
-builtins.__import__ instead of importlib.__import__.
-
-"""
-import importlib
-from importlib.test.import_ import util
-import os.path
-from test.support import run_unittest
-import sys
-import unittest
-
-
-def test_main():
- if '__pycache__' in __file__:
- parts = __file__.split(os.path.sep)
- start_dir = sep.join(parts[:-2])
- else:
- start_dir = os.path.dirname(__file__)
- top_dir = os.path.dirname(os.path.dirname(start_dir))
- test_loader = unittest.TestLoader()
- if '--builtin' in sys.argv:
- util.using___import__ = True
- run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir))
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py
deleted file mode 100644
index b5de6c6..0000000
--- a/Lib/importlib/test/benchmark.py
+++ /dev/null
@@ -1,172 +0,0 @@
-"""Benchmark some basic import use-cases.
-
-The assumption is made that this benchmark is run in a fresh interpreter and
-thus has no external changes made to import-related attributes in sys.
-
-"""
-from . import util
-from .source import util as source_util
-import decimal
-import imp
-import importlib
-import os
-import py_compile
-import sys
-import timeit
-
-
-def bench(name, cleanup=lambda: None, *, seconds=1, repeat=3):
- """Bench the given statement as many times as necessary until total
- executions take one second."""
- stmt = "__import__({!r})".format(name)
- timer = timeit.Timer(stmt)
- for x in range(repeat):
- total_time = 0
- count = 0
- while total_time < seconds:
- try:
- total_time += timer.timeit(1)
- finally:
- cleanup()
- count += 1
- else:
- # One execution too far
- if total_time > seconds:
- count -= 1
- yield count // seconds
-
-def from_cache(seconds, repeat):
- """sys.modules"""
- name = '<benchmark import>'
- module = imp.new_module(name)
- module.__file__ = '<test>'
- module.__package__ = ''
- with util.uncache(name):
- sys.modules[name] = module
- for result in bench(name, repeat=repeat, seconds=seconds):
- yield result
-
-
-def builtin_mod(seconds, repeat):
- """Built-in module"""
- name = 'errno'
- if name in sys.modules:
- del sys.modules[name]
- # Relying on built-in importer being implicit.
- for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
- seconds=seconds):
- yield result
-
-
-def source_wo_bytecode(seconds, repeat):
- """Source w/o bytecode: simple"""
- sys.dont_write_bytecode = True
- try:
- name = '__importlib_test_benchmark__'
- # Clears out sys.modules and puts an entry at the front of sys.path.
- with source_util.create_modules(name) as mapping:
- assert not os.path.exists(imp.cache_from_source(mapping[name]))
- for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
- seconds=seconds):
- yield result
- finally:
- sys.dont_write_bytecode = False
-
-
-def decimal_wo_bytecode(seconds, repeat):
- """Source w/o bytecode: decimal"""
- name = 'decimal'
- decimal_bytecode = imp.cache_from_source(decimal.__file__)
- if os.path.exists(decimal_bytecode):
- os.unlink(decimal_bytecode)
- sys.dont_write_bytecode = True
- try:
- for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
- seconds=seconds):
- yield result
- finally:
- sys.dont_write_bytecode = False
-
-
-def source_writing_bytecode(seconds, repeat):
- """Source writing bytecode: simple"""
- assert not sys.dont_write_bytecode
- name = '__importlib_test_benchmark__'
- with source_util.create_modules(name) as mapping:
- def cleanup():
- sys.modules.pop(name)
- os.unlink(imp.cache_from_source(mapping[name]))
- for result in bench(name, cleanup, repeat=repeat, seconds=seconds):
- assert not os.path.exists(imp.cache_from_source(mapping[name]))
- yield result
-
-
-def decimal_writing_bytecode(seconds, repeat):
- """Source writing bytecode: decimal"""
- assert not sys.dont_write_bytecode
- name = 'decimal'
- def cleanup():
- sys.modules.pop(name)
- os.unlink(imp.cache_from_source(decimal.__file__))
- for result in bench(name, cleanup, repeat=repeat, seconds=seconds):
- yield result
-
-
-def source_using_bytecode(seconds, repeat):
- """Bytecode w/ source: simple"""
- name = '__importlib_test_benchmark__'
- with source_util.create_modules(name) as mapping:
- py_compile.compile(mapping[name])
- assert os.path.exists(imp.cache_from_source(mapping[name]))
- for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
- seconds=seconds):
- yield result
-
-
-def decimal_using_bytecode(seconds, repeat):
- """Bytecode w/ source: decimal"""
- name = 'decimal'
- py_compile.compile(decimal.__file__)
- for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
- seconds=seconds):
- yield result
-
-
-def main(import_):
- __builtins__.__import__ = import_
- benchmarks = (from_cache, builtin_mod,
- source_using_bytecode, source_wo_bytecode,
- source_writing_bytecode,
- decimal_using_bytecode, decimal_writing_bytecode,
- decimal_wo_bytecode,)
- seconds = 1
- seconds_plural = 's' if seconds > 1 else ''
- repeat = 3
- header = "Measuring imports/second over {} second{}, best out of {}\n"
- print(header.format(seconds, seconds_plural, repeat))
- for benchmark in benchmarks:
- print(benchmark.__doc__, "[", end=' ')
- sys.stdout.flush()
- results = []
- for result in benchmark(seconds=seconds, repeat=repeat):
- results.append(result)
- print(result, end=' ')
- sys.stdout.flush()
- assert not sys.dont_write_bytecode
- print("]", "best is", format(max(results), ',d'))
-
-
-if __name__ == '__main__':
- import optparse
-
- parser = optparse.OptionParser()
- parser.add_option('-b', '--builtin', dest='builtin', action='store_true',
- default=False, help="use the built-in __import__")
- options, args = parser.parse_args()
- if args:
- raise RuntimeError("unrecognized args: {}".format(args))
- import_ = __import__
- if not options.builtin:
- import_ = importlib.__import__
-
- main(import_)
diff --git a/Lib/importlib/test/extension/test_loader.py b/Lib/importlib/test/extension/test_loader.py
deleted file mode 100644
index 4a783db..0000000
--- a/Lib/importlib/test/extension/test_loader.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from importlib import _bootstrap
-from . import util as ext_util
-from .. import abc
-from .. import util
-
-import sys
-import unittest
-
-
-class LoaderTests(abc.LoaderTests):
-
- """Test load_module() for extension modules."""
-
- def load_module(self, fullname):
- loader = _bootstrap._ExtensionFileLoader(ext_util.NAME,
- ext_util.FILEPATH)
- return loader.load_module(fullname)
-
- def test_module(self):
- with util.uncache(ext_util.NAME):
- module = self.load_module(ext_util.NAME)
- for attr, value in [('__name__', ext_util.NAME),
- ('__file__', ext_util.FILEPATH),
- ('__package__', '')]:
- self.assertEqual(getattr(module, attr), value)
- self.assertTrue(ext_util.NAME in sys.modules)
- self.assertTrue(isinstance(module.__loader__,
- _bootstrap._ExtensionFileLoader))
-
- def test_package(self):
- # Extensions are not found in packages.
- pass
-
- def test_lacking_parent(self):
- # Extensions are not found in packages.
- pass
-
- def test_module_reuse(self):
- with util.uncache(ext_util.NAME):
- module1 = self.load_module(ext_util.NAME)
- module2 = self.load_module(ext_util.NAME)
- self.assertTrue(module1 is module2)
-
- def test_state_after_failure(self):
- # No easy way to trigger a failure after a successful import.
- pass
-
- def test_unloadable(self):
- with self.assertRaises(ImportError):
- self.load_module('asdfjkl;')
-
-
-def test_main():
- from test.support import run_unittest
- run_unittest(LoaderTests)
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/importlib/test/import_/test_api.py b/Lib/importlib/test/import_/test_api.py
deleted file mode 100644
index 9075d42..0000000
--- a/Lib/importlib/test/import_/test_api.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from . import util
-import unittest
-
-
-class APITest(unittest.TestCase):
-
- """Test API-specific details for __import__ (e.g. raising the right
- exception when passing in an int for the module name)."""
-
- def test_name_requires_rparition(self):
- # Raise TypeError if a non-string is passed in for the module name.
- with self.assertRaises(TypeError):
- util.import_(42)
-
-
-def test_main():
- from test.support import run_unittest
- run_unittest(APITest)
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/importlib/test/import_/test_packages.py b/Lib/importlib/test/import_/test_packages.py
deleted file mode 100644
index faadc32..0000000
--- a/Lib/importlib/test/import_/test_packages.py
+++ /dev/null
@@ -1,37 +0,0 @@
-from .. import util
-from . import util as import_util
-import sys
-import unittest
-import importlib
-
-
-class ParentModuleTests(unittest.TestCase):
-
- """Importing a submodule should import the parent modules."""
-
- def test_import_parent(self):
- with util.mock_modules('pkg.__init__', 'pkg.module') as mock:
- with util.import_state(meta_path=[mock]):
- module = import_util.import_('pkg.module')
- self.assertTrue('pkg' in sys.modules)
-
- def test_bad_parent(self):
- with util.mock_modules('pkg.module') as mock:
- with util.import_state(meta_path=[mock]):
- with self.assertRaises(ImportError):
- import_util.import_('pkg.module')
-
- def test_module_not_package(self):
- # Try to import a submodule from a non-package should raise ImportError.
- assert not hasattr(sys, '__path__')
- with self.assertRaises(ImportError):
- import_util.import_('sys.no_submodules_here')
-
-
-def test_main():
- from test.support import run_unittest
- run_unittest(ParentModuleTests)
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/importlib/test/import_/test_path.py b/Lib/importlib/test/import_/test_path.py
deleted file mode 100644
index 2faa231..0000000
--- a/Lib/importlib/test/import_/test_path.py
+++ /dev/null
@@ -1,131 +0,0 @@
-from importlib import _bootstrap
-from importlib import machinery
-from .. import util
-from . import util as import_util
-import imp
-import os
-import sys
-import tempfile
-from test import support
-from types import MethodType
-import unittest
-
-
-class FinderTests(unittest.TestCase):
-
- """Tests for PathFinder."""
-
- def test_failure(self):
- # Test None returned upon not finding a suitable finder.
- module = '<test module>'
- with util.import_state():
- self.assertTrue(machinery.PathFinder.find_module(module) is None)
-
- def test_sys_path(self):
- # Test that sys.path is used when 'path' is None.
- # Implicitly tests that sys.path_importer_cache is used.
- module = '<test module>'
- path = '<test path>'
- importer = util.mock_modules(module)
- with util.import_state(path_importer_cache={path: importer},
- path=[path]):
- loader = machinery.PathFinder.find_module(module)
- self.assertTrue(loader is importer)
-
- def test_path(self):
- # Test that 'path' is used when set.
- # Implicitly tests that sys.path_importer_cache is used.
- module = '<test module>'
- path = '<test path>'
- importer = util.mock_modules(module)
- with util.import_state(path_importer_cache={path: importer}):
- loader = machinery.PathFinder.find_module(module, [path])
- self.assertTrue(loader is importer)
-
- def test_path_hooks(self):
- # Test that sys.path_hooks is used.
- # Test that sys.path_importer_cache is set.
- module = '<test module>'
- path = '<test path>'
- importer = util.mock_modules(module)
- hook = import_util.mock_path_hook(path, importer=importer)
- with util.import_state(path_hooks=[hook]):
- loader = machinery.PathFinder.find_module(module, [path])
- self.assertTrue(loader is importer)
- self.assertTrue(path in sys.path_importer_cache)
- self.assertTrue(sys.path_importer_cache[path] is importer)
-
- def test_path_importer_cache_has_None(self):
- # Test that if sys.path_importer_cache has None that None is returned.
- clear_cache = {path: None for path in sys.path}
- with util.import_state(path_importer_cache=clear_cache):
- for name in ('asynchat', 'sys', '<test module>'):
- self.assertTrue(machinery.PathFinder.find_module(name) is None)
-
- def test_path_importer_cache_has_None_continues(self):
- # Test that having None in sys.path_importer_cache causes the search to
- # continue.
- path = '<test path>'
- module = '<test module>'
- importer = util.mock_modules(module)
- with util.import_state(path=['1', '2'],
- path_importer_cache={'1': None, '2': importer}):
- loader = machinery.PathFinder.find_module(module)
- self.assertTrue(loader is importer)
-
-
-
-class DefaultPathFinderTests(unittest.TestCase):
-
- """Test importlib._bootstrap._DefaultPathFinder."""
-
- def test_implicit_hooks(self):
- # Test that the implicit path hooks are used.
- bad_path = '<path>'
- module = '<module>'
- assert not os.path.exists(bad_path)
- existing_path = tempfile.mkdtemp()
- try:
- with util.import_state():
- nothing = _bootstrap._DefaultPathFinder.find_module(module,
- path=[existing_path])
- self.assertTrue(nothing is None)
- self.assertTrue(existing_path in sys.path_importer_cache)
- result = isinstance(sys.path_importer_cache[existing_path],
- imp.NullImporter)
- self.assertFalse(result)
- nothing = _bootstrap._DefaultPathFinder.find_module(module,
- path=[bad_path])
- self.assertTrue(nothing is None)
- self.assertTrue(bad_path in sys.path_importer_cache)
- self.assertTrue(isinstance(sys.path_importer_cache[bad_path],
- imp.NullImporter))
- finally:
- os.rmdir(existing_path)
-
-
- def test_path_importer_cache_has_None(self):
- # Test that the default hook is used when sys.path_importer_cache
- # contains None for a path.
- module = '<test module>'
- importer = util.mock_modules(module)
- path = '<test path>'
- # XXX Not blackbox.
- original_hook = _bootstrap._DEFAULT_PATH_HOOK
- mock_hook = import_util.mock_path_hook(path, importer=importer)
- _bootstrap._DEFAULT_PATH_HOOK = mock_hook
- try:
- with util.import_state(path_importer_cache={path: None}):
- loader = _bootstrap._DefaultPathFinder.find_module(module,
- path=[path])
- self.assertTrue(loader is importer)
- finally:
- _bootstrap._DEFAULT_PATH_HOOK = original_hook
-
-
-def test_main():
- from test.support import run_unittest
- run_unittest(FinderTests, DefaultPathFinderTests)
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/importlib/test/regrtest.py b/Lib/importlib/test/regrtest.py
deleted file mode 100644
index b103ae7d..0000000
--- a/Lib/importlib/test/regrtest.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""Run Python's standard test suite using importlib.__import__.
-
-Tests known to fail because of assumptions that importlib (properly)
-invalidates are automatically skipped if the entire test suite is run.
-Otherwise all command-line options valid for test.regrtest are also valid for
-this script.
-
-XXX FAILING
- * test_import
- - test_incorrect_code_name
- file name differing between __file__ and co_filename (r68360 on trunk)
- - test_import_by_filename
- exception for trying to import by file name does not match
-
-"""
-import importlib
-import sys
-from test import regrtest
-
-if __name__ == '__main__':
- __builtins__.__import__ = importlib.__import__
-
- exclude = ['--exclude',
- 'test_frozen', # Does not expect __loader__ attribute
- 'test_pkg', # Does not expect __loader__ attribute
- 'test_pydoc', # Does not expect __loader__ attribute
- ]
-
- # Switching on --exclude implies running all test but the ones listed, so
- # only use it when one is not running an explicit test
- if len(sys.argv) == 1:
- # No programmatic way to specify tests to exclude
- sys.argv.extend(exclude)
-
- regrtest.main(quiet=True, verbose2=True)
diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py
index 7b44fa1..1316437 100644
--- a/Lib/importlib/util.py
+++ b/Lib/importlib/util.py
@@ -3,3 +3,19 @@
from ._bootstrap import module_for_loader
from ._bootstrap import set_loader
from ._bootstrap import set_package
+from ._bootstrap import _resolve_name
+
+
+def resolve_name(name, package):
+ """Resolve a relative module name to an absolute one."""
+ if not name.startswith('.'):
+ return name
+ elif not package:
+ raise ValueError('{!r} is not a relative name '
+ '(no leading dot)'.format(name))
+ level = 0
+ for character in name:
+ if character != '.':
+ break
+ level += 1
+ return _resolve_name(name[level:], package, level)
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 2031755..88f0ee2 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -22,24 +22,29 @@ Here are some of the useful functions provided by this module:
getouterframes(), getinnerframes() - get info about frames
currentframe() - get the current stack frame
stack(), trace() - get info about frames on the stack or in a traceback
+
+ signature() - get a Signature object for the callable
"""
# This module is in the public domain. No warranties.
-__author__ = 'Ka-Ping Yee <ping@lfw.org>'
-__date__ = '1 Jan 2001'
+__author__ = ('Ka-Ping Yee <ping@lfw.org>',
+ 'Yury Selivanov <yselivanov@sprymix.com>')
-import sys
-import os
-import types
+import imp
+import importlib.machinery
import itertools
-import string
+import linecache
+import os
import re
-import imp
+import sys
import tokenize
-import linecache
+import types
+import warnings
+import functools
+import builtins
from operator import attrgetter
-from collections import namedtuple
+from collections import namedtuple, OrderedDict
# Create constants for the compiler flags in Include/code.h
# We try to get them from dis to avoid duplication, but fall
@@ -433,6 +438,8 @@ ModuleInfo = namedtuple('ModuleInfo', 'name suffix mode module_type')
def getmoduleinfo(path):
"""Get the module name, suffix, mode, and module type for a given file."""
+ warnings.warn('inspect.getmoduleinfo() is deprecated', DeprecationWarning,
+ 2)
filename = os.path.basename(path)
suffixes = [(-len(suffix), suffix, mode, mtype)
for suffix, mode, mtype in imp.get_suffixes()]
@@ -443,20 +450,29 @@ def getmoduleinfo(path):
def getmodulename(path):
"""Return the module name for a given file, or None."""
- info = getmoduleinfo(path)
- if info: return info[0]
+ fname = os.path.basename(path)
+ # Check for paths that look like an actual module file
+ suffixes = [(-len(suffix), suffix)
+ for suffix in importlib.machinery.all_suffixes()]
+ suffixes.sort() # try longest suffixes first, in case they overlap
+ for neglen, suffix in suffixes:
+ if fname.endswith(suffix):
+ return fname[:neglen]
+ return None
def getsourcefile(object):
"""Return the filename that can be used to locate an object's source.
Return None if no way can be identified to get the source.
"""
filename = getfile(object)
- if filename[-4:].lower() in ('.pyc', '.pyo'):
- filename = filename[:-4] + '.py'
- for suffix, mode, kind in imp.get_suffixes():
- if 'b' in mode and filename[-len(suffix):].lower() == suffix:
- # Looks like a binary file. We want to only return a text file.
- return None
+ all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:]
+ all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:]
+ if any(filename.endswith(s) for s in all_bytecode_suffixes):
+ filename = (os.path.splitext(filename)[0] +
+ importlib.machinery.SOURCE_SUFFIXES[0])
+ elif any(filename.endswith(s) for s in
+ importlib.machinery.EXTENSION_SUFFIXES):
+ return None
if os.path.exists(filename):
return filename
# only return a non-existent filename if the module has a PEP 302 loader
@@ -931,6 +947,43 @@ def formatargvalues(args, varargs, varkw, locals,
specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
return '(' + ', '.join(specs) + ')'
+def _missing_arguments(f_name, argnames, pos, values):
+ names = [repr(name) for name in argnames if name not in values]
+ missing = len(names)
+ if missing == 1:
+ s = names[0]
+ elif missing == 2:
+ s = "{} and {}".format(*names)
+ else:
+ tail = ", {} and {}".format(names[-2:])
+ del names[-2:]
+ s = ", ".join(names) + tail
+ raise TypeError("%s() missing %i required %s argument%s: %s" %
+ (f_name, missing,
+ "positional" if pos else "keyword-only",
+ "" if missing == 1 else "s", s))
+
+def _too_many(f_name, args, kwonly, varargs, defcount, given, values):
+ atleast = len(args) - defcount
+ kwonly_given = len([arg for arg in kwonly if arg in values])
+ if varargs:
+ plural = atleast != 1
+ sig = "at least %d" % (atleast,)
+ elif defcount:
+ plural = True
+ sig = "from %d to %d" % (atleast, len(args))
+ else:
+ plural = len(args) != 1
+ sig = str(len(args))
+ kwonly_sig = ""
+ if kwonly_given:
+ msg = " positional argument%s (and %d keyword-only argument%s)"
+ kwonly_sig = (msg % ("s" if given != 1 else "", kwonly_given,
+ "s" if kwonly_given != 1 else ""))
+ raise TypeError("%s() takes %s positional argument%s but %d%s %s given" %
+ (f_name, sig, "s" if plural else "", given, kwonly_sig,
+ "was" if given == 1 and not kwonly_given else "were"))
+
def getcallargs(func, *positional, **named):
"""Get the mapping of arguments to values.
@@ -942,65 +995,107 @@ def getcallargs(func, *positional, **named):
f_name = func.__name__
arg2value = {}
+
if ismethod(func) and func.__self__ is not None:
# implicit 'self' (or 'cls' for classmethods) argument
positional = (func.__self__,) + positional
num_pos = len(positional)
- num_total = num_pos + len(named)
num_args = len(args)
num_defaults = len(defaults) if defaults else 0
- for arg, value in zip(args, positional):
- arg2value[arg] = value
+
+ n = min(num_pos, num_args)
+ for i in range(n):
+ arg2value[args[i]] = positional[i]
if varargs:
- if num_pos > num_args:
- arg2value[varargs] = positional[-(num_pos-num_args):]
- else:
- arg2value[varargs] = ()
- elif 0 < num_args < num_pos:
- raise TypeError('%s() takes %s %d positional %s (%d given)' % (
- f_name, 'at most' if defaults else 'exactly', num_args,
- 'arguments' if num_args > 1 else 'argument', num_total))
- elif num_args == 0 and num_total:
- if varkw or kwonlyargs:
- if num_pos:
- # XXX: We should use num_pos, but Python also uses num_total:
- raise TypeError('%s() takes exactly 0 positional arguments '
- '(%d given)' % (f_name, num_total))
- else:
- raise TypeError('%s() takes no arguments (%d given)' %
- (f_name, num_total))
-
- for arg in itertools.chain(args, kwonlyargs):
- if arg in named:
- if arg in arg2value:
- raise TypeError("%s() got multiple values for keyword "
- "argument '%s'" % (f_name, arg))
+ arg2value[varargs] = tuple(positional[n:])
+ possible_kwargs = set(args + kwonlyargs)
+ if varkw:
+ arg2value[varkw] = {}
+ for kw, value in named.items():
+ if kw not in possible_kwargs:
+ if not varkw:
+ raise TypeError("%s() got an unexpected keyword argument %r" %
+ (f_name, kw))
+ arg2value[varkw][kw] = value
+ continue
+ if kw in arg2value:
+ raise TypeError("%s() got multiple values for argument %r" %
+ (f_name, kw))
+ arg2value[kw] = value
+ if num_pos > num_args and not varargs:
+ _too_many(f_name, args, kwonlyargs, varargs, num_defaults,
+ num_pos, arg2value)
+ if num_pos < num_args:
+ req = args[:num_args - num_defaults]
+ for arg in req:
+ if arg not in arg2value:
+ _missing_arguments(f_name, req, True, arg2value)
+ for i, arg in enumerate(args[num_args - num_defaults:]):
+ if arg not in arg2value:
+ arg2value[arg] = defaults[i]
+ missing = 0
+ for kwarg in kwonlyargs:
+ if kwarg not in arg2value:
+ if kwarg in kwonlydefaults:
+ arg2value[kwarg] = kwonlydefaults[kwarg]
else:
- arg2value[arg] = named.pop(arg)
- for kwonlyarg in kwonlyargs:
- if kwonlyarg not in arg2value:
+ missing += 1
+ if missing:
+ _missing_arguments(f_name, kwonlyargs, False, arg2value)
+ return arg2value
+
+ClosureVars = namedtuple('ClosureVars', 'nonlocals globals builtins unbound')
+
+def getclosurevars(func):
+ """
+ Get the mapping of free variables to their current values.
+
+ Returns a named tuple of dicts mapping the current nonlocal, global
+ and builtin references as seen by the body of the function. A final
+ set of unbound names that could not be resolved is also provided.
+ """
+
+ if ismethod(func):
+ func = func.__func__
+
+ if not isfunction(func):
+ raise TypeError("'{!r}' is not a Python function".format(func))
+
+ code = func.__code__
+ # Nonlocal references are named in co_freevars and resolved
+ # by looking them up in __closure__ by positional index
+ if func.__closure__ is None:
+ nonlocal_vars = {}
+ else:
+ nonlocal_vars = {
+ var : cell.cell_contents
+ for var, cell in zip(code.co_freevars, func.__closure__)
+ }
+
+ # Global and builtin references are named in co_names and resolved
+ # by looking them up in __globals__ or __builtins__
+ global_ns = func.__globals__
+ builtin_ns = global_ns.get("__builtins__", builtins.__dict__)
+ if ismodule(builtin_ns):
+ builtin_ns = builtin_ns.__dict__
+ global_vars = {}
+ builtin_vars = {}
+ unbound_names = set()
+ for name in code.co_names:
+ if name in ("None", "True", "False"):
+ # Because these used to be builtins instead of keywords, they
+ # may still show up as name references. We ignore them.
+ continue
+ try:
+ global_vars[name] = global_ns[name]
+ except KeyError:
try:
- arg2value[kwonlyarg] = kwonlydefaults[kwonlyarg]
+ builtin_vars[name] = builtin_ns[name]
except KeyError:
- raise TypeError("%s() needs keyword-only argument %s" %
- (f_name, kwonlyarg))
- if defaults: # fill in any missing values with the defaults
- for arg, value in zip(args[-num_defaults:], defaults):
- if arg not in arg2value:
- arg2value[arg] = value
- if varkw:
- arg2value[varkw] = named
- elif named:
- unexpected = next(iter(named))
- raise TypeError("%s() got an unexpected keyword argument '%s'" %
- (f_name, unexpected))
- unassigned = num_args - len([arg for arg in args if arg in arg2value])
- if unassigned:
- num_required = num_args - num_defaults
- raise TypeError('%s() takes %s %d %s (%d given)' % (
- f_name, 'at least' if defaults else 'exactly', num_required,
- 'arguments' if num_required > 1 else 'argument', num_total))
- return arg2value
+ unbound_names.add(name)
+
+ return ClosureVars(nonlocal_vars, global_vars,
+ builtin_vars, unbound_names)
# -------------------------------------------------- stack frame extraction
@@ -1171,6 +1266,8 @@ def getattr_static(obj, attr, default=_sentinel):
raise AttributeError(attr)
+# ------------------------------------------------ generator introspection
+
GEN_CREATED = 'GEN_CREATED'
GEN_RUNNING = 'GEN_RUNNING'
GEN_SUSPENDED = 'GEN_SUSPENDED'
@@ -1192,3 +1289,785 @@ def getgeneratorstate(generator):
if generator.gi_frame.f_lasti == -1:
return GEN_CREATED
return GEN_SUSPENDED
+
+
+def getgeneratorlocals(generator):
+ """
+ Get the mapping of generator local variables to their current values.
+
+ A dict is returned, with the keys the local variable names and values the
+ bound values."""
+
+ if not isgenerator(generator):
+ raise TypeError("'{!r}' is not a Python generator".format(generator))
+
+ frame = getattr(generator, "gi_frame", None)
+ if frame is not None:
+ return generator.gi_frame.f_locals
+ else:
+ return {}
+
+###############################################################################
+### Function Signature Object (PEP 362)
+###############################################################################
+
+
+_WrapperDescriptor = type(type.__call__)
+_MethodWrapper = type(all.__call__)
+
+_NonUserDefinedCallables = (_WrapperDescriptor,
+ _MethodWrapper,
+ types.BuiltinFunctionType)
+
+
+def _get_user_defined_method(cls, method_name):
+ try:
+ meth = getattr(cls, method_name)
+ except AttributeError:
+ return
+ else:
+ if not isinstance(meth, _NonUserDefinedCallables):
+ # Once '__signature__' will be added to 'C'-level
+ # callables, this check won't be necessary
+ return meth
+
+
+def signature(obj):
+ '''Get a signature object for the passed callable.'''
+
+ if not callable(obj):
+ raise TypeError('{!r} is not a callable object'.format(obj))
+
+ if isinstance(obj, types.MethodType):
+ # In this case we skip the first parameter of the underlying
+ # function (usually `self` or `cls`).
+ sig = signature(obj.__func__)
+ return sig.replace(parameters=tuple(sig.parameters.values())[1:])
+
+ try:
+ sig = obj.__signature__
+ except AttributeError:
+ pass
+ else:
+ if sig is not None:
+ return sig
+
+ try:
+ # Was this function wrapped by a decorator?
+ wrapped = obj.__wrapped__
+ except AttributeError:
+ pass
+ else:
+ return signature(wrapped)
+
+ if isinstance(obj, types.FunctionType):
+ return Signature.from_function(obj)
+
+ if isinstance(obj, functools.partial):
+ sig = signature(obj.func)
+
+ new_params = OrderedDict(sig.parameters.items())
+
+ partial_args = obj.args or ()
+ partial_keywords = obj.keywords or {}
+ try:
+ ba = sig.bind_partial(*partial_args, **partial_keywords)
+ except TypeError as ex:
+ msg = 'partial object {!r} has incorrect arguments'.format(obj)
+ raise ValueError(msg) from ex
+
+ for arg_name, arg_value in ba.arguments.items():
+ param = new_params[arg_name]
+ if arg_name in partial_keywords:
+ # We set a new default value, because the following code
+ # is correct:
+ #
+ # >>> def foo(a): print(a)
+ # >>> print(partial(partial(foo, a=10), a=20)())
+ # 20
+ # >>> print(partial(partial(foo, a=10), a=20)(a=30))
+ # 30
+ #
+ # So, with 'partial' objects, passing a keyword argument is
+ # like setting a new default value for the corresponding
+ # parameter
+ #
+ # We also mark this parameter with '_partial_kwarg'
+ # flag. Later, in '_bind', the 'default' value of this
+ # parameter will be added to 'kwargs', to simulate
+ # the 'functools.partial' real call.
+ new_params[arg_name] = param.replace(default=arg_value,
+ _partial_kwarg=True)
+
+ elif (param.kind not in (_VAR_KEYWORD, _VAR_POSITIONAL) and
+ not param._partial_kwarg):
+ new_params.pop(arg_name)
+
+ return sig.replace(parameters=new_params.values())
+
+ sig = None
+ if isinstance(obj, type):
+ # obj is a class or a metaclass
+
+ # First, let's see if it has an overloaded __call__ defined
+ # in its metaclass
+ call = _get_user_defined_method(type(obj), '__call__')
+ if call is not None:
+ sig = signature(call)
+ else:
+ # Now we check if the 'obj' class has a '__new__' method
+ new = _get_user_defined_method(obj, '__new__')
+ if new is not None:
+ sig = signature(new)
+ else:
+ # Finally, we should have at least __init__ implemented
+ init = _get_user_defined_method(obj, '__init__')
+ if init is not None:
+ sig = signature(init)
+ elif not isinstance(obj, _NonUserDefinedCallables):
+ # An object with __call__
+ # We also check that the 'obj' is not an instance of
+ # _WrapperDescriptor or _MethodWrapper to avoid
+ # infinite recursion (and even potential segfault)
+ call = _get_user_defined_method(type(obj), '__call__')
+ if call is not None:
+ sig = signature(call)
+
+ if sig is not None:
+ # For classes and objects we skip the first parameter of their
+ # __call__, __new__, or __init__ methods
+ return sig.replace(parameters=tuple(sig.parameters.values())[1:])
+
+ if isinstance(obj, types.BuiltinFunctionType):
+ # Raise a nicer error message for builtins
+ msg = 'no signature found for builtin function {!r}'.format(obj)
+ raise ValueError(msg)
+
+ raise ValueError('callable {!r} is not supported by signature'.format(obj))
+
+
+class _void:
+ '''A private marker - used in Parameter & Signature'''
+
+
+class _empty:
+ pass
+
+
+class _ParameterKind(int):
+ def __new__(self, *args, name):
+ obj = int.__new__(self, *args)
+ obj._name = name
+ return obj
+
+ def __str__(self):
+ return self._name
+
+ def __repr__(self):
+ return '<_ParameterKind: {!r}>'.format(self._name)
+
+
+_POSITIONAL_ONLY = _ParameterKind(0, name='POSITIONAL_ONLY')
+_POSITIONAL_OR_KEYWORD = _ParameterKind(1, name='POSITIONAL_OR_KEYWORD')
+_VAR_POSITIONAL = _ParameterKind(2, name='VAR_POSITIONAL')
+_KEYWORD_ONLY = _ParameterKind(3, name='KEYWORD_ONLY')
+_VAR_KEYWORD = _ParameterKind(4, name='VAR_KEYWORD')
+
+
+class Parameter:
+ '''Represents a parameter in a function signature.
+
+ Has the following public attributes:
+
+ * name : str
+ The name of the parameter as a string.
+ * default : object
+ The default value for the parameter if specified. If the
+ parameter has no default value, this attribute is not set.
+ * annotation
+ The annotation for the parameter if specified. If the
+ parameter has no annotation, this attribute is not set.
+ * kind : str
+ Describes how argument values are bound to the parameter.
+ Possible values: `Parameter.POSITIONAL_ONLY`,
+ `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
+ `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
+ '''
+
+ __slots__ = ('_name', '_kind', '_default', '_annotation', '_partial_kwarg')
+
+ POSITIONAL_ONLY = _POSITIONAL_ONLY
+ POSITIONAL_OR_KEYWORD = _POSITIONAL_OR_KEYWORD
+ VAR_POSITIONAL = _VAR_POSITIONAL
+ KEYWORD_ONLY = _KEYWORD_ONLY
+ VAR_KEYWORD = _VAR_KEYWORD
+
+ empty = _empty
+
+ def __init__(self, name, kind, *, default=_empty, annotation=_empty,
+ _partial_kwarg=False):
+
+ if kind not in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD,
+ _VAR_POSITIONAL, _KEYWORD_ONLY, _VAR_KEYWORD):
+ raise ValueError("invalid value for 'Parameter.kind' attribute")
+ self._kind = kind
+
+ if default is not _empty:
+ if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
+ msg = '{} parameters cannot have default values'.format(kind)
+ raise ValueError(msg)
+ self._default = default
+ self._annotation = annotation
+
+ if name is None:
+ if kind != _POSITIONAL_ONLY:
+ raise ValueError("None is not a valid name for a "
+ "non-positional-only parameter")
+ self._name = name
+ else:
+ name = str(name)
+ if kind != _POSITIONAL_ONLY and not name.isidentifier():
+ msg = '{!r} is not a valid parameter name'.format(name)
+ raise ValueError(msg)
+ self._name = name
+
+ self._partial_kwarg = _partial_kwarg
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def default(self):
+ return self._default
+
+ @property
+ def annotation(self):
+ return self._annotation
+
+ @property
+ def kind(self):
+ return self._kind
+
+ def replace(self, *, name=_void, kind=_void, annotation=_void,
+ default=_void, _partial_kwarg=_void):
+ '''Creates a customized copy of the Parameter.'''
+
+ if name is _void:
+ name = self._name
+
+ if kind is _void:
+ kind = self._kind
+
+ if annotation is _void:
+ annotation = self._annotation
+
+ if default is _void:
+ default = self._default
+
+ if _partial_kwarg is _void:
+ _partial_kwarg = self._partial_kwarg
+
+ return type(self)(name, kind, default=default, annotation=annotation,
+ _partial_kwarg=_partial_kwarg)
+
+ def __str__(self):
+ kind = self.kind
+
+ formatted = self._name
+ if kind == _POSITIONAL_ONLY:
+ if formatted is None:
+ formatted = ''
+ formatted = '<{}>'.format(formatted)
+
+ # Add annotation and default value
+ if self._annotation is not _empty:
+ formatted = '{}:{}'.format(formatted,
+ formatannotation(self._annotation))
+
+ if self._default is not _empty:
+ formatted = '{}={}'.format(formatted, repr(self._default))
+
+ if kind == _VAR_POSITIONAL:
+ formatted = '*' + formatted
+ elif kind == _VAR_KEYWORD:
+ formatted = '**' + formatted
+
+ return formatted
+
+ def __repr__(self):
+ return '<{} at {:#x} {!r}>'.format(self.__class__.__name__,
+ id(self), self.name)
+
+ def __eq__(self, other):
+ return (issubclass(other.__class__, Parameter) and
+ self._name == other._name and
+ self._kind == other._kind and
+ self._default == other._default and
+ self._annotation == other._annotation)
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+
+class BoundArguments:
+ '''Result of `Signature.bind` call. Holds the mapping of arguments
+ to the function's parameters.
+
+ Has the following public attributes:
+
+ * arguments : OrderedDict
+ An ordered mutable mapping of parameters' names to arguments' values.
+ Does not contain arguments' default values.
+ * signature : Signature
+ The Signature object that created this instance.
+ * args : tuple
+ Tuple of positional arguments values.
+ * kwargs : dict
+ Dict of keyword arguments values.
+ '''
+
+ def __init__(self, signature, arguments):
+ self.arguments = arguments
+ self._signature = signature
+
+ @property
+ def signature(self):
+ return self._signature
+
+ @property
+ def args(self):
+ args = []
+ for param_name, param in self._signature.parameters.items():
+ if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or
+ param._partial_kwarg):
+ # Keyword arguments mapped by 'functools.partial'
+ # (Parameter._partial_kwarg is True) are mapped
+ # in 'BoundArguments.kwargs', along with VAR_KEYWORD &
+ # KEYWORD_ONLY
+ break
+
+ try:
+ arg = self.arguments[param_name]
+ except KeyError:
+ # We're done here. Other arguments
+ # will be mapped in 'BoundArguments.kwargs'
+ break
+ else:
+ if param.kind == _VAR_POSITIONAL:
+ # *args
+ args.extend(arg)
+ else:
+ # plain argument
+ args.append(arg)
+
+ return tuple(args)
+
+ @property
+ def kwargs(self):
+ kwargs = {}
+ kwargs_started = False
+ for param_name, param in self._signature.parameters.items():
+ if not kwargs_started:
+ if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or
+ param._partial_kwarg):
+ kwargs_started = True
+ else:
+ if param_name not in self.arguments:
+ kwargs_started = True
+ continue
+
+ if not kwargs_started:
+ continue
+
+ try:
+ arg = self.arguments[param_name]
+ except KeyError:
+ pass
+ else:
+ if param.kind == _VAR_KEYWORD:
+ # **kwargs
+ kwargs.update(arg)
+ else:
+ # plain keyword argument
+ kwargs[param_name] = arg
+
+ return kwargs
+
+ def __eq__(self, other):
+ return (issubclass(other.__class__, BoundArguments) and
+ self.signature == other.signature and
+ self.arguments == other.arguments)
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+
+class Signature:
+ '''A Signature object represents the overall signature of a function.
+ It stores a Parameter object for each parameter accepted by the
+ function, as well as information specific to the function itself.
+
+ A Signature object has the following public attributes and methods:
+
+ * parameters : OrderedDict
+ An ordered mapping of parameters' names to the corresponding
+ Parameter objects (keyword-only arguments are in the same order
+ as listed in `code.co_varnames`).
+ * return_annotation : object
+ The annotation for the return type of the function if specified.
+ If the function has no annotation for its return type, this
+ attribute is not set.
+ * bind(*args, **kwargs) -> BoundArguments
+ Creates a mapping from positional and keyword arguments to
+ parameters.
+ * bind_partial(*args, **kwargs) -> BoundArguments
+ Creates a partial mapping from positional and keyword arguments
+ to parameters (simulating 'functools.partial' behavior.)
+ '''
+
+ __slots__ = ('_return_annotation', '_parameters')
+
+ _parameter_cls = Parameter
+ _bound_arguments_cls = BoundArguments
+
+ empty = _empty
+
+ def __init__(self, parameters=None, *, return_annotation=_empty,
+ __validate_parameters__=True):
+ '''Constructs Signature from the given list of Parameter
+ objects and 'return_annotation'. All arguments are optional.
+ '''
+
+ if parameters is None:
+ params = OrderedDict()
+ else:
+ if __validate_parameters__:
+ params = OrderedDict()
+ top_kind = _POSITIONAL_ONLY
+
+ for idx, param in enumerate(parameters):
+ kind = param.kind
+ if kind < top_kind:
+ msg = 'wrong parameter order: {} before {}'
+ msg = msg.format(top_kind, param.kind)
+ raise ValueError(msg)
+ else:
+ top_kind = kind
+
+ name = param.name
+ if name is None:
+ name = str(idx)
+ param = param.replace(name=name)
+
+ if name in params:
+ msg = 'duplicate parameter name: {!r}'.format(name)
+ raise ValueError(msg)
+ params[name] = param
+ else:
+ params = OrderedDict(((param.name, param)
+ for param in parameters))
+
+ self._parameters = types.MappingProxyType(params)
+ self._return_annotation = return_annotation
+
+ @classmethod
+ def from_function(cls, func):
+ '''Constructs Signature for the given python function'''
+
+ if not isinstance(func, types.FunctionType):
+ raise TypeError('{!r} is not a Python function'.format(func))
+
+ Parameter = cls._parameter_cls
+
+ # Parameter information.
+ func_code = func.__code__
+ pos_count = func_code.co_argcount
+ arg_names = func_code.co_varnames
+ positional = tuple(arg_names[:pos_count])
+ keyword_only_count = func_code.co_kwonlyargcount
+ keyword_only = arg_names[pos_count:(pos_count + keyword_only_count)]
+ annotations = func.__annotations__
+ defaults = func.__defaults__
+ kwdefaults = func.__kwdefaults__
+
+ if defaults:
+ pos_default_count = len(defaults)
+ else:
+ pos_default_count = 0
+
+ parameters = []
+
+ # Non-keyword-only parameters w/o defaults.
+ non_default_count = pos_count - pos_default_count
+ for name in positional[:non_default_count]:
+ annotation = annotations.get(name, _empty)
+ parameters.append(Parameter(name, annotation=annotation,
+ kind=_POSITIONAL_OR_KEYWORD))
+
+ # ... w/ defaults.
+ for offset, name in enumerate(positional[non_default_count:]):
+ annotation = annotations.get(name, _empty)
+ parameters.append(Parameter(name, annotation=annotation,
+ kind=_POSITIONAL_OR_KEYWORD,
+ default=defaults[offset]))
+
+ # *args
+ if func_code.co_flags & 0x04:
+ name = arg_names[pos_count + keyword_only_count]
+ annotation = annotations.get(name, _empty)
+ parameters.append(Parameter(name, annotation=annotation,
+ kind=_VAR_POSITIONAL))
+
+ # Keyword-only parameters.
+ for name in keyword_only:
+ default = _empty
+ if kwdefaults is not None:
+ default = kwdefaults.get(name, _empty)
+
+ annotation = annotations.get(name, _empty)
+ parameters.append(Parameter(name, annotation=annotation,
+ kind=_KEYWORD_ONLY,
+ default=default))
+ # **kwargs
+ if func_code.co_flags & 0x08:
+ index = pos_count + keyword_only_count
+ if func_code.co_flags & 0x04:
+ index += 1
+
+ name = arg_names[index]
+ annotation = annotations.get(name, _empty)
+ parameters.append(Parameter(name, annotation=annotation,
+ kind=_VAR_KEYWORD))
+
+ return cls(parameters,
+ return_annotation=annotations.get('return', _empty),
+ __validate_parameters__=False)
+
+ @property
+ def parameters(self):
+ return self._parameters
+
+ @property
+ def return_annotation(self):
+ return self._return_annotation
+
+ def replace(self, *, parameters=_void, return_annotation=_void):
+ '''Creates a customized copy of the Signature.
+ Pass 'parameters' and/or 'return_annotation' arguments
+ to override them in the new copy.
+ '''
+
+ if parameters is _void:
+ parameters = self.parameters.values()
+
+ if return_annotation is _void:
+ return_annotation = self._return_annotation
+
+ return type(self)(parameters,
+ return_annotation=return_annotation)
+
+ def __eq__(self, other):
+ if (not issubclass(type(other), Signature) or
+ self.return_annotation != other.return_annotation or
+ len(self.parameters) != len(other.parameters)):
+ return False
+
+ other_positions = {param: idx
+ for idx, param in enumerate(other.parameters.keys())}
+
+ for idx, (param_name, param) in enumerate(self.parameters.items()):
+ if param.kind == _KEYWORD_ONLY:
+ try:
+ other_param = other.parameters[param_name]
+ except KeyError:
+ return False
+ else:
+ if param != other_param:
+ return False
+ else:
+ try:
+ other_idx = other_positions[param_name]
+ except KeyError:
+ return False
+ else:
+ if (idx != other_idx or
+ param != other.parameters[param_name]):
+ return False
+
+ return True
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+ def _bind(self, args, kwargs, *, partial=False):
+ '''Private method. Don't use directly.'''
+
+ arguments = OrderedDict()
+
+ parameters = iter(self.parameters.values())
+ parameters_ex = ()
+ arg_vals = iter(args)
+
+ if partial:
+ # Support for binding arguments to 'functools.partial' objects.
+ # See 'functools.partial' case in 'signature()' implementation
+ # for details.
+ for param_name, param in self.parameters.items():
+ if (param._partial_kwarg and param_name not in kwargs):
+ # Simulating 'functools.partial' behavior
+ kwargs[param_name] = param.default
+
+ while True:
+ # Let's iterate through the positional arguments and corresponding
+ # parameters
+ try:
+ arg_val = next(arg_vals)
+ except StopIteration:
+ # No more positional arguments
+ try:
+ param = next(parameters)
+ except StopIteration:
+ # No more parameters. That's it. Just need to check that
+ # we have no `kwargs` after this while loop
+ break
+ else:
+ if param.kind == _VAR_POSITIONAL:
+ # That's OK, just empty *args. Let's start parsing
+ # kwargs
+ break
+ elif param.name in kwargs:
+ if param.kind == _POSITIONAL_ONLY:
+ msg = '{arg!r} parameter is positional only, ' \
+ 'but was passed as a keyword'
+ msg = msg.format(arg=param.name)
+ raise TypeError(msg) from None
+ parameters_ex = (param,)
+ break
+ elif (param.kind == _VAR_KEYWORD or
+ param.default is not _empty):
+ # That's fine too - we have a default value for this
+ # parameter. So, lets start parsing `kwargs`, starting
+ # with the current parameter
+ parameters_ex = (param,)
+ break
+ else:
+ if partial:
+ parameters_ex = (param,)
+ break
+ else:
+ msg = '{arg!r} parameter lacking default value'
+ msg = msg.format(arg=param.name)
+ raise TypeError(msg) from None
+ else:
+ # We have a positional argument to process
+ try:
+ param = next(parameters)
+ except StopIteration:
+ raise TypeError('too many positional arguments') from None
+ else:
+ if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
+ # Looks like we have no parameter for this positional
+ # argument
+ raise TypeError('too many positional arguments')
+
+ if param.kind == _VAR_POSITIONAL:
+ # We have an '*args'-like argument, let's fill it with
+ # all positional arguments we have left and move on to
+ # the next phase
+ values = [arg_val]
+ values.extend(arg_vals)
+ arguments[param.name] = tuple(values)
+ break
+
+ if param.name in kwargs:
+ raise TypeError('multiple values for argument '
+ '{arg!r}'.format(arg=param.name))
+
+ arguments[param.name] = arg_val
+
+ # Now, we iterate through the remaining parameters to process
+ # keyword arguments
+ kwargs_param = None
+ for param in itertools.chain(parameters_ex, parameters):
+ if param.kind == _POSITIONAL_ONLY:
+ # This should never happen in case of a properly built
+ # Signature object (but let's have this check here
+ # to ensure correct behaviour just in case)
+ raise TypeError('{arg!r} parameter is positional only, '
+ 'but was passed as a keyword'. \
+ format(arg=param.name))
+
+ if param.kind == _VAR_KEYWORD:
+ # Memorize that we have a '**kwargs'-like parameter
+ kwargs_param = param
+ continue
+
+ param_name = param.name
+ try:
+ arg_val = kwargs.pop(param_name)
+ except KeyError:
+ # We have no value for this parameter. It's fine though,
+ # if it has a default value, or it is an '*args'-like
+ # parameter, left alone by the processing of positional
+ # arguments.
+ if (not partial and param.kind != _VAR_POSITIONAL and
+ param.default is _empty):
+ raise TypeError('{arg!r} parameter lacking default value'. \
+ format(arg=param_name)) from None
+
+ else:
+ arguments[param_name] = arg_val
+
+ if kwargs:
+ if kwargs_param is not None:
+ # Process our '**kwargs'-like parameter
+ arguments[kwargs_param.name] = kwargs
+ else:
+ raise TypeError('too many keyword arguments')
+
+ return self._bound_arguments_cls(self, arguments)
+
+ def bind(self, *args, **kwargs):
+ '''Get a BoundArguments object, that maps the passed `args`
+ and `kwargs` to the function's signature. Raises `TypeError`
+ if the passed arguments can not be bound.
+ '''
+ return self._bind(args, kwargs)
+
+ def bind_partial(self, *args, **kwargs):
+ '''Get a BoundArguments object, that partially maps the
+ passed `args` and `kwargs` to the function's signature.
+ Raises `TypeError` if the passed arguments can not be bound.
+ '''
+ return self._bind(args, kwargs, partial=True)
+
+ def __str__(self):
+ result = []
+ render_kw_only_separator = True
+ for idx, param in enumerate(self.parameters.values()):
+ formatted = str(param)
+
+ kind = param.kind
+ if kind == _VAR_POSITIONAL:
+ # OK, we have an '*args'-like parameter, so we won't need
+ # a '*' to separate keyword-only arguments
+ render_kw_only_separator = False
+ elif kind == _KEYWORD_ONLY and render_kw_only_separator:
+ # We have a keyword-only parameter to render and we haven't
+ # rendered an '*args'-like parameter before, so add a '*'
+ # separator to the parameters list ("foo(arg1, *, arg2)" case)
+ result.append('*')
+ # This condition should be only triggered once, so
+ # reset the flag
+ render_kw_only_separator = False
+
+ result.append(formatted)
+
+ rendered = '({})'.format(', '.join(result))
+
+ if self.return_annotation is not _empty:
+ anno = formatannotation(self.return_annotation)
+ rendered += ' -> {}'.format(anno)
+
+ return rendered
diff --git a/Lib/io.py b/Lib/io.py
index a59a75a..cfb70ac 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -58,6 +58,9 @@ from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation,
OpenWrapper = _io.open # for compatibility with _pyio
+# Pretend this exception was created here.
+UnsupportedOperation.__module__ = "io"
+
# for seek()
SEEK_SET = 0
SEEK_CUR = 1
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
new file mode 100644
index 0000000..532e44e
--- /dev/null
+++ b/Lib/ipaddress.py
@@ -0,0 +1,2094 @@
+# Copyright 2007 Google Inc.
+# Licensed to PSF under a Contributor Agreement.
+
+"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
+
+This library is used to create/poke/manipulate IPv4 and IPv6 addresses
+and networks.
+
+"""
+
+__version__ = '1.0'
+
+
+import functools
+
+IPV4LENGTH = 32
+IPV6LENGTH = 128
+
+class AddressValueError(ValueError):
+ """A Value Error related to the address."""
+
+
+class NetmaskValueError(ValueError):
+ """A Value Error related to the netmask."""
+
+
+def ip_address(address):
+ """Take an IP string/int and return an object of the correct type.
+
+ Args:
+ address: A string or integer, the IP address. Either IPv4 or
+ IPv6 addresses may be supplied; integers less than 2**32 will
+ be considered to be IPv4 by default.
+
+ Returns:
+ An IPv4Address or IPv6Address object.
+
+ Raises:
+ ValueError: if the *address* passed isn't either a v4 or a v6
+ address
+
+ """
+ try:
+ return IPv4Address(address)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ try:
+ return IPv6Address(address)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
+ address)
+
+
+def ip_network(address, strict=True):
+ """Take an IP string/int and return an object of the correct type.
+
+ Args:
+ address: A string or integer, the IP network. Either IPv4 or
+ IPv6 networks may be supplied; integers less than 2**32 will
+ be considered to be IPv4 by default.
+
+ Returns:
+ An IPv4Network or IPv6Network object.
+
+ Raises:
+ ValueError: if the string passed isn't either a v4 or a v6
+ address. Or if the network has host bits set.
+
+ """
+ try:
+ return IPv4Network(address, strict)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ try:
+ return IPv6Network(address, strict)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
+ address)
+
+
+def ip_interface(address):
+ """Take an IP string/int and return an object of the correct type.
+
+ Args:
+ address: A string or integer, the IP address. Either IPv4 or
+ IPv6 addresses may be supplied; integers less than 2**32 will
+ be considered to be IPv4 by default.
+
+ Returns:
+ An IPv4Interface or IPv6Interface object.
+
+ Raises:
+ ValueError: if the string passed isn't either a v4 or a v6
+ address.
+
+ Notes:
+ The IPv?Interface classes describe an Address on a particular
+ Network, so they're basically a combination of both the Address
+ and Network classes.
+
+ """
+ try:
+ return IPv4Interface(address)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ try:
+ return IPv6Interface(address)
+ except (AddressValueError, NetmaskValueError):
+ pass
+
+ raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
+ address)
+
+
+def v4_int_to_packed(address):
+ """Represent an address as 4 packed bytes in network (big-endian) order.
+
+ Args:
+ address: An integer representation of an IPv4 IP address.
+
+ Returns:
+ The integer address packed as 4 bytes in network (big-endian) order.
+
+ Raises:
+ ValueError: If the integer is negative or too large to be an
+ IPv4 IP address.
+
+ """
+ try:
+ return address.to_bytes(4, 'big')
+ except:
+ raise ValueError("Address negative or too large for IPv4")
+
+
+def v6_int_to_packed(address):
+ """Represent an address as 16 packed bytes in network (big-endian) order.
+
+ Args:
+ address: An integer representation of an IPv6 IP address.
+
+ Returns:
+ The integer address packed as 16 bytes in network (big-endian) order.
+
+ """
+ try:
+ return address.to_bytes(16, 'big')
+ except:
+ raise ValueError("Address negative or too large for IPv6")
+
+
+def _split_optional_netmask(address):
+ """Helper to split the netmask and raise AddressValueError if needed"""
+ addr = str(address).split('/')
+ if len(addr) > 2:
+ raise AddressValueError("Only one '/' permitted in %r" % address)
+ return addr
+
+
+def _find_address_range(addresses):
+ """Find a sequence of IPv#Address.
+
+ Args:
+ addresses: a list of IPv#Address objects.
+
+ Returns:
+ A tuple containing the first and last IP addresses in the sequence.
+
+ """
+ first = last = addresses[0]
+ for ip in addresses[1:]:
+ if ip._ip == last._ip + 1:
+ last = ip
+ else:
+ break
+ return (first, last)
+
+
+def _count_righthand_zero_bits(number, bits):
+ """Count the number of zero bits on the right hand side.
+
+ Args:
+ number: an integer.
+ bits: maximum number of bits to count.
+
+ Returns:
+ The number of zero bits on the right hand side of the number.
+
+ """
+ if number == 0:
+ return bits
+ for i in range(bits):
+ if (number >> i) & 1:
+ return i
+ # All bits of interest were zero, even if there are more in the number
+ return bits
+
+
+def summarize_address_range(first, last):
+ """Summarize a network range given the first and last IP addresses.
+
+ Example:
+ >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
+ ... IPv4Address('192.0.2.130')))
+ ... #doctest: +NORMALIZE_WHITESPACE
+ [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
+ IPv4Network('192.0.2.130/32')]
+
+ Args:
+ first: the first IPv4Address or IPv6Address in the range.
+ last: the last IPv4Address or IPv6Address in the range.
+
+ Returns:
+ An iterator of the summarized IPv(4|6) network objects.
+
+ Raise:
+ TypeError:
+ If the first and last objects are not IP addresses.
+ If the first and last objects are not the same version.
+ ValueError:
+ If the last object is not greater than the first.
+ If the version of the first address is not 4 or 6.
+
+ """
+ if (not (isinstance(first, _BaseAddress) and
+ isinstance(last, _BaseAddress))):
+ raise TypeError('first and last must be IP addresses, not networks')
+ if first.version != last.version:
+ raise TypeError("%s and %s are not of the same version" % (
+ first, last))
+ if first > last:
+ raise ValueError('last IP address must be greater than first')
+
+ if first.version == 4:
+ ip = IPv4Network
+ elif first.version == 6:
+ ip = IPv6Network
+ else:
+ raise ValueError('unknown IP version')
+
+ ip_bits = first._max_prefixlen
+ first_int = first._ip
+ last_int = last._ip
+ while first_int <= last_int:
+ nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
+ (last_int - first_int + 1).bit_length() - 1)
+ net = ip('%s/%d' % (first, ip_bits - nbits))
+ yield net
+ first_int += 1 << nbits
+ if first_int - 1 == ip._ALL_ONES:
+ break
+ first = first.__class__(first_int)
+
+
+def _collapse_addresses_recursive(addresses):
+ """Loops through the addresses, collapsing concurrent netblocks.
+
+ Example:
+
+ ip1 = IPv4Network('192.0.2.0/26')
+ ip2 = IPv4Network('192.0.2.64/26')
+ ip3 = IPv4Network('192.0.2.128/26')
+ ip4 = IPv4Network('192.0.2.192/26')
+
+ _collapse_addresses_recursive([ip1, ip2, ip3, ip4]) ->
+ [IPv4Network('192.0.2.0/24')]
+
+ This shouldn't be called directly; it is called via
+ collapse_addresses([]).
+
+ Args:
+ addresses: A list of IPv4Network's or IPv6Network's
+
+ Returns:
+ A list of IPv4Network's or IPv6Network's depending on what we were
+ passed.
+
+ """
+ while True:
+ last_addr = None
+ ret_array = []
+ optimized = False
+
+ for cur_addr in addresses:
+ if not ret_array:
+ last_addr = cur_addr
+ ret_array.append(cur_addr)
+ elif (cur_addr.network_address >= last_addr.network_address and
+ cur_addr.broadcast_address <= last_addr.broadcast_address):
+ optimized = True
+ elif cur_addr == list(last_addr.supernet().subnets())[1]:
+ ret_array[-1] = last_addr = last_addr.supernet()
+ optimized = True
+ else:
+ last_addr = cur_addr
+ ret_array.append(cur_addr)
+
+ addresses = ret_array
+ if not optimized:
+ return addresses
+
+
+def collapse_addresses(addresses):
+ """Collapse a list of IP objects.
+
+ Example:
+ collapse_addresses([IPv4Network('192.0.2.0/25'),
+ IPv4Network('192.0.2.128/25')]) ->
+ [IPv4Network('192.0.2.0/24')]
+
+ Args:
+ addresses: An iterator of IPv4Network or IPv6Network objects.
+
+ Returns:
+ An iterator of the collapsed IPv(4|6)Network objects.
+
+ Raises:
+ TypeError: If passed a list of mixed version objects.
+
+ """
+ i = 0
+ addrs = []
+ ips = []
+ nets = []
+
+ # split IP addresses and networks
+ for ip in addresses:
+ if isinstance(ip, _BaseAddress):
+ if ips and ips[-1]._version != ip._version:
+ raise TypeError("%s and %s are not of the same version" % (
+ ip, ips[-1]))
+ ips.append(ip)
+ elif ip._prefixlen == ip._max_prefixlen:
+ if ips and ips[-1]._version != ip._version:
+ raise TypeError("%s and %s are not of the same version" % (
+ ip, ips[-1]))
+ try:
+ ips.append(ip.ip)
+ except AttributeError:
+ ips.append(ip.network_address)
+ else:
+ if nets and nets[-1]._version != ip._version:
+ raise TypeError("%s and %s are not of the same version" % (
+ ip, nets[-1]))
+ nets.append(ip)
+
+ # sort and dedup
+ ips = sorted(set(ips))
+ nets = sorted(set(nets))
+
+ while i < len(ips):
+ (first, last) = _find_address_range(ips[i:])
+ i = ips.index(last) + 1
+ addrs.extend(summarize_address_range(first, last))
+
+ return iter(_collapse_addresses_recursive(sorted(
+ addrs + nets, key=_BaseNetwork._get_networks_key)))
+
+
+def get_mixed_type_key(obj):
+ """Return a key suitable for sorting between networks and addresses.
+
+ Address and Network objects are not sortable by default; they're
+ fundamentally different so the expression
+
+ IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
+
+ doesn't make any sense. There are some times however, where you may wish
+ to have ipaddress sort these for you anyway. If you need to do this, you
+ can use this function as the key= argument to sorted().
+
+ Args:
+ obj: either a Network or Address object.
+ Returns:
+ appropriate key.
+
+ """
+ if isinstance(obj, _BaseNetwork):
+ return obj._get_networks_key()
+ elif isinstance(obj, _BaseAddress):
+ return obj._get_address_key()
+ return NotImplemented
+
+
+class _TotalOrderingMixin:
+ # Helper that derives the other comparison operations from
+ # __lt__ and __eq__
+ # We avoid functools.total_ordering because it doesn't handle
+ # NotImplemented correctly yet (http://bugs.python.org/issue10042)
+ def __eq__(self, other):
+ raise NotImplementedError
+ def __ne__(self, other):
+ equal = self.__eq__(other)
+ if equal is NotImplemented:
+ return NotImplemented
+ return not equal
+ def __lt__(self, other):
+ raise NotImplementedError
+ def __le__(self, other):
+ less = self.__lt__(other)
+ if less is NotImplemented or not less:
+ return self.__eq__(other)
+ return less
+ def __gt__(self, other):
+ less = self.__lt__(other)
+ if less is NotImplemented:
+ return NotImplemented
+ equal = self.__eq__(other)
+ if equal is NotImplemented:
+ return NotImplemented
+ return not (less or equal)
+ def __ge__(self, other):
+ less = self.__lt__(other)
+ if less is NotImplemented:
+ return NotImplemented
+ return not less
+
+class _IPAddressBase(_TotalOrderingMixin):
+
+ """The mother class."""
+
+ @property
+ def exploded(self):
+ """Return the longhand version of the IP address as a string."""
+ return self._explode_shorthand_ip_string()
+
+ @property
+ def compressed(self):
+ """Return the shorthand version of the IP address as a string."""
+ return str(self)
+
+ @property
+ def version(self):
+ msg = '%200s has no version specified' % (type(self),)
+ raise NotImplementedError(msg)
+
+ def _check_int_address(self, address):
+ if address < 0:
+ msg = "%d (< 0) is not permitted as an IPv%d address"
+ raise AddressValueError(msg % (address, self._version))
+ if address > self._ALL_ONES:
+ msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
+ raise AddressValueError(msg % (address, self._max_prefixlen,
+ self._version))
+
+ def _check_packed_address(self, address, expected_len):
+ address_len = len(address)
+ if address_len != expected_len:
+ msg = "%r (len %d != %d) is not permitted as an IPv%d address"
+ raise AddressValueError(msg % (address, address_len,
+ expected_len, self._version))
+
+ def _ip_int_from_prefix(self, prefixlen=None):
+ """Turn the prefix length netmask into a int for comparison.
+
+ Args:
+ prefixlen: An integer, the prefix length.
+
+ Returns:
+ An integer.
+
+ """
+ if prefixlen is None:
+ prefixlen = self._prefixlen
+ return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen)
+
+ def _prefix_from_ip_int(self, ip_int, mask=32):
+ """Return prefix length from the decimal netmask.
+
+ Args:
+ ip_int: An integer, the IP address.
+ mask: The netmask. Defaults to 32.
+
+ Returns:
+ An integer, the prefix length.
+
+ """
+ return mask - _count_righthand_zero_bits(ip_int, mask)
+
+ def _ip_string_from_prefix(self, prefixlen=None):
+ """Turn a prefix length into a dotted decimal string.
+
+ Args:
+ prefixlen: An integer, the netmask prefix length.
+
+ Returns:
+ A string, the dotted decimal netmask string.
+
+ """
+ if not prefixlen:
+ prefixlen = self._prefixlen
+ return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen))
+
+
+class _BaseAddress(_IPAddressBase):
+
+ """A generic IP object.
+
+ This IP class contains the version independent methods which are
+ used by single IP addresses.
+
+ """
+
+ def __init__(self, address):
+ if (not isinstance(address, bytes)
+ and '/' in str(address)):
+ raise AddressValueError("Unexpected '/' in %r" % address)
+
+ def __int__(self):
+ return self._ip
+
+ def __eq__(self, other):
+ try:
+ return (self._ip == other._ip
+ and self._version == other._version)
+ except AttributeError:
+ return NotImplemented
+
+ def __lt__(self, other):
+ if self._version != other._version:
+ raise TypeError('%s and %s are not of the same version' % (
+ self, other))
+ if not isinstance(other, _BaseAddress):
+ raise TypeError('%s and %s are not of the same type' % (
+ self, other))
+ if self._ip != other._ip:
+ return self._ip < other._ip
+ return False
+
+ # Shorthand for Integer addition and subtraction. This is not
+ # meant to ever support addition/subtraction of addresses.
+ def __add__(self, other):
+ if not isinstance(other, int):
+ return NotImplemented
+ return self.__class__(int(self) + other)
+
+ def __sub__(self, other):
+ if not isinstance(other, int):
+ return NotImplemented
+ return self.__class__(int(self) - other)
+
+ def __repr__(self):
+ return '%s(%r)' % (self.__class__.__name__, str(self))
+
+ def __str__(self):
+ return str(self._string_from_ip_int(self._ip))
+
+ def __hash__(self):
+ return hash(hex(int(self._ip)))
+
+ def _get_address_key(self):
+ return (self._version, self)
+
+
+class _BaseNetwork(_IPAddressBase):
+
+ """A generic IP network object.
+
+ This IP class contains the version independent methods which are
+ used by networks.
+
+ """
+ def __init__(self, address):
+ self._cache = {}
+
+ def __repr__(self):
+ return '%s(%r)' % (self.__class__.__name__, str(self))
+
+ def __str__(self):
+ return '%s/%d' % (self.network_address, self.prefixlen)
+
+ def hosts(self):
+ """Generate Iterator over usable hosts in a network.
+
+ This is like __iter__ except it doesn't return the network
+ or broadcast addresses.
+
+ """
+ network = int(self.network_address)
+ broadcast = int(self.broadcast_address)
+ for x in range(network + 1, broadcast):
+ yield self._address_class(x)
+
+ def __iter__(self):
+ network = int(self.network_address)
+ broadcast = int(self.broadcast_address)
+ for x in range(network, broadcast + 1):
+ yield self._address_class(x)
+
+ def __getitem__(self, n):
+ network = int(self.network_address)
+ broadcast = int(self.broadcast_address)
+ if n >= 0:
+ if network + n > broadcast:
+ raise IndexError
+ return self._address_class(network + n)
+ else:
+ n += 1
+ if broadcast + n < network:
+ raise IndexError
+ return self._address_class(broadcast + n)
+
+ def __lt__(self, other):
+ if self._version != other._version:
+ raise TypeError('%s and %s are not of the same version' % (
+ self, other))
+ if not isinstance(other, _BaseNetwork):
+ raise TypeError('%s and %s are not of the same type' % (
+ self, other))
+ if self.network_address != other.network_address:
+ return self.network_address < other.network_address
+ if self.netmask != other.netmask:
+ return self.netmask < other.netmask
+ return False
+
+ def __eq__(self, other):
+ try:
+ return (self._version == other._version and
+ self.network_address == other.network_address and
+ int(self.netmask) == int(other.netmask))
+ except AttributeError:
+ return NotImplemented
+
+ def __hash__(self):
+ return hash(int(self.network_address) ^ int(self.netmask))
+
+ def __contains__(self, other):
+ # always false if one is v4 and the other is v6.
+ if self._version != other._version:
+ return False
+ # dealing with another network.
+ if isinstance(other, _BaseNetwork):
+ return False
+ # dealing with another address
+ else:
+ # address
+ return (int(self.network_address) <= int(other._ip) <=
+ int(self.broadcast_address))
+
+ def overlaps(self, other):
+ """Tell if self is partly contained in other."""
+ return self.network_address in other or (
+ self.broadcast_address in other or (
+ other.network_address in self or (
+ other.broadcast_address in self)))
+
+ @property
+ def broadcast_address(self):
+ x = self._cache.get('broadcast_address')
+ if x is None:
+ x = self._address_class(int(self.network_address) |
+ int(self.hostmask))
+ self._cache['broadcast_address'] = x
+ return x
+
+ @property
+ def hostmask(self):
+ x = self._cache.get('hostmask')
+ if x is None:
+ x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
+ self._cache['hostmask'] = x
+ return x
+
+ @property
+ def with_prefixlen(self):
+ return '%s/%d' % (self.network_address, self._prefixlen)
+
+ @property
+ def with_netmask(self):
+ return '%s/%s' % (self.network_address, self.netmask)
+
+ @property
+ def with_hostmask(self):
+ return '%s/%s' % (self.network_address, self.hostmask)
+
+ @property
+ def num_addresses(self):
+ """Number of hosts in the current subnet."""
+ return int(self.broadcast_address) - int(self.network_address) + 1
+
+ @property
+ def _address_class(self):
+ # Returning bare address objects (rather than interfaces) allows for
+ # more consistent behaviour across the network address, broadcast
+ # address and individual host addresses.
+ msg = '%200s has no associated address class' % (type(self),)
+ raise NotImplementedError(msg)
+
+ @property
+ def prefixlen(self):
+ return self._prefixlen
+
+ def address_exclude(self, other):
+ """Remove an address from a larger block.
+
+ For example:
+
+ addr1 = ip_network('192.0.2.0/28')
+ addr2 = ip_network('192.0.2.1/32')
+ addr1.address_exclude(addr2) =
+ [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
+ IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
+
+ or IPv6:
+
+ addr1 = ip_network('2001:db8::1/32')
+ addr2 = ip_network('2001:db8::1/128')
+ addr1.address_exclude(addr2) =
+ [ip_network('2001:db8::1/128'),
+ ip_network('2001:db8::2/127'),
+ ip_network('2001:db8::4/126'),
+ ip_network('2001:db8::8/125'),
+ ...
+ ip_network('2001:db8:8000::/33')]
+
+ Args:
+ other: An IPv4Network or IPv6Network object of the same type.
+
+ Returns:
+ An iterator of the the IPv(4|6)Network objects which is self
+ minus other.
+
+ Raises:
+ TypeError: If self and other are of difffering address
+ versions, or if other is not a network object.
+ ValueError: If other is not completely contained by self.
+
+ """
+ if not self._version == other._version:
+ raise TypeError("%s and %s are not of the same version" % (
+ self, other))
+
+ if not isinstance(other, _BaseNetwork):
+ raise TypeError("%s is not a network object" % other)
+
+ if not (other.network_address >= self.network_address and
+ other.broadcast_address <= self.broadcast_address):
+ raise ValueError('%s not contained in %s' % (other, self))
+ if other == self:
+ raise StopIteration
+
+ # Make sure we're comparing the network of other.
+ other = other.__class__('%s/%s' % (other.network_address,
+ other.prefixlen))
+
+ s1, s2 = self.subnets()
+ while s1 != other and s2 != other:
+ if (other.network_address >= s1.network_address and
+ other.broadcast_address <= s1.broadcast_address):
+ yield s2
+ s1, s2 = s1.subnets()
+ elif (other.network_address >= s2.network_address and
+ other.broadcast_address <= s2.broadcast_address):
+ yield s1
+ s1, s2 = s2.subnets()
+ else:
+ # If we got here, there's a bug somewhere.
+ raise AssertionError('Error performing exclusion: '
+ 's1: %s s2: %s other: %s' %
+ (s1, s2, other))
+ if s1 == other:
+ yield s2
+ elif s2 == other:
+ yield s1
+ else:
+ # If we got here, there's a bug somewhere.
+ raise AssertionError('Error performing exclusion: '
+ 's1: %s s2: %s other: %s' %
+ (s1, s2, other))
+
+ def compare_networks(self, other):
+ """Compare two IP objects.
+
+ This is only concerned about the comparison of the integer
+ representation of the network addresses. This means that the
+ host bits aren't considered at all in this method. If you want
+ to compare host bits, you can easily enough do a
+ 'HostA._ip < HostB._ip'
+
+ Args:
+ other: An IP object.
+
+ Returns:
+ If the IP versions of self and other are the same, returns:
+
+ -1 if self < other:
+ eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
+ IPv6Network('2001:db8::1000/124') <
+ IPv6Network('2001:db8::2000/124')
+ 0 if self == other
+ eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
+ IPv6Network('2001:db8::1000/124') ==
+ IPv6Network('2001:db8::1000/124')
+ 1 if self > other
+ eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
+ IPv6Network('2001:db8::2000/124') >
+ IPv6Network('2001:db8::1000/124')
+
+ Raises:
+ TypeError if the IP versions are different.
+
+ """
+ # does this need to raise a ValueError?
+ if self._version != other._version:
+ raise TypeError('%s and %s are not of the same type' % (
+ self, other))
+ # self._version == other._version below here:
+ if self.network_address < other.network_address:
+ return -1
+ if self.network_address > other.network_address:
+ return 1
+ # self.network_address == other.network_address below here:
+ if self.netmask < other.netmask:
+ return -1
+ if self.netmask > other.netmask:
+ return 1
+ return 0
+
+ def _get_networks_key(self):
+ """Network-only key function.
+
+ Returns an object that identifies this address' network and
+ netmask. This function is a suitable "key" argument for sorted()
+ and list.sort().
+
+ """
+ return (self._version, self.network_address, self.netmask)
+
+ def subnets(self, prefixlen_diff=1, new_prefix=None):
+ """The subnets which join to make the current subnet.
+
+ In the case that self contains only one IP
+ (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
+ for IPv6), yield an iterator with just ourself.
+
+ Args:
+ prefixlen_diff: An integer, the amount the prefix length
+ should be increased by. This should not be set if
+ new_prefix is also set.
+ new_prefix: The desired new prefix length. This must be a
+ larger number (smaller prefix) than the existing prefix.
+ This should not be set if prefixlen_diff is also set.
+
+ Returns:
+ An iterator of IPv(4|6) objects.
+
+ Raises:
+ ValueError: The prefixlen_diff is too small or too large.
+ OR
+ prefixlen_diff and new_prefix are both set or new_prefix
+ is a smaller number than the current prefix (smaller
+ number means a larger network)
+
+ """
+ if self._prefixlen == self._max_prefixlen:
+ yield self
+ return
+
+ if new_prefix is not None:
+ if new_prefix < self._prefixlen:
+ raise ValueError('new prefix must be longer')
+ if prefixlen_diff != 1:
+ raise ValueError('cannot set prefixlen_diff and new_prefix')
+ prefixlen_diff = new_prefix - self._prefixlen
+
+ if prefixlen_diff < 0:
+ raise ValueError('prefix length diff must be > 0')
+ new_prefixlen = self._prefixlen + prefixlen_diff
+
+ if not self._is_valid_netmask(str(new_prefixlen)):
+ raise ValueError(
+ 'prefix length diff %d is invalid for netblock %s' % (
+ new_prefixlen, self))
+
+ first = self.__class__('%s/%s' %
+ (self.network_address,
+ self._prefixlen + prefixlen_diff))
+
+ yield first
+ current = first
+ while True:
+ broadcast = current.broadcast_address
+ if broadcast == self.broadcast_address:
+ return
+ new_addr = self._address_class(int(broadcast) + 1)
+ current = self.__class__('%s/%s' % (new_addr,
+ new_prefixlen))
+
+ yield current
+
+ def supernet(self, prefixlen_diff=1, new_prefix=None):
+ """The supernet containing the current network.
+
+ Args:
+ prefixlen_diff: An integer, the amount the prefix length of
+ the network should be decreased by. For example, given a
+ /24 network and a prefixlen_diff of 3, a supernet with a
+ /21 netmask is returned.
+
+ Returns:
+ An IPv4 network object.
+
+ Raises:
+ ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
+ a negative prefix length.
+ OR
+ If prefixlen_diff and new_prefix are both set or new_prefix is a
+ larger number than the current prefix (larger number means a
+ smaller network)
+
+ """
+ if self._prefixlen == 0:
+ return self
+
+ if new_prefix is not None:
+ if new_prefix > self._prefixlen:
+ raise ValueError('new prefix must be shorter')
+ if prefixlen_diff != 1:
+ raise ValueError('cannot set prefixlen_diff and new_prefix')
+ prefixlen_diff = self._prefixlen - new_prefix
+
+ if self.prefixlen - prefixlen_diff < 0:
+ raise ValueError(
+ 'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
+ (self.prefixlen, prefixlen_diff))
+ # TODO (pmoody): optimize this.
+ t = self.__class__('%s/%d' % (self.network_address,
+ self.prefixlen - prefixlen_diff),
+ strict=False)
+ return t.__class__('%s/%d' % (t.network_address, t.prefixlen))
+
+ @property
+ def is_multicast(self):
+ """Test if the address is reserved for multicast use.
+
+ Returns:
+ A boolean, True if the address is a multicast address.
+ See RFC 2373 2.7 for details.
+
+ """
+ return (self.network_address.is_multicast and
+ self.broadcast_address.is_multicast)
+
+ @property
+ def is_reserved(self):
+ """Test if the address is otherwise IETF reserved.
+
+ Returns:
+ A boolean, True if the address is within one of the
+ reserved IPv6 Network ranges.
+
+ """
+ return (self.network_address.is_reserved and
+ self.broadcast_address.is_reserved)
+
+ @property
+ def is_link_local(self):
+ """Test if the address is reserved for link-local.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 4291.
+
+ """
+ return (self.network_address.is_link_local and
+ self.broadcast_address.is_link_local)
+
+ @property
+ def is_private(self):
+ """Test if this address is allocated for private networks.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 4193.
+
+ """
+ return (self.network_address.is_private and
+ self.broadcast_address.is_private)
+
+ @property
+ def is_unspecified(self):
+ """Test if the address is unspecified.
+
+ Returns:
+ A boolean, True if this is the unspecified address as defined in
+ RFC 2373 2.5.2.
+
+ """
+ return (self.network_address.is_unspecified and
+ self.broadcast_address.is_unspecified)
+
+ @property
+ def is_loopback(self):
+ """Test if the address is a loopback address.
+
+ Returns:
+ A boolean, True if the address is a loopback address as defined in
+ RFC 2373 2.5.3.
+
+ """
+ return (self.network_address.is_loopback and
+ self.broadcast_address.is_loopback)
+
+
+class _BaseV4:
+
+ """Base IPv4 object.
+
+ The following methods are used by IPv4 objects in both single IP
+ addresses and networks.
+
+ """
+
+ # Equivalent to 255.255.255.255 or 32 bits of 1's.
+ _ALL_ONES = (2**IPV4LENGTH) - 1
+ _DECIMAL_DIGITS = frozenset('0123456789')
+
+ # the valid octets for host and netmasks. only useful for IPv4.
+ _valid_mask_octets = frozenset((255, 254, 252, 248, 240, 224, 192, 128, 0))
+
+ def __init__(self, address):
+ self._version = 4
+ self._max_prefixlen = IPV4LENGTH
+
+ def _explode_shorthand_ip_string(self):
+ return str(self)
+
+ def _ip_int_from_string(self, ip_str):
+ """Turn the given IP string into an integer for comparison.
+
+ Args:
+ ip_str: A string, the IP ip_str.
+
+ Returns:
+ The IP ip_str as an integer.
+
+ Raises:
+ AddressValueError: if ip_str isn't a valid IPv4 Address.
+
+ """
+ if not ip_str:
+ raise AddressValueError('Address cannot be empty')
+
+ octets = ip_str.split('.')
+ if len(octets) != 4:
+ raise AddressValueError("Expected 4 octets in %r" % ip_str)
+
+ try:
+ return int.from_bytes(map(self._parse_octet, octets), 'big')
+ except ValueError as exc:
+ raise AddressValueError("%s in %r" % (exc, ip_str)) from None
+
+ def _parse_octet(self, octet_str):
+ """Convert a decimal octet into an integer.
+
+ Args:
+ octet_str: A string, the number to parse.
+
+ Returns:
+ The octet as an integer.
+
+ Raises:
+ ValueError: if the octet isn't strictly a decimal from [0..255].
+
+ """
+ if not octet_str:
+ raise ValueError("Empty octet not permitted")
+ # Whitelist the characters, since int() allows a lot of bizarre stuff.
+ if not self._DECIMAL_DIGITS.issuperset(octet_str):
+ msg = "Only decimal digits permitted in %r"
+ raise ValueError(msg % octet_str)
+ # We do the length check second, since the invalid character error
+ # is likely to be more informative for the user
+ if len(octet_str) > 3:
+ msg = "At most 3 characters permitted in %r"
+ raise ValueError(msg % octet_str)
+ # Convert to integer (we know digits are legal)
+ octet_int = int(octet_str, 10)
+ # Any octets that look like they *might* be written in octal,
+ # and which don't look exactly the same in both octal and
+ # decimal are rejected as ambiguous
+ if octet_int > 7 and octet_str[0] == '0':
+ msg = "Ambiguous (octal/decimal) value in %r not permitted"
+ raise ValueError(msg % octet_str)
+ if octet_int > 255:
+ raise ValueError("Octet %d (> 255) not permitted" % octet_int)
+ return octet_int
+
+ def _string_from_ip_int(self, ip_int):
+ """Turns a 32-bit integer into dotted decimal notation.
+
+ Args:
+ ip_int: An integer, the IP address.
+
+ Returns:
+ The IP address as a string in dotted decimal notation.
+
+ """
+ return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
+
+ def _is_valid_netmask(self, netmask):
+ """Verify that the netmask is valid.
+
+ Args:
+ netmask: A string, either a prefix or dotted decimal
+ netmask.
+
+ Returns:
+ A boolean, True if the prefix represents a valid IPv4
+ netmask.
+
+ """
+ mask = netmask.split('.')
+ if len(mask) == 4:
+ try:
+ for x in mask:
+ if int(x) not in self._valid_mask_octets:
+ return False
+ except ValueError:
+ # Found something that isn't an integer or isn't valid
+ return False
+ for idx, y in enumerate(mask):
+ if idx > 0 and y > mask[idx - 1]:
+ return False
+ return True
+ try:
+ netmask = int(netmask)
+ except ValueError:
+ return False
+ return 0 <= netmask <= self._max_prefixlen
+
+ def _is_hostmask(self, ip_str):
+ """Test if the IP string is a hostmask (rather than a netmask).
+
+ Args:
+ ip_str: A string, the potential hostmask.
+
+ Returns:
+ A boolean, True if the IP string is a hostmask.
+
+ """
+ bits = ip_str.split('.')
+ try:
+ parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
+ except ValueError:
+ return False
+ if len(parts) != len(bits):
+ return False
+ if parts[0] < parts[-1]:
+ return True
+ return False
+
+ @property
+ def max_prefixlen(self):
+ return self._max_prefixlen
+
+ @property
+ def version(self):
+ return self._version
+
+
+class IPv4Address(_BaseV4, _BaseAddress):
+
+ """Represent and manipulate single IPv4 Addresses."""
+
+ def __init__(self, address):
+
+ """
+ Args:
+ address: A string or integer representing the IP
+
+ Additionally, an integer can be passed, so
+ IPv4Address('192.0.2.1') == IPv4Address(3221225985).
+ or, more generally
+ IPv4Address(int(IPv4Address('192.0.2.1'))) ==
+ IPv4Address('192.0.2.1')
+
+ Raises:
+ AddressValueError: If ipaddress isn't a valid IPv4 address.
+
+ """
+ _BaseAddress.__init__(self, address)
+ _BaseV4.__init__(self, address)
+
+ # Efficient constructor from integer.
+ if isinstance(address, int):
+ self._check_int_address(address)
+ self._ip = address
+ return
+
+ # Constructing from a packed address
+ if isinstance(address, bytes):
+ self._check_packed_address(address, 4)
+ self._ip = int.from_bytes(address, 'big')
+ return
+
+ # Assume input argument to be string or any object representation
+ # which converts into a formatted IP string.
+ addr_str = str(address)
+ self._ip = self._ip_int_from_string(addr_str)
+
+ @property
+ def packed(self):
+ """The binary representation of this address."""
+ return v4_int_to_packed(self._ip)
+
+ @property
+ def is_reserved(self):
+ """Test if the address is otherwise IETF reserved.
+
+ Returns:
+ A boolean, True if the address is within the
+ reserved IPv4 Network range.
+
+ """
+ reserved_network = IPv4Network('240.0.0.0/4')
+ return self in reserved_network
+
+ @property
+ def is_private(self):
+ """Test if this address is allocated for private networks.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 1918.
+
+ """
+ private_10 = IPv4Network('10.0.0.0/8')
+ private_172 = IPv4Network('172.16.0.0/12')
+ private_192 = IPv4Network('192.168.0.0/16')
+ return (self in private_10 or
+ self in private_172 or
+ self in private_192)
+
+ @property
+ def is_multicast(self):
+ """Test if the address is reserved for multicast use.
+
+ Returns:
+ A boolean, True if the address is multicast.
+ See RFC 3171 for details.
+
+ """
+ multicast_network = IPv4Network('224.0.0.0/4')
+ return self in multicast_network
+
+ @property
+ def is_unspecified(self):
+ """Test if the address is unspecified.
+
+ Returns:
+ A boolean, True if this is the unspecified address as defined in
+ RFC 5735 3.
+
+ """
+ unspecified_address = IPv4Address('0.0.0.0')
+ return self == unspecified_address
+
+ @property
+ def is_loopback(self):
+ """Test if the address is a loopback address.
+
+ Returns:
+ A boolean, True if the address is a loopback per RFC 3330.
+
+ """
+ loopback_network = IPv4Network('127.0.0.0/8')
+ return self in loopback_network
+
+ @property
+ def is_link_local(self):
+ """Test if the address is reserved for link-local.
+
+ Returns:
+ A boolean, True if the address is link-local per RFC 3927.
+
+ """
+ linklocal_network = IPv4Network('169.254.0.0/16')
+ return self in linklocal_network
+
+
+class IPv4Interface(IPv4Address):
+
+ def __init__(self, address):
+ if isinstance(address, (bytes, int)):
+ IPv4Address.__init__(self, address)
+ self.network = IPv4Network(self._ip)
+ self._prefixlen = self._max_prefixlen
+ return
+
+ addr = _split_optional_netmask(address)
+ IPv4Address.__init__(self, addr[0])
+
+ self.network = IPv4Network(address, strict=False)
+ self._prefixlen = self.network._prefixlen
+
+ self.netmask = self.network.netmask
+ self.hostmask = self.network.hostmask
+
+ def __str__(self):
+ return '%s/%d' % (self._string_from_ip_int(self._ip),
+ self.network.prefixlen)
+
+ def __eq__(self, other):
+ address_equal = IPv4Address.__eq__(self, other)
+ if not address_equal or address_equal is NotImplemented:
+ return address_equal
+ try:
+ return self.network == other.network
+ except AttributeError:
+ # An interface with an associated network is NOT the
+ # same as an unassociated address. That's why the hash
+ # takes the extra info into account.
+ return False
+
+ def __lt__(self, other):
+ address_less = IPv4Address.__lt__(self, other)
+ if address_less is NotImplemented:
+ return NotImplemented
+ try:
+ return self.network < other.network
+ except AttributeError:
+ # We *do* allow addresses and interfaces to be sorted. The
+ # unassociated address is considered less than all interfaces.
+ return False
+
+ def __hash__(self):
+ return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+ @property
+ def ip(self):
+ return IPv4Address(self._ip)
+
+ @property
+ def with_prefixlen(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self._prefixlen)
+
+ @property
+ def with_netmask(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self.netmask)
+
+ @property
+ def with_hostmask(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self.hostmask)
+
+
+class IPv4Network(_BaseV4, _BaseNetwork):
+
+ """This class represents and manipulates 32-bit IPv4 network + addresses..
+
+ Attributes: [examples for IPv4Network('192.0.2.0/27')]
+ .network_address: IPv4Address('192.0.2.0')
+ .hostmask: IPv4Address('0.0.0.31')
+ .broadcast_address: IPv4Address('192.0.2.32')
+ .netmask: IPv4Address('255.255.255.224')
+ .prefixlen: 27
+
+ """
+ # Class to use when creating address objects
+ _address_class = IPv4Address
+
+ def __init__(self, address, strict=True):
+
+ """Instantiate a new IPv4 network object.
+
+ Args:
+ address: A string or integer representing the IP [& network].
+ '192.0.2.0/24'
+ '192.0.2.0/255.255.255.0'
+ '192.0.0.2/0.0.0.255'
+ are all functionally the same in IPv4. Similarly,
+ '192.0.2.1'
+ '192.0.2.1/255.255.255.255'
+ '192.0.2.1/32'
+ are also functionaly equivalent. That is to say, failing to
+ provide a subnetmask will create an object with a mask of /32.
+
+ If the mask (portion after the / in the argument) is given in
+ dotted quad form, it is treated as a netmask if it starts with a
+ non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
+ starts with a zero field (e.g. 0.255.255.255 == /8), with the
+ single exception of an all-zero mask which is treated as a
+ netmask == /0. If no mask is given, a default of /32 is used.
+
+ Additionally, an integer can be passed, so
+ IPv4Network('192.0.2.1') == IPv4Network(3221225985)
+ or, more generally
+ IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
+ IPv4Interface('192.0.2.1')
+
+ Raises:
+ AddressValueError: If ipaddress isn't a valid IPv4 address.
+ NetmaskValueError: If the netmask isn't valid for
+ an IPv4 address.
+ ValueError: If strict is True and a network address is not
+ supplied.
+
+ """
+
+ _BaseV4.__init__(self, address)
+ _BaseNetwork.__init__(self, address)
+
+ # Constructing from a packed address
+ if isinstance(address, bytes):
+ self.network_address = IPv4Address(address)
+ self._prefixlen = self._max_prefixlen
+ self.netmask = IPv4Address(self._ALL_ONES)
+ #fixme: address/network test here
+ return
+
+ # Efficient constructor from integer.
+ if isinstance(address, int):
+ self.network_address = IPv4Address(address)
+ self._prefixlen = self._max_prefixlen
+ self.netmask = IPv4Address(self._ALL_ONES)
+ #fixme: address/network test here.
+ return
+
+ # Assume input argument to be string or any object representation
+ # which converts into a formatted IP prefix string.
+ addr = _split_optional_netmask(address)
+ self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
+
+ if len(addr) == 2:
+ mask = addr[1].split('.')
+
+ if len(mask) == 4:
+ # We have dotted decimal netmask.
+ if self._is_valid_netmask(addr[1]):
+ self.netmask = IPv4Address(self._ip_int_from_string(
+ addr[1]))
+ elif self._is_hostmask(addr[1]):
+ self.netmask = IPv4Address(
+ self._ip_int_from_string(addr[1]) ^ self._ALL_ONES)
+ else:
+ raise NetmaskValueError('%r is not a valid netmask'
+ % addr[1])
+
+ self._prefixlen = self._prefix_from_ip_int(int(self.netmask))
+ else:
+ # We have a netmask in prefix length form.
+ if not self._is_valid_netmask(addr[1]):
+ raise NetmaskValueError('%r is not a valid netmask'
+ % addr[1])
+ self._prefixlen = int(addr[1])
+ self.netmask = IPv4Address(self._ip_int_from_prefix(
+ self._prefixlen))
+ else:
+ self._prefixlen = self._max_prefixlen
+ self.netmask = IPv4Address(self._ip_int_from_prefix(
+ self._prefixlen))
+
+ if strict:
+ if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
+ self.network_address):
+ raise ValueError('%s has host bits set' % self)
+ self.network_address = IPv4Address(int(self.network_address) &
+ int(self.netmask))
+
+ if self._prefixlen == (self._max_prefixlen - 1):
+ self.hosts = self.__iter__
+
+
+class _BaseV6:
+
+ """Base IPv6 object.
+
+ The following methods are used by IPv6 objects in both single IP
+ addresses and networks.
+
+ """
+
+ _ALL_ONES = (2**IPV6LENGTH) - 1
+ _HEXTET_COUNT = 8
+ _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
+
+ def __init__(self, address):
+ self._version = 6
+ self._max_prefixlen = IPV6LENGTH
+
+ def _ip_int_from_string(self, ip_str):
+ """Turn an IPv6 ip_str into an integer.
+
+ Args:
+ ip_str: A string, the IPv6 ip_str.
+
+ Returns:
+ An int, the IPv6 address
+
+ Raises:
+ AddressValueError: if ip_str isn't a valid IPv6 Address.
+
+ """
+ if not ip_str:
+ raise AddressValueError('Address cannot be empty')
+
+ parts = ip_str.split(':')
+
+ # An IPv6 address needs at least 2 colons (3 parts).
+ _min_parts = 3
+ if len(parts) < _min_parts:
+ msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
+ raise AddressValueError(msg)
+
+ # If the address has an IPv4-style suffix, convert it to hexadecimal.
+ if '.' in parts[-1]:
+ try:
+ ipv4_int = IPv4Address(parts.pop())._ip
+ except AddressValueError as exc:
+ raise AddressValueError("%s in %r" % (exc, ip_str)) from None
+ parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
+ parts.append('%x' % (ipv4_int & 0xFFFF))
+
+ # An IPv6 address can't have more than 8 colons (9 parts).
+ # The extra colon comes from using the "::" notation for a single
+ # leading or trailing zero part.
+ _max_parts = self._HEXTET_COUNT + 1
+ if len(parts) > _max_parts:
+ msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
+ raise AddressValueError(msg)
+
+ # Disregarding the endpoints, find '::' with nothing in between.
+ # This indicates that a run of zeroes has been skipped.
+ skip_index = None
+ for i in range(1, len(parts) - 1):
+ if not parts[i]:
+ if skip_index is not None:
+ # Can't have more than one '::'
+ msg = "At most one '::' permitted in %r" % ip_str
+ raise AddressValueError(msg)
+ skip_index = i
+
+ # parts_hi is the number of parts to copy from above/before the '::'
+ # parts_lo is the number of parts to copy from below/after the '::'
+ if skip_index is not None:
+ # If we found a '::', then check if it also covers the endpoints.
+ parts_hi = skip_index
+ parts_lo = len(parts) - skip_index - 1
+ if not parts[0]:
+ parts_hi -= 1
+ if parts_hi:
+ msg = "Leading ':' only permitted as part of '::' in %r"
+ raise AddressValueError(msg % ip_str) # ^: requires ^::
+ if not parts[-1]:
+ parts_lo -= 1
+ if parts_lo:
+ msg = "Trailing ':' only permitted as part of '::' in %r"
+ raise AddressValueError(msg % ip_str) # :$ requires ::$
+ parts_skipped = self._HEXTET_COUNT - (parts_hi + parts_lo)
+ if parts_skipped < 1:
+ msg = "Expected at most %d other parts with '::' in %r"
+ raise AddressValueError(msg % (self._HEXTET_COUNT-1, ip_str))
+ else:
+ # Otherwise, allocate the entire address to parts_hi. The
+ # endpoints could still be empty, but _parse_hextet() will check
+ # for that.
+ if len(parts) != self._HEXTET_COUNT:
+ msg = "Exactly %d parts expected without '::' in %r"
+ raise AddressValueError(msg % (self._HEXTET_COUNT, ip_str))
+ if not parts[0]:
+ msg = "Leading ':' only permitted as part of '::' in %r"
+ raise AddressValueError(msg % ip_str) # ^: requires ^::
+ if not parts[-1]:
+ msg = "Trailing ':' only permitted as part of '::' in %r"
+ raise AddressValueError(msg % ip_str) # :$ requires ::$
+ parts_hi = len(parts)
+ parts_lo = 0
+ parts_skipped = 0
+
+ try:
+ # Now, parse the hextets into a 128-bit integer.
+ ip_int = 0
+ for i in range(parts_hi):
+ ip_int <<= 16
+ ip_int |= self._parse_hextet(parts[i])
+ ip_int <<= 16 * parts_skipped
+ for i in range(-parts_lo, 0):
+ ip_int <<= 16
+ ip_int |= self._parse_hextet(parts[i])
+ return ip_int
+ except ValueError as exc:
+ raise AddressValueError("%s in %r" % (exc, ip_str)) from None
+
+ def _parse_hextet(self, hextet_str):
+ """Convert an IPv6 hextet string into an integer.
+
+ Args:
+ hextet_str: A string, the number to parse.
+
+ Returns:
+ The hextet as an integer.
+
+ Raises:
+ ValueError: if the input isn't strictly a hex number from
+ [0..FFFF].
+
+ """
+ # Whitelist the characters, since int() allows a lot of bizarre stuff.
+ if not self._HEX_DIGITS.issuperset(hextet_str):
+ raise ValueError("Only hex digits permitted in %r" % hextet_str)
+ # We do the length check second, since the invalid character error
+ # is likely to be more informative for the user
+ if len(hextet_str) > 4:
+ msg = "At most 4 characters permitted in %r"
+ raise ValueError(msg % hextet_str)
+ # Length check means we can skip checking the integer value
+ return int(hextet_str, 16)
+
+ def _compress_hextets(self, hextets):
+ """Compresses a list of hextets.
+
+ Compresses a list of strings, replacing the longest continuous
+ sequence of "0" in the list with "" and adding empty strings at
+ the beginning or at the end of the string such that subsequently
+ calling ":".join(hextets) will produce the compressed version of
+ the IPv6 address.
+
+ Args:
+ hextets: A list of strings, the hextets to compress.
+
+ Returns:
+ A list of strings.
+
+ """
+ best_doublecolon_start = -1
+ best_doublecolon_len = 0
+ doublecolon_start = -1
+ doublecolon_len = 0
+ for index, hextet in enumerate(hextets):
+ if hextet == '0':
+ doublecolon_len += 1
+ if doublecolon_start == -1:
+ # Start of a sequence of zeros.
+ doublecolon_start = index
+ if doublecolon_len > best_doublecolon_len:
+ # This is the longest sequence of zeros so far.
+ best_doublecolon_len = doublecolon_len
+ best_doublecolon_start = doublecolon_start
+ else:
+ doublecolon_len = 0
+ doublecolon_start = -1
+
+ if best_doublecolon_len > 1:
+ best_doublecolon_end = (best_doublecolon_start +
+ best_doublecolon_len)
+ # For zeros at the end of the address.
+ if best_doublecolon_end == len(hextets):
+ hextets += ['']
+ hextets[best_doublecolon_start:best_doublecolon_end] = ['']
+ # For zeros at the beginning of the address.
+ if best_doublecolon_start == 0:
+ hextets = [''] + hextets
+
+ return hextets
+
+ def _string_from_ip_int(self, ip_int=None):
+ """Turns a 128-bit integer into hexadecimal notation.
+
+ Args:
+ ip_int: An integer, the IP address.
+
+ Returns:
+ A string, the hexadecimal representation of the address.
+
+ Raises:
+ ValueError: The address is bigger than 128 bits of all ones.
+
+ """
+ if ip_int is None:
+ ip_int = int(self._ip)
+
+ if ip_int > self._ALL_ONES:
+ raise ValueError('IPv6 address is too large')
+
+ hex_str = '%032x' % ip_int
+ hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
+
+ hextets = self._compress_hextets(hextets)
+ return ':'.join(hextets)
+
+ def _explode_shorthand_ip_string(self):
+ """Expand a shortened IPv6 address.
+
+ Args:
+ ip_str: A string, the IPv6 address.
+
+ Returns:
+ A string, the expanded IPv6 address.
+
+ """
+ if isinstance(self, IPv6Network):
+ ip_str = str(self.network_address)
+ elif isinstance(self, IPv6Interface):
+ ip_str = str(self.ip)
+ else:
+ ip_str = str(self)
+
+ ip_int = self._ip_int_from_string(ip_str)
+ hex_str = '%032x' % ip_int
+ parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
+ if isinstance(self, (_BaseNetwork, IPv6Interface)):
+ return '%s/%d' % (':'.join(parts), self._prefixlen)
+ return ':'.join(parts)
+
+ @property
+ def max_prefixlen(self):
+ return self._max_prefixlen
+
+ @property
+ def version(self):
+ return self._version
+
+
+class IPv6Address(_BaseV6, _BaseAddress):
+
+ """Represent and manipulate single IPv6 Addresses."""
+
+ def __init__(self, address):
+ """Instantiate a new IPv6 address object.
+
+ Args:
+ address: A string or integer representing the IP
+
+ Additionally, an integer can be passed, so
+ IPv6Address('2001:db8::') ==
+ IPv6Address(42540766411282592856903984951653826560)
+ or, more generally
+ IPv6Address(int(IPv6Address('2001:db8::'))) ==
+ IPv6Address('2001:db8::')
+
+ Raises:
+ AddressValueError: If address isn't a valid IPv6 address.
+
+ """
+ _BaseAddress.__init__(self, address)
+ _BaseV6.__init__(self, address)
+
+ # Efficient constructor from integer.
+ if isinstance(address, int):
+ self._check_int_address(address)
+ self._ip = address
+ return
+
+ # Constructing from a packed address
+ if isinstance(address, bytes):
+ self._check_packed_address(address, 16)
+ self._ip = int.from_bytes(address, 'big')
+ return
+
+ # Assume input argument to be string or any object representation
+ # which converts into a formatted IP string.
+ addr_str = str(address)
+ self._ip = self._ip_int_from_string(addr_str)
+
+ @property
+ def packed(self):
+ """The binary representation of this address."""
+ return v6_int_to_packed(self._ip)
+
+ @property
+ def is_multicast(self):
+ """Test if the address is reserved for multicast use.
+
+ Returns:
+ A boolean, True if the address is a multicast address.
+ See RFC 2373 2.7 for details.
+
+ """
+ multicast_network = IPv6Network('ff00::/8')
+ return self in multicast_network
+
+ @property
+ def is_reserved(self):
+ """Test if the address is otherwise IETF reserved.
+
+ Returns:
+ A boolean, True if the address is within one of the
+ reserved IPv6 Network ranges.
+
+ """
+ reserved_networks = [IPv6Network('::/8'), IPv6Network('100::/8'),
+ IPv6Network('200::/7'), IPv6Network('400::/6'),
+ IPv6Network('800::/5'), IPv6Network('1000::/4'),
+ IPv6Network('4000::/3'), IPv6Network('6000::/3'),
+ IPv6Network('8000::/3'), IPv6Network('A000::/3'),
+ IPv6Network('C000::/3'), IPv6Network('E000::/4'),
+ IPv6Network('F000::/5'), IPv6Network('F800::/6'),
+ IPv6Network('FE00::/9')]
+
+ return any(self in x for x in reserved_networks)
+
+ @property
+ def is_link_local(self):
+ """Test if the address is reserved for link-local.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 4291.
+
+ """
+ linklocal_network = IPv6Network('fe80::/10')
+ return self in linklocal_network
+
+ @property
+ def is_site_local(self):
+ """Test if the address is reserved for site-local.
+
+ Note that the site-local address space has been deprecated by RFC 3879.
+ Use is_private to test if this address is in the space of unique local
+ addresses as defined by RFC 4193.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+ """
+ sitelocal_network = IPv6Network('fec0::/10')
+ return self in sitelocal_network
+
+ @property
+ def is_private(self):
+ """Test if this address is allocated for private networks.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 4193.
+
+ """
+ private_network = IPv6Network('fc00::/7')
+ return self in private_network
+
+ @property
+ def is_unspecified(self):
+ """Test if the address is unspecified.
+
+ Returns:
+ A boolean, True if this is the unspecified address as defined in
+ RFC 2373 2.5.2.
+
+ """
+ return self._ip == 0
+
+ @property
+ def is_loopback(self):
+ """Test if the address is a loopback address.
+
+ Returns:
+ A boolean, True if the address is a loopback address as defined in
+ RFC 2373 2.5.3.
+
+ """
+ return self._ip == 1
+
+ @property
+ def ipv4_mapped(self):
+ """Return the IPv4 mapped address.
+
+ Returns:
+ If the IPv6 address is a v4 mapped address, return the
+ IPv4 mapped address. Return None otherwise.
+
+ """
+ if (self._ip >> 32) != 0xFFFF:
+ return None
+ return IPv4Address(self._ip & 0xFFFFFFFF)
+
+ @property
+ def teredo(self):
+ """Tuple of embedded teredo IPs.
+
+ Returns:
+ Tuple of the (server, client) IPs or None if the address
+ doesn't appear to be a teredo address (doesn't start with
+ 2001::/32)
+
+ """
+ if (self._ip >> 96) != 0x20010000:
+ return None
+ return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
+ IPv4Address(~self._ip & 0xFFFFFFFF))
+
+ @property
+ def sixtofour(self):
+ """Return the IPv4 6to4 embedded address.
+
+ Returns:
+ The IPv4 6to4-embedded address if present or None if the
+ address doesn't appear to contain a 6to4 embedded address.
+
+ """
+ if (self._ip >> 112) != 0x2002:
+ return None
+ return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
+
+
+class IPv6Interface(IPv6Address):
+
+ def __init__(self, address):
+ if isinstance(address, (bytes, int)):
+ IPv6Address.__init__(self, address)
+ self.network = IPv6Network(self._ip)
+ self._prefixlen = self._max_prefixlen
+ return
+
+ addr = _split_optional_netmask(address)
+ IPv6Address.__init__(self, addr[0])
+ self.network = IPv6Network(address, strict=False)
+ self.netmask = self.network.netmask
+ self._prefixlen = self.network._prefixlen
+ self.hostmask = self.network.hostmask
+
+ def __str__(self):
+ return '%s/%d' % (self._string_from_ip_int(self._ip),
+ self.network.prefixlen)
+
+ def __eq__(self, other):
+ address_equal = IPv6Address.__eq__(self, other)
+ if not address_equal or address_equal is NotImplemented:
+ return address_equal
+ try:
+ return self.network == other.network
+ except AttributeError:
+ # An interface with an associated network is NOT the
+ # same as an unassociated address. That's why the hash
+ # takes the extra info into account.
+ return False
+
+ def __lt__(self, other):
+ address_less = IPv6Address.__lt__(self, other)
+ if address_less is NotImplemented:
+ return NotImplemented
+ try:
+ return self.network < other.network
+ except AttributeError:
+ # We *do* allow addresses and interfaces to be sorted. The
+ # unassociated address is considered less than all interfaces.
+ return False
+
+ def __hash__(self):
+ return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+ @property
+ def ip(self):
+ return IPv6Address(self._ip)
+
+ @property
+ def with_prefixlen(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self._prefixlen)
+
+ @property
+ def with_netmask(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self.netmask)
+
+ @property
+ def with_hostmask(self):
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self.hostmask)
+
+ @property
+ def is_unspecified(self):
+ return self._ip == 0 and self.network.is_unspecified
+
+ @property
+ def is_loopback(self):
+ return self._ip == 1 and self.network.is_loopback
+
+
+class IPv6Network(_BaseV6, _BaseNetwork):
+
+ """This class represents and manipulates 128-bit IPv6 networks.
+
+ Attributes: [examples for IPv6('2001:db8::1000/124')]
+ .network_address: IPv6Address('2001:db8::1000')
+ .hostmask: IPv6Address('::f')
+ .broadcast_address: IPv6Address('2001:db8::100f')
+ .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
+ .prefixlen: 124
+
+ """
+
+ # Class to use when creating address objects
+ _address_class = IPv6Address
+
+ def __init__(self, address, strict=True):
+ """Instantiate a new IPv6 Network object.
+
+ Args:
+ address: A string or integer representing the IPv6 network or the
+ IP and prefix/netmask.
+ '2001:db8::/128'
+ '2001:db8:0000:0000:0000:0000:0000:0000/128'
+ '2001:db8::'
+ are all functionally the same in IPv6. That is to say,
+ failing to provide a subnetmask will create an object with
+ a mask of /128.
+
+ Additionally, an integer can be passed, so
+ IPv6Network('2001:db8::') ==
+ IPv6Network(42540766411282592856903984951653826560)
+ or, more generally
+ IPv6Network(int(IPv6Network('2001:db8::'))) ==
+ IPv6Network('2001:db8::')
+
+ strict: A boolean. If true, ensure that we have been passed
+ A true network address, eg, 2001:db8::1000/124 and not an
+ IP address on a network, eg, 2001:db8::1/124.
+
+ Raises:
+ AddressValueError: If address isn't a valid IPv6 address.
+ NetmaskValueError: If the netmask isn't valid for
+ an IPv6 address.
+ ValueError: If strict was True and a network address was not
+ supplied.
+
+ """
+ _BaseV6.__init__(self, address)
+ _BaseNetwork.__init__(self, address)
+
+ # Efficient constructor from integer.
+ if isinstance(address, int):
+ self.network_address = IPv6Address(address)
+ self._prefixlen = self._max_prefixlen
+ self.netmask = IPv6Address(self._ALL_ONES)
+ return
+
+ # Constructing from a packed address
+ if isinstance(address, bytes):
+ self.network_address = IPv6Address(address)
+ self._prefixlen = self._max_prefixlen
+ self.netmask = IPv6Address(self._ALL_ONES)
+ return
+
+ # Assume input argument to be string or any object representation
+ # which converts into a formatted IP prefix string.
+ addr = _split_optional_netmask(address)
+
+ self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
+
+ if len(addr) == 2:
+ if self._is_valid_netmask(addr[1]):
+ self._prefixlen = int(addr[1])
+ else:
+ raise NetmaskValueError('%r is not a valid netmask'
+ % addr[1])
+ else:
+ self._prefixlen = self._max_prefixlen
+
+ self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
+ if strict:
+ if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
+ self.network_address):
+ raise ValueError('%s has host bits set' % self)
+ self.network_address = IPv6Address(int(self.network_address) &
+ int(self.netmask))
+
+ if self._prefixlen == (self._max_prefixlen - 1):
+ self.hosts = self.__iter__
+
+ def _is_valid_netmask(self, prefixlen):
+ """Verify that the netmask/prefixlen is valid.
+
+ Args:
+ prefixlen: A string, the netmask in prefix length format.
+
+ Returns:
+ A boolean, True if the prefix represents a valid IPv6
+ netmask.
+
+ """
+ try:
+ prefixlen = int(prefixlen)
+ except ValueError:
+ return False
+ return 0 <= prefixlen <= self._max_prefixlen
+
+ @property
+ def is_site_local(self):
+ """Test if the address is reserved for site-local.
+
+ Note that the site-local address space has been deprecated by RFC 3879.
+ Use is_private to test if this address is in the space of unique local
+ addresses as defined by RFC 4193.
+
+ Returns:
+ A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+ """
+ return (self.network_address.is_site_local and
+ self.broadcast_address.is_site_local)
diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py
index dc1155b..07fd696 100644
--- a/Lib/json/decoder.py
+++ b/Lib/json/decoder.py
@@ -121,8 +121,7 @@ def py_scanstring(s, end, strict=True,
msg = "Invalid \\uXXXX escape"
raise ValueError(errmsg(msg, s, end))
uni = int(esc, 16)
- # Check for surrogate pair on UCS-4 systems
- if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535:
+ if 0xd800 <= uni <= 0xdbff:
msg = "Invalid \\uXXXX\\uXXXX surrogate pair"
if not s[end + 5:end + 7] == '\\u':
raise ValueError(errmsg(msg, s, end))
diff --git a/Lib/lib2to3/__main__.py b/Lib/lib2to3/__main__.py
new file mode 100644
index 0000000..80688ba
--- /dev/null
+++ b/Lib/lib2to3/__main__.py
@@ -0,0 +1,4 @@
+import sys
+from .main import main
+
+sys.exit(main("lib2to3.fixes"))
diff --git a/Lib/lib2to3/fixer_base.py b/Lib/lib2to3/fixer_base.py
index afc0467..b176056 100644
--- a/Lib/lib2to3/fixer_base.py
+++ b/Lib/lib2to3/fixer_base.py
@@ -27,7 +27,6 @@ class BaseFix(object):
pattern_tree = None # Tree representation of the pattern
options = None # Options object passed to initializer
filename = None # The filename (set by set_filename)
- logger = None # A logger (set by set_filename)
numbers = itertools.count(1) # For new_name()
used_names = set() # A set of all used NAMEs
order = "post" # Does the fixer prefer pre- or post-order traversal
@@ -70,12 +69,11 @@ class BaseFix(object):
with_tree=True)
def set_filename(self, filename):
- """Set the filename, and a logger derived from it.
+ """Set the filename.
The main refactoring tool should call this.
"""
self.filename = filename
- self.logger = logging.getLogger(filename)
def match(self, node):
"""Returns match for a given parse tree node.
diff --git a/Lib/lib2to3/pytree.py b/Lib/lib2to3/pytree.py
index fa4942f3..17cbf0a 100644
--- a/Lib/lib2to3/pytree.py
+++ b/Lib/lib2to3/pytree.py
@@ -109,26 +109,6 @@ class Base(object):
"""
raise NotImplementedError
- def set_prefix(self, prefix):
- """
- Set the prefix for the node (see Leaf class).
-
- DEPRECATED; use the prefix property directly.
- """
- warnings.warn("set_prefix() is deprecated; use the prefix property",
- DeprecationWarning, stacklevel=2)
- self.prefix = prefix
-
- def get_prefix(self):
- """
- Return the prefix for the node (see Leaf class).
-
- DEPRECATED; use the prefix property directly.
- """
- warnings.warn("get_prefix() is deprecated; use the prefix property",
- DeprecationWarning, stacklevel=2)
- return self.prefix
-
def replace(self, new):
"""Replace this node with a new one in the parent."""
assert self.parent is not None, str(self)
diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py
index 38fb8ed..201e193 100644
--- a/Lib/lib2to3/refactor.py
+++ b/Lib/lib2to3/refactor.py
@@ -566,7 +566,7 @@ class RefactoringTool(object):
block_lineno = None
indent = None
lineno = 0
- for line in input.splitlines(True):
+ for line in input.splitlines(keepends=True):
lineno += 1
if line.lstrip().startswith(self.PS1):
if block is not None:
@@ -610,7 +610,7 @@ class RefactoringTool(object):
filename, lineno, err.__class__.__name__, err)
return block
if self.refactor_tree(tree, filename):
- new = str(tree).splitlines(True)
+ new = str(tree).splitlines(keepends=True)
# Undo the adjustment of the line numbers in wrap_toks() below.
clipped, new = new[:lineno-1], new[lineno-1:]
assert clipped == ["\n"] * (lineno-1), clipped
diff --git a/Lib/lib2to3/tests/test_pytree.py b/Lib/lib2to3/tests/test_pytree.py
index ac7d900..a2ab1f3 100644
--- a/Lib/lib2to3/tests/test_pytree.py
+++ b/Lib/lib2to3/tests/test_pytree.py
@@ -31,23 +31,6 @@ class TestNodes(support.TestCase):
"""Unit tests for nodes (Base, Leaf, Node)."""
- if sys.version_info >= (2,6):
- # warnings.catch_warnings is new in 2.6.
- def test_deprecated_prefix_methods(self):
- l = pytree.Leaf(100, "foo")
- with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always", DeprecationWarning)
- self.assertEqual(l.get_prefix(), "")
- l.set_prefix("hi")
- self.assertEqual(l.prefix, "hi")
- self.assertEqual(len(w), 2)
- for warning in w:
- self.assertTrue(warning.category is DeprecationWarning)
- self.assertEqual(str(w[0].message), "get_prefix() is deprecated; " \
- "use the prefix property")
- self.assertEqual(str(w[1].message), "set_prefix() is deprecated; " \
- "use the prefix property")
-
def test_instantiate_base(self):
if __debug__:
# Test that instantiating Base() raises an AssertionError
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 4191b22..e79018f 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -36,15 +36,9 @@ __all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
'getLogRecordFactory', 'setLogRecordFactory', 'lastResort']
try:
- import codecs
-except ImportError:
- codecs = None
-
-try:
- import _thread as thread
import threading
-except ImportError:
- thread = None
+except ImportError: #pragma: no cover
+ threading = None
__author__ = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__ = "production"
@@ -65,16 +59,16 @@ else:
_srcfile = __file__
_srcfile = os.path.normcase(_srcfile)
-# next bit filched from 1.5.2's inspect.py
-def currentframe():
- """Return the frame object for the caller's stack frame."""
- try:
- raise Exception
- except:
- return sys.exc_info()[2].tb_frame.f_back
-if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
-# done filching
+if hasattr(sys, '_getframe'):
+ currentframe = lambda: sys._getframe(3)
+else: #pragma: no cover
+ def currentframe():
+ """Return the frame object for the caller's stack frame."""
+ try:
+ raise Exception
+ except:
+ return sys.exc_info()[2].tb_frame.f_back
# _srcfile is only used in conjunction with sys._getframe().
# To provide compatibility with older versions of Python, set _srcfile
@@ -92,22 +86,22 @@ _startTime = time.time()
#raiseExceptions is used to see if exceptions during handling should be
#propagated
#
-raiseExceptions = 1
+raiseExceptions = True
#
# If you don't want threading information in the log, set this to zero
#
-logThreads = 1
+logThreads = True
#
# If you don't want multiprocessing information in the log, set this to zero
#
-logMultiprocessing = 1
+logMultiprocessing = True
#
# If you don't want process information in the log, set this to zero
#
-logProcesses = 1
+logProcesses = True
#---------------------------------------------------------------------------
# Level related stuff
@@ -197,9 +191,9 @@ def _checkLevel(level):
#the lock would already have been acquired - so we need an RLock.
#The same argument applies to Loggers and Manager.loggerDict.
#
-if thread:
+if threading:
_lock = threading.RLock()
-else:
+else: #pragma: no cover
_lock = None
@@ -252,7 +246,7 @@ class LogRecord(object):
# during formatting, we test to see if the arg is present using
# 'if self.args:'. If the event being logged is e.g. 'Value is %d'
# and if the passed arg fails 'if self.args:' then no formatting
- # is done. For example, logger.warn('Value is %d', 0) would log
+ # is done. For example, logger.warning('Value is %d', 0) would log
# 'Value is %d' instead of 'Value is 0'.
# For the use case of passing a dictionary, this should not be a
# problem.
@@ -276,13 +270,13 @@ class LogRecord(object):
self.created = ct
self.msecs = (ct - int(ct)) * 1000
self.relativeCreated = (self.created - _startTime) * 1000
- if logThreads and thread:
- self.thread = thread.get_ident()
+ if logThreads and threading:
+ self.thread = threading.get_ident()
self.threadName = threading.current_thread().name
- else:
+ else: # pragma: no cover
self.thread = None
self.threadName = None
- if not logMultiprocessing:
+ if not logMultiprocessing: # pragma: no cover
self.processName = None
else:
self.processName = 'MainProcess'
@@ -294,7 +288,7 @@ class LogRecord(object):
# for an example
try:
self.processName = mp.current_process().name
- except Exception:
+ except Exception: #pragma: no cover
pass
if logProcesses and hasattr(os, 'getpid'):
self.process = os.getpid()
@@ -466,6 +460,9 @@ class Formatter(object):
self._fmt = self._style._fmt
self.datefmt = datefmt
+ default_time_format = '%Y-%m-%d %H:%M:%S'
+ default_msec_format = '%s,%03d'
+
def formatTime(self, record, datefmt=None):
"""
Return the creation time of the specified LogRecord as formatted text.
@@ -488,8 +485,8 @@ class Formatter(object):
if datefmt:
s = time.strftime(datefmt, ct)
else:
- t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
- s = "%s,%03d" % (t, record.msecs) # the use of % here is internal
+ t = time.strftime(self.default_time_format, ct)
+ s = self.default_msec_format % (t, record.msecs)
return s
def formatException(self, ei):
@@ -642,11 +639,11 @@ class Filter(object):
yes. If deemed appropriate, the record may be modified in-place.
"""
if self.nlen == 0:
- return 1
+ return True
elif self.name == record.name:
- return 1
+ return True
elif record.name.find(self.name, 0, self.nlen) != 0:
- return 0
+ return False
return (record.name[self.nlen] == ".")
class Filterer(object):
@@ -686,14 +683,14 @@ class Filterer(object):
Allow filters to be just callables.
"""
- rv = 1
+ rv = True
for f in self.filters:
if hasattr(f, 'filter'):
result = f.filter(record)
else:
result = f(record) # assume callable - will raise if not
if not result:
- rv = 0
+ rv = False
break
return rv
@@ -771,9 +768,9 @@ class Handler(Filterer):
"""
Acquire a thread lock for serializing access to the underlying I/O.
"""
- if thread:
+ if threading:
self.lock = threading.RLock()
- else:
+ else: #pragma: no cover
self.lock = None
def acquire(self):
@@ -792,7 +789,7 @@ class Handler(Filterer):
def setLevel(self, level):
"""
- Set the logging level of this handler.
+ Set the logging level of this handler. level must be an int or a str.
"""
self.level = _checkLevel(level)
@@ -888,7 +885,7 @@ class Handler(Filterer):
None, sys.stderr)
sys.stderr.write('Logged from file %s, line %s\n' % (
record.filename, record.lineno))
- except IOError:
+ except IOError: #pragma: no cover
pass # see issue 5971
finally:
del ei
@@ -941,7 +938,7 @@ class StreamHandler(Handler):
stream.write(msg)
stream.write(self.terminator)
self.flush()
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -950,14 +947,12 @@ class FileHandler(StreamHandler):
"""
A handler class which writes formatted logging records to disk files.
"""
- def __init__(self, filename, mode='a', encoding=None, delay=0):
+ def __init__(self, filename, mode='a', encoding=None, delay=False):
"""
Open the specified file and use it as the stream for logging.
"""
#keep the absolute path, otherwise derived classes which use this
#may come a cropper when the current directory changes
- if codecs is None:
- encoding = None
self.baseFilename = os.path.abspath(filename)
self.mode = mode
self.encoding = encoding
@@ -989,11 +984,7 @@ class FileHandler(StreamHandler):
Open the current base file with the (original) mode and encoding.
Return the resulting stream.
"""
- if self.encoding is None:
- stream = open(self.baseFilename, self.mode)
- else:
- stream = codecs.open(self.baseFilename, self.mode, self.encoding)
- return stream
+ return open(self.baseFilename, self.mode, encoding=self.encoding)
def emit(self, record):
"""
@@ -1205,13 +1196,13 @@ class Logger(Filterer):
self.name = name
self.level = _checkLevel(level)
self.parent = None
- self.propagate = 1
+ self.propagate = True
self.handlers = []
- self.disabled = 0
+ self.disabled = False
def setLevel(self, level):
"""
- Set the logging level of this logger.
+ Set the logging level of this logger. level must be an int or a str.
"""
self.level = _checkLevel(level)
@@ -1251,7 +1242,10 @@ class Logger(Filterer):
if self.isEnabledFor(WARNING):
self._log(WARNING, msg, args, **kwargs)
- warn = warning
+ def warn(self, msg, *args, **kwargs):
+ warnings.warn("The 'warn' method is deprecated, "
+ "use 'warning' instead", DeprecationWarning, 2)
+ self.warning(msg, *args, **kwargs)
def error(self, msg, *args, **kwargs):
"""
@@ -1360,9 +1354,9 @@ class Logger(Filterer):
#IronPython can use logging.
try:
fn, lno, func, sinfo = self.findCaller(stack_info)
- except ValueError:
+ except ValueError: # pragma: no cover
fn, lno, func = "(unknown file)", 0, "(unknown function)"
- else:
+ else: # pragma: no cover
fn, lno, func = "(unknown file)", 0, "(unknown function)"
if exc_info:
if not isinstance(exc_info, tuple):
@@ -1474,7 +1468,7 @@ class Logger(Filterer):
Is this logger enabled for level 'level'?
"""
if self.manager.disable >= level:
- return 0
+ return False
return level >= self.getEffectiveLevel()
def getChild(self, suffix):
@@ -1564,7 +1558,10 @@ class LoggerAdapter(object):
"""
self.log(WARNING, msg, *args, **kwargs)
- warn = warning
+ def warn(self, msg, *args, **kwargs):
+ warnings.warn("The 'warn' method is deprecated, "
+ "use 'warning' instead", DeprecationWarning, 2)
+ self.warning(msg, *args, **kwargs)
def error(self, msg, *args, **kwargs):
"""
@@ -1576,7 +1573,7 @@ class LoggerAdapter(object):
"""
Delegate an exception call to the underlying logger.
"""
- kwargs["exc_info"] = 1
+ kwargs["exc_info"] = True
self.log(ERROR, msg, *args, **kwargs)
def critical(self, msg, *args, **kwargs):
@@ -1659,6 +1656,10 @@ def basicConfig(**kwargs):
stream Use the specified stream to initialize the StreamHandler. Note
that this argument is incompatible with 'filename' - if both
are present, 'stream' is ignored.
+ handlers If specified, this should be an iterable of already created
+ handlers, which will be added to the root handler. Any handler
+ in the list which does not have a formatter assigned will be
+ assigned the formatter created in this function.
Note that you could specify a stream created using open(filename, mode)
rather than passing the filename and mode in. However, it should be
@@ -1666,27 +1667,47 @@ def basicConfig(**kwargs):
using sys.stdout or sys.stderr), whereas FileHandler closes its stream
when the handler is closed.
- .. versionchanged: 3.2
+ .. versionchanged:: 3.2
Added the ``style`` parameter.
+
+ .. versionchanged:: 3.3
+ Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
+ incompatible arguments (e.g. ``handlers`` specified together with
+ ``filename``/``filemode``, or ``filename``/``filemode`` specified
+ together with ``stream``, or ``handlers`` specified together with
+ ``stream``.
"""
# Add thread safety in case someone mistakenly calls
# basicConfig() from multiple threads
_acquireLock()
try:
if len(root.handlers) == 0:
- filename = kwargs.get("filename")
- if filename:
- mode = kwargs.get("filemode", 'a')
- hdlr = FileHandler(filename, mode)
+ handlers = kwargs.get("handlers")
+ if handlers is None:
+ if "stream" in kwargs and "filename" in kwargs:
+ raise ValueError("'stream' and 'filename' should not be "
+ "specified together")
else:
- stream = kwargs.get("stream")
- hdlr = StreamHandler(stream)
+ if "stream" in kwargs or "filename" in kwargs:
+ raise ValueError("'stream' or 'filename' should not be "
+ "specified together with 'handlers'")
+ if handlers is None:
+ filename = kwargs.get("filename")
+ if filename:
+ mode = kwargs.get("filemode", 'a')
+ h = FileHandler(filename, mode)
+ else:
+ stream = kwargs.get("stream")
+ h = StreamHandler(stream)
+ handlers = [h]
fs = kwargs.get("format", BASIC_FORMAT)
dfs = kwargs.get("datefmt", None)
style = kwargs.get("style", '%')
fmt = Formatter(fs, dfs, style)
- hdlr.setFormatter(fmt)
- root.addHandler(hdlr)
+ for h in handlers:
+ if h.formatter is None:
+ h.setFormatter(fmt)
+ root.addHandler(h)
level = kwargs.get("level")
if level is not None:
root.setLevel(level)
@@ -1750,7 +1771,10 @@ def warning(msg, *args, **kwargs):
basicConfig()
root.warning(msg, *args, **kwargs)
-warn = warning
+def warn(msg, *args, **kwargs):
+ warnings.warn("The 'warn' function is deprecated, "
+ "use 'warning' instead", DeprecationWarning, 2)
+ warning(msg, *args, **kwargs)
def info(msg, *args, **kwargs):
"""
@@ -1835,10 +1859,10 @@ class NullHandler(Handler):
package.
"""
def handle(self, record):
- pass
+ """Stub."""
def emit(self, record):
- pass
+ """Stub."""
def createLock(self):
self.lock = None
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 373da2b..5ef5c91 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -24,13 +24,13 @@ Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved.
To use, simply 'import logging' and log away!
"""
-import sys, logging, logging.handlers, socket, struct, os, traceback, re
-import types, io
+import sys, logging, logging.handlers, socket, struct, traceback, re
+import io
try:
import _thread as thread
import threading
-except ImportError:
+except ImportError: #pragma: no cover
thread = None
from socketserver import ThreadingTCPServer, StreamRequestHandler
@@ -98,9 +98,6 @@ def _resolve(name):
def _strip_spaces(alist):
return map(lambda x: x.strip(), alist)
-def _encoded(s):
- return s if isinstance(s, str) else s.encode('utf-8')
-
def _create_formatters(cp):
"""Create and return formatters"""
flist = cp["formatters"]["keys"]
@@ -215,7 +212,7 @@ def _install_loggers(cp, handlers, disable_existing):
#avoid disabling child loggers of explicitly
#named loggers. With a sorted list it is easier
#to find the child loggers.
- existing.sort(key=_encoded)
+ existing.sort()
#We'll keep the list of existing loggers
#which are children of named loggers here...
child_loggers = []
@@ -588,7 +585,7 @@ class DictConfigurator(BaseConfigurator):
#avoid disabling child loggers of explicitly
#named loggers. With a sorted list it is easier
#to find the child loggers.
- existing.sort(key=_encoded)
+ existing.sort()
#We'll keep the list of existing loggers
#which are children of named loggers here...
child_loggers = []
@@ -786,7 +783,7 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
and which you can join() when appropriate. To stop the server, call
stopListening().
"""
- if not thread:
+ if not thread: #pragma: no cover
raise NotImplementedError("listen() needs threading to work")
class ConfigStreamHandler(StreamRequestHandler):
@@ -804,7 +801,6 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
struct.pack(">L", n), followed by the config file.
Uses fileConfig() to do the grunt work.
"""
- import tempfile
try:
conn = self.connection
chunk = conn.recv(4)
@@ -825,7 +821,7 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
file = io.StringIO(chunk)
try:
fileConfig(file)
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
traceback.print_exc()
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index 8349d3a..f286cd6 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -24,18 +24,14 @@ To use, simply 'import logging.handlers' and log away!
"""
import errno, logging, socket, os, pickle, struct, time, re
+from codecs import BOM_UTF8
from stat import ST_DEV, ST_INO, ST_MTIME
import queue
try:
import threading
-except ImportError:
+except ImportError: #pragma: no cover
threading = None
-try:
- import codecs
-except ImportError:
- codecs = None
-
#
# Some constants...
#
@@ -55,15 +51,15 @@ class BaseRotatingHandler(logging.FileHandler):
Not meant to be instantiated directly. Instead, use RotatingFileHandler
or TimedRotatingFileHandler.
"""
- def __init__(self, filename, mode, encoding=None, delay=0):
+ def __init__(self, filename, mode, encoding=None, delay=False):
"""
Use the specified filename for streamed logging
"""
- if codecs is None:
- encoding = None
logging.FileHandler.__init__(self, filename, mode, encoding, delay)
self.mode = mode
self.encoding = encoding
+ self.namer = None
+ self.rotator = None
def emit(self, record):
"""
@@ -76,17 +72,55 @@ class BaseRotatingHandler(logging.FileHandler):
if self.shouldRollover(record):
self.doRollover()
logging.FileHandler.emit(self, record)
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
+ def rotation_filename(self, default_name):
+ """
+ Modify the filename of a log file when rotating.
+
+ This is provided so that a custom filename can be provided.
+
+ The default implementation calls the 'namer' attribute of the
+ handler, if it's callable, passing the default name to
+ it. If the attribute isn't callable (the default is None), the name
+ is returned unchanged.
+
+ :param default_name: The default name for the log file.
+ """
+ if not callable(self.namer):
+ result = default_name
+ else:
+ result = self.namer(default_name)
+ return result
+
+ def rotate(self, source, dest):
+ """
+ When rotating, rotate the current log.
+
+ The default implementation calls the 'rotator' attribute of the
+ handler, if it's callable, passing the source and dest arguments to
+ it. If the attribute isn't callable (the default is None), the source
+ is simply renamed to the destination.
+
+ :param source: The source filename. This is normally the base
+ filename, e.g. 'test.log'
+ :param dest: The destination filename. This is normally
+ what the source is rotated to, e.g. 'test.log.1'.
+ """
+ if not callable(self.rotator):
+ os.rename(source, dest)
+ else:
+ self.rotator(source, dest)
+
class RotatingFileHandler(BaseRotatingHandler):
"""
Handler for logging to a set of files, which switches from one file
to the next when the current file reaches a certain size.
"""
- def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):
+ def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):
"""
Open the specified file and use it as the stream for logging.
@@ -127,16 +161,17 @@ class RotatingFileHandler(BaseRotatingHandler):
self.stream = None
if self.backupCount > 0:
for i in range(self.backupCount - 1, 0, -1):
- sfn = "%s.%d" % (self.baseFilename, i)
- dfn = "%s.%d" % (self.baseFilename, i + 1)
+ sfn = self.rotation_filename("%s.%d" % (self.baseFilename, i))
+ dfn = self.rotation_filename("%s.%d" % (self.baseFilename,
+ i + 1))
if os.path.exists(sfn):
if os.path.exists(dfn):
os.remove(dfn)
os.rename(sfn, dfn)
- dfn = self.baseFilename + ".1"
+ dfn = self.rotation_filename(self.baseFilename + ".1")
if os.path.exists(dfn):
os.remove(dfn)
- os.rename(self.baseFilename, dfn)
+ self.rotate(self.baseFilename, dfn)
self.stream = self._open()
def shouldRollover(self, record):
@@ -183,19 +218,19 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
if self.when == 'S':
self.interval = 1 # one second
self.suffix = "%Y-%m-%d_%H-%M-%S"
- self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$"
+ self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$"
elif self.when == 'M':
self.interval = 60 # one minute
self.suffix = "%Y-%m-%d_%H-%M"
- self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$"
+ self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$"
elif self.when == 'H':
self.interval = 60 * 60 # one hour
self.suffix = "%Y-%m-%d_%H"
- self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}$"
+ self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$"
elif self.when == 'D' or self.when == 'MIDNIGHT':
self.interval = 60 * 60 * 24 # one day
self.suffix = "%Y-%m-%d"
- self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
+ self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
elif self.when.startswith('W'):
self.interval = 60 * 60 * 24 * 7 # one week
if len(self.when) != 2:
@@ -204,7 +239,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
self.dayOfWeek = int(self.when[1])
self.suffix = "%Y-%m-%d"
- self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
+ self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
else:
raise ValueError("Invalid rollover interval specified: %s" % self.when)
@@ -337,10 +372,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
else:
addend = -3600
timeTuple = time.localtime(t + addend)
- dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)
+ dfn = self.rotation_filename(self.baseFilename + "." +
+ time.strftime(self.suffix, timeTuple))
if os.path.exists(dfn):
os.remove(dfn)
- os.rename(self.baseFilename, dfn)
+ self.rotate(self.baseFilename, dfn)
if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
@@ -379,7 +415,7 @@ class WatchedFileHandler(logging.FileHandler):
This handler is based on a suggestion and patch by Chad J.
Schroeder.
"""
- def __init__(self, filename, mode='a', encoding=None, delay=0):
+ def __init__(self, filename, mode='a', encoding=None, delay=False):
logging.FileHandler.__init__(self, filename, mode, encoding, delay)
self.dev, self.ino = -1, -1
self._statstream()
@@ -438,15 +474,15 @@ class SocketHandler(logging.Handler):
"""
Initializes the handler with a specific host address and port.
- The attribute 'closeOnError' is set to 1 - which means that if
- a socket error occurs, the socket is silently closed and then
- reopened on the next logging call.
+ When the attribute *closeOnError* is set to True - if a socket error
+ occurs, the socket is silently closed and then reopened on the next
+ logging call.
"""
logging.Handler.__init__(self)
self.host = host
self.port = port
self.sock = None
- self.closeOnError = 0
+ self.closeOnError = False
self.retryTime = None
#
# Exponential backoff parameters.
@@ -463,8 +499,12 @@ class SocketHandler(logging.Handler):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if hasattr(s, 'settimeout'):
s.settimeout(timeout)
- s.connect((self.host, self.port))
- return s
+ try:
+ s.connect((self.host, self.port))
+ return s
+ except socket.error:
+ s.close()
+ raise
def createSocket(self):
"""
@@ -477,7 +517,7 @@ class SocketHandler(logging.Handler):
# is the first time back after a disconnect, or
# we've waited long enough.
if self.retryTime is None:
- attempt = 1
+ attempt = True
else:
attempt = (now >= self.retryTime)
if attempt:
@@ -510,14 +550,14 @@ class SocketHandler(logging.Handler):
try:
if hasattr(self.sock, "sendall"):
self.sock.sendall(s)
- else:
+ else: #pragma: no cover
sentsofar = 0
left = len(s)
while left > 0:
sent = self.sock.send(s[sentsofar:])
sentsofar = sentsofar + sent
left = left - sent
- except socket.error:
+ except socket.error: #pragma: no cover
self.sock.close()
self.sock = None # so we can call createSocket next time
@@ -567,7 +607,7 @@ class SocketHandler(logging.Handler):
try:
s = self.makePickle(record)
self.send(s)
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -601,7 +641,7 @@ class DatagramHandler(SocketHandler):
Initializes the handler with a specific host address and port.
"""
SocketHandler.__init__(self, host, port)
- self.closeOnError = 0
+ self.closeOnError = False
def makeSocket(self):
"""
@@ -742,10 +782,10 @@ class SysLogHandler(logging.Handler):
self.socktype = socktype
if isinstance(address, str):
- self.unixsocket = 1
+ self.unixsocket = True
self._connect_unixsocket(address)
else:
- self.unixsocket = 0
+ self.unixsocket = False
self.socket = socket.socket(socket.AF_INET, socktype)
if socktype == socket.SOCK_STREAM:
self.socket.connect(address)
@@ -778,8 +818,7 @@ class SysLogHandler(logging.Handler):
"""
self.acquire()
try:
- if self.unixsocket:
- self.socket.close()
+ self.socket.close()
logging.Handler.close(self)
finally:
self.release()
@@ -794,6 +833,7 @@ class SysLogHandler(logging.Handler):
"""
return self.priority_map.get(levelName, "warning")
+ ident = '' # prepended to all messages
append_nul = True # some old syslog daemons expect a NUL terminator
def emit(self, record):
@@ -804,6 +844,8 @@ class SysLogHandler(logging.Handler):
exception information is present, it is NOT sent to the server.
"""
msg = self.format(record)
+ if self.ident:
+ msg = self.ident + msg
if self.append_nul:
msg += '\000'
"""
@@ -827,7 +869,7 @@ class SysLogHandler(logging.Handler):
self.socket.sendto(msg, self.address)
else:
self.socket.sendall(msg)
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -837,7 +879,7 @@ class SMTPHandler(logging.Handler):
A handler class which sends an SMTP email for each logging event.
"""
def __init__(self, mailhost, fromaddr, toaddrs, subject,
- credentials=None, secure=None):
+ credentials=None, secure=None, timeout=5.0):
"""
Initialize the handler.
@@ -851,6 +893,8 @@ class SMTPHandler(logging.Handler):
will be either an empty tuple, or a single-value tuple with the name
of a keyfile, or a 2-value tuple with the names of the keyfile and
certificate file. (This tuple is passed to the `starttls` method).
+ A timeout in seconds can be specified for the SMTP connection (the
+ default is one second).
"""
logging.Handler.__init__(self)
if isinstance(mailhost, tuple):
@@ -867,7 +911,7 @@ class SMTPHandler(logging.Handler):
self.toaddrs = toaddrs
self.subject = subject
self.secure = secure
- self._timeout = 5.0
+ self.timeout = timeout
def getSubject(self, record):
"""
@@ -890,7 +934,7 @@ class SMTPHandler(logging.Handler):
port = self.mailport
if not port:
port = smtplib.SMTP_PORT
- smtp = smtplib.SMTP(self.mailhost, port, timeout=self._timeout)
+ smtp = smtplib.SMTP(self.mailhost, port, timeout=self.timeout)
msg = self.format(record)
msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
self.fromaddr,
@@ -905,7 +949,7 @@ class SMTPHandler(logging.Handler):
smtp.login(self.username, self.password)
smtp.sendmail(self.fromaddr, self.toaddrs, msg)
smtp.quit()
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -992,7 +1036,7 @@ class NTEventLogHandler(logging.Handler):
type = self.getEventType(record)
msg = self.format(record)
self._welu.ReportEvent(self.appname, id, cat, type, [msg])
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -1075,9 +1119,11 @@ class HTTPHandler(logging.Handler):
s = ('u%s:%s' % self.credentials).encode('utf-8')
s = 'Basic ' + base64.b64encode(s).strip()
h.putheader('Authorization', s)
- h.endheaders(data if self.method == "POST" else None)
+ h.endheaders()
+ if self.method == "POST":
+ h.send(data.encode('utf-8'))
h.getresponse() #can't do anything with the result
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -1259,7 +1305,7 @@ class QueueHandler(logging.Handler):
"""
try:
self.enqueue(self.prepare(record))
- except (KeyboardInterrupt, SystemExit):
+ except (KeyboardInterrupt, SystemExit): #pragma: no cover
raise
except:
self.handleError(record)
@@ -1356,6 +1402,16 @@ if threading:
except queue.Empty:
break
+ def enqueue_sentinel(self):
+ """
+ This is used to enqueue the sentinel record.
+
+ The base implementation uses put_nowait. You may want to override this
+ method if you want to use timeouts or work with custom queue
+ implementations.
+ """
+ self.queue.put_nowait(self._sentinel)
+
def stop(self):
"""
Stop the listener.
@@ -1365,6 +1421,6 @@ if threading:
may be some records still left on the queue, which won't be processed.
"""
self._stop.set()
- self.queue.put_nowait(self._sentinel)
+ self.enqueue_sentinel()
self._thread.join()
self._thread = None
diff --git a/Lib/lzma.py b/Lib/lzma.py
new file mode 100644
index 0000000..1a1b065
--- /dev/null
+++ b/Lib/lzma.py
@@ -0,0 +1,454 @@
+"""Interface to the liblzma compression library.
+
+This module provides a class for reading and writing compressed files,
+classes for incremental (de)compression, and convenience functions for
+one-shot (de)compression.
+
+These classes and functions support both the XZ and legacy LZMA
+container formats, as well as raw compressed data streams.
+"""
+
+__all__ = [
+ "CHECK_NONE", "CHECK_CRC32", "CHECK_CRC64", "CHECK_SHA256",
+ "CHECK_ID_MAX", "CHECK_UNKNOWN",
+ "FILTER_LZMA1", "FILTER_LZMA2", "FILTER_DELTA", "FILTER_X86", "FILTER_IA64",
+ "FILTER_ARM", "FILTER_ARMTHUMB", "FILTER_POWERPC", "FILTER_SPARC",
+ "FORMAT_AUTO", "FORMAT_XZ", "FORMAT_ALONE", "FORMAT_RAW",
+ "MF_HC3", "MF_HC4", "MF_BT2", "MF_BT3", "MF_BT4",
+ "MODE_FAST", "MODE_NORMAL", "PRESET_DEFAULT", "PRESET_EXTREME",
+
+ "LZMACompressor", "LZMADecompressor", "LZMAFile", "LZMAError",
+ "open", "compress", "decompress", "is_check_supported",
+]
+
+import builtins
+import io
+from _lzma import *
+from _lzma import _encode_filter_properties, _decode_filter_properties
+
+
+_MODE_CLOSED = 0
+_MODE_READ = 1
+_MODE_READ_EOF = 2
+_MODE_WRITE = 3
+
+_BUFFER_SIZE = 8192
+
+
+class LZMAFile(io.BufferedIOBase):
+
+ """A file object providing transparent LZMA (de)compression.
+
+ An LZMAFile can act as a wrapper for an existing file object, or
+ refer directly to a named file on disk.
+
+ Note that LZMAFile provides a *binary* file interface - data read
+ is returned as bytes, and data to be written must be given as bytes.
+ """
+
+ def __init__(self, filename=None, mode="r", *,
+ format=None, check=-1, preset=None, filters=None):
+ """Open an LZMA-compressed file in binary mode.
+
+ filename can be either an actual file name (given as a str or
+ bytes object), in which case the named file is opened, or it can
+ be an existing file object to read from or write to.
+
+ mode can be "r" for reading (default), "w" for (over)writing, or
+ "a" for appending. These can equivalently be given as "rb", "wb",
+ and "ab" respectively.
+
+ format specifies the container format to use for the file.
+ If mode is "r", this defaults to FORMAT_AUTO. Otherwise, the
+ default is FORMAT_XZ.
+
+ check specifies the integrity check to use. This argument can
+ only be used when opening a file for writing. For FORMAT_XZ,
+ the default is CHECK_CRC64. FORMAT_ALONE and FORMAT_RAW do not
+ support integrity checks - for these formats, check must be
+ omitted, or be CHECK_NONE.
+
+ When opening a file for reading, the *preset* argument is not
+ meaningful, and should be omitted. The *filters* argument should
+ also be omitted, except when format is FORMAT_RAW (in which case
+ it is required).
+
+ When opening a file for writing, the settings used by the
+ compressor can be specified either as a preset compression
+ level (with the *preset* argument), or in detail as a custom
+ filter chain (with the *filters* argument). For FORMAT_XZ and
+ FORMAT_ALONE, the default is to use the PRESET_DEFAULT preset
+ level. For FORMAT_RAW, the caller must always specify a filter
+ chain; the raw compressor does not support preset compression
+ levels.
+
+ preset (if provided) should be an integer in the range 0-9,
+ optionally OR-ed with the constant PRESET_EXTREME.
+
+ filters (if provided) should be a sequence of dicts. Each dict
+ should have an entry for "id" indicating ID of the filter, plus
+ additional entries for options to the filter.
+ """
+ self._fp = None
+ self._closefp = False
+ self._mode = _MODE_CLOSED
+ self._pos = 0
+ self._size = -1
+
+ if mode in ("r", "rb"):
+ if check != -1:
+ raise ValueError("Cannot specify an integrity check "
+ "when opening a file for reading")
+ if preset is not None:
+ raise ValueError("Cannot specify a preset compression "
+ "level when opening a file for reading")
+ if format is None:
+ format = FORMAT_AUTO
+ mode_code = _MODE_READ
+ # Save the args to pass to the LZMADecompressor initializer.
+ # If the file contains multiple compressed streams, each
+ # stream will need a separate decompressor object.
+ self._init_args = {"format":format, "filters":filters}
+ self._decompressor = LZMADecompressor(**self._init_args)
+ self._buffer = None
+ elif mode in ("w", "wb", "a", "ab"):
+ if format is None:
+ format = FORMAT_XZ
+ mode_code = _MODE_WRITE
+ self._compressor = LZMACompressor(format=format, check=check,
+ preset=preset, filters=filters)
+ else:
+ raise ValueError("Invalid mode: {!r}".format(mode))
+
+ if isinstance(filename, (str, bytes)):
+ if "b" not in mode:
+ mode += "b"
+ self._fp = builtins.open(filename, mode)
+ self._closefp = True
+ self._mode = mode_code
+ elif hasattr(filename, "read") or hasattr(filename, "write"):
+ self._fp = filename
+ self._mode = mode_code
+ else:
+ raise TypeError("filename must be a str or bytes object, or a file")
+
+ def close(self):
+ """Flush and close the file.
+
+ May be called more than once without error. Once the file is
+ closed, any other operation on it will raise a ValueError.
+ """
+ if self._mode == _MODE_CLOSED:
+ return
+ try:
+ if self._mode in (_MODE_READ, _MODE_READ_EOF):
+ self._decompressor = None
+ self._buffer = None
+ elif self._mode == _MODE_WRITE:
+ self._fp.write(self._compressor.flush())
+ self._compressor = None
+ finally:
+ try:
+ if self._closefp:
+ self._fp.close()
+ finally:
+ self._fp = None
+ self._closefp = False
+ self._mode = _MODE_CLOSED
+
+ @property
+ def closed(self):
+ """True if this file is closed."""
+ return self._mode == _MODE_CLOSED
+
+ def fileno(self):
+ """Return the file descriptor for the underlying file."""
+ self._check_not_closed()
+ return self._fp.fileno()
+
+ def seekable(self):
+ """Return whether the file supports seeking."""
+ return self.readable() and self._fp.seekable()
+
+ def readable(self):
+ """Return whether the file was opened for reading."""
+ self._check_not_closed()
+ return self._mode in (_MODE_READ, _MODE_READ_EOF)
+
+ def writable(self):
+ """Return whether the file was opened for writing."""
+ self._check_not_closed()
+ return self._mode == _MODE_WRITE
+
+ # Mode-checking helper functions.
+
+ def _check_not_closed(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file")
+
+ def _check_can_read(self):
+ if not self.readable():
+ raise io.UnsupportedOperation("File not open for reading")
+
+ def _check_can_write(self):
+ if not self.writable():
+ raise io.UnsupportedOperation("File not open for writing")
+
+ def _check_can_seek(self):
+ if not self.readable():
+ raise io.UnsupportedOperation("Seeking is only supported "
+ "on files open for reading")
+ if not self._fp.seekable():
+ raise io.UnsupportedOperation("The underlying file object "
+ "does not support seeking")
+
+ # Fill the readahead buffer if it is empty. Returns False on EOF.
+ def _fill_buffer(self):
+ # Depending on the input data, our call to the decompressor may not
+ # return any data. In this case, try again after reading another block.
+ while True:
+ if self._buffer:
+ return True
+
+ if self._decompressor.unused_data:
+ rawblock = self._decompressor.unused_data
+ else:
+ rawblock = self._fp.read(_BUFFER_SIZE)
+
+ if not rawblock:
+ if self._decompressor.eof:
+ self._mode = _MODE_READ_EOF
+ self._size = self._pos
+ return False
+ else:
+ raise EOFError("Compressed file ended before the "
+ "end-of-stream marker was reached")
+
+ # Continue to next stream.
+ if self._decompressor.eof:
+ self._decompressor = LZMADecompressor(**self._init_args)
+
+ self._buffer = self._decompressor.decompress(rawblock)
+
+ # Read data until EOF.
+ # If return_data is false, consume the data without returning it.
+ def _read_all(self, return_data=True):
+ blocks = []
+ while self._fill_buffer():
+ if return_data:
+ blocks.append(self._buffer)
+ self._pos += len(self._buffer)
+ self._buffer = None
+ if return_data:
+ return b"".join(blocks)
+
+ # Read a block of up to n bytes.
+ # If return_data is false, consume the data without returning it.
+ def _read_block(self, n, return_data=True):
+ blocks = []
+ while n > 0 and self._fill_buffer():
+ if n < len(self._buffer):
+ data = self._buffer[:n]
+ self._buffer = self._buffer[n:]
+ else:
+ data = self._buffer
+ self._buffer = None
+ if return_data:
+ blocks.append(data)
+ self._pos += len(data)
+ n -= len(data)
+ if return_data:
+ return b"".join(blocks)
+
+ def peek(self, size=-1):
+ """Return buffered data without advancing the file position.
+
+ Always returns at least one byte of data, unless at EOF.
+ The exact number of bytes returned is unspecified.
+ """
+ self._check_can_read()
+ if self._mode == _MODE_READ_EOF or not self._fill_buffer():
+ return b""
+ return self._buffer
+
+ def read(self, size=-1):
+ """Read up to size uncompressed bytes from the file.
+
+ If size is negative or omitted, read until EOF is reached.
+ Returns b"" if the file is already at EOF.
+ """
+ self._check_can_read()
+ if self._mode == _MODE_READ_EOF or size == 0:
+ return b""
+ elif size < 0:
+ return self._read_all()
+ else:
+ return self._read_block(size)
+
+ def read1(self, size=-1):
+ """Read up to size uncompressed bytes, while trying to avoid
+ making multiple reads from the underlying stream.
+
+ Returns b"" if the file is at EOF.
+ """
+ # Usually, read1() calls _fp.read() at most once. However, sometimes
+ # this does not give enough data for the decompressor to make progress.
+ # In this case we make multiple reads, to avoid returning b"".
+ self._check_can_read()
+ if (size == 0 or self._mode == _MODE_READ_EOF or
+ not self._fill_buffer()):
+ return b""
+ if 0 < size < len(self._buffer):
+ data = self._buffer[:size]
+ self._buffer = self._buffer[size:]
+ else:
+ data = self._buffer
+ self._buffer = None
+ self._pos += len(data)
+ return data
+
+ def write(self, data):
+ """Write a bytes object to the file.
+
+ Returns the number of uncompressed bytes written, which is
+ always len(data). Note that due to buffering, the file on disk
+ may not reflect the data written until close() is called.
+ """
+ self._check_can_write()
+ compressed = self._compressor.compress(data)
+ self._fp.write(compressed)
+ self._pos += len(data)
+ return len(data)
+
+ # Rewind the file to the beginning of the data stream.
+ def _rewind(self):
+ self._fp.seek(0, 0)
+ self._mode = _MODE_READ
+ self._pos = 0
+ self._decompressor = LZMADecompressor(**self._init_args)
+ self._buffer = None
+
+ def seek(self, offset, whence=0):
+ """Change the file position.
+
+ The new position is specified by offset, relative to the
+ position indicated by whence. Possible values for whence are:
+
+ 0: start of stream (default): offset must not be negative
+ 1: current stream position
+ 2: end of stream; offset must not be positive
+
+ Returns the new file position.
+
+ Note that seeking is emulated, sp depending on the parameters,
+ this operation may be extremely slow.
+ """
+ self._check_can_seek()
+
+ # Recalculate offset as an absolute file position.
+ if whence == 0:
+ pass
+ elif whence == 1:
+ offset = self._pos + offset
+ elif whence == 2:
+ # Seeking relative to EOF - we need to know the file's size.
+ if self._size < 0:
+ self._read_all(return_data=False)
+ offset = self._size + offset
+ else:
+ raise ValueError("Invalid value for whence: {}".format(whence))
+
+ # Make it so that offset is the number of bytes to skip forward.
+ if offset < self._pos:
+ self._rewind()
+ else:
+ offset -= self._pos
+
+ # Read and discard data until we reach the desired position.
+ if self._mode != _MODE_READ_EOF:
+ self._read_block(offset, return_data=False)
+
+ return self._pos
+
+ def tell(self):
+ """Return the current file position."""
+ self._check_not_closed()
+ return self._pos
+
+
+def open(filename, mode="rb", *,
+ format=None, check=-1, preset=None, filters=None,
+ encoding=None, errors=None, newline=None):
+ """Open an LZMA-compressed file in binary or text mode.
+
+ filename can be either an actual file name (given as a str or bytes object),
+ in which case the named file is opened, or it can be an existing file object
+ to read from or write to.
+
+ The mode argument can be "r", "rb" (default), "w", "wb", "a", or "ab" for
+ binary mode, or "rt", "wt" or "at" for text mode.
+
+ The format, check, preset and filters arguments specify the compression
+ settings, as for LZMACompressor, LZMADecompressor and LZMAFile.
+
+ For binary mode, this function is equivalent to the LZMAFile constructor:
+ LZMAFile(filename, mode, ...). In this case, the encoding, errors and
+ newline arguments must not be provided.
+
+ For text mode, a LZMAFile object is created, and wrapped in an
+ io.TextIOWrapper instance with the specified encoding, error handling
+ behavior, and line ending(s).
+
+ """
+ if "t" in mode:
+ if "b" in mode:
+ raise ValueError("Invalid mode: %r" % (mode,))
+ else:
+ if encoding is not None:
+ raise ValueError("Argument 'encoding' not supported in binary mode")
+ if errors is not None:
+ raise ValueError("Argument 'errors' not supported in binary mode")
+ if newline is not None:
+ raise ValueError("Argument 'newline' not supported in binary mode")
+
+ lz_mode = mode.replace("t", "")
+ binary_file = LZMAFile(filename, lz_mode, format=format, check=check,
+ preset=preset, filters=filters)
+
+ if "t" in mode:
+ return io.TextIOWrapper(binary_file, encoding, errors, newline)
+ else:
+ return binary_file
+
+
+def compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None):
+ """Compress a block of data.
+
+ Refer to LZMACompressor's docstring for a description of the
+ optional arguments *format*, *check*, *preset* and *filters*.
+
+ For incremental compression, use an LZMACompressor object instead.
+ """
+ comp = LZMACompressor(format, check, preset, filters)
+ return comp.compress(data) + comp.flush()
+
+
+def decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None):
+ """Decompress a block of data.
+
+ Refer to LZMADecompressor's docstring for a description of the
+ optional arguments *format*, *check* and *filters*.
+
+ For incremental decompression, use a LZMADecompressor object instead.
+ """
+ results = []
+ while True:
+ decomp = LZMADecompressor(format, memlimit, filters)
+ results.append(decomp.decompress(data))
+ if not decomp.eof:
+ raise LZMAError("Compressed data ended before the "
+ "end-of-stream marker was reached")
+ if not decomp.unused_data:
+ return b"".join(results)
+ # There is unused data left over. Proceed to next stream.
+ data = decomp.unused_data
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index c73fb95..d3bf3fd 100644
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -1157,8 +1157,7 @@ class MH(Mailbox):
def get_sequences(self):
"""Return a name-to-key-list dictionary to define each sequence."""
results = {}
- f = open(os.path.join(self._path, '.mh_sequences'), 'r')
- try:
+ with open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') as f:
all_keys = set(self.keys())
for line in f:
try:
@@ -1177,13 +1176,11 @@ class MH(Mailbox):
except ValueError:
raise FormatError('Invalid sequence specification: %s' %
line.rstrip())
- finally:
- f.close()
return results
def set_sequences(self, sequences):
"""Set sequences using the given name-to-key-list dictionary."""
- f = open(os.path.join(self._path, '.mh_sequences'), 'r+')
+ f = open(os.path.join(self._path, '.mh_sequences'), 'r+', encoding='ASCII')
try:
os.close(os.open(f.name, os.O_WRONLY | os.O_TRUNC))
for name, keys in sequences.items():
@@ -1523,9 +1520,10 @@ class Message(email.message.Message):
def _become_message(self, message):
"""Assume the non-format-specific state of message."""
- for name in ('_headers', '_unixfrom', '_payload', '_charset',
- 'preamble', 'epilogue', 'defects', '_default_type'):
- self.__dict__[name] = message.__dict__[name]
+ type_specific = getattr(message, '_type_specific_attributes', [])
+ for name in message.__dict__:
+ if name not in type_specific:
+ self.__dict__[name] = message.__dict__[name]
def _explain_to(self, message):
"""Copy format-specific state to message insofar as possible."""
@@ -1538,6 +1536,8 @@ class Message(email.message.Message):
class MaildirMessage(Message):
"""Message with Maildir-specific properties."""
+ _type_specific_attributes = ['_subdir', '_info', '_date']
+
def __init__(self, message=None):
"""Initialize a MaildirMessage instance."""
self._subdir = 'new'
@@ -1645,6 +1645,8 @@ class MaildirMessage(Message):
class _mboxMMDFMessage(Message):
"""Message with mbox- or MMDF-specific properties."""
+ _type_specific_attributes = ['_from']
+
def __init__(self, message=None):
"""Initialize an mboxMMDFMessage instance."""
self.set_from('MAILER-DAEMON', True)
@@ -1760,6 +1762,8 @@ class mboxMessage(_mboxMMDFMessage):
class MHMessage(Message):
"""Message with MH-specific properties."""
+ _type_specific_attributes = ['_sequences']
+
def __init__(self, message=None):
"""Initialize an MHMessage instance."""
self._sequences = []
@@ -1830,6 +1834,8 @@ class MHMessage(Message):
class BabylMessage(Message):
"""Message with Babyl-specific properties."""
+ _type_specific_attributes = ['_labels', '_visible']
+
def __init__(self, message=None):
"""Initialize an BabylMessage instance."""
self._labels = []
diff --git a/Lib/mailcap.py b/Lib/mailcap.py
index 4ae13d7..99f4958 100644
--- a/Lib/mailcap.py
+++ b/Lib/mailcap.py
@@ -33,10 +33,10 @@ def getcaps():
def listmailcapfiles():
"""Return a list of all mailcap files found on the system."""
- # XXX Actually, this is Unix-specific
+ # This is mostly a Unix thing, but we use the OS path separator anyway
if 'MAILCAPS' in os.environ:
- str = os.environ['MAILCAPS']
- mailcaps = str.split(':')
+ pathstr = os.environ['MAILCAPS']
+ mailcaps = pathstr.split(os.pathsep)
else:
if 'HOME' in os.environ:
home = os.environ['HOME']
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index 8ce02f9..3f0bd0e 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -249,7 +249,6 @@ class MimeTypes:
yield ctype
i += 1
- default_encoding = sys.getdefaultencoding()
with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT,
r'MIME\Database\Content Type') as mimedb:
for ctype in enum_types(mimedb):
@@ -434,6 +433,8 @@ def _default_mime_types():
'.ksh' : 'text/plain',
'.latex' : 'application/x-latex',
'.m1v' : 'video/mpeg',
+ '.m3u' : 'application/vnd.apple.mpegurl',
+ '.m3u8' : 'application/vnd.apple.mpegurl',
'.man' : 'application/x-troff-man',
'.me' : 'application/x-troff-me',
'.mht' : 'message/rfc822',
diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
index f033ba9..683e305 100644
--- a/Lib/modulefinder.py
+++ b/Lib/modulefinder.py
@@ -1,6 +1,5 @@
"""Find modules used by a script, using introspection."""
-from __future__ import generators
import dis
import imp
import marshal
@@ -9,8 +8,6 @@ import sys
import types
import struct
-READ_MODE = "rU"
-
# XXX Clean up once str8's cstor matches bytes.
LOAD_CONST = bytes([dis.opname.index('LOAD_CONST')])
IMPORT_NAME = bytes([dis.opname.index('IMPORT_NAME')])
@@ -29,9 +26,7 @@ packagePathMap = {}
# A Public interface
def AddPackagePath(packagename, path):
- paths = packagePathMap.get(packagename, [])
- paths.append(path)
- packagePathMap[packagename] = paths
+ packagePathMap.setdefault(packagename, []).append(path)
replacePackageMap = {}
@@ -106,14 +101,14 @@ class ModuleFinder:
def run_script(self, pathname):
self.msg(2, "run_script", pathname)
- with open(pathname, READ_MODE) as fp:
+ with open(pathname) as fp:
stuff = ("", "r", imp.PY_SOURCE)
self.load_module('__main__', fp, pathname, stuff)
def load_file(self, pathname):
dir, name = os.path.split(pathname)
name, ext = os.path.splitext(name)
- with open(pathname, READ_MODE) as fp:
+ with open(pathname) as fp:
stuff = (ext, "r", imp.PY_SOURCE)
self.load_module(name, fp, pathname, stuff)
@@ -227,8 +222,9 @@ class ModuleFinder:
# But we must also collect Python extension modules - although
# we cannot separate normal dlls from Python extensions.
suffixes = []
- for triple in imp.get_suffixes():
- suffixes.append(triple[0])
+ suffixes += importlib.machinery.EXTENSION_SUFFIXES[:]
+ suffixes += importlib.machinery.SOURCE_SUFFIXES[:]
+ suffixes += importlib.machinery.BYTECODE_SUFFIXES[:]
for dir in m.__path__:
try:
names = os.listdir(dir)
@@ -270,7 +266,8 @@ class ModuleFinder:
try:
m = self.load_module(fqname, fp, pathname, stuff)
finally:
- if fp: fp.close()
+ if fp:
+ fp.close()
if parent:
setattr(parent, partname, m)
self.msgout(3, "import_module ->", m)
@@ -662,4 +659,4 @@ if __name__ == '__main__':
try:
mf = test()
except KeyboardInterrupt:
- print("\n[interrupt]")
+ print("\n[interrupted]")
diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py
index e6e16c8..1f3e67c 100644
--- a/Lib/multiprocessing/__init__.py
+++ b/Lib/multiprocessing/__init__.py
@@ -13,32 +13,7 @@
#
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__version__ = '0.70a1'
@@ -48,8 +23,8 @@ __all__ = [
'Manager', 'Pipe', 'cpu_count', 'log_to_stderr', 'get_logger',
'allow_connection_pickling', 'BufferTooShort', 'TimeoutError',
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition',
- 'Event', 'Queue', 'JoinableQueue', 'Pool', 'Value', 'Array',
- 'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING',
+ 'Event', 'Barrier', 'Queue', 'SimpleQueue', 'JoinableQueue', 'Pool',
+ 'Value', 'Array', 'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING',
]
__author__ = 'R. Oudkerk (r.m.oudkerk@gmail.com)'
@@ -161,7 +136,9 @@ def allow_connection_pickling():
'''
Install support for sending connections and sockets between processes
'''
- from multiprocessing import reduction
+ # This is undocumented. In previous versions of multiprocessing
+ # its only effect was to make socket objects inheritable on Windows.
+ import multiprocessing.connection
#
# Definitions depending on native semaphores
@@ -209,6 +186,13 @@ def Event():
from multiprocessing.synchronize import Event
return Event()
+def Barrier(parties, action=None, timeout=None):
+ '''
+ Returns a barrier object
+ '''
+ from multiprocessing.synchronize import Barrier
+ return Barrier(parties, action, timeout)
+
def Queue(maxsize=0):
'''
Returns a queue object
@@ -223,6 +207,13 @@ def JoinableQueue(maxsize=0):
from multiprocessing.queues import JoinableQueue
return JoinableQueue(maxsize)
+def SimpleQueue():
+ '''
+ Returns a queue object
+ '''
+ from multiprocessing.queues import SimpleQueue
+ return SimpleQueue()
+
def Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None):
'''
Returns a process pool object
@@ -244,19 +235,19 @@ def RawArray(typecode_or_type, size_or_initializer):
from multiprocessing.sharedctypes import RawArray
return RawArray(typecode_or_type, size_or_initializer)
-def Value(typecode_or_type, *args, **kwds):
+def Value(typecode_or_type, *args, lock=True):
'''
Returns a synchronized shared object
'''
from multiprocessing.sharedctypes import Value
- return Value(typecode_or_type, *args, **kwds)
+ return Value(typecode_or_type, *args, lock=lock)
-def Array(typecode_or_type, size_or_initializer, **kwds):
+def Array(typecode_or_type, size_or_initializer, *, lock=True):
'''
Returns a synchronized shared array
'''
from multiprocessing.sharedctypes import Array
- return Array(typecode_or_type, size_or_initializer, **kwds)
+ return Array(typecode_or_type, size_or_initializer, lock=lock)
#
#
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py
index 4fa6f70..fbbd5d9 100644
--- a/Lib/multiprocessing/connection.py
+++ b/Lib/multiprocessing/connection.py
@@ -4,49 +4,34 @@
# multiprocessing/connection.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
-__all__ = [ 'Client', 'Listener', 'Pipe' ]
+__all__ = [ 'Client', 'Listener', 'Pipe', 'wait' ]
+import io
import os
import sys
+import pickle
+import select
import socket
+import struct
import errno
import time
import tempfile
import itertools
import _multiprocessing
-from multiprocessing import current_process, AuthenticationError
+from multiprocessing import current_process, AuthenticationError, BufferTooShort
from multiprocessing.util import get_temp_dir, Finalize, sub_debug, debug
-from multiprocessing.forking import duplicate, close
-
+from multiprocessing.forking import ForkingPickler
+try:
+ import _winapi
+ from _winapi import WAIT_OBJECT_0, WAIT_TIMEOUT, INFINITE
+except ImportError:
+ if sys.platform == 'win32':
+ raise
+ _winapi = None
#
#
@@ -122,6 +107,309 @@ def address_type(address):
raise ValueError('address type of %r unrecognized' % address)
#
+# Connection classes
+#
+
+class _ConnectionBase:
+ _handle = None
+
+ def __init__(self, handle, readable=True, writable=True):
+ handle = handle.__index__()
+ if handle < 0:
+ raise ValueError("invalid handle")
+ if not readable and not writable:
+ raise ValueError(
+ "at least one of `readable` and `writable` must be True")
+ self._handle = handle
+ self._readable = readable
+ self._writable = writable
+
+ # XXX should we use util.Finalize instead of a __del__?
+
+ def __del__(self):
+ if self._handle is not None:
+ self._close()
+
+ def _check_closed(self):
+ if self._handle is None:
+ raise IOError("handle is closed")
+
+ def _check_readable(self):
+ if not self._readable:
+ raise IOError("connection is write-only")
+
+ def _check_writable(self):
+ if not self._writable:
+ raise IOError("connection is read-only")
+
+ def _bad_message_length(self):
+ if self._writable:
+ self._readable = False
+ else:
+ self.close()
+ raise IOError("bad message length")
+
+ @property
+ def closed(self):
+ """True if the connection is closed"""
+ return self._handle is None
+
+ @property
+ def readable(self):
+ """True if the connection is readable"""
+ return self._readable
+
+ @property
+ def writable(self):
+ """True if the connection is writable"""
+ return self._writable
+
+ def fileno(self):
+ """File descriptor or handle of the connection"""
+ self._check_closed()
+ return self._handle
+
+ def close(self):
+ """Close the connection"""
+ if self._handle is not None:
+ try:
+ self._close()
+ finally:
+ self._handle = None
+
+ def send_bytes(self, buf, offset=0, size=None):
+ """Send the bytes data from a bytes-like object"""
+ self._check_closed()
+ self._check_writable()
+ m = memoryview(buf)
+ # HACK for byte-indexing of non-bytewise buffers (e.g. array.array)
+ if m.itemsize > 1:
+ m = memoryview(bytes(m))
+ n = len(m)
+ if offset < 0:
+ raise ValueError("offset is negative")
+ if n < offset:
+ raise ValueError("buffer length < offset")
+ if size is None:
+ size = n - offset
+ elif size < 0:
+ raise ValueError("size is negative")
+ elif offset + size > n:
+ raise ValueError("buffer length < offset + size")
+ self._send_bytes(m[offset:offset + size])
+
+ def send(self, obj):
+ """Send a (picklable) object"""
+ self._check_closed()
+ self._check_writable()
+ buf = io.BytesIO()
+ ForkingPickler(buf, pickle.HIGHEST_PROTOCOL).dump(obj)
+ self._send_bytes(buf.getbuffer())
+
+ def recv_bytes(self, maxlength=None):
+ """
+ Receive bytes data as a bytes object.
+ """
+ self._check_closed()
+ self._check_readable()
+ if maxlength is not None and maxlength < 0:
+ raise ValueError("negative maxlength")
+ buf = self._recv_bytes(maxlength)
+ if buf is None:
+ self._bad_message_length()
+ return buf.getvalue()
+
+ def recv_bytes_into(self, buf, offset=0):
+ """
+ Receive bytes data into a writeable buffer-like object.
+ Return the number of bytes read.
+ """
+ self._check_closed()
+ self._check_readable()
+ with memoryview(buf) as m:
+ # Get bytesize of arbitrary buffer
+ itemsize = m.itemsize
+ bytesize = itemsize * len(m)
+ if offset < 0:
+ raise ValueError("negative offset")
+ elif offset > bytesize:
+ raise ValueError("offset too large")
+ result = self._recv_bytes()
+ size = result.tell()
+ if bytesize < offset + size:
+ raise BufferTooShort(result.getvalue())
+ # Message can fit in dest
+ result.seek(0)
+ result.readinto(m[offset // itemsize :
+ (offset + size) // itemsize])
+ return size
+
+ def recv(self):
+ """Receive a (picklable) object"""
+ self._check_closed()
+ self._check_readable()
+ buf = self._recv_bytes()
+ return pickle.loads(buf.getbuffer())
+
+ def poll(self, timeout=0.0):
+ """Whether there is any input available to be read"""
+ self._check_closed()
+ self._check_readable()
+ return self._poll(timeout)
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, exc_tb):
+ self.close()
+
+
+if _winapi:
+
+ class PipeConnection(_ConnectionBase):
+ """
+ Connection class based on a Windows named pipe.
+ Overlapped I/O is used, so the handles must have been created
+ with FILE_FLAG_OVERLAPPED.
+ """
+ _got_empty_message = False
+
+ def _close(self, _CloseHandle=_winapi.CloseHandle):
+ _CloseHandle(self._handle)
+
+ def _send_bytes(self, buf):
+ ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
+ try:
+ if err == _winapi.ERROR_IO_PENDING:
+ waitres = _winapi.WaitForMultipleObjects(
+ [ov.event], False, INFINITE)
+ assert waitres == WAIT_OBJECT_0
+ except:
+ ov.cancel()
+ raise
+ finally:
+ nwritten, err = ov.GetOverlappedResult(True)
+ assert err == 0
+ assert nwritten == len(buf)
+
+ def _recv_bytes(self, maxsize=None):
+ if self._got_empty_message:
+ self._got_empty_message = False
+ return io.BytesIO()
+ else:
+ bsize = 128 if maxsize is None else min(maxsize, 128)
+ try:
+ ov, err = _winapi.ReadFile(self._handle, bsize,
+ overlapped=True)
+ try:
+ if err == _winapi.ERROR_IO_PENDING:
+ waitres = _winapi.WaitForMultipleObjects(
+ [ov.event], False, INFINITE)
+ assert waitres == WAIT_OBJECT_0
+ except:
+ ov.cancel()
+ raise
+ finally:
+ nread, err = ov.GetOverlappedResult(True)
+ if err == 0:
+ f = io.BytesIO()
+ f.write(ov.getbuffer())
+ return f
+ elif err == _winapi.ERROR_MORE_DATA:
+ return self._get_more_data(ov, maxsize)
+ except IOError as e:
+ if e.winerror == _winapi.ERROR_BROKEN_PIPE:
+ raise EOFError
+ else:
+ raise
+ raise RuntimeError("shouldn't get here; expected KeyboardInterrupt")
+
+ def _poll(self, timeout):
+ if (self._got_empty_message or
+ _winapi.PeekNamedPipe(self._handle)[0] != 0):
+ return True
+ return bool(wait([self], timeout))
+
+ def _get_more_data(self, ov, maxsize):
+ buf = ov.getbuffer()
+ f = io.BytesIO()
+ f.write(buf)
+ left = _winapi.PeekNamedPipe(self._handle)[1]
+ assert left > 0
+ if maxsize is not None and len(buf) + left > maxsize:
+ self._bad_message_length()
+ ov, err = _winapi.ReadFile(self._handle, left, overlapped=True)
+ rbytes, err = ov.GetOverlappedResult(True)
+ assert err == 0
+ assert rbytes == left
+ f.write(ov.getbuffer())
+ return f
+
+
+class Connection(_ConnectionBase):
+ """
+ Connection class based on an arbitrary file descriptor (Unix only), or
+ a socket handle (Windows).
+ """
+
+ if _winapi:
+ def _close(self, _close=_multiprocessing.closesocket):
+ _close(self._handle)
+ _write = _multiprocessing.send
+ _read = _multiprocessing.recv
+ else:
+ def _close(self, _close=os.close):
+ _close(self._handle)
+ _write = os.write
+ _read = os.read
+
+ def _send(self, buf, write=_write):
+ remaining = len(buf)
+ while True:
+ n = write(self._handle, buf)
+ remaining -= n
+ if remaining == 0:
+ break
+ buf = buf[n:]
+
+ def _recv(self, size, read=_read):
+ buf = io.BytesIO()
+ handle = self._handle
+ remaining = size
+ while remaining > 0:
+ chunk = read(handle, remaining)
+ n = len(chunk)
+ if n == 0:
+ if remaining == size:
+ raise EOFError
+ else:
+ raise IOError("got end of file during message")
+ buf.write(chunk)
+ remaining -= n
+ return buf
+
+ def _send_bytes(self, buf):
+ # For wire compatibility with 3.2 and lower
+ n = len(buf)
+ self._send(struct.pack("!i", n))
+ # The condition is necessary to avoid "broken pipe" errors
+ # when sending a 0-length buffer if the other end closed the pipe.
+ if n > 0:
+ self._send(buf)
+
+ def _recv_bytes(self, maxsize=None):
+ buf = self._recv(4)
+ size, = struct.unpack("!i", buf.getvalue())
+ if maxsize is not None and size > maxsize:
+ return None
+ return self._recv(size)
+
+ def _poll(self, timeout):
+ r = wait([self._handle], timeout)
+ return bool(r)
+
+
+#
# Public functions
#
@@ -154,6 +442,8 @@ class Listener(object):
Returns a `Connection` object.
'''
+ if self._listener is None:
+ raise IOError('listener is closed')
c = self._listener.accept()
if self._authkey:
deliver_challenge(c, self._authkey)
@@ -164,11 +454,19 @@ class Listener(object):
'''
Close the bound socket or named pipe of `self`.
'''
- return self._listener.close()
+ if self._listener is not None:
+ self._listener.close()
+ self._listener = None
address = property(lambda self: self._listener._address)
last_accepted = property(lambda self: self._listener._last_accepted)
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, exc_tb):
+ self.close()
+
def Client(address, family=None, authkey=None):
'''
@@ -201,56 +499,52 @@ if sys.platform != 'win32':
s1, s2 = socket.socketpair()
s1.setblocking(True)
s2.setblocking(True)
- c1 = _multiprocessing.Connection(os.dup(s1.fileno()))
- c2 = _multiprocessing.Connection(os.dup(s2.fileno()))
- s1.close()
- s2.close()
+ c1 = Connection(s1.detach())
+ c2 = Connection(s2.detach())
else:
fd1, fd2 = os.pipe()
- c1 = _multiprocessing.Connection(fd1, writable=False)
- c2 = _multiprocessing.Connection(fd2, readable=False)
+ c1 = Connection(fd1, writable=False)
+ c2 = Connection(fd2, readable=False)
return c1, c2
else:
- from _multiprocessing import win32
-
def Pipe(duplex=True):
'''
Returns pair of connection objects at either end of a pipe
'''
address = arbitrary_address('AF_PIPE')
if duplex:
- openmode = win32.PIPE_ACCESS_DUPLEX
- access = win32.GENERIC_READ | win32.GENERIC_WRITE
+ openmode = _winapi.PIPE_ACCESS_DUPLEX
+ access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
obsize, ibsize = BUFSIZE, BUFSIZE
else:
- openmode = win32.PIPE_ACCESS_INBOUND
- access = win32.GENERIC_WRITE
+ openmode = _winapi.PIPE_ACCESS_INBOUND
+ access = _winapi.GENERIC_WRITE
obsize, ibsize = 0, BUFSIZE
- h1 = win32.CreateNamedPipe(
- address, openmode,
- win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE |
- win32.PIPE_WAIT,
- 1, obsize, ibsize, win32.NMPWAIT_WAIT_FOREVER, win32.NULL
+ h1 = _winapi.CreateNamedPipe(
+ address, openmode | _winapi.FILE_FLAG_OVERLAPPED |
+ _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE,
+ _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE |
+ _winapi.PIPE_WAIT,
+ 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL
)
- h2 = win32.CreateFile(
- address, access, 0, win32.NULL, win32.OPEN_EXISTING, 0, win32.NULL
+ h2 = _winapi.CreateFile(
+ address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING,
+ _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL
)
- win32.SetNamedPipeHandleState(
- h2, win32.PIPE_READMODE_MESSAGE, None, None
+ _winapi.SetNamedPipeHandleState(
+ h2, _winapi.PIPE_READMODE_MESSAGE, None, None
)
- try:
- win32.ConnectNamedPipe(h1, win32.NULL)
- except WindowsError as e:
- if e.args[0] != win32.ERROR_PIPE_CONNECTED:
- raise
+ overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True)
+ _, err = overlapped.GetOverlappedResult(True)
+ assert err == 0
- c1 = _multiprocessing.PipeConnection(h1, writable=duplex)
- c2 = _multiprocessing.PipeConnection(h2, readable=duplex)
+ c1 = PipeConnection(h1, writable=duplex)
+ c2 = PipeConnection(h2, readable=duplex)
return c1, c2
@@ -265,12 +559,15 @@ class SocketListener(object):
def __init__(self, address, family, backlog=1):
self._socket = socket.socket(getattr(socket, family))
try:
- self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ # SO_REUSEADDR has different semantics on Windows (issue #2550).
+ if os.name == 'posix':
+ self._socket.setsockopt(socket.SOL_SOCKET,
+ socket.SO_REUSEADDR, 1)
self._socket.setblocking(True)
self._socket.bind(address)
self._socket.listen(backlog)
self._address = self._socket.getsockname()
- except socket.error:
+ except OSError:
self._socket.close()
raise
self._family = family
@@ -286,10 +583,7 @@ class SocketListener(object):
def accept(self):
s, self._last_accepted = self._socket.accept()
s.setblocking(True)
- fd = duplicate(s.fileno())
- conn = _multiprocessing.Connection(fd)
- s.close()
- return conn
+ return Connection(s.detach())
def close(self):
self._socket.close()
@@ -304,24 +598,8 @@ def SocketClient(address):
family = address_type(address)
with socket.socket( getattr(socket, family) ) as s:
s.setblocking(True)
- t = _init_timeout()
-
- while 1:
- try:
- s.connect(address)
- except socket.error as e:
- if e.args[0] != errno.ECONNREFUSED or _check_timeout(t):
- debug('failed to connect to address %s', address)
- raise
- time.sleep(0.01)
- else:
- break
- else:
- raise
-
- fd = duplicate(s.fileno())
- conn = _multiprocessing.Connection(fd)
- return conn
+ s.connect(address)
+ return Connection(s.detach())
#
# Definitions for connections based on named pipes
@@ -335,48 +613,55 @@ if sys.platform == 'win32':
'''
def __init__(self, address, backlog=None):
self._address = address
- handle = win32.CreateNamedPipe(
- address, win32.PIPE_ACCESS_DUPLEX,
- win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE |
- win32.PIPE_WAIT,
- win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE,
- win32.NMPWAIT_WAIT_FOREVER, win32.NULL
- )
- self._handle_queue = [handle]
- self._last_accepted = None
+ self._handle_queue = [self._new_handle(first=True)]
+ self._last_accepted = None
sub_debug('listener created with address=%r', self._address)
-
self.close = Finalize(
self, PipeListener._finalize_pipe_listener,
args=(self._handle_queue, self._address), exitpriority=0
)
- def accept(self):
- newhandle = win32.CreateNamedPipe(
- self._address, win32.PIPE_ACCESS_DUPLEX,
- win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE |
- win32.PIPE_WAIT,
- win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE,
- win32.NMPWAIT_WAIT_FOREVER, win32.NULL
+ def _new_handle(self, first=False):
+ flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED
+ if first:
+ flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
+ return _winapi.CreateNamedPipe(
+ self._address, flags,
+ _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE |
+ _winapi.PIPE_WAIT,
+ _winapi.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE,
+ _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL
)
- self._handle_queue.append(newhandle)
+
+ def accept(self):
+ self._handle_queue.append(self._new_handle())
handle = self._handle_queue.pop(0)
try:
- win32.ConnectNamedPipe(handle, win32.NULL)
- except WindowsError as e:
+ ov = _winapi.ConnectNamedPipe(handle, overlapped=True)
+ except OSError as e:
+ if e.winerror != _winapi.ERROR_NO_DATA:
+ raise
# ERROR_NO_DATA can occur if a client has already connected,
# written data and then disconnected -- see Issue 14725.
- if e.args[0] not in (win32.ERROR_PIPE_CONNECTED,
- win32.ERROR_NO_DATA):
+ else:
+ try:
+ res = _winapi.WaitForMultipleObjects(
+ [ov.event], False, INFINITE)
+ except:
+ ov.cancel()
+ _winapi.CloseHandle(handle)
raise
- return _multiprocessing.PipeConnection(handle)
+ finally:
+ _, err = ov.GetOverlappedResult(True)
+ assert err == 0
+ return PipeConnection(handle)
@staticmethod
def _finalize_pipe_listener(queue, address):
sub_debug('closing listener with address=%r', address)
for handle in queue:
- close(handle)
+ _winapi.CloseHandle(handle)
def PipeClient(address):
'''
@@ -385,24 +670,25 @@ if sys.platform == 'win32':
t = _init_timeout()
while 1:
try:
- win32.WaitNamedPipe(address, 1000)
- h = win32.CreateFile(
- address, win32.GENERIC_READ | win32.GENERIC_WRITE,
- 0, win32.NULL, win32.OPEN_EXISTING, 0, win32.NULL
+ _winapi.WaitNamedPipe(address, 1000)
+ h = _winapi.CreateFile(
+ address, _winapi.GENERIC_READ | _winapi.GENERIC_WRITE,
+ 0, _winapi.NULL, _winapi.OPEN_EXISTING,
+ _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL
)
except WindowsError as e:
- if e.args[0] not in (win32.ERROR_SEM_TIMEOUT,
- win32.ERROR_PIPE_BUSY) or _check_timeout(t):
+ if e.winerror not in (_winapi.ERROR_SEM_TIMEOUT,
+ _winapi.ERROR_PIPE_BUSY) or _check_timeout(t):
raise
else:
break
else:
raise
- win32.SetNamedPipeHandleState(
- h, win32.PIPE_READMODE_MESSAGE, None, None
+ _winapi.SetNamedPipeHandleState(
+ h, _winapi.PIPE_READMODE_MESSAGE, None, None
)
- return _multiprocessing.PipeConnection(h)
+ return PipeConnection(h)
#
# Authentication stuff
@@ -459,10 +745,10 @@ class ConnectionWrapper(object):
return self._loads(s)
def _xml_dumps(obj):
- return xmlrpclib.dumps((obj,), None, None, None, 1).encode('utf8')
+ return xmlrpclib.dumps((obj,), None, None, None, 1).encode('utf-8')
def _xml_loads(s):
- (obj,), method = xmlrpclib.loads(s.decode('utf8'))
+ (obj,), method = xmlrpclib.loads(s.decode('utf-8'))
return obj
class XmlListener(Listener):
@@ -476,3 +762,140 @@ def XmlClient(*args, **kwds):
global xmlrpclib
import xmlrpc.client as xmlrpclib
return ConnectionWrapper(Client(*args, **kwds), _xml_dumps, _xml_loads)
+
+#
+# Wait
+#
+
+if sys.platform == 'win32':
+
+ def _exhaustive_wait(handles, timeout):
+ # Return ALL handles which are currently signalled. (Only
+ # returning the first signalled might create starvation issues.)
+ L = list(handles)
+ ready = []
+ while L:
+ res = _winapi.WaitForMultipleObjects(L, False, timeout)
+ if res == WAIT_TIMEOUT:
+ break
+ elif WAIT_OBJECT_0 <= res < WAIT_OBJECT_0 + len(L):
+ res -= WAIT_OBJECT_0
+ elif WAIT_ABANDONED_0 <= res < WAIT_ABANDONED_0 + len(L):
+ res -= WAIT_ABANDONED_0
+ else:
+ raise RuntimeError('Should not get here')
+ ready.append(L[res])
+ L = L[res+1:]
+ timeout = 0
+ return ready
+
+ _ready_errors = {_winapi.ERROR_BROKEN_PIPE, _winapi.ERROR_NETNAME_DELETED}
+
+ def wait(object_list, timeout=None):
+ '''
+ Wait till an object in object_list is ready/readable.
+
+ Returns list of those objects in object_list which are ready/readable.
+ '''
+ if timeout is None:
+ timeout = INFINITE
+ elif timeout < 0:
+ timeout = 0
+ else:
+ timeout = int(timeout * 1000 + 0.5)
+
+ object_list = list(object_list)
+ waithandle_to_obj = {}
+ ov_list = []
+ ready_objects = set()
+ ready_handles = set()
+
+ try:
+ for o in object_list:
+ try:
+ fileno = getattr(o, 'fileno')
+ except AttributeError:
+ waithandle_to_obj[o.__index__()] = o
+ else:
+ # start an overlapped read of length zero
+ try:
+ ov, err = _winapi.ReadFile(fileno(), 0, True)
+ except OSError as e:
+ err = e.winerror
+ if err not in _ready_errors:
+ raise
+ if err == _winapi.ERROR_IO_PENDING:
+ ov_list.append(ov)
+ waithandle_to_obj[ov.event] = o
+ else:
+ # If o.fileno() is an overlapped pipe handle and
+ # err == 0 then there is a zero length message
+ # in the pipe, but it HAS NOT been consumed.
+ ready_objects.add(o)
+ timeout = 0
+
+ ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout)
+ finally:
+ # request that overlapped reads stop
+ for ov in ov_list:
+ ov.cancel()
+
+ # wait for all overlapped reads to stop
+ for ov in ov_list:
+ try:
+ _, err = ov.GetOverlappedResult(True)
+ except OSError as e:
+ err = e.winerror
+ if err not in _ready_errors:
+ raise
+ if err != _winapi.ERROR_OPERATION_ABORTED:
+ o = waithandle_to_obj[ov.event]
+ ready_objects.add(o)
+ if err == 0:
+ # If o.fileno() is an overlapped pipe handle then
+ # a zero length message HAS been consumed.
+ if hasattr(o, '_got_empty_message'):
+ o._got_empty_message = True
+
+ ready_objects.update(waithandle_to_obj[h] for h in ready_handles)
+ return [o for o in object_list if o in ready_objects]
+
+else:
+
+ def wait(object_list, timeout=None):
+ '''
+ Wait till an object in object_list is ready/readable.
+
+ Returns list of those objects in object_list which are ready/readable.
+ '''
+ if timeout is not None:
+ if timeout <= 0:
+ return select.select(object_list, [], [], 0)[0]
+ else:
+ deadline = time.time() + timeout
+ while True:
+ try:
+ return select.select(object_list, [], [], timeout)[0]
+ except OSError as e:
+ if e.errno != errno.EINTR:
+ raise
+ if timeout is not None:
+ timeout = deadline - time.time()
+
+#
+# Make connection and socket objects sharable if possible
+#
+
+if sys.platform == 'win32':
+ from . import reduction
+ ForkingPickler.register(socket.socket, reduction.reduce_socket)
+ ForkingPickler.register(Connection, reduction.reduce_connection)
+ ForkingPickler.register(PipeConnection, reduction.reduce_pipe_connection)
+else:
+ try:
+ from . import reduction
+ except ImportError:
+ pass
+ else:
+ ForkingPickler.register(socket.socket, reduction.reduce_socket)
+ ForkingPickler.register(Connection, reduction.reduce_connection)
diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py
index 101c3cb..e31fc61 100644
--- a/Lib/multiprocessing/dummy/__init__.py
+++ b/Lib/multiprocessing/dummy/__init__.py
@@ -35,7 +35,7 @@
__all__ = [
'Process', 'current_process', 'active_children', 'freeze_support',
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition',
- 'Event', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue'
+ 'Event', 'Barrier', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue'
]
#
@@ -46,12 +46,10 @@ import threading
import sys
import weakref
import array
-import itertools
-from multiprocessing import TimeoutError, cpu_count
from multiprocessing.dummy.connection import Pipe
from threading import Lock, RLock, Semaphore, BoundedSemaphore
-from threading import Event
+from threading import Event, Condition, Barrier
from queue import Queue
#
@@ -85,17 +83,6 @@ class DummyProcess(threading.Thread):
#
#
-class Condition(threading._Condition):
- # XXX
- if sys.version_info < (3, 0):
- notify_all = threading._Condition.notify_all.__func__
- else:
- notify_all = threading._Condition.notify_all
-
-#
-#
-#
-
Process = DummyProcess
current_process = threading.current_thread
current_process()._children = weakref.WeakKeyDictionary()
diff --git a/Lib/multiprocessing/dummy/connection.py b/Lib/multiprocessing/dummy/connection.py
index af10579..874ec8e 100644
--- a/Lib/multiprocessing/dummy/connection.py
+++ b/Lib/multiprocessing/dummy/connection.py
@@ -53,6 +53,12 @@ class Listener(object):
address = property(lambda self: self._backlog_queue)
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, exc_tb):
+ self.close()
+
def Client(address):
_in, _out = Queue(), Queue()
@@ -85,3 +91,9 @@ class Connection(object):
def close(self):
pass
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, exc_tb):
+ self.close()
diff --git a/Lib/multiprocessing/forking.py b/Lib/multiprocessing/forking.py
index bc8ac44..af6580d 100644
--- a/Lib/multiprocessing/forking.py
+++ b/Lib/multiprocessing/forking.py
@@ -4,32 +4,7 @@
# multiprocessing/forking.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
import os
@@ -38,7 +13,7 @@ import signal
from multiprocessing import util, process
-__all__ = ['Popen', 'assert_spawning', 'exit', 'duplicate', 'close', 'ForkingPickler']
+__all__ = ['Popen', 'assert_spawning', 'duplicate', 'close', 'ForkingPickler']
#
# Check that the current thread is spawning a child process
@@ -55,18 +30,18 @@ def assert_spawning(self):
# Try making some callable types picklable
#
-from pickle import _Pickler as Pickler
+from pickle import Pickler
+from copyreg import dispatch_table
+
class ForkingPickler(Pickler):
- dispatch = Pickler.dispatch.copy()
+ _extra_reducers = {}
+ def __init__(self, *args):
+ Pickler.__init__(self, *args)
+ self.dispatch_table = dispatch_table.copy()
+ self.dispatch_table.update(self._extra_reducers)
@classmethod
def register(cls, type, reduce):
- def dispatcher(self, obj):
- rv = reduce(obj)
- if isinstance(rv, str):
- self.save_global(obj, rv)
- else:
- self.save_reduce(obj=obj, *rv)
- cls.dispatch[type] = dispatcher
+ cls._extra_reducers[type] = reduce
def _reduce_method(m):
if m.__self__ is None:
@@ -100,9 +75,6 @@ else:
#
if sys.platform != 'win32':
- import time
-
- exit = os._exit
duplicate = os.dup
close = os.close
@@ -118,14 +90,23 @@ if sys.platform != 'win32':
sys.stderr.flush()
self.returncode = None
+ r, w = os.pipe()
+ self.sentinel = r
+
self.pid = os.fork()
if self.pid == 0:
+ os.close(r)
if 'random' in sys.modules:
import random
random.seed()
code = process_obj._bootstrap()
os._exit(code)
+ # `w` will be closed when the child exits, at which point `r`
+ # will become ready for reading (using e.g. select()).
+ os.close(w)
+ util.Finalize(self, os.close, (r,))
+
def poll(self, flag=os.WNOHANG):
if self.returncode is None:
try:
@@ -143,26 +124,20 @@ if sys.platform != 'win32':
return self.returncode
def wait(self, timeout=None):
- if timeout is None:
- return self.poll(0)
- deadline = time.time() + timeout
- delay = 0.0005
- while 1:
- res = self.poll()
- if res is not None:
- break
- remaining = deadline - time.time()
- if remaining <= 0:
- break
- delay = min(delay * 2, remaining, 0.05)
- time.sleep(delay)
- return res
+ if self.returncode is None:
+ if timeout is not None:
+ from .connection import wait
+ if not wait([self.sentinel], timeout):
+ return None
+ # This shouldn't block if wait() returned successfully.
+ return self.poll(os.WNOHANG if timeout == 0.0 else 0)
+ return self.returncode
def terminate(self):
if self.returncode is None:
try:
os.kill(self.pid, signal.SIGTERM)
- except OSError as e:
+ except OSError:
if self.wait(timeout=0.1) is None:
raise
@@ -177,12 +152,9 @@ if sys.platform != 'win32':
else:
import _thread
import msvcrt
- import _subprocess
- import time
+ import _winapi
- from pickle import dump, load, HIGHEST_PROTOCOL
- from _multiprocessing import win32, Connection, PipeConnection
- from .util import Finalize
+ from pickle import load, HIGHEST_PROTOCOL
def dump(obj, file, protocol=None):
ForkingPickler(file, protocol).dump(obj)
@@ -195,8 +167,7 @@ else:
WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False))
WINSERVICE = sys.executable.lower().endswith("pythonservice.exe")
- exit = win32.ExitProcess
- close = win32.CloseHandle
+ close = _winapi.CloseHandle
#
# _python_exe is the assumed path to the python executable.
@@ -218,11 +189,11 @@ else:
def duplicate(handle, target_process=None, inheritable=False):
if target_process is None:
- target_process = _subprocess.GetCurrentProcess()
- return _subprocess.DuplicateHandle(
- _subprocess.GetCurrentProcess(), handle, target_process,
- 0, inheritable, _subprocess.DUPLICATE_SAME_ACCESS
- ).Detach()
+ target_process = _winapi.GetCurrentProcess()
+ return _winapi.DuplicateHandle(
+ _winapi.GetCurrentProcess(), handle, target_process,
+ 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS
+ )
#
# We define a Popen class similar to the one from subprocess, but
@@ -236,6 +207,9 @@ else:
_tls = _thread._local()
def __init__(self, process_obj):
+ cmd = ' '.join('"%s"' % x for x in get_command_line())
+ prep_data = get_preparation_data(process_obj._name)
+
# create pipe for communication with child
rfd, wfd = os.pipe()
@@ -243,30 +217,30 @@ else:
rhandle = duplicate(msvcrt.get_osfhandle(rfd), inheritable=True)
os.close(rfd)
- # start process
- cmd = get_command_line() + [rhandle]
- cmd = ' '.join('"%s"' % x for x in cmd)
- hp, ht, pid, tid = _subprocess.CreateProcess(
- _python_exe, cmd, None, None, 1, 0, None, None, None
- )
- ht.Close()
- close(rhandle)
-
- # set attributes of self
- self.pid = pid
- self.returncode = None
- self._handle = hp
-
- # send information to child
- prep_data = get_preparation_data(process_obj._name)
- to_child = os.fdopen(wfd, 'wb')
- Popen._tls.process_handle = int(hp)
- try:
- dump(prep_data, to_child, HIGHEST_PROTOCOL)
- dump(process_obj, to_child, HIGHEST_PROTOCOL)
- finally:
- del Popen._tls.process_handle
- to_child.close()
+ with open(wfd, 'wb', closefd=True) as to_child:
+ # start process
+ try:
+ hp, ht, pid, tid = _winapi.CreateProcess(
+ _python_exe, cmd + (' %s' % rhandle),
+ None, None, 1, 0, None, None, None
+ )
+ _winapi.CloseHandle(ht)
+ finally:
+ close(rhandle)
+
+ # set attributes of self
+ self.pid = pid
+ self.returncode = None
+ self._handle = hp
+ self.sentinel = int(hp)
+
+ # send information to child
+ Popen._tls.process_handle = int(hp)
+ try:
+ dump(prep_data, to_child, HIGHEST_PROTOCOL)
+ dump(process_obj, to_child, HIGHEST_PROTOCOL)
+ finally:
+ del Popen._tls.process_handle
@staticmethod
def thread_is_spawning():
@@ -279,13 +253,13 @@ else:
def wait(self, timeout=None):
if self.returncode is None:
if timeout is None:
- msecs = _subprocess.INFINITE
+ msecs = _winapi.INFINITE
else:
msecs = max(0, int(timeout * 1000 + 0.5))
- res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
- if res == _subprocess.WAIT_OBJECT_0:
- code = _subprocess.GetExitCodeProcess(self._handle)
+ res = _winapi.WaitForSingleObject(int(self._handle), msecs)
+ if res == _winapi.WAIT_OBJECT_0:
+ code = _winapi.GetExitCodeProcess(self._handle)
if code == TERMINATE:
code = -signal.SIGTERM
self.returncode = code
@@ -298,9 +272,9 @@ else:
def terminate(self):
if self.returncode is None:
try:
- _subprocess.TerminateProcess(int(self._handle), TERMINATE)
- except WindowsError:
- if self.wait(timeout=0.1) is None:
+ _winapi.TerminateProcess(int(self._handle), TERMINATE)
+ except OSError:
+ if self.wait(timeout=1.0) is None:
raise
#
@@ -350,7 +324,8 @@ else:
return [sys.executable, '--multiprocessing-fork']
else:
prog = 'from multiprocessing.forking import main; main()'
- return [_python_exe, '-c', prog, '--multiprocessing-fork']
+ opts = util._args_from_interpreter_flags()
+ return [_python_exe] + opts + ['-c', prog, '--multiprocessing-fork']
def main():
@@ -372,7 +347,7 @@ else:
from_parent.close()
exitcode = self._bootstrap()
- exit(exitcode)
+ sys.exit(exitcode)
def get_preparation_data(name):
@@ -405,22 +380,6 @@ else:
return d
- #
- # Make (Pipe)Connection picklable
- #
-
- def reduce_connection(conn):
- if not Popen.thread_is_spawning():
- raise RuntimeError(
- 'By default %s objects can only be shared between processes\n'
- 'using inheritance' % type(conn).__name__
- )
- return type(conn), (Popen.duplicate_for_child(conn.fileno()),
- conn.readable, conn.writable)
-
- ForkingPickler.register(Connection, reduce_connection)
- ForkingPickler.register(PipeConnection, reduce_connection)
-
#
# Prepare current process
#
diff --git a/Lib/multiprocessing/heap.py b/Lib/multiprocessing/heap.py
index 0a25ef0..4e93c12 100644
--- a/Lib/multiprocessing/heap.py
+++ b/Lib/multiprocessing/heap.py
@@ -4,37 +4,11 @@
# multiprocessing/heap.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
import bisect
import mmap
-import tempfile
import os
import sys
import threading
@@ -52,7 +26,7 @@ __all__ = ['BufferWrapper']
if sys.platform == 'win32':
- from _multiprocessing import win32
+ import _winapi
class Arena(object):
@@ -62,7 +36,7 @@ if sys.platform == 'win32':
self.size = size
self.name = 'pym-%d-%d' % (os.getpid(), next(Arena._counter))
self.buffer = mmap.mmap(-1, self.size, tagname=self.name)
- assert win32.GetLastError() == 0, 'tagname already in use'
+ assert _winapi.GetLastError() == 0, 'tagname already in use'
self._state = (self.size, self.name)
def __getstate__(self):
@@ -72,7 +46,7 @@ if sys.platform == 'win32':
def __setstate__(self, state):
self.size, self.name = self._state = state
self.buffer = mmap.mmap(-1, self.size, tagname=self.name)
- assert win32.GetLastError() == win32.ERROR_ALREADY_EXISTS
+ assert _winapi.GetLastError() == _winapi.ERROR_ALREADY_EXISTS
else:
@@ -231,7 +205,7 @@ class Heap(object):
self._lock.release()
#
-# Class representing a chunk of an mmap -- can be inherited
+# Class representing a chunk of an mmap -- can be inherited by child process
#
class BufferWrapper(object):
@@ -244,11 +218,6 @@ class BufferWrapper(object):
self._state = (block, size)
Finalize(self, BufferWrapper._heap.free, args=(block,))
- def get_address(self):
+ def create_memoryview(self):
(arena, start, stop), size = self._state
- address, length = _multiprocessing.address_of_buffer(arena.buffer)
- assert size <= length
- return address + start
-
- def get_size(self):
- return self._state[1]
+ return memoryview(arena.buffer)[start:start+size]
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 5588ead..1ab147e 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -5,32 +5,7 @@
# multiprocessing/managers.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = [ 'BaseManager', 'SyncManager', 'BaseProxy', 'Token' ]
@@ -39,19 +14,16 @@ __all__ = [ 'BaseManager', 'SyncManager', 'BaseProxy', 'Token' ]
# Imports
#
-import os
import sys
-import weakref
import threading
import array
import queue
from traceback import format_exc
-from pickle import PicklingError
from multiprocessing import Process, current_process, active_children, Pool, util, connection
from multiprocessing.process import AuthenticationString
-from multiprocessing.forking import exit, Popen, assert_spawning, ForkingPickler
-from multiprocessing.util import Finalize, info
+from multiprocessing.forking import Popen, ForkingPickler
+from time import time as _time
#
# Register some things for pickling
@@ -168,28 +140,38 @@ class Server(object):
self.id_to_obj = {'0': (None, ())}
self.id_to_refcount = {}
self.mutex = threading.RLock()
- self.stop = 0
def serve_forever(self):
'''
Run the server forever
'''
+ self.stop_event = threading.Event()
current_process()._manager_server = self
try:
+ accepter = threading.Thread(target=self.accepter)
+ accepter.daemon = True
+ accepter.start()
try:
- while 1:
- try:
- c = self.listener.accept()
- except (OSError, IOError):
- continue
- t = threading.Thread(target=self.handle_request, args=(c,))
- t.daemon = True
- t.start()
+ while not self.stop_event.is_set():
+ self.stop_event.wait(1)
except (KeyboardInterrupt, SystemExit):
pass
finally:
- self.stop = 999
- self.listener.close()
+ if sys.stdout != sys.__stdout__:
+ util.debug('resetting stdout, stderr')
+ sys.stdout = sys.__stdout__
+ sys.stderr = sys.__stderr__
+ sys.exit(0)
+
+ def accepter(self):
+ while True:
+ try:
+ c = self.listener.accept()
+ except (OSError, IOError):
+ continue
+ t = threading.Thread(target=self.handle_request, args=(c,))
+ t.daemon = True
+ t.start()
def handle_request(self, c):
'''
@@ -236,7 +218,7 @@ class Server(object):
send = conn.send
id_to_obj = self.id_to_obj
- while not self.stop:
+ while not self.stop_event.is_set():
try:
methodname = obj = None
@@ -346,32 +328,13 @@ class Server(object):
Shutdown this process
'''
try:
- try:
- util.debug('manager received shutdown message')
- c.send(('#RETURN', None))
-
- if sys.stdout != sys.__stdout__:
- util.debug('resetting stdout, stderr')
- sys.stdout = sys.__stdout__
- sys.stderr = sys.__stderr__
-
- util._run_finalizers(0)
-
- for p in active_children():
- util.debug('terminating a child process of manager')
- p.terminate()
-
- for p in active_children():
- util.debug('terminating a child process of manager')
- p.join()
-
- util._run_finalizers()
- util.info('manager exiting with exitcode 0')
- except:
- import traceback
- traceback.print_exc()
+ util.debug('manager received shutdown message')
+ c.send(('#RETURN', None))
+ except:
+ import traceback
+ traceback.print_exc()
finally:
- exit(0)
+ self.stop_event.set()
def create(self, c, typeid, *args, **kwds):
'''
@@ -483,10 +446,6 @@ class BaseManager(object):
self._serializer = serializer
self._Listener, self._Client = listener_client[serializer]
- def __reduce__(self):
- return type(self).from_address, \
- (self._address, self._authkey, self._serializer)
-
def get_server(self):
'''
Return server object with serve_forever() method and address attribute
@@ -576,7 +535,10 @@ class BaseManager(object):
'''
Join the manager process (if it has been spawned)
'''
- self._process.join(timeout)
+ if self._process is not None:
+ self._process.join(timeout)
+ if not self._process.is_alive():
+ self._process = None
def _debug_info(self):
'''
@@ -599,6 +561,9 @@ class BaseManager(object):
conn.close()
def __enter__(self):
+ if self._state.value == State.INITIAL:
+ self.start()
+ assert self._state.value == State.STARTED
return self
def __exit__(self, exc_type, exc_val, exc_tb):
@@ -620,7 +585,7 @@ class BaseManager(object):
except Exception:
pass
- process.join(timeout=0.2)
+ process.join(timeout=1.0)
if process.is_alive():
util.info('manager still alive')
if hasattr(process, 'terminate'):
@@ -982,8 +947,9 @@ class IteratorProxy(BaseProxy):
class AcquirerProxy(BaseProxy):
_exposed_ = ('acquire', 'release')
- def acquire(self, blocking=True):
- return self._callmethod('acquire', (blocking,))
+ def acquire(self, blocking=True, timeout=None):
+ args = (blocking,) if timeout is None else (blocking, timeout)
+ return self._callmethod('acquire', args)
def release(self):
return self._callmethod('release')
def __enter__(self):
@@ -1000,6 +966,24 @@ class ConditionProxy(AcquirerProxy):
return self._callmethod('notify')
def notify_all(self):
return self._callmethod('notify_all')
+ def wait_for(self, predicate, timeout=None):
+ result = predicate()
+ if result:
+ return result
+ if timeout is not None:
+ endtime = _time() + timeout
+ else:
+ endtime = None
+ waittime = None
+ while not result:
+ if endtime is not None:
+ waittime = endtime - _time()
+ if waittime <= 0:
+ break
+ self.wait(waittime)
+ result = predicate()
+ return result
+
class EventProxy(BaseProxy):
_exposed_ = ('is_set', 'set', 'clear', 'wait')
@@ -1012,6 +996,26 @@ class EventProxy(BaseProxy):
def wait(self, timeout=None):
return self._callmethod('wait', (timeout,))
+
+class BarrierProxy(BaseProxy):
+ _exposed_ = ('__getattribute__', 'wait', 'abort', 'reset')
+ def wait(self, timeout=None):
+ return self._callmethod('wait', (timeout,))
+ def abort(self):
+ return self._callmethod('abort')
+ def reset(self):
+ return self._callmethod('reset')
+ @property
+ def parties(self):
+ return self._callmethod('__getattribute__', ('parties',))
+ @property
+ def n_waiting(self):
+ return self._callmethod('__getattribute__', ('n_waiting',))
+ @property
+ def broken(self):
+ return self._callmethod('__getattribute__', ('broken',))
+
+
class NamespaceProxy(BaseProxy):
_exposed_ = ('__getattribute__', '__setattr__', '__delattr__')
def __getattr__(self, key):
@@ -1041,12 +1045,11 @@ class ValueProxy(BaseProxy):
BaseListProxy = MakeProxyType('BaseListProxy', (
- '__add__', '__contains__', '__delitem__', '__delslice__',
- '__getitem__', '__getslice__', '__len__', '__mul__',
- '__reversed__', '__rmul__', '__setitem__', '__setslice__',
+ '__add__', '__contains__', '__delitem__', '__getitem__', '__len__',
+ '__mul__', '__reversed__', '__rmul__', '__setitem__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort', '__imul__'
- )) # XXX __getslice__ and __setslice__ unneeded in Py3.0
+ ))
class ListProxy(BaseListProxy):
def __iadd__(self, value):
self._callmethod('extend', (value,))
@@ -1064,17 +1067,18 @@ DictProxy = MakeProxyType('DictProxy', (
ArrayProxy = MakeProxyType('ArrayProxy', (
- '__len__', '__getitem__', '__setitem__', '__getslice__', '__setslice__'
- )) # XXX __getslice__ and __setslice__ unneeded in Py3.0
+ '__len__', '__getitem__', '__setitem__'
+ ))
PoolProxy = MakeProxyType('PoolProxy', (
'apply', 'apply_async', 'close', 'imap', 'imap_unordered', 'join',
- 'map', 'map_async', 'terminate'
+ 'map', 'map_async', 'starmap', 'starmap_async', 'terminate'
))
PoolProxy._method_to_typeid_ = {
'apply_async': 'AsyncResult',
'map_async': 'AsyncResult',
+ 'starmap_async': 'AsyncResult',
'imap': 'Iterator',
'imap_unordered': 'Iterator'
}
@@ -1103,6 +1107,7 @@ SyncManager.register('Semaphore', threading.Semaphore, AcquirerProxy)
SyncManager.register('BoundedSemaphore', threading.BoundedSemaphore,
AcquirerProxy)
SyncManager.register('Condition', threading.Condition, ConditionProxy)
+SyncManager.register('Barrier', threading.Barrier, BarrierProxy)
SyncManager.register('Pool', Pool, PoolProxy)
SyncManager.register('list', list, ListProxy)
SyncManager.register('dict', dict, DictProxy)
diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
index 7502ff8..7f73b44 100644
--- a/Lib/multiprocessing/pool.py
+++ b/Lib/multiprocessing/pool.py
@@ -4,32 +4,7 @@
# multiprocessing/pool.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = ['Pool']
@@ -64,6 +39,9 @@ job_counter = itertools.count()
def mapstar(args):
return list(map(*args))
+def starmapstar(args):
+ return list(itertools.starmap(args[0], args[1]))
+
#
# Code run by worker processes
#
@@ -247,14 +225,30 @@ class Pool(object):
Apply `func` to each element in `iterable`, collecting the results
in a list that is returned.
'''
- assert self._state == RUN
- return self.map_async(func, iterable, chunksize).get()
+ return self._map_async(func, iterable, mapstar, chunksize).get()
+
+ def starmap(self, func, iterable, chunksize=None):
+ '''
+ Like `map()` method but the elements of the `iterable` are expected to
+ be iterables as well and will be unpacked as arguments. Hence
+ `func` and (a, b) becomes func(a, b).
+ '''
+ return self._map_async(func, iterable, starmapstar, chunksize).get()
+
+ def starmap_async(self, func, iterable, chunksize=None, callback=None,
+ error_callback=None):
+ '''
+ Asynchronous version of `starmap()` method.
+ '''
+ return self._map_async(func, iterable, starmapstar, chunksize,
+ callback, error_callback)
def imap(self, func, iterable, chunksize=1):
'''
Equivalent of `map()` -- can be MUCH slower than `Pool.map()`.
'''
- assert self._state == RUN
+ if self._state != RUN:
+ raise ValueError("Pool not running")
if chunksize == 1:
result = IMapIterator(self._cache)
self._taskqueue.put((((result._job, i, func, (x,), {})
@@ -272,7 +266,8 @@ class Pool(object):
'''
Like `imap()` method but ordering of results is arbitrary.
'''
- assert self._state == RUN
+ if self._state != RUN:
+ raise ValueError("Pool not running")
if chunksize == 1:
result = IMapUnorderedIterator(self._cache)
self._taskqueue.put((((result._job, i, func, (x,), {})
@@ -291,7 +286,8 @@ class Pool(object):
'''
Asynchronous version of `apply()` method.
'''
- assert self._state == RUN
+ if self._state != RUN:
+ raise ValueError("Pool not running")
result = ApplyResult(self._cache, callback, error_callback)
self._taskqueue.put(([(result._job, None, func, args, kwds)], None))
return result
@@ -301,7 +297,16 @@ class Pool(object):
'''
Asynchronous version of `map()` method.
'''
- assert self._state == RUN
+ return self._map_async(func, iterable, mapstar, chunksize, callback,
+ error_callback)
+
+ def _map_async(self, func, iterable, mapper, chunksize=None, callback=None,
+ error_callback=None):
+ '''
+ Helper function to implement map, starmap and their async counterparts.
+ '''
+ if self._state != RUN:
+ raise ValueError("Pool not running")
if not hasattr(iterable, '__len__'):
iterable = list(iterable)
@@ -315,7 +320,7 @@ class Pool(object):
task_batches = Pool._get_tasks(func, iterable, chunksize)
result = MapResult(self._cache, chunksize, len(iterable), callback,
error_callback=error_callback)
- self._taskqueue.put((((result._job, i, mapstar, (x,), {})
+ self._taskqueue.put((((result._job, i, mapper, (x,), {})
for i, x in enumerate(task_batches)), None))
return result
@@ -519,6 +524,12 @@ class Pool(object):
debug('cleaning up worker %d' % p.pid)
p.join()
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.terminate()
+
#
# Class whose instances are returned by `Pool.apply_async()`
#
@@ -526,32 +537,26 @@ class Pool(object):
class ApplyResult(object):
def __init__(self, cache, callback, error_callback):
- self._cond = threading.Condition(threading.Lock())
+ self._event = threading.Event()
self._job = next(job_counter)
self._cache = cache
- self._ready = False
self._callback = callback
self._error_callback = error_callback
cache[self._job] = self
def ready(self):
- return self._ready
+ return self._event.is_set()
def successful(self):
- assert self._ready
+ assert self.ready()
return self._success
def wait(self, timeout=None):
- self._cond.acquire()
- try:
- if not self._ready:
- self._cond.wait(timeout)
- finally:
- self._cond.release()
+ self._event.wait(timeout)
def get(self, timeout=None):
self.wait(timeout)
- if not self._ready:
+ if not self.ready():
raise TimeoutError
if self._success:
return self._value
@@ -564,12 +569,7 @@ class ApplyResult(object):
self._callback(self._value)
if self._error_callback and not self._success:
self._error_callback(self._value)
- self._cond.acquire()
- try:
- self._ready = True
- self._cond.notify()
- finally:
- self._cond.release()
+ self._event.set()
del self._cache[self._job]
#
@@ -586,7 +586,7 @@ class MapResult(ApplyResult):
self._chunksize = chunksize
if chunksize <= 0:
self._number_left = 0
- self._ready = True
+ self._event.set()
del cache[self._job]
else:
self._number_left = length//chunksize + bool(length % chunksize)
@@ -600,24 +600,14 @@ class MapResult(ApplyResult):
if self._callback:
self._callback(self._value)
del self._cache[self._job]
- self._cond.acquire()
- try:
- self._ready = True
- self._cond.notify()
- finally:
- self._cond.release()
+ self._event.set()
else:
self._success = False
self._value = result
if self._error_callback:
self._error_callback(self._value)
del self._cache[self._job]
- self._cond.acquire()
- try:
- self._ready = True
- self._cond.notify()
- finally:
- self._cond.release()
+ self._event.set()
#
# Class whose instances are returned by `Pool.imap()`
diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
index 3262b50..893507b 100644
--- a/Lib/multiprocessing/process.py
+++ b/Lib/multiprocessing/process.py
@@ -4,32 +4,7 @@
# multiprocessing/process.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = ['Process', 'current_process', 'active_children']
@@ -92,12 +67,16 @@ class Process(object):
'''
_Popen = None
- def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
+ def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
+ *, daemon=None):
assert group is None, 'group argument must be None for now'
count = next(_current_process._counter)
self._identity = _current_process._identity + (count,)
self._authkey = _current_process._authkey
- self._daemonic = _current_process._daemonic
+ if daemon is not None:
+ self._daemonic = daemon
+ else:
+ self._daemonic = _current_process._daemonic
self._tempdir = _current_process._tempdir
self._parent_pid = os.getpid()
self._popen = None
@@ -130,6 +109,7 @@ class Process(object):
else:
from .forking import Popen
self._popen = Popen(self)
+ self._sentinel = self._popen.sentinel
_current_process._children.add(self)
def terminate(self):
@@ -216,6 +196,17 @@ class Process(object):
pid = ident
+ @property
+ def sentinel(self):
+ '''
+ Return a file descriptor (Unix) or handle (Windows) suitable for
+ waiting for process termination.
+ '''
+ try:
+ return self._sentinel
+ except AttributeError:
+ raise ValueError("process not started")
+
def __repr__(self):
if self is _current_process:
status = 'started'
diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py
index 51d9912..37271fb 100644
--- a/Lib/multiprocessing/queues.py
+++ b/Lib/multiprocessing/queues.py
@@ -4,32 +4,7 @@
# multiprocessing/queues.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = ['Queue', 'SimpleQueue', 'JoinableQueue']
@@ -39,12 +14,12 @@ import os
import threading
import collections
import time
-import atexit
import weakref
+import errno
from queue import Empty, Full
import _multiprocessing
-from multiprocessing import Pipe
+from multiprocessing.connection import Pipe
from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
from multiprocessing.util import debug, info, Finalize, register_after_fork
from multiprocessing.forking import assert_spawning
@@ -67,6 +42,8 @@ class Queue(object):
else:
self._wlock = Lock()
self._sem = BoundedSemaphore(maxsize)
+ # For use by concurrent.futures
+ self._ignore_epipe = False
self._after_fork()
@@ -75,11 +52,11 @@ class Queue(object):
def __getstate__(self):
assert_spawning(self)
- return (self._maxsize, self._reader, self._writer,
+ return (self._ignore_epipe, self._maxsize, self._reader, self._writer,
self._rlock, self._wlock, self._sem, self._opid)
def __setstate__(self, state):
- (self._maxsize, self._reader, self._writer,
+ (self._ignore_epipe, self._maxsize, self._reader, self._writer,
self._rlock, self._wlock, self._sem, self._opid) = state
self._after_fork()
@@ -182,7 +159,7 @@ class Queue(object):
self._thread = threading.Thread(
target=Queue._feed,
args=(self._buffer, self._notempty, self._send,
- self._wlock, self._writer.close),
+ self._wlock, self._writer.close, self._ignore_epipe),
name='QueueFeederThread'
)
self._thread.daemon = True
@@ -233,7 +210,7 @@ class Queue(object):
notempty.release()
@staticmethod
- def _feed(buffer, notempty, send, writelock, close):
+ def _feed(buffer, notempty, send, writelock, close, ignore_epipe):
debug('starting thread to feed data to pipe')
from .util import is_exiting
@@ -275,6 +252,8 @@ class Queue(object):
except IndexError:
pass
except Exception as e:
+ if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE:
+ return
# Since this runs in a daemon thread the resources it uses
# may be become unusable while the process is cleaning up.
# We ignore errors which happen after the process has
@@ -356,6 +335,7 @@ class SimpleQueue(object):
def __init__(self):
self._reader, self._writer = Pipe(duplex=False)
self._rlock = Lock()
+ self._poll = self._reader.poll
if sys.platform == 'win32':
self._wlock = None
else:
@@ -363,7 +343,7 @@ class SimpleQueue(object):
self._make_methods()
def empty(self):
- return not self._reader.poll()
+ return not self._poll()
def __getstate__(self):
assert_spawning(self)
diff --git a/Lib/multiprocessing/reduction.py b/Lib/multiprocessing/reduction.py
index 6e5e5bc..656fa8f 100644
--- a/Lib/multiprocessing/reduction.py
+++ b/Lib/multiprocessing/reduction.py
@@ -5,53 +5,29 @@
# multiprocessing/reduction.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
-__all__ = []
+__all__ = ['reduce_socket', 'reduce_connection', 'send_handle', 'recv_handle']
import os
import sys
import socket
import threading
+import struct
+import signal
-import _multiprocessing
from multiprocessing import current_process
-from multiprocessing.forking import Popen, duplicate, close, ForkingPickler
from multiprocessing.util import register_after_fork, debug, sub_debug
-from multiprocessing.connection import Client, Listener
+from multiprocessing.util import is_exiting, sub_warning
#
#
#
-if not(sys.platform == 'win32' or hasattr(_multiprocessing, 'recvfd')):
+if not(sys.platform == 'win32' or (hasattr(socket, 'CMSG_LEN') and
+ hasattr(socket, 'SCM_RIGHTS'))):
raise ImportError('pickling of connections not supported')
#
@@ -59,157 +35,246 @@ if not(sys.platform == 'win32' or hasattr(_multiprocessing, 'recvfd')):
#
if sys.platform == 'win32':
- import _subprocess
- from _multiprocessing import win32
-
- def send_handle(conn, handle, destination_pid):
- process_handle = win32.OpenProcess(
- win32.PROCESS_ALL_ACCESS, False, destination_pid
- )
- try:
- new_handle = duplicate(handle, process_handle)
- conn.send(new_handle)
- finally:
- close(process_handle)
-
- def recv_handle(conn):
- return conn.recv()
+ # Windows
+ __all__ += ['reduce_pipe_connection']
+ import _winapi
-else:
def send_handle(conn, handle, destination_pid):
- _multiprocessing.sendfd(conn.fileno(), handle)
+ dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid)
+ conn.send(dh)
def recv_handle(conn):
- return _multiprocessing.recvfd(conn.fileno())
-
-#
-# Support for a per-process server thread which caches pickled handles
-#
-
-_cache = set()
-
-def _reset(obj):
- global _lock, _listener, _cache
- for h in _cache:
- close(h)
- _cache.clear()
- _lock = threading.Lock()
- _listener = None
-
-_reset(None)
-register_after_fork(_reset, _reset)
-
-def _get_listener():
- global _listener
-
- if _listener is None:
- _lock.acquire()
- try:
- if _listener is None:
- debug('starting listener and thread for sending handles')
- _listener = Listener(authkey=current_process().authkey)
- t = threading.Thread(target=_serve)
- t.daemon = True
- t.start()
- finally:
- _lock.release()
-
- return _listener
-
-def _serve():
- from .util import is_exiting, sub_warning
-
- while 1:
- try:
- conn = _listener.accept()
- handle_wanted, destination_pid = conn.recv()
- _cache.remove(handle_wanted)
- send_handle(conn, handle_wanted, destination_pid)
- close(handle_wanted)
- conn.close()
- except:
- if not is_exiting():
- import traceback
- sub_warning(
- 'thread for sharing handles raised exception :\n' +
- '-'*79 + '\n' + traceback.format_exc() + '-'*79
- )
-
-#
-# Functions to be used for pickling/unpickling objects with handles
-#
-
-def reduce_handle(handle):
- if Popen.thread_is_spawning():
- return (None, Popen.duplicate_for_child(handle), True)
- dup_handle = duplicate(handle)
- _cache.add(dup_handle)
- sub_debug('reducing handle %d', handle)
- return (_get_listener().address, dup_handle, False)
-
-def rebuild_handle(pickled_data):
- address, handle, inherited = pickled_data
- if inherited:
- return handle
- sub_debug('rebuilding handle %d', handle)
- conn = Client(address, authkey=current_process().authkey)
- conn.send((handle, os.getpid()))
- new_handle = recv_handle(conn)
- conn.close()
- return new_handle
+ return conn.recv().detach()
+
+ class DupHandle(object):
+ def __init__(self, handle, access, pid=None):
+ # duplicate handle for process with given pid
+ if pid is None:
+ pid = os.getpid()
+ proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid)
+ try:
+ self._handle = _winapi.DuplicateHandle(
+ _winapi.GetCurrentProcess(),
+ handle, proc, access, False, 0)
+ finally:
+ _winapi.CloseHandle(proc)
+ self._access = access
+ self._pid = pid
+
+ def detach(self):
+ # retrieve handle from process which currently owns it
+ if self._pid == os.getpid():
+ return self._handle
+ proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False,
+ self._pid)
+ try:
+ return _winapi.DuplicateHandle(
+ proc, self._handle, _winapi.GetCurrentProcess(),
+ self._access, False, _winapi.DUPLICATE_CLOSE_SOURCE)
+ finally:
+ _winapi.CloseHandle(proc)
+
+ class DupSocket(object):
+ def __init__(self, sock):
+ new_sock = sock.dup()
+ def send(conn, pid):
+ share = new_sock.share(pid)
+ conn.send_bytes(share)
+ self._id = resource_sharer.register(send, new_sock.close)
+
+ def detach(self):
+ conn = resource_sharer.get_connection(self._id)
+ try:
+ share = conn.recv_bytes()
+ return socket.fromshare(share)
+ finally:
+ conn.close()
+
+ def reduce_socket(s):
+ return rebuild_socket, (DupSocket(s),)
+
+ def rebuild_socket(ds):
+ return ds.detach()
+
+ def reduce_connection(conn):
+ handle = conn.fileno()
+ with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s:
+ ds = DupSocket(s)
+ return rebuild_connection, (ds, conn.readable, conn.writable)
+
+ def rebuild_connection(ds, readable, writable):
+ from .connection import Connection
+ sock = ds.detach()
+ return Connection(sock.detach(), readable, writable)
-#
-# Register `_multiprocessing.Connection` with `ForkingPickler`
-#
-
-def reduce_connection(conn):
- rh = reduce_handle(conn.fileno())
- return rebuild_connection, (rh, conn.readable, conn.writable)
-
-def rebuild_connection(reduced_handle, readable, writable):
- handle = rebuild_handle(reduced_handle)
- return _multiprocessing.Connection(
- handle, readable=readable, writable=writable
- )
-
-ForkingPickler.register(_multiprocessing.Connection, reduce_connection)
+ def reduce_pipe_connection(conn):
+ access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) |
+ (_winapi.FILE_GENERIC_WRITE if conn.writable else 0))
+ dh = DupHandle(conn.fileno(), access)
+ return rebuild_pipe_connection, (dh, conn.readable, conn.writable)
-#
-# Register `socket.socket` with `ForkingPickler`
-#
+ def rebuild_pipe_connection(dh, readable, writable):
+ from .connection import PipeConnection
+ handle = dh.detach()
+ return PipeConnection(handle, readable, writable)
-def fromfd(fd, family, type_, proto=0):
- s = socket.fromfd(fd, family, type_, proto)
- if s.__class__ is not socket.socket:
- s = socket.socket(_sock=s)
- return s
+else:
+ # Unix
-def reduce_socket(s):
- reduced_handle = reduce_handle(s.fileno())
- return rebuild_socket, (reduced_handle, s.family, s.type, s.proto)
+ # On MacOSX we should acknowledge receipt of fds -- see Issue14669
+ ACKNOWLEDGE = sys.platform == 'darwin'
-def rebuild_socket(reduced_handle, family, type_, proto):
- fd = rebuild_handle(reduced_handle)
- _sock = fromfd(fd, family, type_, proto)
- close(fd)
- return _sock
+ def send_handle(conn, handle, destination_pid):
+ with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
+ s.sendmsg([b'x'], [(socket.SOL_SOCKET, socket.SCM_RIGHTS,
+ struct.pack("@i", handle))])
+ if ACKNOWLEDGE and conn.recv_bytes() != b'ACK':
+ raise RuntimeError('did not receive acknowledgement of fd')
-ForkingPickler.register(socket.socket, reduce_socket)
+ def recv_handle(conn):
+ size = struct.calcsize("@i")
+ with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
+ msg, ancdata, flags, addr = s.recvmsg(1, socket.CMSG_LEN(size))
+ try:
+ if ACKNOWLEDGE:
+ conn.send_bytes(b'ACK')
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ if (cmsg_level == socket.SOL_SOCKET and
+ cmsg_type == socket.SCM_RIGHTS):
+ return struct.unpack("@i", cmsg_data[:size])[0]
+ except (ValueError, IndexError, struct.error):
+ pass
+ raise RuntimeError('Invalid data received')
+
+ class DupFd(object):
+ def __init__(self, fd):
+ new_fd = os.dup(fd)
+ def send(conn, pid):
+ send_handle(conn, new_fd, pid)
+ def close():
+ os.close(new_fd)
+ self._id = resource_sharer.register(send, close)
+
+ def detach(self):
+ conn = resource_sharer.get_connection(self._id)
+ try:
+ return recv_handle(conn)
+ finally:
+ conn.close()
+
+ def reduce_socket(s):
+ df = DupFd(s.fileno())
+ return rebuild_socket, (df, s.family, s.type, s.proto)
+
+ def rebuild_socket(df, family, type, proto):
+ fd = df.detach()
+ s = socket.fromfd(fd, family, type, proto)
+ os.close(fd)
+ return s
+
+ def reduce_connection(conn):
+ df = DupFd(conn.fileno())
+ return rebuild_connection, (df, conn.readable, conn.writable)
+
+ def rebuild_connection(df, readable, writable):
+ from .connection import Connection
+ fd = df.detach()
+ return Connection(fd, readable, writable)
#
-# Register `_multiprocessing.PipeConnection` with `ForkingPickler`
+# Server which shares registered resources with clients
#
-if sys.platform == 'win32':
-
- def reduce_pipe_connection(conn):
- rh = reduce_handle(conn.fileno())
- return rebuild_pipe_connection, (rh, conn.readable, conn.writable)
-
- def rebuild_pipe_connection(reduced_handle, readable, writable):
- handle = rebuild_handle(reduced_handle)
- return _multiprocessing.PipeConnection(
- handle, readable=readable, writable=writable
- )
-
- ForkingPickler.register(_multiprocessing.PipeConnection, reduce_pipe_connection)
+class ResourceSharer(object):
+ def __init__(self):
+ self._key = 0
+ self._cache = {}
+ self._old_locks = []
+ self._lock = threading.Lock()
+ self._listener = None
+ self._address = None
+ self._thread = None
+ register_after_fork(self, ResourceSharer._afterfork)
+
+ def register(self, send, close):
+ with self._lock:
+ if self._address is None:
+ self._start()
+ self._key += 1
+ self._cache[self._key] = (send, close)
+ return (self._address, self._key)
+
+ @staticmethod
+ def get_connection(ident):
+ from .connection import Client
+ address, key = ident
+ c = Client(address, authkey=current_process().authkey)
+ c.send((key, os.getpid()))
+ return c
+
+ def stop(self, timeout=None):
+ from .connection import Client
+ with self._lock:
+ if self._address is not None:
+ c = Client(self._address, authkey=current_process().authkey)
+ c.send(None)
+ c.close()
+ self._thread.join(timeout)
+ if self._thread.is_alive():
+ sub_warn('ResourceSharer thread did not stop when asked')
+ self._listener.close()
+ self._thread = None
+ self._address = None
+ self._listener = None
+ for key, (send, close) in self._cache.items():
+ close()
+ self._cache.clear()
+
+ def _afterfork(self):
+ for key, (send, close) in self._cache.items():
+ close()
+ self._cache.clear()
+ # If self._lock was locked at the time of the fork, it may be broken
+ # -- see issue 6721. Replace it without letting it be gc'ed.
+ self._old_locks.append(self._lock)
+ self._lock = threading.Lock()
+ if self._listener is not None:
+ self._listener.close()
+ self._listener = None
+ self._address = None
+ self._thread = None
+
+ def _start(self):
+ from .connection import Listener
+ assert self._listener is None
+ debug('starting listener and thread for sending handles')
+ self._listener = Listener(authkey=current_process().authkey)
+ self._address = self._listener.address
+ t = threading.Thread(target=self._serve)
+ t.daemon = True
+ t.start()
+ self._thread = t
+
+ def _serve(self):
+ if hasattr(signal, 'pthread_sigmask'):
+ signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG))
+ while 1:
+ try:
+ conn = self._listener.accept()
+ msg = conn.recv()
+ if msg is None:
+ break
+ key, destination_pid = msg
+ send, close = self._cache.pop(key)
+ send(conn, destination_pid)
+ close()
+ conn.close()
+ except:
+ if not is_exiting():
+ import traceback
+ sub_warning(
+ 'thread for sharing handles raised exception :\n' +
+ '-'*79 + '\n' + traceback.format_exc() + '-'*79
+ )
+
+resource_sharer = ResourceSharer()
diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py
index 1e694da..a358ed4 100644
--- a/Lib/multiprocessing/sharedctypes.py
+++ b/Lib/multiprocessing/sharedctypes.py
@@ -4,35 +4,9 @@
# multiprocessing/sharedctypes.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
-import sys
import ctypes
import weakref
@@ -89,7 +63,7 @@ def RawArray(typecode_or_type, size_or_initializer):
result.__init__(*size_or_initializer)
return result
-def Value(typecode_or_type, *args, lock=None):
+def Value(typecode_or_type, *args, lock=True):
'''
Return a synchronization wrapper for a Value
'''
@@ -102,13 +76,10 @@ def Value(typecode_or_type, *args, lock=None):
raise AttributeError("'%r' has no method 'acquire'" % lock)
return synchronized(obj, lock)
-def Array(typecode_or_type, size_or_initializer, **kwds):
+def Array(typecode_or_type, size_or_initializer, *, lock=True):
'''
Return a synchronization wrapper for a RawArray
'''
- lock = kwds.pop('lock', None)
- if kwds:
- raise ValueError('unrecognized keyword argument(s): %s' % list(kwds.keys()))
obj = RawArray(typecode_or_type, size_or_initializer)
if lock is False:
return obj
@@ -158,7 +129,8 @@ def rebuild_ctype(type_, wrapper, length):
if length is not None:
type_ = type_ * length
ForkingPickler.register(type_, reduce_ctype)
- obj = type_.from_address(wrapper.get_address())
+ buf = wrapper.create_memoryview()
+ obj = type_.from_buffer(buf)
obj._wrapper = wrapper
return obj
diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py
index 70ae825..22eabe5 100644
--- a/Lib/multiprocessing/synchronize.py
+++ b/Lib/multiprocessing/synchronize.py
@@ -4,32 +4,7 @@
# multiprocessing/synchronize.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
__all__ = [
@@ -37,15 +12,13 @@ __all__ = [
]
import threading
-import os
import sys
-from time import time as _time, sleep as _sleep
-
import _multiprocessing
from multiprocessing.process import current_process
-from multiprocessing.util import Finalize, register_after_fork, debug
+from multiprocessing.util import register_after_fork, debug
from multiprocessing.forking import assert_spawning, Popen
+from time import time as _time
# Try to import the mp.synchronize module cleanly, if it fails
# raise ImportError for platforms lacking a working sem_open implementation.
@@ -243,7 +216,7 @@ class Condition(object):
try:
# wait for notification or timeout
- ret = self._wait_semaphore.acquire(True, timeout)
+ return self._wait_semaphore.acquire(True, timeout)
finally:
# indicate that this thread has woken
self._woken_count.release()
@@ -251,7 +224,6 @@ class Condition(object):
# reacquire lock
for i in range(count):
self._lock.acquire()
- return ret
def notify(self):
assert self._lock._semlock._is_mine(), 'lock is not owned'
@@ -293,6 +265,24 @@ class Condition(object):
while self._wait_semaphore.acquire(False):
pass
+ def wait_for(self, predicate, timeout=None):
+ result = predicate()
+ if result:
+ return result
+ if timeout is not None:
+ endtime = _time() + timeout
+ else:
+ endtime = None
+ waittime = None
+ while not result:
+ if endtime is not None:
+ waittime = endtime - _time()
+ if waittime <= 0:
+ break
+ self.wait(waittime)
+ result = predicate()
+ return result
+
#
# Event
#
@@ -343,3 +333,43 @@ class Event(object):
return False
finally:
self._cond.release()
+
+#
+# Barrier
+#
+
+class Barrier(threading.Barrier):
+
+ def __init__(self, parties, action=None, timeout=None):
+ import struct
+ from multiprocessing.heap import BufferWrapper
+ wrapper = BufferWrapper(struct.calcsize('i') * 2)
+ cond = Condition()
+ self.__setstate__((parties, action, timeout, cond, wrapper))
+ self._state = 0
+ self._count = 0
+
+ def __setstate__(self, state):
+ (self._parties, self._action, self._timeout,
+ self._cond, self._wrapper) = state
+ self._array = self._wrapper.create_memoryview().cast('i')
+
+ def __getstate__(self):
+ return (self._parties, self._action, self._timeout,
+ self._cond, self._wrapper)
+
+ @property
+ def _state(self):
+ return self._array[0]
+
+ @_state.setter
+ def _state(self, value):
+ self._array[0] = value
+
+ @property
+ def _count(self):
+ return self._array[1]
+
+ @_count.setter
+ def _count(self, value):
+ self._array[1] = value
diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py
index 20bba37..7495813 100644
--- a/Lib/multiprocessing/util.py
+++ b/Lib/multiprocessing/util.py
@@ -4,39 +4,18 @@
# multiprocessing/util.py
#
# Copyright (c) 2006-2008, R Oudkerk
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of author nor the names of any contributors may be
-# used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# Licensed to PSF under a Contributor Agreement.
#
+import sys
+import functools
+import os
import itertools
import weakref
import atexit
import threading # we want threading to install it's
# cleanup function before multiprocessing does
+from subprocess import _args_from_interpreter_flags
from multiprocessing.process import current_process, active_children
@@ -84,7 +63,7 @@ def get_logger():
Returns logger used by multiprocessing
'''
global _logger
- import logging, atexit
+ import logging
logging._acquireLock()
try:
@@ -183,10 +162,15 @@ class Finalize(object):
self._args = args
self._kwargs = kwargs or {}
self._key = (exitpriority, next(_finalizer_counter))
+ self._pid = os.getpid()
_finalizer_registry[self._key] = self
- def __call__(self, wr=None):
+ def __call__(self, wr=None,
+ # Need to bind these locally because the globals can have
+ # been cleared at shutdown
+ _finalizer_registry=_finalizer_registry,
+ sub_debug=sub_debug, getpid=os.getpid):
'''
Run the callback unless it has already been called or cancelled
'''
@@ -195,9 +179,13 @@ class Finalize(object):
except KeyError:
sub_debug('finalizer no longer registered')
else:
- sub_debug('finalizer calling %s with args %s and kwargs %s',
- self._callback, self._args, self._kwargs)
- res = self._callback(*self._args, **self._kwargs)
+ if self._pid != getpid():
+ sub_debug('finalizer ignored because different process')
+ res = None
+ else:
+ sub_debug('finalizer calling %s with args %s and kwargs %s',
+ self._callback, self._args, self._kwargs)
+ res = self._callback(*self._args, **self._kwargs)
self._weakref = self._callback = self._args = \
self._kwargs = self._key = None
return res
@@ -299,16 +287,21 @@ def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,
info('process shutting down')
debug('running all "atexit" finalizers with priority >= 0')
_run_finalizers(0)
+
if current_process() is not None:
# We check if the current process is None here because if
- # it's None, any call to ``active_children()`` will throw an
- # AttributeError (active_children winds up trying to get
- # attributes from util._current_process). This happens in a
- # variety of shutdown circumstances that are not well-understood
- # because module-scope variables are not apparently supposed to
- # be destroyed until after this function is called. However,
- # they are indeed destroyed before this function is called. See
- # issues #9775 and #15881. Also related: #4106, #9205, and #9207.
+ # it's None, any call to ``active_children()`` will throw
+ # an AttributeError (active_children winds up trying to
+ # get attributes from util._current_process). One
+ # situation where this can happen is if someone has
+ # manipulated sys.modules, causing this module to be
+ # garbage collected. The destructor for the module type
+ # then replaces all values in the module dict with None.
+ # For instance, after setuptools runs a test it replaces
+ # sys.modules with a copy created earlier. See issues
+ # #9775 and #15881. Also related: #4106, #9205, and
+ # #9207.
+
for p in active_children():
if p._daemonic:
info('calling terminate() for daemon %s', p.name)
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index 32bffd8..2de6ebd 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -166,7 +166,7 @@ def decode_header(header_str):
parts.append(v.decode(enc or 'ascii'))
else:
parts.append(v)
- return ' '.join(parts)
+ return ''.join(parts)
def _parse_overview_fmt(lines):
"""Parse a list of string representing the response to LIST OVERVIEW.FMT
@@ -351,6 +351,20 @@ class _NNTPBase:
# Log in and encryption setup order is left to subclasses.
self.authenticated = False
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ is_connected = lambda: hasattr(self, "file")
+ if is_connected():
+ try:
+ self.quit()
+ except (socket.error, EOFError):
+ pass
+ finally:
+ if is_connected():
+ self._close()
+
def getwelcome(self):
"""Get the welcome message from the server
(this is read and squirreled away by __init__()).
@@ -819,7 +833,7 @@ class _NNTPBase:
- list: list of (name,title) strings"""
warnings.warn("The XGTITLE extension is not actively used, "
"use descriptions() instead",
- PendingDeprecationWarning, 2)
+ DeprecationWarning, 2)
line_pat = re.compile('^([^ \t]+)[ \t]+(.*)$')
resp, raw_lines = self._longcmdstring('XGTITLE ' + group, file)
lines = []
@@ -837,7 +851,7 @@ class _NNTPBase:
path: directory path to article
"""
warnings.warn("The XPATH extension is not actively used",
- PendingDeprecationWarning, 2)
+ DeprecationWarning, 2)
resp = self._shortcmd('XPATH {0}'.format(id))
if not resp.startswith('223'):
diff --git a/Lib/numbers.py b/Lib/numbers.py
index ecfad7c..b206457 100644
--- a/Lib/numbers.py
+++ b/Lib/numbers.py
@@ -5,7 +5,7 @@
TODO: Fill out more detailed documentation on the operators."""
-from abc import ABCMeta, abstractmethod, abstractproperty
+from abc import ABCMeta, abstractmethod
__all__ = ["Number", "Complex", "Real", "Rational", "Integral"]
@@ -50,7 +50,8 @@ class Complex(Number):
"""True if self != 0. Called for bool(self)."""
return self != 0
- @abstractproperty
+ @property
+ @abstractmethod
def real(self):
"""Retrieve the real component of this number.
@@ -58,7 +59,8 @@ class Complex(Number):
"""
raise NotImplementedError
- @abstractproperty
+ @property
+ @abstractmethod
def imag(self):
"""Retrieve the imaginary component of this number.
@@ -272,11 +274,13 @@ class Rational(Real):
__slots__ = ()
- @abstractproperty
+ @property
+ @abstractmethod
def numerator(self):
raise NotImplementedError
- @abstractproperty
+ @property
+ @abstractmethod
def denominator(self):
raise NotImplementedError
diff --git a/Lib/opcode.py b/Lib/opcode.py
index 8e15d13..a639fe3 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -6,7 +6,7 @@ operate on bytecodes (e.g. peephole optimizers).
__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs",
"haslocal", "hascompare", "hasfree", "opname", "opmap",
- "HAVE_ARGUMENT", "EXTENDED_ARG"]
+ "HAVE_ARGUMENT", "EXTENDED_ARG", "hasnargs"]
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is',
'is not', 'exception match', 'BAD')
@@ -18,6 +18,7 @@ hasjabs = []
haslocal = []
hascompare = []
hasfree = []
+hasnargs = []
opmap = {}
opname = [''] * 256
@@ -43,7 +44,6 @@ def jabs_op(name, op):
# Instruction opcodes for compiled code
# Blank lines correspond to available opcodes
-def_op('STOP_CODE', 0)
def_op('POP_TOP', 1)
def_op('ROT_TWO', 2)
def_op('ROT_THREE', 3)
@@ -88,6 +88,7 @@ def_op('STORE_LOCALS', 69)
def_op('PRINT_EXPR', 70)
def_op('LOAD_BUILD_CLASS', 71)
+def_op('YIELD_FROM', 72)
def_op('INPLACE_LSHIFT', 75)
def_op('INPLACE_RSHIFT', 76)
@@ -152,6 +153,7 @@ haslocal.append(126)
def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3)
def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8)
+hasnargs.append(131)
def_op('MAKE_FUNCTION', 132) # Number of args with default values
def_op('BUILD_SLICE', 133) # Number of items
def_op('MAKE_CLOSURE', 134)
@@ -165,8 +167,11 @@ def_op('DELETE_DEREF', 138)
hasfree.append(138)
def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8)
+hasnargs.append(140)
def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8)
+hasnargs.append(141)
def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8)
+hasnargs.append(142)
jrel_op('SETUP_WITH', 143)
diff --git a/Lib/optparse.py b/Lib/optparse.py
index d97a1f7..37764d3 100644
--- a/Lib/optparse.py
+++ b/Lib/optparse.py
@@ -86,10 +86,16 @@ def _repr(self):
# Id: errors.py 509 2006-04-20 00:58:24Z gward
try:
- from gettext import gettext
+ from gettext import gettext, ngettext
except ImportError:
def gettext(message):
return message
+
+ def ngettext(singular, plural, n):
+ if n == 1:
+ return singular
+ return plural
+
_ = gettext
@@ -411,11 +417,8 @@ def _parse_num(val, type):
def _parse_int(val):
return _parse_num(val, int)
-def _parse_long(val):
- return _parse_num(val, int)
-
_builtin_cvt = { "int" : (_parse_int, _("integer")),
- "long" : (_parse_long, _("long integer")),
+ "long" : (_parse_int, _("integer")),
"float" : (float, _("floating-point")),
"complex" : (complex, _("complex")) }
@@ -1483,11 +1486,10 @@ class OptionParser (OptionContainer):
if option.takes_value():
nargs = option.nargs
if len(rargs) < nargs:
- if nargs == 1:
- self.error(_("%s option requires an argument") % opt)
- else:
- self.error(_("%s option requires %d arguments")
- % (opt, nargs))
+ self.error(ngettext(
+ "%(option)s option requires %(number)d argument",
+ "%(option)s option requires %(number)d arguments",
+ nargs) % {"option": opt, "number": nargs})
elif nargs == 1:
value = rargs.pop(0)
else:
@@ -1522,11 +1524,10 @@ class OptionParser (OptionContainer):
nargs = option.nargs
if len(rargs) < nargs:
- if nargs == 1:
- self.error(_("%s option requires an argument") % opt)
- else:
- self.error(_("%s option requires %d arguments")
- % (opt, nargs))
+ self.error(ngettext(
+ "%(option)s option requires %(number)d argument",
+ "%(option)s option requires %(number)d arguments",
+ nargs) % {"option": opt, "number": nargs})
elif nargs == 1:
value = rargs.pop(0)
else:
diff --git a/Lib/os.py b/Lib/os.py
index d1101a2..84eeaeb 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -24,13 +24,18 @@ and opendir), and leave all pathname manipulation to os.path
#'
import sys, errno
+import stat as st
_names = sys.builtin_module_names
# Note: more names are added to __all__ later.
__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
- "defpath", "name", "path", "devnull",
- "SEEK_SET", "SEEK_CUR", "SEEK_END"]
+ "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
+ "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
+ "popen", "extsep"]
+
+def _exists(name):
+ return name in globals()
def _get_exports_list(module):
try:
@@ -38,19 +43,23 @@ def _get_exports_list(module):
except AttributeError:
return [n for n in dir(module) if n[0] != '_']
+# Any new dependencies of the os module and/or changes in path separator
+# requires updating importlib as well.
if 'posix' in _names:
name = 'posix'
linesep = '\n'
from posix import *
try:
from posix import _exit
+ __all__.append('_exit')
except ImportError:
pass
import posixpath as path
- import posix
- __all__.extend(_get_exports_list(posix))
- del posix
+ try:
+ from posix import _have_functions
+ except ImportError:
+ pass
elif 'nt' in _names:
name = 'nt'
@@ -58,6 +67,7 @@ elif 'nt' in _names:
from nt import *
try:
from nt import _exit
+ __all__.append('_exit')
except ImportError:
pass
import ntpath as path
@@ -66,12 +76,18 @@ elif 'nt' in _names:
__all__.extend(_get_exports_list(nt))
del nt
+ try:
+ from nt import _have_functions
+ except ImportError:
+ pass
+
elif 'os2' in _names:
name = 'os2'
linesep = '\r\n'
from os2 import *
try:
from os2 import _exit
+ __all__.append('_exit')
except ImportError:
pass
if sys.version.find('EMX GCC') == -1:
@@ -84,12 +100,18 @@ elif 'os2' in _names:
__all__.extend(_get_exports_list(os2))
del os2
+ try:
+ from os2 import _have_functions
+ except ImportError:
+ pass
+
elif 'ce' in _names:
name = 'ce'
linesep = '\r\n'
from ce import *
try:
from ce import _exit
+ __all__.append('_exit')
except ImportError:
pass
# We can use the standard Windows path.
@@ -99,6 +121,11 @@ elif 'ce' in _names:
__all__.extend(_get_exports_list(ce))
del ce
+ try:
+ from ce import _have_functions
+ except ImportError:
+ pass
+
else:
raise ImportError('no os specific module found')
@@ -108,8 +135,97 @@ from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
del _names
+
+if _exists("_have_functions"):
+ _globals = globals()
+ def _add(str, fn):
+ if (fn in _globals) and (str in _have_functions):
+ _set.add(_globals[fn])
+
+ _set = set()
+ _add("HAVE_FACCESSAT", "access")
+ _add("HAVE_FCHMODAT", "chmod")
+ _add("HAVE_FCHOWNAT", "chown")
+ _add("HAVE_FSTATAT", "stat")
+ _add("HAVE_FUTIMESAT", "utime")
+ _add("HAVE_LINKAT", "link")
+ _add("HAVE_MKDIRAT", "mkdir")
+ _add("HAVE_MKFIFOAT", "mkfifo")
+ _add("HAVE_MKNODAT", "mknod")
+ _add("HAVE_OPENAT", "open")
+ _add("HAVE_READLINKAT", "readlink")
+ _add("HAVE_RENAMEAT", "rename")
+ _add("HAVE_SYMLINKAT", "symlink")
+ _add("HAVE_UNLINKAT", "unlink")
+ _add("HAVE_UNLINKAT", "rmdir")
+ _add("HAVE_UTIMENSAT", "utime")
+ supports_dir_fd = _set
+
+ _set = set()
+ _add("HAVE_FACCESSAT", "access")
+ supports_effective_ids = _set
+
+ _set = set()
+ _add("HAVE_FCHDIR", "chdir")
+ _add("HAVE_FCHMOD", "chmod")
+ _add("HAVE_FCHOWN", "chown")
+ _add("HAVE_FDOPENDIR", "listdir")
+ _add("HAVE_FEXECVE", "execve")
+ _set.add(stat) # fstat always works
+ _add("HAVE_FTRUNCATE", "truncate")
+ _add("HAVE_FUTIMENS", "utime")
+ _add("HAVE_FUTIMES", "utime")
+ _add("HAVE_FPATHCONF", "pathconf")
+ if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3
+ _add("HAVE_FSTATVFS", "statvfs")
+ supports_fd = _set
+
+ _set = set()
+ _add("HAVE_FACCESSAT", "access")
+ # Some platforms don't support lchmod(). Often the function exists
+ # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
+ # (No, I don't know why that's a good design.) ./configure will detect
+ # this and reject it--so HAVE_LCHMOD still won't be defined on such
+ # platforms. This is Very Helpful.
+ #
+ # However, sometimes platforms without a working lchmod() *do* have
+ # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15,
+ # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes
+ # it behave like lchmod(). So in theory it would be a suitable
+ # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s
+ # flag doesn't work *either*. Sadly ./configure isn't sophisticated
+ # enough to detect this condition--it only determines whether or not
+ # fchmodat() minimally works.
+ #
+ # Therefore we simply ignore fchmodat() when deciding whether or not
+ # os.chmod supports follow_symlinks. Just checking lchmod() is
+ # sufficient. After all--if you have a working fchmodat(), your
+ # lchmod() almost certainly works too.
+ #
+ # _add("HAVE_FCHMODAT", "chmod")
+ _add("HAVE_FCHOWNAT", "chown")
+ _add("HAVE_FSTATAT", "stat")
+ _add("HAVE_LCHFLAGS", "chflags")
+ _add("HAVE_LCHMOD", "chmod")
+ if _exists("lchown"): # mac os x10.3
+ _add("HAVE_LCHOWN", "chown")
+ _add("HAVE_LINKAT", "link")
+ _add("HAVE_LUTIMES", "utime")
+ _add("HAVE_LSTAT", "stat")
+ _add("HAVE_FSTATAT", "stat")
+ _add("HAVE_UTIMENSAT", "utime")
+ _add("MS_WINDOWS", "stat")
+ supports_follow_symlinks = _set
+
+ del _set
+ del _have_functions
+ del _globals
+ del _add
+
+
# Python uses fixed values for the SEEK_ constants; they are mapped
# to native constants if necessary in posixmodule.c
+# Other possible SEEK values are directly imported from posixmodule.c
SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2
@@ -120,8 +236,6 @@ def _get_masked_mode(mode):
umask(mask)
return mode & ~mask
-#'
-
# Super directory utilities.
# (Inspired by Eric Raymond; the doc strings are mostly his)
@@ -151,7 +265,6 @@ def makedirs(name, mode=0o777, exist_ok=False):
try:
mkdir(name, mode)
except OSError as e:
- import stat as st
dir_exists = path.isdir(name)
expected_mode = _get_masked_mode(mode)
if dir_exists:
@@ -163,6 +276,9 @@ def makedirs(name, mode=0o777, exist_ok=False):
actual_mode = -1
if not (e.errno == errno.EEXIST and exist_ok and dir_exists and
actual_mode == expected_mode):
+ if dir_exists and actual_mode != expected_mode:
+ e.strerror += ' (mode %o != expected mode %o)' % (
+ actual_mode, expected_mode)
raise
def removedirs(name):
@@ -300,13 +416,107 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
for name in dirs:
new_path = join(top, name)
if followlinks or not islink(new_path):
- for x in walk(new_path, topdown, onerror, followlinks):
- yield x
+ yield from walk(new_path, topdown, onerror, followlinks)
if not topdown:
yield top, dirs, nondirs
__all__.append("walk")
+if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:
+
+ def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):
+ """Directory tree generator.
+
+ This behaves exactly like walk(), except that it yields a 4-tuple
+
+ dirpath, dirnames, filenames, dirfd
+
+ `dirpath`, `dirnames` and `filenames` are identical to walk() output,
+ and `dirfd` is a file descriptor referring to the directory `dirpath`.
+
+ The advantage of fwalk() over walk() is that it's safe against symlink
+ races (when follow_symlinks is False).
+
+ If dir_fd is not None, it should be a file descriptor open to a directory,
+ and top should be relative; top will then be relative to that directory.
+ (dir_fd is always supported for fwalk.)
+
+ Caution:
+ Since fwalk() yields file descriptors, those are only valid until the
+ next iteration step, so you should dup() them if you want to keep them
+ for a longer period.
+
+ Example:
+
+ import os
+ for root, dirs, files, rootfd in os.fwalk('python/Lib/email'):
+ print(root, "consumes", end="")
+ print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
+ end="")
+ print("bytes in", len(files), "non-directory files")
+ if 'CVS' in dirs:
+ dirs.remove('CVS') # don't visit CVS directories
+ """
+ # Note: To guard against symlink races, we use the standard
+ # lstat()/open()/fstat() trick.
+ orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
+ topfd = open(top, O_RDONLY, dir_fd=dir_fd)
+ try:
+ if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and
+ path.samestat(orig_st, stat(topfd)))):
+ yield from _fwalk(topfd, top, topdown, onerror, follow_symlinks)
+ finally:
+ close(topfd)
+
+ def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):
+ # Note: This uses O(depth of the directory tree) file descriptors: if
+ # necessary, it can be adapted to only require O(1) FDs, see issue
+ # #13734.
+
+ names = listdir(topfd)
+ dirs, nondirs = [], []
+ for name in names:
+ try:
+ # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with
+ # walk() which reports symlinks to directories as directories.
+ # We do however check for symlinks before recursing into
+ # a subdirectory.
+ if st.S_ISDIR(stat(name, dir_fd=topfd).st_mode):
+ dirs.append(name)
+ else:
+ nondirs.append(name)
+ except FileNotFoundError:
+ try:
+ # Add dangling symlinks, ignore disappeared files
+ if st.S_ISLNK(stat(name, dir_fd=topfd, follow_symlinks=False)
+ .st_mode):
+ nondirs.append(name)
+ except FileNotFoundError:
+ continue
+
+ if topdown:
+ yield toppath, dirs, nondirs, topfd
+
+ for name in dirs:
+ try:
+ orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks)
+ dirfd = open(name, O_RDONLY, dir_fd=topfd)
+ except error as err:
+ if onerror is not None:
+ onerror(err)
+ return
+ try:
+ if follow_symlinks or path.samestat(orig_st, stat(dirfd)):
+ dirpath = path.join(toppath, name)
+ yield from _fwalk(dirfd, dirpath, topdown, onerror, follow_symlinks)
+ finally:
+ close(dirfd)
+
+ if not topdown:
+ yield toppath, dirs, nondirs, topfd
+
+ __all__.append("fwalk")
+
# Make sure os.environ exists, at least
try:
environ
@@ -443,7 +653,7 @@ def get_exec_path(env=None):
# Change environ to automatically call putenv(), unsetenv if they exist.
-from _abcoll import MutableMapping # Can't use collections (bootstrap)
+from collections.abc import MutableMapping
class _Environ(MutableMapping):
def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv):
@@ -607,15 +817,14 @@ def _fscodec():
fsencode, fsdecode = _fscodec()
del _fscodec
-def _exists(name):
- return name in globals()
-
# Supply spawn*() (probably only for Unix)
if _exists("fork") and not _exists("spawnv") and _exists("execv"):
P_WAIT = 0
P_NOWAIT = P_NOWAITO = 1
+ __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"])
+
# XXX Should we support P_DETACH? I suppose it could fork()**2
# and close the std I/O streams. Also, P_OVERLAY is the same
# as execv*()?
@@ -776,7 +985,7 @@ def popen(cmd, mode="r", buffering=-1):
raise TypeError("invalid cmd type (%s, expected string)" % type(cmd))
if mode not in ("r", "w"):
raise ValueError("invalid mode %r" % mode)
- if buffering == 0 or buffering == None:
+ if buffering == 0 or buffering is None:
raise ValueError("popen() does not support unbuffered streams")
import subprocess, io
if mode == "r":
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 6776a3f..3043391 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -73,6 +73,7 @@ import cmd
import bdb
import dis
import code
+import glob
import pprint
import signal
import inspect
@@ -155,6 +156,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
# Try to load readline if it exists
try:
import readline
+ # remove some common file name delimiters
+ readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
except ImportError:
pass
self.allow_kbdint = False
@@ -445,6 +448,61 @@ class Pdb(bdb.Bdb, cmd.Cmd):
def error(self, msg):
print('***', msg, file=self.stdout)
+ # Generic completion functions. Individual complete_foo methods can be
+ # assigned below to one of these functions.
+
+ def _complete_location(self, text, line, begidx, endidx):
+ # Complete a file/module/function location for break/tbreak/clear.
+ if line.strip().endswith((':', ',')):
+ # Here comes a line number or a condition which we can't complete.
+ return []
+ # First, try to find matching functions (i.e. expressions).
+ try:
+ ret = self._complete_expression(text, line, begidx, endidx)
+ except Exception:
+ ret = []
+ # Then, try to complete file names as well.
+ globs = glob.glob(text + '*')
+ for fn in globs:
+ if os.path.isdir(fn):
+ ret.append(fn + '/')
+ elif os.path.isfile(fn) and fn.lower().endswith(('.py', '.pyw')):
+ ret.append(fn + ':')
+ return ret
+
+ def _complete_bpnumber(self, text, line, begidx, endidx):
+ # Complete a breakpoint number. (This would be more helpful if we could
+ # display additional info along with the completions, such as file/line
+ # of the breakpoint.)
+ return [str(i) for i, bp in enumerate(bdb.Breakpoint.bpbynumber)
+ if bp is not None and str(i).startswith(text)]
+
+ def _complete_expression(self, text, line, begidx, endidx):
+ # Complete an arbitrary expression.
+ if not self.curframe:
+ return []
+ # Collect globals and locals. It is usually not really sensible to also
+ # complete builtins, and they clutter the namespace quite heavily, so we
+ # leave them out.
+ ns = self.curframe.f_globals.copy()
+ ns.update(self.curframe_locals)
+ if '.' in text:
+ # Walk an attribute chain up to the last part, similar to what
+ # rlcompleter does. This will bail if any of the parts are not
+ # simple attribute access, which is what we want.
+ dotted = text.split('.')
+ try:
+ obj = ns[dotted[0]]
+ for part in dotted[1:-1]:
+ obj = getattr(obj, part)
+ except (KeyError, AttributeError):
+ return []
+ prefix = '.'.join(dotted[:-1]) + '.'
+ return [prefix + n for n in dir(obj) if n.startswith(dotted[-1])]
+ else:
+ # Complete a simple name.
+ return [n for n in ns.keys() if n.startswith(text)]
+
# Command definitions, called by cmdloop()
# The argument is the remaining string on the command line
# Return true to exit from the command loop
@@ -526,6 +584,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.commands_defining = False
self.prompt = prompt_back
+ complete_commands = _complete_bpnumber
+
def do_break(self, arg, temporary = 0):
"""b(reak) [ ([filename:]lineno | function) [, condition] ]
Without argument, list all breaks.
@@ -628,6 +688,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
do_b = do_break
+ complete_break = _complete_location
+ complete_b = _complete_location
+
def do_tbreak(self, arg):
"""tbreak [ ([filename:]lineno | function) [, condition] ]
Same arguments as break, but sets a temporary breakpoint: it
@@ -635,6 +698,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
"""
self.do_break(arg, 1)
+ complete_tbreak = _complete_location
+
def lineinfo(self, identifier):
failed = (None, None, None)
# Input is identifier, may be in single quotes
@@ -704,6 +769,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
bp.enable()
self.message('Enabled %s' % bp)
+ complete_enable = _complete_bpnumber
+
def do_disable(self, arg):
"""disable bpnumber [bpnumber ...]
Disables the breakpoints given as a space separated list of
@@ -722,6 +789,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
bp.disable()
self.message('Disabled %s' % bp)
+ complete_disable = _complete_bpnumber
+
def do_condition(self, arg):
"""condition bpnumber [condition]
Set a new condition for the breakpoint, an expression which
@@ -745,6 +814,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
else:
self.message('New condition set for breakpoint %d.' % bp.number)
+ complete_condition = _complete_bpnumber
+
def do_ignore(self, arg):
"""ignore bpnumber [count]
Set the ignore count for the given breakpoint number. If
@@ -776,6 +847,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.message('Will stop next time breakpoint %d is reached.'
% bp.number)
+ complete_ignore = _complete_bpnumber
+
def do_clear(self, arg):
"""cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
With a space separated list of breakpoint numbers, clear
@@ -824,6 +897,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.message('Deleted %s' % bp)
do_cl = do_clear # 'c' is already an abbreviation for 'continue'
+ complete_clear = _complete_location
+ complete_cl = _complete_location
+
def do_where(self, arg):
"""w(here)
Print a stack trace, with the most recent frame at the bottom.
@@ -1007,6 +1083,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
sys.settrace(self.trace_dispatch)
self.lastcmd = p.lastcmd
+ complete_debug = _complete_expression
+
def do_quit(self, arg):
"""q(uit)\nexit
Quit from the debugger. The program being executed is aborted.
@@ -1093,6 +1171,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
except:
pass
+ complete_print = _complete_expression
+ complete_p = _complete_expression
+ complete_pp = _complete_expression
+
def do_list(self, arg):
"""l(ist) [first [,last] | .]
@@ -1173,6 +1255,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
return
self._print_lines(lines, lineno)
+ complete_source = _complete_expression
+
def _print_lines(self, lines, start, breaks=(), frame=None):
"""Print a range of lines."""
if frame:
@@ -1227,6 +1311,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
# None of the above...
self.message(type(value))
+ complete_whatis = _complete_expression
+
def do_display(self, arg):
"""display [expression]
@@ -1244,6 +1330,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.displaying.setdefault(self.curframe, {})[arg] = val
self.message('display %s: %r' % (arg, val))
+ complete_display = _complete_expression
+
def do_undisplay(self, arg):
"""undisplay [expression]
@@ -1259,6 +1347,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
else:
self.displaying.pop(self.curframe, None)
+ def complete_undisplay(self, text, line, begidx, endidx):
+ return [e for e in self.displaying.get(self.curframe, {})
+ if e.startswith(text)]
+
def do_interact(self, arg):
"""interact
@@ -1313,6 +1405,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
if args[0] in self.aliases:
del self.aliases[args[0]]
+ def complete_unalias(self, text, line, begidx, endidx):
+ return [a for a in self.aliases if a.startswith(text)]
+
# List of all the commands making the program resume execution.
commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
'do_quit', 'do_jump']
diff --git a/Lib/pickle.py b/Lib/pickle.py
index d10ac776..9e65368 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -23,8 +23,6 @@ Misc variables:
"""
-__version__ = "$Revision$" # Code version
-
from types import FunctionType, BuiltinFunctionType
from copyreg import dispatch_table
from copyreg import _extension_registry, _inverted_registry, _extension_cache
@@ -299,8 +297,8 @@ class _Pickler:
f(self, obj) # Call unbound method with explicit self
return
- # Check copyreg.dispatch_table
- reduce = dispatch_table.get(t)
+ # Check private dispatch table if any, or else copyreg.dispatch_table
+ reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
if reduce:
rv = reduce(obj)
else:
@@ -377,7 +375,7 @@ class _Pickler:
# allowing protocol 0 and 1 to work normally. For this to
# work, the function returned by __reduce__ should be
# called __newobj__, and its first argument should be a
- # new-style class. The implementation for __newobj__
+ # class. The implementation for __newobj__
# should be as follows, although pickle has no way to
# verify this:
#
@@ -440,6 +438,14 @@ class _Pickler:
self.write(NONE)
dispatch[type(None)] = save_none
+ def save_ellipsis(self, obj):
+ self.save_global(Ellipsis, 'Ellipsis')
+ dispatch[type(Ellipsis)] = save_ellipsis
+
+ def save_notimplemented(self, obj):
+ self.save_global(NotImplemented, 'NotImplemented')
+ dispatch[type(NotImplemented)] = save_notimplemented
+
def save_bool(self, obj):
if self.proto >= 2:
self.write(obj and NEWTRUE or NEWFALSE)
@@ -1332,7 +1338,7 @@ def _test():
return doctest.testmod()
if __name__ == "__main__":
- import sys, argparse
+ import argparse
parser = argparse.ArgumentParser(
description='display contents of the pickle files')
parser.add_argument(
diff --git a/Lib/pickletools.py b/Lib/pickletools.py
index ec6cc53..66f4edd 100644
--- a/Lib/pickletools.py
+++ b/Lib/pickletools.py
@@ -510,10 +510,7 @@ def read_decimalnl_short(f):
elif s == b"01":
return True
- try:
- return int(s)
- except OverflowError:
- return int(s)
+ return int(s)
def read_decimalnl_long(f):
r"""
@@ -1642,6 +1639,8 @@ opcodes = [
is pushed on the stack.
NOTE: checks for __safe_for_unpickling__ went away in Python 2.3.
+ NOTE: the distinction between old-style and new-style classes does
+ not make sense in Python 3.
"""),
I(name='OBJ',
diff --git a/Lib/pipes.py b/Lib/pipes.py
index 4297053..f1a16f6 100644
--- a/Lib/pipes.py
+++ b/Lib/pipes.py
@@ -60,7 +60,9 @@ To create a new template object initialized to a given one:
import re
import os
import tempfile
-import string
+# we import the quote function rather than the module for backward compat
+# (quote used to be an undocumented but used function in pipes)
+from shlex import quote
__all__ = ["Template"]
@@ -243,22 +245,3 @@ def makepipeline(infile, steps, outfile):
cmdlist = trapcmd + '\n' + cmdlist + '\n' + rmcmd
#
return cmdlist
-
-
-# Reliably quote a string as a single argument for /bin/sh
-
-# Safe unquoted
-_safechars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
-
-def quote(file):
- """Return a shell-escaped version of the file string."""
- for c in file:
- if c not in _safechars:
- break
- else:
- if not file:
- return "''"
- return file
- # use single quotes, and put single quotes into double quotes
- # the string $'b is then quoted as '$'"'"'b'
- return "'" + file.replace("'", "'\"'\"'") + "'"
diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py
index 51da0b1..8bdeb32 100644
--- a/Lib/pkgutil.py
+++ b/Lib/pkgutil.py
@@ -2,8 +2,10 @@
import os
import sys
+import importlib
import imp
import os.path
+from warnings import warn
from types import ModuleType
__all__ = [
@@ -21,7 +23,7 @@ def read_code(stream):
if magic != imp.get_magic():
return None
- stream.read(4) # Skip timestamp
+ stream.read(8) # Skip timestamp and size
return marshal.load(stream)
@@ -155,6 +157,49 @@ def iter_importer_modules(importer, prefix=''):
iter_importer_modules = simplegeneric(iter_importer_modules)
+# Implement a file walker for the normal importlib path hook
+def _iter_file_finder_modules(importer, prefix=''):
+ if importer.path is None or not os.path.isdir(importer.path):
+ return
+
+ yielded = {}
+ import inspect
+ try:
+ filenames = os.listdir(importer.path)
+ except OSError:
+ # ignore unreadable directories like import does
+ filenames = []
+ filenames.sort() # handle packages before same-named modules
+
+ for fn in filenames:
+ modname = inspect.getmodulename(fn)
+ if modname=='__init__' or modname in yielded:
+ continue
+
+ path = os.path.join(importer.path, fn)
+ ispkg = False
+
+ if not modname and os.path.isdir(path) and '.' not in fn:
+ modname = fn
+ try:
+ dircontents = os.listdir(path)
+ except OSError:
+ # ignore unreadable directories like import does
+ dircontents = []
+ for fn in dircontents:
+ subname = inspect.getmodulename(fn)
+ if subname=='__init__':
+ ispkg = True
+ break
+ else:
+ continue # not a package
+
+ if modname and '.' not in modname:
+ yielded[modname] = 1
+ yield prefix + modname, ispkg
+
+iter_importer_modules.register(
+ importlib.machinery.FileFinder, _iter_file_finder_modules)
class ImpImporter:
"""PEP 302 Importer that wraps Python's "classic" import algorithm
@@ -168,6 +213,8 @@ class ImpImporter:
"""
def __init__(self, path=None):
+ warn("This emulation is deprecated, use 'importlib' instead",
+ DeprecationWarning)
self.path = path
def find_module(self, fullname, path=None):
@@ -232,6 +279,8 @@ class ImpLoader:
code = source = None
def __init__(self, fullname, file, filename, etc):
+ warn("This emulation is deprecated, use 'importlib' instead",
+ DeprecationWarning)
self.file = file
self.filename = filename
self.fullname = fullname
@@ -256,7 +305,7 @@ class ImpLoader:
if self.file and self.file.closed:
mod_type = self.etc[2]
if mod_type==imp.PY_SOURCE:
- self.file = open(self.filename, 'rU')
+ self.file = open(self.filename, 'r')
elif mod_type in (imp.PY_COMPILED, imp.C_EXTENSION):
self.file = open(self.filename, 'rb')
@@ -301,7 +350,7 @@ class ImpLoader:
self.file.close()
elif mod_type==imp.PY_COMPILED:
if os.path.exists(self.filename[:-1]):
- f = open(self.filename[:-1], 'rU')
+ f = open(self.filename[:-1], 'r')
self.source = f.read()
f.close()
elif mod_type==imp.PKG_DIRECTORY:
@@ -315,9 +364,9 @@ class ImpLoader:
def get_filename(self, fullname=None):
fullname = self._fix_name(fullname)
mod_type = self.etc[2]
- if self.etc[2]==imp.PKG_DIRECTORY:
+ if mod_type==imp.PKG_DIRECTORY:
return self._get_delegate().get_filename()
- elif self.etc[2] in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION):
+ elif mod_type in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION):
return self.filename
return None
@@ -366,10 +415,6 @@ def get_importer(path_item):
The returned importer is cached in sys.path_importer_cache
if it was newly created by a path hook.
- If there is no importer, a wrapper around the basic import
- machinery is returned. This wrapper is never inserted into
- the importer cache (None is inserted instead).
-
The cache (or part of it) can be cleared manually if a
rescan of sys.path_hooks is necessary.
"""
@@ -379,18 +424,12 @@ def get_importer(path_item):
for path_hook in sys.path_hooks:
try:
importer = path_hook(path_item)
+ sys.path_importer_cache.setdefault(path_item, importer)
break
except ImportError:
pass
else:
importer = None
- sys.path_importer_cache.setdefault(path_item, importer)
-
- if importer is None:
- try:
- importer = ImpImporter(path_item)
- except ImportError:
- importer = None
return importer
@@ -398,55 +437,37 @@ def iter_importers(fullname=""):
"""Yield PEP 302 importers for the given module name
If fullname contains a '.', the importers will be for the package
- containing fullname, otherwise they will be importers for sys.meta_path,
- sys.path, and Python's "classic" import machinery, in that order. If
- the named module is in a package, that package is imported as a side
- effect of invoking this function.
-
- Non PEP 302 mechanisms (e.g. the Windows registry) used by the
- standard import machinery to find files in alternative locations
- are partially supported, but are searched AFTER sys.path. Normally,
- these locations are searched BEFORE sys.path, preventing sys.path
- entries from shadowing them.
+ containing fullname, otherwise they will be all registered top level
+ importers (i.e. those on both sys.meta_path and sys.path_hooks).
- For this to cause a visible difference in behaviour, there must
- be a module or package name that is accessible via both sys.path
- and one of the non PEP 302 file system mechanisms. In this case,
- the emulation will find the former version, while the builtin
- import mechanism will find the latter.
+ If the named module is in a package, that package is imported as a side
+ effect of invoking this function.
- Items of the following types can be affected by this discrepancy:
- imp.C_EXTENSION, imp.PY_SOURCE, imp.PY_COMPILED, imp.PKG_DIRECTORY
+ If no module name is specified, all top level importers are produced.
"""
if fullname.startswith('.'):
- raise ImportError("Relative module names not supported")
+ msg = "Relative module name {!r} not supported".format(fullname)
+ raise ImportError(msg)
if '.' in fullname:
# Get the containing package's __path__
- pkg = '.'.join(fullname.split('.')[:-1])
- if pkg not in sys.modules:
- __import__(pkg)
- path = getattr(sys.modules[pkg], '__path__', None) or []
+ pkg_name = fullname.rpartition(".")[0]
+ pkg = importlib.import_module(pkg)
+ path = getattr(sys.modules[pkg], '__path__', None)
+ if path is None:
+ return
else:
for importer in sys.meta_path:
yield importer
path = sys.path
for item in path:
yield get_importer(item)
- if '.' not in fullname:
- yield ImpImporter()
def get_loader(module_or_name):
"""Get a PEP 302 "loader" object for module_or_name
- If the module or package is accessible via the normal import
- mechanism, a wrapper around the relevant part of that machinery
- is returned. Returns None if the module cannot be found or imported.
+ Returns None if the module cannot be found or imported.
If the named module is not already imported, its containing package
(if any) is imported, in order to establish the package __path__.
-
- This function uses iter_importers(), and is thus subject to the same
- limitations regarding platform-specific special import locations such
- as the Windows registry.
"""
if module_or_name in sys.modules:
module_or_name = sys.modules[module_or_name]
@@ -460,20 +481,33 @@ def get_loader(module_or_name):
fullname = module_or_name
return find_loader(fullname)
+
def find_loader(fullname):
"""Find a PEP 302 "loader" object for fullname
- If fullname contains dots, path must be the containing package's __path__.
- Returns None if the module cannot be found or imported. This function uses
- iter_importers(), and is thus subject to the same limitations regarding
- platform-specific special import locations such as the Windows registry.
+ This is s convenience wrapper around :func:`importlib.find_loader` that
+ sets the *path* argument correctly when searching for submodules, and
+ also ensures parent packages (if any) are imported before searching for
+ submodules.
"""
- for importer in iter_importers(fullname):
- loader = importer.find_module(fullname)
- if loader is not None:
- return loader
-
- return None
+ if fullname.startswith('.'):
+ msg = "Relative module name {!r} not supported".format(fullname)
+ raise ImportError(msg)
+ path = None
+ pkg_name = fullname.rpartition(".")[0]
+ if pkg_name:
+ pkg = importlib.import_module(pkg_name)
+ path = getattr(pkg, "__path__", None)
+ if path is None:
+ return None
+ try:
+ return importlib.find_loader(fullname, path)
+ except (ImportError, AttributeError, TypeError, ValueError) as ex:
+ # This hack fixes an impedance mismatch between pkgutil and
+ # importlib, where the latter throws other errors for cases where
+ # pkgutil previously threw ImportError
+ msg = "Error while finding loader for {!r} ({}: {})"
+ raise ImportError(msg.format(fullname, type(ex), ex)) from ex
def extend_path(path, name):
@@ -514,21 +548,41 @@ def extend_path(path, name):
# frozen package. Return the path unchanged in that case.
return path
- pname = os.path.join(*name.split('.')) # Reconstitute as relative path
sname_pkg = name + ".pkg"
- init_py = "__init__.py"
path = path[:] # Start with a copy of the existing path
- for dir in sys.path:
- if not isinstance(dir, str) or not os.path.isdir(dir):
+ parent_package, _, final_name = name.rpartition('.')
+ if parent_package:
+ try:
+ search_path = sys.modules[parent_package].__path__
+ except (KeyError, AttributeError):
+ # We can't do anything: find_loader() returns None when
+ # passed a dotted name.
+ return path
+ else:
+ search_path = sys.path
+
+ for dir in search_path:
+ if not isinstance(dir, str):
continue
- subdir = os.path.join(dir, pname)
- # XXX This may still add duplicate entries to path on
- # case-insensitive filesystems
- initfile = os.path.join(subdir, init_py)
- if subdir not in path and os.path.isfile(initfile):
- path.append(subdir)
+
+ finder = get_importer(dir)
+ if finder is not None:
+ # Is this finder PEP 420 compliant?
+ if hasattr(finder, 'find_loader'):
+ loader, portions = finder.find_loader(final_name)
+ else:
+ # No, no need to call it
+ loader = None
+ portions = []
+
+ for portion in portions:
+ # XXX This may still add duplicate entries to path on
+ # case-insensitive filesystems
+ if portion not in path:
+ path.append(portion)
+
# XXX Is this the right thing for subpackages like zope.app?
# It looks for a file named "zope.app.pkg"
pkgfile = os.path.join(dir, sname_pkg)
diff --git a/Lib/plat-linux2/CDROM.py b/Lib/plat-linux/CDROM.py
index 4340936..4340936 100644
--- a/Lib/plat-linux2/CDROM.py
+++ b/Lib/plat-linux/CDROM.py
diff --git a/Lib/plat-linux2/DLFCN.py b/Lib/plat-linux/DLFCN.py
index dd10ac4..dd10ac4 100644
--- a/Lib/plat-linux2/DLFCN.py
+++ b/Lib/plat-linux/DLFCN.py
diff --git a/Lib/plat-linux2/IN.py b/Lib/plat-linux/IN.py
index d7d3002..d7d3002 100644
--- a/Lib/plat-linux2/IN.py
+++ b/Lib/plat-linux/IN.py
diff --git a/Lib/plat-linux2/TYPES.py b/Lib/plat-linux/TYPES.py
index e7a324b..e7a324b 100644
--- a/Lib/plat-linux2/TYPES.py
+++ b/Lib/plat-linux/TYPES.py
diff --git a/Lib/plat-linux2/regen b/Lib/plat-linux/regen
index c76950e..c76950e 100755
--- a/Lib/plat-linux2/regen
+++ b/Lib/plat-linux/regen
diff --git a/Lib/platform.py b/Lib/platform.py
index 686a045..2b8a24a 100755
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -111,6 +111,7 @@ __copyright__ = """
__version__ = '1.0.7'
+import collections
import sys, os, re, subprocess
### Globals & Constants
@@ -130,15 +131,15 @@ except AttributeError:
### Platform specific APIs
-_libc_search = re.compile(r'(__libc_init)'
- '|'
- '(GLIBC_([0-9.]+))'
- '|'
- '(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
+_libc_search = re.compile(b'(__libc_init)'
+ b'|'
+ b'(GLIBC_([0-9.]+))'
+ b'|'
+ br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
def libc_ver(executable=sys.executable,lib='',version='',
- chunksize=2048):
+ chunksize=16384):
""" Tries to determine the libc version that the file executable
(which defaults to the Python interpreter) is linked against.
@@ -159,17 +160,22 @@ def libc_ver(executable=sys.executable,lib='',version='',
# able to open symlinks for reading
executable = os.path.realpath(executable)
f = open(executable,'rb')
- binary = f.read(chunksize).decode('latin-1')
+ binary = f.read(chunksize)
pos = 0
while 1:
- m = _libc_search.search(binary,pos)
+ if b'libc' in binary or b'GLIBC' in binary:
+ m = _libc_search.search(binary,pos)
+ else:
+ m = None
if not m:
- binary = f.read(chunksize).decode('latin-1')
+ binary = f.read(chunksize)
if not binary:
break
pos = 0
continue
- libcinit,glibc,glibcversion,so,threads,soversion = m.groups()
+ libcinit,glibc,glibcversion,so,threads,soversion = [
+ s.decode('latin1') if s is not None else s
+ for s in m.groups()]
if libcinit and not lib:
lib = 'libc'
elif glibc:
@@ -255,7 +261,7 @@ _release_version = re.compile(r'([^0-9]+)'
_supported_dists = (
'SuSE', 'debian', 'fedora', 'redhat', 'centos',
'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo',
- 'UnitedLinux', 'turbolinux')
+ 'UnitedLinux', 'turbolinux', 'arch', 'mageia')
def _parse_release_file(firstline):
@@ -357,92 +363,13 @@ def dist(distname='',version='',id='',
supported_dists=supported_dists,
full_distribution_name=0)
-class _popen:
-
- """ Fairly portable (alternative) popen implementation.
-
- This is mostly needed in case os.popen() is not available, or
- doesn't work as advertised, e.g. in Win9X GUI programs like
- PythonWin or IDLE.
-
- Writing to the pipe is currently not supported.
-
- """
- tmpfile = ''
- pipe = None
- bufsize = None
- mode = 'r'
-
- def __init__(self,cmd,mode='r',bufsize=None):
-
- if mode != 'r':
- raise ValueError('popen()-emulation only supports read mode')
- import tempfile
- self.tmpfile = tmpfile = tempfile.mktemp()
- os.system(cmd + ' > %s' % tmpfile)
- self.pipe = open(tmpfile,'rb')
- self.bufsize = bufsize
- self.mode = mode
-
- def read(self):
-
- return self.pipe.read()
-
- def readlines(self):
-
- if self.bufsize is not None:
- return self.pipe.readlines()
-
- def close(self,
-
- remove=os.unlink,error=os.error):
-
- if self.pipe:
- rc = self.pipe.close()
- else:
- rc = 255
- if self.tmpfile:
- try:
- remove(self.tmpfile)
- except error:
- pass
- return rc
-
- # Alias
- __del__ = close
-
def popen(cmd, mode='r', bufsize=-1):
""" Portable popen() interface.
"""
- # Find a working popen implementation preferring win32pipe.popen
- # over os.popen over _popen
- popen = None
- if os.environ.get('OS','') == 'Windows_NT':
- # On NT win32pipe should work; on Win9x it hangs due to bugs
- # in the MS C lib (see MS KnowledgeBase article Q150956)
- try:
- import win32pipe
- except ImportError:
- pass
- else:
- popen = win32pipe.popen
- if popen is None:
- if hasattr(os,'popen'):
- popen = os.popen
- # Check whether it works... it doesn't in GUI programs
- # on Windows platforms
- if sys.platform == 'win32': # XXX Others too ?
- try:
- popen('')
- except os.error:
- popen = _popen
- else:
- popen = _popen
- if bufsize is None:
- return popen(cmd,mode)
- else:
- return popen(cmd,mode,bufsize)
+ import warnings
+ warnings.warn('use os.popen instead', DeprecationWarning, stacklevel=2)
+ return os.popen(cmd, mode, bufsize)
def _norm_version(version, build=''):
@@ -779,7 +706,7 @@ def _mac_ver_xml():
pl = plistlib.readPlist(fn)
release = pl['ProductVersion']
versioninfo=('', '', '')
- machine = os.uname()[4]
+ machine = os.uname().machine
if machine in ('ppc', 'Power Macintosh'):
# for compatibility with the gestalt based code
machine = 'PowerPC'
@@ -1004,9 +931,10 @@ def _syscmd_file(target,default=''):
try:
proc = subprocess.Popen(['file', target],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+
except (AttributeError,os.error):
return default
- output = proc.communicate()[0].decode("latin-1")
+ output = proc.communicate()[0].decode('latin-1')
rc = proc.wait()
if not output or rc:
return default
@@ -1107,6 +1035,9 @@ def architecture(executable=sys.executable,bits='',linkage=''):
### Portable uname() interface
+uname_result = collections.namedtuple("uname_result",
+ "system node release version machine processor")
+
_uname_cache = None
def uname():
@@ -1241,7 +1172,7 @@ def uname():
system = 'Windows'
release = 'Vista'
- _uname_cache = system,node,release,version,machine,processor
+ _uname_cache = uname_result(system,node,release,version,machine,processor)
return _uname_cache
### Direct interfaces to some of the uname() return values
@@ -1253,7 +1184,7 @@ def system():
An empty string is returned if the value cannot be determined.
"""
- return uname()[0]
+ return uname().system
def node():
@@ -1263,7 +1194,7 @@ def node():
An empty string is returned if the value cannot be determined.
"""
- return uname()[1]
+ return uname().node
def release():
@@ -1272,7 +1203,7 @@ def release():
An empty string is returned if the value cannot be determined.
"""
- return uname()[2]
+ return uname().release
def version():
@@ -1281,7 +1212,7 @@ def version():
An empty string is returned if the value cannot be determined.
"""
- return uname()[3]
+ return uname().version
def machine():
@@ -1290,7 +1221,7 @@ def machine():
An empty string is returned if the value cannot be determined.
"""
- return uname()[4]
+ return uname().machine
def processor():
@@ -1302,7 +1233,7 @@ def processor():
e.g. NetBSD does this.
"""
- return uname()[5]
+ return uname().processor
### Various APIs for extracting information from sys.version
diff --git a/Lib/plistlib.py b/Lib/plistlib.py
index 2e7e512..41fd8f2 100644
--- a/Lib/plistlib.py
+++ b/Lib/plistlib.py
@@ -237,20 +237,26 @@ class PlistWriter(DumbXMLWriter):
self.endElement("data")
def writeDict(self, d):
- self.beginElement("dict")
- items = sorted(d.items())
- for key, value in items:
- if not isinstance(key, str):
- raise TypeError("keys must be strings")
- self.simpleElement("key", key)
- self.writeValue(value)
- self.endElement("dict")
+ if d:
+ self.beginElement("dict")
+ items = sorted(d.items())
+ for key, value in items:
+ if not isinstance(key, str):
+ raise TypeError("keys must be strings")
+ self.simpleElement("key", key)
+ self.writeValue(value)
+ self.endElement("dict")
+ else:
+ self.simpleElement("dict")
def writeArray(self, array):
- self.beginElement("array")
- for value in array:
- self.writeValue(value)
- self.endElement("array")
+ if array:
+ self.beginElement("array")
+ for value in array:
+ self.writeValue(value)
+ self.endElement("array")
+ else:
+ self.simpleElement("array")
class _InternalDict(dict):
@@ -266,13 +272,13 @@ class _InternalDict(dict):
raise AttributeError(attr)
from warnings import warn
warn("Attribute access from plist dicts is deprecated, use d[key] "
- "notation instead", PendingDeprecationWarning, 2)
+ "notation instead", DeprecationWarning, 2)
return value
def __setattr__(self, attr, value):
from warnings import warn
warn("Attribute access from plist dicts is deprecated, use d[key] "
- "notation instead", PendingDeprecationWarning, 2)
+ "notation instead", DeprecationWarning, 2)
self[attr] = value
def __delattr__(self, attr):
@@ -282,14 +288,14 @@ class _InternalDict(dict):
raise AttributeError(attr)
from warnings import warn
warn("Attribute access from plist dicts is deprecated, use d[key] "
- "notation instead", PendingDeprecationWarning, 2)
+ "notation instead", DeprecationWarning, 2)
class Dict(_InternalDict):
def __init__(self, **kwargs):
from warnings import warn
warn("The plistlib.Dict class is deprecated, use builtin dict instead",
- PendingDeprecationWarning, 2)
+ DeprecationWarning, 2)
super().__init__(**kwargs)
@@ -302,7 +308,7 @@ class Plist(_InternalDict):
def __init__(self, **kwargs):
from warnings import warn
warn("The Plist class is deprecated, use the readPlist() and "
- "writePlist() functions instead", PendingDeprecationWarning, 2)
+ "writePlist() functions instead", DeprecationWarning, 2)
super().__init__(**kwargs)
def fromFile(cls, pathOrFile):
diff --git a/Lib/poplib.py b/Lib/poplib.py
index 84ea88d..d42d9dd 100644
--- a/Lib/poplib.py
+++ b/Lib/poplib.py
@@ -250,15 +250,18 @@ class POP3:
def quit(self):
"""Signoff: commit changes on server, unlock mailbox, close connection."""
- try:
- resp = self._shortcmd('QUIT')
- except error_proto as val:
- resp = val
- self.file.close()
- self.sock.close()
- del self.file, self.sock
+ resp = self._shortcmd('QUIT')
+ self.close()
return resp
+ def close(self):
+ """Close the connection without assuming anything about it."""
+ if self.file is not None:
+ self.file.close()
+ if self.sock is not None:
+ self.sock.close()
+ self.file = self.sock = None
+
#__del__ = quit
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 2e3625b..cb93796 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -88,7 +88,8 @@ def join(a, *p):
for s in (a, ) + p)
if valid_types:
# Must have a mixture of text and binary data
- raise TypeError("Can't mix strings and bytes in path components.")
+ raise TypeError("Can't mix strings and bytes in path "
+ "components.") from None
raise
return path
diff --git a/Lib/profile.py b/Lib/profile.py
index 297e32d..743e77d 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -83,26 +83,6 @@ def runctx(statement, globals, locals, filename=None, sort=-1):
else:
return prof.print_stats(sort)
-if hasattr(os, "times"):
- def _get_time_times(timer=os.times):
- t = timer()
- return t[0] + t[1]
-
-# Using getrusage(3) is better than clock(3) if available:
-# on some systems (e.g. FreeBSD), getrusage has a higher resolution
-# Furthermore, on a POSIX system, returns microseconds, which
-# wrap around after 36min.
-_has_res = 0
-try:
- import resource
- resgetrusage = lambda: resource.getrusage(resource.RUSAGE_SELF)
- def _get_time_resource(timer=resgetrusage):
- t = timer()
- return t[0] + t[1]
- _has_res = 1
-except ImportError:
- pass
-
class Profile:
"""Profiler class.
@@ -155,20 +135,8 @@ class Profile:
self.bias = bias # Materialize in local dict for lookup speed.
if not timer:
- if _has_res:
- self.timer = resgetrusage
- self.dispatcher = self.trace_dispatch
- self.get_time = _get_time_resource
- elif hasattr(time, 'clock'):
- self.timer = self.get_time = time.clock
- self.dispatcher = self.trace_dispatch_i
- elif hasattr(os, 'times'):
- self.timer = os.times
- self.dispatcher = self.trace_dispatch
- self.get_time = _get_time_times
- else:
- self.timer = self.get_time = time.time
- self.dispatcher = self.trace_dispatch_i
+ self.timer = self.get_time = time.process_time
+ self.dispatcher = self.trace_dispatch_i
else:
self.timer = timer
t = self.timer() # test out timer function
diff --git a/Lib/pstats.py b/Lib/pstats.py
index bfbaa41..6a77605 100644
--- a/Lib/pstats.py
+++ b/Lib/pstats.py
@@ -678,13 +678,14 @@ if __name__ == '__main__':
return stop
return None
- import sys
if len(sys.argv) > 1:
initprofile = sys.argv[1]
else:
initprofile = None
try:
browser = ProfileBrowser(initprofile)
+ for profile in sys.argv[2:]:
+ browser.do_add(profile)
print("Welcome to the profile statistics browser.", file=browser.stream)
browser.cmdloop()
print("Goodbye.", file=browser.stream)
diff --git a/Lib/py_compile.py b/Lib/py_compile.py
index 5adb70a..62d69ad 100644
--- a/Lib/py_compile.py
+++ b/Lib/py_compile.py
@@ -110,9 +110,11 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
"""
with tokenize.open(file) as f:
try:
- timestamp = int(os.fstat(f.fileno()).st_mtime)
+ st = os.fstat(f.fileno())
except AttributeError:
- timestamp = int(os.stat(file).st_mtime)
+ st = os.stat(file)
+ timestamp = int(st.st_mtime)
+ size = st.st_size & 0xFFFFFFFF
codestring = f.read()
try:
codeobject = builtins.compile(codestring, dfile or file, 'exec',
@@ -139,6 +141,7 @@ def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
with open(cfile, 'wb') as fc:
fc.write(b'\0\0\0\0')
wr_long(fc, timestamp)
+ wr_long(fc, size)
marshal.dump(codeobject, fc)
fc.flush()
fc.seek(0, 0)
diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py
index 65e9fbe..9ec05ee 100644
--- a/Lib/pyclbr.py
+++ b/Lib/pyclbr.py
@@ -39,8 +39,10 @@ Instances of this class have the following instance variables:
lineno -- the line in the file on which the class statement occurred
"""
+import io
+import os
import sys
-import imp
+import importlib
import tokenize
from token import NAME, DEDENT, OP
from operator import itemgetter
@@ -135,19 +137,24 @@ def _readmodule(module, path, inpackage=None):
# Search the path for the module
f = None
if inpackage is not None:
- f, fname, (_s, _m, ty) = imp.find_module(module, path)
+ search_path = path
else:
- f, fname, (_s, _m, ty) = imp.find_module(module, path + sys.path)
- if ty == imp.PKG_DIRECTORY:
- dict['__path__'] = [fname]
- path = [fname] + path
- f, fname, (_s, _m, ty) = imp.find_module('__init__', [fname])
+ search_path = path + sys.path
+ loader = importlib.find_loader(fullmodule, search_path)
+ fname = loader.get_filename(fullmodule)
_modules[fullmodule] = dict
- if ty != imp.PY_SOURCE:
+ if loader.is_package(fullmodule):
+ dict['__path__'] = [os.path.dirname(fname)]
+ try:
+ source = loader.get_source(fullmodule)
+ if source is None:
+ return dict
+ except (AttributeError, ImportError):
# not Python source, can't do anything with this module
- f.close()
return dict
+ f = io.StringIO(source)
+
stack = [] # stack of (class, indent) pairs
g = tokenize.generate_tokens(f.readline)
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 37616fb..fa531e9 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""Generate Python documentation in HTML or text for interactive use.
-In the Python interpreter, do "from pydoc import help" to provide online
+In the Python interpreter, do "from pydoc import help" to provide
help. Calling help(thing) on a Python object documents the object.
Or, at the shell command line outside of Python:
@@ -22,11 +22,6 @@ Run "pydoc -b" to start an HTTP server on an arbitrary unused port and
open a Web browser to interactively browse documentation. The -p option
can be used with the -b option to explicitly specify the server port.
-For platforms without a command line, "pydoc -g" starts the HTTP server
-and also pops up a little window for controlling it. This option is
-deprecated, since the server can now be controlled directly from HTTP
-clients.
-
Run "pydoc -w <name>" to write out the HTML documentation for a module
to a file named "<name>.html".
@@ -42,7 +37,6 @@ __all__ = ['help']
__author__ = "Ka-Ping Yee <ping@lfw.org>"
__date__ = "26 February 2001"
-__version__ = "$Revision$"
__credits__ = """Guido van Rossum, for an excellent programming language.
Tommy Burnette, the original creator of manpy.
Paul Prescod, for all his work on onlinehelp.
@@ -59,6 +53,7 @@ Richard Chamberlain, for the first implementation of textdoc.
import builtins
import imp
+import importlib.machinery
import inspect
import io
import os
@@ -168,12 +163,12 @@ def _split_list(s, predicate):
def visiblename(name, all=None, obj=None):
"""Decide whether to show documentation on a variable."""
- # Certain special names are redundant.
- _hidden_names = ('__builtins__', '__doc__', '__file__', '__path__',
- '__module__', '__name__', '__slots__', '__package__',
- '__cached__', '__author__', '__credits__', '__date__',
- '__version__')
- if name in _hidden_names: return 0
+ # Certain special names are redundant or internal.
+ if name in {'__author__', '__builtins__', '__cached__', '__credits__',
+ '__date__', '__doc__', '__file__', '__initializing__',
+ '__loader__', '__module__', '__name__', '__package__',
+ '__path__', '__qualname__', '__slots__', '__version__'}:
+ return 0
# Private names are hidden, but special names are displayed.
if name.startswith('__') and name.endswith('__'): return 1
# Namedtuples have public fields and methods with a single leading underscore
@@ -226,20 +221,34 @@ def synopsis(filename, cache={}):
mtime = os.stat(filename).st_mtime
lastupdate, result = cache.get(filename, (None, None))
if lastupdate is None or lastupdate < mtime:
- info = inspect.getmoduleinfo(filename)
try:
file = tokenize.open(filename)
except IOError:
# module can't be opened, so skip it
return None
- if info and 'b' in info[2]: # binary modules have to be imported
- try: module = imp.load_module('__temp__', file, filename, info[1:])
- except: return None
+ binary_suffixes = importlib.machinery.BYTECODE_SUFFIXES[:]
+ binary_suffixes += importlib.machinery.EXTENSION_SUFFIXES[:]
+ if any(filename.endswith(x) for x in binary_suffixes):
+ # binary modules have to be imported
+ file.close()
+ if any(filename.endswith(x) for x in
+ importlib.machinery.BYTECODE_SUFFIXES):
+ loader = importlib.machinery.SourcelessFileLoader('__temp__',
+ filename)
+ else:
+ loader = importlib.machinery.ExtensionFileLoader('__temp__',
+ filename)
+ try:
+ module = loader.load_module('__temp__')
+ except:
+ return None
result = (module.__doc__ or '').splitlines()[0]
del sys.modules['__temp__']
- else: # text modules can be directly examined
+ else:
+ # text modules can be directly examined
result = source_synopsis(file)
file.close()
+
cache[filename] = (mtime, result)
return result
@@ -305,9 +314,8 @@ def safeimport(path, forceload=0, cache={}):
elif exc is SyntaxError:
# A SyntaxError occurred before we could execute the module.
raise ErrorDuringImport(value.filename, info)
- elif exc is ImportError and extract_tb(tb)[-1][2]=='safeimport':
- # The import error occurred directly in this function,
- # which means there is no such module in the path.
+ elif exc is ImportError and value.name == path:
+ # No such module in the path.
return None
else:
# Some other error occurred during the importing process.
@@ -361,7 +369,7 @@ class Doc:
docloc = os.environ.get("PYTHONDOCS", self.PYTHONDOCS)
- basedir = os.path.join(sys.exec_prefix, "lib",
+ basedir = os.path.join(sys.base_exec_prefix, "lib",
"python%d.%d" % sys.version_info[:2])
if (isinstance(object, type(os)) and
(object.__name__ in ('errno', 'exceptions', 'gc', 'imp',
@@ -963,6 +971,9 @@ class HTMLDoc(Doc):
modpkgs = []
if shadowed is None: shadowed = {}
for importer, name, ispkg in pkgutil.iter_modules([dir]):
+ if any((0xD800 <= ord(ch) <= 0xDFFF) for ch in name):
+ # ignore a module if its name contains a surrogate character
+ continue
modpkgs.append((name, '', ispkg, name in shadowed))
shadowed[name] = 1
@@ -1827,7 +1838,7 @@ has the same effect as typing a particular string at the help> prompt.
def intro(self):
self.output.write('''
-Welcome to Python %s! This is the online help utility.
+Welcome to Python %s! This is the interactive help utility.
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/%s/tutorial/.
@@ -2018,14 +2029,6 @@ class ModuleScanner:
if self.quit:
break
- # XXX Skipping this file is a workaround for a bug
- # that causes python to crash with a segfault.
- # http://bugs.python.org/issue9319
- #
- # TODO Remove this once the bug is fixed.
- if modname in {'test.badsyntax_pep3120', 'badsyntax_pep3120'}:
- continue
-
if key is None:
callback(None, modname, '')
else:
@@ -2037,7 +2040,7 @@ class ModuleScanner:
if hasattr(loader, 'get_source'):
try:
source = loader.get_source(modname)
- except UnicodeDecodeError:
+ except Exception:
if onerror:
onerror(modname)
continue
@@ -2074,272 +2077,6 @@ def apropos(key):
warnings.filterwarnings('ignore') # ignore problems during import
ModuleScanner().run(callback, key, onerror=onerror)
-# --------------------------------------------------- Web browser interface
-
-def serve(port, callback=None, completer=None):
- import http.server, email.message, select
-
- msg = 'the pydoc.serve() function is deprecated'
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
-
- class DocHandler(http.server.BaseHTTPRequestHandler):
- def send_document(self, title, contents):
- try:
- self.send_response(200)
- self.send_header('Content-Type', 'text/html; charset=UTF-8')
- self.end_headers()
- self.wfile.write(html.page(title, contents).encode('utf-8'))
- except IOError: pass
-
- def do_GET(self):
- path = self.path
- if path[-5:] == '.html': path = path[:-5]
- if path[:1] == '/': path = path[1:]
- if path and path != '.':
- try:
- obj = locate(path, forceload=1)
- except ErrorDuringImport as value:
- self.send_document(path, html.escape(str(value)))
- return
- if obj:
- self.send_document(describe(obj), html.document(obj, path))
- else:
- self.send_document(path,
-'no Python documentation found for %s' % repr(path))
- else:
- heading = html.heading(
-'<big><big><strong>Python: Index of Modules</strong></big></big>',
-'#ffffff', '#7799ee')
- def bltinlink(name):
- return '<a href="%s.html">%s</a>' % (name, name)
- names = [x for x in sys.builtin_module_names if x != '__main__']
- contents = html.multicolumn(names, bltinlink)
- indices = ['<p>' + html.bigsection(
- 'Built-in Modules', '#ffffff', '#ee77aa', contents)]
-
- seen = {}
- for dir in sys.path:
- indices.append(html.index(dir, seen))
- contents = heading + ' '.join(indices) + '''<p align=right>
-<font color="#909090" face="helvetica, arial"><strong>
-pydoc</strong> by Ka-Ping Yee &lt;ping@lfw.org&gt;</font>'''
- self.send_document('Index of Modules', contents)
-
- def log_message(self, *args): pass
-
- class DocServer(http.server.HTTPServer):
- def __init__(self, port, callback):
- host = 'localhost'
- self.address = (host, port)
- self.url = 'http://%s:%d/' % (host, port)
- self.callback = callback
- self.base.__init__(self, self.address, self.handler)
-
- def serve_until_quit(self):
- import select
- self.quit = False
- while not self.quit:
- rd, wr, ex = select.select([self.socket.fileno()], [], [], 1)
- if rd: self.handle_request()
- self.server_close()
-
- def server_activate(self):
- self.base.server_activate(self)
- if self.callback: self.callback(self)
-
- DocServer.base = http.server.HTTPServer
- DocServer.handler = DocHandler
- DocHandler.MessageClass = email.message.Message
- try:
- try:
- DocServer(port, callback).serve_until_quit()
- except (KeyboardInterrupt, select.error):
- pass
- finally:
- if completer: completer()
-
-# ----------------------------------------------------- graphical interface
-
-def gui():
- """Graphical interface (starts Web server and pops up a control window)."""
-
- msg = ('the pydoc.gui() function and "pydoc -g" option are deprecated\n',
- 'use "pydoc.browse() function and "pydoc -b" option instead.')
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
-
- class GUI:
- def __init__(self, window, port=7464):
- self.window = window
- self.server = None
- self.scanner = None
-
- import tkinter
- self.server_frm = tkinter.Frame(window)
- self.title_lbl = tkinter.Label(self.server_frm,
- text='Starting server...\n ')
- self.open_btn = tkinter.Button(self.server_frm,
- text='open browser', command=self.open, state='disabled')
- self.quit_btn = tkinter.Button(self.server_frm,
- text='quit serving', command=self.quit, state='disabled')
-
- self.search_frm = tkinter.Frame(window)
- self.search_lbl = tkinter.Label(self.search_frm, text='Search for')
- self.search_ent = tkinter.Entry(self.search_frm)
- self.search_ent.bind('<Return>', self.search)
- self.stop_btn = tkinter.Button(self.search_frm,
- text='stop', pady=0, command=self.stop, state='disabled')
- if sys.platform == 'win32':
- # Trying to hide and show this button crashes under Windows.
- self.stop_btn.pack(side='right')
-
- self.window.title('pydoc')
- self.window.protocol('WM_DELETE_WINDOW', self.quit)
- self.title_lbl.pack(side='top', fill='x')
- self.open_btn.pack(side='left', fill='x', expand=1)
- self.quit_btn.pack(side='right', fill='x', expand=1)
- self.server_frm.pack(side='top', fill='x')
-
- self.search_lbl.pack(side='left')
- self.search_ent.pack(side='right', fill='x', expand=1)
- self.search_frm.pack(side='top', fill='x')
- self.search_ent.focus_set()
-
- font = ('helvetica', sys.platform == 'win32' and 8 or 10)
- self.result_lst = tkinter.Listbox(window, font=font, height=6)
- self.result_lst.bind('<Button-1>', self.select)
- self.result_lst.bind('<Double-Button-1>', self.goto)
- self.result_scr = tkinter.Scrollbar(window,
- orient='vertical', command=self.result_lst.yview)
- self.result_lst.config(yscrollcommand=self.result_scr.set)
-
- self.result_frm = tkinter.Frame(window)
- self.goto_btn = tkinter.Button(self.result_frm,
- text='go to selected', command=self.goto)
- self.hide_btn = tkinter.Button(self.result_frm,
- text='hide results', command=self.hide)
- self.goto_btn.pack(side='left', fill='x', expand=1)
- self.hide_btn.pack(side='right', fill='x', expand=1)
-
- self.window.update()
- self.minwidth = self.window.winfo_width()
- self.minheight = self.window.winfo_height()
- self.bigminheight = (self.server_frm.winfo_reqheight() +
- self.search_frm.winfo_reqheight() +
- self.result_lst.winfo_reqheight() +
- self.result_frm.winfo_reqheight())
- self.bigwidth, self.bigheight = self.minwidth, self.bigminheight
- self.expanded = 0
- self.window.wm_geometry('%dx%d' % (self.minwidth, self.minheight))
- self.window.wm_minsize(self.minwidth, self.minheight)
- self.window.tk.willdispatch()
-
- import threading
- threading.Thread(
- target=serve, args=(port, self.ready, self.quit)).start()
-
- def ready(self, server):
- self.server = server
- self.title_lbl.config(
- text='Python documentation server at\n' + server.url)
- self.open_btn.config(state='normal')
- self.quit_btn.config(state='normal')
-
- def open(self, event=None, url=None):
- url = url or self.server.url
- import webbrowser
- webbrowser.open(url)
-
- def quit(self, event=None):
- if self.server:
- self.server.quit = 1
- self.window.quit()
-
- def search(self, event=None):
- key = self.search_ent.get()
- self.stop_btn.pack(side='right')
- self.stop_btn.config(state='normal')
- self.search_lbl.config(text='Searching for "%s"...' % key)
- self.search_ent.forget()
- self.search_lbl.pack(side='left')
- self.result_lst.delete(0, 'end')
- self.goto_btn.config(state='disabled')
- self.expand()
-
- import threading
- if self.scanner:
- self.scanner.quit = 1
- self.scanner = ModuleScanner()
- threading.Thread(target=self.scanner.run,
- args=(self.update, key, self.done)).start()
-
- def update(self, path, modname, desc):
- if modname[-9:] == '.__init__':
- modname = modname[:-9] + ' (package)'
- self.result_lst.insert('end',
- modname + ' - ' + (desc or '(no description)'))
-
- def stop(self, event=None):
- if self.scanner:
- self.scanner.quit = 1
- self.scanner = None
-
- def done(self):
- self.scanner = None
- self.search_lbl.config(text='Search for')
- self.search_lbl.pack(side='left')
- self.search_ent.pack(side='right', fill='x', expand=1)
- if sys.platform != 'win32': self.stop_btn.forget()
- self.stop_btn.config(state='disabled')
-
- def select(self, event=None):
- self.goto_btn.config(state='normal')
-
- def goto(self, event=None):
- selection = self.result_lst.curselection()
- if selection:
- modname = self.result_lst.get(selection[0]).split()[0]
- self.open(url=self.server.url + modname + '.html')
-
- def collapse(self):
- if not self.expanded: return
- self.result_frm.forget()
- self.result_scr.forget()
- self.result_lst.forget()
- self.bigwidth = self.window.winfo_width()
- self.bigheight = self.window.winfo_height()
- self.window.wm_geometry('%dx%d' % (self.minwidth, self.minheight))
- self.window.wm_minsize(self.minwidth, self.minheight)
- self.expanded = 0
-
- def expand(self):
- if self.expanded: return
- self.result_frm.pack(side='bottom', fill='x')
- self.result_scr.pack(side='right', fill='y')
- self.result_lst.pack(side='top', fill='both', expand=1)
- self.window.wm_geometry('%dx%d' % (self.bigwidth, self.bigheight))
- self.window.wm_minsize(self.minwidth, self.bigminheight)
- self.expanded = 1
-
- def hide(self, event=None):
- self.stop()
- self.collapse()
-
- import tkinter
- try:
- root = tkinter.Tk()
- # Tk will crash if pythonw.exe has an XP .manifest
- # file and the root has is not destroyed explicitly.
- # If the problem is ever fixed in Tk, the explicit
- # destroy can go.
- try:
- gui = GUI(root)
- root.mainloop()
- finally:
- root.destroy()
- except KeyboardInterrupt:
- pass
-
-
# --------------------------------------- enhanced Web browser interface
def _start_server(urlhandler, port):
@@ -2796,15 +2533,12 @@ def cli():
sys.path.insert(0, '.')
try:
- opts, args = getopt.getopt(sys.argv[1:], 'bgk:p:w')
+ opts, args = getopt.getopt(sys.argv[1:], 'bk:p:w')
writing = False
start_server = False
open_browser = False
port = None
for opt, val in opts:
- if opt == '-g':
- gui()
- return
if opt == '-b':
start_server = True
open_browser = True
@@ -2817,8 +2551,8 @@ def cli():
if opt == '-w':
writing = True
- if start_server == True:
- if port == None:
+ if start_server:
+ if port is None:
port = 0
browse(port, open_browser=open_browser)
return
@@ -2865,9 +2599,6 @@ def cli():
to interactively browse documentation. The -p option can be used with
the -b option to explicitly specify the server port.
-{cmd} -g
- Deprecated.
-
{cmd} -w <name> ...
Write out the HTML documentation for a module to a file in the current
directory. If <name> contains a '{sep}', it is treated as a filename; if
diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py
index 08a9e7c..62a54a9 100644
--- a/Lib/pydoc_data/topics.py
+++ b/Lib/pydoc_data/topics.py
@@ -1,16 +1,17 @@
-# Autogenerated by Sphinx on Thu Feb 23 18:37:54 2012
+# -*- coding: utf-8 -*-
+# Autogenerated by Sphinx on Sat Aug 25 12:12:45 2012
topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAssert statements are a convenient way to insert debugging assertions\ninto a program:\n\n assert_stmt ::= "assert" expression ["," expression]\n\nThe simple form, ``assert expression``, is equivalent to\n\n if __debug__:\n if not expression: raise AssertionError\n\nThe extended form, ``assert expression1, expression2``, is equivalent\nto\n\n if __debug__:\n if not expression1: raise AssertionError(expression2)\n\nThese equivalences assume that ``__debug__`` and ``AssertionError``\nrefer to the built-in variables with those names. In the current\nimplementation, the built-in variable ``__debug__`` is ``True`` under\nnormal circumstances, ``False`` when optimization is requested\n(command line option -O). The current code generator emits no code\nfor an assert statement when optimization is requested at compile\ntime. Note that it is unnecessary to include the source code for the\nexpression that failed in the error message; it will be displayed as\npart of the stack trace.\n\nAssignments to ``__debug__`` are illegal. The value for the built-in\nvariable is determined when the interpreter starts.\n',
'assignment': '\nAssignment statements\n*********************\n\nAssignment statements are used to (re)bind names to values and to\nmodify attributes or items of mutable objects:\n\n assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)\n target_list ::= target ("," target)* [","]\n target ::= identifier\n | "(" target_list ")"\n | "[" target_list "]"\n | attributeref\n | subscription\n | slicing\n | "*" target\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn assignment statement evaluates the expression list (remember that\nthis can be a single expression or a comma-separated list, the latter\nyielding a tuple) and assigns the single resulting object to each of\nthe target lists, from left to right.\n\nAssignment is defined recursively depending on the form of the target\n(list). When a target is part of a mutable object (an attribute\nreference, subscription or slicing), the mutable object must\nultimately perform the assignment and decide about its validity, and\nmay raise an exception if the assignment is unacceptable. The rules\nobserved by various types and the exceptions raised are given with the\ndefinition of the object types (see section *The standard type\nhierarchy*).\n\nAssignment of an object to a target list, optionally enclosed in\nparentheses or square brackets, is recursively defined as follows.\n\n* If the target list is a single target: The object is assigned to\n that target.\n\n* If the target list is a comma-separated list of targets: The object\n must be an iterable with the same number of items as there are\n targets in the target list, and the items are assigned, from left to\n right, to the corresponding targets.\n\n * If the target list contains one target prefixed with an asterisk,\n called a "starred" target: The object must be a sequence with at\n least as many items as there are targets in the target list, minus\n one. The first items of the sequence are assigned, from left to\n right, to the targets before the starred target. The final items\n of the sequence are assigned to the targets after the starred\n target. A list of the remaining items in the sequence is then\n assigned to the starred target (the list can be empty).\n\n * Else: The object must be a sequence with the same number of items\n as there are targets in the target list, and the items are\n assigned, from left to right, to the corresponding targets.\n\nAssignment of an object to a single target is recursively defined as\nfollows.\n\n* If the target is an identifier (name):\n\n * If the name does not occur in a ``global`` or ``nonlocal``\n statement in the current code block: the name is bound to the\n object in the current local namespace.\n\n * Otherwise: the name is bound to the object in the global namespace\n or the outer namespace determined by ``nonlocal``, respectively.\n\n The name is rebound if it was already bound. This may cause the\n reference count for the object previously bound to the name to reach\n zero, causing the object to be deallocated and its destructor (if it\n has one) to be called.\n\n* If the target is a target list enclosed in parentheses or in square\n brackets: The object must be an iterable with the same number of\n items as there are targets in the target list, and its items are\n assigned, from left to right, to the corresponding targets.\n\n* If the target is an attribute reference: The primary expression in\n the reference is evaluated. It should yield an object with\n assignable attributes; if this is not the case, ``TypeError`` is\n raised. That object is then asked to assign the assigned object to\n the given attribute; if it cannot perform the assignment, it raises\n an exception (usually but not necessarily ``AttributeError``).\n\n Note: If the object is a class instance and the attribute reference\n occurs on both sides of the assignment operator, the RHS expression,\n ``a.x`` can access either an instance attribute or (if no instance\n attribute exists) a class attribute. The LHS target ``a.x`` is\n always set as an instance attribute, creating it if necessary.\n Thus, the two occurrences of ``a.x`` do not necessarily refer to the\n same attribute: if the RHS expression refers to a class attribute,\n the LHS creates a new instance attribute as the target of the\n assignment:\n\n class Cls:\n x = 3 # class variable\n inst = Cls()\n inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3\n\n This description does not necessarily apply to descriptor\n attributes, such as properties created with ``property()``.\n\n* If the target is a subscription: The primary expression in the\n reference is evaluated. It should yield either a mutable sequence\n object (such as a list) or a mapping object (such as a dictionary).\n Next, the subscript expression is evaluated.\n\n If the primary is a mutable sequence object (such as a list), the\n subscript must yield an integer. If it is negative, the sequence\'s\n length is added to it. The resulting value must be a nonnegative\n integer less than the sequence\'s length, and the sequence is asked\n to assign the assigned object to its item with that index. If the\n index is out of range, ``IndexError`` is raised (assignment to a\n subscripted sequence cannot add new items to a list).\n\n If the primary is a mapping object (such as a dictionary), the\n subscript must have a type compatible with the mapping\'s key type,\n and the mapping is then asked to create a key/datum pair which maps\n the subscript to the assigned object. This can either replace an\n existing key/value pair with the same key value, or insert a new\n key/value pair (if no key with the same value existed).\n\n For user-defined objects, the ``__setitem__()`` method is called\n with appropriate arguments.\n\n* If the target is a slicing: The primary expression in the reference\n is evaluated. It should yield a mutable sequence object (such as a\n list). The assigned object should be a sequence object of the same\n type. Next, the lower and upper bound expressions are evaluated,\n insofar they are present; defaults are zero and the sequence\'s\n length. The bounds should evaluate to integers. If either bound is\n negative, the sequence\'s length is added to it. The resulting\n bounds are clipped to lie between zero and the sequence\'s length,\n inclusive. Finally, the sequence object is asked to replace the\n slice with the items of the assigned sequence. The length of the\n slice may be different from the length of the assigned sequence,\n thus changing the length of the target sequence, if the object\n allows it.\n\n**CPython implementation detail:** In the current implementation, the\nsyntax for targets is taken to be the same as for expressions, and\ninvalid syntax is rejected during the code generation phase, causing\nless detailed error messages.\n\nWARNING: Although the definition of assignment implies that overlaps\nbetween the left-hand side and the right-hand side are \'safe\' (for\nexample ``a, b = b, a`` swaps two variables), overlaps *within* the\ncollection of assigned-to variables are not safe! For instance, the\nfollowing program prints ``[0, 2]``:\n\n x = [0, 1]\n i = 0\n i, x[i] = 1, 2\n print(x)\n\nSee also:\n\n **PEP 3132** - Extended Iterable Unpacking\n The specification for the ``*target`` feature.\n\n\nAugmented assignment statements\n===============================\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
'atom-identifiers': '\nIdentifiers (Names)\n*******************\n\nAn identifier occurring as an atom is a name. See section\n*Identifiers and keywords* for lexical definition and section *Naming\nand binding* for documentation of naming and binding.\n\nWhen the name is bound to an object, evaluation of the atom yields\nthat object. When a name is not bound, an attempt to evaluate it\nraises a ``NameError`` exception.\n\n**Private name mangling:** When an identifier that textually occurs in\na class definition begins with two or more underscore characters and\ndoes not end in two or more underscores, it is considered a *private\nname* of that class. Private names are transformed to a longer form\nbefore code is generated for them. The transformation inserts the\nclass name in front of the name, with leading underscores removed, and\na single underscore inserted in front of the class name. For example,\nthe identifier ``__spam`` occurring in a class named ``Ham`` will be\ntransformed to ``_Ham__spam``. This transformation is independent of\nthe syntactical context in which the identifier is used. If the\ntransformed name is extremely long (longer than 255 characters),\nimplementation defined truncation may happen. If the class name\nconsists only of underscores, no transformation is done.\n',
'atom-literals': "\nLiterals\n********\n\nPython supports string and bytes literals and various numeric\nliterals:\n\n literal ::= stringliteral | bytesliteral\n | integer | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\nbytes, integer, floating point number, complex number) with the given\nvalue. The value may be approximated in the case of floating point\nand imaginary (complex) literals. See section *Literals* for details.\n\nAll literals correspond to immutable data types, and hence the\nobject's identity is less important than its value. Multiple\nevaluations of literals with the same value (either the same\noccurrence in the program text or a different occurrence) may obtain\nthe same object or a different object with the same value.\n",
- 'attribute-access': '\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A list must be\n returned.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n',
+ 'attribute-access': '\nCustomizing attribute access\n****************************\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n========================\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n====================\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n=========\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n--------------------------\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n',
'attribute-references': '\nAttribute references\n********************\n\nAn attribute reference is a primary followed by a period and a name:\n\n attributeref ::= primary "." identifier\n\nThe primary must evaluate to an object of a type that supports\nattribute references, which most objects do. This object is then\nasked to produce the attribute whose name is the identifier (which can\nbe customized by overriding the ``__getattr__()`` method). If this\nattribute is not available, the exception ``AttributeError`` is\nraised. Otherwise, the type and value of the object produced is\ndetermined by the object. Multiple evaluations of the same attribute\nreference may yield different objects.\n',
'augassign': '\nAugmented assignment statements\n*******************************\n\nAugmented assignment is the combination, in a single statement, of a\nbinary operation and an assignment statement:\n\n augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression)\n augtarget ::= identifier | attributeref | subscription | slicing\n augop ::= "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**="\n | ">>=" | "<<=" | "&=" | "^=" | "|="\n\n(See section *Primaries* for the syntax definitions for the last three\nsymbols.)\n\nAn augmented assignment evaluates the target (which, unlike normal\nassignment statements, cannot be an unpacking) and the expression\nlist, performs the binary operation specific to the type of assignment\non the two operands, and assigns the result to the original target.\nThe target is only evaluated once.\n\nAn augmented assignment expression like ``x += 1`` can be rewritten as\n``x = x + 1`` to achieve a similar, but not exactly equal effect. In\nthe augmented version, ``x`` is only evaluated once. Also, when\npossible, the actual operation is performed *in-place*, meaning that\nrather than creating a new object and assigning that to the target,\nthe old object is modified instead.\n\nWith the exception of assigning to tuples and multiple targets in a\nsingle statement, the assignment done by augmented assignment\nstatements is handled the same way as normal assignments. Similarly,\nwith the exception of the possible *in-place* behavior, the binary\noperation performed by augmented assignment is the same as the normal\nbinary operations.\n\nFor targets which are attribute references, the same *caveat about\nclass and instance attributes* applies as for regular assignments.\n',
- 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels. Note that some of these operations also apply to certain non-\nnumeric types. Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n | m_expr "%" u_expr\n a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments. The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether. In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments. The numeric arguments are first\nconverted to a common type. Integer division yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult. Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second. The numeric arguments are first\nconverted to a common type. A zero right argument raises the\n``ZeroDivisionError`` exception. The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.) The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``. Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation). The syntax for\nstring formatting is described in the Python Library Reference,\nsection *Old String Formatting Operations*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers. Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments. The\narguments must either both be numbers or both sequences of the same\ntype. In the former case, the numbers are converted to a common type\nand then added together. In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments. The numeric arguments are first converted to a common\ntype.\n',
+ 'binary': '\nBinary arithmetic operations\n****************************\n\nThe binary arithmetic operations have the conventional priority\nlevels. Note that some of these operations also apply to certain non-\nnumeric types. Apart from the power operator, there are only two\nlevels, one for multiplicative operators and one for additive\noperators:\n\n m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr\n | m_expr "%" u_expr\n a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr\n\nThe ``*`` (multiplication) operator yields the product of its\narguments. The arguments must either both be numbers, or one argument\nmust be an integer and the other must be a sequence. In the former\ncase, the numbers are converted to a common type and then multiplied\ntogether. In the latter case, sequence repetition is performed; a\nnegative repetition factor yields an empty sequence.\n\nThe ``/`` (division) and ``//`` (floor division) operators yield the\nquotient of their arguments. The numeric arguments are first\nconverted to a common type. Integer division yields a float, while\nfloor division of integers results in an integer; the result is that\nof mathematical division with the \'floor\' function applied to the\nresult. Division by zero raises the ``ZeroDivisionError`` exception.\n\nThe ``%`` (modulo) operator yields the remainder from the division of\nthe first argument by the second. The numeric arguments are first\nconverted to a common type. A zero right argument raises the\n``ZeroDivisionError`` exception. The arguments may be floating point\nnumbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals\n``4*0.7 + 0.34``.) The modulo operator always yields a result with\nthe same sign as its second operand (or zero); the absolute value of\nthe result is strictly smaller than the absolute value of the second\noperand [1].\n\nThe floor division and modulo operators are connected by the following\nidentity: ``x == (x//y)*y + (x%y)``. Floor division and modulo are\nalso connected with the built-in function ``divmod()``: ``divmod(x, y)\n== (x//y, x%y)``. [2].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string objects to perform old-style\nstring formatting (also known as interpolation). The syntax for\nstring formatting is described in the Python Library Reference,\nsection *printf-style String Formatting*.\n\nThe floor division operator, the modulo operator, and the ``divmod()``\nfunction are not defined for complex numbers. Instead, convert to a\nfloating point number using the ``abs()`` function if appropriate.\n\nThe ``+`` (addition) operator yields the sum of its arguments. The\narguments must either both be numbers or both sequences of the same\ntype. In the former case, the numbers are converted to a common type\nand then added together. In the latter case, the sequences are\nconcatenated.\n\nThe ``-`` (subtraction) operator yields the difference of its\narguments. The numeric arguments are first converted to a common\ntype.\n',
'bitwise': '\nBinary bitwise operations\n*************************\n\nEach of the three bitwise operations has a different priority level:\n\n and_expr ::= shift_expr | and_expr "&" shift_expr\n xor_expr ::= and_expr | xor_expr "^" and_expr\n or_expr ::= xor_expr | or_expr "|" xor_expr\n\nThe ``&`` operator yields the bitwise AND of its arguments, which must\nbe integers.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be integers.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be integers.\n',
'bltin-code-objects': '\nCode Objects\n************\n\nCode objects are used by the implementation to represent "pseudo-\ncompiled" executable Python code such as a function body. They differ\nfrom function objects because they don\'t contain a reference to their\nglobal execution environment. Code objects are returned by the built-\nin ``compile()`` function and can be extracted from function objects\nthrough their ``__code__`` attribute. See also the ``code`` module.\n\nA code object can be executed or evaluated by passing it (instead of a\nsource string) to the ``exec()`` or ``eval()`` built-in functions.\n\nSee *The standard type hierarchy* for more information.\n',
- 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is commonly used by slicing (see *Slicings*). It supports\nno special operations. There is exactly one ellipsis object, named\n``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis`` or ``...``.\n',
- 'bltin-null-object': "\nThe Null Object\n***************\n\nThis object is returned by functions that don't explicitly return a\nvalue. It supports no special operations. There is exactly one null\nobject, named ``None`` (a built-in name).\n\nIt is written as ``None``.\n",
+ 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is commonly used by slicing (see *Slicings*). It supports\nno special operations. There is exactly one ellipsis object, named\n``Ellipsis`` (a built-in name). ``type(Ellipsis)()`` produces the\n``Ellipsis`` singleton.\n\nIt is written as ``Ellipsis`` or ``...``.\n',
+ 'bltin-null-object': "\nThe Null Object\n***************\n\nThis object is returned by functions that don't explicitly return a\nvalue. It supports no special operations. There is exactly one null\nobject, named ``None`` (a built-in name). ``type(None)()`` produces\nthe same singleton.\n\nIt is written as ``None``.\n",
'bltin-type-objects': "\nType Objects\n************\n\nType objects represent the various object types. An object's type is\naccessed by the built-in function ``type()``. There are no special\noperations on types. The standard module ``types`` defines names for\nall standard built-in types.\n\nTypes are written like this: ``<class 'int'>``.\n",
'booleans': '\nBoolean operations\n******************\n\n or_test ::= and_test | or_test "or" and_test\n and_test ::= not_test | and_test "and" not_test\n not_test ::= comparison | "not" not_test\n\nIn the context of Boolean operations, and also when expressions are\nused by control flow statements, the following values are interpreted\nas false: ``False``, ``None``, numeric zero of all types, and empty\nstrings and containers (including strings, tuples, lists,\ndictionaries, sets and frozensets). All other values are interpreted\nas true. User-defined objects can customize their truth value by\nproviding a ``__bool__()`` method.\n\nThe operator ``not`` yields ``True`` if its argument is false,\n``False`` otherwise.\n\nThe expression ``x and y`` first evaluates *x*; if *x* is false, its\nvalue is returned; otherwise, *y* is evaluated and the resulting value\nis returned.\n\nThe expression ``x or y`` first evaluates *x*; if *x* is true, its\nvalue is returned; otherwise, *y* is evaluated and the resulting value\nis returned.\n\n(Note that neither ``and`` nor ``or`` restrict the value and type they\nreturn to ``False`` and ``True``, but rather return the last evaluated\nargument. This is sometimes useful, e.g., if ``s`` is a string that\nshould be replaced by a default value if it is empty, the expression\n``s or \'foo\'`` yields the desired value. Because ``not`` has to\ninvent a value anyway, it does not bother to return a value of the\nsame type as its argument, so e.g., ``not \'foo\'`` yields ``False``,\nnot ``\'\'``.)\n',
'break': '\nThe ``break`` statement\n***********************\n\n break_stmt ::= "break"\n\n``break`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition\nwithin that loop.\n\nIt terminates the nearest enclosing loop, skipping the optional\n``else`` clause if the loop has one.\n\nIf a ``for`` loop is terminated by ``break``, the loop control target\nkeeps its current value.\n\nWhen ``break`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the loop.\n',
@@ -18,13 +19,13 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'calls': '\nCalls\n*****\n\nA call calls a callable object (e.g., a function) with a possibly\nempty series of arguments:\n\n call ::= primary "(" [argument_list [","] | comprehension] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," keyword_arguments] ["," "**" expression]\n | "*" expression ["," keyword_arguments] ["," "**" expression]\n | "**" expression\n positional_arguments ::= expression ("," expression)*\n keyword_arguments ::= keyword_item ("," keyword_item)*\n keyword_item ::= identifier "=" expression\n\nA trailing comma may be present after the positional and keyword\narguments but does not affect the semantics.\n\nThe primary must evaluate to a callable object (user-defined\nfunctions, built-in functions, methods of built-in objects, class\nobjects, methods of class instances, and all objects having a\n``__call__()`` method are callable). All argument expressions are\nevaluated before the call is attempted. Please refer to section\n*Function definitions* for the syntax of formal parameter lists.\n\nIf keyword arguments are present, they are first converted to\npositional arguments, as follows. First, a list of unfilled slots is\ncreated for the formal parameters. If there are N positional\narguments, they are placed in the first N slots. Next, for each\nkeyword argument, the identifier is used to determine the\ncorresponding slot (if the identifier is the same as the first formal\nparameter name, the first slot is used, and so on). If the slot is\nalready filled, a ``TypeError`` exception is raised. Otherwise, the\nvalue of the argument is placed in the slot, filling it (even if the\nexpression is ``None``, it fills the slot). When all arguments have\nbeen processed, the slots that are still unfilled are filled with the\ncorresponding default value from the function definition. (Default\nvalues are calculated, once, when the function is defined; thus, a\nmutable object such as a list or dictionary used as default value will\nbe shared by all calls that don\'t specify an argument value for the\ncorresponding slot; this should usually be avoided.) If there are any\nunfilled slots for which no default value is specified, a\n``TypeError`` exception is raised. Otherwise, the list of filled\nslots is used as the argument list for the call.\n\n**CPython implementation detail:** An implementation may provide\nbuilt-in functions whose positional parameters do not have names, even\nif they are \'named\' for the purpose of documentation, and which\ntherefore cannot be supplied by keyword. In CPython, this is the case\nfor functions implemented in C that use ``PyArg_ParseTuple()`` to\nparse their arguments.\n\nIf there are more positional arguments than there are formal parameter\nslots, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``*identifier`` is present; in this case, that formal\nparameter receives a tuple containing the excess positional arguments\n(or an empty tuple if there were no excess positional arguments).\n\nIf any keyword argument does not correspond to a formal parameter\nname, a ``TypeError`` exception is raised, unless a formal parameter\nusing the syntax ``**identifier`` is present; in this case, that\nformal parameter receives a dictionary containing the excess keyword\narguments (using the keywords as keys and the argument values as\ncorresponding values), or a (new) empty dictionary if there were no\nexcess keyword arguments.\n\nIf the syntax ``*expression`` appears in the function call,\n``expression`` must evaluate to an iterable. Elements from this\niterable are treated as if they were additional positional arguments;\nif there are positional arguments *x1*, ..., *xN*, and ``expression``\nevaluates to a sequence *y1*, ..., *yM*, this is equivalent to a call\nwith M+N positional arguments *x1*, ..., *xN*, *y1*, ..., *yM*.\n\nA consequence of this is that although the ``*expression`` syntax may\nappear *after* some keyword arguments, it is processed *before* the\nkeyword arguments (and the ``**expression`` argument, if any -- see\nbelow). So:\n\n >>> def f(a, b):\n ... print(a, b)\n ...\n >>> f(b=1, *(2,))\n 2 1\n >>> f(a=1, *(2,))\n Traceback (most recent call last):\n File "<stdin>", line 1, in ?\n TypeError: f() got multiple values for keyword argument \'a\'\n >>> f(1, *(2,))\n 1 2\n\nIt is unusual for both keyword arguments and the ``*expression``\nsyntax to be used in the same call, so in practice this confusion does\nnot arise.\n\nIf the syntax ``**expression`` appears in the function call,\n``expression`` must evaluate to a mapping, the contents of which are\ntreated as additional keyword arguments. In the case of a keyword\nappearing in both ``expression`` and as an explicit keyword argument,\na ``TypeError`` exception is raised.\n\nFormal parameters using the syntax ``*identifier`` or ``**identifier``\ncannot be used as positional argument slots or as keyword argument\nnames.\n\nA call always returns some value, possibly ``None``, unless it raises\nan exception. How this value is computed depends on the type of the\ncallable object.\n\nIf it is---\n\na user-defined function:\n The code block for the function is executed, passing it the\n argument list. The first thing the code block will do is bind the\n formal parameters to the arguments; this is described in section\n *Function definitions*. When the code block executes a ``return``\n statement, this specifies the return value of the function call.\n\na built-in function or method:\n The result is up to the interpreter; see *Built-in Functions* for\n the descriptions of built-in functions and methods.\n\na class object:\n A new instance of that class is returned.\n\na class instance method:\n The corresponding user-defined function is called, with an argument\n list that is one longer than the argument list of the call: the\n instance becomes the first argument.\n\na class instance:\n The class must define a ``__call__()`` method; the effect is then\n the same as if that method was called.\n',
'class': '\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
'comparisons': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another, but comparisons of\n``float`` and ``Decimal`` are not supported to avoid the inevitable\nconfusion arising from representation issues such as ``float(\'1.1\')``\nbeing inexactly represented and therefore not exactly equal to\n``Decimal(\'1.1\')`` which is. When cross-type comparison is not\nsupported, the comparison method returns ``NotImplemented``. This can\ncreate the illusion of non-transitivity between supported cross-type\ncomparisons and unsupported comparisons. For example, ``Decimal(2) ==\n2`` and ``2 == float(2)`` but ``Decimal(2) != float(2)``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n',
- 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception, it is re-raised at the end\nof the ``finally`` clause. If the ``finally`` clause raises another\nexception or executes a ``return`` or ``break`` statement, the saved\nexception is set as the context of the new exception. The exception\ninformation is not available to the program during execution of the\n``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)*\n [, "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more parameters have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding argument may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
+ 'compound': '\nCompound statements\n*******************\n\nCompound statements contain (groups of) other statements; they affect\nor control the execution of those other statements in some way. In\ngeneral, compound statements span multiple lines, although in simple\nincarnations a whole compound statement may be contained in one line.\n\nThe ``if``, ``while`` and ``for`` statements implement traditional\ncontrol flow constructs. ``try`` specifies exception handlers and/or\ncleanup code for a group of statements, while the ``with`` statement\nallows the execution of initialization and finalization code around a\nblock of code. Function and class definitions are also syntactically\ncompound statements.\n\nCompound statements consist of one or more \'clauses.\' A clause\nconsists of a header and a \'suite.\' The clause headers of a\nparticular compound statement are all at the same indentation level.\nEach clause header begins with a uniquely identifying keyword and ends\nwith a colon. A suite is a group of statements controlled by a\nclause. A suite can be one or more semicolon-separated simple\nstatements on the same line as the header, following the header\'s\ncolon, or it can be one or more indented statements on subsequent\nlines. Only the latter form of suite can contain nested compound\nstatements; the following is illegal, mostly because it wouldn\'t be\nclear to which ``if`` clause a following ``else`` clause would belong:\n\n if test1: if test2: print(x)\n\nAlso note that the semicolon binds tighter than the colon in this\ncontext, so that in the following example, either all or none of the\n``print()`` calls are executed:\n\n if x < y < z: print(x); print(y); print(z)\n\nSummarizing:\n\n compound_stmt ::= if_stmt\n | while_stmt\n | for_stmt\n | try_stmt\n | with_stmt\n | funcdef\n | classdef\n suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT\n statement ::= stmt_list NEWLINE | compound_stmt\n stmt_list ::= simple_stmt (";" simple_stmt)* [";"]\n\nNote that statements always end in a ``NEWLINE`` possibly followed by\na ``DEDENT``. Also note that optional continuation clauses always\nbegin with a keyword that cannot start a statement, thus there are no\nambiguities (the \'dangling ``else``\' problem is solved in Python by\nrequiring nested ``if`` statements to be indented).\n\nThe formatting of the grammar rules in the following sections places\neach clause on a separate line for clarity.\n\n\nThe ``if`` statement\n====================\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n\n\nThe ``while`` statement\n=======================\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n\n\nThe ``for`` statement\n=====================\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n\n\nThe ``try`` statement\n=====================\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception or ``break`` statement, it is\nre-raised at the end of the ``finally`` clause. If the ``finally``\nclause raises another exception the saved exception is set as the\ncontext of the new exception; if the ``finally`` clause executes a\n``return`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n\n\nThe ``with`` statement\n======================\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nFunction definitions\n====================\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)*\n [, "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more parameters have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding argument may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n\n\nClass definitions\n=================\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= [decorators] "class" classname [inheritance] ":" suite\n inheritance ::= "(" [parameter_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. The inheritance list\nusually gives a list of base classes (see *Customizing class creation*\nfor more advanced uses), so each item in the list should evaluate to a\nclass object which allows subclassing. Classes without an inheritance\nlist inherit, by default, from the base class ``object``; hence,\n\n class Foo:\n pass\n\nis equivalent to\n\n class Foo(object):\n pass\n\nThe class\'s suite is then executed in a new execution frame (see\n*Naming and binding*), using a newly created local namespace and the\noriginal global namespace. (Usually, the suite contains mostly\nfunction definitions.) When the class\'s suite finishes execution, its\nexecution frame is discarded but its local namespace is saved. [4] A\nclass object is then created using the inheritance list for the base\nclasses and the saved local namespace for the attribute dictionary.\nThe class name is bound to this class object in the original local\nnamespace.\n\nClass creation can be customized heavily using *metaclasses*.\n\nClasses can also be decorated: just like when decorating functions,\n\n @f1(arg)\n @f2\n class Foo: pass\n\nis equivalent to\n\n class Foo: pass\n Foo = f1(arg)(f2(Foo))\n\nThe evaluation rules for the decorator expressions are the same as for\nfunction decorators. The result must be a class object, which is then\nbound to the class name.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass attributes; they are shared by instances. Instance attributes\ncan be set in a method with ``self.name = value``. Both class and\ninstance attributes are accessible through the notation\n"``self.name``", and an instance attribute hides a class attribute\nwith the same name when accessed in this way. Class attributes can be\nused as defaults for instance attributes, but using mutable values\nthere can lead to unexpected results. *Descriptors* can be used to\ncreate instance variables with different implementation details.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3 **PEP 3129** - Class\n Decorators\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack unless there\n is a ``finally`` clause which happens to raise another exception.\n That new exception causes the old one to be lost.\n\n[2] Currently, control "flows off the end" except in the case of an\n exception or the execution of a ``return``, ``continue``, or\n ``break`` statement.\n\n[3] A string literal appearing as the first statement in the function\n body is transformed into the function\'s ``__doc__`` attribute and\n therefore the function\'s *docstring*.\n\n[4] A string literal appearing as the first statement in the class\n body is transformed into the namespace\'s ``__doc__`` item and\n therefore the class\'s *docstring*.\n',
'context-managers': '\nWith Statement Context Managers\n*******************************\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n',
'continue': '\nThe ``continue`` statement\n**************************\n\n continue_stmt ::= "continue"\n\n``continue`` may only occur syntactically nested in a ``for`` or\n``while`` loop, but not nested in a function or class definition or\n``finally`` clause within that loop. It continues with the next cycle\nof the nearest enclosing loop.\n\nWhen ``continue`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nstarting the next loop cycle.\n',
'conversions': '\nArithmetic conversions\n**********************\n\nWhen a description of an arithmetic operator below uses the phrase\n"the numeric arguments are converted to a common type," this means\nthat the operator implementation for built-in types works that way:\n\n* If either argument is a complex number, the other is converted to\n complex;\n\n* otherwise, if either argument is a floating point number, the other\n is converted to floating point;\n\n* otherwise, both must be integers and no conversion is necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions must define their own\nconversion behavior.\n',
- 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by the ``str()`` built-in function and by the ``print()``\n function to compute the "informal" string representation of an\n object. This differs from ``__repr__()`` in that it does not have\n to be a valid Python expression: a more convenient or concise\n representation may be used instead. The return value must be a\n string object.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns ``id(x)``.\n\n Classes which inherit a ``__hash__()`` method from a parent class\n but change the meaning of ``__eq__()`` such that the hash value\n returned is no longer appropriate (e.g. by switching to a value-\n based concept of equality instead of the default identity based\n equality) can explicitly flag themselves as being unhashable by\n setting ``__hash__ = None`` in the class definition. Doing so means\n that not only will instances of the class raise an appropriate\n ``TypeError`` when a program attempts to retrieve their hash value,\n but they will also be correctly identified as unhashable when\n checking ``isinstance(obj, collections.Hashable)`` (unlike classes\n which define their own ``__hash__()`` to explicitly raise\n ``TypeError``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\n\n See also the *-R* command-line option.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n',
- 'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source. The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > <string>(0)?()\n (Pdb) continue\n > <string>(1)?()\n (Pdb) continue\n NameError: \'spam\'\n > <string>(1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "<stdin>", line 1, in ?\n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type ``continue``, or you can\n step through the statement using ``step`` or ``next`` (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module ``__main__`` is used. (See\n the explanation of the built-in ``exec()`` or ``eval()``\n functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When ``runeval()`` returns, it returns the\n value of the expression. Otherwise this function is similar to\n ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When ``runcall()`` returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname. If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n ``Pdb`` is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying ``cmd.Cmd`` class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses Ctrl-C on the console) when you give a\n ``continue`` command. This allows you to break into the debugger\n again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT\n handler, set *nosigint* tot true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``). Arguments to commands must be separated by whitespace\n(spaces or tabs). Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint (``!``). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``. (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.) No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``. Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. ``help pdb``\n displays the full documentation (the docstring of the ``pdb``\n module). Since the *command* argument must be an identifier,\n ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on ``sys.path``. Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just ``end`` to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) print some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with ``end``; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint--which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between ``next`` and\n ``step`` is that ``step`` stops inside a called function, while\n ``next`` executes called functions at (nearly) full speed, only\n stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a ``for`` loop or out\n of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With ``.`` as argument, list 11 lines around the current line.\n With one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by ``->``. If\n an exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ``>>``, if it\n differs from the current line.\n\n New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for ``list``.\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np(rint) expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\npp expression\n\n Like the ``print`` command, except the value of the expression is\n pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interative interpreter (using the ``code`` module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n all the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ``.pdbrc`` file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n ``global`` statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with ``shlex`` and the result is used as the new\n ``sys.argv``. History, breakpoints, actions and debugger options\n are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n determined by the ``__name__`` in the frame globals.\n',
- 'del': '\nThe ``del`` statement\n*********************\n\n del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a ``global``\nstatement in the same code block. If the name is unbound, a\n``NameError`` exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2.\n',
+ 'customization': '\nBasic customization\n*******************\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by the ``str()`` built-in function and by the ``print()``\n function to compute the "informal" string representation of an\n object. This differs from ``__repr__()`` in that it does not have\n to be a valid Python expression: a more convenient or concise\n representation may be used instead. The return value must be a\n string object.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n Classes which inherit a ``__hash__()`` method from a parent class\n but change the meaning of ``__eq__()`` such that the hash value\n returned is no longer appropriate (e.g. by switching to a value-\n based concept of equality instead of the default identity based\n equality) can explicitly flag themselves as being unhashable by\n setting ``__hash__ = None`` in the class definition. Doing so means\n that not only will instances of the class raise an appropriate\n ``TypeError`` when a program attempts to retrieve their hash value,\n but they will also be correctly identified as unhashable when\n checking ``isinstance(obj, collections.Hashable)`` (unlike classes\n which define their own ``__hash__()`` to explicitly raise\n ``TypeError``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n',
+ 'debugger': '\n``pdb`` --- The Python Debugger\n*******************************\n\nThe module ``pdb`` defines an interactive source code debugger for\nPython programs. It supports setting (conditional) breakpoints and\nsingle stepping at the source line level, inspection of stack frames,\nsource code listing, and evaluation of arbitrary Python code in the\ncontext of any stack frame. It also supports post-mortem debugging\nand can be called under program control.\n\nThe debugger is extensible -- it is actually defined as the class\n``Pdb``. This is currently undocumented but easily understood by\nreading the source. The extension interface uses the modules ``bdb``\nand ``cmd``.\n\nThe debugger\'s prompt is ``(Pdb)``. Typical usage to run a program\nunder control of the debugger is:\n\n >>> import pdb\n >>> import mymodule\n >>> pdb.run(\'mymodule.test()\')\n > <string>(0)?()\n (Pdb) continue\n > <string>(1)?()\n (Pdb) continue\n NameError: \'spam\'\n > <string>(1)?()\n (Pdb)\n\nChanged in version 3.3: Tab-completion via the ``readline`` module is\navailable for commands and command arguments, e.g. the current global\nand local names are offered as arguments of the ``print`` command.\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python3 -m pdb myscript.py\n\nWhen invoked as a script, pdb will automatically enter post-mortem\ndebugging if the program being debugged exits abnormally. After post-\nmortem debugging (or after normal exit of the program), pdb will\nrestart the program. Automatic restarting preserves pdb\'s state (such\nas breakpoints) and in most cases is more useful than quitting the\ndebugger upon program\'s exit.\n\nNew in version 3.2: ``pdb.py`` now accepts a ``-c`` option that\nexecutes commands as if given in a ``.pdbrc`` file, see *Debugger\nCommands*.\n\nThe typical usage to break into the debugger from a running program is\nto insert\n\n import pdb; pdb.set_trace()\n\nat the location you want to break into the debugger. You can then\nstep through the code following this statement, and continue running\nwithout the debugger using the ``continue`` command.\n\nThe typical usage to inspect a crashed program is:\n\n >>> import pdb\n >>> import mymodule\n >>> mymodule.test()\n Traceback (most recent call last):\n File "<stdin>", line 1, in ?\n File "./mymodule.py", line 4, in test\n test2()\n File "./mymodule.py", line 3, in test2\n print(spam)\n NameError: spam\n >>> pdb.pm()\n > ./mymodule.py(3)test2()\n -> print(spam)\n (Pdb)\n\nThe module defines the following functions; each enters the debugger\nin a slightly different way:\n\npdb.run(statement, globals=None, locals=None)\n\n Execute the *statement* (given as a string or a code object) under\n debugger control. The debugger prompt appears before any code is\n executed; you can set breakpoints and type ``continue``, or you can\n step through the statement using ``step`` or ``next`` (all these\n commands are explained below). The optional *globals* and *locals*\n arguments specify the environment in which the code is executed; by\n default the dictionary of the module ``__main__`` is used. (See\n the explanation of the built-in ``exec()`` or ``eval()``\n functions.)\n\npdb.runeval(expression, globals=None, locals=None)\n\n Evaluate the *expression* (given as a string or a code object)\n under debugger control. When ``runeval()`` returns, it returns the\n value of the expression. Otherwise this function is similar to\n ``run()``.\n\npdb.runcall(function, *args, **kwds)\n\n Call the *function* (a function or method object, not a string)\n with the given arguments. When ``runcall()`` returns, it returns\n whatever the function call returned. The debugger prompt appears\n as soon as the function is entered.\n\npdb.set_trace()\n\n Enter the debugger at the calling stack frame. This is useful to\n hard-code a breakpoint at a given point in a program, even if the\n code is not otherwise being debugged (e.g. when an assertion\n fails).\n\npdb.post_mortem(traceback=None)\n\n Enter post-mortem debugging of the given *traceback* object. If no\n *traceback* is given, it uses the one of the exception that is\n currently being handled (an exception must be being handled if the\n default is to be used).\n\npdb.pm()\n\n Enter post-mortem debugging of the traceback found in\n ``sys.last_traceback``.\n\nThe ``run*`` functions and ``set_trace()`` are aliases for\ninstantiating the ``Pdb`` class and calling the method of the same\nname. If you want to access further features, you have to do this\nyourself:\n\nclass class pdb.Pdb(completekey=\'tab\', stdin=None, stdout=None, skip=None, nosigint=False)\n\n ``Pdb`` is the debugger class.\n\n The *completekey*, *stdin* and *stdout* arguments are passed to the\n underlying ``cmd.Cmd`` class; see the description there.\n\n The *skip* argument, if given, must be an iterable of glob-style\n module name patterns. The debugger will not step into frames that\n originate in a module that matches one of these patterns. [1]\n\n By default, Pdb sets a handler for the SIGINT signal (which is sent\n when the user presses Ctrl-C on the console) when you give a\n ``continue`` command. This allows you to break into the debugger\n again by pressing Ctrl-C. If you want Pdb not to touch the SIGINT\n handler, set *nosigint* tot true.\n\n Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 3.1: The *skip* argument.\n\n New in version 3.2: The *nosigint* argument. Previously, a SIGINT\n handler was never set by Pdb.\n\n run(statement, globals=None, locals=None)\n runeval(expression, globals=None, locals=None)\n runcall(function, *args, **kwds)\n set_trace()\n\n See the documentation for the functions explained above.\n\n\nDebugger Commands\n=================\n\nThe commands recognized by the debugger are listed below. Most\ncommands can be abbreviated to one or two letters as indicated; e.g.\n``h(elp)`` means that either ``h`` or ``help`` can be used to enter\nthe help command (but not ``he`` or ``hel``, nor ``H`` or ``Help`` or\n``HELP``). Arguments to commands must be separated by whitespace\n(spaces or tabs). Optional arguments are enclosed in square brackets\n(``[]``) in the command syntax; the square brackets must not be typed.\nAlternatives in the command syntax are separated by a vertical bar\n(``|``).\n\nEntering a blank line repeats the last command entered. Exception: if\nthe last command was a ``list`` command, the next 11 lines are listed.\n\nCommands that the debugger doesn\'t recognize are assumed to be Python\nstatements and are executed in the context of the program being\ndebugged. Python statements can also be prefixed with an exclamation\npoint (``!``). This is a powerful way to inspect the program being\ndebugged; it is even possible to change a variable or call a function.\nWhen an exception occurs in such a statement, the exception name is\nprinted but the debugger\'s state is not changed.\n\nThe debugger supports *aliases*. Aliases can have parameters which\nallows one a certain level of adaptability to the context under\nexamination.\n\nMultiple commands may be entered on a single line, separated by\n``;;``. (A single ``;`` is not used as it is the separator for\nmultiple commands in a line that is passed to the Python parser.) No\nintelligence is applied to separating the commands; the input is split\nat the first ``;;`` pair, even if it is in the middle of a quoted\nstring.\n\nIf a file ``.pdbrc`` exists in the user\'s home directory or in the\ncurrent directory, it is read in and executed as if it had been typed\nat the debugger prompt. This is particularly useful for aliases. If\nboth files exist, the one in the home directory is read first and\naliases defined there can be overridden by the local file.\n\nChanged in version 3.2: ``.pdbrc`` can now contain commands that\ncontinue debugging, such as ``continue`` or ``next``. Previously,\nthese commands had no effect.\n\nh(elp) [command]\n\n Without argument, print the list of available commands. With a\n *command* as argument, print help about that command. ``help pdb``\n displays the full documentation (the docstring of the ``pdb``\n module). Since the *command* argument must be an identifier,\n ``help exec`` must be entered to get help on the ``!`` command.\n\nw(here)\n\n Print a stack trace, with the most recent frame at the bottom. An\n arrow indicates the current frame, which determines the context of\n most commands.\n\nd(own) [count]\n\n Move the current frame *count* (default one) levels down in the\n stack trace (to a newer frame).\n\nu(p) [count]\n\n Move the current frame *count* (default one) levels up in the stack\n trace (to an older frame).\n\nb(reak) [([filename:]lineno | function) [, condition]]\n\n With a *lineno* argument, set a break there in the current file.\n With a *function* argument, set a break at the first executable\n statement within that function. The line number may be prefixed\n with a filename and a colon, to specify a breakpoint in another\n file (probably one that hasn\'t been loaded yet). The file is\n searched on ``sys.path``. Note that each breakpoint is assigned a\n number to which all the other breakpoint commands refer.\n\n If a second argument is present, it is an expression which must\n evaluate to true before the breakpoint is honored.\n\n Without argument, list all breaks, including for each breakpoint,\n the number of times that breakpoint has been hit, the current\n ignore count, and the associated condition if any.\n\ntbreak [([filename:]lineno | function) [, condition]]\n\n Temporary breakpoint, which is removed automatically when it is\n first hit. The arguments are the same as for ``break``.\n\ncl(ear) [filename:lineno | bpnumber [bpnumber ...]]\n\n With a *filename:lineno* argument, clear all the breakpoints at\n this line. With a space separated list of breakpoint numbers, clear\n those breakpoints. Without argument, clear all breaks (but first\n ask confirmation).\n\ndisable [bpnumber [bpnumber ...]]\n\n Disable the breakpoints given as a space separated list of\n breakpoint numbers. Disabling a breakpoint means it cannot cause\n the program to stop execution, but unlike clearing a breakpoint, it\n remains in the list of breakpoints and can be (re-)enabled.\n\nenable [bpnumber [bpnumber ...]]\n\n Enable the breakpoints specified.\n\nignore bpnumber [count]\n\n Set the ignore count for the given breakpoint number. If count is\n omitted, the ignore count is set to 0. A breakpoint becomes active\n when the ignore count is zero. When non-zero, the count is\n decremented each time the breakpoint is reached and the breakpoint\n is not disabled and any associated condition evaluates to true.\n\ncondition bpnumber [condition]\n\n Set a new *condition* for the breakpoint, an expression which must\n evaluate to true before the breakpoint is honored. If *condition*\n is absent, any existing condition is removed; i.e., the breakpoint\n is made unconditional.\n\ncommands [bpnumber]\n\n Specify a list of commands for breakpoint number *bpnumber*. The\n commands themselves appear on the following lines. Type a line\n containing just ``end`` to terminate the commands. An example:\n\n (Pdb) commands 1\n (com) print some_variable\n (com) end\n (Pdb)\n\n To remove all commands from a breakpoint, type commands and follow\n it immediately with ``end``; that is, give no commands.\n\n With no *bpnumber* argument, commands refers to the last breakpoint\n set.\n\n You can use breakpoint commands to start your program up again.\n Simply use the continue command, or step, or any other command that\n resumes execution.\n\n Specifying any command resuming execution (currently continue,\n step, next, return, jump, quit and their abbreviations) terminates\n the command list (as if that command was immediately followed by\n end). This is because any time you resume execution (even with a\n simple next or step), you may encounter another breakpoint--which\n could have its own command list, leading to ambiguities about which\n list to execute.\n\n If you use the \'silent\' command in the command list, the usual\n message about stopping at a breakpoint is not printed. This may be\n desirable for breakpoints that are to print a specific message and\n then continue. If none of the other commands print anything, you\n see no sign that the breakpoint was reached.\n\ns(tep)\n\n Execute the current line, stop at the first possible occasion\n (either in a function that is called or on the next line in the\n current function).\n\nn(ext)\n\n Continue execution until the next line in the current function is\n reached or it returns. (The difference between ``next`` and\n ``step`` is that ``step`` stops inside a called function, while\n ``next`` executes called functions at (nearly) full speed, only\n stopping at the next line in the current function.)\n\nunt(il) [lineno]\n\n Without argument, continue execution until the line with a number\n greater than the current one is reached.\n\n With a line number, continue execution until a line with a number\n greater or equal to that is reached. In both cases, also stop when\n the current frame returns.\n\n Changed in version 3.2: Allow giving an explicit line number.\n\nr(eturn)\n\n Continue execution until the current function returns.\n\nc(ont(inue))\n\n Continue execution, only stop when a breakpoint is encountered.\n\nj(ump) lineno\n\n Set the next line that will be executed. Only available in the\n bottom-most frame. This lets you jump back and execute code again,\n or jump forward to skip code that you don\'t want to run.\n\n It should be noted that not all jumps are allowed -- for instance\n it is not possible to jump into the middle of a ``for`` loop or out\n of a ``finally`` clause.\n\nl(ist) [first[, last]]\n\n List source code for the current file. Without arguments, list 11\n lines around the current line or continue the previous listing.\n With ``.`` as argument, list 11 lines around the current line.\n With one argument, list 11 lines around at that line. With two\n arguments, list the given range; if the second argument is less\n than the first, it is interpreted as a count.\n\n The current line in the current frame is indicated by ``->``. If\n an exception is being debugged, the line where the exception was\n originally raised or propagated is indicated by ``>>``, if it\n differs from the current line.\n\n New in version 3.2: The ``>>`` marker.\n\nll | longlist\n\n List all source code for the current function or frame.\n Interesting lines are marked as for ``list``.\n\n New in version 3.2.\n\na(rgs)\n\n Print the argument list of the current function.\n\np(rint) expression\n\n Evaluate the *expression* in the current context and print its\n value.\n\npp expression\n\n Like the ``print`` command, except the value of the expression is\n pretty-printed using the ``pprint`` module.\n\nwhatis expression\n\n Print the type of the *expression*.\n\nsource expression\n\n Try to get source code for the given object and display it.\n\n New in version 3.2.\n\ndisplay [expression]\n\n Display the value of the expression if it changed, each time\n execution stops in the current frame.\n\n Without expression, list all display expressions for the current\n frame.\n\n New in version 3.2.\n\nundisplay [expression]\n\n Do not display the expression any more in the current frame.\n Without expression, clear all display expressions for the current\n frame.\n\n New in version 3.2.\n\ninteract\n\n Start an interative interpreter (using the ``code`` module) whose\n global namespace contains all the (global and local) names found in\n the current scope.\n\n New in version 3.2.\n\nalias [name [command]]\n\n Create an alias called *name* that executes *command*. The command\n must *not* be enclosed in quotes. Replaceable parameters can be\n indicated by ``%1``, ``%2``, and so on, while ``%*`` is replaced by\n all the parameters. If no command is given, the current alias for\n *name* is shown. If no arguments are given, all aliases are listed.\n\n Aliases may be nested and can contain anything that can be legally\n typed at the pdb prompt. Note that internal pdb commands *can* be\n overridden by aliases. Such a command is then hidden until the\n alias is removed. Aliasing is recursively applied to the first\n word of the command line; all other words in the line are left\n alone.\n\n As an example, here are two useful aliases (especially when placed\n in the ``.pdbrc`` file):\n\n # Print instance variables (usage "pi classInst")\n alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])\n # Print instance variables in self\n alias ps pi self\n\nunalias name\n\n Delete the specified alias.\n\n! statement\n\n Execute the (one-line) *statement* in the context of the current\n stack frame. The exclamation point can be omitted unless the first\n word of the statement resembles a debugger command. To set a\n global variable, you can prefix the assignment command with a\n ``global`` statement on the same line, e.g.:\n\n (Pdb) global list_options; list_options = [\'-l\']\n (Pdb)\n\nrun [args ...]\nrestart [args ...]\n\n Restart the debugged Python program. If an argument is supplied,\n it is split with ``shlex`` and the result is used as the new\n ``sys.argv``. History, breakpoints, actions and debugger options\n are preserved. ``restart`` is an alias for ``run``.\n\nq(uit)\n\n Quit from the debugger. The program being executed is aborted.\n\n-[ Footnotes ]-\n\n[1] Whether a frame is considered to originate in a certain module is\n determined by the ``__name__`` in the frame globals.\n',
+ 'del': '\nThe ``del`` statement\n*********************\n\n del_stmt ::= "del" target_list\n\nDeletion is recursively defined very similar to the way assignment is\ndefined. Rather than spelling it out in full details, here are some\nhints.\n\nDeletion of a target list recursively deletes each target, from left\nto right.\n\nDeletion of a name removes the binding of that name from the local or\nglobal namespace, depending on whether the name occurs in a ``global``\nstatement in the same code block. If the name is unbound, a\n``NameError`` exception will be raised.\n\nDeletion of attribute references, subscriptions and slicings is passed\nto the primary object involved; deletion of a slicing is in general\nequivalent to assignment of an empty slice of the right type (but even\nthis is determined by the sliced object).\n\nChanged in version 3.2: Previously it was illegal to delete a name\nfrom the local namespace if it occurs as a free variable in a nested\nblock.\n',
'dict': '\nDictionary displays\n*******************\n\nA dictionary display is a possibly empty series of key/datum pairs\nenclosed in curly braces:\n\n dict_display ::= "{" [key_datum_list | dict_comprehension] "}"\n key_datum_list ::= key_datum ("," key_datum)* [","]\n key_datum ::= expression ":" expression\n dict_comprehension ::= expression ":" expression comp_for\n\nA dictionary display yields a new dictionary object.\n\nIf a comma-separated sequence of key/datum pairs is given, they are\nevaluated from left to right to define the entries of the dictionary:\neach key object is used as a key into the dictionary to store the\ncorresponding datum. This means that you can specify the same key\nmultiple times in the key/datum list, and the final dictionary\'s value\nfor that key will be the last one given.\n\nA dict comprehension, in contrast to list and set comprehensions,\nneeds two expressions separated with a colon followed by the usual\n"for" and "if" clauses. When the comprehension is run, the resulting\nkey and value elements are inserted in the new dictionary in the order\nthey are produced.\n\nRestrictions on the types of the key values are listed earlier in\nsection *The standard type hierarchy*. (To summarize, the key type\nshould be *hashable*, which excludes all mutable objects.) Clashes\nbetween duplicate keys are not detected; the last datum (textually\nrightmost in the display) stored for a given key value prevails.\n',
'dynamic-features': '\nInteraction with dynamic features\n*********************************\n\nThere are several cases where Python statements are illegal when used\nin conjunction with nested scopes that contain free variables.\n\nIf a variable is referenced in an enclosing scope, it is illegal to\ndelete the name. An error will be reported at compile time.\n\nIf the wild card form of import --- ``import *`` --- is used in a\nfunction and the function contains or is a nested block with free\nvariables, the compiler will raise a ``SyntaxError``.\n\nThe ``eval()`` and ``exec()`` functions do not have access to the full\nenvironment for resolving names. Names may be resolved in the local\nand global namespaces of the caller. Free variables are not resolved\nin the nearest enclosing namespace, but in the global namespace. [1]\nThe ``exec()`` and ``eval()`` functions have optional arguments to\noverride the global and local namespace. If only one namespace is\nspecified, it is used for both.\n',
'else': '\nThe ``if`` statement\n********************\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n',
@@ -33,14 +34,14 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'exprlists': '\nExpression lists\n****************\n\n expression_list ::= expression ( "," expression )* [","]\n\nAn expression list containing at least one comma yields a tuple. The\nlength of the tuple is the number of expressions in the list. The\nexpressions are evaluated from left to right.\n\nThe trailing comma is required only to create a single tuple (a.k.a. a\n*singleton*); it is optional in all other cases. A single expression\nwithout a trailing comma doesn\'t create a tuple, but rather yields the\nvalue of that expression. (To create an empty tuple, use an empty pair\nof parentheses: ``()``.)\n',
'floating': '\nFloating point literals\n***********************\n\nFloating point literals are described by the following lexical\ndefinitions:\n\n floatnumber ::= pointfloat | exponentfloat\n pointfloat ::= [intpart] fraction | intpart "."\n exponentfloat ::= (intpart | pointfloat) exponent\n intpart ::= digit+\n fraction ::= "." digit+\n exponent ::= ("e" | "E") ["+" | "-"] digit+\n\nNote that the integer and exponent parts are always interpreted using\nradix 10. For example, ``077e010`` is legal, and denotes the same\nnumber as ``77e10``. The allowed range of floating point literals is\nimplementation-dependent. Some examples of floating point literals:\n\n 3.14 10. .001 1e100 3.14e-10 0e0\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator ``-`` and the\nliteral ``1``.\n',
'for': '\nThe ``for`` statement\n*********************\n\nThe ``for`` statement is used to iterate over the elements of a\nsequence (such as a string, tuple or list) or other iterable object:\n\n for_stmt ::= "for" target_list "in" expression_list ":" suite\n ["else" ":" suite]\n\nThe expression list is evaluated once; it should yield an iterable\nobject. An iterator is created for the result of the\n``expression_list``. The suite is then executed once for each item\nprovided by the iterator, in the order of ascending indices. Each\nitem in turn is assigned to the target list using the standard rules\nfor assignments (see *Assignment statements*), and then the suite is\nexecuted. When the items are exhausted (which is immediately when the\nsequence is empty or an iterator raises a ``StopIteration``\nexception), the suite in the ``else`` clause, if present, is executed,\nand the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ncontinues with the next item, or with the ``else`` clause if there was\nno next item.\n\nThe suite may assign to the variable(s) in the target list; this does\nnot affect the next item assigned to it.\n\nNames in the target list are not deleted when the loop is finished,\nbut if the sequence is empty, it will not have been assigned to at all\nby the loop. Hint: the built-in function ``range()`` returns an\niterator of integers suitable to emulate the effect of Pascal\'s ``for\ni := a to b do``; e.g., ``list(range(3))`` returns the list ``[0, 1,\n2]``.\n\nNote: There is a subtlety when the sequence is being modified by the loop\n (this can only occur for mutable sequences, i.e. lists). An\n internal counter is used to keep track of which item is used next,\n and this is incremented on each iteration. When this counter has\n reached the length of the sequence the loop terminates. This means\n that if the suite deletes the current (or a previous) item from the\n sequence, the next item will be skipped (since it gets the index of\n the current item which has already been treated). Likewise, if the\n suite inserts an item in the sequence before the current item, the\n current item will be treated again the next time through the loop.\n This can lead to nasty bugs that can be avoided by making a\n temporary copy using a slice of the whole sequence, e.g.,\n\n for x in a[:]:\n if x < 0: a.remove(x)\n',
- 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= <any source character except "]"> +\n conversion ::= "r" | "s" | "a"\n format_spec ::= <described in the next section>\n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``. These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself. However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting. By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed. The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in ``format()`` function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= <a character other than \'}\'>\n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'. The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'<\'`` | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | ``\'>\'`` | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | ``\'=\'`` | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. |\n +-----------+------------------------------------------------------------+\n | ``\'^\'`` | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'+\'`` | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | ``\'-\'`` | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nIf the *width* field is preceded by a zero (``\'0\'``) character, this\nenables zero-padding. This is equivalent to an *alignment* type of\n``\'=\'`` and a *fill* character of ``\'0\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'s\'`` | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'s\'``. |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'b\'`` | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | ``\'c\'`` | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | ``\'d\'`` | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | ``\'o\'`` | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | ``\'x\'`` | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'X\'`` | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'d\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'d\'``. |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'e\'`` | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n +-----------+------------------------------------------------------------+\n | ``\'E\'`` | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | ``\'f\'`` | Fixed point. Displays the number as a fixed-point number. |\n +-----------+------------------------------------------------------------+\n | ``\'F\'`` | Fixed point. Same as ``\'f\'``, but converts ``nan`` to |\n | | ``NAN`` and ``inf`` to ``INF``. |\n +-----------+------------------------------------------------------------+\n | ``\'g\'`` | General format. For a given precision ``p >= 1``, this |\n | | rounds the number to ``p`` significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1`` would have exponent ``exp``. Then if ``-4 <= exp |\n | | < p``, the number is formatted with presentation type |\n | | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number |\n | | is formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1``. In both cases insignificant trailing zeros are |\n | | removed from the significand, and the decimal point is |\n | | also removed if there are no remaining digits following |\n | | it. Positive and negative infinity, positive and negative |\n | | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n | | ``-0`` and ``nan`` respectively, regardless of the |\n | | precision. A precision of ``0`` is treated as equivalent |\n | | to a precision of ``1``. |\n +-----------+------------------------------------------------------------+\n | ``\'G\'`` | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n | | if the number gets too large. The representations of |\n | | infinity and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'g\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | ``\'%\'`` | Percentage. Multiplies the number by 100 and displays in |\n | | fixed (``\'f\'``) format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to ``\'g\'``, except with at least one digit past |\n | | the decimal point and a default precision of 12. This is |\n | | intended to match ``str()``, except you can add the other |\n | | format modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12):\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n',
- 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)*\n [, "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more parameters have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding argument may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n',
+ 'formatstrings': '\nFormat String Syntax\n********************\n\nThe ``str.format()`` method and the ``Formatter`` class share the same\nsyntax for format strings (although in the case of ``Formatter``,\nsubclasses can define their own format string syntax).\n\nFormat strings contain "replacement fields" surrounded by curly braces\n``{}``. Anything that is not contained in braces is considered literal\ntext, which is copied unchanged to the output. If you need to include\na brace character in the literal text, it can be escaped by doubling:\n``{{`` and ``}}``.\n\nThe grammar for a replacement field is as follows:\n\n replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"\n field_name ::= arg_name ("." attribute_name | "[" element_index "]")*\n arg_name ::= [identifier | integer]\n attribute_name ::= identifier\n element_index ::= integer | index_string\n index_string ::= <any source character except "]"> +\n conversion ::= "r" | "s" | "a"\n format_spec ::= <described in the next section>\n\nIn less formal terms, the replacement field can start with a\n*field_name* that specifies the object whose value is to be formatted\nand inserted into the output instead of the replacement field. The\n*field_name* is optionally followed by a *conversion* field, which is\npreceded by an exclamation point ``\'!\'``, and a *format_spec*, which\nis preceded by a colon ``\':\'``. These specify a non-default format\nfor the replacement value.\n\nSee also the *Format Specification Mini-Language* section.\n\nThe *field_name* itself begins with an *arg_name* that is either a\nnumber or a keyword. If it\'s a number, it refers to a positional\nargument, and if it\'s a keyword, it refers to a named keyword\nargument. If the numerical arg_names in a format string are 0, 1, 2,\n... in sequence, they can all be omitted (not just some) and the\nnumbers 0, 1, 2, ... will be automatically inserted in that order.\nBecause *arg_name* is not quote-delimited, it is not possible to\nspecify arbitrary dictionary keys (e.g., the strings ``\'10\'`` or\n``\':-]\'``) within a format string. The *arg_name* can be followed by\nany number of index or attribute expressions. An expression of the\nform ``\'.name\'`` selects the named attribute using ``getattr()``,\nwhile an expression of the form ``\'[index]\'`` does an index lookup\nusing ``__getitem__()``.\n\nChanged in version 3.1: The positional argument specifiers can be\nomitted, so ``\'{} {}\'`` is equivalent to ``\'{0} {1}\'``.\n\nSome simple format string examples:\n\n "First, thou shalt count to {0}" # References first positional argument\n "Bring me a {}" # Implicitly references the first positional argument\n "From {} to {}" # Same as "From {0} to {1}"\n "My quest is {name}" # References keyword argument \'name\'\n "Weight in tons {0.weight}" # \'weight\' attribute of first positional arg\n "Units destroyed: {players[0]}" # First element of keyword argument \'players\'.\n\nThe *conversion* field causes a type coercion before formatting.\nNormally, the job of formatting a value is done by the\n``__format__()`` method of the value itself. However, in some cases\nit is desirable to force a type to be formatted as a string,\noverriding its own definition of formatting. By converting the value\nto a string before calling ``__format__()``, the normal formatting\nlogic is bypassed.\n\nThree conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, ``\'!r\'`` which calls ``repr()`` and ``\'!a\'``\nwhich calls ``ascii()``.\n\nSome examples:\n\n "Harold\'s a clever {0!s}" # Calls str() on the argument first\n "Bring out the holy {name!r}" # Calls repr() on the argument first\n "More {!a}" # Calls ascii() on the argument first\n\nThe *format_spec* field contains a specification of how the value\nshould be presented, including such details as field width, alignment,\npadding, decimal precision and so on. Each value type can define its\nown "formatting mini-language" or interpretation of the *format_spec*.\n\nMost built-in types support a common formatting mini-language, which\nis described in the next section.\n\nA *format_spec* field can also include nested replacement fields\nwithin it. These nested replacement fields can contain only a field\nname; conversion flags and format specifications are not allowed. The\nreplacement fields within the format_spec are substituted before the\n*format_spec* string is interpreted. This allows the formatting of a\nvalue to be dynamically specified.\n\nSee the *Format examples* section for some examples.\n\n\nFormat Specification Mini-Language\n==================================\n\n"Format specifications" are used within replacement fields contained\nwithin a format string to define how individual values are presented\n(see *Format String Syntax*). They can also be passed directly to the\nbuilt-in ``format()`` function. Each formattable type may define how\nthe format specification is to be interpreted.\n\nMost built-in types implement the following options for format\nspecifications, although some of the formatting options are only\nsupported by the numeric types.\n\nA general convention is that an empty format string (``""``) produces\nthe same result as if you had called ``str()`` on the value. A non-\nempty format string typically modifies the result.\n\nThe general form of a *standard format specifier* is:\n\n format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]\n fill ::= <a character other than \'{\' or \'}\'>\n align ::= "<" | ">" | "=" | "^"\n sign ::= "+" | "-" | " "\n width ::= integer\n precision ::= integer\n type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"\n\nThe *fill* character can be any character other than \'{\' or \'}\'. The\npresence of a fill character is signaled by the character following\nit, which must be one of the alignment options. If the second\ncharacter of *format_spec* is not a valid alignment option, then it is\nassumed that both the fill character and the alignment option are\nabsent.\n\nThe meaning of the various alignment options is as follows:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'<\'`` | Forces the field to be left-aligned within the available |\n | | space (this is the default for most objects). |\n +-----------+------------------------------------------------------------+\n | ``\'>\'`` | Forces the field to be right-aligned within the available |\n | | space (this is the default for numbers). |\n +-----------+------------------------------------------------------------+\n | ``\'=\'`` | Forces the padding to be placed after the sign (if any) |\n | | but before the digits. This is used for printing fields |\n | | in the form \'+000000120\'. This alignment option is only |\n | | valid for numeric types. |\n +-----------+------------------------------------------------------------+\n | ``\'^\'`` | Forces the field to be centered within the available |\n | | space. |\n +-----------+------------------------------------------------------------+\n\nNote that unless a minimum field width is defined, the field width\nwill always be the same size as the data to fill it, so that the\nalignment option has no meaning in this case.\n\nThe *sign* option is only valid for number types, and can be one of\nthe following:\n\n +-----------+------------------------------------------------------------+\n | Option | Meaning |\n +===========+============================================================+\n | ``\'+\'`` | indicates that a sign should be used for both positive as |\n | | well as negative numbers. |\n +-----------+------------------------------------------------------------+\n | ``\'-\'`` | indicates that a sign should be used only for negative |\n | | numbers (this is the default behavior). |\n +-----------+------------------------------------------------------------+\n | space | indicates that a leading space should be used on positive |\n | | numbers, and a minus sign on negative numbers. |\n +-----------+------------------------------------------------------------+\n\nThe ``\'#\'`` option causes the "alternate form" to be used for the\nconversion. The alternate form is defined differently for different\ntypes. This option is only valid for integer, float, complex and\nDecimal types. For integers, when binary, octal, or hexadecimal output\nis used, this option adds the prefix respective ``\'0b\'``, ``\'0o\'``, or\n``\'0x\'`` to the output value. For floats, complex and Decimal the\nalternate form causes the result of the conversion to always contain a\ndecimal-point character, even if no digits follow it. Normally, a\ndecimal-point character appears in the result of these conversions\nonly if a digit follows it. In addition, for ``\'g\'`` and ``\'G\'``\nconversions, trailing zeros are not removed from the result.\n\nThe ``\',\'`` option signals the use of a comma for a thousands\nseparator. For a locale aware separator, use the ``\'n\'`` integer\npresentation type instead.\n\nChanged in version 3.1: Added the ``\',\'`` option (see also **PEP\n378**).\n\n*width* is a decimal integer defining the minimum field width. If not\nspecified, then the field width will be determined by the content.\n\nPreceding the *width* field by a zero (``\'0\'``) character enables\nsign-aware zero-padding for numeric types. This is equivalent to a\n*fill* character of ``\'0\'`` with an *alignment* type of ``\'=\'``.\n\nThe *precision* is a decimal number indicating how many digits should\nbe displayed after the decimal point for a floating point value\nformatted with ``\'f\'`` and ``\'F\'``, or before and after the decimal\npoint for a floating point value formatted with ``\'g\'`` or ``\'G\'``.\nFor non-number types the field indicates the maximum field size - in\nother words, how many characters will be used from the field content.\nThe *precision* is not allowed for integer values.\n\nFinally, the *type* determines how the data should be presented.\n\nThe available string presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'s\'`` | String format. This is the default type for strings and |\n | | may be omitted. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'s\'``. |\n +-----------+------------------------------------------------------------+\n\nThe available integer presentation types are:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'b\'`` | Binary format. Outputs the number in base 2. |\n +-----------+------------------------------------------------------------+\n | ``\'c\'`` | Character. Converts the integer to the corresponding |\n | | unicode character before printing. |\n +-----------+------------------------------------------------------------+\n | ``\'d\'`` | Decimal Integer. Outputs the number in base 10. |\n +-----------+------------------------------------------------------------+\n | ``\'o\'`` | Octal format. Outputs the number in base 8. |\n +-----------+------------------------------------------------------------+\n | ``\'x\'`` | Hex format. Outputs the number in base 16, using lower- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'X\'`` | Hex format. Outputs the number in base 16, using upper- |\n | | case letters for the digits above 9. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'d\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | None | The same as ``\'d\'``. |\n +-----------+------------------------------------------------------------+\n\nIn addition to the above presentation types, integers can be formatted\nwith the floating point presentation types listed below (except\n``\'n\'`` and None). When doing so, ``float()`` is used to convert the\ninteger to a floating point number before formatting.\n\nThe available presentation types for floating point and decimal values\nare:\n\n +-----------+------------------------------------------------------------+\n | Type | Meaning |\n +===========+============================================================+\n | ``\'e\'`` | Exponent notation. Prints the number in scientific |\n | | notation using the letter \'e\' to indicate the exponent. |\n +-----------+------------------------------------------------------------+\n | ``\'E\'`` | Exponent notation. Same as ``\'e\'`` except it uses an upper |\n | | case \'E\' as the separator character. |\n +-----------+------------------------------------------------------------+\n | ``\'f\'`` | Fixed point. Displays the number as a fixed-point number. |\n +-----------+------------------------------------------------------------+\n | ``\'F\'`` | Fixed point. Same as ``\'f\'``, but converts ``nan`` to |\n | | ``NAN`` and ``inf`` to ``INF``. |\n +-----------+------------------------------------------------------------+\n | ``\'g\'`` | General format. For a given precision ``p >= 1``, this |\n | | rounds the number to ``p`` significant digits and then |\n | | formats the result in either fixed-point format or in |\n | | scientific notation, depending on its magnitude. The |\n | | precise rules are as follows: suppose that the result |\n | | formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1`` would have exponent ``exp``. Then if ``-4 <= exp |\n | | < p``, the number is formatted with presentation type |\n | | ``\'f\'`` and precision ``p-1-exp``. Otherwise, the number |\n | | is formatted with presentation type ``\'e\'`` and precision |\n | | ``p-1``. In both cases insignificant trailing zeros are |\n | | removed from the significand, and the decimal point is |\n | | also removed if there are no remaining digits following |\n | | it. Positive and negative infinity, positive and negative |\n | | zero, and nans, are formatted as ``inf``, ``-inf``, ``0``, |\n | | ``-0`` and ``nan`` respectively, regardless of the |\n | | precision. A precision of ``0`` is treated as equivalent |\n | | to a precision of ``1``. |\n +-----------+------------------------------------------------------------+\n | ``\'G\'`` | General format. Same as ``\'g\'`` except switches to ``\'E\'`` |\n | | if the number gets too large. The representations of |\n | | infinity and NaN are uppercased, too. |\n +-----------+------------------------------------------------------------+\n | ``\'n\'`` | Number. This is the same as ``\'g\'``, except that it uses |\n | | the current locale setting to insert the appropriate |\n | | number separator characters. |\n +-----------+------------------------------------------------------------+\n | ``\'%\'`` | Percentage. Multiplies the number by 100 and displays in |\n | | fixed (``\'f\'``) format, followed by a percent sign. |\n +-----------+------------------------------------------------------------+\n | None | Similar to ``\'g\'``, except with at least one digit past |\n | | the decimal point and a default precision of 12. This is |\n | | intended to match ``str()``, except you can add the other |\n | | format modifiers. |\n +-----------+------------------------------------------------------------+\n\n\nFormat examples\n===============\n\nThis section contains examples of the new format syntax and comparison\nwith the old ``%``-formatting.\n\nIn most of the cases the syntax is similar to the old\n``%``-formatting, with the addition of the ``{}`` and with ``:`` used\ninstead of ``%``. For example, ``\'%03.2f\'`` can be translated to\n``\'{:03.2f}\'``.\n\nThe new format syntax also supports new and different options, shown\nin the follow examples.\n\nAccessing arguments by position:\n\n >>> \'{0}, {1}, {2}\'.format(\'a\', \'b\', \'c\')\n \'a, b, c\'\n >>> \'{}, {}, {}\'.format(\'a\', \'b\', \'c\') # 3.1+ only\n \'a, b, c\'\n >>> \'{2}, {1}, {0}\'.format(\'a\', \'b\', \'c\')\n \'c, b, a\'\n >>> \'{2}, {1}, {0}\'.format(*\'abc\') # unpacking argument sequence\n \'c, b, a\'\n >>> \'{0}{1}{0}\'.format(\'abra\', \'cad\') # arguments\' indices can be repeated\n \'abracadabra\'\n\nAccessing arguments by name:\n\n >>> \'Coordinates: {latitude}, {longitude}\'.format(latitude=\'37.24N\', longitude=\'-115.81W\')\n \'Coordinates: 37.24N, -115.81W\'\n >>> coord = {\'latitude\': \'37.24N\', \'longitude\': \'-115.81W\'}\n >>> \'Coordinates: {latitude}, {longitude}\'.format(**coord)\n \'Coordinates: 37.24N, -115.81W\'\n\nAccessing arguments\' attributes:\n\n >>> c = 3-5j\n >>> (\'The complex number {0} is formed from the real part {0.real} \'\n ... \'and the imaginary part {0.imag}.\').format(c)\n \'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.\'\n >>> class Point:\n ... def __init__(self, x, y):\n ... self.x, self.y = x, y\n ... def __str__(self):\n ... return \'Point({self.x}, {self.y})\'.format(self=self)\n ...\n >>> str(Point(4, 2))\n \'Point(4, 2)\'\n\nAccessing arguments\' items:\n\n >>> coord = (3, 5)\n >>> \'X: {0[0]}; Y: {0[1]}\'.format(coord)\n \'X: 3; Y: 5\'\n\nReplacing ``%s`` and ``%r``:\n\n >>> "repr() shows quotes: {!r}; str() doesn\'t: {!s}".format(\'test1\', \'test2\')\n "repr() shows quotes: \'test1\'; str() doesn\'t: test2"\n\nAligning the text and specifying a width:\n\n >>> \'{:<30}\'.format(\'left aligned\')\n \'left aligned \'\n >>> \'{:>30}\'.format(\'right aligned\')\n \' right aligned\'\n >>> \'{:^30}\'.format(\'centered\')\n \' centered \'\n >>> \'{:*^30}\'.format(\'centered\') # use \'*\' as a fill char\n \'***********centered***********\'\n\nReplacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign:\n\n >>> \'{:+f}; {:+f}\'.format(3.14, -3.14) # show it always\n \'+3.140000; -3.140000\'\n >>> \'{: f}; {: f}\'.format(3.14, -3.14) # show a space for positive numbers\n \' 3.140000; -3.140000\'\n >>> \'{:-f}; {:-f}\'.format(3.14, -3.14) # show only the minus -- same as \'{:f}; {:f}\'\n \'3.140000; -3.140000\'\n\nReplacing ``%x`` and ``%o`` and converting the value to different\nbases:\n\n >>> # format also supports binary numbers\n >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)\n \'int: 42; hex: 2a; oct: 52; bin: 101010\'\n >>> # with 0x, 0o, or 0b as prefix:\n >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)\n \'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010\'\n\nUsing the comma as a thousands separator:\n\n >>> \'{:,}\'.format(1234567890)\n \'1,234,567,890\'\n\nExpressing a percentage:\n\n >>> points = 19\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 86.36%\'\n\nUsing type-specific formatting:\n\n >>> import datetime\n >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)\n >>> \'{:%Y-%m-%d %H:%M:%S}\'.format(d)\n \'2010-07-04 12:15:58\'\n\nNesting arguments and more complex examples:\n\n >>> for align, text in zip(\'<^>\', [\'left\', \'center\', \'right\']):\n ... \'{0:{fill}{align}16}\'.format(text, fill=align, align=align)\n ...\n \'left<<<<<<<<<<<<\'\n \'^^^^^center^^^^^\'\n \'>>>>>>>>>>>right\'\n >>>\n >>> octets = [192, 168, 0, 1]\n >>> \'{:02X}{:02X}{:02X}{:02X}\'.format(*octets)\n \'C0A80001\'\n >>> int(_, 16)\n 3232235521\n >>>\n >>> width = 5\n >>> for num in range(5,12):\n ... for base in \'dXob\':\n ... print(\'{0:{width}{base}}\'.format(num, base=base, width=width), end=\' \')\n ... print()\n ...\n 5 5 5 101\n 6 6 6 110\n 7 7 7 111\n 8 8 10 1000\n 9 9 11 1001\n 10 A 12 1010\n 11 B 13 1011\n',
+ 'function': '\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" [parameter] ("," defparameter)*\n [, "**" parameter]\n | "**" parameter\n | defparameter [","] )\n parameter ::= identifier [":" expression]\n defparameter ::= parameter ["=" expression]\n funcname ::= identifier\n\nA function definition is an executable statement. Its execution binds\nthe function name in the current local namespace to a function object\n(a wrapper around the executable code for the function). This\nfunction object contains a reference to the current global namespace\nas the global namespace to be used when the function is called.\n\nThe function definition does not execute the function body; this gets\nexecuted only when the function is called. [3]\n\nA function definition may be wrapped by one or more *decorator*\nexpressions. Decorator expressions are evaluated when the function is\ndefined, in the scope that contains the function definition. The\nresult must be a callable, which is invoked with the function object\nas the only argument. The returned value is bound to the function name\ninstead of the function object. Multiple decorators are applied in\nnested fashion. For example, the following code\n\n @f1(arg)\n @f2\n def func(): pass\n\nis equivalent to\n\n def func(): pass\n func = f1(arg)(f2(func))\n\nWhen one or more parameters have the form *parameter* ``=``\n*expression*, the function is said to have "default parameter values."\nFor a parameter with a default value, the corresponding argument may\nbe omitted from a call, in which case the parameter\'s default value is\nsubstituted. If a parameter has a default value, all following\nparameters up until the "``*``" must also have a default value ---\nthis is a syntactic restriction that is not expressed by the grammar.\n\n**Default parameter values are evaluated when the function definition\nis executed.** This means that the expression is evaluated once, when\nthe function is defined, and that the same "pre-computed" value is\nused for each call. This is especially important to understand when a\ndefault parameter is a mutable object, such as a list or a dictionary:\nif the function modifies the object (e.g. by appending an item to a\nlist), the default value is in effect modified. This is generally not\nwhat was intended. A way around this is to use ``None`` as the\ndefault, and explicitly test for it in the body of the function, e.g.:\n\n def whats_on_the_telly(penguin=None):\n if penguin is None:\n penguin = []\n penguin.append("property of the zoo")\n return penguin\n\nFunction call semantics are described in more detail in section\n*Calls*. A function call always assigns values to all parameters\nmentioned in the parameter list, either from position arguments, from\nkeyword arguments, or from default values. If the form\n"``*identifier``" is present, it is initialized to a tuple receiving\nany excess positional parameters, defaulting to the empty tuple. If\nthe form "``**identifier``" is present, it is initialized to a new\ndictionary receiving any excess keyword arguments, defaulting to a new\nempty dictionary. Parameters after "``*``" or "``*identifier``" are\nkeyword-only parameters and may only be passed used keyword arguments.\n\nParameters may have annotations of the form "``: expression``"\nfollowing the parameter name. Any parameter may have an annotation\neven those of the form ``*identifier`` or ``**identifier``. Functions\nmay have "return" annotation of the form "``-> expression``" after the\nparameter list. These annotations can be any valid Python expression\nand are evaluated when the function definition is executed.\nAnnotations may be evaluated in a different order than they appear in\nthe source code. The presence of annotations does not change the\nsemantics of a function. The annotation values are available as\nvalues of a dictionary keyed by the parameters\' names in the\n``__annotations__`` attribute of the function object.\n\nIt is also possible to create anonymous functions (functions not bound\nto a name), for immediate use in expressions. This uses lambda forms,\ndescribed in section *Lambdas*. Note that the lambda form is merely a\nshorthand for a simplified function definition; a function defined in\na "``def``" statement can be passed around or assigned to another name\njust like a function defined by a lambda form. The "``def``" form is\nactually more powerful since it allows the execution of multiple\nstatements and annotations.\n\n**Programmer\'s note:** Functions are first-class objects. A "``def``"\nform executed inside a function definition defines a local function\nthat can be returned or passed around. Free variables used in the\nnested function can access the local variables of the function\ncontaining the def. See section *Naming and binding* for details.\n\nSee also:\n\n **PEP 3107** - Function Annotations\n The original specification for function annotations.\n',
'global': '\nThe ``global`` statement\n************************\n\n global_stmt ::= "global" identifier ("," identifier)*\n\nThe ``global`` statement is a declaration which holds for the entire\ncurrent code block. It means that the listed identifiers are to be\ninterpreted as globals. It would be impossible to assign to a global\nvariable without ``global``, although free variables may refer to\nglobals without being declared global.\n\nNames listed in a ``global`` statement must not be used in the same\ncode block textually preceding that ``global`` statement.\n\nNames listed in a ``global`` statement must not be defined as formal\nparameters or in a ``for`` loop control target, ``class`` definition,\nfunction definition, or ``import`` statement.\n\n**CPython implementation detail:** The current implementation does not\nenforce the latter two restrictions, but programs should not abuse\nthis freedom, as future implementations may enforce them or silently\nchange the meaning of the program.\n\n**Programmer\'s note:** the ``global`` is a directive to the parser.\nIt applies only to code parsed at the same time as the ``global``\nstatement. In particular, a ``global`` statement contained in a string\nor code object supplied to the built-in ``exec()`` function does not\naffect the code block *containing* the function call, and code\ncontained in such a string is unaffected by ``global`` statements in\nthe code containing the function call. The same applies to the\n``eval()`` and ``compile()`` functions.\n',
'id-classes': '\nReserved classes of identifiers\n*******************************\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n',
'identifiers': '\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions.\n\nThe syntax of identifiers in Python is based on the Unicode standard\nannex UAX-31, with elaboration and changes as defined below; see also\n**PEP 3131** for further details.\n\nWithin the ASCII range (U+0001..U+007F), the valid characters for\nidentifiers are the same as in Python 2.x: the uppercase and lowercase\nletters ``A`` through ``Z``, the underscore ``_`` and, except for the\nfirst character, the digits ``0`` through ``9``.\n\nPython 3.0 introduces additional characters from outside the ASCII\nrange (see **PEP 3131**). For these characters, the classification\nuses the version of the Unicode Character Database as included in the\n``unicodedata`` module.\n\nIdentifiers are unlimited in length. Case is significant.\n\n identifier ::= xid_start xid_continue*\n id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property>\n id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property>\n xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*">\n xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*">\n\nThe Unicode category codes mentioned above stand for:\n\n* *Lu* - uppercase letters\n\n* *Ll* - lowercase letters\n\n* *Lt* - titlecase letters\n\n* *Lm* - modifier letters\n\n* *Lo* - other letters\n\n* *Nl* - letter numbers\n\n* *Mn* - nonspacing marks\n\n* *Mc* - spacing combining marks\n\n* *Nd* - decimal numbers\n\n* *Pc* - connector punctuations\n\n* *Other_ID_Start* - explicit list of characters in PropList.txt to\n support backwards compatibility\n\n* *Other_ID_Continue* - likewise\n\nAll identifiers are converted into the normal form NFKC while parsing;\ncomparison of identifiers is based on NFKC.\n\nA non-normative HTML file listing all valid identifier characters for\nUnicode 4.1 can be found at http://www.dcl.hpi.uni-\npotsdam.de/home/loewis/table-3131.html.\n\n\nKeywords\n========\n\nThe following identifiers are used as reserved words, or *keywords* of\nthe language, and cannot be used as ordinary identifiers. They must\nbe spelled exactly as written here:\n\n False class finally is return\n None continue for lambda try\n True def from nonlocal while\n and del global not with\n as elif if or yield\n assert else import pass\n break except in raise\n\n\nReserved classes of identifiers\n===============================\n\nCertain classes of identifiers (besides keywords) have special\nmeanings. These classes are identified by the patterns of leading and\ntrailing underscore characters:\n\n``_*``\n Not imported by ``from module import *``. The special identifier\n ``_`` is used in the interactive interpreter to store the result of\n the last evaluation; it is stored in the ``builtins`` module. When\n not in interactive mode, ``_`` has no special meaning and is not\n defined. See section *The import statement*.\n\n Note: The name ``_`` is often used in conjunction with\n internationalization; refer to the documentation for the\n ``gettext`` module for more information on this convention.\n\n``__*__``\n System-defined names. These names are defined by the interpreter\n and its implementation (including the standard library). Current\n system names are discussed in the *Special method names* section\n and elsewhere. More will likely be defined in future versions of\n Python. *Any* use of ``__*__`` names, in any context, that does\n not follow explicitly documented use, is subject to breakage\n without warning.\n\n``__*``\n Class-private names. Names in this category, when used within the\n context of a class definition, are re-written to use a mangled form\n to help avoid name clashes between "private" attributes of base and\n derived classes. See section *Identifiers (Names)*.\n',
'if': '\nThe ``if`` statement\n********************\n\nThe ``if`` statement is used for conditional execution:\n\n if_stmt ::= "if" expression ":" suite\n ( "elif" expression ":" suite )*\n ["else" ":" suite]\n\nIt selects exactly one of the suites by evaluating the expressions one\nby one until one is found to be true (see section *Boolean operations*\nfor the definition of true and false); then that suite is executed\n(and no other part of the ``if`` statement is executed or evaluated).\nIf all expressions are false, the suite of the ``else`` clause, if\npresent, is executed.\n',
'imaginary': '\nImaginary literals\n******************\n\nImaginary literals are described by the following lexical definitions:\n\n imagnumber ::= (floatnumber | intpart) ("j" | "J")\n\nAn imaginary literal yields a complex number with a real part of 0.0.\nComplex numbers are represented as a pair of floating point numbers\nand have the same restrictions on their range. To create a complex\nnumber with a nonzero real part, add a floating point number to it,\ne.g., ``(3+4j)``. Some examples of imaginary literals:\n\n 3.14j 10.j 10j .001j 1e100j 3.14e-10j\n',
- 'import': '\nThe ``import`` statement\n************************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nImport statements are executed in two steps: (1) find a module, and\ninitialize it if necessary; (2) define a name or names in the local\nnamespace (of the scope where the ``import`` statement occurs). The\nstatement comes in two forms differing on whether it uses the ``from``\nkeyword. The first form (without ``from``) repeats these steps for\neach identifier in the list. The form with ``from`` performs step (1)\nonce, and then performs step (2) repeatedly. For a reference\nimplementation of step (1), see the ``importlib`` module.\n\nTo understand how step (1) occurs, one must first understand how\nPython handles hierarchical naming of modules. To help organize\nmodules and provide a hierarchy in naming, Python has a concept of\npackages. A package can contain other packages and modules while\nmodules cannot contain other modules or packages. From a file system\nperspective, packages are directories and modules are files. The\noriginal specification for packages is still available to read,\nalthough minor details have changed since the writing of that\ndocument.\n\nOnce the name of the module is known (unless otherwise specified, the\nterm "module" will refer to both packages and modules), searching for\nthe module or package can begin. The first place checked is\n``sys.modules``, the cache of all modules that have been imported\npreviously. If the module is found there then it is used in step (2)\nof import unless ``None`` is found in ``sys.modules``, in which case\n``ImportError`` is raised.\n\nIf the module is not found in the cache, then ``sys.meta_path`` is\nsearched (the specification for ``sys.meta_path`` can be found in\n**PEP 302**). The object is a list of *finder* objects which are\nqueried in order as to whether they know how to load the module by\ncalling their ``find_module()`` method with the name of the module. If\nthe module happens to be contained within a package (as denoted by the\nexistence of a dot in the name), then a second argument to\n``find_module()`` is given as the value of the ``__path__`` attribute\nfrom the parent package (everything up to the last dot in the name of\nthe module being imported). If a finder can find the module it returns\na *loader* (discussed later) or returns ``None``.\n\nIf none of the finders on ``sys.meta_path`` are able to find the\nmodule then some implicitly defined finders are queried.\nImplementations of Python vary in what implicit meta path finders are\ndefined. The one they all do define, though, is one that handles\n``sys.path_hooks``, ``sys.path_importer_cache``, and ``sys.path``.\n\nThe implicit finder searches for the requested module in the "paths"\nspecified in one of two places ("paths" do not have to be file system\npaths). If the module being imported is supposed to be contained\nwithin a package then the second argument passed to ``find_module()``,\n``__path__`` on the parent package, is used as the source of paths. If\nthe module is not contained in a package then ``sys.path`` is used as\nthe source of paths.\n\nOnce the source of paths is chosen it is iterated over to find a\nfinder that can handle that path. The dict at\n``sys.path_importer_cache`` caches finders for paths and is checked\nfor a finder. If the path does not have a finder cached then\n``sys.path_hooks`` is searched by calling each object in the list with\na single argument of the path, returning a finder or raises\n``ImportError``. If a finder is returned then it is cached in\n``sys.path_importer_cache`` and then used for that path entry. If no\nfinder can be found but the path exists then a value of ``None`` is\nstored in ``sys.path_importer_cache`` to signify that an implicit,\nfile-based finder that handles modules stored as individual files\nshould be used for that path. If the path does not exist then a finder\nwhich always returns ``None`` is placed in the cache for the path.\n\nIf no finder can find the module then ``ImportError`` is raised.\nOtherwise some finder returned a loader whose ``load_module()`` method\nis called with the name of the module to load (see **PEP 302** for the\noriginal definition of loaders). A loader has several responsibilities\nto perform on a module it loads. First, if the module already exists\nin ``sys.modules`` (a possibility if the loader is called outside of\nthe import machinery) then it is to use that module for initialization\nand not a new module. But if the module does not exist in\n``sys.modules`` then it is to be added to that dict before\ninitialization begins. If an error occurs during loading of the module\nand it was added to ``sys.modules`` it is to be removed from the dict.\nIf an error occurs but the module was already in ``sys.modules`` it is\nleft in the dict.\n\nThe loader must set several attributes on the module. ``__name__`` is\nto be set to the name of the module. ``__file__`` is to be the "path"\nto the file unless the module is built-in (and thus listed in\n``sys.builtin_module_names``) in which case the attribute is not set.\nIf what is being imported is a package then ``__path__`` is to be set\nto a list of paths to be searched when looking for modules and\npackages contained within the package being imported. ``__package__``\nis optional but should be set to the name of package that contains the\nmodule or package (the empty string is used for module not contained\nin a package). ``__loader__`` is also optional but should be set to\nthe loader object that is loading the module.\n\nIf an error occurs during loading then the loader raises\n``ImportError`` if some other exception is not already being\npropagated. Otherwise the loader returns the module that was loaded\nand initialized.\n\nWhen step (1) finishes without raising an exception, step (2) can\nbegin.\n\nThe first form of ``import`` statement binds the module name in the\nlocal namespace to the module object, and then goes on to import the\nnext identifier, if any. If the module name is followed by ``as``,\nthe name following ``as`` is used as the local name for the module.\n\nThe ``from`` form does not bind the module name: it goes through the\nlist of identifiers, looks each one of them up in the module found in\nstep (1), and binds the name in the local namespace to the object thus\nfound. As with the first form of ``import``, an alternate local name\ncan be supplied by specifying "``as`` localname". If a name is not\nfound, ``ImportError`` is raised. If the list of identifiers is\nreplaced by a star (``\'*\'``), all public names defined in the module\nare bound in the local namespace of the ``import`` statement.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope. The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python. The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language. It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``. They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement. This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n **PEP 236** - Back to the __future__\n The original proposal for the __future__ mechanism.\n',
+ 'import': '\nThe ``import`` statement\n************************\n\n import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*\n | "from" relative_module "import" identifier ["as" name]\n ( "," identifier ["as" name] )*\n | "from" relative_module "import" "(" identifier ["as" name]\n ( "," identifier ["as" name] )* [","] ")"\n | "from" module "import" "*"\n module ::= (identifier ".")* identifier\n relative_module ::= "."* module | "."+\n name ::= identifier\n\nThe basic import statement (no ``from`` clause) is executed in two\nsteps:\n\n1. find a module, loading and initializing it if necessary\n\n2. define a name or names in the local namespace for the scope where\n the ``import`` statement occurs.\n\nWhen the statement contains multiple clauses (separated by commas) the\ntwo steps are carried out separately for each clause, just as though\nthe clauses had been separated out into individiual import statements.\n\nThe details of the first step, finding and loading modules is\ndescribed in greater detail in the section on the *import system*,\nwhich also describes the various types of packages and modules that\ncan be imported, as well as all the hooks that can be used to\ncustomize the import system. Note that failures in this step may\nindicate either that the module could not be located, *or* that an\nerror occurred while initializing the module, which includes execution\nof the module\'s code.\n\nIf the requested module is retrieved successfully, it will be made\navailable in the local namespace in one of three ways:\n\n* If the module name is followed by ``as``, then the name following\n ``as`` is bound directly to the imported module.\n\n* If no other name is specified, and the module being imported is a\n top level module, the module\'s name is bound in the local namespace\n as a reference to the imported module\n\n* If the module being imported is *not* a top level module, then the\n name of the top level package that contains the module is bound in\n the local namespace as a reference to the top level package. The\n imported module must be accessed using its full qualified name\n rather than directly\n\nThe ``from`` form uses a slightly more complex process:\n\n1. find the module specified in the ``from`` clause loading and\n initializing it if necessary;\n\n2. for each of the identifiers specified in the ``import`` clauses:\n\n 1. check if the imported module has an attribute by that name\n\n 2. if not, attempt to import a submodule with that name and then\n check the imported module again for that attribute\n\n 3. if the attribute is not found, ``ImportError`` is raised.\n\n 4. otherwise, a reference to that value is bound in the local\n namespace, using the name in the ``as`` clause if it is present,\n otherwise using the attribute name\n\nExamples:\n\n import foo # foo imported and bound locally\n import foo.bar.baz # foo.bar.baz imported, foo bound locally\n import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb\n from foo.bar import baz # foo.bar.baz imported and bound as baz\n from foo import attr # foo imported and foo.attr bound as attr\n\nIf the list of identifiers is replaced by a star (``\'*\'``), all public\nnames defined in the module are bound in the local namespace for the\nscope where the ``import`` statement occurs.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope.\nAttempting to use it in class or function definitions will raise a\n``SyntaxError``.\n\nThe *public names* defined by a module are determined by checking the\nmodule\'s namespace for a variable named ``__all__``; if defined, it\nmust be a sequence of strings which are names defined or imported by\nthat module. The names given in ``__all__`` are all considered public\nand are required to exist. If ``__all__`` is not defined, the set of\npublic names includes all names found in the module\'s namespace which\ndo not begin with an underscore character (``\'_\'``). ``__all__``\nshould contain the entire public API. It is intended to avoid\naccidentally exporting items that are not part of the API (such as\nlibrary modules which were imported and used within the module).\n\nThe ``from`` form with ``*`` may only occur in a module scope. The\nwild card form of import --- ``import *`` --- is only allowed at the\nmodule level. Attempting to use it in class or function definitions\nwill raise a ``SyntaxError``.\n\nWhen specifying what module to import you do not have to specify the\nabsolute name of the module. When a module or package is contained\nwithin another package it is possible to make a relative import within\nthe same top package without having to mention the package name. By\nusing leading dots in the specified module or package after ``from``\nyou can specify how high to traverse up the current package hierarchy\nwithout specifying exact names. One leading dot means the current\npackage where the module making the import exists. Two dots means up\none package level. Three dots is up two levels, etc. So if you execute\n``from . import mod`` from a module in the ``pkg`` package then you\nwill end up importing ``pkg.mod``. If you execute ``from ..subpkg2\nimport mod`` from within ``pkg.subpkg1`` you will import\n``pkg.subpkg2.mod``. The specification for relative imports is\ncontained within **PEP 328**.\n\n``importlib.import_module()`` is provided to support applications that\ndetermine which modules need to be loaded dynamically.\n\n\nFuture statements\n=================\n\nA *future statement* is a directive to the compiler that a particular\nmodule should be compiled using syntax or semantics that will be\navailable in a specified future release of Python. The future\nstatement is intended to ease migration to future versions of Python\nthat introduce incompatible changes to the language. It allows use of\nthe new features on a per-module basis before the release in which the\nfeature becomes standard.\n\n future_statement ::= "from" "__future__" "import" feature ["as" name]\n ("," feature ["as" name])*\n | "from" "__future__" "import" "(" feature ["as" name]\n ("," feature ["as" name])* [","] ")"\n feature ::= identifier\n name ::= identifier\n\nA future statement must appear near the top of the module. The only\nlines that can appear before a future statement are:\n\n* the module docstring (if any),\n\n* comments,\n\n* blank lines, and\n\n* other future statements.\n\nThe features recognized by Python 3.0 are ``absolute_import``,\n``division``, ``generators``, ``unicode_literals``,\n``print_function``, ``nested_scopes`` and ``with_statement``. They\nare all redundant because they are always enabled, and only kept for\nbackwards compatibility.\n\nA future statement is recognized and treated specially at compile\ntime: Changes to the semantics of core constructs are often\nimplemented by generating different code. It may even be the case\nthat a new feature introduces new incompatible syntax (such as a new\nreserved word), in which case the compiler may need to parse the\nmodule differently. Such decisions cannot be pushed off until\nruntime.\n\nFor any given release, the compiler knows which feature names have\nbeen defined, and raises a compile-time error if a future statement\ncontains a feature not known to it.\n\nThe direct runtime semantics are the same as for any import statement:\nthere is a standard module ``__future__``, described later, and it\nwill be imported in the usual way at the time the future statement is\nexecuted.\n\nThe interesting runtime semantics depend on the specific feature\nenabled by the future statement.\n\nNote that there is nothing special about the statement:\n\n import __future__ [as name]\n\nThat is not a future statement; it\'s an ordinary import statement with\nno special semantics or syntax restrictions.\n\nCode compiled by calls to the built-in functions ``exec()`` and\n``compile()`` that occur in a module ``M`` containing a future\nstatement will, by default, use the new syntax or semantics associated\nwith the future statement. This can be controlled by optional\narguments to ``compile()`` --- see the documentation of that function\nfor details.\n\nA future statement typed at an interactive interpreter prompt will\ntake effect for the rest of the interpreter session. If an\ninterpreter is started with the *-i* option, is passed a script name\nto execute, and the script includes a future statement, it will be in\neffect in the interactive session started after the script is\nexecuted.\n\nSee also:\n\n **PEP 236** - Back to the __future__\n The original proposal for the __future__ mechanism.\n',
'in': '\nComparisons\n***********\n\nUnlike C, all comparison operations in Python have the same priority,\nwhich is lower than that of any arithmetic, shifting or bitwise\noperation. Also unlike C, expressions like ``a < b < c`` have the\ninterpretation that is conventional in mathematics:\n\n comparison ::= or_expr ( comp_operator or_expr )*\n comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="\n | "is" ["not"] | ["not"] "in"\n\nComparisons yield boolean values: ``True`` or ``False``.\n\nComparisons can be chained arbitrarily, e.g., ``x < y <= z`` is\nequivalent to ``x < y and y <= z``, except that ``y`` is evaluated\nonly once (but in both cases ``z`` is not evaluated at all when ``x <\ny`` is found to be false).\n\nFormally, if *a*, *b*, *c*, ..., *y*, *z* are expressions and *op1*,\n*op2*, ..., *opN* are comparison operators, then ``a op1 b op2 c ... y\nopN z`` is equivalent to ``a op1 b and b op2 c and ... y opN z``,\nexcept that each expression is evaluated at most once.\n\nNote that ``a op1 b op2 c`` doesn\'t imply any kind of comparison\nbetween *a* and *c*, so that, e.g., ``x < y > z`` is perfectly legal\n(though perhaps not pretty).\n\nThe operators ``<``, ``>``, ``==``, ``>=``, ``<=``, and ``!=`` compare\nthe values of two objects. The objects need not have the same type.\nIf both are numbers, they are converted to a common type. Otherwise,\nthe ``==`` and ``!=`` operators *always* consider objects of different\ntypes to be unequal, while the ``<``, ``>``, ``>=`` and ``<=``\noperators raise a ``TypeError`` when comparing objects of different\ntypes that do not implement these operators for the given pair of\ntypes. You can control comparison behavior of objects of non-built-in\ntypes by defining rich comparison methods like ``__gt__()``, described\nin section *Basic customization*.\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* The values ``float(\'NaN\')`` and ``Decimal(\'NaN\')`` are special. The\n are identical to themselves, ``x is x`` but are not equal to\n themselves, ``x != x``. Additionally, comparing any value to a\n not-a-number value will return ``False``. For example, both ``3 <\n float(\'NaN\')`` and ``float(\'NaN\') < 3`` will return ``False``.\n\n* Bytes objects are compared lexicographically using the numeric\n values of their elements.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n [3] String and bytes object can\'t be compared!\n\n* Tuples and lists are compared lexicographically using comparison of\n corresponding elements. This means that to compare equal, each\n element must compare equal and the two sequences must be of the same\n type and have the same length.\n\n If not equal, the sequences are ordered the same as their first\n differing elements. For example, ``[1,2,x] <= [1,2,y]`` has the\n same value as ``x <= y``. If the corresponding element does not\n exist, the shorter sequence is ordered first (for example, ``[1,2] <\n [1,2,3]``).\n\n* Mappings (dictionaries) compare equal if and only if they have the\n same ``(key, value)`` pairs. Order comparisons ``(\'<\', \'<=\', \'>=\',\n \'>\')`` raise ``TypeError``.\n\n* Sets and frozensets define comparison operators to mean subset and\n superset tests. Those relations do not define total orderings (the\n two sets ``{1,2}`` and {2,3} are not equal, nor subsets of one\n another, nor supersets of one another). Accordingly, sets are not\n appropriate arguments for functions which depend on total ordering.\n For example, ``min()``, ``max()``, and ``sorted()`` produce\n undefined results given a list of sets as inputs.\n\n* Most other objects of built-in types compare unequal unless they are\n the same object; the choice whether one object is considered smaller\n or larger than another one is made arbitrarily but consistently\n within one execution of a program.\n\nComparison of objects of the differing types depends on whether either\nof the types provide explicit support for the comparison. Most\nnumeric types can be compared with one another, but comparisons of\n``float`` and ``Decimal`` are not supported to avoid the inevitable\nconfusion arising from representation issues such as ``float(\'1.1\')``\nbeing inexactly represented and therefore not exactly equal to\n``Decimal(\'1.1\')`` which is. When cross-type comparison is not\nsupported, the comparison method returns ``NotImplemented``. This can\ncreate the illusion of non-transitivity between supported cross-type\ncomparisons and unsupported comparisons. For example, ``Decimal(2) ==\n2`` and ``2 == float(2)`` but ``Decimal(2) != float(2)``.\n\nThe operators ``in`` and ``not in`` test for membership. ``x in s``\nevaluates to true if *x* is a member of *s*, and false otherwise. ``x\nnot in s`` returns the negation of ``x in s``. All built-in sequences\nand set types support this as well as dictionary, for which ``in``\ntests whether a the dictionary has a given key. For container types\nsuch as list, tuple, set, frozenset, dict, or collections.deque, the\nexpression ``x in y`` is equivalent to ``any(x is e or x == e for e in\ny)``.\n\nFor the string and bytes types, ``x in y`` is true if and only if *x*\nis a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nEmpty strings are always considered to be a substring of any other\nstring, so ``"" in "abc"`` will return ``True``.\n\nFor user-defined classes which define the ``__contains__()`` method,\n``x in y`` is true if and only if ``y.__contains__(x)`` is true.\n\nFor user-defined classes which do not define ``__contains__()`` but do\ndefine ``__iter__()``, ``x in y`` is true if some value ``z`` with ``x\n== z`` is produced while iterating over ``y``. If an exception is\nraised during the iteration, it is as if ``in`` raised that exception.\n\nLastly, the old-style iteration protocol is tried: if a class defines\n``__getitem__()``, ``x in y`` is true if and only if there is a non-\nnegative integer index *i* such that ``x == y[i]``, and all lower\ninteger indices do not raise ``IndexError`` exception. (If any other\nexception is raised, it is as if ``in`` raised that exception).\n\nThe operator ``not in`` is defined to have the inverse true value of\n``in``.\n\nThe operators ``is`` and ``is not`` test for object identity: ``x is\ny`` is true if and only if *x* and *y* are the same object. ``x is\nnot y`` yields the inverse truth value. [4]\n',
'integers': '\nInteger literals\n****************\n\nInteger literals are described by the following lexical definitions:\n\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"+\n nonzerodigit ::= "1"..."9"\n digit ::= "0"..."9"\n octinteger ::= "0" ("o" | "O") octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n octdigit ::= "0"..."7"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n bindigit ::= "0" | "1"\n\nThere is no limit for the length of integer literals apart from what\ncan be stored in available memory.\n\nNote that leading zeros in a non-zero decimal number are not allowed.\nThis is for disambiguation with C-style octal literals, which Python\nused before version 3.0.\n\nSome examples of integer literals:\n\n 7 2147483647 0o177 0b100110111\n 3 79228162514264337593543950336 0o377 0x100000000\n 79228162514264337593543950336 0xdeadbeef\n',
'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n lambda_form_nocond ::= "lambda" [parameter_list]: expression_nocond\n\nLambda forms (lambda expressions) have the same syntactic position as\nexpressions. They are a shorthand to create anonymous functions; the\nexpression ``lambda arguments: expression`` yields a function object.\nThe unnamed object behaves like a function object defined with\n\n def <lambda>(arguments):\n return expression\n\nSee section *Function definitions* for the syntax of parameter lists.\nNote that functions created with lambda forms cannot contain\nstatements or annotations.\n',
@@ -49,30 +50,30 @@ topics = {'assert': '\nThe ``assert`` statement\n************************\n\nAss
'nonlocal': '\nThe ``nonlocal`` statement\n**************************\n\n nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n\nThe ``nonlocal`` statement causes the listed identifiers to refer to\npreviously bound variables in the nearest enclosing scope. This is\nimportant because the default behavior for binding is to search the\nlocal namespace first. The statement allows encapsulated code to\nrebind variables outside of the local scope besides the global\n(module) scope.\n\nNames listed in a ``nonlocal`` statement, unlike to those listed in a\n``global`` statement, must refer to pre-existing bindings in an\nenclosing scope (the scope in which a new binding should be created\ncannot be determined unambiguously).\n\nNames listed in a ``nonlocal`` statement must not collide with pre-\nexisting bindings in the local scope.\n\nSee also:\n\n **PEP 3104** - Access to Names in Outer Scopes\n The specification for the ``nonlocal`` statement.\n',
'numbers': "\nNumeric literals\n****************\n\nThere are three types of numeric literals: integers, floating point\nnumbers, and imaginary numbers. There are no complex literals\n(complex numbers can be formed by adding a real number and an\nimaginary number).\n\nNote that numeric literals do not include a sign; a phrase like ``-1``\nis actually an expression composed of the unary operator '``-``' and\nthe literal ``1``.\n",
'numeric-types': "\nEmulating numeric types\n***********************\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand's type is a subclass of the left operand's\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand's\n non-reflected method. This behavior allows subclasses to\n override their ancestors' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n",
- 'objects': '\nObjects, values and types\n*************************\n\n*Objects* are Python\'s abstraction for data. All data in a Python\nprogram is represented by objects or by relations between objects. (In\na sense, and in conformance to Von Neumann\'s model of a "stored\nprogram computer," code is also represented by objects.)\n\nEvery object has an identity, a type and a value. An object\'s\n*identity* never changes once it has been created; you may think of it\nas the object\'s address in memory. The \'``is``\' operator compares the\nidentity of two objects; the ``id()`` function returns an integer\nrepresenting its identity (currently implemented as its address). An\nobject\'s *type* is also unchangeable. [1] An object\'s type determines\nthe operations that the object supports (e.g., "does it have a\nlength?") and also defines the possible values for objects of that\ntype. The ``type()`` function returns an object\'s type (which is an\nobject itself). The *value* of some objects can change. Objects\nwhose value can change are said to be *mutable*; objects whose value\nis unchangeable once they are created are called *immutable*. (The\nvalue of an immutable container object that contains a reference to a\nmutable object can change when the latter\'s value is changed; however\nthe container is still considered immutable, because the collection of\nobjects it contains cannot be changed. So, immutability is not\nstrictly the same as having an unchangeable value, it is more subtle.)\nAn object\'s mutability is determined by its type; for instance,\nnumbers, strings and tuples are immutable, while dictionaries and\nlists are mutable.\n\nObjects are never explicitly destroyed; however, when they become\nunreachable they may be garbage-collected. An implementation is\nallowed to postpone garbage collection or omit it altogether --- it is\na matter of implementation quality how garbage collection is\nimplemented, as long as no objects are collected that are still\nreachable.\n\n**CPython implementation detail:** CPython currently uses a reference-\ncounting scheme with (optional) delayed detection of cyclically linked\ngarbage, which collects most objects as soon as they become\nunreachable, but is not guaranteed to collect garbage containing\ncircular references. See the documentation of the ``gc`` module for\ninformation on controlling the collection of cyclic garbage. Other\nimplementations act differently and CPython may change. Do not depend\non immediate finalization of objects when they become unreachable (ex:\nalways close files).\n\nNote that the use of the implementation\'s tracing or debugging\nfacilities may keep objects alive that would normally be collectable.\nAlso note that catching an exception with a \'``try``...``except``\'\nstatement may keep objects alive.\n\nSome objects contain references to "external" resources such as open\nfiles or windows. It is understood that these resources are freed\nwhen the object is garbage-collected, but since garbage collection is\nnot guaranteed to happen, such objects also provide an explicit way to\nrelease the external resource, usually a ``close()`` method. Programs\nare strongly recommended to explicitly close such objects. The\n\'``try``...``finally``\' statement and the \'``with``\' statement provide\nconvenient ways to do this.\n\nSome objects contain references to other objects; these are called\n*containers*. Examples of containers are tuples, lists and\ndictionaries. The references are part of a container\'s value. In\nmost cases, when we talk about the value of a container, we imply the\nvalues, not the identities of the contained objects; however, when we\ntalk about the mutability of a container, only the identities of the\nimmediately contained objects are implied. So, if an immutable\ncontainer (like a tuple) contains a reference to a mutable object, its\nvalue changes if that mutable object is changed.\n\nTypes affect almost all aspects of object behavior. Even the\nimportance of object identity is affected in some sense: for immutable\ntypes, operations that compute new values may actually return a\nreference to any existing object with the same type and value, while\nfor mutable objects this is not allowed. E.g., after ``a = 1; b =\n1``, ``a`` and ``b`` may or may not refer to the same object with the\nvalue one, depending on the implementation, but after ``c = []; d =\n[]``, ``c`` and ``d`` are guaranteed to refer to two different,\nunique, newly created empty lists. (Note that ``c = d = []`` assigns\nthe same object to both ``c`` and ``d``.)\n',
+ 'objects': '\nObjects, values and types\n*************************\n\n*Objects* are Python\'s abstraction for data. All data in a Python\nprogram is represented by objects or by relations between objects. (In\na sense, and in conformance to Von Neumann\'s model of a "stored\nprogram computer," code is also represented by objects.)\n\nEvery object has an identity, a type and a value. An object\'s\n*identity* never changes once it has been created; you may think of it\nas the object\'s address in memory. The \'``is``\' operator compares the\nidentity of two objects; the ``id()`` function returns an integer\nrepresenting its identity.\n\n**CPython implementation detail:** For CPython, ``id(x)`` is the\nmemory address where ``x`` is stored.\n\nAn object\'s type determines the operations that the object supports\n(e.g., "does it have a length?") and also defines the possible values\nfor objects of that type. The ``type()`` function returns an object\'s\ntype (which is an object itself). Like its identity, an object\'s\n*type* is also unchangeable. [1]\n\nThe *value* of some objects can change. Objects whose value can\nchange are said to be *mutable*; objects whose value is unchangeable\nonce they are created are called *immutable*. (The value of an\nimmutable container object that contains a reference to a mutable\nobject can change when the latter\'s value is changed; however the\ncontainer is still considered immutable, because the collection of\nobjects it contains cannot be changed. So, immutability is not\nstrictly the same as having an unchangeable value, it is more subtle.)\nAn object\'s mutability is determined by its type; for instance,\nnumbers, strings and tuples are immutable, while dictionaries and\nlists are mutable.\n\nObjects are never explicitly destroyed; however, when they become\nunreachable they may be garbage-collected. An implementation is\nallowed to postpone garbage collection or omit it altogether --- it is\na matter of implementation quality how garbage collection is\nimplemented, as long as no objects are collected that are still\nreachable.\n\n**CPython implementation detail:** CPython currently uses a reference-\ncounting scheme with (optional) delayed detection of cyclically linked\ngarbage, which collects most objects as soon as they become\nunreachable, but is not guaranteed to collect garbage containing\ncircular references. See the documentation of the ``gc`` module for\ninformation on controlling the collection of cyclic garbage. Other\nimplementations act differently and CPython may change. Do not depend\non immediate finalization of objects when they become unreachable (ex:\nalways close files).\n\nNote that the use of the implementation\'s tracing or debugging\nfacilities may keep objects alive that would normally be collectable.\nAlso note that catching an exception with a \'``try``...``except``\'\nstatement may keep objects alive.\n\nSome objects contain references to "external" resources such as open\nfiles or windows. It is understood that these resources are freed\nwhen the object is garbage-collected, but since garbage collection is\nnot guaranteed to happen, such objects also provide an explicit way to\nrelease the external resource, usually a ``close()`` method. Programs\nare strongly recommended to explicitly close such objects. The\n\'``try``...``finally``\' statement and the \'``with``\' statement provide\nconvenient ways to do this.\n\nSome objects contain references to other objects; these are called\n*containers*. Examples of containers are tuples, lists and\ndictionaries. The references are part of a container\'s value. In\nmost cases, when we talk about the value of a container, we imply the\nvalues, not the identities of the contained objects; however, when we\ntalk about the mutability of a container, only the identities of the\nimmediately contained objects are implied. So, if an immutable\ncontainer (like a tuple) contains a reference to a mutable object, its\nvalue changes if that mutable object is changed.\n\nTypes affect almost all aspects of object behavior. Even the\nimportance of object identity is affected in some sense: for immutable\ntypes, operations that compute new values may actually return a\nreference to any existing object with the same type and value, while\nfor mutable objects this is not allowed. E.g., after ``a = 1; b =\n1``, ``a`` and ``b`` may or may not refer to the same object with the\nvalue one, depending on the implementation, but after ``c = []; d =\n[]``, ``c`` and ``d`` are guaranteed to refer to two different,\nunique, newly created empty lists. (Note that ``c = d = []`` assigns\nthe same object to both ``c`` and ``d``.)\n',
'operator-summary': '\nSummary\n*******\n\nThe following table summarizes the operator precedences in Python,\nfrom lowest precedence (least binding) to highest precedence (most\nbinding). Operators in the same box have the same precedence. Unless\nthe syntax is explicitly given, operators are binary. Operators in\nthe same box group left to right (except for comparisons, including\ntests, which all have the same precedence and chain from left to right\n--- see section *Comparisons* --- and exponentiation, which groups\nfrom right to left).\n\n+-------------------------------------------------+---------------------------------------+\n| Operator | Description |\n+=================================================+=======================================+\n| ``lambda`` | Lambda expression |\n+-------------------------------------------------+---------------------------------------+\n| ``if`` -- ``else`` | Conditional expression |\n+-------------------------------------------------+---------------------------------------+\n| ``or`` | Boolean OR |\n+-------------------------------------------------+---------------------------------------+\n| ``and`` | Boolean AND |\n+-------------------------------------------------+---------------------------------------+\n| ``not`` *x* | Boolean NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``in``, ``not`` ``in``, ``is``, ``is not``, | Comparisons, including membership |\n| ``<``, ``<=``, ``>``, ``>=``, ``!=``, ``==`` | tests and identity tests, |\n+-------------------------------------------------+---------------------------------------+\n| ``|`` | Bitwise OR |\n+-------------------------------------------------+---------------------------------------+\n| ``^`` | Bitwise XOR |\n+-------------------------------------------------+---------------------------------------+\n| ``&`` | Bitwise AND |\n+-------------------------------------------------+---------------------------------------+\n| ``<<``, ``>>`` | Shifts |\n+-------------------------------------------------+---------------------------------------+\n| ``+``, ``-`` | Addition and subtraction |\n+-------------------------------------------------+---------------------------------------+\n| ``*``, ``/``, ``//``, ``%`` | Multiplication, division, remainder |\n| | [5] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [6] |\n+-------------------------------------------------+---------------------------------------+\n| ``x[index]``, ``x[index:index]``, | Subscription, slicing, call, |\n| ``x(arguments...)``, ``x.attribute`` | attribute reference |\n+-------------------------------------------------+---------------------------------------+\n| ``(expressions...)``, ``[expressions...]``, | Binding or tuple display, list |\n| ``{key:datum...}``, ``{expressions...}`` | display, dictionary display, set |\n| | display |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] While ``abs(x%y) < abs(y)`` is true mathematically, for floats it\n may not be true numerically due to roundoff. For example, and\n assuming a platform on which a Python float is an IEEE 754 double-\n precision number, in order that ``-1e-100 % 1e100`` have the same\n sign as ``1e100``, the computed result is ``-1e-100 + 1e100``,\n which is numerically exactly equal to ``1e100``. The function\n ``math.fmod()`` returns a result whose sign matches the sign of\n the first argument instead, and so returns ``-1e-100`` in this\n case. Which approach is more appropriate depends on the\n application.\n\n[2] If x is very close to an exact integer multiple of y, it\'s\n possible for ``x//y`` to be one larger than ``(x-x%y)//y`` due to\n rounding. In such cases, Python returns the latter result, in\n order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[3] While comparisons between strings make sense at the byte level,\n they may be counter-intuitive to users. For example, the strings\n ``"\\u00C7"`` and ``"\\u0327\\u0043"`` compare differently, even\n though they both represent the same unicode character (LATIN\n CAPITAL LETTER C WITH CEDILLA). To compare strings in a human\n recognizable way, compare using ``unicodedata.normalize()``.\n\n[4] Due to automatic garbage-collection, free lists, and the dynamic\n nature of descriptors, you may notice seemingly unusual behaviour\n in certain uses of the ``is`` operator, like those involving\n comparisons between instance methods, or constants. Check their\n documentation for more info.\n\n[5] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[6] The power operator ``**`` binds less tightly than an arithmetic or\n bitwise unary operator on its right, that is, ``2**-1`` is\n ``0.5``.\n',
'pass': '\nThe ``pass`` statement\n**********************\n\n pass_stmt ::= "pass"\n\n``pass`` is a null operation --- when it is executed, nothing happens.\nIt is useful as a placeholder when a statement is required\nsyntactically, but no code needs to be executed, for example:\n\n def f(arg): pass # a function that does nothing (yet)\n\n class C: pass # a class with no methods (yet)\n',
'power': '\nThe power operator\n******************\n\nThe power operator binds more tightly than unary operators on its\nleft; it binds less tightly than unary operators on its right. The\nsyntax is:\n\n power ::= primary ["**" u_expr]\n\nThus, in an unparenthesized sequence of power and unary operators, the\noperators are evaluated from right to left (this does not constrain\nthe evaluation order for the operands): ``-1**2`` results in ``-1``.\n\nThe power operator has the same semantics as the built-in ``pow()``\nfunction, when called with two arguments: it yields its left argument\nraised to the power of its right argument. The numeric arguments are\nfirst converted to a common type, and the result is of that type.\n\nFor int operands, the result has the same type as the operands unless\nthe second argument is negative; in that case, all arguments are\nconverted to float and a float result is delivered. For example,\n``10**2`` returns ``100``, but ``10**-2`` returns ``0.01``.\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``complex`` number. (In earlier versions it raised a\n``ValueError``.)\n',
'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["from" expression]]\n\nIf no expressions are present, ``raise`` re-raises the last exception\nthat was active in the current scope. If no exception is active in\nthe current scope, a ``RuntimeError`` exception is raised indicating\nthat this is an error.\n\nOtherwise, ``raise`` evaluates the first expression as the exception\nobject. It must be either a subclass or an instance of\n``BaseException``. If it is a class, the exception instance will be\nobtained when needed by instantiating the class with no arguments.\n\nThe *type* of the exception is the exception instance\'s class, the\n*value* is the instance itself.\n\nA traceback object is normally created automatically when an exception\nis raised and attached to it as the ``__traceback__`` attribute, which\nis writable. You can create an exception and set your own traceback in\none step using the ``with_traceback()`` exception method (which\nreturns the same exception instance, with its traceback set to its\nargument), like so:\n\n raise Exception("foo occurred").with_traceback(tracebackobj)\n\nThe ``from`` clause is used for exception chaining: if given, the\nsecond *expression* must be another exception class or instance, which\nwill then be attached to the raised exception as the ``__cause__``\nattribute (which is writable). If the raised exception is not\nhandled, both exceptions will be printed:\n\n >>> try:\n ... print(1 / 0)\n ... except Exception as exc:\n ... raise RuntimeError("Something bad happened") from exc\n ...\n Traceback (most recent call last):\n File "<stdin>", line 2, in <module>\n ZeroDivisionError: int division or modulo by zero\n\n The above exception was the direct cause of the following exception:\n\n Traceback (most recent call last):\n File "<stdin>", line 4, in <module>\n RuntimeError: Something bad happened\n\nA similar mechanism works implicitly if an exception is raised inside\nan exception handler: the previous exception is then attached as the\nnew exception\'s ``__context__`` attribute:\n\n >>> try:\n ... print(1 / 0)\n ... except:\n ... raise RuntimeError("Something bad happened")\n ...\n Traceback (most recent call last):\n File "<stdin>", line 2, in <module>\n ZeroDivisionError: int division or modulo by zero\n\n During handling of the above exception, another exception occurred:\n\n Traceback (most recent call last):\n File "<stdin>", line 4, in <module>\n RuntimeError: Something bad happened\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information about handling exceptions is in section\n*The try statement*.\n',
- 'return': '\nThe ``return`` statement\n************************\n\n return_stmt ::= "return" [expression_list]\n\n``return`` may only occur syntactically nested in a function\ndefinition, not within a nested class definition.\n\nIf an expression list is present, it is evaluated, else ``None`` is\nsubstituted.\n\n``return`` leaves the current function call with the expression list\n(or ``None``) as return value.\n\nWhen ``return`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the function.\n\nIn a generator function, the ``return`` statement is not allowed to\ninclude an ``expression_list``. In that context, a bare ``return``\nindicates that the generator is done and will cause ``StopIteration``\nto be raised.\n',
+ 'return': '\nThe ``return`` statement\n************************\n\n return_stmt ::= "return" [expression_list]\n\n``return`` may only occur syntactically nested in a function\ndefinition, not within a nested class definition.\n\nIf an expression list is present, it is evaluated, else ``None`` is\nsubstituted.\n\n``return`` leaves the current function call with the expression list\n(or ``None``) as return value.\n\nWhen ``return`` passes control out of a ``try`` statement with a\n``finally`` clause, that ``finally`` clause is executed before really\nleaving the function.\n\nIn a generator function, the ``return`` statement indicates that the\ngenerator is done and will cause ``StopIteration`` to be raised. The\nreturned value (if any) is used as an argument to construct\n``StopIteration`` and becomes the ``StopIteration.value`` attribute.\n',
'sequence-types': "\nEmulating container types\n*************************\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python's standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping's keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn't define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don't define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n",
'shifting': '\nShifting operations\n*******************\n\nThe shifting operations have lower priority than the arithmetic\noperations:\n\n shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr\n\nThese operators accept integers as arguments. They shift the first\nargument to the left or right by the number of bits given by the\nsecond argument.\n\nA right shift by *n* bits is defined as division by ``pow(2,n)``. A\nleft shift by *n* bits is defined as multiplication with ``pow(2,n)``.\n\nNote: In the current implementation, the right-hand operand is required to\n be at most ``sys.maxsize``. If the right-hand operand is larger\n than ``sys.maxsize`` an ``OverflowError`` exception is raised.\n',
'slicings': '\nSlicings\n********\n\nA slicing selects a range of items in a sequence object (e.g., a\nstring, tuple or list). Slicings may be used as expressions or as\ntargets in assignment or ``del`` statements. The syntax for a\nslicing:\n\n slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice\n proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n\nThere is ambiguity in the formal syntax here: anything that looks like\nan expression list also looks like a slice list, so any subscription\ncan be interpreted as a slicing. Rather than further complicating the\nsyntax, this is disambiguated by defining that in this case the\ninterpretation as a subscription takes priority over the\ninterpretation as a slicing (this is the case if the slice list\ncontains no proper slice).\n\nThe semantics for a slicing are as follows. The primary must evaluate\nto a mapping object, and it is indexed (using the same\n``__getitem__()`` method as normal subscription) with a key that is\nconstructed from the slice list, as follows. If the slice list\ncontains at least one comma, the key is a tuple containing the\nconversion of the slice items; otherwise, the conversion of the lone\nslice item is the key. The conversion of a slice item that is an\nexpression is that expression. The conversion of a proper slice is a\nslice object (see section *The standard type hierarchy*) whose\n``start``, ``stop`` and ``step`` attributes are the values of the\nexpressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n',
- 'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant. Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n A dictionary or other mapping object used to store an object\'s\n (writable) attributes.\n\ninstance.__class__\n\n The class to which a class instance belongs.\n\nclass.__bases__\n\n The tuple of base classes of a class object.\n\nclass.__name__\n\n The name of the class or type.\n\nclass.__mro__\n\n This attribute is a tuple of classes that are considered when\n looking for base classes during method resolution.\n\nclass.mro()\n\n This method can be overridden by a metaclass to customize the\n method resolution order for its instances. It is called at class\n instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n Each class keeps a list of weak references to its immediate\n subclasses. This method returns a list of all those references\n still alive. Example:\n\n >>> int.__subclasses__()\n [<class \'bool\'>]\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n operands.\n\n[4] Cased characters are those with general category property being\n one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n',
- 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``. Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by the ``str()`` built-in function and by the ``print()``\n function to compute the "informal" string representation of an\n object. This differs from ``__repr__()`` in that it does not have\n to be a valid Python expression: a more convenient or concise\n representation may be used instead. The return value must be a\n string object.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns ``id(x)``.\n\n Classes which inherit a ``__hash__()`` method from a parent class\n but change the meaning of ``__eq__()`` such that the hash value\n returned is no longer appropriate (e.g. by switching to a value-\n based concept of equality instead of the default identity based\n equality) can explicitly flag themselves as being unhashable by\n setting ``__hash__ = None`` in the class definition. Doing so means\n that not only will instances of the class raise an appropriate\n ``TypeError`` when a program attempts to retrieve their hash value,\n but they will also be correctly identified as unhashable when\n checking ``isinstance(obj, collections.Hashable)`` (unlike classes\n which define their own ``__hash__()`` to explicitly raise\n ``TypeError``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\n\n See also the *-R* command-line option.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A list must be\n returned.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. A class\ndefinition is read into a separate namespace and the value of class\nname is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if a callable ``metaclass`` keyword\nargument is passed after the bases in the class definition, the\ncallable given will be called instead of ``type()``. If other keyword\narguments are passed, they will also be passed to the metaclass. This\nallows classes or functions to be written which monitor or alter the\nclass creation process:\n\n* Modifying the class dictionary prior to the class being created.\n\n* Returning an instance of another class -- essentially performing the\n role of a factory function.\n\nThese steps will have to be performed in the metaclass\'s ``__new__()``\nmethod -- ``type.__new__()`` can then be called from this method to\ncreate a class with different properties. This example adds a new\nelement to the class dictionary before creating the class:\n\n class metacls(type):\n def __new__(mcs, name, bases, dict):\n dict[\'foo\'] = \'metacls was here\'\n return type.__new__(mcs, name, bases, dict)\n\nYou can of course also override other class methods (or add new\nmethods); for example defining a custom ``__call__()`` method in the\nmetaclass allows custom behavior when the class is called, e.g. not\nalways creating a new instance.\n\nIf the metaclass has a ``__prepare__()`` attribute (usually\nimplemented as a class or static method), it is called before the\nclass body is evaluated with the name of the class and a tuple of its\nbases for arguments. It should return an object that supports the\nmapping interface that will be used to store the namespace of the\nclass. The default is a plain dictionary. This could be used, for\nexample, to keep track of the order that class attributes are declared\nin by returning an ordered dictionary.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If the ``metaclass`` keyword argument is passed with the bases, it\n is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used.\n\n* Otherwise, the default metaclass (``type``) is used.\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored including logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, classdict):\n result = type.__new__(cls, name, bases, dict(classdict))\n result.members = tuple(classdict)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``. That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n **PEP 3119** - Introducing Abstract Base Classes\n Includes the specification for customizing ``isinstance()`` and\n ``issubclass()`` behavior through ``__instancecheck__()`` and\n ``__subclasscheck__()``, with motivation for this functionality\n in the context of adding Abstract Base Classes (see the ``abc``\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left operand\'s\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand\'s\n non-reflected method. This behavior allows subclasses to\n override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n certain controlled conditions. It generally isn\'t a good idea\n though, since it can lead to some very strange behaviour if it is\n handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n reflected method (such as ``__add__()``) fails the operation is\n not supported, which is why the reflected method is not called.\n',
- 'string-methods': '\nString Methods\n**************\n\nString objects support the methods listed below.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, bytes, bytearray, list,\ntuple, range* section. To output formatted strings, see the *String\nFormatting* section. Also, see the ``re`` module for string functions\nbased on regular expressions.\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is ``\'utf-8\'``. *errors* may be given to set a different\n error handling scheme. The default for *errors* is ``\'strict\'``,\n meaning that encoding errors raise a ``UnicodeError``. Other\n possible values are ``\'ignore\'``, ``\'replace\'``,\n ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return ``True`` if the string ends with the specified *suffix*,\n otherwise return ``False``. *suffix* can also be a tuple of\n suffixes to look for. With optional *start*, test beginning at\n that position. With optional *end*, stop comparing at that\n position.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by zero or more spaces, depending on the current column and the\n given tab size. The column number is reset to zero after each\n newline occurring in the string. If *tabsize* is not given, a tab\n size of ``8`` characters is assumed. This doesn\'t understand other\n non-printing characters or escape sequences.\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found, such that *sub* is contained in the slice ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` if *sub* is not found.\n\n Note: The ``find()`` method should be used only if you need to know the\n position of *sub*. To check if *sub* is a substring or not, use\n the ``in`` operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces ``{}``. Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to ``str.format(**mapping)``, except that ``mapping`` is\n used directly and not copied to a ``dict`` . This is useful if for\n example ``mapping`` is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like ``find()``, but raise ``ValueError`` when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character\n ``c`` is alphanumeric if one of the following returns ``True``:\n ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n ``c.isnumeric()``.\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those from general category "Nd". This category\n includes digit characters, and all characters that can be used to\n form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. Formally, a digit is a character\n that has the property value Numeric_Type=Digit or\n Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when ``repr()`` is\n invoked on a string. It has no bearing on the handling of strings\n written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. A ``TypeError`` will be raised if there are\n any non-string values in *iterable*, including ``bytes`` objects.\n The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n ``str.translate()``.\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or None.\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n None in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n is not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit([sep[, maxsplit]])\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n ``None``, any whitespace string is a separator. Except for\n splitting from the right, ``rsplit()`` behaves like ``split()``\n which is described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split([sep[, maxsplit]])\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most ``maxsplit+1``\n elements). If *maxsplit* is not specified, then there is no limit\n on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``). The *sep*\n argument may consist of multiple characters (for example,\n ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n an empty string with a specified separator returns ``[\'\']``.\n\n If *sep* is not specified or is ``None``, a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a ``None`` separator returns\n ``[]``.\n\n For example, ``\' 1 2 3 \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n and ``\' 1 2 3 \'.split(None, 1)`` returns ``[\'1\', \'2 3 \']``.\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\nstr.startswith(prefix[, start[, end]])\n\n Return ``True`` if string starts with the *prefix*, otherwise\n return ``False``. *prefix* can also be a tuple of prefixes to look\n for. With optional *start*, test string beginning at that\n position. With optional *end*, stop comparing string at that\n position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or ``None``, the\n *chars* argument defaults to removing whitespace. The *chars*\n argument is not a prefix or suffix; rather, all combinations of its\n values are stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n lambda mo: mo.group(0)[0].upper() +\n mo.group(0)[1:].lower(),\n s)\n\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n Return a copy of the *s* where all characters have been mapped\n through the *map* which must be a dictionary of Unicode ordinals\n (integers) to Unicode ordinals, strings or ``None``. Unmapped\n characters are left untouched. Characters mapped to ``None`` are\n deleted.\n\n You can use ``str.maketrans()`` to create a translation map from\n character-to-character mappings in different formats.\n\n Note: An even more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see\n ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that ``str.upper().isupper()`` might\n be ``False`` if ``s`` contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\nstr.zfill(width)\n\n Return the numeric string left filled with zeros in a string of\n length *width*. A sign prefix is handled correctly. The original\n string is returned if *width* is less than or equal to ``len(s)``.\n',
- 'strings': '\nString and Bytes literals\n*************************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "R"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'" | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | stringescapeseq\n longstringitem ::= longstringchar | stringescapeseq\n shortstringchar ::= <any source character except "\\" or newline or the quote>\n longstringchar ::= <any source character except "\\">\n stringescapeseq ::= "\\" <any source character>\n\n bytesliteral ::= bytesprefix(shortbytes | longbytes)\n bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortbytes ::= "\'" shortbytesitem* "\'" | \'"\' shortbytesitem* \'"\'\n longbytes ::= "\'\'\'" longbytesitem* "\'\'\'" | \'"""\' longbytesitem* \'"""\'\n shortbytesitem ::= shortbyteschar | bytesescapeseq\n longbytesitem ::= longbyteschar | bytesescapeseq\n shortbyteschar ::= <any ASCII character except "\\" or newline or the quote>\n longbyteschar ::= <any ASCII character except "\\">\n bytesescapeseq ::= "\\" <any ASCII character>\n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` or\n``bytesprefix`` and the rest of the literal. The source character set\nis defined by the encoding declaration; it is UTF-8 if no encoding\ndeclaration is given in the source file; see section *Encoding\ndeclarations*.\n\nIn plain English: Both types of literals can be enclosed in matching\nsingle quotes (``\'``) or double quotes (``"``). They can also be\nenclosed in matching groups of three single or double quotes (these\nare generally referred to as *triple-quoted strings*). The backslash\n(``\\``) character is used to escape characters that otherwise have a\nspecial meaning, such as newline, backslash itself, or the quote\ncharacter.\n\nBytes literals are always prefixed with ``\'b\'`` or ``\'B\'``; they\nproduce an instance of the ``bytes`` type instead of the ``str`` type.\nThey may only contain ASCII characters; bytes with a numeric value of\n128 or greater must be expressed with escapes.\n\nBoth string and bytes literals may optionally be prefixed with a\nletter ``\'r\'`` or ``\'R\'``; such strings are called *raw strings* and\ntreat backslashes as literal characters. As a result, in string\nliterals, ``\'\\U\'`` and ``\'\\u\'`` escapes in raw strings are not treated\nspecially.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string. (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C. The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\newline`` | Backslash and newline ignored | |\n+-------------------+-----------------------------------+---------+\n| ``\\\\`` | Backslash (``\\``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\\'`` | Single quote (``\'``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\"`` | Double quote (``"``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\a`` | ASCII Bell (BEL) | |\n+-------------------+-----------------------------------+---------+\n| ``\\b`` | ASCII Backspace (BS) | |\n+-------------------+-----------------------------------+---------+\n| ``\\f`` | ASCII Formfeed (FF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\n`` | ASCII Linefeed (LF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (1,3) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (2,3) |\n+-------------------+-----------------------------------+---------+\n\nEscape sequences only recognized in string literals are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (4) |\n| | *xxxx* | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (5) |\n| | *xxxxxxxx* | |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. As in Standard C, up to three octal digits are accepted.\n\n2. Unlike in Standard C, exactly two hex digits are required.\n\n3. In a bytes literal, hexadecimal and octal escapes denote the byte\n with the given value. In a string literal, these escapes denote a\n Unicode character with the given value.\n\n4. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence. Exactly four hex digits are\n required.\n\n5. Any Unicode character can be encoded this way, but characters\n outside the Basic Multilingual Plane (BMP) will be encoded using a\n surrogate pair if Python is compiled to use 16-bit code units (the\n default). Exactly eight hex digits are required.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*. (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.) It is also\nimportant to note that the escape sequences only recognized in string\nliterals fall into the category of unrecognized escapes for bytes\nliterals.\n\nEven in a raw string, string quotes can be escaped with a backslash,\nbut the backslash remains in the string; for example, ``r"\\""`` is a\nvalid string literal consisting of two characters: a backslash and a\ndouble quote; ``r"\\"`` is not a valid string literal (even a raw\nstring cannot end in an odd number of backslashes). Specifically, *a\nraw string cannot end in a single backslash* (since the backslash\nwould escape the following quote character). Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n',
+ 'specialattrs': '\nSpecial Attributes\n******************\n\nThe implementation adds a few special read-only attributes to several\nobject types, where they are relevant. Some of these are not reported\nby the ``dir()`` built-in function.\n\nobject.__dict__\n\n A dictionary or other mapping object used to store an object\'s\n (writable) attributes.\n\ninstance.__class__\n\n The class to which a class instance belongs.\n\nclass.__bases__\n\n The tuple of base classes of a class object.\n\nclass.__name__\n\n The name of the class or type.\n\nclass.__qualname__\n\n The *qualified name* of the class or type.\n\n New in version 3.3.\n\nclass.__mro__\n\n This attribute is a tuple of classes that are considered when\n looking for base classes during method resolution.\n\nclass.mro()\n\n This method can be overridden by a metaclass to customize the\n method resolution order for its instances. It is called at class\n instantiation, and its result is stored in ``__mro__``.\n\nclass.__subclasses__()\n\n Each class keeps a list of weak references to its immediate\n subclasses. This method returns a list of all those references\n still alive. Example:\n\n >>> int.__subclasses__()\n [<class \'bool\'>]\n\n-[ Footnotes ]-\n\n[1] Additional information on these special methods may be found in\n the Python Reference Manual (*Basic customization*).\n\n[2] As a consequence, the list ``[1, 2]`` is considered equal to\n ``[1.0, 2.0]``, and similarly for tuples.\n\n[3] They must have since the parser can\'t tell the type of the\n operands.\n\n[4] Cased characters are those with general category property being\n one of "Lu" (Letter, uppercase), "Ll" (Letter, lowercase), or "Lt"\n (Letter, titlecase).\n\n[5] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n',
+ 'specialnames': '\nSpecial method names\n********************\n\nA class can implement certain operations that are invoked by special\nsyntax (such as arithmetic operations or subscripting and slicing) by\ndefining methods with special names. This is Python\'s approach to\n*operator overloading*, allowing classes to define their own behavior\nwith respect to language operators. For instance, if a class defines\na method named ``__getitem__()``, and ``x`` is an instance of this\nclass, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x,\ni)``. Except where mentioned, attempts to execute an operation raise\nan exception when no appropriate method is defined (typically\n``AttributeError`` or ``TypeError``).\n\nWhen implementing a class that emulates any built-in type, it is\nimportant that the emulation only be implemented to the degree that it\nmakes sense for the object being modelled. For example, some\nsequences may work well with retrieval of individual elements, but\nextracting a slice may not make sense. (One example of this is the\n``NodeList`` interface in the W3C\'s Document Object Model.)\n\n\nBasic customization\n===================\n\nobject.__new__(cls[, ...])\n\n Called to create a new instance of class *cls*. ``__new__()`` is a\n static method (special-cased so you need not declare it as such)\n that takes the class of which an instance was requested as its\n first argument. The remaining arguments are those passed to the\n object constructor expression (the call to the class). The return\n value of ``__new__()`` should be the new object instance (usually\n an instance of *cls*).\n\n Typical implementations create a new instance of the class by\n invoking the superclass\'s ``__new__()`` method using\n ``super(currentclass, cls).__new__(cls[, ...])`` with appropriate\n arguments and then modifying the newly-created instance as\n necessary before returning it.\n\n If ``__new__()`` returns an instance of *cls*, then the new\n instance\'s ``__init__()`` method will be invoked like\n ``__init__(self[, ...])``, where *self* is the new instance and the\n remaining arguments are the same as were passed to ``__new__()``.\n\n If ``__new__()`` does not return an instance of *cls*, then the new\n instance\'s ``__init__()`` method will not be invoked.\n\n ``__new__()`` is intended mainly to allow subclasses of immutable\n types (like int, str, or tuple) to customize instance creation. It\n is also commonly overridden in custom metaclasses in order to\n customize class creation.\n\nobject.__init__(self[, ...])\n\n Called when the instance is created. The arguments are those\n passed to the class constructor expression. If a base class has an\n ``__init__()`` method, the derived class\'s ``__init__()`` method,\n if any, must explicitly call it to ensure proper initialization of\n the base class part of the instance; for example:\n ``BaseClass.__init__(self, [args...])``. As a special constraint\n on constructors, no value may be returned; doing so will cause a\n ``TypeError`` to be raised at runtime.\n\nobject.__del__(self)\n\n Called when the instance is about to be destroyed. This is also\n called a destructor. If a base class has a ``__del__()`` method,\n the derived class\'s ``__del__()`` method, if any, must explicitly\n call it to ensure proper deletion of the base class part of the\n instance. Note that it is possible (though not recommended!) for\n the ``__del__()`` method to postpone destruction of the instance by\n creating a new reference to it. It may then be called at a later\n time when this new reference is deleted. It is not guaranteed that\n ``__del__()`` methods are called for objects that still exist when\n the interpreter exits.\n\n Note: ``del x`` doesn\'t directly call ``x.__del__()`` --- the former\n decrements the reference count for ``x`` by one, and the latter\n is only called when ``x``\'s reference count reaches zero. Some\n common situations that may prevent the reference count of an\n object from going to zero include: circular references between\n objects (e.g., a doubly-linked list or a tree data structure with\n parent and child pointers); a reference to the object on the\n stack frame of a function that caught an exception (the traceback\n stored in ``sys.exc_info()[2]`` keeps the stack frame alive); or\n a reference to the object on the stack frame that raised an\n unhandled exception in interactive mode (the traceback stored in\n ``sys.last_traceback`` keeps the stack frame alive). The first\n situation can only be remedied by explicitly breaking the cycles;\n the latter two situations can be resolved by storing ``None`` in\n ``sys.last_traceback``. Circular references which are garbage are\n detected when the option cycle detector is enabled (it\'s on by\n default), but can only be cleaned up if there are no Python-\n level ``__del__()`` methods involved. Refer to the documentation\n for the ``gc`` module for more information about how\n ``__del__()`` methods are handled by the cycle detector,\n particularly the description of the ``garbage`` value.\n\n Warning: Due to the precarious circumstances under which ``__del__()``\n methods are invoked, exceptions that occur during their execution\n are ignored, and a warning is printed to ``sys.stderr`` instead.\n Also, when ``__del__()`` is invoked in response to a module being\n deleted (e.g., when execution of the program is done), other\n globals referenced by the ``__del__()`` method may already have\n been deleted or in the process of being torn down (e.g. the\n import machinery shutting down). For this reason, ``__del__()``\n methods should do the absolute minimum needed to maintain\n external invariants. Starting with version 1.5, Python\n guarantees that globals whose name begins with a single\n underscore are deleted from their module before other globals are\n deleted; if no other references to such globals exist, this may\n help in assuring that imported modules are still available at the\n time when the ``__del__()`` method is called.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function to compute the\n "official" string representation of an object. If at all possible,\n this should look like a valid Python expression that could be used\n to recreate an object with the same value (given an appropriate\n environment). If this is not possible, a string of the form\n ``<...some useful description...>`` should be returned. The return\n value must be a string object. If a class defines ``__repr__()``\n but not ``__str__()``, then ``__repr__()`` is also used when an\n "informal" string representation of instances of that class is\n required.\n\n This is typically used for debugging, so it is important that the\n representation is information-rich and unambiguous.\n\nobject.__str__(self)\n\n Called by the ``str()`` built-in function and by the ``print()``\n function to compute the "informal" string representation of an\n object. This differs from ``__repr__()`` in that it does not have\n to be a valid Python expression: a more convenient or concise\n representation may be used instead. The return value must be a\n string object.\n\nobject.__bytes__(self)\n\n Called by ``bytes()`` to compute a byte-string representation of an\n object. This should return a ``bytes`` object.\n\nobject.__format__(self, format_spec)\n\n Called by the ``format()`` built-in function (and by extension, the\n ``format()`` method of class ``str``) to produce a "formatted"\n string representation of an object. The ``format_spec`` argument is\n a string that contains a description of the formatting options\n desired. The interpretation of the ``format_spec`` argument is up\n to the type implementing ``__format__()``, however most classes\n will either delegate formatting to one of the built-in types, or\n use a similar formatting option syntax.\n\n See *Format Specification Mini-Language* for a description of the\n standard formatting syntax.\n\n The return value must be a string object.\n\nobject.__lt__(self, other)\nobject.__le__(self, other)\nobject.__eq__(self, other)\nobject.__ne__(self, other)\nobject.__gt__(self, other)\nobject.__ge__(self, other)\n\n These are the so-called "rich comparison" methods. The\n correspondence between operator symbols and method names is as\n follows: ``x<y`` calls ``x.__lt__(y)``, ``x<=y`` calls\n ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls\n ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls\n ``x.__ge__(y)``.\n\n A rich comparison method may return the singleton\n ``NotImplemented`` if it does not implement the operation for a\n given pair of arguments. By convention, ``False`` and ``True`` are\n returned for a successful comparison. However, these methods can\n return any value, so if the comparison operator is used in a\n Boolean context (e.g., in the condition of an ``if`` statement),\n Python will call ``bool()`` on the value to determine if the result\n is true or false.\n\n There are no implied relationships among the comparison operators.\n The truth of ``x==y`` does not imply that ``x!=y`` is false.\n Accordingly, when defining ``__eq__()``, one should also define\n ``__ne__()`` so that the operators will behave as expected. See\n the paragraph on ``__hash__()`` for some important notes on\n creating *hashable* objects which support custom comparison\n operations and are usable as dictionary keys.\n\n There are no swapped-argument versions of these methods (to be used\n when the left argument does not support the operation but the right\n argument does); rather, ``__lt__()`` and ``__gt__()`` are each\n other\'s reflection, ``__le__()`` and ``__ge__()`` are each other\'s\n reflection, and ``__eq__()`` and ``__ne__()`` are their own\n reflection.\n\n Arguments to rich comparison methods are never coerced.\n\n To automatically generate ordering operations from a single root\n operation, see ``functools.total_ordering()``.\n\nobject.__hash__(self)\n\n Called by built-in function ``hash()`` and for operations on\n members of hashed collections including ``set``, ``frozenset``, and\n ``dict``. ``__hash__()`` should return an integer. The only\n required property is that objects which compare equal have the same\n hash value; it is advised to somehow mix together (e.g. using\n exclusive or) the hash values for the components of the object that\n also play a part in comparison of objects.\n\n If a class does not define an ``__eq__()`` method it should not\n define a ``__hash__()`` operation either; if it defines\n ``__eq__()`` but not ``__hash__()``, its instances will not be\n usable as items in hashable collections. If a class defines\n mutable objects and implements an ``__eq__()`` method, it should\n not implement ``__hash__()``, since the implementation of hashable\n collections requires that a key\'s hash value is immutable (if the\n object\'s hash value changes, it will be in the wrong hash bucket).\n\n User-defined classes have ``__eq__()`` and ``__hash__()`` methods\n by default; with them, all objects compare unequal (except with\n themselves) and ``x.__hash__()`` returns an appropriate value such\n that ``x == y`` implies both that ``x is y`` and ``hash(x) ==\n hash(y)``.\n\n Classes which inherit a ``__hash__()`` method from a parent class\n but change the meaning of ``__eq__()`` such that the hash value\n returned is no longer appropriate (e.g. by switching to a value-\n based concept of equality instead of the default identity based\n equality) can explicitly flag themselves as being unhashable by\n setting ``__hash__ = None`` in the class definition. Doing so means\n that not only will instances of the class raise an appropriate\n ``TypeError`` when a program attempts to retrieve their hash value,\n but they will also be correctly identified as unhashable when\n checking ``isinstance(obj, collections.Hashable)`` (unlike classes\n which define their own ``__hash__()`` to explicitly raise\n ``TypeError``).\n\n If a class that overrides ``__eq__()`` needs to retain the\n implementation of ``__hash__()`` from a parent class, the\n interpreter must be told this explicitly by setting ``__hash__ =\n <ParentClass>.__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\n\n Note: By default, the ``__hash__()`` values of str, bytes and datetime\n objects are "salted" with an unpredictable random value.\n Although they remain constant within an individual Python\n process, they are not predictable between repeated invocations of\n Python.This is intended to provide protection against a denial-\n of-service caused by carefully-chosen inputs that exploit the\n worst case performance of a dict insertion, O(n^2) complexity.\n See http://www.ocert.org/advisories/ocert-2011-003.html for\n details.Changing hash values affects the iteration order of\n dicts, sets and other mappings. Python has never made guarantees\n about this ordering (and it typically varies between 32-bit and\n 64-bit builds).See also ``PYTHONHASHSEED``.\n\n Changed in version 3.3: Hash randomization is enabled by default.\n\nobject.__bool__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``. When this method\n is not defined, ``__len__()`` is called, if it is defined, and the\n object is considered true if its result is nonzero. If a class\n defines neither ``__len__()`` nor ``__bool__()``, all its instances\n are considered true.\n\n\nCustomizing attribute access\n============================\n\nThe following methods can be defined to customize the meaning of\nattribute access (use of, assignment to, or deletion of ``x.name``)\nfor class instances.\n\nobject.__getattr__(self, name)\n\n Called when an attribute lookup has not found the attribute in the\n usual places (i.e. it is not an instance attribute nor is it found\n in the class tree for ``self``). ``name`` is the attribute name.\n This method should return the (computed) attribute value or raise\n an ``AttributeError`` exception.\n\n Note that if the attribute is found through the normal mechanism,\n ``__getattr__()`` is not called. (This is an intentional asymmetry\n between ``__getattr__()`` and ``__setattr__()``.) This is done both\n for efficiency reasons and because otherwise ``__getattr__()``\n would have no way to access other attributes of the instance. Note\n that at least for instance variables, you can fake total control by\n not inserting any values in the instance attribute dictionary (but\n instead inserting them in another object). See the\n ``__getattribute__()`` method below for a way to actually get total\n control over attribute access.\n\nobject.__getattribute__(self, name)\n\n Called unconditionally to implement attribute accesses for\n instances of the class. If the class also defines\n ``__getattr__()``, the latter will not be called unless\n ``__getattribute__()`` either calls it explicitly or raises an\n ``AttributeError``. This method should return the (computed)\n attribute value or raise an ``AttributeError`` exception. In order\n to avoid infinite recursion in this method, its implementation\n should always call the base class method with the same name to\n access any attributes it needs, for example,\n ``object.__getattribute__(self, name)``.\n\n Note: This method may still be bypassed when looking up special methods\n as the result of implicit invocation via language syntax or\n built-in functions. See *Special method lookup*.\n\nobject.__setattr__(self, name, value)\n\n Called when an attribute assignment is attempted. This is called\n instead of the normal mechanism (i.e. store the value in the\n instance dictionary). *name* is the attribute name, *value* is the\n value to be assigned to it.\n\n If ``__setattr__()`` wants to assign to an instance attribute, it\n should call the base class method with the same name, for example,\n ``object.__setattr__(self, name, value)``.\n\nobject.__delattr__(self, name)\n\n Like ``__setattr__()`` but for attribute deletion instead of\n assignment. This should only be implemented if ``del obj.name`` is\n meaningful for the object.\n\nobject.__dir__(self)\n\n Called when ``dir()`` is called on the object. A sequence must be\n returned. ``dir()`` converts the returned sequence to a list and\n sorts it.\n\n\nImplementing Descriptors\n------------------------\n\nThe following methods only apply when an instance of the class\ncontaining the method (a so-called *descriptor* class) appears in an\n*owner* class (the descriptor must be in either the owner\'s class\ndictionary or in the class dictionary for one of its parents). In the\nexamples below, "the attribute" refers to the attribute whose name is\nthe key of the property in the owner class\' ``__dict__``.\n\nobject.__get__(self, instance, owner)\n\n Called to get the attribute of the owner class (class attribute\n access) or of an instance of that class (instance attribute\n access). *owner* is always the owner class, while *instance* is the\n instance that the attribute was accessed through, or ``None`` when\n the attribute is accessed through the *owner*. This method should\n return the (computed) attribute value or raise an\n ``AttributeError`` exception.\n\nobject.__set__(self, instance, value)\n\n Called to set the attribute on an instance *instance* of the owner\n class to a new value, *value*.\n\nobject.__delete__(self, instance)\n\n Called to delete the attribute on an instance *instance* of the\n owner class.\n\n\nInvoking Descriptors\n--------------------\n\nIn general, a descriptor is an object attribute with "binding\nbehavior", one whose attribute access has been overridden by methods\nin the descriptor protocol: ``__get__()``, ``__set__()``, and\n``__delete__()``. If any of those methods are defined for an object,\nit is said to be a descriptor.\n\nThe default behavior for attribute access is to get, set, or delete\nthe attribute from an object\'s dictionary. For instance, ``a.x`` has a\nlookup chain starting with ``a.__dict__[\'x\']``, then\n``type(a).__dict__[\'x\']``, and continuing through the base classes of\n``type(a)`` excluding metaclasses.\n\nHowever, if the looked-up value is an object defining one of the\ndescriptor methods, then Python may override the default behavior and\ninvoke the descriptor method instead. Where this occurs in the\nprecedence chain depends on which descriptor methods were defined and\nhow they were called.\n\nThe starting point for descriptor invocation is a binding, ``a.x``.\nHow the arguments are assembled depends on ``a``:\n\nDirect Call\n The simplest and least common call is when user code directly\n invokes a descriptor method: ``x.__get__(a)``.\n\nInstance Binding\n If binding to an object instance, ``a.x`` is transformed into the\n call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a class, ``A.x`` is transformed into the call:\n ``A.__dict__[\'x\'].__get__(None, A)``.\n\nSuper Binding\n If ``a`` is an instance of ``super``, then the binding ``super(B,\n obj).m()`` searches ``obj.__class__.__mro__`` for the base class\n ``A`` immediately preceding ``B`` and then invokes the descriptor\n with the call: ``A.__dict__[\'m\'].__get__(obj, obj.__class__)``.\n\nFor instance bindings, the precedence of descriptor invocation depends\non the which descriptor methods are defined. A descriptor can define\nany combination of ``__get__()``, ``__set__()`` and ``__delete__()``.\nIf it does not define ``__get__()``, then accessing the attribute will\nreturn the descriptor object itself unless there is a value in the\nobject\'s instance dictionary. If the descriptor defines ``__set__()``\nand/or ``__delete__()``, it is a data descriptor; if it defines\nneither, it is a non-data descriptor. Normally, data descriptors\ndefine both ``__get__()`` and ``__set__()``, while non-data\ndescriptors have just the ``__get__()`` method. Data descriptors with\n``__set__()`` and ``__get__()`` defined always override a redefinition\nin an instance dictionary. In contrast, non-data descriptors can be\noverridden by instances.\n\nPython methods (including ``staticmethod()`` and ``classmethod()``)\nare implemented as non-data descriptors. Accordingly, instances can\nredefine and override methods. This allows individual instances to\nacquire behaviors that differ from other instances of the same class.\n\nThe ``property()`` function is implemented as a data descriptor.\nAccordingly, instances cannot override the behavior of a property.\n\n\n__slots__\n---------\n\nBy default, instances of classes have a dictionary for attribute\nstorage. This wastes space for objects having very few instance\nvariables. The space consumption can become acute when creating large\nnumbers of instances.\n\nThe default can be overridden by defining *__slots__* in a class\ndefinition. The *__slots__* declaration takes a sequence of instance\nvariables and reserves just enough space in each instance to hold a\nvalue for each variable. Space is saved because *__dict__* is not\ncreated for each instance.\n\nobject.__slots__\n\n This class variable can be assigned a string, iterable, or sequence\n of strings with variable names used by instances. If defined in a\n class, *__slots__* reserves space for the declared variables and\n prevents the automatic creation of *__dict__* and *__weakref__* for\n each instance.\n\n\nNotes on using *__slots__*\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* When inheriting from a class without *__slots__*, the *__dict__*\n attribute of that class will always be accessible, so a *__slots__*\n definition in the subclass is meaningless.\n\n* Without a *__dict__* variable, instances cannot be assigned new\n variables not listed in the *__slots__* definition. Attempts to\n assign to an unlisted variable name raises ``AttributeError``. If\n dynamic assignment of new variables is desired, then add\n ``\'__dict__\'`` to the sequence of strings in the *__slots__*\n declaration.\n\n* Without a *__weakref__* variable for each instance, classes defining\n *__slots__* do not support weak references to its instances. If weak\n reference support is needed, then add ``\'__weakref__\'`` to the\n sequence of strings in the *__slots__* declaration.\n\n* *__slots__* are implemented at the class level by creating\n descriptors (*Implementing Descriptors*) for each variable name. As\n a result, class attributes cannot be used to set default values for\n instance variables defined by *__slots__*; otherwise, the class\n attribute would overwrite the descriptor assignment.\n\n* The action of a *__slots__* declaration is limited to the class\n where it is defined. As a result, subclasses will have a *__dict__*\n unless they also define *__slots__* (which must only contain names\n of any *additional* slots).\n\n* If a class defines a slot also defined in a base class, the instance\n variable defined by the base class slot is inaccessible (except by\n retrieving its descriptor directly from the base class). This\n renders the meaning of the program undefined. In the future, a\n check may be added to prevent this.\n\n* Nonempty *__slots__* does not work for classes derived from\n "variable-length" built-in types such as ``int``, ``str`` and\n ``tuple``.\n\n* Any non-string iterable may be assigned to *__slots__*. Mappings may\n also be used; however, in the future, special meaning may be\n assigned to the values corresponding to each key.\n\n* *__class__* assignment works only if both classes have the same\n *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, classes are constructed using ``type()``. The class body\nis executed in a new namespace and the class name is bound locally to\nthe result of ``type(name, bases, namespace)``.\n\nThe class creation process can be customised by passing the\n``metaclass`` keyword argument in the class definition line, or by\ninheriting from an existing class that included such an argument. In\nthe following example, both ``MyClass`` and ``MySubclass`` are\ninstances of ``Meta``:\n\n class Meta(type):\n pass\n\n class MyClass(metaclass=Meta):\n pass\n\n class MySubclass(MyClass):\n pass\n\nAny other keyword arguments that are specified in the class definition\nare passed through to all metaclass operations described below.\n\nWhen a class definition is executed, the following steps occur:\n\n* the appropriate metaclass is determined\n\n* the class namespace is prepared\n\n* the class body is executed\n\n* the class object is created\n\n\nDetermining the appropriate metaclass\n-------------------------------------\n\nThe appropriate metaclass for a class definition is determined as\nfollows:\n\n* if no bases and no explicit metaclass are given, then ``type()`` is\n used\n\n* if an explicit metaclass is given and it is *not* an instance of\n ``type()``, then it is used directly as the metaclass\n\n* if an instance of ``type()`` is given as the explicit metaclass, or\n bases are defined, then the most derived metaclass is used\n\nThe most derived metaclass is selected from the explicitly specified\nmetaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all\nspecified base classes. The most derived metaclass is one which is a\nsubtype of *all* of these candidate metaclasses. If none of the\ncandidate metaclasses meets that criterion, then the class definition\nwill fail with ``TypeError``.\n\n\nPreparing the class namespace\n-----------------------------\n\nOnce the appropriate metaclass has been identified, then the class\nnamespace is prepared. If the metaclass has a ``__prepare__``\nattribute, it is called as ``namespace = metaclass.__prepare__(name,\nbases, **kwds)`` (where the additional keyword arguments, if any, come\nfrom the class definition).\n\nIf the metaclass has no ``__prepare__`` attribute, then the class\nnamespace is initialised as an empty ``dict()`` instance.\n\nSee also:\n\n **PEP 3115** - Metaclasses in Python 3000\n Introduced the ``__prepare__`` namespace hook\n\n\nExecuting the class body\n------------------------\n\nThe class body is executed (approximately) as ``exec(body, globals(),\nnamespace)``. The key difference from a normal call to ``exec()`` is\nthat lexical scoping allows the class body (including any methods) to\nreference names from the current and outer scopes when the class\ndefinition occurs inside a function.\n\nHowever, even when the class definition occurs inside the function,\nmethods defined inside the class still cannot see names defined at the\nclass scope. Class variables must be accessed through the first\nparameter of instance or class methods, and cannot be accessed at all\nfrom static methods.\n\n\nCreating the class object\n-------------------------\n\nOnce the class namespace has been populated by executing the class\nbody, the class object is created by calling ``metaclass(name, bases,\nnamespace, **kwds)`` (the additional keywords passed here are the same\nas those passed to ``__prepare__``).\n\nThis class object is the one that will be referenced by the zero-\nargument form of ``super()``. ``__class__`` is an implicit closure\nreference created by the compiler if any methods in a class body refer\nto either ``__class__`` or ``super``. This allows the zero argument\nform of ``super()`` to correctly identify the class being defined\nbased on lexical scoping, while the class or instance that was used to\nmake the current call is identified based on the first argument passed\nto the method.\n\nAfter the class object is created, it is passed to the class\ndecorators included in the class definition (if any) and the resulting\nobject is bound in the local namespace as the defined class.\n\nSee also:\n\n **PEP 3135** - New super\n Describes the implicit ``__class__`` closure reference\n\n\nMetaclass example\n-----------------\n\nThe potential uses for metaclasses are boundless. Some ideas that have\nbeen explored include logging, interface checking, automatic\ndelegation, automatic property creation, proxies, frameworks, and\nautomatic resource locking/synchronization.\n\nHere is an example of a metaclass that uses an\n``collections.OrderedDict`` to remember the order that class members\nwere defined:\n\n class OrderedClass(type):\n\n @classmethod\n def __prepare__(metacls, name, bases, **kwds):\n return collections.OrderedDict()\n\n def __new__(cls, name, bases, namespace, **kwds):\n result = type.__new__(cls, name, bases, dict(namespace))\n result.members = tuple(namespace)\n return result\n\n class A(metaclass=OrderedClass):\n def one(self): pass\n def two(self): pass\n def three(self): pass\n def four(self): pass\n\n >>> A.members\n (\'__module__\', \'one\', \'two\', \'three\', \'four\')\n\nWhen the class definition for *A* gets executed, the process begins\nwith calling the metaclass\'s ``__prepare__()`` method which returns an\nempty ``collections.OrderedDict``. That mapping records the methods\nand attributes of *A* as they are defined within the body of the class\nstatement. Once those definitions are executed, the ordered dictionary\nis fully populated and the metaclass\'s ``__new__()`` method gets\ninvoked. That method builds the new type and it saves the ordered\ndictionary keys in an attribute called ``members``.\n\n\nCustomizing instance and subclass checks\n========================================\n\nThe following methods are used to override the default behavior of the\n``isinstance()`` and ``issubclass()`` built-in functions.\n\nIn particular, the metaclass ``abc.ABCMeta`` implements these methods\nin order to allow the addition of Abstract Base Classes (ABCs) as\n"virtual base classes" to any class or type (including built-in\ntypes), including other ABCs.\n\nclass.__instancecheck__(self, instance)\n\n Return true if *instance* should be considered a (direct or\n indirect) instance of *class*. If defined, called to implement\n ``isinstance(instance, class)``.\n\nclass.__subclasscheck__(self, subclass)\n\n Return true if *subclass* should be considered a (direct or\n indirect) subclass of *class*. If defined, called to implement\n ``issubclass(subclass, class)``.\n\nNote that these methods are looked up on the type (metaclass) of a\nclass. They cannot be defined as class methods in the actual class.\nThis is consistent with the lookup of special methods that are called\non instances, only in this case the instance is itself a class.\n\nSee also:\n\n **PEP 3119** - Introducing Abstract Base Classes\n Includes the specification for customizing ``isinstance()`` and\n ``issubclass()`` behavior through ``__instancecheck__()`` and\n ``__subclasscheck__()``, with motivation for this functionality\n in the context of adding Abstract Base Classes (see the ``abc``\n module) to the language.\n\n\nEmulating callable objects\n==========================\n\nobject.__call__(self[, args...])\n\n Called when the instance is "called" as a function; if this method\n is defined, ``x(arg1, arg2, ...)`` is a shorthand for\n ``x.__call__(arg1, arg2, ...)``.\n\n\nEmulating container types\n=========================\n\nThe following methods can be defined to implement container objects.\nContainers usually are sequences (such as lists or tuples) or mappings\n(like dictionaries), but can represent other containers as well. The\nfirst set of methods is used either to emulate a sequence or to\nemulate a mapping; the difference is that for a sequence, the\nallowable keys should be the integers *k* for which ``0 <= k < N``\nwhere *N* is the length of the sequence, or slice objects, which\ndefine a range of items. It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``get()``,\n``clear()``, ``setdefault()``, ``pop()``, ``popitem()``, ``copy()``,\nand ``update()`` behaving similar to those for Python\'s standard\ndictionary objects. The ``collections`` module provides a\n``MutableMapping`` abstract base class to help create those methods\nfrom a base set of ``__getitem__()``, ``__setitem__()``,\n``__delitem__()``, and ``keys()``. Mutable sequences should provide\nmethods ``append()``, ``count()``, ``index()``, ``extend()``,\n``insert()``, ``pop()``, ``remove()``, ``reverse()`` and ``sort()``,\nlike Python standard list objects. Finally, sequence types should\nimplement addition (meaning concatenation) and multiplication (meaning\nrepetition) by defining the methods ``__add__()``, ``__radd__()``,\n``__iadd__()``, ``__mul__()``, ``__rmul__()`` and ``__imul__()``\ndescribed below; they should not define other numerical operators. It\nis recommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should search the mapping\'s keys; for\nsequences, it should search through the values. It is further\nrecommended that both mappings and sequences implement the\n``__iter__()`` method to allow efficient iteration through the\ncontainer; for mappings, ``__iter__()`` should be the same as\n``keys()``; for sequences, it should iterate through the values.\n\nobject.__len__(self)\n\n Called to implement the built-in function ``len()``. Should return\n the length of the object, an integer ``>=`` 0. Also, an object\n that doesn\'t define a ``__bool__()`` method and whose ``__len__()``\n method returns zero is considered to be false in a Boolean context.\n\nNote: Slicing is done exclusively with the following three methods. A\n call like\n\n a[1:2] = b\n\n is translated to\n\n a[slice(1, 2, None)] = b\n\n and so forth. Missing slice items are always filled in with\n ``None``.\n\nobject.__getitem__(self, key)\n\n Called to implement evaluation of ``self[key]``. For sequence\n types, the accepted keys should be integers and slice objects.\n Note that the special interpretation of negative indexes (if the\n class wishes to emulate a sequence type) is up to the\n ``__getitem__()`` method. If *key* is of an inappropriate type,\n ``TypeError`` may be raised; if of a value outside the set of\n indexes for the sequence (after any special interpretation of\n negative values), ``IndexError`` should be raised. For mapping\n types, if *key* is missing (not in the container), ``KeyError``\n should be raised.\n\n Note: ``for`` loops expect that an ``IndexError`` will be raised for\n illegal indexes to allow proper detection of the end of the\n sequence.\n\nobject.__setitem__(self, key, value)\n\n Called to implement assignment to ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support changes to the values for keys, or if new keys\n can be added, or for sequences if elements can be replaced. The\n same exceptions should be raised for improper *key* values as for\n the ``__getitem__()`` method.\n\nobject.__delitem__(self, key)\n\n Called to implement deletion of ``self[key]``. Same note as for\n ``__getitem__()``. This should only be implemented for mappings if\n the objects support removal of keys, or for sequences if elements\n can be removed from the sequence. The same exceptions should be\n raised for improper *key* values as for the ``__getitem__()``\n method.\n\nobject.__iter__(self)\n\n This method is called when an iterator is required for a container.\n This method should return a new iterator object that can iterate\n over all the objects in the container. For mappings, it should\n iterate over the keys of the container, and should also be made\n available as the method ``keys()``.\n\n Iterator objects also need to implement this method; they are\n required to return themselves. For more information on iterator\n objects, see *Iterator Types*.\n\nobject.__reversed__(self)\n\n Called (if present) by the ``reversed()`` built-in to implement\n reverse iteration. It should return a new iterator object that\n iterates over all the objects in the container in reverse order.\n\n If the ``__reversed__()`` method is not provided, the\n ``reversed()`` built-in will fall back to using the sequence\n protocol (``__len__()`` and ``__getitem__()``). Objects that\n support the sequence protocol should only provide\n ``__reversed__()`` if they can provide an implementation that is\n more efficient than the one provided by ``reversed()``.\n\nThe membership test operators (``in`` and ``not in``) are normally\nimplemented as an iteration through a sequence. However, container\nobjects can supply the following special method with a more efficient\nimplementation, which also does not require the object be a sequence.\n\nobject.__contains__(self, item)\n\n Called to implement membership test operators. Should return true\n if *item* is in *self*, false otherwise. For mapping objects, this\n should consider the keys of the mapping rather than the values or\n the key-item pairs.\n\n For objects that don\'t define ``__contains__()``, the membership\n test first tries iteration via ``__iter__()``, then the old\n sequence iteration protocol via ``__getitem__()``, see *this\n section in the language reference*.\n\n\nEmulating numeric types\n=======================\n\nThe following methods can be defined to emulate numeric objects.\nMethods corresponding to operations that are not supported by the\nparticular kind of number implemented (e.g., bitwise operations for\nnon-integral numbers) should be left undefined.\n\nobject.__add__(self, other)\nobject.__sub__(self, other)\nobject.__mul__(self, other)\nobject.__truediv__(self, other)\nobject.__floordiv__(self, other)\nobject.__mod__(self, other)\nobject.__divmod__(self, other)\nobject.__pow__(self, other[, modulo])\nobject.__lshift__(self, other)\nobject.__rshift__(self, other)\nobject.__and__(self, other)\nobject.__xor__(self, other)\nobject.__or__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``). For instance, to evaluate the expression ``x + y``, where\n *x* is an instance of a class that has an ``__add__()`` method,\n ``x.__add__(y)`` is called. The ``__divmod__()`` method should be\n the equivalent to using ``__floordiv__()`` and ``__mod__()``; it\n should not be related to ``__truediv__()``. Note that\n ``__pow__()`` should be defined to accept an optional third\n argument if the ternary version of the built-in ``pow()`` function\n is to be supported.\n\n If one of those methods does not support the operation with the\n supplied arguments, it should return ``NotImplemented``.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rtruediv__(self, other)\nobject.__rfloordiv__(self, other)\nobject.__rmod__(self, other)\nobject.__rdivmod__(self, other)\nobject.__rpow__(self, other)\nobject.__rlshift__(self, other)\nobject.__rrshift__(self, other)\nobject.__rand__(self, other)\nobject.__rxor__(self, other)\nobject.__ror__(self, other)\n\n These methods are called to implement the binary arithmetic\n operations (``+``, ``-``, ``*``, ``/``, ``//``, ``%``,\n ``divmod()``, ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``,\n ``|``) with reflected (swapped) operands. These functions are only\n called if the left operand does not support the corresponding\n operation and the operands are of different types. [2] For\n instance, to evaluate the expression ``x - y``, where *y* is an\n instance of a class that has an ``__rsub__()`` method,\n ``y.__rsub__(x)`` is called if ``x.__sub__(y)`` returns\n *NotImplemented*.\n\n Note that ternary ``pow()`` will not try calling ``__rpow__()``\n (the coercion rules would become too complicated).\n\n Note: If the right operand\'s type is a subclass of the left operand\'s\n type and that subclass provides the reflected method for the\n operation, this method will be called before the left operand\'s\n non-reflected method. This behavior allows subclasses to\n override their ancestors\' operations.\n\nobject.__iadd__(self, other)\nobject.__isub__(self, other)\nobject.__imul__(self, other)\nobject.__itruediv__(self, other)\nobject.__ifloordiv__(self, other)\nobject.__imod__(self, other)\nobject.__ipow__(self, other[, modulo])\nobject.__ilshift__(self, other)\nobject.__irshift__(self, other)\nobject.__iand__(self, other)\nobject.__ixor__(self, other)\nobject.__ior__(self, other)\n\n These methods are called to implement the augmented arithmetic\n assignments (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``,\n ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods\n should attempt to do the operation in-place (modifying *self*) and\n return the result (which could be, but does not have to be,\n *self*). If a specific method is not defined, the augmented\n assignment falls back to the normal methods. For instance, to\n execute the statement ``x += y``, where *x* is an instance of a\n class that has an ``__iadd__()`` method, ``x.__iadd__(y)`` is\n called. If *x* is an instance of a class that does not define a\n ``__iadd__()`` method, ``x.__add__(y)`` and ``y.__radd__(x)`` are\n considered, as with the evaluation of ``x + y``.\n\nobject.__neg__(self)\nobject.__pos__(self)\nobject.__abs__(self)\nobject.__invert__(self)\n\n Called to implement the unary arithmetic operations (``-``, ``+``,\n ``abs()`` and ``~``).\n\nobject.__complex__(self)\nobject.__int__(self)\nobject.__float__(self)\nobject.__round__(self[, n])\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``float()`` and ``round()``. Should return a value of\n the appropriate type.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing, or in the\n built-in ``bin()``, ``hex()`` and ``oct()`` functions). Must return\n an integer.\n\n\nWith Statement Context Managers\n===============================\n\nA *context manager* is an object that defines the runtime context to\nbe established when executing a ``with`` statement. The context\nmanager handles the entry into, and the exit from, the desired runtime\ncontext for the execution of the block of code. Context managers are\nnormally invoked using the ``with`` statement (described in section\n*The with statement*), but can also be used by directly invoking their\nmethods.\n\nTypical uses of context managers include saving and restoring various\nkinds of global state, locking and unlocking resources, closing opened\nfiles, etc.\n\nFor more information on context managers, see *Context Manager Types*.\n\nobject.__enter__(self)\n\n Enter the runtime context related to this object. The ``with``\n statement will bind this method\'s return value to the target(s)\n specified in the ``as`` clause of the statement, if any.\n\nobject.__exit__(self, exc_type, exc_value, traceback)\n\n Exit the runtime context related to this object. The parameters\n describe the exception that caused the context to be exited. If the\n context was exited without an exception, all three arguments will\n be ``None``.\n\n If an exception is supplied, and the method wishes to suppress the\n exception (i.e., prevent it from being propagated), it should\n return a true value. Otherwise, the exception will be processed\n normally upon exit from this method.\n\n Note that ``__exit__()`` methods should not reraise the passed-in\n exception; this is the caller\'s responsibility.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n\n\nSpecial method lookup\n=====================\n\nFor custom classes, implicit invocations of special methods are only\nguaranteed to work correctly if defined on an object\'s type, not in\nthe object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception:\n\n >>> class C:\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: object of type \'C\' has no len()\n\nThe rationale behind this behaviour lies with a number of special\nmethods such as ``__hash__()`` and ``__repr__()`` that are implemented\nby all objects, including type objects. If the implicit lookup of\nthese methods used the conventional lookup process, they would fail\nwhen invoked on the type object itself:\n\n >>> 1 .__hash__() == hash(1)\n True\n >>> int.__hash__() == hash(int)\n Traceback (most recent call last):\n File "<stdin>", line 1, in <module>\n TypeError: descriptor \'__hash__\' of \'int\' object needs an argument\n\nIncorrectly attempting to invoke an unbound method of a class in this\nway is sometimes referred to as \'metaclass confusion\', and is avoided\nby bypassing the instance when looking up special methods:\n\n >>> type(1).__hash__(1) == hash(1)\n True\n >>> type(int).__hash__(int) == hash(int)\n True\n\nIn addition to bypassing any instance attributes in the interest of\ncorrectness, implicit special method lookup generally also bypasses\nthe ``__getattribute__()`` method even of the object\'s metaclass:\n\n >>> class Meta(type):\n ... def __getattribute__(*args):\n ... print("Metaclass getattribute invoked")\n ... return type.__getattribute__(*args)\n ...\n >>> class C(object, metaclass=Meta):\n ... def __len__(self):\n ... return 10\n ... def __getattribute__(*args):\n ... print("Class getattribute invoked")\n ... return object.__getattribute__(*args)\n ...\n >>> c = C()\n >>> c.__len__() # Explicit lookup via instance\n Class getattribute invoked\n 10\n >>> type(c).__len__(c) # Explicit lookup via type\n Metaclass getattribute invoked\n 10\n >>> len(c) # Implicit lookup\n 10\n\nBypassing the ``__getattribute__()`` machinery in this fashion\nprovides significant scope for speed optimisations within the\ninterpreter, at the cost of some flexibility in the handling of\nspecial methods (the special method *must* be set on the class object\nitself in order to be consistently invoked by the interpreter).\n\n-[ Footnotes ]-\n\n[1] It *is* possible in some cases to change an object\'s type, under\n certain controlled conditions. It generally isn\'t a good idea\n though, since it can lead to some very strange behaviour if it is\n handled incorrectly.\n\n[2] For operands of the same type, it is assumed that if the non-\n reflected method (such as ``__add__()``) fails the operation is\n not supported, which is why the reflected method is not called.\n',
+ 'string-methods': '\nString Methods\n**************\n\nStrings implement all of the *common* sequence operations, along with\nthe additional methods described below.\n\nStrings also support two styles of string formatting, one providing a\nlarge degree of flexibility and customization (see ``str.format()``,\n*Format String Syntax* and *String Formatting*) and the other based on\nC ``printf`` style formatting that handles a narrower range of types\nand is slightly harder to use correctly, but is often faster for the\ncases it can handle (*printf-style String Formatting*).\n\nThe *Text Processing Services* section of the standard library covers\na number of other modules that provide various text related utilities\n(including regular expression support in the ``re`` module).\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.casefold()\n\n Return a casefolded copy of the string. Casefolded strings may be\n used for caseless matching.\n\n Casefolding is similar to lowercasing but more aggressive because\n it is intended to remove all case distinctions in a string. For\n example, the German lowercase letter ``\'\xc3\x9f\'`` is equivalent to\n ``"ss"``. Since it is already lowercase, ``lower()`` would do\n nothing to ``\'\xc3\x9f\'``; ``casefold()`` converts it to ``"ss"``.\n\n The casefolding algorithm is described in section 3.13 of the\n Unicode Standard.\n\n New in version 3.3.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is ``\'utf-8\'``. *errors* may be given to set a different\n error handling scheme. The default for *errors* is ``\'strict\'``,\n meaning that encoding errors raise a ``UnicodeError``. Other\n possible values are ``\'ignore\'``, ``\'replace\'``,\n ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return ``True`` if the string ends with the specified *suffix*,\n otherwise return ``False``. *suffix* can also be a tuple of\n suffixes to look for. With optional *start*, test beginning at\n that position. With optional *end*, stop comparing at that\n position.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by zero or more spaces, depending on the current column and the\n given tab size. The column number is reset to zero after each\n newline occurring in the string. If *tabsize* is not given, a tab\n size of ``8`` characters is assumed. This doesn\'t understand other\n non-printing characters or escape sequences.\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found, such that *sub* is contained in the slice ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` if *sub* is not found.\n\n Note: The ``find()`` method should be used only if you need to know the\n position of *sub*. To check if *sub* is a substring or not, use\n the ``in`` operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces ``{}``. Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to ``str.format(**mapping)``, except that ``mapping`` is\n used directly and not copied to a ``dict`` . This is useful if for\n example ``mapping`` is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like ``find()``, but raise ``ValueError`` when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character\n ``c`` is alphanumeric if one of the following returns ``True``:\n ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n ``c.isnumeric()``.\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those from general category "Nd". This category\n includes digit characters, and all characters that can be used to\n form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. Formally, a digit is a character\n that has the property value Numeric_Type=Digit or\n Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when ``repr()`` is\n invoked on a string. It has no bearing on the handling of strings\n written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. A ``TypeError`` will be raised if there are\n any non-string values in *iterable*, including ``bytes`` objects.\n The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n The lowercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n ``str.translate()``.\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or None.\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n None in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n is not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n ``None``, any whitespace string is a separator. Except for\n splitting from the right, ``rsplit()`` behaves like ``split()``\n which is described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split(sep=None, maxsplit=-1)\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most ``maxsplit+1``\n elements). If *maxsplit* is not specified or ``-1``, then there is\n no limit on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``). The *sep*\n argument may consist of multiple characters (for example,\n ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n an empty string with a specified separator returns ``[\'\']``.\n\n If *sep* is not specified or is ``None``, a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a ``None`` separator returns\n ``[]``.\n\n For example, ``\' 1 2 3 \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n and ``\' 1 2 3 \'.split(None, 1)`` returns ``[\'1\', \'2 3 \']``.\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. This method uses the *universal newlines* approach to\n splitting lines. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\n For example, ``\'ab c\\n\\nde fg\\rkl\\r\\n\'.splitlines()`` returns\n ``[\'ab c\', \'\', \'de fg\', \'kl\']``, while the same call with\n ``splitlines(True)`` returns ``[\'ab c\\n\', \'\\n\', \'de fg\\r\',\n \'kl\\r\\n\']``.\n\n Unlike ``split()`` when a delimiter string *sep* is given, this\n method returns an empty list for the empty string, and a terminal\n line break does not result in an extra line.\n\nstr.startswith(prefix[, start[, end]])\n\n Return ``True`` if string starts with the *prefix*, otherwise\n return ``False``. *prefix* can also be a tuple of prefixes to look\n for. With optional *start*, test string beginning at that\n position. With optional *end*, stop comparing string at that\n position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or ``None``, the\n *chars* argument defaults to removing whitespace. The *chars*\n argument is not a prefix or suffix; rather, all combinations of its\n values are stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa. Note that it is not necessarily true that\n ``s.swapcase().swapcase() == s``.\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n lambda mo: mo.group(0)[0].upper() +\n mo.group(0)[1:].lower(),\n s)\n\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n Return a copy of the *s* where all characters have been mapped\n through the *map* which must be a dictionary of Unicode ordinals\n (integers) to Unicode ordinals, strings or ``None``. Unmapped\n characters are left untouched. Characters mapped to ``None`` are\n deleted.\n\n You can use ``str.maketrans()`` to create a translation map from\n character-to-character mappings in different formats.\n\n Note: An even more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see\n ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that ``str.upper().isupper()`` might\n be ``False`` if ``s`` contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\n The uppercasing algorithm used is described in section 3.13 of the\n Unicode Standard.\n\nstr.zfill(width)\n\n Return the numeric string left filled with zeros in a string of\n length *width*. A sign prefix is handled correctly. The original\n string is returned if *width* is less than or equal to ``len(s)``.\n',
+ 'strings': '\nString and Bytes literals\n*************************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "R" | "U"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'" | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | stringescapeseq\n longstringitem ::= longstringchar | stringescapeseq\n shortstringchar ::= <any source character except "\\" or newline or the quote>\n longstringchar ::= <any source character except "\\">\n stringescapeseq ::= "\\" <any source character>\n\n bytesliteral ::= bytesprefix(shortbytes | longbytes)\n bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"\n shortbytes ::= "\'" shortbytesitem* "\'" | \'"\' shortbytesitem* \'"\'\n longbytes ::= "\'\'\'" longbytesitem* "\'\'\'" | \'"""\' longbytesitem* \'"""\'\n shortbytesitem ::= shortbyteschar | bytesescapeseq\n longbytesitem ::= longbyteschar | bytesescapeseq\n shortbyteschar ::= <any ASCII character except "\\" or newline or the quote>\n longbyteschar ::= <any ASCII character except "\\">\n bytesescapeseq ::= "\\" <any ASCII character>\n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` or\n``bytesprefix`` and the rest of the literal. The source character set\nis defined by the encoding declaration; it is UTF-8 if no encoding\ndeclaration is given in the source file; see section *Encoding\ndeclarations*.\n\nIn plain English: Both types of literals can be enclosed in matching\nsingle quotes (``\'``) or double quotes (``"``). They can also be\nenclosed in matching groups of three single or double quotes (these\nare generally referred to as *triple-quoted strings*). The backslash\n(``\\``) character is used to escape characters that otherwise have a\nspecial meaning, such as newline, backslash itself, or the quote\ncharacter.\n\nBytes literals are always prefixed with ``\'b\'`` or ``\'B\'``; they\nproduce an instance of the ``bytes`` type instead of the ``str`` type.\nThey may only contain ASCII characters; bytes with a numeric value of\n128 or greater must be expressed with escapes.\n\nAs of Python 3.3 it is possible again to prefix unicode strings with a\n``u`` prefix to simplify maintenance of dual 2.x and 3.x codebases.\n\nBoth string and bytes literals may optionally be prefixed with a\nletter ``\'r\'`` or ``\'R\'``; such strings are called *raw strings* and\ntreat backslashes as literal characters. As a result, in string\nliterals, ``\'\\U\'`` and ``\'\\u\'`` escapes in raw strings are not treated\nspecially. Given that Python 2.x\'s raw unicode literals behave\ndifferently than Python 3.x\'s the ``\'ur\'`` syntax is not supported.\n\n New in version 3.3: The ``\'rb\'`` prefix of raw bytes literals has\n been added as a synonym of ``\'br\'``.\n\n New in version 3.3: Support for the unicode legacy literal\n (``u\'value\'``) was reintroduced to simplify the maintenance of dual\n Python 2.x and 3.x codebases. See **PEP 414** for more information.\n\nIn triple-quoted strings, unescaped newlines and quotes are allowed\n(and are retained), except that three unescaped quotes in a row\nterminate the string. (A "quote" is the character used to open the\nstring, i.e. either ``\'`` or ``"``.)\n\nUnless an ``\'r\'`` or ``\'R\'`` prefix is present, escape sequences in\nstrings are interpreted according to rules similar to those used by\nStandard C. The recognized escape sequences are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\newline`` | Backslash and newline ignored | |\n+-------------------+-----------------------------------+---------+\n| ``\\\\`` | Backslash (``\\``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\\'`` | Single quote (``\'``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\"`` | Double quote (``"``) | |\n+-------------------+-----------------------------------+---------+\n| ``\\a`` | ASCII Bell (BEL) | |\n+-------------------+-----------------------------------+---------+\n| ``\\b`` | ASCII Backspace (BS) | |\n+-------------------+-----------------------------------+---------+\n| ``\\f`` | ASCII Formfeed (FF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\n`` | ASCII Linefeed (LF) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (1,3) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (2,3) |\n+-------------------+-----------------------------------+---------+\n\nEscape sequences only recognized in string literals are:\n\n+-------------------+-----------------------------------+---------+\n| Escape Sequence | Meaning | Notes |\n+===================+===================================+=========+\n| ``\\N{name}`` | Character named *name* in the | (4) |\n| | Unicode database | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (5) |\n| | *xxxx* | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (6) |\n| | *xxxxxxxx* | |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. As in Standard C, up to three octal digits are accepted.\n\n2. Unlike in Standard C, exactly two hex digits are required.\n\n3. In a bytes literal, hexadecimal and octal escapes denote the byte\n with the given value. In a string literal, these escapes denote a\n Unicode character with the given value.\n\n4. Changed in version 3.3: Support for name aliases [1] has been\n added.\n\n5. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence. Exactly four hex digits are\n required.\n\n6. Any Unicode character can be encoded this way, but characters\n outside the Basic Multilingual Plane (BMP) will be encoded using a\n surrogate pair if Python is compiled to use 16-bit code units (the\n default). Exactly eight hex digits are required.\n\nUnlike Standard C, all unrecognized escape sequences are left in the\nstring unchanged, i.e., *the backslash is left in the string*. (This\nbehavior is useful when debugging: if an escape sequence is mistyped,\nthe resulting output is more easily recognized as broken.) It is also\nimportant to note that the escape sequences only recognized in string\nliterals fall into the category of unrecognized escapes for bytes\nliterals.\n\nEven in a raw string, string quotes can be escaped with a backslash,\nbut the backslash remains in the string; for example, ``r"\\""`` is a\nvalid string literal consisting of two characters: a backslash and a\ndouble quote; ``r"\\"`` is not a valid string literal (even a raw\nstring cannot end in an odd number of backslashes). Specifically, *a\nraw string cannot end in a single backslash* (since the backslash\nwould escape the following quote character). Note also that a single\nbackslash followed by a newline is interpreted as those two characters\nas part of the string, *not* as a line continuation.\n',
'subscriptions': '\nSubscriptions\n*************\n\nA subscription selects an item of a sequence (string, tuple or list)\nor mapping (dictionary) object:\n\n subscription ::= primary "[" expression_list "]"\n\nThe primary must evaluate to an object that supports subscription,\ne.g. a list or dictionary. User-defined objects can support\nsubscription by defining a ``__getitem__()`` method.\n\nFor built-in objects, there are two types of objects that support\nsubscription:\n\nIf the primary is a mapping, the expression list must evaluate to an\nobject whose value is one of the keys of the mapping, and the\nsubscription selects the value in the mapping that corresponds to that\nkey. (The expression list is a tuple except if it has exactly one\nitem.)\n\nIf the primary is a sequence, the expression (list) must evaluate to\nan integer or a slice (as discussed in the following section).\n\nThe formal syntax makes no special provision for negative indices in\nsequences; however, built-in sequences all provide a ``__getitem__()``\nmethod that interprets negative indices by adding the length of the\nsequence to the index (so that ``x[-1]`` selects the last item of\n``x``). The resulting value must be a nonnegative integer less than\nthe number of items in the sequence, and the subscription selects the\nitem whose index is that value (counting from zero). Since the support\nfor negative indices and slicing occurs in the object\'s\n``__getitem__()`` method, subclasses overriding this method will need\nto explicitly add that support.\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n',
'truth': "\nTruth Value Testing\n*******************\n\nAny object can be tested for truth value, for use in an ``if`` or\n``while`` condition or as operand of the Boolean operations below. The\nfollowing values are considered false:\n\n* ``None``\n\n* ``False``\n\n* zero of any numeric type, for example, ``0``, ``0.0``, ``0j``.\n\n* any empty sequence, for example, ``''``, ``()``, ``[]``.\n\n* any empty mapping, for example, ``{}``.\n\n* instances of user-defined classes, if the class defines a\n ``__bool__()`` or ``__len__()`` method, when that method returns the\n integer zero or ``bool`` value ``False``. [1]\n\nAll other values are considered true --- so objects of many types are\nalways true.\n\nOperations and built-in functions that have a Boolean result always\nreturn ``0`` or ``False`` for false and ``1`` or ``True`` for true,\nunless otherwise stated. (Important exception: the Boolean operations\n``or`` and ``and`` always return one of their operands.)\n",
- 'try': '\nThe ``try`` statement\n*********************\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception, it is re-raised at the end\nof the ``finally`` clause. If the ``finally`` clause raises another\nexception or executes a ``return`` or ``break`` statement, the saved\nexception is set as the context of the new exception. The exception\ninformation is not available to the program during execution of the\n``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n',
- 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python. Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types. Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\' These are attributes that provide access to the\nimplementation and are not intended for general use. Their definition\nmay change in the future.\n\nNone\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name ``None``.\n It is used to signify the absence of a value in many situations,\n e.g., it is returned from functions that don\'t explicitly return\n anything. Its truth value is false.\n\nNotImplemented\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name\n ``NotImplemented``. Numeric methods and rich comparison methods may\n return this value if they do not implement the operation for the\n operands provided. (The interpreter will then try the reflected\n operation, or some other fallback, depending on the operator.) Its\n truth value is true.\n\nEllipsis\n This type has a single value. There is a single object with this\n value. This object is accessed through the literal ``...`` or the\n built-in name ``Ellipsis``. Its truth value is true.\n\n``numbers.Number``\n These are created by numeric literals and returned as results by\n arithmetic operators and arithmetic built-in functions. Numeric\n objects are immutable; once created their value never changes.\n Python numbers are of course strongly related to mathematical\n numbers, but subject to the limitations of numerical representation\n in computers.\n\n Python distinguishes between integers, floating point numbers, and\n complex numbers:\n\n ``numbers.Integral``\n These represent elements from the mathematical set of integers\n (positive and negative).\n\n There are two types of integers:\n\n Integers (``int``)\n\n These represent numbers in an unlimited range, subject to\n available (virtual) memory only. For the purpose of shift\n and mask operations, a binary representation is assumed, and\n negative numbers are represented in a variant of 2\'s\n complement which gives the illusion of an infinite string of\n sign bits extending to the left.\n\n Booleans (``bool``)\n These represent the truth values False and True. The two\n objects representing the values False and True are the only\n Boolean objects. The Boolean type is a subtype of the integer\n type, and Boolean values behave like the values 0 and 1,\n respectively, in almost all contexts, the exception being\n that when converted to a string, the strings ``"False"`` or\n ``"True"`` are returned, respectively.\n\n The rules for integer representation are intended to give the\n most meaningful interpretation of shift and mask operations\n involving negative integers.\n\n ``numbers.Real`` (``float``)\n These represent machine-level double precision floating point\n numbers. You are at the mercy of the underlying machine\n architecture (and C or Java implementation) for the accepted\n range and handling of overflow. Python does not support single-\n precision floating point numbers; the savings in processor and\n memory usage that are usually the reason for using these is\n dwarfed by the overhead of using objects in Python, so there is\n no reason to complicate the language with two kinds of floating\n point numbers.\n\n ``numbers.Complex`` (``complex``)\n These represent complex numbers as a pair of machine-level\n double precision floating point numbers. The same caveats apply\n as for floating point numbers. The real and imaginary parts of a\n complex number ``z`` can be retrieved through the read-only\n attributes ``z.real`` and ``z.imag``.\n\nSequences\n These represent finite ordered sets indexed by non-negative\n numbers. The built-in function ``len()`` returns the number of\n items of a sequence. When the length of a sequence is *n*, the\n index set contains the numbers 0, 1, ..., *n*-1. Item *i* of\n sequence *a* is selected by ``a[i]``.\n\n Sequences also support slicing: ``a[i:j]`` selects all items with\n index *k* such that *i* ``<=`` *k* ``<`` *j*. When used as an\n expression, a slice is a sequence of the same type. This implies\n that the index set is renumbered so that it starts at 0.\n\n Some sequences also support "extended slicing" with a third "step"\n parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n *j*.\n\n Sequences are distinguished according to their mutability:\n\n Immutable sequences\n An object of an immutable sequence type cannot change once it is\n created. (If the object contains references to other objects,\n these other objects may be mutable and may be changed; however,\n the collection of objects directly referenced by an immutable\n object cannot change.)\n\n The following types are immutable sequences:\n\n Strings\n The items of a string object are Unicode code units. A\n Unicode code unit is represented by a string object of one\n item and can hold either a 16-bit or 32-bit value\n representing a Unicode ordinal (the maximum value for the\n ordinal is given in ``sys.maxunicode``, and depends on how\n Python is configured at compile time). Surrogate pairs may\n be present in the Unicode object, and will be reported as two\n separate items. The built-in functions ``chr()`` and\n ``ord()`` convert between code units and nonnegative integers\n representing the Unicode ordinals as defined in the Unicode\n Standard 3.0. Conversion from and to other encodings are\n possible through the string method ``encode()``.\n\n Tuples\n The items of a tuple are arbitrary Python objects. Tuples of\n two or more items are formed by comma-separated lists of\n expressions. A tuple of one item (a \'singleton\') can be\n formed by affixing a comma to an expression (an expression by\n itself does not create a tuple, since parentheses must be\n usable for grouping of expressions). An empty tuple can be\n formed by an empty pair of parentheses.\n\n Bytes\n A bytes object is an immutable array. The items are 8-bit\n bytes, represented by integers in the range 0 <= x < 256.\n Bytes literals (like ``b\'abc\'`` and the built-in function\n ``bytes()`` can be used to construct bytes objects. Also,\n bytes objects can be decoded to strings via the ``decode()``\n method.\n\n Mutable sequences\n Mutable sequences can be changed after they are created. The\n subscription and slicing notations can be used as the target of\n assignment and ``del`` (delete) statements.\n\n There are currently two intrinsic mutable sequence types:\n\n Lists\n The items of a list are arbitrary Python objects. Lists are\n formed by placing a comma-separated list of expressions in\n square brackets. (Note that there are no special cases needed\n to form lists of length 0 or 1.)\n\n Byte Arrays\n A bytearray object is a mutable array. They are created by\n the built-in ``bytearray()`` constructor. Aside from being\n mutable (and hence unhashable), byte arrays otherwise provide\n the same interface and functionality as immutable bytes\n objects.\n\n The extension module ``array`` provides an additional example of\n a mutable sequence type, as does the ``collections`` module.\n\nSet types\n These represent unordered, finite sets of unique, immutable\n objects. As such, they cannot be indexed by any subscript. However,\n they can be iterated over, and the built-in function ``len()``\n returns the number of items in a set. Common uses for sets are fast\n membership testing, removing duplicates from a sequence, and\n computing mathematical operations such as intersection, union,\n difference, and symmetric difference.\n\n For set elements, the same immutability rules apply as for\n dictionary keys. Note that numeric types obey the normal rules for\n numeric comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``), only one of them can be contained in a set.\n\n There are currently two intrinsic set types:\n\n Sets\n These represent a mutable set. They are created by the built-in\n ``set()`` constructor and can be modified afterwards by several\n methods, such as ``add()``.\n\n Frozen sets\n These represent an immutable set. They are created by the\n built-in ``frozenset()`` constructor. As a frozenset is\n immutable and *hashable*, it can be used again as an element of\n another set, or as a dictionary key.\n\nMappings\n These represent finite sets of objects indexed by arbitrary index\n sets. The subscript notation ``a[k]`` selects the item indexed by\n ``k`` from the mapping ``a``; this can be used in expressions and\n as the target of assignments or ``del`` statements. The built-in\n function ``len()`` returns the number of items in a mapping.\n\n There is currently a single intrinsic mapping type:\n\n Dictionaries\n These represent finite sets of objects indexed by nearly\n arbitrary values. The only types of values not acceptable as\n keys are values containing lists or dictionaries or other\n mutable types that are compared by value rather than by object\n identity, the reason being that the efficient implementation of\n dictionaries requires a key\'s hash value to remain constant.\n Numeric types used for keys obey the normal rules for numeric\n comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``) then they can be used interchangeably to index the same\n dictionary entry.\n\n Dictionaries are mutable; they can be created by the ``{...}``\n notation (see section *Dictionary displays*).\n\n The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n additional examples of mapping types, as does the\n ``collections`` module.\n\nCallable types\n These are the types to which the function call operation (see\n section *Calls*) can be applied:\n\n User-defined functions\n A user-defined function object is created by a function\n definition (see section *Function definitions*). It should be\n called with an argument list containing the same number of items\n as the function\'s formal parameter list.\n\n Special attributes:\n\n +---------------------------+---------------------------------+-------------+\n | Attribute | Meaning | |\n +===========================+=================================+=============+\n | ``__doc__`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +---------------------------+---------------------------------+-------------+\n | ``__name__`` | The function\'s name | Writable |\n +---------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +---------------------------+---------------------------------+-------------+\n | ``__defaults__`` | A tuple containing default | Writable |\n | | argument values for those | |\n | | arguments that have defaults, | |\n | | or ``None`` if no arguments | |\n | | have a default value | |\n +---------------------------+---------------------------------+-------------+\n | ``__code__`` | The code object representing | Writable |\n | | the compiled function body. | |\n +---------------------------+---------------------------------+-------------+\n | ``__globals__`` | A reference to the dictionary | Read-only |\n | | that holds the function\'s | |\n | | global variables --- the global | |\n | | namespace of the module in | |\n | | which the function was defined. | |\n +---------------------------+---------------------------------+-------------+\n | ``__dict__`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +---------------------------+---------------------------------+-------------+\n | ``__closure__`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +---------------------------+---------------------------------+-------------+\n | ``__annotations__`` | A dict containing annotations | Writable |\n | | of parameters. The keys of the | |\n | | dict are the parameter names, | |\n | | or ``\'return\'`` for the return | |\n | | annotation, if provided. | |\n +---------------------------+---------------------------------+-------------+\n | ``__kwdefaults__`` | A dict containing defaults for | Writable |\n | | keyword-only parameters. | |\n +---------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Function objects also support getting and setting arbitrary\n attributes, which can be used, for example, to attach metadata\n to functions. Regular attribute dot-notation is used to get and\n set such attributes. *Note that the current implementation only\n supports function attributes on user-defined functions. Function\n attributes on built-in functions may be supported in the\n future.*\n\n Additional information about a function\'s definition can be\n retrieved from its code object; see the description of internal\n types below.\n\n Instance methods\n An instance method object combines a class, a class instance and\n any callable object (normally a user-defined function).\n\n Special read-only attributes: ``__self__`` is the class instance\n object, ``__func__`` is the function object; ``__doc__`` is the\n method\'s documentation (same as ``__func__.__doc__``);\n ``__name__`` is the method name (same as ``__func__.__name__``);\n ``__module__`` is the name of the module the method was defined\n in, or ``None`` if unavailable.\n\n Methods also support accessing (but not setting) the arbitrary\n function attributes on the underlying function object.\n\n User-defined method objects may be created when getting an\n attribute of a class (perhaps via an instance of that class), if\n that attribute is a user-defined function object or a class\n method object.\n\n When an instance method object is created by retrieving a user-\n defined function object from a class via one of its instances,\n its ``__self__`` attribute is the instance, and the method\n object is said to be bound. The new method\'s ``__func__``\n attribute is the original function object.\n\n When a user-defined method object is created by retrieving\n another method object from a class or instance, the behaviour is\n the same as for a function object, except that the ``__func__``\n attribute of the new instance is not the original method object\n but its ``__func__`` attribute.\n\n When an instance method object is created by retrieving a class\n method object from a class or instance, its ``__self__``\n attribute is the class itself, and its ``__func__`` attribute is\n the function object underlying the class method.\n\n When an instance method object is called, the underlying\n function (``__func__``) is called, inserting the class instance\n (``__self__``) in front of the argument list. For instance,\n when ``C`` is a class which contains a definition for a function\n ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n is equivalent to calling ``C.f(x, 1)``.\n\n When an instance method object is derived from a class method\n object, the "class instance" stored in ``__self__`` will\n actually be the class itself, so that calling either ``x.f(1)``\n or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n the underlying function.\n\n Note that the transformation from function object to instance\n method object happens each time the attribute is retrieved from\n the instance. In some cases, a fruitful optimization is to\n assign the attribute to a local variable and call that local\n variable. Also notice that this transformation only happens for\n user-defined functions; other callable objects (and all non-\n callable objects) are retrieved without transformation. It is\n also important to note that user-defined functions which are\n attributes of a class instance are not converted to bound\n methods; this *only* happens when the function is an attribute\n of the class.\n\n Generator functions\n A function or method which uses the ``yield`` statement (see\n section *The yield statement*) is called a *generator function*.\n Such a function, when called, always returns an iterator object\n which can be used to execute the body of the function: calling\n the iterator\'s ``__next__()`` method will cause the function to\n execute until it provides a value using the ``yield`` statement.\n When the function executes a ``return`` statement or falls off\n the end, a ``StopIteration`` exception is raised and the\n iterator will have reached the end of the set of values to be\n returned.\n\n Built-in functions\n A built-in function object is a wrapper around a C function.\n Examples of built-in functions are ``len()`` and ``math.sin()``\n (``math`` is a standard built-in module). The number and type of\n the arguments are determined by the C function. Special read-\n only attributes: ``__doc__`` is the function\'s documentation\n string, or ``None`` if unavailable; ``__name__`` is the\n function\'s name; ``__self__`` is set to ``None`` (but see the\n next item); ``__module__`` is the name of the module the\n function was defined in or ``None`` if unavailable.\n\n Built-in methods\n This is really a different disguise of a built-in function, this\n time containing an object passed to the C function as an\n implicit extra argument. An example of a built-in method is\n ``alist.append()``, assuming *alist* is a list object. In this\n case, the special read-only attribute ``__self__`` is set to the\n object denoted by *alist*.\n\n Classes\n Classes are callable. These objects normally act as factories\n for new instances of themselves, but variations are possible for\n class types that override ``__new__()``. The arguments of the\n call are passed to ``__new__()`` and, in the typical case, to\n ``__init__()`` to initialize the new instance.\n\n Class Instances\n Instances of arbitrary classes can be made callable by defining\n a ``__call__()`` method in their class.\n\nModules\n Modules are imported by the ``import`` statement (see section *The\n import statement*). A module object has a namespace implemented by\n a dictionary object (this is the dictionary referenced by the\n __globals__ attribute of functions defined in the module).\n Attribute references are translated to lookups in this dictionary,\n e.g., ``m.x`` is equivalent to ``m.__dict__["x"]``. A module object\n does not contain the code object used to initialize the module\n (since it isn\'t needed once the initialization is done).\n\n Attribute assignment updates the module\'s namespace dictionary,\n e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n Special read-only attribute: ``__dict__`` is the module\'s namespace\n as a dictionary object.\n\n **CPython implementation detail:** Because of the way CPython\n clears module dictionaries, the module dictionary will be cleared\n when the module falls out of scope even if the dictionary still has\n live references. To avoid this, copy the dictionary or keep the\n module around while using its dictionary directly.\n\n Predefined (writable) attributes: ``__name__`` is the module\'s\n name; ``__doc__`` is the module\'s documentation string, or ``None``\n if unavailable; ``__file__`` is the pathname of the file from which\n the module was loaded, if it was loaded from a file. The\n ``__file__`` attribute is not present for C modules that are\n statically linked into the interpreter; for extension modules\n loaded dynamically from a shared library, it is the pathname of the\n shared library file.\n\nCustom classes\n Custom class types are typically created by class definitions (see\n section *Class definitions*). A class has a namespace implemented\n by a dictionary object. Class attribute references are translated\n to lookups in this dictionary, e.g., ``C.x`` is translated to\n ``C.__dict__["x"]`` (although there are a number of hooks which\n allow for other means of locating attributes). When the attribute\n name is not found there, the attribute search continues in the base\n classes. This search of the base classes uses the C3 method\n resolution order which behaves correctly even in the presence of\n \'diamond\' inheritance structures where there are multiple\n inheritance paths leading back to a common ancestor. Additional\n details on the C3 MRO used by Python can be found in the\n documentation accompanying the 2.3 release at\n http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a class method object, it is transformed into an instance method\n object whose ``__self__`` attributes is ``C``. When it would yield\n a static method object, it is transformed into the object wrapped\n by the static method object. See section *Implementing Descriptors*\n for another way in which attributes retrieved from a class may\n differ from those actually contained in its ``__dict__``.\n\n Class attribute assignments update the class\'s dictionary, never\n the dictionary of a base class.\n\n A class object can be called (see above) to yield a class instance\n (see below).\n\n Special attributes: ``__name__`` is the class name; ``__module__``\n is the module name in which the class was defined; ``__dict__`` is\n the dictionary containing the class\'s namespace; ``__bases__`` is a\n tuple (possibly empty or a singleton) containing the base classes,\n in the order of their occurrence in the base class list;\n ``__doc__`` is the class\'s documentation string, or None if\n undefined.\n\nClass instances\n A class instance is created by calling a class object (see above).\n A class instance has a namespace implemented as a dictionary which\n is the first place in which attribute references are searched.\n When an attribute is not found there, and the instance\'s class has\n an attribute by that name, the search continues with the class\n attributes. If a class attribute is found that is a user-defined\n function object, it is transformed into an instance method object\n whose ``__self__`` attribute is the instance. Static method and\n class method objects are also transformed; see above under\n "Classes". See section *Implementing Descriptors* for another way\n in which attributes of a class retrieved via its instances may\n differ from the objects actually stored in the class\'s\n ``__dict__``. If no class attribute is found, and the object\'s\n class has a ``__getattr__()`` method, that is called to satisfy the\n lookup.\n\n Attribute assignments and deletions update the instance\'s\n dictionary, never a class\'s dictionary. If the class has a\n ``__setattr__()`` or ``__delattr__()`` method, this is called\n instead of updating the instance dictionary directly.\n\n Class instances can pretend to be numbers, sequences, or mappings\n if they have methods with certain special names. See section\n *Special method names*.\n\n Special attributes: ``__dict__`` is the attribute dictionary;\n ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n A *file object* represents an open file. Various shortcuts are\n available to create file objects: the ``open()`` built-in function,\n and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n method of socket objects (and perhaps by other functions or methods\n provided by extension modules).\n\n The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n initialized to file objects corresponding to the interpreter\'s\n standard input, output and error streams; they are all open in text\n mode and therefore follow the interface defined by the\n ``io.TextIOBase`` abstract class.\n\nInternal types\n A few types used internally by the interpreter are exposed to the\n user. Their definitions may change with future versions of the\n interpreter, but they are mentioned here for completeness.\n\n Code objects\n Code objects represent *byte-compiled* executable Python code,\n or *bytecode*. The difference between a code object and a\n function object is that the function object contains an explicit\n reference to the function\'s globals (the module in which it was\n defined), while a code object contains no context; also the\n default argument values are stored in the function object, not\n in the code object (because they represent values calculated at\n run-time). Unlike function objects, code objects are immutable\n and contain no references (directly or indirectly) to mutable\n objects.\n\n Special read-only attributes: ``co_name`` gives the function\n name; ``co_argcount`` is the number of positional arguments\n (including arguments with default values); ``co_nlocals`` is the\n number of local variables used by the function (including\n arguments); ``co_varnames`` is a tuple containing the names of\n the local variables (starting with the argument names);\n ``co_cellvars`` is a tuple containing the names of local\n variables that are referenced by nested functions;\n ``co_freevars`` is a tuple containing the names of free\n variables; ``co_code`` is a string representing the sequence of\n bytecode instructions; ``co_consts`` is a tuple containing the\n literals used by the bytecode; ``co_names`` is a tuple\n containing the names used by the bytecode; ``co_filename`` is\n the filename from which the code was compiled;\n ``co_firstlineno`` is the first line number of the function;\n ``co_lnotab`` is a string encoding the mapping from bytecode\n offsets to line numbers (for details see the source code of the\n interpreter); ``co_stacksize`` is the required stack size\n (including local variables); ``co_flags`` is an integer encoding\n a number of flags for the interpreter.\n\n The following flag bits are defined for ``co_flags``: bit\n ``0x04`` is set if the function uses the ``*arguments`` syntax\n to accept an arbitrary number of positional arguments; bit\n ``0x08`` is set if the function uses the ``**keywords`` syntax\n to accept arbitrary keyword arguments; bit ``0x20`` is set if\n the function is a generator.\n\n Future feature declarations (``from __future__ import\n division``) also use bits in ``co_flags`` to indicate whether a\n code object was compiled with a particular feature enabled: bit\n ``0x2000`` is set if the function was compiled with future\n division enabled; bits ``0x10`` and ``0x1000`` were used in\n earlier versions of Python.\n\n Other bits in ``co_flags`` are reserved for internal use.\n\n If a code object represents a function, the first item in\n ``co_consts`` is the documentation string of the function, or\n ``None`` if undefined.\n\n Frame objects\n Frame objects represent execution frames. They may occur in\n traceback objects (see below).\n\n Special read-only attributes: ``f_back`` is to the previous\n stack frame (towards the caller), or ``None`` if this is the\n bottom stack frame; ``f_code`` is the code object being executed\n in this frame; ``f_locals`` is the dictionary used to look up\n local variables; ``f_globals`` is used for global variables;\n ``f_builtins`` is used for built-in (intrinsic) names;\n ``f_lasti`` gives the precise instruction (this is an index into\n the bytecode string of the code object).\n\n Special writable attributes: ``f_trace``, if not ``None``, is a\n function called at the start of each source code line (this is\n used by the debugger); ``f_lineno`` is the current line number\n of the frame --- writing to this from within a trace function\n jumps to the given line (only for the bottom-most frame). A\n debugger can implement a Jump command (aka Set Next Statement)\n by writing to f_lineno.\n\n Traceback objects\n Traceback objects represent a stack trace of an exception. A\n traceback object is created when an exception occurs. When the\n search for an exception handler unwinds the execution stack, at\n each unwound level a traceback object is inserted in front of\n the current traceback. When an exception handler is entered,\n the stack trace is made available to the program. (See section\n *The try statement*.) It is accessible as the third item of the\n tuple returned by ``sys.exc_info()``. When the program contains\n no suitable handler, the stack trace is written (nicely\n formatted) to the standard error stream; if the interpreter is\n interactive, it is also made available to the user as\n ``sys.last_traceback``.\n\n Special read-only attributes: ``tb_next`` is the next level in\n the stack trace (towards the frame where the exception\n occurred), or ``None`` if there is no next level; ``tb_frame``\n points to the execution frame of the current level;\n ``tb_lineno`` gives the line number where the exception\n occurred; ``tb_lasti`` indicates the precise instruction. The\n line number and last instruction in the traceback may differ\n from the line number of its frame object if the exception\n occurred in a ``try`` statement with no matching except clause\n or with a finally clause.\n\n Slice objects\n Slice objects are used to represent slices for ``__getitem__()``\n methods. They are also created by the built-in ``slice()``\n function.\n\n Special read-only attributes: ``start`` is the lower bound;\n ``stop`` is the upper bound; ``step`` is the step value; each is\n ``None`` if omitted. These attributes can have any type.\n\n Slice objects support one method:\n\n slice.indices(self, length)\n\n This method takes a single integer argument *length* and\n computes information about the slice that the slice object\n would describe if applied to a sequence of *length* items.\n It returns a tuple of three integers; respectively these are\n the *start* and *stop* indices and the *step* or stride\n length of the slice. Missing or out-of-bounds indices are\n handled in a manner consistent with regular slices.\n\n Static method objects\n Static method objects provide a way of defeating the\n transformation of function objects to method objects described\n above. A static method object is a wrapper around any other\n object, usually a user-defined method object. When a static\n method object is retrieved from a class or a class instance, the\n object actually returned is the wrapped object, which is not\n subject to any further transformation. Static method objects are\n not themselves callable, although the objects they wrap usually\n are. Static method objects are created by the built-in\n ``staticmethod()`` constructor.\n\n Class method objects\n A class method object, like a static method object, is a wrapper\n around another object that alters the way in which that object\n is retrieved from classes and class instances. The behaviour of\n class method objects upon such retrieval is described above,\n under "User-defined methods". Class method objects are created\n by the built-in ``classmethod()`` constructor.\n',
+ 'try': '\nThe ``try`` statement\n*********************\n\nThe ``try`` statement specifies exception handlers and/or cleanup code\nfor a group of statements:\n\n try_stmt ::= try1_stmt | try2_stmt\n try1_stmt ::= "try" ":" suite\n ("except" [expression ["as" target]] ":" suite)+\n ["else" ":" suite]\n ["finally" ":" suite]\n try2_stmt ::= "try" ":" suite\n "finally" ":" suite\n\nThe ``except`` clause(s) specify one or more exception handlers. When\nno exception occurs in the ``try`` clause, no exception handler is\nexecuted. When an exception occurs in the ``try`` suite, a search for\nan exception handler is started. This search inspects the except\nclauses in turn until one is found that matches the exception. An\nexpression-less except clause, if present, must be last; it matches\nany exception. For an except clause with an expression, that\nexpression is evaluated, and the clause matches the exception if the\nresulting object is "compatible" with the exception. An object is\ncompatible with an exception if it is the class or a base class of the\nexception object or a tuple containing an item compatible with the\nexception.\n\nIf no except clause matches the exception, the search for an exception\nhandler continues in the surrounding code and on the invocation stack.\n[1]\n\nIf the evaluation of an expression in the header of an except clause\nraises an exception, the original search for a handler is canceled and\na search starts for the new exception in the surrounding code and on\nthe call stack (it is treated as if the entire ``try`` statement\nraised the exception).\n\nWhen a matching except clause is found, the exception is assigned to\nthe target specified after the ``as`` keyword in that except clause,\nif present, and the except clause\'s suite is executed. All except\nclauses must have an executable block. When the end of this block is\nreached, execution continues normally after the entire try statement.\n(This means that if two nested handlers exist for the same exception,\nand the exception occurs in the try clause of the inner handler, the\nouter handler will not handle the exception.)\n\nWhen an exception has been assigned using ``as target``, it is cleared\nat the end of the except clause. This is as if\n\n except E as N:\n foo\n\nwas translated to\n\n except E as N:\n try:\n foo\n finally:\n del N\n\nThis means the exception must be assigned to a different name to be\nable to refer to it after the except clause. Exceptions are cleared\nbecause with the traceback attached to them, they form a reference\ncycle with the stack frame, keeping all locals in that frame alive\nuntil the next garbage collection occurs.\n\nBefore an except clause\'s suite is executed, details about the\nexception are stored in the ``sys`` module and can be access via\n``sys.exc_info()``. ``sys.exc_info()`` returns a 3-tuple consisting of\nthe exception class, the exception instance and a traceback object\n(see section *The standard type hierarchy*) identifying the point in\nthe program where the exception occurred. ``sys.exc_info()`` values\nare restored to their previous values (before the call) when returning\nfrom a function that handled an exception.\n\nThe optional ``else`` clause is executed if and when control flows off\nthe end of the ``try`` clause. [2] Exceptions in the ``else`` clause\nare not handled by the preceding ``except`` clauses.\n\nIf ``finally`` is present, it specifies a \'cleanup\' handler. The\n``try`` clause is executed, including any ``except`` and ``else``\nclauses. If an exception occurs in any of the clauses and is not\nhandled, the exception is temporarily saved. The ``finally`` clause is\nexecuted. If there is a saved exception or ``break`` statement, it is\nre-raised at the end of the ``finally`` clause. If the ``finally``\nclause raises another exception the saved exception is set as the\ncontext of the new exception; if the ``finally`` clause executes a\n``return`` statement, the saved exception is discarded:\n\n def f():\n try:\n 1/0\n finally:\n return 42\n\n >>> f()\n 42\n\nThe exception information is not available to the program during\nexecution of the ``finally`` clause.\n\nWhen a ``return``, ``break`` or ``continue`` statement is executed in\nthe ``try`` suite of a ``try``...``finally`` statement, the\n``finally`` clause is also executed \'on the way out.\' A ``continue``\nstatement is illegal in the ``finally`` clause. (The reason is a\nproblem with the current implementation --- this restriction may be\nlifted in the future).\n\nAdditional information on exceptions can be found in section\n*Exceptions*, and information on using the ``raise`` statement to\ngenerate exceptions may be found in section *The raise statement*.\n',
+ 'types': '\nThe standard type hierarchy\n***************************\n\nBelow is a list of the types that are built into Python. Extension\nmodules (written in C, Java, or other languages, depending on the\nimplementation) can define additional types. Future versions of\nPython may add types to the type hierarchy (e.g., rational numbers,\nefficiently stored arrays of integers, etc.), although such additions\nwill often be provided via the standard library instead.\n\nSome of the type descriptions below contain a paragraph listing\n\'special attributes.\' These are attributes that provide access to the\nimplementation and are not intended for general use. Their definition\nmay change in the future.\n\nNone\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name ``None``.\n It is used to signify the absence of a value in many situations,\n e.g., it is returned from functions that don\'t explicitly return\n anything. Its truth value is false.\n\nNotImplemented\n This type has a single value. There is a single object with this\n value. This object is accessed through the built-in name\n ``NotImplemented``. Numeric methods and rich comparison methods may\n return this value if they do not implement the operation for the\n operands provided. (The interpreter will then try the reflected\n operation, or some other fallback, depending on the operator.) Its\n truth value is true.\n\nEllipsis\n This type has a single value. There is a single object with this\n value. This object is accessed through the literal ``...`` or the\n built-in name ``Ellipsis``. Its truth value is true.\n\n``numbers.Number``\n These are created by numeric literals and returned as results by\n arithmetic operators and arithmetic built-in functions. Numeric\n objects are immutable; once created their value never changes.\n Python numbers are of course strongly related to mathematical\n numbers, but subject to the limitations of numerical representation\n in computers.\n\n Python distinguishes between integers, floating point numbers, and\n complex numbers:\n\n ``numbers.Integral``\n These represent elements from the mathematical set of integers\n (positive and negative).\n\n There are two types of integers:\n\n Integers (``int``)\n\n These represent numbers in an unlimited range, subject to\n available (virtual) memory only. For the purpose of shift\n and mask operations, a binary representation is assumed, and\n negative numbers are represented in a variant of 2\'s\n complement which gives the illusion of an infinite string of\n sign bits extending to the left.\n\n Booleans (``bool``)\n These represent the truth values False and True. The two\n objects representing the values False and True are the only\n Boolean objects. The Boolean type is a subtype of the integer\n type, and Boolean values behave like the values 0 and 1,\n respectively, in almost all contexts, the exception being\n that when converted to a string, the strings ``"False"`` or\n ``"True"`` are returned, respectively.\n\n The rules for integer representation are intended to give the\n most meaningful interpretation of shift and mask operations\n involving negative integers.\n\n ``numbers.Real`` (``float``)\n These represent machine-level double precision floating point\n numbers. You are at the mercy of the underlying machine\n architecture (and C or Java implementation) for the accepted\n range and handling of overflow. Python does not support single-\n precision floating point numbers; the savings in processor and\n memory usage that are usually the reason for using these is\n dwarfed by the overhead of using objects in Python, so there is\n no reason to complicate the language with two kinds of floating\n point numbers.\n\n ``numbers.Complex`` (``complex``)\n These represent complex numbers as a pair of machine-level\n double precision floating point numbers. The same caveats apply\n as for floating point numbers. The real and imaginary parts of a\n complex number ``z`` can be retrieved through the read-only\n attributes ``z.real`` and ``z.imag``.\n\nSequences\n These represent finite ordered sets indexed by non-negative\n numbers. The built-in function ``len()`` returns the number of\n items of a sequence. When the length of a sequence is *n*, the\n index set contains the numbers 0, 1, ..., *n*-1. Item *i* of\n sequence *a* is selected by ``a[i]``.\n\n Sequences also support slicing: ``a[i:j]`` selects all items with\n index *k* such that *i* ``<=`` *k* ``<`` *j*. When used as an\n expression, a slice is a sequence of the same type. This implies\n that the index set is renumbered so that it starts at 0.\n\n Some sequences also support "extended slicing" with a third "step"\n parameter: ``a[i:j:k]`` selects all items of *a* with index *x*\n where ``x = i + n*k``, *n* ``>=`` ``0`` and *i* ``<=`` *x* ``<``\n *j*.\n\n Sequences are distinguished according to their mutability:\n\n Immutable sequences\n An object of an immutable sequence type cannot change once it is\n created. (If the object contains references to other objects,\n these other objects may be mutable and may be changed; however,\n the collection of objects directly referenced by an immutable\n object cannot change.)\n\n The following types are immutable sequences:\n\n Strings\n A string is a sequence of values that represent Unicode\n codepoints. All the codepoints in range ``U+0000 - U+10FFFF``\n can be represented in a string. Python doesn\'t have a\n ``chr`` type, and every character in the string is\n represented as a string object with length ``1``. The built-\n in function ``ord()`` converts a character to its codepoint\n (as an integer); ``chr()`` converts an integer in range ``0 -\n 10FFFF`` to the corresponding character. ``str.encode()`` can\n be used to convert a ``str`` to ``bytes`` using the given\n encoding, and ``bytes.decode()`` can be used to achieve the\n opposite.\n\n Tuples\n The items of a tuple are arbitrary Python objects. Tuples of\n two or more items are formed by comma-separated lists of\n expressions. A tuple of one item (a \'singleton\') can be\n formed by affixing a comma to an expression (an expression by\n itself does not create a tuple, since parentheses must be\n usable for grouping of expressions). An empty tuple can be\n formed by an empty pair of parentheses.\n\n Bytes\n A bytes object is an immutable array. The items are 8-bit\n bytes, represented by integers in the range 0 <= x < 256.\n Bytes literals (like ``b\'abc\'`` and the built-in function\n ``bytes()`` can be used to construct bytes objects. Also,\n bytes objects can be decoded to strings via the ``decode()``\n method.\n\n Mutable sequences\n Mutable sequences can be changed after they are created. The\n subscription and slicing notations can be used as the target of\n assignment and ``del`` (delete) statements.\n\n There are currently two intrinsic mutable sequence types:\n\n Lists\n The items of a list are arbitrary Python objects. Lists are\n formed by placing a comma-separated list of expressions in\n square brackets. (Note that there are no special cases needed\n to form lists of length 0 or 1.)\n\n Byte Arrays\n A bytearray object is a mutable array. They are created by\n the built-in ``bytearray()`` constructor. Aside from being\n mutable (and hence unhashable), byte arrays otherwise provide\n the same interface and functionality as immutable bytes\n objects.\n\n The extension module ``array`` provides an additional example of\n a mutable sequence type, as does the ``collections`` module.\n\nSet types\n These represent unordered, finite sets of unique, immutable\n objects. As such, they cannot be indexed by any subscript. However,\n they can be iterated over, and the built-in function ``len()``\n returns the number of items in a set. Common uses for sets are fast\n membership testing, removing duplicates from a sequence, and\n computing mathematical operations such as intersection, union,\n difference, and symmetric difference.\n\n For set elements, the same immutability rules apply as for\n dictionary keys. Note that numeric types obey the normal rules for\n numeric comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``), only one of them can be contained in a set.\n\n There are currently two intrinsic set types:\n\n Sets\n These represent a mutable set. They are created by the built-in\n ``set()`` constructor and can be modified afterwards by several\n methods, such as ``add()``.\n\n Frozen sets\n These represent an immutable set. They are created by the\n built-in ``frozenset()`` constructor. As a frozenset is\n immutable and *hashable*, it can be used again as an element of\n another set, or as a dictionary key.\n\nMappings\n These represent finite sets of objects indexed by arbitrary index\n sets. The subscript notation ``a[k]`` selects the item indexed by\n ``k`` from the mapping ``a``; this can be used in expressions and\n as the target of assignments or ``del`` statements. The built-in\n function ``len()`` returns the number of items in a mapping.\n\n There is currently a single intrinsic mapping type:\n\n Dictionaries\n These represent finite sets of objects indexed by nearly\n arbitrary values. The only types of values not acceptable as\n keys are values containing lists or dictionaries or other\n mutable types that are compared by value rather than by object\n identity, the reason being that the efficient implementation of\n dictionaries requires a key\'s hash value to remain constant.\n Numeric types used for keys obey the normal rules for numeric\n comparison: if two numbers compare equal (e.g., ``1`` and\n ``1.0``) then they can be used interchangeably to index the same\n dictionary entry.\n\n Dictionaries are mutable; they can be created by the ``{...}``\n notation (see section *Dictionary displays*).\n\n The extension modules ``dbm.ndbm`` and ``dbm.gnu`` provide\n additional examples of mapping types, as does the\n ``collections`` module.\n\nCallable types\n These are the types to which the function call operation (see\n section *Calls*) can be applied:\n\n User-defined functions\n A user-defined function object is created by a function\n definition (see section *Function definitions*). It should be\n called with an argument list containing the same number of items\n as the function\'s formal parameter list.\n\n Special attributes:\n\n +---------------------------+---------------------------------+-------------+\n | Attribute | Meaning | |\n +===========================+=================================+=============+\n | ``__doc__`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +---------------------------+---------------------------------+-------------+\n | ``__name__`` | The function\'s name | Writable |\n +---------------------------+---------------------------------+-------------+\n | ``__qualname__`` | The function\'s *qualified name* | Writable |\n | | New in version 3.3. | |\n +---------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +---------------------------+---------------------------------+-------------+\n | ``__defaults__`` | A tuple containing default | Writable |\n | | argument values for those | |\n | | arguments that have defaults, | |\n | | or ``None`` if no arguments | |\n | | have a default value | |\n +---------------------------+---------------------------------+-------------+\n | ``__code__`` | The code object representing | Writable |\n | | the compiled function body. | |\n +---------------------------+---------------------------------+-------------+\n | ``__globals__`` | A reference to the dictionary | Read-only |\n | | that holds the function\'s | |\n | | global variables --- the global | |\n | | namespace of the module in | |\n | | which the function was defined. | |\n +---------------------------+---------------------------------+-------------+\n | ``__dict__`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +---------------------------+---------------------------------+-------------+\n | ``__closure__`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +---------------------------+---------------------------------+-------------+\n | ``__annotations__`` | A dict containing annotations | Writable |\n | | of parameters. The keys of the | |\n | | dict are the parameter names, | |\n | | or ``\'return\'`` for the return | |\n | | annotation, if provided. | |\n +---------------------------+---------------------------------+-------------+\n | ``__kwdefaults__`` | A dict containing defaults for | Writable |\n | | keyword-only parameters. | |\n +---------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Function objects also support getting and setting arbitrary\n attributes, which can be used, for example, to attach metadata\n to functions. Regular attribute dot-notation is used to get and\n set such attributes. *Note that the current implementation only\n supports function attributes on user-defined functions. Function\n attributes on built-in functions may be supported in the\n future.*\n\n Additional information about a function\'s definition can be\n retrieved from its code object; see the description of internal\n types below.\n\n Instance methods\n An instance method object combines a class, a class instance and\n any callable object (normally a user-defined function).\n\n Special read-only attributes: ``__self__`` is the class instance\n object, ``__func__`` is the function object; ``__doc__`` is the\n method\'s documentation (same as ``__func__.__doc__``);\n ``__name__`` is the method name (same as ``__func__.__name__``);\n ``__module__`` is the name of the module the method was defined\n in, or ``None`` if unavailable.\n\n Methods also support accessing (but not setting) the arbitrary\n function attributes on the underlying function object.\n\n User-defined method objects may be created when getting an\n attribute of a class (perhaps via an instance of that class), if\n that attribute is a user-defined function object or a class\n method object.\n\n When an instance method object is created by retrieving a user-\n defined function object from a class via one of its instances,\n its ``__self__`` attribute is the instance, and the method\n object is said to be bound. The new method\'s ``__func__``\n attribute is the original function object.\n\n When a user-defined method object is created by retrieving\n another method object from a class or instance, the behaviour is\n the same as for a function object, except that the ``__func__``\n attribute of the new instance is not the original method object\n but its ``__func__`` attribute.\n\n When an instance method object is created by retrieving a class\n method object from a class or instance, its ``__self__``\n attribute is the class itself, and its ``__func__`` attribute is\n the function object underlying the class method.\n\n When an instance method object is called, the underlying\n function (``__func__``) is called, inserting the class instance\n (``__self__``) in front of the argument list. For instance,\n when ``C`` is a class which contains a definition for a function\n ``f()``, and ``x`` is an instance of ``C``, calling ``x.f(1)``\n is equivalent to calling ``C.f(x, 1)``.\n\n When an instance method object is derived from a class method\n object, the "class instance" stored in ``__self__`` will\n actually be the class itself, so that calling either ``x.f(1)``\n or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is\n the underlying function.\n\n Note that the transformation from function object to instance\n method object happens each time the attribute is retrieved from\n the instance. In some cases, a fruitful optimization is to\n assign the attribute to a local variable and call that local\n variable. Also notice that this transformation only happens for\n user-defined functions; other callable objects (and all non-\n callable objects) are retrieved without transformation. It is\n also important to note that user-defined functions which are\n attributes of a class instance are not converted to bound\n methods; this *only* happens when the function is an attribute\n of the class.\n\n Generator functions\n A function or method which uses the ``yield`` statement (see\n section *The yield statement*) is called a *generator function*.\n Such a function, when called, always returns an iterator object\n which can be used to execute the body of the function: calling\n the iterator\'s ``__next__()`` method will cause the function to\n execute until it provides a value using the ``yield`` statement.\n When the function executes a ``return`` statement or falls off\n the end, a ``StopIteration`` exception is raised and the\n iterator will have reached the end of the set of values to be\n returned.\n\n Built-in functions\n A built-in function object is a wrapper around a C function.\n Examples of built-in functions are ``len()`` and ``math.sin()``\n (``math`` is a standard built-in module). The number and type of\n the arguments are determined by the C function. Special read-\n only attributes: ``__doc__`` is the function\'s documentation\n string, or ``None`` if unavailable; ``__name__`` is the\n function\'s name; ``__self__`` is set to ``None`` (but see the\n next item); ``__module__`` is the name of the module the\n function was defined in or ``None`` if unavailable.\n\n Built-in methods\n This is really a different disguise of a built-in function, this\n time containing an object passed to the C function as an\n implicit extra argument. An example of a built-in method is\n ``alist.append()``, assuming *alist* is a list object. In this\n case, the special read-only attribute ``__self__`` is set to the\n object denoted by *alist*.\n\n Classes\n Classes are callable. These objects normally act as factories\n for new instances of themselves, but variations are possible for\n class types that override ``__new__()``. The arguments of the\n call are passed to ``__new__()`` and, in the typical case, to\n ``__init__()`` to initialize the new instance.\n\n Class Instances\n Instances of arbitrary classes can be made callable by defining\n a ``__call__()`` method in their class.\n\nModules\n Modules are a basic organizational unit of Python code, and are\n created by the *import system* as invoked either by the ``import``\n statement (see ``import``), or by calling functions such as\n ``importlib.import_module()`` and built-in ``__import__()``. A\n module object has a namespace implemented by a dictionary object\n (this is the dictionary referenced by the ``__globals__`` attribute\n of functions defined in the module). Attribute references are\n translated to lookups in this dictionary, e.g., ``m.x`` is\n equivalent to ``m.__dict__["x"]``. A module object does not contain\n the code object used to initialize the module (since it isn\'t\n needed once the initialization is done).\n\n Attribute assignment updates the module\'s namespace dictionary,\n e.g., ``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.\n\n Special read-only attribute: ``__dict__`` is the module\'s namespace\n as a dictionary object.\n\n **CPython implementation detail:** Because of the way CPython\n clears module dictionaries, the module dictionary will be cleared\n when the module falls out of scope even if the dictionary still has\n live references. To avoid this, copy the dictionary or keep the\n module around while using its dictionary directly.\n\n Predefined (writable) attributes: ``__name__`` is the module\'s\n name; ``__doc__`` is the module\'s documentation string, or ``None``\n if unavailable; ``__file__`` is the pathname of the file from which\n the module was loaded, if it was loaded from a file. The\n ``__file__`` attribute may be missing for certain types of modules,\n such as C modules that are statically linked into the interpreter;\n for extension modules loaded dynamically from a shared library, it\n is the pathname of the shared library file.\n\nCustom classes\n Custom class types are typically created by class definitions (see\n section *Class definitions*). A class has a namespace implemented\n by a dictionary object. Class attribute references are translated\n to lookups in this dictionary, e.g., ``C.x`` is translated to\n ``C.__dict__["x"]`` (although there are a number of hooks which\n allow for other means of locating attributes). When the attribute\n name is not found there, the attribute search continues in the base\n classes. This search of the base classes uses the C3 method\n resolution order which behaves correctly even in the presence of\n \'diamond\' inheritance structures where there are multiple\n inheritance paths leading back to a common ancestor. Additional\n details on the C3 MRO used by Python can be found in the\n documentation accompanying the 2.3 release at\n http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a class method object, it is transformed into an instance method\n object whose ``__self__`` attributes is ``C``. When it would yield\n a static method object, it is transformed into the object wrapped\n by the static method object. See section *Implementing Descriptors*\n for another way in which attributes retrieved from a class may\n differ from those actually contained in its ``__dict__``.\n\n Class attribute assignments update the class\'s dictionary, never\n the dictionary of a base class.\n\n A class object can be called (see above) to yield a class instance\n (see below).\n\n Special attributes: ``__name__`` is the class name; ``__module__``\n is the module name in which the class was defined; ``__dict__`` is\n the dictionary containing the class\'s namespace; ``__bases__`` is a\n tuple (possibly empty or a singleton) containing the base classes,\n in the order of their occurrence in the base class list;\n ``__doc__`` is the class\'s documentation string, or None if\n undefined.\n\nClass instances\n A class instance is created by calling a class object (see above).\n A class instance has a namespace implemented as a dictionary which\n is the first place in which attribute references are searched.\n When an attribute is not found there, and the instance\'s class has\n an attribute by that name, the search continues with the class\n attributes. If a class attribute is found that is a user-defined\n function object, it is transformed into an instance method object\n whose ``__self__`` attribute is the instance. Static method and\n class method objects are also transformed; see above under\n "Classes". See section *Implementing Descriptors* for another way\n in which attributes of a class retrieved via its instances may\n differ from the objects actually stored in the class\'s\n ``__dict__``. If no class attribute is found, and the object\'s\n class has a ``__getattr__()`` method, that is called to satisfy the\n lookup.\n\n Attribute assignments and deletions update the instance\'s\n dictionary, never a class\'s dictionary. If the class has a\n ``__setattr__()`` or ``__delattr__()`` method, this is called\n instead of updating the instance dictionary directly.\n\n Class instances can pretend to be numbers, sequences, or mappings\n if they have methods with certain special names. See section\n *Special method names*.\n\n Special attributes: ``__dict__`` is the attribute dictionary;\n ``__class__`` is the instance\'s class.\n\nI/O objects (also known as file objects)\n A *file object* represents an open file. Various shortcuts are\n available to create file objects: the ``open()`` built-in function,\n and also ``os.popen()``, ``os.fdopen()``, and the ``makefile()``\n method of socket objects (and perhaps by other functions or methods\n provided by extension modules).\n\n The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are\n initialized to file objects corresponding to the interpreter\'s\n standard input, output and error streams; they are all open in text\n mode and therefore follow the interface defined by the\n ``io.TextIOBase`` abstract class.\n\nInternal types\n A few types used internally by the interpreter are exposed to the\n user. Their definitions may change with future versions of the\n interpreter, but they are mentioned here for completeness.\n\n Code objects\n Code objects represent *byte-compiled* executable Python code,\n or *bytecode*. The difference between a code object and a\n function object is that the function object contains an explicit\n reference to the function\'s globals (the module in which it was\n defined), while a code object contains no context; also the\n default argument values are stored in the function object, not\n in the code object (because they represent values calculated at\n run-time). Unlike function objects, code objects are immutable\n and contain no references (directly or indirectly) to mutable\n objects.\n\n Special read-only attributes: ``co_name`` gives the function\n name; ``co_argcount`` is the number of positional arguments\n (including arguments with default values); ``co_nlocals`` is the\n number of local variables used by the function (including\n arguments); ``co_varnames`` is a tuple containing the names of\n the local variables (starting with the argument names);\n ``co_cellvars`` is a tuple containing the names of local\n variables that are referenced by nested functions;\n ``co_freevars`` is a tuple containing the names of free\n variables; ``co_code`` is a string representing the sequence of\n bytecode instructions; ``co_consts`` is a tuple containing the\n literals used by the bytecode; ``co_names`` is a tuple\n containing the names used by the bytecode; ``co_filename`` is\n the filename from which the code was compiled;\n ``co_firstlineno`` is the first line number of the function;\n ``co_lnotab`` is a string encoding the mapping from bytecode\n offsets to line numbers (for details see the source code of the\n interpreter); ``co_stacksize`` is the required stack size\n (including local variables); ``co_flags`` is an integer encoding\n a number of flags for the interpreter.\n\n The following flag bits are defined for ``co_flags``: bit\n ``0x04`` is set if the function uses the ``*arguments`` syntax\n to accept an arbitrary number of positional arguments; bit\n ``0x08`` is set if the function uses the ``**keywords`` syntax\n to accept arbitrary keyword arguments; bit ``0x20`` is set if\n the function is a generator.\n\n Future feature declarations (``from __future__ import\n division``) also use bits in ``co_flags`` to indicate whether a\n code object was compiled with a particular feature enabled: bit\n ``0x2000`` is set if the function was compiled with future\n division enabled; bits ``0x10`` and ``0x1000`` were used in\n earlier versions of Python.\n\n Other bits in ``co_flags`` are reserved for internal use.\n\n If a code object represents a function, the first item in\n ``co_consts`` is the documentation string of the function, or\n ``None`` if undefined.\n\n Frame objects\n Frame objects represent execution frames. They may occur in\n traceback objects (see below).\n\n Special read-only attributes: ``f_back`` is to the previous\n stack frame (towards the caller), or ``None`` if this is the\n bottom stack frame; ``f_code`` is the code object being executed\n in this frame; ``f_locals`` is the dictionary used to look up\n local variables; ``f_globals`` is used for global variables;\n ``f_builtins`` is used for built-in (intrinsic) names;\n ``f_lasti`` gives the precise instruction (this is an index into\n the bytecode string of the code object).\n\n Special writable attributes: ``f_trace``, if not ``None``, is a\n function called at the start of each source code line (this is\n used by the debugger); ``f_lineno`` is the current line number\n of the frame --- writing to this from within a trace function\n jumps to the given line (only for the bottom-most frame). A\n debugger can implement a Jump command (aka Set Next Statement)\n by writing to f_lineno.\n\n Traceback objects\n Traceback objects represent a stack trace of an exception. A\n traceback object is created when an exception occurs. When the\n search for an exception handler unwinds the execution stack, at\n each unwound level a traceback object is inserted in front of\n the current traceback. When an exception handler is entered,\n the stack trace is made available to the program. (See section\n *The try statement*.) It is accessible as the third item of the\n tuple returned by ``sys.exc_info()``. When the program contains\n no suitable handler, the stack trace is written (nicely\n formatted) to the standard error stream; if the interpreter is\n interactive, it is also made available to the user as\n ``sys.last_traceback``.\n\n Special read-only attributes: ``tb_next`` is the next level in\n the stack trace (towards the frame where the exception\n occurred), or ``None`` if there is no next level; ``tb_frame``\n points to the execution frame of the current level;\n ``tb_lineno`` gives the line number where the exception\n occurred; ``tb_lasti`` indicates the precise instruction. The\n line number and last instruction in the traceback may differ\n from the line number of its frame object if the exception\n occurred in a ``try`` statement with no matching except clause\n or with a finally clause.\n\n Slice objects\n Slice objects are used to represent slices for ``__getitem__()``\n methods. They are also created by the built-in ``slice()``\n function.\n\n Special read-only attributes: ``start`` is the lower bound;\n ``stop`` is the upper bound; ``step`` is the step value; each is\n ``None`` if omitted. These attributes can have any type.\n\n Slice objects support one method:\n\n slice.indices(self, length)\n\n This method takes a single integer argument *length* and\n computes information about the slice that the slice object\n would describe if applied to a sequence of *length* items.\n It returns a tuple of three integers; respectively these are\n the *start* and *stop* indices and the *step* or stride\n length of the slice. Missing or out-of-bounds indices are\n handled in a manner consistent with regular slices.\n\n Static method objects\n Static method objects provide a way of defeating the\n transformation of function objects to method objects described\n above. A static method object is a wrapper around any other\n object, usually a user-defined method object. When a static\n method object is retrieved from a class or a class instance, the\n object actually returned is the wrapped object, which is not\n subject to any further transformation. Static method objects are\n not themselves callable, although the objects they wrap usually\n are. Static method objects are created by the built-in\n ``staticmethod()`` constructor.\n\n Class method objects\n A class method object, like a static method object, is a wrapper\n around another object that alters the way in which that object\n is retrieved from classes and class instances. The behaviour of\n class method objects upon such retrieval is described above,\n under "User-defined methods". Class method objects are created\n by the built-in ``classmethod()`` constructor.\n',
'typesfunctions': '\nFunctions\n*********\n\nFunction objects are created by function definitions. The only\noperation on a function object is to call it: ``func(argument-list)``.\n\nThere are really two flavors of function objects: built-in functions\nand user-defined functions. Both support the same operation (to call\nthe function), but the implementation is different, hence the\ndifferent object types.\n\nSee *Function definitions* for more information.\n',
- 'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects. There is currently only one standard\nmapping type, the *dictionary*. (For other containers see the built\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values. Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys. Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry. (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict([arg])\n\n Return a new dictionary initialized from an optional positional\n argument or from a set of keyword arguments. If no arguments are\n given, return a new empty dictionary. If the positional argument\n *arg* is a mapping object, return a dictionary mapping the same\n keys to the same values as does the mapping object. Otherwise the\n positional argument must be a sequence, a container that supports\n iteration, or an iterator object. The elements of the argument\n must each also be of one of those kinds, and each must in turn\n contain exactly two objects. The first is used as a key in the new\n dictionary, and the second as the key\'s value. If a given key is\n seen more than once, the last value associated with it is retained\n in the new dictionary.\n\n If keyword arguments are given, the keywords themselves with their\n associated values are added as items to the dictionary. If a key\n is specified both in the positional argument and as a keyword\n argument, the value associated with the keyword is retained in the\n dictionary. For example, these all return a dictionary equal to\n ``{"one": 1, "two": 2}``:\n\n * ``dict(one=1, two=2)``\n\n * ``dict({\'one\': 1, \'two\': 2})``\n\n * ``dict(zip((\'one\', \'two\'), (1, 2)))``\n\n * ``dict([[\'two\', 2], [\'one\', 1]])``\n\n The first example only works for keys that are valid Python\n identifiers; the others work with any valid keys.\n\n These are the operations that dictionaries support (and therefore,\n custom mapping types should support too):\n\n len(d)\n\n Return the number of items in the dictionary *d*.\n\n d[key]\n\n Return the item of *d* with key *key*. Raises a ``KeyError`` if\n *key* is not in the map.\n\n If a subclass of dict defines a method ``__missing__()``, if the\n key *key* is not present, the ``d[key]`` operation calls that\n method with the key *key* as argument. The ``d[key]`` operation\n then returns or raises whatever is returned or raised by the\n ``__missing__(key)`` call if the key is not present. No other\n operations or methods invoke ``__missing__()``. If\n ``__missing__()`` is not defined, ``KeyError`` is raised.\n ``__missing__()`` must be a method; it cannot be an instance\n variable:\n\n >>> class Counter(dict):\n ... def __missing__(self, key):\n ... return 0\n >>> c = Counter()\n >>> c[\'red\']\n 0\n >>> c[\'red\'] += 1\n >>> c[\'red\']\n 1\n\n See ``collections.Counter`` for a complete implementation\n including other methods helpful for accumulating and managing\n tallies.\n\n d[key] = value\n\n Set ``d[key]`` to *value*.\n\n del d[key]\n\n Remove ``d[key]`` from *d*. Raises a ``KeyError`` if *key* is\n not in the map.\n\n key in d\n\n Return ``True`` if *d* has a key *key*, else ``False``.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iter(d.keys())``.\n\n clear()\n\n Remove all items from the dictionary.\n\n copy()\n\n Return a shallow copy of the dictionary.\n\n classmethod fromkeys(seq[, value])\n\n Create a new dictionary with keys from *seq* and values set to\n *value*.\n\n ``fromkeys()`` is a class method that returns a new dictionary.\n *value* defaults to ``None``.\n\n get(key[, default])\n\n Return the value for *key* if *key* is in the dictionary, else\n *default*. If *default* is not given, it defaults to ``None``,\n so that this method never raises a ``KeyError``.\n\n items()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n keys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n pop(key[, default])\n\n If *key* is in the dictionary, remove it and return its value,\n else return *default*. If *default* is not given and *key* is\n not in the dictionary, a ``KeyError`` is raised.\n\n popitem()\n\n Remove and return an arbitrary ``(key, value)`` pair from the\n dictionary.\n\n ``popitem()`` is useful to destructively iterate over a\n dictionary, as often used in set algorithms. If the dictionary\n is empty, calling ``popitem()`` raises a ``KeyError``.\n\n setdefault(key[, default])\n\n If *key* is in the dictionary, return its value. If not, insert\n *key* with a value of *default* and return *default*. *default*\n defaults to ``None``.\n\n update([other])\n\n Update the dictionary with the key/value pairs from *other*,\n overwriting existing keys. Return ``None``.\n\n ``update()`` accepts either another dictionary object or an\n iterable of key/value pairs (as tuples or other iterables of\n length two). If keyword arguments are specified, the dictionary\n is then updated with those key/value pairs: ``d.update(red=1,\n blue=2)``.\n\n values()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.keys()``, ``dict.values()`` and\n``dict.items()`` are *view objects*. They provide a dynamic view on\nthe dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n Return the number of entries in the dictionary.\n\niter(dictview)\n\n Return an iterator over the keys, values or items (represented as\n tuples of ``(key, value)``) in the dictionary.\n\n Keys and values are iterated over in an arbitrary order which is\n non-random, varies across Python implementations, and depends on\n the dictionary\'s history of insertions and deletions. If keys,\n values and items views are iterated over with no intervening\n modifications to the dictionary, the order of items will directly\n correspond. This allows the creation of ``(value, key)`` pairs\n using ``zip()``: ``pairs = zip(d.values(), d.keys())``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.items()]``.\n\n Iterating views while adding or deleting entries in the dictionary\n may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n Return ``True`` if *x* is in the underlying dictionary\'s keys,\n values or items (in the latter case, *x* should be a ``(key,\n value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that ``(key, value)`` pairs are unique\nand hashable, then the items view is also set-like. (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class ``collections.Set`` are available (for example, ``==``,\n``<``, or ``^``).\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.keys()\n >>> values = dishes.values()\n\n >>> # iteration\n >>> n = 0\n >>> for val in values:\n ... n += val\n >>> print(n)\n 504\n\n >>> # keys and values are iterated over in the same order\n >>> list(keys)\n [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n >>> list(values)\n [2, 1, 1, 500]\n\n >>> # view objects are dynamic and reflect dict changes\n >>> del dishes[\'eggs\']\n >>> del dishes[\'sausage\']\n >>> list(keys)\n [\'spam\', \'bacon\']\n\n >>> # set operations\n >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n {\'bacon\'}\n >>> keys ^ {\'sausage\', \'juice\'}\n {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n',
+ 'typesmapping': '\nMapping Types --- ``dict``\n**************************\n\nA *mapping* object maps *hashable* values to arbitrary objects.\nMappings are mutable objects. There is currently only one standard\nmapping type, the *dictionary*. (For other containers see the built-\nin ``list``, ``set``, and ``tuple`` classes, and the ``collections``\nmodule.)\n\nA dictionary\'s keys are *almost* arbitrary values. Values that are\nnot *hashable*, that is, values containing lists, dictionaries or\nother mutable types (that are compared by value rather than by object\nidentity) may not be used as keys. Numeric types used for keys obey\nthe normal rules for numeric comparison: if two numbers compare equal\n(such as ``1`` and ``1.0``) then they can be used interchangeably to\nindex the same dictionary entry. (Note however, that since computers\nstore floating-point numbers as approximations it is usually unwise to\nuse them as dictionary keys.)\n\nDictionaries can be created by placing a comma-separated list of\n``key: value`` pairs within braces, for example: ``{\'jack\': 4098,\n\'sjoerd\': 4127}`` or ``{4098: \'jack\', 4127: \'sjoerd\'}``, or by the\n``dict`` constructor.\n\nclass class dict([arg])\n\n Return a new dictionary initialized from an optional positional\n argument or from a set of keyword arguments. If no arguments are\n given, return a new empty dictionary. If the positional argument\n *arg* is a mapping object, return a dictionary mapping the same\n keys to the same values as does the mapping object. Otherwise the\n positional argument must be a sequence, a container that supports\n iteration, or an iterator object. The elements of the argument\n must each also be of one of those kinds, and each must in turn\n contain exactly two objects. The first is used as a key in the new\n dictionary, and the second as the key\'s value. If a given key is\n seen more than once, the last value associated with it is retained\n in the new dictionary.\n\n If keyword arguments are given, the keywords themselves with their\n associated values are added as items to the dictionary. If a key\n is specified both in the positional argument and as a keyword\n argument, the value associated with the keyword is retained in the\n dictionary. For example, these all return a dictionary equal to\n ``{"one": 1, "two": 2}``:\n\n * ``dict(one=1, two=2)``\n\n * ``dict({\'one\': 1, \'two\': 2})``\n\n * ``dict(zip((\'one\', \'two\'), (1, 2)))``\n\n * ``dict([[\'two\', 2], [\'one\', 1]])``\n\n The first example only works for keys that are valid Python\n identifiers; the others work with any valid keys.\n\n These are the operations that dictionaries support (and therefore,\n custom mapping types should support too):\n\n len(d)\n\n Return the number of items in the dictionary *d*.\n\n d[key]\n\n Return the item of *d* with key *key*. Raises a ``KeyError`` if\n *key* is not in the map.\n\n If a subclass of dict defines a method ``__missing__()``, if the\n key *key* is not present, the ``d[key]`` operation calls that\n method with the key *key* as argument. The ``d[key]`` operation\n then returns or raises whatever is returned or raised by the\n ``__missing__(key)`` call if the key is not present. No other\n operations or methods invoke ``__missing__()``. If\n ``__missing__()`` is not defined, ``KeyError`` is raised.\n ``__missing__()`` must be a method; it cannot be an instance\n variable:\n\n >>> class Counter(dict):\n ... def __missing__(self, key):\n ... return 0\n >>> c = Counter()\n >>> c[\'red\']\n 0\n >>> c[\'red\'] += 1\n >>> c[\'red\']\n 1\n\n See ``collections.Counter`` for a complete implementation\n including other methods helpful for accumulating and managing\n tallies.\n\n d[key] = value\n\n Set ``d[key]`` to *value*.\n\n del d[key]\n\n Remove ``d[key]`` from *d*. Raises a ``KeyError`` if *key* is\n not in the map.\n\n key in d\n\n Return ``True`` if *d* has a key *key*, else ``False``.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iter(d.keys())``.\n\n clear()\n\n Remove all items from the dictionary.\n\n copy()\n\n Return a shallow copy of the dictionary.\n\n classmethod fromkeys(seq[, value])\n\n Create a new dictionary with keys from *seq* and values set to\n *value*.\n\n ``fromkeys()`` is a class method that returns a new dictionary.\n *value* defaults to ``None``.\n\n get(key[, default])\n\n Return the value for *key* if *key* is in the dictionary, else\n *default*. If *default* is not given, it defaults to ``None``,\n so that this method never raises a ``KeyError``.\n\n items()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See the *documentation of view objects*.\n\n keys()\n\n Return a new view of the dictionary\'s keys. See the\n *documentation of view objects*.\n\n pop(key[, default])\n\n If *key* is in the dictionary, remove it and return its value,\n else return *default*. If *default* is not given and *key* is\n not in the dictionary, a ``KeyError`` is raised.\n\n popitem()\n\n Remove and return an arbitrary ``(key, value)`` pair from the\n dictionary.\n\n ``popitem()`` is useful to destructively iterate over a\n dictionary, as often used in set algorithms. If the dictionary\n is empty, calling ``popitem()`` raises a ``KeyError``.\n\n setdefault(key[, default])\n\n If *key* is in the dictionary, return its value. If not, insert\n *key* with a value of *default* and return *default*. *default*\n defaults to ``None``.\n\n update([other])\n\n Update the dictionary with the key/value pairs from *other*,\n overwriting existing keys. Return ``None``.\n\n ``update()`` accepts either another dictionary object or an\n iterable of key/value pairs (as tuples or other iterables of\n length two). If keyword arguments are specified, the dictionary\n is then updated with those key/value pairs: ``d.update(red=1,\n blue=2)``.\n\n values()\n\n Return a new view of the dictionary\'s values. See the\n *documentation of view objects*.\n\nSee also:\n\n ``types.MappingProxyType`` can be used to create a read-only view\n of a ``dict``.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.keys()``, ``dict.values()`` and\n``dict.items()`` are *view objects*. They provide a dynamic view on\nthe dictionary\'s entries, which means that when the dictionary\nchanges, the view reflects these changes.\n\nDictionary views can be iterated over to yield their respective data,\nand support membership tests:\n\nlen(dictview)\n\n Return the number of entries in the dictionary.\n\niter(dictview)\n\n Return an iterator over the keys, values or items (represented as\n tuples of ``(key, value)``) in the dictionary.\n\n Keys and values are iterated over in an arbitrary order which is\n non-random, varies across Python implementations, and depends on\n the dictionary\'s history of insertions and deletions. If keys,\n values and items views are iterated over with no intervening\n modifications to the dictionary, the order of items will directly\n correspond. This allows the creation of ``(value, key)`` pairs\n using ``zip()``: ``pairs = zip(d.values(), d.keys())``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.items()]``.\n\n Iterating views while adding or deleting entries in the dictionary\n may raise a ``RuntimeError`` or fail to iterate over all entries.\n\nx in dictview\n\n Return ``True`` if *x* is in the underlying dictionary\'s keys,\n values or items (in the latter case, *x* should be a ``(key,\n value)`` tuple).\n\nKeys views are set-like since their entries are unique and hashable.\nIf all values are hashable, so that ``(key, value)`` pairs are unique\nand hashable, then the items view is also set-like. (Values views are\nnot treated as set-like since the entries are generally not unique.)\nFor set-like views, all of the operations defined for the abstract\nbase class ``collections.abc.Set`` are available (for example, ``==``,\n``<``, or ``^``).\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.keys()\n >>> values = dishes.values()\n\n >>> # iteration\n >>> n = 0\n >>> for val in values:\n ... n += val\n >>> print(n)\n 504\n\n >>> # keys and values are iterated over in the same order\n >>> list(keys)\n [\'eggs\', \'bacon\', \'sausage\', \'spam\']\n >>> list(values)\n [2, 1, 1, 500]\n\n >>> # view objects are dynamic and reflect dict changes\n >>> del dishes[\'eggs\']\n >>> del dishes[\'sausage\']\n >>> list(keys)\n [\'spam\', \'bacon\']\n\n >>> # set operations\n >>> keys & {\'eggs\', \'bacon\', \'salad\'}\n {\'bacon\'}\n >>> keys ^ {\'sausage\', \'juice\'}\n {\'juice\', \'sausage\', \'bacon\', \'spam\'}\n',
'typesmethods': "\nMethods\n*******\n\nMethods are functions that are called using the attribute notation.\nThere are two flavors: built-in methods (such as ``append()`` on\nlists) and class instance methods. Built-in methods are described\nwith the types that support them.\n\nIf you access a method (a function defined in a class namespace)\nthrough an instance, you get a special object: a *bound method* (also\ncalled *instance method*) object. When called, it will add the\n``self`` argument to the argument list. Bound methods have two\nspecial read-only attributes: ``m.__self__`` is the object on which\nthe method operates, and ``m.__func__`` is the function implementing\nthe method. Calling ``m(arg-1, arg-2, ..., arg-n)`` is completely\nequivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, ...,\narg-n)``.\n\nLike function objects, bound method objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.__func__``), setting method\nattributes on bound methods is disallowed. Attempting to set a method\nattribute results in a ``TypeError`` being raised. In order to set a\nmethod attribute, you need to explicitly set it on the underlying\nfunction object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.__func__.whoami = 'my name is c'\n\nSee *The standard type hierarchy* for more information.\n",
'typesmodules': "\nModules\n*******\n\nThe only special operation on a module is attribute access:\n``m.name``, where *m* is a module and *name* accesses a name defined\nin *m*'s symbol table. Module attributes can be assigned to. (Note\nthat the ``import`` statement is not, strictly speaking, an operation\non a module object; ``import foo`` does not require a module object\nnamed *foo* to exist, rather it requires an (external) *definition*\nfor a module named *foo* somewhere.)\n\nA special attribute of every module is ``__dict__``. This is the\ndictionary containing the module's symbol table. Modifying this\ndictionary will actually change the module's symbol table, but direct\nassignment to the ``__dict__`` attribute is not possible (you can\nwrite ``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but\nyou can't write ``m.__dict__ = {}``). Modifying ``__dict__`` directly\nis not recommended.\n\nModules built into the interpreter are written like this: ``<module\n'sys' (built-in)>``. If loaded from a file, they are written as\n``<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>``.\n",
- 'typesseq': '\nSequence Types --- ``str``, ``bytes``, ``bytearray``, ``list``, ``tuple``, ``range``\n************************************************************************************\n\nThere are six sequence types: strings, byte sequences (``bytes``\nobjects), byte arrays (``bytearray`` objects), lists, tuples, and\nrange objects. For other containers see the built in ``dict`` and\n``set`` classes, and the ``collections`` module.\n\nStrings contain Unicode characters. Their literals are written in\nsingle or double quotes: ``\'xyzzy\'``, ``"frobozz"``. See *String and\nBytes literals* for more about string literals. In addition to the\nfunctionality described here, there are also string-specific methods\ndescribed in the *String Methods* section.\n\nBytes and bytearray objects contain single bytes -- the former is\nimmutable while the latter is a mutable sequence. Bytes objects can\nbe constructed the constructor, ``bytes()``, and from literals; use a\n``b`` prefix with normal string syntax: ``b\'xyzzy\'``. To construct\nbyte arrays, use the ``bytearray()`` function.\n\nWhile string objects are sequences of characters (represented by\nstrings of length 1), bytes and bytearray objects are sequences of\n*integers* (between 0 and 255), representing the ASCII value of single\nbytes. That means that for a bytes or bytearray object *b*, ``b[0]``\nwill be an integer, while ``b[0:1]`` will be a bytes or bytearray\nobject of length 1. The representation of bytes objects uses the\nliteral format (``b\'...\'``) since it is generally more useful than\ne.g. ``bytes([50, 19, 100])``. You can always convert a bytes object\ninto a list of integers using ``list(b)``.\n\nAlso, while in previous Python versions, byte strings and Unicode\nstrings could be exchanged for each other rather freely (barring\nencoding issues), strings and bytes are now completely separate\nconcepts. There\'s no implicit en-/decoding if you pass an object of\nthe wrong type. A string always compares unequal to a bytes or\nbytearray object.\n\nLists are constructed with square brackets, separating items with\ncommas: ``[a, b, c]``. Tuples are constructed by the comma operator\n(not within square brackets), with or without enclosing parentheses,\nbut an empty tuple must have the enclosing parentheses, such as ``a,\nb, c`` or ``()``. A single item tuple must have a trailing comma,\nsuch as ``(d,)``.\n\nObjects of type range are created using the ``range()`` function.\nThey don\'t support concatenation or repetition, and using ``min()`` or\n``max()`` on them is inefficient.\n\nMost sequence types support the following operations. The ``in`` and\n``not in`` operations have the same priorities as the comparison\noperations. The ``+`` and ``*`` operations have the same priority as\nthe corresponding numeric operations. [3] Additional methods are\nprovided for *Mutable Sequence Types*.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type; *n*, *i*, *j* and *k* are\nintegers.\n\n+--------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+====================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+--------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+--------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6) |\n+--------------------+----------------------------------+------------+\n| ``s * n, n * s`` | *n* shallow copies of *s* | (2) |\n| | concatenated | |\n+--------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+--------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+--------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+--------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+--------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+--------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+--------------------+----------------------------------+------------+\n| ``s.index(i)`` | index of the first occurence of | |\n| | *i* in *s* | |\n+--------------------+----------------------------------+------------+\n| ``s.count(i)`` | total number of occurences of | |\n| | *i* in *s* | |\n+--------------------+----------------------------------+------------+\n\nSequence types also support comparisons. In particular, tuples and\nlists are compared lexicographically by comparing corresponding\nelements. This means that to compare equal, every element must\ncompare equal and the two sequences must be of the same type and have\nthe same length. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string object, the ``in`` and ``not in`` operations\n act like a substring test.\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable strings always results in a new object.\n This means that building up a string by repeated concatenation will\n have a quadratic runtime cost in the total string length. To get a\n linear runtime cost, you must switch to one of the alternatives\n below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end;\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()``, or you can do in-place concatenation with a\n ``bytearray`` object. ``bytearray`` objects are mutable and have\n an efficient overallocation mechanism.\n\n\nString Methods\n==============\n\nString objects support the methods listed below.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, bytes, bytearray, list,\ntuple, range* section. To output formatted strings, see the *String\nFormatting* section. Also, see the ``re`` module for string functions\nbased on regular expressions.\n\nstr.capitalize()\n\n Return a copy of the string with its first character capitalized\n and the rest lowercased.\n\nstr.center(width[, fillchar])\n\n Return centered in a string of length *width*. Padding is done\n using the specified *fillchar* (default is a space).\n\nstr.count(sub[, start[, end]])\n\n Return the number of non-overlapping occurrences of substring *sub*\n in the range [*start*, *end*]. Optional arguments *start* and\n *end* are interpreted as in slice notation.\n\nstr.encode(encoding="utf-8", errors="strict")\n\n Return an encoded version of the string as a bytes object. Default\n encoding is ``\'utf-8\'``. *errors* may be given to set a different\n error handling scheme. The default for *errors* is ``\'strict\'``,\n meaning that encoding errors raise a ``UnicodeError``. Other\n possible values are ``\'ignore\'``, ``\'replace\'``,\n ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Support for keyword arguments added.\n\nstr.endswith(suffix[, start[, end]])\n\n Return ``True`` if the string ends with the specified *suffix*,\n otherwise return ``False``. *suffix* can also be a tuple of\n suffixes to look for. With optional *start*, test beginning at\n that position. With optional *end*, stop comparing at that\n position.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by zero or more spaces, depending on the current column and the\n given tab size. The column number is reset to zero after each\n newline occurring in the string. If *tabsize* is not given, a tab\n size of ``8`` characters is assumed. This doesn\'t understand other\n non-printing characters or escape sequences.\n\nstr.find(sub[, start[, end]])\n\n Return the lowest index in the string where substring *sub* is\n found, such that *sub* is contained in the slice ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` if *sub* is not found.\n\n Note: The ``find()`` method should be used only if you need to know the\n position of *sub*. To check if *sub* is a substring or not, use\n the ``in`` operator:\n\n >>> \'Py\' in \'Python\'\n True\n\nstr.format(*args, **kwargs)\n\n Perform a string formatting operation. The string on which this\n method is called can contain literal text or replacement fields\n delimited by braces ``{}``. Each replacement field contains either\n the numeric index of a positional argument, or the name of a\n keyword argument. Returns a copy of the string where each\n replacement field is replaced with the string value of the\n corresponding argument.\n\n >>> "The sum of 1 + 2 is {0}".format(1+2)\n \'The sum of 1 + 2 is 3\'\n\n See *Format String Syntax* for a description of the various\n formatting options that can be specified in format strings.\n\nstr.format_map(mapping)\n\n Similar to ``str.format(**mapping)``, except that ``mapping`` is\n used directly and not copied to a ``dict`` . This is useful if for\n example ``mapping`` is a dict subclass:\n\n >>> class Default(dict):\n ... def __missing__(self, key):\n ... return key\n ...\n >>> \'{name} was born in {country}\'.format_map(Default(name=\'Guido\'))\n \'Guido was born in country\'\n\n New in version 3.2.\n\nstr.index(sub[, start[, end]])\n\n Like ``find()``, but raise ``ValueError`` when the substring is not\n found.\n\nstr.isalnum()\n\n Return true if all characters in the string are alphanumeric and\n there is at least one character, false otherwise. A character\n ``c`` is alphanumeric if one of the following returns ``True``:\n ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()``, or\n ``c.isnumeric()``.\n\nstr.isalpha()\n\n Return true if all characters in the string are alphabetic and\n there is at least one character, false otherwise. Alphabetic\n characters are those characters defined in the Unicode character\n database as "Letter", i.e., those with general category property\n being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is\n different from the "Alphabetic" property defined in the Unicode\n Standard.\n\nstr.isdecimal()\n\n Return true if all characters in the string are decimal characters\n and there is at least one character, false otherwise. Decimal\n characters are those from general category "Nd". This category\n includes digit characters, and all characters that can be used to\n form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\nstr.isdigit()\n\n Return true if all characters in the string are digits and there is\n at least one character, false otherwise. Digits include decimal\n characters and digits that need special handling, such as the\n compatibility superscript digits. Formally, a digit is a character\n that has the property value Numeric_Type=Digit or\n Numeric_Type=Decimal.\n\nstr.isidentifier()\n\n Return true if the string is a valid identifier according to the\n language definition, section *Identifiers and keywords*.\n\nstr.islower()\n\n Return true if all cased characters [4] in the string are lowercase\n and there is at least one cased character, false otherwise.\n\nstr.isnumeric()\n\n Return true if all characters in the string are numeric characters,\n and there is at least one character, false otherwise. Numeric\n characters include digit characters, and all characters that have\n the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION\n ONE FIFTH. Formally, numeric characters are those with the\n property value Numeric_Type=Digit, Numeric_Type=Decimal or\n Numeric_Type=Numeric.\n\nstr.isprintable()\n\n Return true if all characters in the string are printable or the\n string is empty, false otherwise. Nonprintable characters are\n those characters defined in the Unicode character database as\n "Other" or "Separator", excepting the ASCII space (0x20) which is\n considered printable. (Note that printable characters in this\n context are those which should not be escaped when ``repr()`` is\n invoked on a string. It has no bearing on the handling of strings\n written to ``sys.stdout`` or ``sys.stderr``.)\n\nstr.isspace()\n\n Return true if there are only whitespace characters in the string\n and there is at least one character, false otherwise. Whitespace\n characters are those characters defined in the Unicode character\n database as "Other" or "Separator" and those with bidirectional\n property being one of "WS", "B", or "S".\n\nstr.istitle()\n\n Return true if the string is a titlecased string and there is at\n least one character, for example uppercase characters may only\n follow uncased characters and lowercase characters only cased ones.\n Return false otherwise.\n\nstr.isupper()\n\n Return true if all cased characters [4] in the string are uppercase\n and there is at least one cased character, false otherwise.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. A ``TypeError`` will be raised if there are\n any non-string values in *iterable*, including ``bytes`` objects.\n The separator between elements is the string providing this method.\n\nstr.ljust(width[, fillchar])\n\n Return the string left justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\nstr.lstrip([chars])\n\n Return a copy of the string with leading characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a prefix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.lstrip()\n \'spacious \'\n >>> \'www.example.com\'.lstrip(\'cmowz.\')\n \'example.com\'\n\nstatic str.maketrans(x[, y[, z]])\n\n This static method returns a translation table usable for\n ``str.translate()``.\n\n If there is only one argument, it must be a dictionary mapping\n Unicode ordinals (integers) or characters (strings of length 1) to\n Unicode ordinals, strings (of arbitrary lengths) or None.\n Character keys will then be converted to ordinals.\n\n If there are two arguments, they must be strings of equal length,\n and in the resulting dictionary, each character in x will be mapped\n to the character at the same position in y. If there is a third\n argument, it must be a string, whose characters will be mapped to\n None in the result.\n\nstr.partition(sep)\n\n Split the string at the first occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing the string itself, followed by\n two empty strings.\n\nstr.replace(old, new[, count])\n\n Return a copy of the string with all occurrences of substring *old*\n replaced by *new*. If the optional argument *count* is given, only\n the first *count* occurrences are replaced.\n\nstr.rfind(sub[, start[, end]])\n\n Return the highest index in the string where substring *sub* is\n found, such that *sub* is contained within ``s[start:end]``.\n Optional arguments *start* and *end* are interpreted as in slice\n notation. Return ``-1`` on failure.\n\nstr.rindex(sub[, start[, end]])\n\n Like ``rfind()`` but raises ``ValueError`` when the substring *sub*\n is not found.\n\nstr.rjust(width[, fillchar])\n\n Return the string right justified in a string of length *width*.\n Padding is done using the specified *fillchar* (default is a\n space). The original string is returned if *width* is less than or\n equal to ``len(s)``.\n\nstr.rpartition(sep)\n\n Split the string at the last occurrence of *sep*, and return a\n 3-tuple containing the part before the separator, the separator\n itself, and the part after the separator. If the separator is not\n found, return a 3-tuple containing two empty strings, followed by\n the string itself.\n\nstr.rsplit([sep[, maxsplit]])\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit* splits\n are done, the *rightmost* ones. If *sep* is not specified or\n ``None``, any whitespace string is a separator. Except for\n splitting from the right, ``rsplit()`` behaves like ``split()``\n which is described in detail below.\n\nstr.rstrip([chars])\n\n Return a copy of the string with trailing characters removed. The\n *chars* argument is a string specifying the set of characters to be\n removed. If omitted or ``None``, the *chars* argument defaults to\n removing whitespace. The *chars* argument is not a suffix; rather,\n all combinations of its values are stripped:\n\n >>> \' spacious \'.rstrip()\n \' spacious\'\n >>> \'mississippi\'.rstrip(\'ipz\')\n \'mississ\'\n\nstr.split([sep[, maxsplit]])\n\n Return a list of the words in the string, using *sep* as the\n delimiter string. If *maxsplit* is given, at most *maxsplit*\n splits are done (thus, the list will have at most ``maxsplit+1``\n elements). If *maxsplit* is not specified, then there is no limit\n on the number of splits (all possible splits are made).\n\n If *sep* is given, consecutive delimiters are not grouped together\n and are deemed to delimit empty strings (for example,\n ``\'1,,2\'.split(\',\')`` returns ``[\'1\', \'\', \'2\']``). The *sep*\n argument may consist of multiple characters (for example,\n ``\'1<>2<>3\'.split(\'<>\')`` returns ``[\'1\', \'2\', \'3\']``). Splitting\n an empty string with a specified separator returns ``[\'\']``.\n\n If *sep* is not specified or is ``None``, a different splitting\n algorithm is applied: runs of consecutive whitespace are regarded\n as a single separator, and the result will contain no empty strings\n at the start or end if the string has leading or trailing\n whitespace. Consequently, splitting an empty string or a string\n consisting of just whitespace with a ``None`` separator returns\n ``[]``.\n\n For example, ``\' 1 2 3 \'.split()`` returns ``[\'1\', \'2\', \'3\']``,\n and ``\' 1 2 3 \'.split(None, 1)`` returns ``[\'1\', \'2 3 \']``.\n\nstr.splitlines([keepends])\n\n Return a list of the lines in the string, breaking at line\n boundaries. Line breaks are not included in the resulting list\n unless *keepends* is given and true.\n\nstr.startswith(prefix[, start[, end]])\n\n Return ``True`` if string starts with the *prefix*, otherwise\n return ``False``. *prefix* can also be a tuple of prefixes to look\n for. With optional *start*, test string beginning at that\n position. With optional *end*, stop comparing string at that\n position.\n\nstr.strip([chars])\n\n Return a copy of the string with the leading and trailing\n characters removed. The *chars* argument is a string specifying the\n set of characters to be removed. If omitted or ``None``, the\n *chars* argument defaults to removing whitespace. The *chars*\n argument is not a prefix or suffix; rather, all combinations of its\n values are stripped:\n\n >>> \' spacious \'.strip()\n \'spacious\'\n >>> \'www.example.com\'.strip(\'cmowz.\')\n \'example\'\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\nstr.title()\n\n Return a titlecased version of the string where words start with an\n uppercase character and the remaining characters are lowercase.\n\n The algorithm uses a simple language-independent definition of a\n word as groups of consecutive letters. The definition works in\n many contexts but it means that apostrophes in contractions and\n possessives form word boundaries, which may not be the desired\n result:\n\n >>> "they\'re bill\'s friends from the UK".title()\n "They\'Re Bill\'S Friends From The Uk"\n\n A workaround for apostrophes can be constructed using regular\n expressions:\n\n >>> import re\n >>> def titlecase(s):\n return re.sub(r"[A-Za-z]+(\'[A-Za-z]+)?",\n lambda mo: mo.group(0)[0].upper() +\n mo.group(0)[1:].lower(),\n s)\n\n >>> titlecase("they\'re bill\'s friends.")\n "They\'re Bill\'s Friends."\n\nstr.translate(map)\n\n Return a copy of the *s* where all characters have been mapped\n through the *map* which must be a dictionary of Unicode ordinals\n (integers) to Unicode ordinals, strings or ``None``. Unmapped\n characters are left untouched. Characters mapped to ``None`` are\n deleted.\n\n You can use ``str.maketrans()`` to create a translation map from\n character-to-character mappings in different formats.\n\n Note: An even more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see\n ``encodings.cp1251`` for an example).\n\nstr.upper()\n\n Return a copy of the string with all the cased characters [4]\n converted to uppercase. Note that ``str.upper().isupper()`` might\n be ``False`` if ``s`` contains uncased characters or if the Unicode\n category of the resulting character(s) is not "Lu" (Letter,\n uppercase), but e.g. "Lt" (Letter, titlecase).\n\nstr.zfill(width)\n\n Return the numeric string left filled with zeros in a string of\n length *width*. A sign prefix is handled correctly. The original\n string is returned if *width* is less than or equal to ``len(s)``.\n\n\nOld String Formatting Operations\n================================\n\nNote: The formatting operations described here are obsolete and may go\n away in future versions of Python. Use the new *String Formatting*\n in new code.\n\nString objects have one unique built-in operation: the ``%`` operator\n(modulo). This is also known as the string *formatting* or\n*interpolation* operator. Given ``format % values`` (where *format* is\na string), ``%`` conversion specifications in *format* are replaced\nwith zero or more elements of *values*. The effect is similar to the\nusing ``sprintf()`` in the C language.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [5] Otherwise, *values* must be a tuple with exactly\nthe number of items specified by the format string, or a single\nmapping object (for example, a dictionary).\n\nA conversion specifier contains two or more characters and has the\nfollowing components, which must occur in this order:\n\n1. The ``\'%\'`` character, which marks the start of the specifier.\n\n2. Mapping key (optional), consisting of a parenthesised sequence of\n characters (for example, ``(somename)``).\n\n3. Conversion flags (optional), which affect the result of some\n conversion types.\n\n4. Minimum field width (optional). If specified as an ``\'*\'``\n (asterisk), the actual width is read from the next element of the\n tuple in *values*, and the object to convert comes after the\n minimum field width and optional precision.\n\n5. Precision (optional), given as a ``\'.\'`` (dot) followed by the\n precision. If specified as ``\'*\'`` (an asterisk), the actual\n precision is read from the next element of the tuple in *values*,\n and the value to convert comes after the precision.\n\n6. Length modifier (optional).\n\n7. Conversion type.\n\nWhen the right argument is a dictionary (or other mapping type), then\nthe formats in the string *must* include a parenthesised mapping key\ninto that dictionary inserted immediately after the ``\'%\'`` character.\nThe mapping key selects the value to be formatted from the mapping.\nFor example:\n\n>>> print(\'%(language)s has %(number)03d quote types.\' %\n... {\'language\': "Python", "number": 2})\nPython has 002 quote types.\n\nIn this case no ``*`` specifiers may occur in a format (since they\nrequire a sequential parameter list).\n\nThe conversion flag characters are:\n\n+-----------+-----------------------------------------------------------------------+\n| Flag | Meaning |\n+===========+=======================================================================+\n| ``\'#\'`` | The value conversion will use the "alternate form" (where defined |\n| | below). |\n+-----------+-----------------------------------------------------------------------+\n| ``\'0\'`` | The conversion will be zero padded for numeric values. |\n+-----------+-----------------------------------------------------------------------+\n| ``\'-\'`` | The converted value is left adjusted (overrides the ``\'0\'`` |\n| | conversion if both are given). |\n+-----------+-----------------------------------------------------------------------+\n| ``\' \'`` | (a space) A blank should be left before a positive number (or empty |\n| | string) produced by a signed conversion. |\n+-----------+-----------------------------------------------------------------------+\n| ``\'+\'`` | A sign character (``\'+\'`` or ``\'-\'``) will precede the conversion |\n| | (overrides a "space" flag). |\n+-----------+-----------------------------------------------------------------------+\n\nA length modifier (``h``, ``l``, or ``L``) may be present, but is\nignored as it is not necessary for Python -- so e.g. ``%ld`` is\nidentical to ``%d``.\n\nThe conversion types are:\n\n+--------------+-------------------------------------------------------+---------+\n| Conversion | Meaning | Notes |\n+==============+=======================================================+=========+\n| ``\'d\'`` | Signed integer decimal. | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'i\'`` | Signed integer decimal. | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'o\'`` | Signed octal value. | (1) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'u\'`` | Obsolete type -- it is identical to ``\'d\'``. | (7) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'x\'`` | Signed hexadecimal (lowercase). | (2) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'X\'`` | Signed hexadecimal (uppercase). | (2) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'e\'`` | Floating point exponential format (lowercase). | (3) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'E\'`` | Floating point exponential format (uppercase). | (3) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'f\'`` | Floating point decimal format. | (3) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'F\'`` | Floating point decimal format. | (3) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'g\'`` | Floating point format. Uses lowercase exponential | (4) |\n| | format if exponent is less than -4 or not less than | |\n| | precision, decimal format otherwise. | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'G\'`` | Floating point format. Uses uppercase exponential | (4) |\n| | format if exponent is less than -4 or not less than | |\n| | precision, decimal format otherwise. | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'c\'`` | Single character (accepts integer or single character | |\n| | string). | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'r\'`` | String (converts any Python object using ``repr()``). | (5) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'s\'`` | String (converts any Python object using ``str()``). | (5) |\n+--------------+-------------------------------------------------------+---------+\n| ``\'a\'`` | String (converts any Python object using | (5) |\n| | ``ascii()``). | |\n+--------------+-------------------------------------------------------+---------+\n| ``\'%\'`` | No argument is converted, results in a ``\'%\'`` | |\n| | character in the result. | |\n+--------------+-------------------------------------------------------+---------+\n\nNotes:\n\n1. The alternate form causes a leading zero (``\'0\'``) to be inserted\n between left-hand padding and the formatting of the number if the\n leading character of the result is not already a zero.\n\n2. The alternate form causes a leading ``\'0x\'`` or ``\'0X\'`` (depending\n on whether the ``\'x\'`` or ``\'X\'`` format was used) to be inserted\n between left-hand padding and the formatting of the number if the\n leading character of the result is not already a zero.\n\n3. The alternate form causes the result to always contain a decimal\n point, even if no digits follow it.\n\n The precision determines the number of digits after the decimal\n point and defaults to 6.\n\n4. The alternate form causes the result to always contain a decimal\n point, and trailing zeroes are not removed as they would otherwise\n be.\n\n The precision determines the number of significant digits before\n and after the decimal point and defaults to 6.\n\n5. If precision is ``N``, the output is truncated to ``N`` characters.\n\n1. See **PEP 237**.\n\nSince Python strings have an explicit length, ``%s`` conversions do\nnot assume that ``\'\\0\'`` is the end of the string.\n\nChanged in version 3.1: ``%f`` conversions for numbers whose absolute\nvalue is over 1e50 are no longer replaced by ``%g`` conversions.\n\nAdditional string operations are defined in standard modules\n``string`` and ``re``.\n\n\nRange Type\n==========\n\nThe ``range`` type is an immutable sequence which is commonly used for\nlooping. The advantage of the ``range`` type is that an ``range``\nobject will always take the same amount of memory, no matter the size\nof the range it represents.\n\nRange objects have relatively little behavior: they support indexing,\ncontains, iteration, the ``len()`` function, and the following\nmethods:\n\nrange.count(x)\n\n Return the number of *i*\'s for which ``s[i] == x``.\n\n New in version 3.2.\n\nrange.index(x)\n\n Return the smallest *i* such that ``s[i] == x``. Raises\n ``ValueError`` when *x* is not in the range.\n\n New in version 3.2.\n\n\nMutable Sequence Types\n======================\n\nList and bytearray objects support additional operations that allow\nin-place modification of the object. Other mutable sequence types\n(when added to the language) should also support these operations.\nStrings and tuples are immutable sequence types: such objects cannot\nbe modified once created. The following operations are defined on\nmutable sequence types (where *x* is an arbitrary object).\n\nNote that while lists allow their items to be of any type, bytearray\nobject "items" are all integers in the range 0 <= x < 256.\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | same as ``s[len(s):len(s)] = | |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (2) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.count(x)`` | return number of *i*\'s for which | |\n| | ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.index(x[, i[, j]])`` | return smallest *k* such that | (3) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (5) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (3) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (6) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([key[, reverse]])`` | sort the items of *s* in place | (6), (7), (8) |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. *x* can be any iterable object.\n\n3. Raises ``ValueError`` when *x* is not found in *s*. When a negative\n index is passed as the second or third parameter to the ``index()``\n method, the sequence length is added, as for slice indices. If it\n is still negative, it is truncated to zero, as for slice indices.\n\n4. When a negative index is passed as the first parameter to the\n ``insert()`` method, the sequence length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n5. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n6. The ``sort()`` and ``reverse()`` methods modify the sequence in\n place for economy of space when sorting or reversing a large\n sequence. To remind you that they operate by side effect, they\n don\'t return the sorted or reversed sequence.\n\n7. The ``sort()`` method takes optional arguments for controlling the\n comparisons. Each must be specified as a keyword argument.\n\n *key* specifies a function of one argument that is used to extract\n a comparison key from each list element: ``key=str.lower``. The\n default value is ``None``. Use ``functools.cmp_to_key()`` to\n convert an old-style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n The ``sort()`` method is guaranteed to be stable. A sort is stable\n if it guarantees not to change the relative order of elements that\n compare equal --- this is helpful for sorting in multiple passes\n (for example, sort by department, then by salary grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can detect\n that the list has been mutated during a sort.\n\n8. ``sort()`` is not supported by ``bytearray`` objects.\n\n\nBytes and Byte Array Methods\n============================\n\nBytes and bytearray objects, being "strings of bytes", have all\nmethods found on strings, with the exception of ``encode()``,\n``format()`` and ``isidentifier()``, which do not make sense with\nthese types. For converting the objects to strings, they have a\n``decode()`` method.\n\nWherever one of these methods needs to interpret the bytes as\ncharacters (e.g. the ``is...()`` methods), the ASCII character set is\nassumed.\n\nNote: The methods on bytes and bytearray objects don\'t accept strings as\n their arguments, just as the methods on strings don\'t accept bytes\n as their arguments. For example, you have to write\n\n a = "abc"\n b = a.replace("a", "f")\n\n and\n\n a = b"abc"\n b = a.replace(b"a", b"f")\n\nbytes.decode(encoding="utf-8", errors="strict")\nbytearray.decode(encoding="utf-8", errors="strict")\n\n Return a string decoded from the given bytes. Default encoding is\n ``\'utf-8\'``. *errors* may be given to set a different error\n handling scheme. The default for *errors* is ``\'strict\'``, meaning\n that encoding errors raise a ``UnicodeError``. Other possible\n values are ``\'ignore\'``, ``\'replace\'`` and any other name\n registered via ``codecs.register_error()``, see section *Codec Base\n Classes*. For a list of possible encodings, see section *Standard\n Encodings*.\n\n Changed in version 3.1: Added support for keyword arguments.\n\nThe bytes and bytearray types have an additional class method:\n\nclassmethod bytes.fromhex(string)\nclassmethod bytearray.fromhex(string)\n\n This ``bytes`` class method returns a bytes or bytearray object,\n decoding the given string object. The string must contain two\n hexadecimal digits per byte, spaces are ignored.\n\n >>> bytes.fromhex(\'f0 f1f2 \')\n b\'\\xf0\\xf1\\xf2\'\n\nThe maketrans and translate methods differ in semantics from the\nversions available on strings:\n\nbytes.translate(table[, delete])\nbytearray.translate(table[, delete])\n\n Return a copy of the bytes or bytearray object where all bytes\n occurring in the optional argument *delete* are removed, and the\n remaining bytes have been mapped through the given translation\n table, which must be a bytes object of length 256.\n\n You can use the ``bytes.maketrans()`` method to create a\n translation table.\n\n Set the *table* argument to ``None`` for translations that only\n delete characters:\n\n >>> b\'read this short text\'.translate(None, b\'aeiou\')\n b\'rd ths shrt txt\'\n\nstatic bytes.maketrans(from, to)\nstatic bytearray.maketrans(from, to)\n\n This static method returns a translation table usable for\n ``bytes.translate()`` that will map each character in *from* into\n the character at the same position in *to*; *from* and *to* must be\n bytes objects and have the same length.\n\n New in version 3.1.\n',
- 'typesseq-mutable': '\nMutable Sequence Types\n**********************\n\nList and bytearray objects support additional operations that allow\nin-place modification of the object. Other mutable sequence types\n(when added to the language) should also support these operations.\nStrings and tuples are immutable sequence types: such objects cannot\nbe modified once created. The following operations are defined on\nmutable sequence types (where *x* is an arbitrary object).\n\nNote that while lists allow their items to be of any type, bytearray\nobject "items" are all integers in the range 0 <= x < 256.\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | same as ``s[len(s):len(s)] = | |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (2) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.count(x)`` | return number of *i*\'s for which | |\n| | ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.index(x[, i[, j]])`` | return smallest *k* such that | (3) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (5) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (3) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (6) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([key[, reverse]])`` | sort the items of *s* in place | (6), (7), (8) |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. *x* can be any iterable object.\n\n3. Raises ``ValueError`` when *x* is not found in *s*. When a negative\n index is passed as the second or third parameter to the ``index()``\n method, the sequence length is added, as for slice indices. If it\n is still negative, it is truncated to zero, as for slice indices.\n\n4. When a negative index is passed as the first parameter to the\n ``insert()`` method, the sequence length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n5. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n6. The ``sort()`` and ``reverse()`` methods modify the sequence in\n place for economy of space when sorting or reversing a large\n sequence. To remind you that they operate by side effect, they\n don\'t return the sorted or reversed sequence.\n\n7. The ``sort()`` method takes optional arguments for controlling the\n comparisons. Each must be specified as a keyword argument.\n\n *key* specifies a function of one argument that is used to extract\n a comparison key from each list element: ``key=str.lower``. The\n default value is ``None``. Use ``functools.cmp_to_key()`` to\n convert an old-style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n The ``sort()`` method is guaranteed to be stable. A sort is stable\n if it guarantees not to change the relative order of elements that\n compare equal --- this is helpful for sorting in multiple passes\n (for example, sort by department, then by salary grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can detect\n that the list has been mutated during a sort.\n\n8. ``sort()`` is not supported by ``bytearray`` objects.\n',
+ 'typesseq': '\nSequence Types --- ``list``, ``tuple``, ``range``\n*************************************************\n\nThere are three basic sequence types: lists, tuples, and range\nobjects. Additional sequence types tailored for processing of *binary\ndata* and *text strings* are described in dedicated sections.\n\n\nCommon Sequence Operations\n==========================\n\nThe operations in the following table are supported by most sequence\ntypes, both mutable and immutable. The ``collections.abc.Sequence``\nABC is provided to make it easier to correctly implement these\noperations on custom sequence types.\n\nThis table lists the sequence operations sorted in ascending priority\n(operations in the same box have the same priority). In the table,\n*s* and *t* are sequences of the same type, *n*, *i*, *j* and *k* are\nintegers and *x* is an arbitrary object that meets any type and value\nrestrictions imposed by *s*.\n\nThe ``in`` and ``not in`` operations have the same priorities as the\ncomparison operations. The ``+`` (concatenation) and ``*``\n(repetition) operations have the same priority as the corresponding\nnumeric operations.\n\n+----------------------------+----------------------------------+------------+\n| Operation | Result | Notes |\n+============================+==================================+============+\n| ``x in s`` | ``True`` if an item of *s* is | (1) |\n| | equal to *x*, else ``False`` | |\n+----------------------------+----------------------------------+------------+\n| ``x not in s`` | ``False`` if an item of *s* is | (1) |\n| | equal to *x*, else ``True`` | |\n+----------------------------+----------------------------------+------------+\n| ``s + t`` | the concatenation of *s* and *t* | (6)(7) |\n+----------------------------+----------------------------------+------------+\n| ``s * n`` or ``n * s`` | *n* shallow copies of *s* | (2)(7) |\n| | concatenated | |\n+----------------------------+----------------------------------+------------+\n| ``s[i]`` | *i*th item of *s*, origin 0 | (3) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |\n+----------------------------+----------------------------------+------------+\n| ``s[i:j:k]`` | slice of *s* from *i* to *j* | (3)(5) |\n| | with step *k* | |\n+----------------------------+----------------------------------+------------+\n| ``len(s)`` | length of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``min(s)`` | smallest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``max(s)`` | largest item of *s* | |\n+----------------------------+----------------------------------+------------+\n| ``s.index(x[, i[, j]])`` | index of the first occurence of | (8) |\n| | *x* in *s* (at or after index | |\n| | *i* and before index *j*) | |\n+----------------------------+----------------------------------+------------+\n| ``s.count(x)`` | total number of occurences of | |\n| | *x* in *s* | |\n+----------------------------+----------------------------------+------------+\n\nSequences of the same type also support comparisons. In particular,\ntuples and lists are compared lexicographically by comparing\ncorresponding elements. This means that to compare equal, every\nelement must compare equal and the two sequences must be of the same\ntype and have the same length. (For full details see *Comparisons* in\nthe language reference.)\n\nNotes:\n\n1. While the ``in`` and ``not in`` operations are used only for simple\n containment testing in the general case, some specialised sequences\n (such as ``str``, ``bytes`` and ``bytearray``) also use them for\n subsequence testing:\n\n >>> "gg" in "eggs"\n True\n\n2. Values of *n* less than ``0`` are treated as ``0`` (which yields an\n empty sequence of the same type as *s*). Note also that the copies\n are shallow; nested structures are not copied. This often haunts\n new Python programmers; consider:\n\n >>> lists = [[]] * 3\n >>> lists\n [[], [], []]\n >>> lists[0].append(3)\n >>> lists\n [[3], [3], [3]]\n\n What has happened is that ``[[]]`` is a one-element list containing\n an empty list, so all three elements of ``[[]] * 3`` are (pointers\n to) this single empty list. Modifying any of the elements of\n ``lists`` modifies this single list. You can create a list of\n different lists this way:\n\n >>> lists = [[] for i in range(3)]\n >>> lists[0].append(3)\n >>> lists[1].append(5)\n >>> lists[2].append(7)\n >>> lists\n [[3], [5], [7]]\n\n3. If *i* or *j* is negative, the index is relative to the end of the\n string: ``len(s) + i`` or ``len(s) + j`` is substituted. But note\n that ``-0`` is still ``0``.\n\n4. The slice of *s* from *i* to *j* is defined as the sequence of\n items with index *k* such that ``i <= k < j``. If *i* or *j* is\n greater than ``len(s)``, use ``len(s)``. If *i* is omitted or\n ``None``, use ``0``. If *j* is omitted or ``None``, use\n ``len(s)``. If *i* is greater than or equal to *j*, the slice is\n empty.\n\n5. The slice of *s* from *i* to *j* with step *k* is defined as the\n sequence of items with index ``x = i + n*k`` such that ``0 <= n <\n (j-i)/k``. In other words, the indices are ``i``, ``i+k``,\n ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but\n never including *j*). If *i* or *j* is greater than ``len(s)``,\n use ``len(s)``. If *i* or *j* are omitted or ``None``, they become\n "end" values (which end depends on the sign of *k*). Note, *k*\n cannot be zero. If *k* is ``None``, it is treated like ``1``.\n\n6. Concatenating immutable sequences always results in a new object.\n This means that building up a sequence by repeated concatenation\n will have a quadratic runtime cost in the total sequence length.\n To get a linear runtime cost, you must switch to one of the\n alternatives below:\n\n * if concatenating ``str`` objects, you can build a list and use\n ``str.join()`` at the end or else write to a ``io.StringIO``\n instance and retrieve its value when complete\n\n * if concatenating ``bytes`` objects, you can similarly use\n ``bytes.join()`` or ``io.BytesIO``, or you can do in-place\n concatenation with a ``bytearray`` object. ``bytearray`` objects\n are mutable and have an efficient overallocation mechanism\n\n * if concatenating ``tuple`` objects, extend a ``list`` instead\n\n * for other types, investigate the relevant class documentation\n\n7. Some sequence types (such as ``range``) only support item sequences\n that follow specific patterns, and hence don\'t support sequence\n concatenation or repetition.\n\n8. ``index`` raises ``ValueError`` when *x* is not found in *s*. When\n supported, the additional arguments to the index method allow\n efficient searching of subsections of the sequence. Passing the\n extra arguments is roughly equivalent to using ``s[i:j].index(x)``,\n only without copying any data and with the returned index being\n relative to the start of the sequence rather than the start of the\n slice.\n\n\nImmutable Sequence Types\n========================\n\nThe only operation that immutable sequence types generally implement\nthat is not also implemented by mutable sequence types is support for\nthe ``hash()`` built-in.\n\nThis support allows immutable sequences, such as ``tuple`` instances,\nto be used as ``dict`` keys and stored in ``set`` and ``frozenset``\ninstances.\n\nAttempting to hash an immutable sequence that contains unhashable\nvalues will result in ``TypeError``.\n\n\nMutable Sequence Types\n======================\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don\'t support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n\n\nLists\n=====\n\nLists are mutable sequences, typically used to store collections of\nhomogeneous items (where the precise degree of similarity will vary by\napplication).\n\nclass class list([iterable])\n\n Lists may be constructed in several ways:\n\n * Using a pair of square brackets to denote the empty list: ``[]``\n\n * Using square brackets, separating items with commas: ``[a]``,\n ``[a, b, c]``\n\n * Using a list comprehension: ``[x for x in iterable]``\n\n * Using the type constructor: ``list()`` or ``list(iterable)``\n\n The constructor builds a list whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a list, a copy is made and\n returned, similar to ``iterable[:]``. For example, ``list(\'abc\')``\n returns ``[\'a\', \'b\', \'c\']`` and ``list( (1, 2, 3) )`` returns ``[1,\n 2, 3]``. If no argument is given, the constructor creates a new\n empty list, ``[]``.\n\n Many other operations also produce lists, including the\n ``sorted()`` built-in.\n\n Lists implement all of the *common* and *mutable* sequence\n operations. Lists also provide the following additional method:\n\n sort(*, key=None, reverse=None)\n\n This method sorts the list in place, using only ``<``\n comparisons between items. Exceptions are not suppressed - if\n any comparison operations fail, the entire sort operation will\n fail (and the list will likely be left in a partially modified\n state).\n\n *key* specifies a function of one argument that is used to\n extract a comparison key from each list element (for example,\n ``key=str.lower``). The key corresponding to each item in the\n list is calculated once and then used for the entire sorting\n process. The default value of ``None`` means that list items are\n sorted directly without calculating a separate key value.\n\n The ``functools.cmp_to_key()`` utility is available to convert a\n 2.x style *cmp* function to a *key* function.\n\n *reverse* is a boolean value. If set to ``True``, then the list\n elements are sorted as if each comparison were reversed.\n\n This method modifies the sequence in place for economy of space\n when sorting a large sequence. To remind users that it operates\n by side effect, it does not return the sorted sequence (use\n ``sorted()`` to explicitly request a new sorted list instance).\n\n The ``sort()`` method is guaranteed to be stable. A sort is\n stable if it guarantees not to change the relative order of\n elements that compare equal --- this is helpful for sorting in\n multiple passes (for example, sort by department, then by salary\n grade).\n\n **CPython implementation detail:** While a list is being sorted,\n the effect of attempting to mutate, or even inspect, the list is\n undefined. The C implementation of Python makes the list appear\n empty for the duration, and raises ``ValueError`` if it can\n detect that the list has been mutated during a sort.\n\n\nTuples\n======\n\nTuples are immutable sequences, typically used to store collections of\nheterogeneous data (such as the 2-tuples produced by the\n``enumerate()`` built-in). Tuples are also used for cases where an\nimmutable sequence of homogeneous data is needed (such as allowing\nstorage in a ``set`` or ``dict`` instance).\n\nclass class tuple([iterable])\n\n Tuples may be constructed in a number of ways:\n\n * Using a pair of parentheses to denote the empty tuple: ``()``\n\n * Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``\n\n * Separating items with commas: ``a, b, c`` or ``(a, b, c)``\n\n * Using the ``tuple()`` built-in: ``tuple()`` or\n ``tuple(iterable)``\n\n The constructor builds a tuple whose items are the same and in the\n same order as *iterable*\'s items. *iterable* may be either a\n sequence, a container that supports iteration, or an iterator\n object. If *iterable* is already a tuple, it is returned\n unchanged. For example, ``tuple(\'abc\')`` returns ``(\'a\', \'b\',\n \'c\')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, 3)``. If no\n argument is given, the constructor creates a new empty tuple,\n ``()``.\n\n Note that it is actually the comma which makes a tuple, not the\n parentheses. The parentheses are optional, except in the empty\n tuple case, or when they are needed to avoid syntactic ambiguity.\n For example, ``f(a, b, c)`` is a function call with three\n arguments, while ``f((a, b, c))`` is a function call with a 3-tuple\n as the sole argument.\n\n Tuples implement all of the *common* sequence operations.\n\nFor heterogeneous collections of data where access by name is clearer\nthan access by index, ``collections.namedtuple()`` may be a more\nappropriate choice than a simple tuple object.\n\n\nRanges\n======\n\nThe ``range`` type represents an immutable sequence of numbers and is\ncommonly used for looping a specific number of times in ``for`` loops.\n\nclass class range([start], stop[, step])\n\n The arguments to the range constructor must be integers (either\n built-in ``int`` or any object that implements the ``__index__``\n special method). If the *step* argument is omitted, it defaults to\n ``1``. If the *start* argument is omitted, it defaults to ``0``. If\n *step* is zero, ``ValueError`` is raised.\n\n For a positive *step*, the contents of a range ``r`` are determined\n by the formula ``r[i] = start + step*i`` where ``i >= 0`` and\n ``r[i] < stop``.\n\n For a negative *step*, the contents of the range are still\n determined by the formula ``r[i] = start + step*i``, but the\n constraints are ``i >= 0`` and ``r[i] > stop``.\n\n A range object will be empty if ``r[0]`` does not meant the value\n constraint. Ranges do support negative indices, but these are\n interpreted as indexing from the end of the sequence determined by\n the positive indices.\n\n Ranges containing absolute values larger than ``sys.maxsize`` are\n permitted but some features (such as ``len()``) may raise\n ``OverflowError``.\n\n Range examples:\n\n >>> list(range(10))\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n >>> list(range(1, 11))\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n >>> list(range(0, 30, 5))\n [0, 5, 10, 15, 20, 25]\n >>> list(range(0, 10, 3))\n [0, 3, 6, 9]\n >>> list(range(0, -10, -1))\n [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n >>> list(range(0))\n []\n >>> list(range(1, 0))\n []\n\n Ranges implement all of the *common* sequence operations except\n concatenation and repetition (due to the fact that range objects\n can only represent sequences that follow a strict pattern and\n repetition and concatenation will usually violate that pattern).\n\nThe advantage of the ``range`` type over a regular ``list`` or\n``tuple`` is that a ``range`` object will always take the same (small)\namount of memory, no matter the size of the range it represents (as it\nonly stores the ``start``, ``stop`` and ``step`` values, calculating\nindividual items and subranges as needed).\n\nRange objects implement the ``collections.Sequence`` ABC, and provide\nfeatures such as containment tests, element index lookup, slicing and\nsupport for negative indices (see *Sequence Types --- list, tuple,\nrange*):\n\n>>> r = range(0, 20, 2)\n>>> r\nrange(0, 20, 2)\n>>> 11 in r\nFalse\n>>> 10 in r\nTrue\n>>> r.index(10)\n5\n>>> r[5]\n10\n>>> r[:5]\nrange(0, 10, 2)\n>>> r[-1]\n18\n\nTesting range objects for equality with ``==`` and ``!=`` compares\nthem as sequences. That is, two range objects are considered equal if\nthey represent the same sequence of values. (Note that two range\nobjects that compare equal might have different ``start``, ``stop``\nand ``step`` attributes, for example ``range(0) == range(2, 1, 3)`` or\n``range(0, 3, 2) == range(0, 4, 2)``.)\n\nChanged in version 3.2: Implement the Sequence ABC. Support slicing\nand negative indices. Test ``int`` objects for membership in constant\ntime instead of iterating through all items.\n\nChanged in version 3.3: Define \'==\' and \'!=\' to compare range objects\nbased on the sequence of values they define (instead of comparing\nbased on object identity).\n\nNew in version 3.3: The ``start``, ``stop`` and ``step`` attributes.\n',
+ 'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nThe operations in the following table are defined on mutable sequence\ntypes. The ``collections.abc.MutableSequence`` ABC is provided to make\nit easier to correctly implement these operations on custom sequence\ntypes.\n\nIn the table *s* is an instance of a mutable sequence type, *t* is any\niterable object and *x* is an arbitrary object that meets any type and\nvalue restrictions imposed by *s* (for example, ``bytearray`` only\naccepts integers that meet the value restriction ``0 <= x <= 255``).\n\n+--------------------------------+----------------------------------+-----------------------+\n| Operation | Result | Notes |\n+================================+==================================+=======================+\n| ``s[i] = x`` | item *i* of *s* is replaced by | |\n| | *x* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j] = t`` | slice of *s* from *i* to *j* is | |\n| | replaced by the contents of the | |\n| | iterable *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j]`` | same as ``s[i:j] = []`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` are | (1) |\n| | replaced by those of *t* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``del s[i:j:k]`` | removes the elements of | |\n| | ``s[i:j:k]`` from the list | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.append(x)`` | appends *x* to the end of the | |\n| | sequence (same as | |\n| | ``s[len(s):len(s)] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.clear()`` | removes all items from ``s`` | (5) |\n| | (same as ``del s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.copy()`` | creates a shallow copy of ``s`` | (5) |\n| | (same as ``s[:]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(t)`` | extends *s* with the contents of | |\n| | *t* (same as ``s[len(s):len(s)] | |\n| | = t``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | inserts *x* into *s* at the | |\n| | index given by *i* (same as | |\n| | ``s[i:i] = [x]``) | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | retrieves the item at *i* and | (2) |\n| | also removes it from *s* | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | remove the first item from *s* | (3) |\n| | where ``s[i] == x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (4) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n3. ``remove`` raises ``ValueError`` when *x* is not found in *s*.\n\n4. The ``reverse()`` method modifies the sequence in place for economy\n of space when reversing a large sequence. To remind users that it\n operates by side effect, it does not return the reversed sequence.\n\n5. ``clear()`` and ``copy()`` are included for consistency with the\n interfaces of mutable containers that don't support slicing\n operations (such as ``dict`` and ``set``)\n\n New in version 3.3: ``clear()`` and ``copy()`` methods.\n",
'unary': '\nUnary arithmetic and bitwise operations\n***************************************\n\nAll unary arithmetic and bitwise operations have the same priority:\n\n u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr\n\nThe unary ``-`` (minus) operator yields the negation of its numeric\nargument.\n\nThe unary ``+`` (plus) operator yields its numeric argument unchanged.\n\nThe unary ``~`` (invert) operator yields the bitwise inversion of its\ninteger argument. The bitwise inversion of ``x`` is defined as\n``-(x+1)``. It only applies to integral numbers.\n\nIn all three cases, if the argument does not have the proper type, a\n``TypeError`` exception is raised.\n',
'while': '\nThe ``while`` statement\n***********************\n\nThe ``while`` statement is used for repeated execution as long as an\nexpression is true:\n\n while_stmt ::= "while" expression ":" suite\n ["else" ":" suite]\n\nThis repeatedly tests the expression and, if it is true, executes the\nfirst suite; if the expression is false (which may be the first time\nit is tested) the suite of the ``else`` clause, if present, is\nexecuted and the loop terminates.\n\nA ``break`` statement executed in the first suite terminates the loop\nwithout executing the ``else`` clause\'s suite. A ``continue``\nstatement executed in the first suite skips the rest of the suite and\ngoes back to testing the expression.\n',
'with': '\nThe ``with`` statement\n**********************\n\nThe ``with`` statement is used to wrap the execution of a block with\nmethods defined by a context manager (see section *With Statement\nContext Managers*). This allows common\n``try``...``except``...``finally`` usage patterns to be encapsulated\nfor convenient reuse.\n\n with_stmt ::= "with" with_item ("," with_item)* ":" suite\n with_item ::= expression ["as" target]\n\nThe execution of the ``with`` statement with one "item" proceeds as\nfollows:\n\n1. The context expression (the expression given in the ``with_item``)\n is evaluated to obtain a context manager.\n\n2. The context manager\'s ``__exit__()`` is loaded for later use.\n\n3. The context manager\'s ``__enter__()`` method is invoked.\n\n4. If a target was included in the ``with`` statement, the return\n value from ``__enter__()`` is assigned to it.\n\n Note: The ``with`` statement guarantees that if the ``__enter__()``\n method returns without an error, then ``__exit__()`` will always\n be called. Thus, if an error occurs during the assignment to the\n target list, it will be treated the same as an error occurring\n within the suite would be. See step 6 below.\n\n5. The suite is executed.\n\n6. The context manager\'s ``__exit__()`` method is invoked. If an\n exception caused the suite to be exited, its type, value, and\n traceback are passed as arguments to ``__exit__()``. Otherwise,\n three ``None`` arguments are supplied.\n\n If the suite was exited due to an exception, and the return value\n from the ``__exit__()`` method was false, the exception is\n reraised. If the return value was true, the exception is\n suppressed, and execution continues with the statement following\n the ``with`` statement.\n\n If the suite was exited for any reason other than an exception, the\n return value from ``__exit__()`` is ignored, and execution proceeds\n at the normal location for the kind of exit that was taken.\n\nWith more than one item, the context managers are processed as if\nmultiple ``with`` statements were nested:\n\n with A() as a, B() as b:\n suite\n\nis equivalent to\n\n with A() as a:\n with B() as b:\n suite\n\nChanged in version 3.1: Support for multiple context expressions.\n\nSee also:\n\n **PEP 0343** - The "with" statement\n The specification, background, and examples for the Python\n ``with`` statement.\n',
- 'yield': '\nThe ``yield`` statement\n***********************\n\n yield_stmt ::= yield_expression\n\nThe ``yield`` statement is only used when defining a generator\nfunction, and is only used in the body of the generator function.\nUsing a ``yield`` statement in a function definition is sufficient to\ncause that definition to create a generator function instead of a\nnormal function. When a generator function is called, it returns an\niterator known as a generator iterator, or more commonly, a generator.\nThe body of the generator function is executed by calling the\n``next()`` function on the generator repeatedly until it raises an\nexception.\n\nWhen a ``yield`` statement is executed, the state of the generator is\nfrozen and the value of ``expression_list`` is returned to\n``next()``\'s caller. By "frozen" we mean that all local state is\nretained, including the current bindings of local variables, the\ninstruction pointer, and the internal evaluation stack: enough\ninformation is saved so that the next time ``next()`` is invoked, the\nfunction can proceed exactly as if the ``yield`` statement were just\nanother external call.\n\nThe ``yield`` statement is allowed in the ``try`` clause of a ``try``\n... ``finally`` construct. If the generator is not resumed before it\nis finalized (by reaching a zero reference count or by being garbage\ncollected), the generator-iterator\'s ``close()`` method will be\ncalled, allowing any pending ``finally`` clauses to execute.\n\nSee also:\n\n **PEP 0255** - Simple Generators\n The proposal for adding generators and the ``yield`` statement\n to Python.\n\n **PEP 0342** - Coroutines via Enhanced Generators\n The proposal that, among other generator enhancements, proposed\n allowing ``yield`` to appear inside a ``try`` ... ``finally``\n block.\n'}
+ 'yield': '\nThe ``yield`` statement\n***********************\n\n yield_stmt ::= yield_expression\n\nThe ``yield`` statement is only used when defining a generator\nfunction, and is only used in the body of the generator function.\nUsing a ``yield`` statement in a function definition is sufficient to\ncause that definition to create a generator function instead of a\nnormal function.\n\nWhen a generator function is called, it returns an iterator known as a\ngenerator iterator, or more commonly, a generator. The body of the\ngenerator function is executed by calling the ``next()`` function on\nthe generator repeatedly until it raises an exception.\n\nWhen a ``yield`` statement is executed, the state of the generator is\nfrozen and the value of ``expression_list`` is returned to\n``next()``\'s caller. By "frozen" we mean that all local state is\nretained, including the current bindings of local variables, the\ninstruction pointer, and the internal evaluation stack: enough\ninformation is saved so that the next time ``next()`` is invoked, the\nfunction can proceed exactly as if the ``yield`` statement were just\nanother external call.\n\nThe ``yield`` statement is allowed in the ``try`` clause of a ``try``\n... ``finally`` construct. If the generator is not resumed before it\nis finalized (by reaching a zero reference count or by being garbage\ncollected), the generator-iterator\'s ``close()`` method will be\ncalled, allowing any pending ``finally`` clauses to execute.\n\nWhen ``yield from <expr>`` is used, it treats the supplied expression\nas a subiterator, producing values from it until the underlying\niterator is exhausted.\n\n Changed in version 3.3: Added ``yield from <expr>`` to delegate\n control flow to a subiterator\n\nFor full details of ``yield`` semantics, refer to the *Yield\nexpressions* section.\n\nSee also:\n\n **PEP 0255** - Simple Generators\n The proposal for adding generators and the ``yield`` statement\n to Python.\n\n **PEP 0342** - Coroutines via Enhanced Generators\n The proposal to enhance the API and syntax of generators, making\n them usable as simple coroutines.\n\n **PEP 0380** - Syntax for Delegating to a Subgenerator\n The proposal to introduce the ``yield_from`` syntax, making\n delegation to sub-generators easy.\n'}
diff --git a/Lib/queue.py b/Lib/queue.py
index bee7ed4..c3296fe 100644
--- a/Lib/queue.py
+++ b/Lib/queue.py
@@ -1,49 +1,57 @@
-"""A multi-producer, multi-consumer queue."""
+'''A multi-producer, multi-consumer queue.'''
-from time import time as _time
try:
- import threading as _threading
+ import threading
except ImportError:
- import dummy_threading as _threading
+ import dummy_threading as threading
from collections import deque
-import heapq
+from heapq import heappush, heappop
+try:
+ from time import monotonic as time
+except ImportError:
+ from time import time
__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue']
class Empty(Exception):
- "Exception raised by Queue.get(block=0)/get_nowait()."
+ 'Exception raised by Queue.get(block=0)/get_nowait().'
pass
class Full(Exception):
- "Exception raised by Queue.put(block=0)/put_nowait()."
+ 'Exception raised by Queue.put(block=0)/put_nowait().'
pass
class Queue:
- """Create a queue object with a given maximum size.
+ '''Create a queue object with a given maximum size.
If maxsize is <= 0, the queue size is infinite.
- """
+ '''
+
def __init__(self, maxsize=0):
self.maxsize = maxsize
self._init(maxsize)
+
# mutex must be held whenever the queue is mutating. All methods
# that acquire mutex must release it before returning. mutex
# is shared between the three conditions, so acquiring and
# releasing the conditions also acquires and releases mutex.
- self.mutex = _threading.Lock()
+ self.mutex = threading.Lock()
+
# Notify not_empty whenever an item is added to the queue; a
# thread waiting to get is notified then.
- self.not_empty = _threading.Condition(self.mutex)
+ self.not_empty = threading.Condition(self.mutex)
+
# Notify not_full whenever an item is removed from the queue;
# a thread waiting to put is notified then.
- self.not_full = _threading.Condition(self.mutex)
+ self.not_full = threading.Condition(self.mutex)
+
# Notify all_tasks_done whenever the number of unfinished tasks
# drops to zero; thread waiting to join() is notified to resume
- self.all_tasks_done = _threading.Condition(self.mutex)
+ self.all_tasks_done = threading.Condition(self.mutex)
self.unfinished_tasks = 0
def task_done(self):
- """Indicate that a formerly enqueued task is complete.
+ '''Indicate that a formerly enqueued task is complete.
Used by Queue consumer threads. For each get() used to fetch a task,
a subsequent call to task_done() tells the queue that the processing
@@ -55,43 +63,35 @@ class Queue:
Raises a ValueError if called more times than there were items
placed in the queue.
- """
- self.all_tasks_done.acquire()
- try:
+ '''
+ with self.all_tasks_done:
unfinished = self.unfinished_tasks - 1
if unfinished <= 0:
if unfinished < 0:
raise ValueError('task_done() called too many times')
self.all_tasks_done.notify_all()
self.unfinished_tasks = unfinished
- finally:
- self.all_tasks_done.release()
def join(self):
- """Blocks until all items in the Queue have been gotten and processed.
+ '''Blocks until all items in the Queue have been gotten and processed.
The count of unfinished tasks goes up whenever an item is added to the
queue. The count goes down whenever a consumer thread calls task_done()
to indicate the item was retrieved and all work on it is complete.
When the count of unfinished tasks drops to zero, join() unblocks.
- """
- self.all_tasks_done.acquire()
- try:
+ '''
+ with self.all_tasks_done:
while self.unfinished_tasks:
self.all_tasks_done.wait()
- finally:
- self.all_tasks_done.release()
def qsize(self):
- """Return the approximate size of the queue (not reliable!)."""
- self.mutex.acquire()
- n = self._qsize()
- self.mutex.release()
- return n
+ '''Return the approximate size of the queue (not reliable!).'''
+ with self.mutex:
+ return self._qsize()
def empty(self):
- """Return True if the queue is empty, False otherwise (not reliable!).
+ '''Return True if the queue is empty, False otherwise (not reliable!).
This method is likely to be removed at some point. Use qsize() == 0
as a direct substitute, but be aware that either approach risks a race
@@ -100,29 +100,23 @@ class Queue:
To create code that needs to wait for all queued tasks to be
completed, the preferred technique is to use the join() method.
-
- """
- self.mutex.acquire()
- n = not self._qsize()
- self.mutex.release()
- return n
+ '''
+ with self.mutex:
+ return not self._qsize()
def full(self):
- """Return True if the queue is full, False otherwise (not reliable!).
+ '''Return True if the queue is full, False otherwise (not reliable!).
This method is likely to be removed at some point. Use qsize() >= n
as a direct substitute, but be aware that either approach risks a race
condition where a queue can shrink before the result of full() or
qsize() can be used.
-
- """
- self.mutex.acquire()
- n = 0 < self.maxsize <= self._qsize()
- self.mutex.release()
- return n
+ '''
+ with self.mutex:
+ return 0 < self.maxsize <= self._qsize()
def put(self, item, block=True, timeout=None):
- """Put an item into the queue.
+ '''Put an item into the queue.
If optional args 'block' is true and 'timeout' is None (the default),
block if necessary until a free slot is available. If 'timeout' is
@@ -131,9 +125,8 @@ class Queue:
Otherwise ('block' is false), put an item on the queue if a free slot
is immediately available, else raise the Full exception ('timeout'
is ignored in that case).
- """
- self.not_full.acquire()
- try:
+ '''
+ with self.not_full:
if self.maxsize > 0:
if not block:
if self._qsize() >= self.maxsize:
@@ -144,28 +137,18 @@ class Queue:
elif timeout < 0:
raise ValueError("'timeout' must be a positive number")
else:
- endtime = _time() + timeout
+ endtime = time() + timeout
while self._qsize() >= self.maxsize:
- remaining = endtime - _time()
+ remaining = endtime - time()
if remaining <= 0.0:
raise Full
self.not_full.wait(remaining)
self._put(item)
self.unfinished_tasks += 1
self.not_empty.notify()
- finally:
- self.not_full.release()
-
- def put_nowait(self, item):
- """Put an item into the queue without blocking.
-
- Only enqueue the item if a free slot is immediately available.
- Otherwise raise the Full exception.
- """
- return self.put(item, False)
def get(self, block=True, timeout=None):
- """Remove and return an item from the queue.
+ '''Remove and return an item from the queue.
If optional args 'block' is true and 'timeout' is None (the default),
block if necessary until an item is available. If 'timeout' is
@@ -174,9 +157,8 @@ class Queue:
Otherwise ('block' is false), return an item if one is immediately
available, else raise the Empty exception ('timeout' is ignored
in that case).
- """
- self.not_empty.acquire()
- try:
+ '''
+ with self.not_empty:
if not block:
if not self._qsize():
raise Empty
@@ -186,25 +168,31 @@ class Queue:
elif timeout < 0:
raise ValueError("'timeout' must be a positive number")
else:
- endtime = _time() + timeout
+ endtime = time() + timeout
while not self._qsize():
- remaining = endtime - _time()
+ remaining = endtime - time()
if remaining <= 0.0:
raise Empty
self.not_empty.wait(remaining)
item = self._get()
self.not_full.notify()
return item
- finally:
- self.not_empty.release()
+
+ def put_nowait(self, item):
+ '''Put an item into the queue without blocking.
+
+ Only enqueue the item if a free slot is immediately available.
+ Otherwise raise the Full exception.
+ '''
+ return self.put(item, block=False)
def get_nowait(self):
- """Remove and return an item from the queue without blocking.
+ '''Remove and return an item from the queue without blocking.
Only get an item if one is immediately available. Otherwise
raise the Empty exception.
- """
- return self.get(False)
+ '''
+ return self.get(block=False)
# Override these methods to implement other queue organizations
# (e.g. stack or priority queue).
@@ -214,7 +202,7 @@ class Queue:
def _init(self, maxsize):
self.queue = deque()
- def _qsize(self, len=len):
+ def _qsize(self):
return len(self.queue)
# Put a new item in the queue
@@ -235,13 +223,13 @@ class PriorityQueue(Queue):
def _init(self, maxsize):
self.queue = []
- def _qsize(self, len=len):
+ def _qsize(self):
return len(self.queue)
- def _put(self, item, heappush=heapq.heappush):
+ def _put(self, item):
heappush(self.queue, item)
- def _get(self, heappop=heapq.heappop):
+ def _get(self):
return heappop(self.queue)
@@ -251,7 +239,7 @@ class LifoQueue(Queue):
def _init(self, maxsize):
self.queue = []
- def _qsize(self, len=len):
+ def _qsize(self):
return len(self.queue)
def _put(self, item):
diff --git a/Lib/random.py b/Lib/random.py
index 9b61208..6388f29 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -41,7 +41,7 @@ from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethod
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
from os import urandom as _urandom
-from collections import Set as _Set, Sequence as _Sequence
+from collections.abc import Set as _Set, Sequence as _Sequence
from hashlib import sha512 as _sha512
__all__ = ["Random","seed","random","uniform","randint","choice","sample",
diff --git a/Lib/re.py b/Lib/re.py
index 85c5a57..9ae5174 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -215,7 +215,7 @@ def compile(pattern, flags=0):
def purge():
"Clear the regular expression caches"
- _compile_typed.cache_clear()
+ _compile.cache_clear()
_compile_repl.cache_clear()
def template(pattern, flags=0):
@@ -223,12 +223,14 @@ def template(pattern, flags=0):
return _compile(pattern, flags|T)
_alphanum_str = frozenset(
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
+ "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
_alphanum_bytes = frozenset(
- b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
+ b"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
def escape(pattern):
- "Escape all non-alphanumeric characters in pattern."
+ """
+ Escape all the characters in pattern except ASCII letters, numbers and '_'.
+ """
if isinstance(pattern, str):
alphanum = _alphanum_str
s = list(pattern)
@@ -259,11 +261,8 @@ def escape(pattern):
_pattern_type = type(sre_compile.compile("", 0))
+@functools.lru_cache(maxsize=500, typed=True)
def _compile(pattern, flags):
- return _compile_typed(type(pattern), pattern, flags)
-
-@functools.lru_cache(maxsize=500)
-def _compile_typed(text_bytes_type, pattern, flags):
# internal: compile pattern
if isinstance(pattern, _pattern_type):
if flags:
diff --git a/Lib/runpy.py b/Lib/runpy.py
index 7cb4668..39c0e9f 100644
--- a/Lib/runpy.py
+++ b/Lib/runpy.py
@@ -9,13 +9,12 @@ importers when locating support scripts as well as when importing modules.
# Written by Nick Coghlan <ncoghlan at gmail.com>
# to implement PEP 338 (Executing Modules as Scripts)
+
+import os
import sys
+import importlib.machinery # importlib first so we can test #15386 via -m
import imp
-from pkgutil import read_code
-try:
- from imp import get_loader
-except ImportError:
- from pkgutil import get_loader
+from pkgutil import read_code, get_loader, get_importer
__all__ = [
"run_module", "run_path",
@@ -95,7 +94,7 @@ def _get_filename(loader, mod_name):
for attr in ("get_filename", "_get_filename"):
meth = getattr(loader, attr, None)
if meth is not None:
- return meth(mod_name)
+ return os.path.abspath(meth(mod_name))
return None
# Helper to get the loader, code and filename for a module
@@ -181,47 +180,23 @@ def run_module(mod_name, init_globals=None,
def _get_main_module_details():
# Helper that gives a nicer error message when attempting to
# execute a zipfile or directory by invoking __main__.py
+ # Also moves the standard __main__ out of the way so that the
+ # preexisting __loader__ entry doesn't cause issues
main_name = "__main__"
+ saved_main = sys.modules[main_name]
+ del sys.modules[main_name]
try:
return _get_module_details(main_name)
except ImportError as exc:
if main_name in str(exc):
raise ImportError("can't find %r module in %r" %
- (main_name, sys.path[0]))
+ (main_name, sys.path[0])) from exc
raise
+ finally:
+ sys.modules[main_name] = saved_main
-# XXX (ncoghlan): Perhaps expose the C API function
-# as imp.get_importer instead of reimplementing it in Python?
-def _get_importer(path_name):
- """Python version of PyImport_GetImporter C API function"""
- cache = sys.path_importer_cache
- try:
- importer = cache[path_name]
- except KeyError:
- # Not yet cached. Flag as using the
- # standard machinery until we finish
- # checking the hooks
- cache[path_name] = None
- for hook in sys.path_hooks:
- try:
- importer = hook(path_name)
- break
- except ImportError:
- pass
- else:
- # The following check looks a bit odd. The trick is that
- # NullImporter throws ImportError if the supplied path is a
- # *valid* directory entry (and hence able to be handled
- # by the standard import machinery)
- try:
- importer = imp.NullImporter(path_name)
- except ImportError:
- return None
- cache[path_name] = importer
- return importer
-
-def _get_code_from_file(fname):
+def _get_code_from_file(run_name, fname):
# Check for a compiled file first
with open(fname, "rb") as f:
code = read_code(f)
@@ -229,7 +204,10 @@ def _get_code_from_file(fname):
# That didn't work, so try it as normal source code
with open(fname, "rb") as f:
code = compile(f.read(), fname, 'exec')
- return code
+ loader = importlib.machinery.SourceFileLoader(run_name, fname)
+ else:
+ loader = importlib.machinery.SourcelessFileLoader(run_name, fname)
+ return code, loader
def run_path(path_name, init_globals=None, run_name=None):
"""Execute code located at the specified filesystem location
@@ -244,13 +222,13 @@ def run_path(path_name, init_globals=None, run_name=None):
if run_name is None:
run_name = "<run_path>"
pkg_name = run_name.rpartition(".")[0]
- importer = _get_importer(path_name)
- if isinstance(importer, imp.NullImporter):
+ importer = get_importer(path_name)
+ if isinstance(importer, (type(None), imp.NullImporter)):
# Not a valid sys.path entry, so run the code directly
# execfile() doesn't help as we want to allow compiled files
- code = _get_code_from_file(path_name)
+ code, mod_loader = _get_code_from_file(run_name, path_name)
return _run_module_code(code, init_globals, run_name, path_name,
- pkg_name=pkg_name)
+ mod_loader, pkg_name)
else:
# Importer is defined for path, so add it to
# the start of sys.path
@@ -262,13 +240,7 @@ def run_path(path_name, init_globals=None, run_name=None):
# have no choice and we have to remove it even while we read the
# code. If we don't do this, a __loader__ attribute in the
# existing __main__ module may prevent location of the new module.
- main_name = "__main__"
- saved_main = sys.modules[main_name]
- del sys.modules[main_name]
- try:
- mod_name, loader, code, fname = _get_main_module_details()
- finally:
- sys.modules[main_name] = saved_main
+ mod_name, loader, code, fname = _get_main_module_details()
with _TempModule(run_name) as temp_module, \
_ModifiedArgv0(path_name):
mod_globals = temp_module.module.__dict__
diff --git a/Lib/sched.py b/Lib/sched.py
index a119892..5551f71 100644
--- a/Lib/sched.py
+++ b/Lib/sched.py
@@ -28,12 +28,21 @@ has another way to reference private data (besides global variables).
# XXX instead of having to define a module or class just to hold
# XXX the global state of your particular time and delay functions.
+import time
import heapq
from collections import namedtuple
+try:
+ import threading
+except ImportError:
+ import dummy_threading as threading
+try:
+ from time import monotonic as _time
+except ImportError:
+ from time import time as _time
__all__ = ["scheduler"]
-class Event(namedtuple('Event', 'time, priority, action, argument')):
+class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')):
def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority)
def __ne__(s, o): return (s.time, s.priority) != (o.time, o.priority)
def __lt__(s, o): return (s.time, s.priority) < (o.time, o.priority)
@@ -42,32 +51,36 @@ class Event(namedtuple('Event', 'time, priority, action, argument')):
def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority)
class scheduler:
- def __init__(self, timefunc, delayfunc):
+
+ def __init__(self, timefunc=_time, delayfunc=time.sleep):
"""Initialize a new instance, passing the time and delay
functions"""
self._queue = []
+ self._lock = threading.RLock()
self.timefunc = timefunc
self.delayfunc = delayfunc
- def enterabs(self, time, priority, action, argument):
+ def enterabs(self, time, priority, action, argument=[], kwargs={}):
"""Enter a new event in the queue at an absolute time.
Returns an ID for the event which can be used to remove it,
if necessary.
"""
- event = Event(time, priority, action, argument)
- heapq.heappush(self._queue, event)
- return event # The ID
+ with self._lock:
+ event = Event(time, priority, action, argument, kwargs)
+ heapq.heappush(self._queue, event)
+ return event # The ID
- def enter(self, delay, priority, action, argument):
+ def enter(self, delay, priority, action, argument=[], kwargs={}):
"""A variant that specifies the time as a relative time.
This is actually the more commonly used interface.
"""
- time = self.timefunc() + delay
- return self.enterabs(time, priority, action, argument)
+ with self._lock:
+ time = self.timefunc() + delay
+ return self.enterabs(time, priority, action, argument, kwargs)
def cancel(self, event):
"""Remove an event from the queue.
@@ -76,15 +89,20 @@ class scheduler:
If the event is not in the queue, this raises ValueError.
"""
- self._queue.remove(event)
- heapq.heapify(self._queue)
+ with self._lock:
+ self._queue.remove(event)
+ heapq.heapify(self._queue)
def empty(self):
"""Check whether the queue is empty."""
- return not self._queue
+ with self._lock:
+ return not self._queue
- def run(self):
+ def run(self, blocking=True):
"""Execute events until the queue is empty.
+ If blocking is False executes the scheduled events due to
+ expire soonest (if any) and then return the deadline of the
+ next scheduled call in the scheduler.
When there is a positive delay until the first event, the
delay function is called and the event is left in the queue;
@@ -106,24 +124,27 @@ class scheduler:
"""
# localize variable access to minimize overhead
# and to improve thread safety
- q = self._queue
- delayfunc = self.delayfunc
- timefunc = self.timefunc
- pop = heapq.heappop
- while q:
- time, priority, action, argument = checked_event = q[0]
- now = timefunc()
- if now < time:
- delayfunc(time - now)
- else:
- event = pop(q)
- # Verify that the event was not removed or altered
- # by another thread after we last looked at q[0].
- if event is checked_event:
- action(*argument)
- delayfunc(0) # Let other threads run
+ with self._lock:
+ q = self._queue
+ delayfunc = self.delayfunc
+ timefunc = self.timefunc
+ pop = heapq.heappop
+ while q:
+ time, priority, action, argument, kwargs = checked_event = q[0]
+ now = timefunc()
+ if now < time:
+ if not blocking:
+ return time - now
+ delayfunc(time - now)
else:
- heapq.heappush(q, event)
+ event = pop(q)
+ # Verify that the event was not removed or altered
+ # by another thread after we last looked at q[0].
+ if event is checked_event:
+ action(*argument, **kwargs)
+ delayfunc(0) # Let other threads run
+ else:
+ heapq.heappush(q, event)
@property
def queue(self):
@@ -136,5 +157,6 @@ class scheduler:
# Use heapq to sort the queue rather than using 'sorted(self._queue)'.
# With heapq, two events scheduled at the same time will show in
# the actual order they would be retrieved.
- events = self._queue[:]
- return map(heapq.heappop, [events]*len(events))
+ with self._lock:
+ events = self._queue[:]
+ return map(heapq.heappop, [events]*len(events))
diff --git a/Lib/shlex.py b/Lib/shlex.py
index 3edd3db..69f3b45 100644
--- a/Lib/shlex.py
+++ b/Lib/shlex.py
@@ -6,13 +6,14 @@
# Posix compliance, split(), string arguments, and
# iterator interface by Gustavo Niemeyer, April 2003.
-import os.path
+import os
+import re
import sys
from collections import deque
from io import StringIO
-__all__ = ["shlex", "split"]
+__all__ = ["shlex", "split", "quote"]
class shlex:
"A lexical analyzer class for simple shell-like syntaxes."
@@ -274,6 +275,21 @@ def split(s, comments=False, posix=True):
lex.commenters = ''
return list(lex)
+
+_find_unsafe = re.compile(r'[^\w@%+=:,./-]', re.ASCII).search
+
+def quote(s):
+ """Return a shell-escaped version of the string *s*."""
+ if not s:
+ return "''"
+ if _find_unsafe(s) is None:
+ return s
+
+ # use single quotes, and put single quotes into double quotes
+ # the string $'b is then quoted as '$'"'"'b'
+ return "'" + s.replace("'", "'\"'\"'") + "'"
+
+
if __name__ == '__main__':
if len(sys.argv) == 1:
lexer = shlex()
diff --git a/Lib/shutil.py b/Lib/shutil.py
index ef29ae2..5dc311e 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -15,6 +15,7 @@ import tarfile
try:
import bz2
+ del bz2
_BZ2_SUPPORTED = True
except ImportError:
_BZ2_SUPPORTED = False
@@ -34,7 +35,9 @@ __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
"ExecError", "make_archive", "get_archive_formats",
"register_archive_format", "unregister_archive_format",
"get_unpack_formats", "register_unpack_format",
- "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
+ "unregister_unpack_format", "unpack_archive",
+ "ignore_patterns", "chown", "which"]
+ # disk_usage is added later, if available on the platform
class Error(EnvironmentError):
pass
@@ -79,8 +82,13 @@ def _samefile(src, dst):
return (os.path.normcase(os.path.abspath(src)) ==
os.path.normcase(os.path.abspath(dst)))
-def copyfile(src, dst):
- """Copy data from src to dst"""
+def copyfile(src, dst, *, follow_symlinks=True):
+ """Copy data from src to dst.
+
+ If follow_symlinks is not set and src is a symbolic link, a new
+ symlink will be created instead of copying the file it points to.
+
+ """
if _samefile(src, dst):
raise Error("`%s` and `%s` are the same file" % (src, dst))
@@ -95,56 +103,140 @@ def copyfile(src, dst):
if stat.S_ISFIFO(st.st_mode):
raise SpecialFileError("`%s` is a named pipe" % fn)
- with open(src, 'rb') as fsrc:
- with open(dst, 'wb') as fdst:
- copyfileobj(fsrc, fdst)
+ if not follow_symlinks and os.path.islink(src):
+ os.symlink(os.readlink(src), dst)
+ else:
+ with open(src, 'rb') as fsrc:
+ with open(dst, 'wb') as fdst:
+ copyfileobj(fsrc, fdst)
+ return dst
+
+def copymode(src, dst, *, follow_symlinks=True):
+ """Copy mode bits from src to dst.
+
+ If follow_symlinks is not set, symlinks aren't followed if and only
+ if both `src` and `dst` are symlinks. If `lchmod` isn't available
+ (e.g. Linux) this method does nothing.
+
+ """
+ if not follow_symlinks and os.path.islink(src) and os.path.islink(dst):
+ if hasattr(os, 'lchmod'):
+ stat_func, chmod_func = os.lstat, os.lchmod
+ else:
+ return
+ elif hasattr(os, 'chmod'):
+ stat_func, chmod_func = os.stat, os.chmod
+ else:
+ return
+
+ st = stat_func(src)
+ chmod_func(dst, stat.S_IMODE(st.st_mode))
+
+if hasattr(os, 'listxattr'):
+ def _copyxattr(src, dst, *, follow_symlinks=True):
+ """Copy extended filesystem attributes from `src` to `dst`.
+
+ Overwrite existing attributes.
+
+ If `follow_symlinks` is false, symlinks won't be followed.
-def copymode(src, dst):
- """Copy mode bits from src to dst"""
- if hasattr(os, 'chmod'):
- st = os.stat(src)
- mode = stat.S_IMODE(st.st_mode)
- os.chmod(dst, mode)
+ """
-def copystat(src, dst):
- """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
- st = os.stat(src)
+ for name in os.listxattr(src, follow_symlinks=follow_symlinks):
+ try:
+ value = os.getxattr(src, name, follow_symlinks=follow_symlinks)
+ os.setxattr(dst, name, value, follow_symlinks=follow_symlinks)
+ except OSError as e:
+ if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA):
+ raise
+else:
+ def _copyxattr(*args, **kwargs):
+ pass
+
+def copystat(src, dst, *, follow_symlinks=True):
+ """Copy all stat info (mode bits, atime, mtime, flags) from src to dst.
+
+ If the optional flag `follow_symlinks` is not set, symlinks aren't followed if and
+ only if both `src` and `dst` are symlinks.
+
+ """
+ def _nop(*args, ns=None, follow_symlinks=None):
+ pass
+
+ # follow symlinks (aka don't not follow symlinks)
+ follow = follow_symlinks or not (os.path.islink(src) and os.path.islink(dst))
+ if follow:
+ # use the real function if it exists
+ def lookup(name):
+ return getattr(os, name, _nop)
+ else:
+ # use the real function only if it exists
+ # *and* it supports follow_symlinks
+ def lookup(name):
+ fn = getattr(os, name, _nop)
+ if fn in os.supports_follow_symlinks:
+ return fn
+ return _nop
+
+ st = lookup("stat")(src, follow_symlinks=follow)
mode = stat.S_IMODE(st.st_mode)
- if hasattr(os, 'utime'):
- os.utime(dst, (st.st_atime, st.st_mtime))
- if hasattr(os, 'chmod'):
- os.chmod(dst, mode)
- if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
+ lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns),
+ follow_symlinks=follow)
+ try:
+ lookup("chmod")(dst, mode, follow_symlinks=follow)
+ except NotImplementedError:
+ # if we got a NotImplementedError, it's because
+ # * follow_symlinks=False,
+ # * lchown() is unavailable, and
+ # * either
+ # * fchownat() is unvailable or
+ # * fchownat() doesn't implement AT_SYMLINK_NOFOLLOW.
+ # (it returned ENOSUP.)
+ # therefore we're out of options--we simply cannot chown the
+ # symlink. give up, suppress the error.
+ # (which is what shutil always did in this circumstance.)
+ pass
+ if hasattr(st, 'st_flags'):
try:
- os.chflags(dst, st.st_flags)
+ lookup("chflags")(dst, st.st_flags, follow_symlinks=follow)
except OSError as why:
for err in 'EOPNOTSUPP', 'ENOTSUP':
if hasattr(errno, err) and why.errno == getattr(errno, err):
break
else:
raise
+ _copyxattr(src, dst, follow_symlinks=follow)
-def copy(src, dst):
- """Copy data and mode bits ("cp src dst").
+def copy(src, dst, *, follow_symlinks=True):
+ """Copy data and mode bits ("cp src dst"). Return the file's destination.
The destination may be a directory.
+ If follow_symlinks is false, symlinks won't be followed. This
+ resembles GNU's "cp -P src dst".
+
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copymode(src, dst)
+ copyfile(src, dst, follow_symlinks=follow_symlinks)
+ copymode(src, dst, follow_symlinks=follow_symlinks)
+ return dst
-def copy2(src, dst):
- """Copy data and all stat info ("cp -p src dst").
+def copy2(src, dst, *, follow_symlinks=True):
+ """Copy data and all stat info ("cp -p src dst"). Return the file's
+ destination."
The destination may be a directory.
+ If follow_symlinks is false, symlinks won't be followed. This
+ resembles GNU's "cp -P src dst".
+
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copystat(src, dst)
+ copyfile(src, dst, follow_symlinks=follow_symlinks)
+ copystat(src, dst, follow_symlinks=follow_symlinks)
+ return dst
def ignore_patterns(*patterns):
"""Function that can be used as copytree() ignore parameter.
@@ -211,7 +303,11 @@ def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
if os.path.islink(srcname):
linkto = os.readlink(srcname)
if symlinks:
+ # We can't just leave it to `copy_function` because legacy
+ # code with a custom `copy_function` may rely on copytree
+ # doing the right thing.
os.symlink(linkto, dstname)
+ copystat(srcname, dstname, follow_symlinks=not symlinks)
else:
# ignore dangling symlink if the flag is on
if not os.path.exists(linkto) and ignore_dangling_symlinks:
@@ -239,24 +335,10 @@ def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
errors.append((src, dst, str(why)))
if errors:
raise Error(errors)
+ return dst
-def rmtree(path, ignore_errors=False, onerror=None):
- """Recursively delete a directory tree.
-
- If ignore_errors is set, errors are ignored; otherwise, if onerror
- is set, it is called to handle the error with arguments (func,
- path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
- path is the argument to that function that caused it to fail; and
- exc_info is a tuple returned by sys.exc_info(). If ignore_errors
- is false and onerror is None, an exception is raised.
-
- """
- if ignore_errors:
- def onerror(*args):
- pass
- elif onerror is None:
- def onerror(*args):
- raise
+# version vulnerable to race conditions
+def _rmtree_unsafe(path, onerror):
try:
if os.path.islink(path):
# symlinks to directories are forbidden, see bug #1669
@@ -268,7 +350,7 @@ def rmtree(path, ignore_errors=False, onerror=None):
names = []
try:
names = os.listdir(path)
- except os.error as err:
+ except os.error:
onerror(os.listdir, path, sys.exc_info())
for name in names:
fullname = os.path.join(path, name)
@@ -277,17 +359,109 @@ def rmtree(path, ignore_errors=False, onerror=None):
except os.error:
mode = 0
if stat.S_ISDIR(mode):
- rmtree(fullname, ignore_errors, onerror)
+ _rmtree_unsafe(fullname, onerror)
else:
try:
- os.remove(fullname)
- except os.error as err:
- onerror(os.remove, fullname, sys.exc_info())
+ os.unlink(fullname)
+ except os.error:
+ onerror(os.unlink, fullname, sys.exc_info())
try:
os.rmdir(path)
except os.error:
onerror(os.rmdir, path, sys.exc_info())
+# Version using fd-based APIs to protect against races
+def _rmtree_safe_fd(topfd, path, onerror):
+ names = []
+ try:
+ names = os.listdir(topfd)
+ except os.error:
+ onerror(os.listdir, path, sys.exc_info())
+ for name in names:
+ fullname = os.path.join(path, name)
+ try:
+ orig_st = os.stat(name, dir_fd=topfd, follow_symlinks=False)
+ mode = orig_st.st_mode
+ except os.error:
+ mode = 0
+ if stat.S_ISDIR(mode):
+ try:
+ dirfd = os.open(name, os.O_RDONLY, dir_fd=topfd)
+ except os.error:
+ onerror(os.open, fullname, sys.exc_info())
+ else:
+ try:
+ if os.path.samestat(orig_st, os.fstat(dirfd)):
+ _rmtree_safe_fd(dirfd, fullname, onerror)
+ try:
+ os.rmdir(name, dir_fd=topfd)
+ except os.error:
+ onerror(os.rmdir, fullname, sys.exc_info())
+ finally:
+ os.close(dirfd)
+ else:
+ try:
+ os.unlink(name, dir_fd=topfd)
+ except os.error:
+ onerror(os.unlink, fullname, sys.exc_info())
+
+_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <=
+ os.supports_dir_fd and
+ os.listdir in os.supports_fd and
+ os.stat in os.supports_follow_symlinks)
+
+def rmtree(path, ignore_errors=False, onerror=None):
+ """Recursively delete a directory tree.
+
+ If ignore_errors is set, errors are ignored; otherwise, if onerror
+ is set, it is called to handle the error with arguments (func,
+ path, exc_info) where func is platform and implementation dependent;
+ path is the argument to that function that caused it to fail; and
+ exc_info is a tuple returned by sys.exc_info(). If ignore_errors
+ is false and onerror is None, an exception is raised.
+
+ """
+ if ignore_errors:
+ def onerror(*args):
+ pass
+ elif onerror is None:
+ def onerror(*args):
+ raise
+ if _use_fd_functions:
+ # While the unsafe rmtree works fine on bytes, the fd based does not.
+ if isinstance(path, bytes):
+ path = os.fsdecode(path)
+ # Note: To guard against symlink races, we use the standard
+ # lstat()/open()/fstat() trick.
+ try:
+ orig_st = os.lstat(path)
+ except Exception:
+ onerror(os.lstat, path, sys.exc_info())
+ return
+ try:
+ fd = os.open(path, os.O_RDONLY)
+ except Exception:
+ onerror(os.lstat, path, sys.exc_info())
+ return
+ try:
+ if (stat.S_ISDIR(orig_st.st_mode) and
+ os.path.samestat(orig_st, os.fstat(fd))):
+ _rmtree_safe_fd(fd, path, onerror)
+ try:
+ os.rmdir(path)
+ except os.error:
+ onerror(os.rmdir, path, sys.exc_info())
+ else:
+ raise NotADirectoryError(20,
+ "Not a directory: '{}'".format(path))
+ finally:
+ os.close(fd)
+ else:
+ return _rmtree_unsafe(path, onerror)
+
+# Allow introspection of whether or not the hardening against symlink
+# attacks is supported on the current platform
+rmtree.avoids_symlink_attacks = _use_fd_functions
def _basename(path):
# A basename() variant which first strips the trailing slash, if present.
@@ -296,7 +470,8 @@ def _basename(path):
def move(src, dst):
"""Recursively move a file or directory to another location. This is
- similar to the Unix "mv" command.
+ similar to the Unix "mv" command. Return the file or directory's
+ destination.
If the destination is a directory or a symlink to a directory, the source
is moved inside the directory. The destination path must not already
@@ -306,7 +481,10 @@ def move(src, dst):
overwritten depending on os.rename() semantics.
If the destination is on our current filesystem, then rename() is used.
- Otherwise, src is copied to the destination and then removed.
+ Otherwise, src is copied to the destination and then removed. Symlinks are
+ recreated under the new name if os.rename() fails because of cross
+ filesystem renames.
+
A lot more could be done here... A look at a mv.c shows a lot of
the issues this implementation glosses over.
@@ -324,8 +502,12 @@ def move(src, dst):
raise Error("Destination path '%s' already exists" % real_dst)
try:
os.rename(src, real_dst)
- except OSError as exc:
- if os.path.isdir(src):
+ except OSError:
+ if os.path.islink(src):
+ linkto = os.readlink(src)
+ os.symlink(linkto, real_dst)
+ os.unlink(src)
+ elif os.path.isdir(src):
if _destinsrc(src, dst):
raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
copytree(src, real_dst, symlinks=True)
@@ -333,6 +515,7 @@ def move(src, dst):
else:
copy2(src, real_dst)
os.unlink(src)
+ return real_dst
def _destinsrc(src, dst):
src = abspath(src)
@@ -391,7 +574,7 @@ def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
compress_ext['bzip2'] = '.bz2'
# flags for compression program, each element of list will be an argument
- if compress is not None and compress not in compress_ext.keys():
+ if compress is not None and compress not in compress_ext:
raise ValueError("bad value for 'compress', or compression format not "
"supported : {0}".format(compress))
@@ -496,7 +679,7 @@ def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
_ARCHIVE_FORMATS = {
'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"),
- 'zip': (_make_zipfile, [],"ZIP file")
+ 'zip': (_make_zipfile, [], "ZIP file")
}
if _BZ2_SUPPORTED:
@@ -529,7 +712,7 @@ def register_archive_format(name, function, extra_args=None, description=''):
if not isinstance(extra_args, (tuple, list)):
raise TypeError('extra_args needs to be a sequence')
for element in extra_args:
- if not isinstance(element, (tuple, list)) or len(element) !=2 :
+ if not isinstance(element, (tuple, list)) or len(element) !=2:
raise TypeError('extra_args elements are : (arg_name, value)')
_ARCHIVE_FORMATS[name] = (function, extra_args, description)
@@ -681,7 +864,7 @@ def _unpack_zipfile(filename, extract_dir):
if not name.endswith('/'):
# file
data = zip.read(info.filename)
- f = open(target,'wb')
+ f = open(target, 'wb')
try:
f.write(data)
finally:
@@ -755,3 +938,165 @@ def unpack_archive(filename, extract_dir=None, format=None):
func = _UNPACK_FORMATS[format][1]
kwargs = dict(_UNPACK_FORMATS[format][2])
func(filename, extract_dir, **kwargs)
+
+
+if hasattr(os, 'statvfs'):
+
+ __all__.append('disk_usage')
+ _ntuple_diskusage = collections.namedtuple('usage', 'total used free')
+
+ def disk_usage(path):
+ """Return disk usage statistics about the given path.
+
+ Returned value is a named tuple with attributes 'total', 'used' and
+ 'free', which are the amount of total, used and free space, in bytes.
+ """
+ st = os.statvfs(path)
+ free = st.f_bavail * st.f_frsize
+ total = st.f_blocks * st.f_frsize
+ used = (st.f_blocks - st.f_bfree) * st.f_frsize
+ return _ntuple_diskusage(total, used, free)
+
+elif os.name == 'nt':
+
+ import nt
+ __all__.append('disk_usage')
+ _ntuple_diskusage = collections.namedtuple('usage', 'total used free')
+
+ def disk_usage(path):
+ """Return disk usage statistics about the given path.
+
+ Returned valus is a named tuple with attributes 'total', 'used' and
+ 'free', which are the amount of total, used and free space, in bytes.
+ """
+ total, free = nt._getdiskusage(path)
+ used = total - free
+ return _ntuple_diskusage(total, used, free)
+
+
+def chown(path, user=None, group=None):
+ """Change owner user and group of the given path.
+
+ user and group can be the uid/gid or the user/group names, and in that case,
+ they are converted to their respective uid/gid.
+ """
+
+ if user is None and group is None:
+ raise ValueError("user and/or group must be set")
+
+ _user = user
+ _group = group
+
+ # -1 means don't change it
+ if user is None:
+ _user = -1
+ # user can either be an int (the uid) or a string (the system username)
+ elif isinstance(user, str):
+ _user = _get_uid(user)
+ if _user is None:
+ raise LookupError("no such user: {!r}".format(user))
+
+ if group is None:
+ _group = -1
+ elif not isinstance(group, int):
+ _group = _get_gid(group)
+ if _group is None:
+ raise LookupError("no such group: {!r}".format(group))
+
+ os.chown(path, _user, _group)
+
+def get_terminal_size(fallback=(80, 24)):
+ """Get the size of the terminal window.
+
+ For each of the two dimensions, the environment variable, COLUMNS
+ and LINES respectively, is checked. If the variable is defined and
+ the value is a positive integer, it is used.
+
+ When COLUMNS or LINES is not defined, which is the common case,
+ the terminal connected to sys.__stdout__ is queried
+ by invoking os.get_terminal_size.
+
+ If the terminal size cannot be successfully queried, either because
+ the system doesn't support querying, or because we are not
+ connected to a terminal, the value given in fallback parameter
+ is used. Fallback defaults to (80, 24) which is the default
+ size used by many terminal emulators.
+
+ The value returned is a named tuple of type os.terminal_size.
+ """
+ # columns, lines are the working values
+ try:
+ columns = int(os.environ['COLUMNS'])
+ except (KeyError, ValueError):
+ columns = 0
+
+ try:
+ lines = int(os.environ['LINES'])
+ except (KeyError, ValueError):
+ lines = 0
+
+ # only query if necessary
+ if columns <= 0 or lines <= 0:
+ try:
+ size = os.get_terminal_size(sys.__stdout__.fileno())
+ except (NameError, OSError):
+ size = os.terminal_size(fallback)
+ if columns <= 0:
+ columns = size.columns
+ if lines <= 0:
+ lines = size.lines
+
+ return os.terminal_size((columns, lines))
+
+def which(cmd, mode=os.F_OK | os.X_OK, path=None):
+ """Given a command, mode, and a PATH string, return the path which
+ conforms to the given mode on the PATH, or None if there is no such
+ file.
+
+ `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
+ of os.environ.get("PATH"), or can be overridden with a custom search
+ path.
+
+ """
+ # Check that a given file can be accessed with the correct mode.
+ # Additionally check that `file` is not a directory, as on Windows
+ # directories pass the os.access check.
+ def _access_check(fn, mode):
+ return (os.path.exists(fn) and os.access(fn, mode)
+ and not os.path.isdir(fn))
+
+ # Short circuit. If we're given a full path which matches the mode
+ # and it exists, we're done here.
+ if _access_check(cmd, mode):
+ return cmd
+
+ path = (path or os.environ.get("PATH", os.defpath)).split(os.pathsep)
+
+ if sys.platform == "win32":
+ # The current directory takes precedence on Windows.
+ if not os.curdir in path:
+ path.insert(0, os.curdir)
+
+ # PATHEXT is necessary to check on Windows.
+ pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
+ # See if the given file matches any of the expected path extensions.
+ # This will allow us to short circuit when given "python.exe".
+ matches = [cmd for ext in pathext if cmd.lower().endswith(ext.lower())]
+ # If it does match, only test that one, otherwise we have to try
+ # others.
+ files = [cmd] if matches else [cmd + ext.lower() for ext in pathext]
+ else:
+ # On other platforms you don't have things like PATHEXT to tell you
+ # what file suffixes are executable, so just pass on cmd as-is.
+ files = [cmd]
+
+ seen = set()
+ for dir in path:
+ dir = os.path.normcase(dir)
+ if not dir in seen:
+ seen.add(dir)
+ for thefile in files:
+ name = os.path.join(dir, thefile)
+ if _access_check(name, mode):
+ return name
+ return None
diff --git a/Lib/site.py b/Lib/site.py
index a2c0bec..0aaf46b 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -13,6 +13,19 @@ prefixes directly, as well as with lib/site-packages appended. The
resulting directories, if they exist, are appended to sys.path, and
also inspected for path configuration files.
+If a file named "pyvenv.cfg" exists one directory above sys.executable,
+sys.prefix and sys.exec_prefix are set to that directory and
+it is also checked for site-packages and site-python (sys.base_prefix and
+sys.base_exec_prefix will always be the "real" prefixes of the Python
+installation). If "pyvenv.cfg" (a bootstrap configuration file) contains
+the key "include-system-site-packages" set to anything other than "false"
+(case-insensitive), the system-level prefixes will still also be
+searched for site-packages; otherwise they won't.
+
+All of the resulting site-specific directories, if they exist, are
+appended to sys.path, and also inspected for path configuration
+files.
+
A path configuration file is a file whose name has the form
<package>.pth; its contents are additional directories (one per line)
to be added to sys.path. Non-existing directories (or
@@ -54,8 +67,8 @@ ImportError exception, it is silently ignored.
import sys
import os
+import re
import builtins
-import traceback
# Prefixes for site-packages; add additional prefixes like /usr/local here
PREFIXES = [sys.prefix, sys.exec_prefix]
@@ -82,7 +95,8 @@ def makepath(*paths):
def abs_paths():
"""Set all module __file__ and __cached__ attributes to an absolute path"""
for m in set(sys.modules.values()):
- if hasattr(m, '__loader__'):
+ if (getattr(getattr(m, '__loader__', None), '__module__', None) !=
+ '_frozen_importlib'):
continue # don't mess with a PEP 302-supplied __file__
try:
m.__file__ = os.path.abspath(m.__file__)
@@ -138,7 +152,7 @@ def addpackage(sitedir, name, known_paths):
reset = 0
fullname = os.path.join(sitedir, name)
try:
- f = open(fullname, "rU")
+ f = open(fullname, "r")
except IOError:
return
with f:
@@ -154,9 +168,10 @@ def addpackage(sitedir, name, known_paths):
if not dircase in known_paths and os.path.exists(dir):
sys.path.append(dir)
known_paths.add(dircase)
- except Exception as err:
+ except Exception:
print("Error processing line {:d} of {}:\n".format(n+1, fullname),
file=sys.stderr)
+ import traceback
for record in traceback.format_exception(*sys.exc_info()):
for line in record.splitlines():
print(' '+line, file=sys.stderr)
@@ -178,6 +193,7 @@ def addsitedir(sitedir, known_paths=None):
sitedir, sitedircase = makepath(sitedir)
if not sitedircase in known_paths:
sys.path.append(sitedir) # Add path component
+ known_paths.add(sitedircase)
try:
names = os.listdir(sitedir)
except os.error:
@@ -241,7 +257,6 @@ def getusersitepackages():
return USER_SITE
from sysconfig import get_path
- import os
if sys.platform == 'darwin':
from sysconfig import get_config_var
@@ -266,18 +281,21 @@ def addusersitepackages(known_paths):
addsitedir(user_site, known_paths)
return known_paths
-def getsitepackages():
+def getsitepackages(prefixes=None):
"""Returns a list containing all global site-packages directories
(and possibly site-python).
- For each directory present in the global ``PREFIXES``, this function
- will find its `site-packages` subdirectory depending on the system
- environment, and will return a list of full paths.
+ For each directory present in ``prefixes`` (or the global ``PREFIXES``),
+ this function will find its `site-packages` subdirectory depending on the
+ system environment, and will return a list of full paths.
"""
sitepackages = []
seen = set()
- for prefix in PREFIXES:
+ if prefixes is None:
+ prefixes = PREFIXES
+
+ for prefix in prefixes:
if not prefix or prefix in seen:
continue
seen.add(prefix)
@@ -303,9 +321,9 @@ def getsitepackages():
sys.version[:3], "site-packages"))
return sitepackages
-def addsitepackages(known_paths):
+def addsitepackages(known_paths, prefixes=None):
"""Add site-packages (and possibly site-python) to sys.path"""
- for sitedir in getsitepackages():
+ for sitedir in getsitepackages(prefixes):
if os.path.isdir(sitedir):
addsitedir(sitedir, known_paths)
@@ -385,7 +403,7 @@ class _Printer(object):
for filename in self.__files:
filename = os.path.join(dir, filename)
try:
- fp = open(filename, "rU")
+ fp = open(filename, "r")
data = fp.read()
fp.close()
break
@@ -475,6 +493,61 @@ def aliasmbcs():
encodings.aliases.aliases[enc] = 'mbcs'
+CONFIG_LINE = re.compile(r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$')
+
+def venv(known_paths):
+ global PREFIXES, ENABLE_USER_SITE
+
+ env = os.environ
+ if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
+ executable = os.environ['__PYVENV_LAUNCHER__']
+ else:
+ executable = sys.executable
+ executable_dir, executable_name = os.path.split(executable)
+ site_prefix = os.path.dirname(executable_dir)
+ sys._home = None
+ if sys.platform == 'win32':
+ executable_name = os.path.splitext(executable_name)[0]
+ conf_basename = 'pyvenv.cfg'
+ candidate_confs = [
+ conffile for conffile in (
+ os.path.join(executable_dir, conf_basename),
+ os.path.join(site_prefix, conf_basename)
+ )
+ if os.path.isfile(conffile)
+ ]
+
+ if candidate_confs:
+ virtual_conf = candidate_confs[0]
+ system_site = "true"
+ with open(virtual_conf) as f:
+ for line in f:
+ line = line.strip()
+ m = CONFIG_LINE.match(line)
+ if m:
+ d = m.groupdict()
+ key, value = d['key'].lower(), d['value']
+ if key == 'include-system-site-packages':
+ system_site = value.lower()
+ elif key == 'home':
+ sys._home = value
+
+ sys.prefix = sys.exec_prefix = site_prefix
+
+ # Doing this here ensures venv takes precedence over user-site
+ addsitepackages(known_paths, [sys.prefix])
+
+ # addsitepackages will process site_prefix again if its in PREFIXES,
+ # but that's ok; known_paths will prevent anything being added twice
+ if system_site == "true":
+ PREFIXES.insert(0, sys.prefix)
+ else:
+ PREFIXES = [sys.prefix]
+ ENABLE_USER_SITE = False
+
+ return known_paths
+
+
def execsitecustomize():
"""Run custom site specific code, if available."""
try:
@@ -508,10 +581,16 @@ def execusercustomize():
def main():
+ """Add standard site-specific directories to the module search path.
+
+ This function is called automatically when this module is imported,
+ unless the python interpreter was started with the -S flag.
+ """
global ENABLE_USER_SITE
abs_paths()
known_paths = removeduppaths()
+ known_paths = venv(known_paths)
if ENABLE_USER_SITE is None:
ENABLE_USER_SITE = check_enableusersite()
known_paths = addusersitepackages(known_paths)
@@ -526,7 +605,10 @@ def main():
if ENABLE_USER_SITE:
execusercustomize()
-main()
+# Prevent edition of sys.path when python was started with -S and
+# site is imported later.
+if not sys.flags.no_site:
+ main()
def _script():
help = """\
diff --git a/Lib/smtpd.py b/Lib/smtpd.py
index 8cd405c..778d6d6 100755
--- a/Lib/smtpd.py
+++ b/Lib/smtpd.py
@@ -1,5 +1,5 @@
#! /usr/bin/env python3
-"""An RFC 2821 smtp proxy.
+"""An RFC 5321 smtp proxy.
Usage: %(program)s [options] [localhost:localport [remotehost:remoteport]]
@@ -20,6 +20,11 @@ Options:
Use `classname' as the concrete SMTP proxy class. Uses `PureProxy' by
default.
+ --size limit
+ -s limit
+ Restrict the total size of the incoming message to "limit" number of
+ bytes via the RFC 1870 SIZE extension. Defaults to 33554432 bytes.
+
--debug
-d
Turn on debugging prints.
@@ -35,10 +40,9 @@ given then 8025 is used. If remotehost is not given then `localhost' is used,
and if remoteport is not given, then 25 is used.
"""
-
# Overview:
#
-# This file implements the minimal SMTP protocol as defined in RFC 821. It
+# This file implements the minimal SMTP protocol as defined in RFC 5321. It
# has a hierarchy of classes which implement the backend functionality for the
# smtpd. A number of classes are provided:
#
@@ -66,7 +70,7 @@ and if remoteport is not given, then 25 is used.
#
# - support mailbox delivery
# - alias files
-# - ESMTP
+# - Handle more ESMTP extensions
# - handle error codes from the backend smtpd
import sys
@@ -77,12 +81,14 @@ import time
import socket
import asyncore
import asynchat
+import collections
from warnings import warn
+from email._header_value_parser import get_addr_spec, get_angle_addr
__all__ = ["SMTPServer","DebuggingServer","PureProxy","MailmanProxy"]
program = sys.argv[0]
-__version__ = 'Python SMTP proxy version 0.2'
+__version__ = 'Python SMTP proxy version 0.3'
class Devnull:
@@ -94,9 +100,9 @@ DEBUGSTREAM = Devnull()
NEWLINE = '\n'
EMPTYSTRING = ''
COMMASPACE = ', '
+DATA_SIZE_DEFAULT = 33554432
-
def usage(code, msg=''):
print(__doc__ % globals(), file=sys.stderr)
if msg:
@@ -104,19 +110,23 @@ def usage(code, msg=''):
sys.exit(code)
-
class SMTPChannel(asynchat.async_chat):
COMMAND = 0
DATA = 1
- data_size_limit = 33554432
command_size_limit = 512
+ command_size_limits = collections.defaultdict(lambda x=command_size_limit: x)
+ command_size_limits.update({
+ 'MAIL': command_size_limit + 26,
+ })
+ max_command_size_limit = max(command_size_limits.values())
- def __init__(self, server, conn, addr):
+ def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT):
asynchat.async_chat.__init__(self, conn)
self.smtp_server = server
self.conn = conn
self.addr = addr
+ self.data_size_limit = data_size_limit
self.received_lines = []
self.smtp_state = self.COMMAND
self.seen_greeting = ''
@@ -137,127 +147,128 @@ class SMTPChannel(asynchat.async_chat):
print('Peer:', repr(self.peer), file=DEBUGSTREAM)
self.push('220 %s %s' % (self.fqdn, __version__))
self.set_terminator(b'\r\n')
+ self.extended_smtp = False
# properties for backwards-compatibility
@property
def __server(self):
warn("Access to __server attribute on SMTPChannel is deprecated, "
- "use 'smtp_server' instead", PendingDeprecationWarning, 2)
+ "use 'smtp_server' instead", DeprecationWarning, 2)
return self.smtp_server
@__server.setter
def __server(self, value):
warn("Setting __server attribute on SMTPChannel is deprecated, "
- "set 'smtp_server' instead", PendingDeprecationWarning, 2)
+ "set 'smtp_server' instead", DeprecationWarning, 2)
self.smtp_server = value
@property
def __line(self):
warn("Access to __line attribute on SMTPChannel is deprecated, "
- "use 'received_lines' instead", PendingDeprecationWarning, 2)
+ "use 'received_lines' instead", DeprecationWarning, 2)
return self.received_lines
@__line.setter
def __line(self, value):
warn("Setting __line attribute on SMTPChannel is deprecated, "
- "set 'received_lines' instead", PendingDeprecationWarning, 2)
+ "set 'received_lines' instead", DeprecationWarning, 2)
self.received_lines = value
@property
def __state(self):
warn("Access to __state attribute on SMTPChannel is deprecated, "
- "use 'smtp_state' instead", PendingDeprecationWarning, 2)
+ "use 'smtp_state' instead", DeprecationWarning, 2)
return self.smtp_state
@__state.setter
def __state(self, value):
warn("Setting __state attribute on SMTPChannel is deprecated, "
- "set 'smtp_state' instead", PendingDeprecationWarning, 2)
+ "set 'smtp_state' instead", DeprecationWarning, 2)
self.smtp_state = value
@property
def __greeting(self):
warn("Access to __greeting attribute on SMTPChannel is deprecated, "
- "use 'seen_greeting' instead", PendingDeprecationWarning, 2)
+ "use 'seen_greeting' instead", DeprecationWarning, 2)
return self.seen_greeting
@__greeting.setter
def __greeting(self, value):
warn("Setting __greeting attribute on SMTPChannel is deprecated, "
- "set 'seen_greeting' instead", PendingDeprecationWarning, 2)
+ "set 'seen_greeting' instead", DeprecationWarning, 2)
self.seen_greeting = value
@property
def __mailfrom(self):
warn("Access to __mailfrom attribute on SMTPChannel is deprecated, "
- "use 'mailfrom' instead", PendingDeprecationWarning, 2)
+ "use 'mailfrom' instead", DeprecationWarning, 2)
return self.mailfrom
@__mailfrom.setter
def __mailfrom(self, value):
warn("Setting __mailfrom attribute on SMTPChannel is deprecated, "
- "set 'mailfrom' instead", PendingDeprecationWarning, 2)
+ "set 'mailfrom' instead", DeprecationWarning, 2)
self.mailfrom = value
@property
def __rcpttos(self):
warn("Access to __rcpttos attribute on SMTPChannel is deprecated, "
- "use 'rcpttos' instead", PendingDeprecationWarning, 2)
+ "use 'rcpttos' instead", DeprecationWarning, 2)
return self.rcpttos
@__rcpttos.setter
def __rcpttos(self, value):
warn("Setting __rcpttos attribute on SMTPChannel is deprecated, "
- "set 'rcpttos' instead", PendingDeprecationWarning, 2)
+ "set 'rcpttos' instead", DeprecationWarning, 2)
self.rcpttos = value
@property
def __data(self):
warn("Access to __data attribute on SMTPChannel is deprecated, "
- "use 'received_data' instead", PendingDeprecationWarning, 2)
+ "use 'received_data' instead", DeprecationWarning, 2)
return self.received_data
@__data.setter
def __data(self, value):
warn("Setting __data attribute on SMTPChannel is deprecated, "
- "set 'received_data' instead", PendingDeprecationWarning, 2)
+ "set 'received_data' instead", DeprecationWarning, 2)
self.received_data = value
@property
def __fqdn(self):
warn("Access to __fqdn attribute on SMTPChannel is deprecated, "
- "use 'fqdn' instead", PendingDeprecationWarning, 2)
+ "use 'fqdn' instead", DeprecationWarning, 2)
return self.fqdn
@__fqdn.setter
def __fqdn(self, value):
warn("Setting __fqdn attribute on SMTPChannel is deprecated, "
- "set 'fqdn' instead", PendingDeprecationWarning, 2)
+ "set 'fqdn' instead", DeprecationWarning, 2)
self.fqdn = value
@property
def __peer(self):
warn("Access to __peer attribute on SMTPChannel is deprecated, "
- "use 'peer' instead", PendingDeprecationWarning, 2)
+ "use 'peer' instead", DeprecationWarning, 2)
return self.peer
@__peer.setter
def __peer(self, value):
warn("Setting __peer attribute on SMTPChannel is deprecated, "
- "set 'peer' instead", PendingDeprecationWarning, 2)
+ "set 'peer' instead", DeprecationWarning, 2)
self.peer = value
@property
def __conn(self):
warn("Access to __conn attribute on SMTPChannel is deprecated, "
- "use 'conn' instead", PendingDeprecationWarning, 2)
+ "use 'conn' instead", DeprecationWarning, 2)
return self.conn
@__conn.setter
def __conn(self, value):
warn("Setting __conn attribute on SMTPChannel is deprecated, "
- "set 'conn' instead", PendingDeprecationWarning, 2)
+ "set 'conn' instead", DeprecationWarning, 2)
self.conn = value
@property
def __addr(self):
warn("Access to __addr attribute on SMTPChannel is deprecated, "
- "use 'addr' instead", PendingDeprecationWarning, 2)
+ "use 'addr' instead", DeprecationWarning, 2)
return self.addr
@__addr.setter
def __addr(self, value):
warn("Setting __addr attribute on SMTPChannel is deprecated, "
- "set 'addr' instead", PendingDeprecationWarning, 2)
+ "set 'addr' instead", DeprecationWarning, 2)
self.addr = value
# Overrides base class for convenience
@@ -268,14 +279,14 @@ class SMTPChannel(asynchat.async_chat):
def collect_incoming_data(self, data):
limit = None
if self.smtp_state == self.COMMAND:
- limit = self.command_size_limit
+ limit = self.max_command_size_limit
elif self.smtp_state == self.DATA:
limit = self.data_size_limit
if limit and self.num_bytes > limit:
return
elif limit:
self.num_bytes += len(data)
- self.received_lines.append(str(data, "utf8"))
+ self.received_lines.append(str(data, "utf-8"))
# Implementation of base class abstract method
def found_terminator(self):
@@ -283,11 +294,7 @@ class SMTPChannel(asynchat.async_chat):
print('Data:', repr(line), file=DEBUGSTREAM)
self.received_lines = []
if self.smtp_state == self.COMMAND:
- if self.num_bytes > self.command_size_limit:
- self.push('500 Error: line too long')
- self.num_bytes = 0
- return
- self.num_bytes = 0
+ sz, self.num_bytes = self.num_bytes, 0
if not line:
self.push('500 Error: bad syntax')
return
@@ -299,9 +306,14 @@ class SMTPChannel(asynchat.async_chat):
else:
command = line[:i].upper()
arg = line[i+1:].strip()
+ max_sz = (self.command_size_limits[command]
+ if self.extended_smtp else self.command_size_limit)
+ if sz > max_sz:
+ self.push('500 Error: line too long')
+ return
method = getattr(self, 'smtp_' + command, None)
if not method:
- self.push('502 Error: command "%s" not implemented' % command)
+ self.push('500 Error: command "%s" not recognized' % command)
return
method(arg)
return
@@ -310,12 +322,12 @@ class SMTPChannel(asynchat.async_chat):
self.push('451 Internal confusion')
self.num_bytes = 0
return
- if self.num_bytes > self.data_size_limit:
+ if self.data_size_limit and self.num_bytes > self.data_size_limit:
self.push('552 Error: Too much mail data')
self.num_bytes = 0
return
# Remove extraneous carriage returns and de-transparency according
- # to RFC 821, Section 4.5.2.
+ # to RFC 5321, Section 4.5.2.
data = []
for text in line.split('\r\n'):
if text and text[0] == '.':
@@ -333,7 +345,7 @@ class SMTPChannel(asynchat.async_chat):
self.num_bytes = 0
self.set_terminator(b'\r\n')
if not status:
- self.push('250 Ok')
+ self.push('250 OK')
else:
self.push(status)
@@ -346,58 +358,188 @@ class SMTPChannel(asynchat.async_chat):
self.push('503 Duplicate HELO/EHLO')
else:
self.seen_greeting = arg
+ self.extended_smtp = False
self.push('250 %s' % self.fqdn)
+ def smtp_EHLO(self, arg):
+ if not arg:
+ self.push('501 Syntax: EHLO hostname')
+ return
+ if self.seen_greeting:
+ self.push('503 Duplicate HELO/EHLO')
+ else:
+ self.seen_greeting = arg
+ self.extended_smtp = True
+ self.push('250-%s' % self.fqdn)
+ if self.data_size_limit:
+ self.push('250-SIZE %s' % self.data_size_limit)
+ self.push('250 HELP')
+
def smtp_NOOP(self, arg):
if arg:
self.push('501 Syntax: NOOP')
else:
- self.push('250 Ok')
+ self.push('250 OK')
def smtp_QUIT(self, arg):
# args is ignored
self.push('221 Bye')
self.close_when_done()
- # factored
- def __getaddr(self, keyword, arg):
- address = None
+ def _strip_command_keyword(self, keyword, arg):
keylen = len(keyword)
if arg[:keylen].upper() == keyword:
- address = arg[keylen:].strip()
- if not address:
- pass
- elif address[0] == '<' and address[-1] == '>' and address != '<>':
- # Addresses can be in the form <person@dom.com> but watch out
- # for null address, e.g. <>
- address = address[1:-1]
- return address
+ return arg[keylen:].strip()
+ return ''
+
+ def _getaddr(self, arg):
+ if not arg:
+ return '', ''
+ if arg.lstrip().startswith('<'):
+ address, rest = get_angle_addr(arg)
+ else:
+ address, rest = get_addr_spec(arg)
+ if not address:
+ return address, rest
+ return address.addr_spec, rest
+
+ def _getparams(self, params):
+ # Return any parameters that appear to be syntactically valid according
+ # to RFC 1869, ignore all others. (Postel rule: accept what we can.)
+ params = [param.split('=', 1) for param in params.split()
+ if '=' in param]
+ return {k: v for k, v in params if k.isalnum()}
+
+ def smtp_HELP(self, arg):
+ if arg:
+ extended = ' [SP <mail parameters]'
+ lc_arg = arg.upper()
+ if lc_arg == 'EHLO':
+ self.push('250 Syntax: EHLO hostname')
+ elif lc_arg == 'HELO':
+ self.push('250 Syntax: HELO hostname')
+ elif lc_arg == 'MAIL':
+ msg = '250 Syntax: MAIL FROM: <address>'
+ if self.extended_smtp:
+ msg += extended
+ self.push(msg)
+ elif lc_arg == 'RCPT':
+ msg = '250 Syntax: RCPT TO: <address>'
+ if self.extended_smtp:
+ msg += extended
+ self.push(msg)
+ elif lc_arg == 'DATA':
+ self.push('250 Syntax: DATA')
+ elif lc_arg == 'RSET':
+ self.push('250 Syntax: RSET')
+ elif lc_arg == 'NOOP':
+ self.push('250 Syntax: NOOP')
+ elif lc_arg == 'QUIT':
+ self.push('250 Syntax: QUIT')
+ elif lc_arg == 'VRFY':
+ self.push('250 Syntax: VRFY <address>')
+ else:
+ self.push('501 Supported commands: EHLO HELO MAIL RCPT '
+ 'DATA RSET NOOP QUIT VRFY')
+ else:
+ self.push('250 Supported commands: EHLO HELO MAIL RCPT DATA '
+ 'RSET NOOP QUIT VRFY')
+
+ def smtp_VRFY(self, arg):
+ if arg:
+ address, params = self._getaddr(arg)
+ if address:
+ self.push('252 Cannot VRFY user, but will accept message '
+ 'and attempt delivery')
+ else:
+ self.push('502 Could not VRFY %s' % arg)
+ else:
+ self.push('501 Syntax: VRFY <address>')
def smtp_MAIL(self, arg):
+ if not self.seen_greeting:
+ self.push('503 Error: send HELO first');
+ return
print('===> MAIL', arg, file=DEBUGSTREAM)
- address = self.__getaddr('FROM:', arg) if arg else None
+ syntaxerr = '501 Syntax: MAIL FROM: <address>'
+ if self.extended_smtp:
+ syntaxerr += ' [SP <mail-parameters>]'
+ if arg is None:
+ self.push(syntaxerr)
+ return
+ arg = self._strip_command_keyword('FROM:', arg)
+ address, params = self._getaddr(arg)
+ if not address:
+ self.push(syntaxerr)
+ return
+ if not self.extended_smtp and params:
+ self.push(syntaxerr)
+ return
if not address:
- self.push('501 Syntax: MAIL FROM:<address>')
+ self.push(syntaxerr)
return
if self.mailfrom:
self.push('503 Error: nested MAIL command')
return
+ params = self._getparams(params.upper())
+ if params is None:
+ self.push(syntaxerr)
+ return
+ size = params.pop('SIZE', None)
+ if size:
+ if not size.isdigit():
+ self.push(syntaxerr)
+ return
+ elif self.data_size_limit and int(size) > self.data_size_limit:
+ self.push('552 Error: message size exceeds fixed maximum message size')
+ return
+ if len(params.keys()) > 0:
+ self.push('555 MAIL FROM parameters not recognized or not implemented')
+ return
self.mailfrom = address
print('sender:', self.mailfrom, file=DEBUGSTREAM)
- self.push('250 Ok')
+ self.push('250 OK')
def smtp_RCPT(self, arg):
+ if not self.seen_greeting:
+ self.push('503 Error: send HELO first');
+ return
print('===> RCPT', arg, file=DEBUGSTREAM)
if not self.mailfrom:
self.push('503 Error: need MAIL command')
return
- address = self.__getaddr('TO:', arg) if arg else None
+ syntaxerr = '501 Syntax: RCPT TO: <address>'
+ if self.extended_smtp:
+ syntaxerr += ' [SP <mail-parameters>]'
+ if arg is None:
+ self.push(syntaxerr)
+ return
+ arg = self._strip_command_keyword('TO:', arg)
+ address, params = self._getaddr(arg)
+ if not address:
+ self.push(syntaxerr)
+ return
+ if params:
+ if self.extended_smtp:
+ params = self._getparams(params.upper())
+ if params is None:
+ self.push(syntaxerr)
+ return
+ else:
+ self.push(syntaxerr)
+ return
+ if not address:
+ self.push(syntaxerr)
+ return
+ if params and len(params.keys()) > 0:
+ self.push('555 RCPT TO parameters not recognized or not implemented')
+ return
if not address:
self.push('501 Syntax: RCPT TO: <address>')
return
self.rcpttos.append(address)
print('recips:', self.rcpttos, file=DEBUGSTREAM)
- self.push('250 Ok')
+ self.push('250 OK')
def smtp_RSET(self, arg):
if arg:
@@ -408,9 +550,12 @@ class SMTPChannel(asynchat.async_chat):
self.rcpttos = []
self.received_data = ''
self.smtp_state = self.COMMAND
- self.push('250 Ok')
+ self.push('250 OK')
def smtp_DATA(self, arg):
+ if not self.seen_greeting:
+ self.push('503 Error: send HELO first');
+ return
if not self.rcpttos:
self.push('503 Error: need RCPT command')
return
@@ -421,15 +566,20 @@ class SMTPChannel(asynchat.async_chat):
self.set_terminator(b'\r\n.\r\n')
self.push('354 End data with <CR><LF>.<CR><LF>')
+ # Commands that have not been implemented
+ def smtp_EXPN(self, arg):
+ self.push('502 EXPN not implemented')
+
-
class SMTPServer(asyncore.dispatcher):
# SMTPChannel class to use for managing client connections
channel_class = SMTPChannel
- def __init__(self, localaddr, remoteaddr):
+ def __init__(self, localaddr, remoteaddr,
+ data_size_limit=DATA_SIZE_DEFAULT):
self._localaddr = localaddr
self._remoteaddr = remoteaddr
+ self.data_size_limit = data_size_limit
asyncore.dispatcher.__init__(self)
try:
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -447,7 +597,7 @@ class SMTPServer(asyncore.dispatcher):
def handle_accepted(self, conn, addr):
print('Incoming connection from %s' % repr(addr), file=DEBUGSTREAM)
- channel = self.channel_class(self, conn, addr)
+ channel = self.channel_class(self, conn, addr, self.data_size_limit)
# API for "doing something useful with the message"
def process_message(self, peer, mailfrom, rcpttos, data):
@@ -475,7 +625,6 @@ class SMTPServer(asyncore.dispatcher):
raise NotImplementedError
-
class DebuggingServer(SMTPServer):
# Do something with the gathered message
def process_message(self, peer, mailfrom, rcpttos, data):
@@ -491,7 +640,6 @@ class DebuggingServer(SMTPServer):
print('------------ END MESSAGE ------------')
-
class PureProxy(SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data):
lines = data.split('\n')
@@ -532,7 +680,6 @@ class PureProxy(SMTPServer):
return refused
-
class MailmanProxy(PureProxy):
def process_message(self, peer, mailfrom, rcpttos, data):
from io import StringIO
@@ -611,19 +758,18 @@ class MailmanProxy(PureProxy):
msg.Enqueue(mlist, torequest=1)
-
class Options:
setuid = 1
classname = 'PureProxy'
+ size_limit = None
-
def parseargs():
global DEBUGSTREAM
try:
opts, args = getopt.getopt(
- sys.argv[1:], 'nVhc:d',
- ['class=', 'nosetuid', 'version', 'help', 'debug'])
+ sys.argv[1:], 'nVhc:s:d',
+ ['class=', 'nosetuid', 'version', 'help', 'size=', 'debug'])
except getopt.error as e:
usage(1, e)
@@ -640,6 +786,13 @@ def parseargs():
options.classname = arg
elif opt in ('-d', '--debug'):
DEBUGSTREAM = sys.stderr
+ elif opt in ('-s', '--size'):
+ try:
+ int_size = int(arg)
+ options.size_limit = int_size
+ except:
+ print('Invalid size: ' + arg, file=sys.stderr)
+ sys.exit(1)
# parse the rest of the arguments
if len(args) < 1:
@@ -674,7 +827,6 @@ def parseargs():
return options
-
if __name__ == '__main__':
options = parseargs()
# Become nobody
@@ -687,7 +839,8 @@ if __name__ == '__main__':
import __main__ as mod
class_ = getattr(mod, classname)
proxy = class_((options.localhost, options.localport),
- (options.remotehost, options.remoteport))
+ (options.remotehost, options.remoteport),
+ options.size_limit)
if options.setuid:
try:
import pwd
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index fbef96e..d37b0e2 100644
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -133,24 +133,18 @@ class SMTPAuthenticationError(SMTPResponseException):
combination provided.
"""
-def quoteaddr(addr):
+def quoteaddr(addrstring):
"""Quote a subset of the email addresses defined by RFC 821.
Should be able to handle anything email.utils.parseaddr can handle.
"""
- m = (None, None)
- try:
- m = email.utils.parseaddr(addr)[1]
- except AttributeError:
- pass
- if m == (None, None): # Indicates parse failure or AttributeError
- # something weird here.. punt -ddm
- return "<%s>" % addr
- elif m is None:
- # the sender wants an empty return address
- return "<>"
- else:
- return "<%s>" % m
+ displayname, addr = email.utils.parseaddr(addrstring)
+ if (displayname, addr) == ('', ''):
+ # parseaddr couldn't parse it, use it as is and hope for the best.
+ if addrstring.strip().startswith('<'):
+ return addrstring
+ return "<%s>" % addrstring
+ return "<%s>" % addr
def _addr_only(addrstring):
displayname, addr = email.utils.parseaddr(addrstring)
@@ -180,27 +174,6 @@ try:
except ImportError:
_have_ssl = False
else:
- class SSLFakeFile:
- """A fake file like object that really wraps a SSLObject.
-
- It only supports what is needed in smtplib.
- """
- def __init__(self, sslobj):
- self.sslobj = sslobj
-
- def readline(self):
- str = b""
- chr = None
- while chr != b"\n":
- chr = self.sslobj.read(1)
- if not chr:
- break
- str += chr
- return str
-
- def close(self):
- pass
-
_have_ssl = True
@@ -242,7 +215,8 @@ class SMTP:
default_port = SMTP_PORT
def __init__(self, host='', port=0, local_hostname=None,
- timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
+ timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None):
"""Initialize a new instance.
If specified, `host' is the name of the remote host to which to
@@ -250,11 +224,16 @@ class SMTP:
By default, smtplib.SMTP_PORT is used. An SMTPConnectError is raised
if the specified `host' doesn't respond correctly. If specified,
`local_hostname` is used as the FQDN of the local host. By default,
- the local hostname is found using socket.getfqdn().
+ the local hostname is found using socket.getfqdn(). The
+ `source_address` parameter takes a 2-tuple (host, port) for the socket
+ to bind to as its source address before connecting. If the host is ''
+ and port is 0, the OS default behavior will be used.
"""
self.timeout = timeout
self.esmtp_features = {}
+ self.source_address = source_address
+
if host:
(code, msg) = self.connect(host, port)
if code != 220:
@@ -277,6 +256,19 @@ class SMTP:
pass
self.local_hostname = '[%s]' % addr
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ try:
+ code, message = self.docmd("QUIT")
+ if code != 221:
+ raise SMTPResponseException(code, message)
+ except SMTPServerDisconnected:
+ pass
+ finally:
+ self.close()
+
def set_debuglevel(self, debuglevel):
"""Set the debug output level.
@@ -290,10 +282,12 @@ class SMTP:
# This makes it simpler for SMTP_SSL to use the SMTP connect code
# and just alter the socket connection bit.
if self.debuglevel > 0:
- print('connect:', (host, port), file=stderr)
- return socket.create_connection((host, port), timeout)
+ print('connect: to', (host, port), self.source_address,
+ file=stderr)
+ return socket.create_connection((host, port), timeout,
+ self.source_address)
- def connect(self, host='localhost', port=0):
+ def connect(self, host='localhost', port=0, source_address=None):
"""Connect to a host on a given port.
If the hostname ends with a colon (`:') followed by a number, and
@@ -304,6 +298,10 @@ class SMTP:
specified during instantiation.
"""
+
+ if source_address:
+ self.source_address = source_address
+
if not port and (host.find(':') == host.rfind(':')):
i = host.rfind(':')
if i >= 0:
@@ -317,6 +315,7 @@ class SMTP:
if self.debuglevel > 0:
print('connect:', (host, port), file=stderr)
self.sock = self._get_socket(host, port, self.timeout)
+ self.file = None
(code, msg) = self.getreply()
if self.debuglevel > 0:
print("connect:", msg, file=stderr)
@@ -388,7 +387,8 @@ class SMTP:
errmsg = b"\n".join(resp)
if self.debuglevel > 0:
- print('reply: retcode (%s); Msg: %s' % (errcode, errmsg), file=stderr)
+ print('reply: retcode (%s); Msg: %s' % (errcode, errmsg),
+ file=stderr)
return errcode, errmsg
def docmd(self, cmd, args=""):
@@ -632,7 +632,7 @@ class SMTP:
# We could not login sucessfully. Return result of last attempt.
raise SMTPAuthenticationError(code, resp)
- def starttls(self, keyfile=None, certfile=None):
+ def starttls(self, keyfile=None, certfile=None, context=None):
"""Puts the connection to the SMTP server into TLS mode.
If there has been no previous EHLO or HELO command this session, this
@@ -656,8 +656,17 @@ class SMTP:
if resp == 220:
if not _have_ssl:
raise RuntimeError("No SSL support included in this Python")
- self.sock = ssl.wrap_socket(self.sock, keyfile, certfile)
- self.file = SSLFakeFile(self.sock)
+ if context is not None and keyfile is not None:
+ raise ValueError("context and keyfile arguments are mutually "
+ "exclusive")
+ if context is not None and certfile is not None:
+ raise ValueError("context and certfile arguments are mutually "
+ "exclusive")
+ if context is not None:
+ self.sock = context.wrap_socket(self.sock)
+ else:
+ self.sock = ssl.wrap_socket(self.sock, keyfile, certfile)
+ self.file = None
# RFC 3207:
# The client MUST discard any knowledge obtained from
# the server, such as the list of SMTP service extensions,
@@ -786,7 +795,8 @@ class SMTP:
# TODO implement heuristics to guess the correct Resent-* block with an
# option allowing the user to enable the heuristics. (It should be
# possible to guess correctly almost all of the time.)
- resent =msg.get_all('Resent-Date')
+
+ resent = msg.get_all('Resent-Date')
if resent is None:
header_prefix = ''
elif len(resent) == 1:
@@ -795,13 +805,13 @@ class SMTP:
raise ValueError("message has more than one 'Resent-' header block")
if from_addr is None:
# Prefer the sender field per RFC 2822:3.6.2.
- from_addr = (msg[header_prefix+'Sender']
- if (header_prefix+'Sender') in msg
- else msg[header_prefix+'From'])
+ from_addr = (msg[header_prefix + 'Sender']
+ if (header_prefix + 'Sender') in msg
+ else msg[header_prefix + 'From'])
if to_addrs is None:
- addr_fields = [f for f in (msg[header_prefix+'To'],
- msg[header_prefix+'Bcc'],
- msg[header_prefix+'Cc']) if f is not None]
+ addr_fields = [f for f in (msg[header_prefix + 'To'],
+ msg[header_prefix + 'Bcc'],
+ msg[header_prefix + 'Cc']) if f is not None]
to_addrs = [a[1] for a in email.utils.getaddresses(addr_fields)]
# Make a local copy so we can delete the bcc headers.
msg_copy = copy.copy(msg)
@@ -835,26 +845,41 @@ if _have_ssl:
""" This is a subclass derived from SMTP that connects over an SSL encrypted
socket (to use this class you need a socket module that was compiled with SSL
support). If host is not specified, '' (the local host) is used. If port is
- omitted, the standard SMTP-over-SSL port (465) is used. keyfile and certfile
+ omitted, the standard SMTP-over-SSL port (465) is used. The optional
+ source_address takes a two-tuple (host,port) for socket to bind to. keyfile and certfile
are also optional - they can contain a PEM formatted private key and
- certificate chain file for the SSL connection.
+ certificate chain file for the SSL connection. context also optional, can contain
+ a SSLContext, and is an alternative to keyfile and certfile; If it is specified both
+ keyfile and certfile must be None.
"""
default_port = SMTP_SSL_PORT
def __init__(self, host='', port=0, local_hostname=None,
keyfile=None, certfile=None,
- timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
+ timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None, context=None):
+ if context is not None and keyfile is not None:
+ raise ValueError("context and keyfile arguments are mutually "
+ "exclusive")
+ if context is not None and certfile is not None:
+ raise ValueError("context and certfile arguments are mutually "
+ "exclusive")
self.keyfile = keyfile
self.certfile = certfile
- SMTP.__init__(self, host, port, local_hostname, timeout)
+ self.context = context
+ SMTP.__init__(self, host, port, local_hostname, timeout,
+ source_address)
def _get_socket(self, host, port, timeout):
if self.debuglevel > 0:
print('connect:', (host, port), file=stderr)
- new_socket = socket.create_connection((host, port), timeout)
- new_socket = ssl.wrap_socket(new_socket, self.keyfile, self.certfile)
- self.file = SSLFakeFile(new_socket)
+ new_socket = socket.create_connection((host, port), timeout,
+ self.source_address)
+ if self.context is not None:
+ new_socket = self.context.wrap_socket(new_socket)
+ else:
+ new_socket = ssl.wrap_socket(new_socket, self.keyfile, self.certfile)
return new_socket
__all__.append("SMTP_SSL")
@@ -879,18 +904,21 @@ class LMTP(SMTP):
ehlo_msg = "lhlo"
- def __init__(self, host='', port=LMTP_PORT, local_hostname=None):
+ def __init__(self, host='', port=LMTP_PORT, local_hostname=None,
+ source_address=None):
"""Initialize a new instance."""
- SMTP.__init__(self, host, port, local_hostname)
+ SMTP.__init__(self, host, port, local_hostname=local_hostname,
+ source_address=source_address)
- def connect(self, host='localhost', port=0):
+ def connect(self, host='localhost', port=0, source_address=None):
"""Connect to the LMTP daemon, on either a Unix or a TCP socket."""
if host[0] != '/':
- return SMTP.connect(self, host, port)
+ return SMTP.connect(self, host, port, source_address=source_address)
# Handle Unix-domain sockets.
try:
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self.file = None
self.sock.connect(host)
except socket.error as msg:
if self.debuglevel > 0:
diff --git a/Lib/socket.py b/Lib/socket.py
index ea56a67..d4f1b65 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -12,6 +12,7 @@ Functions:
socket() -- create a new socket object
socketpair() -- create a pair of new socket objects [*]
fromfd() -- create a socket object from an open file descriptor [*]
+fromshare() -- create a socket object from data received from socket.share() [*]
gethostname() -- return the current hostname
gethostbyname() -- map a hostname to its IP number
gethostbyaddr() -- map an IP number or hostname to DNS info
@@ -53,7 +54,6 @@ try:
except ImportError:
errno = None
EBADF = getattr(errno, 'EBADF', 9)
-EINTR = getattr(errno, 'EINTR', 4)
EAGAIN = getattr(errno, 'EAGAIN', 11)
EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
@@ -112,6 +112,9 @@ class socket(_socket.socket):
s[7:])
return s
+ def __getstate__(self):
+ raise TypeError("Cannot serialize socket object")
+
def dup(self):
"""dup() -> socket object
@@ -207,7 +210,6 @@ class socket(_socket.socket):
self._closed = True
return super().detach()
-
def fromfd(fd, family, type, proto=0):
""" fromfd(fd, family, type[, proto]) -> socket object
@@ -217,6 +219,14 @@ def fromfd(fd, family, type, proto=0):
nfd = dup(fd)
return socket(family, type, proto, nfd)
+if hasattr(_socket.socket, "share"):
+ def fromshare(info):
+ """ fromshare(info) -> socket object
+
+ Create a socket object from a the bytes object returned by
+ socket.share(pid).
+ """
+ return socket(0, 0, 0, info)
if hasattr(_socket, "socketpair"):
@@ -288,11 +298,10 @@ class SocketIO(io.RawIOBase):
except timeout:
self._timeout_occurred = True
raise
+ except InterruptedError:
+ continue
except error as e:
- n = e.args[0]
- if n == EINTR:
- continue
- if n in _blocking_errnos:
+ if e.args[0] in _blocking_errnos:
return None
raise
diff --git a/Lib/socketserver.py b/Lib/socketserver.py
index adf9f38..a21318d 100644
--- a/Lib/socketserver.py
+++ b/Lib/socketserver.py
@@ -153,8 +153,8 @@ def _eintr_retry(func, *args):
while True:
try:
return func(*args)
- except (OSError, select.error) as e:
- if e.args[0] != errno.EINTR:
+ except OSError as e:
+ if e.errno != errno.EINTR:
raise
class BaseServer:
@@ -180,6 +180,7 @@ class BaseServer:
- process_request(request, client_address)
- shutdown_request(request)
- close_request(request)
+ - service_actions()
- handle_error()
Methods for derived classes:
@@ -236,6 +237,8 @@ class BaseServer:
poll_interval)
if self in r:
self._handle_request_noblock()
+
+ self.service_actions()
finally:
self.__shutdown_request = False
self.__is_shut_down.set()
@@ -250,6 +253,14 @@ class BaseServer:
self.__shutdown_request = True
self.__is_shut_down.wait()
+ def service_actions(self):
+ """Called by the serve_forever() loop.
+
+ May be overridden by a subclass / Mixin to implement any code that
+ needs to be run during the loop.
+ """
+ pass
+
# The distinction between handling, getting, processing and
# finishing a request is fairly arbitrary. Remember:
#
@@ -550,9 +561,15 @@ class ForkingMixIn:
"""
self.collect_children()
+ def service_actions(self):
+ """Collect the zombie child processes regularly in the ForkingMixIn.
+
+ service_actions is called in the BaseServer's serve_forver loop.
+ """
+ self.collect_children()
+
def process_request(self, request, client_address):
"""Fork a new subprocess to process the request."""
- self.collect_children()
pid = os.fork()
if pid:
# Parent process
@@ -560,6 +577,7 @@ class ForkingMixIn:
self.active_children = []
self.active_children.append(pid)
self.close_request(request)
+ return
else:
# Child process.
# This must never return, hence os._exit()!
diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py
index 202bd38..b7ec1ad 100644
--- a/Lib/sqlite3/test/dbapi.py
+++ b/Lib/sqlite3/test/dbapi.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/dbapi.py: tests for DB-API compliance
#
# Copyright (C) 2004-2010 Gerhard Häring <gh@ghaering.de>
diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py
index 7f6f347..9e833ae 100644
--- a/Lib/sqlite3/test/factory.py
+++ b/Lib/sqlite3/test/factory.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/factory.py: tests for the various factories in pysqlite
#
# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de>
@@ -178,6 +178,8 @@ class TextFactoryTests(unittest.TestCase):
self.assertTrue(row[0].endswith("reich"), "column must contain original data")
def CheckOptimizedUnicode(self):
+ # In py3k, str objects are always returned when text_factory
+ # is OptimizedUnicode
self.con.text_factory = sqlite.OptimizedUnicode
austria = "Österreich"
germany = "Deutchland"
diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py
index a92e838..3dc44f6 100644
--- a/Lib/sqlite3/test/hooks.py
+++ b/Lib/sqlite3/test/hooks.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/hooks.py: tests for various SQLite-specific hooks
#
# Copyright (C) 2006-2007 Gerhard Häring <gh@ghaering.de>
@@ -176,10 +176,60 @@ class ProgressTests(unittest.TestCase):
con.execute("select 1 union select 2 union select 3").fetchall()
self.assertEqual(action, 0, "progress handler was not cleared")
+class TraceCallbackTests(unittest.TestCase):
+ def CheckTraceCallbackUsed(self):
+ """
+ Test that the trace callback is invoked once it is set.
+ """
+ con = sqlite.connect(":memory:")
+ traced_statements = []
+ def trace(statement):
+ traced_statements.append(statement)
+ con.set_trace_callback(trace)
+ con.execute("create table foo(a, b)")
+ self.assertTrue(traced_statements)
+ self.assertTrue(any("create table foo" in stmt for stmt in traced_statements))
+
+ def CheckClearTraceCallback(self):
+ """
+ Test that setting the trace callback to None clears the previously set callback.
+ """
+ con = sqlite.connect(":memory:")
+ traced_statements = []
+ def trace(statement):
+ traced_statements.append(statement)
+ con.set_trace_callback(trace)
+ con.set_trace_callback(None)
+ con.execute("create table foo(a, b)")
+ self.assertFalse(traced_statements, "trace callback was not cleared")
+
+ def CheckUnicodeContent(self):
+ """
+ Test that the statement can contain unicode literals.
+ """
+ unicode_value = '\xf6\xe4\xfc\xd6\xc4\xdc\xdf\u20ac'
+ con = sqlite.connect(":memory:")
+ traced_statements = []
+ def trace(statement):
+ traced_statements.append(statement)
+ con.set_trace_callback(trace)
+ con.execute("create table foo(x)")
+ # Can't execute bound parameters as their values don't appear
+ # in traced statements before SQLite 3.6.21
+ # (cf. http://www.sqlite.org/draft/releaselog/3_6_21.html)
+ con.execute('insert into foo(x) values ("%s")' % unicode_value)
+ con.commit()
+ self.assertTrue(any(unicode_value in stmt for stmt in traced_statements),
+ "Unicode data %s garbled in trace callback: %s"
+ % (ascii(unicode_value), ', '.join(map(ascii, traced_statements))))
+
+
+
def suite():
collation_suite = unittest.makeSuite(CollationTests, "Check")
progress_suite = unittest.makeSuite(ProgressTests, "Check")
- return unittest.TestSuite((collation_suite, progress_suite))
+ trace_suite = unittest.makeSuite(TraceCallbackTests, "Check")
+ return unittest.TestSuite((collation_suite, progress_suite, trace_suite))
def test():
runner = unittest.TextTestRunner()
diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py
index c7551e3..9d7b276 100644
--- a/Lib/sqlite3/test/regression.py
+++ b/Lib/sqlite3/test/regression.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/regression.py: pysqlite regression tests
#
# Copyright (C) 2006-2010 Gerhard Häring <gh@ghaering.de>
diff --git a/Lib/sqlite3/test/transactions.py b/Lib/sqlite3/test/transactions.py
index 70e96a1..feb4fa1 100644
--- a/Lib/sqlite3/test/transactions.py
+++ b/Lib/sqlite3/test/transactions.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/transactions.py: tests transactions
#
# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de>
diff --git a/Lib/sqlite3/test/types.py b/Lib/sqlite3/test/types.py
index 29413e1..3b4cb6d 100644
--- a/Lib/sqlite3/test/types.py
+++ b/Lib/sqlite3/test/types.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/types.py: tests for type conversion and detection
#
# Copyright (C) 2005 Gerhard Häring <gh@ghaering.de>
@@ -85,7 +85,7 @@ class DeclTypesTests(unittest.TestCase):
if isinstance(_val, bytes):
# sqlite3 always calls __init__ with a bytes created from a
# UTF-8 string when __conform__ was used to store the object.
- _val = _val.decode('utf8')
+ _val = _val.decode('utf-8')
self.val = _val
def __cmp__(self, other):
diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py
index e01341e..14f6b65 100644
--- a/Lib/sqlite3/test/userfunctions.py
+++ b/Lib/sqlite3/test/userfunctions.py
@@ -1,4 +1,4 @@
-#-*- coding: ISO-8859-1 -*-
+#-*- coding: iso-8859-1 -*-
# pysqlite2/test/userfunctions.py: tests for user-defined functions and
# aggregates.
#
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
index f52ea01..75f3a09 100644
--- a/Lib/sre_compile.py
+++ b/Lib/sre_compile.py
@@ -318,11 +318,13 @@ def _optimize_unicode(charset, fixup):
# XXX: could expand category
return charset # cannot compress
except IndexError:
- # non-BMP characters
+ # non-BMP characters; XXX now they should work
return charset
if negate:
if sys.maxunicode != 65535:
# XXX: negation does not work with big charsets
+ # XXX2: now they should work, but removing this will make the
+ # charmap 17 times bigger
return charset
for i in range(65536):
charmap[i] = not charmap[i]
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 9aea56a..6411475 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -177,6 +177,7 @@ class SubPattern:
class Tokenizer:
def __init__(self, string):
+ self.istext = isinstance(string, str)
self.string = string
self.index = 0
self.__next()
@@ -187,14 +188,14 @@ class Tokenizer:
char = self.string[self.index:self.index+1]
# Special case for the str8, since indexing returns a integer
# XXX This is only needed for test_bug_926075 in test_re.py
- if char and isinstance(char, bytes):
+ if char and not self.istext:
char = chr(char[0])
if char == "\\":
try:
c = self.string[self.index + 1]
except IndexError:
raise error("bogus escape (end of line)")
- if isinstance(self.string, bytes):
+ if not self.istext:
c = chr(c)
char = char + c
self.index = self.index + len(char)
@@ -209,6 +210,15 @@ class Tokenizer:
this = self.next
self.__next()
return this
+ def getwhile(self, n, charset):
+ result = ''
+ for _ in range(n):
+ c = self.next
+ if c not in charset:
+ break
+ result += c
+ self.__next()
+ return result
def tell(self):
return self.index, self.next
def seek(self, index):
@@ -241,20 +251,30 @@ def _class_escape(source, escape):
c = escape[1:2]
if c == "x":
# hexadecimal escape (exactly two digits)
- while source.next in HEXDIGITS and len(escape) < 4:
- escape = escape + source.get()
- escape = escape[2:]
- if len(escape) != 2:
- raise error("bogus escape: %s" % repr("\\" + escape))
- return LITERAL, int(escape, 16) & 0xff
+ escape += source.getwhile(2, HEXDIGITS)
+ if len(escape) != 4:
+ raise ValueError
+ return LITERAL, int(escape[2:], 16) & 0xff
+ elif c == "u" and source.istext:
+ # unicode escape (exactly four digits)
+ escape += source.getwhile(4, HEXDIGITS)
+ if len(escape) != 6:
+ raise ValueError
+ return LITERAL, int(escape[2:], 16)
+ elif c == "U" and source.istext:
+ # unicode escape (exactly eight digits)
+ escape += source.getwhile(8, HEXDIGITS)
+ if len(escape) != 10:
+ raise ValueError
+ c = int(escape[2:], 16)
+ chr(c) # raise ValueError for invalid code
+ return LITERAL, c
elif c in OCTDIGITS:
# octal escape (up to three digits)
- while source.next in OCTDIGITS and len(escape) < 4:
- escape = escape + source.get()
- escape = escape[1:]
- return LITERAL, int(escape, 8) & 0xff
+ escape += source.getwhile(2, OCTDIGITS)
+ return LITERAL, int(escape[1:], 8) & 0xff
elif c in DIGITS:
- raise error("bogus escape: %s" % repr(escape))
+ raise ValueError
if len(escape) == 2:
return LITERAL, ord(escape[1])
except ValueError:
@@ -273,15 +293,27 @@ def _escape(source, escape, state):
c = escape[1:2]
if c == "x":
# hexadecimal escape
- while source.next in HEXDIGITS and len(escape) < 4:
- escape = escape + source.get()
+ escape += source.getwhile(2, HEXDIGITS)
if len(escape) != 4:
raise ValueError
return LITERAL, int(escape[2:], 16) & 0xff
+ elif c == "u" and source.istext:
+ # unicode escape (exactly four digits)
+ escape += source.getwhile(4, HEXDIGITS)
+ if len(escape) != 6:
+ raise ValueError
+ return LITERAL, int(escape[2:], 16)
+ elif c == "U" and source.istext:
+ # unicode escape (exactly eight digits)
+ escape += source.getwhile(8, HEXDIGITS)
+ if len(escape) != 10:
+ raise ValueError
+ c = int(escape[2:], 16)
+ chr(c) # raise ValueError for invalid code
+ return LITERAL, c
elif c == "0":
# octal escape
- while source.next in OCTDIGITS and len(escape) < 4:
- escape = escape + source.get()
+ escape += source.getwhile(2, OCTDIGITS)
return LITERAL, int(escape[1:], 8) & 0xff
elif c in DIGITS:
# octal escape *or* decimal group reference (sigh)
@@ -797,7 +829,7 @@ def parse_template(source, pattern):
else:
# The tokenizer implicitly decodes bytes objects as latin-1, we must
# therefore re-encode the final representation.
- encode = lambda x: x.encode('latin1')
+ encode = lambda x: x.encode('latin-1')
for c, s in p:
if c is MARK:
groupsappend((i, s))
diff --git a/Lib/ssl.py b/Lib/ssl.py
index e901b64..5e5a5ce 100644
--- a/Lib/ssl.py
+++ b/Lib/ssl.py
@@ -60,10 +60,25 @@ import re
import _ssl # if we can't import it, let the error propagate
from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
-from _ssl import _SSLContext, SSLError
+from _ssl import _SSLContext
+from _ssl import (
+ SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
+ SSLSyscallError, SSLEOFError,
+ )
from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1
-from _ssl import RAND_status, RAND_egd, RAND_add
+from _ssl import (
+ OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1,
+ OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE
+ )
+try:
+ from _ssl import OP_NO_COMPRESSION
+except ImportError:
+ pass
+try:
+ from _ssl import OP_SINGLE_ECDH_USE
+except ImportError:
+ pass
+from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes
from _ssl import (
SSL_ERROR_ZERO_RETURN,
SSL_ERROR_WANT_READ,
@@ -75,8 +90,9 @@ from _ssl import (
SSL_ERROR_EOF,
SSL_ERROR_INVALID_ERROR_CODE,
)
-from _ssl import HAS_SNI
-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1
+from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN
+from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23,
+ PROTOCOL_TLSv1)
from _ssl import _OPENSSL_API_VERSION
_PROTOCOL_NAMES = {
@@ -94,11 +110,16 @@ else:
from socket import getnameinfo as _getnameinfo
from socket import error as socket_error
-from socket import socket, AF_INET, SOCK_STREAM
+from socket import socket, AF_INET, SOCK_STREAM, create_connection
import base64 # for DER-to-PEM translation
import traceback
import errno
+if _ssl.HAS_TLS_UNIQUE:
+ CHANNEL_BINDING_TYPES = ['tls-unique']
+else:
+ CHANNEL_BINDING_TYPES = []
+
# Disable weak or insecure ciphers by default
# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
_DEFAULT_CIPHERS = 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2'
@@ -188,6 +209,17 @@ class SSLContext(_SSLContext):
server_hostname=server_hostname,
_context=self)
+ def set_npn_protocols(self, npn_protocols):
+ protos = bytearray()
+ for protocol in npn_protocols:
+ b = bytes(protocol, 'ascii')
+ if len(b) == 0 or len(b) > 255:
+ raise SSLError('NPN protocols must be 1 to 255 in length')
+ protos.append(len(b))
+ protos.extend(b)
+
+ self._set_npn_protocols(protos)
+
class SSLSocket(socket):
"""This class implements a subtype of socket.socket that wraps
@@ -199,7 +231,7 @@ class SSLSocket(socket):
ssl_version=PROTOCOL_SSLv23, ca_certs=None,
do_handshake_on_connect=True,
family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
- suppress_ragged_eofs=True, ciphers=None,
+ suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
server_hostname=None,
_context=None):
@@ -219,6 +251,8 @@ class SSLSocket(socket):
self.context.load_verify_locations(ca_certs)
if certfile:
self.context.load_cert_chain(certfile, keyfile)
+ if npn_protocols:
+ self.context.set_npn_protocols(npn_protocols)
if ciphers:
self.context.set_ciphers(ciphers)
self.keyfile = keyfile
@@ -319,6 +353,13 @@ class SSLSocket(socket):
self._checkClosed()
return self._sslobj.peer_certificate(binary_form)
+ def selected_npn_protocol(self):
+ self._checkClosed()
+ if not self._sslobj or not _ssl.HAS_NPN:
+ return None
+ else:
+ return self._sslobj.selected_npn_protocol()
+
def cipher(self):
self._checkClosed()
if not self._sslobj:
@@ -326,6 +367,13 @@ class SSLSocket(socket):
else:
return self._sslobj.cipher()
+ def compression(self):
+ self._checkClosed()
+ if not self._sslobj:
+ return None
+ else:
+ return self._sslobj.compression()
+
def send(self, data, flags=0):
self._checkClosed()
if self._sslobj:
@@ -358,6 +406,12 @@ class SSLSocket(socket):
else:
return socket.sendto(self, data, flags_or_addr, addr)
+ def sendmsg(self, *args, **kwargs):
+ # Ensure programs don't send data unencrypted if they try to
+ # use this method.
+ raise NotImplementedError("sendmsg not allowed on instances of %s" %
+ self.__class__)
+
def sendall(self, data, flags=0):
self._checkClosed()
if self._sslobj:
@@ -416,6 +470,14 @@ class SSLSocket(socket):
else:
return socket.recvfrom_into(self, buffer, nbytes, flags)
+ def recvmsg(self, *args, **kwargs):
+ raise NotImplementedError("recvmsg not allowed on instances of %s" %
+ self.__class__)
+
+ def recvmsg_into(self, *args, **kwargs):
+ raise NotImplementedError("recvmsg_into not allowed on instances of "
+ "%s" % self.__class__)
+
def pending(self):
self._checkClosed()
if self._sslobj:
@@ -497,6 +559,21 @@ class SSLSocket(socket):
server_side=True)
return newsock, addr
+ def get_channel_binding(self, cb_type="tls-unique"):
+ """Get channel binding data for current connection. Raise ValueError
+ if the requested `cb_type` is not supported. Return bytes of the data
+ or None if the data is not available (e.g. before the handshake).
+ """
+ if cb_type not in CHANNEL_BINDING_TYPES:
+ raise ValueError("Unsupported channel binding type")
+ if cb_type != "tls-unique":
+ raise NotImplementedError(
+ "{0} channel binding type not implemented"
+ .format(cb_type))
+ if self._sslobj is None:
+ return None
+ return self._sslobj.tls_unique_cb()
+
def __del__(self):
# sys.stderr.write("__del__ on %s\n" % repr(self))
self._real_close()
@@ -506,7 +583,8 @@ def wrap_socket(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=CERT_NONE,
ssl_version=PROTOCOL_SSLv23, ca_certs=None,
do_handshake_on_connect=True,
- suppress_ragged_eofs=True, ciphers=None):
+ suppress_ragged_eofs=True,
+ ciphers=None):
return SSLSocket(sock=sock, keyfile=keyfile, certfile=certfile,
server_side=server_side, cert_reqs=cert_reqs,
@@ -561,9 +639,9 @@ def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None):
cert_reqs = CERT_REQUIRED
else:
cert_reqs = CERT_NONE
- s = wrap_socket(socket(), ssl_version=ssl_version,
+ s = create_connection(addr)
+ s = wrap_socket(s, ssl_version=ssl_version,
cert_reqs=cert_reqs, ca_certs=ca_certs)
- s.connect(addr)
dercert = s.getpeercert(True)
s.close()
return DER_cert_to_PEM_cert(dercert)
diff --git a/Lib/stat.py b/Lib/stat.py
index 78ccd5e..704adfe 100644
--- a/Lib/stat.py
+++ b/Lib/stat.py
@@ -19,78 +19,131 @@ ST_CTIME = 9
# Extract bits from the mode
def S_IMODE(mode):
+ """Return the portion of the file's mode that can be set by
+ os.chmod().
+ """
return mode & 0o7777
def S_IFMT(mode):
+ """Return the portion of the file's mode that describes the
+ file type.
+ """
return mode & 0o170000
# Constants used as S_IFMT() for various file types
# (not all are implemented on all systems)
-S_IFDIR = 0o040000
-S_IFCHR = 0o020000
-S_IFBLK = 0o060000
-S_IFREG = 0o100000
-S_IFIFO = 0o010000
-S_IFLNK = 0o120000
-S_IFSOCK = 0o140000
+S_IFDIR = 0o040000 # directory
+S_IFCHR = 0o020000 # character device
+S_IFBLK = 0o060000 # block device
+S_IFREG = 0o100000 # regular file
+S_IFIFO = 0o010000 # fifo (named pipe)
+S_IFLNK = 0o120000 # symbolic link
+S_IFSOCK = 0o140000 # socket file
# Functions to test for each file type
def S_ISDIR(mode):
+ """Return True if mode is from a directory."""
return S_IFMT(mode) == S_IFDIR
def S_ISCHR(mode):
+ """Return True if mode is from a character special device file."""
return S_IFMT(mode) == S_IFCHR
def S_ISBLK(mode):
+ """Return True if mode is from a block special device file."""
return S_IFMT(mode) == S_IFBLK
def S_ISREG(mode):
+ """Return True if mode is from a regular file."""
return S_IFMT(mode) == S_IFREG
def S_ISFIFO(mode):
+ """Return True if mode is from a FIFO (named pipe)."""
return S_IFMT(mode) == S_IFIFO
def S_ISLNK(mode):
+ """Return True if mode is from a symbolic link."""
return S_IFMT(mode) == S_IFLNK
def S_ISSOCK(mode):
+ """Return True if mode is from a socket."""
return S_IFMT(mode) == S_IFSOCK
# Names for permission bits
-S_ISUID = 0o4000
-S_ISGID = 0o2000
-S_ENFMT = S_ISGID
-S_ISVTX = 0o1000
-S_IREAD = 0o0400
-S_IWRITE = 0o0200
-S_IEXEC = 0o0100
-S_IRWXU = 0o0700
-S_IRUSR = 0o0400
-S_IWUSR = 0o0200
-S_IXUSR = 0o0100
-S_IRWXG = 0o0070
-S_IRGRP = 0o0040
-S_IWGRP = 0o0020
-S_IXGRP = 0o0010
-S_IRWXO = 0o0007
-S_IROTH = 0o0004
-S_IWOTH = 0o0002
-S_IXOTH = 0o0001
+S_ISUID = 0o4000 # set UID bit
+S_ISGID = 0o2000 # set GID bit
+S_ENFMT = S_ISGID # file locking enforcement
+S_ISVTX = 0o1000 # sticky bit
+S_IREAD = 0o0400 # Unix V7 synonym for S_IRUSR
+S_IWRITE = 0o0200 # Unix V7 synonym for S_IWUSR
+S_IEXEC = 0o0100 # Unix V7 synonym for S_IXUSR
+S_IRWXU = 0o0700 # mask for owner permissions
+S_IRUSR = 0o0400 # read by owner
+S_IWUSR = 0o0200 # write by owner
+S_IXUSR = 0o0100 # execute by owner
+S_IRWXG = 0o0070 # mask for group permissions
+S_IRGRP = 0o0040 # read by group
+S_IWGRP = 0o0020 # write by group
+S_IXGRP = 0o0010 # execute by group
+S_IRWXO = 0o0007 # mask for others (not in group) permissions
+S_IROTH = 0o0004 # read by others
+S_IWOTH = 0o0002 # write by others
+S_IXOTH = 0o0001 # execute by others
# Names for file flags
-UF_NODUMP = 0x00000001
-UF_IMMUTABLE = 0x00000002
-UF_APPEND = 0x00000004
-UF_OPAQUE = 0x00000008
-UF_NOUNLINK = 0x00000010
-UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed
-UF_HIDDEN = 0x00008000 # OS X: file should not be displayed
-SF_ARCHIVED = 0x00010000
-SF_IMMUTABLE = 0x00020000
-SF_APPEND = 0x00040000
-SF_NOUNLINK = 0x00100000
-SF_SNAPSHOT = 0x00200000
+UF_NODUMP = 0x00000001 # do not dump file
+UF_IMMUTABLE = 0x00000002 # file may not be changed
+UF_APPEND = 0x00000004 # file may only be appended to
+UF_OPAQUE = 0x00000008 # directory is opaque when viewed through a union stack
+UF_NOUNLINK = 0x00000010 # file may not be renamed or deleted
+UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed
+UF_HIDDEN = 0x00008000 # OS X: file should not be displayed
+SF_ARCHIVED = 0x00010000 # file may be archived
+SF_IMMUTABLE = 0x00020000 # file may not be changed
+SF_APPEND = 0x00040000 # file may only be appended to
+SF_NOUNLINK = 0x00100000 # file may not be renamed or deleted
+SF_SNAPSHOT = 0x00200000 # file is a snapshot file
+
+
+_filemode_table = (
+ ((S_IFLNK, "l"),
+ (S_IFREG, "-"),
+ (S_IFBLK, "b"),
+ (S_IFDIR, "d"),
+ (S_IFCHR, "c"),
+ (S_IFIFO, "p")),
+
+ ((S_IRUSR, "r"),),
+ ((S_IWUSR, "w"),),
+ ((S_IXUSR|S_ISUID, "s"),
+ (S_ISUID, "S"),
+ (S_IXUSR, "x")),
+
+ ((S_IRGRP, "r"),),
+ ((S_IWGRP, "w"),),
+ ((S_IXGRP|S_ISGID, "s"),
+ (S_ISGID, "S"),
+ (S_IXGRP, "x")),
+
+ ((S_IROTH, "r"),),
+ ((S_IWOTH, "w"),),
+ ((S_IXOTH|S_ISVTX, "t"),
+ (S_ISVTX, "T"),
+ (S_IXOTH, "x"))
+)
+
+def filemode(mode):
+ """Convert a file's mode to a string of the form '-rwxrwxrwx'."""
+ perm = []
+ for table in _filemode_table:
+ for bit, char in table:
+ if mode & bit == bit:
+ perm.append(char)
+ break
+ else:
+ perm.append("-")
+ return "".join(perm)
diff --git a/Lib/string.py b/Lib/string.py
index 0f4ede2..b57c79b 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -46,23 +46,7 @@ def capwords(s, sep=None):
####################################################################
import re as _re
-
-class _multimap:
- """Helper class for combining multiple mappings.
-
- Used by .{safe_,}substitute() to combine the mapping and keyword
- arguments.
- """
- def __init__(self, primary, secondary):
- self._primary = primary
- self._secondary = secondary
-
- def __getitem__(self, key):
- try:
- return self._primary[key]
- except KeyError:
- return self._secondary[key]
-
+from collections import ChainMap
class _TemplateMetaclass(type):
pattern = r"""
@@ -100,7 +84,7 @@ class Template(metaclass=_TemplateMetaclass):
def _invalid(self, mo):
i = mo.start('invalid')
- lines = self.template[:i].splitlines(True)
+ lines = self.template[:i].splitlines(keepends=True)
if not lines:
colno = 1
lineno = 1
@@ -116,7 +100,7 @@ class Template(metaclass=_TemplateMetaclass):
if not args:
mapping = kws
elif kws:
- mapping = _multimap(kws, args[0])
+ mapping = ChainMap(kws, args[0])
else:
mapping = args[0]
# Helper function for .sub()
@@ -142,7 +126,7 @@ class Template(metaclass=_TemplateMetaclass):
if not args:
mapping = kws
elif kws:
- mapping = _multimap(kws, args[0])
+ mapping = ChainMap(kws, args[0])
else:
mapping = args[0]
# Helper function for .sub()
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 83c79ef..57cc1a4 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -191,8 +191,10 @@ should prepare for OSErrors.
A ValueError will be raised if Popen is called with invalid arguments.
-check_call() and check_output() will raise CalledProcessError, if the
-called process returns a non-zero return code.
+Exceptions defined within this module inherit from SubprocessError.
+check_call() and check_output() will raise CalledProcessError if the
+called process returns a non-zero return code. TimeoutExpired
+be raised if a timeout was specified and expired.
Security
@@ -340,15 +342,23 @@ mswindows = (sys.platform == "win32")
import io
import os
+import time
import traceback
import gc
import signal
import builtins
import warnings
import errno
+try:
+ from time import monotonic as _time
+except ImportError:
+ from time import time as _time
# Exception classes used by this module.
-class CalledProcessError(Exception):
+class SubprocessError(Exception): pass
+
+
+class CalledProcessError(SubprocessError):
"""This exception is raised when a process run by check_call() or
check_output() returns a non-zero exit status.
The exit status will be stored in the returncode attribute;
@@ -362,10 +372,24 @@ class CalledProcessError(Exception):
return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
+class TimeoutExpired(SubprocessError):
+ """This exception is raised when the timeout expires while waiting for a
+ child process.
+ """
+ def __init__(self, cmd, timeout, output=None):
+ self.cmd = cmd
+ self.timeout = timeout
+ self.output = output
+
+ def __str__(self):
+ return ("Command '%s' timed out after %s seconds" %
+ (self.cmd, self.timeout))
+
+
if mswindows:
import threading
import msvcrt
- import _subprocess
+ import _winapi
class STARTUPINFO:
dwFlags = 0
hStdInput = None
@@ -377,53 +401,49 @@ if mswindows:
else:
import select
_has_poll = hasattr(select, 'poll')
- import fcntl
- import pickle
-
- try:
- import _posixsubprocess
- except ImportError:
- _posixsubprocess = None
- warnings.warn("The _posixsubprocess module is not being used. "
- "Child process reliability may suffer if your "
- "program uses threads.", RuntimeWarning)
+ import _posixsubprocess
+ _create_pipe = _posixsubprocess.cloexec_pipe
# When select or poll has indicated that the file is writable,
# we can write up to _PIPE_BUF bytes without risk of blocking.
# POSIX defines PIPE_BUF as >= 512.
_PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
- _FD_CLOEXEC = getattr(fcntl, 'FD_CLOEXEC', 1)
-
- def _set_cloexec(fd, cloexec):
- old = fcntl.fcntl(fd, fcntl.F_GETFD)
- if cloexec:
- fcntl.fcntl(fd, fcntl.F_SETFD, old | _FD_CLOEXEC)
- else:
- fcntl.fcntl(fd, fcntl.F_SETFD, old & ~_FD_CLOEXEC)
-
- if _posixsubprocess:
- _create_pipe = _posixsubprocess.cloexec_pipe
- else:
- def _create_pipe():
- fds = os.pipe()
- _set_cloexec(fds[0], True)
- _set_cloexec(fds[1], True)
- return fds
__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
- "getoutput", "check_output", "CalledProcessError"]
+ "getoutput", "check_output", "CalledProcessError", "DEVNULL"]
if mswindows:
- from _subprocess import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
- STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
- STD_ERROR_HANDLE, SW_HIDE,
- STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
+ from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
+ STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
+ STD_ERROR_HANDLE, SW_HIDE,
+ STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW)
__all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
"STD_ERROR_HANDLE", "SW_HIDE",
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"])
+
+ class Handle(int):
+ closed = False
+
+ def Close(self, CloseHandle=_winapi.CloseHandle):
+ if not self.closed:
+ self.closed = True
+ CloseHandle(self)
+
+ def Detach(self):
+ if not self.closed:
+ self.closed = True
+ return int(self)
+ raise ValueError("already closed")
+
+ def __repr__(self):
+ return "Handle(%d)" % int(self)
+
+ __del__ = Close
+ __str__ = __repr__
+
try:
MAXFD = os.sysconf("SC_OPEN_MAX")
except:
@@ -448,27 +468,63 @@ def _cleanup():
PIPE = -1
STDOUT = -2
+DEVNULL = -3
def _eintr_retry_call(func, *args):
while True:
try:
return func(*args)
- except (OSError, IOError) as e:
- if e.errno == errno.EINTR:
- continue
- raise
-
-
-def call(*popenargs, **kwargs):
- """Run command with arguments. Wait for command to complete, then
- return the returncode attribute.
+ except InterruptedError:
+ continue
+
+
+# XXX This function is only used by multiprocessing and the test suite,
+# but it's here so that it can be imported when Python is compiled without
+# threads.
+
+def _args_from_interpreter_flags():
+ """Return a list of command-line arguments reproducing the current
+ settings in sys.flags and sys.warnoptions."""
+ flag_opt_map = {
+ 'debug': 'd',
+ # 'inspect': 'i',
+ # 'interactive': 'i',
+ 'optimize': 'O',
+ 'dont_write_bytecode': 'B',
+ 'no_user_site': 's',
+ 'no_site': 'S',
+ 'ignore_environment': 'E',
+ 'verbose': 'v',
+ 'bytes_warning': 'b',
+ 'quiet': 'q',
+ 'hash_randomization': 'R',
+ }
+ args = []
+ for flag, opt in flag_opt_map.items():
+ v = getattr(sys.flags, flag)
+ if v > 0:
+ args.append('-' + opt * v)
+ for opt in sys.warnoptions:
+ args.append('-W' + opt)
+ return args
+
+
+def call(*popenargs, timeout=None, **kwargs):
+ """Run command with arguments. Wait for command to complete or
+ timeout, then return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
- return Popen(*popenargs, **kwargs).wait()
+ with Popen(*popenargs, **kwargs) as p:
+ try:
+ return p.wait(timeout=timeout)
+ except:
+ p.kill()
+ p.wait()
+ raise
def check_call(*popenargs, **kwargs):
@@ -477,7 +533,7 @@ def check_call(*popenargs, **kwargs):
CalledProcessError. The CalledProcessError object will have the
return code in the returncode attribute.
- The arguments are the same as for the Popen constructor. Example:
+ The arguments are the same as for the call function. Example:
check_call(["ls", "-l"])
"""
@@ -490,7 +546,7 @@ def check_call(*popenargs, **kwargs):
return 0
-def check_output(*popenargs, **kwargs):
+def check_output(*popenargs, timeout=None, **kwargs):
r"""Run command with arguments and return its output as a byte string.
If the exit code was non-zero it raises a CalledProcessError. The
@@ -512,14 +568,20 @@ def check_output(*popenargs, **kwargs):
"""
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
- process = Popen(*popenargs, stdout=PIPE, **kwargs)
- output, unused_err = process.communicate()
- retcode = process.poll()
- if retcode:
- cmd = kwargs.get("args")
- if cmd is None:
- cmd = popenargs[0]
- raise CalledProcessError(retcode, cmd, output=output)
+ with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
+ try:
+ output, unused_err = process.communicate(timeout=timeout)
+ except TimeoutExpired:
+ process.kill()
+ output, unused_err = process.communicate()
+ raise TimeoutExpired(process.args, timeout, output=output)
+ except:
+ process.kill()
+ process.wait()
+ raise
+ retcode = process.poll()
+ if retcode:
+ raise CalledProcessError(retcode, process.args, output=output)
return output
@@ -614,11 +676,19 @@ def getstatusoutput(cmd):
>>> subprocess.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
"""
- pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
- text = pipe.read()
- sts = pipe.close()
- if sts is None: sts = 0
- if text[-1:] == '\n': text = text[:-1]
+ with os.popen('{ ' + cmd + '; } 2>&1', 'r') as pipe:
+ try:
+ text = pipe.read()
+ sts = pipe.close()
+ except:
+ process = pipe._proc
+ process.kill()
+ process.wait()
+ raise
+ if sts is None:
+ sts = 0
+ if text[-1:] == '\n':
+ text = text[:-1]
return sts, text
@@ -650,6 +720,8 @@ class Popen(object):
_cleanup()
self._child_created = False
+ self._input = None
+ self._communication_started = False
if bufsize is None:
bufsize = 0 # Restore default
if not isinstance(bufsize, int):
@@ -684,6 +756,7 @@ class Popen(object):
raise ValueError("creationflags is only supported on Windows "
"platforms")
+ self.args = args
self.stdin = None
self.stdout = None
self.stderr = None
@@ -724,7 +797,7 @@ class Popen(object):
if p2cwrite != -1:
self.stdin = io.open(p2cwrite, 'wb', bufsize)
- if self.universal_newlines:
+ if universal_newlines:
self.stdin = io.TextIOWrapper(self.stdin, write_through=True)
if c2pread != -1:
self.stdout = io.open(c2pread, 'rb', bufsize)
@@ -737,7 +810,7 @@ class Popen(object):
try:
self._execute_child(args, executable, preexec_fn, close_fds,
- pass_fds, cwd, env, universal_newlines,
+ pass_fds, cwd, env,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
@@ -784,19 +857,28 @@ class Popen(object):
# Child is still running, keep us alive until we can wait on it.
_active.append(self)
+ def _get_devnull(self):
+ if not hasattr(self, '_devnull'):
+ self._devnull = os.open(os.devnull, os.O_RDWR)
+ return self._devnull
- def communicate(self, input=None):
+ def communicate(self, input=None, timeout=None):
"""Interact with process: Send data to stdin. Read data from
stdout and stderr, until end-of-file is reached. Wait for
- process to terminate. The optional input argument should be a
- string to be sent to the child process, or None, if no data
+ process to terminate. The optional input argument should be
+ bytes to be sent to the child process, or None, if no data
should be sent to the child.
communicate() returns a tuple (stdout, stderr)."""
- # Optimization: If we are only using one pipe, or no pipe at
- # all, using select() or threads is unnecessary.
- if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
+ if self._communication_started and input:
+ raise ValueError("Cannot send input after starting communication")
+
+ # Optimization: If we are not worried about timeouts, we haven't
+ # started communicating, and we have one or zero pipes, using select()
+ # or threads is unnecessary.
+ if (timeout is None and not self._communication_started and
+ [self.stdin, self.stdout, self.stderr].count(None) >= 2):
stdout = None
stderr = None
if self.stdin:
@@ -814,15 +896,42 @@ class Popen(object):
stderr = _eintr_retry_call(self.stderr.read)
self.stderr.close()
self.wait()
- return (stdout, stderr)
+ else:
+ if timeout is not None:
+ endtime = _time() + timeout
+ else:
+ endtime = None
- return self._communicate(input)
+ try:
+ stdout, stderr = self._communicate(input, endtime, timeout)
+ finally:
+ self._communication_started = True
+
+ sts = self.wait(timeout=self._remaining_time(endtime))
+
+ return (stdout, stderr)
def poll(self):
return self._internal_poll()
+ def _remaining_time(self, endtime):
+ """Convenience for _communicate when computing timeouts."""
+ if endtime is None:
+ return None
+ else:
+ return endtime - _time()
+
+
+ def _check_timeout(self, endtime, orig_timeout):
+ """Convenience for checking if a timeout has expired."""
+ if endtime is None:
+ return
+ if _time() > endtime:
+ raise TimeoutExpired(self.args, orig_timeout)
+
+
if mswindows:
#
# Windows methods
@@ -839,11 +948,16 @@ class Popen(object):
errread, errwrite = -1, -1
if stdin is None:
- p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)
+ p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
if p2cread is None:
- p2cread, _ = _subprocess.CreatePipe(None, 0)
+ p2cread, _ = _winapi.CreatePipe(None, 0)
+ p2cread = Handle(p2cread)
+ _winapi.CloseHandle(_)
elif stdin == PIPE:
- p2cread, p2cwrite = _subprocess.CreatePipe(None, 0)
+ p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
+ p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
+ elif stdin == DEVNULL:
+ p2cread = msvcrt.get_osfhandle(self._get_devnull())
elif isinstance(stdin, int):
p2cread = msvcrt.get_osfhandle(stdin)
else:
@@ -852,11 +966,16 @@ class Popen(object):
p2cread = self._make_inheritable(p2cread)
if stdout is None:
- c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE)
+ c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
if c2pwrite is None:
- _, c2pwrite = _subprocess.CreatePipe(None, 0)
+ _, c2pwrite = _winapi.CreatePipe(None, 0)
+ c2pwrite = Handle(c2pwrite)
+ _winapi.CloseHandle(_)
elif stdout == PIPE:
- c2pread, c2pwrite = _subprocess.CreatePipe(None, 0)
+ c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
+ c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
+ elif stdout == DEVNULL:
+ c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
elif isinstance(stdout, int):
c2pwrite = msvcrt.get_osfhandle(stdout)
else:
@@ -865,13 +984,18 @@ class Popen(object):
c2pwrite = self._make_inheritable(c2pwrite)
if stderr is None:
- errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE)
+ errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
if errwrite is None:
- _, errwrite = _subprocess.CreatePipe(None, 0)
+ _, errwrite = _winapi.CreatePipe(None, 0)
+ errwrite = Handle(errwrite)
+ _winapi.CloseHandle(_)
elif stderr == PIPE:
- errread, errwrite = _subprocess.CreatePipe(None, 0)
+ errread, errwrite = _winapi.CreatePipe(None, 0)
+ errread, errwrite = Handle(errread), Handle(errwrite)
elif stderr == STDOUT:
errwrite = c2pwrite
+ elif stderr == DEVNULL:
+ errwrite = msvcrt.get_osfhandle(self._get_devnull())
elif isinstance(stderr, int):
errwrite = msvcrt.get_osfhandle(stderr)
else:
@@ -886,20 +1010,22 @@ class Popen(object):
def _make_inheritable(self, handle):
"""Return a duplicate of handle, which is inheritable"""
- return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(),
- handle, _subprocess.GetCurrentProcess(), 0, 1,
- _subprocess.DUPLICATE_SAME_ACCESS)
+ h = _winapi.DuplicateHandle(
+ _winapi.GetCurrentProcess(), handle,
+ _winapi.GetCurrentProcess(), 0, 1,
+ _winapi.DUPLICATE_SAME_ACCESS)
+ return Handle(h)
def _find_w9xpopen(self):
"""Find and return absolut path to w9xpopen.exe"""
w9xpopen = os.path.join(
- os.path.dirname(_subprocess.GetModuleFileName(0)),
+ os.path.dirname(_winapi.GetModuleFileName(0)),
"w9xpopen.exe")
if not os.path.exists(w9xpopen):
# Eeek - file-not-found - possibly an embedding
# situation - see if we can locate it in sys.exec_prefix
- w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
+ w9xpopen = os.path.join(os.path.dirname(sys.base_exec_prefix),
"w9xpopen.exe")
if not os.path.exists(w9xpopen):
raise RuntimeError("Cannot locate w9xpopen.exe, which is "
@@ -909,7 +1035,7 @@ class Popen(object):
def _execute_child(self, args, executable, preexec_fn, close_fds,
- pass_fds, cwd, env, universal_newlines,
+ pass_fds, cwd, env,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
@@ -926,17 +1052,17 @@ class Popen(object):
if startupinfo is None:
startupinfo = STARTUPINFO()
if -1 not in (p2cread, c2pwrite, errwrite):
- startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
+ startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
startupinfo.hStdInput = p2cread
startupinfo.hStdOutput = c2pwrite
startupinfo.hStdError = errwrite
if shell:
- startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
- startupinfo.wShowWindow = _subprocess.SW_HIDE
+ startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
+ startupinfo.wShowWindow = _winapi.SW_HIDE
comspec = os.environ.get("COMSPEC", "cmd.exe")
args = '{} /c "{}"'.format (comspec, args)
- if (_subprocess.GetVersion() >= 0x80000000 or
+ if (_winapi.GetVersion() >= 0x80000000 or
os.path.basename(comspec).lower() == "command.com"):
# Win9x, or using command.com on NT. We need to
# use the w9xpopen intermediate program. For more
@@ -950,11 +1076,11 @@ class Popen(object):
# use at xxx" and a hopeful warning about the
# stability of your system. Cost is Ctrl+C won't
# kill children.
- creationflags |= _subprocess.CREATE_NEW_CONSOLE
+ creationflags |= _winapi.CREATE_NEW_CONSOLE
# Start the process
try:
- hp, ht, pid, tid = _subprocess.CreateProcess(executable, args,
+ hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
# no special security
None, None,
int(not close_fds),
@@ -981,17 +1107,19 @@ class Popen(object):
c2pwrite.Close()
if errwrite != -1:
errwrite.Close()
+ if hasattr(self, '_devnull'):
+ os.close(self._devnull)
# Retain the process handle, but close the thread handle
self._child_created = True
- self._handle = hp
+ self._handle = Handle(hp)
self.pid = pid
- ht.Close()
+ _winapi.CloseHandle(ht)
def _internal_poll(self, _deadstate=None,
- _WaitForSingleObject=_subprocess.WaitForSingleObject,
- _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0,
- _GetExitCodeProcess=_subprocess.GetExitCodeProcess):
+ _WaitForSingleObject=_winapi.WaitForSingleObject,
+ _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
+ _GetExitCodeProcess=_winapi.GetExitCodeProcess):
"""Check if child process has terminated. Returns returncode
attribute.
@@ -1005,13 +1133,21 @@ class Popen(object):
return self.returncode
- def wait(self):
+ def wait(self, timeout=None, endtime=None):
"""Wait for child process to terminate. Returns returncode
attribute."""
+ if endtime is not None:
+ timeout = self._remaining_time(endtime)
+ if timeout is None:
+ timeout_millis = _winapi.INFINITE
+ else:
+ timeout_millis = int(timeout * 1000)
if self.returncode is None:
- _subprocess.WaitForSingleObject(self._handle,
- _subprocess.INFINITE)
- self.returncode = _subprocess.GetExitCodeProcess(self._handle)
+ result = _winapi.WaitForSingleObject(self._handle,
+ timeout_millis)
+ if result == _winapi.WAIT_TIMEOUT:
+ raise TimeoutExpired(self.args, timeout)
+ self.returncode = _winapi.GetExitCodeProcess(self._handle)
return self.returncode
@@ -1020,22 +1156,23 @@ class Popen(object):
fh.close()
- def _communicate(self, input):
- stdout = None # Return
- stderr = None # Return
-
- if self.stdout:
- stdout = []
- stdout_thread = threading.Thread(target=self._readerthread,
- args=(self.stdout, stdout))
- stdout_thread.daemon = True
- stdout_thread.start()
- if self.stderr:
- stderr = []
- stderr_thread = threading.Thread(target=self._readerthread,
- args=(self.stderr, stderr))
- stderr_thread.daemon = True
- stderr_thread.start()
+ def _communicate(self, input, endtime, orig_timeout):
+ # Start reader threads feeding into a list hanging off of this
+ # object, unless they've already been started.
+ if self.stdout and not hasattr(self, "_stdout_buff"):
+ self._stdout_buff = []
+ self.stdout_thread = \
+ threading.Thread(target=self._readerthread,
+ args=(self.stdout, self._stdout_buff))
+ self.stdout_thread.daemon = True
+ self.stdout_thread.start()
+ if self.stderr and not hasattr(self, "_stderr_buff"):
+ self._stderr_buff = []
+ self.stderr_thread = \
+ threading.Thread(target=self._readerthread,
+ args=(self.stderr, self._stderr_buff))
+ self.stderr_thread.daemon = True
+ self.stderr_thread.start()
if self.stdin:
if input is not None:
@@ -1046,10 +1183,28 @@ class Popen(object):
raise
self.stdin.close()
+ # Wait for the reader threads, or time out. If we time out, the
+ # threads remain reading and the fds left open in case the user
+ # calls communicate again.
+ if self.stdout is not None:
+ self.stdout_thread.join(self._remaining_time(endtime))
+ if self.stdout_thread.is_alive():
+ raise TimeoutExpired(self.args, orig_timeout)
+ if self.stderr is not None:
+ self.stderr_thread.join(self._remaining_time(endtime))
+ if self.stderr_thread.is_alive():
+ raise TimeoutExpired(self.args, orig_timeout)
+
+ # Collect the output from and close both pipes, now that we know
+ # both have been read successfully.
+ stdout = None
+ stderr = None
if self.stdout:
- stdout_thread.join()
+ stdout = self._stdout_buff
+ self.stdout.close()
if self.stderr:
- stderr_thread.join()
+ stderr = self._stderr_buff
+ self.stderr.close()
# All data exchanged. Translate lists into strings.
if stdout is not None:
@@ -1057,7 +1212,6 @@ class Popen(object):
if stderr is not None:
stderr = stderr[0]
- self.wait()
return (stdout, stderr)
def send_signal(self, sig):
@@ -1076,14 +1230,12 @@ class Popen(object):
"""Terminates the process
"""
try:
- _subprocess.TerminateProcess(self._handle, 1)
- except OSError as e:
+ _winapi.TerminateProcess(self._handle, 1)
+ except PermissionError:
# ERROR_ACCESS_DENIED (winerror 5) is received when the
# process already died.
- if e.winerror != 5:
- raise
- rc = _subprocess.GetExitCodeProcess(self._handle)
- if rc == _subprocess.STILL_ACTIVE:
+ rc = _winapi.GetExitCodeProcess(self._handle)
+ if rc == _winapi.STILL_ACTIVE:
raise
self.returncode = rc
@@ -1105,6 +1257,8 @@ class Popen(object):
pass
elif stdin == PIPE:
p2cread, p2cwrite = _create_pipe()
+ elif stdin == DEVNULL:
+ p2cread = self._get_devnull()
elif isinstance(stdin, int):
p2cread = stdin
else:
@@ -1115,6 +1269,8 @@ class Popen(object):
pass
elif stdout == PIPE:
c2pread, c2pwrite = _create_pipe()
+ elif stdout == DEVNULL:
+ c2pwrite = self._get_devnull()
elif isinstance(stdout, int):
c2pwrite = stdout
else:
@@ -1127,6 +1283,8 @@ class Popen(object):
errread, errwrite = _create_pipe()
elif stderr == STDOUT:
errwrite = c2pwrite
+ elif stderr == DEVNULL:
+ errwrite = self._get_devnull()
elif isinstance(stderr, int):
errwrite = stderr
else:
@@ -1149,7 +1307,7 @@ class Popen(object):
def _execute_child(self, args, executable, preexec_fn, close_fds,
- pass_fds, cwd, env, universal_newlines,
+ pass_fds, cwd, env,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
@@ -1157,7 +1315,7 @@ class Popen(object):
restore_signals, start_new_session):
"""Execute program (POSIX version)"""
- if isinstance(args, str):
+ if isinstance(args, (str, bytes)):
args = [args]
else:
args = list(args)
@@ -1177,153 +1335,34 @@ class Popen(object):
errpipe_read, errpipe_write = _create_pipe()
try:
try:
-
- if _posixsubprocess:
- # We must avoid complex work that could involve
- # malloc or free in the child process to avoid
- # potential deadlocks, thus we do all this here.
- # and pass it to fork_exec()
-
- if env is not None:
- env_list = [os.fsencode(k) + b'=' + os.fsencode(v)
- for k, v in env.items()]
- else:
- env_list = None # Use execv instead of execve.
- executable = os.fsencode(executable)
- if os.path.dirname(executable):
- executable_list = (executable,)
- else:
- # This matches the behavior of os._execvpe().
- executable_list = tuple(
- os.path.join(os.fsencode(dir), executable)
- for dir in os.get_exec_path(env))
- fds_to_keep = set(pass_fds)
- fds_to_keep.add(errpipe_write)
- self.pid = _posixsubprocess.fork_exec(
- args, executable_list,
- close_fds, sorted(fds_to_keep), cwd, env_list,
- p2cread, p2cwrite, c2pread, c2pwrite,
- errread, errwrite,
- errpipe_read, errpipe_write,
- restore_signals, start_new_session, preexec_fn)
- self._child_created = True
+ # We must avoid complex work that could involve
+ # malloc or free in the child process to avoid
+ # potential deadlocks, thus we do all this here.
+ # and pass it to fork_exec()
+
+ if env is not None:
+ env_list = [os.fsencode(k) + b'=' + os.fsencode(v)
+ for k, v in env.items()]
else:
- # Pure Python implementation: It is not thread safe.
- # This implementation may deadlock in the child if your
- # parent process has any other threads running.
-
- gc_was_enabled = gc.isenabled()
- # Disable gc to avoid bug where gc -> file_dealloc ->
- # write to stderr -> hang. See issue1336
- gc.disable()
- try:
- self.pid = os.fork()
- except:
- if gc_was_enabled:
- gc.enable()
- raise
- self._child_created = True
- if self.pid == 0:
- # Child
- reached_preexec = False
- try:
- # Close parent's pipe ends
- if p2cwrite != -1:
- os.close(p2cwrite)
- if c2pread != -1:
- os.close(c2pread)
- if errread != -1:
- os.close(errread)
- os.close(errpipe_read)
-
- # When duping fds, if there arises a situation
- # where one of the fds is either 0, 1 or 2, it
- # is possible that it is overwritten (#12607).
- if c2pwrite == 0:
- c2pwrite = os.dup(c2pwrite)
- if errwrite == 0 or errwrite == 1:
- errwrite = os.dup(errwrite)
-
- # Dup fds for child
- def _dup2(a, b):
- # dup2() removes the CLOEXEC flag but
- # we must do it ourselves if dup2()
- # would be a no-op (issue #10806).
- if a == b:
- _set_cloexec(a, False)
- elif a != -1:
- os.dup2(a, b)
- _dup2(p2cread, 0)
- _dup2(c2pwrite, 1)
- _dup2(errwrite, 2)
-
- # Close pipe fds. Make sure we don't close the
- # same fd more than once, or standard fds.
- closed = set()
- for fd in [p2cread, c2pwrite, errwrite]:
- if fd > 2 and fd not in closed:
- os.close(fd)
- closed.add(fd)
-
- # Close all other fds, if asked for
- if close_fds:
- fds_to_keep = set(pass_fds)
- fds_to_keep.add(errpipe_write)
- self._close_fds(fds_to_keep)
-
-
- if cwd is not None:
- os.chdir(cwd)
-
- # This is a copy of Python/pythonrun.c
- # _Py_RestoreSignals(). If that were exposed
- # as a sys._py_restoresignals func it would be
- # better.. but this pure python implementation
- # isn't likely to be used much anymore.
- if restore_signals:
- signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ')
- for sig in signals:
- if hasattr(signal, sig):
- signal.signal(getattr(signal, sig),
- signal.SIG_DFL)
-
- if start_new_session and hasattr(os, 'setsid'):
- os.setsid()
-
- reached_preexec = True
- if preexec_fn:
- preexec_fn()
-
- if env is None:
- os.execvp(executable, args)
- else:
- os.execvpe(executable, args, env)
-
- except:
- try:
- exc_type, exc_value = sys.exc_info()[:2]
- if isinstance(exc_value, OSError):
- errno_num = exc_value.errno
- else:
- errno_num = 0
- if not reached_preexec:
- exc_value = "noexec"
- message = '%s:%x:%s' % (exc_type.__name__,
- errno_num, exc_value)
- message = message.encode(errors="surrogatepass")
- os.write(errpipe_write, message)
- except Exception:
- # We MUST not allow anything odd happening
- # above to prevent us from exiting below.
- pass
-
- # This exitcode won't be reported to applications
- # so it really doesn't matter what we return.
- os._exit(255)
-
- # Parent
- if gc_was_enabled:
- gc.enable()
+ env_list = None # Use execv instead of execve.
+ executable = os.fsencode(executable)
+ if os.path.dirname(executable):
+ executable_list = (executable,)
+ else:
+ # This matches the behavior of os._execvpe().
+ executable_list = tuple(
+ os.path.join(os.fsencode(dir), executable)
+ for dir in os.get_exec_path(env))
+ fds_to_keep = set(pass_fds)
+ fds_to_keep.add(errpipe_write)
+ self.pid = _posixsubprocess.fork_exec(
+ args, executable_list,
+ close_fds, sorted(fds_to_keep), cwd, env_list,
+ p2cread, p2cwrite, c2pread, c2pwrite,
+ errread, errwrite,
+ errpipe_read, errpipe_write,
+ restore_signals, start_new_session, preexec_fn)
+ self._child_created = True
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
@@ -1334,6 +1373,8 @@ class Popen(object):
os.close(c2pwrite)
if errwrite != -1 and errread != -1:
os.close(errwrite)
+ if hasattr(self, '_devnull'):
+ os.close(self._devnull)
# Wait for exec to fail or succeed; possibly raising an
# exception (limited in size)
@@ -1425,25 +1466,57 @@ class Popen(object):
return self.returncode
- def wait(self):
+ def _try_wait(self, wait_flags):
+ try:
+ (pid, sts) = _eintr_retry_call(os.waitpid, self.pid, wait_flags)
+ except OSError as e:
+ if e.errno != errno.ECHILD:
+ raise
+ # This happens if SIGCLD is set to be ignored or waiting
+ # for child processes has otherwise been disabled for our
+ # process. This child is dead, we can't get the status.
+ pid = self.pid
+ sts = 0
+ return (pid, sts)
+
+
+ def wait(self, timeout=None, endtime=None):
"""Wait for child process to terminate. Returns returncode
attribute."""
- if self.returncode is None:
- try:
- pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
- except OSError as e:
- if e.errno != errno.ECHILD:
- raise
- # This happens if SIGCLD is set to be ignored or waiting
- # for child processes has otherwise been disabled for our
- # process. This child is dead, we can't get the status.
- sts = 0
+ if self.returncode is not None:
+ return self.returncode
+
+ # endtime is preferred to timeout. timeout is only used for
+ # printing.
+ if endtime is not None or timeout is not None:
+ if endtime is None:
+ endtime = _time() + timeout
+ elif timeout is None:
+ timeout = self._remaining_time(endtime)
+
+ if endtime is not None:
+ # Enter a busy loop if we have a timeout. This busy loop was
+ # cribbed from Lib/threading.py in Thread.wait() at r71065.
+ delay = 0.0005 # 500 us -> initial delay of 1 ms
+ while True:
+ (pid, sts) = self._try_wait(os.WNOHANG)
+ assert pid == self.pid or pid == 0
+ if pid == self.pid:
+ self._handle_exitstatus(sts)
+ break
+ remaining = self._remaining_time(endtime)
+ if remaining <= 0:
+ raise TimeoutExpired(self.args, timeout)
+ delay = min(delay * 2, remaining, .05)
+ time.sleep(delay)
+ elif self.returncode is None:
+ (pid, sts) = self._try_wait(0)
self._handle_exitstatus(sts)
return self.returncode
- def _communicate(self, input):
- if self.stdin:
+ def _communicate(self, input, endtime, orig_timeout):
+ if self.stdin and not self._communication_started:
# Flush stdio buffer. This might block, if the user has
# been writing to .stdin in an uncontrolled fashion.
self.stdin.flush()
@@ -1451,9 +1524,13 @@ class Popen(object):
self.stdin.close()
if _has_poll:
- stdout, stderr = self._communicate_with_poll(input)
+ stdout, stderr = self._communicate_with_poll(input, endtime,
+ orig_timeout)
else:
- stdout, stderr = self._communicate_with_select(input)
+ stdout, stderr = self._communicate_with_select(input, endtime,
+ orig_timeout)
+
+ self.wait(timeout=self._remaining_time(endtime))
# All data exchanged. Translate lists into strings.
if stdout is not None:
@@ -1471,67 +1548,92 @@ class Popen(object):
stderr = self._translate_newlines(stderr,
self.stderr.encoding)
- self.wait()
return (stdout, stderr)
- def _communicate_with_poll(self, input):
+ def _save_input(self, input):
+ # This method is called from the _communicate_with_*() methods
+ # so that if we time out while communicating, we can continue
+ # sending input if we retry.
+ if self.stdin and self._input is None:
+ self._input_offset = 0
+ self._input = input
+ if self.universal_newlines and input is not None:
+ self._input = self._input.encode(self.stdin.encoding)
+
+
+ def _communicate_with_poll(self, input, endtime, orig_timeout):
stdout = None # Return
stderr = None # Return
- fd2file = {}
- fd2output = {}
+
+ if not self._communication_started:
+ self._fd2file = {}
poller = select.poll()
def register_and_append(file_obj, eventmask):
poller.register(file_obj.fileno(), eventmask)
- fd2file[file_obj.fileno()] = file_obj
+ self._fd2file[file_obj.fileno()] = file_obj
def close_unregister_and_remove(fd):
poller.unregister(fd)
- fd2file[fd].close()
- fd2file.pop(fd)
+ self._fd2file[fd].close()
+ self._fd2file.pop(fd)
if self.stdin and input:
register_and_append(self.stdin, select.POLLOUT)
+ # Only create this mapping if we haven't already.
+ if not self._communication_started:
+ self._fd2output = {}
+ if self.stdout:
+ self._fd2output[self.stdout.fileno()] = []
+ if self.stderr:
+ self._fd2output[self.stderr.fileno()] = []
+
select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI
if self.stdout:
register_and_append(self.stdout, select_POLLIN_POLLPRI)
- fd2output[self.stdout.fileno()] = stdout = []
+ stdout = self._fd2output[self.stdout.fileno()]
if self.stderr:
register_and_append(self.stderr, select_POLLIN_POLLPRI)
- fd2output[self.stderr.fileno()] = stderr = []
+ stderr = self._fd2output[self.stderr.fileno()]
- input_offset = 0
- while fd2file:
+ self._save_input(input)
+
+ while self._fd2file:
+ timeout = self._remaining_time(endtime)
+ if timeout is not None and timeout < 0:
+ raise TimeoutExpired(self.args, orig_timeout)
try:
- ready = poller.poll()
+ ready = poller.poll(timeout)
except select.error as e:
if e.args[0] == errno.EINTR:
continue
raise
+ self._check_timeout(endtime, orig_timeout)
# XXX Rewrite these to use non-blocking I/O on the
# file objects; they are no longer using C stdio!
for fd, mode in ready:
if mode & select.POLLOUT:
- chunk = input[input_offset : input_offset + _PIPE_BUF]
+ chunk = self._input[self._input_offset :
+ self._input_offset + _PIPE_BUF]
try:
- input_offset += os.write(fd, chunk)
+ self._input_offset += os.write(fd, chunk)
except OSError as e:
if e.errno == errno.EPIPE:
close_unregister_and_remove(fd)
else:
raise
else:
- if input_offset >= len(input):
+ if self._input_offset >= len(self._input):
close_unregister_and_remove(fd)
elif mode & select_POLLIN_POLLPRI:
data = os.read(fd, 4096)
if not data:
close_unregister_and_remove(fd)
- fd2output[fd].append(data)
+ self._fd2output[fd].append(data)
else:
# Ignore hang up or errors.
close_unregister_and_remove(fd)
@@ -1539,61 +1641,83 @@ class Popen(object):
return (stdout, stderr)
- def _communicate_with_select(self, input):
- read_set = []
- write_set = []
+ def _communicate_with_select(self, input, endtime, orig_timeout):
+ if not self._communication_started:
+ self._read_set = []
+ self._write_set = []
+ if self.stdin and input:
+ self._write_set.append(self.stdin)
+ if self.stdout:
+ self._read_set.append(self.stdout)
+ if self.stderr:
+ self._read_set.append(self.stderr)
+
+ self._save_input(input)
+
stdout = None # Return
stderr = None # Return
- if self.stdin and input:
- write_set.append(self.stdin)
if self.stdout:
- read_set.append(self.stdout)
- stdout = []
+ if not self._communication_started:
+ self._stdout_buff = []
+ stdout = self._stdout_buff
if self.stderr:
- read_set.append(self.stderr)
- stderr = []
-
- input_offset = 0
- while read_set or write_set:
+ if not self._communication_started:
+ self._stderr_buff = []
+ stderr = self._stderr_buff
+
+ while self._read_set or self._write_set:
+ timeout = self._remaining_time(endtime)
+ if timeout is not None and timeout < 0:
+ raise TimeoutExpired(self.args, orig_timeout)
try:
- rlist, wlist, xlist = select.select(read_set, write_set, [])
+ (rlist, wlist, xlist) = \
+ select.select(self._read_set, self._write_set, [],
+ timeout)
except select.error as e:
if e.args[0] == errno.EINTR:
continue
raise
+ # According to the docs, returning three empty lists indicates
+ # that the timeout expired.
+ if not (rlist or wlist or xlist):
+ raise TimeoutExpired(self.args, orig_timeout)
+ # We also check what time it is ourselves for good measure.
+ self._check_timeout(endtime, orig_timeout)
+
# XXX Rewrite these to use non-blocking I/O on the
# file objects; they are no longer using C stdio!
if self.stdin in wlist:
- chunk = input[input_offset : input_offset + _PIPE_BUF]
+ chunk = self._input[self._input_offset :
+ self._input_offset + _PIPE_BUF]
try:
bytes_written = os.write(self.stdin.fileno(), chunk)
except OSError as e:
if e.errno == errno.EPIPE:
self.stdin.close()
- write_set.remove(self.stdin)
+ self._write_set.remove(self.stdin)
else:
raise
else:
- input_offset += bytes_written
- if input_offset >= len(input):
+ self._input_offset += bytes_written
+ if self._input_offset >= len(self._input):
self.stdin.close()
- write_set.remove(self.stdin)
+ self._write_set.remove(self.stdin)
if self.stdout in rlist:
data = os.read(self.stdout.fileno(), 1024)
if not data:
self.stdout.close()
- read_set.remove(self.stdout)
+ self._read_set.remove(self.stdout)
stdout.append(data)
if self.stderr in rlist:
data = os.read(self.stderr.fileno(), 1024)
if not data:
self.stderr.close()
- read_set.remove(self.stderr)
+ self._read_set.remove(self.stderr)
stderr.append(data)
return (stdout, stderr)
@@ -1613,68 +1737,3 @@ class Popen(object):
"""Kill the process with SIGKILL
"""
self.send_signal(signal.SIGKILL)
-
-
-def _demo_posix():
- #
- # Example 1: Simple redirection: Get process list
- #
- plist = Popen(["ps"], stdout=PIPE).communicate()[0]
- print("Process list:")
- print(plist)
-
- #
- # Example 2: Change uid before executing child
- #
- if os.getuid() == 0:
- p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
- p.wait()
-
- #
- # Example 3: Connecting several subprocesses
- #
- print("Looking for 'hda'...")
- p1 = Popen(["dmesg"], stdout=PIPE)
- p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
- print(repr(p2.communicate()[0]))
-
- #
- # Example 4: Catch execution error
- #
- print()
- print("Trying a weird file...")
- try:
- print(Popen(["/this/path/does/not/exist"]).communicate())
- except OSError as e:
- if e.errno == errno.ENOENT:
- print("The file didn't exist. I thought so...")
- print("Child traceback:")
- print(e.child_traceback)
- else:
- print("Error", e.errno)
- else:
- print("Gosh. No error.", file=sys.stderr)
-
-
-def _demo_windows():
- #
- # Example 1: Connecting several subprocesses
- #
- print("Looking for 'PROMPT' in set output...")
- p1 = Popen("set", stdout=PIPE, shell=True)
- p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
- print(repr(p2.communicate()[0]))
-
- #
- # Example 2: Simple execution of program
- #
- print("Executing calc...")
- p = Popen("calc")
- p.wait()
-
-
-if __name__ == "__main__":
- if mswindows:
- _demo_windows()
- else:
- _demo_posix()
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
index b2183d8..71da1db 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -1,8 +1,8 @@
-"""Provide access to Python's configuration information.
+"""Access to Python's configuration information."""
-"""
-import sys
import os
+import re
+import sys
from os.path import pardir, realpath
__all__ = [
@@ -17,50 +17,50 @@ __all__ = [
'get_python_version',
'get_scheme_names',
'parse_config_h',
- ]
+]
_INSTALL_SCHEMES = {
'posix_prefix': {
- 'stdlib': '{base}/lib/python{py_version_short}',
+ 'stdlib': '{installed_base}/lib/python{py_version_short}',
'platstdlib': '{platbase}/lib/python{py_version_short}',
'purelib': '{base}/lib/python{py_version_short}/site-packages',
'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
'include':
- '{base}/include/python{py_version_short}{abiflags}',
+ '{installed_base}/include/python{py_version_short}{abiflags}',
'platinclude':
- '{platbase}/include/python{py_version_short}{abiflags}',
+ '{installed_platbase}/include/python{py_version_short}{abiflags}',
'scripts': '{base}/bin',
'data': '{base}',
},
'posix_home': {
- 'stdlib': '{base}/lib/python',
+ 'stdlib': '{installed_base}/lib/python',
'platstdlib': '{base}/lib/python',
'purelib': '{base}/lib/python',
'platlib': '{base}/lib/python',
- 'include': '{base}/include/python',
- 'platinclude': '{base}/include/python',
+ 'include': '{installed_base}/include/python',
+ 'platinclude': '{installed_base}/include/python',
'scripts': '{base}/bin',
- 'data' : '{base}',
+ 'data': '{base}',
},
'nt': {
- 'stdlib': '{base}/Lib',
+ 'stdlib': '{installed_base}/Lib',
'platstdlib': '{base}/Lib',
'purelib': '{base}/Lib/site-packages',
'platlib': '{base}/Lib/site-packages',
- 'include': '{base}/Include',
- 'platinclude': '{base}/Include',
+ 'include': '{installed_base}/Include',
+ 'platinclude': '{installed_base}/Include',
'scripts': '{base}/Scripts',
- 'data' : '{base}',
+ 'data': '{base}',
},
'os2': {
- 'stdlib': '{base}/Lib',
+ 'stdlib': '{installed_base}/Lib',
'platstdlib': '{base}/Lib',
'purelib': '{base}/Lib/site-packages',
'platlib': '{base}/Lib/site-packages',
- 'include': '{base}/Include',
- 'platinclude': '{base}/Include',
+ 'include': '{installed_base}/Include',
+ 'platinclude': '{installed_base}/Include',
'scripts': '{base}/Scripts',
- 'data' : '{base}',
+ 'data': '{base}',
},
'os2_home': {
'stdlib': '{userbase}/lib/python{py_version_short}',
@@ -69,7 +69,7 @@ _INSTALL_SCHEMES = {
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
'include': '{userbase}/include/python{py_version_short}',
'scripts': '{userbase}/bin',
- 'data' : '{userbase}',
+ 'data': '{userbase}',
},
'nt_user': {
'stdlib': '{userbase}/Python{py_version_nodot}',
@@ -78,7 +78,7 @@ _INSTALL_SCHEMES = {
'platlib': '{userbase}/Python{py_version_nodot}/site-packages',
'include': '{userbase}/Python{py_version_nodot}/Include',
'scripts': '{userbase}/Scripts',
- 'data' : '{userbase}',
+ 'data': '{userbase}',
},
'posix_user': {
'stdlib': '{userbase}/lib/python{py_version_short}',
@@ -87,7 +87,7 @@ _INSTALL_SCHEMES = {
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
'include': '{userbase}/include/python{py_version_short}',
'scripts': '{userbase}/bin',
- 'data' : '{userbase}',
+ 'data': '{userbase}',
},
'osx_framework_user': {
'stdlib': '{userbase}/lib/python',
@@ -96,20 +96,26 @@ _INSTALL_SCHEMES = {
'platlib': '{userbase}/lib/python/site-packages',
'include': '{userbase}/include',
'scripts': '{userbase}/bin',
- 'data' : '{userbase}',
+ 'data': '{userbase}',
},
}
_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
'scripts', 'data')
+
+ # FIXME don't rely on sys.version here, its format is an implementation detail
+ # of CPython, use sys.version_info or sys.hexversion
_PY_VERSION = sys.version.split()[0]
_PY_VERSION_SHORT = sys.version[:3]
_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2]
_PREFIX = os.path.normpath(sys.prefix)
+_BASE_PREFIX = os.path.normpath(sys.base_prefix)
_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+_BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
_CONFIG_VARS = None
_USER_BASE = None
+
def _safe_realpath(path):
try:
return realpath(path)
@@ -132,19 +138,35 @@ if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
_PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
-def is_python_build():
+# set for cross builds
+if "_PYTHON_PROJECT_BASE" in os.environ:
+ _PROJECT_BASE = _safe_realpath(os.environ["_PYTHON_PROJECT_BASE"])
+
+def _is_python_source_dir(d):
for fn in ("Setup.dist", "Setup.local"):
- if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)):
+ if os.path.isfile(os.path.join(d, "Modules", fn)):
return True
return False
-_PYTHON_BUILD = is_python_build()
+_sys_home = getattr(sys, '_home', None)
+if _sys_home and os.name == 'nt' and \
+ _sys_home.lower().endswith(('pcbuild', 'pcbuild\\amd64')):
+ _sys_home = os.path.dirname(_sys_home)
+ if _sys_home.endswith('pcbuild'): # must be amd64
+ _sys_home = os.path.dirname(_sys_home)
+def is_python_build(check_home=False):
+ if check_home and _sys_home:
+ return _is_python_source_dir(_sys_home)
+ return _is_python_source_dir(_PROJECT_BASE)
+
+_PYTHON_BUILD = is_python_build(True)
if _PYTHON_BUILD:
for scheme in ('posix_prefix', 'posix_home'):
_INSTALL_SCHEMES[scheme]['include'] = '{srcdir}/Include'
_INSTALL_SCHEMES[scheme]['platinclude'] = '{projectbase}/.'
+
def _subst_vars(s, local_vars):
try:
return s.format(**local_vars)
@@ -161,6 +183,7 @@ def _extend_dict(target_dict, other_dict):
continue
target_dict[key] = value
+
def _expand_vars(scheme, vars):
res = {}
if vars is None:
@@ -173,29 +196,41 @@ def _expand_vars(scheme, vars):
res[key] = os.path.normpath(_subst_vars(value, vars))
return res
+
def _get_default_scheme():
if os.name == 'posix':
# the default scheme for posix is posix_prefix
return 'posix_prefix'
return os.name
+
def _getuserbase():
env_base = os.environ.get("PYTHONUSERBASE", None)
+
def joinuser(*args):
return os.path.expanduser(os.path.join(*args))
# what about 'os2emx', 'riscos' ?
if os.name == "nt":
base = os.environ.get("APPDATA") or "~"
- return env_base if env_base else joinuser(base, "Python")
+ if env_base:
+ return env_base
+ else:
+ return joinuser(base, "Python")
if sys.platform == "darwin":
framework = get_config_var("PYTHONFRAMEWORK")
if framework:
- return env_base if env_base else joinuser("~", "Library", framework, "%d.%d"%(
- sys.version_info[:2]))
+ if env_base:
+ return env_base
+ else:
+ return joinuser("~", "Library", framework, "%d.%d" %
+ sys.version_info[:2])
- return env_base if env_base else joinuser("~", ".local")
+ if env_base:
+ return env_base
+ else:
+ return joinuser("~", ".local")
def _parse_makefile(filename, vars=None):
@@ -205,7 +240,6 @@ def _parse_makefile(filename, vars=None):
optional dictionary is passed in as the second argument, it is
used instead of a new dictionary.
"""
- import re
# Regexes needed for parsing Makefile (and similar syntaxes,
# like old-style Setup files).
_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
@@ -267,7 +301,8 @@ def _parse_makefile(filename, vars=None):
item = os.environ[n]
elif n in renamed_variables:
- if name.startswith('PY_') and name[3:] in renamed_variables:
+ if (name.startswith('PY_') and
+ name[3:] in renamed_variables):
item = ""
elif 'PY_' + n in notdone:
@@ -300,7 +335,6 @@ def _parse_makefile(filename, vars=None):
if name not in done:
done[name] = value
-
else:
# bogus variable reference (e.g. "prefix=$/opt/python");
# just drop it since we can't deal
@@ -320,14 +354,17 @@ def _parse_makefile(filename, vars=None):
def get_makefile_filename():
"""Return the path of the Makefile."""
if _PYTHON_BUILD:
- return os.path.join(_PROJECT_BASE, "Makefile")
- return os.path.join(get_path('stdlib'),
- 'config-{}{}'.format(_PY_VERSION_SHORT, sys.abiflags),
- 'Makefile')
-
+ return os.path.join(_sys_home or _PROJECT_BASE, "Makefile")
+ if hasattr(sys, 'abiflags'):
+ config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags)
+ else:
+ config_dir_name = 'config'
+ return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')
-def _init_posix(vars):
- """Initialize the module as appropriate for POSIX systems."""
+def _generate_posix_vars():
+ """Generate the Python module containing build-time variables."""
+ import pprint
+ vars = {}
# load the installed Makefile:
makefile = get_makefile_filename()
try:
@@ -353,6 +390,46 @@ def _init_posix(vars):
if _PYTHON_BUILD:
vars['LDSHARED'] = vars['BLDSHARED']
+ # There's a chicken-and-egg situation on OS X with regards to the
+ # _sysconfigdata module after the changes introduced by #15298:
+ # get_config_vars() is called by get_platform() as part of the
+ # `make pybuilddir.txt` target -- which is a precursor to the
+ # _sysconfigdata.py module being constructed. Unfortunately,
+ # get_config_vars() eventually calls _init_posix(), which attempts
+ # to import _sysconfigdata, which we won't have built yet. In order
+ # for _init_posix() to work, if we're on Darwin, just mock up the
+ # _sysconfigdata module manually and populate it with the build vars.
+ # This is more than sufficient for ensuring the subsequent call to
+ # get_platform() succeeds.
+ name = '_sysconfigdata'
+ if 'darwin' in sys.platform:
+ import imp
+ module = imp.new_module(name)
+ module.build_time_vars = vars
+ sys.modules[name] = module
+
+ pybuilddir = 'build/lib.%s-%s' % (get_platform(), sys.version[:3])
+ if hasattr(sys, "gettotalrefcount"):
+ pybuilddir += '-pydebug'
+ os.makedirs(pybuilddir, exist_ok=True)
+ destfile = os.path.join(pybuilddir, name + '.py')
+
+ with open(destfile, 'w', encoding='utf8') as f:
+ f.write('# system configuration generated and used by'
+ ' the sysconfig module\n')
+ f.write('build_time_vars = ')
+ pprint.pprint(vars, stream=f)
+
+ # Create file used for sys.path fixup -- see Modules/getpath.c
+ with open('pybuilddir.txt', 'w', encoding='ascii') as f:
+ f.write(pybuilddir)
+
+def _init_posix(vars):
+ """Initialize the module as appropriate for POSIX systems."""
+ # _sysconfigdata is generated at build time, see _generate_posix_vars()
+ from _sysconfigdata import build_time_vars
+ vars.update(build_time_vars)
+
def _init_non_posix(vars):
"""Initialize the module as appropriate for NT"""
# set basic install directories
@@ -376,7 +453,6 @@ def parse_config_h(fp, vars=None):
optional dictionary is passed in as the second argument, it is
used instead of a new dictionary.
"""
- import re
if vars is None:
vars = {}
define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
@@ -389,8 +465,10 @@ def parse_config_h(fp, vars=None):
m = define_rx.match(line)
if m:
n, v = m.group(1, 2)
- try: v = int(v)
- except ValueError: pass
+ try:
+ v = int(v)
+ except ValueError:
+ pass
vars[n] = v
else:
m = undef_rx.match(line)
@@ -398,27 +476,29 @@ def parse_config_h(fp, vars=None):
vars[m.group(1)] = 0
return vars
+
def get_config_h_filename():
"""Return the path of pyconfig.h."""
if _PYTHON_BUILD:
if os.name == "nt":
- inc_dir = os.path.join(_PROJECT_BASE, "PC")
+ inc_dir = os.path.join(_sys_home or _PROJECT_BASE, "PC")
else:
- inc_dir = _PROJECT_BASE
+ inc_dir = _sys_home or _PROJECT_BASE
else:
inc_dir = get_path('platinclude')
return os.path.join(inc_dir, 'pyconfig.h')
+
def get_scheme_names():
"""Return a tuple containing the schemes names."""
- schemes = list(_INSTALL_SCHEMES.keys())
- schemes.sort()
- return tuple(schemes)
+ return tuple(sorted(_INSTALL_SCHEMES))
+
def get_path_names():
"""Return a tuple containing the paths names."""
return _SCHEME_KEYS
+
def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
"""Return a mapping containing an install scheme.
@@ -430,6 +510,7 @@ def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
else:
return _INSTALL_SCHEMES[scheme]
+
def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
"""Return a path corresponding to the scheme.
@@ -437,17 +518,17 @@ def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
"""
return get_paths(scheme, vars, expand)[name]
+
def get_config_vars(*args):
"""With no arguments, return a dictionary of all configuration
variables relevant for the current platform.
On Unix, this means every variable defined in Python's installed Makefile;
- On Windows and Mac OS it's a much smaller set.
+ On Windows it's a much smaller set.
With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
"""
- import re
global _CONFIG_VARS
if _CONFIG_VARS is None:
_CONFIG_VARS = {}
@@ -459,7 +540,9 @@ def get_config_vars(*args):
_CONFIG_VARS['py_version'] = _PY_VERSION
_CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
_CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
+ _CONFIG_VARS['installed_base'] = _BASE_PREFIX
_CONFIG_VARS['base'] = _PREFIX
+ _CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX
_CONFIG_VARS['platbase'] = _EXEC_PREFIX
_CONFIG_VARS['projectbase'] = _PROJECT_BASE
try:
@@ -477,88 +560,28 @@ def get_config_vars(*args):
# the init-function.
_CONFIG_VARS['userbase'] = _getuserbase()
- if 'srcdir' not in _CONFIG_VARS:
- _CONFIG_VARS['srcdir'] = _PROJECT_BASE
- else:
- _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir'])
-
-
- # Convert srcdir into an absolute path if it appears necessary.
- # Normally it is relative to the build directory. However, during
- # testing, for example, we might be running a non-installed python
- # from a different directory.
- if _PYTHON_BUILD and os.name == "posix":
- base = _PROJECT_BASE
- try:
- cwd = os.getcwd()
- except OSError:
- cwd = None
- if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
- base != cwd):
- # srcdir is relative and we are not in the same directory
- # as the executable. Assume executable is in the build
- # directory and make srcdir absolute.
- srcdir = os.path.join(base, _CONFIG_VARS['srcdir'])
- _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir)
-
- if sys.platform == 'darwin':
- kernel_version = os.uname()[2] # Kernel version (8.4.3)
- major_version = int(kernel_version.split('.')[0])
-
- if major_version < 8:
- # On Mac OS X before 10.4, check if -arch and -isysroot
- # are in CFLAGS or LDFLAGS and remove them if they are.
- # This is needed when building extensions on a 10.3 system
- # using a universal build of python.
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
- flags = _CONFIG_VARS[key]
- flags = re.sub('-arch\s+\w+\s', ' ', flags)
- flags = re.sub('-isysroot [^ \t]*', ' ', flags)
- _CONFIG_VARS[key] = flags
+ # Always convert srcdir to an absolute path
+ srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE)
+ if os.name == 'posix':
+ if _PYTHON_BUILD:
+ # If srcdir is a relative path (typically '.' or '..')
+ # then it should be interpreted relative to the directory
+ # containing Makefile.
+ base = os.path.dirname(get_makefile_filename())
+ srcdir = os.path.join(base, srcdir)
else:
- # Allow the user to override the architecture flags using
- # an environment variable.
- # NOTE: This name was introduced by Apple in OSX 10.5 and
- # is used by several scripting languages distributed with
- # that OS release.
- if 'ARCHFLAGS' in os.environ:
- arch = os.environ['ARCHFLAGS']
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
- flags = _CONFIG_VARS[key]
- flags = re.sub('-arch\s+\w+\s', ' ', flags)
- flags = flags + ' ' + arch
- _CONFIG_VARS[key] = flags
-
- # If we're on OSX 10.5 or later and the user tries to
- # compiles an extension using an SDK that is not present
- # on the current machine it is better to not use an SDK
- # than to fail.
- #
- # The major usecase for this is users using a Python.org
- # binary installer on OSX 10.6: that installer uses
- # the 10.4u SDK, but that SDK is not installed by default
- # when you install Xcode.
- #
- CFLAGS = _CONFIG_VARS.get('CFLAGS', '')
- m = re.search('-isysroot\s+(\S+)', CFLAGS)
- if m is not None:
- sdk = m.group(1)
- if not os.path.exists(sdk):
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
- flags = _CONFIG_VARS[key]
- flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
- _CONFIG_VARS[key] = flags
+ # srcdir is not meaningful since the installation is
+ # spread about the filesystem. We choose the
+ # directory containing the Makefile since we know it
+ # exists.
+ srcdir = os.path.dirname(get_makefile_filename())
+ _CONFIG_VARS['srcdir'] = _safe_realpath(srcdir)
+
+ # OS X platforms require special customization to handle
+ # multi-architecture, multi-os-version installers
+ if sys.platform == 'darwin':
+ import _osx_support
+ _osx_support.customize_config_vars(_CONFIG_VARS)
if args:
vals = []
@@ -568,6 +591,7 @@ def get_config_vars(*args):
else:
return _CONFIG_VARS
+
def get_config_var(name):
"""Return the value of a single variable using the dictionary returned by
'get_config_vars()'.
@@ -576,6 +600,7 @@ def get_config_var(name):
"""
return get_config_vars().get(name)
+
def get_platform():
"""Return a string that identifies the current platform.
@@ -601,7 +626,6 @@ def get_platform():
For other non-POSIX platforms, currently just returns 'sys.platform'.
"""
- import re
if os.name == 'nt':
# sniff sys.version for architecture.
prefix = " bit ("
@@ -617,10 +641,13 @@ def get_platform():
return sys.platform
if os.name != "posix" or not hasattr(os, 'uname'):
- # XXX what about the architecture? NT is Intel or Alpha,
- # Mac OS is M68k or PPC, etc.
+ # XXX what about the architecture? NT is Intel or Alpha
return sys.platform
+ # Set for cross builds explicitly
+ if "_PYTHON_HOST_PLATFORM" in os.environ:
+ return os.environ["_PYTHON_HOST_PLATFORM"]
+
# Try to distinguish various flavours of Unix
osname, host, release, version, machine = os.uname()
@@ -651,97 +678,15 @@ def get_platform():
return "%s-%s.%s" % (osname, version, release)
elif osname[:6] == "cygwin":
osname = "cygwin"
- rel_re = re.compile (r'[\d.]+')
+ rel_re = re.compile(r'[\d.]+')
m = rel_re.match(release)
if m:
release = m.group()
elif osname[:6] == "darwin":
- #
- # For our purposes, we'll assume that the system version from
- # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
- # to. This makes the compatibility story a bit more sane because the
- # machine is going to compile and link as if it were
- # MACOSX_DEPLOYMENT_TARGET.
- #
- cfgvars = get_config_vars()
- macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
-
- if 1:
- # Always calculate the release of the running machine,
- # needed to determine if we can build fat binaries or not.
-
- macrelease = macver
- # Get the system version. Reading this plist is a documented
- # way to get the system version (see the documentation for
- # the Gestalt Manager)
- try:
- f = open('/System/Library/CoreServices/SystemVersion.plist')
- except IOError:
- # We're on a plain darwin box, fall back to the default
- # behaviour.
- pass
- else:
- try:
- m = re.search(
- r'<key>ProductUserVisibleVersion</key>\s*' +
- r'<string>(.*?)</string>', f.read())
- if m is not None:
- macrelease = '.'.join(m.group(1).split('.')[:2])
- # else: fall back to the default behaviour
- finally:
- f.close()
-
- if not macver:
- macver = macrelease
-
- if macver:
- release = macver
- osname = "macosx"
-
- if (macrelease + '.') >= '10.4.' and \
- '-arch' in get_config_vars().get('CFLAGS', '').strip():
- # The universal build will build fat binaries, but not on
- # systems before 10.4
- #
- # Try to detect 4-way universal builds, those have machine-type
- # 'universal' instead of 'fat'.
-
- machine = 'fat'
- cflags = get_config_vars().get('CFLAGS')
-
- archs = re.findall('-arch\s+(\S+)', cflags)
- archs = tuple(sorted(set(archs)))
-
- if len(archs) == 1:
- machine = archs[0]
- elif archs == ('i386', 'ppc'):
- machine = 'fat'
- elif archs == ('i386', 'x86_64'):
- machine = 'intel'
- elif archs == ('i386', 'ppc', 'x86_64'):
- machine = 'fat3'
- elif archs == ('ppc64', 'x86_64'):
- machine = 'fat64'
- elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
- machine = 'universal'
- else:
- raise ValueError(
- "Don't know machine value for archs=%r"%(archs,))
-
- elif machine == 'i386':
- # On OSX the machine type returned by uname is always the
- # 32-bit variant, even if the executable architecture is
- # the 64-bit variant
- if sys.maxsize >= 2**32:
- machine = 'x86_64'
-
- elif machine in ('PowerPC', 'Power_Macintosh'):
- # Pick a sane name for the PPC architecture.
- # See 'i386' case
- if sys.maxsize >= 2**32:
- machine = 'ppc64'
- else:
- machine = 'ppc'
+ import _osx_support
+ osname, release, machine = _osx_support.get_platform_osx(
+ get_config_vars(),
+ osname, release, machine)
return "%s-%s-%s" % (osname, release, machine)
@@ -749,21 +694,27 @@ def get_platform():
def get_python_version():
return _PY_VERSION_SHORT
+
def _print_dict(title, data):
for index, (key, value) in enumerate(sorted(data.items())):
if index == 0:
- print('{0}: '.format(title))
- print('\t{0} = "{1}"'.format(key, value))
+ print('%s: ' % (title))
+ print('\t%s = "%s"' % (key, value))
+
def _main():
"""Display all information sysconfig detains."""
- print('Platform: "{0}"'.format(get_platform()))
- print('Python version: "{0}"'.format(get_python_version()))
- print('Current installation scheme: "{0}"'.format(_get_default_scheme()))
- print('')
+ if '--generate-posix-vars' in sys.argv:
+ _generate_posix_vars()
+ return
+ print('Platform: "%s"' % get_platform())
+ print('Python version: "%s"' % get_python_version())
+ print('Current installation scheme: "%s"' % _get_default_scheme())
+ print()
_print_dict('Paths', get_paths())
- print('')
+ print()
_print_dict('Variables', get_config_vars())
+
if __name__ == '__main__':
_main()
diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py
index 46f8163..4a54f89 100755
--- a/Lib/tabnanny.py
+++ b/Lib/tabnanny.py
@@ -126,6 +126,9 @@ def check(file):
else: print(file, badline, repr(line))
return
+ finally:
+ f.close()
+
if verbose:
print("%r: Clean bill of health." % (file,))
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index f26953e..7b9f407 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -29,8 +29,6 @@
"""Read from and write to tar format archives.
"""
-__version__ = "$Revision$"
-
version = "0.9.0"
__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)"
__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $"
@@ -42,9 +40,9 @@ __credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend."
#---------
import sys
import os
+import io
import shutil
import stat
-import errno
import time
import struct
import copy
@@ -247,8 +245,8 @@ def calc_chksums(buf):
the high bit set. So we calculate two checksums, unsigned and
signed.
"""
- unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512]))
- signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512]))
+ unsigned_chksum = 256 + sum(struct.unpack_from("148B8x356B", buf))
+ signed_chksum = 256 + sum(struct.unpack_from("148b8x356b", buf))
return unsigned_chksum, signed_chksum
def copyfileobj(src, dst, length=None):
@@ -276,47 +274,13 @@ def copyfileobj(src, dst, length=None):
dst.write(buf)
return
-filemode_table = (
- ((S_IFLNK, "l"),
- (S_IFREG, "-"),
- (S_IFBLK, "b"),
- (S_IFDIR, "d"),
- (S_IFCHR, "c"),
- (S_IFIFO, "p")),
-
- ((TUREAD, "r"),),
- ((TUWRITE, "w"),),
- ((TUEXEC|TSUID, "s"),
- (TSUID, "S"),
- (TUEXEC, "x")),
-
- ((TGREAD, "r"),),
- ((TGWRITE, "w"),),
- ((TGEXEC|TSGID, "s"),
- (TSGID, "S"),
- (TGEXEC, "x")),
-
- ((TOREAD, "r"),),
- ((TOWRITE, "w"),),
- ((TOEXEC|TSVTX, "t"),
- (TSVTX, "T"),
- (TOEXEC, "x"))
-)
-
def filemode(mode):
- """Convert a file's mode to a string of the form
- -rwxrwxrwx.
- Used by TarFile.list()
- """
- perm = []
- for table in filemode_table:
- for bit, char in table:
- if mode & bit == bit:
- perm.append(char)
- break
- else:
- perm.append("-")
- return "".join(perm)
+ """Deprecated in this location; use stat.filemode."""
+ import warnings
+ warnings.warn("deprecated in favor of stat.filemode",
+ DeprecationWarning, 2)
+ return stat.filemode(mode)
+
class TarError(Exception):
"""Base exception."""
@@ -423,10 +387,11 @@ class _Stream:
self.crc = zlib.crc32(b"")
if mode == "r":
self._init_read_gz()
+ self.exception = zlib.error
else:
self._init_write_gz()
- if comptype == "bz2":
+ elif comptype == "bz2":
try:
import bz2
except ImportError:
@@ -434,8 +399,25 @@ class _Stream:
if mode == "r":
self.dbuf = b""
self.cmp = bz2.BZ2Decompressor()
+ self.exception = IOError
else:
self.cmp = bz2.BZ2Compressor()
+
+ elif comptype == "xz":
+ try:
+ import lzma
+ except ImportError:
+ raise CompressionError("lzma module is not available")
+ if mode == "r":
+ self.dbuf = b""
+ self.cmp = lzma.LZMADecompressor()
+ self.exception = lzma.LZMAError
+ else:
+ self.cmp = lzma.LZMACompressor()
+
+ elif comptype != "tar":
+ raise CompressionError("unknown compression type %r" % comptype)
+
except:
if not self._extfileobj:
self.fileobj.close()
@@ -587,7 +569,7 @@ class _Stream:
break
try:
buf = self.cmp.decompress(buf)
- except IOError:
+ except self.exception:
raise ReadError("invalid compressed data")
self.dbuf += buf
c += len(buf)
@@ -625,76 +607,19 @@ class _StreamProxy(object):
return self.buf
def getcomptype(self):
- if self.buf.startswith(b"\037\213\010"):
+ if self.buf.startswith(b"\x1f\x8b\x08"):
return "gz"
- if self.buf[0:3] == b"BZh" and self.buf[4:10] == b"1AY&SY":
+ elif self.buf[0:3] == b"BZh" and self.buf[4:10] == b"1AY&SY":
return "bz2"
- return "tar"
+ elif self.buf.startswith((b"\x5d\x00\x00\x80", b"\xfd7zXZ")):
+ return "xz"
+ else:
+ return "tar"
def close(self):
self.fileobj.close()
# class StreamProxy
-class _BZ2Proxy(object):
- """Small proxy class that enables external file object
- support for "r:bz2" and "w:bz2" modes. This is actually
- a workaround for a limitation in bz2 module's BZ2File
- class which (unlike gzip.GzipFile) has no support for
- a file object argument.
- """
-
- blocksize = 16 * 1024
-
- def __init__(self, fileobj, mode):
- self.fileobj = fileobj
- self.mode = mode
- self.name = getattr(self.fileobj, "name", None)
- self.init()
-
- def init(self):
- import bz2
- self.pos = 0
- if self.mode == "r":
- self.bz2obj = bz2.BZ2Decompressor()
- self.fileobj.seek(0)
- self.buf = b""
- else:
- self.bz2obj = bz2.BZ2Compressor()
-
- def read(self, size):
- x = len(self.buf)
- while x < size:
- raw = self.fileobj.read(self.blocksize)
- if not raw:
- break
- data = self.bz2obj.decompress(raw)
- self.buf += data
- x += len(data)
-
- buf = self.buf[:size]
- self.buf = self.buf[size:]
- self.pos += len(buf)
- return buf
-
- def seek(self, pos):
- if pos < self.pos:
- self.init()
- self.read(pos - self.pos)
-
- def tell(self):
- return self.pos
-
- def write(self, data):
- self.pos += len(data)
- raw = self.bz2obj.compress(data)
- self.fileobj.write(raw)
-
- def close(self):
- if self.mode == "w":
- raw = self.bz2obj.flush()
- self.fileobj.write(raw)
-# class _BZ2Proxy
-
#------------------------
# Extraction file object
#------------------------
@@ -709,6 +634,8 @@ class _FileInFile(object):
self.offset = offset
self.size = size
self.position = 0
+ self.name = getattr(fileobj, "name", None)
+ self.closed = False
if blockinfo is None:
blockinfo = [(0, size)]
@@ -727,10 +654,16 @@ class _FileInFile(object):
if lastpos < self.size:
self.map.append((False, lastpos, self.size, None))
+ def flush(self):
+ pass
+
+ def readable(self):
+ return True
+
+ def writable(self):
+ return False
+
def seekable(self):
- if not hasattr(self.fileobj, "seekable"):
- # XXX gzip.GzipFile and bz2.BZ2File
- return True
return self.fileobj.seekable()
def tell(self):
@@ -738,10 +671,21 @@ class _FileInFile(object):
"""
return self.position
- def seek(self, position):
+ def seek(self, position, whence=io.SEEK_SET):
"""Seek to a position in the file.
"""
- self.position = position
+ if whence == io.SEEK_SET:
+ self.position = min(max(position, 0), self.size)
+ elif whence == io.SEEK_CUR:
+ if position < 0:
+ self.position = max(self.position + position, 0)
+ else:
+ self.position = min(self.position + position, self.size)
+ elif whence == io.SEEK_END:
+ self.position = max(min(self.size + position, self.size), 0)
+ else:
+ raise ValueError("Invalid argument")
+ return self.position
def read(self, size=None):
"""Read data from the file.
@@ -770,145 +714,22 @@ class _FileInFile(object):
size -= length
self.position += length
return buf
-#class _FileInFile
-
-
-class ExFileObject(object):
- """File-like object for reading an archive member.
- Is returned by TarFile.extractfile().
- """
- blocksize = 1024
-
- def __init__(self, tarfile, tarinfo):
- self.fileobj = _FileInFile(tarfile.fileobj,
- tarinfo.offset_data,
- tarinfo.size,
- tarinfo.sparse)
- self.name = tarinfo.name
- self.mode = "r"
- self.closed = False
- self.size = tarinfo.size
-
- self.position = 0
- self.buffer = b""
-
- def readable(self):
- return True
-
- def writable(self):
- return False
-
- def seekable(self):
- return self.fileobj.seekable()
-
- def read(self, size=None):
- """Read at most size bytes from the file. If size is not
- present or None, read all data until EOF is reached.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- buf = b""
- if self.buffer:
- if size is None:
- buf = self.buffer
- self.buffer = b""
- else:
- buf = self.buffer[:size]
- self.buffer = self.buffer[size:]
-
- if size is None:
- buf += self.fileobj.read()
- else:
- buf += self.fileobj.read(size - len(buf))
-
- self.position += len(buf)
- return buf
-
- # XXX TextIOWrapper uses the read1() method.
- read1 = read
-
- def readline(self, size=-1):
- """Read one entire line from the file. If size is present
- and non-negative, return a string with at most that
- size, which may be an incomplete line.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- pos = self.buffer.find(b"\n") + 1
- if pos == 0:
- # no newline found.
- while True:
- buf = self.fileobj.read(self.blocksize)
- self.buffer += buf
- if not buf or b"\n" in buf:
- pos = self.buffer.find(b"\n") + 1
- if pos == 0:
- # no newline found.
- pos = len(self.buffer)
- break
-
- if size != -1:
- pos = min(size, pos)
-
- buf = self.buffer[:pos]
- self.buffer = self.buffer[pos:]
- self.position += len(buf)
- return buf
-
- def readlines(self):
- """Return a list with all remaining lines.
- """
- result = []
- while True:
- line = self.readline()
- if not line: break
- result.append(line)
- return result
-
- def tell(self):
- """Return the current file position.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- return self.position
-
- def seek(self, pos, whence=os.SEEK_SET):
- """Seek to a position in the file.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
- if whence == os.SEEK_SET:
- self.position = min(max(pos, 0), self.size)
- elif whence == os.SEEK_CUR:
- if pos < 0:
- self.position = max(self.position + pos, 0)
- else:
- self.position = min(self.position + pos, self.size)
- elif whence == os.SEEK_END:
- self.position = max(min(self.size + pos, self.size), 0)
- else:
- raise ValueError("Invalid argument")
-
- self.buffer = b""
- self.fileobj.seek(self.position)
+ def readinto(self, b):
+ buf = self.read(len(b))
+ b[:len(buf)] = buf
+ return len(buf)
def close(self):
- """Close the file object.
- """
self.closed = True
+#class _FileInFile
- def __iter__(self):
- """Get an iterator over the file's lines.
- """
- while True:
- line = self.readline()
- if not line:
- break
- yield line
+class ExFileObject(io.BufferedReader):
+
+ def __init__(self, tarfile, tarinfo):
+ fileobj = _FileInFile(tarfile.fileobj, tarinfo.offset_data,
+ tarinfo.size, tarinfo.sparse)
+ super().__init__(fileobj)
#class ExFileObject
#------------------
@@ -1087,7 +908,7 @@ class TarInfo(object):
def create_pax_global_header(cls, pax_headers):
"""Return the object as a pax global header block sequence.
"""
- return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8")
+ return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf-8")
def _posix_split_name(self, name):
"""Split a name longer than 100 chars into a prefix
@@ -1170,7 +991,7 @@ class TarInfo(object):
binary = False
for keyword, value in pax_headers.items():
try:
- value.encode("utf8", "strict")
+ value.encode("utf-8", "strict")
except UnicodeEncodeError:
binary = True
break
@@ -1181,13 +1002,13 @@ class TarInfo(object):
records += b"21 hdrcharset=BINARY\n"
for keyword, value in pax_headers.items():
- keyword = keyword.encode("utf8")
+ keyword = keyword.encode("utf-8")
if binary:
# Try to restore the original byte representation of `value'.
# Needless to say, that the encoding must match the string.
value = value.encode(encoding, "surrogateescape")
else:
- value = value.encode("utf8")
+ value = value.encode("utf-8")
l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n'
n = p = 0
@@ -1396,7 +1217,7 @@ class TarInfo(object):
# the translation to UTF-8 fails.
match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf)
if match is not None:
- pax_headers["hdrcharset"] = match.group(1).decode("utf8")
+ pax_headers["hdrcharset"] = match.group(1).decode("utf-8")
# For the time being, we don't care about anything other than "BINARY".
# The only other value that is currently allowed by the standard is
@@ -1405,7 +1226,7 @@ class TarInfo(object):
if hdrcharset == "BINARY":
encoding = tarfile.encoding
else:
- encoding = "utf8"
+ encoding = "utf-8"
# Parse pax header information. A record looks like that:
# "%d %s=%s\n" % (length, keyword, value). length is the size
@@ -1422,20 +1243,20 @@ class TarInfo(object):
length = int(length)
value = buf[match.end(2) + 1:match.start(1) + length - 1]
- # Normally, we could just use "utf8" as the encoding and "strict"
+ # Normally, we could just use "utf-8" as the encoding and "strict"
# as the error handler, but we better not take the risk. For
# example, GNU tar <= 1.23 is known to store filenames it cannot
# translate to UTF-8 as raw strings (unfortunately without a
# hdrcharset=BINARY header).
# We first try the strict standard encoding, and if that fails we
# fall back on the user's encoding and error handler.
- keyword = self._decode_pax_field(keyword, "utf8", "utf8",
+ keyword = self._decode_pax_field(keyword, "utf-8", "utf-8",
tarfile.errors)
if keyword in PAX_NAME_FIELDS:
value = self._decode_pax_field(value, encoding, tarfile.encoding,
tarfile.errors)
else:
- value = self._decode_pax_field(value, "utf8", "utf8",
+ value = self._decode_pax_field(value, "utf-8", "utf-8",
tarfile.errors)
pax_headers[keyword] = value
@@ -1595,7 +1416,7 @@ class TarFile(object):
tarinfo = TarInfo # The default TarInfo class to use.
- fileobject = ExFileObject # The default ExFileObject class to use.
+ fileobject = ExFileObject # The file-object for extractfile().
def __init__(self, name=None, mode="r", fileobj=None, format=None,
tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
@@ -1714,18 +1535,22 @@ class TarFile(object):
'r:' open for reading exclusively uncompressed
'r:gz' open for reading with gzip compression
'r:bz2' open for reading with bzip2 compression
+ 'r:xz' open for reading with lzma compression
'a' or 'a:' open for appending, creating the file if necessary
'w' or 'w:' open for writing without compression
'w:gz' open for writing with gzip compression
'w:bz2' open for writing with bzip2 compression
+ 'w:xz' open for writing with lzma compression
'r|*' open a stream of tar blocks with transparent compression
'r|' open an uncompressed stream of tar blocks for reading
'r|gz' open a gzip compressed stream of tar blocks
'r|bz2' open a bzip2 compressed stream of tar blocks
+ 'r|xz' open an lzma compressed stream of tar blocks
'w|' open an uncompressed stream for writing
'w|gz' open a gzip compressed stream for writing
'w|bz2' open a bzip2 compressed stream for writing
+ 'w|xz' open an lzma compressed stream for writing
"""
if not name and not fileobj:
@@ -1832,10 +1657,8 @@ class TarFile(object):
except ImportError:
raise CompressionError("bz2 module is not available")
- if fileobj is not None:
- fileobj = _BZ2Proxy(fileobj, mode)
- else:
- fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)
+ fileobj = bz2.BZ2File(fileobj or name, mode,
+ compresslevel=compresslevel)
try:
t = cls.taropen(name, mode, fileobj, **kwargs)
@@ -1845,11 +1668,35 @@ class TarFile(object):
t._extfileobj = False
return t
+ @classmethod
+ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
+ """Open lzma compressed tar archive name for reading or writing.
+ Appending is not allowed.
+ """
+ if mode not in ("r", "w"):
+ raise ValueError("mode must be 'r' or 'w'")
+
+ try:
+ import lzma
+ except ImportError:
+ raise CompressionError("lzma module is not available")
+
+ fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset)
+
+ try:
+ t = cls.taropen(name, mode, fileobj, **kwargs)
+ except (lzma.LZMAError, EOFError):
+ fileobj.close()
+ raise ReadError("not an lzma file")
+ t._extfileobj = False
+ return t
+
# All *open() methods are registered here.
OPEN_METH = {
"tar": "taropen", # uncompressed tar
"gz": "gzopen", # gzip compressed tar
- "bz2": "bz2open" # bzip2 compressed tar
+ "bz2": "bz2open", # bzip2 compressed tar
+ "xz": "xzopen" # lzma compressed tar
}
#--------------------------------------------------------------------------
@@ -2009,7 +1856,7 @@ class TarFile(object):
for tarinfo in self:
if verbose:
- print(filemode(tarinfo.mode), end=' ')
+ print(stat.filemode(tarinfo.mode), end=' ')
print("%s/%s" % (tarinfo.uname or tarinfo.uid,
tarinfo.gname or tarinfo.gid), end=' ')
if tarinfo.ischr() or tarinfo.isblk():
@@ -2192,12 +2039,9 @@ class TarFile(object):
def extractfile(self, member):
"""Extract a member from the archive as a file object. `member' may be
- a filename or a TarInfo object. If `member' is a regular file, a
- file-like object is returned. If `member' is a link, a file-like
- object is constructed from the link's target. If `member' is none of
- the above, None is returned.
- The file-like object is read-only and provides the following
- methods: read(), readline(), readlines(), seek() and tell()
+ a filename or a TarInfo object. If `member' is a regular file or a
+ link, an io.BufferedReader object is returned. Otherwise, None is
+ returned.
"""
self._check("r")
@@ -2206,12 +2050,8 @@ class TarFile(object):
else:
tarinfo = member
- if tarinfo.isreg():
- return self.fileobject(self, tarinfo)
-
- elif tarinfo.type not in SUPPORTED_TYPES:
- # If a member's type is unknown, it is treated as a
- # regular file.
+ if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES:
+ # Members with unknown types are treated as regular files.
return self.fileobject(self, tarinfo)
elif tarinfo.islnk() or tarinfo.issym():
@@ -2283,9 +2123,8 @@ class TarFile(object):
# Use a safe mode for the directory, the real mode is set
# later in _extract_member().
os.mkdir(targetpath, 0o700)
- except EnvironmentError as e:
- if e.errno != errno.EEXIST:
- raise
+ except FileExistsError:
+ pass
def makefile(self, tarinfo, targetpath):
"""Make a file called targetpath.
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 34dff30..39ebf5a 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -10,8 +10,6 @@ This module also provides some data items to the user:
TMP_MAX - maximum number of names that will be tried before
giving up.
- template - the default prefix for all temporary names.
- You may change this to control the default prefix.
tempdir - If this is set to a string before the first use of
any routine from this module, it will be considered as
another candidate location to store temporary files.
@@ -33,7 +31,6 @@ import warnings as _warnings
import sys as _sys
import io as _io
import os as _os
-import errno as _errno
from random import Random as _Random
try:
@@ -45,7 +42,7 @@ else:
def _set_cloexec(fd):
try:
flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
- except IOError:
+ except OSError:
pass
else:
# flags read successfully, modify
@@ -74,6 +71,8 @@ if hasattr(_os, 'TMP_MAX'):
else:
TMP_MAX = 10000
+# Although it does not have an underscore for historical reasons, this
+# variable is an internal implementation detail (see issue 10354).
template = "tmp"
# Internal routines.
@@ -85,19 +84,16 @@ if hasattr(_os, "lstat"):
elif hasattr(_os, "stat"):
_stat = _os.stat
else:
- # Fallback. All we need is something that raises os.error if the
+ # Fallback. All we need is something that raises OSError if the
# file doesn't exist.
def _stat(fn):
- try:
- f = open(fn)
- except IOError:
- raise _os.error
+ f = open(fn)
f.close()
def _exists(fn):
try:
_stat(fn)
- except _os.error:
+ except OSError:
return False
else:
return True
@@ -149,7 +145,7 @@ def _candidate_tempdir_list():
# As a last resort, the current directory.
try:
dirlist.append(_os.getcwd())
- except (AttributeError, _os.error):
+ except (AttributeError, OSError):
dirlist.append(_os.curdir)
return dirlist
@@ -181,12 +177,11 @@ def _get_default_tempdir():
_os.unlink(filename)
del fp, fd
return dir
- except (OSError, IOError) as e:
- if e.args[0] != _errno.EEXIST:
- break # no point trying more names in this directory
+ except FileExistsError:
pass
- raise IOError(_errno.ENOENT,
- "No usable temporary directory found in %s" % dirlist)
+ except OSError:
+ break # no point trying more names in this directory
+ raise FileNotFoundError("No usable temporary directory found in %s" % dirlist)
_name_sequence = None
@@ -216,12 +211,10 @@ def _mkstemp_inner(dir, pre, suf, flags):
fd = _os.open(file, flags, 0o600)
_set_cloexec(fd)
return (fd, _os.path.abspath(file))
- except OSError as e:
- if e.errno == _errno.EEXIST:
- continue # try again
- raise
+ except FileExistsError:
+ continue # try again
- raise IOError(_errno.EEXIST, "No usable temporary file name found")
+ raise FileExistsError("No usable temporary file name found")
# User visible interfaces.
@@ -305,12 +298,10 @@ def mkdtemp(suffix="", prefix=template, dir=None):
try:
_os.mkdir(file, 0o700)
return file
- except OSError as e:
- if e.errno == _errno.EEXIST:
- continue # try again
- raise
+ except FileExistsError:
+ continue # try again
- raise IOError(_errno.EEXIST, "No usable temporary directory name found")
+ raise FileExistsError("No usable temporary directory name found")
def mktemp(suffix="", prefix=template, dir=None):
"""User-callable function to return a unique temporary file name. The
@@ -339,7 +330,7 @@ def mktemp(suffix="", prefix=template, dir=None):
if not _exists(file):
return file
- raise IOError(_errno.EEXIST, "No usable temporary filename found")
+ raise FileExistsError("No usable temporary filename found")
class _TemporaryFileWrapper:
@@ -592,8 +583,13 @@ class SpooledTemporaryFile:
def tell(self):
return self._file.tell()
- def truncate(self):
- self._file.truncate()
+ def truncate(self, size=None):
+ if size is None:
+ self._file.truncate()
+ else:
+ if size > self._max_size:
+ self.rollover()
+ self._file.truncate(size)
def write(self, s):
file = self._file
@@ -669,7 +665,7 @@ class TemporaryDirectory(object):
_islink = staticmethod(_os.path.islink)
_remove = staticmethod(_os.remove)
_rmdir = staticmethod(_os.rmdir)
- _os_error = _os.error
+ _os_error = OSError
_warn = _warnings.warn
def _rmtree(self, path):
diff --git a/Lib/test/buffer_tests.py b/Lib/test/buffer_tests.py
index 6d20f7d..cf54c28 100644
--- a/Lib/test/buffer_tests.py
+++ b/Lib/test/buffer_tests.py
@@ -200,7 +200,13 @@ class MixinBytesBufferCommonTests(object):
self.marshal(b'abc\ndef\r\nghi\n\r').splitlines())
self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines())
+ self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
+ self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(False))
+ self.assertEqual([b'\n', b'abc\n', b'def\r\n', b'ghi\n', b'\r'],
+ self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(True))
+ self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
+ self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(keepends=False))
self.assertEqual([b'\n', b'abc\n', b'def\r\n', b'ghi\n', b'\r'],
- self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(1))
+ self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(keepends=True))
self.assertRaises(TypeError, self.marshal(b'abc').splitlines, 42, 42)
diff --git a/Lib/test/crashers/README b/Lib/test/crashers/README
index 2a73e1b..0259a06 100644
--- a/Lib/test/crashers/README
+++ b/Lib/test/crashers/README
@@ -14,3 +14,7 @@ note if the cause is system or environment dependent and what the variables are.
Once the crash is fixed, the test case should be moved into an appropriate test
(even if it was originally from the test suite). This ensures the regression
doesn't happen again. And if it does, it should be easier to track down.
+
+Also see Lib/test_crashers.py which exercises the crashers in this directory.
+In particular, make sure to add any new infinite loop crashers to the black
+list so it doesn't try to run them.
diff --git a/Lib/test/crashers/borrowed_ref_1.py b/Lib/test/crashers/borrowed_ref_1.py
deleted file mode 100644
index b82f464..0000000
--- a/Lib/test/crashers/borrowed_ref_1.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""
-_PyType_Lookup() returns a borrowed reference.
-This attacks the call in dictobject.c.
-"""
-
-class A(object):
- pass
-
-class B(object):
- def __del__(self):
- print('hi')
- del D.__missing__
-
-class D(dict):
- class __missing__:
- def __init__(self, *args):
- pass
-
-
-d = D()
-a = A()
-a.cycle = a
-a.other = B()
-del a
-
-prev = None
-while 1:
- d[5]
- prev = (prev,)
diff --git a/Lib/test/crashers/borrowed_ref_2.py b/Lib/test/crashers/borrowed_ref_2.py
deleted file mode 100644
index 6e403eb..0000000
--- a/Lib/test/crashers/borrowed_ref_2.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-_PyType_Lookup() returns a borrowed reference.
-This attacks PyObject_GenericSetAttr().
-
-NB. on my machine this crashes in 2.5 debug but not release.
-"""
-
-class A(object):
- pass
-
-class B(object):
- def __del__(self):
- print("hi")
- del C.d
-
-class D(object):
- def __set__(self, obj, value):
- self.hello = 42
-
-class C(object):
- d = D()
-
- def g():
- pass
-
-
-c = C()
-a = A()
-a.cycle = a
-a.other = B()
-
-lst = [None] * 1000000
-i = 0
-del a
-while 1:
- c.d = 42 # segfaults in PyMethod_New(__func__=D.__set__, __self__=d)
- lst[i] = c.g # consume the free list of instancemethod objects
- i += 1
diff --git a/Lib/test/crashers/compiler_recursion.py b/Lib/test/crashers/compiler_recursion.py
deleted file mode 100644
index 4954bdd..0000000
--- a/Lib/test/crashers/compiler_recursion.py
+++ /dev/null
@@ -1,5 +0,0 @@
-"""
-The compiler (>= 2.5) recurses happily.
-"""
-
-compile('()'*9**5, '?', 'exec')
diff --git a/Lib/test/crashers/loosing_mro_ref.py b/Lib/test/crashers/loosing_mro_ref.py
deleted file mode 100644
index b3bcd32..0000000
--- a/Lib/test/crashers/loosing_mro_ref.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""
-There is a way to put keys of any type in a type's dictionary.
-I think this allows various kinds of crashes, but so far I have only
-found a convoluted attack of _PyType_Lookup(), which uses the mro of the
-type without holding a strong reference to it. Probably works with
-super.__getattribute__() too, which uses the same kind of code.
-"""
-
-class MyKey(object):
- def __hash__(self):
- return hash('mykey')
-
- def __eq__(self, other):
- # the following line decrefs the previous X.__mro__
- X.__bases__ = (Base2,)
- # trash all tuples of length 3, to make sure that the items of
- # the previous X.__mro__ are really garbage
- z = []
- for i in range(1000):
- z.append((i, None, None))
- return 0
-
-
-class Base(object):
- mykey = 'from Base'
-
-class Base2(object):
- mykey = 'from Base2'
-
-# you can't add a non-string key to X.__dict__, but it can be
-# there from the beginning :-)
-X = type('X', (Base,), {MyKey(): 5})
-
-print(X.mykey)
-# I get a segfault, or a slightly wrong assertion error in a debug build.
diff --git a/Lib/test/crashers/nasty_eq_vs_dict.py b/Lib/test/crashers/nasty_eq_vs_dict.py
deleted file mode 100644
index 85f7caf..0000000
--- a/Lib/test/crashers/nasty_eq_vs_dict.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html
-
-# if you keep changing a dictionary while looking up a key, you can
-# provoke an infinite recursion in C
-
-# At the time neither Tim nor Michael could be bothered to think of a
-# way to fix it.
-
-class Yuck:
- def __init__(self):
- self.i = 0
-
- def make_dangerous(self):
- self.i = 1
-
- def __hash__(self):
- # direct to slot 4 in table of size 8; slot 12 when size 16
- return 4 + 8
-
- def __eq__(self, other):
- if self.i == 0:
- # leave dict alone
- pass
- elif self.i == 1:
- # fiddle to 16 slots
- self.__fill_dict(6)
- self.i = 2
- else:
- # fiddle to 8 slots
- self.__fill_dict(4)
- self.i = 1
-
- return 1
-
- def __fill_dict(self, n):
- self.i = 0
- dict.clear()
- for i in range(n):
- dict[i] = i
- dict[self] = "OK!"
-
-y = Yuck()
-dict = {y: "OK!"}
-
-z = Yuck()
-y.make_dangerous()
-print(dict[z])
diff --git a/Lib/test/crashers/recursion_limit_too_high.py b/Lib/test/crashers/recursion_limit_too_high.py
deleted file mode 100644
index ec64936..0000000
--- a/Lib/test/crashers/recursion_limit_too_high.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# The following example may crash or not depending on the platform.
-# E.g. on 32-bit Intel Linux in a "standard" configuration it seems to
-# crash on Python 2.5 (but not 2.4 nor 2.3). On Windows the import
-# eventually fails to find the module, possibly because we run out of
-# file handles.
-
-# The point of this example is to show that sys.setrecursionlimit() is a
-# hack, and not a robust solution. This example simply exercises a path
-# where it takes many C-level recursions, consuming a lot of stack
-# space, for each Python-level recursion. So 1000 times this amount of
-# stack space may be too much for standard platforms already.
-
-import sys
-if 'recursion_limit_too_high' in sys.modules:
- del sys.modules['recursion_limit_too_high']
-import recursion_limit_too_high
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index bb18630..931ef6f 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -979,7 +979,7 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
# exempt such platforms (provided they return reasonable
# results!).
for insane in -1e200, 1e200:
- self.assertRaises(ValueError, self.theclass.fromtimestamp,
+ self.assertRaises(OverflowError, self.theclass.fromtimestamp,
insane)
def test_today(self):
@@ -1291,12 +1291,18 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
self.assertTrue(self.theclass.min)
self.assertTrue(self.theclass.max)
- def test_strftime_out_of_range(self):
- # For nasty technical reasons, we can't handle years before 1000.
- cls = self.theclass
- self.assertEqual(cls(1000, 1, 1).strftime("%Y"), "1000")
- for y in 1, 49, 51, 99, 100, 999:
- self.assertRaises(ValueError, cls(y, 1, 1).strftime, "%Y")
+ def test_strftime_y2k(self):
+ for y in (1, 49, 70, 99, 100, 999, 1000, 1970):
+ d = self.theclass(y, 1, 1)
+ # Issue 13305: For years < 1000, the value is not always
+ # padded to 4 digits across platforms. The C standard
+ # assumes year >= 1900, so it does not specify the number
+ # of digits.
+ if d.strftime("%Y") != '%04d' % y:
+ # Year 42 returns '42', not padded
+ self.assertEqual(d.strftime("%Y"), '%d' % y)
+ # '0042' is obtained anyway
+ self.assertEqual(d.strftime("%4Y"), '%04d' % y)
def test_replace(self):
cls = self.theclass
@@ -1731,13 +1737,74 @@ class TestDateTime(TestDate):
got = self.theclass.utcfromtimestamp(ts)
self.verify_field_equality(expected, got)
+ # Run with US-style DST rules: DST begins 2 a.m. on second Sunday in
+ # March (M3.2.0) and ends 2 a.m. on first Sunday in November (M11.1.0).
+ @support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
+ def test_timestamp_naive(self):
+ t = self.theclass(1970, 1, 1)
+ self.assertEqual(t.timestamp(), 18000.0)
+ t = self.theclass(1970, 1, 1, 1, 2, 3, 4)
+ self.assertEqual(t.timestamp(),
+ 18000.0 + 3600 + 2*60 + 3 + 4*1e-6)
+ # Missing hour may produce platform-dependent result
+ t = self.theclass(2012, 3, 11, 2, 30)
+ self.assertIn(self.theclass.fromtimestamp(t.timestamp()),
+ [t - timedelta(hours=1), t + timedelta(hours=1)])
+ # Ambiguous hour defaults to DST
+ t = self.theclass(2012, 11, 4, 1, 30)
+ self.assertEqual(self.theclass.fromtimestamp(t.timestamp()), t)
+
+ # Timestamp may raise an overflow error on some platforms
+ for t in [self.theclass(1,1,1), self.theclass(9999,12,12)]:
+ try:
+ s = t.timestamp()
+ except OverflowError:
+ pass
+ else:
+ self.assertEqual(self.theclass.fromtimestamp(s), t)
+
+ def test_timestamp_aware(self):
+ t = self.theclass(1970, 1, 1, tzinfo=timezone.utc)
+ self.assertEqual(t.timestamp(), 0.0)
+ t = self.theclass(1970, 1, 1, 1, 2, 3, 4, tzinfo=timezone.utc)
+ self.assertEqual(t.timestamp(),
+ 3600 + 2*60 + 3 + 4*1e-6)
+ t = self.theclass(1970, 1, 1, 1, 2, 3, 4,
+ tzinfo=timezone(timedelta(hours=-5), 'EST'))
+ self.assertEqual(t.timestamp(),
+ 18000 + 3600 + 2*60 + 3 + 4*1e-6)
def test_microsecond_rounding(self):
- # Test whether fromtimestamp "rounds up" floats that are less
- # than 1/2 microsecond smaller than an integer.
for fts in [self.theclass.fromtimestamp,
self.theclass.utcfromtimestamp]:
- self.assertEqual(fts(0.9999999), fts(1))
- self.assertEqual(fts(0.99999949).microsecond, 999999)
+ zero = fts(0)
+ self.assertEqual(zero.second, 0)
+ self.assertEqual(zero.microsecond, 0)
+ try:
+ minus_one = fts(-1e-6)
+ except OSError:
+ # localtime(-1) and gmtime(-1) is not supported on Windows
+ pass
+ else:
+ self.assertEqual(minus_one.second, 59)
+ self.assertEqual(minus_one.microsecond, 999999)
+
+ t = fts(-1e-8)
+ self.assertEqual(t, minus_one)
+ t = fts(-9e-7)
+ self.assertEqual(t, minus_one)
+ t = fts(-1e-7)
+ self.assertEqual(t, minus_one)
+
+ t = fts(1e-7)
+ self.assertEqual(t, zero)
+ t = fts(9e-7)
+ self.assertEqual(t, zero)
+ t = fts(0.99999949)
+ self.assertEqual(t.second, 0)
+ self.assertEqual(t.microsecond, 999999)
+ t = fts(0.9999999)
+ self.assertEqual(t.second, 0)
+ self.assertEqual(t.microsecond, 999999)
def test_insane_fromtimestamp(self):
# It's possible that some platform maps time_t to double,
@@ -1745,7 +1812,7 @@ class TestDateTime(TestDate):
# exempt such platforms (provided they return reasonable
# results!).
for insane in -1e200, 1e200:
- self.assertRaises(ValueError, self.theclass.fromtimestamp,
+ self.assertRaises(OverflowError, self.theclass.fromtimestamp,
insane)
def test_insane_utcfromtimestamp(self):
@@ -1754,7 +1821,7 @@ class TestDateTime(TestDate):
# exempt such platforms (provided they return reasonable
# results!).
for insane in -1e200, 1e200:
- self.assertRaises(ValueError, self.theclass.utcfromtimestamp,
+ self.assertRaises(OverflowError, self.theclass.utcfromtimestamp,
insane)
@unittest.skipIf(sys.platform == "win32", "Windows doesn't accept negative timestamps")
def test_negative_float_fromtimestamp(self):
@@ -1907,7 +1974,7 @@ class TestDateTime(TestDate):
# simply can't be applied to a naive object.
dt = self.theclass.now()
f = FixedOffset(44, "")
- self.assertRaises(TypeError, dt.astimezone) # not enough args
+ self.assertRaises(ValueError, dt.astimezone) # naive
self.assertRaises(TypeError, dt.astimezone, f, f) # too many args
self.assertRaises(TypeError, dt.astimezone, dt) # arg wrong type
self.assertRaises(ValueError, dt.astimezone, f) # naive
@@ -2479,7 +2546,7 @@ class TestTimeTZ(TestTime, TZInfoBase, unittest.TestCase):
self.assertEqual(t1, t2)
self.assertEqual(t1, t3)
self.assertEqual(t2, t3)
- self.assertRaises(TypeError, lambda: t4 == t5) # mixed tz-aware & naive
+ self.assertNotEqual(t4, t5) # mixed tz-aware & naive
self.assertRaises(TypeError, lambda: t4 < t5) # mixed tz-aware & naive
self.assertRaises(TypeError, lambda: t5 < t4) # mixed tz-aware & naive
@@ -2631,7 +2698,7 @@ class TestTimeTZ(TestTime, TZInfoBase, unittest.TestCase):
t2 = t2.replace(tzinfo=FixedOffset(None, ""))
self.assertEqual(t1, t2)
t2 = t2.replace(tzinfo=FixedOffset(0, ""))
- self.assertRaises(TypeError, lambda: t1 == t2)
+ self.assertNotEqual(t1, t2)
# In time w/ identical tzinfo objects, utcoffset is ignored.
class Varies(tzinfo):
@@ -2736,16 +2803,16 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
microsecond=1)
self.assertTrue(t1 > t2)
- # Make t2 naive and it should fail.
+ # Make t2 naive and it should differ.
t2 = self.theclass.min
- self.assertRaises(TypeError, lambda: t1 == t2)
+ self.assertNotEqual(t1, t2)
self.assertEqual(t2, t2)
# It's also naive if it has tzinfo but tzinfo.utcoffset() is None.
class Naive(tzinfo):
def utcoffset(self, dt): return None
t2 = self.theclass(5, 6, 7, tzinfo=Naive())
- self.assertRaises(TypeError, lambda: t1 == t2)
+ self.assertNotEqual(t1, t2)
self.assertEqual(t2, t2)
# OTOH, it's OK to compare two of these mixing the two ways of being
@@ -3188,8 +3255,6 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
self.assertTrue(dt.tzinfo is f44m)
# Replacing with degenerate tzinfo raises an exception.
self.assertRaises(ValueError, dt.astimezone, fnone)
- # Ditto with None tz.
- self.assertRaises(TypeError, dt.astimezone, None)
# Replacing with same tzinfo makes no change.
x = dt.astimezone(dt.tzinfo)
self.assertTrue(x.tzinfo is f44m)
@@ -3209,6 +3274,25 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
self.assertTrue(got.tzinfo is expected.tzinfo)
self.assertEqual(got, expected)
+ @support.run_with_tz('UTC')
+ def test_astimezone_default_utc(self):
+ dt = self.theclass.now(timezone.utc)
+ self.assertEqual(dt.astimezone(None), dt)
+ self.assertEqual(dt.astimezone(), dt)
+
+ # Note that offset in TZ variable has the opposite sign to that
+ # produced by %z directive.
+ @support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
+ def test_astimezone_default_eastern(self):
+ dt = self.theclass(2012, 11, 4, 6, 30, tzinfo=timezone.utc)
+ local = dt.astimezone()
+ self.assertEqual(dt, local)
+ self.assertEqual(local.strftime("%z %Z"), "-0500 EST")
+ dt = self.theclass(2012, 11, 4, 5, 30, tzinfo=timezone.utc)
+ local = dt.astimezone()
+ self.assertEqual(dt, local)
+ self.assertEqual(local.strftime("%z %Z"), "-0400 EDT")
+
def test_aware_subtract(self):
cls = self.theclass
@@ -3262,7 +3346,7 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
t2 = t2.replace(tzinfo=FixedOffset(None, ""))
self.assertEqual(t1, t2)
t2 = t2.replace(tzinfo=FixedOffset(0, ""))
- self.assertRaises(TypeError, lambda: t1 == t2)
+ self.assertNotEqual(t1, t2)
# In datetime w/ identical tzinfo objects, utcoffset is ignored.
class Varies(tzinfo):
diff --git a/Lib/test/decimaltestdata/extra.decTest b/Lib/test/decimaltestdata/extra.decTest
index fe8b77a..b630d8e 100644
--- a/Lib/test/decimaltestdata/extra.decTest
+++ b/Lib/test/decimaltestdata/extra.decTest
@@ -222,12 +222,25 @@ extr1700 power 10 1e-999999999 -> 1.000000000000000 Inexact Rounded
extr1701 power 100.0 -557.71e-742888888 -> 1.000000000000000 Inexact Rounded
extr1702 power 10 1e-100 -> 1.000000000000000 Inexact Rounded
+-- Another one (see issue #12080). Thanks again to Stefan Krah.
+extr1703 power 4 -1.2e-999999999 -> 1.000000000000000 Inexact Rounded
+
-- A couple of interesting exact cases for power. Note that the specification
-- requires these to be reported as Inexact.
extr1710 power 1e375 56e-3 -> 1.000000000000000E+21 Inexact Rounded
extr1711 power 10000 0.75 -> 1000.000000000000 Inexact Rounded
extr1712 power 1e-24 0.875 -> 1.000000000000000E-21 Inexact Rounded
+-- Some more exact cases, exercising power with negative second argument.
+extr1720 power 400 -0.5 -> 0.05000000000000000 Inexact Rounded
+extr1721 power 4096 -0.75 -> 0.001953125000000000 Inexact Rounded
+extr1722 power 625e4 -0.25 -> 0.02000000000000000 Inexact Rounded
+
+-- Nonexact cases, to exercise some of the early exit conditions from
+-- _power_exact.
+extr1730 power 2048 -0.75 -> 0.003284751622084822 Inexact Rounded
+
+
-- Tests for the is_* boolean operations
precision: 9
maxExponent: 999
diff --git a/Lib/test/dh512.pem b/Lib/test/dh512.pem
new file mode 100644
index 0000000..200d16c
--- /dev/null
+++ b/Lib/test/dh512.pem
@@ -0,0 +1,9 @@
+-----BEGIN DH PARAMETERS-----
+MEYCQQD1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak
+XUGfnHy9iUsiGSa6q6Jew1XpKgVfAgEC
+-----END DH PARAMETERS-----
+
+These are the 512 bit DH parameters from "Assigned Number for SKIP Protocols"
+(http://www.skip-vpn.org/spec/numbers.html).
+See there for how they were generated.
+Note that g is not a generator, but this is not a problem since p is a safe prime.
diff --git a/Lib/test/exception_hierarchy.txt b/Lib/test/exception_hierarchy.txt
index 5037b33..1c1f69f 100644
--- a/Lib/test/exception_hierarchy.txt
+++ b/Lib/test/exception_hierarchy.txt
@@ -11,11 +11,6 @@ BaseException
+-- AssertionError
+-- AttributeError
+-- BufferError
- +-- EnvironmentError
- | +-- IOError
- | +-- OSError
- | +-- WindowsError (Windows)
- | +-- VMSError (VMS)
+-- EOFError
+-- ImportError
+-- LookupError
@@ -24,6 +19,22 @@ BaseException
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+ +-- OSError
+ | +-- BlockingIOError
+ | +-- ChildProcessError
+ | +-- ConnectionError
+ | | +-- BrokenPipeError
+ | | +-- ConnectionAbortedError
+ | | +-- ConnectionRefusedError
+ | | +-- ConnectionResetError
+ | +-- FileExistsError
+ | +-- FileNotFoundError
+ | +-- InterruptedError
+ | +-- IsADirectoryError
+ | +-- NotADirectoryError
+ | +-- PermissionError
+ | +-- ProcessLookupError
+ | +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
diff --git a/Lib/test/fork_wait.py b/Lib/test/fork_wait.py
index 1caab1c..88527df 100644
--- a/Lib/test/fork_wait.py
+++ b/Lib/test/fork_wait.py
@@ -43,6 +43,7 @@ class ForkWait(unittest.TestCase):
self.assertEqual(spid, cpid)
self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))
+ @support.reap_threads
def test_wait(self):
for i in range(NUM_THREADS):
_thread.start_new(self.f, (i,))
@@ -69,7 +70,8 @@ class ForkWait(unittest.TestCase):
os._exit(n)
else:
# Parent
- self.wait_impl(cpid)
- # Tell threads to die
- self.stop = 1
- time.sleep(2*SHORTSLEEP) # Wait for threads to die
+ try:
+ self.wait_impl(cpid)
+ finally:
+ # Tell threads to die
+ self.stop = 1
diff --git a/Lib/test/test_future1.py b/Lib/test/future_test1.py
index 297c2e0..297c2e0 100644
--- a/Lib/test/test_future1.py
+++ b/Lib/test/future_test1.py
diff --git a/Lib/test/test_future2.py b/Lib/test/future_test2.py
index 3d7fc86..3d7fc86 100644
--- a/Lib/test/test_future2.py
+++ b/Lib/test/future_test2.py
diff --git a/Lib/test/json_tests/test_dump.py b/Lib/test/json_tests/test_dump.py
index fee972e..237ee35 100644
--- a/Lib/test/json_tests/test_dump.py
+++ b/Lib/test/json_tests/test_dump.py
@@ -1,6 +1,7 @@
from io import StringIO
from test.json_tests import PyTest, CTest
+from test.support import bigmemtest, _1G
class TestDump:
def test_dump(self):
@@ -29,4 +30,20 @@ class TestDump:
class TestPyDump(TestDump, PyTest): pass
-class TestCDump(TestDump, CTest): pass
+
+class TestCDump(TestDump, CTest):
+
+ # The size requirement here is hopefully over-estimated (actual
+ # memory consumption depending on implementation details, and also
+ # system memory management, since this may allocate a lot of
+ # small objects).
+
+ @bigmemtest(size=_1G, memuse=1)
+ def test_large_list(self, size):
+ N = int(30 * 1024 * 1024 * (size / _1G))
+ l = [1] * N
+ encoded = self.dumps(l)
+ self.assertEqual(len(encoded), N * 3)
+ self.assertEqual(encoded[:1], "[")
+ self.assertEqual(encoded[-2:], "1]")
+ self.assertEqual(encoded[1:-2], "1, " * (N - 1))
diff --git a/Lib/test/json_tests/test_scanstring.py b/Lib/test/json_tests/test_scanstring.py
index f82cdee..426c8dd 100644
--- a/Lib/test/json_tests/test_scanstring.py
+++ b/Lib/test/json_tests/test_scanstring.py
@@ -9,14 +9,9 @@ class TestScanstring:
scanstring('"z\\ud834\\udd20x"', 1, True),
('z\U0001d120x', 16))
- if sys.maxunicode == 65535:
- self.assertEqual(
- scanstring('"z\U0001d120x"', 1, True),
- ('z\U0001d120x', 6))
- else:
- self.assertEqual(
- scanstring('"z\U0001d120x"', 1, True),
- ('z\U0001d120x', 5))
+ self.assertEqual(
+ scanstring('"z\U0001d120x"', 1, True),
+ ('z\U0001d120x', 5))
self.assertEqual(
scanstring('"\\u007b"', 1, True),
diff --git a/Lib/test/keycert.passwd.pem b/Lib/test/keycert.passwd.pem
new file mode 100644
index 0000000..e905748
--- /dev/null
+++ b/Lib/test/keycert.passwd.pem
@@ -0,0 +1,33 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,1A8D9D2A02EC698A
+
+kJYbfZ8L0sfe9Oty3gw0aloNnY5E8fegRfQLZlNoxTl6jNt0nIwI8kDJ36CZgR9c
+u3FDJm/KqrfUoz8vW+qEnWhSG7QPX2wWGPHd4K94Yz/FgrRzZ0DoK7XxXq9gOtVA
+AVGQhnz32p+6WhfGsCr9ArXEwRZrTk/FvzEPaU5fHcoSkrNVAGX8IpSVkSDwEDQr
+Gv17+cfk99UV1OCza6yKHoFkTtrC+PZU71LomBabivS2Oc4B9hYuSR2hF01wTHP+
+YlWNagZOOVtNz4oKK9x9eNQpmfQXQvPPTfusexKIbKfZrMvJoxcm1gfcZ0H/wK6P
+6wmXSG35qMOOztCZNtperjs1wzEBXznyK8QmLcAJBjkfarABJX9vBEzZV0OUKhy+
+noORFwHTllphbmydLhu6ehLUZMHPhzAS5UN7srtpSN81eerDMy0RMUAwA7/PofX1
+94Me85Q8jP0PC9ETdsJcPqLzAPETEYu0ELewKRcrdyWi+tlLFrpE5KT/s5ecbl9l
+7B61U4Kfd1PIXc/siINhU3A3bYK+845YyUArUOnKf1kEox7p1RpD7yFqVT04lRTo
+cibNKATBusXSuBrp2G6GNuhWEOSafWCKJQAzgCYIp6ZTV2khhMUGppc/2H3CF6cO
+zX0KtlPVZC7hLkB6HT8SxYUwF1zqWY7+/XPPdc37MeEZ87Q3UuZwqORLY+Z0hpgt
+L5JXBCoklZhCAaN2GqwFLXtGiRSRFGY7xXIhbDTlE65Wv1WGGgDLMKGE1gOz3yAo
+2jjG1+yAHJUdE69XTFHSqSkvaloA1W03LdMXZ9VuQJ/ySXCie6ABAQ==
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV
+BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u
+IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw
+MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH
+Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k
+YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7
+6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt
+pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw
+FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd
+BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G
+lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1
+CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX
+-----END CERTIFICATE-----
diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py
index be054ea..42e118b 100644
--- a/Lib/test/list_tests.py
+++ b/Lib/test/list_tests.py
@@ -418,6 +418,47 @@ class CommonTest(seq_tests.CommonTest):
self.assertRaises(TypeError, u.reverse, 42)
+ def test_clear(self):
+ u = self.type2test([2, 3, 4])
+ u.clear()
+ self.assertEqual(u, [])
+
+ u = self.type2test([])
+ u.clear()
+ self.assertEqual(u, [])
+
+ u = self.type2test([])
+ u.append(1)
+ u.clear()
+ u.append(2)
+ self.assertEqual(u, [2])
+
+ self.assertRaises(TypeError, u.clear, None)
+
+ def test_copy(self):
+ u = self.type2test([1, 2, 3])
+ v = u.copy()
+ self.assertEqual(v, [1, 2, 3])
+
+ u = self.type2test([])
+ v = u.copy()
+ self.assertEqual(v, [])
+
+ # test that it's indeed a copy and not a reference
+ u = self.type2test(['a', 'b'])
+ v = u.copy()
+ v.append('i')
+ self.assertEqual(u, ['a', 'b'])
+ self.assertEqual(v, u + ['i'])
+
+ # test that it's a shallow, not a deep copy
+ u = self.type2test([1, 2, [3, 4], 5])
+ v = u.copy()
+ self.assertEqual(u, v)
+ self.assertIs(v[3], u[3])
+
+ self.assertRaises(TypeError, u.copy, None)
+
def test_sort(self):
u = self.type2test([1, 0])
u.sort()
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py
index 094cc7a..bfbf44e 100644
--- a/Lib/test/lock_tests.py
+++ b/Lib/test/lock_tests.py
@@ -4,7 +4,7 @@ Various tests for synchronization primitives.
import sys
import time
-from _thread import start_new_thread, get_ident, TIMEOUT_MAX
+from _thread import start_new_thread, TIMEOUT_MAX
import threading
import unittest
@@ -31,7 +31,7 @@ class Bunch(object):
self.finished = []
self._can_exit = not wait_before_exit
def task():
- tid = get_ident()
+ tid = threading.get_ident()
self.started.append(tid)
try:
f()
@@ -255,6 +255,18 @@ class RLockTests(BaseLockTests):
lock.release()
self.assertRaises(RuntimeError, lock.release)
+ def test_release_save_unacquired(self):
+ # Cannot _release_save an unacquired lock
+ lock = self.locktype()
+ self.assertRaises(RuntimeError, lock._release_save)
+ lock.acquire()
+ lock.acquire()
+ lock.release()
+ lock.acquire()
+ lock.release()
+ lock.release()
+ self.assertRaises(RuntimeError, lock._release_save)
+
def test_different_thread(self):
# Cannot release from a different thread
lock = self.locktype()
diff --git a/Lib/test/mailcap.txt b/Lib/test/mailcap.txt
new file mode 100644
index 0000000..f61135d
--- /dev/null
+++ b/Lib/test/mailcap.txt
@@ -0,0 +1,39 @@
+# Mailcap file for test_mailcap; based on RFC 1524
+# Referred to by test_mailcap.py
+
+#
+# This is a comment.
+#
+
+application/frame; showframe %s; print="cat %s | lp"
+application/postscript; ps-to-terminal %s;\
+ needsterminal
+application/postscript; ps-to-terminal %s; \
+ compose=idraw %s
+application/x-dvi; xdvi %s
+application/x-movie; movieplayer %s; compose=moviemaker %s; \
+ description="Movie"; \
+ x11-bitmap="/usr/lib/Zmail/bitmaps/movie.xbm"
+application/*; echo "This is \"%t\" but \
+ is 50 \% Greek to me" \; cat %s; copiousoutput
+
+audio/basic; showaudio %s; compose=audiocompose %s; edit=audiocompose %s;\
+description="An audio fragment"
+audio/* ; /usr/local/bin/showaudio %t
+
+image/rgb; display %s
+#image/gif; display %s
+image/x-xwindowdump; display %s
+
+# The continuation char shouldn't \
+# make a difference in a comment.
+
+message/external-body; showexternal %s %{access-type} %{name} %{site} \
+ %{directory} %{mode} %{server}; needsterminal; composetyped = extcompose %s; \
+ description="A reference to data stored in an external location"
+
+text/richtext; shownonascii iso-8859-8 -e richtext -p %s; test=test "`echo \
+ %{charset} | tr '[A-Z]' '[a-z]'`" = iso-8859-8; copiousoutput
+
+video/mpeg; mpeg_play %s
+video/*; animate %s
diff --git a/Lib/test/math_testcases.txt b/Lib/test/math_testcases.txt
index 5e24335..9585188 100644
--- a/Lib/test/math_testcases.txt
+++ b/Lib/test/math_testcases.txt
@@ -517,3 +517,117 @@ expm10306 expm1 1.79e308 -> inf overflow
-- weaker version of expm10302
expm10307 expm1 709.5 -> 1.3549863193146328e+308
+
+-------------------------
+-- log2: log to base 2 --
+-------------------------
+
+-- special values
+log20000 log2 0.0 -> -inf divide-by-zero
+log20001 log2 -0.0 -> -inf divide-by-zero
+log20002 log2 inf -> inf
+log20003 log2 -inf -> nan invalid
+log20004 log2 nan -> nan
+
+-- exact value at 1.0
+log20010 log2 1.0 -> 0.0
+
+-- negatives
+log20020 log2 -5e-324 -> nan invalid
+log20021 log2 -1.0 -> nan invalid
+log20022 log2 -1.7e-308 -> nan invalid
+
+-- exact values at powers of 2
+log20100 log2 2.0 -> 1.0
+log20101 log2 4.0 -> 2.0
+log20102 log2 8.0 -> 3.0
+log20103 log2 16.0 -> 4.0
+log20104 log2 32.0 -> 5.0
+log20105 log2 64.0 -> 6.0
+log20106 log2 128.0 -> 7.0
+log20107 log2 256.0 -> 8.0
+log20108 log2 512.0 -> 9.0
+log20109 log2 1024.0 -> 10.0
+log20110 log2 2048.0 -> 11.0
+
+log20200 log2 0.5 -> -1.0
+log20201 log2 0.25 -> -2.0
+log20202 log2 0.125 -> -3.0
+log20203 log2 0.0625 -> -4.0
+
+-- values close to 1.0
+log20300 log2 1.0000000000000002 -> 3.2034265038149171e-16
+log20301 log2 1.0000000001 -> 1.4426951601859516e-10
+log20302 log2 1.00001 -> 1.4426878274712997e-5
+
+log20310 log2 0.9999999999999999 -> -1.6017132519074588e-16
+log20311 log2 0.9999999999 -> -1.4426951603302210e-10
+log20312 log2 0.99999 -> -1.4427022544056922e-5
+
+-- tiny values
+log20400 log2 5e-324 -> -1074.0
+log20401 log2 1e-323 -> -1073.0
+log20402 log2 1.5e-323 -> -1072.4150374992789
+log20403 log2 2e-323 -> -1072.0
+
+log20410 log2 1e-308 -> -1023.1538532253076
+log20411 log2 2.2250738585072014e-308 -> -1022.0
+log20412 log2 4.4501477170144028e-308 -> -1021.0
+log20413 log2 1e-307 -> -1019.8319251304202
+
+-- huge values
+log20500 log2 1.7976931348623157e+308 -> 1024.0
+log20501 log2 1.7e+308 -> 1023.9193879716706
+log20502 log2 8.9884656743115795e+307 -> 1023.0
+
+-- selection of random values
+log20600 log2 -7.2174324841039838e+289 -> nan invalid
+log20601 log2 -2.861319734089617e+265 -> nan invalid
+log20602 log2 -4.3507646894008962e+257 -> nan invalid
+log20603 log2 -6.6717265307520224e+234 -> nan invalid
+log20604 log2 -3.9118023786619294e+229 -> nan invalid
+log20605 log2 -1.5478221302505161e+206 -> nan invalid
+log20606 log2 -1.4380485131364602e+200 -> nan invalid
+log20607 log2 -3.7235198730382645e+185 -> nan invalid
+log20608 log2 -1.0472242235095724e+184 -> nan invalid
+log20609 log2 -5.0141781956163884e+160 -> nan invalid
+log20610 log2 -2.1157958031160324e+124 -> nan invalid
+log20611 log2 -7.9677558612567718e+90 -> nan invalid
+log20612 log2 -5.5553906194063732e+45 -> nan invalid
+log20613 log2 -16573900952607.953 -> nan invalid
+log20614 log2 -37198371019.888618 -> nan invalid
+log20615 log2 -6.0727115121422674e-32 -> nan invalid
+log20616 log2 -2.5406841656526057e-38 -> nan invalid
+log20617 log2 -4.9056766703267657e-43 -> nan invalid
+log20618 log2 -2.1646786075228305e-71 -> nan invalid
+log20619 log2 -2.470826790488573e-78 -> nan invalid
+log20620 log2 -3.8661709303489064e-165 -> nan invalid
+log20621 log2 -1.0516496976649986e-182 -> nan invalid
+log20622 log2 -1.5935458614317996e-255 -> nan invalid
+log20623 log2 -2.8750977267336654e-293 -> nan invalid
+log20624 log2 -7.6079466794732585e-296 -> nan invalid
+log20625 log2 3.2073253539988545e-307 -> -1018.1505544209213
+log20626 log2 1.674937885472249e-244 -> -809.80634755783126
+log20627 log2 1.0911259044931283e-214 -> -710.76679472274213
+log20628 log2 2.0275372624809709e-154 -> -510.55719818383272
+log20629 log2 7.3926087369631841e-115 -> -379.13564735312292
+log20630 log2 1.3480198206342423e-86 -> -285.25497445094436
+log20631 log2 8.9927384655719947e-83 -> -272.55127136401637
+log20632 log2 3.1452398713597487e-60 -> -197.66251564496875
+log20633 log2 7.0706573215457351e-55 -> -179.88420087782217
+log20634 log2 3.1258285390731669e-49 -> -161.13023800505653
+log20635 log2 8.2253046627829942e-41 -> -133.15898277355879
+log20636 log2 7.8691367397519897e+49 -> 165.75068202732419
+log20637 log2 2.9920561983925013e+64 -> 214.18453534573757
+log20638 log2 4.7827254553946841e+77 -> 258.04629628445673
+log20639 log2 3.1903566496481868e+105 -> 350.47616767491166
+log20640 log2 5.6195082449502419e+113 -> 377.86831861008250
+log20641 log2 9.9625658250651047e+125 -> 418.55752921228753
+log20642 log2 2.7358945220961532e+145 -> 483.13158636923413
+log20643 log2 2.785842387926931e+174 -> 579.49360214860280
+log20644 log2 2.4169172507252751e+193 -> 642.40529039289652
+log20645 log2 3.1689091206395632e+205 -> 682.65924573798395
+log20646 log2 2.535995592365391e+208 -> 692.30359597460460
+log20647 log2 6.2011236566089916e+233 -> 776.64177576730913
+log20648 log2 2.1843274820677632e+253 -> 841.57499717289647
+log20649 log2 8.7493931063474791e+297 -> 989.74182713073981
diff --git a/Lib/test/memory_watchdog.py b/Lib/test/memory_watchdog.py
new file mode 100644
index 0000000..88cca8d
--- /dev/null
+++ b/Lib/test/memory_watchdog.py
@@ -0,0 +1,28 @@
+"""Memory watchdog: periodically read the memory usage of the main test process
+and print it out, until terminated."""
+# stdin should refer to the process' /proc/<PID>/statm: we don't pass the
+# process' PID to avoid a race condition in case of - unlikely - PID recycling.
+# If the process crashes, reading from the /proc entry will fail with ESRCH.
+
+
+import os
+import sys
+import time
+
+
+try:
+ page_size = os.sysconf('SC_PAGESIZE')
+except (ValueError, AttributeError):
+ try:
+ page_size = os.sysconf('SC_PAGE_SIZE')
+ except (ValueError, AttributeError):
+ page_size = 4096
+
+while True:
+ sys.stdin.seek(0)
+ statm = sys.stdin.read()
+ data = int(statm.split()[5])
+ sys.stdout.write(" ... process data size: {data:.1f}G\n"
+ .format(data=data * page_size / (1024 ** 3)))
+ sys.stdout.flush()
+ time.sleep(1)
diff --git a/Lib/test/mock_socket.py b/Lib/test/mock_socket.py
index 8036932..d09e78c 100644
--- a/Lib/test/mock_socket.py
+++ b/Lib/test/mock_socket.py
@@ -106,7 +106,8 @@ def socket(family=None, type=None, proto=None):
return MockSocket()
-def create_connection(address, timeout=socket_module._GLOBAL_DEFAULT_TIMEOUT):
+def create_connection(address, timeout=socket_module._GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None):
try:
int_port = int(address[1])
except ValueError:
diff --git a/Lib/test/test_multibytecodec_support.py b/Lib/test/multibytecodec_support.py
index ef63b69..a2c57ea 100644
--- a/Lib/test/test_multibytecodec_support.py
+++ b/Lib/test/multibytecodec_support.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# test_multibytecodec_support.py
+# multibytecodec_support.py
# Common Unittest Routines for CJK codecs
#
@@ -264,21 +264,6 @@ class TestBase:
self.assertEqual(ostream.getvalue(), self.tstring[0])
-if len('\U00012345') == 2: # ucs2 build
- _unichr = chr
- def chr(v):
- if v >= 0x10000:
- return _unichr(0xd800 + ((v - 0x10000) >> 10)) + \
- _unichr(0xdc00 + ((v - 0x10000) & 0x3ff))
- else:
- return _unichr(v)
- _ord = ord
- def ord(c):
- if len(c) == 2:
- return 0x10000 + ((_ord(c[0]) - 0xd800) << 10) + \
- (ord(c[1]) - 0xdc00)
- else:
- return _ord(c)
class TestBase_Mapping(unittest.TestCase):
pass_enctest = []
diff --git a/Lib/test/namespace_pkgs/both_portions/foo/one.py b/Lib/test/namespace_pkgs/both_portions/foo/one.py
new file mode 100644
index 0000000..3080f6f
--- /dev/null
+++ b/Lib/test/namespace_pkgs/both_portions/foo/one.py
@@ -0,0 +1 @@
+attr = 'both_portions foo one'
diff --git a/Lib/test/namespace_pkgs/both_portions/foo/two.py b/Lib/test/namespace_pkgs/both_portions/foo/two.py
new file mode 100644
index 0000000..4131d3d
--- /dev/null
+++ b/Lib/test/namespace_pkgs/both_portions/foo/two.py
@@ -0,0 +1 @@
+attr = 'both_portions foo two'
diff --git a/Lib/test/namespace_pkgs/missing_directory.zip b/Lib/test/namespace_pkgs/missing_directory.zip
new file mode 100644
index 0000000..836a910
--- /dev/null
+++ b/Lib/test/namespace_pkgs/missing_directory.zip
Binary files differ
diff --git a/Lib/test/namespace_pkgs/module_and_namespace_package/a_test.py b/Lib/test/namespace_pkgs/module_and_namespace_package/a_test.py
new file mode 100644
index 0000000..43cbedb
--- /dev/null
+++ b/Lib/test/namespace_pkgs/module_and_namespace_package/a_test.py
@@ -0,0 +1 @@
+attr = 'in module'
diff --git a/Lib/importlib/test/__init__.py b/Lib/test/namespace_pkgs/module_and_namespace_package/a_test/empty
index e69de29..e69de29 100644
--- a/Lib/importlib/test/__init__.py
+++ b/Lib/test/namespace_pkgs/module_and_namespace_package/a_test/empty
diff --git a/Lib/test/namespace_pkgs/nested_portion1.zip b/Lib/test/namespace_pkgs/nested_portion1.zip
new file mode 100644
index 0000000..8d22406
--- /dev/null
+++ b/Lib/test/namespace_pkgs/nested_portion1.zip
Binary files differ
diff --git a/Lib/email/test/__init__.py b/Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/__init__.py
index e69de29..e69de29 100644
--- a/Lib/email/test/__init__.py
+++ b/Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/__init__.py
diff --git a/Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/one.py b/Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/one.py
new file mode 100644
index 0000000..d8f5c83
--- /dev/null
+++ b/Lib/test/namespace_pkgs/not_a_namespace_pkg/foo/one.py
@@ -0,0 +1 @@
+attr = 'portion1 foo one'
diff --git a/Lib/test/namespace_pkgs/portion1/foo/one.py b/Lib/test/namespace_pkgs/portion1/foo/one.py
new file mode 100644
index 0000000..d8f5c83
--- /dev/null
+++ b/Lib/test/namespace_pkgs/portion1/foo/one.py
@@ -0,0 +1 @@
+attr = 'portion1 foo one'
diff --git a/Lib/test/namespace_pkgs/portion2/foo/two.py b/Lib/test/namespace_pkgs/portion2/foo/two.py
new file mode 100644
index 0000000..d092e1e
--- /dev/null
+++ b/Lib/test/namespace_pkgs/portion2/foo/two.py
@@ -0,0 +1 @@
+attr = 'portion2 foo two'
diff --git a/Lib/test/namespace_pkgs/project1/parent/child/one.py b/Lib/test/namespace_pkgs/project1/parent/child/one.py
new file mode 100644
index 0000000..2776fcd
--- /dev/null
+++ b/Lib/test/namespace_pkgs/project1/parent/child/one.py
@@ -0,0 +1 @@
+attr = 'parent child one'
diff --git a/Lib/test/namespace_pkgs/project2/parent/child/two.py b/Lib/test/namespace_pkgs/project2/parent/child/two.py
new file mode 100644
index 0000000..8b037bc
--- /dev/null
+++ b/Lib/test/namespace_pkgs/project2/parent/child/two.py
@@ -0,0 +1 @@
+attr = 'parent child two'
diff --git a/Lib/test/namespace_pkgs/project3/parent/child/three.py b/Lib/test/namespace_pkgs/project3/parent/child/three.py
new file mode 100644
index 0000000..f8abfe1
--- /dev/null
+++ b/Lib/test/namespace_pkgs/project3/parent/child/three.py
@@ -0,0 +1 @@
+attr = 'parent child three'
diff --git a/Lib/test/namespace_pkgs/top_level_portion1.zip b/Lib/test/namespace_pkgs/top_level_portion1.zip
new file mode 100644
index 0000000..3b866c9
--- /dev/null
+++ b/Lib/test/namespace_pkgs/top_level_portion1.zip
Binary files differ
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 4d491b0..fb04830 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -4,10 +4,11 @@ import pickle
import pickletools
import sys
import copyreg
+import weakref
from http.cookies import SimpleCookie
from test.support import (
- TestFailed, TESTFN, run_with_locale,
+ TestFailed, TESTFN, run_with_locale, no_tracing,
_2G, _4G, bigmemtest,
)
@@ -18,7 +19,7 @@ from pickle import bytes_types
# kind of outer loop.
protocols = range(pickle.HIGHEST_PROTOCOL + 1)
-character_size = 4 if sys.maxunicode > 0xFFFF else 2
+ascii_char_size = 1
# Return True if opcode code appears in the pickle, else False.
@@ -747,6 +748,18 @@ class AbstractPickleTests(unittest.TestCase):
u = self.loads(s)
self.assertEqual(t, u)
+ def test_ellipsis(self):
+ for proto in protocols:
+ s = self.dumps(..., proto)
+ u = self.loads(s)
+ self.assertEqual(..., u)
+
+ def test_notimplemented(self):
+ for proto in protocols:
+ s = self.dumps(NotImplemented, proto)
+ u = self.loads(s)
+ self.assertEqual(NotImplemented, u)
+
# Tests for protocol 2
def test_proto(self):
@@ -880,6 +893,25 @@ class AbstractPickleTests(unittest.TestCase):
self.assertEqual(B(x), B(y), detail)
self.assertEqual(x.__dict__, y.__dict__, detail)
+ def test_newobj_proxies(self):
+ # NEWOBJ should use the __class__ rather than the raw type
+ classes = myclasses[:]
+ # Cannot create weakproxies to these classes
+ for c in (MyInt, MyTuple):
+ classes.remove(c)
+ for proto in protocols:
+ for C in classes:
+ B = C.__base__
+ x = C(C.sample)
+ x.foo = 42
+ p = weakref.proxy(x)
+ s = self.dumps(p, proto)
+ y = self.loads(s)
+ self.assertEqual(type(y), type(x)) # rather than type(p)
+ detail = (proto, C, B, x, y, type(y))
+ self.assertEqual(B(x), B(y), detail)
+ self.assertEqual(x.__dict__, y.__dict__, detail)
+
# Register a type with copyreg, with extension code extcode. Pickle
# an object of that type. Check that the resulting pickle uses opcode
# (EXT[124]) under proto 2, and not in proto 1.
@@ -1040,13 +1072,13 @@ class AbstractPickleTests(unittest.TestCase):
y = self.loads(s)
self.assertEqual(y._reduce_called, 1)
+ @no_tracing
def test_bad_getattr(self):
x = BadGetattr()
for proto in 0, 1:
self.assertRaises(RuntimeError, self.dumps, x, proto)
# protocol 2 don't raise a RuntimeError.
d = self.dumps(x, 2)
- self.assertRaises(RuntimeError, self.loads, d)
def test_reduce_bad_iterator(self):
# Issue4176: crash when 4th and 5th items of __reduce__()
@@ -1136,6 +1168,15 @@ class AbstractPickleTests(unittest.TestCase):
empty = self.loads(b'\x80\x03U\x00q\x00.', encoding='koi8-r')
self.assertEqual(empty, '')
+ def test_int_pickling_efficiency(self):
+ # Test compacity of int representation (see issue #12744)
+ for proto in protocols:
+ sizes = [len(self.dumps(2**n, proto)) for n in range(70)]
+ # the size function is monotonic
+ self.assertEqual(sorted(sizes), sizes)
+ if proto >= 2:
+ self.assertLessEqual(sizes[-1], 14)
+
def check_negative_32b_binXXX(self, dumped):
if sys.maxsize > 2**32:
self.skipTest("test is only meaningful on 32-bit builds")
@@ -1217,7 +1258,7 @@ class BigmemPickleTests(unittest.TestCase):
# All protocols use 1-byte per printable ASCII character; we add another
# byte because the encoded form has to be copied into the internal buffer.
- @bigmemtest(size=_2G, memuse=2 + character_size, dry_run=False)
+ @bigmemtest(size=_2G, memuse=2 + ascii_char_size, dry_run=False)
def test_huge_str_32b(self, size):
data = "abcd" * (size // 4)
try:
@@ -1234,7 +1275,7 @@ class BigmemPickleTests(unittest.TestCase):
# BINUNICODE (protocols 1, 2 and 3) cannot carry more than
# 2**32 - 1 bytes of utf-8 encoded unicode.
- @bigmemtest(size=_4G, memuse=1 + character_size, dry_run=False)
+ @bigmemtest(size=_4G, memuse=1 + ascii_char_size, dry_run=False)
def test_huge_str_64b(self, size):
data = "a" * size
try:
@@ -1578,6 +1619,105 @@ class AbstractPicklerUnpicklerObjectTests(unittest.TestCase):
self.assertEqual(unpickler.load(), data)
+# Tests for dispatch_table attribute
+
+REDUCE_A = 'reduce_A'
+
+class AAA(object):
+ def __reduce__(self):
+ return str, (REDUCE_A,)
+
+class BBB(object):
+ pass
+
+class AbstractDispatchTableTests(unittest.TestCase):
+
+ def test_default_dispatch_table(self):
+ # No dispatch_table attribute by default
+ f = io.BytesIO()
+ p = self.pickler_class(f, 0)
+ with self.assertRaises(AttributeError):
+ p.dispatch_table
+ self.assertFalse(hasattr(p, 'dispatch_table'))
+
+ def test_class_dispatch_table(self):
+ # A dispatch_table attribute can be specified class-wide
+ dt = self.get_dispatch_table()
+
+ class MyPickler(self.pickler_class):
+ dispatch_table = dt
+
+ def dumps(obj, protocol=None):
+ f = io.BytesIO()
+ p = MyPickler(f, protocol)
+ self.assertEqual(p.dispatch_table, dt)
+ p.dump(obj)
+ return f.getvalue()
+
+ self._test_dispatch_table(dumps, dt)
+
+ def test_instance_dispatch_table(self):
+ # A dispatch_table attribute can also be specified instance-wide
+ dt = self.get_dispatch_table()
+
+ def dumps(obj, protocol=None):
+ f = io.BytesIO()
+ p = self.pickler_class(f, protocol)
+ p.dispatch_table = dt
+ self.assertEqual(p.dispatch_table, dt)
+ p.dump(obj)
+ return f.getvalue()
+
+ self._test_dispatch_table(dumps, dt)
+
+ def _test_dispatch_table(self, dumps, dispatch_table):
+ def custom_load_dump(obj):
+ return pickle.loads(dumps(obj, 0))
+
+ def default_load_dump(obj):
+ return pickle.loads(pickle.dumps(obj, 0))
+
+ # pickling complex numbers using protocol 0 relies on copyreg
+ # so check pickling a complex number still works
+ z = 1 + 2j
+ self.assertEqual(custom_load_dump(z), z)
+ self.assertEqual(default_load_dump(z), z)
+
+ # modify pickling of complex
+ REDUCE_1 = 'reduce_1'
+ def reduce_1(obj):
+ return str, (REDUCE_1,)
+ dispatch_table[complex] = reduce_1
+ self.assertEqual(custom_load_dump(z), REDUCE_1)
+ self.assertEqual(default_load_dump(z), z)
+
+ # check picklability of AAA and BBB
+ a = AAA()
+ b = BBB()
+ self.assertEqual(custom_load_dump(a), REDUCE_A)
+ self.assertIsInstance(custom_load_dump(b), BBB)
+ self.assertEqual(default_load_dump(a), REDUCE_A)
+ self.assertIsInstance(default_load_dump(b), BBB)
+
+ # modify pickling of BBB
+ dispatch_table[BBB] = reduce_1
+ self.assertEqual(custom_load_dump(a), REDUCE_A)
+ self.assertEqual(custom_load_dump(b), REDUCE_1)
+ self.assertEqual(default_load_dump(a), REDUCE_A)
+ self.assertIsInstance(default_load_dump(b), BBB)
+
+ # revert pickling of BBB and modify pickling of AAA
+ REDUCE_2 = 'reduce_2'
+ def reduce_2(obj):
+ return str, (REDUCE_2,)
+ dispatch_table[AAA] = reduce_2
+ del dispatch_table[BBB]
+ self.assertEqual(custom_load_dump(a), REDUCE_2)
+ self.assertIsInstance(custom_load_dump(b), BBB)
+ self.assertEqual(default_load_dump(a), REDUCE_A)
+ self.assertIsInstance(default_load_dump(b), BBB)
+
+
if __name__ == "__main__":
# Print some stuff that can be used to rewrite DATA{0,1,2}
from pickletools import dis
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index e098522..8f3b689 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -20,6 +20,11 @@ python -E -Wd -m test [options] [test_name1 ...]
Options:
-h/--help -- print this text and exit
+--timeout TIMEOUT
+ -- dump the traceback and exit if a test takes more
+ than TIMEOUT seconds; disabled if TIMEOUT is negative
+ or equals to zero
+--wait -- wait for user input, e.g., allow a debugger to be attached
Verbosity
@@ -44,6 +49,9 @@ Selecting tests
-- specify which special resource intensive tests to run
-M/--memlimit LIMIT
-- run very large memory-consuming tests
+ --testdir DIR
+ -- execute test files in the specified directory (instead
+ of the Python stdlib test suite)
Special runs
@@ -125,6 +133,8 @@ resources to test. Currently only the following are defined:
all - Enable all special resources.
+ none - Disable all special resources (this is the default).
+
audio - Tests that use the audio device. (There are known
cases of broken audio drivers that can crash Python or
even the Linux kernel.)
@@ -155,8 +165,11 @@ example, to run all the tests except for the gui tests, give the
option '-uall,-gui'.
"""
+# We import importlib *ASAP* in order to test #15386
+import importlib
+
import builtins
-import errno
+import faulthandler
import getopt
import io
import json
@@ -166,6 +179,7 @@ import platform
import random
import re
import shutil
+import signal
import sys
import sysconfig
import tempfile
@@ -225,6 +239,7 @@ ENV_CHANGED = -1
SKIPPED = -2
RESOURCE_DENIED = -3
INTERRUPTED = -4
+CHILD_ERROR = -5 # error in a child process
from test import support
@@ -268,6 +283,18 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
on the command line.
"""
+ # Display the Python traceback on fatal errors (e.g. segfault)
+ faulthandler.enable(all_threads=True)
+
+ # Display the Python traceback on SIGALRM or SIGUSR1 signal
+ signals = []
+ if hasattr(signal, 'SIGALRM'):
+ signals.append(signal.SIGALRM)
+ if hasattr(signal, 'SIGUSR1'):
+ signals.append(signal.SIGUSR1)
+ for signum in signals:
+ faulthandler.register(signum, chain=True)
+
replace_stdout()
support.record_original_stdout(sys.stdout)
@@ -278,7 +305,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
'use=', 'threshold=', 'coverdir=', 'nocoverdir',
'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',
- 'start=', 'nowindows', 'header', 'failfast', 'match'])
+ 'start=', 'nowindows', 'header', 'testdir=', 'timeout=', 'wait',
+ 'failfast', 'match'])
except getopt.error as msg:
usage(msg)
@@ -289,6 +317,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
use_resources = []
debug = False
start = None
+ timeout = None
for o, a in opts:
if o in ('-h', '--help'):
print(__doc__)
@@ -332,7 +361,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
elif o in ('-T', '--coverage'):
trace = True
elif o in ('-D', '--coverdir'):
- coverdir = os.path.join(os.getcwd(), a)
+ # CWD is replaced with a temporary dir before calling main(), so we
+ # need join it with the saved CWD so it goes where the user expects.
+ coverdir = os.path.join(support.SAVEDCWD, a)
elif o in ('-N', '--nocoverdir'):
coverdir = None
elif o in ('-R', '--huntrleaks'):
@@ -350,9 +381,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
huntrleaks[1] = int(huntrleaks[1])
if len(huntrleaks) == 2 or not huntrleaks[2]:
huntrleaks[2:] = ["reflog.txt"]
- # Avoid false positives due to the character cache in
- # stringobject.c filling slowly with random data
- warm_char_cache()
+ # Avoid false positives due to various caches
+ # filling slowly with random data:
+ warm_caches()
elif o in ('-M', '--memlimit'):
support.set_memlimit(a)
elif o in ('-u', '--use'):
@@ -361,6 +392,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
if r == 'all':
use_resources[:] = RESOURCE_NAMES
continue
+ if r == 'none':
+ del use_resources[:]
+ continue
remove = False
if r[0] == '-':
remove = True
@@ -391,18 +425,45 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
forever = True
elif o in ('-j', '--multiprocess'):
use_mp = int(a)
+ if use_mp <= 0:
+ try:
+ import multiprocessing
+ # Use all cores + extras for tests that like to sleep
+ use_mp = 2 + multiprocessing.cpu_count()
+ except (ImportError, NotImplementedError):
+ use_mp = 3
+ if use_mp == 1:
+ use_mp = None
elif o == '--header':
header = True
elif o == '--slaveargs':
args, kwargs = json.loads(a)
try:
result = runtest(*args, **kwargs)
+ except KeyboardInterrupt:
+ result = INTERRUPTED, ''
except BaseException as e:
- result = INTERRUPTED, e.__class__.__name__
+ traceback.print_exc()
+ result = CHILD_ERROR, str(e)
sys.stdout.flush()
print() # Force a newline (just in case)
print(json.dumps(result))
sys.exit(0)
+ elif o == '--testdir':
+ # CWD is replaced with a temporary dir before calling main(), so we
+ # join it with the saved CWD so it ends up where the user expects.
+ testdir = os.path.join(support.SAVEDCWD, a)
+ elif o == '--timeout':
+ if hasattr(faulthandler, 'dump_tracebacks_later'):
+ timeout = float(a)
+ if timeout <= 0:
+ timeout = None
+ else:
+ print("Warning: The timeout option requires "
+ "faulthandler.dump_tracebacks_later")
+ timeout = None
+ elif o == '--wait':
+ input("Press any key to continue...")
else:
print(("No handler for option {}. Please report this as a bug "
"at http://bugs.python.org.").format(o), file=sys.stderr)
@@ -481,7 +542,13 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
print("== ", os.getcwd())
print("Testing with flags:", sys.flags)
- alltests = findtests(testdir, stdtests, nottests)
+ # if testdir is set, then we are not running the python tests suite, so
+ # don't add default tests to be executed or skipped (pass empty values)
+ if testdir:
+ alltests = findtests(testdir, list(), set())
+ else:
+ alltests = findtests(testdir, stdtests, nottests)
+
selected = tests or args or alltests
if single:
selected = selected[:1]
@@ -501,7 +568,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
random.shuffle(selected)
if trace:
import trace, tempfile
- tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,
+ tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,
tempfile.gettempdir()],
trace=False, count=True)
@@ -566,7 +633,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
(test, verbose, quiet),
dict(huntrleaks=huntrleaks, use_resources=use_resources,
debug=debug, output_on_failure=verbose3,
- failfast=failfast, match_tests=match_tests)
+ timeout=timeout, failfast=failfast,
+ match_tests=match_tests)
)
# -E is needed by some tests, e.g. test_import
# Running the child from the same working directory ensures
@@ -578,10 +646,15 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
close_fds=(os.name != 'nt'),
cwd=support.SAVEDCWD)
stdout, stderr = popen.communicate()
+ retcode = popen.wait()
# Strip last refcount output line if it exists, since it
# comes from the shutdown of the interpreter in the subcommand.
stderr = debug_output_pat.sub("", stderr)
stdout, _, result = stdout.strip().rpartition("\n")
+ if retcode != 0:
+ result = (CHILD_ERROR, "Exit code %s" % retcode)
+ output.put((test, stdout.rstrip(), stderr.rstrip(), result))
+ return
if not result:
output.put((None, None, None, None))
return
@@ -614,8 +687,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
sys.stdout.flush()
sys.stderr.flush()
if result[0] == INTERRUPTED:
- assert result[1] == 'KeyboardInterrupt'
- raise KeyboardInterrupt # What else?
+ raise KeyboardInterrupt
+ if result[0] == CHILD_ERROR:
+ raise Exception("Child error on {}: {}".format(test, result[1]))
test_index += 1
except KeyboardInterrupt:
interrupted = True
@@ -632,13 +706,14 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
if trace:
# If we're tracing code coverage, then we don't exit with status
# if on a false return value from main.
- tracer.runctx('runtest(test, verbose, quiet)',
+ tracer.runctx('runtest(test, verbose, quiet, timeout=timeout)',
globals=globals(), locals=vars())
else:
try:
result = runtest(test, verbose, quiet, huntrleaks, debug,
output_on_failure=verbose3,
- failfast=failfast, match_tests=match_tests)
+ timeout=timeout, failfast=failfast,
+ match_tests=match_tests)
accumulate_result(test, result)
except KeyboardInterrupt:
interrupted = True
@@ -709,7 +784,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
sys.stdout.flush()
try:
verbose = True
- ok = runtest(test, True, quiet, huntrleaks, debug)
+ ok = runtest(test, True, quiet, huntrleaks, debug, timeout=timeout)
except KeyboardInterrupt:
# print a newline separate from the ^C
print()
@@ -734,6 +809,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
sys.exit(len(bad) > 0 or interrupted)
+# small set of tests to determine if we have a basically functioning interpreter
+# (i.e. if any of these fail, then anything else is likely to follow)
STDTESTS = [
'test_grammar',
'test_opcodes',
@@ -744,12 +821,11 @@ STDTESTS = [
'test_unittest',
'test_doctest',
'test_doctest2',
+ 'test_support'
]
-NOTTESTS = {
- 'test_future1',
- 'test_future2',
-}
+# set of tests that we don't want to be executed when using regrtest
+NOTTESTS = set()
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
"""Return a list of all applicable test modules."""
@@ -758,9 +834,9 @@ def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
tests = []
others = set(stdtests) | nottests
for name in names:
- modname, ext = os.path.splitext(name)
- if modname[:5] == "test_" and ext == ".py" and modname not in others:
- tests.append(modname)
+ mod, ext = os.path.splitext(name)
+ if mod[:5] == "test_" and ext in (".py", "") and mod not in others:
+ tests.append(mod)
return stdtests + sorted(tests)
# We do not use a generator so multiple threads can call next().
@@ -785,17 +861,14 @@ class MultiprocessTests(object):
def replace_stdout():
"""Set stdout encoder error handler to backslashreplace (as stderr error
handler) to avoid UnicodeEncodeError when printing a traceback"""
- if os.name == "nt":
- # Replace sys.stdout breaks the stdout newlines on Windows: issue #8533
- return
-
import atexit
stdout = sys.stdout
sys.stdout = open(stdout.fileno(), 'w',
encoding=stdout.encoding,
errors="backslashreplace",
- closefd=False)
+ closefd=False,
+ newline='\n')
def restore_stdout():
sys.stdout.close()
@@ -804,7 +877,8 @@ def replace_stdout():
def runtest(test, verbose, quiet,
huntrleaks=False, debug=False, use_resources=None,
- output_on_failure=False, failfast=False, match_tests=None):
+ output_on_failure=False, failfast=False, match_tests=None,
+ timeout=None):
"""Run a single test.
test -- the name of the test
@@ -814,6 +888,8 @@ def runtest(test, verbose, quiet,
huntrleaks -- run multiple times to test for leaks; requires a debug
build; a triple corresponding to -R's three arguments
output_on_failure -- if true, display test output on failure
+ timeout -- dump the traceback and exit if a test takes more than
+ timeout seconds
Returns one of the test result constants:
INTERRUPTED KeyboardInterrupt when run under -j
@@ -826,6 +902,9 @@ def runtest(test, verbose, quiet,
if use_resources is not None:
support.use_resources = use_resources
+ use_timeout = (timeout is not None)
+ if use_timeout:
+ faulthandler.dump_tracebacks_later(timeout, exit=True)
try:
support.match_tests = match_tests
if failfast:
@@ -864,6 +943,8 @@ def runtest(test, verbose, quiet,
display_failure=not verbose)
return result
finally:
+ if use_timeout:
+ faulthandler.cancel_dump_tracebacks_later()
cleanup_test_droppings(test, verbose)
runtest.stringio = None
@@ -909,10 +990,10 @@ class saved_test_environment:
resources = ('sys.argv', 'cwd', 'sys.stdin', 'sys.stdout', 'sys.stderr',
'os.environ', 'sys.path', 'sys.path_hooks', '__import__',
'warnings.filters', 'asyncore.socket_map',
- 'logging._handlers', 'logging._handlerList',
- 'shutil.archive_formats', 'shutil.unpack_formats',
+ 'logging._handlers', 'logging._handlerList', 'sys.gettrace',
'sys.warnoptions', 'threading._dangling',
'multiprocessing.process._dangling',
+ 'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES',
'support.TESTFN',
)
@@ -961,6 +1042,11 @@ class saved_test_environment:
sys.path_hooks = saved_hooks[1]
sys.path_hooks[:] = saved_hooks[2]
+ def get_sys_gettrace(self):
+ return sys.gettrace()
+ def restore_sys_gettrace(self, trace_fxn):
+ sys.settrace(trace_fxn)
+
def get___import__(self):
return builtins.__import__
def restore___import__(self, import_):
@@ -1044,6 +1130,24 @@ class saved_test_environment:
multiprocessing.process._dangling.clear()
multiprocessing.process._dangling.update(saved)
+ def get_sysconfig__CONFIG_VARS(self):
+ # make sure the dict is initialized
+ sysconfig.get_config_var('prefix')
+ return (id(sysconfig._CONFIG_VARS), sysconfig._CONFIG_VARS,
+ dict(sysconfig._CONFIG_VARS))
+ def restore_sysconfig__CONFIG_VARS(self, saved):
+ sysconfig._CONFIG_VARS = saved[1]
+ sysconfig._CONFIG_VARS.clear()
+ sysconfig._CONFIG_VARS.update(saved[2])
+
+ def get_sysconfig__INSTALL_SCHEMES(self):
+ return (id(sysconfig._INSTALL_SCHEMES), sysconfig._INSTALL_SCHEMES,
+ sysconfig._INSTALL_SCHEMES.copy())
+ def restore_sysconfig__INSTALL_SCHEMES(self, saved):
+ sysconfig._INSTALL_SCHEMES = saved[1]
+ sysconfig._INSTALL_SCHEMES.clear()
+ sysconfig._INSTALL_SCHEMES.update(saved[2])
+
def get_support_TESTFN(self):
if os.path.isfile(support.TESTFN):
result = 'f'
@@ -1108,14 +1212,15 @@ def runtest_inner(test, verbose, quiet,
start_time = time.time()
the_package = __import__(abstest, globals(), locals(), [])
the_module = getattr(the_package, test)
- # Old tests run to completion simply as a side-effect of
- # being imported. For tests based on unittest or doctest,
- # explicitly invoke their test_main() function (if it exists).
- indirect_test = getattr(the_module, "test_main", None)
- if indirect_test is not None:
- indirect_test()
+ # If the test has a test_main, that will run the appropriate
+ # tests. If not, use normal unittest test loading.
+ test_runner = getattr(the_module, "test_main", None)
+ if test_runner is None:
+ tests = unittest.TestLoader().loadTestsFromModule(the_module)
+ test_runner = lambda: support.run_unittest(tests)
+ test_runner()
if huntrleaks:
- refleak = dash_R(the_module, test, indirect_test,
+ refleak = dash_R(the_module, test, test_runner,
huntrleaks)
test_time = time.time() - start_time
except support.ResourceDenied as msg:
@@ -1198,7 +1303,8 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
False if the test didn't leak references; True if we detected refleaks.
"""
# This code is hackish and inelegant, but it seems to do the job.
- import copyreg, _abcoll
+ import copyreg
+ import collections.abc
if not hasattr(sys, 'gettotalrefcount'):
raise Exception("Tracking reference leaks requires a debug build "
@@ -1215,7 +1321,7 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
else:
zdc = zipimport._zip_directory_cache.copy()
abcs = {}
- for abc in [getattr(_abcoll, a) for a in _abcoll.__all__]:
+ for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
if not isabstract(abc):
continue
for obj in abc.__subclasses__() + [abc]:
@@ -1261,7 +1367,7 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
import gc, copyreg
import _strptime, linecache
import urllib.parse, urllib.request, mimetypes, doctest
- import struct, filecmp, _abcoll
+ import struct, filecmp, collections.abc
from distutils.dir_util import _path_created
from weakref import WeakSet
@@ -1288,7 +1394,7 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
sys._clear_type_cache()
# Clear ABC registries, restoring previously saved ABC registries.
- for abc in [getattr(_abcoll, a) for a in _abcoll.__all__]:
+ for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
if not isabstract(abc):
continue
for obj in abc.__subclasses__() + [abc]:
@@ -1324,10 +1430,15 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
# Collect cyclic trash.
gc.collect()
-def warm_char_cache():
+def warm_caches():
+ # char cache
s = bytes(range(256))
for i in range(256):
s[i:i+1]
+ # unicode cache
+ x = [chr(i) for i in range(256)]
+ # int cache
+ x = list(range(-5, 257))
def findtestdir(path=None):
return path or os.path.dirname(__file__) or os.curdir
@@ -1374,13 +1485,14 @@ def printlist(x, width=70, indent=4):
# Tests that are expected to be skipped everywhere except on one platform
# are also handled separately.
-_expectations = {
- 'win32':
+_expectations = (
+ ('win32',
"""
test__locale
test_crypt
test_curses
test_dbm
+ test_devpoll
test_fcntl
test_fork1
test_epoll
@@ -1403,15 +1515,16 @@ _expectations = {
test_threadsignals
test_wait3
test_wait4
- """,
- 'linux2':
+ """),
+ ('linux',
"""
test_curses
+ test_devpoll
test_largefile
test_kqueue
test_ossaudiodev
- """,
- 'unixware7':
+ """),
+ ('unixware',
"""
test_epoll
test_largefile
@@ -1421,8 +1534,8 @@ _expectations = {
test_pyexpat
test_sax
test_sundry
- """,
- 'openunix8':
+ """),
+ ('openunix',
"""
test_epoll
test_largefile
@@ -1432,8 +1545,8 @@ _expectations = {
test_pyexpat
test_sax
test_sundry
- """,
- 'sco_sv3':
+ """),
+ ('sco_sv',
"""
test_asynchat
test_fork1
@@ -1452,11 +1565,12 @@ _expectations = {
test_threaded_import
test_threadedtempfile
test_threading
- """,
- 'darwin':
+ """),
+ ('darwin',
"""
test__locale
test_curses
+ test_devpoll
test_epoll
test_dbm_gnu
test_gdb
@@ -1465,8 +1579,8 @@ _expectations = {
test_minidom
test_ossaudiodev
test_poll
- """,
- 'sunos5':
+ """),
+ ('sunos',
"""
test_curses
test_dbm
@@ -1477,8 +1591,8 @@ _expectations = {
test_openpty
test_zipfile
test_zlib
- """,
- 'hp-ux11':
+ """),
+ ('hp-ux',
"""
test_curses
test_epoll
@@ -1493,11 +1607,12 @@ _expectations = {
test_sax
test_zipfile
test_zlib
- """,
- 'cygwin':
+ """),
+ ('cygwin',
"""
test_curses
test_dbm
+ test_devpoll
test_epoll
test_ioctl
test_kqueue
@@ -1505,8 +1620,8 @@ _expectations = {
test_locale
test_ossaudiodev
test_socketserver
- """,
- 'os2emx':
+ """),
+ ('os2emx',
"""
test_audioop
test_curses
@@ -1519,9 +1634,10 @@ _expectations = {
test_pty
test_resource
test_signal
- """,
- 'freebsd4':
+ """),
+ ('freebsd',
"""
+ test_devpoll
test_epoll
test_dbm_gnu
test_locale
@@ -1536,8 +1652,8 @@ _expectations = {
test_timeout
test_urllibnet
test_multiprocessing
- """,
- 'aix5':
+ """),
+ ('aix',
"""
test_bz2
test_epoll
@@ -1551,10 +1667,11 @@ _expectations = {
test_ttk_textonly
test_zipimport
test_zlib
- """,
- 'openbsd3':
+ """),
+ ('openbsd',
"""
test_ctypes
+ test_devpoll
test_epoll
test_dbm_gnu
test_locale
@@ -1566,11 +1683,12 @@ _expectations = {
test_ttk_guionly
test_ttk_textonly
test_multiprocessing
- """,
- 'netbsd3':
+ """),
+ ('netbsd',
"""
test_ctypes
test_curses
+ test_devpoll
test_epoll
test_dbm_gnu
test_locale
@@ -1581,12 +1699,8 @@ _expectations = {
test_ttk_guionly
test_ttk_textonly
test_multiprocessing
- """,
-}
-_expectations['freebsd5'] = _expectations['freebsd4']
-_expectations['freebsd6'] = _expectations['freebsd4']
-_expectations['freebsd7'] = _expectations['freebsd4']
-_expectations['freebsd8'] = _expectations['freebsd4']
+ """),
+)
class _ExpectedSkips:
def __init__(self):
@@ -1594,9 +1708,13 @@ class _ExpectedSkips:
from test import test_timeout
self.valid = False
- if sys.platform in _expectations:
- s = _expectations[sys.platform]
- self.expected = set(s.split())
+ expected = None
+ for item in _expectations:
+ if sys.platform.startswith(item[0]):
+ expected = item[1]
+ break
+ if expected is not None:
+ self.expected = set(expected.split())
# These are broken tests, for now skipped on every platform.
# XXX Fix these!
@@ -1656,9 +1774,8 @@ def _make_temp_dir_for_build(TEMPDIR):
TEMPDIR = os.path.abspath(TEMPDIR)
try:
os.mkdir(TEMPDIR)
- except OSError as e:
- if e.errno != errno.EEXIST:
- raise
+ except FileExistsError:
+ pass
# Define a writable temp dir that will be used as cwd while running
# the tests. The name of the dir includes the pid to allow parallel
diff --git a/Lib/test/reperf.py b/Lib/test/reperf.py
index 7c68234..e93bacd 100644
--- a/Lib/test/reperf.py
+++ b/Lib/test/reperf.py
@@ -9,13 +9,13 @@ def main():
timefunc(10, p.findall, s)
def timefunc(n, func, *args, **kw):
- t0 = time.clock()
+ t0 = time.perf_counter()
try:
for i in range(n):
result = func(*args, **kw)
return result
finally:
- t1 = time.clock()
+ t1 = time.perf_counter()
if n > 1:
print(n, "times", end=' ')
print(func.__name__, "%.3f" % (t1-t0), "CPU seconds")
diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py
index ba446cd..b09f4bf 100644
--- a/Lib/test/script_helper.py
+++ b/Lib/test/script_helper.py
@@ -1,6 +1,7 @@
# Common utility functions used by various script execution tests
# e.g. test_cmd_line, test_cmd_line_script and test_runpy
+import importlib
import sys
import os
import os.path
@@ -59,11 +60,12 @@ def assert_python_failure(*args, **env_vars):
"""
return _assert_python(False, *args, **env_vars)
-def spawn_python(*args):
+def spawn_python(*args, **kw):
cmd_line = [sys.executable, '-E']
cmd_line.extend(args)
return subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
- stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ **kw)
def kill_python(p):
p.stdin.close()
@@ -92,6 +94,7 @@ def make_script(script_dir, script_basename, source):
script_file = open(script_name, 'w', encoding='utf-8')
script_file.write(source)
script_file.close()
+ importlib.invalidate_caches()
return script_name
def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None):
diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py
index f655c29..f185a82 100644
--- a/Lib/test/seq_tests.py
+++ b/Lib/test/seq_tests.py
@@ -4,6 +4,7 @@ Tests common to tuple, list and UserList.UserList
import unittest
import sys
+import pickle
# Various iterables
# This is used for checking the constructor (here and in test_deque.py)
@@ -388,3 +389,9 @@ class CommonTest(unittest.TestCase):
self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2)
self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize)
self.assertRaises(ValueError, a.index, 2, 0, -10)
+
+ def test_pickle(self):
+ lst = self.type2test([4, 5, 6, 7])
+ lst2 = pickle.loads(pickle.dumps(lst))
+ self.assertEqual(lst2, lst)
+ self.assertNotEqual(id(lst2), id(lst))
diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
index 0ce88de..af7c0b4 100644
--- a/Lib/test/sortperf.py
+++ b/Lib/test/sortperf.py
@@ -57,9 +57,9 @@ def flush():
sys.stdout.flush()
def doit(L):
- t0 = time.clock()
+ t0 = time.perf_counter()
L.sort()
- t1 = time.clock()
+ t1 = time.perf_counter()
print("%6.2f" % (t1-t0), end=' ')
flush()
diff --git a/Lib/test/ssl_key.passwd.pem b/Lib/test/ssl_key.passwd.pem
new file mode 100644
index 0000000..2524672
--- /dev/null
+++ b/Lib/test/ssl_key.passwd.pem
@@ -0,0 +1,18 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,1A8D9D2A02EC698A
+
+kJYbfZ8L0sfe9Oty3gw0aloNnY5E8fegRfQLZlNoxTl6jNt0nIwI8kDJ36CZgR9c
+u3FDJm/KqrfUoz8vW+qEnWhSG7QPX2wWGPHd4K94Yz/FgrRzZ0DoK7XxXq9gOtVA
+AVGQhnz32p+6WhfGsCr9ArXEwRZrTk/FvzEPaU5fHcoSkrNVAGX8IpSVkSDwEDQr
+Gv17+cfk99UV1OCza6yKHoFkTtrC+PZU71LomBabivS2Oc4B9hYuSR2hF01wTHP+
+YlWNagZOOVtNz4oKK9x9eNQpmfQXQvPPTfusexKIbKfZrMvJoxcm1gfcZ0H/wK6P
+6wmXSG35qMOOztCZNtperjs1wzEBXznyK8QmLcAJBjkfarABJX9vBEzZV0OUKhy+
+noORFwHTllphbmydLhu6ehLUZMHPhzAS5UN7srtpSN81eerDMy0RMUAwA7/PofX1
+94Me85Q8jP0PC9ETdsJcPqLzAPETEYu0ELewKRcrdyWi+tlLFrpE5KT/s5ecbl9l
+7B61U4Kfd1PIXc/siINhU3A3bYK+845YyUArUOnKf1kEox7p1RpD7yFqVT04lRTo
+cibNKATBusXSuBrp2G6GNuhWEOSafWCKJQAzgCYIp6ZTV2khhMUGppc/2H3CF6cO
+zX0KtlPVZC7hLkB6HT8SxYUwF1zqWY7+/XPPdc37MeEZ87Q3UuZwqORLY+Z0hpgt
+L5JXBCoklZhCAaN2GqwFLXtGiRSRFGY7xXIhbDTlE65Wv1WGGgDLMKGE1gOz3yAo
+2jjG1+yAHJUdE69XTFHSqSkvaloA1W03LdMXZ9VuQJ/ySXCie6ABAQ==
+-----END RSA PRIVATE KEY-----
diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py
index 77c0542..8686153 100644
--- a/Lib/test/ssl_servers.py
+++ b/Lib/test/ssl_servers.py
@@ -94,7 +94,12 @@ class StatsRequestHandler(BaseHTTPRequestHandler):
"""Serve a GET request."""
sock = self.rfile.raw._sock
context = sock.context
- body = pprint.pformat(context.session_stats())
+ stats = {
+ 'session_cache': context.session_stats(),
+ 'cipher': sock.cipher(),
+ 'compression': sock.compression(),
+ }
+ body = pprint.pformat(stats)
body = body.encode('utf-8')
self.send_response(200)
self.send_header("Content-type", "text/plain; charset=utf-8")
@@ -172,6 +177,11 @@ if __name__ == "__main__":
action='store_false', help='be less verbose')
parser.add_argument('-s', '--stats', dest='use_stats_handler', default=False,
action='store_true', help='always return stats page')
+ parser.add_argument('--curve-name', dest='curve_name', type=str,
+ action='store',
+ help='curve name for EC-based Diffie-Hellman')
+ parser.add_argument('--dh', dest='dh_file', type=str, action='store',
+ help='PEM file containing DH parameters')
args = parser.parse_args()
support.verbose = args.verbose
@@ -182,6 +192,10 @@ if __name__ == "__main__":
handler_class.root = os.getcwd()
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.load_cert_chain(CERTFILE)
+ if args.curve_name:
+ context.set_ecdh_curve(args.curve_name)
+ if args.dh_file:
+ context.load_dh_params(args.dh_file)
server = HTTPSServer(("", args.port), handler_class, context)
if args.verbose:
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py
index 413f9dd..e4688d0 100644
--- a/Lib/test/string_tests.py
+++ b/Lib/test/string_tests.py
@@ -28,6 +28,11 @@ class BaseTest(unittest.TestCase):
# Change in subclasses to change the behaviour of fixtesttype()
type2test = None
+ # Whether the "contained items" of the container are integers in
+ # range(0, 256) (i.e. bytes, bytearray) or strings of length 1
+ # (str)
+ contains_bytes = False
+
# All tests pass their arguments to the testing methods
# as str objects. fixtesttype() can be used to propagate
# these arguments to the appropriate type
@@ -47,11 +52,12 @@ class BaseTest(unittest.TestCase):
return obj
# check that obj.method(*args) returns result
- def checkequal(self, result, obj, methodname, *args):
+ def checkequal(self, result, obj, methodname, *args, **kwargs):
result = self.fixtype(result)
obj = self.fixtype(obj)
args = self.fixtype(args)
- realresult = getattr(obj, methodname)(*args)
+ kwargs = {k: self.fixtype(v) for k,v in kwargs.items()}
+ realresult = getattr(obj, methodname)(*args, **kwargs)
self.assertEqual(
result,
realresult
@@ -116,7 +122,11 @@ class BaseTest(unittest.TestCase):
self.checkequal(0, '', 'count', 'xx', sys.maxsize, 0)
self.checkraises(TypeError, 'hello', 'count')
- self.checkraises(TypeError, 'hello', 'count', 42)
+
+ if self.contains_bytes:
+ self.checkequal(0, 'hello', 'count', 42)
+ else:
+ self.checkraises(TypeError, 'hello', 'count', 42)
# For a variety of combinations,
# verify that str.count() matches an equivalent function
@@ -162,7 +172,11 @@ class BaseTest(unittest.TestCase):
self.checkequal( 2, 'rrarrrrrrrrra', 'find', 'a', None, 6)
self.checkraises(TypeError, 'hello', 'find')
- self.checkraises(TypeError, 'hello', 'find', 42)
+
+ if self.contains_bytes:
+ self.checkequal(-1, 'hello', 'find', 42)
+ else:
+ self.checkraises(TypeError, 'hello', 'find', 42)
self.checkequal(0, '', 'find', '')
self.checkequal(-1, '', 'find', '', 1, 1)
@@ -216,7 +230,11 @@ class BaseTest(unittest.TestCase):
self.checkequal( 2, 'rrarrrrrrrrra', 'rfind', 'a', None, 6)
self.checkraises(TypeError, 'hello', 'rfind')
- self.checkraises(TypeError, 'hello', 'rfind', 42)
+
+ if self.contains_bytes:
+ self.checkequal(-1, 'hello', 'rfind', 42)
+ else:
+ self.checkraises(TypeError, 'hello', 'rfind', 42)
# For a variety of combinations,
# verify that str.rfind() matches __contains__
@@ -244,6 +262,9 @@ class BaseTest(unittest.TestCase):
# issue 7458
self.checkequal(-1, 'ab', 'rfind', 'xxx', sys.maxsize + 1, 0)
+ # issue #15534
+ self.checkequal(0, '<......\u043c...', "rfind", "<")
+
def test_index(self):
self.checkequal(0, 'abcdefghiabc', 'index', '')
self.checkequal(3, 'abcdefghiabc', 'index', 'def')
@@ -263,7 +284,11 @@ class BaseTest(unittest.TestCase):
self.checkequal( 2, 'rrarrrrrrrrra', 'index', 'a', None, 6)
self.checkraises(TypeError, 'hello', 'index')
- self.checkraises(TypeError, 'hello', 'index', 42)
+
+ if self.contains_bytes:
+ self.checkraises(ValueError, 'hello', 'index', 42)
+ else:
+ self.checkraises(TypeError, 'hello', 'index', 42)
def test_rindex(self):
self.checkequal(12, 'abcdefghiabc', 'rindex', '')
@@ -285,7 +310,11 @@ class BaseTest(unittest.TestCase):
self.checkequal( 2, 'rrarrrrrrrrra', 'rindex', 'a', None, 6)
self.checkraises(TypeError, 'hello', 'rindex')
- self.checkraises(TypeError, 'hello', 'rindex', 42)
+
+ if self.contains_bytes:
+ self.checkraises(ValueError, 'hello', 'rindex', 42)
+ else:
+ self.checkraises(TypeError, 'hello', 'rindex', 42)
def test_lower(self):
self.checkequal('hello', 'HeLLo', 'lower')
@@ -363,6 +392,17 @@ class BaseTest(unittest.TestCase):
self.checkequal(['a']*18 + ['aBLAHa'], ('aBLAH'*20)[:-4],
'split', 'BLAH', 18)
+ # with keyword args
+ self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'split', sep='|')
+ self.checkequal(['a', 'b|c|d'],
+ 'a|b|c|d', 'split', '|', maxsplit=1)
+ self.checkequal(['a', 'b|c|d'],
+ 'a|b|c|d', 'split', sep='|', maxsplit=1)
+ self.checkequal(['a', 'b|c|d'],
+ 'a|b|c|d', 'split', maxsplit=1, sep='|')
+ self.checkequal(['a', 'b c d'],
+ 'a b c d', 'split', maxsplit=1)
+
# argument type
self.checkraises(TypeError, 'hello', 'split', 42, 42, 42)
@@ -420,6 +460,17 @@ class BaseTest(unittest.TestCase):
self.checkequal(['aBLAHa'] + ['a']*18, ('aBLAH'*20)[:-4],
'rsplit', 'BLAH', 18)
+ # with keyword args
+ self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'rsplit', sep='|')
+ self.checkequal(['a|b|c', 'd'],
+ 'a|b|c|d', 'rsplit', '|', maxsplit=1)
+ self.checkequal(['a|b|c', 'd'],
+ 'a|b|c|d', 'rsplit', sep='|', maxsplit=1)
+ self.checkequal(['a|b|c', 'd'],
+ 'a|b|c|d', 'rsplit', maxsplit=1, sep='|')
+ self.checkequal(['a b c', 'd'],
+ 'a b c d', 'rsplit', maxsplit=1)
+
# argument type
self.checkraises(TypeError, 'hello', 'rsplit', 42, 42, 42)
@@ -549,6 +600,8 @@ class BaseTest(unittest.TestCase):
EQ("ReyKKjavik", "Reykjavik", "replace", "k", "KK", 1)
EQ("Reykjavik", "Reykjavik", "replace", "k", "KK", 0)
EQ("A----B----C----", "A.B.C.", "replace", ".", "----")
+ # issue #15534
+ EQ('...\u043c......&lt;', '...\u043c......<', "replace", "<", "&lt;")
EQ("Reykjavik", "Reykjavik", "replace", "q", "KK")
@@ -643,7 +696,7 @@ class CommonTest(BaseTest):
# check that titlecased chars are lowered correctly
# \u1ffc is the titlecased char
- self.checkequal('\u1ffc\u1ff3\u1ff3\u1ff3',
+ self.checkequal('\u03a9\u0399\u1ff3\u1ff3\u1ff3',
'\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize')
# check with cased non-letter chars
self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd',
@@ -908,7 +961,14 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(['abc', 'def', 'ghi'], "abc\ndef\r\nghi\n", 'splitlines')
self.checkequal(['abc', 'def', 'ghi', ''], "abc\ndef\r\nghi\n\r", 'splitlines')
self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r", 'splitlines')
- self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'], "\nabc\ndef\r\nghi\n\r", 'splitlines', 1)
+ self.checkequal(['', 'abc', 'def', 'ghi', ''],
+ "\nabc\ndef\r\nghi\n\r", 'splitlines', False)
+ self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
+ "\nabc\ndef\r\nghi\n\r", 'splitlines', True)
+ self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r",
+ 'splitlines', keepends=False)
+ self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
+ "\nabc\ndef\r\nghi\n\r", 'splitlines', keepends=True)
self.checkraises(TypeError, 'abc', 'splitlines', 42, 42)
@@ -1142,6 +1202,10 @@ class MixinStrUnicodeUserStringTest:
self.checkraises(TypeError, '%10.*f', '__mod__', ('foo', 42.))
self.checkraises(ValueError, '%10', '__mod__', (42,))
+ # Outrageously large width or precision should raise ValueError.
+ self.checkraises(ValueError, '%%%df' % (2**64), '__mod__', (3.2))
+ self.checkraises(ValueError, '%%.%df' % (2**64), '__mod__', (3.2))
+
class X(object): pass
self.checkraises(TypeError, 'abc', '__mod__', X())
@@ -1260,6 +1324,9 @@ class MixinStrUnicodeUserStringTest:
self.assertRaisesRegex(TypeError, r'^endswith\(', s.endswith,
x, None, None, None)
+ # issue #15534
+ self.checkequal(10, "...\u043c......<", "find", "<")
+
class MixinStrUnicodeTest:
# Additional tests that only work with str and unicode.
diff --git a/Lib/test/support.py b/Lib/test/support.py
index e1ec9e2..c5640e0 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -15,7 +15,7 @@ import shutil
import warnings
import unittest
import importlib
-import collections
+import collections.abc
import re
import subprocess
import imp
@@ -37,26 +37,41 @@ try:
except ImportError:
multiprocessing = None
+try:
+ import zlib
+except ImportError:
+ zlib = None
+
+try:
+ import bz2
+except ImportError:
+ bz2 = None
+
+try:
+ import lzma
+except ImportError:
+ lzma = None
__all__ = [
- "Error", "TestFailed", "ResourceDenied", "import_module",
- "verbose", "use_resources", "max_memuse", "record_original_stdout",
+ "Error", "TestFailed", "ResourceDenied", "import_module", "verbose",
+ "use_resources", "max_memuse", "record_original_stdout",
"get_original_stdout", "unload", "unlink", "rmtree", "forget",
- "is_resource_enabled", "requires", "requires_mac_ver",
- "find_unused_port", "bind_port",
- "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
- "findfile", "sortdict", "check_syntax_error", "open_urlresource",
- "check_warnings", "CleanImport", "EnvironmentVarGuard",
- "TransientResource", "captured_output", "captured_stdout",
- "captured_stdin", "captured_stderr",
- "time_out", "socket_peer_reset", "ioerror_peer_reset",
- "run_with_locale", 'temp_umask', "transient_internet",
- "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
- "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
- "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
- "swap_item", "swap_attr", "requires_IEEE_754",
+ "is_resource_enabled", "requires", "requires_freebsd_version",
+ "requires_linux_version", "requires_mac_ver", "find_unused_port",
+ "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD",
+ "temp_cwd", "findfile", "create_empty_file", "sortdict",
+ "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport",
+ "EnvironmentVarGuard", "TransientResource", "captured_stdout",
+ "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset",
+ "ioerror_peer_reset", "run_with_locale", 'temp_umask',
+ "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest",
+ "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
+ "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail",
+ "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
"TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
- "import_fresh_module", "failfast", "run_with_tz"
+ "skip_unless_xattr", "import_fresh_module", "requires_zlib",
+ "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
+ "requires_bz2", "requires_lzma"
]
class Error(Exception):
@@ -127,6 +142,17 @@ def _save_and_block_module(name, orig_modules):
return saved
+def anticipate_failure(condition):
+ """Decorator to mark a test that is known to be broken in some cases
+
+ Any use of this decorator should have a comment identifying the
+ associated tracker issue.
+ """
+ if condition:
+ return unittest.expectedFailure
+ return lambda f: f
+
+
def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
"""Imports and returns a module, deliberately bypassing the sys.modules cache
and importing a fresh copy of the module. Once the import is complete,
@@ -170,8 +196,7 @@ def get_attribute(obj, name):
try:
attribute = getattr(obj, name)
except AttributeError:
- raise unittest.SkipTest("module %s has no attribute %s" % (
- obj.__name__, name))
+ raise unittest.SkipTest("object %r has no attribute %r" % (obj, name))
else:
return attribute
@@ -276,8 +301,7 @@ def rmtree(path):
try:
_rmtree(path)
except OSError as error:
- # Unix returns ENOENT, Windows returns ESRCH.
- if error.errno not in (errno.ENOENT, errno.ESRCH):
+ if error.errno != errno.ENOENT:
raise
def make_legacy_pyc(source):
@@ -362,9 +386,52 @@ def requires(resource, msg=None):
return
if not is_resource_enabled(resource):
if msg is None:
- msg = "Use of the `%s' resource not enabled" % resource
+ msg = "Use of the %r resource not enabled" % resource
raise ResourceDenied(msg)
+def _requires_unix_version(sysname, min_version):
+ """Decorator raising SkipTest if the OS is `sysname` and the version is less
+ than `min_version`.
+
+ For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
+ the FreeBSD version is less than 7.2.
+ """
+ def decorator(func):
+ @functools.wraps(func)
+ def wrapper(*args, **kw):
+ if platform.system() == sysname:
+ version_txt = platform.release().split('-', 1)[0]
+ try:
+ version = tuple(map(int, version_txt.split('.')))
+ except ValueError:
+ pass
+ else:
+ if version < min_version:
+ min_version_txt = '.'.join(map(str, min_version))
+ raise unittest.SkipTest(
+ "%s version %s or higher required, not %s"
+ % (sysname, min_version_txt, version_txt))
+ return wrapper
+ return decorator
+
+def requires_freebsd_version(*min_version):
+ """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is
+ less than `min_version`.
+
+ For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD
+ version is less than 7.2.
+ """
+ return _requires_unix_version('FreeBSD', min_version)
+
+def requires_linux_version(*min_version):
+ """Decorator raising SkipTest if the OS is Linux and the Linux version is
+ less than `min_version`.
+
+ For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux
+ version is less than 2.6.32.
+ """
+ return _requires_unix_version('Linux', min_version)
+
def requires_mac_ver(*min_version):
"""Decorator raising SkipTest if the OS is Mac OS X and the OS X
version if less than min_version.
@@ -392,6 +459,7 @@ def requires_mac_ver(*min_version):
return wrapper
return decorator
+
HOST = 'localhost'
def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
@@ -487,29 +555,41 @@ def bind_port(sock, host=HOST):
port = sock.getsockname()[1]
return port
-FUZZ = 1e-6
-
-def fcmp(x, y): # fuzzy comparison function
- if isinstance(x, float) or isinstance(y, float):
+def _is_ipv6_enabled():
+ """Check whether IPv6 is enabled on this host."""
+ if socket.has_ipv6:
+ sock = None
try:
- fuzz = (abs(x) + abs(y)) * FUZZ
- if abs(x-y) <= fuzz:
- return 0
- except:
+ sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
+ sock.bind(('::1', 0))
+ return True
+ except (socket.error, socket.gaierror):
pass
- elif type(x) == type(y) and isinstance(x, (tuple, list)):
- for i in range(min(len(x), len(y))):
- outcome = fcmp(x[i], y[i])
- if outcome != 0:
- return outcome
- return (len(x) > len(y)) - (len(x) < len(y))
- return (x > y) - (x < y)
+ finally:
+ if sock:
+ sock.close()
+ return False
+
+IPV6_ENABLED = _is_ipv6_enabled()
+
+
+# A constant likely larger than the underlying OS pipe buffer size.
+# Windows limit seems to be around 512B, and most Unix kernels have a 64K pipe
+# buffer size: take 1M to be sure.
+PIPE_MAX_SIZE = 1024 * 1024
+
# decorator for skipping tests on non-IEEE 754 platforms
requires_IEEE_754 = unittest.skipUnless(
float.__getformat__("double").startswith("IEEE"),
"test requires IEEE 754 doubles")
+requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
+
+requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
+
+requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
+
is_jython = sys.platform.startswith('java')
# Filename used for testing
@@ -610,14 +690,15 @@ def temp_cwd(name='tempcwd', quiet=False, path=None):
rmtree(name)
-@contextlib.contextmanager
-def temp_umask(umask):
- """Context manager that temporarily sets the process umask."""
- oldmask = os.umask(umask)
- try:
- yield
- finally:
- os.umask(oldmask)
+if hasattr(os, "umask"):
+ @contextlib.contextmanager
+ def temp_umask(umask):
+ """Context manager that temporarily sets the process umask."""
+ oldmask = os.umask(umask)
+ try:
+ yield
+ finally:
+ os.umask(oldmask)
def findfile(file, here=__file__, subdir=None):
@@ -635,6 +716,11 @@ def findfile(file, here=__file__, subdir=None):
if os.path.exists(fn): return fn
return file
+def create_empty_file(filename):
+ """Create an empty file. If the file already exists, truncate it."""
+ fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
+ os.close(fd)
+
def sortdict(dict):
"Like repr(dict), but in sorted order."
items = sorted(dict.items())
@@ -699,7 +785,7 @@ def open_urlresource(url, *args, **kw):
f = check_valid_file(fn)
if f is not None:
return f
- raise TestFailed('invalid resource "%s"' % fn)
+ raise TestFailed('invalid resource %r' % fn)
class WarningsRecorder(object):
@@ -820,7 +906,7 @@ class CleanImport(object):
sys.modules.update(self.original_modules)
-class EnvironmentVarGuard(collections.MutableMapping):
+class EnvironmentVarGuard(collections.abc.MutableMapping):
"""Class to help protect the environment variable properly. Can be used as
a context manager."""
@@ -951,7 +1037,7 @@ def transient_internet(resource_name, *, timeout=30.0, errnos=()):
('WSANO_DATA', 11004),
]
- denied = ResourceDenied("Resource '%s' is not available" % resource_name)
+ denied = ResourceDenied("Resource %r is not available" % resource_name)
captured_errnos = errnos
gai_errnos = []
if not captured_errnos:
@@ -1040,6 +1126,16 @@ def gc_collect():
gc.collect()
gc.collect()
+@contextlib.contextmanager
+def disable_gc():
+ have_gc = gc.isenabled()
+ gc.disable()
+ try:
+ yield
+ finally:
+ if have_gc:
+ gc.enable()
+
def python_is_optimized():
"""Find if Python was built with optimizations."""
@@ -1048,19 +1144,21 @@ def python_is_optimized():
for opt in cflags.split():
if opt.startswith('-O'):
final_opt = opt
- return final_opt and final_opt != '-O0'
+ return final_opt != '' and final_opt != '-O0'
-_header = '2P'
+_header = 'nP'
+_align = '0n'
if hasattr(sys, "gettotalrefcount"):
_header = '2P' + _header
-_vheader = _header + 'P'
+ _align = '0P'
+_vheader = _header + 'n'
def calcobjsize(fmt):
- return struct.calcsize(_header + fmt + '0P')
+ return struct.calcsize(_header + fmt + _align)
def calcvobjsize(fmt):
- return struct.calcsize(_vheader + fmt + '0P')
+ return struct.calcsize(_vheader + fmt + _align)
_TPFLAGS_HAVE_GC = 1<<14
@@ -1134,7 +1232,7 @@ def run_with_tz(tz):
try:
return func(*args, **kwds)
finally:
- if orig_tz == None:
+ if orig_tz is None:
del os.environ['TZ']
else:
os.environ['TZ'] = orig_tz
@@ -1179,41 +1277,35 @@ def set_memlimit(limit):
raise ValueError('Memory limit %r too low to be useful' % (limit,))
max_memuse = memlimit
-def _memory_watchdog(start_evt, finish_evt, period=10.0):
- """A function which periodically watches the process' memory consumption
+class _MemoryWatchdog:
+ """An object which periodically watches the process' memory consumption
and prints it out.
"""
- # XXX: because of the GIL, and because the very long operations tested
- # in most bigmem tests are uninterruptible, the loop below gets woken up
- # much less often than expected.
- # The polling code should be rewritten in raw C, without holding the GIL,
- # and push results onto an anonymous pipe.
- try:
- page_size = os.sysconf('SC_PAGESIZE')
- except (ValueError, AttributeError):
+
+ def __init__(self):
+ self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
+ self.started = False
+
+ def start(self):
try:
- page_size = os.sysconf('SC_PAGE_SIZE')
- except (ValueError, AttributeError):
- page_size = 4096
- procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
- try:
- f = open(procfile, 'rb')
- except IOError as e:
- warnings.warn('/proc not available for stats: {}'.format(e),
- RuntimeWarning)
- sys.stderr.flush()
- return
- with f:
- start_evt.set()
- old_data = -1
- while not finish_evt.wait(period):
- f.seek(0)
- statm = f.read().decode('ascii')
- data = int(statm.split()[5])
- if data != old_data:
- old_data = data
- print(" ... process data size: {data:.1f}G"
- .format(data=data * page_size / (1024 ** 3)))
+ f = open(self.procfile, 'r')
+ except OSError as e:
+ warnings.warn('/proc not available for stats: {}'.format(e),
+ RuntimeWarning)
+ sys.stderr.flush()
+ return
+
+ watchdog_script = findfile("memory_watchdog.py")
+ self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
+ stdin=f, stderr=subprocess.DEVNULL)
+ f.close()
+ self.started = True
+
+ def stop(self):
+ if self.started:
+ self.mem_watchdog.terminate()
+ self.mem_watchdog.wait()
+
def bigmemtest(size, memuse, dry_run=True):
"""Decorator for bigmem tests.
@@ -1240,27 +1332,20 @@ def bigmemtest(size, memuse, dry_run=True):
"not enough memory: %.1fG minimum needed"
% (size * memuse / (1024 ** 3)))
- if real_max_memuse and verbose and threading:
+ if real_max_memuse and verbose:
print()
print(" ... expected peak memory use: {peak:.1f}G"
.format(peak=size * memuse / (1024 ** 3)))
- sys.stdout.flush()
- start_evt = threading.Event()
- finish_evt = threading.Event()
- t = threading.Thread(target=_memory_watchdog,
- args=(start_evt, finish_evt, 0.5))
- t.daemon = True
- t.start()
- start_evt.set()
+ watchdog = _MemoryWatchdog()
+ watchdog.start()
else:
- t = None
+ watchdog = None
try:
return f(self, maxsize)
finally:
- if t:
- finish_evt.set()
- t.join()
+ if watchdog:
+ watchdog.stop()
wrapper.size = size
wrapper.memuse = memuse
@@ -1342,6 +1427,33 @@ def check_impl_detail(**guards):
return guards.get(platform.python_implementation().lower(), default)
+def no_tracing(func):
+ """Decorator to temporarily turn off tracing for the duration of a test."""
+ if not hasattr(sys, 'gettrace'):
+ return func
+ else:
+ @functools.wraps(func)
+ def wrapper(*args, **kwargs):
+ original_trace = sys.gettrace()
+ try:
+ sys.settrace(None)
+ return func(*args, **kwargs)
+ finally:
+ sys.settrace(original_trace)
+ return wrapper
+
+
+def refcount_test(test):
+ """Decorator for tests which involve reference counting.
+
+ To start, the decorator does not run the test if is not run by CPython.
+ After that, any trace function is unset during the test to prevent
+ unexpected refcounts caused by the trace function.
+
+ """
+ return no_tracing(cpython_only(test))
+
+
def _filter_suite(suite, pred):
"""Recursively filter test cases in a suite based on a predicate."""
newtests = []
@@ -1354,7 +1466,6 @@ def _filter_suite(suite, pred):
newtests.append(test)
suite._tests = newtests
-
def _run_suite(suite):
"""Run tests from a unittest.TestSuite-derived class."""
if verbose:
@@ -1403,7 +1514,7 @@ def run_unittest(*classes):
#=======================================================================
# doctest driver.
-def run_doctest(module, verbosity=None):
+def run_doctest(module, verbosity=None, optionflags=0):
"""Run doctest on the given module. Return (#failures, #tests).
If optional argument verbosity is not specified (or is None), pass
@@ -1418,7 +1529,7 @@ def run_doctest(module, verbosity=None):
else:
verbosity = None
- f, t = doctest.testmod(module, verbose=verbosity)
+ f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
if f:
raise TestFailed("%d of %d doctests failed" % (f, t))
if verbose:
@@ -1576,28 +1687,13 @@ def strip_python_stderr(stderr):
This will typically be run on the result of the communicate() method
of a subprocess.Popen object.
"""
- stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
+ stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip()
return stderr
def args_from_interpreter_flags():
"""Return a list of command-line arguments reproducing the current
- settings in sys.flags."""
- flag_opt_map = {
- 'bytes_warning': 'b',
- 'dont_write_bytecode': 'B',
- 'hash_randomization': 'R',
- 'ignore_environment': 'E',
- 'no_user_site': 's',
- 'no_site': 'S',
- 'optimize': 'O',
- 'verbose': 'v',
- }
- args = []
- for flag, opt in flag_opt_map.items():
- v = getattr(sys.flags, flag)
- if v > 0:
- args.append('-' + opt * v)
- return args
+ settings in sys.flags and sys.warnoptions."""
+ return subprocess._args_from_interpreter_flags()
#============================================================
# Support for assertions about logging.
@@ -1687,6 +1783,40 @@ def skip_unless_symlink(test):
msg = "Requires functional symlink implementation"
return test if ok else unittest.skip(msg)(test)
+_can_xattr = None
+def can_xattr():
+ global _can_xattr
+ if _can_xattr is not None:
+ return _can_xattr
+ if not hasattr(os, "setxattr"):
+ can = False
+ else:
+ tmp_fp, tmp_name = tempfile.mkstemp()
+ try:
+ with open(TESTFN, "wb") as fp:
+ try:
+ # TESTFN & tempfile may use different file systems with
+ # different capabilities
+ os.setxattr(tmp_fp, b"user.test", b"")
+ os.setxattr(fp.fileno(), b"user.test", b"")
+ # Kernels < 2.6.39 don't respect setxattr flags.
+ kernel_version = platform.release()
+ m = re.match("2.6.(\d{1,2})", kernel_version)
+ can = m is None or int(m.group(1)) >= 39
+ except OSError:
+ can = False
+ finally:
+ unlink(TESTFN)
+ unlink(tmp_name)
+ _can_xattr = can
+ return can
+
+def skip_unless_xattr(test):
+ """Skip decorator for tests that require functional extended attributes"""
+ ok = can_xattr()
+ msg = "no non-broken extended attribute support"
+ return test if ok else unittest.skip(msg)(test)
+
def patch(test_instance, object_to_patch, attr_name, new_value):
"""Override 'object_to_patch'.'attr_name' with 'new_value'.
diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py
index 3fadb57..4231f37 100644
--- a/Lib/test/test__locale.py
+++ b/Lib/test/test__locale.py
@@ -1,23 +1,25 @@
-from test.support import run_unittest
from _locale import (setlocale, LC_ALL, LC_CTYPE, LC_NUMERIC, localeconv, Error)
try:
from _locale import (RADIXCHAR, THOUSEP, nl_langinfo)
except ImportError:
nl_langinfo = None
-import unittest
+import codecs
+import locale
import sys
+import unittest
from platform import uname
+from test.support import run_unittest
-if uname()[0] == "Darwin":
- maj, min, mic = [int(part) for part in uname()[2].split(".")]
+if uname().system == "Darwin":
+ maj, min, mic = [int(part) for part in uname().release.split(".")]
if (maj, min, mic) < (8, 0, 0):
raise unittest.SkipTest("locale support broken for OS X < 10.4")
candidate_locales = ['es_UY', 'fr_FR', 'fi_FI', 'es_CO', 'pt_PT', 'it_IT',
'et_EE', 'es_PY', 'no_NO', 'nl_NL', 'lv_LV', 'el_GR', 'be_BY', 'fr_BE',
'ro_RO', 'ru_UA', 'ru_RU', 'es_VE', 'ca_ES', 'se_NO', 'es_EC', 'id_ID',
- 'ka_GE', 'es_CL', 'hu_HU', 'wa_BE', 'lt_LT', 'sl_SI', 'hr_HR', 'es_AR',
+ 'ka_GE', 'es_CL', 'wa_BE', 'hu_HU', 'lt_LT', 'sl_SI', 'hr_HR', 'es_AR',
'es_ES', 'oc_FR', 'gl_ES', 'bg_BG', 'is_IS', 'mk_MK', 'de_AT', 'pt_BR',
'da_DK', 'nn_NO', 'cs_CZ', 'de_LU', 'es_BO', 'sq_AL', 'sk_SK', 'fr_CH',
'de_DE', 'sr_YU', 'br_FR', 'nl_BE', 'sv_FI', 'pl_PL', 'fr_CA', 'fo_FO',
@@ -25,6 +27,31 @@ candidate_locales = ['es_UY', 'fr_FR', 'fi_FI', 'es_CO', 'pt_PT', 'it_IT',
'eu_ES', 'vi_VN', 'af_ZA', 'nb_NO', 'en_DK', 'tg_TJ', 'en_US',
'es_ES.ISO8859-1', 'fr_FR.ISO8859-15', 'ru_RU.KOI8-R', 'ko_KR.eucKR']
+# Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to
+# workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses
+# the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is
+# decoded as U+30000020 (an invalid character) by mbstowcs().
+if sys.platform == 'sunos5':
+ old_locale = locale.setlocale(locale.LC_ALL)
+ try:
+ locales = []
+ for loc in candidate_locales:
+ try:
+ locale.setlocale(locale.LC_ALL, loc)
+ except Error:
+ continue
+ encoding = locale.getpreferredencoding(False)
+ try:
+ localeconv()
+ except Exception as err:
+ print("WARNING: Skip locale %s (encoding %s): [%s] %s"
+ % (loc, encoding, type(err), err))
+ else:
+ locales.append(loc)
+ candidate_locales = locales
+ finally:
+ locale.setlocale(locale.LC_ALL, old_locale)
+
# Workaround for MSVC6(debug) crash bug
if "MSC v.1200" in sys.version:
def accept(loc):
@@ -86,9 +113,10 @@ class _LocaleTests(unittest.TestCase):
setlocale(LC_CTYPE, loc)
except Error:
continue
+ formatting = localeconv()
for lc in ("decimal_point",
"thousands_sep"):
- self.numeric_tester('localeconv', localeconv()[lc], lc, loc)
+ self.numeric_tester('localeconv', formatting[lc], lc, loc)
@unittest.skipUnless(nl_langinfo, "nl_langinfo is not available")
def test_lc_numeric_basic(self):
diff --git a/Lib/test/test__osx_support.py b/Lib/test/test__osx_support.py
new file mode 100644
index 0000000..fb159ec
--- /dev/null
+++ b/Lib/test/test__osx_support.py
@@ -0,0 +1,279 @@
+"""
+Test suite for _osx_support: shared OS X support functions.
+"""
+
+import os
+import platform
+import shutil
+import stat
+import sys
+import unittest
+
+import test.support
+
+import _osx_support
+
+@unittest.skipUnless(sys.platform.startswith("darwin"), "requires OS X")
+class Test_OSXSupport(unittest.TestCase):
+
+ def setUp(self):
+ self.maxDiff = None
+ self.prog_name = 'bogus_program_xxxx'
+ self.temp_path_dir = os.path.abspath(os.getcwd())
+ self.env = test.support.EnvironmentVarGuard()
+ self.addCleanup(self.env.__exit__)
+ for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS',
+ 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC',
+ 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
+ 'PY_CORE_CFLAGS'):
+ if cv in self.env:
+ self.env.unset(cv)
+
+ def add_expected_saved_initial_values(self, config_vars, expected_vars):
+ # Ensure that the initial values for all modified config vars
+ # are also saved with modified keys.
+ expected_vars.update(('_OSX_SUPPORT_INITIAL_'+ k,
+ config_vars[k]) for k in config_vars
+ if config_vars[k] != expected_vars[k])
+
+ def test__find_executable(self):
+ if self.env['PATH']:
+ self.env['PATH'] = self.env['PATH'] + ':'
+ self.env['PATH'] = self.env['PATH'] + os.path.abspath(self.temp_path_dir)
+ test.support.unlink(self.prog_name)
+ self.assertIsNone(_osx_support._find_executable(self.prog_name))
+ self.addCleanup(test.support.unlink, self.prog_name)
+ with open(self.prog_name, 'w') as f:
+ f.write("#!/bin/sh\n/bin/echo OK\n")
+ os.chmod(self.prog_name, stat.S_IRWXU)
+ self.assertEqual(self.prog_name,
+ _osx_support._find_executable(self.prog_name))
+
+ def test__read_output(self):
+ if self.env['PATH']:
+ self.env['PATH'] = self.env['PATH'] + ':'
+ self.env['PATH'] = self.env['PATH'] + os.path.abspath(self.temp_path_dir)
+ test.support.unlink(self.prog_name)
+ self.addCleanup(test.support.unlink, self.prog_name)
+ with open(self.prog_name, 'w') as f:
+ f.write("#!/bin/sh\n/bin/echo ExpectedOutput\n")
+ os.chmod(self.prog_name, stat.S_IRWXU)
+ self.assertEqual('ExpectedOutput',
+ _osx_support._read_output(self.prog_name))
+
+ def test__find_build_tool(self):
+ out = _osx_support._find_build_tool('cc')
+ self.assertTrue(os.path.isfile(out),
+ 'cc not found - check xcode-select')
+
+ def test__get_system_version(self):
+ self.assertTrue(platform.mac_ver()[0].startswith(
+ _osx_support._get_system_version()))
+
+ def test__remove_original_values(self):
+ config_vars = {
+ 'CC': 'gcc-test -pthreads',
+ }
+ expected_vars = {
+ 'CC': 'clang -pthreads',
+ }
+ cv = 'CC'
+ newvalue = 'clang -pthreads'
+ _osx_support._save_modified_value(config_vars, cv, newvalue)
+ self.assertNotEqual(expected_vars, config_vars)
+ _osx_support._remove_original_values(config_vars)
+ self.assertEqual(expected_vars, config_vars)
+
+ def test__save_modified_value(self):
+ config_vars = {
+ 'CC': 'gcc-test -pthreads',
+ }
+ expected_vars = {
+ 'CC': 'clang -pthreads',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+ cv = 'CC'
+ newvalue = 'clang -pthreads'
+ _osx_support._save_modified_value(config_vars, cv, newvalue)
+ self.assertEqual(expected_vars, config_vars)
+
+ def test__save_modified_value_unchanged(self):
+ config_vars = {
+ 'CC': 'gcc-test -pthreads',
+ }
+ expected_vars = config_vars.copy()
+ cv = 'CC'
+ newvalue = 'gcc-test -pthreads'
+ _osx_support._save_modified_value(config_vars, cv, newvalue)
+ self.assertEqual(expected_vars, config_vars)
+
+ def test__supports_universal_builds(self):
+ import platform
+ self.assertEqual(platform.mac_ver()[0].split('.') >= ['10', '4'],
+ _osx_support._supports_universal_builds())
+
+ def test__find_appropriate_compiler(self):
+ compilers = (
+ ('gcc-test', 'i686-apple-darwin11-llvm-gcc-4.2'),
+ ('clang', 'clang version 3.1'),
+ )
+ config_vars = {
+ 'CC': 'gcc-test -pthreads',
+ 'CXX': 'cc++-test',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-test -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-test -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ expected_vars = {
+ 'CC': 'clang -pthreads',
+ 'CXX': 'clang++',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'clang -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'clang -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+
+ suffix = (':' + self.env['PATH']) if self.env['PATH'] else ''
+ self.env['PATH'] = os.path.abspath(self.temp_path_dir) + suffix
+ for c_name, c_output in compilers:
+ test.support.unlink(c_name)
+ self.addCleanup(test.support.unlink, c_name)
+ with open(c_name, 'w') as f:
+ f.write("#!/bin/sh\n/bin/echo " + c_output)
+ os.chmod(c_name, stat.S_IRWXU)
+ self.assertEqual(expected_vars,
+ _osx_support._find_appropriate_compiler(
+ config_vars))
+
+ def test__remove_universal_flags(self):
+ config_vars = {
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ expected_vars = {
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 ',
+ 'LDFLAGS': ' -g',
+ 'CPPFLAGS': '-I. ',
+ 'BLDSHARED': 'gcc-4.0 -bundle -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -g',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+
+ self.assertEqual(expected_vars,
+ _osx_support._remove_universal_flags(
+ config_vars))
+
+ def test__remove_unsupported_archs(self):
+ config_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ expected_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch i386 ',
+ 'LDFLAGS': ' -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+
+ suffix = (':' + self.env['PATH']) if self.env['PATH'] else ''
+ self.env['PATH'] = os.path.abspath(self.temp_path_dir) + suffix
+ c_name = 'clang'
+ test.support.unlink(c_name)
+ self.addCleanup(test.support.unlink, c_name)
+ # exit status 255 means no PPC support in this compiler chain
+ with open(c_name, 'w') as f:
+ f.write("#!/bin/sh\nexit 255")
+ os.chmod(c_name, stat.S_IRWXU)
+ self.assertEqual(expected_vars,
+ _osx_support._remove_unsupported_archs(
+ config_vars))
+
+ def test__override_all_archs(self):
+ self.env['ARCHFLAGS'] = '-arch x86_64'
+ config_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -g',
+ }
+ expected_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch x86_64',
+ 'LDFLAGS': ' -g -arch x86_64',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.4u.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -g -arch x86_64',
+ 'LDSHARED': 'gcc-4.0 -bundle -isysroot '
+ '/Developer/SDKs/MacOSX10.4u.sdk -g -arch x86_64',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+
+ self.assertEqual(expected_vars,
+ _osx_support._override_all_archs(
+ config_vars))
+
+ def test__check_for_unavailable_sdk(self):
+ config_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.1.sdk',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. -isysroot /Developer/SDKs/MacOSX10.1.sdk',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.1.sdk -g',
+ }
+ expected_vars = {
+ 'CC': 'clang',
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 '
+ ' ',
+ 'LDFLAGS': '-arch ppc -arch i386 -g',
+ 'CPPFLAGS': '-I. ',
+ 'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
+ 'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
+ ' -g',
+ }
+ self.add_expected_saved_initial_values(config_vars, expected_vars)
+
+ self.assertEqual(expected_vars,
+ _osx_support._check_for_unavailable_sdk(
+ config_vars))
+
+ def test_get_platform_osx(self):
+ # Note, get_platform_osx is currently tested more extensively
+ # indirectly by test_sysconfig and test_distutils
+ config_vars = {
+ 'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 '
+ '-isysroot /Developer/SDKs/MacOSX10.1.sdk',
+ 'MACOSX_DEPLOYMENT_TARGET': '10.6',
+ }
+ result = _osx_support.get_platform_osx(config_vars, ' ', ' ', ' ')
+ self.assertEqual(('macosx', '10.6', 'fat'), result)
+
+def test_main():
+ if sys.platform == 'darwin':
+ test.support.run_unittest(Test_OSXSupport)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py
index d86f97c..653c957 100644
--- a/Lib/test/test_abc.py
+++ b/Lib/test/test_abc.py
@@ -10,14 +10,7 @@ import abc
from inspect import isabstract
-class TestABC(unittest.TestCase):
-
- def test_abstractmethod_basics(self):
- @abc.abstractmethod
- def foo(self): pass
- self.assertTrue(foo.__isabstractmethod__)
- def bar(self): pass
- self.assertFalse(hasattr(bar, "__isabstractmethod__"))
+class TestLegacyAPI(unittest.TestCase):
def test_abstractproperty_basics(self):
@abc.abstractproperty
@@ -29,10 +22,12 @@ class TestABC(unittest.TestCase):
class C(metaclass=abc.ABCMeta):
@abc.abstractproperty
def foo(self): return 3
+ self.assertRaises(TypeError, C)
class D(C):
@property
def foo(self): return super().foo
self.assertEqual(D().foo, 3)
+ self.assertFalse(getattr(D.foo, "__isabstractmethod__", False))
def test_abstractclassmethod_basics(self):
@abc.abstractclassmethod
@@ -40,7 +35,7 @@ class TestABC(unittest.TestCase):
self.assertTrue(foo.__isabstractmethod__)
@classmethod
def bar(cls): pass
- self.assertFalse(hasattr(bar, "__isabstractmethod__"))
+ self.assertFalse(getattr(bar, "__isabstractmethod__", False))
class C(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
@@ -58,7 +53,7 @@ class TestABC(unittest.TestCase):
self.assertTrue(foo.__isabstractmethod__)
@staticmethod
def bar(): pass
- self.assertFalse(hasattr(bar, "__isabstractmethod__"))
+ self.assertFalse(getattr(bar, "__isabstractmethod__", False))
class C(metaclass=abc.ABCMeta):
@abc.abstractstaticmethod
@@ -98,6 +93,163 @@ class TestABC(unittest.TestCase):
self.assertRaises(TypeError, F) # because bar is abstract now
self.assertTrue(isabstract(F))
+
+class TestABC(unittest.TestCase):
+
+ def test_abstractmethod_basics(self):
+ @abc.abstractmethod
+ def foo(self): pass
+ self.assertTrue(foo.__isabstractmethod__)
+ def bar(self): pass
+ self.assertFalse(hasattr(bar, "__isabstractmethod__"))
+
+ def test_abstractproperty_basics(self):
+ @property
+ @abc.abstractmethod
+ def foo(self): pass
+ self.assertTrue(foo.__isabstractmethod__)
+ def bar(self): pass
+ self.assertFalse(getattr(bar, "__isabstractmethod__", False))
+
+ class C(metaclass=abc.ABCMeta):
+ @property
+ @abc.abstractmethod
+ def foo(self): return 3
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @C.foo.getter
+ def foo(self): return super().foo
+ self.assertEqual(D().foo, 3)
+
+ def test_abstractclassmethod_basics(self):
+ @classmethod
+ @abc.abstractmethod
+ def foo(cls): pass
+ self.assertTrue(foo.__isabstractmethod__)
+ @classmethod
+ def bar(cls): pass
+ self.assertFalse(getattr(bar, "__isabstractmethod__", False))
+
+ class C(metaclass=abc.ABCMeta):
+ @classmethod
+ @abc.abstractmethod
+ def foo(cls): return cls.__name__
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @classmethod
+ def foo(cls): return super().foo()
+ self.assertEqual(D.foo(), 'D')
+ self.assertEqual(D().foo(), 'D')
+
+ def test_abstractstaticmethod_basics(self):
+ @staticmethod
+ @abc.abstractmethod
+ def foo(): pass
+ self.assertTrue(foo.__isabstractmethod__)
+ @staticmethod
+ def bar(): pass
+ self.assertFalse(getattr(bar, "__isabstractmethod__", False))
+
+ class C(metaclass=abc.ABCMeta):
+ @staticmethod
+ @abc.abstractmethod
+ def foo(): return 3
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @staticmethod
+ def foo(): return 4
+ self.assertEqual(D.foo(), 4)
+ self.assertEqual(D().foo(), 4)
+
+ def test_abstractmethod_integration(self):
+ for abstractthing in [abc.abstractmethod, abc.abstractproperty,
+ abc.abstractclassmethod,
+ abc.abstractstaticmethod]:
+ class C(metaclass=abc.ABCMeta):
+ @abstractthing
+ def foo(self): pass # abstract
+ def bar(self): pass # concrete
+ self.assertEqual(C.__abstractmethods__, {"foo"})
+ self.assertRaises(TypeError, C) # because foo is abstract
+ self.assertTrue(isabstract(C))
+ class D(C):
+ def bar(self): pass # concrete override of concrete
+ self.assertEqual(D.__abstractmethods__, {"foo"})
+ self.assertRaises(TypeError, D) # because foo is still abstract
+ self.assertTrue(isabstract(D))
+ class E(D):
+ def foo(self): pass
+ self.assertEqual(E.__abstractmethods__, set())
+ E() # now foo is concrete, too
+ self.assertFalse(isabstract(E))
+ class F(E):
+ @abstractthing
+ def bar(self): pass # abstract override of concrete
+ self.assertEqual(F.__abstractmethods__, {"bar"})
+ self.assertRaises(TypeError, F) # because bar is abstract now
+ self.assertTrue(isabstract(F))
+
+ def test_descriptors_with_abstractmethod(self):
+ class C(metaclass=abc.ABCMeta):
+ @property
+ @abc.abstractmethod
+ def foo(self): return 3
+ @foo.setter
+ @abc.abstractmethod
+ def foo(self, val): pass
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @C.foo.getter
+ def foo(self): return super().foo
+ self.assertRaises(TypeError, D)
+ class E(D):
+ @D.foo.setter
+ def foo(self, val): pass
+ self.assertEqual(E().foo, 3)
+ # check that the property's __isabstractmethod__ descriptor does the
+ # right thing when presented with a value that fails truth testing:
+ class NotBool(object):
+ def __nonzero__(self):
+ raise ValueError()
+ __len__ = __nonzero__
+ with self.assertRaises(ValueError):
+ class F(C):
+ def bar(self):
+ pass
+ bar.__isabstractmethod__ = NotBool()
+ foo = property(bar)
+
+
+ def test_customdescriptors_with_abstractmethod(self):
+ class Descriptor:
+ def __init__(self, fget, fset=None):
+ self._fget = fget
+ self._fset = fset
+ def getter(self, callable):
+ return Descriptor(callable, self._fget)
+ def setter(self, callable):
+ return Descriptor(self._fget, callable)
+ @property
+ def __isabstractmethod__(self):
+ return (getattr(self._fget, '__isabstractmethod__', False)
+ or getattr(self._fset, '__isabstractmethod__', False))
+ class C(metaclass=abc.ABCMeta):
+ @Descriptor
+ @abc.abstractmethod
+ def foo(self): return 3
+ @foo.setter
+ @abc.abstractmethod
+ def foo(self, val): pass
+ self.assertRaises(TypeError, C)
+ class D(C):
+ @C.foo.getter
+ def foo(self): return super().foo
+ self.assertRaises(TypeError, D)
+ class E(D):
+ @D.foo.setter
+ def foo(self, val): pass
+ self.assertFalse(E.foo.__isabstractmethod__)
+
def test_metaclass_abc(self):
# Metaclasses can be ABCs, too.
class A(metaclass=abc.ABCMeta):
@@ -121,11 +273,32 @@ class TestABC(unittest.TestCase):
self.assertFalse(issubclass(B, (A,)))
self.assertNotIsInstance(b, A)
self.assertNotIsInstance(b, (A,))
- A.register(B)
+ B1 = A.register(B)
+ self.assertTrue(issubclass(B, A))
+ self.assertTrue(issubclass(B, (A,)))
+ self.assertIsInstance(b, A)
+ self.assertIsInstance(b, (A,))
+ self.assertIs(B1, B)
+ class C(B):
+ pass
+ c = C()
+ self.assertTrue(issubclass(C, A))
+ self.assertTrue(issubclass(C, (A,)))
+ self.assertIsInstance(c, A)
+ self.assertIsInstance(c, (A,))
+
+ def test_register_as_class_deco(self):
+ class A(metaclass=abc.ABCMeta):
+ pass
+ @A.register
+ class B(object):
+ pass
+ b = B()
self.assertTrue(issubclass(B, A))
self.assertTrue(issubclass(B, (A,)))
self.assertIsInstance(b, A)
self.assertIsInstance(b, (A,))
+ @A.register
class C(B):
pass
c = C()
@@ -133,6 +306,7 @@ class TestABC(unittest.TestCase):
self.assertTrue(issubclass(C, (A,)))
self.assertIsInstance(c, A)
self.assertIsInstance(c, (A,))
+ self.assertIs(C, A.register(C))
def test_isinstance_invalidation(self):
class A(metaclass=abc.ABCMeta):
diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py
index 2a396cd..253e6f0 100644
--- a/Lib/test/test_abstract_numbers.py
+++ b/Lib/test/test_abstract_numbers.py
@@ -14,6 +14,7 @@ class TestNumbers(unittest.TestCase):
self.assertEqual(7, int(7).real)
self.assertEqual(0, int(7).imag)
self.assertEqual(7, int(7).conjugate())
+ self.assertEqual(-7, int(-7).conjugate())
self.assertEqual(7, int(7).numerator)
self.assertEqual(1, int(7).denominator)
@@ -24,6 +25,7 @@ class TestNumbers(unittest.TestCase):
self.assertEqual(7.3, float(7.3).real)
self.assertEqual(0, float(7.3).imag)
self.assertEqual(7.3, float(7.3).conjugate())
+ self.assertEqual(-7.3, float(-7.3).conjugate())
def test_complex(self):
self.assertFalse(issubclass(complex, Real))
diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py
index ee4ad6b..ad6f610 100644
--- a/Lib/test/test_aifc.py
+++ b/Lib/test/test_aifc.py
@@ -1,4 +1,4 @@
-from test.support import findfile, run_unittest, TESTFN, captured_stdout, unlink
+from test.support import findfile, run_unittest, TESTFN, unlink
import unittest
import os
import io
@@ -207,11 +207,8 @@ class AIFCLowLevelTest(unittest.TestCase):
b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8
b += b'MARK' + struct.pack('>LhB', 3, 1, 1)
- with captured_stdout() as s:
+ with self.assertWarns(UserWarning):
f = aifc.open(io.BytesIO(b))
- self.assertEqual(
- s.getvalue(),
- 'Warning: MARK chunk contains only 0 markers instead of 1\n')
self.assertEqual(f.getmarkers(), None)
def test_read_comm_kludge_compname_even(self):
@@ -219,9 +216,8 @@ class AIFCLowLevelTest(unittest.TestCase):
b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
b += b'NONE' + struct.pack('B', 4) + b'even' + b'\x00'
b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8
- with captured_stdout() as s:
+ with self.assertWarns(UserWarning):
f = aifc.open(io.BytesIO(b))
- self.assertEqual(s.getvalue(), 'Warning: bad COMM chunk size\n')
self.assertEqual(f.getcompname(), b'even')
def test_read_comm_kludge_compname_odd(self):
@@ -229,9 +225,8 @@ class AIFCLowLevelTest(unittest.TestCase):
b += b'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
b += b'NONE' + struct.pack('B', 3) + b'odd'
b += b'SSND' + struct.pack('>L', 8) + b'\x00' * 8
- with captured_stdout() as s:
+ with self.assertWarns(UserWarning):
f = aifc.open(io.BytesIO(b))
- self.assertEqual(s.getvalue(), 'Warning: bad COMM chunk size\n')
self.assertEqual(f.getcompname(), b'odd')
def test_write_params_raises(self):
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 22c26cc..c06c940 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -1323,20 +1323,21 @@ class TestParserDefaultSuppress(ParserTestCase):
class TestParserDefault42(ParserTestCase):
"""Test actions with a parser-level default of 42"""
- parser_signature = Sig(argument_default=42, version='1.0')
+ parser_signature = Sig(argument_default=42)
argument_signatures = [
+ Sig('--version', action='version', version='1.0'),
Sig('foo', nargs='?'),
Sig('bar', nargs='*'),
Sig('--baz', action='store_true'),
]
failures = ['-x']
successes = [
- ('', NS(foo=42, bar=42, baz=42)),
- ('a', NS(foo='a', bar=42, baz=42)),
- ('a b', NS(foo='a', bar=['b'], baz=42)),
- ('--baz', NS(foo=42, bar=42, baz=True)),
- ('a --baz', NS(foo='a', bar=42, baz=True)),
- ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
+ ('', NS(foo=42, bar=42, baz=42, version=42)),
+ ('a', NS(foo='a', bar=42, baz=42, version=42)),
+ ('a b', NS(foo='a', bar=['b'], baz=42, version=42)),
+ ('--baz', NS(foo=42, bar=42, baz=True, version=42)),
+ ('a --baz', NS(foo='a', bar=42, baz=True, version=42)),
+ ('--baz a b', NS(foo='a', bar=['b'], baz=True, version=42)),
]
@@ -2927,10 +2928,9 @@ class TestHelpFormattingMetaclass(type):
parser_text = sfile.getvalue()
self._test(tester, parser_text)
- # add tests for {format,print}_{usage,help,version}
+ # add tests for {format,print}_{usage,help}
for func_suffix, std_name in [('usage', 'stdout'),
- ('help', 'stdout'),
- ('version', 'stderr')]:
+ ('help', 'stdout')]:
AddTests(cls, func_suffix, std_name)
bases = TestCase,
@@ -2941,8 +2941,9 @@ class TestHelpBiggerOptionals(HelpTestCase):
"""Make sure that argument help aligns when options are longer"""
parser_signature = Sig(prog='PROG', description='DESCRIPTION',
- epilog='EPILOG', version='0.1')
+ epilog='EPILOG')
argument_signatures = [
+ Sig('-v', '--version', action='version', version='0.1'),
Sig('-x', action='store_true', help='X HELP'),
Sig('--y', help='Y HELP'),
Sig('foo', help='FOO HELP'),
@@ -2977,8 +2978,9 @@ class TestHelpBiggerOptionalGroups(HelpTestCase):
"""Make sure that argument help aligns when options are longer"""
parser_signature = Sig(prog='PROG', description='DESCRIPTION',
- epilog='EPILOG', version='0.1')
+ epilog='EPILOG')
argument_signatures = [
+ Sig('-v', '--version', action='version', version='0.1'),
Sig('-x', action='store_true', help='X HELP'),
Sig('--y', help='Y HELP'),
Sig('foo', help='FOO HELP'),
@@ -3145,9 +3147,9 @@ HHAAHHH
class TestHelpWrappingLongNames(HelpTestCase):
"""Make sure that text after long names starts on the next line"""
- parser_signature = Sig(usage='USAGE', description= 'D D' * 30,
- version='V V'*30)
+ parser_signature = Sig(usage='USAGE', description= 'D D' * 30)
argument_signatures = [
+ Sig('-v', '--version', action='version', version='V V' * 30),
Sig('-x', metavar='X' * 25, help='XH XH' * 20),
Sig('y', metavar='y' * 25, help='YH YH' * 20),
]
@@ -3750,8 +3752,9 @@ class TestHelpNoHelpOptional(HelpTestCase):
class TestHelpVersionOptional(HelpTestCase):
"""Test that the --version argument can be suppressed help messages"""
- parser_signature = Sig(prog='PROG', version='1.0')
+ parser_signature = Sig(prog='PROG')
argument_signatures = [
+ Sig('-v', '--version', action='version', version='1.0'),
Sig('--foo', help='foo help'),
Sig('spam', help='spam help'),
]
@@ -3984,8 +3987,8 @@ class TestHelpVersionAction(HelpTestCase):
class TestHelpSubparsersOrdering(HelpTestCase):
"""Test ordering of subcommands in help matches the code"""
parser_signature = Sig(prog='PROG',
- description='display some subcommands',
- version='0.1')
+ description='display some subcommands')
+ argument_signatures = [Sig('-v', '--version', action='version', version='0.1')]
subparsers_signatures = [Sig(name=name)
for name in ('a', 'b', 'c', 'd', 'e')]
@@ -4013,8 +4016,8 @@ class TestHelpSubparsersOrdering(HelpTestCase):
class TestHelpSubparsersWithHelpOrdering(HelpTestCase):
"""Test ordering of subcommands in help matches the code"""
parser_signature = Sig(prog='PROG',
- description='display some subcommands',
- version='0.1')
+ description='display some subcommands')
+ argument_signatures = [Sig('-v', '--version', action='version', version='0.1')]
subcommand_data = (('a', 'a subcommand help'),
('b', 'b subcommand help'),
@@ -4052,6 +4055,37 @@ class TestHelpSubparsersWithHelpOrdering(HelpTestCase):
'''
+
+class TestHelpMetavarTypeFormatter(HelpTestCase):
+ """"""
+
+ def custom_type(string):
+ return string
+
+ parser_signature = Sig(prog='PROG', description='description',
+ formatter_class=argparse.MetavarTypeHelpFormatter)
+ argument_signatures = [Sig('a', type=int),
+ Sig('-b', type=custom_type),
+ Sig('-c', type=float, metavar='SOME FLOAT')]
+ argument_group_signatures = []
+ usage = '''\
+ usage: PROG [-h] [-b custom_type] [-c SOME FLOAT] int
+ '''
+ help = usage + '''\
+
+ description
+
+ positional arguments:
+ int
+
+ optional arguments:
+ -h, --help show this help message and exit
+ -b custom_type
+ -c SOME FLOAT
+ '''
+ version = ''
+
+
# =====================================
# Optional/Positional constructor tests
# =====================================
@@ -4280,32 +4314,28 @@ class TestOptionalsHelpVersionActions(TestCase):
parser.format_help(),
self._get_error(parser.parse_args, args_str.split()).stdout)
- def assertPrintVersionExit(self, parser, args_str):
- self.assertEqual(
- parser.format_version(),
- self._get_error(parser.parse_args, args_str.split()).stderr)
-
def assertArgumentParserError(self, parser, *args):
self.assertRaises(ArgumentParserError, parser.parse_args, args)
def test_version(self):
- parser = ErrorRaisingArgumentParser(version='1.0')
+ parser = ErrorRaisingArgumentParser()
+ parser.add_argument('-v', '--version', action='version', version='1.0')
self.assertPrintHelpExit(parser, '-h')
self.assertPrintHelpExit(parser, '--help')
- self.assertPrintVersionExit(parser, '-v')
- self.assertPrintVersionExit(parser, '--version')
+ self.assertRaises(AttributeError, getattr, parser, 'format_version')
def test_version_format(self):
- parser = ErrorRaisingArgumentParser(prog='PPP', version='%(prog)s 3.5')
+ parser = ErrorRaisingArgumentParser(prog='PPP')
+ parser.add_argument('-v', '--version', action='version', version='%(prog)s 3.5')
msg = self._get_error(parser.parse_args, ['-v']).stderr
self.assertEqual('PPP 3.5\n', msg)
def test_version_no_help(self):
- parser = ErrorRaisingArgumentParser(add_help=False, version='1.0')
+ parser = ErrorRaisingArgumentParser(add_help=False)
+ parser.add_argument('-v', '--version', action='version', version='1.0')
self.assertArgumentParserError(parser, '-h')
self.assertArgumentParserError(parser, '--help')
- self.assertPrintVersionExit(parser, '-v')
- self.assertPrintVersionExit(parser, '--version')
+ self.assertRaises(AttributeError, getattr, parser, 'format_version')
def test_version_action(self):
parser = ErrorRaisingArgumentParser(prog='XXX')
@@ -4325,12 +4355,13 @@ class TestOptionalsHelpVersionActions(TestCase):
parser.add_argument('-x', action='help')
parser.add_argument('-y', action='version')
self.assertPrintHelpExit(parser, '-x')
- self.assertPrintVersionExit(parser, '-y')
self.assertArgumentParserError(parser, '-v')
self.assertArgumentParserError(parser, '--version')
+ self.assertRaises(AttributeError, getattr, parser, 'format_version')
def test_help_version_extra_arguments(self):
- parser = ErrorRaisingArgumentParser(version='1.0')
+ parser = ErrorRaisingArgumentParser()
+ parser.add_argument('--version', action='version', version='1.0')
parser.add_argument('-x', action='store_true')
parser.add_argument('y')
@@ -4342,8 +4373,7 @@ class TestOptionalsHelpVersionActions(TestCase):
format = '%s %%s %s' % (prefix, suffix)
self.assertPrintHelpExit(parser, format % '-h')
self.assertPrintHelpExit(parser, format % '--help')
- self.assertPrintVersionExit(parser, format % '-v')
- self.assertPrintVersionExit(parser, format % '--version')
+ self.assertRaises(AttributeError, getattr, parser, 'format_version')
# ======================
@@ -4398,7 +4428,7 @@ class TestStrings(TestCase):
parser = argparse.ArgumentParser(prog='PROG')
string = (
"ArgumentParser(prog='PROG', usage=None, description=None, "
- "version=None, formatter_class=%r, conflict_handler='error', "
+ "formatter_class=%r, conflict_handler='error', "
"add_help=True)" % argparse.HelpFormatter)
self.assertStringEqual(parser, string)
@@ -4442,7 +4472,7 @@ class TestEncoding(TestCase):
def _test_module_encoding(self, path):
path, _ = os.path.splitext(path)
path += ".py"
- with codecs.open(path, 'r', 'utf8') as f:
+ with codecs.open(path, 'r', 'utf-8') as f:
f.read()
def test_argparse_module_encoding(self):
@@ -4484,6 +4514,67 @@ class TestArgumentTypeError(TestCase):
else:
self.fail()
+# =========================
+# MessageContentError tests
+# =========================
+
+class TestMessageContentError(TestCase):
+
+ def test_missing_argument_name_in_message(self):
+ parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
+ parser.add_argument('req_pos', type=str)
+ parser.add_argument('-req_opt', type=int, required=True)
+ parser.add_argument('need_one', type=str, nargs='+')
+
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args([])
+ msg = str(cm.exception)
+ self.assertRegex(msg, 'req_pos')
+ self.assertRegex(msg, 'req_opt')
+ self.assertRegex(msg, 'need_one')
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args(['myXargument'])
+ msg = str(cm.exception)
+ self.assertNotIn(msg, 'req_pos')
+ self.assertRegex(msg, 'req_opt')
+ self.assertRegex(msg, 'need_one')
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args(['myXargument', '-req_opt=1'])
+ msg = str(cm.exception)
+ self.assertNotIn(msg, 'req_pos')
+ self.assertNotIn(msg, 'req_opt')
+ self.assertRegex(msg, 'need_one')
+
+ def test_optional_optional_not_in_message(self):
+ parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
+ parser.add_argument('req_pos', type=str)
+ parser.add_argument('--req_opt', type=int, required=True)
+ parser.add_argument('--opt_opt', type=bool, nargs='?',
+ default=True)
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args([])
+ msg = str(cm.exception)
+ self.assertRegex(msg, 'req_pos')
+ self.assertRegex(msg, 'req_opt')
+ self.assertNotIn(msg, 'opt_opt')
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args(['--req_opt=1'])
+ msg = str(cm.exception)
+ self.assertRegex(msg, 'req_pos')
+ self.assertNotIn(msg, 'req_opt')
+ self.assertNotIn(msg, 'opt_opt')
+
+ def test_optional_positional_not_in_message(self):
+ parser = ErrorRaisingArgumentParser(prog='PROG', usage='')
+ parser.add_argument('req_pos')
+ parser.add_argument('optional_positional', nargs='?', default='eggs')
+ with self.assertRaises(ArgumentParserError) as cm:
+ parser.parse_args([])
+ msg = str(cm.exception)
+ self.assertRegex(msg, 'req_pos')
+ self.assertNotIn(msg, 'optional_positional')
+
+
# ================================================
# Check that the type function is called only once
# ================================================
@@ -4782,13 +4873,7 @@ class TestImportStar(TestCase):
self.assertEqual(sorted(items), sorted(argparse.__all__))
def test_main():
- # silence warnings about version argument - these are expected
- with support.check_warnings(
- ('The "version" argument to ArgumentParser is deprecated.',
- DeprecationWarning),
- ('The (format|print)_version method is deprecated',
- DeprecationWarning)):
- support.run_unittest(__name__)
+ support.run_unittest(__name__)
# Remove global references to avoid looking like we have refleaks.
RFile.seen = {}
WFile.seen = set()
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index e26e9ad..544c2ce 100755
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -16,6 +16,13 @@ import warnings
import array
from array import _array_reconstructor as array_reconstructor
+try:
+ # Try to determine availability of long long independently
+ # of the array module under test
+ struct.calcsize('@q')
+ have_long_long = True
+except struct.error:
+ have_long_long = False
class ArraySubclass(array.array):
pass
@@ -26,6 +33,8 @@ class ArraySubclassWithKwargs(array.array):
tests = [] # list to accumulate all tests
typecodes = "ubBhHiIlLfd"
+if have_long_long:
+ typecodes += 'qQ'
class BadConstructorTest(unittest.TestCase):
@@ -209,10 +218,14 @@ class BaseTest(unittest.TestCase):
self.assertEqual(bi[1], len(a))
def test_byteswap(self):
- a = array.array(self.typecode, self.example)
+ if self.typecode == 'u':
+ example = '\U00100100'
+ else:
+ example = self.example
+ a = array.array(self.typecode, example)
self.assertRaises(TypeError, a.byteswap, 42)
if a.itemsize in (1, 2, 4, 8):
- b = array.array(self.typecode, self.example)
+ b = array.array(self.typecode, example)
b.byteswap()
if a.itemsize==1:
self.assertEqual(a, b)
@@ -272,6 +285,20 @@ class BaseTest(unittest.TestCase):
self.assertEqual(a.x, b.x)
self.assertEqual(type(a), type(b))
+ def test_iterator_pickle(self):
+ data = array.array(self.typecode, self.example)
+ orgit = iter(data)
+ d = pickle.dumps(orgit)
+ it = pickle.loads(d)
+ self.assertEqual(type(orgit), type(it))
+ self.assertEqual(list(it), list(data))
+
+ if len(data):
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(list(it), list(data)[1:])
+
def test_insert(self):
a = array.array(self.typecode, self.example)
a.insert(0, self.example[0])
@@ -991,14 +1018,14 @@ class BaseTest(unittest.TestCase):
@support.cpython_only
def test_sizeof_with_buffer(self):
a = array.array(self.typecode, self.example)
- basesize = support.calcvobjsize('4Pi')
+ basesize = support.calcvobjsize('Pn2Pi')
buffer_size = a.buffer_info()[1] * a.itemsize
support.check_sizeof(self, a, basesize + buffer_size)
@support.cpython_only
def test_sizeof_without_buffer(self):
a = array.array(self.typecode)
- basesize = support.calcvobjsize('4Pi')
+ basesize = support.calcvobjsize('Pn2Pi')
support.check_sizeof(self, a, basesize)
@@ -1018,6 +1045,16 @@ class UnicodeTest(StringTest):
minitemsize = 2
def test_unicode(self):
+ try:
+ import ctypes
+ sizeof_wchar = ctypes.sizeof(ctypes.c_wchar)
+ except ImportError:
+ import sys
+ if sys.platform == 'win32':
+ sizeof_wchar = 2
+ else:
+ sizeof_wchar = 4
+
self.assertRaises(TypeError, array.array, 'b', 'foo')
a = array.array('u', '\xa0\xc2\u1234')
@@ -1027,6 +1064,7 @@ class UnicodeTest(StringTest):
a.fromunicode('\x11abc\xff\u1234')
s = a.tounicode()
self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234')
+ self.assertEqual(a.itemsize, sizeof_wchar)
s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234'
a = array.array('u', s)
@@ -1218,6 +1256,18 @@ class UnsignedLongTest(UnsignedNumberTest):
minitemsize = 4
tests.append(UnsignedLongTest)
+@unittest.skipIf(not have_long_long, 'need long long support')
+class LongLongTest(SignedNumberTest):
+ typecode = 'q'
+ minitemsize = 8
+tests.append(LongLongTest)
+
+@unittest.skipIf(not have_long_long, 'need long long support')
+class UnsignedLongLongTest(UnsignedNumberTest):
+ typecode = 'Q'
+ minitemsize = 8
+tests.append(UnsignedLongLongTest)
+
class FPTest(NumberTest):
example = [-42.0, 0, 42, 1e5, -1e10]
smallerexample = [-42.0, 0, 42, 1e5, -2e10]
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 2887092..a8853c7 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -1,6 +1,10 @@
-import sys, unittest
-from test import support
+import os
+import sys
+import unittest
import ast
+import weakref
+
+from test import support
def to_tuple(t):
if t is None or isinstance(t, (str, int, complex)):
@@ -52,6 +56,9 @@ exec_tests = [
"while v:pass",
# If
"if v:pass",
+ # With
+ "with x as y: pass",
+ "with x as y, z as q: pass",
# Raise
"raise Exception('string')",
# TryExcept
@@ -191,6 +198,9 @@ class AST_Tests(unittest.TestCase):
def test_AST_objects(self):
x = ast.AST()
self.assertEqual(x._fields, ())
+ x.foobar = 42
+ self.assertEqual(x.foobar, 42)
+ self.assertEqual(x.__dict__["foobar"], 42)
with self.assertRaises(AttributeError):
x.vararg
@@ -199,6 +209,17 @@ class AST_Tests(unittest.TestCase):
# "_ast.AST constructor takes 0 positional arguments"
ast.AST(2)
+ def test_AST_garbage_collection(self):
+ class X:
+ pass
+ a = ast.AST()
+ a.x = X()
+ a.x.a = a
+ ref = weakref.ref(a.x)
+ del a
+ support.gc_collect()
+ self.assertIsNone(ref())
+
def test_snippets(self):
for input, output, kind in ((exec_tests, exec_results, "exec"),
(single_tests, single_results, "single"),
@@ -390,7 +411,9 @@ class ASTHelpers_Test(unittest.TestCase):
try:
1/0
except Exception:
- self.assertRaises(SyntaxError, ast.parse, r"'\U'")
+ with self.assertRaises(SyntaxError) as e:
+ ast.literal_eval(r"'\U'")
+ self.assertIsNotNone(e.exception.__context__)
def test_dump(self):
node = ast.parse('spam(eggs, "and cheese")')
@@ -504,8 +527,413 @@ class ASTHelpers_Test(unittest.TestCase):
self.assertIn("invalid integer value: None", str(cm.exception))
+class ASTValidatorTests(unittest.TestCase):
+
+ def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
+ mod.lineno = mod.col_offset = 0
+ ast.fix_missing_locations(mod)
+ with self.assertRaises(exc) as cm:
+ compile(mod, "<test>", mode)
+ if msg is not None:
+ self.assertIn(msg, str(cm.exception))
+
+ def expr(self, node, msg=None, *, exc=ValueError):
+ mod = ast.Module([ast.Expr(node)])
+ self.mod(mod, msg, exc=exc)
+
+ def stmt(self, stmt, msg=None):
+ mod = ast.Module([stmt])
+ self.mod(mod, msg)
+
+ def test_module(self):
+ m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
+ self.mod(m, "must have Load context", "single")
+ m = ast.Expression(ast.Name("x", ast.Store()))
+ self.mod(m, "must have Load context", "eval")
+
+ def _check_arguments(self, fac, check):
+ def arguments(args=None, vararg=None, varargannotation=None,
+ kwonlyargs=None, kwarg=None, kwargannotation=None,
+ defaults=None, kw_defaults=None):
+ if args is None:
+ args = []
+ if kwonlyargs is None:
+ kwonlyargs = []
+ if defaults is None:
+ defaults = []
+ if kw_defaults is None:
+ kw_defaults = []
+ args = ast.arguments(args, vararg, varargannotation, kwonlyargs,
+ kwarg, kwargannotation, defaults, kw_defaults)
+ return fac(args)
+ args = [ast.arg("x", ast.Name("x", ast.Store()))]
+ check(arguments(args=args), "must have Load context")
+ check(arguments(varargannotation=ast.Num(3)),
+ "varargannotation but no vararg")
+ check(arguments(varargannotation=ast.Name("x", ast.Store()), vararg="x"),
+ "must have Load context")
+ check(arguments(kwonlyargs=args), "must have Load context")
+ check(arguments(kwargannotation=ast.Num(42)),
+ "kwargannotation but no kwarg")
+ check(arguments(kwargannotation=ast.Name("x", ast.Store()),
+ kwarg="x"), "must have Load context")
+ check(arguments(defaults=[ast.Num(3)]),
+ "more positional defaults than args")
+ check(arguments(kw_defaults=[ast.Num(4)]),
+ "length of kwonlyargs is not the same as kw_defaults")
+ args = [ast.arg("x", ast.Name("x", ast.Load()))]
+ check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
+ "must have Load context")
+ args = [ast.arg("a", ast.Name("x", ast.Load())),
+ ast.arg("b", ast.Name("y", ast.Load()))]
+ check(arguments(kwonlyargs=args,
+ kw_defaults=[None, ast.Name("x", ast.Store())]),
+ "must have Load context")
+
+ def test_funcdef(self):
+ a = ast.arguments([], None, None, [], None, None, [], [])
+ f = ast.FunctionDef("x", a, [], [], None)
+ self.stmt(f, "empty body on FunctionDef")
+ f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
+ None)
+ self.stmt(f, "must have Load context")
+ f = ast.FunctionDef("x", a, [ast.Pass()], [],
+ ast.Name("x", ast.Store()))
+ self.stmt(f, "must have Load context")
+ def fac(args):
+ return ast.FunctionDef("x", args, [ast.Pass()], [], None)
+ self._check_arguments(fac, self.stmt)
+
+ def test_classdef(self):
+ def cls(bases=None, keywords=None, starargs=None, kwargs=None,
+ body=None, decorator_list=None):
+ if bases is None:
+ bases = []
+ if keywords is None:
+ keywords = []
+ if body is None:
+ body = [ast.Pass()]
+ if decorator_list is None:
+ decorator_list = []
+ return ast.ClassDef("myclass", bases, keywords, starargs,
+ kwargs, body, decorator_list)
+ self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
+ "must have Load context")
+ self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
+ "must have Load context")
+ self.stmt(cls(starargs=ast.Name("x", ast.Store())),
+ "must have Load context")
+ self.stmt(cls(kwargs=ast.Name("x", ast.Store())),
+ "must have Load context")
+ self.stmt(cls(body=[]), "empty body on ClassDef")
+ self.stmt(cls(body=[None]), "None disallowed")
+ self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
+ "must have Load context")
+
+ def test_delete(self):
+ self.stmt(ast.Delete([]), "empty targets on Delete")
+ self.stmt(ast.Delete([None]), "None disallowed")
+ self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
+ "must have Del context")
+
+ def test_assign(self):
+ self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
+ self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
+ self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
+ "must have Store context")
+ self.stmt(ast.Assign([ast.Name("x", ast.Store())],
+ ast.Name("y", ast.Store())),
+ "must have Load context")
+
+ def test_augassign(self):
+ aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
+ ast.Name("y", ast.Load()))
+ self.stmt(aug, "must have Store context")
+ aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
+ ast.Name("y", ast.Store()))
+ self.stmt(aug, "must have Load context")
+
+ def test_for(self):
+ x = ast.Name("x", ast.Store())
+ y = ast.Name("y", ast.Load())
+ p = ast.Pass()
+ self.stmt(ast.For(x, y, [], []), "empty body on For")
+ self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
+ "must have Store context")
+ self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
+ "must have Load context")
+ e = ast.Expr(ast.Name("x", ast.Store()))
+ self.stmt(ast.For(x, y, [e], []), "must have Load context")
+ self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
+
+ def test_while(self):
+ self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
+ self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
+ "must have Load context")
+ self.stmt(ast.While(ast.Num(3), [ast.Pass()],
+ [ast.Expr(ast.Name("x", ast.Store()))]),
+ "must have Load context")
+
+ def test_if(self):
+ self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
+ i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
+ self.stmt(i, "must have Load context")
+ i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
+ self.stmt(i, "must have Load context")
+ i = ast.If(ast.Num(3), [ast.Pass()],
+ [ast.Expr(ast.Name("x", ast.Store()))])
+ self.stmt(i, "must have Load context")
+
+ def test_with(self):
+ p = ast.Pass()
+ self.stmt(ast.With([], [p]), "empty items on With")
+ i = ast.withitem(ast.Num(3), None)
+ self.stmt(ast.With([i], []), "empty body on With")
+ i = ast.withitem(ast.Name("x", ast.Store()), None)
+ self.stmt(ast.With([i], [p]), "must have Load context")
+ i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
+ self.stmt(ast.With([i], [p]), "must have Store context")
+
+ def test_raise(self):
+ r = ast.Raise(None, ast.Num(3))
+ self.stmt(r, "Raise with cause but no exception")
+ r = ast.Raise(ast.Name("x", ast.Store()), None)
+ self.stmt(r, "must have Load context")
+ r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
+ self.stmt(r, "must have Load context")
+
+ def test_try(self):
+ p = ast.Pass()
+ t = ast.Try([], [], [], [p])
+ self.stmt(t, "empty body on Try")
+ t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
+ self.stmt(t, "must have Load context")
+ t = ast.Try([p], [], [], [])
+ self.stmt(t, "Try has neither except handlers nor finalbody")
+ t = ast.Try([p], [], [p], [p])
+ self.stmt(t, "Try has orelse but no except handlers")
+ t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
+ self.stmt(t, "empty body on ExceptHandler")
+ e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
+ self.stmt(ast.Try([p], e, [], []), "must have Load context")
+ e = [ast.ExceptHandler(None, "x", [p])]
+ t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
+ self.stmt(t, "must have Load context")
+ t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
+ self.stmt(t, "must have Load context")
+
+ def test_assert(self):
+ self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
+ "must have Load context")
+ assrt = ast.Assert(ast.Name("x", ast.Load()),
+ ast.Name("y", ast.Store()))
+ self.stmt(assrt, "must have Load context")
+
+ def test_import(self):
+ self.stmt(ast.Import([]), "empty names on Import")
+
+ def test_importfrom(self):
+ imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
+ self.stmt(imp, "level less than -1")
+ self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
+
+ def test_global(self):
+ self.stmt(ast.Global([]), "empty names on Global")
+
+ def test_nonlocal(self):
+ self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
+
+ def test_expr(self):
+ e = ast.Expr(ast.Name("x", ast.Store()))
+ self.stmt(e, "must have Load context")
+
+ def test_boolop(self):
+ b = ast.BoolOp(ast.And(), [])
+ self.expr(b, "less than 2 values")
+ b = ast.BoolOp(ast.And(), [ast.Num(3)])
+ self.expr(b, "less than 2 values")
+ b = ast.BoolOp(ast.And(), [ast.Num(4), None])
+ self.expr(b, "None disallowed")
+ b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
+ self.expr(b, "must have Load context")
+
+ def test_unaryop(self):
+ u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
+ self.expr(u, "must have Load context")
+
+ def test_lambda(self):
+ a = ast.arguments([], None, None, [], None, None, [], [])
+ self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
+ "must have Load context")
+ def fac(args):
+ return ast.Lambda(args, ast.Name("x", ast.Load()))
+ self._check_arguments(fac, self.expr)
+
+ def test_ifexp(self):
+ l = ast.Name("x", ast.Load())
+ s = ast.Name("y", ast.Store())
+ for args in (s, l, l), (l, s, l), (l, l, s):
+ self.expr(ast.IfExp(*args), "must have Load context")
+
+ def test_dict(self):
+ d = ast.Dict([], [ast.Name("x", ast.Load())])
+ self.expr(d, "same number of keys as values")
+ d = ast.Dict([None], [ast.Name("x", ast.Load())])
+ self.expr(d, "None disallowed")
+ d = ast.Dict([ast.Name("x", ast.Load())], [None])
+ self.expr(d, "None disallowed")
+
+ def test_set(self):
+ self.expr(ast.Set([None]), "None disallowed")
+ s = ast.Set([ast.Name("x", ast.Store())])
+ self.expr(s, "must have Load context")
+
+ def _check_comprehension(self, fac):
+ self.expr(fac([]), "comprehension with no generators")
+ g = ast.comprehension(ast.Name("x", ast.Load()),
+ ast.Name("x", ast.Load()), [])
+ self.expr(fac([g]), "must have Store context")
+ g = ast.comprehension(ast.Name("x", ast.Store()),
+ ast.Name("x", ast.Store()), [])
+ self.expr(fac([g]), "must have Load context")
+ x = ast.Name("x", ast.Store())
+ y = ast.Name("y", ast.Load())
+ g = ast.comprehension(x, y, [None])
+ self.expr(fac([g]), "None disallowed")
+ g = ast.comprehension(x, y, [ast.Name("x", ast.Store())])
+ self.expr(fac([g]), "must have Load context")
+
+ def _simple_comp(self, fac):
+ g = ast.comprehension(ast.Name("x", ast.Store()),
+ ast.Name("x", ast.Load()), [])
+ self.expr(fac(ast.Name("x", ast.Store()), [g]),
+ "must have Load context")
+ def wrap(gens):
+ return fac(ast.Name("x", ast.Store()), gens)
+ self._check_comprehension(wrap)
+
+ def test_listcomp(self):
+ self._simple_comp(ast.ListComp)
+
+ def test_setcomp(self):
+ self._simple_comp(ast.SetComp)
+
+ def test_generatorexp(self):
+ self._simple_comp(ast.GeneratorExp)
+
+ def test_dictcomp(self):
+ g = ast.comprehension(ast.Name("y", ast.Store()),
+ ast.Name("p", ast.Load()), [])
+ c = ast.DictComp(ast.Name("x", ast.Store()),
+ ast.Name("y", ast.Load()), [g])
+ self.expr(c, "must have Load context")
+ c = ast.DictComp(ast.Name("x", ast.Load()),
+ ast.Name("y", ast.Store()), [g])
+ self.expr(c, "must have Load context")
+ def factory(comps):
+ k = ast.Name("x", ast.Load())
+ v = ast.Name("y", ast.Load())
+ return ast.DictComp(k, v, comps)
+ self._check_comprehension(factory)
+
+ def test_yield(self):
+ self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
+ self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
+
+ def test_compare(self):
+ left = ast.Name("x", ast.Load())
+ comp = ast.Compare(left, [ast.In()], [])
+ self.expr(comp, "no comparators")
+ comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
+ self.expr(comp, "different number of comparators and operands")
+ comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
+ self.expr(comp, "non-numeric", exc=TypeError)
+ comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
+ self.expr(comp, "non-numeric", exc=TypeError)
+
+ def test_call(self):
+ func = ast.Name("x", ast.Load())
+ args = [ast.Name("y", ast.Load())]
+ keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
+ stararg = ast.Name("p", ast.Load())
+ kwarg = ast.Name("q", ast.Load())
+ call = ast.Call(ast.Name("x", ast.Store()), args, keywords, stararg,
+ kwarg)
+ self.expr(call, "must have Load context")
+ call = ast.Call(func, [None], keywords, stararg, kwarg)
+ self.expr(call, "None disallowed")
+ bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
+ call = ast.Call(func, args, bad_keywords, stararg, kwarg)
+ self.expr(call, "must have Load context")
+ call = ast.Call(func, args, keywords, ast.Name("z", ast.Store()), kwarg)
+ self.expr(call, "must have Load context")
+ call = ast.Call(func, args, keywords, stararg,
+ ast.Name("w", ast.Store()))
+ self.expr(call, "must have Load context")
+
+ def test_num(self):
+ class subint(int):
+ pass
+ class subfloat(float):
+ pass
+ class subcomplex(complex):
+ pass
+ for obj in "0", "hello", subint(), subfloat(), subcomplex():
+ self.expr(ast.Num(obj), "non-numeric", exc=TypeError)
+
+ def test_attribute(self):
+ attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
+ self.expr(attr, "must have Load context")
+
+ def test_subscript(self):
+ sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
+ ast.Load())
+ self.expr(sub, "must have Load context")
+ x = ast.Name("x", ast.Load())
+ sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
+ ast.Load())
+ self.expr(sub, "must have Load context")
+ s = ast.Name("x", ast.Store())
+ for args in (s, None, None), (None, s, None), (None, None, s):
+ sl = ast.Slice(*args)
+ self.expr(ast.Subscript(x, sl, ast.Load()),
+ "must have Load context")
+ sl = ast.ExtSlice([])
+ self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
+ sl = ast.ExtSlice([ast.Index(s)])
+ self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
+
+ def test_starred(self):
+ left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
+ ast.Store())
+ assign = ast.Assign([left], ast.Num(4))
+ self.stmt(assign, "must have Store context")
+
+ def _sequence(self, fac):
+ self.expr(fac([None], ast.Load()), "None disallowed")
+ self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
+ "must have Load context")
+
+ def test_list(self):
+ self._sequence(ast.List)
+
+ def test_tuple(self):
+ self._sequence(ast.Tuple)
+
+ def test_stdlib_validates(self):
+ stdlib = os.path.dirname(ast.__file__)
+ tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
+ tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
+ for module in tests:
+ fn = os.path.join(stdlib, module)
+ with open(fn, "r", encoding="utf-8") as fp:
+ source = fp.read()
+ mod = ast.parse(source)
+ compile(mod, fn, "exec")
+
+
def test_main():
- support.run_unittest(AST_Tests, ASTHelpers_Test)
+ support.run_unittest(AST_Tests, ASTHelpers_Test, ASTValidatorTests)
def main():
if __name__ != '__main__':
@@ -539,9 +967,11 @@ exec_results = [
('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
+('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))])]),
+('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))])]),
('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]),
-('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]),
-('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
+('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])]),
+('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])]),
('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
index 5f55df8..42a2525 100644
--- a/Lib/test/test_asyncore.py
+++ b/Lib/test/test_asyncore.py
@@ -21,6 +21,8 @@ except ImportError:
HOST = support.HOST
+HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX')
+
class dummysocket:
def __init__(self):
self.closed = False
@@ -72,15 +74,16 @@ def capture_server(evt, buf, serv):
pass
else:
n = 200
- while n > 0:
- r, w, e = select.select([conn], [], [])
+ start = time.time()
+ while n > 0 and time.time() - start < 3.0:
+ r, w, e = select.select([conn], [], [], 0.1)
if r:
+ n -= 1
data = conn.recv(10)
# keep everything except for the newline terminator
buf.write(data.replace(b'\n', b''))
if b'\n' in data:
break
- n -= 1
time.sleep(0.01)
conn.close()
@@ -88,6 +91,13 @@ def capture_server(evt, buf, serv):
serv.close()
evt.set()
+def bind_af_aware(sock, addr):
+ """Helper function to bind a socket according to its family."""
+ if HAS_UNIX_SOCKETS and sock.family == socket.AF_UNIX:
+ # Make sure the path doesn't exist.
+ unlink(addr)
+ sock.bind(addr)
+
class HelperFunctionTests(unittest.TestCase):
def test_readwriteexc(self):
@@ -353,7 +363,7 @@ class DispatcherWithSendTests(unittest.TestCase):
@support.reap_threads
def test_send(self):
evt = threading.Event()
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock = socket.socket()
sock.settimeout(3)
port = support.bind_port(sock)
@@ -368,7 +378,7 @@ class DispatcherWithSendTests(unittest.TestCase):
data = b"Suppose there isn't a 16-ton weight?"
d = dispatcherwithsend_noread()
- d.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ d.create_socket()
d.connect((HOST, port))
# give time for socket to connect
@@ -468,22 +478,22 @@ class BaseTestHandler(asyncore.dispatcher):
raise
-class TCPServer(asyncore.dispatcher):
+class BaseServer(asyncore.dispatcher):
"""A server which listens on an address and dispatches the
connection to a handler.
"""
- def __init__(self, handler=BaseTestHandler, host=HOST, port=0):
+ def __init__(self, family, addr, handler=BaseTestHandler):
asyncore.dispatcher.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.create_socket(family)
self.set_reuse_addr()
- self.bind((host, port))
+ bind_af_aware(self.socket, addr)
self.listen(5)
self.handler = handler
@property
def address(self):
- return self.socket.getsockname()[:2]
+ return self.socket.getsockname()
def handle_accepted(self, sock, addr):
self.handler(sock)
@@ -494,9 +504,9 @@ class TCPServer(asyncore.dispatcher):
class BaseClient(BaseTestHandler):
- def __init__(self, address):
+ def __init__(self, family, address):
BaseTestHandler.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.create_socket(family)
self.connect(address)
def handle_connect(self):
@@ -526,8 +536,8 @@ class BaseTestAPI(unittest.TestCase):
def handle_connect(self):
self.flag = True
- server = TCPServer()
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
def test_handle_accept(self):
@@ -535,18 +545,18 @@ class BaseTestAPI(unittest.TestCase):
class TestListener(BaseTestHandler):
- def __init__(self):
+ def __init__(self, family, addr):
BaseTestHandler.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.bind((HOST, 0))
+ self.create_socket(family)
+ bind_af_aware(self.socket, addr)
self.listen(5)
- self.address = self.socket.getsockname()[:2]
+ self.address = self.socket.getsockname()
def handle_accept(self):
self.flag = True
- server = TestListener()
- client = BaseClient(server.address)
+ server = TestListener(self.family, self.addr)
+ client = BaseClient(self.family, server.address)
self.loop_waiting_for_flag(server)
def test_handle_accepted(self):
@@ -554,12 +564,12 @@ class BaseTestAPI(unittest.TestCase):
class TestListener(BaseTestHandler):
- def __init__(self):
+ def __init__(self, family, addr):
BaseTestHandler.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.bind((HOST, 0))
+ self.create_socket(family)
+ bind_af_aware(self.socket, addr)
self.listen(5)
- self.address = self.socket.getsockname()[:2]
+ self.address = self.socket.getsockname()
def handle_accept(self):
asyncore.dispatcher.handle_accept(self)
@@ -568,8 +578,8 @@ class BaseTestAPI(unittest.TestCase):
sock.close()
self.flag = True
- server = TestListener()
- client = BaseClient(server.address)
+ server = TestListener(self.family, self.addr)
+ client = BaseClient(self.family, server.address)
self.loop_waiting_for_flag(server)
@@ -585,8 +595,8 @@ class BaseTestAPI(unittest.TestCase):
BaseTestHandler.__init__(self, conn)
self.send(b'x' * 1024)
- server = TCPServer(TestHandler)
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr, TestHandler)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
def test_handle_write(self):
@@ -596,8 +606,8 @@ class BaseTestAPI(unittest.TestCase):
def handle_write(self):
self.flag = True
- server = TCPServer()
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
def test_handle_close(self):
@@ -620,8 +630,40 @@ class BaseTestAPI(unittest.TestCase):
BaseTestHandler.__init__(self, conn)
self.close()
- server = TCPServer(TestHandler)
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr, TestHandler)
+ client = TestClient(self.family, server.address)
+ self.loop_waiting_for_flag(client)
+
+ def test_handle_close_after_conn_broken(self):
+ # Check that ECONNRESET/EPIPE is correctly handled (issues #5661 and
+ # #11265).
+
+ data = b'\0' * 128
+
+ class TestClient(BaseClient):
+
+ def handle_write(self):
+ self.send(data)
+
+ def handle_close(self):
+ self.flag = True
+ self.close()
+
+ def handle_expt(self):
+ self.flag = True
+ self.close()
+
+ class TestHandler(BaseTestHandler):
+
+ def handle_read(self):
+ self.recv(len(data))
+ self.close()
+
+ def writable(self):
+ return False
+
+ server = BaseServer(self.family, self.addr, TestHandler)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
@unittest.skipIf(sys.platform.startswith("sunos"),
@@ -630,9 +672,12 @@ class BaseTestAPI(unittest.TestCase):
# Make sure handle_expt is called on OOB data received.
# Note: this might fail on some platforms as OOB data is
# tenuously supported and rarely used.
+ if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
+ self.skipTest("Not applicable to AF_UNIX sockets.")
class TestClient(BaseClient):
def handle_expt(self):
+ self.socket.recv(1024, socket.MSG_OOB)
self.flag = True
class TestHandler(BaseTestHandler):
@@ -640,8 +685,8 @@ class BaseTestAPI(unittest.TestCase):
BaseTestHandler.__init__(self, conn)
self.socket.send(bytes(chr(244), 'latin-1'), socket.MSG_OOB)
- server = TCPServer(TestHandler)
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr, TestHandler)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
def test_handle_error(self):
@@ -658,13 +703,13 @@ class BaseTestAPI(unittest.TestCase):
else:
raise Exception("exception not raised")
- server = TCPServer()
- client = TestClient(server.address)
+ server = BaseServer(self.family, self.addr)
+ client = TestClient(self.family, server.address)
self.loop_waiting_for_flag(client)
def test_connection_attributes(self):
- server = TCPServer()
- client = BaseClient(server.address)
+ server = BaseServer(self.family, self.addr)
+ client = BaseClient(self.family, server.address)
# we start disconnected
self.assertFalse(server.connected)
@@ -694,25 +739,29 @@ class BaseTestAPI(unittest.TestCase):
def test_create_socket(self):
s = asyncore.dispatcher()
- s.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.assertEqual(s.socket.family, socket.AF_INET)
+ s.create_socket(self.family)
+ self.assertEqual(s.socket.family, self.family)
SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
self.assertEqual(s.socket.type, socket.SOCK_STREAM | SOCK_NONBLOCK)
def test_bind(self):
+ if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
+ self.skipTest("Not applicable to AF_UNIX sockets.")
s1 = asyncore.dispatcher()
- s1.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- s1.bind((HOST, 0))
+ s1.create_socket(self.family)
+ s1.bind(self.addr)
s1.listen(5)
port = s1.socket.getsockname()[1]
s2 = asyncore.dispatcher()
- s2.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ s2.create_socket(self.family)
# EADDRINUSE indicates the socket was correctly bound
- self.assertRaises(socket.error, s2.bind, (HOST, port))
+ self.assertRaises(socket.error, s2.bind, (self.addr[0], port))
def test_set_reuse_addr(self):
- sock = socket.socket()
+ if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX:
+ self.skipTest("Not applicable to AF_UNIX sockets.")
+ sock = socket.socket(self.family)
try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
except socket.error:
@@ -720,11 +769,11 @@ class BaseTestAPI(unittest.TestCase):
else:
# if SO_REUSEADDR succeeded for sock we expect asyncore
# to do the same
- s = asyncore.dispatcher(socket.socket())
+ s = asyncore.dispatcher(socket.socket(self.family))
self.assertFalse(s.socket.getsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR))
s.socket.close()
- s.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.create_socket(self.family)
s.set_reuse_addr()
self.assertTrue(s.socket.getsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR))
@@ -735,12 +784,14 @@ class BaseTestAPI(unittest.TestCase):
@support.reap_threads
def test_quick_connect(self):
# see: http://bugs.python.org/issue10340
- server = TCPServer()
- t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1, count=500))
- t.start()
+ if self.family in (socket.AF_INET, getattr(socket, "AF_INET6", object())):
+ server = BaseServer(self.family, self.addr)
+ t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1,
+ count=500))
+ t.start()
+
- for x in range(20):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s = socket.socket(self.family, socket.SOCK_STREAM)
s.settimeout(.2)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
struct.pack('ii', 1, 0))
@@ -751,18 +802,52 @@ class BaseTestAPI(unittest.TestCase):
finally:
s.close()
-class TestAPI_UseSelect(BaseTestAPI):
+class TestAPI_UseIPv4Sockets(BaseTestAPI):
+ family = socket.AF_INET
+ addr = (HOST, 0)
+
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 support required')
+class TestAPI_UseIPv6Sockets(BaseTestAPI):
+ family = socket.AF_INET6
+ addr = ('::1', 0)
+
+@unittest.skipUnless(HAS_UNIX_SOCKETS, 'Unix sockets required')
+class TestAPI_UseUnixSockets(BaseTestAPI):
+ if HAS_UNIX_SOCKETS:
+ family = socket.AF_UNIX
+ addr = support.TESTFN
+
+ def tearDown(self):
+ unlink(self.addr)
+ BaseTestAPI.tearDown(self)
+
+class TestAPI_UseIPv4Select(TestAPI_UseIPv4Sockets):
use_poll = False
@unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
-class TestAPI_UsePoll(BaseTestAPI):
+class TestAPI_UseIPv4Poll(TestAPI_UseIPv4Sockets):
use_poll = True
+class TestAPI_UseIPv6Select(TestAPI_UseIPv6Sockets):
+ use_poll = False
+
+@unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
+class TestAPI_UseIPv6Poll(TestAPI_UseIPv6Sockets):
+ use_poll = True
+
+class TestAPI_UseUnixSocketsSelect(TestAPI_UseUnixSockets):
+ use_poll = False
+
+@unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required')
+class TestAPI_UseUnixSocketsPoll(TestAPI_UseUnixSockets):
+ use_poll = True
def test_main():
tests = [HelperFunctionTests, DispatcherTests, DispatcherWithSendTests,
- DispatcherWithSendTests_UsePoll, TestAPI_UseSelect,
- TestAPI_UsePoll, FileWrapperTest]
+ DispatcherWithSendTests_UsePoll, FileWrapperTest,
+ TestAPI_UseIPv4Select, TestAPI_UseIPv4Poll, TestAPI_UseIPv6Select,
+ TestAPI_UseIPv6Poll, TestAPI_UseUnixSocketsSelect,
+ TestAPI_UseUnixSocketsPoll]
run_unittest(*tests)
if __name__ == "__main__":
diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py
index ca94504..2569476 100644
--- a/Lib/test/test_base64.py
+++ b/Lib/test/test_base64.py
@@ -103,44 +103,53 @@ class BaseXYTestCase(unittest.TestCase):
def test_b64decode(self):
eq = self.assertEqual
- eq(base64.b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
- eq(base64.b64decode(b'AA=='), b'\x00')
- eq(base64.b64decode(b"YQ=="), b"a")
- eq(base64.b64decode(b"YWI="), b"ab")
- eq(base64.b64decode(b"YWJj"), b"abc")
- eq(base64.b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
- b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}")
- eq(base64.b64decode(b''), b'')
+
+ tests = {b"d3d3LnB5dGhvbi5vcmc=": b"www.python.org",
+ b'AA==': b'\x00',
+ b"YQ==": b"a",
+ b"YWI=": b"ab",
+ b"YWJj": b"abc",
+ b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
+ b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0\nNT"
+ b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ==":
+
+ b"abcdefghijklmnopqrstuvwxyz"
+ b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ b"0123456789!@#0^&*();:<>,. []{}",
+ b'': b'',
+ }
+ for data, res in tests.items():
+ eq(base64.b64decode(data), res)
+ eq(base64.b64decode(data.decode('ascii')), res)
+
# Test with arbitrary alternative characters
- eq(base64.b64decode(b'01a*b$cd', altchars=b'*$'), b'\xd3V\xbeo\xf7\x1d')
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.b64decode, "")
- self.assertRaises(TypeError, base64.b64decode, b"", altchars="")
+ tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d',
+ }
+ for (data, altchars), res in tests_altchars.items():
+ data_str = data.decode('ascii')
+ altchars_str = altchars.decode('ascii')
+
+ eq(base64.b64decode(data, altchars=altchars), res)
+ eq(base64.b64decode(data_str, altchars=altchars), res)
+ eq(base64.b64decode(data, altchars=altchars_str), res)
+ eq(base64.b64decode(data_str, altchars=altchars_str), res)
+
# Test standard alphabet
- eq(base64.standard_b64decode(b"d3d3LnB5dGhvbi5vcmc="), b"www.python.org")
- eq(base64.standard_b64decode(b"YQ=="), b"a")
- eq(base64.standard_b64decode(b"YWI="), b"ab")
- eq(base64.standard_b64decode(b"YWJj"), b"abc")
- eq(base64.standard_b64decode(b""), b"")
- eq(base64.standard_b64decode(b"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNE"
- b"RUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NT"
- b"Y3ODkhQCMwXiYqKCk7Ojw+LC4gW117fQ=="),
- b"abcdefghijklmnopqrstuvwxyz"
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"0123456789!@#0^&*();:<>,. []{}")
- # Check if passing a str object raises an error
- self.assertRaises(TypeError, base64.standard_b64decode, "")
- self.assertRaises(TypeError, base64.standard_b64decode, b"", altchars="")
+ for data, res in tests.items():
+ eq(base64.standard_b64decode(data), res)
+ eq(base64.standard_b64decode(data.decode('ascii')), res)
+
# Test with 'URL safe' alternative characters
- eq(base64.urlsafe_b64decode(b'01a-b_cd'), b'\xd3V\xbeo\xf7\x1d')
- self.assertRaises(TypeError, base64.urlsafe_b64decode, "")
+ tests_urlsafe = {b'01a-b_cd': b'\xd3V\xbeo\xf7\x1d',
+ b'': b'',
+ }
+ for data, res in tests_urlsafe.items():
+ eq(base64.urlsafe_b64decode(data), res)
+ eq(base64.urlsafe_b64decode(data.decode('ascii')), res)
def test_b64decode_padding_error(self):
self.assertRaises(binascii.Error, base64.b64decode, b'abc')
+ self.assertRaises(binascii.Error, base64.b64decode, 'abc')
def test_b64decode_invalid_chars(self):
# issue 1466065: Test some invalid characters.
@@ -155,8 +164,11 @@ class BaseXYTestCase(unittest.TestCase):
(b'YWJj\nYWI=', b'abcab'))
for bstr, res in tests:
self.assertEqual(base64.b64decode(bstr), res)
+ self.assertEqual(base64.b64decode(bstr.decode('ascii')), res)
with self.assertRaises(binascii.Error):
base64.b64decode(bstr, validate=True)
+ with self.assertRaises(binascii.Error):
+ base64.b64decode(bstr.decode('ascii'), validate=True)
def test_b32encode(self):
eq = self.assertEqual
@@ -171,40 +183,63 @@ class BaseXYTestCase(unittest.TestCase):
def test_b32decode(self):
eq = self.assertEqual
- eq(base64.b32decode(b''), b'')
- eq(base64.b32decode(b'AA======'), b'\x00')
- eq(base64.b32decode(b'ME======'), b'a')
- eq(base64.b32decode(b'MFRA===='), b'ab')
- eq(base64.b32decode(b'MFRGG==='), b'abc')
- eq(base64.b32decode(b'MFRGGZA='), b'abcd')
- eq(base64.b32decode(b'MFRGGZDF'), b'abcde')
- self.assertRaises(TypeError, base64.b32decode, "")
+ tests = {b'': b'',
+ b'AA======': b'\x00',
+ b'ME======': b'a',
+ b'MFRA====': b'ab',
+ b'MFRGG===': b'abc',
+ b'MFRGGZA=': b'abcd',
+ b'MFRGGZDF': b'abcde',
+ }
+ for data, res in tests.items():
+ eq(base64.b32decode(data), res)
+ eq(base64.b32decode(data.decode('ascii')), res)
def test_b32decode_casefold(self):
eq = self.assertEqual
- eq(base64.b32decode(b'', True), b'')
- eq(base64.b32decode(b'ME======', True), b'a')
- eq(base64.b32decode(b'MFRA====', True), b'ab')
- eq(base64.b32decode(b'MFRGG===', True), b'abc')
- eq(base64.b32decode(b'MFRGGZA=', True), b'abcd')
- eq(base64.b32decode(b'MFRGGZDF', True), b'abcde')
- # Lower cases
- eq(base64.b32decode(b'me======', True), b'a')
- eq(base64.b32decode(b'mfra====', True), b'ab')
- eq(base64.b32decode(b'mfrgg===', True), b'abc')
- eq(base64.b32decode(b'mfrggza=', True), b'abcd')
- eq(base64.b32decode(b'mfrggzdf', True), b'abcde')
- # Expected exceptions
+ tests = {b'': b'',
+ b'ME======': b'a',
+ b'MFRA====': b'ab',
+ b'MFRGG===': b'abc',
+ b'MFRGGZA=': b'abcd',
+ b'MFRGGZDF': b'abcde',
+ # Lower cases
+ b'me======': b'a',
+ b'mfra====': b'ab',
+ b'mfrgg===': b'abc',
+ b'mfrggza=': b'abcd',
+ b'mfrggzdf': b'abcde',
+ }
+
+ for data, res in tests.items():
+ eq(base64.b32decode(data, True), res)
+ eq(base64.b32decode(data.decode('ascii'), True), res)
+
self.assertRaises(TypeError, base64.b32decode, b'me======')
+ self.assertRaises(TypeError, base64.b32decode, 'me======')
+
# Mapping zero and one
eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe')
- eq(base64.b32decode(b'M1023456', map01=b'L'), b'b\xdd\xad\xf3\xbe')
- eq(base64.b32decode(b'M1023456', map01=b'I'), b'b\x1d\xad\xf3\xbe')
- self.assertRaises(TypeError, base64.b32decode, b"", map01="")
+ eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe')
+
+ map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe',
+ (b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe',
+ }
+ for (data, map01), res in map_tests.items():
+ data_str = data.decode('ascii')
+ map01_str = map01.decode('ascii')
+
+ eq(base64.b32decode(data, map01=map01), res)
+ eq(base64.b32decode(data_str, map01=map01), res)
+ eq(base64.b32decode(data, map01=map01_str), res)
+ eq(base64.b32decode(data_str, map01=map01_str), res)
def test_b32decode_error(self):
- self.assertRaises(binascii.Error, base64.b32decode, b'abc')
- self.assertRaises(binascii.Error, base64.b32decode, b'ABCDEF==')
+ for data in [b'abc', b'ABCDEF==']:
+ with self.assertRaises(binascii.Error):
+ base64.b32decode(data)
+ with self.assertRaises(binascii.Error):
+ base64.b32decode(data.decode('ascii'))
def test_b16encode(self):
eq = self.assertEqual
@@ -215,12 +250,24 @@ class BaseXYTestCase(unittest.TestCase):
def test_b16decode(self):
eq = self.assertEqual
eq(base64.b16decode(b'0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
+ eq(base64.b16decode('0102ABCDEF'), b'\x01\x02\xab\xcd\xef')
eq(base64.b16decode(b'00'), b'\x00')
+ eq(base64.b16decode('00'), b'\x00')
# Lower case is not allowed without a flag
self.assertRaises(binascii.Error, base64.b16decode, b'0102abcdef')
+ self.assertRaises(binascii.Error, base64.b16decode, '0102abcdef')
# Case fold
eq(base64.b16decode(b'0102abcdef', True), b'\x01\x02\xab\xcd\xef')
- self.assertRaises(TypeError, base64.b16decode, "")
+ eq(base64.b16decode('0102abcdef', True), b'\x01\x02\xab\xcd\xef')
+
+ def test_decode_nonascii_str(self):
+ decode_funcs = (base64.b64decode,
+ base64.standard_b64decode,
+ base64.urlsafe_b64decode,
+ base64.b32decode,
+ base64.b16decode)
+ for f in decode_funcs:
+ self.assertRaises(ValueError, f, 'with non-ascii \xcb')
def test_ErrorHeritage(self):
self.assertTrue(issubclass(binascii.Error, ValueError))
diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py
index f3c6ebb..0e54595 100644
--- a/Lib/test/test_bigmem.py
+++ b/Lib/test/test_bigmem.py
@@ -1,3 +1,13 @@
+"""Bigmem tests - tests for the 32-bit boundary in containers.
+
+These tests try to exercise the 32-bit boundary that is sometimes, if
+rarely, exceeded in practice, but almost never tested. They are really only
+meaningful on 64-bit builds on machines with a *lot* of memory, but the
+tests are always run, usually with very low memory limits to make sure the
+tests themselves don't suffer from bitrot. To run them for real, pass a
+high memory limit to regrtest, with the -M option.
+"""
+
from test import support
from test.support import bigmemtest, _1G, _2G, _4G
@@ -6,20 +16,35 @@ import operator
import sys
import functools
+# These tests all use one of the bigmemtest decorators to indicate how much
+# memory they use and how much memory they need to be even meaningful. The
+# decorators take two arguments: a 'memuse' indicator declaring
+# (approximate) bytes per size-unit the test will use (at peak usage), and a
+# 'minsize' indicator declaring a minimum *useful* size. A test that
+# allocates a bytestring to test various operations near the end will have a
+# minsize of at least 2Gb (or it wouldn't reach the 32-bit limit, so the
+# test wouldn't be very useful) and a memuse of 1 (one byte per size-unit,
+# if it allocates only one big string at a time.)
+#
+# When run with a memory limit set, both decorators skip tests that need
+# more memory than available to be meaningful. The precisionbigmemtest will
+# always pass minsize as size, even if there is much more memory available.
+# The bigmemtest decorator will scale size upward to fill available memory.
+#
# Bigmem testing houserules:
#
# - Try not to allocate too many large objects. It's okay to rely on
-# refcounting semantics, but don't forget that 's = create_largestring()'
+# refcounting semantics, and don't forget that 's = create_largestring()'
# doesn't release the old 's' (if it exists) until well after its new
# value has been created. Use 'del s' before the create_largestring call.
#
-# - Do *not* compare large objects using assertEqual or similar. It's a
-# lengthy operation and the errormessage will be utterly useless due to
-# its size. To make sure whether a result has the right contents, better
-# to use the strip or count methods, or compare meaningful slices.
+# - Do *not* compare large objects using assertEqual, assertIn or similar.
+# It's a lengthy operation and the errormessage will be utterly useless
+# due to its size. To make sure whether a result has the right contents,
+# better to use the strip or count methods, or compare meaningful slices.
#
# - Don't forget to test for large indices, offsets and results and such,
-# in addition to large sizes.
+# in addition to large sizes. Anything that probes the 32-bit boundary.
#
# - When repeating an object (say, a substring, or a small list) to create
# a large object, make the subobject of a length that is not a power of
@@ -37,13 +62,14 @@ import functools
# fail as well. I do not know whether it is due to memory fragmentation
# issues, or other specifics of the platform malloc() routine.
-character_size = 4 if sys.maxunicode > 0xFFFF else 2
+ascii_char_size = 1
+ucs2_char_size = 2
+ucs4_char_size = 4
class BaseStrTest:
- @bigmemtest(size=_2G, memuse=2)
- def test_capitalize(self, size):
+ def _test_capitalize(self, size):
_ = self.from_latin1
SUBSTR = self.from_latin1(' abc def ghi')
s = _('-') * size + SUBSTR
@@ -92,7 +118,7 @@ class BaseStrTest:
_ = self.from_latin1
s = _('-') * size
tabsize = 8
- self.assertEqual(s.expandtabs(), s)
+ self.assertTrue(s.expandtabs() == s)
del s
slen, remainder = divmod(size, tabsize)
s = _(' \t') * slen
@@ -347,7 +373,7 @@ class BaseStrTest:
# suffer for the list size. (Otherwise, it'd cost another 48 times
# size in bytes!) Nevertheless, a list of size takes
# 8*size bytes.
- @bigmemtest(size=_2G + 5, memuse=10)
+ @bigmemtest(size=_2G + 5, memuse=2 * ascii_char_size + 8)
def test_split_large(self, size):
_ = self.from_latin1
s = _(' a') * size + _(' ')
@@ -366,9 +392,9 @@ class BaseStrTest:
# take up an inordinate amount of memory
chunksize = int(size ** 0.5 + 2) // 2
SUBSTR = _(' ') * chunksize + _('\n') + _(' ') * chunksize + _('\r\n')
- s = SUBSTR * chunksize
+ s = SUBSTR * (chunksize * 2)
l = s.splitlines()
- self.assertEqual(len(l), chunksize * 2)
+ self.assertEqual(len(l), chunksize * 4)
expected = _(' ') * chunksize
for item in l:
self.assertEqual(item, expected)
@@ -394,8 +420,7 @@ class BaseStrTest:
self.assertEqual(len(s), size)
self.assertEqual(s.strip(), SUBSTR.strip())
- @bigmemtest(size=_2G, memuse=2)
- def test_swapcase(self, size):
+ def _test_swapcase(self, size):
_ = self.from_latin1
SUBSTR = _("aBcDeFG12.'\xa9\x00")
sublen = len(SUBSTR)
@@ -406,8 +431,7 @@ class BaseStrTest:
self.assertEqual(s[:sublen * 3], SUBSTR.swapcase() * 3)
self.assertEqual(s[-sublen * 3:], SUBSTR.swapcase() * 3)
- @bigmemtest(size=_2G, memuse=2)
- def test_title(self, size):
+ def _test_title(self, size):
_ = self.from_latin1
SUBSTR = _('SpaaHAaaAaham')
s = SUBSTR * (size // len(SUBSTR) + 2)
@@ -419,14 +443,7 @@ class BaseStrTest:
def test_translate(self, size):
_ = self.from_latin1
SUBSTR = _('aZz.z.Aaz.')
- if isinstance(SUBSTR, str):
- trans = {
- ord(_('.')): _('-'),
- ord(_('a')): _('!'),
- ord(_('Z')): _('$'),
- }
- else:
- trans = bytes.maketrans(b'.aZ', b'-!$')
+ trans = bytes.maketrans(b'.aZ', b'-!$')
sublen = len(SUBSTR)
repeats = size // sublen + 2
s = SUBSTR * repeats
@@ -519,19 +536,19 @@ class BaseStrTest:
edge = _('-') * (size // 2)
s = _('').join([edge, SUBSTR, edge])
del edge
- self.assertIn(SUBSTR, s)
- self.assertNotIn(SUBSTR * 2, s)
- self.assertIn(_('-'), s)
- self.assertNotIn(_('a'), s)
+ self.assertTrue(SUBSTR in s)
+ self.assertFalse(SUBSTR * 2 in s)
+ self.assertTrue(_('-') in s)
+ self.assertFalse(_('a') in s)
s += _('a')
- self.assertIn(_('a'), s)
+ self.assertTrue(_('a') in s)
@bigmemtest(size=_2G + 10, memuse=2)
def test_compare(self, size):
_ = self.from_latin1
s1 = _('-') * size
s2 = _('-') * size
- self.assertEqual(s1, s2)
+ self.assertTrue(s1 == s2)
del s2
s2 = s1 + _('a')
self.assertFalse(s1 == s2)
@@ -552,7 +569,7 @@ class BaseStrTest:
h1 = hash(s)
del s
s = _('\x00') * (size + 1)
- self.assertFalse(h1 == hash(s))
+ self.assertNotEqual(h1, hash(s))
class StrTest(unittest.TestCase, BaseStrTest):
@@ -563,7 +580,6 @@ class StrTest(unittest.TestCase, BaseStrTest):
def basic_encode_test(self, size, enc, c='.', expectedsize=None):
if expectedsize is None:
expectedsize = size
-
try:
s = c * size
self.assertEqual(len(s.encode(enc)), expectedsize)
@@ -582,48 +598,64 @@ class StrTest(unittest.TestCase, BaseStrTest):
memuse = meth.memuse
except AttributeError:
continue
- meth.memuse = character_size * memuse
+ meth.memuse = ascii_char_size * memuse
self._adjusted[name] = memuse
def tearDown(self):
for name, memuse in self._adjusted.items():
getattr(type(self), name).memuse = memuse
- # the utf8 encoder preallocates big time (4x the number of characters)
- @bigmemtest(size=_2G + 2, memuse=character_size + 4)
+ @bigmemtest(size=_2G, memuse=ucs4_char_size * 3)
+ def test_capitalize(self, size):
+ self._test_capitalize(size)
+
+ @bigmemtest(size=_2G, memuse=ucs4_char_size * 3)
+ def test_title(self, size):
+ self._test_title(size)
+
+ @bigmemtest(size=_2G, memuse=ucs4_char_size * 3)
+ def test_swapcase(self, size):
+ self._test_swapcase(size)
+
+ # Many codecs convert to the legacy representation first, explaining
+ # why we add 'ucs4_char_size' to the 'memuse' below.
+
+ @bigmemtest(size=_2G + 2, memuse=ascii_char_size + 1)
def test_encode(self, size):
return self.basic_encode_test(size, 'utf-8')
- @bigmemtest(size=_4G // 6 + 2, memuse=character_size + 1)
+ @bigmemtest(size=_4G // 6 + 2, memuse=ascii_char_size + ucs4_char_size + 1)
def test_encode_raw_unicode_escape(self, size):
try:
return self.basic_encode_test(size, 'raw_unicode_escape')
except MemoryError:
pass # acceptable on 32-bit
- @bigmemtest(size=_4G // 5 + 70, memuse=character_size + 1)
+ @bigmemtest(size=_4G // 5 + 70, memuse=ascii_char_size + ucs4_char_size + 1)
def test_encode_utf7(self, size):
try:
return self.basic_encode_test(size, 'utf7')
except MemoryError:
pass # acceptable on 32-bit
- @bigmemtest(size=_4G // 4 + 5, memuse=character_size + 4)
+ @bigmemtest(size=_4G // 4 + 5, memuse=ascii_char_size + ucs4_char_size + 4)
def test_encode_utf32(self, size):
try:
- return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4)
+ return self.basic_encode_test(size, 'utf32', expectedsize=4 * size + 4)
except MemoryError:
pass # acceptable on 32-bit
- @bigmemtest(size=_2G - 1, memuse=character_size + 1)
+ @bigmemtest(size=_2G - 1, memuse=ascii_char_size + 1)
def test_encode_ascii(self, size):
return self.basic_encode_test(size, 'ascii', c='A')
- @bigmemtest(size=_2G + 10, memuse=character_size * 2)
+ # str % (...) uses a Py_UCS4 intermediate representation
+
+ @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2 + ucs4_char_size)
def test_format(self, size):
s = '-' * size
sf = '%s' % (s,)
- self.assertEqual(s, sf)
+ self.assertTrue(s == sf)
del sf
sf = '..%s..' % (s,)
self.assertEqual(len(sf), len(s) + 4)
@@ -640,7 +672,7 @@ class StrTest(unittest.TestCase, BaseStrTest):
self.assertEqual(s.count('.'), 3)
self.assertEqual(s.count('-'), size * 2)
- @bigmemtest(size=_2G + 10, memuse=character_size * 2)
+ @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2)
def test_repr_small(self, size):
s = '-' * size
s = repr(s)
@@ -661,7 +693,7 @@ class StrTest(unittest.TestCase, BaseStrTest):
self.assertEqual(s.count('\\'), size)
self.assertEqual(s.count('0'), size * 2)
- @bigmemtest(size=_2G + 10, memuse=character_size * 5)
+ @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 5)
def test_repr_large(self, size):
s = '\x00' * size
s = repr(s)
@@ -671,7 +703,13 @@ class StrTest(unittest.TestCase, BaseStrTest):
self.assertEqual(s.count('\\'), size)
self.assertEqual(s.count('0'), size * 2)
- @bigmemtest(size=_2G // 5 + 1, memuse=character_size * 7)
+ # ascii() calls encode('ascii', 'backslashreplace'), which itself
+ # creates a temporary Py_UNICODE representation in addition to the
+ # original (Py_UCS2) one
+ # There's also some overallocation when resizing the ascii() result
+ # that isn't taken into account here.
+ @bigmemtest(size=_2G // 5 + 1, memuse=ucs2_char_size +
+ ucs4_char_size + ascii_char_size * 6)
def test_unicode_repr(self, size):
# Use an assigned, but not printable code point.
# It is in the range of the low surrogates \uDC00-\uDFFF.
@@ -686,9 +724,7 @@ class StrTest(unittest.TestCase, BaseStrTest):
finally:
r = s = None
- # The character takes 4 bytes even in UCS-2 builds because it will
- # be decomposed into surrogates.
- @bigmemtest(size=_2G // 5 + 1, memuse=4 + character_size * 9)
+ @bigmemtest(size=_2G // 5 + 1, memuse=ucs4_char_size * 2 + ascii_char_size * 10)
def test_unicode_repr_wide(self, size):
char = "\U0001DCBA"
s = char * size
@@ -701,39 +737,76 @@ class StrTest(unittest.TestCase, BaseStrTest):
finally:
r = s = None
- @bigmemtest(size=_4G // 5, memuse=character_size * (6 + 1))
- def _test_unicode_repr_overflow(self, size):
- # XXX not sure what this test is about
- char = "\uDCBA"
- s = char * size
- try:
- r = repr(s)
- self.assertTrue(s == eval(r))
- finally:
- r = s = None
+ # The original test_translate is overriden here, so as to get the
+ # correct size estimate: str.translate() uses an intermediate Py_UCS4
+ # representation.
+
+ @bigmemtest(size=_2G, memuse=ascii_char_size * 2 + ucs4_char_size)
+ def test_translate(self, size):
+ _ = self.from_latin1
+ SUBSTR = _('aZz.z.Aaz.')
+ trans = {
+ ord(_('.')): _('-'),
+ ord(_('a')): _('!'),
+ ord(_('Z')): _('$'),
+ }
+ sublen = len(SUBSTR)
+ repeats = size // sublen + 2
+ s = SUBSTR * repeats
+ s = s.translate(trans)
+ self.assertEqual(len(s), repeats * sublen)
+ self.assertEqual(s[:sublen], SUBSTR.translate(trans))
+ self.assertEqual(s[-sublen:], SUBSTR.translate(trans))
+ self.assertEqual(s.count(_('.')), 0)
+ self.assertEqual(s.count(_('!')), repeats * 2)
+ self.assertEqual(s.count(_('z')), repeats * 3)
class BytesTest(unittest.TestCase, BaseStrTest):
def from_latin1(self, s):
- return s.encode("latin1")
+ return s.encode("latin-1")
- @bigmemtest(size=_2G + 2, memuse=1 + character_size)
+ @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size)
def test_decode(self, size):
s = self.from_latin1('.') * size
self.assertEqual(len(s.decode('utf-8')), size)
+ @bigmemtest(size=_2G, memuse=2)
+ def test_capitalize(self, size):
+ self._test_capitalize(size)
+
+ @bigmemtest(size=_2G, memuse=2)
+ def test_title(self, size):
+ self._test_title(size)
+
+ @bigmemtest(size=_2G, memuse=2)
+ def test_swapcase(self, size):
+ self._test_swapcase(size)
+
class BytearrayTest(unittest.TestCase, BaseStrTest):
def from_latin1(self, s):
- return bytearray(s.encode("latin1"))
+ return bytearray(s.encode("latin-1"))
- @bigmemtest(size=_2G + 2, memuse=1 + character_size)
+ @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size)
def test_decode(self, size):
s = self.from_latin1('.') * size
self.assertEqual(len(s.decode('utf-8')), size)
+ @bigmemtest(size=_2G, memuse=2)
+ def test_capitalize(self, size):
+ self._test_capitalize(size)
+
+ @bigmemtest(size=_2G, memuse=2)
+ def test_title(self, size):
+ self._test_title(size)
+
+ @bigmemtest(size=_2G, memuse=2)
+ def test_swapcase(self, size):
+ self._test_swapcase(size)
+
test_hash = None
test_split_large = None
@@ -752,7 +825,7 @@ class TupleTest(unittest.TestCase):
def test_compare(self, size):
t1 = ('',) * size
t2 = ('',) * size
- self.assertEqual(t1, t2)
+ self.assertTrue(t1 == t2)
del t2
t2 = ('',) * (size + 1)
self.assertFalse(t1 == t2)
@@ -783,9 +856,9 @@ class TupleTest(unittest.TestCase):
def test_contains(self, size):
t = (1, 2, 3, 4, 5) * size
self.assertEqual(len(t), size * 5)
- self.assertIn(5, t)
- self.assertNotIn((1, 2, 3, 4, 5), t)
- self.assertNotIn(0, t)
+ self.assertTrue(5 in t)
+ self.assertFalse((1, 2, 3, 4, 5) in t)
+ self.assertFalse(0 in t)
@bigmemtest(size=_2G + 10, memuse=8)
def test_hash(self, size):
@@ -869,11 +942,11 @@ class TupleTest(unittest.TestCase):
self.assertEqual(s[-5:], '0, 0)')
self.assertEqual(s.count('0'), size)
- @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size)
+ @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * ascii_char_size)
def test_repr_small(self, size):
return self.basic_test_repr(size)
- @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size)
+ @bigmemtest(size=_2G + 2, memuse=8 + 3 * ascii_char_size)
def test_repr_large(self, size):
return self.basic_test_repr(size)
@@ -888,7 +961,7 @@ class ListTest(unittest.TestCase):
def test_compare(self, size):
l1 = [''] * size
l2 = [''] * size
- self.assertEqual(l1, l2)
+ self.assertTrue(l1 == l2)
del l2
l2 = [''] * (size + 1)
self.assertFalse(l1 == l2)
@@ -934,9 +1007,9 @@ class ListTest(unittest.TestCase):
def test_contains(self, size):
l = [1, 2, 3, 4, 5] * size
self.assertEqual(len(l), size * 5)
- self.assertIn(5, l)
- self.assertNotIn([1, 2, 3, 4, 5], l)
- self.assertNotIn(0, l)
+ self.assertTrue(5 in l)
+ self.assertFalse([1, 2, 3, 4, 5] in l)
+ self.assertFalse(0 in l)
@bigmemtest(size=_2G + 10, memuse=8)
def test_hash(self, size):
@@ -1044,11 +1117,11 @@ class ListTest(unittest.TestCase):
self.assertEqual(s[-5:], '0, 0]')
self.assertEqual(s.count('0'), size)
- @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size)
+ @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * ascii_char_size)
def test_repr_small(self, size):
return self.basic_test_repr(size)
- @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size)
+ @bigmemtest(size=_2G + 2, memuse=8 + 3 * ascii_char_size)
def test_repr_large(self, size):
return self.basic_test_repr(size)
diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py
index 1e9e888..04d8f9d 100644
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -208,9 +208,9 @@ class BinASCIITest(unittest.TestCase):
except Exception as err:
self.fail("{}({!r}) raises {!r}".format(func, empty, err))
- def test_unicode_strings(self):
- # Unicode strings are not accepted.
- for func in all_functions:
+ def test_unicode_b2a(self):
+ # Unicode strings are not accepted by b2a_* functions.
+ for func in set(all_functions) - set(a2b_functions) | {'rledecode_hqx'}:
try:
self.assertRaises(TypeError, getattr(binascii, func), "test")
except Exception as err:
@@ -218,6 +218,34 @@ class BinASCIITest(unittest.TestCase):
# crc_hqx needs 2 arguments
self.assertRaises(TypeError, binascii.crc_hqx, "test", 0)
+ def test_unicode_a2b(self):
+ # Unicode strings are accepted by a2b_* functions.
+ MAX_ALL = 45
+ raw = self.rawdata[:MAX_ALL]
+ for fa, fb in zip(a2b_functions, b2a_functions):
+ if fa == 'rledecode_hqx':
+ # Takes non-ASCII data
+ continue
+ a2b = getattr(binascii, fa)
+ b2a = getattr(binascii, fb)
+ try:
+ a = b2a(self.type2test(raw))
+ binary_res = a2b(a)
+ a = a.decode('ascii')
+ res = a2b(a)
+ except Exception as err:
+ self.fail("{}/{} conversion raises {!r}".format(fb, fa, err))
+ if fb == 'b2a_hqx':
+ # b2a_hqx returns a tuple
+ res, _ = res
+ binary_res, _ = binary_res
+ self.assertEqual(res, raw, "{}/{} conversion: "
+ "{!r} != {!r}".format(fb, fa, res, raw))
+ self.assertEqual(res, binary_res)
+ self.assertIsInstance(res, bytes)
+ # non-ASCII string
+ self.assertRaises(ValueError, a2b, "\x80")
+
class ArrayBinASCIITest(BinASCIITest):
def type2test(self, s):
diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py
index b296870..4bab28b 100644
--- a/Lib/test/test_bool.py
+++ b/Lib/test/test_bool.py
@@ -330,6 +330,16 @@ class BoolTest(unittest.TestCase):
except (Exception) as e_len:
self.assertEqual(str(e_bool), str(e_len))
+ def test_real_and_imag(self):
+ self.assertEqual(True.real, 1)
+ self.assertEqual(True.imag, 0)
+ self.assertIs(type(True.real), int)
+ self.assertIs(type(True.imag), int)
+ self.assertEqual(False.real, 0)
+ self.assertEqual(False.imag, 0)
+ self.assertIs(type(False.real), int)
+ self.assertIs(type(False.imag), int)
+
def test_main():
support.run_unittest(BoolTest)
diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py
new file mode 100644
index 0000000..747e2a2
--- /dev/null
+++ b/Lib/test/test_buffer.py
@@ -0,0 +1,4291 @@
+#
+# The ndarray object from _testbuffer.c is a complete implementation of
+# a PEP-3118 buffer provider. It is independent from NumPy's ndarray
+# and the tests don't require NumPy.
+#
+# If NumPy is present, some tests check both ndarray implementations
+# against each other.
+#
+# Most ndarray tests also check that memoryview(ndarray) behaves in
+# the same way as the original. Thus, a substantial part of the
+# memoryview tests is now in this module.
+#
+
+import unittest
+from test import support
+from itertools import permutations, product
+from random import randrange, sample, choice
+from sysconfig import get_config_var
+import warnings
+import sys, array, io
+from decimal import Decimal
+from fractions import Fraction
+
+try:
+ from _testbuffer import *
+except ImportError:
+ ndarray = None
+
+try:
+ import struct
+except ImportError:
+ struct = None
+
+try:
+ import ctypes
+except ImportError:
+ ctypes = None
+
+try:
+ with warnings.catch_warnings():
+ from numpy import ndarray as numpy_array
+except ImportError:
+ numpy_array = None
+
+
+SHORT_TEST = True
+
+
+# ======================================================================
+# Random lists by format specifier
+# ======================================================================
+
+# Native format chars and their ranges.
+NATIVE = {
+ '?':0, 'c':0, 'b':0, 'B':0,
+ 'h':0, 'H':0, 'i':0, 'I':0,
+ 'l':0, 'L':0, 'n':0, 'N':0,
+ 'f':0, 'd':0, 'P':0
+}
+
+# NumPy does not have 'n' or 'N':
+if numpy_array:
+ del NATIVE['n']
+ del NATIVE['N']
+
+if struct:
+ try:
+ # Add "qQ" if present in native mode.
+ struct.pack('Q', 2**64-1)
+ NATIVE['q'] = 0
+ NATIVE['Q'] = 0
+ except struct.error:
+ pass
+
+# Standard format chars and their ranges.
+STANDARD = {
+ '?':(0, 2), 'c':(0, 1<<8),
+ 'b':(-(1<<7), 1<<7), 'B':(0, 1<<8),
+ 'h':(-(1<<15), 1<<15), 'H':(0, 1<<16),
+ 'i':(-(1<<31), 1<<31), 'I':(0, 1<<32),
+ 'l':(-(1<<31), 1<<31), 'L':(0, 1<<32),
+ 'q':(-(1<<63), 1<<63), 'Q':(0, 1<<64),
+ 'f':(-(1<<63), 1<<63), 'd':(-(1<<1023), 1<<1023)
+}
+
+def native_type_range(fmt):
+ """Return range of a native type."""
+ if fmt == 'c':
+ lh = (0, 256)
+ elif fmt == '?':
+ lh = (0, 2)
+ elif fmt == 'f':
+ lh = (-(1<<63), 1<<63)
+ elif fmt == 'd':
+ lh = (-(1<<1023), 1<<1023)
+ else:
+ for exp in (128, 127, 64, 63, 32, 31, 16, 15, 8, 7):
+ try:
+ struct.pack(fmt, (1<<exp)-1)
+ break
+ except struct.error:
+ pass
+ lh = (-(1<<exp), 1<<exp) if exp & 1 else (0, 1<<exp)
+ return lh
+
+fmtdict = {
+ '':NATIVE,
+ '@':NATIVE,
+ '<':STANDARD,
+ '>':STANDARD,
+ '=':STANDARD,
+ '!':STANDARD
+}
+
+if struct:
+ for fmt in fmtdict['@']:
+ fmtdict['@'][fmt] = native_type_range(fmt)
+
+MEMORYVIEW = NATIVE.copy()
+ARRAY = NATIVE.copy()
+for k in NATIVE:
+ if not k in "bBhHiIlLfd":
+ del ARRAY[k]
+
+BYTEFMT = NATIVE.copy()
+for k in NATIVE:
+ if not k in "Bbc":
+ del BYTEFMT[k]
+
+fmtdict['m'] = MEMORYVIEW
+fmtdict['@m'] = MEMORYVIEW
+fmtdict['a'] = ARRAY
+fmtdict['b'] = BYTEFMT
+fmtdict['@b'] = BYTEFMT
+
+# Capabilities of the test objects:
+MODE = 0
+MULT = 1
+cap = { # format chars # multiplier
+ 'ndarray': (['', '@', '<', '>', '=', '!'], ['', '1', '2', '3']),
+ 'array': (['a'], ['']),
+ 'numpy': ([''], ['']),
+ 'memoryview': (['@m', 'm'], ['']),
+ 'bytefmt': (['@b', 'b'], ['']),
+}
+
+def randrange_fmt(mode, char, obj):
+ """Return random item for a type specified by a mode and a single
+ format character."""
+ x = randrange(*fmtdict[mode][char])
+ if char == 'c':
+ x = bytes(chr(x), 'latin1')
+ if char == '?':
+ x = bool(x)
+ if char == 'f' or char == 'd':
+ x = struct.pack(char, x)
+ x = struct.unpack(char, x)[0]
+ if obj == 'numpy' and x == b'\x00':
+ # http://projects.scipy.org/numpy/ticket/1925
+ x = b'\x01'
+ return x
+
+def gen_item(fmt, obj):
+ """Return single random item."""
+ mode, chars = fmt.split('#')
+ x = []
+ for c in chars:
+ x.append(randrange_fmt(mode, c, obj))
+ return x[0] if len(x) == 1 else tuple(x)
+
+def gen_items(n, fmt, obj):
+ """Return a list of random items (or a scalar)."""
+ if n == 0:
+ return gen_item(fmt, obj)
+ lst = [0] * n
+ for i in range(n):
+ lst[i] = gen_item(fmt, obj)
+ return lst
+
+def struct_items(n, obj):
+ mode = choice(cap[obj][MODE])
+ xfmt = mode + '#'
+ fmt = mode.strip('amb')
+ nmemb = randrange(2, 10) # number of struct members
+ for _ in range(nmemb):
+ char = choice(tuple(fmtdict[mode]))
+ multiplier = choice(cap[obj][MULT])
+ xfmt += (char * int(multiplier if multiplier else 1))
+ fmt += (multiplier + char)
+ items = gen_items(n, xfmt, obj)
+ item = gen_item(xfmt, obj)
+ return fmt, items, item
+
+def randitems(n, obj='ndarray', mode=None, char=None):
+ """Return random format, items, item."""
+ if mode is None:
+ mode = choice(cap[obj][MODE])
+ if char is None:
+ char = choice(tuple(fmtdict[mode]))
+ multiplier = choice(cap[obj][MULT])
+ fmt = mode + '#' + char * int(multiplier if multiplier else 1)
+ items = gen_items(n, fmt, obj)
+ item = gen_item(fmt, obj)
+ fmt = mode.strip('amb') + multiplier + char
+ return fmt, items, item
+
+def iter_mode(n, obj='ndarray'):
+ """Iterate through supported mode/char combinations."""
+ for mode in cap[obj][MODE]:
+ for char in fmtdict[mode]:
+ yield randitems(n, obj, mode, char)
+
+def iter_format(nitems, testobj='ndarray'):
+ """Yield (format, items, item) for all possible modes and format
+ characters plus one random compound format string."""
+ for t in iter_mode(nitems, testobj):
+ yield t
+ if testobj != 'ndarray':
+ raise StopIteration
+ yield struct_items(nitems, testobj)
+
+
+def is_byte_format(fmt):
+ return 'c' in fmt or 'b' in fmt or 'B' in fmt
+
+def is_memoryview_format(fmt):
+ """format suitable for memoryview"""
+ x = len(fmt)
+ return ((x == 1 or (x == 2 and fmt[0] == '@')) and
+ fmt[x-1] in MEMORYVIEW)
+
+NON_BYTE_FORMAT = [c for c in fmtdict['@'] if not is_byte_format(c)]
+
+
+# ======================================================================
+# Multi-dimensional tolist(), slicing and slice assignments
+# ======================================================================
+
+def atomp(lst):
+ """Tuple items (representing structs) are regarded as atoms."""
+ return not isinstance(lst, list)
+
+def listp(lst):
+ return isinstance(lst, list)
+
+def prod(lst):
+ """Product of list elements."""
+ if len(lst) == 0:
+ return 0
+ x = lst[0]
+ for v in lst[1:]:
+ x *= v
+ return x
+
+def strides_from_shape(ndim, shape, itemsize, layout):
+ """Calculate strides of a contiguous array. Layout is 'C' or
+ 'F' (Fortran)."""
+ if ndim == 0:
+ return ()
+ if layout == 'C':
+ strides = list(shape[1:]) + [itemsize]
+ for i in range(ndim-2, -1, -1):
+ strides[i] *= strides[i+1]
+ else:
+ strides = [itemsize] + list(shape[:-1])
+ for i in range(1, ndim):
+ strides[i] *= strides[i-1]
+ return strides
+
+def _ca(items, s):
+ """Convert flat item list to the nested list representation of a
+ multidimensional C array with shape 's'."""
+ if atomp(items):
+ return items
+ if len(s) == 0:
+ return items[0]
+ lst = [0] * s[0]
+ stride = len(items) // s[0] if s[0] else 0
+ for i in range(s[0]):
+ start = i*stride
+ lst[i] = _ca(items[start:start+stride], s[1:])
+ return lst
+
+def _fa(items, s):
+ """Convert flat item list to the nested list representation of a
+ multidimensional Fortran array with shape 's'."""
+ if atomp(items):
+ return items
+ if len(s) == 0:
+ return items[0]
+ lst = [0] * s[0]
+ stride = s[0]
+ for i in range(s[0]):
+ lst[i] = _fa(items[i::stride], s[1:])
+ return lst
+
+def carray(items, shape):
+ if listp(items) and not 0 in shape and prod(shape) != len(items):
+ raise ValueError("prod(shape) != len(items)")
+ return _ca(items, shape)
+
+def farray(items, shape):
+ if listp(items) and not 0 in shape and prod(shape) != len(items):
+ raise ValueError("prod(shape) != len(items)")
+ return _fa(items, shape)
+
+def indices(shape):
+ """Generate all possible tuples of indices."""
+ iterables = [range(v) for v in shape]
+ return product(*iterables)
+
+def getindex(ndim, ind, strides):
+ """Convert multi-dimensional index to the position in the flat list."""
+ ret = 0
+ for i in range(ndim):
+ ret += strides[i] * ind[i]
+ return ret
+
+def transpose(src, shape):
+ """Transpose flat item list that is regarded as a multi-dimensional
+ matrix defined by shape: dest...[k][j][i] = src[i][j][k]... """
+ if not shape:
+ return src
+ ndim = len(shape)
+ sstrides = strides_from_shape(ndim, shape, 1, 'C')
+ dstrides = strides_from_shape(ndim, shape[::-1], 1, 'C')
+ dest = [0] * len(src)
+ for ind in indices(shape):
+ fr = getindex(ndim, ind, sstrides)
+ to = getindex(ndim, ind[::-1], dstrides)
+ dest[to] = src[fr]
+ return dest
+
+def _flatten(lst):
+ """flatten list"""
+ if lst == []:
+ return lst
+ if atomp(lst):
+ return [lst]
+ return _flatten(lst[0]) + _flatten(lst[1:])
+
+def flatten(lst):
+ """flatten list or return scalar"""
+ if atomp(lst): # scalar
+ return lst
+ return _flatten(lst)
+
+def slice_shape(lst, slices):
+ """Get the shape of lst after slicing: slices is a list of slice
+ objects."""
+ if atomp(lst):
+ return []
+ return [len(lst[slices[0]])] + slice_shape(lst[0], slices[1:])
+
+def multislice(lst, slices):
+ """Multi-dimensional slicing: slices is a list of slice objects."""
+ if atomp(lst):
+ return lst
+ return [multislice(sublst, slices[1:]) for sublst in lst[slices[0]]]
+
+def m_assign(llst, rlst, lslices, rslices):
+ """Multi-dimensional slice assignment: llst and rlst are the operands,
+ lslices and rslices are lists of slice objects. llst and rlst must
+ have the same structure.
+
+ For a two-dimensional example, this is not implemented in Python:
+
+ llst[0:3:2, 0:3:2] = rlst[1:3:1, 1:3:1]
+
+ Instead we write:
+
+ lslices = [slice(0,3,2), slice(0,3,2)]
+ rslices = [slice(1,3,1), slice(1,3,1)]
+ multislice_assign(llst, rlst, lslices, rslices)
+ """
+ if atomp(rlst):
+ return rlst
+ rlst = [m_assign(l, r, lslices[1:], rslices[1:])
+ for l, r in zip(llst[lslices[0]], rlst[rslices[0]])]
+ llst[lslices[0]] = rlst
+ return llst
+
+def cmp_structure(llst, rlst, lslices, rslices):
+ """Compare the structure of llst[lslices] and rlst[rslices]."""
+ lshape = slice_shape(llst, lslices)
+ rshape = slice_shape(rlst, rslices)
+ if (len(lshape) != len(rshape)):
+ return -1
+ for i in range(len(lshape)):
+ if lshape[i] != rshape[i]:
+ return -1
+ if lshape[i] == 0:
+ return 0
+ return 0
+
+def multislice_assign(llst, rlst, lslices, rslices):
+ """Return llst after assigning: llst[lslices] = rlst[rslices]"""
+ if cmp_structure(llst, rlst, lslices, rslices) < 0:
+ raise ValueError("lvalue and rvalue have different structures")
+ return m_assign(llst, rlst, lslices, rslices)
+
+
+# ======================================================================
+# Random structures
+# ======================================================================
+
+#
+# PEP-3118 is very permissive with respect to the contents of a
+# Py_buffer. In particular:
+#
+# - shape can be zero
+# - strides can be any integer, including zero
+# - offset can point to any location in the underlying
+# memory block, provided that it is a multiple of
+# itemsize.
+#
+# The functions in this section test and verify random structures
+# in full generality. A structure is valid iff it fits in the
+# underlying memory block.
+#
+# The structure 't' (short for 'tuple') is fully defined by:
+#
+# t = (memlen, itemsize, ndim, shape, strides, offset)
+#
+
+def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
+ """Verify that the parameters represent a valid array within
+ the bounds of the allocated memory:
+ char *mem: start of the physical memory block
+ memlen: length of the physical memory block
+ offset: (char *)buf - mem
+ """
+ if offset % itemsize:
+ return False
+ if offset < 0 or offset+itemsize > memlen:
+ return False
+ if any(v % itemsize for v in strides):
+ return False
+
+ if ndim <= 0:
+ return ndim == 0 and not shape and not strides
+ if 0 in shape:
+ return True
+
+ imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] <= 0)
+ imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] > 0)
+
+ return 0 <= offset+imin and offset+imax+itemsize <= memlen
+
+def get_item(lst, indices):
+ for i in indices:
+ lst = lst[i]
+ return lst
+
+def memory_index(indices, t):
+ """Location of an item in the underlying memory."""
+ memlen, itemsize, ndim, shape, strides, offset = t
+ p = offset
+ for i in range(ndim):
+ p += strides[i]*indices[i]
+ return p
+
+def is_overlapping(t):
+ """The structure 't' is overlapping if at least one memory location
+ is visited twice while iterating through all possible tuples of
+ indices."""
+ memlen, itemsize, ndim, shape, strides, offset = t
+ visited = 1<<memlen
+ for ind in indices(shape):
+ i = memory_index(ind, t)
+ bit = 1<<i
+ if visited & bit:
+ return True
+ visited |= bit
+ return False
+
+def rand_structure(itemsize, valid, maxdim=5, maxshape=16, shape=()):
+ """Return random structure:
+ (memlen, itemsize, ndim, shape, strides, offset)
+ If 'valid' is true, the returned structure is valid, otherwise invalid.
+ If 'shape' is given, use that instead of creating a random shape.
+ """
+ if not shape:
+ ndim = randrange(maxdim+1)
+ if (ndim == 0):
+ if valid:
+ return itemsize, itemsize, ndim, (), (), 0
+ else:
+ nitems = randrange(1, 16+1)
+ memlen = nitems * itemsize
+ offset = -itemsize if randrange(2) == 0 else memlen
+ return memlen, itemsize, ndim, (), (), offset
+
+ minshape = 2
+ n = randrange(100)
+ if n >= 95 and valid:
+ minshape = 0
+ elif n >= 90:
+ minshape = 1
+ shape = [0] * ndim
+
+ for i in range(ndim):
+ shape[i] = randrange(minshape, maxshape+1)
+ else:
+ ndim = len(shape)
+
+ maxstride = 5
+ n = randrange(100)
+ zero_stride = True if n >= 95 and n & 1 else False
+
+ strides = [0] * ndim
+ strides[ndim-1] = itemsize * randrange(-maxstride, maxstride+1)
+ if not zero_stride and strides[ndim-1] == 0:
+ strides[ndim-1] = itemsize
+
+ for i in range(ndim-2, -1, -1):
+ maxstride *= shape[i+1] if shape[i+1] else 1
+ if zero_stride:
+ strides[i] = itemsize * randrange(-maxstride, maxstride+1)
+ else:
+ strides[i] = ((1,-1)[randrange(2)] *
+ itemsize * randrange(1, maxstride+1))
+
+ imin = imax = 0
+ if not 0 in shape:
+ imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] <= 0)
+ imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
+ if strides[j] > 0)
+
+ nitems = imax - imin
+ if valid:
+ offset = -imin * itemsize
+ memlen = offset + (imax+1) * itemsize
+ else:
+ memlen = (-imin + imax) * itemsize
+ offset = -imin-itemsize if randrange(2) == 0 else memlen
+ return memlen, itemsize, ndim, shape, strides, offset
+
+def randslice_from_slicelen(slicelen, listlen):
+ """Create a random slice of len slicelen that fits into listlen."""
+ maxstart = listlen - slicelen
+ start = randrange(maxstart+1)
+ maxstep = (listlen - start) // slicelen if slicelen else 1
+ step = randrange(1, maxstep+1)
+ stop = start + slicelen * step
+ s = slice(start, stop, step)
+ _, _, _, control = slice_indices(s, listlen)
+ if control != slicelen:
+ raise RuntimeError
+ return s
+
+def randslice_from_shape(ndim, shape):
+ """Create two sets of slices for an array x with shape 'shape'
+ such that shapeof(x[lslices]) == shapeof(x[rslices])."""
+ lslices = [0] * ndim
+ rslices = [0] * ndim
+ for n in range(ndim):
+ l = shape[n]
+ slicelen = randrange(1, l+1) if l > 0 else 0
+ lslices[n] = randslice_from_slicelen(slicelen, l)
+ rslices[n] = randslice_from_slicelen(slicelen, l)
+ return tuple(lslices), tuple(rslices)
+
+def rand_aligned_slices(maxdim=5, maxshape=16):
+ """Create (lshape, rshape, tuple(lslices), tuple(rslices)) such that
+ shapeof(x[lslices]) == shapeof(y[rslices]), where x is an array
+ with shape 'lshape' and y is an array with shape 'rshape'."""
+ ndim = randrange(1, maxdim+1)
+ minshape = 2
+ n = randrange(100)
+ if n >= 95:
+ minshape = 0
+ elif n >= 90:
+ minshape = 1
+ all_random = True if randrange(100) >= 80 else False
+ lshape = [0]*ndim; rshape = [0]*ndim
+ lslices = [0]*ndim; rslices = [0]*ndim
+
+ for n in range(ndim):
+ small = randrange(minshape, maxshape+1)
+ big = randrange(minshape, maxshape+1)
+ if big < small:
+ big, small = small, big
+
+ # Create a slice that fits the smaller value.
+ if all_random:
+ start = randrange(-small, small+1)
+ stop = randrange(-small, small+1)
+ step = (1,-1)[randrange(2)] * randrange(1, small+2)
+ s_small = slice(start, stop, step)
+ _, _, _, slicelen = slice_indices(s_small, small)
+ else:
+ slicelen = randrange(1, small+1) if small > 0 else 0
+ s_small = randslice_from_slicelen(slicelen, small)
+
+ # Create a slice of the same length for the bigger value.
+ s_big = randslice_from_slicelen(slicelen, big)
+ if randrange(2) == 0:
+ rshape[n], lshape[n] = big, small
+ rslices[n], lslices[n] = s_big, s_small
+ else:
+ rshape[n], lshape[n] = small, big
+ rslices[n], lslices[n] = s_small, s_big
+
+ return lshape, rshape, tuple(lslices), tuple(rslices)
+
+def randitems_from_structure(fmt, t):
+ """Return a list of random items for structure 't' with format
+ 'fmtchar'."""
+ memlen, itemsize, _, _, _, _ = t
+ return gen_items(memlen//itemsize, '#'+fmt, 'numpy')
+
+def ndarray_from_structure(items, fmt, t, flags=0):
+ """Return ndarray from the tuple returned by rand_structure()"""
+ memlen, itemsize, ndim, shape, strides, offset = t
+ return ndarray(items, shape=shape, strides=strides, format=fmt,
+ offset=offset, flags=ND_WRITABLE|flags)
+
+def numpy_array_from_structure(items, fmt, t):
+ """Return numpy_array from the tuple returned by rand_structure()"""
+ memlen, itemsize, ndim, shape, strides, offset = t
+ buf = bytearray(memlen)
+ for j, v in enumerate(items):
+ struct.pack_into(fmt, buf, j*itemsize, v)
+ return numpy_array(buffer=buf, shape=shape, strides=strides,
+ dtype=fmt, offset=offset)
+
+
+# ======================================================================
+# memoryview casts
+# ======================================================================
+
+def cast_items(exporter, fmt, itemsize, shape=None):
+ """Interpret the raw memory of 'exporter' as a list of items with
+ size 'itemsize'. If shape=None, the new structure is assumed to
+ be 1-D with n * itemsize = bytelen. If shape is given, the usual
+ constraint for contiguous arrays prod(shape) * itemsize = bytelen
+ applies. On success, return (items, shape). If the constraints
+ cannot be met, return (None, None). If a chunk of bytes is interpreted
+ as NaN as a result of float conversion, return ('nan', None)."""
+ bytelen = exporter.nbytes
+ if shape:
+ if prod(shape) * itemsize != bytelen:
+ return None, shape
+ elif shape == []:
+ if exporter.ndim == 0 or itemsize != bytelen:
+ return None, shape
+ else:
+ n, r = divmod(bytelen, itemsize)
+ shape = [n]
+ if r != 0:
+ return None, shape
+
+ mem = exporter.tobytes()
+ byteitems = [mem[i:i+itemsize] for i in range(0, len(mem), itemsize)]
+
+ items = []
+ for v in byteitems:
+ item = struct.unpack(fmt, v)[0]
+ if item != item:
+ return 'nan', shape
+ items.append(item)
+
+ return (items, shape) if shape != [] else (items[0], shape)
+
+def gencastshapes():
+ """Generate shapes to test casting."""
+ for n in range(32):
+ yield [n]
+ ndim = randrange(4, 6)
+ minshape = 1 if randrange(100) > 80 else 2
+ yield [randrange(minshape, 5) for _ in range(ndim)]
+ ndim = randrange(2, 4)
+ minshape = 1 if randrange(100) > 80 else 2
+ yield [randrange(minshape, 5) for _ in range(ndim)]
+
+
+# ======================================================================
+# Actual tests
+# ======================================================================
+
+def genslices(n):
+ """Generate all possible slices for a single dimension."""
+ return product(range(-n, n+1), range(-n, n+1), range(-n, n+1))
+
+def genslices_ndim(ndim, shape):
+ """Generate all possible slice tuples for 'shape'."""
+ iterables = [genslices(shape[n]) for n in range(ndim)]
+ return product(*iterables)
+
+def rslice(n, allow_empty=False):
+ """Generate random slice for a single dimension of length n.
+ If zero=True, the slices may be empty, otherwise they will
+ be non-empty."""
+ minlen = 0 if allow_empty or n == 0 else 1
+ slicelen = randrange(minlen, n+1)
+ return randslice_from_slicelen(slicelen, n)
+
+def rslices(n, allow_empty=False):
+ """Generate random slices for a single dimension."""
+ for _ in range(5):
+ yield rslice(n, allow_empty)
+
+def rslices_ndim(ndim, shape, iterations=5):
+ """Generate random slice tuples for 'shape'."""
+ # non-empty slices
+ for _ in range(iterations):
+ yield tuple(rslice(shape[n]) for n in range(ndim))
+ # possibly empty slices
+ for _ in range(iterations):
+ yield tuple(rslice(shape[n], allow_empty=True) for n in range(ndim))
+ # invalid slices
+ yield tuple(slice(0,1,0) for _ in range(ndim))
+
+def rpermutation(iterable, r=None):
+ pool = tuple(iterable)
+ r = len(pool) if r is None else r
+ yield tuple(sample(pool, r))
+
+def ndarray_print(nd):
+ """Print ndarray for debugging."""
+ try:
+ x = nd.tolist()
+ except (TypeError, NotImplementedError):
+ x = nd.tobytes()
+ if isinstance(nd, ndarray):
+ offset = nd.offset
+ flags = nd.flags
+ else:
+ offset = 'unknown'
+ flags = 'unknown'
+ print("ndarray(%s, shape=%s, strides=%s, suboffsets=%s, offset=%s, "
+ "format='%s', itemsize=%s, flags=%s)" %
+ (x, nd.shape, nd.strides, nd.suboffsets, offset,
+ nd.format, nd.itemsize, flags))
+ sys.stdout.flush()
+
+
+ITERATIONS = 100
+MAXDIM = 5
+MAXSHAPE = 10
+
+if SHORT_TEST:
+ ITERATIONS = 10
+ MAXDIM = 3
+ MAXSHAPE = 4
+ genslices = rslices
+ genslices_ndim = rslices_ndim
+ permutations = rpermutation
+
+
+@unittest.skipUnless(struct, 'struct module required for this test.')
+@unittest.skipUnless(ndarray, 'ndarray object required for this test')
+class TestBufferProtocol(unittest.TestCase):
+
+ def setUp(self):
+ # The suboffsets tests need sizeof(void *).
+ self.sizeof_void_p = get_sizeof_void_p()
+
+ def verify(self, result, obj=-1,
+ itemsize={1}, fmt=-1, readonly={1},
+ ndim={1}, shape=-1, strides=-1,
+ lst=-1, sliced=False, cast=False):
+ # Verify buffer contents against expected values. Default values
+ # are deliberately initialized to invalid types.
+ if shape:
+ expected_len = prod(shape)*itemsize
+ else:
+ if not fmt: # array has been implicitly cast to unsigned bytes
+ expected_len = len(lst)
+ else: # ndim = 0
+ expected_len = itemsize
+
+ # Reconstruct suboffsets from strides. Support for slicing
+ # could be added, but is currently only needed for test_getbuf().
+ suboffsets = ()
+ if result.suboffsets:
+ self.assertGreater(ndim, 0)
+
+ suboffset0 = 0
+ for n in range(1, ndim):
+ if shape[n] == 0:
+ break
+ if strides[n] <= 0:
+ suboffset0 += -strides[n] * (shape[n]-1)
+
+ suboffsets = [suboffset0] + [-1 for v in range(ndim-1)]
+
+ # Not correct if slicing has occurred in the first dimension.
+ stride0 = self.sizeof_void_p
+ if strides[0] < 0:
+ stride0 = -stride0
+ strides = [stride0] + list(strides[1:])
+
+ self.assertIs(result.obj, obj)
+ self.assertEqual(result.nbytes, expected_len)
+ self.assertEqual(result.itemsize, itemsize)
+ self.assertEqual(result.format, fmt)
+ self.assertEqual(result.readonly, readonly)
+ self.assertEqual(result.ndim, ndim)
+ self.assertEqual(result.shape, tuple(shape))
+ if not (sliced and suboffsets):
+ self.assertEqual(result.strides, tuple(strides))
+ self.assertEqual(result.suboffsets, tuple(suboffsets))
+
+ if isinstance(result, ndarray) or is_memoryview_format(fmt):
+ rep = result.tolist() if fmt else result.tobytes()
+ self.assertEqual(rep, lst)
+
+ if not fmt: # array has been cast to unsigned bytes,
+ return # the remaining tests won't work.
+
+ # PyBuffer_GetPointer() is the definition how to access an item.
+ # If PyBuffer_GetPointer(indices) is correct for all possible
+ # combinations of indices, the buffer is correct.
+ #
+ # Also test tobytes() against the flattened 'lst', with all items
+ # packed to bytes.
+ if not cast: # casts chop up 'lst' in different ways
+ b = bytearray()
+ buf_err = None
+ for ind in indices(shape):
+ try:
+ item1 = get_pointer(result, ind)
+ item2 = get_item(lst, ind)
+ if isinstance(item2, tuple):
+ x = struct.pack(fmt, *item2)
+ else:
+ x = struct.pack(fmt, item2)
+ b.extend(x)
+ except BufferError:
+ buf_err = True # re-exporter does not provide full buffer
+ break
+ self.assertEqual(item1, item2)
+
+ if not buf_err:
+ # test tobytes()
+ self.assertEqual(result.tobytes(), b)
+
+ # lst := expected multi-dimensional logical representation
+ # flatten(lst) := elements in C-order
+ ff = fmt if fmt else 'B'
+ flattened = flatten(lst)
+
+ # Rules for 'A': if the array is already contiguous, return
+ # the array unaltered. Otherwise, return a contiguous 'C'
+ # representation.
+ for order in ['C', 'F', 'A']:
+ expected = result
+ if order == 'F':
+ if not is_contiguous(result, 'A') or \
+ is_contiguous(result, 'C'):
+ # For constructing the ndarray, convert the
+ # flattened logical representation to Fortran order.
+ trans = transpose(flattened, shape)
+ expected = ndarray(trans, shape=shape, format=ff,
+ flags=ND_FORTRAN)
+ else: # 'C', 'A'
+ if not is_contiguous(result, 'A') or \
+ is_contiguous(result, 'F') and order == 'C':
+ # The flattened list is already in C-order.
+ expected = ndarray(flattened, shape=shape, format=ff)
+
+ contig = get_contiguous(result, PyBUF_READ, order)
+ self.assertEqual(contig.tobytes(), b)
+ self.assertTrue(cmp_contig(contig, expected))
+
+ if ndim == 0:
+ continue
+
+ nmemb = len(flattened)
+ ro = 0 if readonly else ND_WRITABLE
+
+ ### See comment in test_py_buffer_to_contiguous for an
+ ### explanation why these tests are valid.
+
+ # To 'C'
+ contig = py_buffer_to_contiguous(result, 'C', PyBUF_FULL_RO)
+ self.assertEqual(len(contig), nmemb * itemsize)
+ initlst = [struct.unpack_from(fmt, contig, n*itemsize)
+ for n in range(nmemb)]
+ if len(initlst[0]) == 1:
+ initlst = [v[0] for v in initlst]
+
+ y = ndarray(initlst, shape=shape, flags=ro, format=fmt)
+ self.assertEqual(memoryview(y), memoryview(result))
+
+ # To 'F'
+ contig = py_buffer_to_contiguous(result, 'F', PyBUF_FULL_RO)
+ self.assertEqual(len(contig), nmemb * itemsize)
+ initlst = [struct.unpack_from(fmt, contig, n*itemsize)
+ for n in range(nmemb)]
+ if len(initlst[0]) == 1:
+ initlst = [v[0] for v in initlst]
+
+ y = ndarray(initlst, shape=shape, flags=ro|ND_FORTRAN,
+ format=fmt)
+ self.assertEqual(memoryview(y), memoryview(result))
+
+ # To 'A'
+ contig = py_buffer_to_contiguous(result, 'A', PyBUF_FULL_RO)
+ self.assertEqual(len(contig), nmemb * itemsize)
+ initlst = [struct.unpack_from(fmt, contig, n*itemsize)
+ for n in range(nmemb)]
+ if len(initlst[0]) == 1:
+ initlst = [v[0] for v in initlst]
+
+ f = ND_FORTRAN if is_contiguous(result, 'F') else 0
+ y = ndarray(initlst, shape=shape, flags=f|ro, format=fmt)
+ self.assertEqual(memoryview(y), memoryview(result))
+
+ if is_memoryview_format(fmt):
+ try:
+ m = memoryview(result)
+ except BufferError: # re-exporter does not provide full information
+ return
+ ex = result.obj if isinstance(result, memoryview) else result
+ self.assertIs(m.obj, ex)
+ self.assertEqual(m.nbytes, expected_len)
+ self.assertEqual(m.itemsize, itemsize)
+ self.assertEqual(m.format, fmt)
+ self.assertEqual(m.readonly, readonly)
+ self.assertEqual(m.ndim, ndim)
+ self.assertEqual(m.shape, tuple(shape))
+ if not (sliced and suboffsets):
+ self.assertEqual(m.strides, tuple(strides))
+ self.assertEqual(m.suboffsets, tuple(suboffsets))
+
+ n = 1 if ndim == 0 else len(lst)
+ self.assertEqual(len(m), n)
+
+ rep = result.tolist() if fmt else result.tobytes()
+ self.assertEqual(rep, lst)
+ self.assertEqual(m, result)
+
+ def verify_getbuf(self, orig_ex, ex, req, sliced=False):
+ def simple_fmt(ex):
+ return ex.format == '' or ex.format == 'B'
+ def match(req, flag):
+ return ((req&flag) == flag)
+
+ if (# writable request to read-only exporter
+ (ex.readonly and match(req, PyBUF_WRITABLE)) or
+ # cannot match explicit contiguity request
+ (match(req, PyBUF_C_CONTIGUOUS) and not ex.c_contiguous) or
+ (match(req, PyBUF_F_CONTIGUOUS) and not ex.f_contiguous) or
+ (match(req, PyBUF_ANY_CONTIGUOUS) and not ex.contiguous) or
+ # buffer needs suboffsets
+ (not match(req, PyBUF_INDIRECT) and ex.suboffsets) or
+ # buffer without strides must be C-contiguous
+ (not match(req, PyBUF_STRIDES) and not ex.c_contiguous) or
+ # PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT
+ (not match(req, PyBUF_ND) and match(req, PyBUF_FORMAT))):
+
+ self.assertRaises(BufferError, ndarray, ex, getbuf=req)
+ return
+
+ if isinstance(ex, ndarray) or is_memoryview_format(ex.format):
+ lst = ex.tolist()
+ else:
+ nd = ndarray(ex, getbuf=PyBUF_FULL_RO)
+ lst = nd.tolist()
+
+ # The consumer may have requested default values or a NULL format.
+ ro = 0 if match(req, PyBUF_WRITABLE) else ex.readonly
+ fmt = ex.format
+ itemsize = ex.itemsize
+ ndim = ex.ndim
+ if not match(req, PyBUF_FORMAT):
+ # itemsize refers to the original itemsize before the cast.
+ # The equality product(shape) * itemsize = len still holds.
+ # The equality calcsize(format) = itemsize does _not_ hold.
+ fmt = ''
+ lst = orig_ex.tobytes() # Issue 12834
+ if not match(req, PyBUF_ND):
+ ndim = 1
+ shape = orig_ex.shape if match(req, PyBUF_ND) else ()
+ strides = orig_ex.strides if match(req, PyBUF_STRIDES) else ()
+
+ nd = ndarray(ex, getbuf=req)
+ self.verify(nd, obj=ex,
+ itemsize=itemsize, fmt=fmt, readonly=ro,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst, sliced=sliced)
+
+ def test_ndarray_getbuf(self):
+ requests = (
+ # distinct flags
+ PyBUF_INDIRECT, PyBUF_STRIDES, PyBUF_ND, PyBUF_SIMPLE,
+ PyBUF_C_CONTIGUOUS, PyBUF_F_CONTIGUOUS, PyBUF_ANY_CONTIGUOUS,
+ # compound requests
+ PyBUF_FULL, PyBUF_FULL_RO,
+ PyBUF_RECORDS, PyBUF_RECORDS_RO,
+ PyBUF_STRIDED, PyBUF_STRIDED_RO,
+ PyBUF_CONTIG, PyBUF_CONTIG_RO,
+ )
+ # items and format
+ items_fmt = (
+ ([True if x % 2 else False for x in range(12)], '?'),
+ ([1,2,3,4,5,6,7,8,9,10,11,12], 'b'),
+ ([1,2,3,4,5,6,7,8,9,10,11,12], 'B'),
+ ([(2**31-x) if x % 2 else (-2**31+x) for x in range(12)], 'l')
+ )
+ # shape, strides, offset
+ structure = (
+ ([], [], 0),
+ ([12], [], 0),
+ ([12], [-1], 11),
+ ([6], [2], 0),
+ ([6], [-2], 11),
+ ([3, 4], [], 0),
+ ([3, 4], [-4, -1], 11),
+ ([2, 2], [4, 1], 4),
+ ([2, 2], [-4, -1], 8)
+ )
+ # ndarray creation flags
+ ndflags = (
+ 0, ND_WRITABLE, ND_FORTRAN, ND_FORTRAN|ND_WRITABLE,
+ ND_PIL, ND_PIL|ND_WRITABLE
+ )
+ # flags that can actually be used as flags
+ real_flags = (0, PyBUF_WRITABLE, PyBUF_FORMAT,
+ PyBUF_WRITABLE|PyBUF_FORMAT)
+
+ for items, fmt in items_fmt:
+ itemsize = struct.calcsize(fmt)
+ for shape, strides, offset in structure:
+ strides = [v * itemsize for v in strides]
+ offset *= itemsize
+ for flags in ndflags:
+
+ if strides and (flags&ND_FORTRAN):
+ continue
+ if not shape and (flags&ND_PIL):
+ continue
+
+ _items = items if shape else items[0]
+ ex1 = ndarray(_items, format=fmt, flags=flags,
+ shape=shape, strides=strides, offset=offset)
+ ex2 = ex1[::-2] if shape else None
+
+ m1 = memoryview(ex1)
+ if ex2:
+ m2 = memoryview(ex2)
+ if ex1.ndim == 0 or (ex1.ndim == 1 and shape and strides):
+ self.assertEqual(m1, ex1)
+ if ex2 and ex2.ndim == 1 and shape and strides:
+ self.assertEqual(m2, ex2)
+
+ for req in requests:
+ for bits in real_flags:
+ self.verify_getbuf(ex1, ex1, req|bits)
+ self.verify_getbuf(ex1, m1, req|bits)
+ if ex2:
+ self.verify_getbuf(ex2, ex2, req|bits,
+ sliced=True)
+ self.verify_getbuf(ex2, m2, req|bits,
+ sliced=True)
+
+ items = [1,2,3,4,5,6,7,8,9,10,11,12]
+
+ # ND_GETBUF_FAIL
+ ex = ndarray(items, shape=[12], flags=ND_GETBUF_FAIL)
+ self.assertRaises(BufferError, ndarray, ex)
+
+ # Request complex structure from a simple exporter. In this
+ # particular case the test object is not PEP-3118 compliant.
+ base = ndarray([9], [1])
+ ex = ndarray(base, getbuf=PyBUF_SIMPLE)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_WRITABLE)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_ND)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_STRIDES)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_C_CONTIGUOUS)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_F_CONTIGUOUS)
+ self.assertRaises(BufferError, ndarray, ex, getbuf=PyBUF_ANY_CONTIGUOUS)
+ nd = ndarray(ex, getbuf=PyBUF_SIMPLE)
+
+ def test_ndarray_exceptions(self):
+ nd = ndarray([9], [1])
+ ndm = ndarray([9], [1], flags=ND_VAREXPORT)
+
+ # Initialization of a new ndarray or mutation of an existing array.
+ for c in (ndarray, nd.push, ndm.push):
+ # Invalid types.
+ self.assertRaises(TypeError, c, {1,2,3})
+ self.assertRaises(TypeError, c, [1,2,'3'])
+ self.assertRaises(TypeError, c, [1,2,(3,4)])
+ self.assertRaises(TypeError, c, [1,2,3], shape={3})
+ self.assertRaises(TypeError, c, [1,2,3], shape=[3], strides={1})
+ self.assertRaises(TypeError, c, [1,2,3], shape=[3], offset=[])
+ self.assertRaises(TypeError, c, [1], shape=[1], format={})
+ self.assertRaises(TypeError, c, [1], shape=[1], flags={})
+ self.assertRaises(TypeError, c, [1], shape=[1], getbuf={})
+
+ # ND_FORTRAN flag is only valid without strides.
+ self.assertRaises(TypeError, c, [1], shape=[1], strides=[1],
+ flags=ND_FORTRAN)
+
+ # ND_PIL flag is only valid with ndim > 0.
+ self.assertRaises(TypeError, c, [1], shape=[], flags=ND_PIL)
+
+ # Invalid items.
+ self.assertRaises(ValueError, c, [], shape=[1])
+ self.assertRaises(ValueError, c, ['XXX'], shape=[1], format="L")
+ # Invalid combination of items and format.
+ self.assertRaises(struct.error, c, [1000], shape=[1], format="B")
+ self.assertRaises(ValueError, c, [1,(2,3)], shape=[2], format="B")
+ self.assertRaises(ValueError, c, [1,2,3], shape=[3], format="QL")
+
+ # Invalid ndim.
+ n = ND_MAX_NDIM+1
+ self.assertRaises(ValueError, c, [1]*n, shape=[1]*n)
+
+ # Invalid shape.
+ self.assertRaises(ValueError, c, [1], shape=[-1])
+ self.assertRaises(ValueError, c, [1,2,3], shape=['3'])
+ self.assertRaises(OverflowError, c, [1], shape=[2**128])
+ # prod(shape) * itemsize != len(items)
+ self.assertRaises(ValueError, c, [1,2,3,4,5], shape=[2,2], offset=3)
+
+ # Invalid strides.
+ self.assertRaises(ValueError, c, [1,2,3], shape=[3], strides=['1'])
+ self.assertRaises(OverflowError, c, [1], shape=[1],
+ strides=[2**128])
+
+ # Invalid combination of strides and shape.
+ self.assertRaises(ValueError, c, [1,2], shape=[2,1], strides=[1])
+ # Invalid combination of strides and format.
+ self.assertRaises(ValueError, c, [1,2,3,4], shape=[2], strides=[3],
+ format="L")
+
+ # Invalid offset.
+ self.assertRaises(ValueError, c, [1,2,3], shape=[3], offset=4)
+ self.assertRaises(ValueError, c, [1,2,3], shape=[1], offset=3,
+ format="L")
+
+ # Invalid format.
+ self.assertRaises(ValueError, c, [1,2,3], shape=[3], format="")
+ self.assertRaises(struct.error, c, [(1,2,3)], shape=[1],
+ format="@#$")
+
+ # Striding out of the memory bounds.
+ items = [1,2,3,4,5,6,7,8,9,10]
+ self.assertRaises(ValueError, c, items, shape=[2,3],
+ strides=[-3, -2], offset=5)
+
+ # Constructing consumer: format argument invalid.
+ self.assertRaises(TypeError, c, bytearray(), format="Q")
+
+ # Constructing original base object: getbuf argument invalid.
+ self.assertRaises(TypeError, c, [1], shape=[1], getbuf=PyBUF_FULL)
+
+ # Shape argument is mandatory for original base objects.
+ self.assertRaises(TypeError, c, [1])
+
+
+ # PyBUF_WRITABLE request to read-only provider.
+ self.assertRaises(BufferError, ndarray, b'123', getbuf=PyBUF_WRITABLE)
+
+ # ND_VAREXPORT can only be specified during construction.
+ nd = ndarray([9], [1], flags=ND_VAREXPORT)
+ self.assertRaises(ValueError, nd.push, [1], [1], flags=ND_VAREXPORT)
+
+ # Invalid operation for consumers: push/pop
+ nd = ndarray(b'123')
+ self.assertRaises(BufferError, nd.push, [1], [1])
+ self.assertRaises(BufferError, nd.pop)
+
+ # ND_VAREXPORT not set: push/pop fail with exported buffers
+ nd = ndarray([9], [1])
+ nd.push([1], [1])
+ m = memoryview(nd)
+ self.assertRaises(BufferError, nd.push, [1], [1])
+ self.assertRaises(BufferError, nd.pop)
+ m.release()
+ nd.pop()
+
+ # Single remaining buffer: pop fails
+ self.assertRaises(BufferError, nd.pop)
+ del nd
+
+ # get_pointer()
+ self.assertRaises(TypeError, get_pointer, {}, [1,2,3])
+ self.assertRaises(TypeError, get_pointer, b'123', {})
+
+ nd = ndarray(list(range(100)), shape=[1]*100)
+ self.assertRaises(ValueError, get_pointer, nd, [5])
+
+ nd = ndarray(list(range(12)), shape=[3,4])
+ self.assertRaises(ValueError, get_pointer, nd, [2,3,4])
+ self.assertRaises(ValueError, get_pointer, nd, [3,3])
+ self.assertRaises(ValueError, get_pointer, nd, [-3,3])
+ self.assertRaises(OverflowError, get_pointer, nd, [1<<64,3])
+
+ # tolist() needs format
+ ex = ndarray([1,2,3], shape=[3], format='L')
+ nd = ndarray(ex, getbuf=PyBUF_SIMPLE)
+ self.assertRaises(ValueError, nd.tolist)
+
+ # memoryview_from_buffer()
+ ex1 = ndarray([1,2,3], shape=[3], format='L')
+ ex2 = ndarray(ex1)
+ nd = ndarray(ex2)
+ self.assertRaises(TypeError, nd.memoryview_from_buffer)
+
+ nd = ndarray([(1,)*200], shape=[1], format='L'*200)
+ self.assertRaises(TypeError, nd.memoryview_from_buffer)
+
+ n = ND_MAX_NDIM
+ nd = ndarray(list(range(n)), shape=[1]*n)
+ self.assertRaises(ValueError, nd.memoryview_from_buffer)
+
+ # get_contiguous()
+ nd = ndarray([1], shape=[1])
+ self.assertRaises(TypeError, get_contiguous, 1, 2, 3, 4, 5)
+ self.assertRaises(TypeError, get_contiguous, nd, "xyz", 'C')
+ self.assertRaises(OverflowError, get_contiguous, nd, 2**64, 'C')
+ self.assertRaises(TypeError, get_contiguous, nd, PyBUF_READ, 961)
+ self.assertRaises(UnicodeEncodeError, get_contiguous, nd, PyBUF_READ,
+ '\u2007')
+ self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'Z')
+ self.assertRaises(ValueError, get_contiguous, nd, 255, 'A')
+
+ # cmp_contig()
+ nd = ndarray([1], shape=[1])
+ self.assertRaises(TypeError, cmp_contig, 1, 2, 3, 4, 5)
+ self.assertRaises(TypeError, cmp_contig, {}, nd)
+ self.assertRaises(TypeError, cmp_contig, nd, {})
+
+ # is_contiguous()
+ nd = ndarray([1], shape=[1])
+ self.assertRaises(TypeError, is_contiguous, 1, 2, 3, 4, 5)
+ self.assertRaises(TypeError, is_contiguous, {}, 'A')
+ self.assertRaises(TypeError, is_contiguous, nd, 201)
+
+ def test_ndarray_linked_list(self):
+ for perm in permutations(range(5)):
+ m = [0]*5
+ nd = ndarray([1,2,3], shape=[3], flags=ND_VAREXPORT)
+ m[0] = memoryview(nd)
+
+ for i in range(1, 5):
+ nd.push([1,2,3], shape=[3])
+ m[i] = memoryview(nd)
+
+ for i in range(5):
+ m[perm[i]].release()
+
+ self.assertRaises(BufferError, nd.pop)
+ del nd
+
+ def test_ndarray_format_scalar(self):
+ # ndim = 0: scalar
+ for fmt, scalar, _ in iter_format(0):
+ itemsize = struct.calcsize(fmt)
+ nd = ndarray(scalar, shape=(), format=fmt)
+ self.verify(nd, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=0, shape=(), strides=(),
+ lst=scalar)
+
+ def test_ndarray_format_shape(self):
+ # ndim = 1, shape = [n]
+ nitems = randrange(1, 10)
+ for fmt, items, _ in iter_format(nitems):
+ itemsize = struct.calcsize(fmt)
+ for flags in (0, ND_PIL):
+ nd = ndarray(items, shape=[nitems], format=fmt, flags=flags)
+ self.verify(nd, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=1, shape=(nitems,), strides=(itemsize,),
+ lst=items)
+
+ def test_ndarray_format_strides(self):
+ # ndim = 1, strides
+ nitems = randrange(1, 30)
+ for fmt, items, _ in iter_format(nitems):
+ itemsize = struct.calcsize(fmt)
+ for step in range(-5, 5):
+ if step == 0:
+ continue
+
+ shape = [len(items[::step])]
+ strides = [step*itemsize]
+ offset = itemsize*(nitems-1) if step < 0 else 0
+
+ for flags in (0, ND_PIL):
+ nd = ndarray(items, shape=shape, strides=strides,
+ format=fmt, offset=offset, flags=flags)
+ self.verify(nd, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=1, shape=shape, strides=strides,
+ lst=items[::step])
+
+ def test_ndarray_fortran(self):
+ items = [1,2,3,4,5,6,7,8,9,10,11,12]
+ ex = ndarray(items, shape=(3, 4), strides=(1, 3))
+ nd = ndarray(ex, getbuf=PyBUF_F_CONTIGUOUS|PyBUF_FORMAT)
+ self.assertEqual(nd.tolist(), farray(items, (3, 4)))
+
+ def test_ndarray_multidim(self):
+ for ndim in range(5):
+ shape_t = [randrange(2, 10) for _ in range(ndim)]
+ nitems = prod(shape_t)
+ for shape in permutations(shape_t):
+
+ fmt, items, _ = randitems(nitems)
+ itemsize = struct.calcsize(fmt)
+
+ for flags in (0, ND_PIL):
+ if ndim == 0 and flags == ND_PIL:
+ continue
+
+ # C array
+ nd = ndarray(items, shape=shape, format=fmt, flags=flags)
+
+ strides = strides_from_shape(ndim, shape, itemsize, 'C')
+ lst = carray(items, shape)
+ self.verify(nd, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ if is_memoryview_format(fmt):
+ # memoryview: reconstruct strides
+ ex = ndarray(items, shape=shape, format=fmt)
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT)
+ self.assertTrue(nd.strides == ())
+ mv = nd.memoryview_from_buffer()
+ self.verify(mv, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # Fortran array
+ nd = ndarray(items, shape=shape, format=fmt,
+ flags=flags|ND_FORTRAN)
+
+ strides = strides_from_shape(ndim, shape, itemsize, 'F')
+ lst = farray(items, shape)
+ self.verify(nd, obj=None,
+ itemsize=itemsize, fmt=fmt, readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ def test_ndarray_index_invalid(self):
+ # not writable
+ nd = ndarray([1], shape=[1])
+ self.assertRaises(TypeError, nd.__setitem__, 1, 8)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertRaises(TypeError, mv.__setitem__, 1, 8)
+
+ # cannot be deleted
+ nd = ndarray([1], shape=[1], flags=ND_WRITABLE)
+ self.assertRaises(TypeError, nd.__delitem__, 1)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertRaises(TypeError, mv.__delitem__, 1)
+
+ # overflow
+ nd = ndarray([1], shape=[1], flags=ND_WRITABLE)
+ self.assertRaises(OverflowError, nd.__getitem__, 1<<64)
+ self.assertRaises(OverflowError, nd.__setitem__, 1<<64, 8)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertRaises(IndexError, mv.__getitem__, 1<<64)
+ self.assertRaises(IndexError, mv.__setitem__, 1<<64, 8)
+
+ # format
+ items = [1,2,3,4,5,6,7,8]
+ nd = ndarray(items, shape=[len(items)], format="B", flags=ND_WRITABLE)
+ self.assertRaises(struct.error, nd.__setitem__, 2, 300)
+ self.assertRaises(ValueError, nd.__setitem__, 1, (100, 200))
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertRaises(ValueError, mv.__setitem__, 2, 300)
+ self.assertRaises(TypeError, mv.__setitem__, 1, (100, 200))
+
+ items = [(1,2), (3,4), (5,6)]
+ nd = ndarray(items, shape=[len(items)], format="LQ", flags=ND_WRITABLE)
+ self.assertRaises(ValueError, nd.__setitem__, 2, 300)
+ self.assertRaises(struct.error, nd.__setitem__, 1, (b'\x001', 200))
+
+ def test_ndarray_index_scalar(self):
+ # scalar
+ nd = ndarray(1, shape=(), flags=ND_WRITABLE)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+
+ x = nd[()]; self.assertEqual(x, 1)
+ x = nd[...]; self.assertEqual(x.tolist(), nd.tolist())
+
+ x = mv[()]; self.assertEqual(x, 1)
+ x = mv[...]; self.assertEqual(x.tolist(), nd.tolist())
+
+ self.assertRaises(TypeError, nd.__getitem__, 0)
+ self.assertRaises(TypeError, mv.__getitem__, 0)
+ self.assertRaises(TypeError, nd.__setitem__, 0, 8)
+ self.assertRaises(TypeError, mv.__setitem__, 0, 8)
+
+ self.assertEqual(nd.tolist(), 1)
+ self.assertEqual(mv.tolist(), 1)
+
+ nd[()] = 9; self.assertEqual(nd.tolist(), 9)
+ mv[()] = 9; self.assertEqual(mv.tolist(), 9)
+
+ nd[...] = 5; self.assertEqual(nd.tolist(), 5)
+ mv[...] = 5; self.assertEqual(mv.tolist(), 5)
+
+ def test_ndarray_index_null_strides(self):
+ ex = ndarray(list(range(2*4)), shape=[2, 4], flags=ND_WRITABLE)
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG)
+
+ # Sub-views are only possible for full exporters.
+ self.assertRaises(BufferError, nd.__getitem__, 1)
+ # Same for slices.
+ self.assertRaises(BufferError, nd.__getitem__, slice(3,5,1))
+
+ def test_ndarray_index_getitem_single(self):
+ # getitem
+ for fmt, items, _ in iter_format(5):
+ nd = ndarray(items, shape=[5], format=fmt)
+ for i in range(-5, 5):
+ self.assertEqual(nd[i], items[i])
+
+ self.assertRaises(IndexError, nd.__getitem__, -6)
+ self.assertRaises(IndexError, nd.__getitem__, 5)
+
+ if is_memoryview_format(fmt):
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ for i in range(-5, 5):
+ self.assertEqual(mv[i], items[i])
+
+ self.assertRaises(IndexError, mv.__getitem__, -6)
+ self.assertRaises(IndexError, mv.__getitem__, 5)
+
+ # getitem with null strides
+ for fmt, items, _ in iter_format(5):
+ ex = ndarray(items, shape=[5], flags=ND_WRITABLE, format=fmt)
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG|PyBUF_FORMAT)
+
+ for i in range(-5, 5):
+ self.assertEqual(nd[i], items[i])
+
+ if is_memoryview_format(fmt):
+ mv = nd.memoryview_from_buffer()
+ self.assertIs(mv.__eq__(nd), NotImplemented)
+ for i in range(-5, 5):
+ self.assertEqual(mv[i], items[i])
+
+ # getitem with null format
+ items = [1,2,3,4,5]
+ ex = ndarray(items, shape=[5])
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO)
+ for i in range(-5, 5):
+ self.assertEqual(nd[i], items[i])
+
+ # getitem with null shape/strides/format
+ items = [1,2,3,4,5]
+ ex = ndarray(items, shape=[5])
+ nd = ndarray(ex, getbuf=PyBUF_SIMPLE)
+
+ for i in range(-5, 5):
+ self.assertEqual(nd[i], items[i])
+
+ def test_ndarray_index_setitem_single(self):
+ # assign single value
+ for fmt, items, single_item in iter_format(5):
+ nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE)
+ for i in range(5):
+ items[i] = single_item
+ nd[i] = single_item
+ self.assertEqual(nd.tolist(), items)
+
+ self.assertRaises(IndexError, nd.__setitem__, -6, single_item)
+ self.assertRaises(IndexError, nd.__setitem__, 5, single_item)
+
+ if not is_memoryview_format(fmt):
+ continue
+
+ nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ for i in range(5):
+ items[i] = single_item
+ mv[i] = single_item
+ self.assertEqual(mv.tolist(), items)
+
+ self.assertRaises(IndexError, mv.__setitem__, -6, single_item)
+ self.assertRaises(IndexError, mv.__setitem__, 5, single_item)
+
+
+ # assign single value: lobject = robject
+ for fmt, items, single_item in iter_format(5):
+ nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE)
+ for i in range(-5, 4):
+ items[i] = items[i+1]
+ nd[i] = nd[i+1]
+ self.assertEqual(nd.tolist(), items)
+
+ if not is_memoryview_format(fmt):
+ continue
+
+ nd = ndarray(items, shape=[5], format=fmt, flags=ND_WRITABLE)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ for i in range(-5, 4):
+ items[i] = items[i+1]
+ mv[i] = mv[i+1]
+ self.assertEqual(mv.tolist(), items)
+
+ def test_ndarray_index_getitem_multidim(self):
+ shape_t = (2, 3, 5)
+ nitems = prod(shape_t)
+ for shape in permutations(shape_t):
+
+ fmt, items, _ = randitems(nitems)
+
+ for flags in (0, ND_PIL):
+ # C array
+ nd = ndarray(items, shape=shape, format=fmt, flags=flags)
+ lst = carray(items, shape)
+
+ for i in range(-shape[0], shape[0]):
+ self.assertEqual(lst[i], nd[i].tolist())
+ for j in range(-shape[1], shape[1]):
+ self.assertEqual(lst[i][j], nd[i][j].tolist())
+ for k in range(-shape[2], shape[2]):
+ self.assertEqual(lst[i][j][k], nd[i][j][k])
+
+ # Fortran array
+ nd = ndarray(items, shape=shape, format=fmt,
+ flags=flags|ND_FORTRAN)
+ lst = farray(items, shape)
+
+ for i in range(-shape[0], shape[0]):
+ self.assertEqual(lst[i], nd[i].tolist())
+ for j in range(-shape[1], shape[1]):
+ self.assertEqual(lst[i][j], nd[i][j].tolist())
+ for k in range(shape[2], shape[2]):
+ self.assertEqual(lst[i][j][k], nd[i][j][k])
+
+ def test_ndarray_sequence(self):
+ nd = ndarray(1, shape=())
+ self.assertRaises(TypeError, eval, "1 in nd", locals())
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertRaises(TypeError, eval, "1 in mv", locals())
+
+ for fmt, items, _ in iter_format(5):
+ nd = ndarray(items, shape=[5], format=fmt)
+ for i, v in enumerate(nd):
+ self.assertEqual(v, items[i])
+ self.assertTrue(v in nd)
+
+ if is_memoryview_format(fmt):
+ mv = memoryview(nd)
+ for i, v in enumerate(mv):
+ self.assertEqual(v, items[i])
+ self.assertTrue(v in mv)
+
+ def test_ndarray_slice_invalid(self):
+ items = [1,2,3,4,5,6,7,8]
+
+ # rvalue is not an exporter
+ xl = ndarray(items, shape=[8], flags=ND_WRITABLE)
+ ml = memoryview(xl)
+ self.assertRaises(TypeError, xl.__setitem__, slice(0,8,1), items)
+ self.assertRaises(TypeError, ml.__setitem__, slice(0,8,1), items)
+
+ # rvalue is not a full exporter
+ xl = ndarray(items, shape=[8], flags=ND_WRITABLE)
+ ex = ndarray(items, shape=[8], flags=ND_WRITABLE)
+ xr = ndarray(ex, getbuf=PyBUF_ND)
+ self.assertRaises(BufferError, xl.__setitem__, slice(0,8,1), xr)
+
+ # zero step
+ nd = ndarray(items, shape=[8], format="L", flags=ND_WRITABLE)
+ mv = memoryview(nd)
+ self.assertRaises(ValueError, nd.__getitem__, slice(0,1,0))
+ self.assertRaises(ValueError, mv.__getitem__, slice(0,1,0))
+
+ nd = ndarray(items, shape=[2,4], format="L", flags=ND_WRITABLE)
+ mv = memoryview(nd)
+
+ self.assertRaises(ValueError, nd.__getitem__,
+ (slice(0,1,1), slice(0,1,0)))
+ self.assertRaises(ValueError, nd.__getitem__,
+ (slice(0,1,0), slice(0,1,1)))
+ self.assertRaises(TypeError, nd.__getitem__, "@%$")
+ self.assertRaises(TypeError, nd.__getitem__, ("@%$", slice(0,1,1)))
+ self.assertRaises(TypeError, nd.__getitem__, (slice(0,1,1), {}))
+
+ # memoryview: not implemented
+ self.assertRaises(NotImplementedError, mv.__getitem__,
+ (slice(0,1,1), slice(0,1,0)))
+ self.assertRaises(TypeError, mv.__getitem__, "@%$")
+
+ # differing format
+ xl = ndarray(items, shape=[8], format="B", flags=ND_WRITABLE)
+ xr = ndarray(items, shape=[8], format="b")
+ ml = memoryview(xl)
+ mr = memoryview(xr)
+ self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8])
+ self.assertEqual(xl.tolist(), items)
+ self.assertRaises(ValueError, ml.__setitem__, slice(0,1,1), mr[7:8])
+ self.assertEqual(ml.tolist(), items)
+
+ # differing itemsize
+ xl = ndarray(items, shape=[8], format="B", flags=ND_WRITABLE)
+ yr = ndarray(items, shape=[8], format="L")
+ ml = memoryview(xl)
+ mr = memoryview(xr)
+ self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8])
+ self.assertEqual(xl.tolist(), items)
+ self.assertRaises(ValueError, ml.__setitem__, slice(0,1,1), mr[7:8])
+ self.assertEqual(ml.tolist(), items)
+
+ # differing ndim
+ xl = ndarray(items, shape=[2, 4], format="b", flags=ND_WRITABLE)
+ xr = ndarray(items, shape=[8], format="b")
+ ml = memoryview(xl)
+ mr = memoryview(xr)
+ self.assertRaises(ValueError, xl.__setitem__, slice(0,1,1), xr[7:8])
+ self.assertEqual(xl.tolist(), [[1,2,3,4], [5,6,7,8]])
+ self.assertRaises(NotImplementedError, ml.__setitem__, slice(0,1,1),
+ mr[7:8])
+
+ # differing shape
+ xl = ndarray(items, shape=[8], format="b", flags=ND_WRITABLE)
+ xr = ndarray(items, shape=[8], format="b")
+ ml = memoryview(xl)
+ mr = memoryview(xr)
+ self.assertRaises(ValueError, xl.__setitem__, slice(0,2,1), xr[7:8])
+ self.assertEqual(xl.tolist(), items)
+ self.assertRaises(ValueError, ml.__setitem__, slice(0,2,1), mr[7:8])
+ self.assertEqual(ml.tolist(), items)
+
+ # _testbuffer.c module functions
+ self.assertRaises(TypeError, slice_indices, slice(0,1,2), {})
+ self.assertRaises(TypeError, slice_indices, "###########", 1)
+ self.assertRaises(ValueError, slice_indices, slice(0,1,0), 4)
+
+ x = ndarray(items, shape=[8], format="b", flags=ND_PIL)
+ self.assertRaises(TypeError, x.add_suboffsets)
+
+ ex = ndarray(items, shape=[8], format="B")
+ x = ndarray(ex, getbuf=PyBUF_SIMPLE)
+ self.assertRaises(TypeError, x.add_suboffsets)
+
+ def test_ndarray_slice_zero_shape(self):
+ items = [1,2,3,4,5,6,7,8,9,10,11,12]
+
+ x = ndarray(items, shape=[12], format="L", flags=ND_WRITABLE)
+ y = ndarray(items, shape=[12], format="L")
+ x[4:4] = y[9:9]
+ self.assertEqual(x.tolist(), items)
+
+ ml = memoryview(x)
+ mr = memoryview(y)
+ self.assertEqual(ml, x)
+ self.assertEqual(ml, y)
+ ml[4:4] = mr[9:9]
+ self.assertEqual(ml.tolist(), items)
+
+ x = ndarray(items, shape=[3, 4], format="L", flags=ND_WRITABLE)
+ y = ndarray(items, shape=[4, 3], format="L")
+ x[1:2, 2:2] = y[1:2, 3:3]
+ self.assertEqual(x.tolist(), carray(items, [3, 4]))
+
+ def test_ndarray_slice_multidim(self):
+ shape_t = (2, 3, 5)
+ ndim = len(shape_t)
+ nitems = prod(shape_t)
+ for shape in permutations(shape_t):
+
+ fmt, items, _ = randitems(nitems)
+ itemsize = struct.calcsize(fmt)
+
+ for flags in (0, ND_PIL):
+ nd = ndarray(items, shape=shape, format=fmt, flags=flags)
+ lst = carray(items, shape)
+
+ for slices in rslices_ndim(ndim, shape):
+
+ listerr = None
+ try:
+ sliced = multislice(lst, slices)
+ except Exception as e:
+ listerr = e.__class__
+
+ nderr = None
+ try:
+ ndsliced = nd[slices]
+ except Exception as e:
+ nderr = e.__class__
+
+ if nderr or listerr:
+ self.assertIs(nderr, listerr)
+ else:
+ self.assertEqual(ndsliced.tolist(), sliced)
+
+ def test_ndarray_slice_redundant_suboffsets(self):
+ shape_t = (2, 3, 5, 2)
+ ndim = len(shape_t)
+ nitems = prod(shape_t)
+ for shape in permutations(shape_t):
+
+ fmt, items, _ = randitems(nitems)
+ itemsize = struct.calcsize(fmt)
+
+ nd = ndarray(items, shape=shape, format=fmt)
+ nd.add_suboffsets()
+ ex = ndarray(items, shape=shape, format=fmt)
+ ex.add_suboffsets()
+ mv = memoryview(ex)
+ lst = carray(items, shape)
+
+ for slices in rslices_ndim(ndim, shape):
+
+ listerr = None
+ try:
+ sliced = multislice(lst, slices)
+ except Exception as e:
+ listerr = e.__class__
+
+ nderr = None
+ try:
+ ndsliced = nd[slices]
+ except Exception as e:
+ nderr = e.__class__
+
+ if nderr or listerr:
+ self.assertIs(nderr, listerr)
+ else:
+ self.assertEqual(ndsliced.tolist(), sliced)
+
+ def test_ndarray_slice_assign_single(self):
+ for fmt, items, _ in iter_format(5):
+ for lslice in genslices(5):
+ for rslice in genslices(5):
+ for flags in (0, ND_PIL):
+
+ f = flags|ND_WRITABLE
+ nd = ndarray(items, shape=[5], format=fmt, flags=f)
+ ex = ndarray(items, shape=[5], format=fmt, flags=f)
+ mv = memoryview(ex)
+
+ lsterr = None
+ diff_structure = None
+ lst = items[:]
+ try:
+ lval = lst[lslice]
+ rval = lst[rslice]
+ lst[lslice] = lst[rslice]
+ diff_structure = len(lval) != len(rval)
+ except Exception as e:
+ lsterr = e.__class__
+
+ nderr = None
+ try:
+ nd[lslice] = nd[rslice]
+ except Exception as e:
+ nderr = e.__class__
+
+ if diff_structure: # ndarray cannot change shape
+ self.assertIs(nderr, ValueError)
+ else:
+ self.assertEqual(nd.tolist(), lst)
+ self.assertIs(nderr, lsterr)
+
+ if not is_memoryview_format(fmt):
+ continue
+
+ mverr = None
+ try:
+ mv[lslice] = mv[rslice]
+ except Exception as e:
+ mverr = e.__class__
+
+ if diff_structure: # memoryview cannot change shape
+ self.assertIs(mverr, ValueError)
+ else:
+ self.assertEqual(mv.tolist(), lst)
+ self.assertEqual(mv, nd)
+ self.assertIs(mverr, lsterr)
+ self.verify(mv, obj=ex,
+ itemsize=nd.itemsize, fmt=fmt, readonly=0,
+ ndim=nd.ndim, shape=nd.shape, strides=nd.strides,
+ lst=nd.tolist())
+
+ def test_ndarray_slice_assign_multidim(self):
+ shape_t = (2, 3, 5)
+ ndim = len(shape_t)
+ nitems = prod(shape_t)
+ for shape in permutations(shape_t):
+
+ fmt, items, _ = randitems(nitems)
+
+ for flags in (0, ND_PIL):
+ for _ in range(ITERATIONS):
+ lslices, rslices = randslice_from_shape(ndim, shape)
+
+ nd = ndarray(items, shape=shape, format=fmt,
+ flags=flags|ND_WRITABLE)
+ lst = carray(items, shape)
+
+ listerr = None
+ try:
+ result = multislice_assign(lst, lst, lslices, rslices)
+ except Exception as e:
+ listerr = e.__class__
+
+ nderr = None
+ try:
+ nd[lslices] = nd[rslices]
+ except Exception as e:
+ nderr = e.__class__
+
+ if nderr or listerr:
+ self.assertIs(nderr, listerr)
+ else:
+ self.assertEqual(nd.tolist(), result)
+
+ def test_ndarray_random(self):
+ # construction of valid arrays
+ for _ in range(ITERATIONS):
+ for fmt in fmtdict['@']:
+ itemsize = struct.calcsize(fmt)
+
+ t = rand_structure(itemsize, True, maxdim=MAXDIM,
+ maxshape=MAXSHAPE)
+ self.assertTrue(verify_structure(*t))
+ items = randitems_from_structure(fmt, t)
+
+ x = ndarray_from_structure(items, fmt, t)
+ xlist = x.tolist()
+
+ mv = memoryview(x)
+ if is_memoryview_format(fmt):
+ mvlist = mv.tolist()
+ self.assertEqual(mvlist, xlist)
+
+ if t[2] > 0:
+ # ndim > 0: test against suboffsets representation.
+ y = ndarray_from_structure(items, fmt, t, flags=ND_PIL)
+ ylist = y.tolist()
+ self.assertEqual(xlist, ylist)
+
+ mv = memoryview(y)
+ if is_memoryview_format(fmt):
+ self.assertEqual(mv, y)
+ mvlist = mv.tolist()
+ self.assertEqual(mvlist, ylist)
+
+ if numpy_array:
+ shape = t[3]
+ if 0 in shape:
+ continue # http://projects.scipy.org/numpy/ticket/1910
+ z = numpy_array_from_structure(items, fmt, t)
+ self.verify(x, obj=None,
+ itemsize=z.itemsize, fmt=fmt, readonly=0,
+ ndim=z.ndim, shape=z.shape, strides=z.strides,
+ lst=z.tolist())
+
+ def test_ndarray_random_invalid(self):
+ # exceptions during construction of invalid arrays
+ for _ in range(ITERATIONS):
+ for fmt in fmtdict['@']:
+ itemsize = struct.calcsize(fmt)
+
+ t = rand_structure(itemsize, False, maxdim=MAXDIM,
+ maxshape=MAXSHAPE)
+ self.assertFalse(verify_structure(*t))
+ items = randitems_from_structure(fmt, t)
+
+ nderr = False
+ try:
+ x = ndarray_from_structure(items, fmt, t)
+ except Exception as e:
+ nderr = e.__class__
+ self.assertTrue(nderr)
+
+ if numpy_array:
+ numpy_err = False
+ try:
+ y = numpy_array_from_structure(items, fmt, t)
+ except Exception as e:
+ numpy_err = e.__class__
+
+ if 0: # http://projects.scipy.org/numpy/ticket/1910
+ self.assertTrue(numpy_err)
+
+ def test_ndarray_random_slice_assign(self):
+ # valid slice assignments
+ for _ in range(ITERATIONS):
+ for fmt in fmtdict['@']:
+ itemsize = struct.calcsize(fmt)
+
+ lshape, rshape, lslices, rslices = \
+ rand_aligned_slices(maxdim=MAXDIM, maxshape=MAXSHAPE)
+ tl = rand_structure(itemsize, True, shape=lshape)
+ tr = rand_structure(itemsize, True, shape=rshape)
+ self.assertTrue(verify_structure(*tl))
+ self.assertTrue(verify_structure(*tr))
+ litems = randitems_from_structure(fmt, tl)
+ ritems = randitems_from_structure(fmt, tr)
+
+ xl = ndarray_from_structure(litems, fmt, tl)
+ xr = ndarray_from_structure(ritems, fmt, tr)
+ xl[lslices] = xr[rslices]
+ xllist = xl.tolist()
+ xrlist = xr.tolist()
+
+ ml = memoryview(xl)
+ mr = memoryview(xr)
+ self.assertEqual(ml.tolist(), xllist)
+ self.assertEqual(mr.tolist(), xrlist)
+
+ if tl[2] > 0 and tr[2] > 0:
+ # ndim > 0: test against suboffsets representation.
+ yl = ndarray_from_structure(litems, fmt, tl, flags=ND_PIL)
+ yr = ndarray_from_structure(ritems, fmt, tr, flags=ND_PIL)
+ yl[lslices] = yr[rslices]
+ yllist = yl.tolist()
+ yrlist = yr.tolist()
+ self.assertEqual(xllist, yllist)
+ self.assertEqual(xrlist, yrlist)
+
+ ml = memoryview(yl)
+ mr = memoryview(yr)
+ self.assertEqual(ml.tolist(), yllist)
+ self.assertEqual(mr.tolist(), yrlist)
+
+ if numpy_array:
+ if 0 in lshape or 0 in rshape:
+ continue # http://projects.scipy.org/numpy/ticket/1910
+
+ zl = numpy_array_from_structure(litems, fmt, tl)
+ zr = numpy_array_from_structure(ritems, fmt, tr)
+ zl[lslices] = zr[rslices]
+
+ if not is_overlapping(tl) and not is_overlapping(tr):
+ # Slice assignment of overlapping structures
+ # is undefined in NumPy.
+ self.verify(xl, obj=None,
+ itemsize=zl.itemsize, fmt=fmt, readonly=0,
+ ndim=zl.ndim, shape=zl.shape,
+ strides=zl.strides, lst=zl.tolist())
+
+ self.verify(xr, obj=None,
+ itemsize=zr.itemsize, fmt=fmt, readonly=0,
+ ndim=zr.ndim, shape=zr.shape,
+ strides=zr.strides, lst=zr.tolist())
+
+ def test_ndarray_re_export(self):
+ items = [1,2,3,4,5,6,7,8,9,10,11,12]
+
+ nd = ndarray(items, shape=[3,4], flags=ND_PIL)
+ ex = ndarray(nd)
+
+ self.assertTrue(ex.flags & ND_PIL)
+ self.assertIs(ex.obj, nd)
+ self.assertEqual(ex.suboffsets, (0, -1))
+ self.assertFalse(ex.c_contiguous)
+ self.assertFalse(ex.f_contiguous)
+ self.assertFalse(ex.contiguous)
+
+ def test_ndarray_zero_shape(self):
+ # zeros in shape
+ for flags in (0, ND_PIL):
+ nd = ndarray([1,2,3], shape=[0], flags=flags)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertEqual(nd.tolist(), [])
+ self.assertEqual(mv.tolist(), [])
+
+ nd = ndarray([1,2,3], shape=[0,3,3], flags=flags)
+ self.assertEqual(nd.tolist(), [])
+
+ nd = ndarray([1,2,3], shape=[3,0,3], flags=flags)
+ self.assertEqual(nd.tolist(), [[], [], []])
+
+ nd = ndarray([1,2,3], shape=[3,3,0], flags=flags)
+ self.assertEqual(nd.tolist(),
+ [[[], [], []], [[], [], []], [[], [], []]])
+
+ def test_ndarray_zero_strides(self):
+ # zero strides
+ for flags in (0, ND_PIL):
+ nd = ndarray([1], shape=[5], strides=[0], flags=flags)
+ mv = memoryview(nd)
+ self.assertEqual(mv, nd)
+ self.assertEqual(nd.tolist(), [1, 1, 1, 1, 1])
+ self.assertEqual(mv.tolist(), [1, 1, 1, 1, 1])
+
+ def test_ndarray_offset(self):
+ nd = ndarray(list(range(20)), shape=[3], offset=7)
+ self.assertEqual(nd.offset, 7)
+ self.assertEqual(nd.tolist(), [7,8,9])
+
+ def test_ndarray_memoryview_from_buffer(self):
+ for flags in (0, ND_PIL):
+ nd = ndarray(list(range(3)), shape=[3], flags=flags)
+ m = nd.memoryview_from_buffer()
+ self.assertEqual(m, nd)
+
+ def test_ndarray_get_pointer(self):
+ for flags in (0, ND_PIL):
+ nd = ndarray(list(range(3)), shape=[3], flags=flags)
+ for i in range(3):
+ self.assertEqual(nd[i], get_pointer(nd, [i]))
+
+ def test_ndarray_tolist_null_strides(self):
+ ex = ndarray(list(range(20)), shape=[2,2,5])
+
+ nd = ndarray(ex, getbuf=PyBUF_ND|PyBUF_FORMAT)
+ self.assertEqual(nd.tolist(), ex.tolist())
+
+ m = memoryview(ex)
+ self.assertEqual(m.tolist(), ex.tolist())
+
+ def test_ndarray_cmp_contig(self):
+
+ self.assertFalse(cmp_contig(b"123", b"456"))
+
+ x = ndarray(list(range(12)), shape=[3,4])
+ y = ndarray(list(range(12)), shape=[4,3])
+ self.assertFalse(cmp_contig(x, y))
+
+ x = ndarray([1], shape=[1], format="B")
+ self.assertTrue(cmp_contig(x, b'\x01'))
+ self.assertTrue(cmp_contig(b'\x01', x))
+
+ def test_ndarray_hash(self):
+
+ a = array.array('L', [1,2,3])
+ nd = ndarray(a)
+ self.assertRaises(ValueError, hash, nd)
+
+ # one-dimensional
+ b = bytes(list(range(12)))
+
+ nd = ndarray(list(range(12)), shape=[12])
+ self.assertEqual(hash(nd), hash(b))
+
+ # C-contiguous
+ nd = ndarray(list(range(12)), shape=[3,4])
+ self.assertEqual(hash(nd), hash(b))
+
+ nd = ndarray(list(range(12)), shape=[3,2,2])
+ self.assertEqual(hash(nd), hash(b))
+
+ # Fortran contiguous
+ b = bytes(transpose(list(range(12)), shape=[4,3]))
+ nd = ndarray(list(range(12)), shape=[3,4], flags=ND_FORTRAN)
+ self.assertEqual(hash(nd), hash(b))
+
+ b = bytes(transpose(list(range(12)), shape=[2,3,2]))
+ nd = ndarray(list(range(12)), shape=[2,3,2], flags=ND_FORTRAN)
+ self.assertEqual(hash(nd), hash(b))
+
+ # suboffsets
+ b = bytes(list(range(12)))
+ nd = ndarray(list(range(12)), shape=[2,2,3], flags=ND_PIL)
+ self.assertEqual(hash(nd), hash(b))
+
+ # non-byte formats
+ nd = ndarray(list(range(12)), shape=[2,2,3], format='L')
+ self.assertEqual(hash(nd), hash(nd.tobytes()))
+
+ def test_py_buffer_to_contiguous(self):
+
+ # The requests are used in _testbuffer.c:py_buffer_to_contiguous
+ # to generate buffers without full information for testing.
+ requests = (
+ # distinct flags
+ PyBUF_INDIRECT, PyBUF_STRIDES, PyBUF_ND, PyBUF_SIMPLE,
+ # compound requests
+ PyBUF_FULL, PyBUF_FULL_RO,
+ PyBUF_RECORDS, PyBUF_RECORDS_RO,
+ PyBUF_STRIDED, PyBUF_STRIDED_RO,
+ PyBUF_CONTIG, PyBUF_CONTIG_RO,
+ )
+
+ # no buffer interface
+ self.assertRaises(TypeError, py_buffer_to_contiguous, {}, 'F',
+ PyBUF_FULL_RO)
+
+ # scalar, read-only request
+ nd = ndarray(9, shape=(), format="L", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, nd.tobytes())
+
+ # zeros in shape
+ nd = ndarray([1], shape=[0], format="L", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, b'')
+
+ nd = ndarray(list(range(8)), shape=[2, 0, 7], format="L",
+ flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, b'')
+
+ ### One-dimensional arrays are trivial, since Fortran and C order
+ ### are the same.
+
+ # one-dimensional
+ for f in [0, ND_FORTRAN]:
+ nd = ndarray([1], shape=[1], format="h", flags=f|ND_WRITABLE)
+ ndbytes = nd.tobytes()
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, ndbytes)
+
+ nd = ndarray([1, 2, 3], shape=[3], format="b", flags=f|ND_WRITABLE)
+ ndbytes = nd.tobytes()
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, ndbytes)
+
+ # one-dimensional, non-contiguous input
+ nd = ndarray([1, 2, 3], shape=[2], strides=[2], flags=ND_WRITABLE)
+ ndbytes = nd.tobytes()
+ for order in ['C', 'F', 'A']:
+ for request in [PyBUF_STRIDES, PyBUF_FULL]:
+ b = py_buffer_to_contiguous(nd, order, request)
+ self.assertEqual(b, ndbytes)
+
+ nd = nd[::-1]
+ ndbytes = nd.tobytes()
+ for order in ['C', 'F', 'A']:
+ for request in requests:
+ try:
+ b = py_buffer_to_contiguous(nd, order, request)
+ except BufferError:
+ continue
+ self.assertEqual(b, ndbytes)
+
+ ###
+ ### Multi-dimensional arrays:
+ ###
+ ### The goal here is to preserve the logical representation of the
+ ### input array but change the physical representation if necessary.
+ ###
+ ### _testbuffer example:
+ ### ====================
+ ###
+ ### C input array:
+ ### --------------
+ ### >>> nd = ndarray(list(range(12)), shape=[3, 4])
+ ### >>> nd.tolist()
+ ### [[0, 1, 2, 3],
+ ### [4, 5, 6, 7],
+ ### [8, 9, 10, 11]]
+ ###
+ ### Fortran output:
+ ### ---------------
+ ### >>> py_buffer_to_contiguous(nd, 'F', PyBUF_FULL_RO)
+ ### >>> b'\x00\x04\x08\x01\x05\t\x02\x06\n\x03\x07\x0b'
+ ###
+ ### The return value corresponds to this input list for
+ ### _testbuffer's ndarray:
+ ### >>> nd = ndarray([0,4,8,1,5,9,2,6,10,3,7,11], shape=[3,4],
+ ### flags=ND_FORTRAN)
+ ### >>> nd.tolist()
+ ### [[0, 1, 2, 3],
+ ### [4, 5, 6, 7],
+ ### [8, 9, 10, 11]]
+ ###
+ ### The logical array is the same, but the values in memory are now
+ ### in Fortran order.
+ ###
+ ### NumPy example:
+ ### ==============
+ ### _testbuffer's ndarray takes lists to initialize the memory.
+ ### Here's the same sequence in NumPy:
+ ###
+ ### C input:
+ ### --------
+ ### >>> nd = ndarray(buffer=bytearray(list(range(12))),
+ ### shape=[3, 4], dtype='B')
+ ### >>> nd
+ ### array([[ 0, 1, 2, 3],
+ ### [ 4, 5, 6, 7],
+ ### [ 8, 9, 10, 11]], dtype=uint8)
+ ###
+ ### Fortran output:
+ ### ---------------
+ ### >>> fortran_buf = nd.tostring(order='F')
+ ### >>> fortran_buf
+ ### b'\x00\x04\x08\x01\x05\t\x02\x06\n\x03\x07\x0b'
+ ###
+ ### >>> nd = ndarray(buffer=fortran_buf, shape=[3, 4],
+ ### dtype='B', order='F')
+ ###
+ ### >>> nd
+ ### array([[ 0, 1, 2, 3],
+ ### [ 4, 5, 6, 7],
+ ### [ 8, 9, 10, 11]], dtype=uint8)
+ ###
+
+ # multi-dimensional, contiguous input
+ lst = list(range(12))
+ for f in [0, ND_FORTRAN]:
+ nd = ndarray(lst, shape=[3, 4], flags=f|ND_WRITABLE)
+ if numpy_array:
+ na = numpy_array(buffer=bytearray(lst),
+ shape=[3, 4], dtype='B',
+ order='C' if f == 0 else 'F')
+
+ # 'C' request
+ if f == ND_FORTRAN: # 'F' to 'C'
+ x = ndarray(transpose(lst, [4, 3]), shape=[3, 4],
+ flags=ND_WRITABLE)
+ expected = x.tobytes()
+ else:
+ expected = nd.tobytes()
+ for request in requests:
+ try:
+ b = py_buffer_to_contiguous(nd, 'C', request)
+ except BufferError:
+ continue
+
+ self.assertEqual(b, expected)
+
+ # Check that output can be used as the basis for constructing
+ # a C array that is logically identical to the input array.
+ y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ if numpy_array:
+ self.assertEqual(b, na.tostring(order='C'))
+
+ # 'F' request
+ if f == 0: # 'C' to 'F'
+ x = ndarray(transpose(lst, [3, 4]), shape=[4, 3],
+ flags=ND_WRITABLE)
+ else:
+ x = ndarray(lst, shape=[3, 4], flags=ND_WRITABLE)
+ expected = x.tobytes()
+ for request in [PyBUF_FULL, PyBUF_FULL_RO, PyBUF_INDIRECT,
+ PyBUF_STRIDES, PyBUF_ND]:
+ try:
+ b = py_buffer_to_contiguous(nd, 'F', request)
+ except BufferError:
+ continue
+ self.assertEqual(b, expected)
+
+ # Check that output can be used as the basis for constructing
+ # a Fortran array that is logically identical to the input array.
+ y = ndarray([v for v in b], shape=[3, 4], flags=ND_FORTRAN|ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ if numpy_array:
+ self.assertEqual(b, na.tostring(order='F'))
+
+ # 'A' request
+ if f == ND_FORTRAN:
+ x = ndarray(lst, shape=[3, 4], flags=ND_WRITABLE)
+ expected = x.tobytes()
+ else:
+ expected = nd.tobytes()
+ for request in [PyBUF_FULL, PyBUF_FULL_RO, PyBUF_INDIRECT,
+ PyBUF_STRIDES, PyBUF_ND]:
+ try:
+ b = py_buffer_to_contiguous(nd, 'A', request)
+ except BufferError:
+ continue
+
+ self.assertEqual(b, expected)
+
+ # Check that output can be used as the basis for constructing
+ # an array with order=f that is logically identical to the input
+ # array.
+ y = ndarray([v for v in b], shape=[3, 4], flags=f|ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ if numpy_array:
+ self.assertEqual(b, na.tostring(order='A'))
+
+ # multi-dimensional, non-contiguous input
+ nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE|ND_PIL)
+
+ # 'C'
+ b = py_buffer_to_contiguous(nd, 'C', PyBUF_FULL_RO)
+ self.assertEqual(b, nd.tobytes())
+ y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ # 'F'
+ b = py_buffer_to_contiguous(nd, 'F', PyBUF_FULL_RO)
+ x = ndarray(transpose(lst, [3, 4]), shape=[4, 3], flags=ND_WRITABLE)
+ self.assertEqual(b, x.tobytes())
+ y = ndarray([v for v in b], shape=[3, 4], flags=ND_FORTRAN|ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ # 'A'
+ b = py_buffer_to_contiguous(nd, 'A', PyBUF_FULL_RO)
+ self.assertEqual(b, nd.tobytes())
+ y = ndarray([v for v in b], shape=[3, 4], flags=ND_WRITABLE)
+ self.assertEqual(memoryview(y), memoryview(nd))
+
+ def test_memoryview_construction(self):
+
+ items_shape = [(9, []), ([1,2,3], [3]), (list(range(2*3*5)), [2,3,5])]
+
+ # NumPy style, C-contiguous:
+ for items, shape in items_shape:
+
+ # From PEP-3118 compliant exporter:
+ ex = ndarray(items, shape=shape)
+ m = memoryview(ex)
+ self.assertTrue(m.c_contiguous)
+ self.assertTrue(m.contiguous)
+
+ ndim = len(shape)
+ strides = strides_from_shape(ndim, shape, 1, 'C')
+ lst = carray(items, shape)
+
+ self.verify(m, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # From memoryview:
+ m2 = memoryview(m)
+ self.verify(m2, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # PyMemoryView_FromBuffer(): no strides
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT)
+ self.assertEqual(nd.strides, ())
+ m = nd.memoryview_from_buffer()
+ self.verify(m, obj=None,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # PyMemoryView_FromBuffer(): no format, shape, strides
+ nd = ndarray(ex, getbuf=PyBUF_SIMPLE)
+ self.assertEqual(nd.format, '')
+ self.assertEqual(nd.shape, ())
+ self.assertEqual(nd.strides, ())
+ m = nd.memoryview_from_buffer()
+
+ lst = [items] if ndim == 0 else items
+ self.verify(m, obj=None,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=1, shape=[ex.nbytes], strides=(1,),
+ lst=lst)
+
+ # NumPy style, Fortran contiguous:
+ for items, shape in items_shape:
+
+ # From PEP-3118 compliant exporter:
+ ex = ndarray(items, shape=shape, flags=ND_FORTRAN)
+ m = memoryview(ex)
+ self.assertTrue(m.f_contiguous)
+ self.assertTrue(m.contiguous)
+
+ ndim = len(shape)
+ strides = strides_from_shape(ndim, shape, 1, 'F')
+ lst = farray(items, shape)
+
+ self.verify(m, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # From memoryview:
+ m2 = memoryview(m)
+ self.verify(m2, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst)
+
+ # PIL style:
+ for items, shape in items_shape[1:]:
+
+ # From PEP-3118 compliant exporter:
+ ex = ndarray(items, shape=shape, flags=ND_PIL)
+ m = memoryview(ex)
+
+ ndim = len(shape)
+ lst = carray(items, shape)
+
+ self.verify(m, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=ex.strides,
+ lst=lst)
+
+ # From memoryview:
+ m2 = memoryview(m)
+ self.verify(m2, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=ndim, shape=shape, strides=ex.strides,
+ lst=lst)
+
+ # Invalid number of arguments:
+ self.assertRaises(TypeError, memoryview, b'9', 'x')
+ # Not a buffer provider:
+ self.assertRaises(TypeError, memoryview, {})
+ # Non-compliant buffer provider:
+ ex = ndarray([1,2,3], shape=[3])
+ nd = ndarray(ex, getbuf=PyBUF_SIMPLE)
+ self.assertRaises(BufferError, memoryview, nd)
+ nd = ndarray(ex, getbuf=PyBUF_CONTIG_RO|PyBUF_FORMAT)
+ self.assertRaises(BufferError, memoryview, nd)
+
+ # ndim > 64
+ nd = ndarray([1]*128, shape=[1]*128, format='L')
+ self.assertRaises(ValueError, memoryview, nd)
+ self.assertRaises(ValueError, nd.memoryview_from_buffer)
+ self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'C')
+ self.assertRaises(ValueError, get_contiguous, nd, PyBUF_READ, 'F')
+ self.assertRaises(ValueError, get_contiguous, nd[::-1], PyBUF_READ, 'C')
+
+ def test_memoryview_cast_zero_shape(self):
+ # Casts are undefined if shape contains zeros. These arrays are
+ # regarded as C-contiguous by Numpy and PyBuffer_GetContiguous(),
+ # so they are not caught by the test for C-contiguity in memory_cast().
+ items = [1,2,3]
+ for shape in ([0,3,3], [3,0,3], [0,3,3]):
+ ex = ndarray(items, shape=shape)
+ self.assertTrue(ex.c_contiguous)
+ msrc = memoryview(ex)
+ self.assertRaises(TypeError, msrc.cast, 'c')
+
+ def test_memoryview_struct_module(self):
+
+ class INT(object):
+ def __init__(self, val):
+ self.val = val
+ def __int__(self):
+ return self.val
+
+ class IDX(object):
+ def __init__(self, val):
+ self.val = val
+ def __index__(self):
+ return self.val
+
+ def f(): return 7
+
+ values = [INT(9), IDX(9),
+ 2.2+3j, Decimal("-21.1"), 12.2, Fraction(5, 2),
+ [1,2,3], {4,5,6}, {7:8}, (), (9,),
+ True, False, None, NotImplemented,
+ b'a', b'abc', bytearray(b'a'), bytearray(b'abc'),
+ 'a', 'abc', r'a', r'abc',
+ f, lambda x: x]
+
+ for fmt, items, item in iter_format(10, 'memoryview'):
+ ex = ndarray(items, shape=[10], format=fmt, flags=ND_WRITABLE)
+ nd = ndarray(items, shape=[10], format=fmt, flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ struct.pack_into(fmt, nd, 0, item)
+ m[0] = item
+ self.assertEqual(m[0], nd[0])
+
+ itemsize = struct.calcsize(fmt)
+ if 'P' in fmt:
+ continue
+
+ for v in values:
+ struct_err = None
+ try:
+ struct.pack_into(fmt, nd, itemsize, v)
+ except struct.error:
+ struct_err = struct.error
+
+ mv_err = None
+ try:
+ m[1] = v
+ except (TypeError, ValueError) as e:
+ mv_err = e.__class__
+
+ if struct_err or mv_err:
+ self.assertIsNot(struct_err, None)
+ self.assertIsNot(mv_err, None)
+ else:
+ self.assertEqual(m[1], nd[1])
+
+ def test_memoryview_cast_zero_strides(self):
+ # Casts are undefined if strides contains zeros. These arrays are
+ # (sometimes!) regarded as C-contiguous by Numpy, but not by
+ # PyBuffer_GetContiguous().
+ ex = ndarray([1,2,3], shape=[3], strides=[0])
+ self.assertFalse(ex.c_contiguous)
+ msrc = memoryview(ex)
+ self.assertRaises(TypeError, msrc.cast, 'c')
+
+ def test_memoryview_cast_invalid(self):
+ # invalid format
+ for sfmt in NON_BYTE_FORMAT:
+ sformat = '@' + sfmt if randrange(2) else sfmt
+ ssize = struct.calcsize(sformat)
+ for dfmt in NON_BYTE_FORMAT:
+ dformat = '@' + dfmt if randrange(2) else dfmt
+ dsize = struct.calcsize(dformat)
+ ex = ndarray(list(range(32)), shape=[32//ssize], format=sformat)
+ msrc = memoryview(ex)
+ self.assertRaises(TypeError, msrc.cast, dfmt, [32//dsize])
+
+ for sfmt, sitems, _ in iter_format(1):
+ ex = ndarray(sitems, shape=[1], format=sfmt)
+ msrc = memoryview(ex)
+ for dfmt, _, _ in iter_format(1):
+ if (not is_memoryview_format(sfmt) or
+ not is_memoryview_format(dfmt)):
+ self.assertRaises(ValueError, msrc.cast, dfmt,
+ [32//dsize])
+ else:
+ if not is_byte_format(sfmt) and not is_byte_format(dfmt):
+ self.assertRaises(TypeError, msrc.cast, dfmt,
+ [32//dsize])
+
+ # invalid shape
+ size_h = struct.calcsize('h')
+ size_d = struct.calcsize('d')
+ ex = ndarray(list(range(2*2*size_d)), shape=[2,2,size_d], format='h')
+ msrc = memoryview(ex)
+ self.assertRaises(TypeError, msrc.cast, shape=[2,2,size_h], format='d')
+
+ ex = ndarray(list(range(120)), shape=[1,2,3,4,5])
+ m = memoryview(ex)
+
+ # incorrect number of args
+ self.assertRaises(TypeError, m.cast)
+ self.assertRaises(TypeError, m.cast, 1, 2, 3)
+
+ # incorrect dest format type
+ self.assertRaises(TypeError, m.cast, {})
+
+ # incorrect dest format
+ self.assertRaises(ValueError, m.cast, "X")
+ self.assertRaises(ValueError, m.cast, "@X")
+ self.assertRaises(ValueError, m.cast, "@XY")
+
+ # dest format not implemented
+ self.assertRaises(ValueError, m.cast, "=B")
+ self.assertRaises(ValueError, m.cast, "!L")
+ self.assertRaises(ValueError, m.cast, "<P")
+ self.assertRaises(ValueError, m.cast, ">l")
+ self.assertRaises(ValueError, m.cast, "BI")
+ self.assertRaises(ValueError, m.cast, "xBI")
+
+ # src format not implemented
+ ex = ndarray([(1,2), (3,4)], shape=[2], format="II")
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.__getitem__, 0)
+ self.assertRaises(NotImplementedError, m.__setitem__, 0, 8)
+ self.assertRaises(NotImplementedError, m.tolist)
+
+ # incorrect shape type
+ ex = ndarray(list(range(120)), shape=[1,2,3,4,5])
+ m = memoryview(ex)
+ self.assertRaises(TypeError, m.cast, "B", shape={})
+
+ # incorrect shape elements
+ ex = ndarray(list(range(120)), shape=[2*3*4*5])
+ m = memoryview(ex)
+ self.assertRaises(OverflowError, m.cast, "B", shape=[2**64])
+ self.assertRaises(ValueError, m.cast, "B", shape=[-1])
+ self.assertRaises(ValueError, m.cast, "B", shape=[2,3,4,5,6,7,-1])
+ self.assertRaises(ValueError, m.cast, "B", shape=[2,3,4,5,6,7,0])
+ self.assertRaises(TypeError, m.cast, "B", shape=[2,3,4,5,6,7,'x'])
+
+ # N-D -> N-D cast
+ ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3,5,7,11])
+ m = memoryview(ex)
+ self.assertRaises(TypeError, m.cast, "I", shape=[2,3,4,5])
+
+ # cast with ndim > 64
+ nd = ndarray(list(range(128)), shape=[128], format='I')
+ m = memoryview(nd)
+ self.assertRaises(ValueError, m.cast, 'I', [1]*128)
+
+ # view->len not a multiple of itemsize
+ ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3*5*7*11])
+ m = memoryview(ex)
+ self.assertRaises(TypeError, m.cast, "I", shape=[2,3,4,5])
+
+ # product(shape) * itemsize != buffer size
+ ex = ndarray(list([9 for _ in range(3*5*7*11)]), shape=[3*5*7*11])
+ m = memoryview(ex)
+ self.assertRaises(TypeError, m.cast, "B", shape=[2,3,4,5])
+
+ # product(shape) * itemsize overflow
+ nd = ndarray(list(range(128)), shape=[128], format='I')
+ m1 = memoryview(nd)
+ nd = ndarray(list(range(128)), shape=[128], format='B')
+ m2 = memoryview(nd)
+ if sys.maxsize == 2**63-1:
+ self.assertRaises(TypeError, m1.cast, 'B',
+ [7, 7, 73, 127, 337, 92737, 649657])
+ self.assertRaises(ValueError, m1.cast, 'B',
+ [2**20, 2**20, 2**10, 2**10, 2**3])
+ self.assertRaises(ValueError, m2.cast, 'I',
+ [2**20, 2**20, 2**10, 2**10, 2**1])
+ else:
+ self.assertRaises(TypeError, m1.cast, 'B',
+ [1, 2147483647])
+ self.assertRaises(ValueError, m1.cast, 'B',
+ [2**10, 2**10, 2**5, 2**5, 2**1])
+ self.assertRaises(ValueError, m2.cast, 'I',
+ [2**10, 2**10, 2**5, 2**3, 2**1])
+
+ def test_memoryview_cast(self):
+ bytespec = (
+ ('B', lambda ex: list(ex.tobytes())),
+ ('b', lambda ex: [x-256 if x > 127 else x for x in list(ex.tobytes())]),
+ ('c', lambda ex: [bytes(chr(x), 'latin-1') for x in list(ex.tobytes())]),
+ )
+
+ def iter_roundtrip(ex, m, items, fmt):
+ srcsize = struct.calcsize(fmt)
+ for bytefmt, to_bytelist in bytespec:
+
+ m2 = m.cast(bytefmt)
+ lst = to_bytelist(ex)
+ self.verify(m2, obj=ex,
+ itemsize=1, fmt=bytefmt, readonly=0,
+ ndim=1, shape=[31*srcsize], strides=(1,),
+ lst=lst, cast=True)
+
+ m3 = m2.cast(fmt)
+ self.assertEqual(m3, ex)
+ lst = ex.tolist()
+ self.verify(m3, obj=ex,
+ itemsize=srcsize, fmt=fmt, readonly=0,
+ ndim=1, shape=[31], strides=(srcsize,),
+ lst=lst, cast=True)
+
+ # cast from ndim = 0 to ndim = 1
+ srcsize = struct.calcsize('I')
+ ex = ndarray(9, shape=[], format='I')
+ destitems, destshape = cast_items(ex, 'B', 1)
+ m = memoryview(ex)
+ m2 = m.cast('B')
+ self.verify(m2, obj=ex,
+ itemsize=1, fmt='B', readonly=1,
+ ndim=1, shape=destshape, strides=(1,),
+ lst=destitems, cast=True)
+
+ # cast from ndim = 1 to ndim = 0
+ destsize = struct.calcsize('I')
+ ex = ndarray([9]*destsize, shape=[destsize], format='B')
+ destitems, destshape = cast_items(ex, 'I', destsize, shape=[])
+ m = memoryview(ex)
+ m2 = m.cast('I', shape=[])
+ self.verify(m2, obj=ex,
+ itemsize=destsize, fmt='I', readonly=1,
+ ndim=0, shape=(), strides=(),
+ lst=destitems, cast=True)
+
+ # array.array: roundtrip to/from bytes
+ for fmt, items, _ in iter_format(31, 'array'):
+ ex = array.array(fmt, items)
+ m = memoryview(ex)
+ iter_roundtrip(ex, m, items, fmt)
+
+ # ndarray: roundtrip to/from bytes
+ for fmt, items, _ in iter_format(31, 'memoryview'):
+ ex = ndarray(items, shape=[31], format=fmt, flags=ND_WRITABLE)
+ m = memoryview(ex)
+ iter_roundtrip(ex, m, items, fmt)
+
+ def test_memoryview_cast_1D_ND(self):
+ # Cast between C-contiguous buffers. At least one buffer must
+ # be 1D, at least one format must be 'c', 'b' or 'B'.
+ for _tshape in gencastshapes():
+ for char in fmtdict['@']:
+ tfmt = ('', '@')[randrange(2)] + char
+ tsize = struct.calcsize(tfmt)
+ n = prod(_tshape) * tsize
+ obj = 'memoryview' if is_byte_format(tfmt) else 'bytefmt'
+ for fmt, items, _ in iter_format(n, obj):
+ size = struct.calcsize(fmt)
+ shape = [n] if n > 0 else []
+ tshape = _tshape + [size]
+
+ ex = ndarray(items, shape=shape, format=fmt)
+ m = memoryview(ex)
+
+ titems, tshape = cast_items(ex, tfmt, tsize, shape=tshape)
+
+ if titems is None:
+ self.assertRaises(TypeError, m.cast, tfmt, tshape)
+ continue
+ if titems == 'nan':
+ continue # NaNs in lists are a recipe for trouble.
+
+ # 1D -> ND
+ nd = ndarray(titems, shape=tshape, format=tfmt)
+
+ m2 = m.cast(tfmt, shape=tshape)
+ ndim = len(tshape)
+ strides = nd.strides
+ lst = nd.tolist()
+ self.verify(m2, obj=ex,
+ itemsize=tsize, fmt=tfmt, readonly=1,
+ ndim=ndim, shape=tshape, strides=strides,
+ lst=lst, cast=True)
+
+ # ND -> 1D
+ m3 = m2.cast(fmt)
+ m4 = m2.cast(fmt, shape=shape)
+ ndim = len(shape)
+ strides = ex.strides
+ lst = ex.tolist()
+
+ self.verify(m3, obj=ex,
+ itemsize=size, fmt=fmt, readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst, cast=True)
+
+ self.verify(m4, obj=ex,
+ itemsize=size, fmt=fmt, readonly=1,
+ ndim=ndim, shape=shape, strides=strides,
+ lst=lst, cast=True)
+
+ def test_memoryview_tolist(self):
+
+ # Most tolist() tests are in self.verify() etc.
+
+ a = array.array('h', list(range(-6, 6)))
+ m = memoryview(a)
+ self.assertEqual(m, a)
+ self.assertEqual(m.tolist(), a.tolist())
+
+ a = a[2::3]
+ m = m[2::3]
+ self.assertEqual(m, a)
+ self.assertEqual(m.tolist(), a.tolist())
+
+ ex = ndarray(list(range(2*3*5*7*11)), shape=[11,2,7,3,5], format='L')
+ m = memoryview(ex)
+ self.assertEqual(m.tolist(), ex.tolist())
+
+ ex = ndarray([(2, 5), (7, 11)], shape=[2], format='lh')
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.tolist)
+
+ ex = ndarray([b'12345'], shape=[1], format="s")
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.tolist)
+
+ ex = ndarray([b"a",b"b",b"c",b"d",b"e",b"f"], shape=[2,3], format='s')
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.tolist)
+
+ def test_memoryview_repr(self):
+ m = memoryview(bytearray(9))
+ r = m.__repr__()
+ self.assertTrue(r.startswith("<memory"))
+
+ m.release()
+ r = m.__repr__()
+ self.assertTrue(r.startswith("<released"))
+
+ def test_memoryview_sequence(self):
+
+ for fmt in ('d', 'f'):
+ inf = float(3e400)
+ ex = array.array(fmt, [1.0, inf, 3.0])
+ m = memoryview(ex)
+ self.assertIn(1.0, m)
+ self.assertIn(5e700, m)
+ self.assertIn(3.0, m)
+
+ ex = ndarray(9.0, [], format='f')
+ m = memoryview(ex)
+ self.assertRaises(TypeError, eval, "9.0 in m", locals())
+
+ def test_memoryview_index(self):
+
+ # ndim = 0
+ ex = ndarray(12.5, shape=[], format='d')
+ m = memoryview(ex)
+ self.assertEqual(m[()], 12.5)
+ self.assertEqual(m[...], m)
+ self.assertEqual(m[...], ex)
+ self.assertRaises(TypeError, m.__getitem__, 0)
+
+ ex = ndarray((1,2,3), shape=[], format='iii')
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.__getitem__, ())
+
+ # range
+ ex = ndarray(list(range(7)), shape=[7], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ self.assertRaises(IndexError, m.__getitem__, 2**64)
+ self.assertRaises(TypeError, m.__getitem__, 2.0)
+ self.assertRaises(TypeError, m.__getitem__, 0.0)
+
+ # out of bounds
+ self.assertRaises(IndexError, m.__getitem__, -8)
+ self.assertRaises(IndexError, m.__getitem__, 8)
+
+ # Not implemented: multidimensional sub-views
+ ex = ndarray(list(range(12)), shape=[3,4], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ self.assertRaises(NotImplementedError, m.__getitem__, 0)
+ self.assertRaises(NotImplementedError, m.__setitem__, 0, 9)
+ self.assertRaises(NotImplementedError, m.__getitem__, 0)
+
+ def test_memoryview_assign(self):
+
+ # ndim = 0
+ ex = ndarray(12.5, shape=[], format='f', flags=ND_WRITABLE)
+ m = memoryview(ex)
+ m[()] = 22.5
+ self.assertEqual(m[()], 22.5)
+ m[...] = 23.5
+ self.assertEqual(m[()], 23.5)
+ self.assertRaises(TypeError, m.__setitem__, 0, 24.7)
+
+ # read-only
+ ex = ndarray(list(range(7)), shape=[7])
+ m = memoryview(ex)
+ self.assertRaises(TypeError, m.__setitem__, 2, 10)
+
+ # range
+ ex = ndarray(list(range(7)), shape=[7], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ self.assertRaises(IndexError, m.__setitem__, 2**64, 9)
+ self.assertRaises(TypeError, m.__setitem__, 2.0, 10)
+ self.assertRaises(TypeError, m.__setitem__, 0.0, 11)
+
+ # out of bounds
+ self.assertRaises(IndexError, m.__setitem__, -8, 20)
+ self.assertRaises(IndexError, m.__setitem__, 8, 25)
+
+ # pack_single() success:
+ for fmt in fmtdict['@']:
+ if fmt == 'c' or fmt == '?':
+ continue
+ ex = ndarray([1,2,3], shape=[3], format=fmt, flags=ND_WRITABLE)
+ m = memoryview(ex)
+ i = randrange(-3, 3)
+ m[i] = 8
+ self.assertEqual(m[i], 8)
+ self.assertEqual(m[i], ex[i])
+
+ ex = ndarray([b'1', b'2', b'3'], shape=[3], format='c',
+ flags=ND_WRITABLE)
+ m = memoryview(ex)
+ m[2] = b'9'
+ self.assertEqual(m[2], b'9')
+
+ ex = ndarray([True, False, True], shape=[3], format='?',
+ flags=ND_WRITABLE)
+ m = memoryview(ex)
+ m[1] = True
+ self.assertEqual(m[1], True)
+
+ # pack_single() exceptions:
+ nd = ndarray([b'x'], shape=[1], format='c', flags=ND_WRITABLE)
+ m = memoryview(nd)
+ self.assertRaises(TypeError, m.__setitem__, 0, 100)
+
+ ex = ndarray(list(range(120)), shape=[1,2,3,4,5], flags=ND_WRITABLE)
+ m1 = memoryview(ex)
+
+ for fmt, _range in fmtdict['@'].items():
+ if (fmt == '?'): # PyObject_IsTrue() accepts anything
+ continue
+ if fmt == 'c': # special case tested above
+ continue
+ m2 = m1.cast(fmt)
+ lo, hi = _range
+ if fmt == 'd' or fmt == 'f':
+ lo, hi = -2**1024, 2**1024
+ if fmt != 'P': # PyLong_AsVoidPtr() accepts negative numbers
+ self.assertRaises(ValueError, m2.__setitem__, 0, lo-1)
+ self.assertRaises(TypeError, m2.__setitem__, 0, "xyz")
+ self.assertRaises(ValueError, m2.__setitem__, 0, hi)
+
+ # invalid item
+ m2 = m1.cast('c')
+ self.assertRaises(ValueError, m2.__setitem__, 0, b'\xff\xff')
+
+ # format not implemented
+ ex = ndarray(list(range(1)), shape=[1], format="xL", flags=ND_WRITABLE)
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.__setitem__, 0, 1)
+
+ ex = ndarray([b'12345'], shape=[1], format="s", flags=ND_WRITABLE)
+ m = memoryview(ex)
+ self.assertRaises(NotImplementedError, m.__setitem__, 0, 1)
+
+ # Not implemented: multidimensional sub-views
+ ex = ndarray(list(range(12)), shape=[3,4], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ self.assertRaises(NotImplementedError, m.__setitem__, 0, [2, 3])
+
+ def test_memoryview_slice(self):
+
+ ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ # zero step
+ self.assertRaises(ValueError, m.__getitem__, slice(0,2,0))
+ self.assertRaises(ValueError, m.__setitem__, slice(0,2,0),
+ bytearray([1,2]))
+
+ # invalid slice key
+ self.assertRaises(TypeError, m.__getitem__, ())
+
+ # multidimensional slices
+ ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE)
+ m = memoryview(ex)
+
+ self.assertRaises(NotImplementedError, m.__getitem__,
+ (slice(0,2,1), slice(0,2,1)))
+ self.assertRaises(NotImplementedError, m.__setitem__,
+ (slice(0,2,1), slice(0,2,1)), bytearray([1,2]))
+
+ # invalid slice tuple
+ self.assertRaises(TypeError, m.__getitem__, (slice(0,2,1), {}))
+ self.assertRaises(TypeError, m.__setitem__, (slice(0,2,1), {}),
+ bytearray([1,2]))
+
+ # rvalue is not an exporter
+ self.assertRaises(TypeError, m.__setitem__, slice(0,1,1), [1])
+
+ # non-contiguous slice assignment
+ for flags in (0, ND_PIL):
+ ex1 = ndarray(list(range(12)), shape=[12], strides=[-1], offset=11,
+ flags=ND_WRITABLE|flags)
+ ex2 = ndarray(list(range(24)), shape=[12], strides=[2], flags=flags)
+ m1 = memoryview(ex1)
+ m2 = memoryview(ex2)
+
+ ex1[2:5] = ex1[2:5]
+ m1[2:5] = m2[2:5]
+
+ self.assertEqual(m1, ex1)
+ self.assertEqual(m2, ex2)
+
+ ex1[1:3][::-1] = ex2[0:2][::1]
+ m1[1:3][::-1] = m2[0:2][::1]
+
+ self.assertEqual(m1, ex1)
+ self.assertEqual(m2, ex2)
+
+ ex1[4:1:-2][::-1] = ex1[1:4:2][::1]
+ m1[4:1:-2][::-1] = m1[1:4:2][::1]
+
+ self.assertEqual(m1, ex1)
+ self.assertEqual(m2, ex2)
+
+ def test_memoryview_array(self):
+
+ def cmptest(testcase, a, b, m, singleitem):
+ for i, _ in enumerate(a):
+ ai = a[i]
+ mi = m[i]
+ testcase.assertEqual(ai, mi)
+ a[i] = singleitem
+ if singleitem != ai:
+ testcase.assertNotEqual(a, m)
+ testcase.assertNotEqual(a, b)
+ else:
+ testcase.assertEqual(a, m)
+ testcase.assertEqual(a, b)
+ m[i] = singleitem
+ testcase.assertEqual(a, m)
+ testcase.assertEqual(b, m)
+ a[i] = ai
+ m[i] = mi
+
+ for n in range(1, 5):
+ for fmt, items, singleitem in iter_format(n, 'array'):
+ for lslice in genslices(n):
+ for rslice in genslices(n):
+
+ a = array.array(fmt, items)
+ b = array.array(fmt, items)
+ m = memoryview(b)
+
+ self.assertEqual(m, a)
+ self.assertEqual(m.tolist(), a.tolist())
+ self.assertEqual(m.tobytes(), a.tobytes())
+ self.assertEqual(len(m), len(a))
+
+ cmptest(self, a, b, m, singleitem)
+
+ array_err = None
+ have_resize = None
+ try:
+ al = a[lslice]
+ ar = a[rslice]
+ a[lslice] = a[rslice]
+ have_resize = len(al) != len(ar)
+ except Exception as e:
+ array_err = e.__class__
+
+ m_err = None
+ try:
+ m[lslice] = m[rslice]
+ except Exception as e:
+ m_err = e.__class__
+
+ if have_resize: # memoryview cannot change shape
+ self.assertIs(m_err, ValueError)
+ elif m_err or array_err:
+ self.assertIs(m_err, array_err)
+ else:
+ self.assertEqual(m, a)
+ self.assertEqual(m.tolist(), a.tolist())
+ self.assertEqual(m.tobytes(), a.tobytes())
+ cmptest(self, a, b, m, singleitem)
+
+ def test_memoryview_compare_special_cases(self):
+
+ a = array.array('L', [1, 2, 3])
+ b = array.array('L', [1, 2, 7])
+
+ # Ordering comparisons raise:
+ v = memoryview(a)
+ w = memoryview(b)
+ for attr in ('__lt__', '__le__', '__gt__', '__ge__'):
+ self.assertIs(getattr(v, attr)(w), NotImplemented)
+ self.assertIs(getattr(a, attr)(v), NotImplemented)
+
+ # Released views compare equal to themselves:
+ v = memoryview(a)
+ v.release()
+ self.assertEqual(v, v)
+ self.assertNotEqual(v, a)
+ self.assertNotEqual(a, v)
+
+ v = memoryview(a)
+ w = memoryview(a)
+ w.release()
+ self.assertNotEqual(v, w)
+ self.assertNotEqual(w, v)
+
+ # Operand does not implement the buffer protocol:
+ v = memoryview(a)
+ self.assertNotEqual(v, [1, 2, 3])
+
+ # NaNs
+ nd = ndarray([(0, 0)], shape=[1], format='l x d x', flags=ND_WRITABLE)
+ nd[0] = (-1, float('nan'))
+ self.assertNotEqual(memoryview(nd), nd)
+
+ # Depends on issue #15625: the struct module does not understand 'u'.
+ a = array.array('u', 'xyz')
+ v = memoryview(a)
+ self.assertNotEqual(a, v)
+ self.assertNotEqual(v, a)
+
+ # Some ctypes format strings are unknown to the struct module.
+ if ctypes:
+ # format: "T{>l:x:>l:y:}"
+ class BEPoint(ctypes.BigEndianStructure):
+ _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_long)]
+ point = BEPoint(100, 200)
+ a = memoryview(point)
+ b = memoryview(point)
+ self.assertNotEqual(a, b)
+ self.assertNotEqual(a, point)
+ self.assertNotEqual(point, a)
+ self.assertRaises(NotImplementedError, a.tolist)
+
+ def test_memoryview_compare_ndim_zero(self):
+
+ nd1 = ndarray(1729, shape=[], format='@L')
+ nd2 = ndarray(1729, shape=[], format='L', flags=ND_WRITABLE)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+ self.assertEqual(v, w)
+ self.assertEqual(w, v)
+ self.assertEqual(v, nd2)
+ self.assertEqual(nd2, v)
+ self.assertEqual(w, nd1)
+ self.assertEqual(nd1, w)
+
+ self.assertFalse(v.__ne__(w))
+ self.assertFalse(w.__ne__(v))
+
+ w[()] = 1728
+ self.assertNotEqual(v, w)
+ self.assertNotEqual(w, v)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(nd2, v)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(nd1, w)
+
+ self.assertFalse(v.__eq__(w))
+ self.assertFalse(w.__eq__(v))
+
+ nd = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE|ND_PIL)
+ ex = ndarray(list(range(12)), shape=[12], flags=ND_WRITABLE|ND_PIL)
+ m = memoryview(ex)
+
+ self.assertEqual(m, nd)
+ m[9] = 100
+ self.assertNotEqual(m, nd)
+
+ # struct module: equal
+ nd1 = ndarray((1729, 1.2, b'12345'), shape=[], format='Lf5s')
+ nd2 = ndarray((1729, 1.2, b'12345'), shape=[], format='hf5s',
+ flags=ND_WRITABLE)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+ self.assertEqual(v, w)
+ self.assertEqual(w, v)
+ self.assertEqual(v, nd2)
+ self.assertEqual(nd2, v)
+ self.assertEqual(w, nd1)
+ self.assertEqual(nd1, w)
+
+ # struct module: not equal
+ nd1 = ndarray((1729, 1.2, b'12345'), shape=[], format='Lf5s')
+ nd2 = ndarray((-1729, 1.2, b'12345'), shape=[], format='hf5s',
+ flags=ND_WRITABLE)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+ self.assertNotEqual(v, w)
+ self.assertNotEqual(w, v)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(nd2, v)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(nd1, w)
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+
+ def test_memoryview_compare_ndim_one(self):
+
+ # contiguous
+ nd1 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h')
+ nd2 = ndarray([-529, 576, -625, 676, 729], shape=[5], format='@h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # contiguous, struct module
+ nd1 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='<i')
+ nd2 = ndarray([-529, 576, -625, 676, 729], shape=[5], format='>h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # non-contiguous
+ nd1 = ndarray([-529, -625, -729], shape=[3], format='@h')
+ nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd2[::2])
+ self.assertEqual(w[::2], nd1)
+ self.assertEqual(v, w[::2])
+ self.assertEqual(v[::-1], w[::-2])
+
+ # non-contiguous, struct module
+ nd1 = ndarray([-529, -625, -729], shape=[3], format='!h')
+ nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='<l')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd2[::2])
+ self.assertEqual(w[::2], nd1)
+ self.assertEqual(v, w[::2])
+ self.assertEqual(v[::-1], w[::-2])
+
+ # non-contiguous, suboffsets
+ nd1 = ndarray([-529, -625, -729], shape=[3], format='@h')
+ nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h',
+ flags=ND_PIL)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd2[::2])
+ self.assertEqual(w[::2], nd1)
+ self.assertEqual(v, w[::2])
+ self.assertEqual(v[::-1], w[::-2])
+
+ # non-contiguous, suboffsets, struct module
+ nd1 = ndarray([-529, -625, -729], shape=[3], format='h 0c')
+ nd2 = ndarray([-529, 576, -625, 676, -729], shape=[5], format='> h',
+ flags=ND_PIL)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd2[::2])
+ self.assertEqual(w[::2], nd1)
+ self.assertEqual(v, w[::2])
+ self.assertEqual(v[::-1], w[::-2])
+
+ def test_memoryview_compare_zero_shape(self):
+
+ # zeros in shape
+ nd1 = ndarray([900, 961], shape=[0], format='@h')
+ nd2 = ndarray([-900, -961], shape=[0], format='@h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ # zeros in shape, struct module
+ nd1 = ndarray([900, 961], shape=[0], format='= h0c')
+ nd2 = ndarray([-900, -961], shape=[0], format='@ i')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_zero_strides(self):
+
+ # zero strides
+ nd1 = ndarray([900, 900, 900, 900], shape=[4], format='@L')
+ nd2 = ndarray([900], shape=[4], strides=[0], format='L')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ # zero strides, struct module
+ nd1 = ndarray([(900, 900)]*4, shape=[4], format='@ Li')
+ nd2 = ndarray([(900, 900)], shape=[4], strides=[0], format='!L h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_random_formats(self):
+
+ # random single character native formats
+ n = 10
+ for char in fmtdict['@m']:
+ fmt, items, singleitem = randitems(n, 'memoryview', '@', char)
+ for flags in (0, ND_PIL):
+ nd = ndarray(items, shape=[n], format=fmt, flags=flags)
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+
+ nd = nd[::-3]
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+
+ # random formats
+ n = 10
+ for _ in range(100):
+ fmt, items, singleitem = randitems(n)
+ for flags in (0, ND_PIL):
+ nd = ndarray(items, shape=[n], format=fmt, flags=flags)
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+
+ nd = nd[::-3]
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+
+ def test_memoryview_compare_multidim_c(self):
+
+ # C-contiguous, different values
+ nd1 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='@h')
+ nd2 = ndarray(list(range(0, 30)), shape=[3, 2, 5], format='@h')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # C-contiguous, different values, struct module
+ nd1 = ndarray([(0, 1, 2)]*30, shape=[3, 2, 5], format='=f q xxL')
+ nd2 = ndarray([(-1.2, 1, 2)]*30, shape=[3, 2, 5], format='< f 2Q')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # C-contiguous, different shape
+ nd1 = ndarray(list(range(30)), shape=[2, 3, 5], format='L')
+ nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='L')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # C-contiguous, different shape, struct module
+ nd1 = ndarray([(0, 1, 2)]*21, shape=[3, 7], format='! b B xL')
+ nd2 = ndarray([(0, 1, 2)]*21, shape=[7, 3], format='= Qx l xxL')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # C-contiguous, different format, struct module
+ nd1 = ndarray(list(range(30)), shape=[2, 3, 5], format='L')
+ nd2 = ndarray(list(range(30)), shape=[2, 3, 5], format='l')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_multidim_fortran(self):
+
+ # Fortran-contiguous, different values
+ nd1 = ndarray(list(range(-15, 15)), shape=[5, 2, 3], format='@h',
+ flags=ND_FORTRAN)
+ nd2 = ndarray(list(range(0, 30)), shape=[5, 2, 3], format='@h',
+ flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # Fortran-contiguous, different values, struct module
+ nd1 = ndarray([(2**64-1, -1)]*6, shape=[2, 3], format='=Qq',
+ flags=ND_FORTRAN)
+ nd2 = ndarray([(-1, 2**64-1)]*6, shape=[2, 3], format='=qQ',
+ flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # Fortran-contiguous, different shape
+ nd1 = ndarray(list(range(-15, 15)), shape=[2, 3, 5], format='l',
+ flags=ND_FORTRAN)
+ nd2 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='l',
+ flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # Fortran-contiguous, different shape, struct module
+ nd1 = ndarray(list(range(-15, 15)), shape=[2, 3, 5], format='0ll',
+ flags=ND_FORTRAN)
+ nd2 = ndarray(list(range(-15, 15)), shape=[3, 2, 5], format='l',
+ flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # Fortran-contiguous, different format, struct module
+ nd1 = ndarray(list(range(30)), shape=[5, 2, 3], format='@h',
+ flags=ND_FORTRAN)
+ nd2 = ndarray(list(range(30)), shape=[5, 2, 3], format='@b',
+ flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_multidim_mixed(self):
+
+ # mixed C/Fortran contiguous
+ lst1 = list(range(-15, 15))
+ lst2 = transpose(lst1, [3, 2, 5])
+ nd1 = ndarray(lst1, shape=[3, 2, 5], format='@l')
+ nd2 = ndarray(lst2, shape=[3, 2, 5], format='l', flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, w)
+
+ # mixed C/Fortran contiguous, struct module
+ lst1 = [(-3.3, -22, b'x')]*30
+ lst1[5] = (-2.2, -22, b'x')
+ lst2 = transpose(lst1, [3, 2, 5])
+ nd1 = ndarray(lst1, shape=[3, 2, 5], format='d b c')
+ nd2 = ndarray(lst2, shape=[3, 2, 5], format='d h c', flags=ND_FORTRAN)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, w)
+
+ # different values, non-contiguous
+ ex1 = ndarray(list(range(40)), shape=[5, 8], format='@I')
+ nd1 = ex1[3:1:-1, ::-2]
+ ex2 = ndarray(list(range(40)), shape=[5, 8], format='I')
+ nd2 = ex2[1:3:1, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # same values, non-contiguous, struct module
+ ex1 = ndarray([(2**31-1, -2**31)]*22, shape=[11, 2], format='=ii')
+ nd1 = ex1[3:1:-1, ::-2]
+ ex2 = ndarray([(2**31-1, -2**31)]*22, shape=[11, 2], format='>ii')
+ nd2 = ex2[1:3:1, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ # different shape
+ ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='b')
+ nd1 = ex1[1:3:, ::-2]
+ nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b')
+ nd2 = ex2[1:3:, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # different shape, struct module
+ ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='B')
+ nd1 = ex1[1:3:, ::-2]
+ nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b')
+ nd2 = ex2[1:3:, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # different format, struct module
+ ex1 = ndarray([(2, b'123')]*30, shape=[5, 3, 2], format='b3s')
+ nd1 = ex1[1:3:, ::-2]
+ nd2 = ndarray([(2, b'123')]*30, shape=[5, 3, 2], format='i3s')
+ nd2 = ex2[1:3:, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ def test_memoryview_compare_multidim_zero_shape(self):
+
+ # zeros in shape
+ nd1 = ndarray(list(range(30)), shape=[0, 3, 2], format='i')
+ nd2 = ndarray(list(range(30)), shape=[5, 0, 2], format='@i')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # zeros in shape, struct module
+ nd1 = ndarray(list(range(30)), shape=[0, 3, 2], format='i')
+ nd2 = ndarray(list(range(30)), shape=[5, 0, 2], format='@i')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ def test_memoryview_compare_multidim_zero_strides(self):
+
+ # zero strides
+ nd1 = ndarray([900]*80, shape=[4, 5, 4], format='@L')
+ nd2 = ndarray([900], shape=[4, 5, 4], strides=[0, 0, 0], format='L')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+ self.assertEqual(v.tolist(), w.tolist())
+
+ # zero strides, struct module
+ nd1 = ndarray([(1, 2)]*10, shape=[2, 5], format='=lQ')
+ nd2 = ndarray([(1, 2)], shape=[2, 5], strides=[0, 0], format='<lQ')
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_multidim_suboffsets(self):
+
+ # suboffsets
+ ex1 = ndarray(list(range(40)), shape=[5, 8], format='@I')
+ nd1 = ex1[3:1:-1, ::-2]
+ ex2 = ndarray(list(range(40)), shape=[5, 8], format='I', flags=ND_PIL)
+ nd2 = ex2[1:3:1, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # suboffsets, struct module
+ ex1 = ndarray([(2**64-1, -1)]*40, shape=[5, 8], format='=Qq',
+ flags=ND_WRITABLE)
+ ex1[2][7] = (1, -2)
+ nd1 = ex1[3:1:-1, ::-2]
+
+ ex2 = ndarray([(2**64-1, -1)]*40, shape=[5, 8], format='>Qq',
+ flags=ND_PIL|ND_WRITABLE)
+ ex2[2][7] = (1, -2)
+ nd2 = ex2[1:3:1, ::-2]
+
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ # suboffsets, different shape
+ ex1 = ndarray(list(range(30)), shape=[2, 3, 5], format='b',
+ flags=ND_PIL)
+ nd1 = ex1[1:3:, ::-2]
+ nd2 = ndarray(list(range(30)), shape=[3, 2, 5], format='b')
+ nd2 = ex2[1:3:, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # suboffsets, different shape, struct module
+ ex1 = ndarray([(2**8-1, -1)]*40, shape=[2, 3, 5], format='Bb',
+ flags=ND_PIL|ND_WRITABLE)
+ nd1 = ex1[1:2:, ::-2]
+
+ ex2 = ndarray([(2**8-1, -1)]*40, shape=[3, 2, 5], format='Bb')
+ nd2 = ex2[1:2:, ::-2]
+
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # suboffsets, different format
+ ex1 = ndarray(list(range(30)), shape=[5, 3, 2], format='i', flags=ND_PIL)
+ nd1 = ex1[1:3:, ::-2]
+ ex2 = ndarray(list(range(30)), shape=[5, 3, 2], format='@I', flags=ND_PIL)
+ nd2 = ex2[1:3:, ::-2]
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, nd2)
+ self.assertEqual(w, nd1)
+ self.assertEqual(v, w)
+
+ # suboffsets, different format, struct module
+ ex1 = ndarray([(b'hello', b'', 1)]*27, shape=[3, 3, 3], format='5s0sP',
+ flags=ND_PIL|ND_WRITABLE)
+ ex1[1][2][2] = (b'sushi', b'', 1)
+ nd1 = ex1[1:3:, ::-2]
+
+ ex2 = ndarray([(b'hello', b'', 1)]*27, shape=[3, 3, 3], format='5s0sP',
+ flags=ND_PIL|ND_WRITABLE)
+ ex1[1][2][2] = (b'sushi', b'', 1)
+ nd2 = ex2[1:3:, ::-2]
+
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertNotEqual(v, nd2)
+ self.assertNotEqual(w, nd1)
+ self.assertNotEqual(v, w)
+
+ # initialize mixed C/Fortran + suboffsets
+ lst1 = list(range(-15, 15))
+ lst2 = transpose(lst1, [3, 2, 5])
+ nd1 = ndarray(lst1, shape=[3, 2, 5], format='@l', flags=ND_PIL)
+ nd2 = ndarray(lst2, shape=[3, 2, 5], format='l', flags=ND_FORTRAN|ND_PIL)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, w)
+
+ # initialize mixed C/Fortran + suboffsets, struct module
+ lst1 = [(b'sashimi', b'sliced', 20.05)]*30
+ lst1[11] = (b'ramen', b'spicy', 9.45)
+ lst2 = transpose(lst1, [3, 2, 5])
+
+ nd1 = ndarray(lst1, shape=[3, 2, 5], format='< 10p 9p d', flags=ND_PIL)
+ nd2 = ndarray(lst2, shape=[3, 2, 5], format='> 10p 9p d',
+ flags=ND_FORTRAN|ND_PIL)
+ v = memoryview(nd1)
+ w = memoryview(nd2)
+
+ self.assertEqual(v, nd1)
+ self.assertEqual(w, nd2)
+ self.assertEqual(v, w)
+
+ def test_memoryview_compare_not_equal(self):
+
+ # items not equal
+ for byteorder in ['=', '<', '>', '!']:
+ x = ndarray([2**63]*120, shape=[3,5,2,2,2], format=byteorder+'Q')
+ y = ndarray([2**63]*120, shape=[3,5,2,2,2], format=byteorder+'Q',
+ flags=ND_WRITABLE|ND_FORTRAN)
+ y[2][3][1][1][1] = 1
+ a = memoryview(x)
+ b = memoryview(y)
+ self.assertEqual(a, x)
+ self.assertEqual(b, y)
+ self.assertNotEqual(a, b)
+ self.assertNotEqual(a, y)
+ self.assertNotEqual(b, x)
+
+ x = ndarray([(2**63, 2**31, 2**15)]*120, shape=[3,5,2,2,2],
+ format=byteorder+'QLH')
+ y = ndarray([(2**63, 2**31, 2**15)]*120, shape=[3,5,2,2,2],
+ format=byteorder+'QLH', flags=ND_WRITABLE|ND_FORTRAN)
+ y[2][3][1][1][1] = (1, 1, 1)
+ a = memoryview(x)
+ b = memoryview(y)
+ self.assertEqual(a, x)
+ self.assertEqual(b, y)
+ self.assertNotEqual(a, b)
+ self.assertNotEqual(a, y)
+ self.assertNotEqual(b, x)
+
+ def test_memoryview_check_released(self):
+
+ a = array.array('d', [1.1, 2.2, 3.3])
+
+ m = memoryview(a)
+ m.release()
+
+ # PyMemoryView_FromObject()
+ self.assertRaises(ValueError, memoryview, m)
+ # memoryview.cast()
+ self.assertRaises(ValueError, m.cast, 'c')
+ # getbuffer()
+ self.assertRaises(ValueError, ndarray, m)
+ # memoryview.tolist()
+ self.assertRaises(ValueError, m.tolist)
+ # memoryview.tobytes()
+ self.assertRaises(ValueError, m.tobytes)
+ # sequence
+ self.assertRaises(ValueError, eval, "1.0 in m", locals())
+ # subscript
+ self.assertRaises(ValueError, m.__getitem__, 0)
+ # assignment
+ self.assertRaises(ValueError, m.__setitem__, 0, 1)
+
+ for attr in ('obj', 'nbytes', 'readonly', 'itemsize', 'format', 'ndim',
+ 'shape', 'strides', 'suboffsets', 'c_contiguous',
+ 'f_contiguous', 'contiguous'):
+ self.assertRaises(ValueError, m.__getattribute__, attr)
+
+ # richcompare
+ b = array.array('d', [1.1, 2.2, 3.3])
+ m1 = memoryview(a)
+ m2 = memoryview(b)
+
+ self.assertEqual(m1, m2)
+ m1.release()
+ self.assertNotEqual(m1, m2)
+ self.assertNotEqual(m1, a)
+ self.assertEqual(m1, m1)
+
+ def test_memoryview_tobytes(self):
+ # Many implicit tests are already in self.verify().
+
+ t = (-529, 576, -625, 676, -729)
+
+ nd = ndarray(t, shape=[5], format='@h')
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tobytes(), nd.tobytes())
+
+ nd = ndarray([t], shape=[1], format='>hQiLl')
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tobytes(), nd.tobytes())
+
+ nd = ndarray([t for _ in range(12)], shape=[2,2,3], format='=hQiLl')
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tobytes(), nd.tobytes())
+
+ nd = ndarray([t for _ in range(120)], shape=[5,2,2,3,2],
+ format='<hQiLl')
+ m = memoryview(nd)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tobytes(), nd.tobytes())
+
+ # Unknown formats are handled: tobytes() purely depends on itemsize.
+ if ctypes:
+ # format: "T{>l:x:>l:y:}"
+ class BEPoint(ctypes.BigEndianStructure):
+ _fields_ = [("x", ctypes.c_long), ("y", ctypes.c_long)]
+ point = BEPoint(100, 200)
+ a = memoryview(point)
+ self.assertEqual(a.tobytes(), bytes(point))
+
+ def test_memoryview_get_contiguous(self):
+ # Many implicit tests are already in self.verify().
+
+ # no buffer interface
+ self.assertRaises(TypeError, get_contiguous, {}, PyBUF_READ, 'F')
+
+ # writable request to read-only object
+ self.assertRaises(BufferError, get_contiguous, b'x', PyBUF_WRITE, 'C')
+
+ # writable request to non-contiguous object
+ nd = ndarray([1, 2, 3], shape=[2], strides=[2])
+ self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'A')
+
+ # scalar, read-only request from read-only exporter
+ nd = ndarray(9, shape=(), format="L")
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m[()], 9)
+
+ # scalar, read-only request from writable exporter
+ nd = ndarray(9, shape=(), format="L", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m[()], 9)
+
+ # scalar, writable request
+ for order in ['C', 'F', 'A']:
+ nd[()] = 9
+ m = get_contiguous(nd, PyBUF_WRITE, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m[()], 9)
+
+ m[()] = 10
+ self.assertEqual(m[()], 10)
+ self.assertEqual(nd[()], 10)
+
+ # zeros in shape
+ nd = ndarray([1], shape=[0], format="L", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertRaises(IndexError, m.__getitem__, 0)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tolist(), [])
+
+ nd = ndarray(list(range(8)), shape=[2, 0, 7], format="L",
+ flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(ndarray(m).tolist(), [[], []])
+
+ # one-dimensional
+ nd = ndarray([1], shape=[1], format="h", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_WRITE, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tolist(), nd.tolist())
+
+ nd = ndarray([1, 2, 3], shape=[3], format="b", flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_WRITE, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tolist(), nd.tolist())
+
+ # one-dimensional, non-contiguous
+ nd = ndarray([1, 2, 3], shape=[2], strides=[2], flags=ND_WRITABLE)
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tolist(), nd.tolist())
+ self.assertRaises(TypeError, m.__setitem__, 1, 20)
+ self.assertEqual(m[1], 3)
+ self.assertEqual(nd[1], 3)
+
+ nd = nd[::-1]
+ for order in ['C', 'F', 'A']:
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(m, nd)
+ self.assertEqual(m.tolist(), nd.tolist())
+ self.assertRaises(TypeError, m.__setitem__, 1, 20)
+ self.assertEqual(m[1], 1)
+ self.assertEqual(nd[1], 1)
+
+ # multi-dimensional, contiguous input
+ nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE)
+ for order in ['C', 'A']:
+ m = get_contiguous(nd, PyBUF_WRITE, order)
+ self.assertEqual(ndarray(m).tolist(), nd.tolist())
+
+ self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'F')
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(ndarray(m).tolist(), nd.tolist())
+
+ nd = ndarray(list(range(12)), shape=[3, 4],
+ flags=ND_WRITABLE|ND_FORTRAN)
+ for order in ['F', 'A']:
+ m = get_contiguous(nd, PyBUF_WRITE, order)
+ self.assertEqual(ndarray(m).tolist(), nd.tolist())
+
+ self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE, 'C')
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(ndarray(m).tolist(), nd.tolist())
+
+ # multi-dimensional, non-contiguous input
+ nd = ndarray(list(range(12)), shape=[3, 4], flags=ND_WRITABLE|ND_PIL)
+ for order in ['C', 'F', 'A']:
+ self.assertRaises(BufferError, get_contiguous, nd, PyBUF_WRITE,
+ order)
+ m = get_contiguous(nd, PyBUF_READ, order)
+ self.assertEqual(ndarray(m).tolist(), nd.tolist())
+
+ # flags
+ nd = ndarray([1,2,3,4,5], shape=[3], strides=[2])
+ m = get_contiguous(nd, PyBUF_READ, 'C')
+ self.assertTrue(m.c_contiguous)
+
+ def test_memoryview_serializing(self):
+
+ # C-contiguous
+ size = struct.calcsize('i')
+ a = array.array('i', [1,2,3,4,5])
+ m = memoryview(a)
+ buf = io.BytesIO(m)
+ b = bytearray(5*size)
+ buf.readinto(b)
+ self.assertEqual(m.tobytes(), b)
+
+ # C-contiguous, multi-dimensional
+ size = struct.calcsize('L')
+ nd = ndarray(list(range(12)), shape=[2,3,2], format="L")
+ m = memoryview(nd)
+ buf = io.BytesIO(m)
+ b = bytearray(2*3*2*size)
+ buf.readinto(b)
+ self.assertEqual(m.tobytes(), b)
+
+ # Fortran contiguous, multi-dimensional
+ #size = struct.calcsize('L')
+ #nd = ndarray(list(range(12)), shape=[2,3,2], format="L",
+ # flags=ND_FORTRAN)
+ #m = memoryview(nd)
+ #buf = io.BytesIO(m)
+ #b = bytearray(2*3*2*size)
+ #buf.readinto(b)
+ #self.assertEqual(m.tobytes(), b)
+
+ def test_memoryview_hash(self):
+
+ # bytes exporter
+ b = bytes(list(range(12)))
+ m = memoryview(b)
+ self.assertEqual(hash(b), hash(m))
+
+ # C-contiguous
+ mc = m.cast('c', shape=[3,4])
+ self.assertEqual(hash(mc), hash(b))
+
+ # non-contiguous
+ mx = m[::-2]
+ b = bytes(list(range(12))[::-2])
+ self.assertEqual(hash(mx), hash(b))
+
+ # Fortran contiguous
+ nd = ndarray(list(range(30)), shape=[3,2,5], flags=ND_FORTRAN)
+ m = memoryview(nd)
+ self.assertEqual(hash(m), hash(nd))
+
+ # multi-dimensional slice
+ nd = ndarray(list(range(30)), shape=[3,2,5])
+ x = nd[::2, ::, ::-1]
+ m = memoryview(x)
+ self.assertEqual(hash(m), hash(x))
+
+ # multi-dimensional slice with suboffsets
+ nd = ndarray(list(range(30)), shape=[2,5,3], flags=ND_PIL)
+ x = nd[::2, ::, ::-1]
+ m = memoryview(x)
+ self.assertEqual(hash(m), hash(x))
+
+ # equality-hash invariant
+ x = ndarray(list(range(12)), shape=[12], format='B')
+ a = memoryview(x)
+
+ y = ndarray(list(range(12)), shape=[12], format='b')
+ b = memoryview(y)
+
+ self.assertEqual(a, b)
+ self.assertEqual(hash(a), hash(b))
+
+ # non-byte formats
+ nd = ndarray(list(range(12)), shape=[2,2,3], format='L')
+ m = memoryview(nd)
+ self.assertRaises(ValueError, m.__hash__)
+
+ nd = ndarray(list(range(-6, 6)), shape=[2,2,3], format='h')
+ m = memoryview(nd)
+ self.assertRaises(ValueError, m.__hash__)
+
+ nd = ndarray(list(range(12)), shape=[2,2,3], format='= L')
+ m = memoryview(nd)
+ self.assertRaises(ValueError, m.__hash__)
+
+ nd = ndarray(list(range(-6, 6)), shape=[2,2,3], format='< h')
+ m = memoryview(nd)
+ self.assertRaises(ValueError, m.__hash__)
+
+ def test_memoryview_release(self):
+
+ # Create re-exporter from getbuffer(memoryview), then release the view.
+ a = bytearray([1,2,3])
+ m = memoryview(a)
+ nd = ndarray(m) # re-exporter
+ self.assertRaises(BufferError, m.release)
+ del nd
+ m.release()
+
+ a = bytearray([1,2,3])
+ m = memoryview(a)
+ nd1 = ndarray(m, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ nd2 = ndarray(nd1, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ self.assertIs(nd2.obj, m)
+ self.assertRaises(BufferError, m.release)
+ del nd1, nd2
+ m.release()
+
+ # chained views
+ a = bytearray([1,2,3])
+ m1 = memoryview(a)
+ m2 = memoryview(m1)
+ nd = ndarray(m2) # re-exporter
+ m1.release()
+ self.assertRaises(BufferError, m2.release)
+ del nd
+ m2.release()
+
+ a = bytearray([1,2,3])
+ m1 = memoryview(a)
+ m2 = memoryview(m1)
+ nd1 = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ nd2 = ndarray(nd1, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ self.assertIs(nd2.obj, m2)
+ m1.release()
+ self.assertRaises(BufferError, m2.release)
+ del nd1, nd2
+ m2.release()
+
+ # Allow changing layout while buffers are exported.
+ nd = ndarray([1,2,3], shape=[3], flags=ND_VAREXPORT)
+ m1 = memoryview(nd)
+
+ nd.push([4,5,6,7,8], shape=[5]) # mutate nd
+ m2 = memoryview(nd)
+
+ x = memoryview(m1)
+ self.assertEqual(x.tolist(), m1.tolist())
+
+ y = memoryview(m2)
+ self.assertEqual(y.tolist(), m2.tolist())
+ self.assertEqual(y.tolist(), nd.tolist())
+ m2.release()
+ y.release()
+
+ nd.pop() # pop the current view
+ self.assertEqual(x.tolist(), nd.tolist())
+
+ del nd
+ m1.release()
+ x.release()
+
+ # If multiple memoryviews share the same managed buffer, implicit
+ # release() in the context manager's __exit__() method should still
+ # work.
+ def catch22(b):
+ with memoryview(b) as m2:
+ pass
+
+ x = bytearray(b'123')
+ with memoryview(x) as m1:
+ catch22(m1)
+ self.assertEqual(m1[0], ord(b'1'))
+
+ x = ndarray(list(range(12)), shape=[2,2,3], format='l')
+ y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ self.assertIs(z.obj, x)
+ with memoryview(z) as m:
+ catch22(m)
+ self.assertEqual(m[0:1].tolist(), [[[0, 1, 2], [3, 4, 5]]])
+
+ # Test garbage collection.
+ for flags in (0, ND_REDIRECT):
+ x = bytearray(b'123')
+ with memoryview(x) as m1:
+ del x
+ y = ndarray(m1, getbuf=PyBUF_FULL_RO, flags=flags)
+ with memoryview(y) as m2:
+ del y
+ z = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=flags)
+ with memoryview(z) as m3:
+ del z
+ catch22(m3)
+ catch22(m2)
+ catch22(m1)
+ self.assertEqual(m1[0], ord(b'1'))
+ self.assertEqual(m2[1], ord(b'2'))
+ self.assertEqual(m3[2], ord(b'3'))
+ del m3
+ del m2
+ del m1
+
+ x = bytearray(b'123')
+ with memoryview(x) as m1:
+ del x
+ y = ndarray(m1, getbuf=PyBUF_FULL_RO, flags=flags)
+ with memoryview(y) as m2:
+ del y
+ z = ndarray(m2, getbuf=PyBUF_FULL_RO, flags=flags)
+ with memoryview(z) as m3:
+ del z
+ catch22(m1)
+ catch22(m2)
+ catch22(m3)
+ self.assertEqual(m1[0], ord(b'1'))
+ self.assertEqual(m2[1], ord(b'2'))
+ self.assertEqual(m3[2], ord(b'3'))
+ del m1, m2, m3
+
+ # memoryview.release() fails if the view has exported buffers.
+ x = bytearray(b'123')
+ with self.assertRaises(BufferError):
+ with memoryview(x) as m:
+ ex = ndarray(m)
+ m[0] == ord(b'1')
+
+ def test_memoryview_redirect(self):
+
+ nd = ndarray([1.0 * x for x in range(12)], shape=[12], format='d')
+ a = array.array('d', [1.0 * x for x in range(12)])
+
+ for x in (nd, a):
+ y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ m = memoryview(z)
+
+ self.assertIs(y.obj, x)
+ self.assertIs(z.obj, x)
+ self.assertIs(m.obj, x)
+
+ self.assertEqual(m, x)
+ self.assertEqual(m, y)
+ self.assertEqual(m, z)
+
+ self.assertEqual(m[1:3], x[1:3])
+ self.assertEqual(m[1:3], y[1:3])
+ self.assertEqual(m[1:3], z[1:3])
+ del y, z
+ self.assertEqual(m[1:3], x[1:3])
+
+ def test_memoryview_from_static_exporter(self):
+
+ fmt = 'B'
+ lst = [0,1,2,3,4,5,6,7,8,9,10,11]
+
+ # exceptions
+ self.assertRaises(TypeError, staticarray, 1, 2, 3)
+
+ # view.obj==x
+ x = staticarray()
+ y = memoryview(x)
+ self.verify(y, obj=x,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ for i in range(12):
+ self.assertEqual(y[i], i)
+ del x
+ del y
+
+ x = staticarray()
+ y = memoryview(x)
+ del y
+ del x
+
+ x = staticarray()
+ y = ndarray(x, getbuf=PyBUF_FULL_RO)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO)
+ m = memoryview(z)
+ self.assertIs(y.obj, x)
+ self.assertIs(m.obj, z)
+ self.verify(m, obj=z,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ del x, y, z, m
+
+ x = staticarray()
+ y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ m = memoryview(z)
+ self.assertIs(y.obj, x)
+ self.assertIs(z.obj, x)
+ self.assertIs(m.obj, x)
+ self.verify(m, obj=x,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ del x, y, z, m
+
+ # view.obj==NULL
+ x = staticarray(legacy_mode=True)
+ y = memoryview(x)
+ self.verify(y, obj=None,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ for i in range(12):
+ self.assertEqual(y[i], i)
+ del x
+ del y
+
+ x = staticarray(legacy_mode=True)
+ y = memoryview(x)
+ del y
+ del x
+
+ x = staticarray(legacy_mode=True)
+ y = ndarray(x, getbuf=PyBUF_FULL_RO)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO)
+ m = memoryview(z)
+ self.assertIs(y.obj, None)
+ self.assertIs(m.obj, z)
+ self.verify(m, obj=z,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ del x, y, z, m
+
+ x = staticarray(legacy_mode=True)
+ y = ndarray(x, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ z = ndarray(y, getbuf=PyBUF_FULL_RO, flags=ND_REDIRECT)
+ m = memoryview(z)
+ # Clearly setting view.obj==NULL is inferior, since it
+ # messes up the redirection chain:
+ self.assertIs(y.obj, None)
+ self.assertIs(z.obj, y)
+ self.assertIs(m.obj, y)
+ self.verify(m, obj=y,
+ itemsize=1, fmt=fmt, readonly=1,
+ ndim=1, shape=[12], strides=[1],
+ lst=lst)
+ del x, y, z, m
+
+ def test_memoryview_getbuffer_undefined(self):
+
+ # getbufferproc does not adhere to the new documentation
+ nd = ndarray([1,2,3], [3], flags=ND_GETBUF_FAIL|ND_GETBUF_UNDEFINED)
+ self.assertRaises(BufferError, memoryview, nd)
+
+ def test_issue_7385(self):
+ x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL)
+ self.assertRaises(BufferError, memoryview, x)
+
+
+def test_main():
+ support.run_unittest(TestBufferProtocol)
+
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 55fb63a..c32992c 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1,19 +1,21 @@
# Python test set -- built-in functions
-import platform
-import unittest
-import sys
-import warnings
+import ast
+import builtins
import collections
import io
+import locale
import os
-import ast
-import types
-import builtins
+import pickle
+import platform
import random
+import sys
import traceback
-from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
+import types
+import unittest
+import warnings
from operator import neg
+from test.support import TESTFN, unlink, run_unittest, check_warnings
try:
import pty, signal
except ImportError:
@@ -110,7 +112,30 @@ class TestFailingIter:
def __iter__(self):
raise RuntimeError
+def filter_char(arg):
+ return ord(arg) > ord("d")
+
+def map_char(arg):
+ return chr(ord(arg)+1)
+
class BuiltinTest(unittest.TestCase):
+ # Helper to check picklability
+ def check_iter_pickle(self, it, seq):
+ itorg = it
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(list(it), seq)
+
+ #test the iterator after dropping one from it
+ it = pickle.loads(d)
+ try:
+ next(it)
+ except StopIteration:
+ return
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), seq[1:])
def test_import(self):
__import__('sys')
@@ -255,8 +280,7 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(chr(0xff), '\xff')
self.assertRaises(ValueError, chr, 1<<24)
self.assertEqual(chr(sys.maxunicode),
- str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
- 'unicode-escape'))
+ str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
self.assertRaises(TypeError, chr)
self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
self.assertEqual(chr(0x00010000), "\U00010000")
@@ -378,7 +402,15 @@ class BuiltinTest(unittest.TestCase):
f = Foo()
self.assertTrue(dir(f) == ["ga", "kan", "roo"])
- # dir(obj__dir__not_list)
+ # dir(obj__dir__tuple)
+ class Foo(object):
+ def __dir__(self):
+ return ("b", "c", "a")
+ res = dir(Foo())
+ self.assertIsInstance(res, list)
+ self.assertTrue(res == ["a", "b", "c"])
+
+ # dir(obj__dir__not_sequence)
class Foo(object):
def __dir__(self):
return 7
@@ -391,6 +423,8 @@ class BuiltinTest(unittest.TestCase):
except:
self.assertEqual(len(dir(sys.exc_info()[2])), 4)
+ # test that object has a __dir__()
+ self.assertEqual(sorted([].__dir__()), dir([]))
def test_divmod(self):
self.assertEqual(divmod(12, 7), (1, 5))
@@ -400,10 +434,13 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
- self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
- self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
- self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
- self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
+ for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
+ (-3.25, 1.0, (-4.0, 0.75)),
+ (3.25, -1.0, (-4.0, -0.75)),
+ (-3.25, -1.0, (3.0, -0.25))]:
+ result = divmod(num, denom)
+ self.assertAlmostEqual(result[0], exp_result[0])
+ self.assertAlmostEqual(result[1], exp_result[1])
self.assertRaises(TypeError, divmod)
@@ -518,6 +555,39 @@ class BuiltinTest(unittest.TestCase):
del l['__builtins__']
self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
+ def test_exec_globals(self):
+ code = compile("print('Hello World!')", "", "exec")
+ # no builtin function
+ self.assertRaisesRegex(NameError, "name 'print' is not defined",
+ exec, code, {'__builtins__': {}})
+ # __builtins__ must be a mapping type
+ self.assertRaises(TypeError,
+ exec, code, {'__builtins__': 123})
+
+ # no __build_class__ function
+ code = compile("class A: pass", "", "exec")
+ self.assertRaisesRegex(NameError, "__build_class__ not found",
+ exec, code, {'__builtins__': {}})
+
+ class frozendict_error(Exception):
+ pass
+
+ class frozendict(dict):
+ def __setitem__(self, key, value):
+ raise frozendict_error("frozendict is readonly")
+
+ # read-only builtins
+ frozen_builtins = frozendict(__builtins__)
+ code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
+ self.assertRaises(frozendict_error,
+ exec, code, {'__builtins__': frozen_builtins})
+
+ # read-only globals
+ namespace = frozendict({})
+ code = compile("x=1", "test", "exec")
+ self.assertRaises(frozendict_error,
+ exec, code, namespace)
+
def test_exec_redirected(self):
savestdout = sys.stdout
sys.stdout = None # Whatever that cannot flush()
@@ -554,6 +624,11 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
self.assertRaises(TypeError, list, filter(42, (1, 2)))
+ def test_filter_pickle(self):
+ f1 = filter(filter_char, "abcdeabcde")
+ f2 = filter(filter_char, "abcdeabcde")
+ self.check_iter_pickle(f1, list(f2))
+
def test_getattr(self):
self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
self.assertRaises(TypeError, getattr, sys, 1)
@@ -747,6 +822,11 @@ class BuiltinTest(unittest.TestCase):
raise RuntimeError
self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
+ def test_map_pickle(self):
+ m1 = map(map_char, "Is this the real life?")
+ m2 = map(map_char, "Is this the real life?")
+ self.check_iter_pickle(m1, list(m2))
+
def test_max(self):
self.assertEqual(max('123123'), '3')
self.assertEqual(max(1, 2, 3), 3)
@@ -880,7 +960,29 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(fp.read(1000), 'YYY'*100)
finally:
fp.close()
- unlink(TESTFN)
+ unlink(TESTFN)
+
+ def test_open_default_encoding(self):
+ old_environ = dict(os.environ)
+ try:
+ # try to get a user preferred encoding different than the current
+ # locale encoding to check that open() uses the current locale
+ # encoding and not the user preferred encoding
+ for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
+ if key in os.environ:
+ del os.environ[key]
+
+ self.write_testfile()
+ current_locale_encoding = locale.getpreferredencoding(False)
+ fp = open(TESTFN, 'w')
+ try:
+ self.assertEqual(fp.encoding, current_locale_encoding)
+ finally:
+ fp.close()
+ unlink(TESTFN)
+ finally:
+ os.environ.clear()
+ os.environ.update(old_environ)
def test_ord(self):
self.assertEqual(ord(' '), 32)
@@ -1197,6 +1299,9 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, sum, 42)
self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
+ self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
+ values = [bytearray(b'a'), bytearray(b'b')]
+ self.assertRaises(TypeError, sum, values, bytearray(b''))
self.assertRaises(TypeError, sum, [[1], [2], [3]])
self.assertRaises(TypeError, sum, [{2:3}])
self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
@@ -1285,6 +1390,13 @@ class BuiltinTest(unittest.TestCase):
return i
self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
+ def test_zip_pickle(self):
+ a = (1, 2, 3)
+ b = (4, 5, 6)
+ t = [(1, 4), (2, 5), (3, 6)]
+ z1 = zip(a, b)
+ self.check_iter_pickle(z1, t)
+
def test_format(self):
# Test the basic machinery of the format() builtin. Don't test
# the specifics of the various formatters
@@ -1358,14 +1470,14 @@ class BuiltinTest(unittest.TestCase):
# --------------------------------------------------------------------
# Issue #7994: object.__format__ with a non-empty format string is
- # pending deprecated
+ # deprecated
def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always", PendingDeprecationWarning)
+ warnings.simplefilter("always", DeprecationWarning)
format(obj, fmt_str)
if should_raise_warning:
self.assertEqual(len(w), 1)
- self.assertIsInstance(w[0].message, PendingDeprecationWarning)
+ self.assertIsInstance(w[0].message, DeprecationWarning)
self.assertIn('object.__format__ with a non-empty format '
'string', str(w[0].message))
else:
@@ -1409,6 +1521,13 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(ValueError, x.translate, b"1", 1)
self.assertRaises(TypeError, x.translate, b"1"*256, 1)
+ def test_construct_singletons(self):
+ for const in None, Ellipsis, NotImplemented:
+ tp = type(const)
+ self.assertIs(tp(), const)
+ self.assertRaises(TypeError, tp, 1, 2)
+ self.assertRaises(TypeError, tp, a=1, b=2)
+
class TestSorted(unittest.TestCase):
def test_basic(self):
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 89e2274..fe6e939 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -188,24 +188,26 @@ class BaseBytesTest(unittest.TestCase):
def test_encoding(self):
sample = "Hello world\n\u1234\u5678\u9abc"
- for enc in ("utf8", "utf16"):
+ for enc in ("utf-8", "utf-16"):
b = self.type2test(sample, enc)
self.assertEqual(b, self.type2test(sample.encode(enc)))
- self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
- b = self.type2test(sample, "latin1", "ignore")
+ self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
+ b = self.type2test(sample, "latin-1", "ignore")
self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
def test_decode(self):
sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
- for enc in ("utf8", "utf16"):
+ for enc in ("utf-8", "utf-16"):
b = self.type2test(sample, enc)
self.assertEqual(b.decode(enc), sample)
sample = "Hello world\n\x80\x81\xfe\xff"
- b = self.type2test(sample, "latin1")
- self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
- self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
- self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
+ b = self.type2test(sample, "latin-1")
+ self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
+ self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
+ self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
"Hello world\n")
+ # Default encoding is utf-8
+ self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
def test_from_int(self):
b = self.type2test(0)
@@ -291,10 +293,27 @@ class BaseBytesTest(unittest.TestCase):
def test_count(self):
b = self.type2test(b'mississippi')
+ i = 105
+ p = 112
+ w = 119
+
self.assertEqual(b.count(b'i'), 4)
self.assertEqual(b.count(b'ss'), 2)
self.assertEqual(b.count(b'w'), 0)
+ self.assertEqual(b.count(i), 4)
+ self.assertEqual(b.count(w), 0)
+
+ self.assertEqual(b.count(b'i', 6), 2)
+ self.assertEqual(b.count(b'p', 6), 2)
+ self.assertEqual(b.count(b'i', 1, 3), 1)
+ self.assertEqual(b.count(b'p', 7, 9), 1)
+
+ self.assertEqual(b.count(i, 6), 2)
+ self.assertEqual(b.count(p, 6), 2)
+ self.assertEqual(b.count(i, 1, 3), 1)
+ self.assertEqual(b.count(p, 7, 9), 1)
+
def test_startswith(self):
b = self.type2test(b'hello')
self.assertFalse(self.type2test().startswith(b"anything"))
@@ -325,35 +344,86 @@ class BaseBytesTest(unittest.TestCase):
def test_find(self):
b = self.type2test(b'mississippi')
+ i = 105
+ w = 119
+
self.assertEqual(b.find(b'ss'), 2)
+ self.assertEqual(b.find(b'w'), -1)
+ self.assertEqual(b.find(b'mississippian'), -1)
+
+ self.assertEqual(b.find(i), 1)
+ self.assertEqual(b.find(w), -1)
+
self.assertEqual(b.find(b'ss', 3), 5)
self.assertEqual(b.find(b'ss', 1, 7), 2)
self.assertEqual(b.find(b'ss', 1, 3), -1)
- self.assertEqual(b.find(b'w'), -1)
- self.assertEqual(b.find(b'mississippian'), -1)
+
+ self.assertEqual(b.find(i, 6), 7)
+ self.assertEqual(b.find(i, 1, 3), 1)
+ self.assertEqual(b.find(w, 1, 3), -1)
+
+ for index in (-1, 256, sys.maxsize + 1):
+ self.assertRaisesRegex(
+ ValueError, r'byte must be in range\(0, 256\)',
+ b.find, index)
def test_rfind(self):
b = self.type2test(b'mississippi')
+ i = 105
+ w = 119
+
self.assertEqual(b.rfind(b'ss'), 5)
- self.assertEqual(b.rfind(b'ss', 3), 5)
- self.assertEqual(b.rfind(b'ss', 0, 6), 2)
self.assertEqual(b.rfind(b'w'), -1)
self.assertEqual(b.rfind(b'mississippian'), -1)
+ self.assertEqual(b.rfind(i), 10)
+ self.assertEqual(b.rfind(w), -1)
+
+ self.assertEqual(b.rfind(b'ss', 3), 5)
+ self.assertEqual(b.rfind(b'ss', 0, 6), 2)
+
+ self.assertEqual(b.rfind(i, 1, 3), 1)
+ self.assertEqual(b.rfind(i, 3, 9), 7)
+ self.assertEqual(b.rfind(w, 1, 3), -1)
+
def test_index(self):
- b = self.type2test(b'world')
- self.assertEqual(b.index(b'w'), 0)
- self.assertEqual(b.index(b'orl'), 1)
- self.assertRaises(ValueError, b.index, b'worm')
- self.assertRaises(ValueError, b.index, b'ldo')
+ b = self.type2test(b'mississippi')
+ i = 105
+ w = 119
+
+ self.assertEqual(b.index(b'ss'), 2)
+ self.assertRaises(ValueError, b.index, b'w')
+ self.assertRaises(ValueError, b.index, b'mississippian')
+
+ self.assertEqual(b.index(i), 1)
+ self.assertRaises(ValueError, b.index, w)
+
+ self.assertEqual(b.index(b'ss', 3), 5)
+ self.assertEqual(b.index(b'ss', 1, 7), 2)
+ self.assertRaises(ValueError, b.index, b'ss', 1, 3)
+
+ self.assertEqual(b.index(i, 6), 7)
+ self.assertEqual(b.index(i, 1, 3), 1)
+ self.assertRaises(ValueError, b.index, w, 1, 3)
def test_rindex(self):
- # XXX could be more rigorous
- b = self.type2test(b'world')
- self.assertEqual(b.rindex(b'w'), 0)
- self.assertEqual(b.rindex(b'orl'), 1)
- self.assertRaises(ValueError, b.rindex, b'worm')
- self.assertRaises(ValueError, b.rindex, b'ldo')
+ b = self.type2test(b'mississippi')
+ i = 105
+ w = 119
+
+ self.assertEqual(b.rindex(b'ss'), 5)
+ self.assertRaises(ValueError, b.rindex, b'w')
+ self.assertRaises(ValueError, b.rindex, b'mississippian')
+
+ self.assertEqual(b.rindex(i), 10)
+ self.assertRaises(ValueError, b.rindex, w)
+
+ self.assertEqual(b.rindex(b'ss', 3), 5)
+ self.assertEqual(b.rindex(b'ss', 0, 6), 2)
+
+ self.assertEqual(b.rindex(i, 1, 3), 1)
+ self.assertEqual(b.rindex(i, 3, 9), 7)
+ self.assertRaises(ValueError, b.rindex, w, 1, 3)
def test_replace(self):
b = self.type2test(b'mississippi')
@@ -365,6 +435,14 @@ class BaseBytesTest(unittest.TestCase):
self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
self.assertEqual(b.split(b'w'), [b])
+ # with keyword args
+ b = self.type2test(b'a|b|c|d')
+ self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
+ self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
+ self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
+ self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
+ b = self.type2test(b'a b c d')
+ self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
def test_split_whitespace(self):
for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
@@ -393,6 +471,14 @@ class BaseBytesTest(unittest.TestCase):
self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
self.assertEqual(b.rsplit(b'w'), [b])
+ # with keyword args
+ b = self.type2test(b'a|b|c|d')
+ self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
+ self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
+ self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
+ self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
+ b = self.type2test(b'a b c d')
+ self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
def test_rsplit_whitespace(self):
for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
@@ -432,6 +518,24 @@ class BaseBytesTest(unittest.TestCase):
q = pickle.loads(ps)
self.assertEqual(b, q)
+ def test_iterator_pickling(self):
+ for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
+ it = itorg = iter(self.type2test(b))
+ data = list(self.type2test(b))
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(list(it), data)
+
+ it = pickle.loads(d)
+ try:
+ next(it)
+ except StopIteration:
+ continue
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), data[1:])
+
def test_strip(self):
b = self.type2test(b'mississippi')
self.assertEqual(b.strip(b'i'), b'mississipp')
@@ -473,6 +577,27 @@ class BaseBytesTest(unittest.TestCase):
self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
+ def test_center(self):
+ # Fill character can be either bytes or bytearray (issue 12380)
+ b = self.type2test(b'abc')
+ for fill_type in (bytes, bytearray):
+ self.assertEqual(b.center(7, fill_type(b'-')),
+ self.type2test(b'--abc--'))
+
+ def test_ljust(self):
+ # Fill character can be either bytes or bytearray (issue 12380)
+ b = self.type2test(b'abc')
+ for fill_type in (bytes, bytearray):
+ self.assertEqual(b.ljust(7, fill_type(b'-')),
+ self.type2test(b'abc----'))
+
+ def test_rjust(self):
+ # Fill character can be either bytes or bytearray (issue 12380)
+ b = self.type2test(b'abc')
+ for fill_type in (bytes, bytearray):
+ self.assertEqual(b.rjust(7, fill_type(b'-')),
+ self.type2test(b'----abc'))
+
def test_ord(self):
b = self.type2test(b'\0A\x7f\x80\xff')
self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
@@ -529,6 +654,14 @@ class BaseBytesTest(unittest.TestCase):
self.assertEqual(True, b.startswith(h, None, -2))
self.assertEqual(False, b.startswith(x, None, None))
+ def test_integer_arguments_out_of_byte_range(self):
+ b = self.type2test(b'hello')
+
+ for method in (b.count, b.find, b.index, b.rfind, b.rindex):
+ self.assertRaises(ValueError, method, -1)
+ self.assertRaises(ValueError, method, 256)
+ self.assertRaises(ValueError, method, 9999)
+
def test_find_etc_raise_correct_error_messages(self):
# issue 11828
b = self.type2test(b'hello')
@@ -634,6 +767,39 @@ class ByteArrayTest(BaseBytesTest):
b.reverse()
self.assertFalse(b)
+ def test_clear(self):
+ b = bytearray(b'python')
+ b.clear()
+ self.assertEqual(b, b'')
+
+ b = bytearray(b'')
+ b.clear()
+ self.assertEqual(b, b'')
+
+ b = bytearray(b'')
+ b.append(ord('r'))
+ b.clear()
+ b.append(ord('p'))
+ self.assertEqual(b, b'p')
+
+ def test_copy(self):
+ b = bytearray(b'abc')
+ bb = b.copy()
+ self.assertEqual(bb, b'abc')
+
+ b = bytearray(b'')
+ bb = b.copy()
+ self.assertEqual(bb, b'')
+
+ # test that it's indeed a copy and not a reference
+ b = bytearray(b'abc')
+ bb = b.copy()
+ self.assertEqual(b, bb)
+ self.assertIsNot(b, bb)
+ bb.append(ord('d'))
+ self.assertEqual(bb, b'abcd')
+ self.assertEqual(b, b'abc')
+
def test_regexps(self):
def by(s):
return bytearray(map(ord, s))
@@ -1123,9 +1289,11 @@ class FixedStringTest(test.string_tests.BaseTest):
class ByteArrayAsStringTest(FixedStringTest):
type2test = bytearray
+ contains_bytes = True
class BytesAsStringTest(FixedStringTest):
type2test = bytes
+ contains_bytes = True
class SubclassTest(unittest.TestCase):
diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py
index 5b48e2b..f4e81db 100644
--- a/Lib/test/test_bz2.py
+++ b/Lib/test/test_bz2.py
@@ -1,10 +1,11 @@
#!/usr/bin/env python3
from test import support
-from test.support import TESTFN, _4G, bigmemtest, findfile
+from test.support import TESTFN, bigmemtest, _4G
import unittest
from io import BytesIO
import os
+import random
import subprocess
import sys
@@ -21,12 +22,38 @@ has_cmdline_bunzip2 = sys.platform not in ("win32", "os2emx")
class BaseTest(unittest.TestCase):
"Base for other testcases."
- TEXT = b'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:\ndaemon:x:2:2:daemon:/sbin:\nadm:x:3:4:adm:/var/adm:\nlp:x:4:7:lp:/var/spool/lpd:\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:\nnews:x:9:13:news:/var/spool/news:\nuucp:x:10:14:uucp:/var/spool/uucp:\noperator:x:11:0:operator:/root:\ngames:x:12:100:games:/usr/games:\ngopher:x:13:30:gopher:/usr/lib/gopher-data:\nftp:x:14:50:FTP User:/var/ftp:/bin/bash\nnobody:x:65534:65534:Nobody:/home:\npostfix:x:100:101:postfix:/var/spool/postfix:\nniemeyer:x:500:500::/home/niemeyer:/bin/bash\npostgres:x:101:102:PostgreSQL Server:/var/lib/pgsql:/bin/bash\nmysql:x:102:103:MySQL server:/var/lib/mysql:/bin/bash\nwww:x:103:104::/var/www:/bin/false\n'
+ TEXT_LINES = [
+ b'root:x:0:0:root:/root:/bin/bash\n',
+ b'bin:x:1:1:bin:/bin:\n',
+ b'daemon:x:2:2:daemon:/sbin:\n',
+ b'adm:x:3:4:adm:/var/adm:\n',
+ b'lp:x:4:7:lp:/var/spool/lpd:\n',
+ b'sync:x:5:0:sync:/sbin:/bin/sync\n',
+ b'shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\n',
+ b'halt:x:7:0:halt:/sbin:/sbin/halt\n',
+ b'mail:x:8:12:mail:/var/spool/mail:\n',
+ b'news:x:9:13:news:/var/spool/news:\n',
+ b'uucp:x:10:14:uucp:/var/spool/uucp:\n',
+ b'operator:x:11:0:operator:/root:\n',
+ b'games:x:12:100:games:/usr/games:\n',
+ b'gopher:x:13:30:gopher:/usr/lib/gopher-data:\n',
+ b'ftp:x:14:50:FTP User:/var/ftp:/bin/bash\n',
+ b'nobody:x:65534:65534:Nobody:/home:\n',
+ b'postfix:x:100:101:postfix:/var/spool/postfix:\n',
+ b'niemeyer:x:500:500::/home/niemeyer:/bin/bash\n',
+ b'postgres:x:101:102:PostgreSQL Server:/var/lib/pgsql:/bin/bash\n',
+ b'mysql:x:102:103:MySQL server:/var/lib/mysql:/bin/bash\n',
+ b'www:x:103:104::/var/www:/bin/false\n',
+ ]
+ TEXT = b''.join(TEXT_LINES)
DATA = b'BZh91AY&SY.\xc8N\x18\x00\x01>_\x80\x00\x10@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe00\x01\x99\xaa\x00\xc0\x03F\x86\x8c#&\x83F\x9a\x03\x06\xa6\xd0\xa6\x93M\x0fQ\xa7\xa8\x06\x804hh\x12$\x11\xa4i4\xf14S\xd2<Q\xb5\x0fH\xd3\xd4\xdd\xd5\x87\xbb\xf8\x94\r\x8f\xafI\x12\xe1\xc9\xf8/E\x00pu\x89\x12]\xc9\xbbDL\nQ\x0e\t1\x12\xdf\xa0\xc0\x97\xac2O9\x89\x13\x94\x0e\x1c7\x0ed\x95I\x0c\xaaJ\xa4\x18L\x10\x05#\x9c\xaf\xba\xbc/\x97\x8a#C\xc8\xe1\x8cW\xf9\xe2\xd0\xd6M\xa7\x8bXa<e\x84t\xcbL\xb3\xa7\xd9\xcd\xd1\xcb\x84.\xaf\xb3\xab\xab\xad`n}\xa0lh\tE,\x8eZ\x15\x17VH>\x88\xe5\xcd9gd6\x0b\n\xe9\x9b\xd5\x8a\x99\xf7\x08.K\x8ev\xfb\xf7xw\xbb\xdf\xa1\x92\xf1\xdd|/";\xa2\xba\x9f\xd5\xb1#A\xb6\xf6\xb3o\xc9\xc5y\\\xebO\xe7\x85\x9a\xbc\xb6f8\x952\xd5\xd7"%\x89>V,\xf7\xa6z\xe2\x9f\xa3\xdf\x11\x11"\xd6E)I\xa9\x13^\xca\xf3r\xd0\x03U\x922\xf26\xec\xb6\xed\x8b\xc3U\x13\x9d\xc5\x170\xa4\xfa^\x92\xacDF\x8a\x97\xd6\x19\xfe\xdd\xb8\xbd\x1a\x9a\x19\xa3\x80ankR\x8b\xe5\xd83]\xa9\xc6\x08\x82f\xf6\xb9"6l$\xb8j@\xc0\x8a\xb0l1..\xbak\x83ls\x15\xbc\xf4\xc1\x13\xbe\xf8E\xb8\x9d\r\xa8\x9dk\x84\xd3n\xfa\xacQ\x07\xb1%y\xaav\xb4\x08\xe0z\x1b\x16\xf5\x04\xe9\xcc\xb9\x08z\x1en7.G\xfc]\xc9\x14\xe1B@\xbb!8`'
- DATA_CRLF = b'BZh91AY&SY\xaez\xbbN\x00\x01H\xdf\x80\x00\x12@\x02\xff\xf0\x01\x07n\x00?\xe7\xff\xe0@\x01\xbc\xc6`\x86*\x8d=M\xa9\x9a\x86\xd0L@\x0fI\xa6!\xa1\x13\xc8\x88jdi\x8d@\x03@\x1a\x1a\x0c\x0c\x83 \x00\xc4h2\x19\x01\x82D\x84e\t\xe8\x99\x89\x19\x1ah\x00\r\x1a\x11\xaf\x9b\x0fG\xf5(\x1b\x1f?\t\x12\xcf\xb5\xfc\x95E\x00ps\x89\x12^\xa4\xdd\xa2&\x05(\x87\x04\x98\x89u\xe40%\xb6\x19\'\x8c\xc4\x89\xca\x07\x0e\x1b!\x91UIFU%C\x994!DI\xd2\xfa\xf0\xf1N8W\xde\x13A\xf5\x9cr%?\x9f3;I45A\xd1\x8bT\xb1<l\xba\xcb_\xc00xY\x17r\x17\x88\x08\x08@\xa0\ry@\x10\x04$)`\xf2\xce\x89z\xb0s\xec\x9b.iW\x9d\x81\xb5-+t\x9f\x1a\'\x97dB\xf5x\xb5\xbe.[.\xd7\x0e\x81\xe7\x08\x1cN`\x88\x10\xca\x87\xc3!"\x80\x92R\xa1/\xd1\xc0\xe6mf\xac\xbd\x99\xcca\xb3\x8780>\xa4\xc7\x8d\x1a\\"\xad\xa1\xabyBg\x15\xb9l\x88\x88\x91k"\x94\xa4\xd4\x89\xae*\xa6\x0b\x10\x0c\xd6\xd4m\xe86\xec\xb5j\x8a\x86j\';\xca.\x01I\xf2\xaaJ\xe8\x88\x8cU+t3\xfb\x0c\n\xa33\x13r2\r\x16\xe0\xb3(\xbf\x1d\x83r\xe7M\xf0D\x1365\xd8\x88\xd3\xa4\x92\xcb2\x06\x04\\\xc1\xb0\xea//\xbek&\xd8\xe6+t\xe5\xa1\x13\xada\x16\xder5"w]\xa2i\xb7[\x97R \xe2IT\xcd;Z\x04dk4\xad\x8a\t\xd3\x81z\x10\xf1:^`\xab\x1f\xc5\xdc\x91N\x14$+\x9e\xae\xd3\x80'
- with open(findfile("testbz2_bigmem.bz2"), "rb") as f:
- DATA_BIGMEM = f.read()
+ def setUp(self):
+ self.filename = TESTFN
+
+ def tearDown(self):
+ if os.path.isfile(self.filename):
+ os.unlink(self.filename)
if has_cmdline_bunzip2:
def decompress(self, data):
@@ -47,94 +74,152 @@ class BaseTest(unittest.TestCase):
def decompress(self, data):
return bz2.decompress(data)
-
class BZ2FileTest(BaseTest):
"Test BZ2File type miscellaneous methods."
- def setUp(self):
- self.filename = TESTFN
-
- def tearDown(self):
- if os.path.isfile(self.filename):
- os.unlink(self.filename)
-
- def createTempFile(self, crlf=0):
+ def createTempFile(self, streams=1):
with open(self.filename, "wb") as f:
- if crlf:
- data = self.DATA_CRLF
- else:
- data = self.DATA
- f.write(data)
+ f.write(self.DATA * streams)
+
+ def testBadArgs(self):
+ with self.assertRaises(TypeError):
+ BZ2File(123.456)
+ with self.assertRaises(ValueError):
+ BZ2File("/dev/null", "z")
+ with self.assertRaises(ValueError):
+ BZ2File("/dev/null", "rx")
+ with self.assertRaises(ValueError):
+ BZ2File("/dev/null", "rbt")
+ with self.assertRaises(ValueError):
+ BZ2File("/dev/null", compresslevel=0)
+ with self.assertRaises(ValueError):
+ BZ2File("/dev/null", compresslevel=10)
def testRead(self):
- # "Test BZ2File.read()"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertRaises(TypeError, bz2f.read, None)
self.assertEqual(bz2f.read(), self.TEXT)
+ def testReadMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ self.assertRaises(TypeError, bz2f.read, None)
+ self.assertEqual(bz2f.read(), self.TEXT * 5)
+
+ def testReadMonkeyMultiStream(self):
+ # Test BZ2File.read() on a multi-stream archive where a stream
+ # boundary coincides with the end of the raw read buffer.
+ buffer_size = bz2._BUFFER_SIZE
+ bz2._BUFFER_SIZE = len(self.DATA)
+ try:
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ self.assertRaises(TypeError, bz2f.read, None)
+ self.assertEqual(bz2f.read(), self.TEXT * 5)
+ finally:
+ bz2._BUFFER_SIZE = buffer_size
+
def testRead0(self):
- # Test BBZ2File.read(0)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertRaises(TypeError, bz2f.read, None)
self.assertEqual(bz2f.read(0), b"")
def testReadChunk10(self):
- # "Test BZ2File.read() in chunks of 10 bytes"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
text = b''
- while 1:
+ while True:
str = bz2f.read(10)
if not str:
break
text += str
self.assertEqual(text, self.TEXT)
+ def testReadChunk10MultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ text = b''
+ while True:
+ str = bz2f.read(10)
+ if not str:
+ break
+ text += str
+ self.assertEqual(text, self.TEXT * 5)
+
def testRead100(self):
- # "Test BZ2File.read(100)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertEqual(bz2f.read(100), self.TEXT[:100])
+ def testPeek(self):
+ self.createTempFile()
+ with BZ2File(self.filename) as bz2f:
+ pdata = bz2f.peek()
+ self.assertNotEqual(len(pdata), 0)
+ self.assertTrue(self.TEXT.startswith(pdata))
+ self.assertEqual(bz2f.read(), self.TEXT)
+
+ def testReadInto(self):
+ self.createTempFile()
+ with BZ2File(self.filename) as bz2f:
+ n = 128
+ b = bytearray(n)
+ self.assertEqual(bz2f.readinto(b), n)
+ self.assertEqual(b, self.TEXT[:n])
+ n = len(self.TEXT) - n
+ b = bytearray(len(self.TEXT))
+ self.assertEqual(bz2f.readinto(b), n)
+ self.assertEqual(b[:n], self.TEXT[-n:])
+
def testReadLine(self):
- # "Test BZ2File.readline()"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertRaises(TypeError, bz2f.readline, None)
- sio = BytesIO(self.TEXT)
- for line in sio.readlines():
+ for line in self.TEXT_LINES:
+ self.assertEqual(bz2f.readline(), line)
+
+ def testReadLineMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ self.assertRaises(TypeError, bz2f.readline, None)
+ for line in self.TEXT_LINES * 5:
self.assertEqual(bz2f.readline(), line)
def testReadLines(self):
- # "Test BZ2File.readlines()"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertRaises(TypeError, bz2f.readlines, None)
- sio = BytesIO(self.TEXT)
- self.assertEqual(bz2f.readlines(), sio.readlines())
+ self.assertEqual(bz2f.readlines(), self.TEXT_LINES)
+
+ def testReadLinesMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ self.assertRaises(TypeError, bz2f.readlines, None)
+ self.assertEqual(bz2f.readlines(), self.TEXT_LINES * 5)
def testIterator(self):
- # "Test iter(BZ2File)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
- sio = BytesIO(self.TEXT)
- self.assertEqual(list(iter(bz2f)), sio.readlines())
+ self.assertEqual(list(iter(bz2f)), self.TEXT_LINES)
+
+ def testIteratorMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ self.assertEqual(list(iter(bz2f)), self.TEXT_LINES * 5)
def testClosedIteratorDeadlock(self):
- # "Test that iteration on a closed bz2file releases the lock."
- # http://bugs.python.org/issue3309
+ # Issue #3309: Iteration on a closed BZ2File should release the lock.
self.createTempFile()
bz2f = BZ2File(self.filename)
bz2f.close()
self.assertRaises(ValueError, bz2f.__next__)
- # This call will deadlock of the above .__next__ call failed to
+ # This call will deadlock if the above .__next__ call failed to
# release the lock.
self.assertRaises(ValueError, bz2f.readlines)
def testWrite(self):
- # "Test BZ2File.write()"
with BZ2File(self.filename, "w") as bz2f:
self.assertRaises(TypeError, bz2f.write)
bz2f.write(self.TEXT)
@@ -142,10 +227,9 @@ class BZ2FileTest(BaseTest):
self.assertEqual(self.decompress(f.read()), self.TEXT)
def testWriteChunks10(self):
- # "Test BZ2File.write() with chunks of 10 bytes"
with BZ2File(self.filename, "w") as bz2f:
n = 0
- while 1:
+ while True:
str = self.TEXT[n*10:(n+1)*10]
if not str:
break
@@ -154,13 +238,19 @@ class BZ2FileTest(BaseTest):
with open(self.filename, 'rb') as f:
self.assertEqual(self.decompress(f.read()), self.TEXT)
+ def testWriteNonDefaultCompressLevel(self):
+ expected = bz2.compress(self.TEXT, compresslevel=5)
+ with BZ2File(self.filename, "w", compresslevel=5) as bz2f:
+ bz2f.write(self.TEXT)
+ with open(self.filename, "rb") as f:
+ self.assertEqual(f.read(), expected)
+
def testWriteLines(self):
- # "Test BZ2File.writelines()"
with BZ2File(self.filename, "w") as bz2f:
self.assertRaises(TypeError, bz2f.writelines)
- sio = BytesIO(self.TEXT)
- bz2f.writelines(sio.readlines())
- # patch #1535500
+ bz2f.writelines(self.TEXT_LINES)
+ # Issue #1535500: Calling writelines() on a closed BZ2File
+ # should raise an exception.
self.assertRaises(ValueError, bz2f.writelines, ["a"])
with open(self.filename, 'rb') as f:
self.assertEqual(self.decompress(f.read()), self.TEXT)
@@ -173,39 +263,73 @@ class BZ2FileTest(BaseTest):
self.assertRaises(IOError, bz2f.write, b"a")
self.assertRaises(IOError, bz2f.writelines, [b"a"])
+ def testAppend(self):
+ with BZ2File(self.filename, "w") as bz2f:
+ self.assertRaises(TypeError, bz2f.write)
+ bz2f.write(self.TEXT)
+ with BZ2File(self.filename, "a") as bz2f:
+ self.assertRaises(TypeError, bz2f.write)
+ bz2f.write(self.TEXT)
+ with open(self.filename, 'rb') as f:
+ self.assertEqual(self.decompress(f.read()), self.TEXT * 2)
+
def testSeekForward(self):
- # "Test BZ2File.seek(150, 0)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
self.assertRaises(TypeError, bz2f.seek)
bz2f.seek(150)
self.assertEqual(bz2f.read(), self.TEXT[150:])
+ def testSeekForwardAcrossStreams(self):
+ self.createTempFile(streams=2)
+ with BZ2File(self.filename) as bz2f:
+ self.assertRaises(TypeError, bz2f.seek)
+ bz2f.seek(len(self.TEXT) + 150)
+ self.assertEqual(bz2f.read(), self.TEXT[150:])
+
def testSeekBackwards(self):
- # "Test BZ2File.seek(-150, 1)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
bz2f.read(500)
bz2f.seek(-150, 1)
self.assertEqual(bz2f.read(), self.TEXT[500-150:])
+ def testSeekBackwardsAcrossStreams(self):
+ self.createTempFile(streams=2)
+ with BZ2File(self.filename) as bz2f:
+ readto = len(self.TEXT) + 100
+ while readto > 0:
+ readto -= len(bz2f.read(readto))
+ bz2f.seek(-150, 1)
+ self.assertEqual(bz2f.read(), self.TEXT[100-150:] + self.TEXT)
+
def testSeekBackwardsFromEnd(self):
- # "Test BZ2File.seek(-150, 2)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
bz2f.seek(-150, 2)
self.assertEqual(bz2f.read(), self.TEXT[len(self.TEXT)-150:])
+ def testSeekBackwardsFromEndAcrossStreams(self):
+ self.createTempFile(streams=2)
+ with BZ2File(self.filename) as bz2f:
+ bz2f.seek(-1000, 2)
+ self.assertEqual(bz2f.read(), (self.TEXT * 2)[-1000:])
+
def testSeekPostEnd(self):
- # "Test BZ2File.seek(150000)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
bz2f.seek(150000)
self.assertEqual(bz2f.tell(), len(self.TEXT))
self.assertEqual(bz2f.read(), b"")
+ def testSeekPostEndMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ bz2f.seek(150000)
+ self.assertEqual(bz2f.tell(), len(self.TEXT) * 5)
+ self.assertEqual(bz2f.read(), b"")
+
def testSeekPostEndTwice(self):
- # "Test BZ2File.seek(150000) twice"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
bz2f.seek(150000)
@@ -213,27 +337,109 @@ class BZ2FileTest(BaseTest):
self.assertEqual(bz2f.tell(), len(self.TEXT))
self.assertEqual(bz2f.read(), b"")
+ def testSeekPostEndTwiceMultiStream(self):
+ self.createTempFile(streams=5)
+ with BZ2File(self.filename) as bz2f:
+ bz2f.seek(150000)
+ bz2f.seek(150000)
+ self.assertEqual(bz2f.tell(), len(self.TEXT) * 5)
+ self.assertEqual(bz2f.read(), b"")
+
def testSeekPreStart(self):
- # "Test BZ2File.seek(-150, 0)"
self.createTempFile()
with BZ2File(self.filename) as bz2f:
bz2f.seek(-150)
self.assertEqual(bz2f.tell(), 0)
self.assertEqual(bz2f.read(), self.TEXT)
+ def testSeekPreStartMultiStream(self):
+ self.createTempFile(streams=2)
+ with BZ2File(self.filename) as bz2f:
+ bz2f.seek(-150)
+ self.assertEqual(bz2f.tell(), 0)
+ self.assertEqual(bz2f.read(), self.TEXT * 2)
+
+ def testFileno(self):
+ self.createTempFile()
+ with open(self.filename, 'rb') as rawf:
+ bz2f = BZ2File(rawf)
+ try:
+ self.assertEqual(bz2f.fileno(), rawf.fileno())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.fileno)
+
+ def testSeekable(self):
+ bz2f = BZ2File(BytesIO(self.DATA))
+ try:
+ self.assertTrue(bz2f.seekable())
+ bz2f.read()
+ self.assertTrue(bz2f.seekable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.seekable)
+
+ bz2f = BZ2File(BytesIO(), mode="w")
+ try:
+ self.assertFalse(bz2f.seekable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.seekable)
+
+ src = BytesIO(self.DATA)
+ src.seekable = lambda: False
+ bz2f = BZ2File(src)
+ try:
+ self.assertFalse(bz2f.seekable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.seekable)
+
+ def testReadable(self):
+ bz2f = BZ2File(BytesIO(self.DATA))
+ try:
+ self.assertTrue(bz2f.readable())
+ bz2f.read()
+ self.assertTrue(bz2f.readable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.readable)
+
+ bz2f = BZ2File(BytesIO(), mode="w")
+ try:
+ self.assertFalse(bz2f.readable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.readable)
+
+ def testWritable(self):
+ bz2f = BZ2File(BytesIO(self.DATA))
+ try:
+ self.assertFalse(bz2f.writable())
+ bz2f.read()
+ self.assertFalse(bz2f.writable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.writable)
+
+ bz2f = BZ2File(BytesIO(), mode="w")
+ try:
+ self.assertTrue(bz2f.writable())
+ finally:
+ bz2f.close()
+ self.assertRaises(ValueError, bz2f.writable)
+
def testOpenDel(self):
- # "Test opening and deleting a file many times"
self.createTempFile()
for i in range(10000):
o = BZ2File(self.filename)
del o
def testOpenNonexistent(self):
- # "Test opening a nonexistent file"
self.assertRaises(IOError, BZ2File, "/non/existent")
- def testBug1191043(self):
- # readlines() for files containing no newline
+ def testReadlinesNoNewline(self):
+ # Issue #1191043: readlines() fails on a file containing no newline.
data = b'BZh91AY&SY\xd9b\x89]\x00\x00\x00\x03\x80\x04\x00\x02\x00\x0c\x00 \x00!\x9ah3M\x13<]\xc9\x14\xe1BCe\x8a%t'
with open(self.filename, "wb") as f:
f.write(data)
@@ -245,7 +451,6 @@ class BZ2FileTest(BaseTest):
self.assertEqual(xlines, [b'Test'])
def testContextProtocol(self):
- # BZ2File supports the context management protocol
f = None
with BZ2File(self.filename, "wb") as f:
f.write(b"xxx")
@@ -268,7 +473,7 @@ class BZ2FileTest(BaseTest):
@unittest.skipUnless(threading, 'Threading required for this test.')
def testThreading(self):
- # Using a BZ2File from several threads doesn't deadlock (issue #7205).
+ # Issue #7205: Using a BZ2File from several threads shouldn't deadlock.
data = b"1" * 2**20
nthreads = 10
with bz2.BZ2File(self.filename, 'wb') as f:
@@ -281,22 +486,98 @@ class BZ2FileTest(BaseTest):
for t in threads:
t.join()
- def testMixedIterationReads(self):
- # Issue #8397: mixed iteration and reads should be forbidden.
- with bz2.BZ2File(self.filename, 'wb') as f:
- # The internal buffer size is hard-wired to 8192 bytes, we must
- # write out more than that for the test to stop half through
- # the buffer.
- f.write(self.TEXT * 100)
- with bz2.BZ2File(self.filename, 'rb') as f:
- next(f)
- self.assertRaises(ValueError, f.read)
- self.assertRaises(ValueError, f.readline)
- self.assertRaises(ValueError, f.readlines)
+ def testWithoutThreading(self):
+ bz2 = support.import_fresh_module("bz2", blocked=("threading",))
+ with bz2.BZ2File(self.filename, "wb") as f:
+ f.write(b"abc")
+ with bz2.BZ2File(self.filename, "rb") as f:
+ self.assertEqual(f.read(), b"abc")
+
+ def testMixedIterationAndReads(self):
+ self.createTempFile()
+ linelen = len(self.TEXT_LINES[0])
+ halflen = linelen // 2
+ with bz2.BZ2File(self.filename) as bz2f:
+ bz2f.read(halflen)
+ self.assertEqual(next(bz2f), self.TEXT_LINES[0][halflen:])
+ self.assertEqual(bz2f.read(), self.TEXT[linelen:])
+ with bz2.BZ2File(self.filename) as bz2f:
+ bz2f.readline()
+ self.assertEqual(next(bz2f), self.TEXT_LINES[1])
+ self.assertEqual(bz2f.readline(), self.TEXT_LINES[2])
+ with bz2.BZ2File(self.filename) as bz2f:
+ bz2f.readlines()
+ with self.assertRaises(StopIteration):
+ next(bz2f)
+ self.assertEqual(bz2f.readlines(), [])
+
+ def testMultiStreamOrdering(self):
+ # Test the ordering of streams when reading a multi-stream archive.
+ data1 = b"foo" * 1000
+ data2 = b"bar" * 1000
+ with BZ2File(self.filename, "w") as bz2f:
+ bz2f.write(data1)
+ with BZ2File(self.filename, "a") as bz2f:
+ bz2f.write(data2)
+ with BZ2File(self.filename) as bz2f:
+ self.assertEqual(bz2f.read(), data1 + data2)
+
+ def testOpenBytesFilename(self):
+ str_filename = self.filename
+ try:
+ bytes_filename = str_filename.encode("ascii")
+ except UnicodeEncodeError:
+ self.skipTest("Temporary file name needs to be ASCII")
+ with BZ2File(bytes_filename, "wb") as f:
+ f.write(self.DATA)
+ with BZ2File(bytes_filename, "rb") as f:
+ self.assertEqual(f.read(), self.DATA)
+ # Sanity check that we are actually operating on the right file.
+ with BZ2File(str_filename, "rb") as f:
+ self.assertEqual(f.read(), self.DATA)
+
+
+ # Tests for a BZ2File wrapping another file object:
+
+ def testReadBytesIO(self):
+ with BytesIO(self.DATA) as bio:
+ with BZ2File(bio) as bz2f:
+ self.assertRaises(TypeError, bz2f.read, None)
+ self.assertEqual(bz2f.read(), self.TEXT)
+ self.assertFalse(bio.closed)
+
+ def testPeekBytesIO(self):
+ with BytesIO(self.DATA) as bio:
+ with BZ2File(bio) as bz2f:
+ pdata = bz2f.peek()
+ self.assertNotEqual(len(pdata), 0)
+ self.assertTrue(self.TEXT.startswith(pdata))
+ self.assertEqual(bz2f.read(), self.TEXT)
+
+ def testWriteBytesIO(self):
+ with BytesIO() as bio:
+ with BZ2File(bio, "w") as bz2f:
+ self.assertRaises(TypeError, bz2f.write)
+ bz2f.write(self.TEXT)
+ self.assertEqual(self.decompress(bio.getvalue()), self.TEXT)
+ self.assertFalse(bio.closed)
+
+ def testSeekForwardBytesIO(self):
+ with BytesIO(self.DATA) as bio:
+ with BZ2File(bio) as bz2f:
+ self.assertRaises(TypeError, bz2f.seek)
+ bz2f.seek(150)
+ self.assertEqual(bz2f.read(), self.TEXT[150:])
+
+ def testSeekBackwardsBytesIO(self):
+ with BytesIO(self.DATA) as bio:
+ with BZ2File(bio) as bz2f:
+ bz2f.read(500)
+ bz2f.seek(-150, 1)
+ self.assertEqual(bz2f.read(), self.TEXT[500-150:])
class BZ2CompressorTest(BaseTest):
def testCompress(self):
- # "Test BZ2Compressor.compress()/flush()"
bz2c = BZ2Compressor()
self.assertRaises(TypeError, bz2c.compress)
data = bz2c.compress(self.TEXT)
@@ -304,11 +585,10 @@ class BZ2CompressorTest(BaseTest):
self.assertEqual(self.decompress(data), self.TEXT)
def testCompressChunks10(self):
- # "Test BZ2Compressor.compress()/flush() with chunks of 10 bytes"
bz2c = BZ2Compressor()
n = 0
data = b''
- while 1:
+ while True:
str = self.TEXT[n*10:(n+1)*10]
if not str:
break
@@ -317,34 +597,38 @@ class BZ2CompressorTest(BaseTest):
data += bz2c.flush()
self.assertEqual(self.decompress(data), self.TEXT)
- @bigmemtest(size=_4G, memuse=1.25)
- def testBigmem(self, size):
- text = b"a" * size
- bz2c = bz2.BZ2Compressor()
- data = bz2c.compress(text) + bz2c.flush()
- del text
- text = self.decompress(data)
- self.assertEqual(len(text), size)
- self.assertEqual(text.strip(b"a"), b"")
-
+ @bigmemtest(size=_4G + 100, memuse=2)
+ def testCompress4G(self, size):
+ # "Test BZ2Compressor.compress()/flush() with >4GiB input"
+ bz2c = BZ2Compressor()
+ data = b"x" * size
+ try:
+ compressed = bz2c.compress(data)
+ compressed += bz2c.flush()
+ finally:
+ data = None # Release memory
+ data = bz2.decompress(compressed)
+ try:
+ self.assertEqual(len(data), size)
+ self.assertEqual(len(data.strip(b"x")), 0)
+ finally:
+ data = None
class BZ2DecompressorTest(BaseTest):
def test_Constructor(self):
self.assertRaises(TypeError, BZ2Decompressor, 42)
def testDecompress(self):
- # "Test BZ2Decompressor.decompress()"
bz2d = BZ2Decompressor()
self.assertRaises(TypeError, bz2d.decompress)
text = bz2d.decompress(self.DATA)
self.assertEqual(text, self.TEXT)
def testDecompressChunks10(self):
- # "Test BZ2Decompressor.decompress() with chunks of 10 bytes"
bz2d = BZ2Decompressor()
text = b''
n = 0
- while 1:
+ while True:
str = self.DATA[n*10:(n+1)*10]
if not str:
break
@@ -353,7 +637,6 @@ class BZ2DecompressorTest(BaseTest):
self.assertEqual(text, self.TEXT)
def testDecompressUnusedData(self):
- # "Test BZ2Decompressor.decompress() with unused data"
bz2d = BZ2Decompressor()
unused_data = b"this is unused data"
text = bz2d.decompress(self.DATA+unused_data)
@@ -361,68 +644,153 @@ class BZ2DecompressorTest(BaseTest):
self.assertEqual(bz2d.unused_data, unused_data)
def testEOFError(self):
- # "Calling BZ2Decompressor.decompress() after EOS must raise EOFError"
bz2d = BZ2Decompressor()
text = bz2d.decompress(self.DATA)
self.assertRaises(EOFError, bz2d.decompress, b"anything")
self.assertRaises(EOFError, bz2d.decompress, b"")
- @bigmemtest(size=_4G, memuse=1.25, dry_run=False)
- def testBigmem(self, unused_size):
- # Issue #14398: decompression fails when output data is >=2GB.
- text = bz2.BZ2Decompressor().decompress(self.DATA_BIGMEM)
- self.assertEqual(len(text), _4G)
- self.assertEqual(text.strip(b"\0"), b"")
-
-
-class FuncTest(BaseTest):
- "Test module functions"
-
+ @bigmemtest(size=_4G + 100, memuse=3)
+ def testDecompress4G(self, size):
+ # "Test BZ2Decompressor.decompress() with >4GiB input"
+ blocksize = 10 * 1024 * 1024
+ block = random.getrandbits(blocksize * 8).to_bytes(blocksize, 'little')
+ try:
+ data = block * (size // blocksize + 1)
+ compressed = bz2.compress(data)
+ bz2d = BZ2Decompressor()
+ decompressed = bz2d.decompress(compressed)
+ self.assertTrue(decompressed == data)
+ finally:
+ data = None
+ compressed = None
+ decompressed = None
+
+
+class CompressDecompressTest(BaseTest):
def testCompress(self):
- # "Test compress() function"
data = bz2.compress(self.TEXT)
self.assertEqual(self.decompress(data), self.TEXT)
def testDecompress(self):
- # "Test decompress() function"
text = bz2.decompress(self.DATA)
self.assertEqual(text, self.TEXT)
def testDecompressEmpty(self):
- # "Test decompress() function with empty string"
text = bz2.decompress(b"")
self.assertEqual(text, b"")
def testDecompressIncomplete(self):
- # "Test decompress() function with incomplete data"
self.assertRaises(ValueError, bz2.decompress, self.DATA[:-10])
- @bigmemtest(size=_4G, memuse=1.25)
- def testCompressBigmem(self, size):
- text = b"a" * size
- data = bz2.compress(text)
- del text
- text = self.decompress(data)
- self.assertEqual(len(text), size)
- self.assertEqual(text.strip(b"a"), b"")
-
- @bigmemtest(size=_4G, memuse=1.25, dry_run=False)
- def testDecompressBigmem(self, unused_size):
- # Issue #14398: decompression fails when output data is >=2GB.
- text = bz2.decompress(self.DATA_BIGMEM)
- self.assertEqual(len(text), _4G)
- self.assertEqual(text.strip(b"\0"), b"")
+ def testDecompressMultiStream(self):
+ text = bz2.decompress(self.DATA * 5)
+ self.assertEqual(text, self.TEXT * 5)
+
+
+class OpenTest(BaseTest):
+ def test_binary_modes(self):
+ with bz2.open(self.filename, "wb") as f:
+ f.write(self.TEXT)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read())
+ self.assertEqual(file_data, self.TEXT)
+ with bz2.open(self.filename, "rb") as f:
+ self.assertEqual(f.read(), self.TEXT)
+ with bz2.open(self.filename, "ab") as f:
+ f.write(self.TEXT)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read())
+ self.assertEqual(file_data, self.TEXT * 2)
+
+ def test_implicit_binary_modes(self):
+ # Test implicit binary modes (no "b" or "t" in mode string).
+ with bz2.open(self.filename, "w") as f:
+ f.write(self.TEXT)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read())
+ self.assertEqual(file_data, self.TEXT)
+ with bz2.open(self.filename, "r") as f:
+ self.assertEqual(f.read(), self.TEXT)
+ with bz2.open(self.filename, "a") as f:
+ f.write(self.TEXT)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read())
+ self.assertEqual(file_data, self.TEXT * 2)
+
+ def test_text_modes(self):
+ text = self.TEXT.decode("ascii")
+ text_native_eol = text.replace("\n", os.linesep)
+ with bz2.open(self.filename, "wt") as f:
+ f.write(text)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read()).decode("ascii")
+ self.assertEqual(file_data, text_native_eol)
+ with bz2.open(self.filename, "rt") as f:
+ self.assertEqual(f.read(), text)
+ with bz2.open(self.filename, "at") as f:
+ f.write(text)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read()).decode("ascii")
+ self.assertEqual(file_data, text_native_eol * 2)
+
+ def test_fileobj(self):
+ with bz2.open(BytesIO(self.DATA), "r") as f:
+ self.assertEqual(f.read(), self.TEXT)
+ with bz2.open(BytesIO(self.DATA), "rb") as f:
+ self.assertEqual(f.read(), self.TEXT)
+ text = self.TEXT.decode("ascii")
+ with bz2.open(BytesIO(self.DATA), "rt") as f:
+ self.assertEqual(f.read(), text)
+
+ def test_bad_params(self):
+ # Test invalid parameter combinations.
+ with self.assertRaises(ValueError):
+ bz2.open(self.filename, "wbt")
+ with self.assertRaises(ValueError):
+ bz2.open(self.filename, "rb", encoding="utf-8")
+ with self.assertRaises(ValueError):
+ bz2.open(self.filename, "rb", errors="ignore")
+ with self.assertRaises(ValueError):
+ bz2.open(self.filename, "rb", newline="\n")
+
+ def test_encoding(self):
+ # Test non-default encoding.
+ text = self.TEXT.decode("ascii")
+ text_native_eol = text.replace("\n", os.linesep)
+ with bz2.open(self.filename, "wt", encoding="utf-16-le") as f:
+ f.write(text)
+ with open(self.filename, "rb") as f:
+ file_data = bz2.decompress(f.read()).decode("utf-16-le")
+ self.assertEqual(file_data, text_native_eol)
+ with bz2.open(self.filename, "rt", encoding="utf-16-le") as f:
+ self.assertEqual(f.read(), text)
+
+ def test_encoding_error_handler(self):
+ # Test with non-default encoding error handler.
+ with bz2.open(self.filename, "wb") as f:
+ f.write(b"foo\xffbar")
+ with bz2.open(self.filename, "rt", encoding="ascii", errors="ignore") \
+ as f:
+ self.assertEqual(f.read(), "foobar")
+
+ def test_newline(self):
+ # Test with explicit newline (universal newline mode disabled).
+ text = self.TEXT.decode("ascii")
+ with bz2.open(self.filename, "wt", newline="\n") as f:
+ f.write(text)
+ with bz2.open(self.filename, "rt", newline="\r") as f:
+ self.assertEqual(f.readlines(), [text])
+
def test_main():
support.run_unittest(
BZ2FileTest,
BZ2CompressorTest,
BZ2DecompressorTest,
- FuncTest
+ CompressDecompressTest,
+ OpenTest,
)
support.reap_children()
if __name__ == '__main__':
test_main()
-
-# vim:ts=4:sw=4
diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py
index 948a119..e594e01 100644
--- a/Lib/test/test_calendar.py
+++ b/Lib/test/test_calendar.py
@@ -5,8 +5,19 @@ from test import support
from test.script_helper import assert_python_ok
import time
import locale
+import sys
import datetime
+result_2004_01_text = """
+ January 2004
+Mo Tu We Th Fr Sa Su
+ 1 2 3 4
+ 5 6 7 8 9 10 11
+12 13 14 15 16 17 18
+19 20 21 22 23 24 25
+26 27 28 29 30 31
+"""
+
result_2004_text = """
2004
@@ -46,11 +57,11 @@ Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
"""
result_2004_html = """
-<?xml version="1.0" encoding="ascii"?>
+<?xml version="1.0" encoding="%(e)s"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ascii" />
+<meta http-equiv="Content-Type" content="text/html; charset=%(e)s" />
<link rel="stylesheet" type="text/css" href="calendar.css" />
<title>Calendar for 2004</title>
</head>
@@ -170,6 +181,135 @@ result_2004_html = """
</html>
"""
+result_2004_days = [
+ [[[0, 0, 0, 1, 2, 3, 4],
+ [5, 6, 7, 8, 9, 10, 11],
+ [12, 13, 14, 15, 16, 17, 18],
+ [19, 20, 21, 22, 23, 24, 25],
+ [26, 27, 28, 29, 30, 31, 0]],
+ [[0, 0, 0, 0, 0, 0, 1],
+ [2, 3, 4, 5, 6, 7, 8],
+ [9, 10, 11, 12, 13, 14, 15],
+ [16, 17, 18, 19, 20, 21, 22],
+ [23, 24, 25, 26, 27, 28, 29]],
+ [[1, 2, 3, 4, 5, 6, 7],
+ [8, 9, 10, 11, 12, 13, 14],
+ [15, 16, 17, 18, 19, 20, 21],
+ [22, 23, 24, 25, 26, 27, 28],
+ [29, 30, 31, 0, 0, 0, 0]]],
+ [[[0, 0, 0, 1, 2, 3, 4],
+ [5, 6, 7, 8, 9, 10, 11],
+ [12, 13, 14, 15, 16, 17, 18],
+ [19, 20, 21, 22, 23, 24, 25],
+ [26, 27, 28, 29, 30, 0, 0]],
+ [[0, 0, 0, 0, 0, 1, 2],
+ [3, 4, 5, 6, 7, 8, 9],
+ [10, 11, 12, 13, 14, 15, 16],
+ [17, 18, 19, 20, 21, 22, 23],
+ [24, 25, 26, 27, 28, 29, 30],
+ [31, 0, 0, 0, 0, 0, 0]],
+ [[0, 1, 2, 3, 4, 5, 6],
+ [7, 8, 9, 10, 11, 12, 13],
+ [14, 15, 16, 17, 18, 19, 20],
+ [21, 22, 23, 24, 25, 26, 27],
+ [28, 29, 30, 0, 0, 0, 0]]],
+ [[[0, 0, 0, 1, 2, 3, 4],
+ [5, 6, 7, 8, 9, 10, 11],
+ [12, 13, 14, 15, 16, 17, 18],
+ [19, 20, 21, 22, 23, 24, 25],
+ [26, 27, 28, 29, 30, 31, 0]],
+ [[0, 0, 0, 0, 0, 0, 1],
+ [2, 3, 4, 5, 6, 7, 8],
+ [9, 10, 11, 12, 13, 14, 15],
+ [16, 17, 18, 19, 20, 21, 22],
+ [23, 24, 25, 26, 27, 28, 29],
+ [30, 31, 0, 0, 0, 0, 0]],
+ [[0, 0, 1, 2, 3, 4, 5],
+ [6, 7, 8, 9, 10, 11, 12],
+ [13, 14, 15, 16, 17, 18, 19],
+ [20, 21, 22, 23, 24, 25, 26],
+ [27, 28, 29, 30, 0, 0, 0]]],
+ [[[0, 0, 0, 0, 1, 2, 3],
+ [4, 5, 6, 7, 8, 9, 10],
+ [11, 12, 13, 14, 15, 16, 17],
+ [18, 19, 20, 21, 22, 23, 24],
+ [25, 26, 27, 28, 29, 30, 31]],
+ [[1, 2, 3, 4, 5, 6, 7],
+ [8, 9, 10, 11, 12, 13, 14],
+ [15, 16, 17, 18, 19, 20, 21],
+ [22, 23, 24, 25, 26, 27, 28],
+ [29, 30, 0, 0, 0, 0, 0]],
+ [[0, 0, 1, 2, 3, 4, 5],
+ [6, 7, 8, 9, 10, 11, 12],
+ [13, 14, 15, 16, 17, 18, 19],
+ [20, 21, 22, 23, 24, 25, 26],
+ [27, 28, 29, 30, 31, 0, 0]]]
+]
+
+result_2004_dates = \
+ [[['12/29/03 12/30/03 12/31/03 01/01/04 01/02/04 01/03/04 01/04/04',
+ '01/05/04 01/06/04 01/07/04 01/08/04 01/09/04 01/10/04 01/11/04',
+ '01/12/04 01/13/04 01/14/04 01/15/04 01/16/04 01/17/04 01/18/04',
+ '01/19/04 01/20/04 01/21/04 01/22/04 01/23/04 01/24/04 01/25/04',
+ '01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04'],
+ ['01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04',
+ '02/02/04 02/03/04 02/04/04 02/05/04 02/06/04 02/07/04 02/08/04',
+ '02/09/04 02/10/04 02/11/04 02/12/04 02/13/04 02/14/04 02/15/04',
+ '02/16/04 02/17/04 02/18/04 02/19/04 02/20/04 02/21/04 02/22/04',
+ '02/23/04 02/24/04 02/25/04 02/26/04 02/27/04 02/28/04 02/29/04'],
+ ['03/01/04 03/02/04 03/03/04 03/04/04 03/05/04 03/06/04 03/07/04',
+ '03/08/04 03/09/04 03/10/04 03/11/04 03/12/04 03/13/04 03/14/04',
+ '03/15/04 03/16/04 03/17/04 03/18/04 03/19/04 03/20/04 03/21/04',
+ '03/22/04 03/23/04 03/24/04 03/25/04 03/26/04 03/27/04 03/28/04',
+ '03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04']],
+ [['03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04',
+ '04/05/04 04/06/04 04/07/04 04/08/04 04/09/04 04/10/04 04/11/04',
+ '04/12/04 04/13/04 04/14/04 04/15/04 04/16/04 04/17/04 04/18/04',
+ '04/19/04 04/20/04 04/21/04 04/22/04 04/23/04 04/24/04 04/25/04',
+ '04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04'],
+ ['04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04',
+ '05/03/04 05/04/04 05/05/04 05/06/04 05/07/04 05/08/04 05/09/04',
+ '05/10/04 05/11/04 05/12/04 05/13/04 05/14/04 05/15/04 05/16/04',
+ '05/17/04 05/18/04 05/19/04 05/20/04 05/21/04 05/22/04 05/23/04',
+ '05/24/04 05/25/04 05/26/04 05/27/04 05/28/04 05/29/04 05/30/04',
+ '05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04'],
+ ['05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04',
+ '06/07/04 06/08/04 06/09/04 06/10/04 06/11/04 06/12/04 06/13/04',
+ '06/14/04 06/15/04 06/16/04 06/17/04 06/18/04 06/19/04 06/20/04',
+ '06/21/04 06/22/04 06/23/04 06/24/04 06/25/04 06/26/04 06/27/04',
+ '06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04']],
+ [['06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04',
+ '07/05/04 07/06/04 07/07/04 07/08/04 07/09/04 07/10/04 07/11/04',
+ '07/12/04 07/13/04 07/14/04 07/15/04 07/16/04 07/17/04 07/18/04',
+ '07/19/04 07/20/04 07/21/04 07/22/04 07/23/04 07/24/04 07/25/04',
+ '07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04'],
+ ['07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04',
+ '08/02/04 08/03/04 08/04/04 08/05/04 08/06/04 08/07/04 08/08/04',
+ '08/09/04 08/10/04 08/11/04 08/12/04 08/13/04 08/14/04 08/15/04',
+ '08/16/04 08/17/04 08/18/04 08/19/04 08/20/04 08/21/04 08/22/04',
+ '08/23/04 08/24/04 08/25/04 08/26/04 08/27/04 08/28/04 08/29/04',
+ '08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04'],
+ ['08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04',
+ '09/06/04 09/07/04 09/08/04 09/09/04 09/10/04 09/11/04 09/12/04',
+ '09/13/04 09/14/04 09/15/04 09/16/04 09/17/04 09/18/04 09/19/04',
+ '09/20/04 09/21/04 09/22/04 09/23/04 09/24/04 09/25/04 09/26/04',
+ '09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04']],
+ [['09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04',
+ '10/04/04 10/05/04 10/06/04 10/07/04 10/08/04 10/09/04 10/10/04',
+ '10/11/04 10/12/04 10/13/04 10/14/04 10/15/04 10/16/04 10/17/04',
+ '10/18/04 10/19/04 10/20/04 10/21/04 10/22/04 10/23/04 10/24/04',
+ '10/25/04 10/26/04 10/27/04 10/28/04 10/29/04 10/30/04 10/31/04'],
+ ['11/01/04 11/02/04 11/03/04 11/04/04 11/05/04 11/06/04 11/07/04',
+ '11/08/04 11/09/04 11/10/04 11/11/04 11/12/04 11/13/04 11/14/04',
+ '11/15/04 11/16/04 11/17/04 11/18/04 11/19/04 11/20/04 11/21/04',
+ '11/22/04 11/23/04 11/24/04 11/25/04 11/26/04 11/27/04 11/28/04',
+ '11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04'],
+ ['11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04',
+ '12/06/04 12/07/04 12/08/04 12/09/04 12/10/04 12/11/04 12/12/04',
+ '12/13/04 12/14/04 12/15/04 12/16/04 12/17/04 12/18/04 12/19/04',
+ '12/20/04 12/21/04 12/22/04 12/23/04 12/24/04 12/25/04 12/26/04',
+ '12/27/04 12/28/04 12/29/04 12/30/04 12/31/04 01/01/05 01/02/05']]]
+
class OutputTestCase(unittest.TestCase):
def normalize_calendar(self, s):
@@ -178,12 +318,19 @@ class OutputTestCase(unittest.TestCase):
return not c.isspace() and not c.isdigit()
lines = []
- for line in s.splitlines(False):
+ for line in s.splitlines(keepends=False):
# Drop texts, as they are locale dependent
if line and not filter(neitherspacenordigit, line):
lines.append(line)
return lines
+ def check_htmlcalendar_encoding(self, req, res):
+ cal = calendar.HTMLCalendar()
+ self.assertEqual(
+ cal.formatyearpage(2004, encoding=req).strip(b' \t\n'),
+ (result_2004_html % {'e': res}).strip(' \t\n').encode(res)
+ )
+
def test_output(self):
self.assertEqual(
self.normalize_calendar(calendar.calendar(2004)),
@@ -196,12 +343,60 @@ class OutputTestCase(unittest.TestCase):
result_2004_text.strip()
)
- def test_output_htmlcalendar(self):
- encoding = 'ascii'
- cal = calendar.HTMLCalendar()
+ def test_output_htmlcalendar_encoding_ascii(self):
+ self.check_htmlcalendar_encoding('ascii', 'ascii')
+
+ def test_output_htmlcalendar_encoding_utf8(self):
+ self.check_htmlcalendar_encoding('utf-8', 'utf-8')
+
+ def test_output_htmlcalendar_encoding_default(self):
+ self.check_htmlcalendar_encoding(None, sys.getdefaultencoding())
+
+ def test_yeardatescalendar(self):
+ def shrink(cal):
+ return [[[' '.join('{:02d}/{:02d}/{}'.format(
+ d.month, d.day, str(d.year)[-2:]) for d in z)
+ for z in y] for y in x] for x in cal]
+ self.assertEqual(
+ shrink(calendar.Calendar().yeardatescalendar(2004)),
+ result_2004_dates
+ )
+
+ def test_yeardayscalendar(self):
self.assertEqual(
- cal.formatyearpage(2004, encoding=encoding).strip(b' \t\n'),
- result_2004_html.strip(' \t\n').encode(encoding)
+ calendar.Calendar().yeardayscalendar(2004),
+ result_2004_days
+ )
+
+ def test_formatweekheader_short(self):
+ self.assertEqual(
+ calendar.TextCalendar().formatweekheader(2),
+ 'Mo Tu We Th Fr Sa Su'
+ )
+
+ def test_formatweekheader_long(self):
+ self.assertEqual(
+ calendar.TextCalendar().formatweekheader(9),
+ ' Monday Tuesday Wednesday Thursday '
+ ' Friday Saturday Sunday '
+ )
+
+ def test_formatmonth(self):
+ self.assertEqual(
+ calendar.TextCalendar().formatmonth(2004, 1).strip(),
+ result_2004_01_text.strip()
+ )
+
+ def test_formatmonthname_with_year(self):
+ self.assertEqual(
+ calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
+ '<tr><th colspan="7" class="month">January 2004</th></tr>'
+ )
+
+ def test_formatmonthname_without_year(self):
+ self.assertEqual(
+ calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
+ '<tr><th colspan="7" class="month">January</th></tr>'
)
@@ -227,7 +422,11 @@ class CalendarTestCase(unittest.TestCase):
self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
calendar.setfirstweekday(orig)
- def test_enumerateweekdays(self):
+ def test_illegal_weekday_reported(self):
+ with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
+ calendar.setfirstweekday(123)
+
+ def test_enumerate_weekdays(self):
self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
self.assertEqual(len([d for d in calendar.day_abbr]), 7)
@@ -253,7 +452,7 @@ class CalendarTestCase(unittest.TestCase):
# verify it "acts like a sequence" in two forms of iteration
self.assertEqual(value[::-1], list(reversed(value)))
- def test_localecalendars(self):
+ def test_locale_calendars(self):
# ensure that Locale{Text,HTML}Calendar resets the locale properly
# (it is still not thread-safe though)
old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
@@ -437,6 +636,10 @@ class MonthRangeTestCase(unittest.TestCase):
with self.assertRaises(calendar.IllegalMonthError):
calendar.monthrange(2004, 13)
+ def test_illegal_month_reported(self):
+ with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
+ calendar.monthrange(2004, 65)
+
class LeapdaysTestCase(unittest.TestCase):
def test_no_range(self):
# test when no range i.e. two identical years as args
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 4d931f8..af15a3d 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -52,13 +52,36 @@ class CAPITest(unittest.TestCase):
(out, err) = p.communicate()
self.assertEqual(out, b'')
# This used to cause an infinite loop.
- self.assertEqual(err.rstrip(),
+ self.assertTrue(err.rstrip().startswith(
b'Fatal Python error:'
- b' PyThreadState_Get: no current thread')
+ b' PyThreadState_Get: no current thread'))
def test_memoryview_from_NULL_pointer(self):
self.assertRaises(ValueError, _testcapi.make_memoryview_from_NULL_pointer)
+ def test_exc_info(self):
+ raised_exception = ValueError("5")
+ new_exc = TypeError("TEST")
+ try:
+ raise raised_exception
+ except ValueError as e:
+ tb = e.__traceback__
+ orig_sys_exc_info = sys.exc_info()
+ orig_exc_info = _testcapi.set_exc_info(new_exc.__class__, new_exc, None)
+ new_sys_exc_info = sys.exc_info()
+ new_exc_info = _testcapi.set_exc_info(*orig_exc_info)
+ reset_sys_exc_info = sys.exc_info()
+
+ self.assertEqual(orig_exc_info[1], e)
+
+ self.assertSequenceEqual(orig_exc_info, (raised_exception.__class__, raised_exception, tb))
+ self.assertSequenceEqual(orig_sys_exc_info, orig_exc_info)
+ self.assertSequenceEqual(reset_sys_exc_info, orig_exc_info)
+ self.assertSequenceEqual(new_exc_info, (new_exc.__class__, new_exc, None))
+ self.assertSequenceEqual(new_sys_exc_info, new_exc_info)
+ else:
+ self.assertTrue(False)
+
@unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.')
def test_seq_bytes_to_charp_array(self):
# Issue #15732: crash in _PySequence_BytesToCharpArray()
@@ -222,9 +245,91 @@ class EmbeddingTest(unittest.TestCase):
finally:
os.chdir(oldcwd)
+class SkipitemTest(unittest.TestCase):
+
+ def test_skipitem(self):
+ """
+ If this test failed, you probably added a new "format unit"
+ in Python/getargs.c, but neglected to update our poor friend
+ skipitem() in the same file. (If so, shame on you!)
+
+ With a few exceptions**, this function brute-force tests all
+ printable ASCII*** characters (32 to 126 inclusive) as format units,
+ checking to see that PyArg_ParseTupleAndKeywords() return consistent
+ errors both when the unit is attempted to be used and when it is
+ skipped. If the format unit doesn't exist, we'll get one of two
+ specific error messages (one for used, one for skipped); if it does
+ exist we *won't* get that error--we'll get either no error or some
+ other error. If we get the specific "does not exist" error for one
+ test and not for the other, there's a mismatch, and the test fails.
+
+ ** Some format units have special funny semantics and it would
+ be difficult to accomodate them here. Since these are all
+ well-established and properly skipped in skipitem() we can
+ get away with not testing them--this test is really intended
+ to catch *new* format units.
+
+ *** Python C source files must be ASCII. Therefore it's impossible
+ to have non-ASCII format units.
+
+ """
+ empty_tuple = ()
+ tuple_1 = (0,)
+ dict_b = {'b':1}
+ keywords = ["a", "b"]
+
+ for i in range(32, 127):
+ c = chr(i)
+
+ # skip parentheses, the error reporting is inconsistent about them
+ # skip 'e', it's always a two-character code
+ # skip '|' and '$', they don't represent arguments anyway
+ if c in '()e|$':
+ continue
+
+ # test the format unit when not skipped
+ format = c + "i"
+ try:
+ # (note: the format string must be bytes!)
+ _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
+ format.encode("ascii"), keywords)
+ when_not_skipped = False
+ except TypeError as e:
+ s = "argument 1 must be impossible<bad format char>, not int"
+ when_not_skipped = (str(e) == s)
+ except RuntimeError as e:
+ when_not_skipped = False
+
+ # test the format unit when skipped
+ optional_format = "|" + format
+ try:
+ _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
+ optional_format.encode("ascii"), keywords)
+ when_skipped = False
+ except RuntimeError as e:
+ s = "impossible<bad format char>: '{}'".format(format)
+ when_skipped = (str(e) == s)
+
+ message = ("test_skipitem_parity: "
+ "detected mismatch between convertsimple and skipitem "
+ "for format unit '{}' ({}), not skipped {}, skipped {}".format(
+ c, i, when_skipped, when_not_skipped))
+ self.assertIs(when_skipped, when_not_skipped, message)
+
+ def test_parse_tuple_and_keywords(self):
+ # parse_tuple_and_keywords error handling tests
+ self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
+ (), {}, 42, [])
+ self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
+ (), {}, b'', 42)
+ self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
+ (), {}, b'', [''] * 42)
+ self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
+ (), {}, b'', [42])
def test_main():
- support.run_unittest(CAPITest, TestPendingCalls, Test6012, EmbeddingTest)
+ support.run_unittest(CAPITest, TestPendingCalls,
+ Test6012, EmbeddingTest, SkipitemTest)
for name in dir(_testcapi):
if name.startswith('test_'):
@@ -241,18 +346,17 @@ def test_main():
idents = []
def callback():
- idents.append(_thread.get_ident())
+ idents.append(threading.get_ident())
_testcapi._test_thread_state(callback)
a = b = callback
time.sleep(1)
# Check our main thread is in the list exactly 3 times.
- if idents.count(_thread.get_ident()) != 3:
+ if idents.count(threading.get_ident()) != 3:
raise support.TestFailed(
"Couldn't find main thread correctly in the list")
if threading:
- import _thread
import time
TestThreadState()
t = threading.Thread(target=TestThreadState)
diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py
index 3031fb3..5510a0d 100644
--- a/Lib/test/test_cgi.py
+++ b/Lib/test/test_cgi.py
@@ -4,6 +4,7 @@ import os
import sys
import tempfile
import unittest
+import warnings
from io import StringIO, BytesIO
class HackedSysModule:
@@ -119,9 +120,13 @@ def gen_result(data, environ):
class CgiTests(unittest.TestCase):
def test_escape(self):
- self.assertEqual("test &amp; string", cgi.escape("test & string"))
- self.assertEqual("&lt;test string&gt;", cgi.escape("<test string>"))
- self.assertEqual("&quot;test string&quot;", cgi.escape('"test string"', True))
+ # cgi.escape() is deprecated.
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', 'cgi\.escape',
+ DeprecationWarning)
+ self.assertEqual("test &amp; string", cgi.escape("test & string"))
+ self.assertEqual("&lt;test string&gt;", cgi.escape("<test string>"))
+ self.assertEqual("&quot;test string&quot;", cgi.escape('"test string"', True))
def test_strict(self):
for orig, expect in parse_strict_test_cases:
@@ -160,13 +165,7 @@ class CgiTests(unittest.TestCase):
cgi.logfp = None
cgi.logfile = "/dev/null"
cgi.initlog("%s", "Testing log 3")
- def log_cleanup():
- """Restore the global state of the log vars."""
- cgi.logfile = ''
- cgi.logfp.close()
- cgi.logfp = None
- cgi.log = cgi.initlog
- self.addCleanup(log_cleanup)
+ self.addCleanup(cgi.closelog)
cgi.log("Testing log 4")
def test_fieldstorage_readline(self):
diff --git a/Lib/test/test_cgitb.py b/Lib/test/test_cgitb.py
new file mode 100644
index 0000000..2e072a9
--- /dev/null
+++ b/Lib/test/test_cgitb.py
@@ -0,0 +1,70 @@
+from test.support import run_unittest
+from test.script_helper import assert_python_failure, temp_dir
+import unittest
+import sys
+import cgitb
+
+class TestCgitb(unittest.TestCase):
+
+ def test_fonts(self):
+ text = "Hello Robbie!"
+ self.assertEqual(cgitb.small(text), "<small>{}</small>".format(text))
+ self.assertEqual(cgitb.strong(text), "<strong>{}</strong>".format(text))
+ self.assertEqual(cgitb.grey(text),
+ '<font color="#909090">{}</font>'.format(text))
+
+ def test_blanks(self):
+ self.assertEqual(cgitb.small(""), "")
+ self.assertEqual(cgitb.strong(""), "")
+ self.assertEqual(cgitb.grey(""), "")
+
+ def test_html(self):
+ try:
+ raise ValueError("Hello World")
+ except ValueError as err:
+ # If the html was templated we could do a bit more here.
+ # At least check that we get details on what we just raised.
+ html = cgitb.html(sys.exc_info())
+ self.assertIn("ValueError", html)
+ self.assertIn(str(err), html)
+
+ def test_text(self):
+ try:
+ raise ValueError("Hello World")
+ except ValueError as err:
+ text = cgitb.text(sys.exc_info())
+ self.assertIn("ValueError", text)
+ self.assertIn("Hello World", text)
+
+ def test_syshook_no_logdir_default_format(self):
+ with temp_dir() as tracedir:
+ rc, out, err = assert_python_failure(
+ '-c',
+ ('import cgitb; cgitb.enable(logdir=%s); '
+ 'raise ValueError("Hello World")') % repr(tracedir))
+ out = out.decode(sys.getfilesystemencoding())
+ self.assertIn("ValueError", out)
+ self.assertIn("Hello World", out)
+ # By default we emit HTML markup.
+ self.assertIn('<p>', out)
+ self.assertIn('</p>', out)
+
+ def test_syshook_no_logdir_text_format(self):
+ # Issue 12890: we were emitting the <p> tag in text mode.
+ with temp_dir() as tracedir:
+ rc, out, err = assert_python_failure(
+ '-c',
+ ('import cgitb; cgitb.enable(format="text", logdir=%s); '
+ 'raise ValueError("Hello World")') % repr(tracedir))
+ out = out.decode(sys.getfilesystemencoding())
+ self.assertIn("ValueError", out)
+ self.assertIn("Hello World", out)
+ self.assertNotIn('<p>', out)
+ self.assertNotIn('</p>', out)
+
+
+def test_main():
+ run_unittest(TestCgitb)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py
index 3a46355..6618535 100644
--- a/Lib/test/test_cmd.py
+++ b/Lib/test/test_cmd.py
@@ -228,7 +228,7 @@ def test_main(verbose=None):
def test_coverage(coverdir):
trace = support.import_module('trace')
- tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
+ tracer=trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],
trace=0, count=1)
tracer.run('reload(cmd);test_main()')
r=tracer.results()
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index 7d039ee..2b0c6e2 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -31,12 +31,6 @@ class CmdLineTest(unittest.TestCase):
self.verify_valid_flag('-O')
self.verify_valid_flag('-OO')
- def test_q(self):
- self.verify_valid_flag('-Qold')
- self.verify_valid_flag('-Qnew')
- self.verify_valid_flag('-Qwarn')
- self.verify_valid_flag('-Qwarnall')
-
def test_site_flag(self):
self.verify_valid_flag('-S')
@@ -151,7 +145,7 @@ class CmdLineTest(unittest.TestCase):
@unittest.skipUnless(sys.platform == 'darwin', 'test specific to Mac OS X')
def test_osx_utf8(self):
def check_output(text):
- decoded = text.decode('utf8', 'surrogateescape')
+ decoded = text.decode('utf-8', 'surrogateescape')
expected = ascii(decoded).encode('ascii') + b'\n'
env = os.environ.copy()
@@ -223,7 +217,7 @@ class CmdLineTest(unittest.TestCase):
self.assertIn(path2.encode('ascii'), out)
def test_displayhook_unencodable(self):
- for encoding in ('ascii', 'latin1', 'utf8'):
+ for encoding in ('ascii', 'latin-1', 'utf-8'):
env = os.environ.copy()
env['PYTHONIOENCODING'] = encoding
p = subprocess.Popen(
@@ -299,7 +293,7 @@ class CmdLineTest(unittest.TestCase):
rc, out, err = assert_python_ok('-c', code)
self.assertEqual(b'', out)
self.assertRegex(err.decode('ascii', 'ignore'),
- 'Exception IOError: .* ignored')
+ 'Exception OSError: .* ignored')
def test_closed_stdout(self):
# Issue #13444: if stdout has been explicitly closed, we should
@@ -353,14 +347,14 @@ class CmdLineTest(unittest.TestCase):
hashes = []
for i in range(2):
code = 'print(hash("spam"))'
- rc, out, err = assert_python_ok('-R', '-c', code)
+ rc, out, err = assert_python_ok('-c', code)
self.assertEqual(rc, 0)
hashes.append(out)
self.assertNotEqual(hashes[0], hashes[1])
# Verify that sys.flags contains hash_randomization
code = 'import sys; print("random is", sys.flags.hash_randomization)'
- rc, out, err = assert_python_ok('-R', '-c', code)
+ rc, out, err = assert_python_ok('-c', code)
self.assertEqual(rc, 0)
self.assertIn(b'random is 1', out)
diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py
index 6b59d96..6e097e3 100644
--- a/Lib/test/test_cmd_line_script.py
+++ b/Lib/test/test_cmd_line_script.py
@@ -1,15 +1,20 @@
# tests command line execution of scripts
+import importlib
+import importlib.machinery
+import zipimport
import unittest
import sys
import os
import os.path
import py_compile
+import textwrap
from test import support
from test.script_helper import (
make_pkg, make_script, make_zip_pkg, make_zip_script,
- assert_python_ok, assert_python_failure, temp_dir)
+ assert_python_ok, assert_python_failure, temp_dir,
+ spawn_python, kill_python)
verbose = support.verbose
@@ -32,6 +37,9 @@ f()
assertEqual(result, ['Top level assignment', 'Lower level reference'])
# Check population of magic variables
assertEqual(__name__, '__main__')
+from importlib.machinery import BuiltinImporter
+_loader = __loader__ if __loader__ is BuiltinImporter else type(__loader__)
+print('__loader__==%a' % _loader)
print('__file__==%a' % __file__)
assertEqual(__cached__, None)
print('__package__==%r' % __package__)
@@ -49,12 +57,16 @@ print('cwd==%a' % os.getcwd())
"""
def _make_test_script(script_dir, script_basename, source=test_source):
- return make_script(script_dir, script_basename, source)
+ to_return = make_script(script_dir, script_basename, source)
+ importlib.invalidate_caches()
+ return to_return
def _make_test_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
source=test_source, depth=1):
- return make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
- source, depth)
+ to_return = make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
+ source, depth)
+ importlib.invalidate_caches()
+ return to_return
# There's no easy way to pass the script directory in to get
# -m to work (avoiding that is the whole point of making
@@ -72,16 +84,20 @@ def _make_launch_script(script_dir, script_basename, module_name, path=None):
else:
path = repr(path)
source = launch_source % (path, module_name)
- return make_script(script_dir, script_basename, source)
+ to_return = make_script(script_dir, script_basename, source)
+ importlib.invalidate_caches()
+ return to_return
class CmdLineTest(unittest.TestCase):
def _check_output(self, script_name, exit_code, data,
expected_file, expected_argv0,
- expected_path0, expected_package):
+ expected_path0, expected_package,
+ expected_loader):
if verbose > 1:
print("Output from test script %r:" % script_name)
print(data)
self.assertEqual(exit_code, 0)
+ printed_loader = '__loader__==%a' % expected_loader
printed_file = '__file__==%a' % expected_file
printed_package = '__package__==%r' % expected_package
printed_argv0 = 'sys.argv[0]==%a' % expected_argv0
@@ -93,6 +109,7 @@ class CmdLineTest(unittest.TestCase):
print(printed_package)
print(printed_argv0)
print(printed_cwd)
+ self.assertIn(printed_loader.encode('utf-8'), data)
self.assertIn(printed_file.encode('utf-8'), data)
self.assertIn(printed_package.encode('utf-8'), data)
self.assertIn(printed_argv0.encode('utf-8'), data)
@@ -101,14 +118,15 @@ class CmdLineTest(unittest.TestCase):
def _check_script(self, script_name, expected_file,
expected_argv0, expected_path0,
- expected_package,
+ expected_package, expected_loader,
*cmd_line_switches):
if not __debug__:
cmd_line_switches += ('-' + 'O' * sys.flags.optimize,)
run_args = cmd_line_switches + (script_name,) + tuple(example_args)
rc, out, err = assert_python_ok(*run_args)
self._check_output(script_name, rc, out + err, expected_file,
- expected_argv0, expected_path0, expected_package)
+ expected_argv0, expected_path0,
+ expected_package, expected_loader)
def _check_import_error(self, script_name, expected_msg,
*cmd_line_switches):
@@ -120,11 +138,30 @@ class CmdLineTest(unittest.TestCase):
print('Expected output: %r' % expected_msg)
self.assertIn(expected_msg.encode('utf-8'), err)
+ def test_dash_c_loader(self):
+ rc, out, err = assert_python_ok("-c", "print(__loader__)")
+ expected = repr(importlib.machinery.BuiltinImporter).encode("utf-8")
+ self.assertIn(expected, out)
+
+ def test_stdin_loader(self):
+ # Unfortunately, there's no way to automatically test the fully
+ # interactive REPL, since that code path only gets executed when
+ # stdin is an interactive tty.
+ p = spawn_python()
+ try:
+ p.stdin.write(b"print(__loader__)\n")
+ p.stdin.flush()
+ finally:
+ out = kill_python(p)
+ expected = repr(importlib.machinery.BuiltinImporter).encode("utf-8")
+ self.assertIn(expected, out)
+
def test_basic_script(self):
with temp_dir() as script_dir:
script_name = _make_test_script(script_dir, 'script')
self._check_script(script_name, script_name, script_name,
- script_dir, None)
+ script_dir, None,
+ importlib.machinery.SourceFileLoader)
def test_script_compiled(self):
with temp_dir() as script_dir:
@@ -133,13 +170,15 @@ class CmdLineTest(unittest.TestCase):
os.remove(script_name)
pyc_file = support.make_legacy_pyc(script_name)
self._check_script(pyc_file, pyc_file,
- pyc_file, script_dir, None)
+ pyc_file, script_dir, None,
+ importlib.machinery.SourcelessFileLoader)
def test_directory(self):
with temp_dir() as script_dir:
script_name = _make_test_script(script_dir, '__main__')
self._check_script(script_dir, script_name, script_dir,
- script_dir, '')
+ script_dir, '',
+ importlib.machinery.SourceFileLoader)
def test_directory_compiled(self):
with temp_dir() as script_dir:
@@ -148,7 +187,8 @@ class CmdLineTest(unittest.TestCase):
os.remove(script_name)
pyc_file = support.make_legacy_pyc(script_name)
self._check_script(script_dir, pyc_file, script_dir,
- script_dir, '')
+ script_dir, '',
+ importlib.machinery.SourcelessFileLoader)
def test_directory_error(self):
with temp_dir() as script_dir:
@@ -159,14 +199,16 @@ class CmdLineTest(unittest.TestCase):
with temp_dir() as script_dir:
script_name = _make_test_script(script_dir, '__main__')
zip_name, run_name = make_zip_script(script_dir, 'test_zip', script_name)
- self._check_script(zip_name, run_name, zip_name, zip_name, '')
+ self._check_script(zip_name, run_name, zip_name, zip_name, '',
+ zipimport.zipimporter)
def test_zipfile_compiled(self):
with temp_dir() as script_dir:
script_name = _make_test_script(script_dir, '__main__')
compiled_name = py_compile.compile(script_name, doraise=True)
zip_name, run_name = make_zip_script(script_dir, 'test_zip', compiled_name)
- self._check_script(zip_name, run_name, zip_name, zip_name, '')
+ self._check_script(zip_name, run_name, zip_name, zip_name, '',
+ zipimport.zipimporter)
def test_zipfile_error(self):
with temp_dir() as script_dir:
@@ -181,19 +223,24 @@ class CmdLineTest(unittest.TestCase):
make_pkg(pkg_dir)
script_name = _make_test_script(pkg_dir, 'script')
launch_name = _make_launch_script(script_dir, 'launch', 'test_pkg.script')
- self._check_script(launch_name, script_name, script_name, script_dir, 'test_pkg')
+ self._check_script(launch_name, script_name, script_name,
+ script_dir, 'test_pkg',
+ importlib.machinery.SourceFileLoader)
def test_module_in_package_in_zipfile(self):
with temp_dir() as script_dir:
zip_name, run_name = _make_test_zip_pkg(script_dir, 'test_zip', 'test_pkg', 'script')
launch_name = _make_launch_script(script_dir, 'launch', 'test_pkg.script', zip_name)
- self._check_script(launch_name, run_name, run_name, zip_name, 'test_pkg')
+ self._check_script(launch_name, run_name, run_name,
+ zip_name, 'test_pkg', zipimport.zipimporter)
def test_module_in_subpackage_in_zipfile(self):
with temp_dir() as script_dir:
zip_name, run_name = _make_test_zip_pkg(script_dir, 'test_zip', 'test_pkg', 'script', depth=2)
launch_name = _make_launch_script(script_dir, 'launch', 'test_pkg.test_pkg.script', zip_name)
- self._check_script(launch_name, run_name, run_name, zip_name, 'test_pkg.test_pkg')
+ self._check_script(launch_name, run_name, run_name,
+ zip_name, 'test_pkg.test_pkg',
+ zipimport.zipimporter)
def test_package(self):
with temp_dir() as script_dir:
@@ -202,7 +249,8 @@ class CmdLineTest(unittest.TestCase):
script_name = _make_test_script(pkg_dir, '__main__')
launch_name = _make_launch_script(script_dir, 'launch', 'test_pkg')
self._check_script(launch_name, script_name,
- script_name, script_dir, 'test_pkg')
+ script_name, script_dir, 'test_pkg',
+ importlib.machinery.SourceFileLoader)
def test_package_compiled(self):
with temp_dir() as script_dir:
@@ -214,7 +262,8 @@ class CmdLineTest(unittest.TestCase):
pyc_file = support.make_legacy_pyc(script_name)
launch_name = _make_launch_script(script_dir, 'launch', 'test_pkg')
self._check_script(launch_name, pyc_file,
- pyc_file, script_dir, 'test_pkg')
+ pyc_file, script_dir, 'test_pkg',
+ importlib.machinery.SourcelessFileLoader)
def test_package_error(self):
with temp_dir() as script_dir:
@@ -251,7 +300,8 @@ class CmdLineTest(unittest.TestCase):
expected = "init_argv0==%r" % '-m'
self.assertIn(expected.encode('utf-8'), out)
self._check_output(script_name, rc, out,
- script_name, script_name, '', 'test_pkg')
+ script_name, script_name, '', 'test_pkg',
+ importlib.machinery.SourceFileLoader)
def test_issue8202_dash_c_file_ignored(self):
# Make sure a "-c" file in the current directory
@@ -277,7 +327,8 @@ class CmdLineTest(unittest.TestCase):
f.write("data")
rc, out, err = assert_python_ok('-m', 'other', *example_args)
self._check_output(script_name, rc, out,
- script_name, script_name, '', '')
+ script_name, script_name, '', '',
+ importlib.machinery.SourceFileLoader)
def test_dash_m_error_code_is_one(self):
# If a module is invoked with the -m command line flag
@@ -294,6 +345,33 @@ class CmdLineTest(unittest.TestCase):
print(out)
self.assertEqual(rc, 1)
+ def test_pep_409_verbiage(self):
+ # Make sure PEP 409 syntax properly suppresses
+ # the context of an exception
+ script = textwrap.dedent("""\
+ try:
+ raise ValueError
+ except:
+ raise NameError from None
+ """)
+ with temp_dir() as script_dir:
+ script_name = _make_test_script(script_dir, 'script', script)
+ exitcode, stdout, stderr = assert_python_failure(script_name)
+ text = stderr.decode('ascii').split('\n')
+ self.assertEqual(len(text), 4)
+ self.assertTrue(text[0].startswith('Traceback'))
+ self.assertTrue(text[1].startswith(' File '))
+ self.assertTrue(text[3].startswith('NameError'))
+
+ def test_non_utf8(self):
+ # Issue #16218
+ with temp_dir() as script_dir:
+ script_name = _make_test_script(script_dir,
+ '\udcf1\udcea\udcf0\udce8\udcef\udcf2')
+ self._check_script(script_name, script_name, script_name,
+ script_dir, None,
+ importlib.machinery.SourceFileLoader)
+
def test_main():
support.run_unittest(CmdLineTest)
support.reap_children()
diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
index e1c7a78..3377a7b 100644
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -16,7 +16,7 @@ cellvars: ('x',)
freevars: ()
nlocals: 2
flags: 3
-consts: ('None', '<code object g>')
+consts: ('None', '<code object g>', "'f.<locals>.g'")
>>> dump(f(4).__code__)
name: g
diff --git a/Lib/test/test_code_module.py b/Lib/test/test_code_module.py
new file mode 100644
index 0000000..adef170
--- /dev/null
+++ b/Lib/test/test_code_module.py
@@ -0,0 +1,72 @@
+"Test InteractiveConsole and InteractiveInterpreter from code module"
+import sys
+import unittest
+from contextlib import ExitStack
+from unittest import mock
+from test import support
+
+code = support.import_module('code')
+
+
+class TestInteractiveConsole(unittest.TestCase):
+
+ def setUp(self):
+ self.console = code.InteractiveConsole()
+ self.mock_sys()
+
+ def mock_sys(self):
+ "Mock system environment for InteractiveConsole"
+ # use exit stack to match patch context managers to addCleanup
+ stack = ExitStack()
+ self.addCleanup(stack.close)
+ self.infunc = stack.enter_context(mock.patch('code.input',
+ create=True))
+ self.stdout = stack.enter_context(mock.patch('code.sys.stdout'))
+ self.stderr = stack.enter_context(mock.patch('code.sys.stderr'))
+ prepatch = mock.patch('code.sys', wraps=code.sys, spec=code.sys)
+ self.sysmod = stack.enter_context(prepatch)
+ if sys.excepthook is sys.__excepthook__:
+ self.sysmod.excepthook = self.sysmod.__excepthook__
+
+ def test_ps1(self):
+ self.infunc.side_effect = EOFError('Finished')
+ self.console.interact()
+ self.assertEqual(self.sysmod.ps1, '>>> ')
+
+ def test_ps2(self):
+ self.infunc.side_effect = EOFError('Finished')
+ self.console.interact()
+ self.assertEqual(self.sysmod.ps2, '... ')
+
+ def test_console_stderr(self):
+ self.infunc.side_effect = ["'antioch'", "", EOFError('Finished')]
+ self.console.interact()
+ for call in list(self.stdout.method_calls):
+ if 'antioch' in ''.join(call[1]):
+ break
+ else:
+ raise AssertionError("no console stdout")
+
+ def test_syntax_error(self):
+ self.infunc.side_effect = ["undefined", EOFError('Finished')]
+ self.console.interact()
+ for call in self.stderr.method_calls:
+ if 'NameError:' in ''.join(call[1]):
+ break
+ else:
+ raise AssertionError("No syntax error from console")
+
+ def test_sysexcepthook(self):
+ self.infunc.side_effect = ["raise ValueError('')",
+ EOFError('Finished')]
+ hook = mock.Mock()
+ self.sysmod.excepthook = hook
+ self.console.interact()
+ self.assertTrue(hook.called)
+
+
+def test_main():
+ support.run_unittest(TestInteractiveConsole)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py
index e656d2f..81bf80d 100644
--- a/Lib/test/test_codeccallbacks.py
+++ b/Lib/test/test_codeccallbacks.py
@@ -1,5 +1,18 @@
-import test.support, unittest
-import sys, codecs, html.entities, unicodedata
+import codecs
+import html.entities
+import sys
+import test.support
+import unicodedata
+import unittest
+import warnings
+
+try:
+ import ctypes
+except ImportError:
+ ctypes = None
+ SIZEOF_WCHAR_T = -1
+else:
+ SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar)
class PosReturn:
# this can be used for configurable callbacks
@@ -135,22 +148,14 @@ class CodecCallbackTest(unittest.TestCase):
def test_backslashescape(self):
# Does the same as the "unicode-escape" encoding, but with different
# base encodings.
- sin = "a\xac\u1234\u20ac\u8000"
- if sys.maxunicode > 0xffff:
- sin += chr(sys.maxunicode)
- sout = b"a\\xac\\u1234\\u20ac\\u8000"
- if sys.maxunicode > 0xffff:
- sout += bytes("\\U%08x" % sys.maxunicode, "ascii")
+ sin = "a\xac\u1234\u20ac\u8000\U0010ffff"
+ sout = b"a\\xac\\u1234\\u20ac\\u8000\\U0010ffff"
self.assertEqual(sin.encode("ascii", "backslashreplace"), sout)
- sout = b"a\xac\\u1234\\u20ac\\u8000"
- if sys.maxunicode > 0xffff:
- sout += bytes("\\U%08x" % sys.maxunicode, "ascii")
+ sout = b"a\xac\\u1234\\u20ac\\u8000\\U0010ffff"
self.assertEqual(sin.encode("latin-1", "backslashreplace"), sout)
- sout = b"a\xac\\u1234\xa4\\u8000"
- if sys.maxunicode > 0xffff:
- sout += bytes("\\U%08x" % sys.maxunicode, "ascii")
+ sout = b"a\xac\\u1234\xa4\\u8000\\U0010ffff"
self.assertEqual(sin.encode("iso-8859-15", "backslashreplace"), sout)
def test_decoding_callbacks(self):
@@ -200,33 +205,37 @@ class CodecCallbackTest(unittest.TestCase):
self.assertRaises(TypeError, codecs.charmap_encode, sin, "replace", charmap)
def test_decodeunicodeinternal(self):
- self.assertRaises(
- UnicodeDecodeError,
- b"\x00\x00\x00\x00\x00".decode,
- "unicode-internal",
- )
- if sys.maxunicode > 0xffff:
+ with test.support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
+ self.assertRaises(
+ UnicodeDecodeError,
+ b"\x00\x00\x00\x00\x00".decode,
+ "unicode-internal",
+ )
+ if SIZEOF_WCHAR_T == 4:
def handler_unicodeinternal(exc):
if not isinstance(exc, UnicodeDecodeError):
raise TypeError("don't know how to handle %r" % exc)
return ("\x01", 1)
- self.assertEqual(
- b"\x00\x00\x00\x00\x00".decode("unicode-internal", "ignore"),
- "\u0000"
- )
+ with test.support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
+ self.assertEqual(
+ b"\x00\x00\x00\x00\x00".decode("unicode-internal", "ignore"),
+ "\u0000"
+ )
- self.assertEqual(
- b"\x00\x00\x00\x00\x00".decode("unicode-internal", "replace"),
- "\u0000\ufffd"
- )
+ self.assertEqual(
+ b"\x00\x00\x00\x00\x00".decode("unicode-internal", "replace"),
+ "\u0000\ufffd"
+ )
- codecs.register_error("test.hui", handler_unicodeinternal)
+ codecs.register_error("test.hui", handler_unicodeinternal)
- self.assertEqual(
- b"\x00\x00\x00\x00\x00".decode("unicode-internal", "test.hui"),
- "\u0000\u0001\u0000"
- )
+ self.assertEqual(
+ b"\x00\x00\x00\x00\x00".decode("unicode-internal", "test.hui"),
+ "\u0000\u0001\u0000"
+ )
def test_callbacks(self):
def handler1(exc):
@@ -355,7 +364,7 @@ class CodecCallbackTest(unittest.TestCase):
["ascii", "\uffffx", 0, 1, "ouch"],
"'ascii' codec can't encode character '\\uffff' in position 0: ouch"
)
- if sys.maxunicode > 0xffff:
+ if SIZEOF_WCHAR_T == 4:
self.check_exceptionobjectargs(
UnicodeEncodeError,
["ascii", "\U00010000x", 0, 1, "ouch"],
@@ -390,7 +399,7 @@ class CodecCallbackTest(unittest.TestCase):
["g\uffffrk", 1, 2, "ouch"],
"can't translate character '\\uffff' in position 1: ouch"
)
- if sys.maxunicode > 0xffff:
+ if SIZEOF_WCHAR_T == 4:
self.check_exceptionobjectargs(
UnicodeTranslateError,
["g\U00010000rk", 1, 2, "ouch"],
@@ -577,31 +586,30 @@ class CodecCallbackTest(unittest.TestCase):
UnicodeEncodeError("ascii", "\uffff", 0, 1, "ouch")),
("\\uffff", 1)
)
- # 1 on UCS-4 builds, 2 on UCS-2
- len_wide = len("\U00010000")
- self.assertEqual(
- codecs.backslashreplace_errors(
- UnicodeEncodeError("ascii", "\U00010000",
- 0, len_wide, "ouch")),
- ("\\U00010000", len_wide)
- )
- self.assertEqual(
- codecs.backslashreplace_errors(
- UnicodeEncodeError("ascii", "\U0010ffff",
- 0, len_wide, "ouch")),
- ("\\U0010ffff", len_wide)
- )
- # Lone surrogates (regardless of unicode width)
- self.assertEqual(
- codecs.backslashreplace_errors(
- UnicodeEncodeError("ascii", "\ud800", 0, 1, "ouch")),
- ("\\ud800", 1)
- )
- self.assertEqual(
- codecs.backslashreplace_errors(
- UnicodeEncodeError("ascii", "\udfff", 0, 1, "ouch")),
- ("\\udfff", 1)
- )
+ if SIZEOF_WCHAR_T > 0:
+ self.assertEqual(
+ codecs.backslashreplace_errors(
+ UnicodeEncodeError("ascii", "\U00010000",
+ 0, 1, "ouch")),
+ ("\\U00010000", 1)
+ )
+ self.assertEqual(
+ codecs.backslashreplace_errors(
+ UnicodeEncodeError("ascii", "\U0010ffff",
+ 0, 1, "ouch")),
+ ("\\U0010ffff", 1)
+ )
+ # Lone surrogates (regardless of unicode width)
+ self.assertEqual(
+ codecs.backslashreplace_errors(
+ UnicodeEncodeError("ascii", "\ud800", 0, 1, "ouch")),
+ ("\\ud800", 1)
+ )
+ self.assertEqual(
+ codecs.backslashreplace_errors(
+ UnicodeEncodeError("ascii", "\udfff", 0, 1, "ouch")),
+ ("\\udfff", 1)
+ )
def test_badhandlerresults(self):
results = ( 42, "foo", (1,2,3), ("foo", 1, 3), ("foo", None), ("foo",), ("foo", 1, 3), ("foo", None), ("foo",) )
@@ -622,12 +630,14 @@ class CodecCallbackTest(unittest.TestCase):
("utf-7", b"+x-"),
("unicode-internal", b"\x00"),
):
- self.assertRaises(
- TypeError,
- bytes.decode,
- enc,
- "test.badhandler"
- )
+ with test.support.check_warnings():
+ # unicode-internal has been deprecated
+ self.assertRaises(
+ TypeError,
+ bytes.decode,
+ enc,
+ "test.badhandler"
+ )
def test_lookup(self):
self.assertEqual(codecs.strict_errors, codecs.lookup_error("strict"))
@@ -679,7 +689,7 @@ class CodecCallbackTest(unittest.TestCase):
# Python/codecs.c::PyCodec_XMLCharRefReplaceErrors()
# and inline implementations
v = (1, 5, 10, 50, 100, 500, 1000, 5000, 10000, 50000)
- if sys.maxunicode>=100000:
+ if SIZEOF_WCHAR_T == 4:
v += (100000, 500000, 1000000)
s = "".join([chr(x) for x in v])
codecs.register_error("test.xmlcharrefreplace", codecs.xmlcharrefreplace_errors)
@@ -744,7 +754,7 @@ class CodecCallbackTest(unittest.TestCase):
raise ValueError
self.assertRaises(UnicodeError, codecs.charmap_decode, b"\xff", "strict", {0xff: None})
self.assertRaises(ValueError, codecs.charmap_decode, b"\xff", "strict", D())
- self.assertRaises(TypeError, codecs.charmap_decode, b"\xff", "strict", {0xff: 0x110000})
+ self.assertRaises(TypeError, codecs.charmap_decode, b"\xff", "strict", {0xff: sys.maxunicode+1})
def test_encodehelper(self):
# enhance coverage of:
@@ -843,8 +853,12 @@ class CodecCallbackTest(unittest.TestCase):
else:
raise TypeError("don't know how to handle %r" % exc)
codecs.register_error("test.replacing", replacing)
- for (encoding, data) in baddata:
- self.assertRaises(TypeError, data.decode, encoding, "test.replacing")
+
+ with test.support.check_warnings():
+ # unicode-internal has been deprecated
+ for (encoding, data) in baddata:
+ with self.assertRaises(TypeError):
+ data.decode(encoding, "test.replacing")
def mutating(exc):
if isinstance(exc, UnicodeDecodeError):
@@ -855,8 +869,11 @@ class CodecCallbackTest(unittest.TestCase):
codecs.register_error("test.mutating", mutating)
# If the decoder doesn't pick up the modified input the following
# will lead to an endless loop
- for (encoding, data) in baddata:
- self.assertRaises(TypeError, data.decode, encoding, "test.replacing")
+ with test.support.check_warnings():
+ # unicode-internal has been deprecated
+ for (encoding, data) in baddata:
+ with self.assertRaises(TypeError):
+ data.decode(encoding, "test.replacing")
def test_main():
test.support.run_unittest(CodecCallbackTest)
diff --git a/Lib/test/test_codecencodings_cn.py b/Lib/test/test_codecencodings_cn.py
index dca9f10..b08c5fc 100644
--- a/Lib/test/test_codecencodings_cn.py
+++ b/Lib/test/test_codecencodings_cn.py
@@ -5,54 +5,57 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class Test_GB2312(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_GB2312(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'gb2312'
- tstring = test_multibytecodec_support.load_teststring('gb2312')
+ tstring = multibytecodec_support.load_teststring('gb2312')
codectests = (
# invalid bytes
(b"abc\x81\x81\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x81\x81\xc1\xc4", "replace", "abc\ufffd\u804a"),
- (b"abc\x81\x81\xc1\xc4\xc8", "replace", "abc\ufffd\u804a\ufffd"),
+ (b"abc\x81\x81\xc1\xc4", "replace", "abc\ufffd\ufffd\u804a"),
+ (b"abc\x81\x81\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u804a\ufffd"),
(b"abc\x81\x81\xc1\xc4", "ignore", "abc\u804a"),
(b"\xc1\x64", "strict", None),
)
-class Test_GBK(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_GBK(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'gbk'
- tstring = test_multibytecodec_support.load_teststring('gbk')
+ tstring = multibytecodec_support.load_teststring('gbk')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u804a"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u804a\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\u804a"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u804a\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\u804a"),
(b"\x83\x34\x83\x31", "strict", None),
("\u30fb", "strict", None),
)
-class Test_GB18030(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_GB18030(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'gb18030'
- tstring = test_multibytecodec_support.load_teststring('gb18030')
+ tstring = multibytecodec_support.load_teststring('gb18030')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u804a"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u804a\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\u804a"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u804a\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\u804a"),
- (b"abc\x84\x39\x84\x39\xc1\xc4", "replace", "abc\ufffd\u804a"),
+ (b"abc\x84\x39\x84\x39\xc1\xc4", "replace", "abc\ufffd9\ufffd9\u804a"),
("\u30fb", "strict", b"\x819\xa79"),
+ (b"abc\x84\x32\x80\x80def", "replace", 'abc\ufffd2\ufffd\ufffddef'),
+ (b"abc\x81\x30\x81\x30def", "strict", 'abc\x80def'),
+ (b"abc\x86\x30\x81\x30def", "replace", 'abc\ufffd0\ufffd0def'),
)
has_iso10646 = True
-class Test_HZ(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_HZ(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'hz'
- tstring = test_multibytecodec_support.load_teststring('hz')
+ tstring = multibytecodec_support.load_teststring('hz')
codectests = (
# test '~\n' (3 lines)
(b'This sentence is in ASCII.\n'
@@ -74,9 +77,11 @@ class Test_HZ(test_multibytecodec_support.TestBase, unittest.TestCase):
'\u5df1\u6240\u4e0d\u6b32\uff0c\u52ff\u65bd\u65bc\u4eba\u3002'
'Bye.\n'),
# invalid bytes
- (b'ab~cd', 'replace', 'ab\uFFFDd'),
+ (b'ab~cd', 'replace', 'ab\uFFFDcd'),
(b'ab\xffcd', 'replace', 'ab\uFFFDcd'),
(b'ab~{\x81\x81\x41\x44~}cd', 'replace', 'ab\uFFFD\uFFFD\u804Acd'),
+ (b'ab~{\x41\x44~}cd', 'replace', 'ab\u804Acd'),
+ (b"ab~{\x79\x79\x41\x44~}cd", "replace", "ab\ufffd\ufffd\u804acd"),
)
def test_main():
diff --git a/Lib/test/test_codecencodings_hk.py b/Lib/test/test_codecencodings_hk.py
index ccdc0b4..31363f4 100644
--- a/Lib/test/test_codecencodings_hk.py
+++ b/Lib/test/test_codecencodings_hk.py
@@ -5,18 +5,18 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class Test_Big5HKSCS(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_Big5HKSCS(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'big5hkscs'
- tstring = test_multibytecodec_support.load_teststring('big5hkscs')
+ tstring = multibytecodec_support.load_teststring('big5hkscs')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u8b10"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u8b10\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\u8b10"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u8b10\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\u8b10"),
)
diff --git a/Lib/test/test_codecencodings_iso2022.py b/Lib/test/test_codecencodings_iso2022.py
index 8c6e8a5..e4c1839 100644
--- a/Lib/test/test_codecencodings_iso2022.py
+++ b/Lib/test/test_codecencodings_iso2022.py
@@ -3,7 +3,7 @@
# Codec encoding tests for ISO 2022 encodings.
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
COMMON_CODEC_TESTS = (
@@ -13,23 +13,23 @@ COMMON_CODEC_TESTS = (
(b'ab\x1B$def', 'replace', 'ab\uFFFD'),
)
-class Test_ISO2022_JP(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_ISO2022_JP(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'iso2022_jp'
- tstring = test_multibytecodec_support.load_teststring('iso2022_jp')
+ tstring = multibytecodec_support.load_teststring('iso2022_jp')
codectests = COMMON_CODEC_TESTS + (
(b'ab\x1BNdef', 'replace', 'ab\x1BNdef'),
)
-class Test_ISO2022_JP2(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_ISO2022_JP2(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'iso2022_jp_2'
- tstring = test_multibytecodec_support.load_teststring('iso2022_jp')
+ tstring = multibytecodec_support.load_teststring('iso2022_jp')
codectests = COMMON_CODEC_TESTS + (
(b'ab\x1BNdef', 'replace', 'abdef'),
)
-class Test_ISO2022_KR(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_ISO2022_KR(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'iso2022_kr'
- tstring = test_multibytecodec_support.load_teststring('iso2022_kr')
+ tstring = multibytecodec_support.load_teststring('iso2022_kr')
codectests = COMMON_CODEC_TESTS + (
(b'ab\x1BNdef', 'replace', 'ab\x1BNdef'),
)
diff --git a/Lib/test/test_codecencodings_jp.py b/Lib/test/test_codecencodings_jp.py
index f56a373..30c9e19 100644
--- a/Lib/test/test_codecencodings_jp.py
+++ b/Lib/test/test_codecencodings_jp.py
@@ -5,60 +5,67 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class Test_CP932(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_CP932(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'cp932'
- tstring = test_multibytecodec_support.load_teststring('shift_jis')
+ tstring = multibytecodec_support.load_teststring('shift_jis')
codectests = (
# invalid bytes
(b"abc\x81\x00\x81\x00\x82\x84", "strict", None),
(b"abc\xf8", "strict", None),
- (b"abc\x81\x00\x82\x84", "replace", "abc\ufffd\uff44"),
- (b"abc\x81\x00\x82\x84\x88", "replace", "abc\ufffd\uff44\ufffd"),
- (b"abc\x81\x00\x82\x84", "ignore", "abc\uff44"),
+ (b"abc\x81\x00\x82\x84", "replace", "abc\ufffd\x00\uff44"),
+ (b"abc\x81\x00\x82\x84\x88", "replace", "abc\ufffd\x00\uff44\ufffd"),
+ (b"abc\x81\x00\x82\x84", "ignore", "abc\x00\uff44"),
+ (b"ab\xEBxy", "replace", "ab\uFFFDxy"),
+ (b"ab\xF0\x39xy", "replace", "ab\uFFFD9xy"),
+ (b"ab\xEA\xF0xy", "replace", 'ab\ufffd\ue038y'),
# sjis vs cp932
(b"\\\x7e", "replace", "\\\x7e"),
(b"\x81\x5f\x81\x61\x81\x7c", "replace", "\uff3c\u2225\uff0d"),
)
-class Test_EUC_JISX0213(test_multibytecodec_support.TestBase,
+euc_commontests = (
+ # invalid bytes
+ (b"abc\x80\x80\xc1\xc4", "strict", None),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\u7956"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u7956\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "ignore", "abc\u7956"),
+ (b"abc\xc8", "strict", None),
+ (b"abc\x8f\x83\x83", "replace", "abc\ufffd\ufffd\ufffd"),
+ (b"\x82\xFCxy", "replace", "\ufffd\ufffdxy"),
+ (b"\xc1\x64", "strict", None),
+ (b"\xa1\xc0", "strict", "\uff3c"),
+ (b"\xa1\xc0\\", "strict", "\uff3c\\"),
+ (b"\x8eXY", "replace", "\ufffdXY"),
+)
+
+class Test_EUC_JIS_2004(multibytecodec_support.TestBase,
unittest.TestCase):
- encoding = 'euc_jisx0213'
- tstring = test_multibytecodec_support.load_teststring('euc_jisx0213')
- codectests = (
- # invalid bytes
- (b"abc\x80\x80\xc1\xc4", "strict", None),
- (b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u7956"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u7956\ufffd"),
- (b"abc\x80\x80\xc1\xc4", "ignore", "abc\u7956"),
- (b"abc\x8f\x83\x83", "replace", "abc\ufffd"),
- (b"\xc1\x64", "strict", None),
- (b"\xa1\xc0", "strict", "\uff3c"),
- )
+ encoding = 'euc_jis_2004'
+ tstring = multibytecodec_support.load_teststring('euc_jisx0213')
+ codectests = euc_commontests
xmlcharnametest = (
"\xab\u211c\xbb = \u2329\u1234\u232a",
b"\xa9\xa8&real;\xa9\xb2 = &lang;&#4660;&rang;"
)
-eucjp_commontests = (
- (b"abc\x80\x80\xc1\xc4", "strict", None),
- (b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u7956"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u7956\ufffd"),
- (b"abc\x80\x80\xc1\xc4", "ignore", "abc\u7956"),
- (b"abc\x8f\x83\x83", "replace", "abc\ufffd"),
- (b"\xc1\x64", "strict", None),
-)
+class Test_EUC_JISX0213(multibytecodec_support.TestBase,
+ unittest.TestCase):
+ encoding = 'euc_jisx0213'
+ tstring = multibytecodec_support.load_teststring('euc_jisx0213')
+ codectests = euc_commontests
+ xmlcharnametest = (
+ "\xab\u211c\xbb = \u2329\u1234\u232a",
+ b"\xa9\xa8&real;\xa9\xb2 = &lang;&#4660;&rang;"
+ )
-class Test_EUC_JP_COMPAT(test_multibytecodec_support.TestBase,
+class Test_EUC_JP_COMPAT(multibytecodec_support.TestBase,
unittest.TestCase):
encoding = 'euc_jp'
- tstring = test_multibytecodec_support.load_teststring('euc_jp')
- codectests = eucjp_commontests + (
- (b"\xa1\xc0\\", "strict", "\uff3c\\"),
+ tstring = multibytecodec_support.load_teststring('euc_jp')
+ codectests = euc_commontests + (
("\xa5", "strict", b"\x5c"),
("\u203e", "strict", b"\x7e"),
)
@@ -66,29 +73,48 @@ class Test_EUC_JP_COMPAT(test_multibytecodec_support.TestBase,
shiftjis_commonenctests = (
(b"abc\x80\x80\x82\x84", "strict", None),
(b"abc\xf8", "strict", None),
- (b"abc\x80\x80\x82\x84", "replace", "abc\ufffd\uff44"),
- (b"abc\x80\x80\x82\x84\x88", "replace", "abc\ufffd\uff44\ufffd"),
(b"abc\x80\x80\x82\x84def", "ignore", "abc\uff44def"),
)
-class Test_SJIS_COMPAT(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_SJIS_COMPAT(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'shift_jis'
- tstring = test_multibytecodec_support.load_teststring('shift_jis')
+ tstring = multibytecodec_support.load_teststring('shift_jis')
codectests = shiftjis_commonenctests + (
+ (b"abc\x80\x80\x82\x84", "replace", "abc\ufffd\ufffd\uff44"),
+ (b"abc\x80\x80\x82\x84\x88", "replace", "abc\ufffd\ufffd\uff44\ufffd"),
+
(b"\\\x7e", "strict", "\\\x7e"),
(b"\x81\x5f\x81\x61\x81\x7c", "strict", "\uff3c\u2016\u2212"),
+ (b"abc\x81\x39", "replace", "abc\ufffd9"),
+ (b"abc\xEA\xFC", "replace", "abc\ufffd\ufffd"),
+ (b"abc\xFF\x58", "replace", "abc\ufffdX"),
)
-class Test_SJISX0213(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_SJIS_2004(multibytecodec_support.TestBase, unittest.TestCase):
+ encoding = 'shift_jis_2004'
+ tstring = multibytecodec_support.load_teststring('shift_jis')
+ codectests = shiftjis_commonenctests + (
+ (b"\\\x7e", "strict", "\xa5\u203e"),
+ (b"\x81\x5f\x81\x61\x81\x7c", "strict", "\\\u2016\u2212"),
+ (b"abc\xEA\xFC", "strict", "abc\u64bf"),
+ (b"\x81\x39xy", "replace", "\ufffd9xy"),
+ (b"\xFF\x58xy", "replace", "\ufffdXxy"),
+ (b"\x80\x80\x82\x84xy", "replace", "\ufffd\ufffd\uff44xy"),
+ (b"\x80\x80\x82\x84\x88xy", "replace", "\ufffd\ufffd\uff44\u5864y"),
+ (b"\xFC\xFBxy", "replace", '\ufffd\u95b4y'),
+ )
+ xmlcharnametest = (
+ "\xab\u211c\xbb = \u2329\u1234\u232a",
+ b"\x85G&real;\x85Q = &lang;&#4660;&rang;"
+ )
+
+class Test_SJISX0213(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'shift_jisx0213'
- tstring = test_multibytecodec_support.load_teststring('shift_jisx0213')
- codectests = (
- # invalid bytes
- (b"abc\x80\x80\x82\x84", "strict", None),
- (b"abc\xf8", "strict", None),
- (b"abc\x80\x80\x82\x84", "replace", "abc\ufffd\uff44"),
- (b"abc\x80\x80\x82\x84\x88", "replace", "abc\ufffd\uff44\ufffd"),
- (b"abc\x80\x80\x82\x84def", "ignore", "abc\uff44def"),
+ tstring = multibytecodec_support.load_teststring('shift_jisx0213')
+ codectests = shiftjis_commonenctests + (
+ (b"abc\x80\x80\x82\x84", "replace", "abc\ufffd\ufffd\uff44"),
+ (b"abc\x80\x80\x82\x84\x88", "replace", "abc\ufffd\ufffd\uff44\ufffd"),
+
# sjis vs cp932
(b"\\\x7e", "replace", "\xa5\u203e"),
(b"\x81\x5f\x81\x61\x81\x7c", "replace", "\x5c\u2016\u2212"),
diff --git a/Lib/test/test_codecencodings_kr.py b/Lib/test/test_codecencodings_kr.py
index de4da7f..4dd6049 100644
--- a/Lib/test/test_codecencodings_kr.py
+++ b/Lib/test/test_codecencodings_kr.py
@@ -5,30 +5,30 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class Test_CP949(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_CP949(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'cp949'
- tstring = test_multibytecodec_support.load_teststring('cp949')
+ tstring = multibytecodec_support.load_teststring('cp949')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\uc894"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\uc894\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\uc894"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\uc894\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\uc894"),
)
-class Test_EUCKR(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_EUCKR(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'euc_kr'
- tstring = test_multibytecodec_support.load_teststring('euc_kr')
+ tstring = multibytecodec_support.load_teststring('euc_kr')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\uc894"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\uc894\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", 'abc\ufffd\ufffd\uc894'),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\uc894\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\uc894"),
# composed make-up sequence errors
@@ -40,26 +40,31 @@ class Test_EUCKR(test_multibytecodec_support.TestBase, unittest.TestCase):
(b"\xa4\xd4\xa4\xb6\xa4\xd0\xa4", "strict", None),
(b"\xa4\xd4\xa4\xb6\xa4\xd0\xa4\xd4", "strict", "\uc4d4"),
(b"\xa4\xd4\xa4\xb6\xa4\xd0\xa4\xd4x", "strict", "\uc4d4x"),
- (b"a\xa4\xd4\xa4\xb6\xa4", "replace", "a\ufffd"),
+ (b"a\xa4\xd4\xa4\xb6\xa4", "replace", 'a\ufffd'),
(b"\xa4\xd4\xa3\xb6\xa4\xd0\xa4\xd4", "strict", None),
(b"\xa4\xd4\xa4\xb6\xa3\xd0\xa4\xd4", "strict", None),
(b"\xa4\xd4\xa4\xb6\xa4\xd0\xa3\xd4", "strict", None),
- (b"\xa4\xd4\xa4\xff\xa4\xd0\xa4\xd4", "replace", "\ufffd"),
- (b"\xa4\xd4\xa4\xb6\xa4\xff\xa4\xd4", "replace", "\ufffd"),
- (b"\xa4\xd4\xa4\xb6\xa4\xd0\xa4\xff", "replace", "\ufffd"),
+ (b"\xa4\xd4\xa4\xff\xa4\xd0\xa4\xd4", "replace", '\ufffd\u6e21\ufffd\u3160\ufffd'),
+ (b"\xa4\xd4\xa4\xb6\xa4\xff\xa4\xd4", "replace", '\ufffd\u6e21\ub544\ufffd\ufffd'),
+ (b"\xa4\xd4\xa4\xb6\xa4\xd0\xa4\xff", "replace", '\ufffd\u6e21\ub544\u572d\ufffd'),
+ (b"\xa4\xd4\xff\xa4\xd4\xa4\xb6\xa4\xd0\xa4\xd4", "replace", '\ufffd\ufffd\ufffd\uc4d4'),
(b"\xc1\xc4", "strict", "\uc894"),
)
-class Test_JOHAB(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_JOHAB(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'johab'
- tstring = test_multibytecodec_support.load_teststring('johab')
+ tstring = multibytecodec_support.load_teststring('johab')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ucd27"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ucd27\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\ucd27"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\ucd27\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\ucd27"),
+ (b"\xD8abc", "replace", "\uFFFDabc"),
+ (b"\xD8\xFFabc", "replace", "\uFFFD\uFFFDabc"),
+ (b"\x84bxy", "replace", "\uFFFDbxy"),
+ (b"\x8CBxy", "replace", "\uFFFDBxy"),
)
def test_main():
diff --git a/Lib/test/test_codecencodings_tw.py b/Lib/test/test_codecencodings_tw.py
index 12d3c9f..96245b7 100644
--- a/Lib/test/test_codecencodings_tw.py
+++ b/Lib/test/test_codecencodings_tw.py
@@ -5,18 +5,18 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class Test_Big5(test_multibytecodec_support.TestBase, unittest.TestCase):
+class Test_Big5(multibytecodec_support.TestBase, unittest.TestCase):
encoding = 'big5'
- tstring = test_multibytecodec_support.load_teststring('big5')
+ tstring = multibytecodec_support.load_teststring('big5')
codectests = (
# invalid bytes
(b"abc\x80\x80\xc1\xc4", "strict", None),
(b"abc\xc8", "strict", None),
- (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\u8b10"),
- (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\u8b10\ufffd"),
+ (b"abc\x80\x80\xc1\xc4", "replace", "abc\ufffd\ufffd\u8b10"),
+ (b"abc\x80\x80\xc1\xc4\xc8", "replace", "abc\ufffd\ufffd\u8b10\ufffd"),
(b"abc\x80\x80\xc1\xc4", "ignore", "abc\u8b10"),
)
diff --git a/Lib/test/test_codecmaps_cn.py b/Lib/test/test_codecmaps_cn.py
index 063919d..1a761cf 100644
--- a/Lib/test/test_codecmaps_cn.py
+++ b/Lib/test/test_codecmaps_cn.py
@@ -5,21 +5,21 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class TestGB2312Map(test_multibytecodec_support.TestBase_Mapping,
+class TestGB2312Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'gb2312'
mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-CN.TXT'
-class TestGBKMap(test_multibytecodec_support.TestBase_Mapping,
+class TestGBKMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'gbk'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/' \
'MICSFT/WINDOWS/CP936.TXT'
-class TestGB18030Map(test_multibytecodec_support.TestBase_Mapping,
+class TestGB18030Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'gb18030'
mapfileurl = 'http://source.icu-project.org/repos/icu/data/' \
diff --git a/Lib/test/test_codecmaps_hk.py b/Lib/test/test_codecmaps_hk.py
index bbe1f2f..5f4e7c7 100644
--- a/Lib/test/test_codecmaps_hk.py
+++ b/Lib/test/test_codecmaps_hk.py
@@ -5,10 +5,10 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class TestBig5HKSCSMap(test_multibytecodec_support.TestBase_Mapping,
+class TestBig5HKSCSMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'big5hkscs'
mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS-2004.TXT'
diff --git a/Lib/test/test_codecmaps_jp.py b/Lib/test/test_codecmaps_jp.py
index 652bd81..1fdbf63 100644
--- a/Lib/test/test_codecmaps_jp.py
+++ b/Lib/test/test_codecmaps_jp.py
@@ -5,10 +5,10 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class TestCP932Map(test_multibytecodec_support.TestBase_Mapping,
+class TestCP932Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'cp932'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' \
@@ -24,14 +24,14 @@ class TestCP932Map(test_multibytecodec_support.TestBase_Mapping,
supmaps.append((bytes([i]), chr(i+0xfec0)))
-class TestEUCJPCOMPATMap(test_multibytecodec_support.TestBase_Mapping,
+class TestEUCJPCOMPATMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'euc_jp'
mapfilename = 'EUC-JP.TXT'
mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-JP.TXT'
-class TestSJISCOMPATMap(test_multibytecodec_support.TestBase_Mapping,
+class TestSJISCOMPATMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'shift_jis'
mapfilename = 'SHIFTJIS.TXT'
@@ -46,14 +46,14 @@ class TestSJISCOMPATMap(test_multibytecodec_support.TestBase_Mapping,
(b'\x81_', '\\'),
]
-class TestEUCJISX0213Map(test_multibytecodec_support.TestBase_Mapping,
+class TestEUCJISX0213Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'euc_jisx0213'
mapfilename = 'EUC-JISX0213.TXT'
mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-JISX0213.TXT'
-class TestSJISX0213Map(test_multibytecodec_support.TestBase_Mapping,
+class TestSJISX0213Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'shift_jisx0213'
mapfilename = 'SHIFT_JISX0213.TXT'
diff --git a/Lib/test/test_codecmaps_kr.py b/Lib/test/test_codecmaps_kr.py
index d909c8b..0356402 100644
--- a/Lib/test/test_codecmaps_kr.py
+++ b/Lib/test/test_codecmaps_kr.py
@@ -5,17 +5,17 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class TestCP949Map(test_multibytecodec_support.TestBase_Mapping,
+class TestCP949Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'cp949'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT' \
'/WINDOWS/CP949.TXT'
-class TestEUCKRMap(test_multibytecodec_support.TestBase_Mapping,
+class TestEUCKRMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'euc_kr'
mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-KR.TXT'
@@ -25,7 +25,7 @@ class TestEUCKRMap(test_multibytecodec_support.TestBase_Mapping,
pass_dectest = [(b'\xa4\xd4', '\u3164')]
-class TestJOHABMap(test_multibytecodec_support.TestBase_Mapping,
+class TestJOHABMap(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'johab'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/' \
diff --git a/Lib/test/test_codecmaps_tw.py b/Lib/test/test_codecmaps_tw.py
index 6db5091..44467e3 100644
--- a/Lib/test/test_codecmaps_tw.py
+++ b/Lib/test/test_codecmaps_tw.py
@@ -5,16 +5,16 @@
#
from test import support
-from test import test_multibytecodec_support
+from test import multibytecodec_support
import unittest
-class TestBIG5Map(test_multibytecodec_support.TestBase_Mapping,
+class TestBIG5Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'big5'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/' \
'EASTASIA/OTHER/BIG5.TXT'
-class TestCP950Map(test_multibytecodec_support.TestBase_Mapping,
+class TestCP950Map(multibytecodec_support.TestBase_Mapping,
unittest.TestCase):
encoding = 'cp950'
mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' \
@@ -23,6 +23,9 @@ class TestCP950Map(test_multibytecodec_support.TestBase_Mapping,
(b'\xa2\xcc', '\u5341'),
(b'\xa2\xce', '\u5345'),
]
+ codectests = (
+ (b"\xFFxy", "replace", "\ufffdxy"),
+ )
def test_main():
support.run_unittest(__name__)
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 0f7c23e..f2a1ae3 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -1,8 +1,25 @@
-from test import support
-import unittest
+import _testcapi
import codecs
+import io
import locale
-import sys, _testcapi, io
+import sys
+import unittest
+import warnings
+
+from test import support
+
+if sys.platform == 'win32':
+ VISTA_OR_LATER = (sys.getwindowsversion().major >= 6)
+else:
+ VISTA_OR_LATER = False
+
+try:
+ import ctypes
+except ImportError:
+ ctypes = None
+ SIZEOF_WCHAR_T = -1
+else:
+ SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar)
class Queue(object):
"""
@@ -644,12 +661,117 @@ class UTF8Test(ReadTest):
b"abc\xed\xa0\x80def")
self.assertEqual(b"abc\xed\xa0\x80def".decode("utf-8", "surrogatepass"),
"abc\ud800def")
+ self.assertEqual("\U00010fff\uD800".encode("utf-8", "surrogatepass"),
+ b"\xf0\x90\xbf\xbf\xed\xa0\x80")
+ self.assertEqual(b"\xf0\x90\xbf\xbf\xed\xa0\x80".decode("utf-8", "surrogatepass"),
+ "\U00010fff\uD800")
self.assertTrue(codecs.lookup_error("surrogatepass"))
with self.assertRaises(UnicodeDecodeError):
b"abc\xed\xa0".decode("utf-8", "surrogatepass")
with self.assertRaises(UnicodeDecodeError):
b"abc\xed\xa0z".decode("utf-8", "surrogatepass")
+@unittest.skipUnless(sys.platform == 'win32',
+ 'cp65001 is a Windows-only codec')
+class CP65001Test(ReadTest):
+ encoding = "cp65001"
+
+ def test_encode(self):
+ tests = [
+ ('abc', 'strict', b'abc'),
+ ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'),
+ ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'),
+ ]
+ if VISTA_OR_LATER:
+ tests.extend((
+ ('\udc80', 'strict', None),
+ ('\udc80', 'ignore', b''),
+ ('\udc80', 'replace', b'?'),
+ ('\udc80', 'backslashreplace', b'\\udc80'),
+ ('\udc80', 'surrogatepass', b'\xed\xb2\x80'),
+ ))
+ else:
+ tests.append(('\udc80', 'strict', b'\xed\xb2\x80'))
+ for text, errors, expected in tests:
+ if expected is not None:
+ try:
+ encoded = text.encode('cp65001', errors)
+ except UnicodeEncodeError as err:
+ self.fail('Unable to encode %a to cp65001 with '
+ 'errors=%r: %s' % (text, errors, err))
+ self.assertEqual(encoded, expected,
+ '%a.encode("cp65001", %r)=%a != %a'
+ % (text, errors, encoded, expected))
+ else:
+ self.assertRaises(UnicodeEncodeError,
+ text.encode, "cp65001", errors)
+
+ def test_decode(self):
+ tests = [
+ (b'abc', 'strict', 'abc'),
+ (b'\xc3\xa9\xe2\x82\xac', 'strict', '\xe9\u20ac'),
+ (b'\xf4\x8f\xbf\xbf', 'strict', '\U0010ffff'),
+ (b'\xef\xbf\xbd', 'strict', '\ufffd'),
+ (b'[\xc3\xa9]', 'strict', '[\xe9]'),
+ # invalid bytes
+ (b'[\xff]', 'strict', None),
+ (b'[\xff]', 'ignore', '[]'),
+ (b'[\xff]', 'replace', '[\ufffd]'),
+ (b'[\xff]', 'surrogateescape', '[\udcff]'),
+ ]
+ if VISTA_OR_LATER:
+ tests.extend((
+ (b'[\xed\xb2\x80]', 'strict', None),
+ (b'[\xed\xb2\x80]', 'ignore', '[]'),
+ (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'),
+ ))
+ else:
+ tests.extend((
+ (b'[\xed\xb2\x80]', 'strict', '[\udc80]'),
+ ))
+ for raw, errors, expected in tests:
+ if expected is not None:
+ try:
+ decoded = raw.decode('cp65001', errors)
+ except UnicodeDecodeError as err:
+ self.fail('Unable to decode %a from cp65001 with '
+ 'errors=%r: %s' % (raw, errors, err))
+ self.assertEqual(decoded, expected,
+ '%a.decode("cp65001", %r)=%a != %a'
+ % (raw, errors, decoded, expected))
+ else:
+ self.assertRaises(UnicodeDecodeError,
+ raw.decode, 'cp65001', errors)
+
+ @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later')
+ def test_lone_surrogates(self):
+ self.assertRaises(UnicodeEncodeError, "\ud800".encode, "cp65001")
+ self.assertRaises(UnicodeDecodeError, b"\xed\xa0\x80".decode, "cp65001")
+ self.assertEqual("[\uDC80]".encode("cp65001", "backslashreplace"),
+ b'[\\udc80]')
+ self.assertEqual("[\uDC80]".encode("cp65001", "xmlcharrefreplace"),
+ b'[&#56448;]')
+ self.assertEqual("[\uDC80]".encode("cp65001", "surrogateescape"),
+ b'[\x80]')
+ self.assertEqual("[\uDC80]".encode("cp65001", "ignore"),
+ b'[]')
+ self.assertEqual("[\uDC80]".encode("cp65001", "replace"),
+ b'[?]')
+
+ @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later')
+ def test_surrogatepass_handler(self):
+ self.assertEqual("abc\ud800def".encode("cp65001", "surrogatepass"),
+ b"abc\xed\xa0\x80def")
+ self.assertEqual(b"abc\xed\xa0\x80def".decode("cp65001", "surrogatepass"),
+ "abc\ud800def")
+ self.assertEqual("\U00010fff\uD800".encode("cp65001", "surrogatepass"),
+ b"\xf0\x90\xbf\xbf\xed\xa0\x80")
+ self.assertEqual(b"\xf0\x90\xbf\xbf\xed\xa0\x80".decode("cp65001", "surrogatepass"),
+ "\U00010fff\uD800")
+ self.assertTrue(codecs.lookup_error("surrogatepass"))
+
+
+
class UTF7Test(ReadTest):
encoding = "utf-7"
@@ -910,61 +1032,80 @@ class PunycodeTest(unittest.TestCase):
self.assertEqual(uni, puny.decode("punycode"))
class UnicodeInternalTest(unittest.TestCase):
+ @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_bug1251300(self):
# Decoding with unicode_internal used to not correctly handle "code
# points" above 0x10ffff on UCS-4 builds.
- if sys.maxunicode > 0xffff:
- ok = [
- (b"\x00\x10\xff\xff", "\U0010ffff"),
- (b"\x00\x00\x01\x01", "\U00000101"),
- (b"", ""),
- ]
- not_ok = [
- b"\x7f\xff\xff\xff",
- b"\x80\x00\x00\x00",
- b"\x81\x00\x00\x00",
- b"\x00",
- b"\x00\x00\x00\x00\x00",
- ]
- for internal, uni in ok:
- if sys.byteorder == "little":
- internal = bytes(reversed(internal))
+ ok = [
+ (b"\x00\x10\xff\xff", "\U0010ffff"),
+ (b"\x00\x00\x01\x01", "\U00000101"),
+ (b"", ""),
+ ]
+ not_ok = [
+ b"\x7f\xff\xff\xff",
+ b"\x80\x00\x00\x00",
+ b"\x81\x00\x00\x00",
+ b"\x00",
+ b"\x00\x00\x00\x00\x00",
+ ]
+ for internal, uni in ok:
+ if sys.byteorder == "little":
+ internal = bytes(reversed(internal))
+ with support.check_warnings():
self.assertEqual(uni, internal.decode("unicode_internal"))
- for internal in not_ok:
- if sys.byteorder == "little":
- internal = bytes(reversed(internal))
+ for internal in not_ok:
+ if sys.byteorder == "little":
+ internal = bytes(reversed(internal))
+ with support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
self.assertRaises(UnicodeDecodeError, internal.decode,
- "unicode_internal")
-
+ "unicode_internal")
+ if sys.byteorder == "little":
+ invalid = b"\x00\x00\x11\x00"
+ else:
+ invalid = b"\x00\x11\x00\x00"
+ with support.check_warnings():
+ self.assertRaises(UnicodeDecodeError,
+ invalid.decode, "unicode_internal")
+ with support.check_warnings():
+ self.assertEqual(invalid.decode("unicode_internal", "replace"),
+ '\ufffd')
+
+ @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_decode_error_attributes(self):
- if sys.maxunicode > 0xffff:
- try:
+ try:
+ with support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
b"\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal")
- except UnicodeDecodeError as ex:
- self.assertEqual("unicode_internal", ex.encoding)
- self.assertEqual(b"\x00\x00\x00\x00\x00\x11\x11\x00", ex.object)
- self.assertEqual(4, ex.start)
- self.assertEqual(8, ex.end)
- else:
- self.fail()
+ except UnicodeDecodeError as ex:
+ self.assertEqual("unicode_internal", ex.encoding)
+ self.assertEqual(b"\x00\x00\x00\x00\x00\x11\x11\x00", ex.object)
+ self.assertEqual(4, ex.start)
+ self.assertEqual(8, ex.end)
+ else:
+ self.fail()
+ @unittest.skipUnless(SIZEOF_WCHAR_T == 4, 'specific to 32-bit wchar_t')
def test_decode_callback(self):
- if sys.maxunicode > 0xffff:
- codecs.register_error("UnicodeInternalTest", codecs.ignore_errors)
- decoder = codecs.getdecoder("unicode_internal")
+ codecs.register_error("UnicodeInternalTest", codecs.ignore_errors)
+ decoder = codecs.getdecoder("unicode_internal")
+ with support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
ab = "ab".encode("unicode_internal").decode()
ignored = decoder(bytes("%s\x22\x22\x22\x22%s" % (ab[:4], ab[4:]),
"ascii"),
"UnicodeInternalTest")
- self.assertEqual(("ab", 12), ignored)
+ self.assertEqual(("ab", 12), ignored)
def test_encode_length(self):
- # Issue 3739
- encoder = codecs.getencoder("unicode_internal")
- self.assertEqual(encoder("a")[1], 1)
- self.assertEqual(encoder("\xe9\u0142")[1], 2)
+ with support.check_warnings(('unicode_internal codec has been '
+ 'deprecated', DeprecationWarning)):
+ # Issue 3739
+ encoder = codecs.getencoder("unicode_internal")
+ self.assertEqual(encoder("a")[1], 1)
+ self.assertEqual(encoder("\xe9\u0142")[1], 2)
- self.assertEqual(codecs.escape_encode(br'\x00')[1], 4)
+ self.assertEqual(codecs.escape_encode(br'\x00')[1], 4)
# From http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html
nameprep_tests = [
@@ -1288,7 +1429,7 @@ class EncodedFileTest(unittest.TestCase):
self.assertEqual(ef.read(), b'\\\xd5\n\x00\x00\xae')
f = io.BytesIO()
- ef = codecs.EncodedFile(f, 'utf-8', 'latin1')
+ ef = codecs.EncodedFile(f, 'utf-8', 'latin-1')
ef.write(b'\xc3\xbc')
self.assertEqual(f.getvalue(), b'\xfc')
@@ -1420,10 +1561,13 @@ class BasicUnicodeTest(unittest.TestCase, MixInCheckStateHandling):
elif encoding == "latin_1":
name = "latin_1"
self.assertEqual(encoding.replace("_", "-"), name.replace("_", "-"))
- (b, size) = codecs.getencoder(encoding)(s)
- self.assertEqual(size, len(s), "%r != %r (encoding=%r)" % (size, len(s), encoding))
- (chars, size) = codecs.getdecoder(encoding)(b)
- self.assertEqual(chars, s, "%r != %r (encoding=%r)" % (chars, s, encoding))
+
+ with support.check_warnings():
+ # unicode-internal has been deprecated
+ (b, size) = codecs.getencoder(encoding)(s)
+ self.assertEqual(size, len(s), "%r != %r (encoding=%r)" % (size, len(s), encoding))
+ (chars, size) = codecs.getdecoder(encoding)(b)
+ self.assertEqual(chars, s, "%r != %r (encoding=%r)" % (chars, s, encoding))
if encoding not in broken_unicode_with_streams:
# check stream reader/writer
@@ -1527,7 +1671,9 @@ class BasicUnicodeTest(unittest.TestCase, MixInCheckStateHandling):
def test_bad_encode_args(self):
for encoding in all_unicode_encodings:
encoder = codecs.getencoder(encoding)
- self.assertRaises(TypeError, encoder)
+ with support.check_warnings():
+ # unicode-internal has been deprecated
+ self.assertRaises(TypeError, encoder)
def test_encoding_map_type_initialized(self):
from encodings import cp1140
@@ -1550,6 +1696,11 @@ class CharmapTest(unittest.TestCase):
("abc", 3)
)
+ self.assertEqual(
+ codecs.charmap_decode(b"\x00\x01\x02", "strict", "\U0010FFFFbc"),
+ ("\U0010FFFFbc", 3)
+ )
+
self.assertRaises(UnicodeDecodeError,
codecs.charmap_decode, b"\x00\x01\x02", "strict", "ab"
)
@@ -1658,9 +1809,15 @@ class CharmapTest(unittest.TestCase):
("\U0010FFFFbc", 3)
)
+ self.assertEqual(
+ codecs.charmap_decode(b"\x00\x01\x02", "strict",
+ {0: sys.maxunicode, 1: b, 2: c}),
+ (chr(sys.maxunicode) + "bc", 3)
+ )
+
self.assertRaises(TypeError,
codecs.charmap_decode, b"\x00\x01\x02", "strict",
- {0: 0x110000, 1: b, 2: c}
+ {0: sys.maxunicode + 1, 1: b, 2: c}
)
self.assertRaises(UnicodeDecodeError,
@@ -1724,6 +1881,12 @@ class TypesTest(unittest.TestCase):
self.assertEqual(codecs.raw_unicode_escape_decode(r"\u1234"), ("\u1234", 6))
self.assertEqual(codecs.raw_unicode_escape_decode(br"\u1234"), ("\u1234", 6))
+ self.assertRaises(UnicodeDecodeError, codecs.unicode_escape_decode, br"\U00110000")
+ self.assertEqual(codecs.unicode_escape_decode(r"\U00110000", "replace"), ("\ufffd", 10))
+
+ self.assertRaises(UnicodeDecodeError, codecs.raw_unicode_escape_decode, br"\U00110000")
+ self.assertEqual(codecs.raw_unicode_escape_decode(r"\U00110000", "replace"), ("\ufffd", 10))
+
class SurrogateEscapeTest(unittest.TestCase):
def test_utf8(self):
@@ -1754,7 +1917,7 @@ class SurrogateEscapeTest(unittest.TestCase):
def test_latin1(self):
# Issue6373
- self.assertEqual("\udce4\udceb\udcef\udcf6\udcfc".encode("latin1", "surrogateescape"),
+ self.assertEqual("\udce4\udceb\udcef\udcf6\udcfc".encode("latin-1", "surrogateescape"),
b"\xe4\xeb\xef\xf6\xfc")
@@ -1863,6 +2026,155 @@ class TransformCodecTest(unittest.TestCase):
self.assertEqual(sout, b"\x80")
+@unittest.skipUnless(sys.platform == 'win32',
+ 'code pages are specific to Windows')
+class CodePageTest(unittest.TestCase):
+ # CP_UTF8 is already tested by CP65001Test
+ CP_UTF8 = 65001
+
+ def test_invalid_code_page(self):
+ self.assertRaises(ValueError, codecs.code_page_encode, -1, 'a')
+ self.assertRaises(ValueError, codecs.code_page_decode, -1, b'a')
+ self.assertRaises(WindowsError, codecs.code_page_encode, 123, 'a')
+ self.assertRaises(WindowsError, codecs.code_page_decode, 123, b'a')
+
+ def test_code_page_name(self):
+ self.assertRaisesRegex(UnicodeEncodeError, 'cp932',
+ codecs.code_page_encode, 932, '\xff')
+ self.assertRaisesRegex(UnicodeDecodeError, 'cp932',
+ codecs.code_page_decode, 932, b'\x81\x00')
+ self.assertRaisesRegex(UnicodeDecodeError, 'CP_UTF8',
+ codecs.code_page_decode, self.CP_UTF8, b'\xff')
+
+ def check_decode(self, cp, tests):
+ for raw, errors, expected in tests:
+ if expected is not None:
+ try:
+ decoded = codecs.code_page_decode(cp, raw, errors)
+ except UnicodeDecodeError as err:
+ self.fail('Unable to decode %a from "cp%s" with '
+ 'errors=%r: %s' % (raw, cp, errors, err))
+ self.assertEqual(decoded[0], expected,
+ '%a.decode("cp%s", %r)=%a != %a'
+ % (raw, cp, errors, decoded[0], expected))
+ # assert 0 <= decoded[1] <= len(raw)
+ self.assertGreaterEqual(decoded[1], 0)
+ self.assertLessEqual(decoded[1], len(raw))
+ else:
+ self.assertRaises(UnicodeDecodeError,
+ codecs.code_page_decode, cp, raw, errors)
+
+ def check_encode(self, cp, tests):
+ for text, errors, expected in tests:
+ if expected is not None:
+ try:
+ encoded = codecs.code_page_encode(cp, text, errors)
+ except UnicodeEncodeError as err:
+ self.fail('Unable to encode %a to "cp%s" with '
+ 'errors=%r: %s' % (text, cp, errors, err))
+ self.assertEqual(encoded[0], expected,
+ '%a.encode("cp%s", %r)=%a != %a'
+ % (text, cp, errors, encoded[0], expected))
+ self.assertEqual(encoded[1], len(text))
+ else:
+ self.assertRaises(UnicodeEncodeError,
+ codecs.code_page_encode, cp, text, errors)
+
+ def test_cp932(self):
+ self.check_encode(932, (
+ ('abc', 'strict', b'abc'),
+ ('\uff44\u9a3e', 'strict', b'\x82\x84\xe9\x80'),
+ # test error handlers
+ ('\xff', 'strict', None),
+ ('[\xff]', 'ignore', b'[]'),
+ ('[\xff]', 'replace', b'[y]'),
+ ('[\u20ac]', 'replace', b'[?]'),
+ ('[\xff]', 'backslashreplace', b'[\\xff]'),
+ ('[\xff]', 'xmlcharrefreplace', b'[&#255;]'),
+ ))
+ self.check_decode(932, (
+ (b'abc', 'strict', 'abc'),
+ (b'\x82\x84\xe9\x80', 'strict', '\uff44\u9a3e'),
+ # invalid bytes
+ (b'[\xff]', 'strict', None),
+ (b'[\xff]', 'ignore', '[]'),
+ (b'[\xff]', 'replace', '[\ufffd]'),
+ (b'[\xff]', 'surrogateescape', '[\udcff]'),
+ (b'\x81\x00abc', 'strict', None),
+ (b'\x81\x00abc', 'ignore', '\x00abc'),
+ (b'\x81\x00abc', 'replace', '\ufffd\x00abc'),
+ ))
+
+ def test_cp1252(self):
+ self.check_encode(1252, (
+ ('abc', 'strict', b'abc'),
+ ('\xe9\u20ac', 'strict', b'\xe9\x80'),
+ ('\xff', 'strict', b'\xff'),
+ ('\u0141', 'strict', None),
+ ('\u0141', 'ignore', b''),
+ ('\u0141', 'replace', b'L'),
+ ))
+ self.check_decode(1252, (
+ (b'abc', 'strict', 'abc'),
+ (b'\xe9\x80', 'strict', '\xe9\u20ac'),
+ (b'\xff', 'strict', '\xff'),
+ ))
+
+ def test_cp_utf7(self):
+ cp = 65000
+ self.check_encode(cp, (
+ ('abc', 'strict', b'abc'),
+ ('\xe9\u20ac', 'strict', b'+AOkgrA-'),
+ ('\U0010ffff', 'strict', b'+2//f/w-'),
+ ('\udc80', 'strict', b'+3IA-'),
+ ('\ufffd', 'strict', b'+//0-'),
+ ))
+ self.check_decode(cp, (
+ (b'abc', 'strict', 'abc'),
+ (b'+AOkgrA-', 'strict', '\xe9\u20ac'),
+ (b'+2//f/w-', 'strict', '\U0010ffff'),
+ (b'+3IA-', 'strict', '\udc80'),
+ (b'+//0-', 'strict', '\ufffd'),
+ # invalid bytes
+ (b'[+/]', 'strict', '[]'),
+ (b'[\xff]', 'strict', '[\xff]'),
+ ))
+
+ def test_multibyte_encoding(self):
+ self.check_decode(932, (
+ (b'\x84\xe9\x80', 'ignore', '\u9a3e'),
+ (b'\x84\xe9\x80', 'replace', '\ufffd\u9a3e'),
+ ))
+ self.check_decode(self.CP_UTF8, (
+ (b'\xff\xf4\x8f\xbf\xbf', 'ignore', '\U0010ffff'),
+ (b'\xff\xf4\x8f\xbf\xbf', 'replace', '\ufffd\U0010ffff'),
+ ))
+ if VISTA_OR_LATER:
+ self.check_encode(self.CP_UTF8, (
+ ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'),
+ ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'),
+ ))
+
+ def test_incremental(self):
+ decoded = codecs.code_page_decode(932, b'\x82', 'strict', False)
+ self.assertEqual(decoded, ('', 0))
+
+ decoded = codecs.code_page_decode(932,
+ b'\xe9\x80\xe9', 'strict',
+ False)
+ self.assertEqual(decoded, ('\u9a3e', 2))
+
+ decoded = codecs.code_page_decode(932,
+ b'\xe9\x80\xe9\x80', 'strict',
+ False)
+ self.assertEqual(decoded, ('\u9a3e\u9a3e', 4))
+
+ decoded = codecs.code_page_decode(932,
+ b'abc', 'strict',
+ False)
+ self.assertEqual(decoded, ('abc', 3))
+
+
def test_main():
support.run_unittest(
UTF32Test,
@@ -1873,6 +2185,7 @@ def test_main():
UTF16BETest,
UTF8Test,
UTF8SigTest,
+ CP65001Test,
UTF7Test,
UTF16ExTest,
ReadBufferTest,
@@ -1891,6 +2204,7 @@ def test_main():
SurrogateEscapeTest,
BomTest,
TransformCodecTest,
+ CodePageTest,
)
diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py
index f9db0b4..dfd5431 100644
--- a/Lib/test/test_coding.py
+++ b/Lib/test/test_coding.py
@@ -1,7 +1,6 @@
-
import test.support, unittest
from test.support import TESTFN, unlink, unload
-import os, sys
+import importlib, os, sys
class CodingTest(unittest.TestCase):
def test_bad_coding(self):
@@ -40,6 +39,7 @@ class CodingTest(unittest.TestCase):
f.write("'A very long string %s'\n" % ("X" * 1000))
f.close()
+ importlib.invalidate_caches()
__import__(TESTFN)
finally:
f.close()
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index b2a5f05..8850e8b 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -1,6 +1,7 @@
"""Unit tests for collections.py."""
import unittest, doctest, operator
+from test.support import TESTFN, forget, unlink
import inspect
from test import support
from collections import namedtuple, Counter, OrderedDict, _count_elements
@@ -10,21 +11,20 @@ from random import randrange, shuffle
import keyword
import re
import sys
-from collections import _ChainMap
-from collections import Hashable, Iterable, Iterator
-from collections import Sized, Container, Callable
-from collections import Set, MutableSet
-from collections import Mapping, MutableMapping, KeysView, ItemsView, UserDict
-from collections import Sequence, MutableSequence
-from collections import ByteString
+from collections import UserDict
+from collections import ChainMap
+from collections.abc import Hashable, Iterable, Iterator
+from collections.abc import Sized, Container, Callable
+from collections.abc import Set, MutableSet
+from collections.abc import Mapping, MutableMapping, KeysView, ItemsView
+from collections.abc import Sequence, MutableSequence
+from collections.abc import ByteString
################################################################################
-### _ChainMap (helper class for configparser)
+### ChainMap (helper class for configparser and the string module)
################################################################################
-ChainMap = _ChainMap # rename to keep test code in sync with 3.3 version
-
class TestChainMap(unittest.TestCase):
def test_basics(self):
@@ -128,6 +128,7 @@ class TestNamedTuple(unittest.TestCase):
self.assertEqual(Point.__module__, __name__)
self.assertEqual(Point.__getitem__, tuple.__getitem__)
self.assertEqual(Point._fields, ('x', 'y'))
+ self.assertIn('class Point(tuple)', Point._source)
self.assertRaises(ValueError, namedtuple, 'abc%', 'efg ghi') # type has non-alpha char
self.assertRaises(ValueError, namedtuple, 'class', 'efg ghi') # type has keyword
@@ -327,6 +328,17 @@ class TestNamedTuple(unittest.TestCase):
pass
self.assertEqual(repr(B(1)), 'B(x=1)')
+ def test_source(self):
+ # verify that _source can be run through exec()
+ tmp = namedtuple('NTColor', 'red green blue')
+ globals().pop('NTColor', None) # remove artifacts from other tests
+ exec(tmp._source, globals())
+ self.assertIn('NTColor', globals())
+ c = NTColor(10, 20, 30)
+ self.assertEqual((c.red, c.green, c.blue), (10, 20, 30))
+ self.assertEqual(NTColor._fields, ('red', 'green', 'blue'))
+ globals().pop('NTColor', None) # clean-up after this test
+
################################################################################
### Abstract Base Classes
@@ -762,6 +774,44 @@ class TestCollectionABCs(ABCTestCase):
self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__',
'__len__', '__getitem__', '__setitem__', '__delitem__', 'insert')
+ def test_MutableSequence_mixins(self):
+ # Test the mixins of MutableSequence by creating a miminal concrete
+ # class inherited from it.
+ class MutableSequenceSubclass(MutableSequence):
+ def __init__(self):
+ self.lst = []
+
+ def __setitem__(self, index, value):
+ self.lst[index] = value
+
+ def __getitem__(self, index):
+ return self.lst[index]
+
+ def __len__(self):
+ return len(self.lst)
+
+ def __delitem__(self, index):
+ del self.lst[index]
+
+ def insert(self, index, value):
+ self.lst.insert(index, value)
+
+ mss = MutableSequenceSubclass()
+ mss.append(0)
+ mss.extend((1, 2, 3, 4))
+ self.assertEqual(len(mss), 5)
+ self.assertEqual(mss[3], 3)
+ mss.reverse()
+ self.assertEqual(mss[3], 1)
+ mss.pop()
+ self.assertEqual(len(mss), 4)
+ mss.remove(3)
+ self.assertEqual(len(mss), 3)
+ mss += (10, 20, 30)
+ self.assertEqual(len(mss), 6)
+ self.assertEqual(mss[-1], 30)
+ mss.clear()
+ self.assertEqual(len(mss), 0)
################################################################################
### Counter
@@ -915,6 +965,27 @@ class TestCounter(unittest.TestCase):
set_result = setop(set(p.elements()), set(q.elements()))
self.assertEqual(counter_result, dict.fromkeys(set_result, 1))
+ def test_inplace_operations(self):
+ elements = 'abcd'
+ for i in range(1000):
+ # test random pairs of multisets
+ p = Counter(dict((elem, randrange(-2,4)) for elem in elements))
+ p.update(e=1, f=-1, g=0)
+ q = Counter(dict((elem, randrange(-2,4)) for elem in elements))
+ q.update(h=1, i=-1, j=0)
+ for inplace_op, regular_op in [
+ (Counter.__iadd__, Counter.__add__),
+ (Counter.__isub__, Counter.__sub__),
+ (Counter.__ior__, Counter.__or__),
+ (Counter.__iand__, Counter.__and__),
+ ]:
+ c = p.copy()
+ c_id = id(c)
+ regular_result = regular_op(c, q)
+ inplace_result = inplace_op(c, q)
+ self.assertEqual(inplace_result, regular_result)
+ self.assertEqual(id(inplace_result), c_id)
+
def test_subtract(self):
c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
c.subtract(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50)
@@ -926,6 +997,11 @@ class TestCounter(unittest.TestCase):
c.subtract('aaaabbcce')
self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1))
+ def test_unary(self):
+ c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40)
+ self.assertEqual(dict(+c), dict(c=5, d=10, e=15, g=40))
+ self.assertEqual(dict(-c), dict(a=5))
+
def test_repr_nonsortable(self):
c = Counter(a=2, b=None)
r = repr(c)
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 58ef297..1071f4a 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1,10 +1,17 @@
import unittest
import sys
import _ast
+import types
from test import support
class TestSpecifics(unittest.TestCase):
+ def compile_single(self, source):
+ compile(source, "<single>", "single")
+
+ def assertInvalidSingle(self, source):
+ self.assertRaises(SyntaxError, self.compile_single, source)
+
def test_no_ending_newline(self):
compile("hi", "<test>", "exec")
compile("hi\r", "<test>", "exec")
@@ -433,6 +440,66 @@ if 1:
ast.body = [_ast.BoolOp()]
self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
+ @support.cpython_only
+ def test_same_filename_used(self):
+ s = """def f(): pass\ndef g(): pass"""
+ c = compile(s, "myfile", "exec")
+ for obj in c.co_consts:
+ if isinstance(obj, types.CodeType):
+ self.assertIs(obj.co_filename, c.co_filename)
+
+ def test_single_statement(self):
+ self.compile_single("1 + 2")
+ self.compile_single("\n1 + 2")
+ self.compile_single("1 + 2\n")
+ self.compile_single("1 + 2\n\n")
+ self.compile_single("1 + 2\t\t\n")
+ self.compile_single("1 + 2\t\t\n ")
+ self.compile_single("1 + 2 # one plus two")
+ self.compile_single("1; 2")
+ self.compile_single("import sys; sys")
+ self.compile_single("def f():\n pass")
+ self.compile_single("while False:\n pass")
+ self.compile_single("if x:\n f(x)")
+ self.compile_single("if x:\n f(x)\nelse:\n g(x)")
+ self.compile_single("class T:\n pass")
+
+ def test_bad_single_statement(self):
+ self.assertInvalidSingle('1\n2')
+ self.assertInvalidSingle('def f(): pass')
+ self.assertInvalidSingle('a = 13\nb = 187')
+ self.assertInvalidSingle('del x\ndel y')
+ self.assertInvalidSingle('f()\ng()')
+ self.assertInvalidSingle('f()\n# blah\nblah()')
+ self.assertInvalidSingle('f()\nxy # blah\nblah()')
+ self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
+
+ @support.cpython_only
+ def test_compiler_recursion_limit(self):
+ # Expected limit is sys.getrecursionlimit() * the scaling factor
+ # in symtable.c (currently 3)
+ # We expect to fail *at* that limit, because we use up some of
+ # the stack depth limit in the test suite code
+ # So we check the expected limit and 75% of that
+ # XXX (ncoghlan): duplicating the scaling factor here is a little
+ # ugly. Perhaps it should be exposed somewhere...
+ fail_depth = sys.getrecursionlimit() * 3
+ success_depth = int(fail_depth * 0.75)
+
+ def check_limit(prefix, repeated):
+ expect_ok = prefix + repeated * success_depth
+ self.compile_single(expect_ok)
+ broken = prefix + repeated * fail_depth
+ details = "Compiling ({!r} + {!r} * {})".format(
+ prefix, repeated, fail_depth)
+ with self.assertRaises(RuntimeError, msg=details):
+ self.compile_single(broken)
+
+ check_limit("a", "()")
+ check_limit("a", ".b")
+ check_limit("a", "[0]")
+ check_limit("a", "*a")
+
def test_main():
support.run_unittest(TestSpecifics)
diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
index 2afa938..6ae450d 100644
--- a/Lib/test/test_concurrent_futures.py
+++ b/Lib/test/test_concurrent_futures.py
@@ -19,7 +19,7 @@ import unittest
from concurrent import futures
from concurrent.futures._base import (
PENDING, RUNNING, CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, Future)
-import concurrent.futures.process
+from concurrent.futures.process import BrokenProcessPool
def create_future(state=PENDING, exception=None, result=None):
@@ -34,7 +34,7 @@ PENDING_FUTURE = create_future(state=PENDING)
RUNNING_FUTURE = create_future(state=RUNNING)
CANCELLED_FUTURE = create_future(state=CANCELLED)
CANCELLED_AND_NOTIFIED_FUTURE = create_future(state=CANCELLED_AND_NOTIFIED)
-EXCEPTION_FUTURE = create_future(state=FINISHED, exception=IOError())
+EXCEPTION_FUTURE = create_future(state=FINISHED, exception=OSError())
SUCCESSFUL_FUTURE = create_future(state=FINISHED, result=42)
@@ -160,7 +160,7 @@ class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest):
processes = self.executor._processes
self.executor.shutdown()
- for p in processes:
+ for p in processes.values():
p.join()
def test_context_manager_shutdown(self):
@@ -169,7 +169,7 @@ class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest):
self.assertEqual(list(e.map(abs, range(-5, 5))),
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4])
- for p in processes:
+ for p in processes.values():
p.join()
def test_del_shutdown(self):
@@ -180,7 +180,7 @@ class ProcessPoolShutdownTest(ProcessPoolMixin, ExecutorShutdownTest):
del executor
queue_management_thread.join()
- for p in processes:
+ for p in processes.values():
p.join()
@@ -268,14 +268,14 @@ class WaitTests(unittest.TestCase):
def test_timeout(self):
future1 = self.executor.submit(mul, 6, 7)
- future2 = self.executor.submit(time.sleep, 3)
+ future2 = self.executor.submit(time.sleep, 6)
finished, pending = futures.wait(
[CANCELLED_AND_NOTIFIED_FUTURE,
EXCEPTION_FUTURE,
SUCCESSFUL_FUTURE,
future1, future2],
- timeout=1.5,
+ timeout=5,
return_when=futures.ALL_COMPLETED)
self.assertEqual(set([CANCELLED_AND_NOTIFIED_FUTURE,
@@ -379,8 +379,8 @@ class ExecutorTest(unittest.TestCase):
results = []
try:
for i in self.executor.map(time.sleep,
- [0, 0, 3],
- timeout=1.5):
+ [0, 0, 6],
+ timeout=5):
results.append(i)
except futures.TimeoutError:
pass
@@ -389,13 +389,38 @@ class ExecutorTest(unittest.TestCase):
self.assertEqual([None, None], results)
+ def test_shutdown_race_issue12456(self):
+ # Issue #12456: race condition at shutdown where trying to post a
+ # sentinel in the call queue blocks (the queue is full while processes
+ # have exited).
+ self.executor.map(str, [2] * (self.worker_count + 1))
+ self.executor.shutdown()
+
class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest):
- pass
+ def test_map_submits_without_iteration(self):
+ """Tests verifying issue 11777."""
+ finished = []
+ def record_finished(n):
+ finished.append(n)
+
+ self.executor.map(record_finished, range(10))
+ self.executor.shutdown(wait=True)
+ self.assertCountEqual(finished, range(10))
class ProcessPoolExecutorTest(ProcessPoolMixin, ExecutorTest):
- pass
+ def test_killed_child(self):
+ # When a child process is abruptly terminated, the whole pool gets
+ # "broken".
+ futures = [self.executor.submit(time.sleep, 3)]
+ # Get one of the processes, and terminate (kill) it
+ p = next(iter(self.executor._processes.values()))
+ p.terminate()
+ for fut in futures:
+ self.assertRaises(BrokenProcessPool, fut.result)
+ # Submitting other jobs fails as well.
+ self.assertRaises(BrokenProcessPool, self.executor.submit, pow, 2, 8)
class FutureTests(unittest.TestCase):
@@ -498,7 +523,7 @@ class FutureTests(unittest.TestCase):
'<Future at 0x[0-9a-f]+ state=cancelled>')
self.assertRegex(
repr(EXCEPTION_FUTURE),
- '<Future at 0x[0-9a-f]+ state=finished raised IOError>')
+ '<Future at 0x[0-9a-f]+ state=finished raised OSError>')
self.assertRegex(
repr(SUCCESSFUL_FUTURE),
'<Future at 0x[0-9a-f]+ state=finished returned int>')
@@ -509,7 +534,7 @@ class FutureTests(unittest.TestCase):
f2 = create_future(state=RUNNING)
f3 = create_future(state=CANCELLED)
f4 = create_future(state=CANCELLED_AND_NOTIFIED)
- f5 = create_future(state=FINISHED, exception=IOError())
+ f5 = create_future(state=FINISHED, exception=OSError())
f6 = create_future(state=FINISHED, result=5)
self.assertTrue(f1.cancel())
@@ -563,7 +588,7 @@ class FutureTests(unittest.TestCase):
CANCELLED_FUTURE.result, timeout=0)
self.assertRaises(futures.CancelledError,
CANCELLED_AND_NOTIFIED_FUTURE.result, timeout=0)
- self.assertRaises(IOError, EXCEPTION_FUTURE.result, timeout=0)
+ self.assertRaises(OSError, EXCEPTION_FUTURE.result, timeout=0)
self.assertEqual(SUCCESSFUL_FUTURE.result(timeout=0), 42)
def test_result_with_success(self):
@@ -602,7 +627,7 @@ class FutureTests(unittest.TestCase):
self.assertRaises(futures.CancelledError,
CANCELLED_AND_NOTIFIED_FUTURE.exception, timeout=0)
self.assertTrue(isinstance(EXCEPTION_FUTURE.exception(timeout=0),
- IOError))
+ OSError))
self.assertEqual(SUCCESSFUL_FUTURE.exception(timeout=0), None)
def test_exception_with_success(self):
@@ -611,14 +636,14 @@ class FutureTests(unittest.TestCase):
time.sleep(1)
with f1._condition:
f1._state = FINISHED
- f1._exception = IOError()
+ f1._exception = OSError()
f1._condition.notify_all()
f1 = create_future(state=PENDING)
t = threading.Thread(target=notification)
t.start()
- self.assertTrue(isinstance(f1.exception(timeout=5), IOError))
+ self.assertTrue(isinstance(f1.exception(timeout=5), OSError))
@test.support.reap_threads
def test_main():
@@ -631,7 +656,8 @@ def test_main():
ThreadPoolAsCompletedTests,
FutureTests,
ProcessPoolShutdownTest,
- ThreadPoolShutdownTest)
+ ThreadPoolShutdownTest,
+ )
finally:
test.support.reap_children()
diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_configparser.py
index a6e9050..8d82182 100644
--- a/Lib/test/test_cfgparser.py
+++ b/Lib/test/test_configparser.py
@@ -1618,6 +1618,42 @@ class ExceptionPicklingTestCase(unittest.TestCase):
self.assertEqual(repr(e1), repr(e2))
+class InlineCommentStrippingTestCase(unittest.TestCase):
+ """Tests for issue #14590: ConfigParser doesn't strip inline comment when
+ delimiter occurs earlier without preceding space.."""
+
+ def test_stripping(self):
+ cfg = configparser.ConfigParser(inline_comment_prefixes=(';', '#',
+ '//'))
+ cfg.read_string("""
+ [section]
+ k1 = v1;still v1
+ k2 = v2 ;a comment
+ k3 = v3 ; also a comment
+ k4 = v4;still v4 ;a comment
+ k5 = v5;still v5 ; also a comment
+ k6 = v6;still v6; and still v6 ;a comment
+ k7 = v7;still v7; and still v7 ; also a comment
+
+ [multiprefix]
+ k1 = v1;still v1 #a comment ; yeah, pretty much
+ k2 = v2 // this already is a comment ; continued
+ k3 = v3;#//still v3# and still v3 ; a comment
+ """)
+ s = cfg['section']
+ self.assertEqual(s['k1'], 'v1;still v1')
+ self.assertEqual(s['k2'], 'v2')
+ self.assertEqual(s['k3'], 'v3')
+ self.assertEqual(s['k4'], 'v4;still v4')
+ self.assertEqual(s['k5'], 'v5;still v5')
+ self.assertEqual(s['k6'], 'v6;still v6; and still v6')
+ self.assertEqual(s['k7'], 'v7;still v7; and still v7')
+ s = cfg['multiprefix']
+ self.assertEqual(s['k1'], 'v1;still v1')
+ self.assertEqual(s['k2'], 'v2')
+ self.assertEqual(s['k3'], 'v3;#//still v3# and still v3')
+
+
def test_main():
support.run_unittest(
ConfigParserTestCase,
@@ -1640,4 +1676,5 @@ def test_main():
ReadFileTestCase,
CoverageOneHundredTestCase,
ExceptionPicklingTestCase,
+ InlineCommentStrippingTestCase,
)
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
index 6e38305..e52ed91 100644
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -370,6 +370,231 @@ class TestContextDecorator(unittest.TestCase):
self.assertEqual(state, [1, 'something else', 999])
+class TestExitStack(unittest.TestCase):
+
+ def test_no_resources(self):
+ with ExitStack():
+ pass
+
+ def test_callback(self):
+ expected = [
+ ((), {}),
+ ((1,), {}),
+ ((1,2), {}),
+ ((), dict(example=1)),
+ ((1,), dict(example=1)),
+ ((1,2), dict(example=1)),
+ ]
+ result = []
+ def _exit(*args, **kwds):
+ """Test metadata propagation"""
+ result.append((args, kwds))
+ with ExitStack() as stack:
+ for args, kwds in reversed(expected):
+ if args and kwds:
+ f = stack.callback(_exit, *args, **kwds)
+ elif args:
+ f = stack.callback(_exit, *args)
+ elif kwds:
+ f = stack.callback(_exit, **kwds)
+ else:
+ f = stack.callback(_exit)
+ self.assertIs(f, _exit)
+ for wrapper in stack._exit_callbacks:
+ self.assertIs(wrapper.__wrapped__, _exit)
+ self.assertNotEqual(wrapper.__name__, _exit.__name__)
+ self.assertIsNone(wrapper.__doc__, _exit.__doc__)
+ self.assertEqual(result, expected)
+
+ def test_push(self):
+ exc_raised = ZeroDivisionError
+ def _expect_exc(exc_type, exc, exc_tb):
+ self.assertIs(exc_type, exc_raised)
+ def _suppress_exc(*exc_details):
+ return True
+ def _expect_ok(exc_type, exc, exc_tb):
+ self.assertIsNone(exc_type)
+ self.assertIsNone(exc)
+ self.assertIsNone(exc_tb)
+ class ExitCM(object):
+ def __init__(self, check_exc):
+ self.check_exc = check_exc
+ def __enter__(self):
+ self.fail("Should not be called!")
+ def __exit__(self, *exc_details):
+ self.check_exc(*exc_details)
+ with ExitStack() as stack:
+ stack.push(_expect_ok)
+ self.assertIs(stack._exit_callbacks[-1], _expect_ok)
+ cm = ExitCM(_expect_ok)
+ stack.push(cm)
+ self.assertIs(stack._exit_callbacks[-1].__self__, cm)
+ stack.push(_suppress_exc)
+ self.assertIs(stack._exit_callbacks[-1], _suppress_exc)
+ cm = ExitCM(_expect_exc)
+ stack.push(cm)
+ self.assertIs(stack._exit_callbacks[-1].__self__, cm)
+ stack.push(_expect_exc)
+ self.assertIs(stack._exit_callbacks[-1], _expect_exc)
+ stack.push(_expect_exc)
+ self.assertIs(stack._exit_callbacks[-1], _expect_exc)
+ 1/0
+
+ def test_enter_context(self):
+ class TestCM(object):
+ def __enter__(self):
+ result.append(1)
+ def __exit__(self, *exc_details):
+ result.append(3)
+
+ result = []
+ cm = TestCM()
+ with ExitStack() as stack:
+ @stack.callback # Registered first => cleaned up last
+ def _exit():
+ result.append(4)
+ self.assertIsNotNone(_exit)
+ stack.enter_context(cm)
+ self.assertIs(stack._exit_callbacks[-1].__self__, cm)
+ result.append(2)
+ self.assertEqual(result, [1, 2, 3, 4])
+
+ def test_close(self):
+ result = []
+ with ExitStack() as stack:
+ @stack.callback
+ def _exit():
+ result.append(1)
+ self.assertIsNotNone(_exit)
+ stack.close()
+ result.append(2)
+ self.assertEqual(result, [1, 2])
+
+ def test_pop_all(self):
+ result = []
+ with ExitStack() as stack:
+ @stack.callback
+ def _exit():
+ result.append(3)
+ self.assertIsNotNone(_exit)
+ new_stack = stack.pop_all()
+ result.append(1)
+ result.append(2)
+ new_stack.close()
+ self.assertEqual(result, [1, 2, 3])
+
+ def test_exit_raise(self):
+ with self.assertRaises(ZeroDivisionError):
+ with ExitStack() as stack:
+ stack.push(lambda *exc: False)
+ 1/0
+
+ def test_exit_suppress(self):
+ with ExitStack() as stack:
+ stack.push(lambda *exc: True)
+ 1/0
+
+ def test_exit_exception_chaining_reference(self):
+ # Sanity check to make sure that ExitStack chaining matches
+ # actual nested with statements
+ class RaiseExc:
+ def __init__(self, exc):
+ self.exc = exc
+ def __enter__(self):
+ return self
+ def __exit__(self, *exc_details):
+ raise self.exc
+
+ class RaiseExcWithContext:
+ def __init__(self, outer, inner):
+ self.outer = outer
+ self.inner = inner
+ def __enter__(self):
+ return self
+ def __exit__(self, *exc_details):
+ try:
+ raise self.inner
+ except:
+ raise self.outer
+
+ class SuppressExc:
+ def __enter__(self):
+ return self
+ def __exit__(self, *exc_details):
+ type(self).saved_details = exc_details
+ return True
+
+ try:
+ with RaiseExc(IndexError):
+ with RaiseExcWithContext(KeyError, AttributeError):
+ with SuppressExc():
+ with RaiseExc(ValueError):
+ 1 / 0
+ except IndexError as exc:
+ self.assertIsInstance(exc.__context__, KeyError)
+ self.assertIsInstance(exc.__context__.__context__, AttributeError)
+ # Inner exceptions were suppressed
+ self.assertIsNone(exc.__context__.__context__.__context__)
+ else:
+ self.fail("Expected IndexError, but no exception was raised")
+ # Check the inner exceptions
+ inner_exc = SuppressExc.saved_details[1]
+ self.assertIsInstance(inner_exc, ValueError)
+ self.assertIsInstance(inner_exc.__context__, ZeroDivisionError)
+
+ def test_exit_exception_chaining(self):
+ # Ensure exception chaining matches the reference behaviour
+ def raise_exc(exc):
+ raise exc
+
+ saved_details = None
+ def suppress_exc(*exc_details):
+ nonlocal saved_details
+ saved_details = exc_details
+ return True
+
+ try:
+ with ExitStack() as stack:
+ stack.callback(raise_exc, IndexError)
+ stack.callback(raise_exc, KeyError)
+ stack.callback(raise_exc, AttributeError)
+ stack.push(suppress_exc)
+ stack.callback(raise_exc, ValueError)
+ 1 / 0
+ except IndexError as exc:
+ self.assertIsInstance(exc.__context__, KeyError)
+ self.assertIsInstance(exc.__context__.__context__, AttributeError)
+ # Inner exceptions were suppressed
+ self.assertIsNone(exc.__context__.__context__.__context__)
+ else:
+ self.fail("Expected IndexError, but no exception was raised")
+ # Check the inner exceptions
+ inner_exc = saved_details[1]
+ self.assertIsInstance(inner_exc, ValueError)
+ self.assertIsInstance(inner_exc.__context__, ZeroDivisionError)
+
+ def test_exit_exception_chaining_suppress(self):
+ with ExitStack() as stack:
+ stack.push(lambda *exc: True)
+ stack.push(lambda *exc: 1/0)
+ stack.push(lambda *exc: {}[1])
+
+ def test_excessive_nesting(self):
+ # The original implementation would die with RecursionError here
+ with ExitStack() as stack:
+ for i in range(10000):
+ stack.callback(int)
+
+ def test_instance_bypass(self):
+ class Example(object): pass
+ cm = Example()
+ cm.__exit__ = object()
+ stack = ExitStack()
+ self.assertRaises(AttributeError, stack.enter_context, cm)
+ stack.push(cm)
+ self.assertIs(stack._exit_callbacks[-1], cm)
+
+
# This is needed to make the test actually run under regrtest.py!
def test_main():
support.run_unittest(__name__)
diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py
index a84c109..c4baae4 100644
--- a/Lib/test/test_copy.py
+++ b/Lib/test/test_copy.py
@@ -17,7 +17,7 @@ class TestCopy(unittest.TestCase):
# Attempt full line coverage of copy.py from top to bottom
def test_exceptions(self):
- self.assertTrue(copy.Error is copy.error)
+ self.assertIs(copy.Error, copy.error)
self.assertTrue(issubclass(copy.Error, Exception))
# The copy() method
@@ -54,20 +54,26 @@ class TestCopy(unittest.TestCase):
def test_copy_reduce_ex(self):
class C(object):
def __reduce_ex__(self, proto):
+ c.append(1)
return ""
def __reduce__(self):
- raise support.TestFailed("shouldn't call this")
+ self.fail("shouldn't call this")
+ c = []
x = C()
y = copy.copy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
+ self.assertEqual(c, [1])
def test_copy_reduce(self):
class C(object):
def __reduce__(self):
+ c.append(1)
return ""
+ c = []
x = C()
y = copy.copy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
+ self.assertEqual(c, [1])
def test_copy_cant(self):
class C(object):
@@ -91,7 +97,7 @@ class TestCopy(unittest.TestCase):
"hello", "hello\u1234", f.__code__,
NewStyle, range(10), Classic, max]
for x in tests:
- self.assertTrue(copy.copy(x) is x, repr(x))
+ self.assertIs(copy.copy(x), x)
def test_copy_list(self):
x = [1, 2, 3]
@@ -185,9 +191,9 @@ class TestCopy(unittest.TestCase):
x = [x, x]
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y[0] is not x[0])
- self.assertTrue(y[0] is y[1])
+ self.assertIsNot(y, x)
+ self.assertIsNot(y[0], x[0])
+ self.assertIs(y[0], y[1])
def test_deepcopy_issubclass(self):
# XXX Note: there's no way to test the TypeError coming out of
@@ -227,20 +233,26 @@ class TestCopy(unittest.TestCase):
def test_deepcopy_reduce_ex(self):
class C(object):
def __reduce_ex__(self, proto):
+ c.append(1)
return ""
def __reduce__(self):
- raise support.TestFailed("shouldn't call this")
+ self.fail("shouldn't call this")
+ c = []
x = C()
y = copy.deepcopy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
+ self.assertEqual(c, [1])
def test_deepcopy_reduce(self):
class C(object):
def __reduce__(self):
+ c.append(1)
return ""
+ c = []
x = C()
y = copy.deepcopy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
+ self.assertEqual(c, [1])
def test_deepcopy_cant(self):
class C(object):
@@ -264,14 +276,14 @@ class TestCopy(unittest.TestCase):
"hello", "hello\u1234", f.__code__,
NewStyle, range(10), Classic, max]
for x in tests:
- self.assertTrue(copy.deepcopy(x) is x, repr(x))
+ self.assertIs(copy.deepcopy(x), x)
def test_deepcopy_list(self):
x = [[1, 2], 3]
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(x is not y)
- self.assertTrue(x[0] is not y[0])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x[0], y[0])
def test_deepcopy_reflexive_list(self):
x = []
@@ -279,16 +291,26 @@ class TestCopy(unittest.TestCase):
y = copy.deepcopy(x)
for op in comparisons:
self.assertRaises(RuntimeError, op, y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y[0] is y)
+ self.assertIsNot(y, x)
+ self.assertIs(y[0], y)
self.assertEqual(len(y), 1)
+ def test_deepcopy_empty_tuple(self):
+ x = ()
+ y = copy.deepcopy(x)
+ self.assertIs(x, y)
+
def test_deepcopy_tuple(self):
x = ([1, 2], 3)
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(x is not y)
- self.assertTrue(x[0] is not y[0])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x[0], y[0])
+
+ def test_deepcopy_tuple_of_immutables(self):
+ x = ((1, 2), 3)
+ y = copy.deepcopy(x)
+ self.assertIs(x, y)
def test_deepcopy_reflexive_tuple(self):
x = ([],)
@@ -296,16 +318,16 @@ class TestCopy(unittest.TestCase):
y = copy.deepcopy(x)
for op in comparisons:
self.assertRaises(RuntimeError, op, y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y[0] is not x[0])
- self.assertTrue(y[0][0] is y)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y[0], x[0])
+ self.assertIs(y[0][0], y)
def test_deepcopy_dict(self):
x = {"foo": [1, 2], "bar": 3}
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(x is not y)
- self.assertTrue(x["foo"] is not y["foo"])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x["foo"], y["foo"])
def test_deepcopy_reflexive_dict(self):
x = {}
@@ -315,15 +337,30 @@ class TestCopy(unittest.TestCase):
self.assertRaises(TypeError, op, y, x)
for op in equality_comparisons:
self.assertRaises(RuntimeError, op, y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y['foo'] is y)
+ self.assertIsNot(y, x)
+ self.assertIs(y['foo'], y)
self.assertEqual(len(y), 1)
def test_deepcopy_keepalive(self):
memo = {}
- x = 42
+ x = []
+ y = copy.deepcopy(x, memo)
+ self.assertIs(memo[id(memo)][0], x)
+
+ def test_deepcopy_dont_memo_immutable(self):
+ memo = {}
+ x = [1, 2, 3, 4]
y = copy.deepcopy(x, memo)
- self.assertTrue(memo[id(x)] is x)
+ self.assertEqual(y, x)
+ # There's the entry for the new list, and the keep alive.
+ self.assertEqual(len(memo), 2)
+
+ memo = {}
+ x = [(1, 2)]
+ y = copy.deepcopy(x, memo)
+ self.assertEqual(y, x)
+ # Tuples with immutable contents are immutable for deepcopy.
+ self.assertEqual(len(memo), 2)
def test_deepcopy_inst_vanilla(self):
class C:
@@ -334,7 +371,7 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_inst_deepcopy(self):
class C:
@@ -347,8 +384,8 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_inst_getinitargs(self):
class C:
@@ -361,8 +398,8 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_inst_getstate(self):
class C:
@@ -375,8 +412,8 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_inst_setstate(self):
class C:
@@ -389,8 +426,8 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_inst_getstate_setstate(self):
class C:
@@ -405,8 +442,8 @@ class TestCopy(unittest.TestCase):
x = C([42])
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y, x)
+ self.assertIsNot(y.foo, x.foo)
def test_deepcopy_reflexive_inst(self):
class C:
@@ -414,8 +451,8 @@ class TestCopy(unittest.TestCase):
x = C()
x.foo = x
y = copy.deepcopy(x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is y)
+ self.assertIsNot(y, x)
+ self.assertIs(y.foo, y)
# _reconstruct()
@@ -425,9 +462,9 @@ class TestCopy(unittest.TestCase):
return ""
x = C()
y = copy.copy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
y = copy.deepcopy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
def test_reconstruct_nostate(self):
class C(object):
@@ -436,9 +473,9 @@ class TestCopy(unittest.TestCase):
x = C()
x.foo = 42
y = copy.copy(x)
- self.assertTrue(y.__class__ is x.__class__)
+ self.assertIs(y.__class__, x.__class__)
y = copy.deepcopy(x)
- self.assertTrue(y.__class__ is x.__class__)
+ self.assertIs(y.__class__, x.__class__)
def test_reconstruct_state(self):
class C(object):
@@ -452,7 +489,7 @@ class TestCopy(unittest.TestCase):
self.assertEqual(y, x)
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y.foo, x.foo)
def test_reconstruct_state_setstate(self):
class C(object):
@@ -468,7 +505,7 @@ class TestCopy(unittest.TestCase):
self.assertEqual(y, x)
y = copy.deepcopy(x)
self.assertEqual(y, x)
- self.assertTrue(y.foo is not x.foo)
+ self.assertIsNot(y.foo, x.foo)
def test_reconstruct_reflexive(self):
class C(object):
@@ -476,8 +513,8 @@ class TestCopy(unittest.TestCase):
x = C()
x.foo = x
y = copy.deepcopy(x)
- self.assertTrue(y is not x)
- self.assertTrue(y.foo is y)
+ self.assertIsNot(y, x)
+ self.assertIs(y.foo, y)
# Additions for Python 2.3 and pickle protocol 2
@@ -491,12 +528,12 @@ class TestCopy(unittest.TestCase):
x = C([[1, 2], 3])
y = copy.copy(x)
self.assertEqual(x, y)
- self.assertTrue(x is not y)
- self.assertTrue(x[0] is y[0])
+ self.assertIsNot(x, y)
+ self.assertIs(x[0], y[0])
y = copy.deepcopy(x)
self.assertEqual(x, y)
- self.assertTrue(x is not y)
- self.assertTrue(x[0] is not y[0])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x[0], y[0])
def test_reduce_5tuple(self):
class C(dict):
@@ -508,12 +545,12 @@ class TestCopy(unittest.TestCase):
x = C([("foo", [1, 2]), ("bar", 3)])
y = copy.copy(x)
self.assertEqual(x, y)
- self.assertTrue(x is not y)
- self.assertTrue(x["foo"] is y["foo"])
+ self.assertIsNot(x, y)
+ self.assertIs(x["foo"], y["foo"])
y = copy.deepcopy(x)
self.assertEqual(x, y)
- self.assertTrue(x is not y)
- self.assertTrue(x["foo"] is not y["foo"])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x["foo"], y["foo"])
def test_copy_slots(self):
class C(object):
@@ -521,7 +558,7 @@ class TestCopy(unittest.TestCase):
x = C()
x.foo = [42]
y = copy.copy(x)
- self.assertTrue(x.foo is y.foo)
+ self.assertIs(x.foo, y.foo)
def test_deepcopy_slots(self):
class C(object):
@@ -530,7 +567,7 @@ class TestCopy(unittest.TestCase):
x.foo = [42]
y = copy.deepcopy(x)
self.assertEqual(x.foo, y.foo)
- self.assertTrue(x.foo is not y.foo)
+ self.assertIsNot(x.foo, y.foo)
def test_deepcopy_dict_subclass(self):
class C(dict):
@@ -547,7 +584,7 @@ class TestCopy(unittest.TestCase):
y = copy.deepcopy(x)
self.assertEqual(x, y)
self.assertEqual(x._keys, y._keys)
- self.assertTrue(x is not y)
+ self.assertIsNot(x, y)
x['bar'] = 1
self.assertNotEqual(x, y)
self.assertNotEqual(x._keys, y._keys)
@@ -560,8 +597,8 @@ class TestCopy(unittest.TestCase):
y = copy.copy(x)
self.assertEqual(list(x), list(y))
self.assertEqual(x.foo, y.foo)
- self.assertTrue(x[0] is y[0])
- self.assertTrue(x.foo is y.foo)
+ self.assertIs(x[0], y[0])
+ self.assertIs(x.foo, y.foo)
def test_deepcopy_list_subclass(self):
class C(list):
@@ -571,8 +608,8 @@ class TestCopy(unittest.TestCase):
y = copy.deepcopy(x)
self.assertEqual(list(x), list(y))
self.assertEqual(x.foo, y.foo)
- self.assertTrue(x[0] is not y[0])
- self.assertTrue(x.foo is not y.foo)
+ self.assertIsNot(x[0], y[0])
+ self.assertIsNot(x.foo, y.foo)
def test_copy_tuple_subclass(self):
class C(tuple):
@@ -589,8 +626,8 @@ class TestCopy(unittest.TestCase):
self.assertEqual(tuple(x), ([1, 2], 3))
y = copy.deepcopy(x)
self.assertEqual(tuple(y), ([1, 2], 3))
- self.assertTrue(x is not y)
- self.assertTrue(x[0] is not y[0])
+ self.assertIsNot(x, y)
+ self.assertIsNot(x[0], y[0])
def test_getstate_exc(self):
class EvilState(object):
@@ -618,10 +655,10 @@ class TestCopy(unittest.TestCase):
obj = C()
x = weakref.ref(obj)
y = _copy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
del obj
y = _copy(x)
- self.assertTrue(y is x)
+ self.assertIs(y, x)
def test_copy_weakref(self):
self._check_weakref(copy.copy)
@@ -637,7 +674,7 @@ class TestCopy(unittest.TestCase):
u[a] = b
u[c] = d
v = copy.copy(u)
- self.assertFalse(v is u)
+ self.assertIsNot(v, u)
self.assertEqual(v, u)
self.assertEqual(v[a], b)
self.assertEqual(v[c], d)
@@ -667,8 +704,8 @@ class TestCopy(unittest.TestCase):
v = copy.deepcopy(u)
self.assertNotEqual(v, u)
self.assertEqual(len(v), 2)
- self.assertFalse(v[a] is b)
- self.assertFalse(v[c] is d)
+ self.assertIsNot(v[a], b)
+ self.assertIsNot(v[c], d)
self.assertEqual(v[a].i, b.i)
self.assertEqual(v[c].i, d.i)
del c
@@ -687,12 +724,12 @@ class TestCopy(unittest.TestCase):
self.assertNotEqual(v, u)
self.assertEqual(len(v), 2)
(x, y), (z, t) = sorted(v.items(), key=lambda pair: pair[0].i)
- self.assertFalse(x is a)
+ self.assertIsNot(x, a)
self.assertEqual(x.i, a.i)
- self.assertTrue(y is b)
- self.assertFalse(z is c)
+ self.assertIs(y, b)
+ self.assertIsNot(z, c)
self.assertEqual(z.i, c.i)
- self.assertTrue(t is d)
+ self.assertIs(t, d)
del x, y, z, t
del d
self.assertEqual(len(v), 1)
@@ -705,7 +742,7 @@ class TestCopy(unittest.TestCase):
f.b = f.m
g = copy.deepcopy(f)
self.assertEqual(g.m, g.b)
- self.assertTrue(g.b.__self__ is g)
+ self.assertIs(g.b.__self__, g)
g.b()
diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
index ae17c2b..5676668 100644
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -18,16 +18,19 @@ class CProfileTest(ProfileTest):
def test_bad_counter_during_dealloc(self):
import _lsprof
# Must use a file as StringIO doesn't trigger the bug.
- with open(TESTFN, 'w') as file:
- sys.stderr = file
- try:
- obj = _lsprof.Profiler(lambda: int)
- obj.enable()
- obj = _lsprof.Profiler(1)
- obj.disable()
- finally:
- sys.stderr = sys.__stderr__
- unlink(TESTFN)
+ orig_stderr = sys.stderr
+ try:
+ with open(TESTFN, 'w') as file:
+ sys.stderr = file
+ try:
+ obj = _lsprof.Profiler(lambda: int)
+ obj.enable()
+ obj = _lsprof.Profiler(1)
+ obj.disable()
+ finally:
+ sys.stderr = orig_stderr
+ finally:
+ unlink(TESTFN)
def test_main():
diff --git a/Lib/test/test_crashers.py b/Lib/test/test_crashers.py
new file mode 100644
index 0000000..336ccbe
--- /dev/null
+++ b/Lib/test/test_crashers.py
@@ -0,0 +1,38 @@
+# Tests that the crashers in the Lib/test/crashers directory actually
+# do crash the interpreter as expected
+#
+# If a crasher is fixed, it should be moved elsewhere in the test suite to
+# ensure it continues to work correctly.
+
+import unittest
+import glob
+import os.path
+import test.support
+from test.script_helper import assert_python_failure
+
+CRASHER_DIR = os.path.join(os.path.dirname(__file__), "crashers")
+CRASHER_FILES = os.path.join(CRASHER_DIR, "*.py")
+
+infinite_loops = ["infinite_loop_re.py", "nasty_eq_vs_dict.py"]
+
+class CrasherTest(unittest.TestCase):
+
+ @unittest.skip("these tests are too fragile")
+ @test.support.cpython_only
+ def test_crashers_crash(self):
+ for fname in glob.glob(CRASHER_FILES):
+ if os.path.basename(fname) in infinite_loops:
+ continue
+ # Some "crashers" only trigger an exception rather than a
+ # segfault. Consider that an acceptable outcome.
+ if test.support.verbose:
+ print("Checking crasher:", fname)
+ assert_python_failure(fname)
+
+
+def test_main():
+ test.support.run_unittest(CrasherTest)
+ test.support.reap_children()
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py
index 2adb28d..dc107d8 100644
--- a/Lib/test/test_crypt.py
+++ b/Lib/test/test_crypt.py
@@ -10,6 +10,25 @@ class CryptTestCase(unittest.TestCase):
if support.verbose:
print('Test encryption: ', c)
+ def test_salt(self):
+ self.assertEqual(len(crypt._saltchars), 64)
+ for method in crypt.methods:
+ salt = crypt.mksalt(method)
+ self.assertEqual(len(salt),
+ method.salt_chars + (3 if method.ident else 0))
+
+ def test_saltedcrypt(self):
+ for method in crypt.methods:
+ pw = crypt.crypt('assword', method)
+ self.assertEqual(len(pw), method.total_size)
+ pw = crypt.crypt('assword', crypt.mksalt(method))
+ self.assertEqual(len(pw), method.total_size)
+
+ def test_methods(self):
+ # Gurantee that METHOD_CRYPT is the last method in crypt.methods.
+ self.assertTrue(len(crypt.methods) >= 1)
+ self.assertEqual(crypt.METHOD_CRYPT, crypt.methods[-1])
+
def test_main():
support.run_unittest(CryptTestCase)
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 55796a2..96f8aa7 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -197,6 +197,17 @@ class Test_Csv(unittest.TestCase):
fileobj.seek(0)
self.assertEqual(fileobj.read(), "a,b\r\nc,d\r\n")
+ @support.cpython_only
+ def test_writerows_legacy_strings(self):
+ import _testcapi
+
+ c = _testcapi.unicode_legacy_string('a')
+ with TemporaryFile("w+", newline='') as fileobj:
+ writer = csv.writer(fileobj)
+ writer.writerows([[c]])
+ fileobj.seek(0)
+ self.assertEqual(fileobj.read(), "a\r\n")
+
def _read_test(self, input, expect, **kwargs):
reader = csv.reader(input, **kwargs)
result = list(reader)
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index 5812147..e959622 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -264,11 +264,53 @@ def test_issue6243(stdscr):
curses.ungetch(1025)
stdscr.getkey()
+def test_unget_wch(stdscr):
+ if not hasattr(curses, 'unget_wch'):
+ return
+ encoding = stdscr.encoding
+ for ch in ('a', '\xe9', '\u20ac', '\U0010FFFF'):
+ try:
+ ch.encode(encoding)
+ except UnicodeEncodeError:
+ continue
+ try:
+ curses.unget_wch(ch)
+ except Exception as err:
+ raise Exception("unget_wch(%a) failed with encoding %s: %s"
+ % (ch, stdscr.encoding, err))
+ read = stdscr.get_wch()
+ if read != ch:
+ raise AssertionError("%r != %r" % (read, ch))
+
+ code = ord(ch)
+ curses.unget_wch(code)
+ read = stdscr.get_wch()
+ if read != ch:
+ raise AssertionError("%r != %r" % (read, ch))
+
def test_issue10570():
b = curses.tparm(curses.tigetstr("cup"), 5, 3)
assert type(b) is bytes
curses.putp(b)
+def test_encoding(stdscr):
+ import codecs
+ encoding = stdscr.encoding
+ codecs.lookup(encoding)
+ try:
+ stdscr.encoding = 10
+ except TypeError:
+ pass
+ else:
+ raise AssertionError("TypeError not raised")
+ stdscr.encoding = encoding
+ try:
+ del stdscr.encoding
+ except TypeError:
+ pass
+ else:
+ raise AssertionError("TypeError not raised")
+
def main(stdscr):
curses.savetty()
try:
@@ -277,16 +319,18 @@ def main(stdscr):
test_userptr_without_set(stdscr)
test_resize_term(stdscr)
test_issue6243(stdscr)
+ test_unget_wch(stdscr)
test_issue10570()
+ test_encoding(stdscr)
finally:
curses.resetty()
def test_main():
- if not sys.stdout.isatty():
- raise unittest.SkipTest("sys.stdout is not a tty")
+ if not sys.__stdout__.isatty():
+ raise unittest.SkipTest("sys.__stdout__ is not a tty")
# testing setupterm() inside initscr/endwin
# causes terminal breakage
- curses.setupterm(fd=sys.stdout.fileno())
+ curses.setupterm(fd=sys.__stdout__.fileno())
try:
stdscr = curses.initscr()
main(stdscr)
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
index 26d4c14..02df7e3 100644
--- a/Lib/test/test_dbm.py
+++ b/Lib/test/test_dbm.py
@@ -71,8 +71,8 @@ class AnyDBMTestCase(unittest.TestCase):
f.close()
def test_anydbm_creation_n_file_exists_with_invalid_contents(self):
- with open(_fname, "w") as w:
- pass # create an empty file
+ # create an empty file
+ test.support.create_empty_file(_fname)
f = dbm.open(_fname, 'n')
self.addCleanup(f.close)
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 30d3971..5195930 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -16,7 +16,7 @@ test the pythonic behaviour according to PEP 327.
Cowlishaw's tests can be downloaded from:
- www2.hursley.ibm.com/decimal/dectest.zip
+ http://speleotrove.com/decimal/dectest.zip
This test module can be called from command line with one parameter (Arithmetic
or Behaviour) to test each part, or without parameter to test both parts. If
@@ -30,37 +30,75 @@ import operator
import warnings
import pickle, copy
import unittest
-from decimal import *
import numbers
+import locale
from test.support import (run_unittest, run_doctest, is_resource_enabled,
requires_IEEE_754)
-from test.support import check_warnings
+from test.support import (check_warnings, import_fresh_module, TestFailed,
+ run_with_locale, cpython_only)
import random
+import time
+import warnings
try:
import threading
except ImportError:
threading = None
-# Useful Test Constant
-Signals = tuple(getcontext().flags.keys())
+C = import_fresh_module('decimal', fresh=['_decimal'])
+P = import_fresh_module('decimal', blocked=['_decimal'])
+orig_sys_decimal = sys.modules['decimal']
+
+# fractions module must import the correct decimal module.
+cfractions = import_fresh_module('fractions', fresh=['fractions'])
+sys.modules['decimal'] = P
+pfractions = import_fresh_module('fractions', fresh=['fractions'])
+sys.modules['decimal'] = C
+fractions = {C:cfractions, P:pfractions}
+sys.modules['decimal'] = orig_sys_decimal
+
+
+# Useful Test Constant
+Signals = {
+ C: tuple(C.getcontext().flags.keys()) if C else None,
+ P: tuple(P.getcontext().flags.keys())
+}
# Signals ordered with respect to precedence: when an operation
# produces multiple signals, signals occurring later in the list
# should be handled before those occurring earlier in the list.
-OrderedSignals = (Clamped, Rounded, Inexact, Subnormal,
- Underflow, Overflow, DivisionByZero, InvalidOperation)
+OrderedSignals = {
+ C: [C.Clamped, C.Rounded, C.Inexact, C.Subnormal, C.Underflow,
+ C.Overflow, C.DivisionByZero, C.InvalidOperation,
+ C.FloatOperation] if C else None,
+ P: [P.Clamped, P.Rounded, P.Inexact, P.Subnormal, P.Underflow,
+ P.Overflow, P.DivisionByZero, P.InvalidOperation,
+ P.FloatOperation]
+}
+def assert_signals(cls, context, attr, expected):
+ d = getattr(context, attr)
+ cls.assertTrue(all(d[s] if s in expected else not d[s] for s in d))
+
+RoundingModes = {
+ C: (C.ROUND_UP, C.ROUND_DOWN, C.ROUND_CEILING, C.ROUND_FLOOR,
+ C.ROUND_HALF_UP, C.ROUND_HALF_DOWN, C.ROUND_HALF_EVEN,
+ C.ROUND_05UP) if C else None,
+ P: (P.ROUND_UP, P.ROUND_DOWN, P.ROUND_CEILING, P.ROUND_FLOOR,
+ P.ROUND_HALF_UP, P.ROUND_HALF_DOWN, P.ROUND_HALF_EVEN,
+ P.ROUND_05UP)
+}
# Tests are built around these assumed context defaults.
# test_main() restores the original context.
-def init():
- global ORIGINAL_CONTEXT
- ORIGINAL_CONTEXT = getcontext().copy()
- DefaultTestContext = Context(
- prec = 9,
- rounding = ROUND_HALF_EVEN,
- traps = dict.fromkeys(Signals, 0)
- )
- setcontext(DefaultTestContext)
+ORIGINAL_CONTEXT = {
+ C: C.getcontext().copy() if C else None,
+ P: P.getcontext().copy()
+}
+def init(m):
+ if not m: return
+ DefaultTestContext = m.Context(
+ prec=9, rounding=m.ROUND_HALF_EVEN, traps=dict.fromkeys(Signals[m], 0)
+ )
+ m.setcontext(DefaultTestContext)
TESTDATADIR = 'decimaltestdata'
if __name__ == '__main__':
@@ -72,149 +110,175 @@ directory = testdir + os.sep + TESTDATADIR + os.sep
skip_expected = not os.path.isdir(directory)
-# list of individual .decTest test ids that correspond to tests that
-# we're skipping for one reason or another.
-skipped_test_ids = set([
- # Skip implementation-specific scaleb tests.
- 'scbx164',
- 'scbx165',
-
- # For some operations (currently exp, ln, log10, power), the decNumber
- # reference implementation imposes additional restrictions on the context
- # and operands. These restrictions are not part of the specification;
- # however, the effect of these restrictions does show up in some of the
- # testcases. We skip testcases that violate these restrictions, since
- # Decimal behaves differently from decNumber for these testcases so these
- # testcases would otherwise fail.
- 'expx901',
- 'expx902',
- 'expx903',
- 'expx905',
- 'lnx901',
- 'lnx902',
- 'lnx903',
- 'lnx905',
- 'logx901',
- 'logx902',
- 'logx903',
- 'logx905',
- 'powx1183',
- 'powx1184',
- 'powx4001',
- 'powx4002',
- 'powx4003',
- 'powx4005',
- 'powx4008',
- 'powx4010',
- 'powx4012',
- 'powx4014',
- ])
-
# Make sure it actually raises errors when not expected and caught in flags
# Slower, since it runs some things several times.
EXTENDEDERRORTEST = False
-#Map the test cases' error names to the actual errors
-ErrorNames = {'clamped' : Clamped,
- 'conversion_syntax' : InvalidOperation,
- 'division_by_zero' : DivisionByZero,
- 'division_impossible' : InvalidOperation,
- 'division_undefined' : InvalidOperation,
- 'inexact' : Inexact,
- 'invalid_context' : InvalidOperation,
- 'invalid_operation' : InvalidOperation,
- 'overflow' : Overflow,
- 'rounded' : Rounded,
- 'subnormal' : Subnormal,
- 'underflow' : Underflow}
-
-
-def Nonfunction(*args):
- """Doesn't do anything."""
- return None
-
-RoundingDict = {'ceiling' : ROUND_CEILING, #Maps test-case names to roundings.
- 'down' : ROUND_DOWN,
- 'floor' : ROUND_FLOOR,
- 'half_down' : ROUND_HALF_DOWN,
- 'half_even' : ROUND_HALF_EVEN,
- 'half_up' : ROUND_HALF_UP,
- 'up' : ROUND_UP,
- '05up' : ROUND_05UP}
-
-# Name adapter to be able to change the Decimal and Context
-# interface without changing the test files from Cowlishaw
-nameAdapter = {'and':'logical_and',
- 'apply':'_apply',
- 'class':'number_class',
- 'comparesig':'compare_signal',
- 'comparetotal':'compare_total',
- 'comparetotmag':'compare_total_mag',
- 'copy':'copy_decimal',
- 'copyabs':'copy_abs',
- 'copynegate':'copy_negate',
- 'copysign':'copy_sign',
- 'divideint':'divide_int',
- 'invert':'logical_invert',
- 'iscanonical':'is_canonical',
- 'isfinite':'is_finite',
- 'isinfinite':'is_infinite',
- 'isnan':'is_nan',
- 'isnormal':'is_normal',
- 'isqnan':'is_qnan',
- 'issigned':'is_signed',
- 'issnan':'is_snan',
- 'issubnormal':'is_subnormal',
- 'iszero':'is_zero',
- 'maxmag':'max_mag',
- 'minmag':'min_mag',
- 'nextminus':'next_minus',
- 'nextplus':'next_plus',
- 'nexttoward':'next_toward',
- 'or':'logical_or',
- 'reduce':'normalize',
- 'remaindernear':'remainder_near',
- 'samequantum':'same_quantum',
- 'squareroot':'sqrt',
- 'toeng':'to_eng_string',
- 'tointegral':'to_integral_value',
- 'tointegralx':'to_integral_exact',
- 'tosci':'to_sci_string',
- 'xor':'logical_xor',
- }
-
-# The following functions return True/False rather than a Decimal instance
-
-LOGICAL_FUNCTIONS = (
- 'is_canonical',
- 'is_finite',
- 'is_infinite',
- 'is_nan',
- 'is_normal',
- 'is_qnan',
- 'is_signed',
- 'is_snan',
- 'is_subnormal',
- 'is_zero',
- 'same_quantum',
- )
+# Test extra functionality in the C version (-DEXTRA_FUNCTIONALITY).
+EXTRA_FUNCTIONALITY = True if hasattr(C, 'DecClamped') else False
+requires_extra_functionality = unittest.skipUnless(
+ EXTRA_FUNCTIONALITY, "test requires build with -DEXTRA_FUNCTIONALITY")
+skip_if_extra_functionality = unittest.skipIf(
+ EXTRA_FUNCTIONALITY, "test requires regular build")
-class DecimalTest(unittest.TestCase):
- """Class which tests the Decimal class against the test cases.
- Changed for unittest.
- """
+class IBMTestCases(unittest.TestCase):
+ """Class which tests the Decimal class against the IBM test cases."""
+
def setUp(self):
- self.context = Context()
+ self.context = self.decimal.Context()
+ self.readcontext = self.decimal.Context()
self.ignore_list = ['#']
- # Basically, a # means return NaN InvalidOperation.
- # Different from a sNaN in trim
+ # List of individual .decTest test ids that correspond to tests that
+ # we're skipping for one reason or another.
+ self.skipped_test_ids = set([
+ # Skip implementation-specific scaleb tests.
+ 'scbx164',
+ 'scbx165',
+
+ # For some operations (currently exp, ln, log10, power), the decNumber
+ # reference implementation imposes additional restrictions on the context
+ # and operands. These restrictions are not part of the specification;
+ # however, the effect of these restrictions does show up in some of the
+ # testcases. We skip testcases that violate these restrictions, since
+ # Decimal behaves differently from decNumber for these testcases so these
+ # testcases would otherwise fail.
+ 'expx901',
+ 'expx902',
+ 'expx903',
+ 'expx905',
+ 'lnx901',
+ 'lnx902',
+ 'lnx903',
+ 'lnx905',
+ 'logx901',
+ 'logx902',
+ 'logx903',
+ 'logx905',
+ 'powx1183',
+ 'powx1184',
+ 'powx4001',
+ 'powx4002',
+ 'powx4003',
+ 'powx4005',
+ 'powx4008',
+ 'powx4010',
+ 'powx4012',
+ 'powx4014',
+ ])
+
+ if self.decimal == C:
+ # status has additional Subnormal, Underflow
+ self.skipped_test_ids.add('pwsx803')
+ self.skipped_test_ids.add('pwsx805')
+ # Correct rounding (skipped for decNumber, too)
+ self.skipped_test_ids.add('powx4302')
+ self.skipped_test_ids.add('powx4303')
+ self.skipped_test_ids.add('powx4342')
+ self.skipped_test_ids.add('powx4343')
+ # http://bugs.python.org/issue7049
+ self.skipped_test_ids.add('pwmx325')
+ self.skipped_test_ids.add('pwmx326')
+
+ # Map test directives to setter functions.
self.ChangeDict = {'precision' : self.change_precision,
- 'rounding' : self.change_rounding_method,
- 'maxexponent' : self.change_max_exponent,
- 'minexponent' : self.change_min_exponent,
- 'clamp' : self.change_clamp}
+ 'rounding' : self.change_rounding_method,
+ 'maxexponent' : self.change_max_exponent,
+ 'minexponent' : self.change_min_exponent,
+ 'clamp' : self.change_clamp}
+
+ # Name adapter to be able to change the Decimal and Context
+ # interface without changing the test files from Cowlishaw.
+ self.NameAdapter = {'and':'logical_and',
+ 'apply':'_apply',
+ 'class':'number_class',
+ 'comparesig':'compare_signal',
+ 'comparetotal':'compare_total',
+ 'comparetotmag':'compare_total_mag',
+ 'copy':'copy_decimal',
+ 'copyabs':'copy_abs',
+ 'copynegate':'copy_negate',
+ 'copysign':'copy_sign',
+ 'divideint':'divide_int',
+ 'invert':'logical_invert',
+ 'iscanonical':'is_canonical',
+ 'isfinite':'is_finite',
+ 'isinfinite':'is_infinite',
+ 'isnan':'is_nan',
+ 'isnormal':'is_normal',
+ 'isqnan':'is_qnan',
+ 'issigned':'is_signed',
+ 'issnan':'is_snan',
+ 'issubnormal':'is_subnormal',
+ 'iszero':'is_zero',
+ 'maxmag':'max_mag',
+ 'minmag':'min_mag',
+ 'nextminus':'next_minus',
+ 'nextplus':'next_plus',
+ 'nexttoward':'next_toward',
+ 'or':'logical_or',
+ 'reduce':'normalize',
+ 'remaindernear':'remainder_near',
+ 'samequantum':'same_quantum',
+ 'squareroot':'sqrt',
+ 'toeng':'to_eng_string',
+ 'tointegral':'to_integral_value',
+ 'tointegralx':'to_integral_exact',
+ 'tosci':'to_sci_string',
+ 'xor':'logical_xor'}
+
+ # Map test-case names to roundings.
+ self.RoundingDict = {'ceiling' : self.decimal.ROUND_CEILING,
+ 'down' : self.decimal.ROUND_DOWN,
+ 'floor' : self.decimal.ROUND_FLOOR,
+ 'half_down' : self.decimal.ROUND_HALF_DOWN,
+ 'half_even' : self.decimal.ROUND_HALF_EVEN,
+ 'half_up' : self.decimal.ROUND_HALF_UP,
+ 'up' : self.decimal.ROUND_UP,
+ '05up' : self.decimal.ROUND_05UP}
+
+ # Map the test cases' error names to the actual errors.
+ self.ErrorNames = {'clamped' : self.decimal.Clamped,
+ 'conversion_syntax' : self.decimal.InvalidOperation,
+ 'division_by_zero' : self.decimal.DivisionByZero,
+ 'division_impossible' : self.decimal.InvalidOperation,
+ 'division_undefined' : self.decimal.InvalidOperation,
+ 'inexact' : self.decimal.Inexact,
+ 'invalid_context' : self.decimal.InvalidOperation,
+ 'invalid_operation' : self.decimal.InvalidOperation,
+ 'overflow' : self.decimal.Overflow,
+ 'rounded' : self.decimal.Rounded,
+ 'subnormal' : self.decimal.Subnormal,
+ 'underflow' : self.decimal.Underflow}
+
+ # The following functions return True/False rather than a
+ # Decimal instance.
+ self.LogicalFunctions = ('is_canonical',
+ 'is_finite',
+ 'is_infinite',
+ 'is_nan',
+ 'is_normal',
+ 'is_qnan',
+ 'is_signed',
+ 'is_snan',
+ 'is_subnormal',
+ 'is_zero',
+ 'same_quantum')
+
+ def read_unlimited(self, v, context):
+ """Work around the limitations of the 32-bit _decimal version. The
+ guaranteed maximum values for prec, Emax etc. are 425000000,
+ but higher values usually work, except for rare corner cases.
+ In particular, all of the IBM tests pass with maximum values
+ of 1070000000."""
+ if self.decimal == C and self.decimal.MAX_EMAX == 425000000:
+ self.readcontext._unsafe_setprec(1070000000)
+ self.readcontext._unsafe_setemax(1070000000)
+ self.readcontext._unsafe_setemin(-1070000000)
+ return self.readcontext.create_decimal(v)
+ else:
+ return self.decimal.Decimal(v, context)
def eval_file(self, file):
global skip_expected
@@ -227,7 +291,7 @@ class DecimalTest(unittest.TestCase):
#print line
try:
t = self.eval_line(line)
- except DecimalException as exception:
+ except self.decimal.DecimalException as exception:
#Exception raised where there shouldn't have been one.
self.fail('Exception "'+exception.__class__.__name__ + '" raised on line '+line)
@@ -254,23 +318,23 @@ class DecimalTest(unittest.TestCase):
def eval_directive(self, s):
funct, value = (x.strip().lower() for x in s.split(':'))
if funct == 'rounding':
- value = RoundingDict[value]
+ value = self.RoundingDict[value]
else:
try:
value = int(value)
except ValueError:
pass
- funct = self.ChangeDict.get(funct, Nonfunction)
+ funct = self.ChangeDict.get(funct, (lambda *args: None))
funct(value)
def eval_equation(self, s):
- #global DEFAULT_PRECISION
- #print DEFAULT_PRECISION
if not TEST_ALL and random.random() < 0.90:
return
+ self.context.clear_flags()
+
try:
Sides = s.split('->')
L = Sides[0].strip().split()
@@ -283,26 +347,26 @@ class DecimalTest(unittest.TestCase):
ans = L[0]
exceptions = L[1:]
except (TypeError, AttributeError, IndexError):
- raise InvalidOperation
+ raise self.decimal.InvalidOperation
def FixQuotes(val):
val = val.replace("''", 'SingleQuote').replace('""', 'DoubleQuote')
val = val.replace("'", '').replace('"', '')
val = val.replace('SingleQuote', "'").replace('DoubleQuote', '"')
return val
- if id in skipped_test_ids:
+ if id in self.skipped_test_ids:
return
- fname = nameAdapter.get(funct, funct)
+ fname = self.NameAdapter.get(funct, funct)
if fname == 'rescale':
return
funct = getattr(self.context, fname)
vals = []
conglomerate = ''
quote = 0
- theirexceptions = [ErrorNames[x.lower()] for x in exceptions]
+ theirexceptions = [self.ErrorNames[x.lower()] for x in exceptions]
- for exception in Signals:
+ for exception in Signals[self.decimal]:
self.context.traps[exception] = 1 #Catch these bugs...
for exception in theirexceptions:
self.context.traps[exception] = 0
@@ -324,7 +388,7 @@ class DecimalTest(unittest.TestCase):
funct(self.context.create_decimal(v))
except error:
pass
- except Signals as e:
+ except Signals[self.decimal] as e:
self.fail("Raised %s in %s when %s disabled" % \
(e, s, error))
else:
@@ -332,7 +396,7 @@ class DecimalTest(unittest.TestCase):
self.context.traps[error] = 0
v = self.context.create_decimal(v)
else:
- v = Decimal(v, self.context)
+ v = self.read_unlimited(v, self.context)
vals.append(v)
ans = FixQuotes(ans)
@@ -344,7 +408,7 @@ class DecimalTest(unittest.TestCase):
funct(*vals)
except error:
pass
- except Signals as e:
+ except Signals[self.decimal] as e:
self.fail("Raised %s in %s when %s disabled" % \
(e, s, error))
else:
@@ -352,14 +416,14 @@ class DecimalTest(unittest.TestCase):
self.context.traps[error] = 0
# as above, but add traps cumulatively, to check precedence
- ordered_errors = [e for e in OrderedSignals if e in theirexceptions]
+ ordered_errors = [e for e in OrderedSignals[self.decimal] if e in theirexceptions]
for error in ordered_errors:
self.context.traps[error] = 1
try:
funct(*vals)
except error:
pass
- except Signals as e:
+ except Signals[self.decimal] as e:
self.fail("Raised %s in %s; expected %s" %
(type(e), s, error))
else:
@@ -373,54 +437,69 @@ class DecimalTest(unittest.TestCase):
print("--", self.context)
try:
result = str(funct(*vals))
- if fname in LOGICAL_FUNCTIONS:
+ if fname in self.LogicalFunctions:
result = str(int(eval(result))) # 'True', 'False' -> '1', '0'
- except Signals as error:
+ except Signals[self.decimal] as error:
self.fail("Raised %s in %s" % (error, s))
except: #Catch any error long enough to state the test case.
print("ERROR:", s)
raise
myexceptions = self.getexceptions()
- self.context.clear_flags()
myexceptions.sort(key=repr)
theirexceptions.sort(key=repr)
self.assertEqual(result, ans,
'Incorrect answer for ' + s + ' -- got ' + result)
+
self.assertEqual(myexceptions, theirexceptions,
'Incorrect flags set in ' + s + ' -- got ' + str(myexceptions))
return
def getexceptions(self):
- return [e for e in Signals if self.context.flags[e]]
+ return [e for e in Signals[self.decimal] if self.context.flags[e]]
def change_precision(self, prec):
- self.context.prec = prec
+ if self.decimal == C and self.decimal.MAX_PREC == 425000000:
+ self.context._unsafe_setprec(prec)
+ else:
+ self.context.prec = prec
def change_rounding_method(self, rounding):
self.context.rounding = rounding
def change_min_exponent(self, exp):
- self.context.Emin = exp
+ if self.decimal == C and self.decimal.MAX_PREC == 425000000:
+ self.context._unsafe_setemin(exp)
+ else:
+ self.context.Emin = exp
def change_max_exponent(self, exp):
- self.context.Emax = exp
+ if self.decimal == C and self.decimal.MAX_PREC == 425000000:
+ self.context._unsafe_setemax(exp)
+ else:
+ self.context.Emax = exp
def change_clamp(self, clamp):
self.context.clamp = clamp
-
+class CIBMTestCases(IBMTestCases):
+ decimal = C
+class PyIBMTestCases(IBMTestCases):
+ decimal = P
# The following classes test the behaviour of Decimal according to PEP 327
-class DecimalExplicitConstructionTest(unittest.TestCase):
+class ExplicitConstructionTest(unittest.TestCase):
'''Unit tests for Explicit Construction cases of Decimal.'''
def test_explicit_empty(self):
+ Decimal = self.decimal.Decimal
self.assertEqual(Decimal(), Decimal("0"))
def test_explicit_from_None(self):
+ Decimal = self.decimal.Decimal
self.assertRaises(TypeError, Decimal, None)
def test_explicit_from_int(self):
+ Decimal = self.decimal.Decimal
#positive
d = Decimal(45)
@@ -438,7 +517,18 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
d = Decimal(0)
self.assertEqual(str(d), '0')
+ # single word longs
+ for n in range(0, 32):
+ for sign in (-1, 1):
+ for x in range(-5, 5):
+ i = sign * (2**n + x)
+ d = Decimal(i)
+ self.assertEqual(str(d), str(i))
+
def test_explicit_from_string(self):
+ Decimal = self.decimal.Decimal
+ InvalidOperation = self.decimal.InvalidOperation
+ localcontext = self.decimal.localcontext
#empty
self.assertEqual(str(Decimal('')), 'NaN')
@@ -458,8 +548,44 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
#leading and trailing whitespace permitted
self.assertEqual(str(Decimal('1.3E4 \n')), '1.3E+4')
self.assertEqual(str(Decimal(' -7.89')), '-7.89')
+ self.assertEqual(str(Decimal(" 3.45679 ")), '3.45679')
+
+ # unicode whitespace
+ for lead in ["", ' ', '\u00a0', '\u205f']:
+ for trail in ["", ' ', '\u00a0', '\u205f']:
+ self.assertEqual(str(Decimal(lead + '9.311E+28' + trail)),
+ '9.311E+28')
+
+ with localcontext() as c:
+ c.traps[InvalidOperation] = True
+ # Invalid string
+ self.assertRaises(InvalidOperation, Decimal, "xyz")
+ # Two arguments max
+ self.assertRaises(TypeError, Decimal, "1234", "x", "y")
+
+ # space within the numeric part
+ self.assertRaises(InvalidOperation, Decimal, "1\u00a02\u00a03")
+ self.assertRaises(InvalidOperation, Decimal, "\u00a01\u00a02\u00a0")
+
+ # unicode whitespace
+ self.assertRaises(InvalidOperation, Decimal, "\u00a0")
+ self.assertRaises(InvalidOperation, Decimal, "\u00a0\u00a0")
+
+ # embedded NUL
+ self.assertRaises(InvalidOperation, Decimal, "12\u00003")
+
+ @cpython_only
+ def test_from_legacy_strings(self):
+ import _testcapi
+ Decimal = self.decimal.Decimal
+ context = self.decimal.Context()
+
+ s = _testcapi.unicode_legacy_string('9.999999')
+ self.assertEqual(str(Decimal(s)), '9.999999')
+ self.assertEqual(str(context.create_decimal(s)), '9.999999')
def test_explicit_from_tuples(self):
+ Decimal = self.decimal.Decimal
#zero
d = Decimal( (0, (0,), 0) )
@@ -477,6 +603,10 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
d = Decimal( (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) )
self.assertEqual(str(d), '-4.34913534E-17')
+ #inf
+ d = Decimal( (0, (), "F") )
+ self.assertEqual(str(d), 'Infinity')
+
#wrong number of items
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1)) )
@@ -491,45 +621,63 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 9, 1), '1') )
#bad coefficients
+ self.assertRaises(ValueError, Decimal, (1, "xyz", 2) )
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, None, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, -3, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, 10, 4, 9, 1), 2) )
self.assertRaises(ValueError, Decimal, (1, (4, 3, 4, 'a', 1), 2) )
+ def test_explicit_from_list(self):
+ Decimal = self.decimal.Decimal
+
+ d = Decimal([0, [0], 0])
+ self.assertEqual(str(d), '0')
+
+ d = Decimal([1, [4, 3, 4, 9, 1, 3, 5, 3, 4], -25])
+ self.assertEqual(str(d), '-4.34913534E-17')
+
+ d = Decimal([1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25])
+ self.assertEqual(str(d), '-4.34913534E-17')
+
+ d = Decimal((1, [4, 3, 4, 9, 1, 3, 5, 3, 4], -25))
+ self.assertEqual(str(d), '-4.34913534E-17')
+
def test_explicit_from_bool(self):
+ Decimal = self.decimal.Decimal
+
self.assertIs(bool(Decimal(0)), False)
self.assertIs(bool(Decimal(1)), True)
self.assertEqual(Decimal(False), Decimal(0))
self.assertEqual(Decimal(True), Decimal(1))
def test_explicit_from_Decimal(self):
+ Decimal = self.decimal.Decimal
#positive
d = Decimal(45)
e = Decimal(d)
self.assertEqual(str(e), '45')
- self.assertNotEqual(id(d), id(e))
#very large positive
d = Decimal(500000123)
e = Decimal(d)
self.assertEqual(str(e), '500000123')
- self.assertNotEqual(id(d), id(e))
#negative
d = Decimal(-45)
e = Decimal(d)
self.assertEqual(str(e), '-45')
- self.assertNotEqual(id(d), id(e))
#zero
d = Decimal(0)
e = Decimal(d)
self.assertEqual(str(e), '0')
- self.assertNotEqual(id(d), id(e))
@requires_IEEE_754
def test_explicit_from_float(self):
+
+ Decimal = self.decimal.Decimal
+
r = Decimal(0.1)
self.assertEqual(type(r), Decimal)
self.assertEqual(str(r),
@@ -550,8 +698,11 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
self.assertEqual(x, float(Decimal(x))) # roundtrip
def test_explicit_context_create_decimal(self):
+ Decimal = self.decimal.Decimal
+ InvalidOperation = self.decimal.InvalidOperation
+ Rounded = self.decimal.Rounded
- nc = copy.copy(getcontext())
+ nc = copy.copy(self.decimal.getcontext())
nc.prec = 3
# empty
@@ -592,7 +743,73 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
d = nc.create_decimal(prevdec)
self.assertEqual(str(d), '5.00E+8')
+ # more integers
+ nc.prec = 28
+ nc.traps[InvalidOperation] = True
+
+ for v in [-2**63-1, -2**63, -2**31-1, -2**31, 0,
+ 2**31-1, 2**31, 2**63-1, 2**63]:
+ d = nc.create_decimal(v)
+ self.assertTrue(isinstance(d, Decimal))
+ self.assertEqual(int(d), v)
+
+ nc.prec = 3
+ nc.traps[Rounded] = True
+ self.assertRaises(Rounded, nc.create_decimal, 1234)
+
+ # from string
+ nc.prec = 28
+ self.assertEqual(str(nc.create_decimal('0E-017')), '0E-17')
+ self.assertEqual(str(nc.create_decimal('45')), '45')
+ self.assertEqual(str(nc.create_decimal('-Inf')), '-Infinity')
+ self.assertEqual(str(nc.create_decimal('NaN123')), 'NaN123')
+
+ # invalid arguments
+ self.assertRaises(InvalidOperation, nc.create_decimal, "xyz")
+ self.assertRaises(ValueError, nc.create_decimal, (1, "xyz", -25))
+ self.assertRaises(TypeError, nc.create_decimal, "1234", "5678")
+
+ # too many NaN payload digits
+ nc.prec = 3
+ self.assertRaises(InvalidOperation, nc.create_decimal, 'NaN12345')
+ self.assertRaises(InvalidOperation, nc.create_decimal,
+ Decimal('NaN12345'))
+
+ nc.traps[InvalidOperation] = False
+ self.assertEqual(str(nc.create_decimal('NaN12345')), 'NaN')
+ self.assertTrue(nc.flags[InvalidOperation])
+
+ nc.flags[InvalidOperation] = False
+ self.assertEqual(str(nc.create_decimal(Decimal('NaN12345'))), 'NaN')
+ self.assertTrue(nc.flags[InvalidOperation])
+
+ def test_explicit_context_create_from_float(self):
+
+ Decimal = self.decimal.Decimal
+
+ nc = self.decimal.Context()
+ r = nc.create_decimal(0.1)
+ self.assertEqual(type(r), Decimal)
+ self.assertEqual(str(r), '0.1000000000000000055511151231')
+ self.assertTrue(nc.create_decimal(float('nan')).is_qnan())
+ self.assertTrue(nc.create_decimal(float('inf')).is_infinite())
+ self.assertTrue(nc.create_decimal(float('-inf')).is_infinite())
+ self.assertEqual(str(nc.create_decimal(float('nan'))),
+ str(nc.create_decimal('NaN')))
+ self.assertEqual(str(nc.create_decimal(float('inf'))),
+ str(nc.create_decimal('Infinity')))
+ self.assertEqual(str(nc.create_decimal(float('-inf'))),
+ str(nc.create_decimal('-Infinity')))
+ self.assertEqual(str(nc.create_decimal(float('-0.0'))),
+ str(nc.create_decimal('-0')))
+ nc.prec = 100
+ for i in range(200):
+ x = random.expovariate(0.01) * (random.random() * 2.0 - 1.0)
+ self.assertEqual(x, float(nc.create_decimal(x))) # roundtrip
+
def test_unicode_digits(self):
+ Decimal = self.decimal.Decimal
+
test_values = {
'\uff11': '1',
'\u0660.\u0660\u0663\u0667\u0662e-\u0663' : '0.0000372',
@@ -601,29 +818,41 @@ class DecimalExplicitConstructionTest(unittest.TestCase):
for input, expected in test_values.items():
self.assertEqual(str(Decimal(input)), expected)
+class CExplicitConstructionTest(ExplicitConstructionTest):
+ decimal = C
+class PyExplicitConstructionTest(ExplicitConstructionTest):
+ decimal = P
-class DecimalImplicitConstructionTest(unittest.TestCase):
+class ImplicitConstructionTest(unittest.TestCase):
'''Unit tests for Implicit Construction cases of Decimal.'''
def test_implicit_from_None(self):
- self.assertRaises(TypeError, eval, 'Decimal(5) + None', globals())
+ Decimal = self.decimal.Decimal
+ self.assertRaises(TypeError, eval, 'Decimal(5) + None', locals())
def test_implicit_from_int(self):
+ Decimal = self.decimal.Decimal
+
#normal
self.assertEqual(str(Decimal(5) + 45), '50')
#exceeding precision
self.assertEqual(Decimal(5) + 123456789000, Decimal(123456789000))
def test_implicit_from_string(self):
- self.assertRaises(TypeError, eval, 'Decimal(5) + "3"', globals())
+ Decimal = self.decimal.Decimal
+ self.assertRaises(TypeError, eval, 'Decimal(5) + "3"', locals())
def test_implicit_from_float(self):
- self.assertRaises(TypeError, eval, 'Decimal(5) + 2.2', globals())
+ Decimal = self.decimal.Decimal
+ self.assertRaises(TypeError, eval, 'Decimal(5) + 2.2', locals())
def test_implicit_from_Decimal(self):
+ Decimal = self.decimal.Decimal
self.assertEqual(Decimal(5) + Decimal(45), Decimal(50))
def test_rop(self):
+ Decimal = self.decimal.Decimal
+
# Allow other classes to be trained to interact with Decimals
class E:
def __divmod__(self, other):
@@ -671,10 +900,16 @@ class DecimalImplicitConstructionTest(unittest.TestCase):
self.assertEqual(eval('Decimal(10)' + sym + 'E()'),
'10' + rop + 'str')
+class CImplicitConstructionTest(ImplicitConstructionTest):
+ decimal = C
+class PyImplicitConstructionTest(ImplicitConstructionTest):
+ decimal = P
-class DecimalFormatTest(unittest.TestCase):
+class FormatTest(unittest.TestCase):
'''Unit tests for the format function.'''
def test_formatting(self):
+ Decimal = self.decimal.Decimal
+
# triples giving a format, a Decimal, and the expected result
test_values = [
('e', '0E-15', '0e-15'),
@@ -730,6 +965,7 @@ class DecimalFormatTest(unittest.TestCase):
('g', '0E-7', '0e-7'),
('g', '-0E2', '-0e+2'),
('.0g', '3.14159265', '3'), # 0 sig fig -> 1 sig fig
+ ('.0n', '3.14159265', '3'), # same for 'n'
('.1g', '3.14159265', '3'),
('.2g', '3.14159265', '3.1'),
('.5g', '3.14159265', '3.1416'),
@@ -814,56 +1050,60 @@ class DecimalFormatTest(unittest.TestCase):
# issue 6850
('a=-7.0', '0.12345', 'aaaa0.1'),
-
- # Issue 7094: Alternate formatting (specified by #)
- ('.0e', '1.0', '1e+0'),
- ('#.0e', '1.0', '1.e+0'),
- ('.0f', '1.0', '1'),
- ('#.0f', '1.0', '1.'),
- ('g', '1.1', '1.1'),
- ('#g', '1.1', '1.1'),
- ('.0g', '1', '1'),
- ('#.0g', '1', '1.'),
- ('.0%', '1.0', '100%'),
- ('#.0%', '1.0', '100.%'),
]
for fmt, d, result in test_values:
self.assertEqual(format(Decimal(d), fmt), result)
+ # bytes format argument
+ self.assertRaises(TypeError, Decimal(1).__format__, b'-020')
+
def test_n_format(self):
+ Decimal = self.decimal.Decimal
+
try:
from locale import CHAR_MAX
except ImportError:
return
+ def make_grouping(lst):
+ return ''.join([chr(x) for x in lst]) if self.decimal == C else lst
+
+ def get_fmt(x, override=None, fmt='n'):
+ if self.decimal == C:
+ return Decimal(x).__format__(fmt, override)
+ else:
+ return Decimal(x).__format__(fmt, _localeconv=override)
+
# Set up some localeconv-like dictionaries
en_US = {
'decimal_point' : '.',
- 'grouping' : [3, 3, 0],
- 'thousands_sep': ','
+ 'grouping' : make_grouping([3, 3, 0]),
+ 'thousands_sep' : ','
}
fr_FR = {
'decimal_point' : ',',
- 'grouping' : [CHAR_MAX],
+ 'grouping' : make_grouping([CHAR_MAX]),
'thousands_sep' : ''
}
ru_RU = {
'decimal_point' : ',',
- 'grouping' : [3, 3, 0],
+ 'grouping': make_grouping([3, 3, 0]),
'thousands_sep' : ' '
}
crazy = {
'decimal_point' : '&',
- 'grouping' : [1, 4, 2, CHAR_MAX],
+ 'grouping': make_grouping([1, 4, 2, CHAR_MAX]),
'thousands_sep' : '-'
}
-
- def get_fmt(x, locale, fmt='n'):
- return Decimal.__format__(Decimal(x), fmt, _localeconv=locale)
+ dotsep_wide = {
+ 'decimal_point' : b'\xc2\xbf'.decode('utf-8'),
+ 'grouping': make_grouping([3, 3, 0]),
+ 'thousands_sep' : b'\xc2\xb4'.decode('utf-8')
+ }
self.assertEqual(get_fmt(Decimal('12.7'), en_US), '12.7')
self.assertEqual(get_fmt(Decimal('12.7'), fr_FR), '12,7')
@@ -902,11 +1142,34 @@ class DecimalFormatTest(unittest.TestCase):
self.assertEqual(get_fmt(123456, crazy, '012n'), '00-01-2345-6')
self.assertEqual(get_fmt(123456, crazy, '013n'), '000-01-2345-6')
+ # wide char separator and decimal point
+ self.assertEqual(get_fmt(Decimal('-1.5'), dotsep_wide, '020n'),
+ '-0\u00b4000\u00b4000\u00b4000\u00b4001\u00bf5')
+
+ @run_with_locale('LC_ALL', 'ps_AF')
+ def test_wide_char_separator_decimal_point(self):
+ # locale with wide char separator and decimal point
+ import locale
+ Decimal = self.decimal.Decimal
-class DecimalArithmeticOperatorsTest(unittest.TestCase):
+ decimal_point = locale.localeconv()['decimal_point']
+ thousands_sep = locale.localeconv()['thousands_sep']
+ if decimal_point != '\u066b' or thousands_sep != '\u066c':
+ return
+
+ self.assertEqual(format(Decimal('100000000.123'), 'n'),
+ '100\u066c000\u066c000\u066b123')
+
+class CFormatTest(FormatTest):
+ decimal = C
+class PyFormatTest(FormatTest):
+ decimal = P
+
+class ArithmeticOperatorsTest(unittest.TestCase):
'''Unit tests for all arithmetic operators, binary and unary.'''
def test_addition(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('-11.1')
d2 = Decimal('22.2')
@@ -934,6 +1197,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('16.1'))
def test_subtraction(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('-11.1')
d2 = Decimal('22.2')
@@ -961,6 +1225,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('-38.3'))
def test_multiplication(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('-5')
d2 = Decimal('3')
@@ -988,6 +1253,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('-75'))
def test_division(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('-5')
d2 = Decimal('2')
@@ -1015,6 +1281,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('-0.625'))
def test_floor_division(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('5')
d2 = Decimal('2')
@@ -1042,6 +1309,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('1'))
def test_powering(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('5')
d2 = Decimal('2')
@@ -1069,6 +1337,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('390625'))
def test_module(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('5')
d2 = Decimal('2')
@@ -1096,6 +1365,7 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(d1, Decimal('1'))
def test_floor_div_module(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('5')
d2 = Decimal('2')
@@ -1122,6 +1392,8 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertEqual(type(q), type(d1))
def test_unary_operators(self):
+ Decimal = self.decimal.Decimal
+
self.assertEqual(+Decimal(45), Decimal(+45)) # +
self.assertEqual(-Decimal(45), Decimal(-45)) # -
self.assertEqual(abs(Decimal(45)), abs(Decimal(-45))) # abs
@@ -1134,6 +1406,9 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
# equality comparisons (==, !=) involving only quiet nans
# don't signal, but return False or True respectively.
+ Decimal = self.decimal.Decimal
+ InvalidOperation = self.decimal.InvalidOperation
+ localcontext = self.decimal.localcontext
n = Decimal('NaN')
s = Decimal('sNaN')
@@ -1179,53 +1454,124 @@ class DecimalArithmeticOperatorsTest(unittest.TestCase):
self.assertRaises(InvalidOperation, op, x, y)
def test_copy_sign(self):
- d = Decimal(1).copy_sign(Decimal(-2))
+ Decimal = self.decimal.Decimal
+ d = Decimal(1).copy_sign(Decimal(-2))
self.assertEqual(Decimal(1).copy_sign(-2), d)
self.assertRaises(TypeError, Decimal(1).copy_sign, '-2')
+class CArithmeticOperatorsTest(ArithmeticOperatorsTest):
+ decimal = C
+class PyArithmeticOperatorsTest(ArithmeticOperatorsTest):
+ decimal = P
+
# The following are two functions used to test threading in the next class
def thfunc1(cls):
+ Decimal = cls.decimal.Decimal
+ InvalidOperation = cls.decimal.InvalidOperation
+ DivisionByZero = cls.decimal.DivisionByZero
+ Overflow = cls.decimal.Overflow
+ Underflow = cls.decimal.Underflow
+ Inexact = cls.decimal.Inexact
+ getcontext = cls.decimal.getcontext
+ localcontext = cls.decimal.localcontext
+
d1 = Decimal(1)
d3 = Decimal(3)
test1 = d1/d3
- cls.synchro.wait()
- test2 = d1/d3
+
cls.finish1.set()
+ cls.synchro.wait()
- cls.assertEqual(test1, Decimal('0.3333333333333333333333333333'))
- cls.assertEqual(test2, Decimal('0.3333333333333333333333333333'))
+ test2 = d1/d3
+ with localcontext() as c2:
+ cls.assertTrue(c2.flags[Inexact])
+ cls.assertRaises(DivisionByZero, c2.divide, d1, 0)
+ cls.assertTrue(c2.flags[DivisionByZero])
+ with localcontext() as c3:
+ cls.assertTrue(c3.flags[Inexact])
+ cls.assertTrue(c3.flags[DivisionByZero])
+ cls.assertRaises(InvalidOperation, c3.compare, d1, Decimal('sNaN'))
+ cls.assertTrue(c3.flags[InvalidOperation])
+ del c3
+ cls.assertFalse(c2.flags[InvalidOperation])
+ del c2
+
+ cls.assertEqual(test1, Decimal('0.333333333333333333333333'))
+ cls.assertEqual(test2, Decimal('0.333333333333333333333333'))
+
+ c1 = getcontext()
+ cls.assertTrue(c1.flags[Inexact])
+ for sig in Overflow, Underflow, DivisionByZero, InvalidOperation:
+ cls.assertFalse(c1.flags[sig])
return
def thfunc2(cls):
+ Decimal = cls.decimal.Decimal
+ InvalidOperation = cls.decimal.InvalidOperation
+ DivisionByZero = cls.decimal.DivisionByZero
+ Overflow = cls.decimal.Overflow
+ Underflow = cls.decimal.Underflow
+ Inexact = cls.decimal.Inexact
+ getcontext = cls.decimal.getcontext
+ localcontext = cls.decimal.localcontext
+
d1 = Decimal(1)
d3 = Decimal(3)
test1 = d1/d3
+
thiscontext = getcontext()
thiscontext.prec = 18
test2 = d1/d3
+
+ with localcontext() as c2:
+ cls.assertTrue(c2.flags[Inexact])
+ cls.assertRaises(Overflow, c2.multiply, Decimal('1e425000000'), 999)
+ cls.assertTrue(c2.flags[Overflow])
+ with localcontext(thiscontext) as c3:
+ cls.assertTrue(c3.flags[Inexact])
+ cls.assertFalse(c3.flags[Overflow])
+ c3.traps[Underflow] = True
+ cls.assertRaises(Underflow, c3.divide, Decimal('1e-425000000'), 999)
+ cls.assertTrue(c3.flags[Underflow])
+ del c3
+ cls.assertFalse(c2.flags[Underflow])
+ cls.assertFalse(c2.traps[Underflow])
+ del c2
+
cls.synchro.set()
cls.finish2.set()
- cls.assertEqual(test1, Decimal('0.3333333333333333333333333333'))
+ cls.assertEqual(test1, Decimal('0.333333333333333333333333'))
cls.assertEqual(test2, Decimal('0.333333333333333333'))
- return
-
-class DecimalUseOfContextTest(unittest.TestCase):
- '''Unit tests for Use of Context cases in Decimal.'''
+ cls.assertFalse(thiscontext.traps[Underflow])
+ cls.assertTrue(thiscontext.flags[Inexact])
+ for sig in Overflow, Underflow, DivisionByZero, InvalidOperation:
+ cls.assertFalse(thiscontext.flags[sig])
+ return
- try:
- import threading
- except ImportError:
- threading = None
+class ThreadingTest(unittest.TestCase):
+ '''Unit tests for thread local contexts in Decimal.'''
# Take care executing this test from IDLE, there's an issue in threading
# that hangs IDLE and I couldn't find it
def test_threading(self):
- #Test the "threading isolation" of a Context.
+ DefaultContext = self.decimal.DefaultContext
+
+ if self.decimal == C and not self.decimal.HAVE_THREADS:
+ self.skipTest("compiled without threading")
+ # Test the "threading isolation" of a Context. Also test changing
+ # the DefaultContext, which acts as a template for the thread-local
+ # contexts.
+ save_prec = DefaultContext.prec
+ save_emax = DefaultContext.Emax
+ save_emin = DefaultContext.Emin
+ DefaultContext.prec = 24
+ DefaultContext.Emax = 425000000
+ DefaultContext.Emin = -425000000
self.synchro = threading.Event()
self.finish1 = threading.Event()
@@ -1239,17 +1585,29 @@ class DecimalUseOfContextTest(unittest.TestCase):
self.finish1.wait()
self.finish2.wait()
- return
- if threading is None:
- del test_threading
+ for sig in Signals[self.decimal]:
+ self.assertFalse(DefaultContext.flags[sig])
+
+ DefaultContext.prec = save_prec
+ DefaultContext.Emax = save_emax
+ DefaultContext.Emin = save_emin
+ return
+@unittest.skipUnless(threading, 'threading required')
+class CThreadingTest(ThreadingTest):
+ decimal = C
+@unittest.skipUnless(threading, 'threading required')
+class PyThreadingTest(ThreadingTest):
+ decimal = P
-class DecimalUsabilityTest(unittest.TestCase):
+class UsabilityTest(unittest.TestCase):
'''Unit tests for Usability cases of Decimal.'''
def test_comparison_operators(self):
+ Decimal = self.decimal.Decimal
+
da = Decimal('23.42')
db = Decimal('23.42')
dc = Decimal('45')
@@ -1283,6 +1641,8 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertEqual(a, b)
def test_decimal_float_comparison(self):
+ Decimal = self.decimal.Decimal
+
da = Decimal('0.25')
db = Decimal('3.0')
self.assertLess(da, 3.0)
@@ -1299,7 +1659,71 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertEqual(3.0, db)
self.assertNotEqual(0.1, Decimal('0.1'))
+ def test_decimal_complex_comparison(self):
+ Decimal = self.decimal.Decimal
+
+ da = Decimal('0.25')
+ db = Decimal('3.0')
+ self.assertNotEqual(da, (1.5+0j))
+ self.assertNotEqual((1.5+0j), da)
+ self.assertEqual(da, (0.25+0j))
+ self.assertEqual((0.25+0j), da)
+ self.assertEqual((3.0+0j), db)
+ self.assertEqual(db, (3.0+0j))
+
+ self.assertNotEqual(db, (3.0+1j))
+ self.assertNotEqual((3.0+1j), db)
+
+ self.assertIs(db.__lt__(3.0+0j), NotImplemented)
+ self.assertIs(db.__le__(3.0+0j), NotImplemented)
+ self.assertIs(db.__gt__(3.0+0j), NotImplemented)
+ self.assertIs(db.__le__(3.0+0j), NotImplemented)
+
+ def test_decimal_fraction_comparison(self):
+ D = self.decimal.Decimal
+ F = fractions[self.decimal].Fraction
+ Context = self.decimal.Context
+ localcontext = self.decimal.localcontext
+ InvalidOperation = self.decimal.InvalidOperation
+
+
+ emax = C.MAX_EMAX if C else 999999999
+ emin = C.MIN_EMIN if C else -999999999
+ etiny = C.MIN_ETINY if C else -1999999997
+ c = Context(Emax=emax, Emin=emin)
+
+ with localcontext(c):
+ c.prec = emax
+ self.assertLess(D(0), F(1,9999999999999999999999999999999999999))
+ self.assertLess(F(-1,9999999999999999999999999999999999999), D(0))
+ self.assertLess(F(0,1), D("1e" + str(etiny)))
+ self.assertLess(D("-1e" + str(etiny)), F(0,1))
+ self.assertLess(F(0,9999999999999999999999999), D("1e" + str(etiny)))
+ self.assertLess(D("-1e" + str(etiny)), F(0,9999999999999999999999999))
+
+ self.assertEqual(D("0.1"), F(1,10))
+ self.assertEqual(F(1,10), D("0.1"))
+
+ c.prec = 300
+ self.assertNotEqual(D(1)/3, F(1,3))
+ self.assertNotEqual(F(1,3), D(1)/3)
+
+ self.assertLessEqual(F(120984237, 9999999999), D("9e" + str(emax)))
+ self.assertGreaterEqual(D("9e" + str(emax)), F(120984237, 9999999999))
+
+ self.assertGreater(D('inf'), F(99999999999,123))
+ self.assertGreater(D('inf'), F(-99999999999,123))
+ self.assertLess(D('-inf'), F(99999999999,123))
+ self.assertLess(D('-inf'), F(-99999999999,123))
+
+ self.assertRaises(InvalidOperation, D('nan').__gt__, F(-9,123))
+ self.assertIs(NotImplemented, F(-9,123).__lt__(D('nan')))
+ self.assertNotEqual(D('nan'), F(-9,123))
+ self.assertNotEqual(F(-9,123), D('nan'))
+
def test_copy_and_deepcopy_methods(self):
+ Decimal = self.decimal.Decimal
+
d = Decimal('43.24')
c = copy.copy(d)
self.assertEqual(id(c), id(d))
@@ -1307,6 +1731,10 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertEqual(id(dc), id(d))
def test_hash_method(self):
+
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+
def hashit(d):
a = hash(d)
b = d.__hash__()
@@ -1367,24 +1795,27 @@ class DecimalUsabilityTest(unittest.TestCase):
d = Decimal(s)
self.assertEqual(hashit(f), hashit(d))
- # check that the value of the hash doesn't depend on the
- # current context (issue #1757)
- c = getcontext()
- old_precision = c.prec
- x = Decimal("123456789.1")
+ with localcontext() as c:
+ # check that the value of the hash doesn't depend on the
+ # current context (issue #1757)
+ x = Decimal("123456789.1")
- c.prec = 6
- h1 = hashit(x)
- c.prec = 10
- h2 = hashit(x)
- c.prec = 16
- h3 = hashit(x)
+ c.prec = 6
+ h1 = hashit(x)
+ c.prec = 10
+ h2 = hashit(x)
+ c.prec = 16
+ h3 = hashit(x)
- self.assertEqual(h1, h2)
- self.assertEqual(h1, h3)
- c.prec = old_precision
+ self.assertEqual(h1, h2)
+ self.assertEqual(h1, h3)
+
+ c.prec = 10000
+ x = 1100 ** 1248
+ self.assertEqual(hashit(Decimal(x)), hashit(x))
def test_min_and_max_methods(self):
+ Decimal = self.decimal.Decimal
d1 = Decimal('15.32')
d2 = Decimal('28.5')
@@ -1404,6 +1835,8 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertIs(max(d2,l1), d2)
def test_as_nonzero(self):
+ Decimal = self.decimal.Decimal
+
#as false
self.assertFalse(Decimal(0))
#as true
@@ -1411,6 +1844,7 @@ class DecimalUsabilityTest(unittest.TestCase):
def test_tostring_methods(self):
#Test str and repr methods.
+ Decimal = self.decimal.Decimal
d = Decimal('15.32')
self.assertEqual(str(d), '15.32') # str
@@ -1418,6 +1852,7 @@ class DecimalUsabilityTest(unittest.TestCase):
def test_tonum_methods(self):
#Test float and int methods.
+ Decimal = self.decimal.Decimal
d1 = Decimal('66')
d2 = Decimal('15.32')
@@ -1440,6 +1875,7 @@ class DecimalUsabilityTest(unittest.TestCase):
('-11.0', -11),
('0.0', 0),
('-0E3', 0),
+ ('89891211712379812736.1', 89891211712379812736),
]
for d, i in test_pairs:
self.assertEqual(math.floor(Decimal(d)), i)
@@ -1459,6 +1895,7 @@ class DecimalUsabilityTest(unittest.TestCase):
('-11.0', -11),
('0.0', 0),
('-0E3', 0),
+ ('89891211712379812736.1', 89891211712379812737),
]
for d, i in test_pairs:
self.assertEqual(math.ceil(Decimal(d)), i)
@@ -1519,16 +1956,21 @@ class DecimalUsabilityTest(unittest.TestCase):
def test_nan_to_float(self):
# Test conversions of decimal NANs to float.
# See http://bugs.python.org/issue15544
+ Decimal = self.decimal.Decimal
for s in ('nan', 'nan1234', '-nan', '-nan2468'):
f = float(Decimal(s))
self.assertTrue(math.isnan(f))
+ sign = math.copysign(1.0, f)
+ self.assertEqual(sign, -1.0 if s.startswith('-') else 1.0)
def test_snan_to_float(self):
+ Decimal = self.decimal.Decimal
for s in ('snan', '-snan', 'snan1357', '-snan1234'):
d = Decimal(s)
self.assertRaises(ValueError, float, d)
def test_eval_round_trip(self):
+ Decimal = self.decimal.Decimal
#with zero
d = Decimal( (0, (0,), 0) )
@@ -1547,6 +1989,7 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertEqual(d, eval(repr(d)))
def test_as_tuple(self):
+ Decimal = self.decimal.Decimal
#with zero
d = Decimal(0)
@@ -1560,7 +2003,8 @@ class DecimalUsabilityTest(unittest.TestCase):
d = Decimal("-4.34913534E-17")
self.assertEqual(d.as_tuple(), (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) )
- #inf
+ # The '0' coefficient is implementation specific to decimal.py.
+ # It has no meaning in the C-version and is ignored there.
d = Decimal("Infinity")
self.assertEqual(d.as_tuple(), (0, (0,), 'F') )
@@ -1580,90 +2024,21 @@ class DecimalUsabilityTest(unittest.TestCase):
d = Decimal( (1, (), 'n') )
self.assertEqual(d.as_tuple(), (1, (), 'n') )
- #coefficient in infinity should be ignored
+ # For infinities, decimal.py has always silently accepted any
+ # coefficient tuple.
+ d = Decimal( (0, (0,), 'F') )
+ self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
d = Decimal( (0, (4, 5, 3, 4), 'F') )
self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
d = Decimal( (1, (0, 2, 7, 1), 'F') )
self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
- def test_immutability_operations(self):
- # Do operations and check that it didn't change change internal objects.
-
- d1 = Decimal('-25e55')
- b1 = Decimal('-25e55')
- d2 = Decimal('33e+33')
- b2 = Decimal('33e+33')
-
- def checkSameDec(operation, useOther=False):
- if useOther:
- eval("d1." + operation + "(d2)")
- self.assertEqual(d1._sign, b1._sign)
- self.assertEqual(d1._int, b1._int)
- self.assertEqual(d1._exp, b1._exp)
- self.assertEqual(d2._sign, b2._sign)
- self.assertEqual(d2._int, b2._int)
- self.assertEqual(d2._exp, b2._exp)
- else:
- eval("d1." + operation + "()")
- self.assertEqual(d1._sign, b1._sign)
- self.assertEqual(d1._int, b1._int)
- self.assertEqual(d1._exp, b1._exp)
- return
-
- Decimal(d1)
- self.assertEqual(d1._sign, b1._sign)
- self.assertEqual(d1._int, b1._int)
- self.assertEqual(d1._exp, b1._exp)
-
- checkSameDec("__abs__")
- checkSameDec("__add__", True)
- checkSameDec("__divmod__", True)
- checkSameDec("__eq__", True)
- checkSameDec("__ne__", True)
- checkSameDec("__le__", True)
- checkSameDec("__lt__", True)
- checkSameDec("__ge__", True)
- checkSameDec("__gt__", True)
- checkSameDec("__float__")
- checkSameDec("__floordiv__", True)
- checkSameDec("__hash__")
- checkSameDec("__int__")
- checkSameDec("__trunc__")
- checkSameDec("__mod__", True)
- checkSameDec("__mul__", True)
- checkSameDec("__neg__")
- checkSameDec("__bool__")
- checkSameDec("__pos__")
- checkSameDec("__pow__", True)
- checkSameDec("__radd__", True)
- checkSameDec("__rdivmod__", True)
- checkSameDec("__repr__")
- checkSameDec("__rfloordiv__", True)
- checkSameDec("__rmod__", True)
- checkSameDec("__rmul__", True)
- checkSameDec("__rpow__", True)
- checkSameDec("__rsub__", True)
- checkSameDec("__str__")
- checkSameDec("__sub__", True)
- checkSameDec("__truediv__", True)
- checkSameDec("adjusted")
- checkSameDec("as_tuple")
- checkSameDec("compare", True)
- checkSameDec("max", True)
- checkSameDec("min", True)
- checkSameDec("normalize")
- checkSameDec("quantize", True)
- checkSameDec("remainder_near", True)
- checkSameDec("same_quantum", True)
- checkSameDec("sqrt")
- checkSameDec("to_eng_string")
- checkSameDec("to_integral")
-
def test_subclassing(self):
# Different behaviours when subclassing Decimal
+ Decimal = self.decimal.Decimal
class MyDecimal(Decimal):
- pass
+ y = None
d1 = MyDecimal(1)
d2 = MyDecimal(2)
@@ -1673,7 +2048,42 @@ class DecimalUsabilityTest(unittest.TestCase):
d = d1.max(d2)
self.assertIs(type(d), Decimal)
+ d = copy.copy(d1)
+ self.assertIs(type(d), MyDecimal)
+ self.assertEqual(d, d1)
+
+ d = copy.deepcopy(d1)
+ self.assertIs(type(d), MyDecimal)
+ self.assertEqual(d, d1)
+
+ # Decimal(Decimal)
+ d = Decimal('1.0')
+ x = Decimal(d)
+ self.assertIs(type(x), Decimal)
+ self.assertEqual(x, d)
+
+ # MyDecimal(Decimal)
+ m = MyDecimal(d)
+ self.assertIs(type(m), MyDecimal)
+ self.assertEqual(m, d)
+ self.assertIs(m.y, None)
+
+ # Decimal(MyDecimal)
+ x = Decimal(m)
+ self.assertIs(type(x), Decimal)
+ self.assertEqual(x, d)
+
+ # MyDecimal(MyDecimal)
+ m.y = 9
+ x = MyDecimal(m)
+ self.assertIs(type(x), MyDecimal)
+ self.assertEqual(x, d)
+ self.assertIs(x.y, None)
+
def test_implicit_context(self):
+ Decimal = self.decimal.Decimal
+ getcontext = self.decimal.getcontext
+
# Check results when context given implicitly. (Issue 2478)
c = getcontext()
self.assertEqual(str(Decimal(0).sqrt()),
@@ -1682,6 +2092,8 @@ class DecimalUsabilityTest(unittest.TestCase):
def test_conversions_from_int(self):
# Check that methods taking a second Decimal argument will
# always accept an integer in place of a Decimal.
+ Decimal = self.decimal.Decimal
+
self.assertEqual(Decimal(4).compare(3),
Decimal(4).compare(Decimal(3)))
self.assertEqual(Decimal(4).compare_signal(3),
@@ -1726,22 +2138,58 @@ class DecimalUsabilityTest(unittest.TestCase):
self.assertEqual(Decimal(-12).fma(45, Decimal(67)),
Decimal(-12).fma(Decimal(45), Decimal(67)))
+class CUsabilityTest(UsabilityTest):
+ decimal = C
+class PyUsabilityTest(UsabilityTest):
+ decimal = P
-class DecimalPythonAPItests(unittest.TestCase):
+class PythonAPItests(unittest.TestCase):
def test_abc(self):
+ Decimal = self.decimal.Decimal
+
self.assertTrue(issubclass(Decimal, numbers.Number))
self.assertFalse(issubclass(Decimal, numbers.Real))
self.assertIsInstance(Decimal(0), numbers.Number)
self.assertNotIsInstance(Decimal(0), numbers.Real)
def test_pickle(self):
+ Decimal = self.decimal.Decimal
+
+ savedecimal = sys.modules['decimal']
+
+ # Round trip
+ sys.modules['decimal'] = self.decimal
d = Decimal('-3.141590000')
p = pickle.dumps(d)
e = pickle.loads(p)
self.assertEqual(d, e)
+ if C:
+ # Test interchangeability
+ x = C.Decimal('-3.123e81723')
+ y = P.Decimal('-3.123e81723')
+
+ sys.modules['decimal'] = C
+ sx = pickle.dumps(x)
+ sys.modules['decimal'] = P
+ r = pickle.loads(sx)
+ self.assertIsInstance(r, P.Decimal)
+ self.assertEqual(r, y)
+
+ sys.modules['decimal'] = P
+ sy = pickle.dumps(y)
+ sys.modules['decimal'] = C
+ r = pickle.loads(sy)
+ self.assertIsInstance(r, C.Decimal)
+ self.assertEqual(r, x)
+
+ sys.modules['decimal'] = savedecimal
+
def test_int(self):
+ Decimal = self.decimal.Decimal
+ ROUND_DOWN = self.decimal.ROUND_DOWN
+
for x in range(-250, 250):
s = '%0.2f' % (x / 100.0)
# should work the same as for floats
@@ -1757,6 +2205,9 @@ class DecimalPythonAPItests(unittest.TestCase):
self.assertRaises(OverflowError, int, Decimal('-inf'))
def test_trunc(self):
+ Decimal = self.decimal.Decimal
+ ROUND_DOWN = self.decimal.ROUND_DOWN
+
for x in range(-250, 250):
s = '%0.2f' % (x / 100.0)
# should work the same as for floats
@@ -1768,9 +2219,13 @@ class DecimalPythonAPItests(unittest.TestCase):
def test_from_float(self):
- class MyDecimal(Decimal):
+ Decimal = self.decimal.Decimal
+
+ class MyDecimal(Decimal):
pass
+ self.assertTrue(issubclass(MyDecimal, Decimal))
+
r = MyDecimal.from_float(0.1)
self.assertEqual(type(r), MyDecimal)
self.assertEqual(str(r),
@@ -1792,6 +2247,12 @@ class DecimalPythonAPItests(unittest.TestCase):
self.assertEqual(x, float(MyDecimal.from_float(x))) # roundtrip
def test_create_decimal_from_float(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ ROUND_DOWN = self.decimal.ROUND_DOWN
+ ROUND_UP = self.decimal.ROUND_UP
+ Inexact = self.decimal.Inexact
+
context = Context(prec=5, rounding=ROUND_DOWN)
self.assertEqual(
context.create_decimal_from_float(math.pi),
@@ -1815,27 +2276,289 @@ class DecimalPythonAPItests(unittest.TestCase):
self.assertEqual(repr(context.create_decimal_from_float(10)),
"Decimal('10')")
+ def test_quantize(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ InvalidOperation = self.decimal.InvalidOperation
+ ROUND_DOWN = self.decimal.ROUND_DOWN
+
+ c = Context(Emax=99999, Emin=-99999)
+ self.assertEqual(
+ Decimal('7.335').quantize(Decimal('.01')),
+ Decimal('7.34')
+ )
+ self.assertEqual(
+ Decimal('7.335').quantize(Decimal('.01'), rounding=ROUND_DOWN),
+ Decimal('7.33')
+ )
+ self.assertRaises(
+ InvalidOperation,
+ Decimal("10e99999").quantize, Decimal('1e100000'), context=c
+ )
+
+ c = Context()
+ d = Decimal("0.871831e800")
+ x = d.quantize(context=c, exp=Decimal("1e797"), rounding=ROUND_DOWN)
+ self.assertEqual(x, Decimal('8.71E+799'))
+
+ def test_complex(self):
+ Decimal = self.decimal.Decimal
+
+ x = Decimal("9.8182731e181273")
+ self.assertEqual(x.real, x)
+ self.assertEqual(x.imag, 0)
+ self.assertEqual(x.conjugate(), x)
+
+ x = Decimal("1")
+ self.assertEqual(complex(x), complex(float(1)))
+
+ self.assertRaises(AttributeError, setattr, x, 'real', 100)
+ self.assertRaises(AttributeError, setattr, x, 'imag', 100)
+ self.assertRaises(AttributeError, setattr, x, 'conjugate', 100)
+ self.assertRaises(AttributeError, setattr, x, '__complex__', 100)
+
+ def test_named_parameters(self):
+ D = self.decimal.Decimal
+ Context = self.decimal.Context
+ localcontext = self.decimal.localcontext
+ InvalidOperation = self.decimal.InvalidOperation
+ Overflow = self.decimal.Overflow
+
+ xc = Context()
+ xc.prec = 1
+ xc.Emax = 1
+ xc.Emin = -1
+
+ with localcontext() as c:
+ c.clear_flags()
+
+ self.assertEqual(D(9, xc), 9)
+ self.assertEqual(D(9, context=xc), 9)
+ self.assertEqual(D(context=xc, value=9), 9)
+ self.assertEqual(D(context=xc), 0)
+ xc.clear_flags()
+ self.assertRaises(InvalidOperation, D, "xyz", context=xc)
+ self.assertTrue(xc.flags[InvalidOperation])
+ self.assertFalse(c.flags[InvalidOperation])
+
+ xc.clear_flags()
+ self.assertEqual(D(2).exp(context=xc), 7)
+ self.assertRaises(Overflow, D(8).exp, context=xc)
+ self.assertTrue(xc.flags[Overflow])
+ self.assertFalse(c.flags[Overflow])
+
+ xc.clear_flags()
+ self.assertEqual(D(2).ln(context=xc), D('0.7'))
+ self.assertRaises(InvalidOperation, D(-1).ln, context=xc)
+ self.assertTrue(xc.flags[InvalidOperation])
+ self.assertFalse(c.flags[InvalidOperation])
+
+ self.assertEqual(D(0).log10(context=xc), D('-inf'))
+ self.assertEqual(D(-1).next_minus(context=xc), -2)
+ self.assertEqual(D(-1).next_plus(context=xc), D('-0.9'))
+ self.assertEqual(D("9.73").normalize(context=xc), D('1E+1'))
+ self.assertEqual(D("9999").to_integral(context=xc), 9999)
+ self.assertEqual(D("-2000").to_integral_exact(context=xc), -2000)
+ self.assertEqual(D("123").to_integral_value(context=xc), 123)
+ self.assertEqual(D("0.0625").sqrt(context=xc), D('0.2'))
+
+ self.assertEqual(D("0.0625").compare(context=xc, other=3), -1)
+ xc.clear_flags()
+ self.assertRaises(InvalidOperation,
+ D("0").compare_signal, D('nan'), context=xc)
+ self.assertTrue(xc.flags[InvalidOperation])
+ self.assertFalse(c.flags[InvalidOperation])
+ self.assertEqual(D("0.01").max(D('0.0101'), context=xc), D('0.0'))
+ self.assertEqual(D("0.01").max(D('0.0101'), context=xc), D('0.0'))
+ self.assertEqual(D("0.2").max_mag(D('-0.3'), context=xc),
+ D('-0.3'))
+ self.assertEqual(D("0.02").min(D('-0.03'), context=xc), D('-0.0'))
+ self.assertEqual(D("0.02").min_mag(D('-0.03'), context=xc),
+ D('0.0'))
+ self.assertEqual(D("0.2").next_toward(D('-1'), context=xc), D('0.1'))
+ xc.clear_flags()
+ self.assertRaises(InvalidOperation,
+ D("0.2").quantize, D('1e10'), context=xc)
+ self.assertTrue(xc.flags[InvalidOperation])
+ self.assertFalse(c.flags[InvalidOperation])
+ self.assertEqual(D("9.99").remainder_near(D('1.5'), context=xc),
+ D('-0.5'))
+
+ self.assertEqual(D("9.9").fma(third=D('0.9'), context=xc, other=7),
+ D('7E+1'))
+
+ self.assertRaises(TypeError, D(1).is_canonical, context=xc)
+ self.assertRaises(TypeError, D(1).is_finite, context=xc)
+ self.assertRaises(TypeError, D(1).is_infinite, context=xc)
+ self.assertRaises(TypeError, D(1).is_nan, context=xc)
+ self.assertRaises(TypeError, D(1).is_qnan, context=xc)
+ self.assertRaises(TypeError, D(1).is_snan, context=xc)
+ self.assertRaises(TypeError, D(1).is_signed, context=xc)
+ self.assertRaises(TypeError, D(1).is_zero, context=xc)
+
+ self.assertFalse(D("0.01").is_normal(context=xc))
+ self.assertTrue(D("0.01").is_subnormal(context=xc))
+
+ self.assertRaises(TypeError, D(1).adjusted, context=xc)
+ self.assertRaises(TypeError, D(1).conjugate, context=xc)
+ self.assertRaises(TypeError, D(1).radix, context=xc)
+
+ self.assertEqual(D(-111).logb(context=xc), 2)
+ self.assertEqual(D(0).logical_invert(context=xc), 1)
+ self.assertEqual(D('0.01').number_class(context=xc), '+Subnormal')
+ self.assertEqual(D('0.21').to_eng_string(context=xc), '0.21')
+
+ self.assertEqual(D('11').logical_and(D('10'), context=xc), 0)
+ self.assertEqual(D('11').logical_or(D('10'), context=xc), 1)
+ self.assertEqual(D('01').logical_xor(D('10'), context=xc), 1)
+ self.assertEqual(D('23').rotate(1, context=xc), 3)
+ self.assertEqual(D('23').rotate(1, context=xc), 3)
+ xc.clear_flags()
+ self.assertRaises(Overflow,
+ D('23').scaleb, 1, context=xc)
+ self.assertTrue(xc.flags[Overflow])
+ self.assertFalse(c.flags[Overflow])
+ self.assertEqual(D('23').shift(-1, context=xc), 0)
+
+ self.assertRaises(TypeError, D.from_float, 1.1, context=xc)
+ self.assertRaises(TypeError, D(0).as_tuple, context=xc)
+
+ if (self.decimal == C):
+ self.assertRaises(TypeError, D(1).canonical, context=xc)
+ self.assertEqual(D("-1").copy_abs(context=xc), 1)
+ self.assertEqual(D("1").copy_negate(context=xc), -1)
+ else:
+ self.assertEqual(D(1).canonical(context=xc), 1)
+ self.assertRaises(TypeError, D("-1").copy_abs, context=xc)
+ self.assertRaises(TypeError, D("-1").copy_negate, context=xc)
+
+ def test_exception_hierarchy(self):
+
+ decimal = self.decimal
+ DecimalException = decimal.DecimalException
+ InvalidOperation = decimal.InvalidOperation
+ FloatOperation = decimal.FloatOperation
+ DivisionByZero = decimal.DivisionByZero
+ Overflow = decimal.Overflow
+ Underflow = decimal.Underflow
+ Subnormal = decimal.Subnormal
+ Inexact = decimal.Inexact
+ Rounded = decimal.Rounded
+ Clamped = decimal.Clamped
+
+ self.assertTrue(issubclass(DecimalException, ArithmeticError))
+
+ self.assertTrue(issubclass(InvalidOperation, DecimalException))
+ self.assertTrue(issubclass(FloatOperation, DecimalException))
+ self.assertTrue(issubclass(FloatOperation, TypeError))
+ self.assertTrue(issubclass(DivisionByZero, DecimalException))
+ self.assertTrue(issubclass(DivisionByZero, ZeroDivisionError))
+ self.assertTrue(issubclass(Overflow, Rounded))
+ self.assertTrue(issubclass(Overflow, Inexact))
+ self.assertTrue(issubclass(Overflow, DecimalException))
+ self.assertTrue(issubclass(Underflow, Inexact))
+ self.assertTrue(issubclass(Underflow, Rounded))
+ self.assertTrue(issubclass(Underflow, Subnormal))
+ self.assertTrue(issubclass(Underflow, DecimalException))
+
+ self.assertTrue(issubclass(Subnormal, DecimalException))
+ self.assertTrue(issubclass(Inexact, DecimalException))
+ self.assertTrue(issubclass(Rounded, DecimalException))
+ self.assertTrue(issubclass(Clamped, DecimalException))
+
+ self.assertTrue(issubclass(decimal.ConversionSyntax, InvalidOperation))
+ self.assertTrue(issubclass(decimal.DivisionImpossible, InvalidOperation))
+ self.assertTrue(issubclass(decimal.DivisionUndefined, InvalidOperation))
+ self.assertTrue(issubclass(decimal.DivisionUndefined, ZeroDivisionError))
+ self.assertTrue(issubclass(decimal.InvalidContext, InvalidOperation))
+
+class CPythonAPItests(PythonAPItests):
+ decimal = C
+class PyPythonAPItests(PythonAPItests):
+ decimal = P
+
class ContextAPItests(unittest.TestCase):
def test_pickle(self):
+
+ Context = self.decimal.Context
+
+ savedecimal = sys.modules['decimal']
+
+ # Round trip
+ sys.modules['decimal'] = self.decimal
c = Context()
e = pickle.loads(pickle.dumps(c))
- for k in vars(c):
- v1 = vars(c)[k]
- v2 = vars(e)[k]
- self.assertEqual(v1, v2)
+
+ self.assertEqual(c.prec, e.prec)
+ self.assertEqual(c.Emin, e.Emin)
+ self.assertEqual(c.Emax, e.Emax)
+ self.assertEqual(c.rounding, e.rounding)
+ self.assertEqual(c.capitals, e.capitals)
+ self.assertEqual(c.clamp, e.clamp)
+ self.assertEqual(c.flags, e.flags)
+ self.assertEqual(c.traps, e.traps)
+
+ # Test interchangeability
+ combinations = [(C, P), (P, C)] if C else [(P, P)]
+ for dumper, loader in combinations:
+ for ri, _ in enumerate(RoundingModes[dumper]):
+ for fi, _ in enumerate(OrderedSignals[dumper]):
+ for ti, _ in enumerate(OrderedSignals[dumper]):
+
+ prec = random.randrange(1, 100)
+ emin = random.randrange(-100, 0)
+ emax = random.randrange(1, 100)
+ caps = random.randrange(2)
+ clamp = random.randrange(2)
+
+ # One module dumps
+ sys.modules['decimal'] = dumper
+ c = dumper.Context(
+ prec=prec, Emin=emin, Emax=emax,
+ rounding=RoundingModes[dumper][ri],
+ capitals=caps, clamp=clamp,
+ flags=OrderedSignals[dumper][:fi],
+ traps=OrderedSignals[dumper][:ti]
+ )
+ s = pickle.dumps(c)
+
+ # The other module loads
+ sys.modules['decimal'] = loader
+ d = pickle.loads(s)
+ self.assertIsInstance(d, loader.Context)
+
+ self.assertEqual(d.prec, prec)
+ self.assertEqual(d.Emin, emin)
+ self.assertEqual(d.Emax, emax)
+ self.assertEqual(d.rounding, RoundingModes[loader][ri])
+ self.assertEqual(d.capitals, caps)
+ self.assertEqual(d.clamp, clamp)
+ assert_signals(self, d, 'flags', OrderedSignals[loader][:fi])
+ assert_signals(self, d, 'traps', OrderedSignals[loader][:ti])
+
+ sys.modules['decimal'] = savedecimal
def test_equality_with_other_types(self):
+ Decimal = self.decimal.Decimal
+
self.assertIn(Decimal(10), ['a', 1.0, Decimal(10), (1,2), {}])
self.assertNotIn(Decimal(10), ['a', 1.0, (1,2), {}])
def test_copy(self):
# All copies should be deep
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.copy()
self.assertNotEqual(id(c), id(d))
self.assertNotEqual(id(c.flags), id(d.flags))
self.assertNotEqual(id(c.traps), id(d.traps))
+ k1 = set(c.flags.keys())
+ k2 = set(d.flags.keys())
+ self.assertEqual(k1, k2)
+ self.assertEqual(c.flags, d.flags)
def test__clamp(self):
# In Python 3.2, the private attribute `_clamp` was made
@@ -1844,26 +2567,23 @@ class ContextAPItests(unittest.TestCase):
# only, the attribute should be gettable/settable via both
# `clamp` and `_clamp`; in Python 3.3, `_clamp` should be
# removed.
- c = Context(clamp = 0)
- self.assertEqual(c.clamp, 0)
-
- with check_warnings(("", DeprecationWarning)):
- c._clamp = 1
- self.assertEqual(c.clamp, 1)
- with check_warnings(("", DeprecationWarning)):
- self.assertEqual(c._clamp, 1)
- c.clamp = 0
- self.assertEqual(c.clamp, 0)
- with check_warnings(("", DeprecationWarning)):
- self.assertEqual(c._clamp, 0)
+ Context = self.decimal.Context
+ c = Context()
+ self.assertRaises(AttributeError, getattr, c, '_clamp')
def test_abs(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.abs(Decimal(-1))
self.assertEqual(c.abs(-1), d)
self.assertRaises(TypeError, c.abs, '-1')
def test_add(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.add(Decimal(1), Decimal(1))
self.assertEqual(c.add(1, 1), d)
@@ -1873,6 +2593,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.add, 1, '1')
def test_compare(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.compare(Decimal(1), Decimal(1))
self.assertEqual(c.compare(1, 1), d)
@@ -1882,6 +2605,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.compare, 1, '1')
def test_compare_signal(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.compare_signal(Decimal(1), Decimal(1))
self.assertEqual(c.compare_signal(1, 1), d)
@@ -1891,6 +2617,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.compare_signal, 1, '1')
def test_compare_total(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.compare_total(Decimal(1), Decimal(1))
self.assertEqual(c.compare_total(1, 1), d)
@@ -1900,6 +2629,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.compare_total, 1, '1')
def test_compare_total_mag(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.compare_total_mag(Decimal(1), Decimal(1))
self.assertEqual(c.compare_total_mag(1, 1), d)
@@ -1909,24 +2641,36 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.compare_total_mag, 1, '1')
def test_copy_abs(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.copy_abs(Decimal(-1))
self.assertEqual(c.copy_abs(-1), d)
self.assertRaises(TypeError, c.copy_abs, '-1')
def test_copy_decimal(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.copy_decimal(Decimal(-1))
self.assertEqual(c.copy_decimal(-1), d)
self.assertRaises(TypeError, c.copy_decimal, '-1')
def test_copy_negate(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.copy_negate(Decimal(-1))
self.assertEqual(c.copy_negate(-1), d)
self.assertRaises(TypeError, c.copy_negate, '-1')
def test_copy_sign(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.copy_sign(Decimal(1), Decimal(-2))
self.assertEqual(c.copy_sign(1, -2), d)
@@ -1936,6 +2680,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.copy_sign, 1, '-2')
def test_divide(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.divide(Decimal(1), Decimal(2))
self.assertEqual(c.divide(1, 2), d)
@@ -1945,6 +2692,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.divide, 1, '2')
def test_divide_int(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.divide_int(Decimal(1), Decimal(2))
self.assertEqual(c.divide_int(1, 2), d)
@@ -1954,6 +2704,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.divide_int, 1, '2')
def test_divmod(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.divmod(Decimal(1), Decimal(2))
self.assertEqual(c.divmod(1, 2), d)
@@ -1963,12 +2716,18 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.divmod, 1, '2')
def test_exp(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.exp(Decimal(10))
self.assertEqual(c.exp(10), d)
self.assertRaises(TypeError, c.exp, '10')
def test_fma(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.fma(Decimal(2), Decimal(3), Decimal(4))
self.assertEqual(c.fma(2, 3, 4), d)
@@ -1980,79 +2739,129 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.fma, 2, '3', 4)
self.assertRaises(TypeError, c.fma, 2, 3, '4')
+ # Issue 12079 for Context.fma ...
+ self.assertRaises(TypeError, c.fma,
+ Decimal('Infinity'), Decimal(0), "not a decimal")
+ self.assertRaises(TypeError, c.fma,
+ Decimal(1), Decimal('snan'), 1.222)
+ # ... and for Decimal.fma.
+ self.assertRaises(TypeError, Decimal('Infinity').fma,
+ Decimal(0), "not a decimal")
+ self.assertRaises(TypeError, Decimal(1).fma,
+ Decimal('snan'), 1.222)
+
def test_is_finite(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_finite(Decimal(10))
self.assertEqual(c.is_finite(10), d)
self.assertRaises(TypeError, c.is_finite, '10')
def test_is_infinite(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_infinite(Decimal(10))
self.assertEqual(c.is_infinite(10), d)
self.assertRaises(TypeError, c.is_infinite, '10')
def test_is_nan(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_nan(Decimal(10))
self.assertEqual(c.is_nan(10), d)
self.assertRaises(TypeError, c.is_nan, '10')
def test_is_normal(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_normal(Decimal(10))
self.assertEqual(c.is_normal(10), d)
self.assertRaises(TypeError, c.is_normal, '10')
def test_is_qnan(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_qnan(Decimal(10))
self.assertEqual(c.is_qnan(10), d)
self.assertRaises(TypeError, c.is_qnan, '10')
def test_is_signed(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_signed(Decimal(10))
self.assertEqual(c.is_signed(10), d)
self.assertRaises(TypeError, c.is_signed, '10')
def test_is_snan(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_snan(Decimal(10))
self.assertEqual(c.is_snan(10), d)
self.assertRaises(TypeError, c.is_snan, '10')
def test_is_subnormal(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_subnormal(Decimal(10))
self.assertEqual(c.is_subnormal(10), d)
self.assertRaises(TypeError, c.is_subnormal, '10')
def test_is_zero(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.is_zero(Decimal(10))
self.assertEqual(c.is_zero(10), d)
self.assertRaises(TypeError, c.is_zero, '10')
def test_ln(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.ln(Decimal(10))
self.assertEqual(c.ln(10), d)
self.assertRaises(TypeError, c.ln, '10')
def test_log10(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.log10(Decimal(10))
self.assertEqual(c.log10(10), d)
self.assertRaises(TypeError, c.log10, '10')
def test_logb(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.logb(Decimal(10))
self.assertEqual(c.logb(10), d)
self.assertRaises(TypeError, c.logb, '10')
def test_logical_and(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.logical_and(Decimal(1), Decimal(1))
self.assertEqual(c.logical_and(1, 1), d)
@@ -2062,12 +2871,18 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.logical_and, 1, '1')
def test_logical_invert(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.logical_invert(Decimal(1000))
self.assertEqual(c.logical_invert(1000), d)
self.assertRaises(TypeError, c.logical_invert, '1000')
def test_logical_or(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.logical_or(Decimal(1), Decimal(1))
self.assertEqual(c.logical_or(1, 1), d)
@@ -2077,6 +2892,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.logical_or, 1, '1')
def test_logical_xor(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.logical_xor(Decimal(1), Decimal(1))
self.assertEqual(c.logical_xor(1, 1), d)
@@ -2086,6 +2904,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.logical_xor, 1, '1')
def test_max(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.max(Decimal(1), Decimal(2))
self.assertEqual(c.max(1, 2), d)
@@ -2095,6 +2916,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.max, 1, '2')
def test_max_mag(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.max_mag(Decimal(1), Decimal(2))
self.assertEqual(c.max_mag(1, 2), d)
@@ -2104,6 +2928,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.max_mag, 1, '2')
def test_min(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.min(Decimal(1), Decimal(2))
self.assertEqual(c.min(1, 2), d)
@@ -2113,6 +2940,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.min, 1, '2')
def test_min_mag(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.min_mag(Decimal(1), Decimal(2))
self.assertEqual(c.min_mag(1, 2), d)
@@ -2122,12 +2952,18 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.min_mag, 1, '2')
def test_minus(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.minus(Decimal(10))
self.assertEqual(c.minus(10), d)
self.assertRaises(TypeError, c.minus, '10')
def test_multiply(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.multiply(Decimal(1), Decimal(2))
self.assertEqual(c.multiply(1, 2), d)
@@ -2137,18 +2973,27 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.multiply, 1, '2')
def test_next_minus(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.next_minus(Decimal(10))
self.assertEqual(c.next_minus(10), d)
self.assertRaises(TypeError, c.next_minus, '10')
def test_next_plus(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.next_plus(Decimal(10))
self.assertEqual(c.next_plus(10), d)
self.assertRaises(TypeError, c.next_plus, '10')
def test_next_toward(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.next_toward(Decimal(1), Decimal(2))
self.assertEqual(c.next_toward(1, 2), d)
@@ -2158,36 +3003,50 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.next_toward, 1, '2')
def test_normalize(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.normalize(Decimal(10))
self.assertEqual(c.normalize(10), d)
self.assertRaises(TypeError, c.normalize, '10')
def test_number_class(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
self.assertEqual(c.number_class(123), c.number_class(Decimal(123)))
self.assertEqual(c.number_class(0), c.number_class(Decimal(0)))
self.assertEqual(c.number_class(-45), c.number_class(Decimal(-45)))
- def test_power(self):
- c = Context()
- d = c.power(Decimal(1), Decimal(4), Decimal(2))
- self.assertEqual(c.power(1, 4, 2), d)
- self.assertEqual(c.power(Decimal(1), 4, 2), d)
- self.assertEqual(c.power(1, Decimal(4), 2), d)
- self.assertEqual(c.power(1, 4, Decimal(2)), d)
- self.assertEqual(c.power(Decimal(1), Decimal(4), 2), d)
- self.assertRaises(TypeError, c.power, '1', 4, 2)
- self.assertRaises(TypeError, c.power, 1, '4', 2)
- self.assertRaises(TypeError, c.power, 1, 4, '2')
-
def test_plus(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.plus(Decimal(10))
self.assertEqual(c.plus(10), d)
self.assertRaises(TypeError, c.plus, '10')
+ def test_power(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
+ c = Context()
+ d = c.power(Decimal(1), Decimal(4))
+ self.assertEqual(c.power(1, 4), d)
+ self.assertEqual(c.power(Decimal(1), 4), d)
+ self.assertEqual(c.power(1, Decimal(4)), d)
+ self.assertEqual(c.power(Decimal(1), Decimal(4)), d)
+ self.assertRaises(TypeError, c.power, '1', 4)
+ self.assertRaises(TypeError, c.power, 1, '4')
+ self.assertEqual(c.power(modulo=5, b=8, a=2), 1)
+
def test_quantize(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.quantize(Decimal(1), Decimal(2))
self.assertEqual(c.quantize(1, 2), d)
@@ -2197,6 +3056,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.quantize, 1, '2')
def test_remainder(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.remainder(Decimal(1), Decimal(2))
self.assertEqual(c.remainder(1, 2), d)
@@ -2206,6 +3068,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.remainder, 1, '2')
def test_remainder_near(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.remainder_near(Decimal(1), Decimal(2))
self.assertEqual(c.remainder_near(1, 2), d)
@@ -2215,6 +3080,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.remainder_near, 1, '2')
def test_rotate(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.rotate(Decimal(1), Decimal(2))
self.assertEqual(c.rotate(1, 2), d)
@@ -2224,12 +3092,18 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.rotate, 1, '2')
def test_sqrt(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.sqrt(Decimal(10))
self.assertEqual(c.sqrt(10), d)
self.assertRaises(TypeError, c.sqrt, '10')
def test_same_quantum(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.same_quantum(Decimal(1), Decimal(2))
self.assertEqual(c.same_quantum(1, 2), d)
@@ -2239,6 +3113,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.same_quantum, 1, '2')
def test_scaleb(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.scaleb(Decimal(1), Decimal(2))
self.assertEqual(c.scaleb(1, 2), d)
@@ -2248,6 +3125,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.scaleb, 1, '2')
def test_shift(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.shift(Decimal(1), Decimal(2))
self.assertEqual(c.shift(1, 2), d)
@@ -2257,6 +3137,9 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.shift, 1, '2')
def test_subtract(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.subtract(Decimal(1), Decimal(2))
self.assertEqual(c.subtract(1, 2), d)
@@ -2266,35 +3149,56 @@ class ContextAPItests(unittest.TestCase):
self.assertRaises(TypeError, c.subtract, 1, '2')
def test_to_eng_string(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.to_eng_string(Decimal(10))
self.assertEqual(c.to_eng_string(10), d)
self.assertRaises(TypeError, c.to_eng_string, '10')
def test_to_sci_string(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.to_sci_string(Decimal(10))
self.assertEqual(c.to_sci_string(10), d)
self.assertRaises(TypeError, c.to_sci_string, '10')
def test_to_integral_exact(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.to_integral_exact(Decimal(10))
self.assertEqual(c.to_integral_exact(10), d)
self.assertRaises(TypeError, c.to_integral_exact, '10')
def test_to_integral_value(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+
c = Context()
d = c.to_integral_value(Decimal(10))
self.assertEqual(c.to_integral_value(10), d)
self.assertRaises(TypeError, c.to_integral_value, '10')
+ self.assertRaises(TypeError, c.to_integral_value, 10, 'x')
+
+class CContextAPItests(ContextAPItests):
+ decimal = C
+class PyContextAPItests(ContextAPItests):
+ decimal = P
-class WithStatementTest(unittest.TestCase):
+class ContextWithStatement(unittest.TestCase):
# Can't do these as docstrings until Python 2.6
# as doctest can't handle __future__ statements
def test_localcontext(self):
# Use a copy of the current context in the block
+ getcontext = self.decimal.getcontext
+ localcontext = self.decimal.localcontext
+
orig_ctx = getcontext()
with localcontext() as enter_ctx:
set_ctx = getcontext()
@@ -2305,6 +3209,11 @@ class WithStatementTest(unittest.TestCase):
def test_localcontextarg(self):
# Use a copy of the supplied context in the block
+ Context = self.decimal.Context
+ getcontext = self.decimal.getcontext
+ localcontext = self.decimal.localcontext
+
+ localcontext = self.decimal.localcontext
orig_ctx = getcontext()
new_ctx = Context(prec=42)
with localcontext(new_ctx) as enter_ctx:
@@ -2315,17 +3224,131 @@ class WithStatementTest(unittest.TestCase):
self.assertIsNot(new_ctx, set_ctx, 'did not copy the context')
self.assertIs(set_ctx, enter_ctx, '__enter__ returned wrong context')
+ def test_nested_with_statements(self):
+ # Use a copy of the supplied context in the block
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ getcontext = self.decimal.getcontext
+ localcontext = self.decimal.localcontext
+ Clamped = self.decimal.Clamped
+ Overflow = self.decimal.Overflow
+
+ orig_ctx = getcontext()
+ orig_ctx.clear_flags()
+ new_ctx = Context(Emax=384)
+ with localcontext() as c1:
+ self.assertEqual(c1.flags, orig_ctx.flags)
+ self.assertEqual(c1.traps, orig_ctx.traps)
+ c1.traps[Clamped] = True
+ c1.Emin = -383
+ self.assertNotEqual(orig_ctx.Emin, -383)
+ self.assertRaises(Clamped, c1.create_decimal, '0e-999')
+ self.assertTrue(c1.flags[Clamped])
+ with localcontext(new_ctx) as c2:
+ self.assertEqual(c2.flags, new_ctx.flags)
+ self.assertEqual(c2.traps, new_ctx.traps)
+ self.assertRaises(Overflow, c2.power, Decimal('3.4e200'), 2)
+ self.assertFalse(c2.flags[Clamped])
+ self.assertTrue(c2.flags[Overflow])
+ del c2
+ self.assertFalse(c1.flags[Overflow])
+ del c1
+ self.assertNotEqual(orig_ctx.Emin, -383)
+ self.assertFalse(orig_ctx.flags[Clamped])
+ self.assertFalse(orig_ctx.flags[Overflow])
+ self.assertFalse(new_ctx.flags[Clamped])
+ self.assertFalse(new_ctx.flags[Overflow])
+
+ def test_with_statements_gc1(self):
+ localcontext = self.decimal.localcontext
+
+ with localcontext() as c1:
+ del c1
+ with localcontext() as c2:
+ del c2
+ with localcontext() as c3:
+ del c3
+ with localcontext() as c4:
+ del c4
+
+ def test_with_statements_gc2(self):
+ localcontext = self.decimal.localcontext
+
+ with localcontext() as c1:
+ with localcontext(c1) as c2:
+ del c1
+ with localcontext(c2) as c3:
+ del c2
+ with localcontext(c3) as c4:
+ del c3
+ del c4
+
+ def test_with_statements_gc3(self):
+ Context = self.decimal.Context
+ localcontext = self.decimal.localcontext
+ getcontext = self.decimal.getcontext
+ setcontext = self.decimal.setcontext
+
+ with localcontext() as c1:
+ del c1
+ n1 = Context(prec=1)
+ setcontext(n1)
+ with localcontext(n1) as c2:
+ del n1
+ self.assertEqual(c2.prec, 1)
+ del c2
+ n2 = Context(prec=2)
+ setcontext(n2)
+ del n2
+ self.assertEqual(getcontext().prec, 2)
+ n3 = Context(prec=3)
+ setcontext(n3)
+ self.assertEqual(getcontext().prec, 3)
+ with localcontext(n3) as c3:
+ del n3
+ self.assertEqual(c3.prec, 3)
+ del c3
+ n4 = Context(prec=4)
+ setcontext(n4)
+ del n4
+ self.assertEqual(getcontext().prec, 4)
+ with localcontext() as c4:
+ self.assertEqual(c4.prec, 4)
+ del c4
+
+class CContextWithStatement(ContextWithStatement):
+ decimal = C
+class PyContextWithStatement(ContextWithStatement):
+ decimal = P
+
class ContextFlags(unittest.TestCase):
+
def test_flags_irrelevant(self):
# check that the result (numeric result + flags raised) of an
# arithmetic operation doesn't depend on the current flags
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ Inexact = self.decimal.Inexact
+ Rounded = self.decimal.Rounded
+ Underflow = self.decimal.Underflow
+ Clamped = self.decimal.Clamped
+ Subnormal = self.decimal.Subnormal
+ ROUND_HALF_EVEN = self.decimal.ROUND_HALF_EVEN
+
+ def raise_error(context, flag):
+ if self.decimal == C:
+ context.flags[flag] = True
+ if context.traps[flag]:
+ raise flag
+ else:
+ context._raise_error(flag)
- context = Context(prec=9, Emin = -999999999, Emax = 999999999,
- rounding=ROUND_HALF_EVEN, traps=[], flags=[])
+ context = Context(prec=9, Emin = -425000000, Emax = 425000000,
+ rounding=ROUND_HALF_EVEN, traps=[], flags=[])
# operations that raise various flags, in the form (function, arglist)
operations = [
- (context._apply, [Decimal("100E-1000000009")]),
+ (context._apply, [Decimal("100E-425000010")]),
(context.sqrt, [Decimal(2)]),
(context.add, [Decimal("1.23456789"), Decimal("9.87654321")]),
(context.multiply, [Decimal("1.23456789"), Decimal("9.87654321")]),
@@ -2346,7 +3369,7 @@ class ContextFlags(unittest.TestCase):
# set flags, before calling operation
context.clear_flags()
for flag in extra_flags:
- context._raise_error(flag)
+ raise_error(context, flag)
new_ans = fn(*args)
# flags that we expect to be set after the operation
@@ -2367,6 +3390,1723 @@ class ContextFlags(unittest.TestCase):
"operation raises different flags depending on flags set: " +
"expected %s, got %s" % (expected_flags, new_flags))
+ def test_flag_comparisons(self):
+ Context = self.decimal.Context
+ Inexact = self.decimal.Inexact
+ Rounded = self.decimal.Rounded
+
+ c = Context()
+
+ # Valid SignalDict
+ self.assertNotEqual(c.flags, c.traps)
+ self.assertNotEqual(c.traps, c.flags)
+
+ c.flags = c.traps
+ self.assertEqual(c.flags, c.traps)
+ self.assertEqual(c.traps, c.flags)
+
+ c.flags[Rounded] = True
+ c.traps = c.flags
+ self.assertEqual(c.flags, c.traps)
+ self.assertEqual(c.traps, c.flags)
+
+ d = {}
+ d.update(c.flags)
+ self.assertEqual(d, c.flags)
+ self.assertEqual(c.flags, d)
+
+ d[Inexact] = True
+ self.assertNotEqual(d, c.flags)
+ self.assertNotEqual(c.flags, d)
+
+ # Invalid SignalDict
+ d = {Inexact:False}
+ self.assertNotEqual(d, c.flags)
+ self.assertNotEqual(c.flags, d)
+
+ d = ["xyz"]
+ self.assertNotEqual(d, c.flags)
+ self.assertNotEqual(c.flags, d)
+
+ @requires_IEEE_754
+ def test_float_operation(self):
+ Decimal = self.decimal.Decimal
+ FloatOperation = self.decimal.FloatOperation
+ localcontext = self.decimal.localcontext
+
+ with localcontext() as c:
+ ##### trap is off by default
+ self.assertFalse(c.traps[FloatOperation])
+
+ # implicit conversion sets the flag
+ c.clear_flags()
+ self.assertEqual(Decimal(7.5), 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ self.assertEqual(c.create_decimal(7.5), 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ # explicit conversion does not set the flag
+ c.clear_flags()
+ x = Decimal.from_float(7.5)
+ self.assertFalse(c.flags[FloatOperation])
+ # comparison sets the flag
+ self.assertEqual(x, 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ x = c.create_decimal_from_float(7.5)
+ self.assertFalse(c.flags[FloatOperation])
+ self.assertEqual(x, 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ ##### set the trap
+ c.traps[FloatOperation] = True
+
+ # implicit conversion raises
+ c.clear_flags()
+ self.assertRaises(FloatOperation, Decimal, 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ self.assertRaises(FloatOperation, c.create_decimal, 7.5)
+ self.assertTrue(c.flags[FloatOperation])
+
+ # explicit conversion is silent
+ c.clear_flags()
+ x = Decimal.from_float(7.5)
+ self.assertFalse(c.flags[FloatOperation])
+
+ c.clear_flags()
+ x = c.create_decimal_from_float(7.5)
+ self.assertFalse(c.flags[FloatOperation])
+
+ def test_float_comparison(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ FloatOperation = self.decimal.FloatOperation
+ localcontext = self.decimal.localcontext
+
+ def assert_attr(a, b, attr, context, signal=None):
+ context.clear_flags()
+ f = getattr(a, attr)
+ if signal == FloatOperation:
+ self.assertRaises(signal, f, b)
+ else:
+ self.assertIs(f(b), True)
+ self.assertTrue(context.flags[FloatOperation])
+
+ small_d = Decimal('0.25')
+ big_d = Decimal('3.0')
+ small_f = 0.25
+ big_f = 3.0
+
+ zero_d = Decimal('0.0')
+ neg_zero_d = Decimal('-0.0')
+ zero_f = 0.0
+ neg_zero_f = -0.0
+
+ inf_d = Decimal('Infinity')
+ neg_inf_d = Decimal('-Infinity')
+ inf_f = float('inf')
+ neg_inf_f = float('-inf')
+
+ def doit(c, signal=None):
+ # Order
+ for attr in '__lt__', '__le__':
+ assert_attr(small_d, big_f, attr, c, signal)
+
+ for attr in '__gt__', '__ge__':
+ assert_attr(big_d, small_f, attr, c, signal)
+
+ # Equality
+ assert_attr(small_d, small_f, '__eq__', c, None)
+
+ assert_attr(neg_zero_d, neg_zero_f, '__eq__', c, None)
+ assert_attr(neg_zero_d, zero_f, '__eq__', c, None)
+
+ assert_attr(zero_d, neg_zero_f, '__eq__', c, None)
+ assert_attr(zero_d, zero_f, '__eq__', c, None)
+
+ assert_attr(neg_inf_d, neg_inf_f, '__eq__', c, None)
+ assert_attr(inf_d, inf_f, '__eq__', c, None)
+
+ # Inequality
+ assert_attr(small_d, big_f, '__ne__', c, None)
+
+ assert_attr(Decimal('0.1'), 0.1, '__ne__', c, None)
+
+ assert_attr(neg_inf_d, inf_f, '__ne__', c, None)
+ assert_attr(inf_d, neg_inf_f, '__ne__', c, None)
+
+ assert_attr(Decimal('NaN'), float('nan'), '__ne__', c, None)
+
+ def test_containers(c, signal=None):
+ c.clear_flags()
+ s = set([100.0, Decimal('100.0')])
+ self.assertEqual(len(s), 1)
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ if signal:
+ self.assertRaises(signal, sorted, [1.0, Decimal('10.0')])
+ else:
+ s = sorted([10.0, Decimal('10.0')])
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ b = 10.0 in [Decimal('10.0'), 1.0]
+ self.assertTrue(c.flags[FloatOperation])
+
+ c.clear_flags()
+ b = 10.0 in {Decimal('10.0'):'a', 1.0:'b'}
+ self.assertTrue(c.flags[FloatOperation])
+
+ nc = Context()
+ with localcontext(nc) as c:
+ self.assertFalse(c.traps[FloatOperation])
+ doit(c, signal=None)
+ test_containers(c, signal=None)
+
+ c.traps[FloatOperation] = True
+ doit(c, signal=FloatOperation)
+ test_containers(c, signal=FloatOperation)
+
+ def test_float_operation_default(self):
+ Decimal = self.decimal.Decimal
+ Context = self.decimal.Context
+ Inexact = self.decimal.Inexact
+ FloatOperation= self.decimal.FloatOperation
+
+ context = Context()
+ self.assertFalse(context.flags[FloatOperation])
+ self.assertFalse(context.traps[FloatOperation])
+
+ context.clear_traps()
+ context.traps[Inexact] = True
+ context.traps[FloatOperation] = True
+ self.assertTrue(context.traps[FloatOperation])
+ self.assertTrue(context.traps[Inexact])
+
+class CContextFlags(ContextFlags):
+ decimal = C
+class PyContextFlags(ContextFlags):
+ decimal = P
+
+class SpecialContexts(unittest.TestCase):
+ """Test the context templates."""
+
+ def test_context_templates(self):
+ BasicContext = self.decimal.BasicContext
+ ExtendedContext = self.decimal.ExtendedContext
+ getcontext = self.decimal.getcontext
+ setcontext = self.decimal.setcontext
+ InvalidOperation = self.decimal.InvalidOperation
+ DivisionByZero = self.decimal.DivisionByZero
+ Overflow = self.decimal.Overflow
+ Underflow = self.decimal.Underflow
+ Clamped = self.decimal.Clamped
+
+ assert_signals(self, BasicContext, 'traps',
+ [InvalidOperation, DivisionByZero, Overflow, Underflow, Clamped]
+ )
+
+ savecontext = getcontext().copy()
+ basic_context_prec = BasicContext.prec
+ extended_context_prec = ExtendedContext.prec
+
+ ex = None
+ try:
+ BasicContext.prec = ExtendedContext.prec = 441
+ for template in BasicContext, ExtendedContext:
+ setcontext(template)
+ c = getcontext()
+ self.assertIsNot(c, template)
+ self.assertEqual(c.prec, 441)
+ except Exception as e:
+ ex = e.__class__
+ finally:
+ BasicContext.prec = basic_context_prec
+ ExtendedContext.prec = extended_context_prec
+ setcontext(savecontext)
+ if ex:
+ raise ex
+
+ def test_default_context(self):
+ DefaultContext = self.decimal.DefaultContext
+ BasicContext = self.decimal.BasicContext
+ ExtendedContext = self.decimal.ExtendedContext
+ getcontext = self.decimal.getcontext
+ setcontext = self.decimal.setcontext
+ InvalidOperation = self.decimal.InvalidOperation
+ DivisionByZero = self.decimal.DivisionByZero
+ Overflow = self.decimal.Overflow
+
+ self.assertEqual(BasicContext.prec, 9)
+ self.assertEqual(ExtendedContext.prec, 9)
+
+ assert_signals(self, DefaultContext, 'traps',
+ [InvalidOperation, DivisionByZero, Overflow]
+ )
+
+ savecontext = getcontext().copy()
+ default_context_prec = DefaultContext.prec
+
+ ex = None
+ try:
+ c = getcontext()
+ saveprec = c.prec
+
+ DefaultContext.prec = 961
+ c = getcontext()
+ self.assertEqual(c.prec, saveprec)
+
+ setcontext(DefaultContext)
+ c = getcontext()
+ self.assertIsNot(c, DefaultContext)
+ self.assertEqual(c.prec, 961)
+ except Exception as e:
+ ex = e.__class__
+ finally:
+ DefaultContext.prec = default_context_prec
+ setcontext(savecontext)
+ if ex:
+ raise ex
+
+class CSpecialContexts(SpecialContexts):
+ decimal = C
+class PySpecialContexts(SpecialContexts):
+ decimal = P
+
+class ContextInputValidation(unittest.TestCase):
+
+ def test_invalid_context(self):
+ Context = self.decimal.Context
+ DefaultContext = self.decimal.DefaultContext
+
+ c = DefaultContext.copy()
+
+ # prec, Emax
+ for attr in ['prec', 'Emax']:
+ setattr(c, attr, 999999)
+ self.assertEqual(getattr(c, attr), 999999)
+ self.assertRaises(ValueError, setattr, c, attr, -1)
+ self.assertRaises(TypeError, setattr, c, attr, 'xyz')
+
+ # Emin
+ setattr(c, 'Emin', -999999)
+ self.assertEqual(getattr(c, 'Emin'), -999999)
+ self.assertRaises(ValueError, setattr, c, 'Emin', 1)
+ self.assertRaises(TypeError, setattr, c, 'Emin', (1,2,3))
+
+ # rounding: always raise TypeError in order to get consistent
+ # exceptions across implementations. In decimal, rounding
+ # modes are strings, in _decimal they are integers. The idea
+ # is to view rounding as an abstract type and not mind the
+ # implementation details.
+ # Hence, a user should view the rounding modes as if they
+ # had been defined in a language that supports abstract
+ # data types, e.g. ocaml:
+ #
+ # type rounding = ROUND_DOWN | ROUND_HALF_UP | ... ;;
+ #
+ self.assertRaises(TypeError, setattr, c, 'rounding', -1)
+ self.assertRaises(TypeError, setattr, c, 'rounding', 9)
+ self.assertRaises(TypeError, setattr, c, 'rounding', 1.0)
+ self.assertRaises(TypeError, setattr, c, 'rounding', 'xyz')
+
+ # capitals, clamp
+ for attr in ['capitals', 'clamp']:
+ self.assertRaises(ValueError, setattr, c, attr, -1)
+ self.assertRaises(ValueError, setattr, c, attr, 2)
+ self.assertRaises(TypeError, setattr, c, attr, [1,2,3])
+
+ # Invalid attribute
+ self.assertRaises(AttributeError, setattr, c, 'emax', 100)
+
+ # Invalid signal dict
+ self.assertRaises(TypeError, setattr, c, 'flags', [])
+ self.assertRaises(KeyError, setattr, c, 'flags', {})
+ self.assertRaises(KeyError, setattr, c, 'traps',
+ {'InvalidOperation':0})
+
+ # Attributes cannot be deleted
+ for attr in ['prec', 'Emax', 'Emin', 'rounding', 'capitals', 'clamp',
+ 'flags', 'traps']:
+ self.assertRaises(AttributeError, c.__delattr__, attr)
+
+ # Invalid attributes
+ self.assertRaises(TypeError, getattr, c, 9)
+ self.assertRaises(TypeError, setattr, c, 9)
+
+ # Invalid values in constructor
+ self.assertRaises(TypeError, Context, rounding=999999)
+ self.assertRaises(TypeError, Context, rounding='xyz')
+ self.assertRaises(ValueError, Context, clamp=2)
+ self.assertRaises(ValueError, Context, capitals=-1)
+ self.assertRaises(KeyError, Context, flags=["P"])
+ self.assertRaises(KeyError, Context, traps=["Q"])
+
+ # Type error in conversion
+ self.assertRaises(TypeError, Context, flags=(0,1))
+ self.assertRaises(TypeError, Context, traps=(1,0))
+
+class CContextInputValidation(ContextInputValidation):
+ decimal = C
+class PyContextInputValidation(ContextInputValidation):
+ decimal = P
+
+class ContextSubclassing(unittest.TestCase):
+
+ def test_context_subclassing(self):
+ decimal = self.decimal
+ Decimal = decimal.Decimal
+ Context = decimal.Context
+ ROUND_HALF_EVEN = decimal.ROUND_HALF_EVEN
+ ROUND_DOWN = decimal.ROUND_DOWN
+ Clamped = decimal.Clamped
+ DivisionByZero = decimal.DivisionByZero
+ Inexact = decimal.Inexact
+ Overflow = decimal.Overflow
+ Rounded = decimal.Rounded
+ Subnormal = decimal.Subnormal
+ Underflow = decimal.Underflow
+ InvalidOperation = decimal.InvalidOperation
+
+ class MyContext(Context):
+ def __init__(self, prec=None, rounding=None, Emin=None, Emax=None,
+ capitals=None, clamp=None, flags=None,
+ traps=None):
+ Context.__init__(self)
+ if prec is not None:
+ self.prec = prec
+ if rounding is not None:
+ self.rounding = rounding
+ if Emin is not None:
+ self.Emin = Emin
+ if Emax is not None:
+ self.Emax = Emax
+ if capitals is not None:
+ self.capitals = capitals
+ if clamp is not None:
+ self.clamp = clamp
+ if flags is not None:
+ if isinstance(flags, list):
+ flags = {v:(v in flags) for v in OrderedSignals[decimal] + flags}
+ self.flags = flags
+ if traps is not None:
+ if isinstance(traps, list):
+ traps = {v:(v in traps) for v in OrderedSignals[decimal] + traps}
+ self.traps = traps
+
+ c = Context()
+ d = MyContext()
+ for attr in ('prec', 'rounding', 'Emin', 'Emax', 'capitals', 'clamp',
+ 'flags', 'traps'):
+ self.assertEqual(getattr(c, attr), getattr(d, attr))
+
+ # prec
+ self.assertRaises(ValueError, MyContext, **{'prec':-1})
+ c = MyContext(prec=1)
+ self.assertEqual(c.prec, 1)
+ self.assertRaises(InvalidOperation, c.quantize, Decimal('9e2'), 0)
+
+ # rounding
+ self.assertRaises(TypeError, MyContext, **{'rounding':'XYZ'})
+ c = MyContext(rounding=ROUND_DOWN, prec=1)
+ self.assertEqual(c.rounding, ROUND_DOWN)
+ self.assertEqual(c.plus(Decimal('9.9')), 9)
+
+ # Emin
+ self.assertRaises(ValueError, MyContext, **{'Emin':5})
+ c = MyContext(Emin=-1, prec=1)
+ self.assertEqual(c.Emin, -1)
+ x = c.add(Decimal('1e-99'), Decimal('2.234e-2000'))
+ self.assertEqual(x, Decimal('0.0'))
+ for signal in (Inexact, Underflow, Subnormal, Rounded, Clamped):
+ self.assertTrue(c.flags[signal])
+
+ # Emax
+ self.assertRaises(ValueError, MyContext, **{'Emax':-1})
+ c = MyContext(Emax=1, prec=1)
+ self.assertEqual(c.Emax, 1)
+ self.assertRaises(Overflow, c.add, Decimal('1e99'), Decimal('2.234e2000'))
+ if self.decimal == C:
+ for signal in (Inexact, Overflow, Rounded):
+ self.assertTrue(c.flags[signal])
+
+ # capitals
+ self.assertRaises(ValueError, MyContext, **{'capitals':-1})
+ c = MyContext(capitals=0)
+ self.assertEqual(c.capitals, 0)
+ x = c.create_decimal('1E222')
+ self.assertEqual(c.to_sci_string(x), '1e+222')
+
+ # clamp
+ self.assertRaises(ValueError, MyContext, **{'clamp':2})
+ c = MyContext(clamp=1, Emax=99)
+ self.assertEqual(c.clamp, 1)
+ x = c.plus(Decimal('1e99'))
+ self.assertEqual(str(x), '1.000000000000000000000000000E+99')
+
+ # flags
+ self.assertRaises(TypeError, MyContext, **{'flags':'XYZ'})
+ c = MyContext(flags=[Rounded, DivisionByZero])
+ for signal in (Rounded, DivisionByZero):
+ self.assertTrue(c.flags[signal])
+ c.clear_flags()
+ for signal in OrderedSignals[decimal]:
+ self.assertFalse(c.flags[signal])
+
+ # traps
+ self.assertRaises(TypeError, MyContext, **{'traps':'XYZ'})
+ c = MyContext(traps=[Rounded, DivisionByZero])
+ for signal in (Rounded, DivisionByZero):
+ self.assertTrue(c.traps[signal])
+ c.clear_traps()
+ for signal in OrderedSignals[decimal]:
+ self.assertFalse(c.traps[signal])
+
+class CContextSubclassing(ContextSubclassing):
+ decimal = C
+class PyContextSubclassing(ContextSubclassing):
+ decimal = P
+
+@skip_if_extra_functionality
+class CheckAttributes(unittest.TestCase):
+
+ def test_module_attributes(self):
+
+ # Architecture dependent context limits
+ self.assertEqual(C.MAX_PREC, P.MAX_PREC)
+ self.assertEqual(C.MAX_EMAX, P.MAX_EMAX)
+ self.assertEqual(C.MIN_EMIN, P.MIN_EMIN)
+ self.assertEqual(C.MIN_ETINY, P.MIN_ETINY)
+
+ self.assertTrue(C.HAVE_THREADS is True or C.HAVE_THREADS is False)
+ self.assertTrue(P.HAVE_THREADS is True or P.HAVE_THREADS is False)
+
+ self.assertEqual(C.__version__, P.__version__)
+
+ x = dir(C)
+ y = [s for s in dir(P) if '__' in s or not s.startswith('_')]
+ self.assertEqual(set(x) - set(y), set())
+
+ def test_context_attributes(self):
+
+ x = [s for s in dir(C.Context()) if '__' in s or not s.startswith('_')]
+ y = [s for s in dir(P.Context()) if '__' in s or not s.startswith('_')]
+ self.assertEqual(set(x) - set(y), set())
+
+ def test_decimal_attributes(self):
+
+ x = [s for s in dir(C.Decimal(9)) if '__' in s or not s.startswith('_')]
+ y = [s for s in dir(C.Decimal(9)) if '__' in s or not s.startswith('_')]
+ self.assertEqual(set(x) - set(y), set())
+
+class Coverage(unittest.TestCase):
+
+ def test_adjusted(self):
+ Decimal = self.decimal.Decimal
+
+ self.assertEqual(Decimal('1234e9999').adjusted(), 10002)
+ # XXX raise?
+ self.assertEqual(Decimal('nan').adjusted(), 0)
+ self.assertEqual(Decimal('inf').adjusted(), 0)
+
+ def test_canonical(self):
+ Decimal = self.decimal.Decimal
+ getcontext = self.decimal.getcontext
+
+ x = Decimal(9).canonical()
+ self.assertEqual(x, 9)
+
+ c = getcontext()
+ x = c.canonical(Decimal(9))
+ self.assertEqual(x, 9)
+
+ def test_context_repr(self):
+ c = self.decimal.DefaultContext.copy()
+
+ c.prec = 425000000
+ c.Emax = 425000000
+ c.Emin = -425000000
+ c.rounding = self.decimal.ROUND_HALF_DOWN
+ c.capitals = 0
+ c.clamp = 1
+ for sig in OrderedSignals[self.decimal]:
+ c.flags[sig] = False
+ c.traps[sig] = False
+
+ s = c.__repr__()
+ t = "Context(prec=425000000, rounding=ROUND_HALF_DOWN, " \
+ "Emin=-425000000, Emax=425000000, capitals=0, clamp=1, " \
+ "flags=[], traps=[])"
+ self.assertEqual(s, t)
+
+ def test_implicit_context(self):
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+
+ with localcontext() as c:
+ c.prec = 1
+ c.Emax = 1
+ c.Emin = -1
+
+ # abs
+ self.assertEqual(abs(Decimal("-10")), 10)
+ # add
+ self.assertEqual(Decimal("7") + 1, 8)
+ # divide
+ self.assertEqual(Decimal("10") / 5, 2)
+ # divide_int
+ self.assertEqual(Decimal("10") // 7, 1)
+ # fma
+ self.assertEqual(Decimal("1.2").fma(Decimal("0.01"), 1), 1)
+ self.assertIs(Decimal("NaN").fma(7, 1).is_nan(), True)
+ # three arg power
+ self.assertEqual(pow(Decimal(10), 2, 7), 2)
+ # exp
+ self.assertEqual(Decimal("1.01").exp(), 3)
+ # is_normal
+ self.assertIs(Decimal("0.01").is_normal(), False)
+ # is_subnormal
+ self.assertIs(Decimal("0.01").is_subnormal(), True)
+ # ln
+ self.assertEqual(Decimal("20").ln(), 3)
+ # log10
+ self.assertEqual(Decimal("20").log10(), 1)
+ # logb
+ self.assertEqual(Decimal("580").logb(), 2)
+ # logical_invert
+ self.assertEqual(Decimal("10").logical_invert(), 1)
+ # minus
+ self.assertEqual(-Decimal("-10"), 10)
+ # multiply
+ self.assertEqual(Decimal("2") * 4, 8)
+ # next_minus
+ self.assertEqual(Decimal("10").next_minus(), 9)
+ # next_plus
+ self.assertEqual(Decimal("10").next_plus(), Decimal('2E+1'))
+ # normalize
+ self.assertEqual(Decimal("-10").normalize(), Decimal('-1E+1'))
+ # number_class
+ self.assertEqual(Decimal("10").number_class(), '+Normal')
+ # plus
+ self.assertEqual(+Decimal("-1"), -1)
+ # remainder
+ self.assertEqual(Decimal("10") % 7, 3)
+ # subtract
+ self.assertEqual(Decimal("10") - 7, 3)
+ # to_integral_exact
+ self.assertEqual(Decimal("1.12345").to_integral_exact(), 1)
+
+ # Boolean functions
+ self.assertTrue(Decimal("1").is_canonical())
+ self.assertTrue(Decimal("1").is_finite())
+ self.assertTrue(Decimal("1").is_finite())
+ self.assertTrue(Decimal("snan").is_snan())
+ self.assertTrue(Decimal("-1").is_signed())
+ self.assertTrue(Decimal("0").is_zero())
+ self.assertTrue(Decimal("0").is_zero())
+
+ # Copy
+ with localcontext() as c:
+ c.prec = 10000
+ x = 1228 ** 1523
+ y = -Decimal(x)
+
+ z = y.copy_abs()
+ self.assertEqual(z, x)
+
+ z = y.copy_negate()
+ self.assertEqual(z, x)
+
+ z = y.copy_sign(Decimal(1))
+ self.assertEqual(z, x)
+
+ def test_divmod(self):
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+ InvalidOperation = self.decimal.InvalidOperation
+ DivisionByZero = self.decimal.DivisionByZero
+
+ with localcontext() as c:
+ q, r = divmod(Decimal("10912837129"), 1001)
+ self.assertEqual(q, Decimal('10901935'))
+ self.assertEqual(r, Decimal('194'))
+
+ q, r = divmod(Decimal("NaN"), 7)
+ self.assertTrue(q.is_nan() and r.is_nan())
+
+ c.traps[InvalidOperation] = False
+ q, r = divmod(Decimal("NaN"), 7)
+ self.assertTrue(q.is_nan() and r.is_nan())
+
+ c.traps[InvalidOperation] = False
+ c.clear_flags()
+ q, r = divmod(Decimal("inf"), Decimal("inf"))
+ self.assertTrue(q.is_nan() and r.is_nan())
+ self.assertTrue(c.flags[InvalidOperation])
+
+ c.clear_flags()
+ q, r = divmod(Decimal("inf"), 101)
+ self.assertTrue(q.is_infinite() and r.is_nan())
+ self.assertTrue(c.flags[InvalidOperation])
+
+ c.clear_flags()
+ q, r = divmod(Decimal(0), 0)
+ self.assertTrue(q.is_nan() and r.is_nan())
+ self.assertTrue(c.flags[InvalidOperation])
+
+ c.traps[DivisionByZero] = False
+ c.clear_flags()
+ q, r = divmod(Decimal(11), 0)
+ self.assertTrue(q.is_infinite() and r.is_nan())
+ self.assertTrue(c.flags[InvalidOperation] and
+ c.flags[DivisionByZero])
+
+ def test_power(self):
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+ Overflow = self.decimal.Overflow
+ Rounded = self.decimal.Rounded
+
+ with localcontext() as c:
+ c.prec = 3
+ c.clear_flags()
+ self.assertEqual(Decimal("1.0") ** 100, Decimal('1.00'))
+ self.assertTrue(c.flags[Rounded])
+
+ c.prec = 1
+ c.Emax = 1
+ c.Emin = -1
+ c.clear_flags()
+ c.traps[Overflow] = False
+ self.assertEqual(Decimal(10000) ** Decimal("0.5"), Decimal('inf'))
+ self.assertTrue(c.flags[Overflow])
+
+ def test_quantize(self):
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+ InvalidOperation = self.decimal.InvalidOperation
+
+ with localcontext() as c:
+ c.prec = 1
+ c.Emax = 1
+ c.Emin = -1
+ c.traps[InvalidOperation] = False
+ x = Decimal(99).quantize(Decimal("1e1"))
+ self.assertTrue(x.is_nan())
+
+ def test_radix(self):
+ Decimal = self.decimal.Decimal
+ getcontext = self.decimal.getcontext
+
+ c = getcontext()
+ self.assertEqual(Decimal("1").radix(), 10)
+ self.assertEqual(c.radix(), 10)
+
+ def test_rop(self):
+ Decimal = self.decimal.Decimal
+
+ for attr in ('__radd__', '__rsub__', '__rmul__', '__rtruediv__',
+ '__rdivmod__', '__rmod__', '__rfloordiv__', '__rpow__'):
+ self.assertIs(getattr(Decimal("1"), attr)("xyz"), NotImplemented)
+
+ def test_round(self):
+ # Python3 behavior: round() returns Decimal
+ Decimal = self.decimal.Decimal
+ getcontext = self.decimal.getcontext
+
+ c = getcontext()
+ c.prec = 28
+
+ self.assertEqual(str(Decimal("9.99").__round__()), "10")
+ self.assertEqual(str(Decimal("9.99e-5").__round__()), "0")
+ self.assertEqual(str(Decimal("1.23456789").__round__(5)), "1.23457")
+ self.assertEqual(str(Decimal("1.2345").__round__(10)), "1.2345000000")
+ self.assertEqual(str(Decimal("1.2345").__round__(-10)), "0E+10")
+
+ self.assertRaises(TypeError, Decimal("1.23").__round__, "5")
+ self.assertRaises(TypeError, Decimal("1.23").__round__, 5, 8)
+
+ def test_create_decimal(self):
+ c = self.decimal.Context()
+ self.assertRaises(ValueError, c.create_decimal, ["%"])
+
+ def test_int(self):
+ Decimal = self.decimal.Decimal
+ localcontext = self.decimal.localcontext
+
+ with localcontext() as c:
+ c.prec = 9999
+ x = Decimal(1221**1271) / 10**3923
+ self.assertEqual(int(x), 1)
+ self.assertEqual(x.to_integral(), 2)
+
+ def test_copy(self):
+ Context = self.decimal.Context
+
+ c = Context()
+ c.prec = 10000
+ x = -(1172 ** 1712)
+
+ y = c.copy_abs(x)
+ self.assertEqual(y, -x)
+
+ y = c.copy_negate(x)
+ self.assertEqual(y, -x)
+
+ y = c.copy_sign(x, 1)
+ self.assertEqual(y, -x)
+
+class CCoverage(Coverage):
+ decimal = C
+class PyCoverage(Coverage):
+ decimal = P
+
+class PyFunctionality(unittest.TestCase):
+ """Extra functionality in decimal.py"""
+
+ def test_py_quantize_watchexp(self):
+ # watchexp functionality
+ Decimal = P.Decimal
+ localcontext = P.localcontext
+
+ with localcontext() as c:
+ c.prec = 1
+ c.Emax = 1
+ c.Emin = -1
+ x = Decimal(99999).quantize(Decimal("1e3"), watchexp=False)
+ self.assertEqual(x, Decimal('1.00E+5'))
+
+ def test_py_alternate_formatting(self):
+ # triples giving a format, a Decimal, and the expected result
+ Decimal = P.Decimal
+ localcontext = P.localcontext
+
+ test_values = [
+ # Issue 7094: Alternate formatting (specified by #)
+ ('.0e', '1.0', '1e+0'),
+ ('#.0e', '1.0', '1.e+0'),
+ ('.0f', '1.0', '1'),
+ ('#.0f', '1.0', '1.'),
+ ('g', '1.1', '1.1'),
+ ('#g', '1.1', '1.1'),
+ ('.0g', '1', '1'),
+ ('#.0g', '1', '1.'),
+ ('.0%', '1.0', '100%'),
+ ('#.0%', '1.0', '100.%'),
+ ]
+ for fmt, d, result in test_values:
+ self.assertEqual(format(Decimal(d), fmt), result)
+
+class PyWhitebox(unittest.TestCase):
+ """White box testing for decimal.py"""
+
+ def test_py_exact_power(self):
+ # Rarely exercised lines in _power_exact.
+ Decimal = P.Decimal
+ localcontext = P.localcontext
+
+ with localcontext() as c:
+ c.prec = 8
+ x = Decimal(2**16) ** Decimal("-0.5")
+ self.assertEqual(x, Decimal('0.00390625'))
+
+ x = Decimal(2**16) ** Decimal("-0.6")
+ self.assertEqual(x, Decimal('0.0012885819'))
+
+ x = Decimal("256e7") ** Decimal("-0.5")
+
+ x = Decimal(152587890625) ** Decimal('-0.0625')
+ self.assertEqual(x, Decimal("0.2"))
+
+ x = Decimal("152587890625e7") ** Decimal('-0.0625')
+
+ x = Decimal(5**2659) ** Decimal('-0.0625')
+
+ c.prec = 1
+ x = Decimal("152587890625") ** Decimal('-0.5')
+ c.prec = 201
+ x = Decimal(2**578) ** Decimal("-0.5")
+
+ def test_py_immutability_operations(self):
+ # Do operations and check that it didn't change change internal objects.
+ Decimal = P.Decimal
+ DefaultContext = P.DefaultContext
+ setcontext = P.setcontext
+
+ c = DefaultContext.copy()
+ c.traps = dict((s, 0) for s in OrderedSignals[P])
+ setcontext(c)
+
+ d1 = Decimal('-25e55')
+ b1 = Decimal('-25e55')
+ d2 = Decimal('33e+33')
+ b2 = Decimal('33e+33')
+
+ def checkSameDec(operation, useOther=False):
+ if useOther:
+ eval("d1." + operation + "(d2)")
+ self.assertEqual(d1._sign, b1._sign)
+ self.assertEqual(d1._int, b1._int)
+ self.assertEqual(d1._exp, b1._exp)
+ self.assertEqual(d2._sign, b2._sign)
+ self.assertEqual(d2._int, b2._int)
+ self.assertEqual(d2._exp, b2._exp)
+ else:
+ eval("d1." + operation + "()")
+ self.assertEqual(d1._sign, b1._sign)
+ self.assertEqual(d1._int, b1._int)
+ self.assertEqual(d1._exp, b1._exp)
+ return
+
+ Decimal(d1)
+ self.assertEqual(d1._sign, b1._sign)
+ self.assertEqual(d1._int, b1._int)
+ self.assertEqual(d1._exp, b1._exp)
+
+ checkSameDec("__abs__")
+ checkSameDec("__add__", True)
+ checkSameDec("__divmod__", True)
+ checkSameDec("__eq__", True)
+ checkSameDec("__ne__", True)
+ checkSameDec("__le__", True)
+ checkSameDec("__lt__", True)
+ checkSameDec("__ge__", True)
+ checkSameDec("__gt__", True)
+ checkSameDec("__float__")
+ checkSameDec("__floordiv__", True)
+ checkSameDec("__hash__")
+ checkSameDec("__int__")
+ checkSameDec("__trunc__")
+ checkSameDec("__mod__", True)
+ checkSameDec("__mul__", True)
+ checkSameDec("__neg__")
+ checkSameDec("__bool__")
+ checkSameDec("__pos__")
+ checkSameDec("__pow__", True)
+ checkSameDec("__radd__", True)
+ checkSameDec("__rdivmod__", True)
+ checkSameDec("__repr__")
+ checkSameDec("__rfloordiv__", True)
+ checkSameDec("__rmod__", True)
+ checkSameDec("__rmul__", True)
+ checkSameDec("__rpow__", True)
+ checkSameDec("__rsub__", True)
+ checkSameDec("__str__")
+ checkSameDec("__sub__", True)
+ checkSameDec("__truediv__", True)
+ checkSameDec("adjusted")
+ checkSameDec("as_tuple")
+ checkSameDec("compare", True)
+ checkSameDec("max", True)
+ checkSameDec("min", True)
+ checkSameDec("normalize")
+ checkSameDec("quantize", True)
+ checkSameDec("remainder_near", True)
+ checkSameDec("same_quantum", True)
+ checkSameDec("sqrt")
+ checkSameDec("to_eng_string")
+ checkSameDec("to_integral")
+
+ def test_py_decimal_id(self):
+ Decimal = P.Decimal
+
+ d = Decimal(45)
+ e = Decimal(d)
+ self.assertEqual(str(e), '45')
+ self.assertNotEqual(id(d), id(e))
+
+ def test_py_rescale(self):
+ # Coverage
+ Decimal = P.Decimal
+ ROUND_UP = P.ROUND_UP
+ localcontext = P.localcontext
+
+ with localcontext() as c:
+ x = Decimal("NaN")._rescale(3, ROUND_UP)
+ self.assertTrue(x.is_nan())
+
+ def test_py__round(self):
+ # Coverage
+ Decimal = P.Decimal
+ ROUND_UP = P.ROUND_UP
+
+ self.assertRaises(ValueError, Decimal("3.1234")._round, 0, ROUND_UP)
+
+class CFunctionality(unittest.TestCase):
+ """Extra functionality in _decimal"""
+
+ @requires_extra_functionality
+ def test_c_ieee_context(self):
+ # issue 8786: Add support for IEEE 754 contexts to decimal module.
+ IEEEContext = C.IEEEContext
+ DECIMAL32 = C.DECIMAL32
+ DECIMAL64 = C.DECIMAL64
+ DECIMAL128 = C.DECIMAL128
+
+ def assert_rest(self, context):
+ self.assertEqual(context.clamp, 1)
+ assert_signals(self, context, 'traps', [])
+ assert_signals(self, context, 'flags', [])
+
+ c = IEEEContext(DECIMAL32)
+ self.assertEqual(c.prec, 7)
+ self.assertEqual(c.Emax, 96)
+ self.assertEqual(c.Emin, -95)
+ assert_rest(self, c)
+
+ c = IEEEContext(DECIMAL64)
+ self.assertEqual(c.prec, 16)
+ self.assertEqual(c.Emax, 384)
+ self.assertEqual(c.Emin, -383)
+ assert_rest(self, c)
+
+ c = IEEEContext(DECIMAL128)
+ self.assertEqual(c.prec, 34)
+ self.assertEqual(c.Emax, 6144)
+ self.assertEqual(c.Emin, -6143)
+ assert_rest(self, c)
+
+ # Invalid values
+ self.assertRaises(OverflowError, IEEEContext, 2**63)
+ self.assertRaises(ValueError, IEEEContext, -1)
+ self.assertRaises(ValueError, IEEEContext, 1024)
+
+ @requires_extra_functionality
+ def test_c_context(self):
+ Context = C.Context
+
+ c = Context(flags=C.DecClamped, traps=C.DecRounded)
+ self.assertEqual(c._flags, C.DecClamped)
+ self.assertEqual(c._traps, C.DecRounded)
+
+ @requires_extra_functionality
+ def test_constants(self):
+ # Condition flags
+ cond = (
+ C.DecClamped, C.DecConversionSyntax, C.DecDivisionByZero,
+ C.DecDivisionImpossible, C.DecDivisionUndefined,
+ C.DecFpuError, C.DecInexact, C.DecInvalidContext,
+ C.DecInvalidOperation, C.DecMallocError,
+ C.DecFloatOperation, C.DecOverflow, C.DecRounded,
+ C.DecSubnormal, C.DecUnderflow
+ )
+
+ # IEEEContext
+ self.assertEqual(C.DECIMAL32, 32)
+ self.assertEqual(C.DECIMAL64, 64)
+ self.assertEqual(C.DECIMAL128, 128)
+ self.assertEqual(C.IEEE_CONTEXT_MAX_BITS, 512)
+
+ # Rounding modes
+ for i, v in enumerate(RoundingModes[C]):
+ self.assertEqual(v, i)
+ self.assertEqual(C.ROUND_TRUNC, 8)
+
+ # Conditions
+ for i, v in enumerate(cond):
+ self.assertEqual(v, 1<<i)
+
+ self.assertEqual(C.DecIEEEInvalidOperation,
+ C.DecConversionSyntax|
+ C.DecDivisionImpossible|
+ C.DecDivisionUndefined|
+ C.DecFpuError|
+ C.DecInvalidContext|
+ C.DecInvalidOperation|
+ C.DecMallocError)
+
+ self.assertEqual(C.DecErrors,
+ C.DecIEEEInvalidOperation|
+ C.DecDivisionByZero)
+
+ self.assertEqual(C.DecTraps,
+ C.DecErrors|C.DecOverflow|C.DecUnderflow)
+
+class CWhitebox(unittest.TestCase):
+ """Whitebox testing for _decimal"""
+
+ def test_bignum(self):
+ # Not exactly whitebox, but too slow with pydecimal.
+
+ Decimal = C.Decimal
+ localcontext = C.localcontext
+
+ b1 = 10**35
+ b2 = 10**36
+ with localcontext() as c:
+ c.prec = 1000000
+ for i in range(5):
+ a = random.randrange(b1, b2)
+ b = random.randrange(1000, 1200)
+ x = a ** b
+ y = Decimal(a) ** Decimal(b)
+ self.assertEqual(x, y)
+
+ def test_invalid_construction(self):
+ self.assertRaises(TypeError, C.Decimal, 9, "xyz")
+
+ def test_c_input_restriction(self):
+ # Too large for _decimal to be converted exactly
+ Decimal = C.Decimal
+ InvalidOperation = C.InvalidOperation
+ Context = C.Context
+ localcontext = C.localcontext
+
+ with localcontext(Context()):
+ self.assertRaises(InvalidOperation, Decimal,
+ "1e9999999999999999999")
+
+ def test_c_context_repr(self):
+ # This test is _decimal-only because flags are not printed
+ # in the same order.
+ DefaultContext = C.DefaultContext
+ FloatOperation = C.FloatOperation
+ ROUND_HALF_DOWN = C.ROUND_HALF_DOWN
+
+ c = DefaultContext.copy()
+
+ c.prec = 425000000
+ c.Emax = 425000000
+ c.Emin = -425000000
+ c.rounding = ROUND_HALF_DOWN
+ c.capitals = 0
+ c.clamp = 1
+ for sig in OrderedSignals[C]:
+ c.flags[sig] = True
+ c.traps[sig] = True
+ c.flags[FloatOperation] = True
+ c.traps[FloatOperation] = True
+
+ s = c.__repr__()
+ t = "Context(prec=425000000, rounding=ROUND_HALF_DOWN, " \
+ "Emin=-425000000, Emax=425000000, capitals=0, clamp=1, " \
+ "flags=[Clamped, InvalidOperation, DivisionByZero, Inexact, " \
+ "FloatOperation, Overflow, Rounded, Subnormal, Underflow], " \
+ "traps=[Clamped, InvalidOperation, DivisionByZero, Inexact, " \
+ "FloatOperation, Overflow, Rounded, Subnormal, Underflow])"
+ self.assertEqual(s, t)
+
+ def test_c_context_errors(self):
+ Context = C.Context
+ InvalidOperation = C.InvalidOperation
+ Overflow = C.Overflow
+ FloatOperation = C.FloatOperation
+ localcontext = C.localcontext
+ getcontext = C.getcontext
+ setcontext = C.setcontext
+ HAVE_CONFIG_64 = (C.MAX_PREC > 425000000)
+
+ c = Context()
+
+ # SignalDict: input validation
+ self.assertRaises(KeyError, c.flags.__setitem__, 801, 0)
+ self.assertRaises(KeyError, c.traps.__setitem__, 801, 0)
+ self.assertRaises(ValueError, c.flags.__delitem__, Overflow)
+ self.assertRaises(ValueError, c.traps.__delitem__, InvalidOperation)
+ self.assertRaises(TypeError, setattr, c, 'flags', ['x'])
+ self.assertRaises(TypeError, setattr, c,'traps', ['y'])
+ self.assertRaises(KeyError, setattr, c, 'flags', {0:1})
+ self.assertRaises(KeyError, setattr, c, 'traps', {0:1})
+
+ # Test assignment from a signal dict with the correct length but
+ # one invalid key.
+ d = c.flags.copy()
+ del d[FloatOperation]
+ d["XYZ"] = 91283719
+ self.assertRaises(KeyError, setattr, c, 'flags', d)
+ self.assertRaises(KeyError, setattr, c, 'traps', d)
+
+ # Input corner cases
+ int_max = 2**63-1 if HAVE_CONFIG_64 else 2**31-1
+ gt_max_emax = 10**18 if HAVE_CONFIG_64 else 10**9
+
+ # prec, Emax, Emin
+ for attr in ['prec', 'Emax']:
+ self.assertRaises(ValueError, setattr, c, attr, gt_max_emax)
+ self.assertRaises(ValueError, setattr, c, 'Emin', -gt_max_emax)
+
+ # prec, Emax, Emin in context constructor
+ self.assertRaises(ValueError, Context, prec=gt_max_emax)
+ self.assertRaises(ValueError, Context, Emax=gt_max_emax)
+ self.assertRaises(ValueError, Context, Emin=-gt_max_emax)
+
+ # Overflow in conversion
+ self.assertRaises(OverflowError, Context, prec=int_max+1)
+ self.assertRaises(OverflowError, Context, Emax=int_max+1)
+ self.assertRaises(OverflowError, Context, Emin=-int_max-2)
+ self.assertRaises(OverflowError, Context, rounding=int_max+1)
+ self.assertRaises(OverflowError, Context, clamp=int_max+1)
+ self.assertRaises(OverflowError, Context, capitals=int_max+1)
+
+ # OverflowError, general ValueError
+ for attr in ('prec', 'Emin', 'Emax', 'capitals', 'clamp'):
+ self.assertRaises(OverflowError, setattr, c, attr, int_max+1)
+ self.assertRaises(OverflowError, setattr, c, attr, -int_max-2)
+ if sys.platform != 'win32':
+ self.assertRaises(ValueError, setattr, c, attr, int_max)
+ self.assertRaises(ValueError, setattr, c, attr, -int_max-1)
+
+ # OverflowError, general TypeError
+ for attr in ('rounding',):
+ self.assertRaises(OverflowError, setattr, c, attr, int_max+1)
+ self.assertRaises(OverflowError, setattr, c, attr, -int_max-2)
+ if sys.platform != 'win32':
+ self.assertRaises(TypeError, setattr, c, attr, int_max)
+ self.assertRaises(TypeError, setattr, c, attr, -int_max-1)
+
+ # OverflowError: _unsafe_setprec, _unsafe_setemin, _unsafe_setemax
+ if C.MAX_PREC == 425000000:
+ self.assertRaises(OverflowError, getattr(c, '_unsafe_setprec'),
+ int_max+1)
+ self.assertRaises(OverflowError, getattr(c, '_unsafe_setemax'),
+ int_max+1)
+ self.assertRaises(OverflowError, getattr(c, '_unsafe_setemin'),
+ -int_max-2)
+
+ # ValueError: _unsafe_setprec, _unsafe_setemin, _unsafe_setemax
+ if C.MAX_PREC == 425000000:
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setprec'), 0)
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setprec'),
+ 1070000001)
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setemax'), -1)
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setemax'),
+ 1070000001)
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setemin'),
+ -1070000001)
+ self.assertRaises(ValueError, getattr(c, '_unsafe_setemin'), 1)
+
+ # capitals, clamp
+ for attr in ['capitals', 'clamp']:
+ self.assertRaises(ValueError, setattr, c, attr, -1)
+ self.assertRaises(ValueError, setattr, c, attr, 2)
+ self.assertRaises(TypeError, setattr, c, attr, [1,2,3])
+ if HAVE_CONFIG_64:
+ self.assertRaises(ValueError, setattr, c, attr, 2**32)
+ self.assertRaises(ValueError, setattr, c, attr, 2**32+1)
+
+ # Invalid local context
+ self.assertRaises(TypeError, exec, 'with localcontext("xyz"): pass',
+ locals())
+
+ # setcontext
+ saved_context = getcontext()
+ self.assertRaises(TypeError, setcontext, "xyz")
+ setcontext(saved_context)
+
+ @requires_extra_functionality
+ def test_c_context_errors_extra(self):
+ Context = C.Context
+ InvalidOperation = C.InvalidOperation
+ Overflow = C.Overflow
+ localcontext = C.localcontext
+ getcontext = C.getcontext
+ setcontext = C.setcontext
+ HAVE_CONFIG_64 = (C.MAX_PREC > 425000000)
+
+ c = Context()
+
+ # Input corner cases
+ int_max = 2**63-1 if HAVE_CONFIG_64 else 2**31-1
+
+ # OverflowError, general ValueError
+ self.assertRaises(OverflowError, setattr, c, '_allcr', int_max+1)
+ self.assertRaises(OverflowError, setattr, c, '_allcr', -int_max-2)
+ if sys.platform != 'win32':
+ self.assertRaises(ValueError, setattr, c, '_allcr', int_max)
+ self.assertRaises(ValueError, setattr, c, '_allcr', -int_max-1)
+
+ # OverflowError, general TypeError
+ for attr in ('_flags', '_traps'):
+ self.assertRaises(OverflowError, setattr, c, attr, int_max+1)
+ self.assertRaises(OverflowError, setattr, c, attr, -int_max-2)
+ if sys.platform != 'win32':
+ self.assertRaises(TypeError, setattr, c, attr, int_max)
+ self.assertRaises(TypeError, setattr, c, attr, -int_max-1)
+
+ # _allcr
+ self.assertRaises(ValueError, setattr, c, '_allcr', -1)
+ self.assertRaises(ValueError, setattr, c, '_allcr', 2)
+ self.assertRaises(TypeError, setattr, c, '_allcr', [1,2,3])
+ if HAVE_CONFIG_64:
+ self.assertRaises(ValueError, setattr, c, '_allcr', 2**32)
+ self.assertRaises(ValueError, setattr, c, '_allcr', 2**32+1)
+
+ # _flags, _traps
+ for attr in ['_flags', '_traps']:
+ self.assertRaises(TypeError, setattr, c, attr, 999999)
+ self.assertRaises(TypeError, setattr, c, attr, 'x')
+
+ def test_c_valid_context(self):
+ # These tests are for code coverage in _decimal.
+ DefaultContext = C.DefaultContext
+ ROUND_HALF_UP = C.ROUND_HALF_UP
+ Clamped = C.Clamped
+ Underflow = C.Underflow
+ Inexact = C.Inexact
+ Rounded = C.Rounded
+ Subnormal = C.Subnormal
+
+ c = DefaultContext.copy()
+
+ # Exercise all getters and setters
+ c.prec = 34
+ c.rounding = ROUND_HALF_UP
+ c.Emax = 3000
+ c.Emin = -3000
+ c.capitals = 1
+ c.clamp = 0
+
+ self.assertEqual(c.prec, 34)
+ self.assertEqual(c.rounding, ROUND_HALF_UP)
+ self.assertEqual(c.Emin, -3000)
+ self.assertEqual(c.Emax, 3000)
+ self.assertEqual(c.capitals, 1)
+ self.assertEqual(c.clamp, 0)
+
+ self.assertEqual(c.Etiny(), -3033)
+ self.assertEqual(c.Etop(), 2967)
+
+ # Exercise all unsafe setters
+ if C.MAX_PREC == 425000000:
+ c._unsafe_setprec(999999999)
+ c._unsafe_setemax(999999999)
+ c._unsafe_setemin(-999999999)
+ self.assertEqual(c.prec, 999999999)
+ self.assertEqual(c.Emax, 999999999)
+ self.assertEqual(c.Emin, -999999999)
+
+ @requires_extra_functionality
+ def test_c_valid_context_extra(self):
+ DefaultContext = C.DefaultContext
+
+ c = DefaultContext.copy()
+ self.assertEqual(c._allcr, 1)
+ c._allcr = 0
+ self.assertEqual(c._allcr, 0)
+
+ def test_c_round(self):
+ # Restricted input.
+ Decimal = C.Decimal
+ InvalidOperation = C.InvalidOperation
+ localcontext = C.localcontext
+ MAX_EMAX = C.MAX_EMAX
+ MIN_ETINY = C.MIN_ETINY
+ int_max = 2**63-1 if C.MAX_PREC > 425000000 else 2**31-1
+
+ with localcontext() as c:
+ c.traps[InvalidOperation] = True
+ self.assertRaises(InvalidOperation, Decimal("1.23").__round__,
+ -int_max-1)
+ self.assertRaises(InvalidOperation, Decimal("1.23").__round__,
+ int_max)
+ self.assertRaises(InvalidOperation, Decimal("1").__round__,
+ int(MAX_EMAX+1))
+ self.assertRaises(C.InvalidOperation, Decimal("1").__round__,
+ -int(MIN_ETINY-1))
+ self.assertRaises(OverflowError, Decimal("1.23").__round__,
+ -int_max-2)
+ self.assertRaises(OverflowError, Decimal("1.23").__round__,
+ int_max+1)
+
+ def test_c_format(self):
+ # Restricted input
+ Decimal = C.Decimal
+ InvalidOperation = C.InvalidOperation
+ Rounded = C.Rounded
+ localcontext = C.localcontext
+ HAVE_CONFIG_64 = (C.MAX_PREC > 425000000)
+
+ self.assertRaises(TypeError, Decimal(1).__format__, "=10.10", [], 9)
+ self.assertRaises(TypeError, Decimal(1).__format__, "=10.10", 9)
+ self.assertRaises(TypeError, Decimal(1).__format__, [])
+
+ with localcontext() as c:
+ c.traps[InvalidOperation] = True
+ c.traps[Rounded] = True
+ self.assertRaises(ValueError, Decimal(1).__format__, "<>=10.10")
+ maxsize = 2**63-1 if HAVE_CONFIG_64 else 2**31-1
+ self.assertRaises(InvalidOperation, Decimal("1.23456789").__format__,
+ "=%d.1" % maxsize)
+
+ def test_c_integral(self):
+ Decimal = C.Decimal
+ Inexact = C.Inexact
+ ROUND_UP = C.ROUND_UP
+ localcontext = C.localcontext
+
+ x = Decimal(10)
+ self.assertEqual(x.to_integral(), 10)
+ self.assertRaises(TypeError, x.to_integral, '10')
+ self.assertRaises(TypeError, x.to_integral, 10, 'x')
+ self.assertRaises(TypeError, x.to_integral, 10)
+
+ self.assertEqual(x.to_integral_value(), 10)
+ self.assertRaises(TypeError, x.to_integral_value, '10')
+ self.assertRaises(TypeError, x.to_integral_value, 10, 'x')
+ self.assertRaises(TypeError, x.to_integral_value, 10)
+
+ self.assertEqual(x.to_integral_exact(), 10)
+ self.assertRaises(TypeError, x.to_integral_exact, '10')
+ self.assertRaises(TypeError, x.to_integral_exact, 10, 'x')
+ self.assertRaises(TypeError, x.to_integral_exact, 10)
+
+ with localcontext() as c:
+ x = Decimal("99999999999999999999999999.9").to_integral_value(ROUND_UP)
+ self.assertEqual(x, Decimal('100000000000000000000000000'))
+
+ x = Decimal("99999999999999999999999999.9").to_integral_exact(ROUND_UP)
+ self.assertEqual(x, Decimal('100000000000000000000000000'))
+
+ c.traps[Inexact] = True
+ self.assertRaises(Inexact, Decimal("999.9").to_integral_exact, ROUND_UP)
+
+ def test_c_funcs(self):
+ # Invalid arguments
+ Decimal = C.Decimal
+ InvalidOperation = C.InvalidOperation
+ DivisionByZero = C.DivisionByZero
+ ROUND_UP = C.ROUND_UP
+ getcontext = C.getcontext
+ localcontext = C.localcontext
+
+ self.assertEqual(Decimal('9.99e10').to_eng_string(), '99.9E+9')
+
+ self.assertRaises(TypeError, pow, Decimal(1), 2, "3")
+ self.assertRaises(TypeError, Decimal(9).number_class, "x", "y")
+ self.assertRaises(TypeError, Decimal(9).same_quantum, 3, "x", "y")
+
+ self.assertRaises(
+ TypeError,
+ Decimal("1.23456789").quantize, Decimal('1e-100000'), []
+ )
+ self.assertRaises(
+ TypeError,
+ Decimal("1.23456789").quantize, Decimal('1e-100000'), getcontext()
+ )
+ self.assertRaises(
+ TypeError,
+ Decimal("1.23456789").quantize, Decimal('1e-100000'), 10
+ )
+ self.assertRaises(
+ TypeError,
+ Decimal("1.23456789").quantize, Decimal('1e-100000'), ROUND_UP, 1000
+ )
+
+ with localcontext() as c:
+ c.clear_traps()
+
+ # Invalid arguments
+ self.assertRaises(TypeError, c.copy_sign, Decimal(1), "x", "y")
+ self.assertRaises(TypeError, c.canonical, 200)
+ self.assertRaises(TypeError, c.is_canonical, 200)
+ self.assertRaises(TypeError, c.divmod, 9, 8, "x", "y")
+ self.assertRaises(TypeError, c.same_quantum, 9, 3, "x", "y")
+
+ self.assertEqual(str(c.canonical(Decimal(200))), '200')
+ self.assertEqual(c.radix(), 10)
+
+ c.traps[DivisionByZero] = True
+ self.assertRaises(DivisionByZero, Decimal(9).__divmod__, 0)
+ self.assertRaises(DivisionByZero, c.divmod, 9, 0)
+ self.assertTrue(c.flags[InvalidOperation])
+
+ c.clear_flags()
+ c.traps[InvalidOperation] = True
+ self.assertRaises(InvalidOperation, Decimal(9).__divmod__, 0)
+ self.assertRaises(InvalidOperation, c.divmod, 9, 0)
+ self.assertTrue(c.flags[DivisionByZero])
+
+ c.traps[InvalidOperation] = True
+ c.prec = 2
+ self.assertRaises(InvalidOperation, pow, Decimal(1000), 1, 501)
+
+ @requires_extra_functionality
+ def test_c_context_templates(self):
+ self.assertEqual(
+ C.BasicContext._traps,
+ C.DecIEEEInvalidOperation|C.DecDivisionByZero|C.DecOverflow|
+ C.DecUnderflow|C.DecClamped
+ )
+ self.assertEqual(
+ C.DefaultContext._traps,
+ C.DecIEEEInvalidOperation|C.DecDivisionByZero|C.DecOverflow
+ )
+
+ @requires_extra_functionality
+ def test_c_signal_dict(self):
+
+ # SignalDict coverage
+ Context = C.Context
+ DefaultContext = C.DefaultContext
+
+ InvalidOperation = C.InvalidOperation
+ DivisionByZero = C.DivisionByZero
+ Overflow = C.Overflow
+ Subnormal = C.Subnormal
+ Underflow = C.Underflow
+ Rounded = C.Rounded
+ Inexact = C.Inexact
+ Clamped = C.Clamped
+
+ DecClamped = C.DecClamped
+ DecInvalidOperation = C.DecInvalidOperation
+ DecIEEEInvalidOperation = C.DecIEEEInvalidOperation
+
+ def assertIsExclusivelySet(signal, signal_dict):
+ for sig in signal_dict:
+ if sig == signal:
+ self.assertTrue(signal_dict[sig])
+ else:
+ self.assertFalse(signal_dict[sig])
+
+ c = DefaultContext.copy()
+
+ # Signal dict methods
+ self.assertTrue(Overflow in c.traps)
+ c.clear_traps()
+ for k in c.traps.keys():
+ c.traps[k] = True
+ for v in c.traps.values():
+ self.assertTrue(v)
+ c.clear_traps()
+ for k, v in c.traps.items():
+ self.assertFalse(v)
+
+ self.assertFalse(c.flags.get(Overflow))
+ self.assertIs(c.flags.get("x"), None)
+ self.assertEqual(c.flags.get("x", "y"), "y")
+ self.assertRaises(TypeError, c.flags.get, "x", "y", "z")
+
+ self.assertEqual(len(c.flags), len(c.traps))
+ s = sys.getsizeof(c.flags)
+ s = sys.getsizeof(c.traps)
+ s = c.flags.__repr__()
+
+ # Set flags/traps.
+ c.clear_flags()
+ c._flags = DecClamped
+ self.assertTrue(c.flags[Clamped])
+
+ c.clear_traps()
+ c._traps = DecInvalidOperation
+ self.assertTrue(c.traps[InvalidOperation])
+
+ # Set flags/traps from dictionary.
+ c.clear_flags()
+ d = c.flags.copy()
+ d[DivisionByZero] = True
+ c.flags = d
+ assertIsExclusivelySet(DivisionByZero, c.flags)
+
+ c.clear_traps()
+ d = c.traps.copy()
+ d[Underflow] = True
+ c.traps = d
+ assertIsExclusivelySet(Underflow, c.traps)
+
+ # Random constructors
+ IntSignals = {
+ Clamped: C.DecClamped,
+ Rounded: C.DecRounded,
+ Inexact: C.DecInexact,
+ Subnormal: C.DecSubnormal,
+ Underflow: C.DecUnderflow,
+ Overflow: C.DecOverflow,
+ DivisionByZero: C.DecDivisionByZero,
+ InvalidOperation: C.DecIEEEInvalidOperation
+ }
+ IntCond = [
+ C.DecDivisionImpossible, C.DecDivisionUndefined, C.DecFpuError,
+ C.DecInvalidContext, C.DecInvalidOperation, C.DecMallocError,
+ C.DecConversionSyntax,
+ ]
+
+ lim = len(OrderedSignals[C])
+ for r in range(lim):
+ for t in range(lim):
+ for round in RoundingModes[C]:
+ flags = random.sample(OrderedSignals[C], r)
+ traps = random.sample(OrderedSignals[C], t)
+ prec = random.randrange(1, 10000)
+ emin = random.randrange(-10000, 0)
+ emax = random.randrange(0, 10000)
+ clamp = random.randrange(0, 2)
+ caps = random.randrange(0, 2)
+ cr = random.randrange(0, 2)
+ c = Context(prec=prec, rounding=round, Emin=emin, Emax=emax,
+ capitals=caps, clamp=clamp, flags=list(flags),
+ traps=list(traps))
+
+ self.assertEqual(c.prec, prec)
+ self.assertEqual(c.rounding, round)
+ self.assertEqual(c.Emin, emin)
+ self.assertEqual(c.Emax, emax)
+ self.assertEqual(c.capitals, caps)
+ self.assertEqual(c.clamp, clamp)
+
+ f = 0
+ for x in flags:
+ f |= IntSignals[x]
+ self.assertEqual(c._flags, f)
+
+ f = 0
+ for x in traps:
+ f |= IntSignals[x]
+ self.assertEqual(c._traps, f)
+
+ for cond in IntCond:
+ c._flags = cond
+ self.assertTrue(c._flags&DecIEEEInvalidOperation)
+ assertIsExclusivelySet(InvalidOperation, c.flags)
+
+ for cond in IntCond:
+ c._traps = cond
+ self.assertTrue(c._traps&DecIEEEInvalidOperation)
+ assertIsExclusivelySet(InvalidOperation, c.traps)
+
+ def test_invalid_override(self):
+ Decimal = C.Decimal
+
+ try:
+ from locale import CHAR_MAX
+ except ImportError:
+ return
+
+ def make_grouping(lst):
+ return ''.join([chr(x) for x in lst])
+
+ def get_fmt(x, override=None, fmt='n'):
+ return Decimal(x).__format__(fmt, override)
+
+ invalid_grouping = {
+ 'decimal_point' : ',',
+ 'grouping' : make_grouping([255, 255, 0]),
+ 'thousands_sep' : ','
+ }
+ invalid_dot = {
+ 'decimal_point' : 'xxxxx',
+ 'grouping' : make_grouping([3, 3, 0]),
+ 'thousands_sep' : ','
+ }
+ invalid_sep = {
+ 'decimal_point' : '.',
+ 'grouping' : make_grouping([3, 3, 0]),
+ 'thousands_sep' : 'yyyyy'
+ }
+
+ if CHAR_MAX == 127: # negative grouping in override
+ self.assertRaises(ValueError, get_fmt, 12345,
+ invalid_grouping, 'g')
+
+ self.assertRaises(ValueError, get_fmt, 12345, invalid_dot, 'g')
+ self.assertRaises(ValueError, get_fmt, 12345, invalid_sep, 'g')
+
+ def test_exact_conversion(self):
+ Decimal = C.Decimal
+ localcontext = C.localcontext
+ InvalidOperation = C.InvalidOperation
+
+ with localcontext() as c:
+
+ c.traps[InvalidOperation] = True
+
+ # Clamped
+ x = "0e%d" % sys.maxsize
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ x = "0e%d" % (-sys.maxsize-1)
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ # Overflow
+ x = "1e%d" % sys.maxsize
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ # Underflow
+ x = "1e%d" % (-sys.maxsize-1)
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ def test_from_tuple(self):
+ Decimal = C.Decimal
+ localcontext = C.localcontext
+ InvalidOperation = C.InvalidOperation
+ Overflow = C.Overflow
+ Underflow = C.Underflow
+
+ with localcontext() as c:
+
+ c.traps[InvalidOperation] = True
+ c.traps[Overflow] = True
+ c.traps[Underflow] = True
+
+ # SSIZE_MAX
+ x = (1, (), sys.maxsize)
+ self.assertEqual(str(c.create_decimal(x)), '-0E+999999')
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ x = (1, (0, 1, 2), sys.maxsize)
+ self.assertRaises(Overflow, c.create_decimal, x)
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ # SSIZE_MIN
+ x = (1, (), -sys.maxsize-1)
+ self.assertEqual(str(c.create_decimal(x)), '-0E-1000026')
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ x = (1, (0, 1, 2), -sys.maxsize-1)
+ self.assertRaises(Underflow, c.create_decimal, x)
+ self.assertRaises(InvalidOperation, Decimal, x)
+
+ # OverflowError
+ x = (1, (), sys.maxsize+1)
+ self.assertRaises(OverflowError, c.create_decimal, x)
+ self.assertRaises(OverflowError, Decimal, x)
+
+ x = (1, (), -sys.maxsize-2)
+ self.assertRaises(OverflowError, c.create_decimal, x)
+ self.assertRaises(OverflowError, Decimal, x)
+
+ # Specials
+ x = (1, (), "N")
+ self.assertEqual(str(Decimal(x)), '-sNaN')
+ x = (1, (0,), "N")
+ self.assertEqual(str(Decimal(x)), '-sNaN')
+ x = (1, (0, 1), "N")
+ self.assertEqual(str(Decimal(x)), '-sNaN1')
+
+
+all_tests = [
+ CExplicitConstructionTest, PyExplicitConstructionTest,
+ CImplicitConstructionTest, PyImplicitConstructionTest,
+ CFormatTest, PyFormatTest,
+ CArithmeticOperatorsTest, PyArithmeticOperatorsTest,
+ CThreadingTest, PyThreadingTest,
+ CUsabilityTest, PyUsabilityTest,
+ CPythonAPItests, PyPythonAPItests,
+ CContextAPItests, PyContextAPItests,
+ CContextWithStatement, PyContextWithStatement,
+ CContextFlags, PyContextFlags,
+ CSpecialContexts, PySpecialContexts,
+ CContextInputValidation, PyContextInputValidation,
+ CContextSubclassing, PyContextSubclassing,
+ CCoverage, PyCoverage,
+ CFunctionality, PyFunctionality,
+ CWhitebox, PyWhitebox,
+ CIBMTestCases, PyIBMTestCases,
+]
+
+# Delete C tests if _decimal.so is not present.
+if not C:
+ all_tests = all_tests[1::2]
+else:
+ all_tests.insert(0, CheckAttributes)
+
+
def test_main(arith=False, verbose=None, todo_tests=None, debug=None):
""" Execute the tests.
@@ -2374,27 +5114,16 @@ def test_main(arith=False, verbose=None, todo_tests=None, debug=None):
is enabled in regrtest.py
"""
- init()
+ init(C)
+ init(P)
global TEST_ALL, DEBUG
TEST_ALL = arith or is_resource_enabled('decimal')
DEBUG = debug
if todo_tests is None:
- test_classes = [
- DecimalExplicitConstructionTest,
- DecimalImplicitConstructionTest,
- DecimalArithmeticOperatorsTest,
- DecimalFormatTest,
- DecimalUseOfContextTest,
- DecimalUsabilityTest,
- DecimalPythonAPItests,
- ContextAPItests,
- DecimalTest,
- WithStatementTest,
- ContextFlags
- ]
+ test_classes = all_tests
else:
- test_classes = [DecimalTest]
+ test_classes = [CIBMTestCases, PyIBMTestCases]
# Dynamically build custom test definition for each file in the test
# directory and add the definitions to the DecimalTest class. This
@@ -2406,17 +5135,32 @@ def test_main(arith=False, verbose=None, todo_tests=None, debug=None):
if todo_tests is not None and head not in todo_tests:
continue
tester = lambda self, f=filename: self.eval_file(directory + f)
- setattr(DecimalTest, 'test_' + head, tester)
+ setattr(CIBMTestCases, 'test_' + head, tester)
+ setattr(PyIBMTestCases, 'test_' + head, tester)
del filename, head, tail, tester
try:
run_unittest(*test_classes)
if todo_tests is None:
- import decimal as DecimalModule
- run_doctest(DecimalModule, verbose)
+ from doctest import IGNORE_EXCEPTION_DETAIL
+ savedecimal = sys.modules['decimal']
+ if C:
+ sys.modules['decimal'] = C
+ run_doctest(C, verbose, optionflags=IGNORE_EXCEPTION_DETAIL)
+ sys.modules['decimal'] = P
+ run_doctest(P, verbose)
+ sys.modules['decimal'] = savedecimal
finally:
- setcontext(ORIGINAL_CONTEXT)
+ if C: C.setcontext(ORIGINAL_CONTEXT[C])
+ P.setcontext(ORIGINAL_CONTEXT[P])
+ if not C:
+ warnings.warn('C tests skipped: no module named _decimal.',
+ UserWarning)
+ if not orig_sys_decimal is sys.modules['decimal']:
+ raise TestFailed("Internal error: unbalanced number of changes to "
+ "sys.modules['decimal'].")
+
if __name__ == '__main__':
import optparse
diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py
index f0afe1d..a8487d2 100644
--- a/Lib/test/test_deque.py
+++ b/Lib/test/test_deque.py
@@ -472,6 +472,19 @@ class TestBasic(unittest.TestCase):
## self.assertNotEqual(id(d), id(e))
## self.assertEqual(id(e), id(e[-1]))
+ def test_iterator_pickle(self):
+ data = deque(range(200))
+ it = itorg = iter(data)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(list(it), list(data))
+
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(list(it), list(data)[1:])
+
def test_deepcopy(self):
mut = [10]
d = deque([mut])
@@ -524,7 +537,7 @@ class TestBasic(unittest.TestCase):
@support.cpython_only
def test_sizeof(self):
BLOCKLEN = 62
- basesize = support.calcobjsize('2P4PlP')
+ basesize = support.calcobjsize('2P4nlP')
blocksize = struct.calcsize('2P%dP' % BLOCKLEN)
self.assertEqual(object.__sizeof__(deque()), basesize)
check = self.check_sizeof
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index cdaf7d2..b5a10ed 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -654,19 +654,19 @@ class ClassPropertiesAndMethods(unittest.TestCase):
class A(metaclass=AMeta):
pass
self.assertEqual(['AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
class B(metaclass=BMeta):
pass
# BMeta.__new__ calls AMeta.__new__ with super:
self.assertEqual(['BMeta', 'AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
class C(A, B):
pass
# The most derived metaclass is BMeta:
self.assertEqual(['BMeta', 'AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
# BMeta.__prepare__ should've been called:
self.assertIn('BMeta_was_here', C.__dict__)
@@ -674,20 +674,20 @@ class ClassPropertiesAndMethods(unittest.TestCase):
class C2(B, A):
pass
self.assertEqual(['BMeta', 'AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertIn('BMeta_was_here', C2.__dict__)
# Check correct metaclass calculation when a metaclass is declared:
class D(C, metaclass=type):
pass
self.assertEqual(['BMeta', 'AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertIn('BMeta_was_here', D.__dict__)
class E(C, metaclass=AMeta):
pass
self.assertEqual(['BMeta', 'AMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertIn('BMeta_was_here', E.__dict__)
# Special case: the given metaclass isn't a class,
@@ -729,33 +729,33 @@ class ClassPropertiesAndMethods(unittest.TestCase):
pass
self.assertIs(ANotMeta, type(A))
self.assertEqual(['ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
self.assertEqual(['ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
class B(metaclass=BNotMeta):
pass
self.assertIs(BNotMeta, type(B))
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
class C(A, B):
pass
self.assertIs(BNotMeta, type(C))
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
class C2(B, A):
pass
self.assertIs(BNotMeta, type(C2))
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
# This is a TypeError, because of a metaclass conflict:
# BNotMeta is neither a subclass, nor a superclass of type
@@ -767,25 +767,25 @@ class ClassPropertiesAndMethods(unittest.TestCase):
pass
self.assertIs(BNotMeta, type(E))
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
class F(object(), C):
pass
self.assertIs(BNotMeta, type(F))
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
class F2(C, object()):
pass
self.assertIs(BNotMeta, type(F2))
self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls)
- new_calls[:] = []
+ new_calls.clear()
self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls)
- prepare_calls[:] = []
+ prepare_calls.clear()
# TypeError: BNotMeta is neither a
# subclass, nor a superclass of int
@@ -1444,6 +1444,14 @@ order (MRO) for bases """
else:
self.fail("classmethod shouldn't accept keyword args")
+ cm = classmethod(f)
+ self.assertEqual(cm.__dict__, {})
+ cm.x = 42
+ self.assertEqual(cm.x, 42)
+ self.assertEqual(cm.__dict__, {"x" : 42})
+ del cm.x
+ self.assertFalse(hasattr(cm, "x"))
+
@support.impl_detail("the module 'xxsubtype' is internal")
def test_classmethods_in_c(self):
# Testing C-based class methods...
@@ -1491,6 +1499,13 @@ order (MRO) for bases """
self.assertEqual(d.goo(1), (1,))
self.assertEqual(d.foo(1), (d, 1))
self.assertEqual(D.foo(d, 1), (d, 1))
+ sm = staticmethod(None)
+ self.assertEqual(sm.__dict__, {})
+ sm.x = 42
+ self.assertEqual(sm.x, 42)
+ self.assertEqual(sm.__dict__, {"x" : 42})
+ del sm.x
+ self.assertFalse(hasattr(sm, "x"))
@support.impl_detail("the module 'xxsubtype' is internal")
def test_staticmethods_in_c(self):
@@ -1771,6 +1786,7 @@ order (MRO) for bases """
("__format__", format, format_impl, set(), {}),
("__floor__", math.floor, zero, set(), {}),
("__trunc__", math.trunc, zero, set(), {}),
+ ("__trunc__", int, zero, set(), {}),
("__ceil__", math.ceil, zero, set(), {}),
("__dir__", dir, empty_seq, set(), {}),
]
@@ -1816,12 +1832,7 @@ order (MRO) for bases """
for attr, obj in env.items():
setattr(X, attr, obj)
setattr(X, name, ErrDescr())
- try:
- runner(X())
- except MyException:
- pass
- else:
- self.fail("{0!r} didn't raise".format(name))
+ self.assertRaises(MyException, runner, X())
def test_specials(self):
# Testing special operators...
@@ -2258,9 +2269,6 @@ order (MRO) for bases """
# Two essentially featureless objects, just inheriting stuff from
# object.
self.assertEqual(dir(NotImplemented), dir(Ellipsis))
- if support.check_impl_detail():
- # None differs in PyPy: it has a __nonzero__
- self.assertEqual(dir(None), dir(Ellipsis))
# Nasty test case for proxied objects
class Wrapper(object):
@@ -4456,6 +4464,62 @@ order (MRO) for bases """
x.y = 42
self.assertEqual(x["y"], 42)
+ def test_slot_shadows_class_variable(self):
+ with self.assertRaises(ValueError) as cm:
+ class X:
+ __slots__ = ["foo"]
+ foo = None
+ m = str(cm.exception)
+ self.assertEqual("'foo' in __slots__ conflicts with class variable", m)
+
+ def test_set_doc(self):
+ class X:
+ "elephant"
+ X.__doc__ = "banana"
+ self.assertEqual(X.__doc__, "banana")
+ with self.assertRaises(TypeError) as cm:
+ type(list).__dict__["__doc__"].__set__(list, "blah")
+ self.assertIn("can't set list.__doc__", str(cm.exception))
+ with self.assertRaises(TypeError) as cm:
+ type(X).__dict__["__doc__"].__delete__(X)
+ self.assertIn("can't delete X.__doc__", str(cm.exception))
+ self.assertEqual(X.__doc__, "banana")
+
+ def test_qualname(self):
+ descriptors = [str.lower, complex.real, float.real, int.__add__]
+ types = ['method', 'member', 'getset', 'wrapper']
+
+ # make sure we have an example of each type of descriptor
+ for d, n in zip(descriptors, types):
+ self.assertEqual(type(d).__name__, n + '_descriptor')
+
+ for d in descriptors:
+ qualname = d.__objclass__.__qualname__ + '.' + d.__name__
+ self.assertEqual(d.__qualname__, qualname)
+
+ self.assertEqual(str.lower.__qualname__, 'str.lower')
+ self.assertEqual(complex.real.__qualname__, 'complex.real')
+ self.assertEqual(float.real.__qualname__, 'float.real')
+ self.assertEqual(int.__add__.__qualname__, 'int.__add__')
+
+ class X:
+ pass
+ with self.assertRaises(TypeError):
+ del X.__qualname__
+
+ self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__,
+ str, 'Oink')
+
+ def test_qualname_dict(self):
+ ns = {'__qualname__': 'some.name'}
+ tp = type('Foo', (), ns)
+ self.assertEqual(tp.__qualname__, 'some.name')
+ self.assertNotIn('__qualname__', tp.__dict__)
+ self.assertEqual(ns, {'__qualname__': 'some.name'})
+
+ ns = {'__qualname__': 1}
+ self.assertRaises(TypeError, type, 'Foo', (), ns)
+
def test_cycle_through_dict(self):
# See bug #1469629
class X(dict):
@@ -4471,6 +4535,27 @@ order (MRO) for bases """
for o in gc.get_objects():
self.assertIsNot(type(o), X)
+ def test_object_new_and_init_with_parameters(self):
+ # See issue #1683368
+ class OverrideNeither:
+ pass
+ self.assertRaises(TypeError, OverrideNeither, 1)
+ self.assertRaises(TypeError, OverrideNeither, kw=1)
+ class OverrideNew:
+ def __new__(cls, foo, kw=0, *args, **kwds):
+ return object.__new__(cls, *args, **kwds)
+ class OverrideInit:
+ def __init__(self, foo, kw=0, *args, **kwargs):
+ return object.__init__(self, *args, **kwargs)
+ class OverrideBoth(OverrideNew, OverrideInit):
+ pass
+ for case in OverrideNew, OverrideInit, OverrideBoth:
+ case(1)
+ case(1, kw=2)
+ self.assertRaises(TypeError, case, 1, 2, 3)
+ self.assertRaises(TypeError, case, 1, 2, foo=3)
+
+
class DictProxyTests(unittest.TestCase):
def setUp(self):
class C(object):
@@ -4478,6 +4563,8 @@ class DictProxyTests(unittest.TestCase):
pass
self.C = C
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __local__')
def test_iter_keys(self):
# Testing dict-proxy keys...
it = self.C.__dict__.keys()
@@ -4485,8 +4572,10 @@ class DictProxyTests(unittest.TestCase):
keys = list(it)
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
- '__weakref__', 'meth'])
+ '__weakref__', 'meth'])
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __local__')
def test_iter_values(self):
# Testing dict-proxy values...
it = self.C.__dict__.values()
@@ -4494,6 +4583,8 @@ class DictProxyTests(unittest.TestCase):
values = list(it)
self.assertEqual(len(values), 5)
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __local__')
def test_iter_items(self):
# Testing dict-proxy iteritems...
it = self.C.__dict__.items()
@@ -4501,7 +4592,7 @@ class DictProxyTests(unittest.TestCase):
keys = [item[0] for item in it]
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
- '__weakref__', 'meth'])
+ '__weakref__', 'meth'])
def test_dict_type_with_metaclass(self):
# Testing type of __dict__ when metaclass set...
@@ -4515,19 +4606,14 @@ class DictProxyTests(unittest.TestCase):
self.assertEqual(type(C.__dict__), type(B.__dict__))
def test_repr(self):
- # Testing dict_proxy.__repr__
- def sorted_dict_repr(repr_):
- # Given the repr of a dict, sort the keys
- assert repr_.startswith('{')
- assert repr_.endswith('}')
- kvs = repr_[1:-1].split(', ')
- return '{' + ', '.join(sorted(kvs)) + '}'
- dict_ = {k: v for k, v in self.C.__dict__.items()}
- repr_ = repr(self.C.__dict__)
- self.assertTrue(repr_.startswith('dict_proxy('))
- self.assertTrue(repr_.endswith(')'))
- self.assertEqual(sorted_dict_repr(repr_[len('dict_proxy('):-len(')')]),
- sorted_dict_repr('{!r}'.format(dict_)))
+ # Testing mappingproxy.__repr__.
+ # We can't blindly compare with the repr of another dict as ordering
+ # of keys and values is arbitrary and may differ.
+ r = repr(self.C.__dict__)
+ self.assertTrue(r.startswith('mappingproxy('), r)
+ self.assertTrue(r.endswith(')'), r)
+ for k, v in self.C.__dict__.items():
+ self.assertIn('{!r}: {!r}'.format(k, v), r)
class PTypesLongInitTest(unittest.TestCase):
@@ -4552,10 +4638,38 @@ class PTypesLongInitTest(unittest.TestCase):
type.mro(tuple)
+class MiscTests(unittest.TestCase):
+ def test_type_lookup_mro_reference(self):
+ # Issue #14199: _PyType_Lookup() has to keep a strong reference to
+ # the type MRO because it may be modified during the lookup, if
+ # __bases__ is set during the lookup for example.
+ class MyKey(object):
+ def __hash__(self):
+ return hash('mykey')
+
+ def __eq__(self, other):
+ X.__bases__ = (Base2,)
+
+ class Base(object):
+ mykey = 'from Base'
+ mykey2 = 'from Base'
+
+ class Base2(object):
+ mykey = 'from Base2'
+ mykey2 = 'from Base2'
+
+ X = type('X', (Base,), {MyKey(): 5})
+ # mykey is read from Base
+ self.assertEqual(X.mykey, 'from Base')
+ # mykey2 is read from Base2 because MyKey.__eq__ has set __bases__
+ self.assertEqual(X.mykey2, 'from Base2')
+
+
def test_main():
# Run all local test cases, with PTypesLongInitTest first.
support.run_unittest(PTypesLongInitTest, OperatorsTest,
- ClassPropertiesAndMethods, DictProxyTests)
+ ClassPropertiesAndMethods, DictProxyTests,
+ MiscTests)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py
index 2db3d33..f495e18 100644
--- a/Lib/test/test_descrtut.py
+++ b/Lib/test/test_descrtut.py
@@ -170,6 +170,7 @@ You can get the information from the list type:
'__contains__',
'__delattr__',
'__delitem__',
+ '__dir__',
'__doc__',
'__eq__',
'__format__',
@@ -199,6 +200,8 @@ You can get the information from the list type:
'__str__',
'__subclasshook__',
'append',
+ 'clear',
+ 'copy',
'count',
'extend',
'index',
diff --git a/Lib/test/test_devpoll.py b/Lib/test/test_devpoll.py
new file mode 100644
index 0000000..bef4e18
--- /dev/null
+++ b/Lib/test/test_devpoll.py
@@ -0,0 +1,94 @@
+# Test case for the select.devpoll() function
+
+# Initial tests are copied as is from "test_poll.py"
+
+import os, select, random, unittest, sys
+from test.support import TESTFN, run_unittest
+
+try:
+ select.devpoll
+except AttributeError:
+ raise unittest.SkipTest("select.devpoll not defined -- skipping test_devpoll")
+
+
+def find_ready_matching(ready, flag):
+ match = []
+ for fd, mode in ready:
+ if mode & flag:
+ match.append(fd)
+ return match
+
+class DevPollTests(unittest.TestCase):
+
+ def test_devpoll1(self):
+ # Basic functional test of poll object
+ # Create a bunch of pipe and test that poll works with them.
+
+ p = select.devpoll()
+
+ NUM_PIPES = 12
+ MSG = b" This is a test."
+ MSG_LEN = len(MSG)
+ readers = []
+ writers = []
+ r2w = {}
+ w2r = {}
+
+ for i in range(NUM_PIPES):
+ rd, wr = os.pipe()
+ p.register(rd)
+ p.modify(rd, select.POLLIN)
+ p.register(wr, select.POLLOUT)
+ readers.append(rd)
+ writers.append(wr)
+ r2w[rd] = wr
+ w2r[wr] = rd
+
+ bufs = []
+
+ while writers:
+ ready = p.poll()
+ ready_writers = find_ready_matching(ready, select.POLLOUT)
+ if not ready_writers:
+ self.fail("no pipes ready for writing")
+ wr = random.choice(ready_writers)
+ os.write(wr, MSG)
+
+ ready = p.poll()
+ ready_readers = find_ready_matching(ready, select.POLLIN)
+ if not ready_readers:
+ self.fail("no pipes ready for reading")
+ self.assertEqual([w2r[wr]], ready_readers)
+ rd = ready_readers[0]
+ buf = os.read(rd, MSG_LEN)
+ self.assertEqual(len(buf), MSG_LEN)
+ bufs.append(buf)
+ os.close(r2w[rd]) ; os.close(rd)
+ p.unregister(r2w[rd])
+ p.unregister(rd)
+ writers.remove(r2w[rd])
+
+ self.assertEqual(bufs, [MSG] * NUM_PIPES)
+
+ def test_timeout_overflow(self):
+ pollster = select.devpoll()
+ w, r = os.pipe()
+ pollster.register(w)
+
+ pollster.poll(-1)
+ self.assertRaises(OverflowError, pollster.poll, -2)
+ self.assertRaises(OverflowError, pollster.poll, -1 << 31)
+ self.assertRaises(OverflowError, pollster.poll, -1 << 64)
+
+ pollster.poll(0)
+ pollster.poll(1)
+ pollster.poll(1 << 30)
+ self.assertRaises(OverflowError, pollster.poll, 1 << 31)
+ self.assertRaises(OverflowError, pollster.poll, 1 << 63)
+ self.assertRaises(OverflowError, pollster.poll, 1 << 64)
+
+def test_main():
+ run_unittest(DevPollTests)
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index 9666f9a..d1f3192 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -2,7 +2,9 @@ import unittest
from test import support
import collections, random, string
+import collections.abc
import gc, weakref
+import pickle
class DictTest(unittest.TestCase):
@@ -327,6 +329,27 @@ class DictTest(unittest.TestCase):
self.assertEqual(hashed2.hash_count, 1)
self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1)
+ def test_setitem_atomic_at_resize(self):
+ class Hashed(object):
+ def __init__(self):
+ self.hash_count = 0
+ self.eq_count = 0
+ def __hash__(self):
+ self.hash_count += 1
+ return 42
+ def __eq__(self, other):
+ self.eq_count += 1
+ return id(self) == id(other)
+ hashed1 = Hashed()
+ # 5 items
+ y = {hashed1: 5, 0: 0, 1: 1, 2: 2, 3: 3}
+ hashed2 = Hashed()
+ # 6th item forces a resize
+ y[hashed2] = []
+ self.assertEqual(hashed1.hash_count, 1)
+ self.assertEqual(hashed2.hash_count, 1)
+ self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1)
+
def test_popitem(self):
# dict.popitem()
for copymode in -1, +1:
@@ -387,7 +410,7 @@ class DictTest(unittest.TestCase):
x.fail = True
self.assertRaises(Exc, d.pop, x)
- def test_mutatingiteration(self):
+ def test_mutating_iteration(self):
# changing dict size during iteration
d = {}
d[1] = 1
@@ -395,6 +418,32 @@ class DictTest(unittest.TestCase):
for i in d:
d[i+1] = 1
+ def test_mutating_lookup(self):
+ # changing dict during a lookup (issue #14417)
+ class NastyKey:
+ mutate_dict = None
+
+ def __init__(self, value):
+ self.value = value
+
+ def __hash__(self):
+ # hash collision!
+ return 1
+
+ def __eq__(self, other):
+ if NastyKey.mutate_dict:
+ mydict, key = NastyKey.mutate_dict
+ NastyKey.mutate_dict = None
+ del mydict[key]
+ return self.value == other.value
+
+ key1 = NastyKey(1)
+ key2 = NastyKey(2)
+ d = {key1: 1}
+ NastyKey.mutate_dict = (d, key1)
+ d[key2] = 2
+ self.assertEqual(d, {key2: 2})
+
def test_repr(self):
d = {}
self.assertEqual(repr(d), '{}')
@@ -784,6 +833,75 @@ class DictTest(unittest.TestCase):
pass
self._tracked(MyDict())
+ def test_iterator_pickling(self):
+ data = {1:"a", 2:"b", 3:"c"}
+ it = iter(data)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(sorted(it), sorted(data))
+
+ it = pickle.loads(d)
+ try:
+ drop = next(it)
+ except StopIteration:
+ return
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ del data[drop]
+ self.assertEqual(sorted(it), sorted(data))
+
+ def test_itemiterator_pickling(self):
+ data = {1:"a", 2:"b", 3:"c"}
+ # dictviews aren't picklable, only their iterators
+ itorg = iter(data.items())
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ # note that the type of type of the unpickled iterator
+ # is not necessarily the same as the original. It is
+ # merely an object supporting the iterator protocol, yielding
+ # the same objects as the original one.
+ # self.assertEqual(type(itorg), type(it))
+ self.assertTrue(isinstance(it, collections.abc.Iterator))
+ self.assertEqual(dict(it), data)
+
+ it = pickle.loads(d)
+ drop = next(it)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ del data[drop[0]]
+ self.assertEqual(dict(it), data)
+
+ def test_valuesiterator_pickling(self):
+ data = {1:"a", 2:"b", 3:"c"}
+ # data.values() isn't picklable, only its iterator
+ it = iter(data.values())
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(sorted(list(it)), sorted(list(data.values())))
+
+ it = pickle.loads(d)
+ drop = next(it)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ values = list(it) + [drop]
+ self.assertEqual(sorted(values), sorted(list(data.values())))
+
+ def test_instance_dict_getattr_str_subclass(self):
+ class Foo:
+ def __init__(self, msg):
+ self.msg = msg
+ f = Foo('123')
+ class _str(str):
+ pass
+ self.assertEqual(f.msg, getattr(f, _str('msg')))
+ self.assertEqual(f.msg, f.__dict__[_str('msg')])
+
+ def test_object_set_item_single_instance_non_str_key(self):
+ class Foo: pass
+ f = Foo()
+ f.__dict__[1] = 1
+ f.a = 'a'
+ self.assertEqual(f.__dict__, {1:1, 'a':'a'})
from test import mapping_tests
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index 5c59eaa..1bcd693 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -1,11 +1,35 @@
# Minimal tests for dis module
from test.support import run_unittest, captured_stdout
+import difflib
import unittest
import sys
import dis
import io
+class _C:
+ def __init__(self, x):
+ self.x = x == 1
+
+dis_c_instance_method = """\
+ %-4d 0 LOAD_FAST 1 (x)
+ 3 LOAD_CONST 1 (1)
+ 6 COMPARE_OP 2 (==)
+ 9 LOAD_FAST 0 (self)
+ 12 STORE_ATTR 0 (x)
+ 15 LOAD_CONST 0 (None)
+ 18 RETURN_VALUE
+""" % (_C.__init__.__code__.co_firstlineno + 1,)
+
+dis_c_instance_method_bytes = """\
+ 0 LOAD_FAST 1 (1)
+ 3 LOAD_CONST 1 (1)
+ 6 COMPARE_OP 2 (==)
+ 9 LOAD_FAST 0 (0)
+ 12 STORE_ATTR 0 (0)
+ 15 LOAD_CONST 0 (0)
+ 18 RETURN_VALUE
+"""
def _f(a):
print(a)
@@ -14,7 +38,7 @@ def _f(a):
dis_f = """\
%-4d 0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 0 (a)
- 6 CALL_FUNCTION 1
+ 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
%-4d 10 LOAD_CONST 1 (1)
@@ -23,6 +47,16 @@ dis_f = """\
_f.__code__.co_firstlineno + 2)
+dis_f_co_code = """\
+ 0 LOAD_GLOBAL 0 (0)
+ 3 LOAD_FAST 0 (0)
+ 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
+ 9 POP_TOP
+ 10 LOAD_CONST 1 (1)
+ 13 RETURN_VALUE
+"""
+
+
def bug708901():
for res in range(1,
10):
@@ -34,7 +68,7 @@ dis_bug708901 = """\
6 LOAD_CONST 1 (1)
%-4d 9 LOAD_CONST 2 (10)
- 12 CALL_FUNCTION 2
+ 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
15 GET_ITER
>> 16 FOR_ITER 6 (to 25)
19 STORE_FAST 0 (res)
@@ -138,18 +172,27 @@ dis_compound_stmt_str = """\
"""
class DisTests(unittest.TestCase):
- def do_disassembly_test(self, func, expected):
+
+ def get_disassembly(self, func, lasti=-1, wrapper=True):
s = io.StringIO()
save_stdout = sys.stdout
sys.stdout = s
- dis.dis(func)
- sys.stdout = save_stdout
- got = s.getvalue()
+ try:
+ if wrapper:
+ dis.dis(func)
+ else:
+ dis.disassemble(func, lasti)
+ finally:
+ sys.stdout = save_stdout
# Trim trailing blanks (if any).
- lines = got.split('\n')
- lines = [line.rstrip() for line in lines]
- expected = expected.split("\n")
- import difflib
+ return [line.rstrip() for line in s.getvalue().splitlines()]
+
+ def get_disassemble_as_string(self, func, lasti=-1):
+ return '\n'.join(self.get_disassembly(func, lasti, False))
+
+ def do_disassembly_test(self, func, expected):
+ lines = self.get_disassembly(func)
+ expected = expected.splitlines()
if expected != lines:
self.fail(
"events did not match expectation:\n" +
@@ -157,7 +200,7 @@ class DisTests(unittest.TestCase):
lines)))
def test_opmap(self):
- self.assertEqual(dis.opmap["STOP_CODE"], 0)
+ self.assertEqual(dis.opmap["NOP"], 9)
self.assertIn(dis.opmap["LOAD_CONST"], dis.hasconst)
self.assertIn(dis.opmap["STORE_NAME"], dis.hasname)
@@ -211,6 +254,44 @@ class DisTests(unittest.TestCase):
self.do_disassembly_test(simple_stmt_str, dis_simple_stmt_str)
self.do_disassembly_test(compound_stmt_str, dis_compound_stmt_str)
+ def test_disassemble_bytes(self):
+ self.do_disassembly_test(_f.__code__.co_code, dis_f_co_code)
+
+ def test_disassemble_method(self):
+ self.do_disassembly_test(_C(1).__init__, dis_c_instance_method)
+
+ def test_disassemble_method_bytes(self):
+ method_bytecode = _C(1).__init__.__code__.co_code
+ self.do_disassembly_test(method_bytecode, dis_c_instance_method_bytes)
+
+ def test_dis_none(self):
+ try:
+ del sys.last_traceback
+ except AttributeError:
+ pass
+ self.assertRaises(RuntimeError, dis.dis, None)
+
+ def test_dis_object(self):
+ self.assertRaises(TypeError, dis.dis, object())
+
+ def test_dis_traceback(self):
+ try:
+ del sys.last_traceback
+ except AttributeError:
+ pass
+
+ try:
+ 1/0
+ except Exception as e:
+ tb = e.__traceback__
+ sys.last_traceback = tb
+
+ tb_dis = self.get_disassemble_as_string(tb.tb_frame.f_code, tb.tb_lasti)
+ self.do_disassembly_test(None, tb_dis)
+
+ def test_dis_object(self):
+ self.assertRaises(TypeError, dis.dis, object())
+
code_info_code_info = """\
Name: code_info
Filename: (.*)
@@ -258,6 +339,7 @@ Flags: OPTIMIZED, NEWLOCALS, VARARGS, VARKEYWORDS, GENERATOR
Constants:
0: None
1: <code object f at (.*), file "(.*)", line (.*)>
+ 2: 'tricky.<locals>.f'
Variable names:
0: x
1: y
@@ -364,6 +446,13 @@ class CodeInfoTests(unittest.TestCase):
dis.show_code(x)
self.assertRegex(output.getvalue(), expected+"\n")
+ def test_code_info_object(self):
+ self.assertRaises(TypeError, dis.code_info, object())
+
+ def test_pretty_flags_no_flags(self):
+ self.assertEqual(dis.pretty_flags(0), '0x0')
+
+
def test_main():
run_unittest(DisTests, CodeInfoTests)
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index a6c17cc..8f8c7c7 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -5,6 +5,7 @@ Test script for doctest.
from test import support
import doctest
import os
+import sys
# NOTE: There are some additional tests relating to interaction with
@@ -432,7 +433,7 @@ We'll simulate a __file__ attr that ends in pyc:
>>> tests = finder.find(sample_func)
>>> print(tests) # doctest: +ELLIPSIS
- [<DocTest sample_func from ...:17 (1 example)>]
+ [<DocTest sample_func from ...:18 (1 example)>]
The exact name depends on how test_doctest was invoked, so allow for
leading path components.
@@ -1745,226 +1746,227 @@ Run the debugger on the docstring, and then restore sys.stdin.
"""
-def test_pdb_set_trace():
- """Using pdb.set_trace from a doctest.
-
- You can use pdb.set_trace from a doctest. To do so, you must
- retrieve the set_trace function from the pdb module at the time
- you use it. The doctest module changes sys.stdout so that it can
- capture program output. It also temporarily replaces pdb.set_trace
- with a version that restores stdout. This is necessary for you to
- see debugger output.
-
- >>> doc = '''
- ... >>> x = 42
- ... >>> raise Exception('clé')
- ... Traceback (most recent call last):
- ... Exception: clé
- ... >>> import pdb; pdb.set_trace()
- ... '''
- >>> parser = doctest.DocTestParser()
- >>> test = parser.get_doctest(doc, {}, "foo-bar@baz", "foo-bar@baz.py", 0)
- >>> runner = doctest.DocTestRunner(verbose=False)
-
- To demonstrate this, we'll create a fake standard input that
- captures our debugger input:
-
- >>> import tempfile
- >>> real_stdin = sys.stdin
- >>> sys.stdin = _FakeInput([
- ... 'print(x)', # print data defined by the example
- ... 'continue', # stop debugging
- ... ''])
-
- >>> try: runner.run(test)
- ... finally: sys.stdin = real_stdin
- --Return--
- > <doctest foo-bar@baz[2]>(1)<module>()->None
- -> import pdb; pdb.set_trace()
- (Pdb) print(x)
- 42
- (Pdb) continue
- TestResults(failed=0, attempted=3)
-
- You can also put pdb.set_trace in a function called from a test:
-
- >>> def calls_set_trace():
- ... y=2
- ... import pdb; pdb.set_trace()
-
- >>> doc = '''
- ... >>> x=1
- ... >>> calls_set_trace()
- ... '''
- >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
- >>> real_stdin = sys.stdin
- >>> sys.stdin = _FakeInput([
- ... 'print(y)', # print data defined in the function
- ... 'up', # out of function
- ... 'print(x)', # print data defined by the example
- ... 'continue', # stop debugging
- ... ''])
-
- >>> try:
- ... runner.run(test)
- ... finally:
- ... sys.stdin = real_stdin
- --Return--
- > <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None
- -> import pdb; pdb.set_trace()
- (Pdb) print(y)
- 2
- (Pdb) up
- > <doctest foo-bar@baz[1]>(1)<module>()
- -> calls_set_trace()
- (Pdb) print(x)
- 1
- (Pdb) continue
- TestResults(failed=0, attempted=2)
-
- During interactive debugging, source code is shown, even for
- doctest examples:
-
- >>> doc = '''
- ... >>> def f(x):
- ... ... g(x*2)
- ... >>> def g(x):
- ... ... print(x+3)
- ... ... import pdb; pdb.set_trace()
- ... >>> f(3)
- ... '''
- >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
- >>> real_stdin = sys.stdin
- >>> sys.stdin = _FakeInput([
- ... 'list', # list source from example 2
- ... 'next', # return from g()
- ... 'list', # list source from example 1
- ... 'next', # return from f()
- ... 'list', # list source from example 3
- ... 'continue', # stop debugging
- ... ''])
- >>> try: runner.run(test)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- --Return--
- > <doctest foo-bar@baz[1]>(3)g()->None
- -> import pdb; pdb.set_trace()
- (Pdb) list
- 1 def g(x):
- 2 print(x+3)
- 3 -> import pdb; pdb.set_trace()
- [EOF]
- (Pdb) next
- --Return--
- > <doctest foo-bar@baz[0]>(2)f()->None
- -> g(x*2)
- (Pdb) list
- 1 def f(x):
- 2 -> g(x*2)
- [EOF]
- (Pdb) next
- --Return--
- > <doctest foo-bar@baz[2]>(1)<module>()->None
- -> f(3)
- (Pdb) list
- 1 -> f(3)
- [EOF]
- (Pdb) continue
- **********************************************************************
- File "foo-bar@baz.py", line 7, in foo-bar@baz
- Failed example:
- f(3)
- Expected nothing
- Got:
- 9
- TestResults(failed=1, attempted=3)
- """
-
-def test_pdb_set_trace_nested():
- """This illustrates more-demanding use of set_trace with nested functions.
-
- >>> class C(object):
- ... def calls_set_trace(self):
- ... y = 1
- ... import pdb; pdb.set_trace()
- ... self.f1()
- ... y = 2
- ... def f1(self):
- ... x = 1
- ... self.f2()
- ... x = 2
- ... def f2(self):
- ... z = 1
- ... z = 2
-
- >>> calls_set_trace = C().calls_set_trace
-
- >>> doc = '''
- ... >>> a = 1
- ... >>> calls_set_trace()
- ... '''
- >>> parser = doctest.DocTestParser()
- >>> runner = doctest.DocTestRunner(verbose=False)
- >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
- >>> real_stdin = sys.stdin
- >>> sys.stdin = _FakeInput([
- ... 'print(y)', # print data defined in the function
- ... 'step', 'step', 'step', 'step', 'step', 'step', 'print(z)',
- ... 'up', 'print(x)',
- ... 'up', 'print(y)',
- ... 'up', 'print(foo)',
- ... 'continue', # stop debugging
- ... ''])
-
- >>> try:
- ... runner.run(test)
- ... finally:
- ... sys.stdin = real_stdin
- ... # doctest: +REPORT_NDIFF
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
- -> self.f1()
- (Pdb) print(y)
- 1
- (Pdb) step
- --Call--
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1()
- -> def f1(self):
- (Pdb) step
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1()
- -> x = 1
- (Pdb) step
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
- -> self.f2()
- (Pdb) step
- --Call--
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2()
- -> def f2(self):
- (Pdb) step
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2()
- -> z = 1
- (Pdb) step
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2()
- -> z = 2
- (Pdb) print(z)
- 1
- (Pdb) up
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
- -> self.f2()
- (Pdb) print(x)
- 1
- (Pdb) up
- > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
- -> self.f1()
- (Pdb) print(y)
- 1
- (Pdb) up
- > <doctest foo-bar@baz[1]>(1)<module>()
- -> calls_set_trace()
- (Pdb) print(foo)
- *** NameError: name 'foo' is not defined
- (Pdb) continue
- TestResults(failed=0, attempted=2)
-"""
+if not hasattr(sys, 'gettrace') or not sys.gettrace():
+ def test_pdb_set_trace():
+ """Using pdb.set_trace from a doctest.
+
+ You can use pdb.set_trace from a doctest. To do so, you must
+ retrieve the set_trace function from the pdb module at the time
+ you use it. The doctest module changes sys.stdout so that it can
+ capture program output. It also temporarily replaces pdb.set_trace
+ with a version that restores stdout. This is necessary for you to
+ see debugger output.
+
+ >>> doc = '''
+ ... >>> x = 42
+ ... >>> raise Exception('clé')
+ ... Traceback (most recent call last):
+ ... Exception: clé
+ ... >>> import pdb; pdb.set_trace()
+ ... '''
+ >>> parser = doctest.DocTestParser()
+ >>> test = parser.get_doctest(doc, {}, "foo-bar@baz", "foo-bar@baz.py", 0)
+ >>> runner = doctest.DocTestRunner(verbose=False)
+
+ To demonstrate this, we'll create a fake standard input that
+ captures our debugger input:
+
+ >>> import tempfile
+ >>> real_stdin = sys.stdin
+ >>> sys.stdin = _FakeInput([
+ ... 'print(x)', # print data defined by the example
+ ... 'continue', # stop debugging
+ ... ''])
+
+ >>> try: runner.run(test)
+ ... finally: sys.stdin = real_stdin
+ --Return--
+ > <doctest foo-bar@baz[2]>(1)<module>()->None
+ -> import pdb; pdb.set_trace()
+ (Pdb) print(x)
+ 42
+ (Pdb) continue
+ TestResults(failed=0, attempted=3)
+
+ You can also put pdb.set_trace in a function called from a test:
+
+ >>> def calls_set_trace():
+ ... y=2
+ ... import pdb; pdb.set_trace()
+
+ >>> doc = '''
+ ... >>> x=1
+ ... >>> calls_set_trace()
+ ... '''
+ >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
+ >>> real_stdin = sys.stdin
+ >>> sys.stdin = _FakeInput([
+ ... 'print(y)', # print data defined in the function
+ ... 'up', # out of function
+ ... 'print(x)', # print data defined by the example
+ ... 'continue', # stop debugging
+ ... ''])
+
+ >>> try:
+ ... runner.run(test)
+ ... finally:
+ ... sys.stdin = real_stdin
+ --Return--
+ > <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None
+ -> import pdb; pdb.set_trace()
+ (Pdb) print(y)
+ 2
+ (Pdb) up
+ > <doctest foo-bar@baz[1]>(1)<module>()
+ -> calls_set_trace()
+ (Pdb) print(x)
+ 1
+ (Pdb) continue
+ TestResults(failed=0, attempted=2)
+
+ During interactive debugging, source code is shown, even for
+ doctest examples:
+
+ >>> doc = '''
+ ... >>> def f(x):
+ ... ... g(x*2)
+ ... >>> def g(x):
+ ... ... print(x+3)
+ ... ... import pdb; pdb.set_trace()
+ ... >>> f(3)
+ ... '''
+ >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
+ >>> real_stdin = sys.stdin
+ >>> sys.stdin = _FakeInput([
+ ... 'list', # list source from example 2
+ ... 'next', # return from g()
+ ... 'list', # list source from example 1
+ ... 'next', # return from f()
+ ... 'list', # list source from example 3
+ ... 'continue', # stop debugging
+ ... ''])
+ >>> try: runner.run(test)
+ ... finally: sys.stdin = real_stdin
+ ... # doctest: +NORMALIZE_WHITESPACE
+ --Return--
+ > <doctest foo-bar@baz[1]>(3)g()->None
+ -> import pdb; pdb.set_trace()
+ (Pdb) list
+ 1 def g(x):
+ 2 print(x+3)
+ 3 -> import pdb; pdb.set_trace()
+ [EOF]
+ (Pdb) next
+ --Return--
+ > <doctest foo-bar@baz[0]>(2)f()->None
+ -> g(x*2)
+ (Pdb) list
+ 1 def f(x):
+ 2 -> g(x*2)
+ [EOF]
+ (Pdb) next
+ --Return--
+ > <doctest foo-bar@baz[2]>(1)<module>()->None
+ -> f(3)
+ (Pdb) list
+ 1 -> f(3)
+ [EOF]
+ (Pdb) continue
+ **********************************************************************
+ File "foo-bar@baz.py", line 7, in foo-bar@baz
+ Failed example:
+ f(3)
+ Expected nothing
+ Got:
+ 9
+ TestResults(failed=1, attempted=3)
+ """
+
+ def test_pdb_set_trace_nested():
+ """This illustrates more-demanding use of set_trace with nested functions.
+
+ >>> class C(object):
+ ... def calls_set_trace(self):
+ ... y = 1
+ ... import pdb; pdb.set_trace()
+ ... self.f1()
+ ... y = 2
+ ... def f1(self):
+ ... x = 1
+ ... self.f2()
+ ... x = 2
+ ... def f2(self):
+ ... z = 1
+ ... z = 2
+
+ >>> calls_set_trace = C().calls_set_trace
+
+ >>> doc = '''
+ ... >>> a = 1
+ ... >>> calls_set_trace()
+ ... '''
+ >>> parser = doctest.DocTestParser()
+ >>> runner = doctest.DocTestRunner(verbose=False)
+ >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
+ >>> real_stdin = sys.stdin
+ >>> sys.stdin = _FakeInput([
+ ... 'print(y)', # print data defined in the function
+ ... 'step', 'step', 'step', 'step', 'step', 'step', 'print(z)',
+ ... 'up', 'print(x)',
+ ... 'up', 'print(y)',
+ ... 'up', 'print(foo)',
+ ... 'continue', # stop debugging
+ ... ''])
+
+ >>> try:
+ ... runner.run(test)
+ ... finally:
+ ... sys.stdin = real_stdin
+ ... # doctest: +REPORT_NDIFF
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
+ -> self.f1()
+ (Pdb) print(y)
+ 1
+ (Pdb) step
+ --Call--
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1()
+ -> def f1(self):
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1()
+ -> x = 1
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
+ -> self.f2()
+ (Pdb) step
+ --Call--
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2()
+ -> def f2(self):
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2()
+ -> z = 1
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2()
+ -> z = 2
+ (Pdb) print(z)
+ 1
+ (Pdb) up
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
+ -> self.f2()
+ (Pdb) print(x)
+ 1
+ (Pdb) up
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
+ -> self.f1()
+ (Pdb) print(y)
+ 1
+ (Pdb) up
+ > <doctest foo-bar@baz[1]>(1)<module>()
+ -> calls_set_trace()
+ (Pdb) print(foo)
+ *** NameError: name 'foo' is not defined
+ (Pdb) continue
+ TestResults(failed=0, attempted=2)
+ """
def test_DocTestSuite():
"""DocTestSuite creates a unittest test suite from a doctest.
@@ -2566,7 +2568,7 @@ import sys, re, io
def test_coverage(coverdir):
trace = support.import_module('trace')
- tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
+ tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],
trace=0, count=1)
tracer.run('test_main()')
r = tracer.results()
diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py
index c61078d..2fafe1d 100644
--- a/Lib/test/test_dummy_thread.py
+++ b/Lib/test/test_dummy_thread.py
@@ -35,8 +35,8 @@ class LockTests(unittest.TestCase):
"Lock object did not release properly.")
def test_improper_release(self):
- #Make sure release of an unlocked thread raises _thread.error
- self.assertRaises(_thread.error, self.lock.release)
+ #Make sure release of an unlocked thread raises RuntimeError
+ self.assertRaises(RuntimeError, self.lock.release)
def test_cond_acquire_success(self):
#Make sure the conditional acquiring of the lock works.
diff --git a/Lib/test/test_email.py b/Lib/test/test_email.py
deleted file mode 100644
index 5eebba5..0000000
--- a/Lib/test/test_email.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (C) 2001-2007 Python Software Foundation
-# email package unit tests
-
-# The specific tests now live in Lib/email/test
-from email.test.test_email import suite
-from email.test.test_email_codecs import suite as codecs_suite
-from test import support
-
-def test_main():
- support.run_unittest(suite())
- support.run_unittest(codecs_suite())
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/test/test_email/__init__.py b/Lib/test/test_email/__init__.py
new file mode 100644
index 0000000..f206ace
--- /dev/null
+++ b/Lib/test/test_email/__init__.py
@@ -0,0 +1,150 @@
+import os
+import sys
+import unittest
+import test.support
+import email
+from email.message import Message
+from email._policybase import compat32
+from test.test_email import __file__ as landmark
+
+# Run all tests in package for '-m unittest test.test_email'
+def load_tests(loader, standard_tests, pattern):
+ this_dir = os.path.dirname(__file__)
+ if pattern is None:
+ pattern = "test*"
+ package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
+ standard_tests.addTests(package_tests)
+ return standard_tests
+
+
+# used by regrtest and __main__.
+def test_main():
+ here = os.path.dirname(__file__)
+ # Unittest mucks with the path, so we have to save and restore
+ # it to keep regrtest happy.
+ savepath = sys.path[:]
+ test.support._run_suite(unittest.defaultTestLoader.discover(here))
+ sys.path[:] = savepath
+
+
+# helper code used by a number of test modules.
+
+def openfile(filename, *args, **kws):
+ path = os.path.join(os.path.dirname(landmark), 'data', filename)
+ return open(path, *args, **kws)
+
+
+# Base test class
+class TestEmailBase(unittest.TestCase):
+
+ maxDiff = None
+ # Currently the default policy is compat32. By setting that as the default
+ # here we make minimal changes in the test_email tests compared to their
+ # pre-3.3 state.
+ policy = compat32
+
+ def __init__(self, *args, **kw):
+ super().__init__(*args, **kw)
+ self.addTypeEqualityFunc(bytes, self.assertBytesEqual)
+
+ # Backward compatibility to minimize test_email test changes.
+ ndiffAssertEqual = unittest.TestCase.assertEqual
+
+ def _msgobj(self, filename):
+ with openfile(filename) as fp:
+ return email.message_from_file(fp, policy=self.policy)
+
+ def _str_msg(self, string, message=Message, policy=None):
+ if policy is None:
+ policy = self.policy
+ return email.message_from_string(string, message, policy=policy)
+
+ def _bytes_repr(self, b):
+ return [repr(x) for x in b.splitlines(keepends=True)]
+
+ def assertBytesEqual(self, first, second, msg):
+ """Our byte strings are really encoded strings; improve diff output"""
+ self.assertEqual(self._bytes_repr(first), self._bytes_repr(second))
+
+ def assertDefectsEqual(self, actual, expected):
+ self.assertEqual(len(actual), len(expected), actual)
+ for i in range(len(actual)):
+ self.assertIsInstance(actual[i], expected[i],
+ 'item {}'.format(i))
+
+
+def parameterize(cls):
+ """A test method parameterization class decorator.
+
+ Parameters are specified as the value of a class attribute that ends with
+ the string '_params'. Call the portion before '_params' the prefix. Then
+ a method to be parameterized must have the same prefix, the string
+ '_as_', and an arbitrary suffix.
+
+ The value of the _params attribute may be either a dictionary or a list.
+ The values in the dictionary and the elements of the list may either be
+ single values, or a list. If single values, they are turned into single
+ element tuples. However derived, the resulting sequence is passed via
+ *args to the parameterized test function.
+
+ In a _params dictioanry, the keys become part of the name of the generated
+ tests. In a _params list, the values in the list are converted into a
+ string by joining the string values of the elements of the tuple by '_' and
+ converting any blanks into '_'s, and this become part of the name.
+ The full name of a generated test is a 'test_' prefix, the portion of the
+ test function name after the '_as_' separator, plus an '_', plus the name
+ derived as explained above.
+
+ For example, if we have:
+
+ count_params = range(2)
+
+ def count_as_foo_arg(self, foo):
+ self.assertEqual(foo+1, myfunc(foo))
+
+ we will get parameterized test methods named:
+ test_foo_arg_0
+ test_foo_arg_1
+ test_foo_arg_2
+
+ Or we could have:
+
+ example_params = {'foo': ('bar', 1), 'bing': ('bang', 2)}
+
+ def example_as_myfunc_input(self, name, count):
+ self.assertEqual(name+str(count), myfunc(name, count))
+
+ and get:
+ test_myfunc_input_foo
+ test_myfunc_input_bing
+
+ Note: if and only if the generated test name is a valid identifier can it
+ be used to select the test individually from the unittest command line.
+
+ """
+ paramdicts = {}
+ for name, attr in cls.__dict__.items():
+ if name.endswith('_params'):
+ if not hasattr(attr, 'keys'):
+ d = {}
+ for x in attr:
+ if not hasattr(x, '__iter__'):
+ x = (x,)
+ n = '_'.join(str(v) for v in x).replace(' ', '_')
+ d[n] = x
+ attr = d
+ paramdicts[name[:-7] + '_as_'] = attr
+ testfuncs = {}
+ for name, attr in cls.__dict__.items():
+ for paramsname, paramsdict in paramdicts.items():
+ if name.startswith(paramsname):
+ testnameroot = 'test_' + name[len(paramsname):]
+ for paramname, params in paramsdict.items():
+ test = (lambda self, name=name, params=params:
+ getattr(self, name)(*params))
+ testname = testnameroot + '_' + paramname
+ test.__name__ = testname
+ testfuncs[testname] = test
+ for key, value in testfuncs.items():
+ setattr(cls, key, value)
+ return cls
diff --git a/Lib/test/test_email/__main__.py b/Lib/test/test_email/__main__.py
new file mode 100644
index 0000000..98af9ec
--- /dev/null
+++ b/Lib/test/test_email/__main__.py
@@ -0,0 +1,3 @@
+from test.test_email import test_main
+
+test_main()
diff --git a/Lib/email/test/data/PyBanner048.gif b/Lib/test/test_email/data/PyBanner048.gif
index 1a5c87f..1a5c87f 100644
--- a/Lib/email/test/data/PyBanner048.gif
+++ b/Lib/test/test_email/data/PyBanner048.gif
Binary files differ
diff --git a/Lib/email/test/data/audiotest.au b/Lib/test/test_email/data/audiotest.au
index f76b050..f76b050 100644
--- a/Lib/email/test/data/audiotest.au
+++ b/Lib/test/test_email/data/audiotest.au
Binary files differ
diff --git a/Lib/email/test/data/msg_01.txt b/Lib/test/test_email/data/msg_01.txt
index 7e33bcf..7e33bcf 100644
--- a/Lib/email/test/data/msg_01.txt
+++ b/Lib/test/test_email/data/msg_01.txt
diff --git a/Lib/email/test/data/msg_02.txt b/Lib/test/test_email/data/msg_02.txt
index 43f2480..43f2480 100644
--- a/Lib/email/test/data/msg_02.txt
+++ b/Lib/test/test_email/data/msg_02.txt
diff --git a/Lib/email/test/data/msg_03.txt b/Lib/test/test_email/data/msg_03.txt
index c748ebf..c748ebf 100644
--- a/Lib/email/test/data/msg_03.txt
+++ b/Lib/test/test_email/data/msg_03.txt
diff --git a/Lib/email/test/data/msg_04.txt b/Lib/test/test_email/data/msg_04.txt
index 1f633c4..1f633c4 100644
--- a/Lib/email/test/data/msg_04.txt
+++ b/Lib/test/test_email/data/msg_04.txt
diff --git a/Lib/email/test/data/msg_05.txt b/Lib/test/test_email/data/msg_05.txt
index 87d5e9c..87d5e9c 100644
--- a/Lib/email/test/data/msg_05.txt
+++ b/Lib/test/test_email/data/msg_05.txt
diff --git a/Lib/email/test/data/msg_06.txt b/Lib/test/test_email/data/msg_06.txt
index 69f3a47..69f3a47 100644
--- a/Lib/email/test/data/msg_06.txt
+++ b/Lib/test/test_email/data/msg_06.txt
diff --git a/Lib/email/test/data/msg_07.txt b/Lib/test/test_email/data/msg_07.txt
index 721f3a0..721f3a0 100644
--- a/Lib/email/test/data/msg_07.txt
+++ b/Lib/test/test_email/data/msg_07.txt
diff --git a/Lib/email/test/data/msg_08.txt b/Lib/test/test_email/data/msg_08.txt
index b563083..b563083 100644
--- a/Lib/email/test/data/msg_08.txt
+++ b/Lib/test/test_email/data/msg_08.txt
diff --git a/Lib/email/test/data/msg_09.txt b/Lib/test/test_email/data/msg_09.txt
index 575c4c2..575c4c2 100644
--- a/Lib/email/test/data/msg_09.txt
+++ b/Lib/test/test_email/data/msg_09.txt
diff --git a/Lib/email/test/data/msg_10.txt b/Lib/test/test_email/data/msg_10.txt
index 0790396..0790396 100644
--- a/Lib/email/test/data/msg_10.txt
+++ b/Lib/test/test_email/data/msg_10.txt
diff --git a/Lib/email/test/data/msg_11.txt b/Lib/test/test_email/data/msg_11.txt
index 8f7f199..8f7f199 100644
--- a/Lib/email/test/data/msg_11.txt
+++ b/Lib/test/test_email/data/msg_11.txt
diff --git a/Lib/email/test/data/msg_12.txt b/Lib/test/test_email/data/msg_12.txt
index 4bec8d9..4bec8d9 100644
--- a/Lib/email/test/data/msg_12.txt
+++ b/Lib/test/test_email/data/msg_12.txt
diff --git a/Lib/email/test/data/msg_12a.txt b/Lib/test/test_email/data/msg_12a.txt
index e94224e..e94224e 100644
--- a/Lib/email/test/data/msg_12a.txt
+++ b/Lib/test/test_email/data/msg_12a.txt
diff --git a/Lib/email/test/data/msg_13.txt b/Lib/test/test_email/data/msg_13.txt
index 8e6d52d..8e6d52d 100644
--- a/Lib/email/test/data/msg_13.txt
+++ b/Lib/test/test_email/data/msg_13.txt
diff --git a/Lib/email/test/data/msg_14.txt b/Lib/test/test_email/data/msg_14.txt
index 5d98d2f..5d98d2f 100644
--- a/Lib/email/test/data/msg_14.txt
+++ b/Lib/test/test_email/data/msg_14.txt
diff --git a/Lib/email/test/data/msg_15.txt b/Lib/test/test_email/data/msg_15.txt
index 0025624..0025624 100644
--- a/Lib/email/test/data/msg_15.txt
+++ b/Lib/test/test_email/data/msg_15.txt
diff --git a/Lib/email/test/data/msg_16.txt b/Lib/test/test_email/data/msg_16.txt
index 56167e9..56167e9 100644
--- a/Lib/email/test/data/msg_16.txt
+++ b/Lib/test/test_email/data/msg_16.txt
diff --git a/Lib/email/test/data/msg_17.txt b/Lib/test/test_email/data/msg_17.txt
index 8d86e41..8d86e41 100644
--- a/Lib/email/test/data/msg_17.txt
+++ b/Lib/test/test_email/data/msg_17.txt
diff --git a/Lib/email/test/data/msg_18.txt b/Lib/test/test_email/data/msg_18.txt
index f9f4904..f9f4904 100644
--- a/Lib/email/test/data/msg_18.txt
+++ b/Lib/test/test_email/data/msg_18.txt
diff --git a/Lib/email/test/data/msg_19.txt b/Lib/test/test_email/data/msg_19.txt
index 49bf7fc..49bf7fc 100644
--- a/Lib/email/test/data/msg_19.txt
+++ b/Lib/test/test_email/data/msg_19.txt
diff --git a/Lib/email/test/data/msg_20.txt b/Lib/test/test_email/data/msg_20.txt
index 1a6a887..1a6a887 100644
--- a/Lib/email/test/data/msg_20.txt
+++ b/Lib/test/test_email/data/msg_20.txt
diff --git a/Lib/email/test/data/msg_21.txt b/Lib/test/test_email/data/msg_21.txt
index 23590b2..23590b2 100644
--- a/Lib/email/test/data/msg_21.txt
+++ b/Lib/test/test_email/data/msg_21.txt
diff --git a/Lib/email/test/data/msg_22.txt b/Lib/test/test_email/data/msg_22.txt
index af9de5f..af9de5f 100644
--- a/Lib/email/test/data/msg_22.txt
+++ b/Lib/test/test_email/data/msg_22.txt
diff --git a/Lib/email/test/data/msg_23.txt b/Lib/test/test_email/data/msg_23.txt
index bb2e8ec..bb2e8ec 100644
--- a/Lib/email/test/data/msg_23.txt
+++ b/Lib/test/test_email/data/msg_23.txt
diff --git a/Lib/email/test/data/msg_24.txt b/Lib/test/test_email/data/msg_24.txt
index 4e52339..4e52339 100644
--- a/Lib/email/test/data/msg_24.txt
+++ b/Lib/test/test_email/data/msg_24.txt
diff --git a/Lib/email/test/data/msg_25.txt b/Lib/test/test_email/data/msg_25.txt
index 9e35275..9e35275 100644
--- a/Lib/email/test/data/msg_25.txt
+++ b/Lib/test/test_email/data/msg_25.txt
diff --git a/Lib/email/test/data/msg_26.txt b/Lib/test/test_email/data/msg_26.txt
index 58efaa9..58efaa9 100644
--- a/Lib/email/test/data/msg_26.txt
+++ b/Lib/test/test_email/data/msg_26.txt
diff --git a/Lib/email/test/data/msg_27.txt b/Lib/test/test_email/data/msg_27.txt
index d019176..d019176 100644
--- a/Lib/email/test/data/msg_27.txt
+++ b/Lib/test/test_email/data/msg_27.txt
diff --git a/Lib/email/test/data/msg_28.txt b/Lib/test/test_email/data/msg_28.txt
index 1e4824c..1e4824c 100644
--- a/Lib/email/test/data/msg_28.txt
+++ b/Lib/test/test_email/data/msg_28.txt
diff --git a/Lib/email/test/data/msg_29.txt b/Lib/test/test_email/data/msg_29.txt
index 1fab561..1fab561 100644
--- a/Lib/email/test/data/msg_29.txt
+++ b/Lib/test/test_email/data/msg_29.txt
diff --git a/Lib/email/test/data/msg_30.txt b/Lib/test/test_email/data/msg_30.txt
index 4334bb6..4334bb6 100644
--- a/Lib/email/test/data/msg_30.txt
+++ b/Lib/test/test_email/data/msg_30.txt
diff --git a/Lib/email/test/data/msg_31.txt b/Lib/test/test_email/data/msg_31.txt
index 1e58e56..1e58e56 100644
--- a/Lib/email/test/data/msg_31.txt
+++ b/Lib/test/test_email/data/msg_31.txt
diff --git a/Lib/email/test/data/msg_32.txt b/Lib/test/test_email/data/msg_32.txt
index 07ec5af..07ec5af 100644
--- a/Lib/email/test/data/msg_32.txt
+++ b/Lib/test/test_email/data/msg_32.txt
diff --git a/Lib/email/test/data/msg_33.txt b/Lib/test/test_email/data/msg_33.txt
index 042787a..042787a 100644
--- a/Lib/email/test/data/msg_33.txt
+++ b/Lib/test/test_email/data/msg_33.txt
diff --git a/Lib/email/test/data/msg_34.txt b/Lib/test/test_email/data/msg_34.txt
index 055dfea..055dfea 100644
--- a/Lib/email/test/data/msg_34.txt
+++ b/Lib/test/test_email/data/msg_34.txt
diff --git a/Lib/email/test/data/msg_35.txt b/Lib/test/test_email/data/msg_35.txt
index be7d5a2..be7d5a2 100644
--- a/Lib/email/test/data/msg_35.txt
+++ b/Lib/test/test_email/data/msg_35.txt
diff --git a/Lib/email/test/data/msg_36.txt b/Lib/test/test_email/data/msg_36.txt
index 5632c30..5632c30 100644
--- a/Lib/email/test/data/msg_36.txt
+++ b/Lib/test/test_email/data/msg_36.txt
diff --git a/Lib/email/test/data/msg_37.txt b/Lib/test/test_email/data/msg_37.txt
index 038d34a..038d34a 100644
--- a/Lib/email/test/data/msg_37.txt
+++ b/Lib/test/test_email/data/msg_37.txt
diff --git a/Lib/email/test/data/msg_38.txt b/Lib/test/test_email/data/msg_38.txt
index 006df81..006df81 100644
--- a/Lib/email/test/data/msg_38.txt
+++ b/Lib/test/test_email/data/msg_38.txt
diff --git a/Lib/email/test/data/msg_39.txt b/Lib/test/test_email/data/msg_39.txt
index 124b269..124b269 100644
--- a/Lib/email/test/data/msg_39.txt
+++ b/Lib/test/test_email/data/msg_39.txt
diff --git a/Lib/email/test/data/msg_40.txt b/Lib/test/test_email/data/msg_40.txt
index 1435fa1..1435fa1 100644
--- a/Lib/email/test/data/msg_40.txt
+++ b/Lib/test/test_email/data/msg_40.txt
diff --git a/Lib/email/test/data/msg_41.txt b/Lib/test/test_email/data/msg_41.txt
index 76cdd1c..76cdd1c 100644
--- a/Lib/email/test/data/msg_41.txt
+++ b/Lib/test/test_email/data/msg_41.txt
diff --git a/Lib/email/test/data/msg_42.txt b/Lib/test/test_email/data/msg_42.txt
index a75f8f4..a75f8f4 100644
--- a/Lib/email/test/data/msg_42.txt
+++ b/Lib/test/test_email/data/msg_42.txt
diff --git a/Lib/email/test/data/msg_43.txt b/Lib/test/test_email/data/msg_43.txt
index 797d12c..797d12c 100644
--- a/Lib/email/test/data/msg_43.txt
+++ b/Lib/test/test_email/data/msg_43.txt
diff --git a/Lib/email/test/data/msg_44.txt b/Lib/test/test_email/data/msg_44.txt
index 15a2252..15a2252 100644
--- a/Lib/email/test/data/msg_44.txt
+++ b/Lib/test/test_email/data/msg_44.txt
diff --git a/Lib/email/test/data/msg_45.txt b/Lib/test/test_email/data/msg_45.txt
index 58fde95..58fde95 100644
--- a/Lib/email/test/data/msg_45.txt
+++ b/Lib/test/test_email/data/msg_45.txt
diff --git a/Lib/email/test/data/msg_46.txt b/Lib/test/test_email/data/msg_46.txt
index 1e22c4f..1e22c4f 100644
--- a/Lib/email/test/data/msg_46.txt
+++ b/Lib/test/test_email/data/msg_46.txt
diff --git a/Lib/test/test_email/test__encoded_words.py b/Lib/test/test_email/test__encoded_words.py
new file mode 100644
index 0000000..14395fe
--- /dev/null
+++ b/Lib/test/test_email/test__encoded_words.py
@@ -0,0 +1,187 @@
+import unittest
+from email import _encoded_words as _ew
+from email import errors
+from test.test_email import TestEmailBase
+
+
+class TestDecodeQ(TestEmailBase):
+
+ def _test(self, source, ex_result, ex_defects=[]):
+ result, defects = _ew.decode_q(source)
+ self.assertEqual(result, ex_result)
+ self.assertDefectsEqual(defects, ex_defects)
+
+ def test_no_encoded(self):
+ self._test(b'foobar', b'foobar')
+
+ def test_spaces(self):
+ self._test(b'foo=20bar=20', b'foo bar ')
+ self._test(b'foo_bar_', b'foo bar ')
+
+ def test_run_of_encoded(self):
+ self._test(b'foo=20=20=21=2Cbar', b'foo !,bar')
+
+
+class TestDecodeB(TestEmailBase):
+
+ def _test(self, source, ex_result, ex_defects=[]):
+ result, defects = _ew.decode_b(source)
+ self.assertEqual(result, ex_result)
+ self.assertDefectsEqual(defects, ex_defects)
+
+ def test_simple(self):
+ self._test(b'Zm9v', b'foo')
+
+ def test_missing_padding(self):
+ self._test(b'dmk', b'vi', [errors.InvalidBase64PaddingDefect])
+
+ def test_invalid_character(self):
+ self._test(b'dm\x01k===', b'vi', [errors.InvalidBase64CharactersDefect])
+
+ def test_invalid_character_and_bad_padding(self):
+ self._test(b'dm\x01k', b'vi', [errors.InvalidBase64CharactersDefect,
+ errors.InvalidBase64PaddingDefect])
+
+
+class TestDecode(TestEmailBase):
+
+ def test_wrong_format_input_raises(self):
+ with self.assertRaises(ValueError):
+ _ew.decode('=?badone?=')
+ with self.assertRaises(ValueError):
+ _ew.decode('=?')
+ with self.assertRaises(ValueError):
+ _ew.decode('')
+
+ def _test(self, source, result, charset='us-ascii', lang='', defects=[]):
+ res, char, l, d = _ew.decode(source)
+ self.assertEqual(res, result)
+ self.assertEqual(char, charset)
+ self.assertEqual(l, lang)
+ self.assertDefectsEqual(d, defects)
+
+ def test_simple_q(self):
+ self._test('=?us-ascii?q?foo?=', 'foo')
+
+ def test_simple_b(self):
+ self._test('=?us-ascii?b?dmk=?=', 'vi')
+
+ def test_q_case_ignored(self):
+ self._test('=?us-ascii?Q?foo?=', 'foo')
+
+ def test_b_case_ignored(self):
+ self._test('=?us-ascii?B?dmk=?=', 'vi')
+
+ def test_non_trivial_q(self):
+ self._test('=?latin-1?q?=20F=fcr=20Elise=20?=', ' Für Elise ', 'latin-1')
+
+ def test_q_escpaed_bytes_preserved(self):
+ self._test(b'=?us-ascii?q?=20\xACfoo?='.decode('us-ascii',
+ 'surrogateescape'),
+ ' \uDCACfoo',
+ defects = [errors.UndecodableBytesDefect])
+
+ def test_b_undecodable_bytes_ignored_with_defect(self):
+ self._test(b'=?us-ascii?b?dm\xACk?='.decode('us-ascii',
+ 'surrogateescape'),
+ 'vi',
+ defects = [
+ errors.InvalidBase64CharactersDefect,
+ errors.InvalidBase64PaddingDefect])
+
+ def test_b_invalid_bytes_ignored_with_defect(self):
+ self._test('=?us-ascii?b?dm\x01k===?=',
+ 'vi',
+ defects = [errors.InvalidBase64CharactersDefect])
+
+ def test_b_invalid_bytes_incorrect_padding(self):
+ self._test('=?us-ascii?b?dm\x01k?=',
+ 'vi',
+ defects = [
+ errors.InvalidBase64CharactersDefect,
+ errors.InvalidBase64PaddingDefect])
+
+ def test_b_padding_defect(self):
+ self._test('=?us-ascii?b?dmk?=',
+ 'vi',
+ defects = [errors.InvalidBase64PaddingDefect])
+
+ def test_nonnull_lang(self):
+ self._test('=?us-ascii*jive?q?test?=', 'test', lang='jive')
+
+ def test_unknown_8bit_charset(self):
+ self._test('=?unknown-8bit?q?foo=ACbar?=',
+ b'foo\xacbar'.decode('ascii', 'surrogateescape'),
+ charset = 'unknown-8bit',
+ defects = [])
+
+ def test_unknown_charset(self):
+ self._test('=?foobar?q?foo=ACbar?=',
+ b'foo\xacbar'.decode('ascii', 'surrogateescape'),
+ charset = 'foobar',
+ # XXX Should this be a new Defect instead?
+ defects = [errors.CharsetError])
+
+
+class TestEncodeQ(TestEmailBase):
+
+ def _test(self, src, expected):
+ self.assertEqual(_ew.encode_q(src), expected)
+
+ def test_all_safe(self):
+ self._test(b'foobar', 'foobar')
+
+ def test_spaces(self):
+ self._test(b'foo bar ', 'foo_bar_')
+
+ def test_run_of_encodables(self):
+ self._test(b'foo ,,bar', 'foo__=2C=2Cbar')
+
+
+class TestEncodeB(TestEmailBase):
+
+ def test_simple(self):
+ self.assertEqual(_ew.encode_b(b'foo'), 'Zm9v')
+
+ def test_padding(self):
+ self.assertEqual(_ew.encode_b(b'vi'), 'dmk=')
+
+
+class TestEncode(TestEmailBase):
+
+ def test_q(self):
+ self.assertEqual(_ew.encode('foo', 'utf-8', 'q'), '=?utf-8?q?foo?=')
+
+ def test_b(self):
+ self.assertEqual(_ew.encode('foo', 'utf-8', 'b'), '=?utf-8?b?Zm9v?=')
+
+ def test_auto_q(self):
+ self.assertEqual(_ew.encode('foo', 'utf-8'), '=?utf-8?q?foo?=')
+
+ def test_auto_q_if_short_mostly_safe(self):
+ self.assertEqual(_ew.encode('vi.', 'utf-8'), '=?utf-8?q?vi=2E?=')
+
+ def test_auto_b_if_enough_unsafe(self):
+ self.assertEqual(_ew.encode('.....', 'utf-8'), '=?utf-8?b?Li4uLi4=?=')
+
+ def test_auto_b_if_long_unsafe(self):
+ self.assertEqual(_ew.encode('vi.vi.vi.vi.vi.', 'utf-8'),
+ '=?utf-8?b?dmkudmkudmkudmkudmku?=')
+
+ def test_auto_q_if_long_mostly_safe(self):
+ self.assertEqual(_ew.encode('vi vi vi.vi ', 'utf-8'),
+ '=?utf-8?q?vi_vi_vi=2Evi_?=')
+
+ def test_utf8_default(self):
+ self.assertEqual(_ew.encode('foo'), '=?utf-8?q?foo?=')
+
+ def test_lang(self):
+ self.assertEqual(_ew.encode('foo', lang='jive'), '=?utf-8*jive?q?foo?=')
+
+ def test_unknown_8bit(self):
+ self.assertEqual(_ew.encode('foo\uDCACbar', charset='unknown-8bit'),
+ '=?unknown-8bit?q?foo=ACbar?=')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py
new file mode 100644
index 0000000..6101e19
--- /dev/null
+++ b/Lib/test/test_email/test__header_value_parser.py
@@ -0,0 +1,2552 @@
+import string
+import unittest
+from email import _header_value_parser as parser
+from email import errors
+from email import policy
+from test.test_email import TestEmailBase, parameterize
+
+class TestTokens(TestEmailBase):
+
+ # EWWhiteSpaceTerminal
+
+ def test_EWWhiteSpaceTerminal(self):
+ x = parser.EWWhiteSpaceTerminal(' \t', 'fws')
+ self.assertEqual(x, ' \t')
+ self.assertEqual(str(x), '')
+ self.assertEqual(x.value, '')
+ self.assertEqual(x.encoded, ' \t')
+
+ # UnstructuredTokenList
+
+ def test_undecodable_bytes_error_preserved(self):
+ badstr = b"le pouf c\xaflebre".decode('ascii', 'surrogateescape')
+ unst = parser.get_unstructured(badstr)
+ self.assertDefectsEqual(unst.all_defects, [errors.UndecodableBytesDefect])
+ parts = list(unst.parts)
+ self.assertDefectsEqual(parts[0].all_defects, [])
+ self.assertDefectsEqual(parts[1].all_defects, [])
+ self.assertDefectsEqual(parts[2].all_defects, [errors.UndecodableBytesDefect])
+
+
+class TestParserMixin:
+
+ def _assert_results(self, tl, rest, string, value, defects, remainder,
+ comments=None):
+ self.assertEqual(str(tl), string)
+ self.assertEqual(tl.value, value)
+ self.assertDefectsEqual(tl.all_defects, defects)
+ self.assertEqual(rest, remainder)
+ if comments is not None:
+ self.assertEqual(tl.comments, comments)
+
+ def _test_get_x(self, method, source, string, value, defects,
+ remainder, comments=None):
+ tl, rest = method(source)
+ self._assert_results(tl, rest, string, value, defects, remainder,
+ comments=None)
+ return tl
+
+ def _test_parse_x(self, method, input, string, value, defects,
+ comments=None):
+ tl = method(input)
+ self._assert_results(tl, '', string, value, defects, '', comments)
+ return tl
+
+
+class TestParser(TestParserMixin, TestEmailBase):
+
+ # _wsp_splitter
+
+ rfc_printable_ascii = bytes(range(33, 127)).decode('ascii')
+ rfc_atext_chars = (string.ascii_letters + string.digits +
+ "!#$%&\'*+-/=?^_`{}|~")
+ rfc_dtext_chars = rfc_printable_ascii.translate(str.maketrans('','',r'\[]'))
+
+ def test__wsp_splitter_one_word(self):
+ self.assertEqual(parser._wsp_splitter('foo', 1), ['foo'])
+
+ def test__wsp_splitter_two_words(self):
+ self.assertEqual(parser._wsp_splitter('foo def', 1),
+ ['foo', ' ', 'def'])
+
+ def test__wsp_splitter_ws_runs(self):
+ self.assertEqual(parser._wsp_splitter('foo \t def jik', 1),
+ ['foo', ' \t ', 'def jik'])
+
+
+ # get_fws
+
+ def test_get_fws_only(self):
+ fws = self._test_get_x(parser.get_fws, ' \t ', ' \t ', ' ', [], '')
+ self.assertEqual(fws.token_type, 'fws')
+
+ def test_get_fws_space(self):
+ self._test_get_x(parser.get_fws, ' foo', ' ', ' ', [], 'foo')
+
+ def test_get_fws_ws_run(self):
+ self._test_get_x(parser.get_fws, ' \t foo ', ' \t ', ' ', [], 'foo ')
+
+ # get_encoded_word
+
+ def test_get_encoded_word_missing_start_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_encoded_word('abc')
+
+ def test_get_encoded_word_missing_end_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_encoded_word('=?abc')
+
+ def test_get_encoded_word_missing_middle_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_encoded_word('=?abc?=')
+
+ def test_get_encoded_word_valid_ew(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?this_is_a_test?= bird',
+ 'this is a test',
+ 'this is a test',
+ [],
+ ' bird')
+
+ def test_get_encoded_word_internal_spaces(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?this is a test?= bird',
+ 'this is a test',
+ 'this is a test',
+ [errors.InvalidHeaderDefect],
+ ' bird')
+
+ def test_get_encoded_word_gets_first(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?first?= =?utf-8?q?second?=',
+ 'first',
+ 'first',
+ [],
+ ' =?utf-8?q?second?=')
+
+ def test_get_encoded_word_gets_first_even_if_no_space(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?first?==?utf-8?q?second?=',
+ 'first',
+ 'first',
+ [],
+ '=?utf-8?q?second?=')
+
+ def test_get_encoded_word_sets_extra_attributes(self):
+ ew = self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii*jive?q?first_second?=',
+ 'first second',
+ 'first second',
+ [],
+ '')
+ self.assertEqual(ew.encoded, '=?us-ascii*jive?q?first_second?=')
+ self.assertEqual(ew.charset, 'us-ascii')
+ self.assertEqual(ew.lang, 'jive')
+
+ def test_get_encoded_word_lang_default_is_blank(self):
+ ew = self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?first_second?=',
+ 'first second',
+ 'first second',
+ [],
+ '')
+ self.assertEqual(ew.encoded, '=?us-ascii?q?first_second?=')
+ self.assertEqual(ew.charset, 'us-ascii')
+ self.assertEqual(ew.lang, '')
+
+ def test_get_encoded_word_non_printable_defect(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?first\x02second?=',
+ 'first\x02second',
+ 'first\x02second',
+ [errors.NonPrintableDefect],
+ '')
+
+ def test_get_encoded_word_leading_internal_space(self):
+ self._test_get_x(parser.get_encoded_word,
+ '=?us-ascii?q?=20foo?=',
+ ' foo',
+ ' foo',
+ [],
+ '')
+
+ # get_unstructured
+
+ def _get_unst(self, value):
+ token = parser.get_unstructured(value)
+ return token, ''
+
+ def test_get_unstructured_null(self):
+ self._test_get_x(self._get_unst, '', '', '', [], '')
+
+ def test_get_unstructured_one_word(self):
+ self._test_get_x(self._get_unst, 'foo', 'foo', 'foo', [], '')
+
+ def test_get_unstructured_normal_phrase(self):
+ self._test_get_x(self._get_unst, 'foo bar bird',
+ 'foo bar bird',
+ 'foo bar bird',
+ [],
+ '')
+
+ def test_get_unstructured_normal_phrase_with_whitespace(self):
+ self._test_get_x(self._get_unst, 'foo \t bar bird',
+ 'foo \t bar bird',
+ 'foo bar bird',
+ [],
+ '')
+
+ def test_get_unstructured_leading_whitespace(self):
+ self._test_get_x(self._get_unst, ' foo bar',
+ ' foo bar',
+ ' foo bar',
+ [],
+ '')
+
+ def test_get_unstructured_trailing_whitespace(self):
+ self._test_get_x(self._get_unst, 'foo bar ',
+ 'foo bar ',
+ 'foo bar ',
+ [],
+ '')
+
+ def test_get_unstructured_leading_and_trailing_whitespace(self):
+ self._test_get_x(self._get_unst, ' foo bar ',
+ ' foo bar ',
+ ' foo bar ',
+ [],
+ '')
+
+ def test_get_unstructured_one_valid_ew_no_ws(self):
+ self._test_get_x(self._get_unst, '=?us-ascii?q?bar?=',
+ 'bar',
+ 'bar',
+ [],
+ '')
+
+ def test_get_unstructured_one_ew_trailing_ws(self):
+ self._test_get_x(self._get_unst, '=?us-ascii?q?bar?= ',
+ 'bar ',
+ 'bar ',
+ [],
+ '')
+
+ def test_get_unstructured_one_valid_ew_trailing_text(self):
+ self._test_get_x(self._get_unst, '=?us-ascii?q?bar?= bird',
+ 'bar bird',
+ 'bar bird',
+ [],
+ '')
+
+ def test_get_unstructured_phrase_with_ew_in_middle_of_text(self):
+ self._test_get_x(self._get_unst, 'foo =?us-ascii?q?bar?= bird',
+ 'foo bar bird',
+ 'foo bar bird',
+ [],
+ '')
+
+ def test_get_unstructured_phrase_with_two_ew(self):
+ self._test_get_x(self._get_unst,
+ 'foo =?us-ascii?q?bar?= =?us-ascii?q?bird?=',
+ 'foo barbird',
+ 'foo barbird',
+ [],
+ '')
+
+ def test_get_unstructured_phrase_with_two_ew_trailing_ws(self):
+ self._test_get_x(self._get_unst,
+ 'foo =?us-ascii?q?bar?= =?us-ascii?q?bird?= ',
+ 'foo barbird ',
+ 'foo barbird ',
+ [],
+ '')
+
+ def test_get_unstructured_phrase_with_ew_with_leading_ws(self):
+ self._test_get_x(self._get_unst,
+ ' =?us-ascii?q?bar?=',
+ ' bar',
+ ' bar',
+ [],
+ '')
+
+ def test_get_unstructured_phrase_with_two_ew_extra_ws(self):
+ self._test_get_x(self._get_unst,
+ 'foo =?us-ascii?q?bar?= \t =?us-ascii?q?bird?=',
+ 'foo barbird',
+ 'foo barbird',
+ [],
+ '')
+
+ def test_get_unstructured_two_ew_extra_ws_trailing_text(self):
+ self._test_get_x(self._get_unst,
+ '=?us-ascii?q?test?= =?us-ascii?q?foo?= val',
+ 'testfoo val',
+ 'testfoo val',
+ [],
+ '')
+
+ def test_get_unstructured_ew_with_internal_ws(self):
+ self._test_get_x(self._get_unst,
+ '=?iso-8859-1?q?hello=20world?=',
+ 'hello world',
+ 'hello world',
+ [],
+ '')
+
+ def test_get_unstructured_ew_with_internal_leading_ws(self):
+ self._test_get_x(self._get_unst,
+ ' =?us-ascii?q?=20test?= =?us-ascii?q?=20foo?= val',
+ ' test foo val',
+ ' test foo val',
+ [],
+ '')
+
+ def test_get_unstructured_invaild_ew(self):
+ self._test_get_x(self._get_unst,
+ '=?test val',
+ '=?test val',
+ '=?test val',
+ [],
+ '')
+
+ def test_get_unstructured_undecodable_bytes(self):
+ self._test_get_x(self._get_unst,
+ b'test \xACfoo val'.decode('ascii', 'surrogateescape'),
+ 'test \uDCACfoo val',
+ 'test \uDCACfoo val',
+ [errors.UndecodableBytesDefect],
+ '')
+
+ def test_get_unstructured_undecodable_bytes_in_EW(self):
+ self._test_get_x(self._get_unst,
+ (b'=?us-ascii?q?=20test?= =?us-ascii?q?=20\xACfoo?='
+ b' val').decode('ascii', 'surrogateescape'),
+ ' test \uDCACfoo val',
+ ' test \uDCACfoo val',
+ [errors.UndecodableBytesDefect]*2,
+ '')
+
+ def test_get_unstructured_missing_base64_padding(self):
+ self._test_get_x(self._get_unst,
+ '=?utf-8?b?dmk?=',
+ 'vi',
+ 'vi',
+ [errors.InvalidBase64PaddingDefect],
+ '')
+
+ def test_get_unstructured_invalid_base64_character(self):
+ self._test_get_x(self._get_unst,
+ '=?utf-8?b?dm\x01k===?=',
+ 'vi',
+ 'vi',
+ [errors.InvalidBase64CharactersDefect],
+ '')
+
+ def test_get_unstructured_invalid_base64_character_and_bad_padding(self):
+ self._test_get_x(self._get_unst,
+ '=?utf-8?b?dm\x01k?=',
+ 'vi',
+ 'vi',
+ [errors.InvalidBase64CharactersDefect,
+ errors.InvalidBase64PaddingDefect],
+ '')
+
+ def test_get_unstructured_no_whitespace_between_ews(self):
+ self._test_get_x(self._get_unst,
+ '=?utf-8?q?foo?==?utf-8?q?bar?=',
+ 'foobar',
+ 'foobar',
+ [errors.InvalidHeaderDefect],
+ '')
+
+ # get_qp_ctext
+
+ def test_get_qp_ctext_only(self):
+ ptext = self._test_get_x(parser.get_qp_ctext,
+ 'foobar', 'foobar', ' ', [], '')
+ self.assertEqual(ptext.token_type, 'ptext')
+
+ def test_get_qp_ctext_all_printables(self):
+ with_qp = self.rfc_printable_ascii.replace('\\', '\\\\')
+ with_qp = with_qp. replace('(', r'\(')
+ with_qp = with_qp.replace(')', r'\)')
+ ptext = self._test_get_x(parser.get_qp_ctext,
+ with_qp, self.rfc_printable_ascii, ' ', [], '')
+
+ def test_get_qp_ctext_two_words_gets_first(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo de', 'foo', ' ', [], ' de')
+
+ def test_get_qp_ctext_following_wsp_preserved(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo \t\tde', 'foo', ' ', [], ' \t\tde')
+
+ def test_get_qp_ctext_up_to_close_paren_only(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo)', 'foo', ' ', [], ')')
+
+ def test_get_qp_ctext_wsp_before_close_paren_preserved(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo )', 'foo', ' ', [], ' )')
+
+ def test_get_qp_ctext_close_paren_mid_word(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo)bar', 'foo', ' ', [], ')bar')
+
+ def test_get_qp_ctext_up_to_open_paren_only(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo(', 'foo', ' ', [], '(')
+
+ def test_get_qp_ctext_wsp_before_open_paren_preserved(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo (', 'foo', ' ', [], ' (')
+
+ def test_get_qp_ctext_open_paren_mid_word(self):
+ self._test_get_x(parser.get_qp_ctext,
+ 'foo(bar', 'foo', ' ', [], '(bar')
+
+ def test_get_qp_ctext_non_printables(self):
+ ptext = self._test_get_x(parser.get_qp_ctext,
+ 'foo\x00bar)', 'foo\x00bar', ' ',
+ [errors.NonPrintableDefect], ')')
+ self.assertEqual(ptext.defects[0].non_printables[0], '\x00')
+
+ # get_qcontent
+
+ def test_get_qcontent_only(self):
+ ptext = self._test_get_x(parser.get_qcontent,
+ 'foobar', 'foobar', 'foobar', [], '')
+ self.assertEqual(ptext.token_type, 'ptext')
+
+ def test_get_qcontent_all_printables(self):
+ with_qp = self.rfc_printable_ascii.replace('\\', '\\\\')
+ with_qp = with_qp. replace('"', r'\"')
+ ptext = self._test_get_x(parser.get_qcontent, with_qp,
+ self.rfc_printable_ascii,
+ self.rfc_printable_ascii, [], '')
+
+ def test_get_qcontent_two_words_gets_first(self):
+ self._test_get_x(parser.get_qcontent,
+ 'foo de', 'foo', 'foo', [], ' de')
+
+ def test_get_qcontent_following_wsp_preserved(self):
+ self._test_get_x(parser.get_qcontent,
+ 'foo \t\tde', 'foo', 'foo', [], ' \t\tde')
+
+ def test_get_qcontent_up_to_dquote_only(self):
+ self._test_get_x(parser.get_qcontent,
+ 'foo"', 'foo', 'foo', [], '"')
+
+ def test_get_qcontent_wsp_before_close_paren_preserved(self):
+ self._test_get_x(parser.get_qcontent,
+ 'foo "', 'foo', 'foo', [], ' "')
+
+ def test_get_qcontent_close_paren_mid_word(self):
+ self._test_get_x(parser.get_qcontent,
+ 'foo"bar', 'foo', 'foo', [], '"bar')
+
+ def test_get_qcontent_non_printables(self):
+ ptext = self._test_get_x(parser.get_qcontent,
+ 'foo\x00fg"', 'foo\x00fg', 'foo\x00fg',
+ [errors.NonPrintableDefect], '"')
+ self.assertEqual(ptext.defects[0].non_printables[0], '\x00')
+
+ # get_atext
+
+ def test_get_atext_only(self):
+ atext = self._test_get_x(parser.get_atext,
+ 'foobar', 'foobar', 'foobar', [], '')
+ self.assertEqual(atext.token_type, 'atext')
+
+ def test_get_atext_all_atext(self):
+ atext = self._test_get_x(parser.get_atext, self.rfc_atext_chars,
+ self.rfc_atext_chars,
+ self.rfc_atext_chars, [], '')
+
+ def test_get_atext_two_words_gets_first(self):
+ self._test_get_x(parser.get_atext,
+ 'foo bar', 'foo', 'foo', [], ' bar')
+
+ def test_get_atext_following_wsp_preserved(self):
+ self._test_get_x(parser.get_atext,
+ 'foo \t\tbar', 'foo', 'foo', [], ' \t\tbar')
+
+ def test_get_atext_up_to_special(self):
+ self._test_get_x(parser.get_atext,
+ 'foo@bar', 'foo', 'foo', [], '@bar')
+
+ def test_get_atext_non_printables(self):
+ atext = self._test_get_x(parser.get_atext,
+ 'foo\x00bar(', 'foo\x00bar', 'foo\x00bar',
+ [errors.NonPrintableDefect], '(')
+ self.assertEqual(atext.defects[0].non_printables[0], '\x00')
+
+ # get_bare_quoted_string
+
+ def test_get_bare_quoted_string_only(self):
+ bqs = self._test_get_x(parser.get_bare_quoted_string,
+ '"foo"', '"foo"', 'foo', [], '')
+ self.assertEqual(bqs.token_type, 'bare-quoted-string')
+
+ def test_get_bare_quoted_string_must_start_with_dquote(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_bare_quoted_string('foo"')
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_bare_quoted_string(' "foo"')
+
+ def test_get_bare_quoted_string_following_wsp_preserved(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"foo"\t bar', '"foo"', 'foo', [], '\t bar')
+
+ def test_get_bare_quoted_string_multiple_words(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"foo bar moo"', '"foo bar moo"', 'foo bar moo', [], '')
+
+ def test_get_bare_quoted_string_multiple_words_wsp_preserved(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '" foo moo\t"', '" foo moo\t"', ' foo moo\t', [], '')
+
+ def test_get_bare_quoted_string_end_dquote_mid_word(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"foo"bar', '"foo"', 'foo', [], 'bar')
+
+ def test_get_bare_quoted_string_quoted_dquote(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ r'"foo\"in"a', r'"foo\"in"', 'foo"in', [], 'a')
+
+ def test_get_bare_quoted_string_non_printables(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"a\x01a"', '"a\x01a"', 'a\x01a',
+ [errors.NonPrintableDefect], '')
+
+ def test_get_bare_quoted_string_no_end_dquote(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"foo', '"foo"', 'foo',
+ [errors.InvalidHeaderDefect], '')
+ self._test_get_x(parser.get_bare_quoted_string,
+ '"foo ', '"foo "', 'foo ',
+ [errors.InvalidHeaderDefect], '')
+
+ def test_get_bare_quoted_string_empty_quotes(self):
+ self._test_get_x(parser.get_bare_quoted_string,
+ '""', '""', '', [], '')
+
+ # get_comment
+
+ def test_get_comment_only(self):
+ comment = self._test_get_x(parser.get_comment,
+ '(comment)', '(comment)', ' ', [], '', ['comment'])
+ self.assertEqual(comment.token_type, 'comment')
+
+ def test_get_comment_must_start_with_paren(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_comment('foo"')
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_comment(' (foo"')
+
+ def test_get_comment_following_wsp_preserved(self):
+ self._test_get_x(parser.get_comment,
+ '(comment) \t', '(comment)', ' ', [], ' \t', ['comment'])
+
+ def test_get_comment_multiple_words(self):
+ self._test_get_x(parser.get_comment,
+ '(foo bar) \t', '(foo bar)', ' ', [], ' \t', ['foo bar'])
+
+ def test_get_comment_multiple_words_wsp_preserved(self):
+ self._test_get_x(parser.get_comment,
+ '( foo bar\t ) \t', '( foo bar\t )', ' ', [], ' \t',
+ [' foo bar\t '])
+
+ def test_get_comment_end_paren_mid_word(self):
+ self._test_get_x(parser.get_comment,
+ '(foo)bar', '(foo)', ' ', [], 'bar', ['foo'])
+
+ def test_get_comment_quoted_parens(self):
+ self._test_get_x(parser.get_comment,
+ '(foo\) \(\)bar)', '(foo\) \(\)bar)', ' ', [], '', ['foo) ()bar'])
+
+ def test_get_comment_non_printable(self):
+ self._test_get_x(parser.get_comment,
+ '(foo\x7Fbar)', '(foo\x7Fbar)', ' ',
+ [errors.NonPrintableDefect], '', ['foo\x7Fbar'])
+
+ def test_get_comment_no_end_paren(self):
+ self._test_get_x(parser.get_comment,
+ '(foo bar', '(foo bar)', ' ',
+ [errors.InvalidHeaderDefect], '', ['foo bar'])
+ self._test_get_x(parser.get_comment,
+ '(foo bar ', '(foo bar )', ' ',
+ [errors.InvalidHeaderDefect], '', ['foo bar '])
+
+ def test_get_comment_nested_comment(self):
+ comment = self._test_get_x(parser.get_comment,
+ '(foo(bar))', '(foo(bar))', ' ', [], '', ['foo(bar)'])
+ self.assertEqual(comment[1].content, 'bar')
+
+ def test_get_comment_nested_comment_wsp(self):
+ comment = self._test_get_x(parser.get_comment,
+ '(foo ( bar ) )', '(foo ( bar ) )', ' ', [], '', ['foo ( bar ) '])
+ self.assertEqual(comment[2].content, ' bar ')
+
+ def test_get_comment_empty_comment(self):
+ self._test_get_x(parser.get_comment,
+ '()', '()', ' ', [], '', [''])
+
+ def test_get_comment_multiple_nesting(self):
+ comment = self._test_get_x(parser.get_comment,
+ '(((((foo)))))', '(((((foo)))))', ' ', [], '', ['((((foo))))'])
+ for i in range(4, 0, -1):
+ self.assertEqual(comment[0].content, '('*(i-1)+'foo'+')'*(i-1))
+ comment = comment[0]
+ self.assertEqual(comment.content, 'foo')
+
+ def test_get_comment_missing_end_of_nesting(self):
+ self._test_get_x(parser.get_comment,
+ '(((((foo)))', '(((((foo)))))', ' ',
+ [errors.InvalidHeaderDefect]*2, '', ['((((foo))))'])
+
+ def test_get_comment_qs_in_nested_comment(self):
+ comment = self._test_get_x(parser.get_comment,
+ '(foo (b\)))', '(foo (b\)))', ' ', [], '', ['foo (b\))'])
+ self.assertEqual(comment[2].content, 'b)')
+
+ # get_cfws
+
+ def test_get_cfws_only_ws(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ ' \t \t', ' \t \t', ' ', [], '', [])
+ self.assertEqual(cfws.token_type, 'cfws')
+
+ def test_get_cfws_only_comment(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ '(foo)', '(foo)', ' ', [], '', ['foo'])
+ self.assertEqual(cfws[0].content, 'foo')
+
+ def test_get_cfws_only_mixed(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ ' (foo ) ( bar) ', ' (foo ) ( bar) ', ' ', [], '',
+ ['foo ', ' bar'])
+ self.assertEqual(cfws[1].content, 'foo ')
+ self.assertEqual(cfws[3].content, ' bar')
+
+ def test_get_cfws_ends_at_non_leader(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ '(foo) bar', '(foo) ', ' ', [], 'bar', ['foo'])
+ self.assertEqual(cfws[0].content, 'foo')
+
+ def test_get_cfws_ends_at_non_printable(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ '(foo) \x07', '(foo) ', ' ', [], '\x07', ['foo'])
+ self.assertEqual(cfws[0].content, 'foo')
+
+ def test_get_cfws_non_printable_in_comment(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ '(foo \x07) "test"', '(foo \x07) ', ' ',
+ [errors.NonPrintableDefect], '"test"', ['foo \x07'])
+ self.assertEqual(cfws[0].content, 'foo \x07')
+
+ def test_get_cfws_header_ends_in_comment(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ ' (foo ', ' (foo )', ' ',
+ [errors.InvalidHeaderDefect], '', ['foo '])
+ self.assertEqual(cfws[1].content, 'foo ')
+
+ def test_get_cfws_multiple_nested_comments(self):
+ cfws = self._test_get_x(parser.get_cfws,
+ '(foo (bar)) ((a)(a))', '(foo (bar)) ((a)(a))', ' ', [],
+ '', ['foo (bar)', '(a)(a)'])
+ self.assertEqual(cfws[0].comments, ['foo (bar)'])
+ self.assertEqual(cfws[2].comments, ['(a)(a)'])
+
+ # get_quoted_string
+
+ def test_get_quoted_string_only(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ '"bob"', '"bob"', 'bob', [], '')
+ self.assertEqual(qs.token_type, 'quoted-string')
+ self.assertEqual(qs.quoted_value, '"bob"')
+ self.assertEqual(qs.content, 'bob')
+
+ def test_get_quoted_string_with_wsp(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ '\t "bob" ', '\t "bob" ', ' bob ', [], '')
+ self.assertEqual(qs.quoted_value, ' "bob" ')
+ self.assertEqual(qs.content, 'bob')
+
+ def test_get_quoted_string_with_comments_and_wsp(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (foo) "bob"(bar)', ' (foo) "bob"(bar)', ' bob ', [], '')
+ self.assertEqual(qs[0][1].content, 'foo')
+ self.assertEqual(qs[2][0].content, 'bar')
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob" ')
+
+ def test_get_quoted_string_with_multiple_comments(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (foo) (bar) "bob"(bird)', ' (foo) (bar) "bob"(bird)', ' bob ',
+ [], '')
+ self.assertEqual(qs[0].comments, ['foo', 'bar'])
+ self.assertEqual(qs[2].comments, ['bird'])
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob" ')
+
+ def test_get_quoted_string_non_printable_in_comment(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (\x0A) "bob"', ' (\x0A) "bob"', ' bob',
+ [errors.NonPrintableDefect], '')
+ self.assertEqual(qs[0].comments, ['\x0A'])
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob"')
+
+ def test_get_quoted_string_non_printable_in_qcontent(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (a) "a\x0B"', ' (a) "a\x0B"', ' a\x0B',
+ [errors.NonPrintableDefect], '')
+ self.assertEqual(qs[0].comments, ['a'])
+ self.assertEqual(qs.content, 'a\x0B')
+ self.assertEqual(qs.quoted_value, ' "a\x0B"')
+
+ def test_get_quoted_string_internal_ws(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (a) "foo bar "', ' (a) "foo bar "', ' foo bar ',
+ [], '')
+ self.assertEqual(qs[0].comments, ['a'])
+ self.assertEqual(qs.content, 'foo bar ')
+ self.assertEqual(qs.quoted_value, ' "foo bar "')
+
+ def test_get_quoted_string_header_ends_in_comment(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (a) "bob" (a', ' (a) "bob" (a)', ' bob ',
+ [errors.InvalidHeaderDefect], '')
+ self.assertEqual(qs[0].comments, ['a'])
+ self.assertEqual(qs[2].comments, ['a'])
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob" ')
+
+ def test_get_quoted_string_header_ends_in_qcontent(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ ' (a) "bob', ' (a) "bob"', ' bob',
+ [errors.InvalidHeaderDefect], '')
+ self.assertEqual(qs[0].comments, ['a'])
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob"')
+
+ def test_get_quoted_string_no_quoted_string(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_quoted_string(' (ab) xyz')
+
+ def test_get_quoted_string_qs_ends_at_noncfws(self):
+ qs = self._test_get_x(parser.get_quoted_string,
+ '\t "bob" fee', '\t "bob" ', ' bob ', [], 'fee')
+ self.assertEqual(qs.content, 'bob')
+ self.assertEqual(qs.quoted_value, ' "bob" ')
+
+ # get_atom
+
+ def test_get_atom_only(self):
+ atom = self._test_get_x(parser.get_atom,
+ 'bob', 'bob', 'bob', [], '')
+ self.assertEqual(atom.token_type, 'atom')
+
+ def test_get_atom_with_wsp(self):
+ self._test_get_x(parser.get_atom,
+ '\t bob ', '\t bob ', ' bob ', [], '')
+
+ def test_get_atom_with_comments_and_wsp(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (foo) bob(bar)', ' (foo) bob(bar)', ' bob ', [], '')
+ self.assertEqual(atom[0][1].content, 'foo')
+ self.assertEqual(atom[2][0].content, 'bar')
+
+ def test_get_atom_with_multiple_comments(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (foo) (bar) bob(bird)', ' (foo) (bar) bob(bird)', ' bob ',
+ [], '')
+ self.assertEqual(atom[0].comments, ['foo', 'bar'])
+ self.assertEqual(atom[2].comments, ['bird'])
+
+ def test_get_atom_non_printable_in_comment(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (\x0A) bob', ' (\x0A) bob', ' bob',
+ [errors.NonPrintableDefect], '')
+ self.assertEqual(atom[0].comments, ['\x0A'])
+
+ def test_get_atom_non_printable_in_atext(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (a) a\x0B', ' (a) a\x0B', ' a\x0B',
+ [errors.NonPrintableDefect], '')
+ self.assertEqual(atom[0].comments, ['a'])
+
+ def test_get_atom_header_ends_in_comment(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (a) bob (a', ' (a) bob (a)', ' bob ',
+ [errors.InvalidHeaderDefect], '')
+ self.assertEqual(atom[0].comments, ['a'])
+ self.assertEqual(atom[2].comments, ['a'])
+
+ def test_get_atom_no_atom(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_atom(' (ab) ')
+
+ def test_get_atom_no_atom_before_special(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_atom(' (ab) @')
+
+ def test_get_atom_atom_ends_at_special(self):
+ atom = self._test_get_x(parser.get_atom,
+ ' (foo) bob(bar) @bang', ' (foo) bob(bar) ', ' bob ', [], '@bang')
+ self.assertEqual(atom[0].comments, ['foo'])
+ self.assertEqual(atom[2].comments, ['bar'])
+
+ def test_get_atom_atom_ends_at_noncfws(self):
+ atom = self._test_get_x(parser.get_atom,
+ 'bob fred', 'bob ', 'bob ', [], 'fred')
+
+ # get_dot_atom_text
+
+ def test_get_dot_atom_text(self):
+ dot_atom_text = self._test_get_x(parser.get_dot_atom_text,
+ 'foo.bar.bang', 'foo.bar.bang', 'foo.bar.bang', [], '')
+ self.assertEqual(dot_atom_text.token_type, 'dot-atom-text')
+ self.assertEqual(len(dot_atom_text), 5)
+
+ def test_get_dot_atom_text_lone_atom_is_valid(self):
+ dot_atom_text = self._test_get_x(parser.get_dot_atom_text,
+ 'foo', 'foo', 'foo', [], '')
+
+ def test_get_dot_atom_text_raises_on_leading_dot(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom_text('.foo.bar')
+
+ def test_get_dot_atom_text_raises_on_trailing_dot(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom_text('foo.bar.')
+
+ def test_get_dot_atom_text_raises_on_leading_non_atext(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom_text(' foo.bar')
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom_text('@foo.bar')
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom_text('"foo.bar"')
+
+ def test_get_dot_atom_text_trailing_text_preserved(self):
+ dot_atom_text = self._test_get_x(parser.get_dot_atom_text,
+ 'foo@bar', 'foo', 'foo', [], '@bar')
+
+ def test_get_dot_atom_text_trailing_ws_preserved(self):
+ dot_atom_text = self._test_get_x(parser.get_dot_atom_text,
+ 'foo .bar', 'foo', 'foo', [], ' .bar')
+
+ # get_dot_atom
+
+ def test_get_dot_atom_only(self):
+ dot_atom = self._test_get_x(parser.get_dot_atom,
+ 'foo.bar.bing', 'foo.bar.bing', 'foo.bar.bing', [], '')
+ self.assertEqual(dot_atom.token_type, 'dot-atom')
+ self.assertEqual(len(dot_atom), 1)
+
+ def test_get_dot_atom_with_wsp(self):
+ self._test_get_x(parser.get_dot_atom,
+ '\t foo.bar.bing ', '\t foo.bar.bing ', ' foo.bar.bing ', [], '')
+
+ def test_get_dot_atom_with_comments_and_wsp(self):
+ self._test_get_x(parser.get_dot_atom,
+ ' (sing) foo.bar.bing (here) ', ' (sing) foo.bar.bing (here) ',
+ ' foo.bar.bing ', [], '')
+
+ def test_get_dot_atom_space_ends_dot_atom(self):
+ self._test_get_x(parser.get_dot_atom,
+ ' (sing) foo.bar .bing (here) ', ' (sing) foo.bar ',
+ ' foo.bar ', [], '.bing (here) ')
+
+ def test_get_dot_atom_no_atom_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom(' (foo) ')
+
+ def test_get_dot_atom_leading_dot_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom(' (foo) .bar')
+
+ def test_get_dot_atom_two_dots_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom('bar..bang')
+
+ def test_get_dot_atom_trailing_dot_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_dot_atom(' (foo) bar.bang. foo')
+
+ # get_word (if this were black box we'd repeat all the qs/atom tests)
+
+ def test_get_word_atom_yields_atom(self):
+ word = self._test_get_x(parser.get_word,
+ ' (foo) bar (bang) :ah', ' (foo) bar (bang) ', ' bar ', [], ':ah')
+ self.assertEqual(word.token_type, 'atom')
+ self.assertEqual(word[0].token_type, 'cfws')
+
+ def test_get_word_qs_yields_qs(self):
+ word = self._test_get_x(parser.get_word,
+ '"bar " (bang) ah', '"bar " (bang) ', 'bar ', [], 'ah')
+ self.assertEqual(word.token_type, 'quoted-string')
+ self.assertEqual(word[0].token_type, 'bare-quoted-string')
+ self.assertEqual(word[0].value, 'bar ')
+ self.assertEqual(word.content, 'bar ')
+
+ def test_get_word_ends_at_dot(self):
+ self._test_get_x(parser.get_word,
+ 'foo.', 'foo', 'foo', [], '.')
+
+ # get_phrase
+
+ def test_get_phrase_simple(self):
+ phrase = self._test_get_x(parser.get_phrase,
+ '"Fred A. Johnson" is his name, oh.',
+ '"Fred A. Johnson" is his name',
+ 'Fred A. Johnson is his name',
+ [],
+ ', oh.')
+ self.assertEqual(phrase.token_type, 'phrase')
+
+ def test_get_phrase_complex(self):
+ phrase = self._test_get_x(parser.get_phrase,
+ ' (A) bird (in (my|your)) "hand " is messy\t<>\t',
+ ' (A) bird (in (my|your)) "hand " is messy\t',
+ ' bird hand is messy ',
+ [],
+ '<>\t')
+ self.assertEqual(phrase[0][0].comments, ['A'])
+ self.assertEqual(phrase[0][2].comments, ['in (my|your)'])
+
+ def test_get_phrase_obsolete(self):
+ phrase = self._test_get_x(parser.get_phrase,
+ 'Fred A.(weird).O Johnson',
+ 'Fred A.(weird).O Johnson',
+ 'Fred A. .O Johnson',
+ [errors.ObsoleteHeaderDefect]*3,
+ '')
+ self.assertEqual(len(phrase), 7)
+ self.assertEqual(phrase[3].comments, ['weird'])
+
+ def test_get_phrase_pharse_must_start_with_word(self):
+ phrase = self._test_get_x(parser.get_phrase,
+ '(even weirder).name',
+ '(even weirder).name',
+ ' .name',
+ [errors.InvalidHeaderDefect] + [errors.ObsoleteHeaderDefect]*2,
+ '')
+ self.assertEqual(len(phrase), 3)
+ self.assertEqual(phrase[0].comments, ['even weirder'])
+
+ def test_get_phrase_ending_with_obsolete(self):
+ phrase = self._test_get_x(parser.get_phrase,
+ 'simple phrase.(with trailing comment):boo',
+ 'simple phrase.(with trailing comment)',
+ 'simple phrase. ',
+ [errors.ObsoleteHeaderDefect]*2,
+ ':boo')
+ self.assertEqual(len(phrase), 4)
+ self.assertEqual(phrase[3].comments, ['with trailing comment'])
+
+ def get_phrase_cfws_only_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_phrase(' (foo) ')
+
+ # get_local_part
+
+ def test_get_local_part_simple(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ 'dinsdale@python.org', 'dinsdale', 'dinsdale', [], '@python.org')
+ self.assertEqual(local_part.token_type, 'local-part')
+ self.assertEqual(local_part.local_part, 'dinsdale')
+
+ def test_get_local_part_with_dot(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ 'Fred.A.Johnson@python.org',
+ 'Fred.A.Johnson',
+ 'Fred.A.Johnson',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson')
+
+ def test_get_local_part_with_whitespace(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' Fred.A.Johnson @python.org',
+ ' Fred.A.Johnson ',
+ ' Fred.A.Johnson ',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson')
+
+ def test_get_local_part_with_cfws(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' (foo) Fred.A.Johnson (bar (bird)) @python.org',
+ ' (foo) Fred.A.Johnson (bar (bird)) ',
+ ' Fred.A.Johnson ',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson')
+ self.assertEqual(local_part[0][0].comments, ['foo'])
+ self.assertEqual(local_part[0][2].comments, ['bar (bird)'])
+
+ def test_get_local_part_simple_quoted(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ '"dinsdale"@python.org', '"dinsdale"', '"dinsdale"', [], '@python.org')
+ self.assertEqual(local_part.token_type, 'local-part')
+ self.assertEqual(local_part.local_part, 'dinsdale')
+
+ def test_get_local_part_with_quoted_dot(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ '"Fred.A.Johnson"@python.org',
+ '"Fred.A.Johnson"',
+ '"Fred.A.Johnson"',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson')
+
+ def test_get_local_part_quoted_with_whitespace(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' "Fred A. Johnson" @python.org',
+ ' "Fred A. Johnson" ',
+ ' "Fred A. Johnson" ',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred A. Johnson')
+
+ def test_get_local_part_quoted_with_cfws(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' (foo) " Fred A. Johnson " (bar (bird)) @python.org',
+ ' (foo) " Fred A. Johnson " (bar (bird)) ',
+ ' " Fred A. Johnson " ',
+ [],
+ '@python.org')
+ self.assertEqual(local_part.local_part, ' Fred A. Johnson ')
+ self.assertEqual(local_part[0][0].comments, ['foo'])
+ self.assertEqual(local_part[0][2].comments, ['bar (bird)'])
+
+
+ def test_get_local_part_simple_obsolete(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ 'Fred. A.Johnson@python.org',
+ 'Fred. A.Johnson',
+ 'Fred. A.Johnson',
+ [errors.ObsoleteHeaderDefect],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson')
+
+ def test_get_local_part_complex_obsolete_1(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' (foo )Fred (bar).(bird) A.(sheep)Johnson."and dogs "@python.org',
+ ' (foo )Fred (bar).(bird) A.(sheep)Johnson."and dogs "',
+ ' Fred . A. Johnson.and dogs ',
+ [errors.ObsoleteHeaderDefect],
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson.and dogs ')
+
+ def test_get_local_part_complex_obsolete_invalid(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' (foo )Fred (bar).(bird) A.(sheep)Johnson "and dogs"@python.org',
+ ' (foo )Fred (bar).(bird) A.(sheep)Johnson "and dogs"',
+ ' Fred . A. Johnson and dogs',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'Fred.A.Johnson and dogs')
+
+ def test_get_local_part_no_part_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_local_part(' (foo) ')
+
+ def test_get_local_part_special_instead_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_local_part(' (foo) @python.org')
+
+ def test_get_local_part_trailing_dot(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' borris.@python.org',
+ ' borris.',
+ ' borris.',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'borris.')
+
+ def test_get_local_part_trailing_dot_with_ws(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' borris. @python.org',
+ ' borris. ',
+ ' borris. ',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'borris.')
+
+ def test_get_local_part_leading_dot(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ '.borris@python.org',
+ '.borris',
+ '.borris',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, '.borris')
+
+ def test_get_local_part_leading_dot_after_ws(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' .borris@python.org',
+ ' .borris',
+ ' .borris',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, '.borris')
+
+ def test_get_local_part_double_dot_raises(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ ' borris.(foo).natasha@python.org',
+ ' borris.(foo).natasha',
+ ' borris. .natasha',
+ [errors.InvalidHeaderDefect]*2,
+ '@python.org')
+ self.assertEqual(local_part.local_part, 'borris..natasha')
+
+ def test_get_local_part_quoted_strings_in_atom_list(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ '""example" example"@example.com',
+ '""example" example"',
+ 'example example',
+ [errors.InvalidHeaderDefect]*3,
+ '@example.com')
+ self.assertEqual(local_part.local_part, 'example example')
+
+ def test_get_local_part_valid_and_invalid_qp_in_atom_list(self):
+ local_part = self._test_get_x(parser.get_local_part,
+ r'"\\"example\\" example"@example.com',
+ r'"\\"example\\" example"',
+ r'\example\\ example',
+ [errors.InvalidHeaderDefect]*5,
+ '@example.com')
+ self.assertEqual(local_part.local_part, r'\example\\ example')
+
+ def test_get_local_part_unicode_defect(self):
+ # Currently this only happens when parsing unicode, not when parsing
+ # stuff that was originally binary.
+ local_part = self._test_get_x(parser.get_local_part,
+ 'exámple@example.com',
+ 'exámple',
+ 'exámple',
+ [errors.NonASCIILocalPartDefect],
+ '@example.com')
+ self.assertEqual(local_part.local_part, 'exámple')
+
+ # get_dtext
+
+ def test_get_dtext_only(self):
+ dtext = self._test_get_x(parser.get_dtext,
+ 'foobar', 'foobar', 'foobar', [], '')
+ self.assertEqual(dtext.token_type, 'ptext')
+
+ def test_get_dtext_all_dtext(self):
+ dtext = self._test_get_x(parser.get_dtext, self.rfc_dtext_chars,
+ self.rfc_dtext_chars,
+ self.rfc_dtext_chars, [], '')
+
+ def test_get_dtext_two_words_gets_first(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo bar', 'foo', 'foo', [], ' bar')
+
+ def test_get_dtext_following_wsp_preserved(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo \t\tbar', 'foo', 'foo', [], ' \t\tbar')
+
+ def test_get_dtext_non_printables(self):
+ dtext = self._test_get_x(parser.get_dtext,
+ 'foo\x00bar]', 'foo\x00bar', 'foo\x00bar',
+ [errors.NonPrintableDefect], ']')
+ self.assertEqual(dtext.defects[0].non_printables[0], '\x00')
+
+ def test_get_dtext_with_qp(self):
+ ptext = self._test_get_x(parser.get_dtext,
+ r'foo\]\[\\bar\b\e\l\l',
+ r'foo][\barbell',
+ r'foo][\barbell',
+ [errors.ObsoleteHeaderDefect],
+ '')
+
+ def test_get_dtext_up_to_close_bracket_only(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo]', 'foo', 'foo', [], ']')
+
+ def test_get_dtext_wsp_before_close_bracket_preserved(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo ]', 'foo', 'foo', [], ' ]')
+
+ def test_get_dtext_close_bracket_mid_word(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo]bar', 'foo', 'foo', [], ']bar')
+
+ def test_get_dtext_up_to_open_bracket_only(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo[', 'foo', 'foo', [], '[')
+
+ def test_get_dtext_wsp_before_open_bracket_preserved(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo [', 'foo', 'foo', [], ' [')
+
+ def test_get_dtext_open_bracket_mid_word(self):
+ self._test_get_x(parser.get_dtext,
+ 'foo[bar', 'foo', 'foo', [], '[bar')
+
+ # get_domain_literal
+
+ def test_get_domain_literal_only(self):
+ domain_literal = domain_literal = self._test_get_x(parser.get_domain_literal,
+ '[127.0.0.1]',
+ '[127.0.0.1]',
+ '[127.0.0.1]',
+ [],
+ '')
+ self.assertEqual(domain_literal.token_type, 'domain-literal')
+ self.assertEqual(domain_literal.domain, '[127.0.0.1]')
+ self.assertEqual(domain_literal.ip, '127.0.0.1')
+
+ def test_get_domain_literal_with_internal_ws(self):
+ domain_literal = self._test_get_x(parser.get_domain_literal,
+ '[ 127.0.0.1\t ]',
+ '[ 127.0.0.1\t ]',
+ '[ 127.0.0.1 ]',
+ [],
+ '')
+ self.assertEqual(domain_literal.domain, '[127.0.0.1]')
+ self.assertEqual(domain_literal.ip, '127.0.0.1')
+
+ def test_get_domain_literal_with_surrounding_cfws(self):
+ domain_literal = self._test_get_x(parser.get_domain_literal,
+ '(foo)[ 127.0.0.1] (bar)',
+ '(foo)[ 127.0.0.1] (bar)',
+ ' [ 127.0.0.1] ',
+ [],
+ '')
+ self.assertEqual(domain_literal.domain, '[127.0.0.1]')
+ self.assertEqual(domain_literal.ip, '127.0.0.1')
+
+ def test_get_domain_literal_no_start_char_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_domain_literal('(foo) ')
+
+ def test_get_domain_literal_no_start_char_before_special_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_domain_literal('(foo) @')
+
+ def test_get_domain_literal_bad_dtext_char_before_special_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_domain_literal('(foo) [abc[@')
+
+ # get_domain
+
+ def test_get_domain_regular_domain_only(self):
+ domain = self._test_get_x(parser.get_domain,
+ 'example.com',
+ 'example.com',
+ 'example.com',
+ [],
+ '')
+ self.assertEqual(domain.token_type, 'domain')
+ self.assertEqual(domain.domain, 'example.com')
+
+ def test_get_domain_domain_literal_only(self):
+ domain = self._test_get_x(parser.get_domain,
+ '[127.0.0.1]',
+ '[127.0.0.1]',
+ '[127.0.0.1]',
+ [],
+ '')
+ self.assertEqual(domain.token_type, 'domain')
+ self.assertEqual(domain.domain, '[127.0.0.1]')
+
+ def test_get_domain_with_cfws(self):
+ domain = self._test_get_x(parser.get_domain,
+ '(foo) example.com(bar)\t',
+ '(foo) example.com(bar)\t',
+ ' example.com ',
+ [],
+ '')
+ self.assertEqual(domain.domain, 'example.com')
+
+ def test_get_domain_domain_literal_with_cfws(self):
+ domain = self._test_get_x(parser.get_domain,
+ '(foo)[127.0.0.1]\t(bar)',
+ '(foo)[127.0.0.1]\t(bar)',
+ ' [127.0.0.1] ',
+ [],
+ '')
+ self.assertEqual(domain.domain, '[127.0.0.1]')
+
+ def test_get_domain_domain_with_cfws_ends_at_special(self):
+ domain = self._test_get_x(parser.get_domain,
+ '(foo)example.com\t(bar), next',
+ '(foo)example.com\t(bar)',
+ ' example.com ',
+ [],
+ ', next')
+ self.assertEqual(domain.domain, 'example.com')
+
+ def test_get_domain_domain_literal_with_cfws_ends_at_special(self):
+ domain = self._test_get_x(parser.get_domain,
+ '(foo)[127.0.0.1]\t(bar), next',
+ '(foo)[127.0.0.1]\t(bar)',
+ ' [127.0.0.1] ',
+ [],
+ ', next')
+ self.assertEqual(domain.domain, '[127.0.0.1]')
+
+ def test_get_domain_obsolete(self):
+ domain = self._test_get_x(parser.get_domain,
+ '(foo) example . (bird)com(bar)\t',
+ '(foo) example . (bird)com(bar)\t',
+ ' example . com ',
+ [errors.ObsoleteHeaderDefect],
+ '')
+ self.assertEqual(domain.domain, 'example.com')
+
+ def test_get_domain_no_non_cfws_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_domain(" (foo)\t")
+
+ def test_get_domain_no_atom_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_domain(" (foo)\t, broken")
+
+
+ # get_addr_spec
+
+ def test_get_addr_spec_normal(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ '')
+ self.assertEqual(addr_spec.token_type, 'addr-spec')
+ self.assertEqual(addr_spec.local_part, 'dinsdale')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, 'dinsdale@example.com')
+
+ def test_get_addr_spec_with_doamin_literal(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ 'dinsdale@[127.0.0.1]',
+ 'dinsdale@[127.0.0.1]',
+ 'dinsdale@[127.0.0.1]',
+ [],
+ '')
+ self.assertEqual(addr_spec.local_part, 'dinsdale')
+ self.assertEqual(addr_spec.domain, '[127.0.0.1]')
+ self.assertEqual(addr_spec.addr_spec, 'dinsdale@[127.0.0.1]')
+
+ def test_get_addr_spec_with_cfws(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ '(foo) dinsdale(bar)@ (bird) example.com (bog)',
+ '(foo) dinsdale(bar)@ (bird) example.com (bog)',
+ ' dinsdale@example.com ',
+ [],
+ '')
+ self.assertEqual(addr_spec.local_part, 'dinsdale')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, 'dinsdale@example.com')
+
+ def test_get_addr_spec_with_qouoted_string_and_cfws(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ '(foo) "roy a bug"(bar)@ (bird) example.com (bog)',
+ '(foo) "roy a bug"(bar)@ (bird) example.com (bog)',
+ ' "roy a bug"@example.com ',
+ [],
+ '')
+ self.assertEqual(addr_spec.local_part, 'roy a bug')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, '"roy a bug"@example.com')
+
+ def test_get_addr_spec_ends_at_special(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ '(foo) "roy a bug"(bar)@ (bird) example.com (bog) , next',
+ '(foo) "roy a bug"(bar)@ (bird) example.com (bog) ',
+ ' "roy a bug"@example.com ',
+ [],
+ ', next')
+ self.assertEqual(addr_spec.local_part, 'roy a bug')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, '"roy a bug"@example.com')
+
+ def test_get_addr_spec_quoted_strings_in_atom_list(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ '""example" example"@example.com',
+ '""example" example"@example.com',
+ 'example example@example.com',
+ [errors.InvalidHeaderDefect]*3,
+ '')
+ self.assertEqual(addr_spec.local_part, 'example example')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, '"example example"@example.com')
+
+ def test_get_addr_spec_dot_atom(self):
+ addr_spec = self._test_get_x(parser.get_addr_spec,
+ 'star.a.star@example.com',
+ 'star.a.star@example.com',
+ 'star.a.star@example.com',
+ [],
+ '')
+ self.assertEqual(addr_spec.local_part, 'star.a.star')
+ self.assertEqual(addr_spec.domain, 'example.com')
+ self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com')
+
+ # get_obs_route
+
+ def test_get_obs_route_simple(self):
+ obs_route = self._test_get_x(parser.get_obs_route,
+ '@example.com, @two.example.com:',
+ '@example.com, @two.example.com:',
+ '@example.com, @two.example.com:',
+ [],
+ '')
+ self.assertEqual(obs_route.token_type, 'obs-route')
+ self.assertEqual(obs_route.domains, ['example.com', 'two.example.com'])
+
+ def test_get_obs_route_complex(self):
+ obs_route = self._test_get_x(parser.get_obs_route,
+ '(foo),, (blue)@example.com (bar),@two.(foo) example.com (bird):',
+ '(foo),, (blue)@example.com (bar),@two.(foo) example.com (bird):',
+ ' ,, @example.com ,@two. example.com :',
+ [errors.ObsoleteHeaderDefect], # This is the obs-domain
+ '')
+ self.assertEqual(obs_route.token_type, 'obs-route')
+ self.assertEqual(obs_route.domains, ['example.com', 'two.example.com'])
+
+ def test_get_obs_route_no_route_before_end_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_obs_route('(foo) @example.com,')
+
+ def test_get_obs_route_no_route_before_special_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_obs_route('(foo) [abc],')
+
+ def test_get_obs_route_no_route_before_special_raises2(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_obs_route('(foo) @example.com [abc],')
+
+ # get_angle_addr
+
+ def test_get_angle_addr_simple(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(angle_addr.token_type, 'angle-addr')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_empty(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<>',
+ '<>',
+ '<>',
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(angle_addr.token_type, 'angle-addr')
+ self.assertIsNone(angle_addr.local_part)
+ self.assertIsNone(angle_addr.domain)
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, '<>')
+
+ def test_get_angle_addr_with_cfws(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ ' (foo) <dinsdale@example.com>(bar)',
+ ' (foo) <dinsdale@example.com>(bar)',
+ ' <dinsdale@example.com> ',
+ [],
+ '')
+ self.assertEqual(angle_addr.token_type, 'angle-addr')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_qs_and_domain_literal(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<"Fred Perfect"@[127.0.0.1]>',
+ '<"Fred Perfect"@[127.0.0.1]>',
+ '<"Fred Perfect"@[127.0.0.1]>',
+ [],
+ '')
+ self.assertEqual(angle_addr.local_part, 'Fred Perfect')
+ self.assertEqual(angle_addr.domain, '[127.0.0.1]')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, '"Fred Perfect"@[127.0.0.1]')
+
+ def test_get_angle_addr_internal_cfws(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<(foo) dinsdale@example.com(bar)>',
+ '<(foo) dinsdale@example.com(bar)>',
+ '< dinsdale@example.com >',
+ [],
+ '')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_obs_route(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '(foo)<@example.com, (bird) @two.example.com: dinsdale@example.com> (bar) ',
+ '(foo)<@example.com, (bird) @two.example.com: dinsdale@example.com> (bar) ',
+ ' <@example.com, @two.example.com: dinsdale@example.com> ',
+ [errors.ObsoleteHeaderDefect],
+ '')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertEqual(angle_addr.route, ['example.com', 'two.example.com'])
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_missing_closing_angle(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<dinsdale@example.com',
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_missing_closing_angle_with_cfws(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<dinsdale@example.com (foo)',
+ '<dinsdale@example.com (foo)>',
+ '<dinsdale@example.com >',
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_ends_at_special(self):
+ angle_addr = self._test_get_x(parser.get_angle_addr,
+ '<dinsdale@example.com> (foo), next',
+ '<dinsdale@example.com> (foo)',
+ '<dinsdale@example.com> ',
+ [],
+ ', next')
+ self.assertEqual(angle_addr.local_part, 'dinsdale')
+ self.assertEqual(angle_addr.domain, 'example.com')
+ self.assertIsNone(angle_addr.route)
+ self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_angle_addr_no_angle_raise(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_angle_addr('(foo) ')
+
+ def test_get_angle_addr_no_angle_before_special_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_angle_addr('(foo) , next')
+
+ def test_get_angle_addr_no_angle_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_angle_addr('bar')
+
+ def test_get_angle_addr_special_after_angle_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_angle_addr('(foo) <, bar')
+
+ # get_display_name This is phrase but with a different value.
+
+ def test_get_display_name_simple(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ 'Fred A Johnson',
+ 'Fred A Johnson',
+ 'Fred A Johnson',
+ [],
+ '')
+ self.assertEqual(display_name.token_type, 'display-name')
+ self.assertEqual(display_name.display_name, 'Fred A Johnson')
+
+ def test_get_display_name_complex1(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ '"Fred A. Johnson" is his name, oh.',
+ '"Fred A. Johnson" is his name',
+ '"Fred A. Johnson is his name"',
+ [],
+ ', oh.')
+ self.assertEqual(display_name.token_type, 'display-name')
+ self.assertEqual(display_name.display_name, 'Fred A. Johnson is his name')
+
+ def test_get_display_name_complex2(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ ' (A) bird (in (my|your)) "hand " is messy\t<>\t',
+ ' (A) bird (in (my|your)) "hand " is messy\t',
+ ' "bird hand is messy" ',
+ [],
+ '<>\t')
+ self.assertEqual(display_name[0][0].comments, ['A'])
+ self.assertEqual(display_name[0][2].comments, ['in (my|your)'])
+ self.assertEqual(display_name.display_name, 'bird hand is messy')
+
+ def test_get_display_name_obsolete(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ 'Fred A.(weird).O Johnson',
+ 'Fred A.(weird).O Johnson',
+ '"Fred A. .O Johnson"',
+ [errors.ObsoleteHeaderDefect]*3,
+ '')
+ self.assertEqual(len(display_name), 7)
+ self.assertEqual(display_name[3].comments, ['weird'])
+ self.assertEqual(display_name.display_name, 'Fred A. .O Johnson')
+
+ def test_get_display_name_pharse_must_start_with_word(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ '(even weirder).name',
+ '(even weirder).name',
+ ' ".name"',
+ [errors.InvalidHeaderDefect] + [errors.ObsoleteHeaderDefect]*2,
+ '')
+ self.assertEqual(len(display_name), 3)
+ self.assertEqual(display_name[0].comments, ['even weirder'])
+ self.assertEqual(display_name.display_name, '.name')
+
+ def test_get_display_name_ending_with_obsolete(self):
+ display_name = self._test_get_x(parser.get_display_name,
+ 'simple phrase.(with trailing comment):boo',
+ 'simple phrase.(with trailing comment)',
+ '"simple phrase." ',
+ [errors.ObsoleteHeaderDefect]*2,
+ ':boo')
+ self.assertEqual(len(display_name), 4)
+ self.assertEqual(display_name[3].comments, ['with trailing comment'])
+ self.assertEqual(display_name.display_name, 'simple phrase.')
+
+ # get_name_addr
+
+ def test_get_name_addr_angle_addr_only(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(name_addr.token_type, 'name-addr')
+ self.assertIsNone(name_addr.display_name)
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_atom_name(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ 'Dinsdale <dinsdale@example.com>',
+ 'Dinsdale <dinsdale@example.com>',
+ 'Dinsdale <dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(name_addr.token_type, 'name-addr')
+ self.assertEqual(name_addr.display_name, 'Dinsdale')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_atom_name_with_cfws(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '(foo) Dinsdale (bar) <dinsdale@example.com> (bird)',
+ '(foo) Dinsdale (bar) <dinsdale@example.com> (bird)',
+ ' Dinsdale <dinsdale@example.com> ',
+ [],
+ '')
+ self.assertEqual(name_addr.display_name, 'Dinsdale')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_name_with_cfws_and_dots(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '(foo) Roy.A.Bear (bar) <dinsdale@example.com> (bird)',
+ '(foo) Roy.A.Bear (bar) <dinsdale@example.com> (bird)',
+ ' "Roy.A.Bear" <dinsdale@example.com> ',
+ [errors.ObsoleteHeaderDefect]*2,
+ '')
+ self.assertEqual(name_addr.display_name, 'Roy.A.Bear')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_qs_name(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '"Roy.A.Bear" <dinsdale@example.com>',
+ '"Roy.A.Bear" <dinsdale@example.com>',
+ '"Roy.A.Bear" <dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(name_addr.display_name, 'Roy.A.Bear')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_with_route(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '"Roy.A.Bear" <@two.example.com: dinsdale@example.com>',
+ '"Roy.A.Bear" <@two.example.com: dinsdale@example.com>',
+ '"Roy.A.Bear" <@two.example.com: dinsdale@example.com>',
+ [errors.ObsoleteHeaderDefect],
+ '')
+ self.assertEqual(name_addr.display_name, 'Roy.A.Bear')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertEqual(name_addr.route, ['two.example.com'])
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_ends_at_special(self):
+ name_addr = self._test_get_x(parser.get_name_addr,
+ '"Roy.A.Bear" <dinsdale@example.com>, next',
+ '"Roy.A.Bear" <dinsdale@example.com>',
+ '"Roy.A.Bear" <dinsdale@example.com>',
+ [],
+ ', next')
+ self.assertEqual(name_addr.display_name, 'Roy.A.Bear')
+ self.assertEqual(name_addr.local_part, 'dinsdale')
+ self.assertEqual(name_addr.domain, 'example.com')
+ self.assertIsNone(name_addr.route)
+ self.assertEqual(name_addr.addr_spec, 'dinsdale@example.com')
+
+ def test_get_name_addr_no_content_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_name_addr(' (foo) ')
+
+ def test_get_name_addr_no_content_before_special_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_name_addr(' (foo) ,')
+
+ def test_get_name_addr_no_angle_after_display_name_raises(self):
+ with self.assertRaises(errors.HeaderParseError):
+ parser.get_name_addr('foo bar')
+
+ # get_mailbox
+
+ def test_get_mailbox_addr_spec_only(self):
+ mailbox = self._test_get_x(parser.get_mailbox,
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ '')
+ self.assertEqual(mailbox.token_type, 'mailbox')
+ self.assertIsNone(mailbox.display_name)
+ self.assertEqual(mailbox.local_part, 'dinsdale')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertIsNone(mailbox.route)
+ self.assertEqual(mailbox.addr_spec, 'dinsdale@example.com')
+
+ def test_get_mailbox_angle_addr_only(self):
+ mailbox = self._test_get_x(parser.get_mailbox,
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ '<dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(mailbox.token_type, 'mailbox')
+ self.assertIsNone(mailbox.display_name)
+ self.assertEqual(mailbox.local_part, 'dinsdale')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertIsNone(mailbox.route)
+ self.assertEqual(mailbox.addr_spec, 'dinsdale@example.com')
+
+ def test_get_mailbox_name_addr(self):
+ mailbox = self._test_get_x(parser.get_mailbox,
+ '"Roy A. Bear" <dinsdale@example.com>',
+ '"Roy A. Bear" <dinsdale@example.com>',
+ '"Roy A. Bear" <dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(mailbox.token_type, 'mailbox')
+ self.assertEqual(mailbox.display_name, 'Roy A. Bear')
+ self.assertEqual(mailbox.local_part, 'dinsdale')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertIsNone(mailbox.route)
+ self.assertEqual(mailbox.addr_spec, 'dinsdale@example.com')
+
+ def test_get_mailbox_ends_at_special(self):
+ mailbox = self._test_get_x(parser.get_mailbox,
+ '"Roy A. Bear" <dinsdale@example.com>, rest',
+ '"Roy A. Bear" <dinsdale@example.com>',
+ '"Roy A. Bear" <dinsdale@example.com>',
+ [],
+ ', rest')
+ self.assertEqual(mailbox.token_type, 'mailbox')
+ self.assertEqual(mailbox.display_name, 'Roy A. Bear')
+ self.assertEqual(mailbox.local_part, 'dinsdale')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertIsNone(mailbox.route)
+ self.assertEqual(mailbox.addr_spec, 'dinsdale@example.com')
+
+ def test_get_mailbox_quoted_strings_in_atom_list(self):
+ mailbox = self._test_get_x(parser.get_mailbox,
+ '""example" example"@example.com',
+ '""example" example"@example.com',
+ 'example example@example.com',
+ [errors.InvalidHeaderDefect]*3,
+ '')
+ self.assertEqual(mailbox.local_part, 'example example')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertEqual(mailbox.addr_spec, '"example example"@example.com')
+
+ # get_mailbox_list
+
+ def test_get_mailbox_list_single_addr(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ '')
+ self.assertEqual(mailbox_list.token_type, 'mailbox-list')
+ self.assertEqual(len(mailbox_list.mailboxes), 1)
+ mailbox = mailbox_list.mailboxes[0]
+ self.assertIsNone(mailbox.display_name)
+ self.assertEqual(mailbox.local_part, 'dinsdale')
+ self.assertEqual(mailbox.domain, 'example.com')
+ self.assertIsNone(mailbox.route)
+ self.assertEqual(mailbox.addr_spec, 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.mailboxes,
+ mailbox_list.all_mailboxes)
+
+ def test_get_mailbox_list_two_simple_addr(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ 'dinsdale@example.com, dinsdale@test.example.com',
+ 'dinsdale@example.com, dinsdale@test.example.com',
+ 'dinsdale@example.com, dinsdale@test.example.com',
+ [],
+ '')
+ self.assertEqual(mailbox_list.token_type, 'mailbox-list')
+ self.assertEqual(len(mailbox_list.mailboxes), 2)
+ self.assertEqual(mailbox_list.mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.mailboxes[1].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes,
+ mailbox_list.all_mailboxes)
+
+ def test_get_mailbox_list_two_name_addr(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ ('"Roy A. Bear" <dinsdale@example.com>,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ [],
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 2)
+ self.assertEqual(mailbox_list.mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.mailboxes[0].display_name,
+ 'Roy A. Bear')
+ self.assertEqual(mailbox_list.mailboxes[1].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes[1].display_name,
+ 'Fred Flintstone')
+ self.assertEqual(mailbox_list.mailboxes,
+ mailbox_list.all_mailboxes)
+
+ def test_get_mailbox_list_two_complex(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ ('(foo) "Roy A. Bear" <dinsdale@example.com>(bar),'
+ ' "Fred Flintstone" <dinsdale@test.(bird)example.com>'),
+ ('(foo) "Roy A. Bear" <dinsdale@example.com>(bar),'
+ ' "Fred Flintstone" <dinsdale@test.(bird)example.com>'),
+ (' "Roy A. Bear" <dinsdale@example.com> ,'
+ ' "Fred Flintstone" <dinsdale@test. example.com>'),
+ [errors.ObsoleteHeaderDefect],
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 2)
+ self.assertEqual(mailbox_list.mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.mailboxes[0].display_name,
+ 'Roy A. Bear')
+ self.assertEqual(mailbox_list.mailboxes[1].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes[1].display_name,
+ 'Fred Flintstone')
+ self.assertEqual(mailbox_list.mailboxes,
+ mailbox_list.all_mailboxes)
+
+ def test_get_mailbox_list_unparseable_mailbox_null(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ ('"Roy A. Bear"[] dinsdale@example.com,'
+ ' "Fred Flintstone" <dinsdale@test.(bird)example.com>'),
+ ('"Roy A. Bear"[] dinsdale@example.com,'
+ ' "Fred Flintstone" <dinsdale@test.(bird)example.com>'),
+ ('"Roy A. Bear"[] dinsdale@example.com,'
+ ' "Fred Flintstone" <dinsdale@test. example.com>'),
+ [errors.InvalidHeaderDefect, # the 'extra' text after the local part
+ errors.InvalidHeaderDefect, # the local part with no angle-addr
+ errors.ObsoleteHeaderDefect, # period in extra text (example.com)
+ errors.ObsoleteHeaderDefect], # (bird) in valid address.
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 1)
+ self.assertEqual(len(mailbox_list.all_mailboxes), 2)
+ self.assertEqual(mailbox_list.all_mailboxes[0].token_type,
+ 'invalid-mailbox')
+ self.assertIsNone(mailbox_list.all_mailboxes[0].display_name)
+ self.assertEqual(mailbox_list.all_mailboxes[0].local_part,
+ 'Roy A. Bear')
+ self.assertIsNone(mailbox_list.all_mailboxes[0].domain)
+ self.assertEqual(mailbox_list.all_mailboxes[0].addr_spec,
+ '"Roy A. Bear"')
+ self.assertIs(mailbox_list.all_mailboxes[1],
+ mailbox_list.mailboxes[0])
+ self.assertEqual(mailbox_list.mailboxes[0].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes[0].display_name,
+ 'Fred Flintstone')
+
+ def test_get_mailbox_list_junk_after_valid_address(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ ('"Roy A. Bear" <dinsdale@example.com>@@,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>@@,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>@@,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 1)
+ self.assertEqual(len(mailbox_list.all_mailboxes), 2)
+ self.assertEqual(mailbox_list.all_mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.all_mailboxes[0].display_name,
+ 'Roy A. Bear')
+ self.assertEqual(mailbox_list.all_mailboxes[0].token_type,
+ 'invalid-mailbox')
+ self.assertIs(mailbox_list.all_mailboxes[1],
+ mailbox_list.mailboxes[0])
+ self.assertEqual(mailbox_list.mailboxes[0].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes[0].display_name,
+ 'Fred Flintstone')
+
+ def test_get_mailbox_list_empty_list_element(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ ('"Roy A. Bear" <dinsdale@example.com>, (bird),,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, (bird),,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, ,,'
+ ' "Fred Flintstone" <dinsdale@test.example.com>'),
+ [errors.ObsoleteHeaderDefect]*2,
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 2)
+ self.assertEqual(mailbox_list.all_mailboxes,
+ mailbox_list.mailboxes)
+ self.assertEqual(mailbox_list.all_mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+ self.assertEqual(mailbox_list.all_mailboxes[0].display_name,
+ 'Roy A. Bear')
+ self.assertEqual(mailbox_list.mailboxes[1].addr_spec,
+ 'dinsdale@test.example.com')
+ self.assertEqual(mailbox_list.mailboxes[1].display_name,
+ 'Fred Flintstone')
+
+ def test_get_mailbox_list_only_empty_elements(self):
+ mailbox_list = self._test_get_x(parser.get_mailbox_list,
+ '(foo),, (bar)',
+ '(foo),, (bar)',
+ ' ,, ',
+ [errors.ObsoleteHeaderDefect]*3,
+ '')
+ self.assertEqual(len(mailbox_list.mailboxes), 0)
+ self.assertEqual(mailbox_list.all_mailboxes,
+ mailbox_list.mailboxes)
+
+ # get_group_list
+
+ def test_get_group_list_cfws_only(self):
+ group_list = self._test_get_x(parser.get_group_list,
+ '(hidden);',
+ '(hidden)',
+ ' ',
+ [],
+ ';')
+ self.assertEqual(group_list.token_type, 'group-list')
+ self.assertEqual(len(group_list.mailboxes), 0)
+ self.assertEqual(group_list.mailboxes,
+ group_list.all_mailboxes)
+
+ def test_get_group_list_mailbox_list(self):
+ group_list = self._test_get_x(parser.get_group_list,
+ 'dinsdale@example.org, "Fred A. Bear" <dinsdale@example.org>',
+ 'dinsdale@example.org, "Fred A. Bear" <dinsdale@example.org>',
+ 'dinsdale@example.org, "Fred A. Bear" <dinsdale@example.org>',
+ [],
+ '')
+ self.assertEqual(group_list.token_type, 'group-list')
+ self.assertEqual(len(group_list.mailboxes), 2)
+ self.assertEqual(group_list.mailboxes,
+ group_list.all_mailboxes)
+ self.assertEqual(group_list.mailboxes[1].display_name,
+ 'Fred A. Bear')
+
+ def test_get_group_list_obs_group_list(self):
+ group_list = self._test_get_x(parser.get_group_list,
+ ', (foo),,(bar)',
+ ', (foo),,(bar)',
+ ', ,, ',
+ [errors.ObsoleteHeaderDefect],
+ '')
+ self.assertEqual(group_list.token_type, 'group-list')
+ self.assertEqual(len(group_list.mailboxes), 0)
+ self.assertEqual(group_list.mailboxes,
+ group_list.all_mailboxes)
+
+ def test_get_group_list_comment_only_invalid(self):
+ group_list = self._test_get_x(parser.get_group_list,
+ '(bar)',
+ '(bar)',
+ ' ',
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(group_list.token_type, 'group-list')
+ self.assertEqual(len(group_list.mailboxes), 0)
+ self.assertEqual(group_list.mailboxes,
+ group_list.all_mailboxes)
+
+ # get_group
+
+ def test_get_group_empty(self):
+ group = self._test_get_x(parser.get_group,
+ 'Monty Python:;',
+ 'Monty Python:;',
+ 'Monty Python:;',
+ [],
+ '')
+ self.assertEqual(group.token_type, 'group')
+ self.assertEqual(group.display_name, 'Monty Python')
+ self.assertEqual(len(group.mailboxes), 0)
+ self.assertEqual(group.mailboxes,
+ group.all_mailboxes)
+
+ def test_get_group_null_addr_spec(self):
+ group = self._test_get_x(parser.get_group,
+ 'foo: <>;',
+ 'foo: <>;',
+ 'foo: <>;',
+ [errors.InvalidHeaderDefect],
+ '')
+ self.assertEqual(group.display_name, 'foo')
+ self.assertEqual(len(group.mailboxes), 0)
+ self.assertEqual(len(group.all_mailboxes), 1)
+ self.assertEqual(group.all_mailboxes[0].value, '<>')
+
+ def test_get_group_cfws_only(self):
+ group = self._test_get_x(parser.get_group,
+ 'Monty Python: (hidden);',
+ 'Monty Python: (hidden);',
+ 'Monty Python: ;',
+ [],
+ '')
+ self.assertEqual(group.token_type, 'group')
+ self.assertEqual(group.display_name, 'Monty Python')
+ self.assertEqual(len(group.mailboxes), 0)
+ self.assertEqual(group.mailboxes,
+ group.all_mailboxes)
+
+ def test_get_group_single_mailbox(self):
+ group = self._test_get_x(parser.get_group,
+ 'Monty Python: "Fred A. Bear" <dinsdale@example.com>;',
+ 'Monty Python: "Fred A. Bear" <dinsdale@example.com>;',
+ 'Monty Python: "Fred A. Bear" <dinsdale@example.com>;',
+ [],
+ '')
+ self.assertEqual(group.token_type, 'group')
+ self.assertEqual(group.display_name, 'Monty Python')
+ self.assertEqual(len(group.mailboxes), 1)
+ self.assertEqual(group.mailboxes,
+ group.all_mailboxes)
+ self.assertEqual(group.mailboxes[0].addr_spec,
+ 'dinsdale@example.com')
+
+ def test_get_group_mixed_list(self):
+ group = self._test_get_x(parser.get_group,
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ '(foo) Roger <ping@exampele.com>, x@test.example.com;'),
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ '(foo) Roger <ping@exampele.com>, x@test.example.com;'),
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ ' Roger <ping@exampele.com>, x@test.example.com;'),
+ [],
+ '')
+ self.assertEqual(group.token_type, 'group')
+ self.assertEqual(group.display_name, 'Monty Python')
+ self.assertEqual(len(group.mailboxes), 3)
+ self.assertEqual(group.mailboxes,
+ group.all_mailboxes)
+ self.assertEqual(group.mailboxes[0].display_name,
+ 'Fred A. Bear')
+ self.assertEqual(group.mailboxes[1].display_name,
+ 'Roger')
+ self.assertEqual(group.mailboxes[2].local_part, 'x')
+
+ def test_get_group_one_invalid(self):
+ group = self._test_get_x(parser.get_group,
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ '(foo) Roger ping@exampele.com, x@test.example.com;'),
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ '(foo) Roger ping@exampele.com, x@test.example.com;'),
+ ('Monty Python: "Fred A. Bear" <dinsdale@example.com>,'
+ ' Roger ping@exampele.com, x@test.example.com;'),
+ [errors.InvalidHeaderDefect, # non-angle addr makes local part invalid
+ errors.InvalidHeaderDefect], # and its not obs-local either: no dots.
+ '')
+ self.assertEqual(group.token_type, 'group')
+ self.assertEqual(group.display_name, 'Monty Python')
+ self.assertEqual(len(group.mailboxes), 2)
+ self.assertEqual(len(group.all_mailboxes), 3)
+ self.assertEqual(group.mailboxes[0].display_name,
+ 'Fred A. Bear')
+ self.assertEqual(group.mailboxes[1].local_part, 'x')
+ self.assertIsNone(group.all_mailboxes[1].display_name)
+
+ # get_address
+
+ def test_get_address_simple(self):
+ address = self._test_get_x(parser.get_address,
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ '')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 1)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address.mailboxes[0].domain,
+ 'example.com')
+ self.assertEqual(address[0].token_type,
+ 'mailbox')
+
+ def test_get_address_complex(self):
+ address = self._test_get_x(parser.get_address,
+ '(foo) "Fred A. Bear" <(bird)dinsdale@example.com>',
+ '(foo) "Fred A. Bear" <(bird)dinsdale@example.com>',
+ ' "Fred A. Bear" < dinsdale@example.com>',
+ [],
+ '')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 1)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address.mailboxes[0].display_name,
+ 'Fred A. Bear')
+ self.assertEqual(address[0].token_type,
+ 'mailbox')
+
+ def test_get_address_empty_group(self):
+ address = self._test_get_x(parser.get_address,
+ 'Monty Python:;',
+ 'Monty Python:;',
+ 'Monty Python:;',
+ [],
+ '')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 0)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address[0].token_type,
+ 'group')
+ self.assertEqual(address[0].display_name,
+ 'Monty Python')
+
+ def test_get_address_group(self):
+ address = self._test_get_x(parser.get_address,
+ 'Monty Python: x@example.com, y@example.com;',
+ 'Monty Python: x@example.com, y@example.com;',
+ 'Monty Python: x@example.com, y@example.com;',
+ [],
+ '')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 2)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address[0].token_type,
+ 'group')
+ self.assertEqual(address[0].display_name,
+ 'Monty Python')
+ self.assertEqual(address.mailboxes[0].local_part, 'x')
+
+ def test_get_address_quoted_local_part(self):
+ address = self._test_get_x(parser.get_address,
+ '"foo bar"@example.com',
+ '"foo bar"@example.com',
+ '"foo bar"@example.com',
+ [],
+ '')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 1)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address.mailboxes[0].domain,
+ 'example.com')
+ self.assertEqual(address.mailboxes[0].local_part,
+ 'foo bar')
+ self.assertEqual(address[0].token_type, 'mailbox')
+
+ def test_get_address_ends_at_special(self):
+ address = self._test_get_x(parser.get_address,
+ 'dinsdale@example.com, next',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ ', next')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 1)
+ self.assertEqual(address.mailboxes,
+ address.all_mailboxes)
+ self.assertEqual(address.mailboxes[0].domain,
+ 'example.com')
+ self.assertEqual(address[0].token_type, 'mailbox')
+
+ def test_get_address_invalid_mailbox_invalid(self):
+ address = self._test_get_x(parser.get_address,
+ 'ping example.com, next',
+ 'ping example.com',
+ 'ping example.com',
+ [errors.InvalidHeaderDefect, # addr-spec with no domain
+ errors.InvalidHeaderDefect, # invalid local-part
+ errors.InvalidHeaderDefect, # missing .s in local-part
+ ],
+ ', next')
+ self.assertEqual(address.token_type, 'address')
+ self.assertEqual(len(address.mailboxes), 0)
+ self.assertEqual(len(address.all_mailboxes), 1)
+ self.assertIsNone(address.all_mailboxes[0].domain)
+ self.assertEqual(address.all_mailboxes[0].local_part, 'ping example.com')
+ self.assertEqual(address[0].token_type, 'invalid-mailbox')
+
+ def test_get_address_quoted_strings_in_atom_list(self):
+ address = self._test_get_x(parser.get_address,
+ '""example" example"@example.com',
+ '""example" example"@example.com',
+ 'example example@example.com',
+ [errors.InvalidHeaderDefect]*3,
+ '')
+ self.assertEqual(address.all_mailboxes[0].local_part, 'example example')
+ self.assertEqual(address.all_mailboxes[0].domain, 'example.com')
+ self.assertEqual(address.all_mailboxes[0].addr_spec, '"example example"@example.com')
+
+
+ # get_address_list
+
+ def test_get_address_list_mailboxes_simple(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ 'dinsdale@example.com',
+ [],
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 1)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual([str(x) for x in address_list.mailboxes],
+ [str(x) for x in address_list.addresses])
+ self.assertEqual(address_list.mailboxes[0].domain, 'example.com')
+ self.assertEqual(address_list[0].token_type, 'address')
+ self.assertIsNone(address_list[0].display_name)
+
+ def test_get_address_list_mailboxes_two_simple(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ 'foo@example.com, "Fred A. Bar" <bar@example.com>',
+ 'foo@example.com, "Fred A. Bar" <bar@example.com>',
+ 'foo@example.com, "Fred A. Bar" <bar@example.com>',
+ [],
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 2)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual([str(x) for x in address_list.mailboxes],
+ [str(x) for x in address_list.addresses])
+ self.assertEqual(address_list.mailboxes[0].local_part, 'foo')
+ self.assertEqual(address_list.mailboxes[1].display_name, "Fred A. Bar")
+
+ def test_get_address_list_mailboxes_complex(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ '(ping) Foo <x@example.com>,'
+ 'Nobody Is. Special <y@(bird)example.(bad)com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ '(ping) Foo <x@example.com>,'
+ 'Nobody Is. Special <y@(bird)example.(bad)com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ 'Foo <x@example.com>,'
+ '"Nobody Is. Special" <y@example. com>'),
+ [errors.ObsoleteHeaderDefect, # period in Is.
+ errors.ObsoleteHeaderDefect], # cfws in domain
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 3)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual([str(x) for x in address_list.mailboxes],
+ [str(x) for x in address_list.addresses])
+ self.assertEqual(address_list.mailboxes[0].domain, 'example.com')
+ self.assertEqual(address_list.mailboxes[0].token_type, 'mailbox')
+ self.assertEqual(address_list.addresses[0].token_type, 'address')
+ self.assertEqual(address_list.mailboxes[1].local_part, 'x')
+ self.assertEqual(address_list.mailboxes[2].display_name,
+ 'Nobody Is. Special')
+
+ def test_get_address_list_mailboxes_invalid_addresses(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ '(ping) Foo x@example.com[],'
+ 'Nobody Is. Special <(bird)example.(bad)com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ '(ping) Foo x@example.com[],'
+ 'Nobody Is. Special <(bird)example.(bad)com>'),
+ ('"Roy A. Bear" <dinsdale@example.com>, '
+ 'Foo x@example.com[],'
+ '"Nobody Is. Special" < example. com>'),
+ [errors.InvalidHeaderDefect, # invalid address in list
+ errors.InvalidHeaderDefect, # 'Foo x' local part invalid.
+ errors.InvalidHeaderDefect, # Missing . in 'Foo x' local part
+ errors.ObsoleteHeaderDefect, # period in 'Is.' disp-name phrase
+ errors.InvalidHeaderDefect, # no domain part in addr-spec
+ errors.ObsoleteHeaderDefect], # addr-spec has comment in it
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 1)
+ self.assertEqual(len(address_list.all_mailboxes), 3)
+ self.assertEqual([str(x) for x in address_list.all_mailboxes],
+ [str(x) for x in address_list.addresses])
+ self.assertEqual(address_list.mailboxes[0].domain, 'example.com')
+ self.assertEqual(address_list.mailboxes[0].token_type, 'mailbox')
+ self.assertEqual(address_list.addresses[0].token_type, 'address')
+ self.assertEqual(address_list.addresses[1].token_type, 'address')
+ self.assertEqual(len(address_list.addresses[0].mailboxes), 1)
+ self.assertEqual(len(address_list.addresses[1].mailboxes), 0)
+ self.assertEqual(len(address_list.addresses[1].mailboxes), 0)
+ self.assertEqual(
+ address_list.addresses[1].all_mailboxes[0].local_part, 'Foo x')
+ self.assertEqual(
+ address_list.addresses[2].all_mailboxes[0].display_name,
+ "Nobody Is. Special")
+
+ def test_get_address_list_group_empty(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ 'Monty Python: ;',
+ 'Monty Python: ;',
+ 'Monty Python: ;',
+ [],
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 0)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual(len(address_list.addresses), 1)
+ self.assertEqual(address_list.addresses[0].token_type, 'address')
+ self.assertEqual(address_list.addresses[0].display_name, 'Monty Python')
+ self.assertEqual(len(address_list.addresses[0].mailboxes), 0)
+
+ def test_get_address_list_group_simple(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ 'Monty Python: dinsdale@example.com;',
+ 'Monty Python: dinsdale@example.com;',
+ 'Monty Python: dinsdale@example.com;',
+ [],
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 1)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual(address_list.mailboxes[0].domain, 'example.com')
+ self.assertEqual(address_list.addresses[0].display_name,
+ 'Monty Python')
+ self.assertEqual(address_list.addresses[0].mailboxes[0].domain,
+ 'example.com')
+
+ def test_get_address_list_group_and_mailboxes(self):
+ address_list = self._test_get_x(parser.get_address_list,
+ ('Monty Python: dinsdale@example.com, "Fred" <flint@example.com>;, '
+ 'Abe <x@example.com>, Bee <y@example.com>'),
+ ('Monty Python: dinsdale@example.com, "Fred" <flint@example.com>;, '
+ 'Abe <x@example.com>, Bee <y@example.com>'),
+ ('Monty Python: dinsdale@example.com, "Fred" <flint@example.com>;, '
+ 'Abe <x@example.com>, Bee <y@example.com>'),
+ [],
+ '')
+ self.assertEqual(address_list.token_type, 'address-list')
+ self.assertEqual(len(address_list.mailboxes), 4)
+ self.assertEqual(address_list.mailboxes,
+ address_list.all_mailboxes)
+ self.assertEqual(len(address_list.addresses), 3)
+ self.assertEqual(address_list.mailboxes[0].local_part, 'dinsdale')
+ self.assertEqual(address_list.addresses[0].display_name,
+ 'Monty Python')
+ self.assertEqual(address_list.addresses[0].mailboxes[0].domain,
+ 'example.com')
+ self.assertEqual(address_list.addresses[0].mailboxes[1].local_part,
+ 'flint')
+ self.assertEqual(address_list.addresses[1].mailboxes[0].local_part,
+ 'x')
+ self.assertEqual(address_list.addresses[2].mailboxes[0].local_part,
+ 'y')
+ self.assertEqual(str(address_list.addresses[1]),
+ str(address_list.mailboxes[2]))
+
+
+@parameterize
+class Test_parse_mime_version(TestParserMixin, TestEmailBase):
+
+ def mime_version_as_value(self,
+ value,
+ tl_str,
+ tl_value,
+ major,
+ minor,
+ defects):
+ mime_version = self._test_parse_x(parser.parse_mime_version,
+ value, tl_str, tl_value, defects)
+ self.assertEqual(mime_version.major, major)
+ self.assertEqual(mime_version.minor, minor)
+
+ mime_version_params = {
+
+ 'rfc_2045_1': (
+ '1.0',
+ '1.0',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_2': (
+ '1.0 (produced by MetaSend Vx.x)',
+ '1.0 (produced by MetaSend Vx.x)',
+ '1.0 ',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_3': (
+ '(produced by MetaSend Vx.x) 1.0',
+ '(produced by MetaSend Vx.x) 1.0',
+ ' 1.0',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_4': (
+ '1.(produced by MetaSend Vx.x)0',
+ '1.(produced by MetaSend Vx.x)0',
+ '1. 0',
+ 1,
+ 0,
+ []),
+
+ 'empty': (
+ '',
+ '',
+ '',
+ None,
+ None,
+ [errors.HeaderMissingRequiredValue]),
+
+ }
+
+
+
+class TestFolding(TestEmailBase):
+
+ policy = policy.default
+
+ def _test(self, tl, folded, policy=policy):
+ self.assertEqual(tl.fold(policy=policy), folded, tl.ppstr())
+
+ def test_simple_unstructured_no_folds(self):
+ self._test(parser.get_unstructured("This is a test"),
+ "This is a test\n")
+
+ def test_simple_unstructured_folded(self):
+ self._test(parser.get_unstructured("This is also a test, but this "
+ "time there are enough words (and even some "
+ "symbols) to make it wrap; at least in theory."),
+ "This is also a test, but this time there are enough "
+ "words (and even some\n"
+ " symbols) to make it wrap; at least in theory.\n")
+
+ def test_unstructured_with_unicode_no_folds(self):
+ self._test(parser.get_unstructured("hübsch kleiner beißt"),
+ "=?utf-8?q?h=C3=BCbsch_kleiner_bei=C3=9Ft?=\n")
+
+ def test_one_ew_on_each_of_two_wrapped_lines(self):
+ self._test(parser.get_unstructured("Mein kleiner Kaktus ist sehr "
+ "hübsch. Es hat viele Stacheln "
+ "und oft beißt mich."),
+ "Mein kleiner Kaktus ist sehr =?utf-8?q?h=C3=BCbsch=2E?= "
+ "Es hat viele Stacheln\n"
+ " und oft =?utf-8?q?bei=C3=9Ft?= mich.\n")
+
+ def test_ews_combined_before_wrap(self):
+ self._test(parser.get_unstructured("Mein Kaktus ist hübsch. "
+ "Es beißt mich. "
+ "And that's all I'm sayin."),
+ "Mein Kaktus ist =?utf-8?q?h=C3=BCbsch=2E__Es_bei=C3=9Ft?= "
+ "mich. And that's\n"
+ " all I'm sayin.\n")
+
+ # XXX Need test of an encoded word so long that it needs to be wrapped
+
+ def test_simple_address(self):
+ self._test(parser.get_address_list("abc <xyz@example.com>")[0],
+ "abc <xyz@example.com>\n")
+
+ def test_address_list_folding_at_commas(self):
+ self._test(parser.get_address_list('abc <xyz@example.com>, '
+ '"Fred Blunt" <sharp@example.com>, '
+ '"J.P.Cool" <hot@example.com>, '
+ '"K<>y" <key@example.com>, '
+ 'Firesale <cheap@example.com>, '
+ '<end@example.com>')[0],
+ 'abc <xyz@example.com>, "Fred Blunt" <sharp@example.com>,\n'
+ ' "J.P.Cool" <hot@example.com>, "K<>y" <key@example.com>,\n'
+ ' Firesale <cheap@example.com>, <end@example.com>\n')
+
+ def test_address_list_with_unicode_names(self):
+ self._test(parser.get_address_list(
+ 'Hübsch Kaktus <beautiful@example.com>, '
+ 'beißt beißt <biter@example.com>')[0],
+ '=?utf-8?q?H=C3=BCbsch?= Kaktus <beautiful@example.com>,\n'
+ ' =?utf-8?q?bei=C3=9Ft_bei=C3=9Ft?= <biter@example.com>\n')
+
+ def test_address_list_with_unicode_names_in_quotes(self):
+ self._test(parser.get_address_list(
+ '"Hübsch Kaktus" <beautiful@example.com>, '
+ '"beißt" beißt <biter@example.com>')[0],
+ '=?utf-8?q?H=C3=BCbsch?= Kaktus <beautiful@example.com>,\n'
+ ' =?utf-8?q?bei=C3=9Ft_bei=C3=9Ft?= <biter@example.com>\n')
+
+ # XXX Need tests with comments on various sides of a unicode token,
+ # and with unicode tokens in the comments. Spaces inside the quotes
+ # currently don't do the right thing.
+
+ def test_initial_whitespace_splitting(self):
+ body = parser.get_unstructured(' ' + 'x'*77)
+ header = parser.Header([
+ parser.HeaderLabel([parser.ValueTerminal('test:', 'atext')]),
+ parser.CFWSList([parser.WhiteSpaceTerminal(' ', 'fws')]), body])
+ self._test(header, 'test: \n ' + 'x'*77 + '\n')
+
+ def test_whitespace_splitting(self):
+ self._test(parser.get_unstructured('xxx ' + 'y'*77),
+ 'xxx \n ' + 'y'*77 + '\n')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/email/test/test_email_codecs.py b/Lib/test/test_email/test_asian_codecs.py
index ca85f57..089269f 100644
--- a/Lib/email/test/test_email_codecs.py
+++ b/Lib/test/test_email/test_asian_codecs.py
@@ -5,7 +5,7 @@
import unittest
from test.support import run_unittest
-from email.test.test_email import TestEmailBase
+from test.test_email.test_email import TestEmailBase
from email.charset import Charset
from email.header import Header, decode_header
from email.message import Message
@@ -41,7 +41,7 @@ class TestEmailAsianCodecs(TestEmailBase):
Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?=
=?iso-8859-1?q?Gr=FC=DF_Gott!?=""")
eq(decode_header(h.encode()),
- [(b'Hello World!', None),
+ [(b'Hello World! ', None),
(b'\x1b$B%O%m!<%o!<%k%I!*\x1b(B', 'iso-2022-jp'),
(b'Gr\xfc\xdf Gott!', gcode)])
subject_bytes = (b'test-ja \xa4\xd8\xc5\xea\xb9\xc6\xa4\xb5'
@@ -78,16 +78,5 @@ Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?=
-def suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(TestEmailAsianCodecs))
- return suite
-
-
-def test_main():
- run_unittest(TestEmailAsianCodecs)
-
-
-
if __name__ == '__main__':
- unittest.main(defaultTest='suite')
+ unittest.main()
diff --git a/Lib/test/test_email/test_defect_handling.py b/Lib/test/test_email/test_defect_handling.py
new file mode 100644
index 0000000..305432d
--- /dev/null
+++ b/Lib/test/test_email/test_defect_handling.py
@@ -0,0 +1,320 @@
+import textwrap
+import unittest
+import contextlib
+from email import policy
+from email import errors
+from test.test_email import TestEmailBase
+
+
+class TestDefectsBase:
+
+ policy = policy.default
+ raise_expected = False
+
+ @contextlib.contextmanager
+ def _raise_point(self, defect):
+ yield
+
+ def test_same_boundary_inner_outer(self):
+ source = textwrap.dedent("""\
+ Subject: XX
+ From: xx@xx.dk
+ To: XX
+ Mime-version: 1.0
+ Content-type: multipart/mixed;
+ boundary="MS_Mac_OE_3071477847_720252_MIME_Part"
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part
+ Content-type: multipart/alternative;
+ boundary="MS_Mac_OE_3071477847_720252_MIME_Part"
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part
+ Content-type: text/plain; charset="ISO-8859-1"
+ Content-transfer-encoding: quoted-printable
+
+ text
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part
+ Content-type: text/html; charset="ISO-8859-1"
+ Content-transfer-encoding: quoted-printable
+
+ <HTML></HTML>
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part--
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part
+ Content-type: image/gif; name="xx.gif";
+ Content-disposition: attachment
+ Content-transfer-encoding: base64
+
+ Some removed base64 encoded chars.
+
+ --MS_Mac_OE_3071477847_720252_MIME_Part--
+
+ """)
+ # XXX better would be to actually detect the duplicate.
+ with self._raise_point(errors.StartBoundaryNotFoundDefect):
+ msg = self._str_msg(source)
+ if self.raise_expected: return
+ inner = msg.get_payload(0)
+ self.assertTrue(hasattr(inner, 'defects'))
+ self.assertEqual(len(self.get_defects(inner)), 1)
+ self.assertTrue(isinstance(self.get_defects(inner)[0],
+ errors.StartBoundaryNotFoundDefect))
+
+ def test_multipart_no_boundary(self):
+ source = textwrap.dedent("""\
+ Date: Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800)
+ From: foobar
+ Subject: broken mail
+ MIME-Version: 1.0
+ Content-Type: multipart/report; report-type=delivery-status;
+
+ --JAB03225.986577786/zinfandel.lacita.com
+
+ One part
+
+ --JAB03225.986577786/zinfandel.lacita.com
+ Content-Type: message/delivery-status
+
+ Header: Another part
+
+ --JAB03225.986577786/zinfandel.lacita.com--
+ """)
+ with self._raise_point(errors.NoBoundaryInMultipartDefect):
+ msg = self._str_msg(source)
+ if self.raise_expected: return
+ self.assertTrue(isinstance(msg.get_payload(), str))
+ self.assertEqual(len(self.get_defects(msg)), 2)
+ self.assertTrue(isinstance(self.get_defects(msg)[0],
+ errors.NoBoundaryInMultipartDefect))
+ self.assertTrue(isinstance(self.get_defects(msg)[1],
+ errors.MultipartInvariantViolationDefect))
+
+ multipart_msg = textwrap.dedent("""\
+ Date: Wed, 14 Nov 2007 12:56:23 GMT
+ From: foo@bar.invalid
+ To: foo@bar.invalid
+ Subject: Content-Transfer-Encoding: base64 and multipart
+ MIME-Version: 1.0
+ Content-Type: multipart/mixed;
+ boundary="===============3344438784458119861=="{}
+
+ --===============3344438784458119861==
+ Content-Type: text/plain
+
+ Test message
+
+ --===============3344438784458119861==
+ Content-Type: application/octet-stream
+ Content-Transfer-Encoding: base64
+
+ YWJj
+
+ --===============3344438784458119861==--
+ """)
+
+ def test_multipart_invalid_cte(self):
+ with self._raise_point(
+ errors.InvalidMultipartContentTransferEncodingDefect):
+ msg = self._str_msg(
+ self.multipart_msg.format(
+ "\nContent-Transfer-Encoding: base64"))
+ if self.raise_expected: return
+ self.assertEqual(len(self.get_defects(msg)), 1)
+ self.assertIsInstance(self.get_defects(msg)[0],
+ errors.InvalidMultipartContentTransferEncodingDefect)
+
+ def test_multipart_no_cte_no_defect(self):
+ if self.raise_expected: return
+ msg = self._str_msg(self.multipart_msg.format(''))
+ self.assertEqual(len(self.get_defects(msg)), 0)
+
+ def test_multipart_valid_cte_no_defect(self):
+ if self.raise_expected: return
+ for cte in ('7bit', '8bit', 'BINary'):
+ msg = self._str_msg(
+ self.multipart_msg.format("\nContent-Transfer-Encoding: "+cte))
+ self.assertEqual(len(self.get_defects(msg)), 0, "cte="+cte)
+
+ def test_lying_multipart(self):
+ source = textwrap.dedent("""\
+ From: "Allison Dunlap" <xxx@example.com>
+ To: yyy@example.com
+ Subject: 64423
+ Date: Sun, 11 Jul 2004 16:09:27 -0300
+ MIME-Version: 1.0
+ Content-Type: multipart/alternative;
+
+ Blah blah blah
+ """)
+ with self._raise_point(errors.NoBoundaryInMultipartDefect):
+ msg = self._str_msg(source)
+ if self.raise_expected: return
+ self.assertTrue(hasattr(msg, 'defects'))
+ self.assertEqual(len(self.get_defects(msg)), 2)
+ self.assertTrue(isinstance(self.get_defects(msg)[0],
+ errors.NoBoundaryInMultipartDefect))
+ self.assertTrue(isinstance(self.get_defects(msg)[1],
+ errors.MultipartInvariantViolationDefect))
+
+ def test_missing_start_boundary(self):
+ source = textwrap.dedent("""\
+ Content-Type: multipart/mixed; boundary="AAA"
+ From: Mail Delivery Subsystem <xxx@example.com>
+ To: yyy@example.com
+
+ --AAA
+
+ Stuff
+
+ --AAA
+ Content-Type: message/rfc822
+
+ From: webmaster@python.org
+ To: zzz@example.com
+ Content-Type: multipart/mixed; boundary="BBB"
+
+ --BBB--
+
+ --AAA--
+
+ """)
+ # The message structure is:
+ #
+ # multipart/mixed
+ # text/plain
+ # message/rfc822
+ # multipart/mixed [*]
+ #
+ # [*] This message is missing its start boundary
+ with self._raise_point(errors.StartBoundaryNotFoundDefect):
+ outer = self._str_msg(source)
+ if self.raise_expected: return
+ bad = outer.get_payload(1).get_payload(0)
+ self.assertEqual(len(self.get_defects(bad)), 1)
+ self.assertTrue(isinstance(self.get_defects(bad)[0],
+ errors.StartBoundaryNotFoundDefect))
+
+ def test_first_line_is_continuation_header(self):
+ with self._raise_point(errors.FirstHeaderLineIsContinuationDefect):
+ msg = self._str_msg(' Line 1\nSubject: test\n\nbody')
+ if self.raise_expected: return
+ self.assertEqual(msg.keys(), ['Subject'])
+ self.assertEqual(msg.get_payload(), 'body')
+ self.assertEqual(len(self.get_defects(msg)), 1)
+ self.assertDefectsEqual(self.get_defects(msg),
+ [errors.FirstHeaderLineIsContinuationDefect])
+ self.assertEqual(self.get_defects(msg)[0].line, ' Line 1\n')
+
+ def test_missing_header_body_separator(self):
+ # Our heuristic if we see a line that doesn't look like a header (no
+ # leading whitespace but no ':') is to assume that the blank line that
+ # separates the header from the body is missing, and to stop parsing
+ # headers and start parsing the body.
+ with self._raise_point(errors.MissingHeaderBodySeparatorDefect):
+ msg = self._str_msg('Subject: test\nnot a header\nTo: abc\n\nb\n')
+ if self.raise_expected: return
+ self.assertEqual(msg.keys(), ['Subject'])
+ self.assertEqual(msg.get_payload(), 'not a header\nTo: abc\n\nb\n')
+ self.assertDefectsEqual(self.get_defects(msg),
+ [errors.MissingHeaderBodySeparatorDefect])
+
+ def test_bad_padding_in_base64_payload(self):
+ source = textwrap.dedent("""\
+ Subject: test
+ MIME-Version: 1.0
+ Content-Type: text/plain; charset="utf-8"
+ Content-Transfer-Encoding: base64
+
+ dmk
+ """)
+ msg = self._str_msg(source)
+ with self._raise_point(errors.InvalidBase64PaddingDefect):
+ payload = msg.get_payload(decode=True)
+ if self.raise_expected: return
+ self.assertEqual(payload, b'vi')
+ self.assertDefectsEqual(self.get_defects(msg),
+ [errors.InvalidBase64PaddingDefect])
+
+ def test_invalid_chars_in_base64_payload(self):
+ source = textwrap.dedent("""\
+ Subject: test
+ MIME-Version: 1.0
+ Content-Type: text/plain; charset="utf-8"
+ Content-Transfer-Encoding: base64
+
+ dm\x01k===
+ """)
+ msg = self._str_msg(source)
+ with self._raise_point(errors.InvalidBase64CharactersDefect):
+ payload = msg.get_payload(decode=True)
+ if self.raise_expected: return
+ self.assertEqual(payload, b'vi')
+ self.assertDefectsEqual(self.get_defects(msg),
+ [errors.InvalidBase64CharactersDefect])
+
+ def test_missing_ending_boundary(self):
+ source = textwrap.dedent("""\
+ To: 1@harrydomain4.com
+ Subject: Fwd: 1
+ MIME-Version: 1.0
+ Content-Type: multipart/alternative;
+ boundary="------------000101020201080900040301"
+
+ --------------000101020201080900040301
+ Content-Type: text/plain; charset=ISO-8859-1
+ Content-Transfer-Encoding: 7bit
+
+ Alternative 1
+
+ --------------000101020201080900040301
+ Content-Type: text/html; charset=ISO-8859-1
+ Content-Transfer-Encoding: 7bit
+
+ Alternative 2
+
+ """)
+ with self._raise_point(errors.CloseBoundaryNotFoundDefect):
+ msg = self._str_msg(source)
+ if self.raise_expected: return
+ self.assertEqual(len(msg.get_payload()), 2)
+ self.assertEqual(msg.get_payload(1).get_payload(), 'Alternative 2\n')
+ self.assertDefectsEqual(self.get_defects(msg),
+ [errors.CloseBoundaryNotFoundDefect])
+
+
+class TestDefectDetection(TestDefectsBase, TestEmailBase):
+
+ def get_defects(self, obj):
+ return obj.defects
+
+
+class TestDefectCapture(TestDefectsBase, TestEmailBase):
+
+ class CapturePolicy(policy.EmailPolicy):
+ captured = None
+ def register_defect(self, obj, defect):
+ self.captured.append(defect)
+
+ def setUp(self):
+ self.policy = self.CapturePolicy(captured=list())
+
+ def get_defects(self, obj):
+ return self.policy.captured
+
+
+class TestDefectRaising(TestDefectsBase, TestEmailBase):
+
+ policy = TestDefectsBase.policy
+ policy = policy.clone(raise_on_defect=True)
+ raise_expected = True
+
+ @contextlib.contextmanager
+ def _raise_point(self, defect):
+ with self.assertRaises(defect):
+ yield
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/email/test/test_email.py b/Lib/test/test_email/test_email.py
index 352b9b1..36c344f 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -16,6 +16,7 @@ from io import StringIO, BytesIO
from itertools import chain
import email
+import email.policy
from email.charset import Charset
from email.header import Header, decode_header, make_header
@@ -36,40 +37,14 @@ from email import iterators
from email import base64mime
from email import quoprimime
-from test.support import findfile, run_unittest, unlink
-from email.test import __file__ as landmark
-
+from test.support import run_unittest, unlink
+from test.test_email import openfile, TestEmailBase
NL = '\n'
EMPTYSTRING = ''
SPACE = ' '
-
-def openfile(filename, *args, **kws):
- path = os.path.join(os.path.dirname(landmark), 'data', filename)
- return open(path, *args, **kws)
-
-
-
-# Base test class
-class TestEmailBase(unittest.TestCase):
- def ndiffAssertEqual(self, first, second):
- """Like assertEqual except use ndiff for readable output."""
- if first != second:
- sfirst = str(first)
- ssecond = str(second)
- rfirst = [repr(line) for line in sfirst.splitlines()]
- rsecond = [repr(line) for line in ssecond.splitlines()]
- diff = difflib.ndiff(rfirst, rsecond)
- raise self.failureException(NL + NL.join(diff))
-
- def _msgobj(self, filename):
- with openfile(findfile(filename)) as fp:
- return email.message_from_file(fp)
-
-
-
# Test various aspects of the Message class's API
class TestMessageAPI(TestEmailBase):
def test_get_all(self):
@@ -194,7 +169,7 @@ class TestMessageAPI(TestEmailBase):
def test_message_rfc822_only(self):
# Issue 7970: message/rfc822 not in multipart parsed by
# HeaderParser caused an exception when flattened.
- with openfile(findfile('msg_46.txt')) as fp:
+ with openfile('msg_46.txt') as fp:
msgdata = fp.read()
parser = HeaderParser()
msg = parser.parsestr(msgdata)
@@ -203,6 +178,17 @@ class TestMessageAPI(TestEmailBase):
gen.flatten(msg, False)
self.assertEqual(out.getvalue(), msgdata)
+ def test_byte_message_rfc822_only(self):
+ # Make sure new bytes header parser also passes this.
+ with openfile('msg_46.txt', 'rb') as fp:
+ msgdata = fp.read()
+ parser = email.parser.BytesHeaderParser()
+ msg = parser.parsebytes(msgdata)
+ out = BytesIO()
+ gen = email.generator.BytesGenerator(out)
+ gen.flatten(msg)
+ self.assertEqual(out.getvalue(), msgdata)
+
def test_get_decoded_payload(self):
eq = self.assertEqual
msg = self._msgobj('msg_10.txt')
@@ -273,6 +259,7 @@ class TestMessageAPI(TestEmailBase):
self.assertTrue(lines[0].startswith('From '))
eq(text, NL.join(lines[1:]))
+ # test_headerregistry.TestContentTypeHeader.bad_params
def test_bad_param(self):
msg = email.message_from_string("Content-Type: blarg; baz; boo\n")
self.assertEqual(msg.get_param('baz'), '')
@@ -306,6 +293,7 @@ class TestMessageAPI(TestEmailBase):
eq(msg.get_params(header='x-header'),
[('foo', ''), ('bar', 'one'), ('baz', 'two')])
+ # test_headerregistry.TestContentTypeHeader.spaces_around_param_equals
def test_get_param_liberal(self):
msg = Message()
msg['Content-Type'] = 'Content-Type: Multipart/mixed; boundary = "CPIMSSMTPC06p5f3tG"'
@@ -328,10 +316,12 @@ class TestMessageAPI(TestEmailBase):
# msg.get_param("weird")
# yet.
+ # test_headerregistry.TestContentTypeHeader.spaces_around_semis
def test_get_param_funky_continuation_lines(self):
msg = self._msgobj('msg_22.txt')
self.assertEqual(msg.get_payload(1).get_param('name'), 'wibble.JPG')
+ # test_headerregistry.TestContentTypeHeader.semis_inside_quotes
def test_get_param_with_semis_in_quotes(self):
msg = email.message_from_string(
'Content-Type: image/pjpeg; name="Jim&amp;&amp;Jill"\n')
@@ -339,6 +329,7 @@ class TestMessageAPI(TestEmailBase):
self.assertEqual(msg.get_param('name', unquote=False),
'"Jim&amp;&amp;Jill"')
+ # test_headerregistry.TestContentTypeHeader.quotes_inside_rfc2231_value
def test_get_param_with_quotes(self):
msg = email.message_from_string(
'Content-Type: foo; bar*0="baz\\"foobar"; bar*1="\\"baz"')
@@ -527,6 +518,7 @@ class TestMessageAPI(TestEmailBase):
eq(msg.values(), ['One Hundred', 'Twenty', 'Three', 'Eleven'])
self.assertRaises(KeyError, msg.replace_header, 'Fourth', 'Missing')
+ # test_defect_handling:test_invalid_chars_in_base64_payload
def test_broken_base64_payload(self):
x = 'AwDp0P7//y6LwKEAcPa/6Q=9'
msg = Message()
@@ -534,7 +526,10 @@ class TestMessageAPI(TestEmailBase):
msg['content-transfer-encoding'] = 'base64'
msg.set_payload(x)
self.assertEqual(msg.get_payload(decode=True),
- bytes(x, 'raw-unicode-escape'))
+ (b'\x03\x00\xe9\xd0\xfe\xff\xff.\x8b\xc0'
+ b'\xa1\x00p\xf6\xbf\xe9\x0f'))
+ self.assertIsInstance(msg.defects[0],
+ errors.InvalidBase64CharactersDefect)
def test_broken_unicode_payload(self):
# This test improves coverage but is not a compliance test.
@@ -632,6 +627,18 @@ class TestMessageAPI(TestEmailBase):
abc
"""))
+ def test_unicode_body_defaults_to_utf8_encoding(self):
+ # Issue 14291
+ m = MIMEText('É testabc\n')
+ self.assertEqual(str(m),textwrap.dedent("""\
+ Content-Type: text/plain; charset="utf-8"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: base64
+
+ w4kgdGVzdGFiYwo=
+ """))
+
+
# Test the email.encoders module
class TestEncoders(unittest.TestCase):
@@ -657,7 +664,7 @@ class TestEncoders(unittest.TestCase):
eq(msg['content-transfer-encoding'], '7bit')
# Similar, but with 8bit data
msg = MIMEText('hello \xf8 world')
- eq(msg['content-transfer-encoding'], '8bit')
+ eq(msg['content-transfer-encoding'], 'base64')
# And now with a different charset
msg = MIMEText('hello \xf8 world', _charset='iso-8859-1')
eq(msg['content-transfer-encoding'], 'quoted-printable')
@@ -1243,6 +1250,7 @@ List: List-Unsubscribe:
=?utf-8?q?_folding_white_space_works?=""")+'\n')
+
# Test mangling of "From " lines in the body of a message
class TestFromMangling(unittest.TestCase):
def setUp(self):
@@ -1316,13 +1324,7 @@ Blah blah blah
# Test the basic MIMEAudio class
class TestMIMEAudio(unittest.TestCase):
def setUp(self):
- # Make sure we pick up the audiotest.au that lives in email/test/data.
- # In Python, there's an audiotest.au living in Lib/test but that isn't
- # included in some binary distros that don't include the test
- # package. The trailing empty string on the .join() is significant
- # since findfile() will do a dirname().
- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
- with open(findfile('audiotest.au', datadir), 'rb') as fp:
+ with openfile('audiotest.au', 'rb') as fp:
self._audiodata = fp.read()
self._au = MIMEAudio(self._audiodata)
@@ -1850,6 +1852,7 @@ YXNkZg==
# Test some badly formatted messages
class TestNonConformant(TestEmailBase):
+
def test_parse_missing_minor_type(self):
eq = self.assertEqual
msg = self._msgobj('msg_14.txt')
@@ -1857,6 +1860,7 @@ class TestNonConformant(TestEmailBase):
eq(msg.get_content_maintype(), 'text')
eq(msg.get_content_subtype(), 'plain')
+ # test_defect_handling
def test_same_boundary_inner_outer(self):
unless = self.assertTrue
msg = self._msgobj('msg_15.txt')
@@ -1867,15 +1871,62 @@ class TestNonConformant(TestEmailBase):
unless(isinstance(inner.defects[0],
errors.StartBoundaryNotFoundDefect))
+ # test_defect_handling
def test_multipart_no_boundary(self):
unless = self.assertTrue
msg = self._msgobj('msg_25.txt')
unless(isinstance(msg.get_payload(), str))
self.assertEqual(len(msg.defects), 2)
- unless(isinstance(msg.defects[0], errors.NoBoundaryInMultipartDefect))
+ unless(isinstance(msg.defects[0],
+ errors.NoBoundaryInMultipartDefect))
unless(isinstance(msg.defects[1],
errors.MultipartInvariantViolationDefect))
+ multipart_msg = textwrap.dedent("""\
+ Date: Wed, 14 Nov 2007 12:56:23 GMT
+ From: foo@bar.invalid
+ To: foo@bar.invalid
+ Subject: Content-Transfer-Encoding: base64 and multipart
+ MIME-Version: 1.0
+ Content-Type: multipart/mixed;
+ boundary="===============3344438784458119861=="{}
+
+ --===============3344438784458119861==
+ Content-Type: text/plain
+
+ Test message
+
+ --===============3344438784458119861==
+ Content-Type: application/octet-stream
+ Content-Transfer-Encoding: base64
+
+ YWJj
+
+ --===============3344438784458119861==--
+ """)
+
+ # test_defect_handling
+ def test_multipart_invalid_cte(self):
+ msg = self._str_msg(
+ self.multipart_msg.format("\nContent-Transfer-Encoding: base64"))
+ self.assertEqual(len(msg.defects), 1)
+ self.assertIsInstance(msg.defects[0],
+ errors.InvalidMultipartContentTransferEncodingDefect)
+
+ # test_defect_handling
+ def test_multipart_no_cte_no_defect(self):
+ msg = self._str_msg(self.multipart_msg.format(''))
+ self.assertEqual(len(msg.defects), 0)
+
+ # test_defect_handling
+ def test_multipart_valid_cte_no_defect(self):
+ for cte in ('7bit', '8bit', 'BINary'):
+ msg = self._str_msg(
+ self.multipart_msg.format(
+ "\nContent-Transfer-Encoding: {}".format(cte)))
+ self.assertEqual(len(msg.defects), 0)
+
+ # test_headerregistry.TestContentTyopeHeader invalid_1 and invalid_2.
def test_invalid_content_type(self):
eq = self.assertEqual
neq = self.ndiffAssertEqual
@@ -1925,15 +1976,18 @@ Subject: here's something interesting
counter to RFC 2822, there's no separating newline here
""")
+ # test_defect_handling
def test_lying_multipart(self):
unless = self.assertTrue
msg = self._msgobj('msg_41.txt')
unless(hasattr(msg, 'defects'))
self.assertEqual(len(msg.defects), 2)
- unless(isinstance(msg.defects[0], errors.NoBoundaryInMultipartDefect))
+ unless(isinstance(msg.defects[0],
+ errors.NoBoundaryInMultipartDefect))
unless(isinstance(msg.defects[1],
errors.MultipartInvariantViolationDefect))
+ # test_defect_handling
def test_missing_start_boundary(self):
outer = self._msgobj('msg_42.txt')
# The message structure is:
@@ -1949,17 +2003,29 @@ counter to RFC 2822, there's no separating newline here
self.assertTrue(isinstance(bad.defects[0],
errors.StartBoundaryNotFoundDefect))
+ # test_defect_handling
def test_first_line_is_continuation_header(self):
eq = self.assertEqual
- m = ' Line 1\nLine 2\nLine 3'
+ m = ' Line 1\nSubject: test\n\nbody'
msg = email.message_from_string(m)
- eq(msg.keys(), [])
- eq(msg.get_payload(), 'Line 2\nLine 3')
+ eq(msg.keys(), ['Subject'])
+ eq(msg.get_payload(), 'body')
eq(len(msg.defects), 1)
- self.assertTrue(isinstance(msg.defects[0],
- errors.FirstHeaderLineIsContinuationDefect))
+ self.assertDefectsEqual(msg.defects,
+ [errors.FirstHeaderLineIsContinuationDefect])
eq(msg.defects[0].line, ' Line 1\n')
+ # test_defect_handling
+ def test_missing_header_body_separator(self):
+ # Our heuristic if we see a line that doesn't look like a header (no
+ # leading whitespace but no ':') is to assume that the blank line that
+ # separates the header from the body is missing, and to stop parsing
+ # headers and start parsing the body.
+ msg = self._str_msg('Subject: test\nnot a header\nTo: abc\n\nb\n')
+ self.assertEqual(msg.keys(), ['Subject'])
+ self.assertEqual(msg.get_payload(), 'not a header\nTo: abc\n\nb\n')
+ self.assertDefectsEqual(msg.defects,
+ [errors.MissingHeaderBodySeparatorDefect])
# Test RFC 2047 header encoding and decoding
@@ -1970,9 +2036,9 @@ class TestRFC2047(TestEmailBase):
foo bar =?mac-iceland?q?r=8Aksm=9Arg=8Cs?="""
dh = decode_header(s)
eq(dh, [
- (b'Re:', None),
+ (b'Re: ', None),
(b'r\x8aksm\x9arg\x8cs', 'mac-iceland'),
- (b'baz foo bar', None),
+ (b' baz foo bar ', None),
(b'r\x8aksm\x9arg\x8cs', 'mac-iceland')])
header = make_header(dh)
eq(str(header),
@@ -1981,35 +2047,37 @@ class TestRFC2047(TestEmailBase):
Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?=
=?mac-iceland?q?=9Arg=8Cs?=""")
- def test_whitespace_eater_unicode(self):
+ def test_whitespace_keeper_unicode(self):
eq = self.assertEqual
s = '=?ISO-8859-1?Q?Andr=E9?= Pirard <pirard@dom.ain>'
dh = decode_header(s)
eq(dh, [(b'Andr\xe9', 'iso-8859-1'),
- (b'Pirard <pirard@dom.ain>', None)])
+ (b' Pirard <pirard@dom.ain>', None)])
header = str(make_header(dh))
eq(header, 'Andr\xe9 Pirard <pirard@dom.ain>')
- def test_whitespace_eater_unicode_2(self):
+ def test_whitespace_keeper_unicode_2(self):
eq = self.assertEqual
s = 'The =?iso-8859-1?b?cXVpY2sgYnJvd24gZm94?= jumped over the =?iso-8859-1?b?bGF6eSBkb2c=?='
dh = decode_header(s)
- eq(dh, [(b'The', None), (b'quick brown fox', 'iso-8859-1'),
- (b'jumped over the', None), (b'lazy dog', 'iso-8859-1')])
+ eq(dh, [(b'The ', None), (b'quick brown fox', 'iso-8859-1'),
+ (b' jumped over the ', None), (b'lazy dog', 'iso-8859-1')])
hu = str(make_header(dh))
eq(hu, 'The quick brown fox jumped over the lazy dog')
def test_rfc2047_missing_whitespace(self):
s = 'Sm=?ISO-8859-1?B?9g==?=rg=?ISO-8859-1?B?5Q==?=sbord'
dh = decode_header(s)
- self.assertEqual(dh, [(s, None)])
+ self.assertEqual(dh, [(b'Sm', None), (b'\xf6', 'iso-8859-1'),
+ (b'rg', None), (b'\xe5', 'iso-8859-1'),
+ (b'sbord', None)])
def test_rfc2047_with_whitespace(self):
s = 'Sm =?ISO-8859-1?B?9g==?= rg =?ISO-8859-1?B?5Q==?= sbord'
dh = decode_header(s)
- self.assertEqual(dh, [(b'Sm', None), (b'\xf6', 'iso-8859-1'),
- (b'rg', None), (b'\xe5', 'iso-8859-1'),
- (b'sbord', None)])
+ self.assertEqual(dh, [(b'Sm ', None), (b'\xf6', 'iso-8859-1'),
+ (b' rg ', None), (b'\xe5', 'iso-8859-1'),
+ (b' sbord', None)])
def test_rfc2047_B_bad_padding(self):
s = '=?iso-8859-1?B?%s?='
@@ -2027,6 +2095,67 @@ Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?=
self.assertEqual(decode_header(s),
[(b'andr\xe9=zz', 'iso-8659-1')])
+ def test_rfc2047_rfc2047_1(self):
+ # 1st testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'a', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_2(self):
+ # 2nd testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a?= b)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'a', 'iso-8859-1'), (b' b)', None)])
+
+ def test_rfc2047_rfc2047_3(self):
+ # 3rd testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_4(self):
+ # 4th testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_5a(self):
+ # 5th testcase at end of rfc2047 newline is \r\n
+ s = '(=?ISO-8859-1?Q?a?=\r\n =?ISO-8859-1?Q?b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_5b(self):
+ # 5th testcase at end of rfc2047 newline is \n
+ s = '(=?ISO-8859-1?Q?a?=\n =?ISO-8859-1?Q?b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_6(self):
+ # 6th testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a_b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'a b', 'iso-8859-1'), (b')', None)])
+
+ def test_rfc2047_rfc2047_7(self):
+ # 7th testcase at end of rfc2047
+ s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=)'
+ self.assertEqual(decode_header(s),
+ [(b'(', None), (b'a', 'iso-8859-1'), (b' b', 'iso-8859-2'),
+ (b')', None)])
+ self.assertEqual(make_header(decode_header(s)).encode(), s.lower())
+ self.assertEqual(str(make_header(decode_header(s))), '(a b)')
+
+ def test_multiline_header(self):
+ s = '=?windows-1252?q?=22M=FCller_T=22?=\r\n <T.Mueller@xxx.com>'
+ self.assertEqual(decode_header(s),
+ [(b'"M\xfcller T"', 'windows-1252'),
+ (b'<T.Mueller@xxx.com>', None)])
+ self.assertEqual(make_header(decode_header(s)).encode(),
+ ''.join(s.splitlines()))
+ self.assertEqual(str(make_header(decode_header(s))),
+ '"Müller T" <T.Mueller@xxx.com>')
+
# Test the MIMEMessage class
class TestMIMEMessage(TestEmailBase):
@@ -2552,6 +2681,13 @@ class TestMiscellaneous(TestEmailBase):
for subpart in msg.walk():
unless(isinstance(subpart, MyMessage))
+ def test_custom_message_does_not_require_arguments(self):
+ class MyMessage(Message):
+ def __init__(self):
+ super().__init__()
+ msg = self._str_msg("Subject: test\n\ntest", MyMessage)
+ self.assertTrue(isinstance(msg, MyMessage))
+
def test__all__(self):
module = __import__('email')
self.assertEqual(sorted(module.__all__), [
@@ -2582,8 +2718,17 @@ class TestMiscellaneous(TestEmailBase):
utils.formatdate(now, localtime=False, usegmt=True),
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(now)))
- def test_parsedate_none(self):
- self.assertEqual(utils.parsedate(''), None)
+ # parsedate and parsedate_tz will become deprecated interfaces someday
+ def test_parsedate_returns_None_for_invalid_strings(self):
+ self.assertIsNone(utils.parsedate(''))
+ self.assertIsNone(utils.parsedate_tz(''))
+ self.assertIsNone(utils.parsedate('0'))
+ self.assertIsNone(utils.parsedate_tz('0'))
+ self.assertIsNone(utils.parsedate('A Complete Waste of Time'))
+ self.assertIsNone(utils.parsedate_tz('A Complete Waste of Time'))
+ # Not a part of the spec but, but this has historically worked:
+ self.assertIsNone(utils.parsedate(None))
+ self.assertIsNone(utils.parsedate_tz(None))
def test_parsedate_compact(self):
# The FWS after the comma is optional
@@ -2610,6 +2755,13 @@ class TestMiscellaneous(TestEmailBase):
(2002, 4, 3, 14, 58, 26, 0, 1, -1, -28800))
+ def test_parsedate_accepts_time_with_dots(self):
+ eq = self.assertEqual
+ eq(utils.parsedate_tz('5 Feb 2003 13.47.26 -0800'),
+ (2003, 2, 5, 13, 47, 26, 0, 1, -1, -28800))
+ eq(utils.parsedate_tz('5 Feb 2003 13.47 -0800'),
+ (2003, 2, 5, 13, 47, 0, 0, 1, -1, -28800))
+
def test_parsedate_acceptable_to_time_functions(self):
eq = self.assertEqual
timetup = utils.parsedate('5 Feb 2003 13:47:26 -0800')
@@ -2652,7 +2804,10 @@ class TestMiscellaneous(TestEmailBase):
def test_escape_dump(self):
self.assertEqual(
utils.formataddr(('A (Very) Silly Person', 'person@dom.ain')),
- r'"A \(Very\) Silly Person" <person@dom.ain>')
+ r'"A (Very) Silly Person" <person@dom.ain>')
+ self.assertEqual(
+ utils.parseaddr(r'"A \(Very\) Silly Person" <person@dom.ain>'),
+ ('A (Very) Silly Person', 'person@dom.ain'))
a = r'A \(Special\) Person'
b = 'person@dom.ain'
self.assertEqual(utils.parseaddr(utils.formataddr((a, b))), (a, b))
@@ -2665,6 +2820,46 @@ class TestMiscellaneous(TestEmailBase):
b = 'person@dom.ain'
self.assertEqual(utils.parseaddr(utils.formataddr((a, b))), (a, b))
+ def test_quotes_unicode_names(self):
+ # issue 1690608. email.utils.formataddr() should be rfc2047 aware.
+ name = "H\u00e4ns W\u00fcrst"
+ addr = 'person@dom.ain'
+ utf8_base64 = "=?utf-8?b?SMOkbnMgV8O8cnN0?= <person@dom.ain>"
+ latin1_quopri = "=?iso-8859-1?q?H=E4ns_W=FCrst?= <person@dom.ain>"
+ self.assertEqual(utils.formataddr((name, addr)), utf8_base64)
+ self.assertEqual(utils.formataddr((name, addr), 'iso-8859-1'),
+ latin1_quopri)
+
+ def test_accepts_any_charset_like_object(self):
+ # issue 1690608. email.utils.formataddr() should be rfc2047 aware.
+ name = "H\u00e4ns W\u00fcrst"
+ addr = 'person@dom.ain'
+ utf8_base64 = "=?utf-8?b?SMOkbnMgV8O8cnN0?= <person@dom.ain>"
+ foobar = "FOOBAR"
+ class CharsetMock:
+ def header_encode(self, string):
+ return foobar
+ mock = CharsetMock()
+ mock_expected = "%s <%s>" % (foobar, addr)
+ self.assertEqual(utils.formataddr((name, addr), mock), mock_expected)
+ self.assertEqual(utils.formataddr((name, addr), Charset('utf-8')),
+ utf8_base64)
+
+ def test_invalid_charset_like_object_raises_error(self):
+ # issue 1690608. email.utils.formataddr() should be rfc2047 aware.
+ name = "H\u00e4ns W\u00fcrst"
+ addr = 'person@dom.ain'
+ # A object without a header_encode method:
+ bad_charset = object()
+ self.assertRaises(AttributeError, utils.formataddr, (name, addr),
+ bad_charset)
+
+ def test_unicode_address_raises_error(self):
+ # issue 1690608. email.utils.formataddr() should be rfc2047 aware.
+ addr = 'pers\u00f6n@dom.in'
+ self.assertRaises(UnicodeError, utils.formataddr, (None, addr))
+ self.assertRaises(UnicodeError, utils.formataddr, ("Name", addr))
+
def test_name_with_dot(self):
x = 'John X. Doe <jxd@example.com>'
y = '"John X. Doe" <jxd@example.com>'
@@ -2710,6 +2905,15 @@ class TestMiscellaneous(TestEmailBase):
self.assertEqual(('', 'merwok.wok.wok@xample.com'),
utils.parseaddr('merwok. wok . wok@xample.com'))
+ def test_formataddr_does_not_quote_parens_in_quoted_string(self):
+ addr = ("'foo@example.com' (foo@example.com)",
+ 'foo@example.com')
+ addrstr = ('"\'foo@example.com\' '
+ '(foo@example.com)" <foo@example.com>')
+ self.assertEqual(utils.parseaddr(addrstr), addr)
+ self.assertEqual(utils.formataddr(addr), addrstr)
+
+
def test_multiline_from_comment(self):
x = """\
Foo
@@ -2945,6 +3149,7 @@ Do you like this message?
class TestParsers(TestEmailBase):
+
def test_header_parser(self):
eq = self.assertEqual
# Parse only the headers of a complex multipart MIME document
@@ -2956,6 +3161,18 @@ class TestParsers(TestEmailBase):
self.assertFalse(msg.is_multipart())
self.assertTrue(isinstance(msg.get_payload(), str))
+ def test_bytes_header_parser(self):
+ eq = self.assertEqual
+ # Parse only the headers of a complex multipart MIME document
+ with openfile('msg_02.txt', 'rb') as fp:
+ msg = email.parser.BytesHeaderParser().parse(fp)
+ eq(msg['from'], 'ppp-request@zzz.org')
+ eq(msg['to'], 'ppp@zzz.org')
+ eq(msg.get_content_type(), 'multipart/mixed')
+ self.assertFalse(msg.is_multipart())
+ self.assertTrue(isinstance(msg.get_payload(), str))
+ self.assertTrue(isinstance(msg.get_payload(decode=True), bytes))
+
def test_whitespace_continuation(self):
eq = self.assertEqual
# This message contains a line after the Subject: header that has only
@@ -3178,15 +3395,19 @@ class Test8BitBytesHandling(unittest.TestCase):
self.assertEqual(msg.get_payload(decode=True),
'pöstál\n'.encode('utf-8'))
+ # test_defect_handling:test_invalid_chars_in_base64_payload
def test_8bit_in_base64_body(self):
- # Sticking an 8bit byte in a base64 block makes it undecodable by
- # normal means, so the block is returned undecoded, but as bytes.
+ # If we get 8bit bytes in a base64 body, we can just ignore them
+ # as being outside the base64 alphabet and decode anyway. But
+ # we register a defect.
m = self.bodytest_msg.format(charset='utf-8',
cte='base64',
bodyline='cMO2c3RhbAá=').encode('utf-8')
msg = email.message_from_bytes(m)
self.assertEqual(msg.get_payload(decode=True),
- 'cMO2c3RhbAá=\n'.encode('utf-8'))
+ 'pöstal'.encode('utf-8'))
+ self.assertIsInstance(msg.defects[0],
+ errors.InvalidBase64CharactersDefect)
def test_8bit_in_uuencode_body(self):
# Sticking an 8bit byte in a uuencode block makes it undecodable by
@@ -3267,6 +3488,7 @@ class Test8BitBytesHandling(unittest.TestCase):
self.assertEqual(msg.get_content_maintype(), "text")
self.assertEqual(msg.get_content_subtype(), "pl\uFFFDin")
+ # test_headerregistry.TestContentTypeHeader.non_ascii_in_params
def test_get_params_with_8bit(self):
msg = email.message_from_bytes(
'X-Header: foo=\xa7ne; b\xa7r=two; baz=three\n'.encode('latin-1'))
@@ -3276,6 +3498,7 @@ class Test8BitBytesHandling(unittest.TestCase):
# XXX: someday you might be able to get 'b\xa7r', for now you can't.
self.assertEqual(msg.get_param('b\xa7r', header='x-header'), None)
+ # test_headerregistry.TestContentTypeHeader.non_ascii_in_rfc2231_value
def test_get_rfc2231_params_with_8bit(self):
msg = email.message_from_bytes(textwrap.dedent("""\
Content-Type: text/plain; charset=us-ascii;
@@ -3521,12 +3744,7 @@ class BaseTestBytesGeneratorIdempotent:
b = BytesIO()
g = email.generator.BytesGenerator(b, maxheaderlen=0)
g.flatten(msg, unixfrom=unixfrom, linesep=self.linesep)
- self.assertByteStringsEqual(data, b.getvalue())
-
- def assertByteStringsEqual(self, str1, str2):
- # Not using self.blinesep here is intentional. This way the output
- # is more useful when the failure results in mixed line endings.
- self.assertListEqual(str1.split(b'\n'), str2.split(b'\n'))
+ self.assertEqual(data, b.getvalue())
class TestBytesGeneratorIdempotentNL(BaseTestBytesGeneratorIdempotent,
@@ -4292,11 +4510,11 @@ A very long line that must get split to something other than at the
h = make_header(decode_header(s))
eq(h.encode(), s)
- def test_whitespace_eater(self):
+ def test_whitespace_keeper(self):
eq = self.assertEqual
s = 'Subject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztk=?= =?koi8-r?q?=CA?= zz.'
parts = decode_header(s)
- eq(parts, [(b'Subject:', None), (b'\xf0\xd2\xcf\xd7\xc5\xd2\xcb\xc1 \xce\xc1 \xc6\xc9\xce\xc1\xcc\xd8\xce\xd9\xca', 'koi8-r'), (b'zz.', None)])
+ eq(parts, [(b'Subject: ', None), (b'\xf0\xd2\xcf\xd7\xc5\xd2\xcb\xc1 \xce\xc1 \xc6\xc9\xce\xc1\xcc\xd8\xce\xd9\xca', 'koi8-r'), (b' zz.', None)])
hdr = make_header(parts)
eq(hdr.encode(),
'Subject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztnK?= zz.')
@@ -4326,6 +4544,9 @@ A very long line that must get split to something other than at the
# Test RFC 2231 header parameters (en/de)coding
class TestRFC2231(TestEmailBase):
+
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_with_double_quotes
+ # test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_inside_double_quotes
def test_get_param(self):
eq = self.assertEqual
msg = self._msgobj('msg_29.txt')
@@ -4411,11 +4632,15 @@ Do you like this message?
-Me
""")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_charset
+ # I changed the charset name, though, because the one in the file isn't
+ # a legal charset name. Should add a test for an illegal charset.
def test_rfc2231_get_content_charset(self):
eq = self.assertEqual
msg = self._msgobj('msg_32.txt')
eq(msg.get_content_charset(), 'us-ascii')
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_no_double_quotes
def test_rfc2231_parse_rfc_quoting(self):
m = textwrap.dedent('''\
Content-Disposition: inline;
@@ -4429,6 +4654,7 @@ Do you like this message?
'This is even more ***fun*** is it not.pdf')
self.assertEqual(m, msg.as_string())
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_with_double_quotes
def test_rfc2231_parse_extra_quoting(self):
m = textwrap.dedent('''\
Content-Disposition: inline;
@@ -4442,6 +4668,9 @@ Do you like this message?
'This is even more ***fun*** is it not.pdf')
self.assertEqual(m, msg.as_string())
+ # test_headerregistry.TestContentTypeHeader.rfc2231_no_language_or_charset
+ # but new test uses *0* because otherwise lang/charset is not valid.
+ # test_headerregistry.TestContentTypeHeader.rfc2231_segmented_normal_values
def test_rfc2231_no_language_or_charset(self):
m = '''\
Content-Transfer-Encoding: 8bit
@@ -4456,6 +4685,7 @@ Content-Type: text/html; NAME*0=file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOC
param,
'file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEMP_nsmail.htm')
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_no_charset
def test_rfc2231_no_language_or_charset_in_filename(self):
m = '''\
Content-Disposition: inline;
@@ -4468,6 +4698,7 @@ Content-Disposition: inline;
self.assertEqual(msg.get_filename(),
'This is even more ***fun*** is it not.pdf')
+ # Duplicate of previous test?
def test_rfc2231_no_language_or_charset_in_filename_encoded(self):
m = '''\
Content-Disposition: inline;
@@ -4480,6 +4711,8 @@ Content-Disposition: inline;
self.assertEqual(msg.get_filename(),
'This is even more ***fun*** is it not.pdf')
+ # test_headerregistry.TestContentTypeHeader.rfc2231_partly_encoded,
+ # but the test below is wrong (the first part should be decoded).
def test_rfc2231_partly_encoded(self):
m = '''\
Content-Disposition: inline;
@@ -4531,6 +4764,7 @@ Content-Type: text/plain;
self.assertEqual(msg.get_content_charset(),
'this is even more ***fun*** is it not.pdf')
+ # test_headerregistry.TestContentTypeHeader.rfc2231_unknown_charset_treated_as_ascii
def test_rfc2231_bad_encoding_in_filename(self):
m = '''\
Content-Disposition: inline;
@@ -4597,6 +4831,7 @@ Content-Type: application/x-foo;
eq(language, None)
eq(s, "Frank's Document")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_inside_double_quotes
def test_rfc2231_single_tick_in_filename(self):
m = """\
Content-Type: application/x-foo; name*0=\"Frank's\"; name*1=\" Document\"
@@ -4607,6 +4842,7 @@ Content-Type: application/x-foo; name*0=\"Frank's\"; name*1=\" Document\"
self.assertFalse(isinstance(param, tuple))
self.assertEqual(param, "Frank's Document")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_in_value_with_charset_and_lang
def test_rfc2231_tick_attack_extended(self):
eq = self.assertEqual
m = """\
@@ -4620,6 +4856,7 @@ Content-Type: application/x-foo;
eq(language, 'en-us')
eq(s, "Frank's Document")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_single_quote_in_non_encoded_value
def test_rfc2231_tick_attack(self):
m = """\
Content-Type: application/x-foo;
@@ -4631,6 +4868,7 @@ Content-Type: application/x-foo;
self.assertFalse(isinstance(param, tuple))
self.assertEqual(param, "us-ascii'en-us'Frank's Document")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_single_quotes_inside_quotes
def test_rfc2231_no_extended_values(self):
eq = self.assertEqual
m = """\
@@ -4640,6 +4878,7 @@ Content-Type: application/x-foo; name=\"Frank's Document\"
msg = email.message_from_string(m)
eq(msg.get_param('name'), "Frank's Document")
+ # test_headerregistry.TestContentTypeHeader.rfc2231_encoded_then_unencoded_segments
def test_rfc2231_encoded_then_unencoded_segments(self):
eq = self.assertEqual
m = """\
@@ -4655,6 +4894,8 @@ Content-Type: application/x-foo;
eq(language, 'en-us')
eq(s, 'My Document For You')
+ # test_headerregistry.TestContentTypeHeader.rfc2231_unencoded_then_encoded_segments
+ # test_headerregistry.TestContentTypeHeader.rfc2231_quoted_unencoded_then_encoded_segments
def test_rfc2231_unencoded_then_encoded_segments(self):
eq = self.assertEqual
m = """\
@@ -4678,7 +4919,7 @@ Content-Type: application/x-foo;
class TestSigned(TestEmailBase):
def _msg_and_obj(self, filename):
- with openfile(findfile(filename)) as fp:
+ with openfile(filename) as fp:
original = fp.read()
msg = email.message_from_string(original)
return original, msg
@@ -4710,23 +4951,5 @@ class TestSigned(TestEmailBase):
-def _testclasses():
- mod = sys.modules[__name__]
- return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
-
-
-def suite():
- suite = unittest.TestSuite()
- for testclass in _testclasses():
- suite.addTest(unittest.makeSuite(testclass))
- return suite
-
-
-def test_main():
- for testclass in _testclasses():
- run_unittest(testclass)
-
-
-
if __name__ == '__main__':
- unittest.main(defaultTest='suite')
+ unittest.main()
diff --git a/Lib/test/test_email/test_generator.py b/Lib/test/test_email/test_generator.py
new file mode 100644
index 0000000..8917408
--- /dev/null
+++ b/Lib/test/test_email/test_generator.py
@@ -0,0 +1,199 @@
+import io
+import textwrap
+import unittest
+from email import message_from_string, message_from_bytes
+from email.generator import Generator, BytesGenerator
+from email import policy
+from test.test_email import TestEmailBase, parameterize
+
+
+@parameterize
+class TestGeneratorBase:
+
+ policy = policy.default
+
+ def msgmaker(self, msg, policy=None):
+ policy = self.policy if policy is None else policy
+ return self.msgfunc(msg, policy=policy)
+
+ refold_long_expected = {
+ 0: textwrap.dedent("""\
+ To: whom_it_may_concern@example.com
+ From: nobody_you_want_to_know@example.com
+ Subject: We the willing led by the unknowing are doing the
+ impossible for the ungrateful. We have done so much for so long with so little
+ we are now qualified to do anything with nothing.
+
+ None
+ """),
+ # From is wrapped because wrapped it fits in 40.
+ 40: textwrap.dedent("""\
+ To: whom_it_may_concern@example.com
+ From:
+ nobody_you_want_to_know@example.com
+ Subject: We the willing led by the
+ unknowing are doing the impossible for
+ the ungrateful. We have done so much
+ for so long with so little we are now
+ qualified to do anything with nothing.
+
+ None
+ """),
+ # Neither to nor from fit even if put on a new line,
+ # so we leave them sticking out on the first line.
+ 20: textwrap.dedent("""\
+ To: whom_it_may_concern@example.com
+ From: nobody_you_want_to_know@example.com
+ Subject: We the
+ willing led by the
+ unknowing are doing
+ the impossible for
+ the ungrateful. We
+ have done so much
+ for so long with so
+ little we are now
+ qualified to do
+ anything with
+ nothing.
+
+ None
+ """),
+ }
+ refold_long_expected[100] = refold_long_expected[0]
+
+ refold_all_expected = refold_long_expected.copy()
+ refold_all_expected[0] = (
+ "To: whom_it_may_concern@example.com\n"
+ "From: nobody_you_want_to_know@example.com\n"
+ "Subject: We the willing led by the unknowing are doing the "
+ "impossible for the ungrateful. We have done so much for "
+ "so long with so little we are now qualified to do anything "
+ "with nothing.\n"
+ "\n"
+ "None\n")
+ refold_all_expected[100] = (
+ "To: whom_it_may_concern@example.com\n"
+ "From: nobody_you_want_to_know@example.com\n"
+ "Subject: We the willing led by the unknowing are doing the "
+ "impossible for the ungrateful. We have\n"
+ " done so much for so long with so little we are now qualified "
+ "to do anything with nothing.\n"
+ "\n"
+ "None\n")
+
+ length_params = [n for n in refold_long_expected]
+
+ def length_as_maxheaderlen_parameter(self, n):
+ msg = self.msgmaker(self.typ(self.refold_long_expected[0]))
+ s = self.ioclass()
+ g = self.genclass(s, maxheaderlen=n, policy=self.policy)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(self.refold_long_expected[n]))
+
+ def length_as_max_line_length_policy(self, n):
+ msg = self.msgmaker(self.typ(self.refold_long_expected[0]))
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(max_line_length=n))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(self.refold_long_expected[n]))
+
+ def length_as_maxheaderlen_parm_overrides_policy(self, n):
+ msg = self.msgmaker(self.typ(self.refold_long_expected[0]))
+ s = self.ioclass()
+ g = self.genclass(s, maxheaderlen=n,
+ policy=self.policy.clone(max_line_length=10))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(self.refold_long_expected[n]))
+
+ def length_as_max_line_length_with_refold_none_does_not_fold(self, n):
+ msg = self.msgmaker(self.typ(self.refold_long_expected[0]))
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(refold_source='none',
+ max_line_length=n))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(self.refold_long_expected[0]))
+
+ def length_as_max_line_length_with_refold_all_folds(self, n):
+ msg = self.msgmaker(self.typ(self.refold_long_expected[0]))
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(refold_source='all',
+ max_line_length=n))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(self.refold_all_expected[n]))
+
+ def test_crlf_control_via_policy(self):
+ source = "Subject: test\r\n\r\ntest body\r\n"
+ expected = source
+ msg = self.msgmaker(self.typ(source))
+ s = self.ioclass()
+ g = self.genclass(s, policy=policy.SMTP)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+ def test_flatten_linesep_overrides_policy(self):
+ source = "Subject: test\n\ntest body\n"
+ expected = source
+ msg = self.msgmaker(self.typ(source))
+ s = self.ioclass()
+ g = self.genclass(s, policy=policy.SMTP)
+ g.flatten(msg, linesep='\n')
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+
+class TestGenerator(TestGeneratorBase, TestEmailBase):
+
+ msgfunc = staticmethod(message_from_string)
+ genclass = Generator
+ ioclass = io.StringIO
+ typ = str
+
+
+class TestBytesGenerator(TestGeneratorBase, TestEmailBase):
+
+ msgfunc = staticmethod(message_from_bytes)
+ genclass = BytesGenerator
+ ioclass = io.BytesIO
+ typ = lambda self, x: x.encode('ascii')
+
+ def test_cte_type_7bit_handles_unknown_8bit(self):
+ source = ("Subject: Maintenant je vous présente mon "
+ "collègue\n\n").encode('utf-8')
+ expected = ('Subject: Maintenant je vous =?unknown-8bit?q?'
+ 'pr=C3=A9sente_mon_coll=C3=A8gue?=\n\n').encode('ascii')
+ msg = message_from_bytes(source)
+ s = io.BytesIO()
+ g = BytesGenerator(s, policy=self.policy.clone(cte_type='7bit'))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), expected)
+
+ def test_cte_type_7bit_transforms_8bit_cte(self):
+ source = textwrap.dedent("""\
+ From: foo@bar.com
+ To: Dinsdale
+ Subject: Nudge nudge, wink, wink
+ Mime-Version: 1.0
+ Content-Type: text/plain; charset="latin-1"
+ Content-Transfer-Encoding: 8bit
+
+ oh là là, know what I mean, know what I mean?
+ """).encode('latin1')
+ msg = message_from_bytes(source)
+ expected = textwrap.dedent("""\
+ From: foo@bar.com
+ To: Dinsdale
+ Subject: Nudge nudge, wink, wink
+ Mime-Version: 1.0
+ Content-Type: text/plain; charset="iso-8859-1"
+ Content-Transfer-Encoding: quoted-printable
+
+ oh l=E0 l=E0, know what I mean, know what I mean?
+ """).encode('ascii')
+ s = io.BytesIO()
+ g = BytesGenerator(s, policy=self.policy.clone(cte_type='7bit',
+ linesep='\n'))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), expected)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py
new file mode 100644
index 0000000..eba81f2
--- /dev/null
+++ b/Lib/test/test_email/test_headerregistry.py
@@ -0,0 +1,1515 @@
+import datetime
+import textwrap
+import unittest
+from email import errors
+from email import policy
+from email.message import Message
+from test.test_email import TestEmailBase, parameterize
+from email import headerregistry
+from email.headerregistry import Address, Group
+
+
+DITTO = object()
+
+
+class TestHeaderRegistry(TestEmailBase):
+
+ def test_arbitrary_name_unstructured(self):
+ factory = headerregistry.HeaderRegistry()
+ h = factory('foobar', 'test')
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+ self.assertIsInstance(h, headerregistry.UnstructuredHeader)
+
+ def test_name_case_ignored(self):
+ factory = headerregistry.HeaderRegistry()
+ # Whitebox check that test is valid
+ self.assertNotIn('Subject', factory.registry)
+ h = factory('Subject', 'test')
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+ self.assertIsInstance(h, headerregistry.UniqueUnstructuredHeader)
+
+ class FooBase:
+ def __init__(self, *args, **kw):
+ pass
+
+ def test_override_default_base_class(self):
+ factory = headerregistry.HeaderRegistry(base_class=self.FooBase)
+ h = factory('foobar', 'test')
+ self.assertIsInstance(h, self.FooBase)
+ self.assertIsInstance(h, headerregistry.UnstructuredHeader)
+
+ class FooDefault:
+ parse = headerregistry.UnstructuredHeader.parse
+
+ def test_override_default_class(self):
+ factory = headerregistry.HeaderRegistry(default_class=self.FooDefault)
+ h = factory('foobar', 'test')
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+ self.assertIsInstance(h, self.FooDefault)
+
+ def test_override_default_class_only_overrides_default(self):
+ factory = headerregistry.HeaderRegistry(default_class=self.FooDefault)
+ h = factory('subject', 'test')
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+ self.assertIsInstance(h, headerregistry.UniqueUnstructuredHeader)
+
+ def test_dont_use_default_map(self):
+ factory = headerregistry.HeaderRegistry(use_default_map=False)
+ h = factory('subject', 'test')
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+ self.assertIsInstance(h, headerregistry.UnstructuredHeader)
+
+ def test_map_to_type(self):
+ factory = headerregistry.HeaderRegistry()
+ h1 = factory('foobar', 'test')
+ factory.map_to_type('foobar', headerregistry.UniqueUnstructuredHeader)
+ h2 = factory('foobar', 'test')
+ self.assertIsInstance(h1, headerregistry.BaseHeader)
+ self.assertIsInstance(h1, headerregistry.UnstructuredHeader)
+ self.assertIsInstance(h2, headerregistry.BaseHeader)
+ self.assertIsInstance(h2, headerregistry.UniqueUnstructuredHeader)
+
+
+class TestHeaderBase(TestEmailBase):
+
+ factory = headerregistry.HeaderRegistry()
+
+ def make_header(self, name, value):
+ return self.factory(name, value)
+
+
+class TestBaseHeaderFeatures(TestHeaderBase):
+
+ def test_str(self):
+ h = self.make_header('subject', 'this is a test')
+ self.assertIsInstance(h, str)
+ self.assertEqual(h, 'this is a test')
+ self.assertEqual(str(h), 'this is a test')
+
+ def test_substr(self):
+ h = self.make_header('subject', 'this is a test')
+ self.assertEqual(h[5:7], 'is')
+
+ def test_has_name(self):
+ h = self.make_header('subject', 'this is a test')
+ self.assertEqual(h.name, 'subject')
+
+ def _test_attr_ro(self, attr):
+ h = self.make_header('subject', 'this is a test')
+ with self.assertRaises(AttributeError):
+ setattr(h, attr, 'foo')
+
+ def test_name_read_only(self):
+ self._test_attr_ro('name')
+
+ def test_defects_read_only(self):
+ self._test_attr_ro('defects')
+
+ def test_defects_is_tuple(self):
+ h = self.make_header('subject', 'this is a test')
+ self.assertEqual(len(h.defects), 0)
+ self.assertIsInstance(h.defects, tuple)
+ # Make sure it is still true when there are defects.
+ h = self.make_header('date', '')
+ self.assertEqual(len(h.defects), 1)
+ self.assertIsInstance(h.defects, tuple)
+
+ # XXX: FIXME
+ #def test_CR_in_value(self):
+ # # XXX: this also re-raises the issue of embedded headers,
+ # # need test and solution for that.
+ # value = '\r'.join(['this is', ' a test'])
+ # h = self.make_header('subject', value)
+ # self.assertEqual(h, value)
+ # self.assertDefectsEqual(h.defects, [errors.ObsoleteHeaderDefect])
+
+ def test_RFC2047_value_decoded(self):
+ value = '=?utf-8?q?this_is_a_test?='
+ h = self.make_header('subject', value)
+ self.assertEqual(h, 'this is a test')
+
+
+class TestDateHeader(TestHeaderBase):
+
+ datestring = 'Sun, 23 Sep 2001 20:10:55 -0700'
+ utcoffset = datetime.timedelta(hours=-7)
+ tz = datetime.timezone(utcoffset)
+ dt = datetime.datetime(2001, 9, 23, 20, 10, 55, tzinfo=tz)
+
+ def test_parse_date(self):
+ h = self.make_header('date', self.datestring)
+ self.assertEqual(h, self.datestring)
+ self.assertEqual(h.datetime, self.dt)
+ self.assertEqual(h.datetime.utcoffset(), self.utcoffset)
+ self.assertEqual(h.defects, ())
+
+ def test_set_from_datetime(self):
+ h = self.make_header('date', self.dt)
+ self.assertEqual(h, self.datestring)
+ self.assertEqual(h.datetime, self.dt)
+ self.assertEqual(h.defects, ())
+
+ def test_date_header_properties(self):
+ h = self.make_header('date', self.datestring)
+ self.assertIsInstance(h, headerregistry.UniqueDateHeader)
+ self.assertEqual(h.max_count, 1)
+ self.assertEqual(h.defects, ())
+
+ def test_resent_date_header_properties(self):
+ h = self.make_header('resent-date', self.datestring)
+ self.assertIsInstance(h, headerregistry.DateHeader)
+ self.assertEqual(h.max_count, None)
+ self.assertEqual(h.defects, ())
+
+ def test_no_value_is_defect(self):
+ h = self.make_header('date', '')
+ self.assertEqual(len(h.defects), 1)
+ self.assertIsInstance(h.defects[0], errors.HeaderMissingRequiredValue)
+
+ def test_datetime_read_only(self):
+ h = self.make_header('date', self.datestring)
+ with self.assertRaises(AttributeError):
+ h.datetime = 'foo'
+
+ def test_set_date_header_from_datetime(self):
+ m = Message(policy=policy.default)
+ m['Date'] = self.dt
+ self.assertEqual(m['Date'], self.datestring)
+ self.assertEqual(m['Date'].datetime, self.dt)
+
+
+@parameterize
+class TestContentTypeHeader(TestHeaderBase):
+
+ def content_type_as_value(self,
+ source,
+ content_type,
+ maintype,
+ subtype,
+ *args):
+ l = len(args)
+ parmdict = args[0] if l>0 else {}
+ defects = args[1] if l>1 else []
+ decoded = args[2] if l>2 and args[2] is not DITTO else source
+ header = 'Content-Type:' + ' ' if source else ''
+ folded = args[3] if l>3 else header + source + '\n'
+ h = self.make_header('Content-Type', source)
+ self.assertEqual(h.content_type, content_type)
+ self.assertEqual(h.maintype, maintype)
+ self.assertEqual(h.subtype, subtype)
+ self.assertEqual(h.params, parmdict)
+ self.assertDefectsEqual(h.defects, defects)
+ self.assertEqual(h, decoded)
+ self.assertEqual(h.fold(policy=policy.default), folded)
+
+ content_type_params = {
+
+ # Examples from RFC 2045.
+
+ 'RFC_2045_1': (
+ 'text/plain; charset=us-ascii (Plain text)',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'us-ascii'},
+ [],
+ 'text/plain; charset="us-ascii"'),
+
+ 'RFC_2045_2': (
+ 'text/plain; charset=us-ascii',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'us-ascii'},
+ [],
+ 'text/plain; charset="us-ascii"'),
+
+ 'RFC_2045_3': (
+ 'text/plain; charset="us-ascii"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'us-ascii'}),
+
+ # RFC 2045 5.2 says syntactically invalid values are to be treated as
+ # text/plain.
+
+ 'no_subtype_in_content_type': (
+ 'text/',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {},
+ [errors.InvalidHeaderDefect]),
+
+ 'no_slash_in_content_type': (
+ 'foo',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {},
+ [errors.InvalidHeaderDefect]),
+
+ 'junk_text_in_content_type': (
+ '<crazy "stuff">',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {},
+ [errors.InvalidHeaderDefect]),
+
+ 'too_many_slashes_in_content_type': (
+ 'image/jpeg/foo',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {},
+ [errors.InvalidHeaderDefect]),
+
+ # But unknown names are OK. We could make non-IANA names a defect, but
+ # by not doing so we make ourselves future proof. The fact that they
+ # are unknown will be detectable by the fact that they don't appear in
+ # the mime_registry...and the application is free to extend that list
+ # to handle them even if the core library doesn't.
+
+ 'unknown_content_type': (
+ 'bad/names',
+ 'bad/names',
+ 'bad',
+ 'names'),
+
+ # The content type is case insensitive, and CFWS is ignored.
+
+ 'mixed_case_content_type': (
+ 'ImAge/JPeg',
+ 'image/jpeg',
+ 'image',
+ 'jpeg'),
+
+ 'spaces_in_content_type': (
+ ' text / plain ',
+ 'text/plain',
+ 'text',
+ 'plain'),
+
+ 'cfws_in_content_type': (
+ '(foo) text (bar)/(baz)plain(stuff)',
+ 'text/plain',
+ 'text',
+ 'plain'),
+
+ # test some parameters (more tests could be added for parameters
+ # associated with other content types, but since parameter parsing is
+ # generic they would be redundant for the current implementation).
+
+ 'charset_param': (
+ 'text/plain; charset="utf-8"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'utf-8'}),
+
+ 'capitalized_charset': (
+ 'text/plain; charset="US-ASCII"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'US-ASCII'}),
+
+ 'unknown_charset': (
+ 'text/plain; charset="fOo"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'fOo'}),
+
+ 'capitalized_charset_param_name_and_comment': (
+ 'text/plain; (interjection) Charset="utf-8"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'utf-8'},
+ [],
+ # Should the parameter name be lowercased here?
+ 'text/plain; Charset="utf-8"'),
+
+ # Since this is pretty much the ur-mimeheader, we'll put all the tests
+ # that exercise the parameter parsing and formatting here.
+ #
+ # XXX: question: is minimal quoting preferred?
+
+ 'unquoted_param_value': (
+ 'text/plain; title=foo',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'title': 'foo'},
+ [],
+ 'text/plain; title="foo"'),
+
+ 'param_value_with_tspecials': (
+ 'text/plain; title="(bar)foo blue"',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'title': '(bar)foo blue'}),
+
+ 'param_with_extra_quoted_whitespace': (
+ 'text/plain; title=" a loong way \t home "',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'title': ' a loong way \t home '}),
+
+ 'bad_params': (
+ 'blarg; baz; boo',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'baz': '', 'boo': ''},
+ [errors.InvalidHeaderDefect]*3),
+
+ 'spaces_around_param_equals': (
+ 'Multipart/mixed; boundary = "CPIMSSMTPC06p5f3tG"',
+ 'multipart/mixed',
+ 'multipart',
+ 'mixed',
+ {'boundary': 'CPIMSSMTPC06p5f3tG'},
+ [],
+ 'Multipart/mixed; boundary="CPIMSSMTPC06p5f3tG"'),
+
+ 'spaces_around_semis': (
+ ('image/jpeg; name="wibble.JPG" ; x-mac-type="4A504547" ; '
+ 'x-mac-creator="474B4F4E"'),
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'name': 'wibble.JPG',
+ 'x-mac-type': '4A504547',
+ 'x-mac-creator': '474B4F4E'},
+ [],
+ ('image/jpeg; name="wibble.JPG"; x-mac-type="4A504547"; '
+ 'x-mac-creator="474B4F4E"'),
+ # XXX: it could be that we will eventually prefer to fold starting
+ # from the decoded value, in which case these spaces and similar
+ # spaces in other tests will be wrong.
+ ('Content-Type: image/jpeg; name="wibble.JPG" ; '
+ 'x-mac-type="4A504547" ;\n'
+ ' x-mac-creator="474B4F4E"\n'),
+ ),
+
+ 'semis_inside_quotes': (
+ 'image/jpeg; name="Jim&amp;&amp;Jill"',
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'name': 'Jim&amp;&amp;Jill'}),
+
+ 'single_quotes_inside_quotes': (
+ 'image/jpeg; name="Jim \'Bob\' Jill"',
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'name': "Jim 'Bob' Jill"}),
+
+ 'double_quotes_inside_quotes': (
+ r'image/jpeg; name="Jim \"Bob\" Jill"',
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'name': 'Jim "Bob" Jill'},
+ [],
+ r'image/jpeg; name="Jim \"Bob\" Jill"'),
+
+ # XXX: This test works except for the refolding of the header. I'll
+ # deal with that bug when I deal with the other folding bugs.
+ #'non_ascii_in_params': (
+ # ('foo\xa7/bar; b\xa7r=two; '
+ # 'baz=thr\xa7e'.encode('latin-1').decode('us-ascii',
+ # 'surrogateescape')),
+ # 'foo\uFFFD/bar',
+ # 'foo\uFFFD',
+ # 'bar',
+ # {'b\uFFFDr': 'two', 'baz': 'thr\uFFFDe'},
+ # [errors.UndecodableBytesDefect]*3,
+ # 'foo�/bar; b�r="two"; baz="thr�e"',
+ # ),
+
+ # RFC 2231 parameter tests.
+
+ 'rfc2231_segmented_normal_values': (
+ 'image/jpeg; name*0="abc"; name*1=".html"',
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'name': "abc.html"},
+ [],
+ 'image/jpeg; name="abc.html"'),
+
+ 'quotes_inside_rfc2231_value': (
+ r'image/jpeg; bar*0="baz\"foobar"; bar*1="\"baz"',
+ 'image/jpeg',
+ 'image',
+ 'jpeg',
+ {'bar': 'baz"foobar"baz'},
+ [],
+ r'image/jpeg; bar="baz\"foobar\"baz"'),
+
+ # XXX: This test works except for the refolding of the header. I'll
+ # deal with that bug when I deal with the other folding bugs.
+ #'non_ascii_rfc2231_value': (
+ # ('text/plain; charset=us-ascii; '
+ # "title*=us-ascii'en'This%20is%20"
+ # 'not%20f\xa7n').encode('latin-1').decode('us-ascii',
+ # 'surrogateescape'),
+ # 'text/plain',
+ # 'text',
+ # 'plain',
+ # {'charset': 'us-ascii', 'title': 'This is not f\uFFFDn'},
+ # [errors.UndecodableBytesDefect],
+ # 'text/plain; charset="us-ascii"; title="This is not f�n"'),
+
+ 'rfc2231_encoded_charset': (
+ 'text/plain; charset*=ansi-x3.4-1968\'\'us-ascii',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'us-ascii'},
+ [],
+ 'text/plain; charset="us-ascii"'),
+
+ # This follows the RFC: no double quotes around encoded values.
+ 'rfc2231_encoded_no_double_quotes': (
+ ("text/plain;"
+ "\tname*0*=''This%20is%20;"
+ "\tname*1*=%2A%2A%2Afun%2A%2A%2A%20;"
+ '\tname*2="is it not.pdf"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'This is ***fun*** is it not.pdf'},
+ [],
+ 'text/plain; name="This is ***fun*** is it not.pdf"',
+ ('Content-Type: text/plain;\tname*0*=\'\'This%20is%20;\n'
+ '\tname*1*=%2A%2A%2Afun%2A%2A%2A%20;\tname*2="is it not.pdf"\n'),
+ ),
+
+ # Make sure we also handle it if there are spurrious double qoutes.
+ 'rfc2231_encoded_with_double_quotes': (
+ ("text/plain;"
+ '\tname*0*="us-ascii\'\'This%20is%20even%20more%20";'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";'
+ '\tname*2="is it not.pdf"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'This is even more ***fun*** is it not.pdf'},
+ [errors.InvalidHeaderDefect]*2,
+ 'text/plain; name="This is even more ***fun*** is it not.pdf"',
+ ('Content-Type: text/plain;\t'
+ 'name*0*="us-ascii\'\'This%20is%20even%20more%20";\n'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";\tname*2="is it not.pdf"\n'),
+ ),
+
+ 'rfc2231_single_quote_inside_double_quotes': (
+ ('text/plain; charset=us-ascii;'
+ '\ttitle*0*="us-ascii\'en\'This%20is%20really%20";'
+ '\ttitle*1*="%2A%2A%2Afun%2A%2A%2A%20";'
+ '\ttitle*2="isn\'t it!"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'us-ascii', 'title': "This is really ***fun*** isn't it!"},
+ [errors.InvalidHeaderDefect]*2,
+ ('text/plain; charset="us-ascii"; '
+ 'title="This is really ***fun*** isn\'t it!"'),
+ ('Content-Type: text/plain; charset=us-ascii;\n'
+ '\ttitle*0*="us-ascii\'en\'This%20is%20really%20";\n'
+ '\ttitle*1*="%2A%2A%2Afun%2A%2A%2A%20";\ttitle*2="isn\'t it!"\n'),
+ ),
+
+ 'rfc2231_single_quote_in_value_with_charset_and_lang': (
+ ('application/x-foo;'
+ "\tname*0*=\"us-ascii'en-us'Frank's\"; name*1*=\" Document\""),
+ 'application/x-foo',
+ 'application',
+ 'x-foo',
+ {'name': "Frank's Document"},
+ [errors.InvalidHeaderDefect]*2,
+ 'application/x-foo; name="Frank\'s Document"',
+ ('Content-Type: application/x-foo;\t'
+ 'name*0*="us-ascii\'en-us\'Frank\'s";\n'
+ ' name*1*=" Document"\n'),
+ ),
+
+ 'rfc2231_single_quote_in_non_encoded_value': (
+ ('application/x-foo;'
+ "\tname*0=\"us-ascii'en-us'Frank's\"; name*1=\" Document\""),
+ 'application/x-foo',
+ 'application',
+ 'x-foo',
+ {'name': "us-ascii'en-us'Frank's Document"},
+ [],
+ 'application/x-foo; name="us-ascii\'en-us\'Frank\'s Document"',
+ ('Content-Type: application/x-foo;\t'
+ 'name*0="us-ascii\'en-us\'Frank\'s";\n'
+ ' name*1=" Document"\n'),
+ ),
+
+ 'rfc2231_no_language_or_charset': (
+ 'text/plain; NAME*0*=english_is_the_default.html',
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'english_is_the_default.html'},
+ [errors.InvalidHeaderDefect],
+ 'text/plain; NAME="english_is_the_default.html"'),
+
+ 'rfc2231_encoded_no_charset': (
+ ("text/plain;"
+ '\tname*0*="\'\'This%20is%20even%20more%20";'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";'
+ '\tname*2="is it.pdf"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'This is even more ***fun*** is it.pdf'},
+ [errors.InvalidHeaderDefect]*2,
+ 'text/plain; name="This is even more ***fun*** is it.pdf"',
+ ('Content-Type: text/plain;\t'
+ 'name*0*="\'\'This%20is%20even%20more%20";\n'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";\tname*2="is it.pdf"\n'),
+ ),
+
+ # XXX: see below...the first name line here should be *0 not *0*.
+ 'rfc2231_partly_encoded': (
+ ("text/plain;"
+ '\tname*0*="\'\'This%20is%20even%20more%20";'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";'
+ '\tname*2="is it.pdf"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'This is even more ***fun*** is it.pdf'},
+ [errors.InvalidHeaderDefect]*2,
+ 'text/plain; name="This is even more ***fun*** is it.pdf"',
+ ('Content-Type: text/plain;\t'
+ 'name*0*="\'\'This%20is%20even%20more%20";\n'
+ '\tname*1*="%2A%2A%2Afun%2A%2A%2A%20";\tname*2="is it.pdf"\n'),
+ ),
+
+ 'rfc2231_partly_encoded_2': (
+ ("text/plain;"
+ '\tname*0*="\'\'This%20is%20even%20more%20";'
+ '\tname*1="%2A%2A%2Afun%2A%2A%2A%20";'
+ '\tname*2="is it.pdf"'),
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'This is even more %2A%2A%2Afun%2A%2A%2A%20is it.pdf'},
+ [errors.InvalidHeaderDefect],
+ 'text/plain; name="This is even more %2A%2A%2Afun%2A%2A%2A%20is it.pdf"',
+ ('Content-Type: text/plain;\t'
+ 'name*0*="\'\'This%20is%20even%20more%20";\n'
+ '\tname*1="%2A%2A%2Afun%2A%2A%2A%20";\tname*2="is it.pdf"\n'),
+ ),
+
+ 'rfc2231_unknown_charset_treated_as_ascii': (
+ "text/plain; name*0*=bogus'xx'ascii_is_the_default",
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'name': 'ascii_is_the_default'},
+ [],
+ 'text/plain; name="ascii_is_the_default"'),
+
+ 'rfc2231_bad_character_in_charset_parameter_value': (
+ "text/plain; charset*=ascii''utf-8%E2%80%9D",
+ 'text/plain',
+ 'text',
+ 'plain',
+ {'charset': 'utf-8\uFFFD\uFFFD\uFFFD'},
+ [errors.UndecodableBytesDefect],
+ 'text/plain; charset="utf-8\uFFFD\uFFFD\uFFFD"'),
+
+ 'rfc2231_encoded_then_unencoded_segments': (
+ ('application/x-foo;'
+ '\tname*0*="us-ascii\'en-us\'My";'
+ '\tname*1=" Document";'
+ '\tname*2=" For You"'),
+ 'application/x-foo',
+ 'application',
+ 'x-foo',
+ {'name': 'My Document For You'},
+ [errors.InvalidHeaderDefect],
+ 'application/x-foo; name="My Document For You"',
+ ('Content-Type: application/x-foo;\t'
+ 'name*0*="us-ascii\'en-us\'My";\n'
+ '\tname*1=" Document";\tname*2=" For You"\n'),
+ ),
+
+ # My reading of the RFC is that this is an invalid header. The RFC
+ # says that if charset and language information is given, the first
+ # segment *must* be encoded.
+ 'rfc2231_unencoded_then_encoded_segments': (
+ ('application/x-foo;'
+ '\tname*0=us-ascii\'en-us\'My;'
+ '\tname*1*=" Document";'
+ '\tname*2*=" For You"'),
+ 'application/x-foo',
+ 'application',
+ 'x-foo',
+ {'name': 'My Document For You'},
+ [errors.InvalidHeaderDefect]*3,
+ 'application/x-foo; name="My Document For You"',
+ ("Content-Type: application/x-foo;\tname*0=us-ascii'en-us'My;\t"
+ # XXX: the newline is in the wrong place, come back and fix
+ # this when the rest of tests pass.
+ 'name*1*=" Document"\n;'
+ '\tname*2*=" For You"\n'),
+ ),
+
+ # XXX: I would say this one should default to ascii/en for the
+ # "encoded" segment, since the the first segment is not encoded and is
+ # in double quotes, making the value a valid non-encoded string. The
+ # old parser decodes this just like the previous case, which may be the
+ # better Postel rule, but could equally result in borking headers that
+ # intentially have quoted quotes in them. We could get this 98% right
+ # if we treat it as a quoted string *unless* it matches the
+ # charset'lang'value pattern exactly *and* there is at least one
+ # encoded segment. Implementing that algorithm will require some
+ # refactoring, so I haven't done it (yet).
+
+ 'rfc2231_qouted_unencoded_then_encoded_segments': (
+ ('application/x-foo;'
+ '\tname*0="us-ascii\'en-us\'My";'
+ '\tname*1*=" Document";'
+ '\tname*2*=" For You"'),
+ 'application/x-foo',
+ 'application',
+ 'x-foo',
+ {'name': "us-ascii'en-us'My Document For You"},
+ [errors.InvalidHeaderDefect]*2,
+ 'application/x-foo; name="us-ascii\'en-us\'My Document For You"',
+ ('Content-Type: application/x-foo;\t'
+ 'name*0="us-ascii\'en-us\'My";\n'
+ '\tname*1*=" Document";\tname*2*=" For You"\n'),
+ ),
+
+ }
+
+
+@parameterize
+class TestContentTransferEncoding(TestHeaderBase):
+
+ def cte_as_value(self,
+ source,
+ cte,
+ *args):
+ l = len(args)
+ defects = args[0] if l>0 else []
+ decoded = args[1] if l>1 and args[1] is not DITTO else source
+ header = 'Content-Transfer-Encoding:' + ' ' if source else ''
+ folded = args[2] if l>2 else header + source + '\n'
+ h = self.make_header('Content-Transfer-Encoding', source)
+ self.assertEqual(h.cte, cte)
+ self.assertDefectsEqual(h.defects, defects)
+ self.assertEqual(h, decoded)
+ self.assertEqual(h.fold(policy=policy.default), folded)
+
+ cte_params = {
+
+ 'RFC_2183_1': (
+ 'base64',
+ 'base64',),
+
+ 'no_value': (
+ '',
+ '7bit',
+ [errors.HeaderMissingRequiredValue],
+ '',
+ 'Content-Transfer-Encoding:\n',
+ ),
+
+ 'junk_after_cte': (
+ '7bit and a bunch more',
+ '7bit',
+ [errors.InvalidHeaderDefect]),
+
+ }
+
+
+@parameterize
+class TestContentDisposition(TestHeaderBase):
+
+ def content_disp_as_value(self,
+ source,
+ content_disposition,
+ *args):
+ l = len(args)
+ parmdict = args[0] if l>0 else {}
+ defects = args[1] if l>1 else []
+ decoded = args[2] if l>2 and args[2] is not DITTO else source
+ header = 'Content-Disposition:' + ' ' if source else ''
+ folded = args[3] if l>3 else header + source + '\n'
+ h = self.make_header('Content-Disposition', source)
+ self.assertEqual(h.content_disposition, content_disposition)
+ self.assertEqual(h.params, parmdict)
+ self.assertDefectsEqual(h.defects, defects)
+ self.assertEqual(h, decoded)
+ self.assertEqual(h.fold(policy=policy.default), folded)
+
+ content_disp_params = {
+
+ # Examples from RFC 2183.
+
+ 'RFC_2183_1': (
+ 'inline',
+ 'inline',),
+
+ 'RFC_2183_2': (
+ ('attachment; filename=genome.jpeg;'
+ ' modification-date="Wed, 12 Feb 1997 16:29:51 -0500";'),
+ 'attachment',
+ {'filename': 'genome.jpeg',
+ 'modification-date': 'Wed, 12 Feb 1997 16:29:51 -0500'},
+ [],
+ ('attachment; filename="genome.jpeg"; '
+ 'modification-date="Wed, 12 Feb 1997 16:29:51 -0500"'),
+ ('Content-Disposition: attachment; filename=genome.jpeg;\n'
+ ' modification-date="Wed, 12 Feb 1997 16:29:51 -0500";\n'),
+ ),
+
+ 'no_value': (
+ '',
+ None,
+ {},
+ [errors.HeaderMissingRequiredValue],
+ '',
+ 'Content-Disposition:\n'),
+
+ 'invalid_value': (
+ 'ab./k',
+ 'ab.',
+ {},
+ [errors.InvalidHeaderDefect]),
+
+ 'invalid_value_with_params': (
+ 'ab./k; filename="foo"',
+ 'ab.',
+ {'filename': 'foo'},
+ [errors.InvalidHeaderDefect]),
+
+ }
+
+
+@parameterize
+class TestMIMEVersionHeader(TestHeaderBase):
+
+ def version_string_as_MIME_Version(self,
+ source,
+ decoded,
+ version,
+ major,
+ minor,
+ defects):
+ h = self.make_header('MIME-Version', source)
+ self.assertEqual(h, decoded)
+ self.assertEqual(h.version, version)
+ self.assertEqual(h.major, major)
+ self.assertEqual(h.minor, minor)
+ self.assertDefectsEqual(h.defects, defects)
+ if source:
+ source = ' ' + source
+ self.assertEqual(h.fold(policy=policy.default),
+ 'MIME-Version:' + source + '\n')
+
+ version_string_params = {
+
+ # Examples from the RFC.
+
+ 'RFC_2045_1': (
+ '1.0',
+ '1.0',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_2': (
+ '1.0 (produced by MetaSend Vx.x)',
+ '1.0 (produced by MetaSend Vx.x)',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_3': (
+ '(produced by MetaSend Vx.x) 1.0',
+ '(produced by MetaSend Vx.x) 1.0',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ 'RFC_2045_4': (
+ '1.(produced by MetaSend Vx.x)0',
+ '1.(produced by MetaSend Vx.x)0',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ # Other valid values.
+
+ '1_1': (
+ '1.1',
+ '1.1',
+ '1.1',
+ 1,
+ 1,
+ []),
+
+ '2_1': (
+ '2.1',
+ '2.1',
+ '2.1',
+ 2,
+ 1,
+ []),
+
+ 'whitespace': (
+ '1 .0',
+ '1 .0',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ 'leading_trailing_whitespace_ignored': (
+ ' 1.0 ',
+ ' 1.0 ',
+ '1.0',
+ 1,
+ 0,
+ []),
+
+ # Recoverable invalid values. We can recover here only because we
+ # already have a valid value by the time we encounter the garbage.
+ # Anywhere else, and we don't know where the garbage ends.
+
+ 'non_comment_garbage_after': (
+ '1.0 <abc>',
+ '1.0 <abc>',
+ '1.0',
+ 1,
+ 0,
+ [errors.InvalidHeaderDefect]),
+
+ # Unrecoverable invalid values. We *could* apply more heuristics to
+ # get someing out of the first two, but doing so is not worth the
+ # effort.
+
+ 'non_comment_garbage_before': (
+ '<abc> 1.0',
+ '<abc> 1.0',
+ None,
+ None,
+ None,
+ [errors.InvalidHeaderDefect]),
+
+ 'non_comment_garbage_inside': (
+ '1.<abc>0',
+ '1.<abc>0',
+ None,
+ None,
+ None,
+ [errors.InvalidHeaderDefect]),
+
+ 'two_periods': (
+ '1..0',
+ '1..0',
+ None,
+ None,
+ None,
+ [errors.InvalidHeaderDefect]),
+
+ '2_x': (
+ '2.x',
+ '2.x',
+ None, # This could be 2, but it seems safer to make it None.
+ None,
+ None,
+ [errors.InvalidHeaderDefect]),
+
+ 'foo': (
+ 'foo',
+ 'foo',
+ None,
+ None,
+ None,
+ [errors.InvalidHeaderDefect]),
+
+ 'missing': (
+ '',
+ '',
+ None,
+ None,
+ None,
+ [errors.HeaderMissingRequiredValue]),
+
+ }
+
+
+@parameterize
+class TestAddressHeader(TestHeaderBase):
+
+ example_params = {
+
+ 'empty':
+ ('<>',
+ [errors.InvalidHeaderDefect],
+ '<>',
+ '',
+ '<>',
+ '',
+ '',
+ None),
+
+ 'address_only':
+ ('zippy@pinhead.com',
+ [],
+ 'zippy@pinhead.com',
+ '',
+ 'zippy@pinhead.com',
+ 'zippy',
+ 'pinhead.com',
+ None),
+
+ 'name_and_address':
+ ('Zaphrod Beblebrux <zippy@pinhead.com>',
+ [],
+ 'Zaphrod Beblebrux <zippy@pinhead.com>',
+ 'Zaphrod Beblebrux',
+ 'zippy@pinhead.com',
+ 'zippy',
+ 'pinhead.com',
+ None),
+
+ 'quoted_local_part':
+ ('Zaphrod Beblebrux <"foo bar"@pinhead.com>',
+ [],
+ 'Zaphrod Beblebrux <"foo bar"@pinhead.com>',
+ 'Zaphrod Beblebrux',
+ '"foo bar"@pinhead.com',
+ 'foo bar',
+ 'pinhead.com',
+ None),
+
+ 'quoted_parens_in_name':
+ (r'"A \(Special\) Person" <person@dom.ain>',
+ [],
+ '"A (Special) Person" <person@dom.ain>',
+ 'A (Special) Person',
+ 'person@dom.ain',
+ 'person',
+ 'dom.ain',
+ None),
+
+ 'quoted_backslashes_in_name':
+ (r'"Arthur \\Backslash\\ Foobar" <person@dom.ain>',
+ [],
+ r'"Arthur \\Backslash\\ Foobar" <person@dom.ain>',
+ r'Arthur \Backslash\ Foobar',
+ 'person@dom.ain',
+ 'person',
+ 'dom.ain',
+ None),
+
+ 'name_with_dot':
+ ('John X. Doe <jxd@example.com>',
+ [errors.ObsoleteHeaderDefect],
+ '"John X. Doe" <jxd@example.com>',
+ 'John X. Doe',
+ 'jxd@example.com',
+ 'jxd',
+ 'example.com',
+ None),
+
+ 'quoted_strings_in_local_part':
+ ('""example" example"@example.com',
+ [errors.InvalidHeaderDefect]*3,
+ '"example example"@example.com',
+ '',
+ '"example example"@example.com',
+ 'example example',
+ 'example.com',
+ None),
+
+ 'escaped_quoted_strings_in_local_part':
+ (r'"\"example\" example"@example.com',
+ [],
+ r'"\"example\" example"@example.com',
+ '',
+ r'"\"example\" example"@example.com',
+ r'"example" example',
+ 'example.com',
+ None),
+
+ 'escaped_escapes_in_local_part':
+ (r'"\\"example\\" example"@example.com',
+ [errors.InvalidHeaderDefect]*5,
+ r'"\\example\\\\ example"@example.com',
+ '',
+ r'"\\example\\\\ example"@example.com',
+ r'\example\\ example',
+ 'example.com',
+ None),
+
+ 'spaces_in_unquoted_local_part_collapsed':
+ ('merwok wok @example.com',
+ [errors.InvalidHeaderDefect]*2,
+ '"merwok wok"@example.com',
+ '',
+ '"merwok wok"@example.com',
+ 'merwok wok',
+ 'example.com',
+ None),
+
+ 'spaces_around_dots_in_local_part_removed':
+ ('merwok. wok . wok@example.com',
+ [errors.ObsoleteHeaderDefect],
+ 'merwok.wok.wok@example.com',
+ '',
+ 'merwok.wok.wok@example.com',
+ 'merwok.wok.wok',
+ 'example.com',
+ None),
+
+ }
+
+ # XXX: Need many more examples, and in particular some with names in
+ # trailing comments, which aren't currently handled. comments in
+ # general are not handled yet.
+
+ def example_as_address(self, source, defects, decoded, display_name,
+ addr_spec, username, domain, comment):
+ h = self.make_header('sender', source)
+ self.assertEqual(h, decoded)
+ self.assertDefectsEqual(h.defects, defects)
+ a = h.address
+ self.assertEqual(str(a), decoded)
+ self.assertEqual(len(h.groups), 1)
+ self.assertEqual([a], list(h.groups[0].addresses))
+ self.assertEqual([a], list(h.addresses))
+ self.assertEqual(a.display_name, display_name)
+ self.assertEqual(a.addr_spec, addr_spec)
+ self.assertEqual(a.username, username)
+ self.assertEqual(a.domain, domain)
+ # XXX: we have no comment support yet.
+ #self.assertEqual(a.comment, comment)
+
+ def example_as_group(self, source, defects, decoded, display_name,
+ addr_spec, username, domain, comment):
+ source = 'foo: {};'.format(source)
+ gdecoded = 'foo: {};'.format(decoded) if decoded else 'foo:;'
+ h = self.make_header('to', source)
+ self.assertEqual(h, gdecoded)
+ self.assertDefectsEqual(h.defects, defects)
+ self.assertEqual(h.groups[0].addresses, h.addresses)
+ self.assertEqual(len(h.groups), 1)
+ self.assertEqual(len(h.addresses), 1)
+ a = h.addresses[0]
+ self.assertEqual(str(a), decoded)
+ self.assertEqual(a.display_name, display_name)
+ self.assertEqual(a.addr_spec, addr_spec)
+ self.assertEqual(a.username, username)
+ self.assertEqual(a.domain, domain)
+
+ def test_simple_address_list(self):
+ value = ('Fred <dinsdale@python.org>, foo@example.com, '
+ '"Harry W. Hastings" <hasty@example.com>')
+ h = self.make_header('to', value)
+ self.assertEqual(h, value)
+ self.assertEqual(len(h.groups), 3)
+ self.assertEqual(len(h.addresses), 3)
+ for i in range(3):
+ self.assertEqual(h.groups[i].addresses[0], h.addresses[i])
+ self.assertEqual(str(h.addresses[0]), 'Fred <dinsdale@python.org>')
+ self.assertEqual(str(h.addresses[1]), 'foo@example.com')
+ self.assertEqual(str(h.addresses[2]),
+ '"Harry W. Hastings" <hasty@example.com>')
+ self.assertEqual(h.addresses[2].display_name,
+ 'Harry W. Hastings')
+
+ def test_complex_address_list(self):
+ examples = list(self.example_params.values())
+ source = ('dummy list:;, another: (empty);,' +
+ ', '.join([x[0] for x in examples[:4]]) + ', ' +
+ r'"A \"list\"": ' +
+ ', '.join([x[0] for x in examples[4:6]]) + ';,' +
+ ', '.join([x[0] for x in examples[6:]])
+ )
+ # XXX: the fact that (empty) disappears here is a potential API design
+ # bug. We don't currently have a way to preserve comments.
+ expected = ('dummy list:;, another:;, ' +
+ ', '.join([x[2] for x in examples[:4]]) + ', ' +
+ r'"A \"list\"": ' +
+ ', '.join([x[2] for x in examples[4:6]]) + ';, ' +
+ ', '.join([x[2] for x in examples[6:]])
+ )
+
+ h = self.make_header('to', source)
+ self.assertEqual(h.split(','), expected.split(','))
+ self.assertEqual(h, expected)
+ self.assertEqual(len(h.groups), 7 + len(examples) - 6)
+ self.assertEqual(h.groups[0].display_name, 'dummy list')
+ self.assertEqual(h.groups[1].display_name, 'another')
+ self.assertEqual(h.groups[6].display_name, 'A "list"')
+ self.assertEqual(len(h.addresses), len(examples))
+ for i in range(4):
+ self.assertIsNone(h.groups[i+2].display_name)
+ self.assertEqual(str(h.groups[i+2].addresses[0]), examples[i][2])
+ for i in range(7, 7 + len(examples) - 6):
+ self.assertIsNone(h.groups[i].display_name)
+ self.assertEqual(str(h.groups[i].addresses[0]), examples[i-1][2])
+ for i in range(len(examples)):
+ self.assertEqual(str(h.addresses[i]), examples[i][2])
+ self.assertEqual(h.addresses[i].addr_spec, examples[i][4])
+
+ def test_address_read_only(self):
+ h = self.make_header('sender', 'abc@xyz.com')
+ with self.assertRaises(AttributeError):
+ h.address = 'foo'
+
+ def test_addresses_read_only(self):
+ h = self.make_header('sender', 'abc@xyz.com')
+ with self.assertRaises(AttributeError):
+ h.addresses = 'foo'
+
+ def test_groups_read_only(self):
+ h = self.make_header('sender', 'abc@xyz.com')
+ with self.assertRaises(AttributeError):
+ h.groups = 'foo'
+
+ def test_addresses_types(self):
+ source = 'me <who@example.com>'
+ h = self.make_header('to', source)
+ self.assertIsInstance(h.addresses, tuple)
+ self.assertIsInstance(h.addresses[0], Address)
+
+ def test_groups_types(self):
+ source = 'me <who@example.com>'
+ h = self.make_header('to', source)
+ self.assertIsInstance(h.groups, tuple)
+ self.assertIsInstance(h.groups[0], Group)
+
+ def test_set_from_Address(self):
+ h = self.make_header('to', Address('me', 'foo', 'example.com'))
+ self.assertEqual(h, 'me <foo@example.com>')
+
+ def test_set_from_Address_list(self):
+ h = self.make_header('to', [Address('me', 'foo', 'example.com'),
+ Address('you', 'bar', 'example.com')])
+ self.assertEqual(h, 'me <foo@example.com>, you <bar@example.com>')
+
+ def test_set_from_Address_and_Group_list(self):
+ h = self.make_header('to', [Address('me', 'foo', 'example.com'),
+ Group('bing', [Address('fiz', 'z', 'b.com'),
+ Address('zif', 'f', 'c.com')]),
+ Address('you', 'bar', 'example.com')])
+ self.assertEqual(h, 'me <foo@example.com>, bing: fiz <z@b.com>, '
+ 'zif <f@c.com>;, you <bar@example.com>')
+ self.assertEqual(h.fold(policy=policy.default.clone(max_line_length=40)),
+ 'to: me <foo@example.com>,\n'
+ ' bing: fiz <z@b.com>, zif <f@c.com>;,\n'
+ ' you <bar@example.com>\n')
+
+ def test_set_from_Group_list(self):
+ h = self.make_header('to', [Group('bing', [Address('fiz', 'z', 'b.com'),
+ Address('zif', 'f', 'c.com')])])
+ self.assertEqual(h, 'bing: fiz <z@b.com>, zif <f@c.com>;')
+
+
+class TestAddressAndGroup(TestEmailBase):
+
+ def _test_attr_ro(self, obj, attr):
+ with self.assertRaises(AttributeError):
+ setattr(obj, attr, 'foo')
+
+ def test_address_display_name_ro(self):
+ self._test_attr_ro(Address('foo', 'bar', 'baz'), 'display_name')
+
+ def test_address_username_ro(self):
+ self._test_attr_ro(Address('foo', 'bar', 'baz'), 'username')
+
+ def test_address_domain_ro(self):
+ self._test_attr_ro(Address('foo', 'bar', 'baz'), 'domain')
+
+ def test_group_display_name_ro(self):
+ self._test_attr_ro(Group('foo'), 'display_name')
+
+ def test_group_addresses_ro(self):
+ self._test_attr_ro(Group('foo'), 'addresses')
+
+ def test_address_from_username_domain(self):
+ a = Address('foo', 'bar', 'baz')
+ self.assertEqual(a.display_name, 'foo')
+ self.assertEqual(a.username, 'bar')
+ self.assertEqual(a.domain, 'baz')
+ self.assertEqual(a.addr_spec, 'bar@baz')
+ self.assertEqual(str(a), 'foo <bar@baz>')
+
+ def test_address_from_addr_spec(self):
+ a = Address('foo', addr_spec='bar@baz')
+ self.assertEqual(a.display_name, 'foo')
+ self.assertEqual(a.username, 'bar')
+ self.assertEqual(a.domain, 'baz')
+ self.assertEqual(a.addr_spec, 'bar@baz')
+ self.assertEqual(str(a), 'foo <bar@baz>')
+
+ def test_address_with_no_display_name(self):
+ a = Address(addr_spec='bar@baz')
+ self.assertEqual(a.display_name, '')
+ self.assertEqual(a.username, 'bar')
+ self.assertEqual(a.domain, 'baz')
+ self.assertEqual(a.addr_spec, 'bar@baz')
+ self.assertEqual(str(a), 'bar@baz')
+
+ def test_null_address(self):
+ a = Address()
+ self.assertEqual(a.display_name, '')
+ self.assertEqual(a.username, '')
+ self.assertEqual(a.domain, '')
+ self.assertEqual(a.addr_spec, '<>')
+ self.assertEqual(str(a), '<>')
+
+ def test_domain_only(self):
+ # This isn't really a valid address.
+ a = Address(domain='buzz')
+ self.assertEqual(a.display_name, '')
+ self.assertEqual(a.username, '')
+ self.assertEqual(a.domain, 'buzz')
+ self.assertEqual(a.addr_spec, '@buzz')
+ self.assertEqual(str(a), '@buzz')
+
+ def test_username_only(self):
+ # This isn't really a valid address.
+ a = Address(username='buzz')
+ self.assertEqual(a.display_name, '')
+ self.assertEqual(a.username, 'buzz')
+ self.assertEqual(a.domain, '')
+ self.assertEqual(a.addr_spec, 'buzz')
+ self.assertEqual(str(a), 'buzz')
+
+ def test_display_name_only(self):
+ a = Address('buzz')
+ self.assertEqual(a.display_name, 'buzz')
+ self.assertEqual(a.username, '')
+ self.assertEqual(a.domain, '')
+ self.assertEqual(a.addr_spec, '<>')
+ self.assertEqual(str(a), 'buzz <>')
+
+ def test_quoting(self):
+ # Ideally we'd check every special individually, but I'm not up for
+ # writing that many tests.
+ a = Address('Sara J.', 'bad name', 'example.com')
+ self.assertEqual(a.display_name, 'Sara J.')
+ self.assertEqual(a.username, 'bad name')
+ self.assertEqual(a.domain, 'example.com')
+ self.assertEqual(a.addr_spec, '"bad name"@example.com')
+ self.assertEqual(str(a), '"Sara J." <"bad name"@example.com>')
+
+ def test_il8n(self):
+ a = Address('Éric', 'wok', 'exàmple.com')
+ self.assertEqual(a.display_name, 'Éric')
+ self.assertEqual(a.username, 'wok')
+ self.assertEqual(a.domain, 'exàmple.com')
+ self.assertEqual(a.addr_spec, 'wok@exàmple.com')
+ self.assertEqual(str(a), 'Éric <wok@exàmple.com>')
+
+ # XXX: there is an API design issue that needs to be solved here.
+ #def test_non_ascii_username_raises(self):
+ # with self.assertRaises(ValueError):
+ # Address('foo', 'wők', 'example.com')
+
+ def test_non_ascii_username_in_addr_spec_raises(self):
+ with self.assertRaises(ValueError):
+ Address('foo', addr_spec='wők@example.com')
+
+ def test_address_addr_spec_and_username_raises(self):
+ with self.assertRaises(TypeError):
+ Address('foo', username='bing', addr_spec='bar@baz')
+
+ def test_address_addr_spec_and_domain_raises(self):
+ with self.assertRaises(TypeError):
+ Address('foo', domain='bing', addr_spec='bar@baz')
+
+ def test_address_addr_spec_and_username_and_domain_raises(self):
+ with self.assertRaises(TypeError):
+ Address('foo', username='bong', domain='bing', addr_spec='bar@baz')
+
+ def test_space_in_addr_spec_username_raises(self):
+ with self.assertRaises(ValueError):
+ Address('foo', addr_spec="bad name@example.com")
+
+ def test_bad_addr_sepc_raises(self):
+ with self.assertRaises(ValueError):
+ Address('foo', addr_spec="name@ex[]ample.com")
+
+ def test_empty_group(self):
+ g = Group('foo')
+ self.assertEqual(g.display_name, 'foo')
+ self.assertEqual(g.addresses, tuple())
+ self.assertEqual(str(g), 'foo:;')
+
+ def test_empty_group_list(self):
+ g = Group('foo', addresses=[])
+ self.assertEqual(g.display_name, 'foo')
+ self.assertEqual(g.addresses, tuple())
+ self.assertEqual(str(g), 'foo:;')
+
+ def test_null_group(self):
+ g = Group()
+ self.assertIsNone(g.display_name)
+ self.assertEqual(g.addresses, tuple())
+ self.assertEqual(str(g), 'None:;')
+
+ def test_group_with_addresses(self):
+ addrs = [Address('b', 'b', 'c'), Address('a', 'b','c')]
+ g = Group('foo', addrs)
+ self.assertEqual(g.display_name, 'foo')
+ self.assertEqual(g.addresses, tuple(addrs))
+ self.assertEqual(str(g), 'foo: b <b@c>, a <b@c>;')
+
+ def test_group_with_addresses_no_display_name(self):
+ addrs = [Address('b', 'b', 'c'), Address('a', 'b','c')]
+ g = Group(addresses=addrs)
+ self.assertIsNone(g.display_name)
+ self.assertEqual(g.addresses, tuple(addrs))
+ self.assertEqual(str(g), 'None: b <b@c>, a <b@c>;')
+
+ def test_group_with_one_address_no_display_name(self):
+ addrs = [Address('b', 'b', 'c')]
+ g = Group(addresses=addrs)
+ self.assertIsNone(g.display_name)
+ self.assertEqual(g.addresses, tuple(addrs))
+ self.assertEqual(str(g), 'b <b@c>')
+
+ def test_display_name_quoting(self):
+ g = Group('foo.bar')
+ self.assertEqual(g.display_name, 'foo.bar')
+ self.assertEqual(g.addresses, tuple())
+ self.assertEqual(str(g), '"foo.bar":;')
+
+ def test_display_name_blanks_not_quoted(self):
+ g = Group('foo bar')
+ self.assertEqual(g.display_name, 'foo bar')
+ self.assertEqual(g.addresses, tuple())
+ self.assertEqual(str(g), 'foo bar:;')
+
+ def test_set_message_header_from_address(self):
+ a = Address('foo', 'bar', 'example.com')
+ m = Message(policy=policy.default)
+ m['To'] = a
+ self.assertEqual(m['to'], 'foo <bar@example.com>')
+ self.assertEqual(m['to'].addresses, (a,))
+
+ def test_set_message_header_from_group(self):
+ g = Group('foo bar')
+ m = Message(policy=policy.default)
+ m['To'] = g
+ self.assertEqual(m['to'], 'foo bar:;')
+ self.assertEqual(m['to'].addresses, g.addresses)
+
+
+class TestFolding(TestHeaderBase):
+
+ def test_short_unstructured(self):
+ h = self.make_header('subject', 'this is a test')
+ self.assertEqual(h.fold(policy=policy.default),
+ 'subject: this is a test\n')
+
+ def test_long_unstructured(self):
+ h = self.make_header('Subject', 'This is a long header '
+ 'line that will need to be folded into two lines '
+ 'and will demonstrate basic folding')
+ self.assertEqual(h.fold(policy=policy.default),
+ 'Subject: This is a long header line that will '
+ 'need to be folded into two lines\n'
+ ' and will demonstrate basic folding\n')
+
+ def test_unstructured_short_max_line_length(self):
+ h = self.make_header('Subject', 'this is a short header '
+ 'that will be folded anyway')
+ self.assertEqual(
+ h.fold(policy=policy.default.clone(max_line_length=20)),
+ textwrap.dedent("""\
+ Subject: this is a
+ short header that
+ will be folded
+ anyway
+ """))
+
+ def test_fold_unstructured_single_word(self):
+ h = self.make_header('Subject', 'test')
+ self.assertEqual(h.fold(policy=policy.default), 'Subject: test\n')
+
+ def test_fold_unstructured_short(self):
+ h = self.make_header('Subject', 'test test test')
+ self.assertEqual(h.fold(policy=policy.default),
+ 'Subject: test test test\n')
+
+ def test_fold_unstructured_with_overlong_word(self):
+ h = self.make_header('Subject', 'thisisaverylonglineconsistingofa'
+ 'singlewordthatwontfit')
+ self.assertEqual(
+ h.fold(policy=policy.default.clone(max_line_length=20)),
+ 'Subject: thisisaverylonglineconsistingofasinglewordthatwontfit\n')
+
+ def test_fold_unstructured_with_two_overlong_words(self):
+ h = self.make_header('Subject', 'thisisaverylonglineconsistingofa'
+ 'singlewordthatwontfit plusanotherverylongwordthatwontfit')
+ self.assertEqual(
+ h.fold(policy=policy.default.clone(max_line_length=20)),
+ 'Subject: thisisaverylonglineconsistingofasinglewordthatwontfit\n'
+ ' plusanotherverylongwordthatwontfit\n')
+
+ def test_fold_unstructured_with_slightly_long_word(self):
+ h = self.make_header('Subject', 'thislongwordislessthanmaxlinelen')
+ self.assertEqual(
+ h.fold(policy=policy.default.clone(max_line_length=35)),
+ 'Subject:\n thislongwordislessthanmaxlinelen\n')
+
+ def test_fold_unstructured_with_commas(self):
+ # The old wrapper would fold this at the commas.
+ h = self.make_header('Subject', "This header is intended to "
+ "demonstrate, in a fairly susinct way, that we now do "
+ "not give a , special treatment in unstructured headers.")
+ self.assertEqual(
+ h.fold(policy=policy.default.clone(max_line_length=60)),
+ textwrap.dedent("""\
+ Subject: This header is intended to demonstrate, in a fairly
+ susinct way, that we now do not give a , special treatment
+ in unstructured headers.
+ """))
+
+ def test_fold_address_list(self):
+ h = self.make_header('To', '"Theodore H. Perfect" <yes@man.com>, '
+ '"My address is very long because my name is long" <foo@bar.com>, '
+ '"Only A. Friend" <no@yes.com>')
+ self.assertEqual(h.fold(policy=policy.default), textwrap.dedent("""\
+ To: "Theodore H. Perfect" <yes@man.com>,
+ "My address is very long because my name is long" <foo@bar.com>,
+ "Only A. Friend" <no@yes.com>
+ """))
+
+ def test_fold_date_header(self):
+ h = self.make_header('Date', 'Sat, 2 Feb 2002 17:00:06 -0800')
+ self.assertEqual(h.fold(policy=policy.default),
+ 'Date: Sat, 02 Feb 2002 17:00:06 -0800\n')
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py
new file mode 100644
index 0000000..8cc3f80
--- /dev/null
+++ b/Lib/test/test_email/test_message.py
@@ -0,0 +1,18 @@
+import unittest
+from email import policy
+from test.test_email import TestEmailBase
+
+
+class Test(TestEmailBase):
+
+ policy = policy.default
+
+ def test_error_on_setitem_if_max_count_exceeded(self):
+ m = self._str_msg("")
+ m['To'] = 'abc@xyz'
+ with self.assertRaises(ValueError):
+ m['To'] = 'xyz@abc'
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_parser.py b/Lib/test/test_email/test_parser.py
new file mode 100644
index 0000000..3abd11a
--- /dev/null
+++ b/Lib/test/test_email/test_parser.py
@@ -0,0 +1,36 @@
+import io
+import email
+import unittest
+from email.message import Message
+from test.test_email import TestEmailBase
+
+
+class TestCustomMessage(TestEmailBase):
+
+ class MyMessage(Message):
+ def __init__(self, policy):
+ self.check_policy = policy
+ super().__init__()
+
+ MyPolicy = TestEmailBase.policy.clone(linesep='boo')
+
+ def test_custom_message_gets_policy_if_possible_from_string(self):
+ msg = email.message_from_string("Subject: bogus\n\nmsg\n",
+ self.MyMessage,
+ policy=self.MyPolicy)
+ self.assertTrue(isinstance(msg, self.MyMessage))
+ self.assertIs(msg.check_policy, self.MyPolicy)
+
+ def test_custom_message_gets_policy_if_possible_from_file(self):
+ source_file = io.StringIO("Subject: bogus\n\nmsg\n")
+ msg = email.message_from_file(source_file,
+ self.MyMessage,
+ policy=self.MyPolicy)
+ self.assertTrue(isinstance(msg, self.MyMessage))
+ self.assertIs(msg.check_policy, self.MyPolicy)
+
+ # XXX add tests for other functions that take Message arg.
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_pickleable.py b/Lib/test/test_email/test_pickleable.py
new file mode 100644
index 0000000..daa8d25
--- /dev/null
+++ b/Lib/test/test_email/test_pickleable.py
@@ -0,0 +1,74 @@
+import unittest
+import textwrap
+import copy
+import pickle
+import email
+import email.message
+from email import policy
+from email.headerregistry import HeaderRegistry
+from test.test_email import TestEmailBase, parameterize
+
+
+@parameterize
+class TestPickleCopyHeader(TestEmailBase):
+
+ header_factory = HeaderRegistry()
+
+ unstructured = header_factory('subject', 'this is a test')
+
+ header_params = {
+ 'subject': ('subject', 'this is a test'),
+ 'from': ('from', 'frodo@mordor.net'),
+ 'to': ('to', 'a: k@b.com, y@z.com;, j@f.com'),
+ 'date': ('date', 'Tue, 29 May 2012 09:24:26 +1000'),
+ }
+
+ def header_as_deepcopy(self, name, value):
+ header = self.header_factory(name, value)
+ h = copy.deepcopy(header)
+ self.assertEqual(str(h), str(header))
+
+ def header_as_pickle(self, name, value):
+ header = self.header_factory(name, value)
+ p = pickle.dumps(header)
+ h = pickle.loads(p)
+ self.assertEqual(str(h), str(header))
+
+
+@parameterize
+class TestPickleCopyMessage(TestEmailBase):
+
+ # Message objects are a sequence, so we have to make them a one-tuple in
+ # msg_params so they get passed to the parameterized test method as a
+ # single argument instead of as a list of headers.
+ msg_params = {}
+
+ # Note: there will be no custom header objects in the parsed message.
+ msg_params['parsed'] = (email.message_from_string(textwrap.dedent("""\
+ Date: Tue, 29 May 2012 09:24:26 +1000
+ From: frodo@mordor.net
+ To: bilbo@underhill.org
+ Subject: help
+
+ I think I forgot the ring.
+ """), policy=policy.default),)
+
+ msg_params['created'] = (email.message.Message(policy=policy.default),)
+ msg_params['created'][0]['Date'] = 'Tue, 29 May 2012 09:24:26 +1000'
+ msg_params['created'][0]['From'] = 'frodo@mordor.net'
+ msg_params['created'][0]['To'] = 'bilbo@underhill.org'
+ msg_params['created'][0]['Subject'] = 'help'
+ msg_params['created'][0].set_payload('I think I forgot the ring.')
+
+ def msg_as_deepcopy(self, msg):
+ msg2 = copy.deepcopy(msg)
+ self.assertEqual(msg2.as_string(), msg.as_string())
+
+ def msg_as_pickle(self, msg):
+ p = pickle.dumps(msg)
+ msg2 = pickle.loads(p)
+ self.assertEqual(msg2.as_string(), msg.as_string())
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py
new file mode 100644
index 0000000..983bd49
--- /dev/null
+++ b/Lib/test/test_email/test_policy.py
@@ -0,0 +1,322 @@
+import io
+import types
+import textwrap
+import unittest
+import email.policy
+import email.parser
+import email.generator
+from email import headerregistry
+
+def make_defaults(base_defaults, differences):
+ defaults = base_defaults.copy()
+ defaults.update(differences)
+ return defaults
+
+class PolicyAPITests(unittest.TestCase):
+
+ longMessage = True
+
+ # Base default values.
+ compat32_defaults = {
+ 'max_line_length': 78,
+ 'linesep': '\n',
+ 'cte_type': '8bit',
+ 'raise_on_defect': False,
+ }
+ # These default values are the ones set on email.policy.default.
+ # If any of these defaults change, the docs must be updated.
+ policy_defaults = compat32_defaults.copy()
+ policy_defaults.update({
+ 'raise_on_defect': False,
+ 'header_factory': email.policy.EmailPolicy.header_factory,
+ 'refold_source': 'long',
+ })
+
+ # For each policy under test, we give here what we expect the defaults to
+ # be for that policy. The second argument to make defaults is the
+ # difference between the base defaults and that for the particular policy.
+ new_policy = email.policy.EmailPolicy()
+ policies = {
+ email.policy.compat32: make_defaults(compat32_defaults, {}),
+ email.policy.default: make_defaults(policy_defaults, {}),
+ email.policy.SMTP: make_defaults(policy_defaults,
+ {'linesep': '\r\n'}),
+ email.policy.HTTP: make_defaults(policy_defaults,
+ {'linesep': '\r\n',
+ 'max_line_length': None}),
+ email.policy.strict: make_defaults(policy_defaults,
+ {'raise_on_defect': True}),
+ new_policy: make_defaults(policy_defaults, {}),
+ }
+ # Creating a new policy creates a new header factory. There is a test
+ # later that proves this.
+ policies[new_policy]['header_factory'] = new_policy.header_factory
+
+ def test_defaults(self):
+ for policy, expected in self.policies.items():
+ for attr, value in expected.items():
+ self.assertEqual(getattr(policy, attr), value,
+ ("change {} docs/docstrings if defaults have "
+ "changed").format(policy))
+
+ def test_all_attributes_covered(self):
+ for policy, expected in self.policies.items():
+ for attr in dir(policy):
+ if (attr.startswith('_') or
+ isinstance(getattr(email.policy.EmailPolicy, attr),
+ types.FunctionType)):
+ continue
+ else:
+ self.assertIn(attr, expected,
+ "{} is not fully tested".format(attr))
+
+ def test_abc(self):
+ with self.assertRaises(TypeError) as cm:
+ email.policy.Policy()
+ msg = str(cm.exception)
+ abstract_methods = ('fold',
+ 'fold_binary',
+ 'header_fetch_parse',
+ 'header_source_parse',
+ 'header_store_parse')
+ for method in abstract_methods:
+ self.assertIn(method, msg)
+
+ def test_policy_is_immutable(self):
+ for policy, defaults in self.policies.items():
+ for attr in defaults:
+ with self.assertRaisesRegex(AttributeError, attr+".*read-only"):
+ setattr(policy, attr, None)
+ with self.assertRaisesRegex(AttributeError, 'no attribute.*foo'):
+ policy.foo = None
+
+ def test_set_policy_attrs_when_cloned(self):
+ # None of the attributes has a default value of None, so we set them
+ # all to None in the clone call and check that it worked.
+ for policyclass, defaults in self.policies.items():
+ testattrdict = {attr: None for attr in defaults}
+ policy = policyclass.clone(**testattrdict)
+ for attr in defaults:
+ self.assertIsNone(getattr(policy, attr))
+
+ def test_reject_non_policy_keyword_when_called(self):
+ for policyclass in self.policies:
+ with self.assertRaises(TypeError):
+ policyclass(this_keyword_should_not_be_valid=None)
+ with self.assertRaises(TypeError):
+ policyclass(newtline=None)
+
+ def test_policy_addition(self):
+ expected = self.policy_defaults.copy()
+ p1 = email.policy.default.clone(max_line_length=100)
+ p2 = email.policy.default.clone(max_line_length=50)
+ added = p1 + p2
+ expected.update(max_line_length=50)
+ for attr, value in expected.items():
+ self.assertEqual(getattr(added, attr), value)
+ added = p2 + p1
+ expected.update(max_line_length=100)
+ for attr, value in expected.items():
+ self.assertEqual(getattr(added, attr), value)
+ added = added + email.policy.default
+ for attr, value in expected.items():
+ self.assertEqual(getattr(added, attr), value)
+
+ def test_register_defect(self):
+ class Dummy:
+ def __init__(self):
+ self.defects = []
+ obj = Dummy()
+ defect = object()
+ policy = email.policy.EmailPolicy()
+ policy.register_defect(obj, defect)
+ self.assertEqual(obj.defects, [defect])
+ defect2 = object()
+ policy.register_defect(obj, defect2)
+ self.assertEqual(obj.defects, [defect, defect2])
+
+ class MyObj:
+ def __init__(self):
+ self.defects = []
+
+ class MyDefect(Exception):
+ pass
+
+ def test_handle_defect_raises_on_strict(self):
+ foo = self.MyObj()
+ defect = self.MyDefect("the telly is broken")
+ with self.assertRaisesRegex(self.MyDefect, "the telly is broken"):
+ email.policy.strict.handle_defect(foo, defect)
+
+ def test_handle_defect_registers_defect(self):
+ foo = self.MyObj()
+ defect1 = self.MyDefect("one")
+ email.policy.default.handle_defect(foo, defect1)
+ self.assertEqual(foo.defects, [defect1])
+ defect2 = self.MyDefect("two")
+ email.policy.default.handle_defect(foo, defect2)
+ self.assertEqual(foo.defects, [defect1, defect2])
+
+ class MyPolicy(email.policy.EmailPolicy):
+ defects = None
+ def __init__(self, *args, **kw):
+ super().__init__(*args, defects=[], **kw)
+ def register_defect(self, obj, defect):
+ self.defects.append(defect)
+
+ def test_overridden_register_defect_still_raises(self):
+ foo = self.MyObj()
+ defect = self.MyDefect("the telly is broken")
+ with self.assertRaisesRegex(self.MyDefect, "the telly is broken"):
+ self.MyPolicy(raise_on_defect=True).handle_defect(foo, defect)
+
+ def test_overriden_register_defect_works(self):
+ foo = self.MyObj()
+ defect1 = self.MyDefect("one")
+ my_policy = self.MyPolicy()
+ my_policy.handle_defect(foo, defect1)
+ self.assertEqual(my_policy.defects, [defect1])
+ self.assertEqual(foo.defects, [])
+ defect2 = self.MyDefect("two")
+ my_policy.handle_defect(foo, defect2)
+ self.assertEqual(my_policy.defects, [defect1, defect2])
+ self.assertEqual(foo.defects, [])
+
+ def test_default_header_factory(self):
+ h = email.policy.default.header_factory('Test', 'test')
+ self.assertEqual(h.name, 'Test')
+ self.assertIsInstance(h, headerregistry.UnstructuredHeader)
+ self.assertIsInstance(h, headerregistry.BaseHeader)
+
+ class Foo:
+ parse = headerregistry.UnstructuredHeader.parse
+
+ def test_each_Policy_gets_unique_factory(self):
+ policy1 = email.policy.EmailPolicy()
+ policy2 = email.policy.EmailPolicy()
+ policy1.header_factory.map_to_type('foo', self.Foo)
+ h = policy1.header_factory('foo', 'test')
+ self.assertIsInstance(h, self.Foo)
+ self.assertNotIsInstance(h, headerregistry.UnstructuredHeader)
+ h = policy2.header_factory('foo', 'test')
+ self.assertNotIsInstance(h, self.Foo)
+ self.assertIsInstance(h, headerregistry.UnstructuredHeader)
+
+ def test_clone_copies_factory(self):
+ policy1 = email.policy.EmailPolicy()
+ policy2 = policy1.clone()
+ policy1.header_factory.map_to_type('foo', self.Foo)
+ h = policy1.header_factory('foo', 'test')
+ self.assertIsInstance(h, self.Foo)
+ h = policy2.header_factory('foo', 'test')
+ self.assertIsInstance(h, self.Foo)
+
+ def test_new_factory_overrides_default(self):
+ mypolicy = email.policy.EmailPolicy()
+ myfactory = mypolicy.header_factory
+ newpolicy = mypolicy + email.policy.strict
+ self.assertEqual(newpolicy.header_factory, myfactory)
+ newpolicy = email.policy.strict + mypolicy
+ self.assertEqual(newpolicy.header_factory, myfactory)
+
+ def test_adding_default_policies_preserves_default_factory(self):
+ newpolicy = email.policy.default + email.policy.strict
+ self.assertEqual(newpolicy.header_factory,
+ email.policy.EmailPolicy.header_factory)
+ self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True})
+
+ # XXX: Need subclassing tests.
+ # For adding subclassed objects, make sure the usual rules apply (subclass
+ # wins), but that the order still works (right overrides left).
+
+
+class TestPolicyPropagation(unittest.TestCase):
+
+ # The abstract methods are used by the parser but not by the wrapper
+ # functions that call it, so if the exception gets raised we know that the
+ # policy was actually propagated all the way to feedparser.
+ class MyPolicy(email.policy.Policy):
+ def badmethod(self, *args, **kw):
+ raise Exception("test")
+ fold = fold_binary = header_fetch_parser = badmethod
+ header_source_parse = header_store_parse = badmethod
+
+ def test_message_from_string(self):
+ with self.assertRaisesRegex(Exception, "^test$"):
+ email.message_from_string("Subject: test\n\n",
+ policy=self.MyPolicy)
+
+ def test_message_from_bytes(self):
+ with self.assertRaisesRegex(Exception, "^test$"):
+ email.message_from_bytes(b"Subject: test\n\n",
+ policy=self.MyPolicy)
+
+ def test_message_from_file(self):
+ f = io.StringIO('Subject: test\n\n')
+ with self.assertRaisesRegex(Exception, "^test$"):
+ email.message_from_file(f, policy=self.MyPolicy)
+
+ def test_message_from_binary_file(self):
+ f = io.BytesIO(b'Subject: test\n\n')
+ with self.assertRaisesRegex(Exception, "^test$"):
+ email.message_from_binary_file(f, policy=self.MyPolicy)
+
+ # These are redundant, but we need them for black-box completeness.
+
+ def test_parser(self):
+ p = email.parser.Parser(policy=self.MyPolicy)
+ with self.assertRaisesRegex(Exception, "^test$"):
+ p.parsestr('Subject: test\n\n')
+
+ def test_bytes_parser(self):
+ p = email.parser.BytesParser(policy=self.MyPolicy)
+ with self.assertRaisesRegex(Exception, "^test$"):
+ p.parsebytes(b'Subject: test\n\n')
+
+ # Now that we've established that all the parse methods get the
+ # policy in to feedparser, we can use message_from_string for
+ # the rest of the propagation tests.
+
+ def _make_msg(self, source='Subject: test\n\n', policy=None):
+ self.policy = email.policy.default.clone() if policy is None else policy
+ return email.message_from_string(source, policy=self.policy)
+
+ def test_parser_propagates_policy_to_message(self):
+ msg = self._make_msg()
+ self.assertIs(msg.policy, self.policy)
+
+ def test_parser_propagates_policy_to_sub_messages(self):
+ msg = self._make_msg(textwrap.dedent("""\
+ Subject: mime test
+ MIME-Version: 1.0
+ Content-Type: multipart/mixed, boundary="XXX"
+
+ --XXX
+ Content-Type: text/plain
+
+ test
+ --XXX
+ Content-Type: text/plain
+
+ test2
+ --XXX--
+ """))
+ for part in msg.walk():
+ self.assertIs(part.policy, self.policy)
+
+ def test_message_policy_propagates_to_generator(self):
+ msg = self._make_msg("Subject: test\nTo: foo\n\n",
+ policy=email.policy.default.clone(linesep='X'))
+ s = io.StringIO()
+ g = email.generator.Generator(s)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), "Subject: testXTo: fooXX")
+
+ def test_message_policy_used_by_as_string(self):
+ msg = self._make_msg("Subject: test\nTo: foo\n\n",
+ policy=email.policy.default.clone(linesep='X'))
+ self.assertEqual(msg.as_string(), "Subject: testXTo: fooXX")
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_email/test_utils.py b/Lib/test/test_email/test_utils.py
new file mode 100644
index 0000000..622ef3a
--- /dev/null
+++ b/Lib/test/test_email/test_utils.py
@@ -0,0 +1,136 @@
+import datetime
+from email import utils
+import test.support
+import time
+import unittest
+import sys
+
+class DateTimeTests(unittest.TestCase):
+
+ datestring = 'Sun, 23 Sep 2001 20:10:55'
+ dateargs = (2001, 9, 23, 20, 10, 55)
+ offsetstring = ' -0700'
+ utcoffset = datetime.timedelta(hours=-7)
+ tz = datetime.timezone(utcoffset)
+ naive_dt = datetime.datetime(*dateargs)
+ aware_dt = datetime.datetime(*dateargs, tzinfo=tz)
+
+ def test_naive_datetime(self):
+ self.assertEqual(utils.format_datetime(self.naive_dt),
+ self.datestring + ' -0000')
+
+ def test_aware_datetime(self):
+ self.assertEqual(utils.format_datetime(self.aware_dt),
+ self.datestring + self.offsetstring)
+
+ def test_usegmt(self):
+ utc_dt = datetime.datetime(*self.dateargs,
+ tzinfo=datetime.timezone.utc)
+ self.assertEqual(utils.format_datetime(utc_dt, usegmt=True),
+ self.datestring + ' GMT')
+
+ def test_usegmt_with_naive_datetime_raises(self):
+ with self.assertRaises(ValueError):
+ utils.format_datetime(self.naive_dt, usegmt=True)
+
+ def test_usegmt_with_non_utc_datetime_raises(self):
+ with self.assertRaises(ValueError):
+ utils.format_datetime(self.aware_dt, usegmt=True)
+
+ def test_parsedate_to_datetime(self):
+ self.assertEqual(
+ utils.parsedate_to_datetime(self.datestring + self.offsetstring),
+ self.aware_dt)
+
+ def test_parsedate_to_datetime_naive(self):
+ self.assertEqual(
+ utils.parsedate_to_datetime(self.datestring + ' -0000'),
+ self.naive_dt)
+
+
+class LocaltimeTests(unittest.TestCase):
+
+ def test_localtime_is_tz_aware_daylight_true(self):
+ test.support.patch(self, time, 'daylight', True)
+ t = utils.localtime()
+ self.assertIsNot(t.tzinfo, None)
+
+ def test_localtime_is_tz_aware_daylight_false(self):
+ test.support.patch(self, time, 'daylight', False)
+ t = utils.localtime()
+ self.assertIsNot(t.tzinfo, None)
+
+ def test_localtime_daylight_true_dst_false(self):
+ test.support.patch(self, time, 'daylight', True)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+ t1 = utils.localtime(t0, isdst=-1)
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
+ def test_localtime_daylight_false_dst_false(self):
+ test.support.patch(self, time, 'daylight', False)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+ t1 = utils.localtime(t0, isdst=-1)
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
+ def test_localtime_daylight_true_dst_true(self):
+ test.support.patch(self, time, 'daylight', True)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+ t1 = utils.localtime(t0, isdst=1)
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
+ def test_localtime_daylight_false_dst_true(self):
+ test.support.patch(self, time, 'daylight', False)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+ t1 = utils.localtime(t0, isdst=1)
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
+ @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
+ def test_localtime_epoch_utc_daylight_true(self):
+ test.support.patch(self, time, 'daylight', True)
+ t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
+ t1 = utils.localtime(t0)
+ t2 = t0 - datetime.timedelta(hours=5)
+ t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
+ self.assertEqual(t1, t2)
+
+ @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
+ def test_localtime_epoch_utc_daylight_false(self):
+ test.support.patch(self, time, 'daylight', False)
+ t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
+ t1 = utils.localtime(t0)
+ t2 = t0 - datetime.timedelta(hours=5)
+ t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
+ self.assertEqual(t1, t2)
+
+ def test_localtime_epoch_notz_daylight_true(self):
+ test.support.patch(self, time, 'daylight', True)
+ t0 = datetime.datetime(1990, 1, 1)
+ t1 = utils.localtime(t0)
+ t2 = utils.localtime(t0.replace(tzinfo=None))
+ self.assertEqual(t1, t2)
+
+ def test_localtime_epoch_notz_daylight_false(self):
+ test.support.patch(self, time, 'daylight', False)
+ t0 = datetime.datetime(1990, 1, 1)
+ t1 = utils.localtime(t0)
+ t2 = utils.localtime(t0.replace(tzinfo=None))
+ self.assertEqual(t1, t2)
+
+ # XXX: Need a more robust test for Olson's tzdata
+ @unittest.skipIf(sys.platform.startswith('win'),
+ "Windows does not use Olson's TZ database")
+ @test.support.run_with_tz('Europe/Kiev')
+ def test_variable_tzname(self):
+ t0 = datetime.datetime(1984, 1, 1, tzinfo=datetime.timezone.utc)
+ t1 = utils.localtime(t0)
+ self.assertEqual(t1.tzname(), 'MSK')
+ t0 = datetime.datetime(1994, 1, 1, tzinfo=datetime.timezone.utc)
+ t1 = utils.localtime(t0)
+ self.assertEqual(t1.tzname(), 'EET')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/email/test/test_email_torture.py b/Lib/test/test_email/torture_test.py
index 544b1bb..544b1bb 100644
--- a/Lib/email/test/test_email_torture.py
+++ b/Lib/test/test_email/torture_test.py
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index 095820b..2e904cf 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -1,5 +1,6 @@
import unittest
import sys
+import pickle
from test import support
@@ -61,7 +62,25 @@ class N:
def __iter__(self):
return self
-class EnumerateTestCase(unittest.TestCase):
+class PickleTest:
+ # Helper to check picklability
+ def check_pickle(self, itorg, seq):
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(list(it), seq)
+
+ it = pickle.loads(d)
+ try:
+ next(it)
+ except StopIteration:
+ self.assertFalse(seq[1:])
+ return
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), seq[1:])
+
+class EnumerateTestCase(unittest.TestCase, PickleTest):
enum = enumerate
seq, res = 'abc', [(0,'a'), (1,'b'), (2,'c')]
@@ -73,6 +92,9 @@ class EnumerateTestCase(unittest.TestCase):
self.assertEqual(list(self.enum(self.seq)), self.res)
self.enum.__doc__
+ def test_pickle(self):
+ self.check_pickle(self.enum(self.seq), self.res)
+
def test_getitemseqn(self):
self.assertEqual(list(self.enum(G(self.seq))), self.res)
e = self.enum(G(''))
@@ -126,7 +148,7 @@ class TestBig(EnumerateTestCase):
seq = range(10,20000,2)
res = list(zip(range(20000), seq))
-class TestReversed(unittest.TestCase):
+class TestReversed(unittest.TestCase, PickleTest):
def test_simple(self):
class A:
@@ -212,6 +234,10 @@ class TestReversed(unittest.TestCase):
ngi = NoGetItem()
self.assertRaises(TypeError, reversed, ngi)
+ def test_pickle(self):
+ for data in 'abc', range(5), tuple(enumerate('abc')), range(1,17,5):
+ self.check_pickle(reversed(data), list(data)[::-1])
+
class EnumerateStartTestCase(EnumerateTestCase):
diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py
index 083fd7f..7f9547f 100644
--- a/Lib/test/test_epoll.py
+++ b/Lib/test/test_epoll.py
@@ -75,6 +75,9 @@ class TestEPoll(unittest.TestCase):
ep.close()
self.assertTrue(ep.closed)
self.assertRaises(ValueError, ep.fileno)
+ if hasattr(select, "EPOLL_CLOEXEC"):
+ select.epoll(select.EPOLL_CLOEXEC).close()
+ self.assertRaises(OSError, select.epoll, flags=12356)
def test_badcreate(self):
self.assertRaises(TypeError, select.epoll, 1, 2, 3)
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 7a2dd0c..413f4dd 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -8,7 +8,16 @@ import weakref
import errno
from test.support import (TESTFN, unlink, run_unittest, captured_output,
- gc_collect, cpython_only)
+ gc_collect, cpython_only, no_tracing)
+
+class NaiveException(Exception):
+ def __init__(self, x):
+ self.x = x
+
+class SlottedNaiveException(Exception):
+ __slots__ = ('x',)
+ def __init__(self, x):
+ self.x = x
# XXX This is not really enough, each *operation* should be tested!
@@ -46,8 +55,8 @@ class ExceptionTests(unittest.TestCase):
fp.close()
unlink(TESTFN)
- self.raise_catch(IOError, "IOError")
- self.assertRaises(IOError, open, 'this file does not exist', 'r')
+ self.raise_catch(OSError, "OSError")
+ self.assertRaises(OSError, open, 'this file does not exist', 'r')
self.raise_catch(ImportError, "ImportError")
self.assertRaises(ImportError, __import__, "undefined_module")
@@ -192,11 +201,35 @@ class ExceptionTests(unittest.TestCase):
except NameError:
pass
else:
- self.assertEqual(str(WindowsError(1001)), "1001")
- self.assertEqual(str(WindowsError(1001, "message")),
- "[Error 1001] message")
- self.assertEqual(WindowsError(1001, "message").errno, 22)
- self.assertEqual(WindowsError(1001, "message").winerror, 1001)
+ self.assertIs(WindowsError, OSError)
+ self.assertEqual(str(OSError(1001)), "1001")
+ self.assertEqual(str(OSError(1001, "message")),
+ "[Errno 1001] message")
+ # POSIX errno (9 aka EBADF) is untranslated
+ w = OSError(9, 'foo', 'bar')
+ self.assertEqual(w.errno, 9)
+ self.assertEqual(w.winerror, None)
+ self.assertEqual(str(w), "[Errno 9] foo: 'bar'")
+ # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2)
+ w = OSError(0, 'foo', 'bar', 3)
+ self.assertEqual(w.errno, 2)
+ self.assertEqual(w.winerror, 3)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, 'bar')
+ self.assertEqual(str(w), "[WinError 3] foo: 'bar'")
+ # Unknown win error becomes EINVAL (22)
+ w = OSError(0, 'foo', None, 1001)
+ self.assertEqual(w.errno, 22)
+ self.assertEqual(w.winerror, 1001)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, None)
+ self.assertEqual(str(w), "[WinError 1001] foo")
+ # Non-numeric "errno"
+ w = OSError('bar', 'foo')
+ self.assertEqual(w.errno, 'bar')
+ self.assertEqual(w.winerror, None)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, None)
def testAttributes(self):
# test that exception attributes are happy
@@ -272,13 +305,18 @@ class ExceptionTests(unittest.TestCase):
{'args' : ('\u3042', 0, 1, 'ouch'),
'object' : '\u3042', 'reason' : 'ouch',
'start' : 0, 'end' : 1}),
+ (NaiveException, ('foo',),
+ {'args': ('foo',), 'x': 'foo'}),
+ (SlottedNaiveException, ('foo',),
+ {'args': ('foo',), 'x': 'foo'}),
]
try:
+ # More tests are in test_WindowsError
exceptionList.append(
(WindowsError, (1, 'strErrorStr', 'filenameStr'),
{'args' : (1, 'strErrorStr'),
- 'strerror' : 'strErrorStr', 'winerror' : 1,
- 'errno' : 22, 'filename' : 'filenameStr'})
+ 'strerror' : 'strErrorStr', 'winerror' : None,
+ 'errno' : 1, 'filename' : 'filenameStr'})
)
except NameError:
pass
@@ -291,7 +329,8 @@ class ExceptionTests(unittest.TestCase):
raise
else:
# Verify module name
- self.assertEqual(type(e).__module__, 'builtins')
+ if not type(e).__name__.endswith('NaiveException'):
+ self.assertEqual(type(e).__module__, 'builtins')
# Verify no ref leaks in Exc_str()
s = str(e)
for checkArgName in expected:
@@ -362,19 +401,37 @@ class ExceptionTests(unittest.TestCase):
def testChainingAttrs(self):
e = Exception()
- self.assertEqual(e.__context__, None)
- self.assertEqual(e.__cause__, None)
+ self.assertIsNone(e.__context__)
+ self.assertIsNone(e.__cause__)
e = TypeError()
- self.assertEqual(e.__context__, None)
- self.assertEqual(e.__cause__, None)
+ self.assertIsNone(e.__context__)
+ self.assertIsNone(e.__cause__)
class MyException(EnvironmentError):
pass
e = MyException()
- self.assertEqual(e.__context__, None)
- self.assertEqual(e.__cause__, None)
+ self.assertIsNone(e.__context__)
+ self.assertIsNone(e.__cause__)
+
+ def testChainingDescriptors(self):
+ try:
+ raise Exception()
+ except Exception as exc:
+ e = exc
+
+ self.assertIsNone(e.__context__)
+ self.assertIsNone(e.__cause__)
+ self.assertFalse(e.__suppress_context__)
+
+ e.__context__ = NameError()
+ e.__cause__ = None
+ self.assertIsInstance(e.__context__, NameError)
+ self.assertIsNone(e.__cause__)
+ self.assertTrue(e.__suppress_context__)
+ e.__suppress_context__ = False
+ self.assertFalse(e.__suppress_context__)
def testKeywordArgs(self):
# test that builtin exception don't take keyword args,
@@ -389,6 +446,7 @@ class ExceptionTests(unittest.TestCase):
x = DerivedException(fancy_arg=42)
self.assertEqual(x.fancy_arg, 42)
+ @no_tracing
def testInfiniteRecursion(self):
def f():
return f()
@@ -721,6 +779,7 @@ class ExceptionTests(unittest.TestCase):
u.start = 1000
self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997")
+ @no_tracing
def test_badisinstance(self):
# Bug #2542: if issubclass(e, MyException) raises an exception,
# it should be ignored
@@ -831,6 +890,7 @@ class ExceptionTests(unittest.TestCase):
self.fail("MemoryError not raised")
self.assertEqual(wr(), None)
+ @no_tracing
def test_recursion_error_cleanup(self):
# Same test as above, but with "recursion exceeded" errors
class C:
@@ -857,8 +917,35 @@ class ExceptionTests(unittest.TestCase):
self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception)
+class ImportErrorTests(unittest.TestCase):
+
+ def test_attributes(self):
+ # Setting 'name' and 'path' should not be a problem.
+ exc = ImportError('test')
+ self.assertIsNone(exc.name)
+ self.assertIsNone(exc.path)
+
+ exc = ImportError('test', name='somemodule')
+ self.assertEqual(exc.name, 'somemodule')
+ self.assertIsNone(exc.path)
+
+ exc = ImportError('test', path='somepath')
+ self.assertEqual(exc.path, 'somepath')
+ self.assertIsNone(exc.name)
+
+ exc = ImportError('test', path='somepath', name='somename')
+ self.assertEqual(exc.name, 'somename')
+ self.assertEqual(exc.path, 'somepath')
+
+ def test_non_str_argument(self):
+ # Issue #15778
+ arg = b'abc'
+ exc = ImportError(arg)
+ self.assertEqual(str(arg), str(exc))
+
+
def test_main():
- run_unittest(ExceptionTests)
+ run_unittest(ExceptionTests, ImportErrorTests)
if __name__ == '__main__':
unittest.main()
diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py
index 1f7f630..6b6c12d 100644
--- a/Lib/test/test_extcall.py
+++ b/Lib/test/test_extcall.py
@@ -66,17 +66,17 @@ Verify clearing of SF bug #733667
>>> g()
Traceback (most recent call last):
...
- TypeError: g() takes at least 1 argument (0 given)
+ TypeError: g() missing 1 required positional argument: 'x'
>>> g(*())
Traceback (most recent call last):
...
- TypeError: g() takes at least 1 argument (0 given)
+ TypeError: g() missing 1 required positional argument: 'x'
>>> g(*(), **{})
Traceback (most recent call last):
...
- TypeError: g() takes at least 1 argument (0 given)
+ TypeError: g() missing 1 required positional argument: 'x'
>>> g(1)
1 () {}
@@ -151,7 +151,7 @@ What about willful misconduct?
>>> g(1, 2, 3, **{'x': 4, 'y': 5})
Traceback (most recent call last):
...
- TypeError: g() got multiple values for keyword argument 'x'
+ TypeError: g() got multiple values for argument 'x'
>>> f(**{1:2})
Traceback (most recent call last):
@@ -263,29 +263,80 @@ the function call setup. See <http://bugs.python.org/issue2016>.
>>> f(**x)
1 2
-A obscure message:
+Too many arguments:
- >>> def f(a, b):
- ... pass
- >>> f(b=1)
+ >>> def f(): pass
+ >>> f(1)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() takes 0 positional arguments but 1 was given
+ >>> def f(a): pass
+ >>> f(1, 2)
Traceback (most recent call last):
...
- TypeError: f() takes exactly 2 arguments (1 given)
+ TypeError: f() takes 1 positional argument but 2 were given
+ >>> def f(a, b=1): pass
+ >>> f(1, 2, 3)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() takes from 1 to 2 positional arguments but 3 were given
+ >>> def f(*, kw): pass
+ >>> f(1, kw=3)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() takes 0 positional arguments but 1 positional argument (and 1 keyword-only argument) were given
+ >>> def f(*, kw, b): pass
+ >>> f(1, 2, 3, b=3, kw=3)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() takes 0 positional arguments but 3 positional arguments (and 2 keyword-only arguments) were given
+ >>> def f(a, b=2, *, kw): pass
+ >>> f(2, 3, 4, kw=4)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() takes from 1 to 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given
-The number of arguments passed in includes keywords:
+Too few and missing arguments:
- >>> def f(a):
- ... pass
- >>> f(6, a=4, *(1, 2, 3))
+ >>> def f(a): pass
+ >>> f()
Traceback (most recent call last):
...
- TypeError: f() takes exactly 1 positional argument (5 given)
- >>> def f(a, *, kw):
- ... pass
- >>> f(6, 4, kw=4)
+ TypeError: f() missing 1 required positional argument: 'a'
+ >>> def f(a, b): pass
+ >>> f()
Traceback (most recent call last):
...
- TypeError: f() takes exactly 1 positional argument (3 given)
+ TypeError: f() missing 2 required positional arguments: 'a' and 'b'
+ >>> def f(a, b, c): pass
+ >>> f()
+ Traceback (most recent call last):
+ ...
+ TypeError: f() missing 3 required positional arguments: 'a', 'b', and 'c'
+ >>> def f(a, b, c, d, e): pass
+ >>> f()
+ Traceback (most recent call last):
+ ...
+ TypeError: f() missing 5 required positional arguments: 'a', 'b', 'c', 'd', and 'e'
+ >>> def f(a, b=4, c=5, d=5): pass
+ >>> f(c=12, b=9)
+ Traceback (most recent call last):
+ ...
+ TypeError: f() missing 1 required positional argument: 'a'
+
+Same with keyword only args:
+
+ >>> def f(*, w): pass
+ >>> f()
+ Traceback (most recent call last):
+ ...
+ TypeError: f() missing 1 required keyword-only argument: 'w'
+ >>> def f(*, a, b, c, d, e): pass
+ >>> f()
+ Traceback (most recent call last):
+ ...
+ TypeError: f() missing 5 required keyword-only arguments: 'a', 'b', 'c', 'd', and 'e'
+
"""
import sys
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
new file mode 100644
index 0000000..b81b34d
--- /dev/null
+++ b/Lib/test/test_faulthandler.py
@@ -0,0 +1,593 @@
+from contextlib import contextmanager
+import datetime
+import faulthandler
+import os
+import re
+import signal
+import subprocess
+import sys
+from test import support, script_helper
+from test.script_helper import assert_python_ok
+import tempfile
+import unittest
+
+try:
+ import threading
+ HAVE_THREADS = True
+except ImportError:
+ HAVE_THREADS = False
+
+TIMEOUT = 0.5
+
+try:
+ from resource import setrlimit, RLIMIT_CORE, error as resource_error
+except ImportError:
+ prepare_subprocess = None
+else:
+ def prepare_subprocess():
+ # don't create core file
+ try:
+ setrlimit(RLIMIT_CORE, (0, 0))
+ except (ValueError, resource_error):
+ pass
+
+def expected_traceback(lineno1, lineno2, header, min_count=1):
+ regex = header
+ regex += ' File "<string>", line %s in func\n' % lineno1
+ regex += ' File "<string>", line %s in <module>' % lineno2
+ if 1 < min_count:
+ return '^' + (regex + '\n') * (min_count - 1) + regex
+ else:
+ return '^' + regex + '$'
+
+@contextmanager
+def temporary_filename():
+ filename = tempfile.mktemp()
+ try:
+ yield filename
+ finally:
+ support.unlink(filename)
+
+class FaultHandlerTests(unittest.TestCase):
+ def get_output(self, code, filename=None):
+ """
+ Run the specified code in Python (in a new child process) and read the
+ output from the standard error or from a file (if filename is set).
+ Return the output lines as a list.
+
+ Strip the reference count from the standard error for Python debug
+ build, and replace "Current thread 0x00007f8d8fbd9700" by "Current
+ thread XXX".
+ """
+ options = {}
+ if prepare_subprocess:
+ options['preexec_fn'] = prepare_subprocess
+ process = script_helper.spawn_python('-c', code, **options)
+ stdout, stderr = process.communicate()
+ exitcode = process.wait()
+ output = support.strip_python_stderr(stdout)
+ output = output.decode('ascii', 'backslashreplace')
+ if filename:
+ self.assertEqual(output, '')
+ with open(filename, "rb") as fp:
+ output = fp.read()
+ output = output.decode('ascii', 'backslashreplace')
+ output = re.sub('Current thread 0x[0-9a-f]+',
+ 'Current thread XXX',
+ output)
+ return output.splitlines(), exitcode
+
+ def check_fatal_error(self, code, line_number, name_regex,
+ filename=None, all_threads=True, other_regex=None):
+ """
+ Check that the fault handler for fatal errors is enabled and check the
+ traceback from the child process output.
+
+ Raise an error if the output doesn't match the expected format.
+ """
+ if all_threads:
+ header = 'Current thread XXX'
+ else:
+ header = 'Traceback (most recent call first)'
+ regex = """
+^Fatal Python error: {name}
+
+{header}:
+ File "<string>", line {lineno} in <module>
+""".strip()
+ regex = regex.format(
+ lineno=line_number,
+ name=name_regex,
+ header=re.escape(header))
+ if other_regex:
+ regex += '|' + other_regex
+ output, exitcode = self.get_output(code, filename)
+ output = '\n'.join(output)
+ self.assertRegex(output, regex)
+ self.assertNotEqual(exitcode, 0)
+
+ def test_read_null(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._read_null()
+""".strip(),
+ 3,
+ # Issue #12700: Read NULL raises SIGILL on Mac OS X Lion
+ '(?:Segmentation fault|Bus error|Illegal instruction)')
+
+ def test_sigsegv(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._sigsegv()
+""".strip(),
+ 3,
+ 'Segmentation fault')
+
+ def test_sigabrt(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._sigabrt()
+""".strip(),
+ 3,
+ 'Aborted')
+
+ @unittest.skipIf(sys.platform == 'win32',
+ "SIGFPE cannot be caught on Windows")
+ def test_sigfpe(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._sigfpe()
+""".strip(),
+ 3,
+ 'Floating point exception')
+
+ @unittest.skipIf(not hasattr(faulthandler, '_sigbus'),
+ "need faulthandler._sigbus()")
+ def test_sigbus(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._sigbus()
+""".strip(),
+ 3,
+ 'Bus error')
+
+ @unittest.skipIf(not hasattr(faulthandler, '_sigill'),
+ "need faulthandler._sigill()")
+ def test_sigill(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._sigill()
+""".strip(),
+ 3,
+ 'Illegal instruction')
+
+ def test_fatal_error(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler._fatal_error(b'xyz')
+""".strip(),
+ 2,
+ 'xyz')
+
+ @unittest.skipIf(sys.platform.startswith('openbsd') and HAVE_THREADS,
+ "Issue #12868: sigaltstack() doesn't work on "
+ "OpenBSD if Python is compiled with pthread")
+ @unittest.skipIf(not hasattr(faulthandler, '_stack_overflow'),
+ 'need faulthandler._stack_overflow()')
+ def test_stack_overflow(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._stack_overflow()
+""".strip(),
+ 3,
+ '(?:Segmentation fault|Bus error)',
+ other_regex='unable to raise a stack overflow')
+
+ def test_gil_released(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable()
+faulthandler._read_null(True)
+""".strip(),
+ 3,
+ '(?:Segmentation fault|Bus error|Illegal instruction)')
+
+ def test_enable_file(self):
+ with temporary_filename() as filename:
+ self.check_fatal_error("""
+import faulthandler
+output = open({filename}, 'wb')
+faulthandler.enable(output)
+faulthandler._read_null()
+""".strip().format(filename=repr(filename)),
+ 4,
+ '(?:Segmentation fault|Bus error|Illegal instruction)',
+ filename=filename)
+
+ def test_enable_single_thread(self):
+ self.check_fatal_error("""
+import faulthandler
+faulthandler.enable(all_threads=False)
+faulthandler._read_null()
+""".strip(),
+ 3,
+ '(?:Segmentation fault|Bus error|Illegal instruction)',
+ all_threads=False)
+
+ def test_disable(self):
+ code = """
+import faulthandler
+faulthandler.enable()
+faulthandler.disable()
+faulthandler._read_null()
+""".strip()
+ not_expected = 'Fatal Python error'
+ stderr, exitcode = self.get_output(code)
+ stder = '\n'.join(stderr)
+ self.assertTrue(not_expected not in stderr,
+ "%r is present in %r" % (not_expected, stderr))
+ self.assertNotEqual(exitcode, 0)
+
+ def test_is_enabled(self):
+ orig_stderr = sys.stderr
+ try:
+ # regrtest may replace sys.stderr by io.StringIO object, but
+ # faulthandler.enable() requires that sys.stderr has a fileno()
+ # method
+ sys.stderr = sys.__stderr__
+
+ was_enabled = faulthandler.is_enabled()
+ try:
+ faulthandler.enable()
+ self.assertTrue(faulthandler.is_enabled())
+ faulthandler.disable()
+ self.assertFalse(faulthandler.is_enabled())
+ finally:
+ if was_enabled:
+ faulthandler.enable()
+ else:
+ faulthandler.disable()
+ finally:
+ sys.stderr = orig_stderr
+
+ def test_disabled_by_default(self):
+ # By default, the module should be disabled
+ code = "import faulthandler; print(faulthandler.is_enabled())"
+ rc, stdout, stderr = assert_python_ok("-c", code)
+ stdout = (stdout + stderr).strip()
+ self.assertEqual(stdout, b"False")
+
+ def test_sys_xoptions(self):
+ # Test python -X faulthandler
+ code = "import faulthandler; print(faulthandler.is_enabled())"
+ rc, stdout, stderr = assert_python_ok("-X", "faulthandler", "-c", code)
+ stdout = (stdout + stderr).strip()
+ self.assertEqual(stdout, b"True")
+
+ def check_dump_traceback(self, filename):
+ """
+ Explicitly call dump_traceback() function and check its output.
+ Raise an error if the output doesn't match the expected format.
+ """
+ code = """
+import faulthandler
+
+def funcB():
+ if {has_filename}:
+ with open({filename}, "wb") as fp:
+ faulthandler.dump_traceback(fp, all_threads=False)
+ else:
+ faulthandler.dump_traceback(all_threads=False)
+
+def funcA():
+ funcB()
+
+funcA()
+""".strip()
+ code = code.format(
+ filename=repr(filename),
+ has_filename=bool(filename),
+ )
+ if filename:
+ lineno = 6
+ else:
+ lineno = 8
+ expected = [
+ 'Traceback (most recent call first):',
+ ' File "<string>", line %s in funcB' % lineno,
+ ' File "<string>", line 11 in funcA',
+ ' File "<string>", line 13 in <module>'
+ ]
+ trace, exitcode = self.get_output(code, filename)
+ self.assertEqual(trace, expected)
+ self.assertEqual(exitcode, 0)
+
+ def test_dump_traceback(self):
+ self.check_dump_traceback(None)
+
+ def test_dump_traceback_file(self):
+ with temporary_filename() as filename:
+ self.check_dump_traceback(filename)
+
+ def test_truncate(self):
+ maxlen = 500
+ func_name = 'x' * (maxlen + 50)
+ truncated = 'x' * maxlen + '...'
+ code = """
+import faulthandler
+
+def {func_name}():
+ faulthandler.dump_traceback(all_threads=False)
+
+{func_name}()
+""".strip()
+ code = code.format(
+ func_name=func_name,
+ )
+ expected = [
+ 'Traceback (most recent call first):',
+ ' File "<string>", line 4 in %s' % truncated,
+ ' File "<string>", line 6 in <module>'
+ ]
+ trace, exitcode = self.get_output(code)
+ self.assertEqual(trace, expected)
+ self.assertEqual(exitcode, 0)
+
+ @unittest.skipIf(not HAVE_THREADS, 'need threads')
+ def check_dump_traceback_threads(self, filename):
+ """
+ Call explicitly dump_traceback(all_threads=True) and check the output.
+ Raise an error if the output doesn't match the expected format.
+ """
+ code = """
+import faulthandler
+from threading import Thread, Event
+import time
+
+def dump():
+ if {filename}:
+ with open({filename}, "wb") as fp:
+ faulthandler.dump_traceback(fp, all_threads=True)
+ else:
+ faulthandler.dump_traceback(all_threads=True)
+
+class Waiter(Thread):
+ # avoid blocking if the main thread raises an exception.
+ daemon = True
+
+ def __init__(self):
+ Thread.__init__(self)
+ self.running = Event()
+ self.stop = Event()
+
+ def run(self):
+ self.running.set()
+ self.stop.wait()
+
+waiter = Waiter()
+waiter.start()
+waiter.running.wait()
+dump()
+waiter.stop.set()
+waiter.join()
+""".strip()
+ code = code.format(filename=repr(filename))
+ output, exitcode = self.get_output(code, filename)
+ output = '\n'.join(output)
+ if filename:
+ lineno = 8
+ else:
+ lineno = 10
+ regex = """
+^Thread 0x[0-9a-f]+:
+(?: File ".*threading.py", line [0-9]+ in [_a-z]+
+){{1,3}} File "<string>", line 23 in run
+ File ".*threading.py", line [0-9]+ in _bootstrap_inner
+ File ".*threading.py", line [0-9]+ in _bootstrap
+
+Current thread XXX:
+ File "<string>", line {lineno} in dump
+ File "<string>", line 28 in <module>$
+""".strip()
+ regex = regex.format(lineno=lineno)
+ self.assertRegex(output, regex)
+ self.assertEqual(exitcode, 0)
+
+ def test_dump_traceback_threads(self):
+ self.check_dump_traceback_threads(None)
+
+ def test_dump_traceback_threads_file(self):
+ with temporary_filename() as filename:
+ self.check_dump_traceback_threads(filename)
+
+ def _check_dump_traceback_later(self, repeat, cancel, filename, loops):
+ """
+ Check how many times the traceback is written in timeout x 2.5 seconds,
+ or timeout x 3.5 seconds if cancel is True: 1, 2 or 3 times depending
+ on repeat and cancel options.
+
+ Raise an error if the output doesn't match the expect format.
+ """
+ timeout_str = str(datetime.timedelta(seconds=TIMEOUT))
+ code = """
+import faulthandler
+import time
+
+def func(timeout, repeat, cancel, file, loops):
+ for loop in range(loops):
+ faulthandler.dump_traceback_later(timeout, repeat=repeat, file=file)
+ if cancel:
+ faulthandler.cancel_dump_traceback_later()
+ time.sleep(timeout * 5)
+ faulthandler.cancel_dump_traceback_later()
+
+timeout = {timeout}
+repeat = {repeat}
+cancel = {cancel}
+loops = {loops}
+if {has_filename}:
+ file = open({filename}, "wb")
+else:
+ file = None
+func(timeout, repeat, cancel, file, loops)
+if file is not None:
+ file.close()
+""".strip()
+ code = code.format(
+ timeout=TIMEOUT,
+ repeat=repeat,
+ cancel=cancel,
+ loops=loops,
+ has_filename=bool(filename),
+ filename=repr(filename),
+ )
+ trace, exitcode = self.get_output(code, filename)
+ trace = '\n'.join(trace)
+
+ if not cancel:
+ count = loops
+ if repeat:
+ count *= 2
+ header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+:\n' % timeout_str
+ regex = expected_traceback(9, 20, header, min_count=count)
+ self.assertRegex(trace, regex)
+ else:
+ self.assertEqual(trace, '')
+ self.assertEqual(exitcode, 0)
+
+ @unittest.skipIf(not hasattr(faulthandler, 'dump_traceback_later'),
+ 'need faulthandler.dump_traceback_later()')
+ def check_dump_traceback_later(self, repeat=False, cancel=False,
+ file=False, twice=False):
+ if twice:
+ loops = 2
+ else:
+ loops = 1
+ if file:
+ with temporary_filename() as filename:
+ self._check_dump_traceback_later(repeat, cancel,
+ filename, loops)
+ else:
+ self._check_dump_traceback_later(repeat, cancel, None, loops)
+
+ def test_dump_traceback_later(self):
+ self.check_dump_traceback_later()
+
+ def test_dump_traceback_later_repeat(self):
+ self.check_dump_traceback_later(repeat=True)
+
+ def test_dump_traceback_later_cancel(self):
+ self.check_dump_traceback_later(cancel=True)
+
+ def test_dump_traceback_later_file(self):
+ self.check_dump_traceback_later(file=True)
+
+ def test_dump_traceback_later_twice(self):
+ self.check_dump_traceback_later(twice=True)
+
+ @unittest.skipIf(not hasattr(faulthandler, "register"),
+ "need faulthandler.register")
+ def check_register(self, filename=False, all_threads=False,
+ unregister=False, chain=False):
+ """
+ Register a handler displaying the traceback on a user signal. Raise the
+ signal and check the written traceback.
+
+ If chain is True, check that the previous signal handler is called.
+
+ Raise an error if the output doesn't match the expected format.
+ """
+ signum = signal.SIGUSR1
+ code = """
+import faulthandler
+import os
+import signal
+import sys
+
+def func(signum):
+ os.kill(os.getpid(), signum)
+
+def handler(signum, frame):
+ handler.called = True
+handler.called = False
+
+exitcode = 0
+signum = {signum}
+unregister = {unregister}
+chain = {chain}
+
+if {has_filename}:
+ file = open({filename}, "wb")
+else:
+ file = None
+if chain:
+ signal.signal(signum, handler)
+faulthandler.register(signum, file=file,
+ all_threads={all_threads}, chain={chain})
+if unregister:
+ faulthandler.unregister(signum)
+func(signum)
+if chain and not handler.called:
+ if file is not None:
+ output = file
+ else:
+ output = sys.stderr
+ print("Error: signal handler not called!", file=output)
+ exitcode = 1
+if file is not None:
+ file.close()
+sys.exit(exitcode)
+""".strip()
+ code = code.format(
+ filename=repr(filename),
+ has_filename=bool(filename),
+ all_threads=all_threads,
+ signum=signum,
+ unregister=unregister,
+ chain=chain,
+ )
+ trace, exitcode = self.get_output(code, filename)
+ trace = '\n'.join(trace)
+ if not unregister:
+ if all_threads:
+ regex = 'Current thread XXX:\n'
+ else:
+ regex = 'Traceback \(most recent call first\):\n'
+ regex = expected_traceback(7, 28, regex)
+ self.assertRegex(trace, regex)
+ else:
+ self.assertEqual(trace, '')
+ if unregister:
+ self.assertNotEqual(exitcode, 0)
+ else:
+ self.assertEqual(exitcode, 0)
+
+ def test_register(self):
+ self.check_register()
+
+ def test_unregister(self):
+ self.check_register(unregister=True)
+
+ def test_register_file(self):
+ with temporary_filename() as filename:
+ self.check_register(filename=filename)
+
+ def test_register_threads(self):
+ self.check_register(all_threads=True)
+
+ def test_register_chain(self):
+ self.check_register(chain=True)
+
+
+def test_main():
+ support.run_unittest(FaultHandlerTests)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index f312882..1e70641 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -2,18 +2,33 @@
Tests for fileinput module.
Nick Mathewson
'''
-
+import os
+import sys
+import re
+import fileinput
+import collections
+import builtins
import unittest
-from test.support import verbose, TESTFN, run_unittest
-from test.support import unlink as safe_unlink
-import sys, re
+
+try:
+ import bz2
+except ImportError:
+ bz2 = None
+try:
+ import gzip
+except ImportError:
+ gzip = None
+
from io import StringIO
from fileinput import FileInput, hook_encoded
+from test.support import verbose, TESTFN, run_unittest
+from test.support import unlink as safe_unlink
+
+
# The fileinput module has 2 interfaces: the FileInput class which does
# all the work, and a few functions (input, etc.) that use a global _state
-# variable. We only test the FileInput class, since the other functions
-# only provide a thin facade over FileInput.
+# variable.
# Write lines (a list of lines) to temp file number i, and return the
# temp file's name.
@@ -121,7 +136,16 @@ class BufferSizesTests(unittest.TestCase):
self.assertEqual(int(m.group(1)), fi.filelineno())
fi.close()
+class UnconditionallyRaise:
+ def __init__(self, exception_type):
+ self.exception_type = exception_type
+ self.invoked = False
+ def __call__(self, *args, **kwargs):
+ self.invoked = True
+ raise self.exception_type()
+
class FileInputTests(unittest.TestCase):
+
def test_zero_byte_files(self):
t1 = t2 = t3 = t4 = None
try:
@@ -219,17 +243,20 @@ class FileInputTests(unittest.TestCase):
self.fail("FileInput should check openhook for being callable")
except ValueError:
pass
- # XXX The rot13 codec was removed.
- # So this test needs to be changed to use something else.
- # (Or perhaps the API needs to change so we can just pass
- # an encoding rather than using a hook?)
-## try:
-## t1 = writeTmp(1, ["A\nB"], mode="wb")
-## fi = FileInput(files=t1, openhook=hook_encoded("rot13"))
-## lines = list(fi)
-## self.assertEqual(lines, ["N\n", "O"])
-## finally:
-## remove_tempfiles(t1)
+
+ class CustomOpenHook:
+ def __init__(self):
+ self.invoked = False
+ def __call__(self, *args):
+ self.invoked = True
+ return open(*args)
+
+ t = writeTmp(1, ["\n"])
+ self.addCleanup(remove_tempfiles, t)
+ custom_open_hook = CustomOpenHook()
+ with FileInput([t], openhook=custom_open_hook) as fi:
+ fi.readline()
+ self.assertTrue(custom_open_hook.invoked, "openhook not invoked")
def test_context_manager(self):
try:
@@ -254,9 +281,576 @@ class FileInputTests(unittest.TestCase):
finally:
remove_tempfiles(t1)
+ def test_empty_files_list_specified_to_constructor(self):
+ with FileInput(files=[]) as fi:
+ self.assertEqual(fi._files, ('-',))
+
+ def test__getitem__(self):
+ """Tests invoking FileInput.__getitem__() with the current
+ line number"""
+ t = writeTmp(1, ["line1\n", "line2\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t]) as fi:
+ retval1 = fi[0]
+ self.assertEqual(retval1, "line1\n")
+ retval2 = fi[1]
+ self.assertEqual(retval2, "line2\n")
+
+ def test__getitem__invalid_key(self):
+ """Tests invoking FileInput.__getitem__() with an index unequal to
+ the line number"""
+ t = writeTmp(1, ["line1\n", "line2\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t]) as fi:
+ with self.assertRaises(RuntimeError) as cm:
+ fi[1]
+ self.assertEqual(cm.exception.args, ("accessing lines out of order",))
+
+ def test__getitem__eof(self):
+ """Tests invoking FileInput.__getitem__() with the line number but at
+ end-of-input"""
+ t = writeTmp(1, [])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t]) as fi:
+ with self.assertRaises(IndexError) as cm:
+ fi[0]
+ self.assertEqual(cm.exception.args, ("end of input reached",))
+
+ def test_nextfile_oserror_deleting_backup(self):
+ """Tests invoking FileInput.nextfile() when the attempt to delete
+ the backup file would raise OSError. This error is expected to be
+ silently ignored"""
+
+ os_unlink_orig = os.unlink
+ os_unlink_replacement = UnconditionallyRaise(OSError)
+ try:
+ t = writeTmp(1, ["\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t], inplace=True) as fi:
+ next(fi) # make sure the file is opened
+ os.unlink = os_unlink_replacement
+ fi.nextfile()
+ finally:
+ os.unlink = os_unlink_orig
+
+ # sanity check to make sure that our test scenario was actually hit
+ self.assertTrue(os_unlink_replacement.invoked,
+ "os.unlink() was not invoked")
+
+ def test_readline_os_fstat_raises_OSError(self):
+ """Tests invoking FileInput.readline() when os.fstat() raises OSError.
+ This exception should be silently discarded."""
+
+ os_fstat_orig = os.fstat
+ os_fstat_replacement = UnconditionallyRaise(OSError)
+ try:
+ t = writeTmp(1, ["\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t], inplace=True) as fi:
+ os.fstat = os_fstat_replacement
+ fi.readline()
+ finally:
+ os.fstat = os_fstat_orig
+
+ # sanity check to make sure that our test scenario was actually hit
+ self.assertTrue(os_fstat_replacement.invoked,
+ "os.fstat() was not invoked")
+
+ @unittest.skipIf(not hasattr(os, "chmod"), "os.chmod does not exist")
+ def test_readline_os_chmod_raises_OSError(self):
+ """Tests invoking FileInput.readline() when os.chmod() raises OSError.
+ This exception should be silently discarded."""
+
+ os_chmod_orig = os.chmod
+ os_chmod_replacement = UnconditionallyRaise(OSError)
+ try:
+ t = writeTmp(1, ["\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t], inplace=True) as fi:
+ os.chmod = os_chmod_replacement
+ fi.readline()
+ finally:
+ os.chmod = os_chmod_orig
+
+ # sanity check to make sure that our test scenario was actually hit
+ self.assertTrue(os_chmod_replacement.invoked,
+ "os.fstat() was not invoked")
+
+ def test_fileno_when_ValueError_raised(self):
+ class FilenoRaisesValueError(UnconditionallyRaise):
+ def __init__(self):
+ UnconditionallyRaise.__init__(self, ValueError)
+ def fileno(self):
+ self.__call__()
+
+ unconditionally_raise_ValueError = FilenoRaisesValueError()
+ t = writeTmp(1, ["\n"])
+ self.addCleanup(remove_tempfiles, t)
+ with FileInput(files=[t]) as fi:
+ file_backup = fi._file
+ try:
+ fi._file = unconditionally_raise_ValueError
+ result = fi.fileno()
+ finally:
+ fi._file = file_backup # make sure the file gets cleaned up
+
+ # sanity check to make sure that our test scenario was actually hit
+ self.assertTrue(unconditionally_raise_ValueError.invoked,
+ "_file.fileno() was not invoked")
+
+ self.assertEqual(result, -1, "fileno() should return -1")
+
+class MockFileInput:
+ """A class that mocks out fileinput.FileInput for use during unit tests"""
+
+ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
+ mode="r", openhook=None):
+ self.files = files
+ self.inplace = inplace
+ self.backup = backup
+ self.bufsize = bufsize
+ self.mode = mode
+ self.openhook = openhook
+ self._file = None
+ self.invocation_counts = collections.defaultdict(lambda: 0)
+ self.return_values = {}
+
+ def close(self):
+ self.invocation_counts["close"] += 1
+
+ def nextfile(self):
+ self.invocation_counts["nextfile"] += 1
+ return self.return_values["nextfile"]
+
+ def filename(self):
+ self.invocation_counts["filename"] += 1
+ return self.return_values["filename"]
+
+ def lineno(self):
+ self.invocation_counts["lineno"] += 1
+ return self.return_values["lineno"]
+
+ def filelineno(self):
+ self.invocation_counts["filelineno"] += 1
+ return self.return_values["filelineno"]
+
+ def fileno(self):
+ self.invocation_counts["fileno"] += 1
+ return self.return_values["fileno"]
+
+ def isfirstline(self):
+ self.invocation_counts["isfirstline"] += 1
+ return self.return_values["isfirstline"]
+
+ def isstdin(self):
+ self.invocation_counts["isstdin"] += 1
+ return self.return_values["isstdin"]
+
+class BaseFileInputGlobalMethodsTest(unittest.TestCase):
+ """Base class for unit tests for the global function of
+ the fileinput module."""
+
+ def setUp(self):
+ self._orig_state = fileinput._state
+ self._orig_FileInput = fileinput.FileInput
+ fileinput.FileInput = MockFileInput
+
+ def tearDown(self):
+ fileinput.FileInput = self._orig_FileInput
+ fileinput._state = self._orig_state
+
+ def assertExactlyOneInvocation(self, mock_file_input, method_name):
+ # assert that the method with the given name was invoked once
+ actual_count = mock_file_input.invocation_counts[method_name]
+ self.assertEqual(actual_count, 1, method_name)
+ # assert that no other unexpected methods were invoked
+ actual_total_count = len(mock_file_input.invocation_counts)
+ self.assertEqual(actual_total_count, 1)
+
+class Test_fileinput_input(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.input()"""
+
+ def test_state_is_not_None_and_state_file_is_not_None(self):
+ """Tests invoking fileinput.input() when fileinput._state is not None
+ and its _file attribute is also not None. Expect RuntimeError to
+ be raised with a meaningful error message and for fileinput._state
+ to *not* be modified."""
+ instance = MockFileInput()
+ instance._file = object()
+ fileinput._state = instance
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.input()
+ self.assertEqual(("input() already active",), cm.exception.args)
+ self.assertIs(instance, fileinput._state, "fileinput._state")
+
+ def test_state_is_not_None_and_state_file_is_None(self):
+ """Tests invoking fileinput.input() when fileinput._state is not None
+ but its _file attribute *is* None. Expect it to create and return
+ a new fileinput.FileInput object with all method parameters passed
+ explicitly to the __init__() method; also ensure that
+ fileinput._state is set to the returned instance."""
+ instance = MockFileInput()
+ instance._file = None
+ fileinput._state = instance
+ self.do_test_call_input()
+
+ def test_state_is_None(self):
+ """Tests invoking fileinput.input() when fileinput._state is None
+ Expect it to create and return a new fileinput.FileInput object
+ with all method parameters passed explicitly to the __init__()
+ method; also ensure that fileinput._state is set to the returned
+ instance."""
+ fileinput._state = None
+ self.do_test_call_input()
+
+ def do_test_call_input(self):
+ """Tests that fileinput.input() creates a new fileinput.FileInput
+ object, passing the given parameters unmodified to
+ fileinput.FileInput.__init__(). Note that this test depends on the
+ monkey patching of fileinput.FileInput done by setUp()."""
+ files = object()
+ inplace = object()
+ backup = object()
+ bufsize = object()
+ mode = object()
+ openhook = object()
+
+ # call fileinput.input() with different values for each argument
+ result = fileinput.input(files=files, inplace=inplace, backup=backup,
+ bufsize=bufsize,
+ mode=mode, openhook=openhook)
+
+ # ensure fileinput._state was set to the returned object
+ self.assertIs(result, fileinput._state, "fileinput._state")
+
+ # ensure the parameters to fileinput.input() were passed directly
+ # to FileInput.__init__()
+ self.assertIs(files, result.files, "files")
+ self.assertIs(inplace, result.inplace, "inplace")
+ self.assertIs(backup, result.backup, "backup")
+ self.assertIs(bufsize, result.bufsize, "bufsize")
+ self.assertIs(mode, result.mode, "mode")
+ self.assertIs(openhook, result.openhook, "openhook")
+
+class Test_fileinput_close(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.close()"""
+
+ def test_state_is_None(self):
+ """Tests that fileinput.close() does nothing if fileinput._state
+ is None"""
+ fileinput._state = None
+ fileinput.close()
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests that fileinput.close() invokes close() on fileinput._state
+ and sets _state=None"""
+ instance = MockFileInput()
+ fileinput._state = instance
+ fileinput.close()
+ self.assertExactlyOneInvocation(instance, "close")
+ self.assertIsNone(fileinput._state)
+
+class Test_fileinput_nextfile(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.nextfile()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.nextfile() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.nextfile()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.nextfile() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.nextfile() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ nextfile_retval = object()
+ instance = MockFileInput()
+ instance.return_values["nextfile"] = nextfile_retval
+ fileinput._state = instance
+ retval = fileinput.nextfile()
+ self.assertExactlyOneInvocation(instance, "nextfile")
+ self.assertIs(retval, nextfile_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_filename(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.filename()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.filename() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.filename()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.filename() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.filename() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ filename_retval = object()
+ instance = MockFileInput()
+ instance.return_values["filename"] = filename_retval
+ fileinput._state = instance
+ retval = fileinput.filename()
+ self.assertExactlyOneInvocation(instance, "filename")
+ self.assertIs(retval, filename_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_lineno(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.lineno()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.lineno() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.lineno()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.lineno() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.lineno() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ lineno_retval = object()
+ instance = MockFileInput()
+ instance.return_values["lineno"] = lineno_retval
+ fileinput._state = instance
+ retval = fileinput.lineno()
+ self.assertExactlyOneInvocation(instance, "lineno")
+ self.assertIs(retval, lineno_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_filelineno(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.filelineno()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.filelineno() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.filelineno()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.filelineno() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.filelineno() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ filelineno_retval = object()
+ instance = MockFileInput()
+ instance.return_values["filelineno"] = filelineno_retval
+ fileinput._state = instance
+ retval = fileinput.filelineno()
+ self.assertExactlyOneInvocation(instance, "filelineno")
+ self.assertIs(retval, filelineno_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_fileno(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.fileno()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.fileno() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.fileno()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.fileno() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.fileno() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ fileno_retval = object()
+ instance = MockFileInput()
+ instance.return_values["fileno"] = fileno_retval
+ instance.fileno_retval = fileno_retval
+ fileinput._state = instance
+ retval = fileinput.fileno()
+ self.assertExactlyOneInvocation(instance, "fileno")
+ self.assertIs(retval, fileno_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_isfirstline(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.isfirstline()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.isfirstline() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.isfirstline()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.isfirstline() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.isfirstline() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ isfirstline_retval = object()
+ instance = MockFileInput()
+ instance.return_values["isfirstline"] = isfirstline_retval
+ fileinput._state = instance
+ retval = fileinput.isfirstline()
+ self.assertExactlyOneInvocation(instance, "isfirstline")
+ self.assertIs(retval, isfirstline_retval)
+ self.assertIs(fileinput._state, instance)
+
+class Test_fileinput_isstdin(BaseFileInputGlobalMethodsTest):
+ """Unit tests for fileinput.isstdin()"""
+
+ def test_state_is_None(self):
+ """Tests fileinput.isstdin() when fileinput._state is None.
+ Ensure that it raises RuntimeError with a meaningful error message
+ and does not modify fileinput._state"""
+ fileinput._state = None
+ with self.assertRaises(RuntimeError) as cm:
+ fileinput.isstdin()
+ self.assertEqual(("no active input()",), cm.exception.args)
+ self.assertIsNone(fileinput._state)
+
+ def test_state_is_not_None(self):
+ """Tests fileinput.isstdin() when fileinput._state is not None.
+ Ensure that it invokes fileinput._state.isstdin() exactly once,
+ returns whatever it returns, and does not modify fileinput._state
+ to point to a different object."""
+ isstdin_retval = object()
+ instance = MockFileInput()
+ instance.return_values["isstdin"] = isstdin_retval
+ fileinput._state = instance
+ retval = fileinput.isstdin()
+ self.assertExactlyOneInvocation(instance, "isstdin")
+ self.assertIs(retval, isstdin_retval)
+ self.assertIs(fileinput._state, instance)
+
+class InvocationRecorder:
+ def __init__(self):
+ self.invocation_count = 0
+ def __call__(self, *args, **kwargs):
+ self.invocation_count += 1
+ self.last_invocation = (args, kwargs)
+
+class Test_hook_compressed(unittest.TestCase):
+ """Unit tests for fileinput.hook_compressed()"""
+
+ def setUp(self):
+ self.fake_open = InvocationRecorder()
+
+ def test_empty_string(self):
+ self.do_test_use_builtin_open("", 1)
+
+ def test_no_ext(self):
+ self.do_test_use_builtin_open("abcd", 2)
+
+ @unittest.skipUnless(gzip, "Requires gzip and zlib")
+ def test_gz_ext_fake(self):
+ original_open = gzip.open
+ gzip.open = self.fake_open
+ try:
+ result = fileinput.hook_compressed("test.gz", 3)
+ finally:
+ gzip.open = original_open
+
+ self.assertEqual(self.fake_open.invocation_count, 1)
+ self.assertEqual(self.fake_open.last_invocation, (("test.gz", 3), {}))
+
+ @unittest.skipUnless(bz2, "Requires bz2")
+ def test_bz2_ext_fake(self):
+ original_open = bz2.BZ2File
+ bz2.BZ2File = self.fake_open
+ try:
+ result = fileinput.hook_compressed("test.bz2", 4)
+ finally:
+ bz2.BZ2File = original_open
+
+ self.assertEqual(self.fake_open.invocation_count, 1)
+ self.assertEqual(self.fake_open.last_invocation, (("test.bz2", 4), {}))
+
+ def test_blah_ext(self):
+ self.do_test_use_builtin_open("abcd.blah", 5)
+
+ def test_gz_ext_builtin(self):
+ self.do_test_use_builtin_open("abcd.Gz", 6)
+
+ def test_bz2_ext_builtin(self):
+ self.do_test_use_builtin_open("abcd.Bz2", 7)
+
+ def do_test_use_builtin_open(self, filename, mode):
+ original_open = self.replace_builtin_open(self.fake_open)
+ try:
+ result = fileinput.hook_compressed(filename, mode)
+ finally:
+ self.replace_builtin_open(original_open)
+
+ self.assertEqual(self.fake_open.invocation_count, 1)
+ self.assertEqual(self.fake_open.last_invocation,
+ ((filename, mode), {}))
+
+ @staticmethod
+ def replace_builtin_open(new_open_func):
+ original_open = builtins.open
+ builtins.open = new_open_func
+ return original_open
+
+class Test_hook_encoded(unittest.TestCase):
+ """Unit tests for fileinput.hook_encoded()"""
+
+ def test(self):
+ encoding = object()
+ result = fileinput.hook_encoded(encoding)
+
+ fake_open = InvocationRecorder()
+ original_open = builtins.open
+ builtins.open = fake_open
+ try:
+ filename = object()
+ mode = object()
+ open_result = result(filename, mode)
+ finally:
+ builtins.open = original_open
+
+ self.assertEqual(fake_open.invocation_count, 1)
+
+ args, kwargs = fake_open.last_invocation
+ self.assertIs(args[0], filename)
+ self.assertIs(args[1], mode)
+ self.assertIs(kwargs.pop('encoding'), encoding)
+ self.assertFalse(kwargs)
def test_main():
- run_unittest(BufferSizesTests, FileInputTests)
+ run_unittest(
+ BufferSizesTests,
+ FileInputTests,
+ Test_fileinput_input,
+ Test_fileinput_close,
+ Test_fileinput_nextfile,
+ Test_fileinput_filename,
+ Test_fileinput_lineno,
+ Test_fileinput_filelineno,
+ Test_fileinput_fileno,
+ Test_fileinput_isfirstline,
+ Test_fileinput_isstdin,
+ Test_hook_compressed,
+ Test_hook_encoded,
+ )
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index b5bd8d4..0847961 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -2,6 +2,7 @@
import sys
import os
+import io
import errno
import unittest
from array import array
@@ -369,10 +370,10 @@ class OtherFileTests(unittest.TestCase):
self.assertEqual(f.tell(), 10)
f.truncate(5)
self.assertEqual(f.tell(), 10)
- self.assertEqual(f.seek(0, os.SEEK_END), 5)
+ self.assertEqual(f.seek(0, io.SEEK_END), 5)
f.truncate(15)
self.assertEqual(f.tell(), 5)
- self.assertEqual(f.seek(0, os.SEEK_END), 15)
+ self.assertEqual(f.seek(0, io.SEEK_END), 15)
f.close()
def testTruncateOnWindows(self):
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
index 4d7bbba..502292f 100644
--- a/Lib/test/test_float.py
+++ b/Lib/test/test_float.py
@@ -88,7 +88,7 @@ class GeneralFloatCases(unittest.TestCase):
self.assertRaises(ValueError, float, " -0x3.p-1 ")
self.assertRaises(ValueError, float, " +0x3.p-1 ")
self.assertEqual(float(" 25.e-1 "), 2.5)
- self.assertEqual(support.fcmp(float(" .25e-1 "), .025), 0)
+ self.assertAlmostEqual(float(" .25e-1 "), .025)
def test_floatconversion(self):
# Make sure that calls to __float__() work properly
@@ -860,15 +860,18 @@ class InfNanTest(unittest.TestCase):
self.assertEqual(str(1e300 * 1e300 * 0), "nan")
self.assertEqual(str(-1e300 * 1e300 * 0), "nan")
- def notest_float_nan(self):
- self.assertTrue(NAN.is_nan())
- self.assertFalse(INF.is_nan())
- self.assertFalse((0.).is_nan())
+ def test_inf_signs(self):
+ self.assertEqual(copysign(1.0, float('inf')), 1.0)
+ self.assertEqual(copysign(1.0, float('-inf')), -1.0)
+
+ @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
+ "applies only when using short float repr style")
+ def test_nan_signs(self):
+ # When using the dtoa.c code, the sign of float('nan') should
+ # be predictable.
+ self.assertEqual(copysign(1.0, float('nan')), 1.0)
+ self.assertEqual(copysign(1.0, float('-nan')), -1.0)
- def notest_float_inf(self):
- self.assertTrue(INF.is_inf())
- self.assertFalse(NAN.is_inf())
- self.assertFalse((0.).is_inf())
fromHex = float.fromhex
toHex = float.hex
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 7fa950d..b6e2540 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -1,4 +1,5 @@
from test.support import verbose, TestFailed
+import locale
import sys
import test.support as support
import unittest
@@ -263,6 +264,51 @@ class FormatTest(unittest.TestCase):
else:
raise TestFailed('"%*d"%(maxsize, -127) should fail')
+ def test_non_ascii(self):
+ testformat("\u20ac=%f", (1.0,), "\u20ac=1.000000")
+
+ self.assertEqual(format("abc", "\u2007<5"), "abc\u2007\u2007")
+ self.assertEqual(format(123, "\u2007<5"), "123\u2007\u2007")
+ self.assertEqual(format(12.3, "\u2007<6"), "12.3\u2007\u2007")
+ self.assertEqual(format(0j, "\u2007<4"), "0j\u2007\u2007")
+ self.assertEqual(format(1+2j, "\u2007<8"), "(1+2j)\u2007\u2007")
+
+ self.assertEqual(format("abc", "\u2007>5"), "\u2007\u2007abc")
+ self.assertEqual(format(123, "\u2007>5"), "\u2007\u2007123")
+ self.assertEqual(format(12.3, "\u2007>6"), "\u2007\u200712.3")
+ self.assertEqual(format(1+2j, "\u2007>8"), "\u2007\u2007(1+2j)")
+ self.assertEqual(format(0j, "\u2007>4"), "\u2007\u20070j")
+
+ self.assertEqual(format("abc", "\u2007^5"), "\u2007abc\u2007")
+ self.assertEqual(format(123, "\u2007^5"), "\u2007123\u2007")
+ self.assertEqual(format(12.3, "\u2007^6"), "\u200712.3\u2007")
+ self.assertEqual(format(1+2j, "\u2007^8"), "\u2007(1+2j)\u2007")
+ self.assertEqual(format(0j, "\u2007^4"), "\u20070j\u2007")
+
+ def test_locale(self):
+ try:
+ oldloc = locale.setlocale(locale.LC_ALL)
+ locale.setlocale(locale.LC_ALL, '')
+ except locale.Error as err:
+ self.skipTest("Cannot set locale: {}".format(err))
+ try:
+ localeconv = locale.localeconv()
+ sep = localeconv['thousands_sep']
+ point = localeconv['decimal_point']
+
+ text = format(123456789, "n")
+ self.assertIn(sep, text)
+ self.assertEqual(text.replace(sep, ''), '123456789')
+
+ text = format(1234.5, "n")
+ self.assertIn(sep, text)
+ self.assertIn(point, text)
+ self.assertEqual(text.replace(sep, ''), '1234' + point + '5')
+ finally:
+ locale.setlocale(locale.LC_ALL, oldloc)
+
+
+
def test_main():
support.run_unittest(FormatTest)
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 084ae0c..1fad921 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -401,14 +401,10 @@ class FractionTest(unittest.TestCase):
def testMixingWithDecimal(self):
# Decimal refuses mixed arithmetic (but not mixed comparisons)
- self.assertRaisesMessage(
- TypeError,
- "unsupported operand type(s) for +: 'Fraction' and 'Decimal'",
- operator.add, F(3,11), Decimal('3.1415926'))
- self.assertRaisesMessage(
- TypeError,
- "unsupported operand type(s) for +: 'Decimal' and 'Fraction'",
- operator.add, Decimal('3.1415926'), F(3,11))
+ self.assertRaises(TypeError, operator.add,
+ F(3,11), Decimal('3.1415926'))
+ self.assertRaises(TypeError, operator.add,
+ Decimal('3.1415926'), F(3,11))
def testComparisons(self):
self.assertTrue(F(1, 2) < F(2, 3))
diff --git a/Lib/test/test_frozen.py b/Lib/test/test_frozen.py
index 5243ebb..fd6761c 100644
--- a/Lib/test/test_frozen.py
+++ b/Lib/test/test_frozen.py
@@ -5,6 +5,12 @@ import unittest
import sys
class FrozenTests(unittest.TestCase):
+
+ module_attrs = frozenset(['__builtins__', '__cached__', '__doc__',
+ '__loader__', '__name__',
+ '__package__'])
+ package_attrs = frozenset(list(module_attrs) + ['__path__'])
+
def test_frozen(self):
with captured_stdout() as stdout:
try:
@@ -12,7 +18,9 @@ class FrozenTests(unittest.TestCase):
except ImportError as x:
self.fail("import __hello__ failed:" + str(x))
self.assertEqual(__hello__.initialized, True)
- self.assertEqual(len(dir(__hello__)), 7, dir(__hello__))
+ expect = set(self.module_attrs)
+ expect.add('initialized')
+ self.assertEqual(set(dir(__hello__)), expect)
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
with captured_stdout() as stdout:
@@ -21,10 +29,13 @@ class FrozenTests(unittest.TestCase):
except ImportError as x:
self.fail("import __phello__ failed:" + str(x))
self.assertEqual(__phello__.initialized, True)
+ expect = set(self.package_attrs)
+ expect.add('initialized')
if not "__phello__.spam" in sys.modules:
- self.assertEqual(len(dir(__phello__)), 8, dir(__phello__))
+ self.assertEqual(set(dir(__phello__)), expect)
else:
- self.assertEqual(len(dir(__phello__)), 9, dir(__phello__))
+ expect.add('spam')
+ self.assertEqual(set(dir(__phello__)), expect)
self.assertEqual(__phello__.__path__, [__phello__.__name__])
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
@@ -34,8 +45,13 @@ class FrozenTests(unittest.TestCase):
except ImportError as x:
self.fail("import __phello__.spam failed:" + str(x))
self.assertEqual(__phello__.spam.initialized, True)
- self.assertEqual(len(dir(__phello__.spam)), 7)
- self.assertEqual(len(dir(__phello__)), 9)
+ spam_expect = set(self.module_attrs)
+ spam_expect.add('initialized')
+ self.assertEqual(set(dir(__phello__.spam)), spam_expect)
+ phello_expect = set(self.package_attrs)
+ phello_expect.add('initialized')
+ phello_expect.add('spam')
+ self.assertEqual(set(dir(__phello__)), phello_expect)
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
try:
diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
index 71bc23e..299a146 100644
--- a/Lib/test/test_ftplib.py
+++ b/Lib/test/test_ftplib.py
@@ -22,10 +22,25 @@ from test.support import HOST
threading = support.import_module('threading')
# the dummy data returned by server over the data channel when
-# RETR, LIST and NLST commands are issued
+# RETR, LIST, NLST, MLSD commands are issued
RETR_DATA = 'abcde12345\r\n' * 1000
LIST_DATA = 'foo\r\nbar\r\n'
NLST_DATA = 'foo\r\nbar\r\n'
+MLSD_DATA = ("type=cdir;perm=el;unique==keVO1+ZF4; test\r\n"
+ "type=pdir;perm=e;unique==keVO1+d?3; ..\r\n"
+ "type=OS.unix=slink:/foobar;perm=;unique==keVO1+4G4; foobar\r\n"
+ "type=OS.unix=chr-13/29;perm=;unique==keVO1+5G4; device\r\n"
+ "type=OS.unix=blk-11/108;perm=;unique==keVO1+6G4; block\r\n"
+ "type=file;perm=awr;unique==keVO1+8G4; writable\r\n"
+ "type=dir;perm=cpmel;unique==keVO1+7G4; promiscuous\r\n"
+ "type=dir;perm=;unique==keVO1+1t2; no-exec\r\n"
+ "type=file;perm=r;unique==keVO1+EG4; two words\r\n"
+ "type=file;perm=r;unique==keVO1+IH4; leading space\r\n"
+ "type=file;perm=r;unique==keVO1+1G4; file1\r\n"
+ "type=dir;perm=cpmel;unique==keVO1+7G4; incoming\r\n"
+ "type=file;perm=r;unique==keVO1+1G4; file2\r\n"
+ "type=file;perm=r;unique==keVO1+1G4; file3\r\n"
+ "type=file;perm=r;unique==keVO1+1G4; file4\r\n")
class DummyDTPHandler(asynchat.async_chat):
@@ -49,6 +64,11 @@ class DummyDTPHandler(asynchat.async_chat):
self.dtp_conn_closed = True
def push(self, what):
+ if self.baseclass.next_data is not None:
+ what = self.baseclass.next_data
+ self.baseclass.next_data = None
+ if not what:
+ return self.close_when_done()
super(DummyDTPHandler, self).push(what.encode('ascii'))
def handle_error(self):
@@ -69,6 +89,7 @@ class DummyFTPHandler(asynchat.async_chat):
self.last_received_cmd = None
self.last_received_data = ''
self.next_response = ''
+ self.next_data = None
self.rest = None
self.push('220 welcome')
@@ -104,7 +125,7 @@ class DummyFTPHandler(asynchat.async_chat):
addr = list(map(int, arg.split(',')))
ip = '%d.%d.%d.%d' %tuple(addr[:4])
port = (addr[4] * 256) + addr[5]
- s = socket.create_connection((ip, port), timeout=10)
+ s = socket.create_connection((ip, port), timeout=2)
self.dtp = self.dtp_handler(s, baseclass=self)
self.push('200 active data connection established')
@@ -122,7 +143,7 @@ class DummyFTPHandler(asynchat.async_chat):
def cmd_eprt(self, arg):
af, ip, port = arg.split(arg[0])[1:-1]
port = int(port)
- s = socket.create_connection((ip, port), timeout=10)
+ s = socket.create_connection((ip, port), timeout=2)
self.dtp = self.dtp_handler(s, baseclass=self)
self.push('200 active data connection established')
@@ -213,6 +234,14 @@ class DummyFTPHandler(asynchat.async_chat):
self.dtp.push(NLST_DATA)
self.dtp.close_when_done()
+ def cmd_opts(self, arg):
+ self.push('200 opts ok')
+
+ def cmd_mlsd(self, arg):
+ self.push('125 mlsd ok')
+ self.dtp.push(MLSD_DATA)
+ self.dtp.close_when_done()
+
class DummyFTPServer(asyncore.dispatcher, threading.Thread):
@@ -274,11 +303,11 @@ if ssl is not None:
_ssl_closing = False
def secure_connection(self):
- self.del_channel()
socket = ssl.wrap_socket(self.socket, suppress_ragged_eofs=False,
certfile=CERTFILE, server_side=True,
do_handshake_on_connect=False,
ssl_version=ssl.PROTOCOL_SSLv23)
+ self.del_channel()
self.set_socket(socket)
self._ssl_accepting = True
@@ -313,7 +342,10 @@ if ssl is not None:
# http://www.mail-archive.com/openssl-users@openssl.org/msg60710.html
pass
self._ssl_closing = False
- super(SSLConnection, self).close()
+ if getattr(self, '_ccc', False) is False:
+ super(SSLConnection, self).close()
+ else:
+ pass
def handle_read_event(self):
if self._ssl_accepting:
@@ -381,12 +413,18 @@ if ssl is not None:
def __init__(self, conn):
DummyFTPHandler.__init__(self, conn)
self.secure_data_channel = False
+ self._ccc = False
def cmd_auth(self, line):
"""Set up secure control channel."""
self.push('234 AUTH TLS successful')
self.secure_connection()
+ def cmd_ccc(self, line):
+ self.push('220 Reverting back to clear-text')
+ self._ccc = True
+ self._do_ssl_shutdown()
+
def cmd_pbsz(self, line):
"""Negotiate size of buffer for secure data transfer.
For TLS/SSL the only valid value for the parameter is '0'.
@@ -416,13 +454,17 @@ class TestFTPClass(TestCase):
def setUp(self):
self.server = DummyFTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP(timeout=10)
+ self.client = ftplib.FTP(timeout=2)
self.client.connect(self.server.host, self.server.port)
def tearDown(self):
self.client.close()
self.server.stop()
+ def check_data(self, received, expected):
+ self.assertEqual(len(received), len(expected))
+ self.assertEqual(received, expected)
+
def test_getwelcome(self):
self.assertEqual(self.client.getwelcome(), '220 welcome')
@@ -504,7 +546,7 @@ class TestFTPClass(TestCase):
received.append(data.decode('ascii'))
received = []
self.client.retrbinary('retr', callback)
- self.assertEqual(''.join(received), RETR_DATA)
+ self.check_data(''.join(received), RETR_DATA)
def test_retrbinary_rest(self):
def callback(data):
@@ -512,20 +554,17 @@ class TestFTPClass(TestCase):
for rest in (0, 10, 20):
received = []
self.client.retrbinary('retr', callback, rest=rest)
- self.assertEqual(''.join(received), RETR_DATA[rest:],
- msg='rest test case %d %d %d' % (rest,
- len(''.join(received)),
- len(RETR_DATA[rest:])))
+ self.check_data(''.join(received), RETR_DATA[rest:])
def test_retrlines(self):
received = []
self.client.retrlines('retr', received.append)
- self.assertEqual(''.join(received), RETR_DATA.replace('\r\n', ''))
+ self.check_data(''.join(received), RETR_DATA.replace('\r\n', ''))
def test_storbinary(self):
f = io.BytesIO(RETR_DATA.encode('ascii'))
self.client.storbinary('stor', f)
- self.assertEqual(self.server.handler_instance.last_received_data, RETR_DATA)
+ self.check_data(self.server.handler_instance.last_received_data, RETR_DATA)
# test new callback arg
flag = []
f.seek(0)
@@ -542,7 +581,7 @@ class TestFTPClass(TestCase):
def test_storlines(self):
f = io.BytesIO(RETR_DATA.replace('\r\n', '\n').encode('ascii'))
self.client.storlines('stor', f)
- self.assertEqual(self.server.handler_instance.last_received_data, RETR_DATA)
+ self.check_data(self.server.handler_instance.last_received_data, RETR_DATA)
# test new callback arg
flag = []
f.seek(0)
@@ -558,6 +597,64 @@ class TestFTPClass(TestCase):
self.client.dir(lambda x: l.append(x))
self.assertEqual(''.join(l), LIST_DATA.replace('\r\n', ''))
+ def test_mlsd(self):
+ list(self.client.mlsd())
+ list(self.client.mlsd(path='/'))
+ list(self.client.mlsd(path='/', facts=['size', 'type']))
+
+ ls = list(self.client.mlsd())
+ for name, facts in ls:
+ self.assertIsInstance(name, str)
+ self.assertIsInstance(facts, dict)
+ self.assertTrue(name)
+ self.assertIn('type', facts)
+ self.assertIn('perm', facts)
+ self.assertIn('unique', facts)
+
+ def set_data(data):
+ self.server.handler_instance.next_data = data
+
+ def test_entry(line, type=None, perm=None, unique=None, name=None):
+ type = 'type' if type is None else type
+ perm = 'perm' if perm is None else perm
+ unique = 'unique' if unique is None else unique
+ name = 'name' if name is None else name
+ set_data(line)
+ _name, facts = next(self.client.mlsd())
+ self.assertEqual(_name, name)
+ self.assertEqual(facts['type'], type)
+ self.assertEqual(facts['perm'], perm)
+ self.assertEqual(facts['unique'], unique)
+
+ # plain
+ test_entry('type=type;perm=perm;unique=unique; name\r\n')
+ # "=" in fact value
+ test_entry('type=ty=pe;perm=perm;unique=unique; name\r\n', type="ty=pe")
+ test_entry('type==type;perm=perm;unique=unique; name\r\n', type="=type")
+ test_entry('type=t=y=pe;perm=perm;unique=unique; name\r\n', type="t=y=pe")
+ test_entry('type=====;perm=perm;unique=unique; name\r\n', type="====")
+ # spaces in name
+ test_entry('type=type;perm=perm;unique=unique; na me\r\n', name="na me")
+ test_entry('type=type;perm=perm;unique=unique; name \r\n', name="name ")
+ test_entry('type=type;perm=perm;unique=unique; name\r\n', name=" name")
+ test_entry('type=type;perm=perm;unique=unique; n am e\r\n', name="n am e")
+ # ";" in name
+ test_entry('type=type;perm=perm;unique=unique; na;me\r\n', name="na;me")
+ test_entry('type=type;perm=perm;unique=unique; ;name\r\n', name=";name")
+ test_entry('type=type;perm=perm;unique=unique; ;name;\r\n', name=";name;")
+ test_entry('type=type;perm=perm;unique=unique; ;;;;\r\n', name=";;;;")
+ # case sensitiveness
+ set_data('Type=type;TyPe=perm;UNIQUE=unique; name\r\n')
+ _name, facts = next(self.client.mlsd())
+ for x in facts:
+ self.assertTrue(x.islower())
+ # no data (directory empty)
+ set_data('')
+ self.assertRaises(StopIteration, next, self.client.mlsd())
+ set_data('')
+ for x in self.client.mlsd():
+ self.fail("unexpected data %s" % data)
+
def test_makeport(self):
with self.client.makeport():
# IPv4 is in use, just make sure send_eprt has not been used
@@ -584,7 +681,7 @@ class TestFTPClass(TestCase):
return True
# base test
- with ftplib.FTP(timeout=10) as self.client:
+ with ftplib.FTP(timeout=2) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.assertTrue(is_client_connected())
@@ -592,7 +689,7 @@ class TestFTPClass(TestCase):
self.assertFalse(is_client_connected())
# QUIT sent inside the with block
- with ftplib.FTP(timeout=10) as self.client:
+ with ftplib.FTP(timeout=2) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.client.quit()
@@ -602,7 +699,7 @@ class TestFTPClass(TestCase):
# force a wrong response code to be sent on QUIT: error_perm
# is expected and the connection is supposed to be closed
try:
- with ftplib.FTP(timeout=10) as self.client:
+ with ftplib.FTP(timeout=2) as self.client:
self.client.connect(self.server.host, self.server.port)
self.client.sendcmd('noop')
self.server.handler_instance.next_response = '550 error on quit'
@@ -616,6 +713,30 @@ class TestFTPClass(TestCase):
self.assertEqual(self.server.handler_instance.last_received_cmd, 'quit')
self.assertFalse(is_client_connected())
+ def test_source_address(self):
+ self.client.quit()
+ port = support.find_unused_port()
+ try:
+ self.client.connect(self.server.host, self.server.port,
+ source_address=(HOST, port))
+ self.assertEqual(self.client.sock.getsockname()[1], port)
+ self.client.quit()
+ except IOError as e:
+ if e.errno == errno.EADDRINUSE:
+ self.skipTest("couldn't bind to port %d" % port)
+ raise
+
+ def test_source_address_passive_connection(self):
+ port = support.find_unused_port()
+ self.client.source_address = (HOST, port)
+ try:
+ with self.client.transfercmd('list') as sock:
+ self.assertEqual(sock.getsockname()[1], port)
+ except IOError as e:
+ if e.errno == errno.EADDRINUSE:
+ self.skipTest("couldn't bind to port %d" % port)
+ raise
+
def test_parse257(self):
self.assertEqual(ftplib.parse257('257 "/foo/bar"'), '/foo/bar')
self.assertEqual(ftplib.parse257('257 "/foo/bar" created'), '/foo/bar')
@@ -632,7 +753,7 @@ class TestFTPClass(TestCase):
class TestIPv6Environment(TestCase):
def setUp(self):
- self.server = DummyFTPServer((HOST, 0), af=socket.AF_INET6)
+ self.server = DummyFTPServer(('::1', 0), af=socket.AF_INET6)
self.server.start()
self.client = ftplib.FTP()
self.client.connect(self.server.host, self.server.port)
@@ -661,6 +782,7 @@ class TestIPv6Environment(TestCase):
received.append(data.decode('ascii'))
received = []
self.client.retrbinary('retr', callback)
+ self.assertEqual(len(''.join(received)), len(RETR_DATA))
self.assertEqual(''.join(received), RETR_DATA)
self.client.set_pasv(True)
retr()
@@ -676,7 +798,7 @@ class TestTLS_FTPClassMixin(TestFTPClass):
def setUp(self):
self.server = DummyTLS_FTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP_TLS(timeout=10)
+ self.client = ftplib.FTP_TLS(timeout=2)
self.client.connect(self.server.host, self.server.port)
# enable TLS
self.client.auth()
@@ -689,7 +811,7 @@ class TestTLS_FTPClass(TestCase):
def setUp(self):
self.server = DummyTLS_FTPServer((HOST, 0))
self.server.start()
- self.client = ftplib.FTP_TLS(timeout=10)
+ self.client = ftplib.FTP_TLS(timeout=2)
self.client.connect(self.server.host, self.server.port)
def tearDown(self):
@@ -749,7 +871,7 @@ class TestTLS_FTPClass(TestCase):
self.assertRaises(ValueError, ftplib.FTP_TLS, certfile=CERTFILE,
keyfile=CERTFILE, context=ctx)
- self.client = ftplib.FTP_TLS(context=ctx, timeout=10)
+ self.client = ftplib.FTP_TLS(context=ctx, timeout=2)
self.client.connect(self.server.host, self.server.port)
self.assertNotIsInstance(self.client.sock, ssl.SSLSocket)
self.client.auth()
@@ -761,6 +883,13 @@ class TestTLS_FTPClass(TestCase):
self.assertIs(sock.context, ctx)
self.assertIsInstance(sock, ssl.SSLSocket)
+ def test_ccc(self):
+ self.assertRaises(ValueError, self.client.ccc)
+ self.client.login(secure=True)
+ self.assertIsInstance(self.client.sock, ssl.SSLSocket)
+ self.client.ccc()
+ self.assertRaises(ValueError, self.client.sock.unwrap)
+
class TestTimeouts(TestCase):
@@ -857,13 +986,8 @@ class TestTimeouts(TestCase):
def test_main():
tests = [TestFTPClass, TestTimeouts]
- if socket.has_ipv6:
- try:
- DummyFTPServer((HOST, 0), af=socket.AF_INET6)
- except socket.error:
- pass
- else:
- tests.append(TestIPv6Environment)
+ if support.IPV6_ENABLED:
+ tests.append(TestIPv6Environment)
if ssl is not None:
tests.extend([TestTLS_FTPClassMixin, TestTLS_FTPClass])
diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py
index 4d19368..c8ed830 100644
--- a/Lib/test/test_funcattrs.py
+++ b/Lib/test/test_funcattrs.py
@@ -2,6 +2,15 @@ from test import support
import types
import unittest
+
+def global_function():
+ def inner_function():
+ class LocalClass:
+ pass
+ return LocalClass
+ return lambda: inner_function
+
+
class FuncAttrsTest(unittest.TestCase):
def setUp(self):
class F:
@@ -96,6 +105,24 @@ class FunctionPropertiesTest(FuncAttrsTest):
self.assertEqual(self.fi.a.__name__, 'a')
self.cannot_set_attr(self.fi.a, "__name__", 'a', AttributeError)
+ def test___qualname__(self):
+ # PEP 3155
+ self.assertEqual(self.b.__qualname__, 'FuncAttrsTest.setUp.<locals>.b')
+ self.assertEqual(FuncAttrsTest.setUp.__qualname__, 'FuncAttrsTest.setUp')
+ self.assertEqual(global_function.__qualname__, 'global_function')
+ self.assertEqual(global_function().__qualname__,
+ 'global_function.<locals>.<lambda>')
+ self.assertEqual(global_function()().__qualname__,
+ 'global_function.<locals>.inner_function')
+ self.assertEqual(global_function()()().__qualname__,
+ 'global_function.<locals>.inner_function.<locals>.LocalClass')
+ self.b.__qualname__ = 'c'
+ self.assertEqual(self.b.__qualname__, 'c')
+ self.b.__qualname__ = 'd'
+ self.assertEqual(self.b.__qualname__, 'd')
+ # __qualname__ must be a string
+ self.cannot_set_attr(self.b, '__qualname__', 7, TypeError)
+
def test___code__(self):
num_one, num_two = 7, 8
def a(): pass
@@ -315,11 +342,37 @@ class StaticMethodAttrsTest(unittest.TestCase):
self.assertTrue(s.__func__ is f)
+class BuiltinFunctionPropertiesTest(unittest.TestCase):
+ # XXX Not sure where this should really go since I can't find a
+ # test module specifically for builtin_function_or_method.
+
+ def test_builtin__qualname__(self):
+ import time
+
+ # builtin function:
+ self.assertEqual(len.__qualname__, 'len')
+ self.assertEqual(time.time.__qualname__, 'time')
+
+ # builtin classmethod:
+ self.assertEqual(dict.fromkeys.__qualname__, 'dict.fromkeys')
+ self.assertEqual(float.__getformat__.__qualname__,
+ 'float.__getformat__')
+
+ # builtin staticmethod:
+ self.assertEqual(str.maketrans.__qualname__, 'str.maketrans')
+ self.assertEqual(bytes.maketrans.__qualname__, 'bytes.maketrans')
+
+ # builtin bound instance method:
+ self.assertEqual([1, 2, 3].append.__qualname__, 'list.append')
+ self.assertEqual({'foo': 'bar'}.pop.__qualname__, 'dict.pop')
+
+
def test_main():
support.run_unittest(FunctionPropertiesTest, InstancemethodAttrTest,
ArbitraryFunctionAttrTest, FunctionDictsTest,
FunctionDocstringTest, CellTest,
- StaticMethodAttrsTest)
+ StaticMethodAttrsTest,
+ BuiltinFunctionPropertiesTest)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 270cab0..c4910a7 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -226,6 +226,7 @@ class TestUpdateWrapper(unittest.TestCase):
self.check_wrapper(wrapper, f)
self.assertIs(wrapper.__wrapped__, f)
self.assertEqual(wrapper.__name__, 'f')
+ self.assertEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.attr, 'This is also a test')
self.assertEqual(wrapper.__annotations__['a'], 'This is a new annotation')
self.assertNotIn('b', wrapper.__annotations__)
@@ -246,6 +247,7 @@ class TestUpdateWrapper(unittest.TestCase):
functools.update_wrapper(wrapper, f, (), ())
self.check_wrapper(wrapper, f, (), ())
self.assertEqual(wrapper.__name__, 'wrapper')
+ self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.__annotations__, {})
self.assertFalse(hasattr(wrapper, 'attr'))
@@ -263,6 +265,7 @@ class TestUpdateWrapper(unittest.TestCase):
functools.update_wrapper(wrapper, f, assign, update)
self.check_wrapper(wrapper, f, assign, update)
self.assertEqual(wrapper.__name__, 'wrapper')
+ self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr)
@@ -309,17 +312,18 @@ class TestWraps(TestUpdateWrapper):
def wrapper():
pass
self.check_wrapper(wrapper, f)
- return wrapper
+ return wrapper, f
def test_default_update(self):
- wrapper = self._default_update()
+ wrapper, f = self._default_update()
self.assertEqual(wrapper.__name__, 'f')
+ self.assertEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.attr, 'This is also a test')
@unittest.skipIf(not sys.flags.optimize <= 1,
"Docstrings are omitted with -O2 and above")
def test_default_update_doc(self):
- wrapper = self._default_update()
+ wrapper, _ = self._default_update()
self.assertEqual(wrapper.__doc__, 'This is a test')
def test_no_update(self):
@@ -332,6 +336,7 @@ class TestWraps(TestUpdateWrapper):
pass
self.check_wrapper(wrapper, f, (), ())
self.assertEqual(wrapper.__name__, 'wrapper')
+ self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None)
self.assertFalse(hasattr(wrapper, 'attr'))
@@ -351,6 +356,7 @@ class TestWraps(TestUpdateWrapper):
pass
self.check_wrapper(wrapper, f, assign, update)
self.assertEqual(wrapper.__name__, 'wrapper')
+ self.assertNotEqual(wrapper.__qualname__, f.__qualname__)
self.assertEqual(wrapper.__doc__, None)
self.assertEqual(wrapper.attr, 'This is a different test')
self.assertEqual(wrapper.dict_attr, f.dict_attr)
@@ -436,19 +442,82 @@ class TestReduce(unittest.TestCase):
self.assertEqual(self.func(add, d), "".join(d.keys()))
class TestCmpToKey(unittest.TestCase):
+
def test_cmp_to_key(self):
+ def cmp1(x, y):
+ return (x > y) - (x < y)
+ key = functools.cmp_to_key(cmp1)
+ self.assertEqual(key(3), key(3))
+ self.assertGreater(key(3), key(1))
+ def cmp2(x, y):
+ return int(x) - int(y)
+ key = functools.cmp_to_key(cmp2)
+ self.assertEqual(key(4.0), key('4'))
+ self.assertLess(key(2), key('35'))
+
+ def test_cmp_to_key_arguments(self):
+ def cmp1(x, y):
+ return (x > y) - (x < y)
+ key = functools.cmp_to_key(mycmp=cmp1)
+ self.assertEqual(key(obj=3), key(obj=3))
+ self.assertGreater(key(obj=3), key(obj=1))
+ with self.assertRaises((TypeError, AttributeError)):
+ key(3) > 1 # rhs is not a K object
+ with self.assertRaises((TypeError, AttributeError)):
+ 1 < key(3) # lhs is not a K object
+ with self.assertRaises(TypeError):
+ key = functools.cmp_to_key() # too few args
+ with self.assertRaises(TypeError):
+ key = functools.cmp_to_key(cmp1, None) # too many args
+ key = functools.cmp_to_key(cmp1)
+ with self.assertRaises(TypeError):
+ key() # too few args
+ with self.assertRaises(TypeError):
+ key(None, None) # too many args
+
+ def test_bad_cmp(self):
+ def cmp1(x, y):
+ raise ZeroDivisionError
+ key = functools.cmp_to_key(cmp1)
+ with self.assertRaises(ZeroDivisionError):
+ key(3) > key(1)
+
+ class BadCmp:
+ def __lt__(self, other):
+ raise ZeroDivisionError
+ def cmp1(x, y):
+ return BadCmp()
+ with self.assertRaises(ZeroDivisionError):
+ key(3) > key(1)
+
+ def test_obj_field(self):
+ def cmp1(x, y):
+ return (x > y) - (x < y)
+ key = functools.cmp_to_key(mycmp=cmp1)
+ self.assertEqual(key(50).obj, 50)
+
+ def test_sort_int(self):
def mycmp(x, y):
return y - x
self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)),
[4, 3, 2, 1, 0])
+ def test_sort_int_str(self):
+ def mycmp(x, y):
+ x, y = int(x), int(y)
+ return (x > y) - (x < y)
+ values = [5, '3', 7, 2, '0', '1', 4, '10', 1]
+ values = sorted(values, key=functools.cmp_to_key(mycmp))
+ self.assertEqual([int(value) for value in values],
+ [0, 1, 1, 2, 3, 4, 5, 7, 10])
+
def test_hash(self):
def mycmp(x, y):
return y - x
key = functools.cmp_to_key(mycmp)
k = key(10)
self.assertRaises(TypeError, hash, k)
- self.assertFalse(isinstance(k, collections.Hashable))
+ self.assertNotIsInstance(k, collections.Hashable)
class TestTotalOrdering(unittest.TestCase):
@@ -671,6 +740,22 @@ class TestLRU(unittest.TestCase):
with self.assertRaises(IndexError):
func(15)
+ def test_lru_with_types(self):
+ for maxsize in (None, 100):
+ @functools.lru_cache(maxsize=maxsize, typed=True)
+ def square(x):
+ return x * x
+ self.assertEqual(square(3), 9)
+ self.assertEqual(type(square(3)), type(9))
+ self.assertEqual(square(3.0), 9.0)
+ self.assertEqual(type(square(3.0)), type(9.0))
+ self.assertEqual(square(x=3), 9)
+ self.assertEqual(type(square(x=3)), type(9))
+ self.assertEqual(square(x=3.0), 9.0)
+ self.assertEqual(type(square(x=3.0)), type(9.0))
+ self.assertEqual(square.cache_info().hits, 4)
+ self.assertEqual(square.cache_info().misses, 4)
+
def test_main(verbose=None):
test_classes = (
TestPartial,
diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py
index c6689a1..3a25eb1 100644
--- a/Lib/test/test_future.py
+++ b/Lib/test/test_future.py
@@ -13,14 +13,14 @@ def get_error_location(msg):
class FutureTest(unittest.TestCase):
def test_future1(self):
- support.unload('test_future1')
- from test import test_future1
- self.assertEqual(test_future1.result, 6)
+ support.unload('future_test1')
+ from test import future_test1
+ self.assertEqual(future_test1.result, 6)
def test_future2(self):
- support.unload('test_future2')
- from test import test_future2
- self.assertEqual(test_future2.result, 6)
+ support.unload('future_test2')
+ from test import future_test2
+ self.assertEqual(future_test2.result, 6)
def test_future3(self):
support.unload('test_future3')
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index e1c124d..c59b72e 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,5 +1,6 @@
import unittest
-from test.support import verbose, run_unittest, strip_python_stderr
+from test.support import (verbose, refcount_test, run_unittest,
+ strip_python_stderr)
import sys
import time
import gc
@@ -37,6 +38,20 @@ class GC_Detector(object):
# gc collects it.
self.wr = weakref.ref(C1055820(666), it_happened)
+class Uncollectable(object):
+ """Create a reference cycle with multiple __del__ methods.
+
+ An object in a reference cycle will never have zero references,
+ and so must be garbage collected. If one or more objects in the
+ cycle have __del__ methods, the gc refuses to guess an order,
+ and leaves the cycle uncollected."""
+ def __init__(self, partner=None):
+ if partner is None:
+ self.partner = Uncollectable(partner=self)
+ else:
+ self.partner = partner
+ def __del__(self):
+ pass
### Tests
###############################################################################
@@ -181,6 +196,7 @@ class GCTests(unittest.TestCase):
del d
self.assertEqual(gc.collect(), 2)
+ @refcount_test
def test_frame(self):
def f():
frame = sys._getframe()
@@ -248,6 +264,7 @@ class GCTests(unittest.TestCase):
# For example, disposed tuples are not freed, but reused.
# To minimize variations, though, we first store the get_count() results
# and check them at the end.
+ @refcount_test
def test_get_count(self):
gc.collect()
a, b, c = gc.get_count()
@@ -261,6 +278,7 @@ class GCTests(unittest.TestCase):
# created (the list).
self.assertGreater(d, a)
+ @refcount_test
def test_collect_generations(self):
gc.collect()
# This object will "trickle" into generation N + 1 after
@@ -593,6 +611,127 @@ class GCTests(unittest.TestCase):
self.assertNotIn(b"uncollectable objects at shutdown", stderr)
+class GCCallbackTests(unittest.TestCase):
+ def setUp(self):
+ # Save gc state and disable it.
+ self.enabled = gc.isenabled()
+ gc.disable()
+ self.debug = gc.get_debug()
+ gc.set_debug(0)
+ gc.callbacks.append(self.cb1)
+ gc.callbacks.append(self.cb2)
+ self.othergarbage = []
+
+ def tearDown(self):
+ # Restore gc state
+ del self.visit
+ gc.callbacks.remove(self.cb1)
+ gc.callbacks.remove(self.cb2)
+ gc.set_debug(self.debug)
+ if self.enabled:
+ gc.enable()
+ # destroy any uncollectables
+ gc.collect()
+ for obj in gc.garbage:
+ if isinstance(obj, Uncollectable):
+ obj.partner = None
+ del gc.garbage[:]
+ del self.othergarbage
+ gc.collect()
+
+ def preclean(self):
+ # Remove all fluff from the system. Invoke this function
+ # manually rather than through self.setUp() for maximum
+ # safety.
+ self.visit = []
+ gc.collect()
+ garbage, gc.garbage[:] = gc.garbage[:], []
+ self.othergarbage.append(garbage)
+ self.visit = []
+
+ def cb1(self, phase, info):
+ self.visit.append((1, phase, dict(info)))
+
+ def cb2(self, phase, info):
+ self.visit.append((2, phase, dict(info)))
+ if phase == "stop" and hasattr(self, "cleanup"):
+ # Clean Uncollectable from garbage
+ uc = [e for e in gc.garbage if isinstance(e, Uncollectable)]
+ gc.garbage[:] = [e for e in gc.garbage
+ if not isinstance(e, Uncollectable)]
+ for e in uc:
+ e.partner = None
+
+ def test_collect(self):
+ self.preclean()
+ gc.collect()
+ # Algorithmically verify the contents of self.visit
+ # because it is long and tortuous.
+
+ # Count the number of visits to each callback
+ n = [v[0] for v in self.visit]
+ n1 = [i for i in n if i == 1]
+ n2 = [i for i in n if i == 2]
+ self.assertEqual(n1, [1]*2)
+ self.assertEqual(n2, [2]*2)
+
+ # Count that we got the right number of start and stop callbacks.
+ n = [v[1] for v in self.visit]
+ n1 = [i for i in n if i == "start"]
+ n2 = [i for i in n if i == "stop"]
+ self.assertEqual(n1, ["start"]*2)
+ self.assertEqual(n2, ["stop"]*2)
+
+ # Check that we got the right info dict for all callbacks
+ for v in self.visit:
+ info = v[2]
+ self.assertTrue("generation" in info)
+ self.assertTrue("collected" in info)
+ self.assertTrue("uncollectable" in info)
+
+ def test_collect_generation(self):
+ self.preclean()
+ gc.collect(2)
+ for v in self.visit:
+ info = v[2]
+ self.assertEqual(info["generation"], 2)
+
+ def test_collect_garbage(self):
+ self.preclean()
+ # Each of these cause four objects to be garbage: Two
+ # Uncolectables and their instance dicts.
+ Uncollectable()
+ Uncollectable()
+ C1055820(666)
+ gc.collect()
+ for v in self.visit:
+ if v[1] != "stop":
+ continue
+ info = v[2]
+ self.assertEqual(info["collected"], 2)
+ self.assertEqual(info["uncollectable"], 8)
+
+ # We should now have the Uncollectables in gc.garbage
+ self.assertEqual(len(gc.garbage), 4)
+ for e in gc.garbage:
+ self.assertIsInstance(e, Uncollectable)
+
+ # Now, let our callback handle the Uncollectable instances
+ self.cleanup=True
+ self.visit = []
+ gc.garbage[:] = []
+ gc.collect()
+ for v in self.visit:
+ if v[1] != "stop":
+ continue
+ info = v[2]
+ self.assertEqual(info["collected"], 0)
+ self.assertEqual(info["uncollectable"], 4)
+
+ # Uncollectables should be gone
+ self.assertEqual(len(gc.garbage), 0)
+
+
class GCTogglingTests(unittest.TestCase):
def setUp(self):
gc.enable()
@@ -746,7 +885,7 @@ def test_main():
try:
gc.collect() # Delete 2nd generation garbage
- run_unittest(GCTests, GCTogglingTests)
+ run_unittest(GCTests, GCTogglingTests, GCCallbackTests)
finally:
gc.set_debug(debug)
# test gc.enable() even if GC is disabled by default
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index 6d96550..9713dc9 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -7,9 +7,16 @@ import os
import re
import subprocess
import sys
+import sysconfig
import unittest
import locale
+# Is this Python configured to support threads?
+try:
+ import _thread
+except ImportError:
+ _thread = None
+
from test.support import run_unittest, findfile, python_is_optimized
try:
@@ -26,6 +33,9 @@ if gdb_major_version < 7:
raise unittest.SkipTest("gdb versions before 7.0 didn't support python embedding"
" Saw:\n" + gdb_version.decode('ascii', 'replace'))
+if not sysconfig.is_python_build():
+ raise unittest.SkipTest("test_gdb only works on source builds at the moment.")
+
# Location of custom hooks file in a repository checkout.
checkout_hook_path = os.path.join(os.path.dirname(sys.executable),
'python-gdb.py')
@@ -53,9 +63,7 @@ gdbpy_version, _ = run_gdb("--eval-command=python import sys; print sys.version_
if not gdbpy_version:
raise unittest.SkipTest("gdb not built with embedded python support")
-# Verify that "gdb" can load our custom hooks. In theory this should never
-# fail, but we don't handle the case of the hooks file not existing if the
-# tests are run from an installed Python (we'll produce failures in that case).
+# Verify that "gdb" can load our custom hooks. In theory this should never fail.
cmd = ['--args', sys.executable]
_, gdbpy_errors = run_gdb('--args', sys.executable)
if "auto-loading has been declined" in gdbpy_errors:
@@ -160,7 +168,6 @@ class DebuggerTests(unittest.TestCase):
# Ensure no unexpected error messages:
self.assertEqual(err, '')
-
return out
def get_gdb_repr(self, source,
@@ -181,7 +188,7 @@ class DebuggerTests(unittest.TestCase):
# gdb can insert additional '\n' and space characters in various places
# in its output, depending on the width of the terminal it's connected
# to (using its "wrap_here" function)
- m = re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+Python/bltinmodule.c.*',
+ m = re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
gdb_output, re.DOTALL)
if not m:
self.fail('Unexpected gdb output: %r\n%s' % (gdb_output, gdb_output))
@@ -343,7 +350,7 @@ class Foo:
foo = Foo()
foo.an_int = 42
id(foo)''')
- m = re.match(r'<Foo\(an_int=42\) at remote 0x[0-9a-f]+>', gdb_repr)
+ m = re.match(r'<Foo\(an_int=42\) at remote 0x-?[0-9a-f]+>', gdb_repr)
self.assertTrue(m,
msg='Unexpected new-style class rendering %r' % gdb_repr)
@@ -356,7 +363,7 @@ foo = Foo()
foo += [1, 2, 3]
foo.an_int = 42
id(foo)''')
- m = re.match(r'<Foo\(an_int=42\) at remote 0x[0-9a-f]+>', gdb_repr)
+ m = re.match(r'<Foo\(an_int=42\) at remote 0x-?[0-9a-f]+>', gdb_repr)
self.assertTrue(m,
msg='Unexpected new-style class rendering %r' % gdb_repr)
@@ -371,7 +378,7 @@ class Foo(tuple):
foo = Foo((1, 2, 3))
foo.an_int = 42
id(foo)''')
- m = re.match(r'<Foo\(an_int=42\) at remote 0x[0-9a-f]+>', gdb_repr)
+ m = re.match(r'<Foo\(an_int=42\) at remote 0x-?[0-9a-f]+>', gdb_repr)
self.assertTrue(m,
msg='Unexpected new-style class rendering %r' % gdb_repr)
@@ -398,7 +405,7 @@ id(foo)''')
# Match anything for the type name; 0xDEADBEEF could point to
# something arbitrary (see http://bugs.python.org/issue8330)
- pattern = '<.* at remote 0x[0-9a-f]+>'
+ pattern = '<.* at remote 0x-?[0-9a-f]+>'
m = re.match(pattern, gdb_repr)
if not m:
@@ -444,7 +451,7 @@ id(foo)''')
# http://bugs.python.org/issue8032#msg100537 )
gdb_repr, gdb_output = self.get_gdb_repr('id(__builtins__.help)', import_site=True)
- m = re.match(r'<_Helper at remote 0x[0-9a-f]+>', gdb_repr)
+ m = re.match(r'<_Helper at remote 0x-?[0-9a-f]+>', gdb_repr)
self.assertTrue(m,
msg='Unexpected rendering %r' % gdb_repr)
@@ -475,7 +482,7 @@ class Foo:
foo = Foo()
foo.an_attr = foo
id(foo)''')
- self.assertTrue(re.match('<Foo\(an_attr=<\.\.\.>\) at remote 0x[0-9a-f]+>',
+ self.assertTrue(re.match('<Foo\(an_attr=<\.\.\.>\) at remote 0x-?[0-9a-f]+>',
gdb_repr),
'Unexpected gdb representation: %r\n%s' % \
(gdb_repr, gdb_output))
@@ -488,7 +495,7 @@ class Foo(object):
foo = Foo()
foo.an_attr = foo
id(foo)''')
- self.assertTrue(re.match('<Foo\(an_attr=<\.\.\.>\) at remote 0x[0-9a-f]+>',
+ self.assertTrue(re.match('<Foo\(an_attr=<\.\.\.>\) at remote 0x-?[0-9a-f]+>',
gdb_repr),
'Unexpected gdb representation: %r\n%s' % \
(gdb_repr, gdb_output))
@@ -502,7 +509,7 @@ b = Foo()
a.an_attr = b
b.an_attr = a
id(a)''')
- self.assertTrue(re.match('<Foo\(an_attr=<Foo\(an_attr=<\.\.\.>\) at remote 0x[0-9a-f]+>\) at remote 0x[0-9a-f]+>',
+ self.assertTrue(re.match('<Foo\(an_attr=<Foo\(an_attr=<\.\.\.>\) at remote 0x-?[0-9a-f]+>\) at remote 0x-?[0-9a-f]+>',
gdb_repr),
'Unexpected gdb representation: %r\n%s' % \
(gdb_repr, gdb_output))
@@ -537,7 +544,7 @@ id(a)''')
def test_builtin_method(self):
gdb_repr, gdb_output = self.get_gdb_repr('import sys; id(sys.stdout.readlines)')
- self.assertTrue(re.match('<built-in method readlines of _io.TextIOWrapper object at remote 0x[0-9a-f]+>',
+ self.assertTrue(re.match('<built-in method readlines of _io.TextIOWrapper object at remote 0x-?[0-9a-f]+>',
gdb_repr),
'Unexpected gdb representation: %r\n%s' % \
(gdb_repr, gdb_output))
@@ -552,7 +559,7 @@ id(foo.__code__)''',
breakpoint='builtin_id',
cmds_after_breakpoint=['print (PyFrameObject*)(((PyCodeObject*)v)->co_zombieframe)']
)
- self.assertTrue(re.match('.*\s+\$1 =\s+Frame 0x[0-9a-f]+, for file <string>, line 3, in foo \(\)\s+.*',
+ self.assertTrue(re.match('.*\s+\$1 =\s+Frame 0x-?[0-9a-f]+, for file <string>, line 3, in foo \(\)\s+.*',
gdb_output,
re.DOTALL),
'Unexpected gdb representation: %r\n%s' % (gdb_output, gdb_output))
@@ -609,7 +616,7 @@ class StackNavigationTests(DebuggerTests):
cmds_after_breakpoint=['py-up'])
self.assertMultilineMatches(bt,
r'''^.*
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
baz\(a, b, c\)
$''')
@@ -638,9 +645,9 @@ $''')
cmds_after_breakpoint=['py-up', 'py-down'])
self.assertMultilineMatches(bt,
r'''^.*
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
baz\(a, b, c\)
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 10, in baz \(args=\(1, 2, 3\)\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 10, in baz \(args=\(1, 2, 3\)\)
id\(42\)
$''')
@@ -672,14 +679,106 @@ Traceback \(most recent call first\):
cmds_after_breakpoint=['py-bt-full'])
self.assertMultilineMatches(bt,
r'''^.*
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
baz\(a, b, c\)
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 4, in foo \(a=1, b=2, c=3\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 4, in foo \(a=1, b=2, c=3\)
bar\(a, b, c\)
-#[0-9]+ Frame 0x[0-9a-f]+, for file .*gdb_sample.py, line 12, in <module> \(\)
+#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 12, in <module> \(\)
foo\(1, 2, 3\)
''')
+ @unittest.skipUnless(_thread,
+ "Python was compiled without thread support")
+ def test_threads(self):
+ 'Verify that "py-bt" indicates threads that are waiting for the GIL'
+ cmd = '''
+from threading import Thread
+
+class TestThread(Thread):
+ # These threads would run forever, but we'll interrupt things with the
+ # debugger
+ def run(self):
+ i = 0
+ while 1:
+ i += 1
+
+t = {}
+for i in range(4):
+ t[i] = TestThread()
+ t[i].start()
+
+# Trigger a breakpoint on the main thread
+id(42)
+
+'''
+ # Verify with "py-bt":
+ gdb_output = self.get_stack_trace(cmd,
+ cmds_after_breakpoint=['thread apply all py-bt'])
+ self.assertIn('Waiting for the GIL', gdb_output)
+
+ # Verify with "py-bt-full":
+ gdb_output = self.get_stack_trace(cmd,
+ cmds_after_breakpoint=['thread apply all py-bt-full'])
+ self.assertIn('Waiting for the GIL', gdb_output)
+
+ @unittest.skipIf(python_is_optimized(),
+ "Python was compiled with optimizations")
+ # Some older versions of gdb will fail with
+ # "Cannot find new threads: generic error"
+ # unless we add LD_PRELOAD=PATH-TO-libpthread.so.1 as a workaround
+ @unittest.skipUnless(_thread,
+ "Python was compiled without thread support")
+ def test_gc(self):
+ 'Verify that "py-bt" indicates if a thread is garbage-collecting'
+ cmd = ('from gc import collect\n'
+ 'id(42)\n'
+ 'def foo():\n'
+ ' collect()\n'
+ 'def bar():\n'
+ ' foo()\n'
+ 'bar()\n')
+ # Verify with "py-bt":
+ gdb_output = self.get_stack_trace(cmd,
+ cmds_after_breakpoint=['break update_refs', 'continue', 'py-bt'],
+ )
+ self.assertIn('Garbage-collecting', gdb_output)
+
+ # Verify with "py-bt-full":
+ gdb_output = self.get_stack_trace(cmd,
+ cmds_after_breakpoint=['break update_refs', 'continue', 'py-bt-full'],
+ )
+ self.assertIn('Garbage-collecting', gdb_output)
+
+ @unittest.skipIf(python_is_optimized(),
+ "Python was compiled with optimizations")
+ # Some older versions of gdb will fail with
+ # "Cannot find new threads: generic error"
+ # unless we add LD_PRELOAD=PATH-TO-libpthread.so.1 as a workaround
+ @unittest.skipUnless(_thread,
+ "Python was compiled without thread support")
+ def test_pycfunction(self):
+ 'Verify that "py-bt" displays invocations of PyCFunction instances'
+ cmd = ('from time import sleep\n'
+ 'def foo():\n'
+ ' sleep(1)\n'
+ 'def bar():\n'
+ ' foo()\n'
+ 'bar()\n')
+ # Verify with "py-bt":
+ gdb_output = self.get_stack_trace(cmd,
+ breakpoint='time_sleep',
+ cmds_after_breakpoint=['bt', 'py-bt'],
+ )
+ self.assertIn('<built-in method sleep', gdb_output)
+
+ # Verify with "py-bt-full":
+ gdb_output = self.get_stack_trace(cmd,
+ breakpoint='time_sleep',
+ cmds_after_breakpoint=['py-bt-full'],
+ )
+ self.assertIn('#0 <built-in method sleep', gdb_output)
+
+
class PyPrintTests(DebuggerTests):
@unittest.skipIf(python_is_optimized(),
"Python was compiled with optimizations")
@@ -713,7 +812,7 @@ class PyPrintTests(DebuggerTests):
bt = self.get_stack_trace(script=self.get_sample_script(),
cmds_after_breakpoint=['py-print len'])
self.assertMultilineMatches(bt,
- r".*\nbuiltin 'len' = <built-in method len of module object at remote 0x[0-9a-f]+>\n.*")
+ r".*\nbuiltin 'len' = <built-in method len of module object at remote 0x-?[0-9a-f]+>\n.*")
class PyLocalsTests(DebuggerTests):
@unittest.skipIf(python_is_optimized(),
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 5f47b3e..06f67c2 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -728,29 +728,6 @@ Ye olde Fibonacci generator, tee style.
syntax_tests = """
->>> def f():
-... return 22
-... yield 1
-Traceback (most recent call last):
- ..
-SyntaxError: 'return' with argument inside generator
-
->>> def f():
-... yield 1
-... return 22
-Traceback (most recent call last):
- ..
-SyntaxError: 'return' with argument inside generator
-
-"return None" is not the same as "return" in a generator:
-
->>> def f():
-... yield 1
-... return None
-Traceback (most recent call last):
- ..
-SyntaxError: 'return' with argument inside generator
-
These are fine:
>>> def f():
@@ -866,20 +843,6 @@ These are fine:
>>> type(f())
<class 'generator'>
-
->>> def f():
-... if 0:
-... lambda x: x # shouldn't trigger here
-... return # or here
-... def f(i):
-... return 2*i # or here
-... if 0:
-... return 3 # but *this* sucks (line 8)
-... if 0:
-... yield 2 # because it's a generator (line 10)
-Traceback (most recent call last):
-SyntaxError: 'return' with argument inside generator
-
This one caused a crash (see SF bug 567538):
>>> def f():
@@ -1566,11 +1529,6 @@ Traceback (most recent call last):
...
SyntaxError: 'yield' outside function
->>> def f(): return lambda x=(yield): 1
-Traceback (most recent call last):
- ...
-SyntaxError: 'return' with argument inside generator
-
>>> def f(): x = yield = y
Traceback (most recent call last):
...
diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py
index 50638a1..3eadd58 100644
--- a/Lib/test/test_genericpath.py
+++ b/Lib/test/test_genericpath.py
@@ -2,11 +2,12 @@
Tests common to genericpath, macpath, ntpath and posixpath
"""
-import unittest
-from test import support
-import os
import genericpath
+import os
import sys
+import unittest
+import warnings
+from test import support
def safe_rmdir(dirname):
@@ -145,6 +146,16 @@ class GenericTest(unittest.TestCase):
f.close()
support.unlink(support.TESTFN)
+ @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
+ def test_exists_fd(self):
+ r, w = os.pipe()
+ try:
+ self.assertTrue(self.pathmodule.exists(r))
+ finally:
+ os.close(r)
+ os.close(w)
+ self.assertFalse(self.pathmodule.exists(r))
+
def test_isdir(self):
self.assertIs(self.pathmodule.isdir(support.TESTFN), False)
f = open(support.TESTFN, "wb")
@@ -258,15 +269,21 @@ class CommonTest(GenericTest):
def test_abspath(self):
self.assertIn("foo", self.pathmodule.abspath("foo"))
- self.assertIn(b"foo", self.pathmodule.abspath(b"foo"))
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ self.assertIn(b"foo", self.pathmodule.abspath(b"foo"))
# Abspath returns bytes when the arg is bytes
- for path in (b'', b'foo', b'f\xf2\xf2', b'/foo', b'C:\\'):
- self.assertIsInstance(self.pathmodule.abspath(path), bytes)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ for path in (b'', b'foo', b'f\xf2\xf2', b'/foo', b'C:\\'):
+ self.assertIsInstance(self.pathmodule.abspath(path), bytes)
def test_realpath(self):
self.assertIn("foo", self.pathmodule.realpath("foo"))
- self.assertIn(b"foo", self.pathmodule.realpath(b"foo"))
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ self.assertIn(b"foo", self.pathmodule.realpath(b"foo"))
def test_normpath_issue5827(self):
# Make sure normpath preserves unicode
@@ -282,8 +299,7 @@ class CommonTest(GenericTest):
unicwd = '\xe7w\xf0'
try:
- fsencoding = support.TESTFN_ENCODING or "ascii"
- unicwd.encode(fsencoding)
+ os.fsencode(unicwd)
except (AttributeError, UnicodeEncodeError):
# FS encoding is probably ASCII
pass
@@ -295,9 +311,20 @@ class CommonTest(GenericTest):
@unittest.skipIf(sys.platform == 'darwin',
"Mac OS X denies the creation of a directory with an invalid utf8 name")
def test_nonascii_abspath(self):
+ name = b'\xe7w\xf0'
+ if sys.platform == 'win32':
+ try:
+ os.fsdecode(name)
+ except UnicodeDecodeError:
+ self.skipTest("the filename %a is not decodable "
+ "from the ANSI code page %s"
+ % (name, sys.getfilesystemencoding()))
+
# Test non-ASCII, non-UTF8 bytes in the path.
- with support.temp_cwd(b'\xe7w\xf0'):
- self.test_abspath()
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ with support.temp_cwd(name):
+ self.test_abspath()
def test_main():
diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py
index 1f46af1..413043c 100644
--- a/Lib/test/test_genexps.py
+++ b/Lib/test/test_genexps.py
@@ -257,11 +257,15 @@ Verify that genexps are weakly referencable
"""
+import sys
-__test__ = {'doctests' : doctests}
+# Trace function can throw off the tuple reuse test.
+if hasattr(sys, 'gettrace') and sys.gettrace():
+ __test__ = {}
+else:
+ __test__ = {'doctests' : doctests}
def test_main(verbose=None):
- import sys
from test import support
from test import test_genexps
support.run_doctest(test_genexps, verbose)
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py
index 3d9c06a..48ca94e 100644
--- a/Lib/test/test_getargs2.py
+++ b/Lib/test/test_getargs2.py
@@ -1,6 +1,6 @@
import unittest
from test import support
-from _testcapi import getargs_keywords
+from _testcapi import getargs_keywords, getargs_keyword_only
"""
> How about the following counterproposal. This also changes some of
@@ -214,6 +214,36 @@ class LongLong_TestCase(unittest.TestCase):
self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
+class Paradox:
+ "This statement is false."
+ def __bool__(self):
+ raise NotImplementedError
+
+class Boolean_TestCase(unittest.TestCase):
+ def test_p(self):
+ from _testcapi import getargs_p
+ self.assertEqual(0, getargs_p(False))
+ self.assertEqual(0, getargs_p(None))
+ self.assertEqual(0, getargs_p(0))
+ self.assertEqual(0, getargs_p(0.0))
+ self.assertEqual(0, getargs_p(0j))
+ self.assertEqual(0, getargs_p(''))
+ self.assertEqual(0, getargs_p(()))
+ self.assertEqual(0, getargs_p([]))
+ self.assertEqual(0, getargs_p({}))
+
+ self.assertEqual(1, getargs_p(True))
+ self.assertEqual(1, getargs_p(1))
+ self.assertEqual(1, getargs_p(1.0))
+ self.assertEqual(1, getargs_p(1j))
+ self.assertEqual(1, getargs_p('x'))
+ self.assertEqual(1, getargs_p((1,)))
+ self.assertEqual(1, getargs_p([1]))
+ self.assertEqual(1, getargs_p({1:2}))
+ self.assertEqual(1, getargs_p(unittest.TestCase))
+
+ self.assertRaises(NotImplementedError, getargs_p, Paradox())
+
class Tuple_TestCase(unittest.TestCase):
def test_tuple(self):
@@ -293,7 +323,87 @@ class Keywords_TestCase(unittest.TestCase):
else:
self.fail('TypeError should have been raised')
+class KeywordOnly_TestCase(unittest.TestCase):
+ def test_positional_args(self):
+ # using all possible positional args
+ self.assertEqual(
+ getargs_keyword_only(1, 2),
+ (1, 2, -1)
+ )
+
+ def test_mixed_args(self):
+ # positional and keyword args
+ self.assertEqual(
+ getargs_keyword_only(1, 2, keyword_only=3),
+ (1, 2, 3)
+ )
+
+ def test_keyword_args(self):
+ # all keywords
+ self.assertEqual(
+ getargs_keyword_only(required=1, optional=2, keyword_only=3),
+ (1, 2, 3)
+ )
+
+ def test_optional_args(self):
+ # missing optional keyword args, skipping tuples
+ self.assertEqual(
+ getargs_keyword_only(required=1, optional=2),
+ (1, 2, -1)
+ )
+ self.assertEqual(
+ getargs_keyword_only(required=1, keyword_only=3),
+ (1, -1, 3)
+ )
+
+ def test_required_args(self):
+ self.assertEqual(
+ getargs_keyword_only(1),
+ (1, -1, -1)
+ )
+ self.assertEqual(
+ getargs_keyword_only(required=1),
+ (1, -1, -1)
+ )
+ # required arg missing
+ with self.assertRaisesRegex(TypeError,
+ "Required argument 'required' \(pos 1\) not found"):
+ getargs_keyword_only(optional=2)
+
+ with self.assertRaisesRegex(TypeError,
+ "Required argument 'required' \(pos 1\) not found"):
+ getargs_keyword_only(keyword_only=3)
+
+ def test_too_many_args(self):
+ with self.assertRaisesRegex(TypeError,
+ "Function takes at most 2 positional arguments \(3 given\)"):
+ getargs_keyword_only(1, 2, 3)
+
+ with self.assertRaisesRegex(TypeError,
+ "function takes at most 3 arguments \(4 given\)"):
+ getargs_keyword_only(1, 2, 3, keyword_only=5)
+
+ def test_invalid_keyword(self):
+ # extraneous keyword arg
+ with self.assertRaisesRegex(TypeError,
+ "'monster' is an invalid keyword argument for this function"):
+ getargs_keyword_only(1, 2, monster=666)
+
+ def test_surrogate_keyword(self):
+ with self.assertRaisesRegex(TypeError,
+ "'\udc80' is an invalid keyword argument for this function"):
+ getargs_keyword_only(1, 2, **{'\uDC80': 10})
+
class Bytes_TestCase(unittest.TestCase):
+ def test_c(self):
+ from _testcapi import getargs_c
+ self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
+ self.assertEqual(getargs_c(b'a'), b'a')
+ self.assertEqual(getargs_c(bytearray(b'a')), b'a')
+ self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
+ self.assertRaises(TypeError, getargs_c, 's')
+ self.assertRaises(TypeError, getargs_c, None)
+
def test_s(self):
from _testcapi import getargs_s
self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
@@ -430,8 +540,10 @@ def test_main():
tests = [
Signed_TestCase,
Unsigned_TestCase,
+ Boolean_TestCase,
Tuple_TestCase,
Keywords_TestCase,
+ KeywordOnly_TestCase,
Bytes_TestCase,
Unicode_TestCase,
]
diff --git a/Lib/test/test_glob.py b/Lib/test/test_glob.py
index 1560a6b..6ee08db 100644
--- a/Lib/test/test_glob.py
+++ b/Lib/test/test_glob.py
@@ -1,5 +1,6 @@
import unittest
-from test.support import run_unittest, TESTFN, skip_unless_symlink, can_symlink
+from test.support import (run_unittest, TESTFN, skip_unless_symlink,
+ can_symlink, create_empty_file)
import glob
import os
import shutil
@@ -14,8 +15,7 @@ class GlobTests(unittest.TestCase):
base, file = os.path.split(filename)
if not os.path.exists(base):
os.makedirs(base)
- f = open(filename, 'w')
- f.close()
+ create_empty_file(filename)
def setUp(self):
self.tempdir = TESTFN+"_dir"
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 268a633..6b326bd 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -10,7 +10,7 @@ from sys import *
class TokenTests(unittest.TestCase):
- def testBackslash(self):
+ def test_backslash(self):
# Backslash means line continuation:
x = 1 \
+ 1
@@ -20,7 +20,7 @@ class TokenTests(unittest.TestCase):
x = 0
self.assertEqual(x, 0, 'backslash ending comment')
- def testPlainIntegers(self):
+ def test_plain_integers(self):
self.assertEqual(type(000), type(0))
self.assertEqual(0xff, 255)
self.assertEqual(0o377, 255)
@@ -56,7 +56,7 @@ class TokenTests(unittest.TestCase):
else:
self.fail('Weird maxsize value %r' % maxsize)
- def testLongIntegers(self):
+ def test_long_integers(self):
x = 0
x = 0xffffffffffffffff
x = 0Xffffffffffffffff
@@ -66,7 +66,7 @@ class TokenTests(unittest.TestCase):
x = 0b100000000000000000000000000000000000000000000000000000000000000000000
x = 0B111111111111111111111111111111111111111111111111111111111111111111111
- def testFloats(self):
+ def test_floats(self):
x = 3.14
x = 314.
x = 0.314
@@ -80,7 +80,7 @@ class TokenTests(unittest.TestCase):
x = .3e14
x = 3.1e4
- def testStringLiterals(self):
+ def test_string_literals(self):
x = ''; y = ""; self.assertTrue(len(x) == 0 and x == y)
x = '\''; y = "'"; self.assertTrue(len(x) == 1 and x == y and ord(x) == 39)
x = '"'; y = "\""; self.assertTrue(len(x) == 1 and x == y and ord(x) == 34)
@@ -120,11 +120,18 @@ the \'lazy\' dog.\n\
'
self.assertEqual(x, y)
- def testEllipsis(self):
+ def test_ellipsis(self):
x = ...
self.assertTrue(x is Ellipsis)
self.assertRaises(SyntaxError, eval, ".. .")
+ def test_eof_error(self):
+ samples = ("def foo(", "\ndef foo(", "def foo(\n")
+ for s in samples:
+ with self.assertRaises(SyntaxError) as cm:
+ compile(s, "<test>", "exec")
+ self.assertIn("unexpected EOF", str(cm.exception))
+
class GrammarTests(unittest.TestCase):
# single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
@@ -136,11 +143,11 @@ class GrammarTests(unittest.TestCase):
# expr_input: testlist NEWLINE
# XXX Hard to test -- used only in calls to input()
- def testEvalInput(self):
+ def test_eval_input(self):
# testlist ENDMARKER
x = eval('1, 0 or 1')
- def testFuncdef(self):
+ def test_funcdef(self):
### [decorators] 'def' NAME parameters ['->' test] ':' suite
### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
### decorators: decorator+
@@ -324,7 +331,7 @@ class GrammarTests(unittest.TestCase):
check_syntax_error(self, "f(*g(1=2))")
check_syntax_error(self, "f(**g(1=2))")
- def testLambdef(self):
+ def test_lambdef(self):
### lambdef: 'lambda' [varargslist] ':' test
l1 = lambda : 0
self.assertEqual(l1(), 0)
@@ -346,7 +353,7 @@ class GrammarTests(unittest.TestCase):
### stmt: simple_stmt | compound_stmt
# Tested below
- def testSimpleStmt(self):
+ def test_simple_stmt(self):
### simple_stmt: small_stmt (';' small_stmt)* [';']
x = 1; pass; del x
def foo():
@@ -357,7 +364,7 @@ class GrammarTests(unittest.TestCase):
### small_stmt: expr_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt
# Tested below
- def testExprStmt(self):
+ def test_expr_stmt(self):
# (exprlist '=')* exprlist
1
1, 2, 3
@@ -370,7 +377,7 @@ class GrammarTests(unittest.TestCase):
check_syntax_error(self, "x + 1 = 1")
check_syntax_error(self, "a + 1 = b + 2")
- def testDelStmt(self):
+ def test_del_stmt(self):
# 'del' exprlist
abc = [1,2,3]
x, y, z = abc
@@ -379,18 +386,18 @@ class GrammarTests(unittest.TestCase):
del abc
del x, y, (z, xyz)
- def testPassStmt(self):
+ def test_pass_stmt(self):
# 'pass'
pass
# flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
# Tested below
- def testBreakStmt(self):
+ def test_break_stmt(self):
# 'break'
while 1: break
- def testContinueStmt(self):
+ def test_continue_stmt(self):
# 'continue'
i = 1
while i: i = 0; continue
@@ -442,7 +449,7 @@ class GrammarTests(unittest.TestCase):
self.fail("continue then break in try/except in loop broken!")
test_inner()
- def testReturn(self):
+ def test_return(self):
# 'return' [testlist]
def g1(): return
def g2(): return 1
@@ -450,17 +457,49 @@ class GrammarTests(unittest.TestCase):
x = g2()
check_syntax_error(self, "class foo:return 1")
- def testYield(self):
+ def test_yield(self):
+ # Allowed as standalone statement
+ def g(): yield 1
+ def g(): yield from ()
+ # Allowed as RHS of assignment
+ def g(): x = yield 1
+ def g(): x = yield from ()
+ # Ordinary yield accepts implicit tuples
+ def g(): yield 1, 1
+ def g(): x = yield 1, 1
+ # 'yield from' does not
+ check_syntax_error(self, "def g(): yield from (), 1")
+ check_syntax_error(self, "def g(): x = yield from (), 1")
+ # Requires parentheses as subexpression
+ def g(): 1, (yield 1)
+ def g(): 1, (yield from ())
+ check_syntax_error(self, "def g(): 1, yield 1")
+ check_syntax_error(self, "def g(): 1, yield from ()")
+ # Requires parentheses as call argument
+ def g(): f((yield 1))
+ def g(): f((yield 1), 1)
+ def g(): f((yield from ()))
+ def g(): f((yield from ()), 1)
+ check_syntax_error(self, "def g(): f(yield 1)")
+ check_syntax_error(self, "def g(): f(yield 1, 1)")
+ check_syntax_error(self, "def g(): f(yield from ())")
+ check_syntax_error(self, "def g(): f(yield from (), 1)")
+ # Not allowed at top level
+ check_syntax_error(self, "yield")
+ check_syntax_error(self, "yield from")
+ # Not allowed at class scope
check_syntax_error(self, "class foo:yield 1")
+ check_syntax_error(self, "class foo:yield from ()")
+
- def testRaise(self):
+ def test_raise(self):
# 'raise' test [',' test]
try: raise RuntimeError('just testing')
except RuntimeError: pass
try: raise KeyboardInterrupt
except KeyboardInterrupt: pass
- def testImport(self):
+ def test_import(self):
# 'import' dotted_as_names
import sys
import time, sys
@@ -473,13 +512,13 @@ class GrammarTests(unittest.TestCase):
from sys import (path, argv)
from sys import (path, argv,)
- def testGlobal(self):
+ def test_global(self):
# 'global' NAME (',' NAME)*
global a
global a, b
global one, two, three, four, five, six, seven, eight, nine, ten
- def testNonlocal(self):
+ def test_nonlocal(self):
# 'nonlocal' NAME (',' NAME)*
x = 0
y = 0
@@ -487,7 +526,7 @@ class GrammarTests(unittest.TestCase):
nonlocal x
nonlocal x, y
- def testAssert(self):
+ def test_assert(self):
# assertTruestmt: 'assert' test [',' test]
assert 1
assert 1, 1
@@ -526,7 +565,7 @@ class GrammarTests(unittest.TestCase):
### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
# Tested below
- def testIf(self):
+ def test_if(self):
# 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
if 1: pass
if 1: pass
@@ -539,7 +578,7 @@ class GrammarTests(unittest.TestCase):
elif 0: pass
else: pass
- def testWhile(self):
+ def test_while(self):
# 'while' test ':' suite ['else' ':' suite]
while 0: pass
while 0: pass
@@ -554,7 +593,7 @@ class GrammarTests(unittest.TestCase):
x = 2
self.assertEqual(x, 2)
- def testFor(self):
+ def test_for(self):
# 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
for i in 1, 2, 3: pass
for i, j, k in (): pass
@@ -581,7 +620,7 @@ class GrammarTests(unittest.TestCase):
result.append(x)
self.assertEqual(result, [1, 2, 3])
- def testTry(self):
+ def test_try(self):
### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
### | 'try' ':' suite 'finally' ':' suite
### except_clause: 'except' [expr ['as' expr]]
@@ -604,7 +643,7 @@ class GrammarTests(unittest.TestCase):
try: pass
finally: pass
- def testSuite(self):
+ def test_suite(self):
# simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT
if 1: pass
if 1:
@@ -619,7 +658,7 @@ class GrammarTests(unittest.TestCase):
pass
#
- def testTest(self):
+ def test_test(self):
### and_test ('or' and_test)*
### and_test: not_test ('and' not_test)*
### not_test: 'not' not_test | comparison
@@ -630,7 +669,7 @@ class GrammarTests(unittest.TestCase):
if not 1 and 1 and 1: pass
if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass
- def testComparison(self):
+ def test_comparison(self):
### comparison: expr (comp_op expr)*
### comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not'
if 1: pass
@@ -647,36 +686,36 @@ class GrammarTests(unittest.TestCase):
if 1 not in (): pass
if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in 1 is 1 is not 1: pass
- def testBinaryMaskOps(self):
+ def test_binary_mask_ops(self):
x = 1 & 1
x = 1 ^ 1
x = 1 | 1
- def testShiftOps(self):
+ def test_shift_ops(self):
x = 1 << 1
x = 1 >> 1
x = 1 << 1 >> 1
- def testAdditiveOps(self):
+ def test_additive_ops(self):
x = 1
x = 1 + 1
x = 1 - 1 - 1
x = 1 - 1 + 1 - 1 + 1
- def testMultiplicativeOps(self):
+ def test_multiplicative_ops(self):
x = 1 * 1
x = 1 / 1
x = 1 % 1
x = 1 / 1 * 1 % 1
- def testUnaryOps(self):
+ def test_unary_ops(self):
x = +1
x = -1
x = ~1
x = ~1 ^ 1 & 1 | 1 & 1 ^ -1
x = -1*1/1 + 1*1 - ---1*1
- def testSelectors(self):
+ def test_selectors(self):
### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME
### subscript: expr | [expr] ':' [expr]
@@ -706,7 +745,7 @@ class GrammarTests(unittest.TestCase):
L.sort(key=lambda x: x if isinstance(x, tuple) else ())
self.assertEqual(str(L), '[1, (1,), (1, 2), (1, 2, 3)]')
- def testAtoms(self):
+ def test_atoms(self):
### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING
### dictsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [','])
@@ -741,7 +780,7 @@ class GrammarTests(unittest.TestCase):
### testlist: test (',' test)* [',']
# These have been exercised enough above
- def testClassdef(self):
+ def test_classdef(self):
# 'class' NAME ['(' [testlist] ')'] ':' suite
class B: pass
class B2(): pass
@@ -760,14 +799,14 @@ class GrammarTests(unittest.TestCase):
@class_decorator
class G: pass
- def testDictcomps(self):
+ def test_dictcomps(self):
# dictorsetmaker: ( (test ':' test (comp_for |
# (',' test ':' test)* [','])) |
# (test (comp_for | (',' test)* [','])) )
nums = [1, 2, 3]
self.assertEqual({i:i+1 for i in nums}, {1: 2, 2: 3, 3: 4})
- def testListcomps(self):
+ def test_listcomps(self):
# list comprehension tests
nums = [1, 2, 3, 4, 5]
strs = ["Apple", "Banana", "Coconut"]
@@ -830,7 +869,7 @@ class GrammarTests(unittest.TestCase):
self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'),
('Macdonalds', 'Cheeseburger')])
- def testGenexps(self):
+ def test_genexps(self):
# generator expression tests
g = ([x for x in range(10)] for x in range(1))
self.assertEqual(next(g), [x for x in range(10)])
@@ -865,7 +904,7 @@ class GrammarTests(unittest.TestCase):
check_syntax_error(self, "foo(x for x in range(10), 100)")
check_syntax_error(self, "foo(100, x for x in range(10))")
- def testComprehensionSpecials(self):
+ def test_comprehension_specials(self):
# test for outmost iterable precomputation
x = 10; g = (i for i in range(x)); x = 5
self.assertEqual(len(list(g)), 10)
@@ -904,7 +943,7 @@ class GrammarTests(unittest.TestCase):
with manager() as x, manager():
pass
- def testIfElseExpr(self):
+ def test_if_else_expr(self):
# Test ifelse expressions in various cases
def _checkeval(msg, ret):
"helper to check that evaluation of expressions is done correctly"
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index ced226f..af73953 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -33,7 +33,7 @@ class UnseekableIO(io.BytesIO):
raise io.UnsupportedOperation
-class TestGzip(unittest.TestCase):
+class BaseTest(unittest.TestCase):
filename = support.TESTFN
def setUp(self):
@@ -43,6 +43,7 @@ class TestGzip(unittest.TestCase):
support.unlink(self.filename)
+class TestGzip(BaseTest):
def test_write(self):
with gzip.GzipFile(self.filename, 'wb') as f:
f.write(data1 * 50)
@@ -64,6 +65,21 @@ class TestGzip(unittest.TestCase):
d = f.read()
self.assertEqual(d, data1*50)
+ def test_read1(self):
+ self.test_write()
+ blocks = []
+ nread = 0
+ with gzip.GzipFile(self.filename, 'r') as f:
+ while True:
+ d = f.read1()
+ if not d:
+ break
+ blocks.append(d)
+ nread += len(d)
+ # Check that position was updated correctly (see issue10791).
+ self.assertEqual(f.tell(), nread)
+ self.assertEqual(b''.join(blocks), data1 * 50)
+
def test_io_on_closed_object(self):
# Test that I/O operations on closed GzipFile objects raise a
# ValueError, just like the corresponding functions on file objects.
@@ -100,14 +116,14 @@ class TestGzip(unittest.TestCase):
# Bug #1074261 was triggered when reading a file that contained
# many, many members. Create such a file and verify that reading it
# works.
- with gzip.open(self.filename, 'wb', 9) as f:
+ with gzip.GzipFile(self.filename, 'wb', 9) as f:
f.write(b'a')
for i in range(0, 200):
- with gzip.open(self.filename, "ab", 9) as f: # append
+ with gzip.GzipFile(self.filename, "ab", 9) as f: # append
f.write(b'a')
# Try reading the file
- with gzip.open(self.filename, "rb") as zgfile:
+ with gzip.GzipFile(self.filename, "rb") as zgfile:
contents = b""
while 1:
ztxt = zgfile.read(8192)
@@ -124,7 +140,7 @@ class TestGzip(unittest.TestCase):
with io.BufferedReader(f) as r:
lines = [line for line in r]
- self.assertEqual(lines, 50 * data1.splitlines(True))
+ self.assertEqual(lines, 50 * data1.splitlines(keepends=True))
def test_readline(self):
self.test_write()
@@ -323,6 +339,14 @@ class TestGzip(unittest.TestCase):
self.assertEqual(f.read(100), b'')
self.assertEqual(nread, len(uncompressed))
+ def test_textio_readlines(self):
+ # Issue #10791: TextIOWrapper.readlines() fails when wrapping GzipFile.
+ lines = (data1 * 50).decode("ascii").splitlines(keepends=True)
+ self.test_write()
+ with gzip.GzipFile(self.filename, 'r') as f:
+ with io.TextIOWrapper(f, encoding="ascii") as t:
+ self.assertEqual(t.readlines(), lines)
+
def test_fileobj_from_fdopen(self):
# Issue #13781: Opening a GzipFile for writing fails when using a
# fileobj created with os.fdopen().
@@ -365,8 +389,109 @@ class TestGzip(unittest.TestCase):
datac = gzip.compress(data)
self.assertEqual(gzip.decompress(datac), data)
+
+class TestOpen(BaseTest):
+ def test_binary_modes(self):
+ uncompressed = data1 * 50
+ with gzip.open(self.filename, "wb") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read())
+ self.assertEqual(file_data, uncompressed)
+ with gzip.open(self.filename, "rb") as f:
+ self.assertEqual(f.read(), uncompressed)
+ with gzip.open(self.filename, "ab") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read())
+ self.assertEqual(file_data, uncompressed * 2)
+
+ def test_implicit_binary_modes(self):
+ # Test implicit binary modes (no "b" or "t" in mode string).
+ uncompressed = data1 * 50
+ with gzip.open(self.filename, "w") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read())
+ self.assertEqual(file_data, uncompressed)
+ with gzip.open(self.filename, "r") as f:
+ self.assertEqual(f.read(), uncompressed)
+ with gzip.open(self.filename, "a") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read())
+ self.assertEqual(file_data, uncompressed * 2)
+
+ def test_text_modes(self):
+ uncompressed = data1.decode("ascii") * 50
+ uncompressed_raw = uncompressed.replace("\n", os.linesep)
+ with gzip.open(self.filename, "wt") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read()).decode("ascii")
+ self.assertEqual(file_data, uncompressed_raw)
+ with gzip.open(self.filename, "rt") as f:
+ self.assertEqual(f.read(), uncompressed)
+ with gzip.open(self.filename, "at") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read()).decode("ascii")
+ self.assertEqual(file_data, uncompressed_raw * 2)
+
+ def test_fileobj(self):
+ uncompressed_bytes = data1 * 50
+ uncompressed_str = uncompressed_bytes.decode("ascii")
+ compressed = gzip.compress(uncompressed_bytes)
+ with gzip.open(io.BytesIO(compressed), "r") as f:
+ self.assertEqual(f.read(), uncompressed_bytes)
+ with gzip.open(io.BytesIO(compressed), "rb") as f:
+ self.assertEqual(f.read(), uncompressed_bytes)
+ with gzip.open(io.BytesIO(compressed), "rt") as f:
+ self.assertEqual(f.read(), uncompressed_str)
+
+ def test_bad_params(self):
+ # Test invalid parameter combinations.
+ with self.assertRaises(TypeError):
+ gzip.open(123.456)
+ with self.assertRaises(ValueError):
+ gzip.open(self.filename, "wbt")
+ with self.assertRaises(ValueError):
+ gzip.open(self.filename, "rb", encoding="utf-8")
+ with self.assertRaises(ValueError):
+ gzip.open(self.filename, "rb", errors="ignore")
+ with self.assertRaises(ValueError):
+ gzip.open(self.filename, "rb", newline="\n")
+
+ def test_encoding(self):
+ # Test non-default encoding.
+ uncompressed = data1.decode("ascii") * 50
+ uncompressed_raw = uncompressed.replace("\n", os.linesep)
+ with gzip.open(self.filename, "wt", encoding="utf-16") as f:
+ f.write(uncompressed)
+ with open(self.filename, "rb") as f:
+ file_data = gzip.decompress(f.read()).decode("utf-16")
+ self.assertEqual(file_data, uncompressed_raw)
+ with gzip.open(self.filename, "rt", encoding="utf-16") as f:
+ self.assertEqual(f.read(), uncompressed)
+
+ def test_encoding_error_handler(self):
+ # Test with non-default encoding error handler.
+ with gzip.open(self.filename, "wb") as f:
+ f.write(b"foo\xffbar")
+ with gzip.open(self.filename, "rt", encoding="ascii", errors="ignore") \
+ as f:
+ self.assertEqual(f.read(), "foobar")
+
+ def test_newline(self):
+ # Test with explicit newline (universal newline mode disabled).
+ uncompressed = data1.decode("ascii") * 50
+ with gzip.open(self.filename, "wt", newline="\n") as f:
+ f.write(uncompressed)
+ with gzip.open(self.filename, "rt", newline="\r") as f:
+ self.assertEqual(f.readlines(), [uncompressed])
+
def test_main(verbose=None):
- support.run_unittest(TestGzip)
+ support.run_unittest(TestGzip, TestOpen)
if __name__ == "__main__":
test_main(verbose=True)
diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py
index c0dd34d..0776779 100644
--- a/Lib/test/test_hash.py
+++ b/Lib/test/test_hash.py
@@ -113,8 +113,7 @@ class DefaultIterSeq(object):
return self.seq[index]
class HashBuiltinsTestCase(unittest.TestCase):
- hashes_to_check = [range(10),
- enumerate(range(10)),
+ hashes_to_check = [enumerate(range(10)),
iter(DefaultIterSeq()),
iter(lambda: 0, 0),
]
@@ -160,8 +159,8 @@ class StringlikeHashRandomizationTests(HashRandomizationTests):
else:
known_hash_of_obj = -1600925533
- # Randomization is disabled by default:
- self.assertEqual(self.get_hash(self.repr_), known_hash_of_obj)
+ # Randomization is enabled by default:
+ self.assertNotEqual(self.get_hash(self.repr_), known_hash_of_obj)
# It can also be disabled by setting the seed to 0:
self.assertEqual(self.get_hash(self.repr_, seed=0), known_hash_of_obj)
@@ -193,6 +192,12 @@ class BytesHashRandomizationTests(StringlikeHashRandomizationTests):
def test_empty_string(self):
self.assertEqual(hash(b""), 0)
+class MemoryviewHashRandomizationTests(StringlikeHashRandomizationTests):
+ repr_ = "memoryview(b'abc')"
+
+ def test_empty_string(self):
+ self.assertEqual(hash(memoryview(b"")), 0)
+
class DatetimeTests(HashRandomizationTests):
def get_hash_command(self, repr_):
return 'import datetime; print(hash(%s))' % repr_
@@ -213,6 +218,7 @@ def test_main():
HashBuiltinsTestCase,
StrHashRandomizationTests,
BytesHashRandomizationTests,
+ MemoryviewHashRandomizationTests,
DatetimeDateTests,
DatetimeDatetimeTests,
DatetimeTimeTests)
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index 29d3a1c..32f85e9 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -9,6 +9,7 @@
import array
import hashlib
import itertools
+import os
import sys
try:
import threading
@@ -37,7 +38,8 @@ class HashLibTestCase(unittest.TestCase):
'sha224', 'SHA224', 'sha256', 'SHA256',
'sha384', 'SHA384', 'sha512', 'SHA512' )
- _warn_on_extension_import = COMPILED_WITH_PYDEBUG
+ # Issue #14693: fallback modules are always compiled under POSIX
+ _warn_on_extension_import = os.name == 'posix' or COMPILED_WITH_PYDEBUG
def _conditional_import_module(self, module_name):
"""Import a module and return a reference to it or None on failure."""
diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py
index 4de0620..4ca7cec 100644
--- a/Lib/test/test_hmac.py
+++ b/Lib/test/test_hmac.py
@@ -234,6 +234,18 @@ class ConstructorTestCase(unittest.TestCase):
except:
self.fail("Standard constructor call raised exception.")
+ def test_with_str_key(self):
+ # Pass a key of type str, which is an error, because it expects a key
+ # of type bytes
+ with self.assertRaises(TypeError):
+ h = hmac.HMAC("key")
+
+ def test_dot_new_with_str_key(self):
+ # Pass a key of type str, which is an error, because it expects a key
+ # of type bytes
+ with self.assertRaises(TypeError):
+ h = hmac.new("key")
+
def test_withtext(self):
# Constructor call with text.
try:
@@ -302,12 +314,121 @@ class CopyTestCase(unittest.TestCase):
self.assertEqual(h1.hexdigest(), h2.hexdigest(),
"Hexdigest of copy doesn't match original hexdigest.")
+class CompareDigestTestCase(unittest.TestCase):
+
+ def test_compare_digest(self):
+ # Testing input type exception handling
+ a, b = 100, 200
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = 100, b"foobar"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = b"foobar", 200
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = "foobar", b"foobar"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = b"foobar", "foobar"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+
+ # Testing bytes of different lengths
+ a, b = b"foobar", b"foo"
+ self.assertFalse(hmac.compare_digest(a, b))
+ a, b = b"\xde\xad\xbe\xef", b"\xde\xad"
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing bytes of same lengths, different values
+ a, b = b"foobar", b"foobaz"
+ self.assertFalse(hmac.compare_digest(a, b))
+ a, b = b"\xde\xad\xbe\xef", b"\xab\xad\x1d\xea"
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing bytes of same lengths, same values
+ a, b = b"foobar", b"foobar"
+ self.assertTrue(hmac.compare_digest(a, b))
+ a, b = b"\xde\xad\xbe\xef", b"\xde\xad\xbe\xef"
+ self.assertTrue(hmac.compare_digest(a, b))
+
+ # Testing bytearrays of same lengths, same values
+ a, b = bytearray(b"foobar"), bytearray(b"foobar")
+ self.assertTrue(hmac.compare_digest(a, b))
+
+ # Testing bytearrays of diffeent lengths
+ a, b = bytearray(b"foobar"), bytearray(b"foo")
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing bytearrays of same lengths, different values
+ a, b = bytearray(b"foobar"), bytearray(b"foobaz")
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing byte and bytearray of same lengths, same values
+ a, b = bytearray(b"foobar"), b"foobar"
+ self.assertTrue(hmac.compare_digest(a, b))
+ self.assertTrue(hmac.compare_digest(b, a))
+
+ # Testing byte bytearray of diffeent lengths
+ a, b = bytearray(b"foobar"), b"foo"
+ self.assertFalse(hmac.compare_digest(a, b))
+ self.assertFalse(hmac.compare_digest(b, a))
+
+ # Testing byte and bytearray of same lengths, different values
+ a, b = bytearray(b"foobar"), b"foobaz"
+ self.assertFalse(hmac.compare_digest(a, b))
+ self.assertFalse(hmac.compare_digest(b, a))
+
+ # Testing str of same lengths
+ a, b = "foobar", "foobar"
+ self.assertTrue(hmac.compare_digest(a, b))
+
+ # Testing str of diffeent lengths
+ a, b = "foo", "foobar"
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing bytes of same lengths, different values
+ a, b = "foobar", "foobaz"
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ # Testing error cases
+ a, b = "foobar", b"foobar"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = b"foobar", "foobar"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = b"foobar", 1
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = 100, 200
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+ a, b = "fooä", "fooä"
+ self.assertRaises(TypeError, hmac.compare_digest, a, b)
+
+ # subclasses are supported by ignore __eq__
+ class mystr(str):
+ def __eq__(self, other):
+ return False
+
+ a, b = mystr("foobar"), mystr("foobar")
+ self.assertTrue(hmac.compare_digest(a, b))
+ a, b = mystr("foobar"), "foobar"
+ self.assertTrue(hmac.compare_digest(a, b))
+ a, b = mystr("foobar"), mystr("foobaz")
+ self.assertFalse(hmac.compare_digest(a, b))
+
+ class mybytes(bytes):
+ def __eq__(self, other):
+ return False
+
+ a, b = mybytes(b"foobar"), mybytes(b"foobar")
+ self.assertTrue(hmac.compare_digest(a, b))
+ a, b = mybytes(b"foobar"), b"foobar"
+ self.assertTrue(hmac.compare_digest(a, b))
+ a, b = mybytes(b"foobar"), mybytes(b"foobaz")
+ self.assertFalse(hmac.compare_digest(a, b))
+
+
def test_main():
support.run_unittest(
TestVectorsTestCase,
ConstructorTestCase,
SanityTestCase,
- CopyTestCase
+ CopyTestCase,
+ CompareDigestTestCase
)
if __name__ == "__main__":
diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py
index c4f80cc..c5d878d 100644
--- a/Lib/test/test_htmlparser.py
+++ b/Lib/test/test_htmlparser.py
@@ -102,7 +102,8 @@ class TestCaseBase(unittest.TestCase):
class HTMLParserStrictTestCase(TestCaseBase):
def get_collector(self):
- return EventCollector(strict=True)
+ with support.check_warnings(("", DeprecationWarning), quite=False):
+ return EventCollector(strict=True)
def test_processing_instruction_only(self):
self._run_check("<?processing instruction>", [
@@ -455,7 +456,7 @@ class HTMLParserTolerantTestCase(HTMLParserStrictTestCase):
self._run_check('<form action="/xxx.php?a=1&amp;b=2&amp", '
'method="post">', [
('starttag', 'form',
- [('action', '/xxx.php?a=1&b=2&amp'),
+ [('action', '/xxx.php?a=1&b=2&'),
(',', None), ('method', 'post')])])
def test_weird_chars_in_unquoted_attribute_values(self):
@@ -540,6 +541,11 @@ class HTMLParserTolerantTestCase(HTMLParserStrictTestCase):
self.assertEqual(p.unescape('&#0038;'),'&')
# see #12888
self.assertEqual(p.unescape('&#123; ' * 1050), '{ ' * 1050)
+ # see #15156
+ self.assertEqual(p.unescape('&Eacuteric&Eacute;ric'
+ '&alphacentauri&alpha;centauri'),
+ 'ÉricÉric&alphacentauriαcentauri')
+ self.assertEqual(p.unescape('&co;'), '&co;')
def test_broken_comments(self):
html = ('<! not really a comment >'
@@ -594,7 +600,8 @@ class HTMLParserTolerantTestCase(HTMLParserStrictTestCase):
class AttributesStrictTestCase(TestCaseBase):
def get_collector(self):
- return EventCollector(strict=True)
+ with support.check_warnings(("", DeprecationWarning), quite=False):
+ return EventCollector(strict=True)
def test_attr_syntax(self):
output = [
diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py
index 41e0dfd..a35ec95 100644
--- a/Lib/test/test_http_cookiejar.py
+++ b/Lib/test/test_http_cookiejar.py
@@ -248,18 +248,19 @@ class FileCookieJarTests(unittest.TestCase):
self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None)
def test_bad_magic(self):
- # IOErrors (eg. file doesn't exist) are allowed to propagate
+ # OSErrors (eg. file doesn't exist) are allowed to propagate
filename = test.support.TESTFN
for cookiejar_class in LWPCookieJar, MozillaCookieJar:
c = cookiejar_class()
try:
c.load(filename="for this test to work, a file with this "
"filename should not exist")
- except IOError as exc:
- # exactly IOError, not LoadError
- self.assertIs(exc.__class__, IOError)
+ except OSError as exc:
+ # an OSError subclass (likely FileNotFoundError), but not
+ # LoadError
+ self.assertIsNot(exc.__class__, LoadError)
else:
- self.fail("expected IOError for invalid filename")
+ self.fail("expected OSError for invalid filename")
# Invalid contents of cookies file (eg. bad magic string)
# causes a LoadError.
try:
diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py
index 1f1ca58..e8327e5 100644
--- a/Lib/test/test_http_cookies.py
+++ b/Lib/test/test_http_cookies.py
@@ -34,6 +34,15 @@ class CookieTests(unittest.TestCase):
'dict': {'keebler' : 'E=mc2'},
'repr': "<SimpleCookie: keebler='E=mc2'>",
'output': 'Set-Cookie: keebler=E=mc2'},
+
+ # Cookies with ':' character in their name. Though not mentioned in
+ # RFC, servers / browsers allow it.
+
+ {'data': 'key:term=value:term',
+ 'dict': {'key:term' : 'value:term'},
+ 'repr': "<SimpleCookie: key:term='value:term'>",
+ 'output': 'Set-Cookie: key:term=value:term'},
+
]
for case in cases:
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
index 24c72ff..cf61552 100644
--- a/Lib/test/test_httplib.py
+++ b/Lib/test/test_httplib.py
@@ -186,6 +186,23 @@ class BasicTest(TestCase):
self.assertEqual(resp.read(2), b'xt')
self.assertTrue(resp.isclosed())
+ def test_partial_readintos(self):
+ # if we have a lenght, the system knows when to close itself
+ # same behaviour than when we read the whole thing with read()
+ body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
+ sock = FakeSocket(body)
+ resp = client.HTTPResponse(sock)
+ resp.begin()
+ b = bytearray(2)
+ n = resp.readinto(b)
+ self.assertEqual(n, 2)
+ self.assertEqual(bytes(b), b'Te')
+ self.assertFalse(resp.isclosed())
+ n = resp.readinto(b)
+ self.assertEqual(n, 2)
+ self.assertEqual(bytes(b), b'xt')
+ self.assertTrue(resp.isclosed())
+
def test_host_port(self):
# Check invalid host_port
@@ -234,6 +251,21 @@ class BasicTest(TestCase):
if resp.read():
self.fail("Did not expect response from HEAD request")
+ def test_readinto_head(self):
+ # Test that the library doesn't attempt to read any data
+ # from a HEAD request. (Tickles SF bug #622042.)
+ sock = FakeSocket(
+ 'HTTP/1.1 200 OK\r\n'
+ 'Content-Length: 14432\r\n'
+ '\r\n',
+ NoEOFStringIO)
+ resp = client.HTTPResponse(sock, method="HEAD")
+ resp.begin()
+ b = bytearray(5)
+ if resp.readinto(b) != 0:
+ self.fail("Did not expect response from HEAD request")
+ self.assertEqual(bytes(b), b'\x00'*5)
+
def test_send_file(self):
expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n'
b'Accept-Encoding: identity\r\nContent-Length:')
@@ -289,15 +321,28 @@ class BasicTest(TestCase):
'Transfer-Encoding: chunked\r\n\r\n'
'a\r\n'
'hello worl\r\n'
- '1\r\n'
- 'd\r\n'
+ '3\r\n'
+ 'd! \r\n'
+ '8\r\n'
+ 'and now \r\n'
+ '22\r\n'
+ 'for something completely different\r\n'
)
+ expected = b'hello world! and now for something completely different'
sock = FakeSocket(chunked_start + '0\r\n')
resp = client.HTTPResponse(sock, method="GET")
resp.begin()
- self.assertEqual(resp.read(), b'hello world')
+ self.assertEqual(resp.read(), expected)
resp.close()
+ # Various read sizes
+ for n in range(1, 12):
+ sock = FakeSocket(chunked_start + '0\r\n')
+ resp = client.HTTPResponse(sock, method="GET")
+ resp.begin()
+ self.assertEqual(resp.read(n) + resp.read(n) + resp.read(), expected)
+ resp.close()
+
for x in ('', 'foo\r\n'):
sock = FakeSocket(chunked_start + x)
resp = client.HTTPResponse(sock, method="GET")
@@ -305,9 +350,64 @@ class BasicTest(TestCase):
try:
resp.read()
except client.IncompleteRead as i:
- self.assertEqual(i.partial, b'hello world')
- self.assertEqual(repr(i),'IncompleteRead(11 bytes read)')
- self.assertEqual(str(i),'IncompleteRead(11 bytes read)')
+ self.assertEqual(i.partial, expected)
+ expected_message = 'IncompleteRead(%d bytes read)' % len(expected)
+ self.assertEqual(repr(i), expected_message)
+ self.assertEqual(str(i), expected_message)
+ else:
+ self.fail('IncompleteRead expected')
+ finally:
+ resp.close()
+
+ def test_readinto_chunked(self):
+ chunked_start = (
+ 'HTTP/1.1 200 OK\r\n'
+ 'Transfer-Encoding: chunked\r\n\r\n'
+ 'a\r\n'
+ 'hello worl\r\n'
+ '3\r\n'
+ 'd! \r\n'
+ '8\r\n'
+ 'and now \r\n'
+ '22\r\n'
+ 'for something completely different\r\n'
+ )
+ expected = b'hello world! and now for something completely different'
+ nexpected = len(expected)
+ b = bytearray(128)
+
+ sock = FakeSocket(chunked_start + '0\r\n')
+ resp = client.HTTPResponse(sock, method="GET")
+ resp.begin()
+ n = resp.readinto(b)
+ self.assertEqual(b[:nexpected], expected)
+ self.assertEqual(n, nexpected)
+ resp.close()
+
+ # Various read sizes
+ for n in range(1, 12):
+ sock = FakeSocket(chunked_start + '0\r\n')
+ resp = client.HTTPResponse(sock, method="GET")
+ resp.begin()
+ m = memoryview(b)
+ i = resp.readinto(m[0:n])
+ i += resp.readinto(m[i:n + i])
+ i += resp.readinto(m[i:])
+ self.assertEqual(b[:nexpected], expected)
+ self.assertEqual(i, nexpected)
+ resp.close()
+
+ for x in ('', 'foo\r\n'):
+ sock = FakeSocket(chunked_start + x)
+ resp = client.HTTPResponse(sock, method="GET")
+ resp.begin()
+ try:
+ n = resp.readinto(b)
+ except client.IncompleteRead as i:
+ self.assertEqual(i.partial, expected)
+ expected_message = 'IncompleteRead(%d bytes read)' % len(expected)
+ self.assertEqual(repr(i), expected_message)
+ self.assertEqual(str(i), expected_message)
else:
self.fail('IncompleteRead expected')
finally:
@@ -330,6 +430,26 @@ class BasicTest(TestCase):
self.assertEqual(resp.reason, 'OK')
self.assertTrue(resp.isclosed())
+ def test_readinto_chunked_head(self):
+ chunked_start = (
+ 'HTTP/1.1 200 OK\r\n'
+ 'Transfer-Encoding: chunked\r\n\r\n'
+ 'a\r\n'
+ 'hello world\r\n'
+ '1\r\n'
+ 'd\r\n'
+ )
+ sock = FakeSocket(chunked_start + '0\r\n')
+ resp = client.HTTPResponse(sock, method="HEAD")
+ resp.begin()
+ b = bytearray(5)
+ n = resp.readinto(b)
+ self.assertEqual(n, 0)
+ self.assertEqual(bytes(b), b'\x00'*5)
+ self.assertEqual(resp.status, 200)
+ self.assertEqual(resp.reason, 'OK')
+ self.assertTrue(resp.isclosed())
+
def test_negative_content_length(self):
sock = FakeSocket(
'HTTP/1.1 200 OK\r\nContent-Length: -1\r\n\r\nHello\r\n')
@@ -545,8 +665,7 @@ class HTTPSTest(TestCase):
def test_local_good_hostname(self):
# The (valid) cert validates the HTTP hostname
import ssl
- from test.ssl_servers import make_https_server
- server = make_https_server(self, CERT_localhost)
+ server = self.make_server(CERT_localhost)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(CERT_localhost)
@@ -554,12 +673,12 @@ class HTTPSTest(TestCase):
h.request('GET', '/nonexistent')
resp = h.getresponse()
self.assertEqual(resp.status, 404)
+ del server
def test_local_bad_hostname(self):
# The (valid) cert doesn't validate the HTTP hostname
import ssl
- from test.ssl_servers import make_https_server
- server = make_https_server(self, CERT_fakehostname)
+ server = self.make_server(CERT_fakehostname)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(CERT_fakehostname)
@@ -577,6 +696,7 @@ class HTTPSTest(TestCase):
h.request('GET', '/nonexistent')
resp = h.getresponse()
self.assertEqual(resp.status, 404)
+ del server
@unittest.skipIf(not hasattr(client, 'HTTPSConnection'),
'http.client.HTTPSConnection not available')
diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
index d9e4063..75133c9 100644
--- a/Lib/test/test_httpservers.py
+++ b/Lib/test/test_httpservers.py
@@ -471,6 +471,23 @@ class RejectingSocketlessRequestHandler(SocketlessRequestHandler):
self.send_error(417)
return False
+
+class AuditableBytesIO:
+
+ def __init__(self):
+ self.datas = []
+
+ def write(self, data):
+ self.datas.append(data)
+
+ def getData(self):
+ return b''.join(self.datas)
+
+ @property
+ def numWrites(self):
+ return len(self.datas)
+
+
class BaseHTTPRequestHandlerTestCase(unittest.TestCase):
"""Test the functionality of the BaseHTTPServer.
@@ -537,27 +554,49 @@ class BaseHTTPRequestHandlerTestCase(unittest.TestCase):
self.verify_get_called()
self.assertEqual(result[-1], b'<html><body>Data</body></html>\r\n')
- def test_header_buffering(self):
+ def test_header_buffering_of_send_error(self):
- def _readAndReseek(f):
- pos = f.tell()
- f.seek(0)
- data = f.read()
- f.seek(pos)
- return data
+ input = BytesIO(b'GET / HTTP/1.1\r\n\r\n')
+ output = AuditableBytesIO()
+ handler = SocketlessRequestHandler()
+ handler.rfile = input
+ handler.wfile = output
+ handler.request_version = 'HTTP/1.1'
+ handler.requestline = ''
+ handler.command = None
+
+ handler.send_error(418)
+ self.assertEqual(output.numWrites, 2)
+
+ def test_header_buffering_of_send_response_only(self):
input = BytesIO(b'GET / HTTP/1.1\r\n\r\n')
- output = BytesIO()
- self.handler.rfile = input
- self.handler.wfile = output
- self.handler.request_version = 'HTTP/1.1'
+ output = AuditableBytesIO()
+ handler = SocketlessRequestHandler()
+ handler.rfile = input
+ handler.wfile = output
+ handler.request_version = 'HTTP/1.1'
- self.handler.send_header('Foo', 'foo')
- self.handler.send_header('bar', 'bar')
- self.assertEqual(_readAndReseek(output), b'')
- self.handler.end_headers()
- self.assertEqual(_readAndReseek(output),
- b'Foo: foo\r\nbar: bar\r\n\r\n')
+ handler.send_response_only(418)
+ self.assertEqual(output.numWrites, 0)
+ handler.end_headers()
+ self.assertEqual(output.numWrites, 1)
+
+ def test_header_buffering_of_send_header(self):
+
+ input = BytesIO(b'GET / HTTP/1.1\r\n\r\n')
+ output = AuditableBytesIO()
+ handler = SocketlessRequestHandler()
+ handler.rfile = input
+ handler.wfile = output
+ handler.request_version = 'HTTP/1.1'
+
+ handler.send_header('Foo', 'foo')
+ handler.send_header('bar', 'bar')
+ self.assertEqual(output.numWrites, 0)
+ handler.end_headers()
+ self.assertEqual(output.getData(), b'Foo: foo\r\nbar: bar\r\n\r\n')
+ self.assertEqual(output.numWrites, 1)
def test_header_unbuffered_when_continue(self):
diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
index 5c99a58..512bba9 100644
--- a/Lib/test/test_imaplib.py
+++ b/Lib/test/test_imaplib.py
@@ -11,9 +11,9 @@ import socketserver
import time
import calendar
-from test.support import reap_threads, verbose, transient_internet, run_with_tz
+from test.support import reap_threads, verbose, transient_internet, run_with_tz, run_with_locale
import unittest
-
+from datetime import datetime, timezone, timedelta
try:
import ssl
except ImportError:
@@ -43,14 +43,30 @@ class TestImaplib(unittest.TestCase):
imaplib.Internaldate2tuple(
b'25 (INTERNALDATE "02-Apr-2000 03:30:00 +0000")'))
- def test_that_Time2Internaldate_returns_a_result(self):
- # We can check only that it successfully produces a result,
- # not the correctness of the result itself, since the result
- # depends on the timezone the machine is in.
- timevalues = [2000000000, 2000000000.0, time.localtime(2000000000),
- '"18-May-2033 05:33:20 +0200"']
- for t in timevalues:
+
+ def timevalues(self):
+ return [2000000000, 2000000000.0, time.localtime(2000000000),
+ (2033, 5, 18, 5, 33, 20, -1, -1, -1),
+ (2033, 5, 18, 5, 33, 20, -1, -1, 1),
+ datetime.fromtimestamp(2000000000,
+ timezone(timedelta(0, 2*60*60))),
+ '"18-May-2033 05:33:20 +0200"']
+
+ @run_with_locale('LC_ALL', 'de_DE', 'fr_FR')
+ @run_with_tz('STD-1DST')
+ def test_Time2Internaldate(self):
+ expected = '"18-May-2033 05:33:20 +0200"'
+
+ for t in self.timevalues():
+ internal = imaplib.Time2Internaldate(t)
+ self.assertEqual(internal, expected)
+
+ def test_that_Time2Internaldate_returns_a_result(self):
+ # Without tzset, we can check only that it successfully
+ # produces a result, not the correctness of the result itself,
+ # since the result depends on the timezone the machine is in.
+ for t in self.timevalues():
imaplib.Time2Internaldate(t)
@@ -265,11 +281,58 @@ class RemoteIMAP_SSLTest(RemoteIMAPTest):
port = 993
imap_class = IMAP4_SSL
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def create_ssl_context(self):
+ ssl_context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ ssl_context.load_cert_chain(CERTFILE)
+ return ssl_context
+
+ def check_logincapa(self, server):
+ try:
+ for cap in server.capabilities:
+ self.assertIsInstance(cap, str)
+ self.assertNotIn('LOGINDISABLED', server.capabilities)
+ self.assertIn('AUTH=PLAIN', server.capabilities)
+ rs = server.login(self.username, self.password)
+ self.assertEqual(rs[0], 'OK')
+ finally:
+ server.logout()
+
def test_logincapa(self):
- for cap in self.server.capabilities:
- self.assertIsInstance(cap, str)
- self.assertNotIn('LOGINDISABLED', self.server.capabilities)
- self.assertIn('AUTH=PLAIN', self.server.capabilities)
+ with transient_internet(self.host):
+ _server = self.imap_class(self.host, self.port)
+ self.check_logincapa(_server)
+
+ def test_logincapa_with_client_certfile(self):
+ with transient_internet(self.host):
+ _server = self.imap_class(self.host, self.port, certfile=CERTFILE)
+ self.check_logincapa(_server)
+
+ def test_logincapa_with_client_ssl_context(self):
+ with transient_internet(self.host):
+ _server = self.imap_class(self.host, self.port, ssl_context=self.create_ssl_context())
+ self.check_logincapa(_server)
+
+ def test_logout(self):
+ with transient_internet(self.host):
+ _server = self.imap_class(self.host, self.port)
+ rs = _server.logout()
+ self.assertEqual(rs[0], 'BYE')
+
+ def test_ssl_context_certfile_exclusive(self):
+ with transient_internet(self.host):
+ self.assertRaises(ValueError, self.imap_class, self.host, self.port,
+ certfile=CERTFILE, ssl_context=self.create_ssl_context())
+
+ def test_ssl_context_keyfile_exclusive(self):
+ with transient_internet(self.host):
+ self.assertRaises(ValueError, self.imap_class, self.host, self.port,
+ keyfile=CERTFILE, ssl_context=self.create_ssl_context())
def test_main():
diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 551ad1b..65c9f25 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -1,11 +1,12 @@
import imp
+import importlib
import os
import os.path
import shutil
import sys
-import unittest
from test import support
-import importlib
+import unittest
+import warnings
class LockTests(unittest.TestCase):
@@ -58,6 +59,10 @@ class ImportTests(unittest.TestCase):
with imp.find_module('module_' + mod, self.test_path)[0] as fd:
self.assertEqual(fd.encoding, encoding)
+ path = [os.path.dirname(__file__)]
+ with self.assertRaises(SyntaxError):
+ imp.find_module('badsyntax_pep3120', path)
+
def test_issue1267(self):
for mod, encoding, _ in self.test_strings:
fp, filename, info = imp.find_module('module_' + mod,
@@ -150,18 +155,24 @@ class ImportTests(unittest.TestCase):
mod = imp.load_module(temp_mod_name, file, filename, info)
self.assertEqual(mod.a, 1)
- mod = imp.load_source(temp_mod_name, temp_mod_name + '.py')
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ mod = imp.load_source(temp_mod_name, temp_mod_name + '.py')
self.assertEqual(mod.a, 1)
- mod = imp.load_compiled(
- temp_mod_name, imp.cache_from_source(temp_mod_name + '.py'))
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ mod = imp.load_compiled(
+ temp_mod_name, imp.cache_from_source(temp_mod_name + '.py'))
self.assertEqual(mod.a, 1)
if not os.path.exists(test_package_name):
os.mkdir(test_package_name)
with open(init_file_name, 'w') as file:
file.write('b = 2\n')
- package = imp.load_package(test_package_name, test_package_name)
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore')
+ package = imp.load_package(test_package_name, test_package_name)
self.assertEqual(package.b, 2)
finally:
del sys.path[0]
@@ -175,6 +186,48 @@ class ImportTests(unittest.TestCase):
self.assertRaises(SyntaxError,
imp.find_module, "badsyntax_pep3120", [path])
+ def test_load_from_source(self):
+ # Verify that the imp module can correctly load and find .py files
+ # XXX (ncoghlan): It would be nice to use support.CleanImport
+ # here, but that breaks because the os module registers some
+ # handlers in copy_reg on import. Since CleanImport doesn't
+ # revert that registration, the module is left in a broken
+ # state after reversion. Reinitialising the module contents
+ # and just reverting os.environ to its previous state is an OK
+ # workaround
+ orig_path = os.path
+ orig_getenv = os.getenv
+ with support.EnvironmentVarGuard():
+ x = imp.find_module("os")
+ self.addCleanup(x[0].close)
+ new_os = imp.load_module("os", *x)
+ self.assertIs(os, new_os)
+ self.assertIs(orig_path, new_os.path)
+ self.assertIsNot(orig_getenv, new_os.getenv)
+
+ @support.cpython_only
+ def test_issue15828_load_extensions(self):
+ # Issue 15828 picked up that the adapter between the old imp API
+ # and importlib couldn't handle C extensions
+ example = "_heapq"
+ x = imp.find_module(example)
+ file_ = x[0]
+ if file_ is not None:
+ self.addCleanup(file_.close)
+ mod = imp.load_module(example, *x)
+ self.assertEqual(mod.__name__, example)
+
+ def test_load_dynamic_ImportError_path(self):
+ # Issue #1559549 added `name` and `path` attributes to ImportError
+ # in order to provide better detail. Issue #10854 implemented those
+ # attributes on import failures of extensions on Windows.
+ path = 'bogus file path'
+ name = 'extension'
+ with self.assertRaises(ImportError) as err:
+ imp.load_dynamic(name, path)
+ self.assertIn(path, err.exception.path)
+ self.assertEqual(name, err.exception.name)
+
class ReloadTests(unittest.TestCase):
@@ -209,72 +262,83 @@ class PEP3147Tests(unittest.TestCase):
tag = imp.get_tag()
+ @unittest.skipUnless(sys.implementation.cache_tag is not None,
+ 'requires sys.implementation.cache_tag not be None')
def test_cache_from_source(self):
# Given the path to a .py file, return the path to its PEP 3147
# defined .pyc file (i.e. under __pycache__).
- self.assertEqual(
- imp.cache_from_source('/foo/bar/baz/qux.py', True),
- '/foo/bar/baz/__pycache__/qux.{}.pyc'.format(self.tag))
+ path = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ expect = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyc'.format(self.tag))
+ self.assertEqual(imp.cache_from_source(path, True), expect)
+
+ def test_cache_from_source_no_cache_tag(self):
+ # Non cache tag means NotImplementedError.
+ with support.swap_attr(sys.implementation, 'cache_tag', None):
+ with self.assertRaises(NotImplementedError):
+ imp.cache_from_source('whatever.py')
+
+ def test_cache_from_source_no_dot(self):
+ # Directory with a dot, filename without dot.
+ path = os.path.join('foo.bar', 'file')
+ expect = os.path.join('foo.bar', '__pycache__',
+ 'file{}.pyc'.format(self.tag))
+ self.assertEqual(imp.cache_from_source(path, True), expect)
def test_cache_from_source_optimized(self):
# Given the path to a .py file, return the path to its PEP 3147
# defined .pyo file (i.e. under __pycache__).
- self.assertEqual(
- imp.cache_from_source('/foo/bar/baz/qux.py', False),
- '/foo/bar/baz/__pycache__/qux.{}.pyo'.format(self.tag))
+ path = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ expect = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyo'.format(self.tag))
+ self.assertEqual(imp.cache_from_source(path, False), expect)
def test_cache_from_source_cwd(self):
- self.assertEqual(imp.cache_from_source('foo.py', True),
- os.sep.join(('__pycache__',
- 'foo.{}.pyc'.format(self.tag))))
+ path = 'foo.py'
+ expect = os.path.join('__pycache__', 'foo.{}.pyc'.format(self.tag))
+ self.assertEqual(imp.cache_from_source(path, True), expect)
def test_cache_from_source_override(self):
# When debug_override is not None, it can be any true-ish or false-ish
# value.
- self.assertEqual(
- imp.cache_from_source('/foo/bar/baz.py', []),
- '/foo/bar/__pycache__/baz.{}.pyo'.format(self.tag))
- self.assertEqual(
- imp.cache_from_source('/foo/bar/baz.py', [17]),
- '/foo/bar/__pycache__/baz.{}.pyc'.format(self.tag))
+ path = os.path.join('foo', 'bar', 'baz.py')
+ partial_expect = os.path.join('foo', 'bar', '__pycache__',
+ 'baz.{}.py'.format(self.tag))
+ self.assertEqual(imp.cache_from_source(path, []), partial_expect + 'o')
+ self.assertEqual(imp.cache_from_source(path, [17]),
+ partial_expect + 'c')
# However if the bool-ishness can't be determined, the exception
# propagates.
class Bearish:
def __bool__(self): raise RuntimeError
- self.assertRaises(
- RuntimeError,
- imp.cache_from_source, '/foo/bar/baz.py', Bearish())
-
- @unittest.skipIf(os.altsep is None,
- 'test meaningful only where os.altsep is defined')
- def test_altsep_cache_from_source(self):
- # Windows path and PEP 3147.
- self.assertEqual(
- imp.cache_from_source('\\foo\\bar\\baz\\qux.py', True),
- '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag))
+ with self.assertRaises(RuntimeError):
+ imp.cache_from_source('/foo/bar/baz.py', Bearish())
- @unittest.skipIf(os.altsep is None,
- 'test meaningful only where os.altsep is defined')
- def test_altsep_and_sep_cache_from_source(self):
- # Windows path and PEP 3147 where altsep is right of sep.
- self.assertEqual(
- imp.cache_from_source('\\foo\\bar/baz\\qux.py', True),
- '\\foo\\bar/baz\\__pycache__\\qux.{}.pyc'.format(self.tag))
-
- @unittest.skipIf(os.altsep is None,
+ @unittest.skipUnless(os.sep == '\\' and os.altsep == '/',
'test meaningful only where os.altsep is defined')
def test_sep_altsep_and_sep_cache_from_source(self):
# Windows path and PEP 3147 where sep is right of altsep.
self.assertEqual(
imp.cache_from_source('\\foo\\bar\\baz/qux.py', True),
- '\\foo\\bar\\baz/__pycache__/qux.{}.pyc'.format(self.tag))
+ '\\foo\\bar\\baz\\__pycache__\\qux.{}.pyc'.format(self.tag))
+ @unittest.skipUnless(sys.implementation.cache_tag is not None,
+ 'requires sys.implementation.cache_tag to not be '
+ 'None')
def test_source_from_cache(self):
# Given the path to a PEP 3147 defined .pyc file, return the path to
# its source. This tests the good path.
- self.assertEqual(imp.source_from_cache(
- '/foo/bar/baz/__pycache__/qux.{}.pyc'.format(self.tag)),
- '/foo/bar/baz/qux.py')
+ path = os.path.join('foo', 'bar', 'baz', '__pycache__',
+ 'qux.{}.pyc'.format(self.tag))
+ expect = os.path.join('foo', 'bar', 'baz', 'qux.py')
+ self.assertEqual(imp.source_from_cache(path), expect)
+
+ def test_source_from_cache_no_cache_tag(self):
+ # If sys.implementation.cache_tag is None, raise NotImplementedError.
+ path = os.path.join('blah', '__pycache__', 'whatever.pyc')
+ with support.swap_attr(sys.implementation, 'cache_tag', None):
+ with self.assertRaises(NotImplementedError):
+ imp.source_from_cache(path)
def test_source_from_cache_bad_path(self):
# When the path to a pyc file is not in PEP 3147 format, a ValueError
@@ -305,6 +369,12 @@ class PEP3147Tests(unittest.TestCase):
'/foo/bar/foo.cpython-32.foo.pyc')
def test_package___file__(self):
+ try:
+ m = __import__('pep3147')
+ except ImportError:
+ pass
+ else:
+ self.fail("pep3147 module already exists: %r" % (m,))
# Test that a package's __file__ points to the right source directory.
os.mkdir('pep3147')
sys.path.insert(0, os.curdir)
@@ -314,14 +384,16 @@ class PEP3147Tests(unittest.TestCase):
shutil.rmtree('pep3147')
self.addCleanup(cleanup)
# Touch the __init__.py file.
- with open('pep3147/__init__.py', 'w'):
- pass
+ support.create_empty_file('pep3147/__init__.py')
+ importlib.invalidate_caches()
+ expected___file__ = os.sep.join(('.', 'pep3147', '__init__.py'))
m = __import__('pep3147')
+ self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache))
# Ensure we load the pyc file.
- support.forget('pep3147')
+ support.unload('pep3147')
m = __import__('pep3147')
- self.assertEqual(m.__file__,
- os.sep.join(('.', 'pep3147', '__init__.py')))
+ support.unload('pep3147')
+ self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache))
class NullImporterTests(unittest.TestCase):
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index b10f350..b0e5a95 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -1,7 +1,8 @@
+# We import importlib *ASAP* in order to test #15386
+import importlib
import builtins
import imp
-from importlib.test.import_ import test_relative_imports
-from importlib.test.import_ import util as importlib_util
+from test.test_importlib.import_ import util as importlib_util
import marshal
import os
import platform
@@ -12,39 +13,50 @@ import sys
import unittest
import textwrap
import errno
+import shutil
+import contextlib
+import test.support
from test.support import (
EnvironmentVarGuard, TESTFN, check_warnings, forget, is_jython,
make_legacy_pyc, rmtree, run_unittest, swap_attr, swap_item, temp_umask,
- unlink, unload)
+ unlink, unload, create_empty_file, cpython_only)
from test import script_helper
-def _files(name):
- return (name + os.extsep + "py",
- name + os.extsep + "pyc",
- name + os.extsep + "pyo",
- name + os.extsep + "pyw",
- name + "$py.class")
-
-def chmod_files(name):
- for f in _files(name):
- try:
- os.chmod(f, 0o600)
- except OSError as exc:
- if exc.errno != errno.ENOENT:
- raise
-
def remove_files(name):
- for f in _files(name):
+ for f in (name + ".py",
+ name + ".pyc",
+ name + ".pyo",
+ name + ".pyw",
+ name + "$py.class"):
unlink(f)
rmtree('__pycache__')
+@contextlib.contextmanager
+def _ready_to_import(name=None, source=""):
+ # sets up a temporary directory and removes it
+ # creates the module file
+ # temporarily clears the module from sys.modules (if any)
+ name = name or "spam"
+ with script_helper.temp_dir() as tempdir:
+ path = script_helper.make_script(tempdir, name, source)
+ old_module = sys.modules.pop(name, None)
+ try:
+ sys.path.insert(0, tempdir)
+ yield name, path
+ sys.path.remove(tempdir)
+ finally:
+ if old_module is not None:
+ sys.modules[name] = old_module
+
+
class ImportTests(unittest.TestCase):
def setUp(self):
remove_files(TESTFN)
+ importlib.invalidate_caches()
def tearDown(self):
unload(TESTFN)
@@ -82,6 +94,7 @@ class ImportTests(unittest.TestCase):
if TESTFN in sys.modules:
del sys.modules[TESTFN]
+ importlib.invalidate_caches()
try:
try:
mod = __import__(TESTFN)
@@ -107,90 +120,6 @@ class ImportTests(unittest.TestCase):
finally:
del sys.path[0]
- @unittest.skipUnless(os.name == 'posix',
- "test meaningful only on posix systems")
- def test_execute_bit_not_copied(self):
- # Issue 6070: under posix .pyc files got their execute bit set if
- # the .py file had the execute bit set, but they aren't executable.
- with temp_umask(0o022):
- sys.path.insert(0, os.curdir)
- try:
- fname = TESTFN + os.extsep + "py"
- open(fname, 'w').close()
- os.chmod(fname, (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH |
- stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH))
- fn = imp.cache_from_source(fname)
- unlink(fn)
- __import__(TESTFN)
- if not os.path.exists(fn):
- self.fail("__import__ did not result in creation of "
- "either a .pyc or .pyo file")
- s = os.stat(fn)
- self.assertEqual(stat.S_IMODE(s.st_mode),
- stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
- finally:
- del sys.path[0]
- remove_files(TESTFN)
- unload(TESTFN)
-
- def test_rewrite_pyc_with_read_only_source(self):
- # Issue 6074: a long time ago on posix, and more recently on Windows,
- # a read only source file resulted in a read only pyc file, which
- # led to problems with updating it later
- sys.path.insert(0, os.curdir)
- fname = TESTFN + os.extsep + "py"
- try:
- # Write a Python file, make it read-only and import it
- with open(fname, 'w') as f:
- f.write("x = 'original'\n")
- # Tweak the mtime of the source to ensure pyc gets updated later
- s = os.stat(fname)
- os.utime(fname, (s.st_atime, s.st_mtime-100000000))
- os.chmod(fname, 0o400)
- m1 = __import__(TESTFN)
- self.assertEqual(m1.x, 'original')
- # Change the file and then reimport it
- os.chmod(fname, 0o600)
- with open(fname, 'w') as f:
- f.write("x = 'rewritten'\n")
- unload(TESTFN)
- m2 = __import__(TESTFN)
- self.assertEqual(m2.x, 'rewritten')
- # Now delete the source file and check the pyc was rewritten
- unlink(fname)
- unload(TESTFN)
- if __debug__:
- bytecode_name = fname + "c"
- else:
- bytecode_name = fname + "o"
- os.rename(imp.cache_from_source(fname), bytecode_name)
- m3 = __import__(TESTFN)
- self.assertEqual(m3.x, 'rewritten')
- finally:
- chmod_files(TESTFN)
- remove_files(TESTFN)
- unload(TESTFN)
- del sys.path[0]
-
- def test_imp_module(self):
- # Verify that the imp module can correctly load and find .py files
- # XXX (ncoghlan): It would be nice to use support.CleanImport
- # here, but that breaks because the os module registers some
- # handlers in copy_reg on import. Since CleanImport doesn't
- # revert that registration, the module is left in a broken
- # state after reversion. Reinitialising the module contents
- # and just reverting os.environ to its previous state is an OK
- # workaround
- orig_path = os.path
- orig_getenv = os.getenv
- with EnvironmentVarGuard():
- x = imp.find_module("os")
- self.addCleanup(x[0].close)
- new_os = imp.load_module("os", *x)
- self.assertIs(os, new_os)
- self.assertIs(orig_path, new_os.path)
- self.assertIsNot(orig_getenv, new_os.getenv)
-
def test_bug7732(self):
source = TESTFN + '.py'
os.mkdir(source)
@@ -220,6 +149,7 @@ class ImportTests(unittest.TestCase):
# Need to be able to load from current dir.
sys.path.append('')
+ importlib.invalidate_caches()
try:
make_legacy_pyc(filename)
@@ -239,6 +169,7 @@ class ImportTests(unittest.TestCase):
# New in 2.4, we shouldn't be able to import that no matter how often
# we try.
sys.path.insert(0, os.curdir)
+ importlib.invalidate_caches()
if TESTFN in sys.modules:
del sys.modules[TESTFN]
try:
@@ -312,6 +243,7 @@ class ImportTests(unittest.TestCase):
os.remove(source)
del sys.modules[TESTFN]
make_legacy_pyc(source)
+ importlib.invalidate_caches()
mod = __import__(TESTFN)
base, ext = os.path.splitext(mod.__file__)
self.assertIn(ext, ('.pyc', '.pyo'))
@@ -332,12 +264,6 @@ class ImportTests(unittest.TestCase):
import test.support as y
self.assertIs(y, test.support, y.__name__)
- def test_import_initless_directory_warning(self):
- with check_warnings(('', ImportWarning)):
- # Just a random non-package directory we always expect to be
- # somewhere in sys.path...
- self.assertRaises(ImportError, __import__, "site-packages")
-
def test_import_by_filename(self):
path = os.path.abspath(TESTFN)
encoding = sys.getfilesystemencoding()
@@ -347,8 +273,6 @@ class ImportTests(unittest.TestCase):
self.skipTest('path is not encodable to {}'.format(encoding))
with self.assertRaises(ImportError) as c:
__import__(path)
- self.assertEqual("Import by filename is not supported.",
- c.exception.args[0])
def test_import_in_del_does_not_crash(self):
# Issue 4236
@@ -385,6 +309,98 @@ class ImportTests(unittest.TestCase):
del sys.path[0]
remove_files(TESTFN)
+ def test_bogus_fromlist(self):
+ try:
+ __import__('http', fromlist=['blah'])
+ except ImportError:
+ self.fail("fromlist must allow bogus names")
+
+
+class FilePermissionTests(unittest.TestCase):
+ # tests for file mode on cached .pyc/.pyo files
+
+ @unittest.skipUnless(os.name == 'posix',
+ "test meaningful only on posix systems")
+ def test_creation_mode(self):
+ mask = 0o022
+ with temp_umask(mask), _ready_to_import() as (name, path):
+ cached_path = imp.cache_from_source(path)
+ module = __import__(name)
+ if not os.path.exists(cached_path):
+ self.fail("__import__ did not result in creation of "
+ "either a .pyc or .pyo file")
+ stat_info = os.stat(cached_path)
+
+ # Check that the umask is respected, and the executable bits
+ # aren't set.
+ self.assertEqual(oct(stat.S_IMODE(stat_info.st_mode)),
+ oct(0o666 & ~mask))
+
+ @unittest.skipUnless(os.name == 'posix',
+ "test meaningful only on posix systems")
+ def test_cached_mode_issue_2051(self):
+ # permissions of .pyc should match those of .py, regardless of mask
+ mode = 0o600
+ with temp_umask(0o022), _ready_to_import() as (name, path):
+ cached_path = imp.cache_from_source(path)
+ os.chmod(path, mode)
+ __import__(name)
+ if not os.path.exists(cached_path):
+ self.fail("__import__ did not result in creation of "
+ "either a .pyc or .pyo file")
+ stat_info = os.stat(cached_path)
+
+ self.assertEqual(oct(stat.S_IMODE(stat_info.st_mode)), oct(mode))
+
+ @unittest.skipUnless(os.name == 'posix',
+ "test meaningful only on posix systems")
+ def test_cached_readonly(self):
+ mode = 0o400
+ with temp_umask(0o022), _ready_to_import() as (name, path):
+ cached_path = imp.cache_from_source(path)
+ os.chmod(path, mode)
+ __import__(name)
+ if not os.path.exists(cached_path):
+ self.fail("__import__ did not result in creation of "
+ "either a .pyc or .pyo file")
+ stat_info = os.stat(cached_path)
+
+ expected = mode | 0o200 # Account for fix for issue #6074
+ self.assertEqual(oct(stat.S_IMODE(stat_info.st_mode)), oct(expected))
+
+ def test_pyc_always_writable(self):
+ # Initially read-only .pyc files on Windows used to cause problems
+ # with later updates, see issue #6074 for details
+ with _ready_to_import() as (name, path):
+ # Write a Python file, make it read-only and import it
+ with open(path, 'w') as f:
+ f.write("x = 'original'\n")
+ # Tweak the mtime of the source to ensure pyc gets updated later
+ s = os.stat(path)
+ os.utime(path, (s.st_atime, s.st_mtime-100000000))
+ os.chmod(path, 0o400)
+ m = __import__(name)
+ self.assertEqual(m.x, 'original')
+ # Change the file and then reimport it
+ os.chmod(path, 0o600)
+ with open(path, 'w') as f:
+ f.write("x = 'rewritten'\n")
+ unload(name)
+ importlib.invalidate_caches()
+ m = __import__(name)
+ self.assertEqual(m.x, 'rewritten')
+ # Now delete the source file and check the pyc was rewritten
+ unlink(path)
+ unload(name)
+ importlib.invalidate_caches()
+ if __debug__:
+ bytecode_only = path + "c"
+ else:
+ bytecode_only = path + "o"
+ os.rename(imp.cache_from_source(path), bytecode_only)
+ m = __import__(name)
+ self.assertEqual(m.x, 'rewritten')
+
class PycRewritingTests(unittest.TestCase):
# Test that the `co_filename` attribute on code objects always points
@@ -412,6 +428,7 @@ func_filename = func.__code__.co_filename
with open(self.file_name, "w") as f:
f.write(self.module_source)
sys.path.insert(0, self.dir_name)
+ importlib.invalidate_caches()
def tearDown(self):
sys.path[:] = self.sys_path
@@ -451,6 +468,7 @@ func_filename = func.__code__.co_filename
py_compile.compile(self.file_name, dfile=target)
os.remove(self.file_name)
pyc_file = make_legacy_pyc(self.file_name)
+ importlib.invalidate_caches()
mod = self.import_module()
self.assertEqual(mod.module_filename, pyc_file)
self.assertEqual(mod.code_filename, target)
@@ -459,7 +477,7 @@ func_filename = func.__code__.co_filename
def test_foreign_code(self):
py_compile.compile(self.file_name)
with open(self.compiled_name, "rb") as f:
- header = f.read(8)
+ header = f.read(12)
code = marshal.load(f)
constants = list(code.co_consts)
foreign_code = test_main.__code__
@@ -501,9 +519,11 @@ class PathsTests(unittest.TestCase):
unload("test_trailing_slash")
# Regression test for http://bugs.python.org/issue3677.
- def _test_UNC_path(self):
- with open(os.path.join(self.path, 'test_trailing_slash.py'), 'w') as f:
- f.write("testdata = 'test_trailing_slash'")
+ @unittest.skipUnless(sys.platform == 'win32', 'Windows-specific')
+ def test_UNC_path(self):
+ with open(os.path.join(self.path, 'test_unc_path.py'), 'w') as f:
+ f.write("testdata = 'test_unc_path'")
+ importlib.invalidate_caches()
# Create the UNC path, like \\myhost\c$\foo\bar.
path = os.path.abspath(self.path)
import socket
@@ -518,13 +538,15 @@ class PathsTests(unittest.TestCase):
# See issue #15338
self.skipTest("cannot access administrative share %r" % (unc,))
raise
- sys.path.append(path)
- mod = __import__("test_trailing_slash")
- self.assertEqual(mod.testdata, 'test_trailing_slash')
- unload("test_trailing_slash")
-
- if sys.platform == "win32":
- test_UNC_path = _test_UNC_path
+ sys.path.insert(0, unc)
+ try:
+ mod = __import__("test_unc_path")
+ except ImportError as e:
+ self.fail("could not import 'test_unc_path' from %r: %r"
+ % (unc, e))
+ self.assertEqual(mod.testdata, 'test_unc_path')
+ self.assertTrue(mod.__file__.startswith(unc), mod.__file__)
+ unload("test_unc_path")
class RelativeImportTests(unittest.TestCase):
@@ -565,7 +587,7 @@ class RelativeImportTests(unittest.TestCase):
# Check relative import fails with package set to a non-string
ns = dict(__package__=object())
- self.assertRaises(ValueError, check_relative)
+ self.assertRaises(TypeError, check_relative)
def test_absolute_import_without_future(self):
# If explicit relative import syntax is used, then do not try
@@ -613,6 +635,7 @@ class PycacheTests(unittest.TestCase):
with open(self.source, 'w') as fp:
print('# This is a test file written by test_import.py', file=fp)
sys.path.insert(0, os.curdir)
+ importlib.invalidate_caches()
def tearDown(self):
assert sys.path[0] == os.curdir, 'Unexpected sys.path[0]'
@@ -660,6 +683,7 @@ class PycacheTests(unittest.TestCase):
pyc_file = make_legacy_pyc(self.source)
os.remove(self.source)
unload(TESTFN)
+ importlib.invalidate_caches()
m = __import__(TESTFN)
self.assertEqual(m.__file__,
os.path.join(os.curdir, os.path.relpath(pyc_file)))
@@ -680,6 +704,7 @@ class PycacheTests(unittest.TestCase):
pyc_file = make_legacy_pyc(self.source)
os.remove(self.source)
unload(TESTFN)
+ importlib.invalidate_caches()
m = __import__(TESTFN)
self.assertEqual(m.__cached__,
os.path.join(os.curdir, os.path.relpath(pyc_file)))
@@ -688,6 +713,8 @@ class PycacheTests(unittest.TestCase):
# Like test___cached__ but for packages.
def cleanup():
rmtree('pep3147')
+ unload('pep3147.foo')
+ unload('pep3147')
os.mkdir('pep3147')
self.addCleanup(cleanup)
# Touch the __init__.py
@@ -695,8 +722,7 @@ class PycacheTests(unittest.TestCase):
pass
with open(os.path.join('pep3147', 'foo.py'), 'w'):
pass
- unload('pep3147.foo')
- unload('pep3147')
+ importlib.invalidate_caches()
m = __import__('pep3147.foo')
init_pyc = imp.cache_from_source(
os.path.join('pep3147', '__init__.py'))
@@ -710,18 +736,20 @@ class PycacheTests(unittest.TestCase):
# PEP 3147 pyc file.
def cleanup():
rmtree('pep3147')
+ unload('pep3147.foo')
+ unload('pep3147')
os.mkdir('pep3147')
self.addCleanup(cleanup)
- unload('pep3147.foo')
- unload('pep3147')
# Touch the __init__.py
with open(os.path.join('pep3147', '__init__.py'), 'w'):
pass
with open(os.path.join('pep3147', 'foo.py'), 'w'):
pass
+ importlib.invalidate_caches()
m = __import__('pep3147.foo')
unload('pep3147.foo')
unload('pep3147')
+ importlib.invalidate_caches()
m = __import__('pep3147.foo')
init_pyc = imp.cache_from_source(
os.path.join('pep3147', '__init__.py'))
@@ -730,22 +758,256 @@ class PycacheTests(unittest.TestCase):
self.assertEqual(sys.modules['pep3147.foo'].__cached__,
os.path.join(os.curdir, foo_pyc))
+ def test_recompute_pyc_same_second(self):
+ # Even when the source file doesn't change timestamp, a change in
+ # source size is enough to trigger recomputation of the pyc file.
+ __import__(TESTFN)
+ unload(TESTFN)
+ with open(self.source, 'a') as fp:
+ print("x = 5", file=fp)
+ m = __import__(TESTFN)
+ self.assertEqual(m.x, 5)
+
-class RelativeImportFromImportlibTests(test_relative_imports.RelativeImports):
+class TestSymbolicallyLinkedPackage(unittest.TestCase):
+ package_name = 'sample'
+ tagged = package_name + '-tagged'
def setUp(self):
- self._importlib_util_flag = importlib_util.using___import__
- importlib_util.using___import__ = True
+ test.support.rmtree(self.tagged)
+ test.support.rmtree(self.package_name)
+ self.orig_sys_path = sys.path[:]
+
+ # create a sample package; imagine you have a package with a tag and
+ # you want to symbolically link it from its untagged name.
+ os.mkdir(self.tagged)
+ self.addCleanup(test.support.rmtree, self.tagged)
+ init_file = os.path.join(self.tagged, '__init__.py')
+ test.support.create_empty_file(init_file)
+ assert os.path.exists(init_file)
+
+ # now create a symlink to the tagged package
+ # sample -> sample-tagged
+ os.symlink(self.tagged, self.package_name, target_is_directory=True)
+ self.addCleanup(test.support.unlink, self.package_name)
+ importlib.invalidate_caches()
+
+ self.assertEqual(os.path.isdir(self.package_name), True)
+
+ assert os.path.isfile(os.path.join(self.package_name, '__init__.py'))
def tearDown(self):
- importlib_util.using___import__ = self._importlib_util_flag
+ sys.path[:] = self.orig_sys_path
+
+ # regression test for issue6727
+ @unittest.skipUnless(
+ not hasattr(sys, 'getwindowsversion')
+ or sys.getwindowsversion() >= (6, 0),
+ "Windows Vista or later required")
+ @test.support.skip_unless_symlink
+ def test_symlinked_dir_importable(self):
+ # make sure sample can only be imported from the current directory.
+ sys.path[:] = ['.']
+ assert os.path.exists(self.package_name)
+ assert os.path.exists(os.path.join(self.package_name, '__init__.py'))
+
+ # Try to import the package
+ importlib.import_module(self.package_name)
+
+
+@cpython_only
+class ImportlibBootstrapTests(unittest.TestCase):
+ # These tests check that importlib is bootstrapped.
+
+ def test_frozen_importlib(self):
+ mod = sys.modules['_frozen_importlib']
+ self.assertTrue(mod)
+
+ def test_frozen_importlib_is_bootstrap(self):
+ from importlib import _bootstrap
+ mod = sys.modules['_frozen_importlib']
+ self.assertIs(mod, _bootstrap)
+ self.assertEqual(mod.__name__, 'importlib._bootstrap')
+ self.assertEqual(mod.__package__, 'importlib')
+ self.assertTrue(mod.__file__.endswith('_bootstrap.py'), mod.__file__)
+
+ def test_there_can_be_only_one(self):
+ # Issue #15386 revealed a tricky loophole in the bootstrapping
+ # This test is technically redundant, since the bug caused importing
+ # this test module to crash completely, but it helps prove the point
+ from importlib import machinery
+ mod = sys.modules['_frozen_importlib']
+ self.assertIs(machinery.FileFinder, mod.FileFinder)
+ self.assertIs(imp.new_module, mod.new_module)
+
+
+class ImportTracebackTests(unittest.TestCase):
+
+ def setUp(self):
+ os.mkdir(TESTFN)
+ self.old_path = sys.path[:]
+ sys.path.insert(0, TESTFN)
+
+ def tearDown(self):
+ sys.path[:] = self.old_path
+ rmtree(TESTFN)
+
+ def create_module(self, mod, contents, ext=".py"):
+ fname = os.path.join(TESTFN, mod + ext)
+ with open(fname, "w") as f:
+ f.write(contents)
+ self.addCleanup(unload, mod)
+ importlib.invalidate_caches()
+ return fname
+
+ def assert_traceback(self, tb, files):
+ deduped_files = []
+ while tb:
+ code = tb.tb_frame.f_code
+ fn = code.co_filename
+ if not deduped_files or fn != deduped_files[-1]:
+ deduped_files.append(fn)
+ tb = tb.tb_next
+ self.assertEqual(len(deduped_files), len(files), deduped_files)
+ for fn, pat in zip(deduped_files, files):
+ self.assertIn(pat, fn)
+
+ def test_nonexistent_module(self):
+ try:
+ # assertRaises() clears __traceback__
+ import nonexistent_xyzzy
+ except ImportError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ImportError should have been raised")
+ self.assert_traceback(tb, [__file__])
+
+ def test_nonexistent_module_nested(self):
+ self.create_module("foo", "import nonexistent_xyzzy")
+ try:
+ import foo
+ except ImportError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ImportError should have been raised")
+ self.assert_traceback(tb, [__file__, 'foo.py'])
+
+ def test_exec_failure(self):
+ self.create_module("foo", "1/0")
+ try:
+ import foo
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, 'foo.py'])
+
+ def test_exec_failure_nested(self):
+ self.create_module("foo", "import bar")
+ self.create_module("bar", "1/0")
+ try:
+ import foo
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, 'foo.py', 'bar.py'])
+
+ # A few more examples from issue #15425
+ def test_syntax_error(self):
+ self.create_module("foo", "invalid syntax is invalid")
+ try:
+ import foo
+ except SyntaxError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("SyntaxError should have been raised")
+ self.assert_traceback(tb, [__file__])
+
+ def _setup_broken_package(self, parent, child):
+ pkg_name = "_parent_foo"
+ self.addCleanup(unload, pkg_name)
+ pkg_path = os.path.join(TESTFN, pkg_name)
+ os.mkdir(pkg_path)
+ # Touch the __init__.py
+ init_path = os.path.join(pkg_path, '__init__.py')
+ with open(init_path, 'w') as f:
+ f.write(parent)
+ bar_path = os.path.join(pkg_path, 'bar.py')
+ with open(bar_path, 'w') as f:
+ f.write(child)
+ importlib.invalidate_caches()
+ return init_path, bar_path
+
+ def test_broken_submodule(self):
+ init_path, bar_path = self._setup_broken_package("", "1/0")
+ try:
+ import _parent_foo.bar
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, bar_path])
+
+ def test_broken_from(self):
+ init_path, bar_path = self._setup_broken_package("", "1/0")
+ try:
+ from _parent_foo import bar
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ImportError should have been raised")
+ self.assert_traceback(tb, [__file__, bar_path])
+
+ def test_broken_parent(self):
+ init_path, bar_path = self._setup_broken_package("1/0", "")
+ try:
+ import _parent_foo.bar
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, init_path])
+
+ def test_broken_parent_from(self):
+ init_path, bar_path = self._setup_broken_package("1/0", "")
+ try:
+ from _parent_foo import bar
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, init_path])
+
+ @cpython_only
+ def test_import_bug(self):
+ # We simulate a bug in importlib and check that it's not stripped
+ # away from the traceback.
+ self.create_module("foo", "")
+ importlib = sys.modules['_frozen_importlib']
+ old_load_module = importlib.SourceLoader.load_module
+ try:
+ def load_module(*args):
+ 1/0
+ importlib.SourceLoader.load_module = load_module
+ try:
+ import foo
+ except ZeroDivisionError as e:
+ tb = e.__traceback__
+ else:
+ self.fail("ZeroDivisionError should have been raised")
+ self.assert_traceback(tb, [__file__, '<frozen importlib', __file__])
+ finally:
+ importlib.SourceLoader.load_module = old_load_module
def test_main(verbose=None):
- run_unittest(ImportTests, PycacheTests,
+ run_unittest(ImportTests, PycacheTests, FilePermissionTests,
PycRewritingTests, PathsTests, RelativeImportTests,
OverridingImportBuiltinTests,
- RelativeImportFromImportlibTests)
+ ImportlibBootstrapTests,
+ TestSymbolicallyLinkedPackage,
+ ImportTracebackTests)
if __name__ == '__main__':
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
index ec6730e..2a22d1a 100644
--- a/Lib/test/test_importhooks.py
+++ b/Lib/test/test_importhooks.py
@@ -51,7 +51,7 @@ class TestImporter:
def __init__(self, path=test_path):
if path != test_path:
- # if out class is on sys.path_hooks, we must raise
+ # if our class is on sys.path_hooks, we must raise
# ImportError for any path item that we can't handle.
raise ImportError
self.path = path
@@ -215,7 +215,7 @@ class ImportHooksTestCase(ImportHooksBaseTestCase):
self.doTestImports(i)
def testPathHook(self):
- sys.path_hooks.append(PathImporter)
+ sys.path_hooks.insert(0, PathImporter)
sys.path.append(test_path)
self.doTestImports()
@@ -228,8 +228,10 @@ class ImportHooksTestCase(ImportHooksBaseTestCase):
def testImpWrapper(self):
i = ImpWrapper()
sys.meta_path.append(i)
- sys.path_hooks.append(ImpWrapper)
- mnames = ("colorsys", "urllib.parse", "distutils.core")
+ sys.path_hooks.insert(0, ImpWrapper)
+ mnames = (
+ "colorsys", "urllib.parse", "distutils.core", "sys",
+ )
for mname in mnames:
parent = mname.split(".")[0]
for n in list(sys.modules):
@@ -237,7 +239,8 @@ class ImportHooksTestCase(ImportHooksBaseTestCase):
del sys.modules[n]
for mname in mnames:
m = __import__(mname, globals(), locals(), ["__dummy__"])
- m.__loader__ # to make sure we actually handled the import
+ # to make sure we actually handled the import
+ self.assertTrue(hasattr(m, "__loader__"))
def test_main():
diff --git a/Lib/test/test_importlib.py b/Lib/test/test_importlib.py
deleted file mode 100644
index 6ed0585..0000000
--- a/Lib/test/test_importlib.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from importlib.test.__main__ import test_main
-
-
-if __name__ == '__main__':
- test_main()
diff --git a/Lib/test/test_importlib/__init__.py b/Lib/test/test_importlib/__init__.py
new file mode 100644
index 0000000..0e345cd
--- /dev/null
+++ b/Lib/test/test_importlib/__init__.py
@@ -0,0 +1,33 @@
+import os
+import sys
+from test import support
+import unittest
+
+def test_suite(package=__package__, directory=os.path.dirname(__file__)):
+ suite = unittest.TestSuite()
+ for name in os.listdir(directory):
+ if name.startswith(('.', '__')):
+ continue
+ path = os.path.join(directory, name)
+ if (os.path.isfile(path) and name.startswith('test_') and
+ name.endswith('.py')):
+ submodule_name = os.path.splitext(name)[0]
+ module_name = "{0}.{1}".format(package, submodule_name)
+ __import__(module_name, level=0)
+ module_tests = unittest.findTestCases(sys.modules[module_name])
+ suite.addTest(module_tests)
+ elif os.path.isdir(path):
+ package_name = "{0}.{1}".format(package, name)
+ __import__(package_name, level=0)
+ package_tests = getattr(sys.modules[package_name], 'test_suite')()
+ suite.addTest(package_tests)
+ else:
+ continue
+ return suite
+
+
+def test_main():
+ start_dir = os.path.dirname(__file__)
+ top_dir = os.path.dirname(os.path.dirname(start_dir))
+ test_loader = unittest.TestLoader()
+ support.run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir))
diff --git a/Lib/test/test_importlib/__main__.py b/Lib/test/test_importlib/__main__.py
new file mode 100644
index 0000000..c397128
--- /dev/null
+++ b/Lib/test/test_importlib/__main__.py
@@ -0,0 +1,20 @@
+"""Run importlib's test suite.
+
+Specifying the ``--builtin`` flag will run tests, where applicable, with
+builtins.__import__ instead of importlib.__import__.
+
+"""
+from . import test_main
+
+
+if __name__ == '__main__':
+ import argparse
+
+ parser = argparse.ArgumentParser(description='Execute the importlib test '
+ 'suite')
+ parser.add_argument('-b', '--builtin', action='store_true', default=False,
+ help='use builtins.__import__() instead of importlib')
+ args = parser.parse_args()
+ if args.builtin:
+ util.using___import__ = True
+ test_main()
diff --git a/Lib/importlib/test/abc.py b/Lib/test/test_importlib/abc.py
index 2c17ac3..2c17ac3 100644
--- a/Lib/importlib/test/abc.py
+++ b/Lib/test/test_importlib/abc.py
diff --git a/Lib/importlib/test/builtin/__init__.py b/Lib/test/test_importlib/builtin/__init__.py
index 31a3b5f..15c0ade 100644
--- a/Lib/importlib/test/builtin/__init__.py
+++ b/Lib/test/test_importlib/builtin/__init__.py
@@ -1,10 +1,10 @@
-import importlib.test
+from .. import test_suite
import os
def test_suite():
directory = os.path.dirname(__file__)
- return importlib.test.test_suite('importlib.test.builtin', directory)
+ return test_suite('importlib.test.builtin', directory)
if __name__ == '__main__':
diff --git a/Lib/importlib/test/builtin/test_finder.py b/Lib/test/test_importlib/builtin/test_finder.py
index 40f690e..146538d 100644
--- a/Lib/importlib/test/builtin/test_finder.py
+++ b/Lib/test/test_importlib/builtin/test_finder.py
@@ -35,14 +35,14 @@ class FinderTests(abc.FinderTests):
def test_failure(self):
assert 'importlib' not in sys.builtin_module_names
loader = machinery.BuiltinImporter.find_module('importlib')
- self.assertTrue(loader is None)
+ self.assertIsNone(loader)
def test_ignore_path(self):
# The value for 'path' should always trigger a failed import.
with util.uncache(builtin_util.NAME):
loader = machinery.BuiltinImporter.find_module(builtin_util.NAME,
['pkg'])
- self.assertTrue(loader is None)
+ self.assertIsNone(loader)
diff --git a/Lib/importlib/test/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py
index 1a8539b..8e186e7 100644
--- a/Lib/importlib/test/builtin/test_loader.py
+++ b/Lib/test/test_importlib/builtin/test_loader.py
@@ -18,10 +18,10 @@ class LoaderTests(abc.LoaderTests):
def verify(self, module):
"""Verify that the module matches against what it should have."""
- self.assertTrue(isinstance(module, types.ModuleType))
+ self.assertIsInstance(module, types.ModuleType)
for attr, value in self.verification.items():
self.assertEqual(getattr(module, attr), value)
- self.assertTrue(module.__name__ in sys.modules)
+ self.assertIn(module.__name__, sys.modules)
load_module = staticmethod(lambda name:
machinery.BuiltinImporter.load_module(name))
@@ -49,20 +49,22 @@ class LoaderTests(abc.LoaderTests):
with util.uncache(builtin_util.NAME):
module1 = self.load_module(builtin_util.NAME)
module2 = self.load_module(builtin_util.NAME)
- self.assertTrue(module1 is module2)
+ self.assertIs(module1, module2)
def test_unloadable(self):
name = 'dssdsdfff'
assert name not in sys.builtin_module_names
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.load_module(name)
+ self.assertEqual(cm.exception.name, name)
def test_already_imported(self):
# Using the name of a module already imported but not a built-in should
# still fail.
assert hasattr(importlib, '__file__') # Not a built-in.
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.load_module('importlib')
+ self.assertEqual(cm.exception.name, 'importlib')
class InspectLoaderTests(unittest.TestCase):
@@ -72,12 +74,12 @@ class InspectLoaderTests(unittest.TestCase):
def test_get_code(self):
# There is no code object.
result = machinery.BuiltinImporter.get_code(builtin_util.NAME)
- self.assertTrue(result is None)
+ self.assertIsNone(result)
def test_get_source(self):
# There is no source.
result = machinery.BuiltinImporter.get_source(builtin_util.NAME)
- self.assertTrue(result is None)
+ self.assertIsNone(result)
def test_is_package(self):
# Cannot be a package.
@@ -88,8 +90,9 @@ class InspectLoaderTests(unittest.TestCase):
# Modules not built-in should raise ImportError.
for meth_name in ('get_code', 'get_source', 'is_package'):
method = getattr(machinery.BuiltinImporter, meth_name)
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
method(builtin_util.BAD_NAME)
+ self.assertRaises(builtin_util.BAD_NAME)
diff --git a/Lib/importlib/test/builtin/util.py b/Lib/test/test_importlib/builtin/util.py
index 5704699..5704699 100644
--- a/Lib/importlib/test/builtin/util.py
+++ b/Lib/test/test_importlib/builtin/util.py
diff --git a/Lib/importlib/test/frozen/__init__.py b/Lib/test/test_importlib/extension/__init__.py
index 2945eeb..c033923 100644
--- a/Lib/importlib/test/frozen/__init__.py
+++ b/Lib/test/test_importlib/extension/__init__.py
@@ -1,11 +1,11 @@
-import importlib.test
+from .. import test_suite
import os.path
import unittest
def test_suite():
directory = os.path.dirname(__file__)
- return importlib.test.test_suite('importlib.test.frozen', directory)
+ return test_suite('importlib.test.extension', directory)
if __name__ == '__main__':
diff --git a/Lib/importlib/test/extension/test_case_sensitivity.py b/Lib/test/test_importlib/extension/test_case_sensitivity.py
index e062fb6..76c53e4 100644
--- a/Lib/importlib/test/extension/test_case_sensitivity.py
+++ b/Lib/test/test_importlib/extension/test_case_sensitivity.py
@@ -1,3 +1,4 @@
+import imp
import sys
from test import support
import unittest
@@ -13,19 +14,26 @@ class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
good_name = ext_util.NAME
bad_name = good_name.upper()
assert good_name != bad_name
- finder = _bootstrap._FileFinder(ext_util.PATH,
- _bootstrap._ExtensionFinderDetails())
+ finder = _bootstrap.FileFinder(ext_util.PATH,
+ (_bootstrap.ExtensionFileLoader,
+ _bootstrap.EXTENSION_SUFFIXES))
return finder.find_module(bad_name)
def test_case_sensitive(self):
with support.EnvironmentVarGuard() as env:
env.unset('PYTHONCASEOK')
+ if b'PYTHONCASEOK' in _bootstrap._os.environ:
+ self.skipTest('os.environ changes not reflected in '
+ '_os.environ')
loader = self.find_module()
self.assertIsNone(loader)
def test_case_insensitivity(self):
with support.EnvironmentVarGuard() as env:
env.set('PYTHONCASEOK', '1')
+ if b'PYTHONCASEOK' not in _bootstrap._os.environ:
+ self.skipTest('os.environ changes not reflected in '
+ '_os.environ')
loader = self.find_module()
self.assertTrue(hasattr(loader, 'load_module'))
diff --git a/Lib/importlib/test/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py
index ea97483..a63cfdb 100644
--- a/Lib/importlib/test/extension/test_finder.py
+++ b/Lib/test/test_importlib/extension/test_finder.py
@@ -1,4 +1,4 @@
-from importlib import _bootstrap
+from importlib import machinery
from .. import abc
from . import util
@@ -9,15 +9,16 @@ class FinderTests(abc.FinderTests):
"""Test the finder for extension modules."""
def find_module(self, fullname):
- importer = _bootstrap._FileFinder(util.PATH,
- _bootstrap._ExtensionFinderDetails())
+ importer = machinery.FileFinder(util.PATH,
+ (machinery.ExtensionFileLoader,
+ machinery.EXTENSION_SUFFIXES))
return importer.find_module(fullname)
def test_module(self):
self.assertTrue(self.find_module(util.NAME))
def test_package(self):
- # Extension modules cannot be an __init__ for a package.
+ # No extension module as an __init__ available for testing.
pass
def test_module_in_package(self):
@@ -25,7 +26,7 @@ class FinderTests(abc.FinderTests):
pass
def test_package_in_package(self):
- # Extension modules cannot be an __init__ for a package.
+ # No extension module as an __init__ available for testing.
pass
def test_package_over_module(self):
@@ -33,9 +34,7 @@ class FinderTests(abc.FinderTests):
pass
def test_failure(self):
- self.assertTrue(self.find_module('asdfjkl;') is None)
-
- # XXX Raise an exception if someone tries to use the 'path' argument?
+ self.assertIsNone(self.find_module('asdfjkl;'))
def test_main():
diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
new file mode 100644
index 0000000..ca5af20
--- /dev/null
+++ b/Lib/test/test_importlib/extension/test_loader.py
@@ -0,0 +1,79 @@
+from importlib import machinery
+from . import util as ext_util
+from .. import abc
+from .. import util
+
+import os.path
+import sys
+import unittest
+
+
+class LoaderTests(abc.LoaderTests):
+
+ """Test load_module() for extension modules."""
+
+ def setUp(self):
+ self.loader = machinery.ExtensionFileLoader(ext_util.NAME,
+ ext_util.FILEPATH)
+
+ def load_module(self, fullname):
+ return self.loader.load_module(fullname)
+
+ def test_load_module_API(self):
+ # Test the default argument for load_module().
+ self.loader.load_module()
+ self.loader.load_module(None)
+ with self.assertRaises(ImportError):
+ self.load_module('XXX')
+
+
+ def test_module(self):
+ with util.uncache(ext_util.NAME):
+ module = self.load_module(ext_util.NAME)
+ for attr, value in [('__name__', ext_util.NAME),
+ ('__file__', ext_util.FILEPATH),
+ ('__package__', '')]:
+ self.assertEqual(getattr(module, attr), value)
+ self.assertIn(ext_util.NAME, sys.modules)
+ self.assertIsInstance(module.__loader__,
+ machinery.ExtensionFileLoader)
+
+ def test_package(self):
+ # No extension module as __init__ available for testing.
+ pass
+
+ def test_lacking_parent(self):
+ # No extension module in a package available for testing.
+ pass
+
+ def test_module_reuse(self):
+ with util.uncache(ext_util.NAME):
+ module1 = self.load_module(ext_util.NAME)
+ module2 = self.load_module(ext_util.NAME)
+ self.assertIs(module1, module2)
+
+ def test_state_after_failure(self):
+ # No easy way to trigger a failure after a successful import.
+ pass
+
+ def test_unloadable(self):
+ name = 'asdfjkl;'
+ with self.assertRaises(ImportError) as cm:
+ self.load_module(name)
+ self.assertEqual(cm.exception.name, name)
+
+ def test_is_package(self):
+ self.assertFalse(self.loader.is_package(ext_util.NAME))
+ for suffix in machinery.EXTENSION_SUFFIXES:
+ path = os.path.join('some', 'path', 'pkg', '__init__' + suffix)
+ loader = machinery.ExtensionFileLoader('pkg', path)
+ self.assertTrue(loader.is_package('pkg'))
+
+
+def test_main():
+ from test.support import run_unittest
+ run_unittest(LoaderTests)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/importlib/test/extension/test_path_hook.py b/Lib/test/test_importlib/extension/test_path_hook.py
index 4610420..1d969a1 100644
--- a/Lib/importlib/test/extension/test_path_hook.py
+++ b/Lib/test/test_importlib/extension/test_path_hook.py
@@ -1,4 +1,4 @@
-from importlib import _bootstrap
+from importlib import machinery
from . import util
import collections
@@ -14,7 +14,8 @@ class PathHookTests(unittest.TestCase):
# XXX Should it only work for directories containing an extension module?
def hook(self, entry):
- return _bootstrap._file_path_hook(entry)
+ return machinery.FileFinder.path_hook((machinery.ExtensionFileLoader,
+ machinery.EXTENSION_SUFFIXES))(entry)
def test_success(self):
# Path hook should handle a directory where a known extension module
diff --git a/Lib/importlib/test/extension/util.py b/Lib/test/test_importlib/extension/util.py
index d149169..a266dd9 100644
--- a/Lib/importlib/test/extension/util.py
+++ b/Lib/test/test_importlib/extension/util.py
@@ -1,4 +1,5 @@
import imp
+from importlib import machinery
import os
import sys
@@ -6,10 +7,9 @@ PATH = None
EXT = None
FILENAME = None
NAME = '_testcapi'
-_file_exts = [x[0] for x in imp.get_suffixes() if x[2] == imp.C_EXTENSION]
try:
for PATH in sys.path:
- for EXT in _file_exts:
+ for EXT in machinery.EXTENSION_SUFFIXES:
FILENAME = NAME + EXT
FILEPATH = os.path.join(PATH, FILENAME)
if os.path.exists(os.path.join(PATH, FILENAME)):
@@ -18,4 +18,3 @@ try:
PATH = EXT = FILENAME = FILEPATH = None
except StopIteration:
pass
-del _file_exts
diff --git a/Lib/importlib/test/source/__init__.py b/Lib/test/test_importlib/frozen/__init__.py
index 8d7c49d..9ef103b 100644
--- a/Lib/importlib/test/source/__init__.py
+++ b/Lib/test/test_importlib/frozen/__init__.py
@@ -1,11 +1,11 @@
-import importlib.test
+from .. import test_suite
import os.path
import unittest
def test_suite():
directory = os.path.dirname(__file__)
- return importlib.test.test_suite('importlib.test.source', directory)
+ return test_suite('importlib.test.frozen', directory)
if __name__ == '__main__':
diff --git a/Lib/importlib/test/frozen/test_finder.py b/Lib/test/test_importlib/frozen/test_finder.py
index db88379..fa0c2a0 100644
--- a/Lib/importlib/test/frozen/test_finder.py
+++ b/Lib/test/test_importlib/frozen/test_finder.py
@@ -1,4 +1,4 @@
-from ... import machinery
+from importlib import machinery
from .. import abc
import unittest
@@ -35,7 +35,7 @@ class FinderTests(abc.FinderTests):
def test_failure(self):
loader = self.find('<not real>')
- self.assertTrue(loader is None)
+ self.assertIsNone(loader)
def test_main():
diff --git a/Lib/importlib/test/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py
index b685ef5..4b8ec15 100644
--- a/Lib/importlib/test/frozen/test_loader.py
+++ b/Lib/test/test_importlib/frozen/test_loader.py
@@ -10,55 +10,70 @@ class LoaderTests(abc.LoaderTests):
def test_module(self):
with util.uncache('__hello__'), captured_stdout() as stdout:
module = machinery.FrozenImporter.load_module('__hello__')
- check = {'__name__': '__hello__', '__file__': '<frozen>',
- '__package__': '', '__loader__': machinery.FrozenImporter}
+ check = {'__name__': '__hello__',
+ '__package__': '',
+ '__loader__': machinery.FrozenImporter,
+ }
for attr, value in check.items():
self.assertEqual(getattr(module, attr), value)
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
+ self.assertFalse(hasattr(module, '__file__'))
def test_package(self):
with util.uncache('__phello__'), captured_stdout() as stdout:
module = machinery.FrozenImporter.load_module('__phello__')
- check = {'__name__': '__phello__', '__file__': '<frozen>',
- '__package__': '__phello__', '__path__': ['__phello__'],
- '__loader__': machinery.FrozenImporter}
+ check = {'__name__': '__phello__',
+ '__package__': '__phello__',
+ '__path__': ['__phello__'],
+ '__loader__': machinery.FrozenImporter,
+ }
for attr, value in check.items():
attr_value = getattr(module, attr)
self.assertEqual(attr_value, value,
"for __phello__.%s, %r != %r" %
(attr, attr_value, value))
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
+ self.assertFalse(hasattr(module, '__file__'))
def test_lacking_parent(self):
with util.uncache('__phello__', '__phello__.spam'), \
captured_stdout() as stdout:
module = machinery.FrozenImporter.load_module('__phello__.spam')
- check = {'__name__': '__phello__.spam', '__file__': '<frozen>',
+ check = {'__name__': '__phello__.spam',
'__package__': '__phello__',
- '__loader__': machinery.FrozenImporter}
+ '__loader__': machinery.FrozenImporter,
+ }
for attr, value in check.items():
attr_value = getattr(module, attr)
self.assertEqual(attr_value, value,
"for __phello__.spam.%s, %r != %r" %
(attr, attr_value, value))
self.assertEqual(stdout.getvalue(), 'Hello world!\n')
+ self.assertFalse(hasattr(module, '__file__'))
def test_module_reuse(self):
with util.uncache('__hello__'), captured_stdout() as stdout:
module1 = machinery.FrozenImporter.load_module('__hello__')
module2 = machinery.FrozenImporter.load_module('__hello__')
- self.assertTrue(module1 is module2)
+ self.assertIs(module1, module2)
self.assertEqual(stdout.getvalue(),
'Hello world!\nHello world!\n')
+ def test_module_repr(self):
+ with util.uncache('__hello__'), captured_stdout():
+ module = machinery.FrozenImporter.load_module('__hello__')
+ self.assertEqual(repr(module),
+ "<module '__hello__' (frozen)>")
+
def test_state_after_failure(self):
# No way to trigger an error in a frozen module.
pass
def test_unloadable(self):
assert machinery.FrozenImporter.find_module('_not_real') is None
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
machinery.FrozenImporter.load_module('_not_real')
+ self.assertEqual(cm.exception.name, '_not_real')
class InspectLoaderTests(unittest.TestCase):
@@ -78,7 +93,7 @@ class InspectLoaderTests(unittest.TestCase):
def test_get_source(self):
# Should always return None.
result = machinery.FrozenImporter.get_source('__hello__')
- self.assertTrue(result is None)
+ self.assertIsNone(result)
def test_is_package(self):
# Should be able to tell what is a package.
@@ -86,14 +101,15 @@ class InspectLoaderTests(unittest.TestCase):
('__phello__.spam', False))
for name, is_package in test_for:
result = machinery.FrozenImporter.is_package(name)
- self.assertTrue(bool(result) == is_package)
+ self.assertEqual(bool(result), is_package)
def test_failure(self):
# Raise ImportError for modules that are not frozen.
for meth_name in ('get_code', 'get_source', 'is_package'):
method = getattr(machinery.FrozenImporter, meth_name)
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
method('importlib')
+ self.assertEqual(cm.exception.name, 'importlib')
def test_main():
diff --git a/Lib/importlib/test/import_/__init__.py b/Lib/test/test_importlib/import_/__init__.py
index fdf7661..366e531 100644
--- a/Lib/importlib/test/import_/__init__.py
+++ b/Lib/test/test_importlib/import_/__init__.py
@@ -1,11 +1,11 @@
-import importlib.test
+from .. import test_suite
import os.path
import unittest
def test_suite():
directory = os.path.dirname(__file__)
- return importlib.test.test_suite('importlib.test.import_', directory)
+ return test_suite('importlib.test.import_', directory)
if __name__ == '__main__':
diff --git a/Lib/importlib/test/import_/test___package__.py b/Lib/test/test_importlib/import_/test___package__.py
index 5056ae5..783cde1 100644
--- a/Lib/importlib/test/import_/test___package__.py
+++ b/Lib/test/test_importlib/import_/test___package__.py
@@ -67,7 +67,7 @@ class Using__package__(unittest.TestCase):
def test_bunk__package__(self):
globals = {'__package__': 42}
- with self.assertRaises(ValueError):
+ with self.assertRaises(TypeError):
import_util.import_('', globals, {}, ['relimport'], 1)
diff --git a/Lib/test/test_importlib/import_/test_api.py b/Lib/test/test_importlib/import_/test_api.py
new file mode 100644
index 0000000..3d4cd94
--- /dev/null
+++ b/Lib/test/test_importlib/import_/test_api.py
@@ -0,0 +1,67 @@
+from .. import util as importlib_test_util
+from . import util
+import imp
+import sys
+import unittest
+
+
+class BadLoaderFinder:
+ bad = 'fine.bogus'
+ @classmethod
+ def find_module(cls, fullname, path):
+ if fullname == cls.bad:
+ return cls
+ @classmethod
+ def load_module(cls, fullname):
+ if fullname == cls.bad:
+ raise ImportError('I cannot be loaded!')
+
+
+class APITest(unittest.TestCase):
+
+ """Test API-specific details for __import__ (e.g. raising the right
+ exception when passing in an int for the module name)."""
+
+ def test_name_requires_rparition(self):
+ # Raise TypeError if a non-string is passed in for the module name.
+ with self.assertRaises(TypeError):
+ util.import_(42)
+
+ def test_negative_level(self):
+ # Raise ValueError when a negative level is specified.
+ # PEP 328 did away with sys.module None entries and the ambiguity of
+ # absolute/relative imports.
+ with self.assertRaises(ValueError):
+ util.import_('os', globals(), level=-1)
+
+ def test_nonexistent_fromlist_entry(self):
+ # If something in fromlist doesn't exist, that's okay.
+ # issue15715
+ mod = imp.new_module('fine')
+ mod.__path__ = ['XXX']
+ with importlib_test_util.import_state(meta_path=[BadLoaderFinder]):
+ with importlib_test_util.uncache('fine'):
+ sys.modules['fine'] = mod
+ util.import_('fine', fromlist=['not here'])
+
+ def test_fromlist_load_error_propagates(self):
+ # If something in fromlist triggers an exception not related to not
+ # existing, let that exception propagate.
+ # issue15316
+ mod = imp.new_module('fine')
+ mod.__path__ = ['XXX']
+ with importlib_test_util.import_state(meta_path=[BadLoaderFinder]):
+ with importlib_test_util.uncache('fine'):
+ sys.modules['fine'] = mod
+ with self.assertRaises(ImportError):
+ util.import_('fine', fromlist=['bogus'])
+
+
+
+def test_main():
+ from test.support import run_unittest
+ run_unittest(APITest)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/importlib/test/import_/test_caching.py b/Lib/test/test_importlib/import_/test_caching.py
index 48dc643..bf68027 100644
--- a/Lib/importlib/test/import_/test_caching.py
+++ b/Lib/test/test_importlib/import_/test_caching.py
@@ -34,8 +34,9 @@ class UseCache(unittest.TestCase):
name = 'using_None'
with util.uncache(name):
sys.modules[name] = None
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
import_util.import_(name)
+ self.assertEqual(cm.exception.name, name)
def create_mock(self, *names, return_=None):
mock = util.mock_modules(*names)
@@ -64,7 +65,8 @@ class UseCache(unittest.TestCase):
with util.import_state(meta_path=[importer]):
module = import_util.import_('pkg.module')
self.assertTrue(hasattr(module, 'module'))
- self.assertTrue(id(module.module), id(sys.modules['pkg.module']))
+ self.assertEqual(id(module.module),
+ id(sys.modules['pkg.module']))
# See test_using_cache_after_loader() for reasoning.
@import_util.importlib_only
diff --git a/Lib/importlib/test/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py
index b903e8e..27b2270 100644
--- a/Lib/importlib/test/import_/test_fromlist.py
+++ b/Lib/test/test_importlib/import_/test_fromlist.py
@@ -1,6 +1,7 @@
"""Test that the semantics relating to the 'fromlist' argument are correct."""
from .. import util
from . import util as import_util
+import imp
import unittest
class ReturnValue(unittest.TestCase):
@@ -38,11 +39,9 @@ class HandlingFromlist(unittest.TestCase):
[object case]. This is even true if the object does not exist [bad object].
If a package is being imported, then what is listed in fromlist may be
- treated as a module to be imported [module]. But once again, even if
- something in fromlist does not exist as a module, no error is thrown
- [no module]. And this extends to what is contained in __all__ when '*' is
- imported [using *]. And '*' does not need to be the only name in the
- fromlist [using * with others].
+ treated as a module to be imported [module]. And this extends to what is
+ contained in __all__ when '*' is imported [using *]. And '*' does not need
+ to be the only name in the fromlist [using * with others].
"""
@@ -53,7 +52,7 @@ class HandlingFromlist(unittest.TestCase):
module = import_util.import_('module', fromlist=['attr'])
self.assertEqual(module.__name__, 'module')
- def test_unexistent_object(self):
+ def test_nonexistent_object(self):
# [bad object]
with util.mock_modules('module') as importer:
with util.import_state(meta_path=[importer]):
@@ -70,13 +69,18 @@ class HandlingFromlist(unittest.TestCase):
self.assertTrue(hasattr(module, 'module'))
self.assertEqual(module.module.__name__, 'pkg.module')
- def test_no_module_from_package(self):
- # [no module]
- with util.mock_modules('pkg.__init__') as importer:
+ def test_module_from_package_triggers_ImportError(self):
+ # If a submodule causes an ImportError because it tries to import
+ # a module which doesn't exist, that should let the ImportError
+ # propagate.
+ def module_code():
+ import i_do_not_exist
+ with util.mock_modules('pkg.__init__', 'pkg.mod',
+ module_code={'pkg.mod': module_code}) as importer:
with util.import_state(meta_path=[importer]):
- module = import_util.import_('pkg', fromlist='non_existent')
- self.assertEqual(module.__name__, 'pkg')
- self.assertTrue(not hasattr(module, 'non_existent'))
+ with self.assertRaises(ImportError) as exc:
+ import_util.import_('pkg', fromlist=['mod'])
+ self.assertEquals('i_do_not_exist', exc.exception.name)
def test_empty_string(self):
with util.mock_modules('pkg.__init__', 'pkg.mod') as importer:
diff --git a/Lib/importlib/test/import_/test_meta_path.py b/Lib/test/test_importlib/import_/test_meta_path.py
index 3b130c9..4d85f80 100644
--- a/Lib/importlib/test/import_/test_meta_path.py
+++ b/Lib/test/test_importlib/import_/test_meta_path.py
@@ -1,7 +1,10 @@
from .. import util
from . import util as import_util
+import importlib._bootstrap
+import sys
from types import MethodType
import unittest
+import warnings
class CallingOrder(unittest.TestCase):
@@ -33,6 +36,21 @@ class CallingOrder(unittest.TestCase):
with util.import_state(meta_path=[first, second]):
self.assertEqual(import_util.import_(mod_name), 42)
+ def test_empty(self):
+ # Raise an ImportWarning if sys.meta_path is empty.
+ module_name = 'nothing'
+ try:
+ del sys.modules[module_name]
+ except KeyError:
+ pass
+ with util.import_state(meta_path=[]):
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter('always')
+ self.assertIsNone(importlib._bootstrap._find_module('nothing',
+ None))
+ self.assertEqual(len(w), 1)
+ self.assertTrue(issubclass(w[-1].category, ImportWarning))
+
class CallSignature(unittest.TestCase):
@@ -64,7 +82,7 @@ class CallSignature(unittest.TestCase):
self.assertEqual(len(args), 2)
self.assertEqual(len(kwargs), 0)
self.assertEqual(args[0], mod_name)
- self.assertTrue(args[1] is None)
+ self.assertIsNone(args[1])
def test_with_path(self):
# [path set]
@@ -84,7 +102,7 @@ class CallSignature(unittest.TestCase):
# Assuming all arguments are positional.
self.assertTrue(not kwargs)
self.assertEqual(args[0], mod_name)
- self.assertTrue(args[1] is path)
+ self.assertIs(args[1], path)
diff --git a/Lib/test/test_importlib/import_/test_packages.py b/Lib/test/test_importlib/import_/test_packages.py
new file mode 100644
index 0000000..bfa18dc
--- /dev/null
+++ b/Lib/test/test_importlib/import_/test_packages.py
@@ -0,0 +1,112 @@
+from .. import util
+from . import util as import_util
+import sys
+import unittest
+import importlib
+from test import support
+
+
+class ParentModuleTests(unittest.TestCase):
+
+ """Importing a submodule should import the parent modules."""
+
+ def test_import_parent(self):
+ with util.mock_modules('pkg.__init__', 'pkg.module') as mock:
+ with util.import_state(meta_path=[mock]):
+ module = import_util.import_('pkg.module')
+ self.assertIn('pkg', sys.modules)
+
+ def test_bad_parent(self):
+ with util.mock_modules('pkg.module') as mock:
+ with util.import_state(meta_path=[mock]):
+ with self.assertRaises(ImportError) as cm:
+ import_util.import_('pkg.module')
+ self.assertEqual(cm.exception.name, 'pkg')
+
+ def test_raising_parent_after_importing_child(self):
+ def __init__():
+ import pkg.module
+ 1/0
+ mock = util.mock_modules('pkg.__init__', 'pkg.module',
+ module_code={'pkg': __init__})
+ with mock:
+ with util.import_state(meta_path=[mock]):
+ with self.assertRaises(ZeroDivisionError):
+ import_util.import_('pkg')
+ self.assertNotIn('pkg', sys.modules)
+ self.assertIn('pkg.module', sys.modules)
+ with self.assertRaises(ZeroDivisionError):
+ import_util.import_('pkg.module')
+ self.assertNotIn('pkg', sys.modules)
+ self.assertIn('pkg.module', sys.modules)
+
+ def test_raising_parent_after_relative_importing_child(self):
+ def __init__():
+ from . import module
+ 1/0
+ mock = util.mock_modules('pkg.__init__', 'pkg.module',
+ module_code={'pkg': __init__})
+ with mock:
+ with util.import_state(meta_path=[mock]):
+ with self.assertRaises((ZeroDivisionError, ImportError)):
+ # This raises ImportError on the "from . import module"
+ # line, not sure why.
+ import_util.import_('pkg')
+ self.assertNotIn('pkg', sys.modules)
+ with self.assertRaises((ZeroDivisionError, ImportError)):
+ import_util.import_('pkg.module')
+ self.assertNotIn('pkg', sys.modules)
+ # XXX False
+ #self.assertIn('pkg.module', sys.modules)
+
+ def test_raising_parent_after_double_relative_importing_child(self):
+ def __init__():
+ from ..subpkg import module
+ 1/0
+ mock = util.mock_modules('pkg.__init__', 'pkg.subpkg.__init__',
+ 'pkg.subpkg.module',
+ module_code={'pkg.subpkg': __init__})
+ with mock:
+ with util.import_state(meta_path=[mock]):
+ with self.assertRaises((ZeroDivisionError, ImportError)):
+ # This raises ImportError on the "from ..subpkg import module"
+ # line, not sure why.
+ import_util.import_('pkg.subpkg')
+ self.assertNotIn('pkg.subpkg', sys.modules)
+ with self.assertRaises((ZeroDivisionError, ImportError)):
+ import_util.import_('pkg.subpkg.module')
+ self.assertNotIn('pkg.subpkg', sys.modules)
+ # XXX False
+ #self.assertIn('pkg.subpkg.module', sys.modules)
+
+ def test_module_not_package(self):
+ # Try to import a submodule from a non-package should raise ImportError.
+ assert not hasattr(sys, '__path__')
+ with self.assertRaises(ImportError) as cm:
+ import_util.import_('sys.no_submodules_here')
+ self.assertEqual(cm.exception.name, 'sys.no_submodules_here')
+
+ def test_module_not_package_but_side_effects(self):
+ # If a module injects something into sys.modules as a side-effect, then
+ # pick up on that fact.
+ name = 'mod'
+ subname = name + '.b'
+ def module_injection():
+ sys.modules[subname] = 'total bunk'
+ mock_modules = util.mock_modules('mod',
+ module_code={'mod': module_injection})
+ with mock_modules as mock:
+ with util.import_state(meta_path=[mock]):
+ try:
+ submodule = import_util.import_(subname)
+ finally:
+ support.unload(subname)
+
+
+def test_main():
+ from test.support import run_unittest
+ run_unittest(ParentModuleTests)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_importlib/import_/test_path.py b/Lib/test/test_importlib/import_/test_path.py
new file mode 100644
index 0000000..0c086ce
--- /dev/null
+++ b/Lib/test/test_importlib/import_/test_path.py
@@ -0,0 +1,98 @@
+from importlib import _bootstrap
+from importlib import machinery
+from .. import util
+from . import util as import_util
+import imp
+import os
+import sys
+import tempfile
+from test import support
+from types import MethodType
+import unittest
+import warnings
+
+
+class FinderTests(unittest.TestCase):
+
+ """Tests for PathFinder."""
+
+ def test_failure(self):
+ # Test None returned upon not finding a suitable finder.
+ module = '<test module>'
+ with util.import_state():
+ self.assertIsNone(machinery.PathFinder.find_module(module))
+
+ def test_sys_path(self):
+ # Test that sys.path is used when 'path' is None.
+ # Implicitly tests that sys.path_importer_cache is used.
+ module = '<test module>'
+ path = '<test path>'
+ importer = util.mock_modules(module)
+ with util.import_state(path_importer_cache={path: importer},
+ path=[path]):
+ loader = machinery.PathFinder.find_module(module)
+ self.assertIs(loader, importer)
+
+ def test_path(self):
+ # Test that 'path' is used when set.
+ # Implicitly tests that sys.path_importer_cache is used.
+ module = '<test module>'
+ path = '<test path>'
+ importer = util.mock_modules(module)
+ with util.import_state(path_importer_cache={path: importer}):
+ loader = machinery.PathFinder.find_module(module, [path])
+ self.assertIs(loader, importer)
+
+ def test_empty_list(self):
+ # An empty list should not count as asking for sys.path.
+ module = 'module'
+ path = '<test path>'
+ importer = util.mock_modules(module)
+ with util.import_state(path_importer_cache={path: importer},
+ path=[path]):
+ self.assertIsNone(machinery.PathFinder.find_module('module', []))
+
+ def test_path_hooks(self):
+ # Test that sys.path_hooks is used.
+ # Test that sys.path_importer_cache is set.
+ module = '<test module>'
+ path = '<test path>'
+ importer = util.mock_modules(module)
+ hook = import_util.mock_path_hook(path, importer=importer)
+ with util.import_state(path_hooks=[hook]):
+ loader = machinery.PathFinder.find_module(module, [path])
+ self.assertIs(loader, importer)
+ self.assertIn(path, sys.path_importer_cache)
+ self.assertIs(sys.path_importer_cache[path], importer)
+
+ def test_empty_path_hooks(self):
+ # Test that if sys.path_hooks is empty a warning is raised,
+ # sys.path_importer_cache gets None set, and PathFinder returns None.
+ path_entry = 'bogus_path'
+ with util.import_state(path_importer_cache={}, path_hooks=[],
+ path=[path_entry]):
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter('always')
+ self.assertIsNone(machinery.PathFinder.find_module('os'))
+ self.assertIsNone(sys.path_importer_cache[path_entry])
+ self.assertEqual(len(w), 1)
+ self.assertTrue(issubclass(w[-1].category, ImportWarning))
+
+ def test_path_importer_cache_empty_string(self):
+ # The empty string should create a finder using the cwd.
+ path = ''
+ module = '<test module>'
+ importer = util.mock_modules(module)
+ hook = import_util.mock_path_hook(os.curdir, importer=importer)
+ with util.import_state(path=[path], path_hooks=[hook]):
+ loader = machinery.PathFinder.find_module(module)
+ self.assertIs(loader, importer)
+ self.assertIn(os.curdir, sys.path_importer_cache)
+
+
+def test_main():
+ from test.support import run_unittest
+ run_unittest(FinderTests)
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/importlib/test/import_/test_relative_imports.py b/Lib/test/test_importlib/import_/test_relative_imports.py
index a0f6b2d..4569c26 100644
--- a/Lib/importlib/test/import_/test_relative_imports.py
+++ b/Lib/test/test_importlib/import_/test_relative_imports.py
@@ -193,6 +193,20 @@ class RelativeImports(unittest.TestCase):
self.assertEqual(module.__name__, '__runpy_pkg__.uncle.cousin')
self.relative_import_test(create, globals_, callback)
+ def test_import_relative_import_no_fromlist(self):
+ # Import a relative module w/ no fromlist.
+ create = ['crash.__init__', 'crash.mod']
+ globals_ = [{'__package__': 'crash', '__name__': 'crash'}]
+ def callback(global_):
+ import_util.import_('crash')
+ mod = import_util.import_('mod', global_, {}, [], 1)
+ self.assertEqual(mod.__name__, 'crash.mod')
+ self.relative_import_test(create, globals_, callback)
+
+ def test_relative_import_no_globals(self):
+ # No globals for a relative import is an error.
+ with self.assertRaises(KeyError):
+ import_util.import_('sys', level=1)
def test_main():
diff --git a/Lib/importlib/test/import_/util.py b/Lib/test/test_importlib/import_/util.py
index 649c5ed..86ac065 100644
--- a/Lib/importlib/test/import_/util.py
+++ b/Lib/test/test_importlib/import_/util.py
@@ -1,6 +1,5 @@
import functools
import importlib
-import importlib._bootstrap
import unittest
diff --git a/Lib/test/test_importlib/regrtest.py b/Lib/test/test_importlib/regrtest.py
new file mode 100644
index 0000000..a5be11f
--- /dev/null
+++ b/Lib/test/test_importlib/regrtest.py
@@ -0,0 +1,17 @@
+"""Run Python's standard test suite using importlib.__import__.
+
+Tests known to fail because of assumptions that importlib (properly)
+invalidates are automatically skipped if the entire test suite is run.
+Otherwise all command-line options valid for test.regrtest are also valid for
+this script.
+
+"""
+import importlib
+import sys
+from test import regrtest
+
+if __name__ == '__main__':
+ __builtins__.__import__ = importlib.__import__
+ sys.path_importer_cache.clear()
+
+ regrtest.main(quiet=True, verbose2=True)
diff --git a/Lib/importlib/test/extension/__init__.py b/Lib/test/test_importlib/source/__init__.py
index 2ec5840..3ef97f3 100644
--- a/Lib/importlib/test/extension/__init__.py
+++ b/Lib/test/test_importlib/source/__init__.py
@@ -1,11 +1,11 @@
-import importlib.test
+from .. import test_suite
import os.path
import unittest
def test_suite():
directory = os.path.dirname(__file__)
- return importlib.test.test_suite('importlib.test.extension', directory)
+ return test.test_suite('importlib.test.source', directory)
if __name__ == '__main__':
diff --git a/Lib/importlib/test/source/test_abc_loader.py b/Lib/test/test_importlib/source/test_abc_loader.py
index 3245907..0d912b6 100644
--- a/Lib/importlib/test/source/test_abc_loader.py
+++ b/Lib/test/test_importlib/source/test_abc_loader.py
@@ -32,6 +32,9 @@ class SourceOnlyLoaderMock(abc.SourceLoader):
def get_filename(self, fullname):
return self.path
+ def module_repr(self, module):
+ return '<module>'
+
class SourceLoaderMock(SourceOnlyLoaderMock):
@@ -40,8 +43,10 @@ class SourceLoaderMock(SourceOnlyLoaderMock):
def __init__(self, path, magic=imp.get_magic()):
super().__init__(path)
self.bytecode_path = imp.cache_from_source(self.path)
+ self.source_size = len(self.source)
data = bytearray(magic)
- data.extend(marshal._w_long(self.source_mtime))
+ data.extend(importlib._w_long(self.source_mtime))
+ data.extend(importlib._w_long(self.source_size))
code_object = compile(self.source, self.path, 'exec',
dont_inherit=True)
data.extend(marshal.dumps(code_object))
@@ -56,9 +61,9 @@ class SourceLoaderMock(SourceOnlyLoaderMock):
else:
raise IOError
- def path_mtime(self, path):
+ def path_stats(self, path):
assert path == self.path
- return self.source_mtime
+ return {'mtime': self.source_mtime, 'size': self.source_size}
def set_data(self, path, data):
self.written[path] = bytes(data)
@@ -102,9 +107,12 @@ class PyLoaderMock(abc.PyLoader):
warnings.simplefilter("always")
path = super().get_filename(name)
assert len(w) == 1
- assert issubclass(w[0].category, PendingDeprecationWarning)
+ assert issubclass(w[0].category, DeprecationWarning)
return path
+ def module_repr(self):
+ return '<module>'
+
class PyLoaderCompatMock(PyLoaderMock):
@@ -146,11 +154,12 @@ class PyPycLoaderMock(abc.PyPycLoader, PyLoaderMock):
self.bytecode_to_path[name] = data['path']
magic = data.get('magic', imp.get_magic())
mtime = importlib._w_long(data.get('mtime', self.default_mtime))
+ source_size = importlib._w_long(len(self.source) & 0xFFFFFFFF)
if 'bc' in data:
bc = data['bc']
else:
bc = self.compile_bc(name)
- self.module_bytecode[name] = magic + mtime + bc
+ self.module_bytecode[name] = magic + mtime + source_size + bc
def compile_bc(self, name):
source_path = self.module_paths.get(name, '<test>') or '<test>'
@@ -198,7 +207,7 @@ class PyPycLoaderMock(abc.PyPycLoader, PyLoaderMock):
warnings.simplefilter("always")
code_object = super().get_code(name)
assert len(w) == 1
- assert issubclass(w[0].category, PendingDeprecationWarning)
+ assert issubclass(w[0].category, DeprecationWarning)
return code_object
class PyLoaderTests(testing_abc.LoaderTests):
@@ -219,7 +228,7 @@ class PyLoaderTests(testing_abc.LoaderTests):
mock = self.mocker({name: path})
with util.uncache(name):
module = mock.load_module(name)
- self.assertTrue(name in sys.modules)
+ self.assertIn(name, sys.modules)
self.eq_attrs(module, __name__=name, __file__=path, __package__='',
__loader__=mock)
self.assertTrue(not hasattr(module, '__path__'))
@@ -231,7 +240,7 @@ class PyLoaderTests(testing_abc.LoaderTests):
mock = self.mocker({name: path})
with util.uncache(name):
module = mock.load_module(name)
- self.assertTrue(name in sys.modules)
+ self.assertIn(name, sys.modules)
self.eq_attrs(module, __name__=name, __file__=path,
__path__=[os.path.dirname(path)], __package__=name,
__loader__=mock)
@@ -257,8 +266,8 @@ class PyLoaderTests(testing_abc.LoaderTests):
with util.uncache(name):
sys.modules[name] = module
loaded_module = mock.load_module(name)
- self.assertTrue(loaded_module is module)
- self.assertTrue(sys.modules[name] is module)
+ self.assertIs(loaded_module, module)
+ self.assertIs(sys.modules[name], module)
return mock, name
def test_state_after_failure(self):
@@ -271,7 +280,7 @@ class PyLoaderTests(testing_abc.LoaderTests):
sys.modules[name] = module
with self.assertRaises(ZeroDivisionError):
mock.load_module(name)
- self.assertTrue(sys.modules[name] is module)
+ self.assertIs(sys.modules[name], module)
self.assertTrue(hasattr(module, 'blah'))
return mock
@@ -282,7 +291,7 @@ class PyLoaderTests(testing_abc.LoaderTests):
with util.uncache(name):
with self.assertRaises(ZeroDivisionError):
mock.load_module(name)
- self.assertTrue(name not in sys.modules)
+ self.assertNotIn(name, sys.modules)
return mock
@@ -342,7 +351,10 @@ class PyPycLoaderTests(PyLoaderTests):
self.assertEqual(magic, imp.get_magic())
mtime = importlib._r_long(mock.module_bytecode[name][4:8])
self.assertEqual(mtime, 1)
- bc = mock.module_bytecode[name][8:]
+ source_size = mock.module_bytecode[name][8:12]
+ self.assertEqual(len(mock.source) & 0xFFFFFFFF,
+ importlib._r_long(source_size))
+ bc = mock.module_bytecode[name][12:]
self.assertEqual(bc, mock.compile_bc(name))
def test_module(self):
@@ -412,8 +424,7 @@ class SkipWritingBytecodeTests(unittest.TestCase):
sys.dont_write_bytecode = dont_write_bytecode
with util.uncache(name):
mock.load_module(name)
- self.assertTrue((name in mock.module_bytecode) is not
- dont_write_bytecode)
+ self.assertIsNot(name in mock.module_bytecode, dont_write_bytecode)
def test_no_bytecode_written(self):
self.run_test(True)
@@ -438,7 +449,7 @@ class RegeneratedBytecodeTests(unittest.TestCase):
'magic': bad_magic}})
with util.uncache(name):
mock.load_module(name)
- self.assertTrue(name in mock.module_bytecode)
+ self.assertIn(name, mock.module_bytecode)
magic = mock.module_bytecode[name][:4]
self.assertEqual(magic, imp.get_magic())
@@ -451,7 +462,7 @@ class RegeneratedBytecodeTests(unittest.TestCase):
{name: {'path': 'path/to/mod.bytecode', 'mtime': old_mtime}})
with util.uncache(name):
mock.load_module(name)
- self.assertTrue(name in mock.module_bytecode)
+ self.assertIn(name, mock.module_bytecode)
mtime = importlib._r_long(mock.module_bytecode[name][4:8])
self.assertEqual(mtime, PyPycLoaderMock.default_mtime)
@@ -469,8 +480,9 @@ class BadBytecodeFailureTests(unittest.TestCase):
{'path': os.path.join('path', 'to', 'mod'),
'magic': bad_magic}}
mock = PyPycLoaderMock({name: None}, bc)
- with util.uncache(name), self.assertRaises(ImportError):
+ with util.uncache(name), self.assertRaises(ImportError) as cm:
mock.load_module(name)
+ self.assertEqual(cm.exception.name, name)
def test_no_bytecode(self):
# Missing code object bytecode should lead to an EOFError.
@@ -514,8 +526,9 @@ class MissingPathsTests(unittest.TestCase):
# If all *_path methods return None, raise ImportError.
name = 'mod'
mock = PyPycLoaderMock({name: None})
- with util.uncache(name), self.assertRaises(ImportError):
+ with util.uncache(name), self.assertRaises(ImportError) as cm:
mock.load_module(name)
+ self.assertEqual(cm.exception.name, name)
def test_source_path_ImportError(self):
# An ImportError from source_path should trigger an ImportError.
@@ -531,7 +544,7 @@ class MissingPathsTests(unittest.TestCase):
mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')})
bad_meth = types.MethodType(raise_ImportError, mock)
mock.bytecode_path = bad_meth
- with util.uncache(name), self.assertRaises(ImportError):
+ with util.uncache(name), self.assertRaises(ImportError) as cm:
mock.load_module(name)
@@ -592,15 +605,17 @@ class SourceOnlyLoaderTests(SourceLoaderTestHarness):
def raise_IOError(path):
raise IOError
self.loader.get_data = raise_IOError
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.loader.get_source(self.name)
+ self.assertEqual(cm.exception.name, self.name)
def test_is_package(self):
# Properly detect when loading a package.
- self.setUp(is_package=True)
- self.assertTrue(self.loader.is_package(self.name))
self.setUp(is_package=False)
self.assertFalse(self.loader.is_package(self.name))
+ self.setUp(is_package=True)
+ self.assertTrue(self.loader.is_package(self.name))
+ self.assertFalse(self.loader.is_package(self.name + '.__init__'))
def test_get_code(self):
# Verify the code object is created.
@@ -615,7 +630,7 @@ class SourceOnlyLoaderTests(SourceLoaderTestHarness):
module = self.loader.load_module(self.name)
self.verify_module(module)
self.assertEqual(module.__path__, [os.path.dirname(self.path)])
- self.assertTrue(self.name in sys.modules)
+ self.assertIn(self.name, sys.modules)
def test_package_settings(self):
# __package__ needs to be set, while __path__ is set on if the module
@@ -656,7 +671,8 @@ class SourceLoaderBytecodeTests(SourceLoaderTestHarness):
if bytecode_written:
self.assertIn(self.cached, self.loader.written)
data = bytearray(imp.get_magic())
- data.extend(marshal._w_long(self.loader.source_mtime))
+ data.extend(importlib._w_long(self.loader.source_mtime))
+ data.extend(importlib._w_long(self.loader.source_size))
data.extend(marshal.dumps(code_object))
self.assertEqual(self.loader.written[self.cached], bytes(data))
@@ -762,18 +778,32 @@ class SourceLoaderGetSourceTests(unittest.TestCase):
expect = io.IncrementalNewlineDecoder(None, True).decode(source)
self.assertEqual(mock.get_source(name), expect)
+
class AbstractMethodImplTests(unittest.TestCase):
"""Test the concrete abstractmethod implementations."""
- class Loader(abc.Loader):
- def load_module(self, fullname):
- super().load_module(fullname)
+ class MetaPathFinder(abc.MetaPathFinder):
+ def find_module(self, fullname, path):
+ super().find_module(fullname, path)
- class Finder(abc.Finder):
+ class PathEntryFinder(abc.PathEntryFinder):
def find_module(self, _):
super().find_module(_)
+ def find_loader(self, _):
+ super().find_loader(_)
+
+ class Finder(abc.Finder):
+ def find_module(self, fullname, path):
+ super().find_module(fullname, path)
+
+ class Loader(abc.Loader):
+ def load_module(self, fullname):
+ super().load_module(fullname)
+ def module_repr(self, module):
+ super().module_repr(module)
+
class ResourceLoader(Loader, abc.ResourceLoader):
def get_data(self, _):
super().get_data(_)
@@ -847,7 +877,7 @@ class AbstractMethodImplTests(unittest.TestCase):
# Required abstractmethods.
self.raises_NotImplementedError(ins, 'get_filename', 'get_data')
# Optional abstractmethods.
- self.raises_NotImplementedError(ins,'path_mtime', 'set_data')
+ self.raises_NotImplementedError(ins,'path_stats', 'set_data')
def test_PyLoader(self):
self.raises_NotImplementedError(self.PyLoader(), 'source_path',
diff --git a/Lib/importlib/test/source/test_case_sensitivity.py b/Lib/test/test_importlib/source/test_case_sensitivity.py
index 73777de..241173f 100644
--- a/Lib/importlib/test/source/test_case_sensitivity.py
+++ b/Lib/test/test_importlib/source/test_case_sensitivity.py
@@ -1,7 +1,9 @@
"""Test case-sensitivity (PEP 235)."""
from importlib import _bootstrap
+from importlib import machinery
from .. import util
from . import util as source_util
+import imp
import os
import sys
from test import support as test_support
@@ -19,9 +21,11 @@ class CaseSensitivityTest(unittest.TestCase):
assert name != name.lower()
def find(self, path):
- finder = _bootstrap._FileFinder(path,
- _bootstrap._SourceFinderDetails(),
- _bootstrap._SourcelessFinderDetails())
+ finder = machinery.FileFinder(path,
+ (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES),
+ (machinery.SourcelessFileLoader,
+ machinery.BYTECODE_SUFFIXES))
return finder.find_module(self.name)
def sensitivity_test(self):
@@ -37,6 +41,9 @@ class CaseSensitivityTest(unittest.TestCase):
def test_sensitive(self):
with test_support.EnvironmentVarGuard() as env:
env.unset('PYTHONCASEOK')
+ if b'PYTHONCASEOK' in _bootstrap._os.environ:
+ self.skipTest('os.environ changes not reflected in '
+ '_os.environ')
sensitive, insensitive = self.sensitivity_test()
self.assertTrue(hasattr(sensitive, 'load_module'))
self.assertIn(self.name, sensitive.get_filename(self.name))
@@ -45,6 +52,9 @@ class CaseSensitivityTest(unittest.TestCase):
def test_insensitive(self):
with test_support.EnvironmentVarGuard() as env:
env.set('PYTHONCASEOK', '1')
+ if b'PYTHONCASEOK' not in _bootstrap._os.environ:
+ self.skipTest('os.environ changes not reflected in '
+ '_os.environ')
sensitive, insensitive = self.sensitivity_test()
self.assertTrue(hasattr(sensitive, 'load_module'))
self.assertIn(self.name, sensitive.get_filename(self.name))
diff --git a/Lib/importlib/test/source/test_file_loader.py b/Lib/test/test_importlib/source/test_file_loader.py
index c7a7d8f..90f9d30 100644
--- a/Lib/importlib/test/source/test_file_loader.py
+++ b/Lib/test/test_importlib/source/test_file_loader.py
@@ -1,5 +1,6 @@
+from importlib import machinery
import importlib
-from importlib import _bootstrap
+import importlib.abc
from .. import abc
from .. import util
from . import util as source_util
@@ -24,12 +25,48 @@ class SimpleTest(unittest.TestCase):
"""
+ def test_load_module_API(self):
+ # If fullname is not specified that assume self.name is desired.
+ class TesterMixin(importlib.abc.Loader):
+ def load_module(self, fullname): return fullname
+ def module_repr(self, module): return '<module>'
+
+ class Tester(importlib.abc.FileLoader, TesterMixin):
+ def get_code(self, _): pass
+ def get_source(self, _): pass
+ def is_package(self, _): pass
+
+ name = 'mod_name'
+ loader = Tester(name, 'some_path')
+ self.assertEqual(name, loader.load_module())
+ self.assertEqual(name, loader.load_module(None))
+ self.assertEqual(name, loader.load_module(name))
+ with self.assertRaises(ImportError):
+ loader.load_module(loader.name + 'XXX')
+
+ def test_get_filename_API(self):
+ # If fullname is not set then assume self.path is desired.
+ class Tester(importlib.abc.FileLoader):
+ def get_code(self, _): pass
+ def get_source(self, _): pass
+ def is_package(self, _): pass
+ def module_repr(self, _): pass
+
+ path = 'some_path'
+ name = 'some_name'
+ loader = Tester(name, path)
+ self.assertEqual(path, loader.get_filename(name))
+ self.assertEqual(path, loader.get_filename())
+ self.assertEqual(path, loader.get_filename(None))
+ with self.assertRaises(ImportError):
+ loader.get_filename(name + 'XXX')
+
# [basic]
def test_module(self):
with source_util.create_modules('_temp') as mapping:
- loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+ loader = machinery.SourceFileLoader('_temp', mapping['_temp'])
module = loader.load_module('_temp')
- self.assertTrue('_temp' in sys.modules)
+ self.assertIn('_temp', sys.modules)
check = {'__name__': '_temp', '__file__': mapping['_temp'],
'__package__': ''}
for attr, value in check.items():
@@ -37,10 +74,10 @@ class SimpleTest(unittest.TestCase):
def test_package(self):
with source_util.create_modules('_pkg.__init__') as mapping:
- loader = _bootstrap._SourceFileLoader('_pkg',
+ loader = machinery.SourceFileLoader('_pkg',
mapping['_pkg.__init__'])
module = loader.load_module('_pkg')
- self.assertTrue('_pkg' in sys.modules)
+ self.assertIn('_pkg', sys.modules)
check = {'__name__': '_pkg', '__file__': mapping['_pkg.__init__'],
'__path__': [os.path.dirname(mapping['_pkg.__init__'])],
'__package__': '_pkg'}
@@ -50,10 +87,10 @@ class SimpleTest(unittest.TestCase):
def test_lacking_parent(self):
with source_util.create_modules('_pkg.__init__', '_pkg.mod')as mapping:
- loader = _bootstrap._SourceFileLoader('_pkg.mod',
+ loader = machinery.SourceFileLoader('_pkg.mod',
mapping['_pkg.mod'])
module = loader.load_module('_pkg.mod')
- self.assertTrue('_pkg.mod' in sys.modules)
+ self.assertIn('_pkg.mod', sys.modules)
check = {'__name__': '_pkg.mod', '__file__': mapping['_pkg.mod'],
'__package__': '_pkg'}
for attr, value in check.items():
@@ -65,19 +102,14 @@ class SimpleTest(unittest.TestCase):
def test_module_reuse(self):
with source_util.create_modules('_temp') as mapping:
- loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+ loader = machinery.SourceFileLoader('_temp', mapping['_temp'])
module = loader.load_module('_temp')
module_id = id(module)
module_dict_id = id(module.__dict__)
with open(mapping['_temp'], 'w') as file:
file.write("testing_var = 42\n")
- # For filesystems where the mtime is only to a second granularity,
- # everything that has happened above can be too fast;
- # force an mtime on the source that is guaranteed to be different
- # than the original mtime.
- loader.path_mtime = self.fake_mtime(loader.path_mtime)
module = loader.load_module('_temp')
- self.assertTrue('testing_var' in module.__dict__,
+ self.assertIn('testing_var', module.__dict__,
"'testing_var' not in "
"{0}".format(list(module.__dict__.keys())))
self.assertEqual(module, sys.modules['_temp'])
@@ -95,7 +127,7 @@ class SimpleTest(unittest.TestCase):
setattr(orig_module, attr, value)
with open(mapping[name], 'w') as file:
file.write('+++ bad syntax +++')
- loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+ loader = machinery.SourceFileLoader('_temp', mapping['_temp'])
with self.assertRaises(SyntaxError):
loader.load_module(name)
for attr in attributes:
@@ -106,10 +138,10 @@ class SimpleTest(unittest.TestCase):
with source_util.create_modules('_temp') as mapping:
with open(mapping['_temp'], 'w') as file:
file.write('=')
- loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+ loader = machinery.SourceFileLoader('_temp', mapping['_temp'])
with self.assertRaises(SyntaxError):
loader.load_module('_temp')
- self.assertTrue('_temp' not in sys.modules)
+ self.assertNotIn('_temp', sys.modules)
def test_file_from_empty_string_dir(self):
# Loading a module found from an empty string entry on sys.path should
@@ -119,7 +151,7 @@ class SimpleTest(unittest.TestCase):
file.write("# test file for importlib")
try:
with util.uncache('_temp'):
- loader = _bootstrap._SourceFileLoader('_temp', file_path)
+ loader = machinery.SourceFileLoader('_temp', file_path)
mod = loader.load_module('_temp')
self.assertEqual(file_path, mod.__file__)
self.assertEqual(imp.cache_from_source(file_path),
@@ -145,7 +177,7 @@ class SimpleTest(unittest.TestCase):
if e.errno != getattr(errno, 'EOVERFLOW', None):
raise
self.skipTest("cannot set modification time to large integer ({})".format(e))
- loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+ loader = machinery.SourceFileLoader('_temp', mapping['_temp'])
mod = loader.load_module('_temp')
# Sanity checks.
self.assertEqual(mod.__cached__, compiled)
@@ -159,7 +191,7 @@ class BadBytecodeTest(unittest.TestCase):
def import_(self, file, module_name):
loader = self.loader(module_name, file)
module = loader.load_module(module_name)
- self.assertTrue(module_name in sys.modules)
+ self.assertIn(module_name, sys.modules)
def manipulate_bytecode(self, name, mapping, manipulator, *,
del_source=False):
@@ -215,10 +247,17 @@ class BadBytecodeTest(unittest.TestCase):
del_source=del_source)
test('_temp', mapping, bc_path)
+ def _test_partial_size(self, test, *, del_source=False):
+ with source_util.create_modules('_temp') as mapping:
+ bc_path = self.manipulate_bytecode('_temp', mapping,
+ lambda bc: bc[:11],
+ del_source=del_source)
+ test('_temp', mapping, bc_path)
+
def _test_no_marshal(self, *, del_source=False):
with source_util.create_modules('_temp') as mapping:
bc_path = self.manipulate_bytecode('_temp', mapping,
- lambda bc: bc[:8],
+ lambda bc: bc[:12],
del_source=del_source)
file_path = mapping['_temp'] if not del_source else bc_path
with self.assertRaises(EOFError):
@@ -227,16 +266,18 @@ class BadBytecodeTest(unittest.TestCase):
def _test_non_code_marshal(self, *, del_source=False):
with source_util.create_modules('_temp') as mapping:
bytecode_path = self.manipulate_bytecode('_temp', mapping,
- lambda bc: bc[:8] + marshal.dumps(b'abcd'),
+ lambda bc: bc[:12] + marshal.dumps(b'abcd'),
del_source=del_source)
file_path = mapping['_temp'] if not del_source else bytecode_path
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.import_(file_path, '_temp')
+ self.assertEqual(cm.exception.name, '_temp')
+ self.assertEqual(cm.exception.path, bytecode_path)
def _test_bad_marshal(self, *, del_source=False):
with source_util.create_modules('_temp') as mapping:
bytecode_path = self.manipulate_bytecode('_temp', mapping,
- lambda bc: bc[:8] + b'<test>',
+ lambda bc: bc[:12] + b'<test>',
del_source=del_source)
file_path = mapping['_temp'] if not del_source else bytecode_path
with self.assertRaises(EOFError):
@@ -251,7 +292,7 @@ class BadBytecodeTest(unittest.TestCase):
class SourceLoaderBadBytecodeTest(BadBytecodeTest):
- loader = _bootstrap._SourceFileLoader
+ loader = machinery.SourceFileLoader
@source_util.writes_bytecode_files
def test_empty_file(self):
@@ -260,7 +301,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
def test(name, mapping, bytecode_path):
self.import_(mapping[name], name)
with open(bytecode_path, 'rb') as file:
- self.assertGreater(len(file.read()), 8)
+ self.assertGreater(len(file.read()), 12)
self._test_empty_file(test)
@@ -268,7 +309,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
def test(name, mapping, bytecode_path):
self.import_(mapping[name], name)
with open(bytecode_path, 'rb') as file:
- self.assertGreater(len(file.read()), 8)
+ self.assertGreater(len(file.read()), 12)
self._test_partial_magic(test)
@@ -279,7 +320,7 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
def test(name, mapping, bytecode_path):
self.import_(mapping[name], name)
with open(bytecode_path, 'rb') as file:
- self.assertGreater(len(file.read()), 8)
+ self.assertGreater(len(file.read()), 12)
self._test_magic_only(test)
@@ -301,11 +342,22 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
def test(name, mapping, bc_path):
self.import_(mapping[name], name)
with open(bc_path, 'rb') as file:
- self.assertGreater(len(file.read()), 8)
+ self.assertGreater(len(file.read()), 12)
self._test_partial_timestamp(test)
@source_util.writes_bytecode_files
+ def test_partial_size(self):
+ # When the size is partial, regenerate the .pyc, else
+ # raise EOFError.
+ def test(name, mapping, bc_path):
+ self.import_(mapping[name], name)
+ with open(bc_path, 'rb') as file:
+ self.assertGreater(len(file.read()), 12)
+
+ self._test_partial_size(test)
+
+ @source_util.writes_bytecode_files
def test_no_marshal(self):
# When there is only the magic number and timestamp, raise EOFError.
self._test_no_marshal()
@@ -364,19 +416,23 @@ class SourceLoaderBadBytecodeTest(BadBytecodeTest):
class SourcelessLoaderBadBytecodeTest(BadBytecodeTest):
- loader = _bootstrap._SourcelessFileLoader
+ loader = machinery.SourcelessFileLoader
def test_empty_file(self):
def test(name, mapping, bytecode_path):
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.import_(bytecode_path, name)
+ self.assertEqual(cm.exception.name, name)
+ self.assertEqual(cm.exception.path, bytecode_path)
self._test_empty_file(test, del_source=True)
def test_partial_magic(self):
def test(name, mapping, bytecode_path):
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.import_(bytecode_path, name)
+ self.assertEqual(cm.exception.name, name)
+ self.assertEqual(cm.exception.path, bytecode_path)
self._test_partial_magic(test, del_source=True)
def test_magic_only(self):
@@ -388,8 +444,10 @@ class SourcelessLoaderBadBytecodeTest(BadBytecodeTest):
def test_bad_magic(self):
def test(name, mapping, bytecode_path):
- with self.assertRaises(ImportError):
+ with self.assertRaises(ImportError) as cm:
self.import_(bytecode_path, name)
+ self.assertEqual(cm.exception.name, name)
+ self.assertEqual(cm.exception.path, bytecode_path)
self._test_bad_magic(test, del_source=True)
@@ -400,6 +458,13 @@ class SourcelessLoaderBadBytecodeTest(BadBytecodeTest):
self._test_partial_timestamp(test, del_source=True)
+ def test_partial_size(self):
+ def test(name, mapping, bytecode_path):
+ with self.assertRaises(EOFError):
+ self.import_(bytecode_path, name)
+
+ self._test_partial_size(test, del_source=True)
+
def test_no_marshal(self):
self._test_no_marshal(del_source=True)
diff --git a/Lib/importlib/test/source/test_finder.py b/Lib/test/test_importlib/source/test_finder.py
index 7b9088d..8bc16a5 100644
--- a/Lib/importlib/test/source/test_finder.py
+++ b/Lib/test/test_importlib/source/test_finder.py
@@ -1,10 +1,12 @@
-from importlib import _bootstrap
from .. import abc
from . import util as source_util
-from test.support import make_legacy_pyc
-import os
+
+from importlib import machinery
import errno
+import imp
+import os
import py_compile
+from test.support import make_legacy_pyc
import unittest
import warnings
@@ -33,11 +35,15 @@ class FinderTests(abc.FinderTests):
"""
+ def get_finder(self, root):
+ loader_details = [(machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES),
+ (machinery.SourcelessFileLoader,
+ machinery.BYTECODE_SUFFIXES)]
+ return machinery.FileFinder(root, *loader_details)
+
def import_(self, root, module):
- finder = _bootstrap._FileFinder(root,
- _bootstrap._SourceFinderDetails(),
- _bootstrap._SourcelessFinderDetails())
- return finder.find_module(module)
+ return self.get_finder(root).find_module(module)
def run_test(self, test, create=None, *, compile_=None, unlink=None):
"""Test the finding of 'test' with the creation of modules listed in
@@ -102,39 +108,21 @@ class FinderTests(abc.FinderTests):
loader = self.import_(pkg_dir, 'pkg.sub')
self.assertTrue(hasattr(loader, 'load_module'))
- # [sub empty]
- def test_empty_sub_directory(self):
- context = source_util.create_modules('pkg.__init__', 'pkg.sub.__init__')
- with warnings.catch_warnings():
- warnings.simplefilter("error", ImportWarning)
- with context as mapping:
- os.unlink(mapping['pkg.sub.__init__'])
- pkg_dir = os.path.dirname(mapping['pkg.__init__'])
- with self.assertRaises(ImportWarning):
- self.import_(pkg_dir, 'pkg.sub')
-
# [package over modules]
def test_package_over_module(self):
name = '_temp'
loader = self.run_test(name, {'{0}.__init__'.format(name), name})
- self.assertTrue('__init__' in loader.get_filename(name))
-
+ self.assertIn('__init__', loader.get_filename(name))
def test_failure(self):
with source_util.create_modules('blah') as mapping:
nothing = self.import_(mapping['.root'], 'sdfsadsadf')
- self.assertTrue(nothing is None)
-
- # [empty dir]
- def test_empty_dir(self):
- with warnings.catch_warnings():
- warnings.simplefilter("error", ImportWarning)
- with self.assertRaises(ImportWarning):
- self.run_test('pkg', {'pkg.__init__'}, unlink={'pkg.__init__'})
+ self.assertIsNone(nothing)
def test_empty_string_for_dir(self):
# The empty string from sys.path means to search in the cwd.
- finder = _bootstrap._FileFinder('', _bootstrap._SourceFinderDetails())
+ finder = machinery.FileFinder('', (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES))
with open('mod.py', 'w') as file:
file.write("# test file for importlib")
try:
@@ -143,6 +131,21 @@ class FinderTests(abc.FinderTests):
finally:
os.unlink('mod.py')
+ def test_invalidate_caches(self):
+ # invalidate_caches() should reset the mtime.
+ finder = machinery.FileFinder('', (machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES))
+ finder._path_mtime = 42
+ finder.invalidate_caches()
+ self.assertEqual(finder._path_mtime, -1)
+
+ # Regression test for http://bugs.python.org/issue14846
+ def test_dir_removal_handling(self):
+ mod = 'mod'
+ with source_util.create_modules(mod) as mapping:
+ finder = self.get_finder(mapping['.root'])
+ self.assertIsNotNone(finder.find_module(mod))
+ self.assertIsNone(finder.find_module(mod))
def test_main():
from test.support import run_unittest
diff --git a/Lib/importlib/test/source/test_path_hook.py b/Lib/test/test_importlib/source/test_path_hook.py
index 374f7b6..6a78792 100644
--- a/Lib/importlib/test/source/test_path_hook.py
+++ b/Lib/test/test_importlib/source/test_path_hook.py
@@ -1,5 +1,7 @@
-from importlib import _bootstrap
from . import util as source_util
+
+from importlib import machinery
+import imp
import unittest
@@ -7,14 +9,18 @@ class PathHookTest(unittest.TestCase):
"""Test the path hook for source."""
+ def path_hook(self):
+ return machinery.FileFinder.path_hook((machinery.SourceFileLoader,
+ machinery.SOURCE_SUFFIXES))
+
def test_success(self):
with source_util.create_modules('dummy') as mapping:
- self.assertTrue(hasattr(_bootstrap._file_path_hook(mapping['.root']),
+ self.assertTrue(hasattr(self.path_hook()(mapping['.root']),
'find_module'))
def test_empty_string(self):
# The empty string represents the cwd.
- self.assertTrue(hasattr(_bootstrap._file_path_hook(''), 'find_module'))
+ self.assertTrue(hasattr(self.path_hook()(''), 'find_module'))
def test_main():
diff --git a/Lib/importlib/test/source/test_source_encoding.py b/Lib/test/test_importlib/source/test_source_encoding.py
index 794a3df..0ca5195 100644
--- a/Lib/importlib/test/source/test_source_encoding.py
+++ b/Lib/test/test_importlib/source/test_source_encoding.py
@@ -1,6 +1,6 @@
-from importlib import _bootstrap
from . import util as source_util
+from importlib import _bootstrap
import codecs
import re
import sys
@@ -35,8 +35,8 @@ class EncodingTest(unittest.TestCase):
with source_util.create_modules(self.module_name) as mapping:
with open(mapping[self.module_name], 'wb') as file:
file.write(source)
- loader = _bootstrap._SourceFileLoader(self.module_name,
- mapping[self.module_name])
+ loader = _bootstrap.SourceFileLoader(self.module_name,
+ mapping[self.module_name])
return loader.load_module(self.module_name)
def create_source(self, encoding):
@@ -97,7 +97,7 @@ class LineEndingTest(unittest.TestCase):
with source_util.create_modules(module_name) as mapping:
with open(mapping[module_name], 'wb') as file:
file.write(source)
- loader = _bootstrap._SourceFileLoader(module_name,
+ loader = _bootstrap.SourceFileLoader(module_name,
mapping[module_name])
return loader.load_module(module_name)
diff --git a/Lib/importlib/test/source/util.py b/Lib/test/test_importlib/source/util.py
index ae65663..ae65663 100644
--- a/Lib/importlib/test/source/util.py
+++ b/Lib/test/test_importlib/source/util.py
diff --git a/Lib/importlib/test/test_abc.py b/Lib/test/test_importlib/test_abc.py
index 0ecbe39..c620c37 100644
--- a/Lib/importlib/test/test_abc.py
+++ b/Lib/test/test_importlib/test_abc.py
@@ -30,10 +30,17 @@ class InheritanceTests:
"{0} is not a superclass of {1}".format(superclass, self.__test))
-class Finder(InheritanceTests, unittest.TestCase):
+class MetaPathFinder(InheritanceTests, unittest.TestCase):
+ superclasses = [abc.Finder]
subclasses = [machinery.BuiltinImporter, machinery.FrozenImporter,
- machinery.PathFinder]
+ machinery.PathFinder, machinery.WindowsRegistryFinder]
+
+
+class PathEntryFinder(InheritanceTests, unittest.TestCase):
+
+ superclasses = [abc.Finder]
+ subclasses = [machinery.FileFinder]
class Loader(InheritanceTests, unittest.TestCase):
@@ -50,7 +57,7 @@ class InspectLoader(InheritanceTests, unittest.TestCase):
superclasses = [abc.Loader]
subclasses = [abc.PyLoader, machinery.BuiltinImporter,
- machinery.FrozenImporter]
+ machinery.FrozenImporter, machinery.ExtensionFileLoader]
class ExecutionLoader(InheritanceTests, unittest.TestCase):
@@ -59,9 +66,16 @@ class ExecutionLoader(InheritanceTests, unittest.TestCase):
subclasses = [abc.PyLoader]
+class FileLoader(InheritanceTests, unittest.TestCase):
+
+ superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
+ subclasses = [machinery.SourceFileLoader, machinery.SourcelessFileLoader]
+
+
class SourceLoader(InheritanceTests, unittest.TestCase):
superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
+ subclasses = [machinery.SourceFileLoader]
class PyLoader(InheritanceTests, unittest.TestCase):
diff --git a/Lib/importlib/test/test_api.py b/Lib/test/test_importlib/test_api.py
index a151626..ef6629a 100644
--- a/Lib/importlib/test/test_api.py
+++ b/Lib/test/test_importlib/test_api.py
@@ -1,7 +1,9 @@
from . import util
import imp
import importlib
+from importlib import machinery
import sys
+from test import support
import unittest
@@ -84,9 +86,101 @@ class ImportModuleTests(unittest.TestCase):
importlib.import_module('a.b')
self.assertEqual(b_load_count, 1)
+
+class FindLoaderTests(unittest.TestCase):
+
+ class FakeMetaFinder:
+ @staticmethod
+ def find_module(name, path=None): return name, path
+
+ def test_sys_modules(self):
+ # If a module with __loader__ is in sys.modules, then return it.
+ name = 'some_mod'
+ with util.uncache(name):
+ module = imp.new_module(name)
+ loader = 'a loader!'
+ module.__loader__ = loader
+ sys.modules[name] = module
+ found = importlib.find_loader(name)
+ self.assertEqual(loader, found)
+
+ def test_sys_modules_loader_is_None(self):
+ # If sys.modules[name].__loader__ is None, raise ValueError.
+ name = 'some_mod'
+ with util.uncache(name):
+ module = imp.new_module(name)
+ module.__loader__ = None
+ sys.modules[name] = module
+ with self.assertRaises(ValueError):
+ importlib.find_loader(name)
+
+ def test_success(self):
+ # Return the loader found on sys.meta_path.
+ name = 'some_mod'
+ with util.uncache(name):
+ with util.import_state(meta_path=[self.FakeMetaFinder]):
+ self.assertEqual((name, None), importlib.find_loader(name))
+
+ def test_success_path(self):
+ # Searching on a path should work.
+ name = 'some_mod'
+ path = 'path to some place'
+ with util.uncache(name):
+ with util.import_state(meta_path=[self.FakeMetaFinder]):
+ self.assertEqual((name, path),
+ importlib.find_loader(name, path))
+
+ def test_nothing(self):
+ # None is returned upon failure to find a loader.
+ self.assertIsNone(importlib.find_loader('nevergoingtofindthismodule'))
+
+
+class InvalidateCacheTests(unittest.TestCase):
+
+ def test_method_called(self):
+ # If defined the method should be called.
+ class InvalidatingNullFinder:
+ def __init__(self, *ignored):
+ self.called = False
+ def find_module(self, *args):
+ return None
+ def invalidate_caches(self):
+ self.called = True
+
+ key = 'gobledeegook'
+ meta_ins = InvalidatingNullFinder()
+ path_ins = InvalidatingNullFinder()
+ sys.meta_path.insert(0, meta_ins)
+ self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
+ sys.path_importer_cache[key] = path_ins
+ self.addCleanup(lambda: sys.meta_path.remove(meta_ins))
+ importlib.invalidate_caches()
+ self.assertTrue(meta_ins.called)
+ self.assertTrue(path_ins.called)
+
+ def test_method_lacking(self):
+ # There should be no issues if the method is not defined.
+ key = 'gobbledeegook'
+ sys.path_importer_cache[key] = imp.NullImporter('abc')
+ self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key))
+ importlib.invalidate_caches() # Shouldn't trigger an exception.
+
+
+class FrozenImportlibTests(unittest.TestCase):
+
+ def test_no_frozen_importlib(self):
+ # Should be able to import w/o _frozen_importlib being defined.
+ module = support.import_fresh_module('importlib', blocked=['_frozen_importlib'])
+ self.assertFalse(isinstance(module.__loader__,
+ machinery.FrozenImporter))
+
+
def test_main():
from test.support import run_unittest
- run_unittest(ImportModuleTests)
+ run_unittest(ImportModuleTests,
+ FindLoaderTests,
+ InvalidateCacheTests,
+ FrozenImportlibTests)
if __name__ == '__main__':
diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py
new file mode 100644
index 0000000..c373b11
--- /dev/null
+++ b/Lib/test/test_importlib/test_locks.py
@@ -0,0 +1,129 @@
+from importlib import _bootstrap
+import sys
+import time
+import unittest
+import weakref
+
+from test import support
+
+try:
+ import threading
+except ImportError:
+ threading = None
+else:
+ from test import lock_tests
+
+
+LockType = _bootstrap._ModuleLock
+DeadlockError = _bootstrap._DeadlockError
+
+
+if threading is not None:
+ class ModuleLockAsRLockTests(lock_tests.RLockTests):
+ locktype = staticmethod(lambda: LockType("some_lock"))
+
+ # _is_owned() unsupported
+ test__is_owned = None
+ # acquire(blocking=False) unsupported
+ test_try_acquire = None
+ test_try_acquire_contended = None
+ # `with` unsupported
+ test_with = None
+ # acquire(timeout=...) unsupported
+ test_timeout = None
+ # _release_save() unsupported
+ test_release_save_unacquired = None
+
+else:
+ class ModuleLockAsRLockTests(unittest.TestCase):
+ pass
+
+
+@unittest.skipUnless(threading, "threads needed for this test")
+class DeadlockAvoidanceTests(unittest.TestCase):
+
+ def setUp(self):
+ try:
+ self.old_switchinterval = sys.getswitchinterval()
+ sys.setswitchinterval(0.000001)
+ except AttributeError:
+ self.old_switchinterval = None
+
+ def tearDown(self):
+ if self.old_switchinterval is not None:
+ sys.setswitchinterval(self.old_switchinterval)
+
+ def run_deadlock_avoidance_test(self, create_deadlock):
+ NLOCKS = 10
+ locks = [LockType(str(i)) for i in range(NLOCKS)]
+ pairs = [(locks[i], locks[(i+1)%NLOCKS]) for i in range(NLOCKS)]
+ if create_deadlock:
+ NTHREADS = NLOCKS
+ else:
+ NTHREADS = NLOCKS - 1
+ barrier = threading.Barrier(NTHREADS)
+ results = []
+ def _acquire(lock):
+ """Try to acquire the lock. Return True on success, False on deadlock."""
+ try:
+ lock.acquire()
+ except DeadlockError:
+ return False
+ else:
+ return True
+ def f():
+ a, b = pairs.pop()
+ ra = _acquire(a)
+ barrier.wait()
+ rb = _acquire(b)
+ results.append((ra, rb))
+ if rb:
+ b.release()
+ if ra:
+ a.release()
+ lock_tests.Bunch(f, NTHREADS).wait_for_finished()
+ self.assertEqual(len(results), NTHREADS)
+ return results
+
+ def test_deadlock(self):
+ results = self.run_deadlock_avoidance_test(True)
+ # At least one of the threads detected a potential deadlock on its
+ # second acquire() call. It may be several of them, because the
+ # deadlock avoidance mechanism is conservative.
+ nb_deadlocks = results.count((True, False))
+ self.assertGreaterEqual(nb_deadlocks, 1)
+ self.assertEqual(results.count((True, True)), len(results) - nb_deadlocks)
+
+ def test_no_deadlock(self):
+ results = self.run_deadlock_avoidance_test(False)
+ self.assertEqual(results.count((True, False)), 0)
+ self.assertEqual(results.count((True, True)), len(results))
+
+
+class LifetimeTests(unittest.TestCase):
+
+ def test_lock_lifetime(self):
+ name = "xyzzy"
+ self.assertNotIn(name, _bootstrap._module_locks)
+ lock = _bootstrap._get_module_lock(name)
+ self.assertIn(name, _bootstrap._module_locks)
+ wr = weakref.ref(lock)
+ del lock
+ support.gc_collect()
+ self.assertNotIn(name, _bootstrap._module_locks)
+ self.assertIsNone(wr())
+
+ def test_all_locks(self):
+ support.gc_collect()
+ self.assertEqual(0, len(_bootstrap._module_locks), _bootstrap._module_locks)
+
+
+@support.reap_threads
+def test_main():
+ support.run_unittest(ModuleLockAsRLockTests,
+ DeadlockAvoidanceTests,
+ LifetimeTests)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/importlib/test/test_util.py b/Lib/test/test_importlib/test_util.py
index 602447f..efc8977 100644
--- a/Lib/importlib/test/test_util.py
+++ b/Lib/test/test_importlib/test_util.py
@@ -29,8 +29,8 @@ class ModuleForLoaderTests(unittest.TestCase):
module_name = 'a.b.c'
with test_util.uncache(module_name):
module = self.return_module(module_name)
- self.assertTrue(module_name in sys.modules)
- self.assertTrue(isinstance(module, types.ModuleType))
+ self.assertIn(module_name, sys.modules)
+ self.assertIsInstance(module, types.ModuleType)
self.assertEqual(module.__name__, module_name)
def test_reload(self):
@@ -48,7 +48,7 @@ class ModuleForLoaderTests(unittest.TestCase):
name = 'a.b.c'
with test_util.uncache(name):
self.raise_exception(name)
- self.assertTrue(name not in sys.modules)
+ self.assertNotIn(name, sys.modules)
def test_reload_failure(self):
# Test that a failure on reload leaves the module in-place.
@@ -59,10 +59,57 @@ class ModuleForLoaderTests(unittest.TestCase):
self.raise_exception(name)
self.assertIs(module, sys.modules[name])
+ def test_decorator_attrs(self):
+ def fxn(self, module): pass
+ wrapped = util.module_for_loader(fxn)
+ self.assertEqual(wrapped.__name__, fxn.__name__)
+ self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
-class SetPackageTests(unittest.TestCase):
+ def test_false_module(self):
+ # If for some odd reason a module is considered false, still return it
+ # from sys.modules.
+ class FalseModule(types.ModuleType):
+ def __bool__(self): return False
+
+ name = 'mod'
+ module = FalseModule(name)
+ with test_util.uncache(name):
+ self.assertFalse(module)
+ sys.modules[name] = module
+ given = self.return_module(name)
+ self.assertIs(given, module)
+
+ def test_attributes_set(self):
+ # __name__, __loader__, and __package__ should be set (when
+ # is_package() is defined; undefined implicitly tested elsewhere).
+ class FakeLoader:
+ def __init__(self, is_package):
+ self._pkg = is_package
+ def is_package(self, name):
+ return self._pkg
+ @util.module_for_loader
+ def load_module(self, module):
+ return module
+
+ name = 'pkg.mod'
+ with test_util.uncache(name):
+ loader = FakeLoader(False)
+ module = loader.load_module(name)
+ self.assertEqual(module.__name__, name)
+ self.assertIs(module.__loader__, loader)
+ self.assertEqual(module.__package__, 'pkg')
+
+ name = 'pkg.sub'
+ with test_util.uncache(name):
+ loader = FakeLoader(True)
+ module = loader.load_module(name)
+ self.assertEqual(module.__name__, name)
+ self.assertIs(module.__loader__, loader)
+ self.assertEqual(module.__package__, name)
+class SetPackageTests(unittest.TestCase):
+
"""Tests for importlib.util.set_package."""
def verify(self, module, expect):
@@ -108,10 +155,53 @@ class SetPackageTests(unittest.TestCase):
module.__package__ = value
self.verify(module, value)
+ def test_decorator_attrs(self):
+ def fxn(module): pass
+ wrapped = util.set_package(fxn)
+ self.assertEqual(wrapped.__name__, fxn.__name__)
+ self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
+
+
+class ResolveNameTests(unittest.TestCase):
+
+ """Tests importlib.util.resolve_name()."""
+
+ def test_absolute(self):
+ # bacon
+ self.assertEqual('bacon', util.resolve_name('bacon', None))
+
+ def test_aboslute_within_package(self):
+ # bacon in spam
+ self.assertEqual('bacon', util.resolve_name('bacon', 'spam'))
+
+ def test_no_package(self):
+ # .bacon in ''
+ with self.assertRaises(ValueError):
+ util.resolve_name('.bacon', '')
+
+ def test_in_package(self):
+ # .bacon in spam
+ self.assertEqual('spam.eggs.bacon',
+ util.resolve_name('.bacon', 'spam.eggs'))
+
+ def test_other_package(self):
+ # ..bacon in spam.bacon
+ self.assertEqual('spam.bacon',
+ util.resolve_name('..bacon', 'spam.eggs'))
+
+ def test_escape(self):
+ # ..bacon in spam
+ with self.assertRaises(ValueError):
+ util.resolve_name('..bacon', 'spam')
+
def test_main():
from test import support
- support.run_unittest(ModuleForLoaderTests, SetPackageTests)
+ support.run_unittest(
+ ModuleForLoaderTests,
+ SetPackageTests,
+ ResolveNameTests
+ )
if __name__ == '__main__':
diff --git a/Lib/importlib/test/util.py b/Lib/test/test_importlib/util.py
index 93b7cd2..ef32f7d 100644
--- a/Lib/importlib/test/util.py
+++ b/Lib/test/test_importlib/util.py
@@ -35,7 +35,7 @@ def uncache(*names):
for name in names:
if name in ('sys', 'marshal', 'imp'):
raise ValueError(
- "cannot uncache {0} as it will break _importlib".format(name))
+ "cannot uncache {0}".format(name))
try:
del sys.modules[name]
except KeyError:
@@ -124,7 +124,11 @@ class mock_modules:
else:
sys.modules[fullname] = self.modules[fullname]
if fullname in self.module_code:
- self.module_code[fullname]()
+ try:
+ self.module_code[fullname]()
+ except Exception:
+ del sys.modules[fullname]
+ raise
return self.modules[fullname]
def __enter__(self):
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 4b7ee4e..80db03b 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -41,11 +41,6 @@ def revise(filename, *args):
import builtins
-try:
- 1/0
-except:
- tb = sys.exc_info()[2]
-
git = mod.StupidGit()
class IsTestBase(unittest.TestCase):
@@ -79,23 +74,31 @@ class TestPredicates(IsTestBase):
def test_excluding_predicates(self):
+ global tb
self.istest(inspect.isbuiltin, 'sys.exit')
self.istest(inspect.isbuiltin, '[].append')
self.istest(inspect.iscode, 'mod.spam.__code__')
- self.istest(inspect.isframe, 'tb.tb_frame')
+ try:
+ 1/0
+ except:
+ tb = sys.exc_info()[2]
+ self.istest(inspect.isframe, 'tb.tb_frame')
+ self.istest(inspect.istraceback, 'tb')
+ if hasattr(types, 'GetSetDescriptorType'):
+ self.istest(inspect.isgetsetdescriptor,
+ 'type(tb.tb_frame).f_locals')
+ else:
+ self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals))
+ finally:
+ # Clear traceback and all the frames and local variables hanging to it.
+ tb = None
self.istest(inspect.isfunction, 'mod.spam')
self.istest(inspect.isfunction, 'mod.StupidGit.abuse')
self.istest(inspect.ismethod, 'git.argue')
self.istest(inspect.ismodule, 'mod')
- self.istest(inspect.istraceback, 'tb')
self.istest(inspect.isdatadescriptor, 'collections.defaultdict.default_factory')
self.istest(inspect.isgenerator, '(x for x in range(2))')
self.istest(inspect.isgeneratorfunction, 'generator_function_example')
- if hasattr(types, 'GetSetDescriptorType'):
- self.istest(inspect.isgetsetdescriptor,
- 'type(tb.tb_frame).f_locals')
- else:
- self.assertFalse(inspect.isgetsetdescriptor(type(tb.tb_frame).f_locals))
if hasattr(types, 'MemberDescriptorType'):
self.istest(inspect.ismemberdescriptor, 'datetime.timedelta.days')
else:
@@ -282,7 +285,10 @@ class TestRetrievingSourceCode(GetSourceBase):
co = compile("None", fn, "exec")
self.assertEqual(inspect.getsourcefile(co), None)
linecache.cache[co.co_filename] = (1, None, "None", co.co_filename)
- self.assertEqual(normcase(inspect.getsourcefile(co)), fn)
+ try:
+ self.assertEqual(normcase(inspect.getsourcefile(co)), fn)
+ finally:
+ del linecache.cache[co.co_filename]
def test_getfile(self):
self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__)
@@ -304,7 +310,7 @@ class TestRetrievingSourceCode(GetSourceBase):
getlines = linecache.getlines
def monkey(filename, module_globals=None):
if filename == fn:
- return source.splitlines(True)
+ return source.splitlines(keepends=True)
else:
return getlines(filename, module_globals)
linecache.getlines = monkey
@@ -404,8 +410,11 @@ class TestBuggyCases(GetSourceBase):
self.assertRaises(IOError, inspect.findsource, co)
self.assertRaises(IOError, inspect.getsource, co)
linecache.cache[co.co_filename] = (1, None, lines, co.co_filename)
- self.assertEqual(inspect.findsource(co), (lines,0))
- self.assertEqual(inspect.getsource(co), lines[0])
+ try:
+ self.assertEqual(inspect.findsource(co), (lines,0))
+ self.assertEqual(inspect.getsource(co), lines[0])
+ finally:
+ del linecache.cache[co.co_filename]
class TestNoEOL(GetSourceBase):
def __init__(self, *args, **kwargs):
@@ -662,6 +671,129 @@ class TestClassesAndFunctions(unittest.TestCase):
self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod))
+_global_ref = object()
+class TestGetClosureVars(unittest.TestCase):
+
+ def test_name_resolution(self):
+ # Basic test of the 4 different resolution mechanisms
+ def f(nonlocal_ref):
+ def g(local_ref):
+ print(local_ref, nonlocal_ref, _global_ref, unbound_ref)
+ return g
+ _arg = object()
+ nonlocal_vars = {"nonlocal_ref": _arg}
+ global_vars = {"_global_ref": _global_ref}
+ builtin_vars = {"print": print}
+ unbound_names = {"unbound_ref"}
+ expected = inspect.ClosureVars(nonlocal_vars, global_vars,
+ builtin_vars, unbound_names)
+ self.assertEqual(inspect.getclosurevars(f(_arg)), expected)
+
+ def test_generator_closure(self):
+ def f(nonlocal_ref):
+ def g(local_ref):
+ print(local_ref, nonlocal_ref, _global_ref, unbound_ref)
+ yield
+ return g
+ _arg = object()
+ nonlocal_vars = {"nonlocal_ref": _arg}
+ global_vars = {"_global_ref": _global_ref}
+ builtin_vars = {"print": print}
+ unbound_names = {"unbound_ref"}
+ expected = inspect.ClosureVars(nonlocal_vars, global_vars,
+ builtin_vars, unbound_names)
+ self.assertEqual(inspect.getclosurevars(f(_arg)), expected)
+
+ def test_method_closure(self):
+ class C:
+ def f(self, nonlocal_ref):
+ def g(local_ref):
+ print(local_ref, nonlocal_ref, _global_ref, unbound_ref)
+ return g
+ _arg = object()
+ nonlocal_vars = {"nonlocal_ref": _arg}
+ global_vars = {"_global_ref": _global_ref}
+ builtin_vars = {"print": print}
+ unbound_names = {"unbound_ref"}
+ expected = inspect.ClosureVars(nonlocal_vars, global_vars,
+ builtin_vars, unbound_names)
+ self.assertEqual(inspect.getclosurevars(C().f(_arg)), expected)
+
+ def test_nonlocal_vars(self):
+ # More complex tests of nonlocal resolution
+ def _nonlocal_vars(f):
+ return inspect.getclosurevars(f).nonlocals
+
+ def make_adder(x):
+ def add(y):
+ return x + y
+ return add
+
+ def curry(func, arg1):
+ return lambda arg2: func(arg1, arg2)
+
+ def less_than(a, b):
+ return a < b
+
+ # The infamous Y combinator.
+ def Y(le):
+ def g(f):
+ return le(lambda x: f(f)(x))
+ Y.g_ref = g
+ return g(g)
+
+ def check_y_combinator(func):
+ self.assertEqual(_nonlocal_vars(func), {'f': Y.g_ref})
+
+ inc = make_adder(1)
+ add_two = make_adder(2)
+ greater_than_five = curry(less_than, 5)
+
+ self.assertEqual(_nonlocal_vars(inc), {'x': 1})
+ self.assertEqual(_nonlocal_vars(add_two), {'x': 2})
+ self.assertEqual(_nonlocal_vars(greater_than_five),
+ {'arg1': 5, 'func': less_than})
+ self.assertEqual(_nonlocal_vars((lambda x: lambda y: x + y)(3)),
+ {'x': 3})
+ Y(check_y_combinator)
+
+ def test_getclosurevars_empty(self):
+ def foo(): pass
+ _empty = inspect.ClosureVars({}, {}, {}, set())
+ self.assertEqual(inspect.getclosurevars(lambda: True), _empty)
+ self.assertEqual(inspect.getclosurevars(foo), _empty)
+
+ def test_getclosurevars_error(self):
+ class T: pass
+ self.assertRaises(TypeError, inspect.getclosurevars, 1)
+ self.assertRaises(TypeError, inspect.getclosurevars, list)
+ self.assertRaises(TypeError, inspect.getclosurevars, {})
+
+ def _private_globals(self):
+ code = """def f(): print(path)"""
+ ns = {}
+ exec(code, ns)
+ return ns["f"], ns
+
+ def test_builtins_fallback(self):
+ f, ns = self._private_globals()
+ ns.pop("__builtins__", None)
+ expected = inspect.ClosureVars({}, {}, {"print":print}, {"path"})
+ self.assertEqual(inspect.getclosurevars(f), expected)
+
+ def test_builtins_as_dict(self):
+ f, ns = self._private_globals()
+ ns["__builtins__"] = {"path":1}
+ expected = inspect.ClosureVars({}, {}, {"path":1}, {"print"})
+ self.assertEqual(inspect.getclosurevars(f), expected)
+
+ def test_builtins_as_module(self):
+ f, ns = self._private_globals()
+ ns["__builtins__"] = os
+ expected = inspect.ClosureVars({}, {}, {"path":os.path}, {"print"})
+ self.assertEqual(inspect.getclosurevars(f), expected)
+
+
class TestGetcallargsFunctions(unittest.TestCase):
def assertEqualCallArgs(self, func, call_params_string, locs=None):
@@ -1169,6 +1301,972 @@ class TestGetGeneratorState(unittest.TestCase):
self.assertIn(name, repr(state))
self.assertIn(name, str(state))
+ def test_getgeneratorlocals(self):
+ def each(lst, a=None):
+ b=(1, 2, 3)
+ for v in lst:
+ if v == 3:
+ c = 12
+ yield v
+
+ numbers = each([1, 2, 3])
+ self.assertEqual(inspect.getgeneratorlocals(numbers),
+ {'a': None, 'lst': [1, 2, 3]})
+ next(numbers)
+ self.assertEqual(inspect.getgeneratorlocals(numbers),
+ {'a': None, 'lst': [1, 2, 3], 'v': 1,
+ 'b': (1, 2, 3)})
+ next(numbers)
+ self.assertEqual(inspect.getgeneratorlocals(numbers),
+ {'a': None, 'lst': [1, 2, 3], 'v': 2,
+ 'b': (1, 2, 3)})
+ next(numbers)
+ self.assertEqual(inspect.getgeneratorlocals(numbers),
+ {'a': None, 'lst': [1, 2, 3], 'v': 3,
+ 'b': (1, 2, 3), 'c': 12})
+ try:
+ next(numbers)
+ except StopIteration:
+ pass
+ self.assertEqual(inspect.getgeneratorlocals(numbers), {})
+
+ def test_getgeneratorlocals_empty(self):
+ def yield_one():
+ yield 1
+ one = yield_one()
+ self.assertEqual(inspect.getgeneratorlocals(one), {})
+ try:
+ next(one)
+ except StopIteration:
+ pass
+ self.assertEqual(inspect.getgeneratorlocals(one), {})
+
+ def test_getgeneratorlocals_error(self):
+ self.assertRaises(TypeError, inspect.getgeneratorlocals, 1)
+ self.assertRaises(TypeError, inspect.getgeneratorlocals, lambda x: True)
+ self.assertRaises(TypeError, inspect.getgeneratorlocals, set)
+ self.assertRaises(TypeError, inspect.getgeneratorlocals, (2,3))
+
+
+class TestSignatureObject(unittest.TestCase):
+ @staticmethod
+ def signature(func):
+ sig = inspect.signature(func)
+ return (tuple((param.name,
+ (... if param.default is param.empty else param.default),
+ (... if param.annotation is param.empty
+ else param.annotation),
+ str(param.kind).lower())
+ for param in sig.parameters.values()),
+ (... if sig.return_annotation is sig.empty
+ else sig.return_annotation))
+
+ def test_signature_object(self):
+ S = inspect.Signature
+ P = inspect.Parameter
+
+ self.assertEqual(str(S()), '()')
+
+ def test(po, pk, *args, ko, **kwargs):
+ pass
+ sig = inspect.signature(test)
+ po = sig.parameters['po'].replace(kind=P.POSITIONAL_ONLY)
+ pk = sig.parameters['pk']
+ args = sig.parameters['args']
+ ko = sig.parameters['ko']
+ kwargs = sig.parameters['kwargs']
+
+ S((po, pk, args, ko, kwargs))
+
+ with self.assertRaisesRegex(ValueError, 'wrong parameter order'):
+ S((pk, po, args, ko, kwargs))
+
+ with self.assertRaisesRegex(ValueError, 'wrong parameter order'):
+ S((po, args, pk, ko, kwargs))
+
+ with self.assertRaisesRegex(ValueError, 'wrong parameter order'):
+ S((args, po, pk, ko, kwargs))
+
+ with self.assertRaisesRegex(ValueError, 'wrong parameter order'):
+ S((po, pk, args, kwargs, ko))
+
+ kwargs2 = kwargs.replace(name='args')
+ with self.assertRaisesRegex(ValueError, 'duplicate parameter name'):
+ S((po, pk, args, kwargs2, ko))
+
+ def test_signature_immutability(self):
+ def test(a):
+ pass
+ sig = inspect.signature(test)
+
+ with self.assertRaises(AttributeError):
+ sig.foo = 'bar'
+
+ with self.assertRaises(TypeError):
+ sig.parameters['a'] = None
+
+ def test_signature_on_noarg(self):
+ def test():
+ pass
+ self.assertEqual(self.signature(test), ((), ...))
+
+ def test_signature_on_wargs(self):
+ def test(a, b:'foo') -> 123:
+ pass
+ self.assertEqual(self.signature(test),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., 'foo', "positional_or_keyword")),
+ 123))
+
+ def test_signature_on_wkwonly(self):
+ def test(*, a:float, b:str) -> int:
+ pass
+ self.assertEqual(self.signature(test),
+ ((('a', ..., float, "keyword_only"),
+ ('b', ..., str, "keyword_only")),
+ int))
+
+ def test_signature_on_complex_args(self):
+ def test(a, b:'foo'=10, *args:'bar', spam:'baz', ham=123, **kwargs:int):
+ pass
+ self.assertEqual(self.signature(test),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', 10, 'foo', "positional_or_keyword"),
+ ('args', ..., 'bar', "var_positional"),
+ ('spam', ..., 'baz', "keyword_only"),
+ ('ham', 123, ..., "keyword_only"),
+ ('kwargs', ..., int, "var_keyword")),
+ ...))
+
+ def test_signature_on_builtin_function(self):
+ with self.assertRaisesRegex(ValueError, 'not supported by signature'):
+ inspect.signature(type)
+ with self.assertRaisesRegex(ValueError, 'not supported by signature'):
+ # support for 'wrapper_descriptor'
+ inspect.signature(type.__call__)
+ with self.assertRaisesRegex(ValueError, 'not supported by signature'):
+ # support for 'method-wrapper'
+ inspect.signature(min.__call__)
+ with self.assertRaisesRegex(ValueError,
+ 'no signature found for builtin function'):
+ # support for 'method-wrapper'
+ inspect.signature(min)
+
+ def test_signature_on_non_function(self):
+ with self.assertRaisesRegex(TypeError, 'is not a callable object'):
+ inspect.signature(42)
+
+ with self.assertRaisesRegex(TypeError, 'is not a Python function'):
+ inspect.Signature.from_function(42)
+
+ def test_signature_on_method(self):
+ class Test:
+ def foo(self, arg1, arg2=1) -> int:
+ pass
+
+ meth = Test().foo
+
+ self.assertEqual(self.signature(meth),
+ ((('arg1', ..., ..., "positional_or_keyword"),
+ ('arg2', 1, ..., "positional_or_keyword")),
+ int))
+
+ def test_signature_on_classmethod(self):
+ class Test:
+ @classmethod
+ def foo(cls, arg1, *, arg2=1):
+ pass
+
+ meth = Test().foo
+ self.assertEqual(self.signature(meth),
+ ((('arg1', ..., ..., "positional_or_keyword"),
+ ('arg2', 1, ..., "keyword_only")),
+ ...))
+
+ meth = Test.foo
+ self.assertEqual(self.signature(meth),
+ ((('arg1', ..., ..., "positional_or_keyword"),
+ ('arg2', 1, ..., "keyword_only")),
+ ...))
+
+ def test_signature_on_staticmethod(self):
+ class Test:
+ @staticmethod
+ def foo(cls, *, arg):
+ pass
+
+ meth = Test().foo
+ self.assertEqual(self.signature(meth),
+ ((('cls', ..., ..., "positional_or_keyword"),
+ ('arg', ..., ..., "keyword_only")),
+ ...))
+
+ meth = Test.foo
+ self.assertEqual(self.signature(meth),
+ ((('cls', ..., ..., "positional_or_keyword"),
+ ('arg', ..., ..., "keyword_only")),
+ ...))
+
+ def test_signature_on_partial(self):
+ from functools import partial
+
+ def test():
+ pass
+
+ self.assertEqual(self.signature(partial(test)), ((), ...))
+
+ with self.assertRaisesRegex(ValueError, "has incorrect arguments"):
+ inspect.signature(partial(test, 1))
+
+ with self.assertRaisesRegex(ValueError, "has incorrect arguments"):
+ inspect.signature(partial(test, a=1))
+
+ def test(a, b, *, c, d):
+ pass
+
+ self.assertEqual(self.signature(partial(test)),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., ..., "positional_or_keyword"),
+ ('c', ..., ..., "keyword_only"),
+ ('d', ..., ..., "keyword_only")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, 1)),
+ ((('b', ..., ..., "positional_or_keyword"),
+ ('c', ..., ..., "keyword_only"),
+ ('d', ..., ..., "keyword_only")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, 1, c=2)),
+ ((('b', ..., ..., "positional_or_keyword"),
+ ('c', 2, ..., "keyword_only"),
+ ('d', ..., ..., "keyword_only")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, b=1, c=2)),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', 1, ..., "positional_or_keyword"),
+ ('c', 2, ..., "keyword_only"),
+ ('d', ..., ..., "keyword_only")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, 0, b=1, c=2)),
+ ((('b', 1, ..., "positional_or_keyword"),
+ ('c', 2, ..., "keyword_only"),
+ ('d', ..., ..., "keyword_only"),),
+ ...))
+
+ def test(a, *args, b, **kwargs):
+ pass
+
+ self.assertEqual(self.signature(partial(test, 1)),
+ ((('args', ..., ..., "var_positional"),
+ ('b', ..., ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, 1, 2, 3)),
+ ((('args', ..., ..., "var_positional"),
+ ('b', ..., ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+
+ self.assertEqual(self.signature(partial(test, 1, 2, 3, test=True)),
+ ((('args', ..., ..., "var_positional"),
+ ('b', ..., ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, 1, 2, 3, test=1, b=0)),
+ ((('args', ..., ..., "var_positional"),
+ ('b', 0, ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, b=0)),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('args', ..., ..., "var_positional"),
+ ('b', 0, ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(partial(test, b=0, test=1)),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('args', ..., ..., "var_positional"),
+ ('b', 0, ..., "keyword_only"),
+ ('kwargs', ..., ..., "var_keyword")),
+ ...))
+
+ def test(a, b, c:int) -> 42:
+ pass
+
+ sig = test.__signature__ = inspect.signature(test)
+
+ self.assertEqual(self.signature(partial(partial(test, 1))),
+ ((('b', ..., ..., "positional_or_keyword"),
+ ('c', ..., int, "positional_or_keyword")),
+ 42))
+
+ self.assertEqual(self.signature(partial(partial(test, 1), 2)),
+ ((('c', ..., int, "positional_or_keyword"),),
+ 42))
+
+ psig = inspect.signature(partial(partial(test, 1), 2))
+
+ def foo(a):
+ return a
+ _foo = partial(partial(foo, a=10), a=20)
+ self.assertEqual(self.signature(_foo),
+ ((('a', 20, ..., "positional_or_keyword"),),
+ ...))
+ # check that we don't have any side-effects in signature(),
+ # and the partial object is still functioning
+ self.assertEqual(_foo(), 20)
+
+ def foo(a, b, c):
+ return a, b, c
+ _foo = partial(partial(foo, 1, b=20), b=30)
+ self.assertEqual(self.signature(_foo),
+ ((('b', 30, ..., "positional_or_keyword"),
+ ('c', ..., ..., "positional_or_keyword")),
+ ...))
+ self.assertEqual(_foo(c=10), (1, 30, 10))
+ _foo = partial(_foo, 2) # now 'b' has two values -
+ # positional and keyword
+ with self.assertRaisesRegex(ValueError, "has incorrect arguments"):
+ inspect.signature(_foo)
+
+ def foo(a, b, c, *, d):
+ return a, b, c, d
+ _foo = partial(partial(foo, d=20, c=20), b=10, d=30)
+ self.assertEqual(self.signature(_foo),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', 10, ..., "positional_or_keyword"),
+ ('c', 20, ..., "positional_or_keyword"),
+ ('d', 30, ..., "keyword_only")),
+ ...))
+ ba = inspect.signature(_foo).bind(a=200, b=11)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (200, 11, 20, 30))
+
+ def foo(a=1, b=2, c=3):
+ return a, b, c
+ _foo = partial(foo, a=10, c=13)
+ ba = inspect.signature(_foo).bind(11)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (11, 2, 13))
+ ba = inspect.signature(_foo).bind(11, 12)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (11, 12, 13))
+ ba = inspect.signature(_foo).bind(11, b=12)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (11, 12, 13))
+ ba = inspect.signature(_foo).bind(b=12)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (10, 12, 13))
+ _foo = partial(_foo, b=10)
+ ba = inspect.signature(_foo).bind(12, 14)
+ self.assertEqual(_foo(*ba.args, **ba.kwargs), (12, 14, 13))
+
+ def test_signature_on_decorated(self):
+ import functools
+
+ def decorator(func):
+ @functools.wraps(func)
+ def wrapper(*args, **kwargs) -> int:
+ return func(*args, **kwargs)
+ return wrapper
+
+ class Foo:
+ @decorator
+ def bar(self, a, b):
+ pass
+
+ self.assertEqual(self.signature(Foo.bar),
+ ((('self', ..., ..., "positional_or_keyword"),
+ ('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., ..., "positional_or_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(Foo().bar),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., ..., "positional_or_keyword")),
+ ...))
+
+ # Test that we handle method wrappers correctly
+ def decorator(func):
+ @functools.wraps(func)
+ def wrapper(*args, **kwargs) -> int:
+ return func(42, *args, **kwargs)
+ sig = inspect.signature(func)
+ new_params = tuple(sig.parameters.values())[1:]
+ wrapper.__signature__ = sig.replace(parameters=new_params)
+ return wrapper
+
+ class Foo:
+ @decorator
+ def __call__(self, a, b):
+ pass
+
+ self.assertEqual(self.signature(Foo.__call__),
+ ((('a', ..., ..., "positional_or_keyword"),
+ ('b', ..., ..., "positional_or_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(Foo().__call__),
+ ((('b', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ def test_signature_on_class(self):
+ class C:
+ def __init__(self, a):
+ pass
+
+ self.assertEqual(self.signature(C),
+ ((('a', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ class CM(type):
+ def __call__(cls, a):
+ pass
+ class C(metaclass=CM):
+ def __init__(self, b):
+ pass
+
+ self.assertEqual(self.signature(C),
+ ((('a', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ class CM(type):
+ def __new__(mcls, name, bases, dct, *, foo=1):
+ return super().__new__(mcls, name, bases, dct)
+ class C(metaclass=CM):
+ def __init__(self, b):
+ pass
+
+ self.assertEqual(self.signature(C),
+ ((('b', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ self.assertEqual(self.signature(CM),
+ ((('name', ..., ..., "positional_or_keyword"),
+ ('bases', ..., ..., "positional_or_keyword"),
+ ('dct', ..., ..., "positional_or_keyword"),
+ ('foo', 1, ..., "keyword_only")),
+ ...))
+
+ class CMM(type):
+ def __new__(mcls, name, bases, dct, *, foo=1):
+ return super().__new__(mcls, name, bases, dct)
+ def __call__(cls, nm, bs, dt):
+ return type(nm, bs, dt)
+ class CM(type, metaclass=CMM):
+ def __new__(mcls, name, bases, dct, *, bar=2):
+ return super().__new__(mcls, name, bases, dct)
+ class C(metaclass=CM):
+ def __init__(self, b):
+ pass
+
+ self.assertEqual(self.signature(CMM),
+ ((('name', ..., ..., "positional_or_keyword"),
+ ('bases', ..., ..., "positional_or_keyword"),
+ ('dct', ..., ..., "positional_or_keyword"),
+ ('foo', 1, ..., "keyword_only")),
+ ...))
+
+ self.assertEqual(self.signature(CM),
+ ((('nm', ..., ..., "positional_or_keyword"),
+ ('bs', ..., ..., "positional_or_keyword"),
+ ('dt', ..., ..., "positional_or_keyword")),
+ ...))
+
+ self.assertEqual(self.signature(C),
+ ((('b', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ class CM(type):
+ def __init__(cls, name, bases, dct, *, bar=2):
+ return super().__init__(name, bases, dct)
+ class C(metaclass=CM):
+ def __init__(self, b):
+ pass
+
+ self.assertEqual(self.signature(CM),
+ ((('name', ..., ..., "positional_or_keyword"),
+ ('bases', ..., ..., "positional_or_keyword"),
+ ('dct', ..., ..., "positional_or_keyword"),
+ ('bar', 2, ..., "keyword_only")),
+ ...))
+
+ def test_signature_on_callable_objects(self):
+ class Foo:
+ def __call__(self, a):
+ pass
+
+ self.assertEqual(self.signature(Foo()),
+ ((('a', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ class Spam:
+ pass
+ with self.assertRaisesRegex(TypeError, "is not a callable object"):
+ inspect.signature(Spam())
+
+ class Bar(Spam, Foo):
+ pass
+
+ self.assertEqual(self.signature(Bar()),
+ ((('a', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ class ToFail:
+ __call__ = type
+ with self.assertRaisesRegex(ValueError, "not supported by signature"):
+ inspect.signature(ToFail())
+
+
+ class Wrapped:
+ pass
+ Wrapped.__wrapped__ = lambda a: None
+ self.assertEqual(self.signature(Wrapped),
+ ((('a', ..., ..., "positional_or_keyword"),),
+ ...))
+
+ def test_signature_on_lambdas(self):
+ self.assertEqual(self.signature((lambda a=10: a)),
+ ((('a', 10, ..., "positional_or_keyword"),),
+ ...))
+
+ def test_signature_equality(self):
+ def foo(a, *, b:int) -> float: pass
+ self.assertNotEqual(inspect.signature(foo), 42)
+
+ def bar(a, *, b:int) -> float: pass
+ self.assertEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def bar(a, *, b:int) -> int: pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def bar(a, *, b:int): pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def bar(a, *, b:int=42) -> float: pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def bar(a, *, c) -> float: pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def bar(a, b:int) -> float: pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+ def spam(b:int, a) -> float: pass
+ self.assertNotEqual(inspect.signature(spam), inspect.signature(bar))
+
+ def foo(*, a, b, c): pass
+ def bar(*, c, b, a): pass
+ self.assertEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def foo(*, a=1, b, c): pass
+ def bar(*, c, b, a=1): pass
+ self.assertEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def foo(pos, *, a=1, b, c): pass
+ def bar(pos, *, c, b, a=1): pass
+ self.assertEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def foo(pos, *, a, b, c): pass
+ def bar(pos, *, c, b, a=1): pass
+ self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def foo(pos, *args, a=42, b, c, **kwargs:int): pass
+ def bar(pos, *args, c, b, a=42, **kwargs:int): pass
+ self.assertEqual(inspect.signature(foo), inspect.signature(bar))
+
+ def test_signature_unhashable(self):
+ def foo(a): pass
+ sig = inspect.signature(foo)
+ with self.assertRaisesRegex(TypeError, 'unhashable type'):
+ hash(sig)
+
+ def test_signature_str(self):
+ def foo(a:int=1, *, b, c=None, **kwargs) -> 42:
+ pass
+ self.assertEqual(str(inspect.signature(foo)),
+ '(a:int=1, *, b, c=None, **kwargs) -> 42')
+
+ def foo(a:int=1, *args, b, c=None, **kwargs) -> 42:
+ pass
+ self.assertEqual(str(inspect.signature(foo)),
+ '(a:int=1, *args, b, c=None, **kwargs) -> 42')
+
+ def foo():
+ pass
+ self.assertEqual(str(inspect.signature(foo)), '()')
+
+ def test_signature_str_positional_only(self):
+ P = inspect.Parameter
+
+ def test(a_po, *, b, **kwargs):
+ return a_po, kwargs
+
+ sig = inspect.signature(test)
+ new_params = list(sig.parameters.values())
+ new_params[0] = new_params[0].replace(kind=P.POSITIONAL_ONLY)
+ test.__signature__ = sig.replace(parameters=new_params)
+
+ self.assertEqual(str(inspect.signature(test)),
+ '(<a_po>, *, b, **kwargs)')
+
+ sig = inspect.signature(test)
+ new_params = list(sig.parameters.values())
+ new_params[0] = new_params[0].replace(name=None)
+ test.__signature__ = sig.replace(parameters=new_params)
+ self.assertEqual(str(inspect.signature(test)),
+ '(<0>, *, b, **kwargs)')
+
+ def test_signature_replace_anno(self):
+ def test() -> 42:
+ pass
+
+ sig = inspect.signature(test)
+ sig = sig.replace(return_annotation=None)
+ self.assertIs(sig.return_annotation, None)
+ sig = sig.replace(return_annotation=sig.empty)
+ self.assertIs(sig.return_annotation, sig.empty)
+ sig = sig.replace(return_annotation=42)
+ self.assertEqual(sig.return_annotation, 42)
+ self.assertEqual(sig, inspect.signature(test))
+
+
+class TestParameterObject(unittest.TestCase):
+ def test_signature_parameter_kinds(self):
+ P = inspect.Parameter
+ self.assertTrue(P.POSITIONAL_ONLY < P.POSITIONAL_OR_KEYWORD < \
+ P.VAR_POSITIONAL < P.KEYWORD_ONLY < P.VAR_KEYWORD)
+
+ self.assertEqual(str(P.POSITIONAL_ONLY), 'POSITIONAL_ONLY')
+ self.assertTrue('POSITIONAL_ONLY' in repr(P.POSITIONAL_ONLY))
+
+ def test_signature_parameter_object(self):
+ p = inspect.Parameter('foo', default=10,
+ kind=inspect.Parameter.POSITIONAL_ONLY)
+ self.assertEqual(p.name, 'foo')
+ self.assertEqual(p.default, 10)
+ self.assertIs(p.annotation, p.empty)
+ self.assertEqual(p.kind, inspect.Parameter.POSITIONAL_ONLY)
+
+ with self.assertRaisesRegex(ValueError, 'invalid value'):
+ inspect.Parameter('foo', default=10, kind='123')
+
+ with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
+ inspect.Parameter('1', kind=inspect.Parameter.VAR_KEYWORD)
+
+ with self.assertRaisesRegex(ValueError,
+ 'non-positional-only parameter'):
+ inspect.Parameter(None, kind=inspect.Parameter.VAR_KEYWORD)
+
+ with self.assertRaisesRegex(ValueError, 'cannot have default values'):
+ inspect.Parameter('a', default=42,
+ kind=inspect.Parameter.VAR_KEYWORD)
+
+ with self.assertRaisesRegex(ValueError, 'cannot have default values'):
+ inspect.Parameter('a', default=42,
+ kind=inspect.Parameter.VAR_POSITIONAL)
+
+ p = inspect.Parameter('a', default=42,
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD)
+ with self.assertRaisesRegex(ValueError, 'cannot have default values'):
+ p.replace(kind=inspect.Parameter.VAR_POSITIONAL)
+
+ self.assertTrue(repr(p).startswith('<Parameter'))
+
+ def test_signature_parameter_equality(self):
+ P = inspect.Parameter
+ p = P('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY)
+
+ self.assertEqual(p, p)
+ self.assertNotEqual(p, 42)
+
+ self.assertEqual(p, P('foo', default=42,
+ kind=inspect.Parameter.KEYWORD_ONLY))
+
+ def test_signature_parameter_unhashable(self):
+ p = inspect.Parameter('foo', default=42,
+ kind=inspect.Parameter.KEYWORD_ONLY)
+
+ with self.assertRaisesRegex(TypeError, 'unhashable type'):
+ hash(p)
+
+ def test_signature_parameter_replace(self):
+ p = inspect.Parameter('foo', default=42,
+ kind=inspect.Parameter.KEYWORD_ONLY)
+
+ self.assertIsNot(p, p.replace())
+ self.assertEqual(p, p.replace())
+
+ p2 = p.replace(annotation=1)
+ self.assertEqual(p2.annotation, 1)
+ p2 = p2.replace(annotation=p2.empty)
+ self.assertEqual(p, p2)
+
+ p2 = p2.replace(name='bar')
+ self.assertEqual(p2.name, 'bar')
+ self.assertNotEqual(p2, p)
+
+ with self.assertRaisesRegex(ValueError, 'not a valid parameter name'):
+ p2 = p2.replace(name=p2.empty)
+
+ p2 = p2.replace(name='foo', default=None)
+ self.assertIs(p2.default, None)
+ self.assertNotEqual(p2, p)
+
+ p2 = p2.replace(name='foo', default=p2.empty)
+ self.assertIs(p2.default, p2.empty)
+
+
+ p2 = p2.replace(default=42, kind=p2.POSITIONAL_OR_KEYWORD)
+ self.assertEqual(p2.kind, p2.POSITIONAL_OR_KEYWORD)
+ self.assertNotEqual(p2, p)
+
+ with self.assertRaisesRegex(ValueError, 'invalid value for'):
+ p2 = p2.replace(kind=p2.empty)
+
+ p2 = p2.replace(kind=p2.KEYWORD_ONLY)
+ self.assertEqual(p2, p)
+
+ def test_signature_parameter_positional_only(self):
+ p = inspect.Parameter(None, kind=inspect.Parameter.POSITIONAL_ONLY)
+ self.assertEqual(str(p), '<>')
+
+ p = p.replace(name='1')
+ self.assertEqual(str(p), '<1>')
+
+ def test_signature_parameter_immutability(self):
+ p = inspect.Parameter(None, kind=inspect.Parameter.POSITIONAL_ONLY)
+
+ with self.assertRaises(AttributeError):
+ p.foo = 'bar'
+
+ with self.assertRaises(AttributeError):
+ p.kind = 123
+
+
+class TestSignatureBind(unittest.TestCase):
+ @staticmethod
+ def call(func, *args, **kwargs):
+ sig = inspect.signature(func)
+ ba = sig.bind(*args, **kwargs)
+ return func(*ba.args, **ba.kwargs)
+
+ def test_signature_bind_empty(self):
+ def test():
+ return 42
+
+ self.assertEqual(self.call(test), 42)
+ with self.assertRaisesRegex(TypeError, 'too many positional arguments'):
+ self.call(test, 1)
+ with self.assertRaisesRegex(TypeError, 'too many positional arguments'):
+ self.call(test, 1, spam=10)
+ with self.assertRaisesRegex(TypeError, 'too many keyword arguments'):
+ self.call(test, spam=1)
+
+ def test_signature_bind_var(self):
+ def test(*args, **kwargs):
+ return args, kwargs
+
+ self.assertEqual(self.call(test), ((), {}))
+ self.assertEqual(self.call(test, 1), ((1,), {}))
+ self.assertEqual(self.call(test, 1, 2), ((1, 2), {}))
+ self.assertEqual(self.call(test, foo='bar'), ((), {'foo': 'bar'}))
+ self.assertEqual(self.call(test, 1, foo='bar'), ((1,), {'foo': 'bar'}))
+ self.assertEqual(self.call(test, args=10), ((), {'args': 10}))
+ self.assertEqual(self.call(test, 1, 2, foo='bar'),
+ ((1, 2), {'foo': 'bar'}))
+
+ def test_signature_bind_just_args(self):
+ def test(a, b, c):
+ return a, b, c
+
+ self.assertEqual(self.call(test, 1, 2, 3), (1, 2, 3))
+
+ with self.assertRaisesRegex(TypeError, 'too many positional arguments'):
+ self.call(test, 1, 2, 3, 4)
+
+ with self.assertRaisesRegex(TypeError, "'b' parameter lacking default"):
+ self.call(test, 1)
+
+ with self.assertRaisesRegex(TypeError, "'a' parameter lacking default"):
+ self.call(test)
+
+ def test(a, b, c=10):
+ return a, b, c
+ self.assertEqual(self.call(test, 1, 2, 3), (1, 2, 3))
+ self.assertEqual(self.call(test, 1, 2), (1, 2, 10))
+
+ def test(a=1, b=2, c=3):
+ return a, b, c
+ self.assertEqual(self.call(test, a=10, c=13), (10, 2, 13))
+ self.assertEqual(self.call(test, a=10), (10, 2, 3))
+ self.assertEqual(self.call(test, b=10), (1, 10, 3))
+
+ def test_signature_bind_varargs_order(self):
+ def test(*args):
+ return args
+
+ self.assertEqual(self.call(test), ())
+ self.assertEqual(self.call(test, 1, 2, 3), (1, 2, 3))
+
+ def test_signature_bind_args_and_varargs(self):
+ def test(a, b, c=3, *args):
+ return a, b, c, args
+
+ self.assertEqual(self.call(test, 1, 2, 3, 4, 5), (1, 2, 3, (4, 5)))
+ self.assertEqual(self.call(test, 1, 2), (1, 2, 3, ()))
+ self.assertEqual(self.call(test, b=1, a=2), (2, 1, 3, ()))
+ self.assertEqual(self.call(test, 1, b=2), (1, 2, 3, ()))
+
+ with self.assertRaisesRegex(TypeError,
+ "multiple values for argument 'c'"):
+ self.call(test, 1, 2, 3, c=4)
+
+ def test_signature_bind_just_kwargs(self):
+ def test(**kwargs):
+ return kwargs
+
+ self.assertEqual(self.call(test), {})
+ self.assertEqual(self.call(test, foo='bar', spam='ham'),
+ {'foo': 'bar', 'spam': 'ham'})
+
+ def test_signature_bind_args_and_kwargs(self):
+ def test(a, b, c=3, **kwargs):
+ return a, b, c, kwargs
+
+ self.assertEqual(self.call(test, 1, 2), (1, 2, 3, {}))
+ self.assertEqual(self.call(test, 1, 2, foo='bar', spam='ham'),
+ (1, 2, 3, {'foo': 'bar', 'spam': 'ham'}))
+ self.assertEqual(self.call(test, b=2, a=1, foo='bar', spam='ham'),
+ (1, 2, 3, {'foo': 'bar', 'spam': 'ham'}))
+ self.assertEqual(self.call(test, a=1, b=2, foo='bar', spam='ham'),
+ (1, 2, 3, {'foo': 'bar', 'spam': 'ham'}))
+ self.assertEqual(self.call(test, 1, b=2, foo='bar', spam='ham'),
+ (1, 2, 3, {'foo': 'bar', 'spam': 'ham'}))
+ self.assertEqual(self.call(test, 1, b=2, c=4, foo='bar', spam='ham'),
+ (1, 2, 4, {'foo': 'bar', 'spam': 'ham'}))
+ self.assertEqual(self.call(test, 1, 2, 4, foo='bar'),
+ (1, 2, 4, {'foo': 'bar'}))
+ self.assertEqual(self.call(test, c=5, a=4, b=3),
+ (4, 3, 5, {}))
+
+ def test_signature_bind_kwonly(self):
+ def test(*, foo):
+ return foo
+ with self.assertRaisesRegex(TypeError,
+ 'too many positional arguments'):
+ self.call(test, 1)
+ self.assertEqual(self.call(test, foo=1), 1)
+
+ def test(a, *, foo=1, bar):
+ return foo
+ with self.assertRaisesRegex(TypeError,
+ "'bar' parameter lacking default value"):
+ self.call(test, 1)
+
+ def test(foo, *, bar):
+ return foo, bar
+ self.assertEqual(self.call(test, 1, bar=2), (1, 2))
+ self.assertEqual(self.call(test, bar=2, foo=1), (1, 2))
+
+ with self.assertRaisesRegex(TypeError,
+ 'too many keyword arguments'):
+ self.call(test, bar=2, foo=1, spam=10)
+
+ with self.assertRaisesRegex(TypeError,
+ 'too many positional arguments'):
+ self.call(test, 1, 2)
+
+ with self.assertRaisesRegex(TypeError,
+ 'too many positional arguments'):
+ self.call(test, 1, 2, bar=2)
+
+ with self.assertRaisesRegex(TypeError,
+ 'too many keyword arguments'):
+ self.call(test, 1, bar=2, spam='ham')
+
+ with self.assertRaisesRegex(TypeError,
+ "'bar' parameter lacking default value"):
+ self.call(test, 1)
+
+ def test(foo, *, bar, **bin):
+ return foo, bar, bin
+ self.assertEqual(self.call(test, 1, bar=2), (1, 2, {}))
+ self.assertEqual(self.call(test, foo=1, bar=2), (1, 2, {}))
+ self.assertEqual(self.call(test, 1, bar=2, spam='ham'),
+ (1, 2, {'spam': 'ham'}))
+ self.assertEqual(self.call(test, spam='ham', foo=1, bar=2),
+ (1, 2, {'spam': 'ham'}))
+ with self.assertRaisesRegex(TypeError,
+ "'foo' parameter lacking default value"):
+ self.call(test, spam='ham', bar=2)
+ self.assertEqual(self.call(test, 1, bar=2, bin=1, spam=10),
+ (1, 2, {'bin': 1, 'spam': 10}))
+
+ def test_signature_bind_arguments(self):
+ def test(a, *args, b, z=100, **kwargs):
+ pass
+ sig = inspect.signature(test)
+ ba = sig.bind(10, 20, b=30, c=40, args=50, kwargs=60)
+ # we won't have 'z' argument in the bound arguments object, as we didn't
+ # pass it to the 'bind'
+ self.assertEqual(tuple(ba.arguments.items()),
+ (('a', 10), ('args', (20,)), ('b', 30),
+ ('kwargs', {'c': 40, 'args': 50, 'kwargs': 60})))
+ self.assertEqual(ba.kwargs,
+ {'b': 30, 'c': 40, 'args': 50, 'kwargs': 60})
+ self.assertEqual(ba.args, (10, 20))
+
+ def test_signature_bind_positional_only(self):
+ P = inspect.Parameter
+
+ def test(a_po, b_po, c_po=3, foo=42, *, bar=50, **kwargs):
+ return a_po, b_po, c_po, foo, bar, kwargs
+
+ sig = inspect.signature(test)
+ new_params = collections.OrderedDict(tuple(sig.parameters.items()))
+ for name in ('a_po', 'b_po', 'c_po'):
+ new_params[name] = new_params[name].replace(kind=P.POSITIONAL_ONLY)
+ new_sig = sig.replace(parameters=new_params.values())
+ test.__signature__ = new_sig
+
+ self.assertEqual(self.call(test, 1, 2, 4, 5, bar=6),
+ (1, 2, 4, 5, 6, {}))
+
+ with self.assertRaisesRegex(TypeError, "parameter is positional only"):
+ self.call(test, 1, 2, c_po=4)
+
+ with self.assertRaisesRegex(TypeError, "parameter is positional only"):
+ self.call(test, a_po=1, b_po=2)
+
+
+class TestBoundArguments(unittest.TestCase):
+ def test_signature_bound_arguments_unhashable(self):
+ def foo(a): pass
+ ba = inspect.signature(foo).bind(1)
+
+ with self.assertRaisesRegex(TypeError, 'unhashable type'):
+ hash(ba)
+
+ def test_signature_bound_arguments_equality(self):
+ def foo(a): pass
+ ba = inspect.signature(foo).bind(1)
+ self.assertEqual(ba, ba)
+
+ ba2 = inspect.signature(foo).bind(1)
+ self.assertEqual(ba, ba2)
+
+ ba3 = inspect.signature(foo).bind(2)
+ self.assertNotEqual(ba, ba3)
+ ba3.arguments['a'] = 1
+ self.assertEqual(ba, ba3)
+
+ def bar(b): pass
+ ba4 = inspect.signature(bar).bind(1)
+ self.assertNotEqual(ba, ba4)
+
def test_main():
run_unittest(
@@ -1176,7 +2274,8 @@ def test_main():
TestInterpreterStack, TestClassesAndFunctions, TestPredicates,
TestGetcallargsFunctions, TestGetcallargsMethods,
TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState,
- TestNoEOL
+ TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject,
+ TestBoundArguments, TestGetClosureVars
)
if __name__ == "__main__":
diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py
index 437e323..227759f 100644
--- a/Lib/test/test_int.py
+++ b/Lib/test/test_int.py
@@ -305,6 +305,18 @@ class IntTestCases(unittest.TestCase):
self.fail("Failed to raise TypeError with %s" %
((base, trunc_result_base),))
+ # Regression test for bugs.python.org/issue16060.
+ class BadInt(trunc_result_base):
+ def __int__(self):
+ return 42.0
+
+ class TruncReturnsBadInt(base):
+ def __trunc__(self):
+ return BadInt()
+
+ with self.assertRaises(TypeError):
+ int(TruncReturnsBadInt())
+
def test_error_message(self):
testlist = ('\xbd', '123\xbd', ' 123 456 ')
for s in testlist:
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 56ac2c8..555ad74 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -19,20 +19,21 @@
# test both implementations. This file has lots of examples.
################################################################################
+import abc
+import array
+import errno
+import locale
import os
+import pickle
+import random
+import signal
import sys
import time
-import array
-import random
import unittest
-import weakref
-import abc
-import signal
-import errno
import warnings
-import pickle
-from itertools import cycle, count
+import weakref
from collections import deque, UserList
+from itertools import cycle, count
from test import support
import codecs
@@ -49,7 +50,7 @@ except ImportError:
def _default_chunk_size():
"""Get the default TextIOWrapper chunk size"""
- with open(__file__, "r", encoding="latin1") as f:
+ with open(__file__, "r", encoding="latin-1") as f:
return f._CHUNK_SIZE
@@ -634,6 +635,15 @@ class IOTest(unittest.TestCase):
for obj in test:
self.assertTrue(hasattr(obj, "__dict__"))
+ def test_opener(self):
+ with self.open(support.TESTFN, "w") as f:
+ f.write("egg\n")
+ fd = os.open(support.TESTFN, os.O_RDONLY)
+ def opener(path, flags):
+ return fd
+ with self.open("non-existent", "r", opener=opener) as f:
+ self.assertEqual(f.read(), "egg\n")
+
def test_fileio_closefd(self):
# Issue #4841
with self.open(__file__, 'rb') as f1, \
@@ -696,7 +706,7 @@ class CommonBufferedTests:
bufio = self.tp(rawio)
# Invalid whence
self.assertRaises(ValueError, bufio.seek, 0, -1)
- self.assertRaises(ValueError, bufio.seek, 0, 3)
+ self.assertRaises(ValueError, bufio.seek, 0, 9)
def test_override_destructor(self):
tp = self.tp
@@ -862,6 +872,12 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
self.assertEqual(b, b"gf")
self.assertEqual(bufio.readinto(b), 0)
self.assertEqual(b, b"gf")
+ rawio = self.MockRawIO((b"abc", None))
+ bufio = self.tp(rawio)
+ self.assertEqual(bufio.readinto(b), 2)
+ self.assertEqual(b, b"ab")
+ self.assertEqual(bufio.readinto(b), 1)
+ self.assertEqual(b, b"cb")
def test_readlines(self):
def bufio():
@@ -1276,9 +1292,8 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
self.assertRaises(IOError, bufio.tell)
self.assertRaises(IOError, bufio.write, b"abcdef")
- def test_max_buffer_size_deprecation(self):
- with support.check_warnings(("max_buffer_size is deprecated",
- DeprecationWarning)):
+ def test_max_buffer_size_removal(self):
+ with self.assertRaises(TypeError):
self.tp(self.MockRawIO(), 8, 12)
@@ -1334,9 +1349,8 @@ class BufferedRWPairTest(unittest.TestCase):
pair = self.tp(self.MockRawIO(), self.MockRawIO())
self.assertRaises(self.UnsupportedOperation, pair.detach)
- def test_constructor_max_buffer_size_deprecation(self):
- with support.check_warnings(("max_buffer_size is deprecated",
- DeprecationWarning)):
+ def test_constructor_max_buffer_size_removal(self):
+ with self.assertRaises(TypeError):
self.tp(self.MockRawIO(), self.MockRawIO(), 8, 12)
def test_constructor_with_not_readable(self):
@@ -1852,11 +1866,11 @@ class TextIOWrapperTest(unittest.TestCase):
r = self.BytesIO(b"\xc3\xa9\n\n")
b = self.BufferedReader(r, 1000)
t = self.TextIOWrapper(b)
- t.__init__(b, encoding="latin1", newline="\r\n")
- self.assertEqual(t.encoding, "latin1")
+ t.__init__(b, encoding="latin-1", newline="\r\n")
+ self.assertEqual(t.encoding, "latin-1")
self.assertEqual(t.line_buffering, False)
- t.__init__(b, encoding="utf8", line_buffering=True)
- self.assertEqual(t.encoding, "utf8")
+ t.__init__(b, encoding="utf-8", line_buffering=True)
+ self.assertEqual(t.encoding, "utf-8")
self.assertEqual(t.line_buffering, True)
self.assertEqual("\xe9\n", t.readline())
self.assertRaises(TypeError, t.__init__, b, newline=42)
@@ -1903,11 +1917,29 @@ class TextIOWrapperTest(unittest.TestCase):
t.write("A\rB")
self.assertEqual(r.getvalue(), b"XY\nZA\rB")
+ def test_default_encoding(self):
+ old_environ = dict(os.environ)
+ try:
+ # try to get a user preferred encoding different than the current
+ # locale encoding to check that TextIOWrapper() uses the current
+ # locale encoding and not the user preferred encoding
+ for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
+ if key in os.environ:
+ del os.environ[key]
+
+ current_locale_encoding = locale.getpreferredencoding(False)
+ b = self.BytesIO()
+ t = self.TextIOWrapper(b)
+ self.assertEqual(t.encoding, current_locale_encoding)
+ finally:
+ os.environ.clear()
+ os.environ.update(old_environ)
+
def test_encoding(self):
# Check the encoding attribute is always set, and valid
b = self.BytesIO()
- t = self.TextIOWrapper(b, encoding="utf8")
- self.assertEqual(t.encoding, "utf8")
+ t = self.TextIOWrapper(b, encoding="utf-8")
+ self.assertEqual(t.encoding, "utf-8")
t = self.TextIOWrapper(b)
self.assertTrue(t.encoding is not None)
codecs.lookup(t.encoding)
@@ -2000,8 +2032,8 @@ class TextIOWrapperTest(unittest.TestCase):
testdata = b"AAA\nBB\x00B\nCCC\rDDD\rEEE\r\nFFF\r\nGGG"
normalized = testdata.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
for newline, expected in [
- (None, normalized.decode("ascii").splitlines(True)),
- ("", testdata.decode("ascii").splitlines(True)),
+ (None, normalized.decode("ascii").splitlines(keepends=True)),
+ ("", testdata.decode("ascii").splitlines(keepends=True)),
("\n", ["AAA\n", "BB\x00B\n", "CCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
("\r\n", ["AAA\nBB\x00B\nCCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
("\r", ["AAA\nBB\x00B\nCCC\r", "DDD\r", "EEE\r", "\nFFF\r", "\nGGG"]),
@@ -2086,7 +2118,7 @@ class TextIOWrapperTest(unittest.TestCase):
def test_basic_io(self):
for chunksize in (1, 2, 3, 4, 5, 15, 16, 17, 31, 32, 33, 63, 64, 65):
- for enc in "ascii", "latin1", "utf8" :# , "utf-16-be", "utf-16-le":
+ for enc in "ascii", "latin-1", "utf-8" :# , "utf-16-be", "utf-16-le":
f = self.open(support.TESTFN, "w+", encoding=enc)
f._CHUNK_SIZE = chunksize
self.assertEqual(f.write("abc"), 3)
@@ -2136,7 +2168,7 @@ class TextIOWrapperTest(unittest.TestCase):
self.assertEqual(rlines, wlines)
def test_telling(self):
- f = self.open(support.TESTFN, "w+", encoding="utf8")
+ f = self.open(support.TESTFN, "w+", encoding="utf-8")
p0 = f.tell()
f.write("\xff\n")
p1 = f.tell()
@@ -2404,6 +2436,7 @@ class TextIOWrapperTest(unittest.TestCase):
with self.open(support.TESTFN, "w", errors="replace") as f:
self.assertEqual(f.errors, "replace")
+ @support.no_tracing
@unittest.skipUnless(threading, 'Threading required for this test.')
def test_threads_write(self):
# Issue6750: concurrent writes could duplicate data
@@ -2721,12 +2754,6 @@ class MiscIOTest(unittest.TestCase):
def test_blockingioerror(self):
# Various BlockingIOError issues
- self.assertRaises(TypeError, self.BlockingIOError)
- self.assertRaises(TypeError, self.BlockingIOError, 1)
- self.assertRaises(TypeError, self.BlockingIOError, 1, 2, 3, 4)
- self.assertRaises(TypeError, self.BlockingIOError, 1, "", None)
- b = self.BlockingIOError(1, "")
- self.assertEqual(b.characters_written, 0)
class C(str):
pass
c = C("")
@@ -2868,6 +2895,7 @@ class MiscIOTest(unittest.TestCase):
except self.BlockingIOError as e:
self.assertEqual(e.args[0], errno.EAGAIN)
+ self.assertEqual(e.args[2], e.characters_written)
sent[-1] = sent[-1][:e.characters_written]
received.append(rf.read())
msg = b'BLOCKED'
@@ -2880,6 +2908,7 @@ class MiscIOTest(unittest.TestCase):
break
except self.BlockingIOError as e:
self.assertEqual(e.args[0], errno.EAGAIN)
+ self.assertEqual(e.args[2], e.characters_written)
self.assertEqual(e.characters_written, 0)
received.append(rf.read())
@@ -2890,6 +2919,24 @@ class MiscIOTest(unittest.TestCase):
self.assertTrue(wf.closed)
self.assertTrue(rf.closed)
+ def test_create_fail(self):
+ # 'x' mode fails if file is existing
+ with self.open(support.TESTFN, 'w'):
+ pass
+ self.assertRaises(FileExistsError, self.open, support.TESTFN, 'x')
+
+ def test_create_writes(self):
+ # 'x' mode opens for writing
+ with self.open(support.TESTFN, 'xb') as f:
+ f.write(b"spam")
+ with self.open(support.TESTFN, 'rb') as f:
+ self.assertEqual(b"spam", f.read())
+
+ def test_open_allargs(self):
+ # there used to be a buffer overflow in the parser for rawmode
+ self.assertRaises(ValueError, self.open, support.TESTFN, 'rwax+')
+
+
class CMiscIOTest(MiscIOTest):
io = io
@@ -2910,14 +2957,14 @@ class SignalsTest(unittest.TestCase):
1/0
@unittest.skipUnless(threading, 'Threading required for this test.')
- @unittest.skipIf(sys.platform in ('freebsd5', 'freebsd6', 'freebsd7'),
- 'issue #12429: skip test on FreeBSD <= 7')
def check_interrupted_write(self, item, bytes, **fdopen_kwargs):
"""Check that a partial write, when it gets interrupted, properly
invokes the signal handler, and bubbles up the exception raised
in the latter."""
read_results = []
def _read():
+ if hasattr(signal, 'pthread_sigmask'):
+ signal.pthread_sigmask(signal.SIG_BLOCK, [signal.SIGALRM])
s = os.read(r, 1)
read_results.append(s)
t = threading.Thread(target=_read)
@@ -2935,7 +2982,7 @@ class SignalsTest(unittest.TestCase):
# The buffered IO layer must check for pending signal
# handlers, which in this case will invoke alarm_interrupt().
self.assertRaises(ZeroDivisionError,
- wio.write, item * (1024 * 1024))
+ wio.write, item * (support.PIPE_MAX_SIZE // len(item)))
t.join()
# We got one byte, get another one and check that it isn't a
# repeat of the first one.
@@ -2962,6 +3009,7 @@ class SignalsTest(unittest.TestCase):
def test_interrupted_write_text(self):
self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii")
+ @support.no_tracing
def check_reentrant_write(self, data, **fdopen_kwargs):
def on_alarm(*args):
# Will be called reentrantly from the same thread
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
new file mode 100644
index 0000000..99c54f1
--- /dev/null
+++ b/Lib/test/test_ipaddress.py
@@ -0,0 +1,1649 @@
+# Copyright 2007 Google Inc.
+# Licensed to PSF under a Contributor Agreement.
+
+"""Unittest for ipaddress module."""
+
+
+import unittest
+import re
+import contextlib
+import operator
+import ipaddress
+
+class BaseTestCase(unittest.TestCase):
+ # One big change in ipaddress over the original ipaddr module is
+ # error reporting that tries to assume users *don't know the rules*
+ # for what constitutes an RFC compliant IP address
+
+ # Ensuring these errors are emitted correctly in all relevant cases
+ # meant moving to a more systematic test structure that allows the
+ # test structure to map more directly to the module structure
+
+ # Note that if the constructors are refactored so that addresses with
+ # multiple problems get classified differently, that's OK - just
+ # move the affected examples to the newly appropriate test case.
+
+ # There is some duplication between the original relatively ad hoc
+ # test suite and the new systematic tests. While some redundancy in
+ # testing is considered preferable to accidentally deleting a valid
+ # test, the original test suite will likely be reduced over time as
+ # redundant tests are identified.
+
+ @property
+ def factory(self):
+ raise NotImplementedError
+
+ @contextlib.contextmanager
+ def assertCleanError(self, exc_type, details, *args):
+ """
+ Ensure exception does not display a context by default
+
+ Wraps unittest.TestCase.assertRaisesRegex
+ """
+ if args:
+ details = details % args
+ cm = self.assertRaisesRegex(exc_type, details)
+ with cm as exc:
+ yield exc
+ # Ensure we produce clean tracebacks on failure
+ if exc.exception.__context__ is not None:
+ self.assertTrue(exc.exception.__suppress_context__)
+
+ def assertAddressError(self, details, *args):
+ """Ensure a clean AddressValueError"""
+ return self.assertCleanError(ipaddress.AddressValueError,
+ details, *args)
+
+ def assertNetmaskError(self, details, *args):
+ """Ensure a clean NetmaskValueError"""
+ return self.assertCleanError(ipaddress.NetmaskValueError,
+ details, *args)
+
+ def assertInstancesEqual(self, lhs, rhs):
+ """Check constructor arguments produce equivalent instances"""
+ self.assertEqual(self.factory(lhs), self.factory(rhs))
+
+class CommonTestMixin:
+
+ def test_empty_address(self):
+ with self.assertAddressError("Address cannot be empty"):
+ self.factory("")
+
+ def test_floats_rejected(self):
+ with self.assertAddressError(re.escape(repr("1.0"))):
+ self.factory(1.0)
+
+ def test_not_an_index_issue15559(self):
+ # Implementing __index__ makes for a very nasty interaction with the
+ # bytes constructor. Thus, we disallow implicit use as an integer
+ self.assertRaises(TypeError, operator.index, self.factory(1))
+ self.assertRaises(TypeError, hex, self.factory(1))
+ self.assertRaises(TypeError, bytes, self.factory(1))
+
+
+class CommonTestMixin_v4(CommonTestMixin):
+
+ def test_leading_zeros(self):
+ self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
+ self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
+
+ def test_int(self):
+ self.assertInstancesEqual(0, "0.0.0.0")
+ self.assertInstancesEqual(3232235521, "192.168.0.1")
+
+ def test_packed(self):
+ self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
+ self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
+
+ def test_negative_ints_rejected(self):
+ msg = "-1 (< 0) is not permitted as an IPv4 address"
+ with self.assertAddressError(re.escape(msg)):
+ self.factory(-1)
+
+ def test_large_ints_rejected(self):
+ msg = "%d (>= 2**32) is not permitted as an IPv4 address"
+ with self.assertAddressError(re.escape(msg % 2**32)):
+ self.factory(2**32)
+
+ def test_bad_packed_length(self):
+ def assertBadLength(length):
+ addr = bytes(length)
+ msg = "%r (len %d != 4) is not permitted as an IPv4 address"
+ with self.assertAddressError(re.escape(msg % (addr, length))):
+ self.factory(addr)
+
+ assertBadLength(3)
+ assertBadLength(5)
+
+class CommonTestMixin_v6(CommonTestMixin):
+
+ def test_leading_zeros(self):
+ self.assertInstancesEqual("0000::0000", "::")
+ self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
+
+ def test_int(self):
+ self.assertInstancesEqual(0, "::")
+ self.assertInstancesEqual(3232235521, "::c0a8:1")
+
+ def test_packed(self):
+ addr = bytes(12) + bytes.fromhex("00000000")
+ self.assertInstancesEqual(addr, "::")
+ addr = bytes(12) + bytes.fromhex("c0a80001")
+ self.assertInstancesEqual(addr, "::c0a8:1")
+ addr = bytes.fromhex("c0a80001") + bytes(12)
+ self.assertInstancesEqual(addr, "c0a8:1::")
+
+ def test_negative_ints_rejected(self):
+ msg = "-1 (< 0) is not permitted as an IPv6 address"
+ with self.assertAddressError(re.escape(msg)):
+ self.factory(-1)
+
+ def test_large_ints_rejected(self):
+ msg = "%d (>= 2**128) is not permitted as an IPv6 address"
+ with self.assertAddressError(re.escape(msg % 2**128)):
+ self.factory(2**128)
+
+ def test_bad_packed_length(self):
+ def assertBadLength(length):
+ addr = bytes(length)
+ msg = "%r (len %d != 16) is not permitted as an IPv6 address"
+ with self.assertAddressError(re.escape(msg % (addr, length))):
+ self.factory(addr)
+ self.factory(addr)
+
+ assertBadLength(15)
+ assertBadLength(17)
+
+
+class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
+ factory = ipaddress.IPv4Address
+
+ def test_network_passed_as_address(self):
+ addr = "127.0.0.1/24"
+ with self.assertAddressError("Unexpected '/' in %r", addr):
+ ipaddress.IPv4Address(addr)
+
+ def test_bad_address_split(self):
+ def assertBadSplit(addr):
+ with self.assertAddressError("Expected 4 octets in %r", addr):
+ ipaddress.IPv4Address(addr)
+
+ assertBadSplit("127.0.1")
+ assertBadSplit("42.42.42.42.42")
+ assertBadSplit("42.42.42")
+ assertBadSplit("42.42")
+ assertBadSplit("42")
+ assertBadSplit("42..42.42.42")
+ assertBadSplit("42.42.42.42.")
+ assertBadSplit("42.42.42.42...")
+ assertBadSplit(".42.42.42.42")
+ assertBadSplit("...42.42.42.42")
+ assertBadSplit("016.016.016")
+ assertBadSplit("016.016")
+ assertBadSplit("016")
+ assertBadSplit("000")
+ assertBadSplit("0x0a.0x0a.0x0a")
+ assertBadSplit("0x0a.0x0a")
+ assertBadSplit("0x0a")
+ assertBadSplit(".")
+ assertBadSplit("bogus")
+ assertBadSplit("bogus.com")
+ assertBadSplit("1000")
+ assertBadSplit("1000000000000000")
+ assertBadSplit("192.168.0.1.com")
+
+ def test_empty_octet(self):
+ def assertBadOctet(addr):
+ with self.assertAddressError("Empty octet not permitted in %r",
+ addr):
+ ipaddress.IPv4Address(addr)
+
+ assertBadOctet("42..42.42")
+ assertBadOctet("...")
+
+ def test_invalid_characters(self):
+ def assertBadOctet(addr, octet):
+ msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
+ with self.assertAddressError(re.escape(msg)):
+ ipaddress.IPv4Address(addr)
+
+ assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
+ assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
+ assertBadOctet("42.42.42.-0", "-0")
+ assertBadOctet("42.42.42.+0", "+0")
+ assertBadOctet("42.42.42.-42", "-42")
+ assertBadOctet("+1.+2.+3.4", "+1")
+ assertBadOctet("1.2.3.4e0", "4e0")
+ assertBadOctet("1.2.3.4::", "4::")
+ assertBadOctet("1.a.2.3", "a")
+
+ def test_octal_decimal_ambiguity(self):
+ def assertBadOctet(addr, octet):
+ msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
+ with self.assertAddressError(re.escape(msg % (octet, addr))):
+ ipaddress.IPv4Address(addr)
+
+ assertBadOctet("016.016.016.016", "016")
+ assertBadOctet("001.000.008.016", "008")
+
+ def test_octet_length(self):
+ def assertBadOctet(addr, octet):
+ msg = "At most 3 characters permitted in %r in %r"
+ with self.assertAddressError(re.escape(msg % (octet, addr))):
+ ipaddress.IPv4Address(addr)
+
+ assertBadOctet("0000.000.000.000", "0000")
+ assertBadOctet("12345.67899.-54321.-98765", "12345")
+
+ def test_octet_limit(self):
+ def assertBadOctet(addr, octet):
+ msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
+ with self.assertAddressError(re.escape(msg)):
+ ipaddress.IPv4Address(addr)
+
+ assertBadOctet("257.0.0.0", 257)
+ assertBadOctet("192.168.0.999", 999)
+
+
+class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
+ factory = ipaddress.IPv6Address
+
+ def test_network_passed_as_address(self):
+ addr = "::1/24"
+ with self.assertAddressError("Unexpected '/' in %r", addr):
+ ipaddress.IPv6Address(addr)
+
+ def test_bad_address_split_v6_not_enough_parts(self):
+ def assertBadSplit(addr):
+ msg = "At least 3 parts expected in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit(":")
+ assertBadSplit(":1")
+ assertBadSplit("FEDC:9878")
+
+ def test_bad_address_split_v6_too_many_colons(self):
+ def assertBadSplit(addr):
+ msg = "At most 8 colons permitted in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit("9:8:7:6:5:4:3::2:1")
+ assertBadSplit("10:9:8:7:6:5:4:3:2:1")
+ assertBadSplit("::8:7:6:5:4:3:2:1")
+ assertBadSplit("8:7:6:5:4:3:2:1::")
+ # A trailing IPv4 address is two parts
+ assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
+
+ def test_bad_address_split_v6_too_many_parts(self):
+ def assertBadSplit(addr):
+ msg = "Exactly 8 parts expected without '::' in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
+ assertBadSplit("9:8:7:6:5:4:3:2:1")
+ assertBadSplit("7:6:5:4:3:2:1")
+ # A trailing IPv4 address is two parts
+ assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
+ assertBadSplit("7:6:5:4:3:42.42.42.42")
+
+ def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
+ def assertBadSplit(addr):
+ msg = "Expected at most 7 other parts with '::' in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit("1:2:3:4::5:6:7:8")
+
+ def test_bad_address_split_v6_repeated_double_colon(self):
+ def assertBadSplit(addr):
+ msg = "At most one '::' permitted in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit("3ffe::1::1")
+ assertBadSplit("1::2::3::4:5")
+ assertBadSplit("2001::db:::1")
+ assertBadSplit("3ffe::1::")
+ assertBadSplit("::3ffe::1")
+ assertBadSplit(":3ffe::1::1")
+ assertBadSplit("3ffe::1::1:")
+ assertBadSplit(":3ffe::1::1:")
+ assertBadSplit(":::")
+ assertBadSplit('2001:db8:::1')
+
+ def test_bad_address_split_v6_leading_colon(self):
+ def assertBadSplit(addr):
+ msg = "Leading ':' only permitted as part of '::' in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit(":2001:db8::1")
+ assertBadSplit(":1:2:3:4:5:6:7")
+ assertBadSplit(":1:2:3:4:5:6:")
+ assertBadSplit(":6:5:4:3:2:1::")
+
+ def test_bad_address_split_v6_trailing_colon(self):
+ def assertBadSplit(addr):
+ msg = "Trailing ':' only permitted as part of '::' in %r"
+ with self.assertAddressError(msg, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadSplit("2001:db8::1:")
+ assertBadSplit("1:2:3:4:5:6:7:")
+ assertBadSplit("::1.2.3.4:")
+ assertBadSplit("::7:6:5:4:3:2:")
+
+ def test_bad_v4_part_in(self):
+ def assertBadAddressPart(addr, v4_error):
+ with self.assertAddressError("%s in %r", v4_error, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
+ assertBadAddressPart("3ffe::127.0.1",
+ "Expected 4 octets in '127.0.1'")
+ assertBadAddressPart("::1.2.3",
+ "Expected 4 octets in '1.2.3'")
+ assertBadAddressPart("::1.2.3.4.5",
+ "Expected 4 octets in '1.2.3.4.5'")
+ assertBadAddressPart("3ffe::1.1.1.net",
+ "Only decimal digits permitted in 'net' "
+ "in '1.1.1.net'")
+
+ def test_invalid_characters(self):
+ def assertBadPart(addr, part):
+ msg = "Only hex digits permitted in %r in %r" % (part, addr)
+ with self.assertAddressError(re.escape(msg)):
+ ipaddress.IPv6Address(addr)
+
+ assertBadPart("3ffe::goog", "goog")
+ assertBadPart("3ffe::-0", "-0")
+ assertBadPart("3ffe::+0", "+0")
+ assertBadPart("3ffe::-1", "-1")
+ assertBadPart("1.2.3.4::", "1.2.3.4")
+ assertBadPart('1234:axy::b', "axy")
+
+ def test_part_length(self):
+ def assertBadPart(addr, part):
+ msg = "At most 4 characters permitted in %r in %r"
+ with self.assertAddressError(msg, part, addr):
+ ipaddress.IPv6Address(addr)
+
+ assertBadPart("::00000", "00000")
+ assertBadPart("3ffe::10000", "10000")
+ assertBadPart("02001:db8::", "02001")
+ assertBadPart('2001:888888::1', "888888")
+
+
+class NetmaskTestMixin_v4(CommonTestMixin_v4):
+ """Input validation on interfaces and networks is very similar"""
+
+ def test_split_netmask(self):
+ addr = "1.2.3.4/32/24"
+ with self.assertAddressError("Only one '/' permitted in %r" % addr):
+ self.factory(addr)
+
+ def test_address_errors(self):
+ def assertBadAddress(addr, details):
+ with self.assertAddressError(details):
+ self.factory(addr)
+
+ assertBadAddress("/", "Address cannot be empty")
+ assertBadAddress("/8", "Address cannot be empty")
+ assertBadAddress("bogus", "Expected 4 octets")
+ assertBadAddress("google.com", "Expected 4 octets")
+ assertBadAddress("10/8", "Expected 4 octets")
+ assertBadAddress("::1.2.3.4", "Only decimal digits")
+ assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
+
+ def test_netmask_errors(self):
+ def assertBadNetmask(addr, netmask):
+ msg = "%r is not a valid netmask"
+ with self.assertNetmaskError(msg % netmask):
+ self.factory("%s/%s" % (addr, netmask))
+
+ assertBadNetmask("1.2.3.4", "")
+ assertBadNetmask("1.2.3.4", "33")
+ assertBadNetmask("1.2.3.4", "254.254.255.256")
+ assertBadNetmask("1.1.1.1", "254.xyz.2.3")
+ assertBadNetmask("1.1.1.1", "240.255.0.0")
+ assertBadNetmask("1.1.1.1", "pudding")
+
+class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
+ factory = ipaddress.IPv4Interface
+
+class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
+ factory = ipaddress.IPv4Network
+
+
+class NetmaskTestMixin_v6(CommonTestMixin_v6):
+ """Input validation on interfaces and networks is very similar"""
+
+ def test_split_netmask(self):
+ addr = "cafe:cafe::/128/190"
+ with self.assertAddressError("Only one '/' permitted in %r" % addr):
+ self.factory(addr)
+
+ def test_address_errors(self):
+ def assertBadAddress(addr, details):
+ with self.assertAddressError(details):
+ self.factory(addr)
+
+ assertBadAddress("/", "Address cannot be empty")
+ assertBadAddress("/8", "Address cannot be empty")
+ assertBadAddress("google.com", "At least 3 parts")
+ assertBadAddress("1.2.3.4", "At least 3 parts")
+ assertBadAddress("10/8", "At least 3 parts")
+ assertBadAddress("1234:axy::b", "Only hex digits")
+
+ def test_netmask_errors(self):
+ def assertBadNetmask(addr, netmask):
+ msg = "%r is not a valid netmask"
+ with self.assertNetmaskError(msg % netmask):
+ self.factory("%s/%s" % (addr, netmask))
+
+ assertBadNetmask("::1", "")
+ assertBadNetmask("::1", "::1")
+ assertBadNetmask("::1", "1::")
+ assertBadNetmask("::1", "129")
+ assertBadNetmask("::1", "pudding")
+
+class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
+ factory = ipaddress.IPv6Interface
+
+class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
+ factory = ipaddress.IPv6Network
+
+
+class FactoryFunctionErrors(BaseTestCase):
+
+ def assertFactoryError(self, factory, kind):
+ """Ensure a clean ValueError with the expected message"""
+ addr = "camelot"
+ msg = '%r does not appear to be an IPv4 or IPv6 %s'
+ with self.assertCleanError(ValueError, msg, addr, kind):
+ factory(addr)
+
+ def test_ip_address(self):
+ self.assertFactoryError(ipaddress.ip_address, "address")
+
+ def test_ip_interface(self):
+ self.assertFactoryError(ipaddress.ip_interface, "interface")
+
+ def test_ip_network(self):
+ self.assertFactoryError(ipaddress.ip_network, "network")
+
+
+class ComparisonTests(unittest.TestCase):
+
+ v4addr = ipaddress.IPv4Address(1)
+ v4net = ipaddress.IPv4Network(1)
+ v4intf = ipaddress.IPv4Interface(1)
+ v6addr = ipaddress.IPv6Address(1)
+ v6net = ipaddress.IPv6Network(1)
+ v6intf = ipaddress.IPv6Interface(1)
+
+ v4_addresses = [v4addr, v4intf]
+ v4_objects = v4_addresses + [v4net]
+ v6_addresses = [v6addr, v6intf]
+ v6_objects = v6_addresses + [v6net]
+ objects = v4_objects + v6_objects
+
+ def test_foreign_type_equality(self):
+ # __eq__ should never raise TypeError directly
+ other = object()
+ for obj in self.objects:
+ self.assertNotEqual(obj, other)
+ self.assertFalse(obj == other)
+ self.assertEqual(obj.__eq__(other), NotImplemented)
+ self.assertEqual(obj.__ne__(other), NotImplemented)
+
+ def test_mixed_type_equality(self):
+ # Ensure none of the internal objects accidentally
+ # expose the right set of attributes to become "equal"
+ for lhs in self.objects:
+ for rhs in self.objects:
+ if lhs is rhs:
+ continue
+ self.assertNotEqual(lhs, rhs)
+
+ def test_containment(self):
+ for obj in self.v4_addresses:
+ self.assertIn(obj, self.v4net)
+ for obj in self.v6_addresses:
+ self.assertIn(obj, self.v6net)
+ for obj in self.v4_objects + [self.v6net]:
+ self.assertNotIn(obj, self.v6net)
+ for obj in self.v6_objects + [self.v4net]:
+ self.assertNotIn(obj, self.v4net)
+
+ def test_mixed_type_ordering(self):
+ for lhs in self.objects:
+ for rhs in self.objects:
+ if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
+ continue
+ self.assertRaises(TypeError, lambda: lhs < rhs)
+ self.assertRaises(TypeError, lambda: lhs > rhs)
+ self.assertRaises(TypeError, lambda: lhs <= rhs)
+ self.assertRaises(TypeError, lambda: lhs >= rhs)
+
+ def test_mixed_type_key(self):
+ # with get_mixed_type_key, you can sort addresses and network.
+ v4_ordered = [self.v4addr, self.v4net, self.v4intf]
+ v6_ordered = [self.v6addr, self.v6net, self.v6intf]
+ self.assertEqual(v4_ordered,
+ sorted(self.v4_objects,
+ key=ipaddress.get_mixed_type_key))
+ self.assertEqual(v6_ordered,
+ sorted(self.v6_objects,
+ key=ipaddress.get_mixed_type_key))
+ self.assertEqual(v4_ordered + v6_ordered,
+ sorted(self.objects,
+ key=ipaddress.get_mixed_type_key))
+ self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
+
+ def test_incompatible_versions(self):
+ # These should always raise TypeError
+ v4addr = ipaddress.ip_address('1.1.1.1')
+ v4net = ipaddress.ip_network('1.1.1.1')
+ v6addr = ipaddress.ip_address('::1')
+ v6net = ipaddress.ip_address('::1')
+
+ self.assertRaises(TypeError, v4addr.__lt__, v6addr)
+ self.assertRaises(TypeError, v4addr.__gt__, v6addr)
+ self.assertRaises(TypeError, v4net.__lt__, v6net)
+ self.assertRaises(TypeError, v4net.__gt__, v6net)
+
+ self.assertRaises(TypeError, v6addr.__lt__, v4addr)
+ self.assertRaises(TypeError, v6addr.__gt__, v4addr)
+ self.assertRaises(TypeError, v6net.__lt__, v4net)
+ self.assertRaises(TypeError, v6net.__gt__, v4net)
+
+
+
+class IpaddrUnitTest(unittest.TestCase):
+
+ def setUp(self):
+ self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
+ self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
+ self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
+ #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
+ self.ipv6_address = ipaddress.IPv6Interface(
+ '2001:658:22a:cafe:200:0:0:1')
+ self.ipv6_interface = ipaddress.IPv6Interface(
+ '2001:658:22a:cafe:200:0:0:1/64')
+ self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
+
+ def testRepr(self):
+ self.assertEqual("IPv4Interface('1.2.3.4/32')",
+ repr(ipaddress.IPv4Interface('1.2.3.4')))
+ self.assertEqual("IPv6Interface('::1/128')",
+ repr(ipaddress.IPv6Interface('::1')))
+
+ # issue57
+ def testAddressIntMath(self):
+ self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
+ ipaddress.IPv4Address('1.1.2.0'))
+ self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
+ ipaddress.IPv4Address('1.1.0.1'))
+ self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
+ ipaddress.IPv6Address('::ffff'))
+ self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
+ ipaddress.IPv6Address('::1'))
+
+ def testInvalidIntToBytes(self):
+ self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
+ self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
+ 2 ** ipaddress.IPV4LENGTH)
+ self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
+ self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
+ 2 ** ipaddress.IPV6LENGTH)
+
+ def testInternals(self):
+ first, last = ipaddress._find_address_range([
+ ipaddress.IPv4Address('10.10.10.10'),
+ ipaddress.IPv4Address('10.10.10.12')])
+ self.assertEqual(first, last)
+ self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
+ self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
+
+ def testMissingAddressVersion(self):
+ class Broken(ipaddress._BaseAddress):
+ pass
+ broken = Broken('127.0.0.1')
+ with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
+ broken.version
+
+ def testMissingNetworkVersion(self):
+ class Broken(ipaddress._BaseNetwork):
+ pass
+ broken = Broken('127.0.0.1')
+ with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
+ broken.version
+
+ def testMissingAddressClass(self):
+ class Broken(ipaddress._BaseNetwork):
+ pass
+ broken = Broken('127.0.0.1')
+ with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
+ broken._address_class
+
+ def testGetNetwork(self):
+ self.assertEqual(int(self.ipv4_network.network_address), 16909056)
+ self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
+
+ self.assertEqual(int(self.ipv6_network.network_address),
+ 42540616829182469433403647294022090752)
+ self.assertEqual(str(self.ipv6_network.network_address),
+ '2001:658:22a:cafe::')
+ self.assertEqual(str(self.ipv6_network.hostmask),
+ '::ffff:ffff:ffff:ffff')
+
+ def testIpFromInt(self):
+ self.assertEqual(self.ipv4_interface._ip,
+ ipaddress.IPv4Interface(16909060)._ip)
+
+ ipv4 = ipaddress.ip_network('1.2.3.4')
+ ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
+ self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
+ self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
+
+ v6_int = 42540616829182469433547762482097946625
+ self.assertEqual(self.ipv6_interface._ip,
+ ipaddress.IPv6Interface(v6_int)._ip)
+
+ self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
+ 4)
+ self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
+ 6)
+
+ def testIpFromPacked(self):
+ address = ipaddress.ip_address
+ self.assertEqual(self.ipv4_interface._ip,
+ ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
+ self.assertEqual(address('255.254.253.252'),
+ address(b'\xff\xfe\xfd\xfc'))
+ self.assertEqual(self.ipv6_interface.ip,
+ ipaddress.ip_interface(
+ b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
+ b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
+ self.assertEqual(address('ffff:2:3:4:ffff::'),
+ address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
+ b'\xff\xff' + b'\x00' * 6))
+ self.assertEqual(address('::'),
+ address(b'\x00' * 16))
+
+ def testGetIp(self):
+ self.assertEqual(int(self.ipv4_interface.ip), 16909060)
+ self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
+
+ self.assertEqual(int(self.ipv6_interface.ip),
+ 42540616829182469433547762482097946625)
+ self.assertEqual(str(self.ipv6_interface.ip),
+ '2001:658:22a:cafe:200::1')
+
+ def testGetNetmask(self):
+ self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
+ self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
+ self.assertEqual(int(self.ipv6_network.netmask),
+ 340282366920938463444927863358058659840)
+ self.assertEqual(self.ipv6_network.prefixlen, 64)
+
+ def testZeroNetmask(self):
+ ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
+ self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
+ self.assertTrue(ipv4_zero_netmask.network._is_valid_netmask(
+ str(0)))
+ self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
+ self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
+ self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
+
+ ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
+ self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
+ self.assertTrue(ipv6_zero_netmask.network._is_valid_netmask(
+ str(0)))
+
+ def testIPv4NetAndHostmasks(self):
+ net = self.ipv4_network
+ self.assertFalse(net._is_valid_netmask('invalid'))
+ self.assertTrue(net._is_valid_netmask('128.128.128.128'))
+ self.assertFalse(net._is_valid_netmask('128.128.128.127'))
+ self.assertFalse(net._is_valid_netmask('128.128.128.255'))
+ self.assertTrue(net._is_valid_netmask('255.128.128.128'))
+
+ self.assertFalse(net._is_hostmask('invalid'))
+ self.assertTrue(net._is_hostmask('128.255.255.255'))
+ self.assertFalse(net._is_hostmask('255.255.255.255'))
+ self.assertFalse(net._is_hostmask('1.2.3.4'))
+
+ net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
+ self.assertEqual(24, net.prefixlen)
+
+ def testGetBroadcast(self):
+ self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
+ self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
+
+ self.assertEqual(int(self.ipv6_network.broadcast_address),
+ 42540616829182469451850391367731642367)
+ self.assertEqual(str(self.ipv6_network.broadcast_address),
+ '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
+
+ def testGetPrefixlen(self):
+ self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
+ self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
+
+ def testGetSupernet(self):
+ self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
+ self.assertEqual(str(self.ipv4_network.supernet().network_address),
+ '1.2.2.0')
+ self.assertEqual(
+ ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
+ ipaddress.IPv4Network('0.0.0.0/0'))
+
+ self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
+ self.assertEqual(str(self.ipv6_network.supernet().network_address),
+ '2001:658:22a:cafe::')
+ self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
+ ipaddress.IPv6Network('::0/0'))
+
+ def testGetSupernet3(self):
+ self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
+ self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
+ '1.2.0.0')
+
+ self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
+ self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
+ '2001:658:22a:caf8::')
+
+ def testGetSupernet4(self):
+ self.assertRaises(ValueError, self.ipv4_network.supernet,
+ prefixlen_diff=2, new_prefix=1)
+ self.assertRaises(ValueError, self.ipv4_network.supernet,
+ new_prefix=25)
+ self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
+ self.ipv4_network.supernet(new_prefix=22))
+
+ self.assertRaises(ValueError, self.ipv6_network.supernet,
+ prefixlen_diff=2, new_prefix=1)
+ self.assertRaises(ValueError, self.ipv6_network.supernet,
+ new_prefix=65)
+ self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
+ self.ipv6_network.supernet(new_prefix=62))
+
+ def testHosts(self):
+ hosts = list(self.ipv4_network.hosts())
+ self.assertEqual(254, len(hosts))
+ self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
+ self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
+
+ # special case where only 1 bit is left for address
+ self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
+ ipaddress.IPv4Address('2.0.0.1')],
+ list(ipaddress.ip_network('2.0.0.0/31').hosts()))
+
+ def testFancySubnetting(self):
+ self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
+ sorted(self.ipv4_network.subnets(new_prefix=27)))
+ self.assertRaises(ValueError, list,
+ self.ipv4_network.subnets(new_prefix=23))
+ self.assertRaises(ValueError, list,
+ self.ipv4_network.subnets(prefixlen_diff=3,
+ new_prefix=27))
+ self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
+ sorted(self.ipv6_network.subnets(new_prefix=68)))
+ self.assertRaises(ValueError, list,
+ self.ipv6_network.subnets(new_prefix=63))
+ self.assertRaises(ValueError, list,
+ self.ipv6_network.subnets(prefixlen_diff=4,
+ new_prefix=68))
+
+ def testGetSubnets(self):
+ self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
+ self.assertEqual(str(list(
+ self.ipv4_network.subnets())[0].network_address),
+ '1.2.3.0')
+ self.assertEqual(str(list(
+ self.ipv4_network.subnets())[1].network_address),
+ '1.2.3.128')
+
+ self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
+
+ def testGetSubnetForSingle32(self):
+ ip = ipaddress.IPv4Network('1.2.3.4/32')
+ subnets1 = [str(x) for x in ip.subnets()]
+ subnets2 = [str(x) for x in ip.subnets(2)]
+ self.assertEqual(subnets1, ['1.2.3.4/32'])
+ self.assertEqual(subnets1, subnets2)
+
+ def testGetSubnetForSingle128(self):
+ ip = ipaddress.IPv6Network('::1/128')
+ subnets1 = [str(x) for x in ip.subnets()]
+ subnets2 = [str(x) for x in ip.subnets(2)]
+ self.assertEqual(subnets1, ['::1/128'])
+ self.assertEqual(subnets1, subnets2)
+
+ def testSubnet2(self):
+ ips = [str(x) for x in self.ipv4_network.subnets(2)]
+ self.assertEqual(
+ ips,
+ ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
+
+ ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
+ self.assertEqual(
+ ipsv6,
+ ['2001:658:22a:cafe::/66',
+ '2001:658:22a:cafe:4000::/66',
+ '2001:658:22a:cafe:8000::/66',
+ '2001:658:22a:cafe:c000::/66'])
+
+ def testSubnetFailsForLargeCidrDiff(self):
+ self.assertRaises(ValueError, list,
+ self.ipv4_interface.network.subnets(9))
+ self.assertRaises(ValueError, list,
+ self.ipv4_network.subnets(9))
+ self.assertRaises(ValueError, list,
+ self.ipv6_interface.network.subnets(65))
+ self.assertRaises(ValueError, list,
+ self.ipv6_network.subnets(65))
+
+ def testSupernetFailsForLargeCidrDiff(self):
+ self.assertRaises(ValueError,
+ self.ipv4_interface.network.supernet, 25)
+ self.assertRaises(ValueError,
+ self.ipv6_interface.network.supernet, 65)
+
+ def testSubnetFailsForNegativeCidrDiff(self):
+ self.assertRaises(ValueError, list,
+ self.ipv4_interface.network.subnets(-1))
+ self.assertRaises(ValueError, list,
+ self.ipv4_network.subnets(-1))
+ self.assertRaises(ValueError, list,
+ self.ipv6_interface.network.subnets(-1))
+ self.assertRaises(ValueError, list,
+ self.ipv6_network.subnets(-1))
+
+ def testGetNum_Addresses(self):
+ self.assertEqual(self.ipv4_network.num_addresses, 256)
+ self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
+ 128)
+ self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
+
+ self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
+ self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
+ 9223372036854775808)
+ self.assertEqual(self.ipv6_network.supernet().num_addresses,
+ 36893488147419103232)
+
+ def testContains(self):
+ self.assertTrue(ipaddress.IPv4Interface('1.2.3.128/25') in
+ self.ipv4_network)
+ self.assertFalse(ipaddress.IPv4Interface('1.2.4.1/24') in
+ self.ipv4_network)
+ # We can test addresses and string as well.
+ addr1 = ipaddress.IPv4Address('1.2.3.37')
+ self.assertTrue(addr1 in self.ipv4_network)
+ # issue 61, bad network comparison on like-ip'd network objects
+ # with identical broadcast addresses.
+ self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
+ ipaddress.IPv4Network('1.0.0.0/15')))
+
+ def testNth(self):
+ self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
+ self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
+
+ self.assertEqual(str(self.ipv6_network[5]),
+ '2001:658:22a:cafe::5')
+
+ def testGetitem(self):
+ # http://code.google.com/p/ipaddr-py/issues/detail?id=15
+ addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
+ self.assertEqual(28, addr.prefixlen)
+ addr_list = list(addr)
+ self.assertEqual('172.31.255.128', str(addr_list[0]))
+ self.assertEqual('172.31.255.128', str(addr[0]))
+ self.assertEqual('172.31.255.143', str(addr_list[-1]))
+ self.assertEqual('172.31.255.143', str(addr[-1]))
+ self.assertEqual(addr_list[-1], addr[-1])
+
+ def testEqual(self):
+ self.assertTrue(self.ipv4_interface ==
+ ipaddress.IPv4Interface('1.2.3.4/24'))
+ self.assertFalse(self.ipv4_interface ==
+ ipaddress.IPv4Interface('1.2.3.4/23'))
+ self.assertFalse(self.ipv4_interface ==
+ ipaddress.IPv6Interface('::1.2.3.4/24'))
+ self.assertFalse(self.ipv4_interface == '')
+ self.assertFalse(self.ipv4_interface == [])
+ self.assertFalse(self.ipv4_interface == 2)
+
+ self.assertTrue(self.ipv6_interface ==
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
+ self.assertFalse(self.ipv6_interface ==
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
+ self.assertFalse(self.ipv6_interface ==
+ ipaddress.IPv4Interface('1.2.3.4/23'))
+ self.assertFalse(self.ipv6_interface == '')
+ self.assertFalse(self.ipv6_interface == [])
+ self.assertFalse(self.ipv6_interface == 2)
+
+ def testNotEqual(self):
+ self.assertFalse(self.ipv4_interface !=
+ ipaddress.IPv4Interface('1.2.3.4/24'))
+ self.assertTrue(self.ipv4_interface !=
+ ipaddress.IPv4Interface('1.2.3.4/23'))
+ self.assertTrue(self.ipv4_interface !=
+ ipaddress.IPv6Interface('::1.2.3.4/24'))
+ self.assertTrue(self.ipv4_interface != '')
+ self.assertTrue(self.ipv4_interface != [])
+ self.assertTrue(self.ipv4_interface != 2)
+
+ self.assertTrue(self.ipv4_address !=
+ ipaddress.IPv4Address('1.2.3.5'))
+ self.assertTrue(self.ipv4_address != '')
+ self.assertTrue(self.ipv4_address != [])
+ self.assertTrue(self.ipv4_address != 2)
+
+ self.assertFalse(self.ipv6_interface !=
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
+ self.assertTrue(self.ipv6_interface !=
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
+ self.assertTrue(self.ipv6_interface !=
+ ipaddress.IPv4Interface('1.2.3.4/23'))
+ self.assertTrue(self.ipv6_interface != '')
+ self.assertTrue(self.ipv6_interface != [])
+ self.assertTrue(self.ipv6_interface != 2)
+
+ self.assertTrue(self.ipv6_address !=
+ ipaddress.IPv4Address('1.2.3.4'))
+ self.assertTrue(self.ipv6_address != '')
+ self.assertTrue(self.ipv6_address != [])
+ self.assertTrue(self.ipv6_address != 2)
+
+ def testSlash32Constructor(self):
+ self.assertEqual(str(ipaddress.IPv4Interface(
+ '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
+
+ def testSlash128Constructor(self):
+ self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
+ '::1/128')
+
+ def testSlash0Constructor(self):
+ self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
+ '1.2.3.4/0')
+
+ def testCollapsing(self):
+ # test only IP addresses including some duplicates
+ ip1 = ipaddress.IPv4Address('1.1.1.0')
+ ip2 = ipaddress.IPv4Address('1.1.1.1')
+ ip3 = ipaddress.IPv4Address('1.1.1.2')
+ ip4 = ipaddress.IPv4Address('1.1.1.3')
+ ip5 = ipaddress.IPv4Address('1.1.1.4')
+ ip6 = ipaddress.IPv4Address('1.1.1.0')
+ # check that addreses are subsumed properly.
+ collapsed = ipaddress.collapse_addresses(
+ [ip1, ip2, ip3, ip4, ip5, ip6])
+ self.assertEqual(list(collapsed),
+ [ipaddress.IPv4Network('1.1.1.0/30'),
+ ipaddress.IPv4Network('1.1.1.4/32')])
+
+ # test a mix of IP addresses and networks including some duplicates
+ ip1 = ipaddress.IPv4Address('1.1.1.0')
+ ip2 = ipaddress.IPv4Address('1.1.1.1')
+ ip3 = ipaddress.IPv4Address('1.1.1.2')
+ ip4 = ipaddress.IPv4Address('1.1.1.3')
+ #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
+ #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
+ # check that addreses are subsumed properly.
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
+ self.assertEqual(list(collapsed),
+ [ipaddress.IPv4Network('1.1.1.0/30')])
+
+ # test only IP networks
+ ip1 = ipaddress.IPv4Network('1.1.0.0/24')
+ ip2 = ipaddress.IPv4Network('1.1.1.0/24')
+ ip3 = ipaddress.IPv4Network('1.1.2.0/24')
+ ip4 = ipaddress.IPv4Network('1.1.3.0/24')
+ ip5 = ipaddress.IPv4Network('1.1.4.0/24')
+ # stored in no particular order b/c we want CollapseAddr to call
+ # [].sort
+ ip6 = ipaddress.IPv4Network('1.1.0.0/22')
+ # check that addreses are subsumed properly.
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
+ ip6])
+ self.assertEqual(list(collapsed),
+ [ipaddress.IPv4Network('1.1.0.0/22'),
+ ipaddress.IPv4Network('1.1.4.0/24')])
+
+ # test that two addresses are supernet'ed properly
+ collapsed = ipaddress.collapse_addresses([ip1, ip2])
+ self.assertEqual(list(collapsed),
+ [ipaddress.IPv4Network('1.1.0.0/23')])
+
+ # test same IP networks
+ ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
+ self.assertEqual(list(ipaddress.collapse_addresses(
+ [ip_same1, ip_same2])),
+ [ip_same1])
+
+ # test same IP addresses
+ ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
+ self.assertEqual(list(ipaddress.collapse_addresses(
+ [ip_same1, ip_same2])),
+ [ipaddress.ip_network('1.1.1.1/32')])
+ ip1 = ipaddress.IPv6Network('2001::/100')
+ ip2 = ipaddress.IPv6Network('2001::/120')
+ ip3 = ipaddress.IPv6Network('2001::/96')
+ # test that ipv6 addresses are subsumed properly.
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
+ self.assertEqual(list(collapsed), [ip3])
+
+ # the toejam test
+ addr_tuples = [
+ (ipaddress.ip_address('1.1.1.1'),
+ ipaddress.ip_address('::1')),
+ (ipaddress.IPv4Network('1.1.0.0/24'),
+ ipaddress.IPv6Network('2001::/120')),
+ (ipaddress.IPv4Network('1.1.0.0/32'),
+ ipaddress.IPv6Network('2001::/128')),
+ ]
+ for ip1, ip2 in addr_tuples:
+ self.assertRaises(TypeError, ipaddress.collapse_addresses,
+ [ip1, ip2])
+
+ def testSummarizing(self):
+ #ip = ipaddress.ip_address
+ #ipnet = ipaddress.ip_network
+ summarize = ipaddress.summarize_address_range
+ ip1 = ipaddress.ip_address('1.1.1.0')
+ ip2 = ipaddress.ip_address('1.1.1.255')
+
+ # summarize works only for IPv4 & IPv6
+ class IPv7Address(ipaddress.IPv6Address):
+ @property
+ def version(self):
+ return 7
+ ip_invalid1 = IPv7Address('::1')
+ ip_invalid2 = IPv7Address('::1')
+ self.assertRaises(ValueError, list,
+ summarize(ip_invalid1, ip_invalid2))
+ # test that a summary over ip4 & ip6 fails
+ self.assertRaises(TypeError, list,
+ summarize(ip1, ipaddress.IPv6Address('::1')))
+ # test a /24 is summarized properly
+ self.assertEqual(list(summarize(ip1, ip2))[0],
+ ipaddress.ip_network('1.1.1.0/24'))
+ # test an IPv4 range that isn't on a network byte boundary
+ ip2 = ipaddress.ip_address('1.1.1.8')
+ self.assertEqual(list(summarize(ip1, ip2)),
+ [ipaddress.ip_network('1.1.1.0/29'),
+ ipaddress.ip_network('1.1.1.8')])
+ # all!
+ ip1 = ipaddress.IPv4Address(0)
+ ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
+ self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
+ list(summarize(ip1, ip2)))
+
+ ip1 = ipaddress.ip_address('1::')
+ ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
+ # test a IPv6 is sumamrized properly
+ self.assertEqual(list(summarize(ip1, ip2))[0],
+ ipaddress.ip_network('1::/16'))
+ # test an IPv6 range that isn't on a network byte boundary
+ ip2 = ipaddress.ip_address('2::')
+ self.assertEqual(list(summarize(ip1, ip2)),
+ [ipaddress.ip_network('1::/16'),
+ ipaddress.ip_network('2::/128')])
+
+ # test exception raised when first is greater than last
+ self.assertRaises(ValueError, list,
+ summarize(ipaddress.ip_address('1.1.1.0'),
+ ipaddress.ip_address('1.1.0.0')))
+ # test exception raised when first and last aren't IP addresses
+ self.assertRaises(TypeError, list,
+ summarize(ipaddress.ip_network('1.1.1.0'),
+ ipaddress.ip_network('1.1.0.0')))
+ self.assertRaises(TypeError, list,
+ summarize(ipaddress.ip_network('1.1.1.0'),
+ ipaddress.ip_network('1.1.0.0')))
+ # test exception raised when first and last are not same version
+ self.assertRaises(TypeError, list,
+ summarize(ipaddress.ip_address('::'),
+ ipaddress.ip_network('1.1.0.0')))
+
+ def testAddressComparison(self):
+ self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
+ ipaddress.ip_address('1.1.1.1'))
+ self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
+ ipaddress.ip_address('1.1.1.2'))
+ self.assertTrue(ipaddress.ip_address('::1') <=
+ ipaddress.ip_address('::1'))
+ self.assertTrue(ipaddress.ip_address('::1') <=
+ ipaddress.ip_address('::2'))
+
+ def testInterfaceComparison(self):
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
+ ipaddress.ip_interface('1.1.1.1'))
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
+ ipaddress.ip_interface('1.1.1.2'))
+ self.assertTrue(ipaddress.ip_interface('::1') <=
+ ipaddress.ip_interface('::1'))
+ self.assertTrue(ipaddress.ip_interface('::1') <=
+ ipaddress.ip_interface('::2'))
+
+ def testNetworkComparison(self):
+ # ip1 and ip2 have the same network address
+ ip1 = ipaddress.IPv4Network('1.1.1.0/24')
+ ip2 = ipaddress.IPv4Network('1.1.1.0/32')
+ ip3 = ipaddress.IPv4Network('1.1.2.0/24')
+
+ self.assertTrue(ip1 < ip3)
+ self.assertTrue(ip3 > ip2)
+
+ self.assertEqual(ip1.compare_networks(ip1), 0)
+
+ # if addresses are the same, sort by netmask
+ self.assertEqual(ip1.compare_networks(ip2), -1)
+ self.assertEqual(ip2.compare_networks(ip1), 1)
+
+ self.assertEqual(ip1.compare_networks(ip3), -1)
+ self.assertEqual(ip3.compare_networks(ip1), 1)
+ self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
+
+ ip1 = ipaddress.IPv6Network('2001:2000::/96')
+ ip2 = ipaddress.IPv6Network('2001:2001::/96')
+ ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
+
+ self.assertTrue(ip1 < ip3)
+ self.assertTrue(ip3 > ip2)
+ self.assertEqual(ip1.compare_networks(ip3), -1)
+ self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
+
+ # Test comparing different protocols.
+ # Should always raise a TypeError.
+ self.assertRaises(TypeError,
+ self.ipv4_network.compare_networks,
+ self.ipv6_network)
+ ipv6 = ipaddress.IPv6Interface('::/0')
+ ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
+ self.assertRaises(TypeError, ipv4.__lt__, ipv6)
+ self.assertRaises(TypeError, ipv4.__gt__, ipv6)
+ self.assertRaises(TypeError, ipv6.__lt__, ipv4)
+ self.assertRaises(TypeError, ipv6.__gt__, ipv4)
+
+ # Regression test for issue 19.
+ ip1 = ipaddress.ip_network('10.1.2.128/25')
+ self.assertFalse(ip1 < ip1)
+ self.assertFalse(ip1 > ip1)
+ ip2 = ipaddress.ip_network('10.1.3.0/24')
+ self.assertTrue(ip1 < ip2)
+ self.assertFalse(ip2 < ip1)
+ self.assertFalse(ip1 > ip2)
+ self.assertTrue(ip2 > ip1)
+ ip3 = ipaddress.ip_network('10.1.3.0/25')
+ self.assertTrue(ip2 < ip3)
+ self.assertFalse(ip3 < ip2)
+ self.assertFalse(ip2 > ip3)
+ self.assertTrue(ip3 > ip2)
+
+ # Regression test for issue 28.
+ ip1 = ipaddress.ip_network('10.10.10.0/31')
+ ip2 = ipaddress.ip_network('10.10.10.0')
+ ip3 = ipaddress.ip_network('10.10.10.2/31')
+ ip4 = ipaddress.ip_network('10.10.10.2')
+ sorted = [ip1, ip2, ip3, ip4]
+ unsorted = [ip2, ip4, ip1, ip3]
+ unsorted.sort()
+ self.assertEqual(sorted, unsorted)
+ unsorted = [ip4, ip1, ip3, ip2]
+ unsorted.sort()
+ self.assertEqual(sorted, unsorted)
+ self.assertRaises(TypeError, ip1.__lt__,
+ ipaddress.ip_address('10.10.10.0'))
+ self.assertRaises(TypeError, ip2.__lt__,
+ ipaddress.ip_address('10.10.10.0'))
+
+ # <=, >=
+ self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
+ ipaddress.ip_network('1.1.1.1'))
+ self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
+ ipaddress.ip_network('1.1.1.2'))
+ self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
+ ipaddress.ip_network('1.1.1.1'))
+ self.assertTrue(ipaddress.ip_network('::1') <=
+ ipaddress.ip_network('::1'))
+ self.assertTrue(ipaddress.ip_network('::1') <=
+ ipaddress.ip_network('::2'))
+ self.assertFalse(ipaddress.ip_network('::2') <=
+ ipaddress.ip_network('::1'))
+
+ def testStrictNetworks(self):
+ self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
+ self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
+
+ def testOverlaps(self):
+ other = ipaddress.IPv4Network('1.2.3.0/30')
+ other2 = ipaddress.IPv4Network('1.2.2.0/24')
+ other3 = ipaddress.IPv4Network('1.2.2.64/26')
+ self.assertTrue(self.ipv4_network.overlaps(other))
+ self.assertFalse(self.ipv4_network.overlaps(other2))
+ self.assertTrue(other2.overlaps(other3))
+
+ def testEmbeddedIpv4(self):
+ ipv4_string = '192.168.0.1'
+ ipv4 = ipaddress.IPv4Interface(ipv4_string)
+ v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
+ self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
+ v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
+ self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
+ self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
+ '2001:1.1.1.1:1.1.1.1')
+
+ # Issue 67: IPv6 with embedded IPv4 address not recognized.
+ def testIPv6AddressTooLarge(self):
+ # RFC4291 2.5.5.2
+ self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
+ ipaddress.ip_address('::FFFF:c000:201'))
+ # RFC4291 2.2 (part 3) x::d.d.d.d
+ self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
+ ipaddress.ip_address('FFFF::c000:201'))
+
+ def testIPVersion(self):
+ self.assertEqual(self.ipv4_address.version, 4)
+ self.assertEqual(self.ipv6_address.version, 6)
+
+ def testMaxPrefixLength(self):
+ self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
+ self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
+
+ def testPacked(self):
+ self.assertEqual(self.ipv4_address.packed,
+ b'\x01\x02\x03\x04')
+ self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
+ b'\xff\xfe\xfd\xfc')
+ self.assertEqual(self.ipv6_address.packed,
+ b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
+ b'\x02\x00\x00\x00\x00\x00\x00\x01')
+ self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
+ b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
+ + b'\x00' * 6)
+ self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
+ b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
+
+ def testIpStrFromPrefixlen(self):
+ ipv4 = ipaddress.IPv4Interface('1.2.3.4/24')
+ self.assertEqual(ipv4._ip_string_from_prefix(), '255.255.255.0')
+ self.assertEqual(ipv4._ip_string_from_prefix(28), '255.255.255.240')
+
+ def testIpType(self):
+ ipv4net = ipaddress.ip_network('1.2.3.4')
+ ipv4addr = ipaddress.ip_address('1.2.3.4')
+ ipv6net = ipaddress.ip_network('::1.2.3.4')
+ ipv6addr = ipaddress.ip_address('::1.2.3.4')
+ self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
+ self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
+ self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
+ self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
+
+ def testReservedIpv4(self):
+ # test networks
+ self.assertEqual(True, ipaddress.ip_interface(
+ '224.1.1.1/31').is_multicast)
+ self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
+ self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
+
+ self.assertEqual(True, ipaddress.ip_interface(
+ '192.168.1.1/17').is_private)
+ self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
+ self.assertEqual(True, ipaddress.ip_network(
+ '10.255.255.255').is_private)
+ self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
+ self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
+ self.assertEqual(True, ipaddress.ip_network(
+ '172.31.255.255').is_private)
+ self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
+ self.assertEqual(True,
+ ipaddress.ip_network('169.254.1.0/24').is_link_local)
+
+ self.assertEqual(True,
+ ipaddress.ip_interface(
+ '169.254.100.200/24').is_link_local)
+ self.assertEqual(False,
+ ipaddress.ip_interface(
+ '169.255.100.200/24').is_link_local)
+
+ self.assertEqual(True,
+ ipaddress.ip_network(
+ '127.100.200.254/32').is_loopback)
+ self.assertEqual(True, ipaddress.ip_network(
+ '127.42.0.0/16').is_loopback)
+ self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
+
+ # test addresses
+ self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
+ self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
+ self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
+ self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
+ self.assertEqual(False,
+ ipaddress.ip_address('239.255.255.255').is_reserved)
+
+ self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
+ self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
+ self.assertEqual(True, ipaddress.ip_address(
+ '10.255.255.255').is_private)
+ self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
+ self.assertEqual(True, ipaddress.ip_address(
+ '172.31.255.255').is_private)
+ self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
+
+ self.assertEqual(True,
+ ipaddress.ip_address('169.254.100.200').is_link_local)
+ self.assertEqual(False,
+ ipaddress.ip_address('169.255.100.200').is_link_local)
+
+ self.assertEqual(True,
+ ipaddress.ip_address('127.100.200.254').is_loopback)
+ self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
+ self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
+ self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
+
+ def testReservedIpv6(self):
+
+ self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
+ self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
+ self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
+ self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
+
+ self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
+ self.assertEqual(True, ipaddress.ip_network(
+ 'feff:ffff:ffff:ffff::').is_site_local)
+ self.assertEqual(False, ipaddress.ip_network(
+ 'fbf:ffff::').is_site_local)
+ self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
+
+ self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
+ self.assertEqual(True, ipaddress.ip_network(
+ 'fc00:ffff:ffff:ffff::').is_private)
+ self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
+ self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
+
+ self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
+ self.assertEqual(True, ipaddress.ip_network(
+ 'febf:ffff::').is_link_local)
+ self.assertEqual(False, ipaddress.ip_network(
+ 'fe7f:ffff::').is_link_local)
+ self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
+
+ self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
+ self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
+ self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
+ self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
+
+ self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
+ self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
+ self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
+
+ # test addresses
+ self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
+ self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
+ self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
+ self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
+
+ self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
+ self.assertEqual(True, ipaddress.ip_address(
+ 'feff:ffff:ffff:ffff::').is_site_local)
+ self.assertEqual(False, ipaddress.ip_address(
+ 'fbf:ffff::').is_site_local)
+ self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
+
+ self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
+ self.assertEqual(True, ipaddress.ip_address(
+ 'fc00:ffff:ffff:ffff::').is_private)
+ self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
+ self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
+
+ self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
+ self.assertEqual(True, ipaddress.ip_address(
+ 'febf:ffff::').is_link_local)
+ self.assertEqual(False, ipaddress.ip_address(
+ 'fe7f:ffff::').is_link_local)
+ self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
+
+ self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
+ self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
+ self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
+
+ self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
+ self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
+
+ # some generic IETF reserved addresses
+ self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
+ self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
+
+ def testIpv4Mapped(self):
+ self.assertEqual(
+ ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
+ ipaddress.ip_address('192.168.1.1'))
+ self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
+ self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
+ ipaddress.ip_address('192.168.1.1'))
+
+ def testAddrExclude(self):
+ addr1 = ipaddress.ip_network('10.1.1.0/24')
+ addr2 = ipaddress.ip_network('10.1.1.0/26')
+ addr3 = ipaddress.ip_network('10.2.1.0/24')
+ addr4 = ipaddress.ip_address('10.1.1.0')
+ addr5 = ipaddress.ip_network('2001:db8::0/32')
+ self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
+ [ipaddress.ip_network('10.1.1.64/26'),
+ ipaddress.ip_network('10.1.1.128/25')])
+ self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
+ self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
+ self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
+ self.assertEqual(list(addr1.address_exclude(addr1)), [])
+
+ def testHash(self):
+ self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
+ hash(ipaddress.ip_interface('10.1.1.0/24')))
+ self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
+ hash(ipaddress.ip_network('10.1.1.0/24')))
+ self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
+ hash(ipaddress.ip_address('10.1.1.0')))
+ # i70
+ self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
+ hash(ipaddress.ip_address(
+ int(ipaddress.ip_address('1.2.3.4')._ip))))
+ ip1 = ipaddress.ip_address('10.1.1.0')
+ ip2 = ipaddress.ip_address('1::')
+ dummy = {}
+ dummy[self.ipv4_address] = None
+ dummy[self.ipv6_address] = None
+ dummy[ip1] = None
+ dummy[ip2] = None
+ self.assertTrue(self.ipv4_address in dummy)
+ self.assertTrue(ip2 in dummy)
+
+ def testIPBases(self):
+ net = self.ipv4_network
+ self.assertEqual('1.2.3.0/24', net.compressed)
+ self.assertEqual(
+ net._ip_int_from_prefix(24),
+ net._ip_int_from_prefix(None))
+ net = self.ipv6_network
+ self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
+ self.assertEqual(
+ self.ipv6_address._string_from_ip_int(self.ipv6_address._ip),
+ self.ipv6_address._string_from_ip_int(None))
+
+ def testIPv6NetworkHelpers(self):
+ net = self.ipv6_network
+ self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
+ self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
+ net.with_netmask)
+ self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
+ net.with_hostmask)
+ self.assertEqual('2001:658:22a:cafe::/64', str(net))
+
+ def testIPv4NetworkHelpers(self):
+ net = self.ipv4_network
+ self.assertEqual('1.2.3.0/24', net.with_prefixlen)
+ self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
+ self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
+ self.assertEqual('1.2.3.0/24', str(net))
+
+ def testCopyConstructor(self):
+ addr1 = ipaddress.ip_network('10.1.1.0/24')
+ addr2 = ipaddress.ip_network(addr1)
+ addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
+ addr4 = ipaddress.ip_interface(addr3)
+ addr5 = ipaddress.IPv4Address('1.1.1.1')
+ addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
+
+ self.assertEqual(addr1, addr2)
+ self.assertEqual(addr3, addr4)
+ self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
+ self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
+
+ def testCompressIPv6Address(self):
+ test_addresses = {
+ '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
+ '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
+ '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
+ '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
+ '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
+ '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
+ '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
+ '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
+ '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
+ '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:1': '::1/128',
+ '2001:0658:022a:cafe:0000:0000:0000:0000/66':
+ '2001:658:22a:cafe::/66',
+ '::1.2.3.4': '::102:304/128',
+ '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
+ '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
+ '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
+ '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
+ '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
+ }
+ for uncompressed, compressed in list(test_addresses.items()):
+ self.assertEqual(compressed, str(ipaddress.IPv6Interface(
+ uncompressed)))
+
+ def testExplodeShortHandIpStr(self):
+ addr1 = ipaddress.IPv6Interface('2001::1')
+ addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
+ addr3 = ipaddress.IPv6Network('2001::/96')
+ addr4 = ipaddress.IPv4Address('192.168.178.1')
+ self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
+ addr1.exploded)
+ self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
+ ipaddress.IPv6Interface('::1/128').exploded)
+ # issue 77
+ self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
+ addr2.exploded)
+ self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
+ addr3.exploded)
+ self.assertEqual('192.168.178.1', addr4.exploded)
+
+ def testIntRepresentation(self):
+ self.assertEqual(16909060, int(self.ipv4_address))
+ self.assertEqual(42540616829182469433547762482097946625,
+ int(self.ipv6_address))
+
+ def testForceVersion(self):
+ self.assertEqual(ipaddress.ip_network(1).version, 4)
+ self.assertEqual(ipaddress.IPv6Network(1).version, 6)
+
+ def testWithStar(self):
+ self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
+ self.assertEqual(self.ipv4_interface.with_netmask,
+ "1.2.3.4/255.255.255.0")
+ self.assertEqual(self.ipv4_interface.with_hostmask,
+ "1.2.3.4/0.0.0.255")
+
+ self.assertEqual(self.ipv6_interface.with_prefixlen,
+ '2001:658:22a:cafe:200::1/64')
+ self.assertEqual(self.ipv6_interface.with_netmask,
+ '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
+ # this probably don't make much sense, but it's included for
+ # compatibility with ipv4
+ self.assertEqual(self.ipv6_interface.with_hostmask,
+ '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
+
+ def testNetworkElementCaching(self):
+ # V4 - make sure we're empty
+ self.assertFalse('network_address' in self.ipv4_network._cache)
+ self.assertFalse('broadcast_address' in self.ipv4_network._cache)
+ self.assertFalse('hostmask' in self.ipv4_network._cache)
+
+ # V4 - populate and test
+ self.assertEqual(self.ipv4_network.network_address,
+ ipaddress.IPv4Address('1.2.3.0'))
+ self.assertEqual(self.ipv4_network.broadcast_address,
+ ipaddress.IPv4Address('1.2.3.255'))
+ self.assertEqual(self.ipv4_network.hostmask,
+ ipaddress.IPv4Address('0.0.0.255'))
+
+ # V4 - check we're cached
+ self.assertTrue('broadcast_address' in self.ipv4_network._cache)
+ self.assertTrue('hostmask' in self.ipv4_network._cache)
+
+ # V6 - make sure we're empty
+ self.assertFalse('broadcast_address' in self.ipv6_network._cache)
+ self.assertFalse('hostmask' in self.ipv6_network._cache)
+
+ # V6 - populate and test
+ self.assertEqual(self.ipv6_network.network_address,
+ ipaddress.IPv6Address('2001:658:22a:cafe::'))
+ self.assertEqual(self.ipv6_interface.network.network_address,
+ ipaddress.IPv6Address('2001:658:22a:cafe::'))
+
+ self.assertEqual(
+ self.ipv6_network.broadcast_address,
+ ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
+ self.assertEqual(self.ipv6_network.hostmask,
+ ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
+ self.assertEqual(
+ self.ipv6_interface.network.broadcast_address,
+ ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
+ self.assertEqual(self.ipv6_interface.network.hostmask,
+ ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
+
+ # V6 - check we're cached
+ self.assertTrue('broadcast_address' in self.ipv6_network._cache)
+ self.assertTrue('hostmask' in self.ipv6_network._cache)
+ self.assertTrue(
+ 'broadcast_address' in self.ipv6_interface.network._cache)
+ self.assertTrue('hostmask' in self.ipv6_interface.network._cache)
+
+ def testTeredo(self):
+ # stolen from wikipedia
+ server = ipaddress.IPv4Address('65.54.227.120')
+ client = ipaddress.IPv4Address('192.0.2.45')
+ teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
+ self.assertEqual((server, client),
+ ipaddress.ip_address(teredo_addr).teredo)
+ bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
+ self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
+ bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
+ self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
+
+ # i77
+ teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
+ self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
+ ipaddress.IPv4Address('95.26.244.94')),
+ teredo_addr.teredo)
+
+ def testsixtofour(self):
+ sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
+ bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
+ self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
+ sixtofouraddr.sixtofour)
+ self.assertFalse(bad_addr.sixtofour)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py
index e424303..b2f3e65 100644
--- a/Lib/test/test_iter.py
+++ b/Lib/test/test_iter.py
@@ -2,6 +2,8 @@
import unittest
from test.support import run_unittest, TESTFN, unlink, cpython_only
+import pickle
+import collections.abc
# Test result of triple loop (too big to inline)
TRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2),
@@ -28,6 +30,8 @@ class BasicIterClass:
raise StopIteration
self.i = res + 1
return res
+ def __iter__(self):
+ return self
class IteratingSequenceClass:
def __init__(self, n):
@@ -49,7 +53,9 @@ class SequenceClass:
class TestCase(unittest.TestCase):
# Helper to check that an iterator returns a given sequence
- def check_iterator(self, it, seq):
+ def check_iterator(self, it, seq, pickle=True):
+ if pickle:
+ self.check_pickle(it, seq)
res = []
while 1:
try:
@@ -60,12 +66,33 @@ class TestCase(unittest.TestCase):
self.assertEqual(res, seq)
# Helper to check that a for loop generates a given sequence
- def check_for_loop(self, expr, seq):
+ def check_for_loop(self, expr, seq, pickle=True):
+ if pickle:
+ self.check_pickle(iter(expr), seq)
res = []
for val in expr:
res.append(val)
self.assertEqual(res, seq)
+ # Helper to check picklability
+ def check_pickle(self, itorg, seq):
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ # Cannot assert type equality because dict iterators unpickle as list
+ # iterators.
+ # self.assertEqual(type(itorg), type(it))
+ self.assertTrue(isinstance(it, collections.abc.Iterator))
+ self.assertEqual(list(it), seq)
+
+ it = pickle.loads(d)
+ try:
+ next(it)
+ except StopIteration:
+ return
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), seq[1:])
+
# Test basic use of iter() function
def test_iter_basic(self):
self.check_iterator(iter(range(10)), list(range(10)))
@@ -138,7 +165,7 @@ class TestCase(unittest.TestCase):
if i > 100:
raise IndexError # Emergency stop
return i
- self.check_iterator(iter(C(), 10), list(range(10)))
+ self.check_iterator(iter(C(), 10), list(range(10)), pickle=False)
# Test two-argument iter() with function
def test_iter_function(self):
@@ -146,7 +173,7 @@ class TestCase(unittest.TestCase):
i = state[0]
state[0] = i+1
return i
- self.check_iterator(iter(spam, 10), list(range(10)))
+ self.check_iterator(iter(spam, 10), list(range(10)), pickle=False)
# Test two-argument iter() with function that raises StopIteration
def test_iter_function_stop(self):
@@ -156,7 +183,7 @@ class TestCase(unittest.TestCase):
raise StopIteration
state[0] = i+1
return i
- self.check_iterator(iter(spam, 20), list(range(10)))
+ self.check_iterator(iter(spam, 20), list(range(10)), pickle=False)
# Test exception propagation through function iterator
def test_exception_function(self):
@@ -198,7 +225,7 @@ class TestCase(unittest.TestCase):
if i == 10:
raise StopIteration
return SequenceClass.__getitem__(self, i)
- self.check_for_loop(MySequenceClass(20), list(range(10)))
+ self.check_for_loop(MySequenceClass(20), list(range(10)), pickle=False)
# Test a big range
def test_iter_big_range(self):
@@ -237,8 +264,8 @@ class TestCase(unittest.TestCase):
f.close()
f = open(TESTFN, "r")
try:
- self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"])
- self.check_for_loop(f, [])
+ self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"], pickle=False)
+ self.check_for_loop(f, [], pickle=False)
finally:
f.close()
try:
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index 8cdc597..90e85a9 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -37,6 +37,13 @@ def isOdd(x):
'Test predicate'
return x%2==1
+def tupleize(*args):
+ return args
+
+def irange(n):
+ for i in range(n):
+ yield i
+
class StopNow:
'Class emulating an empty iterable.'
def __iter__(self):
@@ -55,8 +62,59 @@ def fact(n):
'Factorial'
return prod(range(1, n+1))
+# root level methods for pickling ability
+def testR(r):
+ return r[0]
+
+def testR2(r):
+ return r[2]
+
+def underten(x):
+ return x<10
+
class TestBasicOps(unittest.TestCase):
+ def pickletest(self, it, stop=4, take=1, compare=None):
+ """Test that an iterator is the same after pickling, also when part-consumed"""
+ def expand(it, i=0):
+ # Recursively expand iterables, within sensible bounds
+ if i > 10:
+ raise RuntimeError("infinite recursion encountered")
+ if isinstance(it, str):
+ return it
+ try:
+ l = list(islice(it, stop))
+ except TypeError:
+ return it # can't expand it
+ return [expand(e, i+1) for e in l]
+
+ # Test the initial copy against the original
+ dump = pickle.dumps(it)
+ i2 = pickle.loads(dump)
+ self.assertEqual(type(it), type(i2))
+ a, b = expand(it), expand(i2)
+ self.assertEqual(a, b)
+ if compare:
+ c = expand(compare)
+ self.assertEqual(a, c)
+
+ # Take from the copy, and create another copy and compare them.
+ i3 = pickle.loads(dump)
+ took = 0
+ try:
+ for i in range(take):
+ next(i3)
+ took += 1
+ except StopIteration:
+ pass #in case there is less data than 'take'
+ dump = pickle.dumps(i3)
+ i4 = pickle.loads(dump)
+ a, b = expand(i3), expand(i4)
+ self.assertEqual(a, b)
+ if compare:
+ c = expand(compare[took:])
+ self.assertEqual(a, c);
+
def test_accumulate(self):
self.assertEqual(list(accumulate(range(10))), # one positional arg
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
@@ -69,11 +127,22 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
self.assertEqual(list(accumulate([])), []) # empty iterable
self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
- self.assertRaises(TypeError, accumulate, range(10), 5) # too many args
+ self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
self.assertRaises(TypeError, accumulate) # too few args
self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
+ s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
+ self.assertEqual(list(accumulate(s, min)),
+ [2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
+ self.assertEqual(list(accumulate(s, max)),
+ [2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
+ self.assertEqual(list(accumulate(s, operator.mul)),
+ [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
+ with self.assertRaises(TypeError):
+ list(accumulate(s, chr)) # unary-operation
+ self.pickletest(accumulate(range(10))) # test pickling
+
def test_chain(self):
def chain2(*iterables):
@@ -96,14 +165,43 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
+ def test_chain_reducible(self):
+ operators = [copy.deepcopy,
+ lambda s: pickle.loads(pickle.dumps(s))]
+ for oper in operators:
+ it = chain('abc', 'def')
+ self.assertEqual(list(oper(it)), list('abcdef'))
+ self.assertEqual(next(it), 'a')
+ self.assertEqual(list(oper(it)), list('bcdef'))
+
+ self.assertEqual(list(oper(chain(''))), [])
+ self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd'))
+ self.assertRaises(TypeError, list, oper(chain(2, 3)))
+ self.pickletest(chain('abc', 'def'), compare=list('abcdef'))
+
def test_combinations(self):
self.assertRaises(TypeError, combinations, 'abc') # missing r argument
self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
self.assertRaises(TypeError, combinations, None) # pool is not iterable
self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative
- self.assertEqual(list(combinations('abc', 32)), []) # r > n
- self.assertEqual(list(combinations(range(4), 3)),
- [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
+
+ for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
+ self.assertEqual(list(op(combinations('abc', 32))), []) # r > n
+
+ self.assertEqual(list(op(combinations('ABCD', 2))),
+ [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
+ testIntermediate = combinations('ABCD', 2)
+ next(testIntermediate)
+ self.assertEqual(list(op(testIntermediate)),
+ [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')])
+
+ self.assertEqual(list(op(combinations(range(4), 3))),
+ [(0,1,2), (0,1,3), (0,2,3), (1,2,3)])
+ testIntermediate = combinations(range(4), 3)
+ next(testIntermediate)
+ self.assertEqual(list(op(testIntermediate)),
+ [(0,1,3), (0,2,3), (1,2,3)])
+
def combinations1(iterable, r):
'Pure python version shown in the docs'
@@ -158,7 +256,11 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version
self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version
+ self.pickletest(combinations(values, r)) # test pickling
+
# Test implementation detail: tuple re-use
+ @support.impl_detail("tuple reuse is specific to CPython")
+ def test_combinations_tuple_reuse(self):
self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1)
self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1)
@@ -168,8 +270,15 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments
self.assertRaises(TypeError, cwr, None) # pool is not iterable
self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative
- self.assertEqual(list(cwr('ABC', 2)),
- [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
+
+ for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))):
+ self.assertEqual(list(op(cwr('ABC', 2))),
+ [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
+ testIntermediate = cwr('ABC', 2)
+ next(testIntermediate)
+ self.assertEqual(list(op(testIntermediate)),
+ [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')])
+
def cwr1(iterable, r):
'Pure python version shown in the docs'
@@ -228,7 +337,13 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version
self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version
+ self.pickletest(cwr(values,r)) # test pickling
+
# Test implementation detail: tuple re-use
+
+ @support.impl_detail("tuple reuse is specific to CPython")
+ def test_combinations_with_replacement_tuple_reuse(self):
+ cwr = combinations_with_replacement
self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1)
self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1)
@@ -292,7 +407,10 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(result, list(permutations(values, None))) # test r as None
self.assertEqual(result, list(permutations(values))) # test default r
- # Test implementation detail: tuple re-use
+ self.pickletest(permutations(values, r)) # test pickling
+
+ @support.impl_detail("tuple resuse is CPython specific")
+ def test_permutations_tuple_reuse(self):
self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1)
@@ -345,6 +463,24 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, compress, range(6)) # too few args
self.assertRaises(TypeError, compress, range(6), None) # too many args
+ # check copy, deepcopy, pickle
+ for op in (lambda a:copy.copy(a), lambda a:copy.deepcopy(a), lambda a:pickle.loads(pickle.dumps(a))):
+ for data, selectors, result1, result2 in [
+ ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'),
+ ('ABCDEF', [0,0,0,0,0,0], '', ''),
+ ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'),
+ ('ABCDEF', [1,0,1], 'AC', 'C'),
+ ('ABC', [0,1,1,1,1,1], 'BC', 'C'),
+ ]:
+
+ self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1))
+ self.assertEqual(list(op(compress(data, selectors))), list(result1))
+ testIntermediate = compress(data, selectors)
+ if result1:
+ next(testIntermediate)
+ self.assertEqual(list(op(testIntermediate)), list(result2))
+
+
def test_count(self):
self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)])
self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)])
@@ -379,7 +515,7 @@ class TestBasicOps(unittest.TestCase):
c = count(value)
self.assertEqual(next(copy.copy(c)), value)
self.assertEqual(next(copy.deepcopy(c)), value)
- self.assertEqual(next(pickle.loads(pickle.dumps(c))), value)
+ self.pickletest(count(value))
#check proper internal error handling for large "step' sizes
count(1, maxsize+5); sys.exc_info()
@@ -426,6 +562,7 @@ class TestBasicOps(unittest.TestCase):
else:
r2 = ('count(%r, %r)' % (i, j)).replace('L', '')
self.assertEqual(r1, r2)
+ self.pickletest(count(i, j))
def test_cycle(self):
self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
@@ -434,6 +571,18 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, cycle, 5)
self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
+ # check copy, deepcopy, pickle
+ c = cycle('abc')
+ self.assertEqual(next(c), 'a')
+ #simple copy currently not supported, because __reduce__ returns
+ #an internal iterator
+ #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab'))
+ self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab'))
+ self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('bcabcabcab'))
+ next(c)
+ self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('cabcabcabc'))
+ self.pickletest(cycle('abc'))
+
def test_groupby(self):
# Check whether it accepts arguments correctly
self.assertEqual([], list(groupby([])))
@@ -452,18 +601,37 @@ class TestBasicOps(unittest.TestCase):
dup.append(elem)
self.assertEqual(s, dup)
+ # Check normal pickled
+ dup = []
+ for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
+ for elem in g:
+ self.assertEqual(k, elem[0])
+ dup.append(elem)
+ self.assertEqual(s, dup)
+
# Check nested case
dup = []
- for k, g in groupby(s, lambda r:r[0]):
- for ik, ig in groupby(g, lambda r:r[2]):
+ for k, g in groupby(s, testR):
+ for ik, ig in groupby(g, testR2):
+ for elem in ig:
+ self.assertEqual(k, elem[0])
+ self.assertEqual(ik, elem[2])
+ dup.append(elem)
+ self.assertEqual(s, dup)
+
+ # Check nested and pickled
+ dup = []
+ for k, g in pickle.loads(pickle.dumps(groupby(s, testR))):
+ for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2))):
for elem in ig:
self.assertEqual(k, elem[0])
self.assertEqual(ik, elem[2])
dup.append(elem)
self.assertEqual(s, dup)
+
# Check case where inner iterator is not used
- keys = [k for k, g in groupby(s, lambda r:r[0])]
+ keys = [k for k, g in groupby(s, testR)]
expectedkeys = set([r[0] for r in s])
self.assertEqual(set(keys), expectedkeys)
self.assertEqual(len(keys), len(expectedkeys))
@@ -534,6 +702,20 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, filter, isEven, 3)
self.assertRaises(TypeError, next, filter(range(6), range(6)))
+ # check copy, deepcopy, pickle
+ ans = [0,2,4]
+
+ c = filter(isEven, range(6))
+ self.assertEqual(list(copy.copy(c)), ans)
+ c = filter(isEven, range(6))
+ self.assertEqual(list(copy.deepcopy(c)), ans)
+ c = filter(isEven, range(6))
+ self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans)
+ next(c)
+ self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans[1:])
+ c = filter(isEven, range(6))
+ self.pickletest(c)
+
def test_filterfalse(self):
self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5])
self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0])
@@ -544,6 +726,7 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7)
self.assertRaises(TypeError, filterfalse, isEven, 3)
self.assertRaises(TypeError, next, filterfalse(range(6), range(6)))
+ self.pickletest(filterfalse(isEven, range(6)))
def test_zip(self):
# XXX This is rather silly now that builtin zip() calls zip()...
@@ -556,16 +739,35 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(zip()), lzip())
self.assertRaises(TypeError, zip, 3)
self.assertRaises(TypeError, zip, range(3), 3)
- # Check tuple re-use (implementation detail)
self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')],
lzip('abc', 'def'))
self.assertEqual([pair for pair in zip('abc', 'def')],
lzip('abc', 'def'))
+
+ @support.impl_detail("tuple reuse is specific to CPython")
+ def test_zip_tuple_reuse(self):
ids = list(map(id, zip('abc', 'def')))
self.assertEqual(min(ids), max(ids))
ids = list(map(id, list(zip('abc', 'def'))))
self.assertEqual(len(dict.fromkeys(ids)), len(ids))
+ # check copy, deepcopy, pickle
+ ans = [(x,y) for x, y in copy.copy(zip('abc',count()))]
+ self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
+
+ ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))]
+ self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
+
+ ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count())))]
+ self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)])
+
+ testIntermediate = zip('abc',count())
+ next(testIntermediate)
+ ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate))]
+ self.assertEqual(ans, [('b', 1), ('c', 2)])
+
+ self.pickletest(zip('abc', count()))
+
def test_ziplongest(self):
for args in [
['abc', range(6)],
@@ -603,16 +805,24 @@ class TestBasicOps(unittest.TestCase):
else:
self.fail('Did not raise Type in: ' + stmt)
- # Check tuple re-use (implementation detail)
self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')],
list(zip('abc', 'def')))
self.assertEqual([pair for pair in zip_longest('abc', 'def')],
list(zip('abc', 'def')))
+
+ @support.impl_detail("tuple reuse is specific to CPython")
+ def test_zip_longest_tuple_reuse(self):
ids = list(map(id, zip_longest('abc', 'def')))
self.assertEqual(min(ids), max(ids))
ids = list(map(id, list(zip_longest('abc', 'def'))))
self.assertEqual(len(dict.fromkeys(ids)), len(ids))
+ def test_zip_longest_pickling(self):
+ self.pickletest(zip_longest("abc", "def"))
+ self.pickletest(zip_longest("abc", "defgh"))
+ self.pickletest(zip_longest("abc", "defgh", fillvalue=1))
+ self.pickletest(zip_longest("", "defgh"))
+
def test_bug_7244(self):
class Repeater:
@@ -711,10 +921,25 @@ class TestBasicOps(unittest.TestCase):
args = map(iter, args)
self.assertEqual(len(list(product(*args))), expected_len)
- # Test implementation detail: tuple re-use
+ @support.impl_detail("tuple reuse is specific to CPython")
+ def test_product_tuple_reuse(self):
self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1)
+ def test_product_pickling(self):
+ # check copy, deepcopy, pickle
+ for args, result in [
+ ([], [()]), # zero iterables
+ (['ab'], [('a',), ('b',)]), # one iterable
+ ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables
+ ([range(0), range(2), range(3)], []), # first iterable with zero length
+ ([range(2), range(0), range(3)], []), # middle iterable with zero length
+ ([range(2), range(3), range(0)], []), # last iterable with zero length
+ ]:
+ self.assertEqual(list(copy.copy(product(*args))), result)
+ self.assertEqual(list(copy.deepcopy(product(*args))), result)
+ self.pickletest(product(*args))
+
def test_repeat(self):
self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a'])
self.assertEqual(lzip(range(3),repeat('a')),
@@ -733,11 +958,16 @@ class TestBasicOps(unittest.TestCase):
list(r)
self.assertEqual(repr(r), 'repeat((1+0j), 0)')
+ # check copy, deepcopy, pickle
+ c = repeat(object='a', times=10)
+ self.assertEqual(next(c), 'a')
+ self.assertEqual(take(2, copy.copy(c)), list('a' * 2))
+ self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2))
+ self.pickletest(repeat(object='a', times=10))
+
def test_map(self):
self.assertEqual(list(map(operator.pow, range(3), range(1,7))),
[0**1, 1**2, 2**3])
- def tupleize(*args):
- return args
self.assertEqual(list(map(tupleize, 'abc', range(5))),
[('a',0),('b',1),('c',2)])
self.assertEqual(list(map(tupleize, 'abc', count())),
@@ -752,6 +982,18 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(ValueError, next, map(errfunc, [4], [5]))
self.assertRaises(TypeError, next, map(onearg, [4], [5]))
+ # check copy, deepcopy, pickle
+ ans = [('a',0),('b',1),('c',2)]
+
+ c = map(tupleize, 'abc', count())
+ self.assertEqual(list(copy.copy(c)), ans)
+
+ c = map(tupleize, 'abc', count())
+ self.assertEqual(list(copy.deepcopy(c)), ans)
+
+ c = map(tupleize, 'abc', count())
+ self.pickletest(c)
+
def test_starmap(self):
self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))),
[0**1, 1**2, 2**3])
@@ -766,6 +1008,18 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)]))
self.assertRaises(TypeError, next, starmap(onearg, [(4,5)]))
+ # check copy, deepcopy, pickle
+ ans = [0**1, 1**2, 2**3]
+
+ c = starmap(operator.pow, zip(range(3), range(1,7)))
+ self.assertEqual(list(copy.copy(c)), ans)
+
+ c = starmap(operator.pow, zip(range(3), range(1,7)))
+ self.assertEqual(list(copy.deepcopy(c)), ans)
+
+ c = starmap(operator.pow, zip(range(3), range(1,7)))
+ self.pickletest(c)
+
def test_islice(self):
for args in [ # islice(args) should agree with range(args)
(10, 20, 3),
@@ -798,17 +1052,18 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(it), list(range(3, 10)))
# Test invalid arguments
- self.assertRaises(TypeError, islice, range(10))
- self.assertRaises(TypeError, islice, range(10), 1, 2, 3, 4)
- self.assertRaises(ValueError, islice, range(10), -5, 10, 1)
- self.assertRaises(ValueError, islice, range(10), 1, -5, -1)
- self.assertRaises(ValueError, islice, range(10), 1, 10, -1)
- self.assertRaises(ValueError, islice, range(10), 1, 10, 0)
- self.assertRaises(ValueError, islice, range(10), 'a')
- self.assertRaises(ValueError, islice, range(10), 'a', 1)
- self.assertRaises(ValueError, islice, range(10), 1, 'a')
- self.assertRaises(ValueError, islice, range(10), 'a', 1, 1)
- self.assertRaises(ValueError, islice, range(10), 1, 'a', 1)
+ ra = range(10)
+ self.assertRaises(TypeError, islice, ra)
+ self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4)
+ self.assertRaises(ValueError, islice, ra, -5, 10, 1)
+ self.assertRaises(ValueError, islice, ra, 1, -5, -1)
+ self.assertRaises(ValueError, islice, ra, 1, 10, -1)
+ self.assertRaises(ValueError, islice, ra, 1, 10, 0)
+ self.assertRaises(ValueError, islice, ra, 'a')
+ self.assertRaises(ValueError, islice, ra, 'a', 1)
+ self.assertRaises(ValueError, islice, ra, 1, 'a')
+ self.assertRaises(ValueError, islice, ra, 'a', 1, 1)
+ self.assertRaises(ValueError, islice, ra, 1, 'a', 1)
self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1)
# Issue #10323: Less islice in a predictable state
@@ -816,9 +1071,22 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(islice(c, 1, 3, 50)), [1])
self.assertEqual(next(c), 3)
+ # check copy, deepcopy, pickle
+ for args in [ # islice(args) should agree with range(args)
+ (10, 20, 3),
+ (10, 3, 20),
+ (10, 20),
+ (10, 3),
+ (20,)
+ ]:
+ self.assertEqual(list(copy.copy(islice(range(100), *args))),
+ list(range(*args)))
+ self.assertEqual(list(copy.deepcopy(islice(range(100), *args))),
+ list(range(*args)))
+ self.pickletest(islice(range(100), *args))
+
def test_takewhile(self):
data = [1, 3, 5, 20, 2, 4, 6, 8]
- underten = lambda x: x<10
self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
self.assertEqual(list(takewhile(underten, [])), [])
self.assertRaises(TypeError, takewhile)
@@ -830,9 +1098,14 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(t), [1, 1, 1])
self.assertRaises(StopIteration, next, t)
+ # check copy, deepcopy, pickle
+ self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5])
+ self.assertEqual(list(copy.deepcopy(takewhile(underten, data))),
+ [1, 3, 5])
+ self.pickletest(takewhile(underten, data))
+
def test_dropwhile(self):
data = [1, 3, 5, 20, 2, 4, 6, 8]
- underten = lambda x: x<10
self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8])
self.assertEqual(list(dropwhile(underten, [])), [])
self.assertRaises(TypeError, dropwhile)
@@ -841,11 +1114,14 @@ class TestBasicOps(unittest.TestCase):
self.assertRaises(TypeError, next, dropwhile(10, [(4,5)]))
self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)]))
+ # check copy, deepcopy, pickle
+ self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8])
+ self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))),
+ [20, 2, 4, 6, 8])
+ self.pickletest(dropwhile(underten, data))
+
def test_tee(self):
n = 200
- def irange(n):
- for i in range(n):
- yield i
a, b = tee([]) # test empty iterator
self.assertEqual(list(a), [])
@@ -930,6 +1206,67 @@ class TestBasicOps(unittest.TestCase):
del a
self.assertRaises(ReferenceError, getattr, p, '__class__')
+ ans = list('abc')
+ long_ans = list(range(10000))
+
+ # check copy
+ a, b = tee('abc')
+ self.assertEqual(list(copy.copy(a)), ans)
+ self.assertEqual(list(copy.copy(b)), ans)
+ a, b = tee(list(range(10000)))
+ self.assertEqual(list(copy.copy(a)), long_ans)
+ self.assertEqual(list(copy.copy(b)), long_ans)
+
+ # check partially consumed copy
+ a, b = tee('abc')
+ take(2, a)
+ take(1, b)
+ self.assertEqual(list(copy.copy(a)), ans[2:])
+ self.assertEqual(list(copy.copy(b)), ans[1:])
+ self.assertEqual(list(a), ans[2:])
+ self.assertEqual(list(b), ans[1:])
+ a, b = tee(range(10000))
+ take(100, a)
+ take(60, b)
+ self.assertEqual(list(copy.copy(a)), long_ans[100:])
+ self.assertEqual(list(copy.copy(b)), long_ans[60:])
+ self.assertEqual(list(a), long_ans[100:])
+ self.assertEqual(list(b), long_ans[60:])
+
+ # check deepcopy
+ a, b = tee('abc')
+ self.assertEqual(list(copy.deepcopy(a)), ans)
+ self.assertEqual(list(copy.deepcopy(b)), ans)
+ self.assertEqual(list(a), ans)
+ self.assertEqual(list(b), ans)
+ a, b = tee(range(10000))
+ self.assertEqual(list(copy.deepcopy(a)), long_ans)
+ self.assertEqual(list(copy.deepcopy(b)), long_ans)
+ self.assertEqual(list(a), long_ans)
+ self.assertEqual(list(b), long_ans)
+
+ # check partially consumed deepcopy
+ a, b = tee('abc')
+ take(2, a)
+ take(1, b)
+ self.assertEqual(list(copy.deepcopy(a)), ans[2:])
+ self.assertEqual(list(copy.deepcopy(b)), ans[1:])
+ self.assertEqual(list(a), ans[2:])
+ self.assertEqual(list(b), ans[1:])
+ a, b = tee(range(10000))
+ take(100, a)
+ take(60, b)
+ self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
+ self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
+ self.assertEqual(list(a), long_ans[100:])
+ self.assertEqual(list(b), long_ans[60:])
+
+ # check pickle
+ self.pickletest(iter(tee('abc')))
+ a, b = tee('abc')
+ self.pickletest(a, compare=ans)
+ self.pickletest(b, compare=ans)
+
def test_StopIteration(self):
self.assertRaises(StopIteration, next, zip())
@@ -955,9 +1292,21 @@ class TestBasicOps(unittest.TestCase):
class TestExamples(unittest.TestCase):
- def test_accumlate(self):
+ def test_accumulate(self):
self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15])
+ def test_accumulate_reducible(self):
+ # check copy, deepcopy, pickle
+ data = [1, 2, 3, 4, 5]
+ accumulated = [1, 3, 6, 10, 15]
+ it = accumulate(data)
+
+ self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[:])
+ self.assertEqual(next(it), 1)
+ self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[1:])
+ self.assertEqual(list(copy.deepcopy(it)), accumulated[1:])
+ self.assertEqual(list(copy.copy(it)), accumulated[1:])
+
def test_chain(self):
self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF')
diff --git a/Lib/test/test_keywordonlyarg.py b/Lib/test/test_keywordonlyarg.py
index 108ed18..0503a7f 100644
--- a/Lib/test/test_keywordonlyarg.py
+++ b/Lib/test/test_keywordonlyarg.py
@@ -78,7 +78,7 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
pass
with self.assertRaises(TypeError) as exc:
f(1, 2, 3)
- expected = "f() takes at most 2 positional arguments (3 given)"
+ expected = "f() takes from 1 to 2 positional arguments but 3 were given"
self.assertEqual(str(exc.exception), expected)
def testSyntaxErrorForFunctionCall(self):
diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py
index 1afaf70..df4c37b 100644
--- a/Lib/test/test_lib2to3.py
+++ b/Lib/test/test_lib2to3.py
@@ -9,8 +9,8 @@ from test.support import run_unittest
def suite():
tests = unittest.TestSuite()
loader = unittest.TestLoader()
- for m in (test_fixers, test_pytree,test_util, test_refactor,
- test_parser, test_main_):
+ for m in (test_fixers, test_pytree, test_util, test_refactor, test_parser,
+ test_main_):
tests.addTests(loader.loadTestsFromModule(m))
return tests
diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py
index 84b8afe..5df27d3 100644
--- a/Lib/test/test_list.py
+++ b/Lib/test/test_list.py
@@ -1,5 +1,6 @@
import sys
from test import support, list_tests
+import pickle
class ListTest(list_tests.CommonTest):
type2test = list
@@ -69,6 +70,33 @@ class ListTest(list_tests.CommonTest):
check(10) # check our checking code
check(1000000)
+ def test_iterator_pickle(self):
+ # Userlist iterators don't support pickling yet since
+ # they are based on generators.
+ data = self.type2test([4, 5, 6, 7])
+ it = itorg = iter(data)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(self.type2test(it), self.type2test(data))
+
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(self.type2test(it), self.type2test(data)[1:])
+
+ def test_reversed_pickle(self):
+ data = self.type2test([4, 5, 6, 7])
+ it = itorg = reversed(data)
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(self.type2test(it), self.type2test(reversed(data)))
+
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(self.type2test(it), self.type2test(reversed(data))[1:])
def test_no_comdat_folding(self):
# Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 8f7574b..51a7bca 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -11,7 +11,7 @@ def get_enUS_locale():
if sys.platform == 'darwin':
import os
tlocs = ("en_US.UTF-8", "en_US.ISO8859-1", "en_US")
- if int(os.uname()[2].split('.')[0]) < 10:
+ if int(os.uname().release.split('.')[0]) < 10:
# The locale test work fine on OSX 10.6, I (ronaldoussoren)
# haven't had time yet to verify if tests work on OSX 10.5
# (10.4 is known to be bad)
@@ -401,6 +401,8 @@ class TestMiscellaneous(unittest.TestCase):
# Unsupported locale on this system
self.skipTest('test needs Turkish locale')
loc = locale.getlocale(locale.LC_CTYPE)
+ if verbose:
+ print('got locale %a' % (loc,))
locale.setlocale(locale.LC_CTYPE, loc)
self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE))
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 2d264f8..cb908fb 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -37,12 +37,11 @@ import random
import re
import select
import socket
-from socketserver import ThreadingTCPServer, StreamRequestHandler
import struct
import sys
import tempfile
-from test.support import captured_stdout, run_with_locale, run_unittest
-from test.support import TestHandler, Matcher
+from test.support import (captured_stdout, run_with_locale, run_unittest,
+ patch, requires_zlib, TestHandler, Matcher)
import textwrap
import time
import unittest
@@ -50,8 +49,31 @@ import warnings
import weakref
try:
import threading
+ # The following imports are needed only for tests which
+ # require threading
+ import asynchat
+ import asyncore
+ import errno
+ from http.server import HTTPServer, BaseHTTPRequestHandler
+ import smtpd
+ from urllib.parse import urlparse, parse_qs
+ from socketserver import (ThreadingUDPServer, DatagramRequestHandler,
+ ThreadingTCPServer, StreamRequestHandler)
except ImportError:
threading = None
+try:
+ import win32evtlog
+except ImportError:
+ win32evtlog = None
+try:
+ import win32evtlogutil
+except ImportError:
+ win32evtlogutil = None
+ win32evtlog = None
+try:
+ import zlib
+except ImportError:
+ pass
class BaseTest(unittest.TestCase):
@@ -79,9 +101,7 @@ class BaseTest(unittest.TestCase):
finally:
logging._releaseLock()
- # Set two unused loggers: one non-ASCII and one Unicode.
- # This is to test correct operation when sorting existing
- # loggers in the configuration code. See issue 8201.
+ # Set two unused loggers
self.logger1 = logging.getLogger("\xab\xd7\xbb")
self.logger2 = logging.getLogger("\u013f\u00d6\u0047")
@@ -142,8 +162,7 @@ class BaseTest(unittest.TestCase):
except AttributeError:
# StringIO.StringIO lacks a reset() method.
actual_lines = stream.getvalue().splitlines()
- self.assertEqual(len(actual_lines), len(expected_values),
- '%s vs. %s' % (actual_lines, expected_values))
+ self.assertEqual(len(actual_lines), len(expected_values))
for actual, expected in zip(actual_lines, expected_values):
match = pat.search(actual)
if not match:
@@ -181,17 +200,17 @@ class BuiltinLevelsTest(BaseTest):
INF.log(logging.CRITICAL, m())
INF.error(m())
- INF.warn(m())
+ INF.warning(m())
INF.info(m())
DEB.log(logging.CRITICAL, m())
DEB.error(m())
- DEB.warn (m())
- DEB.info (m())
+ DEB.warning(m())
+ DEB.info(m())
DEB.debug(m())
# These should not log.
- ERR.warn(m())
+ ERR.warning(m())
ERR.info(m())
ERR.debug(m())
@@ -225,7 +244,7 @@ class BuiltinLevelsTest(BaseTest):
INF_ERR.error(m())
# These should not log.
- INF_ERR.warn(m())
+ INF_ERR.warning(m())
INF_ERR.info(m())
INF_ERR.debug(m())
@@ -249,14 +268,14 @@ class BuiltinLevelsTest(BaseTest):
# These should log.
INF_UNDEF.log(logging.CRITICAL, m())
INF_UNDEF.error(m())
- INF_UNDEF.warn(m())
+ INF_UNDEF.warning(m())
INF_UNDEF.info(m())
INF_ERR_UNDEF.log(logging.CRITICAL, m())
INF_ERR_UNDEF.error(m())
# These should not log.
INF_UNDEF.debug(m())
- INF_ERR_UNDEF.warn(m())
+ INF_ERR_UNDEF.warning(m())
INF_ERR_UNDEF.info(m())
INF_ERR_UNDEF.debug(m())
@@ -295,8 +314,6 @@ class BuiltinLevelsTest(BaseTest):
('INF.BADPARENT', 'INFO', '4'),
])
- def test_invalid_name(self):
- self.assertRaises(TypeError, logging.getLogger, any)
class BasicFilterTest(BaseTest):
@@ -355,6 +372,10 @@ class BasicFilterTest(BaseTest):
finally:
handler.removeFilter(filterfunc)
+ def test_empty_filter(self):
+ f = logging.Filter()
+ r = logging.makeLogRecord({'name': 'spam.eggs'})
+ self.assertTrue(f.filter(r))
#
# First, we define our levels. There can be as many as you want - the only
@@ -498,6 +519,478 @@ class CustomLevelsAndFiltersTest(BaseTest):
handler.removeFilter(garr)
+class HandlerTest(BaseTest):
+ def test_name(self):
+ h = logging.Handler()
+ h.name = 'generic'
+ self.assertEqual(h.name, 'generic')
+ h.name = 'anothergeneric'
+ self.assertEqual(h.name, 'anothergeneric')
+ self.assertRaises(NotImplementedError, h.emit, None)
+
+ def test_builtin_handlers(self):
+ # We can't actually *use* too many handlers in the tests,
+ # but we can try instantiating them with various options
+ if sys.platform in ('linux', 'darwin'):
+ for existing in (True, False):
+ fd, fn = tempfile.mkstemp()
+ os.close(fd)
+ if not existing:
+ os.unlink(fn)
+ h = logging.handlers.WatchedFileHandler(fn, delay=True)
+ if existing:
+ dev, ino = h.dev, h.ino
+ self.assertEqual(dev, -1)
+ self.assertEqual(ino, -1)
+ r = logging.makeLogRecord({'msg': 'Test'})
+ h.handle(r)
+ # Now remove the file.
+ os.unlink(fn)
+ self.assertFalse(os.path.exists(fn))
+ # The next call should recreate the file.
+ h.handle(r)
+ self.assertTrue(os.path.exists(fn))
+ else:
+ self.assertEqual(h.dev, -1)
+ self.assertEqual(h.ino, -1)
+ h.close()
+ if existing:
+ os.unlink(fn)
+ if sys.platform == 'darwin':
+ sockname = '/var/run/syslog'
+ else:
+ sockname = '/dev/log'
+ try:
+ h = logging.handlers.SysLogHandler(sockname)
+ self.assertEqual(h.facility, h.LOG_USER)
+ self.assertTrue(h.unixsocket)
+ h.close()
+ except socket.error: # syslogd might not be available
+ pass
+ for method in ('GET', 'POST', 'PUT'):
+ if method == 'PUT':
+ self.assertRaises(ValueError, logging.handlers.HTTPHandler,
+ 'localhost', '/log', method)
+ else:
+ h = logging.handlers.HTTPHandler('localhost', '/log', method)
+ h.close()
+ h = logging.handlers.BufferingHandler(0)
+ r = logging.makeLogRecord({})
+ self.assertTrue(h.shouldFlush(r))
+ h.close()
+ h = logging.handlers.BufferingHandler(1)
+ self.assertFalse(h.shouldFlush(r))
+ h.close()
+
+ @unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.')
+ @unittest.skipUnless(threading, 'Threading required for this test.')
+ def test_race(self):
+ # Issue #14632 refers.
+ def remove_loop(fname, tries):
+ for _ in range(tries):
+ try:
+ os.unlink(fname)
+ except OSError:
+ pass
+ time.sleep(0.004 * random.randint(0, 4))
+
+ del_count = 500
+ log_count = 500
+
+ for delay in (False, True):
+ fd, fn = tempfile.mkstemp('.log', 'test_logging-3-')
+ os.close(fd)
+ remover = threading.Thread(target=remove_loop, args=(fn, del_count))
+ remover.daemon = True
+ remover.start()
+ h = logging.handlers.WatchedFileHandler(fn, delay=delay)
+ f = logging.Formatter('%(asctime)s: %(levelname)s: %(message)s')
+ h.setFormatter(f)
+ try:
+ for _ in range(log_count):
+ time.sleep(0.005)
+ r = logging.makeLogRecord({'msg': 'testing' })
+ h.handle(r)
+ finally:
+ remover.join()
+ h.close()
+ if os.path.exists(fn):
+ os.unlink(fn)
+
+
+class BadStream(object):
+ def write(self, data):
+ raise RuntimeError('deliberate mistake')
+
+class TestStreamHandler(logging.StreamHandler):
+ def handleError(self, record):
+ self.error_record = record
+
+class StreamHandlerTest(BaseTest):
+ def test_error_handling(self):
+ h = TestStreamHandler(BadStream())
+ r = logging.makeLogRecord({})
+ old_raise = logging.raiseExceptions
+ old_stderr = sys.stderr
+ try:
+ h.handle(r)
+ self.assertIs(h.error_record, r)
+ h = logging.StreamHandler(BadStream())
+ sys.stderr = sio = io.StringIO()
+ h.handle(r)
+ self.assertIn('\nRuntimeError: deliberate mistake\n',
+ sio.getvalue())
+ logging.raiseExceptions = False
+ sys.stderr = sio = io.StringIO()
+ h.handle(r)
+ self.assertEqual('', sio.getvalue())
+ finally:
+ logging.raiseExceptions = old_raise
+ sys.stderr = old_stderr
+
+# -- The following section could be moved into a server_helper.py module
+# -- if it proves to be of wider utility than just test_logging
+
+if threading:
+ class TestSMTPChannel(smtpd.SMTPChannel):
+ """
+ This derived class has had to be created because smtpd does not
+ support use of custom channel maps, although they are allowed by
+ asyncore's design. Issue #11959 has been raised to address this,
+ and if resolved satisfactorily, some of this code can be removed.
+ """
+ def __init__(self, server, conn, addr, sockmap):
+ asynchat.async_chat.__init__(self, conn, sockmap)
+ self.smtp_server = server
+ self.conn = conn
+ self.addr = addr
+ self.data_size_limit = None
+ self.received_lines = []
+ self.smtp_state = self.COMMAND
+ self.seen_greeting = ''
+ self.mailfrom = None
+ self.rcpttos = []
+ self.received_data = ''
+ self.fqdn = socket.getfqdn()
+ self.num_bytes = 0
+ try:
+ self.peer = conn.getpeername()
+ except socket.error as err:
+ # a race condition may occur if the other end is closing
+ # before we can get the peername
+ self.close()
+ if err.args[0] != errno.ENOTCONN:
+ raise
+ return
+ self.push('220 %s %s' % (self.fqdn, smtpd.__version__))
+ self.set_terminator(b'\r\n')
+ self.extended_smtp = False
+
+
+ class TestSMTPServer(smtpd.SMTPServer):
+ """
+ This class implements a test SMTP server.
+
+ :param addr: A (host, port) tuple which the server listens on.
+ You can specify a port value of zero: the server's
+ *port* attribute will hold the actual port number
+ used, which can be used in client connections.
+ :param handler: A callable which will be called to process
+ incoming messages. The handler will be passed
+ the client address tuple, who the message is from,
+ a list of recipients and the message data.
+ :param poll_interval: The interval, in seconds, used in the underlying
+ :func:`select` or :func:`poll` call by
+ :func:`asyncore.loop`.
+ :param sockmap: A dictionary which will be used to hold
+ :class:`asyncore.dispatcher` instances used by
+ :func:`asyncore.loop`. This avoids changing the
+ :mod:`asyncore` module's global state.
+ """
+ channel_class = TestSMTPChannel
+
+ def __init__(self, addr, handler, poll_interval, sockmap):
+ self._localaddr = addr
+ self._remoteaddr = None
+ self.data_size_limit = None
+ self.sockmap = sockmap
+ asyncore.dispatcher.__init__(self, map=sockmap)
+ try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.setblocking(0)
+ self.set_socket(sock, map=sockmap)
+ # try to re-use a server port if possible
+ self.set_reuse_addr()
+ self.bind(addr)
+ self.port = sock.getsockname()[1]
+ self.listen(5)
+ except:
+ self.close()
+ raise
+ self._handler = handler
+ self._thread = None
+ self.poll_interval = poll_interval
+
+ def handle_accepted(self, conn, addr):
+ """
+ Redefined only because the base class does not pass in a
+ map, forcing use of a global in :mod:`asyncore`.
+ """
+ channel = self.channel_class(self, conn, addr, self.sockmap)
+
+ def process_message(self, peer, mailfrom, rcpttos, data):
+ """
+ Delegates to the handler passed in to the server's constructor.
+
+ Typically, this will be a test case method.
+ :param peer: The client (host, port) tuple.
+ :param mailfrom: The address of the sender.
+ :param rcpttos: The addresses of the recipients.
+ :param data: The message.
+ """
+ self._handler(peer, mailfrom, rcpttos, data)
+
+ def start(self):
+ """
+ Start the server running on a separate daemon thread.
+ """
+ self._thread = t = threading.Thread(target=self.serve_forever,
+ args=(self.poll_interval,))
+ t.setDaemon(True)
+ t.start()
+
+ def serve_forever(self, poll_interval):
+ """
+ Run the :mod:`asyncore` loop until normal termination
+ conditions arise.
+ :param poll_interval: The interval, in seconds, used in the underlying
+ :func:`select` or :func:`poll` call by
+ :func:`asyncore.loop`.
+ """
+ try:
+ asyncore.loop(poll_interval, map=self.sockmap)
+ except select.error:
+ # On FreeBSD 8, closing the server repeatably
+ # raises this error. We swallow it if the
+ # server has been closed.
+ if self.connected or self.accepting:
+ raise
+
+ def stop(self, timeout=None):
+ """
+ Stop the thread by closing the server instance.
+ Wait for the server thread to terminate.
+
+ :param timeout: How long to wait for the server thread
+ to terminate.
+ """
+ self.close()
+ self._thread.join(timeout)
+ self._thread = None
+
+ class ControlMixin(object):
+ """
+ This mixin is used to start a server on a separate thread, and
+ shut it down programmatically. Request handling is simplified - instead
+ of needing to derive a suitable RequestHandler subclass, you just
+ provide a callable which will be passed each received request to be
+ processed.
+
+ :param handler: A handler callable which will be called with a
+ single parameter - the request - in order to
+ process the request. This handler is called on the
+ server thread, effectively meaning that requests are
+ processed serially. While not quite Web scale ;-),
+ this should be fine for testing applications.
+ :param poll_interval: The polling interval in seconds.
+ """
+ def __init__(self, handler, poll_interval):
+ self._thread = None
+ self.poll_interval = poll_interval
+ self._handler = handler
+ self.ready = threading.Event()
+
+ def start(self):
+ """
+ Create a daemon thread to run the server, and start it.
+ """
+ self._thread = t = threading.Thread(target=self.serve_forever,
+ args=(self.poll_interval,))
+ t.setDaemon(True)
+ t.start()
+
+ def serve_forever(self, poll_interval):
+ """
+ Run the server. Set the ready flag before entering the
+ service loop.
+ """
+ self.ready.set()
+ super(ControlMixin, self).serve_forever(poll_interval)
+
+ def stop(self, timeout=None):
+ """
+ Tell the server thread to stop, and wait for it to do so.
+
+ :param timeout: How long to wait for the server thread
+ to terminate.
+ """
+ self.shutdown()
+ if self._thread is not None:
+ self._thread.join(timeout)
+ self._thread = None
+ self.server_close()
+ self.ready.clear()
+
+ class TestHTTPServer(ControlMixin, HTTPServer):
+ """
+ An HTTP server which is controllable using :class:`ControlMixin`.
+
+ :param addr: A tuple with the IP address and port to listen on.
+ :param handler: A handler callable which will be called with a
+ single parameter - the request - in order to
+ process the request.
+ :param poll_interval: The polling interval in seconds.
+ :param log: Pass ``True`` to enable log messages.
+ """
+ def __init__(self, addr, handler, poll_interval=0.5,
+ log=False, sslctx=None):
+ class DelegatingHTTPRequestHandler(BaseHTTPRequestHandler):
+ def __getattr__(self, name, default=None):
+ if name.startswith('do_'):
+ return self.process_request
+ raise AttributeError(name)
+
+ def process_request(self):
+ self.server._handler(self)
+
+ def log_message(self, format, *args):
+ if log:
+ super(DelegatingHTTPRequestHandler,
+ self).log_message(format, *args)
+ HTTPServer.__init__(self, addr, DelegatingHTTPRequestHandler)
+ ControlMixin.__init__(self, handler, poll_interval)
+ self.sslctx = sslctx
+
+ def get_request(self):
+ try:
+ sock, addr = self.socket.accept()
+ if self.sslctx:
+ sock = self.sslctx.wrap_socket(sock, server_side=True)
+ except socket.error as e:
+ # socket errors are silenced by the caller, print them here
+ sys.stderr.write("Got an error:\n%s\n" % e)
+ raise
+ return sock, addr
+
+ class TestTCPServer(ControlMixin, ThreadingTCPServer):
+ """
+ A TCP server which is controllable using :class:`ControlMixin`.
+
+ :param addr: A tuple with the IP address and port to listen on.
+ :param handler: A handler callable which will be called with a single
+ parameter - the request - in order to process the request.
+ :param poll_interval: The polling interval in seconds.
+ :bind_and_activate: If True (the default), binds the server and starts it
+ listening. If False, you need to call
+ :meth:`server_bind` and :meth:`server_activate` at
+ some later time before calling :meth:`start`, so that
+ the server will set up the socket and listen on it.
+ """
+
+ allow_reuse_address = True
+
+ def __init__(self, addr, handler, poll_interval=0.5,
+ bind_and_activate=True):
+ class DelegatingTCPRequestHandler(StreamRequestHandler):
+
+ def handle(self):
+ self.server._handler(self)
+ ThreadingTCPServer.__init__(self, addr, DelegatingTCPRequestHandler,
+ bind_and_activate)
+ ControlMixin.__init__(self, handler, poll_interval)
+
+ def server_bind(self):
+ super(TestTCPServer, self).server_bind()
+ self.port = self.socket.getsockname()[1]
+
+ class TestUDPServer(ControlMixin, ThreadingUDPServer):
+ """
+ A UDP server which is controllable using :class:`ControlMixin`.
+
+ :param addr: A tuple with the IP address and port to listen on.
+ :param handler: A handler callable which will be called with a
+ single parameter - the request - in order to
+ process the request.
+ :param poll_interval: The polling interval for shutdown requests,
+ in seconds.
+ :bind_and_activate: If True (the default), binds the server and
+ starts it listening. If False, you need to
+ call :meth:`server_bind` and
+ :meth:`server_activate` at some later time
+ before calling :meth:`start`, so that the server will
+ set up the socket and listen on it.
+ """
+ def __init__(self, addr, handler, poll_interval=0.5,
+ bind_and_activate=True):
+ class DelegatingUDPRequestHandler(DatagramRequestHandler):
+
+ def handle(self):
+ self.server._handler(self)
+
+ def finish(self):
+ data = self.wfile.getvalue()
+ if data:
+ try:
+ super(DelegatingUDPRequestHandler, self).finish()
+ except socket.error:
+ if not self.server._closed:
+ raise
+
+ ThreadingUDPServer.__init__(self, addr,
+ DelegatingUDPRequestHandler,
+ bind_and_activate)
+ ControlMixin.__init__(self, handler, poll_interval)
+ self._closed = False
+
+ def server_bind(self):
+ super(TestUDPServer, self).server_bind()
+ self.port = self.socket.getsockname()[1]
+
+ def server_close(self):
+ super(TestUDPServer, self).server_close()
+ self._closed = True
+
+# - end of server_helper section
+
+@unittest.skipUnless(threading, 'Threading required for this test.')
+class SMTPHandlerTest(BaseTest):
+ def test_basic(self):
+ sockmap = {}
+ server = TestSMTPServer(('localhost', 0), self.process_message, 0.001,
+ sockmap)
+ server.start()
+ addr = ('localhost', server.port)
+ h = logging.handlers.SMTPHandler(addr, 'me', 'you', 'Log', timeout=5.0)
+ self.assertEqual(h.toaddrs, ['you'])
+ self.messages = []
+ r = logging.makeLogRecord({'msg': 'Hello'})
+ self.handled = threading.Event()
+ h.handle(r)
+ self.handled.wait(5.0) # 14314: don't wait forever
+ server.stop()
+ self.assertTrue(self.handled.is_set())
+ self.assertEqual(len(self.messages), 1)
+ peer, mailfrom, rcpttos, data = self.messages[0]
+ self.assertEqual(mailfrom, 'me')
+ self.assertEqual(rcpttos, ['you'])
+ self.assertIn('\nSubject: Log\n', data)
+ self.assertTrue(data.endswith('\n\nHello'))
+ h.close()
+
+ def process_message(self, *args):
+ self.messages.append(args)
+ self.handled.set()
+
class MemoryHandlerTest(BaseTest):
"""Tests for the MemoryHandler."""
@@ -525,7 +1018,7 @@ class MemoryHandlerTest(BaseTest):
self.mem_logger.info(self.next_message())
self.assert_log_lines([])
# This will flush because the level is >= logging.WARNING
- self.mem_logger.warn(self.next_message())
+ self.mem_logger.warning(self.next_message())
lines = [
('DEBUG', '1'),
('INFO', '2'),
@@ -870,116 +1363,280 @@ class ConfigFileTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
-class LogRecordStreamHandler(StreamRequestHandler):
- """Handler for a streaming logging request. It saves the log message in the
- TCP server's 'log_output' attribute."""
+@unittest.skipUnless(threading, 'Threading required for this test.')
+class SocketHandlerTest(BaseTest):
+
+ """Test for SocketHandler objects."""
+
+ def setUp(self):
+ """Set up a TCP server to receive log messages, and a SocketHandler
+ pointing to that server's address and port."""
+ BaseTest.setUp(self)
+ addr = ('localhost', 0)
+ self.server = server = TestTCPServer(addr, self.handle_socket,
+ 0.01)
+ server.start()
+ server.ready.wait()
+ self.sock_hdlr = logging.handlers.SocketHandler('localhost',
+ server.port)
+ self.log_output = ''
+ self.root_logger.removeHandler(self.root_logger.handlers[0])
+ self.root_logger.addHandler(self.sock_hdlr)
+ self.handled = threading.Semaphore(0)
- TCP_LOG_END = "!!!END!!!"
+ def tearDown(self):
+ """Shutdown the TCP server."""
+ try:
+ self.server.stop(2.0)
+ self.root_logger.removeHandler(self.sock_hdlr)
+ self.sock_hdlr.close()
+ finally:
+ BaseTest.tearDown(self)
- def handle(self):
- """Handle multiple requests - each expected to be of 4-byte length,
- followed by the LogRecord in pickle format. Logs the record
- according to whatever policy is configured locally."""
+ def handle_socket(self, request):
+ conn = request.connection
while True:
- chunk = self.connection.recv(4)
+ chunk = conn.recv(4)
if len(chunk) < 4:
break
slen = struct.unpack(">L", chunk)[0]
- chunk = self.connection.recv(slen)
+ chunk = conn.recv(slen)
while len(chunk) < slen:
- chunk = chunk + self.connection.recv(slen - len(chunk))
- obj = self.unpickle(chunk)
+ chunk = chunk + conn.recv(slen - len(chunk))
+ obj = pickle.loads(chunk)
record = logging.makeLogRecord(obj)
- self.handle_log_record(record)
+ self.log_output += record.msg + '\n'
+ self.handled.release()
- def unpickle(self, data):
- return pickle.loads(data)
+ def test_output(self):
+ # The log message sent to the SocketHandler is properly received.
+ logger = logging.getLogger("tcp")
+ logger.error("spam")
+ self.handled.acquire()
+ logger.debug("eggs")
+ self.handled.acquire()
+ self.assertEqual(self.log_output, "spam\neggs\n")
- def handle_log_record(self, record):
- # If the end-of-messages sentinel is seen, tell the server to
- # terminate.
- if self.TCP_LOG_END in record.msg:
- self.server.abort = 1
- return
- self.server.log_output += record.msg + "\n"
+ def test_noserver(self):
+ # Kill the server
+ self.server.stop(2.0)
+ #The logging call should try to connect, which should fail
+ try:
+ raise RuntimeError('Deliberate mistake')
+ except RuntimeError:
+ self.root_logger.exception('Never sent')
+ self.root_logger.error('Never sent, either')
+ now = time.time()
+ self.assertTrue(self.sock_hdlr.retryTime > now)
+ time.sleep(self.sock_hdlr.retryTime - now + 0.001)
+ self.root_logger.error('Nor this')
-class LogRecordSocketReceiver(ThreadingTCPServer):
+@unittest.skipUnless(threading, 'Threading required for this test.')
+class DatagramHandlerTest(BaseTest):
- """A simple-minded TCP socket-based logging receiver suitable for test
- purposes."""
+ """Test for DatagramHandler."""
- allow_reuse_address = 1
- log_output = ""
+ def setUp(self):
+ """Set up a UDP server to receive log messages, and a DatagramHandler
+ pointing to that server's address and port."""
+ BaseTest.setUp(self)
+ addr = ('localhost', 0)
+ self.server = server = TestUDPServer(addr, self.handle_datagram, 0.01)
+ server.start()
+ server.ready.wait()
+ self.sock_hdlr = logging.handlers.DatagramHandler('localhost',
+ server.port)
+ self.log_output = ''
+ self.root_logger.removeHandler(self.root_logger.handlers[0])
+ self.root_logger.addHandler(self.sock_hdlr)
+ self.handled = threading.Event()
- def __init__(self, host='localhost',
- port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
- handler=LogRecordStreamHandler):
- ThreadingTCPServer.__init__(self, (host, port), handler)
- self.abort = False
- self.timeout = 0.1
- self.finished = threading.Event()
+ def tearDown(self):
+ """Shutdown the UDP server."""
+ try:
+ self.server.stop(2.0)
+ self.root_logger.removeHandler(self.sock_hdlr)
+ self.sock_hdlr.close()
+ finally:
+ BaseTest.tearDown(self)
- def serve_until_stopped(self):
- while not self.abort:
- rd, wr, ex = select.select([self.socket.fileno()], [], [],
- self.timeout)
- if rd:
- self.handle_request()
- # Notify the main thread that we're about to exit
- self.finished.set()
- # close the listen socket
- self.server_close()
+ def handle_datagram(self, request):
+ slen = struct.pack('>L', 0) # length of prefix
+ packet = request.packet[len(slen):]
+ obj = pickle.loads(packet)
+ record = logging.makeLogRecord(obj)
+ self.log_output += record.msg + '\n'
+ self.handled.set()
+
+ def test_output(self):
+ # The log message sent to the DatagramHandler is properly received.
+ logger = logging.getLogger("udp")
+ logger.error("spam")
+ self.handled.wait()
+ self.handled.clear()
+ logger.error("eggs")
+ self.handled.wait()
+ self.assertEqual(self.log_output, "spam\neggs\n")
@unittest.skipUnless(threading, 'Threading required for this test.')
-class SocketHandlerTest(BaseTest):
+class SysLogHandlerTest(BaseTest):
- """Test for SocketHandler objects."""
+ """Test for SysLogHandler using UDP."""
def setUp(self):
- """Set up a TCP server to receive log messages, and a SocketHandler
+ """Set up a UDP server to receive log messages, and a SysLogHandler
pointing to that server's address and port."""
BaseTest.setUp(self)
- self.tcpserver = LogRecordSocketReceiver(port=0)
- self.port = self.tcpserver.socket.getsockname()[1]
- self.threads = [
- threading.Thread(target=self.tcpserver.serve_until_stopped)]
- for thread in self.threads:
- thread.start()
-
- self.sock_hdlr = logging.handlers.SocketHandler('localhost', self.port)
- self.sock_hdlr.setFormatter(self.root_formatter)
+ addr = ('localhost', 0)
+ self.server = server = TestUDPServer(addr, self.handle_datagram,
+ 0.01)
+ server.start()
+ server.ready.wait()
+ self.sl_hdlr = logging.handlers.SysLogHandler(('localhost',
+ server.port))
+ self.log_output = ''
self.root_logger.removeHandler(self.root_logger.handlers[0])
- self.root_logger.addHandler(self.sock_hdlr)
+ self.root_logger.addHandler(self.sl_hdlr)
+ self.handled = threading.Event()
def tearDown(self):
- """Shutdown the TCP server."""
+ """Shutdown the UDP server."""
try:
- self.tcpserver.abort = True
- del self.tcpserver
- self.root_logger.removeHandler(self.sock_hdlr)
- self.sock_hdlr.close()
- for thread in self.threads:
- thread.join(2.0)
+ self.server.stop(2.0)
+ self.root_logger.removeHandler(self.sl_hdlr)
+ self.sl_hdlr.close()
finally:
BaseTest.tearDown(self)
- def get_output(self):
- """Get the log output as received by the TCP server."""
- # Signal the TCP receiver and wait for it to terminate.
- self.root_logger.critical(LogRecordStreamHandler.TCP_LOG_END)
- self.tcpserver.finished.wait(2.0)
- return self.tcpserver.log_output
+ def handle_datagram(self, request):
+ self.log_output = request.packet
+ self.handled.set()
def test_output(self):
- # The log message sent to the SocketHandler is properly received.
- logger = logging.getLogger("tcp")
- logger.error("spam")
- logger.debug("eggs")
- self.assertEqual(self.get_output(), "spam\neggs\n")
+ # The log message sent to the SysLogHandler is properly received.
+ logger = logging.getLogger("slh")
+ logger.error("sp\xe4m")
+ self.handled.wait()
+ self.assertEqual(self.log_output, b'<11>sp\xc3\xa4m\x00')
+ self.handled.clear()
+ self.sl_hdlr.append_nul = False
+ logger.error("sp\xe4m")
+ self.handled.wait()
+ self.assertEqual(self.log_output, b'<11>sp\xc3\xa4m')
+ self.handled.clear()
+ self.sl_hdlr.ident = "h\xe4m-"
+ logger.error("sp\xe4m")
+ self.handled.wait()
+ self.assertEqual(self.log_output, b'<11>h\xc3\xa4m-sp\xc3\xa4m')
+
+
+@unittest.skipUnless(threading, 'Threading required for this test.')
+class HTTPHandlerTest(BaseTest):
+ """Test for HTTPHandler."""
+
+ PEMFILE = """-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDGT4xS5r91rbLJQK2nUDenBhBG6qFk+bVOjuAGC/LSHlAoBnvG
+zQG3agOG+e7c5z2XT8m2ktORLqG3E4mYmbxgyhDrzP6ei2Anc+pszmnxPoK3Puh5
+aXV+XKt0bU0C1m2+ACmGGJ0t3P408art82nOxBw8ZHgIg9Dtp6xIUCyOqwIDAQAB
+AoGBAJFTnFboaKh5eUrIzjmNrKsG44jEyy+vWvHN/FgSC4l103HxhmWiuL5Lv3f7
+0tMp1tX7D6xvHwIG9VWvyKb/Cq9rJsDibmDVIOslnOWeQhG+XwJyitR0pq/KlJIB
+5LjORcBw795oKWOAi6RcOb1ON59tysEFYhAGQO9k6VL621gRAkEA/Gb+YXULLpbs
+piXN3q4zcHzeaVANo69tUZ6TjaQqMeTxE4tOYM0G0ZoSeHEdaP59AOZGKXXNGSQy
+2z/MddcYGQJBAMkjLSYIpOLJY11ja8OwwswFG2hEzHe0cS9bzo++R/jc1bHA5R0Y
+i6vA5iPi+wopPFvpytdBol7UuEBe5xZrxWMCQQCWxELRHiP2yWpEeLJ3gGDzoXMN
+PydWjhRju7Bx3AzkTtf+D6lawz1+eGTuEss5i0JKBkMEwvwnN2s1ce+EuF4JAkBb
+E96h1lAzkVW5OAfYOPY8RCPA90ZO/hoyg7PpSxR0ECuDrgERR8gXIeYUYfejBkEa
+rab4CfRoVJKKM28Yq/xZAkBvuq670JRCwOgfUTdww7WpdOQBYPkzQccsKNCslQW8
+/DyW6y06oQusSENUvynT6dr3LJxt/NgZPhZX2+k1eYDV
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIICGzCCAYSgAwIBAgIJAIq84a2Q/OvlMA0GCSqGSIb3DQEBBQUAMBQxEjAQBgNV
+BAMTCWxvY2FsaG9zdDAeFw0xMTA1MjExMDIzMzNaFw03NTAzMjEwMzU1MTdaMBQx
+EjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
+xk+MUua/da2yyUCtp1A3pwYQRuqhZPm1To7gBgvy0h5QKAZ7xs0Bt2oDhvnu3Oc9
+l0/JtpLTkS6htxOJmJm8YMoQ68z+notgJ3PqbM5p8T6Ctz7oeWl1flyrdG1NAtZt
+vgAphhidLdz+NPGq7fNpzsQcPGR4CIPQ7aesSFAsjqsCAwEAAaN1MHMwHQYDVR0O
+BBYEFLWaUPO6N7efGiuoS9i3DVYcUwn0MEQGA1UdIwQ9MDuAFLWaUPO6N7efGiuo
+S9i3DVYcUwn0oRikFjAUMRIwEAYDVQQDEwlsb2NhbGhvc3SCCQCKvOGtkPzr5TAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAMK5whPjLNQK1Ivvk88oqJqq
+4f889OwikGP0eUhOBhbFlsZs+jq5YZC2UzHz+evzKBlgAP1u4lP/cB85CnjvWqM+
+1c/lywFHQ6HOdDeQ1L72tSYMrNOG4XNmLn0h7rx6GoTU7dcFRfseahBCq8mv0IDt
+IRbTpvlHWPjsSvHz0ZOH
+-----END CERTIFICATE-----"""
+
+ def setUp(self):
+ """Set up an HTTP server to receive log messages, and a HTTPHandler
+ pointing to that server's address and port."""
+ BaseTest.setUp(self)
+ self.handled = threading.Event()
+ def handle_request(self, request):
+ self.command = request.command
+ self.log_data = urlparse(request.path)
+ if self.command == 'POST':
+ try:
+ rlen = int(request.headers['Content-Length'])
+ self.post_data = request.rfile.read(rlen)
+ except:
+ self.post_data = None
+ request.send_response(200)
+ request.end_headers()
+ self.handled.set()
+
+ def test_output(self):
+ # The log message sent to the HTTPHandler is properly received.
+ logger = logging.getLogger("http")
+ root_logger = self.root_logger
+ root_logger.removeHandler(self.root_logger.handlers[0])
+ for secure in (False, True):
+ addr = ('localhost', 0)
+ if secure:
+ try:
+ import ssl
+ fd, fn = tempfile.mkstemp()
+ os.close(fd)
+ with open(fn, 'w') as f:
+ f.write(self.PEMFILE)
+ sslctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+ sslctx.load_cert_chain(fn)
+ os.unlink(fn)
+ except ImportError:
+ sslctx = None
+ else:
+ sslctx = None
+ self.server = server = TestHTTPServer(addr, self.handle_request,
+ 0.01, sslctx=sslctx)
+ server.start()
+ server.ready.wait()
+ host = 'localhost:%d' % server.server_port
+ secure_client = secure and sslctx
+ self.h_hdlr = logging.handlers.HTTPHandler(host, '/frob',
+ secure=secure_client)
+ self.log_data = None
+ root_logger.addHandler(self.h_hdlr)
+
+ for method in ('GET', 'POST'):
+ self.h_hdlr.method = method
+ self.handled.clear()
+ msg = "sp\xe4m"
+ logger.error(msg)
+ self.handled.wait()
+ self.assertEqual(self.log_data.path, '/frob')
+ self.assertEqual(self.command, method)
+ if method == 'GET':
+ d = parse_qs(self.log_data.query)
+ else:
+ d = parse_qs(self.post_data.decode('utf-8'))
+ self.assertEqual(d['name'], ['http'])
+ self.assertEqual(d['funcName'], ['test_output'])
+ self.assertEqual(d['msg'], [msg])
+
+ self.server.stop(2.0)
+ self.root_logger.removeHandler(self.h_hdlr)
+ self.h_hdlr.close()
class MemoryTest(BaseTest):
@@ -1087,28 +1744,39 @@ class WarningsTest(BaseTest):
def test_warnings(self):
with warnings.catch_warnings():
logging.captureWarnings(True)
- try:
- warnings.filterwarnings("always", category=UserWarning)
- file = io.StringIO()
- h = logging.StreamHandler(file)
- logger = logging.getLogger("py.warnings")
- logger.addHandler(h)
- warnings.warn("I'm warning you...")
- logger.removeHandler(h)
- s = file.getvalue()
- h.close()
- self.assertTrue(s.find("UserWarning: I'm warning you...\n") > 0)
-
- #See if an explicit file uses the original implementation
- file = io.StringIO()
- warnings.showwarning("Explicit", UserWarning, "dummy.py", 42,
- file, "Dummy line")
- s = file.getvalue()
- file.close()
- self.assertEqual(s,
- "dummy.py:42: UserWarning: Explicit\n Dummy line\n")
- finally:
- logging.captureWarnings(False)
+ self.addCleanup(logging.captureWarnings, False)
+ warnings.filterwarnings("always", category=UserWarning)
+ stream = io.StringIO()
+ h = logging.StreamHandler(stream)
+ logger = logging.getLogger("py.warnings")
+ logger.addHandler(h)
+ warnings.warn("I'm warning you...")
+ logger.removeHandler(h)
+ s = stream.getvalue()
+ h.close()
+ self.assertTrue(s.find("UserWarning: I'm warning you...\n") > 0)
+
+ #See if an explicit file uses the original implementation
+ a_file = io.StringIO()
+ warnings.showwarning("Explicit", UserWarning, "dummy.py", 42,
+ a_file, "Dummy line")
+ s = a_file.getvalue()
+ a_file.close()
+ self.assertEqual(s,
+ "dummy.py:42: UserWarning: Explicit\n Dummy line\n")
+
+ def test_warnings_no_handlers(self):
+ with warnings.catch_warnings():
+ logging.captureWarnings(True)
+ self.addCleanup(logging.captureWarnings, False)
+
+ # confirm our assumption: no loggers are set
+ logger = logging.getLogger("py.warnings")
+ self.assertEqual(logger.handlers, [])
+
+ warnings.showwarning("Explicit", UserWarning, "dummy.py", 42)
+ self.assertEqual(len(logger.handlers), 1)
+ self.assertIsInstance(logger.handlers[0], logging.NullHandler)
def formatFunc(format, datefmt=None):
@@ -1961,6 +2629,7 @@ class ConfigDictTest(BaseTest):
logging.config.stopListening()
t.join(2.0)
+ @unittest.skipUnless(threading, 'Threading required for this test.')
def test_listen_config_10_ok(self):
with captured_stdout() as output:
self.setup_via_listener(json.dumps(self.config10))
@@ -1980,6 +2649,7 @@ class ConfigDictTest(BaseTest):
('ERROR', '4'),
], stream=output)
+ @unittest.skipUnless(threading, 'Threading required for this test.')
def test_listen_config_1_ok(self):
with captured_stdout() as output:
self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1))
@@ -1994,6 +2664,27 @@ class ConfigDictTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
+ def test_baseconfig(self):
+ d = {
+ 'atuple': (1, 2, 3),
+ 'alist': ['a', 'b', 'c'],
+ 'adict': {'d': 'e', 'f': 3 },
+ 'nest1': ('g', ('h', 'i'), 'j'),
+ 'nest2': ['k', ['l', 'm'], 'n'],
+ 'nest3': ['o', 'cfg://alist', 'p'],
+ }
+ bc = logging.config.BaseConfigurator(d)
+ self.assertEqual(bc.convert('cfg://atuple[1]'), 2)
+ self.assertEqual(bc.convert('cfg://alist[1]'), 'b')
+ self.assertEqual(bc.convert('cfg://nest1[1][0]'), 'h')
+ self.assertEqual(bc.convert('cfg://nest2[1][1]'), 'm')
+ self.assertEqual(bc.convert('cfg://adict.d'), 'e')
+ self.assertEqual(bc.convert('cfg://adict[f]'), 3)
+ v = bc.convert('cfg://nest3')
+ self.assertEqual(v.pop(1), ['a', 'b', 'c'])
+ self.assertRaises(KeyError, bc.convert, 'cfg://nosuch')
+ self.assertRaises(ValueError, bc.convert, 'cfg://!')
+ self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]')
class ManagerTest(BaseTest):
def test_manager_loggerclass(self):
@@ -2012,6 +2703,11 @@ class ManagerTest(BaseTest):
self.assertEqual(logged, ['should appear in logged'])
+ def test_set_log_record_factory(self):
+ man = logging.Manager(None)
+ expected = object()
+ man.setLogRecordFactory(expected)
+ self.assertEqual(man.logRecordFactory, expected)
class ChildLoggerTest(BaseTest):
def test_child_loggers(self):
@@ -2113,6 +2809,18 @@ class QueueHandlerTest(BaseTest):
self.assertTrue(handler.matches(levelno=logging.ERROR, message='2'))
self.assertTrue(handler.matches(levelno=logging.CRITICAL, message='3'))
+ZERO = datetime.timedelta(0)
+
+class UTC(datetime.tzinfo):
+ def utcoffset(self, dt):
+ return ZERO
+
+ dst = utcoffset
+
+ def tzname(self, dt):
+ return 'UTC'
+
+utc = UTC()
class FormatterTest(unittest.TestCase):
def setUp(self):
@@ -2186,6 +2894,71 @@ class FormatterTest(unittest.TestCase):
f = logging.Formatter('asctime', style='$')
self.assertFalse(f.usesTime())
+ def test_invalid_style(self):
+ self.assertRaises(ValueError, logging.Formatter, None, None, 'x')
+
+ def test_time(self):
+ r = self.get_record()
+ dt = datetime.datetime(1993, 4, 21, 8, 3, 0, 0, utc)
+ # We use None to indicate we want the local timezone
+ # We're essentially converting a UTC time to local time
+ r.created = time.mktime(dt.astimezone(None).timetuple())
+ r.msecs = 123
+ f = logging.Formatter('%(asctime)s %(message)s')
+ f.converter = time.gmtime
+ self.assertEqual(f.formatTime(r), '1993-04-21 08:03:00,123')
+ self.assertEqual(f.formatTime(r, '%Y:%d'), '1993:21')
+ f.format(r)
+ self.assertEqual(r.asctime, '1993-04-21 08:03:00,123')
+
+class TestBufferingFormatter(logging.BufferingFormatter):
+ def formatHeader(self, records):
+ return '[(%d)' % len(records)
+
+ def formatFooter(self, records):
+ return '(%d)]' % len(records)
+
+class BufferingFormatterTest(unittest.TestCase):
+ def setUp(self):
+ self.records = [
+ logging.makeLogRecord({'msg': 'one'}),
+ logging.makeLogRecord({'msg': 'two'}),
+ ]
+
+ def test_default(self):
+ f = logging.BufferingFormatter()
+ self.assertEqual('', f.format([]))
+ self.assertEqual('onetwo', f.format(self.records))
+
+ def test_custom(self):
+ f = TestBufferingFormatter()
+ self.assertEqual('[(2)onetwo(2)]', f.format(self.records))
+ lf = logging.Formatter('<%(message)s>')
+ f = TestBufferingFormatter(lf)
+ self.assertEqual('[(2)<one><two>(2)]', f.format(self.records))
+
+class ExceptionTest(BaseTest):
+ def test_formatting(self):
+ r = self.root_logger
+ h = RecordingHandler()
+ r.addHandler(h)
+ try:
+ raise RuntimeError('deliberate mistake')
+ except:
+ logging.exception('failed', stack_info=True)
+ r.removeHandler(h)
+ h.close()
+ r = h.records[0]
+ self.assertTrue(r.exc_text.startswith('Traceback (most recent '
+ 'call last):\n'))
+ self.assertTrue(r.exc_text.endswith('\nRuntimeError: '
+ 'deliberate mistake'))
+ self.assertTrue(r.stack_info.startswith('Stack (most recent '
+ 'call last):\n'))
+ self.assertTrue(r.stack_info.endswith('logging.exception(\'failed\', '
+ 'stack_info=True)'))
+
+
class LastResortTest(BaseTest):
def test_last_resort(self):
# Test the last resort handler
@@ -2196,6 +2969,8 @@ class LastResortTest(BaseTest):
old_raise_exceptions = logging.raiseExceptions
try:
sys.stderr = sio = io.StringIO()
+ root.debug('This should not appear')
+ self.assertEqual(sio.getvalue(), '')
root.warning('This is your final chance!')
self.assertEqual(sio.getvalue(), 'This is your final chance!\n')
#No handlers and no last resort, so 'No handlers' message
@@ -2220,6 +2995,586 @@ class LastResortTest(BaseTest):
logging.raiseExceptions = old_raise_exceptions
+class FakeHandler:
+
+ def __init__(self, identifier, called):
+ for method in ('acquire', 'flush', 'close', 'release'):
+ setattr(self, method, self.record_call(identifier, method, called))
+
+ def record_call(self, identifier, method_name, called):
+ def inner():
+ called.append('{} - {}'.format(identifier, method_name))
+ return inner
+
+
+class RecordingHandler(logging.NullHandler):
+
+ def __init__(self, *args, **kwargs):
+ super(RecordingHandler, self).__init__(*args, **kwargs)
+ self.records = []
+
+ def handle(self, record):
+ """Keep track of all the emitted records."""
+ self.records.append(record)
+
+
+class ShutdownTest(BaseTest):
+
+ """Test suite for the shutdown method."""
+
+ def setUp(self):
+ super(ShutdownTest, self).setUp()
+ self.called = []
+
+ raise_exceptions = logging.raiseExceptions
+ self.addCleanup(setattr, logging, 'raiseExceptions', raise_exceptions)
+
+ def raise_error(self, error):
+ def inner():
+ raise error()
+ return inner
+
+ def test_no_failure(self):
+ # create some fake handlers
+ handler0 = FakeHandler(0, self.called)
+ handler1 = FakeHandler(1, self.called)
+ handler2 = FakeHandler(2, self.called)
+
+ # create live weakref to those handlers
+ handlers = map(logging.weakref.ref, [handler0, handler1, handler2])
+
+ logging.shutdown(handlerList=list(handlers))
+
+ expected = ['2 - acquire', '2 - flush', '2 - close', '2 - release',
+ '1 - acquire', '1 - flush', '1 - close', '1 - release',
+ '0 - acquire', '0 - flush', '0 - close', '0 - release']
+ self.assertEqual(expected, self.called)
+
+ def _test_with_failure_in_method(self, method, error):
+ handler = FakeHandler(0, self.called)
+ setattr(handler, method, self.raise_error(error))
+ handlers = [logging.weakref.ref(handler)]
+
+ logging.shutdown(handlerList=list(handlers))
+
+ self.assertEqual('0 - release', self.called[-1])
+
+ def test_with_ioerror_in_acquire(self):
+ self._test_with_failure_in_method('acquire', IOError)
+
+ def test_with_ioerror_in_flush(self):
+ self._test_with_failure_in_method('flush', IOError)
+
+ def test_with_ioerror_in_close(self):
+ self._test_with_failure_in_method('close', IOError)
+
+ def test_with_valueerror_in_acquire(self):
+ self._test_with_failure_in_method('acquire', ValueError)
+
+ def test_with_valueerror_in_flush(self):
+ self._test_with_failure_in_method('flush', ValueError)
+
+ def test_with_valueerror_in_close(self):
+ self._test_with_failure_in_method('close', ValueError)
+
+ def test_with_other_error_in_acquire_without_raise(self):
+ logging.raiseExceptions = False
+ self._test_with_failure_in_method('acquire', IndexError)
+
+ def test_with_other_error_in_flush_without_raise(self):
+ logging.raiseExceptions = False
+ self._test_with_failure_in_method('flush', IndexError)
+
+ def test_with_other_error_in_close_without_raise(self):
+ logging.raiseExceptions = False
+ self._test_with_failure_in_method('close', IndexError)
+
+ def test_with_other_error_in_acquire_with_raise(self):
+ logging.raiseExceptions = True
+ self.assertRaises(IndexError, self._test_with_failure_in_method,
+ 'acquire', IndexError)
+
+ def test_with_other_error_in_flush_with_raise(self):
+ logging.raiseExceptions = True
+ self.assertRaises(IndexError, self._test_with_failure_in_method,
+ 'flush', IndexError)
+
+ def test_with_other_error_in_close_with_raise(self):
+ logging.raiseExceptions = True
+ self.assertRaises(IndexError, self._test_with_failure_in_method,
+ 'close', IndexError)
+
+
+class ModuleLevelMiscTest(BaseTest):
+
+ """Test suite for some module level methods."""
+
+ def test_disable(self):
+ old_disable = logging.root.manager.disable
+ # confirm our assumptions are correct
+ self.assertEqual(old_disable, 0)
+ self.addCleanup(logging.disable, old_disable)
+
+ logging.disable(83)
+ self.assertEqual(logging.root.manager.disable, 83)
+
+ def _test_log(self, method, level=None):
+ called = []
+ patch(self, logging, 'basicConfig',
+ lambda *a, **kw: called.append((a, kw)))
+
+ recording = RecordingHandler()
+ logging.root.addHandler(recording)
+
+ log_method = getattr(logging, method)
+ if level is not None:
+ log_method(level, "test me: %r", recording)
+ else:
+ log_method("test me: %r", recording)
+
+ self.assertEqual(len(recording.records), 1)
+ record = recording.records[0]
+ self.assertEqual(record.getMessage(), "test me: %r" % recording)
+
+ expected_level = level if level is not None else getattr(logging, method.upper())
+ self.assertEqual(record.levelno, expected_level)
+
+ # basicConfig was not called!
+ self.assertEqual(called, [])
+
+ def test_log(self):
+ self._test_log('log', logging.ERROR)
+
+ def test_debug(self):
+ self._test_log('debug')
+
+ def test_info(self):
+ self._test_log('info')
+
+ def test_warning(self):
+ self._test_log('warning')
+
+ def test_error(self):
+ self._test_log('error')
+
+ def test_critical(self):
+ self._test_log('critical')
+
+ def test_set_logger_class(self):
+ self.assertRaises(TypeError, logging.setLoggerClass, object)
+
+ class MyLogger(logging.Logger):
+ pass
+
+ logging.setLoggerClass(MyLogger)
+ self.assertEqual(logging.getLoggerClass(), MyLogger)
+
+ logging.setLoggerClass(logging.Logger)
+ self.assertEqual(logging.getLoggerClass(), logging.Logger)
+
+class LogRecordTest(BaseTest):
+ def test_str_rep(self):
+ r = logging.makeLogRecord({})
+ s = str(r)
+ self.assertTrue(s.startswith('<LogRecord: '))
+ self.assertTrue(s.endswith('>'))
+
+ def test_dict_arg(self):
+ h = RecordingHandler()
+ r = logging.getLogger()
+ r.addHandler(h)
+ d = {'less' : 'more' }
+ logging.warning('less is %(less)s', d)
+ self.assertIs(h.records[0].args, d)
+ self.assertEqual(h.records[0].message, 'less is more')
+ r.removeHandler(h)
+ h.close()
+
+ def test_multiprocessing(self):
+ r = logging.makeLogRecord({})
+ self.assertEqual(r.processName, 'MainProcess')
+ try:
+ import multiprocessing as mp
+ r = logging.makeLogRecord({})
+ self.assertEqual(r.processName, mp.current_process().name)
+ except ImportError:
+ pass
+
+ def test_optional(self):
+ r = logging.makeLogRecord({})
+ NOT_NONE = self.assertIsNotNone
+ if threading:
+ NOT_NONE(r.thread)
+ NOT_NONE(r.threadName)
+ NOT_NONE(r.process)
+ NOT_NONE(r.processName)
+ log_threads = logging.logThreads
+ log_processes = logging.logProcesses
+ log_multiprocessing = logging.logMultiprocessing
+ try:
+ logging.logThreads = False
+ logging.logProcesses = False
+ logging.logMultiprocessing = False
+ r = logging.makeLogRecord({})
+ NONE = self.assertIsNone
+ NONE(r.thread)
+ NONE(r.threadName)
+ NONE(r.process)
+ NONE(r.processName)
+ finally:
+ logging.logThreads = log_threads
+ logging.logProcesses = log_processes
+ logging.logMultiprocessing = log_multiprocessing
+
+class BasicConfigTest(unittest.TestCase):
+
+ """Test suite for logging.basicConfig."""
+
+ def setUp(self):
+ super(BasicConfigTest, self).setUp()
+ self.handlers = logging.root.handlers
+ self.saved_handlers = logging._handlers.copy()
+ self.saved_handler_list = logging._handlerList[:]
+ self.original_logging_level = logging.root.level
+ self.addCleanup(self.cleanup)
+ logging.root.handlers = []
+
+ def tearDown(self):
+ for h in logging.root.handlers[:]:
+ logging.root.removeHandler(h)
+ h.close()
+ super(BasicConfigTest, self).tearDown()
+
+ def cleanup(self):
+ setattr(logging.root, 'handlers', self.handlers)
+ logging._handlers.clear()
+ logging._handlers.update(self.saved_handlers)
+ logging._handlerList[:] = self.saved_handler_list
+ logging.root.level = self.original_logging_level
+
+ def test_no_kwargs(self):
+ logging.basicConfig()
+
+ # handler defaults to a StreamHandler to sys.stderr
+ self.assertEqual(len(logging.root.handlers), 1)
+ handler = logging.root.handlers[0]
+ self.assertIsInstance(handler, logging.StreamHandler)
+ self.assertEqual(handler.stream, sys.stderr)
+
+ formatter = handler.formatter
+ # format defaults to logging.BASIC_FORMAT
+ self.assertEqual(formatter._style._fmt, logging.BASIC_FORMAT)
+ # datefmt defaults to None
+ self.assertIsNone(formatter.datefmt)
+ # style defaults to %
+ self.assertIsInstance(formatter._style, logging.PercentStyle)
+
+ # level is not explicitly set
+ self.assertEqual(logging.root.level, self.original_logging_level)
+
+ def test_filename(self):
+ logging.basicConfig(filename='test.log')
+
+ self.assertEqual(len(logging.root.handlers), 1)
+ handler = logging.root.handlers[0]
+ self.assertIsInstance(handler, logging.FileHandler)
+
+ expected = logging.FileHandler('test.log', 'a')
+ self.addCleanup(expected.close)
+ self.assertEqual(handler.stream.mode, expected.stream.mode)
+ self.assertEqual(handler.stream.name, expected.stream.name)
+
+ def test_filemode(self):
+ logging.basicConfig(filename='test.log', filemode='wb')
+
+ handler = logging.root.handlers[0]
+ expected = logging.FileHandler('test.log', 'wb')
+ self.addCleanup(expected.close)
+ self.assertEqual(handler.stream.mode, expected.stream.mode)
+
+ def test_stream(self):
+ stream = io.StringIO()
+ self.addCleanup(stream.close)
+ logging.basicConfig(stream=stream)
+
+ self.assertEqual(len(logging.root.handlers), 1)
+ handler = logging.root.handlers[0]
+ self.assertIsInstance(handler, logging.StreamHandler)
+ self.assertEqual(handler.stream, stream)
+
+ def test_format(self):
+ logging.basicConfig(format='foo')
+
+ formatter = logging.root.handlers[0].formatter
+ self.assertEqual(formatter._style._fmt, 'foo')
+
+ def test_datefmt(self):
+ logging.basicConfig(datefmt='bar')
+
+ formatter = logging.root.handlers[0].formatter
+ self.assertEqual(formatter.datefmt, 'bar')
+
+ def test_style(self):
+ logging.basicConfig(style='$')
+
+ formatter = logging.root.handlers[0].formatter
+ self.assertIsInstance(formatter._style, logging.StringTemplateStyle)
+
+ def test_level(self):
+ old_level = logging.root.level
+ self.addCleanup(logging.root.setLevel, old_level)
+
+ logging.basicConfig(level=57)
+ self.assertEqual(logging.root.level, 57)
+ # Test that second call has no effect
+ logging.basicConfig(level=58)
+ self.assertEqual(logging.root.level, 57)
+
+ def test_incompatible(self):
+ assertRaises = self.assertRaises
+ handlers = [logging.StreamHandler()]
+ stream = sys.stderr
+ assertRaises(ValueError, logging.basicConfig, filename='test.log',
+ stream=stream)
+ assertRaises(ValueError, logging.basicConfig, filename='test.log',
+ handlers=handlers)
+ assertRaises(ValueError, logging.basicConfig, stream=stream,
+ handlers=handlers)
+
+ def test_handlers(self):
+ handlers = [
+ logging.StreamHandler(),
+ logging.StreamHandler(sys.stdout),
+ logging.StreamHandler(),
+ ]
+ f = logging.Formatter()
+ handlers[2].setFormatter(f)
+ logging.basicConfig(handlers=handlers)
+ self.assertIs(handlers[0], logging.root.handlers[0])
+ self.assertIs(handlers[1], logging.root.handlers[1])
+ self.assertIs(handlers[2], logging.root.handlers[2])
+ self.assertIsNotNone(handlers[0].formatter)
+ self.assertIsNotNone(handlers[1].formatter)
+ self.assertIs(handlers[2].formatter, f)
+ self.assertIs(handlers[0].formatter, handlers[1].formatter)
+
+ def _test_log(self, method, level=None):
+ # logging.root has no handlers so basicConfig should be called
+ called = []
+
+ old_basic_config = logging.basicConfig
+ def my_basic_config(*a, **kw):
+ old_basic_config()
+ old_level = logging.root.level
+ logging.root.setLevel(100) # avoid having messages in stderr
+ self.addCleanup(logging.root.setLevel, old_level)
+ called.append((a, kw))
+
+ patch(self, logging, 'basicConfig', my_basic_config)
+
+ log_method = getattr(logging, method)
+ if level is not None:
+ log_method(level, "test me")
+ else:
+ log_method("test me")
+
+ # basicConfig was called with no arguments
+ self.assertEqual(called, [((), {})])
+
+ def test_log(self):
+ self._test_log('log', logging.WARNING)
+
+ def test_debug(self):
+ self._test_log('debug')
+
+ def test_info(self):
+ self._test_log('info')
+
+ def test_warning(self):
+ self._test_log('warning')
+
+ def test_error(self):
+ self._test_log('error')
+
+ def test_critical(self):
+ self._test_log('critical')
+
+
+class LoggerAdapterTest(unittest.TestCase):
+
+ def setUp(self):
+ super(LoggerAdapterTest, self).setUp()
+ old_handler_list = logging._handlerList[:]
+
+ self.recording = RecordingHandler()
+ self.logger = logging.root
+ self.logger.addHandler(self.recording)
+ self.addCleanup(self.logger.removeHandler, self.recording)
+ self.addCleanup(self.recording.close)
+
+ def cleanup():
+ logging._handlerList[:] = old_handler_list
+
+ self.addCleanup(cleanup)
+ self.addCleanup(logging.shutdown)
+ self.adapter = logging.LoggerAdapter(logger=self.logger, extra=None)
+
+ def test_exception(self):
+ msg = 'testing exception: %r'
+ exc = None
+ try:
+ 1 / 0
+ except ZeroDivisionError as e:
+ exc = e
+ self.adapter.exception(msg, self.recording)
+
+ self.assertEqual(len(self.recording.records), 1)
+ record = self.recording.records[0]
+ self.assertEqual(record.levelno, logging.ERROR)
+ self.assertEqual(record.msg, msg)
+ self.assertEqual(record.args, (self.recording,))
+ self.assertEqual(record.exc_info,
+ (exc.__class__, exc, exc.__traceback__))
+
+ def test_critical(self):
+ msg = 'critical test! %r'
+ self.adapter.critical(msg, self.recording)
+
+ self.assertEqual(len(self.recording.records), 1)
+ record = self.recording.records[0]
+ self.assertEqual(record.levelno, logging.CRITICAL)
+ self.assertEqual(record.msg, msg)
+ self.assertEqual(record.args, (self.recording,))
+
+ def test_is_enabled_for(self):
+ old_disable = self.adapter.logger.manager.disable
+ self.adapter.logger.manager.disable = 33
+ self.addCleanup(setattr, self.adapter.logger.manager, 'disable',
+ old_disable)
+ self.assertFalse(self.adapter.isEnabledFor(32))
+
+ def test_has_handlers(self):
+ self.assertTrue(self.adapter.hasHandlers())
+
+ for handler in self.logger.handlers:
+ self.logger.removeHandler(handler)
+
+ self.assertFalse(self.logger.hasHandlers())
+ self.assertFalse(self.adapter.hasHandlers())
+
+
+class LoggerTest(BaseTest):
+
+ def setUp(self):
+ super(LoggerTest, self).setUp()
+ self.recording = RecordingHandler()
+ self.logger = logging.Logger(name='blah')
+ self.logger.addHandler(self.recording)
+ self.addCleanup(self.logger.removeHandler, self.recording)
+ self.addCleanup(self.recording.close)
+ self.addCleanup(logging.shutdown)
+
+ def test_set_invalid_level(self):
+ self.assertRaises(TypeError, self.logger.setLevel, object())
+
+ def test_exception(self):
+ msg = 'testing exception: %r'
+ exc = None
+ try:
+ 1 / 0
+ except ZeroDivisionError as e:
+ exc = e
+ self.logger.exception(msg, self.recording)
+
+ self.assertEqual(len(self.recording.records), 1)
+ record = self.recording.records[0]
+ self.assertEqual(record.levelno, logging.ERROR)
+ self.assertEqual(record.msg, msg)
+ self.assertEqual(record.args, (self.recording,))
+ self.assertEqual(record.exc_info,
+ (exc.__class__, exc, exc.__traceback__))
+
+ def test_log_invalid_level_with_raise(self):
+ old_raise = logging.raiseExceptions
+ self.addCleanup(setattr, logging, 'raiseExecptions', old_raise)
+
+ logging.raiseExceptions = True
+ self.assertRaises(TypeError, self.logger.log, '10', 'test message')
+
+ def test_log_invalid_level_no_raise(self):
+ old_raise = logging.raiseExceptions
+ self.addCleanup(setattr, logging, 'raiseExecptions', old_raise)
+
+ logging.raiseExceptions = False
+ self.logger.log('10', 'test message') # no exception happens
+
+ def test_find_caller_with_stack_info(self):
+ called = []
+ patch(self, logging.traceback, 'print_stack',
+ lambda f, file: called.append(file.getvalue()))
+
+ self.logger.findCaller(stack_info=True)
+
+ self.assertEqual(len(called), 1)
+ self.assertEqual('Stack (most recent call last):\n', called[0])
+
+ def test_make_record_with_extra_overwrite(self):
+ name = 'my record'
+ level = 13
+ fn = lno = msg = args = exc_info = func = sinfo = None
+ rv = logging._logRecordFactory(name, level, fn, lno, msg, args,
+ exc_info, func, sinfo)
+
+ for key in ('message', 'asctime') + tuple(rv.__dict__.keys()):
+ extra = {key: 'some value'}
+ self.assertRaises(KeyError, self.logger.makeRecord, name, level,
+ fn, lno, msg, args, exc_info,
+ extra=extra, sinfo=sinfo)
+
+ def test_make_record_with_extra_no_overwrite(self):
+ name = 'my record'
+ level = 13
+ fn = lno = msg = args = exc_info = func = sinfo = None
+ extra = {'valid_key': 'some value'}
+ result = self.logger.makeRecord(name, level, fn, lno, msg, args,
+ exc_info, extra=extra, sinfo=sinfo)
+ self.assertIn('valid_key', result.__dict__)
+
+ def test_has_handlers(self):
+ self.assertTrue(self.logger.hasHandlers())
+
+ for handler in self.logger.handlers:
+ self.logger.removeHandler(handler)
+ self.assertFalse(self.logger.hasHandlers())
+
+ def test_has_handlers_no_propagate(self):
+ child_logger = logging.getLogger('blah.child')
+ child_logger.propagate = False
+ self.assertFalse(child_logger.hasHandlers())
+
+ def test_is_enabled_for(self):
+ old_disable = self.logger.manager.disable
+ self.logger.manager.disable = 23
+ self.addCleanup(setattr, self.logger.manager, 'disable', old_disable)
+ self.assertFalse(self.logger.isEnabledFor(22))
+
+ def test_root_logger_aliases(self):
+ root = logging.getLogger()
+ self.assertIs(root, logging.root)
+ self.assertIs(root, logging.getLogger(None))
+ self.assertIs(root, logging.getLogger(''))
+ self.assertIs(root, logging.getLogger('foo').root)
+ self.assertIs(root, logging.getLogger('foo.bar').root)
+ self.assertIs(root, logging.getLogger('foo').parent)
+
+ self.assertIsNot(root, logging.getLogger('\0'))
+ self.assertIsNot(root, logging.getLogger('foo.bar').parent)
+
+ def test_invalid_names(self):
+ self.assertRaises(TypeError, logging.getLogger, any)
+ self.assertRaises(TypeError, logging.getLogger, b'foo')
+
+
class BaseFileTest(BaseTest):
"Base class for handler tests that write log files"
@@ -2239,10 +3594,21 @@ class BaseFileTest(BaseTest):
def assertLogFile(self, filename):
"Assert a log file is there and register it for deletion"
self.assertTrue(os.path.exists(filename),
- msg="Log file %r does not exist")
+ msg="Log file %r does not exist" % filename)
self.rmfiles.append(filename)
+class FileHandlerTest(BaseFileTest):
+ def test_delay(self):
+ os.unlink(self.fn)
+ fh = logging.FileHandler(self.fn, delay=True)
+ self.assertIsNone(fh.stream)
+ self.assertFalse(os.path.exists(self.fn))
+ fh.handle(logging.makeLogRecord({}))
+ self.assertIsNotNone(fh.stream)
+ self.assertTrue(os.path.exists(self.fn))
+ fh.close()
+
class RotatingFileHandlerTest(BaseFileTest):
def next_rec(self):
return logging.LogRecord('n', logging.DEBUG, 'p', 1,
@@ -2268,20 +3634,117 @@ class RotatingFileHandlerTest(BaseFileTest):
rh.close()
def test_rollover_filenames(self):
+ def namer(name):
+ return name + ".test"
rh = logging.handlers.RotatingFileHandler(
self.fn, backupCount=2, maxBytes=1)
+ rh.namer = namer
rh.emit(self.next_rec())
self.assertLogFile(self.fn)
rh.emit(self.next_rec())
- self.assertLogFile(self.fn + ".1")
+ self.assertLogFile(namer(self.fn + ".1"))
rh.emit(self.next_rec())
- self.assertLogFile(self.fn + ".2")
- self.assertFalse(os.path.exists(self.fn + ".3"))
+ self.assertLogFile(namer(self.fn + ".2"))
+ self.assertFalse(os.path.exists(namer(self.fn + ".3")))
+ rh.close()
+
+ @requires_zlib
+ def test_rotator(self):
+ def namer(name):
+ return name + ".gz"
+
+ def rotator(source, dest):
+ with open(source, "rb") as sf:
+ data = sf.read()
+ compressed = zlib.compress(data, 9)
+ with open(dest, "wb") as df:
+ df.write(compressed)
+ os.remove(source)
+
+ rh = logging.handlers.RotatingFileHandler(
+ self.fn, backupCount=2, maxBytes=1)
+ rh.rotator = rotator
+ rh.namer = namer
+ m1 = self.next_rec()
+ rh.emit(m1)
+ self.assertLogFile(self.fn)
+ m2 = self.next_rec()
+ rh.emit(m2)
+ fn = namer(self.fn + ".1")
+ self.assertLogFile(fn)
+ newline = os.linesep
+ with open(fn, "rb") as f:
+ compressed = f.read()
+ data = zlib.decompress(compressed)
+ self.assertEqual(data.decode("ascii"), m1.msg + newline)
+ rh.emit(self.next_rec())
+ fn = namer(self.fn + ".2")
+ self.assertLogFile(fn)
+ with open(fn, "rb") as f:
+ compressed = f.read()
+ data = zlib.decompress(compressed)
+ self.assertEqual(data.decode("ascii"), m1.msg + newline)
+ rh.emit(self.next_rec())
+ fn = namer(self.fn + ".2")
+ with open(fn, "rb") as f:
+ compressed = f.read()
+ data = zlib.decompress(compressed)
+ self.assertEqual(data.decode("ascii"), m2.msg + newline)
+ self.assertFalse(os.path.exists(namer(self.fn + ".3")))
rh.close()
class TimedRotatingFileHandlerTest(BaseFileTest):
- # test methods added below
- pass
+ # other test methods added below
+ def test_rollover(self):
+ fh = logging.handlers.TimedRotatingFileHandler(self.fn, 'S',
+ backupCount=1)
+ fmt = logging.Formatter('%(asctime)s %(message)s')
+ fh.setFormatter(fmt)
+ r1 = logging.makeLogRecord({'msg': 'testing - initial'})
+ fh.emit(r1)
+ self.assertLogFile(self.fn)
+ time.sleep(1.1) # a little over a second ...
+ r2 = logging.makeLogRecord({'msg': 'testing - after delay'})
+ fh.emit(r2)
+ fh.close()
+ # At this point, we should have a recent rotated file which we
+ # can test for the existence of. However, in practice, on some
+ # machines which run really slowly, we don't know how far back
+ # in time to go to look for the log file. So, we go back a fair
+ # bit, and stop as soon as we see a rotated file. In theory this
+ # could of course still fail, but the chances are lower.
+ found = False
+ now = datetime.datetime.now()
+ GO_BACK = 5 * 60 # seconds
+ for secs in range(GO_BACK):
+ prev = now - datetime.timedelta(seconds=secs)
+ fn = self.fn + prev.strftime(".%Y-%m-%d_%H-%M-%S")
+ found = os.path.exists(fn)
+ if found:
+ self.rmfiles.append(fn)
+ break
+ msg = 'No rotated files found, went back %d seconds' % GO_BACK
+ if not found:
+ #print additional diagnostics
+ dn, fn = os.path.split(self.fn)
+ files = [f for f in os.listdir(dn) if f.startswith(fn)]
+ print('Test time: %s' % now.strftime("%Y-%m-%d %H-%M-%S"), file=sys.stderr)
+ print('The only matching files are: %s' % files, file=sys.stderr)
+ for f in files:
+ print('Contents of %s:' % f)
+ path = os.path.join(dn, f)
+ with open(path, 'r') as tf:
+ print(tf.read())
+ self.assertTrue(found, msg=msg)
+
+ def test_invalid(self):
+ assertRaises = self.assertRaises
+ assertRaises(ValueError, logging.handlers.TimedRotatingFileHandler,
+ self.fn, 'X', delay=True)
+ assertRaises(ValueError, logging.handlers.TimedRotatingFileHandler,
+ self.fn, 'W', delay=True)
+ assertRaises(ValueError, logging.handlers.TimedRotatingFileHandler,
+ self.fn, 'W7', delay=True)
def secs(**kw):
return datetime.timedelta(**kw) // datetime.timedelta(seconds=1)
@@ -2329,43 +3792,34 @@ for when, exp in (('S', 1),
rh.close()
setattr(TimedRotatingFileHandlerTest, "test_compute_rollover_%s" % when, test_compute_rollover)
-class HandlerTest(BaseTest):
-
- @unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.')
- @unittest.skipUnless(threading, 'Threading required for this test.')
- def test_race(self):
- # Issue #14632 refers.
- def remove_loop(fname, tries):
- for _ in range(tries):
- try:
- os.unlink(fname)
- except OSError:
- pass
- time.sleep(0.004 * random.randint(0, 4))
-
- del_count = 500
- log_count = 500
-
- for delay in (False, True):
- fd, fn = tempfile.mkstemp('.log', 'test_logging-3-')
- os.close(fd)
- remover = threading.Thread(target=remove_loop, args=(fn, del_count))
- remover.daemon = True
- remover.start()
- h = logging.handlers.WatchedFileHandler(fn, delay=delay)
- f = logging.Formatter('%(asctime)s: %(levelname)s: %(message)s')
- h.setFormatter(f)
- try:
- for _ in range(log_count):
- time.sleep(0.005)
- r = logging.makeLogRecord({'msg': 'testing' })
- h.handle(r)
- finally:
- remover.join()
- h.close()
- if os.path.exists(fn):
- os.unlink(fn)
+@unittest.skipUnless(win32evtlog, 'win32evtlog/win32evtlogutil required for this test.')
+class NTEventLogHandlerTest(BaseTest):
+ def test_basic(self):
+ logtype = 'Application'
+ elh = win32evtlog.OpenEventLog(None, logtype)
+ num_recs = win32evtlog.GetNumberOfEventLogRecords(elh)
+ h = logging.handlers.NTEventLogHandler('test_logging')
+ r = logging.makeLogRecord({'msg': 'Test Log Message'})
+ h.handle(r)
+ h.close()
+ # Now see if the event is recorded
+ self.assertTrue(num_recs < win32evtlog.GetNumberOfEventLogRecords(elh))
+ flags = win32evtlog.EVENTLOG_BACKWARDS_READ | \
+ win32evtlog.EVENTLOG_SEQUENTIAL_READ
+ found = False
+ GO_BACK = 100
+ events = win32evtlog.ReadEventLog(elh, flags, GO_BACK)
+ for e in events:
+ if e.SourceName != 'test_logging':
+ continue
+ msg = win32evtlogutil.SafeFormatMessage(e, logtype)
+ if msg != 'Test Log Message\r\n':
+ continue
+ found = True
+ break
+ msg = 'Record not found in event log, went back %d records' % GO_BACK
+ self.assertTrue(found, msg=msg)
# Set the locale to the platform-dependent default. I have no idea
# why the test does this, but in any case we save the current locale
@@ -2373,14 +3827,17 @@ class HandlerTest(BaseTest):
@run_with_locale('LC_ALL', '')
def test_main():
run_unittest(BuiltinLevelsTest, BasicFilterTest,
- CustomLevelsAndFiltersTest, MemoryHandlerTest,
- ConfigFileTest, SocketHandlerTest, MemoryTest,
- EncodingTest, WarningsTest, ConfigDictTest, ManagerTest,
- FormatterTest,
- LogRecordFactoryTest, ChildLoggerTest, QueueHandlerTest,
- RotatingFileHandlerTest,
- LastResortTest,
- TimedRotatingFileHandlerTest, HandlerTest,
+ CustomLevelsAndFiltersTest, HandlerTest, MemoryHandlerTest,
+ ConfigFileTest, SocketHandlerTest, DatagramHandlerTest,
+ MemoryTest, EncodingTest, WarningsTest, ConfigDictTest,
+ ManagerTest, FormatterTest, BufferingFormatterTest,
+ StreamHandlerTest, LogRecordFactoryTest, ChildLoggerTest,
+ QueueHandlerTest, ShutdownTest, ModuleLevelMiscTest,
+ BasicConfigTest, LoggerAdapterTest, LoggerTest,
+ SMTPHandlerTest, FileHandlerTest, RotatingFileHandlerTest,
+ LastResortTest, LogRecordTest, ExceptionTest,
+ SysLogHandlerTest, HTTPHandlerTest, NTEventLogHandlerTest,
+ TimedRotatingFileHandlerTest
)
if __name__ == "__main__":
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 3ebc1f7..b417bea 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -43,6 +43,53 @@ DBL_MIN_EXP = sys.float_info.min_exp
DBL_MANT_DIG = sys.float_info.mant_dig
DBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1)
+
+# Pure Python version of correctly-rounded integer-to-float conversion.
+def int_to_float(n):
+ """
+ Correctly-rounded integer-to-float conversion.
+
+ """
+ # Constants, depending only on the floating-point format in use.
+ # We use an extra 2 bits of precision for rounding purposes.
+ PRECISION = sys.float_info.mant_dig + 2
+ SHIFT_MAX = sys.float_info.max_exp - PRECISION
+ Q_MAX = 1 << PRECISION
+ ROUND_HALF_TO_EVEN_CORRECTION = [0, -1, -2, 1, 0, -1, 2, 1]
+
+ # Reduce to the case where n is positive.
+ if n == 0:
+ return 0.0
+ elif n < 0:
+ return -int_to_float(-n)
+
+ # Convert n to a 'floating-point' number q * 2**shift, where q is an
+ # integer with 'PRECISION' significant bits. When shifting n to create q,
+ # the least significant bit of q is treated as 'sticky'. That is, the
+ # least significant bit of q is set if either the corresponding bit of n
+ # was already set, or any one of the bits of n lost in the shift was set.
+ shift = n.bit_length() - PRECISION
+ q = n << -shift if shift < 0 else (n >> shift) | bool(n & ~(-1 << shift))
+
+ # Round half to even (actually rounds to the nearest multiple of 4,
+ # rounding ties to a multiple of 8).
+ q += ROUND_HALF_TO_EVEN_CORRECTION[q & 7]
+
+ # Detect overflow.
+ if shift + (q == Q_MAX) > SHIFT_MAX:
+ raise OverflowError("integer too large to convert to float")
+
+ # Checks: q is exactly representable, and q**2**shift doesn't overflow.
+ assert q % 4 == 0 and q // 4 <= 2**(sys.float_info.mant_dig)
+ assert q * 2**shift <= sys.float_info.max
+
+ # Some circularity here, since float(q) is doing an int-to-float
+ # conversion. But here q is of bounded size, and is exactly representable
+ # as a float. In a low-level C-like language, this operation would be a
+ # simple cast (e.g., from unsigned long long to double).
+ return math.ldexp(float(q), shift)
+
+
# pure Python version of correctly-rounded true division
def truediv(a, b):
"""Correctly-rounded true division for integers."""
@@ -367,6 +414,23 @@ class LongTest(unittest.TestCase):
return 1729
self.assertEqual(int(LongTrunc()), 1729)
+ def check_float_conversion(self, n):
+ # Check that int -> float conversion behaviour matches
+ # that of the pure Python version above.
+ try:
+ actual = float(n)
+ except OverflowError:
+ actual = 'overflow'
+
+ try:
+ expected = int_to_float(n)
+ except OverflowError:
+ expected = 'overflow'
+
+ msg = ("Error in conversion of integer {} to float. "
+ "Got {}, expected {}.".format(n, actual, expected))
+ self.assertEqual(actual, expected, msg)
+
@support.requires_IEEE_754
def test_float_conversion(self):
@@ -421,6 +485,22 @@ class LongTest(unittest.TestCase):
y = 2**p * 2**53
self.assertEqual(int(float(x)), y)
+ # Compare builtin float conversion with pure Python int_to_float
+ # function above.
+ test_values = [
+ int_dbl_max-1, int_dbl_max, int_dbl_max+1,
+ halfway-1, halfway, halfway + 1,
+ top_power-1, top_power, top_power+1,
+ 2*top_power-1, 2*top_power, top_power*top_power,
+ ]
+ test_values.extend(exact_values)
+ for p in range(-4, 8):
+ for x in range(-128, 128):
+ test_values.append(2**(p+53) + x)
+ for value in test_values:
+ self.check_float_conversion(value)
+ self.check_float_conversion(-value)
+
def test_float_overflow(self):
for x in -2.0, -1.0, 0.0, 1.0, 2.0:
self.assertEqual(float(int(x)), x)
diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
new file mode 100644
index 0000000..a13cf3b
--- /dev/null
+++ b/Lib/test/test_lzma.py
@@ -0,0 +1,1517 @@
+from io import BytesIO, UnsupportedOperation
+import os
+import random
+import unittest
+
+from test.support import (
+ _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
+)
+
+lzma = import_module("lzma")
+from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
+
+
+class CompressorDecompressorTestCase(unittest.TestCase):
+
+ # Test error cases.
+
+ def test_simple_bad_args(self):
+ self.assertRaises(TypeError, LZMACompressor, [])
+ self.assertRaises(TypeError, LZMACompressor, format=3.45)
+ self.assertRaises(TypeError, LZMACompressor, check="")
+ self.assertRaises(TypeError, LZMACompressor, preset="asdf")
+ self.assertRaises(TypeError, LZMACompressor, filters=3)
+ # Can't specify FORMAT_AUTO when compressing.
+ self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
+ # Can't specify a preset and a custom filter chain at the same time.
+ with self.assertRaises(ValueError):
+ LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
+
+ self.assertRaises(TypeError, LZMADecompressor, ())
+ self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
+ with self.assertRaises(TypeError):
+ LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
+ # Cannot specify a memory limit with FILTER_RAW.
+ with self.assertRaises(ValueError):
+ LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
+ # Can only specify a custom filter chain with FILTER_RAW.
+ self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
+ with self.assertRaises(ValueError):
+ LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
+ with self.assertRaises(ValueError):
+ LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
+
+ lzc = LZMACompressor()
+ self.assertRaises(TypeError, lzc.compress)
+ self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
+ self.assertRaises(TypeError, lzc.flush, b"blah")
+ empty = lzc.flush()
+ self.assertRaises(ValueError, lzc.compress, b"quux")
+ self.assertRaises(ValueError, lzc.flush)
+
+ lzd = LZMADecompressor()
+ self.assertRaises(TypeError, lzd.decompress)
+ self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
+ lzd.decompress(empty)
+ self.assertRaises(EOFError, lzd.decompress, b"quux")
+
+ def test_bad_filter_spec(self):
+ self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
+ self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
+ self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
+ with self.assertRaises(ValueError):
+ LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
+ with self.assertRaises(ValueError):
+ LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
+ with self.assertRaises(ValueError):
+ LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
+
+ def test_decompressor_after_eof(self):
+ lzd = LZMADecompressor()
+ lzd.decompress(COMPRESSED_XZ)
+ self.assertRaises(EOFError, lzd.decompress, b"nyan")
+
+ def test_decompressor_memlimit(self):
+ lzd = LZMADecompressor(memlimit=1024)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
+
+ lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
+
+ lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
+
+ # Test LZMADecompressor on known-good input data.
+
+ def _test_decompressor(self, lzd, data, check, unused_data=b""):
+ self.assertFalse(lzd.eof)
+ out = lzd.decompress(data)
+ self.assertEqual(out, INPUT)
+ self.assertEqual(lzd.check, check)
+ self.assertTrue(lzd.eof)
+ self.assertEqual(lzd.unused_data, unused_data)
+
+ def test_decompressor_auto(self):
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
+
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
+
+ def test_decompressor_xz(self):
+ lzd = LZMADecompressor(lzma.FORMAT_XZ)
+ self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
+
+ def test_decompressor_alone(self):
+ lzd = LZMADecompressor(lzma.FORMAT_ALONE)
+ self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
+
+ def test_decompressor_raw_1(self):
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
+ self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
+
+ def test_decompressor_raw_2(self):
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
+ self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
+
+ def test_decompressor_raw_3(self):
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
+ self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
+
+ def test_decompressor_raw_4(self):
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
+
+ def test_decompressor_chunks(self):
+ lzd = LZMADecompressor()
+ out = []
+ for i in range(0, len(COMPRESSED_XZ), 10):
+ self.assertFalse(lzd.eof)
+ out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
+ out = b"".join(out)
+ self.assertEqual(out, INPUT)
+ self.assertEqual(lzd.check, lzma.CHECK_CRC64)
+ self.assertTrue(lzd.eof)
+ self.assertEqual(lzd.unused_data, b"")
+
+ def test_decompressor_unused_data(self):
+ lzd = LZMADecompressor()
+ extra = b"fooblibar"
+ self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
+ unused_data=extra)
+
+ def test_decompressor_bad_input(self):
+ lzd = LZMADecompressor()
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
+
+ lzd = LZMADecompressor(lzma.FORMAT_XZ)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
+
+ lzd = LZMADecompressor(lzma.FORMAT_ALONE)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
+
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
+ self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
+
+ # Test that LZMACompressor->LZMADecompressor preserves the input data.
+
+ def test_roundtrip_xz(self):
+ lzc = LZMACompressor()
+ cdata = lzc.compress(INPUT) + lzc.flush()
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
+
+ def test_roundtrip_alone(self):
+ lzc = LZMACompressor(lzma.FORMAT_ALONE)
+ cdata = lzc.compress(INPUT) + lzc.flush()
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
+
+ def test_roundtrip_raw(self):
+ lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ cdata = lzc.compress(INPUT) + lzc.flush()
+ lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
+
+ def test_roundtrip_chunks(self):
+ lzc = LZMACompressor()
+ cdata = []
+ for i in range(0, len(INPUT), 10):
+ cdata.append(lzc.compress(INPUT[i:i+10]))
+ cdata.append(lzc.flush())
+ cdata = b"".join(cdata)
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
+
+ # LZMADecompressor intentionally does not handle concatenated streams.
+
+ def test_decompressor_multistream(self):
+ lzd = LZMADecompressor()
+ self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
+ lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
+
+ # Test with inputs larger than 4GiB.
+
+ @bigmemtest(size=_4G + 100, memuse=2)
+ def test_compressor_bigmem(self, size):
+ lzc = LZMACompressor()
+ cdata = lzc.compress(b"x" * size) + lzc.flush()
+ ddata = lzma.decompress(cdata)
+ try:
+ self.assertEqual(len(ddata), size)
+ self.assertEqual(len(ddata.strip(b"x")), 0)
+ finally:
+ ddata = None
+
+ @bigmemtest(size=_4G + 100, memuse=3)
+ def test_decompressor_bigmem(self, size):
+ lzd = LZMADecompressor()
+ blocksize = 10 * 1024 * 1024
+ block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
+ try:
+ input = block * (size // blocksize + 1)
+ cdata = lzma.compress(input)
+ ddata = lzd.decompress(cdata)
+ self.assertEqual(ddata, input)
+ finally:
+ input = cdata = ddata = None
+
+
+class CompressDecompressFunctionTestCase(unittest.TestCase):
+
+ # Test error cases:
+
+ def test_bad_args(self):
+ self.assertRaises(TypeError, lzma.compress)
+ self.assertRaises(TypeError, lzma.compress, [])
+ self.assertRaises(TypeError, lzma.compress, b"", format="xz")
+ self.assertRaises(TypeError, lzma.compress, b"", check="none")
+ self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
+ self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
+ # Can't specify a preset and a custom filter chain at the same time.
+ with self.assertRaises(ValueError):
+ lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
+
+ self.assertRaises(TypeError, lzma.decompress)
+ self.assertRaises(TypeError, lzma.decompress, [])
+ self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
+ self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
+ with self.assertRaises(TypeError):
+ lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
+ # Cannot specify a memory limit with FILTER_RAW.
+ with self.assertRaises(ValueError):
+ lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
+ # Can only specify a custom filter chain with FILTER_RAW.
+ with self.assertRaises(ValueError):
+ lzma.decompress(b"", filters=FILTERS_RAW_1)
+ with self.assertRaises(ValueError):
+ lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
+ with self.assertRaises(ValueError):
+ lzma.decompress(
+ b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
+
+ def test_decompress_memlimit(self):
+ with self.assertRaises(LZMAError):
+ lzma.decompress(COMPRESSED_XZ, memlimit=1024)
+ with self.assertRaises(LZMAError):
+ lzma.decompress(
+ COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
+ with self.assertRaises(LZMAError):
+ lzma.decompress(
+ COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
+
+ # Test LZMADecompressor on known-good input data.
+
+ def test_decompress_good_input(self):
+ ddata = lzma.decompress(COMPRESSED_XZ)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(COMPRESSED_ALONE)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(
+ COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(
+ COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(
+ COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
+ self.assertEqual(ddata, INPUT)
+
+ ddata = lzma.decompress(
+ COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ self.assertEqual(ddata, INPUT)
+
+ def test_decompress_incomplete_input(self):
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
+ self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+
+ def test_decompress_bad_input(self):
+ with self.assertRaises(LZMAError):
+ lzma.decompress(COMPRESSED_RAW_1)
+ with self.assertRaises(LZMAError):
+ lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
+ with self.assertRaises(LZMAError):
+ lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
+ with self.assertRaises(LZMAError):
+ lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
+ filters=FILTERS_RAW_1)
+
+ # Test that compress()->decompress() preserves the input data.
+
+ def test_roundtrip(self):
+ cdata = lzma.compress(INPUT)
+ ddata = lzma.decompress(cdata)
+ self.assertEqual(ddata, INPUT)
+
+ cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
+ ddata = lzma.decompress(cdata)
+ self.assertEqual(ddata, INPUT)
+
+ cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
+ ddata = lzma.decompress(cdata)
+ self.assertEqual(ddata, INPUT)
+
+ cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
+ self.assertEqual(ddata, INPUT)
+
+ # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
+
+ def test_decompress_multistream(self):
+ ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
+ self.assertEqual(ddata, INPUT * 2)
+
+
+class TempFile:
+ """Context manager - creates a file, and deletes it on __exit__."""
+
+ def __init__(self, filename, data=b""):
+ self.filename = filename
+ self.data = data
+
+ def __enter__(self):
+ with open(self.filename, "wb") as f:
+ f.write(self.data)
+
+ def __exit__(self, *args):
+ unlink(self.filename)
+
+
+class FileTestCase(unittest.TestCase):
+
+ def test_init(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ pass
+ with LZMAFile(BytesIO(), "w") as f:
+ pass
+ with LZMAFile(BytesIO(), "a") as f:
+ pass
+
+ def test_init_with_filename(self):
+ with TempFile(TESTFN, COMPRESSED_XZ):
+ with LZMAFile(TESTFN) as f:
+ pass
+ with LZMAFile(TESTFN, "w") as f:
+ pass
+ with LZMAFile(TESTFN, "a") as f:
+ pass
+
+ def test_init_mode(self):
+ with TempFile(TESTFN):
+ with LZMAFile(TESTFN, "r"):
+ pass
+ with LZMAFile(TESTFN, "rb"):
+ pass
+ with LZMAFile(TESTFN, "w"):
+ pass
+ with LZMAFile(TESTFN, "wb"):
+ pass
+ with LZMAFile(TESTFN, "a"):
+ pass
+ with LZMAFile(TESTFN, "ab"):
+ pass
+
+ def test_init_bad_mode(self):
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "x")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
+
+ def test_init_bad_check(self):
+ with self.assertRaises(TypeError):
+ LZMAFile(BytesIO(), "w", check=b"asd")
+ # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
+ with self.assertRaises(LZMAError):
+ LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
+ with self.assertRaises(LZMAError):
+ LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
+ # Cannot specify a check with mode="r".
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
+
+ def test_init_bad_preset(self):
+ with self.assertRaises(TypeError):
+ LZMAFile(BytesIO(), "w", preset=4.39)
+ with self.assertRaises(LZMAError):
+ LZMAFile(BytesIO(), "w", preset=10)
+ with self.assertRaises(LZMAError):
+ LZMAFile(BytesIO(), "w", preset=23)
+ with self.assertRaises(OverflowError):
+ LZMAFile(BytesIO(), "w", preset=-1)
+ with self.assertRaises(OverflowError):
+ LZMAFile(BytesIO(), "w", preset=-7)
+ with self.assertRaises(TypeError):
+ LZMAFile(BytesIO(), "w", preset="foo")
+ # Cannot specify a preset with mode="r".
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
+
+ def test_init_bad_filter_spec(self):
+ with self.assertRaises(TypeError):
+ LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w",
+ filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w",
+ filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w",
+ filters=[{"id": lzma.FILTER_X86, "foo": 0}])
+
+ def test_init_with_preset_and_filters(self):
+ with self.assertRaises(ValueError):
+ LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
+ preset=6, filters=FILTERS_RAW_1)
+
+ def test_close(self):
+ with BytesIO(COMPRESSED_XZ) as src:
+ f = LZMAFile(src)
+ f.close()
+ # LZMAFile.close() should not close the underlying file object.
+ self.assertFalse(src.closed)
+ # Try closing an already-closed LZMAFile.
+ f.close()
+ self.assertFalse(src.closed)
+
+ # Test with a real file on disk, opened directly by LZMAFile.
+ with TempFile(TESTFN, COMPRESSED_XZ):
+ f = LZMAFile(TESTFN)
+ fp = f._fp
+ f.close()
+ # Here, LZMAFile.close() *should* close the underlying file object.
+ self.assertTrue(fp.closed)
+ # Try closing an already-closed LZMAFile.
+ f.close()
+
+ def test_closed(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ try:
+ self.assertFalse(f.closed)
+ f.read()
+ self.assertFalse(f.closed)
+ finally:
+ f.close()
+ self.assertTrue(f.closed)
+
+ f = LZMAFile(BytesIO(), "w")
+ try:
+ self.assertFalse(f.closed)
+ finally:
+ f.close()
+ self.assertTrue(f.closed)
+
+ def test_fileno(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ try:
+ self.assertRaises(UnsupportedOperation, f.fileno)
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.fileno)
+ with TempFile(TESTFN, COMPRESSED_XZ):
+ f = LZMAFile(TESTFN)
+ try:
+ self.assertEqual(f.fileno(), f._fp.fileno())
+ self.assertIsInstance(f.fileno(), int)
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.fileno)
+
+ def test_seekable(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ try:
+ self.assertTrue(f.seekable())
+ f.read()
+ self.assertTrue(f.seekable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.seekable)
+
+ f = LZMAFile(BytesIO(), "w")
+ try:
+ self.assertFalse(f.seekable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.seekable)
+
+ src = BytesIO(COMPRESSED_XZ)
+ src.seekable = lambda: False
+ f = LZMAFile(src)
+ try:
+ self.assertFalse(f.seekable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.seekable)
+
+ def test_readable(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ try:
+ self.assertTrue(f.readable())
+ f.read()
+ self.assertTrue(f.readable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.readable)
+
+ f = LZMAFile(BytesIO(), "w")
+ try:
+ self.assertFalse(f.readable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.readable)
+
+ def test_writable(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ try:
+ self.assertFalse(f.writable())
+ f.read()
+ self.assertFalse(f.writable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.writable)
+
+ f = LZMAFile(BytesIO(), "w")
+ try:
+ self.assertTrue(f.writable())
+ finally:
+ f.close()
+ self.assertRaises(ValueError, f.writable)
+
+ def test_read(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
+ self.assertEqual(f.read(), INPUT)
+ with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_RAW_1),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_RAW_2),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_RAW_3),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+ with LZMAFile(BytesIO(COMPRESSED_RAW_4),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+
+ def test_read_0(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertEqual(f.read(0), b"")
+ with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
+ self.assertEqual(f.read(0), b"")
+ with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
+ self.assertEqual(f.read(0), b"")
+ with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
+ self.assertEqual(f.read(0), b"")
+
+ def test_read_10(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ chunks = []
+ while True:
+ result = f.read(10)
+ if not result:
+ break
+ self.assertLessEqual(len(result), 10)
+ chunks.append(result)
+ self.assertEqual(b"".join(chunks), INPUT)
+
+ def test_read_multistream(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
+ self.assertEqual(f.read(), INPUT * 5)
+ with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
+ self.assertEqual(f.read(), INPUT * 2)
+ with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
+ self.assertEqual(f.read(), INPUT * 4)
+
+ def test_read_multistream_buffer_size_aligned(self):
+ # Test the case where a stream boundary coincides with the end
+ # of the raw read buffer.
+ saved_buffer_size = lzma._BUFFER_SIZE
+ lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
+ try:
+ with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
+ self.assertEqual(f.read(), INPUT * 5)
+ finally:
+ lzma._BUFFER_SIZE = saved_buffer_size
+
+ def test_read_from_file(self):
+ with TempFile(TESTFN, COMPRESSED_XZ):
+ with LZMAFile(TESTFN) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+
+ def test_read_from_file_with_bytes_filename(self):
+ try:
+ bytes_filename = TESTFN.encode("ascii")
+ except UnicodeEncodeError:
+ self.skipTest("Temporary file name needs to be ASCII")
+ with TempFile(TESTFN, COMPRESSED_XZ):
+ with LZMAFile(bytes_filename) as f:
+ self.assertEqual(f.read(), INPUT)
+ self.assertEqual(f.read(), b"")
+
+ def test_read_incomplete(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
+ self.assertRaises(EOFError, f.read)
+
+ def test_read_bad_args(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ f.close()
+ self.assertRaises(ValueError, f.read)
+ with LZMAFile(BytesIO(), "w") as f:
+ self.assertRaises(ValueError, f.read)
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertRaises(TypeError, f.read, None)
+
+ def test_read1(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ blocks = []
+ while True:
+ result = f.read1()
+ if not result:
+ break
+ blocks.append(result)
+ self.assertEqual(b"".join(blocks), INPUT)
+ self.assertEqual(f.read1(), b"")
+
+ def test_read1_0(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertEqual(f.read1(0), b"")
+
+ def test_read1_10(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ blocks = []
+ while True:
+ result = f.read1(10)
+ if not result:
+ break
+ blocks.append(result)
+ self.assertEqual(b"".join(blocks), INPUT)
+ self.assertEqual(f.read1(), b"")
+
+ def test_read1_multistream(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
+ blocks = []
+ while True:
+ result = f.read1()
+ if not result:
+ break
+ blocks.append(result)
+ self.assertEqual(b"".join(blocks), INPUT * 5)
+ self.assertEqual(f.read1(), b"")
+
+ def test_read1_bad_args(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ f.close()
+ self.assertRaises(ValueError, f.read1)
+ with LZMAFile(BytesIO(), "w") as f:
+ self.assertRaises(ValueError, f.read1)
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertRaises(TypeError, f.read1, None)
+
+ def test_peek(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ result = f.peek()
+ self.assertGreater(len(result), 0)
+ self.assertTrue(INPUT.startswith(result))
+ self.assertEqual(f.read(), INPUT)
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ result = f.peek(10)
+ self.assertGreater(len(result), 0)
+ self.assertTrue(INPUT.startswith(result))
+ self.assertEqual(f.read(), INPUT)
+
+ def test_peek_bad_args(self):
+ with LZMAFile(BytesIO(), "w") as f:
+ self.assertRaises(ValueError, f.peek)
+
+ def test_iterator(self):
+ with BytesIO(INPUT) as f:
+ lines = f.readlines()
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertListEqual(list(iter(f)), lines)
+ with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
+ self.assertListEqual(list(iter(f)), lines)
+ with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
+ self.assertListEqual(list(iter(f)), lines)
+ with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
+ self.assertListEqual(list(iter(f)), lines)
+ with LZMAFile(BytesIO(COMPRESSED_RAW_2),
+ format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
+ self.assertListEqual(list(iter(f)), lines)
+
+ def test_readline(self):
+ with BytesIO(INPUT) as f:
+ lines = f.readlines()
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ for line in lines:
+ self.assertEqual(f.readline(), line)
+
+ def test_readlines(self):
+ with BytesIO(INPUT) as f:
+ lines = f.readlines()
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertListEqual(f.readlines(), lines)
+
+ def test_write(self):
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w") as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT)
+ self.assertEqual(dst.getvalue(), expected)
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
+ self.assertEqual(dst.getvalue(), expected)
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
+ self.assertEqual(dst.getvalue(), expected)
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
+ filters=FILTERS_RAW_2) as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
+ filters=FILTERS_RAW_2)
+ self.assertEqual(dst.getvalue(), expected)
+
+ def test_write_10(self):
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w") as f:
+ for start in range(0, len(INPUT), 10):
+ f.write(INPUT[start:start+10])
+ expected = lzma.compress(INPUT)
+ self.assertEqual(dst.getvalue(), expected)
+
+ def test_write_append(self):
+ part1 = INPUT[:1024]
+ part2 = INPUT[1024:1536]
+ part3 = INPUT[1536:]
+ expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w") as f:
+ f.write(part1)
+ with LZMAFile(dst, "a") as f:
+ f.write(part2)
+ with LZMAFile(dst, "a") as f:
+ f.write(part3)
+ self.assertEqual(dst.getvalue(), expected)
+
+ def test_write_to_file(self):
+ try:
+ with LZMAFile(TESTFN, "w") as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT)
+ with open(TESTFN, "rb") as f:
+ self.assertEqual(f.read(), expected)
+ finally:
+ unlink(TESTFN)
+
+ def test_write_to_file_with_bytes_filename(self):
+ try:
+ bytes_filename = TESTFN.encode("ascii")
+ except UnicodeEncodeError:
+ self.skipTest("Temporary file name needs to be ASCII")
+ try:
+ with LZMAFile(bytes_filename, "w") as f:
+ f.write(INPUT)
+ expected = lzma.compress(INPUT)
+ with open(TESTFN, "rb") as f:
+ self.assertEqual(f.read(), expected)
+ finally:
+ unlink(TESTFN)
+
+ def test_write_append_to_file(self):
+ part1 = INPUT[:1024]
+ part2 = INPUT[1024:1536]
+ part3 = INPUT[1536:]
+ expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
+ try:
+ with LZMAFile(TESTFN, "w") as f:
+ f.write(part1)
+ with LZMAFile(TESTFN, "a") as f:
+ f.write(part2)
+ with LZMAFile(TESTFN, "a") as f:
+ f.write(part3)
+ with open(TESTFN, "rb") as f:
+ self.assertEqual(f.read(), expected)
+ finally:
+ unlink(TESTFN)
+
+ def test_write_bad_args(self):
+ f = LZMAFile(BytesIO(), "w")
+ f.close()
+ self.assertRaises(ValueError, f.write, b"foo")
+ with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
+ self.assertRaises(ValueError, f.write, b"bar")
+ with LZMAFile(BytesIO(), "w") as f:
+ self.assertRaises(TypeError, f.write, None)
+ self.assertRaises(TypeError, f.write, "text")
+ self.assertRaises(TypeError, f.write, 789)
+
+ def test_writelines(self):
+ with BytesIO(INPUT) as f:
+ lines = f.readlines()
+ with BytesIO() as dst:
+ with LZMAFile(dst, "w") as f:
+ f.writelines(lines)
+ expected = lzma.compress(INPUT)
+ self.assertEqual(dst.getvalue(), expected)
+
+ def test_seek_forward(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.seek(555)
+ self.assertEqual(f.read(), INPUT[555:])
+
+ def test_seek_forward_across_streams(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
+ f.seek(len(INPUT) + 123)
+ self.assertEqual(f.read(), INPUT[123:])
+
+ def test_seek_forward_relative_to_current(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.read(100)
+ f.seek(1236, 1)
+ self.assertEqual(f.read(), INPUT[1336:])
+
+ def test_seek_forward_relative_to_end(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.seek(-555, 2)
+ self.assertEqual(f.read(), INPUT[-555:])
+
+ def test_seek_backward(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.read(1001)
+ f.seek(211)
+ self.assertEqual(f.read(), INPUT[211:])
+
+ def test_seek_backward_across_streams(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
+ f.read(len(INPUT) + 333)
+ f.seek(737)
+ self.assertEqual(f.read(), INPUT[737:] + INPUT)
+
+ def test_seek_backward_relative_to_end(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.seek(-150, 2)
+ self.assertEqual(f.read(), INPUT[-150:])
+
+ def test_seek_past_end(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.seek(len(INPUT) + 9001)
+ self.assertEqual(f.tell(), len(INPUT))
+ self.assertEqual(f.read(), b"")
+
+ def test_seek_past_start(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ f.seek(-88)
+ self.assertEqual(f.tell(), 0)
+ self.assertEqual(f.read(), INPUT)
+
+ def test_seek_bad_args(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ f.close()
+ self.assertRaises(ValueError, f.seek, 0)
+ with LZMAFile(BytesIO(), "w") as f:
+ self.assertRaises(ValueError, f.seek, 0)
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ self.assertRaises(ValueError, f.seek, 0, 3)
+ self.assertRaises(ValueError, f.seek, 9, ())
+ self.assertRaises(TypeError, f.seek, None)
+ self.assertRaises(TypeError, f.seek, b"derp")
+
+ def test_tell(self):
+ with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
+ pos = 0
+ while True:
+ self.assertEqual(f.tell(), pos)
+ result = f.read(183)
+ if not result:
+ break
+ pos += len(result)
+ self.assertEqual(f.tell(), len(INPUT))
+ with LZMAFile(BytesIO(), "w") as f:
+ for pos in range(0, len(INPUT), 144):
+ self.assertEqual(f.tell(), pos)
+ f.write(INPUT[pos:pos+144])
+ self.assertEqual(f.tell(), len(INPUT))
+
+ def test_tell_bad_args(self):
+ f = LZMAFile(BytesIO(COMPRESSED_XZ))
+ f.close()
+ self.assertRaises(ValueError, f.tell)
+
+
+class OpenTestCase(unittest.TestCase):
+
+ def test_binary_modes(self):
+ with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
+ self.assertEqual(f.read(), INPUT)
+ with BytesIO() as bio:
+ with lzma.open(bio, "wb") as f:
+ f.write(INPUT)
+ file_data = lzma.decompress(bio.getvalue())
+ self.assertEqual(file_data, INPUT)
+ with lzma.open(bio, "ab") as f:
+ f.write(INPUT)
+ file_data = lzma.decompress(bio.getvalue())
+ self.assertEqual(file_data, INPUT * 2)
+
+ def test_text_modes(self):
+ uncompressed = INPUT.decode("ascii")
+ uncompressed_raw = uncompressed.replace("\n", os.linesep)
+ with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
+ self.assertEqual(f.read(), uncompressed)
+ with BytesIO() as bio:
+ with lzma.open(bio, "wt") as f:
+ f.write(uncompressed)
+ file_data = lzma.decompress(bio.getvalue()).decode("ascii")
+ self.assertEqual(file_data, uncompressed_raw)
+ with lzma.open(bio, "at") as f:
+ f.write(uncompressed)
+ file_data = lzma.decompress(bio.getvalue()).decode("ascii")
+ self.assertEqual(file_data, uncompressed_raw * 2)
+
+ def test_filename(self):
+ with TempFile(TESTFN):
+ with lzma.open(TESTFN, "wb") as f:
+ f.write(INPUT)
+ with open(TESTFN, "rb") as f:
+ file_data = lzma.decompress(f.read())
+ self.assertEqual(file_data, INPUT)
+ with lzma.open(TESTFN, "rb") as f:
+ self.assertEqual(f.read(), INPUT)
+ with lzma.open(TESTFN, "ab") as f:
+ f.write(INPUT)
+ with lzma.open(TESTFN, "rb") as f:
+ self.assertEqual(f.read(), INPUT * 2)
+
+ def test_bad_params(self):
+ # Test invalid parameter combinations.
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "")
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "x")
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "rbt")
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "rb", encoding="utf-8")
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "rb", errors="ignore")
+ with self.assertRaises(ValueError):
+ lzma.open(TESTFN, "rb", newline="\n")
+
+ def test_format_and_filters(self):
+ # Test non-default format and filter chain.
+ options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
+ with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
+ self.assertEqual(f.read(), INPUT)
+ with BytesIO() as bio:
+ with lzma.open(bio, "wb", **options) as f:
+ f.write(INPUT)
+ file_data = lzma.decompress(bio.getvalue(), **options)
+ self.assertEqual(file_data, INPUT)
+
+ def test_encoding(self):
+ # Test non-default encoding.
+ uncompressed = INPUT.decode("ascii")
+ uncompressed_raw = uncompressed.replace("\n", os.linesep)
+ with BytesIO() as bio:
+ with lzma.open(bio, "wt", encoding="utf-16-le") as f:
+ f.write(uncompressed)
+ file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
+ self.assertEqual(file_data, uncompressed_raw)
+ bio.seek(0)
+ with lzma.open(bio, "rt", encoding="utf-16-le") as f:
+ self.assertEqual(f.read(), uncompressed)
+
+ def test_encoding_error_handler(self):
+ # Test wih non-default encoding error handler.
+ with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
+ with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
+ self.assertEqual(f.read(), "foobar")
+
+ def test_newline(self):
+ # Test with explicit newline (universal newline mode disabled).
+ text = INPUT.decode("ascii")
+ with BytesIO() as bio:
+ with lzma.open(bio, "wt", newline="\n") as f:
+ f.write(text)
+ bio.seek(0)
+ with lzma.open(bio, "rt", newline="\r") as f:
+ self.assertEqual(f.readlines(), [text])
+
+
+class MiscellaneousTestCase(unittest.TestCase):
+
+ def test_is_check_supported(self):
+ # CHECK_NONE and CHECK_CRC32 should always be supported,
+ # regardless of the options liblzma was compiled with.
+ self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
+ self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
+
+ # The .xz format spec cannot store check IDs above this value.
+ self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
+
+ # This value should not be a valid check ID.
+ self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
+
+ def test__encode_filter_properties(self):
+ with self.assertRaises(TypeError):
+ lzma._encode_filter_properties(b"not a dict")
+ with self.assertRaises(ValueError):
+ lzma._encode_filter_properties({"id": 0x100})
+ with self.assertRaises(ValueError):
+ lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
+ with self.assertRaises(lzma.LZMAError):
+ lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
+ "dist": 9001})
+
+ # Test with parameters used by zipfile module.
+ props = lzma._encode_filter_properties({
+ "id": lzma.FILTER_LZMA1,
+ "pb": 2,
+ "lp": 0,
+ "lc": 3,
+ "dict_size": 8 << 20,
+ })
+ self.assertEqual(props, b"]\x00\x00\x80\x00")
+
+ def test__decode_filter_properties(self):
+ with self.assertRaises(TypeError):
+ lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
+ with self.assertRaises(lzma.LZMAError):
+ lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
+
+ # Test with parameters used by zipfile module.
+ filterspec = lzma._decode_filter_properties(
+ lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
+ self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
+ self.assertEqual(filterspec["pb"], 2)
+ self.assertEqual(filterspec["lp"], 0)
+ self.assertEqual(filterspec["lc"], 3)
+ self.assertEqual(filterspec["dict_size"], 8 << 20)
+
+ def test_filter_properties_roundtrip(self):
+ spec1 = lzma._decode_filter_properties(
+ lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
+ reencoded = lzma._encode_filter_properties(spec1)
+ spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
+ self.assertEqual(spec1, spec2)
+
+
+# Test data:
+
+INPUT = b"""
+LAERTES
+
+ O, fear me not.
+ I stay too long: but here my father comes.
+
+ Enter POLONIUS
+
+ A double blessing is a double grace,
+ Occasion smiles upon a second leave.
+
+LORD POLONIUS
+
+ Yet here, Laertes! aboard, aboard, for shame!
+ The wind sits in the shoulder of your sail,
+ And you are stay'd for. There; my blessing with thee!
+ And these few precepts in thy memory
+ See thou character. Give thy thoughts no tongue,
+ Nor any unproportioned thought his act.
+ Be thou familiar, but by no means vulgar.
+ Those friends thou hast, and their adoption tried,
+ Grapple them to thy soul with hoops of steel;
+ But do not dull thy palm with entertainment
+ Of each new-hatch'd, unfledged comrade. Beware
+ Of entrance to a quarrel, but being in,
+ Bear't that the opposed may beware of thee.
+ Give every man thy ear, but few thy voice;
+ Take each man's censure, but reserve thy judgment.
+ Costly thy habit as thy purse can buy,
+ But not express'd in fancy; rich, not gaudy;
+ For the apparel oft proclaims the man,
+ And they in France of the best rank and station
+ Are of a most select and generous chief in that.
+ Neither a borrower nor a lender be;
+ For loan oft loses both itself and friend,
+ And borrowing dulls the edge of husbandry.
+ This above all: to thine ownself be true,
+ And it must follow, as the night the day,
+ Thou canst not then be false to any man.
+ Farewell: my blessing season this in thee!
+
+LAERTES
+
+ Most humbly do I take my leave, my lord.
+
+LORD POLONIUS
+
+ The time invites you; go; your servants tend.
+
+LAERTES
+
+ Farewell, Ophelia; and remember well
+ What I have said to you.
+
+OPHELIA
+
+ 'Tis in my memory lock'd,
+ And you yourself shall keep the key of it.
+
+LAERTES
+
+ Farewell.
+"""
+
+COMPRESSED_XZ = (
+ b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
+ b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
+ b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
+ b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
+ b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
+ b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
+ b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
+ b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
+ b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
+ b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
+ b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
+ b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
+ b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
+ b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
+ b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
+ b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
+ b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
+ b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
+ b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
+ b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
+ b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
+ b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
+ b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
+ b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
+ b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
+ b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
+ b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
+ b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
+ b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
+ b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
+ b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
+ b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
+ b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
+ b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
+ b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
+ b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
+ b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
+ b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
+ b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
+ b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
+ b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
+ b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
+ b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
+ b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
+)
+
+COMPRESSED_ALONE = (
+ b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
+ b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
+ b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
+ b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
+ b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
+ b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
+ b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
+ b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
+ b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
+ b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
+ b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
+ b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
+ b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
+ b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
+ b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
+ b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
+ b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
+ b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
+ b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
+ b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
+ b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
+ b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
+ b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
+ b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
+ b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
+ b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
+ b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
+ b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
+ b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
+ b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
+ b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
+ b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
+ b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
+ b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
+ b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
+ b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
+ b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
+ b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
+ b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
+ b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
+ b"\xfbf\x7f\xff\xf0\x19\xeax"
+)
+
+FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
+COMPRESSED_RAW_1 = (
+ b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
+ b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
+ b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
+ b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
+ b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
+ b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
+ b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
+ b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
+ b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
+ b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
+ b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
+ b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
+ b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
+ b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
+ b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
+ b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
+ b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
+ b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
+ b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
+ b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
+ b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
+ b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
+ b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
+ b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
+ b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
+ b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
+ b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
+ b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
+ b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
+ b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
+ b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
+ b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
+ b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
+ b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
+ b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
+ b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
+ b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
+ b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
+ b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
+ b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
+ b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
+ b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
+ b"\xf6*F\xb32\x00\x00\x00"
+)
+
+FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
+ {"id": lzma.FILTER_LZMA2,
+ "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
+COMPRESSED_RAW_2 = (
+ b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
+ b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
+ b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
+ b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
+ b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
+ b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
+ b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
+ b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
+ b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
+ b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
+ b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
+ b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
+ b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
+ b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
+ b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
+ b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
+ b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
+ b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
+ b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
+ b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
+ b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
+ b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
+ b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
+ b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
+ b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
+ b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
+ b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
+ b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
+ b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
+ b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
+ b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
+ b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
+ b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
+ b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
+ b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
+ b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
+ b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
+ b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
+ b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
+ b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
+ b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
+ b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
+ b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
+ b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
+ b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
+ b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
+ b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
+ b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
+ b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
+ b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
+ b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
+ b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
+ b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
+ b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
+ b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
+ b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
+ b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
+ b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
+ b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
+)
+
+FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
+ {"id": lzma.FILTER_LZMA2}]
+COMPRESSED_RAW_3 = (
+ b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
+ b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
+ b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
+ b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
+ b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
+ b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
+ b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
+ b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
+ b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
+ b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
+ b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
+ b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
+ b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
+ b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
+ b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
+ b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
+ b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
+ b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
+ b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
+ b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
+ b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
+ b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
+ b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
+ b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
+ b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
+ b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
+ b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
+ b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
+ b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
+ b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
+ b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
+ b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
+ b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
+ b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
+ b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
+ b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
+ b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
+ b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
+ b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
+ b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
+ b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
+ b"\xec!\t4\x00\x00\x00"
+)
+
+FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
+ {"id": lzma.FILTER_X86, "start_offset": 0x40},
+ {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
+COMPRESSED_RAW_4 = (
+ b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
+ b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
+ b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
+ b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
+ b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
+ b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
+ b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
+ b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
+ b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
+ b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
+ b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
+ b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
+ b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
+ b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
+ b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
+ b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
+ b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
+ b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
+ b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
+ b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
+ b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
+ b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
+ b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
+ b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
+ b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
+ b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
+ b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
+ b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
+ b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
+ b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
+ b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
+ b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
+ b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
+ b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
+ b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
+ b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
+ b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
+ b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
+ b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
+ b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
+ b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
+ b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
+ b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
+ b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
+ b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
+ b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
+ b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
+ b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
+ b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
+ b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
+ b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
+ b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
+ b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
+ b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
+ b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
+ b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
+ b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
+ b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
+ b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
+ b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
+ b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
+ b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
+ b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
+ b"\x00"
+)
+
+
+def test_main():
+ run_unittest(
+ CompressorDecompressorTestCase,
+ CompressDecompressFunctionTestCase,
+ FileTestCase,
+ OpenTestCase,
+ MiscellaneousTestCase,
+ )
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index c72eb1c..6b1e933 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -22,6 +22,10 @@ except ImportError:
class TestBase:
+ all_mailbox_types = (mailbox.Message, mailbox.MaildirMessage,
+ mailbox.mboxMessage, mailbox.MHMessage,
+ mailbox.BabylMessage, mailbox.MMDFMessage)
+
def _check_sample(self, msg):
# Inspect a mailbox.Message representation of the sample message
self.assertIsInstance(msg, email.message.Message)
@@ -91,14 +95,14 @@ class TestMailbox(TestBase):
""")
def test_add_invalid_8bit_bytes_header(self):
- key = self._box.add(self._nonascii_msg.encode('latin1'))
+ key = self._box.add(self._nonascii_msg.encode('latin-1'))
self.assertEqual(len(self._box), 1)
self.assertEqual(self._box.get_bytes(key),
- self._nonascii_msg.encode('latin1'))
+ self._nonascii_msg.encode('latin-1'))
def test_invalid_nonascii_header_as_string(self):
subj = self._nonascii_msg.splitlines()[1]
- key = self._box.add(subj.encode('latin1'))
+ key = self._box.add(subj.encode('latin-1'))
self.assertEqual(self._box.get_string(key),
'Subject: =?unknown-8bit?b?RmFsaW5hcHThciBo4Xpob3pzeuFsbO104XNz'
'YWwuIE3hciByZW5kZWx06Ww/?=\n\n')
@@ -930,8 +934,7 @@ class TestMaildir(TestMailbox, unittest.TestCase):
# the mtime and should cause a re-read. Note that "sleep
# emulation" is still in effect, as skewfactor is -3.
filename = os.path.join(self._path, 'cur', 'stray-file')
- f = open(filename, 'w')
- f.close()
+ support.create_empty_file(filename)
os.unlink(filename)
self._box._refresh()
self.assertTrue(refreshed())
@@ -1397,6 +1400,14 @@ class TestMessage(TestBase, unittest.TestCase):
# Initialize with invalid argument
self.assertRaises(TypeError, lambda: self._factory(object()))
+ def test_all_eMM_attribues_exist(self):
+ # Issue 12537
+ eMM = email.message_from_string(_sample_message)
+ msg = self._factory(_sample_message)
+ for attr in eMM.__dict__:
+ self.assertTrue(attr in msg.__dict__,
+ '{} attribute does not exist'.format(attr))
+
def test_become_message(self):
# Take on the state of another message
eMM = email.message_from_string(_sample_message)
@@ -1408,9 +1419,7 @@ class TestMessage(TestBase, unittest.TestCase):
# Copy self's format-specific data to other message formats.
# This test is superficial; better ones are in TestMessageConversion.
msg = self._factory()
- for class_ in (mailbox.Message, mailbox.MaildirMessage,
- mailbox.mboxMessage, mailbox.MHMessage,
- mailbox.BabylMessage, mailbox.MMDFMessage):
+ for class_ in self.all_mailbox_types:
other_msg = class_()
msg._explain_to(other_msg)
other_msg = email.message.Message()
@@ -1642,37 +1651,44 @@ class TestMessageConversion(TestBase, unittest.TestCase):
def test_plain_to_x(self):
# Convert Message to all formats
- for class_ in (mailbox.Message, mailbox.MaildirMessage,
- mailbox.mboxMessage, mailbox.MHMessage,
- mailbox.BabylMessage, mailbox.MMDFMessage):
+ for class_ in self.all_mailbox_types:
msg_plain = mailbox.Message(_sample_message)
msg = class_(msg_plain)
self._check_sample(msg)
def test_x_to_plain(self):
# Convert all formats to Message
- for class_ in (mailbox.Message, mailbox.MaildirMessage,
- mailbox.mboxMessage, mailbox.MHMessage,
- mailbox.BabylMessage, mailbox.MMDFMessage):
+ for class_ in self.all_mailbox_types:
msg = class_(_sample_message)
msg_plain = mailbox.Message(msg)
self._check_sample(msg_plain)
def test_x_from_bytes(self):
# Convert all formats to Message
- for class_ in (mailbox.Message, mailbox.MaildirMessage,
- mailbox.mboxMessage, mailbox.MHMessage,
- mailbox.BabylMessage, mailbox.MMDFMessage):
+ for class_ in self.all_mailbox_types:
msg = class_(_bytes_sample_message)
self._check_sample(msg)
def test_x_to_invalid(self):
# Convert all formats to an invalid format
- for class_ in (mailbox.Message, mailbox.MaildirMessage,
- mailbox.mboxMessage, mailbox.MHMessage,
- mailbox.BabylMessage, mailbox.MMDFMessage):
+ for class_ in self.all_mailbox_types:
self.assertRaises(TypeError, lambda: class_(False))
+ def test_type_specific_attributes_removed_on_conversion(self):
+ reference = {class_: class_(_sample_message).__dict__
+ for class_ in self.all_mailbox_types}
+ for class1 in self.all_mailbox_types:
+ for class2 in self.all_mailbox_types:
+ if class1 is class2:
+ continue
+ source = class1(_sample_message)
+ target = class2(source)
+ type_specific = [a for a in reference[class1]
+ if a not in reference[class2]]
+ for attr in type_specific:
+ self.assertNotIn(attr, target.__dict__,
+ "while converting {} to {}".format(class1, class2))
+
def test_maildir_to_maildir(self):
# Convert MaildirMessage to MaildirMessage
msg_maildir = mailbox.MaildirMessage(_sample_message)
diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py
new file mode 100644
index 0000000..a4cd09c
--- /dev/null
+++ b/Lib/test/test_mailcap.py
@@ -0,0 +1,221 @@
+import mailcap
+import os
+import shutil
+import test.support
+import unittest
+
+# Location of mailcap file
+MAILCAPFILE = test.support.findfile("mailcap.txt")
+
+# Dict to act as mock mailcap entry for this test
+# The keys and values should match the contents of MAILCAPFILE
+MAILCAPDICT = {
+ 'application/x-movie':
+ [{'compose': 'moviemaker %s',
+ 'x11-bitmap': '"/usr/lib/Zmail/bitmaps/movie.xbm"',
+ 'description': '"Movie"',
+ 'view': 'movieplayer %s'}],
+ 'application/*':
+ [{'copiousoutput': '',
+ 'view': 'echo "This is \\"%t\\" but is 50 \\% Greek to me" \\; cat %s'}],
+ 'audio/basic':
+ [{'edit': 'audiocompose %s',
+ 'compose': 'audiocompose %s',
+ 'description': '"An audio fragment"',
+ 'view': 'showaudio %s'}],
+ 'video/mpeg':
+ [{'view': 'mpeg_play %s'}],
+ 'application/postscript':
+ [{'needsterminal': '', 'view': 'ps-to-terminal %s'},
+ {'compose': 'idraw %s', 'view': 'ps-to-terminal %s'}],
+ 'application/x-dvi':
+ [{'view': 'xdvi %s'}],
+ 'message/external-body':
+ [{'composetyped': 'extcompose %s',
+ 'description': '"A reference to data stored in an external location"',
+ 'needsterminal': '',
+ 'view': 'showexternal %s %{access-type} %{name} %{site} %{directory} %{mode} %{server}'}],
+ 'text/richtext':
+ [{'test': 'test "`echo %{charset} | tr \'[A-Z]\' \'[a-z]\'`" = iso-8859-8',
+ 'copiousoutput': '',
+ 'view': 'shownonascii iso-8859-8 -e richtext -p %s'}],
+ 'image/x-xwindowdump':
+ [{'view': 'display %s'}],
+ 'audio/*':
+ [{'view': '/usr/local/bin/showaudio %t'}],
+ 'video/*':
+ [{'view': 'animate %s'}],
+ 'application/frame':
+ [{'print': '"cat %s | lp"', 'view': 'showframe %s'}],
+ 'image/rgb':
+ [{'view': 'display %s'}]
+}
+
+
+class HelperFunctionTest(unittest.TestCase):
+
+ def test_listmailcapfiles(self):
+ # The return value for listmailcapfiles() will vary by system.
+ # So verify that listmailcapfiles() returns a list of strings that is of
+ # non-zero length.
+ mcfiles = mailcap.listmailcapfiles()
+ self.assertIsInstance(mcfiles, list)
+ for m in mcfiles:
+ self.assertIsInstance(m, str)
+ with test.support.EnvironmentVarGuard() as env:
+ # According to RFC 1524, if MAILCAPS env variable exists, use that
+ # and only that.
+ if "MAILCAPS" in env:
+ env_mailcaps = env["MAILCAPS"].split(os.pathsep)
+ else:
+ env_mailcaps = ["/testdir1/.mailcap", "/testdir2/mailcap"]
+ env["MAILCAPS"] = os.pathsep.join(env_mailcaps)
+ mcfiles = mailcap.listmailcapfiles()
+ self.assertEqual(env_mailcaps, mcfiles)
+
+ def test_readmailcapfile(self):
+ # Test readmailcapfile() using test file. It should match MAILCAPDICT.
+ with open(MAILCAPFILE, 'r') as mcf:
+ d = mailcap.readmailcapfile(mcf)
+ self.assertDictEqual(d, MAILCAPDICT)
+
+ def test_lookup(self):
+ # Test without key
+ expected = [{'view': 'mpeg_play %s'}, {'view': 'animate %s'}]
+ actual = mailcap.lookup(MAILCAPDICT, 'video/mpeg')
+ self.assertListEqual(expected, actual)
+
+ # Test with key
+ key = 'compose'
+ expected = [{'edit': 'audiocompose %s',
+ 'compose': 'audiocompose %s',
+ 'description': '"An audio fragment"',
+ 'view': 'showaudio %s'}]
+ actual = mailcap.lookup(MAILCAPDICT, 'audio/basic', key)
+ self.assertListEqual(expected, actual)
+
+ def test_subst(self):
+ plist = ['id=1', 'number=2', 'total=3']
+ # test case: ([field, MIMEtype, filename, plist=[]], <expected string>)
+ test_cases = [
+ (["", "audio/*", "foo.txt"], ""),
+ (["echo foo", "audio/*", "foo.txt"], "echo foo"),
+ (["echo %s", "audio/*", "foo.txt"], "echo foo.txt"),
+ (["echo %t", "audio/*", "foo.txt"], "echo audio/*"),
+ (["echo \%t", "audio/*", "foo.txt"], "echo %t"),
+ (["echo foo", "audio/*", "foo.txt", plist], "echo foo"),
+ (["echo %{total}", "audio/*", "foo.txt", plist], "echo 3")
+ ]
+ for tc in test_cases:
+ self.assertEqual(mailcap.subst(*tc[0]), tc[1])
+
+
+class GetcapsTest(unittest.TestCase):
+
+ def test_mock_getcaps(self):
+ # Test mailcap.getcaps() using mock mailcap file in this dir.
+ # Temporarily override any existing system mailcap file by pointing the
+ # MAILCAPS environment variable to our mock file.
+ with test.support.EnvironmentVarGuard() as env:
+ env["MAILCAPS"] = MAILCAPFILE
+ caps = mailcap.getcaps()
+ self.assertDictEqual(caps, MAILCAPDICT)
+
+ def test_system_mailcap(self):
+ # Test mailcap.getcaps() with mailcap file(s) on system, if any.
+ caps = mailcap.getcaps()
+ self.assertIsInstance(caps, dict)
+ mailcapfiles = mailcap.listmailcapfiles()
+ existingmcfiles = [mcf for mcf in mailcapfiles if os.path.exists(mcf)]
+ if existingmcfiles:
+ # At least 1 mailcap file exists, so test that.
+ for (k, v) in caps.items():
+ self.assertIsInstance(k, str)
+ self.assertIsInstance(v, list)
+ for e in v:
+ self.assertIsInstance(e, dict)
+ else:
+ # No mailcap files on system. getcaps() should return empty dict.
+ self.assertEqual({}, caps)
+
+
+class FindmatchTest(unittest.TestCase):
+
+ def test_findmatch(self):
+
+ # default findmatch arguments
+ c = MAILCAPDICT
+ fname = "foo.txt"
+ plist = ["access-type=default", "name=john", "site=python.org",
+ "directory=/tmp", "mode=foo", "server=bar"]
+ audio_basic_entry = {
+ 'edit': 'audiocompose %s',
+ 'compose': 'audiocompose %s',
+ 'description': '"An audio fragment"',
+ 'view': 'showaudio %s'
+ }
+ audio_entry = {"view": "/usr/local/bin/showaudio %t"}
+ video_entry = {'view': 'animate %s'}
+ message_entry = {
+ 'composetyped': 'extcompose %s',
+ 'description': '"A reference to data stored in an external location"', 'needsterminal': '',
+ 'view': 'showexternal %s %{access-type} %{name} %{site} %{directory} %{mode} %{server}'
+ }
+
+ # test case: (findmatch args, findmatch keyword args, expected output)
+ # positional args: caps, MIMEtype
+ # keyword args: key="view", filename="/dev/null", plist=[]
+ # output: (command line, mailcap entry)
+ cases = [
+ ([{}, "video/mpeg"], {}, (None, None)),
+ ([c, "foo/bar"], {}, (None, None)),
+ ([c, "video/mpeg"], {}, ('mpeg_play /dev/null', {'view': 'mpeg_play %s'})),
+ ([c, "audio/basic", "edit"], {}, ("audiocompose /dev/null", audio_basic_entry)),
+ ([c, "audio/basic", "compose"], {}, ("audiocompose /dev/null", audio_basic_entry)),
+ ([c, "audio/basic", "description"], {}, ('"An audio fragment"', audio_basic_entry)),
+ ([c, "audio/basic", "foobar"], {}, (None, None)),
+ ([c, "video/*"], {"filename": fname}, ("animate %s" % fname, video_entry)),
+ ([c, "audio/basic", "compose"],
+ {"filename": fname},
+ ("audiocompose %s" % fname, audio_basic_entry)),
+ ([c, "audio/basic"],
+ {"key": "description", "filename": fname},
+ ('"An audio fragment"', audio_basic_entry)),
+ ([c, "audio/*"],
+ {"filename": fname},
+ ("/usr/local/bin/showaudio audio/*", audio_entry)),
+ ([c, "message/external-body"],
+ {"plist": plist},
+ ("showexternal /dev/null default john python.org /tmp foo bar", message_entry))
+ ]
+ self._run_cases(cases)
+
+ @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system")
+ def test_test(self):
+ # findmatch() will automatically check any "test" conditions and skip
+ # the entry if the check fails.
+ caps = {"test/pass": [{"test": "test 1 -eq 1"}],
+ "test/fail": [{"test": "test 1 -eq 0"}]}
+ # test case: (findmatch args, findmatch keyword args, expected output)
+ # positional args: caps, MIMEtype, key ("test")
+ # keyword args: N/A
+ # output: (command line, mailcap entry)
+ cases = [
+ # findmatch will return the mailcap entry for test/pass because it evaluates to true
+ ([caps, "test/pass", "test"], {}, ("test 1 -eq 1", {"test": "test 1 -eq 1"})),
+ # findmatch will return None because test/fail evaluates to false
+ ([caps, "test/fail", "test"], {}, (None, None))
+ ]
+ self._run_cases(cases)
+
+ def _run_cases(self, cases):
+ for c in cases:
+ self.assertEqual(mailcap.findmatch(*c[0], **c[1]), c[2])
+
+
+def test_main():
+ test.support.run_unittest(HelperFunctionTest, GetcapsTest, FindmatchTest)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 96a70ec..83c348c 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -6,6 +6,7 @@ import marshal
import sys
import unittest
import os
+import types
class HelperMixin:
def helper(self, sample, *extra):
@@ -114,6 +115,22 @@ class CodeTestCase(unittest.TestCase):
codes = (ExceptionTestCase.test_exceptions.__code__,) * count
marshal.loads(marshal.dumps(codes))
+ def test_different_filenames(self):
+ co1 = compile("x", "f1", "exec")
+ co2 = compile("y", "f2", "exec")
+ co1, co2 = marshal.loads(marshal.dumps((co1, co2)))
+ self.assertEqual(co1.co_filename, "f1")
+ self.assertEqual(co2.co_filename, "f2")
+
+ @support.cpython_only
+ def test_same_filename_used(self):
+ s = """def f(): pass\ndef g(): pass"""
+ co = compile(s, "myfile", "exec")
+ co = marshal.loads(marshal.dumps(co))
+ for obj in co.co_consts:
+ if isinstance(obj, types.CodeType):
+ self.assertIs(co.co_filename, obj.co_filename)
+
class ContainerTestCase(unittest.TestCase, HelperMixin):
d = {'astring': 'foo@bar.baz.spam',
'afloat': 7283.43,
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index dddc889..715003a 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -2,11 +2,12 @@
# XXXX Should not do tests around zero only
from test.support import run_unittest, verbose, requires_IEEE_754
+from test import support
import unittest
import math
import os
+import platform
import sys
-import random
import struct
import sysconfig
@@ -457,12 +458,12 @@ class MathTests(unittest.TestCase):
def testFmod(self):
self.assertRaises(TypeError, math.fmod)
- self.ftest('fmod(10,1)', math.fmod(10,1), 0)
- self.ftest('fmod(10,0.5)', math.fmod(10,0.5), 0)
- self.ftest('fmod(10,1.5)', math.fmod(10,1.5), 1)
- self.ftest('fmod(-10,1)', math.fmod(-10,1), 0)
- self.ftest('fmod(-10,0.5)', math.fmod(-10,0.5), 0)
- self.ftest('fmod(-10,1.5)', math.fmod(-10,1.5), -1)
+ self.ftest('fmod(10, 1)', math.fmod(10, 1), 0.0)
+ self.ftest('fmod(10, 0.5)', math.fmod(10, 0.5), 0.0)
+ self.ftest('fmod(10, 1.5)', math.fmod(10, 1.5), 1.0)
+ self.ftest('fmod(-10, 1)', math.fmod(-10, 1), -0.0)
+ self.ftest('fmod(-10, 0.5)', math.fmod(-10, 0.5), -0.0)
+ self.ftest('fmod(-10, 1.5)', math.fmod(-10, 1.5), -1.0)
self.assertTrue(math.isnan(math.fmod(NAN, 1.)))
self.assertTrue(math.isnan(math.fmod(1., NAN)))
self.assertTrue(math.isnan(math.fmod(NAN, NAN)))
@@ -650,6 +651,33 @@ class MathTests(unittest.TestCase):
n= 2**90
self.assertAlmostEqual(math.log1p(n), math.log1p(float(n)))
+ @requires_IEEE_754
+ def testLog2(self):
+ self.assertRaises(TypeError, math.log2)
+
+ # Check some integer values
+ self.assertEqual(math.log2(1), 0.0)
+ self.assertEqual(math.log2(2), 1.0)
+ self.assertEqual(math.log2(4), 2.0)
+
+ # Large integer values
+ self.assertEqual(math.log2(2**1023), 1023.0)
+ self.assertEqual(math.log2(2**1024), 1024.0)
+ self.assertEqual(math.log2(2**2000), 2000.0)
+
+ self.assertRaises(ValueError, math.log2, -1.5)
+ self.assertRaises(ValueError, math.log2, NINF)
+ self.assertTrue(math.isnan(math.log2(NAN)))
+
+ @requires_IEEE_754
+ # log2() is not accurate enough on Mac OS X Tiger (10.4)
+ @support.requires_mac_ver(10, 5)
+ def testLog2Exact(self):
+ # Check that we get exact equality for log2 of powers of 2.
+ actual = [math.log2(math.ldexp(1.0, n)) for n in range(-1074, 1024)]
+ expected = [float(n) for n in range(-1074, 1024)]
+ self.assertEqual(actual, expected)
+
def testLog10(self):
self.assertRaises(TypeError, math.log10)
self.ftest('log10(0.1)', math.log10(0.1), -1)
@@ -1010,7 +1038,6 @@ class MathTests(unittest.TestCase):
@requires_IEEE_754
def test_mtestfile(self):
- ALLOWED_ERROR = 20 # permitted error, in ulps
fail_fmt = "{}:{}({!r}): expected {!r}, got {!r}"
failures = []
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
index 7c0c84f..e5db945 100644
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -658,7 +658,7 @@ class CBytesIOTest(PyBytesIOTest):
@support.cpython_only
def test_sizeof(self):
- basesize = support.calcobjsize('P2PP2PP')
+ basesize = support.calcobjsize('P2nN2Pn')
check = self.check_sizeof
self.assertEqual(object.__sizeof__(io.BytesIO()), basesize)
check(io.BytesIO(), basesize )
diff --git a/Lib/test/test_memoryview.py b/Lib/test/test_memoryview.py
index 0bfddd9..ee6b15a 100644
--- a/Lib/test/test_memoryview.py
+++ b/Lib/test/test_memoryview.py
@@ -1,6 +1,7 @@
"""Unit tests for the memoryview
-XXX We need more tests! Some tests are in test_bytes
+ Some tests are in test_bytes. Many tests that require _testbuffer.ndarray
+ are in test_buffer.
"""
import unittest
@@ -24,15 +25,14 @@ class AbstractMemoryTests:
return filter(None, [self.ro_type, self.rw_type])
def check_getitem_with_type(self, tp):
- item = self.getitem_type
b = tp(self._source)
oldrefcount = sys.getrefcount(b)
m = self._view(b)
- self.assertEqual(m[0], item(b"a"))
- self.assertIsInstance(m[0], bytes)
- self.assertEqual(m[5], item(b"f"))
- self.assertEqual(m[-1], item(b"f"))
- self.assertEqual(m[-6], item(b"a"))
+ self.assertEqual(m[0], ord(b"a"))
+ self.assertIsInstance(m[0], int)
+ self.assertEqual(m[5], ord(b"f"))
+ self.assertEqual(m[-1], ord(b"f"))
+ self.assertEqual(m[-6], ord(b"a"))
# Bounds checking
self.assertRaises(IndexError, lambda: m[6])
self.assertRaises(IndexError, lambda: m[-7])
@@ -76,7 +76,9 @@ class AbstractMemoryTests:
b = self.rw_type(self._source)
oldrefcount = sys.getrefcount(b)
m = self._view(b)
- m[0] = tp(b"0")
+ m[0] = ord(b'1')
+ self._check_contents(tp, b, b"1bcdef")
+ m[0:1] = tp(b"0")
self._check_contents(tp, b, b"0bcdef")
m[1:3] = tp(b"12")
self._check_contents(tp, b, b"012def")
@@ -102,10 +104,17 @@ class AbstractMemoryTests:
# Wrong index/slice types
self.assertRaises(TypeError, setitem, 0.0, b"a")
self.assertRaises(TypeError, setitem, (0,), b"a")
+ self.assertRaises(TypeError, setitem, (slice(0,1,1), 0), b"a")
+ self.assertRaises(TypeError, setitem, (0, slice(0,1,1)), b"a")
+ self.assertRaises(TypeError, setitem, (0,), b"a")
self.assertRaises(TypeError, setitem, "a", b"a")
+ # Not implemented: multidimensional slices
+ slices = (slice(0,1,1), slice(0,1,2))
+ self.assertRaises(NotImplementedError, setitem, slices, b"a")
# Trying to resize the memory object
- self.assertRaises(ValueError, setitem, 0, b"")
- self.assertRaises(ValueError, setitem, 0, b"ab")
+ exc = ValueError if m.format == 'c' else TypeError
+ self.assertRaises(exc, setitem, 0, b"")
+ self.assertRaises(exc, setitem, 0, b"ab")
self.assertRaises(ValueError, setitem, slice(1,1), b"a")
self.assertRaises(ValueError, setitem, slice(0,2), b"a")
@@ -175,7 +184,7 @@ class AbstractMemoryTests:
self.assertEqual(m.shape, (6,))
self.assertEqual(len(m), 6)
self.assertEqual(m.strides, (self.itemsize,))
- self.assertEqual(m.suboffsets, None)
+ self.assertEqual(m.suboffsets, ())
return m
def test_attributes_readonly(self):
@@ -209,12 +218,16 @@ class AbstractMemoryTests:
# If tp is a factory rather than a plain type, skip
continue
+ class MyView():
+ def __init__(self, base):
+ self.m = memoryview(base)
class MySource(tp):
pass
class MyObject:
pass
- # Create a reference cycle through a memoryview object
+ # Create a reference cycle through a memoryview object.
+ # This exercises mbuf_clear().
b = MySource(tp(b'abc'))
m = self._view(b)
o = MyObject()
@@ -226,6 +239,17 @@ class AbstractMemoryTests:
gc.collect()
self.assertTrue(wr() is None, wr())
+ # This exercises memory_clear().
+ m = MyView(tp(b'abc'))
+ o = MyObject()
+ m.x = m
+ m.o = o
+ wr = weakref.ref(o)
+ m = o = None
+ # The cycle must be broken
+ gc.collect()
+ self.assertTrue(wr() is None, wr())
+
def _check_released(self, m, tp):
check = self.assertRaisesRegex(ValueError, "released")
with check: bytes(m)
@@ -283,6 +307,51 @@ class AbstractMemoryTests:
i = io.BytesIO(b'ZZZZ')
self.assertRaises(TypeError, i.readinto, m)
+ def test_getbuf_fail(self):
+ self.assertRaises(TypeError, self._view, {})
+
+ def test_hash(self):
+ # Memoryviews of readonly (hashable) types are hashable, and they
+ # hash as hash(obj.tobytes()).
+ tp = self.ro_type
+ if tp is None:
+ self.skipTest("no read-only type to test")
+ b = tp(self._source)
+ m = self._view(b)
+ self.assertEqual(hash(m), hash(b"abcdef"))
+ # Releasing the memoryview keeps the stored hash value (as with weakrefs)
+ m.release()
+ self.assertEqual(hash(m), hash(b"abcdef"))
+ # Hashing a memoryview for the first time after it is released
+ # results in an error (as with weakrefs).
+ m = self._view(b)
+ m.release()
+ self.assertRaises(ValueError, hash, m)
+
+ def test_hash_writable(self):
+ # Memoryviews of writable types are unhashable
+ tp = self.rw_type
+ if tp is None:
+ self.skipTest("no writable type to test")
+ b = tp(self._source)
+ m = self._view(b)
+ self.assertRaises(ValueError, hash, m)
+
+ def test_weakref(self):
+ # Check memoryviews are weakrefable
+ for tp in self._types:
+ b = tp(self._source)
+ m = self._view(b)
+ L = []
+ def callback(wr, b=b):
+ L.append(b)
+ wr = weakref.ref(m, callback)
+ self.assertIs(wr(), m)
+ del m
+ test.support.gc_collect()
+ self.assertIs(wr(), None)
+ self.assertIs(L[0], b)
+
# Variations on source objects for the buffer: bytes-like objects, then arrays
# with itemsize > 1.
# NOTE: support for multi-dimensional objects is unimplemented.
diff --git a/Lib/test/test_metaclass.py b/Lib/test/test_metaclass.py
index 219ab99..e6fe20a 100644
--- a/Lib/test/test_metaclass.py
+++ b/Lib/test/test_metaclass.py
@@ -159,6 +159,7 @@ Use a __prepare__ method that returns an instrumented dict.
... bar = 123
...
d['__module__'] = 'test.test_metaclass'
+ d['__qualname__'] = 'C'
d['foo'] = 4
d['foo'] = 42
d['bar'] = 123
@@ -177,12 +178,12 @@ Use a metaclass that doesn't derive from type.
... b = 24
...
meta: C ()
- ns: [('__module__', 'test.test_metaclass'), ('a', 42), ('b', 24)]
+ ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 42), ('b', 24)]
kw: []
>>> type(C) is dict
True
>>> print(sorted(C.items()))
- [('__module__', 'test.test_metaclass'), ('a', 42), ('b', 24)]
+ [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 42), ('b', 24)]
>>>
And again, with a __prepare__ attribute.
@@ -199,11 +200,12 @@ And again, with a __prepare__ attribute.
...
prepare: C () [('other', 'booh')]
d['__module__'] = 'test.test_metaclass'
+ d['__qualname__'] = 'C'
d['a'] = 1
d['a'] = 2
d['b'] = 3
meta: C ()
- ns: [('__module__', 'test.test_metaclass'), ('a', 2), ('b', 3)]
+ ns: [('__module__', 'test.test_metaclass'), ('__qualname__', 'C'), ('a', 2), ('b', 3)]
kw: [('other', 'booh')]
>>>
@@ -246,7 +248,13 @@ Test failures in looking up the __prepare__ method work.
"""
-__test__ = {'doctests' : doctests}
+import sys
+
+# Trace function introduces __locals__ which causes various tests to fail.
+if hasattr(sys, 'gettrace') and sys.gettrace():
+ __test__ = {}
+else:
+ __test__ = {'doctests' : doctests}
def test_main(verbose=False):
from test import support
diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
index 4a69b00..0427ba3 100644
--- a/Lib/test/test_minidom.py
+++ b/Lib/test/test_minidom.py
@@ -4,9 +4,7 @@ import pickle
from test.support import verbose, run_unittest, findfile
import unittest
-import xml.dom
import xml.dom.minidom
-import xml.parsers.expat
from xml.dom.minidom import parse, Node, Document, parseString
from xml.dom.minidom import getDOMImplementation
@@ -14,7 +12,6 @@ from xml.dom.minidom import getDOMImplementation
tstfile = findfile("test.xml", subdir="xmltestdata")
-
# The tests of DocumentType importing use these helpers to construct
# the documents to work with, since not all DOM builders actually
# create the DocumentType nodes.
@@ -50,7 +47,7 @@ class MinidomTest(unittest.TestCase):
def checkWholeText(self, node, s):
t = node.wholeText
- self.confirm(t == s, "looking for %s, found %s" % (repr(s), repr(t)))
+ self.confirm(t == s, "looking for %r, found %r" % (s, t))
def testParseFromFile(self):
with open(tstfile) as file:
@@ -282,6 +279,7 @@ class MinidomTest(unittest.TestCase):
child.setAttribute("def", "ghi")
self.confirm(len(child.attributes) == 1)
+ self.assertRaises(xml.dom.NotFoundErr, child.removeAttribute, "foo")
child.removeAttribute("def")
self.confirm(len(child.attributes) == 0)
dom.unlink()
@@ -293,6 +291,8 @@ class MinidomTest(unittest.TestCase):
child.setAttributeNS("http://www.w3.org", "xmlns:python",
"http://www.python.org")
child.setAttributeNS("http://www.python.org", "python:abcattr", "foo")
+ self.assertRaises(xml.dom.NotFoundErr, child.removeAttributeNS,
+ "foo", "http://www.python.org")
self.confirm(len(child.attributes) == 2)
child.removeAttributeNS("http://www.python.org", "abcattr")
self.confirm(len(child.attributes) == 1)
@@ -304,11 +304,23 @@ class MinidomTest(unittest.TestCase):
child.setAttribute("spam", "jam")
self.confirm(len(child.attributes) == 1)
node = child.getAttributeNode("spam")
+ self.assertRaises(xml.dom.NotFoundErr, child.removeAttributeNode,
+ None)
child.removeAttributeNode(node)
self.confirm(len(child.attributes) == 0
and child.getAttributeNode("spam") is None)
+ dom2 = Document()
+ child2 = dom2.appendChild(dom.createElement("foo"))
+ self.assertRaises(xml.dom.NotFoundErr, child.removeAttributeNode,
+ node)
dom.unlink()
+ def testHasAttribute(self):
+ dom = Document()
+ child = dom.appendChild(dom.createElement("foo"))
+ child.setAttribute("spam", "jam")
+ self.confirm(child.hasAttribute("spam"))
+
def testChangeAttr(self):
dom = parseString("<abc/>")
el = dom.documentElement
@@ -592,7 +604,13 @@ class MinidomTest(unittest.TestCase):
def testFirstChild(self): pass
- def testHasChildNodes(self): pass
+ def testHasChildNodes(self):
+ dom = parseString("<doc><foo/></doc>")
+ doc = dom.documentElement
+ self.assertTrue(dom.hasChildNodes())
+ dom2 = parseString("<doc/>")
+ doc2 = dom2.documentElement
+ self.assertFalse(doc2.hasChildNodes())
def _testCloneElementCopiesAttributes(self, e1, e2, test):
attrs1 = e1.attributes
@@ -1041,41 +1059,6 @@ class MinidomTest(unittest.TestCase):
"test NodeList.item()")
doc.unlink()
- def testSAX2DOM(self):
- from xml.dom import pulldom
-
- sax2dom = pulldom.SAX2DOM()
- sax2dom.startDocument()
- sax2dom.startElement("doc", {})
- sax2dom.characters("text")
- sax2dom.startElement("subelm", {})
- sax2dom.characters("text")
- sax2dom.endElement("subelm")
- sax2dom.characters("text")
- sax2dom.endElement("doc")
- sax2dom.endDocument()
-
- doc = sax2dom.document
- root = doc.documentElement
- (text1, elm1, text2) = root.childNodes
- text3 = elm1.childNodes[0]
-
- self.confirm(text1.previousSibling is None and
- text1.nextSibling is elm1 and
- elm1.previousSibling is text1 and
- elm1.nextSibling is text2 and
- text2.previousSibling is elm1 and
- text2.nextSibling is None and
- text3.previousSibling is None and
- text3.nextSibling is None, "testSAX2DOM - siblings")
-
- self.confirm(root.parentNode is doc and
- text1.parentNode is root and
- elm1.parentNode is root and
- text2.parentNode is root and
- text3.parentNode is elm1, "testSAX2DOM - parents")
- doc.unlink()
-
def testEncodings(self):
doc = parseString('<foo>&#x20ac;</foo>')
self.assertEqual(doc.toxml(),
@@ -1084,6 +1067,11 @@ class MinidomTest(unittest.TestCase):
b'<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>')
self.assertEqual(doc.toxml('iso-8859-15'),
b'<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>')
+ self.assertEqual(doc.toxml('us-ascii'),
+ b'<?xml version="1.0" encoding="us-ascii"?><foo>&#8364;</foo>')
+ self.assertEqual(doc.toxml('utf-16'),
+ '<?xml version="1.0" encoding="utf-16"?>'
+ '<foo>\u20ac</foo>'.encode('utf-16'))
# Verify that character decoding errors throw exceptions instead
# of crashing
@@ -1522,12 +1510,21 @@ class MinidomTest(unittest.TestCase):
doc.appendChild(doc.createComment("foo--bar"))
self.assertRaises(ValueError, doc.toxml)
+
def testEmptyXMLNSValue(self):
doc = parseString("<element xmlns=''>\n"
"<foo/>\n</element>")
doc2 = parseString(doc.toxml())
self.confirm(doc2.namespaceURI == xml.dom.EMPTY_NAMESPACE)
+ def testDocRemoveChild(self):
+ doc = parse(tstfile)
+ title_tag = doc.documentElement.getElementsByTagName("TITLE")[0]
+ self.assertRaises( xml.dom.NotFoundErr, doc.removeChild, title_tag)
+ num_children_before = len(doc.childNodes)
+ doc.removeChild(doc.childNodes[0])
+ num_children_after = len(doc.childNodes)
+ self.assertTrue(num_children_after == num_children_before - 1)
def test_main():
run_unittest(MinidomTest)
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index 28b52a9..a3de398 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -417,6 +417,35 @@ class MmapTests(unittest.TestCase):
m[x] = b
self.assertEqual(m[x], b)
+ def test_read_all(self):
+ m = mmap.mmap(-1, 16)
+ self.addCleanup(m.close)
+
+ # With no parameters, or None or a negative argument, reads all
+ m.write(bytes(range(16)))
+ m.seek(0)
+ self.assertEqual(m.read(), bytes(range(16)))
+ m.seek(8)
+ self.assertEqual(m.read(), bytes(range(8, 16)))
+ m.seek(16)
+ self.assertEqual(m.read(), b'')
+ m.seek(3)
+ self.assertEqual(m.read(None), bytes(range(3, 16)))
+ m.seek(4)
+ self.assertEqual(m.read(-1), bytes(range(4, 16)))
+ m.seek(5)
+ self.assertEqual(m.read(-2), bytes(range(5, 16)))
+ m.seek(9)
+ self.assertEqual(m.read(-42), bytes(range(9, 16)))
+
+ def test_read_invalid_arg(self):
+ m = mmap.mmap(-1, 16)
+ self.addCleanup(m.close)
+
+ self.assertRaises(TypeError, m.read, 'foo')
+ self.assertRaises(TypeError, m.read, 5.5)
+ self.assertRaises(TypeError, m.read, [1, 2, 3])
+
def test_extended_getslice(self):
# Test extended slicing by comparing with list slicing.
s = bytes(reversed(range(256)))
@@ -543,8 +572,7 @@ class MmapTests(unittest.TestCase):
f.close()
def test_error(self):
- self.assertTrue(issubclass(mmap.error, EnvironmentError))
- self.assertIn("mmap.error", str(mmap.error))
+ self.assertIs(mmap.error, OSError)
def test_io_methods(self):
data = b"0123456789"
diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py
index 15836ca..e5a2525 100644
--- a/Lib/test/test_module.py
+++ b/Lib/test/test_module.py
@@ -5,6 +5,15 @@ from test.support import run_unittest, gc_collect
import sys
ModuleType = type(sys)
+class FullLoader:
+ @classmethod
+ def module_repr(cls, m):
+ return "<module '{}' (crafted)>".format(m.__name__)
+
+class BareLoader:
+ pass
+
+
class ModuleTests(unittest.TestCase):
def test_uninitialized(self):
# An uninitialized module has no __dict__ or __name__,
@@ -70,16 +79,100 @@ class ModuleTests(unittest.TestCase):
m = ModuleType("foo")
m.destroyed = destroyed
s = """class A:
- def __del__(self, destroyed=destroyed):
- destroyed.append(1)
-a = A()"""
+ def __init__(self, l):
+ self.l = l
+ def __del__(self):
+ self.l.append(1)
+a = A(destroyed)"""
exec(s, m.__dict__)
del m
gc_collect()
self.assertEqual(destroyed, [1])
+ def test_module_repr_minimal(self):
+ # reprs when modules have no __file__, __name__, or __loader__
+ m = ModuleType('foo')
+ del m.__name__
+ self.assertEqual(repr(m), "<module '?'>")
+
+ def test_module_repr_with_name(self):
+ m = ModuleType('foo')
+ self.assertEqual(repr(m), "<module 'foo'>")
+
+ def test_module_repr_with_name_and_filename(self):
+ m = ModuleType('foo')
+ m.__file__ = '/tmp/foo.py'
+ self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
+
+ def test_module_repr_with_filename_only(self):
+ m = ModuleType('foo')
+ del m.__name__
+ m.__file__ = '/tmp/foo.py'
+ self.assertEqual(repr(m), "<module '?' from '/tmp/foo.py'>")
+
+ def test_module_repr_with_bare_loader_but_no_name(self):
+ m = ModuleType('foo')
+ del m.__name__
+ # Yes, a class not an instance.
+ m.__loader__ = BareLoader
+ self.assertEqual(
+ repr(m), "<module '?' (<class 'test.test_module.BareLoader'>)>")
+
+ def test_module_repr_with_full_loader_but_no_name(self):
+ # m.__loader__.module_repr() will fail because the module has no
+ # m.__name__. This exception will get suppressed and instead the
+ # loader's repr will be used.
+ m = ModuleType('foo')
+ del m.__name__
+ # Yes, a class not an instance.
+ m.__loader__ = FullLoader
+ self.assertEqual(
+ repr(m), "<module '?' (<class 'test.test_module.FullLoader'>)>")
+
+ def test_module_repr_with_bare_loader(self):
+ m = ModuleType('foo')
+ # Yes, a class not an instance.
+ m.__loader__ = BareLoader
+ self.assertEqual(
+ repr(m), "<module 'foo' (<class 'test.test_module.BareLoader'>)>")
+
+ def test_module_repr_with_full_loader(self):
+ m = ModuleType('foo')
+ # Yes, a class not an instance.
+ m.__loader__ = FullLoader
+ self.assertEqual(
+ repr(m), "<module 'foo' (crafted)>")
+
+ def test_module_repr_with_bare_loader_and_filename(self):
+ # Because the loader has no module_repr(), use the file name.
+ m = ModuleType('foo')
+ # Yes, a class not an instance.
+ m.__loader__ = BareLoader
+ m.__file__ = '/tmp/foo.py'
+ self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
+
+ def test_module_repr_with_full_loader_and_filename(self):
+ # Even though the module has an __file__, use __loader__.module_repr()
+ m = ModuleType('foo')
+ # Yes, a class not an instance.
+ m.__loader__ = FullLoader
+ m.__file__ = '/tmp/foo.py'
+ self.assertEqual(repr(m), "<module 'foo' (crafted)>")
+
+ def test_module_repr_builtin(self):
+ self.assertEqual(repr(sys), "<module 'sys' (built-in)>")
+
+ def test_module_repr_source(self):
+ r = repr(unittest)
+ self.assertEqual(r[:25], "<module 'unittest' from '")
+ self.assertEqual(r[-13:], "__init__.py'>")
+
+ # frozen and namespace module reprs are tested in importlib.
+
+
def test_main():
run_unittest(ModuleTests)
+
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
index a184217..c5fc320 100644
--- a/Lib/test/test_modulefinder.py
+++ b/Lib/test/test_modulefinder.py
@@ -1,7 +1,7 @@
-import __future__
import os
+import errno
+import shutil
import unittest
-import distutils.dir_util
import tempfile
from test import support
@@ -9,7 +9,7 @@ from test import support
import modulefinder
TEST_DIR = tempfile.mkdtemp()
-TEST_PATH = [TEST_DIR, os.path.dirname(__future__.__file__)]
+TEST_PATH = [TEST_DIR, os.path.dirname(tempfile.__file__)]
# Each test description is a list of 5 items:
#
@@ -196,12 +196,17 @@ a/module.py
from . import bar
"""]
+
def open_file(path):
- ##print "#", os.path.abspath(path)
dirname = os.path.dirname(path)
- distutils.dir_util.mkpath(dirname)
+ try:
+ os.makedirs(dirname)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
return open(path, "w")
+
def create_package(source):
ofi = None
try:
@@ -216,6 +221,7 @@ def create_package(source):
if ofi:
ofi.close()
+
class ModuleFinderTest(unittest.TestCase):
def _do_test(self, info, report=False):
import_this, modules, missing, maybe_missing, source = info
@@ -234,19 +240,17 @@ class ModuleFinderTest(unittest.TestCase):
## import traceback; traceback.print_exc()
## sys.path = opath
## return
- modules = set(modules)
- found = set(mf.modules.keys())
- more = list(found - modules)
- less = list(modules - found)
+ modules = sorted(set(modules))
+ found = sorted(mf.modules)
# check if we found what we expected, not more, not less
- self.assertEqual((more, less), ([], []))
+ self.assertEqual(found, modules)
# check for missing and maybe missing modules
bad, maybe = mf.any_missing_maybe()
self.assertEqual(bad, missing)
self.assertEqual(maybe, maybe_missing)
finally:
- distutils.dir_util.remove_tree(TEST_DIR)
+ shutil.rmtree(TEST_DIR)
def test_package(self):
self._do_test(package_test)
@@ -254,25 +258,23 @@ class ModuleFinderTest(unittest.TestCase):
def test_maybe(self):
self._do_test(maybe_test)
- if getattr(__future__, "absolute_import", None):
+ def test_maybe_new(self):
+ self._do_test(maybe_test_new)
- def test_maybe_new(self):
- self._do_test(maybe_test_new)
+ def test_absolute_imports(self):
+ self._do_test(absolute_import_test)
- def test_absolute_imports(self):
- self._do_test(absolute_import_test)
+ def test_relative_imports(self):
+ self._do_test(relative_import_test)
- def test_relative_imports(self):
- self._do_test(relative_import_test)
+ def test_relative_imports_2(self):
+ self._do_test(relative_import_test_2)
- def test_relative_imports_2(self):
- self._do_test(relative_import_test_2)
+ def test_relative_imports_3(self):
+ self._do_test(relative_import_test_3)
- def test_relative_imports_3(self):
- self._do_test(relative_import_test_3)
def test_main():
- distutils.log.set_threshold(distutils.log.WARN)
support.run_unittest(ModuleFinderTest)
if __name__ == "__main__":
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
index 86c68dc..feb7bd5 100644
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -247,20 +247,16 @@ class Test_ISO2022(unittest.TestCase):
self.assertFalse(any(x > 0x80 for x in e))
def test_bug1572832(self):
- if sys.maxunicode >= 0x10000:
- myunichr = chr
- else:
- myunichr = lambda x: chr(0xD7C0+(x>>10)) + chr(0xDC00+(x&0x3FF))
-
for x in range(0x10000, 0x110000):
# Any ISO 2022 codec will cause the segfault
- myunichr(x).encode('iso_2022_jp', 'ignore')
+ chr(x).encode('iso_2022_jp', 'ignore')
class TestStateful(unittest.TestCase):
text = '\u4E16\u4E16'
encoding = 'iso-2022-jp'
expected = b'\x1b$B@$@$'
- expected_reset = b'\x1b$B@$@$\x1b(B'
+ reset = b'\x1b(B'
+ expected_reset = expected + reset
def test_encode(self):
self.assertEqual(self.text.encode(self.encoding), self.expected_reset)
@@ -271,6 +267,8 @@ class TestStateful(unittest.TestCase):
encoder.encode(char)
for char in self.text)
self.assertEqual(output, self.expected)
+ self.assertEqual(encoder.encode('', final=True), self.reset)
+ self.assertEqual(encoder.encode('', final=True), b'')
def test_incrementalencoder_final(self):
encoder = codecs.getincrementalencoder(self.encoding)()
@@ -279,12 +277,14 @@ class TestStateful(unittest.TestCase):
encoder.encode(char, index == last_index)
for index, char in enumerate(self.text))
self.assertEqual(output, self.expected_reset)
+ self.assertEqual(encoder.encode('', final=True), b'')
class TestHZStateful(TestStateful):
text = '\u804a\u804a'
encoding = 'hz'
expected = b'~{ADAD'
- expected_reset = b'~{ADAD~}'
+ reset = b'~}'
+ expected_reset = expected + reset
def test_main():
support.run_unittest(__name__)
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index ab6d36a..b2a964c 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -8,6 +8,7 @@ import unittest
import queue as pyqueue
import time
import io
+import itertools
import sys
import os
import gc
@@ -17,6 +18,7 @@ import array
import socket
import random
import logging
+import struct
import test.support
import test.script_helper
@@ -84,6 +86,13 @@ HAVE_GETVALUE = not getattr(_multiprocessing,
WIN32 = (sys.platform == "win32")
+from multiprocessing.connection import wait
+
+def wait_for_handle(handle, timeout):
+ if timeout is not None and timeout < 0.0:
+ timeout = None
+ return wait([handle], timeout)
+
try:
MAXFD = os.sysconf("SC_OPEN_MAX")
except:
@@ -197,6 +206,18 @@ class _TestProcess(BaseTestCase):
self.assertEqual(current.ident, os.getpid())
self.assertEqual(current.exitcode, None)
+ def test_daemon_argument(self):
+ if self.TYPE == "threads":
+ return
+
+ # By default uses the current process's daemon flag.
+ proc0 = self.Process(target=self._test)
+ self.assertEqual(proc0.daemon, self.current_process().daemon)
+ proc1 = self.Process(target=self._test, daemon=True)
+ self.assertTrue(proc1.daemon)
+ proc2 = self.Process(target=self._test, daemon=False)
+ self.assertFalse(proc2.daemon)
+
@classmethod
def _test(cls, q, *args, **kwds):
current = cls.current_process()
@@ -262,9 +283,18 @@ class _TestProcess(BaseTestCase):
self.assertIn(p, self.active_children())
self.assertEqual(p.exitcode, None)
+ join = TimingWrapper(p.join)
+
+ self.assertEqual(join(0), None)
+ self.assertTimingAlmostEqual(join.elapsed, 0.0)
+ self.assertEqual(p.is_alive(), True)
+
+ self.assertEqual(join(-1), None)
+ self.assertTimingAlmostEqual(join.elapsed, 0.0)
+ self.assertEqual(p.is_alive(), True)
+
p.terminate()
- join = TimingWrapper(p.join)
self.assertEqual(join(), None)
self.assertTimingAlmostEqual(join.elapsed, 0.0)
@@ -329,6 +359,26 @@ class _TestProcess(BaseTestCase):
]
self.assertEqual(result, expected)
+ @classmethod
+ def _test_sentinel(cls, event):
+ event.wait(10.0)
+
+ def test_sentinel(self):
+ if self.TYPE == "threads":
+ return
+ event = self.Event()
+ p = self.Process(target=self._test_sentinel, args=(event,))
+ with self.assertRaises(ValueError):
+ p.sentinel
+ p.start()
+ self.addCleanup(p.join)
+ sentinel = p.sentinel
+ self.assertIsInstance(sentinel, int)
+ self.assertFalse(wait_for_handle(sentinel, timeout=0.0))
+ event.set()
+ p.join()
+ self.assertTrue(wait_for_handle(sentinel, timeout=DELTA))
+
#
#
#
@@ -868,6 +918,104 @@ class _TestCondition(BaseTestCase):
self.assertEqual(res, False)
self.assertTimingAlmostEqual(wait.elapsed, TIMEOUT1)
+ @classmethod
+ def _test_waitfor_f(cls, cond, state):
+ with cond:
+ state.value = 0
+ cond.notify()
+ result = cond.wait_for(lambda : state.value==4)
+ if not result or state.value != 4:
+ sys.exit(1)
+
+ @unittest.skipUnless(HAS_SHAREDCTYPES, 'needs sharedctypes')
+ def test_waitfor(self):
+ # based on test in test/lock_tests.py
+ cond = self.Condition()
+ state = self.Value('i', -1)
+
+ p = self.Process(target=self._test_waitfor_f, args=(cond, state))
+ p.daemon = True
+ p.start()
+
+ with cond:
+ result = cond.wait_for(lambda : state.value==0)
+ self.assertTrue(result)
+ self.assertEqual(state.value, 0)
+
+ for i in range(4):
+ time.sleep(0.01)
+ with cond:
+ state.value += 1
+ cond.notify()
+
+ p.join(5)
+ self.assertFalse(p.is_alive())
+ self.assertEqual(p.exitcode, 0)
+
+ @classmethod
+ def _test_waitfor_timeout_f(cls, cond, state, success, sem):
+ sem.release()
+ with cond:
+ expected = 0.1
+ dt = time.time()
+ result = cond.wait_for(lambda : state.value==4, timeout=expected)
+ dt = time.time() - dt
+ # borrow logic in assertTimeout() from test/lock_tests.py
+ if not result and expected * 0.6 < dt < expected * 10.0:
+ success.value = True
+
+ @unittest.skipUnless(HAS_SHAREDCTYPES, 'needs sharedctypes')
+ def test_waitfor_timeout(self):
+ # based on test in test/lock_tests.py
+ cond = self.Condition()
+ state = self.Value('i', 0)
+ success = self.Value('i', False)
+ sem = self.Semaphore(0)
+
+ p = self.Process(target=self._test_waitfor_timeout_f,
+ args=(cond, state, success, sem))
+ p.daemon = True
+ p.start()
+ self.assertTrue(sem.acquire(timeout=10))
+
+ # Only increment 3 times, so state == 4 is never reached.
+ for i in range(3):
+ time.sleep(0.01)
+ with cond:
+ state.value += 1
+ cond.notify()
+
+ p.join(5)
+ self.assertTrue(success.value)
+
+ @classmethod
+ def _test_wait_result(cls, c, pid):
+ with c:
+ c.notify()
+ time.sleep(1)
+ if pid is not None:
+ os.kill(pid, signal.SIGINT)
+
+ def test_wait_result(self):
+ if isinstance(self, ProcessesMixin) and sys.platform != 'win32':
+ pid = os.getpid()
+ else:
+ pid = None
+
+ c = self.Condition()
+ with c:
+ self.assertFalse(c.wait(0))
+ self.assertFalse(c.wait(0.1))
+
+ p = self.Process(target=self._test_wait_result, args=(c, pid))
+ p.start()
+
+ self.assertTrue(c.wait(10))
+ if pid is not None:
+ self.assertRaises(KeyboardInterrupt, c.wait, 10)
+
+ p.join()
+
class _TestEvent(BaseTestCase):
@@ -911,6 +1059,340 @@ class _TestEvent(BaseTestCase):
self.assertEqual(wait(), True)
#
+# Tests for Barrier - adapted from tests in test/lock_tests.py
+#
+
+# Many of the tests for threading.Barrier use a list as an atomic
+# counter: a value is appended to increment the counter, and the
+# length of the list gives the value. We use the class DummyList
+# for the same purpose.
+
+class _DummyList(object):
+
+ def __init__(self):
+ wrapper = multiprocessing.heap.BufferWrapper(struct.calcsize('i'))
+ lock = multiprocessing.Lock()
+ self.__setstate__((wrapper, lock))
+ self._lengthbuf[0] = 0
+
+ def __setstate__(self, state):
+ (self._wrapper, self._lock) = state
+ self._lengthbuf = self._wrapper.create_memoryview().cast('i')
+
+ def __getstate__(self):
+ return (self._wrapper, self._lock)
+
+ def append(self, _):
+ with self._lock:
+ self._lengthbuf[0] += 1
+
+ def __len__(self):
+ with self._lock:
+ return self._lengthbuf[0]
+
+def _wait():
+ # A crude wait/yield function not relying on synchronization primitives.
+ time.sleep(0.01)
+
+
+class Bunch(object):
+ """
+ A bunch of threads.
+ """
+ def __init__(self, namespace, f, args, n, wait_before_exit=False):
+ """
+ Construct a bunch of `n` threads running the same function `f`.
+ If `wait_before_exit` is True, the threads won't terminate until
+ do_finish() is called.
+ """
+ self.f = f
+ self.args = args
+ self.n = n
+ self.started = namespace.DummyList()
+ self.finished = namespace.DummyList()
+ self._can_exit = namespace.Event()
+ if not wait_before_exit:
+ self._can_exit.set()
+ for i in range(n):
+ p = namespace.Process(target=self.task)
+ p.daemon = True
+ p.start()
+
+ def task(self):
+ pid = os.getpid()
+ self.started.append(pid)
+ try:
+ self.f(*self.args)
+ finally:
+ self.finished.append(pid)
+ self._can_exit.wait(30)
+ assert self._can_exit.is_set()
+
+ def wait_for_started(self):
+ while len(self.started) < self.n:
+ _wait()
+
+ def wait_for_finished(self):
+ while len(self.finished) < self.n:
+ _wait()
+
+ def do_finish(self):
+ self._can_exit.set()
+
+
+class AppendTrue(object):
+ def __init__(self, obj):
+ self.obj = obj
+ def __call__(self):
+ self.obj.append(True)
+
+
+class _TestBarrier(BaseTestCase):
+ """
+ Tests for Barrier objects.
+ """
+ N = 5
+ defaultTimeout = 30.0 # XXX Slow Windows buildbots need generous timeout
+
+ def setUp(self):
+ self.barrier = self.Barrier(self.N, timeout=self.defaultTimeout)
+
+ def tearDown(self):
+ self.barrier.abort()
+ self.barrier = None
+
+ def DummyList(self):
+ if self.TYPE == 'threads':
+ return []
+ elif self.TYPE == 'manager':
+ return self.manager.list()
+ else:
+ return _DummyList()
+
+ def run_threads(self, f, args):
+ b = Bunch(self, f, args, self.N-1)
+ f(*args)
+ b.wait_for_finished()
+
+ @classmethod
+ def multipass(cls, barrier, results, n):
+ m = barrier.parties
+ assert m == cls.N
+ for i in range(n):
+ results[0].append(True)
+ assert len(results[1]) == i * m
+ barrier.wait()
+ results[1].append(True)
+ assert len(results[0]) == (i + 1) * m
+ barrier.wait()
+ try:
+ assert barrier.n_waiting == 0
+ except NotImplementedError:
+ pass
+ assert not barrier.broken
+
+ def test_barrier(self, passes=1):
+ """
+ Test that a barrier is passed in lockstep
+ """
+ results = [self.DummyList(), self.DummyList()]
+ self.run_threads(self.multipass, (self.barrier, results, passes))
+
+ def test_barrier_10(self):
+ """
+ Test that a barrier works for 10 consecutive runs
+ """
+ return self.test_barrier(10)
+
+ @classmethod
+ def _test_wait_return_f(cls, barrier, queue):
+ res = barrier.wait()
+ queue.put(res)
+
+ def test_wait_return(self):
+ """
+ test the return value from barrier.wait
+ """
+ queue = self.Queue()
+ self.run_threads(self._test_wait_return_f, (self.barrier, queue))
+ results = [queue.get() for i in range(self.N)]
+ self.assertEqual(results.count(0), 1)
+
+ @classmethod
+ def _test_action_f(cls, barrier, results):
+ barrier.wait()
+ if len(results) != 1:
+ raise RuntimeError
+
+ def test_action(self):
+ """
+ Test the 'action' callback
+ """
+ results = self.DummyList()
+ barrier = self.Barrier(self.N, action=AppendTrue(results))
+ self.run_threads(self._test_action_f, (barrier, results))
+ self.assertEqual(len(results), 1)
+
+ @classmethod
+ def _test_abort_f(cls, barrier, results1, results2):
+ try:
+ i = barrier.wait()
+ if i == cls.N//2:
+ raise RuntimeError
+ barrier.wait()
+ results1.append(True)
+ except threading.BrokenBarrierError:
+ results2.append(True)
+ except RuntimeError:
+ barrier.abort()
+
+ def test_abort(self):
+ """
+ Test that an abort will put the barrier in a broken state
+ """
+ results1 = self.DummyList()
+ results2 = self.DummyList()
+ self.run_threads(self._test_abort_f,
+ (self.barrier, results1, results2))
+ self.assertEqual(len(results1), 0)
+ self.assertEqual(len(results2), self.N-1)
+ self.assertTrue(self.barrier.broken)
+
+ @classmethod
+ def _test_reset_f(cls, barrier, results1, results2, results3):
+ i = barrier.wait()
+ if i == cls.N//2:
+ # Wait until the other threads are all in the barrier.
+ while barrier.n_waiting < cls.N-1:
+ time.sleep(0.001)
+ barrier.reset()
+ else:
+ try:
+ barrier.wait()
+ results1.append(True)
+ except threading.BrokenBarrierError:
+ results2.append(True)
+ # Now, pass the barrier again
+ barrier.wait()
+ results3.append(True)
+
+ def test_reset(self):
+ """
+ Test that a 'reset' on a barrier frees the waiting threads
+ """
+ results1 = self.DummyList()
+ results2 = self.DummyList()
+ results3 = self.DummyList()
+ self.run_threads(self._test_reset_f,
+ (self.barrier, results1, results2, results3))
+ self.assertEqual(len(results1), 0)
+ self.assertEqual(len(results2), self.N-1)
+ self.assertEqual(len(results3), self.N)
+
+ @classmethod
+ def _test_abort_and_reset_f(cls, barrier, barrier2,
+ results1, results2, results3):
+ try:
+ i = barrier.wait()
+ if i == cls.N//2:
+ raise RuntimeError
+ barrier.wait()
+ results1.append(True)
+ except threading.BrokenBarrierError:
+ results2.append(True)
+ except RuntimeError:
+ barrier.abort()
+ # Synchronize and reset the barrier. Must synchronize first so
+ # that everyone has left it when we reset, and after so that no
+ # one enters it before the reset.
+ if barrier2.wait() == cls.N//2:
+ barrier.reset()
+ barrier2.wait()
+ barrier.wait()
+ results3.append(True)
+
+ def test_abort_and_reset(self):
+ """
+ Test that a barrier can be reset after being broken.
+ """
+ results1 = self.DummyList()
+ results2 = self.DummyList()
+ results3 = self.DummyList()
+ barrier2 = self.Barrier(self.N)
+
+ self.run_threads(self._test_abort_and_reset_f,
+ (self.barrier, barrier2, results1, results2, results3))
+ self.assertEqual(len(results1), 0)
+ self.assertEqual(len(results2), self.N-1)
+ self.assertEqual(len(results3), self.N)
+
+ @classmethod
+ def _test_timeout_f(cls, barrier, results):
+ i = barrier.wait()
+ if i == cls.N//2:
+ # One thread is late!
+ time.sleep(1.0)
+ try:
+ barrier.wait(0.5)
+ except threading.BrokenBarrierError:
+ results.append(True)
+
+ def test_timeout(self):
+ """
+ Test wait(timeout)
+ """
+ results = self.DummyList()
+ self.run_threads(self._test_timeout_f, (self.barrier, results))
+ self.assertEqual(len(results), self.barrier.parties)
+
+ @classmethod
+ def _test_default_timeout_f(cls, barrier, results):
+ i = barrier.wait(cls.defaultTimeout)
+ if i == cls.N//2:
+ # One thread is later than the default timeout
+ time.sleep(1.0)
+ try:
+ barrier.wait()
+ except threading.BrokenBarrierError:
+ results.append(True)
+
+ def test_default_timeout(self):
+ """
+ Test the barrier's default timeout
+ """
+ barrier = self.Barrier(self.N, timeout=0.5)
+ results = self.DummyList()
+ self.run_threads(self._test_default_timeout_f, (barrier, results))
+ self.assertEqual(len(results), barrier.parties)
+
+ def test_single_thread(self):
+ b = self.Barrier(1)
+ b.wait()
+ b.wait()
+
+ @classmethod
+ def _test_thousand_f(cls, barrier, passes, conn, lock):
+ for i in range(passes):
+ barrier.wait()
+ with lock:
+ conn.send(i)
+
+ def test_thousand(self):
+ if self.TYPE == 'manager':
+ return
+ passes = 1000
+ lock = self.Lock()
+ conn, child_conn = self.Pipe(False)
+ for j in range(self.N):
+ p = self.Process(target=self._test_thousand_f,
+ args=(self.barrier, passes, child_conn, lock))
+ p.start()
+
+ for i in range(passes):
+ for j in range(self.N):
+ self.assertEqual(conn.recv(), i)
+
+#
#
#
@@ -1130,6 +1612,9 @@ def sqr(x, wait=0.0):
time.sleep(wait)
return x*x
+def mul(x, y):
+ return x*y
+
class _TestPool(BaseTestCase):
def test_apply(self):
@@ -1143,6 +1628,37 @@ class _TestPool(BaseTestCase):
self.assertEqual(pmap(sqr, list(range(100)), chunksize=20),
list(map(sqr, list(range(100)))))
+ def test_starmap(self):
+ psmap = self.pool.starmap
+ tuples = list(zip(range(10), range(9,-1, -1)))
+ self.assertEqual(psmap(mul, tuples),
+ list(itertools.starmap(mul, tuples)))
+ tuples = list(zip(range(100), range(99,-1, -1)))
+ self.assertEqual(psmap(mul, tuples, chunksize=20),
+ list(itertools.starmap(mul, tuples)))
+
+ def test_starmap_async(self):
+ tuples = list(zip(range(100), range(99,-1, -1)))
+ self.assertEqual(self.pool.starmap_async(mul, tuples).get(),
+ list(itertools.starmap(mul, tuples)))
+
+ def test_map_async(self):
+ self.assertEqual(self.pool.map_async(sqr, list(range(10))).get(),
+ list(map(sqr, list(range(10)))))
+
+ def test_map_async_callbacks(self):
+ call_args = self.manager.list() if self.TYPE == 'manager' else []
+ self.pool.map_async(int, ['1'],
+ callback=call_args.append,
+ error_callback=call_args.append).wait()
+ self.assertEqual(1, len(call_args))
+ self.assertEqual([1], call_args[0])
+ self.pool.map_async(int, ['a'],
+ callback=call_args.append,
+ error_callback=call_args.append).wait()
+ self.assertEqual(2, len(call_args))
+ self.assertIsInstance(call_args[1], ValueError)
+
def test_map_chunksize(self):
try:
self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)
@@ -1221,6 +1737,16 @@ class _TestPool(BaseTestCase):
p.close()
p.join()
+ def test_context(self):
+ if self.TYPE == 'processes':
+ L = list(range(10))
+ expected = [sqr(i) for i in L]
+ with multiprocessing.Pool(2) as p:
+ r = p.map_async(sqr, L)
+ self.assertEqual(r.get(), expected)
+ print(p._state)
+ self.assertRaises(ValueError, p.map_async, sqr, L)
+
def raising():
raise KeyError("key")
@@ -1322,6 +1848,11 @@ class _TestZZZNumberOfObjects(BaseTestCase):
# run after all the other tests for the manager. It tests that
# there have been no "reference leaks" for the manager's shared
# objects. Note the comment in _TestPool.test_terminate().
+
+ # If some other test using ManagerMixin.manager fails, then the
+ # raised exception may keep alive a frame which holds a reference
+ # to a managed object. This will cause test_number_of_objects to
+ # also fail.
ALLOWED_TYPES = ('manager',)
def test_number_of_objects(self):
@@ -1376,7 +1907,27 @@ class _TestMyManager(BaseTestCase):
def test_mymanager(self):
manager = MyManager()
manager.start()
+ self.common(manager)
+ manager.shutdown()
+
+ # If the manager process exited cleanly then the exitcode
+ # will be zero. Otherwise (after a short timeout)
+ # terminate() is used, resulting in an exitcode of -SIGTERM.
+ self.assertEqual(manager._process.exitcode, 0)
+
+ def test_mymanager_context(self):
+ with MyManager() as manager:
+ self.common(manager)
+ self.assertEqual(manager._process.exitcode, 0)
+
+ def test_mymanager_context_prestarted(self):
+ manager = MyManager()
+ manager.start()
+ with manager:
+ self.common(manager)
+ self.assertEqual(manager._process.exitcode, 0)
+ def common(self, manager):
foo = manager.Foo()
bar = manager.Bar()
baz = manager.baz()
@@ -1399,7 +1950,6 @@ class _TestMyManager(BaseTestCase):
self.assertEqual(list(baz), [i*i for i in range(10)])
- manager.shutdown()
#
# Test of connecting to a remote server and using xmlrpclib for serialization
@@ -1570,6 +2120,9 @@ class _TestConnection(BaseTestCase):
self.assertEqual(poll(), False)
self.assertTimingAlmostEqual(poll.elapsed, 0)
+ self.assertEqual(poll(-1), False)
+ self.assertTimingAlmostEqual(poll.elapsed, 0)
+
self.assertEqual(poll(TIMEOUT1), False)
self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1)
@@ -1755,6 +2308,43 @@ class _TestConnection(BaseTestCase):
self.assertRaises(RuntimeError, reduction.recv_handle, conn)
p.join()
+ def test_context(self):
+ a, b = self.Pipe()
+
+ with a, b:
+ a.send(1729)
+ self.assertEqual(b.recv(), 1729)
+ if self.TYPE == 'processes':
+ self.assertFalse(a.closed)
+ self.assertFalse(b.closed)
+
+ if self.TYPE == 'processes':
+ self.assertTrue(a.closed)
+ self.assertTrue(b.closed)
+ self.assertRaises(IOError, a.recv)
+ self.assertRaises(IOError, b.recv)
+
+class _TestListener(BaseTestCase):
+
+ ALLOWED_TYPES = ('processes',)
+
+ def test_multiple_bind(self):
+ for family in self.connection.families:
+ l = self.connection.Listener(family=family)
+ self.addCleanup(l.close)
+ self.assertRaises(OSError, self.connection.Listener,
+ l.address, family)
+
+ def test_context(self):
+ with self.connection.Listener() as l:
+ with self.connection.Client(l.address) as c:
+ with l.accept() as d:
+ c.send(1729)
+ self.assertEqual(d.recv(), 1729)
+
+ if self.TYPE == 'processes':
+ self.assertRaises(IOError, l.accept)
+
class _TestListenerClient(BaseTestCase):
ALLOWED_TYPES = ('processes', 'threads')
@@ -1792,52 +2382,135 @@ class _TestListenerClient(BaseTestCase):
p.join()
l.close()
+class _TestPoll(unittest.TestCase):
+
+ ALLOWED_TYPES = ('processes', 'threads')
+
+ def test_empty_string(self):
+ a, b = self.Pipe()
+ self.assertEqual(a.poll(), False)
+ b.send_bytes(b'')
+ self.assertEqual(a.poll(), True)
+ self.assertEqual(a.poll(), True)
+
+ @classmethod
+ def _child_strings(cls, conn, strings):
+ for s in strings:
+ time.sleep(0.1)
+ conn.send_bytes(s)
+ conn.close()
+
+ def test_strings(self):
+ strings = (b'hello', b'', b'a', b'b', b'', b'bye', b'', b'lop')
+ a, b = self.Pipe()
+ p = self.Process(target=self._child_strings, args=(b, strings))
+ p.start()
+
+ for s in strings:
+ for i in range(200):
+ if a.poll(0.01):
+ break
+ x = a.recv_bytes()
+ self.assertEqual(s, x)
+
+ p.join()
+
+ @classmethod
+ def _child_boundaries(cls, r):
+ # Polling may "pull" a message in to the child process, but we
+ # don't want it to pull only part of a message, as that would
+ # corrupt the pipe for any other processes which might later
+ # read from it.
+ r.poll(5)
+
+ def test_boundaries(self):
+ r, w = self.Pipe(False)
+ p = self.Process(target=self._child_boundaries, args=(r,))
+ p.start()
+ time.sleep(2)
+ L = [b"first", b"second"]
+ for obj in L:
+ w.send_bytes(obj)
+ w.close()
+ p.join()
+ self.assertIn(r.recv_bytes(), L)
+
+ @classmethod
+ def _child_dont_merge(cls, b):
+ b.send_bytes(b'a')
+ b.send_bytes(b'b')
+ b.send_bytes(b'cd')
+
+ def test_dont_merge(self):
+ a, b = self.Pipe()
+ self.assertEqual(a.poll(0.0), False)
+ self.assertEqual(a.poll(0.1), False)
+
+ p = self.Process(target=self._child_dont_merge, args=(b,))
+ p.start()
+
+ self.assertEqual(a.recv_bytes(), b'a')
+ self.assertEqual(a.poll(1.0), True)
+ self.assertEqual(a.poll(1.0), True)
+ self.assertEqual(a.recv_bytes(), b'b')
+ self.assertEqual(a.poll(1.0), True)
+ self.assertEqual(a.poll(1.0), True)
+ self.assertEqual(a.poll(0.0), True)
+ self.assertEqual(a.recv_bytes(), b'cd')
+
+ p.join()
+
#
# Test of sending connection and socket objects between processes
#
-"""
+
+@unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction")
class _TestPicklingConnections(BaseTestCase):
ALLOWED_TYPES = ('processes',)
- def _listener(self, conn, families):
+ @classmethod
+ def tearDownClass(cls):
+ from multiprocessing.reduction import resource_sharer
+ resource_sharer.stop(timeout=5)
+
+ @classmethod
+ def _listener(cls, conn, families):
for fam in families:
- l = self.connection.Listener(family=fam)
+ l = cls.connection.Listener(family=fam)
conn.send(l.address)
new_conn = l.accept()
conn.send(new_conn)
+ new_conn.close()
+ l.close()
- if self.TYPE == 'processes':
- l = socket.socket()
- l.bind(('localhost', 0))
- conn.send(l.getsockname())
- l.listen(1)
- new_conn, addr = l.accept()
- conn.send(new_conn)
+ l = socket.socket()
+ l.bind(('localhost', 0))
+ l.listen(1)
+ conn.send(l.getsockname())
+ new_conn, addr = l.accept()
+ conn.send(new_conn)
+ new_conn.close()
+ l.close()
conn.recv()
- def _remote(self, conn):
+ @classmethod
+ def _remote(cls, conn):
for (address, msg) in iter(conn.recv, None):
- client = self.connection.Client(address)
+ client = cls.connection.Client(address)
client.send(msg.upper())
client.close()
- if self.TYPE == 'processes':
- address, msg = conn.recv()
- client = socket.socket()
- client.connect(address)
- client.sendall(msg.upper())
- client.close()
+ address, msg = conn.recv()
+ client = socket.socket()
+ client.connect(address)
+ client.sendall(msg.upper())
+ client.close()
conn.close()
def test_pickling(self):
- try:
- multiprocessing.allow_connection_pickling()
- except ImportError:
- return
-
families = self.connection.families
lconn, lconn0 = self.Pipe()
@@ -1861,16 +2534,19 @@ class _TestPicklingConnections(BaseTestCase):
rconn.send(None)
- if self.TYPE == 'processes':
- msg = latin('This connection uses a normal socket')
- address = lconn.recv()
- rconn.send((address, msg))
- if hasattr(socket, 'fromfd'):
- new_conn = lconn.recv()
- self.assertEqual(new_conn.recv(100), msg.upper())
- else:
- # XXX On Windows with Py2.6 need to backport fromfd()
- discard = lconn.recv_bytes()
+ msg = latin('This connection uses a normal socket')
+ address = lconn.recv()
+ rconn.send((address, msg))
+ new_conn = lconn.recv()
+ buf = []
+ while True:
+ s = new_conn.recv(100)
+ if not s:
+ break
+ buf.append(s)
+ buf = b''.join(buf)
+ self.assertEqual(buf, msg.upper())
+ new_conn.close()
lconn.send(None)
@@ -1879,7 +2555,46 @@ class _TestPicklingConnections(BaseTestCase):
lp.join()
rp.join()
-"""
+
+ @classmethod
+ def child_access(cls, conn):
+ w = conn.recv()
+ w.send('all is well')
+ w.close()
+
+ r = conn.recv()
+ msg = r.recv()
+ conn.send(msg*2)
+
+ conn.close()
+
+ def test_access(self):
+ # On Windows, if we do not specify a destination pid when
+ # using DupHandle then we need to be careful to use the
+ # correct access flags for DuplicateHandle(), or else
+ # DupHandle.detach() will raise PermissionError. For example,
+ # for a read only pipe handle we should use
+ # access=FILE_GENERIC_READ. (Unfortunately
+ # DUPLICATE_SAME_ACCESS does not work.)
+ conn, child_conn = self.Pipe()
+ p = self.Process(target=self.child_access, args=(child_conn,))
+ p.daemon = True
+ p.start()
+ child_conn.close()
+
+ r, w = self.Pipe(duplex=False)
+ conn.send(w)
+ w.close()
+ self.assertEqual(r.recv(), 'all is well')
+ r.close()
+
+ r, w = self.Pipe(duplex=False)
+ conn.send(r)
+ r.close()
+ w.send('foobar')
+ w.close()
+ self.assertEqual(conn.recv(), 'foobar'*2)
+
#
#
#
@@ -2174,9 +2889,15 @@ class TestInvalidHandle(unittest.TestCase):
@unittest.skipIf(WIN32, "skipped on Windows")
def test_invalid_handles(self):
- conn = _multiprocessing.Connection(44977608)
- self.assertRaises(IOError, conn.poll)
- self.assertRaises(IOError, _multiprocessing.Connection, -1)
+ conn = multiprocessing.connection.Connection(44977608)
+ try:
+ self.assertRaises((ValueError, IOError), conn.poll)
+ finally:
+ # Hack private attribute _handle to avoid printing an error
+ # in conn.__del__
+ conn._handle = None
+ self.assertRaises((ValueError, IOError),
+ multiprocessing.connection.Connection, -1)
#
# Functions used to create test cases from the base ones in this module
@@ -2195,10 +2916,12 @@ def create_test_cases(Mixin, type):
result = {}
glob = globals()
Type = type.capitalize()
+ ALL_TYPES = {'processes', 'threads', 'manager'}
for name in list(glob.keys()):
if name.startswith('_Test'):
base = glob[name]
+ assert set(base.ALLOWED_TYPES) <= ALL_TYPES, set(base.ALLOWED_TYPES)
if type in base.ALLOWED_TYPES:
newname = 'With' + Type + name[1:]
class Temp(base, unittest.TestCase, Mixin):
@@ -2217,7 +2940,7 @@ class ProcessesMixin(object):
Process = multiprocessing.Process
locals().update(get_attributes(multiprocessing, (
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
- 'Condition', 'Event', 'Value', 'Array', 'RawValue',
+ 'Condition', 'Event', 'Barrier', 'Value', 'Array', 'RawValue',
'RawArray', 'current_process', 'active_children', 'Pipe',
'connection', 'JoinableQueue', 'Pool'
)))
@@ -2232,7 +2955,7 @@ class ManagerMixin(object):
manager = object.__new__(multiprocessing.managers.SyncManager)
locals().update(get_attributes(manager, (
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
- 'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
+ 'Condition', 'Event', 'Barrier', 'Value', 'Array', 'list', 'dict',
'Namespace', 'JoinableQueue', 'Pool'
)))
@@ -2245,7 +2968,7 @@ class ThreadsMixin(object):
Process = multiprocessing.dummy.Process
locals().update(get_attributes(multiprocessing.dummy, (
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
- 'Condition', 'Event', 'Value', 'Array', 'current_process',
+ 'Condition', 'Event', 'Barrier', 'Value', 'Array', 'current_process',
'active_children', 'Pipe', 'connection', 'dict', 'list',
'Namespace', 'JoinableQueue', 'Pool'
)))
@@ -2297,6 +3020,7 @@ class TestInitializers(unittest.TestCase):
def tearDown(self):
self.mgr.shutdown()
+ self.mgr.join()
def test_manager_initializer(self):
m = multiprocessing.managers.SyncManager()
@@ -2304,6 +3028,7 @@ class TestInitializers(unittest.TestCase):
m.start(initializer, (self.ns,))
self.assertEqual(self.ns.test, 1)
m.shutdown()
+ m.join()
def test_pool_initializer(self):
self.assertRaises(TypeError, multiprocessing.Pool, initializer=1)
@@ -2336,6 +3061,8 @@ def _afunc(x):
def pool_in_process():
pool = multiprocessing.Pool(processes=4)
x = pool.map(_afunc, [1, 2, 3, 4, 5, 6, 7])
+ pool.close()
+ pool.join()
class _file_like(object):
def __init__(self, delegate):
@@ -2380,6 +3107,180 @@ class TestStdinBadfiledescriptor(unittest.TestCase):
assert sio.getvalue() == 'foo'
+class TestWait(unittest.TestCase):
+
+ @classmethod
+ def _child_test_wait(cls, w, slow):
+ for i in range(10):
+ if slow:
+ time.sleep(random.random()*0.1)
+ w.send((i, os.getpid()))
+ w.close()
+
+ def test_wait(self, slow=False):
+ from multiprocessing.connection import wait
+ readers = []
+ procs = []
+ messages = []
+
+ for i in range(4):
+ r, w = multiprocessing.Pipe(duplex=False)
+ p = multiprocessing.Process(target=self._child_test_wait, args=(w, slow))
+ p.daemon = True
+ p.start()
+ w.close()
+ readers.append(r)
+ procs.append(p)
+ self.addCleanup(p.join)
+
+ while readers:
+ for r in wait(readers):
+ try:
+ msg = r.recv()
+ except EOFError:
+ readers.remove(r)
+ r.close()
+ else:
+ messages.append(msg)
+
+ messages.sort()
+ expected = sorted((i, p.pid) for i in range(10) for p in procs)
+ self.assertEqual(messages, expected)
+
+ @classmethod
+ def _child_test_wait_socket(cls, address, slow):
+ s = socket.socket()
+ s.connect(address)
+ for i in range(10):
+ if slow:
+ time.sleep(random.random()*0.1)
+ s.sendall(('%s\n' % i).encode('ascii'))
+ s.close()
+
+ def test_wait_socket(self, slow=False):
+ from multiprocessing.connection import wait
+ l = socket.socket()
+ l.bind(('', 0))
+ l.listen(4)
+ addr = ('localhost', l.getsockname()[1])
+ readers = []
+ procs = []
+ dic = {}
+
+ for i in range(4):
+ p = multiprocessing.Process(target=self._child_test_wait_socket,
+ args=(addr, slow))
+ p.daemon = True
+ p.start()
+ procs.append(p)
+ self.addCleanup(p.join)
+
+ for i in range(4):
+ r, _ = l.accept()
+ readers.append(r)
+ dic[r] = []
+ l.close()
+
+ while readers:
+ for r in wait(readers):
+ msg = r.recv(32)
+ if not msg:
+ readers.remove(r)
+ r.close()
+ else:
+ dic[r].append(msg)
+
+ expected = ''.join('%s\n' % i for i in range(10)).encode('ascii')
+ for v in dic.values():
+ self.assertEqual(b''.join(v), expected)
+
+ def test_wait_slow(self):
+ self.test_wait(True)
+
+ def test_wait_socket_slow(self):
+ self.test_wait_socket(True)
+
+ def test_wait_timeout(self):
+ from multiprocessing.connection import wait
+
+ expected = 5
+ a, b = multiprocessing.Pipe()
+
+ start = time.time()
+ res = wait([a, b], expected)
+ delta = time.time() - start
+
+ self.assertEqual(res, [])
+ self.assertLess(delta, expected * 2)
+ self.assertGreater(delta, expected * 0.5)
+
+ b.send(None)
+
+ start = time.time()
+ res = wait([a, b], 20)
+ delta = time.time() - start
+
+ self.assertEqual(res, [a])
+ self.assertLess(delta, 0.4)
+
+ @classmethod
+ def signal_and_sleep(cls, sem, period):
+ sem.release()
+ time.sleep(period)
+
+ def test_wait_integer(self):
+ from multiprocessing.connection import wait
+
+ expected = 3
+ sem = multiprocessing.Semaphore(0)
+ a, b = multiprocessing.Pipe()
+ p = multiprocessing.Process(target=self.signal_and_sleep,
+ args=(sem, expected))
+
+ p.start()
+ self.assertIsInstance(p.sentinel, int)
+ self.assertTrue(sem.acquire(timeout=20))
+
+ start = time.time()
+ res = wait([a, p.sentinel, b], expected + 20)
+ delta = time.time() - start
+
+ self.assertEqual(res, [p.sentinel])
+ self.assertLess(delta, expected + 2)
+ self.assertGreater(delta, expected - 2)
+
+ a.send(None)
+
+ start = time.time()
+ res = wait([a, p.sentinel, b], 20)
+ delta = time.time() - start
+
+ self.assertEqual(res, [p.sentinel, b])
+ self.assertLess(delta, 0.4)
+
+ b.send(None)
+
+ start = time.time()
+ res = wait([a, p.sentinel, b], 20)
+ delta = time.time() - start
+
+ self.assertEqual(res, [a, p.sentinel, b])
+ self.assertLess(delta, 0.4)
+
+ p.terminate()
+ p.join()
+
+ def test_neg_timeout(self):
+ from multiprocessing.connection import wait
+ a, b = multiprocessing.Pipe()
+ t = time.time()
+ res = wait([a], timeout=-1)
+ t = time.time() - t
+ self.assertEqual(res, [])
+ self.assertLess(t, 1)
+ a.close()
+ b.close()
+
#
# Issue 14151: Test invalid family on invalid environment
#
@@ -2397,6 +3298,38 @@ class TestInvalidFamily(unittest.TestCase):
multiprocessing.connection.Listener('/var/test.pipe')
#
+# Issue 12098: check sys.flags of child matches that for parent
+#
+
+class TestFlags(unittest.TestCase):
+ @classmethod
+ def run_in_grandchild(cls, conn):
+ conn.send(tuple(sys.flags))
+
+ @classmethod
+ def run_in_child(cls):
+ import json
+ r, w = multiprocessing.Pipe(duplex=False)
+ p = multiprocessing.Process(target=cls.run_in_grandchild, args=(w,))
+ p.start()
+ grandchild_flags = r.recv()
+ p.join()
+ r.close()
+ w.close()
+ flags = (tuple(sys.flags), grandchild_flags)
+ print(json.dumps(flags))
+
+ def test_flags(self):
+ import json, subprocess
+ # start child process using unusual flags
+ prog = ('from test.test_multiprocessing import TestFlags; ' +
+ 'TestFlags.run_in_child()')
+ data = subprocess.check_output(
+ [sys.executable, '-E', '-S', '-O', '-c', prog])
+ child_flags, grandchild_flags = json.loads(data.decode('ascii'))
+ self.assertEqual(child_flags, grandchild_flags)
+
+#
# Test interaction with socket timeouts - see Issue #6056
#
@@ -2451,8 +3384,8 @@ class TestNoForkBomb(unittest.TestCase):
#
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
- TestStdinBadfiledescriptor, TestInvalidFamily,
- TestTimeouts, TestNoForkBomb]
+ TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
+ TestFlags, TestTimeouts, TestNoForkBomb]
#
#
@@ -2489,14 +3422,18 @@ def test_main(run=None):
loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
- run(suite)
-
- ThreadsMixin.pool.terminate()
- ProcessesMixin.pool.terminate()
- ManagerMixin.pool.terminate()
- ManagerMixin.manager.shutdown()
-
- del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
+ try:
+ run(suite)
+ finally:
+ ThreadsMixin.pool.terminate()
+ ProcessesMixin.pool.terminate()
+ ManagerMixin.pool.terminate()
+ ManagerMixin.pool.join()
+ ManagerMixin.manager.shutdown()
+ ManagerMixin.manager.join()
+ ThreadsMixin.pool.join()
+ ProcessesMixin.pool.join()
+ del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
def main():
test_main(unittest.TextTestRunner(verbosity=2).run)
diff --git a/Lib/test/test_mutants.py b/Lib/test/test_mutants.py
deleted file mode 100644
index b43fa47..0000000
--- a/Lib/test/test_mutants.py
+++ /dev/null
@@ -1,291 +0,0 @@
-from test.support import verbose, TESTFN
-import random
-import os
-
-# From SF bug #422121: Insecurities in dict comparison.
-
-# Safety of code doing comparisons has been an historical Python weak spot.
-# The problem is that comparison of structures written in C *naturally*
-# wants to hold on to things like the size of the container, or "the
-# biggest" containee so far, across a traversal of the container; but
-# code to do containee comparisons can call back into Python and mutate
-# the container in arbitrary ways while the C loop is in midstream. If the
-# C code isn't extremely paranoid about digging things out of memory on
-# each trip, and artificially boosting refcounts for the duration, anything
-# from infinite loops to OS crashes can result (yes, I use Windows <wink>).
-#
-# The other problem is that code designed to provoke a weakness is usually
-# white-box code, and so catches only the particular vulnerabilities the
-# author knew to protect against. For example, Python's list.sort() code
-# went thru many iterations as one "new" vulnerability after another was
-# discovered.
-#
-# So the dict comparison test here uses a black-box approach instead,
-# generating dicts of various sizes at random, and performing random
-# mutations on them at random times. This proved very effective,
-# triggering at least six distinct failure modes the first 20 times I
-# ran it. Indeed, at the start, the driver never got beyond 6 iterations
-# before the test died.
-
-# The dicts are global to make it easy to mutate tham from within functions.
-dict1 = {}
-dict2 = {}
-
-# The current set of keys in dict1 and dict2. These are materialized as
-# lists to make it easy to pick a dict key at random.
-dict1keys = []
-dict2keys = []
-
-# Global flag telling maybe_mutate() whether to *consider* mutating.
-mutate = 0
-
-# If global mutate is true, consider mutating a dict. May or may not
-# mutate a dict even if mutate is true. If it does decide to mutate a
-# dict, it picks one of {dict1, dict2} at random, and deletes a random
-# entry from it; or, more rarely, adds a random element.
-
-def maybe_mutate():
- global mutate
- if not mutate:
- return
- if random.random() < 0.5:
- return
-
- if random.random() < 0.5:
- target, keys = dict1, dict1keys
- else:
- target, keys = dict2, dict2keys
-
- if random.random() < 0.2:
- # Insert a new key.
- mutate = 0 # disable mutation until key inserted
- while 1:
- newkey = Horrid(random.randrange(100))
- if newkey not in target:
- break
- target[newkey] = Horrid(random.randrange(100))
- keys.append(newkey)
- mutate = 1
-
- elif keys:
- # Delete a key at random.
- mutate = 0 # disable mutation until key deleted
- i = random.randrange(len(keys))
- key = keys[i]
- del target[key]
- del keys[i]
- mutate = 1
-
-# A horrid class that triggers random mutations of dict1 and dict2 when
-# instances are compared.
-
-class Horrid:
- def __init__(self, i):
- # Comparison outcomes are determined by the value of i.
- self.i = i
-
- # An artificial hashcode is selected at random so that we don't
- # have any systematic relationship between comparison outcomes
- # (based on self.i and other.i) and relative position within the
- # hash vector (based on hashcode).
- # XXX This is no longer effective.
- ##self.hashcode = random.randrange(1000000000)
-
- def __hash__(self):
- return 42
- return self.hashcode
-
- def __eq__(self, other):
- maybe_mutate() # The point of the test.
- return self.i == other.i
-
- def __ne__(self, other):
- raise RuntimeError("I didn't expect some kind of Spanish inquisition!")
-
- __lt__ = __le__ = __gt__ = __ge__ = __ne__
-
- def __repr__(self):
- return "Horrid(%d)" % self.i
-
-# Fill dict d with numentries (Horrid(i), Horrid(j)) key-value pairs,
-# where i and j are selected at random from the candidates list.
-# Return d.keys() after filling.
-
-def fill_dict(d, candidates, numentries):
- d.clear()
- for i in range(numentries):
- d[Horrid(random.choice(candidates))] = \
- Horrid(random.choice(candidates))
- return list(d.keys())
-
-# Test one pair of randomly generated dicts, each with n entries.
-# Note that dict comparison is trivial if they don't have the same number
-# of entires (then the "shorter" dict is instantly considered to be the
-# smaller one, without even looking at the entries).
-
-def test_one(n):
- global mutate, dict1, dict2, dict1keys, dict2keys
-
- # Fill the dicts without mutating them.
- mutate = 0
- dict1keys = fill_dict(dict1, range(n), n)
- dict2keys = fill_dict(dict2, range(n), n)
-
- # Enable mutation, then compare the dicts so long as they have the
- # same size.
- mutate = 1
- if verbose:
- print("trying w/ lengths", len(dict1), len(dict2), end=' ')
- while dict1 and len(dict1) == len(dict2):
- if verbose:
- print(".", end=' ')
- c = dict1 == dict2
- if verbose:
- print()
-
-# Run test_one n times. At the start (before the bugs were fixed), 20
-# consecutive runs of this test each blew up on or before the sixth time
-# test_one was run. So n doesn't have to be large to get an interesting
-# test.
-# OTOH, calling with large n is also interesting, to ensure that the fixed
-# code doesn't hold on to refcounts *too* long (in which case memory would
-# leak).
-
-def test(n):
- for i in range(n):
- test_one(random.randrange(1, 100))
-
-# See last comment block for clues about good values for n.
-test(100)
-
-##########################################################################
-# Another segfault bug, distilled by Michael Hudson from a c.l.py post.
-
-class Child:
- def __init__(self, parent):
- self.__dict__['parent'] = parent
- def __getattr__(self, attr):
- self.parent.a = 1
- self.parent.b = 1
- self.parent.c = 1
- self.parent.d = 1
- self.parent.e = 1
- self.parent.f = 1
- self.parent.g = 1
- self.parent.h = 1
- self.parent.i = 1
- return getattr(self.parent, attr)
-
-class Parent:
- def __init__(self):
- self.a = Child(self)
-
-# Hard to say what this will print! May vary from time to time. But
-# we're specifically trying to test the tp_print slot here, and this is
-# the clearest way to do it. We print the result to a temp file so that
-# the expected-output file doesn't need to change.
-
-f = open(TESTFN, "w")
-print(Parent().__dict__, file=f)
-f.close()
-os.unlink(TESTFN)
-
-##########################################################################
-# And another core-dumper from Michael Hudson.
-
-dict = {}
-
-# Force dict to malloc its table.
-for i in range(1, 10):
- dict[i] = i
-
-f = open(TESTFN, "w")
-
-class Machiavelli:
- def __repr__(self):
- dict.clear()
-
- # Michael sez: "doesn't crash without this. don't know why."
- # Tim sez: "luck of the draw; crashes with or without for me."
- print(file=f)
-
- return repr("machiavelli")
-
- def __hash__(self):
- return 0
-
-dict[Machiavelli()] = Machiavelli()
-
-print(str(dict), file=f)
-f.close()
-os.unlink(TESTFN)
-del f, dict
-
-
-##########################################################################
-# And another core-dumper from Michael Hudson.
-
-dict = {}
-
-# let's force dict to malloc its table
-for i in range(1, 10):
- dict[i] = i
-
-class Machiavelli2:
- def __eq__(self, other):
- dict.clear()
- return 1
-
- def __hash__(self):
- return 0
-
-dict[Machiavelli2()] = Machiavelli2()
-
-try:
- dict[Machiavelli2()]
-except KeyError:
- pass
-
-del dict
-
-##########################################################################
-# And another core-dumper from Michael Hudson.
-
-dict = {}
-
-# let's force dict to malloc its table
-for i in range(1, 10):
- dict[i] = i
-
-class Machiavelli3:
- def __init__(self, id):
- self.id = id
-
- def __eq__(self, other):
- if self.id == other.id:
- dict.clear()
- return 1
- else:
- return 0
-
- def __repr__(self):
- return "%s(%s)"%(self.__class__.__name__, self.id)
-
- def __hash__(self):
- return 0
-
-dict[Machiavelli3(1)] = Machiavelli3(0)
-dict[Machiavelli3(2)] = Machiavelli3(0)
-
-f = open(TESTFN, "w")
-try:
- try:
- print(dict[Machiavelli3(2)], file=f)
- except KeyError:
- pass
-finally:
- f.close()
- os.unlink(TESTFN)
-
-del dict
-del dict1, dict2, dict1keys, dict2keys
diff --git a/Lib/test/test_namespace_pkgs.py b/Lib/test/test_namespace_pkgs.py
new file mode 100644
index 0000000..7067b12
--- /dev/null
+++ b/Lib/test/test_namespace_pkgs.py
@@ -0,0 +1,294 @@
+import sys
+import contextlib
+import unittest
+import os
+
+from test.test_importlib import util
+from test.support import run_unittest
+
+# needed tests:
+#
+# need to test when nested, so that the top-level path isn't sys.path
+# need to test dynamic path detection, both at top-level and nested
+# with dynamic path, check when a loader is returned on path reload (that is,
+# trying to switch from a namespace package to a regular package)
+
+
+@contextlib.contextmanager
+def sys_modules_context():
+ """
+ Make sure sys.modules is the same object and has the same content
+ when exiting the context as when entering.
+
+ Similar to importlib.test.util.uncache, but doesn't require explicit
+ names.
+ """
+ sys_modules_saved = sys.modules
+ sys_modules_copy = sys.modules.copy()
+ try:
+ yield
+ finally:
+ sys.modules = sys_modules_saved
+ sys.modules.clear()
+ sys.modules.update(sys_modules_copy)
+
+
+@contextlib.contextmanager
+def namespace_tree_context(**kwargs):
+ """
+ Save import state and sys.modules cache and restore it on exit.
+ Typical usage:
+
+ >>> with namespace_tree_context(path=['/tmp/xxyy/portion1',
+ ... '/tmp/xxyy/portion2']):
+ ... pass
+ """
+ # use default meta_path and path_hooks unless specified otherwise
+ kwargs.setdefault('meta_path', sys.meta_path)
+ kwargs.setdefault('path_hooks', sys.path_hooks)
+ import_context = util.import_state(**kwargs)
+ with import_context, sys_modules_context():
+ yield
+
+class NamespacePackageTest(unittest.TestCase):
+ """
+ Subclasses should define self.root and self.paths (under that root)
+ to be added to sys.path.
+ """
+ root = os.path.join(os.path.dirname(__file__), 'namespace_pkgs')
+
+ def setUp(self):
+ self.resolved_paths = [
+ os.path.join(self.root, path) for path in self.paths
+ ]
+ self.ctx = namespace_tree_context(path=self.resolved_paths)
+ self.ctx.__enter__()
+
+ def tearDown(self):
+ # TODO: will we ever want to pass exc_info to __exit__?
+ self.ctx.__exit__(None, None, None)
+
+class SingleNamespacePackage(NamespacePackageTest):
+ paths = ['portion1']
+
+ def test_simple_package(self):
+ import foo.one
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+
+ def test_cant_import_other(self):
+ with self.assertRaises(ImportError):
+ import foo.two
+
+ def test_module_repr(self):
+ import foo.one
+ self.assertEqual(repr(foo), "<module 'foo' (namespace)>")
+
+
+class DynamicPatheNamespacePackage(NamespacePackageTest):
+ paths = ['portion1']
+
+ def test_dynamic_path(self):
+ # Make sure only 'foo.one' can be imported
+ import foo.one
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+
+ with self.assertRaises(ImportError):
+ import foo.two
+
+ # Now modify sys.path
+ sys.path.append(os.path.join(self.root, 'portion2'))
+
+ # And make sure foo.two is now importable
+ import foo.two
+ self.assertEqual(foo.two.attr, 'portion2 foo two')
+
+
+class CombinedNamespacePackages(NamespacePackageTest):
+ paths = ['both_portions']
+
+ def test_imports(self):
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'both_portions foo one')
+ self.assertEqual(foo.two.attr, 'both_portions foo two')
+
+
+class SeparatedNamespacePackages(NamespacePackageTest):
+ paths = ['portion1', 'portion2']
+
+ def test_imports(self):
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+ self.assertEqual(foo.two.attr, 'portion2 foo two')
+
+
+class SeparatedOverlappingNamespacePackages(NamespacePackageTest):
+ paths = ['portion1', 'both_portions']
+
+ def test_first_path_wins(self):
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+ self.assertEqual(foo.two.attr, 'both_portions foo two')
+
+ def test_first_path_wins_again(self):
+ sys.path.reverse()
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'both_portions foo one')
+ self.assertEqual(foo.two.attr, 'both_portions foo two')
+
+ def test_first_path_wins_importing_second_first(self):
+ import foo.two
+ import foo.one
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+ self.assertEqual(foo.two.attr, 'both_portions foo two')
+
+
+class SingleZipNamespacePackage(NamespacePackageTest):
+ paths = ['top_level_portion1.zip']
+
+ def test_simple_package(self):
+ import foo.one
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+
+ def test_cant_import_other(self):
+ with self.assertRaises(ImportError):
+ import foo.two
+
+
+class SeparatedZipNamespacePackages(NamespacePackageTest):
+ paths = ['top_level_portion1.zip', 'portion2']
+
+ def test_imports(self):
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+ self.assertEqual(foo.two.attr, 'portion2 foo two')
+ self.assertIn('top_level_portion1.zip', foo.one.__file__)
+ self.assertNotIn('.zip', foo.two.__file__)
+
+
+class SingleNestedZipNamespacePackage(NamespacePackageTest):
+ paths = ['nested_portion1.zip/nested_portion1']
+
+ def test_simple_package(self):
+ import foo.one
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+
+ def test_cant_import_other(self):
+ with self.assertRaises(ImportError):
+ import foo.two
+
+
+class SeparatedNestedZipNamespacePackages(NamespacePackageTest):
+ paths = ['nested_portion1.zip/nested_portion1', 'portion2']
+
+ def test_imports(self):
+ import foo.one
+ import foo.two
+ self.assertEqual(foo.one.attr, 'portion1 foo one')
+ self.assertEqual(foo.two.attr, 'portion2 foo two')
+ fn = os.path.join('nested_portion1.zip', 'nested_portion1')
+ self.assertIn(fn, foo.one.__file__)
+ self.assertNotIn('.zip', foo.two.__file__)
+
+
+class LegacySupport(NamespacePackageTest):
+ paths = ['not_a_namespace_pkg', 'portion1', 'portion2', 'both_portions']
+
+ def test_non_namespace_package_takes_precedence(self):
+ import foo.one
+ with self.assertRaises(ImportError):
+ import foo.two
+ self.assertIn('__init__', foo.__file__)
+ self.assertNotIn('namespace', str(foo.__loader__).lower())
+
+
+class DynamicPathCalculation(NamespacePackageTest):
+ paths = ['project1', 'project2']
+
+ def test_project3_fails(self):
+ import parent.child.one
+ self.assertEqual(len(parent.__path__), 2)
+ self.assertEqual(len(parent.child.__path__), 2)
+ import parent.child.two
+ self.assertEqual(len(parent.__path__), 2)
+ self.assertEqual(len(parent.child.__path__), 2)
+
+ self.assertEqual(parent.child.one.attr, 'parent child one')
+ self.assertEqual(parent.child.two.attr, 'parent child two')
+
+ with self.assertRaises(ImportError):
+ import parent.child.three
+
+ self.assertEqual(len(parent.__path__), 2)
+ self.assertEqual(len(parent.child.__path__), 2)
+
+ def test_project3_succeeds(self):
+ import parent.child.one
+ self.assertEqual(len(parent.__path__), 2)
+ self.assertEqual(len(parent.child.__path__), 2)
+ import parent.child.two
+ self.assertEqual(len(parent.__path__), 2)
+ self.assertEqual(len(parent.child.__path__), 2)
+
+ self.assertEqual(parent.child.one.attr, 'parent child one')
+ self.assertEqual(parent.child.two.attr, 'parent child two')
+
+ with self.assertRaises(ImportError):
+ import parent.child.three
+
+ # now add project3
+ sys.path.append(os.path.join(self.root, 'project3'))
+ import parent.child.three
+
+ # the paths dynamically get longer, to include the new directories
+ self.assertEqual(len(parent.__path__), 3)
+ self.assertEqual(len(parent.child.__path__), 3)
+
+ self.assertEqual(parent.child.three.attr, 'parent child three')
+
+
+class ZipWithMissingDirectory(NamespacePackageTest):
+ paths = ['missing_directory.zip']
+
+ @unittest.expectedFailure
+ def test_missing_directory(self):
+ # This will fail because missing_directory.zip contains:
+ # Length Date Time Name
+ # --------- ---------- ----- ----
+ # 29 2012-05-03 18:13 foo/one.py
+ # 0 2012-05-03 20:57 bar/
+ # 38 2012-05-03 20:57 bar/two.py
+ # --------- -------
+ # 67 3 files
+
+ # Because there is no 'foo/', the zipimporter currently doesn't
+ # know that foo is a namespace package
+
+ import foo.one
+
+ def test_present_directory(self):
+ # This succeeds because there is a "bar/" in the zip file
+ import bar.two
+ self.assertEqual(bar.two.attr, 'missing_directory foo two')
+
+
+class ModuleAndNamespacePackageInSameDir(NamespacePackageTest):
+ paths = ['module_and_namespace_package']
+
+ def test_module_before_namespace_package(self):
+ # Make sure we find the module in preference to the
+ # namespace package.
+ import a_test
+ self.assertEqual(a_test.attr, 'in module')
+
+
+def test_main():
+ run_unittest(*NamespacePackageTest.__subclasses__())
+
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py
index 7335b23..19fb10a 100644
--- a/Lib/test/test_nntplib.py
+++ b/Lib/test/test_nntplib.py
@@ -1,4 +1,5 @@
import io
+import socket
import datetime
import textwrap
import unittest
@@ -257,6 +258,26 @@ class NetworkedNNTPTestsMixin:
# value
setattr(cls, name, wrap_meth(meth))
+ def test_with_statement(self):
+ def is_connected():
+ if not hasattr(server, 'file'):
+ return False
+ try:
+ server.help()
+ except (socket.error, EOFError):
+ return False
+ return True
+
+ with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server:
+ self.assertTrue(is_connected())
+ self.assertTrue(server.help())
+ self.assertFalse(is_connected())
+
+ with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server:
+ server.quit()
+ self.assertFalse(is_connected())
+
+
NetworkedNNTPTestsMixin.wrap_methods()
@@ -894,7 +915,7 @@ class NNTPv1v2TestsMixin:
def _check_article_body(self, lines):
self.assertEqual(len(lines), 4)
- self.assertEqual(lines[-1].decode('utf8'), "-- Signed by André.")
+ self.assertEqual(lines[-1].decode('utf-8'), "-- Signed by André.")
self.assertEqual(lines[-2], b"")
self.assertEqual(lines[-3], b".Here is a dot-starting line.")
self.assertEqual(lines[-4], b"This is just a test article.")
@@ -1133,12 +1154,12 @@ class NNTPv1v2TestsMixin:
self.assertEqual(resp, success_resp)
# With an iterable of terminated lines
def iterlines(b):
- return iter(b.splitlines(True))
+ return iter(b.splitlines(keepends=True))
resp = self._check_post_ihave_sub(func, *args, file_factory=iterlines)
self.assertEqual(resp, success_resp)
# With an iterable of non-terminated lines
def iterlines(b):
- return iter(b.splitlines(False))
+ return iter(b.splitlines(keepends=False))
resp = self._check_post_ihave_sub(func, *args, file_factory=iterlines)
self.assertEqual(resp, success_resp)
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 6464950..2c9dab9 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -1,10 +1,11 @@
import ntpath
import os
import sys
+import unittest
+import warnings
from test.support import TestFailed
from test import support, test_genericpath
from tempfile import TemporaryFile
-import unittest
def tester(fn, wantResult):
@@ -21,7 +22,9 @@ def tester(fn, wantResult):
fn = fn.replace('["', '[b"')
fn = fn.replace(", '", ", b'")
fn = fn.replace(', "', ', b"')
- gotResult = eval(fn)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ gotResult = eval(fn)
if isinstance(wantResult, str):
wantResult = wantResult.encode('ascii')
elif isinstance(wantResult, tuple):
diff --git a/Lib/test/test_numeric_tower.py b/Lib/test/test_numeric_tower.py
index bef3d4c..3423d4e 100644
--- a/Lib/test/test_numeric_tower.py
+++ b/Lib/test/test_numeric_tower.py
@@ -150,7 +150,7 @@ class ComparisonTest(unittest.TestCase):
# int, float, Fraction, Decimal
test_values = [
float('-inf'),
- D('-1e999999999'),
+ D('-1e425000000'),
-1e308,
F(-22, 7),
-3.14,
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 7b95612..78de278 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -318,6 +318,22 @@ class TestOptionChecks(BaseTest):
["-b"], {'action': 'store',
'callback_kwargs': 'foo'})
+ def test_no_single_dash(self):
+ self.assertOptionError(
+ "invalid long option string '-debug': "
+ "must start with --, followed by non-dash",
+ ["-debug"])
+
+ self.assertOptionError(
+ "option -d: invalid long option string '-debug': must start with"
+ " --, followed by non-dash",
+ ["-d", "-debug"])
+
+ self.assertOptionError(
+ "invalid long option string '-debug': "
+ "must start with --, followed by non-dash",
+ ["-debug", "--debug"])
+
class TestOptionParser(BaseTest):
def setUp(self):
self.parser = OptionParser()
@@ -631,7 +647,7 @@ class TestStandard(BaseTest):
option_list=options)
def test_required_value(self):
- self.assertParseFail(["-a"], "-a option requires an argument")
+ self.assertParseFail(["-a"], "-a option requires 1 argument")
def test_invalid_integer(self):
self.assertParseFail(["-b", "5x"],
@@ -1023,7 +1039,7 @@ class TestExtendAddTypes(BaseTest):
TYPE_CHECKER["file"] = check_file
def test_filetype_ok(self):
- open(support.TESTFN, "w").close()
+ support.create_empty_file(support.TESTFN)
self.assertParseOK(["--file", support.TESTFN, "-afoo"],
{'file': support.TESTFN, 'a': 'foo'},
[])
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index ef14733..7d6b377 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -14,20 +14,40 @@ import shutil
from test import support
import contextlib
import mmap
+import platform
+import re
import uuid
+import asyncore
+import asynchat
+import socket
+import itertools
import stat
+import locale
+import codecs
+try:
+ import threading
+except ImportError:
+ threading = None
from test.script_helper import assert_python_ok
+with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ os.stat_float_times(True)
+st = os.stat(__file__)
+stat_supports_subsecond = (
+ # check if float and int timestamps are different
+ (st.st_atime != st[7])
+ or (st.st_mtime != st[8])
+ or (st.st_ctime != st[9]))
+
# Detect whether we're on a Linux system that uses the (now outdated
# and unmaintained) linuxthreads threading library. There's an issue
# when combining linuxthreads with a failed execv call: see
# http://bugs.python.org/issue4970.
-if (hasattr(os, "confstr_names") and
- "CS_GNU_LIBPTHREAD_VERSION" in os.confstr_names):
- libpthread = os.confstr("CS_GNU_LIBPTHREAD_VERSION")
- USING_LINUXTHREADS= libpthread.startswith("linuxthreads")
+if hasattr(sys, 'thread_info') and sys.thread_info.version:
+ USING_LINUXTHREADS = sys.thread_info.version.startswith("linuxthreads")
else:
- USING_LINUXTHREADS= False
+ USING_LINUXTHREADS = False
# Tests creating TESTFN
class FileTests(unittest.TestCase):
@@ -124,6 +144,18 @@ class FileTests(unittest.TestCase):
self.fdopen_helper('r')
self.fdopen_helper('r', 100)
+ def test_replace(self):
+ TESTFN2 = support.TESTFN + ".2"
+ with open(support.TESTFN, 'w') as f:
+ f.write("1")
+ with open(TESTFN2, 'w') as f:
+ f.write("2")
+ self.addCleanup(os.unlink, TESTFN2)
+ os.replace(support.TESTFN, TESTFN2)
+ self.assertRaises(FileNotFoundError, os.stat, support.TESTFN)
+ with open(TESTFN2, 'r') as f:
+ self.assertEqual(f.read(), "1")
+
# Test attributes on return values from os.*stat* family.
class StatAttributeTests(unittest.TestCase):
@@ -142,7 +174,6 @@ class StatAttributeTests(unittest.TestCase):
if not hasattr(os, "stat"):
return
- import stat
result = os.stat(fname)
# Make sure direct access works
@@ -162,6 +193,13 @@ class StatAttributeTests(unittest.TestCase):
result[getattr(stat, name)])
self.assertIn(attr, members)
+ # Make sure that the st_?time and st_?time_ns fields roughly agree
+ # (they should always agree up to around tens-of-microseconds)
+ for name in 'st_atime st_mtime st_ctime'.split():
+ floaty = int(getattr(result, name) * 100000)
+ nanosecondy = getattr(result, name + "_ns") // 10000
+ self.assertAlmostEqual(floaty, nanosecondy, delta=2)
+
try:
result[200]
self.fail("No exception thrown")
@@ -208,7 +246,9 @@ class StatAttributeTests(unittest.TestCase):
fname = self.fname.encode(sys.getfilesystemencoding())
except UnicodeEncodeError:
self.skipTest("cannot encode %a for the filesystem" % self.fname)
- self.check_stat_attributes(fname)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ self.check_stat_attributes(fname)
def test_statvfs_attributes(self):
if not hasattr(os, "statvfs"):
@@ -265,6 +305,143 @@ class StatAttributeTests(unittest.TestCase):
st2 = os.stat(support.TESTFN)
self.assertEqual(st2.st_mtime, int(st.st_mtime-delta))
+ def _test_utime(self, filename, attr, utime, delta):
+ # Issue #13327 removed the requirement to pass None as the
+ # second argument. Check that the previous methods of passing
+ # a time tuple or None work in addition to no argument.
+ st0 = os.stat(filename)
+ # Doesn't set anything new, but sets the time tuple way
+ utime(filename, (attr(st0, "st_atime"), attr(st0, "st_mtime")))
+ # Setting the time to the time you just read, then reading again,
+ # should always return exactly the same times.
+ st1 = os.stat(filename)
+ self.assertEqual(attr(st0, "st_mtime"), attr(st1, "st_mtime"))
+ self.assertEqual(attr(st0, "st_atime"), attr(st1, "st_atime"))
+ # Set to the current time in the old explicit way.
+ os.utime(filename, None)
+ st2 = os.stat(support.TESTFN)
+ # Set to the current time in the new way
+ os.utime(filename)
+ st3 = os.stat(filename)
+ self.assertAlmostEqual(attr(st2, "st_mtime"), attr(st3, "st_mtime"), delta=delta)
+
+ def test_utime(self):
+ def utime(file, times):
+ return os.utime(file, times)
+ self._test_utime(self.fname, getattr, utime, 10)
+ self._test_utime(support.TESTFN, getattr, utime, 10)
+
+
+ def _test_utime_ns(self, set_times_ns, test_dir=True):
+ def getattr_ns(o, attr):
+ return getattr(o, attr + "_ns")
+ ten_s = 10 * 1000 * 1000 * 1000
+ self._test_utime(self.fname, getattr_ns, set_times_ns, ten_s)
+ if test_dir:
+ self._test_utime(support.TESTFN, getattr_ns, set_times_ns, ten_s)
+
+ def test_utime_ns(self):
+ def utime_ns(file, times):
+ return os.utime(file, ns=times)
+ self._test_utime_ns(utime_ns)
+
+ requires_utime_dir_fd = unittest.skipUnless(
+ os.utime in os.supports_dir_fd,
+ "dir_fd support for utime required for this test.")
+ requires_utime_fd = unittest.skipUnless(
+ os.utime in os.supports_fd,
+ "fd support for utime required for this test.")
+ requires_utime_nofollow_symlinks = unittest.skipUnless(
+ os.utime in os.supports_follow_symlinks,
+ "follow_symlinks support for utime required for this test.")
+
+ @requires_utime_nofollow_symlinks
+ def test_lutimes_ns(self):
+ def lutimes_ns(file, times):
+ return os.utime(file, ns=times, follow_symlinks=False)
+ self._test_utime_ns(lutimes_ns)
+
+ @requires_utime_fd
+ def test_futimes_ns(self):
+ def futimes_ns(file, times):
+ with open(file, "wb") as f:
+ os.utime(f.fileno(), ns=times)
+ self._test_utime_ns(futimes_ns, test_dir=False)
+
+ def _utime_invalid_arguments(self, name, arg):
+ with self.assertRaises(ValueError):
+ getattr(os, name)(arg, (5, 5), ns=(5, 5))
+
+ def test_utime_invalid_arguments(self):
+ self._utime_invalid_arguments('utime', self.fname)
+
+
+ @unittest.skipUnless(stat_supports_subsecond,
+ "os.stat() doesn't has a subsecond resolution")
+ def _test_utime_subsecond(self, set_time_func):
+ asec, amsec = 1, 901
+ atime = asec + amsec * 1e-3
+ msec, mmsec = 2, 901
+ mtime = msec + mmsec * 1e-3
+ filename = self.fname
+ os.utime(filename, (0, 0))
+ set_time_func(filename, atime, mtime)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ os.stat_float_times(True)
+ st = os.stat(filename)
+ self.assertAlmostEqual(st.st_atime, atime, places=3)
+ self.assertAlmostEqual(st.st_mtime, mtime, places=3)
+
+ def test_utime_subsecond(self):
+ def set_time(filename, atime, mtime):
+ os.utime(filename, (atime, mtime))
+ self._test_utime_subsecond(set_time)
+
+ @requires_utime_fd
+ def test_futimes_subsecond(self):
+ def set_time(filename, atime, mtime):
+ with open(filename, "wb") as f:
+ os.utime(f.fileno(), times=(atime, mtime))
+ self._test_utime_subsecond(set_time)
+
+ @requires_utime_fd
+ def test_futimens_subsecond(self):
+ def set_time(filename, atime, mtime):
+ with open(filename, "wb") as f:
+ os.utime(f.fileno(), times=(atime, mtime))
+ self._test_utime_subsecond(set_time)
+
+ @requires_utime_dir_fd
+ def test_futimesat_subsecond(self):
+ def set_time(filename, atime, mtime):
+ dirname = os.path.dirname(filename)
+ dirfd = os.open(dirname, os.O_RDONLY)
+ try:
+ os.utime(os.path.basename(filename), dir_fd=dirfd,
+ times=(atime, mtime))
+ finally:
+ os.close(dirfd)
+ self._test_utime_subsecond(set_time)
+
+ @requires_utime_nofollow_symlinks
+ def test_lutimes_subsecond(self):
+ def set_time(filename, atime, mtime):
+ os.utime(filename, (atime, mtime), follow_symlinks=False)
+ self._test_utime_subsecond(set_time)
+
+ @requires_utime_dir_fd
+ def test_utimensat_subsecond(self):
+ def set_time(filename, atime, mtime):
+ dirname = os.path.dirname(filename)
+ dirfd = os.open(dirname, os.O_RDONLY)
+ try:
+ os.utime(os.path.basename(filename), dir_fd=dirfd,
+ times=(atime, mtime))
+ finally:
+ os.close(dirfd)
+ self._test_utime_subsecond(set_time)
+
# Restrict test to Win32, since there is no guarantee other
# systems support centiseconds
if sys.platform == 'win32':
@@ -296,6 +473,19 @@ class StatAttributeTests(unittest.TestCase):
return
self.fail("Could not stat pagefile.sys")
+ @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
+ def test_15261(self):
+ # Verify that stat'ing a closed fd does not cause crash
+ r, w = os.pipe()
+ try:
+ os.stat(r) # should not raise error
+ finally:
+ os.close(r)
+ os.close(w)
+ with self.assertRaises(OSError) as ctx:
+ os.stat(r)
+ self.assertEqual(ctx.exception.errno, errno.EBADF)
+
from test import mapping_tests
class EnvironTests(mapping_tests.BasicTestMappingProtocol):
@@ -324,23 +514,23 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
return os.environ
# Bug 1110478
+ @unittest.skipUnless(os.path.exists('/bin/sh'), 'requires /bin/sh')
def test_update2(self):
os.environ.clear()
- if os.path.exists("/bin/sh"):
- os.environ.update(HELLO="World")
- with os.popen("/bin/sh -c 'echo $HELLO'") as popen:
- value = popen.read().strip()
- self.assertEqual(value, "World")
+ os.environ.update(HELLO="World")
+ with os.popen("/bin/sh -c 'echo $HELLO'") as popen:
+ value = popen.read().strip()
+ self.assertEqual(value, "World")
+ @unittest.skipUnless(os.path.exists('/bin/sh'), 'requires /bin/sh')
def test_os_popen_iter(self):
- if os.path.exists("/bin/sh"):
- with os.popen(
- "/bin/sh -c 'echo \"line1\nline2\nline3\"'") as popen:
- it = iter(popen)
- self.assertEqual(next(it), "line1\n")
- self.assertEqual(next(it), "line2\n")
- self.assertEqual(next(it), "line3\n")
- self.assertRaises(StopIteration, next, it)
+ with os.popen(
+ "/bin/sh -c 'echo \"line1\nline2\nline3\"'") as popen:
+ it = iter(popen)
+ self.assertEqual(next(it), "line1\n")
+ self.assertEqual(next(it), "line2\n")
+ self.assertEqual(next(it), "line3\n")
+ self.assertRaises(StopIteration, next, it)
# Verify environ keys and values from the OS are of the
# correct str type.
@@ -427,8 +617,8 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
# On FreeBSD < 7 and OS X < 10.6, unsetenv() doesn't return a value (issue
# #13415).
- @unittest.skipIf(sys.platform.startswith(('freebsd', 'darwin')),
- "due to known OS bug: see issue #13415")
+ @support.requires_freebsd_version(7)
+ @support.requires_mac_ver(10, 6)
def test_unset_error(self):
if sys.platform == "win32":
# an environment variable is limited to 32,767 characters
@@ -442,7 +632,7 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
class WalkTests(unittest.TestCase):
"""Tests for os.walk()."""
- def test_traversal(self):
+ def setUp(self):
import os
from os.path import join
@@ -456,6 +646,7 @@ class WalkTests(unittest.TestCase):
# SUB2/ a file kid and a dirsymlink kid
# tmp3
# link/ a symlink to TESTFN.2
+ # broken_link
# TEST2/
# tmp4 a lone file
walk_path = join(support.TESTFN, "TEST1")
@@ -468,6 +659,8 @@ class WalkTests(unittest.TestCase):
link_path = join(sub2_path, "link")
t2_path = join(support.TESTFN, "TEST2")
tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
+ link_path = join(sub2_path, "link")
+ broken_link_path = join(sub2_path, "broken_link")
# Create stuff.
os.makedirs(sub11_path)
@@ -484,7 +677,8 @@ class WalkTests(unittest.TestCase):
else:
symlink_to_dir = os.symlink
symlink_to_dir(os.path.abspath(t2_path), link_path)
- sub2_tree = (sub2_path, ["link"], ["tmp3"])
+ symlink_to_dir('broken', broken_link_path)
+ sub2_tree = (sub2_path, ["link"], ["broken_link", "tmp3"])
else:
sub2_tree = (sub2_path, [], ["tmp3"])
@@ -496,6 +690,7 @@ class WalkTests(unittest.TestCase):
# flipped: TESTFN, SUB2, SUB1, SUB11
flipped = all[0][1][0] != "SUB1"
all[0][1].sort()
+ all[3 - 2 * flipped][-1].sort()
self.assertEqual(all[0], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"]))
self.assertEqual(all[2 + flipped], (sub11_path, [], []))
@@ -511,6 +706,7 @@ class WalkTests(unittest.TestCase):
dirs.remove('SUB1')
self.assertEqual(len(all), 2)
self.assertEqual(all[0], (walk_path, ["SUB2"], ["tmp1"]))
+ all[1][-1].sort()
self.assertEqual(all[1], sub2_tree)
# Walk bottom-up.
@@ -521,6 +717,7 @@ class WalkTests(unittest.TestCase):
# flipped: SUB2, SUB11, SUB1, TESTFN
flipped = all[3][1][0] != "SUB1"
all[3][1].sort()
+ all[2 - 2 * flipped][-1].sort()
self.assertEqual(all[3], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
self.assertEqual(all[flipped], (sub11_path, [], []))
self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"]))
@@ -552,6 +749,82 @@ class WalkTests(unittest.TestCase):
os.remove(dirname)
os.rmdir(support.TESTFN)
+
+@unittest.skipUnless(hasattr(os, 'fwalk'), "Test needs os.fwalk()")
+class FwalkTests(WalkTests):
+ """Tests for os.fwalk()."""
+
+ def _compare_to_walk(self, walk_kwargs, fwalk_kwargs):
+ """
+ compare with walk() results.
+ """
+ walk_kwargs = walk_kwargs.copy()
+ fwalk_kwargs = fwalk_kwargs.copy()
+ for topdown, follow_symlinks in itertools.product((True, False), repeat=2):
+ walk_kwargs.update(topdown=topdown, followlinks=follow_symlinks)
+ fwalk_kwargs.update(topdown=topdown, follow_symlinks=follow_symlinks)
+
+ expected = {}
+ for root, dirs, files in os.walk(**walk_kwargs):
+ expected[root] = (set(dirs), set(files))
+
+ for root, dirs, files, rootfd in os.fwalk(**fwalk_kwargs):
+ self.assertIn(root, expected)
+ self.assertEqual(expected[root], (set(dirs), set(files)))
+
+ def test_compare_to_walk(self):
+ kwargs = {'top': support.TESTFN}
+ self._compare_to_walk(kwargs, kwargs)
+
+ def test_dir_fd(self):
+ try:
+ fd = os.open(".", os.O_RDONLY)
+ walk_kwargs = {'top': support.TESTFN}
+ fwalk_kwargs = walk_kwargs.copy()
+ fwalk_kwargs['dir_fd'] = fd
+ self._compare_to_walk(walk_kwargs, fwalk_kwargs)
+ finally:
+ os.close(fd)
+
+ def test_yields_correct_dir_fd(self):
+ # check returned file descriptors
+ for topdown, follow_symlinks in itertools.product((True, False), repeat=2):
+ args = support.TESTFN, topdown, None
+ for root, dirs, files, rootfd in os.fwalk(*args, follow_symlinks=follow_symlinks):
+ # check that the FD is valid
+ os.fstat(rootfd)
+ # redundant check
+ os.stat(rootfd)
+ # check that listdir() returns consistent information
+ self.assertEqual(set(os.listdir(rootfd)), set(dirs) | set(files))
+
+ def test_fd_leak(self):
+ # Since we're opening a lot of FDs, we must be careful to avoid leaks:
+ # we both check that calling fwalk() a large number of times doesn't
+ # yield EMFILE, and that the minimum allocated FD hasn't changed.
+ minfd = os.dup(1)
+ os.close(minfd)
+ for i in range(256):
+ for x in os.fwalk(support.TESTFN):
+ pass
+ newfd = os.dup(1)
+ self.addCleanup(os.close, newfd)
+ self.assertEqual(newfd, minfd)
+
+ def tearDown(self):
+ # cleanup
+ for root, dirs, files, rootfd in os.fwalk(support.TESTFN, topdown=False):
+ for name in files:
+ os.unlink(name, dir_fd=rootfd)
+ for name in dirs:
+ st = os.stat(name, dir_fd=rootfd, follow_symlinks=False)
+ if stat.S_ISDIR(st.st_mode):
+ os.rmdir(name, dir_fd=rootfd)
+ else:
+ os.unlink(name, dir_fd=rootfd)
+ os.rmdir(support.TESTFN)
+
+
class MakedirTests(unittest.TestCase):
def setUp(self):
os.mkdir(support.TESTFN)
@@ -575,14 +848,12 @@ class MakedirTests(unittest.TestCase):
path = os.path.join(support.TESTFN, 'dir1')
mode = 0o777
old_mask = os.umask(0o022)
- try:
- os.makedirs(path, mode)
- self.assertRaises(OSError, os.makedirs, path, mode)
- self.assertRaises(OSError, os.makedirs, path, mode, exist_ok=False)
- self.assertRaises(OSError, os.makedirs, path, 0o776, exist_ok=True)
- os.makedirs(path, mode=mode, exist_ok=True)
- finally:
- os.umask(old_mask)
+ os.makedirs(path, mode)
+ self.assertRaises(OSError, os.makedirs, path, mode)
+ self.assertRaises(OSError, os.makedirs, path, mode, exist_ok=False)
+ self.assertRaises(OSError, os.makedirs, path, 0o776, exist_ok=True)
+ os.makedirs(path, mode=mode, exist_ok=True)
+ os.umask(old_mask)
def test_exist_ok_s_isgid_directory(self):
path = os.path.join(support.TESTFN, 'dir1')
@@ -594,7 +865,7 @@ class MakedirTests(unittest.TestCase):
os.lstat(support.TESTFN).st_mode)
try:
os.chmod(support.TESTFN, existing_testfn_mode | S_ISGID)
- except OSError:
+ except PermissionError:
raise unittest.SkipTest('Cannot set S_ISGID for dir.')
if (os.lstat(support.TESTFN).st_mode & S_ISGID != S_ISGID):
raise unittest.SkipTest('No support for S_ISGID dir mode.')
@@ -849,10 +1120,12 @@ class TestInvalidFD(unittest.TestCase):
def test_fpathconf(self):
if hasattr(os, "fpathconf"):
+ self.check(os.pathconf, "PC_NAME_MAX")
self.check(os.fpathconf, "PC_NAME_MAX")
def test_ftruncate(self):
if hasattr(os, "ftruncate"):
+ self.check(os.truncate, 0)
self.check(os.ftruncate, 0)
def test_lseek(self):
@@ -886,7 +1159,9 @@ class LinkTests(unittest.TestCase):
with open(file1, "w") as f1:
f1.write("test")
- os.link(file1, file2)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ os.link(file1, file2)
with open(file1, "r") as f1, open(file2, "r") as f2:
self.assertTrue(os.path.sameopenfile(f1.fileno(), f2.fileno()))
@@ -989,8 +1264,7 @@ if sys.platform != 'win32':
os.mkdir(self.dir)
try:
for fn in bytesfn:
- f = open(os.path.join(self.bdir, fn), "w")
- f.close()
+ support.create_empty_file(os.path.join(self.bdir, fn))
fn = os.fsdecode(fn)
if fn in self.unicodefn:
raise ValueError("duplicate filename")
@@ -1006,6 +1280,13 @@ if sys.platform != 'win32':
expected = self.unicodefn
found = set(os.listdir(self.dir))
self.assertEqual(found, expected)
+ # test listdir without arguments
+ current_directory = os.getcwd()
+ try:
+ os.chdir(os.sep)
+ self.assertEqual(set(os.listdir()), set(os.listdir(os.sep)))
+ finally:
+ os.chdir(current_directory)
def test_open(self):
for fn in self.unicodefn:
@@ -1209,8 +1490,10 @@ class Win32SymlinkTests(unittest.TestCase):
self.assertNotEqual(os.lstat(link), os.stat(link))
bytes_link = os.fsencode(link)
- self.assertEqual(os.stat(bytes_link), os.stat(target))
- self.assertNotEqual(os.lstat(bytes_link), os.stat(bytes_link))
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ self.assertEqual(os.stat(bytes_link), os.stat(target))
+ self.assertNotEqual(os.lstat(bytes_link), os.stat(bytes_link))
def test_12084(self):
level1 = os.path.abspath(support.TESTFN)
@@ -1269,6 +1552,22 @@ class FSEncodingTests(unittest.TestCase):
self.assertEqual(os.fsdecode(bytesfn), fn)
+
+class DeviceEncodingTests(unittest.TestCase):
+
+ def test_bad_fd(self):
+ # Return None when an fd doesn't actually exist.
+ self.assertIsNone(os.device_encoding(123456))
+
+ @unittest.skipUnless(os.isatty(0) and (sys.platform.startswith('win') or
+ (hasattr(locale, 'nl_langinfo') and hasattr(locale, 'CODESET'))),
+ 'test requires a tty and either Windows or nl_langinfo(CODESET)')
+ def test_device_encoding(self):
+ encoding = os.device_encoding(0)
+ self.assertIsNotNone(encoding)
+ self.assertTrue(codecs.lookup(encoding))
+
+
class PidTests(unittest.TestCase):
@unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid")
def test_getppid(self):
@@ -1290,12 +1589,471 @@ class LoginTests(unittest.TestCase):
self.assertNotEqual(len(user_name), 0)
+@unittest.skipUnless(hasattr(os, 'getpriority') and hasattr(os, 'setpriority'),
+ "needs os.getpriority and os.setpriority")
+class ProgramPriorityTests(unittest.TestCase):
+ """Tests for os.getpriority() and os.setpriority()."""
+
+ def test_set_get_priority(self):
+
+ base = os.getpriority(os.PRIO_PROCESS, os.getpid())
+ os.setpriority(os.PRIO_PROCESS, os.getpid(), base + 1)
+ try:
+ new_prio = os.getpriority(os.PRIO_PROCESS, os.getpid())
+ if base >= 19 and new_prio <= 19:
+ raise unittest.SkipTest(
+ "unable to reliably test setpriority at current nice level of %s" % base)
+ else:
+ self.assertEqual(new_prio, base + 1)
+ finally:
+ try:
+ os.setpriority(os.PRIO_PROCESS, os.getpid(), base)
+ except OSError as err:
+ if err.errno != errno.EACCES:
+ raise
+
+
+if threading is not None:
+ class SendfileTestServer(asyncore.dispatcher, threading.Thread):
+
+ class Handler(asynchat.async_chat):
+
+ def __init__(self, conn):
+ asynchat.async_chat.__init__(self, conn)
+ self.in_buffer = []
+ self.closed = False
+ self.push(b"220 ready\r\n")
+
+ def handle_read(self):
+ data = self.recv(4096)
+ self.in_buffer.append(data)
+
+ def get_data(self):
+ return b''.join(self.in_buffer)
+
+ def handle_close(self):
+ self.close()
+ self.closed = True
+
+ def handle_error(self):
+ raise
+
+ def __init__(self, address):
+ threading.Thread.__init__(self)
+ asyncore.dispatcher.__init__(self)
+ self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.bind(address)
+ self.listen(5)
+ self.host, self.port = self.socket.getsockname()[:2]
+ self.handler_instance = None
+ self._active = False
+ self._active_lock = threading.Lock()
+
+ # --- public API
+
+ @property
+ def running(self):
+ return self._active
+
+ def start(self):
+ assert not self.running
+ self.__flag = threading.Event()
+ threading.Thread.start(self)
+ self.__flag.wait()
+
+ def stop(self):
+ assert self.running
+ self._active = False
+ self.join()
+
+ def wait(self):
+ # wait for handler connection to be closed, then stop the server
+ while not getattr(self.handler_instance, "closed", False):
+ time.sleep(0.001)
+ self.stop()
+
+ # --- internals
+
+ def run(self):
+ self._active = True
+ self.__flag.set()
+ while self._active and asyncore.socket_map:
+ self._active_lock.acquire()
+ asyncore.loop(timeout=0.001, count=1)
+ self._active_lock.release()
+ asyncore.close_all()
+
+ def handle_accept(self):
+ conn, addr = self.accept()
+ self.handler_instance = self.Handler(conn)
+
+ def handle_connect(self):
+ self.close()
+ handle_read = handle_connect
+
+ def writable(self):
+ return 0
+
+ def handle_error(self):
+ raise
+
+
+@unittest.skipUnless(threading is not None, "test needs threading module")
+@unittest.skipUnless(hasattr(os, 'sendfile'), "test needs os.sendfile()")
+class TestSendfile(unittest.TestCase):
+
+ DATA = b"12345abcde" * 16 * 1024 # 160 KB
+ SUPPORT_HEADERS_TRAILERS = not sys.platform.startswith("linux") and \
+ not sys.platform.startswith("solaris") and \
+ not sys.platform.startswith("sunos")
+
+ @classmethod
+ def setUpClass(cls):
+ with open(support.TESTFN, "wb") as f:
+ f.write(cls.DATA)
+
+ @classmethod
+ def tearDownClass(cls):
+ support.unlink(support.TESTFN)
+
+ def setUp(self):
+ self.server = SendfileTestServer((support.HOST, 0))
+ self.server.start()
+ self.client = socket.socket()
+ self.client.connect((self.server.host, self.server.port))
+ self.client.settimeout(1)
+ # synchronize by waiting for "220 ready" response
+ self.client.recv(1024)
+ self.sockno = self.client.fileno()
+ self.file = open(support.TESTFN, 'rb')
+ self.fileno = self.file.fileno()
+
+ def tearDown(self):
+ self.file.close()
+ self.client.close()
+ if self.server.running:
+ self.server.stop()
+
+ def sendfile_wrapper(self, sock, file, offset, nbytes, headers=[], trailers=[]):
+ """A higher level wrapper representing how an application is
+ supposed to use sendfile().
+ """
+ while 1:
+ try:
+ if self.SUPPORT_HEADERS_TRAILERS:
+ return os.sendfile(sock, file, offset, nbytes, headers,
+ trailers)
+ else:
+ return os.sendfile(sock, file, offset, nbytes)
+ except OSError as err:
+ if err.errno == errno.ECONNRESET:
+ # disconnected
+ raise
+ elif err.errno in (errno.EAGAIN, errno.EBUSY):
+ # we have to retry send data
+ continue
+ else:
+ raise
+
+ def test_send_whole_file(self):
+ # normal send
+ total_sent = 0
+ offset = 0
+ nbytes = 4096
+ while total_sent < len(self.DATA):
+ sent = self.sendfile_wrapper(self.sockno, self.fileno, offset, nbytes)
+ if sent == 0:
+ break
+ offset += sent
+ total_sent += sent
+ self.assertTrue(sent <= nbytes)
+ self.assertEqual(offset, total_sent)
+
+ self.assertEqual(total_sent, len(self.DATA))
+ self.client.shutdown(socket.SHUT_RDWR)
+ self.client.close()
+ self.server.wait()
+ data = self.server.handler_instance.get_data()
+ self.assertEqual(len(data), len(self.DATA))
+ self.assertEqual(data, self.DATA)
+
+ def test_send_at_certain_offset(self):
+ # start sending a file at a certain offset
+ total_sent = 0
+ offset = len(self.DATA) // 2
+ must_send = len(self.DATA) - offset
+ nbytes = 4096
+ while total_sent < must_send:
+ sent = self.sendfile_wrapper(self.sockno, self.fileno, offset, nbytes)
+ if sent == 0:
+ break
+ offset += sent
+ total_sent += sent
+ self.assertTrue(sent <= nbytes)
+
+ self.client.shutdown(socket.SHUT_RDWR)
+ self.client.close()
+ self.server.wait()
+ data = self.server.handler_instance.get_data()
+ expected = self.DATA[len(self.DATA) // 2:]
+ self.assertEqual(total_sent, len(expected))
+ self.assertEqual(len(data), len(expected))
+ self.assertEqual(data, expected)
+
+ def test_offset_overflow(self):
+ # specify an offset > file size
+ offset = len(self.DATA) + 4096
+ try:
+ sent = os.sendfile(self.sockno, self.fileno, offset, 4096)
+ except OSError as e:
+ # Solaris can raise EINVAL if offset >= file length, ignore.
+ if e.errno != errno.EINVAL:
+ raise
+ else:
+ self.assertEqual(sent, 0)
+ self.client.shutdown(socket.SHUT_RDWR)
+ self.client.close()
+ self.server.wait()
+ data = self.server.handler_instance.get_data()
+ self.assertEqual(data, b'')
+
+ def test_invalid_offset(self):
+ with self.assertRaises(OSError) as cm:
+ os.sendfile(self.sockno, self.fileno, -1, 4096)
+ self.assertEqual(cm.exception.errno, errno.EINVAL)
+
+ # --- headers / trailers tests
+
+ if SUPPORT_HEADERS_TRAILERS:
+
+ def test_headers(self):
+ total_sent = 0
+ sent = os.sendfile(self.sockno, self.fileno, 0, 4096,
+ headers=[b"x" * 512])
+ total_sent += sent
+ offset = 4096
+ nbytes = 4096
+ while 1:
+ sent = self.sendfile_wrapper(self.sockno, self.fileno,
+ offset, nbytes)
+ if sent == 0:
+ break
+ total_sent += sent
+ offset += sent
+
+ expected_data = b"x" * 512 + self.DATA
+ self.assertEqual(total_sent, len(expected_data))
+ self.client.close()
+ self.server.wait()
+ data = self.server.handler_instance.get_data()
+ self.assertEqual(hash(data), hash(expected_data))
+
+ def test_trailers(self):
+ TESTFN2 = support.TESTFN + "2"
+ with open(TESTFN2, 'wb') as f:
+ f.write(b"abcde")
+ with open(TESTFN2, 'rb')as f:
+ self.addCleanup(os.remove, TESTFN2)
+ os.sendfile(self.sockno, f.fileno(), 0, 4096,
+ trailers=[b"12345"])
+ self.client.close()
+ self.server.wait()
+ data = self.server.handler_instance.get_data()
+ self.assertEqual(data, b"abcde12345")
+
+ if hasattr(os, "SF_NODISKIO"):
+ def test_flags(self):
+ try:
+ os.sendfile(self.sockno, self.fileno, 0, 4096,
+ flags=os.SF_NODISKIO)
+ except OSError as err:
+ if err.errno not in (errno.EBUSY, errno.EAGAIN):
+ raise
+
+
+def supports_extended_attributes():
+ if not hasattr(os, "setxattr"):
+ return False
+ try:
+ with open(support.TESTFN, "wb") as fp:
+ try:
+ os.setxattr(fp.fileno(), b"user.test", b"")
+ except OSError:
+ return False
+ finally:
+ support.unlink(support.TESTFN)
+ # Kernels < 2.6.39 don't respect setxattr flags.
+ kernel_version = platform.release()
+ m = re.match("2.6.(\d{1,2})", kernel_version)
+ return m is None or int(m.group(1)) >= 39
+
+
+@unittest.skipUnless(supports_extended_attributes(),
+ "no non-broken extended attribute support")
+class ExtendedAttributeTests(unittest.TestCase):
+
+ def tearDown(self):
+ support.unlink(support.TESTFN)
+
+ def _check_xattrs_str(self, s, getxattr, setxattr, removexattr, listxattr, **kwargs):
+ fn = support.TESTFN
+ open(fn, "wb").close()
+ with self.assertRaises(OSError) as cm:
+ getxattr(fn, s("user.test"), **kwargs)
+ self.assertEqual(cm.exception.errno, errno.ENODATA)
+ init_xattr = listxattr(fn)
+ self.assertIsInstance(init_xattr, list)
+ setxattr(fn, s("user.test"), b"", **kwargs)
+ xattr = set(init_xattr)
+ xattr.add("user.test")
+ self.assertEqual(set(listxattr(fn)), xattr)
+ self.assertEqual(getxattr(fn, b"user.test", **kwargs), b"")
+ setxattr(fn, s("user.test"), b"hello", os.XATTR_REPLACE, **kwargs)
+ self.assertEqual(getxattr(fn, b"user.test", **kwargs), b"hello")
+ with self.assertRaises(OSError) as cm:
+ setxattr(fn, s("user.test"), b"bye", os.XATTR_CREATE, **kwargs)
+ self.assertEqual(cm.exception.errno, errno.EEXIST)
+ with self.assertRaises(OSError) as cm:
+ setxattr(fn, s("user.test2"), b"bye", os.XATTR_REPLACE, **kwargs)
+ self.assertEqual(cm.exception.errno, errno.ENODATA)
+ setxattr(fn, s("user.test2"), b"foo", os.XATTR_CREATE, **kwargs)
+ xattr.add("user.test2")
+ self.assertEqual(set(listxattr(fn)), xattr)
+ removexattr(fn, s("user.test"), **kwargs)
+ with self.assertRaises(OSError) as cm:
+ getxattr(fn, s("user.test"), **kwargs)
+ self.assertEqual(cm.exception.errno, errno.ENODATA)
+ xattr.remove("user.test")
+ self.assertEqual(set(listxattr(fn)), xattr)
+ self.assertEqual(getxattr(fn, s("user.test2"), **kwargs), b"foo")
+ setxattr(fn, s("user.test"), b"a"*1024, **kwargs)
+ self.assertEqual(getxattr(fn, s("user.test"), **kwargs), b"a"*1024)
+ removexattr(fn, s("user.test"), **kwargs)
+ many = sorted("user.test{}".format(i) for i in range(100))
+ for thing in many:
+ setxattr(fn, thing, b"x", **kwargs)
+ self.assertEqual(set(listxattr(fn)), set(init_xattr) | set(many))
+
+ def _check_xattrs(self, *args, **kwargs):
+ def make_bytes(s):
+ return bytes(s, "ascii")
+ self._check_xattrs_str(str, *args, **kwargs)
+ support.unlink(support.TESTFN)
+ self._check_xattrs_str(make_bytes, *args, **kwargs)
+
+ def test_simple(self):
+ self._check_xattrs(os.getxattr, os.setxattr, os.removexattr,
+ os.listxattr)
+
+ def test_lpath(self):
+ self._check_xattrs(os.getxattr, os.setxattr, os.removexattr,
+ os.listxattr, follow_symlinks=False)
+
+ def test_fds(self):
+ def getxattr(path, *args):
+ with open(path, "rb") as fp:
+ return os.getxattr(fp.fileno(), *args)
+ def setxattr(path, *args):
+ with open(path, "wb") as fp:
+ os.setxattr(fp.fileno(), *args)
+ def removexattr(path, *args):
+ with open(path, "wb") as fp:
+ os.removexattr(fp.fileno(), *args)
+ def listxattr(path, *args):
+ with open(path, "rb") as fp:
+ return os.listxattr(fp.fileno(), *args)
+ self._check_xattrs(getxattr, setxattr, removexattr, listxattr)
+
+
+@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
+class Win32DeprecatedBytesAPI(unittest.TestCase):
+ def test_deprecated(self):
+ import nt
+ filename = os.fsencode(support.TESTFN)
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", DeprecationWarning)
+ for func, *args in (
+ (nt._getfullpathname, filename),
+ (nt._isdir, filename),
+ (os.access, filename, os.R_OK),
+ (os.chdir, filename),
+ (os.chmod, filename, 0o777),
+ (os.getcwdb,),
+ (os.link, filename, filename),
+ (os.listdir, filename),
+ (os.lstat, filename),
+ (os.mkdir, filename),
+ (os.open, filename, os.O_RDONLY),
+ (os.rename, filename, filename),
+ (os.rmdir, filename),
+ (os.startfile, filename),
+ (os.stat, filename),
+ (os.unlink, filename),
+ (os.utime, filename),
+ ):
+ self.assertRaises(DeprecationWarning, func, *args)
+
+ @support.skip_unless_symlink
+ def test_symlink(self):
+ filename = os.fsencode(support.TESTFN)
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", DeprecationWarning)
+ self.assertRaises(DeprecationWarning,
+ os.symlink, filename, filename)
+
+
+@unittest.skipUnless(hasattr(os, 'get_terminal_size'), "requires os.get_terminal_size")
+class TermsizeTests(unittest.TestCase):
+ def test_does_not_crash(self):
+ """Check if get_terminal_size() returns a meaningful value.
+
+ There's no easy portable way to actually check the size of the
+ terminal, so let's check if it returns something sensible instead.
+ """
+ try:
+ size = os.get_terminal_size()
+ except OSError as e:
+ if sys.platform == "win32" or e.errno in (errno.EINVAL, errno.ENOTTY):
+ # Under win32 a generic OSError can be thrown if the
+ # handle cannot be retrieved
+ self.skipTest("failed to query terminal size")
+ raise
+
+ self.assertGreaterEqual(size.columns, 0)
+ self.assertGreaterEqual(size.lines, 0)
+
+ def test_stty_match(self):
+ """Check if stty returns the same results
+
+ stty actually tests stdin, so get_terminal_size is invoked on
+ stdin explicitly. If stty succeeded, then get_terminal_size()
+ should work too.
+ """
+ try:
+ size = subprocess.check_output(['stty', 'size']).decode().split()
+ except (FileNotFoundError, subprocess.CalledProcessError):
+ self.skipTest("stty invocation failed")
+ expected = (int(size[1]), int(size[0])) # reversed order
+
+ try:
+ actual = os.get_terminal_size(sys.__stdin__.fileno())
+ except OSError as e:
+ if sys.platform == "win32" or e.errno in (errno.EINVAL, errno.ENOTTY):
+ # Under win32 a generic OSError can be thrown if the
+ # handle cannot be retrieved
+ self.skipTest("failed to query terminal size")
+ raise
+ self.assertEqual(expected, actual)
+
+
+@support.reap_threads
def test_main():
support.run_unittest(
FileTests,
StatAttributeTests,
EnvironTests,
WalkTests,
+ FwalkTests,
MakedirTests,
DevNullTests,
URandomTests,
@@ -1307,9 +2065,15 @@ def test_main():
Win32KillTests,
Win32SymlinkTests,
FSEncodingTests,
+ DeviceEncodingTests,
PidTests,
LoginTests,
LinkTests,
+ TestSendfile,
+ ProgramPriorityTests,
+ ExtendedAttributeTests,
+ Win32DeprecatedBytesAPI,
+ TermsizeTests,
)
if __name__ == "__main__":
diff --git a/Lib/test/test_ossaudiodev.py b/Lib/test/test_ossaudiodev.py
index 9cb89d6..3908a05 100644
--- a/Lib/test/test_ossaudiodev.py
+++ b/Lib/test/test_ossaudiodev.py
@@ -170,6 +170,22 @@ class OSSAudioDevTests(unittest.TestCase):
pass
self.assertTrue(dsp.closed)
+ def test_on_closed(self):
+ dsp = ossaudiodev.open('w')
+ dsp.close()
+ self.assertRaises(ValueError, dsp.fileno)
+ self.assertRaises(ValueError, dsp.read, 1)
+ self.assertRaises(ValueError, dsp.write, b'x')
+ self.assertRaises(ValueError, dsp.writeall, b'x')
+ self.assertRaises(ValueError, dsp.bufsize)
+ self.assertRaises(ValueError, dsp.obufcount)
+ self.assertRaises(ValueError, dsp.obufcount)
+ self.assertRaises(ValueError, dsp.obuffree)
+ self.assertRaises(ValueError, dsp.getptr)
+
+ mixer = ossaudiodev.openmixer()
+ mixer.close()
+ self.assertRaises(ValueError, mixer.fileno)
def test_main():
try:
diff --git a/Lib/test/test_osx_env.py b/Lib/test/test_osx_env.py
index 8b3df37..24ec2b4 100644
--- a/Lib/test/test_osx_env.py
+++ b/Lib/test/test_osx_env.py
@@ -5,6 +5,7 @@ Test suite for OS X interpreter environment variables.
from test.support import EnvironmentVarGuard, run_unittest
import subprocess
import sys
+import sysconfig
import unittest
class OSXEnvironmentVariableTestCase(unittest.TestCase):
@@ -27,8 +28,6 @@ class OSXEnvironmentVariableTestCase(unittest.TestCase):
self._check_sys('PYTHONEXECUTABLE', '==', 'sys.executable')
def test_main():
- from distutils import sysconfig
-
if sys.platform == 'darwin' and sysconfig.get_config_var('WITH_NEXT_FRAMEWORK'):
run_unittest(OSXEnvironmentVariableTestCase)
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
index 70eb9c0..c93a2ca 100644
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -51,6 +51,10 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
self.check_suite("def f(): (yield 1)*2")
self.check_suite("def f(): return; yield 1")
self.check_suite("def f(): yield 1; return")
+ self.check_suite("def f(): yield from 1")
+ self.check_suite("def f(): x = yield from 1")
+ self.check_suite("def f(): f((yield from 1))")
+ self.check_suite("def f(): yield 1; return 1")
self.check_suite("def f():\n"
" for x in range(30):\n"
" yield x\n")
@@ -717,6 +721,12 @@ class STObjectTestCase(unittest.TestCase):
# XXX tests for pickling and unpickling of ST objects should go here
+class OtherParserCase(unittest.TestCase):
+
+ def test_two_args_to_expr(self):
+ # See bug #12264
+ with self.assertRaises(TypeError):
+ parser.expr("a", "b")
def test_main():
support.run_unittest(
@@ -725,6 +735,7 @@ def test_main():
CompileTestCase,
ParserStackLimitTestCase,
STObjectTestCase,
+ OtherParserCase,
)
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index d28b042..0f7a984 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -21,9 +21,12 @@ class PdbTestInput(object):
def __enter__(self):
self.real_stdin = sys.stdin
sys.stdin = _FakeInput(self.input)
+ self.orig_trace = sys.gettrace() if hasattr(sys, 'gettrace') else None
def __exit__(self, *exc):
sys.stdin = self.real_stdin
+ if self.orig_trace:
+ sys.settrace(self.orig_trace)
def test_pdb_displayhook():
diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py
index e268ae2..1cacdea 100644
--- a/Lib/test/test_peepholer.py
+++ b/Lib/test/test_peepholer.py
@@ -3,13 +3,16 @@ import re
import sys
from io import StringIO
import unittest
+from math import copysign
def disassemble(func):
f = StringIO()
tmp = sys.stdout
sys.stdout = f
- dis.dis(func)
- sys.stdout = tmp
+ try:
+ dis.dis(func)
+ finally:
+ sys.stdout = tmp
result = f.getvalue()
f.close()
return result
@@ -17,6 +20,7 @@ def disassemble(func):
def dis_single(line):
return disassemble(compile(line, '', 'single'))
+
class TestTranforms(unittest.TestCase):
def test_unot(self):
@@ -99,6 +103,12 @@ class TestTranforms(unittest.TestCase):
self.assertIn(elem, asm)
self.assertNotIn('BUILD_TUPLE', asm)
+ # Long tuples should be folded too.
+ asm = dis_single(repr(tuple(range(10000))))
+ # One LOAD_CONST for the tuple, one for the None return value
+ self.assertEqual(asm.count('LOAD_CONST'), 2)
+ self.assertNotIn('BUILD_TUPLE', asm)
+
# Bug 1053819: Tuple of constants misidentified when presented with:
# . . . opcode_with_arg 100 unary_opcode BUILD_TUPLE 1 . . .
# The following would segfault upon compilation
@@ -196,27 +206,28 @@ class TestTranforms(unittest.TestCase):
self.assertIn('(1000)', asm)
def test_binary_subscr_on_unicode(self):
- # unicode strings don't get optimized
+ # valid code get optimized
asm = dis_single('"foo"[0]')
- self.assertNotIn("('f')", asm)
- self.assertIn('BINARY_SUBSCR', asm)
+ self.assertIn("('f')", asm)
+ self.assertNotIn('BINARY_SUBSCR', asm)
asm = dis_single('"\u0061\uffff"[1]')
- self.assertNotIn("('\\uffff')", asm)
- self.assertIn('BINARY_SUBSCR', asm)
+ self.assertIn("('\\uffff')", asm)
+ self.assertNotIn('BINARY_SUBSCR', asm)
+ asm = dis_single('"\U00012345abcdef"[3]')
+ self.assertIn("('c')", asm)
+ self.assertNotIn('BINARY_SUBSCR', asm)
+ # invalid code doesn't get optimized
# out of range
asm = dis_single('"fuu"[10]')
self.assertIn('BINARY_SUBSCR', asm)
- # non-BMP char (see #5057)
- asm = dis_single('"\U00012345"[0]')
- self.assertIn('BINARY_SUBSCR', asm)
- asm = dis_single('"\U00012345abcdef"[3]')
- self.assertIn('BINARY_SUBSCR', asm)
-
def test_folding_of_unaryops_on_constants(self):
for line, elem in (
('-0.5', '(-0.5)'), # unary negative
+ ('-0.0', '(-0.0)'), # -0.0
+ ('-(1.0-1.0)','(-0.0)'), # -0.0 after folding
+ ('-0', '(0)'), # -0
('~-2', '(1)'), # unary invert
('+1', '(1)'), # unary positive
):
@@ -224,6 +235,13 @@ class TestTranforms(unittest.TestCase):
self.assertIn(elem, asm, asm)
self.assertNotIn('UNARY_', asm)
+ # Check that -0.0 works after marshaling
+ def negzero():
+ return -(1.0-1.0)
+
+ self.assertNotIn('UNARY_', disassemble(negzero))
+ self.assertTrue(copysign(1.0, negzero()) < 0)
+
# Verify that unfoldables are skipped
for line, elem in (
('-"abc"', "('abc')"), # unary negative
@@ -286,6 +304,25 @@ class TestTranforms(unittest.TestCase):
asm = disassemble(f)
self.assertNotIn('BINARY_ADD', asm)
+ def test_constant_folding(self):
+ # Issue #11244: aggressive constant folding.
+ exprs = [
+ "3 * -5",
+ "-3 * 5",
+ "2 * (3 * 4)",
+ "(2 * 3) * 4",
+ "(-1, 2, 3)",
+ "(1, -2, 3)",
+ "(1, 2, -3)",
+ "(1, 2, -3) * 6",
+ "lambda x: x in {(3 * -5) + (-1 - 6), (1, -2, 3) * 2, None}",
+ ]
+ for e in exprs:
+ asm = dis_single(e)
+ self.assertNotIn('UNARY_', asm, e)
+ self.assertNotIn('BINARY_', asm, e)
+ self.assertNotIn('BUILD_', asm, e)
+
class TestBuglets(unittest.TestCase):
def test_bug_11510(self):
diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py
index 6d891e5..4b16cbb 100644
--- a/Lib/test/test_pep277.py
+++ b/Lib/test/test_pep277.py
@@ -1,6 +1,9 @@
# Test the Unicode versions of normal file functions
# open, os.open, os.stat. os.listdir, os.rename, os.remove, os.mkdir, os.chdir, os.rmdir
-import sys, os, unittest
+import os
+import sys
+import unittest
+import warnings
from unicodedata import normalize
from test import support
@@ -38,8 +41,8 @@ if sys.platform != 'darwin':
'17_\u2001\u2001\u2001A',
'18_\u2003\u2003\u2003A', # == NFC('\u2001\u2001\u2001A')
'19_\u0020\u0020\u0020A', # '\u0020' == ' ' == NFKC('\u2000') ==
- # NFKC('\u2001') == NFKC('\u2003')
-])
+ # NFKC('\u2001') == NFKC('\u2003')
+ ])
# Is it Unicode-friendly?
@@ -71,7 +74,7 @@ class UnicodeFileTests(unittest.TestCase):
def setUp(self):
try:
os.mkdir(support.TESTFN)
- except OSError:
+ except FileExistsError:
pass
files = set()
for name in self.files:
@@ -90,15 +93,17 @@ class UnicodeFileTests(unittest.TestCase):
return normalize(self.normal_form, s)
return s
- def _apply_failure(self, fn, filename, expected_exception,
- check_fn_in_exception = True):
+ def _apply_failure(self, fn, filename,
+ expected_exception=FileNotFoundError,
+ check_filename=True):
with self.assertRaises(expected_exception) as c:
fn(filename)
exc_filename = c.exception.filename
- # the "filename" exception attribute may be encoded
- if isinstance(exc_filename, bytes):
- filename = filename.encode(sys.getfilesystemencoding())
- if check_fn_in_exception:
+ # listdir may append a wildcard to the filename
+ if fn is os.listdir and sys.platform == 'win32':
+ exc_filename, _, wildcard = exc_filename.rpartition(os.sep)
+ self.assertEqual(wildcard, '*.*')
+ if check_filename:
self.assertEqual(exc_filename, filename, "Function '%s(%a) failed "
"with bad filename in the exception: %a" %
(fn.__name__, filename, exc_filename))
@@ -107,13 +112,18 @@ class UnicodeFileTests(unittest.TestCase):
# Pass non-existing Unicode filenames all over the place.
for name in self.files:
name = "not_" + name
- self._apply_failure(open, name, IOError)
- self._apply_failure(os.stat, name, OSError)
- self._apply_failure(os.chdir, name, OSError)
- self._apply_failure(os.rmdir, name, OSError)
- self._apply_failure(os.remove, name, OSError)
- # listdir may append a wildcard to the filename, so dont check
- self._apply_failure(os.listdir, name, OSError, False)
+ self._apply_failure(open, name)
+ self._apply_failure(os.stat, name)
+ self._apply_failure(os.chdir, name)
+ self._apply_failure(os.rmdir, name)
+ self._apply_failure(os.remove, name)
+ self._apply_failure(os.listdir, name)
+
+ if sys.platform == 'win32':
+ # Windows is lunatic. Issue #13366.
+ _listdir_failure = NotADirectoryError, FileNotFoundError
+ else:
+ _listdir_failure = NotADirectoryError
def test_open(self):
for name in self.files:
@@ -121,12 +131,13 @@ class UnicodeFileTests(unittest.TestCase):
f.write((name+'\n').encode("utf-8"))
f.close()
os.stat(name)
+ self._apply_failure(os.listdir, name, self._listdir_failure)
# Skip the test on darwin, because darwin does normalize the filename to
# NFD (a variant of Unicode NFD form). Normalize the filename to NFC, NFKC,
# NFKD in Python is useless, because darwin will normalize it later and so
# open(), os.stat(), etc. don't raise any exception.
- @unittest.skipIf(sys.platform == 'darwin', 'irrevelant test on Mac OS X')
+ @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
def test_normalize(self):
files = set(self.files)
others = set()
@@ -134,21 +145,22 @@ class UnicodeFileTests(unittest.TestCase):
others |= set(normalize(nf, file) for file in files)
others -= files
for name in others:
- self._apply_failure(open, name, IOError)
- self._apply_failure(os.stat, name, OSError)
- self._apply_failure(os.chdir, name, OSError)
- self._apply_failure(os.rmdir, name, OSError)
- self._apply_failure(os.remove, name, OSError)
- # listdir may append a wildcard to the filename, so dont check
- self._apply_failure(os.listdir, name, OSError, False)
+ self._apply_failure(open, name)
+ self._apply_failure(os.stat, name)
+ self._apply_failure(os.chdir, name)
+ self._apply_failure(os.rmdir, name)
+ self._apply_failure(os.remove, name)
+ self._apply_failure(os.listdir, name)
# Skip the test on darwin, because darwin uses a normalization different
# than Python NFD normalization: filenames are different even if we use
# Python NFD normalization.
- @unittest.skipIf(sys.platform == 'darwin', 'irrevelant test on Mac OS X')
+ @unittest.skipIf(sys.platform == 'darwin', 'irrelevant test on Mac OS X')
def test_listdir(self):
sf0 = set(self.files)
- f1 = os.listdir(support.TESTFN.encode(sys.getfilesystemencoding()))
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ f1 = os.listdir(support.TESTFN.encode(sys.getfilesystemencoding()))
f2 = os.listdir(support.TESTFN)
sf2 = set(os.path.join(support.TESTFN, f) for f in f2)
self.assertEqual(sf0, sf2, "%a != %a" % (sf0, sf2))
diff --git a/Lib/test/test_pep292.py b/Lib/test/test_pep292.py
index 119c7ea..6da8d2e 100644
--- a/Lib/test/test_pep292.py
+++ b/Lib/test/test_pep292.py
@@ -42,19 +42,6 @@ class TestTemplate(unittest.TestCase):
s = Template('$who likes $$')
eq(s.substitute(dict(who='tim', what='ham')), 'tim likes $')
- def test_invalid(self):
- class MyPattern(Template):
- pattern = r"""
- (?:
- (?P<invalid>) |
- (?P<escaped>%(delim)s) |
- @(?P<named>%(id)s) |
- @{(?P<braced>%(id)s)}
- )
- """
- s = MyPattern('$')
- self.assertRaises(ValueError, s.substitute, dict())
-
def test_percents(self):
eq = self.assertEqual
s = Template('%(foo)s $foo ${foo}')
@@ -172,6 +159,26 @@ class TestTemplate(unittest.TestCase):
val = t.safe_substitute({'location': 'Cleveland'})
self.assertEqual(val, 'PyCon in Cleveland')
+ def test_invalid_with_no_lines(self):
+ # The error formatting for invalid templates
+ # has a special case for no data that the default
+ # pattern can't trigger (always has at least '$')
+ # So we craft a pattern that is always invalid
+ # with no leading data.
+ class MyTemplate(Template):
+ pattern = r"""
+ (?P<invalid>) |
+ unreachable(
+ (?P<named>) |
+ (?P<braced>) |
+ (?P<escaped>)
+ )
+ """
+ s = MyTemplate('')
+ with self.assertRaises(ValueError) as err:
+ s.substitute({})
+ self.assertIn('line 1, col 1', str(err.exception))
+
def test_unicode_values(self):
s = Template('$who likes $what')
d = dict(who='t\xffm', what='f\xfe\fed')
diff --git a/Lib/test/test_pep3131.py b/Lib/test/test_pep3131.py
index df0f64d..2e6b90a 100644
--- a/Lib/test/test_pep3131.py
+++ b/Lib/test/test_pep3131.py
@@ -17,12 +17,7 @@ class PEP3131Test(unittest.TestCase):
def test_non_bmp_normalized(self):
ð”˜ð”«ð”¦ð” ð”¬ð”¡ð”¢ = 1
- # On wide builds, this is normalized, but on narrow ones it is not. See
- # #12746.
- try:
- self.assertIn("ð”˜ð”«ð”¦ð” ð”¬ð”¡ð”¢", dir())
- except AssertionError:
- raise unittest.case._ExpectedFailure(sys.exc_info())
+ self.assertIn("Unicode", dir())
def test_invalid(self):
try:
diff --git a/Lib/test/test_pep3151.py b/Lib/test/test_pep3151.py
new file mode 100644
index 0000000..2792c10
--- /dev/null
+++ b/Lib/test/test_pep3151.py
@@ -0,0 +1,211 @@
+import builtins
+import os
+import select
+import socket
+import sys
+import unittest
+import errno
+from errno import EEXIST
+
+from test import support
+
+class SubOSError(OSError):
+ pass
+
+class SubOSErrorWithInit(OSError):
+ def __init__(self, message, bar):
+ self.bar = bar
+ super().__init__(message)
+
+class SubOSErrorWithNew(OSError):
+ def __new__(cls, message, baz):
+ self = super().__new__(cls, message)
+ self.baz = baz
+ return self
+
+class SubOSErrorCombinedInitFirst(SubOSErrorWithInit, SubOSErrorWithNew):
+ pass
+
+class SubOSErrorCombinedNewFirst(SubOSErrorWithNew, SubOSErrorWithInit):
+ pass
+
+class SubOSErrorWithStandaloneInit(OSError):
+ def __init__(self):
+ pass
+
+
+class HierarchyTest(unittest.TestCase):
+
+ def test_builtin_errors(self):
+ self.assertEqual(OSError.__name__, 'OSError')
+ self.assertIs(IOError, OSError)
+ self.assertIs(EnvironmentError, OSError)
+
+ def test_socket_errors(self):
+ self.assertIs(socket.error, IOError)
+ self.assertIs(socket.gaierror.__base__, OSError)
+ self.assertIs(socket.herror.__base__, OSError)
+ self.assertIs(socket.timeout.__base__, OSError)
+
+ def test_select_error(self):
+ self.assertIs(select.error, OSError)
+
+ # mmap.error is tested in test_mmap
+
+ _pep_map = """
+ +-- BlockingIOError EAGAIN, EALREADY, EWOULDBLOCK, EINPROGRESS
+ +-- ChildProcessError ECHILD
+ +-- ConnectionError
+ +-- BrokenPipeError EPIPE, ESHUTDOWN
+ +-- ConnectionAbortedError ECONNABORTED
+ +-- ConnectionRefusedError ECONNREFUSED
+ +-- ConnectionResetError ECONNRESET
+ +-- FileExistsError EEXIST
+ +-- FileNotFoundError ENOENT
+ +-- InterruptedError EINTR
+ +-- IsADirectoryError EISDIR
+ +-- NotADirectoryError ENOTDIR
+ +-- PermissionError EACCES, EPERM
+ +-- ProcessLookupError ESRCH
+ +-- TimeoutError ETIMEDOUT
+ """
+ def _make_map(s):
+ _map = {}
+ for line in s.splitlines():
+ line = line.strip('+- ')
+ if not line:
+ continue
+ excname, _, errnames = line.partition(' ')
+ for errname in filter(None, errnames.strip().split(', ')):
+ _map[getattr(errno, errname)] = getattr(builtins, excname)
+ return _map
+ _map = _make_map(_pep_map)
+
+ def test_errno_mapping(self):
+ # The OSError constructor maps errnos to subclasses
+ # A sample test for the basic functionality
+ e = OSError(EEXIST, "Bad file descriptor")
+ self.assertIs(type(e), FileExistsError)
+ # Exhaustive testing
+ for errcode, exc in self._map.items():
+ e = OSError(errcode, "Some message")
+ self.assertIs(type(e), exc)
+ othercodes = set(errno.errorcode) - set(self._map)
+ for errcode in othercodes:
+ e = OSError(errcode, "Some message")
+ self.assertIs(type(e), OSError)
+
+ def test_try_except(self):
+ filename = "some_hopefully_non_existing_file"
+
+ # This checks that try .. except checks the concrete exception
+ # (FileNotFoundError) and not the base type specified when
+ # PyErr_SetFromErrnoWithFilenameObject was called.
+ # (it is therefore deliberate that it doesn't use assertRaises)
+ try:
+ open(filename)
+ except FileNotFoundError:
+ pass
+ else:
+ self.fail("should have raised a FileNotFoundError")
+
+ # Another test for PyErr_SetExcFromWindowsErrWithFilenameObject()
+ self.assertFalse(os.path.exists(filename))
+ try:
+ os.unlink(filename)
+ except FileNotFoundError:
+ pass
+ else:
+ self.fail("should have raised a FileNotFoundError")
+
+
+class AttributesTest(unittest.TestCase):
+
+ def test_windows_error(self):
+ if os.name == "nt":
+ self.assertIn('winerror', dir(OSError))
+ else:
+ self.assertNotIn('winerror', dir(OSError))
+
+ def test_posix_error(self):
+ e = OSError(EEXIST, "File already exists", "foo.txt")
+ self.assertEqual(e.errno, EEXIST)
+ self.assertEqual(e.args[0], EEXIST)
+ self.assertEqual(e.strerror, "File already exists")
+ self.assertEqual(e.filename, "foo.txt")
+ if os.name == "nt":
+ self.assertEqual(e.winerror, None)
+
+ @unittest.skipUnless(os.name == "nt", "Windows-specific test")
+ def test_errno_translation(self):
+ # ERROR_ALREADY_EXISTS (183) -> EEXIST
+ e = OSError(0, "File already exists", "foo.txt", 183)
+ self.assertEqual(e.winerror, 183)
+ self.assertEqual(e.errno, EEXIST)
+ self.assertEqual(e.args[0], EEXIST)
+ self.assertEqual(e.strerror, "File already exists")
+ self.assertEqual(e.filename, "foo.txt")
+
+ def test_blockingioerror(self):
+ args = ("a", "b", "c", "d", "e")
+ for n in range(6):
+ e = BlockingIOError(*args[:n])
+ with self.assertRaises(AttributeError):
+ e.characters_written
+ e = BlockingIOError("a", "b", 3)
+ self.assertEqual(e.characters_written, 3)
+ e.characters_written = 5
+ self.assertEqual(e.characters_written, 5)
+
+ # XXX VMSError not tested
+
+
+class ExplicitSubclassingTest(unittest.TestCase):
+
+ def test_errno_mapping(self):
+ # When constructing an OSError subclass, errno mapping isn't done
+ e = SubOSError(EEXIST, "Bad file descriptor")
+ self.assertIs(type(e), SubOSError)
+
+ def test_init_overriden(self):
+ e = SubOSErrorWithInit("some message", "baz")
+ self.assertEqual(e.bar, "baz")
+ self.assertEqual(e.args, ("some message",))
+
+ def test_init_kwdargs(self):
+ e = SubOSErrorWithInit("some message", bar="baz")
+ self.assertEqual(e.bar, "baz")
+ self.assertEqual(e.args, ("some message",))
+
+ def test_new_overriden(self):
+ e = SubOSErrorWithNew("some message", "baz")
+ self.assertEqual(e.baz, "baz")
+ self.assertEqual(e.args, ("some message",))
+
+ def test_new_kwdargs(self):
+ e = SubOSErrorWithNew("some message", baz="baz")
+ self.assertEqual(e.baz, "baz")
+ self.assertEqual(e.args, ("some message",))
+
+ def test_init_new_overriden(self):
+ e = SubOSErrorCombinedInitFirst("some message", "baz")
+ self.assertEqual(e.bar, "baz")
+ self.assertEqual(e.baz, "baz")
+ self.assertEqual(e.args, ("some message",))
+ e = SubOSErrorCombinedNewFirst("some message", "baz")
+ self.assertEqual(e.bar, "baz")
+ self.assertEqual(e.baz, "baz")
+ self.assertEqual(e.args, ("some message",))
+
+ def test_init_standalone(self):
+ # __init__ doesn't propagate to OSError.__init__ (see issue #15229)
+ e = SubOSErrorWithStandaloneInit()
+ self.assertEqual(e.args, ())
+ self.assertEqual(str(e), '')
+
+
+def test_main():
+ support.run_unittest(__name__)
+
+if __name__=="__main__":
+ test_main()
diff --git a/Lib/test/test_pep380.py b/Lib/test/test_pep380.py
new file mode 100644
index 0000000..9569e10
--- /dev/null
+++ b/Lib/test/test_pep380.py
@@ -0,0 +1,965 @@
+# -*- coding: utf-8 -*-
+
+"""
+Test suite for PEP 380 implementation
+
+adapted from original tests written by Greg Ewing
+see <http://www.cosc.canterbury.ac.nz/greg.ewing/python/yield-from/YieldFrom-Python3.1.2-rev5.zip>
+"""
+
+import unittest
+import io
+import sys
+import inspect
+import parser
+
+from test.support import captured_stderr
+
+class TestPEP380Operation(unittest.TestCase):
+ """
+ Test semantics.
+ """
+
+ def test_delegation_of_initial_next_to_subgenerator(self):
+ """
+ Test delegation of initial next() call to subgenerator
+ """
+ trace = []
+ def g1():
+ trace.append("Starting g1")
+ yield from g2()
+ trace.append("Finishing g1")
+ def g2():
+ trace.append("Starting g2")
+ yield 42
+ trace.append("Finishing g2")
+ for x in g1():
+ trace.append("Yielded %s" % (x,))
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Starting g2",
+ "Yielded 42",
+ "Finishing g2",
+ "Finishing g1",
+ ])
+
+ def test_raising_exception_in_initial_next_call(self):
+ """
+ Test raising exception in initial next() call
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield from g2()
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ raise ValueError("spanish inquisition occurred")
+ finally:
+ trace.append("Finishing g2")
+ try:
+ for x in g1():
+ trace.append("Yielded %s" % (x,))
+ except ValueError as e:
+ self.assertEqual(e.args[0], "spanish inquisition occurred")
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Starting g2",
+ "Finishing g2",
+ "Finishing g1",
+ ])
+
+ def test_delegation_of_next_call_to_subgenerator(self):
+ """
+ Test delegation of next() call to subgenerator
+ """
+ trace = []
+ def g1():
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ trace.append("Finishing g1")
+ def g2():
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ trace.append("Finishing g2")
+ for x in g1():
+ trace.append("Yielded %s" % (x,))
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Yielded g2 more spam",
+ "Finishing g2",
+ "Yielded g1 eggs",
+ "Finishing g1",
+ ])
+
+ def test_raising_exception_in_delegated_next_call(self):
+ """
+ Test raising exception in delegated next() call
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ yield "g2 spam"
+ raise ValueError("hovercraft is full of eels")
+ yield "g2 more spam"
+ finally:
+ trace.append("Finishing g2")
+ try:
+ for x in g1():
+ trace.append("Yielded %s" % (x,))
+ except ValueError as e:
+ self.assertEqual(e.args[0], "hovercraft is full of eels")
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Finishing g2",
+ "Finishing g1",
+ ])
+
+ def test_delegation_of_send(self):
+ """
+ Test delegation of send()
+ """
+ trace = []
+ def g1():
+ trace.append("Starting g1")
+ x = yield "g1 ham"
+ trace.append("g1 received %s" % (x,))
+ yield from g2()
+ x = yield "g1 eggs"
+ trace.append("g1 received %s" % (x,))
+ trace.append("Finishing g1")
+ def g2():
+ trace.append("Starting g2")
+ x = yield "g2 spam"
+ trace.append("g2 received %s" % (x,))
+ x = yield "g2 more spam"
+ trace.append("g2 received %s" % (x,))
+ trace.append("Finishing g2")
+ g = g1()
+ y = next(g)
+ x = 1
+ try:
+ while 1:
+ y = g.send(x)
+ trace.append("Yielded %s" % (y,))
+ x += 1
+ except StopIteration:
+ pass
+ self.assertEqual(trace,[
+ "Starting g1",
+ "g1 received 1",
+ "Starting g2",
+ "Yielded g2 spam",
+ "g2 received 2",
+ "Yielded g2 more spam",
+ "g2 received 3",
+ "Finishing g2",
+ "Yielded g1 eggs",
+ "g1 received 4",
+ "Finishing g1",
+ ])
+
+ def test_handling_exception_while_delegating_send(self):
+ """
+ Test handling exception while delegating 'send'
+ """
+ trace = []
+ def g1():
+ trace.append("Starting g1")
+ x = yield "g1 ham"
+ trace.append("g1 received %s" % (x,))
+ yield from g2()
+ x = yield "g1 eggs"
+ trace.append("g1 received %s" % (x,))
+ trace.append("Finishing g1")
+ def g2():
+ trace.append("Starting g2")
+ x = yield "g2 spam"
+ trace.append("g2 received %s" % (x,))
+ raise ValueError("hovercraft is full of eels")
+ x = yield "g2 more spam"
+ trace.append("g2 received %s" % (x,))
+ trace.append("Finishing g2")
+ def run():
+ g = g1()
+ y = next(g)
+ x = 1
+ try:
+ while 1:
+ y = g.send(x)
+ trace.append("Yielded %s" % (y,))
+ x += 1
+ except StopIteration:
+ trace.append("StopIteration")
+ self.assertRaises(ValueError,run)
+ self.assertEqual(trace,[
+ "Starting g1",
+ "g1 received 1",
+ "Starting g2",
+ "Yielded g2 spam",
+ "g2 received 2",
+ ])
+
+ def test_delegating_close(self):
+ """
+ Test delegating 'close'
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ finally:
+ trace.append("Finishing g2")
+ g = g1()
+ for i in range(2):
+ x = next(g)
+ trace.append("Yielded %s" % (x,))
+ g.close()
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Finishing g2",
+ "Finishing g1"
+ ])
+
+ def test_handing_exception_while_delegating_close(self):
+ """
+ Test handling exception while delegating 'close'
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ finally:
+ trace.append("Finishing g2")
+ raise ValueError("nybbles have exploded with delight")
+ try:
+ g = g1()
+ for i in range(2):
+ x = next(g)
+ trace.append("Yielded %s" % (x,))
+ g.close()
+ except ValueError as e:
+ self.assertEqual(e.args[0], "nybbles have exploded with delight")
+ self.assertIsInstance(e.__context__, GeneratorExit)
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Finishing g2",
+ "Finishing g1",
+ ])
+
+ def test_delegating_throw(self):
+ """
+ Test delegating 'throw'
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ finally:
+ trace.append("Finishing g2")
+ try:
+ g = g1()
+ for i in range(2):
+ x = next(g)
+ trace.append("Yielded %s" % (x,))
+ e = ValueError("tomato ejected")
+ g.throw(e)
+ except ValueError as e:
+ self.assertEqual(e.args[0], "tomato ejected")
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Finishing g2",
+ "Finishing g1",
+ ])
+
+ def test_value_attribute_of_StopIteration_exception(self):
+ """
+ Test 'value' attribute of StopIteration exception
+ """
+ trace = []
+ def pex(e):
+ trace.append("%s: %s" % (e.__class__.__name__, e))
+ trace.append("value = %s" % (e.value,))
+ e = StopIteration()
+ pex(e)
+ e = StopIteration("spam")
+ pex(e)
+ e.value = "eggs"
+ pex(e)
+ self.assertEqual(trace,[
+ "StopIteration: ",
+ "value = None",
+ "StopIteration: spam",
+ "value = spam",
+ "StopIteration: spam",
+ "value = eggs",
+ ])
+
+
+ def test_exception_value_crash(self):
+ # There used to be a refcount error when the return value
+ # stored in the StopIteration has a refcount of 1.
+ def g1():
+ yield from g2()
+ def g2():
+ yield "g2"
+ return [42]
+ self.assertEqual(list(g1()), ["g2"])
+
+
+ def test_generator_return_value(self):
+ """
+ Test generator return value
+ """
+ trace = []
+ def g1():
+ trace.append("Starting g1")
+ yield "g1 ham"
+ ret = yield from g2()
+ trace.append("g2 returned %s" % (ret,))
+ ret = yield from g2(42)
+ trace.append("g2 returned %s" % (ret,))
+ yield "g1 eggs"
+ trace.append("Finishing g1")
+ def g2(v = None):
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ trace.append("Finishing g2")
+ if v:
+ return v
+ for x in g1():
+ trace.append("Yielded %s" % (x,))
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Yielded g2 more spam",
+ "Finishing g2",
+ "g2 returned None",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Yielded g2 more spam",
+ "Finishing g2",
+ "g2 returned 42",
+ "Yielded g1 eggs",
+ "Finishing g1",
+ ])
+
+ def test_delegation_of_next_to_non_generator(self):
+ """
+ Test delegation of next() to non-generator
+ """
+ trace = []
+ def g():
+ yield from range(3)
+ for x in g():
+ trace.append("Yielded %s" % (x,))
+ self.assertEqual(trace,[
+ "Yielded 0",
+ "Yielded 1",
+ "Yielded 2",
+ ])
+
+
+ def test_conversion_of_sendNone_to_next(self):
+ """
+ Test conversion of send(None) to next()
+ """
+ trace = []
+ def g():
+ yield from range(3)
+ gi = g()
+ for x in range(3):
+ y = gi.send(None)
+ trace.append("Yielded: %s" % (y,))
+ self.assertEqual(trace,[
+ "Yielded: 0",
+ "Yielded: 1",
+ "Yielded: 2",
+ ])
+
+ def test_delegation_of_close_to_non_generator(self):
+ """
+ Test delegation of close() to non-generator
+ """
+ trace = []
+ def g():
+ try:
+ trace.append("starting g")
+ yield from range(3)
+ trace.append("g should not be here")
+ finally:
+ trace.append("finishing g")
+ gi = g()
+ next(gi)
+ with captured_stderr() as output:
+ gi.close()
+ self.assertEqual(output.getvalue(), '')
+ self.assertEqual(trace,[
+ "starting g",
+ "finishing g",
+ ])
+
+ def test_delegating_throw_to_non_generator(self):
+ """
+ Test delegating 'throw' to non-generator
+ """
+ trace = []
+ def g():
+ try:
+ trace.append("Starting g")
+ yield from range(10)
+ finally:
+ trace.append("Finishing g")
+ try:
+ gi = g()
+ for i in range(5):
+ x = next(gi)
+ trace.append("Yielded %s" % (x,))
+ e = ValueError("tomato ejected")
+ gi.throw(e)
+ except ValueError as e:
+ self.assertEqual(e.args[0],"tomato ejected")
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Starting g",
+ "Yielded 0",
+ "Yielded 1",
+ "Yielded 2",
+ "Yielded 3",
+ "Yielded 4",
+ "Finishing g",
+ ])
+
+ def test_attempting_to_send_to_non_generator(self):
+ """
+ Test attempting to send to non-generator
+ """
+ trace = []
+ def g():
+ try:
+ trace.append("starting g")
+ yield from range(3)
+ trace.append("g should not be here")
+ finally:
+ trace.append("finishing g")
+ try:
+ gi = g()
+ next(gi)
+ for x in range(3):
+ y = gi.send(42)
+ trace.append("Should not have yielded:", y)
+ except AttributeError as e:
+ self.assertIn("send", e.args[0])
+ else:
+ self.fail("was able to send into non-generator")
+ self.assertEqual(trace,[
+ "starting g",
+ "finishing g",
+ ])
+
+ def test_broken_getattr_handling(self):
+ """
+ Test subiterator with a broken getattr implementation
+ """
+ class Broken:
+ def __iter__(self):
+ return self
+ def __next__(self):
+ return 1
+ def __getattr__(self, attr):
+ 1/0
+
+ def g():
+ yield from Broken()
+
+ with self.assertRaises(ZeroDivisionError):
+ gi = g()
+ self.assertEqual(next(gi), 1)
+ gi.send(1)
+
+ with self.assertRaises(ZeroDivisionError):
+ gi = g()
+ self.assertEqual(next(gi), 1)
+ gi.throw(AttributeError)
+
+ with captured_stderr() as output:
+ gi = g()
+ self.assertEqual(next(gi), 1)
+ gi.close()
+ self.assertIn('ZeroDivisionError', output.getvalue())
+
+ def test_exception_in_initial_next_call(self):
+ """
+ Test exception in initial next() call
+ """
+ trace = []
+ def g1():
+ trace.append("g1 about to yield from g2")
+ yield from g2()
+ trace.append("g1 should not be here")
+ def g2():
+ yield 1/0
+ def run():
+ gi = g1()
+ next(gi)
+ self.assertRaises(ZeroDivisionError,run)
+ self.assertEqual(trace,[
+ "g1 about to yield from g2"
+ ])
+
+ def test_attempted_yield_from_loop(self):
+ """
+ Test attempted yield-from loop
+ """
+ trace = []
+ def g1():
+ trace.append("g1: starting")
+ yield "y1"
+ trace.append("g1: about to yield from g2")
+ yield from g2()
+ trace.append("g1 should not be here")
+
+ def g2():
+ trace.append("g2: starting")
+ yield "y2"
+ trace.append("g2: about to yield from g1")
+ yield from gi
+ trace.append("g2 should not be here")
+ try:
+ gi = g1()
+ for y in gi:
+ trace.append("Yielded: %s" % (y,))
+ except ValueError as e:
+ self.assertEqual(e.args[0],"generator already executing")
+ else:
+ self.fail("subgenerator didn't raise ValueError")
+ self.assertEqual(trace,[
+ "g1: starting",
+ "Yielded: y1",
+ "g1: about to yield from g2",
+ "g2: starting",
+ "Yielded: y2",
+ "g2: about to yield from g1",
+ ])
+
+ def test_returning_value_from_delegated_throw(self):
+ """
+ Test returning value from delegated 'throw'
+ """
+ trace = []
+ def g1():
+ try:
+ trace.append("Starting g1")
+ yield "g1 ham"
+ yield from g2()
+ yield "g1 eggs"
+ finally:
+ trace.append("Finishing g1")
+ def g2():
+ try:
+ trace.append("Starting g2")
+ yield "g2 spam"
+ yield "g2 more spam"
+ except LunchError:
+ trace.append("Caught LunchError in g2")
+ yield "g2 lunch saved"
+ yield "g2 yet more spam"
+ class LunchError(Exception):
+ pass
+ g = g1()
+ for i in range(2):
+ x = next(g)
+ trace.append("Yielded %s" % (x,))
+ e = LunchError("tomato ejected")
+ g.throw(e)
+ for x in g:
+ trace.append("Yielded %s" % (x,))
+ self.assertEqual(trace,[
+ "Starting g1",
+ "Yielded g1 ham",
+ "Starting g2",
+ "Yielded g2 spam",
+ "Caught LunchError in g2",
+ "Yielded g2 yet more spam",
+ "Yielded g1 eggs",
+ "Finishing g1",
+ ])
+
+ def test_next_and_return_with_value(self):
+ """
+ Test next and return with value
+ """
+ trace = []
+ def f(r):
+ gi = g(r)
+ next(gi)
+ try:
+ trace.append("f resuming g")
+ next(gi)
+ trace.append("f SHOULD NOT BE HERE")
+ except StopIteration as e:
+ trace.append("f caught %s" % (repr(e),))
+ def g(r):
+ trace.append("g starting")
+ yield
+ trace.append("g returning %s" % (r,))
+ return r
+ f(None)
+ f(42)
+ self.assertEqual(trace,[
+ "g starting",
+ "f resuming g",
+ "g returning None",
+ "f caught StopIteration()",
+ "g starting",
+ "f resuming g",
+ "g returning 42",
+ "f caught StopIteration(42,)",
+ ])
+
+ def test_send_and_return_with_value(self):
+ """
+ Test send and return with value
+ """
+ trace = []
+ def f(r):
+ gi = g(r)
+ next(gi)
+ try:
+ trace.append("f sending spam to g")
+ gi.send("spam")
+ trace.append("f SHOULD NOT BE HERE")
+ except StopIteration as e:
+ trace.append("f caught %r" % (e,))
+ def g(r):
+ trace.append("g starting")
+ x = yield
+ trace.append("g received %s" % (x,))
+ trace.append("g returning %s" % (r,))
+ return r
+ f(None)
+ f(42)
+ self.assertEqual(trace,[
+ "g starting",
+ "f sending spam to g",
+ "g received spam",
+ "g returning None",
+ "f caught StopIteration()",
+ "g starting",
+ "f sending spam to g",
+ "g received spam",
+ "g returning 42",
+ "f caught StopIteration(42,)",
+ ])
+
+ def test_catching_exception_from_subgen_and_returning(self):
+ """
+ Test catching an exception thrown into a
+ subgenerator and returning a value
+ """
+ trace = []
+ def inner():
+ try:
+ yield 1
+ except ValueError:
+ trace.append("inner caught ValueError")
+ return 2
+
+ def outer():
+ v = yield from inner()
+ trace.append("inner returned %r to outer" % v)
+ yield v
+ g = outer()
+ trace.append(next(g))
+ trace.append(g.throw(ValueError))
+ self.assertEqual(trace,[
+ 1,
+ "inner caught ValueError",
+ "inner returned 2 to outer",
+ 2,
+ ])
+
+ def test_throwing_GeneratorExit_into_subgen_that_returns(self):
+ """
+ Test throwing GeneratorExit into a subgenerator that
+ catches it and returns normally.
+ """
+ trace = []
+ def f():
+ try:
+ trace.append("Enter f")
+ yield
+ trace.append("Exit f")
+ except GeneratorExit:
+ return
+ def g():
+ trace.append("Enter g")
+ yield from f()
+ trace.append("Exit g")
+ try:
+ gi = g()
+ next(gi)
+ gi.throw(GeneratorExit)
+ except GeneratorExit:
+ pass
+ else:
+ self.fail("subgenerator failed to raise GeneratorExit")
+ self.assertEqual(trace,[
+ "Enter g",
+ "Enter f",
+ ])
+
+ def test_throwing_GeneratorExit_into_subgenerator_that_yields(self):
+ """
+ Test throwing GeneratorExit into a subgenerator that
+ catches it and yields.
+ """
+ trace = []
+ def f():
+ try:
+ trace.append("Enter f")
+ yield
+ trace.append("Exit f")
+ except GeneratorExit:
+ yield
+ def g():
+ trace.append("Enter g")
+ yield from f()
+ trace.append("Exit g")
+ try:
+ gi = g()
+ next(gi)
+ gi.throw(GeneratorExit)
+ except RuntimeError as e:
+ self.assertEqual(e.args[0], "generator ignored GeneratorExit")
+ else:
+ self.fail("subgenerator failed to raise GeneratorExit")
+ self.assertEqual(trace,[
+ "Enter g",
+ "Enter f",
+ ])
+
+ def test_throwing_GeneratorExit_into_subgen_that_raises(self):
+ """
+ Test throwing GeneratorExit into a subgenerator that
+ catches it and raises a different exception.
+ """
+ trace = []
+ def f():
+ try:
+ trace.append("Enter f")
+ yield
+ trace.append("Exit f")
+ except GeneratorExit:
+ raise ValueError("Vorpal bunny encountered")
+ def g():
+ trace.append("Enter g")
+ yield from f()
+ trace.append("Exit g")
+ try:
+ gi = g()
+ next(gi)
+ gi.throw(GeneratorExit)
+ except ValueError as e:
+ self.assertEqual(e.args[0], "Vorpal bunny encountered")
+ self.assertIsInstance(e.__context__, GeneratorExit)
+ else:
+ self.fail("subgenerator failed to raise ValueError")
+ self.assertEqual(trace,[
+ "Enter g",
+ "Enter f",
+ ])
+
+ def test_yield_from_empty(self):
+ def g():
+ yield from ()
+ self.assertRaises(StopIteration, next, g())
+
+ def test_delegating_generators_claim_to_be_running(self):
+ # Check with basic iteration
+ def one():
+ yield 0
+ yield from two()
+ yield 3
+ def two():
+ yield 1
+ try:
+ yield from g1
+ except ValueError:
+ pass
+ yield 2
+ g1 = one()
+ self.assertEqual(list(g1), [0, 1, 2, 3])
+ # Check with send
+ g1 = one()
+ res = [next(g1)]
+ try:
+ while True:
+ res.append(g1.send(42))
+ except StopIteration:
+ pass
+ self.assertEqual(res, [0, 1, 2, 3])
+ # Check with throw
+ class MyErr(Exception):
+ pass
+ def one():
+ try:
+ yield 0
+ except MyErr:
+ pass
+ yield from two()
+ try:
+ yield 3
+ except MyErr:
+ pass
+ def two():
+ try:
+ yield 1
+ except MyErr:
+ pass
+ try:
+ yield from g1
+ except ValueError:
+ pass
+ try:
+ yield 2
+ except MyErr:
+ pass
+ g1 = one()
+ res = [next(g1)]
+ try:
+ while True:
+ res.append(g1.throw(MyErr))
+ except StopIteration:
+ pass
+ # Check with close
+ class MyIt(object):
+ def __iter__(self):
+ return self
+ def __next__(self):
+ return 42
+ def close(self_):
+ self.assertTrue(g1.gi_running)
+ self.assertRaises(ValueError, next, g1)
+ def one():
+ yield from MyIt()
+ g1 = one()
+ next(g1)
+ g1.close()
+
+ def test_delegator_is_visible_to_debugger(self):
+ def call_stack():
+ return [f[3] for f in inspect.stack()]
+
+ def gen():
+ yield call_stack()
+ yield call_stack()
+ yield call_stack()
+
+ def spam(g):
+ yield from g
+
+ def eggs(g):
+ yield from g
+
+ for stack in spam(gen()):
+ self.assertTrue('spam' in stack)
+
+ for stack in spam(eggs(gen())):
+ self.assertTrue('spam' in stack and 'eggs' in stack)
+
+ def test_custom_iterator_return(self):
+ # See issue #15568
+ class MyIter:
+ def __iter__(self):
+ return self
+ def __next__(self):
+ raise StopIteration(42)
+ def gen():
+ nonlocal ret
+ ret = yield from MyIter()
+ ret = None
+ list(gen())
+ self.assertEqual(ret, 42)
+
+
+def test_main():
+ from test import support
+ test_classes = [TestPEP380Operation]
+ support.run_unittest(*test_classes)
+
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
index 9da2cae..f52d4bd 100644
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -1,5 +1,6 @@
import pickle
import io
+import collections
from test import support
@@ -7,6 +8,7 @@ from test.pickletester import AbstractPickleTests
from test.pickletester import AbstractPickleModuleTests
from test.pickletester import AbstractPersistentPicklerTests
from test.pickletester import AbstractPicklerUnpicklerObjectTests
+from test.pickletester import AbstractDispatchTableTests
from test.pickletester import BigmemPickleTests
try:
@@ -80,6 +82,18 @@ class PyPicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
unpickler_class = pickle._Unpickler
+class PyDispatchTableTests(AbstractDispatchTableTests):
+ pickler_class = pickle._Pickler
+ def get_dispatch_table(self):
+ return pickle.dispatch_table.copy()
+
+
+class PyChainDispatchTableTests(AbstractDispatchTableTests):
+ pickler_class = pickle._Pickler
+ def get_dispatch_table(self):
+ return collections.ChainMap({}, pickle.dispatch_table)
+
+
if has_c_implementation:
class CPicklerTests(PyPicklerTests):
pickler = _pickle.Pickler
@@ -101,14 +115,26 @@ if has_c_implementation:
pickler_class = _pickle.Pickler
unpickler_class = _pickle.Unpickler
+ class CDispatchTableTests(AbstractDispatchTableTests):
+ pickler_class = pickle.Pickler
+ def get_dispatch_table(self):
+ return pickle.dispatch_table.copy()
+
+ class CChainDispatchTableTests(AbstractDispatchTableTests):
+ pickler_class = pickle.Pickler
+ def get_dispatch_table(self):
+ return collections.ChainMap({}, pickle.dispatch_table)
+
def test_main():
- tests = [PickleTests, PyPicklerTests, PyPersPicklerTests]
+ tests = [PickleTests, PyPicklerTests, PyPersPicklerTests,
+ PyDispatchTableTests, PyChainDispatchTableTests]
if has_c_implementation:
tests.extend([CPicklerTests, CPersPicklerTests,
CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
PyPicklerUnpicklerObjectTests,
CPicklerUnpicklerObjectTests,
+ CDispatchTableTests, CChainDispatchTableTests,
InMemoryPickleTests])
support.run_unittest(*tests)
support.run_doctest(pickle)
diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py
index d5b886f..6a7b45f 100644
--- a/Lib/test/test_pipes.py
+++ b/Lib/test/test_pipes.py
@@ -79,21 +79,6 @@ class SimplePipeTests(unittest.TestCase):
with open(TESTFN) as f:
self.assertEqual(f.read(), d)
- def testQuoting(self):
- safeunquoted = string.ascii_letters + string.digits + '@%_-+=:,./'
- unicode_sample = '\xe9\xe0\xdf' # e + acute accent, a + grave, sharp s
- unsafe = '"`$\\!' + unicode_sample
-
- self.assertEqual(pipes.quote(''), "''")
- self.assertEqual(pipes.quote(safeunquoted), safeunquoted)
- self.assertEqual(pipes.quote('test file name'), "'test file name'")
- for u in unsafe:
- self.assertEqual(pipes.quote('test%sname' % u),
- "'test%sname'" % u)
- for u in unsafe:
- self.assertEqual(pipes.quote("test%s'name'" % u),
- "'test%s'\"'\"'name'\"'\"''" % u)
-
def testRepr(self):
t = pipes.Template()
self.assertEqual(repr(t), "<Template instance, steps=[]>")
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index a4ddb15..355efe7 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -23,6 +23,8 @@ def cleanout(root):
def fixdir(lst):
if "__builtins__" in lst:
lst.remove("__builtins__")
+ if "__initializing__" in lst:
+ lst.remove("__initializing__")
return lst
@@ -196,14 +198,15 @@ class TestPkg(unittest.TestCase):
import t5
self.assertEqual(fixdir(dir(t5)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', '__path__', 'foo', 'string', 't5'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', '__path__', 'foo',
+ 'string', 't5'])
self.assertEqual(fixdir(dir(t5.foo)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', 'string'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', 'string'])
self.assertEqual(fixdir(dir(t5.string)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', 'spam'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', 'spam'])
def test_6(self):
hier = [
@@ -219,14 +222,14 @@ class TestPkg(unittest.TestCase):
import t6
self.assertEqual(fixdir(dir(t6)),
['__all__', '__cached__', '__doc__', '__file__',
- '__name__', '__package__', '__path__'])
+ '__loader__', '__name__', '__package__', '__path__'])
s = """
import t6
from t6 import *
self.assertEqual(fixdir(dir(t6)),
['__all__', '__cached__', '__doc__', '__file__',
- '__name__', '__package__', '__path__',
- 'eggs', 'ham', 'spam'])
+ '__loader__', '__name__', '__package__',
+ '__path__', 'eggs', 'ham', 'spam'])
self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
"""
self.run_code(s)
@@ -252,19 +255,19 @@ class TestPkg(unittest.TestCase):
t7, sub, subsub = None, None, None
import t7 as tas
self.assertEqual(fixdir(dir(tas)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', '__path__'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', '__path__'])
self.assertFalse(t7)
from t7 import sub as subpar
self.assertEqual(fixdir(dir(subpar)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', '__path__'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', '__path__'])
self.assertFalse(t7)
self.assertFalse(sub)
from t7.sub import subsub as subsubsub
self.assertEqual(fixdir(dir(subsubsub)),
- ['__cached__', '__doc__', '__file__', '__name__',
- '__package__', '__path__', 'spam'])
+ ['__cached__', '__doc__', '__file__', '__loader__',
+ '__name__', '__package__', '__path__', 'spam'])
self.assertFalse(t7)
self.assertFalse(sub)
self.assertFalse(subsub)
diff --git a/Lib/test/test_pkgimport.py b/Lib/test/test_pkgimport.py
index c37e936..a8426b5 100644
--- a/Lib/test/test_pkgimport.py
+++ b/Lib/test/test_pkgimport.py
@@ -7,7 +7,7 @@ import tempfile
import unittest
from imp import cache_from_source
-from test.support import run_unittest
+from test.support import run_unittest, create_empty_file
class TestImport(unittest.TestCase):
@@ -29,7 +29,7 @@ class TestImport(unittest.TestCase):
self.package_dir = os.path.join(self.test_dir,
self.package_name)
os.mkdir(self.package_dir)
- open(os.path.join(self.package_dir, '__init__.py'), 'w').close()
+ create_empty_file(os.path.join(self.package_dir, '__init__.py'))
self.module_path = os.path.join(self.package_dir, 'foo.py')
def tearDown(self):
diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py
index 3b72f06..88e2d33 100644
--- a/Lib/test/test_pkgutil.py
+++ b/Lib/test/test_pkgutil.py
@@ -1,4 +1,4 @@
-from test.support import run_unittest, unload
+from test.support import run_unittest, unload, check_warnings
import unittest
import sys
import imp
@@ -9,7 +9,11 @@ import tempfile
import shutil
import zipfile
-
+# Note: pkgutil.walk_packages is currently tested in test_runpy. This is
+# a hack to get a major issue resolved for 3.3b2. Longer term, it should
+# be moved back here, perhaps by factoring out the helper code for
+# creating interesting package layouts to a separate module.
+# Issue #15348 declares this is indeed a dodgy hack ;)
class PkgutilTests(unittest.TestCase):
@@ -138,10 +142,11 @@ class PkgutilPEP302Tests(unittest.TestCase):
del sys.modules['foo']
+# These tests, especially the setup and cleanup, are hideous. They
+# need to be cleaned up once issue 14715 is addressed.
class ExtendPathTests(unittest.TestCase):
def create_init(self, pkgname):
dirname = tempfile.mkdtemp()
- self.addCleanup(shutil.rmtree, dirname)
sys.path.insert(0, dirname)
pkgdir = os.path.join(dirname, pkgname)
@@ -156,22 +161,40 @@ class ExtendPathTests(unittest.TestCase):
with open(module_name, 'w') as fl:
print('value={}'.format(value), file=fl)
- def setUp(self):
- # Create 2 directories on sys.path
- self.pkgname = 'foo'
- self.dirname_0 = self.create_init(self.pkgname)
- self.dirname_1 = self.create_init(self.pkgname)
+ def test_simple(self):
+ pkgname = 'foo'
+ dirname_0 = self.create_init(pkgname)
+ dirname_1 = self.create_init(pkgname)
+ self.create_submodule(dirname_0, pkgname, 'bar', 0)
+ self.create_submodule(dirname_1, pkgname, 'baz', 1)
+ import foo.bar
+ import foo.baz
+ # Ensure we read the expected values
+ self.assertEqual(foo.bar.value, 0)
+ self.assertEqual(foo.baz.value, 1)
- def tearDown(self):
+ # Ensure the path is set up correctly
+ self.assertEqual(sorted(foo.__path__),
+ sorted([os.path.join(dirname_0, pkgname),
+ os.path.join(dirname_1, pkgname)]))
+
+ # Cleanup
+ shutil.rmtree(dirname_0)
+ shutil.rmtree(dirname_1)
del sys.path[0]
del sys.path[0]
del sys.modules['foo']
del sys.modules['foo.bar']
del sys.modules['foo.baz']
- def test_simple(self):
- self.create_submodule(self.dirname_0, self.pkgname, 'bar', 0)
- self.create_submodule(self.dirname_1, self.pkgname, 'baz', 1)
+ def test_mixed_namespace(self):
+ pkgname = 'foo'
+ dirname_0 = self.create_init(pkgname)
+ dirname_1 = self.create_init(pkgname)
+ self.create_submodule(dirname_0, pkgname, 'bar', 0)
+ # Turn this into a PEP 420 namespace package
+ os.unlink(os.path.join(dirname_0, pkgname, '__init__.py'))
+ self.create_submodule(dirname_1, pkgname, 'baz', 1)
import foo.bar
import foo.baz
# Ensure we read the expected values
@@ -180,8 +203,17 @@ class ExtendPathTests(unittest.TestCase):
# Ensure the path is set up correctly
self.assertEqual(sorted(foo.__path__),
- sorted([os.path.join(self.dirname_0, self.pkgname),
- os.path.join(self.dirname_1, self.pkgname)]))
+ sorted([os.path.join(dirname_0, pkgname),
+ os.path.join(dirname_1, pkgname)]))
+
+ # Cleanup
+ shutil.rmtree(dirname_0)
+ shutil.rmtree(dirname_1)
+ del sys.path[0]
+ del sys.path[0]
+ del sys.modules['foo']
+ del sys.modules['foo.bar']
+ del sys.modules['foo.baz']
# XXX: test .pkg files
@@ -227,12 +259,52 @@ class NestedNamespacePackageTest(unittest.TestCase):
self.assertEqual(d, 2)
+class ImportlibMigrationTests(unittest.TestCase):
+ # With full PEP 302 support in the standard import machinery, the
+ # PEP 302 emulation in this module is in the process of being
+ # deprecated in favour of importlib proper
+
+ def check_deprecated(self):
+ return check_warnings(
+ ("This emulation is deprecated, use 'importlib' instead",
+ DeprecationWarning))
+
+ def test_importer_deprecated(self):
+ with self.check_deprecated():
+ x = pkgutil.ImpImporter("")
+
+ def test_loader_deprecated(self):
+ with self.check_deprecated():
+ x = pkgutil.ImpLoader("", "", "", "")
+
+ def test_get_loader_avoids_emulation(self):
+ with check_warnings() as w:
+ self.assertIsNotNone(pkgutil.get_loader("sys"))
+ self.assertIsNotNone(pkgutil.get_loader("os"))
+ self.assertIsNotNone(pkgutil.get_loader("test.support"))
+ self.assertEqual(len(w.warnings), 0)
+
+ def test_get_importer_avoids_emulation(self):
+ # We use an illegal path so *none* of the path hooks should fire
+ with check_warnings() as w:
+ self.assertIsNone(pkgutil.get_importer("*??"))
+ self.assertEqual(len(w.warnings), 0)
+
+ def test_iter_importers_avoids_emulation(self):
+ with check_warnings() as w:
+ for importer in pkgutil.iter_importers(): pass
+ self.assertEqual(len(w.warnings), 0)
+
+
def test_main():
run_unittest(PkgutilTests, PkgutilPEP302Tests, ExtendPathTests,
- NestedNamespacePackageTest)
+ NestedNamespacePackageTest, ImportlibMigrationTests)
# this is necessary if test is run repeated (like when finding leaks)
import zipimport
+ import importlib
zipimport._zip_directory_cache.clear()
+ importlib.invalidate_caches()
+
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index 8751aa8..6abf443 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -1,8 +1,9 @@
-import sys
import os
-import unittest
import platform
import subprocess
+import sys
+import unittest
+import warnings
from test import support
@@ -56,13 +57,11 @@ class PlatformTest(unittest.TestCase):
def setUp(self):
self.save_version = sys.version
- self.save_subversion = sys.subversion
self.save_mercurial = sys._mercurial
self.save_platform = sys.platform
def tearDown(self):
sys.version = self.save_version
- sys.subversion = self.save_subversion
sys._mercurial = self.save_mercurial
sys.platform = self.save_platform
@@ -77,7 +76,7 @@ class PlatformTest(unittest.TestCase):
('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')),
):
# branch and revision are not "parsed", but fetched
- # from sys.subversion. Ignore them
+ # from sys._mercurial. Ignore them
(name, version, branch, revision, buildno, builddate, compiler) \
= platform._sys_version(input)
self.assertEqual(
@@ -113,8 +112,6 @@ class PlatformTest(unittest.TestCase):
if subversion is None:
if hasattr(sys, "_mercurial"):
del sys._mercurial
- if hasattr(sys, "subversion"):
- del sys.subversion
else:
sys._mercurial = subversion
if sys_platform is not None:
@@ -136,6 +133,12 @@ class PlatformTest(unittest.TestCase):
def test_uname(self):
res = platform.uname()
self.assertTrue(any(res))
+ self.assertEqual(res[0], res.system)
+ self.assertEqual(res[1], res.node)
+ self.assertEqual(res[2], res.release)
+ self.assertEqual(res[3], res.version)
+ self.assertEqual(res[4], res.machine)
+ self.assertEqual(res[5], res.processor)
@unittest.skipUnless(sys.platform.startswith('win'), "windows only test")
def test_uname_win32_ARCHITEW6432(self):
@@ -169,7 +172,7 @@ class PlatformTest(unittest.TestCase):
def test_mac_ver(self):
res = platform.mac_ver()
- if platform.uname()[0] == 'Darwin':
+ if platform.uname().system == 'Darwin':
# We're on a MacOSX system, check that
# the right version information is returned
fd = os.popen('sw_vers', 'r')
@@ -247,6 +250,38 @@ class PlatformTest(unittest.TestCase):
):
self.assertEqual(platform._parse_release_file(input), output)
+ def test_popen(self):
+ mswindows = (sys.platform == "win32")
+
+ if mswindows:
+ command = '"{}" -c "print(\'Hello\')"'.format(sys.executable)
+ else:
+ command = "'{}' -c 'print(\"Hello\")'".format(sys.executable)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ with platform.popen(command) as stdout:
+ hello = stdout.read().strip()
+ stdout.close()
+ self.assertEqual(hello, "Hello")
+
+ data = 'plop'
+ if mswindows:
+ command = '"{}" -c "import sys; data=sys.stdin.read(); exit(len(data))"'
+ else:
+ command = "'{}' -c 'import sys; data=sys.stdin.read(); exit(len(data))'"
+ command = command.format(sys.executable)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ with platform.popen(command, 'w') as stdin:
+ stdout = stdin.write(data)
+ ret = stdin.close()
+ self.assertIsNotNone(ret)
+ if os.name == 'nt':
+ returncode = ret
+ else:
+ returncode = ret >> 8
+ self.assertEqual(returncode, len(data))
+
def test_main():
support.run_unittest(
diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
index 5f980d0..a9e343e 100644
--- a/Lib/test/test_plistlib.py
+++ b/Lib/test/test_plistlib.py
@@ -55,6 +55,10 @@ TESTDATA = b"""<?xml version="1.0" encoding="UTF-8"?>
</array>
<key>aString</key>
<string>Doodah</string>
+ <key>anEmptyDict</key>
+ <dict/>
+ <key>anEmptyList</key>
+ <array/>
<key>anInt</key>
<integer>728</integer>
<key>nestedData</key>
@@ -112,6 +116,8 @@ class TestPlistlib(unittest.TestCase):
someMoreData = plistlib.Data(b"<lots of binary gunk>\0\1\2\3" * 10),
nestedData = [plistlib.Data(b"<lots of binary gunk>\0\1\2\3" * 10)],
aDate = datetime.datetime(2004, 10, 26, 10, 33, 33),
+ anEmptyDict = dict(),
+ anEmptyList = list()
)
pl['\xc5benraa'] = "That was a unicode key."
return pl
diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
index e3901b8..c0929a0 100644
--- a/Lib/test/test_poplib.py
+++ b/Lib/test/test_poplib.py
@@ -108,6 +108,10 @@ class DummyPOP3Handler(asynchat.async_chat):
def cmd_apop(self, arg):
self.push('+OK done nothing.')
+ def cmd_quit(self, arg):
+ self.push('+OK closing.')
+ self.close_when_done()
+
class DummyPOP3Server(asyncore.dispatcher, threading.Thread):
@@ -165,10 +169,10 @@ class TestPOP3Class(TestCase):
def setUp(self):
self.server = DummyPOP3Server((HOST, PORT))
self.server.start()
- self.client = poplib.POP3(self.server.host, self.server.port)
+ self.client = poplib.POP3(self.server.host, self.server.port, timeout=3)
def tearDown(self):
- self.client.quit()
+ self.client.close()
self.server.stop()
def test_getwelcome(self):
@@ -228,6 +232,12 @@ class TestPOP3Class(TestCase):
self.client.uidl()
self.client.uidl('foo')
+ def test_quit(self):
+ resp = self.client.quit()
+ self.assertTrue(resp)
+ self.assertIsNone(self.client.sock)
+ self.assertIsNone(self.client.file)
+
SUPPORTS_SSL = False
if hasattr(poplib, 'POP3_SSL'):
@@ -274,6 +284,7 @@ if hasattr(poplib, 'POP3_SSL'):
else:
DummyPOP3Handler.handle_read(self)
+
class TestPOP3_SSLClass(TestPOP3Class):
# repeat previous tests by using poplib.POP3_SSL
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index b936dda..f59607b 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -9,6 +9,7 @@ import errno
import sys
import time
import os
+import fcntl
import platform
import pwd
import shutil
@@ -43,7 +44,7 @@ class PosixTester(unittest.TestCase):
NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
"times", "getloadavg",
"getegid", "geteuid", "getgid", "getgroups",
- "getpid", "getpgrp", "getppid", "getuid",
+ "getpid", "getpgrp", "getppid", "getuid", "sync",
]
for name in NO_ARG_FUNCTIONS:
@@ -128,6 +129,7 @@ class PosixTester(unittest.TestCase):
fp = open(support.TESTFN)
try:
self.assertTrue(posix.fstatvfs(fp.fileno()))
+ self.assertTrue(posix.statvfs(fp.fileno()))
finally:
fp.close()
@@ -142,6 +144,151 @@ class PosixTester(unittest.TestCase):
finally:
fp.close()
+ @unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
+ def test_truncate(self):
+ with open(support.TESTFN, 'w') as fp:
+ fp.write('test')
+ fp.flush()
+ posix.truncate(support.TESTFN, 0)
+
+ @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter")
+ @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
+ @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
+ def test_fexecve(self):
+ fp = os.open(sys.executable, os.O_RDONLY)
+ try:
+ pid = os.fork()
+ if pid == 0:
+ os.chdir(os.path.split(sys.executable)[0])
+ posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
+ else:
+ self.assertEqual(os.waitpid(pid, 0), (pid, 0))
+ finally:
+ os.close(fp)
+
+ @unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
+ @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
+ def test_waitid(self):
+ pid = os.fork()
+ if pid == 0:
+ os.chdir(os.path.split(sys.executable)[0])
+ posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
+ else:
+ res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
+ self.assertEqual(pid, res.si_pid)
+
+ @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
+ def test_lockf(self):
+ fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
+ try:
+ os.write(fd, b'test')
+ os.lseek(fd, 0, os.SEEK_SET)
+ posix.lockf(fd, posix.F_LOCK, 4)
+ # section is locked
+ posix.lockf(fd, posix.F_ULOCK, 4)
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
+ def test_pread(self):
+ fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
+ try:
+ os.write(fd, b'test')
+ os.lseek(fd, 0, os.SEEK_SET)
+ self.assertEqual(b'es', posix.pread(fd, 2, 1))
+ # the first pread() shouldn't disturb the file offset
+ self.assertEqual(b'te', posix.read(fd, 2))
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
+ def test_pwrite(self):
+ fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
+ try:
+ os.write(fd, b'test')
+ os.lseek(fd, 0, os.SEEK_SET)
+ posix.pwrite(fd, b'xx', 1)
+ self.assertEqual(b'txxt', posix.read(fd, 4))
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
+ "test needs posix.posix_fallocate()")
+ def test_posix_fallocate(self):
+ fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
+ try:
+ posix.posix_fallocate(fd, 0, 10)
+ except OSError as inst:
+ # issue10812, ZFS doesn't appear to support posix_fallocate,
+ # so skip Solaris-based since they are likely to have ZFS.
+ if inst.errno != errno.EINVAL or not sys.platform.startswith("sunos"):
+ raise
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
+ "test needs posix.posix_fadvise()")
+ def test_posix_fadvise(self):
+ fd = os.open(support.TESTFN, os.O_RDONLY)
+ try:
+ posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
+ def test_utime_with_fd(self):
+ now = time.time()
+ fd = os.open(support.TESTFN, os.O_RDONLY)
+ try:
+ posix.utime(fd)
+ posix.utime(fd, None)
+ self.assertRaises(TypeError, posix.utime, fd, (None, None))
+ self.assertRaises(TypeError, posix.utime, fd, (now, None))
+ self.assertRaises(TypeError, posix.utime, fd, (None, now))
+ posix.utime(fd, (int(now), int(now)))
+ posix.utime(fd, (now, now))
+ self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
+ self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
+ self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
+ posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
+ posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
+
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
+ def test_utime_nofollow_symlinks(self):
+ now = time.time()
+ posix.utime(support.TESTFN, None, follow_symlinks=False)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
+ posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
+ posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
+ posix.utime(support.TESTFN, follow_symlinks=False)
+
+ @unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
+ def test_writev(self):
+ fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
+ try:
+ os.writev(fd, (b'test1', b'tt2', b't3'))
+ os.lseek(fd, 0, os.SEEK_SET)
+ self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
+ finally:
+ os.close(fd)
+
+ @unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
+ def test_readv(self):
+ fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
+ try:
+ os.write(fd, b'test1tt2t3')
+ os.lseek(fd, 0, os.SEEK_SET)
+ buf = [bytearray(i) for i in [5, 3, 2]]
+ self.assertEqual(posix.readv(fd, buf), 10)
+ self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
+ finally:
+ os.close(fd)
+
def test_dup(self):
if hasattr(posix, 'dup'):
fp = open(support.TESTFN)
@@ -167,6 +314,13 @@ class PosixTester(unittest.TestCase):
fp1.close()
fp2.close()
+ @unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
+ @support.requires_linux_version(2, 6, 23)
+ def test_oscloexec(self):
+ fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
+ self.addCleanup(os.close, fd)
+ self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
+
def test_osexlock(self):
if hasattr(posix, "O_EXLOCK"):
fd = os.open(support.TESTFN,
@@ -203,6 +357,7 @@ class PosixTester(unittest.TestCase):
fp = open(support.TESTFN)
try:
self.assertTrue(posix.fstat(fp.fileno()))
+ self.assertTrue(posix.stat(fp.fileno()))
finally:
fp.close()
@@ -265,7 +420,7 @@ class PosixTester(unittest.TestCase):
self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
# re-create the file
- open(support.TESTFN, 'w').close()
+ support.create_empty_file(support.TESTFN)
self._test_all_chown_common(posix.chown, support.TESTFN)
@unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
@@ -293,13 +448,32 @@ class PosixTester(unittest.TestCase):
self.assertRaises(OSError, posix.chdir, support.TESTFN)
def test_listdir(self):
- if hasattr(posix, 'listdir'):
- self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
+ self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
def test_listdir_default(self):
- # When listdir is called without argument, it's the same as listdir(os.curdir)
- if hasattr(posix, 'listdir'):
- self.assertTrue(support.TESTFN in posix.listdir())
+ # When listdir is called without argument,
+ # it's the same as listdir(os.curdir).
+ self.assertTrue(support.TESTFN in posix.listdir())
+
+ def test_listdir_bytes(self):
+ # When listdir is called with a bytes object,
+ # the returned strings are of type bytes.
+ self.assertTrue(os.fsencode(support.TESTFN) in posix.listdir(b'.'))
+
+ @unittest.skipUnless(posix.listdir in os.supports_fd,
+ "test needs fd support for posix.listdir()")
+ def test_listdir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ self.addCleanup(posix.close, f)
+ self.assertEqual(
+ sorted(posix.listdir('.')),
+ sorted(posix.listdir(f))
+ )
+ # Check that the fd offset was reset (issue #13739)
+ self.assertEqual(
+ sorted(posix.listdir('.')),
+ sorted(posix.listdir(f))
+ )
def test_access(self):
if hasattr(posix, 'access'):
@@ -321,6 +495,32 @@ class PosixTester(unittest.TestCase):
os.close(reader)
os.close(writer)
+ @unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
+ @support.requires_linux_version(2, 6, 27)
+ def test_pipe2(self):
+ self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
+ self.assertRaises(TypeError, os.pipe2, 0, 0)
+
+ # try calling with flags = 0, like os.pipe()
+ r, w = os.pipe2(0)
+ os.close(r)
+ os.close(w)
+
+ # test flags
+ r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
+ self.addCleanup(os.close, r)
+ self.addCleanup(os.close, w)
+ self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
+ self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
+ # try reading from an empty pipe: this should fail, not block
+ self.assertRaises(OSError, os.read, r, 1)
+ # try a write big enough to fill-up the pipe: this should either
+ # fail or perform a partial write, not block
+ try:
+ os.write(w, b'x' * support.PIPE_MAX_SIZE)
+ except OSError:
+ pass
+
def test_utime(self):
if hasattr(posix, 'utime'):
now = time.time()
@@ -331,13 +531,14 @@ class PosixTester(unittest.TestCase):
posix.utime(support.TESTFN, (int(now), int(now)))
posix.utime(support.TESTFN, (now, now))
- def _test_chflags_regular_file(self, chflags_func, target_file):
+ def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
st = os.stat(target_file)
self.assertTrue(hasattr(st, 'st_flags'))
# ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
+ flags = st.st_flags | stat.UF_IMMUTABLE
try:
- chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
+ chflags_func(target_file, flags, **kwargs)
except OSError as err:
if err.errno != errno.EOPNOTSUPP:
raise
@@ -361,6 +562,7 @@ class PosixTester(unittest.TestCase):
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
def test_lchflags_regular_file(self):
self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
+ self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
def test_lchflags_symlink(self):
@@ -372,25 +574,28 @@ class PosixTester(unittest.TestCase):
self.teardown_files.append(_DUMMY_SYMLINK)
dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
- # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
- try:
- posix.lchflags(_DUMMY_SYMLINK,
- dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
- except OSError as err:
- if err.errno != errno.EOPNOTSUPP:
- raise
- msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
- self.skipTest(msg)
+ def chflags_nofollow(path, flags):
+ return posix.chflags(path, flags, follow_symlinks=False)
- try:
- new_testfn_st = os.stat(support.TESTFN)
- new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
+ for fn in (posix.lchflags, chflags_nofollow):
+ # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
+ flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
+ try:
+ fn(_DUMMY_SYMLINK, flags)
+ except OSError as err:
+ if err.errno != errno.EOPNOTSUPP:
+ raise
+ msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
+ self.skipTest(msg)
+ try:
+ new_testfn_st = os.stat(support.TESTFN)
+ new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
- self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
- self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
- new_dummy_symlink_st.st_flags)
- finally:
- posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
+ self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
+ self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
+ new_dummy_symlink_st.st_flags)
+ finally:
+ fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
def test_environ(self):
if os.name == "nt":
@@ -438,13 +643,29 @@ class PosixTester(unittest.TestCase):
os.chdir(curdir)
support.rmtree(base_path)
+ @unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
+ @unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
+ @unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
+ def test_getgrouplist(self):
+ with os.popen('id -G') as idg:
+ groups = idg.read().strip()
+ ret = idg.close()
+
+ if ret is not None or not groups:
+ raise unittest.SkipTest("need working 'id -G'")
+
+ self.assertEqual(
+ set([int(x) for x in groups.split()]),
+ set(posix.getgrouplist(pwd.getpwuid(os.getuid())[0],
+ pwd.getpwuid(os.getuid())[3])))
+
@unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
def test_getgroups(self):
with os.popen('id -G') as idg:
groups = idg.read().strip()
ret = idg.close()
- if ret != None or not groups:
+ if ret is not None or not groups:
raise unittest.SkipTest("need working 'id -G'")
# 'id -G' and 'os.getgroups()' should return the same
@@ -455,6 +676,340 @@ class PosixTester(unittest.TestCase):
set([int(x) for x in groups.split()]),
set(posix.getgroups() + [posix.getegid()]))
+ # tests for the posix *at functions follow
+
+ @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
+ def test_access_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
+ def test_chmod_dir_fd(self):
+ os.chmod(support.TESTFN, stat.S_IRUSR)
+
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
+
+ s = posix.stat(support.TESTFN)
+ self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
+ def test_chown_dir_fd(self):
+ support.unlink(support.TESTFN)
+ support.create_empty_file(support.TESTFN)
+
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
+ def test_stat_dir_fd(self):
+ support.unlink(support.TESTFN)
+ with open(support.TESTFN, 'w') as outfile:
+ outfile.write("testline\n")
+
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ s1 = posix.stat(support.TESTFN)
+ s2 = posix.stat(support.TESTFN, dir_fd=f)
+ self.assertEqual(s1, s2)
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
+ def test_utime_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ now = time.time()
+ posix.utime(support.TESTFN, None, dir_fd=f)
+ posix.utime(support.TESTFN, dir_fd=f)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
+ self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
+ posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
+ posix.utime(support.TESTFN, (now, now), dir_fd=f)
+ posix.utime(support.TESTFN,
+ (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
+ posix.utime(support.TESTFN, dir_fd=f,
+ times=(int(now), int((now - int(now)) * 1e9)))
+
+ # try dir_fd and follow_symlinks together
+ if os.utime in os.supports_follow_symlinks:
+ try:
+ posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
+ except ValueError:
+ # whoops! using both together not supported on this platform.
+ pass
+
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
+ def test_link_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
+ # should have same inodes
+ self.assertEqual(posix.stat(support.TESTFN)[1],
+ posix.stat(support.TESTFN + 'link')[1])
+ finally:
+ posix.close(f)
+ support.unlink(support.TESTFN + 'link')
+
+ @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
+ def test_mkdir_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
+ posix.stat(support.TESTFN + 'dir') # should not raise exception
+ finally:
+ posix.close(f)
+ support.rmtree(support.TESTFN + 'dir')
+
+ @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
+ "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
+ def test_mknod_dir_fd(self):
+ # Test using mknodat() to create a FIFO (the only use specified
+ # by POSIX).
+ support.unlink(support.TESTFN)
+ mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
+ except OSError as e:
+ # Some old systems don't allow unprivileged users to use
+ # mknod(), or only support creating device nodes.
+ self.assertIn(e.errno, (errno.EPERM, errno.EINVAL))
+ else:
+ self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
+ def test_open_dir_fd(self):
+ support.unlink(support.TESTFN)
+ with open(support.TESTFN, 'w') as outfile:
+ outfile.write("testline\n")
+ a = posix.open(posix.getcwd(), posix.O_RDONLY)
+ b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
+ try:
+ res = posix.read(b, 9).decode(encoding="utf-8")
+ self.assertEqual("testline\n", res)
+ finally:
+ posix.close(a)
+ posix.close(b)
+
+ @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
+ def test_readlink_dir_fd(self):
+ os.symlink(support.TESTFN, support.TESTFN + 'link')
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ self.assertEqual(posix.readlink(support.TESTFN + 'link'),
+ posix.readlink(support.TESTFN + 'link', dir_fd=f))
+ finally:
+ support.unlink(support.TESTFN + 'link')
+ posix.close(f)
+
+ @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
+ def test_rename_dir_fd(self):
+ support.unlink(support.TESTFN)
+ support.create_empty_file(support.TESTFN + 'ren')
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
+ except:
+ posix.rename(support.TESTFN + 'ren', support.TESTFN)
+ raise
+ else:
+ posix.stat(support.TESTFN) # should not throw exception
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
+ def test_symlink_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
+ self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
+ finally:
+ posix.close(f)
+ support.unlink(support.TESTFN + 'link')
+
+ @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
+ def test_unlink_dir_fd(self):
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ support.create_empty_file(support.TESTFN + 'del')
+ posix.stat(support.TESTFN + 'del') # should not throw exception
+ try:
+ posix.unlink(support.TESTFN + 'del', dir_fd=f)
+ except:
+ support.unlink(support.TESTFN + 'del')
+ raise
+ else:
+ self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
+ finally:
+ posix.close(f)
+
+ @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
+ def test_mkfifo_dir_fd(self):
+ support.unlink(support.TESTFN)
+ f = posix.open(posix.getcwd(), posix.O_RDONLY)
+ try:
+ posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
+ self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
+ finally:
+ posix.close(f)
+
+ requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
+ "don't have scheduling support")
+ requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
+ "don't have sched affinity support")
+
+ @requires_sched_h
+ def test_sched_yield(self):
+ # This has no error conditions (at least on Linux).
+ posix.sched_yield()
+
+ @requires_sched_h
+ @unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
+ "requires sched_get_priority_max()")
+ def test_sched_priority(self):
+ # Round-robin usually has interesting priorities.
+ pol = posix.SCHED_RR
+ lo = posix.sched_get_priority_min(pol)
+ hi = posix.sched_get_priority_max(pol)
+ self.assertIsInstance(lo, int)
+ self.assertIsInstance(hi, int)
+ self.assertGreaterEqual(hi, lo)
+ # OSX evidently just returns 15 without checking the argument.
+ if sys.platform != "darwin":
+ self.assertRaises(OSError, posix.sched_get_priority_min, -23)
+ self.assertRaises(OSError, posix.sched_get_priority_max, -23)
+
+ @unittest.skipUnless(hasattr(posix, 'sched_setscheduler'), "can't change scheduler")
+ def test_get_and_set_scheduler_and_param(self):
+ possible_schedulers = [sched for name, sched in posix.__dict__.items()
+ if name.startswith("SCHED_")]
+ mine = posix.sched_getscheduler(0)
+ self.assertIn(mine, possible_schedulers)
+ try:
+ parent = posix.sched_getscheduler(os.getppid())
+ except OSError as e:
+ if e.errno != errno.EPERM:
+ raise
+ else:
+ self.assertIn(parent, possible_schedulers)
+ self.assertRaises(OSError, posix.sched_getscheduler, -1)
+ self.assertRaises(OSError, posix.sched_getparam, -1)
+ param = posix.sched_getparam(0)
+ self.assertIsInstance(param.sched_priority, int)
+ try:
+ posix.sched_setscheduler(0, mine, param)
+ except OSError as e:
+ if e.errno != errno.EPERM:
+ raise
+
+ # POSIX states that calling sched_setparam() on a process with a
+ # scheduling policy other than SCHED_FIFO or SCHED_RR is
+ # implementation-defined: FreeBSD returns EINVAL.
+ if not sys.platform.startswith('freebsd'):
+ posix.sched_setparam(0, param)
+ self.assertRaises(OSError, posix.sched_setparam, -1, param)
+
+ self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
+ self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
+ self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
+ param = posix.sched_param(None)
+ self.assertRaises(TypeError, posix.sched_setparam, 0, param)
+ large = 214748364700
+ param = posix.sched_param(large)
+ self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
+ param = posix.sched_param(sched_priority=-large)
+ self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
+
+ @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
+ def test_sched_rr_get_interval(self):
+ try:
+ interval = posix.sched_rr_get_interval(0)
+ except OSError as e:
+ # This likely means that sched_rr_get_interval is only valid for
+ # processes with the SCHED_RR scheduler in effect.
+ if e.errno != errno.EINVAL:
+ raise
+ self.skipTest("only works on SCHED_RR processes")
+ self.assertIsInstance(interval, float)
+ # Reasonable constraints, I think.
+ self.assertGreaterEqual(interval, 0.)
+ self.assertLess(interval, 1.)
+
+ @requires_sched_affinity
+ def test_sched_getaffinity(self):
+ mask = posix.sched_getaffinity(0)
+ self.assertIsInstance(mask, set)
+ self.assertGreaterEqual(len(mask), 1)
+ self.assertRaises(OSError, posix.sched_getaffinity, -1)
+ for cpu in mask:
+ self.assertIsInstance(cpu, int)
+ self.assertGreaterEqual(cpu, 0)
+ self.assertLess(cpu, 1 << 32)
+
+ @requires_sched_affinity
+ def test_sched_setaffinity(self):
+ mask = posix.sched_getaffinity(0)
+ if len(mask) > 1:
+ # Empty masks are forbidden
+ mask.pop()
+ posix.sched_setaffinity(0, mask)
+ self.assertEqual(posix.sched_getaffinity(0), mask)
+ self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
+ self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
+ self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
+ self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
+
+ def test_rtld_constants(self):
+ # check presence of major RTLD_* constants
+ posix.RTLD_LAZY
+ posix.RTLD_NOW
+ posix.RTLD_GLOBAL
+ posix.RTLD_LOCAL
+
+ @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
+ "test needs an OS that reports file holes")
+ def test_fs_holes(self):
+ # Even if the filesystem doesn't report holes,
+ # if the OS supports it the SEEK_* constants
+ # will be defined and will have a consistent
+ # behaviour:
+ # os.SEEK_DATA = current position
+ # os.SEEK_HOLE = end of file position
+ with open(support.TESTFN, 'r+b') as fp:
+ fp.write(b"hello")
+ fp.flush()
+ size = fp.tell()
+ fno = fp.fileno()
+ try :
+ for i in range(size):
+ self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
+ self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
+ self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
+ self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
+ except OSError :
+ # Some OSs claim to support SEEK_HOLE/SEEK_DATA
+ # but it is not true.
+ # For instance:
+ # http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
+ raise unittest.SkipTest("OSError raised!")
+
class PosixGroupsTester(unittest.TestCase):
def setUp(self):
@@ -490,9 +1045,11 @@ class PosixGroupsTester(unittest.TestCase):
posix.setgroups(groups)
self.assertListEqual(groups, posix.getgroups())
-
def test_main():
- support.run_unittest(PosixTester, PosixGroupsTester)
+ try:
+ support.run_unittest(PosixTester, PosixGroupsTester)
+ finally:
+ support.reap_children()
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
index 599c85a..7aca87d 100644
--- a/Lib/test/test_posixpath.py
+++ b/Lib/test/test_posixpath.py
@@ -1,11 +1,11 @@
-import unittest
-from test import support, test_genericpath
-
import itertools
-import posixpath
import os
+import posixpath
import sys
+import unittest
+import warnings
from posixpath import realpath, abspath, dirname, basename
+from test import support, test_genericpath
try:
import posix
@@ -245,7 +245,9 @@ class PosixPathTest(unittest.TestCase):
def test_ismount(self):
self.assertIs(posixpath.ismount("/"), True)
- self.assertIs(posixpath.ismount(b"/"), True)
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", DeprecationWarning)
+ self.assertIs(posixpath.ismount(b"/"), True)
def test_ismount_non_existent(self):
# Non-existent mountpoint.
diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py
index 0c93d0e..d492d75 100644
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -219,6 +219,8 @@ class QueryTestCase(unittest.TestCase):
others.should.not.be: like.this}"""
self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
+ @unittest.expectedFailure
+ #See http://bugs.python.org/issue13907
@test.support.cpython_only
def test_set_reprs(self):
# This test creates a complex arrangement of frozensets and
@@ -241,10 +243,12 @@ class QueryTestCase(unittest.TestCase):
# Consequently, this test is fragile and
# implementation-dependent. Small changes to Python's sort
# algorithm cause the test to fail when it should pass.
+ # XXX Or changes to the dictionary implmentation...
self.assertEqual(pprint.pformat(set()), 'set()')
self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}')
self.assertEqual(pprint.pformat(frozenset()), 'frozenset()')
+
self.assertEqual(pprint.pformat(frozenset(range(3))), 'frozenset({0, 1, 2})')
cube_repr_tgt = """\
{frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}),
diff --git a/Lib/test/test_print.py b/Lib/test/test_print.py
index 8d37bbc..9d6dbea 100644
--- a/Lib/test/test_print.py
+++ b/Lib/test/test_print.py
@@ -111,6 +111,32 @@ class TestPrint(unittest.TestCase):
self.assertRaises(TypeError, print, '', end=3)
self.assertRaises(AttributeError, print, '', file='')
+ def test_print_flush(self):
+ # operation of the flush flag
+ class filelike():
+ def __init__(self):
+ self.written = ''
+ self.flushed = 0
+ def write(self, str):
+ self.written += str
+ def flush(self):
+ self.flushed += 1
+
+ f = filelike()
+ print(1, file=f, end='', flush=True)
+ print(2, file=f, end='', flush=True)
+ print(3, file=f, flush=False)
+ self.assertEqual(f.written, '123\n')
+ self.assertEqual(f.flushed, 2)
+
+ # ensure exceptions from flush are passed through
+ class noflush():
+ def write(self, str):
+ pass
+ def flush(self):
+ raise RuntimeError
+ self.assertRaises(RuntimeError, print, 1, file=noflush(), flush=True)
+
def test_main():
support.run_unittest(TestPrint)
diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py
index cc6a872..726d6fe 100644
--- a/Lib/test/test_property.py
+++ b/Lib/test/test_property.py
@@ -128,6 +128,29 @@ class PropertyTests(unittest.TestCase):
self.assertEqual(newgetter.spam, 8)
self.assertEqual(newgetter.__class__.spam.__doc__, "new docstring")
+ def test_property___isabstractmethod__descriptor(self):
+ for val in (True, False, [], [1], '', '1'):
+ class C(object):
+ def foo(self):
+ pass
+ foo.__isabstractmethod__ = val
+ foo = property(foo)
+ self.assertIs(C.foo.__isabstractmethod__, bool(val))
+
+ # check that the property's __isabstractmethod__ descriptor does the
+ # right thing when presented with a value that fails truth testing:
+ class NotBool(object):
+ def __nonzero__(self):
+ raise ValueError()
+ __len__ = __nonzero__
+ with self.assertRaises(ValueError):
+ class C(object):
+ def foo(self):
+ pass
+ foo.__isabstractmethod__ = NotBool()
+ foo = property(foo)
+ C.foo.__isabstractmethod__
+
# Issue 5890: subclasses of property do not preserve method __doc__ strings
class PropertySub(property):
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index 4f1251c..ef95268 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -205,6 +205,7 @@ class SmallPtyTests(unittest.TestCase):
self.orig_stdout_fileno = pty.STDOUT_FILENO
self.orig_pty_select = pty.select
self.fds = [] # A list of file descriptors to close.
+ self.files = []
self.select_rfds_lengths = []
self.select_rfds_results = []
@@ -212,10 +213,15 @@ class SmallPtyTests(unittest.TestCase):
pty.STDIN_FILENO = self.orig_stdin_fileno
pty.STDOUT_FILENO = self.orig_stdout_fileno
pty.select = self.orig_pty_select
+ for file in self.files:
+ try:
+ file.close()
+ except OSError:
+ pass
for fd in self.fds:
try:
os.close(fd)
- except:
+ except OSError:
pass
def _pipe(self):
@@ -223,6 +229,11 @@ class SmallPtyTests(unittest.TestCase):
self.fds.extend(pipe_fds)
return pipe_fds
+ def _socketpair(self):
+ socketpair = socket.socketpair()
+ self.files.extend(socketpair)
+ return socketpair
+
def _mock_select(self, rfds, wfds, xfds):
# This will raise IndexError when no more expected calls exist.
self.assertEqual(self.select_rfds_lengths.pop(0), len(rfds))
@@ -234,9 +245,8 @@ class SmallPtyTests(unittest.TestCase):
pty.STDOUT_FILENO = mock_stdout_fd
mock_stdin_fd, write_to_stdin_fd = self._pipe()
pty.STDIN_FILENO = mock_stdin_fd
- socketpair = socket.socketpair()
+ socketpair = self._socketpair()
masters = [s.fileno() for s in socketpair]
- self.fds.extend(masters)
# Feed data. Smaller than PIPEBUF. These writes will not block.
os.write(masters[1], b'from master')
@@ -263,9 +273,8 @@ class SmallPtyTests(unittest.TestCase):
pty.STDOUT_FILENO = mock_stdout_fd
mock_stdin_fd, write_to_stdin_fd = self._pipe()
pty.STDIN_FILENO = mock_stdin_fd
- socketpair = socket.socketpair()
+ socketpair = self._socketpair()
masters = [s.fileno() for s in socketpair]
- self.fds.extend(masters)
os.close(masters[1])
socketpair[1].close()
diff --git a/Lib/test/test_pulldom.py b/Lib/test/test_pulldom.py
new file mode 100644
index 0000000..b81a595
--- /dev/null
+++ b/Lib/test/test_pulldom.py
@@ -0,0 +1,347 @@
+import io
+import unittest
+import sys
+import xml.sax
+
+from xml.sax.xmlreader import AttributesImpl
+from xml.dom import pulldom
+
+from test.support import run_unittest, findfile
+
+
+tstfile = findfile("test.xml", subdir="xmltestdata")
+
+# A handy XML snippet, containing attributes, a namespace prefix, and a
+# self-closing tag:
+SMALL_SAMPLE = """<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xdc="http://www.xml.com/books">
+<!-- A comment -->
+<title>Introduction to XSL</title>
+<hr/>
+<p><xdc:author xdc:attrib="prefixed attribute" attrib="other attrib">A. Namespace</xdc:author></p>
+</html>"""
+
+
+class PullDOMTestCase(unittest.TestCase):
+
+ def test_parse(self):
+ """Minimal test of DOMEventStream.parse()"""
+
+ # This just tests that parsing from a stream works. Actual parser
+ # semantics are tested using parseString with a more focused XML
+ # fragment.
+
+ # Test with a filename:
+ handler = pulldom.parse(tstfile)
+ self.addCleanup(handler.stream.close)
+ list(handler)
+
+ # Test with a file object:
+ with open(tstfile, "rb") as fin:
+ list(pulldom.parse(fin))
+
+ def test_parse_semantics(self):
+ """Test DOMEventStream parsing semantics."""
+
+ items = pulldom.parseString(SMALL_SAMPLE)
+ evt, node = next(items)
+ # Just check the node is a Document:
+ self.assertTrue(hasattr(node, "createElement"))
+ self.assertEqual(pulldom.START_DOCUMENT, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("html", node.tagName)
+ self.assertEqual(2, len(node.attributes))
+ self.assertEqual(node.attributes.getNamedItem("xmlns:xdc").value,
+ "http://www.xml.com/books")
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt) # Line break
+ evt, node = next(items)
+ # XXX - A comment should be reported here!
+ # self.assertEqual(pulldom.COMMENT, evt)
+ # Line break after swallowed comment:
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ evt, node = next(items)
+ self.assertEqual("title", node.tagName)
+ title_node = node
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ self.assertEqual("Introduction to XSL", node.data)
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ self.assertEqual("title", node.tagName)
+ self.assertTrue(title_node is node)
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("hr", node.tagName)
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ self.assertEqual("hr", node.tagName)
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("p", node.tagName)
+ evt, node = next(items)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("xdc:author", node.tagName)
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ self.assertEqual("xdc:author", node.tagName)
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ # XXX No END_DOCUMENT item is ever obtained:
+ #evt, node = next(items)
+ #self.assertEqual(pulldom.END_DOCUMENT, evt)
+
+ def test_expandItem(self):
+ """Ensure expandItem works as expected."""
+ items = pulldom.parseString(SMALL_SAMPLE)
+ # Loop through the nodes until we get to a "title" start tag:
+ for evt, item in items:
+ if evt == pulldom.START_ELEMENT and item.tagName == "title":
+ items.expandNode(item)
+ self.assertEqual(1, len(item.childNodes))
+ break
+ else:
+ self.fail("No \"title\" element detected in SMALL_SAMPLE!")
+ # Loop until we get to the next start-element:
+ for evt, node in items:
+ if evt == pulldom.START_ELEMENT:
+ break
+ self.assertEqual("hr", node.tagName,
+ "expandNode did not leave DOMEventStream in the correct state.")
+ # Attempt to expand a standalone element:
+ items.expandNode(node)
+ self.assertEqual(next(items)[0], pulldom.CHARACTERS)
+ evt, node = next(items)
+ self.assertEqual(node.tagName, "p")
+ items.expandNode(node)
+ next(items) # Skip character data
+ evt, node = next(items)
+ self.assertEqual(node.tagName, "html")
+ with self.assertRaises(StopIteration):
+ next(items)
+ items.clear()
+ self.assertIsNone(items.parser)
+ self.assertIsNone(items.stream)
+
+ @unittest.expectedFailure
+ def test_comment(self):
+ """PullDOM does not receive "comment" events."""
+ items = pulldom.parseString(SMALL_SAMPLE)
+ for evt, _ in items:
+ if evt == pulldom.COMMENT:
+ break
+ else:
+ self.fail("No comment was encountered")
+
+ @unittest.expectedFailure
+ def test_end_document(self):
+ """PullDOM does not receive "end-document" events."""
+ items = pulldom.parseString(SMALL_SAMPLE)
+ # Read all of the nodes up to and including </html>:
+ for evt, node in items:
+ if evt == pulldom.END_ELEMENT and node.tagName == "html":
+ break
+ try:
+ # Assert that the next node is END_DOCUMENT:
+ evt, node = next(items)
+ self.assertEqual(pulldom.END_DOCUMENT, evt)
+ except StopIteration:
+ self.fail(
+ "Ran out of events, but should have received END_DOCUMENT")
+
+
+class ThoroughTestCase(unittest.TestCase):
+ """Test the hard-to-reach parts of pulldom."""
+
+ def test_thorough_parse(self):
+ """Test some of the hard-to-reach parts of PullDOM."""
+ self._test_thorough(pulldom.parse(None, parser=SAXExerciser()))
+
+ @unittest.expectedFailure
+ def test_sax2dom_fail(self):
+ """SAX2DOM can"t handle a PI before the root element."""
+ pd = SAX2DOMTestHelper(None, SAXExerciser(), 12)
+ self._test_thorough(pd)
+
+ def test_thorough_sax2dom(self):
+ """Test some of the hard-to-reach parts of SAX2DOM."""
+ pd = SAX2DOMTestHelper(None, SAX2DOMExerciser(), 12)
+ self._test_thorough(pd, False)
+
+ def _test_thorough(self, pd, before_root=True):
+ """Test some of the hard-to-reach parts of the parser, using a mock
+ parser."""
+
+ evt, node = next(pd)
+ self.assertEqual(pulldom.START_DOCUMENT, evt)
+ # Just check the node is a Document:
+ self.assertTrue(hasattr(node, "createElement"))
+
+ if before_root:
+ evt, node = next(pd)
+ self.assertEqual(pulldom.COMMENT, evt)
+ self.assertEqual("a comment", node.data)
+ evt, node = next(pd)
+ self.assertEqual(pulldom.PROCESSING_INSTRUCTION, evt)
+ self.assertEqual("target", node.target)
+ self.assertEqual("data", node.data)
+
+ evt, node = next(pd)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("html", node.tagName)
+
+ evt, node = next(pd)
+ self.assertEqual(pulldom.COMMENT, evt)
+ self.assertEqual("a comment", node.data)
+ evt, node = next(pd)
+ self.assertEqual(pulldom.PROCESSING_INSTRUCTION, evt)
+ self.assertEqual("target", node.target)
+ self.assertEqual("data", node.data)
+
+ evt, node = next(pd)
+ self.assertEqual(pulldom.START_ELEMENT, evt)
+ self.assertEqual("p", node.tagName)
+
+ evt, node = next(pd)
+ self.assertEqual(pulldom.CHARACTERS, evt)
+ self.assertEqual("text", node.data)
+ evt, node = next(pd)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ self.assertEqual("p", node.tagName)
+ evt, node = next(pd)
+ self.assertEqual(pulldom.END_ELEMENT, evt)
+ self.assertEqual("html", node.tagName)
+ evt, node = next(pd)
+ self.assertEqual(pulldom.END_DOCUMENT, evt)
+
+
+class SAXExerciser(object):
+ """A fake sax parser that calls some of the harder-to-reach sax methods to
+ ensure it emits the correct events"""
+
+ def setContentHandler(self, handler):
+ self._handler = handler
+
+ def parse(self, _):
+ h = self._handler
+ h.startDocument()
+
+ # The next two items ensure that items preceding the first
+ # start_element are properly stored and emitted:
+ h.comment("a comment")
+ h.processingInstruction("target", "data")
+
+ h.startElement("html", AttributesImpl({}))
+
+ h.comment("a comment")
+ h.processingInstruction("target", "data")
+
+ h.startElement("p", AttributesImpl({"class": "paraclass"}))
+ h.characters("text")
+ h.endElement("p")
+ h.endElement("html")
+ h.endDocument()
+
+ def stub(self, *args, **kwargs):
+ """Stub method. Does nothing."""
+ pass
+ setProperty = stub
+ setFeature = stub
+
+
+class SAX2DOMExerciser(SAXExerciser):
+ """The same as SAXExerciser, but without the processing instruction and
+ comment before the root element, because S2D can"t handle it"""
+
+ def parse(self, _):
+ h = self._handler
+ h.startDocument()
+ h.startElement("html", AttributesImpl({}))
+ h.comment("a comment")
+ h.processingInstruction("target", "data")
+ h.startElement("p", AttributesImpl({"class": "paraclass"}))
+ h.characters("text")
+ h.endElement("p")
+ h.endElement("html")
+ h.endDocument()
+
+
+class SAX2DOMTestHelper(pulldom.DOMEventStream):
+ """Allows us to drive SAX2DOM from a DOMEventStream."""
+
+ def reset(self):
+ self.pulldom = pulldom.SAX2DOM()
+ # This content handler relies on namespace support
+ self.parser.setFeature(xml.sax.handler.feature_namespaces, 1)
+ self.parser.setContentHandler(self.pulldom)
+
+
+class SAX2DOMTestCase(unittest.TestCase):
+
+ def confirm(self, test, testname="Test"):
+ self.assertTrue(test, testname)
+
+ def test_basic(self):
+ """Ensure SAX2DOM can parse from a stream."""
+ with io.StringIO(SMALL_SAMPLE) as fin:
+ sd = SAX2DOMTestHelper(fin, xml.sax.make_parser(),
+ len(SMALL_SAMPLE))
+ for evt, node in sd:
+ if evt == pulldom.START_ELEMENT and node.tagName == "html":
+ break
+ # Because the buffer is the same length as the XML, all the
+ # nodes should have been parsed and added:
+ self.assertGreater(len(node.childNodes), 0)
+
+ def testSAX2DOM(self):
+ """Ensure SAX2DOM expands nodes as expected."""
+ sax2dom = pulldom.SAX2DOM()
+ sax2dom.startDocument()
+ sax2dom.startElement("doc", {})
+ sax2dom.characters("text")
+ sax2dom.startElement("subelm", {})
+ sax2dom.characters("text")
+ sax2dom.endElement("subelm")
+ sax2dom.characters("text")
+ sax2dom.endElement("doc")
+ sax2dom.endDocument()
+
+ doc = sax2dom.document
+ root = doc.documentElement
+ (text1, elm1, text2) = root.childNodes
+ text3 = elm1.childNodes[0]
+
+ self.assertIsNone(text1.previousSibling)
+ self.assertIs(text1.nextSibling, elm1)
+ self.assertIs(elm1.previousSibling, text1)
+ self.assertIs(elm1.nextSibling, text2)
+ self.assertIs(text2.previousSibling, elm1)
+ self.assertIsNone(text2.nextSibling)
+ self.assertIsNone(text3.previousSibling)
+ self.assertIsNone(text3.nextSibling)
+
+ self.assertIs(root.parentNode, doc)
+ self.assertIs(text1.parentNode, root)
+ self.assertIs(elm1.parentNode, root)
+ self.assertIs(text2.parentNode, root)
+ self.assertIs(text3.parentNode, elm1)
+ doc.unlink()
+
+
+def test_main():
+ run_unittest(PullDOMTestCase, ThoroughTestCase, SAX2DOMTestCase)
+
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py
index c5a8e98..8e2001b 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -198,7 +198,7 @@ war</tt></dd></dl>
missing_pattern = "no Python documentation found for '%s'"
# output pattern for module with bad imports
-badimport_pattern = "problem in %s - ImportError: No module named %s"
+badimport_pattern = "problem in %s - ImportError: No module named %r"
def run_pydoc(module_name, *args, **env):
"""
@@ -236,8 +236,8 @@ def get_pydoc_text(module):
def print_diffs(text1, text2):
"Prints unified diffs for two texts"
# XXX now obsolete, use unittest built-in support
- lines1 = text1.splitlines(True)
- lines2 = text2.splitlines(True)
+ lines1 = text1.splitlines(keepends=True)
+ lines2 = text2.splitlines(keepends=True)
diffs = difflib.unified_diff(lines1, lines2, n=0, fromfile='expected',
tofile='got')
print('\n' + ''.join(diffs))
@@ -254,6 +254,8 @@ class PydocDocTest(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __locals__ unexpectedly')
def test_html_doc(self):
result, doc_loc = get_pydoc_html(pydoc_mod)
mod_file = inspect.getabsfile(pydoc_mod)
@@ -269,6 +271,8 @@ class PydocDocTest(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __locals__ unexpectedly')
def test_text_doc(self):
result, doc_loc = get_pydoc_text(pydoc_mod)
expected_text = expected_text_pattern % \
@@ -321,6 +325,8 @@ class PydocDocTest(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2,
'Docstrings are omitted with -O2 and above')
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'trace function introduces __locals__ unexpectedly')
def test_help_output_redirect(self):
# issue 940286, if output is set in Helper, then all output from
# Helper.help should be redirected
@@ -388,11 +394,10 @@ class PydocImportTest(unittest.TestCase):
modname = 'testmod_xyzzy'
testpairs = (
('i_am_not_here', 'i_am_not_here'),
- ('test.i_am_not_here_either', 'i_am_not_here_either'),
- ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'),
- ('i_am_not_here.{}'.format(modname),
- 'i_am_not_here.{}'.format(modname)),
- ('test.{}'.format(modname), modname),
+ ('test.i_am_not_here_either', 'test.i_am_not_here_either'),
+ ('test.i_am_not_here.neither_am_i', 'test.i_am_not_here'),
+ ('i_am_not_here.{}'.format(modname), 'i_am_not_here'),
+ ('test.{}'.format(modname), 'test.{}'.format(modname)),
)
sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py"
diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py
index e02c1af..be5c1c6 100644
--- a/Lib/test/test_raise.py
+++ b/Lib/test/test_raise.py
@@ -4,6 +4,7 @@
"""Tests for the raise statement."""
from test import support
+import re
import sys
import types
import unittest
@@ -77,6 +78,16 @@ class TestRaise(unittest.TestCase):
nested_reraise()
self.assertRaises(TypeError, reraise)
+ def test_raise_from_None(self):
+ try:
+ try:
+ raise TypeError("foo")
+ except:
+ raise ValueError() from None
+ except ValueError as e:
+ self.assertTrue(isinstance(e.__context__, TypeError))
+ self.assertIsNone(e.__cause__)
+
def test_with_reraise1(self):
def reraise():
try:
@@ -130,8 +141,35 @@ class TestRaise(unittest.TestCase):
with self.assertRaises(TypeError):
raise MyException
+ def test_assert_with_tuple_arg(self):
+ try:
+ assert False, (3,)
+ except AssertionError as e:
+ self.assertEqual(str(e), "(3,)")
+
+
class TestCause(unittest.TestCase):
+
+ def testCauseSyntax(self):
+ try:
+ try:
+ try:
+ raise TypeError
+ except Exception:
+ raise ValueError from None
+ except ValueError as exc:
+ self.assertIsNone(exc.__cause__)
+ self.assertTrue(exc.__suppress_context__)
+ exc.__suppress_context__ = False
+ raise exc
+ except ValueError as exc:
+ e = exc
+
+ self.assertIsNone(e.__cause__)
+ self.assertFalse(e.__suppress_context__)
+ self.assertIsInstance(e.__context__, TypeError)
+
def test_invalid_cause(self):
try:
raise IndexError from 5
@@ -171,6 +209,7 @@ class TestCause(unittest.TestCase):
class TestTraceback(unittest.TestCase):
+
def test_sets_traceback(self):
try:
raise IndexError()
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index 776d0c4..b5931ba 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -34,8 +34,12 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(randseq, self.randomlist(N))
def test_seedargs(self):
+ # Seed value with a negative hash.
+ class MySeed(object):
+ def __hash__(self):
+ return -1729
for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20),
- 3.14, 1+2j, 'a', tuple('abc')]:
+ 3.14, 1+2j, 'a', tuple('abc'), MySeed()]:
self.gen.seed(arg)
for arg in [list(range(3)), dict(one=1)]:
self.assertRaises(TypeError, self.gen.seed, arg)
diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py
index 4dab448..2a13bfe 100644
--- a/Lib/test/test_range.py
+++ b/Lib/test/test_range.py
@@ -350,13 +350,35 @@ class RangeTest(unittest.TestCase):
def test_pickling(self):
testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
- (13, 21, 3), (-2, 2, 2)]
+ (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
for t in testcases:
r = range(*t)
self.assertEqual(list(pickle.loads(pickle.dumps(r, proto))),
list(r))
+ def test_iterator_pickling(self):
+ testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
+ (13, 21, 3), (-2, 2, 2), (2**65, 2**65+2)]
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ for t in testcases:
+ it = itorg = iter(range(*t))
+ data = list(range(*t))
+
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(list(it), data)
+
+ it = pickle.loads(d)
+ try:
+ next(it)
+ except StopIteration:
+ continue
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(list(it), data[1:])
+
def test_odd_bug(self):
# This used to raise a "SystemError: NULL result without error"
# because the range validation step was eating the exception
@@ -516,6 +538,87 @@ class RangeTest(unittest.TestCase):
for k in values - {0}:
r[i:j:k]
+ def test_comparison(self):
+ test_ranges = [range(0), range(0, -1), range(1, 1, 3),
+ range(1), range(5, 6), range(5, 6, 2),
+ range(5, 7, 2), range(2), range(0, 4, 2),
+ range(0, 5, 2), range(0, 6, 2)]
+ test_tuples = list(map(tuple, test_ranges))
+
+ # Check that equality of ranges matches equality of the corresponding
+ # tuples for each pair from the test lists above.
+ ranges_eq = [a == b for a in test_ranges for b in test_ranges]
+ tuples_eq = [a == b for a in test_tuples for b in test_tuples]
+ self.assertEqual(ranges_eq, tuples_eq)
+
+ # Check that != correctly gives the logical negation of ==
+ ranges_ne = [a != b for a in test_ranges for b in test_ranges]
+ self.assertEqual(ranges_ne, [not x for x in ranges_eq])
+
+ # Equal ranges should have equal hashes.
+ for a in test_ranges:
+ for b in test_ranges:
+ if a == b:
+ self.assertEqual(hash(a), hash(b))
+
+ # Ranges are unequal to other types (even sequence types)
+ self.assertIs(range(0) == (), False)
+ self.assertIs(() == range(0), False)
+ self.assertIs(range(2) == [0, 1], False)
+
+ # Huge integers aren't a problem.
+ self.assertEqual(range(0, 2**100 - 1, 2),
+ range(0, 2**100, 2))
+ self.assertEqual(hash(range(0, 2**100 - 1, 2)),
+ hash(range(0, 2**100, 2)))
+ self.assertNotEqual(range(0, 2**100, 2),
+ range(0, 2**100 + 1, 2))
+ self.assertEqual(range(2**200, 2**201 - 2**99, 2**100),
+ range(2**200, 2**201, 2**100))
+ self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)),
+ hash(range(2**200, 2**201, 2**100)))
+ self.assertNotEqual(range(2**200, 2**201, 2**100),
+ range(2**200, 2**201 + 1, 2**100))
+
+ # Order comparisons are not implemented for ranges.
+ with self.assertRaises(TypeError):
+ range(0) < range(0)
+ with self.assertRaises(TypeError):
+ range(0) > range(0)
+ with self.assertRaises(TypeError):
+ range(0) <= range(0)
+ with self.assertRaises(TypeError):
+ range(0) >= range(0)
+
+
+ def test_attributes(self):
+ # test the start, stop and step attributes of range objects
+ self.assert_attrs(range(0), 0, 0, 1)
+ self.assert_attrs(range(10), 0, 10, 1)
+ self.assert_attrs(range(-10), 0, -10, 1)
+ self.assert_attrs(range(0, 10, 1), 0, 10, 1)
+ self.assert_attrs(range(0, 10, 3), 0, 10, 3)
+ self.assert_attrs(range(10, 0, -1), 10, 0, -1)
+ self.assert_attrs(range(10, 0, -3), 10, 0, -3)
+
+ def assert_attrs(self, rangeobj, start, stop, step):
+ self.assertEqual(rangeobj.start, start)
+ self.assertEqual(rangeobj.stop, stop)
+ self.assertEqual(rangeobj.step, step)
+
+ with self.assertRaises(AttributeError):
+ rangeobj.start = 0
+ with self.assertRaises(AttributeError):
+ rangeobj.stop = 10
+ with self.assertRaises(AttributeError):
+ rangeobj.step = 1
+
+ with self.assertRaises(AttributeError):
+ del rangeobj.start
+ with self.assertRaises(AttributeError):
+ del rangeobj.stop
+ with self.assertRaises(AttributeError):
+ del rangeobj.step
def test_main():
test.support.run_unittest(RangeTest)
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 5162d4e..e7acbe1 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -486,7 +486,7 @@ class ReTests(unittest.TestCase):
self.assertEqual(m.span(), span)
def test_re_escape(self):
- alnum_chars = string.ascii_letters + string.digits
+ alnum_chars = string.ascii_letters + string.digits + '_'
p = ''.join(chr(i) for i in range(256))
for c in p:
if c in alnum_chars:
@@ -499,7 +499,7 @@ class ReTests(unittest.TestCase):
self.assertMatch(re.escape(p), p)
def test_re_escape_byte(self):
- alnum_chars = (string.ascii_letters + string.digits).encode('ascii')
+ alnum_chars = (string.ascii_letters + string.digits + '_').encode('ascii')
p = bytes(range(256))
for i in p:
b = bytes([i])
@@ -546,24 +546,92 @@ class ReTests(unittest.TestCase):
self.assertNotEqual(re.compile('^pattern$', flag), None)
def test_sre_character_literals(self):
- for i in [0, 8, 16, 32, 64, 127, 128, 255]:
- self.assertNotEqual(re.match(r"\%03o" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"\%03o0" % i, chr(i)+"0"), None)
- self.assertNotEqual(re.match(r"\%03o8" % i, chr(i)+"8"), None)
- self.assertNotEqual(re.match(r"\x%02x" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"\x%02x0" % i, chr(i)+"0"), None)
- self.assertNotEqual(re.match(r"\x%02xz" % i, chr(i)+"z"), None)
- self.assertRaises(re.error, re.match, "\911", "")
+ for i in [0, 8, 16, 32, 64, 127, 128, 255, 256, 0xFFFF, 0x10000, 0x10FFFF]:
+ if i < 256:
+ self.assertIsNotNone(re.match(r"\%03o" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"\%03o0" % i, chr(i)+"0"))
+ self.assertIsNotNone(re.match(r"\%03o8" % i, chr(i)+"8"))
+ self.assertIsNotNone(re.match(r"\x%02x" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"\x%02x0" % i, chr(i)+"0"))
+ self.assertIsNotNone(re.match(r"\x%02xz" % i, chr(i)+"z"))
+ if i < 0x10000:
+ self.assertIsNotNone(re.match(r"\u%04x" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"\u%04x0" % i, chr(i)+"0"))
+ self.assertIsNotNone(re.match(r"\u%04xz" % i, chr(i)+"z"))
+ self.assertIsNotNone(re.match(r"\U%08x" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"\U%08x0" % i, chr(i)+"0"))
+ self.assertIsNotNone(re.match(r"\U%08xz" % i, chr(i)+"z"))
+ self.assertIsNotNone(re.match(r"\0", "\000"))
+ self.assertIsNotNone(re.match(r"\08", "\0008"))
+ self.assertIsNotNone(re.match(r"\01", "\001"))
+ self.assertIsNotNone(re.match(r"\018", "\0018"))
+ self.assertIsNotNone(re.match(r"\567", chr(0o167)))
+ self.assertRaises(re.error, re.match, r"\911", "")
+ self.assertRaises(re.error, re.match, r"\x1", "")
+ self.assertRaises(re.error, re.match, r"\x1z", "")
+ self.assertRaises(re.error, re.match, r"\u123", "")
+ self.assertRaises(re.error, re.match, r"\u123z", "")
+ self.assertRaises(re.error, re.match, r"\U0001234", "")
+ self.assertRaises(re.error, re.match, r"\U0001234z", "")
+ self.assertRaises(re.error, re.match, r"\U00110000", "")
def test_sre_character_class_literals(self):
+ for i in [0, 8, 16, 32, 64, 127, 128, 255, 256, 0xFFFF, 0x10000, 0x10FFFF]:
+ if i < 256:
+ self.assertIsNotNone(re.match(r"[\%o]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\%o8]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\%03o]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\%03o0]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\%03o8]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\x%02x]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\x%02x0]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\x%02xz]" % i, chr(i)))
+ if i < 0x10000:
+ self.assertIsNotNone(re.match(r"[\u%04x]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\u%04x0]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\u%04xz]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\U%08x]" % i, chr(i)))
+ self.assertIsNotNone(re.match(r"[\U%08x0]" % i, chr(i)+"0"))
+ self.assertIsNotNone(re.match(r"[\U%08xz]" % i, chr(i)+"z"))
+ self.assertRaises(re.error, re.match, r"[\911]", "")
+ self.assertRaises(re.error, re.match, r"[\x1z]", "")
+ self.assertRaises(re.error, re.match, r"[\u123z]", "")
+ self.assertRaises(re.error, re.match, r"[\U0001234z]", "")
+ self.assertRaises(re.error, re.match, r"[\U00110000]", "")
+
+ def test_sre_byte_literals(self):
+ for i in [0, 8, 16, 32, 64, 127, 128, 255]:
+ self.assertIsNotNone(re.match((r"\%03o" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"\%03o0" % i).encode(), bytes([i])+b"0"))
+ self.assertIsNotNone(re.match((r"\%03o8" % i).encode(), bytes([i])+b"8"))
+ self.assertIsNotNone(re.match((r"\x%02x" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"\x%02x0" % i).encode(), bytes([i])+b"0"))
+ self.assertIsNotNone(re.match((r"\x%02xz" % i).encode(), bytes([i])+b"z"))
+ self.assertIsNotNone(re.match(br"\u", b'u'))
+ self.assertIsNotNone(re.match(br"\U", b'U'))
+ self.assertIsNotNone(re.match(br"\0", b"\000"))
+ self.assertIsNotNone(re.match(br"\08", b"\0008"))
+ self.assertIsNotNone(re.match(br"\01", b"\001"))
+ self.assertIsNotNone(re.match(br"\018", b"\0018"))
+ self.assertIsNotNone(re.match(br"\567", bytes([0o167])))
+ self.assertRaises(re.error, re.match, br"\911", b"")
+ self.assertRaises(re.error, re.match, br"\x1", b"")
+ self.assertRaises(re.error, re.match, br"\x1z", b"")
+
+ def test_sre_byte_class_literals(self):
for i in [0, 8, 16, 32, 64, 127, 128, 255]:
- self.assertNotEqual(re.match(r"[\%03o]" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"[\%03o0]" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"[\%03o8]" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"[\x%02x]" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"[\x%02x0]" % i, chr(i)), None)
- self.assertNotEqual(re.match(r"[\x%02xz]" % i, chr(i)), None)
- self.assertRaises(re.error, re.match, "[\911]", "")
+ self.assertIsNotNone(re.match((r"[\%o]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\%o8]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\%03o]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\%03o0]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\%03o8]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\x%02x]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\x%02x0]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match((r"[\x%02xz]" % i).encode(), bytes([i])))
+ self.assertIsNotNone(re.match(br"[\u]", b'u'))
+ self.assertIsNotNone(re.match(br"[\U]", b'U'))
+ self.assertRaises(re.error, re.match, br"[\911]", "")
+ self.assertRaises(re.error, re.match, br"[\x1z]", "")
def test_bug_113254(self):
self.assertEqual(re.match(r'(a)|(b)', 'b').start(1), -1)
@@ -672,6 +740,26 @@ class ReTests(unittest.TestCase):
self.assertEqual([item.group(0) for item in iter],
[":", "::", ":::"])
+ pat = re.compile(r":+")
+ iter = pat.finditer("a:b::c:::d", 1, 10)
+ self.assertEqual([item.group(0) for item in iter],
+ [":", "::", ":::"])
+
+ pat = re.compile(r":+")
+ iter = pat.finditer("a:b::c:::d", pos=1, endpos=10)
+ self.assertEqual([item.group(0) for item in iter],
+ [":", "::", ":::"])
+
+ pat = re.compile(r":+")
+ iter = pat.finditer("a:b::c:::d", endpos=10, pos=1)
+ self.assertEqual([item.group(0) for item in iter],
+ [":", "::", ":::"])
+
+ pat = re.compile(r":+")
+ iter = pat.finditer("a:b::c:::d", pos=3, endpos=8)
+ self.assertEqual([item.group(0) for item in iter],
+ ["::", "::"])
+
def test_bug_926075(self):
self.assertTrue(re.compile('bug_926075') is not
re.compile(b'bug_926075'))
@@ -838,6 +926,13 @@ class ReTests(unittest.TestCase):
self.assertRaises(OverflowError, _sre.compile, "abc", 0, [long_overflow])
self.assertRaises(TypeError, _sre.compile, {}, 0, [])
+ def test_search_dot_unicode(self):
+ self.assertIsNotNone(re.search("123.*-", '123abc-'))
+ self.assertIsNotNone(re.search("123.*-", '123\xe9-'))
+ self.assertIsNotNone(re.search("123.*-", '123\u20ac-'))
+ self.assertIsNotNone(re.search("123.*-", '123\U0010ffff-'))
+ self.assertIsNotNone(re.search("123.*-", '123\xe9\u20ac\U0010ffff-'))
+
def test_compile(self):
# Test return value when given string and pattern as parameter
pattern = re.compile('random pattern')
diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py
index b0dc4d7..589ecdd 100644
--- a/Lib/test/test_reprlib.py
+++ b/Lib/test/test_reprlib.py
@@ -3,12 +3,14 @@
Nick Mathewson
"""
+import imp
import sys
import os
import shutil
+import importlib
import unittest
-from test.support import run_unittest
+from test.support import run_unittest, create_empty_file, verbose
from reprlib import repr as r # Don't shadow builtin repr
from reprlib import Repr
from reprlib import recursive_repr
@@ -129,8 +131,8 @@ class ReprTests(unittest.TestCase):
self.assertIn(s.find("..."), [12, 13])
def test_lambda(self):
- self.assertTrue(repr(lambda x: x).startswith(
- "<function <lambda"))
+ r = repr(lambda x: x)
+ self.assertTrue(r.startswith("<function ReprTests.test_lambda.<locals>.<lambda"), r)
# XXX anonymous functions? see func_repr
def test_builtin_function(self):
@@ -193,26 +195,29 @@ class ReprTests(unittest.TestCase):
r(y)
r(z)
-def touch(path, text=''):
- fp = open(path, 'w')
- fp.write(text)
- fp.close()
+def write_file(path, text):
+ with open(path, 'w', encoding='ASCII') as fp:
+ fp.write(text)
class LongReprTest(unittest.TestCase):
+ longname = 'areallylongpackageandmodulenametotestreprtruncation'
+
def setUp(self):
- longname = 'areallylongpackageandmodulenametotestreprtruncation'
- self.pkgname = os.path.join(longname)
- self.subpkgname = os.path.join(longname, longname)
+ self.pkgname = os.path.join(self.longname)
+ self.subpkgname = os.path.join(self.longname, self.longname)
# Make the package and subpackage
shutil.rmtree(self.pkgname, ignore_errors=True)
os.mkdir(self.pkgname)
- touch(os.path.join(self.pkgname, '__init__.py'))
+ create_empty_file(os.path.join(self.pkgname, '__init__.py'))
shutil.rmtree(self.subpkgname, ignore_errors=True)
os.mkdir(self.subpkgname)
- touch(os.path.join(self.subpkgname, '__init__.py'))
+ create_empty_file(os.path.join(self.subpkgname, '__init__.py'))
# Remember where we are
self.here = os.getcwd()
sys.path.insert(0, self.here)
+ # When regrtest is run with its -j option, this command alone is not
+ # enough.
+ importlib.invalidate_caches()
def tearDown(self):
actions = []
@@ -229,20 +234,40 @@ class LongReprTest(unittest.TestCase):
os.remove(p)
del sys.path[0]
+ def _check_path_limitations(self, module_name):
+ # base directory
+ source_path_len = len(self.here)
+ # a path separator + `longname` (twice)
+ source_path_len += 2 * (len(self.longname) + 1)
+ # a path separator + `module_name` + ".py"
+ source_path_len += len(module_name) + 1 + len(".py")
+ cached_path_len = source_path_len + len(imp.cache_from_source("x.py")) - len("x.py")
+ if os.name == 'nt' and cached_path_len >= 258:
+ # Under Windows, the max path len is 260 including C's terminating
+ # NUL character.
+ # (see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#maxpath)
+ self.skipTest("test paths too long (%d characters) for Windows' 260 character limit"
+ % cached_path_len)
+ elif os.name == 'nt' and verbose:
+ print("cached_path_len =", cached_path_len)
+
def test_module(self):
- eq = self.assertEqual
- touch(os.path.join(self.subpkgname, self.pkgname + '.py'))
+ self._check_path_limitations(self.pkgname)
+ create_empty_file(os.path.join(self.subpkgname, self.pkgname + '.py'))
+ importlib.invalidate_caches()
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
- eq(repr(areallylongpackageandmodulenametotestreprtruncation),
- "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
- eq(repr(sys), "<module 'sys' (built-in)>")
+ module = areallylongpackageandmodulenametotestreprtruncation
+ self.assertEqual(repr(module), "<module %r from %r>" % (module.__name__, module.__file__))
+ self.assertEqual(repr(sys), "<module 'sys' (built-in)>")
def test_type(self):
+ self._check_path_limitations('foo')
eq = self.assertEqual
- touch(os.path.join(self.subpkgname, 'foo.py'), '''\
+ write_file(os.path.join(self.subpkgname, 'foo.py'), '''\
class foo(object):
pass
''')
+ importlib.invalidate_caches()
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
eq(repr(foo.foo),
"<class '%s.foo'>" % foo.__name__)
@@ -253,39 +278,46 @@ class foo(object):
pass
def test_class(self):
- touch(os.path.join(self.subpkgname, 'bar.py'), '''\
+ self._check_path_limitations('bar')
+ write_file(os.path.join(self.subpkgname, 'bar.py'), '''\
class bar:
pass
''')
+ importlib.invalidate_caches()
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
# Module name may be prefixed with "test.", depending on how run.
self.assertEqual(repr(bar.bar), "<class '%s.bar'>" % bar.__name__)
def test_instance(self):
- touch(os.path.join(self.subpkgname, 'baz.py'), '''\
+ self._check_path_limitations('baz')
+ write_file(os.path.join(self.subpkgname, 'baz.py'), '''\
class baz:
pass
''')
+ importlib.invalidate_caches()
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
ibaz = baz.baz()
self.assertTrue(repr(ibaz).startswith(
"<%s.baz object at 0x" % baz.__name__))
def test_method(self):
+ self._check_path_limitations('qux')
eq = self.assertEqual
- touch(os.path.join(self.subpkgname, 'qux.py'), '''\
+ write_file(os.path.join(self.subpkgname, 'qux.py'), '''\
class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
def amethod(self): pass
''')
+ importlib.invalidate_caches()
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
# Unbound methods first
- self.assertTrue(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod).startswith(
- '<function amethod'))
+ r = repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod)
+ self.assertTrue(r.startswith('<function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod'), r)
# Bound method next
iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
- self.assertTrue(repr(iqux.amethod).startswith(
+ r = repr(iqux.amethod)
+ self.assertTrue(r.startswith(
'<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa object at 0x' \
- % (qux.__name__,) ))
+ % (qux.__name__,) ), r)
def test_builtin_function(self):
# XXX test built-in functions and methods with really long names
diff --git a/Lib/test/test_richcmp.py b/Lib/test/test_richcmp.py
index f8f3717..0b629dc 100644
--- a/Lib/test/test_richcmp.py
+++ b/Lib/test/test_richcmp.py
@@ -220,6 +220,7 @@ class MiscTest(unittest.TestCase):
for func in (do, operator.not_):
self.assertRaises(Exc, func, Bad())
+ @support.no_tracing
def test_recursion(self):
# Check that comparison for recursive objects fails gracefully
from collections import UserList
diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py
index 96d2beb..fefefc4 100644
--- a/Lib/test/test_runpy.py
+++ b/Lib/test/test_runpy.py
@@ -5,11 +5,15 @@ import os.path
import sys
import re
import tempfile
+import importlib
import py_compile
-from test.support import forget, make_legacy_pyc, run_unittest, unload, verbose
+from test.support import (
+ forget, make_legacy_pyc, run_unittest, unload, verbose, no_tracing,
+ create_empty_file)
from test.script_helper import (
make_pkg, make_script, make_zip_pkg, make_zip_script, temp_dir)
+
import runpy
from runpy import _run_code, _run_module_code, run_module, run_path
# Note: This module can't safely test _run_module_as_main as it
@@ -145,7 +149,7 @@ class ExecutionLayerTestCase(unittest.TestCase, CodeExecutionMixin):
mod_package)
self.check_code_execution(create_ns, expected_ns)
-
+# TODO: Use self.addCleanup to get rid of a lot of try-finally blocks
class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
"""Unit tests for runpy.run_module"""
@@ -175,8 +179,7 @@ class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
def _add_pkg_dir(self, pkg_dir):
os.mkdir(pkg_dir)
pkg_fname = os.path.join(pkg_dir, "__init__.py")
- pkg_file = open(pkg_fname, "w")
- pkg_file.close()
+ create_empty_file(pkg_fname)
return pkg_fname
def _make_pkg(self, source, depth, mod_base="runpy_test"):
@@ -252,10 +255,12 @@ class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
try:
if verbose > 1: print("Running from source:", mod_name)
self.check_code_execution(create_ns, expected_ns)
+ importlib.invalidate_caches()
__import__(mod_name)
os.remove(mod_fname)
make_legacy_pyc(mod_fname)
unload(mod_name) # In case loader caches paths
+ importlib.invalidate_caches()
if verbose > 1: print("Running from compiled:", mod_name)
self._fix_ns_for_legacy_pyc(expected_ns, alter_sys)
self.check_code_execution(create_ns, expected_ns)
@@ -285,11 +290,13 @@ class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
try:
if verbose > 1: print("Running from source:", pkg_name)
self.check_code_execution(create_ns, expected_ns)
+ importlib.invalidate_caches()
__import__(mod_name)
os.remove(mod_fname)
make_legacy_pyc(mod_fname)
unload(mod_name) # In case loader caches paths
if verbose > 1: print("Running from compiled:", pkg_name)
+ importlib.invalidate_caches()
self._fix_ns_for_legacy_pyc(expected_ns, alter_sys)
self.check_code_execution(create_ns, expected_ns)
finally:
@@ -306,8 +313,7 @@ class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
module_dir = os.path.join(module_dir, pkg_name)
# Add sibling module
sibling_fname = os.path.join(module_dir, "sibling.py")
- sibling_file = open(sibling_fname, "w")
- sibling_file.close()
+ create_empty_file(sibling_fname)
if verbose > 1: print(" Added sibling module:", sibling_fname)
# Add nephew module
uncle_dir = os.path.join(parent_dir, "uncle")
@@ -317,8 +323,7 @@ class RunModuleTestCase(unittest.TestCase, CodeExecutionMixin):
self._add_pkg_dir(cousin_dir)
if verbose > 1: print(" Added cousin package:", cousin_dir)
nephew_fname = os.path.join(cousin_dir, "nephew.py")
- nephew_file = open(nephew_fname, "w")
- nephew_file.close()
+ create_empty_file(nephew_fname)
if verbose > 1: print(" Added nephew module:", nephew_fname)
def _check_relative_imports(self, depth, run_name=None):
@@ -343,11 +348,13 @@ from ..uncle.cousin import nephew
self.assertIn("sibling", d1)
self.assertIn("nephew", d1)
del d1 # Ensure __loader__ entry doesn't keep file open
+ importlib.invalidate_caches()
__import__(mod_name)
os.remove(mod_fname)
make_legacy_pyc(mod_fname)
unload(mod_name) # In case the loader caches paths
if verbose > 1: print("Running from compiled:", mod_name)
+ importlib.invalidate_caches()
d2 = run_module(mod_name, run_name=run_name) # Read from bytecode
self.assertEqual(d2["__name__"], expected_name)
self.assertEqual(d2["__package__"], pkg_name)
@@ -407,6 +414,40 @@ from ..uncle.cousin import nephew
finally:
self._del_pkg(pkg_dir, depth, mod_name)
+ def test_pkgutil_walk_packages(self):
+ # This is a dodgy hack to use the test_runpy infrastructure to test
+ # issue #15343. Issue #15348 declares this is indeed a dodgy hack ;)
+ import pkgutil
+ max_depth = 4
+ base_name = "__runpy_pkg__"
+ package_suffixes = ["uncle", "uncle.cousin"]
+ module_suffixes = ["uncle.cousin.nephew", base_name + ".sibling"]
+ expected_packages = set()
+ expected_modules = set()
+ for depth in range(1, max_depth):
+ pkg_name = ".".join([base_name] * depth)
+ expected_packages.add(pkg_name)
+ for name in package_suffixes:
+ expected_packages.add(pkg_name + "." + name)
+ for name in module_suffixes:
+ expected_modules.add(pkg_name + "." + name)
+ pkg_name = ".".join([base_name] * max_depth)
+ expected_packages.add(pkg_name)
+ expected_modules.add(pkg_name + ".runpy_test")
+ pkg_dir, mod_fname, mod_name = (
+ self._make_pkg("", max_depth))
+ self.addCleanup(self._del_pkg, pkg_dir, max_depth, mod_name)
+ for depth in range(2, max_depth+1):
+ self._add_relative_modules(pkg_dir, "", depth)
+ for finder, mod_name, ispkg in pkgutil.walk_packages([pkg_dir]):
+ self.assertIsInstance(finder,
+ importlib.machinery.FileFinder)
+ if ispkg:
+ expected_packages.remove(mod_name)
+ else:
+ expected_modules.remove(mod_name)
+ self.assertEqual(len(expected_packages), 0, expected_packages)
+ self.assertEqual(len(expected_modules), 0, expected_modules)
class RunPathTestCase(unittest.TestCase, CodeExecutionMixin):
"""Unit tests for runpy.run_path"""
@@ -507,6 +548,7 @@ class RunPathTestCase(unittest.TestCase, CodeExecutionMixin):
msg = "can't find '__main__' module in %r" % zip_name
self._check_import_error(zip_name, msg)
+ @no_tracing
def test_main_recursion_error(self):
with temp_dir() as script_dir, temp_dir() as dummy_dir:
mod_name = '__main__'
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 1225d6e..8e00889 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -20,8 +20,8 @@ import unittest
TEST_XMLFILE = findfile("test.xml", subdir="xmltestdata")
TEST_XMLFILE_OUT = findfile("test.xml.out", subdir="xmltestdata")
try:
- TEST_XMLFILE.encode("utf8")
- TEST_XMLFILE_OUT.encode("utf8")
+ TEST_XMLFILE.encode("utf-8")
+ TEST_XMLFILE_OUT.encode("utf-8")
except UnicodeEncodeError:
raise unittest.SkipTest("filename is not encodable to utf8")
diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py
index 91b8f0c..50ada52 100644
--- a/Lib/test/test_sched.py
+++ b/Lib/test/test_sched.py
@@ -63,15 +63,39 @@ class TestCase(unittest.TestCase):
def test_queue(self):
l = []
- events = []
fun = lambda x: l.append(x)
scheduler = sched.scheduler(time.time, time.sleep)
- self.assertEqual(scheduler._queue, [])
- for x in [0.05, 0.04, 0.03, 0.02, 0.01]:
- events.append(scheduler.enterabs(x, 1, fun, (x,)))
- self.assertEqual(scheduler._queue.sort(), events.sort())
+ now = time.time()
+ e5 = scheduler.enterabs(now + 0.05, 1, fun)
+ e1 = scheduler.enterabs(now + 0.01, 1, fun)
+ e2 = scheduler.enterabs(now + 0.02, 1, fun)
+ e4 = scheduler.enterabs(now + 0.04, 1, fun)
+ e3 = scheduler.enterabs(now + 0.03, 1, fun)
+ # queue property is supposed to return an order list of
+ # upcoming events
+ self.assertEqual(list(scheduler.queue), [e1, e2, e3, e4, e5])
+
+ def test_args_kwargs(self):
+ flag = []
+
+ def fun(*a, **b):
+ flag.append(None)
+ self.assertEqual(a, (1,2,3))
+ self.assertEqual(b, {"foo":1})
+
+ scheduler = sched.scheduler(time.time, time.sleep)
+ z = scheduler.enterabs(0.01, 1, fun, argument=(1,2,3), kwargs={"foo":1})
scheduler.run()
- self.assertEqual(scheduler._queue, [])
+ self.assertEqual(flag, [None])
+
+ def test_run_non_blocking(self):
+ l = []
+ fun = lambda x: l.append(x)
+ scheduler = sched.scheduler(time.time, time.sleep)
+ for x in [10, 9, 8, 7, 6]:
+ scheduler.enter(x, 1, fun, (x,))
+ scheduler.run(blocking=False)
+ self.assertEqual(l, [])
def test_main():
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index fbc87aa..129a18a 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -1,5 +1,5 @@
import unittest
-from test.support import check_syntax_error, run_unittest
+from test.support import check_syntax_error, cpython_only, run_unittest
class ScopeTests(unittest.TestCase):
@@ -496,23 +496,22 @@ class ScopeTests(unittest.TestCase):
self.assertNotIn("x", varnames)
self.assertIn("y", varnames)
+ @cpython_only
def testLocalsClass_WithTrace(self):
# Issue23728: after the trace function returns, the locals()
# dictionary is used to update all variables, this used to
# include free variables. But in class statements, free
# variables are not inserted...
import sys
+ self.addCleanup(sys.settrace, sys.gettrace())
sys.settrace(lambda a,b,c:None)
- try:
- x = 12
+ x = 12
- class C:
- def f(self):
- return x
+ class C:
+ def f(self):
+ return x
- self.assertEqual(x, 12) # Used to raise UnboundLocalError
- finally:
- sys.settrace(None)
+ self.assertEqual(x, 12) # Used to raise UnboundLocalError
def testBoundAndFree(self):
# var is bound and free in class
@@ -527,6 +526,7 @@ class ScopeTests(unittest.TestCase):
inst = f(3)()
self.assertEqual(inst.a, inst.m())
+ @cpython_only
def testInteractionWithTraceFunc(self):
import sys
@@ -543,6 +543,7 @@ class ScopeTests(unittest.TestCase):
class TestClass:
pass
+ self.addCleanup(sys.settrace, sys.gettrace())
sys.settrace(tracer)
adaptgetter("foo", TestClass, (1, ""))
sys.settrace(None)
diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py
index 4ddc217..ddb9a0f 100644
--- a/Lib/test/test_select.py
+++ b/Lib/test/test_select.py
@@ -1,8 +1,9 @@
-from test import support
-import unittest
-import select
+import errno
import os
+import select
import sys
+import unittest
+from test import support
@unittest.skipIf(sys.platform[:3] in ('win', 'os2', 'riscos'),
"can't easily test on this system")
@@ -20,6 +21,21 @@ class SelectTestCase(unittest.TestCase):
self.assertRaises(TypeError, select.select, [self.Nope()], [], [])
self.assertRaises(TypeError, select.select, [self.Almost()], [], [])
self.assertRaises(TypeError, select.select, [], [], [], "not a number")
+ self.assertRaises(ValueError, select.select, [], [], [], -1)
+
+ # Issue #12367: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/155606
+ @unittest.skipIf(sys.platform.startswith('freebsd'),
+ 'skip because of a FreeBSD bug: kern/155606')
+ def test_errno(self):
+ with open(__file__, 'rb') as fp:
+ fd = fp.fileno()
+ fp.close()
+ try:
+ select.select([fd], [], [], 0)
+ except select.error as err:
+ self.assertEqual(err.errno, errno.EBADF)
+ else:
+ self.fail("exception not raised")
def test_returned_list_identity(self):
# See issue #8329
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index 6642440..8e9e587 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -9,6 +9,7 @@ from random import randrange, shuffle
import sys
import warnings
import collections
+import collections.abc
class PassThru(Exception):
pass
@@ -234,6 +235,26 @@ class TestJointOps(unittest.TestCase):
dup = pickle.loads(p)
self.assertEqual(self.s.x, dup.x)
+ def test_iterator_pickling(self):
+ itorg = iter(self.s)
+ data = self.thetype(self.s)
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ # Set iterators unpickle as list iterators due to the
+ # undefined order of set items.
+ # self.assertEqual(type(itorg), type(it))
+ self.assertTrue(isinstance(it, collections.abc.Iterator))
+ self.assertEqual(self.thetype(it), data)
+
+ it = pickle.loads(d)
+ try:
+ drop = next(it)
+ except StopIteration:
+ return
+ d = pickle.dumps(it)
+ it = pickle.loads(d)
+ self.assertEqual(self.thetype(it), data - self.thetype((drop,)))
+
def test_deepcopy(self):
class Tracer:
def __init__(self, value):
diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py
index 3e73f52..13c1265 100644
--- a/Lib/test/test_shelve.py
+++ b/Lib/test/test_shelve.py
@@ -2,7 +2,7 @@ import unittest
import shelve
import glob
from test import support
-from collections import MutableMapping
+from collections.abc import MutableMapping
from test.test_dbm import dbm_iterator
def L1(s):
@@ -129,8 +129,8 @@ class TestCase(unittest.TestCase):
shelve.Shelf(d)[key] = [1]
self.assertIn(key.encode('utf-8'), d)
# but a different one can be given
- shelve.Shelf(d, keyencoding='latin1')[key] = [1]
- self.assertIn(key.encode('latin1'), d)
+ shelve.Shelf(d, keyencoding='latin-1')[key] = [1]
+ self.assertIn(key.encode('latin-1'), d)
# with all consequences
s = shelve.Shelf(d, keyencoding='ascii')
self.assertRaises(UnicodeEncodeError, s.__setitem__, key, [1])
diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py
index 25e4b6d..d4463f30 100644
--- a/Lib/test/test_shlex.py
+++ b/Lib/test/test_shlex.py
@@ -1,6 +1,7 @@
-import unittest
-import os, sys, io
+import io
import shlex
+import string
+import unittest
from test import support
@@ -173,6 +174,22 @@ class ShlexTest(unittest.TestCase):
"%s: %s != %s" %
(self.data[i][0], l, self.data[i][1:]))
+ def testQuote(self):
+ safeunquoted = string.ascii_letters + string.digits + '@%_-+=:,./'
+ unicode_sample = '\xe9\xe0\xdf' # e + acute accent, a + grave, sharp s
+ unsafe = '"`$\\!' + unicode_sample
+
+ self.assertEqual(shlex.quote(''), "''")
+ self.assertEqual(shlex.quote(safeunquoted), safeunquoted)
+ self.assertEqual(shlex.quote('test file name'), "'test file name'")
+ for u in unsafe:
+ self.assertEqual(shlex.quote('test%sname' % u),
+ "'test%sname'" % u)
+ for u in unsafe:
+ self.assertEqual(shlex.quote("test%s'name'" % u),
+ "'test%s'\"'\"'name'\"'\"''" % u)
+
+
# Allow this test to be used with old shlex.py
if not getattr(shlex, "split", None):
for methname in dir(ShlexTest):
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index 1a016b9..eb0e9a4 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -7,8 +7,9 @@ import sys
import stat
import os
import os.path
-import functools
import errno
+import functools
+import subprocess
from test import support
from test.support import TESTFN
from os.path import splitdrive
@@ -22,7 +23,7 @@ import tarfile
import warnings
from test import support
-from test.support import TESTFN, check_warnings, captured_stdout
+from test.support import TESTFN, check_warnings, captured_stdout, requires_zlib
try:
import bz2
@@ -40,11 +41,6 @@ except ImportError:
UID_GID_SUPPORT = False
try:
- import zlib
-except ImportError:
- zlib = None
-
-try:
import zipfile
ZIP_SUPPORT = True
except ImportError:
@@ -52,7 +48,7 @@ except ImportError:
def _fake_rename(*args, **kwargs):
# Pretend the destination path is on a different filesystem.
- raise OSError()
+ raise OSError(getattr(errno, 'EXDEV', 18), "Invalid cross-device link")
def mock_rename(func):
@functools.wraps(func)
@@ -65,6 +61,31 @@ def mock_rename(func):
os.rename = builtin_rename
return wrap
+def write_file(path, content, binary=False):
+ """Write *content* to a file located at *path*.
+
+ If *path* is a tuple instead of a string, os.path.join will be used to
+ make a path. If *binary* is true, the file will be opened in binary
+ mode.
+ """
+ if isinstance(path, tuple):
+ path = os.path.join(*path)
+ with open(path, 'wb' if binary else 'w') as fp:
+ fp.write(content)
+
+def read_file(path, binary=False):
+ """Return contents from a file located at *path*.
+
+ If *path* is a tuple instead of a string, os.path.join will be used to
+ make a path. If *binary* is true, the file will be opened in binary
+ mode.
+ """
+ if isinstance(path, tuple):
+ path = os.path.join(*path)
+ with open(path, 'rb' if binary else 'r') as fp:
+ return fp.read()
+
+
class TestShutil(unittest.TestCase):
def setUp(self):
@@ -77,19 +98,6 @@ class TestShutil(unittest.TestCase):
d = self.tempdirs.pop()
shutil.rmtree(d, os.name in ('nt', 'cygwin'))
- def write_file(self, path, content='xxx'):
- """Writes a file in the given path.
-
-
- path can be a string or a sequence.
- """
- if isinstance(path, (list, tuple)):
- path = os.path.join(*path)
- f = open(path, 'w')
- try:
- f.write(content)
- finally:
- f.close()
def mkdtemp(self):
"""Create a temporary directory that will be cleaned up.
@@ -100,6 +108,47 @@ class TestShutil(unittest.TestCase):
self.tempdirs.append(d)
return d
+ def test_rmtree_works_on_bytes(self):
+ tmp = self.mkdtemp()
+ victim = os.path.join(tmp, 'killme')
+ os.mkdir(victim)
+ write_file(os.path.join(victim, 'somefile'), 'foo')
+ victim = os.fsencode(victim)
+ self.assertIsInstance(victim, bytes)
+ shutil.rmtree(victim)
+
+ @support.skip_unless_symlink
+ def test_rmtree_fails_on_symlink(self):
+ tmp = self.mkdtemp()
+ dir_ = os.path.join(tmp, 'dir')
+ os.mkdir(dir_)
+ link = os.path.join(tmp, 'link')
+ os.symlink(dir_, link)
+ self.assertRaises(OSError, shutil.rmtree, link)
+ self.assertTrue(os.path.exists(dir_))
+
+ @support.skip_unless_symlink
+ def test_rmtree_works_on_symlinks(self):
+ tmp = self.mkdtemp()
+ dir1 = os.path.join(tmp, 'dir1')
+ dir2 = os.path.join(dir1, 'dir2')
+ dir3 = os.path.join(tmp, 'dir3')
+ for d in dir1, dir2, dir3:
+ os.mkdir(d)
+ file1 = os.path.join(tmp, 'file1')
+ write_file(file1, 'foo')
+ link1 = os.path.join(dir1, 'link1')
+ os.symlink(dir2, link1)
+ link2 = os.path.join(dir1, 'link2')
+ os.symlink(dir3, link2)
+ link3 = os.path.join(dir1, 'link3')
+ os.symlink(file1, link3)
+ # make sure symlinks are removed but not followed
+ shutil.rmtree(dir1)
+ self.assertFalse(os.path.exists(dir1))
+ self.assertTrue(os.path.exists(dir3))
+ self.assertTrue(os.path.exists(file1))
+
def test_rmtree_errors(self):
# filename is guaranteed not to exist
filename = tempfile.mktemp()
@@ -112,30 +161,34 @@ class TestShutil(unittest.TestCase):
def test_on_error(self):
self.errorState = 0
os.mkdir(TESTFN)
- self.childpath = os.path.join(TESTFN, 'a')
- f = open(self.childpath, 'w')
- f.close()
+ self.addCleanup(shutil.rmtree, TESTFN)
+
+ self.child_file_path = os.path.join(TESTFN, 'a')
+ self.child_dir_path = os.path.join(TESTFN, 'b')
+ support.create_empty_file(self.child_file_path)
+ os.mkdir(self.child_dir_path)
old_dir_mode = os.stat(TESTFN).st_mode
- old_child_mode = os.stat(self.childpath).st_mode
+ old_child_file_mode = os.stat(self.child_file_path).st_mode
+ old_child_dir_mode = os.stat(self.child_dir_path).st_mode
# Make unwritable.
- os.chmod(self.childpath, stat.S_IREAD)
- os.chmod(TESTFN, stat.S_IREAD)
+ new_mode = stat.S_IREAD|stat.S_IEXEC
+ os.chmod(self.child_file_path, new_mode)
+ os.chmod(self.child_dir_path, new_mode)
+ os.chmod(TESTFN, new_mode)
+
+ self.addCleanup(os.chmod, TESTFN, old_dir_mode)
+ self.addCleanup(os.chmod, self.child_file_path, old_child_file_mode)
+ self.addCleanup(os.chmod, self.child_dir_path, old_child_dir_mode)
shutil.rmtree(TESTFN, onerror=self.check_args_to_onerror)
# Test whether onerror has actually been called.
- self.assertEqual(self.errorState, 2,
- "Expected call to onerror function did not happen.")
-
- # Make writable again.
- os.chmod(TESTFN, old_dir_mode)
- os.chmod(self.childpath, old_child_mode)
-
- # Clean up.
- shutil.rmtree(TESTFN)
+ self.assertEqual(self.errorState, 3,
+ "Expected call to onerror function did not "
+ "happen.")
def check_args_to_onerror(self, func, arg, exc):
# test_rmtree_errors deliberately runs rmtree
- # on a directory that is chmod 400, which will fail.
+ # on a directory that is chmod 500, which will fail.
# This function is run when shutil.rmtree fails.
# 99.9% of the time it initially fails to remove
# a file in the directory, so the first time through
@@ -144,99 +197,436 @@ class TestShutil(unittest.TestCase):
# FUSE experienced a failure earlier in the process
# at os.listdir. The first failure may legally
# be either.
- if self.errorState == 0:
- if func is os.remove:
- self.assertEqual(arg, self.childpath)
+ if self.errorState < 2:
+ if func is os.unlink:
+ self.assertEqual(arg, self.child_file_path)
+ elif func is os.rmdir:
+ self.assertEqual(arg, self.child_dir_path)
else:
- self.assertIs(func, os.listdir,
- "func must be either os.remove or os.listdir")
- self.assertEqual(arg, TESTFN)
+ self.assertIs(func, os.listdir)
+ self.assertIn(arg, [TESTFN, self.child_dir_path])
self.assertTrue(issubclass(exc[0], OSError))
- self.errorState = 1
+ self.errorState += 1
else:
self.assertEqual(func, os.rmdir)
self.assertEqual(arg, TESTFN)
self.assertTrue(issubclass(exc[0], OSError))
- self.errorState = 2
+ self.errorState = 3
+
+ def test_rmtree_does_not_choke_on_failing_lstat(self):
+ try:
+ orig_lstat = os.lstat
+ def raiser(fn, *args, **kwargs):
+ if fn != TESTFN:
+ raise OSError()
+ else:
+ return orig_lstat(fn)
+ os.lstat = raiser
+
+ os.mkdir(TESTFN)
+ write_file((TESTFN, 'foo'), 'foo')
+ shutil.rmtree(TESTFN)
+ finally:
+ os.lstat = orig_lstat
+
+ @unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod')
+ @support.skip_unless_symlink
+ def test_copymode_follow_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ dst_link = os.path.join(tmp_dir, 'quux')
+ write_file(src, 'foo')
+ write_file(dst, 'foo')
+ os.symlink(src, src_link)
+ os.symlink(dst, dst_link)
+ os.chmod(src, stat.S_IRWXU|stat.S_IRWXG)
+ # file to file
+ os.chmod(dst, stat.S_IRWXO)
+ self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ shutil.copymode(src, dst)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ # follow src link
+ os.chmod(dst, stat.S_IRWXO)
+ shutil.copymode(src_link, dst)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ # follow dst link
+ os.chmod(dst, stat.S_IRWXO)
+ shutil.copymode(src, dst_link)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ # follow both links
+ os.chmod(dst, stat.S_IRWXO)
+ shutil.copymode(src_link, dst)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+
+ @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod')
+ @support.skip_unless_symlink
+ def test_copymode_symlink_to_symlink(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ dst_link = os.path.join(tmp_dir, 'quux')
+ write_file(src, 'foo')
+ write_file(dst, 'foo')
+ os.symlink(src, src_link)
+ os.symlink(dst, dst_link)
+ os.chmod(src, stat.S_IRWXU|stat.S_IRWXG)
+ os.chmod(dst, stat.S_IRWXU)
+ os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG)
+ # link to link
+ os.lchmod(dst_link, stat.S_IRWXO)
+ shutil.copymode(src_link, dst_link, follow_symlinks=False)
+ self.assertEqual(os.lstat(src_link).st_mode,
+ os.lstat(dst_link).st_mode)
+ self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ # src link - use chmod
+ os.lchmod(dst_link, stat.S_IRWXO)
+ shutil.copymode(src_link, dst, follow_symlinks=False)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+ # dst link - use chmod
+ os.lchmod(dst_link, stat.S_IRWXO)
+ shutil.copymode(src, dst_link, follow_symlinks=False)
+ self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode)
+
+ @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing')
+ @support.skip_unless_symlink
+ def test_copymode_symlink_to_symlink_wo_lchmod(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ dst_link = os.path.join(tmp_dir, 'quux')
+ write_file(src, 'foo')
+ write_file(dst, 'foo')
+ os.symlink(src, src_link)
+ os.symlink(dst, dst_link)
+ shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail
+
+ @support.skip_unless_symlink
+ def test_copystat_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ dst_link = os.path.join(tmp_dir, 'qux')
+ write_file(src, 'foo')
+ src_stat = os.stat(src)
+ os.utime(src, (src_stat.st_atime,
+ src_stat.st_mtime - 42.0)) # ensure different mtimes
+ write_file(dst, 'bar')
+ self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime)
+ os.symlink(src, src_link)
+ os.symlink(dst, dst_link)
+ if hasattr(os, 'lchmod'):
+ os.lchmod(src_link, stat.S_IRWXO)
+ if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'):
+ os.lchflags(src_link, stat.UF_NODUMP)
+ src_link_stat = os.lstat(src_link)
+ # follow
+ if hasattr(os, 'lchmod'):
+ shutil.copystat(src_link, dst_link, follow_symlinks=True)
+ self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode)
+ # don't follow
+ shutil.copystat(src_link, dst_link, follow_symlinks=False)
+ dst_link_stat = os.lstat(dst_link)
+ if os.utime in os.supports_follow_symlinks:
+ for attr in 'st_atime', 'st_mtime':
+ # The modification times may be truncated in the new file.
+ self.assertLessEqual(getattr(src_link_stat, attr),
+ getattr(dst_link_stat, attr) + 1)
+ if hasattr(os, 'lchmod'):
+ self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode)
+ if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'):
+ self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags)
+ # tell to follow but dst is not a link
+ shutil.copystat(src_link, dst, follow_symlinks=False)
+ self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) <
+ 00000.1)
+
+ @unittest.skipUnless(hasattr(os, 'chflags') and
+ hasattr(errno, 'EOPNOTSUPP') and
+ hasattr(errno, 'ENOTSUP'),
+ "requires os.chflags, EOPNOTSUPP & ENOTSUP")
+ def test_copystat_handles_harmless_chflags_errors(self):
+ tmpdir = self.mkdtemp()
+ file1 = os.path.join(tmpdir, 'file1')
+ file2 = os.path.join(tmpdir, 'file2')
+ write_file(file1, 'xxx')
+ write_file(file2, 'xxx')
+
+ def make_chflags_raiser(err):
+ ex = OSError()
+
+ def _chflags_raiser(path, flags, *, follow_symlinks=True):
+ ex.errno = err
+ raise ex
+ return _chflags_raiser
+ old_chflags = os.chflags
+ try:
+ for err in errno.EOPNOTSUPP, errno.ENOTSUP:
+ os.chflags = make_chflags_raiser(err)
+ shutil.copystat(file1, file2)
+ # assert others errors break it
+ os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP)
+ self.assertRaises(OSError, shutil.copystat, file1, file2)
+ finally:
+ os.chflags = old_chflags
+
+ @support.skip_unless_xattr
+ def test_copyxattr(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ write_file(src, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ write_file(dst, 'bar')
+
+ # no xattr == no problem
+ shutil._copyxattr(src, dst)
+ # common case
+ os.setxattr(src, 'user.foo', b'42')
+ os.setxattr(src, 'user.bar', b'43')
+ shutil._copyxattr(src, dst)
+ self.assertEqual(os.listxattr(src), os.listxattr(dst))
+ self.assertEqual(
+ os.getxattr(src, 'user.foo'),
+ os.getxattr(dst, 'user.foo'))
+ # check errors don't affect other attrs
+ os.remove(dst)
+ write_file(dst, 'bar')
+ os_error = OSError(errno.EPERM, 'EPERM')
+
+ def _raise_on_user_foo(fname, attr, val, **kwargs):
+ if attr == 'user.foo':
+ raise os_error
+ else:
+ orig_setxattr(fname, attr, val, **kwargs)
+ try:
+ orig_setxattr = os.setxattr
+ os.setxattr = _raise_on_user_foo
+ shutil._copyxattr(src, dst)
+ self.assertIn('user.bar', os.listxattr(dst))
+ finally:
+ os.setxattr = orig_setxattr
+
+ # test that shutil.copystat copies xattrs
+ src = os.path.join(tmp_dir, 'the_original')
+ write_file(src, src)
+ os.setxattr(src, 'user.the_value', b'fiddly')
+ dst = os.path.join(tmp_dir, 'the_copy')
+ write_file(dst, dst)
+ shutil.copystat(src, dst)
+ self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly')
+
+ @support.skip_unless_symlink
+ @support.skip_unless_xattr
+ @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0,
+ 'root privileges required')
+ def test_copyxattr_symlinks(self):
+ # On Linux, it's only possible to access non-user xattr for symlinks;
+ # which in turn require root privileges. This test should be expanded
+ # as soon as other platforms gain support for extended attributes.
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ src_link = os.path.join(tmp_dir, 'baz')
+ write_file(src, 'foo')
+ os.symlink(src, src_link)
+ os.setxattr(src, 'trusted.foo', b'42')
+ os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False)
+ dst = os.path.join(tmp_dir, 'bar')
+ dst_link = os.path.join(tmp_dir, 'qux')
+ write_file(dst, 'bar')
+ os.symlink(dst, dst_link)
+ shutil._copyxattr(src_link, dst_link, follow_symlinks=False)
+ self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43')
+ self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo')
+ shutil._copyxattr(src_link, dst, follow_symlinks=False)
+ self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43')
+
+ @support.skip_unless_symlink
+ def test_copy_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ write_file(src, 'foo')
+ os.symlink(src, src_link)
+ if hasattr(os, 'lchmod'):
+ os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO)
+ # don't follow
+ shutil.copy(src_link, dst, follow_symlinks=True)
+ self.assertFalse(os.path.islink(dst))
+ self.assertEqual(read_file(src), read_file(dst))
+ os.remove(dst)
+ # follow
+ shutil.copy(src_link, dst, follow_symlinks=False)
+ self.assertTrue(os.path.islink(dst))
+ self.assertEqual(os.readlink(dst), os.readlink(src_link))
+ if hasattr(os, 'lchmod'):
+ self.assertEqual(os.lstat(src_link).st_mode,
+ os.lstat(dst).st_mode)
+
+ @support.skip_unless_symlink
+ def test_copy2_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ src_link = os.path.join(tmp_dir, 'baz')
+ write_file(src, 'foo')
+ os.symlink(src, src_link)
+ if hasattr(os, 'lchmod'):
+ os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO)
+ if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'):
+ os.lchflags(src_link, stat.UF_NODUMP)
+ src_stat = os.stat(src)
+ src_link_stat = os.lstat(src_link)
+ # follow
+ shutil.copy2(src_link, dst, follow_symlinks=True)
+ self.assertFalse(os.path.islink(dst))
+ self.assertEqual(read_file(src), read_file(dst))
+ os.remove(dst)
+ # don't follow
+ shutil.copy2(src_link, dst, follow_symlinks=False)
+ self.assertTrue(os.path.islink(dst))
+ self.assertEqual(os.readlink(dst), os.readlink(src_link))
+ dst_stat = os.lstat(dst)
+ if os.utime in os.supports_follow_symlinks:
+ for attr in 'st_atime', 'st_mtime':
+ # The modification times may be truncated in the new file.
+ self.assertLessEqual(getattr(src_link_stat, attr),
+ getattr(dst_stat, attr) + 1)
+ if hasattr(os, 'lchmod'):
+ self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode)
+ self.assertNotEqual(src_stat.st_mode, dst_stat.st_mode)
+ if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'):
+ self.assertEqual(src_link_stat.st_flags, dst_stat.st_flags)
+
+ @support.skip_unless_xattr
+ def test_copy2_xattr(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'foo')
+ dst = os.path.join(tmp_dir, 'bar')
+ write_file(src, 'foo')
+ os.setxattr(src, 'user.foo', b'42')
+ shutil.copy2(src, dst)
+ self.assertEqual(
+ os.getxattr(src, 'user.foo'),
+ os.getxattr(dst, 'user.foo'))
+ os.remove(dst)
+
+ @support.skip_unless_symlink
+ def test_copyfile_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src = os.path.join(tmp_dir, 'src')
+ dst = os.path.join(tmp_dir, 'dst')
+ dst_link = os.path.join(tmp_dir, 'dst_link')
+ link = os.path.join(tmp_dir, 'link')
+ write_file(src, 'foo')
+ os.symlink(src, link)
+ # don't follow
+ shutil.copyfile(link, dst_link, follow_symlinks=False)
+ self.assertTrue(os.path.islink(dst_link))
+ self.assertEqual(os.readlink(link), os.readlink(dst_link))
+ # follow
+ shutil.copyfile(link, dst)
+ self.assertFalse(os.path.islink(dst))
+
+ def test_rmtree_uses_safe_fd_version_if_available(self):
+ _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <=
+ os.supports_dir_fd and
+ os.listdir in os.supports_fd and
+ os.stat in os.supports_follow_symlinks)
+ if _use_fd_functions:
+ self.assertTrue(shutil._use_fd_functions)
+ self.assertTrue(shutil.rmtree.avoids_symlink_attacks)
+ tmp_dir = self.mkdtemp()
+ d = os.path.join(tmp_dir, 'a')
+ os.mkdir(d)
+ try:
+ real_rmtree = shutil._rmtree_safe_fd
+ class Called(Exception): pass
+ def _raiser(*args, **kwargs):
+ raise Called
+ shutil._rmtree_safe_fd = _raiser
+ self.assertRaises(Called, shutil.rmtree, d)
+ finally:
+ shutil._rmtree_safe_fd = real_rmtree
+ else:
+ self.assertFalse(shutil._use_fd_functions)
+ self.assertFalse(shutil.rmtree.avoids_symlink_attacks)
def test_rmtree_dont_delete_file(self):
# When called on a file instead of a directory, don't delete it.
handle, path = tempfile.mkstemp()
- os.fdopen(handle).close()
- self.assertRaises(OSError, shutil.rmtree, path)
+ os.close(handle)
+ self.assertRaises(NotADirectoryError, shutil.rmtree, path)
os.remove(path)
- def _write_data(self, path, data):
- f = open(path, "w")
- f.write(data)
- f.close()
-
def test_copytree_simple(self):
-
- def read_data(path):
- f = open(path)
- data = f.read()
- f.close()
- return data
-
src_dir = tempfile.mkdtemp()
dst_dir = os.path.join(tempfile.mkdtemp(), 'destination')
- self._write_data(os.path.join(src_dir, 'test.txt'), '123')
+ self.addCleanup(shutil.rmtree, src_dir)
+ self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir))
+ write_file((src_dir, 'test.txt'), '123')
os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir', 'test.txt'), '456')
+
+ shutil.copytree(src_dir, dst_dir)
+ self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt')))
+ self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir')))
+ self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir',
+ 'test.txt')))
+ actual = read_file((dst_dir, 'test.txt'))
+ self.assertEqual(actual, '123')
+ actual = read_file((dst_dir, 'test_dir', 'test.txt'))
+ self.assertEqual(actual, '456')
- try:
- shutil.copytree(src_dir, dst_dir)
- self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt')))
- self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir')))
- self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir',
- 'test.txt')))
- actual = read_data(os.path.join(dst_dir, 'test.txt'))
- self.assertEqual(actual, '123')
- actual = read_data(os.path.join(dst_dir, 'test_dir', 'test.txt'))
- self.assertEqual(actual, '456')
- finally:
- for path in (
- os.path.join(src_dir, 'test.txt'),
- os.path.join(dst_dir, 'test.txt'),
- os.path.join(src_dir, 'test_dir', 'test.txt'),
- os.path.join(dst_dir, 'test_dir', 'test.txt'),
- ):
- if os.path.exists(path):
- os.remove(path)
- for path in (src_dir,
- os.path.dirname(dst_dir)
- ):
- if os.path.exists(path):
- shutil.rmtree(path)
+ @support.skip_unless_symlink
+ def test_copytree_symlinks(self):
+ tmp_dir = self.mkdtemp()
+ src_dir = os.path.join(tmp_dir, 'src')
+ dst_dir = os.path.join(tmp_dir, 'dst')
+ sub_dir = os.path.join(src_dir, 'sub')
+ os.mkdir(src_dir)
+ os.mkdir(sub_dir)
+ write_file((src_dir, 'file.txt'), 'foo')
+ src_link = os.path.join(sub_dir, 'link')
+ dst_link = os.path.join(dst_dir, 'sub/link')
+ os.symlink(os.path.join(src_dir, 'file.txt'),
+ src_link)
+ if hasattr(os, 'lchmod'):
+ os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO)
+ if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'):
+ os.lchflags(src_link, stat.UF_NODUMP)
+ src_stat = os.lstat(src_link)
+ shutil.copytree(src_dir, dst_dir, symlinks=True)
+ self.assertTrue(os.path.islink(os.path.join(dst_dir, 'sub', 'link')))
+ self.assertEqual(os.readlink(os.path.join(dst_dir, 'sub', 'link')),
+ os.path.join(src_dir, 'file.txt'))
+ dst_stat = os.lstat(dst_link)
+ if hasattr(os, 'lchmod'):
+ self.assertEqual(dst_stat.st_mode, src_stat.st_mode)
+ if hasattr(os, 'lchflags'):
+ self.assertEqual(dst_stat.st_flags, src_stat.st_flags)
def test_copytree_with_exclude(self):
-
- def read_data(path):
- f = open(path)
- data = f.read()
- f.close()
- return data
-
# creating data
join = os.path.join
exists = os.path.exists
src_dir = tempfile.mkdtemp()
try:
dst_dir = join(tempfile.mkdtemp(), 'destination')
- self._write_data(join(src_dir, 'test.txt'), '123')
- self._write_data(join(src_dir, 'test.tmp'), '123')
+ write_file((src_dir, 'test.txt'), '123')
+ write_file((src_dir, 'test.tmp'), '123')
os.mkdir(join(src_dir, 'test_dir'))
- self._write_data(join(src_dir, 'test_dir', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir', 'test.txt'), '456')
os.mkdir(join(src_dir, 'test_dir2'))
- self._write_data(join(src_dir, 'test_dir2', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir2', 'test.txt'), '456')
os.mkdir(join(src_dir, 'test_dir2', 'subdir'))
os.mkdir(join(src_dir, 'test_dir2', 'subdir2'))
- self._write_data(join(src_dir, 'test_dir2', 'subdir', 'test.txt'),
- '456')
- self._write_data(join(src_dir, 'test_dir2', 'subdir2', 'test.py'),
- '456')
-
+ write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456')
# testing glob-like patterns
try:
@@ -244,21 +634,19 @@ class TestShutil(unittest.TestCase):
shutil.copytree(src_dir, dst_dir, ignore=patterns)
# checking the result: some elements should not be copied
self.assertTrue(exists(join(dst_dir, 'test.txt')))
- self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2')))
+ self.assertFalse(exists(join(dst_dir, 'test.tmp')))
+ self.assertFalse(exists(join(dst_dir, 'test_dir2')))
finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
+ shutil.rmtree(dst_dir)
try:
patterns = shutil.ignore_patterns('*.tmp', 'subdir*')
shutil.copytree(src_dir, dst_dir, ignore=patterns)
# checking the result: some elements should not be copied
- self.assertTrue(not exists(join(dst_dir, 'test.tmp')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
+ self.assertFalse(exists(join(dst_dir, 'test.tmp')))
+ self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2')))
+ self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir')))
finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
+ shutil.rmtree(dst_dir)
# testing callable-style
try:
@@ -277,13 +665,12 @@ class TestShutil(unittest.TestCase):
shutil.copytree(src_dir, dst_dir, ignore=_filter)
# checking the result: some elements should not be copied
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir2',
- 'test.py')))
- self.assertTrue(not exists(join(dst_dir, 'test_dir2', 'subdir')))
+ self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2',
+ 'test.py')))
+ self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir')))
finally:
- if os.path.exists(dst_dir):
- shutil.rmtree(dst_dir)
+ shutil.rmtree(dst_dir)
finally:
shutil.rmtree(src_dir)
shutil.rmtree(os.path.dirname(dst_dir))
@@ -308,35 +695,6 @@ class TestShutil(unittest.TestCase):
finally:
shutil.rmtree(TESTFN, ignore_errors=True)
- @unittest.skipUnless(hasattr(os, 'chflags') and
- hasattr(errno, 'EOPNOTSUPP') and
- hasattr(errno, 'ENOTSUP'),
- "requires os.chflags, EOPNOTSUPP & ENOTSUP")
- def test_copystat_handles_harmless_chflags_errors(self):
- tmpdir = self.mkdtemp()
- file1 = os.path.join(tmpdir, 'file1')
- file2 = os.path.join(tmpdir, 'file2')
- self.write_file(file1, 'xxx')
- self.write_file(file2, 'xxx')
-
- def make_chflags_raiser(err):
- ex = OSError()
-
- def _chflags_raiser(path, flags):
- ex.errno = err
- raise ex
- return _chflags_raiser
- old_chflags = os.chflags
- try:
- for err in errno.EOPNOTSUPP, errno.ENOTSUP:
- os.chflags = make_chflags_raiser(err)
- shutil.copystat(file1, file2)
- # assert others errors break it
- os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP)
- self.assertRaises(OSError, shutil.copystat, file1, file2)
- finally:
- os.chflags = old_chflags
-
@support.skip_unless_symlink
def test_dont_copy_file_onto_symlink_to_itself(self):
# bug 851123.
@@ -367,6 +725,7 @@ class TestShutil(unittest.TestCase):
os.mkdir(src)
os.symlink(src, dst)
self.assertRaises(OSError, shutil.rmtree, dst)
+ shutil.rmtree(dst, ignore_errors=True)
finally:
shutil.rmtree(TESTFN, ignore_errors=True)
@@ -407,9 +766,9 @@ class TestShutil(unittest.TestCase):
src_dir = self.mkdtemp()
dst_dir = os.path.join(self.mkdtemp(), 'destination')
- self._write_data(os.path.join(src_dir, 'test.txt'), '123')
+ write_file((src_dir, 'test.txt'), '123')
os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir', 'test.txt'), '456')
copied = []
def _copy(src, dst):
@@ -426,7 +785,7 @@ class TestShutil(unittest.TestCase):
dst_dir = os.path.join(self.mkdtemp(), 'destination')
os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt'))
os.mkdir(os.path.join(src_dir, 'test_dir'))
- self._write_data(os.path.join(src_dir, 'test_dir', 'test.txt'), '456')
+ write_file((src_dir, 'test_dir', 'test.txt'), '456')
self.assertRaises(Error, shutil.copytree, src_dir, dst_dir)
# a dangling symlink is ignored with the proper flag
@@ -442,7 +801,7 @@ class TestShutil(unittest.TestCase):
def _copy_file(self, method):
fname = 'test.txt'
tmpdir = self.mkdtemp()
- self.write_file([tmpdir, fname])
+ write_file((tmpdir, fname), 'xxx')
file1 = os.path.join(tmpdir, fname)
tmpdir2 = self.mkdtemp()
method(file1, tmpdir2)
@@ -474,14 +833,14 @@ class TestShutil(unittest.TestCase):
self.assertEqual(getattr(file1_stat, 'st_flags'),
getattr(file2_stat, 'st_flags'))
- @unittest.skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_make_tarball(self):
# creating something to tar
tmpdir = self.mkdtemp()
- self.write_file([tmpdir, 'file1'], 'xxx')
- self.write_file([tmpdir, 'file2'], 'xxx')
+ write_file((tmpdir, 'file1'), 'xxx')
+ write_file((tmpdir, 'file2'), 'xxx')
os.mkdir(os.path.join(tmpdir, 'sub'))
- self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
+ write_file((tmpdir, 'sub', 'file3'), 'xxx')
tmpdir2 = self.mkdtemp()
# force shutil to create the directory
@@ -528,16 +887,16 @@ class TestShutil(unittest.TestCase):
tmpdir = self.mkdtemp()
dist = os.path.join(tmpdir, 'dist')
os.mkdir(dist)
- self.write_file([dist, 'file1'], 'xxx')
- self.write_file([dist, 'file2'], 'xxx')
+ write_file((dist, 'file1'), 'xxx')
+ write_file((dist, 'file2'), 'xxx')
os.mkdir(os.path.join(dist, 'sub'))
- self.write_file([dist, 'sub', 'file3'], 'xxx')
+ write_file((dist, 'sub', 'file3'), 'xxx')
os.mkdir(os.path.join(dist, 'sub2'))
tmpdir2 = self.mkdtemp()
base_name = os.path.join(tmpdir2, 'archive')
return tmpdir, tmpdir2, base_name
- @unittest.skipUnless(zlib, "Requires zlib")
+ @requires_zlib
@unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
'Need the tar command to run')
def test_tarfile_vs_tar(self):
@@ -592,13 +951,13 @@ class TestShutil(unittest.TestCase):
tarball = base_name + '.tar'
self.assertTrue(os.path.exists(tarball))
- @unittest.skipUnless(zlib, "Requires zlib")
+ @requires_zlib
@unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
def test_make_zipfile(self):
# creating something to tar
tmpdir = self.mkdtemp()
- self.write_file([tmpdir, 'file1'], 'xxx')
- self.write_file([tmpdir, 'file2'], 'xxx')
+ write_file((tmpdir, 'file1'), 'xxx')
+ write_file((tmpdir, 'file2'), 'xxx')
tmpdir2 = self.mkdtemp()
# force shutil to create the directory
@@ -616,7 +975,7 @@ class TestShutil(unittest.TestCase):
base_name = os.path.join(tmpdir, 'archive')
self.assertRaises(ValueError, make_archive, base_name, 'xxx')
- @unittest.skipUnless(zlib, "Requires zlib")
+ @requires_zlib
def test_make_archive_owner_group(self):
# testing make_archive with owner and group, with various combinations
# this works even if there's not gid/uid support
@@ -644,7 +1003,7 @@ class TestShutil(unittest.TestCase):
self.assertTrue(os.path.exists(res))
- @unittest.skipUnless(zlib, "Requires zlib")
+ @requires_zlib
@unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
def test_tarfile_root_owner(self):
tmpdir, tmpdir2, base_name = self._create_files()
@@ -713,7 +1072,7 @@ class TestShutil(unittest.TestCase):
diff.append(file_)
return diff
- @unittest.skipUnless(zlib, "Requires zlib")
+ @requires_zlib
def test_unpack_archive(self):
formats = ['tar', 'gztar', 'zip']
if BZ2_SUPPORTED:
@@ -764,6 +1123,162 @@ class TestShutil(unittest.TestCase):
unregister_unpack_format('Boo2')
self.assertEqual(get_unpack_formats(), formats)
+ @unittest.skipUnless(hasattr(shutil, 'disk_usage'),
+ "disk_usage not available on this platform")
+ def test_disk_usage(self):
+ usage = shutil.disk_usage(os.getcwd())
+ self.assertGreater(usage.total, 0)
+ self.assertGreater(usage.used, 0)
+ self.assertGreaterEqual(usage.free, 0)
+ self.assertGreaterEqual(usage.total, usage.used)
+ self.assertGreater(usage.total, usage.free)
+
+ @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
+ @unittest.skipUnless(hasattr(os, 'chown'), 'requires os.chown')
+ def test_chown(self):
+
+ # cleaned-up automatically by TestShutil.tearDown method
+ dirname = self.mkdtemp()
+ filename = tempfile.mktemp(dir=dirname)
+ write_file(filename, 'testing chown function')
+
+ with self.assertRaises(ValueError):
+ shutil.chown(filename)
+
+ with self.assertRaises(LookupError):
+ shutil.chown(filename, user='non-exising username')
+
+ with self.assertRaises(LookupError):
+ shutil.chown(filename, group='non-exising groupname')
+
+ with self.assertRaises(TypeError):
+ shutil.chown(filename, b'spam')
+
+ with self.assertRaises(TypeError):
+ shutil.chown(filename, 3.14)
+
+ uid = os.getuid()
+ gid = os.getgid()
+
+ def check_chown(path, uid=None, gid=None):
+ s = os.stat(filename)
+ if uid is not None:
+ self.assertEqual(uid, s.st_uid)
+ if gid is not None:
+ self.assertEqual(gid, s.st_gid)
+
+ shutil.chown(filename, uid, gid)
+ check_chown(filename, uid, gid)
+ shutil.chown(filename, uid)
+ check_chown(filename, uid)
+ shutil.chown(filename, user=uid)
+ check_chown(filename, uid)
+ shutil.chown(filename, group=gid)
+ check_chown(filename, gid=gid)
+
+ shutil.chown(dirname, uid, gid)
+ check_chown(dirname, uid, gid)
+ shutil.chown(dirname, uid)
+ check_chown(dirname, uid)
+ shutil.chown(dirname, user=uid)
+ check_chown(dirname, uid)
+ shutil.chown(dirname, group=gid)
+ check_chown(dirname, gid=gid)
+
+ user = pwd.getpwuid(uid)[0]
+ group = grp.getgrgid(gid)[0]
+ shutil.chown(filename, user, group)
+ check_chown(filename, uid, gid)
+ shutil.chown(dirname, user, group)
+ check_chown(dirname, uid, gid)
+
+ def test_copy_return_value(self):
+ # copy and copy2 both return their destination path.
+ for fn in (shutil.copy, shutil.copy2):
+ src_dir = self.mkdtemp()
+ dst_dir = self.mkdtemp()
+ src = os.path.join(src_dir, 'foo')
+ write_file(src, 'foo')
+ rv = fn(src, dst_dir)
+ self.assertEqual(rv, os.path.join(dst_dir, 'foo'))
+ rv = fn(src, os.path.join(dst_dir, 'bar'))
+ self.assertEqual(rv, os.path.join(dst_dir, 'bar'))
+
+ def test_copyfile_return_value(self):
+ # copytree returns its destination path.
+ src_dir = self.mkdtemp()
+ dst_dir = self.mkdtemp()
+ dst_file = os.path.join(dst_dir, 'bar')
+ src_file = os.path.join(src_dir, 'foo')
+ write_file(src_file, 'foo')
+ rv = shutil.copyfile(src_file, dst_file)
+ self.assertTrue(os.path.exists(rv))
+ self.assertEqual(read_file(src_file), read_file(dst_file))
+
+ def test_copytree_return_value(self):
+ # copytree returns its destination path.
+ src_dir = self.mkdtemp()
+ dst_dir = src_dir + "dest"
+ self.addCleanup(shutil.rmtree, dst_dir, True)
+ src = os.path.join(src_dir, 'foo')
+ write_file(src, 'foo')
+ rv = shutil.copytree(src_dir, dst_dir)
+ self.assertEqual(['foo'], os.listdir(rv))
+
+
+class TestWhich(unittest.TestCase):
+
+ def setUp(self):
+ self.temp_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, self.temp_dir, True)
+ # Give the temp_file an ".exe" suffix for all.
+ # It's needed on Windows and not harmful on other platforms.
+ self.temp_file = tempfile.NamedTemporaryFile(dir=self.temp_dir,
+ suffix=".exe")
+ os.chmod(self.temp_file.name, stat.S_IXUSR)
+ self.addCleanup(self.temp_file.close)
+ self.dir, self.file = os.path.split(self.temp_file.name)
+
+ def test_basic(self):
+ # Given an EXE in a directory, it should be returned.
+ rv = shutil.which(self.file, path=self.dir)
+ self.assertEqual(rv, self.temp_file.name)
+
+ def test_full_path_short_circuit(self):
+ # When given the fully qualified path to an executable that exists,
+ # it should be returned.
+ rv = shutil.which(self.temp_file.name, path=self.temp_dir)
+ self.assertEqual(self.temp_file.name, rv)
+
+ def test_non_matching_mode(self):
+ # Set the file read-only and ask for writeable files.
+ os.chmod(self.temp_file.name, stat.S_IREAD)
+ rv = shutil.which(self.file, path=self.dir, mode=os.W_OK)
+ self.assertIsNone(rv)
+
+ def test_relative(self):
+ old_cwd = os.getcwd()
+ base_dir, tail_dir = os.path.split(self.dir)
+ os.chdir(base_dir)
+ try:
+ rv = shutil.which(self.file, path=tail_dir)
+ self.assertEqual(rv, os.path.join(tail_dir, self.file))
+ finally:
+ os.chdir(old_cwd)
+
+ def test_nonexistent_file(self):
+ # Return None when no matching executable file is found on the path.
+ rv = shutil.which("foo.exe", path=self.dir)
+ self.assertIsNone(rv)
+
+ @unittest.skipUnless(sys.platform == "win32",
+ "pathext check is Windows-only")
+ def test_pathext_checking(self):
+ # Ask for the file without the ".exe" extension, then ensure that
+ # it gets found properly with the extension.
+ rv = shutil.which(self.temp_file.name[:-4], path=self.dir)
+ self.assertEqual(self.temp_file.name, rv)
+
class TestMove(unittest.TestCase):
@@ -877,6 +1392,58 @@ class TestMove(unittest.TestCase):
finally:
shutil.rmtree(TESTFN, ignore_errors=True)
+ @support.skip_unless_symlink
+ @mock_rename
+ def test_move_file_symlink(self):
+ dst = os.path.join(self.src_dir, 'bar')
+ os.symlink(self.src_file, dst)
+ shutil.move(dst, self.dst_file)
+ self.assertTrue(os.path.islink(self.dst_file))
+ self.assertTrue(os.path.samefile(self.src_file, self.dst_file))
+
+ @support.skip_unless_symlink
+ @mock_rename
+ def test_move_file_symlink_to_dir(self):
+ filename = "bar"
+ dst = os.path.join(self.src_dir, filename)
+ os.symlink(self.src_file, dst)
+ shutil.move(dst, self.dst_dir)
+ final_link = os.path.join(self.dst_dir, filename)
+ self.assertTrue(os.path.islink(final_link))
+ self.assertTrue(os.path.samefile(self.src_file, final_link))
+
+ @support.skip_unless_symlink
+ @mock_rename
+ def test_move_dangling_symlink(self):
+ src = os.path.join(self.src_dir, 'baz')
+ dst = os.path.join(self.src_dir, 'bar')
+ os.symlink(src, dst)
+ dst_link = os.path.join(self.dst_dir, 'quux')
+ shutil.move(dst, dst_link)
+ self.assertTrue(os.path.islink(dst_link))
+ self.assertEqual(os.path.realpath(src), os.path.realpath(dst_link))
+
+ @support.skip_unless_symlink
+ @mock_rename
+ def test_move_dir_symlink(self):
+ src = os.path.join(self.src_dir, 'baz')
+ dst = os.path.join(self.src_dir, 'bar')
+ os.mkdir(src)
+ os.symlink(src, dst)
+ dst_link = os.path.join(self.dst_dir, 'quux')
+ shutil.move(dst, dst_link)
+ self.assertTrue(os.path.islink(dst_link))
+ self.assertTrue(os.path.samefile(src, dst_link))
+
+ def test_move_return_value(self):
+ rv = shutil.move(self.src_file, self.dst_dir)
+ self.assertEqual(rv,
+ os.path.join(self.dst_dir, os.path.basename(self.src_file)))
+
+ def test_move_as_rename_return_value(self):
+ rv = shutil.move(self.src_file, os.path.join(self.dst_dir, 'bar'))
+ self.assertEqual(rv, os.path.join(self.dst_dir, 'bar'))
+
class TestCopyFile(unittest.TestCase):
@@ -986,6 +1553,7 @@ class TestCopyFile(unittest.TestCase):
# but a different case.
self.src_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, self.src_dir, True)
dst_dir = os.path.join(
os.path.dirname(self.src_dir),
os.path.basename(self.src_dir).upper())
@@ -995,13 +1563,57 @@ class TestCopyFile(unittest.TestCase):
shutil.move(self.src_dir, dst_dir)
self.assertTrue(os.path.isdir(dst_dir))
finally:
- if os.path.exists(dst_dir):
- os.rmdir(dst_dir)
+ os.rmdir(dst_dir)
+
+class TermsizeTests(unittest.TestCase):
+ def test_does_not_crash(self):
+ """Check if get_terminal_size() returns a meaningful value.
+
+ There's no easy portable way to actually check the size of the
+ terminal, so let's check if it returns something sensible instead.
+ """
+ size = shutil.get_terminal_size()
+ self.assertGreaterEqual(size.columns, 0)
+ self.assertGreaterEqual(size.lines, 0)
+
+ def test_os_environ_first(self):
+ "Check if environment variables have precedence"
+
+ with support.EnvironmentVarGuard() as env:
+ env['COLUMNS'] = '777'
+ size = shutil.get_terminal_size()
+ self.assertEqual(size.columns, 777)
+
+ with support.EnvironmentVarGuard() as env:
+ env['LINES'] = '888'
+ size = shutil.get_terminal_size()
+ self.assertEqual(size.lines, 888)
+
+ @unittest.skipUnless(os.isatty(sys.__stdout__.fileno()), "not on tty")
+ def test_stty_match(self):
+ """Check if stty returns the same results ignoring env
+
+ This test will fail if stdin and stdout are connected to
+ different terminals with different sizes. Nevertheless, such
+ situations should be pretty rare.
+ """
+ try:
+ size = subprocess.check_output(['stty', 'size']).decode().split()
+ except (FileNotFoundError, subprocess.CalledProcessError):
+ self.skipTest("stty invocation failed")
+ expected = (int(size[1]), int(size[0])) # reversed order
+
+ with support.EnvironmentVarGuard() as env:
+ del env['LINES']
+ del env['COLUMNS']
+ actual = shutil.get_terminal_size()
+ self.assertEqual(expected, actual)
def test_main():
- support.run_unittest(TestShutil, TestMove, TestCopyFile)
+ support.run_unittest(TestShutil, TestMove, TestCopyFile,
+ TermsizeTests, TestWhich)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 8df1bf0..6be259b 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -1,17 +1,19 @@
-import errno
+import unittest
+from test import support
+from contextlib import closing
import gc
-import os
import pickle
import select
import signal
+import struct
import subprocess
-import sys
-import time
import traceback
-import unittest
-from test import support
-from contextlib import closing
+import sys, os, time, errno
from test.script_helper import assert_python_ok, spawn_python
+try:
+ import threading
+except ImportError:
+ threading = None
if sys.platform in ('os2', 'riscos'):
raise unittest.SkipTest("Can't test signal on %s" % sys.platform)
@@ -57,15 +59,9 @@ class InterProcessSignalTests(unittest.TestCase):
def handlerA(self, signum, frame):
self.a_called = True
- if support.verbose:
- print("handlerA invoked from signal %s at:\n%s" % (
- signum, self.format_frame(frame, limit=1)))
def handlerB(self, signum, frame):
self.b_called = True
- if support.verbose:
- print ("handlerB invoked from signal %s at:\n%s" % (
- signum, self.format_frame(frame, limit=1)))
raise HandlerBCalled(signum, self.format_frame(frame))
def wait(self, child):
@@ -92,8 +88,6 @@ class InterProcessSignalTests(unittest.TestCase):
# Let the sub-processes know who to send signals to.
pid = os.getpid()
- if support.verbose:
- print("test runner's pid is", pid)
child = ignoring_eintr(subprocess.Popen, ['kill', '-HUP', str(pid)])
if child:
@@ -117,8 +111,6 @@ class InterProcessSignalTests(unittest.TestCase):
except HandlerBCalled:
self.assertTrue(self.b_called)
self.assertFalse(self.a_called)
- if support.verbose:
- print("HandlerBCalled exception caught")
child = ignoring_eintr(subprocess.Popen, ['kill', '-USR2', str(pid)])
if child:
@@ -134,8 +126,7 @@ class InterProcessSignalTests(unittest.TestCase):
# may return early.
time.sleep(1)
except KeyboardInterrupt:
- if support.verbose:
- print("KeyboardInterrupt (the alarm() went off)")
+ pass
except:
self.fail("Some other exception woke us from pause: %s" %
traceback.format_exc())
@@ -191,7 +182,7 @@ class InterProcessSignalTests(unittest.TestCase):
@unittest.skipIf(sys.platform == "win32", "Not valid on Windows")
-class BasicSignalTests(unittest.TestCase):
+class PosixTests(unittest.TestCase):
def trivial_signal_handler(self, *args):
pass
@@ -233,31 +224,44 @@ class WindowsSignalTests(unittest.TestCase):
@unittest.skipIf(sys.platform == "win32", "Not valid on Windows")
class WakeupSignalTests(unittest.TestCase):
- def check_wakeup(self, test_body):
- # use a subprocess to have only one thread and to not change signal
- # handling of the parent process
+ def check_wakeup(self, test_body, *signals, ordered=True):
+ # use a subprocess to have only one thread
code = """if 1:
import fcntl
import os
import signal
+ import struct
+
+ signals = {!r}
def handler(signum, frame):
pass
+ def check_signum(signals):
+ data = os.read(read, len(signals)+1)
+ raised = struct.unpack('%uB' % len(data), data)
+ if not {!r}:
+ raised = set(raised)
+ signals = set(signals)
+ if raised != signals:
+ raise Exception("%r != %r" % (raised, signals))
+
{}
signal.signal(signal.SIGALRM, handler)
read, write = os.pipe()
- flags = fcntl.fcntl(write, fcntl.F_GETFL, 0)
- flags = flags | os.O_NONBLOCK
- fcntl.fcntl(write, fcntl.F_SETFL, flags)
+ for fd in (read, write):
+ flags = fcntl.fcntl(fd, fcntl.F_GETFL, 0)
+ flags = flags | os.O_NONBLOCK
+ fcntl.fcntl(fd, fcntl.F_SETFL, flags)
signal.set_wakeup_fd(write)
test()
+ check_signum(signals)
os.close(read)
os.close(write)
- """.format(test_body)
+ """.format(signals, ordered, test_body)
assert_python_ok('-c', code)
@@ -283,7 +287,7 @@ class WakeupSignalTests(unittest.TestCase):
dt = after_time - mid_time
if dt >= TIMEOUT_HALF:
raise Exception("%s >= %s" % (dt, TIMEOUT_HALF))
- """)
+ """, signal.SIGALRM)
def test_wakeup_fd_during(self):
self.check_wakeup("""def test():
@@ -306,7 +310,32 @@ class WakeupSignalTests(unittest.TestCase):
dt = after_time - before_time
if dt >= TIMEOUT_HALF:
raise Exception("%s >= %s" % (dt, TIMEOUT_HALF))
- """)
+ """, signal.SIGALRM)
+
+ def test_signum(self):
+ self.check_wakeup("""def test():
+ signal.signal(signal.SIGUSR1, handler)
+ os.kill(os.getpid(), signal.SIGUSR1)
+ os.kill(os.getpid(), signal.SIGALRM)
+ """, signal.SIGUSR1, signal.SIGALRM)
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ def test_pending(self):
+ self.check_wakeup("""def test():
+ signum1 = signal.SIGUSR1
+ signum2 = signal.SIGUSR2
+
+ signal.signal(signum1, handler)
+ signal.signal(signum2, handler)
+
+ signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2))
+ os.kill(os.getpid(), signum1)
+ os.kill(os.getpid(), signum2)
+ # Unblocking the 2 signals calls the C signal handler twice
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2))
+ """, signal.SIGUSR1, signal.SIGUSR2, ordered=False)
+
@unittest.skipIf(sys.platform == "win32", "Not valid on Windows")
class SiginterruptTest(unittest.TestCase):
@@ -316,9 +345,6 @@ class SiginterruptTest(unittest.TestCase):
read is interrupted by the signal and raises an exception. Return False
if it returns normally.
"""
- class Timeout(Exception):
- pass
-
# use a subprocess to have only one thread, to have a timeout on the
# blocking read and to not touch signal handling in this process
code = """if 1:
@@ -359,18 +385,8 @@ class SiginterruptTest(unittest.TestCase):
# wait until the child process is loaded and has started
first_line = process.stdout.readline()
- # Wait the process with a timeout of 5 seconds
- timeout = time.time() + 5.0
- while True:
- if timeout < time.time():
- raise Timeout()
- status = process.poll()
- if status is not None:
- break
- time.sleep(0.1)
-
- stdout, stderr = process.communicate()
- except Timeout:
+ stdout, stderr = process.communicate(timeout=5.0)
+ except subprocess.TimeoutExpired:
process.kill()
return False
else:
@@ -419,8 +435,6 @@ class ItimerTest(unittest.TestCase):
def sig_alrm(self, *args):
self.hndl_called = True
- if support.verbose:
- print("SIGALRM handler invoked", args)
def sig_vtalrm(self, *args):
self.hndl_called = True
@@ -432,21 +446,13 @@ class ItimerTest(unittest.TestCase):
elif self.hndl_count == 3:
# disable ITIMER_VIRTUAL, this function shouldn't be called anymore
signal.setitimer(signal.ITIMER_VIRTUAL, 0)
- if support.verbose:
- print("last SIGVTALRM handler call")
self.hndl_count += 1
- if support.verbose:
- print("SIGVTALRM handler invoked", args)
-
def sig_prof(self, *args):
self.hndl_called = True
signal.setitimer(signal.ITIMER_PROF, 0)
- if support.verbose:
- print("SIGPROF handler invoked", args)
-
def test_itimer_exc(self):
# XXX I'm assuming -1 is an invalid itimer, but maybe some platform
# defines it ?
@@ -459,10 +465,7 @@ class ItimerTest(unittest.TestCase):
def test_itimer_real(self):
self.itimer = signal.ITIMER_REAL
signal.setitimer(self.itimer, 1.0)
- if support.verbose:
- print("\ncall pause()...")
signal.pause()
-
self.assertEqual(self.hndl_called, True)
# Issue 3864, unknown if this affects earlier versions of freebsd also
@@ -511,11 +514,359 @@ class ItimerTest(unittest.TestCase):
# and the handler should have been called
self.assertEqual(self.hndl_called, True)
+
+class PendingSignalsTests(unittest.TestCase):
+ """
+ Test pthread_sigmask(), pthread_kill(), sigpending() and sigwait()
+ functions.
+ """
+ @unittest.skipUnless(hasattr(signal, 'sigpending'),
+ 'need signal.sigpending()')
+ def test_sigpending_empty(self):
+ self.assertEqual(signal.sigpending(), set())
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ @unittest.skipUnless(hasattr(signal, 'sigpending'),
+ 'need signal.sigpending()')
+ def test_sigpending(self):
+ code = """if 1:
+ import os
+ import signal
+
+ def handler(signum, frame):
+ 1/0
+
+ signum = signal.SIGUSR1
+ signal.signal(signum, handler)
+
+ signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
+ os.kill(os.getpid(), signum)
+ pending = signal.sigpending()
+ if pending != {signum}:
+ raise Exception('%s != {%s}' % (pending, signum))
+ try:
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
+ except ZeroDivisionError:
+ pass
+ else:
+ raise Exception("ZeroDivisionError not raised")
+ """
+ assert_python_ok('-c', code)
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_kill'),
+ 'need signal.pthread_kill()')
+ def test_pthread_kill(self):
+ code = """if 1:
+ import signal
+ import threading
+ import sys
+
+ signum = signal.SIGUSR1
+
+ def handler(signum, frame):
+ 1/0
+
+ signal.signal(signum, handler)
+
+ if sys.platform == 'freebsd6':
+ # Issue #12392 and #12469: send a signal to the main thread
+ # doesn't work before the creation of the first thread on
+ # FreeBSD 6
+ def noop():
+ pass
+ thread = threading.Thread(target=noop)
+ thread.start()
+ thread.join()
+
+ tid = threading.get_ident()
+ try:
+ signal.pthread_kill(tid, signum)
+ except ZeroDivisionError:
+ pass
+ else:
+ raise Exception("ZeroDivisionError not raised")
+ """
+ assert_python_ok('-c', code)
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ def wait_helper(self, blocked, test):
+ """
+ test: body of the "def test(signum):" function.
+ blocked: number of the blocked signal
+ """
+ code = '''if 1:
+ import signal
+ import sys
+
+ def handler(signum, frame):
+ 1/0
+
+ %s
+
+ blocked = %s
+ signum = signal.SIGALRM
+
+ # child: block and wait the signal
+ try:
+ signal.signal(signum, handler)
+ signal.pthread_sigmask(signal.SIG_BLOCK, [blocked])
+
+ # Do the tests
+ test(signum)
+
+ # The handler must not be called on unblock
+ try:
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, [blocked])
+ except ZeroDivisionError:
+ print("the signal handler has been called",
+ file=sys.stderr)
+ sys.exit(1)
+ except BaseException as err:
+ print("error: {}".format(err), file=sys.stderr)
+ sys.stderr.flush()
+ sys.exit(1)
+ ''' % (test.strip(), blocked)
+
+ # sig*wait* must be called with the signal blocked: since the current
+ # process might have several threads running, use a subprocess to have
+ # a single thread.
+ assert_python_ok('-c', code)
+
+ @unittest.skipUnless(hasattr(signal, 'sigwait'),
+ 'need signal.sigwait()')
+ def test_sigwait(self):
+ self.wait_helper(signal.SIGALRM, '''
+ def test(signum):
+ signal.alarm(1)
+ received = signal.sigwait([signum])
+ if received != signum:
+ raise Exception('received %s, not %s' % (received, signum))
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'),
+ 'need signal.sigwaitinfo()')
+ def test_sigwaitinfo(self):
+ self.wait_helper(signal.SIGALRM, '''
+ def test(signum):
+ signal.alarm(1)
+ info = signal.sigwaitinfo([signum])
+ if info.si_signo != signum:
+ raise Exception("info.si_signo != %s" % signum)
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigtimedwait'),
+ 'need signal.sigtimedwait()')
+ def test_sigtimedwait(self):
+ self.wait_helper(signal.SIGALRM, '''
+ def test(signum):
+ signal.alarm(1)
+ info = signal.sigtimedwait([signum], 10.1000)
+ if info.si_signo != signum:
+ raise Exception('info.si_signo != %s' % signum)
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigtimedwait'),
+ 'need signal.sigtimedwait()')
+ def test_sigtimedwait_poll(self):
+ # check that polling with sigtimedwait works
+ self.wait_helper(signal.SIGALRM, '''
+ def test(signum):
+ import os
+ os.kill(os.getpid(), signum)
+ info = signal.sigtimedwait([signum], 0)
+ if info.si_signo != signum:
+ raise Exception('info.si_signo != %s' % signum)
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigtimedwait'),
+ 'need signal.sigtimedwait()')
+ def test_sigtimedwait_timeout(self):
+ self.wait_helper(signal.SIGALRM, '''
+ def test(signum):
+ received = signal.sigtimedwait([signum], 1.0)
+ if received is not None:
+ raise Exception("received=%r" % (received,))
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigtimedwait'),
+ 'need signal.sigtimedwait()')
+ def test_sigtimedwait_negative_timeout(self):
+ signum = signal.SIGALRM
+ self.assertRaises(ValueError, signal.sigtimedwait, [signum], -1.0)
+
+ @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'),
+ 'need signal.sigwaitinfo()')
+ def test_sigwaitinfo_interrupted(self):
+ self.wait_helper(signal.SIGUSR1, '''
+ def test(signum):
+ import errno
+
+ hndl_called = True
+ def alarm_handler(signum, frame):
+ hndl_called = False
+
+ signal.signal(signal.SIGALRM, alarm_handler)
+ signal.alarm(1)
+ try:
+ signal.sigwaitinfo([signal.SIGUSR1])
+ except OSError as e:
+ if e.errno == errno.EINTR:
+ if not hndl_called:
+ raise Exception("SIGALRM handler not called")
+ else:
+ raise Exception("Expected EINTR to be raised by sigwaitinfo")
+ else:
+ raise Exception("Expected EINTR to be raised by sigwaitinfo")
+ ''')
+
+ @unittest.skipUnless(hasattr(signal, 'sigwait'),
+ 'need signal.sigwait()')
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ @unittest.skipIf(threading is None, "test needs threading module")
+ def test_sigwait_thread(self):
+ # Check that calling sigwait() from a thread doesn't suspend the whole
+ # process. A new interpreter is spawned to avoid problems when mixing
+ # threads and fork(): only async-safe functions are allowed between
+ # fork() and exec().
+ assert_python_ok("-c", """if True:
+ import os, threading, sys, time, signal
+
+ # the default handler terminates the process
+ signum = signal.SIGUSR1
+
+ def kill_later():
+ # wait until the main thread is waiting in sigwait()
+ time.sleep(1)
+ os.kill(os.getpid(), signum)
+
+ # the signal must be blocked by all the threads
+ signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
+ killer = threading.Thread(target=kill_later)
+ killer.start()
+ received = signal.sigwait([signum])
+ if received != signum:
+ print("sigwait() received %s, not %s" % (received, signum),
+ file=sys.stderr)
+ sys.exit(1)
+ killer.join()
+ # unblock the signal, which should have been cleared by sigwait()
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
+ """)
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ def test_pthread_sigmask_arguments(self):
+ self.assertRaises(TypeError, signal.pthread_sigmask)
+ self.assertRaises(TypeError, signal.pthread_sigmask, 1)
+ self.assertRaises(TypeError, signal.pthread_sigmask, 1, 2, 3)
+ self.assertRaises(OSError, signal.pthread_sigmask, 1700, [])
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ def test_pthread_sigmask(self):
+ code = """if 1:
+ import signal
+ import os; import threading
+
+ def handler(signum, frame):
+ 1/0
+
+ def kill(signum):
+ os.kill(os.getpid(), signum)
+
+ def read_sigmask():
+ return signal.pthread_sigmask(signal.SIG_BLOCK, [])
+
+ signum = signal.SIGUSR1
+
+ # Install our signal handler
+ old_handler = signal.signal(signum, handler)
+
+ # Unblock SIGUSR1 (and copy the old mask) to test our signal handler
+ old_mask = signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
+ try:
+ kill(signum)
+ except ZeroDivisionError:
+ pass
+ else:
+ raise Exception("ZeroDivisionError not raised")
+
+ # Block and then raise SIGUSR1. The signal is blocked: the signal
+ # handler is not called, and the signal is now pending
+ signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
+ kill(signum)
+
+ # Check the new mask
+ blocked = read_sigmask()
+ if signum not in blocked:
+ raise Exception("%s not in %s" % (signum, blocked))
+ if old_mask ^ blocked != {signum}:
+ raise Exception("%s ^ %s != {%s}" % (old_mask, blocked, signum))
+
+ # Unblock SIGUSR1
+ try:
+ # unblock the pending signal calls immediatly the signal handler
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
+ except ZeroDivisionError:
+ pass
+ else:
+ raise Exception("ZeroDivisionError not raised")
+ try:
+ kill(signum)
+ except ZeroDivisionError:
+ pass
+ else:
+ raise Exception("ZeroDivisionError not raised")
+
+ # Check the new mask
+ unblocked = read_sigmask()
+ if signum in unblocked:
+ raise Exception("%s in %s" % (signum, unblocked))
+ if blocked ^ unblocked != {signum}:
+ raise Exception("%s ^ %s != {%s}" % (blocked, unblocked, signum))
+ if old_mask != unblocked:
+ raise Exception("%s != %s" % (old_mask, unblocked))
+ """
+ assert_python_ok('-c', code)
+
+ @unittest.skipIf(sys.platform == 'freebsd6',
+ "issue #12392: send a signal to the main thread doesn't work "
+ "before the creation of the first thread on FreeBSD 6")
+ @unittest.skipUnless(hasattr(signal, 'pthread_kill'),
+ 'need signal.pthread_kill()')
+ def test_pthread_kill_main_thread(self):
+ # Test that a signal can be sent to the main thread with pthread_kill()
+ # before any other thread has been created (see issue #12392).
+ code = """if True:
+ import threading
+ import signal
+ import sys
+
+ def handler(signum, frame):
+ sys.exit(3)
+
+ signal.signal(signal.SIGUSR1, handler)
+ signal.pthread_kill(threading.get_ident(), signal.SIGUSR1)
+ sys.exit(2)
+ """
+
+ with spawn_python('-c', code) as process:
+ stdout, stderr = process.communicate()
+ exitcode = process.wait()
+ if exitcode != 3:
+ raise Exception("Child error (exit code %s): %s" %
+ (exitcode, stdout))
+
+
def test_main():
try:
- support.run_unittest(BasicSignalTests, InterProcessSignalTests,
+ support.run_unittest(PosixTests, InterProcessSignalTests,
WakeupSignalTests, SiginterruptTest,
- ItimerTest, WindowsSignalTests)
+ ItimerTest, WindowsSignalTests,
+ PendingSignalsTests)
finally:
support.reap_children()
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index ba42649..29286c7 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -39,6 +39,7 @@ class HelperFunctionsTests(unittest.TestCase):
self.old_base = site.USER_BASE
self.old_site = site.USER_SITE
self.old_prefixes = site.PREFIXES
+ self.original_vars = sysconfig._CONFIG_VARS
self.old_vars = copy(sysconfig._CONFIG_VARS)
def tearDown(self):
@@ -47,7 +48,9 @@ class HelperFunctionsTests(unittest.TestCase):
site.USER_BASE = self.old_base
site.USER_SITE = self.old_site
site.PREFIXES = self.old_prefixes
- sysconfig._CONFIG_VARS = self.old_vars
+ sysconfig._CONFIG_VARS = self.original_vars
+ sysconfig._CONFIG_VARS.clear()
+ sysconfig._CONFIG_VARS.update(self.old_vars)
def test_makepath(self):
# Test makepath() have an absolute path for its first return value
diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py
index 68ccc29..93f14c4 100644
--- a/Lib/test/test_smtpd.py
+++ b/Lib/test/test_smtpd.py
@@ -1,4 +1,4 @@
-from unittest import TestCase
+import unittest
from test import support, mock_socket
import socket
import io
@@ -26,7 +26,7 @@ class BrokenDummyServer(DummyServer):
raise DummyDispatcherBroken()
-class SMTPDServerTest(TestCase):
+class SMTPDServerTest(unittest.TestCase):
def setUp(self):
smtpd.socket = asyncore.socket = mock_socket
@@ -39,6 +39,7 @@ class SMTPDServerTest(TestCase):
channel.socket.queue_recv(line)
channel.handle_read()
+ write_line(b'HELO example')
write_line(b'MAIL From:eggs@example')
write_line(b'RCPT To:spam@example')
write_line(b'DATA')
@@ -49,7 +50,7 @@ class SMTPDServerTest(TestCase):
asyncore.socket = smtpd.socket = socket
-class SMTPDChannelTest(TestCase):
+class SMTPDChannelTest(unittest.TestCase):
def setUp(self):
smtpd.socket = asyncore.socket = mock_socket
self.old_debugstream = smtpd.DEBUGSTREAM
@@ -78,31 +79,94 @@ class SMTPDChannelTest(TestCase):
self.assertEqual(self.channel.socket.last,
b'500 Error: bad syntax\r\n')
- def test_EHLO_not_implemented(self):
- self.write_line(b'EHLO test.example')
+ def test_EHLO(self):
+ self.write_line(b'EHLO example')
+ self.assertEqual(self.channel.socket.last, b'250 HELP\r\n')
+
+ def test_EHLO_bad_syntax(self):
+ self.write_line(b'EHLO')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: EHLO hostname\r\n')
+
+ def test_EHLO_duplicate(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'EHLO example')
self.assertEqual(self.channel.socket.last,
- b'502 Error: command "EHLO" not implemented\r\n')
+ b'503 Duplicate HELO/EHLO\r\n')
+
+ def test_EHLO_HELO_duplicate(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'HELO example')
+ self.assertEqual(self.channel.socket.last,
+ b'503 Duplicate HELO/EHLO\r\n')
def test_HELO(self):
name = smtpd.socket.getfqdn()
- self.write_line(b'HELO test.example')
+ self.write_line(b'HELO example')
self.assertEqual(self.channel.socket.last,
'250 {}\r\n'.format(name).encode('ascii'))
+ def test_HELO_EHLO_duplicate(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'EHLO example')
+ self.assertEqual(self.channel.socket.last,
+ b'503 Duplicate HELO/EHLO\r\n')
+
+ def test_HELP(self):
+ self.write_line(b'HELP')
+ self.assertEqual(self.channel.socket.last,
+ b'250 Supported commands: EHLO HELO MAIL RCPT ' + \
+ b'DATA RSET NOOP QUIT VRFY\r\n')
+
+ def test_HELP_command(self):
+ self.write_line(b'HELP MAIL')
+ self.assertEqual(self.channel.socket.last,
+ b'250 Syntax: MAIL FROM: <address>\r\n')
+
+ def test_HELP_command_unknown(self):
+ self.write_line(b'HELP SPAM')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Supported commands: EHLO HELO MAIL RCPT ' + \
+ b'DATA RSET NOOP QUIT VRFY\r\n')
+
def test_HELO_bad_syntax(self):
self.write_line(b'HELO')
self.assertEqual(self.channel.socket.last,
b'501 Syntax: HELO hostname\r\n')
def test_HELO_duplicate(self):
- self.write_line(b'HELO test.example')
- self.write_line(b'HELO test.example')
+ self.write_line(b'HELO example')
+ self.write_line(b'HELO example')
self.assertEqual(self.channel.socket.last,
b'503 Duplicate HELO/EHLO\r\n')
+ def test_HELO_parameter_rejected_when_extensions_not_enabled(self):
+ self.extended_smtp = False
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL from:<foo@example.com> SIZE=1234')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: MAIL FROM: <address>\r\n')
+
+ def test_MAIL_allows_space_after_colon(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL from: <foo@example.com>')
+ self.assertEqual(self.channel.socket.last,
+ b'250 OK\r\n')
+
+ def test_extended_MAIL_allows_space_after_colon(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from: <foo@example.com> size=20')
+ self.assertEqual(self.channel.socket.last,
+ b'250 OK\r\n')
+
def test_NOOP(self):
self.write_line(b'NOOP')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ def test_HELO_NOOP(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'NOOP')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
def test_NOOP_bad_syntax(self):
self.write_line(b'NOOP hi')
@@ -113,26 +177,47 @@ class SMTPDChannelTest(TestCase):
self.write_line(b'QUIT')
self.assertEqual(self.channel.socket.last, b'221 Bye\r\n')
+ def test_HELO_QUIT(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'QUIT')
+ self.assertEqual(self.channel.socket.last, b'221 Bye\r\n')
+
def test_QUIT_arg_ignored(self):
self.write_line(b'QUIT bye bye')
self.assertEqual(self.channel.socket.last, b'221 Bye\r\n')
def test_bad_state(self):
self.channel.smtp_state = 'BAD STATE'
- self.write_line(b'HELO')
+ self.write_line(b'HELO example')
self.assertEqual(self.channel.socket.last,
b'451 Internal confusion\r\n')
def test_command_too_long(self):
- self.write_line(b'MAIL from ' +
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL from: ' +
b'a' * self.channel.command_size_limit +
b'@example')
self.assertEqual(self.channel.socket.last,
b'500 Error: line too long\r\n')
- def test_data_too_long(self):
- # Small hack. Setting limit to 2K octets here will save us some time.
- self.channel.data_size_limit = 2048
+ def test_MAIL_command_limit_extended_with_SIZE(self):
+ self.write_line(b'EHLO example')
+ fill_len = self.channel.command_size_limit - len('MAIL from:<@example>')
+ self.write_line(b'MAIL from:<' +
+ b'a' * fill_len +
+ b'@example> SIZE=1234')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ self.write_line(b'MAIL from:<' +
+ b'a' * (fill_len + 26) +
+ b'@example> SIZE=1234')
+ self.assertEqual(self.channel.socket.last,
+ b'500 Error: line too long\r\n')
+
+ def test_data_longer_than_default_data_size_limit(self):
+ # Hack the default so we don't have to generate so much data.
+ self.channel.data_size_limit = 1048
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'DATA')
@@ -141,64 +226,183 @@ class SMTPDChannelTest(TestCase):
self.assertEqual(self.channel.socket.last,
b'552 Error: Too much mail data\r\n')
+ def test_MAIL_size_parameter(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL FROM:<eggs@example> SIZE=512')
+ self.assertEqual(self.channel.socket.last,
+ b'250 OK\r\n')
+
+ def test_MAIL_invalid_size_parameter(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL FROM:<eggs@example> SIZE=invalid')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: MAIL FROM: <address> [SP <mail-parameters>]\r\n')
+
+ def test_MAIL_RCPT_unknown_parameters(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL FROM:<eggs@example> ham=green')
+ self.assertEqual(self.channel.socket.last,
+ b'555 MAIL FROM parameters not recognized or not implemented\r\n')
+
+ self.write_line(b'MAIL FROM:<eggs@example>')
+ self.write_line(b'RCPT TO:<eggs@example> ham=green')
+ self.assertEqual(self.channel.socket.last,
+ b'555 RCPT TO parameters not recognized or not implemented\r\n')
+
+ def test_MAIL_size_parameter_larger_than_default_data_size_limit(self):
+ self.channel.data_size_limit = 1048
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL FROM:<eggs@example> SIZE=2096')
+ self.assertEqual(self.channel.socket.last,
+ b'552 Error: message size exceeds fixed maximum message size\r\n')
+
def test_need_MAIL(self):
+ self.write_line(b'HELO example')
self.write_line(b'RCPT to:spam@example')
self.assertEqual(self.channel.socket.last,
b'503 Error: need MAIL command\r\n')
- def test_MAIL_syntax(self):
+ def test_MAIL_syntax_HELO(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL from eggs@example')
self.assertEqual(self.channel.socket.last,
- b'501 Syntax: MAIL FROM:<address>\r\n')
+ b'501 Syntax: MAIL FROM: <address>\r\n')
- def test_MAIL_missing_from(self):
+ def test_MAIL_syntax_EHLO(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from eggs@example')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: MAIL FROM: <address> [SP <mail-parameters>]\r\n')
+
+ def test_MAIL_missing_address(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL from:')
self.assertEqual(self.channel.socket.last,
- b'501 Syntax: MAIL FROM:<address>\r\n')
+ b'501 Syntax: MAIL FROM: <address>\r\n')
def test_MAIL_chevrons(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL from:<eggs@example>')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ def test_MAIL_empty_chevrons(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from:<>')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ def test_MAIL_quoted_localpart(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from: <"Fred Blogs"@example.com>')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.assertEqual(self.channel.mailfrom, '"Fred Blogs"@example.com')
+
+ def test_MAIL_quoted_localpart_no_angles(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from: "Fred Blogs"@example.com')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.assertEqual(self.channel.mailfrom, '"Fred Blogs"@example.com')
+
+ def test_MAIL_quoted_localpart_with_size(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from: <"Fred Blogs"@example.com> SIZE=1000')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.assertEqual(self.channel.mailfrom, '"Fred Blogs"@example.com')
+
+ def test_MAIL_quoted_localpart_with_size_no_angles(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL from: "Fred Blogs"@example.com SIZE=1000')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.assertEqual(self.channel.mailfrom, '"Fred Blogs"@example.com')
def test_nested_MAIL(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL from:eggs@example')
self.write_line(b'MAIL from:spam@example')
self.assertEqual(self.channel.socket.last,
b'503 Error: nested MAIL command\r\n')
+ def test_VRFY(self):
+ self.write_line(b'VRFY eggs@example')
+ self.assertEqual(self.channel.socket.last,
+ b'252 Cannot VRFY user, but will accept message and attempt ' + \
+ b'delivery\r\n')
+
+ def test_VRFY_syntax(self):
+ self.write_line(b'VRFY')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: VRFY <address>\r\n')
+
+ def test_EXPN_not_implemented(self):
+ self.write_line(b'EXPN')
+ self.assertEqual(self.channel.socket.last,
+ b'502 EXPN not implemented\r\n')
+
+ def test_no_HELO_MAIL(self):
+ self.write_line(b'MAIL from:<foo@example.com>')
+ self.assertEqual(self.channel.socket.last,
+ b'503 Error: send HELO first\r\n')
+
def test_need_RCPT(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'DATA')
self.assertEqual(self.channel.socket.last,
b'503 Error: need RCPT command\r\n')
- def test_RCPT_syntax(self):
- self.write_line(b'MAIL From:eggs@example')
+ def test_RCPT_syntax_HELO(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL From: eggs@example')
self.write_line(b'RCPT to eggs@example')
self.assertEqual(self.channel.socket.last,
b'501 Syntax: RCPT TO: <address>\r\n')
+ def test_RCPT_syntax_EHLO(self):
+ self.write_line(b'EHLO example')
+ self.write_line(b'MAIL From: eggs@example')
+ self.write_line(b'RCPT to eggs@example')
+ self.assertEqual(self.channel.socket.last,
+ b'501 Syntax: RCPT TO: <address> [SP <mail-parameters>]\r\n')
+
+ def test_RCPT_lowercase_to_OK(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL From: eggs@example')
+ self.write_line(b'RCPT to: <eggs@example>')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ def test_no_HELO_RCPT(self):
+ self.write_line(b'RCPT to eggs@example')
+ self.assertEqual(self.channel.socket.last,
+ b'503 Error: send HELO first\r\n')
+
def test_data_dialog(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
self.write_line(b'RCPT To:spam@example')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
self.write_line(b'DATA')
self.assertEqual(self.channel.socket.last,
b'354 End data with <CR><LF>.<CR><LF>\r\n')
self.write_line(b'data\r\nmore\r\n.')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
self.assertEqual(self.server.messages,
[('peer', 'eggs@example', ['spam@example'], 'data\nmore')])
def test_DATA_syntax(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'DATA spam')
self.assertEqual(self.channel.socket.last, b'501 Syntax: DATA\r\n')
+ def test_no_HELO_DATA(self):
+ self.write_line(b'DATA spam')
+ self.assertEqual(self.channel.socket.last,
+ b'503 Error: send HELO first\r\n')
+
def test_data_transparency_section_4_5_2(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'DATA')
@@ -206,6 +410,7 @@ class SMTPDChannelTest(TestCase):
self.assertEqual(self.channel.received_data, '.')
def test_multiple_RCPT(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'RCPT To:ham@example')
@@ -216,6 +421,7 @@ class SMTPDChannelTest(TestCase):
def test_manual_status(self):
# checks that the Channel is able to return a custom status message
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'DATA')
@@ -223,10 +429,11 @@ class SMTPDChannelTest(TestCase):
self.assertEqual(self.channel.socket.last, b'250 Okish\r\n')
def test_RSET(self):
+ self.write_line(b'HELO example')
self.write_line(b'MAIL From:eggs@example')
self.write_line(b'RCPT To:spam@example')
self.write_line(b'RSET')
- self.assertEqual(self.channel.socket.last, b'250 Ok\r\n')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
self.write_line(b'MAIL From:foo@example')
self.write_line(b'RCPT To:eggs@example')
self.write_line(b'DATA')
@@ -234,58 +441,117 @@ class SMTPDChannelTest(TestCase):
self.assertEqual(self.server.messages,
[('peer', 'foo@example', ['eggs@example'], 'data')])
+ def test_HELO_RSET(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'RSET')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
def test_RSET_syntax(self):
self.write_line(b'RSET hi')
self.assertEqual(self.channel.socket.last, b'501 Syntax: RSET\r\n')
+ def test_unknown_command(self):
+ self.write_line(b'UNKNOWN_CMD')
+ self.assertEqual(self.channel.socket.last,
+ b'500 Error: command "UNKNOWN_CMD" not ' + \
+ b'recognized\r\n')
+
def test_attribute_deprecations(self):
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__server
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__server = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__line
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__line = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__state
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__state = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__greeting
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__greeting = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__mailfrom
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__mailfrom = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__rcpttos
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__rcpttos = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__data
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__data = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__fqdn
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__fqdn = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__peer
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__peer = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__conn
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__conn = 'spam'
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
spam = self.channel._SMTPChannel__addr
- with support.check_warnings(('', PendingDeprecationWarning)):
+ with support.check_warnings(('', DeprecationWarning)):
self.channel._SMTPChannel__addr = 'spam'
-def test_main():
- support.run_unittest(SMTPDServerTest, SMTPDChannelTest)
+
+class SMTPDChannelWithDataSizeLimitTest(unittest.TestCase):
+
+ def setUp(self):
+ smtpd.socket = asyncore.socket = mock_socket
+ self.old_debugstream = smtpd.DEBUGSTREAM
+ self.debug = smtpd.DEBUGSTREAM = io.StringIO()
+ self.server = DummyServer('a', 'b')
+ conn, addr = self.server.accept()
+ # Set DATA size limit to 32 bytes for easy testing
+ self.channel = smtpd.SMTPChannel(self.server, conn, addr, 32)
+
+ def tearDown(self):
+ asyncore.close_all()
+ asyncore.socket = smtpd.socket = socket
+ smtpd.DEBUGSTREAM = self.old_debugstream
+
+ def write_line(self, line):
+ self.channel.socket.queue_recv(line)
+ self.channel.handle_read()
+
+ def test_data_limit_dialog(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL From:eggs@example')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.write_line(b'RCPT To:spam@example')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ self.write_line(b'DATA')
+ self.assertEqual(self.channel.socket.last,
+ b'354 End data with <CR><LF>.<CR><LF>\r\n')
+ self.write_line(b'data\r\nmore\r\n.')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.assertEqual(self.server.messages,
+ [('peer', 'eggs@example', ['spam@example'], 'data\nmore')])
+
+ def test_data_limit_dialog_too_much_data(self):
+ self.write_line(b'HELO example')
+ self.write_line(b'MAIL From:eggs@example')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+ self.write_line(b'RCPT To:spam@example')
+ self.assertEqual(self.channel.socket.last, b'250 OK\r\n')
+
+ self.write_line(b'DATA')
+ self.assertEqual(self.channel.socket.last,
+ b'354 End data with <CR><LF>.<CR><LF>\r\n')
+ self.write_line(b'This message is longer than 32 bytes\r\n.')
+ self.assertEqual(self.channel.socket.last,
+ b'552 Error: Too much mail data\r\n')
+
if __name__ == "__main__":
- test_main()
+ unittest.main()
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
index 2cb0d1a..befc49e 100644
--- a/Lib/test/test_smtplib.py
+++ b/Lib/test/test_smtplib.py
@@ -9,6 +9,7 @@ import re
import sys
import time
import select
+import errno
import unittest
from test import support, mock_socket
@@ -72,6 +73,14 @@ class GeneralTests(unittest.TestCase):
smtp = smtplib.SMTP(HOST, self.port)
smtp.close()
+ def testSourceAddress(self):
+ mock_socket.reply_with(b"220 Hola mundo")
+ # connects
+ smtp = smtplib.SMTP(HOST, self.port,
+ source_address=('127.0.0.1',19876))
+ self.assertEqual(smtp.source_address, ('127.0.0.1', 19876))
+ smtp.close()
+
def testBasic2(self):
mock_socket.reply_with(b"220 Hola mundo")
# connects, include port in host name
@@ -204,15 +213,29 @@ class DebuggingServerTests(unittest.TestCase):
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
smtp.quit()
+ def testSourceAddress(self):
+ # connect
+ port = support.find_unused_port()
+ try:
+ smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost',
+ timeout=3, source_address=('127.0.0.1', port))
+ self.assertEqual(smtp.source_address, ('127.0.0.1', port))
+ self.assertEqual(smtp.local_hostname, 'localhost')
+ smtp.quit()
+ except IOError as e:
+ if e.errno == errno.EADDRINUSE:
+ self.skipTest("couldn't bind to port %d" % port)
+ raise
+
def testNOOP(self):
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
- expected = (250, b'Ok')
+ expected = (250, b'OK')
self.assertEqual(smtp.noop(), expected)
smtp.quit()
def testRSET(self):
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
- expected = (250, b'Ok')
+ expected = (250, b'OK')
self.assertEqual(smtp.rset(), expected)
smtp.quit()
@@ -223,10 +246,18 @@ class DebuggingServerTests(unittest.TestCase):
self.assertEqual(smtp.ehlo(), expected)
smtp.quit()
+ def testNotImplemented(self):
+ # EXPN isn't implemented in DebuggingServer
+ smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
+ expected = (502, b'EXPN not implemented')
+ smtp.putcmd('EXPN')
+ self.assertEqual(smtp.getreply(), expected)
+ smtp.quit()
+
def testVRFY(self):
- # VRFY isn't implemented in DebuggingServer
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
- expected = (502, b'Error: command "VRFY" not implemented')
+ expected = (252, b'Cannot VRFY user, but will accept message ' + \
+ b'and attempt delivery')
self.assertEqual(smtp.vrfy('nobody@nowhere.com'), expected)
self.assertEqual(smtp.verify('nobody@nowhere.com'), expected)
smtp.quit()
@@ -242,7 +273,8 @@ class DebuggingServerTests(unittest.TestCase):
def testHELP(self):
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3)
- self.assertEqual(smtp.help(), b'Error: command "HELP" not implemented')
+ self.assertEqual(smtp.help(), b'Supported commands: EHLO HELO MAIL ' + \
+ b'RCPT DATA RSET NOOP QUIT VRFY')
smtp.quit()
def testSend(self):
@@ -560,6 +592,9 @@ sim_lists = {'list-1':['Mr.A@somewhere.com','Mrs.C@somewhereesle.com'],
# Simulated SMTP channel & server
class SimSMTPChannel(smtpd.SMTPChannel):
+ # For testing failures in QUIT when using the context manager API.
+ quit_response = None
+
def __init__(self, extra_features, *args, **kw):
self._extrafeatures = ''.join(
[ "250-{0}\r\n".format(x) for x in extra_features ])
@@ -610,19 +645,31 @@ class SimSMTPChannel(smtpd.SMTPChannel):
else:
self.push('550 No access for you!')
+ def smtp_QUIT(self, arg):
+ # args is ignored
+ if self.quit_response is None:
+ super(SimSMTPChannel, self).smtp_QUIT(arg)
+ else:
+ self.push(self.quit_response)
+ self.close_when_done()
+
def handle_error(self):
raise
class SimSMTPServer(smtpd.SMTPServer):
+ # For testing failures in QUIT when using the context manager API.
+ quit_response = None
+
def __init__(self, *args, **kw):
self._extra_features = []
smtpd.SMTPServer.__init__(self, *args, **kw)
def handle_accepted(self, conn, addr):
- self._SMTPchannel = SimSMTPChannel(self._extra_features,
- self, conn, addr)
+ self._SMTPchannel = SimSMTPChannel(
+ self._extra_features, self, conn, addr)
+ self._SMTPchannel.quit_response = self.quit_response
def process_message(self, peer, mailfrom, rcpttos, data):
pass
@@ -752,6 +799,25 @@ class SMTPSimTests(unittest.TestCase):
self.assertIn(sim_auth_credentials['cram-md5'], str(err))
smtp.close()
+ def test_with_statement(self):
+ with smtplib.SMTP(HOST, self.port) as smtp:
+ code, message = smtp.noop()
+ self.assertEqual(code, 250)
+ self.assertRaises(smtplib.SMTPServerDisconnected, smtp.send, b'foo')
+ with smtplib.SMTP(HOST, self.port) as smtp:
+ smtp.close()
+ self.assertRaises(smtplib.SMTPServerDisconnected, smtp.send, b'foo')
+
+ def test_with_statement_QUIT_failure(self):
+ self.serv.quit_response = '421 QUIT FAILED'
+ with self.assertRaises(smtplib.SMTPResponseException) as error:
+ with smtplib.SMTP(HOST, self.port) as smtp:
+ smtp.noop()
+ self.assertEqual(error.exception.smtp_code, 421)
+ self.assertEqual(error.exception.smtp_error, b'QUIT FAILED')
+ # We don't need to clean up self.serv.quit_response because a new
+ # server is always instantiated in the setUp().
+
#TODO: add tests for correct AUTH method fallback now that the
#test infrastructure can support it.
diff --git a/Lib/test/test_smtpnet.py b/Lib/test/test_smtpnet.py
index 0198ab6..86224ef 100644
--- a/Lib/test/test_smtpnet.py
+++ b/Lib/test/test_smtpnet.py
@@ -4,28 +4,60 @@ import unittest
from test import support
import smtplib
+ssl = support.import_module("ssl")
+
support.requires("network")
+
+class SmtpTest(unittest.TestCase):
+ testServer = 'smtp.gmail.com'
+ remotePort = 25
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+
+ def test_connect_starttls(self):
+ support.get_attribute(smtplib, 'SMTP_SSL')
+ with support.transient_internet(self.testServer):
+ server = smtplib.SMTP(self.testServer, self.remotePort)
+ try:
+ server.starttls(context=self.context)
+ except smtplib.SMTPException as e:
+ if e.args[0] == 'STARTTLS extension not supported by server.':
+ unittest.skip(e.args[0])
+ else:
+ raise
+ server.ehlo()
+ server.quit()
+
+
class SmtpSSLTest(unittest.TestCase):
testServer = 'smtp.gmail.com'
remotePort = 465
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
def test_connect(self):
support.get_attribute(smtplib, 'SMTP_SSL')
with support.transient_internet(self.testServer):
server = smtplib.SMTP_SSL(self.testServer, self.remotePort)
- server.ehlo()
- server.quit()
+ server.ehlo()
+ server.quit()
def test_connect_default_port(self):
support.get_attribute(smtplib, 'SMTP_SSL')
with support.transient_internet(self.testServer):
server = smtplib.SMTP_SSL(self.testServer)
- server.ehlo()
- server.quit()
+ server.ehlo()
+ server.quit()
+
+ def test_connect_using_sslcontext(self):
+ support.get_attribute(smtplib, 'SMTP_SSL')
+ with support.transient_internet(self.testServer):
+ server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=self.context)
+ server.ehlo()
+ server.quit()
+
def test_main():
- support.run_unittest(SmtpSSLTest)
+ support.run_unittest(SmtpTest, SmtpSSLTest)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index e40b21e..cb10921 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -2,11 +2,14 @@
import unittest
from test import support
+from unittest.case import _ExpectedFailure
import errno
import io
import socket
import select
+import tempfile
+import _testcapi
import time
import traceback
import queue
@@ -18,34 +21,19 @@ import contextlib
from weakref import proxy
import signal
import math
+import pickle
+import struct
try:
import fcntl
except ImportError:
fcntl = False
-
-def try_address(host, port=0, family=socket.AF_INET):
- """Try to bind a socket on the given host:port and return True
- if that has been possible."""
- try:
- sock = socket.socket(family, socket.SOCK_STREAM)
- sock.bind((host, port))
- except (socket.error, socket.gaierror):
- return False
- else:
- sock.close()
- return True
-
-def linux_version():
- try:
- # platform.release() is something like '2.6.33.7-desktop-2mnb'
- version_string = platform.release().split('-')[0]
- return tuple(map(int, version_string.split('.')))
- except ValueError:
- return 0, 0, 0
+try:
+ import multiprocessing
+except ImportError:
+ multiprocessing = False
HOST = support.HOST
-MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
-SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
+MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
try:
import _thread as thread
@@ -54,6 +42,33 @@ except ImportError:
thread = None
threading = None
+def _have_socket_can():
+ """Check whether CAN sockets are supported on this host."""
+ try:
+ s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ except (AttributeError, socket.error, OSError):
+ return False
+ else:
+ s.close()
+ return True
+
+def _have_socket_rds():
+ """Check whether RDS sockets are supported on this host."""
+ try:
+ s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
+ except (AttributeError, OSError):
+ return False
+ else:
+ s.close()
+ return True
+
+HAVE_SOCKET_CAN = _have_socket_can()
+
+HAVE_SOCKET_RDS = _have_socket_rds()
+
+# Size in bytes of the int type
+SIZEOF_INT = array.array("i").itemsize
+
class SocketTCPTest(unittest.TestCase):
def setUp(self):
@@ -75,6 +90,63 @@ class SocketUDPTest(unittest.TestCase):
self.serv.close()
self.serv = None
+class ThreadSafeCleanupTestCase(unittest.TestCase):
+ """Subclass of unittest.TestCase with thread-safe cleanup methods.
+
+ This subclass protects the addCleanup() and doCleanups() methods
+ with a recursive lock.
+ """
+
+ if threading:
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._cleanup_lock = threading.RLock()
+
+ def addCleanup(self, *args, **kwargs):
+ with self._cleanup_lock:
+ return super().addCleanup(*args, **kwargs)
+
+ def doCleanups(self, *args, **kwargs):
+ with self._cleanup_lock:
+ return super().doCleanups(*args, **kwargs)
+
+class SocketCANTest(unittest.TestCase):
+
+ """To be able to run this test, a `vcan0` CAN interface can be created with
+ the following commands:
+ # modprobe vcan
+ # ip link add dev vcan0 type vcan
+ # ifconfig vcan0 up
+ """
+ interface = 'vcan0'
+ bufsize = 128
+
+ def setUp(self):
+ self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ self.addCleanup(self.s.close)
+ try:
+ self.s.bind((self.interface,))
+ except socket.error:
+ self.skipTest('network interface `%s` does not exist' %
+ self.interface)
+
+
+class SocketRDSTest(unittest.TestCase):
+
+ """To be able to run this test, the `rds` kernel module must be loaded:
+ # modprobe rds
+ """
+ bufsize = 8192
+
+ def setUp(self):
+ self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
+ self.addCleanup(self.serv.close)
+ try:
+ self.port = support.bind_port(self.serv)
+ except OSError:
+ self.skipTest('unable to bind RDS socket')
+
+
class ThreadableTest:
"""Threadable Test class
@@ -132,6 +204,7 @@ class ThreadableTest:
self.client_ready = threading.Event()
self.done = threading.Event()
self.queue = queue.Queue(1)
+ self.server_crashed = False
# Do some munging to start the client test.
methodname = self.id()
@@ -141,8 +214,12 @@ class ThreadableTest:
self.client_thread = thread.start_new_thread(
self.clientRun, (test_method,))
- self.__setUp()
- if not self.server_ready.is_set():
+ try:
+ self.__setUp()
+ except:
+ self.server_crashed = True
+ raise
+ finally:
self.server_ready.set()
self.client_ready.wait()
@@ -158,10 +235,16 @@ class ThreadableTest:
self.server_ready.wait()
self.clientSetUp()
self.client_ready.set()
+ if self.server_crashed:
+ self.clientTearDown()
+ return
if not hasattr(test_func, '__call__'):
raise TypeError("test_func must be a callable function")
try:
test_func()
+ except _ExpectedFailure:
+ # We deliberately ignore expected failures
+ pass
except BaseException as e:
self.queue.put(e)
finally:
@@ -202,6 +285,48 @@ class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
self.cli = None
ThreadableTest.clientTearDown(self)
+class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
+
+ def __init__(self, methodName='runTest'):
+ SocketCANTest.__init__(self, methodName=methodName)
+ ThreadableTest.__init__(self)
+
+ def clientSetUp(self):
+ self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ try:
+ self.cli.bind((self.interface,))
+ except socket.error:
+ # skipTest should not be called here, and will be called in the
+ # server instead
+ pass
+
+ def clientTearDown(self):
+ self.cli.close()
+ self.cli = None
+ ThreadableTest.clientTearDown(self)
+
+class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
+
+ def __init__(self, methodName='runTest'):
+ SocketRDSTest.__init__(self, methodName=methodName)
+ ThreadableTest.__init__(self)
+
+ def clientSetUp(self):
+ self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
+ try:
+ # RDS sockets must be bound explicitly to send or receive data
+ self.cli.bind((HOST, 0))
+ self.cli_addr = self.cli.getsockname()
+ except OSError:
+ # skipTest should not be called here, and will be called in the
+ # server instead
+ pass
+
+ def clientTearDown(self):
+ self.cli.close()
+ self.cli = None
+ ThreadableTest.clientTearDown(self)
+
class SocketConnectedTest(ThreadedTCPSocketTest):
"""Socket tests for client-server connection.
@@ -257,6 +382,243 @@ class SocketPairTest(unittest.TestCase, ThreadableTest):
ThreadableTest.clientTearDown(self)
+# The following classes are used by the sendmsg()/recvmsg() tests.
+# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
+# gives a drop-in replacement for SocketConnectedTest, but different
+# address families can be used, and the attributes serv_addr and
+# cli_addr will be set to the addresses of the endpoints.
+
+class SocketTestBase(unittest.TestCase):
+ """A base class for socket tests.
+
+ Subclasses must provide methods newSocket() to return a new socket
+ and bindSock(sock) to bind it to an unused address.
+
+ Creates a socket self.serv and sets self.serv_addr to its address.
+ """
+
+ def setUp(self):
+ self.serv = self.newSocket()
+ self.bindServer()
+
+ def bindServer(self):
+ """Bind server socket and set self.serv_addr to its address."""
+ self.bindSock(self.serv)
+ self.serv_addr = self.serv.getsockname()
+
+ def tearDown(self):
+ self.serv.close()
+ self.serv = None
+
+
+class SocketListeningTestMixin(SocketTestBase):
+ """Mixin to listen on the server socket."""
+
+ def setUp(self):
+ super().setUp()
+ self.serv.listen(1)
+
+
+class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
+ ThreadableTest):
+ """Mixin to add client socket and allow client/server tests.
+
+ Client socket is self.cli and its address is self.cli_addr. See
+ ThreadableTest for usage information.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ ThreadableTest.__init__(self)
+
+ def clientSetUp(self):
+ self.cli = self.newClientSocket()
+ self.bindClient()
+
+ def newClientSocket(self):
+ """Return a new socket for use as client."""
+ return self.newSocket()
+
+ def bindClient(self):
+ """Bind client socket and set self.cli_addr to its address."""
+ self.bindSock(self.cli)
+ self.cli_addr = self.cli.getsockname()
+
+ def clientTearDown(self):
+ self.cli.close()
+ self.cli = None
+ ThreadableTest.clientTearDown(self)
+
+
+class ConnectedStreamTestMixin(SocketListeningTestMixin,
+ ThreadedSocketTestMixin):
+ """Mixin to allow client/server stream tests with connected client.
+
+ Server's socket representing connection to client is self.cli_conn
+ and client's connection to server is self.serv_conn. (Based on
+ SocketConnectedTest.)
+ """
+
+ def setUp(self):
+ super().setUp()
+ # Indicate explicitly we're ready for the client thread to
+ # proceed and then perform the blocking call to accept
+ self.serverExplicitReady()
+ conn, addr = self.serv.accept()
+ self.cli_conn = conn
+
+ def tearDown(self):
+ self.cli_conn.close()
+ self.cli_conn = None
+ super().tearDown()
+
+ def clientSetUp(self):
+ super().clientSetUp()
+ self.cli.connect(self.serv_addr)
+ self.serv_conn = self.cli
+
+ def clientTearDown(self):
+ self.serv_conn.close()
+ self.serv_conn = None
+ super().clientTearDown()
+
+
+class UnixSocketTestBase(SocketTestBase):
+ """Base class for Unix-domain socket tests."""
+
+ # This class is used for file descriptor passing tests, so we
+ # create the sockets in a private directory so that other users
+ # can't send anything that might be problematic for a privileged
+ # user running the tests.
+
+ def setUp(self):
+ self.dir_path = tempfile.mkdtemp()
+ self.addCleanup(os.rmdir, self.dir_path)
+ super().setUp()
+
+ def bindSock(self, sock):
+ path = tempfile.mktemp(dir=self.dir_path)
+ sock.bind(path)
+ self.addCleanup(support.unlink, path)
+
+class UnixStreamBase(UnixSocketTestBase):
+ """Base class for Unix-domain SOCK_STREAM tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+
+
+class InetTestBase(SocketTestBase):
+ """Base class for IPv4 socket tests."""
+
+ host = HOST
+
+ def setUp(self):
+ super().setUp()
+ self.port = self.serv_addr[1]
+
+ def bindSock(self, sock):
+ support.bind_port(sock, host=self.host)
+
+class TCPTestBase(InetTestBase):
+ """Base class for TCP-over-IPv4 tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+class UDPTestBase(InetTestBase):
+ """Base class for UDP-over-IPv4 tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+class SCTPStreamBase(InetTestBase):
+ """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
+ socket.IPPROTO_SCTP)
+
+
+class Inet6TestBase(InetTestBase):
+ """Base class for IPv6 socket tests."""
+
+ # Don't use "localhost" here - it may not have an IPv6 address
+ # assigned to it by default (e.g. in /etc/hosts), and if someone
+ # has assigned it an IPv4-mapped address, then it's unlikely to
+ # work with the full IPv6 API.
+ host = "::1"
+
+class UDP6TestBase(Inet6TestBase):
+ """Base class for UDP-over-IPv6 tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
+
+
+# Test-skipping decorators for use with ThreadableTest.
+
+def skipWithClientIf(condition, reason):
+ """Skip decorated test if condition is true, add client_skip decorator.
+
+ If the decorated object is not a class, sets its attribute
+ "client_skip" to a decorator which will return an empty function
+ if the test is to be skipped, or the original function if it is
+ not. This can be used to avoid running the client part of a
+ skipped test when using ThreadableTest.
+ """
+ def client_pass(*args, **kwargs):
+ pass
+ def skipdec(obj):
+ retval = unittest.skip(reason)(obj)
+ if not isinstance(obj, type):
+ retval.client_skip = lambda f: client_pass
+ return retval
+ def noskipdec(obj):
+ if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
+ obj.client_skip = lambda f: f
+ return obj
+ return skipdec if condition else noskipdec
+
+
+def requireAttrs(obj, *attributes):
+ """Skip decorated test if obj is missing any of the given attributes.
+
+ Sets client_skip attribute as skipWithClientIf() does.
+ """
+ missing = [name for name in attributes if not hasattr(obj, name)]
+ return skipWithClientIf(
+ missing, "don't have " + ", ".join(name for name in missing))
+
+
+def requireSocket(*args):
+ """Skip decorated test if a socket cannot be created with given arguments.
+
+ When an argument is given as a string, will use the value of that
+ attribute of the socket module, or skip the test if it doesn't
+ exist. Sets client_skip attribute as skipWithClientIf() does.
+ """
+ err = None
+ missing = [obj for obj in args if
+ isinstance(obj, str) and not hasattr(socket, obj)]
+ if missing:
+ err = "don't have " + ", ".join(name for name in missing)
+ else:
+ callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
+ for obj in args]
+ try:
+ s = socket.socket(*callargs)
+ except socket.error as e:
+ # XXX: check errno?
+ err = str(e)
+ else:
+ s.close()
+ return skipWithClientIf(
+ err is not None,
+ "can't create socket({0}): {1}".format(
+ ", ".join(str(o) for o in args), err))
+
+
#######################################################################
## Begin Tests
@@ -282,18 +644,13 @@ class GeneralModuleTests(unittest.TestCase):
def testSocketError(self):
# Testing socket module exceptions
- def raise_error(*args, **kwargs):
+ msg = "Error raising socket exception (%s)."
+ with self.assertRaises(socket.error, msg=msg % 'socket.error'):
raise socket.error
- def raise_herror(*args, **kwargs):
+ with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
raise socket.herror
- def raise_gaierror(*args, **kwargs):
+ with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
raise socket.gaierror
- self.assertRaises(socket.error, raise_error,
- "Error raising socket exception.")
- self.assertRaises(socket.error, raise_herror,
- "Error raising socket exception.")
- self.assertRaises(socket.error, raise_gaierror,
- "Error raising socket exception.")
def testSendtoErrors(self):
# Testing that sendto doens't masks failures. See #10169.
@@ -369,6 +726,52 @@ class GeneralModuleTests(unittest.TestCase):
if not fqhn in all_host_names:
self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
+ @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
+ @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
+ def test_sethostname(self):
+ oldhn = socket.gethostname()
+ try:
+ socket.sethostname('new')
+ except socket.error as e:
+ if e.errno == errno.EPERM:
+ self.skipTest("test should be run as root")
+ else:
+ raise
+ try:
+ # running test as root!
+ self.assertEqual(socket.gethostname(), 'new')
+ # Should work with bytes objects too
+ socket.sethostname(b'bar')
+ self.assertEqual(socket.gethostname(), 'bar')
+ finally:
+ socket.sethostname(oldhn)
+
+ @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
+ 'socket.if_nameindex() not available.')
+ def testInterfaceNameIndex(self):
+ interfaces = socket.if_nameindex()
+ for index, name in interfaces:
+ self.assertIsInstance(index, int)
+ self.assertIsInstance(name, str)
+ # interface indices are non-zero integers
+ self.assertGreater(index, 0)
+ _index = socket.if_nametoindex(name)
+ self.assertIsInstance(_index, int)
+ self.assertEqual(index, _index)
+ _name = socket.if_indextoname(index)
+ self.assertIsInstance(_name, str)
+ self.assertEqual(name, _name)
+
+ @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
+ 'socket.if_nameindex() not available.')
+ def testInvalidInterfaceNameIndex(self):
+ # test nonexistent interface index/name
+ self.assertRaises(socket.error, socket.if_indextoname, 0)
+ self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
+ # test with invalid values
+ self.assertRaises(TypeError, socket.if_nametoindex, 0)
+ self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
+
def testRefCountGetNameInfo(self):
# Testing reference count for getnameinfo
if hasattr(sys, "getrefcount"):
@@ -421,10 +824,8 @@ class GeneralModuleTests(unittest.TestCase):
# Find one service that exists, then check all the related interfaces.
# I've ordered this by protocols that have both a tcp and udp
# protocol, at least for modern Linuxes.
- if (sys.platform.startswith('linux') or
- sys.platform.startswith('freebsd') or
- sys.platform.startswith('netbsd') or
- sys.platform == 'darwin'):
+ if (sys.platform.startswith(('freebsd', 'netbsd'))
+ or sys.platform in ('linux', 'darwin')):
# avoid the 'echo' service on this platform, as there is an
# assumption breaking non-standard port/protocol entry
services = ('daytime', 'qotd', 'domain')
@@ -719,7 +1120,7 @@ class GeneralModuleTests(unittest.TestCase):
socket.getaddrinfo('localhost', 80)
socket.getaddrinfo('127.0.0.1', 80)
socket.getaddrinfo(None, 80)
- if SUPPORTS_IPV6:
+ if support.IPV6_ENABLED:
socket.getaddrinfo('::1', 80)
# port can be a string service name such as "http", a numeric
# port number or None
@@ -772,7 +1173,12 @@ class GeneralModuleTests(unittest.TestCase):
@unittest.skipUnless(support.is_resource_enabled('network'),
'network is not enabled')
def test_idna(self):
- support.requires('network')
+ # Check for internet access before running test (issue #12804).
+ try:
+ socket.gethostbyname('python.org')
+ except socket.gaierror as e:
+ if e.errno == socket.EAI_NODATA:
+ self.skipTest('internet access required for this test')
# these should all be successful
socket.gethostbyname('иÑпытание.python.org')
socket.gethostbyname_ex('иÑпытание.python.org')
@@ -850,14 +1256,20 @@ class GeneralModuleTests(unittest.TestCase):
self.assertRaises(ValueError, fp.writable)
self.assertRaises(ValueError, fp.seekable)
- def testListenBacklog0(self):
+ def test_pickle(self):
+ sock = socket.socket()
+ with sock:
+ for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
+ self.assertRaises(TypeError, pickle.dumps, sock, protocol)
+
+ def test_listen_backlog0(self):
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, 0))
# backlog = 0
srv.listen(0)
srv.close()
- @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
+ @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
def test_flowinfo(self):
self.assertRaises(OverflowError, socket.getnameinfo,
('::1',0, 0xffffffff), 0)
@@ -865,6 +1277,222 @@ class GeneralModuleTests(unittest.TestCase):
self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
+@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
+class BasicCANTest(unittest.TestCase):
+
+ def testCrucialConstants(self):
+ socket.AF_CAN
+ socket.PF_CAN
+ socket.CAN_RAW
+
+ def testCreateSocket(self):
+ with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
+ pass
+
+ def testBindAny(self):
+ with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
+ s.bind(('', ))
+
+ def testTooLongInterfaceName(self):
+ # most systems limit IFNAMSIZ to 16, take 1024 to be sure
+ with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
+ self.assertRaisesRegex(socket.error, 'interface name too long',
+ s.bind, ('x' * 1024,))
+
+ @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
+ 'socket.CAN_RAW_LOOPBACK required for this test.')
+ def testLoopback(self):
+ with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
+ for loopback in (0, 1):
+ s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
+ loopback)
+ self.assertEqual(loopback,
+ s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
+
+ @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
+ 'socket.CAN_RAW_FILTER required for this test.')
+ def testFilter(self):
+ can_id, can_mask = 0x200, 0x700
+ can_filter = struct.pack("=II", can_id, can_mask)
+ with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
+ s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
+ self.assertEqual(can_filter,
+ s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
+
+
+@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class CANTest(ThreadedCANSocketTest):
+
+ """The CAN frame structure is defined in <linux/can.h>:
+
+ struct can_frame {
+ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+ __u8 can_dlc; /* data length code: 0 .. 8 */
+ __u8 data[8] __attribute__((aligned(8)));
+ };
+ """
+ can_frame_fmt = "=IB3x8s"
+
+ def __init__(self, methodName='runTest'):
+ ThreadedCANSocketTest.__init__(self, methodName=methodName)
+
+ @classmethod
+ def build_can_frame(cls, can_id, data):
+ """Build a CAN frame."""
+ can_dlc = len(data)
+ data = data.ljust(8, b'\x00')
+ return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
+
+ @classmethod
+ def dissect_can_frame(cls, frame):
+ """Dissect a CAN frame."""
+ can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
+ return (can_id, can_dlc, data[:can_dlc])
+
+ def testSendFrame(self):
+ cf, addr = self.s.recvfrom(self.bufsize)
+ self.assertEqual(self.cf, cf)
+ self.assertEqual(addr[0], self.interface)
+ self.assertEqual(addr[1], socket.AF_CAN)
+
+ def _testSendFrame(self):
+ self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
+ self.cli.send(self.cf)
+
+ def testSendMaxFrame(self):
+ cf, addr = self.s.recvfrom(self.bufsize)
+ self.assertEqual(self.cf, cf)
+
+ def _testSendMaxFrame(self):
+ self.cf = self.build_can_frame(0x00, b'\x07' * 8)
+ self.cli.send(self.cf)
+
+ def testSendMultiFrames(self):
+ cf, addr = self.s.recvfrom(self.bufsize)
+ self.assertEqual(self.cf1, cf)
+
+ cf, addr = self.s.recvfrom(self.bufsize)
+ self.assertEqual(self.cf2, cf)
+
+ def _testSendMultiFrames(self):
+ self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
+ self.cli.send(self.cf1)
+
+ self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
+ self.cli.send(self.cf2)
+
+
+@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
+class BasicRDSTest(unittest.TestCase):
+
+ def testCrucialConstants(self):
+ socket.AF_RDS
+ socket.PF_RDS
+
+ def testCreateSocket(self):
+ with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
+ pass
+
+ def testSocketBufferSize(self):
+ bufsize = 16384
+ with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
+
+
+@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RDSTest(ThreadedRDSSocketTest):
+
+ def __init__(self, methodName='runTest'):
+ ThreadedRDSSocketTest.__init__(self, methodName=methodName)
+
+ def setUp(self):
+ super().setUp()
+ self.evt = threading.Event()
+
+ def testSendAndRecv(self):
+ data, addr = self.serv.recvfrom(self.bufsize)
+ self.assertEqual(self.data, data)
+ self.assertEqual(self.cli_addr, addr)
+
+ def _testSendAndRecv(self):
+ self.data = b'spam'
+ self.cli.sendto(self.data, 0, (HOST, self.port))
+
+ def testPeek(self):
+ data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
+ self.assertEqual(self.data, data)
+ data, addr = self.serv.recvfrom(self.bufsize)
+ self.assertEqual(self.data, data)
+
+ def _testPeek(self):
+ self.data = b'spam'
+ self.cli.sendto(self.data, 0, (HOST, self.port))
+
+ @requireAttrs(socket.socket, 'recvmsg')
+ def testSendAndRecvMsg(self):
+ data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
+ self.assertEqual(self.data, data)
+
+ @requireAttrs(socket.socket, 'sendmsg')
+ def _testSendAndRecvMsg(self):
+ self.data = b'hello ' * 10
+ self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
+
+ def testSendAndRecvMulti(self):
+ data, addr = self.serv.recvfrom(self.bufsize)
+ self.assertEqual(self.data1, data)
+
+ data, addr = self.serv.recvfrom(self.bufsize)
+ self.assertEqual(self.data2, data)
+
+ def _testSendAndRecvMulti(self):
+ self.data1 = b'bacon'
+ self.cli.sendto(self.data1, 0, (HOST, self.port))
+
+ self.data2 = b'egg'
+ self.cli.sendto(self.data2, 0, (HOST, self.port))
+
+ def testSelect(self):
+ r, w, x = select.select([self.serv], [], [], 3.0)
+ self.assertIn(self.serv, r)
+ data, addr = self.serv.recvfrom(self.bufsize)
+ self.assertEqual(self.data, data)
+
+ def _testSelect(self):
+ self.data = b'select'
+ self.cli.sendto(self.data, 0, (HOST, self.port))
+
+ def testCongestion(self):
+ # wait until the sender is done
+ self.evt.wait()
+
+ def _testCongestion(self):
+ # test the behavior in case of congestion
+ self.data = b'fill'
+ self.cli.setblocking(False)
+ try:
+ # try to lower the receiver's socket buffer size
+ self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
+ except OSError:
+ pass
+ with self.assertRaises(OSError) as cm:
+ try:
+ # fill the receiver's socket buffer
+ while True:
+ self.cli.sendto(self.data, 0, (HOST, self.port))
+ finally:
+ # signal the receiver we're done
+ self.evt.set()
+ # sendto() should have failed with ENOBUFS
+ self.assertEqual(cm.exception.errno, errno.ENOBUFS)
+ # and we should have received a congestion notification through poll
+ r, w, x = select.select([self.serv], [], [], 3.0)
+ self.assertIn(self.serv, r)
+
+
@unittest.skipUnless(thread, 'Threading required for this test.')
class BasicTCPTest(SocketConnectedTest):
@@ -1004,6 +1632,1852 @@ class BasicUDPTest(ThreadedUDPSocketTest):
def _testRecvFromNegative(self):
self.cli.sendto(MSG, 0, (HOST, self.port))
+# Tests for the sendmsg()/recvmsg() interface. Where possible, the
+# same test code is used with different families and types of socket
+# (e.g. stream, datagram), and tests using recvmsg() are repeated
+# using recvmsg_into().
+#
+# The generic test classes such as SendmsgTests and
+# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
+# supplied with sockets cli_sock and serv_sock representing the
+# client's and the server's end of the connection respectively, and
+# attributes cli_addr and serv_addr holding their (numeric where
+# appropriate) addresses.
+#
+# The final concrete test classes combine these with subclasses of
+# SocketTestBase which set up client and server sockets of a specific
+# type, and with subclasses of SendrecvmsgBase such as
+# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
+# sockets to cli_sock and serv_sock and override the methods and
+# attributes of SendrecvmsgBase to fill in destination addresses if
+# needed when sending, check for specific flags in msg_flags, etc.
+#
+# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
+# recvmsg_into().
+
+# XXX: like the other datagram (UDP) tests in this module, the code
+# here assumes that datagram delivery on the local machine will be
+# reliable.
+
+class SendrecvmsgBase(ThreadSafeCleanupTestCase):
+ # Base class for sendmsg()/recvmsg() tests.
+
+ # Time in seconds to wait before considering a test failed, or
+ # None for no timeout. Not all tests actually set a timeout.
+ fail_timeout = 3.0
+
+ def setUp(self):
+ self.misc_event = threading.Event()
+ super().setUp()
+
+ def sendToServer(self, msg):
+ # Send msg to the server.
+ return self.cli_sock.send(msg)
+
+ # Tuple of alternative default arguments for sendmsg() when called
+ # via sendmsgToServer() (e.g. to include a destination address).
+ sendmsg_to_server_defaults = ()
+
+ def sendmsgToServer(self, *args):
+ # Call sendmsg() on self.cli_sock with the given arguments,
+ # filling in any arguments which are not supplied with the
+ # corresponding items of self.sendmsg_to_server_defaults, if
+ # any.
+ return self.cli_sock.sendmsg(
+ *(args + self.sendmsg_to_server_defaults[len(args):]))
+
+ def doRecvmsg(self, sock, bufsize, *args):
+ # Call recvmsg() on sock with given arguments and return its
+ # result. Should be used for tests which can use either
+ # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
+ # this method with one which emulates it using recvmsg_into(),
+ # thus allowing the same test to be used for both methods.
+ result = sock.recvmsg(bufsize, *args)
+ self.registerRecvmsgResult(result)
+ return result
+
+ def registerRecvmsgResult(self, result):
+ # Called by doRecvmsg() with the return value of recvmsg() or
+ # recvmsg_into(). Can be overridden to arrange cleanup based
+ # on the returned ancillary data, for instance.
+ pass
+
+ def checkRecvmsgAddress(self, addr1, addr2):
+ # Called to compare the received address with the address of
+ # the peer.
+ self.assertEqual(addr1, addr2)
+
+ # Flags that are normally unset in msg_flags
+ msg_flags_common_unset = 0
+ for name in ("MSG_CTRUNC", "MSG_OOB"):
+ msg_flags_common_unset |= getattr(socket, name, 0)
+
+ # Flags that are normally set
+ msg_flags_common_set = 0
+
+ # Flags set when a complete record has been received (e.g. MSG_EOR
+ # for SCTP)
+ msg_flags_eor_indicator = 0
+
+ # Flags set when a complete record has not been received
+ # (e.g. MSG_TRUNC for datagram sockets)
+ msg_flags_non_eor_indicator = 0
+
+ def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
+ # Method to check the value of msg_flags returned by recvmsg[_into]().
+ #
+ # Checks that all bits in msg_flags_common_set attribute are
+ # set in "flags" and all bits in msg_flags_common_unset are
+ # unset.
+ #
+ # The "eor" argument specifies whether the flags should
+ # indicate that a full record (or datagram) has been received.
+ # If "eor" is None, no checks are done; otherwise, checks
+ # that:
+ #
+ # * if "eor" is true, all bits in msg_flags_eor_indicator are
+ # set and all bits in msg_flags_non_eor_indicator are unset
+ #
+ # * if "eor" is false, all bits in msg_flags_non_eor_indicator
+ # are set and all bits in msg_flags_eor_indicator are unset
+ #
+ # If "checkset" and/or "checkunset" are supplied, they require
+ # the given bits to be set or unset respectively, overriding
+ # what the attributes require for those bits.
+ #
+ # If any bits are set in "ignore", they will not be checked,
+ # regardless of the other inputs.
+ #
+ # Will raise Exception if the inputs require a bit to be both
+ # set and unset, and it is not ignored.
+
+ defaultset = self.msg_flags_common_set
+ defaultunset = self.msg_flags_common_unset
+
+ if eor:
+ defaultset |= self.msg_flags_eor_indicator
+ defaultunset |= self.msg_flags_non_eor_indicator
+ elif eor is not None:
+ defaultset |= self.msg_flags_non_eor_indicator
+ defaultunset |= self.msg_flags_eor_indicator
+
+ # Function arguments override defaults
+ defaultset &= ~checkunset
+ defaultunset &= ~checkset
+
+ # Merge arguments with remaining defaults, and check for conflicts
+ checkset |= defaultset
+ checkunset |= defaultunset
+ inboth = checkset & checkunset & ~ignore
+ if inboth:
+ raise Exception("contradictory set, unset requirements for flags "
+ "{0:#x}".format(inboth))
+
+ # Compare with given msg_flags value
+ mask = (checkset | checkunset) & ~ignore
+ self.assertEqual(flags & mask, checkset & mask)
+
+
+class RecvmsgIntoMixin(SendrecvmsgBase):
+ # Mixin to implement doRecvmsg() using recvmsg_into().
+
+ def doRecvmsg(self, sock, bufsize, *args):
+ buf = bytearray(bufsize)
+ result = sock.recvmsg_into([buf], *args)
+ self.registerRecvmsgResult(result)
+ self.assertGreaterEqual(result[0], 0)
+ self.assertLessEqual(result[0], bufsize)
+ return (bytes(buf[:result[0]]),) + result[1:]
+
+
+class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
+ # Defines flags to be checked in msg_flags for datagram sockets.
+
+ @property
+ def msg_flags_non_eor_indicator(self):
+ return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
+
+
+class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
+ # Defines flags to be checked in msg_flags for SCTP sockets.
+
+ @property
+ def msg_flags_eor_indicator(self):
+ return super().msg_flags_eor_indicator | socket.MSG_EOR
+
+
+class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
+ # Base class for tests on connectionless-mode sockets. Users must
+ # supply sockets on attributes cli and serv to be mapped to
+ # cli_sock and serv_sock respectively.
+
+ @property
+ def serv_sock(self):
+ return self.serv
+
+ @property
+ def cli_sock(self):
+ return self.cli
+
+ @property
+ def sendmsg_to_server_defaults(self):
+ return ([], [], 0, self.serv_addr)
+
+ def sendToServer(self, msg):
+ return self.cli_sock.sendto(msg, self.serv_addr)
+
+
+class SendrecvmsgConnectedBase(SendrecvmsgBase):
+ # Base class for tests on connected sockets. Users must supply
+ # sockets on attributes serv_conn and cli_conn (representing the
+ # connections *to* the server and the client), to be mapped to
+ # cli_sock and serv_sock respectively.
+
+ @property
+ def serv_sock(self):
+ return self.cli_conn
+
+ @property
+ def cli_sock(self):
+ return self.serv_conn
+
+ def checkRecvmsgAddress(self, addr1, addr2):
+ # Address is currently "unspecified" for a connected socket,
+ # so we don't examine it
+ pass
+
+
+class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
+ # Base class to set a timeout on server's socket.
+
+ def setUp(self):
+ super().setUp()
+ self.serv_sock.settimeout(self.fail_timeout)
+
+
+class SendmsgTests(SendrecvmsgServerTimeoutBase):
+ # Tests for sendmsg() which can use any socket type and do not
+ # involve recvmsg() or recvmsg_into().
+
+ def testSendmsg(self):
+ # Send a simple message with sendmsg().
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsg(self):
+ self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
+
+ def testSendmsgDataGenerator(self):
+ # Send from buffer obtained from a generator (not a sequence).
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsgDataGenerator(self):
+ self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
+ len(MSG))
+
+ def testSendmsgAncillaryGenerator(self):
+ # Gather (empty) ancillary data from a generator.
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsgAncillaryGenerator(self):
+ self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
+ len(MSG))
+
+ def testSendmsgArray(self):
+ # Send data from an array instead of the usual bytes object.
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsgArray(self):
+ self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
+ len(MSG))
+
+ def testSendmsgGather(self):
+ # Send message data from more than one buffer (gather write).
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsgGather(self):
+ self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
+
+ def testSendmsgBadArgs(self):
+ # Check that sendmsg() rejects invalid arguments.
+ self.assertEqual(self.serv_sock.recv(1000), b"done")
+
+ def _testSendmsgBadArgs(self):
+ self.assertRaises(TypeError, self.cli_sock.sendmsg)
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ b"not in an iterable")
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ object())
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [object()])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG, object()])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], object())
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [], object())
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [], 0, object())
+ self.sendToServer(b"done")
+
+ def testSendmsgBadCmsg(self):
+ # Check that invalid ancillary data items are rejected.
+ self.assertEqual(self.serv_sock.recv(1000), b"done")
+
+ def _testSendmsgBadCmsg(self):
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [object()])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(object(), 0, b"data")])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(0, object(), b"data")])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(0, 0, object())])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(0, 0)])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(0, 0, b"data", 42)])
+ self.sendToServer(b"done")
+
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testSendmsgBadMultiCmsg(self):
+ # Check that invalid ancillary data items are rejected when
+ # more than one item is present.
+ self.assertEqual(self.serv_sock.recv(1000), b"done")
+
+ @testSendmsgBadMultiCmsg.client_skip
+ def _testSendmsgBadMultiCmsg(self):
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [0, 0, b""])
+ self.assertRaises(TypeError, self.sendmsgToServer,
+ [MSG], [(0, 0, b""), object()])
+ self.sendToServer(b"done")
+
+ def testSendmsgExcessCmsgReject(self):
+ # Check that sendmsg() rejects excess ancillary data items
+ # when the number that can be sent is limited.
+ self.assertEqual(self.serv_sock.recv(1000), b"done")
+
+ def _testSendmsgExcessCmsgReject(self):
+ if not hasattr(socket, "CMSG_SPACE"):
+ # Can only send one item
+ with self.assertRaises(socket.error) as cm:
+ self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
+ self.assertIsNone(cm.exception.errno)
+ self.sendToServer(b"done")
+
+ def testSendmsgAfterClose(self):
+ # Check that sendmsg() fails on a closed socket.
+ pass
+
+ def _testSendmsgAfterClose(self):
+ self.cli_sock.close()
+ self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
+
+
+class SendmsgStreamTests(SendmsgTests):
+ # Tests for sendmsg() which require a stream socket and do not
+ # involve recvmsg() or recvmsg_into().
+
+ def testSendmsgExplicitNoneAddr(self):
+ # Check that peer address can be specified as None.
+ self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
+
+ def _testSendmsgExplicitNoneAddr(self):
+ self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
+
+ def testSendmsgTimeout(self):
+ # Check that timeout works with sendmsg().
+ self.assertEqual(self.serv_sock.recv(512), b"a"*512)
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+
+ def _testSendmsgTimeout(self):
+ try:
+ self.cli_sock.settimeout(0.03)
+ with self.assertRaises(socket.timeout):
+ while True:
+ self.sendmsgToServer([b"a"*512])
+ finally:
+ self.misc_event.set()
+
+ # XXX: would be nice to have more tests for sendmsg flags argument.
+
+ # Linux supports MSG_DONTWAIT when sending, but in general, it
+ # only works when receiving. Could add other platforms if they
+ # support it too.
+ @skipWithClientIf(sys.platform not in {"linux2"},
+ "MSG_DONTWAIT not known to work on this platform when "
+ "sending")
+ def testSendmsgDontWait(self):
+ # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
+ self.assertEqual(self.serv_sock.recv(512), b"a"*512)
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+
+ @testSendmsgDontWait.client_skip
+ def _testSendmsgDontWait(self):
+ try:
+ with self.assertRaises(socket.error) as cm:
+ while True:
+ self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
+ self.assertIn(cm.exception.errno,
+ (errno.EAGAIN, errno.EWOULDBLOCK))
+ finally:
+ self.misc_event.set()
+
+
+class SendmsgConnectionlessTests(SendmsgTests):
+ # Tests for sendmsg() which require a connectionless-mode
+ # (e.g. datagram) socket, and do not involve recvmsg() or
+ # recvmsg_into().
+
+ def testSendmsgNoDestAddr(self):
+ # Check that sendmsg() fails when no destination address is
+ # given for unconnected socket.
+ pass
+
+ def _testSendmsgNoDestAddr(self):
+ self.assertRaises(socket.error, self.cli_sock.sendmsg,
+ [MSG])
+ self.assertRaises(socket.error, self.cli_sock.sendmsg,
+ [MSG], [], 0, None)
+
+
+class RecvmsgGenericTests(SendrecvmsgBase):
+ # Tests for recvmsg() which can also be emulated using
+ # recvmsg_into(), and can use any socket type.
+
+ def testRecvmsg(self):
+ # Receive a simple message with recvmsg[_into]().
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsg(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgExplicitDefaults(self):
+ # Test recvmsg[_into]() with default arguments provided explicitly.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 0, 0)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgExplicitDefaults(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgShorter(self):
+ # Receive a message smaller than buffer.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG) + 42)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgShorter(self):
+ self.sendToServer(MSG)
+
+ # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
+ # datagram is received (issue #13001).
+ @support.requires_freebsd_version(8)
+ def testRecvmsgTrunc(self):
+ # Receive part of message, check for truncation indicators.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG) - 3)
+ self.assertEqual(msg, MSG[:-3])
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=False)
+
+ @support.requires_freebsd_version(8)
+ def _testRecvmsgTrunc(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgShortAncillaryBuf(self):
+ # Test ancillary data buffer too small to hold any ancillary data.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 1)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgShortAncillaryBuf(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgLongAncillaryBuf(self):
+ # Test large ancillary data buffer.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgLongAncillaryBuf(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgAfterClose(self):
+ # Check that recvmsg[_into]() fails on a closed socket.
+ self.serv_sock.close()
+ self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
+
+ def _testRecvmsgAfterClose(self):
+ pass
+
+ def testRecvmsgTimeout(self):
+ # Check that timeout works.
+ try:
+ self.serv_sock.settimeout(0.03)
+ self.assertRaises(socket.timeout,
+ self.doRecvmsg, self.serv_sock, len(MSG))
+ finally:
+ self.misc_event.set()
+
+ def _testRecvmsgTimeout(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+
+ @requireAttrs(socket, "MSG_PEEK")
+ def testRecvmsgPeek(self):
+ # Check that MSG_PEEK in flags enables examination of pending
+ # data without consuming it.
+
+ # Receive part of data with MSG_PEEK.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG) - 3, 0,
+ socket.MSG_PEEK)
+ self.assertEqual(msg, MSG[:-3])
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ # Ignoring MSG_TRUNC here (so this test is the same for stream
+ # and datagram sockets). Some wording in POSIX seems to
+ # suggest that it needn't be set when peeking, but that may
+ # just be a slip.
+ self.checkFlags(flags, eor=False,
+ ignore=getattr(socket, "MSG_TRUNC", 0))
+
+ # Receive all data with MSG_PEEK.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 0,
+ socket.MSG_PEEK)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ # Check that the same data can still be received normally.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ @testRecvmsgPeek.client_skip
+ def _testRecvmsgPeek(self):
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket.socket, "sendmsg")
+ def testRecvmsgFromSendmsg(self):
+ # Test receiving with recvmsg[_into]() when message is sent
+ # using sendmsg().
+ self.serv_sock.settimeout(self.fail_timeout)
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ @testRecvmsgFromSendmsg.client_skip
+ def _testRecvmsgFromSendmsg(self):
+ self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
+
+
+class RecvmsgGenericStreamTests(RecvmsgGenericTests):
+ # Tests which require a stream socket and can use either recvmsg()
+ # or recvmsg_into().
+
+ def testRecvmsgEOF(self):
+ # Receive end-of-stream indicator (b"", peer socket closed).
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
+ self.assertEqual(msg, b"")
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=None) # Might not have end-of-record marker
+
+ def _testRecvmsgEOF(self):
+ self.cli_sock.close()
+
+ def testRecvmsgOverflow(self):
+ # Receive a message in more than one chunk.
+ seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG) - 3)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=False)
+
+ seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ msg = seg1 + seg2
+ self.assertEqual(msg, MSG)
+
+ def _testRecvmsgOverflow(self):
+ self.sendToServer(MSG)
+
+
+class RecvmsgTests(RecvmsgGenericTests):
+ # Tests for recvmsg() which can use any socket type.
+
+ def testRecvmsgBadArgs(self):
+ # Check that recvmsg() rejects invalid arguments.
+ self.assertRaises(TypeError, self.serv_sock.recvmsg)
+ self.assertRaises(ValueError, self.serv_sock.recvmsg,
+ -1, 0, 0)
+ self.assertRaises(ValueError, self.serv_sock.recvmsg,
+ len(MSG), -1, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg,
+ [bytearray(10)], 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg,
+ object(), 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg,
+ len(MSG), object(), 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg,
+ len(MSG), 0, object())
+
+ msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgBadArgs(self):
+ self.sendToServer(MSG)
+
+
+class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
+ # Tests for recvmsg_into() which can use any socket type.
+
+ def testRecvmsgIntoBadArgs(self):
+ # Check that recvmsg_into() rejects invalid arguments.
+ buf = bytearray(len(MSG))
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ len(MSG), 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ buf, 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ [object()], 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ [b"I'm not writable"], 0, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ [buf, object()], 0, 0)
+ self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
+ [buf], -1, 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ [buf], object(), 0)
+ self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
+ [buf], 0, object())
+
+ nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
+ self.assertEqual(nbytes, len(MSG))
+ self.assertEqual(buf, bytearray(MSG))
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgIntoBadArgs(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgIntoGenerator(self):
+ # Receive into buffer obtained from a generator (not a sequence).
+ buf = bytearray(len(MSG))
+ nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
+ (o for o in [buf]))
+ self.assertEqual(nbytes, len(MSG))
+ self.assertEqual(buf, bytearray(MSG))
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgIntoGenerator(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgIntoArray(self):
+ # Receive into an array rather than the usual bytearray.
+ buf = array.array("B", [0] * len(MSG))
+ nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
+ self.assertEqual(nbytes, len(MSG))
+ self.assertEqual(buf.tobytes(), MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgIntoArray(self):
+ self.sendToServer(MSG)
+
+ def testRecvmsgIntoScatter(self):
+ # Receive into multiple buffers (scatter write).
+ b1 = bytearray(b"----")
+ b2 = bytearray(b"0123456789")
+ b3 = bytearray(b"--------------")
+ nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
+ [b1, memoryview(b2)[2:9], b3])
+ self.assertEqual(nbytes, len(b"Mary had a little lamb"))
+ self.assertEqual(b1, bytearray(b"Mary"))
+ self.assertEqual(b2, bytearray(b"01 had a 9"))
+ self.assertEqual(b3, bytearray(b"little lamb---"))
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True)
+
+ def _testRecvmsgIntoScatter(self):
+ self.sendToServer(b"Mary had a little lamb")
+
+
+class CmsgMacroTests(unittest.TestCase):
+ # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
+ # assumptions used by sendmsg() and recvmsg[_into](), which share
+ # code with these functions.
+
+ # Match the definition in socketmodule.c
+ socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
+
+ @requireAttrs(socket, "CMSG_LEN")
+ def testCMSG_LEN(self):
+ # Test CMSG_LEN() with various valid and invalid values,
+ # checking the assumptions used by recvmsg() and sendmsg().
+ toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
+ values = list(range(257)) + list(range(toobig - 257, toobig))
+
+ # struct cmsghdr has at least three members, two of which are ints
+ self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
+ for n in values:
+ ret = socket.CMSG_LEN(n)
+ # This is how recvmsg() calculates the data size
+ self.assertEqual(ret - socket.CMSG_LEN(0), n)
+ self.assertLessEqual(ret, self.socklen_t_limit)
+
+ self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
+ # sendmsg() shares code with these functions, and requires
+ # that it reject values over the limit.
+ self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
+ self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
+
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testCMSG_SPACE(self):
+ # Test CMSG_SPACE() with various valid and invalid values,
+ # checking the assumptions used by sendmsg().
+ toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
+ values = list(range(257)) + list(range(toobig - 257, toobig))
+
+ last = socket.CMSG_SPACE(0)
+ # struct cmsghdr has at least three members, two of which are ints
+ self.assertGreater(last, array.array("i").itemsize * 2)
+ for n in values:
+ ret = socket.CMSG_SPACE(n)
+ self.assertGreaterEqual(ret, last)
+ self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
+ self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
+ self.assertLessEqual(ret, self.socklen_t_limit)
+ last = ret
+
+ self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
+ # sendmsg() shares code with these functions, and requires
+ # that it reject values over the limit.
+ self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
+ self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
+
+
+class SCMRightsTest(SendrecvmsgServerTimeoutBase):
+ # Tests for file descriptor passing on Unix-domain sockets.
+
+ # Invalid file descriptor value that's unlikely to evaluate to a
+ # real FD even if one of its bytes is replaced with a different
+ # value (which shouldn't actually happen).
+ badfd = -0x5555
+
+ def newFDs(self, n):
+ # Return a list of n file descriptors for newly-created files
+ # containing their list indices as ASCII numbers.
+ fds = []
+ for i in range(n):
+ fd, path = tempfile.mkstemp()
+ self.addCleanup(os.unlink, path)
+ self.addCleanup(os.close, fd)
+ os.write(fd, str(i).encode())
+ fds.append(fd)
+ return fds
+
+ def checkFDs(self, fds):
+ # Check that the file descriptors in the given list contain
+ # their correct list indices as ASCII numbers.
+ for n, fd in enumerate(fds):
+ os.lseek(fd, 0, os.SEEK_SET)
+ self.assertEqual(os.read(fd, 1024), str(n).encode())
+
+ def registerRecvmsgResult(self, result):
+ self.addCleanup(self.closeRecvmsgFDs, result)
+
+ def closeRecvmsgFDs(self, recvmsg_result):
+ # Close all file descriptors specified in the ancillary data
+ # of the given return value from recvmsg() or recvmsg_into().
+ for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
+ if (cmsg_level == socket.SOL_SOCKET and
+ cmsg_type == socket.SCM_RIGHTS):
+ fds = array.array("i")
+ fds.frombytes(cmsg_data[:
+ len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
+ for fd in fds:
+ os.close(fd)
+
+ def createAndSendFDs(self, n):
+ # Send n new file descriptors created by newFDs() to the
+ # server, with the constant MSG as the non-ancillary data.
+ self.assertEqual(
+ self.sendmsgToServer([MSG],
+ [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", self.newFDs(n)))]),
+ len(MSG))
+
+ def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
+ # Check that constant MSG was received with numfds file
+ # descriptors in a maximum of maxcmsgs control messages (which
+ # must contain only complete integers). By default, check
+ # that MSG_CTRUNC is unset, but ignore any flags in
+ # ignoreflags.
+ msg, ancdata, flags, addr = result
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+
+ self.assertIsInstance(ancdata, list)
+ self.assertLessEqual(len(ancdata), maxcmsgs)
+ fds = array.array("i")
+ for item in ancdata:
+ self.assertIsInstance(item, tuple)
+ cmsg_level, cmsg_type, cmsg_data = item
+ self.assertEqual(cmsg_level, socket.SOL_SOCKET)
+ self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
+ self.assertIsInstance(cmsg_data, bytes)
+ self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
+ fds.frombytes(cmsg_data)
+
+ self.assertEqual(len(fds), numfds)
+ self.checkFDs(fds)
+
+ def testFDPassSimple(self):
+ # Pass a single FD (array read from bytes object).
+ self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240))
+
+ def _testFDPassSimple(self):
+ self.assertEqual(
+ self.sendmsgToServer(
+ [MSG],
+ [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", self.newFDs(1)).tobytes())]),
+ len(MSG))
+
+ def testMultipleFDPass(self):
+ # Pass multiple FDs in a single array.
+ self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240))
+
+ def _testMultipleFDPass(self):
+ self.createAndSendFDs(4)
+
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassCMSG_SPACE(self):
+ # Test using CMSG_SPACE() to calculate ancillary buffer size.
+ self.checkRecvmsgFDs(
+ 4, self.doRecvmsg(self.serv_sock, len(MSG),
+ socket.CMSG_SPACE(4 * SIZEOF_INT)))
+
+ @testFDPassCMSG_SPACE.client_skip
+ def _testFDPassCMSG_SPACE(self):
+ self.createAndSendFDs(4)
+
+ def testFDPassCMSG_LEN(self):
+ # Test using CMSG_LEN() to calculate ancillary buffer size.
+ self.checkRecvmsgFDs(1,
+ self.doRecvmsg(self.serv_sock, len(MSG),
+ socket.CMSG_LEN(4 * SIZEOF_INT)),
+ # RFC 3542 says implementations may set
+ # MSG_CTRUNC if there isn't enough space
+ # for trailing padding.
+ ignoreflags=socket.MSG_CTRUNC)
+
+ def _testFDPassCMSG_LEN(self):
+ self.createAndSendFDs(1)
+
+ # Issue #12958: The following test has problems on Mac OS X
+ @support.anticipate_failure(sys.platform == "darwin")
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassSeparate(self):
+ # Pass two FDs in two separate arrays. Arrays may be combined
+ # into a single control message by the OS.
+ self.checkRecvmsgFDs(2,
+ self.doRecvmsg(self.serv_sock, len(MSG), 10240),
+ maxcmsgs=2)
+
+ @testFDPassSeparate.client_skip
+ @support.anticipate_failure(sys.platform == "darwin")
+ def _testFDPassSeparate(self):
+ fd0, fd1 = self.newFDs(2)
+ self.assertEqual(
+ self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd0])),
+ (socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd1]))]),
+ len(MSG))
+
+ # Issue #12958: The following test has problems on Mac OS X
+ @support.anticipate_failure(sys.platform == "darwin")
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassSeparateMinSpace(self):
+ # Pass two FDs in two separate arrays, receiving them into the
+ # minimum space for two arrays.
+ self.checkRecvmsgFDs(2,
+ self.doRecvmsg(self.serv_sock, len(MSG),
+ socket.CMSG_SPACE(SIZEOF_INT) +
+ socket.CMSG_LEN(SIZEOF_INT)),
+ maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
+
+ @testFDPassSeparateMinSpace.client_skip
+ @support.anticipate_failure(sys.platform == "darwin")
+ def _testFDPassSeparateMinSpace(self):
+ fd0, fd1 = self.newFDs(2)
+ self.assertEqual(
+ self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd0])),
+ (socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd1]))]),
+ len(MSG))
+
+ def sendAncillaryIfPossible(self, msg, ancdata):
+ # Try to send msg and ancdata to server, but if the system
+ # call fails, just send msg with no ancillary data.
+ try:
+ nbytes = self.sendmsgToServer([msg], ancdata)
+ except socket.error as e:
+ # Check that it was the system call that failed
+ self.assertIsInstance(e.errno, int)
+ nbytes = self.sendmsgToServer([msg])
+ self.assertEqual(nbytes, len(msg))
+
+ def testFDPassEmpty(self):
+ # Try to pass an empty FD array. Can receive either no array
+ # or an empty array.
+ self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240),
+ ignoreflags=socket.MSG_CTRUNC)
+
+ def _testFDPassEmpty(self):
+ self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ b"")])
+
+ def testFDPassPartialInt(self):
+ # Try to pass a truncated FD array.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
+ self.assertLessEqual(len(ancdata), 1)
+ for cmsg_level, cmsg_type, cmsg_data in ancdata:
+ self.assertEqual(cmsg_level, socket.SOL_SOCKET)
+ self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
+ self.assertLess(len(cmsg_data), SIZEOF_INT)
+
+ def _testFDPassPartialInt(self):
+ self.sendAncillaryIfPossible(
+ MSG,
+ [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [self.badfd]).tobytes()[:-1])])
+
+ @requireAttrs(socket, "CMSG_SPACE")
+ def testFDPassPartialIntInMiddle(self):
+ # Try to pass two FD arrays, the first of which is truncated.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), 10240)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
+ self.assertLessEqual(len(ancdata), 2)
+ fds = array.array("i")
+ # Arrays may have been combined in a single control message
+ for cmsg_level, cmsg_type, cmsg_data in ancdata:
+ self.assertEqual(cmsg_level, socket.SOL_SOCKET)
+ self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
+ fds.frombytes(cmsg_data[:
+ len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
+ self.assertLessEqual(len(fds), 2)
+ self.checkFDs(fds)
+
+ @testFDPassPartialIntInMiddle.client_skip
+ def _testFDPassPartialIntInMiddle(self):
+ fd0, fd1 = self.newFDs(2)
+ self.sendAncillaryIfPossible(
+ MSG,
+ [(socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
+ (socket.SOL_SOCKET,
+ socket.SCM_RIGHTS,
+ array.array("i", [fd1]))])
+
+ def checkTruncatedHeader(self, result, ignoreflags=0):
+ # Check that no ancillary data items are returned when data is
+ # truncated inside the cmsghdr structure.
+ msg, ancdata, flags, addr = result
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+
+ def testCmsgTruncNoBufSize(self):
+ # Check that no ancillary data is received when no buffer size
+ # is specified.
+ self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
+ # BSD seems to set MSG_CTRUNC only
+ # if an item has been partially
+ # received.
+ ignoreflags=socket.MSG_CTRUNC)
+
+ def _testCmsgTruncNoBufSize(self):
+ self.createAndSendFDs(1)
+
+ def testCmsgTrunc0(self):
+ # Check that no ancillary data is received when buffer size is 0.
+ self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
+ ignoreflags=socket.MSG_CTRUNC)
+
+ def _testCmsgTrunc0(self):
+ self.createAndSendFDs(1)
+
+ # Check that no ancillary data is returned for various non-zero
+ # (but still too small) buffer sizes.
+
+ def testCmsgTrunc1(self):
+ self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
+
+ def _testCmsgTrunc1(self):
+ self.createAndSendFDs(1)
+
+ def testCmsgTrunc2Int(self):
+ # The cmsghdr structure has at least three members, two of
+ # which are ints, so we still shouldn't see any ancillary
+ # data.
+ self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
+ SIZEOF_INT * 2))
+
+ def _testCmsgTrunc2Int(self):
+ self.createAndSendFDs(1)
+
+ def testCmsgTruncLen0Minus1(self):
+ self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
+ socket.CMSG_LEN(0) - 1))
+
+ def _testCmsgTruncLen0Minus1(self):
+ self.createAndSendFDs(1)
+
+ # The following tests try to truncate the control message in the
+ # middle of the FD array.
+
+ def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
+ # Check that file descriptor data is truncated to between
+ # mindata and maxdata bytes when received with buffer size
+ # ancbuf, and that any complete file descriptor numbers are
+ # valid.
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), ancbuf)
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
+
+ if mindata == 0 and ancdata == []:
+ return
+ self.assertEqual(len(ancdata), 1)
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ self.assertEqual(cmsg_level, socket.SOL_SOCKET)
+ self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
+ self.assertGreaterEqual(len(cmsg_data), mindata)
+ self.assertLessEqual(len(cmsg_data), maxdata)
+ fds = array.array("i")
+ fds.frombytes(cmsg_data[:
+ len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
+ self.checkFDs(fds)
+
+ def testCmsgTruncLen0(self):
+ self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
+
+ def _testCmsgTruncLen0(self):
+ self.createAndSendFDs(1)
+
+ def testCmsgTruncLen0Plus1(self):
+ self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
+
+ def _testCmsgTruncLen0Plus1(self):
+ self.createAndSendFDs(2)
+
+ def testCmsgTruncLen1(self):
+ self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
+ maxdata=SIZEOF_INT)
+
+ def _testCmsgTruncLen1(self):
+ self.createAndSendFDs(2)
+
+ def testCmsgTruncLen2Minus1(self):
+ self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
+ maxdata=(2 * SIZEOF_INT) - 1)
+
+ def _testCmsgTruncLen2Minus1(self):
+ self.createAndSendFDs(2)
+
+
+class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
+ # Test sendmsg() and recvmsg[_into]() using the ancillary data
+ # features of the RFC 3542 Advanced Sockets API for IPv6.
+ # Currently we can only handle certain data items (e.g. traffic
+ # class, hop limit, MTU discovery and fragmentation settings)
+ # without resorting to unportable means such as the struct module,
+ # but the tests here are aimed at testing the ancillary data
+ # handling in sendmsg() and recvmsg() rather than the IPv6 API
+ # itself.
+
+ # Test value to use when setting hop limit of packet
+ hop_limit = 2
+
+ # Test value to use when setting traffic class of packet.
+ # -1 means "use kernel default".
+ traffic_class = -1
+
+ def ancillaryMapping(self, ancdata):
+ # Given ancillary data list ancdata, return a mapping from
+ # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
+ # Check that no (level, type) pair appears more than once.
+ d = {}
+ for cmsg_level, cmsg_type, cmsg_data in ancdata:
+ self.assertNotIn((cmsg_level, cmsg_type), d)
+ d[(cmsg_level, cmsg_type)] = cmsg_data
+ return d
+
+ def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
+ # Receive hop limit into ancbufsize bytes of ancillary data
+ # space. Check that data is MSG, ancillary data is not
+ # truncated (but ignore any flags in ignoreflags), and hop
+ # limit is between 0 and maxhop inclusive.
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.misc_event.set()
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), ancbufsize)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+
+ self.assertEqual(len(ancdata), 1)
+ self.assertIsInstance(ancdata[0], tuple)
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
+ self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
+ self.assertIsInstance(cmsg_data, bytes)
+ self.assertEqual(len(cmsg_data), SIZEOF_INT)
+ a = array.array("i")
+ a.frombytes(cmsg_data)
+ self.assertGreaterEqual(a[0], 0)
+ self.assertLessEqual(a[0], maxhop)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testRecvHopLimit(self):
+ # Test receiving the packet hop limit as ancillary data.
+ self.checkHopLimit(ancbufsize=10240)
+
+ @testRecvHopLimit.client_skip
+ def _testRecvHopLimit(self):
+ # Need to wait until server has asked to receive ancillary
+ # data, as implementations are not required to buffer it
+ # otherwise.
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testRecvHopLimitCMSG_SPACE(self):
+ # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
+ self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
+
+ @testRecvHopLimitCMSG_SPACE.client_skip
+ def _testRecvHopLimitCMSG_SPACE(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ # Could test receiving into buffer sized using CMSG_LEN, but RFC
+ # 3542 says portable applications must provide space for trailing
+ # padding. Implementations may set MSG_CTRUNC if there isn't
+ # enough space for the padding.
+
+ @requireAttrs(socket.socket, "sendmsg")
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSetHopLimit(self):
+ # Test setting hop limit on outgoing packet and receiving it
+ # at the other end.
+ self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
+
+ @testSetHopLimit.client_skip
+ def _testSetHopLimit(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.assertEqual(
+ self.sendmsgToServer([MSG],
+ [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
+ array.array("i", [self.hop_limit]))]),
+ len(MSG))
+
+ def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
+ ignoreflags=0):
+ # Receive traffic class and hop limit into ancbufsize bytes of
+ # ancillary data space. Check that data is MSG, ancillary
+ # data is not truncated (but ignore any flags in ignoreflags),
+ # and traffic class and hop limit are in range (hop limit no
+ # more than maxhop).
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVTCLASS, 1)
+ self.misc_event.set()
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), ancbufsize)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+ self.assertEqual(len(ancdata), 2)
+ ancmap = self.ancillaryMapping(ancdata)
+
+ tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
+ self.assertEqual(len(tcdata), SIZEOF_INT)
+ a = array.array("i")
+ a.frombytes(tcdata)
+ self.assertGreaterEqual(a[0], 0)
+ self.assertLessEqual(a[0], 255)
+
+ hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
+ self.assertEqual(len(hldata), SIZEOF_INT)
+ a = array.array("i")
+ a.frombytes(hldata)
+ self.assertGreaterEqual(a[0], 0)
+ self.assertLessEqual(a[0], maxhop)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testRecvTrafficClassAndHopLimit(self):
+ # Test receiving traffic class and hop limit as ancillary data.
+ self.checkTrafficClassAndHopLimit(ancbufsize=10240)
+
+ @testRecvTrafficClassAndHopLimit.client_skip
+ def _testRecvTrafficClassAndHopLimit(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
+ # Test receiving traffic class and hop limit, using
+ # CMSG_SPACE() to calculate buffer size.
+ self.checkTrafficClassAndHopLimit(
+ ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
+
+ @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
+ def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket.socket, "sendmsg")
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSetTrafficClassAndHopLimit(self):
+ # Test setting traffic class and hop limit on outgoing packet,
+ # and receiving them at the other end.
+ self.checkTrafficClassAndHopLimit(ancbufsize=10240,
+ maxhop=self.hop_limit)
+
+ @testSetTrafficClassAndHopLimit.client_skip
+ def _testSetTrafficClassAndHopLimit(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.assertEqual(
+ self.sendmsgToServer([MSG],
+ [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
+ array.array("i", [self.traffic_class])),
+ (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
+ array.array("i", [self.hop_limit]))]),
+ len(MSG))
+
+ @requireAttrs(socket.socket, "sendmsg")
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testOddCmsgSize(self):
+ # Try to send ancillary data with first item one byte too
+ # long. Fall back to sending with correct size if this fails,
+ # and check that second item was handled correctly.
+ self.checkTrafficClassAndHopLimit(ancbufsize=10240,
+ maxhop=self.hop_limit)
+
+ @testOddCmsgSize.client_skip
+ def _testOddCmsgSize(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ try:
+ nbytes = self.sendmsgToServer(
+ [MSG],
+ [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
+ array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
+ (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
+ array.array("i", [self.hop_limit]))])
+ except socket.error as e:
+ self.assertIsInstance(e.errno, int)
+ nbytes = self.sendmsgToServer(
+ [MSG],
+ [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
+ array.array("i", [self.traffic_class])),
+ (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
+ array.array("i", [self.hop_limit]))])
+ self.assertEqual(nbytes, len(MSG))
+
+ # Tests for proper handling of truncated ancillary data
+
+ def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
+ # Receive hop limit into ancbufsize bytes of ancillary data
+ # space, which should be too small to contain the ancillary
+ # data header (if ancbufsize is None, pass no second argument
+ # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
+ # (unless included in ignoreflags), and no ancillary data is
+ # returned.
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.misc_event.set()
+ args = () if ancbufsize is None else (ancbufsize,)
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), *args)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.assertEqual(ancdata, [])
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testCmsgTruncNoBufSize(self):
+ # Check that no ancillary data is received when no ancillary
+ # buffer size is provided.
+ self.checkHopLimitTruncatedHeader(ancbufsize=None,
+ # BSD seems to set
+ # MSG_CTRUNC only if an item
+ # has been partially
+ # received.
+ ignoreflags=socket.MSG_CTRUNC)
+
+ @testCmsgTruncNoBufSize.client_skip
+ def _testCmsgTruncNoBufSize(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSingleCmsgTrunc0(self):
+ # Check that no ancillary data is received when ancillary
+ # buffer size is zero.
+ self.checkHopLimitTruncatedHeader(ancbufsize=0,
+ ignoreflags=socket.MSG_CTRUNC)
+
+ @testSingleCmsgTrunc0.client_skip
+ def _testSingleCmsgTrunc0(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ # Check that no ancillary data is returned for various non-zero
+ # (but still too small) buffer sizes.
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSingleCmsgTrunc1(self):
+ self.checkHopLimitTruncatedHeader(ancbufsize=1)
+
+ @testSingleCmsgTrunc1.client_skip
+ def _testSingleCmsgTrunc1(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSingleCmsgTrunc2Int(self):
+ self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
+
+ @testSingleCmsgTrunc2Int.client_skip
+ def _testSingleCmsgTrunc2Int(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSingleCmsgTruncLen0Minus1(self):
+ self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
+
+ @testSingleCmsgTruncLen0Minus1.client_skip
+ def _testSingleCmsgTruncLen0Minus1(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
+ def testSingleCmsgTruncInData(self):
+ # Test truncation of a control message inside its associated
+ # data. The message may be returned with its data truncated,
+ # or not returned at all.
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.misc_event.set()
+ msg, ancdata, flags, addr = self.doRecvmsg(
+ self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
+
+ self.assertLessEqual(len(ancdata), 1)
+ if ancdata:
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
+ self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
+ self.assertLess(len(cmsg_data), SIZEOF_INT)
+
+ @testSingleCmsgTruncInData.client_skip
+ def _testSingleCmsgTruncInData(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
+ # Receive traffic class and hop limit into ancbufsize bytes of
+ # ancillary data space, which should be large enough to
+ # contain the first item, but too small to contain the header
+ # of the second. Check that data is MSG, MSG_CTRUNC is set
+ # (unless included in ignoreflags), and only one ancillary
+ # data item is returned.
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVTCLASS, 1)
+ self.misc_event.set()
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
+ len(MSG), ancbufsize)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
+ ignore=ignoreflags)
+
+ self.assertEqual(len(ancdata), 1)
+ cmsg_level, cmsg_type, cmsg_data = ancdata[0]
+ self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
+ self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
+ self.assertEqual(len(cmsg_data), SIZEOF_INT)
+ a = array.array("i")
+ a.frombytes(cmsg_data)
+ self.assertGreaterEqual(a[0], 0)
+ self.assertLessEqual(a[0], 255)
+
+ # Try the above test with various buffer sizes.
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSecondCmsgTrunc0(self):
+ self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
+ ignoreflags=socket.MSG_CTRUNC)
+
+ @testSecondCmsgTrunc0.client_skip
+ def _testSecondCmsgTrunc0(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSecondCmsgTrunc1(self):
+ self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
+
+ @testSecondCmsgTrunc1.client_skip
+ def _testSecondCmsgTrunc1(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSecondCmsgTrunc2Int(self):
+ self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
+ 2 * SIZEOF_INT)
+
+ @testSecondCmsgTrunc2Int.client_skip
+ def _testSecondCmsgTrunc2Int(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSecondCmsgTruncLen0Minus1(self):
+ self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
+ socket.CMSG_LEN(0) - 1)
+
+ @testSecondCmsgTruncLen0Minus1.client_skip
+ def _testSecondCmsgTruncLen0Minus1(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+ @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
+ "IPV6_RECVTCLASS", "IPV6_TCLASS")
+ def testSecomdCmsgTruncInData(self):
+ # Test truncation of the second of two control messages inside
+ # its associated data.
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVHOPLIMIT, 1)
+ self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
+ socket.IPV6_RECVTCLASS, 1)
+ self.misc_event.set()
+ msg, ancdata, flags, addr = self.doRecvmsg(
+ self.serv_sock, len(MSG),
+ socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
+
+ self.assertEqual(msg, MSG)
+ self.checkRecvmsgAddress(addr, self.cli_addr)
+ self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
+
+ cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
+
+ cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
+ self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
+ cmsg_types.remove(cmsg_type)
+ self.assertEqual(len(cmsg_data), SIZEOF_INT)
+ a = array.array("i")
+ a.frombytes(cmsg_data)
+ self.assertGreaterEqual(a[0], 0)
+ self.assertLessEqual(a[0], 255)
+
+ if ancdata:
+ cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
+ self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
+ cmsg_types.remove(cmsg_type)
+ self.assertLess(len(cmsg_data), SIZEOF_INT)
+
+ self.assertEqual(ancdata, [])
+
+ @testSecomdCmsgTruncInData.client_skip
+ def _testSecomdCmsgTruncInData(self):
+ self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
+ self.sendToServer(MSG)
+
+
+# Derive concrete test classes for different socket types.
+
+class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
+ SendrecvmsgConnectionlessBase,
+ ThreadedSocketTestMixin, UDPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
+ pass
+
+
+class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
+ SendrecvmsgConnectionlessBase,
+ ThreadedSocketTestMixin, UDP6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@requireAttrs(socket, "IPPROTO_IPV6")
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
+ SendrecvmsgUDP6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@requireAttrs(socket, "IPPROTO_IPV6")
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
+ RFC3542AncillaryTest,
+ SendrecvmsgUDP6TestBase):
+ pass
+
+
+class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
+ ConnectedStreamTestMixin, TCPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
+ SendrecvmsgTCPTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
+ SendrecvmsgTCPTestBase):
+ pass
+
+
+class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
+ SendrecvmsgConnectedBase,
+ ConnectedStreamTestMixin, SCTPStreamBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg")
+@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
+ SendrecvmsgSCTPStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
+ SendrecvmsgSCTPStreamTestBase):
+ pass
+
+
+class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
+ ConnectedStreamTestMixin, UnixStreamBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg")
+@requireAttrs(socket, "AF_UNIX")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@requireAttrs(socket, "AF_UNIX")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
+ SendrecvmsgUnixStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@requireAttrs(socket, "AF_UNIX")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
+ SendrecvmsgUnixStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg", "recvmsg")
+@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
+ pass
+
+@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
+@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
+ SendrecvmsgUnixStreamTestBase):
+ pass
+
+
+# Test interrupting the interruptible send/receive methods with a
+# signal when a timeout is set. These tests avoid having multiple
+# threads alive during the test so that the OS cannot deliver the
+# signal to the wrong one.
+
+class InterruptedTimeoutBase(unittest.TestCase):
+ # Base class for interrupted send/receive tests. Installs an
+ # empty handler for SIGALRM and removes it on teardown, along with
+ # any scheduled alarms.
+
+ def setUp(self):
+ super().setUp()
+ orig_alrm_handler = signal.signal(signal.SIGALRM,
+ lambda signum, frame: None)
+ self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
+ self.addCleanup(self.setAlarm, 0)
+
+ # Timeout for socket operations
+ timeout = 4.0
+
+ # Provide setAlarm() method to schedule delivery of SIGALRM after
+ # given number of seconds, or cancel it if zero, and an
+ # appropriate time value to use. Use setitimer() if available.
+ if hasattr(signal, "setitimer"):
+ alarm_time = 0.05
+
+ def setAlarm(self, seconds):
+ signal.setitimer(signal.ITIMER_REAL, seconds)
+ else:
+ # Old systems may deliver the alarm up to one second early
+ alarm_time = 2
+
+ def setAlarm(self, seconds):
+ signal.alarm(seconds)
+
+
+# Require siginterrupt() in order to ensure that system calls are
+# interrupted by default.
+@requireAttrs(signal, "siginterrupt")
+@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
+ "Don't have signal.alarm or signal.setitimer")
+class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
+ # Test interrupting the recv*() methods with signals when a
+ # timeout is set.
+
+ def setUp(self):
+ super().setUp()
+ self.serv.settimeout(self.timeout)
+
+ def checkInterruptedRecv(self, func, *args, **kwargs):
+ # Check that func(*args, **kwargs) raises socket.error with an
+ # errno of EINTR when interrupted by a signal.
+ self.setAlarm(self.alarm_time)
+ with self.assertRaises(socket.error) as cm:
+ func(*args, **kwargs)
+ self.assertNotIsInstance(cm.exception, socket.timeout)
+ self.assertEqual(cm.exception.errno, errno.EINTR)
+
+ def testInterruptedRecvTimeout(self):
+ self.checkInterruptedRecv(self.serv.recv, 1024)
+
+ def testInterruptedRecvIntoTimeout(self):
+ self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
+
+ def testInterruptedRecvfromTimeout(self):
+ self.checkInterruptedRecv(self.serv.recvfrom, 1024)
+
+ def testInterruptedRecvfromIntoTimeout(self):
+ self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
+
+ @requireAttrs(socket.socket, "recvmsg")
+ def testInterruptedRecvmsgTimeout(self):
+ self.checkInterruptedRecv(self.serv.recvmsg, 1024)
+
+ @requireAttrs(socket.socket, "recvmsg_into")
+ def testInterruptedRecvmsgIntoTimeout(self):
+ self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
+
+
+# Require siginterrupt() in order to ensure that system calls are
+# interrupted by default.
+@requireAttrs(signal, "siginterrupt")
+@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
+ "Don't have signal.alarm or signal.setitimer")
+@unittest.skipUnless(thread, 'Threading required for this test.')
+class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
+ ThreadSafeCleanupTestCase,
+ SocketListeningTestMixin, TCPTestBase):
+ # Test interrupting the interruptible send*() methods with signals
+ # when a timeout is set.
+
+ def setUp(self):
+ super().setUp()
+ self.serv_conn = self.newSocket()
+ self.addCleanup(self.serv_conn.close)
+ # Use a thread to complete the connection, but wait for it to
+ # terminate before running the test, so that there is only one
+ # thread to accept the signal.
+ cli_thread = threading.Thread(target=self.doConnect)
+ cli_thread.start()
+ self.cli_conn, addr = self.serv.accept()
+ self.addCleanup(self.cli_conn.close)
+ cli_thread.join()
+ self.serv_conn.settimeout(self.timeout)
+
+ def doConnect(self):
+ self.serv_conn.connect(self.serv_addr)
+
+ def checkInterruptedSend(self, func, *args, **kwargs):
+ # Check that func(*args, **kwargs), run in a loop, raises
+ # socket.error with an errno of EINTR when interrupted by a
+ # signal.
+ with self.assertRaises(socket.error) as cm:
+ while True:
+ self.setAlarm(self.alarm_time)
+ func(*args, **kwargs)
+ self.assertNotIsInstance(cm.exception, socket.timeout)
+ self.assertEqual(cm.exception.errno, errno.EINTR)
+
+ # Issue #12958: The following tests have problems on Mac OS X
+ @support.anticipate_failure(sys.platform == "darwin")
+ def testInterruptedSendTimeout(self):
+ self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
+
+ @support.anticipate_failure(sys.platform == "darwin")
+ def testInterruptedSendtoTimeout(self):
+ # Passing an actual address here as Python's wrapper for
+ # sendto() doesn't allow passing a zero-length one; POSIX
+ # requires that the address is ignored since the socket is
+ # connection-mode, however.
+ self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
+ self.serv_addr)
+
+ @support.anticipate_failure(sys.platform == "darwin")
+ @requireAttrs(socket.socket, "sendmsg")
+ def testInterruptedSendmsgTimeout(self):
+ self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
+
+
@unittest.skipUnless(thread, 'Threading required for this test.')
class TCPCloserTest(ThreadedTCPSocketTest):
@@ -1080,11 +3554,8 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
pass
if hasattr(socket, "SOCK_NONBLOCK"):
+ @support.requires_linux_version(2, 6, 28)
def testInitNonBlocking(self):
- v = linux_version()
- if v < (2, 6, 28):
- self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
- % ".".join(map(str, v)))
# reinit server socket
self.serv.close()
self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
@@ -1186,7 +3657,7 @@ class FileObjectClassTestCase(SocketConnectedTest):
"""
bufsize = -1 # Use default buffer size
- encoding = 'utf8'
+ encoding = 'utf-8'
errors = 'strict'
newline = None
@@ -1367,7 +3838,7 @@ class FileObjectInterruptedTestCase(unittest.TestCase):
@staticmethod
def _raise_eintr():
- raise socket.error(errno.EINTR)
+ raise socket.error(errno.EINTR, "interrupted")
def _textiowrap_mock_socket(self, mock, buffering=-1):
raw = socket.SocketIO(mock, "r")
@@ -1407,7 +3878,7 @@ class FileObjectInterruptedTestCase(unittest.TestCase):
data = b''
else:
data = ''
- expecting = expecting.decode('utf8')
+ expecting = expecting.decode('utf-8')
while len(data) != len(expecting):
part = fo.read(size)
if not part:
@@ -1569,7 +4040,7 @@ class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
"""Tests for socket.makefile() in text mode (rather than binary)"""
read_mode = 'r'
- read_msg = MSG.decode('utf8')
+ read_msg = MSG.decode('utf-8')
write_mode = 'wb'
write_msg = MSG
newline = ''
@@ -1581,7 +4052,7 @@ class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
read_mode = 'rb'
read_msg = MSG
write_mode = 'w'
- write_msg = MSG.decode('utf8')
+ write_msg = MSG.decode('utf-8')
newline = ''
@@ -1589,9 +4060,9 @@ class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
"""Tests for socket.makefile() in text mode (rather than binary)"""
read_mode = 'r'
- read_msg = MSG.decode('utf8')
+ read_msg = MSG.decode('utf-8')
write_mode = 'w'
- write_msg = MSG.decode('utf8')
+ write_msg = MSG.decode('utf-8')
newline = ''
@@ -1882,6 +4353,78 @@ class TestLinuxAbstractNamespace(unittest.TestCase):
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
self.assertRaises(socket.error, s.bind, address)
+ def testStrName(self):
+ # Check that an abstract name can be passed as a string.
+ s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ try:
+ s.bind("\x00python\x00test\x00")
+ self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
+ finally:
+ s.close()
+
+class TestUnixDomain(unittest.TestCase):
+
+ def setUp(self):
+ self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+
+ def tearDown(self):
+ self.sock.close()
+
+ def encoded(self, path):
+ # Return the given path encoded in the file system encoding,
+ # or skip the test if this is not possible.
+ try:
+ return os.fsencode(path)
+ except UnicodeEncodeError:
+ self.skipTest(
+ "Pathname {0!a} cannot be represented in file "
+ "system encoding {1!r}".format(
+ path, sys.getfilesystemencoding()))
+
+ def bind(self, sock, path):
+ # Bind the socket
+ try:
+ sock.bind(path)
+ except OSError as e:
+ if str(e) == "AF_UNIX path too long":
+ self.skipTest(
+ "Pathname {0!a} is too long to serve as a AF_UNIX path"
+ .format(path))
+ else:
+ raise
+
+ def testStrAddr(self):
+ # Test binding to and retrieving a normal string pathname.
+ path = os.path.abspath(support.TESTFN)
+ self.bind(self.sock, path)
+ self.addCleanup(support.unlink, path)
+ self.assertEqual(self.sock.getsockname(), path)
+
+ def testBytesAddr(self):
+ # Test binding to a bytes pathname.
+ path = os.path.abspath(support.TESTFN)
+ self.bind(self.sock, self.encoded(path))
+ self.addCleanup(support.unlink, path)
+ self.assertEqual(self.sock.getsockname(), path)
+
+ def testSurrogateescapeBind(self):
+ # Test binding to a valid non-ASCII pathname, with the
+ # non-ASCII bytes supplied using surrogateescape encoding.
+ path = os.path.abspath(support.TESTFN_UNICODE)
+ b = self.encoded(path)
+ self.bind(self.sock, b.decode("ascii", "surrogateescape"))
+ self.addCleanup(support.unlink, path)
+ self.assertEqual(self.sock.getsockname(), path)
+
+ def testUnencodableAddr(self):
+ # Test binding to a pathname that cannot be encoded in the
+ # file system encoding.
+ if support.TESTFN_UNENCODABLE is None:
+ self.skipTest("No unencodable filename available")
+ path = os.path.abspath(support.TESTFN_UNENCODABLE)
+ self.bind(self.sock, path)
+ self.addCleanup(support.unlink, path)
+ self.assertEqual(self.sock.getsockname(), path)
@unittest.skipUnless(thread, 'Threading required for this test.')
class BufferIOTest(SocketConnectedTest):
@@ -2082,11 +4625,8 @@ class ContextManagersTest(ThreadedTCPSocketTest):
"SOCK_CLOEXEC not defined")
@unittest.skipUnless(fcntl, "module fcntl not available")
class CloexecConstantTest(unittest.TestCase):
+ @support.requires_linux_version(2, 6, 28)
def test_SOCK_CLOEXEC(self):
- v = linux_version()
- if v < (2, 6, 28):
- self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
- % ".".join(map(str, v)))
with socket.socket(socket.AF_INET,
socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
self.assertTrue(s.type & socket.SOCK_CLOEXEC)
@@ -2104,11 +4644,8 @@ class NonblockConstantTest(unittest.TestCase):
self.assertFalse(s.type & socket.SOCK_NONBLOCK)
self.assertEqual(s.gettimeout(), None)
+ @support.requires_linux_version(2, 6, 28)
def test_SOCK_NONBLOCK(self):
- v = linux_version()
- if v < (2, 6, 28):
- self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
- % ".".join(map(str, v)))
# a lot of it seems silly and redundant, but I wanted to test that
# changing back and forth worked ok
with socket.socket(socket.AF_INET,
@@ -2141,6 +4678,109 @@ class NonblockConstantTest(unittest.TestCase):
socket.setdefaulttimeout(t)
+@unittest.skipUnless(os.name == "nt", "Windows specific")
+@unittest.skipUnless(multiprocessing, "need multiprocessing")
+class TestSocketSharing(SocketTCPTest):
+ # This must be classmethod and not staticmethod or multiprocessing
+ # won't be able to bootstrap it.
+ @classmethod
+ def remoteProcessServer(cls, q):
+ # Recreate socket from shared data
+ sdata = q.get()
+ message = q.get()
+
+ s = socket.fromshare(sdata)
+ s2, c = s.accept()
+
+ # Send the message
+ s2.sendall(message)
+ s2.close()
+ s.close()
+
+ def testShare(self):
+ # Transfer the listening server socket to another process
+ # and service it from there.
+
+ # Create process:
+ q = multiprocessing.Queue()
+ p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
+ p.start()
+
+ # Get the shared socket data
+ data = self.serv.share(p.pid)
+
+ # Pass the shared socket to the other process
+ addr = self.serv.getsockname()
+ self.serv.close()
+ q.put(data)
+
+ # The data that the server will send us
+ message = b"slapmahfro"
+ q.put(message)
+
+ # Connect
+ s = socket.create_connection(addr)
+ # listen for the data
+ m = []
+ while True:
+ data = s.recv(100)
+ if not data:
+ break
+ m.append(data)
+ s.close()
+ received = b"".join(m)
+ self.assertEqual(received, message)
+ p.join()
+
+ def testShareLength(self):
+ data = self.serv.share(os.getpid())
+ self.assertRaises(ValueError, socket.fromshare, data[:-1])
+ self.assertRaises(ValueError, socket.fromshare, data+b"foo")
+
+ def compareSockets(self, org, other):
+ # socket sharing is expected to work only for blocking socket
+ # since the internal python timout value isn't transfered.
+ self.assertEqual(org.gettimeout(), None)
+ self.assertEqual(org.gettimeout(), other.gettimeout())
+
+ self.assertEqual(org.family, other.family)
+ self.assertEqual(org.type, other.type)
+ # If the user specified "0" for proto, then
+ # internally windows will have picked the correct value.
+ # Python introspection on the socket however will still return
+ # 0. For the shared socket, the python value is recreated
+ # from the actual value, so it may not compare correctly.
+ if org.proto != 0:
+ self.assertEqual(org.proto, other.proto)
+
+ def testShareLocal(self):
+ data = self.serv.share(os.getpid())
+ s = socket.fromshare(data)
+ try:
+ self.compareSockets(self.serv, s)
+ finally:
+ s.close()
+
+ def testTypes(self):
+ families = [socket.AF_INET, socket.AF_INET6]
+ types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
+ for f in families:
+ for t in types:
+ try:
+ source = socket.socket(f, t)
+ except OSError:
+ continue # This combination is not supported
+ try:
+ data = source.share(os.getpid())
+ shared = socket.fromshare(data)
+ try:
+ self.compareSockets(source, shared)
+ finally:
+ shared.close()
+ finally:
+ source.close()
+
+
def test_main():
tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
@@ -2164,11 +4804,41 @@ def test_main():
])
if hasattr(socket, "socketpair"):
tests.append(BasicSocketPairTest)
- if sys.platform == 'linux2':
+ if hasattr(socket, "AF_UNIX"):
+ tests.append(TestUnixDomain)
+ if sys.platform == 'linux':
tests.append(TestLinuxAbstractNamespace)
if isTipcAvailable():
tests.append(TIPCTest)
tests.append(TIPCThreadableTest)
+ tests.extend([BasicCANTest, CANTest])
+ tests.extend([BasicRDSTest, RDSTest])
+ tests.extend([
+ CmsgMacroTests,
+ SendmsgUDPTest,
+ RecvmsgUDPTest,
+ RecvmsgIntoUDPTest,
+ SendmsgUDP6Test,
+ RecvmsgUDP6Test,
+ RecvmsgRFC3542AncillaryUDP6Test,
+ RecvmsgIntoRFC3542AncillaryUDP6Test,
+ RecvmsgIntoUDP6Test,
+ SendmsgTCPTest,
+ RecvmsgTCPTest,
+ RecvmsgIntoTCPTest,
+ SendmsgSCTPStreamTest,
+ RecvmsgSCTPStreamTest,
+ RecvmsgIntoSCTPStreamTest,
+ SendmsgUnixStreamTest,
+ RecvmsgUnixStreamTest,
+ RecvmsgIntoUnixStreamTest,
+ RecvmsgSCMRightsStreamTest,
+ RecvmsgIntoSCMRightsStreamTest,
+ # These are slow when setitimer() is not available
+ InterruptedRecvTimeoutTest,
+ InterruptedSendTimeoutTest,
+ TestSocketSharing,
+ ])
thread_info = support.threading_setup()
support.run_unittest(*tests)
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
index ca23301..353f8ff 100644
--- a/Lib/test/test_socketserver.py
+++ b/Lib/test/test_socketserver.py
@@ -244,7 +244,7 @@ class SocketServerTest(unittest.TestCase):
self.called += 1
if self.called == 1:
# raise the exception on first call
- raise select.error(errno.EINTR, os.strerror(errno.EINTR))
+ raise OSError(errno.EINTR, os.strerror(errno.EINTR))
else:
# Return real select value for consecutive calls
return old_select(*args)
diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 2f0b3e6..74abbd2 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -42,6 +42,9 @@ ONLYCERT = data_file("ssl_cert.pem")
ONLYKEY = data_file("ssl_key.pem")
BYTES_ONLYCERT = os.fsencode(ONLYCERT)
BYTES_ONLYKEY = os.fsencode(ONLYKEY)
+CERTFILE_PROTECTED = data_file("keycert.passwd.pem")
+ONLYKEY_PROTECTED = data_file("ssl_key.passwd.pem")
+KEY_PASSWORD = "somepass"
CAPATH = data_file("capath")
BYTES_CAPATH = os.fsencode(CAPATH)
@@ -53,6 +56,8 @@ WRONGCERT = data_file("XXXnonexisting.pem")
BADKEY = data_file("badkey.pem")
NOKIACERT = data_file("nokia.pem")
+DHFILE = data_file("dh512.pem")
+BYTES_DHFILE = os.fsencode(DHFILE)
def handle_error(prefix):
exc_format = ' '.join(traceback.format_exception(*sys.exc_info()))
@@ -95,7 +100,14 @@ class BasicSocketTests(unittest.TestCase):
ssl.CERT_NONE
ssl.CERT_OPTIONAL
ssl.CERT_REQUIRED
+ ssl.OP_CIPHER_SERVER_PREFERENCE
+ ssl.OP_SINGLE_DH_USE
+ if ssl.HAS_ECDH:
+ ssl.OP_SINGLE_ECDH_USE
+ if ssl.OPENSSL_VERSION_INFO >= (1, 0):
+ ssl.OP_NO_COMPRESSION
self.assertIn(ssl.HAS_SNI, {True, False})
+ self.assertIn(ssl.HAS_ECDH, {True, False})
def test_random(self):
v = ssl.RAND_status()
@@ -103,6 +115,16 @@ class BasicSocketTests(unittest.TestCase):
sys.stdout.write("\n RAND_status is %d (%s)\n"
% (v, (v and "sufficient randomness") or
"insufficient randomness"))
+
+ data, is_cryptographic = ssl.RAND_pseudo_bytes(16)
+ self.assertEqual(len(data), 16)
+ self.assertEqual(is_cryptographic, v == 1)
+ if v:
+ data = ssl.RAND_bytes(16)
+ self.assertEqual(len(data), 16)
+ else:
+ self.assertRaises(ssl.SSLError, ssl.RAND_bytes, 16)
+
self.assertRaises(TypeError, ssl.RAND_egd, 1)
self.assertRaises(TypeError, ssl.RAND_egd, 'foo', 1)
ssl.RAND_add("this is a random string", 75.0)
@@ -333,6 +355,25 @@ class BasicSocketTests(unittest.TestCase):
self.assertRaises(ValueError, ctx.wrap_socket, sock, True,
server_hostname="some.hostname")
+ def test_unknown_channel_binding(self):
+ # should raise ValueError for unknown type
+ s = socket.socket(socket.AF_INET)
+ ss = ssl.wrap_socket(s)
+ with self.assertRaises(ValueError):
+ ss.get_channel_binding("unknown-type")
+
+ @unittest.skipUnless("tls-unique" in ssl.CHANNEL_BINDING_TYPES,
+ "'tls-unique' channel binding not available")
+ def test_tls_unique_channel_binding(self):
+ # unconnected should return None for known type
+ s = socket.socket(socket.AF_INET)
+ ss = ssl.wrap_socket(s)
+ self.assertIsNone(ss.get_channel_binding("tls-unique"))
+ # the same for server-side
+ s = socket.socket(socket.AF_INET)
+ ss = ssl.wrap_socket(s, server_side=True, certfile=CERTFILE)
+ self.assertIsNone(ss.get_channel_binding("tls-unique"))
+
class ContextTests(unittest.TestCase):
@skip_if_broken_ubuntu_ssl
@@ -423,6 +464,60 @@ class ContextTests(unittest.TestCase):
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
with self.assertRaisesRegex(ssl.SSLError, "key values mismatch"):
ctx.load_cert_chain(SVN_PYTHON_ORG_ROOT_CERT, ONLYKEY)
+ # Password protected key and cert
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=KEY_PASSWORD)
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=KEY_PASSWORD.encode())
+ ctx.load_cert_chain(CERTFILE_PROTECTED,
+ password=bytearray(KEY_PASSWORD.encode()))
+ ctx.load_cert_chain(ONLYCERT, ONLYKEY_PROTECTED, KEY_PASSWORD)
+ ctx.load_cert_chain(ONLYCERT, ONLYKEY_PROTECTED, KEY_PASSWORD.encode())
+ ctx.load_cert_chain(ONLYCERT, ONLYKEY_PROTECTED,
+ bytearray(KEY_PASSWORD.encode()))
+ with self.assertRaisesRegex(TypeError, "should be a string"):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=True)
+ with self.assertRaises(ssl.SSLError):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password="badpass")
+ with self.assertRaisesRegex(ValueError, "cannot be longer"):
+ # openssl has a fixed limit on the password buffer.
+ # PEM_BUFSIZE is generally set to 1kb.
+ # Return a string larger than this.
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=b'a' * 102400)
+ # Password callback
+ def getpass_unicode():
+ return KEY_PASSWORD
+ def getpass_bytes():
+ return KEY_PASSWORD.encode()
+ def getpass_bytearray():
+ return bytearray(KEY_PASSWORD.encode())
+ def getpass_badpass():
+ return "badpass"
+ def getpass_huge():
+ return b'a' * (1024 * 1024)
+ def getpass_bad_type():
+ return 9
+ def getpass_exception():
+ raise Exception('getpass error')
+ class GetPassCallable:
+ def __call__(self):
+ return KEY_PASSWORD
+ def getpass(self):
+ return KEY_PASSWORD
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_unicode)
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_bytes)
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_bytearray)
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=GetPassCallable())
+ ctx.load_cert_chain(CERTFILE_PROTECTED,
+ password=GetPassCallable().getpass)
+ with self.assertRaises(ssl.SSLError):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_badpass)
+ with self.assertRaisesRegex(ValueError, "cannot be longer"):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_huge)
+ with self.assertRaisesRegex(TypeError, "must return a string"):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_bad_type)
+ with self.assertRaisesRegex(Exception, "getpass error"):
+ ctx.load_cert_chain(CERTFILE_PROTECTED, password=getpass_exception)
+ # Make sure the password function isn't called if it isn't needed
+ ctx.load_cert_chain(CERTFILE, password=getpass_exception)
def test_load_verify_locations(self):
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
@@ -443,6 +538,19 @@ class ContextTests(unittest.TestCase):
# Issue #10989: crash if the second argument type is invalid
self.assertRaises(TypeError, ctx.load_verify_locations, None, True)
+ def test_load_dh_params(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ ctx.load_dh_params(DHFILE)
+ if os.name != 'nt':
+ ctx.load_dh_params(BYTES_DHFILE)
+ self.assertRaises(TypeError, ctx.load_dh_params)
+ self.assertRaises(TypeError, ctx.load_dh_params, None)
+ with self.assertRaises(FileNotFoundError) as cm:
+ ctx.load_dh_params(WRONGCERT)
+ self.assertEqual(cm.exception.errno, errno.ENOENT)
+ with self.assertRaises(ssl.SSLError) as cm:
+ ctx.load_dh_params(CERTFILE)
+
@skip_if_broken_ubuntu_ssl
def test_session_stats(self):
for proto in PROTOCOLS:
@@ -467,6 +575,57 @@ class ContextTests(unittest.TestCase):
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
ctx.set_default_verify_paths()
+ @unittest.skipUnless(ssl.HAS_ECDH, "ECDH disabled on this OpenSSL build")
+ def test_set_ecdh_curve(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ ctx.set_ecdh_curve("prime256v1")
+ ctx.set_ecdh_curve(b"prime256v1")
+ self.assertRaises(TypeError, ctx.set_ecdh_curve)
+ self.assertRaises(TypeError, ctx.set_ecdh_curve, None)
+ self.assertRaises(ValueError, ctx.set_ecdh_curve, "foo")
+ self.assertRaises(ValueError, ctx.set_ecdh_curve, b"foo")
+
+
+class SSLErrorTests(unittest.TestCase):
+
+ def test_str(self):
+ # The str() of a SSLError doesn't include the errno
+ e = ssl.SSLError(1, "foo")
+ self.assertEqual(str(e), "foo")
+ self.assertEqual(e.errno, 1)
+ # Same for a subclass
+ e = ssl.SSLZeroReturnError(1, "foo")
+ self.assertEqual(str(e), "foo")
+ self.assertEqual(e.errno, 1)
+
+ def test_lib_reason(self):
+ # Test the library and reason attributes
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ with self.assertRaises(ssl.SSLError) as cm:
+ ctx.load_dh_params(CERTFILE)
+ self.assertEqual(cm.exception.library, 'PEM')
+ self.assertEqual(cm.exception.reason, 'NO_START_LINE')
+ s = str(cm.exception)
+ self.assertTrue(s.startswith("[PEM: NO_START_LINE] no start line"), s)
+
+ def test_subclass(self):
+ # Check that the appropriate SSLError subclass is raised
+ # (this only tests one of them)
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ with socket.socket() as s:
+ s.bind(("127.0.0.1", 0))
+ s.listen(5)
+ with socket.socket() as c:
+ c.connect(s.getsockname())
+ c.setblocking(False)
+ c = ctx.wrap_socket(c, False, do_handshake_on_connect=False)
+ with self.assertRaises(ssl.SSLWantReadError) as cm:
+ c.do_handshake()
+ s = str(cm.exception)
+ self.assertTrue(s.startswith("The operation did not complete (read)"), s)
+ # For compatibility
+ self.assertEqual(cm.exception.errno, ssl.SSL_ERROR_WANT_READ)
+
class NetworkedTests(unittest.TestCase):
@@ -529,13 +688,10 @@ class NetworkedTests(unittest.TestCase):
try:
s.do_handshake()
break
- except ssl.SSLError as err:
- if err.args[0] == ssl.SSL_ERROR_WANT_READ:
- select.select([s], [], [], 5.0)
- elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
- select.select([], [s], [], 5.0)
- else:
- raise
+ except ssl.SSLWantReadError:
+ select.select([s], [], [], 5.0)
+ except ssl.SSLWantWriteError:
+ select.select([], [s], [], 5.0)
# SSL established
self.assertTrue(s.getpeercert())
finally:
@@ -655,37 +811,39 @@ class NetworkedTests(unittest.TestCase):
count += 1
s.do_handshake()
break
- except ssl.SSLError as err:
- if err.args[0] == ssl.SSL_ERROR_WANT_READ:
- select.select([s], [], [])
- elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
- select.select([], [s], [])
- else:
- raise
+ except ssl.SSLWantReadError:
+ select.select([s], [], [])
+ except ssl.SSLWantWriteError:
+ select.select([], [s], [])
s.close()
if support.verbose:
sys.stdout.write("\nNeeded %d calls to do_handshake() to establish session.\n" % count)
def test_get_server_certificate(self):
- with support.transient_internet("svn.python.org"):
- pem = ssl.get_server_certificate(("svn.python.org", 443))
- if not pem:
- self.fail("No server certificate on svn.python.org:443!")
+ def _test_get_server_certificate(host, port, cert=None):
+ with support.transient_internet(host):
+ pem = ssl.get_server_certificate((host, port))
+ if not pem:
+ self.fail("No server certificate on %s:%s!" % (host, port))
- try:
- pem = ssl.get_server_certificate(("svn.python.org", 443), ca_certs=CERTFILE)
- except ssl.SSLError as x:
- #should fail
+ try:
+ pem = ssl.get_server_certificate((host, port), ca_certs=CERTFILE)
+ except ssl.SSLError as x:
+ #should fail
+ if support.verbose:
+ sys.stdout.write("%s\n" % x)
+ else:
+ self.fail("Got server certificate %s for %s:%s!" % (pem, host, port))
+
+ pem = ssl.get_server_certificate((host, port), ca_certs=cert)
+ if not pem:
+ self.fail("No server certificate on %s:%s!" % (host, port))
if support.verbose:
- sys.stdout.write("%s\n" % x)
- else:
- self.fail("Got server certificate %s for svn.python.org!" % pem)
+ sys.stdout.write("\nVerified certificate for %s:%s is\n%s\n" % (host, port ,pem))
- pem = ssl.get_server_certificate(("svn.python.org", 443), ca_certs=SVN_PYTHON_ORG_ROOT_CERT)
- if not pem:
- self.fail("No server certificate on svn.python.org:443!")
- if support.verbose:
- sys.stdout.write("\nVerified certificate for svn.python.org:443 is\n%s\n" % pem)
+ _test_get_server_certificate('svn.python.org', 443, SVN_PYTHON_ORG_ROOT_CERT)
+ if support.IPV6_ENABLED:
+ _test_get_server_certificate('ipv6.google.com', 443)
def test_ciphers(self):
remote = ("svn.python.org", 443)
@@ -763,6 +921,7 @@ else:
try:
self.sslconn = self.server.context.wrap_socket(
self.sock, server_side=True)
+ self.server.selected_protocols.append(self.sslconn.selected_npn_protocol())
except ssl.SSLError as e:
# XXX Various errors can have happened here, for example
# a mismatching protocol version, an invalid certificate,
@@ -785,6 +944,8 @@ else:
cipher = self.sslconn.cipher()
if support.verbose and self.server.chatty:
sys.stdout.write(" server: connection cipher is now " + str(cipher) + "\n")
+ sys.stdout.write(" server: selected protocol is now "
+ + str(self.sslconn.selected_npn_protocol()) + "\n")
return True
def read(self):
@@ -839,6 +1000,11 @@ else:
self.sslconn = None
if support.verbose and self.server.connectionchatty:
sys.stdout.write(" server: connection is now unencrypted...\n")
+ elif stripped == b'CB tls-unique':
+ if support.verbose and self.server.connectionchatty:
+ sys.stdout.write(" server: read CB tls-unique from client, sending our CB data...\n")
+ data = self.sslconn.get_channel_binding("tls-unique")
+ self.write(repr(data).encode("us-ascii") + b"\n")
else:
if (support.verbose and
self.server.connectionchatty):
@@ -858,7 +1024,7 @@ else:
def __init__(self, certificate=None, ssl_version=None,
certreqs=None, cacerts=None,
chatty=True, connectionchatty=False, starttls_server=False,
- ciphers=None, context=None):
+ npn_protocols=None, ciphers=None, context=None):
if context:
self.context = context
else:
@@ -871,6 +1037,8 @@ else:
self.context.load_verify_locations(cacerts)
if certificate:
self.context.load_cert_chain(certificate)
+ if npn_protocols:
+ self.context.set_npn_protocols(npn_protocols)
if ciphers:
self.context.set_ciphers(ciphers)
self.chatty = chatty
@@ -880,6 +1048,7 @@ else:
self.port = support.bind_port(self.sock)
self.flag = None
self.active = False
+ self.selected_protocols = []
self.conn_errors = []
threading.Thread.__init__(self)
self.daemon = True
@@ -947,12 +1116,11 @@ else:
def _do_ssl_handshake(self):
try:
self.socket.do_handshake()
- except ssl.SSLError as err:
- if err.args[0] in (ssl.SSL_ERROR_WANT_READ,
- ssl.SSL_ERROR_WANT_WRITE):
- return
- elif err.args[0] == ssl.SSL_ERROR_EOF:
- return self.handle_close()
+ except (ssl.SSLWantReadError, ssl.SSLWantWriteError):
+ return
+ except ssl.SSLEOFError:
+ return self.handle_close()
+ except ssl.SSLError:
raise
except socket.error as err:
if err.args[0] == errno.ECONNABORTED:
@@ -1075,6 +1243,7 @@ else:
Launch a server, connect a client to it and try various reads
and writes.
"""
+ stats = {}
server = ThreadedEchoServer(context=server_context,
chatty=chatty,
connectionchatty=False)
@@ -1100,7 +1269,14 @@ else:
if connectionchatty:
if support.verbose:
sys.stdout.write(" client: closing connection.\n")
+ stats.update({
+ 'compression': s.compression(),
+ 'cipher': s.cipher(),
+ 'client_npn_protocol': s.selected_npn_protocol()
+ })
s.close()
+ stats['server_npn_protocols'] = server.selected_protocols
+ return stats
def try_protocol_combo(server_protocol, client_protocol, expect_success,
certsreqs=None, server_options=0, client_options=0):
@@ -1252,7 +1428,8 @@ else:
t.join()
@skip_if_broken_ubuntu_ssl
- @unittest.skipUnless(hasattr(ssl, 'PROTOCOL_SSLv2'), "need SSLv2")
+ @unittest.skipUnless(hasattr(ssl, 'PROTOCOL_SSLv2'),
+ "OpenSSL is compiled without SSLv2 support")
def test_protocol_sslv2(self):
"""Connecting to an SSLv2 server with various client options"""
if support.verbose:
@@ -1558,6 +1735,15 @@ else:
)
# consume data
s.read()
+
+ # Make sure sendmsg et al are disallowed to avoid
+ # inadvertent disclosure of data and/or corruption
+ # of the encrypted data stream
+ self.assertRaises(NotImplementedError, s.sendmsg, [b"data"])
+ self.assertRaises(NotImplementedError, s.recvmsg, 100)
+ self.assertRaises(NotImplementedError,
+ s.recvmsg_into, bytearray(100))
+
s.write(b"over\n")
s.close()
@@ -1662,6 +1848,135 @@ else:
s.connect((HOST, server.port))
self.assertIn("no shared cipher", str(server.conn_errors[0]))
+ @unittest.skipUnless("tls-unique" in ssl.CHANNEL_BINDING_TYPES,
+ "'tls-unique' channel binding not available")
+ def test_tls_unique_channel_binding(self):
+ """Test tls-unique channel binding."""
+ if support.verbose:
+ sys.stdout.write("\n")
+
+ server = ThreadedEchoServer(CERTFILE,
+ certreqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1,
+ cacerts=CERTFILE,
+ chatty=True,
+ connectionchatty=False)
+ with server:
+ s = ssl.wrap_socket(socket.socket(),
+ server_side=False,
+ certfile=CERTFILE,
+ ca_certs=CERTFILE,
+ cert_reqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1)
+ s.connect((HOST, server.port))
+ # get the data
+ cb_data = s.get_channel_binding("tls-unique")
+ if support.verbose:
+ sys.stdout.write(" got channel binding data: {0!r}\n"
+ .format(cb_data))
+
+ # check if it is sane
+ self.assertIsNotNone(cb_data)
+ self.assertEqual(len(cb_data), 12) # True for TLSv1
+
+ # and compare with the peers version
+ s.write(b"CB tls-unique\n")
+ peer_data_repr = s.read().strip()
+ self.assertEqual(peer_data_repr,
+ repr(cb_data).encode("us-ascii"))
+ s.close()
+
+ # now, again
+ s = ssl.wrap_socket(socket.socket(),
+ server_side=False,
+ certfile=CERTFILE,
+ ca_certs=CERTFILE,
+ cert_reqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1)
+ s.connect((HOST, server.port))
+ new_cb_data = s.get_channel_binding("tls-unique")
+ if support.verbose:
+ sys.stdout.write(" got another channel binding data: {0!r}\n"
+ .format(new_cb_data))
+ # is it really unique
+ self.assertNotEqual(cb_data, new_cb_data)
+ self.assertIsNotNone(cb_data)
+ self.assertEqual(len(cb_data), 12) # True for TLSv1
+ s.write(b"CB tls-unique\n")
+ peer_data_repr = s.read().strip()
+ self.assertEqual(peer_data_repr,
+ repr(new_cb_data).encode("us-ascii"))
+ s.close()
+
+ def test_compression(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ context.load_cert_chain(CERTFILE)
+ stats = server_params_test(context, context,
+ chatty=True, connectionchatty=True)
+ if support.verbose:
+ sys.stdout.write(" got compression: {!r}\n".format(stats['compression']))
+ self.assertIn(stats['compression'], { None, 'ZLIB', 'RLE' })
+
+ @unittest.skipUnless(hasattr(ssl, 'OP_NO_COMPRESSION'),
+ "ssl.OP_NO_COMPRESSION needed for this test")
+ def test_compression_disabled(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ context.load_cert_chain(CERTFILE)
+ context.options |= ssl.OP_NO_COMPRESSION
+ stats = server_params_test(context, context,
+ chatty=True, connectionchatty=True)
+ self.assertIs(stats['compression'], None)
+
+ def test_dh_params(self):
+ # Check we can get a connection with ephemeral Diffie-Hellman
+ context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ context.load_cert_chain(CERTFILE)
+ context.load_dh_params(DHFILE)
+ context.set_ciphers("kEDH")
+ stats = server_params_test(context, context,
+ chatty=True, connectionchatty=True)
+ cipher = stats["cipher"][0]
+ parts = cipher.split("-")
+ if "ADH" not in parts and "EDH" not in parts and "DHE" not in parts:
+ self.fail("Non-DH cipher: " + cipher[0])
+
+ def test_selected_npn_protocol(self):
+ # selected_npn_protocol() is None unless NPN is used
+ context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ context.load_cert_chain(CERTFILE)
+ stats = server_params_test(context, context,
+ chatty=True, connectionchatty=True)
+ self.assertIs(stats['client_npn_protocol'], None)
+
+ @unittest.skipUnless(ssl.HAS_NPN, "NPN support needed for this test")
+ def test_npn_protocols(self):
+ server_protocols = ['http/1.1', 'spdy/2']
+ protocol_tests = [
+ (['http/1.1', 'spdy/2'], 'http/1.1'),
+ (['spdy/2', 'http/1.1'], 'http/1.1'),
+ (['spdy/2', 'test'], 'spdy/2'),
+ (['abc', 'def'], 'abc')
+ ]
+ for client_protocols, expected in protocol_tests:
+ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ server_context.load_cert_chain(CERTFILE)
+ server_context.set_npn_protocols(server_protocols)
+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ client_context.load_cert_chain(CERTFILE)
+ client_context.set_npn_protocols(client_protocols)
+ stats = server_params_test(client_context, server_context,
+ chatty=True, connectionchatty=True)
+
+ msg = "failed trying %s (s) and %s (c).\n" \
+ "was expecting %s, but got %%s from the %%s" \
+ % (str(server_protocols), str(client_protocols),
+ str(expected))
+ client_result = stats['client_npn_protocol']
+ self.assertEqual(client_result, expected, msg % (client_result, "client"))
+ server_result = stats['server_npn_protocols'][-1] \
+ if len(stats['server_npn_protocols']) else 'nothing'
+ self.assertEqual(server_result, expected, msg % (server_result, "server"))
+
def test_main(verbose=False):
if support.verbose:
@@ -1689,7 +2004,7 @@ def test_main(verbose=False):
if not os.path.exists(filename):
raise support.TestFailed("Can't read certificate file %r" % filename)
- tests = [ContextTests, BasicSocketTests]
+ tests = [ContextTests, BasicSocketTests, SSLErrorTests]
if support.is_resource_enabled('network'):
tests.append(NetworkedTests)
diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
new file mode 100644
index 0000000..48d5e38
--- /dev/null
+++ b/Lib/test/test_stat.py
@@ -0,0 +1,66 @@
+import unittest
+import os
+import stat
+from test.support import TESTFN, run_unittest
+
+
+def get_mode(fname=TESTFN):
+ return stat.filemode(os.lstat(fname).st_mode)
+
+
+class TestFilemode(unittest.TestCase):
+
+ def setUp(self):
+ try:
+ os.remove(TESTFN)
+ except OSError:
+ try:
+ os.rmdir(TESTFN)
+ except OSError:
+ pass
+ tearDown = setUp
+
+ def test_mode(self):
+ with open(TESTFN, 'w'):
+ pass
+ if os.name == 'posix':
+ os.chmod(TESTFN, 0o700)
+ self.assertEqual(get_mode(), '-rwx------')
+ os.chmod(TESTFN, 0o070)
+ self.assertEqual(get_mode(), '----rwx---')
+ os.chmod(TESTFN, 0o007)
+ self.assertEqual(get_mode(), '-------rwx')
+ os.chmod(TESTFN, 0o444)
+ self.assertEqual(get_mode(), '-r--r--r--')
+ else:
+ os.chmod(TESTFN, 0o700)
+ self.assertEqual(get_mode()[:3], '-rw')
+
+ def test_directory(self):
+ os.mkdir(TESTFN)
+ os.chmod(TESTFN, 0o700)
+ if os.name == 'posix':
+ self.assertEqual(get_mode(), 'drwx------')
+ else:
+ self.assertEqual(get_mode()[0], 'd')
+
+ @unittest.skipUnless(hasattr(os, 'symlink'), 'os.symlink not available')
+ def test_link(self):
+ try:
+ os.symlink(os.getcwd(), TESTFN)
+ except (OSError, NotImplementedError) as err:
+ raise unittest.SkipTest(str(err))
+ else:
+ self.assertEqual(get_mode()[0], 'l')
+
+ @unittest.skipUnless(hasattr(os, 'mkfifo'), 'os.mkfifo not available')
+ def test_fifo(self):
+ os.mkfifo(TESTFN, 0o700)
+ self.assertEqual(get_mode(), 'prwx------')
+
+
+def test_main():
+ run_unittest(TestFilemode)
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_string.py b/Lib/test/test_string.py
index 34d1dcf..c2bdfdb 100644
--- a/Lib/test/test_string.py
+++ b/Lib/test/test_string.py
@@ -26,6 +26,12 @@ class ModuleTest(unittest.TestCase):
self.assertEqual(string.capwords('\taBc\tDeF\t'), 'Abc Def')
self.assertEqual(string.capwords('\taBc\tDeF\t', '\t'), '\tAbc\tDef\t')
+ def test_basic_formatter(self):
+ fmt = string.Formatter()
+ self.assertEqual(fmt.format("foo"), "foo")
+ self.assertEqual(fmt.format("foo{0}", "bar"), "foobar")
+ self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6")
+
def test_conversion_specifiers(self):
fmt = string.Formatter()
self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-")
@@ -38,15 +44,26 @@ class ModuleTest(unittest.TestCase):
self.assertEqual(fmt.format("{0!a}", chr(255)), "'\\xff'")
self.assertEqual(fmt.format("{0!a}", chr(256)), "'\\u0100'")
- def test_formatter(self):
+ def test_name_lookup(self):
fmt = string.Formatter()
- self.assertEqual(fmt.format("foo"), "foo")
-
- self.assertEqual(fmt.format("foo{0}", "bar"), "foobar")
- self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6")
- self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-")
+ class AnyAttr:
+ def __getattr__(self, attr):
+ return attr
+ x = AnyAttr()
+ self.assertEqual(fmt.format("{0.lumber}{0.jack}", x), 'lumberjack')
+ with self.assertRaises(AttributeError):
+ fmt.format("{0.lumber}{0.jack}", '')
+
+ def test_index_lookup(self):
+ fmt = string.Formatter()
+ lookup = ["eggs", "and", "spam"]
+ self.assertEqual(fmt.format("{0[2]}{0[0]}", lookup), 'spameggs')
+ with self.assertRaises(IndexError):
+ fmt.format("{0[2]}{0[0]}", [])
+ with self.assertRaises(KeyError):
+ fmt.format("{0[2]}{0[0]}", {})
- # override get_value ############################################
+ def test_override_get_value(self):
class NamespaceFormatter(string.Formatter):
def __init__(self, namespace={}):
string.Formatter.__init__(self)
@@ -66,7 +83,7 @@ class ModuleTest(unittest.TestCase):
self.assertEqual(fmt.format("{greeting}, world!"), 'hello, world!')
- # override format_field #########################################
+ def test_override_format_field(self):
class CallFormatter(string.Formatter):
def format_field(self, value, format_spec):
return format(value(), format_spec)
@@ -75,18 +92,18 @@ class ModuleTest(unittest.TestCase):
self.assertEqual(fmt.format('*{0}*', lambda : 'result'), '*result*')
- # override convert_field ########################################
+ def test_override_convert_field(self):
class XFormatter(string.Formatter):
def convert_field(self, value, conversion):
if conversion == 'x':
return None
- return super(XFormatter, self).convert_field(value, conversion)
+ return super().convert_field(value, conversion)
fmt = XFormatter()
self.assertEqual(fmt.format("{0!r}:{0!x}", 'foo', 'foo'), "'foo':None")
- # override parse ################################################
+ def test_override_parse(self):
class BarFormatter(string.Formatter):
# returns an iterable that contains tuples of the form:
# (literal_text, field_name, format_spec, conversion)
@@ -102,7 +119,7 @@ class ModuleTest(unittest.TestCase):
fmt = BarFormatter()
self.assertEqual(fmt.format('*|+0:^10s|*', 'foo'), '* foo *')
- # test all parameters used
+ def test_check_unused_args(self):
class CheckAllUsedFormatter(string.Formatter):
def check_unused_args(self, used_args, args, kwargs):
# Track which arguments actually got used
@@ -124,28 +141,13 @@ class ModuleTest(unittest.TestCase):
self.assertRaises(ValueError, fmt.format, "{0}", 10, 20, i=100)
self.assertRaises(ValueError, fmt.format, "{i}", 10, 20, i=100)
- def test_vformat_assert(self):
- cls = string.Formatter()
- kwargs = {
- "i": 100
- }
- self.assertRaises(ValueError, cls._vformat,
- cls.format, "{0}", kwargs, set(), -2)
-
- def test_convert_field(self):
- cls = string.Formatter()
- self.assertEqual(cls.format("{0!s}", 'foo'), 'foo')
- self.assertRaises(ValueError, cls.format, "{0!h}", 'foo')
-
- def test_get_field(self):
- cls = string.Formatter()
- class MyClass:
- name = 'lumberjack'
- x = MyClass()
- self.assertEqual(cls.format("{0.name}", x), 'lumberjack')
-
- lookup = ["eggs", "and", "spam"]
- self.assertEqual(cls.format("{0[2]}", lookup), 'spam')
+ def test_vformat_recursion_limit(self):
+ fmt = string.Formatter()
+ args = ()
+ kwargs = dict(i=100)
+ with self.assertRaises(ValueError) as err:
+ fmt._vformat("{i}", args, kwargs, set(), -1)
+ self.assertIn("recursion", str(err.exception))
def test_main():
diff --git a/Lib/test/test_strlit.py b/Lib/test/test_strlit.py
index 6bdc6e4..07bc488 100644
--- a/Lib/test/test_strlit.py
+++ b/Lib/test/test_strlit.py
@@ -2,10 +2,10 @@ r"""Test correct treatment of various string literals by the parser.
There are four types of string literals:
- 'abc' -- normal str
- r'abc' -- raw str
- b'xyz' -- normal bytes
- br'xyz' -- raw bytes
+ 'abc' -- normal str
+ r'abc' -- raw str
+ b'xyz' -- normal bytes
+ br'xyz' | rb'xyz' -- raw bytes
The difference between normal and raw strings is of course that in a
raw string, \ escapes (while still used to determine the end of the
@@ -103,12 +103,34 @@ class TestLiterals(unittest.TestCase):
def test_eval_bytes_raw(self):
self.assertEqual(eval(""" br'x' """), b'x')
+ self.assertEqual(eval(""" rb'x' """), b'x')
self.assertEqual(eval(r""" br'\x01' """), b'\\' + b'x01')
+ self.assertEqual(eval(r""" rb'\x01' """), b'\\' + b'x01')
self.assertEqual(eval(""" br'\x01' """), byte(1))
+ self.assertEqual(eval(""" rb'\x01' """), byte(1))
self.assertEqual(eval(r""" br'\x81' """), b"\\" + b"x81")
+ self.assertEqual(eval(r""" rb'\x81' """), b"\\" + b"x81")
self.assertRaises(SyntaxError, eval, """ br'\x81' """)
+ self.assertRaises(SyntaxError, eval, """ rb'\x81' """)
self.assertEqual(eval(r""" br'\u1881' """), b"\\" + b"u1881")
+ self.assertEqual(eval(r""" rb'\u1881' """), b"\\" + b"u1881")
self.assertRaises(SyntaxError, eval, """ br'\u1881' """)
+ self.assertRaises(SyntaxError, eval, """ rb'\u1881' """)
+ self.assertRaises(SyntaxError, eval, """ bb'' """)
+ self.assertRaises(SyntaxError, eval, """ rr'' """)
+ self.assertRaises(SyntaxError, eval, """ brr'' """)
+ self.assertRaises(SyntaxError, eval, """ bbr'' """)
+ self.assertRaises(SyntaxError, eval, """ rrb'' """)
+ self.assertRaises(SyntaxError, eval, """ rbb'' """)
+
+ def test_eval_str_u(self):
+ self.assertEqual(eval(""" u'x' """), 'x')
+ self.assertEqual(eval(""" U'\u00e4' """), 'ä')
+ self.assertEqual(eval(""" u'\N{LATIN SMALL LETTER A WITH DIAERESIS}' """), 'ä')
+ self.assertRaises(SyntaxError, eval, """ ur'' """)
+ self.assertRaises(SyntaxError, eval, """ ru'' """)
+ self.assertRaises(SyntaxError, eval, """ bu'' """)
+ self.assertRaises(SyntaxError, eval, """ ub'' """)
def check_encoding(self, encoding, extra=""):
modname = "xx_" + encoding.replace("-", "_")
@@ -131,7 +153,7 @@ class TestLiterals(unittest.TestCase):
self.assertRaises(SyntaxError, self.check_encoding, "utf-8", extra)
def test_file_utf8(self):
- self.check_encoding("utf8")
+ self.check_encoding("utf-8")
def test_file_iso_8859_1(self):
self.check_encoding("iso-8859-1")
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index dcc73ab..22374d2 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -8,9 +8,19 @@ from test import support
ISBIGENDIAN = sys.byteorder == "big"
IS32BIT = sys.maxsize == 0x7fffffff
-integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'
+integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'n', 'N'
byteorders = '', '@', '=', '<', '>', '!'
+def iter_integer_formats(byteorders=byteorders):
+ for code in integer_codes:
+ for byteorder in byteorders:
+ if (byteorder in ('', '@') and code in ('q', 'Q') and
+ not HAVE_LONG_LONG):
+ continue
+ if (byteorder not in ('', '@') and code in ('n', 'N')):
+ continue
+ yield code, byteorder
+
# Native 'q' packing isn't available on systems that don't have the C
# long long type.
try:
@@ -30,7 +40,6 @@ def bigendian_to_native(value):
return string_reverse(value)
class StructTest(unittest.TestCase):
-
def test_isbigendian(self):
self.assertEqual((struct.pack('=i', 1)[0] == 0), ISBIGENDIAN)
@@ -142,14 +151,13 @@ class StructTest(unittest.TestCase):
}
# standard integer sizes
- for code in integer_codes:
- for byteorder in '=', '<', '>', '!':
- format = byteorder+code
- size = struct.calcsize(format)
- self.assertEqual(size, expected_size[code])
+ for code, byteorder in iter_integer_formats(('=', '<', '>', '!')):
+ format = byteorder+code
+ size = struct.calcsize(format)
+ self.assertEqual(size, expected_size[code])
# native integer sizes
- native_pairs = 'bB', 'hH', 'iI', 'lL'
+ native_pairs = 'bB', 'hH', 'iI', 'lL', 'nN'
if HAVE_LONG_LONG:
native_pairs += 'qQ',
for format_pair in native_pairs:
@@ -167,9 +175,11 @@ class StructTest(unittest.TestCase):
if HAVE_LONG_LONG:
self.assertLessEqual(8, struct.calcsize('q'))
self.assertLessEqual(struct.calcsize('l'), struct.calcsize('q'))
+ self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('i'))
+ self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('P'))
def test_integers(self):
- # Integer tests (bBhHiIlLqQ).
+ # Integer tests (bBhHiIlLqQnN).
import binascii
class IntTester(unittest.TestCase):
@@ -183,11 +193,11 @@ class StructTest(unittest.TestCase):
self.byteorder)
self.bytesize = struct.calcsize(format)
self.bitsize = self.bytesize * 8
- if self.code in tuple('bhilq'):
+ if self.code in tuple('bhilqn'):
self.signed = True
self.min_value = -(2**(self.bitsize-1))
self.max_value = 2**(self.bitsize-1) - 1
- elif self.code in tuple('BHILQ'):
+ elif self.code in tuple('BHILQN'):
self.signed = False
self.min_value = 0
self.max_value = 2**self.bitsize - 1
@@ -317,14 +327,23 @@ class StructTest(unittest.TestCase):
struct.pack, self.format,
obj)
- for code in integer_codes:
- for byteorder in byteorders:
- if (byteorder in ('', '@') and code in ('q', 'Q') and
- not HAVE_LONG_LONG):
- continue
+ for code, byteorder in iter_integer_formats():
+ format = byteorder+code
+ t = IntTester(format)
+ t.run()
+
+ def test_nN_code(self):
+ # n and N don't exist in standard sizes
+ def assertStructError(func, *args, **kwargs):
+ with self.assertRaises(struct.error) as cm:
+ func(*args, **kwargs)
+ self.assertIn("bad char in struct format", str(cm.exception))
+ for code in 'nN':
+ for byteorder in ('=', '<', '>', '!'):
format = byteorder+code
- t = IntTester(format)
- t.run()
+ assertStructError(struct.calcsize, format)
+ assertStructError(struct.pack, format, 0)
+ assertStructError(struct.unpack, format, b"")
def test_p_code(self):
# Test p ("Pascal string") code.
@@ -378,14 +397,10 @@ class StructTest(unittest.TestCase):
self.assertRaises(OverflowError, struct.pack, ">f", big)
def test_1530559(self):
- for byteorder in '', '@', '=', '<', '>', '!':
- for code in integer_codes:
- if (byteorder in ('', '@') and code in ('q', 'Q') and
- not HAVE_LONG_LONG):
- continue
- format = byteorder + code
- self.assertRaises(struct.error, struct.pack, format, 1.0)
- self.assertRaises(struct.error, struct.pack, format, 1.5)
+ for code, byteorder in iter_integer_formats():
+ format = byteorder + code
+ self.assertRaises(struct.error, struct.pack, format, 1.0)
+ self.assertRaises(struct.error, struct.pack, format, 1.5)
self.assertRaises(struct.error, struct.pack, 'P', 1.0)
self.assertRaises(struct.error, struct.pack, 'P', 1.5)
@@ -559,9 +574,9 @@ class StructTest(unittest.TestCase):
def check_sizeof(self, format_str, number_of_codes):
# The size of 'PyStructObject'
- totalsize = support.calcobjsize('5P')
+ totalsize = support.calcobjsize('2n3P')
# The size taken up by the 'formatcode' dynamic array
- totalsize += struct.calcsize('3P') * (number_of_codes + 1)
+ totalsize += struct.calcsize('P2n0P') * (number_of_codes + 1)
support.check_sizeof(self, struct.Struct(format_str), totalsize)
@support.cpython_only
diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py
index d6c63b7..a89e955 100644
--- a/Lib/test/test_structseq.py
+++ b/Lib/test/test_structseq.py
@@ -78,8 +78,9 @@ class StructSeqTest(unittest.TestCase):
def test_fields(self):
t = time.gmtime()
- self.assertEqual(len(t), t.n_fields)
- self.assertEqual(t.n_fields, t.n_sequence_fields+t.n_unnamed_fields)
+ self.assertEqual(len(t), t.n_sequence_fields)
+ self.assertEqual(t.n_unnamed_fields, 0)
+ self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
def test_constructor(self):
t = time.struct_time
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 15fb498..b260c81 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -16,6 +16,7 @@ import warnings
import select
import shutil
import gc
+import textwrap
try:
import resource
@@ -62,6 +63,8 @@ class BaseTestCase(unittest.TestCase):
# shutdown time. That frustrates tests trying to check stderr produced
# from a spawned Python process.
actual = support.strip_python_stderr(stderr)
+ # strip_python_stderr also strips whitespace, so we do too.
+ expected = expected.strip()
self.assertEqual(actual, expected, msg)
@@ -73,6 +76,15 @@ class ProcessTestCase(BaseTestCase):
"import sys; sys.exit(47)"])
self.assertEqual(rc, 47)
+ def test_call_timeout(self):
+ # call() function with timeout argument; we want to test that the child
+ # process gets killed when the timeout expires. If the child isn't
+ # killed, this call will deadlock since subprocess.call waits for the
+ # child.
+ self.assertRaises(subprocess.TimeoutExpired, subprocess.call,
+ [sys.executable, "-c", "while True: pass"],
+ timeout=0.1)
+
def test_check_call_zero(self):
# check_call() function with zero return code
rc = subprocess.check_call([sys.executable, "-c",
@@ -115,6 +127,21 @@ class ProcessTestCase(BaseTestCase):
self.fail("Expected ValueError when stdout arg supplied.")
self.assertIn('stdout', c.exception.args[0])
+ def test_check_output_timeout(self):
+ # check_output() function with timeout arg
+ with self.assertRaises(subprocess.TimeoutExpired) as c:
+ output = subprocess.check_output(
+ [sys.executable, "-c",
+ "import sys, time\n"
+ "sys.stdout.write('BDFL')\n"
+ "sys.stdout.flush()\n"
+ "time.sleep(3600)"],
+ # Some heavily loaded buildbots (sparc Debian 3.x) require
+ # this much time to start and print.
+ timeout=3)
+ self.fail("Expected TimeoutExpired.")
+ self.assertEqual(c.exception.output, b'BDFL')
+
def test_call_kwargs(self):
# call() function with keyword args
newenv = os.environ.copy()
@@ -165,6 +192,40 @@ class ProcessTestCase(BaseTestCase):
p.wait()
self.assertEqual(p.stderr, None)
+ def _assert_python(self, pre_args, **kwargs):
+ # We include sys.exit() to prevent the test runner from hanging
+ # whenever python is found.
+ args = pre_args + ["import sys; sys.exit(47)"]
+ p = subprocess.Popen(args, **kwargs)
+ p.wait()
+ self.assertEqual(47, p.returncode)
+
+ def test_executable(self):
+ # Check that the executable argument works.
+ #
+ # On Unix (non-Mac and non-Windows), Python looks at args[0] to
+ # determine where its standard library is, so we need the directory
+ # of args[0] to be valid for the Popen() call to Python to succeed.
+ # See also issue #16170 and issue #7774.
+ doesnotexist = os.path.join(os.path.dirname(sys.executable),
+ "doesnotexist")
+ self._assert_python([doesnotexist, "-c"], executable=sys.executable)
+
+ def test_executable_takes_precedence(self):
+ # Check that the executable argument takes precedence over args[0].
+ #
+ # Verify first that the call succeeds without the executable arg.
+ pre_args = [sys.executable, "-c"]
+ self._assert_python(pre_args)
+ self.assertRaises(FileNotFoundError, self._assert_python, pre_args,
+ executable="doesnotexist")
+
+ @unittest.skipIf(mswindows, "executable argument replaces shell")
+ def test_executable_replaces_shell(self):
+ # Check that the executable argument replaces the default shell
+ # when shell=True.
+ self._assert_python([], executable=sys.executable, shell=True)
+
# For use in the test_cwd* tests below.
def _normalize_cwd(self, cwd):
# Normalize an expected cwd (for Tru64 support).
@@ -215,9 +276,9 @@ class ProcessTestCase(BaseTestCase):
with support.temp_cwd() as wrong_dir:
# Before calling with the correct cwd, confirm that the call fails
# without cwd and with the wrong cwd.
- self.assertRaises(OSError, subprocess.Popen,
+ self.assertRaises(FileNotFoundError, subprocess.Popen,
[rel_python])
- self.assertRaises(OSError, subprocess.Popen,
+ self.assertRaises(FileNotFoundError, subprocess.Popen,
[rel_python], cwd=wrong_dir)
python_dir = self._normalize_cwd(python_dir)
self._assert_cwd(python_dir, rel_python, cwd=python_dir)
@@ -232,9 +293,9 @@ class ProcessTestCase(BaseTestCase):
with support.temp_cwd() as wrong_dir:
# Before calling with the correct cwd, confirm that the call fails
# without cwd and with the wrong cwd.
- self.assertRaises(OSError, subprocess.Popen,
+ self.assertRaises(FileNotFoundError, subprocess.Popen,
[doesntexist], executable=rel_python)
- self.assertRaises(OSError, subprocess.Popen,
+ self.assertRaises(FileNotFoundError, subprocess.Popen,
[doesntexist], executable=rel_python,
cwd=wrong_dir)
python_dir = self._normalize_cwd(python_dir)
@@ -250,17 +311,21 @@ class ProcessTestCase(BaseTestCase):
with script_helper.temp_dir() as wrong_dir:
# Before calling with an absolute path, confirm that using a
# relative path fails.
- self.assertRaises(OSError, subprocess.Popen,
+ self.assertRaises(FileNotFoundError, subprocess.Popen,
[rel_python], cwd=wrong_dir)
wrong_dir = self._normalize_cwd(wrong_dir)
self._assert_cwd(wrong_dir, abs_python, cwd=wrong_dir)
+ @unittest.skipIf(sys.base_prefix != sys.prefix,
+ 'Test is not venv-compatible')
def test_executable_with_cwd(self):
python_dir, python_base = self._split_python_path()
python_dir = self._normalize_cwd(python_dir)
self._assert_cwd(python_dir, "somethingyoudonthave",
executable=sys.executable, cwd=python_dir)
+ @unittest.skipIf(sys.base_prefix != sys.prefix,
+ 'Test is not venv-compatible')
@unittest.skipIf(sysconfig.is_python_build(),
"need an installed Python. See #7774")
def test_executable_without_cwd(self):
@@ -398,6 +463,31 @@ class ProcessTestCase(BaseTestCase):
rc = subprocess.call([sys.executable, "-c", cmd], stdout=1)
self.assertEqual(rc, 2)
+ def test_stdout_devnull(self):
+ p = subprocess.Popen([sys.executable, "-c",
+ 'for i in range(10240):'
+ 'print("x" * 1024)'],
+ stdout=subprocess.DEVNULL)
+ p.wait()
+ self.assertEqual(p.stdout, None)
+
+ def test_stderr_devnull(self):
+ p = subprocess.Popen([sys.executable, "-c",
+ 'import sys\n'
+ 'for i in range(10240):'
+ 'sys.stderr.write("x" * 1024)'],
+ stderr=subprocess.DEVNULL)
+ p.wait()
+ self.assertEqual(p.stderr, None)
+
+ def test_stdin_devnull(self):
+ p = subprocess.Popen([sys.executable, "-c",
+ 'import sys;'
+ 'sys.stdin.read(1)'],
+ stdin=subprocess.DEVNULL)
+ p.wait()
+ self.assertEqual(p.stdin, None)
+
def test_env(self):
newenv = os.environ.copy()
newenv["FRUIT"] = "orange"
@@ -468,6 +558,41 @@ class ProcessTestCase(BaseTestCase):
self.assertEqual(stdout, b"banana")
self.assertStderrEqual(stderr, b"pineapple")
+ def test_communicate_timeout(self):
+ p = subprocess.Popen([sys.executable, "-c",
+ 'import sys,os,time;'
+ 'sys.stderr.write("pineapple\\n");'
+ 'time.sleep(1);'
+ 'sys.stderr.write("pear\\n");'
+ 'sys.stdout.write(sys.stdin.read())'],
+ universal_newlines=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ self.assertRaises(subprocess.TimeoutExpired, p.communicate, "banana",
+ timeout=0.3)
+ # Make sure we can keep waiting for it, and that we get the whole output
+ # after it completes.
+ (stdout, stderr) = p.communicate()
+ self.assertEqual(stdout, "banana")
+ self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n")
+
+ def test_communicate_timeout_large_ouput(self):
+ # Test an expiring timeout while the child is outputting lots of data.
+ p = subprocess.Popen([sys.executable, "-c",
+ 'import sys,os,time;'
+ 'sys.stdout.write("a" * (64 * 1024));'
+ 'time.sleep(0.2);'
+ 'sys.stdout.write("a" * (64 * 1024));'
+ 'time.sleep(0.2);'
+ 'sys.stdout.write("a" * (64 * 1024));'
+ 'time.sleep(0.2);'
+ 'sys.stdout.write("a" * (64 * 1024));'],
+ stdout=subprocess.PIPE)
+ self.assertRaises(subprocess.TimeoutExpired, p.communicate, timeout=0.4)
+ (stdout, _) = p.communicate()
+ self.assertEqual(len(stdout), 4 * 64 * 1024)
+
# Test for the fd leak reported in http://bugs.python.org/issue2791.
def test_communicate_pipe_fd_leak(self):
for stdin_pipe in (False, True):
@@ -504,24 +629,21 @@ class ProcessTestCase(BaseTestCase):
# This test will probably deadlock rather than fail, if
# communicate() does not work properly.
x, y = os.pipe()
- if mswindows:
- pipe_buf = 512
- else:
- pipe_buf = os.fpathconf(x, "PC_PIPE_BUF")
os.close(x)
os.close(y)
p = subprocess.Popen([sys.executable, "-c",
'import sys,os;'
'sys.stdout.write(sys.stdin.read(47));'
- 'sys.stderr.write("xyz"*%d);'
- 'sys.stdout.write(sys.stdin.read())' % pipe_buf],
+ 'sys.stderr.write("x" * %d);'
+ 'sys.stdout.write(sys.stdin.read())' %
+ support.PIPE_MAX_SIZE],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.addCleanup(p.stdout.close)
self.addCleanup(p.stderr.close)
self.addCleanup(p.stdin.close)
- string_to_write = b"abc"*pipe_buf
+ string_to_write = b"a" * support.PIPE_MAX_SIZE
(stdout, stderr) = p.communicate(string_to_write)
self.assertEqual(stdout, string_to_write)
@@ -596,8 +718,6 @@ class ProcessTestCase(BaseTestCase):
universal_newlines=1)
self.addCleanup(p.stdout.close)
self.addCleanup(p.stderr.close)
- # BUG: can't give a non-empty stdin because it breaks both the
- # select- and poll-based communicate() implementations.
(stdout, stderr) = p.communicate()
self.assertEqual(stdout,
"line2\nline4\nline5\nline6\nline7\nline8")
@@ -605,12 +725,12 @@ class ProcessTestCase(BaseTestCase):
def test_universal_newlines_communicate_stdin(self):
# universal newlines through communicate(), with only stdin
p = subprocess.Popen([sys.executable, "-c",
- 'import sys,os;' + SETBINARY + '''\nif True:
- s = sys.stdin.readline()
- assert s == "line1\\n", repr(s)
- s = sys.stdin.read()
- assert s == "line3\\n", repr(s)
- '''],
+ 'import sys,os;' + SETBINARY + textwrap.dedent('''
+ s = sys.stdin.readline()
+ assert s == "line1\\n", repr(s)
+ s = sys.stdin.read()
+ assert s == "line3\\n", repr(s)
+ ''')],
stdin=subprocess.PIPE,
universal_newlines=1)
(stdout, stderr) = p.communicate("line1\nline3\n")
@@ -628,6 +748,35 @@ class ProcessTestCase(BaseTestCase):
p.communicate()
self.assertEqual(p.returncode, 0)
+ def test_universal_newlines_communicate_stdin_stdout_stderr(self):
+ # universal newlines through communicate(), with stdin, stdout, stderr
+ p = subprocess.Popen([sys.executable, "-c",
+ 'import sys,os;' + SETBINARY + textwrap.dedent('''
+ s = sys.stdin.buffer.readline()
+ sys.stdout.buffer.write(s)
+ sys.stdout.buffer.write(b"line2\\r")
+ sys.stderr.buffer.write(b"eline2\\n")
+ s = sys.stdin.buffer.read()
+ sys.stdout.buffer.write(s)
+ sys.stdout.buffer.write(b"line4\\n")
+ sys.stdout.buffer.write(b"line5\\r\\n")
+ sys.stderr.buffer.write(b"eline6\\r")
+ sys.stderr.buffer.write(b"eline7\\r\\nz")
+ ''')],
+ stdin=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ universal_newlines=True)
+ self.addCleanup(p.stdout.close)
+ self.addCleanup(p.stderr.close)
+ (stdout, stderr) = p.communicate("line1\nline3\n")
+ self.assertEqual(p.returncode, 0)
+ self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout)
+ # Python debug build push something like "[42442 refs]\n"
+ # to stderr at exit of subprocess.
+ # Don't use assertStderrEqual because it strips CR and LF from output.
+ self.assertTrue(stderr.startswith("eline2\neline6\neline7\n"))
+
def test_universal_newlines_communicate_encodings(self):
# Check that universal newlines mode works for various encodings,
# in particular for encodings in the UTF-16 and UTF-32 families.
@@ -657,7 +806,6 @@ class ProcessTestCase(BaseTestCase):
stdout, stderr = popen.communicate(input='')
finally:
locale.getpreferredencoding = old_getpreferredencoding
-
self.assertEqual(stdout, '1\n2\n3\n4')
def test_no_leaking(self):
@@ -717,30 +865,32 @@ class ProcessTestCase(BaseTestCase):
self.assertEqual(subprocess.list2cmdline(['ab', '']),
'ab ""')
-
def test_poll(self):
- p = subprocess.Popen([sys.executable,
- "-c", "import time; time.sleep(1)"])
- count = 0
- while p.poll() is None:
- time.sleep(0.1)
- count += 1
- # We expect that the poll loop probably went around about 10 times,
- # but, based on system scheduling we can't control, it's possible
- # poll() never returned None. It "should be" very rare that it
- # didn't go around at least twice.
- self.assertGreaterEqual(count, 2)
+ p = subprocess.Popen([sys.executable, "-c",
+ "import os; os.read(0, 1)"],
+ stdin=subprocess.PIPE)
+ self.addCleanup(p.stdin.close)
+ self.assertIsNone(p.poll())
+ os.write(p.stdin.fileno(), b'A')
+ p.wait()
# Subsequent invocations should just return the returncode
self.assertEqual(p.poll(), 0)
-
def test_wait(self):
- p = subprocess.Popen([sys.executable,
- "-c", "import time; time.sleep(2)"])
+ p = subprocess.Popen([sys.executable, "-c", "pass"])
self.assertEqual(p.wait(), 0)
# Subsequent invocations should just return the returncode
self.assertEqual(p.wait(), 0)
+ def test_wait_timeout(self):
+ p = subprocess.Popen([sys.executable,
+ "-c", "import time; time.sleep(0.1)"])
+ with self.assertRaises(subprocess.TimeoutExpired) as c:
+ p.wait(timeout=0.01)
+ self.assertIn("0.01", str(c.exception)) # For coverage of __str__.
+ # Some heavily loaded buildbots (sparc Debian 3.x) require this much
+ # time to start.
+ self.assertEqual(p.wait(timeout=3), 0)
def test_invalid_bufsize(self):
# an invalid type of the bufsize argument should raise
@@ -819,25 +969,29 @@ class ProcessTestCase(BaseTestCase):
p = subprocess.Popen([sys.executable, "-c", 'pass'],
stdin=subprocess.PIPE)
self.addCleanup(p.stdin.close)
- time.sleep(2)
+ p.wait()
p.communicate(b"x" * 2**20)
- @unittest.skipUnless(hasattr(signal, 'SIGALRM'),
- "Requires signal.SIGALRM")
+ @unittest.skipUnless(hasattr(signal, 'SIGUSR1'),
+ "Requires signal.SIGUSR1")
+ @unittest.skipUnless(hasattr(os, 'kill'),
+ "Requires os.kill")
+ @unittest.skipUnless(hasattr(os, 'getppid'),
+ "Requires os.getppid")
def test_communicate_eintr(self):
# Issue #12493: communicate() should handle EINTR
def handler(signum, frame):
pass
- old_handler = signal.signal(signal.SIGALRM, handler)
- self.addCleanup(signal.signal, signal.SIGALRM, old_handler)
+ old_handler = signal.signal(signal.SIGUSR1, handler)
+ self.addCleanup(signal.signal, signal.SIGUSR1, old_handler)
- # the process is running for 2 seconds
- args = [sys.executable, "-c", 'import time; time.sleep(2)']
+ args = [sys.executable, "-c",
+ 'import os, signal;'
+ 'os.kill(os.getppid(), signal.SIGUSR1)']
for stream in ('stdout', 'stderr'):
kw = {stream: subprocess.PIPE}
with subprocess.Popen(args, **kw) as process:
- signal.alarm(1)
- # communicate() will be interrupted by SIGALRM
+ # communicate() will be interrupted by SIGUSR1
process.communicate()
@@ -1401,6 +1555,11 @@ class POSIXProcessTestCase(BaseTestCase):
exitcode = subprocess.call([abs_program, "-c", "pass"])
self.assertEqual(exitcode, 0)
+ # absolute bytes path as a string
+ cmd = b"'" + abs_program + b"' -c pass"
+ exitcode = subprocess.call(cmd, shell=True)
+ self.assertEqual(exitcode, 0)
+
# bytes program, unicode PATH
env = os.environ.copy()
env["PATH"] = path
@@ -1584,7 +1743,7 @@ class POSIXProcessTestCase(BaseTestCase):
stdout, stderr = p.communicate()
self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
" non-zero with this error:\n%s" %
- stderr.decode('utf8'))
+ stderr.decode('utf-8'))
def test_select_unbuffered(self):
# Issue #11459: bufsize=0 should really set the pipes as
@@ -1831,28 +1990,6 @@ class ProcessTestCaseNoPoll(ProcessTestCase):
ProcessTestCase.tearDown(self)
-@unittest.skipUnless(getattr(subprocess, '_posixsubprocess', False),
- "_posixsubprocess extension module not found.")
-class ProcessTestCasePOSIXPurePython(ProcessTestCase, POSIXProcessTestCase):
- @classmethod
- def setUpClass(cls):
- global subprocess
- assert subprocess._posixsubprocess
- # Reimport subprocess while forcing _posixsubprocess to not exist.
- with support.check_warnings(('.*_posixsubprocess .* not being used.*',
- RuntimeWarning)):
- subprocess = support.import_fresh_module(
- 'subprocess', blocked=['_posixsubprocess'])
- assert not subprocess._posixsubprocess
-
- @classmethod
- def tearDownClass(cls):
- global subprocess
- # Reimport subprocess as it should be, restoring order to the universe.
- subprocess = support.import_fresh_module('subprocess')
- assert subprocess._posixsubprocess
-
-
class HelperFunctionTests(unittest.TestCase):
@unittest.skipIf(mswindows, "errno and EINTR make no sense on windows")
def test_eintr_retry_call(self):
@@ -1961,7 +2098,6 @@ def test_main():
unit_tests = (ProcessTestCase,
POSIXProcessTestCase,
Win32ProcessTestCase,
- ProcessTestCasePOSIXPurePython,
CommandTests,
ProcessTestCaseNoPoll,
HelperFunctionTests,
diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
index 07802d6..fcccdf7 100644
--- a/Lib/test/test_sundry.py
+++ b/Lib/test/test_sundry.py
@@ -9,7 +9,6 @@ class TestUntestedModules(unittest.TestCase):
with support.check_warnings(quiet=True):
import bdb
import cgitb
- import code
import distutils.bcppcompiler
import distutils.ccompiler
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py
index 914216d..f6469cf 100644
--- a/Lib/test/test_super.py
+++ b/Lib/test/test_super.py
@@ -81,6 +81,55 @@ class TestSuper(unittest.TestCase):
self.assertEqual(E().f(), 'AE')
+ @unittest.expectedFailure
+ def test___class___set(self):
+ # See issue #12370
+ class X(A):
+ def f(self):
+ return super().f()
+ __class__ = 413
+ x = X()
+ self.assertEqual(x.f(), 'A')
+ self.assertEqual(x.__class__, 413)
+
+ def test___class___instancemethod(self):
+ # See issue #14857
+ class X:
+ def f(self):
+ return __class__
+ self.assertIs(X().f(), X)
+
+ def test___class___classmethod(self):
+ # See issue #14857
+ class X:
+ @classmethod
+ def f(cls):
+ return __class__
+ self.assertIs(X.f(), X)
+
+ def test___class___staticmethod(self):
+ # See issue #14857
+ class X:
+ @staticmethod
+ def f():
+ return __class__
+ self.assertIs(X.f(), X)
+
+ def test_obscure_super_errors(self):
+ def f():
+ super()
+ self.assertRaises(RuntimeError, f)
+ def f(x):
+ del x
+ super()
+ self.assertRaises(RuntimeError, f, None)
+ class X:
+ def f(x):
+ nonlocal __class__
+ del __class__
+ super()
+ self.assertRaises(RuntimeError, X().f)
+
def test_main():
support.run_unittest(TestSuper)
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
new file mode 100644
index 0000000..f6ef5f6
--- /dev/null
+++ b/Lib/test/test_support.py
@@ -0,0 +1,199 @@
+#!/usr/bin/env python
+
+import importlib
+import sys
+import os
+import unittest
+import socket
+import tempfile
+import errno
+from test import support
+
+TESTFN = support.TESTFN
+TESTDIRN = os.path.basename(tempfile.mkdtemp(dir='.'))
+
+
+class TestSupport(unittest.TestCase):
+ def setUp(self):
+ support.unlink(TESTFN)
+ support.rmtree(TESTDIRN)
+ tearDown = setUp
+
+ def test_import_module(self):
+ support.import_module("ftplib")
+ self.assertRaises(unittest.SkipTest, support.import_module, "foo")
+
+ def test_import_fresh_module(self):
+ support.import_fresh_module("ftplib")
+
+ def test_get_attribute(self):
+ self.assertEqual(support.get_attribute(self, "test_get_attribute"),
+ self.test_get_attribute)
+ self.assertRaises(unittest.SkipTest, support.get_attribute, self, "foo")
+
+ @unittest.skip("failing buildbots")
+ def test_get_original_stdout(self):
+ self.assertEqual(support.get_original_stdout(), sys.stdout)
+
+ def test_unload(self):
+ import sched
+ self.assertIn("sched", sys.modules)
+ support.unload("sched")
+ self.assertNotIn("sched", sys.modules)
+
+ def test_unlink(self):
+ with open(TESTFN, "w") as f:
+ pass
+ support.unlink(TESTFN)
+ self.assertFalse(os.path.exists(TESTFN))
+ support.unlink(TESTFN)
+
+ def test_rmtree(self):
+ os.mkdir(TESTDIRN)
+ os.mkdir(os.path.join(TESTDIRN, TESTDIRN))
+ support.rmtree(TESTDIRN)
+ self.assertFalse(os.path.exists(TESTDIRN))
+ support.rmtree(TESTDIRN)
+
+ def test_forget(self):
+ mod_filename = TESTFN + '.py'
+ with open(mod_filename, 'w') as f:
+ print('foo = 1', file=f)
+ sys.path.insert(0, os.curdir)
+ importlib.invalidate_caches()
+ try:
+ mod = __import__(TESTFN)
+ self.assertIn(TESTFN, sys.modules)
+
+ support.forget(TESTFN)
+ self.assertNotIn(TESTFN, sys.modules)
+ finally:
+ del sys.path[0]
+ support.unlink(mod_filename)
+
+ def test_HOST(self):
+ s = socket.socket()
+ s.bind((support.HOST, 0))
+ s.close()
+
+ def test_find_unused_port(self):
+ port = support.find_unused_port()
+ s = socket.socket()
+ s.bind((support.HOST, port))
+ s.close()
+
+ def test_bind_port(self):
+ s = socket.socket()
+ support.bind_port(s)
+ s.listen(1)
+ s.close()
+
+ def test_temp_cwd(self):
+ here = os.getcwd()
+ with support.temp_cwd(name=TESTFN):
+ self.assertEqual(os.path.basename(os.getcwd()), TESTFN)
+ self.assertFalse(os.path.exists(TESTFN))
+ self.assertTrue(os.path.basename(os.getcwd()), here)
+
+ def test_temp_cwd__chdir_warning(self):
+ """Check the warning message when os.chdir() fails."""
+ path = TESTFN + '_does_not_exist'
+ with support.check_warnings() as recorder:
+ with support.temp_cwd(path=path, quiet=True):
+ pass
+ messages = [str(w.message) for w in recorder.warnings]
+ self.assertEqual(messages, ['tests may fail, unable to change the CWD to ' + path])
+
+ def test_sortdict(self):
+ self.assertEqual(support.sortdict({3:3, 2:2, 1:1}), "{1: 1, 2: 2, 3: 3}")
+
+ def test_make_bad_fd(self):
+ fd = support.make_bad_fd()
+ with self.assertRaises(OSError) as cm:
+ os.write(fd, b"foo")
+ self.assertEqual(cm.exception.errno, errno.EBADF)
+
+ def test_check_syntax_error(self):
+ support.check_syntax_error(self, "def class")
+ self.assertRaises(AssertionError, support.check_syntax_error, self, "1")
+
+ def test_CleanImport(self):
+ import importlib
+ with support.CleanImport("asyncore"):
+ importlib.import_module("asyncore")
+
+ def test_DirsOnSysPath(self):
+ with support.DirsOnSysPath('foo', 'bar'):
+ self.assertIn("foo", sys.path)
+ self.assertIn("bar", sys.path)
+ self.assertNotIn("foo", sys.path)
+ self.assertNotIn("bar", sys.path)
+
+ def test_captured_stdout(self):
+ with support.captured_stdout() as s:
+ print("hello")
+ self.assertEqual(s.getvalue(), "hello\n")
+
+ def test_captured_stderr(self):
+ with support.captured_stderr() as s:
+ print("hello", file=sys.stderr)
+ self.assertEqual(s.getvalue(), "hello\n")
+
+ def test_captured_stdin(self):
+ with support.captured_stdin() as s:
+ print("hello", file=sys.stdin)
+ self.assertEqual(s.getvalue(), "hello\n")
+
+ def test_gc_collect(self):
+ support.gc_collect()
+
+ def test_python_is_optimized(self):
+ self.assertIsInstance(support.python_is_optimized(), bool)
+
+ def test_swap_attr(self):
+ class Obj:
+ x = 1
+ obj = Obj()
+ with support.swap_attr(obj, "x", 5):
+ self.assertEqual(obj.x, 5)
+ self.assertEqual(obj.x, 1)
+
+ def test_swap_item(self):
+ D = {"item":1}
+ with support.swap_item(D, "item", 5):
+ self.assertEqual(D["item"], 5)
+ self.assertEqual(D["item"], 1)
+
+ # XXX -follows a list of untested API
+ # make_legacy_pyc
+ # is_resource_enabled
+ # requires
+ # fcmp
+ # umaks
+ # findfile
+ # check_warnings
+ # EnvironmentVarGuard
+ # TransientResource
+ # transient_internet
+ # run_with_locale
+ # set_memlimit
+ # bigmemtest
+ # precisionbigmemtest
+ # bigaddrspacetest
+ # requires_resource
+ # run_doctest
+ # threading_cleanup
+ # reap_threads
+ # reap_children
+ # strip_python_stderr
+ # args_from_interpreter_flags
+ # can_symlink
+ # skip_unless_symlink
+
+
+def test_main():
+ tests = [TestSupport]
+ support.run_unittest(*tests)
+
+if __name__ == '__main__':
+ test_main()
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index a52767a..e5ec85c 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -303,6 +303,7 @@ class SysModuleTest(unittest.TestCase):
self.assertEqual(sys.getdlopenflags(), oldflags+1)
sys.setdlopenflags(oldflags)
+ @test.support.refcount_test
def test_refcount(self):
# n here must be a global in order for this test to pass while
# tracing with a python function. Tracing calls PyFrame_FastToLocals
@@ -342,7 +343,7 @@ class SysModuleTest(unittest.TestCase):
# Test sys._current_frames() in a WITH_THREADS build.
@test.support.reap_threads
def current_frames_with_threads(self):
- import threading, _thread
+ import threading
import traceback
# Spawn a thread that blocks at a known place. Then the main
@@ -356,7 +357,7 @@ class SysModuleTest(unittest.TestCase):
g456()
def g456():
- thread_info.append(_thread.get_ident())
+ thread_info.append(threading.get_ident())
entered_g.set()
leave_g.wait()
@@ -372,7 +373,7 @@ class SysModuleTest(unittest.TestCase):
d = sys._current_frames()
- main_id = _thread.get_ident()
+ main_id = threading.get_ident()
self.assertIn(main_id, d)
self.assertIn(thread_id, d)
@@ -418,6 +419,7 @@ class SysModuleTest(unittest.TestCase):
self.assertIsInstance(sys.builtin_module_names, tuple)
self.assertIsInstance(sys.copyright, str)
self.assertIsInstance(sys.exec_prefix, str)
+ self.assertIsInstance(sys.base_exec_prefix, str)
self.assertIsInstance(sys.executable, str)
self.assertEqual(len(sys.float_info), 11)
self.assertEqual(sys.float_info.radix, 2)
@@ -446,8 +448,10 @@ class SysModuleTest(unittest.TestCase):
self.assertIsInstance(sys.maxsize, int)
self.assertIsInstance(sys.maxunicode, int)
+ self.assertEqual(sys.maxunicode, 0x10FFFF)
self.assertIsInstance(sys.platform, str)
self.assertIsInstance(sys.prefix, str)
+ self.assertIsInstance(sys.base_prefix, str)
self.assertIsInstance(sys.version, str)
vi = sys.version_info
self.assertIsInstance(vi[:], tuple)
@@ -473,6 +477,14 @@ class SysModuleTest(unittest.TestCase):
if not sys.platform.startswith('win'):
self.assertIsInstance(sys.abiflags, str)
+ @unittest.skipUnless(hasattr(sys, 'thread_info'),
+ 'Threading required for this test.')
+ def test_thread_info(self):
+ info = sys.thread_info
+ self.assertEqual(len(info), 3)
+ self.assertIn(info.name, ('nt', 'os2', 'pthread', 'solaris', None))
+ self.assertIn(info.lock, ('semaphore', 'mutex+cond', None))
+
def test_43581(self):
# Can't use sys.stdout, as this is a StringIO object when
# the test runs under regrtest.
@@ -500,7 +512,7 @@ class SysModuleTest(unittest.TestCase):
def test_sys_flags(self):
self.assertTrue(sys.flags)
- attrs = ("debug", "division_warning",
+ attrs = ("debug",
"inspect", "interactive", "optimize", "dont_write_bytecode",
"no_user_site", "no_site", "ignore_environment", "verbose",
"bytes_warning", "quiet", "hash_randomization")
@@ -532,6 +544,8 @@ class SysModuleTest(unittest.TestCase):
out = p.communicate()[0].strip()
self.assertEqual(out, b'?')
+ @unittest.skipIf(sys.base_prefix != sys.prefix,
+ 'Test is not venv-compatible')
def test_executable(self):
# sys.executable should be absolute
self.assertEqual(os.path.abspath(sys.executable), sys.executable)
@@ -568,6 +582,34 @@ class SysModuleTest(unittest.TestCase):
expected = None
self.check_fsencoding(fs_encoding, expected)
+ def test_implementation(self):
+ # This test applies to all implementations equally.
+
+ levels = {'alpha': 0xA, 'beta': 0xB, 'candidate': 0xC, 'final': 0xF}
+
+ self.assertTrue(hasattr(sys.implementation, 'name'))
+ self.assertTrue(hasattr(sys.implementation, 'version'))
+ self.assertTrue(hasattr(sys.implementation, 'hexversion'))
+ self.assertTrue(hasattr(sys.implementation, 'cache_tag'))
+
+ version = sys.implementation.version
+ self.assertEqual(version[:2], (version.major, version.minor))
+
+ hexversion = (version.major << 24 | version.minor << 16 |
+ version.micro << 8 | levels[version.releaselevel] << 4 |
+ version.serial << 0)
+ self.assertEqual(sys.implementation.hexversion, hexversion)
+
+ # PEP 421 requires that .name be lower case.
+ self.assertEqual(sys.implementation.name,
+ sys.implementation.name.lower())
+
+ def test_debugmallocstats(self):
+ # Test sys._debugmallocstats()
+ from test.script_helper import assert_python_ok
+ args = ['-c', 'import sys; sys._debugmallocstats()']
+ ret, out, err = assert_python_ok(*args)
+ self.assertIn(b"free PyDictObjects", err)
class SizeofTest(unittest.TestCase):
@@ -591,12 +633,12 @@ class SizeofTest(unittest.TestCase):
# bool objects are not gc tracked
self.assertEqual(sys.getsizeof(True), vsize('') + self.longdigit)
# but lists are
- self.assertEqual(sys.getsizeof([]), vsize('PP') + gc_header_size)
+ self.assertEqual(sys.getsizeof([]), vsize('Pn') + gc_header_size)
def test_default(self):
- vsize = test.support.calcvobjsize
- self.assertEqual(sys.getsizeof(True), vsize('') + self.longdigit)
- self.assertEqual(sys.getsizeof(True, -1), vsize('') + self.longdigit)
+ size = test.support.calcvobjsize
+ self.assertEqual(sys.getsizeof(True), size('') + self.longdigit)
+ self.assertEqual(sys.getsizeof(True, -1), size('') + self.longdigit)
def test_objecttypes(self):
# check all types defined in Objects/
@@ -613,9 +655,9 @@ class SizeofTest(unittest.TestCase):
samples = [b'', b'u'*100000]
for sample in samples:
x = bytearray(sample)
- check(x, vsize('iPP') + x.__alloc__())
+ check(x, vsize('inP') + x.__alloc__())
# bytearray_iterator
- check(iter(bytearray()), size('PP'))
+ check(iter(bytearray()), size('nP'))
# cell
def get_cell():
x = 42
@@ -624,27 +666,33 @@ class SizeofTest(unittest.TestCase):
return inner
check(get_cell().__closure__[0], size('P'))
# code
- check(get_cell().__code__, size('5i8Pi3P'))
+ check(get_cell().__code__, size('5i9Pi3P'))
+ check(get_cell.__code__, size('5i9Pi3P'))
+ def get_cell2(x):
+ def inner():
+ return x
+ return inner
+ check(get_cell2.__code__, size('5i9Pi3P') + 1)
# complex
check(complex(0,1), size('2d'))
# method_descriptor (descriptor object)
- check(str.lower, size('2PP'))
+ check(str.lower, size('3PP'))
# classmethod_descriptor (descriptor object)
# XXX
# member_descriptor (descriptor object)
import datetime
- check(datetime.timedelta.days, size('2PP'))
+ check(datetime.timedelta.days, size('3PP'))
# getset_descriptor (descriptor object)
import collections
- check(collections.defaultdict.default_factory, size('2PP'))
+ check(collections.defaultdict.default_factory, size('3PP'))
# wrapper_descriptor (descriptor object)
- check(int.__add__, size('2P2P'))
+ check(int.__add__, size('3P2P'))
# method-wrapper (descriptor object)
check({}.__iter__, size('2P'))
# dict
- check({}, size('3P2P' + 8*'P2P'))
+ check({}, size('n2P' + '2nPn' + 8*'n2P'))
longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8}
- check(longdict, size('3P2P' + 8*'P2P') + 16*struct.calcsize('P2P'))
+ check(longdict, size('n2P' + '2nPn') + 16*struct.calcsize('n2P'))
# dictionary-keyiterator
check({}.keys(), size('P'))
# dictionary-valueiterator
@@ -652,18 +700,18 @@ class SizeofTest(unittest.TestCase):
# dictionary-itemiterator
check({}.items(), size('P'))
# dictionary iterator
- check(iter({}), size('P2PPP'))
+ check(iter({}), size('P2nPn'))
# dictproxy
class C(object): pass
check(C.__dict__, size('P'))
# BaseException
- check(BaseException(), size('5P'))
+ check(BaseException(), size('5Pi'))
# UnicodeEncodeError
- check(UnicodeEncodeError("", "", 0, 0, ""), size('5P 2P2PP'))
+ check(UnicodeEncodeError("", "", 0, 0, ""), size('5Pi 2P2nP'))
# UnicodeDecodeError
- check(UnicodeDecodeError("", b"", 0, 0, ""), size('5P 2P2PP'))
+ check(UnicodeDecodeError("", b"", 0, 0, ""), size('5Pi 2P2nP'))
# UnicodeTranslateError
- check(UnicodeTranslateError("", 0, 1, ""), size('5P 2P2PP'))
+ check(UnicodeTranslateError("", 0, 1, ""), size('5Pi 2P2nP'))
# ellipses
check(Ellipsis, size(''))
# EncodingMap
@@ -671,9 +719,9 @@ class SizeofTest(unittest.TestCase):
x = codecs.charmap_build(encodings.iso8859_3.decoding_table)
check(x, size('32B2iB'))
# enumerate
- check(enumerate([]), size('l3P'))
+ check(enumerate([]), size('n3P'))
# reverse
- check(reversed(''), size('PP'))
+ check(reversed(''), size('nP'))
# float
check(float(0), size('d'))
# sys.floatinfo
@@ -689,7 +737,7 @@ class SizeofTest(unittest.TestCase):
check(x, vsize('12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
# function
def func(): pass
- check(func, size('11P'))
+ check(func, size('12P'))
class c():
@staticmethod
def foo():
@@ -698,12 +746,12 @@ class SizeofTest(unittest.TestCase):
def bar(cls):
pass
# staticmethod
- check(foo, size('P'))
+ check(foo, size('PP'))
# classmethod
- check(bar, size('P'))
+ check(bar, size('PP'))
# generator
def get_gen(): yield 1
- check(get_gen(), size('Pi2P'))
+ check(get_gen(), size('Pb2P'))
# iterator
check(iter('abc'), size('lP'))
# callable-iterator
@@ -712,7 +760,7 @@ class SizeofTest(unittest.TestCase):
# list
samples = [[], [1,2,3], ['1', '2', '3']]
for sample in samples:
- check(sample, vsize('PP') + len(sample)*self.P)
+ check(sample, vsize('Pn') + len(sample)*self.P)
# sortwrapper (list)
# XXX
# cmpwrapper (list)
@@ -720,7 +768,7 @@ class SizeofTest(unittest.TestCase):
# listiterator (list)
check(iter([]), size('lP'))
# listreverseiterator (list)
- check(reversed([]), size('lP'))
+ check(reversed([]), size('nP'))
# long
check(0, vsize(''))
check(1, vsize('') + self.longdigit)
@@ -730,9 +778,9 @@ class SizeofTest(unittest.TestCase):
check(int(PyLong_BASE**2-1), vsize('') + 2*self.longdigit)
check(int(PyLong_BASE**2), vsize('') + 3*self.longdigit)
# memoryview
- check(memoryview(b''), size('PP2P2i7P'))
+ check(memoryview(b''), size('Pnin 2P2n2i5P 3cPn'))
# module
- check(unittest, size('3P'))
+ check(unittest, size('PnP'))
# None
check(None, size(''))
# NotImplementedType
@@ -751,7 +799,7 @@ class SizeofTest(unittest.TestCase):
# rangeiterator
check(iter(range(1)), size('4l'))
# reverse
- check(reversed(''), size('PP'))
+ check(reversed(''), size('nP'))
# range
check(range(1), size('4P'))
check(range(66000), size('4P'))
@@ -759,7 +807,7 @@ class SizeofTest(unittest.TestCase):
# frozenset
PySet_MINSIZE = 8
samples = [[], range(10), range(50)]
- s = size('3P2P' + PySet_MINSIZE*'PP' + 'PP')
+ s = size('3n2P' + PySet_MINSIZE*'nP' + 'nP')
for sample in samples:
minused = len(sample)
if minused == 0: tmp = 1
@@ -773,10 +821,10 @@ class SizeofTest(unittest.TestCase):
check(set(sample), s)
check(frozenset(sample), s)
else:
- check(set(sample), s + newsize*struct.calcsize('lP'))
- check(frozenset(sample), s + newsize*struct.calcsize('lP'))
+ check(set(sample), s + newsize*struct.calcsize('nP'))
+ check(frozenset(sample), s + newsize*struct.calcsize('nP'))
# setiterator
- check(iter(set()), size('P3P'))
+ check(iter(set()), size('P3n'))
# slice
check(slice(0), size('3P'))
# super
@@ -785,28 +833,56 @@ class SizeofTest(unittest.TestCase):
check((), vsize(''))
check((1,2,3), vsize('') + 3*self.P)
# type
- # (PyTypeObject + PyNumberMethods + PyMappingMethods +
- # PySequenceMethods + PyBufferProcs)
- s = vsize('P2P15Pl4PP9PP11PI') + struct.calcsize('16Pi17P 3P 10P 2P 2P')
+ # static type: PyTypeObject
+ s = vsize('P2n15Pl4Pn9Pn11PI')
check(int, s)
+ # (PyTypeObject + PyNumberMethods + PyMappingMethods +
+ # PySequenceMethods + PyBufferProcs + 4P)
+ s = vsize('P2n15Pl4Pn9Pn11PI') + struct.calcsize('34P 3P 10P 2P 4P')
+ # Separate block for PyDictKeysObject with 4 entries
+ s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
# class
class newstyleclass(object): pass
check(newstyleclass, s)
+ # dict with shared keys
+ check(newstyleclass().__dict__, size('n2P' + '2nPn'))
# unicode
- usize = len('\0'.encode('unicode-internal'))
- samples = ['', '1'*100]
- # we need to test for both sizes, because we don't know if the string
- # has been cached
+ # each tuple contains a string and its expected character size
+ # don't put any static strings here, as they may contain
+ # wchar_t or UTF-8 representations
+ samples = ['1'*100, '\xff'*50,
+ '\u0100'*40, '\uffff'*100,
+ '\U00010000'*30, '\U0010ffff'*100]
+ asciifields = "nniP"
+ compactfields = asciifields + "nPn"
+ unicodefields = compactfields + "P"
for s in samples:
- basicsize = size('PPPiP') + usize * (len(s) + 1)
- check(s, basicsize)
+ maxchar = ord(max(s))
+ if maxchar < 128:
+ L = size(asciifields) + len(s) + 1
+ elif maxchar < 256:
+ L = size(compactfields) + len(s) + 1
+ elif maxchar < 65536:
+ L = size(compactfields) + 2*(len(s) + 1)
+ else:
+ L = size(compactfields) + 4*(len(s) + 1)
+ check(s, L)
+ # verify that the UTF-8 size is accounted for
+ s = chr(0x4000) # 4 bytes canonical representation
+ check(s, size(compactfields) + 4)
+ # compile() will trigger the generation of the UTF-8
+ # representation as a side effect
+ compile(s, "<stdin>", "eval")
+ check(s, size(compactfields) + 4 + 4)
+ # TODO: add check that forces the presence of wchar_t representation
+ # TODO: add check that forces layout of unicodefields
# weakref
import weakref
- check(weakref.ref(int), size('2Pl2P'))
+ check(weakref.ref(int), size('2Pn2P'))
# weakproxy
# XXX
# weakcallableproxy
- check(weakref.proxy(int), size('2Pl2P'))
+ check(weakref.proxy(int), size('2Pn2P'))
def test_pythontypes(self):
# check all types defined in Python/
@@ -815,16 +891,13 @@ class SizeofTest(unittest.TestCase):
check = self.check_sizeof
# _ast.AST
import _ast
- check(_ast.AST(), size(''))
- # imp.NullImporter
- import imp
- check(imp.NullImporter(self.file.name), size(''))
+ check(_ast.AST(), size('P'))
try:
raise TypeError
except TypeError:
tb = sys.exc_info()[2]
# traceback
- if tb != None:
+ if tb is not None:
check(tb, size('2P2i'))
# symtable entry
# XXX
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index ea2bb29..fdf958c 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -251,6 +251,7 @@ class TraceTestCase(unittest.TestCase):
def setUp(self):
self.using_gc = gc.isenabled()
gc.disable()
+ self.addCleanup(sys.settrace, sys.gettrace())
def tearDown(self):
if self.using_gc:
@@ -389,6 +390,9 @@ class TraceTestCase(unittest.TestCase):
class RaisingTraceFuncTestCase(unittest.TestCase):
+ def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
+
def trace(self, frame, event, arg):
"""A trace function that raises an exception in response to a
specific trace event."""
@@ -696,6 +700,10 @@ def no_jump_without_trace_function():
class JumpTestCase(unittest.TestCase):
+ def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
+ sys.settrace(None)
+
def compare_jump_output(self, expected, received):
if received != expected:
self.fail( "Outputs don't match:\n" +
@@ -747,6 +755,8 @@ class JumpTestCase(unittest.TestCase):
def test_18_no_jump_to_non_integers(self):
self.run_test(no_jump_to_non_integers)
def test_19_no_jump_without_trace_function(self):
+ # Must set sys.settrace(None) in setUp(), else condition is not
+ # triggered.
no_jump_without_trace_function()
def test_jump_across_with(self):
self.addCleanup(support.unlink, support.TESTFN)
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
index aabb6fa..9219360 100644
--- a/Lib/test/test_sysconfig.py
+++ b/Lib/test/test_sysconfig.py
@@ -1,11 +1,9 @@
-"""Tests for sysconfig."""
-
import unittest
import sys
import os
import subprocess
import shutil
-from copy import copy, deepcopy
+from copy import copy
from test.support import (run_unittest, TESTFN, unlink,
captured_stdout, skip_unless_symlink)
@@ -15,11 +13,11 @@ from sysconfig import (get_paths, get_platform, get_config_vars,
get_path, get_path_names, _INSTALL_SCHEMES,
_get_default_scheme, _expand_vars,
get_scheme_names, get_config_var, _main)
+import _osx_support
class TestSysConfig(unittest.TestCase):
def setUp(self):
- """Make a copy of sys.path"""
super(TestSysConfig, self).setUp()
self.sys_path = sys.path[:]
# patching os.uname
@@ -28,7 +26,7 @@ class TestSysConfig(unittest.TestCase):
self._uname = os.uname()
else:
self.uname = None
- self._uname = None
+ self._set_uname(('',)*5)
os.uname = self._get_uname
# saving the environment
self.name = os.name
@@ -38,11 +36,16 @@ class TestSysConfig(unittest.TestCase):
self.join = os.path.join
self.isabs = os.path.isabs
self.splitdrive = os.path.splitdrive
- self._config_vars = copy(sysconfig._CONFIG_VARS)
- self.old_environ = deepcopy(os.environ)
+ self._config_vars = sysconfig._CONFIG_VARS, copy(sysconfig._CONFIG_VARS)
+ self._added_envvars = []
+ self._changed_envvars = []
+ for var in ('MACOSX_DEPLOYMENT_TARGET', 'PATH'):
+ if var in os.environ:
+ self._changed_envvars.append((var, os.environ[var]))
+ else:
+ self._added_envvars.append(var)
def tearDown(self):
- """Restore sys.path"""
sys.path[:] = self.sys_path
self._cleanup_testfn()
if self.uname is not None:
@@ -56,19 +59,18 @@ class TestSysConfig(unittest.TestCase):
os.path.join = self.join
os.path.isabs = self.isabs
os.path.splitdrive = self.splitdrive
- sysconfig._CONFIG_VARS = copy(self._config_vars)
- for key, value in self.old_environ.items():
- if os.environ.get(key) != value:
- os.environ[key] = value
-
- for key in list(os.environ.keys()):
- if key not in self.old_environ:
- del os.environ[key]
+ sysconfig._CONFIG_VARS = self._config_vars[0]
+ sysconfig._CONFIG_VARS.clear()
+ sysconfig._CONFIG_VARS.update(self._config_vars[1])
+ for var, value in self._changed_envvars:
+ os.environ[var] = value
+ for var in self._added_envvars:
+ os.environ.pop(var, None)
super(TestSysConfig, self).tearDown()
def _set_uname(self, uname):
- self._uname = uname
+ self._uname = os.uname_result(uname)
def _get_uname(self):
return self._uname
@@ -87,21 +89,19 @@ class TestSysConfig(unittest.TestCase):
scheme = get_paths()
default_scheme = _get_default_scheme()
wanted = _expand_vars(default_scheme, None)
- wanted = list(wanted.items())
- wanted.sort()
- scheme = list(scheme.items())
- scheme.sort()
+ wanted = sorted(wanted.items())
+ scheme = sorted(scheme.items())
self.assertEqual(scheme, wanted)
def test_get_path(self):
- # xxx make real tests here
+ # XXX make real tests here
for scheme in _INSTALL_SCHEMES:
for name in _INSTALL_SCHEMES[scheme]:
res = get_path(name, scheme)
def test_get_config_vars(self):
cvars = get_config_vars()
- self.assertTrue(isinstance(cvars, dict))
+ self.assertIsInstance(cvars, dict)
self.assertTrue(cvars)
def test_get_platform(self):
@@ -135,8 +135,7 @@ class TestSysConfig(unittest.TestCase):
('Darwin Kernel Version 8.11.1: '
'Wed Oct 10 18:23:28 PDT 2007; '
'root:xnu-792.25.20~1/RELEASE_I386'), 'PowerPC'))
-
-
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g '
@@ -151,12 +150,11 @@ class TestSysConfig(unittest.TestCase):
finally:
sys.maxsize = maxint
-
self._set_uname(('Darwin', 'macziade', '8.11.1',
('Darwin Kernel Version 8.11.1: '
'Wed Oct 10 18:23:28 PDT 2007; '
'root:xnu-792.25.20~1/RELEASE_I386'), 'i386'))
- get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
get_config_vars()['CFLAGS'] = ('-fno-strict-aliasing -DNDEBUG -g '
@@ -171,6 +169,7 @@ class TestSysConfig(unittest.TestCase):
sys.maxsize = maxint
# macbook with fat binaries (fat, universal or fat64)
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = '10.4'
get_config_vars()['CFLAGS'] = ('-arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
@@ -179,6 +178,7 @@ class TestSysConfig(unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-fat')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
@@ -186,18 +186,21 @@ class TestSysConfig(unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-intel')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
'-dynamic -DNDEBUG -g -O3')
self.assertEqual(get_platform(), 'macosx-10.4-fat3')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch ppc64 -arch x86_64 -arch ppc -arch i386 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
'-dynamic -DNDEBUG -g -O3')
self.assertEqual(get_platform(), 'macosx-10.4-universal')
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch x86_64 -arch ppc64 -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
@@ -206,12 +209,13 @@ class TestSysConfig(unittest.TestCase):
self.assertEqual(get_platform(), 'macosx-10.4-fat64')
for arch in ('ppc', 'i386', 'x86_64', 'ppc64'):
+ _osx_support._remove_original_values(get_config_vars())
get_config_vars()['CFLAGS'] = ('-arch %s -isysroot '
'/Developer/SDKs/MacOSX10.4u.sdk '
'-fno-strict-aliasing -fno-common '
- '-dynamic -DNDEBUG -g -O3'%(arch,))
+ '-dynamic -DNDEBUG -g -O3' % arch)
- self.assertEqual(get_platform(), 'macosx-10.4-%s'%(arch,))
+ self.assertEqual(get_platform(), 'macosx-10.4-%s' % arch)
# linux debian sarge
os.name = 'posix'
@@ -239,8 +243,8 @@ class TestSysConfig(unittest.TestCase):
# On Windows, the EXE needs to know where pythonXY.dll is at so we have
# to add the directory to the path.
if sys.platform == "win32":
- os.environ["Path"] = "{};{}".format(
- os.path.dirname(sys.executable), os.environ["Path"])
+ os.environ["PATH"] = "{};{}".format(
+ os.path.dirname(sys.executable), os.environ["PATH"])
# Issue 7880
def get(python):
@@ -264,12 +268,17 @@ class TestSysConfig(unittest.TestCase):
# the global scheme mirrors the distinction between prefix and
# exec-prefix but not the user scheme, so we have to adapt the paths
# before comparing (issue #9100)
- adapt = sys.prefix != sys.exec_prefix
+ adapt = sys.base_prefix != sys.base_exec_prefix
for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'):
global_path = get_path(name, 'posix_prefix')
if adapt:
- global_path = global_path.replace(sys.exec_prefix, sys.prefix)
- base = base.replace(sys.exec_prefix, sys.prefix)
+ global_path = global_path.replace(sys.exec_prefix, sys.base_prefix)
+ base = base.replace(sys.exec_prefix, sys.base_prefix)
+ elif sys.base_prefix != sys.prefix:
+ # virtual environment? Likewise, we have to adapt the paths
+ # before comparing
+ global_path = global_path.replace(sys.base_prefix, sys.prefix)
+ base = base.replace(sys.base_prefix, sys.prefix)
user_path = get_path(name, 'posix_user')
self.assertEqual(user_path, global_path.replace(base, user, 1))
@@ -286,7 +295,6 @@ class TestSysConfig(unittest.TestCase):
self.assertIn(ldflags, ldshared)
-
@unittest.skipUnless(sys.platform == "darwin", "test only relevant on MacOSX")
def test_platform_in_subprocess(self):
my_platform = sysconfig.get_platform()
@@ -312,28 +320,58 @@ class TestSysConfig(unittest.TestCase):
self.assertEqual(status, 0)
self.assertEqual(my_platform, test_platform)
-
# Test with MACOSX_DEPLOYMENT_TARGET in the environment, and
# using a value that is unlikely to be the default one.
env = os.environ.copy()
env['MACOSX_DEPLOYMENT_TARGET'] = '10.1'
- p = subprocess.Popen([
- sys.executable, '-c',
- 'import sysconfig; print(sysconfig.get_platform())',
- ],
- stdout=subprocess.PIPE,
- stderr=open('/dev/null'),
- env=env)
- test_platform = p.communicate()[0].strip()
- test_platform = test_platform.decode('utf-8')
- status = p.wait()
-
- self.assertEqual(status, 0)
- self.assertEqual(my_platform, test_platform)
+ with open('/dev/null') as dev_null:
+ p = subprocess.Popen([
+ sys.executable, '-c',
+ 'import sysconfig; print(sysconfig.get_platform())',
+ ],
+ stdout=subprocess.PIPE,
+ stderr=dev_null,
+ env=env)
+ test_platform = p.communicate()[0].strip()
+ test_platform = test_platform.decode('utf-8')
+ status = p.wait()
+
+ self.assertEqual(status, 0)
+ self.assertEqual(my_platform, test_platform)
+
+ def test_srcdir(self):
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+
+ self.assertTrue(os.path.isabs(srcdir), srcdir)
+ self.assertTrue(os.path.isdir(srcdir), srcdir)
+
+ if sysconfig._PYTHON_BUILD:
+ # The python executable has not been installed so srcdir
+ # should be a full source checkout.
+ Python_h = os.path.join(srcdir, 'Include', 'Python.h')
+ self.assertTrue(os.path.exists(Python_h), Python_h)
+ self.assertTrue(sysconfig._is_python_source_dir(srcdir))
+ elif os.name == 'posix':
+ self.assertEqual(os.path.dirname(sysconfig.get_makefile_filename()),
+ srcdir)
+
+ def test_srcdir_independent_of_cwd(self):
+ # srcdir should be independent of the current working directory
+ # See Issues #15322, #15364.
+ srcdir = sysconfig.get_config_var('srcdir')
+ cwd = os.getcwd()
+ try:
+ os.chdir('..')
+ srcdir2 = sysconfig.get_config_var('srcdir')
+ finally:
+ os.chdir(cwd)
+ self.assertEqual(srcdir, srcdir2)
class MakefileTests(unittest.TestCase):
+
@unittest.skipIf(sys.platform.startswith('win'),
'Test is not Windows compatible')
def test_get_makefile_filename(self):
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index f32eb8c..c7bf774 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -21,6 +21,10 @@ try:
import bz2
except ImportError:
bz2 = None
+try:
+ import lzma
+except ImportError:
+ lzma = None
def md5sum(data):
return md5(data).hexdigest()
@@ -29,6 +33,7 @@ TEMPDIR = os.path.abspath(support.TESTFN) + "-tardir"
tarname = support.findfile("testtar.tar")
gzipname = os.path.join(TEMPDIR, "testtar.tar.gz")
bz2name = os.path.join(TEMPDIR, "testtar.tar.bz2")
+xzname = os.path.join(TEMPDIR, "testtar.tar.xz")
tmpname = os.path.join(TEMPDIR, "tmp.tar")
md5_regtype = "65f477c818ad9e15f7feab0c6d37742f"
@@ -51,13 +56,10 @@ class UstarReadTest(ReadTest):
def test_fileobj_regular_file(self):
tarinfo = self.tar.getmember("ustar/regtype")
- fobj = self.tar.extractfile(tarinfo)
- try:
+ with self.tar.extractfile(tarinfo) as fobj:
data = fobj.read()
self.assertTrue((len(data), md5sum(data)) == (tarinfo.size, md5_regtype),
"regular file extraction failed")
- finally:
- fobj.close()
def test_fileobj_readlines(self):
self.tar.extract("ustar/regtype", TEMPDIR)
@@ -65,8 +67,7 @@ class UstarReadTest(ReadTest):
with open(os.path.join(TEMPDIR, "ustar/regtype"), "r") as fobj1:
lines1 = fobj1.readlines()
- fobj = self.tar.extractfile(tarinfo)
- try:
+ with self.tar.extractfile(tarinfo) as fobj:
fobj2 = io.TextIOWrapper(fobj)
lines2 = fobj2.readlines()
self.assertTrue(lines1 == lines2,
@@ -76,21 +77,16 @@ class UstarReadTest(ReadTest):
self.assertTrue(lines2[83] ==
"I will gladly admit that Python is not the fastest running scripting language.\n",
"fileobj.readlines() failed")
- finally:
- fobj.close()
def test_fileobj_iter(self):
self.tar.extract("ustar/regtype", TEMPDIR)
tarinfo = self.tar.getmember("ustar/regtype")
- with open(os.path.join(TEMPDIR, "ustar/regtype"), "rU") as fobj1:
+ with open(os.path.join(TEMPDIR, "ustar/regtype"), "r") as fobj1:
lines1 = fobj1.readlines()
- fobj2 = self.tar.extractfile(tarinfo)
- try:
+ with self.tar.extractfile(tarinfo) as fobj2:
lines2 = list(io.TextIOWrapper(fobj2))
self.assertTrue(lines1 == lines2,
"fileobj.__iter__() failed")
- finally:
- fobj2.close()
def test_fileobj_seek(self):
self.tar.extract("ustar/regtype", TEMPDIR)
@@ -142,17 +138,24 @@ class UstarReadTest(ReadTest):
"read() after readline() failed")
fobj.close()
+ def test_fileobj_text(self):
+ with self.tar.extractfile("ustar/regtype") as fobj:
+ fobj = io.TextIOWrapper(fobj)
+ data = fobj.read().encode("iso8859-1")
+ self.assertEqual(md5sum(data), md5_regtype)
+ try:
+ fobj.seek(100)
+ except AttributeError:
+ # Issue #13815: seek() complained about a missing
+ # flush() method.
+ self.fail("seeking failed in text mode")
+
# Test if symbolic and hard links are resolved by extractfile(). The
# test link members each point to a regular member whose data is
# supposed to be exported.
def _test_fileobj_link(self, lnktype, regtype):
- a = self.tar.extractfile(lnktype)
- b = self.tar.extractfile(regtype)
- try:
+ with self.tar.extractfile(lnktype) as a, self.tar.extractfile(regtype) as b:
self.assertEqual(a.name, b.name)
- finally:
- a.close()
- b.close()
def test_fileobj_link1(self):
self._test_fileobj_link("ustar/lnktype", "ustar/regtype")
@@ -204,13 +207,15 @@ class CommonReadTest(ReadTest):
_open = gzip.GzipFile
elif self.mode.endswith(":bz2"):
_open = bz2.BZ2File
+ elif self.mode.endswith(":xz"):
+ _open = lzma.LZMAFile
else:
- _open = open
+ _open = io.FileIO
for char in (b'\0', b'a'):
# Test if EOFHeaderError ('\0') and InvalidHeaderError ('a')
# are ignored correctly.
- with _open(tmpname, "wb") as fobj:
+ with _open(tmpname, "w") as fobj:
fobj.write(char * 1024)
fobj.write(tarfile.TarInfo("foo").tobuf())
@@ -225,6 +230,10 @@ class CommonReadTest(ReadTest):
class MiscReadTest(CommonReadTest):
def test_no_name_argument(self):
+ if self.mode.endswith(("bz2", "xz")):
+ # BZ2File and LZMAFile have no name attribute.
+ self.skipTest("no name attribute")
+
with open(self.tarname, "rb") as fobj:
tar = tarfile.open(fileobj=fobj, mode=self.mode)
self.assertEqual(tar.name, os.path.abspath(fobj.name))
@@ -254,9 +263,8 @@ class MiscReadTest(CommonReadTest):
t = tar.next()
name = t.name
offset = t.offset
- f = tar.extractfile(t)
- data = f.read()
- f.close()
+ with tar.extractfile(t) as f:
+ data = f.read()
finally:
tar.close()
@@ -265,10 +273,12 @@ class MiscReadTest(CommonReadTest):
_open = gzip.GzipFile
elif self.mode.endswith(":bz2"):
_open = bz2.BZ2File
+ elif self.mode.endswith(":xz"):
+ _open = lzma.LZMAFile
else:
- _open = open
- fobj = _open(self.tarname, "rb")
- try:
+ _open = io.FileIO
+
+ with _open(self.tarname) as fobj:
fobj.seek(offset)
# Test if the tarfile starts with the second member.
@@ -281,8 +291,6 @@ class MiscReadTest(CommonReadTest):
self.assertEqual(tar.extractfile(t).read(), data,
"seek back did not work")
tar.close()
- finally:
- fobj.close()
def test_fail_comp(self):
# For Gzip and Bz2 Tests: fail with a ReadError on an uncompressed file.
@@ -428,27 +436,26 @@ class StreamReadTest(CommonReadTest):
for tarinfo in self.tar:
if not tarinfo.isreg():
continue
- fobj = self.tar.extractfile(tarinfo)
- while True:
- try:
- buf = fobj.read(512)
- except tarfile.StreamError:
- self.fail("simple read-through using TarFile.extractfile() failed")
- if not buf:
- break
- fobj.close()
+ with self.tar.extractfile(tarinfo) as fobj:
+ while True:
+ try:
+ buf = fobj.read(512)
+ except tarfile.StreamError:
+ self.fail("simple read-through using TarFile.extractfile() failed")
+ if not buf:
+ break
def test_fileobj_regular_file(self):
tarinfo = self.tar.next() # get "regtype" (can't use getmember)
- fobj = self.tar.extractfile(tarinfo)
- data = fobj.read()
+ with self.tar.extractfile(tarinfo) as fobj:
+ data = fobj.read()
self.assertTrue((len(data), md5sum(data)) == (tarinfo.size, md5_regtype),
"regular file extraction failed")
def test_provoke_stream_error(self):
tarinfos = self.tar.getmembers()
- f = self.tar.extractfile(tarinfos[0]) # read the first member
- self.assertRaises(tarfile.StreamError, f.read)
+ with self.tar.extractfile(tarinfos[0]) as f: # read the first member
+ self.assertRaises(tarfile.StreamError, f.read)
def test_compare_members(self):
tar1 = tarfile.open(tarname, encoding="iso8859-1")
@@ -526,6 +533,18 @@ class DetectReadTest(unittest.TestCase):
testfunc(bz2name, "r|*")
testfunc(bz2name, "r|bz2")
+ if lzma:
+ self.assertRaises(tarfile.ReadError, tarfile.open, tarname, mode="r:xz")
+ self.assertRaises(tarfile.ReadError, tarfile.open, tarname, mode="r|xz")
+ self.assertRaises(tarfile.ReadError, tarfile.open, xzname, mode="r:")
+ self.assertRaises(tarfile.ReadError, tarfile.open, xzname, mode="r|")
+
+ testfunc(xzname, "r")
+ testfunc(xzname, "r:*")
+ testfunc(xzname, "r:xz")
+ testfunc(xzname, "r|*")
+ testfunc(xzname, "r|xz")
+
def test_detect_file(self):
self._test_modes(self._testfunc_file)
@@ -723,7 +742,7 @@ class GNUReadTest(LongnameTest):
# Return True if the platform knows the st_blocks stat attribute and
# uses st_blocks units of 512 bytes, and if the filesystem is able to
# store holes in files.
- if sys.platform == "linux2":
+ if sys.platform.startswith("linux"):
# Linux evidentially has 512 byte st_blocks units.
name = os.path.join(TEMPDIR, "sparse-test")
with open(name, "wb") as fobj:
@@ -913,7 +932,7 @@ class WriteTest(WriteTestBase):
try:
for name in ("foo", "bar", "baz"):
name = os.path.join(tempdir, name)
- open(name, "wb").close()
+ support.create_empty_file(name)
exclude = os.path.isfile
@@ -940,7 +959,7 @@ class WriteTest(WriteTestBase):
try:
for name in ("foo", "bar", "baz"):
name = os.path.join(tempdir, name)
- open(name, "wb").close()
+ support.create_empty_file(name)
def filter(tarinfo):
if os.path.basename(tarinfo.name) == "bar":
@@ -979,7 +998,7 @@ class WriteTest(WriteTestBase):
# and compare the stored name with the original.
foo = os.path.join(TEMPDIR, "foo")
if not dir:
- open(foo, "w").close()
+ support.create_empty_file(foo)
else:
os.mkdir(foo)
@@ -1096,6 +1115,9 @@ class StreamWriteTest(WriteTestBase):
data = dec.decompress(data)
self.assertTrue(len(dec.unused_data) == 0,
"found trailing data")
+ elif self.mode.endswith("xz"):
+ with lzma.LZMAFile(tmpname) as fobj:
+ data = fobj.read()
else:
with open(tmpname, "rb") as fobj:
data = fobj.read()
@@ -1339,7 +1361,7 @@ class UstarUnicodeTest(unittest.TestCase):
self._test_unicode_filename("utf7")
def test_utf8_filename(self):
- self._test_unicode_filename("utf8")
+ self._test_unicode_filename("utf-8")
def _test_unicode_filename(self, encoding):
tar = tarfile.open(tmpname, "w", format=self.format, encoding=encoding, errors="strict")
@@ -1418,7 +1440,7 @@ class GNUUnicodeTest(UstarUnicodeTest):
def test_bad_pax_header(self):
# Test for issue #8633. GNU tar <= 1.23 creates raw binary fields
# without a hdrcharset=BINARY header.
- for encoding, name in (("utf8", "pax/bad-pax-\udce4\udcf6\udcfc"),
+ for encoding, name in (("utf-8", "pax/bad-pax-\udce4\udcf6\udcfc"),
("iso8859-1", "pax/bad-pax-\xe4\xf6\xfc"),):
with tarfile.open(tarname, encoding=encoding, errors="surrogateescape") as tar:
try:
@@ -1433,7 +1455,7 @@ class PAXUnicodeTest(UstarUnicodeTest):
def test_binary_header(self):
# Test a POSIX.1-2008 compatible header with a hdrcharset=BINARY field.
- for encoding, name in (("utf8", "pax/hdrcharset-\udce4\udcf6\udcfc"),
+ for encoding, name in (("utf-8", "pax/hdrcharset-\udce4\udcf6\udcfc"),
("iso8859-1", "pax/hdrcharset-\xe4\xf6\xfc"),):
with tarfile.open(tarname, encoding=encoding, errors="surrogateescape") as tar:
try:
@@ -1458,12 +1480,9 @@ class AppendTest(unittest.TestCase):
with tarfile.open(tarname, encoding="iso8859-1") as src:
t = src.getmember("ustar/regtype")
t.name = "foo"
- f = src.extractfile(t)
- try:
+ with src.extractfile(t) as f:
with tarfile.open(self.tarname, mode) as tar:
tar.addfile(t, f)
- finally:
- f.close()
def _test(self, names=["bar"], fileobj=None):
with tarfile.open(self.tarname, fileobj=fileobj) as tar:
@@ -1510,6 +1529,12 @@ class AppendTest(unittest.TestCase):
self._create_testtar("w:bz2")
self.assertRaises(tarfile.ReadError, tarfile.open, tmpname, "a")
+ def test_append_lzma(self):
+ if lzma is None:
+ self.skipTest("lzma module not available")
+ self._create_testtar("w:xz")
+ self.assertRaises(tarfile.ReadError, tarfile.open, tmpname, "a")
+
# Append mode is supposed to fail if the tarfile to append to
# does not end with a zero block.
def _test_error(self, data):
@@ -1788,6 +1813,21 @@ class Bz2PartialReadTest(unittest.TestCase):
self._test_partial_input("r:bz2")
+class LzmaMiscReadTest(MiscReadTest):
+ tarname = xzname
+ mode = "r:xz"
+class LzmaUstarReadTest(UstarReadTest):
+ tarname = xzname
+ mode = "r:xz"
+class LzmaStreamReadTest(StreamReadTest):
+ tarname = xzname
+ mode = "r|xz"
+class LzmaWriteTest(WriteTest):
+ mode = "w:xz"
+class LzmaStreamWriteTest(StreamWriteTest):
+ mode = "w|xz"
+
+
def test_main():
support.unlink(TEMPDIR)
os.makedirs(TEMPDIR)
@@ -1850,6 +1890,20 @@ def test_main():
Bz2PartialReadTest,
]
+ if lzma:
+ # Create testtar.tar.xz and add lzma-specific tests.
+ support.unlink(xzname)
+ with lzma.LZMAFile(xzname, "w") as tar:
+ tar.write(data)
+
+ tests += [
+ LzmaMiscReadTest,
+ LzmaUstarReadTest,
+ LzmaStreamReadTest,
+ LzmaWriteTest,
+ LzmaStreamWriteTest,
+ ]
+
try:
support.run_unittest(*tests)
finally:
diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py
index 95eebf3..11e95e7 100644
--- a/Lib/test/test_telnetlib.py
+++ b/Lib/test/test_telnetlib.py
@@ -36,6 +36,7 @@ class GeneralTests(TestCase):
def tearDown(self):
self.thread.join()
+ del self.thread # Clear out any dangling Thread objects.
def testBasic(self):
# connects
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 50cf3b4..d79f319 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -21,7 +21,7 @@ has_spawnl = hasattr(os, 'spawnl')
# TEST_FILES may need to be tweaked for systems depending on the maximum
# number of files that can be opened at one time (see ulimit -n)
-if sys.platform in ('openbsd3', 'openbsd4'):
+if sys.platform.startswith('openbsd'):
TEST_FILES = 48
else:
TEST_FILES = 100
@@ -31,7 +31,7 @@ else:
# threads is not done here.
# Common functionality.
-class TC(unittest.TestCase):
+class BaseTestCase(unittest.TestCase):
str_check = re.compile(r"[a-zA-Z0-9_-]{6}$")
@@ -45,11 +45,6 @@ class TC(unittest.TestCase):
self._warnings_manager.__exit__(None, None, None)
- def failOnException(self, what, ei=None):
- if ei is None:
- ei = sys.exc_info()
- self.fail("%s raised %s: %s" % (what, ei[0], ei[1]))
-
def nameCheck(self, name, dir, pre, suf):
(ndir, nbase) = os.path.split(name)
npre = nbase[:len(pre)]
@@ -68,9 +63,8 @@ class TC(unittest.TestCase):
"random string '%s' does not match /^[a-zA-Z0-9_-]{6}$/"
% nbase)
-test_classes = []
-class test_exports(TC):
+class TestExports(BaseTestCase):
def test_exports(self):
# There are no surprising symbols in the tempfile module
dict = tempfile.__dict__
@@ -97,10 +91,8 @@ class test_exports(TC):
self.assertTrue(len(unexp) == 0,
"unexpected keys: %s" % unexp)
-test_classes.append(test_exports)
-
-class test__RandomNameSequence(TC):
+class TestRandomNameSequence(BaseTestCase):
"""Test the internal iterator object _RandomNameSequence."""
def setUp(self):
@@ -128,13 +120,10 @@ class test__RandomNameSequence(TC):
i = 0
r = self.r
- try:
- for s in r:
- i += 1
- if i == 20:
- break
- except:
- self.failOnException("iteration")
+ for s in r:
+ i += 1
+ if i == 20:
+ break
@unittest.skipUnless(hasattr(os, 'fork'),
"os.fork is required for this test")
@@ -167,10 +156,8 @@ class test__RandomNameSequence(TC):
self.assertNotEqual(child_value, parent_value)
-test_classes.append(test__RandomNameSequence)
-
-class test__candidate_tempdir_list(TC):
+class TestCandidateTempdirList(BaseTestCase):
"""Test the internal function _candidate_tempdir_list."""
def test_nonempty_list(self):
@@ -209,13 +196,11 @@ class test__candidate_tempdir_list(TC):
# Not practical to try to verify the presence of OS-specific
# paths in this list.
-test_classes.append(test__candidate_tempdir_list)
-
# We test _get_default_tempdir by testing gettempdir.
-class test__get_candidate_names(TC):
+class TestGetCandidateNames(BaseTestCase):
"""Test the internal function _get_candidate_names."""
def test_retval(self):
@@ -230,10 +215,8 @@ class test__get_candidate_names(TC):
self.assertTrue(a is b)
-test_classes.append(test__get_candidate_names)
-
-class test__mkstemp_inner(TC):
+class TestMkstempInner(BaseTestCase):
"""Test the internal function _mkstemp_inner."""
class mkstemped:
@@ -258,10 +241,7 @@ class test__mkstemp_inner(TC):
def do_create(self, dir=None, pre="", suf="", bin=1):
if dir is None:
dir = tempfile.gettempdir()
- try:
- file = self.mkstemped(dir, pre, suf, bin)
- except:
- self.failOnException("_mkstemp_inner")
+ file = self.mkstemped(dir, pre, suf, bin)
self.nameCheck(file.name, dir, pre, suf)
return file
@@ -353,10 +333,8 @@ class test__mkstemp_inner(TC):
os.lseek(f.fd, 0, os.SEEK_SET)
self.assertEqual(os.read(f.fd, 20), b"blat")
-test_classes.append(test__mkstemp_inner)
-
-class test_gettempprefix(TC):
+class TestGetTempPrefix(BaseTestCase):
"""Test gettempprefix()."""
def test_sane_template(self):
@@ -376,19 +354,14 @@ class test_gettempprefix(TC):
d = tempfile.mkdtemp(prefix="")
try:
p = os.path.join(d, p)
- try:
- fd = os.open(p, os.O_RDWR | os.O_CREAT)
- except:
- self.failOnException("os.open")
+ fd = os.open(p, os.O_RDWR | os.O_CREAT)
os.close(fd)
os.unlink(p)
finally:
os.rmdir(d)
-test_classes.append(test_gettempprefix)
-
-class test_gettempdir(TC):
+class TestGetTempDir(BaseTestCase):
"""Test gettempdir()."""
def test_directory_exists(self):
@@ -406,12 +379,9 @@ class test_gettempdir(TC):
# sneaky: just instantiate a NamedTemporaryFile, which
# defaults to writing into the directory returned by
# gettempdir.
- try:
- file = tempfile.NamedTemporaryFile()
- file.write(b"blat")
- file.close()
- except:
- self.failOnException("create file in %s" % tempfile.gettempdir())
+ file = tempfile.NamedTemporaryFile()
+ file.write(b"blat")
+ file.close()
def test_same_thing(self):
# gettempdir always returns the same object
@@ -420,23 +390,18 @@ class test_gettempdir(TC):
self.assertTrue(a is b)
-test_classes.append(test_gettempdir)
-
-class test_mkstemp(TC):
+class TestMkstemp(BaseTestCase):
"""Test mkstemp()."""
def do_create(self, dir=None, pre="", suf=""):
if dir is None:
dir = tempfile.gettempdir()
- try:
- (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
- (ndir, nbase) = os.path.split(name)
- adir = os.path.abspath(dir)
- self.assertEqual(adir, ndir,
- "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
- except:
- self.failOnException("mkstemp")
+ (fd, name) = tempfile.mkstemp(dir=dir, prefix=pre, suffix=suf)
+ (ndir, nbase) = os.path.split(name)
+ adir = os.path.abspath(dir)
+ self.assertEqual(adir, ndir,
+ "Directory '%s' incorrectly returned as '%s'" % (adir, ndir))
try:
self.nameCheck(name, dir, pre, suf)
@@ -461,19 +426,14 @@ class test_mkstemp(TC):
finally:
os.rmdir(dir)
-test_classes.append(test_mkstemp)
-
-class test_mkdtemp(TC):
+class TestMkdtemp(BaseTestCase):
"""Test mkdtemp()."""
def do_create(self, dir=None, pre="", suf=""):
if dir is None:
dir = tempfile.gettempdir()
- try:
- name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("mkdtemp")
+ name = tempfile.mkdtemp(dir=dir, prefix=pre, suffix=suf)
try:
self.nameCheck(name, dir, pre, suf)
@@ -528,10 +488,8 @@ class test_mkdtemp(TC):
finally:
os.rmdir(dir)
-test_classes.append(test_mkdtemp)
-
-class test_mktemp(TC):
+class TestMktemp(BaseTestCase):
"""Test mktemp()."""
# For safety, all use of mktemp must occur in a private directory.
@@ -560,10 +518,7 @@ class test_mktemp(TC):
self._unlink(self.name)
def do_create(self, pre="", suf=""):
- try:
- file = self.mktemped(self.dir, pre, suf)
- except:
- self.failOnException("mktemp")
+ file = self.mktemped(self.dir, pre, suf)
self.nameCheck(file.name, self.dir, pre, suf)
return file
@@ -590,23 +545,18 @@ class test_mktemp(TC):
## self.assertRaises(RuntimeWarning,
## tempfile.mktemp, dir=self.dir)
-test_classes.append(test_mktemp)
-
# We test _TemporaryFileWrapper by testing NamedTemporaryFile.
-class test_NamedTemporaryFile(TC):
+class TestNamedTemporaryFile(BaseTestCase):
"""Test NamedTemporaryFile()."""
def do_create(self, dir=None, pre="", suf="", delete=True):
if dir is None:
dir = tempfile.gettempdir()
- try:
- file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
- delete=delete)
- except:
- self.failOnException("NamedTemporaryFile")
+ file = tempfile.NamedTemporaryFile(dir=dir, prefix=pre, suffix=suf,
+ delete=delete)
self.nameCheck(file.name, dir, pre, suf)
return file
@@ -659,11 +609,8 @@ class test_NamedTemporaryFile(TC):
f = tempfile.NamedTemporaryFile()
f.write(b'abc\n')
f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
+ f.close()
+ f.close()
def test_context_manager(self):
# A NamedTemporaryFile can be used as a context manager
@@ -677,18 +624,14 @@ class test_NamedTemporaryFile(TC):
# How to test the mode and bufsize parameters?
-test_classes.append(test_NamedTemporaryFile)
-class test_SpooledTemporaryFile(TC):
+class TestSpooledTemporaryFile(BaseTestCase):
"""Test SpooledTemporaryFile()."""
def do_create(self, max_size=0, dir=None, pre="", suf=""):
if dir is None:
dir = tempfile.gettempdir()
- try:
- file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("SpooledTemporaryFile")
+ file = tempfile.SpooledTemporaryFile(max_size=max_size, dir=dir, prefix=pre, suffix=suf)
return file
@@ -776,11 +719,8 @@ class test_SpooledTemporaryFile(TC):
f.write(b'abc\n')
self.assertFalse(f._rolled)
f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
+ f.close()
+ f.close()
def test_multiple_close_after_rollover(self):
# A SpooledTemporaryFile can be closed many times without error
@@ -788,11 +728,8 @@ class test_SpooledTemporaryFile(TC):
f.write(b'abc\n')
self.assertTrue(f._rolled)
f.close()
- try:
- f.close()
- f.close()
- except:
- self.failOnException("close")
+ f.close()
+ f.close()
def test_bound_methods(self):
# It should be OK to steal a bound method from a SpooledTemporaryFile
@@ -878,66 +815,76 @@ class test_SpooledTemporaryFile(TC):
pass
self.assertRaises(ValueError, use_closed)
+ def test_truncate_with_size_parameter(self):
+ # A SpooledTemporaryFile can be truncated to zero size
+ f = tempfile.SpooledTemporaryFile(max_size=10)
+ f.write(b'abcdefg\n')
+ f.seek(0)
+ f.truncate()
+ self.assertFalse(f._rolled)
+ self.assertEqual(f._file.getvalue(), b'')
+ # A SpooledTemporaryFile can be truncated to a specific size
+ f = tempfile.SpooledTemporaryFile(max_size=10)
+ f.write(b'abcdefg\n')
+ f.truncate(4)
+ self.assertFalse(f._rolled)
+ self.assertEqual(f._file.getvalue(), b'abcd')
+ # A SpooledTemporaryFile rolls over if truncated to large size
+ f = tempfile.SpooledTemporaryFile(max_size=10)
+ f.write(b'abcdefg\n')
+ f.truncate(20)
+ self.assertTrue(f._rolled)
+ if has_stat:
+ self.assertEqual(os.fstat(f.fileno()).st_size, 20)
-test_classes.append(test_SpooledTemporaryFile)
+if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
-class test_TemporaryFile(TC):
- """Test TemporaryFile()."""
+ class TestTemporaryFile(BaseTestCase):
+ """Test TemporaryFile()."""
- def test_basic(self):
- # TemporaryFile can create files
- # No point in testing the name params - the file has no name.
- try:
+ def test_basic(self):
+ # TemporaryFile can create files
+ # No point in testing the name params - the file has no name.
tempfile.TemporaryFile()
- except:
- self.failOnException("TemporaryFile")
- def test_has_no_name(self):
- # TemporaryFile creates files with no names (on this system)
- dir = tempfile.mkdtemp()
- f = tempfile.TemporaryFile(dir=dir)
- f.write(b'blat')
+ def test_has_no_name(self):
+ # TemporaryFile creates files with no names (on this system)
+ dir = tempfile.mkdtemp()
+ f = tempfile.TemporaryFile(dir=dir)
+ f.write(b'blat')
- # Sneaky: because this file has no name, it should not prevent
- # us from removing the directory it was created in.
- try:
- os.rmdir(dir)
- except:
- ei = sys.exc_info()
- # cleanup
+ # Sneaky: because this file has no name, it should not prevent
+ # us from removing the directory it was created in.
+ try:
+ os.rmdir(dir)
+ except:
+ # cleanup
+ f.close()
+ os.rmdir(dir)
+ raise
+
+ def test_multiple_close(self):
+ # A TemporaryFile can be closed many times without error
+ f = tempfile.TemporaryFile()
+ f.write(b'abc\n')
f.close()
- os.rmdir(dir)
- self.failOnException("rmdir", ei)
-
- def test_multiple_close(self):
- # A TemporaryFile can be closed many times without error
- f = tempfile.TemporaryFile()
- f.write(b'abc\n')
- f.close()
- try:
f.close()
f.close()
- except:
- self.failOnException("close")
- # How to test the mode and bufsize parameters?
- def test_mode_and_encoding(self):
+ # How to test the mode and bufsize parameters?
+ def test_mode_and_encoding(self):
- def roundtrip(input, *args, **kwargs):
- with tempfile.TemporaryFile(*args, **kwargs) as fileobj:
- fileobj.write(input)
- fileobj.seek(0)
- self.assertEqual(input, fileobj.read())
+ def roundtrip(input, *args, **kwargs):
+ with tempfile.TemporaryFile(*args, **kwargs) as fileobj:
+ fileobj.write(input)
+ fileobj.seek(0)
+ self.assertEqual(input, fileobj.read())
- roundtrip(b"1234", "w+b")
- roundtrip("abdc\n", "w+")
- roundtrip("\u039B", "w+", encoding="utf-16")
- roundtrip("foo\r\n", "w+", newline="")
-
-
-if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
- test_classes.append(test_TemporaryFile)
+ roundtrip(b"1234", "w+b")
+ roundtrip("abdc\n", "w+")
+ roundtrip("\u039B", "w+", encoding="utf-16")
+ roundtrip("foo\r\n", "w+", newline="")
# Helper for test_del_on_shutdown
@@ -956,16 +903,13 @@ class NulledModules:
d.clear()
d.update(c)
-class test_TemporaryDirectory(TC):
+class TestTemporaryDirectory(BaseTestCase):
"""Test TemporaryDirectory()."""
def do_create(self, dir=None, pre="", suf="", recurse=1):
if dir is None:
dir = tempfile.gettempdir()
- try:
- tmp = tempfile.TemporaryDirectory(dir=dir, prefix=pre, suffix=suf)
- except:
- self.failOnException("TemporaryDirectory")
+ tmp = tempfile.TemporaryDirectory(dir=dir, prefix=pre, suffix=suf)
self.nameCheck(tmp.name, dir, pre, suf)
# Create a subdirectory and some files
if recurse:
@@ -1089,11 +1033,8 @@ class test_TemporaryDirectory(TC):
# Can be cleaned-up many times without error
d = self.do_create()
d.cleanup()
- try:
- d.cleanup()
- d.cleanup()
- except:
- self.failOnException("cleanup")
+ d.cleanup()
+ d.cleanup()
def test_context_manager(self):
# Can be used as a context manager
@@ -1104,10 +1045,8 @@ class test_TemporaryDirectory(TC):
self.assertFalse(os.path.exists(name))
-test_classes.append(test_TemporaryDirectory)
-
def test_main():
- support.run_unittest(*test_classes)
+ support.run_unittest(__name__)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py
index 3901120..c86f5cf 100644
--- a/Lib/test/test_textwrap.py
+++ b/Lib/test/test_textwrap.py
@@ -11,7 +11,7 @@
import unittest
from test import support
-from textwrap import TextWrapper, wrap, fill, dedent
+from textwrap import TextWrapper, wrap, fill, dedent, indent
class BaseTestCase(unittest.TestCase):
@@ -100,6 +100,14 @@ What a mess!
result = wrapper.fill(text)
self.check(result, '\n'.join(expect))
+ text = "\tTest\tdefault\t\ttabsize."
+ expect = [" Test default tabsize."]
+ self.check_wrap(text, 80, expect)
+
+ text = "\tTest\tcustom\t\ttabsize."
+ expect = [" Test custom tabsize."]
+ self.check_wrap(text, 80, expect, tabsize=4)
+
def test_fix_sentence_endings(self):
wrapper = TextWrapper(60, fix_sentence_endings=True)
@@ -634,11 +642,147 @@ def foo():
self.assertEqual(expect, dedent(text))
+# Test textwrap.indent
+class IndentTestCase(unittest.TestCase):
+ # The examples used for tests. If any of these change, the expected
+ # results in the various test cases must also be updated.
+ # The roundtrip cases are separate, because textwrap.dedent doesn't
+ # handle Windows line endings
+ ROUNDTRIP_CASES = (
+ # Basic test case
+ "Hi.\nThis is a test.\nTesting.",
+ # Include a blank line
+ "Hi.\nThis is a test.\n\nTesting.",
+ # Include leading and trailing blank lines
+ "\nHi.\nThis is a test.\nTesting.\n",
+ )
+ CASES = ROUNDTRIP_CASES + (
+ # Use Windows line endings
+ "Hi.\r\nThis is a test.\r\nTesting.\r\n",
+ # Pathological case
+ "\nHi.\r\nThis is a test.\n\r\nTesting.\r\n\n",
+ )
+
+ def test_indent_nomargin_default(self):
+ # indent should do nothing if 'prefix' is empty.
+ for text in self.CASES:
+ self.assertEqual(indent(text, ''), text)
+
+ def test_indent_nomargin_explicit_default(self):
+ # The same as test_indent_nomargin, but explicitly requesting
+ # the default behaviour by passing None as the predicate
+ for text in self.CASES:
+ self.assertEqual(indent(text, '', None), text)
+
+ def test_indent_nomargin_all_lines(self):
+ # The same as test_indent_nomargin, but using the optional
+ # predicate argument
+ predicate = lambda line: True
+ for text in self.CASES:
+ self.assertEqual(indent(text, '', predicate), text)
+
+ def test_indent_no_lines(self):
+ # Explicitly skip indenting any lines
+ predicate = lambda line: False
+ for text in self.CASES:
+ self.assertEqual(indent(text, ' ', predicate), text)
+
+ def test_roundtrip_spaces(self):
+ # A whitespace prefix should roundtrip with dedent
+ for text in self.ROUNDTRIP_CASES:
+ self.assertEqual(dedent(indent(text, ' ')), text)
+
+ def test_roundtrip_tabs(self):
+ # A whitespace prefix should roundtrip with dedent
+ for text in self.ROUNDTRIP_CASES:
+ self.assertEqual(dedent(indent(text, '\t\t')), text)
+
+ def test_roundtrip_mixed(self):
+ # A whitespace prefix should roundtrip with dedent
+ for text in self.ROUNDTRIP_CASES:
+ self.assertEqual(dedent(indent(text, ' \t \t ')), text)
+
+ def test_indent_default(self):
+ # Test default indenting of lines that are not whitespace only
+ prefix = ' '
+ expected = (
+ # Basic test case
+ " Hi.\n This is a test.\n Testing.",
+ # Include a blank line
+ " Hi.\n This is a test.\n\n Testing.",
+ # Include leading and trailing blank lines
+ "\n Hi.\n This is a test.\n Testing.\n",
+ # Use Windows line endings
+ " Hi.\r\n This is a test.\r\n Testing.\r\n",
+ # Pathological case
+ "\n Hi.\r\n This is a test.\n\r\n Testing.\r\n\n",
+ )
+ for text, expect in zip(self.CASES, expected):
+ self.assertEqual(indent(text, prefix), expect)
+
+ def test_indent_explicit_default(self):
+ # Test default indenting of lines that are not whitespace only
+ prefix = ' '
+ expected = (
+ # Basic test case
+ " Hi.\n This is a test.\n Testing.",
+ # Include a blank line
+ " Hi.\n This is a test.\n\n Testing.",
+ # Include leading and trailing blank lines
+ "\n Hi.\n This is a test.\n Testing.\n",
+ # Use Windows line endings
+ " Hi.\r\n This is a test.\r\n Testing.\r\n",
+ # Pathological case
+ "\n Hi.\r\n This is a test.\n\r\n Testing.\r\n\n",
+ )
+ for text, expect in zip(self.CASES, expected):
+ self.assertEqual(indent(text, prefix, None), expect)
+
+ def test_indent_all_lines(self):
+ # Add 'prefix' to all lines, including whitespace-only ones.
+ prefix = ' '
+ expected = (
+ # Basic test case
+ " Hi.\n This is a test.\n Testing.",
+ # Include a blank line
+ " Hi.\n This is a test.\n \n Testing.",
+ # Include leading and trailing blank lines
+ " \n Hi.\n This is a test.\n Testing.\n",
+ # Use Windows line endings
+ " Hi.\r\n This is a test.\r\n Testing.\r\n",
+ # Pathological case
+ " \n Hi.\r\n This is a test.\n \r\n Testing.\r\n \n",
+ )
+ predicate = lambda line: True
+ for text, expect in zip(self.CASES, expected):
+ self.assertEqual(indent(text, prefix, predicate), expect)
+
+ def test_indent_empty_lines(self):
+ # Add 'prefix' solely to whitespace-only lines.
+ prefix = ' '
+ expected = (
+ # Basic test case
+ "Hi.\nThis is a test.\nTesting.",
+ # Include a blank line
+ "Hi.\nThis is a test.\n \nTesting.",
+ # Include leading and trailing blank lines
+ " \nHi.\nThis is a test.\nTesting.\n",
+ # Use Windows line endings
+ "Hi.\r\nThis is a test.\r\nTesting.\r\n",
+ # Pathological case
+ " \nHi.\r\nThis is a test.\n \r\nTesting.\r\n \n",
+ )
+ predicate = lambda line: not line.strip()
+ for text, expect in zip(self.CASES, expected):
+ self.assertEqual(indent(text, prefix, predicate), expect)
+
+
def test_main():
support.run_unittest(WrapTestCase,
LongWordTestCase,
IndentTestCases,
- DedentTestCase)
+ DedentTestCase,
+ IndentTestCase)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py
index 7791935..0528b13 100644
--- a/Lib/test/test_threaded_import.py
+++ b/Lib/test/test_threaded_import.py
@@ -11,8 +11,8 @@ import sys
import time
import shutil
import unittest
-from test.support import verbose, import_module, run_unittest, TESTFN
-thread = import_module('_thread')
+from test.support import (
+ verbose, import_module, run_unittest, TESTFN, reap_threads, forget, unlink)
threading = import_module('threading')
def task(N, done, done_tasks, errors):
@@ -30,7 +30,7 @@ def task(N, done, done_tasks, errors):
except Exception as e:
errors.append(e.with_traceback(None))
finally:
- done_tasks.append(thread.get_ident())
+ done_tasks.append(threading.get_ident())
finished = len(done_tasks) == N
if finished:
done.set()
@@ -62,7 +62,7 @@ class Finder:
def __init__(self):
self.numcalls = 0
self.x = 0
- self.lock = thread.allocate_lock()
+ self.lock = threading.Lock()
def find_module(self, name, path=None):
# Simulate some thread-unsafe behaviour. If calls to find_module()
@@ -113,7 +113,9 @@ class ThreadedImportTests(unittest.TestCase):
done_tasks = []
done.clear()
for i in range(N):
- thread.start_new_thread(task, (N, done, done_tasks, errors,))
+ t = threading.Thread(target=task,
+ args=(N, done, done_tasks, errors,))
+ t.start()
done.wait(60)
self.assertFalse(errors)
if verbose:
@@ -124,7 +126,7 @@ class ThreadedImportTests(unittest.TestCase):
def test_parallel_meta_path(self):
finder = Finder()
- sys.meta_path.append(finder)
+ sys.meta_path.insert(0, finder)
try:
self.check_parallel_module_init()
self.assertGreater(finder.numcalls, 0)
@@ -143,7 +145,7 @@ class ThreadedImportTests(unittest.TestCase):
def path_hook(path):
finder.find_module('')
raise ImportError
- sys.path_hooks.append(path_hook)
+ sys.path_hooks.insert(0, path_hook)
sys.meta_path.append(flushing_finder)
try:
# Flush the cache a first time
@@ -185,7 +187,7 @@ class ThreadedImportTests(unittest.TestCase):
contents = contents % {'delay': delay}
with open(os.path.join(TESTFN, name + ".py"), "wb") as f:
f.write(contents.encode('utf-8'))
- self.addCleanup(sys.modules.pop, name, None)
+ self.addCleanup(forget, name)
results = []
def import_ab():
@@ -202,9 +204,37 @@ class ThreadedImportTests(unittest.TestCase):
t2.join()
self.assertEqual(set(results), {'a', 'b'})
-
+ def test_side_effect_import(self):
+ code = """if 1:
+ import threading
+ def target():
+ import random
+ t = threading.Thread(target=target)
+ t.start()
+ t.join()"""
+ sys.path.insert(0, os.curdir)
+ self.addCleanup(sys.path.remove, os.curdir)
+ filename = TESTFN + ".py"
+ with open(filename, "wb") as f:
+ f.write(code.encode('utf-8'))
+ self.addCleanup(unlink, filename)
+ self.addCleanup(forget, TESTFN)
+ __import__(TESTFN)
+
+
+@reap_threads
def test_main():
- run_unittest(ThreadedImportTests)
+ old_switchinterval = None
+ try:
+ old_switchinterval = sys.getswitchinterval()
+ sys.setswitchinterval(1e-5)
+ except AttributeError:
+ pass
+ try:
+ run_unittest(ThreadedImportTests)
+ finally:
+ if old_switchinterval is not None:
+ sys.setswitchinterval(old_switchinterval)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 17be84b..bb8d9b6 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -175,7 +175,7 @@ class ThreadTests(BaseTestCase):
exception = ctypes.py_object(AsyncExc)
# First check it works when setting the exception from the same thread.
- tid = _thread.get_ident()
+ tid = threading.get_ident()
try:
result = set_async_exc(ctypes.c_long(tid), exception)
@@ -204,7 +204,7 @@ class ThreadTests(BaseTestCase):
class Worker(threading.Thread):
def run(self):
- self.id = _thread.get_ident()
+ self.id = threading.get_ident()
self.finished = False
try:
@@ -409,6 +409,14 @@ class ThreadTests(BaseTestCase):
t.daemon = True
self.assertTrue('daemon' in repr(t))
+ def test_deamon_param(self):
+ t = threading.Thread()
+ self.assertFalse(t.daemon)
+ t = threading.Thread(daemon=False)
+ self.assertFalse(t.daemon)
+ t = threading.Thread(daemon=True)
+ self.assertTrue(t.daemon)
+
@unittest.skipUnless(hasattr(os, 'fork'), 'test needs fork()')
def test_dummy_thread_after_fork(self):
# Issue #14308: a dummy thread in the active list doesn't mess up
@@ -742,6 +750,10 @@ class ThreadingExceptionTests(BaseTestCase):
thread.start()
self.assertRaises(RuntimeError, setattr, thread, "daemon", True)
+ def test_releasing_unacquired_lock(self):
+ lock = threading.Lock()
+ self.assertRaises(RuntimeError, lock.release)
+
@unittest.skipUnless(sys.platform == 'darwin', 'test macosx problem')
def test_recursion_limit(self):
# Issue 9670
@@ -803,6 +815,7 @@ class BoundedSemaphoreTests(lock_tests.BoundedSemaphoreTests):
class BarrierTests(lock_tests.BarrierTests):
barriertype = staticmethod(threading.Barrier)
+
def test_main():
test.support.run_unittest(LockTests, PyRLockTests, CRLockTests, EventTests,
ConditionAsRLockTests, ConditionTests,
@@ -810,7 +823,7 @@ def test_main():
ThreadTests,
ThreadJoinOnShutdown,
ThreadingExceptionTests,
- BarrierTests
+ BarrierTests,
)
if __name__ == "__main__":
diff --git a/Lib/test/test_threadsignals.py b/Lib/test/test_threadsignals.py
index e0af31d..f975a75 100644
--- a/Lib/test/test_threadsignals.py
+++ b/Lib/test/test_threadsignals.py
@@ -14,10 +14,8 @@ if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
process_pid = os.getpid()
signalled_all=thread.allocate_lock()
-# Issue #11223: Locks are implemented using a mutex and a condition variable of
-# the pthread library on FreeBSD6. POSIX condition variables cannot be
-# interrupted by signals (see pthread_cond_wait manual page).
-USING_PTHREAD_COND = (sys.platform == 'freebsd6')
+USING_PTHREAD_COND = (sys.thread_info.name == 'pthread'
+ and sys.thread_info.lock == 'mutex+cond')
def registerSignals(for_usr1, for_usr2, for_alrm):
usr1 = signal.signal(signal.SIGUSR1, for_usr1)
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index ce57d87..63e1453 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -4,7 +4,17 @@ import unittest
import locale
import sysconfig
import sys
-import warnings
+import platform
+try:
+ import threading
+except ImportError:
+ threading = None
+
+# Max year is only limited by the size of C int.
+SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4
+TIME_MAXYEAR = (1 << 8 * SIZEOF_INT - 1) - 1
+TIME_MINYEAR = -TIME_MAXYEAR - 1
+
class TimeTestCase(unittest.TestCase):
@@ -17,9 +27,53 @@ class TimeTestCase(unittest.TestCase):
time.timezone
time.tzname
+ def test_time(self):
+ time.time()
+ info = time.get_clock_info('time')
+ self.assertFalse(info.monotonic)
+ self.assertTrue(info.adjustable)
+
def test_clock(self):
time.clock()
+ info = time.get_clock_info('clock')
+ self.assertTrue(info.monotonic)
+ self.assertFalse(info.adjustable)
+
+ @unittest.skipUnless(hasattr(time, 'clock_gettime'),
+ 'need time.clock_gettime()')
+ def test_clock_realtime(self):
+ time.clock_gettime(time.CLOCK_REALTIME)
+
+ @unittest.skipUnless(hasattr(time, 'clock_gettime'),
+ 'need time.clock_gettime()')
+ @unittest.skipUnless(hasattr(time, 'CLOCK_MONOTONIC'),
+ 'need time.CLOCK_MONOTONIC')
+ def test_clock_monotonic(self):
+ a = time.clock_gettime(time.CLOCK_MONOTONIC)
+ b = time.clock_gettime(time.CLOCK_MONOTONIC)
+ self.assertLessEqual(a, b)
+
+ @unittest.skipUnless(hasattr(time, 'clock_getres'),
+ 'need time.clock_getres()')
+ def test_clock_getres(self):
+ res = time.clock_getres(time.CLOCK_REALTIME)
+ self.assertGreater(res, 0.0)
+ self.assertLessEqual(res, 1.0)
+
+ @unittest.skipUnless(hasattr(time, 'clock_settime'),
+ 'need time.clock_settime()')
+ def test_clock_settime(self):
+ t = time.clock_gettime(time.CLOCK_REALTIME)
+ try:
+ time.clock_settime(time.CLOCK_REALTIME, t)
+ except PermissionError:
+ pass
+
+ if hasattr(time, 'CLOCK_MONOTONIC'):
+ self.assertRaises(OSError,
+ time.clock_settime, time.CLOCK_MONOTONIC, 0)
+
def test_conversions(self):
self.assertEqual(time.ctime(self.t),
time.asctime(time.localtime(self.t)))
@@ -27,6 +81,8 @@ class TimeTestCase(unittest.TestCase):
int(self.t))
def test_sleep(self):
+ self.assertRaises(ValueError, time.sleep, -2)
+ self.assertRaises(ValueError, time.sleep, -1)
time.sleep(1.2)
def test_strftime(self):
@@ -47,28 +103,34 @@ class TimeTestCase(unittest.TestCase):
with self.assertRaises(ValueError):
time.strftime('%f')
- def _bounds_checking(self, func=time.strftime):
+ def _bounds_checking(self, func):
# Make sure that strftime() checks the bounds of the various parts
- #of the time tuple (0 is valid for *all* values).
+ # of the time tuple (0 is valid for *all* values).
# The year field is tested by other test cases above
# Check month [1, 12] + zero support
+ func((1900, 0, 1, 0, 0, 0, 0, 1, -1))
+ func((1900, 12, 1, 0, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, -1, 1, 0, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 13, 1, 0, 0, 0, 0, 1, -1))
# Check day of month [1, 31] + zero support
+ func((1900, 1, 0, 0, 0, 0, 0, 1, -1))
+ func((1900, 1, 31, 0, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, -1, 0, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, 32, 0, 0, 0, 0, 1, -1))
# Check hour [0, 23]
+ func((1900, 1, 1, 23, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, 1, -1, 0, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, 1, 24, 0, 0, 0, 1, -1))
# Check minute [0, 59]
+ func((1900, 1, 1, 0, 59, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, 1, 0, -1, 0, 0, 1, -1))
self.assertRaises(ValueError, func,
@@ -78,15 +140,21 @@ class TimeTestCase(unittest.TestCase):
(1900, 1, 1, 0, 0, -1, 0, 1, -1))
# C99 only requires allowing for one leap second, but Python's docs say
# allow two leap seconds (0..61)
+ func((1900, 1, 1, 0, 0, 60, 0, 1, -1))
+ func((1900, 1, 1, 0, 0, 61, 0, 1, -1))
self.assertRaises(ValueError, func,
(1900, 1, 1, 0, 0, 62, 0, 1, -1))
# No check for upper-bound day of week;
# value forced into range by a ``% 7`` calculation.
# Start check at -2 since gettmarg() increments value before taking
# modulo.
+ self.assertEqual(func((1900, 1, 1, 0, 0, 0, -1, 1, -1)),
+ func((1900, 1, 1, 0, 0, 0, +6, 1, -1)))
self.assertRaises(ValueError, func,
(1900, 1, 1, 0, 0, 0, -2, 1, -1))
# Check day of the year [1, 366] + zero support
+ func((1900, 1, 1, 0, 0, 0, 0, 0, -1))
+ func((1900, 1, 1, 0, 0, 0, 0, 366, -1))
self.assertRaises(ValueError, func,
(1900, 1, 1, 0, 0, 0, 0, -1, -1))
self.assertRaises(ValueError, func,
@@ -96,12 +164,13 @@ class TimeTestCase(unittest.TestCase):
self._bounds_checking(lambda tup: time.strftime('', tup))
def test_default_values_for_zero(self):
- # Make sure that using all zeros uses the proper default values.
- # No test for daylight savings since strftime() does not change output
- # based on its value.
+ # Make sure that using all zeros uses the proper default
+ # values. No test for daylight savings since strftime() does
+ # not change output based on its value and no test for year
+ # because systems vary in their support for year 0.
expected = "2000 01 01 00 00 00 1 001"
with support.check_warnings():
- result = time.strftime("%Y %m %d %H %M %S %w %j", (0,)*9)
+ result = time.strftime("%Y %m %d %H %M %S %w %j", (2000,)+(0,)*8)
self.assertEqual(expected, result)
def test_strptime(self):
@@ -128,11 +197,13 @@ class TimeTestCase(unittest.TestCase):
time.asctime(time.gmtime(self.t))
# Max year is only limited by the size of C int.
- sizeof_int = sysconfig.get_config_var('SIZEOF_INT') or 4
- bigyear = (1 << 8 * sizeof_int - 1) - 1
- asc = time.asctime((bigyear, 6, 1) + (0,)*6)
- self.assertEqual(asc[-len(str(bigyear)):], str(bigyear))
- self.assertRaises(OverflowError, time.asctime, (bigyear + 1,) + (0,)*8)
+ for bigyear in TIME_MAXYEAR, TIME_MINYEAR:
+ asc = time.asctime((bigyear, 6, 1) + (0,) * 6)
+ self.assertEqual(asc[-len(str(bigyear)):], str(bigyear))
+ self.assertRaises(OverflowError, time.asctime,
+ (TIME_MAXYEAR + 1,) + (0,) * 8)
+ self.assertRaises(OverflowError, time.asctime,
+ (TIME_MINYEAR - 1,) + (0,) * 8)
self.assertRaises(TypeError, time.asctime, 0)
self.assertRaises(TypeError, time.asctime, ())
self.assertRaises(TypeError, time.asctime, (0,) * 10)
@@ -155,8 +226,8 @@ class TimeTestCase(unittest.TestCase):
else:
self.assertEqual(time.ctime(testval)[20:], str(year))
- @unittest.skipIf(not hasattr(time, "tzset"),
- "time module has no attribute tzset")
+ @unittest.skipUnless(hasattr(time, "tzset"),
+ "time module has no attribute tzset")
def test_tzset(self):
from os import environ
@@ -208,11 +279,13 @@ class TimeTestCase(unittest.TestCase):
self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
# Issue #11886: Australian Eastern Standard Time (UTC+10) is called
- # "EST" (as Eastern Standard Time, UTC-5) instead of "AEST" on some
- # operating systems (e.g. FreeBSD), which is wrong. See for example
- # this bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=93810
+ # "EST" (as Eastern Standard Time, UTC-5) instead of "AEST"
+ # (non-DST timezone), and "EDT" instead of "AEDT" (DST timezone),
+ # on some operating systems (e.g. FreeBSD), which is wrong. See for
+ # example this bug:
+ # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=93810
self.assertIn(time.tzname[0], ('AEST' 'EST'), time.tzname[0])
- self.assertTrue(time.tzname[1] == 'AEDT', str(time.tzname[1]))
+ self.assertTrue(time.tzname[1] in ('AEDT', 'EDT'), str(time.tzname[1]))
self.assertEqual(len(time.tzname), 2)
self.assertEqual(time.daylight, 1)
self.assertEqual(time.timezone, -36000)
@@ -235,7 +308,7 @@ class TimeTestCase(unittest.TestCase):
# results!).
for func in time.ctime, time.gmtime, time.localtime:
for unreasonable in -1e200, 1e200:
- self.assertRaises(ValueError, func, unreasonable)
+ self.assertRaises(OverflowError, func, unreasonable)
def test_ctime_without_arg(self):
# Not sure how to check the values, since the clock could tick
@@ -258,6 +331,117 @@ class TimeTestCase(unittest.TestCase):
t1 = time.mktime(lt1)
self.assertAlmostEqual(t1, t0, delta=0.2)
+ def test_mktime(self):
+ # Issue #1726687
+ for t in (-2, -1, 0, 1):
+ try:
+ tt = time.localtime(t)
+ except (OverflowError, OSError):
+ pass
+ else:
+ self.assertEqual(time.mktime(tt), t)
+
+ # Issue #13309: passing extreme values to mktime() or localtime()
+ # borks the glibc's internal timezone data.
+ @unittest.skipUnless(platform.libc_ver()[0] != 'glibc',
+ "disabled because of a bug in glibc. Issue #13309")
+ def test_mktime_error(self):
+ # It may not be possible to reliably make mktime return error
+ # on all platfom. This will make sure that no other exception
+ # than OverflowError is raised for an extreme value.
+ tt = time.gmtime(self.t)
+ tzname = time.strftime('%Z', tt)
+ self.assertNotEqual(tzname, 'LMT')
+ try:
+ time.mktime((-1, 1, 1, 0, 0, 0, -1, -1, -1))
+ except OverflowError:
+ pass
+ self.assertEqual(time.strftime('%Z', tt), tzname)
+
+ @unittest.skipUnless(hasattr(time, 'monotonic'),
+ 'need time.monotonic')
+ def test_monotonic(self):
+ t1 = time.monotonic()
+ time.sleep(0.1)
+ t2 = time.monotonic()
+ dt = t2 - t1
+ self.assertGreater(t2, t1)
+ self.assertAlmostEqual(dt, 0.1, delta=0.2)
+
+ info = time.get_clock_info('monotonic')
+ self.assertTrue(info.monotonic)
+ self.assertFalse(info.adjustable)
+
+ def test_perf_counter(self):
+ time.perf_counter()
+
+ def test_process_time(self):
+ # process_time() should not include time spend during a sleep
+ start = time.process_time()
+ time.sleep(0.100)
+ stop = time.process_time()
+ # use 20 ms because process_time() has usually a resolution of 15 ms
+ # on Windows
+ self.assertLess(stop - start, 0.020)
+
+ info = time.get_clock_info('process_time')
+ self.assertTrue(info.monotonic)
+ self.assertFalse(info.adjustable)
+
+ @unittest.skipUnless(hasattr(time, 'monotonic'),
+ 'need time.monotonic')
+ @unittest.skipUnless(hasattr(time, 'clock_settime'),
+ 'need time.clock_settime')
+ def test_monotonic_settime(self):
+ t1 = time.monotonic()
+ realtime = time.clock_gettime(time.CLOCK_REALTIME)
+ # jump backward with an offset of 1 hour
+ try:
+ time.clock_settime(time.CLOCK_REALTIME, realtime - 3600)
+ except PermissionError as err:
+ self.skipTest(err)
+ t2 = time.monotonic()
+ time.clock_settime(time.CLOCK_REALTIME, realtime)
+ # monotonic must not be affected by system clock updates
+ self.assertGreaterEqual(t2, t1)
+
+ def test_localtime_failure(self):
+ # Issue #13847: check for localtime() failure
+ invalid_time_t = None
+ for time_t in (-1, 2**30, 2**33, 2**60):
+ try:
+ time.localtime(time_t)
+ except OverflowError:
+ self.skipTest("need 64-bit time_t")
+ except OSError:
+ invalid_time_t = time_t
+ break
+ if invalid_time_t is None:
+ self.skipTest("unable to find an invalid time_t value")
+
+ self.assertRaises(OSError, time.localtime, invalid_time_t)
+ self.assertRaises(OSError, time.ctime, invalid_time_t)
+
+ def test_get_clock_info(self):
+ clocks = ['clock', 'perf_counter', 'process_time', 'time']
+ if hasattr(time, 'monotonic'):
+ clocks.append('monotonic')
+
+ for name in clocks:
+ info = time.get_clock_info(name)
+ #self.assertIsInstance(info, dict)
+ self.assertIsInstance(info.implementation, str)
+ self.assertNotEqual(info.implementation, '')
+ self.assertIsInstance(info.monotonic, bool)
+ self.assertIsInstance(info.resolution, float)
+ # 0.0 < resolution <= 1.0
+ self.assertGreater(info.resolution, 0.0)
+ self.assertLessEqual(info.resolution, 1.0)
+ self.assertIsInstance(info.adjustable, bool)
+
+ self.assertRaises(ValueError, time.get_clock_info, 'xxx')
+
+
class TestLocale(unittest.TestCase):
def setUp(self):
self.oldloc = locale.setlocale(locale.LC_ALL)
@@ -276,19 +460,12 @@ class TestLocale(unittest.TestCase):
class _BaseYearTest(unittest.TestCase):
- accept2dyear = None
-
- def setUp(self):
- self.saved_accept2dyear = time.accept2dyear
- time.accept2dyear = self.accept2dyear
-
- def tearDown(self):
- time.accept2dyear = self.saved_accept2dyear
-
def yearstr(self, y):
raise NotImplementedError()
class _TestAsctimeYear:
+ _format = '%d'
+
def yearstr(self, y):
return time.asctime((y,) + (0,) * 8).split()[-1]
@@ -298,114 +475,211 @@ class _TestAsctimeYear:
self.assertEqual(self.yearstr(123456789), '123456789')
class _TestStrftimeYear:
- def yearstr(self, y):
- return time.strftime('%Y', (y,) + (0,) * 8).split()[-1]
- def test_large_year(self):
+ # Issue 13305: For years < 1000, the value is not always
+ # padded to 4 digits across platforms. The C standard
+ # assumes year >= 1900, so it does not specify the number
+ # of digits.
+
+ if time.strftime('%Y', (1,) + (0,) * 8) == '0001':
+ _format = '%04d'
+ else:
+ _format = '%d'
+
+ def yearstr(self, y):
+ return time.strftime('%Y', (y,) + (0,) * 8)
+
+ def test_4dyear(self):
+ # Check that we can return the zero padded value.
+ if self._format == '%04d':
+ self.test_year('%04d')
+ else:
+ def year4d(y):
+ return time.strftime('%4Y', (y,) + (0,) * 8)
+ self.test_year('%04d', func=year4d)
+
+ def skip_if_not_supported(y):
+ msg = "strftime() is limited to [1; 9999] with Visual Studio"
# Check that it doesn't crash for year > 9999
try:
- text = self.yearstr(12345)
+ time.strftime('%Y', (y,) + (0,) * 8)
except ValueError:
- # strftime() is limited to [1; 9999] with Visual Studio
- return
- self.assertEqual(text, '12345')
- self.assertEqual(self.yearstr(123456789), '123456789')
+ cond = False
+ else:
+ cond = True
+ return unittest.skipUnless(cond, msg)
-class _Test2dYear(_BaseYearTest):
- accept2dyear = 1
+ @skip_if_not_supported(10000)
+ def test_large_year(self):
+ return super().test_large_year()
- def test_year(self):
- with support.check_warnings():
- self.assertEqual(self.yearstr(0), '2000')
- self.assertEqual(self.yearstr(69), '1969')
- self.assertEqual(self.yearstr(68), '2068')
- self.assertEqual(self.yearstr(99), '1999')
+ @skip_if_not_supported(0)
+ def test_negative(self):
+ return super().test_negative()
+
+ del skip_if_not_supported
- def test_invalid(self):
- self.assertRaises(ValueError, self.yearstr, -1)
- self.assertRaises(ValueError, self.yearstr, 100)
- self.assertRaises(ValueError, self.yearstr, 999)
class _Test4dYear(_BaseYearTest):
- accept2dyear = 0
+ _format = '%d'
+
+ def test_year(self, fmt=None, func=None):
+ fmt = fmt or self._format
+ func = func or self.yearstr
+ self.assertEqual(func(1), fmt % 1)
+ self.assertEqual(func(68), fmt % 68)
+ self.assertEqual(func(69), fmt % 69)
+ self.assertEqual(func(99), fmt % 99)
+ self.assertEqual(func(999), fmt % 999)
+ self.assertEqual(func(9999), fmt % 9999)
- def test_year(self):
- self.assertIn(self.yearstr(1), ('1', '0001'))
- self.assertIn(self.yearstr(68), ('68', '0068'))
- self.assertIn(self.yearstr(69), ('69', '0069'))
- self.assertIn(self.yearstr(99), ('99', '0099'))
- self.assertIn(self.yearstr(999), ('999', '0999'))
- self.assertEqual(self.yearstr(9999), '9999')
+ def test_large_year(self):
+ self.assertEqual(self.yearstr(12345), '12345')
+ self.assertEqual(self.yearstr(123456789), '123456789')
+ self.assertEqual(self.yearstr(TIME_MAXYEAR), str(TIME_MAXYEAR))
+ self.assertRaises(OverflowError, self.yearstr, TIME_MAXYEAR + 1)
def test_negative(self):
- try:
- text = self.yearstr(-1)
- except ValueError:
- # strftime() is limited to [1; 9999] with Visual Studio
- return
- self.assertIn(text, ('-1', '-001'))
-
+ self.assertEqual(self.yearstr(-1), self._format % -1)
self.assertEqual(self.yearstr(-1234), '-1234')
self.assertEqual(self.yearstr(-123456), '-123456')
+ self.assertEqual(self.yearstr(-123456789), str(-123456789))
+ self.assertEqual(self.yearstr(-1234567890), str(-1234567890))
+ self.assertEqual(self.yearstr(TIME_MINYEAR + 1900), str(TIME_MINYEAR + 1900))
+ # Issue #13312: it may return wrong value for year < TIME_MINYEAR + 1900
+ # Skip the value test, but check that no error is raised
+ self.yearstr(TIME_MINYEAR)
+ # self.assertEqual(self.yearstr(TIME_MINYEAR), str(TIME_MINYEAR))
+ self.assertRaises(OverflowError, self.yearstr, TIME_MINYEAR - 1)
- def test_mktime(self):
- # Issue #1726687
- for t in (-2, -1, 0, 1):
- try:
- tt = time.localtime(t)
- except (OverflowError, ValueError):
- pass
- else:
- self.assertEqual(time.mktime(tt), t)
- # It may not be possible to reliably make mktime return error
- # on all platfom. This will make sure that no other exception
- # than OverflowError is raised for an extreme value.
- try:
- time.mktime((-1, 1, 1, 0, 0, 0, -1, -1, -1))
- except OverflowError:
- pass
-
-class TestAsctimeAccept2dYear(_TestAsctimeYear, _Test2dYear):
- pass
-
-class TestStrftimeAccept2dYear(_TestStrftimeYear, _Test2dYear):
- pass
-
class TestAsctime4dyear(_TestAsctimeYear, _Test4dYear):
pass
class TestStrftime4dyear(_TestStrftimeYear, _Test4dYear):
pass
-class Test2dyearBool(_TestAsctimeYear, _Test2dYear):
- accept2dyear = True
-
-class Test4dyearBool(_TestAsctimeYear, _Test4dYear):
- accept2dyear = False
-
-class TestAccept2YearBad(_TestAsctimeYear, _BaseYearTest):
- class X:
- def __bool__(self):
- raise RuntimeError('boo')
- accept2dyear = X()
- def test_2dyear(self):
- pass
- def test_invalid(self):
- self.assertRaises(RuntimeError, self.yearstr, 200)
+class TestPytime(unittest.TestCase):
+ def setUp(self):
+ self.invalid_values = (
+ -(2 ** 100), 2 ** 100,
+ -(2.0 ** 100.0), 2.0 ** 100.0,
+ )
+
+ def test_time_t(self):
+ from _testcapi import pytime_object_to_time_t
+ for obj, time_t in (
+ (0, 0),
+ (-1, -1),
+ (-1.0, -1),
+ (-1.9, -1),
+ (1.0, 1),
+ (1.9, 1),
+ ):
+ self.assertEqual(pytime_object_to_time_t(obj), time_t)
+
+ for invalid in self.invalid_values:
+ self.assertRaises(OverflowError, pytime_object_to_time_t, invalid)
+
+ def test_timeval(self):
+ from _testcapi import pytime_object_to_timeval
+ for obj, timeval in (
+ (0, (0, 0)),
+ (-1, (-1, 0)),
+ (-1.0, (-1, 0)),
+ (1e-6, (0, 1)),
+ (-1e-6, (-1, 999999)),
+ (-1.2, (-2, 800000)),
+ (1.1234560, (1, 123456)),
+ (1.1234569, (1, 123456)),
+ (-1.1234560, (-2, 876544)),
+ (-1.1234561, (-2, 876543)),
+ ):
+ self.assertEqual(pytime_object_to_timeval(obj), timeval)
+
+ for invalid in self.invalid_values:
+ self.assertRaises(OverflowError, pytime_object_to_timeval, invalid)
+
+ def test_timespec(self):
+ from _testcapi import pytime_object_to_timespec
+ for obj, timespec in (
+ (0, (0, 0)),
+ (-1, (-1, 0)),
+ (-1.0, (-1, 0)),
+ (1e-9, (0, 1)),
+ (-1e-9, (-1, 999999999)),
+ (-1.2, (-2, 800000000)),
+ (1.1234567890, (1, 123456789)),
+ (1.1234567899, (1, 123456789)),
+ (-1.1234567890, (-2, 876543211)),
+ (-1.1234567891, (-2, 876543210)),
+ ):
+ self.assertEqual(pytime_object_to_timespec(obj), timespec)
+
+ for invalid in self.invalid_values:
+ self.assertRaises(OverflowError, pytime_object_to_timespec, invalid)
+
+ @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
+ def test_localtime_timezone(self):
+
+ # Get the localtime and examine it for the offset and zone.
+ lt = time.localtime()
+ self.assertTrue(hasattr(lt, "tm_gmtoff"))
+ self.assertTrue(hasattr(lt, "tm_zone"))
+
+ # See if the offset and zone are similar to the module
+ # attributes.
+ if lt.tm_gmtoff is None:
+ self.assertTrue(not hasattr(time, "timezone"))
+ else:
+ self.assertEqual(lt.tm_gmtoff, -[time.timezone, time.altzone][lt.tm_isdst])
+ if lt.tm_zone is None:
+ self.assertTrue(not hasattr(time, "tzname"))
+ else:
+ self.assertEqual(lt.tm_zone, time.tzname[lt.tm_isdst])
+
+ # Try and make UNIX times from the localtime and a 9-tuple
+ # created from the localtime. Test to see that the times are
+ # the same.
+ t = time.mktime(lt); t9 = time.mktime(lt[:9])
+ self.assertEqual(t, t9)
+
+ # Make localtimes from the UNIX times and compare them to
+ # the original localtime, thus making a round trip.
+ new_lt = time.localtime(t); new_lt9 = time.localtime(t9)
+ self.assertEqual(new_lt, lt)
+ self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
+ self.assertEqual(new_lt.tm_zone, lt.tm_zone)
+ self.assertEqual(new_lt9, lt)
+ self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
+ self.assertEqual(new_lt9.tm_zone, lt.tm_zone)
+
+ @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
+ def test_strptime_timezone(self):
+ t = time.strptime("UTC", "%Z")
+ self.assertEqual(t.tm_zone, 'UTC')
+ t = time.strptime("+0500", "%z")
+ self.assertEqual(t.tm_gmtoff, 5 * 3600)
+
+ @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
+ def test_short_times(self):
+
+ import pickle
+
+ # Load a short time structure using pickle.
+ st = b"ctime\nstruct_time\np0\n((I2007\nI8\nI11\nI1\nI24\nI49\nI5\nI223\nI1\ntp1\n(dp2\ntp3\nRp4\n."
+ lt = pickle.loads(st)
+ self.assertIs(lt.tm_gmtoff, None)
+ self.assertIs(lt.tm_zone, None)
def test_main():
support.run_unittest(
TimeTestCase,
TestLocale,
- TestAsctimeAccept2dYear,
- TestStrftimeAccept2dYear,
TestAsctime4dyear,
TestStrftime4dyear,
- Test2dyearBool,
- Test4dyearBool,
- TestAccept2YearBad)
+ TestPytime)
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py
index f9652ce..b4a58f0 100644
--- a/Lib/test/test_tokenize.py
+++ b/Lib/test/test_tokenize.py
@@ -289,6 +289,64 @@ String literals
OP '+' (1, 29) (1, 30)
STRING 'R"ABC"' (1, 31) (1, 37)
+ >>> dump_tokens("u'abc' + U'abc'")
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING "u'abc'" (1, 0) (1, 6)
+ OP '+' (1, 7) (1, 8)
+ STRING "U'abc'" (1, 9) (1, 15)
+ >>> dump_tokens('u"abc" + U"abc"')
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING 'u"abc"' (1, 0) (1, 6)
+ OP '+' (1, 7) (1, 8)
+ STRING 'U"abc"' (1, 9) (1, 15)
+
+ >>> dump_tokens("b'abc' + B'abc'")
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING "b'abc'" (1, 0) (1, 6)
+ OP '+' (1, 7) (1, 8)
+ STRING "B'abc'" (1, 9) (1, 15)
+ >>> dump_tokens('b"abc" + B"abc"')
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING 'b"abc"' (1, 0) (1, 6)
+ OP '+' (1, 7) (1, 8)
+ STRING 'B"abc"' (1, 9) (1, 15)
+ >>> dump_tokens("br'abc' + bR'abc' + Br'abc' + BR'abc'")
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING "br'abc'" (1, 0) (1, 7)
+ OP '+' (1, 8) (1, 9)
+ STRING "bR'abc'" (1, 10) (1, 17)
+ OP '+' (1, 18) (1, 19)
+ STRING "Br'abc'" (1, 20) (1, 27)
+ OP '+' (1, 28) (1, 29)
+ STRING "BR'abc'" (1, 30) (1, 37)
+ >>> dump_tokens('br"abc" + bR"abc" + Br"abc" + BR"abc"')
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING 'br"abc"' (1, 0) (1, 7)
+ OP '+' (1, 8) (1, 9)
+ STRING 'bR"abc"' (1, 10) (1, 17)
+ OP '+' (1, 18) (1, 19)
+ STRING 'Br"abc"' (1, 20) (1, 27)
+ OP '+' (1, 28) (1, 29)
+ STRING 'BR"abc"' (1, 30) (1, 37)
+ >>> dump_tokens("rb'abc' + rB'abc' + Rb'abc' + RB'abc'")
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING "rb'abc'" (1, 0) (1, 7)
+ OP '+' (1, 8) (1, 9)
+ STRING "rB'abc'" (1, 10) (1, 17)
+ OP '+' (1, 18) (1, 19)
+ STRING "Rb'abc'" (1, 20) (1, 27)
+ OP '+' (1, 28) (1, 29)
+ STRING "RB'abc'" (1, 30) (1, 37)
+ >>> dump_tokens('rb"abc" + rB"abc" + Rb"abc" + RB"abc"')
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ STRING 'rb"abc"' (1, 0) (1, 7)
+ OP '+' (1, 8) (1, 9)
+ STRING 'rB"abc"' (1, 10) (1, 17)
+ OP '+' (1, 18) (1, 19)
+ STRING 'Rb"abc"' (1, 20) (1, 27)
+ OP '+' (1, 28) (1, 29)
+ STRING 'RB"abc"' (1, 30) (1, 37)
+
Operators
>>> dump_tokens("def d22(a, b, c=2, d=2, *k): pass")
@@ -552,11 +610,6 @@ Evil tabs
DEDENT '' (4, 0) (4, 0)
DEDENT '' (4, 0) (4, 0)
-Pathological whitespace (http://bugs.python.org/issue16152)
- >>> dump_tokens("@ ")
- ENCODING 'utf-8' (0, 0) (0, 0)
- OP '@' (1, 0) (1, 1)
-
Non-ascii identifiers
>>> dump_tokens("Örter = 'places'\\ngrün = 'green'")
@@ -568,15 +621,28 @@ Non-ascii identifiers
NAME 'grün' (2, 0) (2, 4)
OP '=' (2, 5) (2, 6)
STRING "'green'" (2, 7) (2, 14)
+
+Legacy unicode literals:
+
+ >>> dump_tokens("Örter = u'places'\\ngrün = U'green'")
+ ENCODING 'utf-8' (0, 0) (0, 0)
+ NAME 'Örter' (1, 0) (1, 5)
+ OP '=' (1, 6) (1, 7)
+ STRING "u'places'" (1, 8) (1, 17)
+ NEWLINE '\\n' (1, 17) (1, 18)
+ NAME 'grün' (2, 0) (2, 4)
+ OP '=' (2, 5) (2, 6)
+ STRING "U'green'" (2, 7) (2, 15)
"""
from test import support
from tokenize import (tokenize, _tokenize, untokenize, NUMBER, NAME, OP,
- STRING, ENDMARKER, tok_name, detect_encoding,
+ STRING, ENDMARKER, ENCODING, tok_name, detect_encoding,
open as tokenize_open)
from io import BytesIO
from unittest import TestCase
import os, sys, glob
+import token
def dump_tokens(s):
"""Print out the tokens in s in a table format.
@@ -605,7 +671,7 @@ def roundtrip(f):
f.close()
tokens1 = [tok[:2] for tok in token_list]
new_bytes = untokenize(tokens1)
- readline = (line for line in new_bytes.splitlines(1)).__next__
+ readline = (line for line in new_bytes.splitlines(keepends=True)).__next__
tokens2 = [tok[:2] for tok in tokenize(readline)]
return tokens1 == tokens2
@@ -900,6 +966,35 @@ class TestDetectEncoding(TestCase):
self.assertEqual(fp.encoding, 'utf-8-sig')
self.assertEqual(fp.mode, 'r')
+ def test_filename_in_exception(self):
+ # When possible, include the file name in the exception.
+ path = 'some_file_path'
+ lines = (
+ b'print("\xdf")', # Latin-1: LATIN SMALL LETTER SHARP S
+ )
+ class Bunk:
+ def __init__(self, lines, path):
+ self.name = path
+ self._lines = lines
+ self._index = 0
+
+ def readline(self):
+ if self._index == len(lines):
+ raise StopIteration
+ line = lines[self._index]
+ self._index += 1
+ return line
+
+ with self.assertRaises(SyntaxError):
+ ins = Bunk(lines, path)
+ # Make sure lacking a name isn't an issue.
+ del ins.name
+ detect_encoding(ins.readline)
+ with self.assertRaisesRegex(SyntaxError, '.*{}'.format(path)):
+ ins = Bunk(lines, path)
+ detect_encoding(ins.readline)
+
+
class TestTokenize(TestCase):
def test_tokenize(self):
@@ -941,6 +1036,82 @@ class TestTokenize(TestCase):
self.assertTrue(encoding_used, encoding)
+ def assertExactTypeEqual(self, opstr, *optypes):
+ tokens = list(tokenize(BytesIO(opstr.encode('utf-8')).readline))
+ num_optypes = len(optypes)
+ self.assertEqual(len(tokens), 2 + num_optypes)
+ self.assertEqual(token.tok_name[tokens[0].exact_type],
+ token.tok_name[ENCODING])
+ for i in range(num_optypes):
+ self.assertEqual(token.tok_name[tokens[i + 1].exact_type],
+ token.tok_name[optypes[i]])
+ self.assertEqual(token.tok_name[tokens[1 + num_optypes].exact_type],
+ token.tok_name[token.ENDMARKER])
+
+ def test_exact_type(self):
+ self.assertExactTypeEqual('()', token.LPAR, token.RPAR)
+ self.assertExactTypeEqual('[]', token.LSQB, token.RSQB)
+ self.assertExactTypeEqual(':', token.COLON)
+ self.assertExactTypeEqual(',', token.COMMA)
+ self.assertExactTypeEqual(';', token.SEMI)
+ self.assertExactTypeEqual('+', token.PLUS)
+ self.assertExactTypeEqual('-', token.MINUS)
+ self.assertExactTypeEqual('*', token.STAR)
+ self.assertExactTypeEqual('/', token.SLASH)
+ self.assertExactTypeEqual('|', token.VBAR)
+ self.assertExactTypeEqual('&', token.AMPER)
+ self.assertExactTypeEqual('<', token.LESS)
+ self.assertExactTypeEqual('>', token.GREATER)
+ self.assertExactTypeEqual('=', token.EQUAL)
+ self.assertExactTypeEqual('.', token.DOT)
+ self.assertExactTypeEqual('%', token.PERCENT)
+ self.assertExactTypeEqual('{}', token.LBRACE, token.RBRACE)
+ self.assertExactTypeEqual('==', token.EQEQUAL)
+ self.assertExactTypeEqual('!=', token.NOTEQUAL)
+ self.assertExactTypeEqual('<=', token.LESSEQUAL)
+ self.assertExactTypeEqual('>=', token.GREATEREQUAL)
+ self.assertExactTypeEqual('~', token.TILDE)
+ self.assertExactTypeEqual('^', token.CIRCUMFLEX)
+ self.assertExactTypeEqual('<<', token.LEFTSHIFT)
+ self.assertExactTypeEqual('>>', token.RIGHTSHIFT)
+ self.assertExactTypeEqual('**', token.DOUBLESTAR)
+ self.assertExactTypeEqual('+=', token.PLUSEQUAL)
+ self.assertExactTypeEqual('-=', token.MINEQUAL)
+ self.assertExactTypeEqual('*=', token.STAREQUAL)
+ self.assertExactTypeEqual('/=', token.SLASHEQUAL)
+ self.assertExactTypeEqual('%=', token.PERCENTEQUAL)
+ self.assertExactTypeEqual('&=', token.AMPEREQUAL)
+ self.assertExactTypeEqual('|=', token.VBAREQUAL)
+ self.assertExactTypeEqual('^=', token.CIRCUMFLEXEQUAL)
+ self.assertExactTypeEqual('^=', token.CIRCUMFLEXEQUAL)
+ self.assertExactTypeEqual('<<=', token.LEFTSHIFTEQUAL)
+ self.assertExactTypeEqual('>>=', token.RIGHTSHIFTEQUAL)
+ self.assertExactTypeEqual('**=', token.DOUBLESTAREQUAL)
+ self.assertExactTypeEqual('//', token.DOUBLESLASH)
+ self.assertExactTypeEqual('//=', token.DOUBLESLASHEQUAL)
+ self.assertExactTypeEqual('@', token.AT)
+
+ self.assertExactTypeEqual('a**2+b**2==c**2',
+ NAME, token.DOUBLESTAR, NUMBER,
+ token.PLUS,
+ NAME, token.DOUBLESTAR, NUMBER,
+ token.EQEQUAL,
+ NAME, token.DOUBLESTAR, NUMBER)
+ self.assertExactTypeEqual('{1, 2, 3}',
+ token.LBRACE,
+ token.NUMBER, token.COMMA,
+ token.NUMBER, token.COMMA,
+ token.NUMBER,
+ token.RBRACE)
+ self.assertExactTypeEqual('^(x & 0x1)',
+ token.CIRCUMFLEX,
+ token.LPAR,
+ token.NAME, token.AMPER, token.NUMBER,
+ token.RPAR)
+
+ def test_pathological_trailing_whitespace(self):
+ # See http://bugs.python.org/issue16152
+ self.assertExactTypeEqual('@ ', token.AT)
__test__ = {"doctests" : doctests, 'decistmt': decistmt}
diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py
index 42816a2..7a25069 100644
--- a/Lib/test/test_tools.py
+++ b/Lib/test/test_tools.py
@@ -6,8 +6,9 @@ Tools directory of a Python checkout or tarball, such as reindent.py.
import os
import sys
-import imp
+import importlib.machinery
import unittest
+from unittest import mock
import sysconfig
import tempfile
from test import support
@@ -40,7 +41,7 @@ class TestSundryScripts(unittest.TestCase):
# added for a script it should be added to the whitelist below.
# scripts that have independent tests.
- whitelist = ['reindent.py']
+ whitelist = ['reindent.py', 'pdeps.py', 'gprof2html']
# scripts that can't be imported without running
blacklist = ['make_ctype.py']
# scripts that use windows-only modules
@@ -79,7 +80,8 @@ class PdepsTests(unittest.TestCase):
@classmethod
def setUpClass(self):
path = os.path.join(scriptsdir, 'pdeps.py')
- self.pdeps = imp.load_source('pdeps', path)
+ loader = importlib.machinery.SourceFileLoader('pdeps', path)
+ self.pdeps = loader.load_module()
@classmethod
def tearDownClass(self):
@@ -99,6 +101,35 @@ class PdepsTests(unittest.TestCase):
self.pdeps.inverse({'a': []})
+class Gprof2htmlTests(unittest.TestCase):
+
+ def setUp(self):
+ path = os.path.join(scriptsdir, 'gprof2html.py')
+ loader = importlib.machinery.SourceFileLoader('gprof2html', path)
+ self.gprof = loader.load_module()
+ oldargv = sys.argv
+ def fixup():
+ sys.argv = oldargv
+ self.addCleanup(fixup)
+ sys.argv = []
+
+ def test_gprof(self):
+ # Issue #14508: this used to fail with an NameError.
+ with mock.patch.object(self.gprof, 'webbrowser') as wmock, \
+ tempfile.TemporaryDirectory() as tmpdir:
+ fn = os.path.join(tmpdir, 'abc')
+ open(fn, 'w').close()
+ sys.argv = ['gprof2html', fn]
+ self.gprof.main()
+ self.assertTrue(wmock.open.called)
+
+
+# Run the tests in Tools/parser/test_unparse.py
+with support.DirsOnSysPath(os.path.join(basepath, 'parser')):
+ from test_unparse import UnparseTestCase
+ from test_unparse import DirectoryTestCase
+
+
def test_main():
support.run_unittest(*[obj for obj in globals().values()
if isinstance(obj, type)])
diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py
index 461d1d8..ac3a1a3 100644
--- a/Lib/test/test_trace.py
+++ b/Lib/test/test_trace.py
@@ -102,6 +102,7 @@ class TracedClass(object):
class TestLineCounts(unittest.TestCase):
"""White-box testing of line-counting, via runfunc"""
def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
self.tracer = Trace(count=1, trace=0, countfuncs=0, countcallers=0)
self.my_py_filename = fix_ext_py(__file__)
@@ -192,6 +193,7 @@ class TestRunExecCounts(unittest.TestCase):
"""A simple sanity test of line-counting, via runctx (exec)"""
def setUp(self):
self.my_py_filename = fix_ext_py(__file__)
+ self.addCleanup(sys.settrace, sys.gettrace())
def test_exec_counts(self):
self.tracer = Trace(count=1, trace=0, countfuncs=0, countcallers=0)
@@ -218,6 +220,7 @@ class TestRunExecCounts(unittest.TestCase):
class TestFuncs(unittest.TestCase):
"""White-box testing of funcs tracing"""
def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
self.tracer = Trace(count=0, trace=0, countfuncs=1)
self.filemod = my_file_and_modname()
@@ -242,6 +245,8 @@ class TestFuncs(unittest.TestCase):
}
self.assertEqual(self.tracer.results().calledfuncs, expected)
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'pre-existing trace function throws off measurements')
def test_inst_method_calling(self):
obj = TracedClass(20)
self.tracer.runfunc(obj.inst_method_calling, 1)
@@ -257,9 +262,12 @@ class TestFuncs(unittest.TestCase):
class TestCallers(unittest.TestCase):
"""White-box testing of callers tracing"""
def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
self.tracer = Trace(count=0, trace=0, countcallers=1)
self.filemod = my_file_and_modname()
+ @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
+ 'pre-existing trace function throws off measurements')
def test_loop_caller_importing(self):
self.tracer.runfunc(traced_func_importing_caller, 1)
@@ -280,6 +288,9 @@ class TestCallers(unittest.TestCase):
# Created separately for issue #3821
class TestCoverage(unittest.TestCase):
+ def setUp(self):
+ self.addCleanup(sys.settrace, sys.gettrace())
+
def tearDown(self):
rmtree(TESTFN)
unlink(TESTFN)
@@ -305,13 +316,13 @@ class TestCoverage(unittest.TestCase):
# Ignore all files, nothing should be traced nor printed
libpath = os.path.normpath(os.path.dirname(os.__file__))
# sys.prefix does not work when running from a checkout
- tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix, libpath],
- trace=0, count=1)
+ tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,
+ libpath], trace=0, count=1)
with captured_stdout() as stdout:
self._coverage(tracer)
if os.path.exists(TESTFN):
files = os.listdir(TESTFN)
- self.assertEqual(files, [])
+ self.assertEqual(files, ['_importlib.cover']) # Ignore __import__
def test_issue9936(self):
tracer = trace.Trace(trace=0, count=1)
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 4752d37..5bce2af 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -246,6 +246,21 @@ class BaseExceptionReportingTests:
self.check_zero_div(blocks[0])
self.assertIn('inner_raise() # Marker', blocks[2])
+ def test_context_suppression(self):
+ try:
+ try:
+ raise Exception
+ except:
+ raise ZeroDivisionError from None
+ except ZeroDivisionError as _:
+ e = _
+ lines = self.get_report(e).splitlines()
+ self.assertEqual(len(lines), 4)
+ self.assertTrue(lines[0].startswith('Traceback'))
+ self.assertTrue(lines[1].startswith(' File'))
+ self.assertIn('ZeroDivisionError from None', lines[2])
+ self.assertTrue(lines[3].startswith('ZeroDivisionError'))
+
def test_cause_and_context(self):
# When both a cause and a context are set, only the cause should be
# displayed and the context should be muted.
diff --git a/Lib/test/test_tuple.py b/Lib/test/test_tuple.py
index 6e934fb..e41711c 100644
--- a/Lib/test/test_tuple.py
+++ b/Lib/test/test_tuple.py
@@ -1,6 +1,7 @@
from test import support, seq_tests
import gc
+import pickle
class TupleTest(seq_tests.CommonTest):
type2test = tuple
@@ -164,6 +165,34 @@ class TupleTest(seq_tests.CommonTest):
check(10) # check our checking code
check(1000000)
+ def test_iterator_pickle(self):
+ # Userlist iterators don't support pickling yet since
+ # they are based on generators.
+ data = self.type2test([4, 5, 6, 7])
+ itorg = iter(data)
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(self.type2test(it), self.type2test(data))
+
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(self.type2test(it), self.type2test(data)[1:])
+
+ def test_reversed_pickle(self):
+ data = self.type2test([4, 5, 6, 7])
+ itorg = reversed(data)
+ d = pickle.dumps(itorg)
+ it = pickle.loads(d)
+ self.assertEqual(type(itorg), type(it))
+ self.assertEqual(self.type2test(it), self.type2test(reversed(data)))
+
+ it = pickle.loads(d)
+ next(it)
+ d = pickle.dumps(it)
+ self.assertEqual(self.type2test(it), self.type2test(reversed(data))[1:])
+
def test_no_comdat_folding(self):
# Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
# optimization causes failures in code that relies on distinct
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 8a98a03..3ee4c6b 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -1,9 +1,11 @@
# Python test set -- part 6, built-in types
from test.support import run_unittest, run_with_locale
-import unittest
-import sys
+import collections
import locale
+import sys
+import types
+import unittest
class TypesTests(unittest.TestCase):
@@ -569,8 +571,583 @@ class TypesTests(unittest.TestCase):
self.assertGreater(tuple.__itemsize__, 0)
+class MappingProxyTests(unittest.TestCase):
+ mappingproxy = types.MappingProxyType
+
+ def test_constructor(self):
+ class userdict(dict):
+ pass
+
+ mapping = {'x': 1, 'y': 2}
+ self.assertEqual(self.mappingproxy(mapping), mapping)
+ mapping = userdict(x=1, y=2)
+ self.assertEqual(self.mappingproxy(mapping), mapping)
+ mapping = collections.ChainMap({'x': 1}, {'y': 2})
+ self.assertEqual(self.mappingproxy(mapping), mapping)
+
+ self.assertRaises(TypeError, self.mappingproxy, 10)
+ self.assertRaises(TypeError, self.mappingproxy, ("a", "tuple"))
+ self.assertRaises(TypeError, self.mappingproxy, ["a", "list"])
+
+ def test_methods(self):
+ attrs = set(dir(self.mappingproxy({}))) - set(dir(object()))
+ self.assertEqual(attrs, {
+ '__contains__',
+ '__getitem__',
+ '__iter__',
+ '__len__',
+ 'copy',
+ 'get',
+ 'items',
+ 'keys',
+ 'values',
+ })
+
+ def test_get(self):
+ view = self.mappingproxy({'a': 'A', 'b': 'B'})
+ self.assertEqual(view['a'], 'A')
+ self.assertEqual(view['b'], 'B')
+ self.assertRaises(KeyError, view.__getitem__, 'xxx')
+ self.assertEqual(view.get('a'), 'A')
+ self.assertIsNone(view.get('xxx'))
+ self.assertEqual(view.get('xxx', 42), 42)
+
+ def test_missing(self):
+ class dictmissing(dict):
+ def __missing__(self, key):
+ return "missing=%s" % key
+
+ view = self.mappingproxy(dictmissing(x=1))
+ self.assertEqual(view['x'], 1)
+ self.assertEqual(view['y'], 'missing=y')
+ self.assertEqual(view.get('x'), 1)
+ self.assertEqual(view.get('y'), None)
+ self.assertEqual(view.get('y', 42), 42)
+ self.assertTrue('x' in view)
+ self.assertFalse('y' in view)
+
+ def test_customdict(self):
+ class customdict(dict):
+ def __contains__(self, key):
+ if key == 'magic':
+ return True
+ else:
+ return dict.__contains__(self, key)
+
+ def __iter__(self):
+ return iter(('iter',))
+
+ def __len__(self):
+ return 500
+
+ def copy(self):
+ return 'copy'
+
+ def keys(self):
+ return 'keys'
+
+ def items(self):
+ return 'items'
+
+ def values(self):
+ return 'values'
+
+ def __getitem__(self, key):
+ return "getitem=%s" % dict.__getitem__(self, key)
+
+ def get(self, key, default=None):
+ return "get=%s" % dict.get(self, key, 'default=%r' % default)
+
+ custom = customdict({'key': 'value'})
+ view = self.mappingproxy(custom)
+ self.assertTrue('key' in view)
+ self.assertTrue('magic' in view)
+ self.assertFalse('xxx' in view)
+ self.assertEqual(view['key'], 'getitem=value')
+ self.assertRaises(KeyError, view.__getitem__, 'xxx')
+ self.assertEqual(tuple(view), ('iter',))
+ self.assertEqual(len(view), 500)
+ self.assertEqual(view.copy(), 'copy')
+ self.assertEqual(view.get('key'), 'get=value')
+ self.assertEqual(view.get('xxx'), 'get=default=None')
+ self.assertEqual(view.items(), 'items')
+ self.assertEqual(view.keys(), 'keys')
+ self.assertEqual(view.values(), 'values')
+
+ def test_chainmap(self):
+ d1 = {'x': 1}
+ d2 = {'y': 2}
+ mapping = collections.ChainMap(d1, d2)
+ view = self.mappingproxy(mapping)
+ self.assertTrue('x' in view)
+ self.assertTrue('y' in view)
+ self.assertFalse('z' in view)
+ self.assertEqual(view['x'], 1)
+ self.assertEqual(view['y'], 2)
+ self.assertRaises(KeyError, view.__getitem__, 'z')
+ self.assertEqual(tuple(sorted(view)), ('x', 'y'))
+ self.assertEqual(len(view), 2)
+ copy = view.copy()
+ self.assertIsNot(copy, mapping)
+ self.assertIsInstance(copy, collections.ChainMap)
+ self.assertEqual(copy, mapping)
+ self.assertEqual(view.get('x'), 1)
+ self.assertEqual(view.get('y'), 2)
+ self.assertIsNone(view.get('z'))
+ self.assertEqual(tuple(sorted(view.items())), (('x', 1), ('y', 2)))
+ self.assertEqual(tuple(sorted(view.keys())), ('x', 'y'))
+ self.assertEqual(tuple(sorted(view.values())), (1, 2))
+
+ def test_contains(self):
+ view = self.mappingproxy(dict.fromkeys('abc'))
+ self.assertTrue('a' in view)
+ self.assertTrue('b' in view)
+ self.assertTrue('c' in view)
+ self.assertFalse('xxx' in view)
+
+ def test_views(self):
+ mapping = {}
+ view = self.mappingproxy(mapping)
+ keys = view.keys()
+ values = view.values()
+ items = view.items()
+ self.assertEqual(list(keys), [])
+ self.assertEqual(list(values), [])
+ self.assertEqual(list(items), [])
+ mapping['key'] = 'value'
+ self.assertEqual(list(keys), ['key'])
+ self.assertEqual(list(values), ['value'])
+ self.assertEqual(list(items), [('key', 'value')])
+
+ def test_len(self):
+ for expected in range(6):
+ data = dict.fromkeys('abcde'[:expected])
+ self.assertEqual(len(data), expected)
+ view = self.mappingproxy(data)
+ self.assertEqual(len(view), expected)
+
+ def test_iterators(self):
+ keys = ('x', 'y')
+ values = (1, 2)
+ items = tuple(zip(keys, values))
+ view = self.mappingproxy(dict(items))
+ self.assertEqual(set(view), set(keys))
+ self.assertEqual(set(view.keys()), set(keys))
+ self.assertEqual(set(view.values()), set(values))
+ self.assertEqual(set(view.items()), set(items))
+
+ def test_copy(self):
+ original = {'key1': 27, 'key2': 51, 'key3': 93}
+ view = self.mappingproxy(original)
+ copy = view.copy()
+ self.assertEqual(type(copy), dict)
+ self.assertEqual(copy, original)
+ original['key1'] = 70
+ self.assertEqual(view['key1'], 70)
+ self.assertEqual(copy['key1'], 27)
+
+
+class ClassCreationTests(unittest.TestCase):
+
+ class Meta(type):
+ def __init__(cls, name, bases, ns, **kw):
+ super().__init__(name, bases, ns)
+ @staticmethod
+ def __new__(mcls, name, bases, ns, **kw):
+ return super().__new__(mcls, name, bases, ns)
+ @classmethod
+ def __prepare__(mcls, name, bases, **kw):
+ ns = super().__prepare__(name, bases)
+ ns["y"] = 1
+ ns.update(kw)
+ return ns
+
+ def test_new_class_basics(self):
+ C = types.new_class("C")
+ self.assertEqual(C.__name__, "C")
+ self.assertEqual(C.__bases__, (object,))
+
+ def test_new_class_subclass(self):
+ C = types.new_class("C", (int,))
+ self.assertTrue(issubclass(C, int))
+
+ def test_new_class_meta(self):
+ Meta = self.Meta
+ settings = {"metaclass": Meta, "z": 2}
+ # We do this twice to make sure the passed in dict isn't mutated
+ for i in range(2):
+ C = types.new_class("C" + str(i), (), settings)
+ self.assertIsInstance(C, Meta)
+ self.assertEqual(C.y, 1)
+ self.assertEqual(C.z, 2)
+
+ def test_new_class_exec_body(self):
+ Meta = self.Meta
+ def func(ns):
+ ns["x"] = 0
+ C = types.new_class("C", (), {"metaclass": Meta, "z": 2}, func)
+ self.assertIsInstance(C, Meta)
+ self.assertEqual(C.x, 0)
+ self.assertEqual(C.y, 1)
+ self.assertEqual(C.z, 2)
+
+ def test_new_class_metaclass_keywords(self):
+ #Test that keywords are passed to the metaclass:
+ def meta_func(name, bases, ns, **kw):
+ return name, bases, ns, kw
+ res = types.new_class("X",
+ (int, object),
+ dict(metaclass=meta_func, x=0))
+ self.assertEqual(res, ("X", (int, object), {}, {"x": 0}))
+
+ def test_new_class_defaults(self):
+ # Test defaults/keywords:
+ C = types.new_class("C", (), {}, None)
+ self.assertEqual(C.__name__, "C")
+ self.assertEqual(C.__bases__, (object,))
+
+ def test_new_class_meta_with_base(self):
+ Meta = self.Meta
+ def func(ns):
+ ns["x"] = 0
+ C = types.new_class(name="C",
+ bases=(int,),
+ kwds=dict(metaclass=Meta, z=2),
+ exec_body=func)
+ self.assertTrue(issubclass(C, int))
+ self.assertIsInstance(C, Meta)
+ self.assertEqual(C.x, 0)
+ self.assertEqual(C.y, 1)
+ self.assertEqual(C.z, 2)
+
+ # Many of the following tests are derived from test_descr.py
+ def test_prepare_class(self):
+ # Basic test of metaclass derivation
+ expected_ns = {}
+ class A(type):
+ def __new__(*args, **kwargs):
+ return type.__new__(*args, **kwargs)
+
+ def __prepare__(*args):
+ return expected_ns
+
+ B = types.new_class("B", (object,))
+ C = types.new_class("C", (object,), {"metaclass": A})
+
+ # The most derived metaclass of D is A rather than type.
+ meta, ns, kwds = types.prepare_class("D", (B, C), {"metaclass": type})
+ self.assertIs(meta, A)
+ self.assertIs(ns, expected_ns)
+ self.assertEqual(len(kwds), 0)
+
+ def test_metaclass_derivation(self):
+ # issue1294232: correct metaclass calculation
+ new_calls = [] # to check the order of __new__ calls
+ class AMeta(type):
+ def __new__(mcls, name, bases, ns):
+ new_calls.append('AMeta')
+ return super().__new__(mcls, name, bases, ns)
+ @classmethod
+ def __prepare__(mcls, name, bases):
+ return {}
+
+ class BMeta(AMeta):
+ def __new__(mcls, name, bases, ns):
+ new_calls.append('BMeta')
+ return super().__new__(mcls, name, bases, ns)
+ @classmethod
+ def __prepare__(mcls, name, bases):
+ ns = super().__prepare__(name, bases)
+ ns['BMeta_was_here'] = True
+ return ns
+
+ A = types.new_class("A", (), {"metaclass": AMeta})
+ self.assertEqual(new_calls, ['AMeta'])
+ new_calls.clear()
+
+ B = types.new_class("B", (), {"metaclass": BMeta})
+ # BMeta.__new__ calls AMeta.__new__ with super:
+ self.assertEqual(new_calls, ['BMeta', 'AMeta'])
+ new_calls.clear()
+
+ C = types.new_class("C", (A, B))
+ # The most derived metaclass is BMeta:
+ self.assertEqual(new_calls, ['BMeta', 'AMeta'])
+ new_calls.clear()
+ # BMeta.__prepare__ should've been called:
+ self.assertIn('BMeta_was_here', C.__dict__)
+
+ # The order of the bases shouldn't matter:
+ C2 = types.new_class("C2", (B, A))
+ self.assertEqual(new_calls, ['BMeta', 'AMeta'])
+ new_calls.clear()
+ self.assertIn('BMeta_was_here', C2.__dict__)
+
+ # Check correct metaclass calculation when a metaclass is declared:
+ D = types.new_class("D", (C,), {"metaclass": type})
+ self.assertEqual(new_calls, ['BMeta', 'AMeta'])
+ new_calls.clear()
+ self.assertIn('BMeta_was_here', D.__dict__)
+
+ E = types.new_class("E", (C,), {"metaclass": AMeta})
+ self.assertEqual(new_calls, ['BMeta', 'AMeta'])
+ new_calls.clear()
+ self.assertIn('BMeta_was_here', E.__dict__)
+
+ def test_metaclass_override_function(self):
+ # Special case: the given metaclass isn't a class,
+ # so there is no metaclass calculation.
+ class A(metaclass=self.Meta):
+ pass
+
+ marker = object()
+ def func(*args, **kwargs):
+ return marker
+
+ X = types.new_class("X", (), {"metaclass": func})
+ Y = types.new_class("Y", (object,), {"metaclass": func})
+ Z = types.new_class("Z", (A,), {"metaclass": func})
+ self.assertIs(marker, X)
+ self.assertIs(marker, Y)
+ self.assertIs(marker, Z)
+
+ def test_metaclass_override_callable(self):
+ # The given metaclass is a class,
+ # but not a descendant of type.
+ new_calls = [] # to check the order of __new__ calls
+ prepare_calls = [] # to track __prepare__ calls
+ class ANotMeta:
+ def __new__(mcls, *args, **kwargs):
+ new_calls.append('ANotMeta')
+ return super().__new__(mcls)
+ @classmethod
+ def __prepare__(mcls, name, bases):
+ prepare_calls.append('ANotMeta')
+ return {}
+
+ class BNotMeta(ANotMeta):
+ def __new__(mcls, *args, **kwargs):
+ new_calls.append('BNotMeta')
+ return super().__new__(mcls)
+ @classmethod
+ def __prepare__(mcls, name, bases):
+ prepare_calls.append('BNotMeta')
+ return super().__prepare__(name, bases)
+
+ A = types.new_class("A", (), {"metaclass": ANotMeta})
+ self.assertIs(ANotMeta, type(A))
+ self.assertEqual(prepare_calls, ['ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['ANotMeta'])
+ new_calls.clear()
+
+ B = types.new_class("B", (), {"metaclass": BNotMeta})
+ self.assertIs(BNotMeta, type(B))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ C = types.new_class("C", (A, B))
+ self.assertIs(BNotMeta, type(C))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ C2 = types.new_class("C2", (B, A))
+ self.assertIs(BNotMeta, type(C2))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ # This is a TypeError, because of a metaclass conflict:
+ # BNotMeta is neither a subclass, nor a superclass of type
+ with self.assertRaises(TypeError):
+ D = types.new_class("D", (C,), {"metaclass": type})
+
+ E = types.new_class("E", (C,), {"metaclass": ANotMeta})
+ self.assertIs(BNotMeta, type(E))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ F = types.new_class("F", (object(), C))
+ self.assertIs(BNotMeta, type(F))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ F2 = types.new_class("F2", (C, object()))
+ self.assertIs(BNotMeta, type(F2))
+ self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
+ prepare_calls.clear()
+ self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
+ new_calls.clear()
+
+ # TypeError: BNotMeta is neither a
+ # subclass, nor a superclass of int
+ with self.assertRaises(TypeError):
+ X = types.new_class("X", (C, int()))
+ with self.assertRaises(TypeError):
+ X = types.new_class("X", (int(), C))
+
+
+class SimpleNamespaceTests(unittest.TestCase):
+
+ def test_constructor(self):
+ ns1 = types.SimpleNamespace()
+ ns2 = types.SimpleNamespace(x=1, y=2)
+ ns3 = types.SimpleNamespace(**dict(x=1, y=2))
+
+ with self.assertRaises(TypeError):
+ types.SimpleNamespace(1, 2, 3)
+
+ self.assertEqual(len(ns1.__dict__), 0)
+ self.assertEqual(vars(ns1), {})
+ self.assertEqual(len(ns2.__dict__), 2)
+ self.assertEqual(vars(ns2), {'y': 2, 'x': 1})
+ self.assertEqual(len(ns3.__dict__), 2)
+ self.assertEqual(vars(ns3), {'y': 2, 'x': 1})
+
+ def test_unbound(self):
+ ns1 = vars(types.SimpleNamespace())
+ ns2 = vars(types.SimpleNamespace(x=1, y=2))
+
+ self.assertEqual(ns1, {})
+ self.assertEqual(ns2, {'y': 2, 'x': 1})
+
+ def test_underlying_dict(self):
+ ns1 = types.SimpleNamespace()
+ ns2 = types.SimpleNamespace(x=1, y=2)
+ ns3 = types.SimpleNamespace(a=True, b=False)
+ mapping = ns3.__dict__
+ del ns3
+
+ self.assertEqual(ns1.__dict__, {})
+ self.assertEqual(ns2.__dict__, {'y': 2, 'x': 1})
+ self.assertEqual(mapping, dict(a=True, b=False))
+
+ def test_attrget(self):
+ ns = types.SimpleNamespace(x=1, y=2, w=3)
+
+ self.assertEqual(ns.x, 1)
+ self.assertEqual(ns.y, 2)
+ self.assertEqual(ns.w, 3)
+ with self.assertRaises(AttributeError):
+ ns.z
+
+ def test_attrset(self):
+ ns1 = types.SimpleNamespace()
+ ns2 = types.SimpleNamespace(x=1, y=2, w=3)
+ ns1.a = 'spam'
+ ns1.b = 'ham'
+ ns2.z = 4
+ ns2.theta = None
+
+ self.assertEqual(ns1.__dict__, dict(a='spam', b='ham'))
+ self.assertEqual(ns2.__dict__, dict(x=1, y=2, w=3, z=4, theta=None))
+
+ def test_attrdel(self):
+ ns1 = types.SimpleNamespace()
+ ns2 = types.SimpleNamespace(x=1, y=2, w=3)
+
+ with self.assertRaises(AttributeError):
+ del ns1.spam
+ with self.assertRaises(AttributeError):
+ del ns2.spam
+
+ del ns2.y
+ self.assertEqual(vars(ns2), dict(w=3, x=1))
+ ns2.y = 'spam'
+ self.assertEqual(vars(ns2), dict(w=3, x=1, y='spam'))
+ del ns2.y
+ self.assertEqual(vars(ns2), dict(w=3, x=1))
+
+ ns1.spam = 5
+ self.assertEqual(vars(ns1), dict(spam=5))
+ del ns1.spam
+ self.assertEqual(vars(ns1), {})
+
+ def test_repr(self):
+ ns1 = types.SimpleNamespace(x=1, y=2, w=3)
+ ns2 = types.SimpleNamespace()
+ ns2.x = "spam"
+ ns2._y = 5
+
+ self.assertEqual(repr(ns1), "namespace(w=3, x=1, y=2)")
+ self.assertEqual(repr(ns2), "namespace(_y=5, x='spam')")
+
+ def test_nested(self):
+ ns1 = types.SimpleNamespace(a=1, b=2)
+ ns2 = types.SimpleNamespace()
+ ns3 = types.SimpleNamespace(x=ns1)
+ ns2.spam = ns1
+ ns2.ham = '?'
+ ns2.spam = ns3
+
+ self.assertEqual(vars(ns1), dict(a=1, b=2))
+ self.assertEqual(vars(ns2), dict(spam=ns3, ham='?'))
+ self.assertEqual(ns2.spam, ns3)
+ self.assertEqual(vars(ns3), dict(x=ns1))
+ self.assertEqual(ns3.x.a, 1)
+
+ def test_recursive(self):
+ ns1 = types.SimpleNamespace(c='cookie')
+ ns2 = types.SimpleNamespace()
+ ns3 = types.SimpleNamespace(x=1)
+ ns1.spam = ns1
+ ns2.spam = ns3
+ ns3.spam = ns2
+
+ self.assertEqual(ns1.spam, ns1)
+ self.assertEqual(ns1.spam.spam, ns1)
+ self.assertEqual(ns1.spam.spam, ns1.spam)
+ self.assertEqual(ns2.spam, ns3)
+ self.assertEqual(ns3.spam, ns2)
+ self.assertEqual(ns2.spam.spam, ns2)
+
+ def test_recursive_repr(self):
+ ns1 = types.SimpleNamespace(c='cookie')
+ ns2 = types.SimpleNamespace()
+ ns3 = types.SimpleNamespace(x=1)
+ ns1.spam = ns1
+ ns2.spam = ns3
+ ns3.spam = ns2
+
+ self.assertEqual(repr(ns1),
+ "namespace(c='cookie', spam=namespace(...))")
+ self.assertEqual(repr(ns2),
+ "namespace(spam=namespace(spam=namespace(...), x=1))")
+
+ def test_as_dict(self):
+ ns = types.SimpleNamespace(spam='spamspamspam')
+
+ with self.assertRaises(TypeError):
+ len(ns)
+ with self.assertRaises(TypeError):
+ iter(ns)
+ with self.assertRaises(TypeError):
+ 'spam' in ns
+ with self.assertRaises(TypeError):
+ ns['spam']
+
+ def test_subclass(self):
+ class Spam(types.SimpleNamespace):
+ pass
+
+ spam = Spam(ham=8, eggs=9)
+
+ self.assertIs(type(spam), Spam)
+ self.assertEqual(vars(spam), {'ham': 8, 'eggs': 9})
+
+
def test_main():
- run_unittest(TypesTests)
+ run_unittest(TypesTests, MappingProxyTests, ClassCreationTests,
+ SimpleNamespaceTests)
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py
index fd620f0..68a3219 100644
--- a/Lib/test/test_ucn.py
+++ b/Lib/test/test_ucn.py
@@ -8,8 +8,11 @@ Modified for Python 2.0 by Fredrik Lundh (fredrik@pythonware.com)
"""#"
import unittest
+import unicodedata
from test import support
+from http.client import HTTPException
+from test.test_normalization import check_version
class UnicodeNamesTest(unittest.TestCase):
@@ -59,8 +62,6 @@ class UnicodeNamesTest(unittest.TestCase):
)
def test_ascii_letters(self):
- import unicodedata
-
for char in "".join(map(chr, range(ord("a"), ord("z")))):
name = "LATIN SMALL LETTER %s" % char.upper()
code = unicodedata.lookup(name)
@@ -81,7 +82,6 @@ class UnicodeNamesTest(unittest.TestCase):
self.checkletter("HANGUL SYLLABLE HWEOK", "\ud6f8")
self.checkletter("HANGUL SYLLABLE HIH", "\ud7a3")
- import unicodedata
self.assertRaises(ValueError, unicodedata.name, "\ud7a4")
def test_cjk_unified_ideographs(self):
@@ -97,14 +97,11 @@ class UnicodeNamesTest(unittest.TestCase):
self.checkletter("CJK UNIFIED IDEOGRAPH-2B81D", "\U0002B81D")
def test_bmp_characters(self):
- import unicodedata
- count = 0
for code in range(0x10000):
char = chr(code)
name = unicodedata.name(char, None)
if name is not None:
self.assertEqual(unicodedata.lookup(name), char)
- count += 1
def test_misc_symbols(self):
self.checkletter("PILCROW SIGN", "\u00b6")
@@ -112,8 +109,85 @@ class UnicodeNamesTest(unittest.TestCase):
self.checkletter("HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK", "\uFF9F")
self.checkletter("FULLWIDTH LATIN SMALL LETTER A", "\uFF41")
+ def test_aliases(self):
+ # Check that the aliases defined in the NameAliases.txt file work.
+ # This should be updated when new aliases are added or the file
+ # should be downloaded and parsed instead. See #12753.
+ aliases = [
+ ('LATIN CAPITAL LETTER GHA', 0x01A2),
+ ('LATIN SMALL LETTER GHA', 0x01A3),
+ ('KANNADA LETTER LLLA', 0x0CDE),
+ ('LAO LETTER FO FON', 0x0E9D),
+ ('LAO LETTER FO FAY', 0x0E9F),
+ ('LAO LETTER RO', 0x0EA3),
+ ('LAO LETTER LO', 0x0EA5),
+ ('TIBETAN MARK BKA- SHOG GI MGO RGYAN', 0x0FD0),
+ ('YI SYLLABLE ITERATION MARK', 0xA015),
+ ('PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET', 0xFE18),
+ ('BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS', 0x1D0C5)
+ ]
+ for alias, codepoint in aliases:
+ self.checkletter(alias, chr(codepoint))
+ name = unicodedata.name(chr(codepoint))
+ self.assertNotEqual(name, alias)
+ self.assertEqual(unicodedata.lookup(alias),
+ unicodedata.lookup(name))
+ with self.assertRaises(KeyError):
+ unicodedata.ucd_3_2_0.lookup(alias)
+
+ def test_aliases_names_in_pua_range(self):
+ # We are storing aliases in the PUA 15, but their names shouldn't leak
+ for cp in range(0xf0000, 0xf0100):
+ with self.assertRaises(ValueError) as cm:
+ unicodedata.name(chr(cp))
+ self.assertEqual(str(cm.exception), 'no such name')
+
+ def test_named_sequences_names_in_pua_range(self):
+ # We are storing named seq in the PUA 15, but their names shouldn't leak
+ for cp in range(0xf0100, 0xf0fff):
+ with self.assertRaises(ValueError) as cm:
+ unicodedata.name(chr(cp))
+ self.assertEqual(str(cm.exception), 'no such name')
+
+ def test_named_sequences_sample(self):
+ # Check a few named sequences. See #12753.
+ sequences = [
+ ('LATIN SMALL LETTER R WITH TILDE', '\u0072\u0303'),
+ ('TAMIL SYLLABLE SAI', '\u0BB8\u0BC8'),
+ ('TAMIL SYLLABLE MOO', '\u0BAE\u0BCB'),
+ ('TAMIL SYLLABLE NNOO', '\u0BA3\u0BCB'),
+ ('TAMIL CONSONANT KSS', '\u0B95\u0BCD\u0BB7\u0BCD'),
+ ]
+ for seqname, codepoints in sequences:
+ self.assertEqual(unicodedata.lookup(seqname), codepoints)
+ with self.assertRaises(SyntaxError):
+ self.checkletter(seqname, None)
+ with self.assertRaises(KeyError):
+ unicodedata.ucd_3_2_0.lookup(seqname)
+
+ def test_named_sequences_full(self):
+ # Check all the named sequences
+ url = ("http://www.unicode.org/Public/%s/ucd/NamedSequences.txt" %
+ unicodedata.unidata_version)
+ try:
+ testdata = support.open_urlresource(url, encoding="utf-8",
+ check=check_version)
+ except (IOError, HTTPException):
+ self.skipTest("Could not retrieve " + url)
+ self.addCleanup(testdata.close)
+ for line in testdata:
+ line = line.strip()
+ if not line or line.startswith('#'):
+ continue
+ seqname, codepoints = line.split(';')
+ codepoints = ''.join(chr(int(cp, 16)) for cp in codepoints.split())
+ self.assertEqual(unicodedata.lookup(seqname), codepoints)
+ with self.assertRaises(SyntaxError):
+ self.checkletter(seqname, None)
+ with self.assertRaises(KeyError):
+ unicodedata.ucd_3_2_0.lookup(seqname)
+
def test_errors(self):
- import unicodedata
self.assertRaises(TypeError, unicodedata.name)
self.assertRaises(TypeError, unicodedata.name, 'xx')
self.assertRaises(TypeError, unicodedata.lookup)
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index 000ae6a..a811c4c 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -5,17 +5,13 @@ Written by Marc-Andre Lemburg (mal@lemburg.com).
(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
"""#"
+import _string
import codecs
import struct
import sys
import unittest
import warnings
from test import support, string_tests
-import _string
-
-# decorator to skip tests on narrow builds
-requires_wide_build = unittest.skipIf(sys.maxunicode == 65535,
- 'requires wide build')
# Error handling (bad decoder return)
def search_function(encoding):
@@ -175,6 +171,15 @@ class UnicodeTest(string_tests.CommonTest,
def test_find(self):
string_tests.CommonTest.test_find(self)
+ # test implementation details of the memchr fast path
+ self.checkequal(100, 'a' * 100 + '\u0102', 'find', '\u0102')
+ self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0201')
+ self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0120')
+ self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0220')
+ self.checkequal(100, 'a' * 100 + '\U00100304', 'find', '\U00100304')
+ self.checkequal(-1, 'a' * 100 + '\U00100304', 'find', '\U00100204')
+ self.checkequal(-1, 'a' * 100 + '\U00100304', 'find', '\U00102004')
+ # check mixed argument types
self.checkequalnofix(0, 'abcdefghiabc', 'find', 'abc')
self.checkequalnofix(9, 'abcdefghiabc', 'find', 'abc', 1)
self.checkequalnofix(-1, 'abcdefghiabc', 'find', 'def', 4)
@@ -184,6 +189,14 @@ class UnicodeTest(string_tests.CommonTest,
def test_rfind(self):
string_tests.CommonTest.test_rfind(self)
+ # test implementation details of the memrchr fast path
+ self.checkequal(0, '\u0102' + 'a' * 100 , 'rfind', '\u0102')
+ self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0201')
+ self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0120')
+ self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0220')
+ self.checkequal(0, '\U00100304' + 'a' * 100, 'rfind', '\U00100304')
+ self.checkequal(-1, '\U00100304' + 'a' * 100, 'rfind', '\U00100204')
+ self.checkequal(-1, '\U00100304' + 'a' * 100, 'rfind', '\U00102004')
# check mixed argument types
self.checkequalnofix(9, 'abcdefghiabc', 'rfind', 'abc')
self.checkequalnofix(12, 'abcdefghiabc', 'rfind', '')
@@ -280,6 +293,12 @@ class UnicodeTest(string_tests.CommonTest,
self.checkequalnofix('one@two!three!', 'one!two!three!', 'replace', '!', '@', 1)
self.assertRaises(TypeError, 'replace'.replace, "r", 42)
+ @support.cpython_only
+ def test_replace_id(self):
+ pattern = 'abc'
+ text = 'abc def'
+ self.assertIs(text.replace(pattern, pattern), text)
+
def test_bytes_comparison(self):
with support.check_warnings():
warnings.simplefilter('ignore', BytesWarning)
@@ -350,6 +369,8 @@ class UnicodeTest(string_tests.CommonTest,
def test_islower(self):
string_tests.MixinStrUnicodeUserStringTest.test_islower(self)
self.checkequalnofix(False, '\u1FFc', 'islower')
+ self.assertFalse('\u2167'.islower())
+ self.assertTrue('\u2177'.islower())
# non-BMP, uppercase
self.assertFalse('\U00010401'.islower())
self.assertFalse('\U00010427'.islower())
@@ -364,6 +385,8 @@ class UnicodeTest(string_tests.CommonTest,
string_tests.MixinStrUnicodeUserStringTest.test_isupper(self)
if not sys.platform.startswith('java'):
self.checkequalnofix(False, '\u1FFc', 'isupper')
+ self.assertTrue('\u2167'.isupper())
+ self.assertFalse('\u2177'.isupper())
# non-BMP, uppercase
self.assertTrue('\U00010401'.isupper())
self.assertTrue('\U00010427'.isupper())
@@ -520,7 +543,6 @@ class UnicodeTest(string_tests.CommonTest,
self.assertFalse(meth(s), '%a.%s() is False' % (s, meth_name))
- @requires_wide_build
def test_lower(self):
string_tests.CommonTest.test_lower(self)
self.assertEqual('\U00010427'.lower(), '\U0001044F')
@@ -530,8 +552,28 @@ class UnicodeTest(string_tests.CommonTest,
'\U0001044F\U0001044F')
self.assertEqual('X\U00010427x\U0001044F'.lower(),
'x\U0001044Fx\U0001044F')
+ self.assertEqual('ï¬'.lower(), 'ï¬')
+ self.assertEqual('\u0130'.lower(), '\u0069\u0307')
+ # Special case for GREEK CAPITAL LETTER SIGMA U+03A3
+ self.assertEqual('\u03a3'.lower(), '\u03c3')
+ self.assertEqual('\u0345\u03a3'.lower(), '\u0345\u03c3')
+ self.assertEqual('A\u0345\u03a3'.lower(), 'a\u0345\u03c2')
+ self.assertEqual('A\u0345\u03a3a'.lower(), 'a\u0345\u03c3a')
+ self.assertEqual('A\u0345\u03a3'.lower(), 'a\u0345\u03c2')
+ self.assertEqual('A\u03a3\u0345'.lower(), 'a\u03c2\u0345')
+ self.assertEqual('\u03a3\u0345 '.lower(), '\u03c3\u0345 ')
+ self.assertEqual('\U0008fffe'.lower(), '\U0008fffe')
+ self.assertEqual('\u2177'.lower(), '\u2177')
+
+ def test_casefold(self):
+ self.assertEqual('hello'.casefold(), 'hello')
+ self.assertEqual('hELlo'.casefold(), 'hello')
+ self.assertEqual('ß'.casefold(), 'ss')
+ self.assertEqual('ï¬'.casefold(), 'fi')
+ self.assertEqual('\u03a3'.casefold(), '\u03c3')
+ self.assertEqual('A\u0345\u03a3'.casefold(), 'a\u03b9\u03c3')
+ self.assertEqual('\u00b5'.casefold(), '\u03bc')
- @requires_wide_build
def test_upper(self):
string_tests.CommonTest.test_upper(self)
self.assertEqual('\U0001044F'.upper(), '\U00010427')
@@ -541,8 +583,14 @@ class UnicodeTest(string_tests.CommonTest,
'\U00010427\U00010427')
self.assertEqual('X\U00010427x\U0001044F'.upper(),
'X\U00010427X\U00010427')
+ self.assertEqual('ï¬'.upper(), 'FI')
+ self.assertEqual('\u0130'.upper(), '\u0130')
+ self.assertEqual('\u03a3'.upper(), '\u03a3')
+ self.assertEqual('ß'.upper(), 'SS')
+ self.assertEqual('\u1fd2'.upper(), '\u0399\u0308\u0300')
+ self.assertEqual('\U0008fffe'.upper(), '\U0008fffe')
+ self.assertEqual('\u2177'.upper(), '\u2167')
- @requires_wide_build
def test_capitalize(self):
string_tests.CommonTest.test_capitalize(self)
self.assertEqual('\U0001044F'.capitalize(), '\U00010427')
@@ -554,8 +602,12 @@ class UnicodeTest(string_tests.CommonTest,
'\U00010427\U0001044F')
self.assertEqual('X\U00010427x\U0001044F'.capitalize(),
'X\U0001044Fx\U0001044F')
+ self.assertEqual('h\u0130'.capitalize(), 'H\u0069\u0307')
+ exp = '\u0399\u0308\u0300\u0069\u0307'
+ self.assertEqual('\u1fd2\u0130'.capitalize(), exp)
+ self.assertEqual('ï¬nnish'.capitalize(), 'FInnish')
+ self.assertEqual('A\u0345\u03a3'.capitalize(), 'A\u0345\u03c2')
- @requires_wide_build
def test_title(self):
string_tests.MixinStrUnicodeUserStringTest.test_title(self)
self.assertEqual('\U0001044F'.title(), '\U00010427')
@@ -569,8 +621,10 @@ class UnicodeTest(string_tests.CommonTest,
'\U00010427\U0001044F \U00010427\U0001044F')
self.assertEqual('X\U00010427x\U0001044F X\U00010427x\U0001044F'.title(),
'X\U0001044Fx\U0001044F X\U0001044Fx\U0001044F')
+ self.assertEqual('ï¬NNISH'.title(), 'Finnish')
+ self.assertEqual('A\u03a3 \u1fa1xy'.title(), 'A\u03c2 \u1fa9xy')
+ self.assertEqual('A\u03a3A'.title(), 'A\u03c3a')
- @requires_wide_build
def test_swapcase(self):
string_tests.CommonTest.test_swapcase(self)
self.assertEqual('\U0001044F'.swapcase(), '\U00010427')
@@ -583,6 +637,19 @@ class UnicodeTest(string_tests.CommonTest,
'\U00010427\U0001044F')
self.assertEqual('X\U00010427x\U0001044F'.swapcase(),
'x\U0001044FX\U00010427')
+ self.assertEqual('ï¬'.swapcase(), 'FI')
+ self.assertEqual('\u0130'.swapcase(), '\u0069\u0307')
+ # Special case for GREEK CAPITAL LETTER SIGMA U+03A3
+ self.assertEqual('\u03a3'.swapcase(), '\u03c3')
+ self.assertEqual('\u0345\u03a3'.swapcase(), '\u0399\u03c3')
+ self.assertEqual('A\u0345\u03a3'.swapcase(), 'a\u0399\u03c2')
+ self.assertEqual('A\u0345\u03a3a'.swapcase(), 'a\u0399\u03c3A')
+ self.assertEqual('A\u0345\u03a3'.swapcase(), 'a\u0399\u03c2')
+ self.assertEqual('A\u03a3\u0345'.swapcase(), 'a\u03c2\u0399')
+ self.assertEqual('\u03a3\u0345 '.swapcase(), '\u03c3\u0399 ')
+ self.assertEqual('\u03a3'.swapcase(), '\u03c3')
+ self.assertEqual('ß'.swapcase(), 'SS')
+ self.assertEqual('\u1fd2'.swapcase(), '\u0399\u0308\u0300')
def test_contains(self):
# Testing Unicode contains method
@@ -776,7 +843,7 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual('{0!s}'.format(G('data')), 'string is data')
msg = 'object.__format__ with a non-empty format string is deprecated'
- with support.check_warnings((msg, PendingDeprecationWarning)):
+ with support.check_warnings((msg, DeprecationWarning)):
self.assertEqual('{0:^10}'.format(E('data')), ' E(data) ')
self.assertEqual('{0:^10s}'.format(E('data')), ' E(data) ')
self.assertEqual('{0:>15s}'.format(G('data')), ' string is data')
@@ -858,6 +925,14 @@ class UnicodeTest(string_tests.CommonTest,
self.assertRaises(ValueError, format, '', '#')
self.assertRaises(ValueError, format, '', '#20')
+ # Non-ASCII
+ self.assertEqual("{0:s}{1:s}".format("ABC", "\u0410\u0411\u0412"),
+ 'ABC\u0410\u0411\u0412')
+ self.assertEqual("{0:.3s}".format("ABC\u0410\u0411\u0412"),
+ 'ABC')
+ self.assertEqual("{0:.0s}".format("ABC\u0410\u0411\u0412"),
+ '')
+
def test_format_map(self):
self.assertEqual(''.format_map({}), '')
self.assertEqual('a'.format_map({}), 'a')
@@ -1005,6 +1080,10 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual('%f' % INF, 'inf')
self.assertEqual('%F' % INF, 'INF')
+ # PEP 393
+ self.assertEqual('%.1s' % "a\xe9\u20ac", 'a')
+ self.assertEqual('%.2s' % "a\xe9\u20ac", 'a\xe9')
+
@support.cpython_only
def test_formatting_huge_precision(self):
from _testcapi import INT_MAX
@@ -1041,10 +1120,13 @@ class UnicodeTest(string_tests.CommonTest,
class UnicodeSubclass(str):
pass
- self.assertEqual(
- str(UnicodeSubclass('unicode subclass becomes unicode')),
- 'unicode subclass becomes unicode'
- )
+ for text in ('ascii', '\xe9', '\u20ac', '\U0010FFFF'):
+ subclass = UnicodeSubclass(text)
+ self.assertEqual(str(subclass), text)
+ self.assertEqual(len(subclass), len(text))
+ if text == 'ascii':
+ self.assertEqual(subclass.encode('ascii'), b'ascii')
+ self.assertEqual(subclass.encode('utf-8'), b'ascii')
self.assertEqual(
str('strings are converted to unicode'),
@@ -1150,15 +1232,12 @@ class UnicodeTest(string_tests.CommonTest,
def test_codecs_utf8(self):
self.assertEqual(''.encode('utf-8'), b'')
self.assertEqual('\u20ac'.encode('utf-8'), b'\xe2\x82\xac')
- if sys.maxunicode == 65535:
- self.assertEqual('\ud800\udc02'.encode('utf-8'), b'\xf0\x90\x80\x82')
- self.assertEqual('\ud84d\udc56'.encode('utf-8'), b'\xf0\xa3\x91\x96')
+ self.assertEqual('\U00010002'.encode('utf-8'), b'\xf0\x90\x80\x82')
+ self.assertEqual('\U00023456'.encode('utf-8'), b'\xf0\xa3\x91\x96')
self.assertEqual('\ud800'.encode('utf-8', 'surrogatepass'), b'\xed\xa0\x80')
self.assertEqual('\udc00'.encode('utf-8', 'surrogatepass'), b'\xed\xb0\x80')
- if sys.maxunicode == 65535:
- self.assertEqual(
- ('\ud800\udc02'*1000).encode('utf-8'),
- b'\xf0\x90\x80\x82'*1000)
+ self.assertEqual(('\U00010002'*10).encode('utf-8'),
+ b'\xf0\x90\x80\x82'*10)
self.assertEqual(
'\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f'
'\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00'
@@ -1270,7 +1349,7 @@ class UnicodeTest(string_tests.CommonTest,
# with start byte of a 2-byte sequence
(b'\xc2', FFFD), # only the start byte
(b'\xc2\xc2', FFFD*2), # 2 start bytes
- (b'\xc2\xc2\xc2', FFFD*3), # 2 start bytes
+ (b'\xc2\xc2\xc2', FFFD*3), # 3 start bytes
(b'\xc2\x41', FFFD+'A'), # invalid continuation byte
# with start byte of a 3-byte sequence
(b'\xe1', FFFD), # only the start byte
@@ -1340,6 +1419,226 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual(seq.decode('utf-8', 'ignore'),
res.replace('\uFFFD', ''))
+ def to_bytestring(self, seq):
+ return bytes(int(c, 16) for c in seq.split())
+
+ def assertCorrectUTF8Decoding(self, seq, res, err):
+ """
+ Check that an invalid UTF-8 sequence raises an UnicodeDecodeError when
+ 'strict' is used, returns res when 'replace' is used, and that doesn't
+ return anything when 'ignore' is used.
+ """
+ with self.assertRaises(UnicodeDecodeError) as cm:
+ seq.decode('utf-8')
+ exc = cm.exception
+
+ self.assertIn(err, str(exc))
+ self.assertEqual(seq.decode('utf-8', 'replace'), res)
+ self.assertEqual((b'aaaa' + seq + b'bbbb').decode('utf-8', 'replace'),
+ 'aaaa' + res + 'bbbb')
+ res = res.replace('\ufffd', '')
+ self.assertEqual(seq.decode('utf-8', 'ignore'), res)
+ self.assertEqual((b'aaaa' + seq + b'bbbb').decode('utf-8', 'ignore'),
+ 'aaaa' + res + 'bbbb')
+
+ def test_invalid_start_byte(self):
+ """
+ Test that an 'invalid start byte' error is raised when the first byte
+ is not in the ASCII range or is not a valid start byte of a 2-, 3-, or
+ 4-bytes sequence. The invalid start byte is replaced with a single
+ U+FFFD when errors='replace'.
+ E.g. <80> is a continuation byte and can appear only after a start byte.
+ """
+ FFFD = '\ufffd'
+ for byte in b'\x80\xA0\x9F\xBF\xC0\xC1\xF5\xFF':
+ self.assertCorrectUTF8Decoding(bytes([byte]), '\ufffd',
+ 'invalid start byte')
+
+ def test_unexpected_end_of_data(self):
+ """
+ Test that an 'unexpected end of data' error is raised when the string
+ ends after a start byte of a 2-, 3-, or 4-bytes sequence without having
+ enough continuation bytes. The incomplete sequence is replaced with a
+ single U+FFFD when errors='replace'.
+ E.g. in the sequence <F3 80 80>, F3 is the start byte of a 4-bytes
+ sequence, but it's followed by only 2 valid continuation bytes and the
+ last continuation bytes is missing.
+ Note: the continuation bytes must be all valid, if one of them is
+ invalid another error will be raised.
+ """
+ sequences = [
+ 'C2', 'DF',
+ 'E0 A0', 'E0 BF', 'E1 80', 'E1 BF', 'EC 80', 'EC BF',
+ 'ED 80', 'ED 9F', 'EE 80', 'EE BF', 'EF 80', 'EF BF',
+ 'F0 90', 'F0 BF', 'F0 90 80', 'F0 90 BF', 'F0 BF 80', 'F0 BF BF',
+ 'F1 80', 'F1 BF', 'F1 80 80', 'F1 80 BF', 'F1 BF 80', 'F1 BF BF',
+ 'F3 80', 'F3 BF', 'F3 80 80', 'F3 80 BF', 'F3 BF 80', 'F3 BF BF',
+ 'F4 80', 'F4 8F', 'F4 80 80', 'F4 80 BF', 'F4 8F 80', 'F4 8F BF'
+ ]
+ FFFD = '\ufffd'
+ for seq in sequences:
+ self.assertCorrectUTF8Decoding(self.to_bytestring(seq), '\ufffd',
+ 'unexpected end of data')
+
+ def test_invalid_cb_for_2bytes_seq(self):
+ """
+ Test that an 'invalid continuation byte' error is raised when the
+ continuation byte of a 2-bytes sequence is invalid. The start byte
+ is replaced by a single U+FFFD and the second byte is handled
+ separately when errors='replace'.
+ E.g. in the sequence <C2 41>, C2 is the start byte of a 2-bytes
+ sequence, but 41 is not a valid continuation byte because it's the
+ ASCII letter 'A'.
+ """
+ FFFD = '\ufffd'
+ FFFDx2 = FFFD * 2
+ sequences = [
+ ('C2 00', FFFD+'\x00'), ('C2 7F', FFFD+'\x7f'),
+ ('C2 C0', FFFDx2), ('C2 FF', FFFDx2),
+ ('DF 00', FFFD+'\x00'), ('DF 7F', FFFD+'\x7f'),
+ ('DF C0', FFFDx2), ('DF FF', FFFDx2),
+ ]
+ for seq, res in sequences:
+ self.assertCorrectUTF8Decoding(self.to_bytestring(seq), res,
+ 'invalid continuation byte')
+
+ def test_invalid_cb_for_3bytes_seq(self):
+ """
+ Test that an 'invalid continuation byte' error is raised when the
+ continuation byte(s) of a 3-bytes sequence are invalid. When
+ errors='replace', if the first continuation byte is valid, the first
+ two bytes (start byte + 1st cb) are replaced by a single U+FFFD and the
+ third byte is handled separately, otherwise only the start byte is
+ replaced with a U+FFFD and the other continuation bytes are handled
+ separately.
+ E.g. in the sequence <E1 80 41>, E1 is the start byte of a 3-bytes
+ sequence, 80 is a valid continuation byte, but 41 is not a valid cb
+ because it's the ASCII letter 'A'.
+ Note: when the start byte is E0 or ED, the valid ranges for the first
+ continuation byte are limited to A0..BF and 80..9F respectively.
+ Python 2 used to consider all the bytes in range 80..BF valid when the
+ start byte was ED. This is fixed in Python 3.
+ """
+ FFFD = '\ufffd'
+ FFFDx2 = FFFD * 2
+ sequences = [
+ ('E0 00', FFFD+'\x00'), ('E0 7F', FFFD+'\x7f'), ('E0 80', FFFDx2),
+ ('E0 9F', FFFDx2), ('E0 C0', FFFDx2), ('E0 FF', FFFDx2),
+ ('E0 A0 00', FFFD+'\x00'), ('E0 A0 7F', FFFD+'\x7f'),
+ ('E0 A0 C0', FFFDx2), ('E0 A0 FF', FFFDx2),
+ ('E0 BF 00', FFFD+'\x00'), ('E0 BF 7F', FFFD+'\x7f'),
+ ('E0 BF C0', FFFDx2), ('E0 BF FF', FFFDx2), ('E1 00', FFFD+'\x00'),
+ ('E1 7F', FFFD+'\x7f'), ('E1 C0', FFFDx2), ('E1 FF', FFFDx2),
+ ('E1 80 00', FFFD+'\x00'), ('E1 80 7F', FFFD+'\x7f'),
+ ('E1 80 C0', FFFDx2), ('E1 80 FF', FFFDx2),
+ ('E1 BF 00', FFFD+'\x00'), ('E1 BF 7F', FFFD+'\x7f'),
+ ('E1 BF C0', FFFDx2), ('E1 BF FF', FFFDx2), ('EC 00', FFFD+'\x00'),
+ ('EC 7F', FFFD+'\x7f'), ('EC C0', FFFDx2), ('EC FF', FFFDx2),
+ ('EC 80 00', FFFD+'\x00'), ('EC 80 7F', FFFD+'\x7f'),
+ ('EC 80 C0', FFFDx2), ('EC 80 FF', FFFDx2),
+ ('EC BF 00', FFFD+'\x00'), ('EC BF 7F', FFFD+'\x7f'),
+ ('EC BF C0', FFFDx2), ('EC BF FF', FFFDx2), ('ED 00', FFFD+'\x00'),
+ ('ED 7F', FFFD+'\x7f'),
+ ('ED A0', FFFDx2), ('ED BF', FFFDx2), # see note ^
+ ('ED C0', FFFDx2), ('ED FF', FFFDx2), ('ED 80 00', FFFD+'\x00'),
+ ('ED 80 7F', FFFD+'\x7f'), ('ED 80 C0', FFFDx2),
+ ('ED 80 FF', FFFDx2), ('ED 9F 00', FFFD+'\x00'),
+ ('ED 9F 7F', FFFD+'\x7f'), ('ED 9F C0', FFFDx2),
+ ('ED 9F FF', FFFDx2), ('EE 00', FFFD+'\x00'),
+ ('EE 7F', FFFD+'\x7f'), ('EE C0', FFFDx2), ('EE FF', FFFDx2),
+ ('EE 80 00', FFFD+'\x00'), ('EE 80 7F', FFFD+'\x7f'),
+ ('EE 80 C0', FFFDx2), ('EE 80 FF', FFFDx2),
+ ('EE BF 00', FFFD+'\x00'), ('EE BF 7F', FFFD+'\x7f'),
+ ('EE BF C0', FFFDx2), ('EE BF FF', FFFDx2), ('EF 00', FFFD+'\x00'),
+ ('EF 7F', FFFD+'\x7f'), ('EF C0', FFFDx2), ('EF FF', FFFDx2),
+ ('EF 80 00', FFFD+'\x00'), ('EF 80 7F', FFFD+'\x7f'),
+ ('EF 80 C0', FFFDx2), ('EF 80 FF', FFFDx2),
+ ('EF BF 00', FFFD+'\x00'), ('EF BF 7F', FFFD+'\x7f'),
+ ('EF BF C0', FFFDx2), ('EF BF FF', FFFDx2),
+ ]
+ for seq, res in sequences:
+ self.assertCorrectUTF8Decoding(self.to_bytestring(seq), res,
+ 'invalid continuation byte')
+
+ def test_invalid_cb_for_4bytes_seq(self):
+ """
+ Test that an 'invalid continuation byte' error is raised when the
+ continuation byte(s) of a 4-bytes sequence are invalid. When
+ errors='replace',the start byte and all the following valid
+ continuation bytes are replaced with a single U+FFFD, and all the bytes
+ starting from the first invalid continuation bytes (included) are
+ handled separately.
+ E.g. in the sequence <E1 80 41>, E1 is the start byte of a 3-bytes
+ sequence, 80 is a valid continuation byte, but 41 is not a valid cb
+ because it's the ASCII letter 'A'.
+ Note: when the start byte is E0 or ED, the valid ranges for the first
+ continuation byte are limited to A0..BF and 80..9F respectively.
+ However, when the start byte is ED, Python 2 considers all the bytes
+ in range 80..BF valid. This is fixed in Python 3.
+ """
+ FFFD = '\ufffd'
+ FFFDx2 = FFFD * 2
+ sequences = [
+ ('F0 00', FFFD+'\x00'), ('F0 7F', FFFD+'\x7f'), ('F0 80', FFFDx2),
+ ('F0 8F', FFFDx2), ('F0 C0', FFFDx2), ('F0 FF', FFFDx2),
+ ('F0 90 00', FFFD+'\x00'), ('F0 90 7F', FFFD+'\x7f'),
+ ('F0 90 C0', FFFDx2), ('F0 90 FF', FFFDx2),
+ ('F0 BF 00', FFFD+'\x00'), ('F0 BF 7F', FFFD+'\x7f'),
+ ('F0 BF C0', FFFDx2), ('F0 BF FF', FFFDx2),
+ ('F0 90 80 00', FFFD+'\x00'), ('F0 90 80 7F', FFFD+'\x7f'),
+ ('F0 90 80 C0', FFFDx2), ('F0 90 80 FF', FFFDx2),
+ ('F0 90 BF 00', FFFD+'\x00'), ('F0 90 BF 7F', FFFD+'\x7f'),
+ ('F0 90 BF C0', FFFDx2), ('F0 90 BF FF', FFFDx2),
+ ('F0 BF 80 00', FFFD+'\x00'), ('F0 BF 80 7F', FFFD+'\x7f'),
+ ('F0 BF 80 C0', FFFDx2), ('F0 BF 80 FF', FFFDx2),
+ ('F0 BF BF 00', FFFD+'\x00'), ('F0 BF BF 7F', FFFD+'\x7f'),
+ ('F0 BF BF C0', FFFDx2), ('F0 BF BF FF', FFFDx2),
+ ('F1 00', FFFD+'\x00'), ('F1 7F', FFFD+'\x7f'), ('F1 C0', FFFDx2),
+ ('F1 FF', FFFDx2), ('F1 80 00', FFFD+'\x00'),
+ ('F1 80 7F', FFFD+'\x7f'), ('F1 80 C0', FFFDx2),
+ ('F1 80 FF', FFFDx2), ('F1 BF 00', FFFD+'\x00'),
+ ('F1 BF 7F', FFFD+'\x7f'), ('F1 BF C0', FFFDx2),
+ ('F1 BF FF', FFFDx2), ('F1 80 80 00', FFFD+'\x00'),
+ ('F1 80 80 7F', FFFD+'\x7f'), ('F1 80 80 C0', FFFDx2),
+ ('F1 80 80 FF', FFFDx2), ('F1 80 BF 00', FFFD+'\x00'),
+ ('F1 80 BF 7F', FFFD+'\x7f'), ('F1 80 BF C0', FFFDx2),
+ ('F1 80 BF FF', FFFDx2), ('F1 BF 80 00', FFFD+'\x00'),
+ ('F1 BF 80 7F', FFFD+'\x7f'), ('F1 BF 80 C0', FFFDx2),
+ ('F1 BF 80 FF', FFFDx2), ('F1 BF BF 00', FFFD+'\x00'),
+ ('F1 BF BF 7F', FFFD+'\x7f'), ('F1 BF BF C0', FFFDx2),
+ ('F1 BF BF FF', FFFDx2), ('F3 00', FFFD+'\x00'),
+ ('F3 7F', FFFD+'\x7f'), ('F3 C0', FFFDx2), ('F3 FF', FFFDx2),
+ ('F3 80 00', FFFD+'\x00'), ('F3 80 7F', FFFD+'\x7f'),
+ ('F3 80 C0', FFFDx2), ('F3 80 FF', FFFDx2),
+ ('F3 BF 00', FFFD+'\x00'), ('F3 BF 7F', FFFD+'\x7f'),
+ ('F3 BF C0', FFFDx2), ('F3 BF FF', FFFDx2),
+ ('F3 80 80 00', FFFD+'\x00'), ('F3 80 80 7F', FFFD+'\x7f'),
+ ('F3 80 80 C0', FFFDx2), ('F3 80 80 FF', FFFDx2),
+ ('F3 80 BF 00', FFFD+'\x00'), ('F3 80 BF 7F', FFFD+'\x7f'),
+ ('F3 80 BF C0', FFFDx2), ('F3 80 BF FF', FFFDx2),
+ ('F3 BF 80 00', FFFD+'\x00'), ('F3 BF 80 7F', FFFD+'\x7f'),
+ ('F3 BF 80 C0', FFFDx2), ('F3 BF 80 FF', FFFDx2),
+ ('F3 BF BF 00', FFFD+'\x00'), ('F3 BF BF 7F', FFFD+'\x7f'),
+ ('F3 BF BF C0', FFFDx2), ('F3 BF BF FF', FFFDx2),
+ ('F4 00', FFFD+'\x00'), ('F4 7F', FFFD+'\x7f'), ('F4 90', FFFDx2),
+ ('F4 BF', FFFDx2), ('F4 C0', FFFDx2), ('F4 FF', FFFDx2),
+ ('F4 80 00', FFFD+'\x00'), ('F4 80 7F', FFFD+'\x7f'),
+ ('F4 80 C0', FFFDx2), ('F4 80 FF', FFFDx2),
+ ('F4 8F 00', FFFD+'\x00'), ('F4 8F 7F', FFFD+'\x7f'),
+ ('F4 8F C0', FFFDx2), ('F4 8F FF', FFFDx2),
+ ('F4 80 80 00', FFFD+'\x00'), ('F4 80 80 7F', FFFD+'\x7f'),
+ ('F4 80 80 C0', FFFDx2), ('F4 80 80 FF', FFFDx2),
+ ('F4 80 BF 00', FFFD+'\x00'), ('F4 80 BF 7F', FFFD+'\x7f'),
+ ('F4 80 BF C0', FFFDx2), ('F4 80 BF FF', FFFDx2),
+ ('F4 8F 80 00', FFFD+'\x00'), ('F4 8F 80 7F', FFFD+'\x7f'),
+ ('F4 8F 80 C0', FFFDx2), ('F4 8F 80 FF', FFFDx2),
+ ('F4 8F BF 00', FFFD+'\x00'), ('F4 8F BF 7F', FFFD+'\x7f'),
+ ('F4 8F BF C0', FFFDx2), ('F4 8F BF FF', FFFDx2)
+ ]
+ for seq, res in sequences:
+ self.assertCorrectUTF8Decoding(self.to_bytestring(seq), res,
+ 'invalid continuation byte')
+
def test_codecs_idna(self):
# Test whether trailing dot is preserved
self.assertEqual("www.python.org.".encode("idna"), b"www.python.org.")
@@ -1371,14 +1670,6 @@ class UnicodeTest(string_tests.CommonTest,
self.assertRaises(TypeError, str, b"hello", "test.unicode2")
self.assertRaises(TypeError, "hello".encode, "test.unicode1")
self.assertRaises(TypeError, "hello".encode, "test.unicode2")
- # executes PyUnicode_Encode()
- import imp
- self.assertRaises(
- ImportError,
- imp.find_module,
- "non-existing module",
- ["non-existing dir"]
- )
# Error handling (wrong arguments)
self.assertRaises(TypeError, "hello".encode, 42, 42, 42)
@@ -1396,18 +1687,25 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual('hello'.encode('ascii'), b'hello')
self.assertEqual('hello'.encode('utf-7'), b'hello')
self.assertEqual('hello'.encode('utf-8'), b'hello')
- self.assertEqual('hello'.encode('utf8'), b'hello')
+ self.assertEqual('hello'.encode('utf-8'), b'hello')
self.assertEqual('hello'.encode('utf-16-le'), b'h\000e\000l\000l\000o\000')
self.assertEqual('hello'.encode('utf-16-be'), b'\000h\000e\000l\000l\000o')
self.assertEqual('hello'.encode('latin-1'), b'hello')
+ # Default encoding is utf-8
+ self.assertEqual('\u2603'.encode(), b'\xe2\x98\x83')
+
# Roundtrip safety for BMP (just the first 1024 chars)
for c in range(1024):
u = chr(c)
for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le',
'utf-16-be', 'raw_unicode_escape',
'unicode_escape', 'unicode_internal'):
- self.assertEqual(str(u.encode(encoding),encoding), u)
+ with warnings.catch_warnings():
+ # unicode-internal has been deprecated
+ warnings.simplefilter("ignore", DeprecationWarning)
+
+ self.assertEqual(str(u.encode(encoding),encoding), u)
# Roundtrip safety for BMP (just the first 256 chars)
for c in range(256):
@@ -1422,18 +1720,20 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual(str(u.encode(encoding),encoding), u)
# Roundtrip safety for non-BMP (just a few chars)
- u = '\U00010001\U00020002\U00030003\U00040004\U00050005'
- for encoding in ('utf-8', 'utf-16', 'utf-16-le', 'utf-16-be',
- #'raw_unicode_escape',
- 'unicode_escape', 'unicode_internal'):
- self.assertEqual(str(u.encode(encoding),encoding), u)
+ with warnings.catch_warnings():
+ # unicode-internal has been deprecated
+ warnings.simplefilter("ignore", DeprecationWarning)
- # UTF-8 must be roundtrip safe for all UCS-2 code points
- # This excludes surrogates: in the full range, there would be
- # a surrogate pair (\udbff\udc00), which gets converted back
- # to a non-BMP character (\U0010fc00)
- u = ''.join(map(chr, list(range(0,0xd800)) +
- list(range(0xe000,0x10000))))
+ u = '\U00010001\U00020002\U00030003\U00040004\U00050005'
+ for encoding in ('utf-8', 'utf-16', 'utf-16-le', 'utf-16-be',
+ 'raw_unicode_escape',
+ 'unicode_escape', 'unicode_internal'):
+ self.assertEqual(str(u.encode(encoding),encoding), u)
+
+ # UTF-8 must be roundtrip safe for all code points
+ # (except surrogates, which are forbidden).
+ u = ''.join(map(chr, list(range(0, 0xd800)) +
+ list(range(0xe000, 0x110000))))
for encoding in ('utf-8',):
self.assertEqual(str(u.encode(encoding),encoding), u)
@@ -1618,17 +1918,39 @@ class UnicodeTest(string_tests.CommonTest,
return
self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxsize)
+ @support.cpython_only
+ def test_expandtabs_optimization(self):
+ s = 'abc'
+ self.assertIs(s.expandtabs(), s)
+
def test_raiseMemError(self):
- # Ensure that the freelist contains a consistent object, even
- # when a string allocation fails with a MemoryError.
- # This used to crash the interpreter,
- # or leak references when the number was smaller.
- charwidth = 4 if sys.maxunicode >= 0x10000 else 2
- # Note: sys.maxsize is half of the actual max allocation because of
- # the signedness of Py_ssize_t.
- alloc = lambda: "a" * (sys.maxsize // charwidth * 2)
- self.assertRaises(MemoryError, alloc)
- self.assertRaises(MemoryError, alloc)
+ if struct.calcsize('P') == 8:
+ # 64 bits pointers
+ ascii_struct_size = 48
+ compact_struct_size = 72
+ else:
+ # 32 bits pointers
+ ascii_struct_size = 24
+ compact_struct_size = 36
+
+ for char in ('a', '\xe9', '\u20ac', '\U0010ffff'):
+ code = ord(char)
+ if code < 0x100:
+ char_size = 1 # sizeof(Py_UCS1)
+ struct_size = ascii_struct_size
+ elif code < 0x10000:
+ char_size = 2 # sizeof(Py_UCS2)
+ struct_size = compact_struct_size
+ else:
+ char_size = 4 # sizeof(Py_UCS4)
+ struct_size = compact_struct_size
+ # Note: sys.maxsize is half of the actual max allocation because of
+ # the signedness of Py_ssize_t. Strings of maxlen-1 should in principle
+ # be allocatable, given enough memory.
+ maxlen = ((sys.maxsize - struct_size) // char_size)
+ alloc = lambda: char * maxlen
+ self.assertRaises(MemoryError, alloc)
+ self.assertRaises(MemoryError, alloc)
def test_format_subclass(self):
class S(str):
@@ -1641,11 +1963,10 @@ class UnicodeTest(string_tests.CommonTest,
# Test PyUnicode_FromFormat()
def test_from_format(self):
support.import_module('ctypes')
- from ctypes import pythonapi, py_object, c_int
- if sys.maxunicode == 65535:
- name = "PyUnicodeUCS2_FromFormat"
- else:
- name = "PyUnicodeUCS4_FromFormat"
+ from ctypes import (pythonapi, py_object,
+ c_int, c_long, c_longlong, c_ssize_t,
+ c_uint, c_ulong, c_ulonglong, c_size_t)
+ name = "PyUnicode_FromFormat"
_PyUnicode_FromFormat = getattr(pythonapi, name)
_PyUnicode_FromFormat.restype = py_object
@@ -1666,13 +1987,40 @@ class UnicodeTest(string_tests.CommonTest,
'string, got a non-ASCII byte: 0xe9$',
PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
+ # test "%c"
self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0xabcd)), '\uabcd')
self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0x10ffff)), '\U0010ffff')
- # other tests
+ # test "%"
+ self.assertEqual(PyUnicode_FromFormat(b'%'), '%')
+ self.assertEqual(PyUnicode_FromFormat(b'%%'), '%')
+ self.assertEqual(PyUnicode_FromFormat(b'%%s'), '%s')
+ self.assertEqual(PyUnicode_FromFormat(b'[%%]'), '[%]')
+ self.assertEqual(PyUnicode_FromFormat(b'%%%s', b'abc'), '%abc')
+
+ # test integer formats (%i, %d, %u)
+ self.assertEqual(PyUnicode_FromFormat(b'%03i', c_int(10)), '010')
+ self.assertEqual(PyUnicode_FromFormat(b'%0.4i', c_int(10)), '0010')
+ self.assertEqual(PyUnicode_FromFormat(b'%i', c_int(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%li', c_long(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%lli', c_longlong(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%zi', c_ssize_t(-123)), '-123')
+
+ self.assertEqual(PyUnicode_FromFormat(b'%d', c_int(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%ld', c_long(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%lld', c_longlong(-123)), '-123')
+ self.assertEqual(PyUnicode_FromFormat(b'%zd', c_ssize_t(-123)), '-123')
+
+ self.assertEqual(PyUnicode_FromFormat(b'%u', c_uint(123)), '123')
+ self.assertEqual(PyUnicode_FromFormat(b'%lu', c_ulong(123)), '123')
+ self.assertEqual(PyUnicode_FromFormat(b'%llu', c_ulonglong(123)), '123')
+ self.assertEqual(PyUnicode_FromFormat(b'%zu', c_size_t(123)), '123')
+
+ # test %A
text = PyUnicode_FromFormat(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
self.assertEqual(text, r"%A:'abc\xe9\uabcd\U0010ffff'")
+ # test %V
text = PyUnicode_FromFormat(b'repr=%V', 'abc', b'xyz')
self.assertEqual(text, 'repr=abc')
@@ -1686,6 +2034,13 @@ class UnicodeTest(string_tests.CommonTest,
text = PyUnicode_FromFormat(b'repr=%V', None, b'abc\xff')
self.assertEqual(text, 'repr=abc\ufffd')
+ # not supported: copy the raw format string. these tests are just here
+ # to check for crashs and should not be considered as specifications
+ self.assertEqual(PyUnicode_FromFormat(b'%1%s', b'abc'), '%s')
+ self.assertEqual(PyUnicode_FromFormat(b'%1abc'), '%1abc')
+ self.assertEqual(PyUnicode_FromFormat(b'%+i', c_int(10)), '%+i')
+ self.assertEqual(PyUnicode_FromFormat(b'%.%s', b'abc'), '%.%s')
+
# Test PyUnicode_AsWideChar()
def test_aswidechar(self):
from _testcapi import unicode_aswidechar
@@ -1746,6 +2101,51 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual(size, nchar)
self.assertEqual(wchar, nonbmp + '\0')
+ def test_subclass_add(self):
+ class S(str):
+ def __add__(self, o):
+ return "3"
+ self.assertEqual(S("4") + S("5"), "3")
+ class S(str):
+ def __iadd__(self, o):
+ return "3"
+ s = S("1")
+ s += "4"
+ self.assertEqual(s, "3")
+
+ def test_encode_decimal(self):
+ from _testcapi import unicode_encodedecimal
+ self.assertEqual(unicode_encodedecimal('123'),
+ b'123')
+ self.assertEqual(unicode_encodedecimal('\u0663.\u0661\u0664'),
+ b'3.14')
+ self.assertEqual(unicode_encodedecimal("\N{EM SPACE}3.14\N{EN SPACE}"),
+ b' 3.14 ')
+ self.assertRaises(UnicodeEncodeError,
+ unicode_encodedecimal, "123\u20ac", "strict")
+ self.assertRaisesRegex(
+ ValueError,
+ "^'decimal' codec can't encode character",
+ unicode_encodedecimal, "123\u20ac", "replace")
+
+ def test_transform_decimal(self):
+ from _testcapi import unicode_transformdecimaltoascii as transform_decimal
+ self.assertEqual(transform_decimal('123'),
+ '123')
+ self.assertEqual(transform_decimal('\u0663.\u0661\u0664'),
+ '3.14')
+ self.assertEqual(transform_decimal("\N{EM SPACE}3.14\N{EN SPACE}"),
+ "\N{EM SPACE}3.14\N{EN SPACE}")
+ self.assertEqual(transform_decimal('123\u20ac'),
+ '123\u20ac')
+
+ def test_getnewargs(self):
+ text = 'abc'
+ args = text.__getnewargs__()
+ self.assertIsNot(args[0], text)
+ self.assertEqual(args[0], text)
+ self.assertEqual(len(args), 1)
+
class StringModuleTest(unittest.TestCase):
def test_formatter_parser(self):
@@ -1797,42 +2197,6 @@ class StringModuleTest(unittest.TestCase):
]])
self.assertRaises(TypeError, _string.formatter_field_name_split, 1)
- def test_encode_decimal(self):
- from _testcapi import unicode_encodedecimal
- self.assertEqual(unicode_encodedecimal('123'),
- b'123')
- self.assertEqual(unicode_encodedecimal('\u0663.\u0661\u0664'),
- b'3.14')
- self.assertEqual(unicode_encodedecimal("\N{EM SPACE}3.14\N{EN SPACE}"),
- b' 3.14 ')
- self.assertRaises(UnicodeEncodeError,
- unicode_encodedecimal, "123\u20ac", "strict")
- self.assertEqual(unicode_encodedecimal("123\u20ac", "replace"),
- b'123?')
- self.assertEqual(unicode_encodedecimal("123\u20ac", "ignore"),
- b'123')
- self.assertEqual(unicode_encodedecimal("123\u20ac", "xmlcharrefreplace"),
- b'123&#8364;')
- self.assertEqual(unicode_encodedecimal("123\u20ac", "backslashreplace"),
- b'123\\u20ac')
- self.assertEqual(unicode_encodedecimal("123\u20ac\N{EM SPACE}", "replace"),
- b'123? ')
- self.assertEqual(unicode_encodedecimal("123\u20ac\u20ac", "replace"),
- b'123??')
- self.assertEqual(unicode_encodedecimal("123\u20ac\u0660", "replace"),
- b'123?0')
-
- def test_transform_decimal(self):
- from _testcapi import unicode_transformdecimaltoascii as transform_decimal
- self.assertEqual(transform_decimal('123'),
- '123')
- self.assertEqual(transform_decimal('\u0663.\u0661\u0664'),
- '3.14')
- self.assertEqual(transform_decimal("\N{EM SPACE}3.14\N{EN SPACE}"),
- "\N{EM SPACE}3.14\N{EN SPACE}")
- self.assertEqual(transform_decimal('123\u20ac'),
- '123\u20ac')
-
def test_main():
support.run_unittest(__name__)
diff --git a/Lib/test/test_unicode_file.py b/Lib/test/test_unicode_file.py
index 6c2011a..faa8da3 100644
--- a/Lib/test/test_unicode_file.py
+++ b/Lib/test/test_unicode_file.py
@@ -6,7 +6,7 @@ import unicodedata
import unittest
from test.support import (run_unittest, rmtree,
- TESTFN_ENCODING, TESTFN_UNICODE, TESTFN_UNENCODABLE)
+ TESTFN_ENCODING, TESTFN_UNICODE, TESTFN_UNENCODABLE, create_empty_file)
if not os.path.supports_unicode_filenames:
try:
@@ -56,16 +56,20 @@ class TestUnicodeFiles(unittest.TestCase):
# Should be able to rename the file using either name.
self.assertTrue(os.path.isfile(filename1)) # must exist.
os.rename(filename1, filename2 + ".new")
- self.assertTrue(os.path.isfile(filename1+".new"))
+ self.assertFalse(os.path.isfile(filename2))
+ self.assertTrue(os.path.isfile(filename1 + '.new'))
os.rename(filename1 + ".new", filename2)
+ self.assertFalse(os.path.isfile(filename1 + '.new'))
self.assertTrue(os.path.isfile(filename2))
shutil.copy(filename1, filename2 + ".new")
os.unlink(filename1 + ".new") # remove using equiv name.
# And a couple of moves, one using each name.
shutil.move(filename1, filename2 + ".new")
- self.assertTrue(not os.path.exists(filename2))
+ self.assertFalse(os.path.exists(filename2))
+ self.assertTrue(os.path.exists(filename1 + '.new'))
shutil.move(filename1 + ".new", filename2)
+ self.assertFalse(os.path.exists(filename2 + '.new'))
self.assertTrue(os.path.exists(filename1))
# Note - due to the implementation of shutil.move,
# it tries a rename first. This only fails on Windows when on
@@ -73,10 +77,12 @@ class TestUnicodeFiles(unittest.TestCase):
# So we test the shutil.copy2 function, which is the thing most
# likely to fail.
shutil.copy2(filename1, filename2 + ".new")
+ self.assertTrue(os.path.isfile(filename1 + '.new'))
os.unlink(filename1 + ".new")
+ self.assertFalse(os.path.exists(filename2 + '.new'))
def _do_directory(self, make_name, chdir_name):
- cwd = os.getcwdb()
+ cwd = os.getcwd()
if os.path.isdir(make_name):
rmtree(make_name)
os.mkdir(make_name)
@@ -99,8 +105,7 @@ class TestUnicodeFiles(unittest.TestCase):
# top-level 'test' functions would be if they could take params
def _test_single(self, filename):
remove_if_exists(filename)
- f = open(filename, "w")
- f.close()
+ create_empty_file(filename)
try:
self._do_single(filename)
finally:
diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py
index 9744256..99aa003 100644
--- a/Lib/test/test_unicodedata.py
+++ b/Lib/test/test_unicodedata.py
@@ -21,7 +21,7 @@ errors = 'surrogatepass'
class UnicodeMethodsTest(unittest.TestCase):
# update this, if the database changes
- expectedchecksum = '21b90f1aed00081b81ca7942b22196af090015a0'
+ expectedchecksum = 'bf7a78f1a532421b5033600102e23a92044dbba9'
def test_method_checksum(self):
h = hashlib.sha1()
@@ -80,7 +80,7 @@ class UnicodeDatabaseTest(unittest.TestCase):
class UnicodeFunctionsTest(UnicodeDatabaseTest):
# update this, if the database changes
- expectedchecksum = 'c23dfc0b5eaf3ca2aad32d733de96bb182ccda50'
+ expectedchecksum = '17fe2f12b788e4fff5479b469c4404bb6ecf841f'
def test_function_checksum(self):
data = []
h = hashlib.sha1()
@@ -108,6 +108,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest):
self.assertEqual(self.db.digit('\u215b', None), None)
self.assertEqual(self.db.digit('\u2468'), 9)
self.assertEqual(self.db.digit('\U00020000', None), None)
+ self.assertEqual(self.db.digit('\U0001D7FD'), 7)
self.assertRaises(TypeError, self.db.digit)
self.assertRaises(TypeError, self.db.digit, 'xx')
@@ -120,6 +121,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest):
self.assertEqual(self.db.numeric('\u2468'), 9.0)
self.assertEqual(self.db.numeric('\ua627'), 7.0)
self.assertEqual(self.db.numeric('\U00020000', None), None)
+ self.assertEqual(self.db.numeric('\U0001012A'), 9000)
self.assertRaises(TypeError, self.db.numeric)
self.assertRaises(TypeError, self.db.numeric, 'xx')
@@ -131,6 +133,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest):
self.assertEqual(self.db.decimal('\u215b', None), None)
self.assertEqual(self.db.decimal('\u2468', None), None)
self.assertEqual(self.db.decimal('\U00020000', None), None)
+ self.assertEqual(self.db.decimal('\U0001D7FD'), 7)
self.assertRaises(TypeError, self.db.decimal)
self.assertRaises(TypeError, self.db.decimal, 'xx')
@@ -141,6 +144,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest):
self.assertEqual(self.db.category('a'), 'Ll')
self.assertEqual(self.db.category('A'), 'Lu')
self.assertEqual(self.db.category('\U00020000'), 'Lo')
+ self.assertEqual(self.db.category('\U0001012A'), 'No')
self.assertRaises(TypeError, self.db.category)
self.assertRaises(TypeError, self.db.category, 'xx')
@@ -308,14 +312,6 @@ class UnicodeMiscTest(UnicodeDatabaseTest):
self.assertEqual(len(lines), 1,
r"\u%.4x should not be a linebreak" % i)
- def test_UCS4(self):
- # unicodedata should work with code points outside the BMP
- # even on a narrow Unicode build
- self.assertEqual(self.db.category("\U0001012A"), "No")
- self.assertEqual(self.db.numeric("\U0001012A"), 9000)
- self.assertEqual(self.db.decimal("\U0001D7FD"), 7)
- self.assertEqual(self.db.digit("\U0001D7FD"), 7)
-
def test_main():
test.support.run_unittest(
UnicodeMiscTest,
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
index 3fc499e..52e7749 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
@@ -270,10 +270,9 @@ Content-Type: text/html; charset=iso-8859-1
def test_missing_localfile(self):
# Test for #10836
- with self.assertRaises(urllib.error.URLError) as e:
+ # 3.3 - URLError is not captured, explicit IOError is raised.
+ with self.assertRaises(IOError):
urlopen('file://localhost/a/file/which/doesnot/exists.py')
- self.assertTrue(e.exception.filename)
- self.assertTrue(e.exception.reason)
def test_file_notexists(self):
fd, tmp_file = tempfile.mkstemp()
@@ -286,21 +285,20 @@ Content-Type: text/html; charset=iso-8859-1
os.close(fd)
os.unlink(tmp_file)
self.assertFalse(os.path.exists(tmp_file))
- with self.assertRaises(urllib.error.URLError):
+ # 3.3 - IOError instead of URLError
+ with self.assertRaises(IOError):
urlopen(tmp_fileurl)
def test_ftp_nohost(self):
test_ftp_url = 'ftp:///path'
- with self.assertRaises(urllib.error.URLError) as e:
+ # 3.3 - IOError instead of URLError
+ with self.assertRaises(IOError):
urlopen(test_ftp_url)
- self.assertFalse(e.exception.filename)
- self.assertTrue(e.exception.reason)
def test_ftp_nonexisting(self):
- with self.assertRaises(urllib.error.URLError) as e:
+ # 3.3 - IOError instead of URLError
+ with self.assertRaises(IOError):
urlopen('ftp://localhost/a/file/which/doesnot/exists.py')
- self.assertFalse(e.exception.filename)
- self.assertTrue(e.exception.reason)
def test_userpass_inurl(self):
@@ -333,6 +331,10 @@ Content-Type: text/html; charset=iso-8859-1
finally:
self.unfakehttp()
+ def test_URLopener_deprecation(self):
+ with support.check_warnings(('',DeprecationWarning)):
+ urllib.request.URLopener()
+
class urlretrieve_FileTests(unittest.TestCase):
"""Test urllib.urlretrieve() on local files"""
@@ -366,7 +368,7 @@ class urlretrieve_FileTests(unittest.TestCase):
def constructLocalFileUrl(self, filePath):
filePath = os.path.abspath(filePath)
try:
- filePath.encode("utf8")
+ filePath.encode("utf-8")
except UnicodeEncodeError:
raise unittest.SkipTest("filePath is not encodable to utf8")
return "file://%s" % urllib.request.pathname2url(filePath)
@@ -419,11 +421,11 @@ class urlretrieve_FileTests(unittest.TestCase):
def test_reporthook(self):
# Make sure that the reporthook works.
- def hooktester(count, block_size, total_size, count_holder=[0]):
- self.assertIsInstance(count, int)
- self.assertIsInstance(block_size, int)
- self.assertIsInstance(total_size, int)
- self.assertEqual(count, count_holder[0])
+ def hooktester(block_count, block_read_size, file_size, count_holder=[0]):
+ self.assertIsInstance(block_count, int)
+ self.assertIsInstance(block_read_size, int)
+ self.assertIsInstance(file_size, int)
+ self.assertEqual(block_count, count_holder[0])
count_holder[0] = count_holder[0] + 1
second_temp = "%s.2" % support.TESTFN
self.registerFileForCleanUp(second_temp)
@@ -434,8 +436,8 @@ class urlretrieve_FileTests(unittest.TestCase):
def test_reporthook_0_bytes(self):
# Test on zero length file. Should call reporthook only 1 time.
report = []
- def hooktester(count, block_size, total_size, _report=report):
- _report.append((count, block_size, total_size))
+ def hooktester(block_count, block_read_size, file_size, _report=report):
+ _report.append((block_count, block_read_size, file_size))
srcFileName = self.createNewTempFile()
urllib.request.urlretrieve(self.constructLocalFileUrl(srcFileName),
support.TESTFN, hooktester)
@@ -445,31 +447,32 @@ class urlretrieve_FileTests(unittest.TestCase):
def test_reporthook_5_bytes(self):
# Test on 5 byte file. Should call reporthook only 2 times (once when
# the "network connection" is established and once when the block is
- # read). Since the block size is 8192 bytes, only one block read is
- # required to read the entire file.
+ # read).
report = []
- def hooktester(count, block_size, total_size, _report=report):
- _report.append((count, block_size, total_size))
+ def hooktester(block_count, block_read_size, file_size, _report=report):
+ _report.append((block_count, block_read_size, file_size))
srcFileName = self.createNewTempFile(b"x" * 5)
urllib.request.urlretrieve(self.constructLocalFileUrl(srcFileName),
support.TESTFN, hooktester)
self.assertEqual(len(report), 2)
- self.assertEqual(report[0][1], 8192)
self.assertEqual(report[0][2], 5)
+ self.assertEqual(report[1][2], 5)
def test_reporthook_8193_bytes(self):
# Test on 8193 byte file. Should call reporthook only 3 times (once
# when the "network connection" is established, once for the next 8192
# bytes, and once for the last byte).
report = []
- def hooktester(count, block_size, total_size, _report=report):
- _report.append((count, block_size, total_size))
+ def hooktester(block_count, block_read_size, file_size, _report=report):
+ _report.append((block_count, block_read_size, file_size))
srcFileName = self.createNewTempFile(b"x" * 8193)
urllib.request.urlretrieve(self.constructLocalFileUrl(srcFileName),
support.TESTFN, hooktester)
self.assertEqual(len(report), 3)
- self.assertEqual(report[0][1], 8192)
self.assertEqual(report[0][2], 8193)
+ self.assertEqual(report[0][1], 8192)
+ self.assertEqual(report[1][1], 8192)
+ self.assertEqual(report[2][1], 8192)
class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin):
@@ -1280,6 +1283,28 @@ class URLopener_Tests(unittest.TestCase):
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.close()
+class RequestTests(unittest.TestCase):
+ """Unit tests for urllib.request.Request."""
+
+ def test_default_values(self):
+ Request = urllib.request.Request
+ request = Request("http://www.python.org")
+ self.assertEqual(request.get_method(), 'GET')
+ request = Request("http://www.python.org", {})
+ self.assertEqual(request.get_method(), 'POST')
+
+ def test_with_method_arg(self):
+ Request = urllib.request.Request
+ request = Request("http://www.python.org", method='HEAD')
+ self.assertEqual(request.method, 'HEAD')
+ self.assertEqual(request.get_method(), 'HEAD')
+ request = Request("http://www.python.org", {}, method='HEAD')
+ self.assertEqual(request.method, 'HEAD')
+ self.assertEqual(request.get_method(), 'HEAD')
+ request = Request("http://www.python.org", method='GET')
+ self.assertEqual(request.get_method(), 'GET')
+ request.method = 'HEAD'
+ self.assertEqual(request.get_method(), 'HEAD')
def test_main():
@@ -1296,6 +1321,7 @@ def test_main():
Utility_Tests,
URLopener_Tests,
#FTPWrapperTests,
+ RequestTests,
)
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index 3ace66e..7ae1553 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -5,6 +5,7 @@ import os
import io
import socket
import array
+import sys
import urllib.request
# The proxy bypass method imported below has logic specific to the OSX
@@ -18,6 +19,22 @@ import urllib.error
# parse_keqv_list, parse_http_list, HTTPDigestAuthHandler
class TrivialTests(unittest.TestCase):
+
+ def test___all__(self):
+ # Verify which names are exposed
+ for module in 'request', 'response', 'parse', 'error', 'robotparser':
+ context = {}
+ exec('from urllib.%s import *' % module, context)
+ del context['__builtins__']
+ if module == 'request' and os.name == 'nt':
+ u, p = context.pop('url2pathname'), context.pop('pathname2url')
+ self.assertEqual(u.__module__, 'nturl2path')
+ self.assertEqual(p.__module__, 'nturl2path')
+ for k, v in context.items():
+ self.assertEqual(v.__module__, 'urllib.%s' % module,
+ "%r is exposed in 'urllib.%s' but defined in %r" %
+ (k, module, v.__module__))
+
def test_trivial(self):
# A couple trivial tests
@@ -536,10 +553,6 @@ class OpenerDirectorTests(unittest.TestCase):
self.assertRaises(urllib.error.URLError, o.open, req)
self.assertEqual(o.calls, [(handlers[0], "http_open", (req,), {})])
-## def test_error(self):
-## # XXX this doesn't actually seem to be used in standard library,
-## # but should really be tested anyway...
-
def test_http_error(self):
# XXX http_error_default
# http errors are a special case
@@ -567,6 +580,7 @@ class OpenerDirectorTests(unittest.TestCase):
self.assertEqual((handler, method_name), got[:2])
self.assertEqual(args, got[2])
+
def test_processors(self):
# *_request / *_response methods get called appropriately
o = OpenerDirector()
@@ -602,10 +616,30 @@ class OpenerDirectorTests(unittest.TestCase):
self.assertTrue(args[1] is None or
isinstance(args[1], MockResponse))
+ def test_method_deprecations(self):
+ req = Request("http://www.example.com")
+
+ with self.assertWarns(DeprecationWarning):
+ req.add_data("data")
+ with self.assertWarns(DeprecationWarning):
+ req.get_data()
+ with self.assertWarns(DeprecationWarning):
+ req.has_data()
+ with self.assertWarns(DeprecationWarning):
+ req.get_host()
+ with self.assertWarns(DeprecationWarning):
+ req.get_selector()
+ with self.assertWarns(DeprecationWarning):
+ req.is_unverifiable()
+ with self.assertWarns(DeprecationWarning):
+ req.get_origin_req_host()
+ with self.assertWarns(DeprecationWarning):
+ req.get_type()
+
def sanepathname2url(path):
try:
- path.encode("utf8")
+ path.encode("utf-8")
except UnicodeEncodeError:
raise unittest.SkipTest("path is not encodable to utf8")
urlpath = urllib.request.pathname2url(path)
@@ -957,8 +991,8 @@ class HandlerTests(unittest.TestCase):
newreq = h.http_request(req)
self.assertIs(cj.ach_req, req)
self.assertIs(cj.ach_req, newreq)
- self.assertEqual(req.get_origin_req_host(), "example.com")
- self.assertFalse(req.is_unverifiable())
+ self.assertEqual(req.origin_req_host, "example.com")
+ self.assertFalse(req.unverifiable)
newr = h.http_response(req, r)
self.assertIs(cj.ec_req, req)
self.assertIs(cj.ec_r, r)
@@ -990,7 +1024,7 @@ class HandlerTests(unittest.TestCase):
try:
self.assertEqual(o.req.get_method(), "GET")
except AttributeError:
- self.assertFalse(o.req.has_data())
+ self.assertFalse(o.req.data)
# now it's a GET, there should not be headers regarding content
# (possibly dragged from before being a POST)
@@ -1106,9 +1140,9 @@ class HandlerTests(unittest.TestCase):
handlers = add_ordered_mock_handlers(o, meth_spec)
req = Request("http://acme.example.com/")
- self.assertEqual(req.get_host(), "acme.example.com")
+ self.assertEqual(req.host, "acme.example.com")
r = o.open(req)
- self.assertEqual(req.get_host(), "proxy.example.com:3128")
+ self.assertEqual(req.host, "proxy.example.com:3128")
self.assertEqual([(handlers[0], "http_open")],
[tup[0:2] for tup in o.calls])
@@ -1119,13 +1153,13 @@ class HandlerTests(unittest.TestCase):
ph = urllib.request.ProxyHandler(dict(http="proxy.example.com"))
o.add_handler(ph)
req = Request("http://www.perl.org/")
- self.assertEqual(req.get_host(), "www.perl.org")
+ self.assertEqual(req.host, "www.perl.org")
r = o.open(req)
- self.assertEqual(req.get_host(), "proxy.example.com")
+ self.assertEqual(req.host, "proxy.example.com")
req = Request("http://www.python.org")
- self.assertEqual(req.get_host(), "www.python.org")
+ self.assertEqual(req.host, "www.python.org")
r = o.open(req)
- self.assertEqual(req.get_host(), "www.python.org")
+ self.assertEqual(req.host, "www.python.org")
del os.environ['no_proxy']
def test_proxy_no_proxy_all(self):
@@ -1134,9 +1168,9 @@ class HandlerTests(unittest.TestCase):
ph = urllib.request.ProxyHandler(dict(http="proxy.example.com"))
o.add_handler(ph)
req = Request("http://www.python.org")
- self.assertEqual(req.get_host(), "www.python.org")
+ self.assertEqual(req.host, "www.python.org")
r = o.open(req)
- self.assertEqual(req.get_host(), "www.python.org")
+ self.assertEqual(req.host, "www.python.org")
del os.environ['no_proxy']
@@ -1150,9 +1184,9 @@ class HandlerTests(unittest.TestCase):
handlers = add_ordered_mock_handlers(o, meth_spec)
req = Request("https://www.example.com/")
- self.assertEqual(req.get_host(), "www.example.com")
+ self.assertEqual(req.host, "www.example.com")
r = o.open(req)
- self.assertEqual(req.get_host(), "proxy.example.com:3128")
+ self.assertEqual(req.host, "proxy.example.com:3128")
self.assertEqual([(handlers[0], "https_open")],
[tup[0:2] for tup in o.calls])
@@ -1165,7 +1199,7 @@ class HandlerTests(unittest.TestCase):
req = Request("https://www.example.com/")
req.add_header("Proxy-Authorization","FooBar")
req.add_header("User-Agent","Grail")
- self.assertEqual(req.get_host(), "www.example.com")
+ self.assertEqual(req.host, "www.example.com")
self.assertIsNone(req._tunnel_host)
r = o.open(req)
# Verify Proxy-Authorization gets tunneled to request.
@@ -1176,9 +1210,11 @@ class HandlerTests(unittest.TestCase):
self.assertIn(("User-Agent","Grail"),
https_handler.httpconn.req_headers)
self.assertIsNotNone(req._tunnel_host)
- self.assertEqual(req.get_host(), "proxy.example.com:3128")
+ self.assertEqual(req.host, "proxy.example.com:3128")
self.assertEqual(req.get_header("Proxy-authorization"),"FooBar")
+ # TODO: This should be only for OSX
+ @unittest.skipUnless(sys.platform == 'darwin', "only relevant for OSX")
def test_osx_proxy_bypass(self):
bypass = {
'exclude_simple': False,
@@ -1298,6 +1334,26 @@ class HandlerTests(unittest.TestCase):
# _test_basic_auth called .open() twice)
self.assertEqual(opener.recorded, ["digest", "basic"]*2)
+ def test_unsupported_auth_digest_handler(self):
+ opener = OpenerDirector()
+ # While using DigestAuthHandler
+ digest_auth_handler = urllib.request.HTTPDigestAuthHandler(None)
+ http_handler = MockHTTPHandler(
+ 401, 'WWW-Authenticate: Kerberos\r\n\r\n')
+ opener.add_handler(digest_auth_handler)
+ opener.add_handler(http_handler)
+ self.assertRaises(ValueError,opener.open,"http://www.example.com")
+
+ def test_unsupported_auth_basic_handler(self):
+ # While using BasicAuthHandler
+ opener = OpenerDirector()
+ basic_auth_handler = urllib.request.HTTPBasicAuthHandler(None)
+ http_handler = MockHTTPHandler(
+ 401, 'WWW-Authenticate: NTLM\r\n\r\n')
+ opener.add_handler(basic_auth_handler)
+ opener.add_handler(http_handler)
+ self.assertRaises(ValueError,opener.open,"http://www.example.com")
+
def _test_basic_auth(self, opener, auth_handler, auth_header,
realm, http_handler, password_manager,
request_url, protected_url):
@@ -1335,6 +1391,7 @@ class HandlerTests(unittest.TestCase):
self.assertEqual(len(http_handler.requests), 1)
self.assertFalse(http_handler.requests[0].has_header(auth_header))
+
class MiscTests(unittest.TestCase):
def test_build_opener(self):
@@ -1390,11 +1447,11 @@ class RequestTests(unittest.TestCase):
self.assertEqual("POST", self.post.get_method())
self.assertEqual("GET", self.get.get_method())
- def test_add_data(self):
- self.assertFalse(self.get.has_data())
+ def test_data(self):
+ self.assertFalse(self.get.data)
self.assertEqual("GET", self.get.get_method())
- self.get.add_data("spam")
- self.assertTrue(self.get.has_data())
+ self.get.data = "spam"
+ self.assertTrue(self.get.data)
self.assertEqual("POST", self.get.get_method())
def test_get_full_url(self):
@@ -1402,36 +1459,36 @@ class RequestTests(unittest.TestCase):
self.get.get_full_url())
def test_selector(self):
- self.assertEqual("/~jeremy/", self.get.get_selector())
+ self.assertEqual("/~jeremy/", self.get.selector)
req = Request("http://www.python.org/")
- self.assertEqual("/", req.get_selector())
+ self.assertEqual("/", req.selector)
def test_get_type(self):
- self.assertEqual("http", self.get.get_type())
+ self.assertEqual("http", self.get.type)
def test_get_host(self):
- self.assertEqual("www.python.org", self.get.get_host())
+ self.assertEqual("www.python.org", self.get.host)
def test_get_host_unquote(self):
req = Request("http://www.%70ython.org/")
- self.assertEqual("www.python.org", req.get_host())
+ self.assertEqual("www.python.org", req.host)
def test_proxy(self):
self.assertFalse(self.get.has_proxy())
self.get.set_proxy("www.perl.org", "http")
self.assertTrue(self.get.has_proxy())
- self.assertEqual("www.python.org", self.get.get_origin_req_host())
- self.assertEqual("www.perl.org", self.get.get_host())
+ self.assertEqual("www.python.org", self.get.origin_req_host)
+ self.assertEqual("www.perl.org", self.get.host)
def test_wrapped_url(self):
req = Request("<URL:http://www.python.org>")
- self.assertEqual("www.python.org", req.get_host())
+ self.assertEqual("www.python.org", req.host)
def test_url_fragment(self):
req = Request("http://www.python.org/?qs=query#fragment=true")
- self.assertEqual("/?qs=query", req.get_selector())
+ self.assertEqual("/?qs=query", req.selector)
req = Request("http://www.python.org/#fun=true")
- self.assertEqual("/", req.get_selector())
+ self.assertEqual("/", req.selector)
# Issue 11703: geturl() omits fragment in the original URL.
url = 'http://docs.python.org/library/urllib2.html#OK'
@@ -1443,7 +1500,9 @@ def test_HTTPError_interface():
Issue 13211 reveals that HTTPError didn't implement the URLError
interface even though HTTPError is a subclass of URLError.
- >>> err = urllib.error.HTTPError(msg='something bad happened', url=None, code=None, hdrs=None, fp=None)
+ >>> msg = 'something bad happened'
+ >>> url = code = hdrs = fp = None
+ >>> err = urllib.error.HTTPError(url, code, msg, hdrs, fp)
>>> assert hasattr(err, 'reason')
>>> err.reason
'something bad happened'
diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py
index 9e1ce5b..6ef4200 100644
--- a/Lib/test/test_urllib2_localnet.py
+++ b/Lib/test/test_urllib2_localnet.py
@@ -474,6 +474,13 @@ class TestUrlopen(unittest.TestCase):
self.urlopen("https://localhost:%s/bizarre" % handler.port,
cafile=CERT_fakehostname)
+ def test_https_with_cadefault(self):
+ handler = self.start_https_server(certfile=CERT_localhost)
+ # Self-signed cert should fail verification with system certificate store
+ with self.assertRaises(urllib.error.URLError) as cm:
+ self.urlopen("https://localhost:%s/bizarre" % handler.port,
+ cadefault=True)
+
def test_sending_headers(self):
handler = self.start_server()
req = urllib.request.Request("http://localhost:%s/" % handler.port,
diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py
index e2b1d95..7f3c93a 100644
--- a/Lib/test/test_urllib2net.py
+++ b/Lib/test/test_urllib2net.py
@@ -83,12 +83,13 @@ class CloseSocketTest(unittest.TestCase):
def test_close(self):
# calling .close() on urllib2's response objects should close the
# underlying socket
-
- response = _urlopen_with_retry("http://www.python.org/")
- sock = response.fp
- self.assertTrue(not sock.closed)
- response.close()
- self.assertTrue(sock.closed)
+ url = "http://www.python.org/"
+ with support.transient_internet(url):
+ response = _urlopen_with_retry(url)
+ sock = response.fp
+ self.assertTrue(not sock.closed)
+ response.close()
+ self.assertTrue(sock.closed)
class OtherNetworkTests(unittest.TestCase):
def setUp(self):
diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py
index 383b2af..d3fe69d 100644
--- a/Lib/test/test_urllibnet.py
+++ b/Lib/test/test_urllibnet.py
@@ -137,10 +137,10 @@ class urlretrieveNetworkTests(unittest.TestCase):
"""Tests urllib.request.urlretrieve using the network."""
@contextlib.contextmanager
- def urlretrieve(self, *args):
+ def urlretrieve(self, *args, **kwargs):
resource = args[0]
with support.transient_internet(resource):
- file_location, info = urllib.request.urlretrieve(*args)
+ file_location, info = urllib.request.urlretrieve(*args, **kwargs)
try:
yield file_location, info
finally:
@@ -170,9 +170,10 @@ class urlretrieveNetworkTests(unittest.TestCase):
self.assertIsInstance(info, email.message.Message,
"info is not an instance of email.message.Message")
+ logo = "http://www.python.org/community/logos/python-logo-master-v3-TM.png"
+
def test_data_header(self):
- logo = "http://www.python.org/community/logos/python-logo-master-v3-TM.png"
- with self.urlretrieve(logo) as (file_location, fileheaders):
+ with self.urlretrieve(self.logo) as (file_location, fileheaders):
datevalue = fileheaders.get('Date')
dateformat = '%a, %d %b %Y %H:%M:%S GMT'
try:
@@ -180,6 +181,31 @@ class urlretrieveNetworkTests(unittest.TestCase):
except ValueError:
self.fail('Date value not in %r format', dateformat)
+ def test_reporthook(self):
+ records = []
+ def recording_reporthook(blocks, block_size, total_size):
+ records.append((blocks, block_size, total_size))
+
+ with self.urlretrieve(self.logo, reporthook=recording_reporthook) as (
+ file_location, fileheaders):
+ expected_size = int(fileheaders['Content-Length'])
+
+ records_repr = repr(records) # For use in error messages.
+ self.assertGreater(len(records), 1, msg="There should always be two "
+ "calls; the first one before the transfer starts.")
+ self.assertEqual(records[0][0], 0)
+ self.assertGreater(records[0][1], 0,
+ msg="block size can't be 0 in %s" % records_repr)
+ self.assertEqual(records[0][2], expected_size)
+ self.assertEqual(records[-1][2], expected_size)
+
+ block_sizes = {block_size for _, block_size, _ in records}
+ self.assertEqual({records[0][1]}, block_sizes,
+ msg="block sizes in %s must be equal" % records_repr)
+ self.assertGreaterEqual(records[-1][0]*records[0][1], expected_size,
+ msg="number of blocks * block size must be"
+ " >= total size in %s" % records_repr)
+
def test_main():
support.requires('network')
diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py
index 868ed24..6381070 100644
--- a/Lib/test/test_userlist.py
+++ b/Lib/test/test_userlist.py
@@ -52,6 +52,12 @@ class UserListTest(list_tests.CommonTest):
return str(key) + '!!!'
self.assertEqual(next(iter(T((1,2)))), "0!!!")
+ def test_userlist_copy(self):
+ u = self.type2test([6, 8, 1, 9, 1])
+ v = u.copy()
+ self.assertEqual(u, v)
+ self.assertEqual(type(u), type(v))
+
def test_main():
support.run_unittest(UserListTest)
diff --git a/Lib/test/test_userstring.py b/Lib/test/test_userstring.py
index 7a8b932..d5d0c89 100755
--- a/Lib/test/test_userstring.py
+++ b/Lib/test/test_userstring.py
@@ -17,11 +17,11 @@ class UserStringTest(
# Overwrite the three testing methods, because UserString
# can't cope with arguments propagated to UserString
# (and we don't test with subclasses)
- def checkequal(self, result, object, methodname, *args):
+ def checkequal(self, result, object, methodname, *args, **kwargs):
result = self.fixtype(result)
object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it
- realresult = getattr(object, methodname)(*args)
+ realresult = getattr(object, methodname)(*args, **kwargs)
self.assertEqual(
result,
realresult
diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py
index 43fa656..7bc59ed 100644
--- a/Lib/test/test_uuid.py
+++ b/Lib/test/test_uuid.py
@@ -471,14 +471,14 @@ class TestUUID(TestCase):
if pid == 0:
os.close(fds[0])
value = uuid.uuid4()
- os.write(fds[1], value.hex.encode('latin1'))
+ os.write(fds[1], value.hex.encode('latin-1'))
os._exit(0)
else:
os.close(fds[1])
parent_value = uuid.uuid4().hex
os.waitpid(pid, 0)
- child_value = os.read(fds[0], 100).decode('latin1')
+ child_value = os.read(fds[0], 100).decode('latin-1')
self.assertNotEqual(parent_value, child_value)
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
new file mode 100644
index 0000000..9696844
--- /dev/null
+++ b/Lib/test/test_venv.py
@@ -0,0 +1,203 @@
+"""
+Test harness for the venv module.
+
+Copyright (C) 2011-2012 Vinay Sajip.
+Licensed to the PSF under a contributor agreement.
+"""
+
+import os
+import os.path
+import shutil
+import subprocess
+import sys
+import tempfile
+from test.support import (captured_stdout, captured_stderr, run_unittest,
+ can_symlink)
+import unittest
+import venv
+
+class BaseTest(unittest.TestCase):
+ """Base class for venv tests."""
+
+ def setUp(self):
+ self.env_dir = os.path.realpath(tempfile.mkdtemp())
+ if os.name == 'nt':
+ self.bindir = 'Scripts'
+ self.pydocname = 'pydoc.py'
+ self.lib = ('Lib',)
+ self.include = 'Include'
+ else:
+ self.bindir = 'bin'
+ self.pydocname = 'pydoc'
+ self.lib = ('lib', 'python%s' % sys.version[:3])
+ self.include = 'include'
+ if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in os.environ:
+ executable = os.environ['__PYVENV_LAUNCHER__']
+ else:
+ executable = sys.executable
+ self.exe = os.path.split(executable)[-1]
+
+ def tearDown(self):
+ shutil.rmtree(self.env_dir)
+
+ def run_with_capture(self, func, *args, **kwargs):
+ with captured_stdout() as output:
+ with captured_stderr() as error:
+ func(*args, **kwargs)
+ return output.getvalue(), error.getvalue()
+
+ def get_env_file(self, *args):
+ return os.path.join(self.env_dir, *args)
+
+ def get_text_file_contents(self, *args):
+ with open(self.get_env_file(*args), 'r') as f:
+ result = f.read()
+ return result
+
+class BasicTest(BaseTest):
+ """Test venv module functionality."""
+
+ def isdir(self, *args):
+ fn = self.get_env_file(*args)
+ self.assertTrue(os.path.isdir(fn))
+
+ def test_defaults(self):
+ """
+ Test the create function with default arguments.
+ """
+ shutil.rmtree(self.env_dir)
+ self.run_with_capture(venv.create, self.env_dir)
+ self.isdir(self.bindir)
+ self.isdir(self.include)
+ self.isdir(*self.lib)
+ data = self.get_text_file_contents('pyvenv.cfg')
+ if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
+ in os.environ):
+ executable = os.environ['__PYVENV_LAUNCHER__']
+ else:
+ executable = sys.executable
+ path = os.path.dirname(executable)
+ self.assertIn('home = %s' % path, data)
+ data = self.get_text_file_contents(self.bindir, self.pydocname)
+ self.assertTrue(data.startswith('#!%s%s' % (self.env_dir, os.sep)))
+ fn = self.get_env_file(self.bindir, self.exe)
+ if not os.path.exists(fn): # diagnostics for Windows buildbot failures
+ bd = self.get_env_file(self.bindir)
+ print('Contents of %r:' % bd)
+ print(' %r' % os.listdir(bd))
+ self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn)
+
+ @unittest.skipIf(sys.prefix != sys.base_prefix, 'Test not appropriate '
+ 'in a venv')
+ def test_prefixes(self):
+ """
+ Test that the prefix values are as expected.
+ """
+ #check our prefixes
+ self.assertEqual(sys.base_prefix, sys.prefix)
+ self.assertEqual(sys.base_exec_prefix, sys.exec_prefix)
+
+ # check a venv's prefixes
+ shutil.rmtree(self.env_dir)
+ self.run_with_capture(venv.create, self.env_dir)
+ envpy = os.path.join(self.env_dir, self.bindir, self.exe)
+ cmd = [envpy, '-c', None]
+ for prefix, expected in (
+ ('prefix', self.env_dir),
+ ('prefix', self.env_dir),
+ ('base_prefix', sys.prefix),
+ ('base_exec_prefix', sys.exec_prefix)):
+ cmd[2] = 'import sys; print(sys.%s)' % prefix
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ self.assertEqual(out.strip(), expected.encode())
+
+ def test_overwrite_existing(self):
+ """
+ Test control of overwriting an existing environment directory.
+ """
+ self.assertRaises(ValueError, venv.create, self.env_dir)
+ builder = venv.EnvBuilder(clear=True)
+ builder.create(self.env_dir)
+
+ def test_upgrade(self):
+ """
+ Test upgrading an existing environment directory.
+ """
+ builder = venv.EnvBuilder(upgrade=True)
+ self.run_with_capture(builder.create, self.env_dir)
+ self.isdir(self.bindir)
+ self.isdir(self.include)
+ self.isdir(*self.lib)
+ fn = self.get_env_file(self.bindir, self.exe)
+ if not os.path.exists(fn): # diagnostics for Windows buildbot failures
+ bd = self.get_env_file(self.bindir)
+ print('Contents of %r:' % bd)
+ print(' %r' % os.listdir(bd))
+ self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn)
+
+ def test_isolation(self):
+ """
+ Test isolation from system site-packages
+ """
+ for ssp, s in ((True, 'true'), (False, 'false')):
+ builder = venv.EnvBuilder(clear=True, system_site_packages=ssp)
+ builder.create(self.env_dir)
+ data = self.get_text_file_contents('pyvenv.cfg')
+ self.assertIn('include-system-site-packages = %s\n' % s, data)
+
+ @unittest.skipUnless(can_symlink(), 'Needs symlinks')
+ def test_symlinking(self):
+ """
+ Test symlinking works as expected
+ """
+ for usl in (False, True):
+ builder = venv.EnvBuilder(clear=True, symlinks=usl)
+ builder.create(self.env_dir)
+ fn = self.get_env_file(self.bindir, self.exe)
+ # Don't test when False, because e.g. 'python' is always
+ # symlinked to 'python3.3' in the env, even when symlinking in
+ # general isn't wanted.
+ if usl:
+ self.assertTrue(os.path.islink(fn))
+
+ # If a venv is created from a source build and that venv is used to
+ # run the test, the pyvenv.cfg in the venv created in the test will
+ # point to the venv being used to run the test, and we lose the link
+ # to the source build - so Python can't initialise properly.
+ @unittest.skipIf(sys.prefix != sys.base_prefix, 'Test not appropriate '
+ 'in a venv')
+ def test_executable(self):
+ """
+ Test that the sys.executable value is as expected.
+ """
+ shutil.rmtree(self.env_dir)
+ self.run_with_capture(venv.create, self.env_dir)
+ envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe)
+ cmd = [envpy, '-c', 'import sys; print(sys.executable)']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ self.assertEqual(out.strip(), envpy.encode())
+
+ @unittest.skipUnless(can_symlink(), 'Needs symlinks')
+ def test_executable_symlinks(self):
+ """
+ Test that the sys.executable value is as expected.
+ """
+ shutil.rmtree(self.env_dir)
+ builder = venv.EnvBuilder(clear=True, symlinks=True)
+ builder.create(self.env_dir)
+ envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe)
+ cmd = [envpy, '-c', 'import sys; print(sys.executable)']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ self.assertEqual(out.strip(), envpy.encode())
+
+def test_main():
+ run_unittest(BasicTest)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py
index 786e60b..bd06c8d 100644
--- a/Lib/test/test_wait3.py
+++ b/Lib/test/test_wait3.py
@@ -19,13 +19,16 @@ except AttributeError:
class Wait3Test(ForkWait):
def wait_impl(self, cpid):
- for i in range(10):
+ # This many iterations can be required, since some previously run
+ # tests (e.g. test_ctypes) could have spawned a lot of children
+ # very quickly.
+ for i in range(30):
# wait3() shouldn't hang, but some of the buildbots seem to hang
# in the forking tests. This is an attempt to fix the problem.
spid, status, rusage = os.wait3(os.WNOHANG)
if spid == cpid:
break
- time.sleep(1.0)
+ time.sleep(0.1)
self.assertEqual(spid, cpid)
self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index 79be835..953b282 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -512,12 +512,11 @@ class _WarningsTests(BaseTest):
def test_showwarning_not_callable(self):
with original_warnings.catch_warnings(module=self.module):
self.module.filterwarnings("always", category=UserWarning)
- old_showwarning = self.module.showwarning
+ self.module.showwarning = print
+ with support.captured_output('stdout'):
+ self.module.warn('Warning!')
self.module.showwarning = 23
- try:
- self.assertRaises(TypeError, self.module.warn, "Warning!")
- finally:
- self.module.showwarning = old_showwarning
+ self.assertRaises(TypeError, self.module.warn, "Warning!")
def test_show_warning_output(self):
# With showarning() missing, make sure that output is okay.
@@ -547,10 +546,13 @@ class _WarningsTests(BaseTest):
globals_dict = globals()
oldfile = globals_dict['__file__']
try:
- with original_warnings.catch_warnings(module=self.module) as w:
+ catch = original_warnings.catch_warnings(record=True,
+ module=self.module)
+ with catch as w:
self.module.filterwarnings("always", category=UserWarning)
globals_dict['__file__'] = None
original_warnings.warn('test', UserWarning)
+ self.assertTrue(len(w))
finally:
globals_dict['__file__'] = oldfile
diff --git a/Lib/test/test_webbrowser.py b/Lib/test/test_webbrowser.py
new file mode 100644
index 0000000..34b9364
--- /dev/null
+++ b/Lib/test/test_webbrowser.py
@@ -0,0 +1,192 @@
+import webbrowser
+import unittest
+import subprocess
+from unittest import mock
+from test import support
+
+
+URL = 'http://www.example.com'
+CMD_NAME = 'test'
+
+
+class PopenMock(mock.MagicMock):
+
+ def poll(self):
+ return 0
+
+ def wait(self, seconds=None):
+ return 0
+
+
+class CommandTestMixin:
+
+ def _test(self, meth, *, args=[URL], kw={}, options, arguments):
+ """Given a web browser instance method name along with arguments and
+ keywords for same (which defaults to the single argument URL), creates
+ a browser instance from the class pointed to by self.browser, calls the
+ indicated instance method with the indicated arguments, and compares
+ the resulting options and arguments passed to Popen by the browser
+ instance against the 'options' and 'args' lists. Options are compared
+ in a position independent fashion, and the arguments are compared in
+ sequence order to whatever is left over after removing the options.
+
+ """
+ popen = PopenMock()
+ support.patch(self, subprocess, 'Popen', popen)
+ browser = self.browser_class(name=CMD_NAME)
+ getattr(browser, meth)(*args, **kw)
+ popen_args = subprocess.Popen.call_args[0][0]
+ self.assertEqual(popen_args[0], CMD_NAME)
+ popen_args.pop(0)
+ for option in options:
+ self.assertIn(option, popen_args)
+ popen_args.pop(popen_args.index(option))
+ self.assertEqual(popen_args, arguments)
+
+
+class GenericBrowserCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.GenericBrowser
+
+ def test_open(self):
+ self._test('open',
+ options=[],
+ arguments=[URL])
+
+
+class BackgroundBrowserCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.BackgroundBrowser
+
+ def test_open(self):
+ self._test('open',
+ options=[],
+ arguments=[URL])
+
+
+class ChromeCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.Chrome
+
+ def test_open(self):
+ self._test('open',
+ options=[],
+ arguments=[URL])
+
+ def test_open_with_autoraise_false(self):
+ self._test('open', kw=dict(autoraise=False),
+ options=[],
+ arguments=[URL])
+
+ def test_open_new(self):
+ self._test('open_new',
+ options=['--new-window'],
+ arguments=[URL])
+
+ def test_open_new_tab(self):
+ self._test('open_new_tab',
+ options=[],
+ arguments=[URL])
+
+
+class MozillaCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.Mozilla
+
+ def test_open(self):
+ self._test('open',
+ options=['-raise', '-remote'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_with_autoraise_false(self):
+ self._test('open', kw=dict(autoraise=False),
+ options=['-noraise', '-remote'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_new(self):
+ self._test('open_new',
+ options=['-raise', '-remote'],
+ arguments=['openURL({},new-window)'.format(URL)])
+
+ def test_open_new_tab(self):
+ self._test('open_new_tab',
+ options=['-raise', '-remote'],
+ arguments=['openURL({},new-tab)'.format(URL)])
+
+
+class GaleonCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.Galeon
+
+ def test_open(self):
+ self._test('open',
+ options=['-n'],
+ arguments=[URL])
+
+ def test_open_with_autoraise_false(self):
+ self._test('open', kw=dict(autoraise=False),
+ options=['-noraise', '-n'],
+ arguments=[URL])
+
+ def test_open_new(self):
+ self._test('open_new',
+ options=['-w'],
+ arguments=[URL])
+
+ def test_open_new_tab(self):
+ self._test('open_new_tab',
+ options=['-w'],
+ arguments=[URL])
+
+
+class OperaCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.Opera
+
+ def test_open(self):
+ self._test('open',
+ options=['-remote'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_with_autoraise_false(self):
+ self._test('open', kw=dict(autoraise=False),
+ options=['-remote', '-noraise'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_new(self):
+ self._test('open_new',
+ options=['-remote'],
+ arguments=['openURL({},new-window)'.format(URL)])
+
+ def test_open_new(self):
+ self._test('open_new_tab',
+ options=['-remote'],
+ arguments=['openURL({},new-page)'.format(URL)])
+
+
+class ELinksCommandTest(CommandTestMixin, unittest.TestCase):
+
+ browser_class = webbrowser.Elinks
+
+ def test_open(self):
+ self._test('open', options=['-remote'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_with_autoraise_false(self):
+ self._test('open',
+ options=['-remote'],
+ arguments=['openURL({})'.format(URL)])
+
+ def test_open_new(self):
+ self._test('open_new',
+ options=['-remote'],
+ arguments=['openURL({},new-window)'.format(URL)])
+
+ def test_open_new_tab(self):
+ self._test('open_new_tab',
+ options=['-remote'],
+ arguments=['openURL({},new-tab)'.format(URL)])
+
+
+if __name__=='__main__':
+ unittest.main()
diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py
index 34c3dea..eb7f75f 100644
--- a/Lib/test/test_winsound.py
+++ b/Lib/test/test_winsound.py
@@ -16,16 +16,12 @@ def has_sound(sound):
try:
# Ask the mixer API for the number of devices it knows about.
# When there are no devices, PlaySound will fail.
- if ctypes.windll.winmm.mixerGetNumDevs() is 0:
+ if ctypes.windll.winmm.mixerGetNumDevs() == 0:
return False
key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER,
"AppEvents\Schemes\Apps\.Default\{0}\.Default".format(sound))
- value = winreg.EnumValue(key, 0)[1]
- if value is not "":
- return True
- else:
- return False
+ return winreg.EnumValue(key, 0)[1] != ""
except WindowsError:
return False
diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py
index 08f8d9a..05c1f4f 100644
--- a/Lib/test/test_wsgiref.py
+++ b/Lib/test/test_wsgiref.py
@@ -9,6 +9,8 @@ from wsgiref.simple_server import WSGIServer, WSGIRequestHandler, demo_app
from wsgiref.simple_server import make_server
from io import StringIO, BytesIO, BufferedReader
from socketserver import BaseServer
+from platform import python_implementation
+
import os
import re
import sys
@@ -100,9 +102,11 @@ def compare_generic_iter(make_it,match):
class IntegrationTests(TestCase):
def check_hello(self, out, has_length=True):
+ pyver = (python_implementation() + "/" +
+ sys.version.split()[0])
self.assertEqual(out,
("HTTP/1.0 200 OK\r\n"
- "Server: WSGIServer/0.2 Python/"+sys.version.split()[0]+"\r\n"
+ "Server: WSGIServer/0.2 " + pyver +"\r\n"
"Content-Type: text/plain\r\n"
"Date: Mon, 05 Jun 2006 18:49:54 GMT\r\n" +
(has_length and "Content-Length: 13\r\n" or "") +
@@ -156,9 +160,11 @@ class IntegrationTests(TestCase):
out, err = run_amock(validator(app))
self.assertTrue(err.endswith('"GET / HTTP/1.0" 200 4\n'))
ver = sys.version.split()[0].encode('ascii')
+ py = python_implementation().encode('ascii')
+ pyver = py + b"/" + ver
self.assertEqual(
b"HTTP/1.0 200 OK\r\n"
- b"Server: WSGIServer/0.2 Python/" + ver + b"\r\n"
+ b"Server: WSGIServer/0.2 "+ pyver + b"\r\n"
b"Content-Type: text/plain; charset=utf-8\r\n"
b"Date: Wed, 24 Dec 2008 13:29:32 GMT\r\n"
b"\r\n"
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 3092f3b..9cebc3c 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -1,28 +1,34 @@
# xml.etree test. This file contains enough tests to make sure that
# all included components work as they should.
# Large parts are extracted from the upstream test suite.
-
-# IMPORTANT: the same doctests are run from "test_xml_etree_c" in
-# order to ensure consistency between the C implementation and the
-# Python implementation.
+#
+# PLEASE write all new tests using the standard unittest infrastructure and
+# not doctest.
+#
+# IMPORTANT: the same tests are run from "test_xml_etree_c" in order
+# to ensure consistency between the C implementation and the Python
+# implementation.
#
# For this purpose, the module-level "ET" symbol is temporarily
# monkey-patched when running the "test_xml_etree_c" test suite.
# Don't re-import "xml.etree.ElementTree" module in the docstring,
# except if the test is specific to the Python implementation.
-import sys
import html
+import io
+import sys
import unittest
+import weakref
from test import support
-from test.support import findfile
+from test.support import TESTFN, findfile, unlink, import_fresh_module, gc_collect
-from xml.etree import ElementTree as ET
+pyET = None
+ET = None
SIMPLE_XMLFILE = findfile("simple.xml", subdir="xmltestdata")
try:
- SIMPLE_XMLFILE.encode("utf8")
+ SIMPLE_XMLFILE.encode("utf-8")
except UnicodeEncodeError:
raise unittest.SkipTest("filename is not encodable to utf8")
SIMPLE_NS_XMLFILE = findfile("simple-ns.xml", subdir="xmltestdata")
@@ -57,6 +63,22 @@ SAMPLE_XML_NS = """
</body>
"""
+SAMPLE_XML_NS_ELEMS = """
+<root>
+<h:table xmlns:h="hello">
+ <h:tr>
+ <h:td>Apples</h:td>
+ <h:td>Bananas</h:td>
+ </h:tr>
+</h:table>
+
+<f:table xmlns:f="foo">
+ <f:name>African Coffee Table</f:name>
+ <f:width>80</f:width>
+ <f:length>120</f:length>
+</f:table>
+</root>
+"""
def sanity():
"""
@@ -188,10 +210,8 @@ def interface():
These methods return an iterable. See bug 6472.
- >>> check_method(element.iter("tag").__next__)
>>> check_method(element.iterfind("tag").__next__)
>>> check_method(element.iterfind("*").__next__)
- >>> check_method(tree.iter("tag").__next__)
>>> check_method(tree.iterfind("tag").__next__)
>>> check_method(tree.iterfind("*").__next__)
@@ -270,42 +290,6 @@ def cdata():
'<tag>hello</tag>'
"""
-# Only with Python implementation
-def simplefind():
- """
- Test find methods using the elementpath fallback.
-
- >>> from xml.etree import ElementTree
-
- >>> CurrentElementPath = ElementTree.ElementPath
- >>> ElementTree.ElementPath = ElementTree._SimpleElementPath()
- >>> elem = ElementTree.XML(SAMPLE_XML)
- >>> elem.find("tag").tag
- 'tag'
- >>> ElementTree.ElementTree(elem).find("tag").tag
- 'tag'
- >>> elem.findtext("tag")
- 'text'
- >>> elem.findtext("tog")
- >>> elem.findtext("tog", "default")
- 'default'
- >>> ElementTree.ElementTree(elem).findtext("tag")
- 'text'
- >>> summarize_list(elem.findall("tag"))
- ['tag', 'tag']
- >>> summarize_list(elem.findall(".//tag"))
- ['tag', 'tag', 'tag']
-
- Path syntax doesn't work in this case.
-
- >>> elem.find("section/tag")
- >>> elem.findtext("section/tag")
- >>> summarize_list(elem.findall("section/tag"))
- []
-
- >>> ElementTree.ElementPath = CurrentElementPath
- """
-
def find():
"""
Test find methods (including xpath syntax).
@@ -460,17 +444,19 @@ def path_cache():
"""
Check that the path cache behaves sanely.
+ >>> from xml.etree import ElementPath
+
>>> elem = ET.XML(SAMPLE_XML)
>>> for i in range(10): ET.ElementTree(elem).find('./'+str(i))
- >>> cache_len_10 = len(ET.ElementPath._cache)
+ >>> cache_len_10 = len(ElementPath._cache)
>>> for i in range(10): ET.ElementTree(elem).find('./'+str(i))
- >>> len(ET.ElementPath._cache) == cache_len_10
+ >>> len(ElementPath._cache) == cache_len_10
True
>>> for i in range(20): ET.ElementTree(elem).find('./'+str(i))
- >>> len(ET.ElementPath._cache) > cache_len_10
+ >>> len(ElementPath._cache) > cache_len_10
True
>>> for i in range(600): ET.ElementTree(elem).find('./'+str(i))
- >>> len(ET.ElementPath._cache) < 500
+ >>> len(ElementPath._cache) < 500
True
"""
@@ -902,65 +888,6 @@ def check_encoding(encoding):
"""
ET.XML("<?xml version='1.0' encoding='%s'?><xml />" % encoding)
-def encoding():
- r"""
- Test encoding issues.
-
- >>> elem = ET.Element("tag")
- >>> elem.text = "abc"
- >>> serialize(elem)
- '<tag>abc</tag>'
- >>> serialize(elem, encoding="utf-8")
- b'<tag>abc</tag>'
- >>> serialize(elem, encoding="us-ascii")
- b'<tag>abc</tag>'
- >>> serialize(elem, encoding="iso-8859-1")
- b"<?xml version='1.0' encoding='iso-8859-1'?>\n<tag>abc</tag>"
-
- >>> elem.text = "<&\"\'>"
- >>> serialize(elem)
- '<tag>&lt;&amp;"\'&gt;</tag>'
- >>> serialize(elem, encoding="utf-8")
- b'<tag>&lt;&amp;"\'&gt;</tag>'
- >>> serialize(elem, encoding="us-ascii") # cdata characters
- b'<tag>&lt;&amp;"\'&gt;</tag>'
- >>> serialize(elem, encoding="iso-8859-1")
- b'<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag>&lt;&amp;"\'&gt;</tag>'
-
- >>> elem.attrib["key"] = "<&\"\'>"
- >>> elem.text = None
- >>> serialize(elem)
- '<tag key="&lt;&amp;&quot;\'&gt;" />'
- >>> serialize(elem, encoding="utf-8")
- b'<tag key="&lt;&amp;&quot;\'&gt;" />'
- >>> serialize(elem, encoding="us-ascii")
- b'<tag key="&lt;&amp;&quot;\'&gt;" />'
- >>> serialize(elem, encoding="iso-8859-1")
- b'<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="&lt;&amp;&quot;\'&gt;" />'
-
- >>> elem.text = '\xe5\xf6\xf6<>'
- >>> elem.attrib.clear()
- >>> serialize(elem)
- '<tag>\xe5\xf6\xf6&lt;&gt;</tag>'
- >>> serialize(elem, encoding="utf-8")
- b'<tag>\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;</tag>'
- >>> serialize(elem, encoding="us-ascii")
- b'<tag>&#229;&#246;&#246;&lt;&gt;</tag>'
- >>> serialize(elem, encoding="iso-8859-1")
- b"<?xml version='1.0' encoding='iso-8859-1'?>\n<tag>\xe5\xf6\xf6&lt;&gt;</tag>"
-
- >>> elem.attrib["key"] = '\xe5\xf6\xf6<>'
- >>> elem.text = None
- >>> serialize(elem)
- '<tag key="\xe5\xf6\xf6&lt;&gt;" />'
- >>> serialize(elem, encoding="utf-8")
- b'<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;" />'
- >>> serialize(elem, encoding="us-ascii")
- b'<tag key="&#229;&#246;&#246;&lt;&gt;" />'
- >>> serialize(elem, encoding="iso-8859-1")
- b'<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="\xe5\xf6\xf6&lt;&gt;" />'
- """
-
def methods():
r"""
Test serialization methods.
@@ -979,36 +906,6 @@ def methods():
'1 < 2\n'
"""
-def iterators():
- """
- Test iterators.
-
- >>> e = ET.XML("<html><body>this is a <i>paragraph</i>.</body>..</html>")
- >>> summarize_list(e.iter())
- ['html', 'body', 'i']
- >>> summarize_list(e.find("body").iter())
- ['body', 'i']
- >>> summarize(next(e.iter()))
- 'html'
- >>> "".join(e.itertext())
- 'this is a paragraph...'
- >>> "".join(e.find("body").itertext())
- 'this is a paragraph.'
- >>> next(e.itertext())
- 'this is a '
-
- Method iterparse should return an iterator. See bug 6472.
-
- >>> sourcefile = serialize(e, to_string=False)
- >>> next(ET.iterparse(sourcefile)) # doctest: +ELLIPSIS
- ('end', <Element 'i' at 0x...>)
-
- >>> tree = ET.ElementTree(None)
- >>> tree.iter()
- Traceback (most recent call last):
- AttributeError: 'NoneType' object has no attribute 'iter'
- """
-
ENTITY_XML = """\
<!DOCTYPE points [
<!ENTITY % user-entities SYSTEM 'user-entities.xml'>
@@ -1049,26 +946,6 @@ def entity():
'<document>text</document>'
"""
-def error(xml):
- """
-
- Test error handling.
-
- >>> issubclass(ET.ParseError, SyntaxError)
- True
- >>> error("foo").position
- (1, 0)
- >>> error("<tag>&foo;</tag>").position
- (1, 5)
- >>> error("foobar<").position
- (1, 6)
-
- """
- try:
- ET.XML(xml)
- except ET.ParseError:
- return sys.exc_info()[1]
-
def namespace():
"""
Test namespace issues.
@@ -1256,8 +1133,8 @@ def processinginstruction():
>>> ET.tostring(ET.PI('test', '<testing&>'))
b'<?test <testing&>?>'
- >>> ET.tostring(ET.PI('test', '<testing&>\xe3'), 'latin1')
- b"<?xml version='1.0' encoding='latin1'?>\\n<?test <testing&>\\xe3?>"
+ >>> ET.tostring(ET.PI('test', '<testing&>\xe3'), 'latin-1')
+ b"<?xml version='1.0' encoding='latin-1'?>\\n<?test <testing&>\\xe3?>"
"""
#
@@ -1336,21 +1213,20 @@ XINCLUDE["default.xml"] = """\
</document>
""".format(html.escape(SIMPLE_XMLFILE, True))
+
def xinclude_loader(href, parse="xml", encoding=None):
try:
data = XINCLUDE[href]
except KeyError:
- raise IOError("resource not found")
+ raise OSError("resource not found")
if parse == "xml":
- from xml.etree.ElementTree import XML
- return XML(data)
+ data = ET.XML(data)
return data
def xinclude():
r"""
Basic inclusion example (XInclude C.1)
- >>> from xml.etree import ElementTree as ET
>>> from xml.etree import ElementInclude
>>> document = xinclude_loader("C1.xml")
@@ -1405,26 +1281,10 @@ def xinclude():
>>> document = xinclude_loader("C5.xml")
>>> ElementInclude.include(document, xinclude_loader)
Traceback (most recent call last):
- IOError: resource not found
+ OSError: resource not found
>>> # print(serialize(document)) # C5
"""
-def xinclude_default():
- """
- >>> from xml.etree import ElementInclude
-
- >>> document = xinclude_loader("default.xml")
- >>> ElementInclude.include(document)
- >>> print(serialize(document)) # default
- <document>
- <p>Example.</p>
- <root>
- <element key="value">text</element>
- <element>text</element>tail
- <empty-element />
- </root>
- </document>
- """
#
# badly formatted xi:include tags
@@ -1612,7 +1472,7 @@ def bug_xmltoolkit55():
class ExceptionFile:
def read(self, x):
- raise IOError
+ raise OSError
def xmltoolkit60():
"""
@@ -1620,7 +1480,7 @@ def xmltoolkit60():
Handle crash in stream source.
>>> tree = ET.parse(ExceptionFile())
Traceback (most recent call last):
- IOError
+ OSError
"""
@@ -1851,25 +1711,706 @@ def check_issue10777():
>>> ET.register_namespace('test10777', 'http://myuri/')
"""
-def check_html_empty_elems_serialization(self):
- # issue 15970
- # from http://www.w3.org/TR/html401/index/elements.html
- """
+# --------------------------------------------------------------------
- >>> empty_elems = ['AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'FRAME', 'HR',
- ... 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM']
- >>> elems = ''.join('<%s />' % elem for elem in empty_elems)
- >>> serialize(ET.XML('<html>%s</html>' % elems), method='html')
- '<html><AREA><BASE><BASEFONT><BR><COL><FRAME><HR><IMG><INPUT><ISINDEX><LINK><META><PARAM></html>'
- >>> serialize(ET.XML('<html>%s</html>' % elems.lower()), method='html')
- '<html><area><base><basefont><br><col><frame><hr><img><input><isindex><link><meta><param></html>'
- >>> elems = ''.join('<%s></%s>' % (elem, elem) for elem in empty_elems)
- >>> serialize(ET.XML('<html>%s</html>' % elems), method='html')
- '<html><AREA><BASE><BASEFONT><BR><COL><FRAME><HR><IMG><INPUT><ISINDEX><LINK><META><PARAM></html>'
- >>> serialize(ET.XML('<html>%s</html>' % elems.lower()), method='html')
- '<html><area><base><basefont><br><col><frame><hr><img><input><isindex><link><meta><param></html>'
- """
+class BasicElementTest(unittest.TestCase):
+ def test_augmentation_type_errors(self):
+ e = ET.Element('joe')
+ self.assertRaises(TypeError, e.append, 'b')
+ self.assertRaises(TypeError, e.extend, [ET.Element('bar'), 'foo'])
+ self.assertRaises(TypeError, e.insert, 0, 'foo')
+
+ def test_cyclic_gc(self):
+ class Dummy:
+ pass
+
+ # Test the shortest cycle: d->element->d
+ d = Dummy()
+ d.dummyref = ET.Element('joe', attr=d)
+ wref = weakref.ref(d)
+ del d
+ gc_collect()
+ self.assertIsNone(wref())
+
+ # A longer cycle: d->e->e2->d
+ e = ET.Element('joe')
+ d = Dummy()
+ d.dummyref = e
+ wref = weakref.ref(d)
+ e2 = ET.SubElement(e, 'foo', attr=d)
+ del d, e, e2
+ gc_collect()
+ self.assertIsNone(wref())
+
+ # A cycle between Element objects as children of one another
+ # e1->e2->e3->e1
+ e1 = ET.Element('e1')
+ e2 = ET.Element('e2')
+ e3 = ET.Element('e3')
+ e1.append(e2)
+ e2.append(e2)
+ e3.append(e1)
+ wref = weakref.ref(e1)
+ del e1, e2, e3
+ gc_collect()
+ self.assertIsNone(wref())
+
+ def test_weakref(self):
+ flag = False
+ def wref_cb(w):
+ nonlocal flag
+ flag = True
+ e = ET.Element('e')
+ wref = weakref.ref(e, wref_cb)
+ self.assertEqual(wref().tag, 'e')
+ del e
+ self.assertEqual(flag, True)
+ self.assertEqual(wref(), None)
+
+
+class ElementTreeTest(unittest.TestCase):
+ def test_istype(self):
+ self.assertIsInstance(ET.ParseError, type)
+ self.assertIsInstance(ET.QName, type)
+ self.assertIsInstance(ET.ElementTree, type)
+ self.assertIsInstance(ET.Element, type)
+ self.assertIsInstance(ET.TreeBuilder, type)
+ self.assertIsInstance(ET.XMLParser, type)
+
+ def test_Element_subclass_trivial(self):
+ class MyElement(ET.Element):
+ pass
+
+ mye = MyElement('foo')
+ self.assertIsInstance(mye, ET.Element)
+ self.assertIsInstance(mye, MyElement)
+ self.assertEqual(mye.tag, 'foo')
+
+ # test that attribute assignment works (issue 14849)
+ mye.text = "joe"
+ self.assertEqual(mye.text, "joe")
+
+ def test_Element_subclass_constructor(self):
+ class MyElement(ET.Element):
+ def __init__(self, tag, attrib={}, **extra):
+ super(MyElement, self).__init__(tag + '__', attrib, **extra)
+
+ mye = MyElement('foo', {'a': 1, 'b': 2}, c=3, d=4)
+ self.assertEqual(mye.tag, 'foo__')
+ self.assertEqual(sorted(mye.items()),
+ [('a', 1), ('b', 2), ('c', 3), ('d', 4)])
+
+ def test_Element_subclass_new_method(self):
+ class MyElement(ET.Element):
+ def newmethod(self):
+ return self.tag
+
+ mye = MyElement('joe')
+ self.assertEqual(mye.newmethod(), 'joe')
+
+ def test_html_empty_elems_serialization(self):
+ # issue 15970
+ # from http://www.w3.org/TR/html401/index/elements.html
+ for element in ['AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'FRAME', 'HR',
+ 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM']:
+ for elem in [element, element.lower()]:
+ expected = '<%s>' % elem
+ serialized = serialize(ET.XML('<%s />' % elem), method='html')
+ self.assertEqual(serialized, expected)
+ serialized = serialize(ET.XML('<%s></%s>' % (elem,elem)),
+ method='html')
+ self.assertEqual(serialized, expected)
+
+class ElementIterTest(unittest.TestCase):
+ def _ilist(self, elem, tag=None):
+ return summarize_list(elem.iter(tag))
+
+ def test_basic(self):
+ doc = ET.XML("<html><body>this is a <i>paragraph</i>.</body>..</html>")
+ self.assertEqual(self._ilist(doc), ['html', 'body', 'i'])
+ self.assertEqual(self._ilist(doc.find('body')), ['body', 'i'])
+ self.assertEqual(next(doc.iter()).tag, 'html')
+ self.assertEqual(''.join(doc.itertext()), 'this is a paragraph...')
+ self.assertEqual(''.join(doc.find('body').itertext()),
+ 'this is a paragraph.')
+ self.assertEqual(next(doc.itertext()), 'this is a ')
+
+ # iterparse should return an iterator
+ sourcefile = serialize(doc, to_string=False)
+ self.assertEqual(next(ET.iterparse(sourcefile))[0], 'end')
+
+ tree = ET.ElementTree(None)
+ self.assertRaises(AttributeError, tree.iter)
+
+ def test_corners(self):
+ # single root, no subelements
+ a = ET.Element('a')
+ self.assertEqual(self._ilist(a), ['a'])
+
+ # one child
+ b = ET.SubElement(a, 'b')
+ self.assertEqual(self._ilist(a), ['a', 'b'])
+
+ # one child and one grandchild
+ c = ET.SubElement(b, 'c')
+ self.assertEqual(self._ilist(a), ['a', 'b', 'c'])
+
+ # two children, only first with grandchild
+ d = ET.SubElement(a, 'd')
+ self.assertEqual(self._ilist(a), ['a', 'b', 'c', 'd'])
+
+ # replace first child by second
+ a[0] = a[1]
+ del a[1]
+ self.assertEqual(self._ilist(a), ['a', 'd'])
+
+ def test_iter_by_tag(self):
+ doc = ET.XML('''
+ <document>
+ <house>
+ <room>bedroom1</room>
+ <room>bedroom2</room>
+ </house>
+ <shed>nothing here
+ </shed>
+ <house>
+ <room>bedroom8</room>
+ </house>
+ </document>''')
+
+ self.assertEqual(self._ilist(doc, 'room'), ['room'] * 3)
+ self.assertEqual(self._ilist(doc, 'house'), ['house'] * 2)
+
+ # make sure both tag=None and tag='*' return all tags
+ all_tags = ['document', 'house', 'room', 'room',
+ 'shed', 'house', 'room']
+ self.assertEqual(self._ilist(doc), all_tags)
+ self.assertEqual(self._ilist(doc, '*'), all_tags)
+
+
+class TreeBuilderTest(unittest.TestCase):
+ sample1 = ('<!DOCTYPE html PUBLIC'
+ ' "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+ ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
+ '<html>text<div>subtext</div>tail</html>')
+
+ sample2 = '''<toplevel>sometext</toplevel>'''
+
+ def _check_sample1_element(self, e):
+ self.assertEqual(e.tag, 'html')
+ self.assertEqual(e.text, 'text')
+ self.assertEqual(e.tail, None)
+ self.assertEqual(e.attrib, {})
+ children = list(e)
+ self.assertEqual(len(children), 1)
+ child = children[0]
+ self.assertEqual(child.tag, 'div')
+ self.assertEqual(child.text, 'subtext')
+ self.assertEqual(child.tail, 'tail')
+ self.assertEqual(child.attrib, {})
+
+ def test_dummy_builder(self):
+ class BaseDummyBuilder:
+ def close(self):
+ return 42
+
+ class DummyBuilder(BaseDummyBuilder):
+ data = start = end = lambda *a: None
+
+ parser = ET.XMLParser(target=DummyBuilder())
+ parser.feed(self.sample1)
+ self.assertEqual(parser.close(), 42)
+
+ parser = ET.XMLParser(target=BaseDummyBuilder())
+ parser.feed(self.sample1)
+ self.assertEqual(parser.close(), 42)
+
+ parser = ET.XMLParser(target=object())
+ parser.feed(self.sample1)
+ self.assertIsNone(parser.close())
+
+ def test_subclass(self):
+ class MyTreeBuilder(ET.TreeBuilder):
+ def foobar(self, x):
+ return x * 2
+
+ tb = MyTreeBuilder()
+ self.assertEqual(tb.foobar(10), 20)
+
+ parser = ET.XMLParser(target=tb)
+ parser.feed(self.sample1)
+
+ e = parser.close()
+ self._check_sample1_element(e)
+
+ def test_element_factory(self):
+ lst = []
+ def myfactory(tag, attrib):
+ nonlocal lst
+ lst.append(tag)
+ return ET.Element(tag, attrib)
+
+ tb = ET.TreeBuilder(element_factory=myfactory)
+ parser = ET.XMLParser(target=tb)
+ parser.feed(self.sample2)
+ parser.close()
+
+ self.assertEqual(lst, ['toplevel'])
+
+ def _check_element_factory_class(self, cls):
+ tb = ET.TreeBuilder(element_factory=cls)
+
+ parser = ET.XMLParser(target=tb)
+ parser.feed(self.sample1)
+ e = parser.close()
+ self.assertIsInstance(e, cls)
+ self._check_sample1_element(e)
+
+ def test_element_factory_subclass(self):
+ class MyElement(ET.Element):
+ pass
+ self._check_element_factory_class(MyElement)
+
+ def test_element_factory_pure_python_subclass(self):
+ # Mimick SimpleTAL's behaviour (issue #16089): both versions of
+ # TreeBuilder should be able to cope with a subclass of the
+ # pure Python Element class.
+ base = ET._Element
+ # Not from a C extension
+ self.assertEqual(base.__module__, 'xml.etree.ElementTree')
+ # Force some multiple inheritance with a C class to make things
+ # more interesting.
+ class MyElement(base, ValueError):
+ pass
+ self._check_element_factory_class(MyElement)
+
+ def test_doctype(self):
+ class DoctypeParser:
+ _doctype = None
+
+ def doctype(self, name, pubid, system):
+ self._doctype = (name, pubid, system)
+
+ def close(self):
+ return self._doctype
+
+ parser = ET.XMLParser(target=DoctypeParser())
+ parser.feed(self.sample1)
+
+ self.assertEqual(parser.close(),
+ ('html', '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'))
+
+
+class XincludeTest(unittest.TestCase):
+ def _my_loader(self, href, parse):
+ # Used to avoid a test-dependency problem where the default loader
+ # of ElementInclude uses the pyET parser for cET tests.
+ if parse == 'xml':
+ with open(href, 'rb') as f:
+ return ET.parse(f).getroot()
+ else:
+ return None
+
+ def test_xinclude_default(self):
+ from xml.etree import ElementInclude
+ doc = xinclude_loader('default.xml')
+ ElementInclude.include(doc, self._my_loader)
+ s = serialize(doc)
+ self.assertEqual(s.strip(), '''<document>
+ <p>Example.</p>
+ <root>
+ <element key="value">text</element>
+ <element>text</element>tail
+ <empty-element />
+</root>
+</document>''')
+
+
+class XMLParserTest(unittest.TestCase):
+ sample1 = '<file><line>22</line></file>'
+ sample2 = ('<!DOCTYPE html PUBLIC'
+ ' "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+ ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
+ '<html>text</html>')
+
+ def _check_sample_element(self, e):
+ self.assertEqual(e.tag, 'file')
+ self.assertEqual(e[0].tag, 'line')
+ self.assertEqual(e[0].text, '22')
+
+ def test_constructor_args(self):
+ # Positional args. The first (html) is not supported, but should be
+ # nevertheless correctly accepted.
+ parser = ET.XMLParser(None, ET.TreeBuilder(), 'utf-8')
+ parser.feed(self.sample1)
+ self._check_sample_element(parser.close())
+
+ # Now as keyword args.
+ parser2 = ET.XMLParser(encoding='utf-8', html=[{}], target=ET.TreeBuilder())
+ parser2.feed(self.sample1)
+ self._check_sample_element(parser2.close())
+
+ def test_subclass(self):
+ class MyParser(ET.XMLParser):
+ pass
+ parser = MyParser()
+ parser.feed(self.sample1)
+ self._check_sample_element(parser.close())
+
+ def test_subclass_doctype(self):
+ _doctype = None
+ class MyParserWithDoctype(ET.XMLParser):
+ def doctype(self, name, pubid, system):
+ nonlocal _doctype
+ _doctype = (name, pubid, system)
+
+ parser = MyParserWithDoctype()
+ parser.feed(self.sample2)
+ parser.close()
+ self.assertEqual(_doctype,
+ ('html', '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'))
+
+
+class NamespaceParseTest(unittest.TestCase):
+ def test_find_with_namespace(self):
+ nsmap = {'h': 'hello', 'f': 'foo'}
+ doc = ET.fromstring(SAMPLE_XML_NS_ELEMS)
+
+ self.assertEqual(len(doc.findall('{hello}table', nsmap)), 1)
+ self.assertEqual(len(doc.findall('.//{hello}td', nsmap)), 2)
+ self.assertEqual(len(doc.findall('.//{foo}name', nsmap)), 1)
+
+
+class ElementSlicingTest(unittest.TestCase):
+ def _elem_tags(self, elemlist):
+ return [e.tag for e in elemlist]
+
+ def _subelem_tags(self, elem):
+ return self._elem_tags(list(elem))
+
+ def _make_elem_with_children(self, numchildren):
+ """Create an Element with a tag 'a', with the given amount of children
+ named 'a0', 'a1' ... and so on.
+
+ """
+ e = ET.Element('a')
+ for i in range(numchildren):
+ ET.SubElement(e, 'a%s' % i)
+ return e
+
+ def test_getslice_single_index(self):
+ e = self._make_elem_with_children(10)
+
+ self.assertEqual(e[1].tag, 'a1')
+ self.assertEqual(e[-2].tag, 'a8')
+
+ self.assertRaises(IndexError, lambda: e[12])
+
+ def test_getslice_range(self):
+ e = self._make_elem_with_children(6)
+
+ self.assertEqual(self._elem_tags(e[3:]), ['a3', 'a4', 'a5'])
+ self.assertEqual(self._elem_tags(e[3:6]), ['a3', 'a4', 'a5'])
+ self.assertEqual(self._elem_tags(e[3:16]), ['a3', 'a4', 'a5'])
+ self.assertEqual(self._elem_tags(e[3:5]), ['a3', 'a4'])
+ self.assertEqual(self._elem_tags(e[3:-1]), ['a3', 'a4'])
+ self.assertEqual(self._elem_tags(e[:2]), ['a0', 'a1'])
+
+ def test_getslice_steps(self):
+ e = self._make_elem_with_children(10)
+
+ self.assertEqual(self._elem_tags(e[8:10:1]), ['a8', 'a9'])
+ self.assertEqual(self._elem_tags(e[::3]), ['a0', 'a3', 'a6', 'a9'])
+ self.assertEqual(self._elem_tags(e[::8]), ['a0', 'a8'])
+ self.assertEqual(self._elem_tags(e[1::8]), ['a1', 'a9'])
+
+ def test_getslice_negative_steps(self):
+ e = self._make_elem_with_children(4)
+
+ self.assertEqual(self._elem_tags(e[::-1]), ['a3', 'a2', 'a1', 'a0'])
+ self.assertEqual(self._elem_tags(e[::-2]), ['a3', 'a1'])
+
+ def test_delslice(self):
+ e = self._make_elem_with_children(4)
+ del e[0:2]
+ self.assertEqual(self._subelem_tags(e), ['a2', 'a3'])
+
+ e = self._make_elem_with_children(4)
+ del e[0:]
+ self.assertEqual(self._subelem_tags(e), [])
+
+ e = self._make_elem_with_children(4)
+ del e[::-1]
+ self.assertEqual(self._subelem_tags(e), [])
+
+ e = self._make_elem_with_children(4)
+ del e[::-2]
+ self.assertEqual(self._subelem_tags(e), ['a0', 'a2'])
+
+ e = self._make_elem_with_children(4)
+ del e[1::2]
+ self.assertEqual(self._subelem_tags(e), ['a0', 'a2'])
+
+ e = self._make_elem_with_children(2)
+ del e[::2]
+ self.assertEqual(self._subelem_tags(e), ['a1'])
+
+
+class IOTest(unittest.TestCase):
+ def tearDown(self):
+ unlink(TESTFN)
+
+ def test_encoding(self):
+ # Test encoding issues.
+ elem = ET.Element("tag")
+ elem.text = "abc"
+ self.assertEqual(serialize(elem), '<tag>abc</tag>')
+ self.assertEqual(serialize(elem, encoding="utf-8"),
+ b'<tag>abc</tag>')
+ self.assertEqual(serialize(elem, encoding="us-ascii"),
+ b'<tag>abc</tag>')
+ for enc in ("iso-8859-1", "utf-16", "utf-32"):
+ self.assertEqual(serialize(elem, encoding=enc),
+ ("<?xml version='1.0' encoding='%s'?>\n"
+ "<tag>abc</tag>" % enc).encode(enc))
+
+ elem = ET.Element("tag")
+ elem.text = "<&\"\'>"
+ self.assertEqual(serialize(elem), '<tag>&lt;&amp;"\'&gt;</tag>')
+ self.assertEqual(serialize(elem, encoding="utf-8"),
+ b'<tag>&lt;&amp;"\'&gt;</tag>')
+ self.assertEqual(serialize(elem, encoding="us-ascii"),
+ b'<tag>&lt;&amp;"\'&gt;</tag>')
+ for enc in ("iso-8859-1", "utf-16", "utf-32"):
+ self.assertEqual(serialize(elem, encoding=enc),
+ ("<?xml version='1.0' encoding='%s'?>\n"
+ "<tag>&lt;&amp;\"'&gt;</tag>" % enc).encode(enc))
+
+ elem = ET.Element("tag")
+ elem.attrib["key"] = "<&\"\'>"
+ self.assertEqual(serialize(elem), '<tag key="&lt;&amp;&quot;\'&gt;" />')
+ self.assertEqual(serialize(elem, encoding="utf-8"),
+ b'<tag key="&lt;&amp;&quot;\'&gt;" />')
+ self.assertEqual(serialize(elem, encoding="us-ascii"),
+ b'<tag key="&lt;&amp;&quot;\'&gt;" />')
+ for enc in ("iso-8859-1", "utf-16", "utf-32"):
+ self.assertEqual(serialize(elem, encoding=enc),
+ ("<?xml version='1.0' encoding='%s'?>\n"
+ "<tag key=\"&lt;&amp;&quot;'&gt;\" />" % enc).encode(enc))
+
+ elem = ET.Element("tag")
+ elem.text = '\xe5\xf6\xf6<>'
+ self.assertEqual(serialize(elem), '<tag>\xe5\xf6\xf6&lt;&gt;</tag>')
+ self.assertEqual(serialize(elem, encoding="utf-8"),
+ b'<tag>\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;</tag>')
+ self.assertEqual(serialize(elem, encoding="us-ascii"),
+ b'<tag>&#229;&#246;&#246;&lt;&gt;</tag>')
+ for enc in ("iso-8859-1", "utf-16", "utf-32"):
+ self.assertEqual(serialize(elem, encoding=enc),
+ ("<?xml version='1.0' encoding='%s'?>\n"
+ "<tag>åöö&lt;&gt;</tag>" % enc).encode(enc))
+
+ elem = ET.Element("tag")
+ elem.attrib["key"] = '\xe5\xf6\xf6<>'
+ self.assertEqual(serialize(elem), '<tag key="\xe5\xf6\xf6&lt;&gt;" />')
+ self.assertEqual(serialize(elem, encoding="utf-8"),
+ b'<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;" />')
+ self.assertEqual(serialize(elem, encoding="us-ascii"),
+ b'<tag key="&#229;&#246;&#246;&lt;&gt;" />')
+ for enc in ("iso-8859-1", "utf-16", "utf-16le", "utf-16be", "utf-32"):
+ self.assertEqual(serialize(elem, encoding=enc),
+ ("<?xml version='1.0' encoding='%s'?>\n"
+ "<tag key=\"åöö&lt;&gt;\" />" % enc).encode(enc))
+
+ def test_write_to_filename(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ tree.write(TESTFN)
+ with open(TESTFN, 'rb') as f:
+ self.assertEqual(f.read(), b'''<site />''')
+
+ def test_write_to_text_file(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ with open(TESTFN, 'w', encoding='utf-8') as f:
+ tree.write(f, encoding='unicode')
+ self.assertFalse(f.closed)
+ with open(TESTFN, 'rb') as f:
+ self.assertEqual(f.read(), b'''<site />''')
+
+ def test_write_to_binary_file(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ with open(TESTFN, 'wb') as f:
+ tree.write(f)
+ self.assertFalse(f.closed)
+ with open(TESTFN, 'rb') as f:
+ self.assertEqual(f.read(), b'''<site />''')
+
+ def test_write_to_binary_file_with_bom(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ # test BOM writing to buffered file
+ with open(TESTFN, 'wb') as f:
+ tree.write(f, encoding='utf-16')
+ self.assertFalse(f.closed)
+ with open(TESTFN, 'rb') as f:
+ self.assertEqual(f.read(),
+ '''<?xml version='1.0' encoding='utf-16'?>\n'''
+ '''<site />'''.encode("utf-16"))
+ # test BOM writing to non-buffered file
+ with open(TESTFN, 'wb', buffering=0) as f:
+ tree.write(f, encoding='utf-16')
+ self.assertFalse(f.closed)
+ with open(TESTFN, 'rb') as f:
+ self.assertEqual(f.read(),
+ '''<?xml version='1.0' encoding='utf-16'?>\n'''
+ '''<site />'''.encode("utf-16"))
+
+ def test_read_from_stringio(self):
+ tree = ET.ElementTree()
+ stream = io.StringIO('''<?xml version="1.0"?><site></site>''')
+ tree.parse(stream)
+ self.assertEqual(tree.getroot().tag, 'site')
+
+ def test_write_to_stringio(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ stream = io.StringIO()
+ tree.write(stream, encoding='unicode')
+ self.assertEqual(stream.getvalue(), '''<site />''')
+
+ def test_read_from_bytesio(self):
+ tree = ET.ElementTree()
+ raw = io.BytesIO(b'''<?xml version="1.0"?><site></site>''')
+ tree.parse(raw)
+ self.assertEqual(tree.getroot().tag, 'site')
+
+ def test_write_to_bytesio(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ raw = io.BytesIO()
+ tree.write(raw)
+ self.assertEqual(raw.getvalue(), b'''<site />''')
+
+ class dummy:
+ pass
+
+ def test_read_from_user_text_reader(self):
+ stream = io.StringIO('''<?xml version="1.0"?><site></site>''')
+ reader = self.dummy()
+ reader.read = stream.read
+ tree = ET.ElementTree()
+ tree.parse(reader)
+ self.assertEqual(tree.getroot().tag, 'site')
+
+ def test_write_to_user_text_writer(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ stream = io.StringIO()
+ writer = self.dummy()
+ writer.write = stream.write
+ tree.write(writer, encoding='unicode')
+ self.assertEqual(stream.getvalue(), '''<site />''')
+
+ def test_read_from_user_binary_reader(self):
+ raw = io.BytesIO(b'''<?xml version="1.0"?><site></site>''')
+ reader = self.dummy()
+ reader.read = raw.read
+ tree = ET.ElementTree()
+ tree.parse(reader)
+ self.assertEqual(tree.getroot().tag, 'site')
+ tree = ET.ElementTree()
+
+ def test_write_to_user_binary_writer(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ raw = io.BytesIO()
+ writer = self.dummy()
+ writer.write = raw.write
+ tree.write(writer)
+ self.assertEqual(raw.getvalue(), b'''<site />''')
+
+ def test_write_to_user_binary_writer_with_bom(self):
+ tree = ET.ElementTree(ET.XML('''<site />'''))
+ raw = io.BytesIO()
+ writer = self.dummy()
+ writer.write = raw.write
+ writer.seekable = lambda: True
+ writer.tell = raw.tell
+ tree.write(writer, encoding="utf-16")
+ self.assertEqual(raw.getvalue(),
+ '''<?xml version='1.0' encoding='utf-16'?>\n'''
+ '''<site />'''.encode("utf-16"))
+
+ def test_tostringlist_invariant(self):
+ root = ET.fromstring('<tag>foo</tag>')
+ self.assertEqual(
+ ET.tostring(root, 'unicode'),
+ ''.join(ET.tostringlist(root, 'unicode')))
+ self.assertEqual(
+ ET.tostring(root, 'utf-16'),
+ b''.join(ET.tostringlist(root, 'utf-16')))
+
+
+class ParseErrorTest(unittest.TestCase):
+ def test_subclass(self):
+ self.assertIsInstance(ET.ParseError(), SyntaxError)
+
+ def _get_error(self, s):
+ try:
+ ET.fromstring(s)
+ except ET.ParseError as e:
+ return e
+
+ def test_error_position(self):
+ self.assertEqual(self._get_error('foo').position, (1, 0))
+ self.assertEqual(self._get_error('<tag>&foo;</tag>').position, (1, 5))
+ self.assertEqual(self._get_error('foobar<').position, (1, 6))
+
+ def test_error_code(self):
+ import xml.parsers.expat.errors as ERRORS
+ self.assertEqual(self._get_error('foo').code,
+ ERRORS.codes[ERRORS.XML_ERROR_SYNTAX])
+
+
+class KeywordArgsTest(unittest.TestCase):
+ # Test various issues with keyword arguments passed to ET.Element
+ # constructor and methods
+ def test_issue14818(self):
+ x = ET.XML("<a>foo</a>")
+ self.assertEqual(x.find('a', None),
+ x.find(path='a', namespaces=None))
+ self.assertEqual(x.findtext('a', None, None),
+ x.findtext(path='a', default=None, namespaces=None))
+ self.assertEqual(x.findall('a', None),
+ x.findall(path='a', namespaces=None))
+ self.assertEqual(list(x.iterfind('a', None)),
+ list(x.iterfind(path='a', namespaces=None)))
+
+ self.assertEqual(ET.Element('a').attrib, {})
+ elements = [
+ ET.Element('a', dict(href="#", id="foo")),
+ ET.Element('a', attrib=dict(href="#", id="foo")),
+ ET.Element('a', dict(href="#"), id="foo"),
+ ET.Element('a', href="#", id="foo"),
+ ET.Element('a', dict(href="#", id="foo"), href="#", id="foo"),
+ ]
+ for e in elements:
+ self.assertEqual(e.tag, 'a')
+ self.assertEqual(e.attrib, dict(href="#", id="foo"))
+
+ e2 = ET.SubElement(elements[0], 'foobar', attrib={'key1': 'value1'})
+ self.assertEqual(e2.attrib['key1'], 'value1')
+
+ with self.assertRaisesRegex(TypeError, 'must be dict, not str'):
+ ET.Element('a', "I'm not a dict")
+ with self.assertRaisesRegex(TypeError, 'must be dict, not str'):
+ ET.Element('a', attrib="I'm not a dict")
+
+# --------------------------------------------------------------------
+
+@unittest.skipUnless(pyET, 'only for the Python version')
+class NoAcceleratorTest(unittest.TestCase):
+ # Test that the C accelerator was not imported for pyET
+ def test_correct_import_pyET(self):
+ self.assertEqual(pyET.Element.__module__, 'xml.etree.ElementTree')
+ self.assertEqual(pyET.SubElement.__module__, 'xml.etree.ElementTree')
# --------------------------------------------------------------------
@@ -1892,44 +2433,69 @@ class CleanContext(object):
("This method will be removed in future versions. "
"Use .+ instead.", DeprecationWarning),
("This method will be removed in future versions. "
- "Use .+ instead.", PendingDeprecationWarning),
- # XMLParser.doctype() is deprecated.
- ("This method of XMLParser is deprecated. Define doctype.. "
- "method on the TreeBuilder target.", DeprecationWarning))
+ "Use .+ instead.", PendingDeprecationWarning))
self.checkwarnings = support.check_warnings(*deprecations, quiet=quiet)
def __enter__(self):
- from xml.etree import ElementTree
- self._nsmap = ElementTree._namespace_map
- self._path_cache = ElementTree.ElementPath._cache
+ from xml.etree import ElementPath
+ self._nsmap = ET.register_namespace._namespace_map
# Copy the default namespace mapping
- ElementTree._namespace_map = self._nsmap.copy()
+ self._nsmap_copy = self._nsmap.copy()
# Copy the path cache (should be empty)
- ElementTree.ElementPath._cache = self._path_cache.copy()
+ self._path_cache = ElementPath._cache
+ ElementPath._cache = self._path_cache.copy()
self.checkwarnings.__enter__()
def __exit__(self, *args):
- from xml.etree import ElementTree
+ from xml.etree import ElementPath
# Restore mapping and path cache
- ElementTree._namespace_map = self._nsmap
- ElementTree.ElementPath._cache = self._path_cache
+ self._nsmap.clear()
+ self._nsmap.update(self._nsmap_copy)
+ ElementPath._cache = self._path_cache
self.checkwarnings.__exit__(*args)
-def test_main(module_name='xml.etree.ElementTree'):
- from test import test_xml_etree
+def test_main(module=None):
+ # When invoked without a module, runs the Python ET tests by loading pyET.
+ # Otherwise, uses the given module as the ET.
+ if module is None:
+ global pyET
+ pyET = import_fresh_module('xml.etree.ElementTree',
+ blocked=['_elementtree'])
+ module = pyET
+
+ global ET
+ ET = module
+
+ test_classes = [
+ ElementSlicingTest,
+ BasicElementTest,
+ IOTest,
+ ParseErrorTest,
+ XincludeTest,
+ ElementTreeTest,
+ ElementIterTest,
+ TreeBuilderTest,
+ ]
+
+ # These tests will only run for the pure-Python version that doesn't import
+ # _elementtree. We can't use skipUnless here, because pyET is filled in only
+ # after the module is loaded.
+ if pyET:
+ test_classes.extend([
+ NoAcceleratorTest,
+ ])
- use_py_module = (module_name == 'xml.etree.ElementTree')
-
- # The same doctests are used for both the Python and the C implementations
- assert test_xml_etree.ET.__name__ == module_name
+ try:
+ support.run_unittest(*test_classes)
- # XXX the C module should give the same warnings as the Python module
- with CleanContext(quiet=not use_py_module):
- support.run_doctest(test_xml_etree, verbosity=True)
+ # XXX the C module should give the same warnings as the Python module
+ with CleanContext(quiet=(module is not pyET)):
+ support.run_doctest(sys.modules[__name__], verbosity=True)
+ finally:
+ # don't interfere with subsequent tests
+ ET = pyET = None
- # The module should not be changed by the tests
- assert test_xml_etree.ET.__name__ == module_name
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py
index 2ff118f..e44c6ca 100644
--- a/Lib/test/test_xml_etree_c.py
+++ b/Lib/test/test_xml_etree_c.py
@@ -1,36 +1,11 @@
# xml.etree test for cElementTree
-
+import sys, struct
from test import support
-from test.support import bigmemtest, _2G
+from test.support import import_fresh_module
import unittest
-cET = support.import_module('xml.etree.cElementTree')
-
-
-# cElementTree specific tests
-
-def sanity():
- r"""
- Import sanity.
-
- >>> from xml.etree import cElementTree
-
- Issue #6697.
-
- >>> e = cElementTree.Element('a')
- >>> getattr(e, '\uD800') # doctest: +ELLIPSIS
- Traceback (most recent call last):
- ...
- UnicodeEncodeError: ...
-
- >>> p = cElementTree.XMLParser()
- >>> p.version.split()[0]
- 'Expat'
- >>> getattr(p, '\uD800')
- Traceback (most recent call last):
- ...
- AttributeError: 'XMLParser' object has no attribute '\ud800'
- """
+cET = import_fresh_module('xml.etree.ElementTree', fresh=['_elementtree'])
+cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree', 'xml.etree'])
class MiscTests(unittest.TestCase):
@@ -47,27 +22,64 @@ class MiscTests(unittest.TestCase):
data = None
+@unittest.skipUnless(cET, 'requires _elementtree')
+class TestAliasWorking(unittest.TestCase):
+ # Test that the cET alias module is alive
+ def test_alias_working(self):
+ e = cET_alias.Element('foo')
+ self.assertEqual(e.tag, 'foo')
+
+
+@unittest.skipUnless(cET, 'requires _elementtree')
+class TestAcceleratorImported(unittest.TestCase):
+ # Test that the C accelerator was imported, as expected
+ def test_correct_import_cET(self):
+ self.assertEqual(cET.SubElement.__module__, '_elementtree')
+
+ def test_correct_import_cET_alias(self):
+ self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
+
+
+@unittest.skipUnless(cET, 'requires _elementtree')
+@support.cpython_only
+class SizeofTest(unittest.TestCase):
+ def setUp(self):
+ self.elementsize = support.calcobjsize('5P')
+ # extra
+ self.extra = struct.calcsize('PiiP4P')
+
+ check_sizeof = support.check_sizeof
+
+ def test_element(self):
+ e = cET.Element('a')
+ self.check_sizeof(e, self.elementsize)
+
+ def test_element_with_attrib(self):
+ e = cET.Element('a', href='about:')
+ self.check_sizeof(e, self.elementsize + self.extra)
+
+ def test_element_with_children(self):
+ e = cET.Element('a')
+ for i in range(5):
+ cET.SubElement(e, 'span')
+ # should have space for 8 children now
+ self.check_sizeof(e, self.elementsize + self.extra +
+ struct.calcsize('8P'))
+
def test_main():
from test import test_xml_etree, test_xml_etree_c
# Run the tests specific to the C implementation
- support.run_doctest(test_xml_etree_c, verbosity=True)
-
- support.run_unittest(MiscTests)
-
- # Assign the C implementation before running the doctests
- # Patch the __name__, to prevent confusion with the pure Python test
- pyET = test_xml_etree.ET
- py__name__ = test_xml_etree.__name__
- test_xml_etree.ET = cET
- if __name__ != '__main__':
- test_xml_etree.__name__ = __name__
- try:
- # Run the same test suite as xml.etree.ElementTree
- test_xml_etree.test_main(module_name='xml.etree.cElementTree')
- finally:
- test_xml_etree.ET = pyET
- test_xml_etree.__name__ = py__name__
+ support.run_unittest(
+ MiscTests,
+ TestAliasWorking,
+ TestAcceleratorImported,
+ SizeofTest,
+ )
+
+ # Run the same test suite as the Python module
+ test_xml_etree.test_main(module=cET)
+
if __name__ == '__main__':
test_main()
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 3814191..16f85c5 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -24,6 +24,8 @@ alist = [{'astring': 'foo@bar.baz.spam',
'ashortlong': 2,
'anotherlist': ['.zyx.41'],
'abase64': xmlrpclib.Binary(b"my dog has fleas"),
+ 'b64bytes': b"my dog has fleas",
+ 'b64bytearray': bytearray(b"my dog has fleas"),
'boolean': False,
'unicode': '\u4000\u6000\u8000',
'ukey\u4000': 'regular value',
@@ -44,27 +46,54 @@ class XMLRPCTestCase(unittest.TestCase):
def test_dump_bare_datetime(self):
# This checks that an unwrapped datetime.date object can be handled
# by the marshalling code. This can't be done via test_dump_load()
- # since with use_datetime set to 1 the unmarshaller would create
+ # since with use_builtin_types set to 1 the unmarshaller would create
# datetime objects for the 'datetime[123]' keys as well
dt = datetime.datetime(2005, 2, 10, 11, 41, 23)
+ self.assertEqual(dt, xmlrpclib.DateTime('20050210T11:41:23'))
s = xmlrpclib.dumps((dt,))
- (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
+
+ result, m = xmlrpclib.loads(s, use_builtin_types=True)
+ (newdt,) = result
self.assertEqual(newdt, dt)
- self.assertEqual(m, None)
+ self.assertIs(type(newdt), datetime.datetime)
+ self.assertIsNone(m)
+
+ result, m = xmlrpclib.loads(s, use_builtin_types=False)
+ (newdt,) = result
+ self.assertEqual(newdt, dt)
+ self.assertIs(type(newdt), xmlrpclib.DateTime)
+ self.assertIsNone(m)
+
+ result, m = xmlrpclib.loads(s, use_datetime=True)
+ (newdt,) = result
+ self.assertEqual(newdt, dt)
+ self.assertIs(type(newdt), datetime.datetime)
+ self.assertIsNone(m)
+
+ result, m = xmlrpclib.loads(s, use_datetime=False)
+ (newdt,) = result
+ self.assertEqual(newdt, dt)
+ self.assertIs(type(newdt), xmlrpclib.DateTime)
+ self.assertIsNone(m)
- (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
- self.assertEqual(newdt, xmlrpclib.DateTime('20050210T11:41:23'))
def test_datetime_before_1900(self):
# same as before but with a date before 1900
dt = datetime.datetime(1, 2, 10, 11, 41, 23)
+ self.assertEqual(dt, xmlrpclib.DateTime('00010210T11:41:23'))
s = xmlrpclib.dumps((dt,))
- (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
+
+ result, m = xmlrpclib.loads(s, use_builtin_types=True)
+ (newdt,) = result
self.assertEqual(newdt, dt)
- self.assertEqual(m, None)
+ self.assertIs(type(newdt), datetime.datetime)
+ self.assertIsNone(m)
- (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
- self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23'))
+ result, m = xmlrpclib.loads(s, use_builtin_types=False)
+ (newdt,) = result
+ self.assertEqual(newdt, dt)
+ self.assertIs(type(newdt), xmlrpclib.DateTime)
+ self.assertIsNone(m)
def test_bug_1164912 (self):
d = xmlrpclib.DateTime()
@@ -125,6 +154,22 @@ class XMLRPCTestCase(unittest.TestCase):
self.assertRaises(OverflowError, m.dump_int,
xmlrpclib.MININT-1, dummy_write)
+ def test_dump_double(self):
+ xmlrpclib.dumps((float(2 ** 34),))
+ xmlrpclib.dumps((float(xmlrpclib.MAXINT),
+ float(xmlrpclib.MININT)))
+ xmlrpclib.dumps((float(xmlrpclib.MAXINT + 42),
+ float(xmlrpclib.MININT - 42)))
+
+ def dummy_write(s):
+ pass
+
+ m = xmlrpclib.Marshaller()
+ m.dump_double(xmlrpclib.MAXINT, dummy_write)
+ m.dump_double(xmlrpclib.MININT, dummy_write)
+ m.dump_double(xmlrpclib.MAXINT + 42, dummy_write)
+ m.dump_double(xmlrpclib.MININT - 42, dummy_write)
+
def test_dump_none(self):
value = alist + [None]
arg1 = (alist + [None],)
@@ -133,6 +178,25 @@ class XMLRPCTestCase(unittest.TestCase):
xmlrpclib.loads(strg)[0][0])
self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
+ def test_dump_bytes(self):
+ sample = b"my dog has fleas"
+ self.assertEqual(sample, xmlrpclib.Binary(sample))
+ for type_ in bytes, bytearray, xmlrpclib.Binary:
+ value = type_(sample)
+ s = xmlrpclib.dumps((value,))
+
+ result, m = xmlrpclib.loads(s, use_builtin_types=True)
+ (newvalue,) = result
+ self.assertEqual(newvalue, sample)
+ self.assertIs(type(newvalue), bytes)
+ self.assertIsNone(m)
+
+ result, m = xmlrpclib.loads(s, use_builtin_types=False)
+ (newvalue,) = result
+ self.assertEqual(newvalue, sample)
+ self.assertIs(type(newvalue), xmlrpclib.Binary)
+ self.assertIsNone(m)
+
def test_get_host_info(self):
# see bug #3613, this raised a TypeError
transp = xmlrpc.client.Transport()
@@ -140,9 +204,6 @@ class XMLRPCTestCase(unittest.TestCase):
('host.tld',
[('Authorization', 'Basic dXNlcg==')], {}))
- def test_dump_bytes(self):
- self.assertRaises(TypeError, xmlrpclib.dumps, (b"my dog has fleas",))
-
def test_ssl_presence(self):
try:
import ssl
@@ -980,10 +1041,44 @@ class CGIHandlerTestCase(unittest.TestCase):
len(content))
+class UseBuiltinTypesTestCase(unittest.TestCase):
+
+ def test_use_builtin_types(self):
+ # SimpleXMLRPCDispatcher.__init__ accepts use_builtin_types, which
+ # makes all dispatch of binary data as bytes instances, and all
+ # dispatch of datetime argument as datetime.datetime instances.
+ self.log = []
+ expected_bytes = b"my dog has fleas"
+ expected_date = datetime.datetime(2008, 5, 26, 18, 25, 12)
+ marshaled = xmlrpclib.dumps((expected_bytes, expected_date), 'foobar')
+ def foobar(*args):
+ self.log.extend(args)
+ handler = xmlrpc.server.SimpleXMLRPCDispatcher(
+ allow_none=True, encoding=None, use_builtin_types=True)
+ handler.register_function(foobar)
+ handler._marshaled_dispatch(marshaled)
+ self.assertEqual(len(self.log), 2)
+ mybytes, mydate = self.log
+ self.assertEqual(self.log, [expected_bytes, expected_date])
+ self.assertIs(type(mydate), datetime.datetime)
+ self.assertIs(type(mybytes), bytes)
+
+ def test_cgihandler_has_use_builtin_types_flag(self):
+ handler = xmlrpc.server.CGIXMLRPCRequestHandler(use_builtin_types=True)
+ self.assertTrue(handler.use_builtin_types)
+
+ def test_xmlrpcserver_has_use_builtin_types_flag(self):
+ server = xmlrpc.server.SimpleXMLRPCServer(("localhost", 0),
+ use_builtin_types=True)
+ server.server_close()
+ self.assertTrue(server.use_builtin_types)
+
+
@support.reap_threads
def test_main():
xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
BinaryTestCase, FaultTestCase]
+ xmlrpc_tests.append(UseBuiltinTypesTestCase)
xmlrpc_tests.append(SimpleServerTestCase)
xmlrpc_tests.append(KeepaliveServerTestCase1)
xmlrpc_tests.append(KeepaliveServerTestCase2)
diff --git a/Lib/test/test_xmlrpc_net.py b/Lib/test/test_xmlrpc_net.py
index d72f8ac..dfb5f9a 100644
--- a/Lib/test/test_xmlrpc_net.py
+++ b/Lib/test/test_xmlrpc_net.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-import collections
+import collections.abc
import errno
import socket
import sys
@@ -49,7 +49,7 @@ class CurrentTimeTest(unittest.TestCase):
# Perform a minimal sanity check on the result, just to be sure
# the request means what we think it means.
- self.assertIsInstance(builders, collections.Sequence)
+ self.assertIsInstance(builders, collections.abc.Sequence)
self.assertTrue([x for x in builders if "3.x" in x], builders)
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index 51d8b45..2e52c68 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -1,9 +1,3 @@
-# We can test part of the module without zlib.
-try:
- import zlib
-except ImportError:
- zlib = None
-
import io
import os
import sys
@@ -19,7 +13,7 @@ from tempfile import TemporaryFile
from random import randint, random
from unittest import skipUnless
-from test.support import TESTFN, run_unittest, findfile, unlink
+from test.support import TESTFN, run_unittest, findfile, unlink, requires_zlib, requires_bz2, requires_lzma
TESTFN2 = TESTFN + "2"
TESTFNDIR = TESTFN + "d"
@@ -269,44 +263,44 @@ class TestsWithSourceFile(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_iterlines_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_open_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_open_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_random_open_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_random_open_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readline_read_deflated(self):
# Issue #7610: calls to readline() interleaved with calls to read().
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_readline_read_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readline_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_readline_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readlines_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_readlines_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_iterlines_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_iterlines_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_low_compression(self):
"""Check for cases where compressed data is larger than original."""
# Create the ZIP archive
@@ -319,6 +313,103 @@ class TestsWithSourceFile(unittest.TestCase):
self.assertEqual(openobj.read(1), b'1')
self.assertEqual(openobj.read(1), b'2')
+ @requires_bz2
+ def test_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_open_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_open_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_random_open_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_random_open_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readline_read_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readline_read_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readline_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readline_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readlines_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readlines_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_iterlines_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_iterlines_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_low_compression_bzip2(self):
+ """Check for cases where compressed data is larger than original."""
+ # Create the ZIP archive
+ with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_BZIP2) as zipfp:
+ zipfp.writestr("strfile", '12')
+
+ # Get an open object for strfile
+ with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_BZIP2) as zipfp:
+ with zipfp.open("strfile") as openobj:
+ self.assertEqual(openobj.read(1), b'1')
+ self.assertEqual(openobj.read(1), b'2')
+
+ @requires_lzma
+ def test_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_open_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_open_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_random_open_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_random_open_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readline_read_lzma(self):
+ # Issue #7610: calls to readline() interleaved with calls to read().
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readline_read_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readline_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readline_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readlines_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_readlines_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_iterlines_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_iterlines_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_low_compression_lzma(self):
+ """Check for cases where compressed data is larger than original."""
+ # Create the ZIP archive
+ with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_LZMA) as zipfp:
+ zipfp.writestr("strfile", '12')
+
+ # Get an open object for strfile
+ with zipfile.ZipFile(TESTFN2, "r", zipfile.ZIP_LZMA) as zipfp:
+ with zipfp.open("strfile") as openobj:
+ self.assertEqual(openobj.read(1), b'1')
+ self.assertEqual(openobj.read(1), b'2')
+
def test_absolute_arcnames(self):
with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp:
zipfp.write(TESTFN, "/absolute")
@@ -377,7 +468,7 @@ class TestsWithSourceFile(unittest.TestCase):
with open(TESTFN, "rb") as f:
self.assertEqual(zipfp.read(TESTFN), f.read())
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_per_file_compression(self):
"""Check that files within a Zip archive can have different
compression options."""
@@ -446,19 +537,32 @@ class TestsWithSourceFile(unittest.TestCase):
# remove the test file subdirectories
shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir'))
- def test_writestr_compression(self):
+ def test_writestr_compression_stored(self):
zipfp = zipfile.ZipFile(TESTFN2, "w")
zipfp.writestr("a.txt", "hello world", compress_type=zipfile.ZIP_STORED)
- if zlib:
- zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_DEFLATED)
-
info = zipfp.getinfo('a.txt')
self.assertEqual(info.compress_type, zipfile.ZIP_STORED)
- if zlib:
- info = zipfp.getinfo('b.txt')
- self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED)
+ @requires_zlib
+ def test_writestr_compression_deflated(self):
+ zipfp = zipfile.ZipFile(TESTFN2, "w")
+ zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_DEFLATED)
+ info = zipfp.getinfo('b.txt')
+ self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED)
+
+ @requires_bz2
+ def test_writestr_compression_bzip2(self):
+ zipfp = zipfile.ZipFile(TESTFN2, "w")
+ zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_BZIP2)
+ info = zipfp.getinfo('b.txt')
+ self.assertEqual(info.compress_type, zipfile.ZIP_BZIP2)
+ @requires_lzma
+ def test_writestr_compression_lzma(self):
+ zipfp = zipfile.ZipFile(TESTFN2, "w")
+ zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_LZMA)
+ info = zipfp.getinfo('b.txt')
+ self.assertEqual(info.compress_type, zipfile.ZIP_LZMA)
def zip_test_writestr_permissions(self, f, compression):
# Make sure that writestr creates files with mode 0600,
@@ -514,7 +618,12 @@ class TestsWithSourceFile(unittest.TestCase):
self.assertRaises(ValueError, zipfp.write, TESTFN)
- @skipUnless(zlib, "requires zlib")
+
+
+
+
+
+ @requires_zlib
def test_unicode_filenames(self):
# bug #10801
fname = findfile('zip_cp437_header.zip')
@@ -623,11 +732,21 @@ class TestZip64InSmallFiles(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_test(f, zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_LZMA)
+
def test_absolute_arcnames(self):
with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED,
allowZip64=True) as zipfp:
@@ -756,8 +875,40 @@ class OtherTests(unittest.TestCase):
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00'
b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00'
b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00'),
+ zipfile.ZIP_BZIP2: (
+ b'PK\x03\x04\x14\x03\x00\x00\x0c\x00nu\x0c=FA'
+ b'KE8\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
+ b'ileBZh91AY&SY\xd4\xa8\xca'
+ b'\x7f\x00\x00\x0f\x11\x80@\x00\x06D\x90\x80 \x00 \xa5'
+ b'P\xd9!\x03\x03\x13\x13\x13\x89\xa9\xa9\xc2u5:\x9f'
+ b'\x8b\xb9"\x9c(HjTe?\x80PK\x01\x02\x14'
+ b'\x03\x14\x03\x00\x00\x0c\x00nu\x0c=FAKE8'
+ b'\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00 \x80\x80\x81\x00\x00\x00\x00afilePK'
+ b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00'
+ b'\x00\x00\x00\x00'),
+ zipfile.ZIP_LZMA: (
+ b'PK\x03\x04\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
+ b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00af'
+ b'ile\t\x04\x05\x00]\x00\x00\x00\x04\x004\x19I'
+ b'\xee\x8d\xe9\x17\x89:3`\tq!.8\x00PK'
+ b'\x01\x02\x14\x03\x14\x03\x00\x00\x0e\x00nu\x0c=FA'
+ b'KE\x1b\x00\x00\x00n\x00\x00\x00\x05\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00 \x80\x80\x81\x00\x00\x00\x00afil'
+ b'ePK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00'
+ b'\x00>\x00\x00\x00\x00\x00'),
}
+ def test_unsupported_version(self):
+ # File has an extract_version of 120
+ data = (b'PK\x03\x04x\x00\x00\x00\x00\x00!p\xa1@\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00xPK\x01\x02x\x03x\x00\x00\x00\x00'
+ b'\x00!p\xa1@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00xPK\x05\x06'
+ b'\x00\x00\x00\x00\x01\x00\x01\x00/\x00\x00\x00\x1f\x00\x00\x00\x00\x00')
+ self.assertRaises(NotImplementedError, zipfile.ZipFile,
+ io.BytesIO(data), 'r')
+
def test_unicode_filenames(self):
with zipfile.ZipFile(TESTFN, "w") as zf:
zf.writestr("foo.txt", "Test for unicode filename")
@@ -922,6 +1073,17 @@ class OtherTests(unittest.TestCase):
caught."""
self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "w", -1)
+ def test_unsupported_compression(self):
+ # data is declared as shrunk, but actually deflated
+ data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00'
+ b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01'
+ b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00'
+ b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00'
+ b'/\x00\x00\x00!\x00\x00\x00\x00\x00')
+ with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf:
+ self.assertRaises(NotImplementedError, zipf.open, 'x')
+
def test_null_byte_in_filename(self):
"""Check that a filename containing a null byte is properly
terminated."""
@@ -1023,10 +1185,18 @@ class OtherTests(unittest.TestCase):
def test_testzip_with_bad_crc_stored(self):
self.check_testzip_with_bad_crc(zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_testzip_with_bad_crc_deflated(self):
self.check_testzip_with_bad_crc(zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_testzip_with_bad_crc_bzip2(self):
+ self.check_testzip_with_bad_crc(zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_testzip_with_bad_crc_lzma(self):
+ self.check_testzip_with_bad_crc(zipfile.ZIP_LZMA)
+
def check_read_with_bad_crc(self, compression):
"""Tests that files with bad CRCs raise a BadZipFile exception when read."""
zipdata = self.zips_with_bad_crc[compression]
@@ -1051,10 +1221,18 @@ class OtherTests(unittest.TestCase):
def test_read_with_bad_crc_stored(self):
self.check_read_with_bad_crc(zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_read_with_bad_crc_deflated(self):
self.check_read_with_bad_crc(zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_read_with_bad_crc_bzip2(self):
+ self.check_read_with_bad_crc(zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_read_with_bad_crc_lzma(self):
+ self.check_read_with_bad_crc(zipfile.ZIP_LZMA)
+
def check_read_return_size(self, compression):
# Issue #9837: ZipExtFile.read() shouldn't return more bytes
# than requested.
@@ -1071,10 +1249,18 @@ class OtherTests(unittest.TestCase):
def test_read_return_size_stored(self):
self.check_read_return_size(zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_read_return_size_deflated(self):
self.check_read_return_size(zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_read_return_size_bzip2(self):
+ self.check_read_return_size(zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_read_return_size_lzma(self):
+ self.check_read_return_size(zipfile.ZIP_LZMA)
+
def test_empty_zipfile(self):
# Check that creating a file in 'w' or 'a' mode and closing without
# adding any files to the archives creates a valid empty ZIP file
@@ -1161,7 +1347,7 @@ class DecryptionTests(unittest.TestCase):
self.zip2.setpassword(b"perl")
self.assertRaises(RuntimeError, self.zip2.read, "zero")
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_good_password(self):
self.zip.setpassword(b"python")
self.assertEqual(self.zip.read("test.txt"), self.plain)
@@ -1211,11 +1397,21 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_test(f, zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_test(f, zipfile.ZIP_LZMA)
+
def zip_open_test(self, f, compression):
self.make_test_archive(f, compression)
@@ -1251,11 +1447,21 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_open_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_open_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_open_test(f, zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_open_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_open_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_open_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_open_test(f, zipfile.ZIP_LZMA)
+
def zip_random_open_test(self, f, compression):
self.make_test_archive(f, compression)
@@ -1279,13 +1485,23 @@ class TestsWithRandomBinaryFiles(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_random_open_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_random_open_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.zip_random_open_test(f, zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_random_open_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_random_open_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_random_open_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.zip_random_open_test(f, zipfile.ZIP_LZMA)
-@skipUnless(zlib, "requires zlib")
+
+@requires_zlib
class TestsWithMultipleOpens(unittest.TestCase):
def setUp(self):
# Create the ZIP archive
@@ -1477,32 +1693,82 @@ class UniversalNewlineTests(unittest.TestCase):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.iterlines_test(f, zipfile.ZIP_STORED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_read_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.read_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readline_read_deflated(self):
# Issue #7610: calls to readline() interleaved with calls to read().
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.readline_read_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readline_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.readline_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_readlines_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.readlines_test(f, zipfile.ZIP_DEFLATED)
- @skipUnless(zlib, "requires zlib")
+ @requires_zlib
def test_iterlines_deflated(self):
for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
self.iterlines_test(f, zipfile.ZIP_DEFLATED)
+ @requires_bz2
+ def test_read_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.read_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readline_read_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readline_read_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readline_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readline_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_readlines_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readlines_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_bz2
+ def test_iterlines_bzip2(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.iterlines_test(f, zipfile.ZIP_BZIP2)
+
+ @requires_lzma
+ def test_read_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.read_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readline_read_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readline_read_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readline_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readline_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_readlines_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.readlines_test(f, zipfile.ZIP_LZMA)
+
+ @requires_lzma
+ def test_iterlines_lzma(self):
+ for f in (TESTFN2, TemporaryFile(), io.BytesIO()):
+ self.iterlines_test(f, zipfile.ZIP_LZMA)
+
def tearDown(self):
for sep, fn in self.arcfiles.items():
os.remove(fn)
diff --git a/Lib/test/test_zipfile64.py b/Lib/test/test_zipfile64.py
index 0e7d73f..a8fb7ab 100644
--- a/Lib/test/test_zipfile64.py
+++ b/Lib/test/test_zipfile64.py
@@ -11,12 +11,6 @@ support.requires(
'test requires loads of disk-space bytes and a long time to run'
)
-# We can test part of the module without zlib.
-try:
- import zlib
-except ImportError:
- zlib = None
-
import zipfile, os, unittest
import time
import sys
@@ -24,7 +18,7 @@ import sys
from io import StringIO
from tempfile import TemporaryFile
-from test.support import TESTFN, run_unittest
+from test.support import TESTFN, run_unittest, requires_zlib
TESTFN2 = TESTFN + "2"
@@ -81,12 +75,12 @@ class TestsWithSourceFile(unittest.TestCase):
for f in TemporaryFile(), TESTFN2:
self.zipTest(f, zipfile.ZIP_STORED)
- if zlib:
- def testDeflated(self):
- # Try the temp file first. If we do TESTFN2 first, then it hogs
- # gigabytes of disk space for the duration of the test.
- for f in TemporaryFile(), TESTFN2:
- self.zipTest(f, zipfile.ZIP_DEFLATED)
+ @requires_zlib
+ def testDeflated(self):
+ # Try the temp file first. If we do TESTFN2 first, then it hogs
+ # gigabytes of disk space for the duration of the test.
+ for f in TemporaryFile(), TESTFN2:
+ self.zipTest(f, zipfile.ZIP_DEFLATED)
def tearDown(self):
for fname in TESTFN, TESTFN2:
diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py
index df5ff9d..f7cb8b9 100644
--- a/Lib/test/test_zipimport.py
+++ b/Lib/test/test_zipimport.py
@@ -9,12 +9,6 @@ import unittest
from test import support
from test.test_importhooks import ImportHooksBaseTestCase, test_src, test_co
-# some tests can be ran even without zlib
-try:
- import zlib
-except ImportError:
- zlib = None
-
from zipfile import ZipFile, ZipInfo, ZIP_STORED, ZIP_DEFLATED
import zipimport
@@ -25,7 +19,7 @@ import io
from traceback import extract_tb, extract_stack, print_tb
raise_src = 'def do_raise(): raise TypeError\n'
-def make_pyc(co, mtime):
+def make_pyc(co, mtime, size):
data = marshal.dumps(co)
if type(mtime) is type(0.0):
# Mac mtimes need a bit of special casing
@@ -33,14 +27,14 @@ def make_pyc(co, mtime):
mtime = int(mtime)
else:
mtime = int(-0x100000000 + int(mtime))
- pyc = imp.get_magic() + struct.pack("<i", int(mtime)) + data
+ pyc = imp.get_magic() + struct.pack("<ii", int(mtime), size & 0xFFFFFFFF) + data
return pyc
def module_path_to_dotted_name(path):
return path.replace(os.sep, '.')
NOW = time.time()
-test_pyc = make_pyc(test_co, NOW)
+test_pyc = make_pyc(test_co, NOW, len(test_src))
TESTMOD = "ziptestmodule"
@@ -211,6 +205,10 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
mod = zi.load_module(TESTPACK)
self.assertEqual(zi.get_filename(TESTPACK), mod.__file__)
+ existing_pack_path = __import__(TESTPACK).__path__[0]
+ expected_path_path = os.path.join(TEMP_ZIP, TESTPACK)
+ self.assertEqual(existing_pack_path, expected_path_path)
+
self.assertEqual(zi.is_package(packdir + '__init__'), False)
self.assertEqual(zi.is_package(packdir + TESTPACK2), True)
self.assertEqual(zi.is_package(packdir2 + TESTMOD), False)
@@ -299,7 +297,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
return __file__
if __loader__.get_data("some.data") != b"some data":
raise AssertionError("bad data")\n"""
- pyc = make_pyc(compile(src, "<???>", "exec"), NOW)
+ pyc = make_pyc(compile(src, "<???>", "exec"), NOW, len(src))
files = {TESTMOD + pyc_ext: (NOW, pyc),
"some.data": (NOW, "some data")}
self.doTest(pyc_ext, files, TESTMOD)
@@ -319,7 +317,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
self.doTest(".py", files, TESTMOD, call=self.assertModuleSource)
def testGetCompiledSource(self):
- pyc = make_pyc(compile(test_src, "<???>", "exec"), NOW)
+ pyc = make_pyc(compile(test_src, "<???>", "exec"), NOW, len(test_src))
files = {TESTMOD + ".py": (NOW, test_src),
TESTMOD + pyc_ext: (NOW, pyc)}
self.doTest(pyc_ext, files, TESTMOD, call=self.assertModuleSource)
@@ -392,7 +390,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
os.remove(filename)
-@unittest.skipUnless(zlib, "requires zlib")
+@support.requires_zlib
class CompressedZipImportTestCase(UncompressedZipImportTestCase):
compression = ZIP_DEFLATED
@@ -417,7 +415,7 @@ class BadFileZipImportTestCase(unittest.TestCase):
def testEmptyFile(self):
support.unlink(TESTMOD)
- open(TESTMOD, 'w+').close()
+ support.create_empty_file(TESTMOD)
self.assertZipFailure(TESTMOD)
def testFileUnreadable(self):
diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py
index 060108f..f7f3398 100644
--- a/Lib/test/test_zipimport_support.py
+++ b/Lib/test/test_zipimport_support.py
@@ -167,20 +167,19 @@ class ZipSupportTests(unittest.TestCase):
test_zipped_doctest.test_DocTestRunner.verbose_flag,
test_zipped_doctest.test_Example,
test_zipped_doctest.test_debug,
- test_zipped_doctest.test_pdb_set_trace,
- test_zipped_doctest.test_pdb_set_trace_nested,
test_zipped_doctest.test_testsource,
test_zipped_doctest.test_trailing_space_in_test,
test_zipped_doctest.test_DocTestSuite,
test_zipped_doctest.test_DocTestFinder,
]
- # These remaining tests are the ones which need access
+ # These tests are the ones which need access
# to the data files, so we don't run them
fail_due_to_missing_data_files = [
test_zipped_doctest.test_DocFileSuite,
test_zipped_doctest.test_testfile,
test_zipped_doctest.test_unittest_reportflags,
]
+
for obj in known_good_tests:
_run_object_doctest(obj, test_zipped_doctest)
finally:
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py
index c17b4d0..b6a60f4 100644
--- a/Lib/test/test_zlib.py
+++ b/Lib/test/test_zlib.py
@@ -7,10 +7,16 @@ from test.support import bigmemtest, _1G, _4G
zlib = support.import_module('zlib')
-try:
- import mmap
-except ImportError:
- mmap = None
+
+class VersionTestCase(unittest.TestCase):
+
+ def test_library_version(self):
+ # Test that the major version of the actual library in use matches the
+ # major version that we were compiled against. We can't guarantee that
+ # the minor versions will match (even on the machine on which the module
+ # was compiled), and the API is stable between minor versions, so
+ # testing only the major versions avoids spurious failures.
+ self.assertEqual(zlib.ZLIB_RUNTIME_VERSION[0], zlib.ZLIB_VERSION[0])
class ChecksumTestCase(unittest.TestCase):
@@ -173,10 +179,8 @@ class CompressTestCase(BaseCompressTestCase, unittest.TestCase):
def test_big_decompress_buffer(self, size):
self.check_big_decompress_buffer(size, zlib.decompress)
- @bigmemtest(size=_4G + 100, memuse=1)
+ @bigmemtest(size=_4G + 100, memuse=1, dry_run=False)
def test_length_overflow(self, size):
- if size < _4G + 100:
- self.skipTest("not enough free memory, need at least 4 GB")
data = b'x' * size
try:
self.assertRaises(OverflowError, zlib.compress, data, 1)
@@ -421,6 +425,35 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
dco = zlib.decompressobj()
self.assertEqual(dco.flush(), b"") # Returns nothing
+ def test_dictionary(self):
+ h = HAMLET_SCENE
+ # Build a simulated dictionary out of the words in HAMLET.
+ words = h.split()
+ random.shuffle(words)
+ zdict = b''.join(words)
+ # Use it to compress HAMLET.
+ co = zlib.compressobj(zdict=zdict)
+ cd = co.compress(h) + co.flush()
+ # Verify that it will decompress with the dictionary.
+ dco = zlib.decompressobj(zdict=zdict)
+ self.assertEqual(dco.decompress(cd) + dco.flush(), h)
+ # Verify that it fails when not given the dictionary.
+ dco = zlib.decompressobj()
+ self.assertRaises(zlib.error, dco.decompress, cd)
+
+ def test_dictionary_streaming(self):
+ # This simulates the reuse of a compressor object for compressing
+ # several separate data streams.
+ co = zlib.compressobj(zdict=HAMLET_SCENE)
+ do = zlib.decompressobj(zdict=HAMLET_SCENE)
+ piece = HAMLET_SCENE[1000:1500]
+ d0 = co.compress(piece) + co.flush(zlib.Z_SYNC_FLUSH)
+ d1 = co.compress(piece[100:]) + co.flush(zlib.Z_SYNC_FLUSH)
+ d2 = co.compress(piece[:-100]) + co.flush(zlib.Z_SYNC_FLUSH)
+ self.assertEqual(do.decompress(d0), piece)
+ self.assertEqual(do.decompress(d1), piece[100:])
+ self.assertEqual(do.decompress(d2), piece[:-100])
+
def test_decompress_incomplete_stream(self):
# This is 'foo', deflated
x = b'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E'
@@ -434,6 +467,26 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
y += dco.flush()
self.assertEqual(y, b'foo')
+ def test_decompress_eof(self):
+ x = b'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E' # 'foo'
+ dco = zlib.decompressobj()
+ self.assertFalse(dco.eof)
+ dco.decompress(x[:-5])
+ self.assertFalse(dco.eof)
+ dco.decompress(x[-5:])
+ self.assertTrue(dco.eof)
+ dco.flush()
+ self.assertTrue(dco.eof)
+
+ def test_decompress_eof_incomplete_stream(self):
+ x = b'x\x9cK\xcb\xcf\x07\x00\x02\x82\x01E' # 'foo'
+ dco = zlib.decompressobj()
+ self.assertFalse(dco.eof)
+ dco.decompress(x[:-5])
+ self.assertFalse(dco.eof)
+ dco.flush()
+ self.assertFalse(dco.eof)
+
def test_decompress_unused_data(self):
# Repeated calls to decompress() after EOF should accumulate data in
# dco.unused_data, instead of just storing the arg to the last call.
@@ -444,6 +497,7 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
for i in range(0, len(x), step))
data += dco.flush()
+ self.assertTrue(dco.eof)
self.assertEqual(data, HAMLET_SCENE)
self.assertEqual(dco.unused_data, HAMLET_SCENE)
@@ -523,10 +577,8 @@ class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase):
decompress = lambda s: d.decompress(s) + d.flush()
self.check_big_decompress_buffer(size, decompress)
- @bigmemtest(size=_4G + 100, memuse=1)
+ @bigmemtest(size=_4G + 100, memuse=1, dry_run=False)
def test_length_overflow(self, size):
- if size < _4G + 100:
- self.skipTest("not enough free memory, need at least 4 GB")
data = b'x' * size
c = zlib.compressobj(1)
d = zlib.decompressobj()
@@ -627,6 +679,7 @@ LAERTES
def test_main():
support.run_unittest(
+ VersionTestCase,
ChecksumTestCase,
ChecksumBigBufferTestCase,
ExceptionTestCase,
diff --git a/Lib/test/testbz2_bigmem.bz2 b/Lib/test/testbz2_bigmem.bz2
deleted file mode 100644
index c9a4616..0000000
--- a/Lib/test/testbz2_bigmem.bz2
+++ /dev/null
Binary files differ
diff --git a/Lib/test/threaded_import_hangers.py b/Lib/test/threaded_import_hangers.py
index adf03e3..5484e60 100644
--- a/Lib/test/threaded_import_hangers.py
+++ b/Lib/test/threaded_import_hangers.py
@@ -35,8 +35,11 @@ for name, func, args in [
("os.path.abspath", os.path.abspath, ('.',)),
]:
- t = Worker(func, args)
- t.start()
- t.join(TIMEOUT)
- if t.is_alive():
- errors.append("%s appeared to hang" % name)
+ try:
+ t = Worker(func, args)
+ t.start()
+ t.join(TIMEOUT)
+ if t.is_alive():
+ errors.append("%s appeared to hang" % name)
+ finally:
+ del t
diff --git a/Lib/test/tokenize_tests.txt b/Lib/test/tokenize_tests.txt
index 06c83b0..2c5fb10 100644
--- a/Lib/test/tokenize_tests.txt
+++ b/Lib/test/tokenize_tests.txt
@@ -114,8 +114,12 @@ x = b'abc' + B'ABC'
y = b"abc" + B"ABC"
x = br'abc' + Br'ABC' + bR'ABC' + BR'ABC'
y = br"abc" + Br"ABC" + bR"ABC" + BR"ABC"
+x = rb'abc' + rB'ABC' + Rb'ABC' + RB'ABC'
+y = rb"abc" + rB"ABC" + Rb"ABC" + RB"ABC"
x = br'\\' + BR'\\'
+x = rb'\\' + RB'\\'
x = br'\'' + ''
+x = rb'\'' + ''
y = br'''
foo bar \\
baz''' + BR'''
@@ -124,6 +128,10 @@ y = Br"""foo
bar \\ baz
""" + bR'''spam
'''
+y = rB"""foo
+bar \\ baz
+""" + Rb'''spam
+'''
# Indentation
if 1:
diff --git a/Lib/textwrap.py b/Lib/textwrap.py
index dfb4005..7024d4d 100644
--- a/Lib/textwrap.py
+++ b/Lib/textwrap.py
@@ -5,9 +5,9 @@
# Copyright (C) 2002, 2003 Python Software Foundation.
# Written by Greg Ward <gward@python.net>
-import string, re
+import re
-__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent']
+__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent']
# Hardcode the recognized whitespace characters to the US-ASCII
# whitespace characters. The main reason for doing this is that in
@@ -39,8 +39,11 @@ class TextWrapper:
of wrapped output; also counts towards each line's width.
expand_tabs (default: true)
Expand tabs in input text to spaces before further processing.
- Each tab will become 1 .. 8 spaces, depending on its position in
- its line. If false, each tab is treated as a single character.
+ Each tab will become 0 .. 'tabsize' spaces, depending on its position
+ in its line. If false, each tab is treated as a single character.
+ tabsize (default: 8)
+ Expand tabs in input text to 0 .. 'tabsize' spaces, unless
+ 'expand_tabs' is false.
replace_whitespace (default: true)
Replace all whitespace characters in the input text by spaces
after tab expansion. Note that if expand_tabs is false and
@@ -100,7 +103,8 @@ class TextWrapper:
fix_sentence_endings=False,
break_long_words=True,
drop_whitespace=True,
- break_on_hyphens=True):
+ break_on_hyphens=True,
+ tabsize=8):
self.width = width
self.initial_indent = initial_indent
self.subsequent_indent = subsequent_indent
@@ -110,6 +114,7 @@ class TextWrapper:
self.break_long_words = break_long_words
self.drop_whitespace = drop_whitespace
self.break_on_hyphens = break_on_hyphens
+ self.tabsize = tabsize
# -- Private methods -----------------------------------------------
@@ -123,7 +128,7 @@ class TextWrapper:
becomes " foo bar baz".
"""
if self.expand_tabs:
- text = text.expandtabs()
+ text = text.expandtabs(self.tabsize)
if self.replace_whitespace:
text = text.translate(self.unicode_whitespace_trans)
return text
@@ -381,6 +386,25 @@ def dedent(text):
text = re.sub(r'(?m)^' + margin, '', text)
return text
+
+def indent(text, prefix, predicate=None):
+ """Adds 'prefix' to the beginning of selected lines in 'text'.
+
+ If 'predicate' is provided, 'prefix' will only be added to the lines
+ where 'predicate(line)' is True. If 'predicate' is not provided,
+ it will default to adding 'prefix' to all non-empty lines that do not
+ consist solely of whitespace characters.
+ """
+ if predicate is None:
+ def predicate(line):
+ return line.strip()
+
+ def prefixed_lines():
+ for line in text.splitlines(True):
+ yield (prefix + line if predicate(line) else line)
+ return ''.join(prefixed_lines())
+
+
if __name__ == "__main__":
#print dedent("\tfoo\n\tbar")
#print dedent(" \thello there\n \t how are you?")
diff --git a/Lib/threading.py b/Lib/threading.py
index 58ffa7e..6c34d49 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -3,7 +3,11 @@
import sys as _sys
import _thread
-from time import time as _time, sleep as _sleep
+from time import sleep as _sleep
+try:
+ from time import monotonic as _time
+except ImportError:
+ from time import time as _time
from traceback import format_exc as _format_exc
from _weakrefset import WeakSet
@@ -19,12 +23,12 @@ from _weakrefset import WeakSet
__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
- 'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
+ 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size']
# Rename some stuff so "from threading import *" is safe
_start_new_thread = _thread.start_new_thread
_allocate_lock = _thread.allocate_lock
-_get_ident = _thread.get_ident
+get_ident = _thread.get_ident
ThreadError = _thread.error
try:
_CRLock = _thread.RLock
@@ -34,40 +38,6 @@ TIMEOUT_MAX = _thread.TIMEOUT_MAX
del _thread
-# Debug support (adapted from ihooks.py).
-
-_VERBOSE = False
-
-if __debug__:
-
- class _Verbose(object):
-
- def __init__(self, verbose=None):
- if verbose is None:
- verbose = _VERBOSE
- self._verbose = verbose
-
- def _note(self, format, *args):
- if self._verbose:
- format = format % args
- # Issue #4188: calling current_thread() can incur an infinite
- # recursion if it has to create a DummyThread on the fly.
- ident = _get_ident()
- try:
- name = _active[ident].name
- except KeyError:
- name = "<OS thread %d>" % ident
- format = "%s: %s\n" % (name, format)
- _sys.stderr.write(format)
-
-else:
- # Disable this when using "python -O"
- class _Verbose(object):
- def __init__(self, verbose=None):
- pass
- def _note(self, *args):
- pass
-
# Support for profile and trace hooks
_profile_hook = None
@@ -85,17 +55,14 @@ def settrace(func):
Lock = _allocate_lock
-def RLock(verbose=None, *args, **kwargs):
- if verbose is None:
- verbose = _VERBOSE
- if (__debug__ and verbose) or _CRLock is None:
- return _PyRLock(verbose, *args, **kwargs)
+def RLock(*args, **kwargs):
+ if _CRLock is None:
+ return _PyRLock(*args, **kwargs)
return _CRLock(*args, **kwargs)
-class _RLock(_Verbose):
+class _RLock:
- def __init__(self, verbose=None):
- _Verbose.__init__(self, verbose)
+ def __init__(self):
self._block = _allocate_lock()
self._owner = None
self._count = 0
@@ -110,37 +77,25 @@ class _RLock(_Verbose):
self.__class__.__name__, owner, self._count)
def acquire(self, blocking=True, timeout=-1):
- me = _get_ident()
+ me = get_ident()
if self._owner == me:
self._count = self._count + 1
- if __debug__:
- self._note("%s.acquire(%s): recursive success", self, blocking)
return 1
rc = self._block.acquire(blocking, timeout)
if rc:
self._owner = me
self._count = 1
- if __debug__:
- self._note("%s.acquire(%s): initial success", self, blocking)
- else:
- if __debug__:
- self._note("%s.acquire(%s): failure", self, blocking)
return rc
__enter__ = acquire
def release(self):
- if self._owner != _get_ident():
+ if self._owner != get_ident():
raise RuntimeError("cannot release un-acquired lock")
self._count = count = self._count - 1
if not count:
self._owner = None
self._block.release()
- if __debug__:
- self._note("%s.release(): final release", self)
- else:
- if __debug__:
- self._note("%s.release(): non-final release", self)
def __exit__(self, t, v, tb):
self.release()
@@ -150,12 +105,10 @@ class _RLock(_Verbose):
def _acquire_restore(self, state):
self._block.acquire()
self._count, self._owner = state
- if __debug__:
- self._note("%s._acquire_restore()", self)
def _release_save(self):
- if __debug__:
- self._note("%s._release_save()", self)
+ if self._count == 0:
+ raise RuntimeError("cannot release un-acquired lock")
count = self._count
self._count = 0
owner = self._owner
@@ -164,18 +117,14 @@ class _RLock(_Verbose):
return (count, owner)
def _is_owned(self):
- return self._owner == _get_ident()
+ return self._owner == get_ident()
_PyRLock = _RLock
-def Condition(*args, **kwargs):
- return _Condition(*args, **kwargs)
+class Condition:
-class _Condition(_Verbose):
-
- def __init__(self, lock=None, verbose=None):
- _Verbose.__init__(self, verbose)
+ def __init__(self, lock=None):
if lock is None:
lock = RLock()
self._lock = lock
@@ -234,23 +183,16 @@ class _Condition(_Verbose):
if timeout is None:
waiter.acquire()
gotit = True
- if __debug__:
- self._note("%s.wait(): got it", self)
else:
if timeout > 0:
gotit = waiter.acquire(True, timeout)
else:
gotit = waiter.acquire(False)
if not gotit:
- if __debug__:
- self._note("%s.wait(%s): timed out", self, timeout)
try:
self._waiters.remove(waiter)
except ValueError:
pass
- else:
- if __debug__:
- self._note("%s.wait(%s): got it", self, timeout)
return gotit
finally:
self._acquire_restore(saved_state)
@@ -266,19 +208,9 @@ class _Condition(_Verbose):
else:
waittime = endtime - _time()
if waittime <= 0:
- if __debug__:
- self._note("%s.wait_for(%r, %r): Timed out.",
- self, predicate, timeout)
break
- if __debug__:
- self._note("%s.wait_for(%r, %r): Waiting with timeout=%s.",
- self, predicate, timeout, waittime)
self.wait(waittime)
result = predicate()
- else:
- if __debug__:
- self._note("%s.wait_for(%r, %r): Success.",
- self, predicate, timeout)
return result
def notify(self, n=1):
@@ -287,11 +219,7 @@ class _Condition(_Verbose):
__waiters = self._waiters
waiters = __waiters[:n]
if not waiters:
- if __debug__:
- self._note("%s.notify(): no waiters", self)
return
- self._note("%s.notify(): notifying %d waiter%s", self, n,
- n!=1 and "s" or "")
for waiter in waiters:
waiter.release()
try:
@@ -305,17 +233,13 @@ class _Condition(_Verbose):
notifyAll = notify_all
-def Semaphore(*args, **kwargs):
- return _Semaphore(*args, **kwargs)
-
-class _Semaphore(_Verbose):
+class Semaphore:
# After Tim Peters' semaphore class, but not quite the same (no maximum)
- def __init__(self, value=1, verbose=None):
+ def __init__(self, value=1):
if value < 0:
raise ValueError("semaphore initial value must be >= 0")
- _Verbose.__init__(self, verbose)
self._cond = Condition(Lock())
self._value = value
@@ -328,9 +252,6 @@ class _Semaphore(_Verbose):
while self._value == 0:
if not blocking:
break
- if __debug__:
- self._note("%s.acquire(%s): blocked waiting, value=%s",
- self, blocking, self._value)
if timeout is not None:
if endtime is None:
endtime = _time() + timeout
@@ -341,9 +262,6 @@ class _Semaphore(_Verbose):
self._cond.wait(timeout)
else:
self._value = self._value - 1
- if __debug__:
- self._note("%s.acquire: success, value=%s",
- self, self._value)
rc = True
self._cond.release()
return rc
@@ -353,9 +271,6 @@ class _Semaphore(_Verbose):
def release(self):
self._cond.acquire()
self._value = self._value + 1
- if __debug__:
- self._note("%s.release: success, value=%s",
- self, self._value)
self._cond.notify()
self._cond.release()
@@ -363,30 +278,23 @@ class _Semaphore(_Verbose):
self.release()
-def BoundedSemaphore(*args, **kwargs):
- return _BoundedSemaphore(*args, **kwargs)
-
-class _BoundedSemaphore(_Semaphore):
+class BoundedSemaphore(Semaphore):
"""Semaphore that checks that # releases is <= # acquires"""
- def __init__(self, value=1, verbose=None):
- _Semaphore.__init__(self, value, verbose)
+ def __init__(self, value=1):
+ Semaphore.__init__(self, value)
self._initial_value = value
def release(self):
if self._value >= self._initial_value:
raise ValueError("Semaphore released too many times")
- return _Semaphore.release(self)
-
+ return Semaphore.release(self)
-def Event(*args, **kwargs):
- return _Event(*args, **kwargs)
-class _Event(_Verbose):
+class Event:
# After Tim Peters' event class (without is_posted())
- def __init__(self, verbose=None):
- _Verbose.__init__(self, verbose)
+ def __init__(self):
self._cond = Condition(Lock())
self._flag = False
@@ -436,13 +344,13 @@ class _Event(_Verbose):
# since the previous cycle. In addition, a 'resetting' state exists which is
# similar to 'draining' except that threads leave with a BrokenBarrierError,
# and a 'broken' state in which all threads get the exception.
-class Barrier(_Verbose):
+class Barrier:
"""
Barrier. Useful for synchronizing a fixed number of threads
at known synchronization points. Threads block on 'wait()' and are
simultaneously once they have all made that call.
"""
- def __init__(self, parties, action=None, timeout=None, verbose=None):
+ def __init__(self, parties, action=None, timeout=None):
"""
Create a barrier, initialised to 'parties' threads.
'action' is a callable which, when supplied, will be called
@@ -451,7 +359,6 @@ class Barrier(_Verbose):
If a 'timeout' is provided, it is uses as the default for
all subsequent 'wait()' calls.
"""
- _Verbose.__init__(self, verbose)
self._cond = Condition(Lock())
self._action = action
self._timeout = timeout
@@ -612,7 +519,7 @@ _dangling = WeakSet()
# Main class for threads
-class Thread(_Verbose):
+class Thread:
__initialized = False
# Need to store a reference to sys.exc_info for printing
@@ -625,16 +532,18 @@ class Thread(_Verbose):
#XXX __exc_clear = _sys.exc_clear
def __init__(self, group=None, target=None, name=None,
- args=(), kwargs=None, verbose=None):
+ args=(), kwargs=None, *, daemon=None):
assert group is None, "group argument must be None for now"
- _Verbose.__init__(self, verbose)
if kwargs is None:
kwargs = {}
self._target = target
self._name = str(name or _newname())
self._args = args
self._kwargs = kwargs
- self._daemonic = self._set_daemon()
+ if daemon is not None:
+ self._daemonic = daemon
+ else:
+ self._daemonic = current_thread().daemon
self._ident = None
self._started = Event()
self._stopped = False
@@ -652,10 +561,6 @@ class Thread(_Verbose):
self._block.__init__()
self._started._reset_internal_locks()
- def _set_daemon(self):
- # Overridden in _MainThread and _DummyThread
- return current_thread().daemon
-
def __repr__(self):
assert self._initialized, "Thread.__init__() was not called"
status = "initial"
@@ -675,8 +580,6 @@ class Thread(_Verbose):
if self._started.is_set():
raise RuntimeError("threads can only be started once")
- if __debug__:
- self._note("%s.start(): starting thread", self)
with _active_limbo_lock:
_limbo[self] = self
try:
@@ -717,7 +620,7 @@ class Thread(_Verbose):
raise
def _set_ident(self):
- self._ident = _get_ident()
+ self._ident = get_ident()
def _bootstrap_inner(self):
try:
@@ -726,24 +629,17 @@ class Thread(_Verbose):
with _active_limbo_lock:
_active[self._ident] = self
del _limbo[self]
- if __debug__:
- self._note("%s._bootstrap(): thread started", self)
if _trace_hook:
- self._note("%s._bootstrap(): registering trace hook", self)
_sys.settrace(_trace_hook)
if _profile_hook:
- self._note("%s._bootstrap(): registering profile hook", self)
_sys.setprofile(_profile_hook)
try:
self.run()
except SystemExit:
- if __debug__:
- self._note("%s._bootstrap(): raised SystemExit", self)
+ pass
except:
- if __debug__:
- self._note("%s._bootstrap(): unhandled exception", self)
# If sys.stderr is no more (most likely from interpreter
# shutdown) use self._stderr. Otherwise still use sys (as in
# _sys) in case sys.stderr was redefined since the creation of
@@ -774,9 +670,6 @@ class Thread(_Verbose):
# hog; deleting everything else is just for thoroughness
finally:
del exc_type, exc_value, exc_tb
- else:
- if __debug__:
- self._note("%s._bootstrap(): normal return", self)
finally:
# Prevent a race in
# test_threading.test_no_refcycle_through_target when
@@ -790,7 +683,7 @@ class Thread(_Verbose):
try:
# We don't call self._delete() because it also
# grabs _active_limbo_lock.
- del _active[_get_ident()]
+ del _active[get_ident()]
except:
pass
@@ -826,7 +719,7 @@ class Thread(_Verbose):
try:
with _active_limbo_lock:
- del _active[_get_ident()]
+ del _active[get_ident()]
# There must not be any python code between the previous line
# and after the lock is released. Otherwise a tracing function
# could try to acquire the lock again in the same thread, (in
@@ -843,29 +736,18 @@ class Thread(_Verbose):
if self is current_thread():
raise RuntimeError("cannot join current thread")
- if __debug__:
- if not self._stopped:
- self._note("%s.join(): waiting until thread stops", self)
-
self._block.acquire()
try:
if timeout is None:
while not self._stopped:
self._block.wait()
- if __debug__:
- self._note("%s.join(): thread stopped", self)
else:
deadline = _time() + timeout
while not self._stopped:
delay = deadline - _time()
if delay <= 0:
- if __debug__:
- self._note("%s.join(): timed out", self)
break
self._block.wait(delay)
- else:
- if __debug__:
- self._note("%s.join(): thread stopped", self)
finally:
self._block.release()
@@ -917,10 +799,7 @@ class Thread(_Verbose):
# The timer class was contributed by Itamar Shtull-Trauring
-def Timer(*args, **kwargs):
- return _Timer(*args, **kwargs)
-
-class _Timer(Thread):
+class Timer(Thread):
"""Call a function after a specified number of seconds:
t = Timer(30.0, f, args=[], kwargs={})
@@ -952,26 +831,18 @@ class _Timer(Thread):
class _MainThread(Thread):
def __init__(self):
- Thread.__init__(self, name="MainThread")
+ Thread.__init__(self, name="MainThread", daemon=False)
self._started.set()
self._set_ident()
with _active_limbo_lock:
_active[self._ident] = self
- def _set_daemon(self):
- return False
-
def _exitfunc(self):
self._stop()
t = _pickSomeNonDaemonThread()
- if t:
- if __debug__:
- self._note("%s: waiting for other threads", self)
while t:
t.join()
t = _pickSomeNonDaemonThread()
- if __debug__:
- self._note("%s: exiting", self)
self._delete()
def _pickSomeNonDaemonThread():
@@ -992,7 +863,7 @@ def _pickSomeNonDaemonThread():
class _DummyThread(Thread):
def __init__(self):
- Thread.__init__(self, name=_newname("Dummy-%d"))
+ Thread.__init__(self, name=_newname("Dummy-%d"), daemon=True)
# Thread._block consumes an OS-level locking primitive, which
# can never be used by a _DummyThread. Since a _DummyThread
@@ -1004,9 +875,6 @@ class _DummyThread(Thread):
with _active_limbo_lock:
_active[self._ident] = self
- def _set_daemon(self):
- return True
-
def _stop(self):
pass
@@ -1018,9 +886,8 @@ class _DummyThread(Thread):
def current_thread():
try:
- return _active[_get_ident()]
+ return _active[get_ident()]
except KeyError:
- ##print "current_thread(): no current thread for", _get_ident()
return _DummyThread()
currentThread = current_thread
@@ -1077,7 +944,7 @@ def _after_fork():
if thread is current:
# There is only one active thread. We reset the ident to
# its new value since it can have changed.
- ident = _get_ident()
+ ident = get_ident()
thread._ident = ident
new_active[ident] = thread
else:
diff --git a/Lib/timeit.py b/Lib/timeit.py
index 1ae59e0..4f7d28f 100644
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -9,14 +9,15 @@ the Python Cookbook, published by O'Reilly.
Library usage: see the Timer class.
Command line usage:
- python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-h] [--] [statement]
+ python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-p] [-h] [--] [statement]
Options:
-n/--number N: how many times to execute 'statement' (default: see below)
-r/--repeat N: how many times to repeat the timer (default 3)
-s/--setup S: statement to be executed once initially (default 'pass')
- -t/--time: use time.time() (default on Unix)
- -c/--clock: use time.clock() (default on Windows)
+ -p/--process: use time.process_time() (default is time.perf_counter())
+ -t/--time: use time.time() (deprecated)
+ -c/--clock: use time.clock() (deprecated)
-v/--verbose: print raw timing results; repeat for more digits precision
-h/--help: print this usage message and exit
--: separate options from statement, use when statement starts with -
@@ -66,23 +67,17 @@ __all__ = ["Timer"]
dummy_src_name = "<timeit-src>"
default_number = 1000000
default_repeat = 3
-
-if sys.platform == "win32":
- # On Windows, the best timer is time.clock()
- default_timer = time.clock
-else:
- # On most other platforms the best timer is time.time()
- default_timer = time.time
+default_timer = time.perf_counter
# Don't change the indentation of the template; the reindent() calls
# in Timer.__init__() depend on setup being indented 4 spaces and stmt
# being indented 8 spaces.
template = """
def inner(_it, _timer):
- %(setup)s
+ {setup}
_t0 = _timer()
for _i in _it:
- %(stmt)s
+ {stmt}
_t1 = _timer()
return _t1 - _t0
"""
@@ -126,9 +121,9 @@ class Timer:
stmt = reindent(stmt, 8)
if isinstance(setup, str):
setup = reindent(setup, 4)
- src = template % {'stmt': stmt, 'setup': setup}
+ src = template.format(stmt=stmt, setup=setup)
elif callable(setup):
- src = template % {'stmt': stmt, 'setup': '_setup()'}
+ src = template.format(stmt=stmt, setup='_setup()')
ns['_setup'] = setup
else:
raise ValueError("setup is neither a string nor callable")
@@ -255,9 +250,10 @@ def main(args=None, *, _wrap_timer=None):
args = sys.argv[1:]
import getopt
try:
- opts, args = getopt.getopt(args, "n:s:r:tcvh",
+ opts, args = getopt.getopt(args, "n:s:r:tcpvh",
["number=", "setup=", "repeat=",
- "time", "clock", "verbose", "help"])
+ "time", "clock", "process",
+ "verbose", "help"])
except getopt.error as err:
print(err)
print("use -h/--help for command line help")
@@ -282,6 +278,8 @@ def main(args=None, *, _wrap_timer=None):
timer = time.time
if o in ("-c", "--clock"):
timer = time.clock
+ if o in ("-p", "--process"):
+ timer = time.process_time
if o in ("-v", "--verbose"):
if verbose:
precision += 1
diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
index de85bf9..8063dd6 100644
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -30,16 +30,18 @@ button.pack(side=BOTTOM)
tk.mainloop()
"""
-__version__ = "$Revision$"
-
import sys
if sys.platform == "win32":
# Attempt to configure Tcl/Tk without requiring PATH
from tkinter import _fix
+
+import warnings
+
import _tkinter # If this fails your Python may not be configured for Tk
TclError = _tkinter.TclError
from tkinter.constants import *
+
wantobjects = 1
TkVersion = float(_tkinter.TK_VERSION)
@@ -157,6 +159,7 @@ class Variable:
Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations
that constrain the type of the value returned from get()."""
_default = ""
+ _tk = None
def __init__(self, master=None, value=None, name=None):
"""Construct a variable
@@ -167,6 +170,11 @@ class Variable:
If NAME matches an existing variable and VALUE is omitted
then the existing value is retained.
"""
+ # check for type of NAME parameter to override weird error message
+ # raised from Modules/_tkinter.c:SetVar like:
+ # TypeError: setvar() takes exactly 3 arguments (2 given)
+ if name is not None and not isinstance(name, str):
+ raise TypeError("name must be a string")
global _varnum
if not master:
master = _default_root
@@ -178,18 +186,21 @@ class Variable:
self._name = 'PY_VAR' + repr(_varnum)
_varnum += 1
if value is not None:
- self.set(value)
+ self.initialize(value)
elif not self._tk.call("info", "exists", self._name):
- self.set(self._default)
+ self.initialize(self._default)
def __del__(self):
"""Unset the variable in Tcl."""
- self._tk.globalunsetvar(self._name)
+ if (self._tk is not None and self._tk.call("info", "exists",
+ self._name)):
+ self._tk.globalunsetvar(self._name)
def __str__(self):
"""Return the name of the variable in Tcl."""
return self._name
def set(self, value):
"""Set the variable to VALUE."""
return self._tk.globalsetvar(self._name, value)
+ initialize = set
def get(self):
"""Return value of variable."""
return self._tk.globalgetvar(self._name)
@@ -264,12 +275,6 @@ class IntVar(Variable):
"""
Variable.__init__(self, master, value, name)
- def set(self, value):
- """Set the variable to value, converting booleans to integers."""
- if isinstance(value, bool):
- value = int(value)
- return Variable.set(self, value)
-
def get(self):
"""Return the value of the variable as an integer."""
return getint(self._tk.globalgetvar(self._name))
@@ -310,7 +315,10 @@ class BooleanVar(Variable):
def get(self):
"""Return the value of the variable as a bool."""
- return self._tk.getboolean(self._tk.globalgetvar(self._name))
+ try:
+ return self._tk.getboolean(self._tk.globalgetvar(self._name))
+ except TclError:
+ raise ValueError("invalid literal for getboolean()")
def mainloop(n=0):
"""Run the main loop of Tcl."""
@@ -322,7 +330,10 @@ getdouble = float
def getboolean(s):
"""Convert true and false to integer values 1 and 0."""
- return _default_root.tk.getboolean(s)
+ try:
+ return _default_root.tk.getboolean(s)
+ except TclError:
+ raise ValueError("invalid literal for getboolean()")
# Methods defined on both toplevel and interior widgets
class Misc:
@@ -412,7 +423,10 @@ class Misc:
getdouble = float
def getboolean(self, s):
"""Return a boolean value for Tcl boolean values true and false given as parameter."""
- return self.tk.getboolean(s)
+ try:
+ return self.tk.getboolean(s)
+ except TclError:
+ raise ValueError("invalid literal for getboolean()")
def focus_set(self):
"""Direct input focus to this widget.
@@ -1185,7 +1199,6 @@ class Misc:
return (e,)
def _report_exception(self):
"""Internal function."""
- import sys
exc, val, tb = sys.exc_info()
root = self._root()
root.report_callback_exception(exc, val, tb)
@@ -1260,6 +1273,13 @@ class Misc:
self.tk.call(
'place', 'slaves', self._w))]
# Grid methods that apply to the master
+ def grid_anchor(self, anchor=None): # new in Tk 8.5
+ """The anchor value controls how to place the grid within the
+ master when no row/column has any weight.
+
+ The default anchor is nw."""
+ self.tk.call('grid', 'anchor', self._w, anchor)
+ anchor = grid_anchor
def grid_bbox(self, column=None, row=None, col2=None, row2=None):
"""Return a tuple of integer coordinates for the bounding
box of this widget controlled by the geometry manager grid.
@@ -1278,7 +1298,6 @@ class Misc:
if col2 is not None and row2 is not None:
args = args + (col2, row2)
return self._getints(self.tk.call(*args)) or None
-
bbox = grid_bbox
def _grid_configure(self, command, index, cnf, kw):
"""Internal function."""
@@ -1537,6 +1556,14 @@ class Wm:
the focus. Return current focus model if MODEL is None."""
return self.tk.call('wm', 'focusmodel', self._w, model)
focusmodel = wm_focusmodel
+ def wm_forget(self, window): # new in Tk 8.5
+ """The window will be unmappend from the screen and will no longer
+ be managed by wm. toplevel windows will be treated like frame
+ windows once they are no longer managed by wm, however, the menu
+ option configuration will be remembered and the menus will return
+ once the widget is managed again."""
+ self.tk.call('wm', 'forget', window)
+ forget = wm_forget
def wm_frame(self):
"""Return identifier for decorative frame of this widget if present."""
return self.tk.call('wm', 'frame', self._w)
@@ -1590,6 +1617,31 @@ class Wm:
None is given."""
return self.tk.call('wm', 'iconname', self._w, newName)
iconname = wm_iconname
+ def wm_iconphoto(self, default=False, *args): # new in Tk 8.5
+ """Sets the titlebar icon for this window based on the named photo
+ images passed through args. If default is True, this is applied to
+ all future created toplevels as well.
+
+ The data in the images is taken as a snapshot at the time of
+ invocation. If the images are later changed, this is not reflected
+ to the titlebar icons. Multiple images are accepted to allow
+ different images sizes to be provided. The window manager may scale
+ provided icons to an appropriate size.
+
+ On Windows, the images are packed into a Windows icon structure.
+ This will override an icon specified to wm_iconbitmap, and vice
+ versa.
+
+ On X, the images are arranged into the _NET_WM_ICON X property,
+ which most modern window managers support. An icon specified by
+ wm_iconbitmap may exist simuultaneously.
+
+ On Macintosh, this currently does nothing."""
+ if default:
+ self.tk.call('wm', 'iconphoto', self._w, "-default", *args)
+ else:
+ self.tk.call('wm', 'iconphoto', self._w, *args)
+ iconphoto = wm_iconphoto
def wm_iconposition(self, x=None, y=None):
"""Set the position of the icon of this widget to X and Y. Return
a tuple of the current values of X and X if None is given."""
@@ -1601,6 +1653,12 @@ class Wm:
value if None is given."""
return self.tk.call('wm', 'iconwindow', self._w, pathName)
iconwindow = wm_iconwindow
+ def wm_manage(self, widget): # new in Tk 8.5
+ """The widget specified will become a stand alone top-level window.
+ The window will be decorated with the window managers title bar,
+ etc."""
+ self.tk.call('wm', 'manage', widget)
+ manage = wm_manage
def wm_maxsize(self, width=None, height=None):
"""Set max WIDTH and HEIGHT for this widget. If the window is gridded
the values are given in grid units. Return the current values if None
@@ -1689,7 +1747,7 @@ class Tk(Misc, Wm):
# ensure that self.tk is always _something_.
self.tk = None
if baseName is None:
- import sys, os
+ import os
baseName = os.path.basename(sys.argv[0])
baseName, ext = os.path.splitext(baseName)
if ext not in ('.py', '.pyc', '.pyo'):
@@ -1763,7 +1821,7 @@ class Tk(Misc, Wm):
exec(open(base_py).read(), dir)
def report_callback_exception(self, exc, val, tb):
"""Internal function. It reports exception on sys.stderr."""
- import traceback, sys
+ import traceback
sys.stderr.write("Exception in Tkinter callback\n")
sys.last_type = exc
sys.last_value = val
@@ -2088,25 +2146,45 @@ class Button(Widget):
"""
return self.tk.call(self._w, 'invoke')
+
# Indices:
# XXX I don't like these -- take them away
def AtEnd():
+ warnings.warn("tkinter.AtEnd will be removed in 3.4",
+ DeprecationWarning, stacklevel=2)
return 'end'
+
+
def AtInsert(*args):
+ warnings.warn("tkinter.AtInsert will be removed in 3.4",
+ DeprecationWarning, stacklevel=2)
s = 'insert'
for a in args:
if a: s = s + (' ' + a)
return s
+
+
def AtSelFirst():
+ warnings.warn("tkinter.AtSelFirst will be removed in 3.4",
+ DeprecationWarning, stacklevel=2)
return 'sel.first'
+
+
def AtSelLast():
+ warnings.warn("tkinter.AtSelLast will be removed in 3.4",
+ DeprecationWarning, stacklevel=2)
return 'sel.last'
+
+
def At(x, y=None):
+ warnings.warn("tkinter.At will be removed in 3.4",
+ DeprecationWarning, stacklevel=2)
if y is None:
return '@%r' % (x,)
else:
return '@%r,%r' % (x, y)
+
class Canvas(Widget, XView, YView):
"""Canvas widget to display graphical elements like lines or text."""
def __init__(self, master=None, cnf={}, **kw):
@@ -2692,6 +2770,10 @@ class Menu(Widget):
def unpost(self):
"""Unmap a menu."""
self.tk.call(self._w, 'unpost')
+ def xposition(self, index): # new in Tk 8.5
+ """Return the x-position of the leftmost pixel of the menu item
+ at INDEX."""
+ return getint(self.tk.call(self._w, 'xposition', index))
def yposition(self, index):
"""Return the y-position of the topmost pixel of the menu item at INDEX."""
return getint(self.tk.call(
@@ -2851,6 +2933,25 @@ class Text(Widget, XView, YView):
relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=."""
return self.tk.getboolean(self.tk.call(
self._w, 'compare', index1, op, index2))
+ def count(self, index1, index2, *args): # new in Tk 8.5
+ """Counts the number of relevant things between the two indices.
+ If index1 is after index2, the result will be a negative number
+ (and this holds for each of the possible options).
+
+ The actual items which are counted depends on the options given by
+ args. The result is a list of integers, one for the result of each
+ counting option given. Valid counting options are "chars",
+ "displaychars", "displayindices", "displaylines", "indices",
+ "lines", "xpixels" and "ypixels". There is an additional possible
+ option "update", which if given then all subsequent options ensure
+ that any possible out of date information is recalculated."""
+ args = ['-%s' % arg for arg in args if not arg.startswith('-')]
+ args += [index1, index2]
+ res = self.tk.call(self._w, 'count', *args) or None
+ if res is not None and len(args) <= 3:
+ return (res, )
+ else:
+ return res
def debug(self, boolean=None):
"""Turn on the internal consistency checks of the B-Tree inside the text
widget according to BOOLEAN."""
@@ -3013,6 +3114,24 @@ class Text(Widget, XView, YView):
def mark_previous(self, index):
"""Return the name of the previous mark before INDEX."""
return self.tk.call(self._w, 'mark', 'previous', index) or None
+ def peer_create(self, newPathName, cnf={}, **kw): # new in Tk 8.5
+ """Creates a peer text widget with the given newPathName, and any
+ optional standard configuration options. By default the peer will
+ have the same start and and end line as the parent widget, but
+ these can be overriden with the standard configuration options."""
+ self.tk.call(self._w, 'peer', 'create', newPathName,
+ *self._options(cnf, kw))
+ def peer_names(self): # new in Tk 8.5
+ """Returns a list of peers of this widget (this does not include
+ the widget itself)."""
+ return self.tk.splitlist(self.tk.call(self._w, 'peer', 'names'))
+ def replace(self, index1, index2, chars, *args): # new in Tk 8.5
+ """Replaces the range of characters between index1 and index2 with
+ the given characters and tags specified by args.
+
+ See the method insert for some more information about args, and the
+ method delete for information about the indices."""
+ self.tk.call(self._w, 'replace', index1, index2, chars, *args)
def scan_mark(self, x, y):
"""Remember the current X, Y coordinates."""
self.tk.call(self._w, 'scan', 'mark', x, y)
diff --git a/Lib/tkinter/_fix.py b/Lib/tkinter/_fix.py
index 5a69d89..5f32d25 100644
--- a/Lib/tkinter/_fix.py
+++ b/Lib/tkinter/_fix.py
@@ -46,10 +46,10 @@ else:
s = "\\" + s[3:]
return s
-prefix = os.path.join(sys.prefix,"tcl")
+prefix = os.path.join(sys.base_prefix,"tcl")
if not os.path.exists(prefix):
# devdir/../tcltk/lib
- prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
+ prefix = os.path.join(sys.base_prefix, os.path.pardir, "tcltk", "lib")
prefix = os.path.abspath(prefix)
# if this does not exist, no further search is needed
if os.path.exists(prefix):
diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py
index 98d2d5c..3ffb252 100644
--- a/Lib/tkinter/filedialog.py
+++ b/Lib/tkinter/filedialog.py
@@ -306,7 +306,6 @@ class _Dialog(commondialog.Dialog):
def _fixresult(self, widget, result):
if result:
# keep directory and filename until next time
- import os
# convert Tcl path objects to strings
try:
result = result.string
@@ -333,7 +332,6 @@ class Open(_Dialog):
# multiple results:
result = tuple([getattr(r, "string", r) for r in result])
if result:
- import os
path, file = os.path.split(result[0])
self.options["initialdir"] = path
# don't set initialfile or filename, as we have multiple of these
diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py
index 5425b06..4929241 100644
--- a/Lib/tkinter/font.py
+++ b/Lib/tkinter/font.py
@@ -2,27 +2,27 @@
#
# written by Fredrik Lundh, February 1998
#
-# FIXME: should add 'displayof' option where relevant (actual, families,
-# measure, and metrics)
-#
__version__ = "0.9"
+import itertools
import tkinter
+
# weight/slant
NORMAL = "normal"
ROMAN = "roman"
BOLD = "bold"
ITALIC = "italic"
+
def nametofont(name):
"""Given the name of a tk named font, returns a Font representation.
"""
return Font(name=name, exists=True)
-class Font:
+class Font:
"""Represents a named font.
Constructor options are:
@@ -44,6 +44,8 @@ class Font:
"""
+ counter = itertools.count(1)
+
def _set(self, kw):
options = []
for k, v in kw.items():
@@ -63,7 +65,8 @@ class Font:
options[args[i][1:]] = args[i+1]
return options
- def __init__(self, root=None, font=None, name=None, exists=False, **options):
+ def __init__(self, root=None, font=None, name=None, exists=False,
+ **options):
if not root:
root = tkinter._default_root
if font:
@@ -72,7 +75,7 @@ class Font:
else:
font = self._set(options)
if not name:
- name = "font" + str(id(self))
+ name = "font" + str(next(self.counter))
self.name = name
if exists:
@@ -118,14 +121,17 @@ class Font:
"Return a distinct copy of the current font"
return Font(self._root, **self.actual())
- def actual(self, option=None):
+ def actual(self, option=None, displayof=None):
"Return actual font attributes"
+ args = ()
+ if displayof:
+ args = ('-displayof', displayof)
if option:
- return self._call("font", "actual", self.name, "-"+option)
+ args = args + ('-' + option, )
+ return self._call("font", "actual", self.name, *args)
else:
return self._mkdict(
- self._split(self._call("font", "actual", self.name))
- )
+ self._split(self._call("font", "actual", self.name, *args)))
def cget(self, option):
"Get font attribute"
@@ -138,37 +144,47 @@ class Font:
*self._set(options))
else:
return self._mkdict(
- self._split(self._call("font", "config", self.name))
- )
+ self._split(self._call("font", "config", self.name)))
configure = config
- def measure(self, text):
+ def measure(self, text, displayof=None):
"Return text width"
- return int(self._call("font", "measure", self.name, text))
+ args = (text,)
+ if displayof:
+ args = ('-displayof', displayof, text)
+ return int(self._call("font", "measure", self.name, *args))
- def metrics(self, *options):
+ def metrics(self, *options, **kw):
"""Return font metrics.
For best performance, create a dummy widget
using this font before calling this method."""
-
+ args = ()
+ displayof = kw.pop('displayof', None)
+ if displayof:
+ args = ('-displayof', displayof)
if options:
+ args = args + self._get(options)
return int(
- self._call("font", "metrics", self.name, self._get(options))
- )
+ self._call("font", "metrics", self.name, *args))
else:
- res = self._split(self._call("font", "metrics", self.name))
+ res = self._split(self._call("font", "metrics", self.name, *args))
options = {}
for i in range(0, len(res), 2):
options[res[i][1:]] = int(res[i+1])
return options
-def families(root=None):
+
+def families(root=None, displayof=None):
"Get font families (as a tuple)"
if not root:
root = tkinter._default_root
- return root.tk.splitlist(root.tk.call("font", "families"))
+ args = ()
+ if displayof:
+ args = ('-displayof', displayof)
+ return root.tk.splitlist(root.tk.call("font", "families", *args))
+
def names(root=None):
"Get names of defined fonts (as a tuple)"
@@ -176,6 +192,7 @@ def names(root=None):
root = tkinter._default_root
return root.tk.splitlist(root.tk.call("font", "names"))
+
# --------------------------------------------------------------------
# test stuff
@@ -198,10 +215,10 @@ if __name__ == "__main__":
print(f.measure("hello"), f.metrics("linespace"))
- print(f.metrics())
+ print(f.metrics(displayof=root))
f = Font(font=("Courier", 20, "bold"))
- print(f.measure("hello"), f.metrics("linespace"))
+ print(f.measure("hello"), f.metrics("linespace", displayof=root))
w = tkinter.Label(root, text="Hello, world", font=f)
w.pack()
diff --git a/Lib/tkinter/test/test_tkinter/test_variables.py b/Lib/tkinter/test/test_tkinter/test_variables.py
new file mode 100644
index 0000000..378cc92
--- /dev/null
+++ b/Lib/tkinter/test/test_tkinter/test_variables.py
@@ -0,0 +1,165 @@
+import unittest
+
+from tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk
+
+
+class Var(Variable):
+
+ _default = "default"
+ side_effect = False
+
+ def set(self, value):
+ self.side_effect = True
+ super().set(value)
+
+
+class TestBase(unittest.TestCase):
+
+ def setUp(self):
+ self.root = Tk()
+
+ def tearDown(self):
+ self.root.destroy()
+
+
+class TestVariable(TestBase):
+
+ def test_default(self):
+ v = Variable(self.root)
+ self.assertEqual("", v.get())
+ self.assertRegex(str(v), r"^PY_VAR(\d+)$")
+
+ def test_name_and_value(self):
+ v = Variable(self.root, "sample string", "varname")
+ self.assertEqual("sample string", v.get())
+ self.assertEqual("varname", str(v))
+
+ def test___del__(self):
+ self.assertFalse(self.root.call("info", "exists", "varname"))
+ v = Variable(self.root, "sample string", "varname")
+ self.assertTrue(self.root.call("info", "exists", "varname"))
+ del v
+ self.assertFalse(self.root.call("info", "exists", "varname"))
+
+ def test_dont_unset_not_existing(self):
+ self.assertFalse(self.root.call("info", "exists", "varname"))
+ v1 = Variable(self.root, name="name")
+ v2 = Variable(self.root, name="name")
+ del v1
+ self.assertFalse(self.root.call("info", "exists", "name"))
+ # shouldn't raise exception
+ del v2
+ self.assertFalse(self.root.call("info", "exists", "name"))
+
+ def test___eq__(self):
+ # values doesn't matter, only class and name are checked
+ v1 = Variable(self.root, name="abc")
+ v2 = Variable(self.root, name="abc")
+ self.assertEqual(v1, v2)
+
+ v3 = Variable(self.root, name="abc")
+ v4 = StringVar(self.root, name="abc")
+ self.assertNotEqual(v3, v4)
+
+ def test_invalid_name(self):
+ with self.assertRaises(TypeError):
+ Variable(self.root, name=123)
+
+ def test_initialize(self):
+ v = Var()
+ self.assertFalse(v.side_effect)
+ v.set("value")
+ self.assertTrue(v.side_effect)
+
+
+class TestStringVar(TestBase):
+
+ def test_default(self):
+ v = StringVar(self.root)
+ self.assertEqual("", v.get())
+
+ def test_get(self):
+ v = StringVar(self.root, "abc", "name")
+ self.assertEqual("abc", v.get())
+ self.root.globalsetvar("name", "value")
+ self.assertEqual("value", v.get())
+
+
+class TestIntVar(TestBase):
+
+ def test_default(self):
+ v = IntVar(self.root)
+ self.assertEqual(0, v.get())
+
+ def test_get(self):
+ v = IntVar(self.root, 123, "name")
+ self.assertEqual(123, v.get())
+ self.root.globalsetvar("name", "345")
+ self.assertEqual(345, v.get())
+
+ def test_invalid_value(self):
+ v = IntVar(self.root, name="name")
+ self.root.globalsetvar("name", "value")
+ with self.assertRaises(ValueError):
+ v.get()
+ self.root.globalsetvar("name", "345.0")
+ with self.assertRaises(ValueError):
+ v.get()
+
+
+class TestDoubleVar(TestBase):
+
+ def test_default(self):
+ v = DoubleVar(self.root)
+ self.assertEqual(0.0, v.get())
+
+ def test_get(self):
+ v = DoubleVar(self.root, 1.23, "name")
+ self.assertAlmostEqual(1.23, v.get())
+ self.root.globalsetvar("name", "3.45")
+ self.assertAlmostEqual(3.45, v.get())
+
+ def test_get_from_int(self):
+ v = DoubleVar(self.root, 1.23, "name")
+ self.assertAlmostEqual(1.23, v.get())
+ self.root.globalsetvar("name", "3.45")
+ self.assertAlmostEqual(3.45, v.get())
+ self.root.globalsetvar("name", "456")
+ self.assertAlmostEqual(456, v.get())
+
+ def test_invalid_value(self):
+ v = DoubleVar(self.root, name="name")
+ self.root.globalsetvar("name", "value")
+ with self.assertRaises(ValueError):
+ v.get()
+
+
+class TestBooleanVar(TestBase):
+
+ def test_default(self):
+ v = BooleanVar(self.root)
+ self.assertEqual(False, v.get())
+
+ def test_get(self):
+ v = BooleanVar(self.root, True, "name")
+ self.assertAlmostEqual(True, v.get())
+ self.root.globalsetvar("name", "0")
+ self.assertAlmostEqual(False, v.get())
+
+ def test_invalid_value_domain(self):
+ v = BooleanVar(self.root, name="name")
+ self.root.globalsetvar("name", "value")
+ with self.assertRaises(ValueError):
+ v.get()
+ self.root.globalsetvar("name", "1.0")
+ with self.assertRaises(ValueError):
+ v.get()
+
+
+tests_gui = (TestVariable, TestStringVar, TestIntVar,
+ TestDoubleVar, TestBooleanVar)
+
+
+if __name__ == "__main__":
+ from test.support import run_unittest
+ run_unittest(*tests_gui)
diff --git a/Lib/token.py b/Lib/token.py
index 6b5320d..31fae0a 100755
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -70,7 +70,7 @@ NT_OFFSET = 256
tok_name = {value: name
for name, value in globals().items()
- if isinstance(value, int)}
+ if isinstance(value, int) and not name.startswith('_')}
__all__.extend(tok_name.values())
def ISTERMINAL(x):
diff --git a/Lib/tokenize.py b/Lib/tokenize.py
index 29c9e29..cbf91ef 100644
--- a/Lib/tokenize.py
+++ b/Lib/tokenize.py
@@ -45,6 +45,51 @@ tok_name[NL] = 'NL'
ENCODING = N_TOKENS + 2
tok_name[ENCODING] = 'ENCODING'
N_TOKENS += 3
+EXACT_TOKEN_TYPES = {
+ '(': LPAR,
+ ')': RPAR,
+ '[': LSQB,
+ ']': RSQB,
+ ':': COLON,
+ ',': COMMA,
+ ';': SEMI,
+ '+': PLUS,
+ '-': MINUS,
+ '*': STAR,
+ '/': SLASH,
+ '|': VBAR,
+ '&': AMPER,
+ '<': LESS,
+ '>': GREATER,
+ '=': EQUAL,
+ '.': DOT,
+ '%': PERCENT,
+ '{': LBRACE,
+ '}': RBRACE,
+ '==': EQEQUAL,
+ '!=': NOTEQUAL,
+ '<=': LESSEQUAL,
+ '>=': GREATEREQUAL,
+ '~': TILDE,
+ '^': CIRCUMFLEX,
+ '<<': LEFTSHIFT,
+ '>>': RIGHTSHIFT,
+ '**': DOUBLESTAR,
+ '+=': PLUSEQUAL,
+ '-=': MINEQUAL,
+ '*=': STAREQUAL,
+ '/=': SLASHEQUAL,
+ '%=': PERCENTEQUAL,
+ '&=': AMPEREQUAL,
+ '|=': VBAREQUAL,
+ '^=': CIRCUMFLEXEQUAL,
+ '<<=': LEFTSHIFTEQUAL,
+ '>>=': RIGHTSHIFTEQUAL,
+ '**=': DOUBLESTAREQUAL,
+ '//': DOUBLESLASH,
+ '//=': DOUBLESLASHEQUAL,
+ '@': AT
+}
class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')):
def __repr__(self):
@@ -52,6 +97,13 @@ class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line'
return ('TokenInfo(type=%s, string=%r, start=%r, end=%r, line=%r)' %
self._replace(type=annotated_type))
+ @property
+ def exact_type(self):
+ if self.type == OP and self.string in EXACT_TOKEN_TYPES:
+ return EXACT_TOKEN_TYPES[self.string]
+ else:
+ return self.type
+
def group(*choices): return '(' + '|'.join(choices) + ')'
def any(*choices): return group(*choices) + '*'
def maybe(*choices): return group(*choices) + '?'
@@ -75,6 +127,8 @@ Floatnumber = group(Pointfloat, Expfloat)
Imagnumber = group(r'[0-9]+[jJ]', Floatnumber + r'[jJ]')
Number = group(Imagnumber, Floatnumber, Intnumber)
+StringPrefix = r'(?:[bB][rR]?|[rR][bB]?|[uU])?'
+
# Tail end of ' string.
Single = r"[^'\\]*(?:\\.[^'\\]*)*'"
# Tail end of " string.
@@ -83,10 +137,10 @@ Double = r'[^"\\]*(?:\\.[^"\\]*)*"'
Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''"
# Tail end of """ string.
Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""'
-Triple = group("[bB]?[rR]?'''", '[bB]?[rR]?"""')
+Triple = group(StringPrefix + "'''", StringPrefix + '"""')
# Single-line ' or " string.
-String = group(r"[bB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'",
- r'[bB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"')
+String = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'",
+ StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*"')
# Because of leftmost-then-longest match semantics, be sure to put the
# longest operators first (e.g., if = came before ==, == would get
@@ -104,9 +158,9 @@ PlainToken = group(Number, Funny, String, Name)
Token = Ignore + PlainToken
# First (or only) line of ' or " string.
-ContStr = group(r"[bB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" +
+ContStr = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" +
group("'", r'\\\r?\n'),
- r'[bB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' +
+ StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' +
group('"', r'\\\r?\n'))
PseudoExtras = group(r'\\\r?\n|\Z', Comment, Triple)
PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name)
@@ -114,37 +168,49 @@ PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name)
def _compile(expr):
return re.compile(expr, re.UNICODE)
-tokenprog, pseudoprog, single3prog, double3prog = map(
- _compile, (Token, PseudoToken, Single3, Double3))
-endprogs = {"'": _compile(Single), '"': _compile(Double),
- "'''": single3prog, '"""': double3prog,
- "r'''": single3prog, 'r"""': double3prog,
- "b'''": single3prog, 'b"""': double3prog,
- "br'''": single3prog, 'br"""': double3prog,
- "R'''": single3prog, 'R"""': double3prog,
- "B'''": single3prog, 'B"""': double3prog,
- "bR'''": single3prog, 'bR"""': double3prog,
- "Br'''": single3prog, 'Br"""': double3prog,
- "BR'''": single3prog, 'BR"""': double3prog,
- 'r': None, 'R': None, 'b': None, 'B': None}
+endpats = {"'": Single, '"': Double,
+ "'''": Single3, '"""': Double3,
+ "r'''": Single3, 'r"""': Double3,
+ "b'''": Single3, 'b"""': Double3,
+ "R'''": Single3, 'R"""': Double3,
+ "B'''": Single3, 'B"""': Double3,
+ "br'''": Single3, 'br"""': Double3,
+ "bR'''": Single3, 'bR"""': Double3,
+ "Br'''": Single3, 'Br"""': Double3,
+ "BR'''": Single3, 'BR"""': Double3,
+ "rb'''": Single3, 'rb"""': Double3,
+ "Rb'''": Single3, 'Rb"""': Double3,
+ "rB'''": Single3, 'rB"""': Double3,
+ "RB'''": Single3, 'RB"""': Double3,
+ "u'''": Single3, 'u"""': Double3,
+ "R'''": Single3, 'R"""': Double3,
+ "U'''": Single3, 'U"""': Double3,
+ 'r': None, 'R': None, 'b': None, 'B': None,
+ 'u': None, 'U': None}
triple_quoted = {}
for t in ("'''", '"""',
"r'''", 'r"""', "R'''", 'R"""',
"b'''", 'b"""', "B'''", 'B"""',
"br'''", 'br"""', "Br'''", 'Br"""',
- "bR'''", 'bR"""', "BR'''", 'BR"""'):
+ "bR'''", 'bR"""', "BR'''", 'BR"""',
+ "rb'''", 'rb"""', "rB'''", 'rB"""',
+ "Rb'''", 'Rb"""', "RB'''", 'RB"""',
+ "u'''", 'u"""', "U'''", 'U"""',
+ ):
triple_quoted[t] = t
single_quoted = {}
for t in ("'", '"',
"r'", 'r"', "R'", 'R"',
"b'", 'b"', "B'", 'B"',
"br'", 'br"', "Br'", 'Br"',
- "bR'", 'bR"', "BR'", 'BR"' ):
+ "bR'", 'bR"', "BR'", 'BR"' ,
+ "rb'", 'rb"', "rB'", 'rB"',
+ "Rb'", 'Rb"', "RB'", 'RB"' ,
+ "u'", 'u"', "U'", 'U"',
+ ):
single_quoted[t] = t
-del _compile
-
tabsize = 8
class TokenError(Exception): pass
@@ -281,6 +347,10 @@ def detect_encoding(readline):
If no encoding is specified, then the default of 'utf-8' will be returned.
"""
+ try:
+ filename = readline.__self__.name
+ except AttributeError:
+ filename = None
bom_found = False
encoding = None
default = 'utf-8'
@@ -297,7 +367,10 @@ def detect_encoding(readline):
# per default encoding.
line_string = line.decode('utf-8')
except UnicodeDecodeError:
- raise SyntaxError("invalid or missing encoding declaration")
+ msg = "invalid or missing encoding declaration"
+ if filename is not None:
+ msg = '{} for {!r}'.format(msg, filename)
+ raise SyntaxError(msg)
matches = cookie_re.findall(line_string)
if not matches:
@@ -307,12 +380,21 @@ def detect_encoding(readline):
codec = lookup(encoding)
except LookupError:
# This behaviour mimics the Python interpreter
- raise SyntaxError("unknown encoding: " + encoding)
+ if filename is None:
+ msg = "unknown encoding: " + encoding
+ else:
+ msg = "unknown encoding for {!r}: {}".format(filename,
+ encoding)
+ raise SyntaxError(msg)
if bom_found:
if encoding != 'utf-8':
# This behaviour mimics the Python interpreter
- raise SyntaxError('encoding problem: utf-8')
+ if filename is None:
+ msg = 'encoding problem: utf-8'
+ else:
+ msg = 'encoding problem for {!r}: utf-8'.format(filename)
+ raise SyntaxError(msg)
encoding += '-sig'
return encoding
@@ -469,7 +551,7 @@ def _tokenize(readline, encoding):
continued = 0
while pos < max:
- pseudomatch = pseudoprog.match(line, pos)
+ pseudomatch = _compile(PseudoToken).match(line, pos)
if pseudomatch: # scan for tokens
start, end = pseudomatch.span(1)
spos, epos, pos = (lnum, start), (lnum, end), end
@@ -487,7 +569,7 @@ def _tokenize(readline, encoding):
assert not token.endswith("\n")
yield TokenInfo(COMMENT, token, spos, epos, line)
elif token in triple_quoted:
- endprog = endprogs[token]
+ endprog = _compile(endpats[token])
endmatch = endprog.match(line, pos)
if endmatch: # all on one line
pos = endmatch.end(0)
@@ -503,8 +585,9 @@ def _tokenize(readline, encoding):
token[:3] in single_quoted:
if token[-1] == '\n': # continued string
strstart = (lnum, start)
- endprog = (endprogs[initial] or endprogs[token[1]] or
- endprogs[token[2]])
+ endprog = _compile(endpats[initial] or
+ endpats[token[1]] or
+ endpats[token[2]])
contstr, needcont = line[start:], 1
contline = line
break
@@ -535,27 +618,65 @@ def _tokenize(readline, encoding):
def generate_tokens(readline):
return _tokenize(readline, None)
+def main():
+ import argparse
+
+ # Helper error handling routines
+ def perror(message):
+ print(message, file=sys.stderr)
+
+ def error(message, filename=None, location=None):
+ if location:
+ args = (filename,) + location + (message,)
+ perror("%s:%d:%d: error: %s" % args)
+ elif filename:
+ perror("%s: error: %s" % (filename, message))
+ else:
+ perror("error: %s" % message)
+ sys.exit(1)
+
+ # Parse the arguments and options
+ parser = argparse.ArgumentParser(prog='python -m tokenize')
+ parser.add_argument(dest='filename', nargs='?',
+ metavar='filename.py',
+ help='the file to tokenize; defaults to stdin')
+ parser.add_argument('-e', '--exact', dest='exact', action='store_true',
+ help='display token names using the exact type')
+ args = parser.parse_args()
+
+ try:
+ # Tokenize the input
+ if args.filename:
+ filename = args.filename
+ with builtins.open(filename, 'rb') as f:
+ tokens = list(tokenize(f.readline))
+ else:
+ filename = "<stdin>"
+ tokens = _tokenize(sys.stdin.readline, None)
+
+ # Output the tokenization
+ for token in tokens:
+ token_type = token.type
+ if args.exact:
+ token_type = token.exact_type
+ token_range = "%d,%d-%d,%d:" % (token.start + token.end)
+ print("%-20s%-15s%-15r" %
+ (token_range, tok_name[token_type], token.string))
+ except IndentationError as err:
+ line, column = err.args[1][1:3]
+ error(err.args[0], filename, (line, column))
+ except TokenError as err:
+ line, column = err.args[1]
+ error(err.args[0], filename, (line, column))
+ except SyntaxError as err:
+ error(err, filename)
+ except IOError as err:
+ error(err)
+ except KeyboardInterrupt:
+ print("interrupted\n")
+ except Exception as err:
+ perror("unexpected error: %s" % err)
+ raise
+
if __name__ == "__main__":
- # Quick sanity check
- s = b'''def parseline(self, line):
- """Parse the line into a command name and a string containing
- the arguments. Returns a tuple containing (command, args, line).
- 'command' and 'args' may be None if the line couldn't be parsed.
- """
- line = line.strip()
- if not line:
- return None, None, line
- elif line[0] == '?':
- line = 'help ' + line[1:]
- elif line[0] == '!':
- if hasattr(self, 'do_shell'):
- line = 'shell ' + line[1:]
- else:
- return None, None, line
- i, n = 0, len(line)
- while i < n and line[i] in self.identchars: i = i+1
- cmd, arg = line[:i], line[i:].strip()
- return cmd, arg, line
- '''
- for tok in tokenize(iter(s.splitlines()).__next__):
- print(tok)
+ main()
diff --git a/Lib/trace.py b/Lib/trace.py
index 850369b..317b5fd 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -39,8 +39,8 @@ Sample use, programmatically
# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
- tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,], trace=0,
- count=1)
+ tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],
+ trace=0, count=1)
# run the new command using the given tracer
tracer.run('main()')
# make a report, placing output in /tmp
@@ -48,19 +48,20 @@ Sample use, programmatically
r.write_results(show_missing=True, coverdir="/tmp")
"""
__all__ = ['Trace', 'CoverageResults']
-import io
import linecache
import os
import re
import sys
-import time
import token
import tokenize
import inspect
import gc
import dis
import pickle
-from warnings import warn as _warn
+try:
+ from time import monotonic as _time
+except ImportError:
+ from time import time as _time
try:
import threading
@@ -244,8 +245,7 @@ class CoverageResults:
"""Return True if the filename does not refer to a file
we want to have reported.
"""
- return (filename == "<string>" or
- filename.startswith("<doctest "))
+ return filename.startswith('<') and filename.endswith('>')
def update(self, other):
"""Merge in the data from another CoverageResults"""
@@ -477,7 +477,7 @@ class Trace:
self._caller_cache = {}
self.start_time = None
if timing:
- self.start_time = time.time()
+ self.start_time = _time()
if countcallers:
self.globaltrace = self.globaltrace_trackcallers
elif countfuncs:
@@ -615,7 +615,7 @@ class Trace:
self.counts[key] = self.counts.get(key, 0) + 1
if self.start_time:
- print('%.2f' % (time.time() - self.start_time), end=' ')
+ print('%.2f' % (_time() - self.start_time), end=' ')
bname = os.path.basename(filename)
print("%s(%d): %s" % (bname, lineno,
linecache.getline(filename, lineno)), end='')
@@ -628,7 +628,7 @@ class Trace:
lineno = frame.f_lineno
if self.start_time:
- print('%.2f' % (time.time() - self.start_time), end=' ')
+ print('%.2f' % (_time() - self.start_time), end=' ')
bname = os.path.basename(filename)
print("%s(%d): %s" % (bname, lineno,
linecache.getline(filename, lineno)), end='')
@@ -750,10 +750,10 @@ def main(argv=None):
# should I also call expanduser? (after all, could use $HOME)
s = s.replace("$prefix",
- os.path.join(sys.prefix, "lib",
+ os.path.join(sys.base_prefix, "lib",
"python" + sys.version[:3]))
s = s.replace("$exec_prefix",
- os.path.join(sys.exec_prefix, "lib",
+ os.path.join(sys.base_exec_prefix, "lib",
"python" + sys.version[:3]))
s = os.path.normpath(s)
ignore_dirs.append(s)
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 8d4e96e..eeb9e73 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -119,15 +119,16 @@ def _iter_chain(exc, custom_tb=None, seen=None):
seen = set()
seen.add(exc)
its = []
+ context = exc.__context__
cause = exc.__cause__
if cause is not None and cause not in seen:
- its.append(_iter_chain(cause, None, seen))
+ its.append(_iter_chain(cause, False, seen))
its.append([(_cause_message, None)])
- else:
- context = exc.__context__
- if context is not None and context not in seen:
- its.append(_iter_chain(context, None, seen))
- its.append([(_context_message, None)])
+ elif (context is not None and
+ not exc.__suppress_context__ and
+ context not in seen):
+ its.append(_iter_chain(context, None, seen))
+ its.append([(_context_message, None)])
its.append([(exc, custom_tb or exc.__traceback__)])
# itertools.chain is in an extension module and may be unavailable
for it in its:
diff --git a/Lib/turtle.py b/Lib/turtle.py
index ac0c32c..a447433 100644
--- a/Lib/turtle.py
+++ b/Lib/turtle.py
@@ -108,7 +108,6 @@ import tkinter as TK
import types
import math
import time
-import os
import inspect
from os.path import isfile, split, join
diff --git a/Lib/types.py b/Lib/types.py
index ab354d1..cfd09ea 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -12,6 +12,8 @@ def _f(): pass
FunctionType = type(_f)
LambdaType = type(lambda: None) # Same as FunctionType
CodeType = type(_f.__code__)
+MappingProxyType = type(type.__dict__)
+SimpleNamespace = type(sys.implementation)
def _g():
yield 1
@@ -39,3 +41,61 @@ GetSetDescriptorType = type(FunctionType.__code__)
MemberDescriptorType = type(FunctionType.__globals__)
del sys, _f, _g, _C, # Not for export
+
+
+# Provide a PEP 3115 compliant mechanism for class creation
+def new_class(name, bases=(), kwds=None, exec_body=None):
+ """Create a class object dynamically using the appropriate metaclass."""
+ meta, ns, kwds = prepare_class(name, bases, kwds)
+ if exec_body is not None:
+ exec_body(ns)
+ return meta(name, bases, ns, **kwds)
+
+def prepare_class(name, bases=(), kwds=None):
+ """Call the __prepare__ method of the appropriate metaclass.
+
+ Returns (metaclass, namespace, kwds) as a 3-tuple
+
+ *metaclass* is the appropriate metaclass
+ *namespace* is the prepared class namespace
+ *kwds* is an updated copy of the passed in kwds argument with any
+ 'metaclass' entry removed. If no kwds argument is passed in, this will
+ be an empty dict.
+ """
+ if kwds is None:
+ kwds = {}
+ else:
+ kwds = dict(kwds) # Don't alter the provided mapping
+ if 'metaclass' in kwds:
+ meta = kwds.pop('metaclass')
+ else:
+ if bases:
+ meta = type(bases[0])
+ else:
+ meta = type
+ if isinstance(meta, type):
+ # when meta is a type, we first determine the most-derived metaclass
+ # instead of invoking the initial candidate directly
+ meta = _calculate_meta(meta, bases)
+ if hasattr(meta, '__prepare__'):
+ ns = meta.__prepare__(name, bases, **kwds)
+ else:
+ ns = {}
+ return meta, ns, kwds
+
+def _calculate_meta(meta, bases):
+ """Calculate the most derived metaclass."""
+ winner = meta
+ for base in bases:
+ base_meta = type(base)
+ if issubclass(winner, base_meta):
+ continue
+ if issubclass(base_meta, winner):
+ winner = base_meta
+ continue
+ # else:
+ raise TypeError("metaclass conflict: "
+ "the metaclass of a derived class "
+ "must be a (non-strict) subclass "
+ "of the metaclasses of all its bases")
+ return winner
diff --git a/Lib/unittest/__main__.py b/Lib/unittest/__main__.py
index 7320050..798ebc0 100644
--- a/Lib/unittest/__main__.py
+++ b/Lib/unittest/__main__.py
@@ -2,7 +2,14 @@
import sys
if sys.argv[0].endswith("__main__.py"):
- sys.argv[0] = "python -m unittest"
+ import os.path
+ # We change sys.argv[0] to make help message more useful
+ # use executable without path, unquoted
+ # (it's just a hint anyway)
+ # (if you have spaces in your executable you get what you deserve!)
+ executable = os.path.basename(sys.executable)
+ sys.argv[0] = executable + " -m unittest"
+ del os
__unittest = True
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index bd47493..2e5cb04 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -9,8 +9,7 @@ import warnings
import collections
from . import result
-from .util import (strclass, safe_repr, sorted_list_difference,
- unorderable_list_difference, _count_diff_all_purpose,
+from .util import (strclass, safe_repr, _count_diff_all_purpose,
_count_diff_hashable)
__unittest = True
@@ -104,9 +103,9 @@ def expectedFailure(func):
class _AssertRaisesBaseContext(object):
def __init__(self, expected, test_case, callable_obj=None,
- expected_regex=None):
+ expected_regex=None):
self.expected = expected
- self.failureException = test_case.failureException
+ self.test_case = test_case
if callable_obj is not None:
try:
self.obj_name = callable_obj.__name__
@@ -117,6 +116,24 @@ class _AssertRaisesBaseContext(object):
if isinstance(expected_regex, (bytes, str)):
expected_regex = re.compile(expected_regex)
self.expected_regex = expected_regex
+ self.msg = None
+
+ def _raiseFailure(self, standardMsg):
+ msg = self.test_case._formatMessage(self.msg, standardMsg)
+ raise self.test_case.failureException(msg)
+
+ def handle(self, name, callable_obj, args, kwargs):
+ """
+ If callable_obj is None, assertRaises/Warns is being used as a
+ context manager, so check for a 'msg' kwarg and return self.
+ If callable_obj is not None, call it passing args and kwargs.
+ """
+ if callable_obj is None:
+ self.msg = kwargs.pop('msg', None)
+ return self
+ with self:
+ callable_obj(*args, **kwargs)
+
class _AssertRaisesContext(_AssertRaisesBaseContext):
@@ -132,11 +149,10 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
except AttributeError:
exc_name = str(self.expected)
if self.obj_name:
- raise self.failureException("{0} not raised by {1}"
- .format(exc_name, self.obj_name))
+ self._raiseFailure("{} not raised by {}".format(exc_name,
+ self.obj_name))
else:
- raise self.failureException("{0} not raised"
- .format(exc_name))
+ self._raiseFailure("{} not raised".format(exc_name))
if not issubclass(exc_type, self.expected):
# let unexpected exceptions pass through
return False
@@ -147,8 +163,8 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
expected_regex = self.expected_regex
if not expected_regex.search(str(exc_value)):
- raise self.failureException('"%s" does not match "%s"' %
- (expected_regex.pattern, str(exc_value)))
+ self._raiseFailure('"{}" does not match "{}"'.format(
+ expected_regex.pattern, str(exc_value)))
return True
@@ -192,14 +208,13 @@ class _AssertWarnsContext(_AssertRaisesBaseContext):
return
# Now we simply try to choose a helpful failure message
if first_matching is not None:
- raise self.failureException('"%s" does not match "%s"' %
- (self.expected_regex.pattern, str(first_matching)))
+ self._raiseFailure('"{}" does not match "{}"'.format(
+ self.expected_regex.pattern, str(first_matching)))
if self.obj_name:
- raise self.failureException("{0} not triggered by {1}"
- .format(exc_name, self.obj_name))
+ self._raiseFailure("{} not triggered by {}".format(exc_name,
+ self.obj_name))
else:
- raise self.failureException("{0} not triggered"
- .format(exc_name))
+ self._raiseFailure("{} not triggered".format(exc_name))
class TestCase(object):
@@ -452,7 +467,7 @@ class TestCase(object):
warnings.warn("TestResult has no addExpectedFailure method, reporting as passes",
RuntimeWarning)
result.addSuccess(self)
-
+ return result
finally:
result.stopTest(self)
if orig_result is None:
@@ -526,7 +541,6 @@ class TestCase(object):
except UnicodeDecodeError:
return '%s : %s' % (safe_repr(standardMsg), safe_repr(msg))
-
def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
"""Fail unless an exception of class excClass is thrown
by callableObj when invoked with arguments args and keyword
@@ -541,6 +555,9 @@ class TestCase(object):
with self.assertRaises(SomeException):
do_something()
+ An optional keyword argument 'msg' can be provided when assertRaises
+ is used as a context object.
+
The context manager keeps a reference to the exception as
the 'exception' attribute. This allows you to inspect the
exception after the assertion::
@@ -551,25 +568,25 @@ class TestCase(object):
self.assertEqual(the_exception.error_code, 3)
"""
context = _AssertRaisesContext(excClass, self, callableObj)
- if callableObj is None:
- return context
- with context:
- callableObj(*args, **kwargs)
+ return context.handle('assertRaises', callableObj, args, kwargs)
def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs):
"""Fail unless a warning of class warnClass is triggered
- by callableObj when invoked with arguments args and keyword
+ by callable_obj when invoked with arguments args and keyword
arguments kwargs. If a different type of warning is
triggered, it will not be handled: depending on the other
warning filtering rules in effect, it might be silenced, printed
out, or raised as an exception.
- If called with callableObj omitted or None, will return a
+ If called with callable_obj omitted or None, will return a
context object used like this::
with self.assertWarns(SomeWarning):
do_something()
+ An optional keyword argument 'msg' can be provided when assertWarns
+ is used as a context object.
+
The context manager keeps a reference to the first matching
warning as the 'warning' attribute; similarly, the 'filename'
and 'lineno' attributes give you information about the line
@@ -582,10 +599,7 @@ class TestCase(object):
self.assertEqual(the_warning.some_attribute, 147)
"""
context = _AssertWarnsContext(expected_warning, self, callable_obj)
- if callable_obj is None:
- return context
- with context:
- callable_obj(*args, **kwargs)
+ return context.handle('assertWarns', callable_obj, args, kwargs)
def _getAssertEqualityFunc(self, first, second):
"""Get a detailed comparison function for the types of the two args.
@@ -722,7 +736,7 @@ class TestCase(object):
msg: Optional message to use on failure instead of a list of
differences.
"""
- if seq_type != None:
+ if seq_type is not None:
seq_type_name = seq_type.__name__
if not isinstance(seq1, seq_type):
raise self.failureException('First sequence is not a %s: %s'
@@ -951,48 +965,6 @@ class TestCase(object):
self.fail(self._formatMessage(msg, standardMsg))
- def assertSameElements(self, expected_seq, actual_seq, msg=None):
- """An unordered sequence specific comparison.
-
- Raises with an error message listing which elements of expected_seq
- are missing from actual_seq and vice versa if any.
-
- Duplicate elements are ignored when comparing *expected_seq* and
- *actual_seq*. It is the equivalent of ``assertEqual(set(expected),
- set(actual))`` but it works with sequences of unhashable objects as
- well.
- """
- warnings.warn('assertSameElements is deprecated',
- DeprecationWarning)
- try:
- expected = set(expected_seq)
- actual = set(actual_seq)
- missing = sorted(expected.difference(actual))
- unexpected = sorted(actual.difference(expected))
- except TypeError:
- # Fall back to slower list-compare if any of the objects are
- # not hashable.
- expected = list(expected_seq)
- actual = list(actual_seq)
- try:
- expected.sort()
- actual.sort()
- except TypeError:
- missing, unexpected = unorderable_list_difference(expected,
- actual)
- else:
- missing, unexpected = sorted_list_difference(expected, actual)
- errors = []
- if missing:
- errors.append('Expected, but missing:\n %s' %
- safe_repr(missing))
- if unexpected:
- errors.append('Unexpected, but present:\n %s' %
- safe_repr(unexpected))
- if errors:
- standardMsg = '\n'.join(errors)
- self.fail(self._formatMessage(msg, standardMsg))
-
def assertCountEqual(self, first, second, msg=None):
"""An unordered sequence comparison asserting that the same elements,
@@ -1037,8 +1009,8 @@ class TestCase(object):
if (len(first) > self._diffThreshold or
len(second) > self._diffThreshold):
self._baseAssertEqual(first, second, msg)
- firstlines = first.splitlines(True)
- secondlines = second.splitlines(True)
+ firstlines = first.splitlines(keepends=True)
+ secondlines = second.splitlines(keepends=True)
if len(firstlines) == 1 and first.strip('\r\n') == first:
firstlines = [first + '\n']
secondlines = [second + '\n']
@@ -1106,15 +1078,15 @@ class TestCase(object):
expected_regex: Regex (re pattern object or string) expected
to be found in error message.
callable_obj: Function to be called.
+ msg: Optional message used in case of failure. Can only be used
+ when assertRaisesRegex is used as a context manager.
args: Extra args.
kwargs: Extra kwargs.
"""
context = _AssertRaisesContext(expected_exception, self, callable_obj,
expected_regex)
- if callable_obj is None:
- return context
- with context:
- callable_obj(*args, **kwargs)
+
+ return context.handle('assertRaisesRegex', callable_obj, args, kwargs)
def assertWarnsRegex(self, expected_warning, expected_regex,
callable_obj=None, *args, **kwargs):
@@ -1128,15 +1100,14 @@ class TestCase(object):
expected_regex: Regex (re pattern object or string) expected
to be found in error message.
callable_obj: Function to be called.
+ msg: Optional message used in case of failure. Can only be used
+ when assertWarnsRegex is used as a context manager.
args: Extra args.
kwargs: Extra kwargs.
"""
context = _AssertWarnsContext(expected_warning, self, callable_obj,
expected_regex)
- if callable_obj is None:
- return context
- with context:
- callable_obj(*args, **kwargs)
+ return context.handle('assertWarnsRegex', callable_obj, args, kwargs)
def assertRegex(self, text, expected_regex, msg=None):
"""Fail the test unless the text matches the regular expression."""
diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py
index 55d4e4b..a25a2f8 100644
--- a/Lib/unittest/main.py
+++ b/Lib/unittest/main.py
@@ -1,8 +1,8 @@
"""Unittest main program"""
import sys
+import optparse
import os
-import types
from . import loader, runner
from .signals import installHandler
@@ -77,6 +77,7 @@ def _convert_name(name):
def _convert_names(names):
return [_convert_name(name) for name in names]
+
class TestProgram(object):
"""A command-line program that runs a set of tests; this is primarily
for making test modules conveniently executable.
@@ -143,33 +144,9 @@ class TestProgram(object):
self._do_discovery(argv[2:])
return
- import getopt
- long_opts = ['help', 'verbose', 'quiet', 'failfast', 'catch', 'buffer']
- try:
- options, args = getopt.getopt(argv[1:], 'hHvqfcb', long_opts)
- except getopt.error as msg:
- self.usageExit(msg)
- return
-
- for opt, value in options:
- if opt in ('-h','-H','--help'):
- self.usageExit()
- if opt in ('-q','--quiet'):
- self.verbosity = 0
- if opt in ('-v','--verbose'):
- self.verbosity = 2
- if opt in ('-f','--failfast'):
- if self.failfast is None:
- self.failfast = True
- # Should this raise an exception if -f is not valid?
- if opt in ('-c','--catch'):
- if self.catchbreak is None:
- self.catchbreak = True
- # Should this raise an exception if -c is not valid?
- if opt in ('-b','--buffer'):
- if self.buffer is None:
- self.buffer = True
- # Should this raise an exception if -b is not valid?
+ parser = self._getOptParser()
+ options, args = parser.parse_args(argv[1:])
+ self._setAttributesFromOptions(options)
if len(args) == 0 and self.module is None:
# this allows "python -m unittest -v" to still work for
@@ -197,14 +174,14 @@ class TestProgram(object):
self.test = self.testLoader.loadTestsFromNames(self.testNames,
self.module)
- def _do_discovery(self, argv, Loader=loader.TestLoader):
- # handle command line args for test discovery
- self.progName = '%s discover' % self.progName
- import optparse
+ def _getOptParser(self):
parser = optparse.OptionParser()
parser.prog = self.progName
parser.add_option('-v', '--verbose', dest='verbose', default=False,
help='Verbose output', action='store_true')
+ parser.add_option('-q', '--quiet', dest='quiet', default=False,
+ help='Quiet output', action='store_true')
+
if self.failfast != False:
parser.add_option('-f', '--failfast', dest='failfast', default=False,
help='Stop on first fail or error',
@@ -217,6 +194,24 @@ class TestProgram(object):
parser.add_option('-b', '--buffer', dest='buffer', default=False,
help='Buffer stdout and stderr during tests',
action='store_true')
+ return parser
+
+ def _setAttributesFromOptions(self, options):
+ # only set options from the parsing here
+ # if they weren't set explicitly in the constructor
+ if self.failfast is None:
+ self.failfast = options.failfast
+ if self.catchbreak is None:
+ self.catchbreak = options.catchbreak
+ if self.buffer is None:
+ self.buffer = options.buffer
+
+ if options.verbose:
+ self.verbosity = 2
+ elif options.quiet:
+ self.verbosity = 0
+
+ def _addDiscoveryOptions(self, parser):
parser.add_option('-s', '--start-directory', dest='start', default='.',
help="Directory to start discovery ('.' default)")
parser.add_option('-p', '--pattern', dest='pattern', default='test*.py',
@@ -224,6 +219,12 @@ class TestProgram(object):
parser.add_option('-t', '--top-level-directory', dest='top', default=None,
help='Top level directory of project (defaults to start directory)')
+ def _do_discovery(self, argv, Loader=loader.TestLoader):
+ # handle command line args for test discovery
+ self.progName = '%s discover' % self.progName
+ parser = self._getOptParser()
+ self._addDiscoveryOptions(parser)
+
options, args = parser.parse_args(argv)
if len(args) > 3:
self.usageExit()
@@ -231,17 +232,7 @@ class TestProgram(object):
for name, value in zip(('start', 'pattern', 'top'), args):
setattr(options, name, value)
- # only set options from the parsing here
- # if they weren't set explicitly in the constructor
- if self.failfast is None:
- self.failfast = options.failfast
- if self.catchbreak is None:
- self.catchbreak = options.catchbreak
- if self.buffer is None:
- self.buffer = options.buffer
-
- if options.verbose:
- self.verbosity = 2
+ self._setAttributesFromOptions(options)
start_dir = options.start
pattern = options.pattern
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
new file mode 100644
index 0000000..324cf39
--- /dev/null
+++ b/Lib/unittest/mock.py
@@ -0,0 +1,2211 @@
+# mock.py
+# Test tools for mocking and patching.
+# Maintained by Michael Foord
+# Backport for other versions of Python available from
+# http://pypi.python.org/pypi/mock
+
+__all__ = (
+ 'Mock',
+ 'MagicMock',
+ 'patch',
+ 'sentinel',
+ 'DEFAULT',
+ 'ANY',
+ 'call',
+ 'create_autospec',
+ 'FILTER_DIR',
+ 'NonCallableMock',
+ 'NonCallableMagicMock',
+ 'mock_open',
+ 'PropertyMock',
+)
+
+
+__version__ = '1.0'
+
+
+import inspect
+import pprint
+import sys
+from functools import wraps
+
+
+BaseExceptions = (BaseException,)
+if 'java' in sys.platform:
+ # jython
+ import java
+ BaseExceptions = (BaseException, java.lang.Throwable)
+
+
+FILTER_DIR = True
+
+# Workaround for issue #12370
+# Without this, the __class__ properties wouldn't be set correctly
+_safe_super = super
+
+def _is_instance_mock(obj):
+ # can't use isinstance on Mock objects because they override __class__
+ # The base class for all mocks is NonCallableMock
+ return issubclass(type(obj), NonCallableMock)
+
+
+def _is_exception(obj):
+ return (
+ isinstance(obj, BaseExceptions) or
+ isinstance(obj, type) and issubclass(obj, BaseExceptions)
+ )
+
+
+class _slotted(object):
+ __slots__ = ['a']
+
+
+DescriptorTypes = (
+ type(_slotted.a),
+ property,
+)
+
+
+def _getsignature(func, skipfirst, instance=False):
+ if isinstance(func, type) and not instance:
+ try:
+ func = func.__init__
+ except AttributeError:
+ return
+ skipfirst = True
+ elif not isinstance(func, FunctionTypes):
+ # for classes where instance is True we end up here too
+ try:
+ func = func.__call__
+ except AttributeError:
+ return
+
+ try:
+ argspec = inspect.getfullargspec(func)
+ except TypeError:
+ # C function / method, possibly inherited object().__init__
+ return
+
+ regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec
+
+
+ # instance methods and classmethods need to lose the self argument
+ if getattr(func, '__self__', None) is not None:
+ regargs = regargs[1:]
+ if skipfirst:
+ # this condition and the above one are never both True - why?
+ regargs = regargs[1:]
+
+ signature = inspect.formatargspec(
+ regargs, varargs, varkw, defaults,
+ kwonly, kwonlydef, ann, formatvalue=lambda value: "")
+ return signature[1:-1], func
+
+
+def _check_signature(func, mock, skipfirst, instance=False):
+ if not _callable(func):
+ return
+
+ result = _getsignature(func, skipfirst, instance)
+ if result is None:
+ return
+ signature, func = result
+
+ # can't use self because "self" is common as an argument name
+ # unfortunately even not in the first place
+ src = "lambda _mock_self, %s: None" % signature
+ checksig = eval(src, {})
+ _copy_func_details(func, checksig)
+ type(mock)._mock_check_sig = checksig
+
+
+def _copy_func_details(func, funcopy):
+ funcopy.__name__ = func.__name__
+ funcopy.__doc__ = func.__doc__
+ # we explicitly don't copy func.__dict__ into this copy as it would
+ # expose original attributes that should be mocked
+ funcopy.__module__ = func.__module__
+ funcopy.__defaults__ = func.__defaults__
+ funcopy.__kwdefaults__ = func.__kwdefaults__
+
+
+def _callable(obj):
+ if isinstance(obj, type):
+ return True
+ if getattr(obj, '__call__', None) is not None:
+ return True
+ return False
+
+
+def _is_list(obj):
+ # checks for list or tuples
+ # XXXX badly named!
+ return type(obj) in (list, tuple)
+
+
+def _instance_callable(obj):
+ """Given an object, return True if the object is callable.
+ For classes, return True if instances would be callable."""
+ if not isinstance(obj, type):
+ # already an instance
+ return getattr(obj, '__call__', None) is not None
+
+ # *could* be broken by a class overriding __mro__ or __dict__ via
+ # a metaclass
+ for base in (obj,) + obj.__mro__:
+ if base.__dict__.get('__call__') is not None:
+ return True
+ return False
+
+
+def _set_signature(mock, original, instance=False):
+ # creates a function with signature (*args, **kwargs) that delegates to a
+ # mock. It still does signature checking by calling a lambda with the same
+ # signature as the original.
+ if not _callable(original):
+ return
+
+ skipfirst = isinstance(original, type)
+ result = _getsignature(original, skipfirst, instance)
+ if result is None:
+ # was a C function (e.g. object().__init__ ) that can't be mocked
+ return
+
+ signature, func = result
+
+ src = "lambda %s: None" % signature
+ checksig = eval(src, {})
+ _copy_func_details(func, checksig)
+
+ name = original.__name__
+ if not name.isidentifier():
+ name = 'funcopy'
+ context = {'_checksig_': checksig, 'mock': mock}
+ src = """def %s(*args, **kwargs):
+ _checksig_(*args, **kwargs)
+ return mock(*args, **kwargs)""" % name
+ exec (src, context)
+ funcopy = context[name]
+ _setup_func(funcopy, mock)
+ return funcopy
+
+
+def _setup_func(funcopy, mock):
+ funcopy.mock = mock
+
+ # can't use isinstance with mocks
+ if not _is_instance_mock(mock):
+ return
+
+ def assert_called_with(*args, **kwargs):
+ return mock.assert_called_with(*args, **kwargs)
+ def assert_called_once_with(*args, **kwargs):
+ return mock.assert_called_once_with(*args, **kwargs)
+ def assert_has_calls(*args, **kwargs):
+ return mock.assert_has_calls(*args, **kwargs)
+ def assert_any_call(*args, **kwargs):
+ return mock.assert_any_call(*args, **kwargs)
+ def reset_mock():
+ funcopy.method_calls = _CallList()
+ funcopy.mock_calls = _CallList()
+ mock.reset_mock()
+ ret = funcopy.return_value
+ if _is_instance_mock(ret) and not ret is mock:
+ ret.reset_mock()
+
+ funcopy.called = False
+ funcopy.call_count = 0
+ funcopy.call_args = None
+ funcopy.call_args_list = _CallList()
+ funcopy.method_calls = _CallList()
+ funcopy.mock_calls = _CallList()
+
+ funcopy.return_value = mock.return_value
+ funcopy.side_effect = mock.side_effect
+ funcopy._mock_children = mock._mock_children
+
+ funcopy.assert_called_with = assert_called_with
+ funcopy.assert_called_once_with = assert_called_once_with
+ funcopy.assert_has_calls = assert_has_calls
+ funcopy.assert_any_call = assert_any_call
+ funcopy.reset_mock = reset_mock
+
+ mock._mock_delegate = funcopy
+
+
+def _is_magic(name):
+ return '__%s__' % name[2:-2] == name
+
+
+class _SentinelObject(object):
+ "A unique, named, sentinel object."
+ def __init__(self, name):
+ self.name = name
+
+ def __repr__(self):
+ return 'sentinel.%s' % self.name
+
+
+class _Sentinel(object):
+ """Access attributes to return a named object, usable as a sentinel."""
+ def __init__(self):
+ self._sentinels = {}
+
+ def __getattr__(self, name):
+ if name == '__bases__':
+ # Without this help(unittest.mock) raises an exception
+ raise AttributeError
+ return self._sentinels.setdefault(name, _SentinelObject(name))
+
+
+sentinel = _Sentinel()
+
+DEFAULT = sentinel.DEFAULT
+_missing = sentinel.MISSING
+_deleted = sentinel.DELETED
+
+
+def _copy(value):
+ if type(value) in (dict, list, tuple, set):
+ return type(value)(value)
+ return value
+
+
+_allowed_names = set(
+ [
+ 'return_value', '_mock_return_value', 'side_effect',
+ '_mock_side_effect', '_mock_parent', '_mock_new_parent',
+ '_mock_name', '_mock_new_name'
+ ]
+)
+
+
+def _delegating_property(name):
+ _allowed_names.add(name)
+ _the_name = '_mock_' + name
+ def _get(self, name=name, _the_name=_the_name):
+ sig = self._mock_delegate
+ if sig is None:
+ return getattr(self, _the_name)
+ return getattr(sig, name)
+ def _set(self, value, name=name, _the_name=_the_name):
+ sig = self._mock_delegate
+ if sig is None:
+ self.__dict__[_the_name] = value
+ else:
+ setattr(sig, name, value)
+
+ return property(_get, _set)
+
+
+
+class _CallList(list):
+
+ def __contains__(self, value):
+ if not isinstance(value, list):
+ return list.__contains__(self, value)
+ len_value = len(value)
+ len_self = len(self)
+ if len_value > len_self:
+ return False
+
+ for i in range(0, len_self - len_value + 1):
+ sub_list = self[i:i+len_value]
+ if sub_list == value:
+ return True
+ return False
+
+ def __repr__(self):
+ return pprint.pformat(list(self))
+
+
+def _check_and_set_parent(parent, value, name, new_name):
+ if not _is_instance_mock(value):
+ return False
+ if ((value._mock_name or value._mock_new_name) or
+ (value._mock_parent is not None) or
+ (value._mock_new_parent is not None)):
+ return False
+
+ _parent = parent
+ while _parent is not None:
+ # setting a mock (value) as a child or return value of itself
+ # should not modify the mock
+ if _parent is value:
+ return False
+ _parent = _parent._mock_new_parent
+
+ if new_name:
+ value._mock_new_parent = parent
+ value._mock_new_name = new_name
+ if name:
+ value._mock_parent = parent
+ value._mock_name = name
+ return True
+
+
+
+class Base(object):
+ _mock_return_value = DEFAULT
+ _mock_side_effect = None
+ def __init__(self, *args, **kwargs):
+ pass
+
+
+
+class NonCallableMock(Base):
+ """A non-callable version of `Mock`"""
+
+ def __new__(cls, *args, **kw):
+ # every instance has its own class
+ # so we can create magic methods on the
+ # class without stomping on other mocks
+ new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
+ instance = object.__new__(new)
+ return instance
+
+
+ def __init__(
+ self, spec=None, wraps=None, name=None, spec_set=None,
+ parent=None, _spec_state=None, _new_name='', _new_parent=None,
+ **kwargs
+ ):
+ if _new_parent is None:
+ _new_parent = parent
+
+ __dict__ = self.__dict__
+ __dict__['_mock_parent'] = parent
+ __dict__['_mock_name'] = name
+ __dict__['_mock_new_name'] = _new_name
+ __dict__['_mock_new_parent'] = _new_parent
+
+ if spec_set is not None:
+ spec = spec_set
+ spec_set = True
+
+ self._mock_add_spec(spec, spec_set)
+
+ __dict__['_mock_children'] = {}
+ __dict__['_mock_wraps'] = wraps
+ __dict__['_mock_delegate'] = None
+
+ __dict__['_mock_called'] = False
+ __dict__['_mock_call_args'] = None
+ __dict__['_mock_call_count'] = 0
+ __dict__['_mock_call_args_list'] = _CallList()
+ __dict__['_mock_mock_calls'] = _CallList()
+
+ __dict__['method_calls'] = _CallList()
+
+ if kwargs:
+ self.configure_mock(**kwargs)
+
+ _safe_super(NonCallableMock, self).__init__(
+ spec, wraps, name, spec_set, parent,
+ _spec_state
+ )
+
+
+ def attach_mock(self, mock, attribute):
+ """
+ Attach a mock as an attribute of this one, replacing its name and
+ parent. Calls to the attached mock will be recorded in the
+ `method_calls` and `mock_calls` attributes of this one."""
+ mock._mock_parent = None
+ mock._mock_new_parent = None
+ mock._mock_name = ''
+ mock._mock_new_name = None
+
+ setattr(self, attribute, mock)
+
+
+ def mock_add_spec(self, spec, spec_set=False):
+ """Add a spec to a mock. `spec` can either be an object or a
+ list of strings. Only attributes on the `spec` can be fetched as
+ attributes from the mock.
+
+ If `spec_set` is True then only attributes on the spec can be set."""
+ self._mock_add_spec(spec, spec_set)
+
+
+ def _mock_add_spec(self, spec, spec_set):
+ _spec_class = None
+
+ if spec is not None and not _is_list(spec):
+ if isinstance(spec, type):
+ _spec_class = spec
+ else:
+ _spec_class = _get_class(spec)
+
+ spec = dir(spec)
+
+ __dict__ = self.__dict__
+ __dict__['_spec_class'] = _spec_class
+ __dict__['_spec_set'] = spec_set
+ __dict__['_mock_methods'] = spec
+
+
+ def __get_return_value(self):
+ ret = self._mock_return_value
+ if self._mock_delegate is not None:
+ ret = self._mock_delegate.return_value
+
+ if ret is DEFAULT:
+ ret = self._get_child_mock(
+ _new_parent=self, _new_name='()'
+ )
+ self.return_value = ret
+ return ret
+
+
+ def __set_return_value(self, value):
+ if self._mock_delegate is not None:
+ self._mock_delegate.return_value = value
+ else:
+ self._mock_return_value = value
+ _check_and_set_parent(self, value, None, '()')
+
+ __return_value_doc = "The value to be returned when the mock is called."
+ return_value = property(__get_return_value, __set_return_value,
+ __return_value_doc)
+
+
+ @property
+ def __class__(self):
+ if self._spec_class is None:
+ return type(self)
+ return self._spec_class
+
+ called = _delegating_property('called')
+ call_count = _delegating_property('call_count')
+ call_args = _delegating_property('call_args')
+ call_args_list = _delegating_property('call_args_list')
+ mock_calls = _delegating_property('mock_calls')
+
+
+ def __get_side_effect(self):
+ delegated = self._mock_delegate
+ if delegated is None:
+ return self._mock_side_effect
+ return delegated.side_effect
+
+ def __set_side_effect(self, value):
+ value = _try_iter(value)
+ delegated = self._mock_delegate
+ if delegated is None:
+ self._mock_side_effect = value
+ else:
+ delegated.side_effect = value
+
+ side_effect = property(__get_side_effect, __set_side_effect)
+
+
+ def reset_mock(self):
+ "Restore the mock object to its initial state."
+ self.called = False
+ self.call_args = None
+ self.call_count = 0
+ self.mock_calls = _CallList()
+ self.call_args_list = _CallList()
+ self.method_calls = _CallList()
+
+ for child in self._mock_children.values():
+ if isinstance(child, _SpecState):
+ continue
+ child.reset_mock()
+
+ ret = self._mock_return_value
+ if _is_instance_mock(ret) and ret is not self:
+ ret.reset_mock()
+
+
+ def configure_mock(self, **kwargs):
+ """Set attributes on the mock through keyword arguments.
+
+ Attributes plus return values and side effects can be set on child
+ mocks using standard dot notation and unpacking a dictionary in the
+ method call:
+
+ >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
+ >>> mock.configure_mock(**attrs)"""
+ for arg, val in sorted(kwargs.items(),
+ # we sort on the number of dots so that
+ # attributes are set before we set attributes on
+ # attributes
+ key=lambda entry: entry[0].count('.')):
+ args = arg.split('.')
+ final = args.pop()
+ obj = self
+ for entry in args:
+ obj = getattr(obj, entry)
+ setattr(obj, final, val)
+
+
+ def __getattr__(self, name):
+ if name == '_mock_methods':
+ raise AttributeError(name)
+ elif self._mock_methods is not None:
+ if name not in self._mock_methods or name in _all_magics:
+ raise AttributeError("Mock object has no attribute %r" % name)
+ elif _is_magic(name):
+ raise AttributeError(name)
+
+ result = self._mock_children.get(name)
+ if result is _deleted:
+ raise AttributeError(name)
+ elif result is None:
+ wraps = None
+ if self._mock_wraps is not None:
+ # XXXX should we get the attribute without triggering code
+ # execution?
+ wraps = getattr(self._mock_wraps, name)
+
+ result = self._get_child_mock(
+ parent=self, name=name, wraps=wraps, _new_name=name,
+ _new_parent=self
+ )
+ self._mock_children[name] = result
+
+ elif isinstance(result, _SpecState):
+ result = create_autospec(
+ result.spec, result.spec_set, result.instance,
+ result.parent, result.name
+ )
+ self._mock_children[name] = result
+
+ return result
+
+
+ def __repr__(self):
+ _name_list = [self._mock_new_name]
+ _parent = self._mock_new_parent
+ last = self
+
+ dot = '.'
+ if _name_list == ['()']:
+ dot = ''
+ seen = set()
+ while _parent is not None:
+ last = _parent
+
+ _name_list.append(_parent._mock_new_name + dot)
+ dot = '.'
+ if _parent._mock_new_name == '()':
+ dot = ''
+
+ _parent = _parent._mock_new_parent
+
+ # use ids here so as not to call __hash__ on the mocks
+ if id(_parent) in seen:
+ break
+ seen.add(id(_parent))
+
+ _name_list = list(reversed(_name_list))
+ _first = last._mock_name or 'mock'
+ if len(_name_list) > 1:
+ if _name_list[1] not in ('()', '().'):
+ _first += '.'
+ _name_list[0] = _first
+ name = ''.join(_name_list)
+
+ name_string = ''
+ if name not in ('mock', 'mock.'):
+ name_string = ' name=%r' % name
+
+ spec_string = ''
+ if self._spec_class is not None:
+ spec_string = ' spec=%r'
+ if self._spec_set:
+ spec_string = ' spec_set=%r'
+ spec_string = spec_string % self._spec_class.__name__
+ return "<%s%s%s id='%s'>" % (
+ type(self).__name__,
+ name_string,
+ spec_string,
+ id(self)
+ )
+
+
+ def __dir__(self):
+ """Filter the output of `dir(mock)` to only useful members."""
+ if not FILTER_DIR:
+ return object.__dir__(self)
+
+ extras = self._mock_methods or []
+ from_type = dir(type(self))
+ from_dict = list(self.__dict__)
+
+ from_type = [e for e in from_type if not e.startswith('_')]
+ from_dict = [e for e in from_dict if not e.startswith('_') or
+ _is_magic(e)]
+ return sorted(set(extras + from_type + from_dict +
+ list(self._mock_children)))
+
+
+ def __setattr__(self, name, value):
+ if name in _allowed_names:
+ # property setters go through here
+ return object.__setattr__(self, name, value)
+ elif (self._spec_set and self._mock_methods is not None and
+ name not in self._mock_methods and
+ name not in self.__dict__):
+ raise AttributeError("Mock object has no attribute '%s'" % name)
+ elif name in _unsupported_magics:
+ msg = 'Attempting to set unsupported magic method %r.' % name
+ raise AttributeError(msg)
+ elif name in _all_magics:
+ if self._mock_methods is not None and name not in self._mock_methods:
+ raise AttributeError("Mock object has no attribute '%s'" % name)
+
+ if not _is_instance_mock(value):
+ setattr(type(self), name, _get_method(name, value))
+ original = value
+ value = lambda *args, **kw: original(self, *args, **kw)
+ else:
+ # only set _new_name and not name so that mock_calls is tracked
+ # but not method calls
+ _check_and_set_parent(self, value, None, name)
+ setattr(type(self), name, value)
+ self._mock_children[name] = value
+ elif name == '__class__':
+ self._spec_class = value
+ return
+ else:
+ if _check_and_set_parent(self, value, name, name):
+ self._mock_children[name] = value
+ return object.__setattr__(self, name, value)
+
+
+ def __delattr__(self, name):
+ if name in _all_magics and name in type(self).__dict__:
+ delattr(type(self), name)
+ if name not in self.__dict__:
+ # for magic methods that are still MagicProxy objects and
+ # not set on the instance itself
+ return
+
+ if name in self.__dict__:
+ object.__delattr__(self, name)
+
+ obj = self._mock_children.get(name, _missing)
+ if obj is _deleted:
+ raise AttributeError(name)
+ if obj is not _missing:
+ del self._mock_children[name]
+ self._mock_children[name] = _deleted
+
+
+
+ def _format_mock_call_signature(self, args, kwargs):
+ name = self._mock_name or 'mock'
+ return _format_call_signature(name, args, kwargs)
+
+
+ def _format_mock_failure_message(self, args, kwargs):
+ message = 'Expected call: %s\nActual call: %s'
+ expected_string = self._format_mock_call_signature(args, kwargs)
+ call_args = self.call_args
+ if len(call_args) == 3:
+ call_args = call_args[1:]
+ actual_string = self._format_mock_call_signature(*call_args)
+ return message % (expected_string, actual_string)
+
+
+ def assert_called_with(_mock_self, *args, **kwargs):
+ """assert that the mock was called with the specified arguments.
+
+ Raises an AssertionError if the args and keyword args passed in are
+ different to the last call to the mock."""
+ self = _mock_self
+ if self.call_args is None:
+ expected = self._format_mock_call_signature(args, kwargs)
+ raise AssertionError('Expected call: %s\nNot called' % (expected,))
+
+ if self.call_args != (args, kwargs):
+ msg = self._format_mock_failure_message(args, kwargs)
+ raise AssertionError(msg)
+
+
+ def assert_called_once_with(_mock_self, *args, **kwargs):
+ """assert that the mock was called exactly once and with the specified
+ arguments."""
+ self = _mock_self
+ if not self.call_count == 1:
+ msg = ("Expected '%s' to be called once. Called %s times." %
+ (self._mock_name or 'mock', self.call_count))
+ raise AssertionError(msg)
+ return self.assert_called_with(*args, **kwargs)
+
+
+ def assert_has_calls(self, calls, any_order=False):
+ """assert the mock has been called with the specified calls.
+ The `mock_calls` list is checked for the calls.
+
+ If `any_order` is False (the default) then the calls must be
+ sequential. There can be extra calls before or after the
+ specified calls.
+
+ If `any_order` is True then the calls can be in any order, but
+ they must all appear in `mock_calls`."""
+ if not any_order:
+ if calls not in self.mock_calls:
+ raise AssertionError(
+ 'Calls not found.\nExpected: %r\n'
+ 'Actual: %r' % (calls, self.mock_calls)
+ )
+ return
+
+ all_calls = list(self.mock_calls)
+
+ not_found = []
+ for kall in calls:
+ try:
+ all_calls.remove(kall)
+ except ValueError:
+ not_found.append(kall)
+ if not_found:
+ raise AssertionError(
+ '%r not all found in call list' % (tuple(not_found),)
+ )
+
+
+ def assert_any_call(self, *args, **kwargs):
+ """assert the mock has been called with the specified arguments.
+
+ The assert passes if the mock has *ever* been called, unlike
+ `assert_called_with` and `assert_called_once_with` that only pass if
+ the call is the most recent one."""
+ kall = call(*args, **kwargs)
+ if kall not in self.call_args_list:
+ expected_string = self._format_mock_call_signature(args, kwargs)
+ raise AssertionError(
+ '%s call not found' % expected_string
+ )
+
+
+ def _get_child_mock(self, **kw):
+ """Create the child mocks for attributes and return value.
+ By default child mocks will be the same type as the parent.
+ Subclasses of Mock may want to override this to customize the way
+ child mocks are made.
+
+ For non-callable mocks the callable variant will be used (rather than
+ any custom subclass)."""
+ _type = type(self)
+ if not issubclass(_type, CallableMixin):
+ if issubclass(_type, NonCallableMagicMock):
+ klass = MagicMock
+ elif issubclass(_type, NonCallableMock) :
+ klass = Mock
+ else:
+ klass = _type.__mro__[1]
+ return klass(**kw)
+
+
+
+def _try_iter(obj):
+ if obj is None:
+ return obj
+ if _is_exception(obj):
+ return obj
+ if _callable(obj):
+ return obj
+ try:
+ return iter(obj)
+ except TypeError:
+ # XXXX backwards compatibility
+ # but this will blow up on first call - so maybe we should fail early?
+ return obj
+
+
+
+class CallableMixin(Base):
+
+ def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
+ wraps=None, name=None, spec_set=None, parent=None,
+ _spec_state=None, _new_name='', _new_parent=None, **kwargs):
+ self.__dict__['_mock_return_value'] = return_value
+
+ _safe_super(CallableMixin, self).__init__(
+ spec, wraps, name, spec_set, parent,
+ _spec_state, _new_name, _new_parent, **kwargs
+ )
+
+ self.side_effect = side_effect
+
+
+ def _mock_check_sig(self, *args, **kwargs):
+ # stub method that can be replaced with one with a specific signature
+ pass
+
+
+ def __call__(_mock_self, *args, **kwargs):
+ # can't use self in-case a function / method we are mocking uses self
+ # in the signature
+ _mock_self._mock_check_sig(*args, **kwargs)
+ return _mock_self._mock_call(*args, **kwargs)
+
+
+ def _mock_call(_mock_self, *args, **kwargs):
+ self = _mock_self
+ self.called = True
+ self.call_count += 1
+ self.call_args = _Call((args, kwargs), two=True)
+ self.call_args_list.append(_Call((args, kwargs), two=True))
+
+ _new_name = self._mock_new_name
+ _new_parent = self._mock_new_parent
+ self.mock_calls.append(_Call(('', args, kwargs)))
+
+ seen = set()
+ skip_next_dot = _new_name == '()'
+ do_method_calls = self._mock_parent is not None
+ name = self._mock_name
+ while _new_parent is not None:
+ this_mock_call = _Call((_new_name, args, kwargs))
+ if _new_parent._mock_new_name:
+ dot = '.'
+ if skip_next_dot:
+ dot = ''
+
+ skip_next_dot = False
+ if _new_parent._mock_new_name == '()':
+ skip_next_dot = True
+
+ _new_name = _new_parent._mock_new_name + dot + _new_name
+
+ if do_method_calls:
+ if _new_name == name:
+ this_method_call = this_mock_call
+ else:
+ this_method_call = _Call((name, args, kwargs))
+ _new_parent.method_calls.append(this_method_call)
+
+ do_method_calls = _new_parent._mock_parent is not None
+ if do_method_calls:
+ name = _new_parent._mock_name + '.' + name
+
+ _new_parent.mock_calls.append(this_mock_call)
+ _new_parent = _new_parent._mock_new_parent
+
+ # use ids here so as not to call __hash__ on the mocks
+ _new_parent_id = id(_new_parent)
+ if _new_parent_id in seen:
+ break
+ seen.add(_new_parent_id)
+
+ ret_val = DEFAULT
+ effect = self.side_effect
+ if effect is not None:
+ if _is_exception(effect):
+ raise effect
+
+ if not _callable(effect):
+ result = next(effect)
+ if _is_exception(result):
+ raise result
+ return result
+
+ ret_val = effect(*args, **kwargs)
+ if ret_val is DEFAULT:
+ ret_val = self.return_value
+
+ if (self._mock_wraps is not None and
+ self._mock_return_value is DEFAULT):
+ return self._mock_wraps(*args, **kwargs)
+ if ret_val is DEFAULT:
+ ret_val = self.return_value
+ return ret_val
+
+
+
+class Mock(CallableMixin, NonCallableMock):
+ """
+ Create a new `Mock` object. `Mock` takes several optional arguments
+ that specify the behaviour of the Mock object:
+
+ * `spec`: This can be either a list of strings or an existing object (a
+ class or instance) that acts as the specification for the mock object. If
+ you pass in an object then a list of strings is formed by calling dir on
+ the object (excluding unsupported magic attributes and methods). Accessing
+ any attribute not in this list will raise an `AttributeError`.
+
+ If `spec` is an object (rather than a list of strings) then
+ `mock.__class__` returns the class of the spec object. This allows mocks
+ to pass `isinstance` tests.
+
+ * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
+ or get an attribute on the mock that isn't on the object passed as
+ `spec_set` will raise an `AttributeError`.
+
+ * `side_effect`: A function to be called whenever the Mock is called. See
+ the `side_effect` attribute. Useful for raising exceptions or
+ dynamically changing return values. The function is called with the same
+ arguments as the mock, and unless it returns `DEFAULT`, the return
+ value of this function is used as the return value.
+
+ If `side_effect` is an iterable then each call to the mock will return
+ the next value from the iterable. If any of the members of the iterable
+ are exceptions they will be raised instead of returned.
+
+ If `side_effect` is an iterable then each call to the mock will return
+ the next value from the iterable.
+
+ * `return_value`: The value returned when the mock is called. By default
+ this is a new Mock (created on first access). See the
+ `return_value` attribute.
+
+ * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
+ calling the Mock will pass the call through to the wrapped object
+ (returning the real result). Attribute access on the mock will return a
+ Mock object that wraps the corresponding attribute of the wrapped object
+ (so attempting to access an attribute that doesn't exist will raise an
+ `AttributeError`).
+
+ If the mock has an explicit `return_value` set then calls are not passed
+ to the wrapped object and the `return_value` is returned instead.
+
+ * `name`: If the mock has a name then it will be used in the repr of the
+ mock. This can be useful for debugging. The name is propagated to child
+ mocks.
+
+ Mocks can also be called with arbitrary keyword arguments. These will be
+ used to set attributes on the mock after it is created.
+ """
+
+
+
+def _dot_lookup(thing, comp, import_path):
+ try:
+ return getattr(thing, comp)
+ except AttributeError:
+ __import__(import_path)
+ return getattr(thing, comp)
+
+
+def _importer(target):
+ components = target.split('.')
+ import_path = components.pop(0)
+ thing = __import__(import_path)
+
+ for comp in components:
+ import_path += ".%s" % comp
+ thing = _dot_lookup(thing, comp, import_path)
+ return thing
+
+
+def _is_started(patcher):
+ # XXXX horrible
+ return hasattr(patcher, 'is_local')
+
+
+class _patch(object):
+
+ attribute_name = None
+ _active_patches = set()
+
+ def __init__(
+ self, getter, attribute, new, spec, create,
+ spec_set, autospec, new_callable, kwargs
+ ):
+ if new_callable is not None:
+ if new is not DEFAULT:
+ raise ValueError(
+ "Cannot use 'new' and 'new_callable' together"
+ )
+ if autospec is not None:
+ raise ValueError(
+ "Cannot use 'autospec' and 'new_callable' together"
+ )
+
+ self.getter = getter
+ self.attribute = attribute
+ self.new = new
+ self.new_callable = new_callable
+ self.spec = spec
+ self.create = create
+ self.has_local = False
+ self.spec_set = spec_set
+ self.autospec = autospec
+ self.kwargs = kwargs
+ self.additional_patchers = []
+
+
+ def copy(self):
+ patcher = _patch(
+ self.getter, self.attribute, self.new, self.spec,
+ self.create, self.spec_set,
+ self.autospec, self.new_callable, self.kwargs
+ )
+ patcher.attribute_name = self.attribute_name
+ patcher.additional_patchers = [
+ p.copy() for p in self.additional_patchers
+ ]
+ return patcher
+
+
+ def __call__(self, func):
+ if isinstance(func, type):
+ return self.decorate_class(func)
+ return self.decorate_callable(func)
+
+
+ def decorate_class(self, klass):
+ for attr in dir(klass):
+ if not attr.startswith(patch.TEST_PREFIX):
+ continue
+
+ attr_value = getattr(klass, attr)
+ if not hasattr(attr_value, "__call__"):
+ continue
+
+ patcher = self.copy()
+ setattr(klass, attr, patcher(attr_value))
+ return klass
+
+
+ def decorate_callable(self, func):
+ if hasattr(func, 'patchings'):
+ func.patchings.append(self)
+ return func
+
+ @wraps(func)
+ def patched(*args, **keywargs):
+ extra_args = []
+ entered_patchers = []
+
+ exc_info = tuple()
+ try:
+ for patching in patched.patchings:
+ arg = patching.__enter__()
+ entered_patchers.append(patching)
+ if patching.attribute_name is not None:
+ keywargs.update(arg)
+ elif patching.new is DEFAULT:
+ extra_args.append(arg)
+
+ args += tuple(extra_args)
+ return func(*args, **keywargs)
+ except:
+ if (patching not in entered_patchers and
+ _is_started(patching)):
+ # the patcher may have been started, but an exception
+ # raised whilst entering one of its additional_patchers
+ entered_patchers.append(patching)
+ # Pass the exception to __exit__
+ exc_info = sys.exc_info()
+ # re-raise the exception
+ raise
+ finally:
+ for patching in reversed(entered_patchers):
+ patching.__exit__(*exc_info)
+
+ patched.patchings = [self]
+ return patched
+
+
+ def get_original(self):
+ target = self.getter()
+ name = self.attribute
+
+ original = DEFAULT
+ local = False
+
+ try:
+ original = target.__dict__[name]
+ except (AttributeError, KeyError):
+ original = getattr(target, name, DEFAULT)
+ else:
+ local = True
+
+ if not self.create and original is DEFAULT:
+ raise AttributeError(
+ "%s does not have the attribute %r" % (target, name)
+ )
+ return original, local
+
+
+ def __enter__(self):
+ """Perform the patch."""
+ new, spec, spec_set = self.new, self.spec, self.spec_set
+ autospec, kwargs = self.autospec, self.kwargs
+ new_callable = self.new_callable
+ self.target = self.getter()
+
+ # normalise False to None
+ if spec is False:
+ spec = None
+ if spec_set is False:
+ spec_set = None
+ if autospec is False:
+ autospec = None
+
+ if spec is not None and autospec is not None:
+ raise TypeError("Can't specify spec and autospec")
+ if ((spec is not None or autospec is not None) and
+ spec_set not in (True, None)):
+ raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
+
+ original, local = self.get_original()
+
+ if new is DEFAULT and autospec is None:
+ inherit = False
+ if spec is True:
+ # set spec to the object we are replacing
+ spec = original
+ if spec_set is True:
+ spec_set = original
+ spec = None
+ elif spec is not None:
+ if spec_set is True:
+ spec_set = spec
+ spec = None
+ elif spec_set is True:
+ spec_set = original
+
+ if spec is not None or spec_set is not None:
+ if original is DEFAULT:
+ raise TypeError("Can't use 'spec' with create=True")
+ if isinstance(original, type):
+ # If we're patching out a class and there is a spec
+ inherit = True
+
+ Klass = MagicMock
+ _kwargs = {}
+ if new_callable is not None:
+ Klass = new_callable
+ elif spec is not None or spec_set is not None:
+ this_spec = spec
+ if spec_set is not None:
+ this_spec = spec_set
+ if _is_list(this_spec):
+ not_callable = '__call__' not in this_spec
+ else:
+ not_callable = not callable(this_spec)
+ if not_callable:
+ Klass = NonCallableMagicMock
+
+ if spec is not None:
+ _kwargs['spec'] = spec
+ if spec_set is not None:
+ _kwargs['spec_set'] = spec_set
+
+ # add a name to mocks
+ if (isinstance(Klass, type) and
+ issubclass(Klass, NonCallableMock) and self.attribute):
+ _kwargs['name'] = self.attribute
+
+ _kwargs.update(kwargs)
+ new = Klass(**_kwargs)
+
+ if inherit and _is_instance_mock(new):
+ # we can only tell if the instance should be callable if the
+ # spec is not a list
+ this_spec = spec
+ if spec_set is not None:
+ this_spec = spec_set
+ if (not _is_list(this_spec) and not
+ _instance_callable(this_spec)):
+ Klass = NonCallableMagicMock
+
+ _kwargs.pop('name')
+ new.return_value = Klass(_new_parent=new, _new_name='()',
+ **_kwargs)
+ elif autospec is not None:
+ # spec is ignored, new *must* be default, spec_set is treated
+ # as a boolean. Should we check spec is not None and that spec_set
+ # is a bool?
+ if new is not DEFAULT:
+ raise TypeError(
+ "autospec creates the mock for you. Can't specify "
+ "autospec and new."
+ )
+ if original is DEFAULT:
+ raise TypeError("Can't use 'autospec' with create=True")
+ spec_set = bool(spec_set)
+ if autospec is True:
+ autospec = original
+
+ new = create_autospec(autospec, spec_set=spec_set,
+ _name=self.attribute, **kwargs)
+ elif kwargs:
+ # can't set keyword args when we aren't creating the mock
+ # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
+ raise TypeError("Can't pass kwargs to a mock we aren't creating")
+
+ new_attr = new
+
+ self.temp_original = original
+ self.is_local = local
+ setattr(self.target, self.attribute, new_attr)
+ if self.attribute_name is not None:
+ extra_args = {}
+ if self.new is DEFAULT:
+ extra_args[self.attribute_name] = new
+ for patching in self.additional_patchers:
+ arg = patching.__enter__()
+ if patching.new is DEFAULT:
+ extra_args.update(arg)
+ return extra_args
+
+ return new
+
+
+ def __exit__(self, *exc_info):
+ """Undo the patch."""
+ if not _is_started(self):
+ raise RuntimeError('stop called on unstarted patcher')
+
+ if self.is_local and self.temp_original is not DEFAULT:
+ setattr(self.target, self.attribute, self.temp_original)
+ else:
+ delattr(self.target, self.attribute)
+ if not self.create and not hasattr(self.target, self.attribute):
+ # needed for proxy objects like django settings
+ setattr(self.target, self.attribute, self.temp_original)
+
+ del self.temp_original
+ del self.is_local
+ del self.target
+ for patcher in reversed(self.additional_patchers):
+ if _is_started(patcher):
+ patcher.__exit__(*exc_info)
+
+
+ def start(self):
+ """Activate a patch, returning any created mock."""
+ result = self.__enter__()
+ self._active_patches.add(self)
+ return result
+
+
+ def stop(self):
+ """Stop an active patch."""
+ self._active_patches.discard(self)
+ return self.__exit__()
+
+
+
+def _get_target(target):
+ try:
+ target, attribute = target.rsplit('.', 1)
+ except (TypeError, ValueError):
+ raise TypeError("Need a valid target to patch. You supplied: %r" %
+ (target,))
+ getter = lambda: _importer(target)
+ return getter, attribute
+
+
+def _patch_object(
+ target, attribute, new=DEFAULT, spec=None,
+ create=False, spec_set=None, autospec=None,
+ new_callable=None, **kwargs
+ ):
+ """
+ patch the named member (`attribute`) on an object (`target`) with a mock
+ object.
+
+ `patch.object` can be used as a decorator, class decorator or a context
+ manager. Arguments `new`, `spec`, `create`, `spec_set`,
+ `autospec` and `new_callable` have the same meaning as for `patch`. Like
+ `patch`, `patch.object` takes arbitrary keyword arguments for configuring
+ the mock object it creates.
+
+ When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
+ for choosing which methods to wrap.
+ """
+ getter = lambda: target
+ return _patch(
+ getter, attribute, new, spec, create,
+ spec_set, autospec, new_callable, kwargs
+ )
+
+
+def _patch_multiple(target, spec=None, create=False, spec_set=None,
+ autospec=None, new_callable=None, **kwargs):
+ """Perform multiple patches in a single call. It takes the object to be
+ patched (either as an object or a string to fetch the object by importing)
+ and keyword arguments for the patches::
+
+ with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
+ ...
+
+ Use `DEFAULT` as the value if you want `patch.multiple` to create
+ mocks for you. In this case the created mocks are passed into a decorated
+ function by keyword, and a dictionary is returned when `patch.multiple` is
+ used as a context manager.
+
+ `patch.multiple` can be used as a decorator, class decorator or a context
+ manager. The arguments `spec`, `spec_set`, `create`,
+ `autospec` and `new_callable` have the same meaning as for `patch`. These
+ arguments will be applied to *all* patches done by `patch.multiple`.
+
+ When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
+ for choosing which methods to wrap.
+ """
+ if type(target) is str:
+ getter = lambda: _importer(target)
+ else:
+ getter = lambda: target
+
+ if not kwargs:
+ raise ValueError(
+ 'Must supply at least one keyword argument with patch.multiple'
+ )
+ # need to wrap in a list for python 3, where items is a view
+ items = list(kwargs.items())
+ attribute, new = items[0]
+ patcher = _patch(
+ getter, attribute, new, spec, create, spec_set,
+ autospec, new_callable, {}
+ )
+ patcher.attribute_name = attribute
+ for attribute, new in items[1:]:
+ this_patcher = _patch(
+ getter, attribute, new, spec, create, spec_set,
+ autospec, new_callable, {}
+ )
+ this_patcher.attribute_name = attribute
+ patcher.additional_patchers.append(this_patcher)
+ return patcher
+
+
+def patch(
+ target, new=DEFAULT, spec=None, create=False,
+ spec_set=None, autospec=None, new_callable=None, **kwargs
+ ):
+ """
+ `patch` acts as a function decorator, class decorator or a context
+ manager. Inside the body of the function or with statement, the `target`
+ is patched with a `new` object. When the function/with statement exits
+ the patch is undone.
+
+ If `new` is omitted, then the target is replaced with a
+ `MagicMock`. If `patch` is used as a decorator and `new` is
+ omitted, the created mock is passed in as an extra argument to the
+ decorated function. If `patch` is used as a context manager the created
+ mock is returned by the context manager.
+
+ `target` should be a string in the form `'package.module.ClassName'`. The
+ `target` is imported and the specified object replaced with the `new`
+ object, so the `target` must be importable from the environment you are
+ calling `patch` from. The target is imported when the decorated function
+ is executed, not at decoration time.
+
+ The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
+ if patch is creating one for you.
+
+ In addition you can pass `spec=True` or `spec_set=True`, which causes
+ patch to pass in the object being mocked as the spec/spec_set object.
+
+ `new_callable` allows you to specify a different class, or callable object,
+ that will be called to create the `new` object. By default `MagicMock` is
+ used.
+
+ A more powerful form of `spec` is `autospec`. If you set `autospec=True`
+ then the mock with be created with a spec from the object being replaced.
+ All attributes of the mock will also have the spec of the corresponding
+ attribute of the object being replaced. Methods and functions being
+ mocked will have their arguments checked and will raise a `TypeError` if
+ they are called with the wrong signature. For mocks replacing a class,
+ their return value (the 'instance') will have the same spec as the class.
+
+ Instead of `autospec=True` you can pass `autospec=some_object` to use an
+ arbitrary object as the spec instead of the one being replaced.
+
+ By default `patch` will fail to replace attributes that don't exist. If
+ you pass in `create=True`, and the attribute doesn't exist, patch will
+ create the attribute for you when the patched function is called, and
+ delete it again afterwards. This is useful for writing tests against
+ attributes that your production code creates at runtime. It is off by by
+ default because it can be dangerous. With it switched on you can write
+ passing tests against APIs that don't actually exist!
+
+ Patch can be used as a `TestCase` class decorator. It works by
+ decorating each test method in the class. This reduces the boilerplate
+ code when your test methods share a common patchings set. `patch` finds
+ tests by looking for method names that start with `patch.TEST_PREFIX`.
+ By default this is `test`, which matches the way `unittest` finds tests.
+ You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
+
+ Patch can be used as a context manager, with the with statement. Here the
+ patching applies to the indented block after the with statement. If you
+ use "as" then the patched object will be bound to the name after the
+ "as"; very useful if `patch` is creating a mock object for you.
+
+ `patch` takes arbitrary keyword arguments. These will be passed to
+ the `Mock` (or `new_callable`) on construction.
+
+ `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
+ available for alternate use-cases.
+ """
+ getter, attribute = _get_target(target)
+ return _patch(
+ getter, attribute, new, spec, create,
+ spec_set, autospec, new_callable, kwargs
+ )
+
+
+class _patch_dict(object):
+ """
+ Patch a dictionary, or dictionary like object, and restore the dictionary
+ to its original state after the test.
+
+ `in_dict` can be a dictionary or a mapping like container. If it is a
+ mapping then it must at least support getting, setting and deleting items
+ plus iterating over keys.
+
+ `in_dict` can also be a string specifying the name of the dictionary, which
+ will then be fetched by importing it.
+
+ `values` can be a dictionary of values to set in the dictionary. `values`
+ can also be an iterable of `(key, value)` pairs.
+
+ If `clear` is True then the dictionary will be cleared before the new
+ values are set.
+
+ `patch.dict` can also be called with arbitrary keyword arguments to set
+ values in the dictionary::
+
+ with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
+ ...
+
+ `patch.dict` can be used as a context manager, decorator or class
+ decorator. When used as a class decorator `patch.dict` honours
+ `patch.TEST_PREFIX` for choosing which methods to wrap.
+ """
+
+ def __init__(self, in_dict, values=(), clear=False, **kwargs):
+ if isinstance(in_dict, str):
+ in_dict = _importer(in_dict)
+ self.in_dict = in_dict
+ # support any argument supported by dict(...) constructor
+ self.values = dict(values)
+ self.values.update(kwargs)
+ self.clear = clear
+ self._original = None
+
+
+ def __call__(self, f):
+ if isinstance(f, type):
+ return self.decorate_class(f)
+ @wraps(f)
+ def _inner(*args, **kw):
+ self._patch_dict()
+ try:
+ return f(*args, **kw)
+ finally:
+ self._unpatch_dict()
+
+ return _inner
+
+
+ def decorate_class(self, klass):
+ for attr in dir(klass):
+ attr_value = getattr(klass, attr)
+ if (attr.startswith(patch.TEST_PREFIX) and
+ hasattr(attr_value, "__call__")):
+ decorator = _patch_dict(self.in_dict, self.values, self.clear)
+ decorated = decorator(attr_value)
+ setattr(klass, attr, decorated)
+ return klass
+
+
+ def __enter__(self):
+ """Patch the dict."""
+ self._patch_dict()
+
+
+ def _patch_dict(self):
+ values = self.values
+ in_dict = self.in_dict
+ clear = self.clear
+
+ try:
+ original = in_dict.copy()
+ except AttributeError:
+ # dict like object with no copy method
+ # must support iteration over keys
+ original = {}
+ for key in in_dict:
+ original[key] = in_dict[key]
+ self._original = original
+
+ if clear:
+ _clear_dict(in_dict)
+
+ try:
+ in_dict.update(values)
+ except AttributeError:
+ # dict like object with no update method
+ for key in values:
+ in_dict[key] = values[key]
+
+
+ def _unpatch_dict(self):
+ in_dict = self.in_dict
+ original = self._original
+
+ _clear_dict(in_dict)
+
+ try:
+ in_dict.update(original)
+ except AttributeError:
+ for key in original:
+ in_dict[key] = original[key]
+
+
+ def __exit__(self, *args):
+ """Unpatch the dict."""
+ self._unpatch_dict()
+ return False
+
+ start = __enter__
+ stop = __exit__
+
+
+def _clear_dict(in_dict):
+ try:
+ in_dict.clear()
+ except AttributeError:
+ keys = list(in_dict)
+ for key in keys:
+ del in_dict[key]
+
+
+def _patch_stopall():
+ """Stop all active patches."""
+ for patch in list(_patch._active_patches):
+ patch.stop()
+
+
+patch.object = _patch_object
+patch.dict = _patch_dict
+patch.multiple = _patch_multiple
+patch.stopall = _patch_stopall
+patch.TEST_PREFIX = 'test'
+
+magic_methods = (
+ "lt le gt ge eq ne "
+ "getitem setitem delitem "
+ "len contains iter "
+ "hash str sizeof "
+ "enter exit "
+ "divmod neg pos abs invert "
+ "complex int float index "
+ "trunc floor ceil "
+ "bool next "
+)
+
+numerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
+inplace = ' '.join('i%s' % n for n in numerics.split())
+right = ' '.join('r%s' % n for n in numerics.split())
+
+# not including __prepare__, __instancecheck__, __subclasscheck__
+# (as they are metaclass methods)
+# __del__ is not supported at all as it causes problems if it exists
+
+_non_defaults = set('__%s__' % method for method in [
+ 'get', 'set', 'delete', 'reversed', 'missing', 'reduce', 'reduce_ex',
+ 'getinitargs', 'getnewargs', 'getstate', 'setstate', 'getformat',
+ 'setformat', 'repr', 'dir', 'subclasses', 'format',
+])
+
+
+def _get_method(name, func):
+ "Turns a callable object (like a mock) into a real function"
+ def method(self, *args, **kw):
+ return func(self, *args, **kw)
+ method.__name__ = name
+ return method
+
+
+_magics = set(
+ '__%s__' % method for method in
+ ' '.join([magic_methods, numerics, inplace, right]).split()
+)
+
+_all_magics = _magics | _non_defaults
+
+_unsupported_magics = set([
+ '__getattr__', '__setattr__',
+ '__init__', '__new__', '__prepare__'
+ '__instancecheck__', '__subclasscheck__',
+ '__del__'
+])
+
+_calculate_return_value = {
+ '__hash__': lambda self: object.__hash__(self),
+ '__str__': lambda self: object.__str__(self),
+ '__sizeof__': lambda self: object.__sizeof__(self),
+}
+
+_return_values = {
+ '__lt__': NotImplemented,
+ '__gt__': NotImplemented,
+ '__le__': NotImplemented,
+ '__ge__': NotImplemented,
+ '__int__': 1,
+ '__contains__': False,
+ '__len__': 0,
+ '__exit__': False,
+ '__complex__': 1j,
+ '__float__': 1.0,
+ '__bool__': True,
+ '__index__': 1,
+}
+
+
+def _get_eq(self):
+ def __eq__(other):
+ ret_val = self.__eq__._mock_return_value
+ if ret_val is not DEFAULT:
+ return ret_val
+ return self is other
+ return __eq__
+
+def _get_ne(self):
+ def __ne__(other):
+ if self.__ne__._mock_return_value is not DEFAULT:
+ return DEFAULT
+ return self is not other
+ return __ne__
+
+def _get_iter(self):
+ def __iter__():
+ ret_val = self.__iter__._mock_return_value
+ if ret_val is DEFAULT:
+ return iter([])
+ # if ret_val was already an iterator, then calling iter on it should
+ # return the iterator unchanged
+ return iter(ret_val)
+ return __iter__
+
+_side_effect_methods = {
+ '__eq__': _get_eq,
+ '__ne__': _get_ne,
+ '__iter__': _get_iter,
+}
+
+
+
+def _set_return_value(mock, method, name):
+ fixed = _return_values.get(name, DEFAULT)
+ if fixed is not DEFAULT:
+ method.return_value = fixed
+ return
+
+ return_calulator = _calculate_return_value.get(name)
+ if return_calulator is not None:
+ try:
+ return_value = return_calulator(mock)
+ except AttributeError:
+ # XXXX why do we return AttributeError here?
+ # set it as a side_effect instead?
+ return_value = AttributeError(name)
+ method.return_value = return_value
+ return
+
+ side_effector = _side_effect_methods.get(name)
+ if side_effector is not None:
+ method.side_effect = side_effector(mock)
+
+
+
+class MagicMixin(object):
+ def __init__(self, *args, **kw):
+ _safe_super(MagicMixin, self).__init__(*args, **kw)
+ self._mock_set_magics()
+
+
+ def _mock_set_magics(self):
+ these_magics = _magics
+
+ if self._mock_methods is not None:
+ these_magics = _magics.intersection(self._mock_methods)
+
+ remove_magics = set()
+ remove_magics = _magics - these_magics
+
+ for entry in remove_magics:
+ if entry in type(self).__dict__:
+ # remove unneeded magic methods
+ delattr(self, entry)
+
+ # don't overwrite existing attributes if called a second time
+ these_magics = these_magics - set(type(self).__dict__)
+
+ _type = type(self)
+ for entry in these_magics:
+ setattr(_type, entry, MagicProxy(entry, self))
+
+
+
+class NonCallableMagicMock(MagicMixin, NonCallableMock):
+ """A version of `MagicMock` that isn't callable."""
+ def mock_add_spec(self, spec, spec_set=False):
+ """Add a spec to a mock. `spec` can either be an object or a
+ list of strings. Only attributes on the `spec` can be fetched as
+ attributes from the mock.
+
+ If `spec_set` is True then only attributes on the spec can be set."""
+ self._mock_add_spec(spec, spec_set)
+ self._mock_set_magics()
+
+
+
+class MagicMock(MagicMixin, Mock):
+ """
+ MagicMock is a subclass of Mock with default implementations
+ of most of the magic methods. You can use MagicMock without having to
+ configure the magic methods yourself.
+
+ If you use the `spec` or `spec_set` arguments then *only* magic
+ methods that exist in the spec will be created.
+
+ Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
+ """
+ def mock_add_spec(self, spec, spec_set=False):
+ """Add a spec to a mock. `spec` can either be an object or a
+ list of strings. Only attributes on the `spec` can be fetched as
+ attributes from the mock.
+
+ If `spec_set` is True then only attributes on the spec can be set."""
+ self._mock_add_spec(spec, spec_set)
+ self._mock_set_magics()
+
+
+
+class MagicProxy(object):
+ def __init__(self, name, parent):
+ self.name = name
+ self.parent = parent
+
+ def __call__(self, *args, **kwargs):
+ m = self.create_mock()
+ return m(*args, **kwargs)
+
+ def create_mock(self):
+ entry = self.name
+ parent = self.parent
+ m = parent._get_child_mock(name=entry, _new_name=entry,
+ _new_parent=parent)
+ setattr(parent, entry, m)
+ _set_return_value(parent, m, entry)
+ return m
+
+ def __get__(self, obj, _type=None):
+ return self.create_mock()
+
+
+
+class _ANY(object):
+ "A helper object that compares equal to everything."
+
+ def __eq__(self, other):
+ return True
+
+ def __ne__(self, other):
+ return False
+
+ def __repr__(self):
+ return '<ANY>'
+
+ANY = _ANY()
+
+
+
+def _format_call_signature(name, args, kwargs):
+ message = '%s(%%s)' % name
+ formatted_args = ''
+ args_string = ', '.join([repr(arg) for arg in args])
+ kwargs_string = ', '.join([
+ '%s=%r' % (key, value) for key, value in kwargs.items()
+ ])
+ if args_string:
+ formatted_args = args_string
+ if kwargs_string:
+ if formatted_args:
+ formatted_args += ', '
+ formatted_args += kwargs_string
+
+ return message % formatted_args
+
+
+
+class _Call(tuple):
+ """
+ A tuple for holding the results of a call to a mock, either in the form
+ `(args, kwargs)` or `(name, args, kwargs)`.
+
+ If args or kwargs are empty then a call tuple will compare equal to
+ a tuple without those values. This makes comparisons less verbose::
+
+ _Call(('name', (), {})) == ('name',)
+ _Call(('name', (1,), {})) == ('name', (1,))
+ _Call(((), {'a': 'b'})) == ({'a': 'b'},)
+
+ The `_Call` object provides a useful shortcut for comparing with call::
+
+ _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
+ _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
+
+ If the _Call has no name then it will match any name.
+ """
+ def __new__(cls, value=(), name=None, parent=None, two=False,
+ from_kall=True):
+ name = ''
+ args = ()
+ kwargs = {}
+ _len = len(value)
+ if _len == 3:
+ name, args, kwargs = value
+ elif _len == 2:
+ first, second = value
+ if isinstance(first, str):
+ name = first
+ if isinstance(second, tuple):
+ args = second
+ else:
+ kwargs = second
+ else:
+ args, kwargs = first, second
+ elif _len == 1:
+ value, = value
+ if isinstance(value, str):
+ name = value
+ elif isinstance(value, tuple):
+ args = value
+ else:
+ kwargs = value
+
+ if two:
+ return tuple.__new__(cls, (args, kwargs))
+
+ return tuple.__new__(cls, (name, args, kwargs))
+
+
+ def __init__(self, value=(), name=None, parent=None, two=False,
+ from_kall=True):
+ self.name = name
+ self.parent = parent
+ self.from_kall = from_kall
+
+
+ def __eq__(self, other):
+ if other is ANY:
+ return True
+ try:
+ len_other = len(other)
+ except TypeError:
+ return False
+
+ self_name = ''
+ if len(self) == 2:
+ self_args, self_kwargs = self
+ else:
+ self_name, self_args, self_kwargs = self
+
+ other_name = ''
+ if len_other == 0:
+ other_args, other_kwargs = (), {}
+ elif len_other == 3:
+ other_name, other_args, other_kwargs = other
+ elif len_other == 1:
+ value, = other
+ if isinstance(value, tuple):
+ other_args = value
+ other_kwargs = {}
+ elif isinstance(value, str):
+ other_name = value
+ other_args, other_kwargs = (), {}
+ else:
+ other_args = ()
+ other_kwargs = value
+ else:
+ # len 2
+ # could be (name, args) or (name, kwargs) or (args, kwargs)
+ first, second = other
+ if isinstance(first, str):
+ other_name = first
+ if isinstance(second, tuple):
+ other_args, other_kwargs = second, {}
+ else:
+ other_args, other_kwargs = (), second
+ else:
+ other_args, other_kwargs = first, second
+
+ if self_name and other_name != self_name:
+ return False
+
+ # this order is important for ANY to work!
+ return (other_args, other_kwargs) == (self_args, self_kwargs)
+
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+
+ def __call__(self, *args, **kwargs):
+ if self.name is None:
+ return _Call(('', args, kwargs), name='()')
+
+ name = self.name + '()'
+ return _Call((self.name, args, kwargs), name=name, parent=self)
+
+
+ def __getattr__(self, attr):
+ if self.name is None:
+ return _Call(name=attr, from_kall=False)
+ name = '%s.%s' % (self.name, attr)
+ return _Call(name=name, parent=self, from_kall=False)
+
+
+ def __repr__(self):
+ if not self.from_kall:
+ name = self.name or 'call'
+ if name.startswith('()'):
+ name = 'call%s' % name
+ return name
+
+ if len(self) == 2:
+ name = 'call'
+ args, kwargs = self
+ else:
+ name, args, kwargs = self
+ if not name:
+ name = 'call'
+ elif not name.startswith('()'):
+ name = 'call.%s' % name
+ else:
+ name = 'call%s' % name
+ return _format_call_signature(name, args, kwargs)
+
+
+ def call_list(self):
+ """For a call object that represents multiple calls, `call_list`
+ returns a list of all the intermediate calls as well as the
+ final call."""
+ vals = []
+ thing = self
+ while thing is not None:
+ if thing.from_kall:
+ vals.append(thing)
+ thing = thing.parent
+ return _CallList(reversed(vals))
+
+
+call = _Call(from_kall=False)
+
+
+
+def create_autospec(spec, spec_set=False, instance=False, _parent=None,
+ _name=None, **kwargs):
+ """Create a mock object using another object as a spec. Attributes on the
+ mock will use the corresponding attribute on the `spec` object as their
+ spec.
+
+ Functions or methods being mocked will have their arguments checked
+ to check that they are called with the correct signature.
+
+ If `spec_set` is True then attempting to set attributes that don't exist
+ on the spec object will raise an `AttributeError`.
+
+ If a class is used as a spec then the return value of the mock (the
+ instance of the class) will have the same spec. You can use a class as the
+ spec for an instance object by passing `instance=True`. The returned mock
+ will only be callable if instances of the mock are callable.
+
+ `create_autospec` also takes arbitrary keyword arguments that are passed to
+ the constructor of the created mock."""
+ if _is_list(spec):
+ # can't pass a list instance to the mock constructor as it will be
+ # interpreted as a list of strings
+ spec = type(spec)
+
+ is_type = isinstance(spec, type)
+
+ _kwargs = {'spec': spec}
+ if spec_set:
+ _kwargs = {'spec_set': spec}
+ elif spec is None:
+ # None we mock with a normal mock without a spec
+ _kwargs = {}
+
+ _kwargs.update(kwargs)
+
+ Klass = MagicMock
+ if type(spec) in DescriptorTypes:
+ # descriptors don't have a spec
+ # because we don't know what type they return
+ _kwargs = {}
+ elif not _callable(spec):
+ Klass = NonCallableMagicMock
+ elif is_type and instance and not _instance_callable(spec):
+ Klass = NonCallableMagicMock
+
+ _new_name = _name
+ if _parent is None:
+ # for a top level object no _new_name should be set
+ _new_name = ''
+
+ mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
+ name=_name, **_kwargs)
+
+ if isinstance(spec, FunctionTypes):
+ # should only happen at the top level because we don't
+ # recurse for functions
+ mock = _set_signature(mock, spec)
+ else:
+ _check_signature(spec, mock, is_type, instance)
+
+ if _parent is not None and not instance:
+ _parent._mock_children[_name] = mock
+
+ if is_type and not instance and 'return_value' not in kwargs:
+ mock.return_value = create_autospec(spec, spec_set, instance=True,
+ _name='()', _parent=mock)
+
+ for entry in dir(spec):
+ if _is_magic(entry):
+ # MagicMock already does the useful magic methods for us
+ continue
+
+ # XXXX do we need a better way of getting attributes without
+ # triggering code execution (?) Probably not - we need the actual
+ # object to mock it so we would rather trigger a property than mock
+ # the property descriptor. Likewise we want to mock out dynamically
+ # provided attributes.
+ # XXXX what about attributes that raise exceptions other than
+ # AttributeError on being fetched?
+ # we could be resilient against it, or catch and propagate the
+ # exception when the attribute is fetched from the mock
+ try:
+ original = getattr(spec, entry)
+ except AttributeError:
+ continue
+
+ kwargs = {'spec': original}
+ if spec_set:
+ kwargs = {'spec_set': original}
+
+ if not isinstance(original, FunctionTypes):
+ new = _SpecState(original, spec_set, mock, entry, instance)
+ mock._mock_children[entry] = new
+ else:
+ parent = mock
+ if isinstance(spec, FunctionTypes):
+ parent = mock.mock
+
+ new = MagicMock(parent=parent, name=entry, _new_name=entry,
+ _new_parent=parent, **kwargs)
+ mock._mock_children[entry] = new
+ skipfirst = _must_skip(spec, entry, is_type)
+ _check_signature(original, new, skipfirst=skipfirst)
+
+ # so functions created with _set_signature become instance attributes,
+ # *plus* their underlying mock exists in _mock_children of the parent
+ # mock. Adding to _mock_children may be unnecessary where we are also
+ # setting as an instance attribute?
+ if isinstance(new, FunctionTypes):
+ setattr(mock, entry, new)
+
+ return mock
+
+
+def _must_skip(spec, entry, is_type):
+ if not isinstance(spec, type):
+ if entry in getattr(spec, '__dict__', {}):
+ # instance attribute - shouldn't skip
+ return False
+ spec = spec.__class__
+
+ for klass in spec.__mro__:
+ result = klass.__dict__.get(entry, DEFAULT)
+ if result is DEFAULT:
+ continue
+ if isinstance(result, (staticmethod, classmethod)):
+ return False
+ return is_type
+
+ # shouldn't get here unless function is a dynamically provided attribute
+ # XXXX untested behaviour
+ return is_type
+
+
+def _get_class(obj):
+ try:
+ return obj.__class__
+ except AttributeError:
+ # it is possible for objects to have no __class__
+ return type(obj)
+
+
+class _SpecState(object):
+
+ def __init__(self, spec, spec_set=False, parent=None,
+ name=None, ids=None, instance=False):
+ self.spec = spec
+ self.ids = ids
+ self.spec_set = spec_set
+ self.parent = parent
+ self.instance = instance
+ self.name = name
+
+
+FunctionTypes = (
+ # python function
+ type(create_autospec),
+ # instance method
+ type(ANY.__eq__),
+)
+
+
+file_spec = None
+
+
+def mock_open(mock=None, read_data=''):
+ """
+ A helper function to create a mock to replace the use of `open`. It works
+ for `open` called directly or used as a context manager.
+
+ The `mock` argument is the mock object to configure. If `None` (the
+ default) then a `MagicMock` will be created for you, with the API limited
+ to methods or attributes available on standard file handles.
+
+ `read_data` is a string for the `read` method of the file handle to return.
+ This is an empty string by default.
+ """
+ global file_spec
+ if file_spec is None:
+ import _io
+ file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
+
+ if mock is None:
+ mock = MagicMock(name='open', spec=open)
+
+ handle = MagicMock(spec=file_spec)
+ handle.write.return_value = None
+ handle.__enter__.return_value = handle
+ handle.read.return_value = read_data
+
+ mock.return_value = handle
+ return mock
+
+
+class PropertyMock(Mock):
+ """
+ A mock intended to be used as a property, or other descriptor, on a class.
+ `PropertyMock` provides `__get__` and `__set__` methods so you can specify
+ a return value when it is fetched.
+
+ Fetching a `PropertyMock` instance from an object calls the mock, with
+ no args. Setting it calls the mock with the value being set.
+ """
+ def _get_child_mock(self, **kwargs):
+ return MagicMock(**kwargs)
+
+ def __get__(self, obj, obj_type):
+ return self()
+ def __set__(self, obj, val):
+ self(val)
diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py
index 44bf186..97e5426 100644
--- a/Lib/unittest/result.py
+++ b/Lib/unittest/result.py
@@ -1,6 +1,5 @@
"""Test result object"""
-import os
import io
import sys
import traceback
diff --git a/Lib/unittest/test/__init__.py b/Lib/unittest/test/__init__.py
index 99b730b..cdae8a7 100644
--- a/Lib/unittest/test/__init__.py
+++ b/Lib/unittest/test/__init__.py
@@ -14,6 +14,7 @@ def suite():
__import__(modname)
module = sys.modules[modname]
suite.addTest(loader.loadTestsFromModule(module))
+ suite.addTest(loader.loadTestsFromName('unittest.test.testmock'))
return suite
diff --git a/Lib/unittest/test/_test_warnings.py b/Lib/unittest/test/_test_warnings.py
index d0be18d..5cbfb53 100644
--- a/Lib/unittest/test/_test_warnings.py
+++ b/Lib/unittest/test/_test_warnings.py
@@ -10,7 +10,6 @@ combinations of warnings args and -W flags and check that the output is correct.
See #10535.
"""
-import io
import sys
import unittest
import warnings
diff --git a/Lib/unittest/test/test_assertions.py b/Lib/unittest/test/test_assertions.py
index a1d20eb..d43fe5a 100644
--- a/Lib/unittest/test/test_assertions.py
+++ b/Lib/unittest/test/test_assertions.py
@@ -1,6 +1,7 @@
import datetime
import warnings
import unittest
+from itertools import product
class Test_Assertions(unittest.TestCase):
@@ -145,6 +146,14 @@ class TestLongMessage(unittest.TestCase):
self.testableTrue._formatMessage(one, '\uFFFD')
def assertMessages(self, methodName, args, errors):
+ """
+ Check that methodName(*args) raises the correct error messages.
+ errors should be a list of 4 regex that match the error when:
+ 1) longMessage = False and no msg passed;
+ 2) longMessage = False and msg passed;
+ 3) longMessage = True and no msg passed;
+ 4) longMessage = True and msg passed;
+ """
def getMethod(i):
useTestableFalse = i < 2
if useTestableFalse:
@@ -284,3 +293,67 @@ class TestLongMessage(unittest.TestCase):
["^unexpectedly identical: None$", "^oops$",
"^unexpectedly identical: None$",
"^unexpectedly identical: None : oops$"])
+
+
+ def assertMessagesCM(self, methodName, args, func, errors):
+ """
+ Check that the correct error messages are raised while executing:
+ with method(*args):
+ func()
+ *errors* should be a list of 4 regex that match the error when:
+ 1) longMessage = False and no msg passed;
+ 2) longMessage = False and msg passed;
+ 3) longMessage = True and no msg passed;
+ 4) longMessage = True and msg passed;
+ """
+ p = product((self.testableFalse, self.testableTrue),
+ ({}, {"msg": "oops"}))
+ for (cls, kwargs), err in zip(p, errors):
+ method = getattr(cls, methodName)
+ with self.assertRaisesRegex(cls.failureException, err):
+ with method(*args, **kwargs) as cm:
+ func()
+
+ def testAssertRaises(self):
+ self.assertMessagesCM('assertRaises', (TypeError,), lambda: None,
+ ['^TypeError not raised$', '^oops$',
+ '^TypeError not raised$',
+ '^TypeError not raised : oops$'])
+
+ def testAssertRaisesRegex(self):
+ # test error not raised
+ self.assertMessagesCM('assertRaisesRegex', (TypeError, 'unused regex'),
+ lambda: None,
+ ['^TypeError not raised$', '^oops$',
+ '^TypeError not raised$',
+ '^TypeError not raised : oops$'])
+ # test error raised but with wrong message
+ def raise_wrong_message():
+ raise TypeError('foo')
+ self.assertMessagesCM('assertRaisesRegex', (TypeError, 'regex'),
+ raise_wrong_message,
+ ['^"regex" does not match "foo"$', '^oops$',
+ '^"regex" does not match "foo"$',
+ '^"regex" does not match "foo" : oops$'])
+
+ def testAssertWarns(self):
+ self.assertMessagesCM('assertWarns', (UserWarning,), lambda: None,
+ ['^UserWarning not triggered$', '^oops$',
+ '^UserWarning not triggered$',
+ '^UserWarning not triggered : oops$'])
+
+ def testAssertWarnsRegex(self):
+ # test error not raised
+ self.assertMessagesCM('assertWarnsRegex', (UserWarning, 'unused regex'),
+ lambda: None,
+ ['^UserWarning not triggered$', '^oops$',
+ '^UserWarning not triggered$',
+ '^UserWarning not triggered : oops$'])
+ # test warning raised but with wrong message
+ def raise_wrong_message():
+ warnings.warn('foo')
+ self.assertMessagesCM('assertWarnsRegex', (UserWarning, 'regex'),
+ raise_wrong_message,
+ ['^"regex" does not match "foo"$', '^oops$',
+ '^"regex" does not match "foo"$',
+ '^"regex" does not match "foo" : oops$'])
diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py
index c74a539..fdb2e78 100644
--- a/Lib/unittest/test/test_case.py
+++ b/Lib/unittest/test/test_case.py
@@ -4,6 +4,7 @@ import pickle
import re
import sys
import warnings
+import weakref
import inspect
from copy import deepcopy
@@ -386,27 +387,62 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
self.assertIsInstance(Foo().id(), str)
- # "If result is omitted or None, a temporary result object is created
- # and used, but is not made available to the caller. As TestCase owns the
+ # "If result is omitted or None, a temporary result object is created,
+ # used, and is made available to the caller. As TestCase owns the
# temporary result startTestRun and stopTestRun are called.
def test_run__uses_defaultTestResult(self):
events = []
+ defaultResult = LoggingResult(events)
class Foo(unittest.TestCase):
def test(self):
events.append('test')
def defaultTestResult(self):
- return LoggingResult(events)
+ return defaultResult
# Make run() find a result object on its own
- Foo('test').run()
+ result = Foo('test').run()
+ self.assertIs(result, defaultResult)
expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
'stopTest', 'stopTestRun']
self.assertEqual(events, expected)
+
+ # "The result object is returned to run's caller"
+ def test_run__returns_given_result(self):
+
+ class Foo(unittest.TestCase):
+ def test(self):
+ pass
+
+ result = unittest.TestResult()
+
+ retval = Foo('test').run(result)
+ self.assertIs(retval, result)
+
+
+ # "The same effect [as method run] may be had by simply calling the
+ # TestCase instance."
+ def test_call__invoking_an_instance_delegates_to_run(self):
+ resultIn = unittest.TestResult()
+ resultOut = unittest.TestResult()
+
+ class Foo(unittest.TestCase):
+ def test(self):
+ pass
+
+ def run(self, result):
+ self.assertIs(result, resultIn)
+ return resultOut
+
+ retval = Foo('test')(resultIn)
+
+ self.assertIs(retval, resultOut)
+
+
def testShortDescriptionWithoutDocstring(self):
self.assertIsNone(self.shortDescription())
@@ -1140,7 +1176,6 @@ test case
(self.assert_, (True,)),
(self.failUnlessRaises, (TypeError, lambda _: 3.14 + 'spam')),
(self.failIf, (False,)),
- (self.assertSameElements, ([1, 1, 2, 3], [1, 2, 3])),
(self.assertDictContainsSubset, (dict(a=1, b=2), dict(a=1, b=2, c=3))),
(self.assertRaisesRegexp, (KeyError, 'foo', lambda: {}['foo'])),
(self.assertRegexpMatches, ('bar', 'bar')),
@@ -1149,18 +1184,20 @@ test case
with self.assertWarns(DeprecationWarning):
meth(*args)
- def testDeprecatedFailMethods(self):
- """Test that the deprecated fail* methods get removed in 3.3"""
+ # disable this test for now. When the version where the fail* methods will
+ # be removed is decided, re-enable it and update the version
+ def _testDeprecatedFailMethods(self):
+ """Test that the deprecated fail* methods get removed in 3.x"""
if sys.version_info[:2] < (3, 3):
return
deprecated_names = [
'failIfEqual', 'failUnlessEqual', 'failUnlessAlmostEqual',
'failIfAlmostEqual', 'failUnless', 'failUnlessRaises', 'failIf',
- 'assertSameElements', 'assertDictContainsSubset',
+ 'assertDictContainsSubset',
]
for deprecated_name in deprecated_names:
with self.assertRaises(AttributeError):
- getattr(self, deprecated_name) # remove these in 3.3
+ getattr(self, deprecated_name) # remove these in 3.x
def testDeepcopy(self):
# Issue: 5660
@@ -1268,3 +1305,11 @@ test case
klass('test_something').run(result)
self.assertEqual(len(result.errors), 1)
self.assertEqual(result.testsRun, 1)
+
+ @support.cpython_only
+ def testNoCycles(self):
+ case = unittest.TestCase()
+ wr = weakref.ref(case)
+ with support.disable_gc():
+ del case
+ self.assertFalse(wr())
diff --git a/Lib/unittest/test/test_loader.py b/Lib/unittest/test/test_loader.py
index f7e31a5..d1b9ef5 100644
--- a/Lib/unittest/test/test_loader.py
+++ b/Lib/unittest/test/test_loader.py
@@ -239,7 +239,7 @@ class Test_TestLoader(unittest.TestCase):
try:
loader.loadTestsFromName('sdasfasfasdf')
except ImportError as e:
- self.assertEqual(str(e), "No module named sdasfasfasdf")
+ self.assertEqual(str(e), "No module named 'sdasfasfasdf'")
else:
self.fail("TestLoader.loadTestsFromName failed to raise ImportError")
@@ -619,7 +619,7 @@ class Test_TestLoader(unittest.TestCase):
try:
loader.loadTestsFromNames(['sdasfasfasdf'])
except ImportError as e:
- self.assertEqual(str(e), "No module named sdasfasfasdf")
+ self.assertEqual(str(e), "No module named 'sdasfasfasdf'")
else:
self.fail("TestLoader.loadTestsFromNames failed to raise ImportError")
diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py
index d5d0f5a..9794868 100644
--- a/Lib/unittest/test/test_program.py
+++ b/Lib/unittest/test/test_program.py
@@ -131,23 +131,6 @@ class TestCommandLineArgs(unittest.TestCase):
FakeRunner.test = None
FakeRunner.raiseError = False
- def testHelpAndUnknown(self):
- program = self.program
- def usageExit(msg=None):
- program.msg = msg
- program.exit = True
- program.usageExit = usageExit
-
- for opt in '-h', '-H', '--help':
- program.exit = False
- program.parseArgs([None, opt])
- self.assertTrue(program.exit)
- self.assertIsNone(program.msg)
-
- program.parseArgs([None, '-$'])
- self.assertTrue(program.exit)
- self.assertIsNotNone(program.msg)
-
def testVerbosity(self):
program = self.program
diff --git a/Lib/unittest/test/testmock/__init__.py b/Lib/unittest/test/testmock/__init__.py
new file mode 100644
index 0000000..87d7ae9
--- /dev/null
+++ b/Lib/unittest/test/testmock/__init__.py
@@ -0,0 +1,17 @@
+import os
+import sys
+import unittest
+
+
+here = os.path.dirname(__file__)
+loader = unittest.defaultTestLoader
+
+def load_tests(*args):
+ suite = unittest.TestSuite()
+ for fn in os.listdir(here):
+ if fn.startswith("test") and fn.endswith(".py"):
+ modname = "unittest.test.testmock." + fn[:-3]
+ __import__(modname)
+ module = sys.modules[modname]
+ suite.addTest(loader.loadTestsFromModule(module))
+ return suite
diff --git a/Lib/unittest/test/testmock/support.py b/Lib/unittest/test/testmock/support.py
new file mode 100644
index 0000000..f473879
--- /dev/null
+++ b/Lib/unittest/test/testmock/support.py
@@ -0,0 +1,23 @@
+import sys
+
+def is_instance(obj, klass):
+ """Version of is_instance that doesn't access __class__"""
+ return issubclass(type(obj), klass)
+
+
+class SomeClass(object):
+ class_attribute = None
+
+ def wibble(self):
+ pass
+
+
+class X(object):
+ pass
+
+
+def examine_warnings(func):
+ def wrapper():
+ with catch_warnings(record=True) as ws:
+ func(ws)
+ return wrapper
diff --git a/Lib/unittest/test/testmock/testcallable.py b/Lib/unittest/test/testmock/testcallable.py
new file mode 100644
index 0000000..7b2dd00
--- /dev/null
+++ b/Lib/unittest/test/testmock/testcallable.py
@@ -0,0 +1,147 @@
+# Copyright (C) 2007-2012 Michael Foord & the mock team
+# E-mail: fuzzyman AT voidspace DOT org DOT uk
+# http://www.voidspace.org.uk/python/mock/
+
+import unittest
+from unittest.test.testmock.support import is_instance, X, SomeClass
+
+from unittest.mock import (
+ Mock, MagicMock, NonCallableMagicMock,
+ NonCallableMock, patch, create_autospec,
+ CallableMixin
+)
+
+
+
+class TestCallable(unittest.TestCase):
+
+ def assertNotCallable(self, mock):
+ self.assertTrue(is_instance(mock, NonCallableMagicMock))
+ self.assertFalse(is_instance(mock, CallableMixin))
+
+
+ def test_non_callable(self):
+ for mock in NonCallableMagicMock(), NonCallableMock():
+ self.assertRaises(TypeError, mock)
+ self.assertFalse(hasattr(mock, '__call__'))
+ self.assertIn(mock.__class__.__name__, repr(mock))
+
+
+ def test_heirarchy(self):
+ self.assertTrue(issubclass(MagicMock, Mock))
+ self.assertTrue(issubclass(NonCallableMagicMock, NonCallableMock))
+
+
+ def test_attributes(self):
+ one = NonCallableMock()
+ self.assertTrue(issubclass(type(one.one), Mock))
+
+ two = NonCallableMagicMock()
+ self.assertTrue(issubclass(type(two.two), MagicMock))
+
+
+ def test_subclasses(self):
+ class MockSub(Mock):
+ pass
+
+ one = MockSub()
+ self.assertTrue(issubclass(type(one.one), MockSub))
+
+ class MagicSub(MagicMock):
+ pass
+
+ two = MagicSub()
+ self.assertTrue(issubclass(type(two.two), MagicSub))
+
+
+ def test_patch_spec(self):
+ patcher = patch('%s.X' % __name__, spec=True)
+ mock = patcher.start()
+ self.addCleanup(patcher.stop)
+
+ instance = mock()
+ mock.assert_called_once_with()
+
+ self.assertNotCallable(instance)
+ self.assertRaises(TypeError, instance)
+
+
+ def test_patch_spec_set(self):
+ patcher = patch('%s.X' % __name__, spec_set=True)
+ mock = patcher.start()
+ self.addCleanup(patcher.stop)
+
+ instance = mock()
+ mock.assert_called_once_with()
+
+ self.assertNotCallable(instance)
+ self.assertRaises(TypeError, instance)
+
+
+ def test_patch_spec_instance(self):
+ patcher = patch('%s.X' % __name__, spec=X())
+ mock = patcher.start()
+ self.addCleanup(patcher.stop)
+
+ self.assertNotCallable(mock)
+ self.assertRaises(TypeError, mock)
+
+
+ def test_patch_spec_set_instance(self):
+ patcher = patch('%s.X' % __name__, spec_set=X())
+ mock = patcher.start()
+ self.addCleanup(patcher.stop)
+
+ self.assertNotCallable(mock)
+ self.assertRaises(TypeError, mock)
+
+
+ def test_patch_spec_callable_class(self):
+ class CallableX(X):
+ def __call__(self):
+ pass
+
+ class Sub(CallableX):
+ pass
+
+ class Multi(SomeClass, Sub):
+ pass
+
+ for arg in 'spec', 'spec_set':
+ for Klass in CallableX, Sub, Multi:
+ with patch('%s.X' % __name__, **{arg: Klass}) as mock:
+ instance = mock()
+ mock.assert_called_once_with()
+
+ self.assertTrue(is_instance(instance, MagicMock))
+ # inherited spec
+ self.assertRaises(AttributeError, getattr, instance,
+ 'foobarbaz')
+
+ result = instance()
+ # instance is callable, result has no spec
+ instance.assert_called_once_with()
+
+ result(3, 2, 1)
+ result.assert_called_once_with(3, 2, 1)
+ result.foo(3, 2, 1)
+ result.foo.assert_called_once_with(3, 2, 1)
+
+
+ def test_create_autopsec(self):
+ mock = create_autospec(X)
+ instance = mock()
+ self.assertRaises(TypeError, instance)
+
+ mock = create_autospec(X())
+ self.assertRaises(TypeError, mock)
+
+
+ def test_create_autospec_instance(self):
+ mock = create_autospec(SomeClass, instance=True)
+
+ self.assertRaises(TypeError, mock)
+ mock.wibble()
+ mock.wibble.assert_called_once_with()
+
+ self.assertRaises(TypeError, mock.wibble, 'some', 'args')
diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py
new file mode 100644
index 0000000..8bfb293
--- /dev/null
+++ b/Lib/unittest/test/testmock/testhelpers.py
@@ -0,0 +1,889 @@
+import unittest
+
+from unittest.mock import (
+ call, _Call, create_autospec, MagicMock,
+ Mock, ANY, _CallList, patch, PropertyMock
+)
+
+from datetime import datetime
+
+class SomeClass(object):
+ def one(self, a, b):
+ pass
+ def two(self):
+ pass
+ def three(self, a=None):
+ pass
+
+
+
+class AnyTest(unittest.TestCase):
+
+ def test_any(self):
+ self.assertEqual(ANY, object())
+
+ mock = Mock()
+ mock(ANY)
+ mock.assert_called_with(ANY)
+
+ mock = Mock()
+ mock(foo=ANY)
+ mock.assert_called_with(foo=ANY)
+
+ def test_repr(self):
+ self.assertEqual(repr(ANY), '<ANY>')
+ self.assertEqual(str(ANY), '<ANY>')
+
+
+ def test_any_and_datetime(self):
+ mock = Mock()
+ mock(datetime.now(), foo=datetime.now())
+
+ mock.assert_called_with(ANY, foo=ANY)
+
+
+ def test_any_mock_calls_comparison_order(self):
+ mock = Mock()
+ d = datetime.now()
+ class Foo(object):
+ def __eq__(self, other):
+ return False
+ def __ne__(self, other):
+ return True
+
+ for d in datetime.now(), Foo():
+ mock.reset_mock()
+
+ mock(d, foo=d, bar=d)
+ mock.method(d, zinga=d, alpha=d)
+ mock().method(a1=d, z99=d)
+
+ expected = [
+ call(ANY, foo=ANY, bar=ANY),
+ call.method(ANY, zinga=ANY, alpha=ANY),
+ call(), call().method(a1=ANY, z99=ANY)
+ ]
+ self.assertEqual(expected, mock.mock_calls)
+ self.assertEqual(mock.mock_calls, expected)
+
+
+
+class CallTest(unittest.TestCase):
+
+ def test_call_with_call(self):
+ kall = _Call()
+ self.assertEqual(kall, _Call())
+ self.assertEqual(kall, _Call(('',)))
+ self.assertEqual(kall, _Call(((),)))
+ self.assertEqual(kall, _Call(({},)))
+ self.assertEqual(kall, _Call(('', ())))
+ self.assertEqual(kall, _Call(('', {})))
+ self.assertEqual(kall, _Call(('', (), {})))
+ self.assertEqual(kall, _Call(('foo',)))
+ self.assertEqual(kall, _Call(('bar', ())))
+ self.assertEqual(kall, _Call(('baz', {})))
+ self.assertEqual(kall, _Call(('spam', (), {})))
+
+ kall = _Call(((1, 2, 3),))
+ self.assertEqual(kall, _Call(((1, 2, 3),)))
+ self.assertEqual(kall, _Call(('', (1, 2, 3))))
+ self.assertEqual(kall, _Call(((1, 2, 3), {})))
+ self.assertEqual(kall, _Call(('', (1, 2, 3), {})))
+
+ kall = _Call(((1, 2, 4),))
+ self.assertNotEqual(kall, _Call(('', (1, 2, 3))))
+ self.assertNotEqual(kall, _Call(('', (1, 2, 3), {})))
+
+ kall = _Call(('foo', (1, 2, 4),))
+ self.assertNotEqual(kall, _Call(('', (1, 2, 4))))
+ self.assertNotEqual(kall, _Call(('', (1, 2, 4), {})))
+ self.assertNotEqual(kall, _Call(('bar', (1, 2, 4))))
+ self.assertNotEqual(kall, _Call(('bar', (1, 2, 4), {})))
+
+ kall = _Call(({'a': 3},))
+ self.assertEqual(kall, _Call(('', (), {'a': 3})))
+ self.assertEqual(kall, _Call(('', {'a': 3})))
+ self.assertEqual(kall, _Call(((), {'a': 3})))
+ self.assertEqual(kall, _Call(({'a': 3},)))
+
+
+ def test_empty__Call(self):
+ args = _Call()
+
+ self.assertEqual(args, ())
+ self.assertEqual(args, ('foo',))
+ self.assertEqual(args, ((),))
+ self.assertEqual(args, ('foo', ()))
+ self.assertEqual(args, ('foo',(), {}))
+ self.assertEqual(args, ('foo', {}))
+ self.assertEqual(args, ({},))
+
+
+ def test_named_empty_call(self):
+ args = _Call(('foo', (), {}))
+
+ self.assertEqual(args, ('foo',))
+ self.assertEqual(args, ('foo', ()))
+ self.assertEqual(args, ('foo',(), {}))
+ self.assertEqual(args, ('foo', {}))
+
+ self.assertNotEqual(args, ((),))
+ self.assertNotEqual(args, ())
+ self.assertNotEqual(args, ({},))
+ self.assertNotEqual(args, ('bar',))
+ self.assertNotEqual(args, ('bar', ()))
+ self.assertNotEqual(args, ('bar', {}))
+
+
+ def test_call_with_args(self):
+ args = _Call(((1, 2, 3), {}))
+
+ self.assertEqual(args, ((1, 2, 3),))
+ self.assertEqual(args, ('foo', (1, 2, 3)))
+ self.assertEqual(args, ('foo', (1, 2, 3), {}))
+ self.assertEqual(args, ((1, 2, 3), {}))
+
+
+ def test_named_call_with_args(self):
+ args = _Call(('foo', (1, 2, 3), {}))
+
+ self.assertEqual(args, ('foo', (1, 2, 3)))
+ self.assertEqual(args, ('foo', (1, 2, 3), {}))
+
+ self.assertNotEqual(args, ((1, 2, 3),))
+ self.assertNotEqual(args, ((1, 2, 3), {}))
+
+
+ def test_call_with_kwargs(self):
+ args = _Call(((), dict(a=3, b=4)))
+
+ self.assertEqual(args, (dict(a=3, b=4),))
+ self.assertEqual(args, ('foo', dict(a=3, b=4)))
+ self.assertEqual(args, ('foo', (), dict(a=3, b=4)))
+ self.assertEqual(args, ((), dict(a=3, b=4)))
+
+
+ def test_named_call_with_kwargs(self):
+ args = _Call(('foo', (), dict(a=3, b=4)))
+
+ self.assertEqual(args, ('foo', dict(a=3, b=4)))
+ self.assertEqual(args, ('foo', (), dict(a=3, b=4)))
+
+ self.assertNotEqual(args, (dict(a=3, b=4),))
+ self.assertNotEqual(args, ((), dict(a=3, b=4)))
+
+
+ def test_call_with_args_call_empty_name(self):
+ args = _Call(((1, 2, 3), {}))
+ self.assertEqual(args, call(1, 2, 3))
+ self.assertEqual(call(1, 2, 3), args)
+ self.assertTrue(call(1, 2, 3) in [args])
+
+
+ def test_call_ne(self):
+ self.assertNotEqual(_Call(((1, 2, 3),)), call(1, 2))
+ self.assertFalse(_Call(((1, 2, 3),)) != call(1, 2, 3))
+ self.assertTrue(_Call(((1, 2), {})) != call(1, 2, 3))
+
+
+ def test_call_non_tuples(self):
+ kall = _Call(((1, 2, 3),))
+ for value in 1, None, self, int:
+ self.assertNotEqual(kall, value)
+ self.assertFalse(kall == value)
+
+
+ def test_repr(self):
+ self.assertEqual(repr(_Call()), 'call()')
+ self.assertEqual(repr(_Call(('foo',))), 'call.foo()')
+
+ self.assertEqual(repr(_Call(((1, 2, 3), {'a': 'b'}))),
+ "call(1, 2, 3, a='b')")
+ self.assertEqual(repr(_Call(('bar', (1, 2, 3), {'a': 'b'}))),
+ "call.bar(1, 2, 3, a='b')")
+
+ self.assertEqual(repr(call), 'call')
+ self.assertEqual(str(call), 'call')
+
+ self.assertEqual(repr(call()), 'call()')
+ self.assertEqual(repr(call(1)), 'call(1)')
+ self.assertEqual(repr(call(zz='thing')), "call(zz='thing')")
+
+ self.assertEqual(repr(call().foo), 'call().foo')
+ self.assertEqual(repr(call(1).foo.bar(a=3).bing),
+ 'call().foo.bar().bing')
+ self.assertEqual(
+ repr(call().foo(1, 2, a=3)),
+ "call().foo(1, 2, a=3)"
+ )
+ self.assertEqual(repr(call()()), "call()()")
+ self.assertEqual(repr(call(1)(2)), "call()(2)")
+ self.assertEqual(
+ repr(call()().bar().baz.beep(1)),
+ "call()().bar().baz.beep(1)"
+ )
+
+
+ def test_call(self):
+ self.assertEqual(call(), ('', (), {}))
+ self.assertEqual(call('foo', 'bar', one=3, two=4),
+ ('', ('foo', 'bar'), {'one': 3, 'two': 4}))
+
+ mock = Mock()
+ mock(1, 2, 3)
+ mock(a=3, b=6)
+ self.assertEqual(mock.call_args_list,
+ [call(1, 2, 3), call(a=3, b=6)])
+
+ def test_attribute_call(self):
+ self.assertEqual(call.foo(1), ('foo', (1,), {}))
+ self.assertEqual(call.bar.baz(fish='eggs'),
+ ('bar.baz', (), {'fish': 'eggs'}))
+
+ mock = Mock()
+ mock.foo(1, 2 ,3)
+ mock.bar.baz(a=3, b=6)
+ self.assertEqual(mock.method_calls,
+ [call.foo(1, 2, 3), call.bar.baz(a=3, b=6)])
+
+
+ def test_extended_call(self):
+ result = call(1).foo(2).bar(3, a=4)
+ self.assertEqual(result, ('().foo().bar', (3,), dict(a=4)))
+
+ mock = MagicMock()
+ mock(1, 2, a=3, b=4)
+ self.assertEqual(mock.call_args, call(1, 2, a=3, b=4))
+ self.assertNotEqual(mock.call_args, call(1, 2, 3))
+
+ self.assertEqual(mock.call_args_list, [call(1, 2, a=3, b=4)])
+ self.assertEqual(mock.mock_calls, [call(1, 2, a=3, b=4)])
+
+ mock = MagicMock()
+ mock.foo(1).bar()().baz.beep(a=6)
+
+ last_call = call.foo(1).bar()().baz.beep(a=6)
+ self.assertEqual(mock.mock_calls[-1], last_call)
+ self.assertEqual(mock.mock_calls, last_call.call_list())
+
+
+ def test_call_list(self):
+ mock = MagicMock()
+ mock(1)
+ self.assertEqual(call(1).call_list(), mock.mock_calls)
+
+ mock = MagicMock()
+ mock(1).method(2)
+ self.assertEqual(call(1).method(2).call_list(),
+ mock.mock_calls)
+
+ mock = MagicMock()
+ mock(1).method(2)(3)
+ self.assertEqual(call(1).method(2)(3).call_list(),
+ mock.mock_calls)
+
+ mock = MagicMock()
+ int(mock(1).method(2)(3).foo.bar.baz(4)(5))
+ kall = call(1).method(2)(3).foo.bar.baz(4)(5).__int__()
+ self.assertEqual(kall.call_list(), mock.mock_calls)
+
+
+ def test_call_any(self):
+ self.assertEqual(call, ANY)
+
+ m = MagicMock()
+ int(m)
+ self.assertEqual(m.mock_calls, [ANY])
+ self.assertEqual([ANY], m.mock_calls)
+
+
+ def test_two_args_call(self):
+ args = _Call(((1, 2), {'a': 3}), two=True)
+ self.assertEqual(len(args), 2)
+ self.assertEqual(args[0], (1, 2))
+ self.assertEqual(args[1], {'a': 3})
+
+ other_args = _Call(((1, 2), {'a': 3}))
+ self.assertEqual(args, other_args)
+
+
+class SpecSignatureTest(unittest.TestCase):
+
+ def _check_someclass_mock(self, mock):
+ self.assertRaises(AttributeError, getattr, mock, 'foo')
+ mock.one(1, 2)
+ mock.one.assert_called_with(1, 2)
+ self.assertRaises(AssertionError,
+ mock.one.assert_called_with, 3, 4)
+ self.assertRaises(TypeError, mock.one, 1)
+
+ mock.two()
+ mock.two.assert_called_with()
+ self.assertRaises(AssertionError,
+ mock.two.assert_called_with, 3)
+ self.assertRaises(TypeError, mock.two, 1)
+
+ mock.three()
+ mock.three.assert_called_with()
+ self.assertRaises(AssertionError,
+ mock.three.assert_called_with, 3)
+ self.assertRaises(TypeError, mock.three, 3, 2)
+
+ mock.three(1)
+ mock.three.assert_called_with(1)
+
+ mock.three(a=1)
+ mock.three.assert_called_with(a=1)
+
+
+ def test_basic(self):
+ for spec in (SomeClass, SomeClass()):
+ mock = create_autospec(spec)
+ self._check_someclass_mock(mock)
+
+
+ def test_create_autospec_return_value(self):
+ def f():
+ pass
+ mock = create_autospec(f, return_value='foo')
+ self.assertEqual(mock(), 'foo')
+
+ class Foo(object):
+ pass
+
+ mock = create_autospec(Foo, return_value='foo')
+ self.assertEqual(mock(), 'foo')
+
+
+ def test_autospec_reset_mock(self):
+ m = create_autospec(int)
+ int(m)
+ m.reset_mock()
+ self.assertEqual(m.__int__.call_count, 0)
+
+
+ def test_mocking_unbound_methods(self):
+ class Foo(object):
+ def foo(self, foo):
+ pass
+ p = patch.object(Foo, 'foo')
+ mock_foo = p.start()
+ Foo().foo(1)
+
+ mock_foo.assert_called_with(1)
+
+
+ def test_create_autospec_unbound_methods(self):
+ # see mock issue 128
+ # this is expected to fail until the issue is fixed
+ return
+ class Foo(object):
+ def foo(self):
+ pass
+
+ klass = create_autospec(Foo)
+ instance = klass()
+ self.assertRaises(TypeError, instance.foo, 1)
+
+ # Note: no type checking on the "self" parameter
+ klass.foo(1)
+ klass.foo.assert_called_with(1)
+ self.assertRaises(TypeError, klass.foo)
+
+
+ def test_create_autospec_keyword_arguments(self):
+ class Foo(object):
+ a = 3
+ m = create_autospec(Foo, a='3')
+ self.assertEqual(m.a, '3')
+
+
+ def test_create_autospec_keyword_only_arguments(self):
+ def foo(a, *, b=None):
+ pass
+
+ m = create_autospec(foo)
+ m(1)
+ m.assert_called_with(1)
+ self.assertRaises(TypeError, m, 1, 2)
+
+ m(2, b=3)
+ m.assert_called_with(2, b=3)
+
+
+ def test_function_as_instance_attribute(self):
+ obj = SomeClass()
+ def f(a):
+ pass
+ obj.f = f
+
+ mock = create_autospec(obj)
+ mock.f('bing')
+ mock.f.assert_called_with('bing')
+
+
+ def test_spec_as_list(self):
+ # because spec as a list of strings in the mock constructor means
+ # something very different we treat a list instance as the type.
+ mock = create_autospec([])
+ mock.append('foo')
+ mock.append.assert_called_with('foo')
+
+ self.assertRaises(AttributeError, getattr, mock, 'foo')
+
+ class Foo(object):
+ foo = []
+
+ mock = create_autospec(Foo)
+ mock.foo.append(3)
+ mock.foo.append.assert_called_with(3)
+ self.assertRaises(AttributeError, getattr, mock.foo, 'foo')
+
+
+ def test_attributes(self):
+ class Sub(SomeClass):
+ attr = SomeClass()
+
+ sub_mock = create_autospec(Sub)
+
+ for mock in (sub_mock, sub_mock.attr):
+ self._check_someclass_mock(mock)
+
+
+ def test_builtin_functions_types(self):
+ # we could replace builtin functions / methods with a function
+ # with *args / **kwargs signature. Using the builtin method type
+ # as a spec seems to work fairly well though.
+ class BuiltinSubclass(list):
+ def bar(self, arg):
+ pass
+ sorted = sorted
+ attr = {}
+
+ mock = create_autospec(BuiltinSubclass)
+ mock.append(3)
+ mock.append.assert_called_with(3)
+ self.assertRaises(AttributeError, getattr, mock.append, 'foo')
+
+ mock.bar('foo')
+ mock.bar.assert_called_with('foo')
+ self.assertRaises(TypeError, mock.bar, 'foo', 'bar')
+ self.assertRaises(AttributeError, getattr, mock.bar, 'foo')
+
+ mock.sorted([1, 2])
+ mock.sorted.assert_called_with([1, 2])
+ self.assertRaises(AttributeError, getattr, mock.sorted, 'foo')
+
+ mock.attr.pop(3)
+ mock.attr.pop.assert_called_with(3)
+ self.assertRaises(AttributeError, getattr, mock.attr, 'foo')
+
+
+ def test_method_calls(self):
+ class Sub(SomeClass):
+ attr = SomeClass()
+
+ mock = create_autospec(Sub)
+ mock.one(1, 2)
+ mock.two()
+ mock.three(3)
+
+ expected = [call.one(1, 2), call.two(), call.three(3)]
+ self.assertEqual(mock.method_calls, expected)
+
+ mock.attr.one(1, 2)
+ mock.attr.two()
+ mock.attr.three(3)
+
+ expected.extend(
+ [call.attr.one(1, 2), call.attr.two(), call.attr.three(3)]
+ )
+ self.assertEqual(mock.method_calls, expected)
+
+
+ def test_magic_methods(self):
+ class BuiltinSubclass(list):
+ attr = {}
+
+ mock = create_autospec(BuiltinSubclass)
+ self.assertEqual(list(mock), [])
+ self.assertRaises(TypeError, int, mock)
+ self.assertRaises(TypeError, int, mock.attr)
+ self.assertEqual(list(mock), [])
+
+ self.assertIsInstance(mock['foo'], MagicMock)
+ self.assertIsInstance(mock.attr['foo'], MagicMock)
+
+
+ def test_spec_set(self):
+ class Sub(SomeClass):
+ attr = SomeClass()
+
+ for spec in (Sub, Sub()):
+ mock = create_autospec(spec, spec_set=True)
+ self._check_someclass_mock(mock)
+
+ self.assertRaises(AttributeError, setattr, mock, 'foo', 'bar')
+ self.assertRaises(AttributeError, setattr, mock.attr, 'foo', 'bar')
+
+
+ def test_descriptors(self):
+ class Foo(object):
+ @classmethod
+ def f(cls, a, b):
+ pass
+ @staticmethod
+ def g(a, b):
+ pass
+
+ class Bar(Foo):
+ pass
+
+ class Baz(SomeClass, Bar):
+ pass
+
+ for spec in (Foo, Foo(), Bar, Bar(), Baz, Baz()):
+ mock = create_autospec(spec)
+ mock.f(1, 2)
+ mock.f.assert_called_once_with(1, 2)
+
+ mock.g(3, 4)
+ mock.g.assert_called_once_with(3, 4)
+
+
+ def test_recursive(self):
+ class A(object):
+ def a(self):
+ pass
+ foo = 'foo bar baz'
+ bar = foo
+
+ A.B = A
+ mock = create_autospec(A)
+
+ mock()
+ self.assertFalse(mock.B.called)
+
+ mock.a()
+ mock.B.a()
+ self.assertEqual(mock.method_calls, [call.a(), call.B.a()])
+
+ self.assertIs(A.foo, A.bar)
+ self.assertIsNot(mock.foo, mock.bar)
+ mock.foo.lower()
+ self.assertRaises(AssertionError, mock.bar.lower.assert_called_with)
+
+
+ def test_spec_inheritance_for_classes(self):
+ class Foo(object):
+ def a(self):
+ pass
+ class Bar(object):
+ def f(self):
+ pass
+
+ class_mock = create_autospec(Foo)
+
+ self.assertIsNot(class_mock, class_mock())
+
+ for this_mock in class_mock, class_mock():
+ this_mock.a()
+ this_mock.a.assert_called_with()
+ self.assertRaises(TypeError, this_mock.a, 'foo')
+ self.assertRaises(AttributeError, getattr, this_mock, 'b')
+
+ instance_mock = create_autospec(Foo())
+ instance_mock.a()
+ instance_mock.a.assert_called_with()
+ self.assertRaises(TypeError, instance_mock.a, 'foo')
+ self.assertRaises(AttributeError, getattr, instance_mock, 'b')
+
+ # The return value isn't isn't callable
+ self.assertRaises(TypeError, instance_mock)
+
+ instance_mock.Bar.f()
+ instance_mock.Bar.f.assert_called_with()
+ self.assertRaises(AttributeError, getattr, instance_mock.Bar, 'g')
+
+ instance_mock.Bar().f()
+ instance_mock.Bar().f.assert_called_with()
+ self.assertRaises(AttributeError, getattr, instance_mock.Bar(), 'g')
+
+
+ def test_inherit(self):
+ class Foo(object):
+ a = 3
+
+ Foo.Foo = Foo
+
+ # class
+ mock = create_autospec(Foo)
+ instance = mock()
+ self.assertRaises(AttributeError, getattr, instance, 'b')
+
+ attr_instance = mock.Foo()
+ self.assertRaises(AttributeError, getattr, attr_instance, 'b')
+
+ # instance
+ mock = create_autospec(Foo())
+ self.assertRaises(AttributeError, getattr, mock, 'b')
+ self.assertRaises(TypeError, mock)
+
+ # attribute instance
+ call_result = mock.Foo()
+ self.assertRaises(AttributeError, getattr, call_result, 'b')
+
+
+ def test_builtins(self):
+ # used to fail with infinite recursion
+ create_autospec(1)
+
+ create_autospec(int)
+ create_autospec('foo')
+ create_autospec(str)
+ create_autospec({})
+ create_autospec(dict)
+ create_autospec([])
+ create_autospec(list)
+ create_autospec(set())
+ create_autospec(set)
+ create_autospec(1.0)
+ create_autospec(float)
+ create_autospec(1j)
+ create_autospec(complex)
+ create_autospec(False)
+ create_autospec(True)
+
+
+ def test_function(self):
+ def f(a, b):
+ pass
+
+ mock = create_autospec(f)
+ self.assertRaises(TypeError, mock)
+ mock(1, 2)
+ mock.assert_called_with(1, 2)
+
+ f.f = f
+ mock = create_autospec(f)
+ self.assertRaises(TypeError, mock.f)
+ mock.f(3, 4)
+ mock.f.assert_called_with(3, 4)
+
+
+ def test_skip_attributeerrors(self):
+ class Raiser(object):
+ def __get__(self, obj, type=None):
+ if obj is None:
+ raise AttributeError('Can only be accessed via an instance')
+
+ class RaiserClass(object):
+ raiser = Raiser()
+
+ @staticmethod
+ def existing(a, b):
+ return a + b
+
+ s = create_autospec(RaiserClass)
+ self.assertRaises(TypeError, lambda x: s.existing(1, 2, 3))
+ s.existing(1, 2)
+ self.assertRaises(AttributeError, lambda: s.nonexisting)
+
+ # check we can fetch the raiser attribute and it has no spec
+ obj = s.raiser
+ obj.foo, obj.bar
+
+
+ def test_signature_class(self):
+ class Foo(object):
+ def __init__(self, a, b=3):
+ pass
+
+ mock = create_autospec(Foo)
+
+ self.assertRaises(TypeError, mock)
+ mock(1)
+ mock.assert_called_once_with(1)
+
+ mock(4, 5)
+ mock.assert_called_with(4, 5)
+
+
+ def test_class_with_no_init(self):
+ # this used to raise an exception
+ # due to trying to get a signature from object.__init__
+ class Foo(object):
+ pass
+ create_autospec(Foo)
+
+
+ def test_signature_callable(self):
+ class Callable(object):
+ def __init__(self):
+ pass
+ def __call__(self, a):
+ pass
+
+ mock = create_autospec(Callable)
+ mock()
+ mock.assert_called_once_with()
+ self.assertRaises(TypeError, mock, 'a')
+
+ instance = mock()
+ self.assertRaises(TypeError, instance)
+ instance(a='a')
+ instance.assert_called_once_with(a='a')
+ instance('a')
+ instance.assert_called_with('a')
+
+ mock = create_autospec(Callable())
+ mock(a='a')
+ mock.assert_called_once_with(a='a')
+ self.assertRaises(TypeError, mock)
+ mock('a')
+ mock.assert_called_with('a')
+
+
+ def test_signature_noncallable(self):
+ class NonCallable(object):
+ def __init__(self):
+ pass
+
+ mock = create_autospec(NonCallable)
+ instance = mock()
+ mock.assert_called_once_with()
+ self.assertRaises(TypeError, mock, 'a')
+ self.assertRaises(TypeError, instance)
+ self.assertRaises(TypeError, instance, 'a')
+
+ mock = create_autospec(NonCallable())
+ self.assertRaises(TypeError, mock)
+ self.assertRaises(TypeError, mock, 'a')
+
+
+ def test_create_autospec_none(self):
+ class Foo(object):
+ bar = None
+
+ mock = create_autospec(Foo)
+ none = mock.bar
+ self.assertNotIsInstance(none, type(None))
+
+ none.foo()
+ none.foo.assert_called_once_with()
+
+
+ def test_autospec_functions_with_self_in_odd_place(self):
+ class Foo(object):
+ def f(a, self):
+ pass
+
+ a = create_autospec(Foo)
+ a.f(self=10)
+ a.f.assert_called_with(self=10)
+
+
+ def test_autospec_property(self):
+ class Foo(object):
+ @property
+ def foo(self):
+ return 3
+
+ foo = create_autospec(Foo)
+ mock_property = foo.foo
+
+ # no spec on properties
+ self.assertTrue(isinstance(mock_property, MagicMock))
+ mock_property(1, 2, 3)
+ mock_property.abc(4, 5, 6)
+ mock_property.assert_called_once_with(1, 2, 3)
+ mock_property.abc.assert_called_once_with(4, 5, 6)
+
+
+ def test_autospec_slots(self):
+ class Foo(object):
+ __slots__ = ['a']
+
+ foo = create_autospec(Foo)
+ mock_slot = foo.a
+
+ # no spec on slots
+ mock_slot(1, 2, 3)
+ mock_slot.abc(4, 5, 6)
+ mock_slot.assert_called_once_with(1, 2, 3)
+ mock_slot.abc.assert_called_once_with(4, 5, 6)
+
+
+class TestCallList(unittest.TestCase):
+
+ def test_args_list_contains_call_list(self):
+ mock = Mock()
+ self.assertIsInstance(mock.call_args_list, _CallList)
+
+ mock(1, 2)
+ mock(a=3)
+ mock(3, 4)
+ mock(b=6)
+
+ for kall in call(1, 2), call(a=3), call(3, 4), call(b=6):
+ self.assertTrue(kall in mock.call_args_list)
+
+ calls = [call(a=3), call(3, 4)]
+ self.assertTrue(calls in mock.call_args_list)
+ calls = [call(1, 2), call(a=3)]
+ self.assertTrue(calls in mock.call_args_list)
+ calls = [call(3, 4), call(b=6)]
+ self.assertTrue(calls in mock.call_args_list)
+ calls = [call(3, 4)]
+ self.assertTrue(calls in mock.call_args_list)
+
+ self.assertFalse(call('fish') in mock.call_args_list)
+ self.assertFalse([call('fish')] in mock.call_args_list)
+
+
+ def test_call_list_str(self):
+ mock = Mock()
+ mock(1, 2)
+ mock.foo(a=3)
+ mock.foo.bar().baz('fish', cat='dog')
+
+ expected = (
+ "[call(1, 2),\n"
+ " call.foo(a=3),\n"
+ " call.foo.bar(),\n"
+ " call.foo.bar().baz('fish', cat='dog')]"
+ )
+ self.assertEqual(str(mock.mock_calls), expected)
+
+
+ def test_propertymock(self):
+ p = patch('%s.SomeClass.one' % __name__, new_callable=PropertyMock)
+ mock = p.start()
+ try:
+ SomeClass.one
+ mock.assert_called_once_with()
+
+ s = SomeClass()
+ s.one
+ mock.assert_called_with()
+ self.assertEqual(mock.mock_calls, [call(), call()])
+
+ s.one = 3
+ self.assertEqual(mock.mock_calls, [call(), call(), call(3)])
+ finally:
+ p.stop()
+
+
+ def test_propertymock_returnvalue(self):
+ m = MagicMock()
+ p = PropertyMock()
+ type(m).foo = p
+
+ returned = m.foo
+ p.assert_called_once_with()
+ self.assertIsInstance(returned, MagicMock)
+ self.assertNotIsInstance(returned, PropertyMock)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py
new file mode 100644
index 0000000..2bcf088
--- /dev/null
+++ b/Lib/unittest/test/testmock/testmagicmethods.py
@@ -0,0 +1,403 @@
+import unittest
+import inspect
+import sys
+from unittest.mock import Mock, MagicMock, _magics
+
+
+
+class TestMockingMagicMethods(unittest.TestCase):
+
+ def test_deleting_magic_methods(self):
+ mock = Mock()
+ self.assertFalse(hasattr(mock, '__getitem__'))
+
+ mock.__getitem__ = Mock()
+ self.assertTrue(hasattr(mock, '__getitem__'))
+
+ del mock.__getitem__
+ self.assertFalse(hasattr(mock, '__getitem__'))
+
+
+ def test_magicmock_del(self):
+ mock = MagicMock()
+ # before using getitem
+ del mock.__getitem__
+ self.assertRaises(TypeError, lambda: mock['foo'])
+
+ mock = MagicMock()
+ # this time use it first
+ mock['foo']
+ del mock.__getitem__
+ self.assertRaises(TypeError, lambda: mock['foo'])
+
+
+ def test_magic_method_wrapping(self):
+ mock = Mock()
+ def f(self, name):
+ return self, 'fish'
+
+ mock.__getitem__ = f
+ self.assertFalse(mock.__getitem__ is f)
+ self.assertEqual(mock['foo'], (mock, 'fish'))
+ self.assertEqual(mock.__getitem__('foo'), (mock, 'fish'))
+
+ mock.__getitem__ = mock
+ self.assertTrue(mock.__getitem__ is mock)
+
+
+ def test_magic_methods_isolated_between_mocks(self):
+ mock1 = Mock()
+ mock2 = Mock()
+
+ mock1.__iter__ = Mock(return_value=iter([]))
+ self.assertEqual(list(mock1), [])
+ self.assertRaises(TypeError, lambda: list(mock2))
+
+
+ def test_repr(self):
+ mock = Mock()
+ self.assertEqual(repr(mock), "<Mock id='%s'>" % id(mock))
+ mock.__repr__ = lambda s: 'foo'
+ self.assertEqual(repr(mock), 'foo')
+
+
+ def test_str(self):
+ mock = Mock()
+ self.assertEqual(str(mock), object.__str__(mock))
+ mock.__str__ = lambda s: 'foo'
+ self.assertEqual(str(mock), 'foo')
+
+
+ def test_dict_methods(self):
+ mock = Mock()
+
+ self.assertRaises(TypeError, lambda: mock['foo'])
+ def _del():
+ del mock['foo']
+ def _set():
+ mock['foo'] = 3
+ self.assertRaises(TypeError, _del)
+ self.assertRaises(TypeError, _set)
+
+ _dict = {}
+ def getitem(s, name):
+ return _dict[name]
+ def setitem(s, name, value):
+ _dict[name] = value
+ def delitem(s, name):
+ del _dict[name]
+
+ mock.__setitem__ = setitem
+ mock.__getitem__ = getitem
+ mock.__delitem__ = delitem
+
+ self.assertRaises(KeyError, lambda: mock['foo'])
+ mock['foo'] = 'bar'
+ self.assertEqual(_dict, {'foo': 'bar'})
+ self.assertEqual(mock['foo'], 'bar')
+ del mock['foo']
+ self.assertEqual(_dict, {})
+
+
+ def test_numeric(self):
+ original = mock = Mock()
+ mock.value = 0
+
+ self.assertRaises(TypeError, lambda: mock + 3)
+
+ def add(self, other):
+ mock.value += other
+ return self
+ mock.__add__ = add
+ self.assertEqual(mock + 3, mock)
+ self.assertEqual(mock.value, 3)
+
+ del mock.__add__
+ def iadd(mock):
+ mock += 3
+ self.assertRaises(TypeError, iadd, mock)
+ mock.__iadd__ = add
+ mock += 6
+ self.assertEqual(mock, original)
+ self.assertEqual(mock.value, 9)
+
+ self.assertRaises(TypeError, lambda: 3 + mock)
+ mock.__radd__ = add
+ self.assertEqual(7 + mock, mock)
+ self.assertEqual(mock.value, 16)
+
+
+ def test_hash(self):
+ mock = Mock()
+ # test delegation
+ self.assertEqual(hash(mock), Mock.__hash__(mock))
+
+ def _hash(s):
+ return 3
+ mock.__hash__ = _hash
+ self.assertEqual(hash(mock), 3)
+
+
+ def test_nonzero(self):
+ m = Mock()
+ self.assertTrue(bool(m))
+
+ m.__bool__ = lambda s: False
+ self.assertFalse(bool(m))
+
+
+ def test_comparison(self):
+ mock = Mock()
+ def comp(s, o):
+ return True
+ mock.__lt__ = mock.__gt__ = mock.__le__ = mock.__ge__ = comp
+ self. assertTrue(mock < 3)
+ self. assertTrue(mock > 3)
+ self. assertTrue(mock <= 3)
+ self. assertTrue(mock >= 3)
+
+ self.assertRaises(TypeError, lambda: MagicMock() < object())
+ self.assertRaises(TypeError, lambda: object() < MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() < MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() > object())
+ self.assertRaises(TypeError, lambda: object() > MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() > MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() <= object())
+ self.assertRaises(TypeError, lambda: object() <= MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() >= object())
+ self.assertRaises(TypeError, lambda: object() >= MagicMock())
+ self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock())
+
+
+ def test_equality(self):
+ for mock in Mock(), MagicMock():
+ self.assertEqual(mock == mock, True)
+ self.assertIsInstance(mock == mock, bool)
+ self.assertEqual(mock != mock, False)
+ self.assertIsInstance(mock != mock, bool)
+ self.assertEqual(mock == object(), False)
+ self.assertEqual(mock != object(), True)
+
+ def eq(self, other):
+ return other == 3
+ mock.__eq__ = eq
+ self.assertTrue(mock == 3)
+ self.assertFalse(mock == 4)
+
+ def ne(self, other):
+ return other == 3
+ mock.__ne__ = ne
+ self.assertTrue(mock != 3)
+ self.assertFalse(mock != 4)
+
+ mock = MagicMock()
+ mock.__eq__.return_value = True
+ self.assertIsInstance(mock == 3, bool)
+ self.assertEqual(mock == 3, True)
+
+ mock.__ne__.return_value = False
+ self.assertIsInstance(mock != 3, bool)
+ self.assertEqual(mock != 3, False)
+
+
+ def test_len_contains_iter(self):
+ mock = Mock()
+
+ self.assertRaises(TypeError, len, mock)
+ self.assertRaises(TypeError, iter, mock)
+ self.assertRaises(TypeError, lambda: 'foo' in mock)
+
+ mock.__len__ = lambda s: 6
+ self.assertEqual(len(mock), 6)
+
+ mock.__contains__ = lambda s, o: o == 3
+ self.assertTrue(3 in mock)
+ self.assertFalse(6 in mock)
+
+ mock.__iter__ = lambda s: iter('foobarbaz')
+ self.assertEqual(list(mock), list('foobarbaz'))
+
+
+ def test_magicmock(self):
+ mock = MagicMock()
+
+ mock.__iter__.return_value = iter([1, 2, 3])
+ self.assertEqual(list(mock), [1, 2, 3])
+
+ getattr(mock, '__bool__').return_value = False
+ self.assertFalse(hasattr(mock, '__nonzero__'))
+ self.assertFalse(bool(mock))
+
+ for entry in _magics:
+ self.assertTrue(hasattr(mock, entry))
+ self.assertFalse(hasattr(mock, '__imaginery__'))
+
+
+ def test_magic_mock_equality(self):
+ mock = MagicMock()
+ self.assertIsInstance(mock == object(), bool)
+ self.assertIsInstance(mock != object(), bool)
+
+ self.assertEqual(mock == object(), False)
+ self.assertEqual(mock != object(), True)
+ self.assertEqual(mock == mock, True)
+ self.assertEqual(mock != mock, False)
+
+
+ def test_magicmock_defaults(self):
+ mock = MagicMock()
+ self.assertEqual(int(mock), 1)
+ self.assertEqual(complex(mock), 1j)
+ self.assertEqual(float(mock), 1.0)
+ self.assertNotIn(object(), mock)
+ self.assertEqual(len(mock), 0)
+ self.assertEqual(list(mock), [])
+ self.assertEqual(hash(mock), object.__hash__(mock))
+ self.assertEqual(str(mock), object.__str__(mock))
+ self.assertTrue(bool(mock))
+
+ # in Python 3 oct and hex use __index__
+ # so these tests are for __index__ in py3k
+ self.assertEqual(oct(mock), '0o1')
+ self.assertEqual(hex(mock), '0x1')
+ # how to test __sizeof__ ?
+
+
+ def test_magic_methods_and_spec(self):
+ class Iterable(object):
+ def __iter__(self):
+ pass
+
+ mock = Mock(spec=Iterable)
+ self.assertRaises(AttributeError, lambda: mock.__iter__)
+
+ mock.__iter__ = Mock(return_value=iter([]))
+ self.assertEqual(list(mock), [])
+
+ class NonIterable(object):
+ pass
+ mock = Mock(spec=NonIterable)
+ self.assertRaises(AttributeError, lambda: mock.__iter__)
+
+ def set_int():
+ mock.__int__ = Mock(return_value=iter([]))
+ self.assertRaises(AttributeError, set_int)
+
+ mock = MagicMock(spec=Iterable)
+ self.assertEqual(list(mock), [])
+ self.assertRaises(AttributeError, set_int)
+
+
+ def test_magic_methods_and_spec_set(self):
+ class Iterable(object):
+ def __iter__(self):
+ pass
+
+ mock = Mock(spec_set=Iterable)
+ self.assertRaises(AttributeError, lambda: mock.__iter__)
+
+ mock.__iter__ = Mock(return_value=iter([]))
+ self.assertEqual(list(mock), [])
+
+ class NonIterable(object):
+ pass
+ mock = Mock(spec_set=NonIterable)
+ self.assertRaises(AttributeError, lambda: mock.__iter__)
+
+ def set_int():
+ mock.__int__ = Mock(return_value=iter([]))
+ self.assertRaises(AttributeError, set_int)
+
+ mock = MagicMock(spec_set=Iterable)
+ self.assertEqual(list(mock), [])
+ self.assertRaises(AttributeError, set_int)
+
+
+ def test_setting_unsupported_magic_method(self):
+ mock = MagicMock()
+ def set_setattr():
+ mock.__setattr__ = lambda self, name: None
+ self.assertRaisesRegex(AttributeError,
+ "Attempting to set unsupported magic method '__setattr__'.",
+ set_setattr
+ )
+
+
+ def test_attributes_and_return_value(self):
+ mock = MagicMock()
+ attr = mock.foo
+ def _get_type(obj):
+ # the type of every mock (or magicmock) is a custom subclass
+ # so the real type is the second in the mro
+ return type(obj).__mro__[1]
+ self.assertEqual(_get_type(attr), MagicMock)
+
+ returned = mock()
+ self.assertEqual(_get_type(returned), MagicMock)
+
+
+ def test_magic_methods_are_magic_mocks(self):
+ mock = MagicMock()
+ self.assertIsInstance(mock.__getitem__, MagicMock)
+
+ mock[1][2].__getitem__.return_value = 3
+ self.assertEqual(mock[1][2][3], 3)
+
+
+ def test_magic_method_reset_mock(self):
+ mock = MagicMock()
+ str(mock)
+ self.assertTrue(mock.__str__.called)
+ mock.reset_mock()
+ self.assertFalse(mock.__str__.called)
+
+
+ def test_dir(self):
+ # overriding the default implementation
+ for mock in Mock(), MagicMock():
+ def _dir(self):
+ return ['foo']
+ mock.__dir__ = _dir
+ self.assertEqual(dir(mock), ['foo'])
+
+
+ @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy")
+ def test_bound_methods(self):
+ m = Mock()
+
+ # XXXX should this be an expected failure instead?
+
+ # this seems like it should work, but is hard to do without introducing
+ # other api inconsistencies. Failure message could be better though.
+ m.__iter__ = [3].__iter__
+ self.assertRaises(TypeError, iter, m)
+
+
+ def test_magic_method_type(self):
+ class Foo(MagicMock):
+ pass
+
+ foo = Foo()
+ self.assertIsInstance(foo.__int__, Foo)
+
+
+ def test_descriptor_from_class(self):
+ m = MagicMock()
+ type(m).__str__.return_value = 'foo'
+ self.assertEqual(str(m), 'foo')
+
+
+ def test_iterable_as_iter_return_value(self):
+ m = MagicMock()
+ m.__iter__.return_value = [1, 2, 3]
+ self.assertEqual(list(m), [1, 2, 3])
+ self.assertEqual(list(m), [1, 2, 3])
+
+ m.__iter__.return_value = iter([4, 5, 6])
+ self.assertEqual(list(m), [4, 5, 6])
+ self.assertEqual(list(m), [])
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py
new file mode 100644
index 0000000..2c6f128
--- /dev/null
+++ b/Lib/unittest/test/testmock/testmock.py
@@ -0,0 +1,1275 @@
+import copy
+import sys
+
+import unittest
+from unittest.test.testmock.support import is_instance
+from unittest import mock
+from unittest.mock import (
+ call, DEFAULT, patch, sentinel,
+ MagicMock, Mock, NonCallableMock,
+ NonCallableMagicMock, _CallList,
+ create_autospec
+)
+
+
+class Iter(object):
+ def __init__(self):
+ self.thing = iter(['this', 'is', 'an', 'iter'])
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ return next(self.thing)
+
+ __next__ = next
+
+
+
+class MockTest(unittest.TestCase):
+
+ def test_all(self):
+ # if __all__ is badly defined then import * will raise an error
+ # We have to exec it because you can't import * inside a method
+ # in Python 3
+ exec("from unittest.mock import *")
+
+
+ def test_constructor(self):
+ mock = Mock()
+
+ self.assertFalse(mock.called, "called not initialised correctly")
+ self.assertEqual(mock.call_count, 0,
+ "call_count not initialised correctly")
+ self.assertTrue(is_instance(mock.return_value, Mock),
+ "return_value not initialised correctly")
+
+ self.assertEqual(mock.call_args, None,
+ "call_args not initialised correctly")
+ self.assertEqual(mock.call_args_list, [],
+ "call_args_list not initialised correctly")
+ self.assertEqual(mock.method_calls, [],
+ "method_calls not initialised correctly")
+
+ # Can't use hasattr for this test as it always returns True on a mock
+ self.assertFalse('_items' in mock.__dict__,
+ "default mock should not have '_items' attribute")
+
+ self.assertIsNone(mock._mock_parent,
+ "parent not initialised correctly")
+ self.assertIsNone(mock._mock_methods,
+ "methods not initialised correctly")
+ self.assertEqual(mock._mock_children, {},
+ "children not initialised incorrectly")
+
+
+ def test_return_value_in_constructor(self):
+ mock = Mock(return_value=None)
+ self.assertIsNone(mock.return_value,
+ "return value in constructor not honoured")
+
+
+ def test_repr(self):
+ mock = Mock(name='foo')
+ self.assertIn('foo', repr(mock))
+ self.assertIn("'%s'" % id(mock), repr(mock))
+
+ mocks = [(Mock(), 'mock'), (Mock(name='bar'), 'bar')]
+ for mock, name in mocks:
+ self.assertIn('%s.bar' % name, repr(mock.bar))
+ self.assertIn('%s.foo()' % name, repr(mock.foo()))
+ self.assertIn('%s.foo().bing' % name, repr(mock.foo().bing))
+ self.assertIn('%s()' % name, repr(mock()))
+ self.assertIn('%s()()' % name, repr(mock()()))
+ self.assertIn('%s()().foo.bar.baz().bing' % name,
+ repr(mock()().foo.bar.baz().bing))
+
+
+ def test_repr_with_spec(self):
+ class X(object):
+ pass
+
+ mock = Mock(spec=X)
+ self.assertIn(" spec='X' ", repr(mock))
+
+ mock = Mock(spec=X())
+ self.assertIn(" spec='X' ", repr(mock))
+
+ mock = Mock(spec_set=X)
+ self.assertIn(" spec_set='X' ", repr(mock))
+
+ mock = Mock(spec_set=X())
+ self.assertIn(" spec_set='X' ", repr(mock))
+
+ mock = Mock(spec=X, name='foo')
+ self.assertIn(" spec='X' ", repr(mock))
+ self.assertIn(" name='foo' ", repr(mock))
+
+ mock = Mock(name='foo')
+ self.assertNotIn("spec", repr(mock))
+
+ mock = Mock()
+ self.assertNotIn("spec", repr(mock))
+
+ mock = Mock(spec=['foo'])
+ self.assertNotIn("spec", repr(mock))
+
+
+ def test_side_effect(self):
+ mock = Mock()
+
+ def effect(*args, **kwargs):
+ raise SystemError('kablooie')
+
+ mock.side_effect = effect
+ self.assertRaises(SystemError, mock, 1, 2, fish=3)
+ mock.assert_called_with(1, 2, fish=3)
+
+ results = [1, 2, 3]
+ def effect():
+ return results.pop()
+ mock.side_effect = effect
+
+ self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
+ "side effect not used correctly")
+
+ mock = Mock(side_effect=sentinel.SideEffect)
+ self.assertEqual(mock.side_effect, sentinel.SideEffect,
+ "side effect in constructor not used")
+
+ def side_effect():
+ return DEFAULT
+ mock = Mock(side_effect=side_effect, return_value=sentinel.RETURN)
+ self.assertEqual(mock(), sentinel.RETURN)
+
+
+ @unittest.skipUnless('java' in sys.platform,
+ 'This test only applies to Jython')
+ def test_java_exception_side_effect(self):
+ import java
+ mock = Mock(side_effect=java.lang.RuntimeException("Boom!"))
+
+ # can't use assertRaises with java exceptions
+ try:
+ mock(1, 2, fish=3)
+ except java.lang.RuntimeException:
+ pass
+ else:
+ self.fail('java exception not raised')
+ mock.assert_called_with(1,2, fish=3)
+
+
+ def test_reset_mock(self):
+ parent = Mock()
+ spec = ["something"]
+ mock = Mock(name="child", parent=parent, spec=spec)
+ mock(sentinel.Something, something=sentinel.SomethingElse)
+ something = mock.something
+ mock.something()
+ mock.side_effect = sentinel.SideEffect
+ return_value = mock.return_value
+ return_value()
+
+ mock.reset_mock()
+
+ self.assertEqual(mock._mock_name, "child",
+ "name incorrectly reset")
+ self.assertEqual(mock._mock_parent, parent,
+ "parent incorrectly reset")
+ self.assertEqual(mock._mock_methods, spec,
+ "methods incorrectly reset")
+
+ self.assertFalse(mock.called, "called not reset")
+ self.assertEqual(mock.call_count, 0, "call_count not reset")
+ self.assertEqual(mock.call_args, None, "call_args not reset")
+ self.assertEqual(mock.call_args_list, [], "call_args_list not reset")
+ self.assertEqual(mock.method_calls, [],
+ "method_calls not initialised correctly: %r != %r" %
+ (mock.method_calls, []))
+ self.assertEqual(mock.mock_calls, [])
+
+ self.assertEqual(mock.side_effect, sentinel.SideEffect,
+ "side_effect incorrectly reset")
+ self.assertEqual(mock.return_value, return_value,
+ "return_value incorrectly reset")
+ self.assertFalse(return_value.called, "return value mock not reset")
+ self.assertEqual(mock._mock_children, {'something': something},
+ "children reset incorrectly")
+ self.assertEqual(mock.something, something,
+ "children incorrectly cleared")
+ self.assertFalse(mock.something.called, "child not reset")
+
+
+ def test_reset_mock_recursion(self):
+ mock = Mock()
+ mock.return_value = mock
+
+ # used to cause recursion
+ mock.reset_mock()
+
+
+ def test_call(self):
+ mock = Mock()
+ self.assertTrue(is_instance(mock.return_value, Mock),
+ "Default return_value should be a Mock")
+
+ result = mock()
+ self.assertEqual(mock(), result,
+ "different result from consecutive calls")
+ mock.reset_mock()
+
+ ret_val = mock(sentinel.Arg)
+ self.assertTrue(mock.called, "called not set")
+ self.assertEqual(mock.call_count, 1, "call_count incoreect")
+ self.assertEqual(mock.call_args, ((sentinel.Arg,), {}),
+ "call_args not set")
+ self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})],
+ "call_args_list not initialised correctly")
+
+ mock.return_value = sentinel.ReturnValue
+ ret_val = mock(sentinel.Arg, key=sentinel.KeyArg)
+ self.assertEqual(ret_val, sentinel.ReturnValue,
+ "incorrect return value")
+
+ self.assertEqual(mock.call_count, 2, "call_count incorrect")
+ self.assertEqual(mock.call_args,
+ ((sentinel.Arg,), {'key': sentinel.KeyArg}),
+ "call_args not set")
+ self.assertEqual(mock.call_args_list, [
+ ((sentinel.Arg,), {}),
+ ((sentinel.Arg,), {'key': sentinel.KeyArg})
+ ],
+ "call_args_list not set")
+
+
+ def test_call_args_comparison(self):
+ mock = Mock()
+ mock()
+ mock(sentinel.Arg)
+ mock(kw=sentinel.Kwarg)
+ mock(sentinel.Arg, kw=sentinel.Kwarg)
+ self.assertEqual(mock.call_args_list, [
+ (),
+ ((sentinel.Arg,),),
+ ({"kw": sentinel.Kwarg},),
+ ((sentinel.Arg,), {"kw": sentinel.Kwarg})
+ ])
+ self.assertEqual(mock.call_args,
+ ((sentinel.Arg,), {"kw": sentinel.Kwarg}))
+
+
+ def test_assert_called_with(self):
+ mock = Mock()
+ mock()
+
+ # Will raise an exception if it fails
+ mock.assert_called_with()
+ self.assertRaises(AssertionError, mock.assert_called_with, 1)
+
+ mock.reset_mock()
+ self.assertRaises(AssertionError, mock.assert_called_with)
+
+ mock(1, 2, 3, a='fish', b='nothing')
+ mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
+
+
+ def test_assert_called_once_with(self):
+ mock = Mock()
+ mock()
+
+ # Will raise an exception if it fails
+ mock.assert_called_once_with()
+
+ mock()
+ self.assertRaises(AssertionError, mock.assert_called_once_with)
+
+ mock.reset_mock()
+ self.assertRaises(AssertionError, mock.assert_called_once_with)
+
+ mock('foo', 'bar', baz=2)
+ mock.assert_called_once_with('foo', 'bar', baz=2)
+
+ mock.reset_mock()
+ mock('foo', 'bar', baz=2)
+ self.assertRaises(
+ AssertionError,
+ lambda: mock.assert_called_once_with('bob', 'bar', baz=2)
+ )
+
+
+ def test_attribute_access_returns_mocks(self):
+ mock = Mock()
+ something = mock.something
+ self.assertTrue(is_instance(something, Mock), "attribute isn't a mock")
+ self.assertEqual(mock.something, something,
+ "different attributes returned for same name")
+
+ # Usage example
+ mock = Mock()
+ mock.something.return_value = 3
+
+ self.assertEqual(mock.something(), 3, "method returned wrong value")
+ self.assertTrue(mock.something.called,
+ "method didn't record being called")
+
+
+ def test_attributes_have_name_and_parent_set(self):
+ mock = Mock()
+ something = mock.something
+
+ self.assertEqual(something._mock_name, "something",
+ "attribute name not set correctly")
+ self.assertEqual(something._mock_parent, mock,
+ "attribute parent not set correctly")
+
+
+ def test_method_calls_recorded(self):
+ mock = Mock()
+ mock.something(3, fish=None)
+ mock.something_else.something(6, cake=sentinel.Cake)
+
+ self.assertEqual(mock.something_else.method_calls,
+ [("something", (6,), {'cake': sentinel.Cake})],
+ "method calls not recorded correctly")
+ self.assertEqual(mock.method_calls, [
+ ("something", (3,), {'fish': None}),
+ ("something_else.something", (6,), {'cake': sentinel.Cake})
+ ],
+ "method calls not recorded correctly")
+
+
+ def test_method_calls_compare_easily(self):
+ mock = Mock()
+ mock.something()
+ self.assertEqual(mock.method_calls, [('something',)])
+ self.assertEqual(mock.method_calls, [('something', (), {})])
+
+ mock = Mock()
+ mock.something('different')
+ self.assertEqual(mock.method_calls, [('something', ('different',))])
+ self.assertEqual(mock.method_calls,
+ [('something', ('different',), {})])
+
+ mock = Mock()
+ mock.something(x=1)
+ self.assertEqual(mock.method_calls, [('something', {'x': 1})])
+ self.assertEqual(mock.method_calls, [('something', (), {'x': 1})])
+
+ mock = Mock()
+ mock.something('different', some='more')
+ self.assertEqual(mock.method_calls, [
+ ('something', ('different',), {'some': 'more'})
+ ])
+
+
+ def test_only_allowed_methods_exist(self):
+ for spec in ['something'], ('something',):
+ for arg in 'spec', 'spec_set':
+ mock = Mock(**{arg: spec})
+
+ # this should be allowed
+ mock.something
+ self.assertRaisesRegex(
+ AttributeError,
+ "Mock object has no attribute 'something_else'",
+ getattr, mock, 'something_else'
+ )
+
+
+ def test_from_spec(self):
+ class Something(object):
+ x = 3
+ __something__ = None
+ def y(self):
+ pass
+
+ def test_attributes(mock):
+ # should work
+ mock.x
+ mock.y
+ mock.__something__
+ self.assertRaisesRegex(
+ AttributeError,
+ "Mock object has no attribute 'z'",
+ getattr, mock, 'z'
+ )
+ self.assertRaisesRegex(
+ AttributeError,
+ "Mock object has no attribute '__foobar__'",
+ getattr, mock, '__foobar__'
+ )
+
+ test_attributes(Mock(spec=Something))
+ test_attributes(Mock(spec=Something()))
+
+
+ def test_wraps_calls(self):
+ real = Mock()
+
+ mock = Mock(wraps=real)
+ self.assertEqual(mock(), real())
+
+ real.reset_mock()
+
+ mock(1, 2, fish=3)
+ real.assert_called_with(1, 2, fish=3)
+
+
+ def test_wraps_call_with_nondefault_return_value(self):
+ real = Mock()
+
+ mock = Mock(wraps=real)
+ mock.return_value = 3
+
+ self.assertEqual(mock(), 3)
+ self.assertFalse(real.called)
+
+
+ def test_wraps_attributes(self):
+ class Real(object):
+ attribute = Mock()
+
+ real = Real()
+
+ mock = Mock(wraps=real)
+ self.assertEqual(mock.attribute(), real.attribute())
+ self.assertRaises(AttributeError, lambda: mock.fish)
+
+ self.assertNotEqual(mock.attribute, real.attribute)
+ result = mock.attribute.frog(1, 2, fish=3)
+ Real.attribute.frog.assert_called_with(1, 2, fish=3)
+ self.assertEqual(result, Real.attribute.frog())
+
+
+ def test_exceptional_side_effect(self):
+ mock = Mock(side_effect=AttributeError)
+ self.assertRaises(AttributeError, mock)
+
+ mock = Mock(side_effect=AttributeError('foo'))
+ self.assertRaises(AttributeError, mock)
+
+
+ def test_baseexceptional_side_effect(self):
+ mock = Mock(side_effect=KeyboardInterrupt)
+ self.assertRaises(KeyboardInterrupt, mock)
+
+ mock = Mock(side_effect=KeyboardInterrupt('foo'))
+ self.assertRaises(KeyboardInterrupt, mock)
+
+
+ def test_assert_called_with_message(self):
+ mock = Mock()
+ self.assertRaisesRegex(AssertionError, 'Not called',
+ mock.assert_called_with)
+
+
+ def test_assert_called_once_with_message(self):
+ mock = Mock(name='geoffrey')
+ self.assertRaisesRegex(AssertionError,
+ r"Expected 'geoffrey' to be called once\.",
+ mock.assert_called_once_with)
+
+
+ def test__name__(self):
+ mock = Mock()
+ self.assertRaises(AttributeError, lambda: mock.__name__)
+
+ mock.__name__ = 'foo'
+ self.assertEqual(mock.__name__, 'foo')
+
+
+ def test_spec_list_subclass(self):
+ class Sub(list):
+ pass
+ mock = Mock(spec=Sub(['foo']))
+
+ mock.append(3)
+ mock.append.assert_called_with(3)
+ self.assertRaises(AttributeError, getattr, mock, 'foo')
+
+
+ def test_spec_class(self):
+ class X(object):
+ pass
+
+ mock = Mock(spec=X)
+ self.assertTrue(isinstance(mock, X))
+
+ mock = Mock(spec=X())
+ self.assertTrue(isinstance(mock, X))
+
+ self.assertIs(mock.__class__, X)
+ self.assertEqual(Mock().__class__.__name__, 'Mock')
+
+ mock = Mock(spec_set=X)
+ self.assertTrue(isinstance(mock, X))
+
+ mock = Mock(spec_set=X())
+ self.assertTrue(isinstance(mock, X))
+
+
+ def test_setting_attribute_with_spec_set(self):
+ class X(object):
+ y = 3
+
+ mock = Mock(spec=X)
+ mock.x = 'foo'
+
+ mock = Mock(spec_set=X)
+ def set_attr():
+ mock.x = 'foo'
+
+ mock.y = 'foo'
+ self.assertRaises(AttributeError, set_attr)
+
+
+ def test_copy(self):
+ current = sys.getrecursionlimit()
+ self.addCleanup(sys.setrecursionlimit, current)
+
+ # can't use sys.maxint as this doesn't exist in Python 3
+ sys.setrecursionlimit(int(10e8))
+ # this segfaults without the fix in place
+ copy.copy(Mock())
+
+
+ def test_subclass_with_properties(self):
+ class SubClass(Mock):
+ def _get(self):
+ return 3
+ def _set(self, value):
+ raise NameError('strange error')
+ some_attribute = property(_get, _set)
+
+ s = SubClass(spec_set=SubClass)
+ self.assertEqual(s.some_attribute, 3)
+
+ def test():
+ s.some_attribute = 3
+ self.assertRaises(NameError, test)
+
+ def test():
+ s.foo = 'bar'
+ self.assertRaises(AttributeError, test)
+
+
+ def test_setting_call(self):
+ mock = Mock()
+ def __call__(self, a):
+ return self._mock_call(a)
+
+ type(mock).__call__ = __call__
+ mock('one')
+ mock.assert_called_with('one')
+
+ self.assertRaises(TypeError, mock, 'one', 'two')
+
+
+ def test_dir(self):
+ mock = Mock()
+ attrs = set(dir(mock))
+ type_attrs = set([m for m in dir(Mock) if not m.startswith('_')])
+
+ # all public attributes from the type are included
+ self.assertEqual(set(), type_attrs - attrs)
+
+ # creates these attributes
+ mock.a, mock.b
+ self.assertIn('a', dir(mock))
+ self.assertIn('b', dir(mock))
+
+ # instance attributes
+ mock.c = mock.d = None
+ self.assertIn('c', dir(mock))
+ self.assertIn('d', dir(mock))
+
+ # magic methods
+ mock.__iter__ = lambda s: iter([])
+ self.assertIn('__iter__', dir(mock))
+
+
+ def test_dir_from_spec(self):
+ mock = Mock(spec=unittest.TestCase)
+ testcase_attrs = set(dir(unittest.TestCase))
+ attrs = set(dir(mock))
+
+ # all attributes from the spec are included
+ self.assertEqual(set(), testcase_attrs - attrs)
+
+ # shadow a sys attribute
+ mock.version = 3
+ self.assertEqual(dir(mock).count('version'), 1)
+
+
+ def test_filter_dir(self):
+ patcher = patch.object(mock, 'FILTER_DIR', False)
+ patcher.start()
+ try:
+ attrs = set(dir(Mock()))
+ type_attrs = set(dir(Mock))
+
+ # ALL attributes from the type are included
+ self.assertEqual(set(), type_attrs - attrs)
+ finally:
+ patcher.stop()
+
+
+ def test_configure_mock(self):
+ mock = Mock(foo='bar')
+ self.assertEqual(mock.foo, 'bar')
+
+ mock = MagicMock(foo='bar')
+ self.assertEqual(mock.foo, 'bar')
+
+ kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
+ 'foo': MagicMock()}
+ mock = Mock(**kwargs)
+ self.assertRaises(KeyError, mock)
+ self.assertEqual(mock.foo.bar(), 33)
+ self.assertIsInstance(mock.foo, MagicMock)
+
+ mock = Mock()
+ mock.configure_mock(**kwargs)
+ self.assertRaises(KeyError, mock)
+ self.assertEqual(mock.foo.bar(), 33)
+ self.assertIsInstance(mock.foo, MagicMock)
+
+
+ def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs):
+ # needed because assertRaisesRegex doesn't work easily with newlines
+ try:
+ func(*args, **kwargs)
+ except:
+ instance = sys.exc_info()[1]
+ self.assertIsInstance(instance, exception)
+ else:
+ self.fail('Exception %r not raised' % (exception,))
+
+ msg = str(instance)
+ self.assertEqual(msg, message)
+
+
+ def test_assert_called_with_failure_message(self):
+ mock = NonCallableMock()
+
+ expected = "mock(1, '2', 3, bar='foo')"
+ message = 'Expected call: %s\nNot called'
+ self.assertRaisesWithMsg(
+ AssertionError, message % (expected,),
+ mock.assert_called_with, 1, '2', 3, bar='foo'
+ )
+
+ mock.foo(1, '2', 3, foo='foo')
+
+
+ asserters = [
+ mock.foo.assert_called_with, mock.foo.assert_called_once_with
+ ]
+ for meth in asserters:
+ actual = "foo(1, '2', 3, foo='foo')"
+ expected = "foo(1, '2', 3, bar='foo')"
+ message = 'Expected call: %s\nActual call: %s'
+ self.assertRaisesWithMsg(
+ AssertionError, message % (expected, actual),
+ meth, 1, '2', 3, bar='foo'
+ )
+
+ # just kwargs
+ for meth in asserters:
+ actual = "foo(1, '2', 3, foo='foo')"
+ expected = "foo(bar='foo')"
+ message = 'Expected call: %s\nActual call: %s'
+ self.assertRaisesWithMsg(
+ AssertionError, message % (expected, actual),
+ meth, bar='foo'
+ )
+
+ # just args
+ for meth in asserters:
+ actual = "foo(1, '2', 3, foo='foo')"
+ expected = "foo(1, 2, 3)"
+ message = 'Expected call: %s\nActual call: %s'
+ self.assertRaisesWithMsg(
+ AssertionError, message % (expected, actual),
+ meth, 1, 2, 3
+ )
+
+ # empty
+ for meth in asserters:
+ actual = "foo(1, '2', 3, foo='foo')"
+ expected = "foo()"
+ message = 'Expected call: %s\nActual call: %s'
+ self.assertRaisesWithMsg(
+ AssertionError, message % (expected, actual), meth
+ )
+
+
+ def test_mock_calls(self):
+ mock = MagicMock()
+
+ # need to do this because MagicMock.mock_calls used to just return
+ # a MagicMock which also returned a MagicMock when __eq__ was called
+ self.assertIs(mock.mock_calls == [], True)
+
+ mock = MagicMock()
+ mock()
+ expected = [('', (), {})]
+ self.assertEqual(mock.mock_calls, expected)
+
+ mock.foo()
+ expected.append(call.foo())
+ self.assertEqual(mock.mock_calls, expected)
+ # intermediate mock_calls work too
+ self.assertEqual(mock.foo.mock_calls, [('', (), {})])
+
+ mock = MagicMock()
+ mock().foo(1, 2, 3, a=4, b=5)
+ expected = [
+ ('', (), {}), ('().foo', (1, 2, 3), dict(a=4, b=5))
+ ]
+ self.assertEqual(mock.mock_calls, expected)
+ self.assertEqual(mock.return_value.foo.mock_calls,
+ [('', (1, 2, 3), dict(a=4, b=5))])
+ self.assertEqual(mock.return_value.mock_calls,
+ [('foo', (1, 2, 3), dict(a=4, b=5))])
+
+ mock = MagicMock()
+ mock().foo.bar().baz()
+ expected = [
+ ('', (), {}), ('().foo.bar', (), {}),
+ ('().foo.bar().baz', (), {})
+ ]
+ self.assertEqual(mock.mock_calls, expected)
+ self.assertEqual(mock().mock_calls,
+ call.foo.bar().baz().call_list())
+
+ for kwargs in dict(), dict(name='bar'):
+ mock = MagicMock(**kwargs)
+ int(mock.foo)
+ expected = [('foo.__int__', (), {})]
+ self.assertEqual(mock.mock_calls, expected)
+
+ mock = MagicMock(**kwargs)
+ mock.a()()
+ expected = [('a', (), {}), ('a()', (), {})]
+ self.assertEqual(mock.mock_calls, expected)
+ self.assertEqual(mock.a().mock_calls, [call()])
+
+ mock = MagicMock(**kwargs)
+ mock(1)(2)(3)
+ self.assertEqual(mock.mock_calls, call(1)(2)(3).call_list())
+ self.assertEqual(mock().mock_calls, call(2)(3).call_list())
+ self.assertEqual(mock()().mock_calls, call(3).call_list())
+
+ mock = MagicMock(**kwargs)
+ mock(1)(2)(3).a.b.c(4)
+ self.assertEqual(mock.mock_calls,
+ call(1)(2)(3).a.b.c(4).call_list())
+ self.assertEqual(mock().mock_calls,
+ call(2)(3).a.b.c(4).call_list())
+ self.assertEqual(mock()().mock_calls,
+ call(3).a.b.c(4).call_list())
+
+ mock = MagicMock(**kwargs)
+ int(mock().foo.bar().baz())
+ last_call = ('().foo.bar().baz().__int__', (), {})
+ self.assertEqual(mock.mock_calls[-1], last_call)
+ self.assertEqual(mock().mock_calls,
+ call.foo.bar().baz().__int__().call_list())
+ self.assertEqual(mock().foo.bar().mock_calls,
+ call.baz().__int__().call_list())
+ self.assertEqual(mock().foo.bar().baz.mock_calls,
+ call().__int__().call_list())
+
+
+ def test_subclassing(self):
+ class Subclass(Mock):
+ pass
+
+ mock = Subclass()
+ self.assertIsInstance(mock.foo, Subclass)
+ self.assertIsInstance(mock(), Subclass)
+
+ class Subclass(Mock):
+ def _get_child_mock(self, **kwargs):
+ return Mock(**kwargs)
+
+ mock = Subclass()
+ self.assertNotIsInstance(mock.foo, Subclass)
+ self.assertNotIsInstance(mock(), Subclass)
+
+
+ def test_arg_lists(self):
+ mocks = [
+ Mock(),
+ MagicMock(),
+ NonCallableMock(),
+ NonCallableMagicMock()
+ ]
+
+ def assert_attrs(mock):
+ names = 'call_args_list', 'method_calls', 'mock_calls'
+ for name in names:
+ attr = getattr(mock, name)
+ self.assertIsInstance(attr, _CallList)
+ self.assertIsInstance(attr, list)
+ self.assertEqual(attr, [])
+
+ for mock in mocks:
+ assert_attrs(mock)
+
+ if callable(mock):
+ mock()
+ mock(1, 2)
+ mock(a=3)
+
+ mock.reset_mock()
+ assert_attrs(mock)
+
+ mock.foo()
+ mock.foo.bar(1, a=3)
+ mock.foo(1).bar().baz(3)
+
+ mock.reset_mock()
+ assert_attrs(mock)
+
+
+ def test_call_args_two_tuple(self):
+ mock = Mock()
+ mock(1, a=3)
+ mock(2, b=4)
+
+ self.assertEqual(len(mock.call_args), 2)
+ args, kwargs = mock.call_args
+ self.assertEqual(args, (2,))
+ self.assertEqual(kwargs, dict(b=4))
+
+ expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))]
+ for expected, call_args in zip(expected_list, mock.call_args_list):
+ self.assertEqual(len(call_args), 2)
+ self.assertEqual(expected[0], call_args[0])
+ self.assertEqual(expected[1], call_args[1])
+
+
+ def test_side_effect_iterator(self):
+ mock = Mock(side_effect=iter([1, 2, 3]))
+ self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
+ self.assertRaises(StopIteration, mock)
+
+ mock = MagicMock(side_effect=['a', 'b', 'c'])
+ self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
+ self.assertRaises(StopIteration, mock)
+
+ mock = Mock(side_effect='ghi')
+ self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i'])
+ self.assertRaises(StopIteration, mock)
+
+ class Foo(object):
+ pass
+ mock = MagicMock(side_effect=Foo)
+ self.assertIsInstance(mock(), Foo)
+
+ mock = Mock(side_effect=Iter())
+ self.assertEqual([mock(), mock(), mock(), mock()],
+ ['this', 'is', 'an', 'iter'])
+ self.assertRaises(StopIteration, mock)
+
+
+ def test_side_effect_iterator_exceptions(self):
+ for Klass in Mock, MagicMock:
+ iterable = (ValueError, 3, KeyError, 6)
+ m = Klass(side_effect=iterable)
+ self.assertRaises(ValueError, m)
+ self.assertEqual(m(), 3)
+ self.assertRaises(KeyError, m)
+ self.assertEqual(m(), 6)
+
+
+ def test_side_effect_setting_iterator(self):
+ mock = Mock()
+ mock.side_effect = iter([1, 2, 3])
+ self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
+ self.assertRaises(StopIteration, mock)
+ side_effect = mock.side_effect
+ self.assertIsInstance(side_effect, type(iter([])))
+
+ mock.side_effect = ['a', 'b', 'c']
+ self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
+ self.assertRaises(StopIteration, mock)
+ side_effect = mock.side_effect
+ self.assertIsInstance(side_effect, type(iter([])))
+
+ this_iter = Iter()
+ mock.side_effect = this_iter
+ self.assertEqual([mock(), mock(), mock(), mock()],
+ ['this', 'is', 'an', 'iter'])
+ self.assertRaises(StopIteration, mock)
+ self.assertIs(mock.side_effect, this_iter)
+
+
+ def test_assert_has_calls_any_order(self):
+ mock = Mock()
+ mock(1, 2)
+ mock(a=3)
+ mock(3, 4)
+ mock(b=6)
+ mock(b=6)
+
+ kalls = [
+ call(1, 2), ({'a': 3},),
+ ((3, 4),), ((), {'a': 3}),
+ ('', (1, 2)), ('', {'a': 3}),
+ ('', (1, 2), {}), ('', (), {'a': 3})
+ ]
+ for kall in kalls:
+ mock.assert_has_calls([kall], any_order=True)
+
+ for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
+ self.assertRaises(
+ AssertionError, mock.assert_has_calls,
+ [kall], any_order=True
+ )
+
+ kall_lists = [
+ [call(1, 2), call(b=6)],
+ [call(3, 4), call(1, 2)],
+ [call(b=6), call(b=6)],
+ ]
+
+ for kall_list in kall_lists:
+ mock.assert_has_calls(kall_list, any_order=True)
+
+ kall_lists = [
+ [call(b=6), call(b=6), call(b=6)],
+ [call(1, 2), call(1, 2)],
+ [call(3, 4), call(1, 2), call(5, 7)],
+ [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
+ ]
+ for kall_list in kall_lists:
+ self.assertRaises(
+ AssertionError, mock.assert_has_calls,
+ kall_list, any_order=True
+ )
+
+ def test_assert_has_calls(self):
+ kalls1 = [
+ call(1, 2), ({'a': 3},),
+ ((3, 4),), call(b=6),
+ ('', (1,), {'b': 6}),
+ ]
+ kalls2 = [call.foo(), call.bar(1)]
+ kalls2.extend(call.spam().baz(a=3).call_list())
+ kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
+
+ mocks = []
+ for mock in Mock(), MagicMock():
+ mock(1, 2)
+ mock(a=3)
+ mock(3, 4)
+ mock(b=6)
+ mock(1, b=6)
+ mocks.append((mock, kalls1))
+
+ mock = Mock()
+ mock.foo()
+ mock.bar(1)
+ mock.spam().baz(a=3)
+ mock.bam(set(), foo={}).fish([1])
+ mocks.append((mock, kalls2))
+
+ for mock, kalls in mocks:
+ for i in range(len(kalls)):
+ for step in 1, 2, 3:
+ these = kalls[i:i+step]
+ mock.assert_has_calls(these)
+
+ if len(these) > 1:
+ self.assertRaises(
+ AssertionError,
+ mock.assert_has_calls,
+ list(reversed(these))
+ )
+
+
+ def test_assert_any_call(self):
+ mock = Mock()
+ mock(1, 2)
+ mock(a=3)
+ mock(1, b=6)
+
+ mock.assert_any_call(1, 2)
+ mock.assert_any_call(a=3)
+ mock.assert_any_call(1, b=6)
+
+ self.assertRaises(
+ AssertionError,
+ mock.assert_any_call
+ )
+ self.assertRaises(
+ AssertionError,
+ mock.assert_any_call,
+ 1, 3
+ )
+ self.assertRaises(
+ AssertionError,
+ mock.assert_any_call,
+ a=4
+ )
+
+
+ def test_mock_calls_create_autospec(self):
+ def f(a, b):
+ pass
+ obj = Iter()
+ obj.f = f
+
+ funcs = [
+ create_autospec(f),
+ create_autospec(obj).f
+ ]
+ for func in funcs:
+ func(1, 2)
+ func(3, 4)
+
+ self.assertEqual(
+ func.mock_calls, [call(1, 2), call(3, 4)]
+ )
+
+
+ def test_mock_add_spec(self):
+ class _One(object):
+ one = 1
+ class _Two(object):
+ two = 2
+ class Anything(object):
+ one = two = three = 'four'
+
+ klasses = [
+ Mock, MagicMock, NonCallableMock, NonCallableMagicMock
+ ]
+ for Klass in list(klasses):
+ klasses.append(lambda K=Klass: K(spec=Anything))
+ klasses.append(lambda K=Klass: K(spec_set=Anything))
+
+ for Klass in klasses:
+ for kwargs in dict(), dict(spec_set=True):
+ mock = Klass()
+ #no error
+ mock.one, mock.two, mock.three
+
+ for One, Two in [(_One, _Two), (['one'], ['two'])]:
+ for kwargs in dict(), dict(spec_set=True):
+ mock.mock_add_spec(One, **kwargs)
+
+ mock.one
+ self.assertRaises(
+ AttributeError, getattr, mock, 'two'
+ )
+ self.assertRaises(
+ AttributeError, getattr, mock, 'three'
+ )
+ if 'spec_set' in kwargs:
+ self.assertRaises(
+ AttributeError, setattr, mock, 'three', None
+ )
+
+ mock.mock_add_spec(Two, **kwargs)
+ self.assertRaises(
+ AttributeError, getattr, mock, 'one'
+ )
+ mock.two
+ self.assertRaises(
+ AttributeError, getattr, mock, 'three'
+ )
+ if 'spec_set' in kwargs:
+ self.assertRaises(
+ AttributeError, setattr, mock, 'three', None
+ )
+ # note that creating a mock, setting an instance attribute, and
+ # *then* setting a spec doesn't work. Not the intended use case
+
+
+ def test_mock_add_spec_magic_methods(self):
+ for Klass in MagicMock, NonCallableMagicMock:
+ mock = Klass()
+ int(mock)
+
+ mock.mock_add_spec(object)
+ self.assertRaises(TypeError, int, mock)
+
+ mock = Klass()
+ mock['foo']
+ mock.__int__.return_value =4
+
+ mock.mock_add_spec(int)
+ self.assertEqual(int(mock), 4)
+ self.assertRaises(TypeError, lambda: mock['foo'])
+
+
+ def test_adding_child_mock(self):
+ for Klass in NonCallableMock, Mock, MagicMock, NonCallableMagicMock:
+ mock = Klass()
+
+ mock.foo = Mock()
+ mock.foo()
+
+ self.assertEqual(mock.method_calls, [call.foo()])
+ self.assertEqual(mock.mock_calls, [call.foo()])
+
+ mock = Klass()
+ mock.bar = Mock(name='name')
+ mock.bar()
+ self.assertEqual(mock.method_calls, [])
+ self.assertEqual(mock.mock_calls, [])
+
+ # mock with an existing _new_parent but no name
+ mock = Klass()
+ mock.baz = MagicMock()()
+ mock.baz()
+ self.assertEqual(mock.method_calls, [])
+ self.assertEqual(mock.mock_calls, [])
+
+
+ def test_adding_return_value_mock(self):
+ for Klass in Mock, MagicMock:
+ mock = Klass()
+ mock.return_value = MagicMock()
+
+ mock()()
+ self.assertEqual(mock.mock_calls, [call(), call()()])
+
+
+ def test_manager_mock(self):
+ class Foo(object):
+ one = 'one'
+ two = 'two'
+ manager = Mock()
+ p1 = patch.object(Foo, 'one')
+ p2 = patch.object(Foo, 'two')
+
+ mock_one = p1.start()
+ self.addCleanup(p1.stop)
+ mock_two = p2.start()
+ self.addCleanup(p2.stop)
+
+ manager.attach_mock(mock_one, 'one')
+ manager.attach_mock(mock_two, 'two')
+
+ Foo.two()
+ Foo.one()
+
+ self.assertEqual(manager.mock_calls, [call.two(), call.one()])
+
+
+ def test_magic_methods_mock_calls(self):
+ for Klass in Mock, MagicMock:
+ m = Klass()
+ m.__int__ = Mock(return_value=3)
+ m.__float__ = MagicMock(return_value=3.0)
+ int(m)
+ float(m)
+
+ self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
+ self.assertEqual(m.method_calls, [])
+
+
+ def test_attribute_deletion(self):
+ # this behaviour isn't *useful*, but at least it's now tested...
+ for Klass in Mock, MagicMock, NonCallableMagicMock, NonCallableMock:
+ m = Klass()
+ original = m.foo
+ m.foo = 3
+ del m.foo
+ self.assertEqual(m.foo, original)
+
+ new = m.foo = Mock()
+ del m.foo
+ self.assertEqual(m.foo, new)
+
+
+ def test_mock_parents(self):
+ for Klass in Mock, MagicMock:
+ m = Klass()
+ original_repr = repr(m)
+ m.return_value = m
+ self.assertIs(m(), m)
+ self.assertEqual(repr(m), original_repr)
+
+ m.reset_mock()
+ self.assertIs(m(), m)
+ self.assertEqual(repr(m), original_repr)
+
+ m = Klass()
+ m.b = m.a
+ self.assertIn("name='mock.a'", repr(m.b))
+ self.assertIn("name='mock.a'", repr(m.a))
+ m.reset_mock()
+ self.assertIn("name='mock.a'", repr(m.b))
+ self.assertIn("name='mock.a'", repr(m.a))
+
+ m = Klass()
+ original_repr = repr(m)
+ m.a = m()
+ m.a.return_value = m
+
+ self.assertEqual(repr(m), original_repr)
+ self.assertEqual(repr(m.a()), original_repr)
+
+
+ def test_attach_mock(self):
+ classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
+ for Klass in classes:
+ for Klass2 in classes:
+ m = Klass()
+
+ m2 = Klass2(name='foo')
+ m.attach_mock(m2, 'bar')
+
+ self.assertIs(m.bar, m2)
+ self.assertIn("name='mock.bar'", repr(m2))
+
+ m.bar.baz(1)
+ self.assertEqual(m.mock_calls, [call.bar.baz(1)])
+ self.assertEqual(m.method_calls, [call.bar.baz(1)])
+
+
+ def test_attach_mock_return_value(self):
+ classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
+ for Klass in Mock, MagicMock:
+ for Klass2 in classes:
+ m = Klass()
+
+ m2 = Klass2(name='foo')
+ m.attach_mock(m2, 'return_value')
+
+ self.assertIs(m(), m2)
+ self.assertIn("name='mock()'", repr(m2))
+
+ m2.foo()
+ self.assertEqual(m.mock_calls, call().foo().call_list())
+
+
+ def test_attribute_deletion(self):
+ for mock in Mock(), MagicMock():
+ self.assertTrue(hasattr(mock, 'm'))
+
+ del mock.m
+ self.assertFalse(hasattr(mock, 'm'))
+
+ del mock.f
+ self.assertFalse(hasattr(mock, 'f'))
+ self.assertRaises(AttributeError, getattr, mock, 'f')
+
+
+ def test_class_assignable(self):
+ for mock in Mock(), MagicMock():
+ self.assertNotIsInstance(mock, int)
+
+ mock.__class__ = int
+ self.assertIsInstance(mock, int)
+ mock.foo
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py
new file mode 100644
index 0000000..c1091b4
--- /dev/null
+++ b/Lib/unittest/test/testmock/testpatch.py
@@ -0,0 +1,1785 @@
+# Copyright (C) 2007-2012 Michael Foord & the mock team
+# E-mail: fuzzyman AT voidspace DOT org DOT uk
+# http://www.voidspace.org.uk/python/mock/
+
+import os
+import sys
+
+import unittest
+from unittest.test.testmock import support
+from unittest.test.testmock.support import SomeClass, is_instance
+
+from unittest.mock import (
+ NonCallableMock, CallableMixin, patch, sentinel,
+ MagicMock, Mock, NonCallableMagicMock, patch, _patch,
+ DEFAULT, call, _get_target
+)
+
+
+builtin_string = 'builtins'
+
+PTModule = sys.modules[__name__]
+MODNAME = '%s.PTModule' % __name__
+
+
+def _get_proxy(obj, get_only=True):
+ class Proxy(object):
+ def __getattr__(self, name):
+ return getattr(obj, name)
+ if not get_only:
+ def __setattr__(self, name, value):
+ setattr(obj, name, value)
+ def __delattr__(self, name):
+ delattr(obj, name)
+ Proxy.__setattr__ = __setattr__
+ Proxy.__delattr__ = __delattr__
+ return Proxy()
+
+
+# for use in the test
+something = sentinel.Something
+something_else = sentinel.SomethingElse
+
+
+class Foo(object):
+ def __init__(self, a):
+ pass
+ def f(self, a):
+ pass
+ def g(self):
+ pass
+ foo = 'bar'
+
+ class Bar(object):
+ def a(self):
+ pass
+
+foo_name = '%s.Foo' % __name__
+
+
+def function(a, b=Foo):
+ pass
+
+
+class Container(object):
+ def __init__(self):
+ self.values = {}
+
+ def __getitem__(self, name):
+ return self.values[name]
+
+ def __setitem__(self, name, value):
+ self.values[name] = value
+
+ def __delitem__(self, name):
+ del self.values[name]
+
+ def __iter__(self):
+ return iter(self.values)
+
+
+
+class PatchTest(unittest.TestCase):
+
+ def assertNotCallable(self, obj, magic=True):
+ MockClass = NonCallableMagicMock
+ if not magic:
+ MockClass = NonCallableMock
+
+ self.assertRaises(TypeError, obj)
+ self.assertTrue(is_instance(obj, MockClass))
+ self.assertFalse(is_instance(obj, CallableMixin))
+
+
+ def test_single_patchobject(self):
+ class Something(object):
+ attribute = sentinel.Original
+
+ @patch.object(Something, 'attribute', sentinel.Patched)
+ def test():
+ self.assertEqual(Something.attribute, sentinel.Patched, "unpatched")
+
+ test()
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+
+
+ def test_patchobject_with_none(self):
+ class Something(object):
+ attribute = sentinel.Original
+
+ @patch.object(Something, 'attribute', None)
+ def test():
+ self.assertIsNone(Something.attribute, "unpatched")
+
+ test()
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+
+
+ def test_multiple_patchobject(self):
+ class Something(object):
+ attribute = sentinel.Original
+ next_attribute = sentinel.Original2
+
+ @patch.object(Something, 'attribute', sentinel.Patched)
+ @patch.object(Something, 'next_attribute', sentinel.Patched2)
+ def test():
+ self.assertEqual(Something.attribute, sentinel.Patched,
+ "unpatched")
+ self.assertEqual(Something.next_attribute, sentinel.Patched2,
+ "unpatched")
+
+ test()
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+ self.assertEqual(Something.next_attribute, sentinel.Original2,
+ "patch not restored")
+
+
+ def test_object_lookup_is_quite_lazy(self):
+ global something
+ original = something
+ @patch('%s.something' % __name__, sentinel.Something2)
+ def test():
+ pass
+
+ try:
+ something = sentinel.replacement_value
+ test()
+ self.assertEqual(something, sentinel.replacement_value)
+ finally:
+ something = original
+
+
+ def test_patch(self):
+ @patch('%s.something' % __name__, sentinel.Something2)
+ def test():
+ self.assertEqual(PTModule.something, sentinel.Something2,
+ "unpatched")
+
+ test()
+ self.assertEqual(PTModule.something, sentinel.Something,
+ "patch not restored")
+
+ @patch('%s.something' % __name__, sentinel.Something2)
+ @patch('%s.something_else' % __name__, sentinel.SomethingElse)
+ def test():
+ self.assertEqual(PTModule.something, sentinel.Something2,
+ "unpatched")
+ self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
+ "unpatched")
+
+ self.assertEqual(PTModule.something, sentinel.Something,
+ "patch not restored")
+ self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
+ "patch not restored")
+
+ # Test the patching and restoring works a second time
+ test()
+
+ self.assertEqual(PTModule.something, sentinel.Something,
+ "patch not restored")
+ self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
+ "patch not restored")
+
+ mock = Mock()
+ mock.return_value = sentinel.Handle
+ @patch('%s.open' % builtin_string, mock)
+ def test():
+ self.assertEqual(open('filename', 'r'), sentinel.Handle,
+ "open not patched")
+ test()
+ test()
+
+ self.assertNotEqual(open, mock, "patch not restored")
+
+
+ def test_patch_class_attribute(self):
+ @patch('%s.SomeClass.class_attribute' % __name__,
+ sentinel.ClassAttribute)
+ def test():
+ self.assertEqual(PTModule.SomeClass.class_attribute,
+ sentinel.ClassAttribute, "unpatched")
+ test()
+
+ self.assertIsNone(PTModule.SomeClass.class_attribute,
+ "patch not restored")
+
+
+ def test_patchobject_with_default_mock(self):
+ class Test(object):
+ something = sentinel.Original
+ something2 = sentinel.Original2
+
+ @patch.object(Test, 'something')
+ def test(mock):
+ self.assertEqual(mock, Test.something,
+ "Mock not passed into test function")
+ self.assertIsInstance(mock, MagicMock,
+ "patch with two arguments did not create a mock")
+
+ test()
+
+ @patch.object(Test, 'something')
+ @patch.object(Test, 'something2')
+ def test(this1, this2, mock1, mock2):
+ self.assertEqual(this1, sentinel.this1,
+ "Patched function didn't receive initial argument")
+ self.assertEqual(this2, sentinel.this2,
+ "Patched function didn't receive second argument")
+ self.assertEqual(mock1, Test.something2,
+ "Mock not passed into test function")
+ self.assertEqual(mock2, Test.something,
+ "Second Mock not passed into test function")
+ self.assertIsInstance(mock2, MagicMock,
+ "patch with two arguments did not create a mock")
+ self.assertIsInstance(mock2, MagicMock,
+ "patch with two arguments did not create a mock")
+
+ # A hack to test that new mocks are passed the second time
+ self.assertNotEqual(outerMock1, mock1, "unexpected value for mock1")
+ self.assertNotEqual(outerMock2, mock2, "unexpected value for mock1")
+ return mock1, mock2
+
+ outerMock1 = outerMock2 = None
+ outerMock1, outerMock2 = test(sentinel.this1, sentinel.this2)
+
+ # Test that executing a second time creates new mocks
+ test(sentinel.this1, sentinel.this2)
+
+
+ def test_patch_with_spec(self):
+ @patch('%s.SomeClass' % __name__, spec=SomeClass)
+ def test(MockSomeClass):
+ self.assertEqual(SomeClass, MockSomeClass)
+ self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
+ self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
+
+ test()
+
+
+ def test_patchobject_with_spec(self):
+ @patch.object(SomeClass, 'class_attribute', spec=SomeClass)
+ def test(MockAttribute):
+ self.assertEqual(SomeClass.class_attribute, MockAttribute)
+ self.assertTrue(is_instance(SomeClass.class_attribute.wibble,
+ MagicMock))
+ self.assertRaises(AttributeError,
+ lambda: SomeClass.class_attribute.not_wibble)
+
+ test()
+
+
+ def test_patch_with_spec_as_list(self):
+ @patch('%s.SomeClass' % __name__, spec=['wibble'])
+ def test(MockSomeClass):
+ self.assertEqual(SomeClass, MockSomeClass)
+ self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
+ self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
+
+ test()
+
+
+ def test_patchobject_with_spec_as_list(self):
+ @patch.object(SomeClass, 'class_attribute', spec=['wibble'])
+ def test(MockAttribute):
+ self.assertEqual(SomeClass.class_attribute, MockAttribute)
+ self.assertTrue(is_instance(SomeClass.class_attribute.wibble,
+ MagicMock))
+ self.assertRaises(AttributeError,
+ lambda: SomeClass.class_attribute.not_wibble)
+
+ test()
+
+
+ def test_nested_patch_with_spec_as_list(self):
+ # regression test for nested decorators
+ @patch('%s.open' % builtin_string)
+ @patch('%s.SomeClass' % __name__, spec=['wibble'])
+ def test(MockSomeClass, MockOpen):
+ self.assertEqual(SomeClass, MockSomeClass)
+ self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
+ self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
+ test()
+
+
+ def test_patch_with_spec_as_boolean(self):
+ @patch('%s.SomeClass' % __name__, spec=True)
+ def test(MockSomeClass):
+ self.assertEqual(SomeClass, MockSomeClass)
+ # Should not raise attribute error
+ MockSomeClass.wibble
+
+ self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble)
+
+ test()
+
+
+ def test_patch_object_with_spec_as_boolean(self):
+ @patch.object(PTModule, 'SomeClass', spec=True)
+ def test(MockSomeClass):
+ self.assertEqual(SomeClass, MockSomeClass)
+ # Should not raise attribute error
+ MockSomeClass.wibble
+
+ self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble)
+
+ test()
+
+
+ def test_patch_class_acts_with_spec_is_inherited(self):
+ @patch('%s.SomeClass' % __name__, spec=True)
+ def test(MockSomeClass):
+ self.assertTrue(is_instance(MockSomeClass, MagicMock))
+ instance = MockSomeClass()
+ self.assertNotCallable(instance)
+ # Should not raise attribute error
+ instance.wibble
+
+ self.assertRaises(AttributeError, lambda: instance.not_wibble)
+
+ test()
+
+
+ def test_patch_with_create_mocks_non_existent_attributes(self):
+ @patch('%s.frooble' % builtin_string, sentinel.Frooble, create=True)
+ def test():
+ self.assertEqual(frooble, sentinel.Frooble)
+
+ test()
+ self.assertRaises(NameError, lambda: frooble)
+
+
+ def test_patchobject_with_create_mocks_non_existent_attributes(self):
+ @patch.object(SomeClass, 'frooble', sentinel.Frooble, create=True)
+ def test():
+ self.assertEqual(SomeClass.frooble, sentinel.Frooble)
+
+ test()
+ self.assertFalse(hasattr(SomeClass, 'frooble'))
+
+
+ def test_patch_wont_create_by_default(self):
+ try:
+ @patch('%s.frooble' % builtin_string, sentinel.Frooble)
+ def test():
+ self.assertEqual(frooble, sentinel.Frooble)
+
+ test()
+ except AttributeError:
+ pass
+ else:
+ self.fail('Patching non existent attributes should fail')
+
+ self.assertRaises(NameError, lambda: frooble)
+
+
+ def test_patchobject_wont_create_by_default(self):
+ try:
+ @patch.object(SomeClass, 'frooble', sentinel.Frooble)
+ def test():
+ self.fail('Patching non existent attributes should fail')
+
+ test()
+ except AttributeError:
+ pass
+ else:
+ self.fail('Patching non existent attributes should fail')
+ self.assertFalse(hasattr(SomeClass, 'frooble'))
+
+
+ def test_patch_with_static_methods(self):
+ class Foo(object):
+ @staticmethod
+ def woot():
+ return sentinel.Static
+
+ @patch.object(Foo, 'woot', staticmethod(lambda: sentinel.Patched))
+ def anonymous():
+ self.assertEqual(Foo.woot(), sentinel.Patched)
+ anonymous()
+
+ self.assertEqual(Foo.woot(), sentinel.Static)
+
+
+ def test_patch_local(self):
+ foo = sentinel.Foo
+ @patch.object(sentinel, 'Foo', 'Foo')
+ def anonymous():
+ self.assertEqual(sentinel.Foo, 'Foo')
+ anonymous()
+
+ self.assertEqual(sentinel.Foo, foo)
+
+
+ def test_patch_slots(self):
+ class Foo(object):
+ __slots__ = ('Foo',)
+
+ foo = Foo()
+ foo.Foo = sentinel.Foo
+
+ @patch.object(foo, 'Foo', 'Foo')
+ def anonymous():
+ self.assertEqual(foo.Foo, 'Foo')
+ anonymous()
+
+ self.assertEqual(foo.Foo, sentinel.Foo)
+
+
+ def test_patchobject_class_decorator(self):
+ class Something(object):
+ attribute = sentinel.Original
+
+ class Foo(object):
+ def test_method(other_self):
+ self.assertEqual(Something.attribute, sentinel.Patched,
+ "unpatched")
+ def not_test_method(other_self):
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "non-test method patched")
+
+ Foo = patch.object(Something, 'attribute', sentinel.Patched)(Foo)
+
+ f = Foo()
+ f.test_method()
+ f.not_test_method()
+
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+
+
+ def test_patch_class_decorator(self):
+ class Something(object):
+ attribute = sentinel.Original
+
+ class Foo(object):
+ def test_method(other_self, mock_something):
+ self.assertEqual(PTModule.something, mock_something,
+ "unpatched")
+ def not_test_method(other_self):
+ self.assertEqual(PTModule.something, sentinel.Something,
+ "non-test method patched")
+ Foo = patch('%s.something' % __name__)(Foo)
+
+ f = Foo()
+ f.test_method()
+ f.not_test_method()
+
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+ self.assertEqual(PTModule.something, sentinel.Something,
+ "patch not restored")
+
+
+ def test_patchobject_twice(self):
+ class Something(object):
+ attribute = sentinel.Original
+ next_attribute = sentinel.Original2
+
+ @patch.object(Something, 'attribute', sentinel.Patched)
+ @patch.object(Something, 'attribute', sentinel.Patched)
+ def test():
+ self.assertEqual(Something.attribute, sentinel.Patched, "unpatched")
+
+ test()
+
+ self.assertEqual(Something.attribute, sentinel.Original,
+ "patch not restored")
+
+
+ def test_patch_dict(self):
+ foo = {'initial': object(), 'other': 'something'}
+ original = foo.copy()
+
+ @patch.dict(foo)
+ def test():
+ foo['a'] = 3
+ del foo['initial']
+ foo['other'] = 'something else'
+
+ test()
+
+ self.assertEqual(foo, original)
+
+ @patch.dict(foo, {'a': 'b'})
+ def test():
+ self.assertEqual(len(foo), 3)
+ self.assertEqual(foo['a'], 'b')
+
+ test()
+
+ self.assertEqual(foo, original)
+
+ @patch.dict(foo, [('a', 'b')])
+ def test():
+ self.assertEqual(len(foo), 3)
+ self.assertEqual(foo['a'], 'b')
+
+ test()
+
+ self.assertEqual(foo, original)
+
+
+ def test_patch_dict_with_container_object(self):
+ foo = Container()
+ foo['initial'] = object()
+ foo['other'] = 'something'
+
+ original = foo.values.copy()
+
+ @patch.dict(foo)
+ def test():
+ foo['a'] = 3
+ del foo['initial']
+ foo['other'] = 'something else'
+
+ test()
+
+ self.assertEqual(foo.values, original)
+
+ @patch.dict(foo, {'a': 'b'})
+ def test():
+ self.assertEqual(len(foo.values), 3)
+ self.assertEqual(foo['a'], 'b')
+
+ test()
+
+ self.assertEqual(foo.values, original)
+
+
+ def test_patch_dict_with_clear(self):
+ foo = {'initial': object(), 'other': 'something'}
+ original = foo.copy()
+
+ @patch.dict(foo, clear=True)
+ def test():
+ self.assertEqual(foo, {})
+ foo['a'] = 3
+ foo['other'] = 'something else'
+
+ test()
+
+ self.assertEqual(foo, original)
+
+ @patch.dict(foo, {'a': 'b'}, clear=True)
+ def test():
+ self.assertEqual(foo, {'a': 'b'})
+
+ test()
+
+ self.assertEqual(foo, original)
+
+ @patch.dict(foo, [('a', 'b')], clear=True)
+ def test():
+ self.assertEqual(foo, {'a': 'b'})
+
+ test()
+
+ self.assertEqual(foo, original)
+
+
+ def test_patch_dict_with_container_object_and_clear(self):
+ foo = Container()
+ foo['initial'] = object()
+ foo['other'] = 'something'
+
+ original = foo.values.copy()
+
+ @patch.dict(foo, clear=True)
+ def test():
+ self.assertEqual(foo.values, {})
+ foo['a'] = 3
+ foo['other'] = 'something else'
+
+ test()
+
+ self.assertEqual(foo.values, original)
+
+ @patch.dict(foo, {'a': 'b'}, clear=True)
+ def test():
+ self.assertEqual(foo.values, {'a': 'b'})
+
+ test()
+
+ self.assertEqual(foo.values, original)
+
+
+ def test_name_preserved(self):
+ foo = {}
+
+ @patch('%s.SomeClass' % __name__, object())
+ @patch('%s.SomeClass' % __name__, object(), autospec=True)
+ @patch.object(SomeClass, object())
+ @patch.dict(foo)
+ def some_name():
+ pass
+
+ self.assertEqual(some_name.__name__, 'some_name')
+
+
+ def test_patch_with_exception(self):
+ foo = {}
+
+ @patch.dict(foo, {'a': 'b'})
+ def test():
+ raise NameError('Konrad')
+ try:
+ test()
+ except NameError:
+ pass
+ else:
+ self.fail('NameError not raised by test')
+
+ self.assertEqual(foo, {})
+
+
+ def test_patch_dict_with_string(self):
+ @patch.dict('os.environ', {'konrad_delong': 'some value'})
+ def test():
+ self.assertIn('konrad_delong', os.environ)
+
+ test()
+
+
+ def test_patch_descriptor(self):
+ # would be some effort to fix this - we could special case the
+ # builtin descriptors: classmethod, property, staticmethod
+ return
+ class Nothing(object):
+ foo = None
+
+ class Something(object):
+ foo = {}
+
+ @patch.object(Nothing, 'foo', 2)
+ @classmethod
+ def klass(cls):
+ self.assertIs(cls, Something)
+
+ @patch.object(Nothing, 'foo', 2)
+ @staticmethod
+ def static(arg):
+ return arg
+
+ @patch.dict(foo)
+ @classmethod
+ def klass_dict(cls):
+ self.assertIs(cls, Something)
+
+ @patch.dict(foo)
+ @staticmethod
+ def static_dict(arg):
+ return arg
+
+ # these will raise exceptions if patching descriptors is broken
+ self.assertEqual(Something.static('f00'), 'f00')
+ Something.klass()
+ self.assertEqual(Something.static_dict('f00'), 'f00')
+ Something.klass_dict()
+
+ something = Something()
+ self.assertEqual(something.static('f00'), 'f00')
+ something.klass()
+ self.assertEqual(something.static_dict('f00'), 'f00')
+ something.klass_dict()
+
+
+ def test_patch_spec_set(self):
+ @patch('%s.SomeClass' % __name__, spec=SomeClass, spec_set=True)
+ def test(MockClass):
+ MockClass.z = 'foo'
+
+ self.assertRaises(AttributeError, test)
+
+ @patch.object(support, 'SomeClass', spec=SomeClass, spec_set=True)
+ def test(MockClass):
+ MockClass.z = 'foo'
+
+ self.assertRaises(AttributeError, test)
+ @patch('%s.SomeClass' % __name__, spec_set=True)
+ def test(MockClass):
+ MockClass.z = 'foo'
+
+ self.assertRaises(AttributeError, test)
+
+ @patch.object(support, 'SomeClass', spec_set=True)
+ def test(MockClass):
+ MockClass.z = 'foo'
+
+ self.assertRaises(AttributeError, test)
+
+
+ def test_spec_set_inherit(self):
+ @patch('%s.SomeClass' % __name__, spec_set=True)
+ def test(MockClass):
+ instance = MockClass()
+ instance.z = 'foo'
+
+ self.assertRaises(AttributeError, test)
+
+
+ def test_patch_start_stop(self):
+ original = something
+ patcher = patch('%s.something' % __name__)
+ self.assertIs(something, original)
+ mock = patcher.start()
+ try:
+ self.assertIsNot(mock, original)
+ self.assertIs(something, mock)
+ finally:
+ patcher.stop()
+ self.assertIs(something, original)
+
+
+ def test_stop_without_start(self):
+ patcher = patch(foo_name, 'bar', 3)
+
+ # calling stop without start used to produce a very obscure error
+ self.assertRaises(RuntimeError, patcher.stop)
+
+
+ def test_patchobject_start_stop(self):
+ original = something
+ patcher = patch.object(PTModule, 'something', 'foo')
+ self.assertIs(something, original)
+ replaced = patcher.start()
+ try:
+ self.assertEqual(replaced, 'foo')
+ self.assertIs(something, replaced)
+ finally:
+ patcher.stop()
+ self.assertIs(something, original)
+
+
+ def test_patch_dict_start_stop(self):
+ d = {'foo': 'bar'}
+ original = d.copy()
+ patcher = patch.dict(d, [('spam', 'eggs')], clear=True)
+ self.assertEqual(d, original)
+
+ patcher.start()
+ try:
+ self.assertEqual(d, {'spam': 'eggs'})
+ finally:
+ patcher.stop()
+ self.assertEqual(d, original)
+
+
+ def test_patch_dict_class_decorator(self):
+ this = self
+ d = {'spam': 'eggs'}
+ original = d.copy()
+
+ class Test(object):
+ def test_first(self):
+ this.assertEqual(d, {'foo': 'bar'})
+ def test_second(self):
+ this.assertEqual(d, {'foo': 'bar'})
+
+ Test = patch.dict(d, {'foo': 'bar'}, clear=True)(Test)
+ self.assertEqual(d, original)
+
+ test = Test()
+
+ test.test_first()
+ self.assertEqual(d, original)
+
+ test.test_second()
+ self.assertEqual(d, original)
+
+ test = Test()
+
+ test.test_first()
+ self.assertEqual(d, original)
+
+ test.test_second()
+ self.assertEqual(d, original)
+
+
+ def test_get_only_proxy(self):
+ class Something(object):
+ foo = 'foo'
+ class SomethingElse:
+ foo = 'foo'
+
+ for thing in Something, SomethingElse, Something(), SomethingElse:
+ proxy = _get_proxy(thing)
+
+ @patch.object(proxy, 'foo', 'bar')
+ def test():
+ self.assertEqual(proxy.foo, 'bar')
+ test()
+ self.assertEqual(proxy.foo, 'foo')
+ self.assertEqual(thing.foo, 'foo')
+ self.assertNotIn('foo', proxy.__dict__)
+
+
+ def test_get_set_delete_proxy(self):
+ class Something(object):
+ foo = 'foo'
+ class SomethingElse:
+ foo = 'foo'
+
+ for thing in Something, SomethingElse, Something(), SomethingElse:
+ proxy = _get_proxy(Something, get_only=False)
+
+ @patch.object(proxy, 'foo', 'bar')
+ def test():
+ self.assertEqual(proxy.foo, 'bar')
+ test()
+ self.assertEqual(proxy.foo, 'foo')
+ self.assertEqual(thing.foo, 'foo')
+ self.assertNotIn('foo', proxy.__dict__)
+
+
+ def test_patch_keyword_args(self):
+ kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
+ 'foo': MagicMock()}
+
+ patcher = patch(foo_name, **kwargs)
+ mock = patcher.start()
+ patcher.stop()
+
+ self.assertRaises(KeyError, mock)
+ self.assertEqual(mock.foo.bar(), 33)
+ self.assertIsInstance(mock.foo, MagicMock)
+
+
+ def test_patch_object_keyword_args(self):
+ kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
+ 'foo': MagicMock()}
+
+ patcher = patch.object(Foo, 'f', **kwargs)
+ mock = patcher.start()
+ patcher.stop()
+
+ self.assertRaises(KeyError, mock)
+ self.assertEqual(mock.foo.bar(), 33)
+ self.assertIsInstance(mock.foo, MagicMock)
+
+
+ def test_patch_dict_keyword_args(self):
+ original = {'foo': 'bar'}
+ copy = original.copy()
+
+ patcher = patch.dict(original, foo=3, bar=4, baz=5)
+ patcher.start()
+
+ try:
+ self.assertEqual(original, dict(foo=3, bar=4, baz=5))
+ finally:
+ patcher.stop()
+
+ self.assertEqual(original, copy)
+
+
+ def test_autospec(self):
+ class Boo(object):
+ def __init__(self, a):
+ pass
+ def f(self, a):
+ pass
+ def g(self):
+ pass
+ foo = 'bar'
+
+ class Bar(object):
+ def a(self):
+ pass
+
+ def _test(mock):
+ mock(1)
+ mock.assert_called_with(1)
+ self.assertRaises(TypeError, mock)
+
+ def _test2(mock):
+ mock.f(1)
+ mock.f.assert_called_with(1)
+ self.assertRaises(TypeError, mock.f)
+
+ mock.g()
+ mock.g.assert_called_with()
+ self.assertRaises(TypeError, mock.g, 1)
+
+ self.assertRaises(AttributeError, getattr, mock, 'h')
+
+ mock.foo.lower()
+ mock.foo.lower.assert_called_with()
+ self.assertRaises(AttributeError, getattr, mock.foo, 'bar')
+
+ mock.Bar()
+ mock.Bar.assert_called_with()
+
+ mock.Bar.a()
+ mock.Bar.a.assert_called_with()
+ self.assertRaises(TypeError, mock.Bar.a, 1)
+
+ mock.Bar().a()
+ mock.Bar().a.assert_called_with()
+ self.assertRaises(TypeError, mock.Bar().a, 1)
+
+ self.assertRaises(AttributeError, getattr, mock.Bar, 'b')
+ self.assertRaises(AttributeError, getattr, mock.Bar(), 'b')
+
+ def function(mock):
+ _test(mock)
+ _test2(mock)
+ _test2(mock(1))
+ self.assertIs(mock, Foo)
+ return mock
+
+ test = patch(foo_name, autospec=True)(function)
+
+ mock = test()
+ self.assertIsNot(Foo, mock)
+ # test patching a second time works
+ test()
+
+ module = sys.modules[__name__]
+ test = patch.object(module, 'Foo', autospec=True)(function)
+
+ mock = test()
+ self.assertIsNot(Foo, mock)
+ # test patching a second time works
+ test()
+
+
+ def test_autospec_function(self):
+ @patch('%s.function' % __name__, autospec=True)
+ def test(mock):
+ function(1)
+ function.assert_called_with(1)
+ function(2, 3)
+ function.assert_called_with(2, 3)
+
+ self.assertRaises(TypeError, function)
+ self.assertRaises(AttributeError, getattr, function, 'foo')
+
+ test()
+
+
+ def test_autospec_keywords(self):
+ @patch('%s.function' % __name__, autospec=True,
+ return_value=3)
+ def test(mock_function):
+ #self.assertEqual(function.abc, 'foo')
+ return function(1, 2)
+
+ result = test()
+ self.assertEqual(result, 3)
+
+
+ def test_autospec_with_new(self):
+ patcher = patch('%s.function' % __name__, new=3, autospec=True)
+ self.assertRaises(TypeError, patcher.start)
+
+ module = sys.modules[__name__]
+ patcher = patch.object(module, 'function', new=3, autospec=True)
+ self.assertRaises(TypeError, patcher.start)
+
+
+ def test_autospec_with_object(self):
+ class Bar(Foo):
+ extra = []
+
+ patcher = patch(foo_name, autospec=Bar)
+ mock = patcher.start()
+ try:
+ self.assertIsInstance(mock, Bar)
+ self.assertIsInstance(mock.extra, list)
+ finally:
+ patcher.stop()
+
+
+ def test_autospec_inherits(self):
+ FooClass = Foo
+ patcher = patch(foo_name, autospec=True)
+ mock = patcher.start()
+ try:
+ self.assertIsInstance(mock, FooClass)
+ self.assertIsInstance(mock(3), FooClass)
+ finally:
+ patcher.stop()
+
+
+ def test_autospec_name(self):
+ patcher = patch(foo_name, autospec=True)
+ mock = patcher.start()
+
+ try:
+ self.assertIn(" name='Foo'", repr(mock))
+ self.assertIn(" name='Foo.f'", repr(mock.f))
+ self.assertIn(" name='Foo()'", repr(mock(None)))
+ self.assertIn(" name='Foo().f'", repr(mock(None).f))
+ finally:
+ patcher.stop()
+
+
+ def test_tracebacks(self):
+ @patch.object(Foo, 'f', object())
+ def test():
+ raise AssertionError
+ try:
+ test()
+ except:
+ err = sys.exc_info()
+
+ result = unittest.TextTestResult(None, None, 0)
+ traceback = result._exc_info_to_string(err, self)
+ self.assertIn('raise AssertionError', traceback)
+
+
+ def test_new_callable_patch(self):
+ patcher = patch(foo_name, new_callable=NonCallableMagicMock)
+
+ m1 = patcher.start()
+ patcher.stop()
+ m2 = patcher.start()
+ patcher.stop()
+
+ self.assertIsNot(m1, m2)
+ for mock in m1, m2:
+ self.assertNotCallable(m1)
+
+
+ def test_new_callable_patch_object(self):
+ patcher = patch.object(Foo, 'f', new_callable=NonCallableMagicMock)
+
+ m1 = patcher.start()
+ patcher.stop()
+ m2 = patcher.start()
+ patcher.stop()
+
+ self.assertIsNot(m1, m2)
+ for mock in m1, m2:
+ self.assertNotCallable(m1)
+
+
+ def test_new_callable_keyword_arguments(self):
+ class Bar(object):
+ kwargs = None
+ def __init__(self, **kwargs):
+ Bar.kwargs = kwargs
+
+ patcher = patch(foo_name, new_callable=Bar, arg1=1, arg2=2)
+ m = patcher.start()
+ try:
+ self.assertIs(type(m), Bar)
+ self.assertEqual(Bar.kwargs, dict(arg1=1, arg2=2))
+ finally:
+ patcher.stop()
+
+
+ def test_new_callable_spec(self):
+ class Bar(object):
+ kwargs = None
+ def __init__(self, **kwargs):
+ Bar.kwargs = kwargs
+
+ patcher = patch(foo_name, new_callable=Bar, spec=Bar)
+ patcher.start()
+ try:
+ self.assertEqual(Bar.kwargs, dict(spec=Bar))
+ finally:
+ patcher.stop()
+
+ patcher = patch(foo_name, new_callable=Bar, spec_set=Bar)
+ patcher.start()
+ try:
+ self.assertEqual(Bar.kwargs, dict(spec_set=Bar))
+ finally:
+ patcher.stop()
+
+
+ def test_new_callable_create(self):
+ non_existent_attr = '%s.weeeee' % foo_name
+ p = patch(non_existent_attr, new_callable=NonCallableMock)
+ self.assertRaises(AttributeError, p.start)
+
+ p = patch(non_existent_attr, new_callable=NonCallableMock,
+ create=True)
+ m = p.start()
+ try:
+ self.assertNotCallable(m, magic=False)
+ finally:
+ p.stop()
+
+
+ def test_new_callable_incompatible_with_new(self):
+ self.assertRaises(
+ ValueError, patch, foo_name, new=object(), new_callable=MagicMock
+ )
+ self.assertRaises(
+ ValueError, patch.object, Foo, 'f', new=object(),
+ new_callable=MagicMock
+ )
+
+
+ def test_new_callable_incompatible_with_autospec(self):
+ self.assertRaises(
+ ValueError, patch, foo_name, new_callable=MagicMock,
+ autospec=True
+ )
+ self.assertRaises(
+ ValueError, patch.object, Foo, 'f', new_callable=MagicMock,
+ autospec=True
+ )
+
+
+ def test_new_callable_inherit_for_mocks(self):
+ class MockSub(Mock):
+ pass
+
+ MockClasses = (
+ NonCallableMock, NonCallableMagicMock, MagicMock, Mock, MockSub
+ )
+ for Klass in MockClasses:
+ for arg in 'spec', 'spec_set':
+ kwargs = {arg: True}
+ p = patch(foo_name, new_callable=Klass, **kwargs)
+ m = p.start()
+ try:
+ instance = m.return_value
+ self.assertRaises(AttributeError, getattr, instance, 'x')
+ finally:
+ p.stop()
+
+
+ def test_new_callable_inherit_non_mock(self):
+ class NotAMock(object):
+ def __init__(self, spec):
+ self.spec = spec
+
+ p = patch(foo_name, new_callable=NotAMock, spec=True)
+ m = p.start()
+ try:
+ self.assertTrue(is_instance(m, NotAMock))
+ self.assertRaises(AttributeError, getattr, m, 'return_value')
+ finally:
+ p.stop()
+
+ self.assertEqual(m.spec, Foo)
+
+
+ def test_new_callable_class_decorating(self):
+ test = self
+ original = Foo
+ class SomeTest(object):
+
+ def _test(self, mock_foo):
+ test.assertIsNot(Foo, original)
+ test.assertIs(Foo, mock_foo)
+ test.assertIsInstance(Foo, SomeClass)
+
+ def test_two(self, mock_foo):
+ self._test(mock_foo)
+ def test_one(self, mock_foo):
+ self._test(mock_foo)
+
+ SomeTest = patch(foo_name, new_callable=SomeClass)(SomeTest)
+ SomeTest().test_one()
+ SomeTest().test_two()
+ self.assertIs(Foo, original)
+
+
+ def test_patch_multiple(self):
+ original_foo = Foo
+ original_f = Foo.f
+ original_g = Foo.g
+
+ patcher1 = patch.multiple(foo_name, f=1, g=2)
+ patcher2 = patch.multiple(Foo, f=1, g=2)
+
+ for patcher in patcher1, patcher2:
+ patcher.start()
+ try:
+ self.assertIs(Foo, original_foo)
+ self.assertEqual(Foo.f, 1)
+ self.assertEqual(Foo.g, 2)
+ finally:
+ patcher.stop()
+
+ self.assertIs(Foo, original_foo)
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ @patch.multiple(foo_name, f=3, g=4)
+ def test():
+ self.assertIs(Foo, original_foo)
+ self.assertEqual(Foo.f, 3)
+ self.assertEqual(Foo.g, 4)
+
+ test()
+
+
+ def test_patch_multiple_no_kwargs(self):
+ self.assertRaises(ValueError, patch.multiple, foo_name)
+ self.assertRaises(ValueError, patch.multiple, Foo)
+
+
+ def test_patch_multiple_create_mocks(self):
+ original_foo = Foo
+ original_f = Foo.f
+ original_g = Foo.g
+
+ @patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT)
+ def test(f, foo):
+ self.assertIs(Foo, original_foo)
+ self.assertIs(Foo.f, f)
+ self.assertEqual(Foo.g, 3)
+ self.assertIs(Foo.foo, foo)
+ self.assertTrue(is_instance(f, MagicMock))
+ self.assertTrue(is_instance(foo, MagicMock))
+
+ test()
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_create_mocks_different_order(self):
+ # bug revealed by Jython!
+ original_f = Foo.f
+ original_g = Foo.g
+
+ patcher = patch.object(Foo, 'f', 3)
+ patcher.attribute_name = 'f'
+
+ other = patch.object(Foo, 'g', DEFAULT)
+ other.attribute_name = 'g'
+ patcher.additional_patchers = [other]
+
+ @patcher
+ def test(g):
+ self.assertIs(Foo.g, g)
+ self.assertEqual(Foo.f, 3)
+
+ test()
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_stacked_decorators(self):
+ original_foo = Foo
+ original_f = Foo.f
+ original_g = Foo.g
+
+ @patch.multiple(foo_name, f=DEFAULT)
+ @patch.multiple(foo_name, foo=DEFAULT)
+ @patch(foo_name + '.g')
+ def test1(g, **kwargs):
+ _test(g, **kwargs)
+
+ @patch.multiple(foo_name, f=DEFAULT)
+ @patch(foo_name + '.g')
+ @patch.multiple(foo_name, foo=DEFAULT)
+ def test2(g, **kwargs):
+ _test(g, **kwargs)
+
+ @patch(foo_name + '.g')
+ @patch.multiple(foo_name, f=DEFAULT)
+ @patch.multiple(foo_name, foo=DEFAULT)
+ def test3(g, **kwargs):
+ _test(g, **kwargs)
+
+ def _test(g, **kwargs):
+ f = kwargs.pop('f')
+ foo = kwargs.pop('foo')
+ self.assertFalse(kwargs)
+
+ self.assertIs(Foo, original_foo)
+ self.assertIs(Foo.f, f)
+ self.assertIs(Foo.g, g)
+ self.assertIs(Foo.foo, foo)
+ self.assertTrue(is_instance(f, MagicMock))
+ self.assertTrue(is_instance(g, MagicMock))
+ self.assertTrue(is_instance(foo, MagicMock))
+
+ test1()
+ test2()
+ test3()
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_create_mocks_patcher(self):
+ original_foo = Foo
+ original_f = Foo.f
+ original_g = Foo.g
+
+ patcher = patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT)
+
+ result = patcher.start()
+ try:
+ f = result['f']
+ foo = result['foo']
+ self.assertEqual(set(result), set(['f', 'foo']))
+
+ self.assertIs(Foo, original_foo)
+ self.assertIs(Foo.f, f)
+ self.assertIs(Foo.foo, foo)
+ self.assertTrue(is_instance(f, MagicMock))
+ self.assertTrue(is_instance(foo, MagicMock))
+ finally:
+ patcher.stop()
+
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_decorating_class(self):
+ test = self
+ original_foo = Foo
+ original_f = Foo.f
+ original_g = Foo.g
+
+ class SomeTest(object):
+
+ def _test(self, f, foo):
+ test.assertIs(Foo, original_foo)
+ test.assertIs(Foo.f, f)
+ test.assertEqual(Foo.g, 3)
+ test.assertIs(Foo.foo, foo)
+ test.assertTrue(is_instance(f, MagicMock))
+ test.assertTrue(is_instance(foo, MagicMock))
+
+ def test_two(self, f, foo):
+ self._test(f, foo)
+ def test_one(self, f, foo):
+ self._test(f, foo)
+
+ SomeTest = patch.multiple(
+ foo_name, f=DEFAULT, g=3, foo=DEFAULT
+ )(SomeTest)
+
+ thing = SomeTest()
+ thing.test_one()
+ thing.test_two()
+
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_create(self):
+ patcher = patch.multiple(Foo, blam='blam')
+ self.assertRaises(AttributeError, patcher.start)
+
+ patcher = patch.multiple(Foo, blam='blam', create=True)
+ patcher.start()
+ try:
+ self.assertEqual(Foo.blam, 'blam')
+ finally:
+ patcher.stop()
+
+ self.assertFalse(hasattr(Foo, 'blam'))
+
+
+ def test_patch_multiple_spec_set(self):
+ # if spec_set works then we can assume that spec and autospec also
+ # work as the underlying machinery is the same
+ patcher = patch.multiple(Foo, foo=DEFAULT, spec_set=['a', 'b'])
+ result = patcher.start()
+ try:
+ self.assertEqual(Foo.foo, result['foo'])
+ Foo.foo.a(1)
+ Foo.foo.b(2)
+ Foo.foo.a.assert_called_with(1)
+ Foo.foo.b.assert_called_with(2)
+ self.assertRaises(AttributeError, setattr, Foo.foo, 'c', None)
+ finally:
+ patcher.stop()
+
+
+ def test_patch_multiple_new_callable(self):
+ class Thing(object):
+ pass
+
+ patcher = patch.multiple(
+ Foo, f=DEFAULT, g=DEFAULT, new_callable=Thing
+ )
+ result = patcher.start()
+ try:
+ self.assertIs(Foo.f, result['f'])
+ self.assertIs(Foo.g, result['g'])
+ self.assertIsInstance(Foo.f, Thing)
+ self.assertIsInstance(Foo.g, Thing)
+ self.assertIsNot(Foo.f, Foo.g)
+ finally:
+ patcher.stop()
+
+
+ def test_nested_patch_failure(self):
+ original_f = Foo.f
+ original_g = Foo.g
+
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'missing', 1)
+ @patch.object(Foo, 'f', 1)
+ def thing1():
+ pass
+
+ @patch.object(Foo, 'missing', 1)
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'f', 1)
+ def thing2():
+ pass
+
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'f', 1)
+ @patch.object(Foo, 'missing', 1)
+ def thing3():
+ pass
+
+ for func in thing1, thing2, thing3:
+ self.assertRaises(AttributeError, func)
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_new_callable_failure(self):
+ original_f = Foo.f
+ original_g = Foo.g
+ original_foo = Foo.foo
+
+ def crasher():
+ raise NameError('crasher')
+
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'foo', new_callable=crasher)
+ @patch.object(Foo, 'f', 1)
+ def thing1():
+ pass
+
+ @patch.object(Foo, 'foo', new_callable=crasher)
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'f', 1)
+ def thing2():
+ pass
+
+ @patch.object(Foo, 'g', 1)
+ @patch.object(Foo, 'f', 1)
+ @patch.object(Foo, 'foo', new_callable=crasher)
+ def thing3():
+ pass
+
+ for func in thing1, thing2, thing3:
+ self.assertRaises(NameError, func)
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+ self.assertEqual(Foo.foo, original_foo)
+
+
+ def test_patch_multiple_failure(self):
+ original_f = Foo.f
+ original_g = Foo.g
+
+ patcher = patch.object(Foo, 'f', 1)
+ patcher.attribute_name = 'f'
+
+ good = patch.object(Foo, 'g', 1)
+ good.attribute_name = 'g'
+
+ bad = patch.object(Foo, 'missing', 1)
+ bad.attribute_name = 'missing'
+
+ for additionals in [good, bad], [bad, good]:
+ patcher.additional_patchers = additionals
+
+ @patcher
+ def func():
+ pass
+
+ self.assertRaises(AttributeError, func)
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+
+
+ def test_patch_multiple_new_callable_failure(self):
+ original_f = Foo.f
+ original_g = Foo.g
+ original_foo = Foo.foo
+
+ def crasher():
+ raise NameError('crasher')
+
+ patcher = patch.object(Foo, 'f', 1)
+ patcher.attribute_name = 'f'
+
+ good = patch.object(Foo, 'g', 1)
+ good.attribute_name = 'g'
+
+ bad = patch.object(Foo, 'foo', new_callable=crasher)
+ bad.attribute_name = 'foo'
+
+ for additionals in [good, bad], [bad, good]:
+ patcher.additional_patchers = additionals
+
+ @patcher
+ def func():
+ pass
+
+ self.assertRaises(NameError, func)
+ self.assertEqual(Foo.f, original_f)
+ self.assertEqual(Foo.g, original_g)
+ self.assertEqual(Foo.foo, original_foo)
+
+
+ def test_patch_multiple_string_subclasses(self):
+ Foo = type('Foo', (str,), {'fish': 'tasty'})
+ foo = Foo()
+ @patch.multiple(foo, fish='nearly gone')
+ def test():
+ self.assertEqual(foo.fish, 'nearly gone')
+
+ test()
+ self.assertEqual(foo.fish, 'tasty')
+
+
+ @patch('unittest.mock.patch.TEST_PREFIX', 'foo')
+ def test_patch_test_prefix(self):
+ class Foo(object):
+ thing = 'original'
+
+ def foo_one(self):
+ return self.thing
+ def foo_two(self):
+ return self.thing
+ def test_one(self):
+ return self.thing
+ def test_two(self):
+ return self.thing
+
+ Foo = patch.object(Foo, 'thing', 'changed')(Foo)
+
+ foo = Foo()
+ self.assertEqual(foo.foo_one(), 'changed')
+ self.assertEqual(foo.foo_two(), 'changed')
+ self.assertEqual(foo.test_one(), 'original')
+ self.assertEqual(foo.test_two(), 'original')
+
+
+ @patch('unittest.mock.patch.TEST_PREFIX', 'bar')
+ def test_patch_dict_test_prefix(self):
+ class Foo(object):
+ def bar_one(self):
+ return dict(the_dict)
+ def bar_two(self):
+ return dict(the_dict)
+ def test_one(self):
+ return dict(the_dict)
+ def test_two(self):
+ return dict(the_dict)
+
+ the_dict = {'key': 'original'}
+ Foo = patch.dict(the_dict, key='changed')(Foo)
+
+ foo =Foo()
+ self.assertEqual(foo.bar_one(), {'key': 'changed'})
+ self.assertEqual(foo.bar_two(), {'key': 'changed'})
+ self.assertEqual(foo.test_one(), {'key': 'original'})
+ self.assertEqual(foo.test_two(), {'key': 'original'})
+
+
+ def test_patch_with_spec_mock_repr(self):
+ for arg in ('spec', 'autospec', 'spec_set'):
+ p = patch('%s.SomeClass' % __name__, **{arg: True})
+ m = p.start()
+ try:
+ self.assertIn(" name='SomeClass'", repr(m))
+ self.assertIn(" name='SomeClass.class_attribute'",
+ repr(m.class_attribute))
+ self.assertIn(" name='SomeClass()'", repr(m()))
+ self.assertIn(" name='SomeClass().class_attribute'",
+ repr(m().class_attribute))
+ finally:
+ p.stop()
+
+
+ def test_patch_nested_autospec_repr(self):
+ with patch('unittest.test.testmock.support', autospec=True) as m:
+ self.assertIn(" name='support.SomeClass.wibble()'",
+ repr(m.SomeClass.wibble()))
+ self.assertIn(" name='support.SomeClass().wibble()'",
+ repr(m.SomeClass().wibble()))
+
+
+
+ def test_mock_calls_with_patch(self):
+ for arg in ('spec', 'autospec', 'spec_set'):
+ p = patch('%s.SomeClass' % __name__, **{arg: True})
+ m = p.start()
+ try:
+ m.wibble()
+
+ kalls = [call.wibble()]
+ self.assertEqual(m.mock_calls, kalls)
+ self.assertEqual(m.method_calls, kalls)
+ self.assertEqual(m.wibble.mock_calls, [call()])
+
+ result = m()
+ kalls.append(call())
+ self.assertEqual(m.mock_calls, kalls)
+
+ result.wibble()
+ kalls.append(call().wibble())
+ self.assertEqual(m.mock_calls, kalls)
+
+ self.assertEqual(result.mock_calls, [call.wibble()])
+ self.assertEqual(result.wibble.mock_calls, [call()])
+ self.assertEqual(result.method_calls, [call.wibble()])
+ finally:
+ p.stop()
+
+
+ def test_patch_imports_lazily(self):
+ sys.modules.pop('squizz', None)
+
+ p1 = patch('squizz.squozz')
+ self.assertRaises(ImportError, p1.start)
+
+ squizz = Mock()
+ squizz.squozz = 6
+ sys.modules['squizz'] = squizz
+ p1 = patch('squizz.squozz')
+ squizz.squozz = 3
+ p1.start()
+ p1.stop()
+ self.assertEqual(squizz.squozz, 3)
+
+
+ def test_patch_propogrates_exc_on_exit(self):
+ class holder:
+ exc_info = None, None, None
+
+ class custom_patch(_patch):
+ def __exit__(self, etype=None, val=None, tb=None):
+ _patch.__exit__(self, etype, val, tb)
+ holder.exc_info = etype, val, tb
+ stop = __exit__
+
+ def with_custom_patch(target):
+ getter, attribute = _get_target(target)
+ return custom_patch(
+ getter, attribute, DEFAULT, None, False, None,
+ None, None, {}
+ )
+
+ @with_custom_patch('squizz.squozz')
+ def test(mock):
+ raise RuntimeError
+
+ self.assertRaises(RuntimeError, test)
+ self.assertIs(holder.exc_info[0], RuntimeError)
+ self.assertIsNotNone(holder.exc_info[1],
+ 'exception value not propgated')
+ self.assertIsNotNone(holder.exc_info[2],
+ 'exception traceback not propgated')
+
+
+ def test_create_and_specs(self):
+ for kwarg in ('spec', 'spec_set', 'autospec'):
+ p = patch('%s.doesnotexist' % __name__, create=True,
+ **{kwarg: True})
+ self.assertRaises(TypeError, p.start)
+ self.assertRaises(NameError, lambda: doesnotexist)
+
+ # check that spec with create is innocuous if the original exists
+ p = patch(MODNAME, create=True, **{kwarg: True})
+ p.start()
+ p.stop()
+
+
+ def test_multiple_specs(self):
+ original = PTModule
+ for kwarg in ('spec', 'spec_set'):
+ p = patch(MODNAME, autospec=0, **{kwarg: 0})
+ self.assertRaises(TypeError, p.start)
+ self.assertIs(PTModule, original)
+
+ for kwarg in ('spec', 'autospec'):
+ p = patch(MODNAME, spec_set=0, **{kwarg: 0})
+ self.assertRaises(TypeError, p.start)
+ self.assertIs(PTModule, original)
+
+ for kwarg in ('spec_set', 'autospec'):
+ p = patch(MODNAME, spec=0, **{kwarg: 0})
+ self.assertRaises(TypeError, p.start)
+ self.assertIs(PTModule, original)
+
+
+ def test_specs_false_instead_of_none(self):
+ p = patch(MODNAME, spec=False, spec_set=False, autospec=False)
+ mock = p.start()
+ try:
+ # no spec should have been set, so attribute access should not fail
+ mock.does_not_exist
+ mock.does_not_exist = 3
+ finally:
+ p.stop()
+
+
+ def test_falsey_spec(self):
+ for kwarg in ('spec', 'autospec', 'spec_set'):
+ p = patch(MODNAME, **{kwarg: 0})
+ m = p.start()
+ try:
+ self.assertRaises(AttributeError, getattr, m, 'doesnotexit')
+ finally:
+ p.stop()
+
+
+ def test_spec_set_true(self):
+ for kwarg in ('spec', 'autospec'):
+ p = patch(MODNAME, spec_set=True, **{kwarg: True})
+ m = p.start()
+ try:
+ self.assertRaises(AttributeError, setattr, m,
+ 'doesnotexist', 'something')
+ self.assertRaises(AttributeError, getattr, m, 'doesnotexist')
+ finally:
+ p.stop()
+
+
+ def test_callable_spec_as_list(self):
+ spec = ('__call__',)
+ p = patch(MODNAME, spec=spec)
+ m = p.start()
+ try:
+ self.assertTrue(callable(m))
+ finally:
+ p.stop()
+
+
+ def test_not_callable_spec_as_list(self):
+ spec = ('foo', 'bar')
+ p = patch(MODNAME, spec=spec)
+ m = p.start()
+ try:
+ self.assertFalse(callable(m))
+ finally:
+ p.stop()
+
+
+ def test_patch_stopall(self):
+ unlink = os.unlink
+ chdir = os.chdir
+ path = os.path
+ patch('os.unlink', something).start()
+ patch('os.chdir', something_else).start()
+
+ @patch('os.path')
+ def patched(mock_path):
+ patch.stopall()
+ self.assertIs(os.path, mock_path)
+ self.assertIs(os.unlink, unlink)
+ self.assertIs(os.chdir, chdir)
+
+ patched()
+ self.assertIs(os.path, path)
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/unittest/test/testmock/testsentinel.py b/Lib/unittest/test/testmock/testsentinel.py
new file mode 100644
index 0000000..bfda68e
--- /dev/null
+++ b/Lib/unittest/test/testmock/testsentinel.py
@@ -0,0 +1,28 @@
+import unittest
+from unittest.mock import sentinel, DEFAULT
+
+
+class SentinelTest(unittest.TestCase):
+
+ def testSentinels(self):
+ self.assertEqual(sentinel.whatever, sentinel.whatever,
+ 'sentinel not stored')
+ self.assertNotEqual(sentinel.whatever, sentinel.whateverelse,
+ 'sentinel should be unique')
+
+
+ def testSentinelName(self):
+ self.assertEqual(str(sentinel.whatever), 'sentinel.whatever',
+ 'sentinel name incorrect')
+
+
+ def testDEFAULT(self):
+ self.assertTrue(DEFAULT is sentinel.DEFAULT)
+
+ def testBases(self):
+ # If this doesn't raise an AttributeError then help(mock) is broken
+ self.assertRaises(AttributeError, lambda: sentinel.__bases__)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/unittest/test/testmock/testwith.py b/Lib/unittest/test/testmock/testwith.py
new file mode 100644
index 0000000..0a0cfad
--- /dev/null
+++ b/Lib/unittest/test/testmock/testwith.py
@@ -0,0 +1,176 @@
+import unittest
+from warnings import catch_warnings
+
+from unittest.test.testmock.support import is_instance
+from unittest.mock import MagicMock, Mock, patch, sentinel, mock_open, call
+
+
+
+something = sentinel.Something
+something_else = sentinel.SomethingElse
+
+
+
+class WithTest(unittest.TestCase):
+
+ def test_with_statement(self):
+ with patch('%s.something' % __name__, sentinel.Something2):
+ self.assertEqual(something, sentinel.Something2, "unpatched")
+ self.assertEqual(something, sentinel.Something)
+
+
+ def test_with_statement_exception(self):
+ try:
+ with patch('%s.something' % __name__, sentinel.Something2):
+ self.assertEqual(something, sentinel.Something2, "unpatched")
+ raise Exception('pow')
+ except Exception:
+ pass
+ else:
+ self.fail("patch swallowed exception")
+ self.assertEqual(something, sentinel.Something)
+
+
+ def test_with_statement_as(self):
+ with patch('%s.something' % __name__) as mock_something:
+ self.assertEqual(something, mock_something, "unpatched")
+ self.assertTrue(is_instance(mock_something, MagicMock),
+ "patching wrong type")
+ self.assertEqual(something, sentinel.Something)
+
+
+ def test_patch_object_with_statement(self):
+ class Foo(object):
+ something = 'foo'
+ original = Foo.something
+ with patch.object(Foo, 'something'):
+ self.assertNotEqual(Foo.something, original, "unpatched")
+ self.assertEqual(Foo.something, original)
+
+
+ def test_with_statement_nested(self):
+ with catch_warnings(record=True):
+ with patch('%s.something' % __name__) as mock_something, patch('%s.something_else' % __name__) as mock_something_else:
+ self.assertEqual(something, mock_something, "unpatched")
+ self.assertEqual(something_else, mock_something_else,
+ "unpatched")
+
+ self.assertEqual(something, sentinel.Something)
+ self.assertEqual(something_else, sentinel.SomethingElse)
+
+
+ def test_with_statement_specified(self):
+ with patch('%s.something' % __name__, sentinel.Patched) as mock_something:
+ self.assertEqual(something, mock_something, "unpatched")
+ self.assertEqual(mock_something, sentinel.Patched, "wrong patch")
+ self.assertEqual(something, sentinel.Something)
+
+
+ def testContextManagerMocking(self):
+ mock = Mock()
+ mock.__enter__ = Mock()
+ mock.__exit__ = Mock()
+ mock.__exit__.return_value = False
+
+ with mock as m:
+ self.assertEqual(m, mock.__enter__.return_value)
+ mock.__enter__.assert_called_with()
+ mock.__exit__.assert_called_with(None, None, None)
+
+
+ def test_context_manager_with_magic_mock(self):
+ mock = MagicMock()
+
+ with self.assertRaises(TypeError):
+ with mock:
+ 'foo' + 3
+ mock.__enter__.assert_called_with()
+ self.assertTrue(mock.__exit__.called)
+
+
+ def test_with_statement_same_attribute(self):
+ with patch('%s.something' % __name__, sentinel.Patched) as mock_something:
+ self.assertEqual(something, mock_something, "unpatched")
+
+ with patch('%s.something' % __name__) as mock_again:
+ self.assertEqual(something, mock_again, "unpatched")
+
+ self.assertEqual(something, mock_something,
+ "restored with wrong instance")
+
+ self.assertEqual(something, sentinel.Something, "not restored")
+
+
+ def test_with_statement_imbricated(self):
+ with patch('%s.something' % __name__) as mock_something:
+ self.assertEqual(something, mock_something, "unpatched")
+
+ with patch('%s.something_else' % __name__) as mock_something_else:
+ self.assertEqual(something_else, mock_something_else,
+ "unpatched")
+
+ self.assertEqual(something, sentinel.Something)
+ self.assertEqual(something_else, sentinel.SomethingElse)
+
+
+ def test_dict_context_manager(self):
+ foo = {}
+ with patch.dict(foo, {'a': 'b'}):
+ self.assertEqual(foo, {'a': 'b'})
+ self.assertEqual(foo, {})
+
+ with self.assertRaises(NameError):
+ with patch.dict(foo, {'a': 'b'}):
+ self.assertEqual(foo, {'a': 'b'})
+ raise NameError('Konrad')
+
+ self.assertEqual(foo, {})
+
+
+
+class TestMockOpen(unittest.TestCase):
+
+ def test_mock_open(self):
+ mock = mock_open()
+ with patch('%s.open' % __name__, mock, create=True) as patched:
+ self.assertIs(patched, mock)
+ open('foo')
+
+ mock.assert_called_once_with('foo')
+
+
+ def test_mock_open_context_manager(self):
+ mock = mock_open()
+ handle = mock.return_value
+ with patch('%s.open' % __name__, mock, create=True):
+ with open('foo') as f:
+ f.read()
+
+ expected_calls = [call('foo'), call().__enter__(), call().read(),
+ call().__exit__(None, None, None)]
+ self.assertEqual(mock.mock_calls, expected_calls)
+ self.assertIs(f, handle)
+
+
+ def test_explicit_mock(self):
+ mock = MagicMock()
+ mock_open(mock)
+
+ with patch('%s.open' % __name__, mock, create=True) as patched:
+ self.assertIs(patched, mock)
+ open('foo')
+
+ mock.assert_called_once_with('foo')
+
+
+ def test_read_data(self):
+ mock = mock_open(read_data='foo')
+ with patch('%s.open' % __name__, mock, create=True):
+ h = open('bar')
+ result = h.read()
+
+ self.assertEqual(result, 'foo')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/urllib/error.py b/Lib/urllib/error.py
index 40add41..c1dfc40 100644
--- a/Lib/urllib/error.py
+++ b/Lib/urllib/error.py
@@ -13,6 +13,9 @@ response.
import urllib.response
+__all__ = ['URLError', 'HTTPError', 'ContentTooShortError']
+
+
# do these error classes make sense?
# make sure all of the IOError stuff is overridden. we just want to be
# subtypes.
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index eb45c7e..5ddec5f 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -89,14 +89,16 @@ import http.client
import io
import os
import posixpath
-import random
import re
import socket
import sys
import time
import collections
+import tempfile
+import contextlib
import warnings
+
from urllib.error import URLError, HTTPError, ContentTooShortError
from urllib.parse import (
urlparse, urlsplit, urljoin, unwrap, quote, unquote,
@@ -112,21 +114,40 @@ except ImportError:
else:
_have_ssl = True
+__all__ = [
+ # Classes
+ 'Request', 'OpenerDirector', 'BaseHandler', 'HTTPDefaultErrorHandler',
+ 'HTTPRedirectHandler', 'HTTPCookieProcessor', 'ProxyHandler',
+ 'HTTPPasswordMgr', 'HTTPPasswordMgrWithDefaultRealm',
+ 'AbstractBasicAuthHandler', 'HTTPBasicAuthHandler', 'ProxyBasicAuthHandler',
+ 'AbstractDigestAuthHandler', 'HTTPDigestAuthHandler', 'ProxyDigestAuthHandler',
+ 'HTTPHandler', 'FileHandler', 'FTPHandler', 'CacheFTPHandler',
+ 'UnknownHandler', 'HTTPErrorProcessor',
+ # Functions
+ 'urlopen', 'install_opener', 'build_opener',
+ 'pathname2url', 'url2pathname', 'getproxies',
+ # Legacy interface
+ 'urlretrieve', 'urlcleanup', 'URLopener', 'FancyURLopener',
+]
+
# used in User-Agent header sent
__version__ = sys.version[:3]
_opener = None
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
- *, cafile=None, capath=None):
+ *, cafile=None, capath=None, cadefault=False):
global _opener
- if cafile or capath:
+ if cafile or capath or cadefault:
if not _have_ssl:
raise ValueError('SSL support not available')
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.options |= ssl.OP_NO_SSLv2
- if cafile or capath:
+ if cafile or capath or cadefault:
context.verify_mode = ssl.CERT_REQUIRED
- context.load_verify_locations(cafile, capath)
+ if cafile or capath:
+ context.load_verify_locations(cafile, capath)
+ else:
+ context.set_default_verify_paths()
check_hostname = True
else:
check_hostname = False
@@ -142,17 +163,78 @@ def install_opener(opener):
global _opener
_opener = opener
-# TODO(jhylton): Make this work with the same global opener.
-_urlopener = None
+_url_tempfiles = []
def urlretrieve(url, filename=None, reporthook=None, data=None):
- global _urlopener
- if not _urlopener:
- _urlopener = FancyURLopener()
- return _urlopener.retrieve(url, filename, reporthook, data)
+ """
+ Retrieve a URL into a temporary location on disk.
+
+ Requires a URL argument. If a filename is passed, it is used as
+ the temporary file location. The reporthook argument should be
+ a callable that accepts a block number, a read size, and the
+ total file size of the URL target. The data argument should be
+ valid URL encoded data.
+
+ If a filename is passed and the URL points to a local resource,
+ the result is a copy from local file to new file.
+
+ Returns a tuple containing the path to the newly created
+ data file as well as the resulting HTTPMessage object.
+ """
+ url_type, path = splittype(url)
+
+ with contextlib.closing(urlopen(url, data)) as fp:
+ headers = fp.info()
+
+ # Just return the local path and the "headers" for file://
+ # URLs. No sense in performing a copy unless requested.
+ if url_type == "file" and not filename:
+ return os.path.normpath(path), headers
+
+ # Handle temporary file setup.
+ if filename:
+ tfp = open(filename, 'wb')
+ else:
+ tfp = tempfile.NamedTemporaryFile(delete=False)
+ filename = tfp.name
+ _url_tempfiles.append(filename)
+
+ with tfp:
+ result = filename, headers
+ bs = 1024*8
+ size = -1
+ read = 0
+ blocknum = 0
+ if "content-length" in headers:
+ size = int(headers["Content-Length"])
+
+ if reporthook:
+ reporthook(blocknum, bs, size)
+
+ while True:
+ block = fp.read(bs)
+ if not block:
+ break
+ read += len(block)
+ tfp.write(block)
+ blocknum += 1
+ if reporthook:
+ reporthook(blocknum, bs, size)
+
+ if size >= 0 and read < size:
+ raise ContentTooShortError(
+ "retrieval incomplete: got only %i out of %i bytes"
+ % (read, size), result)
+
+ return result
def urlcleanup():
- if _urlopener:
- _urlopener.cleanup()
+ for temp_file in _url_tempfiles:
+ try:
+ os.unlink(temp_file)
+ except EnvironmentError:
+ pass
+
+ del _url_tempfiles[:]
global _opener
if _opener:
_opener = None
@@ -178,7 +260,8 @@ def request_host(request):
class Request:
def __init__(self, url, data=None, headers={},
- origin_req_host=None, unverifiable=False):
+ origin_req_host=None, unverifiable=False,
+ method=None):
# unwrap('<URL:type://host/path>') --> 'type://host/path'
self.full_url = unwrap(url)
self.full_url, self.fragment = splittag(self.full_url)
@@ -192,6 +275,7 @@ class Request:
origin_req_host = request_host(self)
self.origin_req_host = origin_req_host
self.unverifiable = unverifiable
+ self.method = method
self._parse()
def _parse(self):
@@ -203,41 +287,60 @@ class Request:
self.host = unquote(self.host)
def get_method(self):
- if self.data is not None:
+ """Return a string indicating the HTTP request method."""
+ if self.method is not None:
+ return self.method
+ elif self.data is not None:
return "POST"
else:
return "GET"
+ def get_full_url(self):
+ if self.fragment:
+ return '%s#%s' % (self.full_url, self.fragment)
+ else:
+ return self.full_url
+
# Begin deprecated methods
def add_data(self, data):
+ msg = "Request.add_data method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
self.data = data
def has_data(self):
+ msg = "Request.has_data method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.data is not None
def get_data(self):
+ msg = "Request.get_data method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.data
- def get_full_url(self):
- if self.fragment:
- return '%s#%s' % (self.full_url, self.fragment)
- else:
- return self.full_url
-
def get_type(self):
+ msg = "Request.get_type method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.type
def get_host(self):
+ msg = "Request.get_host method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.host
def get_selector(self):
+ msg = "Request.get_selector method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.selector
def is_unverifiable(self):
+ msg = "Request.is_unverifiable method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.unverifiable
def get_origin_req_host(self):
+ msg = "Request.get_origin_req_host method is deprecated."
+ warnings.warn(msg, DeprecationWarning, stacklevel=1)
return self.origin_req_host
# End deprecated methods
@@ -682,8 +785,8 @@ class ProxyHandler(BaseHandler):
self.proxies = proxies
for type, url in proxies.items():
setattr(self, '%s_open' % type,
- lambda r, proxy=url, type=type, meth=self.proxy_open: \
- meth(r, proxy, type))
+ lambda r, proxy=url, type=type, meth=self.proxy_open:
+ meth(r, proxy, type))
def proxy_open(self, req, proxy, type):
orig_type = req.type
@@ -825,17 +928,23 @@ class AbstractBasicAuthHandler:
self.retried += 1
if authreq:
- mo = AbstractBasicAuthHandler.rx.search(authreq)
- if mo:
- scheme, quote, realm = mo.groups()
- if quote not in ["'", '"']:
- warnings.warn("Basic Auth Realm was unquoted",
- UserWarning, 2)
- if scheme.lower() == 'basic':
- response = self.retry_http_basic_auth(host, req, realm)
- if response and response.code != 401:
- self.retried = 0
- return response
+ scheme = authreq.split()[0]
+ if scheme.lower() != 'basic':
+ raise ValueError("AbstractBasicAuthHandler does not"
+ " support the following scheme: '%s'" %
+ scheme)
+ else:
+ mo = AbstractBasicAuthHandler.rx.search(authreq)
+ if mo:
+ scheme, quote, realm = mo.groups()
+ if quote not in ['"',"'"]:
+ warnings.warn("Basic Auth Realm was unquoted",
+ UserWarning, 2)
+ if scheme.lower() == 'basic':
+ response = self.retry_http_basic_auth(host, req, realm)
+ if response and response.code != 401:
+ self.retried = 0
+ return response
def retry_http_basic_auth(self, host, req, realm):
user, pw = self.passwd.find_user_password(realm, host)
@@ -878,9 +987,9 @@ class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
return response
-def randombytes(n):
- """Return n random bytes."""
- return os.urandom(n)
+# Return n random bytes.
+_randombytes = os.urandom
+
class AbstractDigestAuthHandler:
# Digest authentication is specified in RFC 2617.
@@ -921,6 +1030,9 @@ class AbstractDigestAuthHandler:
scheme = authreq.split()[0]
if scheme.lower() == 'digest':
return self.retry_http_digest_auth(req, authreq)
+ elif scheme.lower() != 'basic':
+ raise ValueError("AbstractDigestAuthHandler does not support"
+ " the following scheme: '%s'" % scheme)
def retry_http_digest_auth(self, req, auth):
token, challenge = auth.split(' ', 1)
@@ -941,7 +1053,7 @@ class AbstractDigestAuthHandler:
# authentication, and to provide some message integrity protection.
# This isn't a fabulous effort, but it's probably Good Enough.
s = "%s:%s:%s:" % (self.nonce_count, nonce, time.ctime())
- b = s.encode("ascii") + randombytes(8)
+ b = s.encode("ascii") + _randombytes(8)
dig = hashlib.sha1(b).hexdigest()
return dig[:16]
@@ -1066,7 +1178,7 @@ class AbstractHTTPHandler(BaseHandler):
if request.data is not None: # POST
data = request.data
if isinstance(data, str):
- msg = "POST data should be bytes or an iterable of bytes. "\
+ msg = "POST data should be bytes or an iterable of bytes. " \
"It cannot be of type str."
raise TypeError(msg)
if not request.has_header('Content-type'):
@@ -1162,7 +1274,6 @@ class HTTPHandler(AbstractHTTPHandler):
http_request = AbstractHTTPHandler.do_request_
if hasattr(http.client, 'HTTPSConnection'):
- import ssl
class HTTPSHandler(AbstractHTTPHandler):
@@ -1177,6 +1288,8 @@ if hasattr(http.client, 'HTTPSConnection'):
https_request = AbstractHTTPHandler.do_request_
+ __all__.append('HTTPSHandler')
+
class HTTPCookieProcessor(BaseHandler):
def __init__(self, cookiejar=None):
import http.cookiejar
@@ -1463,6 +1576,9 @@ class URLopener:
# Constructor
def __init__(self, proxies=None, **x509):
+ msg = "%(class)s style of invoking requests is deprecated. " \
+ "Use newer urlopen functions/methods" % {'class': self.__class__.__name__}
+ warnings.warn(msg, DeprecationWarning, stacklevel=3)
if proxies is None:
proxies = getproxies()
assert hasattr(proxies, 'keys'), "proxies must be a mapping"
@@ -1542,6 +1658,8 @@ class URLopener:
return getattr(self, name)(url)
else:
return getattr(self, name)(url, data)
+ except HTTPError:
+ raise
except socket.error as msg:
raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
@@ -1760,8 +1878,8 @@ class URLopener:
def open_local_file(self, url):
"""Use local file."""
- import mimetypes, email.utils
- from io import StringIO
+ import email.utils
+ import mimetypes
host, file = splithost(url)
localname = url2pathname(file)
try:
@@ -1877,7 +1995,7 @@ class URLopener:
msg.append('Content-type: %s' % type)
if encoding == 'base64':
# XXX is this encoding/decoding ok?
- data = base64.decodebytes(data.encode('ascii')).decode('latin1')
+ data = base64.decodebytes(data.encode('ascii')).decode('latin-1')
else:
data = unquote(data)
msg.append('Content-Length: %d' % len(data))
@@ -1970,7 +2088,6 @@ class FancyURLopener(URLopener):
URLopener.http_error_default(self, url, fp,
errcode, errmsg, headers)
stuff = headers['www-authenticate']
- import re
match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff)
if not match:
URLopener.http_error_default(self, url, fp,
@@ -1996,7 +2113,6 @@ class FancyURLopener(URLopener):
URLopener.http_error_default(self, url, fp,
errcode, errmsg, headers)
stuff = headers['proxy-authenticate']
- import re
match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff)
if not match:
URLopener.http_error_default(self, url, fp,
@@ -2282,8 +2398,6 @@ def _proxy_bypass_macosx_sysconf(host, proxy_settings):
'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16']
}
"""
- import re
- import socket
from fnmatch import fnmatch
hostonly, port = splitport(host)
@@ -2386,7 +2500,6 @@ elif os.name == 'nt':
for p in proxyServer.split(';'):
protocol, address = p.split('=', 1)
# See if address has a type:// prefix
- import re
if not re.match('^([^/:]+)://', address):
address = '%s://%s' % (protocol, address)
proxies[protocol] = address
@@ -2418,7 +2531,6 @@ elif os.name == 'nt':
def proxy_bypass_registry(host):
try:
import winreg
- import re
except ImportError:
# Std modules, so should be around - but you never know!
return 0
diff --git a/Lib/urllib/response.py b/Lib/urllib/response.py
index ffaa5fa..1cf1d1a 100644
--- a/Lib/urllib/response.py
+++ b/Lib/urllib/response.py
@@ -37,12 +37,15 @@ class addbase(object):
id(self), self.fp)
def close(self):
+ if self.fp:
+ self.fp.close()
+ self.fp = None
self.read = None
self.readline = None
self.readlines = None
self.fileno = None
- if self.fp: self.fp.close()
- self.fp = None
+ self.__iter__ = None
+ self.__next__ = None
def __enter__(self):
if self.fp is None:
diff --git a/Lib/uuid.py b/Lib/uuid.py
index 5684ad7..0df0743 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -440,7 +440,7 @@ try:
import sys
if sys.platform == 'darwin':
import os
- if int(os.uname()[2].split('.')[0]) >= 9:
+ if int(os.uname().release.split('.')[0]) >= 9:
_uuid_generate_random = _uuid_generate_time = None
# On Windows prior to 2000, UuidCreate gives a UUID containing the
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
new file mode 100644
index 0000000..3c0d7af
--- /dev/null
+++ b/Lib/venv/__init__.py
@@ -0,0 +1,404 @@
+"""
+Virtual environment (venv) package for Python. Based on PEP 405.
+
+Copyright (C) 2011-2012 Vinay Sajip.
+Licensed to the PSF under a contributor agreement.
+
+usage: python -m venv [-h] [--system-site-packages] [--symlinks] [--clear]
+ [--upgrade]
+ ENV_DIR [ENV_DIR ...]
+
+Creates virtual Python environments in one or more target directories.
+
+positional arguments:
+ ENV_DIR A directory to create the environment in.
+
+optional arguments:
+ -h, --help show this help message and exit
+ --system-site-packages
+ Give the virtual environment access to the system
+ site-packages dir.
+ --symlinks Attempt to symlink rather than copy.
+ --clear Delete the environment directory if it already exists.
+ If not specified and the directory exists, an error is
+ raised.
+ --upgrade Upgrade the environment directory to use this version
+ of Python, assuming Python has been upgraded in-place.
+"""
+import base64
+import io
+import logging
+import os
+import os.path
+import shutil
+import sys
+import sysconfig
+try:
+ import threading
+except ImportError:
+ threading = None
+
+logger = logging.getLogger(__name__)
+
+class Context:
+ """
+ Holds information about a current venv creation/upgrade request.
+ """
+ pass
+
+
+class EnvBuilder:
+ """
+ This class exists to allow virtual environment creation to be
+ customised. The constructor parameters determine the builder's
+ behaviour when called upon to create a virtual environment.
+
+ By default, the builder makes the system (global) site-packages dir
+ available to the created environment.
+
+ By default, the creation process uses symlinks wherever possible.
+
+ :param system_site_packages: If True, the system (global) site-packages
+ dir is available to created environments.
+ :param clear: If True and the target directory exists, it is deleted.
+ Otherwise, if the target directory exists, an error is
+ raised.
+ :param symlinks: If True, attempt to symlink rather than copy files into
+ virtual environment.
+ :param upgrade: If True, upgrade an existing virtual environment.
+ """
+
+ def __init__(self, system_site_packages=False, clear=False,
+ symlinks=False, upgrade=False):
+ self.system_site_packages = system_site_packages
+ self.clear = clear
+ self.symlinks = symlinks
+ self.upgrade = upgrade
+
+ def create(self, env_dir):
+ """
+ Create a virtual environment in a directory.
+
+ :param env_dir: The target directory to create an environment in.
+
+ """
+ env_dir = os.path.abspath(env_dir)
+ context = self.ensure_directories(env_dir)
+ self.create_configuration(context)
+ self.setup_python(context)
+ if not self.upgrade:
+ self.setup_scripts(context)
+ self.post_setup(context)
+
+ def ensure_directories(self, env_dir):
+ """
+ Create the directories for the environment.
+
+ Returns a context object which holds paths in the environment,
+ for use by subsequent logic.
+ """
+
+ def create_if_needed(d):
+ if not os.path.exists(d):
+ os.makedirs(d)
+
+ if os.path.exists(env_dir) and not (self.clear or self.upgrade):
+ raise ValueError('Directory exists: %s' % env_dir)
+ if os.path.exists(env_dir) and self.clear:
+ shutil.rmtree(env_dir)
+ context = Context()
+ context.env_dir = env_dir
+ context.env_name = os.path.split(env_dir)[1]
+ context.prompt = '(%s) ' % context.env_name
+ create_if_needed(env_dir)
+ env = os.environ
+ if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
+ executable = os.environ['__PYVENV_LAUNCHER__']
+ else:
+ executable = sys.executable
+ dirname, exename = os.path.split(os.path.abspath(executable))
+ context.executable = executable
+ context.python_dir = dirname
+ context.python_exe = exename
+ if sys.platform == 'win32':
+ binname = 'Scripts'
+ incpath = 'Include'
+ libpath = os.path.join(env_dir, 'Lib', 'site-packages')
+ else:
+ binname = 'bin'
+ incpath = 'include'
+ libpath = os.path.join(env_dir, 'lib', 'python%d.%d' % sys.version_info[:2], 'site-packages')
+ context.inc_path = path = os.path.join(env_dir, incpath)
+ create_if_needed(path)
+ create_if_needed(libpath)
+ context.bin_path = binpath = os.path.join(env_dir, binname)
+ context.bin_name = binname
+ context.env_exe = os.path.join(binpath, exename)
+ create_if_needed(binpath)
+ return context
+
+ def create_configuration(self, context):
+ """
+ Create a configuration file indicating where the environment's Python
+ was copied from, and whether the system site-packages should be made
+ available in the environment.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ context.cfg_path = path = os.path.join(context.env_dir, 'pyvenv.cfg')
+ with open(path, 'w', encoding='utf-8') as f:
+ f.write('home = %s\n' % context.python_dir)
+ if self.system_site_packages:
+ incl = 'true'
+ else:
+ incl = 'false'
+ f.write('include-system-site-packages = %s\n' % incl)
+ f.write('version = %d.%d.%d\n' % sys.version_info[:3])
+
+ if os.name == 'nt':
+ def include_binary(self, f):
+ if f.endswith(('.pyd', '.dll')):
+ result = True
+ else:
+ result = f.startswith('python') and f.endswith('.exe')
+ return result
+
+ def symlink_or_copy(self, src, dst):
+ """
+ Try symlinking a file, and if that fails, fall back to copying.
+ """
+ force_copy = not self.symlinks
+ if not force_copy:
+ try:
+ if not os.path.islink(dst): # can't link to itself!
+ os.symlink(src, dst)
+ except Exception: # may need to use a more specific exception
+ logger.warning('Unable to symlink %r to %r', src, dst)
+ force_copy = True
+ if force_copy:
+ shutil.copyfile(src, dst)
+
+ def setup_python(self, context):
+ """
+ Set up a Python executable in the environment.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ binpath = context.bin_path
+ exename = context.python_exe
+ path = context.env_exe
+ copier = self.symlink_or_copy
+ copier(context.executable, path)
+ dirname = context.python_dir
+ if os.name != 'nt':
+ if not os.path.islink(path):
+ os.chmod(path, 0o755)
+ for suffix in ('python', 'python3'):
+ path = os.path.join(binpath, suffix)
+ if not os.path.exists(path):
+ os.symlink(exename, path)
+ else:
+ subdir = 'DLLs'
+ include = self.include_binary
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ if dst != context.env_exe: # already done, above
+ copier(src, dst)
+ dirname = os.path.join(dirname, subdir)
+ if os.path.isdir(dirname):
+ files = [f for f in os.listdir(dirname) if include(f)]
+ for f in files:
+ src = os.path.join(dirname, f)
+ dst = os.path.join(binpath, f)
+ copier(src, dst)
+ # copy init.tcl over
+ for root, dirs, files in os.walk(context.python_dir):
+ if 'init.tcl' in files:
+ tcldir = os.path.basename(root)
+ tcldir = os.path.join(context.env_dir, 'Lib', tcldir)
+ os.makedirs(tcldir)
+ src = os.path.join(root, 'init.tcl')
+ dst = os.path.join(tcldir, 'init.tcl')
+ shutil.copyfile(src, dst)
+ break
+
+ def setup_scripts(self, context):
+ """
+ Set up scripts into the created environment from a directory.
+
+ This method installs the default scripts into the environment
+ being created. You can prevent the default installation by overriding
+ this method if you really need to, or if you need to specify
+ a different location for the scripts to install. By default, the
+ 'scripts' directory in the venv package is used as the source of
+ scripts to install.
+ """
+ path = os.path.abspath(os.path.dirname(__file__))
+ path = os.path.join(path, 'scripts')
+ self.install_scripts(context, path)
+
+ def post_setup(self, context):
+ """
+ Hook for post-setup modification of the venv. Subclasses may install
+ additional packages or scripts here, add activation shell scripts, etc.
+
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ pass
+
+ def replace_variables(self, text, context):
+ """
+ Replace variable placeholders in script text with context-specific
+ variables.
+
+ Return the text passed in , but with variables replaced.
+
+ :param text: The text in which to replace placeholder variables.
+ :param context: The information for the environment creation request
+ being processed.
+ """
+ text = text.replace('__VENV_DIR__', context.env_dir)
+ text = text.replace('__VENV_NAME__', context.prompt)
+ text = text.replace('__VENV_BIN_NAME__', context.bin_name)
+ text = text.replace('__VENV_PYTHON__', context.env_exe)
+ return text
+
+ def install_scripts(self, context, path):
+ """
+ Install scripts into the created environment from a directory.
+
+ :param context: The information for the environment creation request
+ being processed.
+ :param path: Absolute pathname of a directory containing script.
+ Scripts in the 'common' subdirectory of this directory,
+ and those in the directory named for the platform
+ being run on, are installed in the created environment.
+ Placeholder variables are replaced with environment-
+ specific values.
+ """
+ binpath = context.bin_path
+ plen = len(path)
+ for root, dirs, files in os.walk(path):
+ if root == path: # at top-level, remove irrelevant dirs
+ for d in dirs[:]:
+ if d not in ('common', os.name):
+ dirs.remove(d)
+ continue # ignore files in top level
+ for f in files:
+ srcfile = os.path.join(root, f)
+ suffix = root[plen:].split(os.sep)[2:]
+ if not suffix:
+ dstdir = binpath
+ else:
+ dstdir = os.path.join(binpath, *suffix)
+ if not os.path.exists(dstdir):
+ os.makedirs(dstdir)
+ dstfile = os.path.join(dstdir, f)
+ with open(srcfile, 'rb') as f:
+ data = f.read()
+ if srcfile.endswith('.exe'):
+ mode = 'wb'
+ else:
+ mode = 'w'
+ try:
+ data = data.decode('utf-8')
+ data = self.replace_variables(data, context)
+ except UnicodeDecodeError as e:
+ data = None
+ logger.warning('unable to copy script %r, '
+ 'may be binary: %s', srcfile, e)
+ if data is not None:
+ with open(dstfile, mode) as f:
+ f.write(data)
+ shutil.copymode(srcfile, dstfile)
+
+
+def create(env_dir, system_site_packages=False, clear=False, symlinks=False):
+ """
+ Create a virtual environment in a directory.
+
+ By default, makes the system (global) site-packages dir available to
+ the created environment.
+
+ :param env_dir: The target directory to create an environment in.
+ :param system_site_packages: If True, the system (global) site-packages
+ dir is available to the environment.
+ :param clear: If True and the target directory exists, it is deleted.
+ Otherwise, if the target directory exists, an error is
+ raised.
+ :param symlinks: If True, attempt to symlink rather than copy files into
+ virtual environment.
+ """
+ builder = EnvBuilder(system_site_packages=system_site_packages,
+ clear=clear, symlinks=symlinks)
+ builder.create(env_dir)
+
+def main(args=None):
+ compatible = True
+ if sys.version_info < (3, 3):
+ compatible = False
+ elif not hasattr(sys, 'base_prefix'):
+ compatible = False
+ if not compatible:
+ raise ValueError('This script is only for use with Python 3.3')
+ else:
+ import argparse
+
+ parser = argparse.ArgumentParser(prog=__name__,
+ description='Creates virtual Python '
+ 'environments in one or '
+ 'more target '
+ 'directories.',
+ epilog='Once an environment has been '
+ 'created, you may wish to '
+ 'activate it, e.g. by '
+ 'sourcing an activate script '
+ 'in its bin directory.')
+ parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
+ help='A directory to create the environment in.')
+ parser.add_argument('--system-site-packages', default=False,
+ action='store_true', dest='system_site',
+ help='Give the virtual environment access to the '
+ 'system site-packages dir.')
+ if os.name == 'nt':
+ use_symlinks = False
+ else:
+ use_symlinks = True
+ parser.add_argument('--symlinks', default=use_symlinks,
+ action='store_true', dest='symlinks',
+ help='Try to use symlinks rather than copies, '
+ 'when symlinks are not the default for '
+ 'the platform.')
+ parser.add_argument('--clear', default=False, action='store_true',
+ dest='clear', help='Delete the environment '
+ 'directory if it already '
+ 'exists. If not specified and '
+ 'the directory exists, an error'
+ ' is raised.')
+ parser.add_argument('--upgrade', default=False, action='store_true',
+ dest='upgrade', help='Upgrade the environment '
+ 'directory to use this version '
+ 'of Python, assuming Python '
+ 'has been upgraded in-place.')
+ options = parser.parse_args(args)
+ if options.upgrade and options.clear:
+ raise ValueError('you cannot supply --upgrade and --clear together.')
+ builder = EnvBuilder(system_site_packages=options.system_site,
+ clear=options.clear, symlinks=options.symlinks,
+ upgrade=options.upgrade)
+ for d in options.dirs:
+ builder.create(d)
+
+if __name__ == '__main__':
+ rc = 1
+ try:
+ main()
+ rc = 0
+ except Exception as e:
+ print('Error: %s' % e, file=sys.stderr)
+ sys.exit(rc)
diff --git a/Lib/venv/__main__.py b/Lib/venv/__main__.py
new file mode 100644
index 0000000..912423e
--- /dev/null
+++ b/Lib/venv/__main__.py
@@ -0,0 +1,10 @@
+import sys
+from . import main
+
+rc = 1
+try:
+ main()
+ rc = 0
+except Exception as e:
+ print('Error: %s' % e, file=sys.stderr)
+sys.exit(rc)
diff --git a/Lib/venv/scripts/nt/Activate.ps1 b/Lib/venv/scripts/nt/Activate.ps1
new file mode 100644
index 0000000..1c5ef98
--- /dev/null
+++ b/Lib/venv/scripts/nt/Activate.ps1
@@ -0,0 +1,34 @@
+$env:VIRTUAL_ENV="__VENV_DIR__"
+
+# Revert to original values
+if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
+ copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
+ remove-item function:_OLD_VIRTUAL_PROMPT
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
+ copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
+ remove-item env:_OLD_VIRTUAL_PYTHONHOME
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PATH) {
+ copy-item env:_OLD_VIRTUAL_PATH env:PATH
+ remove-item env:_OLD_VIRTUAL_PATH
+}
+
+# Set the prompt to include the env name
+copy-item function:prompt function:_OLD_VIRTUAL_PROMPT
+function prompt {
+ Write-Host -NoNewline -ForegroundColor Green '[__VENV_NAME__]'
+ _OLD_VIRTUAL_PROMPT
+}
+
+# Clear PYTHONHOME
+if (Test-Path env:PYTHONHOME) {
+ copy-item env:PYTHONHOME env:_OLD_VIRTUAL_PYTHONHOME
+ remove-item env:PYTHONHOME
+}
+
+# Add the venv to the PATH
+copy-item env:PATH env:_OLD_VIRTUAL_PATH
+$env:PATH = "$env:VIRTUAL_ENV\__VENV_BIN_NAME__;$env:PATH"
diff --git a/Lib/venv/scripts/nt/Deactivate.ps1 b/Lib/venv/scripts/nt/Deactivate.ps1
new file mode 100644
index 0000000..3d1e96b
--- /dev/null
+++ b/Lib/venv/scripts/nt/Deactivate.ps1
@@ -0,0 +1,19 @@
+# Revert to original values
+if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
+ copy-item function:_OLD_VIRTUAL_PROMPT function:prompt
+ remove-item function:_OLD_VIRTUAL_PROMPT
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) {
+ copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME
+ remove-item env:_OLD_VIRTUAL_PYTHONHOME
+}
+
+if (Test-Path env:_OLD_VIRTUAL_PATH) {
+ copy-item env:_OLD_VIRTUAL_PATH env:PATH
+ remove-item env:_OLD_VIRTUAL_PATH
+}
+
+if (Test-Path env:VIRTUAL_ENV) {
+ remove-item env:VIRTUAL_ENV
+}
diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat
new file mode 100644
index 0000000..c45e65a
--- /dev/null
+++ b/Lib/venv/scripts/nt/activate.bat
@@ -0,0 +1,31 @@
+@echo off
+set VIRTUAL_ENV=__VENV_DIR__
+
+if not defined PROMPT (
+ set PROMPT=$P$G
+)
+
+if defined _OLD_VIRTUAL_PROMPT (
+ set PROMPT=%_OLD_VIRTUAL_PROMPT%
+)
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+ set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+)
+
+set _OLD_VIRTUAL_PROMPT=%PROMPT%
+set PROMPT=__VENV_NAME__%PROMPT%
+
+if defined PYTHONHOME (
+ set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
+ set PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%; goto SKIPPATH
+
+set _OLD_VIRTUAL_PATH=%PATH%
+
+:SKIPPATH
+set PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%
+
+:END
diff --git a/Lib/venv/scripts/nt/deactivate.bat b/Lib/venv/scripts/nt/deactivate.bat
new file mode 100644
index 0000000..62da5b1
--- /dev/null
+++ b/Lib/venv/scripts/nt/deactivate.bat
@@ -0,0 +1,17 @@
+@echo off
+
+if defined _OLD_VIRTUAL_PROMPT (
+ set PROMPT=%_OLD_VIRTUAL_PROMPT%
+)
+set _OLD_VIRTUAL_PROMPT=
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+ set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+ set _OLD_VIRTUAL_PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
+
+set _OLD_VIRTUAL_PATH=
+
+:END
diff --git a/Lib/venv/scripts/nt/pydoc.py b/Lib/venv/scripts/nt/pydoc.py
new file mode 100644
index 0000000..dbf2db7
--- /dev/null
+++ b/Lib/venv/scripts/nt/pydoc.py
@@ -0,0 +1,4 @@
+#!__VENV_PYTHON__
+if __name__ == '__main__':
+ import sys, pydoc
+ sys.exit(pydoc.cli())
diff --git a/Lib/venv/scripts/posix/activate b/Lib/venv/scripts/posix/activate
new file mode 100644
index 0000000..c241450
--- /dev/null
+++ b/Lib/venv/scripts/posix/activate
@@ -0,0 +1,76 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+ # reset old environment variables
+ if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
+ PATH="$_OLD_VIRTUAL_PATH"
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ fi
+ if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
+ PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
+ export PYTHONHOME
+ unset _OLD_VIRTUAL_PYTHONHOME
+ fi
+
+ # This should detect bash and zsh, which have a hash command that must
+ # be called to get it to forget past commands. Without forgetting
+ # past commands the $PATH changes we made may not be respected
+ if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+ hash -r
+ fi
+
+ if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
+ PS1="$_OLD_VIRTUAL_PS1"
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ fi
+
+ unset VIRTUAL_ENV
+ if [ ! "$1" = "nondestructive" ] ; then
+ # Self destruct!
+ unset -f deactivate
+ fi
+}
+
+# unset irrelavent variables
+deactivate nondestructive
+
+VIRTUAL_ENV="__VENV_DIR__"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "$PYTHONHOME" ] ; then
+ _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
+ unset PYTHONHOME
+fi
+
+if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
+ _OLD_VIRTUAL_PS1="$PS1"
+ if [ "x__VENV_NAME__" != x ] ; then
+ PS1="__VENV_NAME__$PS1"
+ else
+ if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
+ # special case for Aspen magic directories
+ # see http://www.zetadev.com/software/aspen/
+ PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
+ else
+ PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
+ fi
+ fi
+ export PS1
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands. Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+ hash -r
+fi
diff --git a/Lib/venv/scripts/posix/pydoc b/Lib/venv/scripts/posix/pydoc
new file mode 100755
index 0000000..9233771
--- /dev/null
+++ b/Lib/venv/scripts/posix/pydoc
@@ -0,0 +1,5 @@
+#!__VENV_PYTHON__
+if __name__ == '__main__':
+ import sys, pydoc
+ sys.exit(pydoc.cli())
+
diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py
index 202f34a..94d4ad4 100644
--- a/Lib/webbrowser.py
+++ b/Lib/webbrowser.py
@@ -230,7 +230,7 @@ class UnixBrowser(BaseBrowser):
cmdline = [self.name] + raise_opt + args
if remote or self.background:
- inout = io.open(os.devnull, "r+")
+ inout = subprocess.DEVNULL
else:
# for TTY browsers, we need stdin/out
inout = None
@@ -238,17 +238,14 @@ class UnixBrowser(BaseBrowser):
stdout=(self.redirect_stdout and inout or None),
stderr=inout, start_new_session=True)
if remote:
- # wait five seconds. If the subprocess is not finished, the
+ # wait at most five seconds. If the subprocess is not finished, the
# remote invocation has (hopefully) started a new instance.
- time.sleep(1)
- rc = p.poll()
- if rc is None:
- time.sleep(4)
- rc = p.poll()
- if rc is None:
- return True
- # if remote call failed, open() will try direct invocation
- return not rc
+ try:
+ rc = p.wait(5)
+ # if remote call failed, open() will try direct invocation
+ return not rc
+ except subprocess.TimeoutExpired:
+ return True
elif self.background:
if p.poll() is None:
return True
@@ -306,6 +303,18 @@ class Galeon(UnixBrowser):
background = True
+class Chrome(UnixBrowser):
+ "Launcher class for Google Chrome browser."
+
+ remote_args = ['%action', '%s']
+ remote_action = ""
+ remote_action_newwin = "--new-window"
+ remote_action_newtab = ""
+ background = True
+
+Chromium = Chrome
+
+
class Opera(UnixBrowser):
"Launcher class for Opera browser."
@@ -345,7 +354,7 @@ class Konqueror(BaseBrowser):
else:
action = "openURL"
- devnull = io.open(os.devnull, "r+")
+ devnull = subprocess.DEVNULL
# if possible, put browser in separate process group, so
# keyboard interrupts don't affect browser as well as Python
setsid = getattr(os, 'setsid', None)
@@ -443,6 +452,14 @@ class Grail(BaseBrowser):
def register_X_browsers():
+ # use xdg-open if around
+ if _iscommand("xdg-open"):
+ register("xdg-open", None, BackgroundBrowser("xdg-open"))
+
+ # The default GNOME3 browser
+ if "GNOME_DESKTOP_SESSION_ID" in os.environ and _iscommand("gvfs-open"):
+ register("gvfs-open", None, BackgroundBrowser("gvfs-open"))
+
# The default GNOME browser
if "GNOME_DESKTOP_SESSION_ID" in os.environ and _iscommand("gnome-open"):
register("gnome-open", None, BackgroundBrowser("gnome-open"))
@@ -473,6 +490,11 @@ def register_X_browsers():
if _iscommand("skipstone"):
register("skipstone", None, BackgroundBrowser("skipstone"))
+ # Google Chrome/Chromium browsers
+ for browser in ("google-chrome", "chrome", "chromium", "chromium-browser"):
+ if _iscommand(browser):
+ register(browser, None, Chrome(browser))
+
# Opera, quite popular
if _iscommand("opera"):
register("opera", None, Opera("opera"))
diff --git a/Lib/wsgiref.egg-info b/Lib/wsgiref.egg-info
deleted file mode 100644
index c0b7893..0000000
--- a/Lib/wsgiref.egg-info
+++ /dev/null
@@ -1,8 +0,0 @@
-Metadata-Version: 1.0
-Name: wsgiref
-Version: 0.1.2
-Summary: WSGI (PEP 333) Reference Library
-Author: Phillip J. Eby
-Author-email: web-sig@python.org
-License: PSF or ZPL
-Platform: UNKNOWN
diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py
index af82f95..a6015fb 100644
--- a/Lib/wsgiref/simple_server.py
+++ b/Lib/wsgiref/simple_server.py
@@ -14,13 +14,14 @@ from http.server import BaseHTTPRequestHandler, HTTPServer
import sys
import urllib.parse
from wsgiref.handlers import SimpleHandler
+from platform import python_implementation
__version__ = "0.2"
__all__ = ['WSGIServer', 'WSGIRequestHandler', 'demo_app', 'make_server']
server_version = "WSGIServer/" + __version__
-sys_version = "Python/" + sys.version.split()[0]
+sys_version = python_implementation() + "/" + sys.version.split()[0]
software_version = server_version + ' ' + sys_version
diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py
index 2963915..c05cf87 100644
--- a/Lib/xdrlib.py
+++ b/Lib/xdrlib.py
@@ -141,11 +141,7 @@ class Unpacker:
data = self.__buf[i:j]
if len(data) < 4:
raise EOFError
- x = struct.unpack('>L', data)[0]
- try:
- return int(x)
- except OverflowError:
- return x
+ return struct.unpack('>L', data)[0]
def unpack_int(self):
i = self.__pos
diff --git a/Lib/xml/dom/__init__.py b/Lib/xml/dom/__init__.py
index 4401bdf..97cf9a6 100644
--- a/Lib/xml/dom/__init__.py
+++ b/Lib/xml/dom/__init__.py
@@ -17,6 +17,7 @@ pulldom -- DOM builder supporting on-demand tree-building for selected
class Node:
"""Class giving the NodeType constants."""
+ __slots__ = ()
# DOM implementations may use this as a base class for their own
# Node implementations. If they don't, the constants defined here
diff --git a/Lib/xml/dom/domreg.py b/Lib/xml/dom/domreg.py
index cb35bb0..8c3d901 100644
--- a/Lib/xml/dom/domreg.py
+++ b/Lib/xml/dom/domreg.py
@@ -2,8 +2,6 @@
directly. Instead, the functions getDOMImplementation and
registerDOMImplementation should be imported from xml.dom."""
-from xml.dom.minicompat import * # isinstance, StringTypes
-
# This is a list of well-known implementations. Well-known names
# should be published by posting to xml-sig@python.org, and are
# subsequently recorded in this file.
diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py
index a98fe03..f074ab9 100644
--- a/Lib/xml/dom/expatbuilder.py
+++ b/Lib/xml/dom/expatbuilder.py
@@ -33,8 +33,6 @@ from xml.parsers import expat
from xml.dom.minidom import _append_child, _set_attribute_node
from xml.dom.NodeFilter import NodeFilter
-from xml.dom.minicompat import *
-
TEXT_NODE = Node.TEXT_NODE
CDATA_SECTION_NODE = Node.CDATA_SECTION_NODE
DOCUMENT_NODE = Node.DOCUMENT_NODE
@@ -283,27 +281,23 @@ class ExpatBuilder:
elif childNodes and childNodes[-1].nodeType == TEXT_NODE:
node = childNodes[-1]
value = node.data + data
- d = node.__dict__
- d['data'] = d['nodeValue'] = value
+ node.data = value
return
else:
node = minidom.Text()
- d = node.__dict__
- d['data'] = d['nodeValue'] = data
- d['ownerDocument'] = self.document
+ node.data = data
+ node.ownerDocument = self.document
_append_child(self.curNode, node)
def character_data_handler(self, data):
childNodes = self.curNode.childNodes
if childNodes and childNodes[-1].nodeType == TEXT_NODE:
node = childNodes[-1]
- d = node.__dict__
- d['data'] = d['nodeValue'] = node.data + data
+ node.data = node.data + data
return
node = minidom.Text()
- d = node.__dict__
- d['data'] = d['nodeValue'] = node.data + data
- d['ownerDocument'] = self.document
+ node.data = node.data + data
+ node.ownerDocument = self.document
_append_child(self.curNode, node)
def entity_decl_handler(self, entityName, is_parameter_entity, value,
@@ -363,11 +357,8 @@ class ExpatBuilder:
a = minidom.Attr(attributes[i], EMPTY_NAMESPACE,
None, EMPTY_PREFIX)
value = attributes[i+1]
- d = a.childNodes[0].__dict__
- d['data'] = d['nodeValue'] = value
- d = a.__dict__
- d['value'] = d['nodeValue'] = value
- d['ownerDocument'] = self.document
+ a.value = value
+ a.ownerDocument = self.document
_set_attribute_node(node, a)
if node is not self.document.documentElement:
@@ -761,15 +752,13 @@ class Namespaces:
else:
a = minidom.Attr("xmlns", XMLNS_NAMESPACE,
"xmlns", EMPTY_PREFIX)
- d = a.childNodes[0].__dict__
- d['data'] = d['nodeValue'] = uri
- d = a.__dict__
- d['value'] = d['nodeValue'] = uri
- d['ownerDocument'] = self.document
+ a.value = uri
+ a.ownerDocument = self.document
_set_attribute_node(node, a)
del self._ns_ordered_prefixes[:]
if attributes:
+ node._ensure_attributes()
_attrs = node._attrs
_attrsNS = node._attrsNS
for i in range(0, len(attributes), 2):
@@ -785,12 +774,9 @@ class Namespaces:
aname, EMPTY_PREFIX)
_attrs[aname] = a
_attrsNS[(EMPTY_NAMESPACE, aname)] = a
- d = a.childNodes[0].__dict__
- d['data'] = d['nodeValue'] = value
- d = a.__dict__
- d['ownerDocument'] = self.document
- d['value'] = d['nodeValue'] = value
- d['ownerElement'] = node
+ a.ownerDocument = self.document
+ a.value = value
+ a.ownerElement = node
if __debug__:
# This only adds some asserts to the original
diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py
index f23ad05..28e5030 100644
--- a/Lib/xml/dom/minidom.py
+++ b/Lib/xml/dom/minidom.py
@@ -14,7 +14,6 @@ Todo:
* SAX 2 namespaces
"""
-import codecs
import io
import xml.dom
@@ -47,25 +46,25 @@ class Node(xml.dom.Node):
return self.toprettyxml("", "", encoding)
def toprettyxml(self, indent="\t", newl="\n", encoding=None):
- # indent = the indentation string to prepend, per level
- # newl = the newline string to append
- use_encoding = "utf-8" if encoding is None else encoding
- writer = codecs.getwriter(use_encoding)(io.BytesIO())
+ if encoding is None:
+ writer = io.StringIO()
+ else:
+ writer = io.TextIOWrapper(io.BytesIO(),
+ encoding=encoding,
+ errors="xmlcharrefreplace",
+ newline='\n')
if self.nodeType == Node.DOCUMENT_NODE:
# Can pass encoding only to document, to put it into XML header
self.writexml(writer, "", indent, newl, encoding)
else:
self.writexml(writer, "", indent, newl)
if encoding is None:
- return writer.stream.getvalue().decode(use_encoding)
+ return writer.getvalue()
else:
- return writer.stream.getvalue()
+ return writer.detach().getvalue()
def hasChildNodes(self):
- if self.childNodes:
- return True
- else:
- return False
+ return bool(self.childNodes)
def _get_childNodes(self):
return self.childNodes
@@ -286,10 +285,10 @@ def _append_child(self, node):
childNodes = self.childNodes
if childNodes:
last = childNodes[-1]
- node.__dict__["previousSibling"] = last
- last.__dict__["nextSibling"] = node
+ node.previousSibling = last
+ last.nextSibling = node
childNodes.append(node)
- node.__dict__["parentNode"] = self
+ node.parentNode = self
def _in_document(node):
# return True iff node is part of a document tree
@@ -342,9 +341,10 @@ class DocumentFragment(Node):
class Attr(Node):
+ __slots__=('_name', '_value', 'namespaceURI',
+ '_prefix', 'childNodes', '_localName', 'ownerDocument', 'ownerElement')
nodeType = Node.ATTRIBUTE_NODE
attributes = None
- ownerElement = None
specified = False
_is_id = False
@@ -352,12 +352,11 @@ class Attr(Node):
def __init__(self, qName, namespaceURI=EMPTY_NAMESPACE, localName=None,
prefix=None):
- # skip setattr for performance
- d = self.__dict__
- d["nodeName"] = d["name"] = qName
- d["namespaceURI"] = namespaceURI
- d["prefix"] = prefix
- d['childNodes'] = NodeList()
+ self.ownerElement = None
+ self._name = qName
+ self.namespaceURI = namespaceURI
+ self._prefix = prefix
+ self.childNodes = NodeList()
# Add the single child node that represents the value of the attr
self.childNodes.append(Text())
@@ -365,9 +364,10 @@ class Attr(Node):
# nodeValue and value are set elsewhere
def _get_localName(self):
- if 'localName' in self.__dict__:
- return self.__dict__['localName']
- return self.nodeName.split(":", 1)[-1]
+ try:
+ return self._localName
+ except AttributeError:
+ return self.nodeName.split(":", 1)[-1]
def _get_name(self):
return self.name
@@ -375,20 +375,30 @@ class Attr(Node):
def _get_specified(self):
return self.specified
- def __setattr__(self, name, value):
- d = self.__dict__
- if name in ("value", "nodeValue"):
- d["value"] = d["nodeValue"] = value
- d2 = self.childNodes[0].__dict__
- d2["data"] = d2["nodeValue"] = value
- if self.ownerElement is not None:
- _clear_id_cache(self.ownerElement)
- elif name in ("name", "nodeName"):
- d["name"] = d["nodeName"] = value
- if self.ownerElement is not None:
- _clear_id_cache(self.ownerElement)
- else:
- d[name] = value
+ def _get_name(self):
+ return self._name
+
+ def _set_name(self, value):
+ self._name = value
+ if self.ownerElement is not None:
+ _clear_id_cache(self.ownerElement)
+
+ nodeName = name = property(_get_name, _set_name)
+
+ def _get_value(self):
+ return self._value
+
+ def _set_value(self, value):
+ self._value = value
+ self.childNodes[0].data = value
+ if self.ownerElement is not None:
+ _clear_id_cache(self.ownerElement)
+ self.childNodes[0].data = value
+
+ nodeValue = value = property(_get_value, _set_value)
+
+ def _get_prefix(self):
+ return self._prefix
def _set_prefix(self, prefix):
nsuri = self.namespaceURI
@@ -396,22 +406,16 @@ class Attr(Node):
if nsuri and nsuri != XMLNS_NAMESPACE:
raise xml.dom.NamespaceErr(
"illegal use of 'xmlns' prefix for the wrong namespace")
- d = self.__dict__
- d['prefix'] = prefix
+ self._prefix = prefix
if prefix is None:
newName = self.localName
else:
newName = "%s:%s" % (prefix, self.localName)
if self.ownerElement:
_clear_id_cache(self.ownerElement)
- d['nodeName'] = d['name'] = newName
+ self.name = newName
- def _set_value(self, value):
- d = self.__dict__
- d['value'] = d['nodeValue'] = value
- if self.ownerElement:
- _clear_id_cache(self.ownerElement)
- self.childNodes[0].data = value
+ prefix = property(_get_prefix, _set_prefix)
def unlink(self):
# This implementation does not call the base implementation
@@ -586,8 +590,8 @@ class NamedNodeMap(object):
_clear_id_cache(self._ownerElement)
del self._attrs[n.nodeName]
del self._attrsNS[(n.namespaceURI, n.localName)]
- if 'ownerElement' in n.__dict__:
- n.__dict__['ownerElement'] = None
+ if hasattr(n, 'ownerElement'):
+ n.ownerElement = None
return n
else:
raise xml.dom.NotFoundErr()
@@ -598,8 +602,8 @@ class NamedNodeMap(object):
_clear_id_cache(self._ownerElement)
del self._attrsNS[(n.namespaceURI, n.localName)]
del self._attrs[n.nodeName]
- if 'ownerElement' in n.__dict__:
- n.__dict__['ownerElement'] = None
+ if hasattr(n, 'ownerElement'):
+ n.ownerElement = None
return n
else:
raise xml.dom.NotFoundErr()
@@ -659,6 +663,9 @@ class TypeInfo(object):
_no_type = TypeInfo(None, None)
class Element(Node):
+ __slots__=('ownerDocument', 'parentNode', 'tagName', 'nodeName', 'prefix',
+ 'namespaceURI', '_localName', 'childNodes', '_attrs', '_attrsNS',
+ 'nextSibling', 'previousSibling')
nodeType = Node.ELEMENT_NODE
nodeValue = None
schemaType = _no_type
@@ -674,41 +681,57 @@ class Element(Node):
def __init__(self, tagName, namespaceURI=EMPTY_NAMESPACE, prefix=None,
localName=None):
+ self.parentNode = None
self.tagName = self.nodeName = tagName
self.prefix = prefix
self.namespaceURI = namespaceURI
self.childNodes = NodeList()
+ self.nextSibling = self.previousSibling = None
+
+ # Attribute dictionaries are lazily created
+ # attributes are double-indexed:
+ # tagName -> Attribute
+ # URI,localName -> Attribute
+ # in the future: consider lazy generation
+ # of attribute objects this is too tricky
+ # for now because of headaches with
+ # namespaces.
+ self._attrs = None
+ self._attrsNS = None
- self._attrs = {} # attributes are double-indexed:
- self._attrsNS = {} # tagName -> Attribute
- # URI,localName -> Attribute
- # in the future: consider lazy generation
- # of attribute objects this is too tricky
- # for now because of headaches with
- # namespaces.
+ def _ensure_attributes(self):
+ if self._attrs is None:
+ self._attrs = {}
+ self._attrsNS = {}
def _get_localName(self):
- if 'localName' in self.__dict__:
- return self.__dict__['localName']
- return self.tagName.split(":", 1)[-1]
+ try:
+ return self._localName
+ except AttributeError:
+ return self.tagName.split(":", 1)[-1]
def _get_tagName(self):
return self.tagName
def unlink(self):
- for attr in list(self._attrs.values()):
- attr.unlink()
+ if self._attrs is not None:
+ for attr in list(self._attrs.values()):
+ attr.unlink()
self._attrs = None
self._attrsNS = None
Node.unlink(self)
def getAttribute(self, attname):
+ if self._attrs is None:
+ return ""
try:
return self._attrs[attname].value
except KeyError:
return ""
def getAttributeNS(self, namespaceURI, localName):
+ if self._attrsNS is None:
+ return ""
try:
return self._attrsNS[(namespaceURI, localName)].value
except KeyError:
@@ -718,14 +741,11 @@ class Element(Node):
attr = self.getAttributeNode(attname)
if attr is None:
attr = Attr(attname)
- # for performance
- d = attr.__dict__
- d["value"] = d["nodeValue"] = value
- d["ownerDocument"] = self.ownerDocument
+ attr.value = value # also sets nodeValue
+ attr.ownerDocument = self.ownerDocument
self.setAttributeNode(attr)
elif value != attr.value:
- d = attr.__dict__
- d["value"] = d["nodeValue"] = value
+ attr.value = value
if attr.isId:
_clear_id_cache(self)
@@ -733,33 +753,33 @@ class Element(Node):
prefix, localname = _nssplit(qualifiedName)
attr = self.getAttributeNodeNS(namespaceURI, localname)
if attr is None:
- # for performance
attr = Attr(qualifiedName, namespaceURI, localname, prefix)
- d = attr.__dict__
- d["prefix"] = prefix
- d["nodeName"] = qualifiedName
- d["value"] = d["nodeValue"] = value
- d["ownerDocument"] = self.ownerDocument
+ attr.value = value
+ attr.ownerDocument = self.ownerDocument
self.setAttributeNode(attr)
else:
- d = attr.__dict__
if value != attr.value:
- d["value"] = d["nodeValue"] = value
+ attr.value = value
if attr.isId:
_clear_id_cache(self)
if attr.prefix != prefix:
- d["prefix"] = prefix
- d["nodeName"] = qualifiedName
+ attr.prefix = prefix
+ attr.nodeName = qualifiedName
def getAttributeNode(self, attrname):
+ if self._attrs is None:
+ return None
return self._attrs.get(attrname)
def getAttributeNodeNS(self, namespaceURI, localName):
+ if self._attrsNS is None:
+ return None
return self._attrsNS.get((namespaceURI, localName))
def setAttributeNode(self, attr):
if attr.ownerElement not in (None, self):
raise xml.dom.InuseAttributeErr("attribute node already owned")
+ self._ensure_attributes()
old1 = self._attrs.get(attr.name, None)
if old1 is not None:
self.removeAttributeNode(old1)
@@ -778,6 +798,8 @@ class Element(Node):
setAttributeNodeNS = setAttributeNode
def removeAttribute(self, name):
+ if self._attrsNS is None:
+ raise xml.dom.NotFoundErr()
try:
attr = self._attrs[name]
except KeyError:
@@ -785,6 +807,8 @@ class Element(Node):
self.removeAttributeNode(attr)
def removeAttributeNS(self, namespaceURI, localName):
+ if self._attrsNS is None:
+ raise xml.dom.NotFoundErr()
try:
attr = self._attrsNS[(namespaceURI, localName)]
except KeyError:
@@ -807,9 +831,13 @@ class Element(Node):
removeAttributeNodeNS = removeAttributeNode
def hasAttribute(self, name):
+ if self._attrs is None:
+ return False
return name in self._attrs
def hasAttributeNS(self, namespaceURI, localName):
+ if self._attrsNS is None:
+ return False
return (namespaceURI, localName) in self._attrsNS
def getElementsByTagName(self, name):
@@ -850,6 +878,7 @@ class Element(Node):
writer.write("/>%s"%(newl))
def _get_attributes(self):
+ self._ensure_attributes()
return NamedNodeMap(self._attrs, self._attrsNS, self)
def hasAttributes(self):
@@ -874,7 +903,7 @@ class Element(Node):
if _get_containing_entref(self) is not None:
raise xml.dom.NoModificationAllowedErr()
if not idAttr._is_id:
- idAttr.__dict__['_is_id'] = True
+ idAttr._is_id = True
self._magic_id_nodes += 1
self.ownerDocument._magic_id_count += 1
_clear_id_cache(self)
@@ -887,19 +916,20 @@ defproperty(Element, "localName",
def _set_attribute_node(element, attr):
_clear_id_cache(element)
+ element._ensure_attributes()
element._attrs[attr.name] = attr
element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
# This creates a circular reference, but Element.unlink()
# breaks the cycle since the references to the attribute
# dictionaries are tossed.
- attr.__dict__['ownerElement'] = element
-
+ attr.ownerElement = element
class Childless:
"""Mixin that makes childless-ness easy to implement and avoids
the complexity of the Node methods that deal with children.
"""
+ __slots__ = ()
attributes = None
childNodes = EmptyNodeList()
@@ -938,54 +968,49 @@ class Childless:
class ProcessingInstruction(Childless, Node):
nodeType = Node.PROCESSING_INSTRUCTION_NODE
+ __slots__ = ('target', 'data')
def __init__(self, target, data):
- self.target = self.nodeName = target
- self.data = self.nodeValue = data
+ self.target = target
+ self.data = data
- def _get_data(self):
+ # nodeValue is an alias for data
+ def _get_nodeValue(self):
return self.data
- def _set_data(self, value):
- d = self.__dict__
- d['data'] = d['nodeValue'] = value
+ def _set_nodeValue(self, value):
+ self.data = data
+ nodeValue = property(_get_nodeValue, _set_nodeValue)
- def _get_target(self):
+ # nodeName is an alias for target
+ def _get_nodeName(self):
return self.target
- def _set_target(self, value):
- d = self.__dict__
- d['target'] = d['nodeName'] = value
-
- def __setattr__(self, name, value):
- if name == "data" or name == "nodeValue":
- self.__dict__['data'] = self.__dict__['nodeValue'] = value
- elif name == "target" or name == "nodeName":
- self.__dict__['target'] = self.__dict__['nodeName'] = value
- else:
- self.__dict__[name] = value
+ def _set_nodeName(self, value):
+ self.target = value
+ nodeName = property(_get_nodeName, _set_nodeName)
def writexml(self, writer, indent="", addindent="", newl=""):
writer.write("%s<?%s %s?>%s" % (indent,self.target, self.data, newl))
class CharacterData(Childless, Node):
+ __slots__=('_data', 'ownerDocument','parentNode', 'previousSibling', 'nextSibling')
+
+ def __init__(self):
+ self.ownerDocument = self.parentNode = None
+ self.previousSibling = self.nextSibling = None
+ self._data = ''
+ Node.__init__(self)
+
def _get_length(self):
return len(self.data)
__len__ = _get_length
def _get_data(self):
- return self.__dict__['data']
+ return self._data
def _set_data(self, data):
- d = self.__dict__
- d['data'] = d['nodeValue'] = data
-
- _get_nodeValue = _get_data
- _set_nodeValue = _set_data
+ self._data = data
- def __setattr__(self, name, value):
- if name == "data" or name == "nodeValue":
- self.__dict__['data'] = self.__dict__['nodeValue'] = value
- else:
- self.__dict__[name] = value
+ data = nodeValue = property(_get_data, _set_data)
def __repr__(self):
data = self.data
@@ -1042,10 +1067,7 @@ defproperty(CharacterData, "length", doc="Length of the string data.")
class Text(CharacterData):
- # Make sure we don't add an instance __dict__ if we don't already
- # have one, at least when that's possible:
- # XXX this does not work, CharacterData is an old-style class
- # __slots__ = ()
+ __slots__ = ()
nodeType = Node.TEXT_NODE
nodeName = "#text"
@@ -1112,9 +1134,7 @@ class Text(CharacterData):
else:
break
if content:
- d = self.__dict__
- d['data'] = content
- d['nodeValue'] = content
+ self.data = content
return self
else:
return None
@@ -1160,7 +1180,8 @@ class Comment(CharacterData):
nodeName = "#comment"
def __init__(self, data):
- self.data = self.nodeValue = data
+ CharacterData.__init__(self)
+ self._data = data
def writexml(self, writer, indent="", addindent="", newl=""):
if "--" in self.data:
@@ -1169,10 +1190,7 @@ class Comment(CharacterData):
class CDATASection(Text):
- # Make sure we don't add an instance __dict__ if we don't already
- # have one, at least when that's possible:
- # XXX this does not work, Text is an old-style class
- # __slots__ = ()
+ __slots__ = ()
nodeType = Node.CDATA_SECTION_NODE
nodeName = "#cdata-section"
@@ -1252,8 +1270,7 @@ defproperty(ReadOnlySequentialNamedNodeMap, "length",
class Identified:
"""Mix-in class that supports the publicId and systemId attributes."""
- # XXX this does not work, this is an old-style class
- # __slots__ = 'publicId', 'systemId'
+ __slots__ = 'publicId', 'systemId'
def _identified_mixin_init(self, publicId, systemId):
self.publicId = publicId
@@ -1504,18 +1521,19 @@ def _clear_id_cache(node):
node.ownerDocument._id_search_stack= None
class Document(Node, DocumentLS):
+ __slots__ = ('_elem_info', 'doctype',
+ '_id_search_stack', 'childNodes', '_id_cache')
_child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE,
Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
+ implementation = DOMImplementation()
nodeType = Node.DOCUMENT_NODE
nodeName = "#document"
nodeValue = None
attributes = None
- doctype = None
parentNode = None
previousSibling = nextSibling = None
- implementation = DOMImplementation()
# Document attributes from Level 3 (WD 9 April 2002)
@@ -1530,6 +1548,7 @@ class Document(Node, DocumentLS):
_magic_id_count = 0
def __init__(self):
+ self.doctype = None
self.childNodes = NodeList()
# mapping of (namespaceURI, localName) -> ElementInfo
# and tagName -> ElementInfo
@@ -1771,12 +1790,12 @@ class Document(Node, DocumentLS):
raise xml.dom.NotSupportedErr("cannot import document type nodes")
return _clone_node(node, deep, self)
- def writexml(self, writer, indent="", addindent="", newl="",
- encoding = None):
+ def writexml(self, writer, indent="", addindent="", newl="", encoding=None):
if encoding is None:
writer.write('<?xml version="1.0" ?>'+newl)
else:
- writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
+ writer.write('<?xml version="1.0" encoding="%s"?>%s' % (
+ encoding, newl))
for node in self.childNodes:
node.writexml(writer, indent, addindent, newl)
@@ -1815,17 +1834,15 @@ class Document(Node, DocumentLS):
element.removeAttributeNode(n)
else:
element = None
- # avoid __setattr__
- d = n.__dict__
- d['prefix'] = prefix
- d['localName'] = localName
- d['namespaceURI'] = namespaceURI
- d['nodeName'] = name
+ n.prefix = prefix
+ n._localName = localName
+ n.namespaceURI = namespaceURI
+ n.nodeName = name
if n.nodeType == Node.ELEMENT_NODE:
- d['tagName'] = name
+ n.tagName = name
else:
# attribute node
- d['name'] = name
+ n.name = name
if element is not None:
element.setAttributeNode(n)
if is_id:
diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py
index d5ac8b2..43504f7 100644
--- a/Lib/xml/dom/pulldom.py
+++ b/Lib/xml/dom/pulldom.py
@@ -1,6 +1,5 @@
import xml.sax
import xml.sax.handler
-import types
START_ELEMENT = "START_ELEMENT"
END_ELEMENT = "END_ELEMENT"
@@ -334,10 +333,7 @@ def parse(stream_or_string, parser=None, bufsize=None):
return DOMEventStream(stream, parser, bufsize)
def parseString(string, parser=None):
- try:
- from io import StringIO
- except ImportError:
- from io import StringIO
+ from io import StringIO
bufsize = len(string)
buf = StringIO(string)
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index 9742f32..9553c51 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -68,8 +68,9 @@ __all__ = [
"tostring", "tostringlist",
"TreeBuilder",
"VERSION",
- "XML",
+ "XML", "XMLID",
"XMLParser", "XMLTreeBuilder",
+ "register_namespace",
]
VERSION = "1.3.0"
@@ -99,34 +100,11 @@ VERSION = "1.3.0"
import sys
import re
import warnings
+import io
+import contextlib
+from . import ElementPath
-class _SimpleElementPath:
- # emulate pre-1.2 find/findtext/findall behaviour
- def find(self, element, tag, namespaces=None):
- for elem in element:
- if elem.tag == tag:
- return elem
- return None
- def findtext(self, element, tag, default=None, namespaces=None):
- elem = self.find(element, tag)
- if elem is None:
- return default
- return elem.text or ""
- def iterfind(self, element, tag, namespaces=None):
- if tag[:3] == ".//":
- for elem in element.iter(tag[3:]):
- yield elem
- for elem in element:
- if elem.tag == tag:
- yield elem
- def findall(self, element, tag, namespaces=None):
- return list(self.iterfind(element, tag, namespaces))
-
-try:
- from . import ElementPath
-except ImportError:
- ElementPath = _SimpleElementPath()
##
# Parser error. This is a subclass of <b>SyntaxError</b>.
@@ -148,9 +126,9 @@ class ParseError(SyntaxError):
# @defreturn flag
def iselement(element):
- # FIXME: not sure about this; might be a better idea to look
- # for tag/attrib/text attributes
- return isinstance(element, Element) or hasattr(element, "tag")
+ # FIXME: not sure about this;
+ # isinstance(element, Element) or look for tag/attrib/text attributes
+ return hasattr(element, 'tag')
##
# Element class. This class defines the Element interface, and
@@ -205,6 +183,9 @@ class Element:
# constructor
def __init__(self, tag, attrib={}, **extra):
+ if not isinstance(attrib, dict):
+ raise TypeError("attrib must be dict, not %s" % (
+ attrib.__class__.__name__,))
attrib = attrib.copy()
attrib.update(extra)
self.tag = tag
@@ -298,7 +279,7 @@ class Element:
# @param element The element to add.
def append(self, element):
- # assert iselement(element)
+ self._assert_is_element(element)
self._children.append(element)
##
@@ -308,8 +289,8 @@ class Element:
# @since 1.3
def extend(self, elements):
- # for element in elements:
- # assert iselement(element)
+ for element in elements:
+ self._assert_is_element(element)
self._children.extend(elements)
##
@@ -318,9 +299,15 @@ class Element:
# @param index Where to insert the new subelement.
def insert(self, index, element):
- # assert iselement(element)
+ self._assert_is_element(element)
self._children.insert(index, element)
+ def _assert_is_element(self, e):
+ # Need to refer to the actual Python implementation, not the
+ # shadowing C implementation.
+ if not isinstance(e, _Element):
+ raise TypeError('expected an Element, not %s' % type(e).__name__)
+
##
# Removes a matching subelement. Unlike the <b>find</b> methods,
# this method compares elements based on identity, not on tag
@@ -809,59 +796,38 @@ class ElementTree:
# None for only if not US-ASCII or UTF-8 or Unicode. None is default.
def write(self, file_or_filename,
- # keyword arguments
encoding=None,
xml_declaration=None,
default_namespace=None,
method=None):
- # assert self._root is not None
if not method:
method = "xml"
elif method not in _serialize:
- # FIXME: raise an ImportError for c14n if ElementC14N is missing?
raise ValueError("unknown method %r" % method)
if not encoding:
if method == "c14n":
encoding = "utf-8"
else:
encoding = "us-ascii"
- elif encoding == str: # lxml.etree compatibility.
- encoding = "unicode"
else:
encoding = encoding.lower()
- if hasattr(file_or_filename, "write"):
- file = file_or_filename
- else:
- if encoding != "unicode":
- file = open(file_or_filename, "wb")
+ with _get_writer(file_or_filename, encoding) as write:
+ if method == "xml" and (xml_declaration or
+ (xml_declaration is None and
+ encoding not in ("utf-8", "us-ascii", "unicode"))):
+ declared_encoding = encoding
+ if encoding == "unicode":
+ # Retrieve the default encoding for the xml declaration
+ import locale
+ declared_encoding = locale.getpreferredencoding()
+ write("<?xml version='1.0' encoding='%s'?>\n" % (
+ declared_encoding,))
+ if method == "text":
+ _serialize_text(write, self._root)
else:
- file = open(file_or_filename, "w")
- if encoding != "unicode":
- def write(text):
- try:
- return file.write(text.encode(encoding,
- "xmlcharrefreplace"))
- except (TypeError, AttributeError):
- _raise_serialization_error(text)
- else:
- write = file.write
- if method == "xml" and (xml_declaration or
- (xml_declaration is None and
- encoding not in ("utf-8", "us-ascii", "unicode"))):
- declared_encoding = encoding
- if encoding == "unicode":
- # Retrieve the default encoding for the xml declaration
- import locale
- declared_encoding = locale.getpreferredencoding()
- write("<?xml version='1.0' encoding='%s'?>\n" % declared_encoding)
- if method == "text":
- _serialize_text(write, self._root)
- else:
- qnames, namespaces = _namespaces(self._root, default_namespace)
- serialize = _serialize[method]
- serialize(write, self._root, qnames, namespaces)
- if file_or_filename is not file:
- file.close()
+ qnames, namespaces = _namespaces(self._root, default_namespace)
+ serialize = _serialize[method]
+ serialize(write, self._root, qnames, namespaces)
def write_c14n(self, file):
# lxml.etree compatibility. use output method instead
@@ -870,6 +836,58 @@ class ElementTree:
# --------------------------------------------------------------------
# serialization support
+@contextlib.contextmanager
+def _get_writer(file_or_filename, encoding):
+ # returns text write method and release all resourses after using
+ try:
+ write = file_or_filename.write
+ except AttributeError:
+ # file_or_filename is a file name
+ if encoding == "unicode":
+ file = open(file_or_filename, "w")
+ else:
+ file = open(file_or_filename, "w", encoding=encoding,
+ errors="xmlcharrefreplace")
+ with file:
+ yield file.write
+ else:
+ # file_or_filename is a file-like object
+ # encoding determines if it is a text or binary writer
+ if encoding == "unicode":
+ # use a text writer as is
+ yield write
+ else:
+ # wrap a binary writer with TextIOWrapper
+ with contextlib.ExitStack() as stack:
+ if isinstance(file_or_filename, io.BufferedIOBase):
+ file = file_or_filename
+ elif isinstance(file_or_filename, io.RawIOBase):
+ file = io.BufferedWriter(file_or_filename)
+ # Keep the original file open when the BufferedWriter is
+ # destroyed
+ stack.callback(file.detach)
+ else:
+ # This is to handle passed objects that aren't in the
+ # IOBase hierarchy, but just have a write method
+ file = io.BufferedIOBase()
+ file.writable = lambda: True
+ file.write = write
+ try:
+ # TextIOWrapper uses this methods to determine
+ # if BOM (for UTF-16, etc) should be added
+ file.seekable = file_or_filename.seekable
+ file.tell = file_or_filename.tell
+ except AttributeError:
+ pass
+ file = io.TextIOWrapper(file,
+ encoding=encoding,
+ errors="xmlcharrefreplace",
+ newline="\n")
+ # Keep the original file open when the TextIOWrapper is
+ # destroyed
+ stack.callback(file.detach)
+ yield file.write
+
def _namespaces(elem, default_namespace=None):
# identify namespaces used in this tree
@@ -909,11 +927,7 @@ def _namespaces(elem, default_namespace=None):
_raise_serialization_error(qname)
# populate qname and namespaces table
- try:
- iterate = elem.iter
- except AttributeError:
- iterate = elem.getiterator # cET compatibility
- for elem in iterate():
+ for elem in elem.iter():
tag = elem.tag
if isinstance(tag, QName):
if tag.text not in qnames:
@@ -1085,6 +1099,8 @@ _namespace_map = {
# dublin core
"http://purl.org/dc/elements/1.1/": "dc",
}
+# For tests and troubleshooting
+register_namespace._namespace_map = _namespace_map
def _raise_serialization_error(text):
raise TypeError(
@@ -1153,22 +1169,13 @@ def _escape_attrib_html(text):
# @defreturn string
def tostring(element, encoding=None, method=None):
- class dummy:
- pass
- data = []
- file = dummy()
- file.write = data.append
- ElementTree(element).write(file, encoding, method=method)
- if encoding in (str, "unicode"):
- return "".join(data)
- else:
- return b"".join(data)
+ stream = io.StringIO() if encoding == 'unicode' else io.BytesIO()
+ ElementTree(element).write(stream, encoding, method=method)
+ return stream.getvalue()
##
# Generates a string representation of an XML element, including all
-# subelements. If encoding is False, the string is returned as a
-# sequence of string fragments; otherwise it is a sequence of
-# bytestrings.
+# subelements.
#
# @param element An Element instance.
# @keyparam encoding Optional output encoding (default is US-ASCII).
@@ -1179,15 +1186,29 @@ def tostring(element, encoding=None, method=None):
# @defreturn sequence
# @since 1.3
+class _ListDataStream(io.BufferedIOBase):
+ """ An auxiliary stream accumulating into a list reference
+ """
+ def __init__(self, lst):
+ self.lst = lst
+
+ def writable(self):
+ return True
+
+ def seekable(self):
+ return True
+
+ def write(self, b):
+ self.lst.append(b)
+
+ def tell(self):
+ return len(self.lst)
+
def tostringlist(element, encoding=None, method=None):
- class dummy:
- pass
- data = []
- file = dummy()
- file.write = data.append
- ElementTree(element).write(file, encoding, method=method)
- # FIXME: merge small fragments into larger parts
- return data
+ lst = []
+ stream = _ListDataStream(lst)
+ ElementTree(element).write(stream, encoding, method=method)
+ return lst
##
# Writes an element tree or element structure to sys.stdout. This
@@ -1509,24 +1530,30 @@ class XMLParser:
self.target = self._target = target
self._error = expat.error
self._names = {} # name memo cache
- # callbacks
+ # main callbacks
parser.DefaultHandlerExpand = self._default
- parser.StartElementHandler = self._start
- parser.EndElementHandler = self._end
- parser.CharacterDataHandler = self._data
- # optional callbacks
- parser.CommentHandler = self._comment
- parser.ProcessingInstructionHandler = self._pi
+ if hasattr(target, 'start'):
+ parser.StartElementHandler = self._start
+ if hasattr(target, 'end'):
+ parser.EndElementHandler = self._end
+ if hasattr(target, 'data'):
+ parser.CharacterDataHandler = target.data
+ # miscellaneous callbacks
+ if hasattr(target, 'comment'):
+ parser.CommentHandler = target.comment
+ if hasattr(target, 'pi'):
+ parser.ProcessingInstructionHandler = target.pi
# let expat do the buffering, if supported
try:
- self._parser.buffer_text = 1
+ parser.buffer_text = 1
except AttributeError:
pass
# use new-style attribute handling, if supported
try:
- self._parser.ordered_attributes = 1
- self._parser.specified_attributes = 1
- parser.StartElementHandler = self._start_list
+ parser.ordered_attributes = 1
+ parser.specified_attributes = 1
+ if hasattr(target, 'start'):
+ parser.StartElementHandler = self._start_list
except AttributeError:
pass
self._doctype = None
@@ -1570,44 +1597,29 @@ class XMLParser:
attrib[fixname(attrib_in[i])] = attrib_in[i+1]
return self.target.start(tag, attrib)
- def _data(self, text):
- return self.target.data(text)
-
def _end(self, tag):
return self.target.end(self._fixname(tag))
- def _comment(self, data):
- try:
- comment = self.target.comment
- except AttributeError:
- pass
- else:
- return comment(data)
-
- def _pi(self, target, data):
- try:
- pi = self.target.pi
- except AttributeError:
- pass
- else:
- return pi(target, data)
-
def _default(self, text):
prefix = text[:1]
if prefix == "&":
# deal with undefined entities
try:
- self.target.data(self.entity[text[1:-1]])
+ data_handler = self.target.data
+ except AttributeError:
+ return
+ try:
+ data_handler(self.entity[text[1:-1]])
except KeyError:
from xml.parsers import expat
err = expat.error(
"undefined entity %s: line %d, column %d" %
- (text, self._parser.ErrorLineNumber,
- self._parser.ErrorColumnNumber)
+ (text, self.parser.ErrorLineNumber,
+ self.parser.ErrorColumnNumber)
)
err.code = 11 # XML_ERROR_UNDEFINED_ENTITY
- err.lineno = self._parser.ErrorLineNumber
- err.offset = self._parser.ErrorColumnNumber
+ err.lineno = self.parser.ErrorLineNumber
+ err.offset = self.parser.ErrorColumnNumber
raise err
elif prefix == "<" and text[:9] == "<!DOCTYPE":
self._doctype = [] # inside a doctype declaration
@@ -1625,16 +1637,16 @@ class XMLParser:
type = self._doctype[1]
if type == "PUBLIC" and n == 4:
name, type, pubid, system = self._doctype
+ if pubid:
+ pubid = pubid[1:-1]
elif type == "SYSTEM" and n == 3:
name, type, system = self._doctype
pubid = None
else:
return
- if pubid:
- pubid = pubid[1:-1]
if hasattr(self.target, "doctype"):
self.target.doctype(name, pubid, system[1:-1])
- elif self.doctype is not self._XMLParser__doctype:
+ elif self.doctype != self._XMLParser__doctype:
# warn about deprecated call
self._XMLParser__doctype(name, pubid, system[1:-1])
self.doctype(name, pubid, system[1:-1])
@@ -1665,7 +1677,7 @@ class XMLParser:
def feed(self, data):
try:
- self._parser.Parse(data, 0)
+ self.parser.Parse(data, 0)
except self._error as v:
self._raiseerror(v)
@@ -1677,12 +1689,100 @@ class XMLParser:
def close(self):
try:
- self._parser.Parse("", 1) # end of data
+ self.parser.Parse("", 1) # end of data
except self._error as v:
self._raiseerror(v)
- tree = self.target.close()
- del self.target, self._parser # get rid of circular references
- return tree
+ try:
+ close_handler = self.target.close
+ except AttributeError:
+ pass
+ else:
+ return close_handler()
+ finally:
+ # get rid of circular references
+ del self.parser, self._parser
+ del self.target, self._target
+
+
+# Import the C accelerators
+try:
+ # Element, SubElement, ParseError, TreeBuilder, XMLParser
+ from _elementtree import *
+except ImportError:
+ pass
+else:
+ # Overwrite 'ElementTree.parse' and 'iterparse' to use the C XMLParser
+
+ class ElementTree(ElementTree):
+ def parse(self, source, parser=None):
+ close_source = False
+ if not hasattr(source, 'read'):
+ source = open(source, 'rb')
+ close_source = True
+ try:
+ if parser is not None:
+ while True:
+ data = source.read(65536)
+ if not data:
+ break
+ parser.feed(data)
+ self._root = parser.close()
+ else:
+ parser = XMLParser()
+ self._root = parser._parse(source)
+ return self._root
+ finally:
+ if close_source:
+ source.close()
+
+ class iterparse:
+ root = None
+ def __init__(self, file, events=None):
+ self._close_file = False
+ if not hasattr(file, 'read'):
+ file = open(file, 'rb')
+ self._close_file = True
+ self._file = file
+ self._events = []
+ self._index = 0
+ self._error = None
+ self.root = self._root = None
+ b = TreeBuilder()
+ self._parser = XMLParser(b)
+ self._parser._setevents(self._events, events)
+
+ def __next__(self):
+ while True:
+ try:
+ item = self._events[self._index]
+ self._index += 1
+ return item
+ except IndexError:
+ pass
+ if self._error:
+ e = self._error
+ self._error = None
+ raise e
+ if self._parser is None:
+ self.root = self._root
+ if self._close_file:
+ self._file.close()
+ raise StopIteration
+ # load event buffer
+ del self._events[:]
+ self._index = 0
+ data = self._file.read(16384)
+ if data:
+ try:
+ self._parser.feed(data)
+ except SyntaxError as exc:
+ self._error = exc
+ else:
+ self._root = self._parser.close()
+ self._parser = None
+
+ def __iter__(self):
+ return self
# compatibility
XMLTreeBuilder = XMLParser
diff --git a/Lib/xml/etree/cElementTree.py b/Lib/xml/etree/cElementTree.py
index a6f127a..368e679 100644
--- a/Lib/xml/etree/cElementTree.py
+++ b/Lib/xml/etree/cElementTree.py
@@ -1,3 +1,3 @@
-# Wrapper module for _elementtree
+# Deprecated alias for xml.etree.ElementTree
-from _elementtree import *
+from xml.etree.ElementTree import *
diff --git a/Lib/xml/parsers/expat.py b/Lib/xml/parsers/expat.py
index a805b82..bcbe9fb 100644
--- a/Lib/xml/parsers/expat.py
+++ b/Lib/xml/parsers/expat.py
@@ -1,6 +1,4 @@
"""Interface to the Expat non-validating XML parser."""
-__version__ = '$Revision$'
-
import sys
from pyexpat import *
diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py
index 97d5aac..a779e66 100644
--- a/Lib/xmlrpc/client.py
+++ b/Lib/xmlrpc/client.py
@@ -128,8 +128,11 @@ Exported functions:
"""
import base64
+import sys
import time
+from datetime import datetime
import http.client
+import urllib.parse
from xml.parsers import expat
import socket
import errno
@@ -142,17 +145,13 @@ except ImportError:
# --------------------------------------------------------------------
# Internal stuff
-try:
- import datetime
-except ImportError:
- datetime = None
-
def escape(s):
s = s.replace("&", "&amp;")
s = s.replace("<", "&lt;")
return s.replace(">", "&gt;",)
-__version__ = "1.0.1"
+# used in User-Agent header sent
+__version__ = sys.version[:3]
# xmlrpc integer limits
MAXINT = 2**31-1
@@ -252,21 +251,33 @@ boolean = Boolean = bool
# Wrapper for XML-RPC DateTime values. This converts a time value to
# the format used by XML-RPC.
# <p>
-# The value can be given as a string in the format
-# "yyyymmddThh:mm:ss", as a 9-item time tuple (as returned by
+# The value can be given as a datetime object, as a string in the
+# format "yyyymmddThh:mm:ss", as a 9-item time tuple (as returned by
# time.localtime()), or an integer value (as returned by time.time()).
# The wrapper uses time.localtime() to convert an integer to a time
# tuple.
#
-# @param value The time, given as an ISO 8601 string, a time
-# tuple, or a integer time value.
+# @param value The time, given as a datetime object, an ISO 8601 string,
+# a time tuple, or an integer time value.
+
+
+# Issue #13305: different format codes across platforms
+_day0 = datetime(1, 1, 1)
+if _day0.strftime('%Y') == '0001': # Mac OS X
+ def _iso8601_format(value):
+ return value.strftime("%Y%m%dT%H:%M:%S")
+elif _day0.strftime('%4Y') == '0001': # Linux
+ def _iso8601_format(value):
+ return value.strftime("%4Y%m%dT%H:%M:%S")
+else:
+ def _iso8601_format(value):
+ return value.strftime("%Y%m%dT%H:%M:%S").zfill(17)
+del _day0
+
def _strftime(value):
- if datetime:
- if isinstance(value, datetime.datetime):
- return "%04d%02d%02dT%02d:%02d:%02d" % (
- value.year, value.month, value.day,
- value.hour, value.minute, value.second)
+ if isinstance(value, datetime):
+ return _iso8601_format(value)
if not isinstance(value, (tuple, time.struct_time)):
if value == 0:
@@ -291,9 +302,9 @@ class DateTime:
if isinstance(other, DateTime):
s = self.value
o = other.value
- elif datetime and isinstance(other, datetime.datetime):
+ elif isinstance(other, datetime):
s = self.value
- o = other.strftime("%Y%m%dT%H:%M:%S")
+ o = _iso8601_format(other)
elif isinstance(other, str):
s = self.value
o = other
@@ -361,8 +372,7 @@ def _datetime(data):
return value
def _datetime_type(data):
- t = time.strptime(data, "%Y%m%dT%H:%M:%S")
- return datetime.datetime(*tuple(t)[:6])
+ return datetime.strptime(data, "%Y%m%dT%H:%M:%S")
##
# Wrapper for binary data. This can be used to transport any kind
@@ -377,8 +387,8 @@ class Binary:
if data is None:
data = b""
else:
- if not isinstance(data, bytes):
- raise TypeError("expected bytes, not %s" %
+ if not isinstance(data, (bytes, bytearray)):
+ raise TypeError("expected bytes or bytearray, not %s" %
data.__class__.__name__)
data = bytes(data) # Make a copy of the bytes!
self.data = data
@@ -408,7 +418,6 @@ class Binary:
out.write("<value><base64>\n")
encoded = base64.encodebytes(self.data)
out.write(encoded.decode('ascii'))
- out.write('\n')
out.write("</base64></value>\n")
def _binary(data):
@@ -522,15 +531,6 @@ class Marshaller:
write("<value><nil/></value>")
dispatch[type(None)] = dump_nil
- def dump_int(self, value, write):
- # in case ints are > 32 bits
- if value > MAXINT or value < MININT:
- raise OverflowError("int exceeds XML-RPC limits")
- write("<value><int>")
- write(str(value))
- write("</int></value>\n")
- #dispatch[int] = dump_int
-
def dump_bool(self, value, write):
write("<value><boolean>")
write(value and "1" or "0")
@@ -545,6 +545,9 @@ class Marshaller:
write("</int></value>\n")
dispatch[int] = dump_long
+ # backward compatible
+ dump_int = dump_long
+
def dump_double(self, value, write):
write("<value><double>")
write(repr(value))
@@ -557,6 +560,14 @@ class Marshaller:
write("</string></value>\n")
dispatch[str] = dump_unicode
+ def dump_bytes(self, value, write):
+ write("<value><base64>\n")
+ encoded = base64.encodebytes(value)
+ write(encoded.decode('ascii'))
+ write("</base64></value>\n")
+ dispatch[bytes] = dump_bytes
+ dispatch[bytearray] = dump_bytes
+
def dump_array(self, value, write):
i = id(value)
if i in self.memo:
@@ -589,12 +600,11 @@ class Marshaller:
del self.memo[i]
dispatch[dict] = dump_struct
- if datetime:
- def dump_datetime(self, value, write):
- write("<value><dateTime.iso8601>")
- write(_strftime(value))
- write("</dateTime.iso8601></value>\n")
- dispatch[datetime.datetime] = dump_datetime
+ def dump_datetime(self, value, write):
+ write("<value><dateTime.iso8601>")
+ write(_strftime(value))
+ write("</dateTime.iso8601></value>\n")
+ dispatch[datetime] = dump_datetime
def dump_instance(self, value, write):
# check for special wrappers
@@ -628,7 +638,7 @@ class Unmarshaller:
# and again, if you don't understand what's going on in here,
# that's perfectly ok.
- def __init__(self, use_datetime=False):
+ def __init__(self, use_datetime=False, use_builtin_types=False):
self._type = None
self._stack = []
self._marks = []
@@ -636,9 +646,8 @@ class Unmarshaller:
self._methodname = None
self._encoding = "utf-8"
self.append = self._stack.append
- self._use_datetime = use_datetime
- if use_datetime and not datetime:
- raise ValueError("the datetime module is not available")
+ self._use_datetime = use_builtin_types or use_datetime
+ self._use_bytes = use_builtin_types
def close(self):
# return response tuple and target method
@@ -750,6 +759,8 @@ class Unmarshaller:
def end_base64(self, data):
value = Binary()
value.decode(data.encode("ascii"))
+ if self._use_bytes:
+ value = value.data
self.append(value)
self._value = 0
dispatch["base64"] = end_base64
@@ -861,23 +872,26 @@ FastMarshaller = FastParser = FastUnmarshaller = None
#
# return A (parser, unmarshaller) tuple.
-def getparser(use_datetime=False):
+def getparser(use_datetime=False, use_builtin_types=False):
"""getparser() -> parser, unmarshaller
Create an instance of the fastest available parser, and attach it
to an unmarshalling object. Return both objects.
"""
- if use_datetime and not datetime:
- raise ValueError("the datetime module is not available")
if FastParser and FastUnmarshaller:
- if use_datetime:
+ if use_builtin_types:
+ mkdatetime = _datetime_type
+ mkbytes = base64.decodebytes
+ elif use_datetime:
mkdatetime = _datetime_type
+ mkbytes = _binary
else:
mkdatetime = _datetime
- target = FastUnmarshaller(True, False, _binary, mkdatetime, Fault)
+ mkbytes = _binary
+ target = FastUnmarshaller(True, False, mkbytes, mkdatetime, Fault)
parser = FastParser(target)
else:
- target = Unmarshaller(use_datetime=use_datetime)
+ target = Unmarshaller(use_datetime=use_datetime, use_builtin_types=use_builtin_types)
if FastParser:
parser = FastParser(target)
else:
@@ -915,7 +929,7 @@ def dumps(params, methodname=None, methodresponse=None, encoding=None,
encoding: the packet encoding (default is UTF-8)
- All 8-bit strings in the data structure are assumed to use the
+ All byte strings in the data structure are assumed to use the
packet encoding. Unicode strings are automatically converted,
where necessary.
"""
@@ -974,7 +988,7 @@ def dumps(params, methodname=None, methodresponse=None, encoding=None,
# (None if not present).
# @see Fault
-def loads(data, use_datetime=False):
+def loads(data, use_datetime=False, use_builtin_types=False):
"""data -> unmarshalled data, method name
Convert an XML-RPC packet to unmarshalled data plus a method
@@ -983,7 +997,7 @@ def loads(data, use_datetime=False):
If the XML-RPC packet represents a fault condition, this function
raises a Fault exception.
"""
- p, u = getparser(use_datetime=use_datetime)
+ p, u = getparser(use_datetime=use_datetime, use_builtin_types=use_builtin_types)
p.feed(data)
p.close()
return u.close(), u.getmethodname()
@@ -1085,7 +1099,7 @@ class Transport:
"""Handles an HTTP transaction to an XML-RPC server."""
# client identifier (may be overridden)
- user_agent = "xmlrpclib.py/%s (by www.pythonware.com)" % __version__
+ user_agent = "Python-xmlrpc/%s" % __version__
#if true, we'll request gzip encoding
accept_gzip_encoding = True
@@ -1095,8 +1109,9 @@ class Transport:
# that they can decode such a request
encode_threshold = None #None = don't encode
- def __init__(self, use_datetime=False):
+ def __init__(self, use_datetime=False, use_builtin_types=False):
self._use_datetime = use_datetime
+ self._use_builtin_types = use_builtin_types
self._connection = (None, None)
self._extra_headers = []
@@ -1157,7 +1172,8 @@ class Transport:
def getparser(self):
# get parser and unmarshaller
- return getparser(use_datetime=self._use_datetime)
+ return getparser(use_datetime=self._use_datetime,
+ use_builtin_types=self._use_builtin_types)
##
# Get authorization info from host parameter
@@ -1175,7 +1191,6 @@ class Transport:
if isinstance(host, tuple):
host, x509 = host
- import urllib.parse
auth, host = urllib.parse.splituser(host)
if auth:
@@ -1364,11 +1379,10 @@ class ServerProxy:
"""
def __init__(self, uri, transport=None, encoding=None, verbose=False,
- allow_none=False, use_datetime=False):
+ allow_none=False, use_datetime=False, use_builtin_types=False):
# establish a "logical" server connection
# get the url
- import urllib.parse
type, uri = urllib.parse.splittype(uri)
if type not in ("http", "https"):
raise IOError("unsupported XML-RPC protocol")
@@ -1378,9 +1392,11 @@ class ServerProxy:
if transport is None:
if type == "https":
- transport = SafeTransport(use_datetime=use_datetime)
+ handler = SafeTransport
else:
- transport = Transport(use_datetime=use_datetime)
+ handler = Transport
+ transport = handler(use_datetime=use_datetime,
+ use_builtin_types=use_builtin_types)
self.__transport = transport
self.__encoding = encoding or 'utf-8'
diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
index fd17026..54e1726 100644
--- a/Lib/xmlrpc/server.py
+++ b/Lib/xmlrpc/server.py
@@ -160,11 +160,13 @@ class SimpleXMLRPCDispatcher:
can be instanced when used by the MultiPathXMLRPCServer
"""
- def __init__(self, allow_none=False, encoding=None):
+ def __init__(self, allow_none=False, encoding=None,
+ use_builtin_types=False):
self.funcs = {}
self.instance = None
self.allow_none = allow_none
self.encoding = encoding or 'utf-8'
+ self.use_builtin_types = use_builtin_types
def register_instance(self, instance, allow_dotted_names=False):
"""Registers an instance to respond to XML-RPC requests.
@@ -245,7 +247,7 @@ class SimpleXMLRPCDispatcher:
"""
try:
- params, method = loads(data)
+ params, method = loads(data, use_builtin_types=self.use_builtin_types)
# generate response
if dispatch_method is not None:
@@ -575,10 +577,11 @@ class SimpleXMLRPCServer(socketserver.TCPServer,
_send_traceback_header = False
def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
- logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
+ logRequests=True, allow_none=False, encoding=None,
+ bind_and_activate=True, use_builtin_types=False):
self.logRequests = logRequests
- SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
+ SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types)
socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
# [Bug #1222790] If possible, set close-on-exec flag; if a
@@ -598,10 +601,11 @@ class MultiPathXMLRPCServer(SimpleXMLRPCServer):
Make sure that the requestHandler accepts the paths in question.
"""
def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
- logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
+ logRequests=True, allow_none=False, encoding=None,
+ bind_and_activate=True, use_builtin_types=False):
SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, allow_none,
- encoding, bind_and_activate)
+ encoding, bind_and_activate, use_builtin_types)
self.dispatchers = {}
self.allow_none = allow_none
self.encoding = encoding or 'utf-8'
@@ -631,8 +635,8 @@ class MultiPathXMLRPCServer(SimpleXMLRPCServer):
class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
"""Simple handler for XML-RPC data passed through CGI."""
- def __init__(self, allow_none=False, encoding=None):
- SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
+ def __init__(self, allow_none=False, encoding=None, use_builtin_types=False):
+ SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types)
def handle_xmlrpc(self, request_text):
"""Handle a single XML-RPC request"""
@@ -927,9 +931,10 @@ class DocXMLRPCServer( SimpleXMLRPCServer,
def __init__(self, addr, requestHandler=DocXMLRPCRequestHandler,
logRequests=True, allow_none=False, encoding=None,
- bind_and_activate=True):
+ bind_and_activate=True, use_builtin_types=False):
SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests,
- allow_none, encoding, bind_and_activate)
+ allow_none, encoding, bind_and_activate,
+ use_builtin_types)
XMLRPCDocGenerator.__init__(self)
class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler,
@@ -959,8 +964,13 @@ class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler,
if __name__ == '__main__':
- print('Running XML-RPC server on port 8000')
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
- server.serve_forever()
+ print('Serving XML-RPC on localhost port 8000')
+ try:
+ server.serve_forever()
+ except KeyboardInterrupt:
+ print("\nKeyboard interrupt received, exiting.")
+ server.server_close()
+ sys.exit(0)
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 435a3e9..209dc4a 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -22,7 +22,18 @@ except ImportError:
zlib = None
crc32 = binascii.crc32
-__all__ = ["BadZipFile", "BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED",
+try:
+ import bz2 # We may need its compression method
+except ImportError:
+ bz2 = None
+
+try:
+ import lzma # We may need its compression method
+except ImportError:
+ lzma = None
+
+__all__ = ["BadZipFile", "BadZipfile", "error",
+ "ZIP_STORED", "ZIP_DEFLATED", "ZIP_BZIP2", "ZIP_LZMA",
"is_zipfile", "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile"]
class BadZipFile(Exception):
@@ -45,8 +56,17 @@ ZIP_MAX_COMMENT = (1 << 16) - 1
# constants for Zip file compression methods
ZIP_STORED = 0
ZIP_DEFLATED = 8
+ZIP_BZIP2 = 12
+ZIP_LZMA = 14
# Other ZIP compression methods not supported
+DEFAULT_VERSION = 20
+ZIP64_VERSION = 45
+BZIP2_VERSION = 46
+LZMA_VERSION = 63
+# we recognize (but not necessarily support) all features up to that version
+MAX_EXTRACT_VERSION = 63
+
# Below are some formats and associated data for reading/writing headers using
# the struct module. The names and structures of headers/records are those used
# in the PKWARE description of the ZIP file format:
@@ -313,8 +333,8 @@ class ZipInfo (object):
else:
# Assume everything else is unix-y
self.create_system = 3 # System which created ZIP archive
- self.create_version = 20 # Version which created ZIP archive
- self.extract_version = 20 # Version needed to extract archive
+ self.create_version = DEFAULT_VERSION # Version which created ZIP archive
+ self.extract_version = DEFAULT_VERSION # Version needed to extract archive
self.reserved = 0 # Must be zero
self.flag_bits = 0 # ZIP flag bits
self.volume = 0 # Volume number of file header
@@ -341,6 +361,7 @@ class ZipInfo (object):
extra = self.extra
+ min_version = 0
if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT:
# File is larger than what fits into a 4 byte integer,
# fall back to the ZIP64 extension
@@ -349,9 +370,15 @@ class ZipInfo (object):
1, struct.calcsize(fmt)-4, file_size, compress_size)
file_size = 0xffffffff
compress_size = 0xffffffff
- self.extract_version = max(45, self.extract_version)
- self.create_version = max(45, self.extract_version)
+ min_version = ZIP64_VERSION
+
+ if self.compress_type == ZIP_BZIP2:
+ min_version = max(BZIP2_VERSION, min_version)
+ elif self.compress_type == ZIP_LZMA:
+ min_version = max(LZMA_VERSION, min_version)
+ self.extract_version = max(min_version, self.extract_version)
+ self.create_version = max(min_version, self.create_version)
filename, flag_bits = self._encodeFilenameFlags()
header = struct.pack(structFileHeader, stringFileHeader,
self.extract_version, self.reserved, flag_bits,
@@ -461,6 +488,126 @@ class _ZipDecrypter:
self._UpdateKeys(c)
return c
+
+class LZMACompressor:
+
+ def __init__(self):
+ self._comp = None
+
+ def _init(self):
+ props = lzma._encode_filter_properties({'id': lzma.FILTER_LZMA1})
+ self._comp = lzma.LZMACompressor(lzma.FORMAT_RAW, filters=[
+ lzma._decode_filter_properties(lzma.FILTER_LZMA1, props)
+ ])
+ return struct.pack('<BBH', 9, 4, len(props)) + props
+
+ def compress(self, data):
+ if self._comp is None:
+ return self._init() + self._comp.compress(data)
+ return self._comp.compress(data)
+
+ def flush(self):
+ if self._comp is None:
+ return self._init() + self._comp.flush()
+ return self._comp.flush()
+
+
+class LZMADecompressor:
+
+ def __init__(self):
+ self._decomp = None
+ self._unconsumed = b''
+ self.eof = False
+
+ def decompress(self, data):
+ if self._decomp is None:
+ self._unconsumed += data
+ if len(self._unconsumed) <= 4:
+ return b''
+ psize, = struct.unpack('<H', self._unconsumed[2:4])
+ if len(self._unconsumed) <= 4 + psize:
+ return b''
+
+ self._decomp = lzma.LZMADecompressor(lzma.FORMAT_RAW, filters=[
+ lzma._decode_filter_properties(lzma.FILTER_LZMA1,
+ self._unconsumed[4:4 + psize])
+ ])
+ data = self._unconsumed[4 + psize:]
+ del self._unconsumed
+
+ result = self._decomp.decompress(data)
+ self.eof = self._decomp.eof
+ return result
+
+
+compressor_names = {
+ 0: 'store',
+ 1: 'shrink',
+ 2: 'reduce',
+ 3: 'reduce',
+ 4: 'reduce',
+ 5: 'reduce',
+ 6: 'implode',
+ 7: 'tokenize',
+ 8: 'deflate',
+ 9: 'deflate64',
+ 10: 'implode',
+ 12: 'bzip2',
+ 14: 'lzma',
+ 18: 'terse',
+ 19: 'lz77',
+ 97: 'wavpack',
+ 98: 'ppmd',
+}
+
+def _check_compression(compression):
+ if compression == ZIP_STORED:
+ pass
+ elif compression == ZIP_DEFLATED:
+ if not zlib:
+ raise RuntimeError(
+ "Compression requires the (missing) zlib module")
+ elif compression == ZIP_BZIP2:
+ if not bz2:
+ raise RuntimeError(
+ "Compression requires the (missing) bz2 module")
+ elif compression == ZIP_LZMA:
+ if not lzma:
+ raise RuntimeError(
+ "Compression requires the (missing) lzma module")
+ else:
+ raise RuntimeError("That compression method is not supported")
+
+
+def _get_compressor(compress_type):
+ if compress_type == ZIP_DEFLATED:
+ return zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
+ zlib.DEFLATED, -15)
+ elif compress_type == ZIP_BZIP2:
+ return bz2.BZ2Compressor()
+ elif compress_type == ZIP_LZMA:
+ return LZMACompressor()
+ else:
+ return None
+
+
+def _get_decompressor(compress_type):
+ if compress_type == ZIP_STORED:
+ return None
+ elif compress_type == ZIP_DEFLATED:
+ return zlib.decompressobj(-15)
+ elif compress_type == ZIP_BZIP2:
+ return bz2.BZ2Decompressor()
+ elif compress_type == ZIP_LZMA:
+ return LZMADecompressor()
+ else:
+ descr = compressor_names.get(compress_type)
+ if descr:
+ raise NotImplementedError("compression type %d (%s)" % (compress_type, descr))
+ else:
+ raise NotImplementedError("compression type %d" % (compress_type,))
+
+
class ZipExtFile(io.BufferedIOBase):
"""File-like object for reading an archive member.
Is returned by ZipFile.open().
@@ -482,13 +629,12 @@ class ZipExtFile(io.BufferedIOBase):
self._close_fileobj = close_fileobj
self._compress_type = zipinfo.compress_type
- self._compress_size = zipinfo.compress_size
self._compress_left = zipinfo.compress_size
+ self._left = zipinfo.file_size
- if self._compress_type == ZIP_DEFLATED:
- self._decompressor = zlib.decompressobj(-15)
- self._unconsumed = b''
+ self._decompressor = _get_decompressor(self._compress_type)
+ self._eof = False
self._readbuffer = b''
self._offset = 0
@@ -563,7 +709,11 @@ class ZipExtFile(io.BufferedIOBase):
"""Returns buffered bytes without advancing the position."""
if n > len(self._readbuffer) - self._offset:
chunk = self.read(n)
- self._offset -= len(chunk)
+ if len(chunk) > self._offset:
+ self._readbuffer = chunk + self._readbuffer[self._offset:]
+ self._offset = 0
+ else:
+ self._offset -= len(chunk)
# Return up to 512 bytes to reduce allocation overhead for tight loops.
return self._readbuffer[self._offset: self._offset + 512]
@@ -575,80 +725,123 @@ class ZipExtFile(io.BufferedIOBase):
"""Read and return up to n bytes.
If the argument is omitted, None, or negative, data is read and returned until EOF is reached..
"""
- buf = b''
- if n is None:
- n = -1
- while True:
- if n < 0:
- data = self.read1(n)
- elif n > len(buf):
- data = self.read1(n - len(buf))
- else:
- return buf
- if len(data) == 0:
- return buf
+ if n is None or n < 0:
+ buf = self._readbuffer[self._offset:]
+ self._readbuffer = b''
+ self._offset = 0
+ while not self._eof:
+ buf += self._read1(self.MAX_N)
+ return buf
+
+ end = n + self._offset
+ if end < len(self._readbuffer):
+ buf = self._readbuffer[self._offset:end]
+ self._offset = end
+ return buf
+
+ n = end - len(self._readbuffer)
+ buf = self._readbuffer[self._offset:]
+ self._readbuffer = b''
+ self._offset = 0
+ while n > 0 and not self._eof:
+ data = self._read1(n)
+ if n < len(data):
+ self._readbuffer = data
+ self._offset = n
+ buf += data[:n]
+ break
buf += data
+ n -= len(data)
+ return buf
- def _update_crc(self, newdata, eof):
+ def _update_crc(self, newdata):
# Update the CRC using the given data.
if self._expected_crc is None:
# No need to compute the CRC if we don't have a reference value
return
self._running_crc = crc32(newdata, self._running_crc) & 0xffffffff
# Check the CRC if we're at the end of the file
- if eof and self._running_crc != self._expected_crc:
+ if self._eof and self._running_crc != self._expected_crc:
raise BadZipFile("Bad CRC-32 for file %r" % self.name)
def read1(self, n):
"""Read up to n bytes with at most one read() system call."""
- # Simplify algorithm (branching) by transforming negative n to large n.
- if n < 0 or n is None:
- n = self.MAX_N
-
- # Bytes available in read buffer.
- len_readbuffer = len(self._readbuffer) - self._offset
+ if n is None or n < 0:
+ buf = self._readbuffer[self._offset:]
+ self._readbuffer = b''
+ self._offset = 0
+ data = self._read1(self.MAX_N)
+ buf += data
+ return buf
- # Read from file.
- if self._compress_left > 0 and n > len_readbuffer + len(self._unconsumed):
- nbytes = n - len_readbuffer - len(self._unconsumed)
- nbytes = max(nbytes, self.MIN_READ_SIZE)
- nbytes = min(nbytes, self._compress_left)
+ end = n + self._offset
+ if end < len(self._readbuffer):
+ buf = self._readbuffer[self._offset:end]
+ self._offset = end
+ return buf
- data = self._fileobj.read(nbytes)
- self._compress_left -= len(data)
+ n = end - len(self._readbuffer)
+ buf = self._readbuffer[self._offset:]
+ self._readbuffer = b''
+ self._offset = 0
+ if n > 0:
+ data = self._read1(n)
+ if n < len(data):
+ self._readbuffer = data
+ self._offset = n
+ data = data[:n]
+ buf += data
+ return buf
- if data and self._decrypter is not None:
- data = bytes(map(self._decrypter, data))
+ def _read1(self, n):
+ # Read up to n compressed bytes with at most one read() system call,
+ # decrypt and decompress them.
+ if self._eof or n <= 0:
+ return b''
- if self._compress_type == ZIP_STORED:
- self._update_crc(data, eof=(self._compress_left==0))
- self._readbuffer = self._readbuffer[self._offset:] + data
- self._offset = 0
- else:
- # Prepare deflated bytes for decompression.
- self._unconsumed += data
-
- # Handle unconsumed data.
- if (len(self._unconsumed) > 0 and n > len_readbuffer and
- self._compress_type == ZIP_DEFLATED):
- data = self._decompressor.decompress(
- self._unconsumed,
- max(n - len_readbuffer, self.MIN_READ_SIZE)
- )
-
- self._unconsumed = self._decompressor.unconsumed_tail
- eof = len(self._unconsumed) == 0 and self._compress_left == 0
- if eof:
+ # Read from file.
+ if self._compress_type == ZIP_DEFLATED:
+ ## Handle unconsumed data.
+ data = self._decompressor.unconsumed_tail
+ if n > len(data):
+ data += self._read2(n - len(data))
+ else:
+ data = self._read2(n)
+
+ if self._compress_type == ZIP_STORED:
+ self._eof = self._compress_left <= 0
+ elif self._compress_type == ZIP_DEFLATED:
+ n = max(n, self.MIN_READ_SIZE)
+ data = self._decompressor.decompress(data, n)
+ self._eof = (self._decompressor.eof or
+ self._compress_left <= 0 and
+ not self._decompressor.unconsumed_tail)
+ if self._eof:
data += self._decompressor.flush()
+ else:
+ data = self._decompressor.decompress(data)
+ self._eof = self._decompressor.eof or self._compress_left <= 0
+
+ data = data[:self._left]
+ self._left -= len(data)
+ if self._left <= 0:
+ self._eof = True
+ self._update_crc(data)
+ return data
- self._update_crc(data, eof=eof)
- self._readbuffer = self._readbuffer[self._offset:] + data
- self._offset = 0
+ def _read2(self, n):
+ if self._compress_left <= 0:
+ return b''
- # Read from buffer.
- data = self._readbuffer[self._offset: self._offset + n]
- self._offset += len(data)
+ n = max(n, self.MIN_READ_SIZE)
+ n = min(n, self._compress_left)
+
+ data = self._fileobj.read(n)
+ self._compress_left -= len(data)
+
+ if self._decrypter is not None:
+ data = bytes(map(self._decrypter, data))
return data
def close(self):
@@ -667,7 +860,8 @@ class ZipFile:
file: Either the path to the file, or a file-like object.
If it is a path, the file will be opened and closed by ZipFile.
mode: The mode can be either read "r", write "w" or append "a".
- compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
+ compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib),
+ ZIP_BZIP2 (requires bz2) or ZIP_LZMA (requires lzma).
allowZip64: if True ZipFile will create files with ZIP64 extensions when
needed, otherwise it will raise an exception when this would
be necessary.
@@ -681,14 +875,7 @@ class ZipFile:
if mode not in ("r", "w", "a"):
raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
- if compression == ZIP_STORED:
- pass
- elif compression == ZIP_DEFLATED:
- if not zlib:
- raise RuntimeError(
- "Compression requires the (missing) zlib module")
- else:
- raise RuntimeError("That compression method is not supported")
+ _check_compression(compression)
self._allowZip64 = allowZip64
self._didModify = False
@@ -814,6 +1001,9 @@ class ZipFile:
(x.create_version, x.create_system, x.extract_version, x.reserved,
x.flag_bits, x.compress_type, t, d,
x.CRC, x.compress_size, x.file_size) = centdir[1:12]
+ if x.extract_version > MAX_EXTRACT_VERSION:
+ raise NotImplementedError("zip file version %.1f" %
+ (x.extract_version / 10))
x.volume, x.internal_attr, x.external_attr = centdir[15:18]
# Convert date/time code to (year, month, day, hour, min, sec)
x._raw_time = t
@@ -836,10 +1026,7 @@ class ZipFile:
def namelist(self):
"""Return a list of file names in the archive."""
- l = []
- for data in self.filelist:
- l.append(data.filename)
- return l
+ return [data.filename for data in self.filelist]
def infolist(self):
"""Return a list of class ZipInfo instances for files in the
@@ -950,6 +1137,14 @@ class ZipFile:
if fheader[_FH_EXTRA_FIELD_LENGTH]:
zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
+ if zinfo.flag_bits & 0x20:
+ # Zip 2.7: compressed patched data
+ raise NotImplementedError("compressed patched data (flag bit 5)")
+
+ if zinfo.flag_bits & 0x40:
+ # strong encryption
+ raise NotImplementedError("strong encryption (flag bit 6)")
+
if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
@@ -1070,11 +1265,7 @@ class ZipFile:
if not self.fp:
raise RuntimeError(
"Attempt to write ZIP archive that was already closed")
- if zinfo.compress_type == ZIP_DEFLATED and not zlib:
- raise RuntimeError(
- "Compression requires the (missing) zlib module")
- if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
- raise RuntimeError("That compression method is not supported")
+ _check_compression(zinfo.compress_type)
if zinfo.file_size > ZIP64_LIMIT:
if not self._allowZip64:
raise LargeZipFile("Filesize would require ZIP64 extensions")
@@ -1112,6 +1303,9 @@ class ZipFile:
zinfo.file_size = st.st_size
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell() # Start of header bytes
+ if zinfo.compress_type == ZIP_LZMA:
+ # Compressed data includes an end-of-stream (EOS) marker
+ zinfo.flag_bits |= 0x02
self._writecheck(zinfo)
self._didModify = True
@@ -1125,17 +1319,13 @@ class ZipFile:
self.fp.write(zinfo.FileHeader())
return
+ cmpr = _get_compressor(zinfo.compress_type)
with open(filename, "rb") as fp:
# Must overwrite CRC and sizes with correct data later
zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
zinfo.file_size = file_size = 0
self.fp.write(zinfo.FileHeader())
- if zinfo.compress_type == ZIP_DEFLATED:
- cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
- zlib.DEFLATED, -15)
- else:
- cmpr = None
while 1:
buf = fp.read(1024 * 8)
if not buf:
@@ -1188,13 +1378,15 @@ class ZipFile:
zinfo.header_offset = self.fp.tell() # Start of header data
if compress_type is not None:
zinfo.compress_type = compress_type
+ if zinfo.compress_type == ZIP_LZMA:
+ # Compressed data includes an end-of-stream (EOS) marker
+ zinfo.flag_bits |= 0x02
self._writecheck(zinfo)
self._didModify = True
zinfo.CRC = crc32(data) & 0xffffffff # CRC-32 checksum
- if zinfo.compress_type == ZIP_DEFLATED:
- co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
- zlib.DEFLATED, -15)
+ co = _get_compressor(zinfo.compress_type)
+ if co:
data = co.compress(data) + co.flush()
zinfo.compress_size = len(data) # Compressed size
else:
@@ -1246,18 +1438,22 @@ class ZipFile:
header_offset = zinfo.header_offset
extra_data = zinfo.extra
+ min_version = 0
if extra:
# Append a ZIP64 field to the extra's
extra_data = struct.pack(
'<HH' + 'Q'*len(extra),
1, 8*len(extra), *extra) + extra_data
- extract_version = max(45, zinfo.extract_version)
- create_version = max(45, zinfo.create_version)
- else:
- extract_version = zinfo.extract_version
- create_version = zinfo.create_version
+ min_version = ZIP64_VERSION
+
+ if zinfo.compress_type == ZIP_BZIP2:
+ min_version = max(BZIP2_VERSION, min_version)
+ elif zinfo.compress_type == ZIP_LZMA:
+ min_version = max(LZMA_VERSION, min_version)
+ extract_version = max(min_version, zinfo.extract_version)
+ create_version = max(min_version, zinfo.create_version)
try:
filename, flag_bits = zinfo._encodeFilenameFlags()
centdir = struct.pack(structCentralDir,
diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
index de2f5cb..fa04b97 100644
--- a/Mac/BuildScript/README.txt
+++ b/Mac/BuildScript/README.txt
@@ -8,70 +8,125 @@ $DESTROOT, massages that installation to remove .pyc files and such, creates
an Installer package from the installation plus other files in ``resources``
and ``scripts`` and placed that on a ``.dmg`` disk image.
-As of Python 2.7.x and 3.2, PSF practice is to build two installer variants
-for each release:
+As of Python 3.3.0, PSF practice is to build two installer variants
+for each release.
1. 32-bit-only, i386 and PPC universal, capable on running on all machines
- supported by Mac OS X 10.3.9 through (at least) 10.6::
+ supported by Mac OS X 10.5 through (at least) 10.8::
- python build-installer.py \
- --sdk-path=/Developer/SDKs/MacOSX10.4u.sdk \
+ /usr/bin/python build-installer.py \
+ --sdk-path=/Developer/SDKs/MacOSX10.5.sdk \
--universal-archs=32-bit \
- --dep-target=10.3
- # These are the current default options
+ --dep-target=10.5
- builds the following third-party libraries
- * Bzip2
- * Zlib 1.2.3
- * GNU Readline (GPL)
- * SQLite 3
- * NCurses
- * Oracle Sleepycat DB 4.8 (Python 2.x only)
+ * NCurses 5.9 (http://bugs.python.org/issue15037)
+ * SQLite 3.7.13
+ * XZ 5.0.3
+
+ - uses system-supplied versions of third-party libraries
+
+ * readline module links with Apple BSD editline (libedit)
- requires ActiveState ``Tcl/Tk 8.4`` (currently 8.4.19) to be installed for building
- - current target build environment:
-
- * Mac OS X 10.5.8 PPC or Intel
- * Xcode 3.1.4 (or later)
- * ``MacOSX10.4u`` SDK (later SDKs do not support PPC G3 processors)
- * ``MACOSX_DEPLOYMENT_TARGET=10.3``
- * Apple ``gcc-4.0``
- * Python 2.n (n >= 4) for documentation build with Sphinx
+ - recommended build environment:
+
+ * Mac OS X 10.5.8 Intel or PPC
+ * Xcode 3.1.4
+ * ``MacOSX10.5`` SDK
+ * ``MACOSX_DEPLOYMENT_TARGET=10.5``
+ * Apple ``gcc-4.2``
+ * system Python 2.5 for documentation build with Sphinx
- alternate build environments:
- * Mac OS X 10.4.11 with Xcode 2.5
- * Mac OS X 10.6.6 with Xcode 3.2.5
+ * Mac OS X 10.6.8 with Xcode 3.2.6
- need to change ``/System/Library/Frameworks/{Tcl,Tk}.framework/Version/Current`` to ``8.4``
+ * Note Xcode 4.* does not support building for PPC so cannot be used for this build
2. 64-bit / 32-bit, x86_64 and i386 universal, for OS X 10.6 (and later)::
- python build-installer.py \
+ /usr/bin/python build-installer.py \
--sdk-path=/Developer/SDKs/MacOSX10.6.sdk \
--universal-archs=intel \
--dep-target=10.6
+ - builds the following third-party libraries
+
+ * NCurses 5.9 (http://bugs.python.org/issue15037)
+ * SQLite 3.7.13
+ * XZ 5.0.3
+
- uses system-supplied versions of third-party libraries
-
+
* readline module links with Apple BSD editline (libedit)
- * builds Oracle Sleepycat DB 4.8 (Python 2.x only)
- requires ActiveState Tcl/Tk 8.5.9 (or later) to be installed for building
- - current target build environment:
-
- * Mac OS X 10.6.6 (or later)
- * Xcode 3.2.5 (or later)
+ - recommended build environment:
+
+ * Mac OS X 10.6.8 (or later)
+ * Xcode 3.2.6
* ``MacOSX10.6`` SDK
* ``MACOSX_DEPLOYMENT_TARGET=10.6``
* Apple ``gcc-4.2``
- * Python 2.n (n >= 4) for documentation build with Sphinx
+ * system Python 2.6 for documentation build with Sphinx
- alternate build environments:
- * none
+ * none. Xcode 4.x currently supplies two C compilers.
+ ``llvm-gcc-4.2.1`` has been found to miscompile Python 3.3.x and
+ produce a non-functional Python executable. As it appears to be
+ considered a migration aid by Apple and is not likely to be fixed,
+ its use should be avoided. The other compiler, ``clang``, has been
+ undergoing rapid development. While it appears to have become
+ production-ready in the most recent Xcode 4 releases (Xcode 4.4.1
+ as of this writing), there are still some open issues when
+ building Python and there has not yet been the level of exposure in
+ production environments that the Xcode 3 gcc-4.2 compiler has had.
+
+
+* For Python 2.7.x and 3.2.x, the 32-bit-only installer was configured to
+ support Mac OS X 10.3.9 through (at least) 10.6. Because it is
+ believed that there are few systems still running OS X 10.3 or 10.4
+ and because it has become increasingly difficult to test and
+ support the differences in these earlier systems, as of Python 3.3.0 the PSF
+ 32-bit installer no longer supports them. For reference in building such
+ an installer yourself, the details are::
+
+ /usr/bin/python build-installer.py \
+ --sdk-path=/Developer/SDKs/MacOSX10.4u.sdk \
+ --universal-archs=32-bit \
+ --dep-target=10.3
+
+ - builds the following third-party libraries
+
+ * Bzip2
+ * NCurses
+ * GNU Readline (GPL)
+ * SQLite 3
+ * XZ
+ * Zlib 1.2.3
+ * Oracle Sleepycat DB 4.8 (Python 2.x only)
+
+ - requires ActiveState ``Tcl/Tk 8.4`` (currently 8.4.19) to be installed for building
+
+ - recommended build environment:
+
+ * Mac OS X 10.5.8 PPC or Intel
+ * Xcode 3.1.4 (or later)
+ * ``MacOSX10.4u`` SDK (later SDKs do not support PPC G3 processors)
+ * ``MACOSX_DEPLOYMENT_TARGET=10.3``
+ * Apple ``gcc-4.0``
+ * system Python 2.5 for documentation build with Sphinx
+
+ - alternate build environments:
+
+ * Mac OS X 10.6.8 with Xcode 3.2.6
+ - need to change ``/System/Library/Frameworks/{Tcl,Tk}.framework/Version/Current`` to ``8.4``
+
General Prerequisites
@@ -87,6 +142,11 @@ General Prerequisites
* It is safest to start each variant build with an empty source directory
populated with a fresh copy of the untarred source.
+* It is recommended that you remove any existing installed version of the
+ Python being built::
+
+ sudo rm -rf /Library/Frameworks/Python.framework/Versions/n.n
+
The Recipe
----------
@@ -107,9 +167,9 @@ Building other universal installers
...................................
It is also possible to build a 4-way universal installer that runs on
-OS X Leopard or later::
+OS X 10.5 Leopard or later::
- python 2.6 /build-installer.py \
+ /usr/bin/python /build-installer.py \
--dep-target=10.5
--universal-archs=all
--sdk-path=/Developer/SDKs/MacOSX10.5.sdk
@@ -120,7 +180,8 @@ also that you are building on at least OS X 10.5. 4-way includes
variants can only be run on G5 machines running 10.5. Note that,
while OS X 10.6 is only supported on Intel-based machines, it is possible
to run ``ppc`` (32-bit) executables unmodified thanks to the Rosetta ppc
-emulation in OS X 10.5 and 10.6.
+emulation in OS X 10.5 and 10.6. The 4-way installer variant must be
+built with Xcode 3. It is not regularly built or tested.
Other ``--universal-archs`` options are ``64-bit`` (``x86_64``, ``ppc64``),
and ``3-way`` (``ppc``, ``i386``, ``x86_64``). None of these options
@@ -133,15 +194,21 @@ Testing
Ideally, the resulting binaries should be installed and the test suite run
on all supported OS X releases and architectures. As a practical matter,
that is generally not possible. At a minimum, variant 1 should be run on
-at least one Intel, one PPC G4, and one PPC G3 system and one each of
-OS X 10.6, 10.5, 10.4, and 10.3.9. Not all tests run on 10.3.9.
-Variant 2 should be run on 10.6 in both 32-bit and 64-bit modes.::
+a PPC G4 system with OS X 10.5 and at least one Intel system running OS X
+10.8, 10.7, 10.6, or 10.5. Variant 2 should be run on 10.8, 10.7, and 10.6
+systems in both 32-bit and 64-bit modes.::
- arch -i386 /usr/local/bin/pythonn.n -m test.regrtest -w -u all
- arch -X86_64 /usr/local/bin/pythonn.n -m test.regrtest -w -u all
+ /usr/local/bin/pythonn.n -m test -w -u all,-largefile
+ /usr/local/bin/pythonn.n-32 -m test -w -u all
Certain tests will be skipped and some cause the interpreter to fail
which will likely generate ``Python quit unexpectedly`` alert messages
-to be generated at several points during a test run. These can
-be ignored.
+to be generated at several points during a test run. These are normal
+during testing and can be ignored.
+
+It is also recommend to launch IDLE and verify that it is at least
+functional. Double-click on the IDLE app icon in ``/Applications/Pythonn.n``.
+It should also be tested from the command line::
+
+ /usr/local/bin/idlen.n
diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
index ba92012..bd0c476 100755
--- a/Mac/BuildScript/build-installer.py
+++ b/Mac/BuildScript/build-installer.py
@@ -1,7 +1,7 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""
This script is used to build "official" universal installers on Mac OS X.
-It requires at least Mac OS X 10.4, Xcode 2.2 and the 10.4u SDK for
+It requires at least Mac OS X 10.5, Xcode 3, and the 10.4u SDK for
32-bit builds. 64-bit or four-way universal builds require at least
OS X 10.5 and the 10.5 SDK.
@@ -10,18 +10,41 @@ bootstrap issues (/usr/bin/python is Python 2.5 on OSX 10.5). Sphinx,
which is used to build the documentation, currently requires at least
Python 2.4.
+In addition to what is supplied with OS X 10.5+ and Xcode 3+, the script
+requires an installed version of hg and a third-party version of
+Tcl/Tk 8.4 (for OS X 10.4 and 10.5 deployment targets) or Tcl/TK 8.5
+(for 10.6 or later) installed in /Library/Frameworks. When installed,
+the Python built by this script will attempt to dynamically link first to
+Tcl and Tk frameworks in /Library/Frameworks if available otherwise fall
+back to the ones in /System/Library/Framework. For the build, we recommend
+installing the most recent ActiveTcl 8.4 or 8.5 version.
+
+32-bit-only installer builds are still possible on OS X 10.4 with Xcode 2.5
+and the installation of additional components, such as a newer Python
+(2.5 is needed for Python parser updates), hg, and svn (for the documentation
+build).
+
Usage: see USAGE variable in the script.
"""
-import platform, os, sys, getopt, textwrap, shutil, urllib2, stat, time, pwd
-import grp
+import platform, os, sys, getopt, textwrap, shutil, stat, time, pwd, grp
+try:
+ import urllib2 as urllib_request
+except ImportError:
+ import urllib.request as urllib_request
+
+STAT_0o755 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
+ | stat.S_IRGRP | stat.S_IXGRP
+ | stat.S_IROTH | stat.S_IXOTH )
+
+STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
+ | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
+ | stat.S_IROTH | stat.S_IXOTH )
INCLUDE_TIMESTAMP = 1
VERBOSE = 1
from plistlib import Plist
-import MacOS
-
try:
from plistlib import writePlist
except ImportError:
@@ -42,20 +65,35 @@ def grepValue(fn, variable):
if ln.startswith(variable):
value = ln[len(variable):].strip()
return value[1:-1]
- raise RuntimeError, "Cannot find variable %s" % variable[:-1]
+ raise RuntimeError("Cannot find variable %s" % variable[:-1])
+
+_cache_getVersion = None
def getVersion():
- return grepValue(os.path.join(SRCDIR, 'configure'), 'PACKAGE_VERSION')
+ global _cache_getVersion
+ if _cache_getVersion is None:
+ _cache_getVersion = grepValue(
+ os.path.join(SRCDIR, 'configure'), 'PACKAGE_VERSION')
+ return _cache_getVersion
def getVersionTuple():
return tuple([int(n) for n in getVersion().split('.')])
+def getVersionMajorMinor():
+ return tuple([int(n) for n in getVersion().split('.', 2)])
+
+_cache_getFullVersion = None
+
def getFullVersion():
+ global _cache_getFullVersion
+ if _cache_getFullVersion is not None:
+ return _cache_getFullVersion
fn = os.path.join(SRCDIR, 'Include', 'patchlevel.h')
for ln in open(fn):
if 'PY_VERSION' in ln:
- return ln.split()[-1][1:-1]
- raise RuntimeError, "Cannot find full version??"
+ _cache_getFullVersion = ln.split()[-1][1:-1]
+ return _cache_getFullVersion
+ raise RuntimeError("Cannot find full version??")
# The directory we'll use to create the build (will be erased and recreated)
WORKDIR = "/tmp/_py"
@@ -111,13 +149,15 @@ SRCDIR = os.path.dirname(
DEPTARGET = '10.3'
target_cc_map = {
- '10.3': 'gcc-4.0',
- '10.4': 'gcc-4.0',
- '10.5': 'gcc-4.0',
- '10.6': 'gcc-4.2',
+ '10.3': ('gcc-4.0', 'g++-4.0'),
+ '10.4': ('gcc-4.0', 'g++-4.0'),
+ '10.5': ('gcc-4.2', 'g++-4.2'),
+ '10.6': ('gcc-4.2', 'g++-4.2'),
+ '10.7': ('clang', 'clang++'),
+ '10.8': ('clang', 'clang++'),
}
-CC = target_cc_map[DEPTARGET]
+CC, CXX = target_cc_map[DEPTARGET]
PYTHON_3 = getVersionTuple() >= (3, 0)
@@ -135,6 +175,13 @@ USAGE = textwrap.dedent("""\
--universal-archs=x universal architectures (options: %(UNIVERSALOPTS)r, default: %(UNIVERSALARCHS)r)
""")% globals()
+# Dict of object file names with shared library names to check after building.
+# This is to ensure that we ended up dynamically linking with the shared
+# library paths and versions we expected. For example:
+# EXPECTED_SHARED_LIBS['_tkinter.so'] = [
+# '/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl',
+# '/Library/Frameworks/Tk.framework/Versions/8.5/Tk']
+EXPECTED_SHARED_LIBS = {}
# Instructions for building libraries that are necessary for building a
# batteries included python.
@@ -143,6 +190,71 @@ USAGE = textwrap.dedent("""\
def library_recipes():
result = []
+ LT_10_5 = bool(DEPTARGET < '10.5')
+
+ result.extend([
+ dict(
+ name="XZ 5.0.3",
+ url="http://tukaani.org/xz/xz-5.0.3.tar.gz",
+ checksum='fefe52f9ecd521de2a8ce38c21a27574',
+ configure_pre=[
+ '--disable-dependency-tracking',
+ ]
+ ),
+ dict(
+ name="NCurses 5.9",
+ url="http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz",
+ checksum='8cb9c412e5f2d96bc6f459aa8c6282a1',
+ configure_pre=[
+ "--enable-widec",
+ "--without-cxx",
+ "--without-cxx-binding",
+ "--without-ada",
+ "--without-curses-h",
+ "--enable-shared",
+ "--with-shared",
+ "--without-debug",
+ "--without-normal",
+ "--without-tests",
+ "--without-manpages",
+ "--datadir=/usr/share",
+ "--sysconfdir=/etc",
+ "--sharedstatedir=/usr/com",
+ "--with-terminfo-dirs=/usr/share/terminfo",
+ "--with-default-terminfo-dir=/usr/share/terminfo",
+ "--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib"%(getVersion(),),
+ ],
+ patchscripts=[
+ ("ftp://invisible-island.net/ncurses//5.9/ncurses-5.9-20120616-patch.sh.bz2",
+ "f54bf02a349f96a7c4f0d00922f3a0d4"),
+ ],
+ useLDFlags=False,
+ install='make && make install DESTDIR=%s && cd %s/usr/local/lib && ln -fs ../../../Library/Frameworks/Python.framework/Versions/%s/lib/lib* .'%(
+ shellQuote(os.path.join(WORKDIR, 'libraries')),
+ shellQuote(os.path.join(WORKDIR, 'libraries')),
+ getVersion(),
+ ),
+ ),
+ dict(
+ name="SQLite 3.7.13",
+ url="http://www.sqlite.org/sqlite-autoconf-3071300.tar.gz",
+ checksum='c97df403e8a3d5b67bb408fcd6aabd8e',
+ extra_cflags=('-Os '
+ '-DSQLITE_ENABLE_FTS4 '
+ '-DSQLITE_ENABLE_FTS3_PARENTHESIS '
+ '-DSQLITE_ENABLE_RTREE '
+ '-DSQLITE_TCL=0 '
+ '%s' % ('','-DSQLITE_WITHOUT_ZONEMALLOC ')[LT_10_5]),
+ configure_pre=[
+ '--enable-threadsafe',
+ '--enable-shared=no',
+ '--enable-static=yes',
+ '--disable-readline',
+ '--disable-dependency-tracking',
+ ]
+ ),
+ ])
+
if DEPTARGET < '10.5':
result.extend([
dict(
@@ -150,8 +262,8 @@ def library_recipes():
url="http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz",
checksum='00b516f4704d4a7cb50a1d97e6e8e15b',
configure=None,
- install='make install CC=%s PREFIX=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
- CC,
+ install='make install CC=%s CXX=%s, PREFIX=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
+ CC, CXX,
shellQuote(os.path.join(WORKDIR, 'libraries')),
' -arch '.join(ARCHLIST),
SDKPATH,
@@ -162,8 +274,8 @@ def library_recipes():
url="http://www.gzip.org/zlib/zlib-1.2.3.tar.gz",
checksum='debc62758716a169df9f62e6ab2bc634',
configure=None,
- install='make install CC=%s prefix=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
- CC,
+ install='make install CC=%s CXX=%s, prefix=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
+ CC, CXX,
shellQuote(os.path.join(WORKDIR, 'libraries')),
' -arch '.join(ARCHLIST),
SDKPATH,
@@ -178,58 +290,12 @@ def library_recipes():
patches=[
# The readline maintainers don't do actual micro releases, but
# just ship a set of patches.
- 'http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-001',
- 'http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-002',
- ]
- ),
- dict(
- name="SQLite 3.7.4",
- url="http://www.sqlite.org/sqlite-autoconf-3070400.tar.gz",
- checksum='8f0c690bfb33c3cbbc2471c3d9ba0158',
- configure_env=('CFLAGS="-Os'
- ' -DSQLITE_ENABLE_FTS3'
- ' -DSQLITE_ENABLE_FTS3_PARENTHESIS'
- ' -DSQLITE_ENABLE_RTREE'
- ' -DSQLITE_TCL=0'
- '"'),
- configure_pre=[
- '--enable-threadsafe',
- '--enable-shared=no',
- '--enable-static=yes',
- '--disable-readline',
- '--disable-dependency-tracking',
+ ('http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-001',
+ 'c642f2e84d820884b0bf9fd176bc6c3f'),
+ ('http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-002',
+ '1a76781a1ea734e831588285db7ec9b1'),
]
),
- dict(
- name="NCurses 5.5",
- url="http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.5.tar.gz",
- checksum='e73c1ac10b4bfc46db43b2ddfd6244ef',
- configure_pre=[
- "--enable-widec",
- "--without-cxx",
- "--without-ada",
- "--without-progs",
- "--without-curses-h",
- "--enable-shared",
- "--with-shared",
- "--datadir=/usr/share",
- "--sysconfdir=/etc",
- "--sharedstatedir=/usr/com",
- "--with-terminfo-dirs=/usr/share/terminfo",
- "--with-default-terminfo-dir=/usr/share/terminfo",
- "--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib"%(getVersion(),),
- "--enable-termcap",
- ],
- patches=[
- "ncurses-5.5.patch",
- ],
- useLDFlags=False,
- install='make && make install DESTDIR=%s && cd %s/usr/local/lib && ln -fs ../../../Library/Frameworks/Python.framework/Versions/%s/lib/lib* .'%(
- shellQuote(os.path.join(WORKDIR, 'libraries')),
- shellQuote(os.path.join(WORKDIR, 'libraries')),
- getVersion(),
- ),
- ),
])
if not PYTHON_3:
@@ -298,9 +364,7 @@ def pkg_recipes():
source="/pydocs",
readme="""\
This package installs the python documentation at a location
- that is useable for pydoc and IDLE. If you have installed Xcode
- it will also install a link to the documentation in
- /Developer/Documentation/Python
+ that is useable for pydoc and IDLE.
""",
postflight="scripts/postflight.documentation",
required=False,
@@ -326,7 +390,7 @@ def pkg_recipes():
),
]
- if DEPTARGET < '10.4':
+ if DEPTARGET < '10.4' and not PYTHON_3:
result.append(
dict(
name="PythonSystemFixes",
@@ -358,7 +422,7 @@ def fileContents(fn):
"""
Return the contents of the named file
"""
- return open(fn, 'rb').read()
+ return open(fn, 'r').read()
def runCommand(commandline):
"""
@@ -370,7 +434,7 @@ def runCommand(commandline):
xit = fd.close()
if xit is not None:
sys.stdout.write(data)
- raise RuntimeError, "command failed: %s"%(commandline,)
+ raise RuntimeError("command failed: %s"%(commandline,))
if VERBOSE:
sys.stdout.write(data); sys.stdout.flush()
@@ -381,7 +445,7 @@ def captureCommand(commandline):
xit = fd.close()
if xit is not None:
sys.stdout.write(data)
- raise RuntimeError, "command failed: %s"%(commandline,)
+ raise RuntimeError("command failed: %s"%(commandline,))
return data
@@ -423,39 +487,60 @@ def checkEnvironment():
# Because we only support dynamic load of only one major/minor version of
# Tcl/Tk, ensure:
# 1. there are no user-installed frameworks of Tcl/Tk with version
- # higher than the Apple-supplied system version
- # 2. there is a user-installed framework in /Library/Frameworks with the
- # same version as the system version. This allows users to choose
- # to install a newer patch level.
+ # higher than the Apple-supplied system version in
+ # SDKROOT/System/Library/Frameworks
+ # 2. there is a user-installed framework (usually ActiveTcl) in (or linked
+ # in) SDKROOT/Library/Frameworks with the same version as the system
+ # version. This allows users to choose to install a newer patch level.
+ frameworks = {}
for framework in ['Tcl', 'Tk']:
- #fw = dict(lower=framework.lower(),
- # upper=framework.upper(),
- # cap=framework.capitalize())
- #fwpth = "Library/Frameworks/%(cap)s.framework/%(lower)sConfig.sh" % fw
- fwpth = 'Library/Frameworks/Tcl.framework/Versions/Current'
+ fwpth = 'Library/Frameworks/%s.framework/Versions/Current' % framework
sysfw = os.path.join(SDKPATH, 'System', fwpth)
- libfw = os.path.join('/', fwpth)
+ libfw = os.path.join(SDKPATH, fwpth)
usrfw = os.path.join(os.getenv('HOME'), fwpth)
- #version = "%(upper)s_VERSION" % fw
+ frameworks[framework] = os.readlink(sysfw)
+ if not os.path.exists(libfw):
+ fatal("Please install a link to a current %s %s as %s so "
+ "the user can override the system framework."
+ % (framework, frameworks[framework], libfw))
if os.readlink(libfw) != os.readlink(sysfw):
fatal("Version of %s must match %s" % (libfw, sysfw) )
if os.path.exists(usrfw):
fatal("Please rename %s to avoid possible dynamic load issues."
% usrfw)
+ if frameworks['Tcl'] != frameworks['Tk']:
+ fatal("The Tcl and Tk frameworks are not the same version.")
+
+ # add files to check after build
+ EXPECTED_SHARED_LIBS['_tkinter.so'] = [
+ "/Library/Frameworks/Tcl.framework/Versions/%s/Tcl"
+ % frameworks['Tcl'],
+ "/Library/Frameworks/Tk.framework/Versions/%s/Tk"
+ % frameworks['Tk'],
+ ]
+
# Remove inherited environment variables which might influence build
environ_var_prefixes = ['CPATH', 'C_INCLUDE_', 'DYLD_', 'LANG', 'LC_',
'LD_', 'LIBRARY_', 'PATH', 'PYTHON']
for ev in list(os.environ):
for prefix in environ_var_prefixes:
if ev.startswith(prefix) :
- print "INFO: deleting environment variable %s=%s" % (
- ev, os.environ[ev])
+ print("INFO: deleting environment variable %s=%s" % (
+ ev, os.environ[ev]))
del os.environ[ev]
- os.environ['PATH'] = '/bin:/sbin:/usr/bin:/usr/sbin'
- print "Setting default PATH: %s"%(os.environ['PATH'])
+ base_path = '/bin:/sbin:/usr/bin:/usr/sbin'
+ if 'SDK_TOOLS_BIN' in os.environ:
+ base_path = os.environ['SDK_TOOLS_BIN'] + ':' + base_path
+ # Xcode 2.5 on OS X 10.4 does not include SetFile in its usr/bin;
+ # add its fixed location here if it exists
+ OLD_DEVELOPER_TOOLS = '/Developer/Tools'
+ if os.path.isdir(OLD_DEVELOPER_TOOLS):
+ base_path = base_path + ':' + OLD_DEVELOPER_TOOLS
+ os.environ['PATH'] = base_path
+ print("Setting default PATH: %s"%(os.environ['PATH']))
def parseOptions(args=None):
@@ -463,7 +548,7 @@ def parseOptions(args=None):
Parse arguments and update global settings.
"""
global WORKDIR, DEPSRC, SDKPATH, SRCDIR, DEPTARGET
- global UNIVERSALOPTS, UNIVERSALARCHS, ARCHLIST, CC
+ global UNIVERSALOPTS, UNIVERSALARCHS, ARCHLIST, CC, CXX
if args is None:
args = sys.argv[1:]
@@ -472,18 +557,18 @@ def parseOptions(args=None):
options, args = getopt.getopt(args, '?hb',
[ 'build-dir=', 'third-party=', 'sdk-path=' , 'src-dir=',
'dep-target=', 'universal-archs=', 'help' ])
- except getopt.error, msg:
- print msg
+ except getopt.GetoptError:
+ print(sys.exc_info()[1])
sys.exit(1)
if args:
- print "Additional arguments"
+ print("Additional arguments")
sys.exit(1)
deptarget = None
for k, v in options:
if k in ('-h', '-?', '--help'):
- print USAGE
+ print(USAGE)
sys.exit(0)
elif k in ('-d', '--build-dir'):
@@ -511,27 +596,28 @@ def parseOptions(args=None):
# target
DEPTARGET = default_target_map.get(v, '10.3')
else:
- raise NotImplementedError, v
+ raise NotImplementedError(v)
else:
- raise NotImplementedError, k
+ raise NotImplementedError(k)
SRCDIR=os.path.abspath(SRCDIR)
WORKDIR=os.path.abspath(WORKDIR)
SDKPATH=os.path.abspath(SDKPATH)
DEPSRC=os.path.abspath(DEPSRC)
- CC=target_cc_map[DEPTARGET]
+ CC, CXX=target_cc_map[DEPTARGET]
- print "Settings:"
- print " * Source directory:", SRCDIR
- print " * Build directory: ", WORKDIR
- print " * SDK location: ", SDKPATH
- print " * Third-party source:", DEPSRC
- print " * Deployment target:", DEPTARGET
- print " * Universal architectures:", ARCHLIST
- print " * C compiler:", CC
- print ""
+ print("Settings:")
+ print(" * Source directory:", SRCDIR)
+ print(" * Build directory: ", WORKDIR)
+ print(" * SDK location: ", SDKPATH)
+ print(" * Third-party source:", DEPSRC)
+ print(" * Deployment target:", DEPTARGET)
+ print(" * Universal architectures:", ARCHLIST)
+ print(" * C compiler:", CC)
+ print(" * C++ compiler:", CXX)
+ print("")
@@ -576,31 +662,18 @@ def extractArchive(builddir, archiveName):
xit = fp.close()
if xit is not None:
sys.stdout.write(data)
- raise RuntimeError, "Cannot extract %s"%(archiveName,)
+ raise RuntimeError("Cannot extract %s"%(archiveName,))
return os.path.join(builddir, retval)
finally:
os.chdir(curdir)
-KNOWNSIZES = {
- "http://ftp.gnu.org/pub/gnu/readline/readline-5.1.tar.gz": 7952742,
- "http://downloads.sleepycat.com/db-4.4.20.tar.gz": 2030276,
-}
-
def downloadURL(url, fname):
"""
Download the contents of the url into the file.
"""
- try:
- size = os.path.getsize(fname)
- except OSError:
- pass
- else:
- if KNOWNSIZES.get(url) == size:
- print "Using existing file for", url
- return
- fpIn = urllib2.urlopen(url)
+ fpIn = urllib_request.urlopen(url)
fpOut = open(fname, 'wb')
block = fpIn.read(10240)
try:
@@ -615,6 +688,24 @@ def downloadURL(url, fname):
except:
pass
+def verifyThirdPartyFile(url, checksum, fname):
+ """
+ Download file from url to filename fname if it does not already exist.
+ Abort if file contents does not match supplied md5 checksum.
+ """
+ name = os.path.basename(fname)
+ if os.path.exists(fname):
+ print("Using local copy of %s"%(name,))
+ else:
+ print("Did not find local copy of %s"%(name,))
+ print("Downloading %s"%(name,))
+ downloadURL(url, fname)
+ print("Archive for %s stored as %s"%(name, fname))
+ if os.system(
+ 'MD5=$(openssl md5 %s) ; test "${MD5##*= }" = "%s"'
+ % (shellQuote(fname), checksum) ):
+ fatal('MD5 checksum mismatch for file %s' % fname)
+
def buildRecipe(recipe, basedir, archList):
"""
Build software using a recipe. This function does the
@@ -635,17 +726,8 @@ def buildRecipe(recipe, basedir, archList):
if not os.path.exists(DEPSRC):
os.mkdir(DEPSRC)
-
- if os.path.exists(sourceArchive):
- print "Using local copy of %s"%(name,)
-
- else:
- print "Did not find local copy of %s"%(name,)
- print "Downloading %s"%(name,)
- downloadURL(url, sourceArchive)
- print "Archive for %s stored as %s"%(name, sourceArchive)
-
- print "Extracting archive for %s"%(name,)
+ verifyThirdPartyFile(url, recipe['checksum'], sourceArchive)
+ print("Extracting archive for %s"%(name,))
buildDir=os.path.join(WORKDIR, '_bld')
if not os.path.exists(buildDir):
os.mkdir(buildDir)
@@ -655,18 +737,31 @@ def buildRecipe(recipe, basedir, archList):
if 'buildDir' in recipe:
os.chdir(recipe['buildDir'])
-
- for fn in recipe.get('patches', ()):
- if fn.startswith('http://'):
- # Download the patch before applying it.
- path = os.path.join(DEPSRC, os.path.basename(fn))
- downloadURL(fn, path)
- fn = path
-
- fn = os.path.join(curdir, fn)
+ for patch in recipe.get('patches', ()):
+ if isinstance(patch, tuple):
+ url, checksum = patch
+ fn = os.path.join(DEPSRC, os.path.basename(url))
+ verifyThirdPartyFile(url, checksum, fn)
+ else:
+ # patch is a file in the source directory
+ fn = os.path.join(curdir, patch)
runCommand('patch -p%s < %s'%(recipe.get('patchlevel', 1),
shellQuote(fn),))
+ for patchscript in recipe.get('patchscripts', ()):
+ if isinstance(patchscript, tuple):
+ url, checksum = patchscript
+ fn = os.path.join(DEPSRC, os.path.basename(url))
+ verifyThirdPartyFile(url, checksum, fn)
+ else:
+ # patch is a file in the source directory
+ fn = os.path.join(curdir, patchscript)
+ if fn.endswith('.bz2'):
+ runCommand('bunzip2 -fk %s' % shellQuote(fn))
+ fn = fn[:-4]
+ runCommand('sh %s' % shellQuote(fn))
+ os.unlink(fn)
+
if configure is not None:
configure_args = [
"--prefix=/usr/local",
@@ -685,40 +780,44 @@ def buildRecipe(recipe, basedir, archList):
if recipe.get('useLDFlags', 1):
configure_args.extend([
- "CFLAGS=-arch %s -isysroot %s -I%s/usr/local/include"%(
+ "CFLAGS=%s-mmacosx-version-min=%s -arch %s -isysroot %s "
+ "-I%s/usr/local/include"%(
+ recipe.get('extra_cflags', ''),
+ DEPTARGET,
' -arch '.join(archList),
shellQuote(SDKPATH)[1:-1],
shellQuote(basedir)[1:-1],),
- "LDFLAGS=-syslibroot,%s -L%s/usr/local/lib -arch %s"%(
+ "LDFLAGS=-mmacosx-version-min=%s -syslibroot,%s -L%s/usr/local/lib -arch %s"%(
+ DEPTARGET,
shellQuote(SDKPATH)[1:-1],
shellQuote(basedir)[1:-1],
' -arch '.join(archList)),
])
else:
configure_args.extend([
- "CFLAGS=-arch %s -isysroot %s -I%s/usr/local/include"%(
+ "CFLAGS=%s-mmacosx-version-min=%s -arch %s -isysroot %s "
+ "-I%s/usr/local/include"%(
+ recipe.get('extra_cflags', ''),
+ DEPTARGET,
' -arch '.join(archList),
shellQuote(SDKPATH)[1:-1],
shellQuote(basedir)[1:-1],),
])
if 'configure_post' in recipe:
- configure_args = configure_args = list(recipe['configure_post'])
+ configure_args = configure_args + list(recipe['configure_post'])
configure_args.insert(0, configure)
configure_args = [ shellQuote(a) for a in configure_args ]
- if 'configure_env' in recipe:
- configure_args.insert(0, recipe['configure_env'])
-
- print "Running configure for %s"%(name,)
+ print("Running configure for %s"%(name,))
runCommand(' '.join(configure_args) + ' 2>&1')
- print "Running install for %s"%(name,)
+ print("Running install for %s"%(name,))
runCommand('{ ' + install + ' ;} 2>&1')
- print "Done %s"%(name,)
- print ""
+ print("Done %s"%(name,))
+ print("")
os.chdir(curdir)
@@ -726,9 +825,9 @@ def buildLibraries():
"""
Build our dependencies into $WORKDIR/libraries/usr/local
"""
- print ""
- print "Building required libraries"
- print ""
+ print("")
+ print("Building required libraries")
+ print("")
universal = os.path.join(WORKDIR, 'libraries')
os.mkdir(universal)
os.makedirs(os.path.join(universal, 'usr', 'local', 'lib'))
@@ -742,7 +841,7 @@ def buildLibraries():
def buildPythonDocs():
# This stores the documentation as Resources/English.lproj/Documentation
# inside the framwork. pydoc and IDLE will pick it up there.
- print "Install python documentation"
+ print("Install python documentation")
rootDir = os.path.join(WORKDIR, '_root')
buildDir = os.path.join('../../Doc')
docdir = os.path.join(rootDir, 'pydocs')
@@ -757,7 +856,7 @@ def buildPythonDocs():
def buildPython():
- print "Building a universal python for %s architectures" % UNIVERSALARCHS
+ print("Building a universal python for %s architectures" % UNIVERSALARCHS)
buildDir = os.path.join(WORKDIR, '_bld', 'python')
rootDir = os.path.join(WORKDIR, '_root')
@@ -785,7 +884,7 @@ def buildPython():
# will find them during its extension import sanity checks.
os.environ['DYLD_LIBRARY_PATH'] = os.path.join(WORKDIR,
'libraries', 'usr', 'local', 'lib')
- print "Running configure..."
+ print("Running configure...")
runCommand("%s -C --enable-framework --enable-universalsdk=%s "
"--with-universal-archs=%s "
"%s "
@@ -797,19 +896,19 @@ def buildPython():
shellQuote(WORKDIR)[1:-1],
shellQuote(WORKDIR)[1:-1]))
- print "Running make"
+ print("Running make")
runCommand("make")
- print "Running make install"
+ print("Running make install")
runCommand("make install DESTDIR=%s"%(
shellQuote(rootDir)))
- print "Running make frameworkinstallextras"
+ print("Running make frameworkinstallextras")
runCommand("make frameworkinstallextras DESTDIR=%s"%(
shellQuote(rootDir)))
del os.environ['DYLD_LIBRARY_PATH']
- print "Copying required shared libraries"
+ print("Copying required shared libraries")
if os.path.exists(os.path.join(WORKDIR, 'libraries', 'Library')):
runCommand("mv %s/* %s"%(
shellQuote(os.path.join(
@@ -820,16 +919,16 @@ def buildPython():
'Python.framework', 'Versions', getVersion(),
'lib'))))
- print "Fix file modes"
+ print("Fix file modes")
frmDir = os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework')
gid = grp.getgrnam('admin').gr_gid
+ shared_lib_error = False
for dirpath, dirnames, filenames in os.walk(frmDir):
for dn in dirnames:
- os.chmod(os.path.join(dirpath, dn), 0775)
+ os.chmod(os.path.join(dirpath, dn), STAT_0o775)
os.chown(os.path.join(dirpath, dn), -1, gid)
-
for fn in filenames:
if os.path.islink(fn):
continue
@@ -840,6 +939,19 @@ def buildPython():
os.chmod(p, stat.S_IMODE(st.st_mode) | stat.S_IWGRP)
os.chown(p, -1, gid)
+ if fn in EXPECTED_SHARED_LIBS:
+ # check to see that this file was linked with the
+ # expected library path and version
+ data = captureCommand("otool -L %s" % shellQuote(p))
+ for sl in EXPECTED_SHARED_LIBS[fn]:
+ if ("\t%s " % sl) not in data:
+ print("Expected shared lib %s was not linked with %s"
+ % (sl, p))
+ shared_lib_error = True
+
+ if shared_lib_error:
+ fatal("Unexpected shared library errors.")
+
if PYTHON_3:
LDVERSION=None
VERSION=None
@@ -863,19 +975,26 @@ def buildPython():
# We added some directories to the search path during the configure
# phase. Remove those because those directories won't be there on
- # the end-users system.
- path =os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework',
- 'Versions', version, 'lib', 'python%s'%(version,),
- 'config' + config_suffix, 'Makefile')
- fp = open(path, 'r')
- data = fp.read()
- fp.close()
+ # the end-users system. Also remove the directories from _sysconfigdata.py
+ # (added in 3.3) if it exists.
+
+ path_to_lib = os.path.join(rootDir, 'Library', 'Frameworks',
+ 'Python.framework', 'Versions',
+ version, 'lib', 'python%s'%(version,))
+ paths = [os.path.join(path_to_lib, 'config' + config_suffix, 'Makefile'),
+ os.path.join(path_to_lib, '_sysconfigdata.py')]
+ for path in paths:
+ if not os.path.exists(path):
+ continue
+ fp = open(path, 'r')
+ data = fp.read()
+ fp.close()
- data = data.replace('-L%s/libraries/usr/local/lib'%(WORKDIR,), '')
- data = data.replace('-I%s/libraries/usr/local/include'%(WORKDIR,), '')
- fp = open(path, 'w')
- fp.write(data)
- fp.close()
+ data = data.replace(' -L%s/libraries/usr/local/lib'%(WORKDIR,), '')
+ data = data.replace(' -I%s/libraries/usr/local/include'%(WORKDIR,), '')
+ fp = open(path, 'w')
+ fp.write(data)
+ fp.close()
# Add symlinks in /usr/local/bin, using relative links
usr_local_bin = os.path.join(rootDir, 'usr', 'local', 'bin')
@@ -907,17 +1026,17 @@ def patchFile(inPath, outPath):
# This one is not handy as a template variable
data = data.replace('$PYTHONFRAMEWORKINSTALLDIR', '/Library/Frameworks/Python.framework')
- fp = open(outPath, 'wb')
+ fp = open(outPath, 'w')
fp.write(data)
fp.close()
def patchScript(inPath, outPath):
data = fileContents(inPath)
data = data.replace('@PYVER@', getVersion())
- fp = open(outPath, 'wb')
+ fp = open(outPath, 'w')
fp.write(data)
fp.close()
- os.chmod(outPath, 0755)
+ os.chmod(outPath, STAT_0o755)
@@ -934,7 +1053,7 @@ def packageFromRecipe(targetDir, recipe):
readme = textwrap.dedent(recipe['readme'])
isRequired = recipe.get('required', True)
- print "- building package %s"%(pkgname,)
+ print("- building package %s"%(pkgname,))
# Substitute some variables
textvars = dict(
@@ -979,7 +1098,7 @@ def packageFromRecipe(targetDir, recipe):
patchScript(postflight, os.path.join(rsrcDir, 'postflight'))
vers = getFullVersion()
- major, minor = map(int, getVersion().split('.', 2))
+ major, minor = getVersionMajorMinor()
pl = Plist(
CFBundleGetInfoString="Python.%s %s"%(pkgname, vers,),
CFBundleIdentifier='org.python.Python.%s'%(pkgname,),
@@ -1016,7 +1135,7 @@ def packageFromRecipe(targetDir, recipe):
def makeMpkgPlist(path):
vers = getFullVersion()
- major, minor = map(int, getVersion().split('.', 2))
+ major, minor = getVersionMajorMinor()
pl = Plist(
CFBundleGetInfoString="Python %s"%(vers,),
@@ -1127,7 +1246,7 @@ def buildDMG():
# Custom icon for the DMG, shown when the DMG is mounted.
shutil.copy("../Icons/Disk Image.icns",
os.path.join(WORKDIR, "mnt", volname, ".VolumeIcon.icns"))
- runCommand("/Developer/Tools/SetFile -a C %s/"%(
+ runCommand("SetFile -a C %s/"%(
shellQuote(os.path.join(WORKDIR, "mnt", volname)),))
runCommand("hdiutil detach %s"%(shellQuote(os.path.join(WORKDIR, "mnt", volname))))
@@ -1168,6 +1287,7 @@ def main():
os.environ['MACOSX_DEPLOYMENT_TARGET'] = DEPTARGET
os.environ['CC'] = CC
+ os.environ['CXX'] = CXX
if os.path.exists(WORKDIR):
shutil.rmtree(WORKDIR)
@@ -1198,7 +1318,7 @@ def main():
folder = os.path.join(WORKDIR, "_root", "Applications", "Python %s"%(
getVersion(),))
- os.chmod(folder, 0755)
+ os.chmod(folder, STAT_0o755)
setIcon(folder, "../Icons/Python Folder.icns")
# Create the installer
@@ -1211,9 +1331,9 @@ def main():
shutil.copy('../../LICENSE', os.path.join(WORKDIR, 'installer', 'License.txt'))
fp = open(os.path.join(WORKDIR, 'installer', 'Build.txt'), 'w')
- print >> fp, "# BUILD INFO"
- print >> fp, "# Date:", time.ctime()
- print >> fp, "# By:", pwd.getpwuid(os.getuid()).pw_gecos
+ fp.write("# BUILD INFO\n")
+ fp.write("# Date: %s\n" % time.ctime())
+ fp.write("# By: %s\n" % pwd.getpwuid(os.getuid()).pw_gecos)
fp.close()
# And copy it to a DMG
diff --git a/Mac/BuildScript/ncurses-5.5.patch b/Mac/BuildScript/ncurses-5.5.patch
deleted file mode 100644
index 0eab3d3..0000000
--- a/Mac/BuildScript/ncurses-5.5.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-diff -r -u ncurses-5.5-orig/test/Makefile.in ncurses-5.5/test/Makefile.in
---- ncurses-5.5-orig/test/Makefile.in 2006-03-24 12:47:40.000000000 +0100
-+++ ncurses-5.5/test/Makefile.in 2006-03-24 12:47:50.000000000 +0100
-@@ -75,7 +75,7 @@
- MATH_LIB = @MATH_LIB@
-
- LD = @LD@
--LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CC) $(CFLAGS)
-+LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CC)
-
- usFLAGS = @LD_MODEL@ @LOCAL_LDFLAGS@ @LDFLAGS@
-
-diff -ru ncurses-5.5-orig/ncurses/tinfo/read_entry.c ncurses-5.5/ncurses/tinfo/read_entry.c
---- ncurses-5.5-orig/ncurses/tinfo/read_entry.c 2004-01-11 02:57:05.000000000 +0100
-+++ ncurses-5.5/ncurses/tinfo/read_entry.c 2006-03-25 22:49:39.000000000 +0100
-@@ -474,7 +474,7 @@
- }
-
- /* truncate the terminal name to prevent buffer overflow */
-- (void) sprintf(ttn, "%c/%.*s", *tn, (int) sizeof(ttn) - 3, tn);
-+ (void) sprintf(ttn, "%x/%.*s", *tn, (int) sizeof(ttn) - 3, tn);
-
- /* This is System V behavior, in conjunction with our requirements for
- * writing terminfo entries.
-diff -ru ncurses-5.5-orig/configure ncurses-5.5/configure
---- ncurses-5.5-orig/configure 2005-09-24 23:50:50.000000000 +0200
-+++ ncurses-5.5/configure 2006-03-26 22:24:59.000000000 +0200
-@@ -5027,7 +5027,7 @@
- darwin*)
- EXTRA_CFLAGS="-no-cpp-precomp"
- CC_SHARED_OPTS="-dynamic"
-- MK_SHARED_LIB='$(CC) -dynamiclib -install_name $(DESTDIR)$(libdir)/`basename $@` -compatibility_version $(ABI_VERSION) -current_version $(ABI_VERSION) -o $@'
-+ MK_SHARED_LIB='$(CC) $(CFLAGS) -dynamiclib -install_name $(DESTDIR)$(libdir)/`basename $@` -compatibility_version $(ABI_VERSION) -current_version $(ABI_VERSION) -o $@'
- test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
- cf_cv_shlib_version_infix=yes
- ;;
diff --git a/Mac/BuildScript/resources/ReadMe.txt b/Mac/BuildScript/resources/ReadMe.txt
index f1beda0..9ac52d0 100644
--- a/Mac/BuildScript/resources/ReadMe.txt
+++ b/Mac/BuildScript/resources/ReadMe.txt
@@ -5,8 +5,15 @@ $ARCHITECTURES.
Installation requires approximately $INSTALL_SIZE MB of disk space,
ignore the message that it will take zero bytes.
-You must install onto your current boot disk, even though the
-installer does not enforce this, otherwise things will not work.
+If you are attempting to install on an OS X 10.8 system, you may
+see a message that Python can't be installed because it is from an
+unidentified developer. This is because this Python installer
+package is not yet compatible with the Gatekeeper security feature
+introduced in OS X 10.8. To allow Python to be installed, you
+can override the Gatekeeper policy for this install. In the Finder,
+instead of double-clicking, control-click or right click the "Python"
+installer package icon. Then select "Open using ... Installer" from
+the contextual menu that appears.
Python consists of the Python programming language interpreter, plus
a set of programs to allow easy access to it for Mac users including
@@ -16,10 +23,11 @@ Python programs.
**** IMPORTANT ****
-Before using IDLE or other programs using the tkinter graphical user
-interface toolkit, visit http://www.python.org/download/mac/tcltk/
-for current information about supported and recommended versions
-of Tcl/Tk for this version of Python and Mac OS X.
+To use IDLE or other programs that use the tkinter graphical user
+interface toolkit, you may need to install a third-party version of
+the Tcl/Tk frameworks. Visit http://www.python.org/download/mac/tcltk/
+for current information about supported and recommended versions of
+Tcl/Tk for this version of Python and of Mac OS X.
*******************
@@ -32,5 +40,13 @@ optionally place links to the command-line tools in /usr/local/bin as
well. Double-click on the "Update Shell Profile" command to add the
"bin" directory inside the framework to your shell's search path.
+You must install onto your current boot disk, even though the
+installer does not enforce this, otherwise things will not work.
+
+You can verify the integrity of the disk image file containing the
+installer package and this ReadMe file by comparing its md5 checksum
+and size with the values published on the release page linked at
+http://www.python.org/download/
+
More information on Python in general can be found at
http://www.python.org.
diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf
index d209b10..86fbf63 100644
--- a/Mac/BuildScript/resources/Welcome.rtf
+++ b/Mac/BuildScript/resources/Welcome.rtf
@@ -1,8 +1,8 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
+{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw11904\paperh16836\margl1440\margr1440\vieww9640\viewh10620\viewkind0
-\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural
+\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640
\f0\fs24 \cf0 This package will install
\b Python $FULL_VERSION
@@ -20,9 +20,9 @@ See the ReadMe file and the Python documentation for more information.\
\
\b NOTE:
-\b0 This package will by default not update your shell profile and will also not install files in /usr/local. Double-click
+\b0 This package will not update your shell profile by default. Double-click
\b Update Shell Profile
-\b0 at any time to make $FULL_VERSION the default Python.\
+\b0 at any time to make $FULL_VERSION the default Python 3 version. This version can co-exist with other installed versions of Python 3 and Python 2.\
\
\b IMPORTANT:
diff --git a/Mac/BuildScript/scripts/postflight.documentation b/Mac/BuildScript/scripts/postflight.documentation
index 31fbf2f..c4ba616 100755
--- a/Mac/BuildScript/scripts/postflight.documentation
+++ b/Mac/BuildScript/scripts/postflight.documentation
@@ -5,19 +5,10 @@ FWK="/Library/Frameworks/Python.framework/Versions/${PYVER}"
FWK_DOCDIR_SUBPATH="Resources/English.lproj/Documentation"
FWK_DOCDIR="${FWK}/${FWK_DOCDIR_SUBPATH}"
APPDIR="/Applications/Python ${PYVER}"
-DEV_DOCDIR="/Developer/Documentation"
SHARE_DIR="${FWK}/share"
SHARE_DOCDIR="${SHARE_DIR}/doc/python${PYVER}"
SHARE_DOCDIR_TO_FWK="../../.."
-# make link in /Developer/Documentation/ for Xcode users
-if [ -d "${DEV_DOCDIR}" ]; then
- if [ ! -d "${DEV_DOCDIR}/Python" ]; then
- mkdir -p "${DEV_DOCDIR}/Python"
- fi
- ln -fhs "${FWK_DOCDIR}" "${DEV_DOCDIR}/Python/Reference Documentation ${PYVER}"
-fi
-
# make link in /Applications/Python m.n/ for Finder users
if [ -d "${APPDIR}" ]; then
ln -fhs "${FWK_DOCDIR}/index.html" "${APPDIR}/Python Documentation.html"
diff --git a/Mac/BuildScript/scripts/postflight.framework b/Mac/BuildScript/scripts/postflight.framework
index 9fc9151..eb08297 100755
--- a/Mac/BuildScript/scripts/postflight.framework
+++ b/Mac/BuildScript/scripts/postflight.framework
@@ -8,14 +8,24 @@ FWK="/Library/Frameworks/Python.framework/Versions/@PYVER@"
"${FWK}/bin/python@PYVER@" -Wi \
"${FWK}/lib/python${PYVER}/compileall.py" \
- -x badsyntax -x site-packages \
+ -f -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
"${FWK}/lib/python${PYVER}"
"${FWK}/bin/python@PYVER@" -Wi -O \
"${FWK}/lib/python${PYVER}/compileall.py" \
- -x badsyntax -x site-packages \
+ -f -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
"${FWK}/lib/python${PYVER}"
+"${FWK}/bin/python@PYVER@" -Wi \
+ "${FWK}/lib/python${PYVER}/compileall.py" \
+ -f -x badsyntax \
+ "${FWK}/lib/python${PYVER}/site-packages"
+
+"${FWK}/bin/python@PYVER@" -Wi -O \
+ "${FWK}/lib/python${PYVER}/compileall.py" \
+ -f -x badsyntax \
+ "${FWK}/lib/python${PYVER}/site-packages"
+
chgrp -R admin "${FWK}"
chmod -R g+w "${FWK}"
diff --git a/Mac/Makefile.in b/Mac/Makefile.in
index 8a62a90..354c1fd 100644
--- a/Mac/Makefile.in
+++ b/Mac/Makefile.in
@@ -40,14 +40,13 @@ INSTALL_SCRIPT= @INSTALL_SCRIPT@
INSTALL_DATA=@INSTALL_DATA@
LN=@LN@
STRIPFLAG=-s
-CPMAC=/Developer/Tools/CpMac
+CPMAC=CpMac
APPTEMPLATE=$(srcdir)/Resources/app
-APPSUBDIRS=MacOS Resources
+APPSUBDIRS=MacOS Resources
compileall=$(srcdir)/../Lib/compileall.py
-installapps: install_Python install_pythonw install_PythonLauncher install_IDLE \
- checkapplepython
+installapps: install_Python install_pythonw install_PythonLauncher install_IDLE
install_pythonw: pythonw
$(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)"
@@ -72,7 +71,7 @@ installunixtools:
for fn in python3 pythonw3 idle3 pydoc3 python3-config \
python$(VERSION) pythonw$(VERSION) idle$(VERSION) \
pydoc$(VERSION) python$(VERSION)-config 2to3 \
- 2to3-$(VERSION) ;\
+ 2to3-$(VERSION) pyvenv pyvenv-$(VERSION) ;\
do \
ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\
done
@@ -93,7 +92,7 @@ altinstallunixtools:
$(INSTALL) -d -m $(DIRMODE) "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" ;\
fi
for fn in python$(VERSION) pythonw$(VERSION) idle$(VERSION) \
- pydoc$(VERSION) python$(VERSION)-config 2to3-$(VERSION);\
+ pydoc$(VERSION) python$(VERSION)-config 2to3-$(VERSION) pyvenv-$(VERSION) ;\
do \
ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\
done
@@ -196,14 +195,6 @@ installextras: $(srcdir)/Extras.install.py
"$(DESTDIR)$(prefix)/share/doc/python$(VERSION)/examples/Tools" ; \
chmod -R ugo+rX,go-w "$(DESTDIR)$(prefix)/share/doc/python$(VERSION)/examples/Tools"
-
-checkapplepython: $(srcdir)/Tools/fixapplepython23.py
- @if ! $(RUNSHARED) $(BUILDPYTHON) $(srcdir)/Tools/fixapplepython23.py -n; then \
- echo "* WARNING: Apple-installed Python 2.3 will have trouble building extensions from now on."; \
- echo "* WARNING: Run $(srcdir)/Tools/fixapplepython23.py with \"sudo\" to fix this."; \
- fi
-
-
clean:
rm pythonw
cd PythonLauncher && make clean
diff --git a/Mac/README b/Mac/README
index 6853db4..f7bc6c3 100644
--- a/Mac/README
+++ b/Mac/README
@@ -1,6 +1,13 @@
-============
-MacOSX Notes
-============
+=========================
+Python on Mac OS X README
+=========================
+
+:Authors:
+ Jack Jansen (2004-07),
+ Ronald Oussoren (2010-04),
+ Ned Deily (2012-06)
+
+:Version: 3.3.0
This document provides a quick overview of some Mac OS X specific features in
the Python distribution.
@@ -12,11 +19,11 @@ the Python distribution.
_`Building and using a framework-based Python on Mac OS X` for more
information on frameworks.
- If the optional directory argument is specified the framework it installed
+ If the optional directory argument is specified the framework is installed
into that directory. This can be used to install a python framework into
your home directory::
- $ configure --enable-framework=/Users/ronald/Library/Frameworks
+ $ ./configure --enable-framework=/Users/ronald/Library/Frameworks
$ make && make install
This will install the framework itself in ``/Users/ronald/Library/Frameworks``,
@@ -33,9 +40,10 @@ the Python distribution.
Create a universal binary build of of Python. This can be used with both
regular and framework builds.
- The optional argument specifies which OSX SDK should be used to perform the
- build. This defaults to ``/Developer/SDKs/MacOSX.10.4u.sdk``, specify
- ``/`` when building on a 10.5 system, especially when building 64-bit code.
+ The optional argument specifies which OS X SDK should be used to perform the
+ build. If xcodebuild is available and configured, this defaults to
+ the Xcode default MacOS X SDK, otherwise ``/Developer/SDKs/MacOSX.10.4u.sdk``
+ if available or ``/`` if not.
See the section _`Building and using a universal binary of Python on Mac OS X`
for more information.
@@ -43,7 +51,9 @@ the Python distribution.
* ``--with-univeral-archs=VALUE``
Specify the kind of universal binary that should be created. This option is
- only valid when ``--enable-universalsdk`` is specified.
+ only valid when ``--enable-universalsdk`` is specified. The default is
+ ``32-bit`` if a building with a SDK that supports PPC, otherwise defaults
+ to ``intel``.
Building and using a universal binary of Python on Mac OS X
@@ -52,9 +62,14 @@ Building and using a universal binary of Python on Mac OS X
1. What is a universal binary
-----------------------------
-A universal binary build of Python contains object code for both PPC and i386
-and can therefore run at native speed on both classic powerpc based macs and
-the newer intel based macs.
+A universal binary build of Python contains object code for more than one
+CPU architecture. A universal OS X executable file or library combines the
+architecture-specific code into one file and can therefore run at native
+speed on all supported architectures. Universal files were introduced in
+OS X 10.4 to add support for Intel-based Macs to the existing PowerPC (PPC)
+machines. In OS X 10.5 support was extended to 64-bit Intel and 64-bit PPC
+architectures. It is possible to build Python with various combinations
+of architectures depending on the build tools and OS X version in use.
2. How do I build a universal binary
------------------------------------
@@ -67,38 +82,55 @@ flag to configure::
$ make install
This flag can be used with a framework build of python, but also with a classic
-unix build. Either way you will have to build python on Mac OS X 10.4 (or later)
-with Xcode 2.1 (or later). You also have to install the 10.4u SDK when
-installing Xcode.
-
-2.1 Flavours of universal binaries
-..................................
-
-It is possible to build a number of flavours of the universal binary build,
-the default is a 32-bit only binary (i386 and ppc). The flavour can be
-specified using the option ``--with-universal-archs=VALUE``. The following
+unix build. Universal builds were first supported with OS X 10.4 with Xcode 2.1
+and the 10.4u SDK. Starting with Xcode 3 and OS X 10.5, more configurations are
+available.
+
+2.1 Flavors of universal binaries
+.................................
+
+It is possible to build a number of flavors of the universal binary build,
+the default is a 32-bit only binary (i386 and ppc) in build environments that
+support ppc (10.4 with Xcode 2, 10.5 and 10.6 with Xcode 3) or an
+Intel-32/-64-bit binary (i386 and X86_64) in build environments that do not
+support ppc (Xcode 4 on 10.6 and later systems). The flavor can be specified
+using the configure option ``--with-universal-archs=VALUE``. The following
values are available:
+ * ``intel``: ``i386``, ``x86_64``
+
* ``32-bit``: ``ppc``, ``i386``
+ * ``3-way``: ``i386``, ``x86_64``, ``ppc``
+
* ``64-bit``: ``ppc64``, ``x86_64``
* ``all``: ``ppc``, ``ppc64``, ``i386``, ``x86_64``
- * ``3-way``: ``ppc``, ``i386`` and ``x86_64``
+To build a universal binary that includes a 64-bit architecture, you must build
+on a system running OS X 10.5 or later. The ``all`` and ``64-bit`` flavors can
+only be built with an 10.5 SDK because ``ppc64`` support was only included with
+OS X 10.5. Although legacy ``ppc`` support was included with Xcode 3 on OS X
+10.6, it was removed in Xcode 4, versions of which were released on OS X 10.6
+and which is the current standard for OS X 10.7 and 10.8. To summarize, the
+following combinations of SDKs and universal-archs flavors are available:
- * ``intel``: ``i386``, ``x86_64``
+ * 10.4u SDK with Xcode 2 supports ``32-bit`` only
-To build a universal binary that includes a 64-bit architecture, you must build
-on a system running OSX 10.5 or later. The ``all`` flavour can only be built on
-OSX 10.5.
+ * 10.5 SDK with Xcode 3.1.x supports all flavors
+
+ * 10.6 SDK with Xcode 3.2.x supports ``intel``, ``3-way``, and ``32-bit``
+
+ * 10.6 SDK with Xcode 4 supports ``intel`` only
+
+ * 10.7 and 10.8 SDKs with Xcode 4 support ``intel`` only
-The makefile for a framework build will install ``python32`` and ``pythonw32``
-binaries when the universal architecures includes at least one 32-bit architecture
-(that is, for all flavours but ``64-bit``).
+The makefile for a framework build will also install ``python3.3-32``
+binaries when the universal architecture includes at least one 32-bit
+architecture (that is, for all flavors but ``64-bit``).
-Running a specific archicture
-.............................
+Running a specific architecture
+...............................
You can run code using a specific architecture using the ``arch`` command::
@@ -113,6 +145,14 @@ Python 2.7 or 3.2, in earlier versions the python (and pythonw) commands are
wrapper tools that execute the real interpreter without ensuring that the
real interpreter runs with the same architecture.
+Using ``arch`` is not a perfect solution as the selected architecture will
+not automatically carry through to subprocesses launched by programs and tests
+under that Python. If you want to ensure that Python interpreters launched in
+subprocesses also run in 32-bit-mode if the main interpreter does, use
+a ``python3.3-32`` binary and use the value of ``sys.executable`` as the
+``subprocess`` ``Popen`` executable value.
+
+
Building and using a framework-based Python on Mac OS X.
========================================================
@@ -122,17 +162,17 @@ Building and using a framework-based Python on Mac OS X.
The main reason is because you want to create GUI programs in Python. With the
exception of X11/XDarwin-based GUI toolkits all GUI programs need to be run
-from a fullblown MacOSX application (a ".app" bundle).
+from a Mac OSX application bundle (".app").
While it is technically possible to create a .app without using frameworks you
will have to do the work yourself if you really want this.
A second reason for using frameworks is that they put Python-related items in
only two places: "/Library/Framework/Python.framework" and
-"/Applications/MacPython <VERSION>" where ``<VERSION>`` can be e.g. "2.6",
-"3.1", etc.. This simplifies matters for users installing
+"/Applications/Python <VERSION>" where ``<VERSION>`` can be e.g. "3.3",
+"2.7", etc. This simplifies matters for users installing
Python from a binary distribution if they want to get rid of it again. Moreover,
-due to the way frameworks work a user without admin privileges can install a
+due to the way frameworks work, a user without admin privileges can install a
binary distribution in his or her home directory without recompilation.
2. How does a framework Python differ from a normal static Python?
@@ -148,18 +188,25 @@ Versions/Current and you will see the familiar bin and lib directories.
----------------------------
Yes, probably. If you want Tkinter support you need to get the OSX AquaTk
-distribution, this is installed by default on Mac OS X 10.4 or later. If
-you want wxPython you need to get that. If you want Cocoa you need to get
-PyObjC.
+distribution, this is installed by default on Mac OS X 10.4 or later. Be
+aware, though, that the Cocoa-based AquaTk's supplied starting with OS X
+10.6 have proven to be unstable. If possible, you should consider
+installing a newer version before building on OS X 10.6 or later, such as
+the ActiveTcl 8.5. See http://www.python.org/download/mac/tcltk/. If you
+are building with an SDK, ensure that the newer Tcl and Tk frameworks are
+seen in the SDK's ``Library/Frameworks`` directory; you may need to
+manually create symlinks to their installed location, ``/Library/Frameworks``.
+If you want wxPython you need to get that.
+If you want Cocoa you need to get PyObjC.
4. How do I build a framework Python?
-------------------------------------
This directory contains a Makefile that will create a couple of python-related
-applications (fullblown OSX .app applications, that is) in
-"/Applications/MacPython <VERSION>", and a hidden helper application Python.app
-inside the Python.framework, and unix tools "python" and "pythonw" into
-/usr/local/bin. In addition it has a target "installmacsubtree" that installs
+applications (full-blown OSX .app applications, that is) in
+"/Applications/Python <VERSION>", and a hidden helper application Python.app
+inside the Python.framework, and unix tools "python" and "pythonw" into
+/usr/local/bin. In addition it has a target "installmacsubtree" that installs
the relevant portions of the Mac subtree into the Python.framework.
It is normally invoked indirectly through the main Makefile, as the last step
@@ -171,17 +218,15 @@ in the sequence
3. make install
-This sequence will put the framework in /Library/Framework/Python.framework,
-the applications in "/Applications/MacPython <VERSION>" and the unix tools in
-/usr/local/bin.
+This sequence will put the framework in ``/Library/Framework/Python.framework``,
+the applications in ``/Applications/Python <VERSION>`` and the unix tools in
+``/usr/local/bin``.
-Installing in another place, for instance $HOME/Library/Frameworks if you have
-no admin privileges on your machine, has only been tested very lightly. This
-can be done by configuring with --enable-framework=$HOME/Library/Frameworks.
-The other two directories, "/Applications/MacPython-<VERSION>" and
-/usr/local/bin, will then also be deposited in $HOME. This is sub-optimal for
-the unix tools, which you would want in $HOME/bin, but there is no easy way to
-fix this right now.
+Installing in another place, for instance ``$HOME/Library/Frameworks`` if you
+have no admin privileges on your machine, is possible. This can be accomplished
+by configuring with ``--enable-framework=$HOME/Library/Frameworks``.
+The other two directories will then also be installed in your home directory,
+at ``$HOME/Applications/Python-<VERSION>`` and ``$HOME/bin``.
If you want to install some part, but not all, read the main Makefile. The
frameworkinstall is composed of a couple of sub-targets that install the
@@ -189,7 +234,7 @@ framework itself, the Mac subtree, the applications and the unix tools.
There is an extra target frameworkinstallextras that is not part of the
normal frameworkinstall which installs the Tools directory into
-"/Applications/MacPython <VERSION>", this is useful for binary
+"/Applications/Python <VERSION>", this is useful for binary
distributions.
What do all these programs do?
@@ -202,24 +247,41 @@ debugger, etc.
double-click a .py, .pyc or .pyw file. For the first two it creates a Terminal
window and runs the scripts with the normal command-line Python. For the
latter it runs the script in the Python.app interpreter so the script can do
-GUI-things. Keep the "alt" key depressed while dragging or double-clicking a
-script to set runtime options. These options can be set once and for all
+GUI-things. Keep the ``Option`` key depressed while dragging or double-clicking
+a script to set runtime options. These options can be set persistently
through PythonLauncher's preferences dialog.
-The commandline scripts /usr/local/bin/python and pythonw can be used to run
-non-GUI and GUI python scripts from the command line, respectively.
+The program ``pythonx.x`` runs python scripts from the command line. Various
+compatibility aliases are also installed, including ``pythonwx.x`` which
+in early releases of Python on OS X was required to run GUI programs. In
+current releases, the ``pythonx.x`` and ``pythonwx.x`` commands are identical.
How do I create a binary distribution?
======================================
-Go to the directory "Mac/OSX/BuildScript". There you'll find a script
-"build-installer.py" that does all the work. This will download and build
+Download and unpack the source release from http://www.python.org/download/.
+Go to the directory ``Mac/BuildScript``. There you will find a script
+``build-installer.py`` that does all the work. This will download and build
a number of 3rd-party libaries, configures and builds a framework Python,
installs it, creates the installer package files and then packs this in a
-DMG image.
+DMG image. The script also builds an HTML copy of the current Python
+documentation set for this release for inclusion in the framework. The
+installer package will create links to the documentation for use by IDLE,
+pydoc, shell users, and Finder user.
-The script will build a universal binary, you'll therefore have to run this
+The script will build a universal binary so you'll therefore have to run this
script on Mac OS X 10.4 or later and with Xcode 2.1 or later installed.
+However, the Python build process itself has several build dependencies not
+available out of the box with OS X 10.4 so you may have to install
+additional software beyond what is provided with Xcode 2. OS X 10.5
+provides a recent enough system Python (in ``/usr/bin``) to build
+the Python documentation set. It should be possible to use SDKs and/or older
+versions of Xcode to build installers that are compatible with older systems
+on a newer system but this may not be completely foolproof so the resulting
+executables, shared libraries, and ``.so`` bundles should be carefully
+examined and tested on all supported systems for proper dynamic linking
+dependencies. It is safest to build the distribution on a system running the
+minimum OS X version supported.
All of this is normally done completely isolated in /tmp/_py, so it does not
use your normal build directory nor does it install into /.
@@ -244,7 +306,7 @@ The configure script sometimes emits warnings like the one below::
configure: WARNING: ## -------------------------------------- ##
This almost always means you are trying to build a universal binary for
-Python and have libaries in ``/usr/local`` that don't contain the required
+Python and have libraries in ``/usr/local`` that don't contain the required
architectures. Temporarily move ``/usr/local`` aside to finish the build.
@@ -253,7 +315,7 @@ Uninstalling a framework install, including the binary installer
Uninstalling a framework can be done by manually removing all bits that got installed.
That's true for both installations from source and installations using the binary installer.
-Sadly enough OSX does not have a central uninstaller.
+OS X does not provide a central uninstaller.
The main bit of a framework install is the framework itself, installed in
``/Library/Frameworks/Python.framework``. This can contain multiple versions
@@ -267,14 +329,12 @@ A framework install also installs some applications in ``/Applications/Python X.
And lastly a framework installation installs files in ``/usr/local/bin``, all of
them symbolic links to files in ``/Library/Frameworks/Python.framework/Versions/X.Y/bin``.
-Odds and ends
-=============
-Something to take note of is that the ".rsrc" files in the distribution are
-not actually resource files, they're AppleSingle encoded resource files. The
-macresource module and the Mac/OSX/Makefile cater for this, and create
-".rsrc.df.rsrc" files on the fly that are normal datafork-based resource
-files.
+Resources
+=========
+
+ * http://www.python.org/download/mac/
+
+ * http://www.python.org/community/sigs/current/pythonmac-sig/
- Jack Jansen, Jack.Jansen@cwi.nl, 15-Jul-2004.
- Ronald Oussoren, RonaldOussoren@mac.com, 30-April-2010
+ * http://docs.python.org/devguide/ \ No newline at end of file
diff --git a/Mac/Tools/fixapplepython23.py b/Mac/Tools/fixapplepython23.py
deleted file mode 100644
index 18b95b3..0000000
--- a/Mac/Tools/fixapplepython23.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/python
-"""fixapplepython23 - Fix Apple-installed Python 2.3 (on Mac OS X 10.3)
-
-Python 2.3 (and 2.3.X for X<5) have the problem that building an extension
-for a framework installation may accidentally pick up the framework
-of a newer Python, in stead of the one that was used to build the extension.
-
-This script modifies the Makefile (in .../lib/python2.3/config) to use
-the newer method of linking extensions with "-undefined dynamic_lookup"
-which fixes this problem.
-
-The script will first check all prerequisites, and return a zero exit
-status also when nothing needs to be fixed.
-"""
-import sys
-import os
-import platform
-
-MAKEFILE='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/Makefile'
-CHANGES=((
- 'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n',
- 'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n'
- ),(
- 'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n',
- 'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n'
- ),(
- 'CC=\t\tgcc\n',
- 'CC=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc\n'
- ),(
- 'CXX=\t\tc++\n',
- 'CXX=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++\n'
-))
-
-GCC_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc'
-GXX_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++'
-SCRIPT="""#!/bin/sh
-export MACOSX_DEPLOYMENT_TARGET=10.3
-exec %s "${@}"
-"""
-
-def findline(lines, start):
- """return line starting with given string or -1"""
- for i in range(len(lines)):
- if lines[i][:len(start)] == start:
- return i
- return -1
-
-def fix(makefile, do_apply):
- """Fix the Makefile, if required."""
- fixed = False
- lines = open(makefile).readlines()
-
- for old, new in CHANGES:
- i = findline(lines, new)
- if i >= 0:
- # Already fixed
- continue
- i = findline(lines, old)
- if i < 0:
- print('fixapplepython23: Python installation not fixed (appears broken)')
- print('fixapplepython23: missing line:', old)
- return 2
- lines[i] = new
- fixed = True
-
- if fixed:
- if do_apply:
- print('fixapplepython23: Fix to Apple-installed Python 2.3 applied')
- os.rename(makefile, makefile + '~')
- open(makefile, 'w').writelines(lines)
- return 0
- else:
- print('fixapplepython23: Fix to Apple-installed Python 2.3 should be applied')
- return 1
- else:
- print('fixapplepython23: No fix needed, appears to have been applied before')
- return 0
-
-def makescript(filename, compiler):
- """Create a wrapper script for a compiler"""
- dirname = os.path.split(filename)[0]
- if not os.access(dirname, os.X_OK):
- os.mkdir(dirname, 0o755)
- fp = open(filename, 'w')
- fp.write(SCRIPT % compiler)
- fp.close()
- os.chmod(filename, 0o755)
- print('fixapplepython23: Created', filename)
-
-def main():
- # Check for -n option
- if len(sys.argv) > 1 and sys.argv[1] == '-n':
- do_apply = False
- else:
- do_apply = True
- # First check OS version
- if sys.byteorder == 'little':
- # All intel macs are fine
- print("fixapplypython23: no fix is needed on MacOSX on Intel")
- sys.exit(0)
-
- osver = platform.mac_ver()
- if osver != '10.3' and os.ver < '10.3.':
- print('fixapplepython23: no fix needed on MacOSX < 10.3')
- sys.exit(0)
-
- if osver >= '10.4':
- print('fixapplepython23: no fix needed on MacOSX >= 10.4')
- sys.exit(0)
-
- # Test that a framework Python is indeed installed
- if not os.path.exists(MAKEFILE):
- print('fixapplepython23: Python framework does not appear to be installed (?), nothing fixed')
- sys.exit(0)
- # Check that we can actually write the file
- if do_apply and not os.access(MAKEFILE, os.W_OK):
- print('fixapplepython23: No write permission, please run with "sudo"')
- sys.exit(2)
- # Create the shell scripts
- if do_apply:
- if not os.access(GCC_SCRIPT, os.X_OK):
- makescript(GCC_SCRIPT, "gcc")
- if not os.access(GXX_SCRIPT, os.X_OK):
- makescript(GXX_SCRIPT, "g++")
- # Finally fix the makefile
- rv = fix(MAKEFILE, do_apply)
- #sys.exit(rv)
- sys.exit(0)
-
-if __name__ == '__main__':
- main()
diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c
index 30c82ac..1d2db38 100644
--- a/Mac/Tools/pythonw.c
+++ b/Mac/Tools/pythonw.c
@@ -28,6 +28,7 @@
#include <dlfcn.h>
#include <stdlib.h>
#include <Python.h>
+#include <mach-o/dyld.h>
extern char** environ;
@@ -150,6 +151,53 @@ setup_spawnattr(posix_spawnattr_t* spawnattr)
int
main(int argc, char **argv) {
char* exec_path = get_python_path();
+ static char path[PATH_MAX * 2];
+ static char real_path[PATH_MAX * 2];
+ int status;
+ uint32_t size = PATH_MAX * 2;
+
+ /* Set the original executable path in the environment. */
+ status = _NSGetExecutablePath(path, &size);
+ if (status == 0) {
+ /*
+ * Note: don't call 'realpath', that will
+ * erase symlink information, and that
+ * breaks "pyvenv --symlink"
+ *
+ * It is nice to have the directory name
+ * as a cleaned up absolute path though,
+ * therefore call realpath on dirname(path)
+ */
+ char* slash = strrchr(path, '/');
+ if (slash) {
+ char replaced;
+ replaced = slash[1];
+ slash[1] = 0;
+ if (realpath(path, real_path) == NULL) {
+ err(1, "realpath: %s", path);
+ }
+ slash[1] = replaced;
+ if (strlcat(real_path, slash, sizeof(real_path)) > sizeof(real_path)) {
+ errno = EINVAL;
+ err(1, "realpath: %s", path);
+ }
+
+ } else {
+ if (realpath(".", real_path) == NULL) {
+ err(1, "realpath: %s", path);
+ }
+ if (strlcat(real_path, "/", sizeof(real_path)) > sizeof(real_path)) {
+ errno = EINVAL;
+ err(1, "realpath: %s", path);
+ }
+ if (strlcat(real_path, path, sizeof(real_path)) > sizeof(real_path)) {
+ errno = EINVAL;
+ err(1, "realpath: %s", path);
+ }
+ }
+
+ setenv("__PYVENV_LAUNCHER__", real_path, 1);
+ }
/*
* Let argv[0] refer to the new interpreter. This is needed to
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 44c1f15..c4243f3 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -37,7 +37,7 @@ MAINCC= @MAINCC@
LINKCC= @LINKCC@
AR= @AR@
RANLIB= @RANLIB@
-SVNVERSION= @SVNVERSION@
+READELF= @READELF@
SOABI= @SOABI@
LDVERSION= @LDVERSION@
HGVERSION= @HGVERSION@
@@ -198,6 +198,10 @@ LIBOBJS= @LIBOBJS@
PYTHON= python$(EXE)
BUILDPYTHON= python$(BUILDEXE)
+PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
+_PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
+HOST_GNU_TYPE= @host@
+
# The task to run while instrument when building the profile-opt target
PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
@@ -240,20 +244,41 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@
# Parser
PGEN= Parser/pgen$(EXE)
+PSRCS= \
+ Parser/acceler.c \
+ Parser/grammar1.c \
+ Parser/listnode.c \
+ Parser/node.c \
+ Parser/parser.c \
+ Parser/bitset.c \
+ Parser/metagrammar.c \
+ Parser/firstsets.c \
+ Parser/grammar.c \
+ Parser/pgen.c
+
POBJS= \
Parser/acceler.o \
Parser/grammar1.o \
Parser/listnode.o \
Parser/node.o \
Parser/parser.o \
- Parser/parsetok.o \
Parser/bitset.o \
Parser/metagrammar.o \
Parser/firstsets.o \
Parser/grammar.o \
Parser/pgen.o
-PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/tokenizer.o
+PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o
+
+PGSRCS= \
+ Objects/obmalloc.c \
+ Python/dynamic_annotations.c \
+ Python/mysnprintf.c \
+ Python/pyctype.c \
+ Parser/tokenizer_pgen.c \
+ Parser/printgrammar.c \
+ Parser/parsetok_pgen.c \
+ Parser/pgenmain.c
PGOBJS= \
Objects/obmalloc.o \
@@ -262,13 +287,16 @@ PGOBJS= \
Python/pyctype.o \
Parser/tokenizer_pgen.o \
Parser/printgrammar.o \
+ Parser/parsetok_pgen.o \
Parser/pgenmain.o
PARSER_HEADERS= \
- Parser/parser.h \
- Parser/tokenizer.h
+ $(srcdir)/Parser/parser.h \
+ $(srcdir)/Include/parsetok.h \
+ $(srcdir)/Parser/tokenizer.h
-PGENOBJS= $(PGENMAIN) $(POBJS) $(PGOBJS)
+PGENSRCS= $(PSRCS) $(PGSRCS)
+PGENOBJS= $(POBJS) $(PGOBJS)
##########################################################################
# AST
@@ -305,7 +333,6 @@ PYTHON_OBJS= \
Python/codecs.o \
Python/dynamic_annotations.o \
Python/errors.o \
- Python/frozen.o \
Python/frozenmain.o \
Python/future.o \
Python/getargs.o \
@@ -373,11 +400,12 @@ OBJECT_OBJS= \
Objects/memoryobject.o \
Objects/methodobject.o \
Objects/moduleobject.o \
+ Objects/namespaceobject.o \
Objects/object.o \
Objects/obmalloc.o \
Objects/capsule.o \
Objects/rangeobject.o \
- Objects/setobject.o \
+ Objects/setobject.o \
Objects/sliceobject.o \
Objects/structseq.o \
Objects/tupleobject.o \
@@ -386,10 +414,9 @@ OBJECT_OBJS= \
Objects/unicodectype.o \
Objects/weakrefobject.o
-
##########################################################################
# objects that get linked into the Python library
-LIBRARY_OBJS= \
+LIBRARY_OBJS_OMIT_FROZEN= \
Modules/getbuildinfo.o \
$(PARSER_OBJS) \
$(OBJECT_OBJS) \
@@ -398,6 +425,10 @@ LIBRARY_OBJS= \
$(SIGNAL_OBJS) \
$(MODOBJS)
+LIBRARY_OBJS= \
+ $(LIBRARY_OBJS_OMIT_FROZEN) \
+ Python/frozen.o
+
#########################################################################
# Rules
@@ -421,10 +452,11 @@ build_all_generate_profile:
$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-generate" LIBS="$(LIBS) -lgcov"
run_profile_task:
- ./$(BUILDPYTHON) $(PROFILE_TASK)
+ : # FIXME: can't run for a cross build
+ $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK)
build_all_use_profile:
- $(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use"
+ $(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use -fprofile-correction"
coverage:
@echo "Building with support for coverage checking:"
@@ -436,20 +468,25 @@ coverage:
$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-platform: $(BUILDPYTHON)
- $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
+platform: $(BUILDPYTHON) pybuilddir.txt
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
+# Create build directory and generate the sysconfig build-time data there.
+# pybuilddir.txt contains the name of the build dir and is used for
+# sys.path fixup -- see Modules/getpath.c.
+pybuilddir.txt: $(BUILDPYTHON)
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) -S -m sysconfig --generate-posix-vars
# Build the shared modules
# MAKEFLAGS are sorted and normalized. Under GNU make the 's' for
# -s, --silent or --quiet is always the first char.
-sharedmods: $(BUILDPYTHON)
+sharedmods: $(BUILDPYTHON) pybuilddir.txt
@case "$$MAKEFLAGS" in \
s*) quiet="-q";; \
*) quiet="";; \
esac; \
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
- ./$(BUILDPYTHON) -E $(srcdir)/setup.py $$quiet build
+ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
# Build static library
# avoid long command lines, same as LIBRARY_OBJS
@@ -458,7 +495,7 @@ $(LIBRARY): $(LIBRARY_OBJS)
$(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
$(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
$(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+ $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS) Python/frozen.o
$(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
$(AR) $(ARFLAGS) $@ $(MODOBJS)
$(RANLIB) $@
@@ -505,7 +542,7 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
-install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
-compatibility_version $(VERSION) \
-current_version $(VERSION) \
- -framework CoreFoundation $(LIBS);
+ -framework CoreFoundation $(LIBS);
$(INSTALL) -d -m $(DIRMODE) \
$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/Resources/English.lproj
$(INSTALL_DATA) $(RESSRCDIR)/Info.plist \
@@ -556,6 +593,18 @@ Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
+# Importlib
+
+Modules/_freeze_importlib: Modules/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN)
+ $(LINKCC) $(PY_LDFLAGS) -o $@ Modules/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+Python/importlib.h: $(srcdir)/Lib/importlib/_bootstrap.py Modules/_freeze_importlib.c
+ $(MAKE) Modules/_freeze_importlib
+ ./Modules/_freeze_importlib \
+ $(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h
+
+
+############################################################################
# Special rules for object files
Modules/getbuildinfo.o: $(PARSER_OBJS) \
@@ -566,7 +615,6 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
$(MODOBJS) \
$(srcdir)/Modules/getbuildinfo.c
$(CC) -c $(PY_CORE_CFLAGS) \
- -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" \
-DHGVERSION="\"`LC_ALL=C $(HGVERSION)`\"" \
-DHGTAG="\"`LC_ALL=C $(HGTAG)`\"" \
-DHGBRANCH="\"`LC_ALL=C $(HGBRANCH)`\"" \
@@ -583,6 +631,9 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
Modules/python.o: $(srcdir)/Modules/python.c
$(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/python.c
+Modules/_testembed.o: $(srcdir)/Modules/_testembed.c
+ $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/_testembed.c
+
Python/dynload_shlib.o: $(srcdir)/Python/dynload_shlib.c Makefile
$(CC) -c $(PY_CORE_CFLAGS) \
-DSOABI='"$(SOABI)"' \
@@ -595,12 +646,13 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile
$(IO_OBJS): $(IO_H)
-# Use a stamp file to prevent make -j invoking pgen twice
-$(GRAMMAR_H) $(GRAMMAR_C): Parser/pgen.stamp
-Parser/pgen.stamp: $(PGEN) $(GRAMMAR_INPUT)
- -@$(INSTALL) -d Include
+$(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS)
+ @$(MKDIR_P) Include
+ $(MAKE) $(PGEN)
$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
- -touch Parser/pgen.stamp
+$(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS)
+ $(MAKE) $(GRAMMAR_H)
+ touch $(GRAMMAR_C)
$(PGEN): $(PGENOBJS)
$(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
@@ -611,6 +663,8 @@ Parser/grammar.o: $(srcdir)/Parser/grammar.c \
Parser/metagrammar.o: $(srcdir)/Parser/metagrammar.c
Parser/tokenizer_pgen.o: $(srcdir)/Parser/tokenizer.c
+Parser/parsetok_pgen.o: $(srcdir)/Parser/parsetok.c
+Parser/printgrammar.o: $(srcdir)/Parser/printgrammar.c
Parser/pgenmain.o: $(srcdir)/Include/parsetok.h
@@ -618,7 +672,7 @@ $(AST_H): $(AST_ASDL) $(ASDLGEN_FILES)
$(MKDIR_P) $(AST_H_DIR)
$(ASDLGEN) -h $(AST_H_DIR) $(AST_ASDL)
-$(AST_C): $(AST_ASDL) $(ASDLGEN_FILES)
+$(AST_C): $(AST_H) $(AST_ASDL) $(ASDLGEN_FILES)
$(MKDIR_P) $(AST_C_DIR)
$(ASDLGEN) -c $(AST_C_DIR) $(AST_ASDL)
@@ -640,20 +694,29 @@ BYTESTR_DEPS = \
$(srcdir)/Objects/stringlib/eq.h \
$(srcdir)/Objects/stringlib/fastsearch.h \
$(srcdir)/Objects/stringlib/find.h \
+ $(srcdir)/Objects/stringlib/find_max_char.h \
$(srcdir)/Objects/stringlib/partition.h \
$(srcdir)/Objects/stringlib/split.h \
$(srcdir)/Objects/stringlib/stringdefs.h \
- $(srcdir)/Objects/stringlib/string_format.h \
$(srcdir)/Objects/stringlib/transmogrify.h \
$(srcdir)/Objects/stringlib/unicodedefs.h \
- $(srcdir)/Objects/stringlib/localeutil.h
+ $(srcdir)/Objects/stringlib/localeutil.h \
+ $(srcdir)/Objects/stringlib/undef.h
+
+UNICODE_DEPS = $(BYTESTR_DEPS) \
+ $(srcdir)/Objects/stringlib/asciilib.h \
+ $(srcdir)/Objects/stringlib/codecs.h \
+ $(srcdir)/Objects/stringlib/ucs1lib.h \
+ $(srcdir)/Objects/stringlib/ucs2lib.h \
+ $(srcdir)/Objects/stringlib/ucs4lib.h \
+ $(srcdir)/Objects/stringlib/unicode_format.h \
+ $(srcdir)/Objects/stringlib/unicodedefs.h
Objects/bytesobject.o: $(srcdir)/Objects/bytesobject.c $(BYTESTR_DEPS)
Objects/bytearrayobject.o: $(srcdir)/Objects/bytearrayobject.c $(BYTESTR_DEPS)
-Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c \
- $(BYTESTR_DEPS)
+Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c $(UNICODE_DEPS)
Objects/dictobject.o: $(srcdir)/Objects/stringlib/eq.h
Objects/setobject.o: $(srcdir)/Objects/stringlib/eq.h
@@ -661,11 +724,12 @@ Objects/setobject.o: $(srcdir)/Objects/stringlib/eq.h
$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
$(OPCODETARGETGEN) $(OPCODETARGETS_H)
-Python/ceval.o: $(OPCODETARGETS_H) Python/ceval_gil.h
+Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h
Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
- $(BYTESTR_DEPS) \
- $(srcdir)/Objects/stringlib/formatter.h
+ $(BYTESTR_DEPS)
+
+Python/frozen.o: Python/importlib.h
Objects/typeobject.o: Objects/typeslots.inc
Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
@@ -675,89 +739,89 @@ Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots
# Header files
PYTHON_HEADERS= \
- Include/Python-ast.h \
- Include/Python.h \
- Include/abstract.h \
- Include/accu.h \
- Include/asdl.h \
- Include/ast.h \
- Include/bltinmodule.h \
- Include/bitset.h \
- Include/boolobject.h \
- Include/bytes_methods.h \
- Include/bytearrayobject.h \
- Include/bytesobject.h \
- Include/cellobject.h \
- Include/ceval.h \
- Include/classobject.h \
- Include/code.h \
- Include/codecs.h \
- Include/compile.h \
- Include/complexobject.h \
- Include/descrobject.h \
- Include/dictobject.h \
- Include/dtoa.h \
- Include/dynamic_annotations.h \
- Include/enumobject.h \
- Include/errcode.h \
- Include/eval.h \
- Include/fileobject.h \
- Include/fileutils.h \
- Include/floatobject.h \
- Include/frameobject.h \
- Include/funcobject.h \
- Include/genobject.h \
- Include/import.h \
- Include/intrcheck.h \
- Include/iterobject.h \
- Include/listobject.h \
- Include/longintrepr.h \
- Include/longobject.h \
- Include/marshal.h \
- Include/memoryobject.h \
- Include/metagrammar.h \
- Include/methodobject.h \
- Include/modsupport.h \
- Include/moduleobject.h \
- Include/node.h \
- Include/object.h \
- Include/objimpl.h \
- Include/opcode.h \
- Include/osdefs.h \
- Include/parsetok.h \
- Include/patchlevel.h \
- Include/pgen.h \
- Include/pgenheaders.h \
- Include/pyarena.h \
- Include/pyatomic.h \
- Include/pycapsule.h \
- Include/pyctype.h \
- Include/pydebug.h \
- Include/pyerrors.h \
- Include/pyfpe.h \
- Include/pymath.h \
- Include/pygetopt.h \
- Include/pymem.h \
- Include/pyport.h \
- Include/pystate.h \
- Include/pystrcmp.h \
- Include/pystrtod.h \
- Include/pythonrun.h \
- Include/pythread.h \
- Include/pytime.h \
- Include/rangeobject.h \
- Include/setobject.h \
- Include/sliceobject.h \
- Include/structmember.h \
- Include/structseq.h \
- Include/symtable.h \
- Include/sysmodule.h \
- Include/traceback.h \
- Include/tupleobject.h \
- Include/ucnhash.h \
- Include/unicodeobject.h \
- Include/warnings.h \
- Include/weakrefobject.h \
+ $(srcdir)/Include/Python.h \
+ $(srcdir)/Include/abstract.h \
+ $(srcdir)/Include/accu.h \
+ $(srcdir)/Include/asdl.h \
+ $(srcdir)/Include/ast.h \
+ $(srcdir)/Include/bltinmodule.h \
+ $(srcdir)/Include/bitset.h \
+ $(srcdir)/Include/boolobject.h \
+ $(srcdir)/Include/bytes_methods.h \
+ $(srcdir)/Include/bytearrayobject.h \
+ $(srcdir)/Include/bytesobject.h \
+ $(srcdir)/Include/cellobject.h \
+ $(srcdir)/Include/ceval.h \
+ $(srcdir)/Include/classobject.h \
+ $(srcdir)/Include/code.h \
+ $(srcdir)/Include/codecs.h \
+ $(srcdir)/Include/compile.h \
+ $(srcdir)/Include/complexobject.h \
+ $(srcdir)/Include/descrobject.h \
+ $(srcdir)/Include/dictobject.h \
+ $(srcdir)/Include/dtoa.h \
+ $(srcdir)/Include/dynamic_annotations.h \
+ $(srcdir)/Include/enumobject.h \
+ $(srcdir)/Include/errcode.h \
+ $(srcdir)/Include/eval.h \
+ $(srcdir)/Include/fileobject.h \
+ $(srcdir)/Include/fileutils.h \
+ $(srcdir)/Include/floatobject.h \
+ $(srcdir)/Include/frameobject.h \
+ $(srcdir)/Include/funcobject.h \
+ $(srcdir)/Include/genobject.h \
+ $(srcdir)/Include/import.h \
+ $(srcdir)/Include/intrcheck.h \
+ $(srcdir)/Include/iterobject.h \
+ $(srcdir)/Include/listobject.h \
+ $(srcdir)/Include/longintrepr.h \
+ $(srcdir)/Include/longobject.h \
+ $(srcdir)/Include/marshal.h \
+ $(srcdir)/Include/memoryobject.h \
+ $(srcdir)/Include/metagrammar.h \
+ $(srcdir)/Include/methodobject.h \
+ $(srcdir)/Include/modsupport.h \
+ $(srcdir)/Include/moduleobject.h \
+ $(srcdir)/Include/namespaceobject.h \
+ $(srcdir)/Include/node.h \
+ $(srcdir)/Include/object.h \
+ $(srcdir)/Include/objimpl.h \
+ $(srcdir)/Include/opcode.h \
+ $(srcdir)/Include/osdefs.h \
+ $(srcdir)/Include/patchlevel.h \
+ $(srcdir)/Include/pgen.h \
+ $(srcdir)/Include/pgenheaders.h \
+ $(srcdir)/Include/pyarena.h \
+ $(srcdir)/Include/pyatomic.h \
+ $(srcdir)/Include/pycapsule.h \
+ $(srcdir)/Include/pyctype.h \
+ $(srcdir)/Include/pydebug.h \
+ $(srcdir)/Include/pyerrors.h \
+ $(srcdir)/Include/pyfpe.h \
+ $(srcdir)/Include/pymath.h \
+ $(srcdir)/Include/pygetopt.h \
+ $(srcdir)/Include/pymacro.h \
+ $(srcdir)/Include/pymem.h \
+ $(srcdir)/Include/pyport.h \
+ $(srcdir)/Include/pystate.h \
+ $(srcdir)/Include/pystrcmp.h \
+ $(srcdir)/Include/pystrtod.h \
+ $(srcdir)/Include/pythonrun.h \
+ $(srcdir)/Include/pythread.h \
+ $(srcdir)/Include/pytime.h \
+ $(srcdir)/Include/rangeobject.h \
+ $(srcdir)/Include/setobject.h \
+ $(srcdir)/Include/sliceobject.h \
+ $(srcdir)/Include/structmember.h \
+ $(srcdir)/Include/structseq.h \
+ $(srcdir)/Include/symtable.h \
+ $(srcdir)/Include/sysmodule.h \
+ $(srcdir)/Include/traceback.h \
+ $(srcdir)/Include/tupleobject.h \
+ $(srcdir)/Include/ucnhash.h \
+ $(srcdir)/Include/unicodeobject.h \
+ $(srcdir)/Include/warnings.h \
+ $(srcdir)/Include/weakrefobject.h \
pyconfig.h \
$(PARSER_HEADERS)
@@ -766,65 +830,56 @@ $(LIBRARY_OBJS) $(MODOBJS) Modules/python.o: $(PYTHON_HEADERS)
######################################################################
-# Test the interpreter (twice, once without .pyc files, once with)
+TESTOPTS= $(EXTRATESTOPTS)
+TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) $(TESTPYTHONOPTS)
+TESTRUNNER= $(TESTPYTHON) $(srcdir)/Tools/scripts/run_tests.py
+TESTTIMEOUT= 3600
+
+# Run a basic set of regression tests.
+# This excludes some tests that are particularly resource-intensive.
+test: all platform
+ $(TESTRUNNER) $(TESTOPTS)
+
+# Run the full test suite twice - once without .pyc files, and once with.
# In the past, we've had problems where bugs in the marshalling or
# elsewhere caused bytecode read from .pyc files to behave differently
# than bytecode generated directly from a .py source file. Sometimes
-# the bytecode read from a .pyc file had the bug, somtimes the directly
+# the bytecode read from a .pyc file had the bug, sometimes the directly
# generated bytecode. This is sometimes a very shy bug needing a lot of
# sample data.
-
-TESTOPTS= -l $(EXTRATESTOPTS)
-TESTPROG= $(srcdir)/Lib/test/regrtest.py
-TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) -Wd -E -R -bb $(TESTPYTHONOPTS)
-test: all platform
- -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS)
- $(TESTPYTHON) $(TESTPROG) $(TESTOPTS)
-
testall: all platform
-find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- $(TESTPYTHON) $(srcdir)/Lib/compileall.py
+ $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py
-find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- -$(TESTPYTHON) $(TESTPROG) -uall $(TESTOPTS)
- $(TESTPYTHON) $(TESTPROG) -uall $(TESTOPTS)
+ -$(TESTRUNNER) -u all $(TESTOPTS)
+ $(TESTRUNNER) -u all $(TESTOPTS)
-# Run the unitests for both architectures in a Universal build on OSX
-# Must be run on an Intel box.
+# Run the test suite for both architectures in a Universal build on OSX.
+# Must be run on an Intel box.
testuniversal: all platform
if [ `arch` != 'i386' ];then \
echo "This can only be used on OSX/i386" ;\
exit 1 ;\
fi
- -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- -$(TESTPYTHON) $(TESTPROG) -uall $(TESTOPTS)
- $(TESTPYTHON) $(TESTPROG) -uall $(TESTOPTS)
- $(RUNSHARED) /usr/libexec/oah/translate ./$(BUILDPYTHON) -E $(TESTPROG) -uall $(TESTOPTS)
+ $(TESTRUNNER) -u all $(TESTOPTS)
+ $(RUNSHARED) /usr/libexec/oah/translate \
+ ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS)
-
-# Like testall, but with a single pass only
-# run an optional script to include some information about the build environment
+# Like testall, but with only one pass and without multiple processes.
+# Run an optional script to include information about the build environment.
buildbottest: all platform
-@if which pybuildbot.identify >/dev/null 2>&1; then \
pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \
fi
- $(TESTPYTHON) $(TESTPROG) -uall -rwW $(TESTOPTS)
+ $(TESTRUNNER) -j 1 -u all -W --timeout=$(TESTTIMEOUT) $(TESTOPTS)
QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \
test_multibytecodec test_urllib2_localnet test_itertools \
test_multiprocessing test_mailbox test_socket test_poll \
- test_select test_zipfile
+ test_select test_zipfile test_concurrent_futures
quicktest: all platform
- -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- -$(TESTPYTHON) $(TESTPROG) $(QUICKTESTOPTS)
- $(TESTPYTHON) $(TESTPROG) $(QUICKTESTOPTS)
+ $(TESTRUNNER) $(QUICKTESTOPTS)
-MEMTESTOPTS= $(QUICKTESTOPTS) -x test_dl test___all__ test_fork1 \
- test_longexp
-memtest: all platform
- -rm -f $(srcdir)/Lib/test/*.py[co]
- -$(TESTPYTHON) $(TESTPROG) $(MEMTESTOPTS)
- $(TESTPYTHON) $(TESTPROG) $(MEMTESTOPTS)
install: altinstall bininstall
@@ -865,7 +920,7 @@ altbininstall: $(BUILDPYTHON)
done
$(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE)
-if test "$(VERSION)" != "$(LDVERSION)"; then \
- if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)$(VERSION)$(EXE) -o -h $(DESTDIR)$(BINDIR)/$(PYTHON)$(VERSION)$(EXE); \
+ if test -f $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE) -o -h $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \
then rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \
fi; \
(cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE)); \
@@ -886,11 +941,11 @@ altbininstall: $(BUILDPYTHON)
fi
bininstall: altbininstall
- -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE) -o -h $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
- then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
+ -if test -f $(DESTDIR)$(BINDIR)/python3$(EXE) -o -h $(DESTDIR)$(BINDIR)/python3$(EXE); \
+ then rm -f $(DESTDIR)$(BINDIR)/python3$(EXE); \
else true; \
fi
- (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)3$(EXE))
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python3$(EXE))
-if test "$(VERSION)" != "$(LDVERSION)"; then \
rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-config; \
(cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \
@@ -907,6 +962,8 @@ bininstall: altbininstall
(cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3)
-rm -f $(DESTDIR)$(BINDIR)/2to3
(cd $(DESTDIR)$(BINDIR); $(LN) -s 2to3-$(VERSION) 2to3)
+ -rm -f $(DESTDIR)$(BINDIR)/pyvenv
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s pyvenv-$(VERSION) pyvenv)
# Install the manual page
maninstall:
@@ -932,21 +989,43 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \
test/cjkencodings test/decimaltestdata test/xmltestdata \
test/subprocessdata test/sndhdrdata \
test/tracedmodules test/encoded_modules \
- concurrent concurrent/futures encodings \
- email email/mime email/test email/test/data \
+ test/namespace_pkgs \
+ test/namespace_pkgs/both_portions \
+ test/namespace_pkgs/both_portions/foo \
+ test/namespace_pkgs/not_a_namespace_pkg \
+ test/namespace_pkgs/not_a_namespace_pkg/foo \
+ test/namespace_pkgs/portion1 \
+ test/namespace_pkgs/portion1/foo \
+ test/namespace_pkgs/portion2 \
+ test/namespace_pkgs/portion2/foo \
+ test/namespace_pkgs/project1 \
+ test/namespace_pkgs/project1/parent \
+ test/namespace_pkgs/project1/parent/child \
+ test/namespace_pkgs/project2 \
+ test/namespace_pkgs/project2/parent \
+ test/namespace_pkgs/project2/parent/child \
+ test/namespace_pkgs/project3 \
+ test/namespace_pkgs/project3/parent \
+ test/namespace_pkgs/project3/parent/child \
+ test/namespace_pkgs/module_and_namespace_package \
+ test/namespace_pkgs/module_and_namespace_package/a_test \
+ collections concurrent concurrent/futures encodings \
+ email email/mime test/test_email test/test_email/data \
html json test/json_tests http dbm xmlrpc \
sqlite3 sqlite3/test \
logging csv wsgiref urllib \
lib2to3 lib2to3/fixes lib2to3/pgen2 lib2to3/tests \
- lib2to3/tests/data lib2to3/tests/data/fixers lib2to3/tests/data/fixers/myfixes \
+ lib2to3/tests/data lib2to3/tests/data/fixers \
+ lib2to3/tests/data/fixers/myfixes \
ctypes ctypes/test ctypes/macholib idlelib idlelib/Icons \
distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \
- importlib importlib/test importlib/test/builtin \
- importlib/test/extension importlib/test/frozen \
- importlib/test/import_ importlib/test/source \
+ importlib test/test_importlib test/test_importlib/builtin \
+ test/test_importlib/extension test/test_importlib/frozen \
+ test/test_importlib/import_ test/test_importlib/source \
turtledemo \
multiprocessing multiprocessing/dummy \
- unittest unittest/test \
+ unittest unittest/test unittest/test/testmock \
+ venv venv/scripts venv/scripts/posix \
curses pydoc_data $(MACHDEPS)
libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
@for i in $(SCRIPTDIR) $(LIBDEST); \
@@ -968,7 +1047,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
else true; \
fi; \
done
- @for i in $(srcdir)/Lib/*.py $(srcdir)/Lib/*.egg-info ; \
+ @for i in $(srcdir)/Lib/*.py `cat pybuilddir.txt`/_sysconfigdata.py; \
do \
if test -x $$i; then \
$(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \
@@ -1009,27 +1088,27 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
$(DESTDIR)$(LIBDEST)/distutils/tests ; \
fi
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST) -f \
-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
$(DESTDIR)$(LIBDEST)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST) -f \
-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
$(DESTDIR)$(LIBDEST)
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST)/site-packages -f \
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-d $(LIBDEST)/site-packages -f \
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
+ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- ./$(BUILDPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
# Create the PLATDIR source directory, if one wasn't distributed..
$(srcdir)/Lib/$(PLATDIR):
@@ -1123,11 +1202,13 @@ libainstall: all python-config
# Install the dynamically loadable modules
# This goes into $(exec_prefix)
sharedinstall: sharedmods
- $(RUNSHARED) ./$(BUILDPYTHON) -E $(srcdir)/setup.py install \
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \
--prefix=$(prefix) \
--install-scripts=$(BINDIR) \
--install-platlib=$(DESTSHARED) \
--root=$(DESTDIR)/
+ -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py
+ -rm -r $(DESTDIR)$(DESTSHARED)/__pycache__
# Here are a couple of targets for MacOSX again, to install a full
# framework-based Python. frameworkinstall installs everything, the
@@ -1198,13 +1279,13 @@ frameworkinstallextras:
# This installs a few of the useful scripts in Tools/scripts
scriptsinstall:
SRCDIR=$(srcdir) $(RUNSHARED) \
- ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/setup.py install \
+ $(PYTHON_FOR_BUILD) $(srcdir)/Tools/scripts/setup.py install \
--prefix=$(prefix) \
--install-scripts=$(BINDIR) \
--root=$(DESTDIR)/
# Build the toplevel Makefile
-Makefile.pre: Makefile.pre.in config.status
+Makefile.pre: $(srcdir)/Makefile.pre.in config.status
CONFIG_FILES=Makefile.pre CONFIG_HEADERS= $(SHELL) config.status
$(MAKE) -f Makefile.pre Makefile
@@ -1247,6 +1328,10 @@ TAGS::
etags Include/*.h; \
for i in $(SRCDIRS); do etags -a $$i/*.[ch]; done
+# Touch generated files
+touch:
+ hg --config extensions.touch=Tools/hg/hgtouch.py touch -v
+
# Sanitation targets -- clean leaves libraries, executables and tags
# files, which clobber removes as well
pycremoval:
@@ -1269,16 +1354,18 @@ clean: pycremoval
find . -name '*.s[ol]' -exec rm -f {} ';'
find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';'
find build -name 'fficonfig.h' -exec rm -f {} ';' || true
- find build -name 'fficonfig.py' -exec rm -f {} ';' || true
+ find build -name '*.py' -exec rm -f {} ';' || true
+ find build -name '*.py[co]' -exec rm -f {} ';' || true
+ -rm -f pybuilddir.txt
-rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f Modules/_testembed
+ -rm -f Modules/_testembed Modules/_freeze_importlib
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
clobber: clean profile-removal
-rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
- tags TAGS Parser/pgen.stamp \
+ tags TAGS \
config.cache config.log pyconfig.h Modules/config.c
-rm -rf build platform
-rm -rf $(PYTHONFRAMEWORKDIR)
@@ -1294,7 +1381,6 @@ distclean: clobber
Modules/Setup Modules/Setup.local Modules/Setup.config \
Modules/ld_so_aix Modules/python.exp Misc/python.pc
-rm -f python*-gdb.py
- -rm -f pybuilddir.txt
find $(srcdir) '(' -name '*.fdc' -o -name '*~' \
-o -name '[@,#]*' -o -name '*.old' \
-o -name '*.orig' -o -name '*.rej' \
@@ -1309,8 +1395,7 @@ smelly: all
# Find files with funny names
funny:
find $(SUBDIRS) $(SUBDIRSTOO) \
- -name .svn -prune \
- -o -type d \
+ -type d \
-o -name '*.[chs]' \
-o -name '*.py' \
-o -name '*.pyw' \
@@ -1349,13 +1434,13 @@ patchcheck:
Python/thread.o: @THREADHEADERS@
# Declare targets that aren't real files
-.PHONY: all build_all sharedmods oldsharedmods test quicktest memtest
+.PHONY: all build_all sharedmods oldsharedmods test quicktest
.PHONY: install altinstall oldsharedinstall bininstall altbininstall
.PHONY: maninstall libinstall inclinstall libainstall sharedinstall
.PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
.PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
.PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
-.PHONY: smelly funny patchcheck
+.PHONY: smelly funny patchcheck touch
.PHONY: gdbhooks
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/Misc/ACKS b/Misc/ACKS
index 1095733..abf4a5d 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -13,8 +13,11 @@ and the list is in rough alphabetical order by last names.
Aahz
Michael Abbott
+Rajiv Abraham
David Abrahams
+Marc Abramowitz
Ron Adam
+Ali Afshar
Jim Ahlstrom
Farhan Ahmad
Matthew Ahrens
@@ -36,6 +39,7 @@ Pehr Anderson
Erik Andersén
Oliver Andrich
Ross Andrus
+Juancarlo Añez
Jérémy Anger
Jon Anglin
Heidi Annexstad
@@ -44,13 +48,13 @@ Alicia Arlen
Jason Asbahr
David Ascher
Chris AtLee
+Aymeric Augustin
John Aycock
-Jan-Hein Bührman
Donovan Baarda
Arne Babenhauserheide
Attila Babo
-Alfonso Baciero
Marcin Bachry
+Alfonso Baciero
Dwayne Bailey
Stig Bakken
Greg Ball
@@ -65,22 +69,24 @@ Chris Barker
Anton Barkovsky
Nick Barnes
Quentin Barnes
+David Barnett
Richard Barran
Cesar Eduardo Barros
Des Barry
Ulf Bartelt
Don Bashford
+Pior Bastida
Nick Bastin
Ned Batchelder
Jeff Bauer
-Mike Bayer
Michael R Bax
Anthony Baxter
+Mike Bayer
Samuel L. Bayer
Donald Beaudry
David Beazley
-Robin Becker
Neal Becker
+Robin Becker
Torsten Becker
Bill Bedford
Stefan Behnel
@@ -93,9 +99,11 @@ David Benjamin
Andrew Bennetts
Andy Bensky
Bennett Benson
+Ezra Berch
Michel Van den Bergh
Julian Berman
Brice Berna
+Olivier Bernard
Eric Beser
Steven Bethard
Stephen Bevan
@@ -108,6 +116,7 @@ Philippe Biondi
Stuart Bishop
Roy Bixler
Jonathan Black
+Renaud Blanch
Mike Bland
Martin Bless
Pablo Bleyer
@@ -118,11 +127,13 @@ Paul Boddie
Matthew Boedicker
Robin Boerdijk
David Bolen
-Forest Bond
Gawain Bolton
+Forest Bond
Gregory Bond
+Matias Bordese
Jurjen Bos
Peter Bosch
+Dan Boswell
Eric Bouck
Thierry Bousch
Sebastian Boving
@@ -133,9 +144,11 @@ Monty Brandenberg
Georg Brandl
Christopher Brannon
Terrence Brannon
+Erik Bray
Brian Brazil
Dave Brennan
Tom Bridgman
+Anthony Briggs
Keith Briggs
Tobias Brink
Richard Brodie
@@ -143,6 +156,7 @@ Michael Broghton
Daniel Brotsky
Jean Brouwers
Gary S. Brown
+Titus Brown
Oleg Broytmann
Dave Brueck
Francisco Martín Brugué
@@ -150,6 +164,7 @@ Ian Bruntlett
Floris Bruynooghe
Stan Bubrouski
Erik de Bueger
+Jan-Hein Bührman
Dick Bulterman
Bill Bumgarner
Jimmy Burgett
@@ -159,14 +174,15 @@ Alastair Burt
Tarn Weisner Burton
Lee Busby
Ralph Butler
+Nicolas Cadou
Jp Calderone
Arnaud Calmettes
Daniel Calvelo
Tony Campbell
Brett Cannon
Mike Carlton
+Pierre Carrier
Terry Carroll
-Damien Cassou
Lorenzo M. Catucci
Donn Cave
Charles Cazabon
@@ -179,9 +195,10 @@ Pascal Chambon
John Chandler
Hye-Shik Chang
Jeffrey Chang
-Mitch Chapman
-Greg Chapman
+Godefroid Chapelle
Brad Chapman
+Greg Chapman
+Mitch Chapman
David Chaum
Nicolas Chauvat
Jerry Chen
@@ -196,9 +213,11 @@ Mauro Cicognini
David Cinege
Craig Citro
Gilles Civario
+Chris Clark
Mike Clarkson
Andrew Clegg
Brad Clements
+Robbie Clemons
Steve Clift
Hervé Coatanhay
Nick Coghlan
@@ -209,8 +228,9 @@ Benjamin Collar
Jeffery Collins
Robert Collins
Paul Colomiets
-Denver Coneybeare
+Christophe Combelles
Geremy Condra
+Denver Coneybeare
Juan José Conti
Matt Conway
David M. Cooke
@@ -238,6 +258,7 @@ Tom Culliton
Antonio Cuni
Brian Curtin
Lisandro Dalcin
+Darren Dale
Andrew Dalke
Lars Damerow
Evan Dandrea
@@ -246,10 +267,13 @@ Scott David Daniels
Ben Darnell
Kushal Das
Jonathan Dasteel
+Pierre-Yves David
+Xavier de Gaye
John DeGood
Ned Deily
Vincent Delft
Arnaud Delobelle
+Konrad Delong
Erik Demaine
John Dennis
L. Peter Deutsch
@@ -266,6 +290,7 @@ Daniel Diniz
Humberto Diogenes
Yves Dionne
Daniel Dittmar
+Josip Djolonga
Jaromir Dolecek
Ismail Donmez
Robert Donohue
@@ -292,6 +317,7 @@ Maxim Dzumanenko
Walter Dörwald
Hans Eckardt
Rodolpho Eckhardt
+John Edmonds
Grant Edwards
John Ehresman
Tal Einat
@@ -299,29 +325,35 @@ Eric Eisner
Andrew Eland
Julien Élie
Lance Ellinghaus
+Daniel Ellis
David Ely
Jeff Epler
+Jeff McNeil
Tom Epperly
Stoffel Erasmus
Jürgen A. Erhard
Michael Ernst
Ben Escoto
Andy Eskilsson
+André Espaze
Stefan Esser
Nicolas Estibals
-Stephen D Evans
Carey Evans
+Stephen D Evans
Tim Everett
Paul Everitt
David Everly
Daniel Evers
+Winston Ewert
Greg Ewing
Martijn Faassen
Clovis Fabricio
Andreas Faerber
Bill Fancher
+Michael Farrell
Troy J. Farrell
Mark Favas
+Boris Feld
Niels Ferguson
Sebastian Fernandez
Florian Festi
@@ -341,11 +373,14 @@ Michael Foord
Amaury Forgeot d'Arc
Doug Fort
John Fouhy
+Andrew Francis
Stefan Franke
Martin Franklin
+Bruce Frederiksen
Robin Friedrich
Bradley Froehle
Ivan Frohne
+Matthias Fuchs
Jim Fulton
Tadayoshi Funaba
Gyro Funch
@@ -382,10 +417,13 @@ Dinu Gherman
Jonathan Giddy
Johannes Gijsbers
Michael Gilfix
+Yannick Gingras
Matt Giuca
+Michael Goderbauer
Christoph Gohlke
Tim Golden
Guilherme Gonçalves
+Tiago Gonçalves
Chris Gonnerman
Shelley Gooch
David Goodger
@@ -393,6 +431,7 @@ Hans de Graaff
Nathaniel Gray
Eddy De Greef
Grant Griffin
+Andrea Griffini
Duncan Grisby
Fabian Groffen
Eric Groo
@@ -402,15 +441,18 @@ Thomas Guettler
Michael Guravage
Lars Gustäbel
Thomas Güttler
+Jonas H.
Barry Haddow
Philipp Hagemeister
Paul ten Hagen
Rasmus Hahn
Peter Haight
Václav Haisman
+Walker Hale IV
Bob Halley
Jesse Hallio
Jun Hamano
+Alexandre Hamelin
Anders Hammarquist
Mark Hammond
Harald Hanche-Olsen
@@ -422,6 +464,7 @@ Lynda Hardman
Derek Harland
Jason Harper
Brian Harring
+Jonathan Hartley
Travis B. Hartwell
Larry Hastings
Tim Hatch
@@ -435,6 +478,7 @@ Thomas Heller
Malte Helmert
Lance Finn Helsten
Jonathan Hendry
+Michael Henry
James Henstridge
Kasun Herath
Chris Herborth
@@ -446,10 +490,10 @@ Bernhard Herzog
Magnus L. Hetland
Raymond Hettinger
Kevan Heydon
+Kelsey Hightower
Jason Hildebrand
Richie Hindle
Konrad Hinsen
-Michael Henry
David Hobley
Tim Hochberg
Joerg-Cyril Hoehle
@@ -465,6 +509,7 @@ Thomas Holenstein
Gerrit Holl
Shane Holloway
Rune Holm
+Thomas Holmes
Philip Homburg
Naofumi Honda
Jeffrey Honig
@@ -473,22 +518,27 @@ Michiel de Hoon
Brian Hooper
Randall Hopper
Nadav Horesh
+Alon Horev
Jan Hosang
Ken Howard
Brad Howes
Mike Hoy
Chih-Hao Huang
+Christian Hudon
Lawrence Hudson
Michael Hudson
Jim Hugunin
Greg Humphreys
Eric Huss
+Taihyun Hwang
Jeremy Hylton
Ludwig Hähne
Gerhard Häring
Fredrik Håård
+Catalin Iacob
Mihai Ibanescu
Ali Ikinci
+Aaron Iles
Lars Immisch
Bobby Impollonia
Meador Inge
@@ -508,12 +558,15 @@ Geert Jansen
Jack Jansen
Bill Janssen
Thomas Jarosch
-Zbyszek Jędrzejewski-Szmek
+Juhana Jauhiainen
+Zbigniew Jędrzejewski-Szmek
+Julien Jehannet
Drew Jenkins
Flemming Kjær Jensen
Philip H. Jensen
MunSic Jeong
Chris Jerdonek
+Jim Jewett
Pedro Diaz Jimenez
Orjan Johansen
Fredrik Johansson
@@ -523,13 +576,15 @@ Simon Johnston
Matt Joiner
Thomas Jollans
Nicolas Joly
+Brian K. Jones
Evan Jones
Jeremy Jones
Richard Jones
Irmen de Jong
Lucas de Jonge
-John Jorgensen
+Kristján Valur Jónsson
Jens B. Jorgensen
+John Jorgensen
Sijin Joseph
Andreas Jung
Tattoo Mabonzo K.
@@ -537,22 +592,25 @@ Bohuslav Kabrda
Bob Kahn
Kurt B. Kaiser
Tamito Kajiyama
+Jan Kaliszewski
Peter van Kampen
Rafe Kaplan
Jacob Kaplan-Moss
-Jan Kaliszewski
+Janne Karila
+Per Øyvind Karlsen
Lou Kates
Hiroaki Kawai
Sebastien Keim
Ryan Kelly
Dan Kenigsberg
-Robert Kern
Randall Kern
+Robert Kern
Jim Kerr
Magnus Kessler
Lawrence Kesteloot
Vivek Khera
Mads Kiilerich
+Jason Killen
Jan Kim
Taek Joo Kim
W. Trevor King
@@ -576,6 +634,8 @@ Greg Kochanski
Damon Kohler
Marko Kohtala
Guido Kollerie
+Jacek Konieczny
+Марк Коренберг
Arkady Koplyarov
Peter A. Koren
Vlad Korolev
@@ -589,34 +649,39 @@ Holger Krekel
Michael Kremer
Fabian Kreutz
Cédric Krier
+Pedro Kroger
Hannu Krosing
Andrej Krpic
Ivan Krstić
Andrew Kuchling
Dave Kuhlman
+Jon Kuhn
Vladimir Kushnir
Erno Kuusela
Ross Lagerwall
Cameron Laird
Thomas Lamb
Jean-Baptiste "Jiba" Lamy
+Ronan Lamy
Torsten Landschoff
Åukasz Langa
Tino Lange
Andrew Langmead
Detlef Lannert
Soren Larsen
+Amos Latteier
Piers Lauder
Ben Laurie
Simon Law
Julia Lawall
Chris Lawrence
Brian Leair
+Mathieu Leduc-Hamel
+Christopher Lee
+Inyeol Lee
James Lee
John J. Lee
-Inyeol Lee
Thomas Lee
-Christopher Lee
Tennessee Leeuwenburg
Luc Lefebvre
Glyph Lefkowitz
@@ -630,6 +695,7 @@ Tshepang Lekhonkhobe
Marc-André Lemburg
John Lenton
Christopher Tur Lesniewski-Laas
+Alain Leufroy
Mark Levinson
William Lewis
Akira Li
@@ -650,6 +716,7 @@ Everett Lipman
Mirko Liss
Nick Lockwood
Stephanie Lockwood
+Hugo Lopes Tavares
Anne Lord
Tom Loredo
Justin Love
@@ -663,6 +730,7 @@ Mark Lutz
Jim Lynch
Mikael Lyngvig
Martin von Löwis
+Guillermo López-Anglada
Jeff MacDonald
John Machin
Andrew I MacIntyre
@@ -674,6 +742,7 @@ Grzegorz Makarewicz
David Malcolm
Ken Manheimer
Vladimir Marangozov
+Colin Marc
Vincent Marchetti
David Marek
Doug Marien
@@ -683,8 +752,10 @@ Anthony Martin
Owen Martin
Westley Martínez
Sébastien Martini
+Sidney San Martín
Roger Masse
Nick Mathewson
+Simon Mathieu
Laura Matson
Graham Matthews
Dieter Maurer
@@ -698,8 +769,8 @@ Alan McIntyre
Michael McLay
Mark Mc Mahon
Gordon McMillan
-Caolan McNamara
Andrew McNamara
+Caolan McNamara
Jeff McNeil
Craig McPheeters
Lambert Meertens
@@ -712,6 +783,7 @@ Luke Mewburn
Carl Meyer
Mike Meyer
Piotr Meyer
+Alexis Métaireau
Steven Miale
Trent Mick
Tom Middleton
@@ -719,30 +791,36 @@ Stan Mihai
Stefan Mihaila
Aristotelis Mikropoulos
Paolo Milani
-Damien Miller
Chad Miller
+Damien Miller
Jason V. Miller
Jay T. Miller
Roman Milner
+Julien Miotte
Andrii V. Mishkovskyi
-Dustin J. Mitchell
Dom Mitchell
+Dustin J. Mitchell
+Zubin Mithra
Florian Mladitsch
Doug Moen
The Dragon De Monsyne
Skip Montanaro
+Peter Moody
Paul Moore
Ross Moore
Derek Morr
James A Morrison
+Derek McTavish Mounce
Alessandro Moura
Pablo Mouzo
Mher Movsisyan
Ruslan Mstoi
-Sjoerd Mullender
+Michael Mulich
Sape Mullender
+Sjoerd Mullender
Michael Muller
Neil Muller
+Louis Munro
R. David Murray
Matti Mäki
Dale Nagata
@@ -752,13 +830,14 @@ Travers Naran
Charles-François Natali
Vilmos Nebehaj
Fredrik Nehr
-Trent Nelson
Tony Nelson
+Trent Nelson
Chad Netzer
Max Neunhöffer
George Neville-Neil
Johannes Nicolai
Samuel Nicolary
+Jonathan Niehof
Gustavo Niemeyer
Oscar Nierstrasz
Hrvoje Niksic
@@ -777,6 +856,8 @@ John O'Connor
Kevin O'Connor
Tim O'Malley
Zooko O'Whielacronx
+James Oakley
+Jon Oberheide
Pascal Oberndoerfer
Jeffrey Ollie
Adam Olsen
@@ -806,13 +887,18 @@ Alexandre Parenteau
Dan Parisien
William Park
Harri Pasanen
+Gaël Pasgrimaud
Bo Peng
Joe Peterson
Randy Pausch
Samuele Pedroni
+Justin Peel
Marcel van der Peijl
+Berker Peksag
Steven Pemberton
Santiago Peresón
+George Peristerakis
+Mathieu Perreault
Mark Perrego
Trevor Perrin
Gabriel de Perthuis
@@ -822,6 +908,7 @@ Joe Peterson
Chris Petrilli
Bjorn Pettersen
Justin D. Pettit
+Ronny Pfannschmidt
Geoff Philbrick
Gavrie Philipson
Adrian Phillips
@@ -837,21 +924,25 @@ Michael Piotrowski
Antoine Pitrou
Jean-François Piéronne
Oleg Plakhotnyuk
+Remi Pointel
Guilherme Polo
Michael Pomraning
Iustin Pop
Claudiu Popa
John Popplewell
+Guillaume Pratte
Amrit Prem
Paul Prescod
Donovan Preston
+Paul Price
Jyrki Pulliainen
Steve Purcell
-Fernando Pérez
Eduardo Pérez
+Fernando Pérez
Pierre Quentel
Brian Quinlan
Anders Qvist
+Jérôme Radix
Burton Radons
Jeff Ramnani
Brodie Rao
@@ -867,17 +958,21 @@ Terry J. Reedy
Gareth Rees
Steve Reeves
Lennart Regebro
+John Regehr
+Federico Reghenzani
Ofir Reichenberg
Sean Reifschneider
Michael P. Reilly
Bernhard Reiter
Steven Reiz
Roeland Rengelink
+Antoine Reversat
Flávio Ribeiro
-Tim Rice
Francesco Ricciardi
+Tim Rice
Jan Pieter Riegel
Armin Rigo
+Arc Riley
Nicholas Riley
Jean-Claude Rimbault
Vlad Riscutia
@@ -887,17 +982,21 @@ Davide Rizzo
Anthony Roach
Carl Robben
Mark Roberts
-Jim Robinson
Andy Robinson
+Jim Robinson
Mark Roddy
Kevin Rodgers
Giampaolo Rodola
+Elson Rodriguez
Adi Roiban
+Luis Rojas
Mike Romberg
Armin Ronacher
Case Roole
Timothy Roscoe
+Erik Rose
Jim Roskind
+Brian Rosner
Guido van Rossum
Just van Rossum
Hugo van Rossum
@@ -915,9 +1014,11 @@ Rauli Ruohonen
Jeff Rush
Sam Rushing
Mark Russell
+Rusty Russell
Nick Russo
Chris Ryland
Constantina S.
+Patrick Sabin
Sébastien Sablé
Suman Saha
Hajime Saitou
@@ -925,6 +1026,7 @@ George Sakkis
Rich Salz
Kevin Samborn
Adrian Sampson
+James Sanders
Ilya Sandler
Mark Sapiro
Ty Sarna
@@ -952,15 +1054,16 @@ Sam Schulenburg
Stefan Schwarzer
Dietmar Schwertberger
Federico Schwindt
-Steven Scott
Barry Scott
+Steven Scott
Nick Seidenman
Žiga Seilnacht
Yury Selivanov
Fred Sells
Jiwon Seo
+Iñigo Serna
Joakim Sernbrant
-Roger Serwy
+Roger D. Serwy
Jerry Seutter
Pete Sevander
Denis Severson
@@ -986,20 +1089,24 @@ Michael Simcich
Ionel Simionescu
Kirill Simonov
Nathan Paul Simons
+Adam Simpkins
Janne Sinkkonen
Ng Pheng Siong
George Sipe
J. Sipprell
Kragen Sitaker
Michael Sloan
-Eric V. Smith
Christopher Smith
+Eric V. Smith
Gregory P. Smith
+Mark Smith
Roy Smith
Rafal Smotrzyk
+Eric Snow
Dirk Soede
Paul Sokolovsky
Cody Somerville
+Edoardo Spadolini
Clay Spence
Stefan Sperling
Nicholas Spies
@@ -1011,10 +1118,13 @@ RajGopal Srinivasan
Tage Stabell-Kulo
Quentin Stafford-Fraser
Frank Stajano
+Joel Stanley
Anthony Starks
Oliver Steele
Greg Stein
+Baruch Sterin
Chris Stern
+Alex Stewart
Victor Stinner
Richard Stoakley
Peter Stoehr
@@ -1030,6 +1140,7 @@ Pal Subbiah
Nathan Sullivan
Mark Summerfield
Reuben Sumner
+Marek Å uppa
Hisao Suzuki
Kalle Svensson
Andrew Svetlov
@@ -1043,8 +1154,8 @@ Musashi Tamura
William Tanksley
Christian Tanzer
Steven Taschuk
-Monty Taylor
Amy Taylor
+Monty Taylor
Anatoly Techtonik
Mikhail Terekhov
Richard M. Tew
@@ -1062,13 +1173,18 @@ Jason Tishler
Christian Tismer
Jim Tittsler
Frank J. Tobin
-R Lindsay Todd
Bennett Todd
+R Lindsay Todd
+Eugene Toder
Erik Tollerud
+Stephen Tonkin
Matias Torchinsky
Sandro Tosi
Richard Townsend
+David Townshend
Laurence Tratt
+Alberto Trevino
+Matthias Troffaes
John Tromp
Jason Trowbridge
Brent Tubbs
@@ -1104,6 +1220,7 @@ John Viega
Kannan Vijayan
Kurt Vile
Norman Vine
+Pauli Virtanen
Frank Visser
Johannes Vogel
Martijn Vries
@@ -1142,10 +1259,10 @@ Frank Wierzbicki
Bryce "Zooko" Wilcox-O'Hearn
Timothy Wild
Jakub Wilk
+Gerald S. Williams
Jason Williams
John Williams
Sue Williams
-Gerald S. Williams
Steven Willis
Frank Willison
Greg V. Wilson
@@ -1167,8 +1284,8 @@ Dan Wolfe
Richard Wolff
Adam Woodbeck
Steven Work
-Darren Worrall
Gordon Worley
+Darren Worrall
Thomas Wouters
Heiko Wundram
Doug Wyatt
@@ -1177,6 +1294,7 @@ Florent Xicluna
Hirokazu Yamamoto
Ka-Ping Yee
Jason Yeo
+EungJun Yi
Bob Yodlowski
Danny Yoo
Rory Yorke
diff --git a/Misc/HISTORY b/Misc/HISTORY
index a7fba2b..8327dca 100644
--- a/Misc/HISTORY
+++ b/Misc/HISTORY
@@ -10,6 +10,5403 @@ file of the release25-maint branch.)
======================================================================
+What's New in Python 3.2?
+=========================
+
+*Release date: 20-Feb-2011*
+
+Core and Builtins
+-----------------
+
+- Issue #11249: Fix potential crashes when using the limited API.
+
+Build
+-----
+
+- Issue #11222: Fix non-framework shared library build on Mac OS X.
+
+- Issue #11184: Fix large-file support on AIX.
+
+- Issue #941346: Fix broken shared library build on AIX.
+
+Documentation
+-------------
+
+- Issue #10709: Add updated AIX notes in Misc/README.AIX.
+
+
+What's New in Python 3.2 Release Candidate 3?
+=============================================
+
+*Release date: 13-Feb-2011*
+
+Core and Builtins
+-----------------
+
+- Issue #11134: Add missing fields to typeslots.h.
+
+- Issue #11135: Remove redundant doc field from PyType_Spec.
+
+- Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check in the limited
+ ABI.
+
+- Issue #11118: Fix bogus export of None in python3.dll.
+
+Library
+-------
+
+- Issue #11116: any error during addition of a message to a mailbox now causes a
+ rollback, instead of leaving the mailbox partially modified.
+
+- Issue #11132: Fix passing of "optimize" parameter when recursing in
+ compileall.compile_dir().
+
+- Issue #11110: Fix a potential decref of a NULL in sqlite3.
+
+- Issue #8275: Fix passing of callback arguments with ctypes under Win64. Patch
+ by Stan Mihai.
+
+Build
+-----
+
+- Issue #11079: The /Applications/Python x.x folder created by the Mac OS X
+ installers now includes a link to the installed documentation and no longer
+ includes an Extras directory. The Tools directory is now installed in the
+ framework under share/doc.
+
+- Issue #11121: Fix building with --enable-shared.
+
+Tests
+-----
+
+- Issue #10971: test_zipimport_support is once again compatible with the refleak
+ hunter feature of test.regrtest.
+
+
+What's New in Python 3.2 Release Candidate 2?
+=============================================
+
+*Release date: 30-Jan-2011*
+
+Core and Builtins
+-----------------
+
+- Issue #10451: memoryview objects could allow to mutate a readable buffer.
+ Initial patch by Ross Lagerwall.
+
+Library
+-------
+
+- Issue #9124: mailbox now accepts binary input and reads and writes mailbox
+ files in binary mode, using the email package's binary support to parse
+ arbitrary email messages. StringIO and text file input is deprecated,
+ and string input fails early if non-ASCII characters are used, where
+ previously it would fail when the email was processed in a later step.
+
+- Issue #10845: Mitigate the incompatibility between the multiprocessing
+ module on Windows and the use of package, zipfile or directory execution
+ by special casing main modules that actually *are* called __main__.py.
+
+- Issue #11045: Protect logging call against None argument.
+
+- Issue #11052: Correct IDLE menu accelerators on Mac OS X for Save
+ commands.
+
+- Issue #11053: Fix IDLE "Syntax Error" windows to behave as in 2.x,
+ preventing a confusing hung appearance on OS X with the windows
+ obscured.
+
+- Issue #10940: Workaround an IDLE hang on Mac OS X 10.6 when using the
+ menu accelerators for Open Module, Go to Line, and New Indent Width.
+ The accelerators still work but no longer appear in the menu items.
+
+- Issue #10989: Fix a crash on SSLContext.load_verify_locations(None, True).
+
+- Issue #11020: Command-line pyclbr was broken because of missing 2-to-3
+ conversion.
+
+- Issue #11019: Fixed BytesGenerator so that it correctly handles a Message
+ with a None body.
+
+- Issue #11014: Make 'filter' argument in tarfile.Tarfile.add() into a
+ keyword-only argument. The preceding positional argument was deprecated,
+ so it made no sense to add filter as a positional argument.
+
+- Issue #11004: Repaired edge case in deque.count().
+
+- Issue #10974: IDLE no longer crashes if its recent files list includes files
+ with non-ASCII characters in their path names.
+
+- Have hashlib.algorithms_available and hashlib.algorithms_guaranteed both
+ return sets instead of one returning a tuple and the other a frozenset.
+
+- Issue #10987: Fix the recursion limit handling in the _pickle module.
+
+- Issue #10983: Fix several bugs making tunnel requests in http.client.
+
+- Issue #10955: zipimport uses ASCII encoding instead of cp437 to decode
+ filenames, at bootstrap, if the codec registry is not ready yet. It is still
+ possible to have non-ASCII filenames using the Unicode flag (UTF-8 encoding)
+ for all file entries in the ZIP file.
+
+- Issue #10949: Improved robustness of rotating file handlers.
+
+- Issue #10955: Fix a potential crash when trying to mmap() a file past its
+ length. Initial patch by Ross Lagerwall.
+
+- Issue #10898: Allow compiling the posix module when the C library defines
+ a symbol named FSTAT.
+
+- Issue #10980: the HTTP server now encodes headers with iso-8859-1 (latin1)
+ encoding. This is the preferred encoding of PEP 3333 and the base encoding
+ of HTTP 1.1.
+
+- To match the behaviour of HTTP server, the HTTP client library now also
+ encodes headers with iso-8859-1 (latin1) encoding. It was already doing
+ that for incoming headers which makes this behaviour now consistent in
+ both incoming and outgoing direction.
+
+- Issue #9509: argparse now properly handles IOErrors raised by
+ argparse.FileType.
+
+- Issue #10961: The new pydoc server now better handles exceptions raised
+ during request handling.
+
+- Issue #10680: Fix mutually exclusive arguments for argument groups in
+ argparse.
+
+Build
+-----
+
+- Issue #11054: Allow Mac OS X installer builds to again work on 10.5 with
+ the system-provided Python.
+
+
+What's New in Python 3.2 Release Candidate 1
+============================================
+
+*Release date: 16-Jan-2011*
+
+Core and Builtins
+-----------------
+
+- Issue #10889: range indexing and slicing now works correctly on ranges with
+ a length that exceeds sys.maxsize.
+
+- Issue #10892: Don't segfault when trying to delete __abstractmethods__ from a
+ class.
+
+- Issue #8020: Avoid a crash where the small objects allocator would read
+ non-Python managed memory while it is being modified by another thread. Patch
+ by Matt Bandy.
+
+- Issue #10841: On Windows, set the binary mode on stdin, stdout, stderr and all
+ io.FileIO objects (to not translate newlines, \r\n <=> \n). The Python parser
+ translates newlines (\r\n => \n).
+
+- Remove buffer API from stable ABI for now, see #10181.
+
+- Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
+ doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
+ (length bigger than 2^31-1 bytes).
+
+- Issue #9015, #9611: FileIO.readinto(), FileIO.write(), os.write() and
+ stdprinter.write() clamp the length to INT_MAX on Windows.
+
+- Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime()
+ can now handle dates after 2038.
+
+- Issue #10780: PyErr_SetFromWindowsErrWithFilename() and
+ PyErr_SetExcFromWindowsErrWithFilename() decode the filename from the
+ filesystem encoding instead of UTF-8.
+
+- Issue #10779: PyErr_WarnExplicit() decodes the filename from the filesystem
+ encoding instead of UTF-8.
+
+- Add sys.flags attribute for the new -q command-line option.
+
+- Issue #11506: Trying to assign to a bytes literal should result in a
+ SyntaxError.
+
+Library
+-------
+
+- Issue #10916: mmap should not segfault when a file is mapped using 0 as length
+ and a non-zero offset, and an attempt to read past the end of file is made
+ (IndexError is raised instead). Patch by Ross Lagerwall.
+
+- Issue #10154, #10090: change the normalization of UTF-8 to "UTF-8" instead
+ of "UTF8" in the locale module as the latter is not supported MacOSX and OpenBSD.
+
+- Issue #10907: Warn OS X 10.6 IDLE users to use ActiveState Tcl/Tk 8.5, rather
+ than the currently problematic Apple-supplied one, when running with the
+ 64-/32-bit installer variant.
+
+- Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
+ as unicode, and accept binary files. Add encoding and errors attributes to
+ cgi.FieldStorage. Patch written by Pierre Quentel (with many inputs by Glenn
+ Linderman).
+
+- Add encoding and errors arguments to urllib.parse_qs() and urllib.parse_qsl().
+
+- Issue #10899: No function type annotations in the standard library. Removed
+ function type annotations from _pyio.py.
+
+- Issue #10875: Update Regular Expression HOWTO; patch by 'SilentGhost'.
+
+- Issue #10872: The repr() of TextIOWrapper objects now includes the mode
+ if available.
+
+- Issue #10869: Fixed bug where ast.increment_lineno modified the root node
+ twice.
+
+- Issue #5871: email.header.Header.encode now raises an error if any
+ continuation line in the formatted value has no leading white space and looks
+ like a header. Since Generator uses Header to format all headers, this check
+ is made for all headers in any serialized message at serialization time. This
+ provides protection against header injection attacks.
+
+- Issue #10859: Make ``contextlib.GeneratorContextManager`` officially
+ private by renaming it to ``_GeneratorContextManager``.
+
+- Issue #10042: Fixed the total_ordering decorator to handle cross-type
+ comparisons that could lead to infinite recursion.
+
+- Issue #10686: the email package now :rfc:`2047`\ -encodes headers with
+ non-ASCII bytes (parsed by a BytesParser) when doing conversion to 7bit-clean
+ presentation, instead of replacing them with ?s.
+
+- email.header.Header was incorrectly encoding folding whitespace when
+ rfc2047-encoding header values with embedded newlines, leaving them without
+ folding whitespace. It now uses the continuation_ws, as it does for
+ continuation lines that it creates itself.
+
+- Issue #1777412, #10827: Changed the rules for 2-digit years. The
+ time.asctime(), time.ctime() and time.strftime() functions will now format
+ any year when ``time.accept2dyear`` is False and will accept years >= 1000
+ otherwise. ``time.mktime`` and ``time.strftime`` now accept full range
+ supported by the OS. With Visual Studio or on Solaris, the year is limited to
+ the range [1; 9999]. Conversion of 2-digit years to 4-digit is deprecated.
+
+- Issue #7858: Raise an error properly when os.utime() fails under Windows
+ on an existing file.
+
+- Issue #3839: wsgiref should not override a Content-Length header set by
+ the application. Initial patch by Clovis Fabricio.
+
+- Issue #10492: bdb.Bdb.run() only traces the execution of the code, not the
+ compilation (if the input is a string).
+
+- Issue #7995: When calling accept() on a socket with a timeout, the returned
+ socket is now always blocking, regardless of the operating system.
+
+- Issue #10756: atexit normalizes the exception before displaying it. Patch by
+ Andreas Stührk.
+
+- Issue #10790: email.header.Header.append's charset logic now works correctly
+ for charsets whose output codec is different from its input codec.
+
+- Issue #10819: SocketIO.name property returns -1 when its closed, instead of
+ raising a ValueError, to fix repr().
+
+- Issue #8650: zlib.compress() and zlib.decompress() raise an OverflowError if
+ the input buffer length doesn't fit into an unsigned int (length bigger than
+ 2^32-1 bytes).
+
+- Issue #6643: Reinitialize locks held within the threading module after fork to
+ avoid a potential rare deadlock or crash on some platforms.
+
+- Issue #10806, issue #9905: Fix subprocess pipes when some of the standard file
+ descriptors (0, 1, 2) are closed in the parent process. Initial patch by Ross
+ Lagerwall.
+
+- `unittest.TestCase` can be instantiated without a method name; for simpler
+ exploration from the interactive interpreter.
+
+- Issue #10798: Reject supporting concurrent.futures if the system has too
+ few POSIX semaphores.
+
+- Issue #10807: Remove base64, bz2, hex, quopri, rot13, uu and zlib codecs from
+ the codec aliases. They are still accessible via codecs.lookup().
+
+- Issue #10801: In zipfile, support different encodings for the header and the
+ filenames.
+
+- Issue #6285: IDLE no longer crashes on missing help file; patch by Scott
+ David Daniels.
+
+- Fix collections.OrderedDict.setdefault() so that it works in subclasses that
+ define __missing__().
+
+- Issue #10786: unittest.TextTestRunner default stream no longer bound at import
+ time. `sys.stderr` now looked up at instantiation time. Fix contributed by
+ Mark Roddy.
+
+- Issue #10753: Characters ';', '=' and ',' in the PATH_INFO environment variable
+ won't be quoted when the URI is constructed by the wsgiref.util's request_uri
+ method. According to RFC 3986, these characters can be a part of params in
+ PATH component of URI and need not be quoted.
+
+- Issue #10738: Fix webbrowser.Opera.raise_opts.
+
+- Issue #9824: SimpleCookie now encodes , and ; in values to cater to how
+ browsers actually parse cookies.
+
+- Issue #9333: os.symlink now available regardless of user privileges. The
+ function now raises OSError on Windows >=6.0 when the user is unable to create
+ symbolic links. XP and 2003 still raise NotImplementedError.
+
+- Issue #10783: struct.pack() no longer implicitly encodes unicode to UTF-8.
+
+- Issue #10730: Add SVG mime types to mimetypes module.
+
+- Issue #10768: Make the Tkinter ScrolledText widget work again.
+
+- Issue #10777: Fix "dictionary changed size during iteration" bug in
+ ElementTree register_namespace().
+
+- Issue #10626: test_logging now preserves logger disabled states.
+
+- Issue #10774: test_logging now removes temp files created during tests.
+
+- Issue #5258/#10642: if site.py encounters a .pth file that generates an error,
+ it now prints the filename, line number, and traceback to stderr and skips
+ the rest of that individual file, instead of stopping processing entirely.
+
+- Issue #10763: subprocess.communicate() closes stdout and stderr if both are
+ pipes (bug specific to Windows).
+
+- Issue #1693546: fix email.message RFC 2231 parameter encoding to be in better
+ compliance (no "s around encoded values).
+
+- Improved the diff message in the unittest module's assertCountEqual().
+
+- Issue #1155362: email.utils.parsedate_tz now handles a missing space before
+ the '-' of a timezone field as well as before a '+'.
+
+- Issue #4871: The zipfile module now gives a more useful error message if
+ an attempt is made to use a string to specify the archive password.
+
+- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.
+
+- Deprecated assertDictContainsSubset() in the unittest module.
+
+C-API
+-----
+
+- PyObject_CallMethod now passes along any underlying AttributeError from
+ PyObject_GetAttr, instead of replacing it with something less informative
+
+- Issue #10913: Deprecate misleading functions PyEval_AcquireLock() and
+ PyEval_ReleaseLock(). The thread-state aware APIs should be used instead.
+
+- Issue #10333: Remove ancient GC API, which has been deprecated since Python
+ 2.2.
+
+Build
+-----
+
+- Issue #10843: Update third-party library versions used in OS X 32-bit
+ installer builds: bzip2 1.0.6, readline 6.1.2, SQLite 3.7.4 (with FTS3/FTS4
+ and RTREE enabled), and ncursesw 5.5 (wide-char support enabled).
+
+- Issue #10820: Fix OS X framework installs to support version-specific
+ scripts (#10679).
+
+- Issue #7716: Under Solaris, don't assume existence of /usr/xpg4/bin/grep in
+ the configure script but use $GREP instead. Patch by Fabian Groffen.
+
+- Issue #10475: Don't hardcode compilers for LDSHARED/LDCXXSHARED on NetBSD
+ and DragonFly BSD. Patch by Nicolas Joly.
+
+- Issue #10679: The "idle", "pydoc" and "2to3" scripts are now installed with
+ a version-specific suffix on "make altinstall".
+
+- Issue #10655: Fix the build on PowerPC on Linux with GCC when building with
+ timestamp profiling (--with-tsc): the preprocessor test for the PowerPC
+ support now looks for "__powerpc__" as well as "__ppc__": the latter seems to
+ only be present on OS X; the former is the correct one for Linux with GCC.
+
+- Issue #1099: Fix the build on MacOSX when building a framework with pydebug
+ using GCC 4.0.
+
+Tools/Demos
+-----------
+
+- Issue #10843: Install the Tools directory on OS X in the applications Extras
+ (/Applications/Python 3.n/Extras/) where the Demo directory had previous been
+ installed.
+
+- Issue #7962: The Demo directory is gone. Most of the old and unmaintained
+ demos have been removed, others integrated in documentation or a new
+ Tools/demo subdirectory.
+
+- Issue #10502: Addition of the unittestgui tool. Originally by Steve Purcell.
+ Updated for test discovery by Mark Roddy and Python 3 compatibility by Brian
+ Curtin.
+
+Tests
+-----
+
+- Issue #11910: Fix test_heapq to skip the C tests when _heapq is missing.
+
+- Fix test_startfile to wait for child process to terminate before finishing.
+
+- Issue #10822: Fix test_posix:test_getgroups failure under Solaris. Patch
+ by Ross Lagerwall.
+
+- Make the --coverage flag work for test.regrtest.
+
+- Issue #1677694: Refactor and improve test_timeout. Original patch by
+ Björn Lindqvist.
+
+- Issue #5485: Add tests for the UseForeignDTD method of expat parser objects.
+ Patch by Jean-Paul Calderone and Sandro Tosi.
+
+- Issue #6293: Have regrtest.py echo back sys.flags. This is done by default in
+ whole runs and enabled selectively using ``--header`` when running an explicit
+ list of tests. Original patch by Collin Winter.
+
+
+What's New in Python 3.2 Beta 2?
+================================
+
+*Release date: 19-Dec-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #8844: Regular and recursive lock acquisitions can now be interrupted
+ by signals on platforms using pthreads. Patch by Reid Kleckner.
+
+- Issue #4236: PyModule_Create2 now checks the import machinery directly
+ rather than the Py_IsInitialized flag, avoiding a Fatal Python
+ error in certain circumstances when an import is done in __del__.
+
+- Issue #5587: add a repr to dict_proxy objects. Patch by David Stanek and
+ Daniel Urban.
+
+Library
+-------
+
+- Issue #3243: Support iterable bodies in httplib. Patch Contributions by
+ Xuanji Li and Chris AtLee.
+
+- Issue #10611: SystemExit exception will no longer kill a unittest run.
+
+- Issue #9857: It is now possible to skip a test in a setUp, tearDown or clean
+ up function.
+
+- Issue #10573: use actual/expected consistently in unittest methods.
+ The order of the args of assertCountEqual is also changed.
+
+- Issue #9286: email.utils.parseaddr no longer concatenates blank-separated
+ words in the local part of email addresses, thereby preserving the input.
+
+- Issue #6791: Limit header line length (to 65535 bytes) in http.client
+ and http.server, to avoid denial of services from the other party.
+
+- Issue #10404: Use ctl-button-1 on OSX for the context menu in Idle.
+
+- Issue #9907: Fix tab handling on OSX when using editline by calling
+ rl_initialize first, then setting our custom defaults, then reading .editrc.
+
+- Issue #4188: Avoid creating dummy thread objects when logging operations
+ from the threading module (with the internal verbose flag activated).
+
+- Issue #10711: Remove HTTP 0.9 support from http.client. The ``strict``
+ parameter to HTTPConnection and friends is deprecated.
+
+- Issue #9721: Fix the behavior of urljoin when the relative url starts with a
+ ';' character. Patch by Wes Chow.
+
+- Issue #10714: Limit length of incoming request in http.server to 65536 bytes
+ for security reasons. Initial patch by Ross Lagerwall.
+
+- Issue #9558: Fix distutils.command.build_ext with VS 8.0.
+
+- Issue #10667: Fast path for collections.Counter().
+
+- Issue #10695: passing the port as a string value to telnetlib no longer
+ causes debug mode to fail.
+
+- Issue #1078919: add_header now automatically RFC2231 encodes parameters
+ that contain non-ascii values.
+
+- Issue #10188 (partial resolution): tempfile.TemporaryDirectory emits
+ a warning on sys.stderr rather than throwing a misleading exception
+ if cleanup fails due to nulling out of modules during shutdown.
+ Also avoids an AttributeError when mkdtemp call fails and issues
+ a ResourceWarning on implicit cleanup via __del__.
+
+- Issue #10107: Warn about unsaved files in IDLE on OSX.
+
+- Issue #7213: subprocess.Popen's default for close_fds has been changed.
+ It is now True in most cases other than on Windows when input, output or
+ error handles are provided.
+
+- Issue #6559: subprocess.Popen has a new pass_fds parameter (actually
+ added in 3.2beta1) to allow specifying a specific list of file descriptors
+ to keep open in the child process.
+
+- Issue #1731717: Fixed the problem where subprocess.wait() could cause an
+ OSError exception when The OS had been told to ignore SIGCLD in our process
+ or otherwise not wait for exiting child processes.
+
+Tests
+-----
+
+- Issue #775964: test_grp now skips YP/NIS entries instead of failing when
+ encountering them.
+
+Tools/Demos
+-----------
+
+- Issue #6075: IDLE on Mac OS X now works with both Carbon AquaTk and
+ Cocoa AquaTk.
+
+- Issue #10710: ``Misc/setuid-prog.c`` is removed from the source tree.
+
+- Issue #10706: Remove outdated script runtests.sh. Either ``make test``
+ or ``python -m test`` should be used instead.
+
+Build
+-----
+
+- The Windows build now uses Tcl/Tk 8.5.9 and sqlite3 3.7.4.
+
+- Issue #9234: argparse supports alias names for subparsers.
+
+
+What's New in Python 3.2 Beta 1?
+================================
+
+*Release date: 05-Dec-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #10630: Return dict views from the dict proxy keys()/values()/items()
+ methods.
+
+- Issue #10596: Fix float.__mod__ to have the same behaviour as float.__divmod__
+ with respect to signed zeros. -4.0 % 4.0 should be 0.0, not -0.0.
+
+- Issue #1772833: Add the -q command-line option to suppress copyright and
+ version output in interactive mode.
+
+- Provide an *optimize* parameter in the built-in compile() function.
+
+- Fixed several corner case issues on Windows in os.stat/os.lstat related to
+ reparse points.
+
+- PEP 384 (Defining a Stable ABI) is implemented.
+
+- Issue #2690: Range objects support negative indices and slicing.
+
+- Issue #9915: Speed up sorting with a key.
+
+- Issue #8685: Speed up set difference ``a - b`` when source set ``a`` is much
+ larger than operand ``b``. Patch by Andrew Bennetts.
+
+- Issue #10518: Bring back the callable() builtin.
+
+- Issue #7094: Added alternate formatting (specified by '#') to ``__format__``
+ method of float, complex, and Decimal. This allows more precise control over
+ when decimal points are displayed.
+
+- Issue #10474: range.count() should return integers.
+
+- Issue #1574217: isinstance now catches only AttributeError, rather than
+ masking all errors.
+
+Library
+-------
+
+- logging: added "handler of last resort". See http://bit.ly/last-resort-handler
+
+- test.support: Added TestHandler and Matcher classes for better support of
+ assertions about logging.
+
+- Issue #4391: Use proper plural forms in argparse.
+
+- Issue #10601: sys.displayhook uses 'backslashreplace' error handler on
+ UnicodeEncodeError.
+
+- Add the "display" and "undisplay" pdb commands.
+
+- Issue #7245: Add a SIGINT handler in pdb that allows to break a program again
+ after a "continue" command.
+
+- Add the "interact" pdb command.
+
+- Issue #7905: Actually respect the keyencoding parameter to shelve.Shelf.
+
+- Issue #1569291: Speed up array.repeat().
+
+- Provide an interface to set the optimization level of compilation in
+ py_compile, compileall and zipfile.PyZipFile.
+
+- Issue #7904: Changes to urllib.parse.urlsplit to handle schemes as defined by
+ RFC3986. Anything before :// is considered a scheme and is followed by an
+ authority (or netloc) and by '/' led path, which is optional.
+
+- Issue #6045: dbm.gnu databases now support get() and setdefault() methods.
+
+- Issue #10620: `python -m unittest` can accept file paths instead of module
+ names for running specific tests.
+
+- Issue #9424: Deprecate the `unittest.TestCase` methods `assertEquals`,
+ `assertNotEquals`, `assertAlmostEquals`, `assertNotAlmostEquals` and `assert_`
+ and replace them with the correct methods in the Python test suite.
+
+- Issue #10272: The ssl module now raises socket.timeout instead of a generic
+ SSLError on socket timeouts.
+
+- Issue #10528: Allow translators to reorder placeholders in localizable
+ messages from argparse.
+
+- Issue #10497: Fix incorrect use of gettext in argparse.
+
+- Issue #10478: Reentrant calls inside buffered IO objects (for example by
+ way of a signal handler) now raise a RuntimeError instead of freezing the
+ current process.
+
+- logging: Added getLogRecordFactory/setLogRecordFactory with docs and tests.
+
+- Issue #10549: Fix pydoc traceback when text-documenting certain classes.
+
+- Issue #2001: New HTML server with enhanced Web page features. Patch by Ron
+ Adam.
+
+- Issue #10360: In WeakSet, do not raise TypeErrors when testing for membership
+ of non-weakrefable objects.
+
+- Issue #940286: pydoc.Helper.help() ignores input/output init parameters.
+
+- Issue #1745035: Add a command size and data size limit to smtpd.py, to prevent
+ DoS attacks. Patch by Savio Sena.
+
+- Issue #4925: Add filename to error message when executable can't be found in
+ subprocess.
+
+- Issue #10391: Don't dereference invalid memory in error messages in the ast
+ module.
+
+- Issue #10027: st_nlink was not being set on Windows calls to os.stat or
+ os.lstat. Patch by Hirokazu Yamamoto.
+
+- Issue #9333: Expose os.symlink only when the SeCreateSymbolicLinkPrivilege is
+ held by the user's account, i.e., when the function can actually be used.
+
+- Issue #8879: Add os.link support for Windows.
+
+- Issue #7911: ``unittest.TestCase.longMessage`` defaults to True for improved
+ failure messages by default. Patch by Mark Roddy.
+
+- Issue #1486713: HTMLParser now has an optional tolerant mode where it tries to
+ guess at the correct parsing of invalid html.
+
+- Issue #10554: Add context manager support to subprocess.Popen objects.
+
+- Issue #8989: email.utils.make_msgid now has a domain parameter that can
+ override the domain name used in the generated msgid.
+
+- Issue #9299: Add exist_ok parameter to os.makedirs to suppress the 'File
+ exists' exception when a target directory already exists with the specified
+ mode. Patch by Ray Allen.
+
+- Issue #9573: os.fork() now works correctly when triggered as a side effect of
+ a module import.
+
+- Issue #10464: netrc now correctly handles lines with embedded '#' characters.
+
+- Added itertools.accumulate().
+
+- Issue #4113: Added custom ``__repr__`` method to ``functools.partial``.
+ Original patch by Daniel Urban.
+
+- Issue #10273: Rename `assertRegexpMatches` and `assertRaisesRegexp` to
+ `assertRegex` and `assertRaisesRegex`.
+
+- Issue #10535: Enable silenced warnings in unittest by default.
+
+- Issue #9873: The URL parsing functions in urllib.parse now accept ASCII byte
+ sequences as input in addition to character strings.
+
+- Issue #10586: The statistics API for the new functools.lru_cache has been
+ changed to a single cache_info() method returning a named tuple.
+
+- Issue #10323: itertools.islice() now consumes the minimum number of inputs
+ before stopping. Formerly, the final state of the underlying iterator was
+ undefined.
+
+- Issue #10565: The collections.Iterator ABC now checks for both __iter__ and
+ __next__.
+
+- Issue #10242: Fixed implementation of unittest.ItemsEqual and gave it a new
+ more informative name, unittest.CountEqual.
+
+- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.
+
+- Issue #2986: difflib.SequenceMatcher gets a new parameter, autojunk, which can
+ be set to False to turn off the previously undocumented 'popularity'
+ heuristic. Patch by Terry Reedy and Eli Bendersky.
+
+- Issue #10534: in difflib, expose bjunk and bpopular sets; deprecate
+ undocumented and now redundant isbjunk and isbpopular methods.
+
+- Issue #9846: zipfile is now correctly closing underlying file objects.
+
+- Issue #10459: Update CJK character names to Unicode 6.0.
+
+- Issue #4493: urllib.request adds '/' in front of path components which does not
+ start with '/. Common behavior exhibited by browsers and other clients.
+
+- Issue #6378: idle.bat now runs with the appropriate Python version rather than
+ the system default. Patch by Sridhar Ratnakumar.
+
+- Issue #10470: 'python -m unittest' will now run test discovery by default,
+ when no extra arguments have been provided.
+
+- Issue #3709: BaseHTTPRequestHandler will buffer the headers and write to
+ output stream only when end_headers is invoked. This is a speedup and an
+ internal optimization. Patch by Andrew Shaaf.
+
+- Issue #10220: Added inspect.getgeneratorstate. Initial patch by Rodolpho
+ Eckhardt.
+
+- Issue #10453: compileall now uses argparse instead of getopt, and thus
+ provides clean output when called with '-h'.
+
+- Issue #8078: Add constants for higher baud rates in the termios module. Patch
+ by Rodolpho Eckhardt.
+
+- Issue #10407: Fix two NameErrors in distutils.
+
+- Issue #10371: Deprecated undocumented functions in the trace module.
+
+- Issue #10467: Fix BytesIO.readinto() after seeking into a position after the
+ end of the file.
+
+- configparser: 100% test coverage.
+
+- Issue #10499: configparser supports pluggable interpolation handlers. The
+ default classic interpolation handler is called BasicInterpolation. Another
+ interpolation handler added (ExtendedInterpolation) which supports the syntax
+ used by zc.buildout (e.g. interpolation between sections).
+
+- configparser: the SafeConfigParser class has been renamed to ConfigParser.
+ The legacy ConfigParser class has been removed but its interpolation mechanism
+ is still available as LegacyInterpolation.
+
+- configparser: Usage of RawConfigParser is now discouraged for new projects
+ in favor of ConfigParser(interpolation=None).
+
+- Issue #1682942: configparser supports alternative option/value delimiters.
+
+- Issue #5412: configparser supports mapping protocol access.
+
+- Issue #9411: configparser supports specifying encoding for read operations.
+
+- Issue #9421: configparser's getint(), getfloat() and getboolean() methods
+ accept vars and default arguments just like get() does.
+
+- Issue #9452: configparser supports reading from strings and dictionaries
+ (thanks to the mapping protocol API, the latter can be used to copy data
+ between parsers).
+
+- configparser: accepted INI file structure is now customizable, including
+ comment prefixes, name of the DEFAULT section, empty lines in multiline
+ values, and indentation.
+
+- Issue #10326: unittest.TestCase instances can be pickled.
+
+- Issue #9926: Wrapped TestSuite subclass does not get __call__ executed.
+
+- Issue #9920: Skip tests for cmath.atan and cmath.atanh applied to complex
+ zeros on systems where the log1p function fails to respect the sign of zero.
+ This fixes a test failure on AIX.
+
+- Issue #9732: Addition of getattr_static to the inspect module.
+
+- Issue #10446: Module documentation generated by pydoc now links to a
+ version-specific online reference manual.
+
+- Make the 'No module named' exception message from importlib consistent.
+
+- Issue #10443: Add the SSLContext.set_default_verify_paths() method.
+
+- Issue #10440: Support RUSAGE_THREAD as a constant in the resource module.
+ Patch by Robert Collins.
+
+- Issue #10429: IMAP.starttls() stored the capabilities as bytes objects, rather
+ than strings.
+
+C-API
+-----
+
+- Issue #10557: Added a new API function, PyUnicode_TransformDecimalToASCII(),
+ which transforms non-ASCII decimal digits in a Unicode string to their ASCII
+ equivalents.
+
+- Issue #9518: Extend the PyModuleDef_HEAD_INIT macro to explicitly
+ zero-initialize all fields, fixing compiler warnings seen when building
+ extension modules with gcc with "-Wmissing-field-initializers" (implied by
+ "-W").
+
+- Issue #10255: Fix reference leak in Py_InitializeEx(). Patch by Neil
+ Schemenauer.
+
+- structseq.h is now included in Python.h.
+
+- Loosen PyArg_ValidateKeywordArguments to allow dict subclasses.
+
+Tests
+-----
+
+- regrtest.py once again ensures the test directory is removed from sys.path
+ when it is invoked directly as the __main__ module.
+
+- `python -m test` can be used to run the test suite as well as `python -m
+ test.regrtest`.
+
+- Do not fail test_socket when the IP address of the local hostname cannot be
+ looked up.
+
+- Issue #8886: Use context managers throughout test_zipfile. Patch by Eric
+ Carstensen.
+
+Build
+-----
+
+- Issue #10325: Fix two issues in the fallback definitions for PY_ULLONG_MAX and
+ PY_LLONG_MAX that made them unsuitable for use in preprocessor conditionals.
+
+Documentation
+-------------
+
+- Issue #10299: List the built-in functions in a table in functions.rst.
+
+
+What's New in Python 3.2 Alpha 4?
+=================================
+
+*Release date: 13-Nov-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #10372: Import the warnings module only after the IO library is
+ initialized, so as to avoid bootstrap issues with the '-W' option.
+
+- Issue #10293: Remove obsolete field in the PyMemoryView structure, unused
+ undocumented value PyBUF_SHADOW, and strangely-looking code in
+ PyMemoryView_GetContiguous.
+
+- Issue #6081: Add str.format_map(), similar to ``str.format(**mapping)``.
+
+- If FileIO.__init__ fails, close the file descriptor.
+
+- Issue #10221: dict.pop(k) now has a key error message that includes the
+ missing key (same message d[k] returns for missing keys).
+
+- Issue #5437: A preallocated MemoryError instance should not keep traceback
+ data (including local variables caught in the stack trace) alive infinitely.
+
+- Issue #10186: Fix the SyntaxError caret when the offset is equal to the length
+ of the offending line.
+
+- Issue #10089: Add support for arbitrary -X options on the command line. They
+ can be retrieved through a new attribute ``sys._xoptions``.
+
+- Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
+ the locale encoding. If the LANG (and LC_ALL and LC_CTYPE) environment
+ variable is not set, the locale encoding is ISO-8859-1, whereas most programs
+ (including Python) expect UTF-8. Python already uses UTF-8 for the filesystem
+ encoding and to encode command line arguments on this OS.
+
+- Issue #9713, #10114: Parser functions (e.g. PyParser_ASTFromFile) expect
+ filenames encoded to the filesystem encoding with the surrogateescape error
+ handler (to support undecodable bytes), instead of UTF-8 in strict mode.
+
+- Issue #9997: Don't let the name "top" have special significance in scope
+ resolution.
+
+- Issue #9862: Compensate for broken PIPE_BUF in AIX by hard coding its value as
+ the default 512 when compiling on AIX.
+
+- Use locale encoding instead of UTF-8 to encode and decode filenames if
+ Py_FileSystemDefaultEncoding is not set.
+
+- Issue #10095: fp_setreadl() doesn't reopen the file, instead reuse the file
+ descriptor.
+
+- Issue #9418: Moved private string methods ``_formatter_parser`` and
+ ``_formatter_field_name_split`` into a new ``_string`` module.
+
+- Issue #9992: Remove PYTHONFSENCODING environment variable.
+
+Library
+-------
+
+- Issue #12943: python -m tokenize support has been added to tokenize.
+
+- Issue #10465: fix broken delegating of attributes by gzip._PaddedFile.
+
+- Issue #10356: Decimal.__hash__(-1) should return -2.
+
+- Issue #1553375: logging: Added stack_info kwarg to display stack information.
+
+- Issue #5111: IPv6 Host in the Header is wrapped inside [ ]. Patch by Chandru.
+
+- Fix Fraction.__hash__ so that Fraction.__hash__(-1) is -2. (See also issue
+ #10356.)
+
+- Issue #4471: Add the IMAP.starttls() method to enable encryption on standard
+ IMAP4 connections. Original patch by Lorenzo M. Catucci.
+
+- Issue #1466065: Add 'validate' option to base64.b64decode to raise an error if
+ there are non-base64 alphabet characters in the input.
+
+- Issue #10386: Add __all__ to token module; this simplifies importing in
+ tokenize module and prevents leaking of private names through ``import *``.
+
+- Issue #4471: Properly shutdown socket in IMAP.shutdown(). Patch by Lorenzo
+ M. Catucci.
+
+- Fix IMAP.login() to work properly.
+
+- Issue #9244: multiprocessing pool worker processes could terminate
+ unexpectedly if the return value of a task could not be pickled. Only the
+ ``repr`` of such errors are now sent back, wrapped in an
+ ``MaybeEncodingError`` exception.
+
+- Issue #9244: The ``apply_async()`` and ``map_async()`` methods of
+ ``multiprocessing.Pool`` now accepts a ``error_callback`` argument. This can
+ be a callback with the signature ``callback(exc)``, which will be called if
+ the target raises an exception.
+
+- Issue #10022: The dictionary returned by the ``getpeercert()`` method of SSL
+ sockets now has additional items such as ``issuer`` and ``notBefore``.
+
+- ``usenetrc`` is now false by default for NNTP objects.
+
+- Issue #1926: Add support for NNTP over SSL on port 563, as well as STARTTLS.
+ Patch by Andrew Vant.
+
+- Issue #10335: Add tokenize.open(), detect the file encoding using
+ tokenize.detect_encoding() and open it in read only mode.
+
+- Issue #10321: Add support for binary data to smtplib.SMTP.sendmail, and a new
+ method send_message to send an email.message.Message object.
+
+- Issue #6011: sysconfig and distutils.sysconfig use the surrogateescape error
+ handler to parse the Makefile file. Avoid a UnicodeDecodeError if the source
+ code directory name contains a non-ASCII character and the locale encoding is
+ ASCII.
+
+- Issue #10329: The trace module writes reports using the input Python script
+ encoding, instead of the locale encoding. Patch written by Alexander
+ Belopolsky.
+
+- Issue #10126: Fix distutils' test_build when Python was built with
+ --enable-shared.
+
+- Issue #9281: Prevent race condition with mkdir in distutils. Patch by
+ Arfrever.
+
+- Issue #10229: Fix caching error in gettext.
+
+- Issue #10252: Close file objects in a timely manner in distutils code and
+ tests. Patch by Brian Brazil, completed by Éric Araujo.
+
+- Issue #10180: Pickling file objects is now explicitly forbidden, since
+ unpickling them produced nonsensical results.
+
+- Issue #10311: The signal module now restores errno before returning from its
+ low-level signal handler. Patch by Hallvard B Furuseth.
+
+- Issue #10282: Add a ``nntp_implementation`` attribute to NNTP objects.
+
+- Issue #10283: Add a ``group_pattern`` argument to NNTP.list().
+
+- Issue #10155: Add IISCGIHandler to wsgiref.handlers to support IIS CGI
+ environment better, and to correct unicode environment values for WSGI 1.0.1.
+
+- Issue #10281: nntplib now returns None for absent fields in the OVER/XOVER
+ response, instead of raising an exception.
+
+- wsgiref now implements and validates PEP 3333, rather than an experimental
+ extension of PEP 333. (Note: earlier versions of Python 3.x may have
+ incorrectly validated some non-compliant applications as WSGI compliant; if
+ your app validates with Python <3.2b1+, but not on this version, it is likely
+ the case that your app was not compliant.)
+
+- Issue #10280: NNTP.nntp_version should reflect the highest version advertised
+ by the server.
+
+- Issue #10184: Touch directories only once when extracting a tarfile.
+
+- Issue #10199: New package, ``turtledemo`` now contains selected demo scripts
+ that were formerly found under Demo/turtle.
+
+- Issue #10265: Close file objects explicitly in sunau. Patch by Brian Brazil.
+
+- Issue #10266: uu.decode didn't close in_file explicitly when it was given as a
+ filename. Patch by Brian Brazil.
+
+- Issue #10110: Queue objects didn't recognize full queues when the maxsize
+ parameter had been reduced.
+
+- Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
+
+- logging: Added style option to basicConfig() to allow %, {} or $-formatting.
+
+- Issue #5729: json.dumps() now supports using a string such as '\t' for
+ pretty-printing multilevel objects.
+
+- Issue #10253: FileIO leaks a file descriptor when trying to open a file for
+ append that isn't seekable. Patch by Brian Brazil.
+
+- Support context manager protocol for file-like objects returned by mailbox
+ ``get_file()`` methods.
+
+- Issue #10246: uu.encode didn't close file objects explicitly when filenames
+ were given to it. Patch by Brian Brazil.
+
+- Issue #10198: fix duplicate header written to wave files when writeframes() is
+ called without data.
+
+- Close file objects in modulefinder in a timely manner.
+
+- Close a io.TextIOWrapper object in email.parser in a timely manner.
+
+- Close a file object in distutils.sysconfig in a timely manner.
+
+- Close a file object in pkgutil in a timely manner.
+
+- Issue #10233: Close file objects in a timely manner in the tarfile module and
+ its test suite.
+
+- Issue #10093: ResourceWarnings are now issued when files and sockets are
+ deallocated without explicit closing. These warnings are silenced by default,
+ except in pydebug mode.
+
+- tarfile.py: Add support for all missing variants of the GNU sparse extensions
+ and create files with holes when extracting sparse members.
+
+- Issue #10218: Return timeout status from ``Condition.wait`` in threading.
+
+- Issue #7351: Add ``zipfile.BadZipFile`` spelling of the exception name and
+ deprecate the old name ``zipfile.BadZipfile``.
+
+- Issue #5027: The standard ``xml`` namespace is now understood by
+ xml.sax.saxutils.XMLGenerator as being bound to
+ http://www.w3.org/XML/1998/namespace. Patch by Troy J. Farrell.
+
+- Issue #5975: Add csv.unix_dialect class.
+
+- Issue #7761: telnetlib.interact failures on Windows fixed.
+
+- logging: Added style option to Formatter to allow %, {} or $-formatting.
+
+- Issue #5178: Added tempfile.TemporaryDirectory class that can be used as a
+ context manager.
+
+- Issue #1349106: Generator (and BytesGenerator) flatten method and Header
+ encode method now support a 'linesep' argument.
+
+- Issue #5639: Add a *server_hostname* argument to ``SSLContext.wrap_socket`` in
+ order to support the TLS SNI extension. ``HTTPSConnection`` and ``urlopen()``
+ also use this argument, so that HTTPS virtual hosts are now supported.
+
+- Issue #10166: Avoid recursion in pstats Stats.add() for many stats items.
+
+- Issue #10163: Skip unreadable registry keys during mimetypes initialization.
+
+- logging: Made StreamHandler terminator configurable.
+
+- logging: Allowed filters to be just callables.
+
+- logging: Added tests for _logRecordClass changes.
+
+- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
+
+- logging: Added _logRecordClass, getLogRecordClass, setLogRecordClass to
+ increase flexibility of LogRecord creation.
+
+- Issue #5117: Case normalization was needed on ntpath.relpath(). Also fixed
+ root directory issue on posixpath.relpath(). (Ported working fixes from
+ ntpath.)
+
+- Issue #1343: xml.sax.saxutils.XMLGenerator now has an option
+ short_empty_elements to direct it to use self-closing tags when appropriate.
+
+- Issue #9807 (part 1): Expose the ABI flags in sys.abiflags. Add --abiflags
+ switch to python-config for command line access.
+
+- Issue #6098: Don't claim DOM level 3 conformance in minidom.
+
+- Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty
+ XML namespace attribute is encountered.
+
+- Issue #2830: Add the ``html.escape()`` function, which quotes all problematic
+ characters by default. Deprecate ``cgi.escape()``.
+
+- Issue #9409: Fix the regex to match all kind of filenames, for interactive
+ debugging in doctests.
+
+- Issue #9183: ``datetime.timezone(datetime.timedelta(0))`` will now return the
+ same instance as ``datetime.timezone.utc``.
+
+- Issue #7523: Add SOCK_CLOEXEC and SOCK_NONBLOCK to the socket module, where
+ supported by the system. Patch by Nikita Vetoshkin.
+
+- Issue #10063: file:// scheme will stop accessing remote hosts via ftp
+ protocol. file:// urls had fallback to access remote hosts via ftp. This was
+ not correct, change is made to raise a URLError when a remote host is tried to
+ access via file:// scheme.
+
+- Issue #1710703: Write structures for an empty ZIP archive when a ZipFile is
+ created in modes 'a' or 'w' and then closed without adding any files. Raise
+ BadZipfile (rather than IOError) when opening small non-ZIP files.
+
+- Issue #10041: The signature of optional arguments in socket.makefile() didn't
+ match that of io.open(), and they also didn't get forwarded properly to
+ TextIOWrapper in text mode. Patch by Kai Zhu.
+
+- Issue #9003: http.client.HTTPSConnection, urllib.request.HTTPSHandler and
+ urllib.request.urlopen now take optional arguments to allow for server
+ certificate checking, as recommended in public uses of HTTPS.
+
+- Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
+ current directory was deleted. Patch written by W. Trevor King.
+
+- Issue #3873: Speed up unpickling from file objects that have a peek() method.
+
+- Issue #10075: Add a session_stats() method to SSLContext objects.
+
+- Issue #9948: Fixed problem of losing filename case information.
+
+Extension Modules
+-----------------
+
+- Issue #5109: array.array constructor will now use fast code when
+ initial data is provided in an array object with correct type.
+
+- Issue #6317: Now winsound.PlaySound only accepts unicode.
+
+- Issue #6317: Now winsound.PlaySound can accept non ascii filename.
+
+- Issue #9377: Use Unicode API for gethostname on Windows.
+
+- Issue #10143: Update "os.pathconf" values.
+
+- Issue #6518: Support context manager protcol for ossaudiodev types.
+
+- Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY.
+
+- Issue #9054: Fix a crash occurring when using the pyexpat module with expat
+ version 2.0.1.
+
+- Issue #5355: Provide mappings from Expat error numbers to string descriptions
+ and backwards, in order to actually make it possible to analyze error codes
+ provided by ExpatError.
+
+- The Unicode database was updated to 6.0.0.
+
+C-API
+-----
+
+- Issue #10288: The deprecated family of "char"-handling macros
+ (ISLOWER()/ISUPPER()/etc) have now been removed: use Py_ISLOWER() etc instead.
+
+- Issue #9778: Hash values are now always the size of pointers. A new Py_hash_t
+ type has been introduced.
+
+Tools/Demos
+-----------
+
+- Issue #10117: Tools/scripts/reindent.py now accepts source files that use
+ encoding other than ASCII or UTF-8. Source encoding is preserved when
+ reindented code is written to a file.
+
+- Issue #7287: Demo/imputil/knee.py was removed.
+
+Tests
+-----
+
+- Issue #3699: Fix test_bigaddrspace and extend it to test bytestrings as well
+ as unicode strings. Initial patch by Sandro Tosi.
+
+- Issue #10294: Remove dead code form test_unicode_file.
+
+- Issue #10123: Don't use non-ascii filenames in test_doctest tests. Add a new
+ test specific to unicode (non-ascii name and filename).
+
+Build
+-----
+
+- Issue #10268: Add a --enable-loadable-sqlite-extensions option to configure.
+
+- Issue #8852: Allow the socket module to build on OpenSolaris.
+
+- Drop -OPT:Olimit compiler option.
+
+- Issue #10094: Use versioned .so files on GNU/kfreeBSD and the GNU Hurd.
+
+- Accept Oracle Berkeley DB 5.0 and 5.1 as backend for the dbm extension.
+
+- Issue #7473: avoid link errors when building a framework with a different set
+ of architectures than the one that is currently installed.
+
+
+What's New in Python 3.2 Alpha 3?
+=================================
+
+*Release date: 09-Oct-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #10068: Global objects which have reference cycles with their module's
+ dict are now cleared again. This causes issue #7140 to appear again.
+
+- Issue #9738: Document PyErr_SetString() and PyErr_SetFromErrnoWithFilename()
+ encodings.
+
+- ast.literal_eval() can now handle negative numbers. It is also a little more
+ liberal in what it accepts without compromising the safety of the evaluation.
+ For example, 3j+4 and 3+4+5 are both accepted.
+
+- Issue #10006: type.__abstractmethods__ now raises an AttributeError. As a
+ result metaclasses can now be ABCs (see #9533).
+
+- Issue #8670: ctypes.c_wchar supports non-BMP characters with 32 bits wchar_t.
+
+- Issue #8670: PyUnicode_AsWideChar() and PyUnicode_AsWideCharString() replace
+ UTF-16 surrogate pairs by single non-BMP characters for 16 bits Py_UNICODE and
+ 32 bits wchar_t (eg. Linux in narrow build).
+
+- Issue #10003: Allow handling of SIGBREAK on Windows. Fixes a regression
+ introduced by issue #9324.
+
+- Issue #9979: Create function PyUnicode_AsWideCharString().
+
+- Issue #7397: Mention that importlib.import_module() is probably what someone
+ really wants to be using in __import__'s docstring.
+
+- Issue #8521: Allow CreateKeyEx, OpenKeyEx, and DeleteKeyEx functions of winreg
+ to use named arguments.
+
+- Issue #9930: Remove bogus subtype check that was causing (e.g.)
+ float.__rdiv__(2.0, 3) to return NotImplemented instead of the expected 1.5.
+
+- Issue #9808: Implement os.getlogin for Windows. Patch by Jon Anglin.
+
+- Issue #9901: Destroying the GIL in Py_Finalize() can fail if some other
+ threads are still running. Instead, reinitialize the GIL on a second call to
+ Py_Initialize().
+
+- All SyntaxErrors now have a column offset and therefore a caret when the error
+ is printed.
+
+- Issue #9252: PyImport_Import no longer uses a fromlist hack to return the
+ module that was imported, but instead gets the module from sys.modules.
+
+- Issue #9213: The range type_items now provides index() and count() methods, to
+ conform to the Sequence ABC. Patch by Daniel Urban and Daniel Stutzbach.
+
+- Issue #7994: Issue a PendingDeprecationWarning if object.__format__ is called
+ with a non-empty format string. This is an effort to future-proof user
+ code. If a derived class does not currently implement __format__ but later
+ adds its own __format__, it would most likely break user code that had
+ supplied a format string. This will be changed to a DeprecationWaring in
+ Python 3.3 and it will be an error in Python 3.4.
+
+- Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
+ re-created on a subsequent call to Py_Initialize(). The problem (a crash)
+ wouldn't appear in 3.1 or 2.7 where the GIL's structure is more trivial.
+
+- Issue #9210: Configure option --with-wctype-functions was removed. Using the
+ functions from the libc caused the methods .upper() and lower() to become
+ locale aware and created subtly wrong results.
+
+- Issue #9738: PyUnicode_FromFormat() and PyErr_Format() raise an error on a
+ non-ASCII byte in the format string.
+
+- Issue #4617: Previously it was illegal to delete a name from the local
+ namespace if it occurs as a free variable in a nested block. This limitation
+ of the compiler has been lifted, and a new opcode introduced (DELETE_DEREF).
+
+- Issue #9804: ascii() now always represents unicode surrogate pairs as a single
+ ``\UXXXXXXXX``, regardless of whether the character is printable or not.
+ Also, the "backslashreplace" error handler now joins surrogate pairs into a
+ single character on UCS-2 builds.
+
+- Issue #9757: memoryview objects get a release() method to release the
+ underlying buffer (previously this was only done when deallocating the
+ memoryview), and gain support for the context management protocol.
+
+- Issue #9797: pystate.c wrongly assumed that zero couldn't be a valid
+ thread-local storage key.
+
+Library
+-------
+
+- Issue #2236: distutils' mkpath ignored the mode parameter.
+
+- Fix typo in one sdist option (medata-check).
+
+- Issue #9199: Fix incorrect use of distutils.cmd.Command.announce.
+
+- Issue #1718574: Fix options that were supposed to accept arguments but did
+ not in build_clib.
+
+- Issue #9437: Fix building C extensions with non-default LDFLAGS.
+
+- Issue #4661: email can now parse bytes input and generate either converted
+ 7bit output or bytes output. Email version bumped to 5.1.0.
+
+- Issue #1589: Add ssl.match_hostname(), to help implement server identity
+ verification for higher-level protocols.
+
+- Issue #9759: GzipFile now raises ValueError when an operation is attempted
+ after the file is closed. Patch by Jeffrey Finkelstein.
+
+- Issue #9042: Fix interaction of custom translation classes and caching in
+ gettext.
+
+- Issue #6706: asyncore.dispatcher now provides a handle_accepted() method
+ returning a (sock, addr) pair which is called when a connection has been
+ established with a new remote endpoint. This is supposed to be used as a
+ replacement for old handle_accept() and avoids the user to call accept()
+ directly.
+
+- Issue #9065: tarfile no longer uses "root" as the default for the uname and
+ gname field.
+
+- Issue #8980: Fixed a failure in distutils.command check that was shadowed by
+ an environment that does not have docutils. Patch by Arfrever.
+
+- Issue #1050268: parseaddr now correctly quotes double quote and backslash
+ characters that appear inside quoted strings in email addresses.
+
+- Issue #10004: quoprimime no longer generates a traceback when confronted with
+ invalid characters after '=' in a Q-encoded word.
+
+- Issue #1491: BaseHTTPServer nows send a ``100 Continue`` response before
+ sending a 200 OK for the Expect: 100-continue request header.
+
+- Issue #9360: Cleanup and improvements to the nntplib module. The API now
+ conforms to the philosophy of bytes and unicode separation in Python 3. A
+ test suite has also been added.
+
+- Issue #9962: GzipFile now has the peek() method.
+
+- Issue #9090: When a socket with a timeout fails with EWOULDBLOCK or EAGAIN,
+ retry the select() loop instead of bailing out. This is because select() can
+ incorrectly report a socket as ready for reading (for example, if it received
+ some data with an invalid checksum).
+
+- Issue #3612: Added new types to ctypes.wintypes. (CHAR and pointers)
+
+- Issue #9950: Fix socket.sendall() crash or misbehaviour when a signal is
+ received. Now sendall() properly calls signal handlers if necessary, and
+ retries sending if these returned successfully, including on sockets with a
+ timeout.
+
+- Issue #9947: logging: Fixed locking bug in stopListening.
+
+- Issue #9945: logging: Fixed locking bugs in addHandler/removeHandler.
+
+- Issue #9936: Fixed executable lines' search in the trace module.
+
+- Issue #9790: Rework imports necessary for samefile and sameopenfile
+ in ntpath.
+
+- Issue #9928: Properly initialize the types exported by the bz2 module.
+
+- Issue #1675951: Allow GzipFile to work with unseekable file objects. Patch by
+ Florian Festi.
+
+- Logging: Added QueueListener class to facilitate logging usage for
+ performance-critical threads.
+
+- Issue #9916: Add some missing errno symbols.
+
+- Issue #9877: Expose sysconfig.get_makefile_filename()
+
+- logging: Added hasHandlers() method to Logger and LoggerAdapter.
+
+- Issue #9908: Fix os.stat() on bytes paths under Windows 7.
+
+- Issue #2643: msync() is not called anymore when deallocating an open mmap
+ object, only munmap().
+
+- logging: Changed LoggerAdapter implementation internally, to make it easier to
+ subclass in a useful way.
+
+- logging: hasHandlers method was added to Logger, and isEnabledFor,
+ getEffectiveLevel, hasHandlers and setLevel were added to LoggerAdapter.
+ LoggerAdapter was introduced into the unit tests for logging.
+
+- Issue #1686: Fix string.Template when overriding the pattern attribute.
+
+- Issue #9854: SocketIO objects now observe the RawIOBase interface in
+ non-blocking mode: they return None when an operation would block (instead of
+ raising an exception).
+
+- Issue #1730136: Fix the comparison between a tk.font.Font and an object of
+ another kind.
+
+- Issue #9441: logging has better coverage for rotating file handlers.
+
+- Issue #9865: collections.OrderedDict now has a __sizeof__ method.
+
+- Issue #9854: The default read() implementation in io.RawIOBase now handles
+ non-blocking readinto() returning None correctly.
+
+- Issue #1552: socket.socketpair() now returns regular socket.socket objects
+ supporting the whole socket API (rather than the "raw" _socket.socket
+ objects).
+
+- Issue #9853: Fix the signature of SSLSocket.recvfrom() and SSLSocket.sendto()
+ to match the corresponding socket methods.
+
+- Issue #9840: Added a decorator to reprlib for wrapping __repr__ methods to make
+ them handle recursive calls within the same thread.
+
+- logging: Enhanced HTTPHandler with secure and credentials initializers.
+
+- Issue #767645: Set os.path.supports_unicode_filenames to True on Mac OS X.
+
+- Issue #9837: The read() method of ZipExtFile objects (as returned by
+ ZipFile.open()) could return more bytes than requested.
+
+- Issue #9826: OrderedDict.__repr__ can now handle self-referential values:
+ d['x'] = d.
+
+- Issue #9825: Using __del__ in the definition of collections.OrderedDict made
+ it possible for the user to create self-referencing ordered dictionaries which
+ become permanently uncollectable GC garbage. Reinstated the Python 3.1
+ approach of using weakref proxies so that reference cycles never get created
+ in the first place.
+
+- Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and
+ encode the value with filesystem encoding and surrogateescape (instead of
+ utf-8 in strict mode) . Patch written by David Watson.
+
+- Issue #9632: Remove sys.setfilesystemencoding() function: use PYTHONFSENCODING
+ environment variable to set the filesystem encoding at Python startup.
+ sys.setfilesystemencoding() creates inconsistencies because it is unable to
+ reencode all filenames in all objects.
+
+- Issue #9410: Various optimizations to the pickle module, leading to speedups
+ up to 4x (depending on the benchmark). Mostly ported from Unladen Swallow;
+ initial patch by Alexandre Vassalotti.
+
+- The pprint module now supports printing OrderedDicts in their given order
+ (formerly, it would sort the keys).
+
+- Logging: Added QueueHandler class to facilitate logging usage with
+ multiprocessing.
+
+- Issue #9707: Rewritten reference implementation of threading.local which is
+ friendlier towards reference cycles. This change is not normally visible
+ since an optimized C implementation (_thread._local) is used instead.
+
+- Issue #6394: os.getppid() is now supported on Windows. Note that it will
+ still return the id of the parent process after it has exited. This process
+ id may even have been reused by another unrelated process.
+
+- Issue #9792: In case of connection failure, socket.create_connection() would
+ swallow the exception and raise a new one, making it impossible to fetch the
+ original errno, or to filter timeout errors. Now the original error is
+ re-raised.
+
+- Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True, and
+ the passed buffer was exactly 1024 bytes long, the buffer wouldn't be updated
+ back after the system call. Original patch by Brian Brazil.
+
+- Updates to the random module:
+
+ * Document which parts of the module are guaranteed to stay the same across
+ versions and which parts are subject to change.
+
+ * Update the seed() method to use all of the bits in a string instead of just
+ the hash value. This makes better use of the seed value and assures the
+ seeding is platform independent. Issue #7889.
+
+ * Improved the random()-->integer algorithm used in choice(), shuffle(),
+ sample(), randrange(), and randint(). Formerly, it used int(n*random())
+ which has a slight bias whenever n is not a power of two. Issue #9025.
+
+ * Improved documentation of arguments to randrange(). Issue #9379.
+
+- collections.OrderedDict now supports a new method for repositioning keys to
+ either end.
+
+- Issue #9754: Similarly to assertRaises and assertRaisesRegexp, unittest test
+ cases now also have assertWarns and assertWarnsRegexp methods to check that a
+ given warning type was triggered by the code under test.
+
+- Issue #5506: BytesIO objects now have a getbuffer() method exporting a view of
+ their contents without duplicating them. The view is both readable and
+ writable.
+
+- Issue #7566: Implement os.path.sameopenfile for Windows.
+
+- Issue #9293: I/O streams now raise ``io.UnsupportedOperation`` when an
+ unsupported operation is attempted (for example, writing to a file open only
+ for reading).
+
+- hashlib has two new constant attributes: algorithms_guaranteed and
+ algorithms_avaiable that respectively list the names of hash algorithms
+ guaranteed to exist in all Python implementations and the names of hash
+ algorithms available in the current process.
+
+- A new package ``concurrent.futures`` as defined by PEP 3148.
+
+C-API
+-----
+
+- Add PyErr_SyntaxLocationEx, which supports passing a column offset.
+
+- Issue #9834: Don't segfault in PySequence_GetSlice, PySequence_SetSlice, or
+ PySequence_DelSlice when the object doesn't have any mapping operations
+ defined.
+
+Tools/Demos
+-----------
+
+- Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well as
+ wide (UCS4) unicode builds for both the host interpreter (embedded inside gdb)
+ and the interpreter under test.
+
+Tests
+-----
+
+- Issue #9308: Added tests for importing encoded modules that do not
+ depend on specific stdlib modules being encoded in a certain way.
+
+- Issue #1051: Add a script (Lib/test/make_ssl_certs.py) to generate the custom
+ certificate and private key files used by SSL-related certs.
+
+- Issue #9978: Wait until subprocess completes initialization. (Win32KillTests
+ in test_os)
+
+- Issue #7110: regrtest now sends test failure reports and single-failure
+ tracebacks to stderr rather than stdout.
+
+- Issue #9628: fix runtests.sh -x option so more than one test can be excluded.
+
+- Issue #9899: Fix test_tkinter.test_font on various platforms. Patch by Ned
+ Deily.
+
+- Issue #9894: Do not hardcode ENOENT in test_subprocess.
+
+- Issue #9315: Added tests for the trace module. Patch by Eli Bendersky.
+
+- Issue #9323: Make test.regrtest.__file__ absolute, this was not always the
+ case when running profile or trace, for example.
+
+- Issue #9568: Fix test_urllib2_localnet on OS X 10.3.
+
+Build
+-----
+
+- Issue #10062: Allow building on platforms which do not have sem_timedwait.
+
+- Issue #10054: Some platforms provide uintptr_t in inttypes.h. Patch by Akira
+ Kitada.
+
+- Issue #10055: Make json C89-compliant in UCS4 mode.
+
+- Issue #9552: Avoid unnecessary rebuild of OpenSSL. (Windows)
+
+- Issue #1633863: Don't ignore $CC under AIX.
+
+- Issue #9810: Compile bzip2 source files in Python's project file directly. It
+ used to be built with bzip2's makefile.
+
+- Issue #9848: Stopping trying to build _weakref in setup.py as it is a built-in
+ module.
+
+- Issue #9806: python-config now has an ``--extension-suffix`` option that
+ outputs the suffix for dynamic libraries including the ABI version name
+ defined by PEP 3149.
+
+- Issue #941346: Improve the build process under AIX and allow Python to be
+ built as a shared library. Patch by Sébastien Sablé.
+
+- Issue #4026: Make the fcntl extension build under AIX. Patch by Sébastien
+ Sablé.
+
+- Issue #9701: The MacOSX installer can patch the shell profile to ensure that
+ the "bin" directory inside the framework is on the shell's search path. This
+ feature now also supports the ZSH shell.
+
+
+What's New in Python 3.2 Alpha 2?
+=================================
+
+*Release date: 05-Sep-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced by
+ the new (and simpler) DUP_TOP_TWO. Performance isn't changed, but our
+ bytecode is a bit simplified. Patch by Demur Rumed.
+
+- Issue #9766: Rename poorly named variables exposed by _warnings to prevent
+ confusion with the proper variables names from 'warnings' itself.
+
+- Issue #9212: dict_keys and dict_items now provide the isdisjoint() method, to
+ conform to the Set ABC. Patch by Daniel Urban.
+
+- Issue #9737: Fix a crash when trying to delete a slice or an item from a
+ memoryview object.
+
+- Issue #9549: sys.setdefaultencoding() and PyUnicode_SetDefaultEncoding() are
+ now removed, since their effect was inexistent in 3.x (the default encoding is
+ hardcoded to utf-8 and cannot be changed).
+
+- Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
+ properly. Patch by Stefan Behnel.
+
+- Issue #5553: The Py_LOCAL_INLINE macro now results in inlining on most
+ platforms. Previously, it inlined only when using Microsoft Visual C.
+
+- Issue #9712: Fix tokenize on identifiers that start with non-ascii names.
+
+- Issue #9688: __basicsize__ and __itemsize__ must be accessed as Py_ssize_t.
+
+- Issue #9684: Added a definition for SIZEOF_WCHAR_T to PC/pyconfig.h, to match
+ the pyconfig.h generated by configure on other systems.
+
+- Issue #9666: Only catch AttributeError in hasattr(). All other exceptions that
+ occur during attribute lookup are now propagated to the caller.
+
+- Issue #8622: Add PYTHONFSENCODING environment variable to override the
+ filesystem encoding.
+
+- Issue #5127: The C functions that access the Unicode Database now accept and
+ return characters from the full Unicode range, even on narrow unicode builds
+ (Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL, and others). A visible difference
+ in Python is that unicodedata.numeric() now returns the correct value for
+ large code points, and repr() may consider more characters as printable.
+
+- Issue #9425: Create PyModule_GetFilenameObject() function to get the filename
+ as a unicode object, instead of a byte string. Function needed to support
+ unencodable filenames. Deprecate PyModule_GetFilename() in favor on the new
+ function.
+
+- Issue #8063: Call _PyGILState_Init() earlier in Py_InitializeEx().
+
+- Issue #9612: The set object is now 64-bit clean under Windows.
+
+- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching for
+ the module file to be executed with the -m command line option.
+
+- Issue #9599: Create PySys_FormatStdout() and PySys_FormatStderr() functions to
+ write a message formatted by PyUnicode_FromFormatV() to sys.stdout and
+ sys.stderr.
+
+- Issue #9542: Create PyUnicode_FSDecoder() function, a ParseTuple converter:
+ decode bytes objects to unicode using PyUnicode_DecodeFSDefaultAndSize(); str
+ objects are output as-is.
+
+- Issue #9203: Computed gotos are now enabled by default on supported compilers
+ (which are detected by the configure script). They can still be disable
+ selectively by specifying --without-computed-gotos.
+
+- Issue #9425: Create PyErr_WarnFormat() function, similar to PyErr_WarnEx() but
+ use PyUnicode_FromFormatV() to format the warning message.
+
+- Issue #8530: Prevent stringlib fastsearch from reading beyond the front of an
+ array.
+
+- Issue #5319: Print an error if flushing stdout fails at interpreter shutdown.
+
+- Issue #9337: The str() of a float or complex number is now identical to its
+ repr().
+
+- Issue #9416: Fix some issues with complex formatting where the output with no
+ type specifier failed to match the str output:
+
+ - format(complex(-0.0, 2.0), '-') omitted the real part from the output,
+ - format(complex(0.0, 2.0), '-') included a sign and parentheses.
+
+Extension Modules
+-----------------
+
+- Issue #8013: time.asctime and time.ctime no longer call system
+ asctime and ctime functions. The year range for time.asctime is now
+ 1900 through maxint. The range for time.ctime is the same as for
+ time.localtime. The string produced by these functions is longer
+ than 24 characters when year is greater than 9999.
+
+- Issue #6608: time.asctime is now checking struct tm fields its input
+ before passing it to the system asctime. Patch by MunSic Jeong.
+
+- Issue #8734: Avoid crash in msvcrt.get_osfhandle() when an invalid file
+ descriptor is provided. Patch by Pascal Chambon.
+
+- Issue #7736: Release the GIL around calls to opendir() and closedir() in the
+ posix module. Patch by Marcin Bachry.
+
+- Issue #4835: make PyLong_FromSocket_t() and PyLong_AsSocket_t() private to the
+ socket module, and fix the width of socket descriptors to be correctly
+ detected under 64-bit Windows.
+
+- Issue #1027206: Support IDNA in gethostbyname, gethostbyname_ex, getaddrinfo
+ and gethostbyaddr. getnameinfo is now restricted to numeric addresses as
+ input.
+
+- Issue #9214: Set operations on a KeysView or ItemsView in collections now
+ correctly return a set. Patch by Eli Bendersky.
+
+- Issue #5737: Add Solaris-specific mnemonics in the errno module. Patch by
+ Matthew Ahrens.
+
+- Restore GIL in nis_cat in case of error. Decode NIS data to fs encoding, using
+ the surrogate error handler.
+
+- Issue #665761: ``functools.reduce()`` will no longer mask exceptions other
+ than ``TypeError`` raised by the iterator argument.
+
+- Issue #9570: Use PEP 383 decoding in os.mknod and os.mkfifo.
+
+- Issue #6915: Under Windows, os.listdir() didn't release the Global Interpreter
+ Lock around all system calls. Original patch by Ryan Kelly.
+
+- Issue #8524: Add a detach() method to socket objects, so as to put the socket
+ into the closed state without closing the underlying file descriptor.
+
+- Issue #477863: Emit a ResourceWarning at shutdown if gc.garbage is not empty.
+
+- Issue #6869: Fix a refcount problem in the _ctypes extension.
+
+- Issue #5504: ctypes should now work with systems where mmap can't be
+ PROT_WRITE and PROT_EXEC.
+
+- Issue #9507: Named tuple repr will now automatically display the right name in
+ a tuple subclass.
+
+- Issue #9324: Add parameter validation to signal.signal on Windows in order to
+ prevent crashes.
+
+- Issue #9526: Remove some outdated (int) casts that were preventing the array
+ module from working correctly with arrays of more than 2**31 elements.
+
+- Fix memory leak in ssl._ssl._test_decode_cert.
+
+- Issue #8065: Fix memory leak in readline module (from failure to free the
+ result of history_get_history_state()).
+
+- Issue #9450: Fix memory leak in readline.replace_history_item and
+ readline.remove_history_item for readline version >= 5.0.
+
+- Issue #8105: Validate file descriptor passed to mmap.mmap on Windows.
+
+- Issue #8046: Add context manager protocol support and .closed property to mmap
+ objects.
+
+Library
+-------
+
+- Issue #7451: Improve decoding performance of JSON objects, and reduce the
+ memory consumption of said decoded objects when they use the same strings as
+ keys.
+
+- Issue #1100562: Fix deep-copying of objects derived from the list and dict
+ types. Patch by Michele Orrù and Björn Lindqvist.
+
+- Issue #9753: Fixed socket.dup, which did not always work correctly on Windows.
+
+- Issue #9421: Made the get<type> methods consistently accept the vars and
+ default arguments on all parser classes.
+
+- Issue #7005: Fixed output of None values for RawConfigParser.write and
+ ConfigParser.write.
+
+- Issue #8990: array.fromstring() and array.tostring() get renamed to
+ frombytes() and tobytes(), respectively, to avoid confusion. Furthermore,
+ array.frombytes(), array.extend() as well as the array.array() constructor now
+ accept bytearray objects. Patch by Thomas Jollans.
+
+- Issue #808164: Fixed socket.close to avoid references to globals, to avoid
+ issues when socket.close is called from a __del__ method.
+
+- Issue #9706: ssl module provides a better error handling in various
+ circumstances.
+
+- Issue #1868: Eliminate subtle timing issues in thread-local objects by getting
+ rid of the cached copy of thread-local attribute dictionary.
+
+- Issue #1512791: In setframerate() in the wave module, non-integral frame rates
+ are rounded to the nearest integer.
+
+- Issue #8797: urllib2 does a retry for Basic Authentication failure instead of
+ falling into recursion.
+
+- Issue #1194222: email.utils.parsedate now returns RFC2822 compliant four
+ character years even if the message contains RFC822 two character years.
+
+- Issue #8750: Fixed MutableSet's methods to correctly handle reflexive
+ operations on its self, namely x -= x and x ^= x.
+
+- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing error
+ handling when accepting a new connection.
+
+- Issue #9601: ftplib now provides a workaround for non-compliant
+ implementations such as IIS shipped with Windows server 2003 returning invalid
+ response codes for MKD and PWD commands.
+
+- Issue #658749: asyncore's connect() method now correctly interprets winsock
+ errors.
+
+- Issue #9501: Fixed logging regressions in cleanup code.
+
+- Fix functools.total_ordering() to skip methods inherited from object.
+
+- Issue #9572: Importlib should not raise an exception if a directory it thought
+ it needed to create was done concurrently by another process.
+
+- Issue #9617: Signals received during a low-level write operation aren't
+ ignored by the buffered IO layer anymore.
+
+- Issue #843590: Make "macintosh" an alias to the "mac_roman" encoding.
+
+- Create os.fsdecode(): decode from the filesystem encoding with surrogateescape
+ error handler, or strict error handler on Windows.
+
+- Issue #3488: Provide convenient shorthand functions ``gzip.compress`` and
+ ``gzip.decompress``. Original patch by Anand B. Pillai.
+
+- Issue #8807: poplib.POP3_SSL class now accepts a context parameter, which is a
+ ssl.SSLContext object allowing bundling SSL configuration options,
+ certificates and private keys into a single (potentially long-lived)
+ structure.
+
+- Issue #8866: parameters passed to socket.getaddrinfo can now be specified as
+ single keyword arguments.
+
+- Address XXX comment in dis.py by having inspect.py prefer to reuse the dis.py
+ compiler flag values over defining its own.
+
+- Issue #9147: Added dis.code_info() which is similar to show_code() but returns
+ formatted code information in a string rather than displaying on screen.
+
+- Issue #9567: functools.update_wrapper now adds a __wrapped__ attribute
+ pointing to the original callable.
+
+- Issue #3445: functools.update_wrapper now tolerates missing attributes on
+ wrapped callables.
+
+- Issue #5867: Add abc.abstractclassmethod and abc.abstractstaticmethod.
+
+- Issue #9605: posix.getlogin() decodes the username with file filesystem
+ encoding and surrogateescape error handler. Patch written by David Watson.
+
+- Issue #9604: posix.initgroups() encodes the username using the fileystem
+ encoding and surrogateescape error handler. Patch written by David Watson.
+
+- Issue #9603: posix.ttyname() and posix.ctermid() decode the terminal name
+ using the filesystem encoding and surrogateescape error handler. Patch written
+ by David Watson.
+
+- Issue #7647: The posix module now has the ST_RDONLY and ST_NOSUID constants,
+ for use with the statvfs() function. Patch by Adam Jackson.
+
+- Issue #8688: MANIFEST files created by distutils now include a magic comment
+ indicating they are generated. Manually maintained MANIFESTs without this
+ marker will not be overwritten or removed.
+
+- Issue #7467: when reading a file from a ZIP archive, its CRC is checked and a
+ BadZipfile error is raised if it doesn't match (as used to be the case in
+ Python 2.5 and earlier).
+
+- Issue #9550: a BufferedReader could issue an additional read when the original
+ read request had been satisfied, which could block indefinitely when the
+ underlying raw IO channel was e.g. a socket. Report and original patch by
+ Jason V. Miller.
+
+- Issue #3757: thread-local objects now support cyclic garbage collection.
+ Thread-local objects involved in reference cycles will be deallocated timely
+ by the cyclic GC, even if the underlying thread is still running.
+
+- Issue #9452: Add read_file, read_string, and read_dict to the configparser
+ API; new source attribute to exceptions.
+
+- Issue #6231: Fix xml.etree.ElementInclude to include the tail of the current
+ node.
+
+- Issue #8047: Fix the xml.etree serializer to return bytes by default. Use
+ ``encoding="unicode"`` to generate a Unicode string.
+
+- Issue #8280: urllib2's Request method will remove fragments in the url. This
+ is how it is supposed to work, wget and curl do the same. Previous behavior
+ was wrong.
+
+- Issue #6683: For SMTP logins we now try all authentication methods advertised
+ by the server. Many servers are buggy and advertise authentication methods
+ they do not support in reality.
+
+- Issue #8814: function annotations (the ``__annotations__`` attribute) are now
+ included in the set of attributes copied by default by functools.wraps and
+ functools.update_wrapper. Patch by Terrence Cole.
+
+- Issue #2944: asyncore doesn't handle connection refused correctly.
+
+- Issue #4184: Private attributes on smtpd.SMTPChannel made public and deprecate
+ the private attributes. Add tests for smtpd module.
+
+- Issue #3196: email header decoding is now forgiving if an RFC2047 encoded word
+ encoded in base64 is lacking padding.
+
+- Issue #9444: Argparse now uses the first element of prefix_chars as the option
+ character for the added 'h/help' option if prefix_chars does not contain a
+ '-', instead of raising an error.
+
+- Issue #7372: Fix pstats regression when stripping paths from profile data
+ generated with the profile module.
+
+- Issue #9428: Fix running scripts with the profile/cProfile modules from the
+ command line.
+
+- Issue #7781: Fix restricting stats by entry counts in the pstats interactive
+ browser.
+
+- Issue #9209: Do not crash in the pstats interactive browser on invalid regular
+ expressions.
+
+- Update collections.OrderedDict to match the implementation in Py2.7 (based on
+ lists instead of weakly referenced Link objects).
+
+- Issue #8397: Raise an error when attempting to mix iteration and regular reads
+ on a BZ2File object, rather than returning incorrect results.
+
+- Issue #9448: Fix a leak of OS resources (mutexes or semaphores) when
+ re-initializing a buffered IO object by calling its ``__init__`` method.
+
+- Issue #1713: Fix os.path.ismount(), which returned true for symbolic links
+ across devices.
+
+- Issue #8826: Properly load old-style "expires" attribute in http.cookies.
+
+- Issue #1690103: Fix initial namespace for code run with trace.main().
+
+- Issue #7395: Fix tracebacks in pstats interactive browser.
+
+- Issue #8230: Fix Lib/test/sortperf.py.
+
+- Issue #8620: when a cmd.Cmd() is fed input that reaches EOF without a final
+ newline, it no longer truncates the last character of the last command line.
+
+- Issue #5146: Handle UID THREAD command correctly in imaplib.
+
+- Issue #5147: Fix the header generated for cookie files written by
+ http.cookiejar.MozillaCookieJar.
+
+- Issue #8198: In pydoc, output all help text to the correct stream when
+ sys.stdout is reassigned.
+
+- Issue #7909: Do not touch paths with the special prefixes ``\\.\`` or ``\\?\``
+ in ntpath.normpath().
+
+- Issue #1286: Allow using fileinput.FileInput as a context manager.
+
+- Add lru_cache() decorator to the functools module.
+
+Tools/Demos
+-----------
+
+- Fix ``Tools/scripts/checkpyc.py`` after PEP 3147.
+
+- Issue #8867: Fix ``Tools/scripts/serve.py`` to work with files containing
+ non-ASCII content.
+
+Tests
+-----
+
+- Issue #9601: Provide a test case for ftplib.parse257.
+
+- Issue #8857: Provide a test case for socket.getaddrinfo.
+
+- Issue #7564: Skip test_ioctl if another process is attached to /dev/tty.
+
+- Issue #8433: Fix test_curses failure with newer versions of ncurses.
+
+- Issue #9496: Provide a test suite for the rlcompleter module. Patch by
+ Michele Orrù.
+
+- Issue #8687: provide a test suite for sched.py module.
+
+Build
+-----
+
+- Issue #1303434: Generate ZIP file containing all PDBs.
+
+- Issue #9193: PEP 3149 is accepted.
+
+- Issue #3101: Helper functions _add_one_to_index_C() and _add_one_to_index_F()
+ become _Py_add_one_to_index_C() and _Py_add_one_to_index_F(), respectively.
+
+- Issue #9700: define HAVE_BROKEN_POSIX_SEMAPHORES under AIX 6.x. Patch by
+ Sébastien Sablé.
+
+- Don't run pgen twice when using make -j.
+
+
+What's New in Python 3.2 Alpha 1?
+=================================
+
+*Release date: 01-Aug-2010*
+
+Core and Builtins
+-----------------
+
+- Issue #8991: convertbuffer() rejects discontigious buffers.
+
+- Issue #7616: Fix copying of overlapping memoryview slices with the Intel
+ compiler.
+
+- Issue #8413: structsequence now subclasses tuple.
+
+- Issue #8271: during the decoding of an invalid UTF-8 byte sequence, only the
+ start byte and the continuation byte(s) are now considered invalid, instead of
+ the number of bytes specified by the start byte. E.g.:
+ '\xf1\x80AB'.decode('utf-8', 'replace') now returns u'\ufffdAB' and replaces
+ with U+FFFD only the start byte ('\xf1') and the continuation byte ('\x80')
+ even if '\xf1' is the start byte of a 4-bytes sequence. Previous versions
+ returned a single u'\ufffd'.
+
+- Issue #9011: A negated imaginary literal (e.g., "-7j") now has real part -0.0
+ rather than 0.0. So "-7j" is now exactly equivalent to "-(7j)".
+
+- Be more specific in error messages about positional arguments.
+
+- Issue #8949: "z" format of PyArg_Parse*() functions doesn't accept bytes
+ objects, as described in the documentation.
+
+- Issue #6543: Write the traceback in the terminal encoding instead of utf-8.
+ Fix the encoding of the modules filename. Patch written by Amaury Forgeot
+ d'Arc.
+
+- Issue #9011: Remove buggy and unnecessary (in 3.x) ST->AST compilation code
+ dealing with unary minus applied to a constant. The removed code was mutating
+ the ST, causing a second compilation to fail.
+
+- Issue #850997: mbcs encoding (Windows only) handles errors argument: strict
+ mode raises unicode errors. The encoder only supports "strict" and "replace"
+ error handlers, the decoder only supports "strict" and "ignore" error
+ handlers. Patch written by Mark Hammond.
+
+- Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
+ "w*" format instead. Add tests for "w*" format.
+
+- Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
+ formats if the string contains a null byte/character. Write unit tests for
+ string formats.
+
+- Issue #7490: To facilitate sharing of doctests between 2.x and 3.x test
+ suites, the IGNORE_EXCEPTION_DETAIL directive now also ignores the module
+ location of the raised exception.
+
+- Issue #8969: On Windows, use mbcs codec in strict mode to encode and decode
+ filenames and enable os.fsencode().
+
+- Issue #9058: Remove assertions about INT_MAX in UnicodeDecodeError.
+
+- Issue #8941: Decoding big endian UTF-32 data in UCS-2 builds could crash the
+ interpreter with characters outside the Basic Multilingual Plane (higher than
+ 0x10000).
+
+- Issue #8950: (See also issue #5080). Py_ArgParse*() functions now raise
+ TypeError instead of giving a DeprecationWarning when a float is parsed using
+ the 'L' code (for long long). (All other integer codes already raise
+ TypeError in this case.)
+
+- Issue #8922: Normalize the encoding name in PyUnicode_AsEncodedString() to
+ enable shortcuts for upper case encoding name. Add also a shortcut for
+ "iso-8859-1" in PyUnicode_AsEncodedString() and PyUnicode_Decode().
+
+- Issue #8838: Remove codecs.charbuffer_encode() function. The buffer protocol
+ doesn't support "char buffer" anymore in Python 3.
+
+- Issue #8339: Remove "t#" format of PyArg_Parse*() functions, use "s#" or "s*"
+ instead. codecs.charbuffer_encode() now accepts modifiable buffer objects
+ like bytearray.
+
+- Issue #8837: Remove "O?" format of PyArg_Parse*() functions. The format is no
+ used anymore and it was never documented.
+
+- In str.format(), raise a ValueError when indexes to arguments are too large.
+
+- Issue #2844: Make int('42', n) consistently raise ValueError for invalid
+ integers n (including n = -909).
+
+- Issue #8188: Introduce a new scheme for computing hashes of numbers (instances
+ of int, float, complex, decimal.Decimal and fractions.Fraction) that makes it
+ easy to maintain the invariant that hash(x) == hash(y) whenever x and y have
+ equal value.
+
+- Issue #8748: Fix two issues with comparisons between complex and integer
+ objects. (1) The comparison could incorrectly return True in some cases
+ (2**53+1 == complex(2**53) == 2**53), breaking transitivity of equality.
+ (2) The comparison raised an OverflowError for large integers, leading to
+ unpredictable exceptions when combining integers and complex objects in sets
+ or dicts.
+
+- Issue #8766: Initialize _warnings module before importing the first module.
+ Fix a crash if an empty directory called "encodings" exists in sys.path.
+
+- Issue #8589: Decode PYTHONWARNINGS environment variable with the file system
+ encoding and surrogateescape error handler instead of the locale encoding to
+ be consistent with os.environ. Add PySys_AddWarnOptionUnicode() function.
+
+- PyObject_Dump() encodes unicode objects to utf8 with backslashreplace (instead
+ of strict) error handler to escape surrogates.
+
+- Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
+ object to Py_FileSystemDefaultEncoding with the "surrogateescape" error
+ handler, and return bytes. If Py_FileSystemDefaultEncoding is not set, fall
+ back to UTF-8.
+
+- Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any
+ error handler, not only the default error handler (strict).
+
+- Issue #8610: Load file system codec at startup, and display a fatal error on
+ failure. Set the file system encoding to utf-8 (instead of None) if getting
+ the locale encoding failed, or if nl_langinfo(CODESET) function is missing.
+
+- PyFile_FromFd() uses PyUnicode_DecodeFSDefault() instead of
+ PyUnicode_FromString() to support surrogates in the filename and use the right
+ encoding.
+
+- Issue #7507: Quote "!" in pipes.quote(); it is special to some shells.
+
+- PyUnicode_DecodeFSDefaultAndSize() uses surrogateescape error handler.
+
+- Issue #8419: Prevent the dict constructor from accepting non-string keyword
+ arguments.
+
+- Issue #8124: PySys_WriteStdout() and PySys_WriteStderr() don't execute
+ indirectly Python signal handlers anymore because mywrite() ignores exceptions
+ (KeyboardInterrupt).
+
+- Issue #8092: Fix PyUnicode_EncodeUTF8() to support error handler producing
+ unicode string (eg. backslashreplace).
+
+- Issue #8485: PyUnicode_FSConverter() doesn't accept byteearray objects
+ anymore, you have to convert your bytearray filenames to bytes.
+
+- Issue #7332: Remove the 16KB stack-based buffer in
+ PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable benefit
+ compared to the dynamic memory allocation fallback. Patch by Charles-François
+ Natali.
+
+- Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is
+ passed to bytes or bytearray.
+
+- Issue #7301: Add environment variable $PYTHONWARNINGS.
+
+- Issue #8329: Don't return the same lists from select.select when no fds are
+ changed.
+
+- Issue #8259: 1L << (2**31) no longer produces an 'outrageous shift error' on
+ 64-bit machines. The shift count for either left or right shift is permitted
+ to be up to sys.maxsize.
+
+- Ensure that tokenization of identifiers is not affected by locale.
+
+- Issue #1222585: Added LDCXXSHARED for C++ support. Patch by Arfrever.
+
+- Raise a TypeError when trying to delete a T_STRING_INPLACE struct member.
+
+- Issue #8211: Save/restore CFLAGS around AC_PROG_CC in configure.in, in case it
+ is set.
+
+- Issue #8226: sys.setfilesystemencoding() raises a LookupError if the encoding
+ is unknown.
+
+- Issue #1583863: A str subclass can now override the __str__ method.
+
+- Issue #8014: Setting a T_UINT or T_PYSSIZET attribute of an object with
+ PyMemberDefs could produce an internal error; raise TypeError instead.
+
+- Issue #7845: Rich comparison methods on the complex type now return
+ NotImplemented rather than raising a TypeError when comparing with an
+ incompatible type; this allows user-defined classes to implement their own
+ comparisons with complex.
+
+- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
+ (SIGINT). If an error occurs while importing the site module, the error is
+ printed and Python exits. Initialize the GIL before importing the site module.
+
+- Issue #7173: Generator finalization could invalidate sys.exc_info().
+
+- Issue #7544: Preallocate thread memory before creating the thread to avoid a
+ fatal error in low memory condition.
+
+- Issue #7820: The parser tokenizer restores all bytes in the right if the BOM
+ check fails.
+
+- Handle errors from looking up __prepare__ correctly.
+
+- Issue #5939: Add additional runtime checking to ensure a valid capsule in
+ Modules/_ctypes/callproc.c.
+
+- Issue #7309: Fix unchecked attribute access when converting
+ UnicodeEncodeError, UnicodeDecodeError, and UnicodeTranslateError to strings.
+
+- Issue #6902: Fix problem with built-in types format incorrectly with 0
+ padding.
+
+- Issue #7988: Fix default alignment to be right aligned for complex.__format__.
+ Now it matches other numeric types.
+
+- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
+ PyOS_ascii_strtod, and PyOS_ascii_atof. Use PyOS_double_to_string and
+ PyOS_string_to_double instead. See issue #5835 for the original deprecations.
+
+- Issue #7385: Fix a crash in `MemoryView_FromObject` when `PyObject_GetBuffer`
+ fails. Patch by Florent Xicluna.
+
+- Issue #7788: Fix an interpreter crash produced by deleting a list slice with
+ very large step value.
+
+- Issue #7766: Change sys.getwindowsversion() return value to a named tuple and
+ add the additional members returned in an OSVERSIONINFOEX structure. The new
+ members are service_pack_major, service_pack_minor, suite_mask, and
+ product_type.
+
+- Issue #7561: Operations on empty bytearrays (such as `int(bytearray())`) could
+ crash in many places because of the PyByteArray_AS_STRING() macro returning
+ NULL. The macro now returns a statically allocated empty string instead.
+
+- Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
+ where the right hand operand is a set of constants, by turning the set into a
+ frozenset and pre-building it as a constant. The comparison operation is made
+ against the constant instead of building a new set each time it is executed (a
+ similar optimization already existed which turned a list of constants into a
+ pre-built tuple). Patch and additional tests by Dave Malcolm.
+
+- Issue #7622: Improve the split(), rsplit(), splitlines() and replace() methods
+ of bytes, bytearray and unicode objects by using a common implementation based
+ on stringlib's fast search. Patch by Florent Xicluna.
+
+- Issue #7632: Fix various str -> float conversion bugs present in 2.7 alpha 2,
+ including: (1) a serious 'wrong output' bug that could occur for long (> 40
+ digit) input strings, (2) a crash in dtoa.c that occurred in debug builds when
+ parsing certain long numeric strings corresponding to subnormal values, (3) a
+ memory leak for some values large enough to cause overflow, and (4) a number
+ of flaws that could lead to incorrectly rounded results.
+
+- The __complex__ method is now looked up on the class of instances to make it
+ consistent with other special methods.
+
+- Issue #7462: Implement the stringlib fast search algorithm for the `rfind`,
+ `rindex`, `rsplit` and `rpartition` methods. Patch by Florent Xicluna.
+
+- Issue #7604: Deleting an unset slotted attribute did not raise an
+ AttributeError.
+
+- Issue #7534: Fix handling of IEEE specials (infinities, nans, negative zero)
+ in ** operator. The behaviour now conforms to that described in C99 Annex F.
+
+- Issue #1811: improve accuracy and cross-platform consistency for true division
+ of integers: the result of a/b is now correctly rounded for ints a and b (at
+ least on IEEE 754 platforms), and in particular does not depend on the
+ internal representation of an int.
+
+- Issue #6834: replace the implementation for the 'python' and 'pythonw'
+ executables on OSX.
+
+ These executables now work properly with the arch(1) command: ``arch -ppc
+ python`` will start a universal binary version of python in PPC mode (unlike
+ previous releases).
+
+- Issue #7466: Segmentation fault when the garbage collector is called in the
+ middle of populating a tuple. Patch by Florent Xicluna.
+
+- Issue #7419: setlocale() could crash the interpreter on Windows when called
+ with invalid values.
+
+- Issue #6077: On Windows, files opened with tempfile.TemporaryFile in "wt+"
+ mode would appear truncated on the first '0x1a' byte (aka. Ctrl+Z).
+
+- Issue #7085: Fix crash when importing some extensions in a thread on MacOSX
+ 10.6.
+
+- Issue #1757126: Fix the cyrillic-asian alias for the ptcp154 encoding.
+
+- Issue #6970: Remove redundant calls when comparing objects that don't
+ implement the relevant rich comparison methods.
+
+- Issue #7298: Fixes for range and reversed(range(...)). Iteration over
+ range(a, b, c) incorrectly gave an empty iterator when a, b and c fit in C
+ long but the length of the range did not. Also fix several cases where
+ reversed(range(a, b, c)) gave wrong results, and fix a refleak for
+ reversed(range(a, b, c)) with large arguments.
+
+- Issue #7244: itertools.izip_longest() no longer ignores exceptions raised
+ during the formation of an output tuple.
+
+- Issue #3297: On wide unicode builds, do not split unicode characters into
+ surrogates.
+
+- Remove length limitation when constructing a complex number from a string.
+
+- Issue #1087418: Boost performance of bitwise operations for longs.
+
+- Support for AtheOS has been completely removed from the code base. It was
+ disabled since Python 3.0.
+
+- Support for several legacy threading libraries has been disabled. These
+ libraries are: Mach C threads, SunOS LWP, GNU pth, Irix threads. Support code
+ will be entirely removed in 3.3.
+
+- Support for OSF* has been disabled. If nobody stands up, support will be
+ removed in 3.3. See <http://bugs.python.org/issue8606>.
+
+- Peephole constant folding had missed UNARY_POSITIVE.
+
+- Issue #1722344: threading._shutdown() is now called in Py_Finalize(), which
+ fixes the problem of some exceptions being thrown at shutdown when the
+ interpreter is killed. Patch by Adam Olsen.
+
+- Issue #7147: Remove support for compiling Python without complex number
+ support.
+
+- Issue #7120: logging: Removed import of multiprocessing which is causing crash
+ in GAE.
+
+- Issue #1754094: Improve the stack depth calculation in the compiler. There
+ should be no other effect than a small decrease in memory use. Patch by
+ Christopher Tur Lesniewski-Laas.
+
+- Issue #7065: Fix a crash in bytes.maketrans and bytearray.maketrans when using
+ byte values greater than 127. Patch by Derk Drukker.
+
+- Issue #1571184: The Unicode database contains properties for more characters.
+ The tables for code points representing numeric values, white spaces or line
+ breaks are now generated from the official Unicode Character Database files,
+ and include information from the Unihan.txt file.
+
+- Issue #7019: Raise ValueError when unmarshalling bad long data, instead of
+ producing internally inconsistent Python longs.
+
+- Issue #6990: Fix threading.local subclasses leaving old state around after a
+ reference cycle GC which could be recycled by new locals.
+
+- Issue #5460: Fix an ambiguity in the grammar.
+
+- Issue #1766304: Improve performance of membership tests on range objects.
+
+- Issue #6713: Improve performance of integer -> string conversions.
+
+- Issue #6846: Fix bug where bytearray.pop() returns negative integers.
+
+- Issue #6750: A text file opened with io.open() could duplicate its output when
+ writing from multiple threads at the same time.
+
+- Issue #6707: dir() on an uninitialized module caused a crash.
+
+- Issue #6540: Fixed crash for bytearray.translate() with invalid parameters.
+
+- Issue #6573: set.union() stopped processing inputs if an instance of self
+ occurred in the argument chain.
+
+- Issue #6070: On posix platforms import no longer copies the execute bit from
+ the .py file to the .pyc file if it is set.
+
+- Issue #1616979: Added the cp720 (Arabic DOS) encoding.
+
+- Issue #6428: Since Python 3.0, the __bool__ method must return a bool object,
+ and not an int. Fix the corresponding error message, and the documentation.
+
+- The deprecated PyCObject has been removed.
+
+- Issue #6347: Include inttypes.h as well as stdint.h in pyport.h. This fixes a
+ build failure on HP-UX: int32_t and uint32_t are defined in inttypes.h instead
+ of stdint.h on that platform.
+
+- Issue #6373: Fixed a SystemError when encoding with the latin-1 codec and the
+ 'surrogateescape' error handler, a string which contains unpaired surrogates.
+
+- Issue #4856: Remove checks for win NT.
+
+- Issue #6687: PyBytes_FromObject() no longer accepts an integer as its argument
+ to construct a null-initialized bytes object.
+
+- Issue #1023290: Add from_bytes() and to_bytes() methods to integers. These
+ methods allow the conversion of integers to bytes, and vice-versa.
+
+- Issue #7382: Fix bug in bytes.__getnewargs__ that prevented bytes instances
+ from being copied with copy.copy(), and bytes subclasses from being pickled
+ properly.
+
+- Code objects now support weak references.
+
+- Issue #7072: isspace(0xa0) is true on Mac OS X.
+
+- Issue #8084: PEP 370 now conforms to system conventions for framework builds
+ on MacOS X. That is, "python setup.py install --user" will install into
+ "~/Library/Python/2.7" instead of "~/.local".
+
+C-API
+-----
+
+- Issue #2443: A new macro, `Py_VA_COPY`, copies the state of the
+ variable argument list. `Py_VA_COPY` is equivalent to C99
+ `va_copy`, but available on all python platforms.
+
+- PySlice_GetIndicesEx now clips the step to [-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX]
+ instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do
+ "step = -step" when reversing a slice.
+
+- Issue #5753: A new C API function, `PySys_SetArgvEx`, allows embedders of the
+ interpreter to set sys.argv without also modifying sys.path. This helps fix
+ `CVE-2008-5983
+ <http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_.
+
+- Add PyArg_ValidateKeywordArguments, which checks if all keyword arguments are
+ strings in an efficient manner.
+
+- Issue #8276: PyEval_CallObject() is now only available in macro form. The
+ function declaration, which was kept for backwards compatibility reasons, is
+ now removed (the macro was introduced in 1997!).
+
+- Issue #7767: New function PyLong_AsLongLongAndOverflow added, analogous to
+ PyLong_AsLongAndOverflow.
+
+- Make PyUnicode_CompareWithASCIIString return not equal if the Python string
+ has '\0' at the end.
+
+- Issue #5080: The argument parsing functions PyArg_ParseTuple,
+ PyArg_ParseTupleAndKeywords, PyArg_VaParse, PyArg_VaParseTupleAndKeywords and
+ PyArg_Parse now raise a DeprecationWarning for float arguments passed with the
+ 'L' format code. This will become a TypeError in a future version of Python,
+ to match the behaviour of the other integer format codes.
+
+- Issue #7033: Function ``PyErr_NewExceptionWithDoc()`` added.
+
+- Issue #7414: 'C' code wasn't being skipped properly (for keyword arguments) in
+ PyArg_ParseTupleAndKeywords.
+
+- Issue #7228: Add '%lld' and '%llu' support to PyString_FromFormat(V) and
+ PyErr_Format, on machines with HAVE_LONG_LONG defined.
+
+- Issue #6151: Made PyDescr_COMMON conform to standard C (like PyObject_HEAD in
+ PEP 3123). The PyDescr_TYPE and PyDescr_NAME macros should be should used for
+ accessing the d_type and d_name members of structures using PyDescr_COMMON.
+
+- Issue #6405: Remove duplicate type declarations in descrobject.h.
+
+- The code flags for old __future__ features are now available again.
+
+- Issue #5954: Add a PyFrame_GetLineNumber() function to replace most uses of
+ PyCode_Addr2Line().
+
+- Issue #5959: Add a PyCode_NewEmpty() function to create a new empty code
+ object at a specified file, function, and line number.
+
+- Issue #1419652: Change the first argument to PyImport_AppendInittab() to
+ ``const char *`` as the string is stored beyond the call.
+
+- Issue #2422: When compiled with the ``--with-valgrind`` option, the pymalloc
+ allocator will be automatically disabled when running under Valgrind. This
+ gives improved memory leak detection when running under Valgrind, while taking
+ advantage of pymalloc at other times.
+
+Library
+-------
+
+- In pdb, when Ctrl-C is entered while defining commands for a breakpoint, the
+ old commands are restored.
+
+- For traceback debugging, the pdb listing now also shows the locations where
+ the exception was originally (re)raised, if it differs from the last line
+ executed (e.g. in case of finally clauses).
+
+- The pdb command "source" has been added. It displays the source code for a
+ given object, if possible.
+
+- The pdb command "longlist" has been added. It displays the whole source code
+ for the current function.
+
+- Issue #1503502: Make pdb.Pdb easier to subclass by putting message and error
+ output into methods.
+
+- Issue #809887: Make the output of pdb's breakpoint deletions more consistent;
+ emit a message when a breakpoint is enabled or disabled.
+
+- Issue #5294: Fix the behavior of pdb's "continue" command when called in the
+ top-level debugged frame.
+
+- Issue #5727: Restore the ability to use readline when calling into pdb in
+ doctests.
+
+- Issue #6719: In pdb, do not stop somewhere in the encodings machinery if the
+ source file to be debugged is in a non-builtin encoding.
+
+- Issue #8048: Prevent doctests from failing when sys.displayhook has been
+ reassigned.
+
+- Issue #8015: In pdb, do not crash when an empty line is entered as a
+ breakpoint command.
+
+- In pdb, allow giving a line number to the "until" command.
+
+- Issue #1437051: For pdb, allow "continue" and related commands in .pdbrc
+ files. Also, add a command-line option "-c" that runs a command as if given
+ in .pdbrc.
+
+- Issue #4179: In pdb, allow "list ." as a command to return to the currently
+ debugged line.
+
+- Issue #4108: In urllib.robotparser, if there are multiple ``User-agent: *``
+ entries, consider the first one.
+
+- Issue #6630: Allow customizing regex flags when subclassing the
+ string.Template class.
+
+- Issue #9411: Allow specifying an encoding for config files in the configparser
+ module.
+
+- Issue #1682942: Improvements to configparser: support alternate delimiters,
+ alternate comment prefixes and empty lines in values.
+
+- Issue #9354: Provide getsockopt() in asyncore's file_wrapper.
+
+- Issue #8966: ctypes: Remove implicit bytes-unicode conversion.
+
+- Issue #9378: python -m pickle <pickle file> will now load and display the
+ first object in the pickle file.
+
+- Issue #4770: Restrict binascii module to accept only bytes (as specified).
+ And fix the email package to encode to ASCII instead of ``raw-unicode-escape``
+ before ASCII-to-binary decoding.
+
+- Issue #9384: ``python -m tkinter`` will now display a simple demo applet.
+
+- The default size of the re module's compiled regular expression cache has been
+ increased from 100 to 500 and the cache replacement policy has changed from
+ simply clearing the entire cache on overflow to forgetting the least recently
+ used cached compiled regular expressions. This is a performance win for
+ applications that use a lot of regular expressions and limits the impact of
+ the performance hit anytime the cache is exceeded.
+
+- Issue #7113: Speed up loading in configparser. Patch by Åukasz Langa.
+
+- Issue #9032: XML-RPC client retries the request on EPIPE error. The EPIPE
+ error occurs when the server closes the socket and the client sends a big
+ XML-RPC request.
+
+- Issue #4629: getopt raises an error if an argument ends with "=", whereas
+ getopt doesn't accept a value (eg. --help= is rejected if getopt uses
+ ['help='] long options).
+
+- Issue #7989: Added pure python implementation of the `datetime` module. The C
+ module is renamed to `_datetime` and if available, overrides all classes
+ defined in datetime with fast C impementation. Python implementation is based
+ on the original python prototype for the datetime module by Tim Peters with
+ minor modifications by the PyPy project. The test suite now tests `datetime`
+ module with and without `_datetime` acceleration using the same test cases.
+
+- Issue #7895: platform.mac_ver() no longer crashes after calling os.fork().
+
+- Issue #9323: Fixed a bug in trace.py that resulted in loosing the name of the
+ script being traced. Patch by Eli Bendersky.
+
+- Issue #9282: Fixed --listfuncs option of trace.py. Thanks Eli Bendersky for
+ the patch.
+
+- Issue #3704: http.cookiejar was not properly handling URLs with a / in the
+ parameters.
+
+- Issue #9268: ``pickletools.dis()`` now has an optional *annotate* argument
+ which controls printing of opcode descriptions in ``dis()`` output.
+
+- Issue #1555570: email no longer inserts extra blank lines when a \r\n combo
+ crosses an 8192 byte boundary.
+
+- Issue #9243: Fix sndhdr module and add unit tests, contributed by James Lee.
+
+- ``ast.literal_eval()`` now allows byte literals.
+
+- Issue #9137: Fix issue in MutableMapping.update, which incorrectly treated
+ keyword arguments called 'self' or 'other' specially.
+
+- ``ast.literal_eval()`` now allows set literals.
+
+- Issue #9164: Ensure that sysconfig handles duplicate -arch flags in CFLAGS.
+
+- Issue #7646: The fnmatch pattern cache no longer grows without bound.
+
+- Issue #9136: Fix 'dictionary changed size during iteration' RuntimeError
+ produced when profiling the decimal module. This was due to a dangerous
+ iteration over 'locals()' in Context.__init__.
+
+- Fix extreme speed issue in Decimal.pow when the base is an exact power of 10
+ and the exponent is tiny (for example, ``Decimal(10) **
+ Decimal('1e-999999999')``).
+
+- Issue #9186: Fix math.log1p(-1.0) to raise ValueError, not OverflowError.
+
+- Issue #9130: Fix validation of relative imports in parser module.
+
+- Issue #9128: Fix validation of class decorators in parser module.
+
+- Issue #9094: python -m pickletools will now disassemble pickle files listed in
+ the command line arguments. See output of python -m pickletools -h for more
+ details.
+
+- Issue #5468: urlencode to handle bytes type and other encodings in its query
+ parameter. Patch by Dan Mahn.
+
+- Issue #7673: Fix security vulnerability (CVE-2010-2089) in the audioop module,
+ ensure that the input string length is a multiple of the frame size.
+
+- Issue #6507: Accept source strings in dis.dis(). Original patch by Daniel
+ Urban.
+
+- Issue #7829: Clearly document that the dis module is exposing an
+ implementation detail that is not stable between Python VMs or releases.
+
+- Issue #6589: cleanup asyncore.socket_map in case smtpd.SMTPServer constructor
+ raises an exception.
+
+- Issue #9110: Addition of ContextDecorator to contextlib, for creating APIs
+ that act as both context managers and decorators. contextmanager changes to
+ use ContextDecorator.
+
+- Implement importlib.abc.SourceLoader and deprecate PyLoader and PyPycLoader
+ for removal in Python 3.4.
+
+- Issue #9064: pdb's "up" and "down" commands now accept an optional argument
+ giving the number of frames to go.
+
+- Issue #9018: os.path.normcase() now raises a TypeError if the argument is not
+ ``str`` or ``bytes``.
+
+- Issue #9075: In the ssl module, remove the setting of a ``debug`` flag on an
+ OpenSSL structure.
+
+- Issue #8682: The ssl module now temporary increments the reference count of a
+ socket object got through ``PyWeakref_GetObject``, so as to avoid possible
+ deallocation while the object is still being used.
+
+- Issue #1368368: FancyURLOpener class changed to throw an Exception on wrong
+ password instead of presenting an interactive prompt. Older behavior can be
+ obtained by passing retry=True to http_error_xxx methods of FancyURLOpener.
+
+- Issue #8720: Fix regression caused by fix for #4050 by making getsourcefile
+ smart enough to find source files in the linecache.
+
+- Issue #5610: feedparser no longer eats extra characters at the end of a body
+ part if the body part ends with a ``\r\n``.
+
+- Issue #8986: math.erfc was incorrectly raising OverflowError for values
+ between -27.3 and -30.0 on some platforms.
+
+- Issue #8784: Set tarfile default encoding to 'utf-8' on Windows.
+
+- Issue #8966: If a ctypes structure field is an array of c_char, convert its
+ value to bytes instead of str (as done for c_char and c_char_p).
+
+- Issue #8188: Comparisons between Decimal and Fraction objects are now
+ permitted, returning a result based on the exact numerical values of the
+ operands. This builds on issue #2531, which allowed Decimal-to-float
+ comparisons; all comparisons involving numeric types (bool, int, float,
+ complex, Decimal, Fraction) should now act as expected.
+
+- Issue #8897: Fix sunau module, use bytes to write the header. Patch written by
+ Thomas Jollans.
+
+- Issue #8899: time.struct_time now has class and attribute docstrings.
+
+- Issue #6470: Drop UNC prefix in FixTk.
+
+- Issue #4768: base64 encoded email body parts were incorrectly stored as binary
+ strings. They are now correctly converted to strings.
+
+- Issue #8833: tarfile created hard link entries with a size field != 0 by
+ mistake.
+
+- Charset.body_encode now correctly handles base64 encoding by encoding with the
+ output_charset before calling base64mime.encode. Passes the tests from 2.x
+ issue #1368247.
+
+- Issue #8845: sqlite3 Connection objects now have a read-only in_transaction
+ attribute that is True iff there are uncommitted changes.
+
+- Issue #1289118: datetime.timedelta objects can now be multiplied by float and
+ divided by float and int objects. Results are rounded to the nearest multiple
+ of timedelta.resolution with ties resolved using round-half-to-even method.
+
+- Issue #7150: Raise OverflowError if the result of adding or subtracting
+ timedelta from date or datetime falls outside of the MINYEAR:MAXYEAR range.
+
+- Issue #8806: add SSL contexts support to ftplib.
+
+- Issue #4769: Fix main() function of the base64 module, use sys.stdin.buffer
+ and sys.stdout.buffer (instead of sys.stdin and sys.stdout) to use the bytes
+ API.
+
+- Issue #8770: Now sysconfig displays information when it's called as a script.
+ Initial idea by Sridhar Ratnakumar.
+
+- Issue #6662: Fix parsing of malformatted charref (&#bad;), patch written by
+ Fredrik Håård.
+
+- Issue #8540: Decimal module: rename the Context._clamp attribute to
+ Context.clamp and make it public. This is useful in creating contexts that
+ correspond to the decimal interchange formats specified in IEEE 754.
+
+- Issue #6268: Fix seek() method of codecs.open(), don't read or write the BOM
+ twice after seek(0). Fix also reset() method of codecs, UTF-16, UTF-32 and
+ StreamWriter classes.
+
+- Issue #3798: sys.exit(message) writes the message to sys.stderr file, instead
+ of the C file stderr, to use stderr encoding and error handler.
+
+- Issue #8782: Add a trailing newline in linecache.updatecache to the last line
+ of files without one.
+
+- Issue #8729: Return NotImplemented from collections.Mapping.__eq__ when
+ comparing to a non-mapping.
+
+- Issue #8774: tabnanny uses the encoding cookie (#coding:...) to use the
+ correct encoding.
+
+- Issue #4870: Add an `options` attribute to SSL contexts, as well as several
+ ``OP_*`` constants to the `ssl` module. This allows to selectively disable
+ protocol versions, when used in combination with `PROTOCOL_SSLv23`.
+
+- Issue #8759: Fixed user paths in sysconfig for posix and os2 schemes.
+
+- Issue #8663: distutils.log emulates backslashreplace error handler. Fix
+ compilation in a non-ASCII directory if stdout encoding is ASCII (eg. if
+ stdout is not a TTY).
+
+- Issue #8513: os.get_exec_path() supports b'PATH' key and bytes value.
+ subprocess.Popen() and os._execvpe() support bytes program name. Add
+ os.supports_bytes_environ flag: True if the native OS type of the environment
+ is bytes (eg. False on Windows).
+
+- Issue #8633: tarfile is now able to read and write archives with "raw" binary
+ pax headers as described in POSIX.1-2008.
+
+- Issue #1285086: Speed up urllib.parse functions: quote, quote_from_bytes,
+ unquote, unquote_to_bytes.
+
+- Issue #8688: Distutils now recalculates MANIFEST everytime.
+
+- Issue #8477: ssl.RAND_egd() and ssl._test_decode_cert() support str with
+ surrogates and bytes for the filename.
+
+- Issue #8550: Add first class ``SSLContext`` objects to the ssl module.
+
+- Issue #8681: Make the zlib module's error messages more informative when the
+ zlib itself doesn't give any detailed explanation.
+
+- The audioop module now supports sound fragments of length greater than 2**31
+ bytes on 64-bit machines, and is PY_SSIZE_T_CLEAN.
+
+- Issue #4972: Add support for the context manager protocol to the ftplib.FTP
+ class.
+
+- Issue #8664: In py_compile, create __pycache__ when the compiled path is
+ given.
+
+- Issue #8514: Add os.fsencode() function (Unix only): encode a string to bytes
+ for use in the file system, environment variables or the command line.
+
+- Issue #8571: Fix an internal error when compressing or decompressing a chunk
+ larger than 1GB with the zlib module's compressor and decompressor objects.
+
+- Issue #8603: Support bytes environmental variables on Unix: Add os.environb
+ mapping and os.getenvb() function. os.unsetenv() encodes str argument to the
+ file system encoding with the surrogateescape error handler (instead of
+ utf8/strict) and accepts bytes. posix.environ keys and values are now bytes.
+
+- Issue #8573: asyncore _strerror() function might throw ValueError.
+
+- Issue #8483: asyncore.dispatcher's __getattr__ method produced confusing error
+ messages when accessing undefined class attributes because of the cheap
+ inheritance with the underlying socket object. The cheap inheritance has been
+ deprecated.
+
+- Issue #4265: shutil.copyfile() was leaking file descriptors when disk fills.
+ Patch by Tres Seaver.
+
+- Issue #8390: tarfile uses surrogateescape as the default error handler
+ (instead of replace in read mode or strict in write mode).
+
+- Issue #7755: Use an unencumbered audio file for tests.
+
+- Issue #8621: uuid.uuid4() returned the same sequence of values in the parent
+ and any children created using ``os.fork`` on MacOS X 10.6.
+
+- Issue #8567: Fix precedence of signals in Decimal module: when a Decimal
+ operation raises multiple signals and more than one of those signals is
+ trapped, the specification determines the order in which the signals should be
+ handled. In many cases this order wasn't being followed, leading to the wrong
+ Python exception being raised.
+
+- Issue #7865: The close() method of ``io`` objects should not swallow
+ exceptions raised by the implicit flush(). Also qensure that calling close()
+ several times is supported. Patch by Pascal Chambon.
+
+- Issue #4687: Fix accuracy of garbage collection runtimes displayed with
+ gc.DEBUG_STATS.
+
+- Issue #8354: The siginterrupt setting is now preserved for all signals, not
+ just SIGCHLD.
+
+- Issue #7192: webbrowser.get("firefox") now works on Mac OS X, as does
+ webbrowser.get("safari").
+
+- Issue #8464: tarfile no longer creates files with execute permissions set when
+ mode="w|" is used.
+
+- Issue #7834: Fix connect() of Bluetooth L2CAP sockets with recent versions of
+ the Linux kernel. Patch by Yaniv Aknin.
+
+- Issue #8295: Added shutil.unpack_archive.
+
+- Issue #6312: Fixed http HEAD request when the transfer encoding is chunked.
+ It should correctly return an empty response now.
+
+- Issue #8546: Reject None given as the buffering argument to _pyio.open.
+
+- Issue #8549: Fix compiling the _ssl extension under AIX. Patch by
+ Sridhar Ratnakumar.
+
+- Issue #6656: fix locale.format_string to handle escaped percents
+ and mappings.
+
+- Issue #2302: Fix a race condition in SocketServer.BaseServer.shutdown, where
+ the method could block indefinitely if called just before the event loop
+ started running. This also fixes the occasional freezes witnessed in
+ test_httpservers.
+
+- Issue #8524: When creating an SSL socket, the timeout value of the original
+ socket wasn't retained (instead, a socket with a positive timeout would be
+ turned into a non-blocking SSL socket).
+
+- Issue #5103: SSL handshake would ignore the socket timeout and block
+ indefinitely if the other end didn't respond.
+
+- The do_handshake() method of SSL objects now adjusts the blocking mode of the
+ SSL structure if necessary (as other methods already do).
+
+- Issue #8391: os.execvpe() and os.getenv() supports unicode with surrogates and
+ bytes strings for environment keys and values.
+
+- Issue #8467: Pure Python implementation of subprocess encodes the error
+ message using surrogatepass error handler to support surrogates in the
+ message.
+
+- Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames.
+
+- Issue #8451: Syslog module now uses basename(sys.argv[0]) instead of the
+ string "python" as the *ident*. openlog() arguments are all optional and
+ keywords.
+
+- Issue #8108: Fix the unwrap() method of SSL objects when the socket has a
+ non-infinite timeout. Also make that method friendlier with applications
+ wanting to continue using the socket in clear-text mode, by disabling
+ OpenSSL's internal readahead. Thanks to Darryl Miles for guidance.
+
+- Issue #8496: make mailcap.lookup() always return a list, rather than an
+ iterator. Patch by Gregory Nofi.
+
+- Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
+ collation name contains a surrogate character.
+
+- Issue #8484: Load all ciphers and digest algorithms when initializing the _ssl
+ extension, such that verification of some SSL certificates doesn't fail
+ because of an "unknown algorithm".
+
+- Issue #6547: Added the ignore_dangling_symlinks option to shutil.copytree.
+
+- Issue #1540112: Now allowing the choice of a copy function in shutil.copytree.
+
+- Issue #4814: timeout parameter is now applied also for connections resulting
+ from PORT/EPRT commands.
+
+- Issue #8463: added missing reference to bztar in shutil's documentation.
+
+- Issue #7154: urllib.request can now detect the proxy settings on OSX 10.6 (as
+ long as the user didn't specify 'automatic proxy configuration').
+
+- Issue #3817: ftplib.FTP.abort() method now considers 225 a valid response code
+ as stated in RFC-959 at chapter 5.4.
+
+- Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
+ surrogates.
+
+- Issue #850728: Add a *timeout* parameter to the `acquire()` method of
+ `threading.Semaphore` objects. Original patch by Torsten Landschoff.
+
+- Issue #8322: Add a *ciphers* argument to SSL sockets, so as to change the
+ available cipher list. Helps fix test_ssl with OpenSSL 1.0.0.
+
+- Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
+ the current working directory.
+
+- Issue #7606: XML-RPC traceback stored in X-traceback is now encoded to ASCII
+ using backslashreplace error handler.
+
+- Issue #8412: os.system() now accepts bytes, bytearray and str with surrogates.
+
+- Issue #2987: RFC2732 support for urlparse (IPv6 addresses). Patch by Tony
+ Locke and Hans Ulrich Niedermann.
+
+- Issue #5277: Fix quote counting when parsing RFC 2231 encoded parameters.
+
+- Issue #7316: The acquire() method of lock objects in the ``threading``
+ module now takes an optional timeout argument in seconds. Timeout support
+ relies on the system threading library, so as to avoid a semi-busy wait loop.
+
+- Issue #8383: pickle and pickletools use surrogatepass error handler when
+ encoding unicode as utf8 to support lone surrogates and stay compatible with
+ Python 2.x and 3.x.
+
+- Issue #7585: difflib context and unified diffs now place a tab between
+ filename and date, conforming to the 'standards' they were originally designed
+ to follow. This improves compatibility with patch tools.
+
+- Issue #7472: Fixed typo in email.encoders module; messages using ISO-2022
+ character sets will now consistently use a Content-Transfer-Encoding of 7bit
+ rather than sometimes being marked as 8bit.
+
+- Issue #8375: test_distutils now checks if the temporary directory are still
+ present before it cleans them.
+
+- Issue #8374: Update the internal alias table in the ``locale`` module to
+ cover recent locale changes and additions.
+
+- Issue #8321: Give access to OpenSSL version numbers from the `ssl` module,
+ using the new attributes `ssl.OPENSSL_VERSION`, `ssl.OPENSSL_VERSION_INFO` and
+ `ssl.OPENSSL_VERSION_NUMBER`.
+
+- Add functools.total_ordering() and functools.cmp_to_key().
+
+- Issue #8257: The Decimal construct now accepts a float instance directly,
+ converting that float to a Decimal of equal value:
+
+ >>> Decimal(1.1)
+ Decimal('1.100000000000000088817841970012523233890533447265625')
+
+- Issue #8294: The Fraction constructor now accepts Decimal and float instances
+ directly.
+
+- Issue #7279: Comparisons involving a Decimal signaling NaN now signal
+ InvalidOperation instead of returning False. (Comparisons involving a quiet
+ NaN are unchanged.) Also, Decimal quiet NaNs are now hashable; Decimal
+ signaling NaNs remain unhashable.
+
+- Issue #2531: Comparison operations between floats and Decimal instances now
+ return a result based on the numeric values of the operands; previously they
+ returned an arbitrary result based on the relative ordering of id(float) and
+ id(Decimal). See also issue #8188, which adds Decimal-to-Fraction
+ comparisons.
+
+- Added a subtract() method to collections.Counter().
+
+- Issue #8233: When run as a script, py_compile.py optionally takes a single
+ argument `-` which tells it to read files to compile from stdin. Each line is
+ read on demand and the named file is compiled immediately. (Original patch by
+ Piotr Ożarowski).
+
+- Backwards incompatible change: Unicode codepoints line tabulation (0x0B) and
+ form feed (0x0C) are now considered linebreaks, as specified in Unicode
+ Standard Annex #14. See issue #7643. http://www.unicode.org/reports/tr14/
+
+- Comparisons using one of <, <=, >, >= between a complex instance and a
+ Fractions instance now raise TypeError instead of returning True/False. This
+ makes Fraction <=> complex comparisons consistent with int <=> complex, float
+ <=> complex, and complex <=> complex comparisons.
+
+- Issue #8139: ossaudiodev didn't initialize its types properly, therefore some
+ methods (such as oss_mixer_device.fileno()) were not available. Initial patch
+ by Bertrand Janin.
+
+- Issue #8205: Remove the "Modules" directory from sys.path when Python is
+ running from the build directory (POSIX only).
+
+- Issue #7512: shutil.copystat() could raise an OSError when the filesystem
+ didn't support chflags() (for example ZFS under FreeBSD). The error is now
+ silenced.
+
+- Issue #7860: platform.uname now reports the correct 'machine' type when Python
+ is running in WOW64 mode on 64 bit Windows.
+
+- Issue #3890, #8222: Fix recv() and recv_into() on non-blocking SSL sockets.
+ Also, enable the SSL_MODE_AUTO_RETRY flag on SSL sockets, so that blocking
+ reads and writes are always retried by OpenSSL itself.
+
+- Issue #4282: Fix the main function of the profile module for a non-ASCII
+ script, open the file in binary mode and not in text mode with the default
+ (utf8) encoding.
+
+- Issue #8179: Fix macpath.realpath() on a non-existing path.
+
+- Issue #8024: Update the Unicode database to 5.2.
+
+- Issue #8168: py_compile now handles files with utf-8 BOMS.
+
+- ``tokenize.detect_encoding`` now returns ``'utf-8-sig'`` when a UTF-8 BOM is
+ detected.
+
+- Issue #6716/2: Backslash-replace error output in compilall.
+
+- Issue #4961: Inconsistent/wrong result of askyesno function in tkMessageBox
+ with Tcl/Tk-8.5.
+
+- Issue #8140: extend compileall to compile single files. Add -i option.
+
+- Issue #7356: ctypes.util: Make parsing of ldconfig output independent of the
+ locale.
+
+- The internals of the subprocess module on POSIX systems have been replaced by
+ an extension module (_posixsubprocess) so that the fork()+exec() can be done
+ safely without the possibility of deadlock in multithreaded applications.
+
+- subprocess.Popen now has restore_signals and start_new_session features. The
+ default of restore_signals=True is a new behavior compared to earlier Python
+ versions. This means that signals such as SIGPIPE are not ignored by default
+ in subprocesses launched by Python (Issue #1652).
+
+- Issue #6472: The xml.etree package is updated to ElementTree 1.3. The
+ cElementTree module is updated too.
+
+- Issue #7774: Set sys.executable to an empty string if argv[0] has been set to
+ an non existent program name and Python is unable to retrieve the real program
+ name.
+
+- Issue #7880: Fix sysconfig when the python executable is a symbolic link.
+
+- Issue #6509: fix re.sub to work properly when the pattern, the string, and the
+ replacement were all bytes. Patch by Antoine Pitrou.
+
+- The sqlite3 module was updated to pysqlite 2.6.0. This fixes several obscure
+ bugs and allows loading SQLite extensions from shared libraries.
+
+- Issue #1054943: Fix ``unicodedata.normalize('NFC', text)`` for the Public
+ Review Issue #29 (http://unicode.org/review/pr-29.html).
+
+- Issue #7494: fix a crash in _lsprof (cProfile) after clearing the profiler,
+ reset also the pointer to the current pointer context.
+
+- Issue #7232: Add support for the context manager protocol to the TarFile
+ class.
+
+- Issue #7250: Fix info leak of os.environ across multi-run uses of
+ wsgiref.handlers.CGIHandler.
+
+- Issue #1729305: Fix doctest to handle encode error with "backslashreplace".
+
+- Issue #691291: codecs.open() should not convert end of lines on reading and
+ writing.
+
+- Issue #7869: logging: improved diagnostic for format-time errors.
+
+- Issue #7868: logging: added loggerClass attribute to Manager.
+
+- logging: Implemented PEP 391.
+
+- Issue #1537721: Add a writeheader() method to csv.DictWriter.
+
+- Issue #7959: ctypes callback functions are now registered correctly with the
+ cycle garbage collector.
+
+- Issue #5801: removed spurious empty lines in wsgiref.
+
+- Issue #6666: fix bug in trace.py that applied the list of directories to be
+ ignored only to the first file. Noted by Bogdan Opanchuk.
+
+- Issue #7597: curses.use_env() can now be called before initscr(). Noted by
+ Kan-Ru Chen.
+
+- Issue #7310: fix the __repr__ of os.environ to show the environment variables.
+
+- Issue #7970: email.Generator.flatten now correctly flattens message/rfc822
+ messages parsed by email.Parser.HeaderParser.
+
+- Issue #7361: Importlib was not properly checking the number of bytes in
+ bytecode file when it was less then 8 bytes.
+
+- Issue #7633: In the decimal module, Context class methods (with the exception
+ of canonical and is_canonical) now accept instances of int and long wherever a
+ Decimal instance is accepted, and implicitly convert that argument to Decimal.
+ Previously only some arguments were converted.
+
+- Issue #7835: shelve should no longer produce mysterious warnings during
+ interpreter shutdown.
+
+- Issue #2746: Don't escape ampersands and angle brackets ("&", "<", ">") in XML
+ processing instructions and comments. These raw characters are allowed by the
+ XML specification, and are necessary when outputting e.g. PHP code in a
+ processing instruction. Patch by Neil Muller.
+
+- Issue #6233: ElementTree failed converting unicode characters to XML entities
+ when they could't be represented in the requested output encoding. Patch by
+ Jerry Chen.
+
+- Issue #6003: add an argument to ``zipfile.Zipfile.writestr`` to specify the
+ compression type.
+
+- Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is
+ specified, rather than fall through to AF_PACKET (in the `socket` module).
+ Also, raise ValueError rather than TypeError when an unknown TIPC address type
+ is specified. Patch by Brian Curtin.
+
+- Issue #6939: Fix file I/O objects in the `io` module to keep the original file
+ position when calling `truncate()`. It would previously change the file
+ position to the given argument, which goes against the tradition of
+ ftruncate() and other truncation APIs. Patch by Pascal Chambon.
+
+- Issue #7610: Reworked implementation of the internal
+ ``zipfile.ZipExtFile`` class used to represent files stored inside an
+ archive. The new implementation is significantly faster and can be wrapped in
+ a ``io.BufferedReader`` object for more speedups. It also solves an
+ issue where interleaved calls to `read()` and `readline()` give wrong results.
+ Patch by Nir Aides.
+
+- Issue #6963: Added "maxtasksperchild" argument to multiprocessing.Pool,
+ allowing for a maximum number of tasks within the pool to be completed by the
+ worker before that worker is terminated, and a new one created to replace it.
+
+- Issue #7792: Registering non-classes to ABCs raised an obscure error.
+
+- Issue #7785: Don't accept bytes in FileIO.write().
+
+- Removed the functions 'verify' and 'vereq' from Lib/test/support.py.
+
+- Issue #7773: Fix an UnboundLocalError in platform.linux_distribution() when
+ the release file is empty.
+
+- Issue #7561: Fix crashes when using bytearray objects with the posix
+ module.
+
+- Issue #1670765: Prevent email.generator.Generator from re-wrapping headers in
+ multipart/signed MIME parts, which fixes one of the sources of invalid
+ modifications to such parts by Generator.
+
+- Issue #7703: Add support for the new buffer API to `binascii.a2bhqx`. Patch
+ by Florent Xicluna, along with some additional tests.
+
+- Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a 1-byte
+ argument. Patch by Victor Stinner.
+
+- Issue #3299: Fix possible crash in the _sre module when given bad argument
+ values in debug mode. Patch by Victor Stinner.
+
+- Issue #2846: Add support for gzip.GzipFile reading zero-padded files. Patch
+ by Brian Curtin.
+
+- Issue #7681: Use floor division in appropiate places in the wave module.
+
+- Issue #5372: Drop the reuse of .o files in Distutils' ccompiler (since
+ Extension extra options may change the output without changing the .c
+ file). Initial patch by Collin Winter.
+
+- Issue #7617: Make sure distutils.unixccompiler.UnixCCompiler recognizes gcc
+ when it has a fully qualified configuration prefix. Initial patch by Arfrever.
+
+- Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against the
+ destruction of weakref'ed objects while iterating.
+
+- Issue #7455: Fix possible crash in cPickle on invalid input. Patch by Victor
+ Stinner.
+
+- Issue #1628205: Socket file objects returned by socket.socket.makefile() now
+ properly handles EINTR within the read, readline, write & flush methods. The
+ socket.sendall() method now properly handles interrupted system calls.
+
+- Issue #7471: Improve the performance of GzipFile's buffering mechanism, and
+ make it implement the `io.BufferedIOBase` ABC to allow for further speedups by
+ wrapping it in an `io.BufferedReader`. Patch by Nir Aides.
+
+- Issue #3972: http.client.HTTPConnection now accepts an optional source_address
+ parameter to allow specifying where your connections come from.
+
+- socket.create_connection now accepts an optional source_address parameter.
+
+- Issue #5511: now zipfile.ZipFile can be used as a context manager. Initial
+ patch by Brian Curtin.
+
+- Issue #7556: Make sure Distutils' msvc9compile reads and writes the MSVC XML
+ Manifest file in text mode so string patterns can be used in regular
+ expressions.
+
+- Issue #7552: Removed line feed in the base64 Authorization header in the
+ Distutils upload command to avoid an error when PyPI reads it. This occurs on
+ long passwords. Initial patch by JP St. Pierre.
+
+- Issue #7231: urllib2 cannot handle https with proxy requiring auth. Patch by
+ Tatsuhiro Tsujikawa.
+
+- Issue #4757: `zlib.compress` and other methods in the zlib module now raise a
+ TypeError when given an `str` object (rather than a `bytes`-like object).
+ Patch by Victor Stinner and Florent Xicluna.
+
+- Issue #7349: Make methods of file objects in the io module accept None as an
+ argument where file-like objects (ie StringIO and BytesIO) accept them to mean
+ the same as passing no argument.
+
+- Issue #7357: tarfile no longer suppresses fatal extraction errors by default.
+
+- Issue #5949: added check for correct lineends in input from IMAP server in
+ imaplib.
+
+- Add count() and reverse() methods to collections.deque().
+
+- Fix variations of extending deques: d.extend(d) d.extendleft(d) d+=d
+
+- Issue #6986: Fix crash in the JSON C accelerator when called with the wrong
+ parameter types. Patch by Victor Stinner.
+
+- Issue #7457: added a read_pkg_file method to
+ distutils.dist.DistributionMetadata.
+
+- logging: Added optional `secure` parameter to SMTPHandler, to enable use of
+ TLS with authentication credentials.
+
+- Issue #1923: Fixed the removal of meaningful spaces when PKG-INFO is generated
+ in Distutils. Patch by Stephen Emslie.
+
+- Issue #4120: Drop reference to CRT from manifest when building extensions with
+ msvc9compiler.
+
+- Issue #7333: The `posix` module gains an `initgroups()` function providing
+ access to the initgroups(3) C library call on Unix systems which implement it.
+ Patch by Jean-Paul Calderone.
+
+- Issue #7408: Fixed distutils.tests.sdist so it doesn't check for group
+ ownership when the group is not forced, because the group may be different
+ from the user's group and inherit from its container when the test is run.
+
+- Issue #4486: When an exception has an explicit cause, do not print its
+ implicit context too. This affects the `traceback` module as well as built-in
+ exception printing.
+
+- Issue #1515: Enable use of deepcopy() with instance methods. Patch by Robert
+ Collins.
+
+- Issue #7403: logging: Fixed possible race condition in lock creation.
+
+- Issue #6845: Add restart support for binary upload in ftplib. The
+ `storbinary()` method of FTP and FTP_TLS objects gains an optional `rest`
+ argument. Patch by Pablo Mouzo.
+
+- Issue #5788: `datetime.timedelta` objects get a new `total_seconds()` method
+ returning the total number of seconds in the duration. Patch by Brian
+ Quinlan.
+
+- Issue #7133: SSL objects now support the new buffer API.
+
+- Issue #1488943: difflib.Differ() doesn't always add hints for tab characters.
+
+- Issue #6123: tarfile now opens empty archives correctly and consistently
+ raises ReadError on empty files.
+
+- Issue #7354: distutils.tests.test_msvc9compiler - dragfullwindows can be 2.
+
+- Issue #5037: Proxy the __bytes__ special method instead to __bytes__ instead
+ of __str__.
+
+- Issue #7341: Close the internal file object in the TarFile constructor in case
+ of an error.
+
+- Issue #7293: distutils.test_msvc9compiler is fixed to work on any fresh
+ Windows box. Help provided by David Bolen.
+
+- Issue #2054: ftplib now provides an FTP_TLS class to do secure FTP using TLS
+ or SSL. Patch by Giampaolo Rodola'.
+
+- Issue #7328: pydoc no longer corrupts sys.path when run with the '-m' switch.
+
+- Issue #4969: The mimetypes module now reads the MIME database from the
+ registry under Windows. Patch by Gabriel Genellina.
+
+- Issue #6816: runpy now provides a run_path function that allows Python code to
+ execute file paths that refer to source or compiled Python files as well as
+ zipfiles, directories and other valid sys.path entries that contain a
+ __main__.py file. This allows applications that run other Python scripts to
+ support the same flexibility as the CPython command line itself.
+
+- Issue #7318: multiprocessing now uses a timeout when it fails to establish a
+ connection with another process, rather than looping endlessly. The default
+ timeout is 20 seconds, which should be amply sufficient for local connections.
+
+- Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
+ unpickled. This fixes crashes under Windows when trying to run
+ test_multiprocessing in verbose mode.
+
+- Issue #7893: ``unittest.TextTestResult`` is made public and a ``resultclass``
+ argument added to the TextTestRunner constructor allowing a different result
+ class to be used without having to subclass.
+
+- Issue #7588: ``unittest.TextTestResult.getDescription`` now includes the test
+ name in failure reports even if the test has a docstring.
+
+- Issue #3001: Add a C implementation of recursive locks which is used by
+ default when instantiating a `threading.RLock` object. This makes recursive
+ locks as fast as regular non-recursive locks (previously, they were slower by
+ 10x to 15x).
+
+- Issue #7282: Fix a memory leak when an RLock was used in a thread other than
+ those started through `threading.Thread` (for example, using
+ `_thread.start_new_thread()`).
+
+- Issue #7187: Importlib would not silence the IOError raised when trying to
+ write new bytecode when it was made read-only.
+
+- Issue #7264: Fix a possible deadlock when deallocating thread-local objects
+ which are part of a reference cycle.
+
+- Issue #7211: Allow 64-bit values for the `ident` and `data` fields of kevent
+ objects on 64-bit systems. Patch by Michael Broghton.
+
+- Issue #6896: mailbox.Maildir now invalidates its internal cache each time a
+ modification is done through it. This fixes inconsistencies and test failures
+ on systems with slightly bogus mtime behaviour.
+
+- Issue #7246 & Issue #7208: getpass now properly flushes input before reading
+ from stdin so that existing input does not confuse it and lead to incorrect
+ entry or an IOError. It also properly flushes it afterwards to avoid the
+ terminal echoing the input afterwards on OSes such as Solaris.
+
+- Issue #7233: Fix a number of two-argument Decimal methods to make sure that
+ they accept an int or long as the second argument. Also fix buggy handling of
+ large arguments (those with coefficient longer than the current precision) in
+ shift and rotate.
+
+- Issue #4750: Store the basename of the original filename in the gzip FNAME
+ header as required by RFC 1952.
+
+- Issue #1180: Added a new global option to ignore ~/.pydistutils.cfg in
+ Distutils.
+
+- Issue #7218: Fix test_site for win32, the directory comparison was done with
+ an uppercase.
+
+- Issue #7205: Fix a possible deadlock when using a BZ2File object from
+ several threads at once.
+
+- Issue #7077: logging: SysLogHandler now treats Unicode as per RFC 5424.
+
+- Issue #7099: Decimal.is_normal now returns True for numbers with exponent
+ larger than emax.
+
+- Issue #7080: locale.strxfrm() raises a MemoryError on 64-bit non-Windows
+ platforms, and assorted locale fixes by Derk Drukker.
+
+- Issue #5833: Fix extra space character in readline completion with the GNU
+ readline library version 6.0.
+
+- Issue #6894: Fixed the issue urllib2 doesn't respect "no_proxy" environment.
+
+- Issue #7086: Added TCP support to SysLogHandler, and tidied up some
+ anachronisms in the code which were a relic of 1.5.2 compatibility.
+
+- Issue #7082: When falling back to the MIME 'name' parameter, the correct place
+ to look for it is the Content-Type header.
+
+- Make tokenize.detect_coding() normalize utf-8 and iso-8859-1 variants like the
+ builtin tokenizer.
+
+- Issue #7048: Force Decimal.logb to round its result when that result is too
+ large to fit in the current precision.
+
+- Issue #6236, #6348: Fix various failures in the I/O library under AIX and
+ other platforms, when using a non-gcc compiler. Patch by Derk Drukker.
+
+- Issue #4606: Passing 'None' if ctypes argtype is set to POINTER(...) does now
+ always result in NULL.
+
+- Issue #5042: Structure sub-subclass does now initialize correctly with base
+ class positional arguments.
+
+- Issue #6882: Import uuid creates zombies processes.
+
+- Issue #6635: Fix profiler printing usage message.
+
+- Issue #6856: Add a filter keyword argument to TarFile.add().
+
+- Issue #6888: pdb's alias command was broken when no arguments were given.
+
+- Issue #6857: Default format() alignment should be '>' for Decimal instances.
+
+- Issue #6795: int(Decimal('nan')) now raises ValueError instead of returning
+ NaN or raising InvalidContext. Also, fix infinite recursion in
+ long(Decimal('nan')).
+
+- Issue #6850: Fix bug in Decimal._parse_format_specifier for formats with no
+ type specifier.
+
+- Issue #6239: ctypes.c_char_p return value must return bytes.
+
+- Issue #6838: Use a list to accumulate the value instead of repeatedly
+ concatenating strings in http.client's HTTPResponse._read_chunked providing a
+ significant speed increase when downloading large files servend with a
+ Transfer-Encoding of 'chunked'.
+
+- Trying to import a submodule from a module that is not a package, ImportError
+ should be raised, not AttributeError.
+
+- When the globals past to importlib.__import__() has __package__ set to None,
+ fall back to computing what __package__ should be instead of giving up.
+
+- Raise a TypeError when the name of a module to be imported for
+ importlib.__import__ is not a string (was raising an AttributeError before).
+
+- Allow the fromlist passed into importlib.__import__ to be any iterable.
+
+- Have importlib raise ImportError if None is found in sys.modules.
+
+- Issue #6054: Do not normalize stored pathnames in tarfile.
+
+- Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN
+ payloads are now ordered by integer value rather than lexicographically.
+
+- Issue #1356969: Add missing info methods in tix.HList.
+
+- Issue #1522587: New constants and methods for the tix.Grid widget.
+
+- Issue #1250469: Fix the return value of tix.PanedWindow.panes.
+
+- Issue #1119673: Do not override tkinter.Text methods when creating a
+ ScrolledText.
+
+- Issue #6665: Fix fnmatch to properly match filenames with newlines in them.
+
+- Issue #1135: Add the XView and YView mix-ins to avoid duplicating the xview*
+ and yview* methods.
+
+- Issue #6629: Fix a data corruption issue in the new I/O library, which could
+ occur when writing to a BufferedRandom object (e.g. a file opened in "rb+" or
+ "wb+" mode) after having buffered a certain amount of data for reading. This
+ bug was not present in the pure Python implementation.
+
+- Issue #6622: Fix "local variable 'secret' referenced before assignment" bug in
+ POP3.apop.
+
+- Issue #2715: Remove remnants of Carbon.File from binhex module.
+
+- Issue #6595: The Decimal constructor now allows arbitrary Unicode decimal
+ digits in input, as recommended by the standard. Previously it was restricted
+ to accepting [0-9].
+
+- Issue #6106: telnetlib.Telnet.process_rawq doesn't handle default WILL/WONT
+ DO/DONT correctly.
+
+- Issue #1424152: Fix for http.client, urllib.request to support SSL while
+ working through proxy. Original patch by Christopher Li, changes made by
+ Senthil Kumaran.
+
+- Add importlib.abc.ExecutionLoader to represent the PEP 302 protocol for
+ loaders that allow for modules to be executed. Both importlib.abc.PyLoader and
+ PyPycLoader inherit from this class and provide implementations in relation to
+ other methods required by the ABCs.
+
+- importlib.abc.PyLoader did not inherit from importlib.abc.ResourceLoader like
+ the documentation said it did even though the code in PyLoader relied on the
+ abstract method required by ResourceLoader.
+
+- Issue #6431: Make Fraction type return NotImplemented when it doesn't know how
+ to handle a comparison without loss of precision. Also add correct handling
+ of infinities and nans for comparisons with float.
+
+- Issue #6415: Fixed warnings.warn segfault on bad formatted string.
+
+- Issue #6358: The exit status of a command started with os.popen() was reported
+ differently than it did with python 2.x.
+
+- Issue #6323: The pdb debugger did not exit when running a script with a syntax
+ error.
+
+- Issue #3392: The subprocess communicate() method no longer fails in select()
+ when file descriptors are large; communicate() now uses poll() when possible.
+
+- Issue #6369: Fix an RLE decompression bug in the binhex module.
+
+- Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.
+
+- The deprecated function string.maketrans has been removed.
+
+- Issue #4005: Fixed a crash of pydoc when there was a zip file present in
+ sys.path.
+
+- Issue #6218: io.StringIO and io.BytesIO instances are now picklable.
+
+- The os.get_exec_path() function to return the list of directories that will be
+ searched for an executable when launching a subprocess was added.
+
+- Issue #7481: When a threading.Thread failed to start it would leave the
+ instance stuck in initial state and present in threading.enumerate().
+
+- Issue #1068268: The subprocess module now handles EINTR in internal os.waitpid
+ and os.read system calls where appropriate.
+
+- Issue #6729: Added ctypes.c_ssize_t to represent ssize_t.
+
+- Issue #6247: The argparse module has been added to the standard library.
+
+- Issue #8235: _socket: Add the constant ``SO_SETFIB``. SO_SETFIB is a socket
+ option available on FreeBSD 7.1 and newer.
+
+- Issue #9315: Fix for the trace module to record correct class name
+ for tracing methods.
+
+Extension Modules
+-----------------
+
+- Issue #9959: Tweak formula used for computing math.log of an integer,
+ making it marginally more accurate for exact powers of 2.
+
+- Issue #9422: Fix memory leak when re-initializing a struct.Struct object.
+
+- Issue #7900: The getgroups(2) system call on MacOSX behaves rather oddly
+ compared to other unix systems. In particular, os.getgroups() does not reflect
+ any changes made using os.setgroups() but basicly always returns the same
+ information as the id command. os.getgroups() can now return more than 16
+ groups on MacOSX.
+
+- Issue #6095: Make directory argument to os.listdir optional.
+
+- Issue #9277: Fix bug in struct.pack for bools in standard mode (e.g.,
+ struct.pack('>?')): if conversion to bool raised an exception then that
+ exception wasn't properly propagated on machines where char is unsigned.
+
+- Issue #5180: Fixed a bug that prevented loading 2.x pickles in 3.x python when
+ they contain instances of old-style classes.
+
+- Issue #9165: Add new functions math.isfinite and cmath.isfinite, to accompany
+ existing isinf and isnan functions.
+
+- Issue #1578269: Implement os.symlink for Windows 6.0+. Patch by Jason
+ R. Coombs.
+
+- In struct.pack, correctly propogate exceptions from computing the truth of an
+ object in the '?' format.
+
+- Issue #9000: datetime.timezone objects now have eval-friendly repr.
+
+- In the math module, correctly lookup __trunc__, __ceil__, and __floor__ as
+ special methods.
+
+- Issue #9005: Prevent utctimetuple() from producing year 0 or year 10,000.
+ Prior to this change, timezone adjustment in utctimetuple() could produce
+ tm_year value of 0 or 10,000. Now an OverflowError is raised in these edge
+ cases.
+
+- Issue #6641: The ``datetime.strptime`` method now supports the ``%z``
+ directive. When the ``%z`` directive is present in the format string, an
+ aware ``datetime`` object is returned with ``tzinfo`` bound to a
+ ``datetime.timezone`` instance constructed from the parsed offset. If both
+ ``%z`` and ``%Z`` are present, the data in ``%Z`` field is used for timezone
+ name, but ``%Z`` data without ``%z`` is discarded.
+
+- Issue #5094: The ``datetime`` module now has a simple concrete class
+ implementing ``datetime.tzinfo`` interface. Instances of the new class,
+ ``datetime.timezone``, return fixed name and UTC offset from their
+ ``tzname(dt)`` and ``utcoffset(dt)`` methods. The ``dst(dt)`` method always
+ returns ``None``. A class attribute, ``utc`` contains an instance
+ representing the UTC timezone. Original patch by Rafe Kaplan.
+
+- Issue #8973: Add __all__ to struct module; this ensures that help(struct)
+ includes documentation for the struct.Struct class.
+
+- Issue #3129: Trailing digits in struct format string are no longer ignored.
+ For example, "1" or "ilib123" are now invalid formats and cause
+ ``struct.error`` to be raised. Patch by Caleb Deveraux.
+
+- Issue #7384: If the system readline library is linked against ncurses, the
+ curses module must be linked against ncurses as well. Otherwise it is not safe
+ to load both the readline and curses modules in an application.
+
+- Issue #2810: Fix cases where the Windows registry API returns ERROR_MORE_DATA,
+ requiring a re-try in order to get the complete result.
+
+- Issue #8692: Optimize math.factorial: replace the previous naive algorithm
+ with an improved 'binary-split' algorithm that uses fewer multiplications and
+ allows many of the multiplications to be performed using plain C integer
+ arithmetic instead of PyLong arithmetic. Also uses a lookup table for small
+ arguments.
+
+- Issue #8674: Fixed a number of incorrect or undefined-behaviour-inducing
+ overflow checks in the audioop module.
+
+- Issue #8644: The accuracy of td.total_seconds() has been improved (by
+ calculating with integer arithmetic instead of float arithmetic internally):
+ the result is now always correctly rounded, and is equivalent to ``td /
+ timedelta(seconds=1)``.
+
+- Issue #2706: Allow division of a timedelta by another timedelta: timedelta /
+ timedelta, timedelta % timedelta, timedelta // timedelta and divmod(timedelta,
+ timedelta) are all supported.
+
+- Issue #8314: Fix unsigned long long bug in libffi on Sparc v8.
+
+- Issue #8300: When passing a non-integer argument to struct.pack with any
+ integer format code, struct.pack first attempts to convert the non-integer
+ using its __index__ method. If that method is non-existent or raises
+ TypeError it goes on to try the __int__ method, as described below.
+
+- Issue #8142: Update libffi to the 3.0.9 release.
+
+- Issue #6949: Allow the _dbm extension to be built with db 4.8.x.
+
+- Issue #6544: Fix a reference leak in the kqueue implementation's error
+ handling.
+
+- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
+ msvcr100.dll is not a platform assembly anymore.
+
+- Issue #6508: Add posix.{getresuid,getresgid,setresuid,setresgid}.
+
+- Issue #7078: Set struct.__doc__ from _struct.__doc__.
+
+- Issue #3366: Add erf, erfc, expm1, gamma, lgamma functions to math module.
+
+- Issue #6877: It is now possible to link the readline extension to the libedit
+ readline emulation on OSX 10.5 or later.
+
+- Issue #6848: Fix curses module build failure on OS X 10.6.
+
+- Fix a segfault that could be triggered by expat with specially formed input.
+
+- Issue #6561: '\d' in a regex now matches only characters with Unicode category
+ 'Nd' (Number, Decimal Digit). Previously it also matched characters with
+ category 'No'.
+
+- Issue #4509: Array objects are no longer modified after an operation failing
+ due to the resize restriction in-place when the object has exported buffers.
+
+- Issue #2389: Array objects are now pickled in a portable manner.
+
+- Expat: Fix DoS via XML document with malformed UTF-8 sequences
+ (CVE_2009_3560).
+
+- Issue #7242: On Solaris 9 and earlier calling os.fork() from within a thread
+ could raise an incorrect RuntimeError about not holding the import lock. The
+ import lock is now reinitialized after fork.
+
+- Issue #7999: os.setreuid() and os.setregid() would refuse to accept a -1
+ parameter on some platforms such as OS X.
+
+- Build the ossaudio extension on GNU/kFreeBSD.
+
+- Issue #7347: winreg: Add CreateKeyEx and DeleteKeyEx, as well as fix a bug in
+ the return value of QueryReflectionKey.
+
+- Issue #7567: PyCurses_setupterm: Don't call ``setupterm`` twice.
+
+Build
+-----
+
+- Use OpenSSL 1.0.0a on Windows.
+
+- Issue #9280: Make sharedinstall depend on sharedmods.
+
+- Issue #9189: Make a user-specified CFLAGS, CPPFLAGS, or LDFLAGS setting
+ override the configure and makefile defaults, without deleting options the
+ user didn't intend to override. Developers should no longer need to specify
+ OPT or EXTRA_CFLAGS, although those variables are still present for
+ backward-compatibility.
+
+- Issue #8854: Fix finding Visual Studio 2008 on Windows x64.
+
+- Issue #1759169, #8864: Drop _XOPEN_SOURCE on Solaris, define it for
+ multiprocessing only.
+
+- Issue #8625: Turn off optimization in --with-pydebug builds with gcc.
+ (Optimization was unintentionally turned on in gcc --with-pydebug builds as a
+ result of the issue #1628484 fix, combined with autoconf's strange choice of
+ default CFLAGS produced by AC_PROG_CC for gcc.)
+
+- Issue #3646: It is now easily possible to install a Python framework into your
+ home directory on MacOSX, see Mac/README for more information.
+
+- Issue #3928: os.mknod() now available in Solaris, also.
+
+- Issue #3326: Build Python without -fno-strict-aliasing when the gcc does not
+ give false warnings.
+
+- Issue #1628484: The Makefile doesn't ignore the CFLAGS environment variable
+ anymore. It also forwards the LDFLAGS settings to the linker when building a
+ shared library.
+
+- Issue #6716: Quote -x arguments of compileall in MSI installer. Exclude 2to3
+ tests from compileall.
+
+- Issue #3920, #7903: Define _BSD_SOURCE on OpenBSD 4.4 through 4.9.
+
+- Issue #7632: When Py_USING_MEMORY_DEBUGGER is defined, disable the private
+ memory allocation scheme in dtoa.c and use PyMem_Malloc and PyMem_Free
+ instead. Also disable caching of powers of 5.
+
+- Issue #6491: Allow --with-dbmliborder to specify that no dbms will be built.
+
+- Issue #6943: Use pkg-config to find the libffi headers when the
+ --with-system-ffi flag is used.
+
+- Issue #7609: Add a --with-system-expat option that causes the system's expat
+ library to be used for the pyexpat module instead of the one included with
+ Python.
+
+- Issue #7589: Only build the nis module when the correct header files are
+ found.
+
+- Switch to OpenSSL 0.9.8l and sqlite 3.6.21 on Windows.
+
+- Issue #5792: Extend the short float repr support to x86 systems using
+ icc or suncc.
+
+- Issue #6603: Change READ_TIMESTAMP macro in ceval.c so that it compiles
+ correctly under gcc on x86-64. This fixes a reported problem with the
+ --with-tsc build on x86-64.
+
+- Issue #6802: Fix build issues on MacOSX 10.6.
+
+- Issue #6244: Allow detect_tkinter to look for Tcl/Tk 8.6.
+
+- Issue #4601: 'make install' did not set the appropriate permissions on
+ directories.
+
+- Issue #5390: Add uninstall icon independent of whether file extensions are
+ installed.
+
+- Issue #7541: When using ``python-config`` with a framework install the
+ compiler might use the wrong library.
+
+- python-config now supports multiple options on the same command line.
+
+- Issue #8509: Fix quoting in help strings and code snippets in configure.in.
+
+- Issue #8510: Update to autoconf2.65.
+
+Documentation
+-------------
+
+- Issue #9817: Add expat COPYING file; add expat, libffi and expat licenses
+ to Doc/license.rst.
+
+- Issue #9524: Document that two CTRL* signals are meant for use only
+ with os.kill.
+
+- Issue #9255: Document that the 'test' package is meant for internal Python use
+ only.
+
+- A small WSGI server was added as Tools/scripts/serve.py, and is used to
+ implement a local documentation server via 'make serve' in the doc directory.
+
+- Updating `Using Python` documentation to include description of CPython's -J
+ and -X options.
+
+- Document that importing a module that has None in sys.modules triggers an
+ ImportError.
+
+- Issue #6556: Fixed the Distutils configuration files location explanation for
+ Windows.
+
+- Update python manual page (options -B, -O0, -s, environment variables
+ PYTHONDONTWRITEBYTECODE, PYTHONNOUSERSITE).
+
+- Issue #8909: Added the size of the bitmap used in the installer created by
+ distutils' bdist_wininst. Patch by Anatoly Techtonik.
+
+Tests
+-----
+
+- Issue #9251: test_threaded_import didn't fail when run through regrtest if the
+ import lock was disabled.
+
+- Issue #8605: Skip test_gdb if Python is compiled with optimizations.
+
+- Issue #7449: Skip test_socketserver if threading support is disabled.
+
+- Issue #8672: Add a zlib test ensuring that an incomplete stream can be handled
+ by a decompressor object without errors (it returns incomplete uncompressed
+ data).
+
+- Issue #8533: regrtest uses backslashreplace error handler for stdout to avoid
+ UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding).
+
+- Issue #8576: Remove use of find_unused_port() in test_smtplib and
+ test_multiprocessing. Patch by Paul Moore.
+
+- Issue #7449: Fix many tests to support Python compiled without thread
+ support. Patches written by Jerry Seutter.
+
+- Issue #8108: test_ftplib's non-blocking SSL server now has proper handling of
+ SSL shutdowns.
+
+- Issues #8279, #8330, #8437, #8480, #8495: Fix test_gdb failures, patch written
+ by Dave Malcolm.
+
+- Issue #3864: Skip three test_signal tests on freebsd6 because they fail if any
+ thread was previously started, most likely due to a platform bug.
+
+- Issue #8193: Fix test_zlib failure with zlib 1.2.4.
+
+- Issue #8248: Add some tests for the bool type. Patch by Gregory Nofi.
+
+- Issue #8263: Now regrtest.py will report a failure if it receives a
+ KeyboardInterrupt (SIGINT).
+
+- Issue #8180 and #8207: Fix test_pep277 on OS X and add more tests for special
+ Unicode normalization cases.
+
+- Issue #7783: test.support.open_urlresource invalidates the outdated files from
+ the local cache.
+
+- Issue #7849: Now the utility ``check_warnings`` verifies if the warnings are
+ effectively raised.
+
+- The four path modules (genericpath, macpath, ntpath, posixpath) share a common
+ TestCase for some tests: test_genericpath.CommonTest.
+
+- Print platform information when running the whole test suite, or using the
+ --verbose flag.
+
+- Issue #767675: enable test_pep277 on POSIX platforms with Unicode-friendly
+ filesystem encoding.
+
+- Issue #6292: for the moment at least, the test suite runs cleanly if python is
+ run with the -OO flag. Tests requiring docstrings are skipped.
+
+- Issue #7712: test.support gained a new `temp_cwd` context manager which is now
+ also used by regrtest to run all the tests in a temporary directory. The
+ original CWD is saved in `support.SAVEDCWD`. Thanks to Florent Xicluna who
+ helped with the patch.
+
+- Issue #7924: Fix an intermittent 'XXX undetected error' failure in test_capi
+ (only seen so far on platforms where the curses module wasn't built), due to
+ an uncleared exception.
+
+- Issue #7728: test_timeout was changed to use support.bind_port instead of a
+ hard coded port.
+
+- Issue #7376: Instead of running a self-test (which was failing) when called
+ with no arguments, doctest.py now gives a usage message.
+
+- Issue #7396: fix regrtest -s, which was broken by the -j enhancement.
+
+- Issue #7498: test_multiprocessing now uses test.support.find_unused_port
+ instead of a hardcoded port number in test_rapid_restart.
+
+- Issue #7431: Use TESTFN in test_linecache instead of trying to create a file
+ in the Lib/test directory, which might be read-only for the user running the
+ tests.
+
+- Issue #7324: Add a sanity check to regrtest argument parsing to catch the case
+ of an option with no handler.
+
+- Issue #7312: Add a -F flag to run the selected tests in a loop until a test
+ fails. Can be combined with -j.
+
+- Issue #6551: test_zipimport could import and then destroy some modules of the
+ encodings package, which would make other tests fail further down the road
+ because the internally cached encoders and decoders would point to empty
+ global variables.
+
+- Issue #7295: Do not use a hardcoded file name in test_tarfile.
+
+- Issue #7270: Add some dedicated unit tests for multi-thread synchronization
+ primitives such as Lock, RLock, Condition, Event and Semaphore.
+
+- Issue #7248 (part 2): Use a unique temporary directory for importlib source
+ tests instead of tempfile.tempdir. This prevents the tests from sharing state
+ between concurrent executions on the same system.
+
+- Issue #7248: In importlib.test.source.util a try/finally block did not make
+ sure that some referenced objects actually were created in the block before
+ calling methods on the object.
+
+- Issue #7222: Make thread "reaping" more reliable so that reference
+ leak-chasing test runs give sensible results. The previous method of reaping
+ threads could return successfully while some Thread objects were still
+ referenced. This also introduces a new private function:
+ ``_thread._count()``.
+
+- Issue #7151: Fixed regrtest -j so that output to stderr from a test no longer
+ runs the risk of causing the worker thread to fail.
+
+- Issue #7055: test___all__ now greedily detects all modules which have an
+ __all__ attribute, rather than using a hardcoded and incomplete list.
+
+- Issue #7058: Added save/restore for things like sys.argv and cwd to
+ runtest_inner in regrtest, with warnings if the called test modifies them, and
+ a new section in the summary report at the end.
+
+- Issue #7042: Fix test_signal (test_itimer_virtual) failure on OS X 10.6.
+
+- Fixed tests in importlib.test.source.test_abc_loader that were masking the
+ proper exceptions that should be raised for missing or improper code object
+ bytecode.
+
+- Removed importlib's custom test discovery code and switched to
+ unittest.TestLoader.discover().
+
+Tools/Demos
+-----------
+
+- Issue #5464, #8974: Implement plural forms in msgfmt.py.
+
+- iobench (a file I/O benchmark) and ccbench (a concurrency benchmark) were
+ added to the `Tools/` directory. They were previously living in the sandbox.
+
+
+What's New in Python 3.1?
+=========================
+
+*Release date: 27-June-2009*
+
+Core and Builtins
+-----------------
+
+- Issue #6334: Fix bug in range length calculation for ranges with
+ large arguments.
+
+- Issue #6329: Fixed iteration for memoryview objects (it was being blocked
+ because it wasn't recognized as a sequence).
+
+Library
+-------
+
+- Issue #6126: Fixed pdb command-line usage.
+
+- Issue #6314: logging: performs extra checks on the "level" argument.
+
+- Issue #6274: Fixed possible file descriptors leak in subprocess.py
+
+- Accessing io.StringIO.buffer now raises an AttributeError instead of
+ io.UnsupportedOperation.
+
+- Issue #6271: mmap tried to close invalid file handle (-1) when anonymous.
+ (On Unix)
+
+- Issue #1202: zipfile module would cause a struct.error when attempting to
+ store files with a CRC32 > 2**31-1.
+
+Extension Modules
+-----------------
+
+- Issue #5590: Remove unused global variable in pyexpat extension.
+
+
+What's New in Python 3.1 Release Candidate 2?
+=============================================
+
+*Release date: 13-June-2009*
+
+Core and Builtins
+-----------------
+
+- Fixed SystemError triggered by "range([], 1, -1)".
+
+- Issue #5924: On Windows, a large PYTHONPATH environment variable
+ (more than 255 characters) would be completely ignored.
+
+- Issue #4547: When debugging a very large function, it was not always
+ possible to update the lineno attribute of the current frame.
+
+- Issue #5330: C functions called with keyword arguments were not reported by
+ the various profiling modules (profile, cProfile). Patch by Hagen Fürstenau.
+
+Library
+-------
+
+- Issue #6438: Fixed distutils.cygwinccompiler.get_versions : the regular
+ expression string pattern was trying to match against a bytes returned by
+ Popen. Tested under win32 to build the py-postgresql project.
+
+- Issue #6258: Support AMD64 in bdist_msi.
+
+- Issue #6195: fixed doctest to no longer try to read 'source' data from
+ binary files.
+
+- Issue #5262: Fixed bug in next rollover time computation in
+ TimedRotatingFileHandler.
+
+- Issue #6217: The C implementation of io.TextIOWrapper didn't include the
+ errors property. Additionally, the errors and encoding properties of StringIO
+ are always None now.
+
+- Issue #6137: The pickle module now translates module names when loading
+ or dumping pickles with a 2.x-compatible protocol, in order to make data
+ sharing and migration easier. This behaviour can be disabled using the
+ new `fix_imports` optional argument.
+
+- Removed the ipaddr module.
+
+- Issue #3613: base64.{encode,decode}string are now called
+ base64.{encode,decode}bytes which reflects what type they accept and return.
+ The old names are still there as deprecated aliases.
+
+- Issue #5767: Remove sgmlop support from xmlrpc.client.
+
+- Issue #6150: Fix test_unicode on wide-unicode builds.
+
+- Issue #6149: Fix initialization of WeakValueDictionary objects from non-empty
+ parameters.
+
+Windows
+-------
+
+- Issue #6221: Delete test registry key before running the test.
+
+- Issue #6158: Package Sine-1000Hz-300ms.aif in MSI file.
+
+C-API
+-----
+
+- Issue #5735: Python compiled with --with-pydebug should throw an
+ ImportError when trying to import modules compiled without
+ --with-pydebug, and vice-versa.
+
+
+Build
+-----
+
+- Issue #6154: Make sure the intl library is added to LIBS if needed. Also
+ added LIBS to OS X framework builds.
+
+- Issue #5809: Specifying both --enable-framework and --enable-shared is
+ an error. Configure now explicity tells you about this.
+
+
+
+What's New in Python 3.1 release candidate 1?
+=============================================
+
+*Release date: 2009-05-30*
+
+Core and Builtins
+-----------------
+
+- Issue #6097: Escape UTF-8 surrogates resulting from mbstocs conversion
+ of the command line.
+
+- Issue #6012: Add cleanup support to O& argument parsing.
+
+- Issue #6089: Fixed str.format with certain invalid field specifiers
+ that would raise SystemError.
+
+- Issue #5982: staticmethod and classmethod now expose the wrapped
+ function with __func__.
+
+- Added support for multiple context managers in the same with-statement.
+ Deprecated contextlib.nested() which is no longer needed.
+
+- Issue #5829: complex("1e500") no longer raises OverflowError. This
+ makes it consistent with float("1e500") and interpretation of real
+ and imaginary literals.
+
+- Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.
+
+- Issue #5994: the marshal module now has docstrings.
+
+- Issue #5981: Fix three minor inf/nan issues in float.fromhex:
+ (1) inf and nan strings with trailing whitespace were incorrectly
+ rejected; (2) parsing of strings representing infinities and nans
+ was locale aware; and (3) the interpretation of fromhex('-nan')
+ didn't match that of float('-nan').
+
+Library
+-------
+
+- Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
+
+- smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259).
+
+- Issue #6121: pydoc now ignores leading and trailing spaces in the
+ argument to the 'help' function.
+
+- Issue #6118: urllib.parse.quote_plus ignored the encoding and errors
+ arguments for strings with a space in them.
+
+- collections.namedtuple() was not working with the following field
+ names: cls, self, tuple, itemgetter, and property.
+
+- In unittest, using a skipping decorator on a class is now equivalent to
+ skipping every test on the class. The ClassTestSuite class has been removed.
+
+- Issue #6050: Don't fail extracting a directory from a zipfile if
+ the directory already exists.
+
+- Issue #1309352: fcntl now converts its third arguments to a C `long` rather
+ than an int, which makes some operations possible under 64-bit Linux (e.g.
+ DN_MULTISHOT with F_NOTIFY).
+
+- Issue #5761: Add the name of the underlying file to the repr() of various
+ IO objects.
+
+- Issue #5259: smtplib plain auth login no longer gives a traceback. Fix
+ by Musashi Tamura, tests by Marcin Bachry.
+
+- Issue #1983: Fix functions taking or returning a process identifier to use
+ the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
+ a process identifier type wider than the standard C integer type.
+
+- Issue #4066: smtplib.SMTP_SSL._get_socket now correctly returns the socket.
+ Patch by Farhan Ahmad, test by Marcin Bachry.
+
+- Issue #2116: Weak references and weak dictionaries now support copy()ing and
+ deepcopy()ing.
+
+- Issue #1655: Make imaplib IPv6-capable. Patch by Derek Morr.
+
+- Issue #5918: Fix a crash in the parser module.
+
+- Issue #1664: Make nntplib IPv6-capable. Patch by Derek Morr.
+
+- Issue #5006: Better handling of unicode byte-order marks (BOM) in the io
+ library. This means, for example, that opening an UTF-16 text file in
+ append mode doesn't add a BOM at the end of the file if the file isn't
+ empty.
+
+- Issue #4050: inspect.findsource/getsource now raise an IOError if the 'source'
+ file is a binary. Patch by Brodie Rao, tests by Daniel Diniz. This fix
+ corrects a pydoc regression.
+
+- Issue #5955: aifc's close method did not close the file it wrapped,
+ now it does. This also means getfp method now returns the real fp.
+
+Installation
+------------
+
+- Issue #6047: fullinstall has been removed because Python 3's executable will
+ now be known as python3.
+
+- Lib/smtpd.py is no longer installed as a script.
+
+Extension Modules
+-----------------
+
+- Issue #3061: Use wcsftime for time.strftime where available.
+
+- Issue #4873: Fix resource leaks in error cases of pwd and grp.
+
+- Issue #6093: Fix off-by-one error in locale.strxfrm.
+
+- The _functools and _locale modules are now built into the libpython shared
+ library instead of as extension modules.
+
+Build
+-----
+
+- Issue #3585: Add pkg-config support. It creates a python-2.7.pc file
+ and a python3.pc symlink in the $(LIBDIR)/pkgconfig directory. Patch by
+ Clinton Roy.
+
+Tests
+-----
+
+- Issue #5442: Tests for importlib were not properly skipping case-sensitivity
+ tests on darwin even when the OS was installed on a case-sensitive
+ filesystem. Also fixed tests that should not be run when
+ sys.dont_write_bytecode is true.
+
+
+What's New in Python 3.1 beta 1?
+================================
+
+*Release date: 2009-05-06*
+
+Core and Builtins
+-----------------
+
+- Issue #5914: Add new C API function PyOS_string_to_double, and
+ deprecate PyOS_ascii_strtod and PyOS_ascii_atof.
+
+- Issue #3382: float.__format__, complex.__format__, and %-formatting
+ no longer map 'F' to 'f'. Because of issue #5859 (below), this only
+ affects nan -> NAN and inf -> INF.
+
+- Issue #5799: ntpath (ie, os.path on Windows) fully supports UNC pathnames
+ in all operations, including splitdrive, split, etc. splitunc() now issues
+ a PendingDeprecation warning.
+
+- Issue #5920: For float.__format__, change the behavior with the
+ empty presentation type (that is, not one of 'e', 'f', 'g', or 'n')
+ to be like 'g' but with at least one decimal point and with a
+ default precision of 12. Previously, the behavior the same but with
+ a default precision of 6. This more closely matches str(), and
+ reduces surprises when adding alignment flags to the empty
+ presentation type. This also affects the new complex.__format__ in
+ the same way.
+
+- Implement PEP 383, Non-decodable Bytes in System Character Interfaces.
+
+- Issue #5890: in subclasses of 'property' the __doc__ attribute was
+ shadowed by classtype's, even if it was None. property now
+ inserts the __doc__ into the subclass instance __dict__.
+
+- Issue #4426: The UTF-7 decoder was too strict and didn't accept some legal
+ sequences. Patch by Nick Barnes and Victor Stinner.
+
+- Issue #3672: Reject surrogates in utf-8 codec; add surrogatepass error handler.
+
+- Issue #5883: In the io module, the BufferedIOBase and TextIOBase ABCs have
+ received a new method, detach(). detach() disconnects the underlying stream
+ from the buffer or text IO and returns it.
+
+- Issue #5859: Remove switch from '%f' to '%g'-style formatting for
+ floats with absolute value over 1e50. Also remove length
+ restrictions for float formatting: '%.67f' % 12.34 and '%.120e' %
+ 12.34 no longer raise an exception.
+
+- Issue #1588: Add complex.__format__. For example,
+ format(complex(1, 2./3), '.5') now produces a sensible result.
+
+- Issue #5864: Fix empty format code formatting for floats so that it
+ never gives more than the requested number of significant digits.
+
+- Issue #5793: Rationalize isdigit / isalpha / tolower, etc. Includes
+ new Py_ISDIGIT / Py_ISALPHA / Py_TOLOWER, etc. in pctypes.h.
+
+- Issue #5835: Deprecate PyOS_ascii_formatd.
+
+- Issue #4971: Fix titlecase for characters that are their own
+ titlecase, but not their own uppercase.
+
+- Issue #5283: Setting __class__ in __del__ caused a segfault.
+
+- Issue #5816: complex(repr(z)) now recovers z exactly, even when
+ z involves nans, infs or negative zeros.
+
+- Issue #3166: Make int -> float conversions correctly rounded.
+
+- Issue #1869 (and many duplicates): make round(x, n) correctly
+ rounded for a float x, by using the decimal <-> binary conversions
+ from Python/dtoa.c. As a consequence, (e.g.) round(x, 2) now
+ consistently agrees with format(x, '.2f').
+
+- Issue #5787: object.__getattribute__(some_type, "__bases__") segfaulted on
+ some builtin types.
+
+- Issue #5772: format(1e100, '<') produces '1e+100', not '1.0e+100'.
+
+- Issue #5515: str.format() type 'n' combined with commas and leading
+ zeros no longer gives odd results with ints and floats.
+
+- Implement PEP 378, Format Specifier for Thousands Separator, for
+ floats.
+
+- The str function switches to exponential notation at
+ 1e11, not 1e12. This avoids printing 13 significant digits in
+ situations where only 12 of them are correct. Example problem
+ value: str(1e11 + 0.5). (This minor issue has existed in 2.x for a
+ long time.)
+
+- Issue #1580: On most platforms, use a 'short' float repr: for a
+ finite float x, repr(x) now outputs a string based on the shortest
+ sequence of decimal digits that rounds to x. Previous behaviour was
+ to output 17 significant digits and then strip trailing zeros.
+ Another minor difference is that the new repr switches to
+ exponential notation at 1e16 instead of the previous 1e17; this
+ avoids misleading output in some cases.
+
+ There's a new sys attribute sys.float_repr_style, which takes
+ the value 'short' to indicate that we're using short float repr,
+ and 'legacy' if the short float repr isn't available for one
+ reason or another.
+
+ The float repr change involves incorporating David Gay's 'perfect
+ rounding' code into the Python core (it's in Python/dtoa.c). As a
+ secondary consequence, all string-to-float and float-to-string
+ conversions (including all float formatting operations) will be
+ correctly rounded on these platforms.
+
+ See issue #1580 discussions for details of platforms for which
+ this change does not apply.
+
+- Issue #5759: float() didn't call __float__ on str subclasses.
+
+- The string.maketrans() function is deprecated; there is a new static method
+ maketrans() on the bytes and bytearray classes. This removes confusion about
+ the types string.maketrans() is supposed to work with, and mirrors the
+ methods available on the str class.
+
+- Issue #2170: refactored xml.dom.minidom.normalize, increasing both
+ its clarity and its speed.
+
+- Issue #1113244: Py_XINCREF, Py_DECREF, Py_XDECREF: Add ``do { ... } while (0)``
+ to avoid compiler warnings.
+
+- Issue #3739: The unicode-internal encoder now reports the number of characters
+ consumed like any other encoder (instead of the number of bytes).
+
+Installation
+------------
+
+- Issue #5756: Install idle and pydoc with a 3 suffix.
+
+Library
+-------
+
+- Issue #8203: Fix IDLE Credits dialog: view_file() uses its encoding argument.
+
+- Issue #5311: bdist_msi can now build packages that do not depend on a
+ specific Python version.
+
+- Issue #5150: IDLE's format menu now has an option to strip trailing
+ whitespace.
+
+- Issue #5940: distutils.command.build_clib.check_library_list was not doing
+ the right type checkings anymore.
+
+- Issue #4875: On win32, ctypes.util.find_library does no longer
+ return directories.
+
+- Issue #5142: Add the ability to skip modules while stepping to pdb.
+
+- Issue #1309567: Fix linecache behavior of stripping subdirectories when
+ looking for files given by a relative filename.
+
+- Issue #5923: Update the ``turtle`` module to version 1.1, add two new
+ turtle demos in Demo/turtle.
+
+- Issue #5692: In ``zipfile.Zipfile``, fix wrong path calculation when
+ extracting a file to the root directory.
+
+- Issue #5913: os.listdir() should fail for empty path on windows.
+
+- Issue #5084: unpickling now interns the attribute names of pickled objects,
+ saving memory and avoiding growth in size of subsequent pickles. Proposal
+ and original patch by Jake McGuire.
+
+- The json module now works exclusively with str and not bytes.
+
+- Issue #3959: The ipaddr module has been added to the standard library.
+ Contributed by Google.
+
+- Issue #3002: ``shutil.copyfile()`` and ``shutil.copytree()`` now raise an
+ error when a named pipe is encountered, rather than blocking infinitely.
+
+- Issue #5857: tokenize.tokenize() now returns named tuples.
+
+- Issue #4305: ctypes should now build again on mipsel-linux-gnu
+
+- Issue #1734234: Massively speedup ``unicodedata.normalize()`` when the
+ string is already in normalized form, by performing a quick check beforehand.
+ Original patch by Rauli Ruohonen.
+
+- Issue #5853: calling a function of the mimetypes module from several threads
+ at once could hit the recursion limit if the mimetypes database hadn't been
+ initialized before.
+
+- Issue #5854: Updated __all__ to include some missing names and remove some
+ names which should not be exported.
+
+- Issue #3102: All global symbols that the _ctypes extension defines
+ are now prefixed with 'Py' or '_ctypes'.
+
+- Issue #5041: ctypes does now allow pickling wide character.
+
+- Issue #5812: For the two-argument form of the Fraction constructor,
+ Fraction(m, n), m and n are permitted to be arbitrary Rational
+ instances.
+
+- Issue #5812: Fraction('1e6') is valid: more generally, any string
+ that's valid for float() is now valid for Fraction(), with the
+ exception of strings representing NaNs and infinities.
+
+- Issue #5734: BufferedRWPair was poorly tested and had several glaring
+ bugs. Patch by Brian Quinlan.
+
+- Issue #1161031: fix readwrite select flag handling: POLLPRI now
+ results in a handle_expt_event call, not handle_read_event, and POLLERR
+ and POLLNVAL now call handle_close, not handle_expt_event. Also,
+ dispatcher now has an 'ignore_log_types' attribute for suppressing
+ log messages, which is set to 'warning' by default.
+
+- Issue #2703: SimpleXMLRPCDispatcher.__init__: Provide default values for
+ new arguments introduced in 2.5.
+
+- Issue #5828 (Invalid behavior of unicode.lower): Fixed bogus logic in
+ makeunicodedata.py and regenerated the Unicode database (This fixes
+ u'\u1d79'.lower() == '\x00').
+
+Extension Modules
+-----------------
+
+- Issue #5881: Remove old undocumented compatibility interfaces in hashlib and
+ pwd.
+
+- Issue #5463: In struct module, remove deprecated float coercion
+ for integer type codes: struct.pack('L', 0.3) should now raise
+ an error. The _PY_STRUCT_FLOAT_COERCE constant has been removed.
+ The version number has been bumped to 0.3.
+
+- Issue #5359: Readd the Berkeley DB detection code to allow _dbm be built
+ using Berkeley DB.
+
+Tests
+-----
+
+- Issue #5354: New test support function import_fresh_module() makes
+ it easy to import both normal and optimised versions of modules.
+ test_heapq and test_warnings have been adjusted to use it, tests for
+ other modules with both C and Python implementations in the stdlib
+ can be adjusted to use it over time.
+
+- Issue #5837: Certain sequences of calls to set() and unset() for
+ support.EnvironmentVarGuard objects restored the environment variables
+ incorrectly on __exit__.
+
+C-API
+-----
+
+- Issue #5630: A replacement PyCObject API, PyCapsule, has been added.
+
+
+What's New in Python 3.1 alpha 2?
+=================================
+
+*Release date: 2009-4-4*
+
+Core and Builtins
+-----------------
+
+- Implement PEP 378, Format Specifier for Thousands Separator, for
+ integers.
+
+- Issue #5666: Py_BuildValue's 'c' code should create byte strings.
+
+- Issue #5499: The 'c' code for argument parsing functions now only accepts a
+ byte, and the 'C' code only accepts a unicode character.
+
+- Fix a problem in PyErr_NormalizeException that leads to "undetected errors"
+ when hitting the recursion limit under certain circumstances.
+
+- Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.
+
+- Fix a segfault when running test_exceptions with coverage, caused by
+ insufficient checks in accessors of Exception.__context__.
+
+- Issue #5604: non-ASCII characters in module name passed to
+ imp.find_module() were converted to UTF-8 while the path is
+ converted to the default filesystem encoding, causing nonsense.
+
+- Issue #5126: str.isprintable() returned False for space characters.
+
+- Issue #4865: On MacOSX /Library/Python/2.7/site-packages is added to
+ the end sys.path, for compatibility with the system install of Python.
+
+- Issue #4688: Add a heuristic so that tuples and dicts containing only
+ untrackable objects are not tracked by the garbage collector. This can
+ reduce the size of collections and therefore the garbage collection overhead
+ on long-running programs, depending on their particular use of datatypes.
+
+- Issue #5512: Rewrite PyLong long division algorithm (x_divrem) to
+ improve its performance. Long divisions and remainder operations
+ are now between 50% and 150% faster.
+
+- Issue #4258: Make it possible to use base 2**30 instead of base
+ 2**15 for the internal representation of integers, for performance
+ reasons. Base 2**30 is enabled by default on 64-bit machines. Add
+ --enable-big-digits option to configure, which overrides the
+ default. Add sys.int_info structseq to provide information about
+ the internal format.
+
+- Issue #4474: PyUnicode_FromWideChar now converts characters outside
+ the BMP to surrogate pairs, on systems with sizeof(wchar_t) == 4
+ and sizeof(Py_UNICODE) == 2.
+
+- Issue #5237: Allow auto-numbered fields in str.format(). For
+ example: '{} {}'.format(1, 2) == '1 2'.
+
+- Issue #5392: when a very low recursion limit was set, the interpreter would
+ abort with a fatal error after the recursion limit was hit twice.
+
+- Issue #3845: In PyRun_SimpleFileExFlags avoid invalid memory access with
+ short file names.
+
+Library
+-------
+
+- Issue #2625: added missing items() call to the for loop in
+ mailbox.MH.get_message().
+
+- Issue #5640: Fix _multibytecodec so that CJK codecs don't repeat
+ error substitutions from non-strict codec error callbacks in
+ incrementalencoder and StreamWriter.
+
+- Issue #5656: Fix the coverage reporting when running the test suite with
+ the -T argument.
+
+- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
+
+- Issue #5624: Fix the _winreg module name still used in several modules.
+
+- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.
+
+- Issue #5619: Multiprocessing children disobey the debug flag and causes
+ popups on windows buildbots. Patch applied to work around this issue.
+
+- Issue #5400: Added patch for multiprocessing on netbsd compilation/support
+
+- Issue #5387: Fixed mmap.move crash by integer overflow.
+
+- Issue #5261: Patch multiprocessing's semaphore.c to support context
+ manager use: "with multiprocessing.Lock()" works now.
+
+- Issue #5236: Change time.strptime() to only take strings. Didn't work with
+ bytes already but the failure was non-obvious.
+
+- Issue #5177: Multiprocessing's SocketListener class now uses
+ socket.SO_REUSEADDR on all connections so that the user no longer needs
+ to wait 120 seconds for the socket to expire.
+
+- Issue #5595: Fix UnboundedLocalError in ntpath.ismount().
+
+- Issue #1174606: Calling read() without arguments of an unbounded file
+ (typically /dev/zero under Unix) could crash the interpreter.
+
+- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
+ io.BufferedRandom have been deprecated for removal in Python 3.2.
+
+- Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
+ forever on incomplete input. That caused tarfile.open() to hang when used
+ with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
+ partial bzip2 compressed data.
+
+- Issue #2110: Add support for thousands separator and 'n' type
+ specifier to Decimal.__format__
+
+- Fix Decimal.__format__ bug that swapped the meanings of the '<' and
+ '>' alignment characters.
+
+- The error detection code in FileIO.close() could fail to reflect the `errno`
+ value, and report it as -1 instead.
+
+- Issue #5016: FileIO.seekable() could return False if the file position
+ was negative when truncated to a C int. Patch by Victor Stinner.
+
+Extension Modules
+-----------------
+
+- Issue #5391: mmap now deals exclusively with bytes.
+
+- Issue #5463: In struct module, remove deprecated overflow wrapping
+ when packing an integer: struct.pack('=L', -1) now raises
+ struct.error instead of returning b'\xff\xff\xff\xff'. The
+ _PY_STRUCT_RANGE_CHECKING and _PY_STRUCT_OVERFLOW_MASKING constants
+ have been removed from the struct module.
+
+
+What's New in Python 3.1 alpha 1
+================================
+
+*Release date: 2009-03-07*
+
+Core and Builtins
+-----------------
+
+- The io module has been reimplemented in C for speed.
+
+- Give dict views an informative __repr__.
+
+- Issue #5247: Improve error message when unknown format codes are
+ used when using str.format() with str, int, and float arguments.
+
+- Issue #5249: time.strftime returned malformed string when format string
+ contained non ascii character on windows.
+
+- Issue #4626: compile(), exec(), and eval() ignore the coding cookie if the
+ source has already been decoded into str.
+
+- Issue #5186: Reduce hash collisions for objects with no __hash__ method by
+ rotating the object pointer by 4 bits to the right.
+
+- Issue #4575: Fix Py_IS_INFINITY macro to work correctly on x87 FPUs:
+ it now forces its argument to double before testing for infinity.
+
+- Issue #5137: Make len() correctly raise a TypeError when a __len__ method
+ returns a non-number type.
+
+- Issue #5182: Removed memoryview.__str__.
+
+- Issue #1717: Removed builtin cmp() function, dropped tp_compare
+ slot, the C API functions PyObject_Compare and PyUnicode_Compare and
+ the type definition cmpfunc. The tp_compare slot has been renamed
+ to tp_reserved, and is reserved for future usage.
+
+- Issue #1242657: the __len__() and __length_hint__() calls in several tools
+ were suppressing all exceptions. These include list() and bytearray().
+
+- Issue #4707: round(x, n) now returns an integer if x is an integer.
+ Previously it returned a float.
+
+- Issue #4753: By enabling a configure option named '--with-computed-gotos'
+ on compilers that support it (notably: gcc, SunPro, icc), the bytecode
+ evaluation loop is compiled with a new dispatch mechanism which gives
+ speedups of up to 20%, depending on the system, on various benchmarks.
+
+- Issue #4874: Most builtin decoders now reject unicode input.
+
+- Issue #4842: Don't allow trailing 'L' when constructing an integer
+ from a string.
+
+- Issue #4991: os.fdopen now raises an OSError for invalid file descriptors.
+
+- Issue #4838: When a module is deallocated, free the memory backing the
+ optional module state data.
+
+- Issue #4910: Rename nb_long slot to nb_reserved, and change its
+ type to ``(void *)``.
+
+- Issue #4935: The overflow checking code in the expandtabs() method common
+ to str, bytes and bytearray could be optimized away by the compiler, letting
+ the interpreter segfault instead of raising an error.
+
+- Issue #3720: Fix a crash when an iterator modifies its class and removes its
+ __next__ method.
+
+- Issue #4910: Builtin int() function and PyNumber_Long/PyNumber_Int API
+ function no longer attempt to call the __long__ slot to convert an object
+ to an integer. Only the __int__ and __trunc__ slots are examined.
+
+- Issue #4893: Use NT threading on CE.
+
+- Issue #4915: Port sysmodule to Windows CE.
+
+- Issue #4868: utf-8, utf-16 and latin1 decoding are now 2x to 4x faster. The
+ common cases are optimized thanks to a dedicated fast path and a moderate
+ amount of loop unrolling.
+
+- Issue #4074: Change the criteria for doing a full garbage collection (i.e.
+ collecting the oldest generation) so that allocating lots of objects without
+ destroying them does not show quadratic performance. Based on a proposal by
+ Martin von Löwis at
+ http://mail.python.org/pipermail/python-dev/2008-June/080579.html.
+
+- Issue #4604: Some objects of the I/O library could still be used after
+ having been closed (for instance, a read() call could return some
+ previously buffered data). Patch by Dmitry Vasiliev.
+
+- Issue #4705: Fix the -u ("unbuffered binary stdout and stderr") command-line
+ flag to work properly. Furthermore, when specifying -u, the text stdout
+ and stderr streams have line-by-line buffering enabled (the default being
+ to buffer arbitrary chunks of data).
+
+- The internal table, _PyLong_DigitValue, is now an array of unsigned chars
+ instead of ints (reducing its size from 4 to 8 times thereby reducing
+ Python's overall memory).
+
+- Issue #1180193: When importing a module from a .pyc (or .pyo) file with
+ an existing .py counterpart, override the co_filename attributes of all
+ code objects if the original filename is obsolete (which can happen if the
+ file has been renamed, moved, or if it is accessed through different paths).
+ Patch by Ziga Seilnacht and Jean-Paul Calderone.
+
+- Issue #4580: Fix slicing of memoryviews when the item size is greater than
+ one byte. Also fixes the meaning of len() so that it returns the number of
+ items, rather than the size in bytes.
+
+- Issue #4075: Use OutputDebugStringW in Py_FatalError.
+
+- Issue #4747: When the terminal does not use utf-8, executing a script with
+ non-ascii characters in its name could fail with a "SyntaxError: None" error.
+
+- Issue #4797: IOError.filename was not set when ``_fileio.FileIO`` failed
+ to open file with a bytes filename on Windows.
+
+- Issue #3680: Reference cycles created through a dict, set or deque iterator
+ did not get collected.
+
+- Issue #4701: PyObject_Hash now implicitly calls PyType_Ready on types
+ where the tp_hash and tp_dict slots are both NULL.
+
+- Issue #4759: None is now allowed as the first argument of
+ bytearray.translate(). It was always allowed for bytes.translate().
+
+- Added test case to ensure attempts to read from a file opened for writing
+ fail.
+
+- Issue #3106: Speedup some comparisons (str/str and int/int).
+
+- Issue #2183: Simplify and optimize bytecode for list, dict and set
+ comprehensions. Original patch for list comprehensions by Neal Norwitz.
+
+- Issue #2467: gc.DEBUG_STATS reported invalid elapsed times. Also, always
+ print elapsed times, not only when some objects are uncollectable /
+ unreachable. Original patch by Neil Schemenauer.
+
+- Issue #3439: Add a bit_length method to int.
+
+- Issue #2173: When getting device encoding, check that return value of
+ nl_langinfo is not the empty string. This was causing silent build
+ failures on OS X.
+
+- Issue #4597: Fixed several opcodes that weren't always propagating
+ exceptions.
+
+- Issue #4589: Fixed exception handling when the __exit__ function of a
+ context manager returns a value that cannot be converted to a bool.
+
+- Issue #4445: Replace "sizeof(PyBytesObject)" with
+ "offsetof(PyBytesObject, ob_sval) + 1" when allocating memory for
+ bytes instances. On a typical machine this saves 3 bytes of memory
+ (on average) per allocation of a bytes instance.
+
+- Issue #4533: File read operation was dreadfully slow due to a slowly
+ growing read buffer. Fixed by using the same growth rate algorithm as
+ Python 2.x.
+
+- Issue #4509: Various issues surrounding resize of bytearray objects to
+ which there are buffer exports (e.g. memoryview instances).
+
+- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()``
+ method on file objects with closefd=False. The file descriptor is still
+ kept open but the file object behaves like a closed file. The ``FileIO``
+ object also got a new readonly attribute ``closefd``.
+
+- Issue #4569: Interpreter crash when mutating a memoryview with an item size
+ larger than 1.
+
+- Issue #4748: Lambda generators no longer return a value.
+
+- The re.sub(), re.subn() and re.split() functions now accept a flags parameter.
+
+- Issue #5108: Handle %s like %S, %R and %A in PyUnicode_FromFormatV(): Call
+ PyUnicode_DecodeUTF8() once, remember the result and output it in a second
+ step. This avoids problems with counting UTF-8 bytes that ignores the effect
+ of using the replace error handler in PyUnicode_DecodeUTF8().
+
+Library
+-------
+
+- Issue #7071: byte-compilation in Distutils is now done with respect to
+ sys.dont_write_bytecode.
+
+- Issue #7066: archive_util.make_archive now restores the cwd if an error is
+ raised. Initial patch by Ezio Melotti.
+
+- Issue #6516: Added owner/group support when creating tar archives in
+ Distutils.
+
+- Issue #6954: Fixed crash when using DISTUTILS_DEBUG flag in Distutils.
+
+- Issue #6163: Fixed HP-UX runtime library dir options in
+ distutils.unixcompiler. Initial patch by Sridhar Ratnakumar and
+ Michael Haubenwallner.
+
+- Issue #6693: New functions in site.py to get user/global site packages paths.
+
+- Issue #6511: ZipFile now raises BadZipfile (instead of an IOError) when
+ opening an empty or very small file.
+
+- Issue #6545: Removed assert statements in distutils.Extension, so the
+ behavior is similar when used with -O.
+
+- unittest has been split up into a package. All old names should still work.
+
+- Issue #6466: now distutils.cygwinccompiler and distutils.emxccompiler
+ uses the same refactored function to get gcc/ld/dllwrap versions numbers.
+ It's `distutils.util.get_compiler_versions`. Added deprecation warnings
+ for the obsolete get_versions() functions.
+
+- Issue #6433: fixed issues with multiprocessing.pool.map hanging on empty list
+
+- Issue #6314: logging: Extra checks on the "level" argument in more places.
+
+- Issue #2622: Fixed an ImportError when importing email.message from a
+ standalone application built with py2exe or py2app.
+
+- Issue #6455: Fixed test_build_ext under win32.
+
+- Issue #6377: Enabled the compiler option, and deprecate its usage as an
+ attribute.
+
+- Issue #6413: Fixed the log level in distutils.dist for announce.
+
+- Issue #6403: Fixed package path usage in build_ext.
+
+- Issues #5155, 5313, 5331: multiprocessing.Process._bootstrap was
+ unconditionally calling "os.close(sys.stdin.fileno())" resulting in file
+ descriptor errors
+
+- Issue #6365: Distutils build_ext inplace mode was copying the compiled
+ extension in a subdirectory if the extension name had dots.
+
+- Issue #6164: Added an AIX specific linker argument in Distutils
+ unixcompiler. Original patch by Sridhar Ratnakumar.
+
+- Issue #6286: Now Distutils upload command is based on urllib2 instead of
+ httplib, allowing the usage of http_proxy.
+
+- Issue #6287: Added the license field in Distutils documentation.
+
+- Issue #6263: Fixed syntax error in distutils.cygwincompiler.
+
+- Issue #5201: distutils.sysconfig.parse_makefile() now understands `$$`
+ in Makefiles. This prevents compile errors when using syntax like:
+ `LDFLAGS='-rpath=\$$LIB:/some/other/path'`. Patch by Floris Bruynooghe.
+
+- Issue #6131: test_modulefinder leaked when run after test_distutils.
+ Patch by Hirokazu Yamamoto.
+
+- Issue #6048: Now Distutils uses the tarfile module in archive_util.
+
+- Issue #6062: In distutils, fixed the package option of build_ext. Feedback
+ and tests on pywin32 by Tim Golden.
+
+- Issue #6053: Fixed distutils tests on win32. patch by Hirokazu Yamamoto.
+
+- Issue #6046: Fixed the library extension when distutils build_ext is used
+ inplace. Initial patch by Roumen Petrov.
+
+- Issue #6041: Now distutils `sdist` and `register` commands use `check` as a
+ subcommand.
+
+- Issue #6022: a test file was created in the current working directory by
+ test_get_outputs in Distutils.
+
+- Issue #5977: distutils build_ext.get_outputs was not taking into account the
+ inplace option. Initial patch by kxroberto.
+
+- Issue #5984: distutils.command.build_ext.check_extensions_list checks were broken
+ for old-style extensions.
+
+- Issue #5976: Fixed Distutils test_check_environ.
+
+- Issue #5941: Distutils build_clib command was not working anymore because
+ of an incomplete costumization of the archiver command. Added ARFLAGS in the
+ Makefile besides AR and make Distutils use it. Original patch by David
+ Cournapeau.
+
+- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec.
+
+- Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive
+ anymore.
+
+- Issue #5810: Fixed Distutils test_build_scripts so it uses
+ sysconfig.get_config_vars.
+
+- Issue #4951: Fixed failure in test_httpservers.
+
+- Issue #5795: Fixed test_distutils failure on Debian ppc.
+
+- Issue #5607: fixed Distutils test_get_platform for Mac OS X fat binaries.
+
+- Issue #5741: don't disallow "%%" (which is an escape for "%") when setting
+ a value in SafeConfigParser.
+
+- Issue #5732: added a new command in Distutils: check.
+
+- Issue #5731: Distutils bdist_wininst no longer worked on non-Windows
+ platforms. Initial patch by Paul Moore.
+
+- Issue #5095: Added bdist_msi to the list of bdist supported formats.
+ Initial fix by Steven Bethard.
+
+- Issue #1491431: Fixed distutils.filelist.glob_to_re for edge cases.
+ Initial fix by Wayne Davison.
+
+- Issue #5694: removed spurious test output in Distutils (test_clean).
+
+- Issue #1326077: fix the formatting of SyntaxErrors by the traceback module.
+
+- Issue #1665206 (partially): Move imports in cgitb to the top of the module
+ instead of performing them in functions. Helps prevent import deadlocking in
+ threads.
+
+- Issue #2522: locale.format now checks its first argument to ensure it has
+ been passed only one pattern, avoiding mysterious errors where it appeared
+ that it was failing to do localization.
+
+- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
+ Brandl.
+
+- Issue #1222: locale.format() bug when the thousands separator is a space
+ character.
+
+- Issue #5472: Fixed distutils.test_util tear down. Original patch by
+ Tim Golden.
+
+- collections.deque() objects now have a read-only attribute called maxlen.
+
+- Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after
+ it is has been populated and properly configured in order to prevent
+ window flashing.
+
+- Issue #4792: Prevent a segfault in _tkinter by using the
+ guaranteed to be safe interp argument given to the PythonCmd in place of
+ the Tcl interpreter taken from a PythonCmd_ClientData.
+
+- Issue #5193: Guarantee that tkinter.Text.search returns a string.
+
+- Issue #5394: removed > 2.3 syntax from distutils.msvc9compiler.
+ Original patch by Akira Kitada.
+
+- Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
+
+- Issue #5385: Fixed mmap crash after resize failure on windows.
+
+- Issue #5179: Fixed subprocess handle leak on failure on windows.
+
+- PEP 372: Added collections.OrderedDict().
+
+- The _asdict() for method for namedtuples now returns an OrderedDict().
+
+- configparser now defaults to using an ordered dictionary.
+
+- Issue #5401: Fixed a performance problem in mimetypes when ``from mimetypes
+ import guess_extension`` was used.
+
+- Issue #1733986: Fixed mmap crash in accessing elements of second map object
+ with same tagname but larger size than first map. (Windows)
+
+- Issue #5386: mmap.write_byte didn't check map size, so it could cause buffer
+ overrun.
+
+- Issue #1533164: Installed but not listed ``*.pyo`` was breaking Distutils
+ bdist_rpm command.
+
+- Issue #5378: added --quiet option to Distutils bdist_rpm command.
+
+- Issue #5052: make Distutils compatible with 2.3 again.
+
+- Issue #5316: Fixed buildbot failures introduced by multiple inheritance
+ in Distutils tests.
+
+- Issue #5287: Add exception handling around findCaller() call to help out
+ IronPython.
+
+- Issue #5282: Fixed mmap resize on 32bit windows and unix. When offset > 0,
+ The file was resized to wrong size.
+
+- Issue #5292: Fixed mmap crash on its boundary access m[len(m)].
+
+- Issue #2279: distutils.sdist.add_defaults now add files
+ from the package_data and the data_files metadata.
+
+- Issue #5257: refactored all tests in distutils, so they use
+ support.TempdirManager, to avoid writing in the tests directory.
+
+- Issue #4524: distutils build_script command failed with --with-suffix=3.
+ Initial patch by Amaury Forgeot d'Arc.
+
+- Issue #2461: added tests for distutils.util
+
+- Issue #4998: The memory saving effect of __slots__ had been lost on Fractions
+ which inherited from numbers.py which did not have __slots__ defined. The
+ numbers hierarchy now has its own __slots__ declarations.
+
+- Issue #4631: Fix urlopen() result when an HTTP response uses chunked
+ encoding.
+
+- Issue #5203: Fixed ctypes segfaults when passing a unicode string to a
+ function without argtypes (only occurs if HAVE_USABLE_WCHAR_T is false).
+
+- Issue #3386: distutils.sysconfig.get_python_lib prefix argument was ignored
+ under NT and OS2. Patch by Philip Jenvey.
+
+- Issue #5128: Make compileall properly inspect bytecode to determine if needs
+ to be recreated. This avoids a timing hole thanks to the old reliance on the
+ ctime of the files involved.
+
+- Issue #5122: Synchronize tk load failure check to prevent a potential
+ deadlock.
+
+- Issue #1818: collections.namedtuple() now supports a keyword argument
+ 'rename' which lets invalid fieldnames be automatically converted to
+ positional names in the form, _1, _2, ...
+
+- Issue #4890: Handle empty text search pattern in Tkinter.Text.search.
+
+- Issue #4512 (part 2): Promote ``ZipImporter._get_filename()`` to be a
+ public documented method ``ZipImporter.get_filename()``.
+
+- Issue #4195: The ``runpy`` module (and the ``-m`` switch) now support
+ the execution of packages by looking for and executing a ``__main__``
+ submodule when a package name is supplied. Initial patch by Andi
+ Vajda.
+
+- Issue #1731706: Call Tcl_ConditionFinalize for Tcl_Conditions that will
+ not be used again (this requires Tcl/Tk 8.3.1), also fix a memory leak in
+ Tkapp_Call when calling from a thread different than the one that created
+ the Tcl interpreter. Patch by Robert Hancock.
+
+- Issue #4285: Change sys.version_info to be a named tuple. Patch by
+ Ross Light.
+
+- Issue #1520877: Now distutils.sysconfig reads $AR from the
+ environment/Makefile. Patch by Douglas Greiman.
+
+- Issue #1276768: The verbose option was not used in the code of
+ distutils.file_util and distutils.dir_util.
+
+- Issue #5132: Fixed trouble building extensions under Solaris with
+ --enabled-shared activated. Initial patch by Dave Peterson.
+
+- Issue #1581476: Always use the Tcl global namespace when calling into Tcl.
+
+- The shelve module now defaults to pickle protocol 3.
+
+- Fix a bug in the trace module where a bytes object from co_lnotab had its
+ items being passed through ord().
+
+- Issue #2047: shutil.move() could believe that its destination path was
+ inside its source path if it began with the same letters (e.g. "src" vs.
+ "src.new").
+
+- Added the ttk module. See issue #2983: Ttk support for Tkinter.
+
+- Removed isSequenceType(), isMappingType, and isNumberType() from the
+ operator module; use the abstract base classes instead. Also removed
+ the repeat() function; use mul() instead.
+
+- Issue #5021: doctest.testfile() did not create __name__ and
+ collections.namedtuple() relied on __name__ being defined.
+
+- Backport importlib from Python 3.1. Only the import_module() function has
+ been backported to help facilitate transitions from 2.7 to 3.1.
+
+- Issue #1885: distutils. When running sdist with --formats=tar,gztar
+ the tar file was overriden by the gztar one.
+
+- Issue #4863: distutils.mwerkscompiler has been removed.
+
+- Added a new itertools functions: combinations_with_replacement()
+ and compress().
+
+- Issue #5032: added a step argument to itertools.count() and
+ allowed non-integer arguments.
+
+- Fix and properly document the multiprocessing module's logging
+ support, expose the internal levels and provide proper usage
+ examples.
+
+- Issue #1672332: fix unpickling of subnormal floats, which was
+ producing a ValueError on some platforms.
+
+- Issue #3881: Help Tcl to load even when started through the
+ unreadable local symlink to "Program Files" on Vista.
+
+- Issue #4710: Extract directories properly in the zipfile module;
+ allow adding directories to a zipfile.
+
+- Issue #3807: _multiprocessing build fails when configure is passed
+ --without-threads argument. When this occurs, _multiprocessing will
+ be disabled, and not compiled.
+
+- Issue #5008: When a file is opened in append mode with the new IO library,
+ do an explicit seek to the end of file (so that e.g. tell() returns the
+ file size rather than 0). This is consistent with the behaviour of the
+ traditional 2.x file object.
+
+- Issue #5013: Fixed a bug in FileHandler which occurred when the delay
+ parameter was set.
+
+- Issue #4842: Always append a trailing 'L' when pickling longs using
+ pickle protocol 0. When reading, the 'L' is optional.
+
+- Add the importlib package.
+
+- Issue #4301: Patch the logging module to add processName support, remove
+ _check_logger_class from multiprocessing.
+
+- Issue #3325: Remove python2.x try: except: imports for old cPickle from
+ multiprocessing.
+
+- Issue #4959: inspect.formatargspec now works for keyword only arguments
+ without defaults.
+
+- Issue #3321: ``_multiprocessing.Connection()`` doesn't check handle; added checks
+ for Unix machines for negative handles and large int handles. Without this check
+ it is possible to segfault the interpreter.
+
+- Issue #4449: AssertionError in mp_benchmarks.py, caused by an underlying issue
+ in sharedctypes.py.
+
+- Issue #1225107: inspect.isclass() returned True for instances with a custom
+ __getattr__.
+
+- Issue #3826 and #4791: The socket module now closes the underlying socket
+ appropriately when it is being used via socket.makefile() objects
+ rather than delaying the close by waiting for garbage collection to do it.
+
+- Issue #1696199: Add collections.Counter() for rapid and convenient
+ counting.
+
+- Issue #3860: GzipFile and BZ2File now support the context manager protocol.
+
+- Issue #4867: Fixed a crash in ctypes when passing a string to a
+ function without defining argtypes.
+
+- Issue #4272: Add an optional argument to the GzipFile constructor to override
+ the timestamp in the gzip stream. The default value remains the current time.
+ The information can be used by e.g. gunzip when decompressing. Patch by
+ Jacques Frechet.
+
+- Restore Python 2.3 compatibility for decimal.py.
+
+- Issue #3638: Remove functions from _tkinter module level that depend on
+ TkappObject to work with multiple threads.
+
+- Issue #4718: Adapt the wsgiref package so that it actually works with
+ Python 3.x, in accordance with the `official amendments of the spec
+ <http://www.wsgi.org/wsgi/Amendments_1.0>`_.
+
+- Issue #4796: Added Decimal.from_float() and Context.create_decimal_from_float()
+ to the decimal module.
+
+- Fractions.from_float() no longer loses precision for integers too big to
+ cast as floats.
+
+- Issue #4812: add missing underscore prefix to some internal-use-only
+ constants in the decimal module. (Dec_0 becomes _Dec_0, etc.)
+
+- Issue #4790: The nsmallest() and nlargest() functions in the heapq module
+ did unnecessary work in the common case where no key function was specified.
+
+- Issue #4795: inspect.isgeneratorfunction() returns False instead of None when
+ the function is not a generator.
+
+- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
+ no MSVC compiler is found under Windows. Original patch by Philip Jenvey.
+
+- Issue #4646: distutils was choking on empty options arg in the setup
+ function. Original patch by Thomas Heller.
+
+- Issue #3767: Convert Tk object to string in tkColorChooser.
+
+- Issue #3248: Allow placing ScrolledText in a PanedWindow.
+
+- Issue #4444: Allow assertRaises() to be used as a context handler, so that
+ the code under test can be written inline if more practical.
+
+- Issue #4739: Add pydoc help topics for symbols, so that e.g. help('@')
+ works as expected in the interactive environment.
+
+- Issue #4756: zipfile.is_zipfile() now supports file-like objects. Patch by
+ Gabriel Genellina.
+
+- Issue #4574: reading an UTF16-encoded text file crashes if \r on 64-char
+ boundary.
+
+- Issue #4223: inspect.getsource() will now correctly display source code
+ for packages loaded via zipimport (or any other conformant PEP 302
+ loader). Original patch by Alexander Belopolsky.
+
+- Issue #4201: pdb can now access and display source code loaded via
+ zipimport (or any other conformant PEP 302 loader). Original patch by
+ Alexander Belopolsky.
+
+- Issue #4197: doctests in modules loaded via zipimport (or any other PEP
+ 302 conformant loader) will now work correctly in most cases (they
+ are still subject to the constraints that exist for all code running
+ from inside a module loaded via a PEP 302 loader and attempting to
+ perform IO operations based on __file__). Original patch by
+ Alexander Belopolsky.
+
+- Issues #4082 and #4512: Add runpy support to zipimport in a manner that
+ allows backporting to maintenance branches. Original patch by
+ Alexander Belopolsky.
+
+- Issue #4163: textwrap module: allow word splitting on a hyphen preceded by
+ a non-ASCII letter.
+
+- Issue #4616: TarFile.utime(): Restore directory times on Windows.
+
+- Issue #4021: tokenize.detect_encoding() now raises a SyntaxError when the
+ codec cannot be found. This is for compatibility with the builtin behavior.
+
+- Issue #4084: Fix max, min, max_mag and min_mag Decimal methods to
+ give correct results in the case where one argument is a quiet NaN
+ and the other is a finite number that requires rounding.
+
+- Issue #4483: _dbm module now builds on systems with gdbm & gdbm_compat
+ libs.
+
+- Added the subprocess.check_call_output() convenience function to get output
+ from a subprocess on success or raise an exception on error.
+
+- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
+ support unusual filenames (such as those containing semi-colons) in
+ Content-Disposition headers.
+
+- Issue #4384: Added logging integration with warnings module using
+ captureWarnings(). This change includes a NullHandler which does nothing;
+ it will be of use to library developers who want to avoid the "No handlers
+ could be found for logger XXX" message which can appear if the library user
+ doesn't configure logging.
+
+- Issue #3741: DISTUTILS_USE_SDK set causes msvc9compiler.py to raise an
+ exception.
+
+- Issue #4529: fix the parser module's validation of try-except-finally
+ statements.
+
+- Issue #4458: getopt.gnu_getopt() now recognizes a single "-" as an argument,
+ not a malformed option.
+
+- Added the subprocess.check_output() convenience function to get output
+ from a subprocess on success or raise an exception on error.
+
+- Issue #4542: On Windows, binascii.crc32 still accepted str as binary input;
+ the corresponding tests now pass.
+
+- Issue #4537: webbrowser.UnixBrowser would fail to open the browser because
+ it was calling the wrong open() function.
+
+- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
+ support unusual filenames (such as those containing semi-colons) in
+ Content-Disposition headers.
+
+- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
+ biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
+
+- Issue #5104: The socket module now raises OverflowError when 16-bit port and
+ protocol numbers are supplied outside the allowed 0-65536 range on bind()
+ and getservbyport().
+
+- Windows locale mapping updated to Vista.
+
+Tools/Demos
+-----------
+
+- Issue #4704: remove use of cmp() in pybench, bump its version number to 2.1,
+ and make it 2.6-compatible.
+
+- Ttk demos added in Demo/tkinter/ttk/
+
+- Issue #4677: add two list comprehension tests to pybench.
+
+
+Build
+-----
+
+- Issue #6094: Build correctly with Subversion 1.7.
+
+- Issue #5847: Remove -n switch on "Edit with IDLE" menu item.
+
+- Issue #5726: Make Modules/ld_so_aix return the actual exit code of the
+ linker, rather than always exit successfully. Patch by Floris Bruynooghe.
+
+- Issue #4587: Add configure option --with-dbmliborder=db1:db2:... to specify
+ the order that backends for the dbm extension are checked.
+
+- Link the shared python library with $(MODLIBS).
+
+- Issue #5134: Silence compiler warnings when compiling sqlite with VC++.
+
+- Issue #4494: Fix build with Py_NO_ENABLE_SHARED on Windows.
+
+- Issue #4895: Use _strdup on Windows CE.
+
+- Issue #4472: "configure --enable-shared" now works on OSX
+
+- Issues #4728 and #4060: WORDS_BIGEDIAN is now correct in Universal builds.
+
+- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".
+
+- Issue #4289: Remove Cancel button from AdvancedDlg.
+
+- Issue #1656675: Register a drop handler for .py* files on Windows.
+
+- Issue #4120: Exclude manifest from extension modules in VS2008.
+
+- Issue #4091: Install pythonxy.dll in system32 again.
+
+- Issue #4018: Disable "for me" installations on Vista.
+
+- Issue #3758: Add ``patchcheck`` build target to .PHONY.
+
+- Issue #4204: Fixed module build errors on FreeBSD 4.
+
+
+C-API
+-----
+
+- Issue #6624: yArg_ParseTuple with "s" format when parsing argument with
+ NUL: Bogus TypeError detail string.
+
+- Issue #5175: PyLong_AsUnsignedLongLong now raises OverflowError
+ for negative arguments. Previously, it raised TypeError.
+
+- Issue #4720: The format for PyArg_ParseTupleAndKeywords can begin with '|'.
+
+- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
+ the GIL is released, or owned by another thread.
+
+- Issue #4122: On Windows, fix a compilation error when using the
+ Py_UNICODE_ISSPACE macro in an extension module.
+
+
+Extension Modules
+-----------------
+
+- Issue #3745: Fix hashlib to always reject unicode and non buffer-api
+ supporting objects as input no matter how it was compiled (built in
+ implementations or external openssl library).
+
+- Issue #4397: Fix occasional test_socket failure on OS X.
+
+- Issue #4279: Fix build of parsermodule under Cygwin.
+
+- Issue #4751: hashlib now releases the GIL when hashing large buffers
+ (with a hardwired threshold of 2048 bytes), allowing better parallelization
+ on multi-CPU systems. Contributed by Lukas Lueg (ebfe) and Victor Stinner.
+
+- Issue #4051: Prevent conflict of UNICODE macros in cPickle.
+
+- Issue #4738: Each zlib object now has a separate lock, allowing to compress
+ or decompress several streams at once on multi-CPU systems. Also, the GIL
+ is now released when computing the CRC of a large buffer. Patch by ebfe.
+
+- Issue #4228: Pack negative values the same way as 2.4 in struct's L format.
+
+- Issue #1040026: Fix os.times result on systems where HZ is incorrect.
+
+- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
+ OpenBSD.
+
+- Issue #4583: array.array would not always prohibit resizing when a buffer
+ has been exported, resulting in an interpreter crash when accessing the
+ buffer.
+
+
+- Issue #5228: Make functools.partial objects can now be pickled.
+
+Tests
+-----
+
+- Issue #6152: New option '-j'/'--multiprocess' for regrtest allows running
+ regression tests in parallel, shortening the total runtime.
+
+- Issue #5450: Moved tests involving loading tk from Lib/test/test_tcl to
+ Lib/tkinter/test/test_tkinter/test_loadtk. With this, these tests demonstrate
+ the same behaviour as test_ttkguionly (and now also test_tk) which is to
+ skip the tests if DISPLAY is defined but can't be used.
+
+- regrtest no longer treats ImportError as equivalent to SkipTest. Imports
+ that should cause a test to be skipped are now done using import_module
+ from test support, which does the conversion.
+
+- Issue #5083: New 'gui' resource for regrtest.
+
+
+Docs
+----
+
+
What's New in Python 3.0 final
==============================
diff --git a/Misc/NEWS b/Misc/NEWS
index b035e24..9c0ea03 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,10 +2,12 @@
Python News
+++++++++++
-What's New in Python 3.2.4
-==========================
+What's New in Python 3.3.1?
+===========================
+
+*Not yet released, see sections below for changes released in 3.3.0*
-*Release date: XX-XX-XXXX*
+.. *Release date: XX-XXX-2012*
Core and Builtins
-----------------
@@ -13,9 +15,12 @@ Core and Builtins
- Issue #15001: fix segfault on "del sys.module['__main__']". Patch by Victor
Stinner.
-- Issue #5057: the peepholer no longer optimizes subscription on unicode
- literals (e.g. u'foo'[0]) in order to produce compatible pyc files between
- narrow and wide builds.
+- Issue #8271: the utf-8 decoder now outputs the correct number of U+FFFD
+ characters when used with the 'replace' error handler on invalid utf-8
+ sequences. Patch by Serhiy Storchaka, tests by Ezio Melotti.
+
+- Issue #5765: Apply a hard recursion limit in the compiler instead of
+ blowing the stack and segfaulting. Initial patch by Andrea Griffini.
- Issue #16402: When slicing a range, fix shadowing of exceptions from
__index__.
@@ -26,14 +31,20 @@ Core and Builtins
- Issue #8401: assigning an int to a bytearray slice (e.g. b[3:4] = 5) now
raises an error.
+- Fix segfaults on setting __qualname__ on builtin types and attempting to
+ delete it on any type.
+
- Issue #16345: Fix an infinite loop when ``fromkeys`` on a dict subclass
received a nonempty dict from the constructor.
+- Issue #16271: Fix strange bugs that resulted from __qualname__ appearing in a
+ class's __dict__ and on type.
+
- Issue #16197: Update winreg docstrings and documentation to match code.
Patch by Zachary Ware.
-- Issue #14700: Fix buggy overflow checks when handling large precisions and
- widths in old-style and new-style formatting.
+- Issue #16241: Document -X faulthandler command line option.
+ Patch by Marek Å uppa.
- Issue #6074: Ensure cached bytecode files can always be updated by the
user that created them, even when the source file is read-only.
@@ -41,120 +52,30 @@ Core and Builtins
- Issue #14783: Improve int() docstring and switch docstrings for str(),
range(), and slice() to use multi-line signatures.
+- Issue #16160: Subclass support now works for types.SimpleNamespace.
+
- Issue #15379: Fix passing of non-BMP characters as integers for the charmap
decoder (already working as unicode strings). Patch by Serhiy Storchaka.
-- Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
- sporadic crashes in multi-thread programs when several long deallocator
- chains ran concurrently and involved subclasses of built-in container
- types.
+- Issue #15144: Fix possible integer overflow when handling pointers as integer
+ values, by using `Py_uintptr_t` instead of `size_t`. Patch by Serhiy
+ Storchaka.
-- Issue #15846: Fix SystemError which happened when using ast.parse in an
- exception handler on code with syntax errors.
+- Issue #15965: Explicitly cast `AT_FDCWD` as (int). Required on Solaris 10
+ (which defines `AT_FDCWD` as ``0xffd19553``), harmless on other platforms.
-- Issue #15761: Fix crash when PYTHONEXECUTABLE is set on Mac OS X.
+- Issue #15839: Convert SystemErrors in `super()` to RuntimeErrors.
+
+- Issue #15846: Fix SystemError which happened when using `ast.parse()` in an
+ exception handler on code with syntax errors.
- Issue #15801: Make sure mappings passed to '%' formatting are actually
subscriptable.
-- Issue #15726: Fix incorrect bounds checking in PyState_FindModule.
- Patch by Robin Schreiber.
-
-- Issue #15604: Update uses of PyObject_IsTrue() to check for and handle
- errors correctly. Patch by Serhiy Storchaka.
-
-- Issue #13119: sys.stdout and sys.stderr are now using "\r\n" newline on
- Windows, as Python 2.
-
-- Issue #14579: Fix CVE-2012-2135: vulnerability in the utf-16 decoder after
- error handling. Patch by Serhiy Storchaka.
-
-- Issue #15404: Refleak in PyMethodObject repr.
-
-- Issue #15394: An issue in PyModule_Create that caused references to
- be leaked on some error paths has been fixed. Patch by Julia Lawall.
-
-- Issue #15368: An issue that caused bytecode generation to be
- non-deterministic when using randomized hashing (-R) has been fixed.
-
-- Issue #16369: Global PyTypeObjects not initialized with PyType_Ready(...).
-
-- Issue #15020: The program name used to search for Python's path is now
- "python3" under Unix, not "python".
-
-- Issue #15897: zipimport.c doesn't check return value of fseek().
- Patch by Felipe Cruz.
-
-- Issue #15033: Fix the exit status bug when modules invoked using -m switch,
- return the proper failure return value (1). Patch contributed by Jeff Knupp.
-
-- Issue #12268: File readline, readlines and read() or readall() methods
- no longer lose data when an underlying read system call is interrupted.
- IOError is no longer raised due to a read system call returning EINTR
- from within these methods.
-
-- Issue #15142: Fix reference leak when deallocating instances of types
- created using PyType_FromSpec().
-
-- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
- the work by Hirokazu Yamamoto.
-
-- Issue #14775: Fix a potential quadratic dict build-up due to the garbage
- collector repeatedly trying to untrack dicts.
-
-- Issue #14494: Fix __future__.py and its documentation to note that
- absolute imports are the default behavior in 3.0 instead of 2.7.
- Patch by Sven Marnach.
-
-- Issue #14761: Fix potential leak on an error case in the import machinery.
-
-- Issue #14699: Fix calling the classmethod descriptor directly.
-
-- Issue #14433: Prevent msvcrt crash in interactive prompt when stdin
- is closed.
+- Issue #15111: __import__ should let ImportError propagate when a module that
+ is imported as a side-effect of using fromlist tries to import a module
+ that cannot be found.
-- Issue #11603 (again): Setting __repr__ to __str__ now raises a RuntimeError
- when repr() or str() is called on such an object.
-
-- Issue #14658: Fix binding a special method to a builtin implementation of a
- special method with a different name.
-
-- Issue #14630: Fix a memory access bug for instances of a subclass of int
- with value 0.
-
-- Issue #14612: Fix jumping around with blocks by setting f_lineno.
-
-- Issue #14607: Fix keyword-only arguments which started with ``__``.
-
-- Issue #13889: Check and (if necessary) set FPU control word before calling
- any of the dtoa.c string <-> float conversion functions, on MSVC builds of
- Python. This fixes issues when embedding Python in a Delphi app.
-
-- Issue #14474: Save and restore exception state in thread.start_new_thread()
- while writing error message if the thread leaves a unhandled exception.
-
-- Issue #13019: Fix potential reference leaks in bytearray.extend(). Patch
- by Suman Saha.
-
-- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
- the module name that was not interned.
-
-- Issue #14331: Use significantly less stack space when importing modules by
- allocating path buffers on the heap instead of the stack.
-
-- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
- passed strings.
-
-- Issue #1469629: Allow cycles through an object's __dict__ slot to be
- collected. (For example if ``x.__dict__ is x``).
-
-- Issue #14172: Fix reference leak when marshalling a buffer-like object
- (other than a bytes object).
-
-- Issue #13521: dict.setdefault() now does only one lookup for the given key,
- making it "atomic" for many purposes. Patch by Filip Gruszczyński.
-
-- Issue #14471: Fix a possible buffer overrun in the winreg module.
Library
-------
@@ -162,6 +83,14 @@ Library
- Issue #16357: fix calling accept() on a SSLSocket created through
SSLContext.wrap_socket(). Original patch by Jeff McNeil.
+- Issue #16409: The reporthook callback made by the legacy
+ urllib.request.urlretrieve API now properly supplies a constant non-zero
+ block_size as it did in Python 3.2 and 2.7. This matches the behavior of
+ urllib.request.URLopener.retrieve.
+
+- Issue #16431: Use the type information when constructing a Decimal subtype
+ from a Decimal argument.
+
- Issue #16350: zlib.Decompress.decompress() now accumulates data from
successive calls after EOF in unused_data, instead of only saving the argument
to the last call. Patch by Serhiy Storchaka.
@@ -187,10 +116,15 @@ Library
- Issue #12890: cgitb no longer prints spurious <p> tags in text
mode when the logdir option is specified.
+- Issue #16307: Fix multiprocessing.Pool.map_async not calling its callbacks.
+ Patch by Janne Karila.
+
- Issue #16250: Fix URLError invocation with proper args.
-- Issue #16305: Fix a segmentation fault occurring when interrupting
- math.factorial.
+- Issue #16116: Fix include and library paths to be correct when building C
+ extensions in venvs.
+
+- Issue #16245: Fix the value of a few entities in html.entities.html5.
- Issue #14398: Fix size truncation and overflow bugs in the bz2 module.
@@ -202,488 +136,104 @@ Library
- Issue #16176: Properly identify Windows 8 via platform.platform()
-- Issue #16114: The subprocess module no longer provides a misleading
- error message stating that args[0] did not exist when either the cwd or
- executable keyword arguments specified a path that did not exist.
+- Issue #16114: The subprocess module no longer provides a misleading error
+ message stating that args[0] did not exist when either the cwd or executable
+ keyword arguments specified a path that did not exist.
-- Issue #15756: subprocess.poll() now properly handles errno.ECHILD to
- return a returncode of 0 when the child has already exited or cannot
- be waited on.
+- Issue #16169: Fix ctypes.WinError()'s confusion between errno and winerror.
-- Issue #12376: Pass on parameters in TextTestResult.__init__ super call
-
-- Issue #15222: Insert blank line after each message in mbox mailboxes
-
-- Issue #16013: Fix CSV Reader parsing issue with ending quote characters.
- Patch by Serhiy Storchaka.
-
-- Issue #15421: fix an OverflowError in Calendar.itermonthdates() after
- datetime.MAXYEAR. Patch by Cédric Krier.
-
-- Issue #15970: xml.etree.ElementTree now serializes correctly the empty HTML
- elements 'meta' and 'param'.
+- Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element
+ element_factory (fixes a regression in SimpleTAL).
-- Issue #15842: the SocketIO.{readable,writable,seekable} methods now
- raise ValueError when the file-like object is closed. Patch by Alessandro
- Moura.
-
-- Issue #15881: Fixed atexit hook in multiprocessing. Original patch
- by Chris McDonough.
-
-- Issue #15340: Fix importing the random module when /dev/urandom cannot
- be opened. This was a regression caused by the hash randomization patch.
-
-- Issue #15841: The readable(), writable() and seekable() methods of BytesIO
- and StringIO objects now raise ValueError when the object has been closed.
- Patch by Alessandro Moura.
-
-- Issue #15509: webbrowser.UnixBrowser no longer passes empty arguments to
- Popen when %action substitutions produce empty strings.
+- Issue #16034: Fix performance regressions in the new `bz2.BZ2File`
+ implementation. Initial patch by Serhiy Storchaka.
- Issue #16112: platform.architecture does not correctly escape argument to
/usr/bin/file. Patch by David Benjamin.
-- Issue #12776,#11839: call argparse type function (specified by add_argument)
- only once. Before, the type function was called twice in the case where the
- default was specified and the argument was given as well. This was
- especially problematic for the FileType type, as a default file would always
- be opened, even if a file argument was specified on the command line.
-
-- Issue #15906: Fix a regression in argparse caused by the preceding change,
- when action='append', type='str' and default=[].
-
-- Issue #13370: Ensure that ctypes works on Mac OS X when Python is
- compiled using the clang compiler
-
-- Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
+- Issue #15756: `subprocess.poll()` now properly handles `errno.ECHILD` to
+ return a returncode of 0 when the child has already exited or cannot be waited
+ on.
-- Issue #15249: BytesGenerator now correctly mangles From lines (when
- requested) even if the body contains undecodable bytes.
+- Issue #15323: Improve failure message of `Mock.assert_called_once_with()`.
-- Issue #15777: Fix a refleak in _posixsubprocess.
+- Issue #16064: ``unittest -m`` claims executable is "python", not "python3".
-- Issue #15199: Fix JavaScript's default MIME type to application/javascript.
- Patch by Bohuslav Kabrda.
+- Issue #12376: Pass on parameters in `TextTestResult.__init__()` super call.
-- Issue #13579: string.Formatter now understands the 'a' conversion specifier.
+- Issue #15222: Insert blank line after each message in mbox mailboxes.
-- Issue #15793: Stack corruption in ssl.RAND_egd().
+- Issue #16013: Fix `csv.Reader` parsing issue with ending quote characters.
Patch by Serhiy Storchaka.
-- Issue #15595: Fix subprocess.Popen(universal_newlines=True)
- for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek.
+- Issue #15421: Fix an OverflowError in `Calendar.itermonthdates()` after
+ `datetime.MAXYEAR`. Patch by Cédric Krier.
-- Issue #15477: In cmath and math modules, add workaround for platforms whose
- system-supplied log1p function doesn't respect signs of zeros.
-
-- Issue #11062: Fix adding a message from file to Babyl mailbox.
-
-- Issue #15646: Prevent equivalent of a fork bomb when using
- multiprocessing on Windows without the "if __name__ == '__main__'"
- idiom.
-
-- Issue #15424: Add a __sizeof__ implementation for array objects.
- Patch by Ludwig Hähne.
-
-- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog
- ended with '\'. Patch by Roger Serwy.
-
-- Issue #15538: Fix compilation of the getnameinfo() / getaddrinfo()
- emulation code. Patch by Philipp Hagemeister.
-
-- Issue #9803: Don't close IDLE on saving if breakpoint is open.
- Patch by Roger Serwy.
+- Issue #15970: `xml.etree.ElementTree` now serializes correctly the empty HTML
+ elements 'meta' and 'param'.
-- Issue #12288: Consider '0' and '0.0' as valid initialvalue
- for tkinter SimpleDialog.
+- Issue #15842: The `SocketIO.{readable,writable,seekable}` methods now raise
+ ValueError when the file-like object is closed. Patch by Alessandro Moura.
-- Issue #15512: Add a __sizeof__ implementation for parser.
- Patch by Serhiy Storchaka.
+- Issue #15876: Fix a refleak in the `curses` module: window.encoding.
-- Issue #15469: Add a __sizeof__ implementation for deque objects.
- Patch by Serhiy Storchaka.
+- Issue #15881: Fix `atexit` hook in `multiprocessing`. Original patch by Chris
+ McDonough.
-- Issue #15489: Add a __sizeof__ implementation for BytesIO objects.
- Patch by Serhiy Storchaka.
+- Issue #15841: The readable(), writable() and seekable() methods of
+ `io.BytesIO` and `io.StringIO` objects now raise ValueError when the object
+ has been closed. Patch by Alessandro Moura.
-- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
+- Issue #16126: PyErr_Format format mismatch in _testcapimodule.c.
Patch by Serhiy Storchaka.
-- Issue #6056: Make multiprocessing use setblocking(True) on the
- sockets it uses. Original patch by J Derek Wilson.
-
-- Issue #15041: update "see also" list in tkinter documentation.
-
-- Issue #15402: An issue in the struct module that caused sys.getsizeof to
- return incorrect results for struct.Struct instances has been fixed.
- Initial patch by Serhiy Storchaka.
-
-- Issue #15232: when mangle_from is True, email.Generator now correctly mangles
- lines that start with 'From ' that occur in a MIME preamble or epilogue.
-
-- Issue #13922: argparse no longer incorrectly strips '--'s that appear
- after the first one.
-
-- Issue #12353: argparse now correctly handles null argument values.
-
-- Issues #10017 and #14998: Fix TypeError using pprint on dictionaries with
- user-defined types as keys or other unorderable keys.
+- Issue #15447: Use `subprocess.DEVNULL` in webbrowser, instead of opening
+ `os.devnull` explicitly and leaving it open.
-- Issue #14635: telnetlib will use poll() rather than select() when possible
- to avoid failing due to the select() file descriptor limit.
+- Issue #15509: `webbrowser.UnixBrowser` no longer passes empty arguments to
+ Popen when ``%action`` substitutions produce empty strings.
-- Issue #15180: Clarify posixpath.join() error message when mixing str & bytes
+- Issue #12776, issue #11839: Call `argparse` type function (specified by
+ add_argument) only once. Before, the type function was called twice in the
+ case where the default was specified and the argument was given as well. This
+ was especially problematic for the FileType type, as a default file would
+ always be opened, even if a file argument was specified on the command line.
-- Issue #15230: runpy.run_path now correctly sets __package__ as described
- in the documentation
-
-- Issue #14990: Correctly fail with SyntaxError on invalid encoding
- declaration.
-
-- Issue #15247: FileIO now raises an error when given a file descriptor
- pointing to a directory.
-
-- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox
- files on flush().
-
-- Issue #10571: Fix the "--sign" option of distutils' upload command.
- Patch by Jakub Wilk.
-
-- Issue #9559: If messages were only added, a new file is no longer
- created and renamed over the old file when flush() is called on an
- mbox, MMDF or Babyl mailbox.
-
-- Issue #14653: email.utils.mktime_tz() no longer relies on system
- mktime() when timezone offest is supplied.
-
-- Fix GzipFile's handling of filenames given as bytes objects.
-
-- Issue #15101: Make pool finalizer avoid joining current thread.
-
-- Issue #15036: Mailbox no longer throws an error if a flush is done
- between operations when removing or changing multiple items in mbox,
- MMDF, or Babyl mailboxes.
-
-- Issue #10133: Make multiprocessing deallocate buffer if socket read
- fails. Patch by Hallvard B Furuseth.
-
-- Issue #13854: Make multiprocessing properly handle non-integer
- non-string argument to SystemExit.
-
-- Issue #12157: Make pool.map() empty iterables correctly. Initial
- patch by mouad.
-
-- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
- when the path existed and had the S_ISGID mode bit set when it was
- not explicitly asked for. This is no longer an exception as mkdir
- cannot control if the OS sets that bit for it or not.
-
-- Issue #14962: Update text coloring in IDLE shell window after changing
- options. Patch by Roger Serwy.
-
-- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.
-
-- Issue #14443: Tell rpmbuild to use the correct version of Python in
- bdist_rpm. Initial patch by Ross Lagerwall.
-
-- Issue #14929: Stop Idle 3.x from closing on Unicode decode errors when
- grepping. Patch by Roger Serwy.
-
-- Issue #12510: Attempting to get invalid tooltip no longer closes Idle.
- Other tooltipss have been corrected or improved and the number of tests
- has been tripled. Original patch by Roger Serwy.
-
-- Issue #10365: File open dialog now works instead of crashing even when
- the parent window is closed before the dialog. Patch by Roger Serwy.
-
-- Issue #14876: Use user-selected font for highlight configuration.
-
-- Issue #14920: Fix the help(urllib.parse) failure on locale C on terminals.
- Have ascii characters in help.
-
-- Issue #14863: Update the documentation of os.fdopen() to reflect the
- fact that it's only a thin wrapper around open() anymore.
-
-- Issue #14036: Add an additional check to validate that port in urlparse does
- not go in illegal range and returns None.
-
-- Issue #14875: Use float('inf') instead of float('1e66666') in the json module.
-
-- Issue #14426: Correct the Date format in Expires attribute of Set-Cookie
- Header in Cookie.py.
-
-- Issue #14721: Send the correct 'Content-length: 0' header when the body is an
- empty string ''. Initial Patch contributed by Arve Knudsen.
-
-- Issue #14072: Fix parsing of 'tel' URIs in urlparse by making the check for
- ports stricter.
-
-- Issue #9374: Generic parsing of query and fragment portions of url for any
- scheme. Supported both by RFC3986 and RFC2396.
-
-- Issue #14798: Fix the functions in pyclbr to raise an ImportError
- when the first part of a dotted name is not a package. Patch by
- Xavier de Gaye.
-
-- Issue #14829: Fix bisect and range() indexing with large indices
- (>= 2 ** 32) under 64-bit Windows.
-
-- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
- accessing the Tk clipboard. Modify clipboad_get() to first request type
- UTF8_STRING when no specific type is requested in an X11 windowing
- environment, falling back to the current default type STRING if that fails.
- Original patch by Thomas Kluyver.
-
-- Issue #12541: Be lenient with quotes around Realm field of HTTP Basic
- Authentation in urllib2.
-
-- Issue #14662: Prevent shutil failures on OS X when destination does not
- support chflag operations. Patch by Hynek Schlawack.
-
-- Issue #14157: Fix time.strptime failing without a year on February 29th.
- Patch by Hynek Schlawack.
-
-- Issue #14768: os.path.expanduser('~/a') doesn't works correctly when HOME is '/'.
-
-- Issue #14741: Fix missing support for Ellipsis ('...') in parser module.
-
-- Issue #14697: Fix missing support for set displays and set comprehensions in
- parser module.
-
-- Issue #14701: Fix missing support for 'raise ... from' in parser module.
-
-- Issue #13183: Fix pdb skipping frames after hitting a breakpoint and running
- step. Patch by Xavier de Gaye.
-
-- Issue #14696: Fix parser module to understand 'nonlocal' declarations.
-
-- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
- the DST transition. Patch by Joe Peterson.
-
-- Issue #9154: Fix parser module to understand function annotations.
-
-- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
- test class that doesn't inherit from TestCase (i.e. a mixin).
-
-- Issue #14160: TarFile.extractfile() failed to resolve symbolic links when
- the links were not located in an archive subdirectory.
-
-- Issue #14638: pydoc now treats non-string __name__ values as if they
- were missing, instead of raising an error.
-
-- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites
- which send EOF without trailing \r\n.
-
-- Issue #14629: Raise SyntaxError in tokenizer.detect_encoding if the
- first two lines have non-UTF-8 characters without an encoding declaration.
-
-- Issue #14308: Fix an exception when a "dummy" thread is in the threading
- module's active list after a fork().
-
-- Issue #14538: HTMLParser can now parse correctly start tags that contain
- a bare '/'.
-
-- Issue #14452: SysLogHandler no longer inserts a UTF-8 BOM into the message.
-
-- Issue #13496: Fix potential overflow in bisect.bisect algorithm when applied
- to a collection of size > sys.maxsize / 2.
-
-- Issue #14399: zipfile now recognizes that the archive has been modified even
- if only the comment is changed. In addition, the TypeError that results from
- trying to set a non-binary value as a comment is now now raised at the time
- the comment is set rather than at the time the zipfile is written.
-
-- Issue #7978: socketserver now restarts the select() call when EINTR is
- returned. This avoids crashing the server loop when a signal is received.
- Patch by Jerzy Kozera.
-
-- Issue #14496: Fix wrong name in idlelib/tabbedpages.py.
- Patch by Popa Claudiu.
-
-- Issue #14482: Raise a ValueError, not a NameError, when trying to create
- a multiprocessing Client or Listener with an AF_UNIX type address under
- Windows. Patch by Popa Claudiu.
-
-- Issue #14151: Raise a ValueError, not a NameError, when trying to create
- a multiprocessing Client or Listener with an AF_PIPE type address under
- non-Windows platforms. Patch by Popa Claudiu.
-
-- Issue #13872: socket.detach() now marks the socket closed (as mirrored
- in the socket repr()). Patch by Matt Joiner.
-
-- Issue #14406: Fix a race condition when using ``concurrent.futures.wait(
- return_when=ALL_COMPLETED)``. Patch by Matt Joiner.
-
-- Issue #14409: IDLE now properly executes commands in the Shell window
- when it cannot read the normal config files on startup and
- has to use the built-in default key bindings.
- There was previously a bug in one of the defaults.
-
-- Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
- OSX; avoid to call handle_connect in case of a disconnected socket which
- was not meant to connect.
-
-- Issue #12757: Fix the skipping of doctests when python is run with -OO so
- that it works in unittest's verbose mode as well as non-verbose mode.
-
-- Issue #3573: IDLE hangs when passing invalid command line args
- (directory(ies) instead of file(s)) (Patch by Guilherme Polo)
-
-- Issue #13694: asynchronous connect in asyncore.dispatcher does not set addr
- attribute.
-
-- Issue #11686: Added missing entries to email package __all__ lists
- (mostly the new Bytes classes).
-
-- Issue #10484: Fix the CGIHTTPServer's PATH_INFO handling problem.
-
-- Issue #11199: Fix the with urllib which hangs on particular ftp urls.
-
-- Issue #14062: Header objects now correctly respect the 'linesep' setting
- when processed by BytesParser (which smtplib.SMTP.send_message uses).
-
-- Issue #14291: Email now defaults to utf-8 for non-ASCII unicode headers
- instead of raising an error. This fixes a regression relative to 2.7.
-
-- Issue #5219: Prevent event handler cascade in IDLE.
-
-- Issue #14184: Increase the default stack size for secondary threads on
- Mac OS X to avoid interpreter crashes when using threads on 10.7.
-
-- Issue #10543: Fix unittest test discovery with Jython bytecode files.
-
-- Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under
- Windows when the child process has already exited.
-
-- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly
- return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been
- fixed.
-
-- Issue #14177: marshal.loads() now raises TypeError when given an unicode
- string. Patch by Guilherme Gonçalves.
-
-- Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary,
- WeakValueDictionary) to return a better approximation when some objects
- are dead or dying. Moreover, the implementation is now O(1) rather than
- O(n).
-
-- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode.
- Patch by Mikhail Novikov.
-
-- Issue #13447: Add a test file to host regression tests for bugs in the
- scripts found in the Tools directory.
-
-- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions
- on 32-bit architectures. Initial patch by Philippe Devalkeneer.
-
-Extension Modules
------------------
-
-- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()
- method doesn't require an argument again.
-
-- Issue #15676: Now "mmap" check for empty files before doing the
- offset check. Patch by Steven Willis.
-
-- Issue #6493: An issue in ctypes on Windows that caused structure bitfields
- of type ctypes.c_uint32 and width 32 to incorrectly be set has been fixed.
-
-- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.
-
-- Issue #9041: An issue in ctypes.c_longdouble, ctypes.c_double, and
- ctypes.c_float that caused an incorrect exception to be returned in the
- case of overflow has been fixed.
-
-- Issue #14212: The re module didn't retain a reference to buffers it was
- scanning, resulting in segfaults.
+- Issue #15906: Fix a regression in `argparse` caused by the preceding change,
+ when ``action='append'``, ``type='str'`` and ``default=[]``.
Tests
-----
-- Issue #15304: Fix warning message when os.chdir() fails inside
- test.support.temp_cwd(). Patch by Chris Jerdonek.
+- Issue #16115: Add some tests for the executable argument to
+ subprocess.Popen(). Initial patch by Kushal Das.
-- Issue #15802: Fix test logic in TestMaildir.test_create_tmp. Patch
- by Serhiy Storchaka.
-
-- Issue #15747: ZFS always returns EOPNOTSUPP when attempting to set the
- UF_IMMUTABLE flag (via either chflags or lchflags); refactor affected
- tests in test_posix.py to account for this.
-
-- Issue #15285: Refactor the approach for testing connect timeouts using
- two external hosts that have been configured specifically for this type
- of test.
+- Issue #15304: Fix warning message when `os.chdir()` fails inside
+ `test.support.temp_cwd()`. Patch by Chris Jerdonek.
-- Issue #15615: Add some tests for the json module's handling of invalid
- input data. Patch by Kushal Das.
-
-- Issue #15496: Add directory removal helpers for tests on Windows.
- Patch by Jeremy Kloth.
-
-- Issue #15467: Move helpers for __sizeof__ tests into test_support.
- Patch by Serhiy Storchaka.
+- Issue #15802: Fix test logic in `TestMaildir.test_create_tmp()`. Patch by
+ Serhiy Storchaka.
-- Issue #15320: Make iterating the list of tests thread-safe when running
- tests in multiprocess mode. Patch by Chris Jerdonek.
-
-- Issue #15230: Adopted a more systematic approach in the runpy tests
-
-- Issue #15300: Ensure the temporary test working directories are in the same
- parent folder when running tests in multiprocess mode from a Python build.
- Patch by Chris Jerdonek.
-
-- test_nntplib now tolerates being run from behind NNTP gateways that add
- "X-Antivirus" headers to articles
-
-- Issue #15043: test_gdb is now skipped entirely if gdb security settings
- block loading of the gdb hooks
-
-- Issue #14026: In test_cmd_line_script, check that sys.argv is populated
- correctly for the various invocation approaches (Patch by Jason Yeo)
-
-- Issue #14032: Fix incorrect variable name in test_cmd_line_script debugging
- message (Patch by Jason Yeo)
-
-- Issue #14589: Update certificate chain for sha256.tbs-internet.com, fixing
- a test failure in test_ssl.
+- Issue #15557: Add a test suite for the `webbrowser` module, thanks to Anton
+ Barkovsky.
Build
-----
- Issue #16262: fix out-of-src-tree builds, if mercurial is not installed.
-- Issue #15923: fix a mistake in asdl_c.py that resulted in a TypeError after
- 2801bf875a24 (see #15801).
-
-- Issue #11715: Fix multiarch detection without having Debian development
- tools (dpkg-dev) installed.
-
-- Issue #15819: Make sure we can build Python out-of-tree from a readonly
- source directory. (Somewhat related to Issue #9860.)
-
-- Issue #15822: Ensure 2to3 grammar pickles are properly installed.
-
-- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK.
-
-- Issue #8847: Disable COMDAT folding in Windows PGO builds.
-
-- Issue #14197: For OS X framework builds, ensure links to the shared
- library are created with the proper ABI suffix.
-
-- Issue #14472: Update .gitignore. Patch by Matej Cepl.
-
-- The Windows build now uses OpenSSL 1.0.0j and bzip2 1.0.6.
-
-- Issue #14557: Fix extensions build on HP-UX. Patch by Adi Roiban.
-
-- Issue #14437: Fix building the _io module under Cygwin.
+- Issue #15298: ensure _sysconfigdata is generated in build directory, not
+ source directory.
-- Issue #14387: Do not include accu.h from Python.h.
+- Issue #15833: Fix a regression in 3.3 that resulted in exceptions being
+ raised if importlib failed to write byte-compiled files. This affected
+ attempts to build Python out-of-tree from a read-only source directory.
-- Issue #14359: Only use O_CLOEXEC in _posixmodule.c if it is defined.
- Based on patch from Hervé Coatanhay.
+- Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
+ after 2801bf875a24 (see #15801).
-- Issue #14018: Fix OS X Tcl/Tk framework checking when using OS X SDKs.
+- Issue #15819: Make sure we can build Python out-of-tree from a read-only
+ source directory. (Somewhat related to issue #9860.)
Tools/Demos
-----------
@@ -697,6972 +247,4133 @@ Documentation
- Issue #8040: added a version switcher to the documentation. Patch by
Yury Selivanov.
+- Additional comments and some style changes in the concurrent.futures URL
+ retrieval example
+
- Issue #16115: Improve subprocess.Popen() documentation around args, shell,
and executable arguments.
-- Issue #13498: Clarify docs of os.makedirs()'s exist_ok argument. Done with
- great native-speaker help from R. David Murray.
-
-- Issue #15533: Clarify docs and add tests for subprocess.Popen()'s cwd
+- Issue #15533: Clarify docs and add tests for `subprocess.Popen()`'s cwd
argument.
- Issue #15979: Improve timeit documentation.
-- Issue #16036: Improve documentation of built-in int()'s signature and
+- Issue #16036: Improve documentation of built-in `int()`'s signature and
arguments.
-- Issue #15935: Clarification of argparse docs, re: add_argument() type and
+- Issue #15935: Clarification of `argparse` docs, re: add_argument() type and
default arguments. Patch contributed by Chris Jerdonek.
- Issue #11964: Document a change in v3.2 to the behavior of the indent
parameter of json encoding operations.
-- Issue #14674: Add a discussion of the json module's standard compliance.
- Patch by Chris Rebert.
-
-- Issue #15630: Add an example for "continue" stmt in the tutorial. Patch by
- Daniel Ellis.
-
-- Issue #15444: Use proper spelling for non-ASCII contributor names. Patch
- by Serhiy Storchaka.
-
-- Issue #15482: Properly document the default 'level' value for __import__()
- while warning about using negative values.
-
-- Issue #15230: Clearly document some of the limitations of the runpy
- module and nudge readers towards importlib when appropriate.
-
-- Issue #13557: Clarify effect of giving two different namespaces to exec or
- execfile().
-
-- Issue #8799: Fix and improve the threading.Condition documentation.
-
-- Issue #14943: Correct a default argument value for winreg.OpenKey
- and correctly list the argument names in the function's explanation.
-
-- Issue #14034: added the argparse tutorial.
-
-- Issue #15250: Document that filecmp.dircmp compares files shallowly. Patch
- contributed by Chris Jerdonek.
-
Tools/Demos
-----------
- Issue #15378: Fix Tools/unicode/comparecodecs.py. Patch by Serhiy Storchaka.
-- Issue #14695: Fix missing support for starred assignments in
- Tools/parser/unparse.py.
-
-What's New in Python 3.2.3?
+What's New in Python 3.3.0?
===========================
-*Release date: 10-Apr-2012*
+*Release date: 29-Sep-2012*
-Build
------
-
-- Issue #14387: Work around a problem building extension modules under Windows
- by undefining ``small`` before use in the Python headers.
-
-
-What's New in Python 3.2.3 release candidate 2?
-===============================================
-
-*Release date: 18-Mar-2012*
+Core and Builtins
+-----------------
-Library
--------
+- Issue #16046: Fix loading sourceless legacy .pyo files.
-- Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils
- on Windows.
+- Issue #16060: Fix refcounting bug when `__trunc__()` returns an object whose
+ `__int__()` gives a non-integer. Patch by Serhiy Storchaka.
Extension Modules
-----------------
-- Issue #14234: CVE-2012-0876: Randomize hashes of xml attributes in the hash
- table internal to the pyexpat module's copy of the expat library to avoid a
- denial of service due to hash collisions. Patch by David Malcolm with some
- modifications by the expat project.
+- Issue #16012: Fix a regression in pyexpat. The parser's `UseForeignDTD()`
+ method doesn't require an argument again.
-What's New in Python 3.2.3 release candidate 1?
+What's New in Python 3.3.0 Release Candidate 3?
===============================================
-*Release date: 24-Feb-2012*
+*Release date: 23-Sep-2012*
Core and Builtins
-----------------
-- Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
- environment variable, to provide an opt-in way to protect against denial of
- service attacks due to hash collisions within the dict and set types. Patch
- by David Malcolm, based on work by Victor Stinner.
-
-- Issue #14084: Fix a file descriptor leak when importing a module with a
- bad encoding.
-
-- Issue #13020: Fix a reference leak when allocating a structsequence object
- fails. Patch by Suman Saha.
-
-- Issue #13908: Ready types returned from PyType_FromSpec.
-
-- Issue #11235: Fix OverflowError when trying to import a source file whose
- modification time doesn't fit in a 32-bit timestamp.
-
-- Fix the builtin module initialization code to store the init function for
- future reinitialization.
-
-- Issue #8052: The posix subprocess module would take a long time closing
- all possible file descriptors in the child process rather than just open
- file descriptors. It now closes only the open fds if possible for the
- default close_fds=True behavior.
-
-- Issue #13629: Renumber the tokens in token.h so that they match the indexes
- into _PyParser_TokenNames.
-
-- Fix the fix for issue #12149: it was incorrect, although it had the side
- effect of appearing to resolve the issue. Thanks to Mark Shannon for
- noticing.
-
-- Issue #13505: Pickle bytes objects in a way that is compatible with
- Python 2 when using protocols <= 2.
-
-- Issue #11147: Fix an unused argument in _Py_ANNOTATE_MEMORY_ORDER. (Fix
- given by Campbell Barton).
-
-- Issue #7111: Python can now be run without a stdin, stdout or stderr
- stream. It was already the case with Python 2. However, the corresponding
- sys module entries are now set to None (instead of an unusable file object).
+- Issue #15900: Fix reference leak in `PyUnicode_TranslateCharmap()`.
-- Issue #13436: Fix a bogus error message when an AST object was passed
- an invalid integer value.
-
-- Issue #13338: Handle all enumerations in _Py_ANNOTATE_MEMORY_ORDER
- to allow compiling extension modules with -Wswitch-enum on gcc.
- Initial patch by Floris Bruynooghe.
-
-- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
- already accepts them).
+- Issue #15926: Fix crash after multiple reinitializations of the interpreter.
-- Issue #13342: input() used to ignore sys.stdin's and sys.stdout's unicode
- error handler in interactive mode (when calling into PyOS_Readline()).
+- Issue #15895: Fix FILE pointer leak in one error branch of
+ `PyRun_SimpleFileExFlags()` when filename points to a pyc/pyo file, closeit is
+ false an and set_main_loader() fails.
-- Issue #13343: Fix a SystemError when a lambda expression uses a global
- variable in the default value of a keyword-only argument:
- (lambda *, arg=GLOBAL_NAME: None)
-
-- Issue #10519: Avoid unnecessary recursive function calls in
- setobject.c.
-
-- Issue #10363: Deallocate global locks in Py_Finalize().
-
-- Issue #13018: Fix reference leaks in error paths in dictobject.c.
- Patch by Suman Saha.
-
-- Issue #1294232: In a few cases involving metaclass inheritance, the
- interpreter would sometimes invoke the wrong metaclass when building a new
- class object. These cases now behave correctly. Patch by Daniel Urban.
-
-- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler
- warnings. Patch by Josh Triplett and Petri Lehtinen.
-
-- Issue #13188: When called without an explicit traceback argument,
- generator.throw() now gets the traceback from the passed exception's
- ``__traceback__`` attribute. Patch by Petri Lehtinen.
-
-- Issue #7833: Extension modules built using distutils on Windows will no
- longer include a "manifest" to prevent them failing at import time in some
- embedded situations.
-
-- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described
- as "The pipe is being closed") is now mapped to POSIX errno EPIPE
- (previously EINVAL).
-
-- Issue #12911: Fix memory consumption when calculating the repr() of huge
- tuples or lists.
-
-- Issue #7732: Don't open a directory as a file anymore while importing a
- module. Ignore the direcotry if its name matchs the module name (e.g.
- "__init__.py") and raise a ImportError instead.
-
-- Issue #13021: Missing decref on an error path. Thanks to Suman Saha for
- finding the bug and providing a patch.
-
-- Issue #12973: Fix overflow checks that relied on undefined behaviour in
- list_repeat (listobject.c) and islice_next (itertoolsmodule.c). These bugs
- caused test failures with recent versions of Clang.
-
-- Issue #12802: the Windows error ERROR_DIRECTORY (numbered 267) is now
- mapped to POSIX errno ENOTDIR (previously EINVAL).
-
-- Issue #9200: The str.is* methods now work with strings that contain non-BMP
- characters even in narrow Unicode builds.
-
-- Issue #12791: Break reference cycles early when a generator exits with
- an exception.
-
-- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase
- titlecased and cased non-letter characters.
+- Fixes for a few crash and memory leak regressions found by Coverity.
Library
-------
-- HTMLParser is now able to handle slashes in the start tag.
-
-- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in
- SimpleXMLRPCServer upon malformed POST request.
-
-- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF.
-
-- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().
-
-- Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
- Patch by Suman Saha.
-
-- Issue #1326113: distutils' build_ext command --libraries option now
- correctly parses multiple values separated by whitespace or commas.
-
-- Issue #10287: nntplib now queries the server's CAPABILITIES first before
- sending MODE READER, and only sends it if not already in READER mode.
- Patch by Hynek Schlawack.
+- Issue #15882: Change `_decimal` to accept any coefficient tuple when
+ constructing infinities. This is done for backwards compatibility with
+ decimal.py: Infinity coefficients are undefined in _decimal (in accordance
+ with the specification).
-- Issue #13979: A bug in ctypes.util.find_library that caused
- the wrong library name to be returned has been fixed.
+- Issue #15925: Fix a regression in `email.util` where the `parsedate()` and
+ `parsedate_tz()` functions did not return None anymore when the argument could
+ not be parsed.
-- Issue #13993: HTMLParser is now able to handle broken end tags when
- strict=False.
-
-- Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields
- with a name that is a keyword or contains quotes. Patch by Marko
- Kohtala.
-
-- Issue #10287: nntplib now queries the server's CAPABILITIES again after
- authenticating (since the result may change, according to RFC 4643).
- Patch by Hynek Schlawack.
-
-- Issue #13989: Document that GzipFile does not support text mode, and give a
- more helpful error message when opened with an invalid mode string.
-
-- Issue #13590: On OS X 10.7 and 10.6 with Xcode 4.2, building
- Distutils-based packages with C extension modules may fail because
- Apple has removed gcc-4.2, the version used to build python.org
- 64-bit/32-bit Pythons. If the user does not explicitly override
- the default C compiler by setting the CC environment variable,
- Distutils will now attempt to compile extension modules with clang
- if gcc-4.2 is required but not found. Also as a convenience, if
- the user does explicitly set CC, substitute its value as the default
- compiler in the Distutils LDSHARED configuration variable for OS X.
- (Note, the python.org 32-bit-only Pythons use gcc-4.0 and the 10.4u
- SDK, neither of which are available in Xcode 4. This change does not
- attempt to override settings to support their use with Xcode 4.)
-
-- Issue #13960: HTMLParser is now able to handle broken comments when
- strict=False.
-
-- Issue #9021: Add an introduction to the copy module documentation.
-
-- Issue #6005: Examples in the socket library documentation use sendall, where
- relevant, instead send method.
-
-- Issue #10811: Fix recursive usage of cursors. Instead of crashing,
- raise a ProgrammingError now.
-
-- Issue #10881: Fix test_site failure with OS X framework builds.
-
-- Issue #964437: Make IDLE help window non-modal.
- Patch by Guilherme Polo and Roger Serwy.
-
-- Issue #2945: Make the distutils upload command aware of bdist_rpm products.
-
-- Issue #13933: IDLE auto-complete did not work with some imported
- module, like hashlib. (Patch by Roger Serwy)
-
-- Issue #13901: Prevent test_distutils failures on OS X with --enable-shared.
-
-- Issue #13676: Handle strings with embedded zeros correctly in sqlite3.
-
-- Issue #13506: Add '' to path for IDLE Shell when started and restarted with Restart Shell.
- Original patches by Marco Scataglini and Roger Serwy.
-
-- Issue #13848: open() and the FileIO constructor now check for NUL
- characters in the file name. Patch by Hynek Schlawack.
-
-- Issue #13806: The size check in audioop decompression functions was too
- strict and could reject valid compressed data. Patch by Oleg Plakhotnyuk.
-
-- Issue #13812: When a multiprocessing Process child raises an exception,
- flush stderr after printing the exception traceback.
-
-- Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC
- IV attack countermeasure.
-
-- Issue #13772: In os.symlink() under Windows, do not try to guess the link
- target's type (file or directory). The detection was buggy and made the
- call non-atomic (therefore prone to race conditions).
-
-- Issue #6631: Disallow relative file paths in urllib urlopen methods.
-
-- Issue #13722: Avoid silencing ImportErrors when initializing the codecs
- registry.
-
-- Issue #13781: Fix GzipFile bug that caused an exception to be raised when
- opening for writing using a fileobj returned by os.fdopen().
-
-- Issue #13803: Under Solaris, distutils doesn't include bitness
- in the directory name.
-
-- Issue #13589: Fix some serialization primitives in the aifc module.
- Patch by Oleg Plakhotnyuk.
-
-- Issue #13642: Unquote before b64encoding user:password during Basic
- Authentication. Patch contributed by Joonas Kuorilehto.
-
-- Issue #13726: Fix the ambiguous -S flag in regrtest. It is -o/--slow for slow
- tests.
-
-- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
- The hang would occur when retrieving the result of a scheduled future after
- the executor had been shut down.
-
-- Issue #13502: threading: Fix a race condition in Event.wait() that made it
- return False when the event was set and cleared right after.
-
-- Issue #12926: Fix a bug in tarfile's link extraction.
-
-- Issue #13696: Fix the 302 Relative URL Redirection problem.
-
-- Issue #13636: Weak ciphers are now disabled by default in the ssl module
- (except when SSLv2 is explicitly asked for).
-
-- Issue #12798: Updated the mimetypes documentation.
-
-- Issue #11006: Don't issue low level warning in subprocess when pipe2() fails.
-
-- Issue #11829: Fix code execution holes in inspect.getattr_static for
- metaclasses with metaclasses. Patch by Andreas Stührk.
-
-- Issue #1785: Fix inspect and pydoc with misbehaving descriptors.
-
-- Issue #11813: Fix inspect.getattr_static for modules. Patch by Andreas
- Stührk.
-
-- Issue #7502: Fix equality comparison for DocTestCase instances. Patch by
- Cédric Krier.
-
-- Issue #11870: threading: Properly reinitialize threads internal locks and
- condition variables to avoid deadlocks in child processes.
-
-- Issue #8035: urllib: Fix a bug where the client could remain stuck after a
- redirection or an error.
-
-- Issue #10350: Read and save errno before calling a function which might
- overwrite it. Original patch by Hallvard B Furuseth.
-
-- Issue #13591: A bug in importlib has been fixed that caused import_module
- to load a module twice.
-
-- Issue #4625: If IDLE cannot write to its recent file or breakpoint
- files, display a message popup and continue rather than crash.
- (original patch by Roger Serwy)
-
-- Issue #5905: time.strftime() is now using the locale encoding, instead of
- UTF-8, if the wcsftime() function is not available.
-
-- Issue #8641: Update IDLE 3 syntax coloring to recognize b".." and not u"..".
- Patch by Tal Einat.
-
-- tarfile.py: Correctly detect bzip2 compressed streams with blocksizes
- other than 900k.
-
-- Issue #13439: Fix many errors in turtle docstrings.
-
-- Issue #13487: Make inspect.getmodule robust against changes done to
- sys.modules while it is iterating over it.
-
-- Issue #12618: Fix a bug that prevented py_compile from creating byte
- compiled files in the current directory. Initial patch by Sjoerd de Vries.
-
-- Issue #13444: When stdout has been closed explicitly, we should not attempt
- to flush it at shutdown and print an error.
-
-- Issue #12856: Ensure child processes do not inherit the parent's random
- seed for filename generation in the tempfile module. Patch by Brian
- Harring.
-
-- Issue #13458: Fix a memory leak in the ssl module when decoding a
- certificate with a subjectAltName. Patch by Robert Xiao.
-
-- Issue #13415: os.unsetenv() doesn't ignore errors anymore.
-
-- Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
- raised when the wrapped raw file is non-blocking and the write would block.
- Previous code assumed that the raw write() would raise BlockingIOError, but
- RawIOBase.write() is defined to returned None when the call would block.
- Patch by sbt.
-
-- Issue #13358: HTMLParser now calls handle_data only once for each CDATA.
-
-- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
- node when it is the only child of an element. Initial patch by Dan
- Kenigsberg.
-
-- Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly
- handles non-valid attributes, including adjacent and unquoted attributes.
-
-- Issue #13193: Fix distutils.filelist.FileList under Windows.
-
-- Issue #13384: Remove unnecessary __future__ import in Lib/random.py
-
-- Issue #13373: multiprocessing.Queue.get() could sometimes block indefinitely
- when called with a timeout. Patch by Arnaud Ysmal.
-
-- Issue #13254: Fix Maildir initialization so that maildir contents
- are read correctly.
-
-- Issue #3067: locale.setlocale() now raises TypeError if the second
- argument is an invalid iterable. Its documentation and docstring
- were also updated. Initial patch by Jyrki Pulliainen.
-
-- Issue #13140: Fix the daemon_threads attribute of ThreadingMixIn.
-
-- Issue #13339: Fix compile error in posixmodule.c due to missing semicolon.
- Thanks to Robert Xiao.
-
-- Issue #10570: curses.putp() and curses.tparm() are now expecting a byte
- string, instead of a Unicode string.
-
-- Issue #2892: preserve iterparse events in case of SyntaxError.
-
-- Issue #670664: Fix HTMLParser to correctly handle the content of
- ``<script>...</script>`` and ``<style>...</style>``.
-
-- Issue #10817: Fix urlretrieve function to raise ContentTooShortError even
- when reporthook is None. Patch by Jyrki Pulliainen.
-
-- Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart.
- (Patch by Roger Serwy)
-
-- Issue #13293: Better error message when trying to marshal bytes using
- xmlrpc.client.
-
-- Issue #13291: NameError in xmlrpc package.
-
-- Issue #13258: Use callable() built-in in the standard library.
-
-- Issue #13273: fix a bug that prevented HTMLParser to properly detect some
- tags when strict=False.
-
-- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
- before all tasks have completed.
-
-- Issue #13255: wrong docstrings in array module.
-
-- Issue #9168: now smtpd is able to bind privileged port.
-
-- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
- semicolons together. Patch by Ben Darnell and Petri Lehtinen.
-
-- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib``
- in order to display the prompt correctly.
-
-- Issue #6090: zipfile raises a ValueError when a document with a timestamp
- earlier than 1980 is provided. Patch contributed by Petri Lehtinen.
-
-- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are
- now available on Windows.
-
-- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number
- fields in tarfile.
-
-- Issue #13177: Functools lru_cache() no longer calls the original function
- inside an exception handler. This makes tracebacks easier to read because
- chained exceptions are avoided.
-
-- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding,
- instead of the locale encoding.
-
-- Issue #10653: On Windows, use strftime() instead of wcsftime() because
- wcsftime() doesn't format time zone correctly.
-
-- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was
- configured with different prefix and exec-prefix.
-
-- Issue #11254: Teach distutils to compile .pyc and .pyo files in
- PEP 3147-compliant __pycache__ directories.
-
-- Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files
- with line feeds. This was ported from the sandbox to the 3.3 branch, but
- didn't make it into 3.2.
-
-- Issue #7367: Fix pkgutil.walk_paths to skip directories whose
- contents cannot be read.
-
-- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale.
- Reported and diagnosed by Thomas Kluyver.
+Extension Modules
+-----------------
-- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation
- if the underlying raw stream is unseekable, even if the seek could be
- satisfied using the internal buffer. Patch by John O'Connor.
+- Issue #15973: Fix a segmentation fault when comparing datetime timezone
+ objects.
-- Issue #7689: Allow pickling of dynamically created classes when their
- metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig
- Citro.
+- Issue #15977: Fix memory leak in Modules/_ssl.c when the function
+ _set_npn_protocols() is called multiple times, thanks to Daniel Sommermann.
-- Issue #4147: minidom's toprettyxml no longer adds whitespace to text nodes.
+- Issue #15969: `faulthandler` module: rename dump_tracebacks_later() to
+ dump_traceback_later() and cancel_dump_tracebacks_later() to
+ cancel_dump_traceback_later().
-- Issue #13034: When decoding some SSL certificates, the subjectAltName
- extension could be unreported.
+- _decimal module: use only C 89 style comments.
-- Issue #9871: Prevent IDLE 3 crash when given byte stings
- with invalid hex escape sequences, like b'\x0'.
- (Original patch by Claudiu Popa.)
-- Issue #8933: distutils' PKG-INFO files will now correctly report
- Metadata-Version: 1.1 instead of 1.0 if a Classifier or Download-URL field is
- present.
+What's New in Python 3.3.0 Release Candidate 2?
+===============================================
-- Issue #9561: distutils now reads and writes egg-info files using UTF-8,
- instead of the locale encoding.
+*Release date: 09-Sep-2012*
-- Issue #12888: Fix a bug in HTMLParser.unescape that prevented it to escape
- more than 128 entities. Patch by Peter Otten.
+Core and Builtins
+-----------------
-- Issue #12878: Expose a __dict__ attribute on io.IOBase and its subclasses.
+- Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
+ sporadic crashes in multi-thread programs when several long deallocator chains
+ ran concurrently and involved subclasses of built-in container types.
-- Issue #12636: IDLE reads the coding cookie when executing a Python script.
+- Issue #15784: Modify `OSError`.__str__() to better distinguish between errno
+ error numbers and Windows error numbers.
-- Issue #12847: Fix a crash with negative PUT and LONG_BINPUT arguments in
- the C pickle implementation.
+- Issue #15781: Fix two small race conditions in import's module locking.
-- Issue #11564: Avoid crashes when trying to pickle huge objects or containers
- (more than 2**31 items). Instead, in most cases, an OverflowError is raised.
+Library
+-------
-- Issue #12287: Fix a stack corruption in ossaudiodev module when the FD is
- greater than FD_SETSIZE.
+- Issue #15847: Fix a regression in argparse, which did not accept tuples as
+ argument lists anymore.
-- Issue #11657: Fix sending file descriptors over 255 over a multiprocessing
- Pipe.
+- Issue #15828: Restore support for C extensions in `imp.load_module()`.
-- Issue #13007: whichdb should recognize gdbm 1.9 magic numbers.
+- Issue #15340: Fix importing the random module when ``/dev/urandom`` cannot be
+ opened. This was a regression caused by the hash randomization patch.
-- Issue #12213: Fix a buffering bug with interleaved reads and writes that
- could appear on BufferedRandom streams.
+- Issue #10650: Deprecate the watchexp parameter of the `Decimal.quantize()`
+ method.
-- Issue #12650: Fix a race condition where a subprocess.Popen could leak
- resources (FD/zombie) when killed at the wrong time.
+- Issue #15785: Modify `window.get_wch()` API of the curses module: return a
+ character for most keys, and an integer for special keys, instead of always
+ returning an integer. So it is now possible to distinguish special keys like
+ keypad keys.
-- Issue #10860: http.client now correctly handles an empty port after port
- delimiter in URLs.
+- Issue #14223: Fix `window.addch()` of the curses module for special characters
+ like curses.ACS_HLINE: the Python function addch(int) and addch(bytes) is now
+ calling the C function waddch()/mvwaddch() (as it was done in Python 3.2),
+ instead of wadd_wch()/mvwadd_wch(). The Python function addch(str) is still
+ calling the C function wadd_wch()/mvwadd_wch() if the Python curses is linked
+ to libncursesw.
Build
-----
-- Issue #6807: Run msisupport.mak earlier.
-
-- Issue #10580: Minor grammar change in Windows installer.
-
-- Issue #13326: Clean __pycache__ directories correctly on OpenBSD.
-
-Tools/Demos
------------
-
-- Issue #14053: patchcheck.py ("make patchcheck") now works with MQ patches.
- Patch by Francisco Martín Brugué.
-
-- Issue #13930: 2to3 is now able to write its converted output files to another
- directory tree as well as copying unchanged files and altering the file
- suffix. See its new -o, -W and --add-suffix options. This makes it more
- useful in many automated code translation workflows.
-
-- Issue #13628: python-gdb.py is now able to retrieve more frames in the Python
- traceback if Python is optimized.
-
-Tests
------
-
-- Issue #11689: Fix a variable scoping error in an sqlite3 test
-
-- Issue #13786: Remove unimplemented 'trace' long option from regrtest.py.
-
-- Issue #13725: Fix regrtest to recognize the documented -d flag.
- Patch by Erno Tukia.
-
-- Issue #13304: Skip test case if user site-packages disabled (-s or
- PYTHONNOUSERSITE). (Patch by Carl Meyer)
-
-- Issue #13218: Fix test_ssl failures on Debian/Ubuntu.
-
-- Issue #12821: Fix test_fcntl failures on OpenBSD 5.
-
-- Re-enable lib2to3's test_parser.py tests, though with an expected failure
- (see issue 13125).
-
-Extension Modules
------------------
-
-- Issue #13840: The error message produced by ctypes.create_string_buffer
- when given a Unicode string has been fixed.
-
-- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
- Vilmos Nebehaj.
-
-- Issue #13159: FileIO and BZ2File now use a linear-time buffer growth
- strategy instead of a quadratic-time one.
-
-- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
- would be finalized after the reference to its underlying BufferedRWPair's
- writer got cleared by the GC.
-
-- Issue #12881: ctypes: Fix segfault with large structure field names.
-
-- Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by
- Thomas Jarosch.
-
-- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
- Thanks to Suman Saha for finding the bug and providing a patch.
-
-- Issue #13022: Fix: _multiprocessing.recvfd() doesn't check that
- file descriptor was actually received.
-
-- Issue #12483: ctypes: Fix a crash when the destruction of a callback
- object triggers the garbage collector.
-
-- Issue #12950: Fix passing file descriptors in multiprocessing, under
- OpenIndiana/Illumos.
+- Issue #15822: Really ensure 2to3 grammar pickles are properly installed
+ (replaces fixes for Issue #15645).
Documentation
-------------
-- Issues #13491 and #13995: Fix many errors in sqlite3 documentation.
- Initial patch for #13491 by Johannes Vogel.
-
-- Issue #13402: Document absoluteness of sys.executable.
-
-- Issue #13883: PYTHONCASEOK also used on OS X and OS/2.
+- Issue #15814: The memoryview enhancements in 3.3.0 accidentally permitted the
+ hashing of multi-dimensional memorviews and memoryviews with multi-byte item
+ formats. The intended restrictions have now been documented - they will be
+ correctly enforced in 3.3.1.
-- Issue #12949: Document the kwonlyargcount argument for the PyCode_New
- C API function.
-
-- Issue #2134: The tokenize documentation has been clarified to explain why
- all operator and delimiter tokens are treated as token.OP tokens.
-
-- Issue #13513: Fix io.IOBase documentation to correctly link to the
- io.IOBase.readline method instead of the readline module.
-- Issue #13237: Reorganise subprocess documentation to emphasise convenience
- functions and the most commonly needed arguments to Popen.
-
-- Issue #13141: Demonstrate recommended style for socketserver examples.
-
-
-What's New in Python 3.2.2?
-===========================
-
-*Release date: 03-Sep-2011*
-
-Core and Builtins
------------------
-
-- Issue #12326: sys.platform is now always 'linux2' on Linux, even if Python
- is compiled on Linux 3.
-
-- Accept bytes for the AST string type. This is temporary until a proper fix in
- 3.3.
-
-Library
--------
-
-- Issue #8286: The distutils command sdist will print a warning message instead
- of crashing when an invalid path is given in the manifest template.
-
-- Issue #12841: tarfile unnecessarily checked the existence of numerical user
- and group ids on extraction. If one of them did not exist the respective id
- of the current user (i.e. root) was used for the file and ownership
- information was lost.
-
-- Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi
- now respect a --skip-build option given to bdist.
-
-- Issue #12839: Fix crash in zlib module due to version mismatch.
- Fix by Richard M. Tew.
-
-Extension Modules
------------------
-
-- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
- some functions like file.write().
-
-
-
-What's New in Python 3.2.2 release candidate 1?
+What's New in Python 3.3.0 Release Candidate 1?
===============================================
-*Release date: 14-Aug-2011*
+*Release date: 25-Aug-2012*
Core and Builtins
-----------------
-- Issue #12732: In narrow unicode builds, allow Unicode identifiers which fall
- outside the BMP.
+- Issue #15573: memoryview comparisons are now performed by value with full
+ support for any valid struct module format definition.
-- Issue #11603: Fix a crash when __str__ is rebound as __repr__. Patch by
- Andreas Stührk.
+- Issue #15316: When an item in the fromlist for `__import__()` doesn't exist,
+ don't raise an error, but if an exception is raised as part of an import do
+ let that propagate.
-- Issue #11321: Fix a crash with multiple imports of the _pickle module when
- embedding Python. Patch by Andreas Stührk.
+- Issue #15778: Ensure that ``str(ImportError(msg))`` returns a str even when
+ msg isn't a str.
-- Verify the types of AST strings and identifiers provided by the user before
- compiling them.
+- Issue #2051: Source file permission bits are once again correctly copied to
+ the cached bytecode file. (The migration to importlib reintroduced this
+ problem because these was no regression test. A test has been added as part of
+ this patch)
-- Issue #12579: str.format_map() now raises a ValueError if used on a
- format string that contains positional fields. Initial patch by
- Julian Berman.
+- Issue #15761: Fix crash when ``PYTHONEXECUTABLE`` is set on Mac OS X.
-- Issue #11627: Fix segfault when __new__ on a exception returns a
- non-exception class.
+- Issue #15726: Fix incorrect bounds checking in PyState_FindModule. Patch by
+ Robin Schreiber.
-- Issue #12149: Update the method cache after a type's dictionary gets
- cleared by the garbage collector. This fixes a segfault when an instance
- and its type get caught in a reference cycle, and the instance's
- deallocator calls one of the methods on the type (e.g. when subclassing
- IOBase). Diagnosis and patch by Davide Rizzo.
-
-- When a generator yields, do not retain the caller's exception state on the
- generator.
+- Issue #15604: Update uses of `PyObject_IsTrue()` to check for and handle
+ errors correctly. Patch by Serhiy Storchaka.
-- Issue #12475: Prevent generators from leaking their exception state into the
- caller's frame as they return for the last time.
+- Issue #14846: `importlib.FileFinder` now handles the case where the directory
+ being searched is removed after a previous import attempt.
Library
-------
-- Issue #11513: Fix exception handling ``tarfile.TarFile.gzopen()`` when
- the file cannot be opened.
+- Issue #13370: Ensure that ctypes works on Mac OS X when Python is compiled
+ using the clang compiler.
-- Issue #12687: Fix a possible buffering bug when unpickling text mode
- (protocol 0, mostly) pickles.
-
-- Issue #10087: Fix the html output format of the calendar module.
+- Issue #13072: The array module's 'u' format code is now deprecated and will be
+ removed in Python 4.0.
-- Issue #12540: Prevent zombie IDLE processes on Windows due to changes
- in os.kill().
-
-- Issue #12683: urlparse updated to include svn as schemes that uses relative
- paths. (svn from 1.5 onwards support relative path).
-
-- Issues #11104, #8688: Fix the behavior of distutils' sdist command with
- manually-maintained MANIFEST files.
-
-- Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow
- symlinks: fix it. Patch by Petri Lehtinen.
-
-- Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod')
- in Python code) now finds the doc of the method.
-
-- Issue #12603: Fix pydoc.synopsis() on files with non-negative st_mtime.
-
-- Issue #12514: Use try/finally to assure the timeit module restores garbage
- collections when it is done.
-
-- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
- given as a low fd, it gets overwritten.
-
-- Issue #12590: IDLE editor window now always displays the first line
- when opening a long file. With Tk 8.5, the first line was hidden.
-
-- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscates)
- Connection:close header.
-
-- Issue #1813: Fix codec lookup under Turkish locales.
+- Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
-- Issue #12591: Improve support of "universal newlines" in the subprocess
- module: the piped streams can now be properly read from or written to.
+- Issue #15776: Allow pyvenv to work in existing directory with --clean.
-- Issue #12591: Allow io.TextIOWrapper to work with raw IO objects (without
- a read1() method), and add an undocumented *write_through* parameter to
- mandate unbuffered writes.
+- Issue #15249: email's BytesGenerator now correctly mangles From lines (when
+ requested) even if the body contains undecodable bytes.
-- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.
+- Issue #15777: Fix a refleak in _posixsubprocess.
-- Issue #10883: Fix socket leaks in urllib.request when using FTP.
+- Issue ##665194: Update `email.utils.localtime` to use datetime.astimezone and
+ correctly handle historic changes in UTC offsets.
-- Issue #12571: Add a plat-linux3 directory mirroring the plat-linux2
- directory, so that "import DLFCN" and other similar imports work on
- Linux 3.0.
+- Issue #15199: Fix JavaScript's default MIME type to application/javascript.
+ Patch by Bohuslav Kabrda.
-- Issue #7484: smtplib no longer puts <> around addresses in VRFY and EXPN
- commands; they aren't required and in fact postfix doesn't support that form.
+- Issue #12643: `code.InteractiveConsole` now respects `sys.excepthook` when
+ displaying exceptions. Patch by Aaron Iles.
-- Close the call queue in concurrent.futures.ProcessPoolExecutor when
- shutdown() is called, without waiting for the garbage collector to kick in.
+- Issue #13579: `string.Formatter` now understands the 'a' conversion specifier.
-- Issue #12502: asyncore: fix polling loop with AF_UNIX sockets.
+- Issue #15595: Fix ``subprocess.Popen(universal_newlines=True)`` for certain
+ locales (utf-16 and utf-32 family). Patch by Chris Jerdonek.
-- Issue #4376: ctypes now supports nested structures with an endianness
- different than that of the parent structure. Patch by Vlad Riscutia.
+- Issue #15477: In cmath and math modules, add workaround for platforms whose
+ system-supplied log1p function doesn't respect signs of zeros.
-- Raise ValueError when attempting to set the _CHUNK_SIZE attribute of a
- TextIOWrapper to a huge value, not TypeError.
+- Issue #15715: `importlib.__import__()` will silence an ImportError when the
+ use of fromlist leads to a failed import.
-- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
- if the process has only one pipe.
+- Issue #14669: Fix pickling of connections and sockets on Mac OS X by
+ sending/receiving an acknowledgment after file descriptor transfer.
+ TestPicklingConnection has been reenabled for Mac OS X.
-- Issue #12451: pydoc: html_getfile() now uses tokenize.open() to support
- Python modules using a encoding different than UTF-8 (reading the coding
- cookie of the module).
+- Issue #11062: Fix adding a message from file to Babyl mailbox.
-- Issue #12451: pydoc: importfile() now opens the Python module in binary mode,
- instead of text mode using the locale encoding, to avoid encoding issues.
+- Issue #15646: Prevent equivalent of a fork bomb when using `multiprocessing`
+ on Windows without the ``if __name__ == '__main__'`` idiom.
-- Issue #12451: runpy: run_path() now opens the Python module in binary mode,
- instead of text mode using the locale encoding, to support other encodings
- than UTF-8 (modules using the coding cookie).
+- Issue #15678: Fix IDLE menus when started from OS X command line (3.3.0b2
+ regression).
-- Issue #12451: xml.dom.pulldom: parse() now opens files in binary mode instead
- of the text mode (using the locale encoding) to avoid encoding issues.
-
-- Issue #14443: Ensure that .py files are byte-compiled with the correct Python
- executable within bdist_rpm even on older versions of RPM
+C API
+-----
Extension Modules
-----------------
-- Issue #12764: Fix a crash in ctypes when the name of a Structure field is not
- a string.
-
-- Issue #11241: subclasses of ctypes.Array can now be subclassed.
-
-- Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
- signature. Without this, architectures where sizeof void* != sizeof int are
- broken. Patch given by Hallvard B Furuseth.
-
-C-API
------
-
-Build
------
-
-- Issue #12560: Build libpython.so on OpenBSD. Patch by Stefan Sperling.
-
-- Issue #12592: Make Python build on OpenBSD 5 (and future major releases).
-
-- Issue #12372: POSIX semaphores are broken on AIX: don't use them.
-
Tools/Demos
-----------
-- Issue #10639: reindent.py no longer converts newlines and will raise
- an error if attempting to convert a file with mixed newlines.
-
-Tests
------
-
-- Issue #12331: The test suite for lib2to3 can now run from an installed
- Python.
-
-- Issue #12626: In regrtest, allow to filter tests using a glob filter
- with the ``-m`` (or ``--match``) option. This works with all test cases
- using the unittest module. This is useful with long test suites
- such as test_io or test_subprocess.
-
-- Issue #12624: It is now possible to fail after the first failure when
- running in verbose mode (``-v`` or ``-W``), by using the ``--failfast``
- (or ``-G``) option to regrtest. This is useful with long test suites
- such as test_io or test_subprocess.
-
-- Issue #12587: Correct faulty test file and reference in test_tokenize.
- (Patch by Robert Xiao)
-
-- Try harder to reap dangling threads in test.support.reap_threads().
-
-- Issue #12573: Add resource checks for dangling Thread and Process objects.
-
-- Issue #12549: Correct test_platform to not fail when OS X returns 'x86_64'
- as the processor type on some Mac systems.
-
-- Avoid failing in test_robotparser when mueblesmoraleda.com is flaky and
- an overzealous DNS service (e.g. OpenDNS) redirects to a placeholder
- Web site.
-
-- Issue #12440: When testing whether some bits in SSLContext.options can be
- reset, check the version of the OpenSSL headers Python was compiled against,
- rather than the runtime version of the OpenSSL library.
-
-- Issue #12497: Install test/data to prevent failures of the various codecmaps
- tests.
-
-- Issue #12496: Install test/capath directory to prevent test_connect_capath
- testcase failure in test_ssl.
-
-- Issue #12469: Run "wakeup" signal tests in subprocess to run the test in a
- fresh process with only one thread and to not change signal handling of the
- parent process.
+Documentation
+-------------
-- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
- test_tk or test_ttk_guionly under a username that is not currently logged
- in to the console windowserver (as may be the case under buildbot or ssh).
+- Issue #14674: Add a discussion of the `json` module's standard compliance.
+ Patch by Chris Rebert.
+- Create a 'Concurrent Execution' section in the docs, and split up the
+ 'Optional Operating System Services' section to use a more user-centric
+ classification scheme (splitting them across the new CE section, IPC and text
+ processing). Operating system limitatons can be reflected with the Sphinx
+ ``:platform:`` tag, it doesn't make sense as part of the Table of Contents.
-What's New in Python 3.2.1?
-===========================
+- Issue #4966: Bring the sequence docs up to date for the Py3k transition and
+ the many language enhancements since they were original written.
-*Release date: 10-Jul-2011*
+- The "path importer" misnomer has been replaced with Eric Snow's
+ more-awkward-but-at-least-not-wrong suggestion of "path based finder" in the
+ import system reference docs.
-Library
--------
+- Issue #15640: Document `importlib.abc.Finder` as deprecated.
-- Issue #12467: warnings: fix a race condition if a warning is emitted at
- shutdown, if globals()['__file__'] is None.
+- Issue #15630: Add an example for "continue" stmt in the tutorial. Patch by
+ Daniel Ellis.
Tests
-----
-- Skip network tests when getaddrinfo() returns EAI_AGAIN, meaning a temporary
- failure in name resolution.
-
-- Issue #11812: Solve transient socket failure to connect to 'localhost'
- in test_telnetlib.py.
-
-- Solved a potential deadlock in test_telnetlib.py. Related to issue #11812.
-
-- Avoid failing in test_urllibnet.test_bad_address when some overzealous
- DNS service (e.g. OpenDNS) resolves a non-existent domain name. The test
- is now skipped instead.
-
-
-What's New in Python 3.2.1 release candidate 2?
-===============================================
-
-*Release date: 03-Jul-2011*
-
-Core and Builtins
------------------
-
-- Issue #12291: You can now load multiple marshalled objects from a stream, with
- other data interleaved between marshalled objects.
-
-- Issue #12084: os.stat on Windows now works properly with relative symbolic
- links when called from any directory.
-
-- Issue #1195: my_fgets() now always clears errors before calling fgets(). Fix
- the following case: sys.stdin.read() stopped with CTRL+d (end of file),
- raw_input() interrupted by CTRL+c.
-
-- Issue #9670: Increase the default stack size for secondary threads on Mac OS X
- and FreeBSD to reduce the chances of a crash instead of a "maximum recursion
- depth" RuntimeError exception (patch by Ronald Oussoren).
-
-Library
--------
-
-- Issue #12147: Adjust the new-in-3.2 smtplib.send_message method for better
- conformance to the RFCs: correctly handle Sender and Resent headers.
-
-- Issue #12352: Fix a deadlock in multiprocessing.Heap when a block is freed by
- the garbage collector while the Heap lock is held.
-
-- Issue #12451: The XInclude default loader of xml.etree now decodes files from
- UTF-8 instead of the locale encoding if the encoding is not specified. It now
- also opens XML files for the parser in binary mode instead of the text mode to
- avoid encoding issues.
-
-- Issue #12451: doctest.debug_script() doesn't create a temporary file anymore
- to avoid encoding issues.
-
-- Issue #12451: pydoc.synopsis() now reads the encoding cookie if available, to
- read the Python module from the right encoding.
-
-- Issue #12451: distutils now opens the setup script in binary mode to read the
- encoding cookie, instead of opening it in UTF-8.
-
-- Issue #9516: On Mac OS X, change Distutils to no longer globally attempt to
- check or set the MACOSX_DEPLOYMENT_TARGET environment variable for the
- interpreter process. This could cause failures in non-Distutils subprocesses
- and was unreliable since tests or user programs could modify the interpreter
- environment after Distutils set it. Instead, have Distutils set the the
- deployment target only in the environment of each build subprocess. It is
- still possible to globally override the default by setting
- MACOSX_DEPLOYMENT_TARGET before launching the interpreter; its value must be
- greater or equal to the default value, the value with which the interpreter
- was built.
-
-- Issue #12383: Fix subprocess module with env={}: don't copy the environment
- variables, start with an empty environment.
-
-- Issue #11584: email.header.decode_header no longer fails if the header passed
- to it is a Header object, and Header/make_header no longer fail if given
- binary unknown-8bit input.
-
-- Issue #11700: mailbox proxy object close methods can now be called multiple
- times without error.
-
-- Issue #11767: Correct file descriptor leak in mailbox's __getitem__ method.
-
-- Issue #12133: AbstractHTTPHandler.do_open() of urllib.request closes the HTTP
- connection if its getresponse() method fails with a socket error. Patch
- written by Ezio Melotti.
-
-- Issue #9284: Allow inspect.findsource() to find the source of doctest
- functions.
-
-- Issue #12009: Fixed regression in netrc file comment handling.
-
-- Issue #10694: zipfile now ignores garbage at the end of a zipfile.
-
-- Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA.
-
-- Issue #12168: SysLogHandler now allows NUL termination to be controlled using
- a new 'append_nul' attribute on the handler.
-
-- Issue #11583: Speed up os.path.isdir on Windows by using GetFileAttributes
- instead of os.stat.
-
-- Named tuples now work correctly with vars().
-
-- Issue #12085: Fix an attribute error in subprocess.Popen destructor if the
- constructor has failed, e.g. because of an undeclared keyword argument. Patch
- written by Oleg Oshmyan.
-
-- Issue #985064: Make plistlib more resilient to faulty input plists. Patch by
- Mher Movsisyan.
-
-- Issue #12175: RawIOBase.readall() now returns None if read() returns None.
-
-- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
- if the file is closed.
-
-- Issue #12070: Fix the Makefile parser of the sysconfig module to handle
- correctly references to "bogus variable" (e.g. "prefix=$/opt/python").
-
-- Issue #12100: Don't reset incremental encoders of CJK codecs at each call to
- their encode() method anymore, but continue to call the reset() method if the
- final argument is True.
-
-- Issue #5715: In socketserver, close the server socket in the child process.
-
-- Correct lookup of __dir__ on objects. Among other things, this causes errors
- besides AttributeError found on lookup to be propagated.
-
-- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
- to be able to unload the module.
-
-- Issue #12065: connect_ex() on an SSL socket now returns the original errno
- when the socket's timeout expires (it used to return None).
+- Issue #15747: ZFS always returns EOPNOTSUPP when attempting to set the
+ UF_IMMUTABLE flag (via either chflags or lchflags); refactor affected tests in
+ test_posix.py to account for this.
-Extension Modules
------------------
+- Issue #15285: Refactor the approach for testing connect timeouts using two
+ external hosts that have been configured specifically for this type of test.
-- Issue #12404: Remove C89 incompatible code from mmap module. Patch by Akira
- Kitada.
+- Issue #15743: Remove the deprecated method usage in `urllib` tests. Patch by
+ Jeff Knupp.
-- Issue #12221: Replace pyexpat.__version__ with the Python version.
+- Issue #15615: Add some tests for the `json` module's handling of invalid input
+ data. Patch by Kushal Das.
Build
-----
-- Issue #8746: Correct faulty configure checks so that os.chflags() and
- os.lchflags() are once again built on systems that support these functions
- (*BSD and OS X). Also add new stat file flags for OS X (UF_HIDDEN and
- UF_COMPRESSED).
-
-- Issue #11217: For 64-bit/32-bit Mac OS X universal framework builds, ensure
- "make install" creates symlinks in --prefix bin for the "-32" files in the
- framework bin directory like the installer does.
-
-
-Tests
------
-
-- Issue #12407: Explicitly skip test_capi.EmbeddingTest under Windows.
+- Output lib files for PGO build into PGO directory.
-- Issue #12400: regrtest -W doesn't rerun the tests twice anymore, but captures
- the output and displays it on failure instead. regrtest -v doesn't print the
- error twice anymore if there is only one error.
+- Pick up 32-bit launcher from PGO directory on 64-bit PGO build.
-- Issue #12141: Install a copy of template C module file so that test_build_ext
- of test_distutils is no longer silently skipped when run outside of a build
- directory.
+- Drop ``PC\python_nt.h`` as it's not used. Add input dependency on custom
+ build step.
-- Issue #8746: Add additional tests for os.chflags() and os.lchflags(). Patch
- by Garrett Cooper.
+- Issue #15511: Drop explicit dependency on pythonxy.lib from _decimal amd64
+ configuration.
-- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9 on Mac
- OS X. (Patch by Ronald Oussoren)
+- Add missing PGI/PGO configurations for pywlauncher.
-- Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2,
- iso2022_kr).
+- Issue #15645: Ensure 2to3 grammar pickles are properly installed.
-What's New in Python 3.2.1 release candidate 1?
-===============================================
+What's New in Python 3.3.0 Beta 2?
+==================================
-*Release date: 15-May-2011*
+*Release date: 12-Aug-2012*
Core and Builtins
-----------------
-- Issue #12060: Use sig_atomic_t type and volatile keyword in the signal
- module. Patch written by Charles-François Natali.
-
-- Issue #12044: Fixed subprocess.Popen when used as a context manager to
- wait for the process to end when exiting the context to avoid unintentionally
- leaving zombie processes around.
-
-- Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c,
- clear the end-of-file indicator after CTRL+d.
-
-Library
--------
-
-- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX
- with Tk 8.5.
-
-- Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET
- is set in shell.
-
-- Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional.
-
-- Issue #8650: Make zlib module 64-bit clean. compress(), decompress() and
- their incremental counterparts now raise OverflowError if given an input
- larger than 4GB, instead of silently truncating the input and returning
- an incorrect result.
-
-- Issue #12050: zlib.decompressobj().decompress() now clears the unconsumed_tail
- attribute when called without a max_length argument.
-
-- Issue #12062: Fix a flushing bug when doing a certain type of I/O sequence
- on a file opened in read+write mode (namely: reading, seeking a bit forward,
- writing, then seeking before the previous write but still within buffered
- data, and writing again).
-
-- Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
- With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused
- IDLE to exit. Converted to valid Unicode null in PythonCmd().
-
-- Issue #11169: compileall module uses repr() to format filenames and paths to
- escape surrogate characters and show spaces.
-
-- Issue #10419, #6011: build_scripts command of distutils handles correctly
- non-ASCII path (path to the Python executable). Open and write the script in
- binary mode, but ensure that the shebang is decodable from UTF-8 and from the
- encoding of the script.
-
-- Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
- order to accept exactly one connection. Patch by Daniel Evers.
-
-- Issue #11164: Stop trying to use _xmlplus in the xml module.
-
-Build
------
+- Issue #15568: Fix the return value of ``yield from`` when StopIteration is
+ raised by a custom iterator.
-- Issue #11347: Use --no-as-needed when linking libpython3.so.
-
-Tools/Demos
------------
-
-- Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and
- add a smarter "py-bt" command printing a classic Python traceback.
-
-Tests
------
+- Issue #13119: `sys.stdout` and `sys.stderr` are now using "\r\n" newline on
+ Windows, as Python 2.
-- Issue #12096: Fix a race condition in test_threading.test_waitfor(). Patch
- written by Charles-François Natali.
+- Issue #15534: Fix the fast-search function for non-ASCII Unicode strings.
-- Issue #11614: import __hello__ prints "Hello World!". Patch written by
- Andreas Stührk.
+- Issue #15508: Fix the docstring for `__import__()` to have the proper default
+ value of 0 for 'level' and to not mention negative levels since they are not
+ supported.
-- Issue #5723: Improve json tests to be executed with and without accelerations.
+- Issue #15425: Eliminated traceback noise from more situations involving
+ importlib.
-- Issue #11910: Fix test_heapq to skip the C tests when _heapq is missing.
+- Issue #14578: Support modules registered in the Windows registry again.
+- Issue #15466: Stop using TYPE_INT64 in marshal, to make importlib.h (and other
+ byte code files) equal between 32-bit and 64-bit systems.
-What's New in Python 3.2.1 beta 1?
-==================================
+- Issue #1692335: Move initial exception args assignment to
+ `BaseException.__new__()` to help pickling of naive subclasses.
-*Release date: 08-May-2011*
+- Issue #12834: Fix `PyBuffer_ToContiguous()` for non-contiguous arrays.
-Core and Builtins
------------------
+- Issue #15456: Fix code `__sizeof__()` after #12399 change. Patch by Serhiy
+ Storchaka.
-- Issue #1856: Avoid crashes and lockups when daemon threads run while the
- interpreter is shutting down; instead, these threads are now killed when they
- try to take the GIL.
+- Issue #15404: Refleak in PyMethodObject repr.
-- Issue #9756: When calling a method descriptor or a slot wrapper descriptor,
- the check of the object type doesn't read the __class__ attribute anymore.
- Fix a crash if a class override its __class__ attribute (e.g. a proxy of the
- str type). Patch written by Andreas Stührk.
+- Issue #15394: An issue in `PyModule_Create()` that caused references to be
+ leaked on some error paths has been fixed. Patch by Julia Lawall.
-- Issue #10914: Initialize correctly the filesystem codec when creating a new
- subinterpreter to fix a bootstrap issue with codecs implemented in Python, as
- the ISO-8859-15 codec.
+- Issue #15368: An issue that caused bytecode generation to be non-deterministic
+ has been fixed.
-- Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
- APIs, to avoid a crash with the pthread implementation in RHEL 5. Patch by
- Charles-François Natali.
+- Issue #15202: Consistently use the name "follow_symlinks" for new parameters
+ in os and shutil functions.
-- Issue #6780: fix starts/endswith error message to mention that tuples are
- accepted too.
+- Issue #15314: ``__main__.__loader__`` is now set correctly during interpreter
+ startup.
-- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
- between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP chars
- (e.g. "\U00012345"[0]).
+- Issue #15111: When a module imported using 'from import' has an ImportError
+ inside itself, don't mask that fact behind a generic ImportError for the
+ module itself.
-- Issue #11845: Fix typo in rangeobject.c that caused a crash in
- compute_slice_indices. Patch by Daniel Urban.
+- Issue #15293: Add GC support to the AST base node type.
-- Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted
- (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch
- written by Charles-Francois Natali.
+- Issue #15291: Fix a memory leak where AST nodes where not properly
+ deallocated.
-- Issue #11395: io.FileIO().write() clamps the data length to 32,767 bytes on
- Windows if the file is a TTY to workaround a Windows bug. The Windows console
- returns an error (12: not enough space error) on writing into stdout if stdout
- mode is binary and the length is greater than 66,000 bytes (or less, depending
- on heap usage).
+- Issue #15110: Fix the tracebacks generated by "import xxx" to not show the
+ importlib stack frames.
-- Issue #11320: fix bogus memory management in Modules/getpath.c, leading to a
- possible crash when calling Py_SetPath().
-
-- Issue #11510: Fixed optimizer bug which turned "a,b={1,1}" into "a,b=(1,1)".
-
-- Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
- 3.2.0 where the stdout or stderr file descriptor being the same as the stdin
- file descriptor would raise an exception. webbrowser.open would fail. fixed.
-
-- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when there
- are many tags (e.g. when using mq). Patch by Nadeem Vawda.
-
-- Issue #11246: Fix PyUnicode_FromFormat("%V") to decode the byte string from
- UTF-8 (with replace error handler) instead of ISO-8859-1 (in strict mode).
- Patch written by Ray Allen.
-
-- Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with a
- buffer struct having a NULL data pointer.
+- Issue #16369: Global PyTypeObjects not initialized with PyType_Ready(...).
-- Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
- sys.stdin uses universal newline (replace '\r\n' by '\n').
+- Issue #15020: The program name used to search for Python's path is now
+ "python3" under Unix, not "python".
-- issue #11828: startswith and endswith don't accept None as slice index. Patch
- by Torsten Becker.
+- Issue #15897: zipimport.c doesn't check return value of fseek().
+ Patch by Felipe Cruz.
-- Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
- narrow build.
+- Issue #15033: Fix the exit status bug when modules invoked using -m switch,
+ return the proper failure return value (1). Patch contributed by Jeff Knupp.
-- Check for NULL result in PyType_FromSpec.
+- Issue #15229: An `OSError` subclass whose __init__ doesn't call back
+ OSError.__init__ could produce incomplete instances, leading to crashes when
+ calling str() on them.
-- Issue #11386: bytearray.pop() now throws IndexError when the bytearray is
- empty, instead of OverflowError.
+- Issue #15307: Virtual environments now use symlinks with framework builds on
+ Mac OS X, like other POSIX builds.
Library
-------
-- Issue #11927: SMTP_SSL now uses port 465 by default as documented. Patch by
- Kasun Herath.
-
-- Issue #12002: ftplib's abort() method raises TypeError.
-
-- Issue #11999: fixed sporadic sync failure mailbox.Maildir due to its trying to
- detect mtime changes by comparing to the system clock instead of to the
- previous value of the mtime.
-
-- ntpath.samefile failed to notice that "a.txt" and "A.TXT" refer to the same
- file on Windows XP. As noticed in issue #10684.
+- Issue #15424: Add a `__sizeof__()` implementation for array objects. Patch by
+ Ludwig Hähne.
-- Issue #12000: When a SSL certificate has a subjectAltName without any dNSName
- entry, ssl.match_hostname() should use the subject's commonName. Patch by
- Nicolas Bareil.
+- Issue #15576: Allow extension modules to act as a package's __init__ module.
-- Issue #11647: objects created using contextlib.contextmanager now support more
- than one call to the function when used as a decorator. Initial patch by Ysj
- Ray.
+- Issue #15502: Have `importlib.invalidate_caches()` work on `sys.meta_path`
+ instead of `sys.path_importer_cache`.
-- logging: don't define QueueListener if Python has no thread support.
+- Issue #15163: Pydoc shouldn't list __loader__ as module data.
-- functools.cmp_to_key() now works with collections.Hashable().
+- Issue #15471: Do not use mutable objects as defaults for
+ `importlib.__import__()`.
-- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get
- around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.
+- Issue #15559: To avoid a problematic failure mode when passed to the bytes
+ constructor, objects in the ipaddress module no longer implement `__index__()`
+ (they still implement `__int__()` as appropriate).
-- Issue #11858: configparser.ExtendedInterpolation expected lower-case section
- names.
+- Issue #15546: Fix handling of pathological input data in the peek() and
+ read1() methods of the BZ2File, GzipFile and LZMAFile classes.
-- Issue #11324: ConfigParser(interpolation=None) now works correctly.
-
-- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
- strings are too long.
-
-- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.
-
-- Issue #11768: The signal handler of the signal module only calls
- Py_AddPendingCall() for the first signal to fix a deadlock on reentrant or
- parallel calls. PyErr_SetInterrupt() writes also into the wake up file.
-
-- Issue #11492: fix several issues with header folding in the email package.
-
-- Issue #11852: Add missing imports and update tests.
+- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog
+ ended with ``\``. Patch by Roger Serwy.
-- Issue #11875: collections.OrderedDict's __reduce__ was temporarily
- mutating the object instead of just working on a copy.
+- Issue #12655: Instead of requiring a custom type, `os.sched_getaffinity()` and
+ `os.sched_setaffinity()` now use regular sets of integers to represent the
+ CPUs a process is restricted to.
-- Issue #11467: Fix urlparse behavior when handling urls which contains scheme
- specific part only digits. Patch by Santoso Wijaya.
+- Issue #15538: Fix compilation of the `socket.getnameinfo()` /
+ `socket.getaddrinfo()` emulation code. Patch by Philipp Hagemeister.
-- collections.Counter().copy() now works correctly for subclasses.
+- Issue #15519: Properly expose WindowsRegistryFinder in importlib (and use the
+ correct term for it). Original patch by Eric Snow.
-- Issue #11474: Fix the bug with url2pathname() handling of '/C|/' on Windows.
- Patch by Santoso Wijaya.
+- Issue #15502: Bring the importlib ABCs into line with the current state of the
+ import protocols given PEP 420. Original patch by Eric Snow.
-- Issue #9233: Fix json.loads('{}') to return a dict (instead of a list), when
- _json is not available.
+- Issue #15499: Launching a webbrowser in Unix used to sleep for a few seconds.
+ Original patch by Anton Barkovsky.
-- Issue #11830: Remove unnecessary introspection code in the decimal module.
+- Issue #15463: The faulthandler module truncates strings to 500 characters,
+ instead of 100, to be able to display long file paths.
-- Issue #11703: urllib2.geturl() does not return correct url when the original
- url contains #fragment.
+- Issue #6056: Make `multiprocessing` use setblocking(True) on the sockets it
+ uses. Original patch by J Derek Wilson.
-- Issue #10019: Fixed regression in json module where an indent of 0 stopped
- adding newlines and acted instead like 'None'.
+- Issue #15364: Fix sysconfig.get_config_var('srcdir') to be an absolute path.
-- Issue #5162: Treat services like frozen executables to allow child spawning
- from multiprocessing.forking on Windows.
+- Issue #15041: Update "see also" list in tkinter documentation.
-- Issue #11814: Fix likely typo in multiprocessing.Pool._terminate().
+- Issue #15413: `os.times()` had disappeared under Windows.
-- Issue #11747: Fix range formatting in difflib.context_diff() and
- difflib.unified_diff().
+- Issue #15402: An issue in the struct module that caused `sys.getsizeof()` to
+ return incorrect results for struct.Struct instances has been fixed. Initial
+ patch by Serhiy Storchaka.
-- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
- worker processes: new processes would be spawned while the pool is being shut
- down. Patch by Charles-François Natali.
+- Issue #15232: When mangle_from is True, `email.Generator` now correctly
+ mangles lines that start with 'From ' that occur in a MIME preamble or
+ epilogue.
-- Issue #7311: fix html.parser to accept non-ASCII attribute values.
+- Issue #15094: Incorrectly placed #endif in _tkinter.c. Patch by Serhiy
+ Storchaka.
-- Issue #11605: email.parser.BytesFeedParser was incorrectly converting
- multipart subparts with an 8-bit CTE into unicode instead of preserving the
- bytes.
+- Issue #13922: `argparse` no longer incorrectly strips '--'s that appear after
+ the first one.
-- Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
+- Issue #12353: `argparse` now correctly handles null argument values.
-- Issue #11746: Fix SSLContext.load_cert_chain() to accept elliptic curve
- private keys.
-
-- sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not
- called yet: detect bootstrap (startup) issues earlier.
-
-- Issue #11618: Fix the timeout logic in threading.Lock.acquire() under Windows.
-
-- Issue #11256: Fix inspect.getcallargs on functions that take only keyword
- arguments.
-
-- Issue #11696: Fix ID generation in msilib.
-
-- Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when
- trying to pack a negative (in-range) integer.
-
-- Issue #11675: multiprocessing.[Raw]Array objects created from an integer size
- are now zeroed on creation. This matches the behaviour specified by the
- documentation.
-
-- Issue #7639: Fix short file name generation in bdist_msi
-
-- Issue #11659: Fix ResourceWarning in test_subprocess introduced by #11459.
- Patch by Ben Hayden.
-
-- Issue #11635: Don't use polling in worker threads and processes launched by
- concurrent.futures.
+- Issue #10017, issue #14998: Fix TypeError using pprint on dictionaries with
+ user-defined types as keys or other unorderable keys.
-- Issue #11628: cmp_to_key generated class should use __slots__
+- Issue #15397: `inspect.getmodulename()` is now based directly on importlib via
+ a new `importlib.machinery.all_suffixes()` API.
-- Issue #11666: let help() display named tuple attributes and methods
- that start with a leading underscore.
+- Issue #14635: `telnetlib` will use poll() rather than select() when possible to
+ avoid failing due to the select() file descriptor limit.
-- Issue #11662: Make urllib and urllib2 ignore redirections if the
- scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).
+- Issue #15180: Clarify posixpath.join() error message when mixing str & bytes.
-- Issue #5537: Fix time2isoz() and time2netscape() functions of
- httplib.cookiejar for expiration year greater than 2038 on 32-bit systems.
+- Issue #15343: pkgutil now includes an iter_importer_modules implementation for
+ importlib.machinery.FileFinder (similar to the way it already handled
+ zipimport.zipimporter).
-- Issue #11563: Connection:close header is sent by requests using URLOpener
- class which helps in closing of sockets after connection is over. Patch
- contributions by Jeff McNeil and Nadeem Vawda.
+- Issue #15314: runpy now sets __main__.__loader__ correctly.
-- Issue #11459: A ``bufsize`` value of 0 in subprocess.Popen() really creates
- unbuffered pipes, such that select() works properly on them.
+- Issue #15357: The import emulation in pkgutil is now deprecated. pkgutil uses
+ importlib internally rather than the emulation.
-- Issue #5421: Fix misleading error message when one of socket.sendto()'s
- arguments has the wrong type. Patch by Nikita Vetoshkin.
+- Issue #15233: Python now guarantees that callables registered with the atexit
+ module will be called in a deterministic order.
-- Issue #10979: unittest stdout buffering now works with class and module
- setup and teardown.
+- Issue #15238: `shutil.copystat()` now copies Linux "extended attributes".
-- Issue #11577: fix ResourceWarning triggered by improved binhex test coverage
+- Issue #15230: runpy.run_path now correctly sets __package__ as described in
+ the documentation.
-- Issue #11243: fix the parameter querying methods of Message to work if
- the headers contain un-encoded non-ASCII data.
+- Issue #15315: Support VS 2010 in distutils cygwincompiler.
-- Issue #11401: fix handling of headers with no value; this fixes a regression
- relative to Python2 and the result is now the same as it was in Python2.
+- Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested
+ namespace packages.
-- Issue #9298: base64 bodies weren't being folded to line lengths less than 78,
- which was a regression relative to Python2. Unlike Python2, the last line of
- the folded body now ends with a carriage return.
-
-- Issue #11560: shutil.unpack_archive now correctly handles the format
- parameter. Patch by Evan Dandrea.
+- Issue #15056: `imp.cache_from_source()` and `imp.source_from_cache()` raise
+ NotImplementedError when `sys.implementation.cache_tag` is set to None.
-- Issue #11133: fix two cases where inspect.getattr_static can trigger code
- execution. Patch by Andreas Stührk.
+- Issue #15256: Grammatical mistake in exception raised by `imp.find_module()`.
-- Issue #11569: use absolute path to the sysctl command in multiprocessing to
- ensure that it will be found regardless of the shell PATH. This ensures that
- multiprocessing.cpu_count works on default installs of MacOSX.
+- Issue #5931: `wsgiref` environ variable SERVER_SOFTWARE will specify an
+ implementation specific term like CPython, Jython instead of generic "Python".
-- Issue #11501: disutils.archive_utils.make_zipfile no longer fails if zlib is
- not installed. Instead, the zipfile.ZIP_STORED compression is used to create
- the ZipFile. Patch by Natalia B. Bidart.
+- Issue #13248: Remove obsolete argument "max_buffer_size" of BufferedWriter and
+ BufferedRWPair, from the io module.
-- Issue #11554: Fixed support for Japanese codecs; previously the body output
- encoding was not done if euc-jp or shift-jis was specified as the charset.
+- Issue #13248: Remove obsolete argument "version" of `argparse.ArgumentParser`.
-- Issue #11500: Fixed a bug in the os x proxy bypass code for fully qualified IP
- addresses in the proxy exception list.
+- Issue #14814: Implement more consistent ordering and sorting behaviour for
+ ipaddress objects.
-- Issue #11491: dbm.error is no longer raised when dbm.open is called with the
- "n" as the flag argument and the file exists. The behavior matches the
- documentation and general logic.
+- Issue #14814: `ipaddress` network objects correctly return NotImplemented when
+ compared to arbitrary objects instead of raising TypeError.
-- Issue #11131: Fix sign of zero in decimal.Decimal plus and minus operations
- when the rounding mode is ROUND_FLOOR.
+- Issue #14990: Correctly fail with SyntaxError on invalid encoding declaration.
-- Issue #5622: Fix curses.wrapper to raise correct exception if curses
- initialization fails.
+- Issue #14814: `ipaddress` now provides more informative error messages when
+ constructing instances directly (changes permitted during beta due to
+ provisional API status).
-- Issue #11391: Writing to a mmap object created with
- ``mmap.PROT_READ|mmap.PROT_EXEC`` would segfault instead of raising a
- TypeError. Patch by Charles-François Natali.
+- Issue #15247: `io.FileIO` now raises an error when given a file descriptor
+ pointing to a directory.
-- Issue #11306: mailbox in certain cases adapts to an inability to open certain
- files in read-write mode. Previously it detected this by checking for EACCES,
- now it also checks for EROFS.
+- Issue #15261: Stop os.stat(fd) crashing on Windows when fd not open.
-- Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors on
- accept(), send() and recv().
+- Issue #15166: Implement `imp.get_tag()` using `sys.implementation.cache_tag`.
-- Issue #11326: Add the missing connect_ex() implementation for SSL sockets,
- and make it work for non-blocking connects.
+- Issue #15210: Catch KeyError when `importlib.__init__()` can't find
+ _frozen_importlib in sys.modules, not ImportError.
-- Issue #7322: Trying to read from a socket's file-like object after a timeout
- occurred now raises an error instead of silently losing data.
+- Issue #15030: `importlib.abc.PyPycLoader` now supports the new source size
+ header field in .pyc files.
-- Issue #10956: Buffered I/O classes retry reading or writing after a signal
- has arrived and the handler returned successfully.
+- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on
+ flush().
-- Issue #11224: Fixed a regression in tarfile that affected the file-like
- objects returned by TarFile.extractfile() regarding performance, memory
- consumption and failures with the stream interface.
+- Issue #10571: Fix the "--sign" option of distutils' upload command. Patch by
+ Jakub Wilk.
-- Issue #11074: Make 'tokenize' so it can be reloaded.
+- Issue #9559: If messages were only added, a new file is no longer created and
+ renamed over the old file when flush() is called on an mbox, MMDF or Babyl
+ mailbox.
-- Issue #4681: Allow mmap() to work on file sizes and offsets larger than
- 4GB, even on 32-bit builds. Initial patch by Ross Lagerwall, adapted for
- 32-bit Windows.
+- Issue #10924: Fixed `crypt.mksalt()` to use a RNG that is suitable for
+ cryptographic purpose.
-- Issue #11089: Fix performance issue limiting the use of ConfigParser()
- with large config files.
+- Issue #15184: Ensure consistent results of OS X configuration tailoring for
+ universal builds by factoring out common OS X-specific customizations from
+ sysconfig, distutils.sysconfig, distutils.util, and distutils.unixccompiler
+ into a new module _osx_support.
-- Issue #10276: Fix the results of zlib.crc32() and zlib.adler32() on buffers
- larger than 4GB. Patch by Nadeem Vawda.
-
-- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
-
-- Issue #8982: Improve the documentation for the argparse Namespace object.
-
-- Issue #9343: Document that argparse parent parsers must be configured before
- their children.
-
-- Issue #9026: Fix order of argparse sub-commands in help messages.
-
-- Issue #9347: Fix formatting for tuples in argparse type= error messages.
-
-Build
+C API
-----
-- Issue #11411: Fix 'make DESTDIR=' with a relative destination.
+- Issue #15610: `PyImport_ImportModuleEx()` now uses a 'level' of 0 instead of -1.
-- Issue #11268: Prevent Mac OS X Installer failure if Documentation package had
- previously been installed.
-
-IDLE
-----
-
-- Issue #11718: IDLE's open module dialog couldn't find the __init__.py file in
- a package.
-
-Tools/Demos
------------
-
-- Issue #11179: Make ccbench work under Python 3.1 and 2.7 again.
+- Issue #15169, issue #14599: Strip out the C implementation of
+ `imp.source_from_cache()` used by PyImport_ExecCodeModuleWithPathnames() and
+ used the Python code instead. Leads to PyImport_ExecCodeModuleObject() to not
+ try to infer the source path from the bytecode path as
+ PyImport_ExecCodeModuleWithPathnames() does.
Extension Modules
-----------------
-- Issue #12051: Fix segfault in json.dumps() while encoding highly-nested
- objects using the C accelerations.
-
-- Issue #12017: Fix segfault in json.loads() while decoding highly-nested
- objects using the C accelerations.
-
-- Issue #1838: Prevent segfault in ctypes, when _as_parameter_ on a class is set
- to an instance of the class.
-
-Tests
------
-
-- Issue #11873: Change regex in test_compileall to fix occasional failures when
- when the randomly generated temporary path happened to match the regex.
-
-- Issue #10914: Add a minimal embedding test to test_capi.
-
-- Issue #11790: Fix sporadic failures in
- test_multiprocessing.WithProcessesTestCondition.
-
-- Fix possible "file already exists" error when running the tests in parallel.
-
-- Issue #11719: Fix message about unexpected test_msilib skip on non-Windows
- platforms. Patch by Nadeem Vawda.
-
-- Issue #11653: fix -W with -j in regrtest.
-
-- Issue #11577: improve test coverage of binhex.py. Patch by Arkady Koplyarov.
-
-- Issue #11578: added test for the timeit module. Patch by Michael Henry.
-
-- Issue #11503: improve test coverage of posixpath.py. Patch by Evan Dandrea.
-
-- Issue #11505: improves test coverage of string.py. Patch by Alicia
- Arlen.
-
-- Issue #11548: Improve test coverage of the shutil module. Patch by
- Evan Dandrea.
-
-- Issue #11554: Reactivated test_email_codecs.
-
-- Issue #11490: test_subprocess:test_leaking_fds_on_error no longer gives a
- false positive if the last directory in the path is inaccessible.
-
-- Issue #11223: Fix test_threadsignals to fail, not hang, when the
- non-semaphore implementation of locks is used under POSIX.
-
-- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
- Pierre Quentel.
-
-- Issue #9931: Fix hangs in GUI tests under Windows in certain conditions.
- Patch by Hirokazu Yamamoto.
-
-- Issue #10826: Prevent sporadic failure in test_subprocess on Solaris due
- to open door files.
-
-Documentation
--------------
-
-- Issue #11818: Fix tempfile examples for Python 3.
-
-
-What's New in Python 3.2?
-=========================
+- Issue #6493: An issue in ctypes on Windows that caused structure bitfields of
+ type `ctypes.c_uint32` and width 32 to incorrectly be set has been fixed.
-*Release date: 20-Feb-2011*
-
-Core and Builtins
------------------
+- Issue #15194: Update libffi to the 3.0.11 release.
-- Issue #11249: Fix potential crashes when using the limited API.
+Tools/Demos
+-----------
-Build
------
+- Issue #15458: python-config gets a new option --configdir to print the $LIBPL
+ value.
-- Issue #11222: Fix non-framework shared library build on Mac OS X.
+- Move importlib.test.benchmark to Tools/importbench.
-- Issue #11184: Fix large-file support on AIX.
+- Issue #12605: The gdb hooks for debugging CPython (within Tools/gdb) have been
+ enhanced to show information on more C frames relevant to CPython within the
+ "py-bt" and "py-bt-full" commands:
-- Issue #941346: Fix broken shared library build on AIX.
+ * C frames that are waiting on the GIL
+ * C frames that are garbage-collecting
+ * C frames that are due to the invocation of a PyCFunction
Documentation
-------------
-- Issue #10709: Add updated AIX notes in Misc/README.AIX.
+- Issue #15444: Use proper spelling for non-ASCII contributor names. Patch by
+ Serhiy Storchaka.
+- Issue #15295: Reorganize and rewrite the documentation on the import system.
-What's New in Python 3.2 Release Candidate 3?
-=============================================
+- Issue #15230: Clearly document some of the limitations of the runpy module and
+ nudge readers towards importlib when appropriate.
-*Release date: 13-Feb-2011*
-
-Core and Builtins
------------------
+- Issue #15053: Copy Python 3.3 import lock change notice to all relevant
+ functions in imp instead of just at the top of the relevant section.
-- Issue #11134: Add missing fields to typeslots.h.
-
-- Issue #11135: Remove redundant doc field from PyType_Spec.
-
-- Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check in the limited
- ABI.
-
-- Issue #11118: Fix bogus export of None in python3.dll.
-
-Library
--------
-
-- Issue #11116: any error during addition of a message to a mailbox now causes a
- rollback, instead of leaving the mailbox partially modified.
-
-- Issue #11132: Fix passing of "optimize" parameter when recursing in
- compileall.compile_dir().
-
-- Issue #11110: Fix a potential decref of a NULL in sqlite3.
-
-- Issue #8275: Fix passing of callback arguments with ctypes under Win64. Patch
- by Stan Mihai.
-
-Build
------
+- Issue #15288: Link to the term "loader" in notes in pkgutil about how things
+ won't work as expected in Python 3.3 and mark the requisite functions as
+ "changed" since they will no longer work with modules directly imported by
+ import itself.
-- Issue #11079: The /Applications/Python x.x folder created by the Mac OS X
- installers now includes a link to the installed documentation and no longer
- includes an Extras directory. The Tools directory is now installed in the
- framework under share/doc.
+- Issue #13557: Clarify effect of giving two different namespaces to `exec()` or
+ `execfile()`.
-- Issue #11121: Fix building with --enable-shared.
+- Issue #15250: Document that `filecmp.dircmp()` compares files shallowly. Patch
+ contributed by Chris Jerdonek.
Tests
-----
-- Issue #10971: test_zipimport_support is once again compatible with the refleak
- hunter feature of test.regrtest.
-
-
-What's New in Python 3.2 Release Candidate 2?
-=============================================
-
-*Release date: 30-Jan-2011*
-
-Core and Builtins
------------------
-
-- Issue #10451: memoryview objects could allow to mutate a readable buffer.
- Initial patch by Ross Lagerwall.
-
-Library
--------
-
-- Issue #9124: mailbox now accepts binary input and reads and writes mailbox
- files in binary mode, using the email package's binary support to parse
- arbitrary email messages. StringIO and text file input is deprecated,
- and string input fails early if non-ASCII characters are used, where
- previously it would fail when the email was processed in a later step.
-
-- Issue #10845: Mitigate the incompatibility between the multiprocessing
- module on Windows and the use of package, zipfile or directory execution
- by special casing main modules that actually *are* called __main__.py.
-
-- Issue #11045: Protect logging call against None argument.
-
-- Issue #11052: Correct IDLE menu accelerators on Mac OS X for Save
- commands.
-
-- Issue #11053: Fix IDLE "Syntax Error" windows to behave as in 2.x,
- preventing a confusing hung appearance on OS X with the windows
- obscured.
-
-- Issue #10940: Workaround an IDLE hang on Mac OS X 10.6 when using the
- menu accelerators for Open Module, Go to Line, and New Indent Width.
- The accelerators still work but no longer appear in the menu items.
-
-- Issue #10989: Fix a crash on SSLContext.load_verify_locations(None, True).
-
-- Issue #11020: Command-line pyclbr was broken because of missing 2-to-3
- conversion.
-
-- Issue #11019: Fixed BytesGenerator so that it correctly handles a Message
- with a None body.
-
-- Issue #11014: Make 'filter' argument in tarfile.Tarfile.add() into a
- keyword-only argument. The preceding positional argument was deprecated,
- so it made no sense to add filter as a positional argument.
-
-- Issue #11004: Repaired edge case in deque.count().
-
-- Issue #10974: IDLE no longer crashes if its recent files list includes files
- with non-ASCII characters in their path names.
-
-- Have hashlib.algorithms_available and hashlib.algorithms_guaranteed both
- return sets instead of one returning a tuple and the other a frozenset.
-
-- Issue #10987: Fix the recursion limit handling in the _pickle module.
-
-- Issue #10983: Fix several bugs making tunnel requests in http.client.
-
-- Issue #10955: zipimport uses ASCII encoding instead of cp437 to decode
- filenames, at bootstrap, if the codec registry is not ready yet. It is still
- possible to have non-ASCII filenames using the Unicode flag (UTF-8 encoding)
- for all file entries in the ZIP file.
-
-- Issue #10949: Improved robustness of rotating file handlers.
-
-- Issue #10955: Fix a potential crash when trying to mmap() a file past its
- length. Initial patch by Ross Lagerwall.
-
-- Issue #10898: Allow compiling the posix module when the C library defines
- a symbol named FSTAT.
-
-- Issue #10980: the HTTP server now encodes headers with iso-8859-1 (latin1)
- encoding. This is the preferred encoding of PEP 3333 and the base encoding
- of HTTP 1.1.
-
-- To match the behaviour of HTTP server, the HTTP client library now also
- encodes headers with iso-8859-1 (latin1) encoding. It was already doing
- that for incoming headers which makes this behaviour now consistent in
- both incoming and outgoing direction.
-
-- Issue #9509: argparse now properly handles IOErrors raised by
- argparse.FileType.
-
-- Issue #10961: The new pydoc server now better handles exceptions raised
- during request handling.
-
-- Issue #10680: Fix mutually exclusive arguments for argument groups in
- argparse.
-
-Build
------
-
-- Issue #11054: Allow Mac OS X installer builds to again work on 10.5 with
- the system-provided Python.
-
-
-What's New in Python 3.2 Release Candidate 1
-============================================
-
-*Release date: 16-Jan-2011*
-
-Core and Builtins
------------------
-
-- Issue #10889: range indexing and slicing now works correctly on ranges with
- a length that exceeds sys.maxsize.
-
-- Issue #10892: Don't segfault when trying to delete __abstractmethods__ from a
- class.
-
-- Issue #8020: Avoid a crash where the small objects allocator would read
- non-Python managed memory while it is being modified by another thread. Patch
- by Matt Bandy.
-
-- Issue #10841: On Windows, set the binary mode on stdin, stdout, stderr and all
- io.FileIO objects (to not translate newlines, \r\n <=> \n). The Python parser
- translates newlines (\r\n => \n).
-
-- Remove buffer API from stable ABI for now, see #10181.
-
-- Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
- doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
- (length bigger than 2^31-1 bytes).
-
-- Issue #9015, #9611: FileIO.readinto(), FileIO.write(), os.write() and
- stdprinter.write() clamp the length to INT_MAX on Windows.
-
-- Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime()
- can now handle dates after 2038.
-
-- Issue #10780: PyErr_SetFromWindowsErrWithFilename() and
- PyErr_SetExcFromWindowsErrWithFilename() decode the filename from the
- filesystem encoding instead of UTF-8.
-
-- Issue #10779: PyErr_WarnExplicit() decodes the filename from the filesystem
- encoding instead of UTF-8.
-
-- Add sys.flags attribute for the new -q command-line option.
-
-- Issue #11506: Trying to assign to a bytes literal should result in a
- SyntaxError.
-
-Library
--------
-
-- Issue #10916: mmap should not segfault when a file is mapped using 0 as length
- and a non-zero offset, and an attempt to read past the end of file is made
- (IndexError is raised instead). Patch by Ross Lagerwall.
-
-- Issue #10154, #10090: change the normalization of UTF-8 to "UTF-8" instead
- of "UTF8" in the locale module as the latter is not supported MacOSX and OpenBSD.
-
-- Issue #10684: shutil.move used to delete a folder on case insensitive
- filesystems when the source and destination name where the same except
- for the case.
-
-- Issue #10907: Warn OS X 10.6 IDLE users to use ActiveState Tcl/Tk 8.5, rather
- than the currently problematic Apple-supplied one, when running with the
- 64-/32-bit installer variant.
-
-- Issue #4953: cgi.FieldStorage and cgi.parse() parse the request as bytes, not
- as unicode, and accept binary files. Add encoding and errors attributes to
- cgi.FieldStorage. Patch written by Pierre Quentel (with many inputs by Glenn
- Linderman).
-
-- Add encoding and errors arguments to urllib.parse_qs() and urllib.parse_qsl().
-
-- Issue #10899: No function type annotations in the standard library. Removed
- function type annotations from _pyio.py.
-
-- Issue #10875: Update Regular Expression HOWTO; patch by 'SilentGhost'.
-
-- Issue #10872: The repr() of TextIOWrapper objects now includes the mode
- if available.
-
-- Issue #10869: Fixed bug where ast.increment_lineno modified the root node
- twice.
-
-- Issue #5871: email.header.Header.encode now raises an error if any
- continuation line in the formatted value has no leading white space and looks
- like a header. Since Generator uses Header to format all headers, this check
- is made for all headers in any serialized message at serialization time. This
- provides protection against header injection attacks.
-
-- Issue #10859: Make ``contextlib.GeneratorContextManager`` officially
- private by renaming it to ``_GeneratorContextManager``.
-
-- Issue #10042: Fixed the total_ordering decorator to handle cross-type
- comparisons that could lead to infinite recursion.
-
-- Issue #10686: the email package now :rfc:`2047`\ -encodes headers with
- non-ASCII bytes (parsed by a BytesParser) when doing conversion to 7bit-clean
- presentation, instead of replacing them with ?s.
-
-- email.header.Header was incorrectly encoding folding whitespace when
- rfc2047-encoding header values with embedded newlines, leaving them without
- folding whitespace. It now uses the continuation_ws, as it does for
- continuation lines that it creates itself.
-
-- Issue #1777412, #10827: Changed the rules for 2-digit years. The
- time.asctime(), time.ctime() and time.strftime() functions will now format
- any year when ``time.accept2dyear`` is False and will accept years >= 1000
- otherwise. ``time.mktime`` and ``time.strftime`` now accept full range
- supported by the OS. With Visual Studio or on Solaris, the year is limited to
- the range [1; 9999]. Conversion of 2-digit years to 4-digit is deprecated.
-
-- Issue #7858: Raise an error properly when os.utime() fails under Windows
- on an existing file.
-
-- Issue #3839: wsgiref should not override a Content-Length header set by
- the application. Initial patch by Clovis Fabricio.
-
-- Issue #10492: bdb.Bdb.run() only traces the execution of the code, not the
- compilation (if the input is a string).
-
-- Issue #7995: When calling accept() on a socket with a timeout, the returned
- socket is now always blocking, regardless of the operating system.
-
-- Issue #10756: atexit normalizes the exception before displaying it. Patch by
- Andreas Stührk.
-
-- Issue #10790: email.header.Header.append's charset logic now works correctly
- for charsets whose output codec is different from its input codec.
-
-- Issue #10819: SocketIO.name property returns -1 when its closed, instead of
- raising a ValueError, to fix repr().
-
-- Issue #8650: zlib.compress() and zlib.decompress() raise an OverflowError if
- the input buffer length doesn't fit into an unsigned int (length bigger than
- 2^32-1 bytes).
-
-- Issue #6643: Reinitialize locks held within the threading module after fork to
- avoid a potential rare deadlock or crash on some platforms.
-
-- Issue #10806, issue #9905: Fix subprocess pipes when some of the standard file
- descriptors (0, 1, 2) are closed in the parent process. Initial patch by Ross
- Lagerwall.
-
-- `unittest.TestCase` can be instantiated without a method name; for simpler
- exploration from the interactive interpreter.
-
-- Issue #10798: Reject supporting concurrent.futures if the system has too
- few POSIX semaphores.
-
-- Issue #10807: Remove base64, bz2, hex, quopri, rot13, uu and zlib codecs from
- the codec aliases. They are still accessible via codecs.lookup().
-
-- Issue #10801: In zipfile, support different encodings for the header and the
- filenames.
-
-- Issue #6285: IDLE no longer crashes on missing help file; patch by Scott
- David Daniels.
-
-- Fix collections.OrderedDict.setdefault() so that it works in subclasses that
- define __missing__().
-
-- Issue #10786: unittest.TextTestRunner default stream no longer bound at import
- time. `sys.stderr` now looked up at instantiation time. Fix contributed by
- Mark Roddy.
-
-- Issue #10753: Characters ';', '=' and ',' in the PATH_INFO environment variable
- won't be quoted when the URI is constructed by the wsgiref.util's request_uri
- method. According to RFC 3986, these characters can be a part of params in
- PATH component of URI and need not be quoted.
-
-- Issue #10738: Fix webbrowser.Opera.raise_opts.
-
-- Issue #9824: SimpleCookie now encodes , and ; in values to cater to how
- browsers actually parse cookies.
-
-- Issue #9333: os.symlink now available regardless of user privileges. The
- function now raises OSError on Windows >=6.0 when the user is unable to create
- symbolic links. XP and 2003 still raise NotImplementedError.
-
-- Issue #10783: struct.pack() no longer implicitly encodes unicode to UTF-8.
-
-- Issue #10730: Add SVG mime types to mimetypes module.
-
-- Issue #10768: Make the Tkinter ScrolledText widget work again.
-
-- Issue #10777: Fix "dictionary changed size during iteration" bug in
- ElementTree register_namespace().
-
-- Issue #10626: test_logging now preserves logger disabled states.
-
-- Issue #10774: test_logging now removes temp files created during tests.
-
-- Issue #5258/#10642: if site.py encounters a .pth file that generates an error,
- it now prints the filename, line number, and traceback to stderr and skips
- the rest of that individual file, instead of stopping processing entirely.
-
-- Issue #10763: subprocess.communicate() closes stdout and stderr if both are
- pipes (bug specific to Windows).
-
-- Issue #1693546: fix email.message RFC 2231 parameter encoding to be in better
- compliance (no "s around encoded values).
-
-- Improved the diff message in the unittest module's assertCountEqual().
+- Issue #15467: Move helpers for `__sizeof__()` tests into test_support. Patch
+ by Serhiy Storchaka.
-- Issue #1155362: email.utils.parsedate_tz now handles a missing space before
- the '-' of a timezone field as well as before a '+'.
+- Issue #15320: Make iterating the list of tests thread-safe when running tests
+ in multiprocess mode. Patch by Chris Jerdonek.
-- Issue #4871: The zipfile module now gives a more useful error message if
- an attempt is made to use a string to specify the archive password.
+- Issue #15168: Move `importlib.test` to `test.test_importlib`.
-- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.
+- Issue #15091: Reactivate a test on UNIX which was failing thanks to a
+ forgotten `importlib.invalidate_caches()` call.
-- Deprecated assertDictContainsSubset() in the unittest module.
+- Issue #15230: Adopted a more systematic approach in the runpy tests.
-C-API
------
+- Issue #15300: Ensure the temporary test working directories are in the same
+ parent folder when running tests in multiprocess mode from a Python build.
+ Patch by Chris Jerdonek.
-- Issue #10913: Deprecate misleading functions PyEval_AcquireLock() and
- PyEval_ReleaseLock(). The thread-state aware APIs should be used instead.
+- Issue #15284: Skip {send,recv}msg tests in test_socket when IPv6 is not
+ enabled. Patch by Brian Brazil.
-- Issue #10333: Remove ancient GC API, which has been deprecated since Python
- 2.2.
+- Issue #15277: Fix a resource leak in support.py when IPv6 is disabled. Patch
+ by Brian Brazil.
Build
-----
-- Issue #10843: Update third-party library versions used in OS X 32-bit
- installer builds: bzip2 1.0.6, readline 6.1.2, SQLite 3.7.4 (with FTS3/FTS4
- and RTREE enabled), and ncursesw 5.5 (wide-char support enabled).
-
-- Issue #10820: Fix OS X framework installs to support version-specific
- scripts (#10679).
-
-- Issue #7716: Under Solaris, don't assume existence of /usr/xpg4/bin/grep in
- the configure script but use $GREP instead. Patch by Fabian Groffen.
-
-- Issue #10475: Don't hardcode compilers for LDSHARED/LDCXXSHARED on NetBSD
- and DragonFly BSD. Patch by Nicolas Joly.
-
-- Issue #10679: The "idle", "pydoc" and "2to3" scripts are now installed with
- a version-specific suffix on "make altinstall".
+- Issue #11715: Fix multiarch detection without having Debian development tools
+ (dpkg-dev) installed.
-- Issue #10655: Fix the build on PowerPC on Linux with GCC when building with
- timestamp profiling (--with-tsc): the preprocessor test for the PowerPC
- support now looks for "__powerpc__" as well as "__ppc__": the latter seems to
- only be present on OS X; the former is the correct one for Linux with GCC.
+- Issue #15037: Build OS X installers with local copy of ncurses 5.9 libraries
+ to avoid curses.unget_wch bug present in older versions of ncurses such as
+ those shipped with OS X.
-- Issue #1099: Fix the build on MacOSX when building a framework with pydebug
- using GCC 4.0.
+- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK. Also, for
+ OS X installers, ensure consistent sqlite3 behavior and feature availability
+ by building a local copy of libsqlite3 rather than depending on the wide range
+ of versions supplied with various OS X releases.
-Tools/Demos
------------
-
-- Issue #10843: Install the Tools directory on OS X in the applications Extras
- (/Applications/Python 3.n/Extras/) where the Demo directory had previous been
- installed.
-
-- Issue #7962: The Demo directory is gone. Most of the old and unmaintained
- demos have been removed, others integrated in documentation or a new
- Tools/demo subdirectory.
-
-- Issue #10502: Addition of the unittestgui tool. Originally by Steve Purcell.
- Updated for test discovery by Mark Roddy and Python 3 compatibility by Brian
- Curtin.
-
-Tests
------
+- Issue #8847: Disable COMDAT folding in Windows PGO builds.
-- Fix test_startfile to wait for child process to terminate before finishing.
+- Issue #14018: Fix OS X Tcl/Tk framework checking when using OS X SDKs.
-- Issue #10822: Fix test_posix:test_getgroups failure under Solaris. Patch
- by Ross Lagerwall.
+- Issue #15431: Add _freeze_importlib project to regenerate importlib.h on
+ Windows. Patch by Kristján Valur Jónsson.
-- Make the --coverage flag work for test.regrtest.
+- Issue #14197: For OS X framework builds, ensure links to the shared library
+ are created with the proper ABI suffix.
-- Issue #1677694: Refactor and improve test_timeout. Original patch by
- Björn Lindqvist.
+- Issue #14330: For cross builds, don't use host python, use host search paths
+ for host compiler.
-- Issue #5485: Add tests for the UseForeignDTD method of expat parser objects.
- Patch by Jean-Paul Calderone and Sandro Tosi.
+- Issue #15235: Allow Berkley DB versions up to 5.3 to build the dbm module.
-- Issue #6293: Have regrtest.py echo back sys.flags. This is done by default in
- whole runs and enabled selectively using ``--header`` when running an explicit
- list of tests. Original patch by Collin Winter.
+- Issue #15268: Search curses.h in /usr/include/ncursesw.
-What's New in Python 3.2 Beta 2?
-================================
+What's New in Python 3.3.0 Beta 1?
+==================================
-*Release date: 19-Dec-2010*
+*Release date: 27-Jun-2012*
Core and Builtins
-----------------
-- Issue #8844: Regular and recursive lock acquisitions can now be interrupted
- by signals on platforms using pthreads. Patch by Reid Kleckner.
-
-- Issue #4236: PyModule_Create2 now checks the import machinery directly
- rather than the Py_IsInitialized flag, avoiding a Fatal Python
- error in certain circumstances when an import is done in __del__.
-
-- Issue #5587: add a repr to dict_proxy objects. Patch by David Stanek and
- Daniel Urban.
-
-Library
--------
-
-- Issue #3243: Support iterable bodies in httplib. Patch Contributions by
- Xuanji Li and Chris AtLee.
-
-- Issue #10611: SystemExit exception will no longer kill a unittest run.
-
-- Issue #9857: It is now possible to skip a test in a setUp, tearDown or clean
- up function.
-
-- Issue #10573: use actual/expected consistently in unittest methods.
- The order of the args of assertCountEqual is also changed.
-
-- Issue #9286: email.utils.parseaddr no longer concatenates blank-separated
- words in the local part of email addresses, thereby preserving the input.
-
-- Issue #6791: Limit header line length (to 65535 bytes) in http.client
- and http.server, to avoid denial of services from the other party.
-
-- Issue #10404: Use ctl-button-1 on OSX for the context menu in Idle.
-
-- Issue #9907: Fix tab handling on OSX when using editline by calling
- rl_initialize first, then setting our custom defaults, then reading .editrc.
-
-- Issue #4188: Avoid creating dummy thread objects when logging operations
- from the threading module (with the internal verbose flag activated).
-
-- Issue #10711: Remove HTTP 0.9 support from http.client. The ``strict``
- parameter to HTTPConnection and friends is deprecated.
-
-- Issue #9721: Fix the behavior of urljoin when the relative url starts with a
- ';' character. Patch by Wes Chow.
-
-- Issue #10714: Limit length of incoming request in http.server to 65536 bytes
- for security reasons. Initial patch by Ross Lagerwall.
-
-- Issue #9558: Fix distutils.command.build_ext with VS 8.0.
-
-- Issue #10667: Fast path for collections.Counter().
-
-- Issue #10695: passing the port as a string value to telnetlib no longer
- causes debug mode to fail.
-
-- Issue #1078919: add_header now automatically RFC2231 encodes parameters
- that contain non-ascii values.
-
-- Issue #10188 (partial resolution): tempfile.TemporaryDirectory emits
- a warning on sys.stderr rather than throwing a misleading exception
- if cleanup fails due to nulling out of modules during shutdown.
- Also avoids an AttributeError when mkdtemp call fails and issues
- a ResourceWarning on implicit cleanup via __del__.
-
-- Issue #10107: Warn about unsaved files in IDLE on OSX.
-
-- Issue #7213: subprocess.Popen's default for close_fds has been changed.
- It is now True in most cases other than on Windows when input, output or
- error handles are provided.
-
-- Issue #6559: subprocess.Popen has a new pass_fds parameter (actually
- added in 3.2beta1) to allow specifying a specific list of file descriptors
- to keep open in the child process.
-
-- Issue #1731717: Fixed the problem where subprocess.wait() could cause an
- OSError exception when The OS had been told to ignore SIGCLD in our process
- or otherwise not wait for exiting child processes.
-
-Tests
------
+- Fix a (most likely) very rare memory leak when calling main() and not being
+ able to decode a command-line argument.
-- Issue #775964: test_grp now skips YP/NIS entries instead of failing when
- encountering them.
+- Issue #14815: Use Py_ssize_t instead of long for the object hash, to
+ preserve all 64 bits of hash on Win64.
-Tools/Demos
------------
-
-- Issue #6075: IDLE on Mac OS X now works with both Carbon AquaTk and
- Cocoa AquaTk.
-
-- Issue #10710: ``Misc/setuid-prog.c`` is removed from the source tree.
-
-- Issue #10706: Remove outdated script runtests.sh. Either ``make test``
- or ``python -m test`` should be used instead.
-
-Build
------
-
-- The Windows build now uses Tcl/Tk 8.5.9 and sqlite3 3.7.4.
-
-- Issue #9234: argparse supports alias names for subparsers.
-
-
-What's New in Python 3.2 Beta 1?
-================================
-
-*Release date: 05-Dec-2010*
-
-Core and Builtins
------------------
-
-- Issue #10630: Return dict views from the dict proxy keys()/values()/items()
- methods.
+- Issue #12268: File readline, readlines and read() or readall() methods
+ no longer lose data when an underlying read system call is interrupted.
+ IOError is no longer raised due to a read system call returning EINTR
+ from within these methods.
-- Issue #10596: Fix float.__mod__ to have the same behaviour as float.__divmod__
- with respect to signed zeros. -4.0 % 4.0 should be 0.0, not -0.0.
+- Issue #11626: Add _SizeT functions to stable ABI.
-- Issue #1772833: Add the -q command-line option to suppress copyright and
- version output in interactive mode.
+- Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
-- Provide an *optimize* parameter in the built-in compile() function.
+- Issue #15142: Fix reference leak when deallocating instances of types
+ created using PyType_FromSpec().
-- Fixed several corner case issues on Windows in os.stat/os.lstat related to
- reparse points.
+- Issue #15042: Add PyState_AddModule and PyState_RemoveModule. Add version
+ guard for Py_LIMITED_API additions. Patch by Robin Schreiber.
-- PEP 384 (Defining a Stable ABI) is implemented.
+- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
+ the work by Hirokazu Yamamoto.
-- Issue #2690: Range objects support negative indices and slicing.
+- Issue #15096: Removed support for ur'' as the raw notation isn't
+ compatible with Python 2.x's raw unicode strings.
-- Issue #9915: Speed up sorting with a key.
+- Issue #13783: Generator objects now use the identifier APIs internally
-- Issue #8685: Speed up set difference ``a - b`` when source set ``a`` is much
- larger than operand ``b``. Patch by Andrew Bennetts.
+- Issue #14874: Restore charmap decoding speed to pre-PEP 393 levels.
+ Patch by Serhiy Storchaka.
-- Issue #10518: Bring back the callable() builtin.
+- Issue #15026: utf-16 encoding is now significantly faster (up to 10x).
+ Patch by Serhiy Storchaka.
-- Issue #7094: Added alternate formatting (specified by '#') to ``__format__``
- method of float, complex, and Decimal. This allows more precise control over
- when decimal points are displayed.
+- Issue #11022: open() and io.TextIOWrapper are now calling
+ locale.getpreferredencoding(False) instead of locale.getpreferredencoding()
+ in text mode if the encoding is not specified. Don't change temporary the
+ locale encoding using locale.setlocale(), use the current locale encoding
+ instead of the user preferred encoding.
-- Issue #10474: range.count() should return integers.
+- Issue #14673: Add Eric Snow's sys.implementation implementation.
-- Issue #1574217: isinstance now catches only AttributeError, rather than
- masking all errors.
+- Issue #15038: Optimize python Locks on Windows.
Library
-------
-- logging: added "handler of last resort". See http://bit.ly/last-resort-handler
-
-- test.support: Added TestHandler and Matcher classes for better support of
- assertions about logging.
-
-- Issue #4391: Use proper plural forms in argparse.
-
-- Issue #10601: sys.displayhook uses 'backslashreplace' error handler on
- UnicodeEncodeError.
-
-- Add the "display" and "undisplay" pdb commands.
-
-- Issue #7245: Add a SIGINT handler in pdb that allows to break a program again
- after a "continue" command.
-
-- Add the "interact" pdb command.
-
-- Issue #7905: Actually respect the keyencoding parameter to shelve.Shelf.
-
-- Issue #1569291: Speed up array.repeat().
+- Issue #16305: Fix a segmentation fault occurring when interrupting
+ math.factorial.
-- Provide an interface to set the optimization level of compilation in
- py_compile, compileall and zipfile.PyZipFile.
+- Issue #9803: Don't close IDLE on saving if breakpoint is open.
+ Patch by Roger Serwy.
-- Issue #7904: Changes to urllib.parse.urlsplit to handle schemes as defined by
- RFC3986. Anything before :// is considered a scheme and is followed by an
- authority (or netloc) and by '/' led path, which is optional.
+- Issue #12288: Consider '0' and '0.0' as valid initialvalue
+ for tkinter SimpleDialog.
-- Issue #6045: dbm.gnu databases now support get() and setdefault() methods.
+- Issue #15512: Add a __sizeof__ implementation for parser.
+ Patch by Serhiy Storchaka.
-- Issue #10620: `python -m unittest` can accept file paths instead of module
- names for running specific tests.
+- Issue #15469: Add a __sizeof__ implementation for deque objects.
+ Patch by Serhiy Storchaka.
-- Issue #9424: Deprecate the `unittest.TestCase` methods `assertEquals`,
- `assertNotEquals`, `assertAlmostEquals`, `assertNotAlmostEquals` and `assert_`
- and replace them with the correct methods in the Python test suite.
+- Issue #15489: Add a __sizeof__ implementation for BytesIO objects.
+ Patch by Serhiy Storchaka.
-- Issue #10272: The ssl module now raises socket.timeout instead of a generic
- SSLError on socket timeouts.
+- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
+ Patch by Serhiy Storchaka.
-- Issue #10528: Allow translators to reorder placeholders in localizable
- messages from argparse.
+- Issue #15514: Correct __sizeof__ support for cpu_set.
+ Patch by Serhiy Storchaka.
-- Issue #10497: Fix incorrect use of gettext in argparse.
+- Issue #15187: Bugfix: remove temporary directories test_shutil was leaving
+ behind.
-- Issue #10478: Reentrant calls inside buffered IO objects (for example by
- way of a signal handler) now raise a RuntimeError instead of freezing the
- current process.
+- Issue #15177: Added dir_fd parameter to os.fwalk().
-- logging: Added getLogRecordFactory/setLogRecordFactory with docs and tests.
+- Issue #15176: Clarified behavior, documentation, and implementation
+ of os.listdir().
-- Issue #10549: Fix pydoc traceback when text-documenting certain classes.
+- Issue #15061: Re-implemented hmac.compare_digest() in C to prevent further
+ timing analysis and to support all buffer protocol aware objects as well as
+ ASCII only str instances safely.
-- Issue #2001: New HTML server with enhanced Web page features. Patch by Ron
- Adam.
+- Issue #15164: Change return value of platform.uname() from a
+ plain tuple to a collections.namedtuple.
-- Issue #10360: In WeakSet, do not raise TypeErrors when testing for membership
- of non-weakrefable objects.
+- Support Mageia Linux in the platform module.
-- Issue #940286: pydoc.Helper.help() ignores input/output init parameters.
+- Issue #11678: Support Arch linux in the platform module.
-- Issue #1745035: Add a command size and data size limit to smtpd.py, to prevent
- DoS attacks. Patch by Savio Sena.
+- Issue #15118: Change return value of os.uname() and os.times() from
+ plain tuples to immutable iterable objects with named attributes
+ (structseq objects).
-- Issue #4925: Add filename to error message when executable can't be found in
- subprocess.
+- Speed up _decimal by another 10-15% by caching the thread local context
+ that was last accessed. In the pi benchmark (64-bit platform, prec=9),
+ _decimal is now only 1.5x slower than float.
-- Issue #10391: Don't dereference invalid memory in error messages in the ast
- module.
+- Remove the packaging module, which is not ready for prime time.
-- Issue #10027: st_nlink was not being set on Windows calls to os.stat or
- os.lstat. Patch by Hirokazu Yamamoto.
+- Issue #15154: Add "dir_fd" parameter to os.rmdir, remove "rmdir"
+ parameter from os.remove / os.unlink.
-- Issue #9333: Expose os.symlink only when the SeCreateSymbolicLinkPrivilege is
- held by the user's account, i.e., when the function can actually be used.
+- Issue #4489: Add a shutil.rmtree that isn't susceptible to symlink attacks.
+ It is used automatically on platforms supporting the necessary os.openat()
+ and os.unlinkat() functions. Main code by Martin von Löwis.
-- Issue #8879: Add os.link support for Windows.
+- Issue #15156: HTMLParser now uses the new "html.entities.html5" dictionary.
-- Issue #7911: ``unittest.TestCase.longMessage`` defaults to True for improved
- failure messages by default. Patch by Mark Roddy.
+- Issue #11113: add a new "html5" dictionary containing the named character
+ references defined by the HTML5 standard and the equivalent Unicode
+ character(s) to the html.entities module.
-- Issue #1486713: HTMLParser now has an optional tolerant mode where it tries to
- guess at the correct parsing of invalid html.
+- Issue #15114: the strict mode of HTMLParser and the HTMLParseError exception
+ are deprecated now that the parser is able to parse invalid markup.
-- Issue #10554: Add context manager support to subprocess.Popen objects.
+- Issue #3665: \u and \U escapes are now supported in unicode regular
+ expressions. Patch by Serhiy Storchaka.
-- Issue #8989: email.utils.make_msgid now has a domain parameter that can
- override the domain name used in the generated msgid.
+- Issue #15153: Added inspect.getgeneratorlocals to simplify white box
+ testing of generator state updates
-- Issue #9299: Add exist_ok parameter to os.makedirs to suppress the 'File
- exists' exception when a target directory already exists with the specified
- mode. Patch by Ray Allen.
+- Issue #13062: Added inspect.getclosurevars to simplify testing stateful
+ closures
-- Issue #9573: os.fork() now works correctly when triggered as a side effect of
- a module import.
+- Issue #11024: Fixes and additional tests for Time2Internaldate.
-- Issue #10464: netrc now correctly handles lines with embedded '#' characters.
+- Issue #14626: Large refactoring of functions / parameters in the os module.
+ Many functions now support "dir_fd" and "follow_symlinks" parameters;
+ some also support accepting an open file descriptor in place of of a path
+ string. Added os.support_* collections as LBYL helpers. Removed many
+ functions only previously seen in 3.3 alpha releases (often starting with
+ "f" or "l", or ending with "at"). Originally suggested by Serhiy Storchaka;
+ implemented by Larry Hastings.
-- Added itertools.accumulate().
+- Issue #15008: Implement PEP 362 "Signature Objects".
+ Patch by Yury Selivanov.
-- Issue #4113: Added custom ``__repr__`` method to ``functools.partial``.
- Original patch by Daniel Urban.
+- Issue: #15138: base64.urlsafe_{en,de}code() are now 3-4x faster.
-- Issue #10273: Rename `assertRegexpMatches` and `assertRaisesRegexp` to
- `assertRegex` and `assertRaisesRegex`.
+- Issue #444582: Add shutil.which, for finding programs on the system path.
+ Original patch by Erik Demaine, with later iterations by Jan Killian
+ and Brian Curtin.
-- Issue #10535: Enable silenced warnings in unittest by default.
+- Issue #14837: SSL errors now have ``library`` and ``reason`` attributes
+ describing precisely what happened and in which OpenSSL submodule. The
+ str() of a SSLError is also enhanced accordingly.
-- Issue #9873: The URL parsing functions in urllib.parse now accept ASCII byte
- sequences as input in addition to character strings.
+- Issue #9527: datetime.astimezone() method will now supply a class
+ timezone instance corresponding to the system local timezone when
+ called with no arguments.
-- Issue #10586: The statistics API for the new functools.lru_cache has been
- changed to a single cache_info() method returning a named tuple.
+- Issue #14653: email.utils.mktime_tz() no longer relies on system
+ mktime() when timezone offest is supplied.
-- Issue #10323: itertools.islice() now consumes the minimum number of inputs
- before stopping. Formerly, the final state of the underlying iterator was
- undefined.
+- Issue #14684: zlib.compressobj() and zlib.decompressobj() now support the use
+ of predefined compression dictionaries. Original patch by Sam Rushing.
-- Issue #10565: The collections.Iterator ABC now checks for both __iter__ and
- __next__.
+- Fix GzipFile's handling of filenames given as bytes objects.
-- Issue #10242: Fixed implementation of unittest.ItemsEqual and gave it a new
- more informative name, unittest.CountEqual.
+- Issue #14772: Return destination values from some shutil functions.
-- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.
+- Issue #15064: Implement context manager protocol for multiprocessing types
-- Issue #2986: difflib.SequenceMatcher gets a new parameter, autojunk, which can
- be set to False to turn off the previously undocumented 'popularity'
- heuristic. Patch by Terry Reedy and Eli Bendersky.
+- Issue #15101: Make pool finalizer avoid joining current thread.
-- Issue #10534: in difflib, expose bjunk and bpopular sets; deprecate
- undocumented and now redundant isbjunk and isbpopular methods.
+- Issue #14657: The frozen instance of importlib used for bootstrap is now
+ also the module imported as importlib._bootstrap.
-- Issue #9846: zipfile is now correctly closing underlying file objects.
+- Issue #14055: Add __sizeof__ support to _elementtree.
-- Issue #10459: Update CJK character names to Unicode 6.0.
+- Issue #15054: A bug in tokenize.tokenize that caused string literals
+ with 'b' prefixes to be incorrectly tokenized has been fixed.
+ Patch by Serhiy Storchaka.
-- Issue #4493: urllib.request adds '/' in front of path components which does not
- start with '/. Common behavior exhibited by browsers and other clients.
+- Issue #15006: Allow equality comparison between naive and aware
+ time or datetime objects.
-- Issue #6378: idle.bat now runs with the appropriate Python version rather than
- the system default. Patch by Sridhar Ratnakumar.
+- Issue #14982: Document that pkgutil's iteration functions require the
+ non-standard iter_modules() method to be defined by an importer (something
+ the importlib importers do not define).
-- Issue #10470: 'python -m unittest' will now run test discovery by default,
- when no extra arguments have been provided.
+- Issue #15036: Mailbox no longer throws an error if a flush is done
+ between operations when removing or changing multiple items in mbox,
+ MMDF, or Babyl mailboxes.
-- Issue #3709: BaseHTTPRequestHandler will buffer the headers and write to
- output stream only when end_headers is invoked. This is a speedup and an
- internal optimization. Patch by endian.
+- Issue #14059: Implement multiprocessing.Barrier.
-- Issue #10220: Added inspect.getgeneratorstate. Initial patch by Rodolpho
- Eckhardt.
+- Issue #15061: The inappropriately named hmac.secure_compare has been
+ renamed to hmac.compare_digest, restricted to operating on bytes inputs
+ only and had its documentation updated to more accurately reflect both its
+ intent and its limitations
-- Issue #10453: compileall now uses argparse instead of getopt, and thus
- provides clean output when called with '-h'.
+- Issue #13841: Make child processes exit using sys.exit() on Windows.
-- Issue #8078: Add constants for higher baud rates in the termios module. Patch
- by Rodolpho Eckhardt.
+- Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
+ Patch by Robin Schreiber.
-- Issue #10407: Fix two NameErrors in distutils.
+- Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
+ in struct tm, time.struct_time objects returned by time.gmtime(),
+ time.localtime() and time.strptime() functions now have tm_zone and
+ tm_gmtoff attributes. Original patch by Paul Boddie.
-- Issue #10371: Deprecated undocumented functions in the trace module.
+- Rename adjusted attribute to adjustable in time.get_clock_info() result.
-- Issue #10467: Fix BytesIO.readinto() after seeking into a position after the
- end of the file.
+- Issue #3518: Remove references to non-existent BaseManager.from_address()
+ method.
-- configparser: 100% test coverage.
+- Issue #13857: Added textwrap.indent() function (initial patch by Ezra
+ Berch)
-- Issue #10499: configparser supports pluggable interpolation handlers. The
- default classic interpolation handler is called BasicInterpolation. Another
- interpolation handler added (ExtendedInterpolation) which supports the syntax
- used by zc.buildout (e.g. interpolation between sections).
+- Issue #2736: Added datetime.timestamp() method.
-- configparser: the SafeConfigParser class has been renamed to ConfigParser.
- The legacy ConfigParser class has been removed but its interpolation mechanism
- is still available as LegacyInterpolation.
+- Issue #13854: Make multiprocessing properly handle non-integer
+ non-string argument to SystemExit.
-- configparser: Usage of RawConfigParser is now discouraged for new projects
- in favor of ConfigParser(interpolation=None).
+- Issue #12157: Make pool.map() empty iterables correctly. Initial
+ patch by mouad.
-- Issue #1682942: configparser supports alternative option/value delimiters.
+- Issue #11823: disassembly now shows argument counts on calls with keyword args.
-- Issue #5412: configparser supports mapping protocol access.
+- Issue #14711: os.stat_float_times() has been deprecated.
-- Issue #9411: configparser supports specifying encoding for read operations.
+- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".
-- Issue #9421: configparser's getint(), getfloat() and getboolean() methods
- accept vars and default arguments just like get() does.
+- The bz2 and lzma modules now each contain an open() function, allowing
+ compressed files to readily be opened in text mode as well as binary mode.
-- Issue #9452: configparser supports reading from strings and dictionaries
- (thanks to the mapping protocol API, the latter can be used to copy data
- between parsers).
+- BZ2File.__init__() and LZMAFile.__init__() now accept a file object as their
+ first argument, rather than requiring a separate "fileobj" argument.
-- configparser: accepted INI file structure is now customizable, including
- comment prefixes, name of the DEFAULT section, empty lines in multiline
- values, and indentation.
+- gzip.open() now accepts file objects as well as filenames.
-- Issue #10326: unittest.TestCase instances can be pickled.
+- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
+ when the path existed and had the S_ISGID mode bit set when it was
+ not explicitly asked for. This is no longer an exception as mkdir
+ cannot control if the OS sets that bit for it or not.
-- Issue #9926: Wrapped TestSuite subclass does not get __call__ executed.
+- Issue #14989: Make the CGI enable option to http.server available via command
+ line.
-- Issue #9920: Skip tests for cmath.atan and cmath.atanh applied to complex
- zeros on systems where the log1p function fails to respect the sign of zero.
- This fixes a test failure on AIX.
+- Issue #14987: Add a missing import statement to inspect.
-- Issue #9732: Addition of getattr_static to the inspect module.
+- Issue #1079: email.header.decode_header now correctly parses all the examples
+ in RFC2047. There is a necessary visible behavior change: the leading and/or
+ trailing whitespace on ASCII parts is now preserved.
-- Issue #10446: Module documentation generated by pydoc now links to a
- version-specific online reference manual.
+- Issue #14969: Better handling of exception chaining in contextlib.ExitStack
-- Make the 'No module named' exception message from importlib consistent.
+- Issue #14962: Update text coloring in IDLE shell window after changing
+ options. Patch by Roger Serwy.
-- Issue #10443: Add the SSLContext.set_default_verify_paths() method.
+- Issue #14963: Convert contextlib.ExitStack.__exit__ to use an iterative
+ algorithm (Patch by Alon Horev)
-- Issue #10440: Support RUSAGE_THREAD as a constant in the resource module.
- Patch by Robert Collins.
+- Issue #14785: Add sys._debugmallocstats() to help debug low-level memory
+ allocation issues
-- Issue #10429: IMAP.starttls() stored the capabilities as bytes objects, rather
- than strings.
+- Issue #14443: Ensure that .py files are byte-compiled with the correct Python
+ executable within bdist_rpm even on older versions of RPM
C-API
-----
-- Issue #10557: Added a new API function, PyUnicode_TransformDecimalToASCII(),
- which transforms non-ASCII decimal digits in a Unicode string to their ASCII
- equivalents.
+- Issue #13783: Inadvertent additions to the public C API in the PEP 380
+ implementation have either been removed or marked as private interfaces.
-- Issue #9518: Extend the PyModuleDef_HEAD_INIT macro to explicitly
- zero-initialize all fields, fixing compiler warnings seen when building
- extension modules with gcc with "-Wmissing-field-initializers" (implied by
- "-W").
+Extension Modules
+-----------------
-- Issue #10255: Fix reference leak in Py_InitializeEx(). Patch by Neil
- Schemenauer.
+- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.
+
+Documentation
+-------------
-- structseq.h is now included in Python.h.
+- Issue #15081: Document PyState_FindModule.
+ Patch by Robin Schreiber.
-- Loosen PyArg_ValidateKeywordArguments to allow dict subclasses.
+- Issue #14814: Added first draft of ipaddress module API reference
Tests
-----
-- regrtest.py once again ensures the test directory is removed from sys.path
- when it is invoked directly as the __main__ module.
+- Issue #14769: test_capi now has SkipitemTest, which cleverly checks
+ for "parity" between PyArg_ParseTuple() and the Python/getargs.c static
+ function skipitem() for all possible "format units".
-- `python -m test` can be used to run the test suite as well as `python -m
- test.regrtest`.
+- test_nntplib now tolerates being run from behind NNTP gateways that add
+ "X-Antivirus" headers to articles
-- Do not fail test_socket when the IP address of the local hostname cannot be
- looked up.
+- Issue #15043: test_gdb is now skipped entirely if gdb security settings
+ block loading of the gdb hooks
-- Issue #8886: Use context managers throughout test_zipfile. Patch by Eric
- Carstensen.
+- Issue #14963: Add test cases for exception handling behaviour
+ in contextlib.ExitStack (Initial patch by Alon Horev)
Build
-----
-- Issue #10325: Fix two issues in the fallback definitions for PY_ULLONG_MAX and
- PY_LLONG_MAX that made them unsuitable for use in preprocessor conditionals.
+- Issue #13590: Improve support for OS X Xcode 4:
+ * Try to avoid building Python or extension modules with problematic
+ llvm-gcc compiler.
+ * Since Xcode 4 removes ppc support, extension module builds now
+ check for ppc compiler support and automatically remove ppc and
+ ppc64 archs when not available.
+ * Since Xcode 4 no longer install SDKs in default locations,
+ extension module builds now revert to using installed headers
+ and libs if the SDK used to build the interpreter is not
+ available.
+ * Update ./configure to use better defaults for universal builds;
+ in particular, --enable-universalsdk=yes uses the Xcode default
+ SDK and --with-universal-archs now defaults to "intel" if ppc
+ not available.
-Documentation
--------------
+- Issue #14225: Fix Unicode support for curses (#12567) on OS X
-- Issue #10299: List the built-in functions in a table in functions.rst.
+- Issue #14928: Fix importlib bootstrap issues by using a custom executable
+ (Modules/_freeze_importlib) to build Python/importlib.h.
-What's New in Python 3.2 Alpha 4?
-=================================
+What's New in Python 3.3.0 Alpha 4?
+===================================
-*Release date: 13-Nov-2010*
+*Release date: 31-May-2012*
Core and Builtins
-----------------
-- Issue #10372: Import the warnings module only after the IO library is
- initialized, so as to avoid bootstrap issues with the '-W' option.
+- Issue #14835: Make plistlib output empty arrays & dicts like OS X.
+ Patch by Sidney San Martín.
-- Issue #10293: Remove obsolete field in the PyMemoryView structure, unused
- undocumented value PyBUF_SHADOW, and strangely-looking code in
- PyMemoryView_GetContiguous.
+- Issue #14744: Use the new _PyUnicodeWriter internal API to speed up
+ str%args and str.format(args).
-- Issue #6081: Add str.format_map(), similar to ``str.format(**mapping)``.
+- Issue #14930: Make memoryview objects weakrefable.
-- If FileIO.__init__ fails, close the file descriptor.
+- Issue #14775: Fix a potential quadratic dict build-up due to the garbage
+ collector repeatedly trying to untrack dicts.
-- Issue #10221: dict.pop(k) now has a key error message that includes the
- missing key (same message d[k] returns for missing keys).
+- Issue #14857: fix regression in references to PEP 3135 implicit __class__
+ closure variable (Reopens issue #12370)
-- Issue #5437: A preallocated MemoryError instance should not keep traceback
- data (including local variables caught in the stack trace) alive infinitely.
+- Issue #14712 (PEP 405): Virtual environments. Implemented by Vinay Sajip.
-- Issue #10186: Fix the SyntaxError caret when the offset is equal to the length
- of the offending line.
+- Issue #14660 (PEP 420): Namespace packages. Implemented by Eric Smith.
-- Issue #10089: Add support for arbitrary -X options on the command line. They
- can be retrieved through a new attribute ``sys._xoptions``.
+- Issue #14494: Fix __future__.py and its documentation to note that
+ absolute imports are the default behavior in 3.0 instead of 2.7.
+ Patch by Sven Marnach.
-- Issue #4388: On Mac OS X, decode command line arguments from UTF-8, instead of
- the locale encoding. If the LANG (and LC_ALL and LC_CTYPE) environment
- variable is not set, the locale encoding is ISO-8859-1, whereas most programs
- (including Python) expect UTF-8. Python already uses UTF-8 for the filesystem
- encoding and to encode command line arguments on this OS.
+- Issue #9260: A finer-grained import lock. Most of the import sequence
+ now uses per-module locks rather than the global import lock, eliminating
+ well-known issues with threads and imports.
-- Issue #9713, #10114: Parser functions (e.g. PyParser_ASTFromFile) expect
- filenames encoded to the filesystem encoding with the surrogateescape error
- handler (to support undecodable bytes), instead of UTF-8 in strict mode.
+- Issue #14624: UTF-16 decoding is now 3x to 4x faster on various inputs.
+ Patch by Serhiy Storchaka.
-- Issue #9997: Don't let the name "top" have special significance in scope
- resolution.
+- asdl_seq and asdl_int_seq are now Py_ssize_t sized.
-- Issue #9862: Compensate for broken PIPE_BUF in AIX by hard coding its value as
- the default 512 when compiling on AIX.
+- Issue #14133 (PEP 415): Implement suppression of __context__ display with an
+ attribute on BaseException. This replaces the original mechanism of PEP 409.
-- Use locale encoding instead of UTF-8 to encode and decode filenames if
- Py_FileSystemDefaultEncoding is not set.
+- Issue #14417: Mutating a dict during lookup now restarts the lookup instead
+ of raising a RuntimeError (undoes issue #14205).
-- Issue #10095: fp_setreadl() doesn't reopen the file, instead reuse the file
- descriptor.
+- Issue #14738: Speed-up UTF-8 decoding on non-ASCII data. Patch by Serhiy
+ Storchaka.
-- Issue #9418: Moved private string methods ``_formatter_parser`` and
- ``_formatter_field_name_split`` into a new ``_string`` module.
+- Issue #14700: Fix two broken and undefined-behaviour-inducing overflow checks
+ in old-style string formatting.
-- Issue #9992: Remove PYTHONFSENCODING environment variable.
+- Issue #14705: The PyArg_Parse() family of functions now support the 'p' format
+ unit, which accepts a "boolean predicate" argument. It converts any Python
+ value into an integer--0 if it is "false", and 1 otherwise.
Library
-------
-- Issue #10465: fix broken delegating of attributes by gzip._PaddedFile.
-
-- Issue #10356: Decimal.__hash__(-1) should return -2.
-
-- Issue #1553375: logging: Added stack_info kwarg to display stack information.
-
-- Issue #5111: IPv6 Host in the Header is wrapped inside [ ]. Patch by Chandru.
-
-- Fix Fraction.__hash__ so that Fraction.__hash__(-1) is -2. (See also issue
- #10356.)
-
-- Issue #4471: Add the IMAP.starttls() method to enable encryption on standard
- IMAP4 connections. Original patch by Lorenzo M. Catucci.
-
-- Issue #1466065: Add 'validate' option to base64.b64decode to raise an error if
- there are non-base64 alphabet characters in the input.
-
-- Issue #10386: Add __all__ to token module; this simplifies importing in
- tokenize module and prevents leaking of private names through ``import *``.
-
-- Issue #4471: Properly shutdown socket in IMAP.shutdown(). Patch by Lorenzo
- M. Catucci.
-
-- Fix IMAP.login() to work properly.
-
-- Issue #9244: multiprocessing pool worker processes could terminate
- unexpectedly if the return value of a task could not be pickled. Only the
- ``repr`` of such errors are now sent back, wrapped in an
- ``MaybeEncodingError`` exception.
-
-- Issue #9244: The ``apply_async()`` and ``map_async()`` methods of
- ``multiprocessing.Pool`` now accepts a ``error_callback`` argument. This can
- be a callback with the signature ``callback(exc)``, which will be called if
- the target raises an exception.
-
-- Issue #10022: The dictionary returned by the ``getpeercert()`` method of SSL
- sockets now has additional items such as ``issuer`` and ``notBefore``.
-
-- ``usenetrc`` is now false by default for NNTP objects.
-
-- Issue #1926: Add support for NNTP over SSL on port 563, as well as STARTTLS.
- Patch by Andrew Vant.
-
-- Issue #10335: Add tokenize.open(), detect the file encoding using
- tokenize.detect_encoding() and open it in read only mode.
+- Issue #14690: Use monotonic clock instead of system clock in the sched,
+ subprocess and trace modules.
-- Issue #10321: Add support for binary data to smtplib.SMTP.sendmail, and a new
- method send_message to send an email.message.Message object.
+- Issue #14958: Change IDLE systax highlighting to recognize all string and
+ byte literals supported in Python 3.3.
-- Issue #6011: sysconfig and distutils.sysconfig use the surrogateescape error
- handler to parse the Makefile file. Avoid a UnicodeDecodeError if the source
- code directory name contains a non-ASCII character and the locale encoding is
- ASCII.
-
-- Issue #10329: The trace module writes reports using the input Python script
- encoding, instead of the locale encoding. Patch written by Alexander
- Belopolsky.
-
-- Issue #10126: Fix distutils' test_build when Python was built with
- --enable-shared.
-
-- Issue #9281: Prevent race condition with mkdir in distutils. Patch by
- Arfrever.
-
-- Issue #10229: Fix caching error in gettext.
-
-- Issue #10252: Close file objects in a timely manner in distutils code and
- tests. Patch by Brian Brazil, completed by Éric Araujo.
-
-- Issue #10180: Pickling file objects is now explicitly forbidden, since
- unpickling them produced nonsensical results.
-
-- Issue #10311: The signal module now restores errno before returning from its
- low-level signal handler. Patch by Hallvard B Furuseth.
-
-- Issue #10282: Add a ``nntp_implementation`` attribute to NNTP objects.
-
-- Issue #10283: Add a ``group_pattern`` argument to NNTP.list().
-
-- Issue #10155: Add IISCGIHandler to wsgiref.handlers to support IIS CGI
- environment better, and to correct unicode environment values for WSGI 1.0.1.
-
-- Issue #10281: nntplib now returns None for absent fields in the OVER/XOVER
- response, instead of raising an exception.
-
-- wsgiref now implements and validates PEP 3333, rather than an experimental
- extension of PEP 333. (Note: earlier versions of Python 3.x may have
- incorrectly validated some non-compliant applications as WSGI compliant; if
- your app validates with Python <3.2b1+, but not on this version, it is likely
- the case that your app was not compliant.)
-
-- Issue #10280: NNTP.nntp_version should reflect the highest version advertised
- by the server.
-
-- Issue #10184: Touch directories only once when extracting a tarfile.
-
-- Issue #10199: New package, ``turtledemo`` now contains selected demo scripts
- that were formerly found under Demo/turtle.
-
-- Issue #10265: Close file objects explicitly in sunau. Patch by Brian Brazil.
-
-- Issue #10266: uu.decode didn't close in_file explicitly when it was given as a
- filename. Patch by Brian Brazil.
-
-- Issue #10110: Queue objects didn't recognize full queues when the maxsize
- parameter had been reduced.
-
-- Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
-
-- logging: Added style option to basicConfig() to allow %, {} or $-formatting.
-
-- Issue #5729: json.dumps() now supports using a string such as '\t' for
- pretty-printing multilevel objects.
-
-- Issue #10253: FileIO leaks a file descriptor when trying to open a file for
- append that isn't seekable. Patch by Brian Brazil.
-
-- Support context manager protocol for file-like objects returned by mailbox
- ``get_file()`` methods.
+- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.
-- Issue #10246: uu.encode didn't close file objects explicitly when filenames
- were given to it. Patch by Brian Brazil.
+- Issue #14443: Tell rpmbuild to use the correct version of Python in
+ bdist_rpm. Initial patch by Ross Lagerwall.
-- Issue #10198: fix duplicate header written to wave files when writeframes() is
- called without data.
+- Issue #14929: Stop Idle 3.x from closing on Unicode decode errors when
+ grepping. Patch by Roger Serwy.
-- Close file objects in modulefinder in a timely manner.
+- Issue #12515: email now registers a defect if it gets to EOF while parsing
+ a MIME part without seeing the closing MIME boundary.
-- Close a io.TextIOWrapper object in email.parser in a timely manner.
+- Issue #12510: Attempting to get invalid tooltip no longer closes Idle.
+ Other tooltipss have been corrected or improved and the number of tests
+ has been tripled. Original patch by Roger Serwy.
-- Close a file object in distutils.sysconfig in a timely manner.
+- Issue #1672568: email now always decodes base64 payloads, adding padding and
+ ignoring non-base64-alphabet characters if needed, and registering defects
+ for any such problems.
-- Close a file object in pkgutil in a timely manner.
+- Issue #14925: email now registers a defect when the parser decides that there
+ is a missing header/body separator line. MalformedHeaderDefect, which the
+ existing code would never actually generate, is deprecated.
-- Issue #10233: Close file objects in a timely manner in the tarfile module and
- its test suite.
+- Issue #10365: File open dialog now works instead of crashing even when
+ the parent window is closed before the dialog. Patch by Roger Serwy.
-- Issue #10093: ResourceWarnings are now issued when files and sockets are
- deallocated without explicit closing. These warnings are silenced by default,
- except in pydebug mode.
+- Issue #8739: Updated smtpd to support RFC 5321, and added support for the
+ RFC 1870 SIZE extension.
-- tarfile.py: Add support for all missing variants of the GNU sparse extensions
- and create files with holes when extracting sparse members.
+- Issue #665194: Added a localtime function to email.utils to provide an
+ aware local datetime for use in setting Date headers.
-- Issue #10218: Return timeout status from ``Condition.wait`` in threading.
+- Issue #12586: Added new provisional policies that implement convenient
+ unicode support for email headers. See What's New for details.
-- Issue #7351: Add ``zipfile.BadZipFile`` spelling of the exception name and
- deprecate the old name ``zipfile.BadZipfile``.
+- Issue #14731: Refactored email Policy framework to support full backward
+ compatibility with Python 3.2 by default yet allow for the introduction of
+ new features through new policies. Note that Policy.must_be_7bit is renamed
+ to cte_type.
-- Issue #5027: The standard ``xml`` namespace is now understood by
- xml.sax.saxutils.XMLGenerator as being bound to
- http://www.w3.org/XML/1998/namespace. Patch by Troy J. Farrell.
+- Issue #14876: Use user-selected font for highlight configuration.
-- Issue #5975: Add csv.unix_dialect class.
+- Issue #14920: Fix the help(urllib.parse) failure on locale C on terminals.
+ Have ascii characters in help.
-- Issue #7761: telnetlib.interact failures on Windows fixed.
+- Issue #14548: Make multiprocessing finalizers check pid before
+ running to cope with possibility of gc running just after fork.
-- logging: Added style option to Formatter to allow %, {} or $-formatting.
+- Issue #14863: Update the documentation of os.fdopen() to reflect the
+ fact that it's only a thin wrapper around open() anymore.
-- Issue #5178: Added tempfile.TemporaryDirectory class that can be used as a
- context manager.
+- Issue #14036: Add an additional check to validate that port in urlparse does
+ not go in illegal range and returns None.
-- Issue #1349106: Generator (and BytesGenerator) flatten method and Header
- encode method now support a 'linesep' argument.
+- Issue #14862: Add missing names to os.__all__
-- Issue #5639: Add a *server_hostname* argument to ``SSLContext.wrap_socket`` in
- order to support the TLS SNI extension. ``HTTPSConnection`` and ``urlopen()``
- also use this argument, so that HTTPS virtual hosts are now supported.
+- Issue #14875: Use float('inf') instead of float('1e66666') in the json module.
-- Issue #10166: Avoid recursion in pstats Stats.add() for many stats items.
+- Issue #13585: Added contextlib.ExitStack
-- Issue #10163: Skip unreadable registry keys during mimetypes initialization.
+- PEP 3144, Issue #14814: Added the ipaddress module
-- logging: Made StreamHandler terminator configurable.
+- Issue #14426: Correct the Date format in Expires attribute of Set-Cookie
+ Header in Cookie.py.
-- logging: Allowed filters to be just callables.
+- Issue #14588: The types module now provide new_class() and prepare_class()
+ functions to support PEP 3115 compliant dynamic class creation. Patch by
+ Daniel Urban and Nick Coghlan.
-- logging: Added tests for _logRecordClass changes.
+- Issue #13152: Allow to specify a custom tabsize for expanding tabs in
+ textwrap. Patch by John Feuerstein.
-- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.
+- Issue #14721: Send the correct 'Content-length: 0' header when the body is an
+ empty string ''. Initial Patch contributed by Arve Knudsen.
-- logging: Added _logRecordClass, getLogRecordClass, setLogRecordClass to
- increase flexibility of LogRecord creation.
+- Issue #14072: Fix parsing of 'tel' URIs in urlparse by making the check for
+ ports stricter.
-- Issue #5117: Case normalization was needed on ntpath.relpath(). Also fixed
- root directory issue on posixpath.relpath(). (Ported working fixes from
- ntpath.)
+- Issue #9374: Generic parsing of query and fragment portions of url for any
+ scheme. Supported both by RFC3986 and RFC2396.
-- Issue #1343: xml.sax.saxutils.XMLGenerator now has an option
- short_empty_elements to direct it to use self-closing tags when appropriate.
+- Issue #14798: Fix the functions in pyclbr to raise an ImportError
+ when the first part of a dotted name is not a package. Patch by
+ Xavier de Gaye.
-- Issue #9807 (part 1): Expose the ABI flags in sys.abiflags. Add --abiflags
- switch to python-config for command line access.
+- Issue #12098: multiprocessing on Windows now starts child processes
+ using the same sys.flags as the current process. Initial patch by
+ Sergey Mezentsev.
-- Issue #6098: Don't claim DOM level 3 conformance in minidom.
+- Issue #13031: Small speed-up for tarfile when unzipping tarfiles.
+ Patch by Justin Peel.
-- Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty
- XML namespace attribute is encountered.
+- Issue #14780: urllib.request.urlopen() now has a ``cadefault`` argument
+ to use the default certificate store. Initial patch by James Oakley.
-- Issue #2830: Add the ``html.escape()`` function, which quotes all problematic
- characters by default. Deprecate ``cgi.escape()``.
+- Issue #14829: Fix bisect and range() indexing with large indices
+ (>= 2 ** 32) under 64-bit Windows.
-- Issue #9409: Fix the regex to match all kind of filenames, for interactive
- debugging in doctests.
+- Issue #14732: The _csv module now uses PEP 3121 module initialization.
+ Patch by Robin Schreiber.
-- Issue #9183: ``datetime.timezone(datetime.timedelta(0))`` will now return the
- same instance as ``datetime.timezone.utc``.
+- Issue #14809: Add HTTP status codes introduced by RFC 6585 to http.server
+ and http.client. Patch by EungJun Yi.
-- Issue #7523: Add SOCK_CLOEXEC and SOCK_NONBLOCK to the socket module, where
- supported by the system. Patch by Nikita Vetoshkin.
+- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
+ accessing the Tk clipboard. Modify clipboad_get() to first request type
+ UTF8_STRING when no specific type is requested in an X11 windowing
+ environment, falling back to the current default type STRING if that fails.
+ Original patch by Thomas Kluyver.
-- Issue #10063: file:// scheme will stop accessing remote hosts via ftp
- protocol. file:// urls had fallback to access remote hosts via ftp. This was
- not correct, change is made to raise a URLError when a remote host is tried to
- access via file:// scheme.
+- Issue #14773: Fix os.fwalk() failing on dangling symlinks.
-- Issue #1710703: Write structures for an empty ZIP archive when a ZipFile is
- created in modes 'a' or 'w' and then closed without adding any files. Raise
- BadZipfile (rather than IOError) when opening small non-ZIP files.
+- Issue #12541: Be lenient with quotes around Realm field of HTTP Basic
+ Authentation in urllib2.
-- Issue #10041: The signature of optional arguments in socket.makefile() didn't
- match that of io.open(), and they also didn't get forwarded properly to
- TextIOWrapper in text mode. Patch by Kai Zhu.
+- Issue #14807: move undocumented tarfile.filemode() to stat.filemode() and add
+ doc entry. Add tarfile.filemode alias with deprecation warning.
-- Issue #9003: http.client.HTTPSConnection, urllib.request.HTTPSHandler and
- urllib.request.urlopen now take optional arguments to allow for server
- certificate checking, as recommended in public uses of HTTPS.
+- Issue #13815: TarFile.extractfile() now returns io.BufferedReader objects.
-- Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
- current directory was deleted. Patch written by W. Trevor King.
+- Issue #14532: Add a secure_compare() helper to the hmac module, to mitigate
+ timing attacks. Patch by Jon Oberheide.
-- Issue #3873: Speed up unpickling from file objects that have a peek() method.
+- Add importlib.util.resolve_name().
-- Issue #10075: Add a session_stats() method to SSLContext objects.
+- Issue #14366: Support lzma compression in zip files.
+ Patch by Serhiy Storchaka.
-- Issue #9948: Fixed problem of losing filename case information.
+- Issue #13959: Introduce importlib.find_loader() and document
+ imp.find_module/load_module as deprecated.
-Extension Modules
------------------
+- Issue #14082: shutil.copy2() now copies extended attributes, if possible.
+ Patch by Hynek Schlawack.
-- Issue #5109: array.array constructor will now use fast code when
- initial data is provided in an array object with correct type.
+- Issue #13959: Make importlib.abc.FileLoader.load_module()/get_filename() and
+ importlib.machinery.ExtensionFileLoader.load_module() have their single
+ argument be optional. Allows for the replacement (and thus deprecation) of
+ imp.load_source()/load_package()/load_compiled().
-- Issue #6317: Now winsound.PlaySound only accepts unicode.
+- Issue #13959: imp.get_suffixes() has been deprecated in favour of the new
+ attributes on importlib.machinery: SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES,
+ OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, and EXTENSION_SUFFIXES. This
+ led to an indirect deprecation of inspect.getmoduleinfo().
-- Issue #6317: Now winsound.PlaySound can accept non ascii filename.
+- Issue #14662: Prevent shutil failures on OS X when destination does not
+ support chflag operations. Patch by Hynek Schlawack.
-- Issue #9377: Use Unicode API for gethostname on Windows.
+- Issue #14157: Fix time.strptime failing without a year on February 29th.
+ Patch by Hynek Schlawack.
-- Issue #10143: Update "os.pathconf" values.
+- Issue #14753: Make multiprocessing's handling of negative timeouts
+ the same as it was in Python 3.2.
-- Issue #6518: Support context manager protcol for ossaudiodev types.
+- Issue #14583: Fix importlib bug when a package's __init__.py would first
+ import one of its modules then raise an error.
-- Issue #678250: Make mmap flush a noop on ACCESS_READ and ACCESS_COPY.
+- Issue #14741: Fix missing support for Ellipsis ('...') in parser module.
-- Issue #9054: Fix a crash occurring when using the pyexpat module with expat
- version 2.0.1.
+- Issue #14697: Fix missing support for set displays and set comprehensions in
+ parser module.
-- Issue #5355: Provide mappings from Expat error numbers to string descriptions
- and backwards, in order to actually make it possible to analyze error codes
- provided by ExpatError.
+- Issue #14701: Fix missing support for 'raise ... from' in parser module.
-- The Unicode database was updated to 6.0.0.
+- Add support for timeouts to the acquire() methods of
+ multiprocessing's lock/semaphore/condition proxies.
-C-API
------
+- Issue #13989: Add support for text mode to gzip.open().
-- Issue #10288: The deprecated family of "char"-handling macros
- (ISLOWER()/ISUPPER()/etc) have now been removed: use Py_ISLOWER() etc instead.
+- Issue #14127: The os.stat() result object now provides three additional
+ fields: st_ctime_ns, st_mtime_ns, and st_atime_ns, providing those times as an
+ integer with nanosecond resolution. The functions os.utime(), os.lutimes(),
+ and os.futimes() now accept a new parameter, ns, which accepts mtime and atime
+ as integers with nanosecond resolution.
-- Issue #9778: Hash values are now always the size of pointers. A new Py_hash_t
- type has been introduced.
+- Issue #14127 and #10148: shutil.copystat now preserves exact mtime and atime
+ on filesystems providing nanosecond resolution.
Tools/Demos
-----------
-- Issue #10117: Tools/scripts/reindent.py now accepts source files that use
- encoding other than ASCII or UTF-8. Source encoding is preserved when
- reindented code is written to a file.
-
-- Issue #7287: Demo/imputil/knee.py was removed.
-
-Tests
------
-
-- Issue #3699: Fix test_bigaddrspace and extend it to test bytestrings as well
- as unicode strings. Initial patch by Sandro Tosi.
-
-- Issue #10294: Remove dead code form test_unicode_file.
-
-- Issue #10123: Don't use non-ascii filenames in test_doctest tests. Add a new
- test specific to unicode (non-ascii name and filename).
+- Issue #14695: Bring Tools/parser/unparse.py support up to date with
+ the Python 3.3 Grammar.
Build
-----
-- Issue #10268: Add a --enable-loadable-sqlite-extensions option to configure.
+- Issue #14472: Update .gitignore. Patch by Matej Cepl.
-- Issue #8852: Allow the socket module to build on OpenSolaris.
+- Upgrade Windows library versions: bzip 1.0.6, OpenSSL 1.0.1c.
-- Drop -OPT:Olimit compiler option.
+- Issue #14693: Under non-Windows platforms, hashlib's fallback modules are
+ always compiled, even if OpenSSL is present at build time.
-- Issue #10094: Use versioned .so files on GNU/kfreeBSD and the GNU Hurd.
+- Issue #13210: Windows build now uses VS2010, ported from VS2008.
-- Accept Oracle Berkeley DB 5.0 and 5.1 as backend for the dbm extension.
+Documentation
+-------------
-- Issue #7473: avoid link errors when building a framework with a different set
- of architectures than the one that is currently installed.
+- Issue #14588: The language reference now accurately documents the Python 3
+ class definition process. Patch by Nick Coghlan.
+- Issue #14943: Correct a default argument value for winreg.OpenKey
+ and correctly list the argument names in the function's explanation.
-What's New in Python 3.2 Alpha 3?
-=================================
-*Release date: 09-Oct-2010*
+What's New in Python 3.3.0 Alpha 3?
+===================================
+
+*Release date: 01-May-2012*
Core and Builtins
-----------------
-- Issue #10068: Global objects which have reference cycles with their module's
- dict are now cleared again. This causes issue #7140 to appear again.
+- Issue #14699: Fix calling the classmethod descriptor directly.
-- Issue #9738: Document PyErr_SetString() and PyErr_SetFromErrnoWithFilename()
- encodings.
+- Issue #14433: Prevent msvcrt crash in interactive prompt when stdin is closed.
-- ast.literal_eval() can now handle negative numbers. It is also a little more
- liberal in what it accepts without compromising the safety of the evaluation.
- For example, 3j+4 and 3+4+5 are both accepted.
+- Issue #14521: Make result of float('nan') and float('-nan') more consistent
+ across platforms.
-- Issue #10006: type.__abstractmethods__ now raises an AttributeError. As a
- result metaclasses can now be ABCs (see #9533).
+- Issue #14646: __import__() sets __loader__ if the loader did not.
-- Issue #8670: ctypes.c_wchar supports non-BMP characters with 32 bits wchar_t.
+- Issue #14605: No longer have implicit entries in sys.meta_path. If
+ sys.meta_path is found to be empty, raise ImportWarning.
-- Issue #8670: PyUnicode_AsWideChar() and PyUnicode_AsWideCharString() replace
- UTF-16 surrogate pairs by single non-BMP characters for 16 bits Py_UNICODE and
- 32 bits wchar_t (eg. Linux in narrow build).
+- Issue #14605: No longer have implicit entries in sys.path_hooks. If
+ sys.path_hooks is found to be empty, a warning will be raised. None is now
+ inserted into sys.path_importer_cache if no finder was discovered. This also
+ means imp.NullImporter is no longer implicitly used.
-- Issue #10003: Allow handling of SIGBREAK on Windows. Fixes a regression
- introduced by issue #9324.
+- Issue #13903: Implement PEP 412. Individual dictionary instances can now share
+ their keys with other dictionaries. Classes take advantage of this to share
+ their instance dictionary keys for improved memory and performance.
-- Issue #9979: Create function PyUnicode_AsWideCharString().
+- Issue #11603 (again): Setting __repr__ to __str__ now raises a RuntimeError
+ when repr() or str() is called on such an object.
-- Issue #7397: Mention that importlib.import_module() is probably what someone
- really wants to be using in __import__'s docstring.
+- Issue #14658: Fix binding a special method to a builtin implementation of a
+ special method with a different name.
-- Issue #8521: Allow CreateKeyEx, OpenKeyEx, and DeleteKeyEx functions of winreg
- to use named arguments.
+- Issue #14630: Fix a memory access bug for instances of a subclass of int
+ with value 0.
-- Issue #9930: Remove bogus subtype check that was causing (e.g.)
- float.__rdiv__(2.0, 3) to return NotImplemented instead of the expected 1.5.
+- Issue #14339: Speed improvements to bin, oct and hex functions. Patch by
+ Serhiy Storchaka.
-- Issue #9808: Implement os.getlogin for Windows. Patch by Jon Anglin.
+- Issue #14098: New functions PyErr_GetExcInfo and PyErr_SetExcInfo.
+ Patch by Stefan Behnel.
-- Issue #9901: Destroying the GIL in Py_Finalize() can fail if some other
- threads are still running. Instead, reinitialize the GIL on a second call to
- Py_Initialize().
+- Issue #14385: It is now possible to use a custom type for the __builtins__
+ namespace, instead of a dict. It can be used for sandboxing for example.
+ Raise also a NameError instead of ImportError if __build_class__ name if not
+ found in __builtins__.
-- All SyntaxErrors now have a column offset and therefore a caret when the error
- is printed.
+- Issue #12599: Be more strict in accepting None compared to a false-like
+ object for importlib.util.module_for_loader and
+ importlib.machinery.PathFinder.
-- Issue #9252: PyImport_Import no longer uses a fromlist hack to return the
- module that was imported, but instead gets the module from sys.modules.
+- Issue #14612: Fix jumping around with blocks by setting f_lineno.
-- Issue #9213: The range type_items now provides index() and count() methods, to
- conform to the Sequence ABC. Patch by Daniel Urban and Daniel Stutzbach.
+- Issue #14592: Attempting a relative import w/o __package__ or __name__ set in
+ globals raises a KeyError.
-- Issue #7994: Issue a PendingDeprecationWarning if object.__format__ is called
- with a non-empty format string. This is an effort to future-proof user
- code. If a derived class does not currently implement __format__ but later
- adds its own __format__, it would most likely break user code that had
- supplied a format string. This will be changed to a DeprecationWaring in
- Python 3.3 and it will be an error in Python 3.4.
+- Issue #14607: Fix keyword-only arguments which started with ``__``.
-- Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
- re-created on a subsequent call to Py_Initialize(). The problem (a crash)
- wouldn't appear in 3.1 or 2.7 where the GIL's structure is more trivial.
+- Issue #10854: The ImportError raised when an extension module on Windows
+ fails to import now uses the new path and name attributes from
+ Issue #1559549.
-- Issue #9210: Configure option --with-wctype-functions was removed. Using the
- functions from the libc caused the methods .upper() and lower() to become
- locale aware and created subtly wrong results.
+- Issue #13889: Check and (if necessary) set FPU control word before calling
+ any of the dtoa.c string <-> float conversion functions, on MSVC builds of
+ Python. This fixes issues when embedding Python in a Delphi app.
-- Issue #9738: PyUnicode_FromFormat() and PyErr_Format() raise an error on a
- non-ASCII byte in the format string.
+- __import__() now matches PEP 328 and documentation by defaulting 'index' to 0
+ instead of -1 and removing support for negative values.
-- Issue #4617: Previously it was illegal to delete a name from the local
- namespace if it occurs as a free variable in a nested block. This limitation
- of the compiler has been lifted, and a new opcode introduced (DELETE_DEREF).
+- Issue #2377: Make importlib the implementation of __import__().
-- Issue #9804: ascii() now always represents unicode surrogate pairs as a single
- ``\UXXXXXXXX``, regardless of whether the character is printable or not.
- Also, the "backslashreplace" error handler now joins surrogate pairs into a
- single character on UCS-2 builds.
+- Issue #1559549: ImportError now has 'name' and 'path' attributes that are set
+ using keyword arguments to its constructor. They are currently not set by
+ import as they are meant for use by importlib.
-- Issue #9757: memoryview objects get a release() method to release the
- underlying buffer (previously this was only done when deallocating the
- memoryview), and gain support for the context management protocol.
+- Issue #14474: Save and restore exception state in thread.start_new_thread()
+ while writing error message if the thread leaves a unhandled exception.
-- Issue #9797: pystate.c wrongly assumed that zero couldn't be a valid
- thread-local storage key.
+- Issue #13019: Fix potential reference leaks in bytearray.extend(). Patch
+ by Suman Saha.
Library
-------
-- Issue #2236: distutils' mkpath ignored the mode parameter.
-
-- Fix typo in one sdist option (medata-check).
-
-- Issue #9199: Fix incorrect use of distutils.cmd.Command.announce.
-
-- Issue #1718574: Fix options that were supposed to accept arguments but did
- not in build_clib.
-
-- Issue #9437: Fix building C extensions with non-default LDFLAGS.
-
-- Issue #4661: email can now parse bytes input and generate either converted
- 7bit output or bytes output. Email version bumped to 5.1.0.
-
-- Issue #1589: Add ssl.match_hostname(), to help implement server identity
- verification for higher-level protocols.
-
-- Issue #9759: GzipFile now raises ValueError when an operation is attempted
- after the file is closed. Patch by Jeffrey Finkelstein.
-
-- Issue #9042: Fix interaction of custom translation classes and caching in
- gettext.
-
-- Issue #6706: asyncore.dispatcher now provides a handle_accepted() method
- returning a (sock, addr) pair which is called when a connection has been
- established with a new remote endpoint. This is supposed to be used as a
- replacement for old handle_accept() and avoids the user to call accept()
- directly.
-
-- Issue #9065: tarfile no longer uses "root" as the default for the uname and
- gname field.
-
-- Issue #8980: Fixed a failure in distutils.command check that was shadowed by
- an environment that does not have docutils. Patch by Arfrever.
-
-- Issue #1050268: parseaddr now correctly quotes double quote and backslash
- characters that appear inside quoted strings in email addresses.
-
-- Issue #10004: quoprimime no longer generates a traceback when confronted with
- invalid characters after '=' in a Q-encoded word.
-
-- Issue #1491: BaseHTTPServer nows send a ``100 Continue`` response before
- sending a 200 OK for the Expect: 100-continue request header.
-
-- Issue #9360: Cleanup and improvements to the nntplib module. The API now
- conforms to the philosophy of bytes and unicode separation in Python 3. A
- test suite has also been added.
-
-- Issue #9962: GzipFile now has the peek() method.
-
-- Issue #9090: When a socket with a timeout fails with EWOULDBLOCK or EAGAIN,
- retry the select() loop instead of bailing out. This is because select() can
- incorrectly report a socket as ready for reading (for example, if it received
- some data with an invalid checksum).
-
-- Issue #3612: Added new types to ctypes.wintypes. (CHAR and pointers)
-
-- Issue #9950: Fix socket.sendall() crash or misbehaviour when a signal is
- received. Now sendall() properly calls signal handlers if necessary, and
- retries sending if these returned successfully, including on sockets with a
- timeout.
-
-- Issue #9947: logging: Fixed locking bug in stopListening.
-
-- Issue #9945: logging: Fixed locking bugs in addHandler/removeHandler.
-
-- Issue #9936: Fixed executable lines' search in the trace module.
-
-- Issue #9790: Rework imports necessary for samefile and sameopenfile
- in ntpath.
-
-- Issue #9928: Properly initialize the types exported by the bz2 module.
-
-- Issue #1675951: Allow GzipFile to work with unseekable file objects. Patch by
- Florian Festi.
-
-- Logging: Added QueueListener class to facilitate logging usage for
- performance-critical threads.
+- Issue #14768: os.path.expanduser('~/a') doesn't works correctly when HOME is '/'.
-- Issue #9916: Add some missing errno symbols.
+- Issue #14371: Support bzip2 in zipfile module. Patch by Serhiy Storchaka.
-- Issue #9877: Expose sysconfig.get_makefile_filename()
+- Issue #13183: Fix pdb skipping frames after hitting a breakpoint and running
+ step. Patch by Xavier de Gaye.
-- logging: Added hasHandlers() method to Logger and LoggerAdapter.
+- Issue #14696: Fix parser module to understand 'nonlocal' declarations.
-- Issue #9908: Fix os.stat() on bytes paths under Windows 7.
+- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
+ the DST transition. Patch by Joe Peterson.
-- Issue #2643: msync() is not called anymore when deallocating an open mmap
- object, only munmap().
+- Issue #9154: Fix parser module to understand function annotations.
-- logging: Changed LoggerAdapter implementation internally, to make it easier to
- subclass in a useful way.
+- Issue #6085: In http.server.py SimpleHTTPServer.address_string returns the
+ client ip address instead client hostname. Patch by Charles-François Natali.
-- logging: hasHandlers method was added to Logger, and isEnabledFor,
- getEffectiveLevel, hasHandlers and setLevel were added to LoggerAdapter.
- LoggerAdapter was introduced into the unit tests for logging.
+- Issue #14309: Deprecate time.clock(), use time.perf_counter() or
+ time.process_time() instead.
-- Issue #1686: Fix string.Template when overriding the pattern attribute.
+- Issue #14428: Implement the PEP 418. Add time.get_clock_info(),
+ time.perf_counter() and time.process_time() functions, and rename
+ time.steady() to time.monotonic().
-- Issue #9854: SocketIO objects now observe the RawIOBase interface in
- non-blocking mode: they return None when an operation would block (instead of
- raising an exception).
+- Issue #14646: importlib.util.module_for_loader() now sets __loader__ and
+ __package__ (when possible).
-- Issue #1730136: Fix the comparison between a tk.font.Font and an object of
- another kind.
+- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
+ test class that doesn't inherit from TestCase (i.e. a mixin).
-- Issue #9441: logging has better coverage for rotating file handlers.
+- Issue #4892: multiprocessing Connections can now be transferred over
+ multiprocessing Connections. Patch by Richard Oudkerk (sbt).
-- Issue #9865: collections.OrderedDict now has a __sizeof__ method.
+- Issue #14160: TarFile.extractfile() failed to resolve symbolic links when
+ the links were not located in an archive subdirectory.
-- Issue #9854: The default read() implementation in io.RawIOBase now handles
- non-blocking readinto() returning None correctly.
+- Issue #14638: pydoc now treats non-string __name__ values as if they
+ were missing, instead of raising an error.
-- Issue #1552: socket.socketpair() now returns regular socket.socket objects
- supporting the whole socket API (rather than the "raw" _socket.socket
- objects).
+- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites
+ which send EOF without trailing \r\n.
-- Issue #9853: Fix the signature of SSLSocket.recvfrom() and SSLSocket.sendto()
- to match the corresponding socket methods.
+- Issue #14605: Add importlib.abc.FileLoader, importlib.machinery.(FileFinder,
+ SourceFileLoader, SourcelessFileLoader, ExtensionFileLoader).
-- Issue #9840: Added a decorator to reprlib for wrapping __repr__ methods to make
- them handle recursive calls within the same thread.
+- Issue #13959: imp.cache_from_source()/source_from_cache() now follow
+ os.path.join()/split() semantics for path manipulation instead of its prior,
+ custom semantics of caring the right-most path separator forward in path
+ joining.
-- logging: Enhanced HTTPHandler with secure and credentials initializers.
+- Issue #2193: Allow ":" character in Cookie NAME values.
-- Issue #767645: Set os.path.supports_unicode_filenames to True on Mac OS X.
+- Issue #14629: tokenizer.detect_encoding will specify the filename in the
+ SyntaxError exception if found at readline.__self__.name.
-- Issue #9837: The read() method of ZipExtFile objects (as returned by
- ZipFile.open()) could return more bytes than requested.
+- Issue #14629: Raise SyntaxError in tokenizer.detect_encoding if the
+ first two lines have non-UTF-8 characters without an encoding declaration.
-- Issue #9826: OrderedDict.__repr__ can now handle self-referential values:
- d['x'] = d.
+- Issue #14308: Fix an exception when a "dummy" thread is in the threading
+ module's active list after a fork().
-- Issue #9825: Using __del__ in the definition of collections.OrderedDict made
- it possible for the user to create self-referencing ordered dictionaries which
- become permanently uncollectable GC garbage. Reinstated the Python 3.1
- approach of using weakref proxies so that reference cycles never get created
- in the first place.
+- Issue #11750: The Windows API functions scattered in the _subprocess and
+ _multiprocessing.win32 modules now live in a single module "_winapi".
+ Patch by sbt.
-- Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and
- encode the value with filesystem encoding and surrogateescape (instead of
- utf-8 in strict mode) . Patch written by David Watson.
+- Issue #14087: multiprocessing: add Condition.wait_for(). Patch by sbt.
-- Issue #9632: Remove sys.setfilesystemencoding() function: use PYTHONFSENCODING
- environment variable to set the filesystem encoding at Python startup.
- sys.setfilesystemencoding() creates inconsistencies because it is unable to
- reencode all filenames in all objects.
+- Issue #14538: HTMLParser can now parse correctly start tags that contain
+ a bare '/'.
-- Issue #9410: Various optimizations to the pickle module, leading to speedups
- up to 4x (depending on the benchmark). Mostly ported from Unladen Swallow;
- initial patch by Alexandre Vassalotti.
+- Issue #14452: SysLogHandler no longer inserts a UTF-8 BOM into the message.
-- The pprint module now supports printing OrderedDicts in their given order
- (formerly, it would sort the keys).
+- Issue #14386: Expose the dict_proxy internal type as types.MappingProxyType.
-- Logging: Added QueueHandler class to facilitate logging usage with
- multiprocessing.
+- Issue #13959: Make imp.reload() always use a module's __loader__ to perform
+ the reload.
-- Issue #9707: Rewritten reference implementation of threading.local which is
- friendlier towards reference cycles. This change is not normally visible
- since an optimized C implementation (_thread._local) is used instead.
+- Issue #13959: Add imp.py and rename the built-in module to _imp, allowing for
+ re-implementing parts of the module in pure Python.
-- Issue #6394: os.getppid() is now supported on Windows. Note that it will
- still return the id of the parent process after it has exited. This process
- id may even have been reused by another unrelated process.
+- Issue #13496: Fix potential overflow in bisect.bisect algorithm when applied
+ to a collection of size > sys.maxsize / 2.
-- Issue #9792: In case of connection failure, socket.create_connection() would
- swallow the exception and raise a new one, making it impossible to fetch the
- original errno, or to filter timeout errors. Now the original error is
- re-raised.
+- Have importlib take advantage of ImportError's new 'name' and 'path'
+ attributes.
-- Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True, and
- the passed buffer was exactly 1024 bytes long, the buffer wouldn't be updated
- back after the system call. Original patch by Brian Brazil.
+- Issue #14399: zipfile now recognizes that the archive has been modified even
+ if only the comment is changed. In addition, the TypeError that results from
+ trying to set a non-binary value as a comment is now now raised at the time
+ the comment is set rather than at the time the zipfile is written.
-- Updates to the random module:
+- trace.CoverageResults.is_ignored_filename() now ignores any name that starts
+ with "<" and ends with ">" instead of special-casing "<string>" and
+ "<doctest ".
- * Document which parts of the module are guaranteed to stay the same across
- versions and which parts are subject to change.
+- Issue #12537: The mailbox module no longer depends on knowledge of internal
+ implementation details of the email package Message object.
- * Update the seed() method to use all of the bits in a string instead of just
- the hash value. This makes better use of the seed value and assures the
- seeding is platform independent. Issue #7889.
+- Issue #7978: socketserver now restarts the select() call when EINTR is
+ returned. This avoids crashing the server loop when a signal is received.
+ Patch by Jerzy Kozera.
- * Improved the random()-->integer algorithm used in choice(), shuffle(),
- sample(), randrange(), and randint(). Formerly, it used int(n*random())
- which has a slight bias whenever n is not a power of two. Issue #9025.
+- Issue #14522: Avoid duplicating socket handles in multiprocessing.connection.
+ Patch by sbt.
- * Improved documentation of arguments to randrange(). Issue #9379.
+- Don't Py_DECREF NULL variable in io.IncrementalNewlineDecoder.
-- collections.OrderedDict now supports a new method for repositioning keys to
- either end.
+- Issue #8515: Set __file__ when run file in IDLE.
+ Initial patch by Bruce Frederiksen.
-- Issue #9754: Similarly to assertRaises and assertRaisesRegexp, unittest test
- cases now also have assertWarns and assertWarnsRegexp methods to check that a
- given warning type was triggered by the code under test.
+- Issue #14496: Fix wrong name in idlelib/tabbedpages.py.
+ Patch by Popa Claudiu.
-- Issue #5506: BytesIO objects now have a getbuffer() method exporting a view of
- their contents without duplicating them. The view is both readable and
- writable.
+- Issue #3033: Add displayof parameter to tkinter font. Patch by Guilherme Polo.
-- Issue #7566: Implement os.path.sameopenfile for Windows.
+- Issue #14482: Raise a ValueError, not a NameError, when trying to create
+ a multiprocessing Client or Listener with an AF_UNIX type address under
+ Windows. Patch by Popa Claudiu.
-- Issue #9293: I/O streams now raise ``io.UnsupportedOperation`` when an
- unsupported operation is attempted (for example, writing to a file open only
- for reading).
+- Issue #802310: Generate always unique tkinter font names if not directly passed.
-- hashlib has two new constant attributes: algorithms_guaranteed and
- algorithms_avaiable that respectively list the names of hash algorithms
- guaranteed to exist in all Python implementations and the names of hash
- algorithms available in the current process.
+- Issue #14151: Raise a ValueError, not a NameError, when trying to create
+ a multiprocessing Client or Listener with an AF_PIPE type address under
+ non-Windows platforms. Patch by Popa Claudiu.
-- A new package ``concurrent.futures`` as defined by PEP 3148.
+- Issue #14493: Use gvfs-open or xdg-open in webbrowser.
-C-API
+Build
-----
-- Add PyErr_SyntaxLocationEx, which supports passing a column offset.
-
-- Issue #9834: Don't segfault in PySequence_GetSlice, PySequence_SetSlice, or
- PySequence_DelSlice when the object doesn't have any mapping operations
- defined.
-
-Tools/Demos
------------
-
-- Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well as
- wide (UCS4) unicode builds for both the host interpreter (embedded inside gdb)
- and the interpreter under test.
+- "make touch" will now touch generated files that are checked into Mercurial,
+ after a "hg update" which failed to bring the timestamps into the right order.
Tests
-----
-- Issue #9308: Added tests for importing encoded modules that do not
- depend on specific stdlib modules being encoded in a certain way.
-
-- Issue #1051: Add a script (Lib/test/make_ssl_certs.py) to generate the custom
- certificate and private key files used by SSL-related certs.
-
-- Issue #9978: Wait until subprocess completes initialization. (Win32KillTests
- in test_os)
-
-- Issue #7110: regrtest now sends test failure reports and single-failure
- tracebacks to stderr rather than stdout.
-
-- Issue #9628: fix runtests.sh -x option so more than one test can be excluded.
-
-- Issue #9899: Fix test_tkinter.test_font on various platforms. Patch by Ned
- Deily.
-
-- Issue #9894: Do not hardcode ENOENT in test_subprocess.
-
-- Issue #9315: Added tests for the trace module. Patch by Eli Bendersky.
-
-- Issue #9323: Make test.regrtest.__file__ absolute, this was not always the
- case when running profile or trace, for example.
-
-- Issue #9568: Fix test_urllib2_localnet on OS X 10.3.
-
-Build
------
-
-- Issue #10062: Allow building on platforms which do not have sem_timedwait.
-
-- Issue #10054: Some platforms provide uintptr_t in inttypes.h. Patch by Akira
- Kitada.
-
-- Issue #10055: Make json C89-compliant in UCS4 mode.
-
-- Issue #9552: Avoid unnecessary rebuild of OpenSSL. (Windows)
-
-- Issue #1633863: Don't ignore $CC under AIX.
+- Issue #14026: In test_cmd_line_script, check that sys.argv is populated
+ correctly for the various invocation approaches (Patch by Jason Yeo)
-- Issue #9810: Compile bzip2 source files in Python's project file directly. It
- used to be built with bzip2's makefile.
+- Issue #14032: Fix incorrect variable name in test_cmd_line_script debugging
+ message (Patch by Jason Yeo)
-- Issue #9848: Stopping trying to build _weakref in setup.py as it is a built-in
- module.
+- Issue #14589: Update certificate chain for sha256.tbs-internet.com, fixing
+ a test failure in test_ssl.
-- Issue #9806: python-config now has an ``--extension-suffix`` option that
- outputs the suffix for dynamic libraries including the ABI version name
- defined by PEP 3149.
+- Issue #14355: Regrtest now supports the standard unittest test loading, and
+ will use it if a test file contains no `test_main` method.
-- Issue #941346: Improve the build process under AIX and allow Python to be
- built as a shared library. Patch by Sébastien Sablé.
+Tools / Demos
+-------------
-- Issue #4026: Make the fcntl extension build under AIX. Patch by Sébastien
- Sablé.
+- Issue #3561: The Windows installer now has an option, off by default, for
+ placing the Python installation into the system "Path" environment variable.
-- Issue #9701: The MacOSX installer can patch the shell profile to ensure that
- the "bin" directory inside the framework is on the shell's search path. This
- feature now also supports the ZSH shell.
+- Issue #13165: stringbench is now available in the Tools/stringbench folder.
+ It used to live in its own SVN project.
-What's New in Python 3.2 Alpha 2?
-=================================
+What's New in Python 3.3.0 Alpha 2?
+===================================
-*Release date: 05-Sep-2010*
+*Release date: 01-Apr-2012*
Core and Builtins
-----------------
-- Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced by
- the new (and simpler) DUP_TOP_TWO. Performance isn't changed, but our
- bytecode is a bit simplified. Patch by Demur Rumed.
-
-- Issue #9766: Rename poorly named variables exposed by _warnings to prevent
- confusion with the proper variables names from 'warnings' itself.
-
-- Issue #9212: dict_keys and dict_items now provide the isdisjoint() method, to
- conform to the Set ABC. Patch by Daniel Urban.
-
-- Issue #9737: Fix a crash when trying to delete a slice or an item from a
- memoryview object.
-
-- Issue #9549: sys.setdefaultencoding() and PyUnicode_SetDefaultEncoding() are
- now removed, since their effect was inexistent in 3.x (the default encoding is
- hardcoded to utf-8 and cannot be changed).
-
-- Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
- properly. Patch by Stefan Behnel.
-
-- Issue #5553: The Py_LOCAL_INLINE macro now results in inlining on most
- platforms. Previously, it inlined only when using Microsoft Visual C.
-
-- Issue #9712: Fix tokenize on identifiers that start with non-ascii names.
-
-- Issue #9688: __basicsize__ and __itemsize__ must be accessed as Py_ssize_t.
-
-- Issue #9684: Added a definition for SIZEOF_WCHAR_T to PC/pyconfig.h, to match
- the pyconfig.h generated by configure on other systems.
-
-- Issue #9666: Only catch AttributeError in hasattr(). All other exceptions that
- occur during attribute lookup are now propagated to the caller.
-
-- Issue #8622: Add PYTHONFSENCODING environment variable to override the
- filesystem encoding.
-
-- Issue #5127: The C functions that access the Unicode Database now accept and
- return characters from the full Unicode range, even on narrow unicode builds
- (Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL, and others). A visible difference
- in Python is that unicodedata.numeric() now returns the correct value for
- large code points, and repr() may consider more characters as printable.
-
-- Issue #9425: Create PyModule_GetFilenameObject() function to get the filename
- as a unicode object, instead of a byte string. Function needed to support
- unencodable filenames. Deprecate PyModule_GetFilename() in favor on the new
- function.
-
-- Issue #8063: Call _PyGILState_Init() earlier in Py_InitializeEx().
-
-- Issue #9612: The set object is now 64-bit clean under Windows.
-
-- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching for
- the module file to be executed with the -m command line option.
-
-- Issue #9599: Create PySys_FormatStdout() and PySys_FormatStderr() functions to
- write a message formatted by PyUnicode_FromFormatV() to sys.stdout and
- sys.stderr.
-
-- Issue #9542: Create PyUnicode_FSDecoder() function, a ParseTuple converter:
- decode bytes objects to unicode using PyUnicode_DecodeFSDefaultAndSize(); str
- objects are output as-is.
-
-- Issue #9203: Computed gotos are now enabled by default on supported compilers
- (which are detected by the configure script). They can still be disable
- selectively by specifying --without-computed-gotos.
-
-- Issue #9425: Create PyErr_WarnFormat() function, similar to PyErr_WarnEx() but
- use PyUnicode_FromFormatV() to format the warning message.
-
-- Issue #8530: Prevent stringlib fastsearch from reading beyond the front of an
- array.
-
-- Issue #5319: Print an error if flushing stdout fails at interpreter shutdown.
-
-- Issue #9337: The str() of a float or complex number is now identical to its
- repr().
-
-- Issue #9416: Fix some issues with complex formatting where the output with no
- type specifier failed to match the str output:
-
- - format(complex(-0.0, 2.0), '-') omitted the real part from the output,
- - format(complex(0.0, 2.0), '-') included a sign and parentheses.
-
-Extension Modules
------------------
-
-- Issue #8013: time.asctime and time.ctime no longer call system
- asctime and ctime functions. The year range for time.asctime is now
- 1900 through maxint. The range for time.ctime is the same as for
- time.localtime. The string produced by these functions is longer
- than 24 characters when year is greater than 9999.
-
-- Issue #6608: time.asctime is now checking struct tm fields its input
- before passing it to the system asctime. Patch by MunSic Jeong.
-
-- Issue #8734: Avoid crash in msvcrt.get_osfhandle() when an invalid file
- descriptor is provided. Patch by Pascal Chambon.
-
-- Issue #7736: Release the GIL around calls to opendir() and closedir() in the
- posix module. Patch by Marcin Bachry.
-
-- Issue #4835: make PyLong_FromSocket_t() and PyLong_AsSocket_t() private to the
- socket module, and fix the width of socket descriptors to be correctly
- detected under 64-bit Windows.
-
-- Issue #1027206: Support IDNA in gethostbyname, gethostbyname_ex, getaddrinfo
- and gethostbyaddr. getnameinfo is now restricted to numeric addresses as
- input.
-
-- Issue #9214: Set operations on a KeysView or ItemsView in collections now
- correctly return a set. Patch by Eli Bendersky.
-
-- Issue #5737: Add Solaris-specific mnemonics in the errno module. Patch by
- Matthew Ahrens.
+- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
+ are passed arguments and their complementary method is not overridden.
-- Restore GIL in nis_cat in case of error. Decode NIS data to fs encoding, using
- the surrogate error handler.
-
-- Issue #665761: ``functools.reduce()`` will no longer mask exceptions other
- than ``TypeError`` raised by the iterator argument.
-
-- Issue #9570: Use PEP 383 decoding in os.mknod and os.mkfifo.
-
-- Issue #6915: Under Windows, os.listdir() didn't release the Global Interpreter
- Lock around all system calls. Original patch by Ryan Kelly.
-
-- Issue #8524: Add a detach() method to socket objects, so as to put the socket
- into the closed state without closing the underlying file descriptor.
-
-- Issue #477863: Emit a ResourceWarning at shutdown if gc.garbage is not empty.
-
-- Issue #6869: Fix a refcount problem in the _ctypes extension.
-
-- Issue #5504: ctypes should now work with systems where mmap can't be
- PROT_WRITE and PROT_EXEC.
+- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
+ the module name that was not interned.
-- Issue #9507: Named tuple repr will now automatically display the right name in
- a tuple subclass.
+- Issue #14331: Use significantly less stack space when importing modules by
+ allocating path buffers on the heap instead of the stack.
-- Issue #9324: Add parameter validation to signal.signal on Windows in order to
- prevent crashes.
+- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
+ passed strings.
-- Issue #9526: Remove some outdated (int) casts that were preventing the array
- module from working correctly with arrays of more than 2**31 elements.
+- Issue #1469629: Allow cycles through an object's __dict__ slot to be
+ collected. (For example if ``x.__dict__ is x``).
-- Fix memory leak in ssl._ssl._test_decode_cert.
+- Issue #14205: dict lookup raises a RuntimeError if the dict is modified
+ during a lookup.
-- Issue #8065: Fix memory leak in readline module (from failure to free the
- result of history_get_history_state()).
+- Issue #14220: When a generator is delegating to another iterator with the
+ yield from syntax, it needs to have its ``gi_running`` flag set to True.
-- Issue #9450: Fix memory leak in readline.replace_history_item and
- readline.remove_history_item for readline version >= 5.0.
+- Issue #14435: Remove dedicated block allocator from floatobject.c and rely
+ on the PyObject_Malloc() api like all other objects.
-- Issue #8105: Validate file descriptor passed to mmap.mmap on Windows.
+- Issue #14471: Fix a possible buffer overrun in the winreg module.
-- Issue #8046: Add context manager protocol support and .closed property to mmap
- objects.
+- Issue #14288: Allow the serialization of builtin iterators
Library
-------
-- Issue #7451: Improve decoding performance of JSON objects, and reduce the
- memory consumption of said decoded objects when they use the same strings as
- keys.
-
-- Issue #1100562: Fix deep-copying of objects derived from the list and dict
- types. Patch by Michele Orrù and Björn Lindqvist.
-
-- Issue #9753: Fixed socket.dup, which did not always work correctly on Windows.
-
-- Issue #9421: Made the get<type> methods consistently accept the vars and
- default arguments on all parser classes.
-
-- Issue #7005: Fixed output of None values for RawConfigParser.write and
- ConfigParser.write.
+- Issue #14300: Under Windows, sockets created using socket.dup() now allow
+ overlapped I/O. Patch by sbt.
-- Issue #8990: array.fromstring() and array.tostring() get renamed to
- frombytes() and tobytes(), respectively, to avoid confusion. Furthermore,
- array.frombytes(), array.extend() as well as the array.array() constructor now
- accept bytearray objects. Patch by Thomas Jollans.
+- Issue #13872: socket.detach() now marks the socket closed (as mirrored
+ in the socket repr()). Patch by Matt Joiner.
-- Issue #808164: Fixed socket.close to avoid references to globals, to avoid
- issues when socket.close is called from a __del__ method.
+- Issue #14406: Fix a race condition when using ``concurrent.futures.wait(
+ return_when=ALL_COMPLETED)``. Patch by Matt Joiner.
-- Issue #9706: ssl module provides a better error handling in various
- circumstances.
+- Issue #5136: deprecate old, unused functions from tkinter.
-- Issue #1868: Eliminate subtle timing issues in thread-local objects by getting
- rid of the cached copy of thread-local attribute dictionary.
+- Issue #14409: IDLE now properly executes commands in the Shell window
+ when it cannot read the normal config files on startup and
+ has to use the built-in default key bindings.
+ There was previously a bug in one of the defaults.
-- Issue #1512791: In setframerate() in the wave module, non-integral frame rates
- are rounded to the nearest integer.
+- Issue #14416: syslog now defines the LOG_ODELAY and LOG_AUTHPRIV constants
+ if they are defined in <syslog.h>.
-- Issue #8797: urllib2 does a retry for Basic Authentication failure instead of
- falling into recursion.
+- IDLE can be launched as python -m idlelib
-- Issue #1194222: email.utils.parsedate now returns RFC2822 compliant four
- character years even if the message contains RFC822 two character years.
+- Issue #14295: Add unittest.mock
-- Issue #8750: Fixed MutableSet's methods to correctly handle reflexive
- operations on its self, namely x -= x and x ^= x.
+- Issue #7652: Add --with-system-libmpdec option to configure for linking
+ the _decimal module against an installed libmpdec.
-- Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing error
- handling when accepting a new connection.
+- Issue #14380: MIMEText now defaults to utf-8 when passed non-ASCII unicode
+ with no charset specified.
-- Issue #9601: ftplib now provides a workaround for non-compliant
- implementations such as IIS shipped with Windows server 2003 returning invalid
- response codes for MKD and PWD commands.
+- Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
+ OSX; avoid to call handle_connect in case of a disconnected socket which
+ was not meant to connect.
-- Issue #658749: asyncore's connect() method now correctly interprets winsock
- errors.
+- Issue #14204: The ssl module now has support for the Next Protocol
+ Negotiation extension, if available in the underlying OpenSSL library.
+ Patch by Colin Marc.
-- Issue #9501: Fixed logging regressions in cleanup code.
+- Issue #3035: Unused functions from tkinter are marked as pending deprecated.
-- Fix functools.total_ordering() to skip methods inherited from object.
+- Issue #12757: Fix the skipping of doctests when python is run with -OO so
+ that it works in unittest's verbose mode as well as non-verbose mode.
-- Issue #9572: Importlib should not raise an exception if a directory it thought
- it needed to create was done concurrently by another process.
+- Issue #7652: Integrate the decimal floating point libmpdec library to speed
+ up the decimal module. Performance gains of the new C implementation are
+ between 10x and 100x, depending on the application.
-- Issue #9617: Signals received during a low-level write operation aren't
- ignored by the buffered IO layer anymore.
+- Issue #3573: IDLE hangs when passing invalid command line args
+ (directory(ies) instead of file(s)) (Patch by Guilherme Polo)
-- Issue #843590: Make "macintosh" an alias to the "mac_roman" encoding.
+- Issue #14269: SMTPD now conforms to the RFC and requires a HELO command
+ before MAIL, RCPT, or DATA.
-- Create os.fsdecode(): decode from the filesystem encoding with surrogateescape
- error handler, or strict error handler on Windows.
+- Issue #13694: asynchronous connect in asyncore.dispatcher does not set addr
+ attribute.
-- Issue #3488: Provide convenient shorthand functions ``gzip.compress`` and
- ``gzip.decompress``. Original patch by Anand B. Pillai.
+- Issue #14344: fixed the repr of email.policy objects.
-- Issue #8807: poplib.POP3_SSL class now accepts a context parameter, which is a
- ssl.SSLContext object allowing bundling SSL configuration options,
- certificates and private keys into a single (potentially long-lived)
- structure.
+- Issue #11686: Added missing entries to email package __all__ lists
+ (mostly the new Bytes classes).
-- Issue #8866: parameters passed to socket.getaddrinfo can now be specified as
- single keyword arguments.
+- Issue #14335: multiprocessing's custom Pickler subclass now inherits from
+ the C-accelerated implementation. Patch by sbt.
-- Address XXX comment in dis.py by having inspect.py prefer to reuse the dis.py
- compiler flag values over defining its own.
+- Issue #10484: Fix the CGIHTTPServer's PATH_INFO handling problem.
-- Issue #9147: Added dis.code_info() which is similar to show_code() but returns
- formatted code information in a string rather than displaying on screen.
+- Issue #11199: Fix the with urllib which hangs on particular ftp urls.
-- Issue #9567: functools.update_wrapper now adds a __wrapped__ attribute
- pointing to the original callable.
+- Improve the memory utilization and speed of functools.lru_cache.
-- Issue #3445: functools.update_wrapper now tolerates missing attributes on
- wrapped callables.
+- Issue #14222: Use the new time.steady() function instead of time.time() for
+ timeout in queue and threading modules to not be affected of system time
+ update.
-- Issue #5867: Add abc.abstractclassmethod and abc.abstractstaticmethod.
+- Issue #13248: Remove lib2to3.pytree.Base.get_prefix/set_prefix.
-- Issue #9605: posix.getlogin() decodes the username with file filesystem
- encoding and surrogateescape error handler. Patch written by David Watson.
+- Issue #14234: CVE-2012-0876: Randomize hashes of xml attributes in the hash
+ table internal to the pyexpat module's copy of the expat library to avoid a
+ denial of service due to hash collisions. Patch by David Malcolm with some
+ modifications by the expat project.
-- Issue #9604: posix.initgroups() encodes the username using the fileystem
- encoding and surrogateescape error handler. Patch written by David Watson.
+- Issue #14200: Idle shell crash on printing non-BMP unicode character.
-- Issue #9603: posix.ttyname() and posix.ctermid() decode the terminal name
- using the filesystem encoding and surrogateescape error handler. Patch written
- by David Watson.
+- Issue #12818: format address no longer needlessly \ escapes ()s in names when
+ the name ends up being quoted.
-- Issue #7647: The posix module now has the ST_RDONLY and ST_NOSUID constants,
- for use with the statvfs() function. Patch by Adam Jackson.
+- Issue #14062: BytesGenerator now correctly folds Header objects,
+ including using linesep when folding.
-- Issue #8688: MANIFEST files created by distutils now include a magic comment
- indicating they are generated. Manually maintained MANIFESTs without this
- marker will not be overwritten or removed.
+- Issue #13839: When invoked on the command-line, the pstats module now
+ accepts several filenames of profile stat files and merges them all.
+ Patch by Matt Joiner.
-- Issue #7467: when reading a file from a ZIP archive, its CRC is checked and a
- BadZipfile error is raised if it doesn't match (as used to be the case in
- Python 2.5 and earlier).
+- Issue #14291: Email now defaults to utf-8 for non-ASCII unicode headers
+ instead of raising an error. This fixes a regression relative to 2.7.
-- Issue #9550: a BufferedReader could issue an additional read when the original
- read request had been satisfied, which could block indefinitely when the
- underlying raw IO channel was e.g. a socket. Report and original patch by
- Jason V. Miller.
+- Issue #989712: Support using Tk without a mainloop.
-- Issue #3757: thread-local objects now support cyclic garbage collection.
- Thread-local objects involved in reference cycles will be deallocated timely
- by the cyclic GC, even if the underlying thread is still running.
+- Issue #5219: Prevent event handler cascade in IDLE.
-- Issue #9452: Add read_file, read_string, and read_dict to the configparser
- API; new source attribute to exceptions.
+- Issue #3835: Refuse to use unthreaded Tcl in threaded Python.
-- Issue #6231: Fix xml.etree.ElementInclude to include the tail of the current
- node.
+- Issue #2843: Add new Tk API to Tkinter.
-- Issue #8047: Fix the xml.etree serializer to return bytes by default. Use
- ``encoding="unicode"`` to generate a Unicode string.
+- Issue #14184: Increase the default stack size for secondary threads on
+ Mac OS X to avoid interpreter crashes when using threads on 10.7.
-- Issue #8280: urllib2's Request method will remove fragments in the url. This
- is how it is supposed to work, wget and curl do the same. Previous behavior
- was wrong.
+- Issue #14180: datetime.date.fromtimestamp(),
+ datetime.datetime.fromtimestamp() and datetime.datetime.utcfromtimestamp()
+ now raise an OSError instead of ValueError if localtime() or gmtime() failed.
-- Issue #6683: For SMTP logins we now try all authentication methods advertised
- by the server. Many servers are buggy and advertise authentication methods
- they do not support in reality.
+- Issue #14180: time.ctime(), gmtime(), time.localtime(),
+ datetime.date.fromtimestamp(), datetime.datetime.fromtimestamp() and
+ datetime.datetime.utcfromtimestamp() now raises an OverflowError, instead of
+ a ValueError, if the timestamp does not fit in time_t.
-- Issue #8814: function annotations (the ``__annotations__`` attribute) are now
- included in the set of attributes copied by default by functools.wraps and
- functools.update_wrapper. Patch by Terrence Cole.
+- Issue #14180: datetime.datetime.fromtimestamp() and
+ datetime.datetime.utcfromtimestamp() now round microseconds towards zero
+ instead of rounding to nearest with ties going away from zero.
-- Issue #2944: asyncore doesn't handle connection refused correctly.
+- Issue #10543: Fix unittest test discovery with Jython bytecode files.
-- Issue #4184: Private attributes on smtpd.SMTPChannel made public and deprecate
- the private attributes. Add tests for smtpd module.
+- Issue #1178863: Separate initialisation from setting when initializing
+ Tkinter.Variables; harmonize exceptions to ValueError; only delete variables
+ that have not been deleted; assert that variable names are strings.
-- Issue #3196: email header decoding is now forgiving if an RFC2047 encoded word
- encoded in base64 is lacking padding.
+- Issue #14104: Implement time.monotonic() on Mac OS X, patch written by
+ Nicholas Riley.
-- Issue #9444: Argparse now uses the first element of prefix_chars as the option
- character for the added 'h/help' option if prefix_chars does not contain a
- '-', instead of raising an error.
+- Issue #13394: the aifc module now uses warnings.warn() to signal warnings.
-- Issue #7372: Fix pstats regression when stripping paths from profile data
- generated with the profile module.
+- Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under
+ Windows when the child process has already exited.
-- Issue #9428: Fix running scripts with the profile/cProfile modules from the
- command line.
+- Issue #14223: curses.addch() is no more limited to the range 0-255 when the
+ Python curses is not linked to libncursesw. It was a regression introduced
+ in Python 3.3a1.
-- Issue #7781: Fix restricting stats by entry counts in the pstats interactive
- browser.
+- Issue #14168: Check for presence of Element._attrs in minidom before
+ accessing it.
-- Issue #9209: Do not crash in the pstats interactive browser on invalid regular
- expressions.
+- Issue #12328: Fix multiprocessing's use of overlapped I/O on Windows.
+ Also, add a multiprocessing.connection.wait(rlist, timeout=None) function
+ for polling multiple objects at once. Patch by sbt.
-- Update collections.OrderedDict to match the implementation in Py2.7 (based on
- lists instead of weakly referenced Link objects).
+- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end,
+ data or close method) for the Python implementation as well.
+ Drop the no-op TreeBuilder().xml() method from the C implementation.
-- Issue #8397: Raise an error when attempting to mix iteration and regular reads
- on a BZ2File object, rather than returning incorrect results.
+- Issue #14210: pdb now has tab-completion not only for command names, but
+ also for their arguments, wherever possible.
-- Issue #9448: Fix a leak of OS resources (mutexes or semaphores) when
- re-initializing a buffered IO object by calling its ``__init__`` method.
+- Issue #14310: Sockets can now be with other processes on Windows using
+ the api socket.socket.share() and socket.fromshare().
-- Issue #1713: Fix os.path.ismount(), which returned true for symbolic links
- across devices.
+- Issue #10576: The gc module now has a 'callbacks' member that will get
+ called when garbage collection takes place.
-- Issue #8826: Properly load old-style "expires" attribute in http.cookies.
+Build
+-----
-- Issue #1690103: Fix initial namespace for code run with trace.main().
+- Issue #14557: Fix extensions build on HP-UX. Patch by Adi Roiban.
-- Issue #7395: Fix tracebacks in pstats interactive browser.
+- Issue #14387: Do not include accu.h from Python.h.
-- Issue #8230: Fix Lib/test/sortperf.py.
+- Issue #14359: Only use O_CLOEXEC in _posixmodule.c if it is defined.
+ Based on patch from Hervé Coatanhay.
-- Issue #8620: when a cmd.Cmd() is fed input that reaches EOF without a final
- newline, it no longer truncates the last character of the last command line.
+- Issue #14321: Do not run pgen during the build if files are up to date.
-- Issue #5146: Handle UID THREAD command correctly in imaplib.
+Documentation
+-------------
-- Issue #5147: Fix the header generated for cookie files written by
- http.cookiejar.MozillaCookieJar.
+- Issue #14034: added the argparse tutorial.
-- Issue #8198: In pydoc, output all help text to the correct stream when
- sys.stdout is reassigned.
+- Issue #14324: Fix configure tests for cross builds.
-- Issue #7909: Do not touch paths with the special prefixes ``\\.\`` or ``\\?\``
- in ntpath.normpath().
+- Issue #14327: Call AC_CANONICAL_HOST in configure.ac and check in
+ config.{guess,sub}. Don't use uname calls for cross builds.
-- Issue #1286: Allow using fileinput.FileInput as a context manager.
+Extension Modules
+-----------------
-- Add lru_cache() decorator to the functools module.
+- Issue #9041: An issue in ctypes.c_longdouble, ctypes.c_double, and
+ ctypes.c_float that caused an incorrect exception to be returned in the
+ case of overflow has been fixed.
-Tools/Demos
------------
+- Issue #14212: The re module didn't retain a reference to buffers it was
+ scanning, resulting in segfaults.
-- Fix ``Tools/scripts/checkpyc.py`` after PEP 3147.
+- Issue #14259: The finditer() method of re objects did not take any
+ keyword arguments, contrary to the documentation.
-- Issue #8867: Fix ``Tools/scripts/serve.py`` to work with files containing
- non-ASCII content.
+- Issue #10142: Support for SEEK_HOLE/SEEK_DATA (for example, under ZFS).
Tests
-----
-- Issue #9601: Provide a test case for ftplib.parse257.
-
-- Issue #8857: Provide a test case for socket.getaddrinfo.
-
-- Issue #7564: Skip test_ioctl if another process is attached to /dev/tty.
-
-- Issue #8433: Fix test_curses failure with newer versions of ncurses.
-
-- Issue #9496: Provide a test suite for the rlcompleter module. Patch by
- Michele Orrù.
-
-- Issue #8687: provide a test suite for sched.py module.
-
-Build
------
+- Issue #14442: Add missing errno import in test_smtplib.
-- Issue #1303434: Generate ZIP file containing all PDBs.
+- Issue #8315: (partial fix) python -m unittest test.test_email now works.
-- Issue #9193: PEP 3149 is accepted.
-- Issue #3101: Helper functions _add_one_to_index_C() and _add_one_to_index_F()
- become _Py_add_one_to_index_C() and _Py_add_one_to_index_F(), respectively.
+What's New in Python 3.3.0 Alpha 1?
+===================================
-- Issue #9700: define HAVE_BROKEN_POSIX_SEMAPHORES under AIX 6.x. Patch by
- Sébastien Sablé.
-
-- Don't run pgen twice when using make -j.
-
-
-What's New in Python 3.2 Alpha 1?
-=================================
-
-*Release date: 01-Aug-2010*
+*Release date: 05-Mar-2012*
Core and Builtins
-----------------
-- Issue #8991: convertbuffer() rejects discontigious buffers.
-
-- Issue #7616: Fix copying of overlapping memoryview slices with the Intel
- compiler.
-
-- Issue #8413: structsequence now subclasses tuple.
-
-- Issue #8271: during the decoding of an invalid UTF-8 byte sequence, only the
- start byte and the continuation byte(s) are now considered invalid, instead of
- the number of bytes specified by the start byte. E.g.:
- '\xf1\x80AB'.decode('utf-8', 'replace') now returns u'\ufffdAB' and replaces
- with U+FFFD only the start byte ('\xf1') and the continuation byte ('\x80')
- even if '\xf1' is the start byte of a 4-bytes sequence. Previous versions
- returned a single u'\ufffd'.
-
-- Issue #9011: A negated imaginary literal (e.g., "-7j") now has real part -0.0
- rather than 0.0. So "-7j" is now exactly equivalent to "-(7j)".
-
-- Be more specific in error messages about positional arguments.
+- Issue #14172: Fix reference leak when marshalling a buffer-like object
+ (other than a bytes object).
-- Issue #8949: "z" format of PyArg_Parse*() functions doesn't accept bytes
- objects, as described in the documentation.
+- Issue #13521: dict.setdefault() now does only one lookup for the given key,
+ making it "atomic" for many purposes. Patch by Filip Gruszczyński.
-- Issue #6543: Write the traceback in the terminal encoding instead of utf-8.
- Fix the encoding of the modules filename. Patch written by Amaury Forgeot
- d'Arc.
+- PEP 409, Issue #6210: "raise X from None" is now supported as a means of
+ suppressing the display of the chained exception context. The chained
+ context still remains available as the __context__ attribute.
-- Issue #9011: Remove buggy and unnecessary (in 3.x) ST->AST compilation code
- dealing with unary minus applied to a constant. The removed code was mutating
- the ST, causing a second compilation to fail.
+- Issue #10181: New memoryview implementation fixes multiple ownership
+ and lifetime issues of dynamically allocated Py_buffer members (#9990)
+ as well as crashes (#8305, #7433). Many new features have been added
+ (See whatsnew/3.3), and the documentation has been updated extensively.
+ The ndarray test object from _testbuffer.c implements all aspects of
+ PEP-3118, so further development towards the complete implementation
+ of the PEP can proceed in a test-driven manner.
-- Issue #850997: mbcs encoding (Windows only) handles errors argument: strict
- mode raises unicode errors. The encoder only supports "strict" and "replace"
- error handlers, the decoder only supports "strict" and "ignore" error
- handlers. Patch written by Mark Hammond.
+ Thanks to Nick Coghlan, Antoine Pitrou and Pauli Virtanen for review
+ and many ideas.
-- Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
- "w*" format instead. Add tests for "w*" format.
+- Issue #12834: Fix incorrect results of memoryview.tobytes() for
+ non-contiguous arrays.
-- Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
- formats if the string contains a null byte/character. Write unit tests for
- string formats.
+- Issue #5231: Introduce memoryview.cast() method that allows changing
+ format and shape without making a copy of the underlying memory.
-- Issue #7490: To facilitate sharing of doctests between 2.x and 3.x test
- suites, the IGNORE_EXCEPTION_DETAIL directive now also ignores the module
- location of the raised exception.
+- Issue #14084: Fix a file descriptor leak when importing a module with a
+ bad encoding.
-- Issue #8969: On Windows, use mbcs codec in strict mode to encode and decode
- filenames and enable os.fsencode().
+- Upgrade Unicode data to Unicode 6.1.
-- Issue #9058: Remove assertions about INT_MAX in UnicodeDecodeError.
+- Issue #14040: Remove rarely used file name suffixes for C extensions
+ (under POSIX mainly).
-- Issue #8941: Decoding big endian UTF-32 data in UCS-2 builds could crash the
- interpreter with characters outside the Basic Multilingual Plane (higher than
- 0x10000).
+- Issue #14051: Allow arbitrary attributes to be set of classmethod and
+ staticmethod.
-- Issue #8950: (See also issue #5080). Py_ArgParse*() functions now raise
- TypeError instead of giving a DeprecationWarning when a float is parsed using
- the 'L' code (for long long). (All other integer codes already raise
- TypeError in this case.)
+- Issue #13703: oCERT-2011-003: Randomize hashes of str and bytes to protect
+ against denial of service attacks due to hash collisions within the dict and
+ set types. Patch by David Malcolm, based on work by Victor Stinner.
-- Issue #8922: Normalize the encoding name in PyUnicode_AsEncodedString() to
- enable shortcuts for upper case encoding name. Add also a shortcut for
- "iso-8859-1" in PyUnicode_AsEncodedString() and PyUnicode_Decode().
+- Issue #13020: Fix a reference leak when allocating a structsequence object
+ fails. Patch by Suman Saha.
-- Issue #8838: Remove codecs.charbuffer_encode() function. The buffer protocol
- doesn't support "char buffer" anymore in Python 3.
+- Issue #13908: Ready types returned from PyType_FromSpec.
-- Issue #8339: Remove "t#" format of PyArg_Parse*() functions, use "s#" or "s*"
- instead. codecs.charbuffer_encode() now accepts modifiable buffer objects
- like bytearray.
+- Issue #11235: Fix OverflowError when trying to import a source file whose
+ modification time doesn't fit in a 32-bit timestamp.
-- Issue #8837: Remove "O?" format of PyArg_Parse*() functions. The format is no
- used anymore and it was never documented.
+- Issue #12705: A SyntaxError exception is now raised when attempting to
+ compile multiple statements as a single interactive statement.
-- In str.format(), raise a ValueError when indexes to arguments are too large.
+- Fix the builtin module initialization code to store the init function for
+ future reinitialization.
-- Issue #2844: Make int('42', n) consistently raise ValueError for invalid
- integers n (including n = -909).
+- Issue #8052: The posix subprocess module would take a long time closing
+ all possible file descriptors in the child process rather than just open
+ file descriptors. It now closes only the open fds if possible for the
+ default close_fds=True behavior.
-- Issue #8188: Introduce a new scheme for computing hashes of numbers (instances
- of int, float, complex, decimal.Decimal and fractions.Fraction) that makes it
- easy to maintain the invariant that hash(x) == hash(y) whenever x and y have
- equal value.
+- Issue #13629: Renumber the tokens in token.h so that they match the indexes
+ into _PyParser_TokenNames.
-- Issue #8748: Fix two issues with comparisons between complex and integer
- objects. (1) The comparison could incorrectly return True in some cases
- (2**53+1 == complex(2**53) == 2**53), breaking transitivity of equality.
- (2) The comparison raised an OverflowError for large integers, leading to
- unpredictable exceptions when combining integers and complex objects in sets
- or dicts.
+- Issue #13752: Add a casefold() method to str.
-- Issue #8766: Initialize _warnings module before importing the first module.
- Fix a crash if an empty directory called "encodings" exists in sys.path.
+- Issue #13761: Add a "flush" keyword argument to the print() function,
+ used to ensure flushing the output stream.
-- Issue #8589: Decode PYTHONWARNINGS environment variable with the file system
- encoding and surrogateescape error handler instead of the locale encoding to
- be consistent with os.environ. Add PySys_AddWarnOptionUnicode() function.
+- Issue #13645: pyc files now contain the size of the corresponding source
+ code, to avoid timestamp collisions (especially on filesystems with a low
+ timestamp resolution) when checking for freshness of the bytecode.
-- PyObject_Dump() encodes unicode objects to utf8 with backslashreplace (instead
- of strict) error handler to escape surrogates.
+- PEP 380, Issue #11682: Add "yield from <x>" to support easy delegation to
+ subgenerators (initial patch by Greg Ewing, integration into 3.3 by
+ Renaud Blanch, Ryan Kelly, Zbigniew Jędrzejewski-Szmek and Nick Coghlan)
-- Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
- object to Py_FileSystemDefaultEncoding with the "surrogateescape" error
- handler, and return bytes. If Py_FileSystemDefaultEncoding is not set, fall
- back to UTF-8.
+- Issue #13748: Raw bytes literals can now be written with the ``rb`` prefix
+ as well as ``br``.
-- Enable shortcuts for common encodings in PyUnicode_AsEncodedString() for any
- error handler, not only the default error handler (strict).
+- Issue #12736: Use full unicode case mappings for upper, lower, and title case.
-- Issue #8610: Load file system codec at startup, and display a fatal error on
- failure. Set the file system encoding to utf-8 (instead of None) if getting
- the locale encoding failed, or if nl_langinfo(CODESET) function is missing.
+- Issue #12760: Add a create mode to open(). Patch by David Townshend.
-- PyFile_FromFd() uses PyUnicode_DecodeFSDefault() instead of
- PyUnicode_FromString() to support surrogates in the filename and use the right
- encoding.
+- Issue #13738: Simplify implementation of bytes.lower() and bytes.upper().
-- Issue #7507: Quote "!" in pipes.quote(); it is special to some shells.
+- Issue #13577: Built-in methods and functions now have a __qualname__.
+ Patch by sbt.
-- PyUnicode_DecodeFSDefaultAndSize() uses surrogateescape error handler.
+- Issue #6695: Full garbage collection runs now clear the freelist of set
+ objects. Initial patch by Matthias Troffaes.
-- Issue #8419: Prevent the dict constructor from accepting non-string keyword
- arguments.
+- Fix OSError.__init__ and OSError.__new__ so that each of them can be
+ overriden and take additional arguments (followup to issue #12555).
-- Issue #8124: PySys_WriteStdout() and PySys_WriteStderr() don't execute
- indirectly Python signal handlers anymore because mywrite() ignores exceptions
- (KeyboardInterrupt).
+- Fix the fix for issue #12149: it was incorrect, although it had the side
+ effect of appearing to resolve the issue. Thanks to Mark Shannon for
+ noticing.
-- Issue #8092: Fix PyUnicode_EncodeUTF8() to support error handler producing
- unicode string (eg. backslashreplace).
+- Issue #13505: Pickle bytes objects in a way that is compatible with
+ Python 2 when using protocols <= 2.
-- Issue #8485: PyUnicode_FSConverter() doesn't accept byteearray objects
- anymore, you have to convert your bytearray filenames to bytes.
+- Issue #11147: Fix an unused argument in _Py_ANNOTATE_MEMORY_ORDER. (Fix
+ given by Campbell Barton).
-- Issue #7332: Remove the 16KB stack-based buffer in
- PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable benefit
- compared to the dynamic memory allocation fallback. Patch by Charles-François
- Natali.
+- Issue #13503: Use a more efficient reduction format for bytearrays with
+ pickle protocol >= 3. The old reduction format is kept with older protocols
+ in order to allow unpickling under Python 2. Patch by Irmen de Jong.
-- Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is
- passed to bytes or bytearray.
+- Issue #7111: Python can now be run without a stdin, stdout or stderr
+ stream. It was already the case with Python 2. However, the corresponding
+ sys module entries are now set to None (instead of an unusable file object).
-- Issue #7301: Add environment variable $PYTHONWARNINGS.
+- Issue #11849: Ensure that free()d memory arenas are really released
+ on POSIX systems supporting anonymous memory mappings. Patch by
+ Charles-François Natali.
-- Issue #8329: Don't return the same lists from select.select when no fds are
- changed.
+- Issue #13452: PyUnicode_EncodeDecimal() doesn't support error handlers
+ different than "strict" anymore. The caller was unable to compute the
+ size of the output buffer: it depends on the error handler.
-- Issue #8259: 1L << (2**31) no longer produces an 'outrageous shift error' on
- 64-bit machines. The shift count for either left or right shift is permitted
- to be up to sys.maxsize.
+- PEP 3155 / issue #13448: Qualified name for classes and functions.
-- Ensure that tokenization of identifiers is not affected by locale.
+- Issue #13436: Fix a bogus error message when an AST object was passed
+ an invalid integer value.
-- Issue #1222585: Added LDCXXSHARED for C++ support. Patch by Arfrever.
+- Issue #13411: memoryview objects are now hashable when the underlying
+ object is hashable.
-- Raise a TypeError when trying to delete a T_STRING_INPLACE struct member.
+- Issue #13338: Handle all enumerations in _Py_ANNOTATE_MEMORY_ORDER
+ to allow compiling extension modules with -Wswitch-enum on gcc.
+ Initial patch by Floris Bruynooghe.
-- Issue #8211: Save/restore CFLAGS around AC_PROG_CC in configure.in, in case it
- is set.
+- Issue #10227: Add an allocation cache for a single slice object. Patch by
+ Stefan Behnel.
-- Issue #8226: sys.setfilesystemencoding() raises a LookupError if the encoding
- is unknown.
+- Issue #13393: BufferedReader.read1() now asks the full requested size to
+ the raw stream instead of limiting itself to the buffer size.
-- Issue #1583863: A str subclass can now override the __str__ method.
+- Issue #13392: Writing a pyc file should now be atomic under Windows as well.
-- Issue #8014: Setting a T_UINT or T_PYSSIZET attribute of an object with
- PyMemberDefs could produce an internal error; raise TypeError instead.
+- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
+ already accepts them).
-- Issue #7845: Rich comparison methods on the complex type now return
- NotImplemented rather than raising a TypeError when comparing with an
- incompatible type; this allows user-defined classes to implement their own
- comparisons with complex.
+- Issue #13389: Full garbage collection passes now clear the freelists for
+ list and dict objects. They already cleared other freelists in the
+ interpreter.
-- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
- (SIGINT). If an error occurs while importing the site module, the error is
- printed and Python exits. Initialize the GIL before importing the site module.
+- Issue #13327: Remove the need for an explicit None as the second argument
+ to os.utime, os.lutimes, os.futimes, os.futimens, os.futimesat, in
+ order to update to the current time. Also added keyword argument
+ handling to os.utimensat in order to remove the need for explicit None.
-- Issue #7173: Generator finalization could invalidate sys.exc_info().
+- Issue #13350: Simplify some C code by replacing most usages of
+ PyUnicode_Format by PyUnicode_FromFormat.
-- Issue #7544: Preallocate thread memory before creating the thread to avoid a
- fatal error in low memory condition.
+- Issue #13342: input() used to ignore sys.stdin's and sys.stdout's unicode
+ error handler in interactive mode (when calling into PyOS_Readline()).
-- Issue #7820: The parser tokenizer restores all bytes in the right if the BOM
- check fails.
+- Issue #9896: Add start, stop, and step attributes to range objects.
-- Handle errors from looking up __prepare__ correctly.
+- Issue #13343: Fix a SystemError when a lambda expression uses a global
+ variable in the default value of a keyword-only argument: ``lambda *,
+ arg=GLOBAL_NAME: None``
-- Issue #5939: Add additional runtime checking to ensure a valid capsule in
- Modules/_ctypes/callproc.c.
+- Issue #12797: Added custom opener parameter to builtin open() and
+ FileIO.open().
-- Issue #7309: Fix unchecked attribute access when converting
- UnicodeEncodeError, UnicodeDecodeError, and UnicodeTranslateError to strings.
+- Issue #10519: Avoid unnecessary recursive function calls in
+ setobject.c.
-- Issue #6902: Fix problem with built-in types format incorrectly with 0
- padding.
+- Issue #10363: Deallocate global locks in Py_Finalize().
-- Issue #7988: Fix default alignment to be right aligned for complex.__format__.
- Now it matches other numeric types.
+- Issue #13018: Fix reference leaks in error paths in dictobject.c.
+ Patch by Suman Saha.
-- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
- PyOS_ascii_strtod, and PyOS_ascii_atof. Use PyOS_double_to_string and
- PyOS_string_to_double instead. See issue #5835 for the original deprecations.
+- Issue #13201: Define '==' and '!=' to compare range objects based on
+ the sequence of values they define (instead of comparing based on
+ object identity).
-- Issue #7385: Fix a crash in `MemoryView_FromObject` when `PyObject_GetBuffer`
- fails. Patch by Florent Xicluna.
+- Issue #1294232: In a few cases involving metaclass inheritance, the
+ interpreter would sometimes invoke the wrong metaclass when building a new
+ class object. These cases now behave correctly. Patch by Daniel Urban.
-- Issue #7788: Fix an interpreter crash produced by deleting a list slice with
- very large step value.
+- Issue #12753: Add support for Unicode name aliases and named sequences.
+ Both ``unicodedata.lookup()`` and '\N{...}' now resolve aliases,
+ and ``unicodedata.lookup()`` resolves named sequences too.
-- Issue #7766: Change sys.getwindowsversion() return value to a named tuple and
- add the additional members returned in an OSVERSIONINFOEX structure. The new
- members are service_pack_major, service_pack_minor, suite_mask, and
- product_type.
+- Issue #12170: The count(), find(), rfind(), index() and rindex() methods
+ of bytes and bytearray objects now accept an integer between 0 and 255
+ as their first argument. Patch by Petri Lehtinen.
-- Issue #7561: Operations on empty bytearrays (such as `int(bytearray())`) could
- crash in many places because of the PyByteArray_AS_STRING() macro returning
- NULL. The macro now returns a statically allocated empty string instead.
+- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler
+ warnings. Patch by Josh Triplett and Petri Lehtinen.
-- Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
- where the right hand operand is a set of constants, by turning the set into a
- frozenset and pre-building it as a constant. The comparison operation is made
- against the constant instead of building a new set each time it is executed (a
- similar optimization already existed which turned a list of constants into a
- pre-built tuple). Patch and additional tests by Dave Malcolm.
+- Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore
+ error handlers on all Windows versions. The MBCS codec is now supporting all
+ error handlers, instead of only replace to encode and ignore to decode.
-- Issue #7622: Improve the split(), rsplit(), splitlines() and replace() methods
- of bytes, bytearray and unicode objects by using a common implementation based
- on stringlib's fast search. Patch by Florent Xicluna.
+- Issue #13188: When called without an explicit traceback argument,
+ generator.throw() now gets the traceback from the passed exception's
+ ``__traceback__`` attribute. Patch by Petri Lehtinen.
-- Issue #7632: Fix various str -> float conversion bugs present in 2.7 alpha 2,
- including: (1) a serious 'wrong output' bug that could occur for long (> 40
- digit) input strings, (2) a crash in dtoa.c that occurred in debug builds when
- parsing certain long numeric strings corresponding to subnormal values, (3) a
- memory leak for some values large enough to cause overflow, and (4) a number
- of flaws that could lead to incorrectly rounded results.
+- Issue #13146: Writing a pyc file is now atomic under POSIX.
-- The __complex__ method is now looked up on the class of instances to make it
- consistent with other special methods.
+- Issue #7833: Extension modules built using distutils on Windows will no
+ longer include a "manifest" to prevent them failing at import time in some
+ embedded situations.
-- Issue #7462: Implement the stringlib fast search algorithm for the `rfind`,
- `rindex`, `rsplit` and `rpartition` methods. Patch by Florent Xicluna.
+- PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy.
-- Issue #7604: Deleting an unset slotted attribute did not raise an
- AttributeError.
+- Issue #13560: Add PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize()
+ and PyUnicode_EncodeLocale() functions to the C API to decode/encode from/to
+ the current locale encoding.
-- Issue #7534: Fix handling of IEEE specials (infinities, nans, negative zero)
- in ** operator. The behaviour now conforms to that described in C99 Annex F.
+- Add internal API for static strings (_Py_identifier et al.).
-- Issue #1811: improve accuracy and cross-platform consistency for true division
- of integers: the result of a/b is now correctly rounded for ints a and b (at
- least on IEEE 754 platforms), and in particular does not depend on the
- internal representation of an int.
+- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described
+ as "The pipe is being closed") is now mapped to POSIX errno EPIPE
+ (previously EINVAL).
-- Issue #6834: replace the implementation for the 'python' and 'pythonw'
- executables on OSX.
+- Issue #12911: Fix memory consumption when calculating the repr() of huge
+ tuples or lists.
- These executables now work properly with the arch(1) command: ``arch -ppc
- python`` will start a universal binary version of python in PPC mode (unlike
- previous releases).
+- PEP 393: flexible string representation. Thanks to Torsten Becker for the
+ initial implementation, and Victor Stinner for various bug fixes.
-- Issue #7466: Segmentation fault when the garbage collector is called in the
- middle of populating a tuple. Patch by Florent Xicluna.
+- Issue #14081: The 'sep' and 'maxsplit' parameter to str.split, bytes.split,
+ and bytearray.split may now be passed as keyword arguments.
-- Issue #7419: setlocale() could crash the interpreter on Windows when called
- with invalid values.
+- Issue #13012: The 'keepends' parameter to str.splitlines may now be passed
+ as a keyword argument: "my_string.splitlines(keepends=True)". The same
+ change also applies to bytes.splitlines and bytearray.splitlines.
-- Issue #6077: On Windows, files opened with tempfile.TemporaryFile in "wt+"
- mode would appear truncated on the first '0x1a' byte (aka. Ctrl+Z).
+- Issue #7732: Don't open a directory as a file anymore while importing a
+ module. Ignore the direcotry if its name matchs the module name (e.g.
+ "__init__.py") and raise a ImportError instead.
-- Issue #7085: Fix crash when importing some extensions in a thread on MacOSX
- 10.6.
+- Issue #13021: Missing decref on an error path. Thanks to Suman Saha for
+ finding the bug and providing a patch.
-- Issue #1757126: Fix the cyrillic-asian alias for the ptcp154 encoding.
+- Issue #12973: Fix overflow checks that relied on undefined behaviour in
+ list_repeat (listobject.c) and islice_next (itertoolsmodule.c). These bugs
+ caused test failures with recent versions of Clang.
-- Issue #6970: Remove redundant calls when comparing objects that don't
- implement the relevant rich comparison methods.
+- Issue #12904: os.utime, os.futimes, os.lutimes, and os.futimesat now write
+ atime and mtime with nanosecond precision on modern POSIX platforms.
-- Issue #7298: Fixes for range and reversed(range(...)). Iteration over
- range(a, b, c) incorrectly gave an empty iterator when a, b and c fit in C
- long but the length of the range did not. Also fix several cases where
- reversed(range(a, b, c)) gave wrong results, and fix a refleak for
- reversed(range(a, b, c)) with large arguments.
+- Issue #12802: the Windows error ERROR_DIRECTORY (numbered 267) is now
+ mapped to POSIX errno ENOTDIR (previously EINVAL).
-- Issue #7244: itertools.izip_longest() no longer ignores exceptions raised
- during the formation of an output tuple.
+- Issue #9200: The str.is* methods now work with strings that contain non-BMP
+ characters even in narrow Unicode builds.
-- Issue #3297: On wide unicode builds, do not split unicode characters into
- surrogates.
+- Issue #12791: Break reference cycles early when a generator exits with
+ an exception.
-- Remove length limitation when constructing a complex number from a string.
+- Issue #12773: Make __doc__ mutable on user-defined classes.
-- Issue #1087418: Boost performance of bitwise operations for longs.
+- Issue #12766: Raise a ValueError when creating a class with a class variable
+ that conflicts with a name in __slots__.
-- Support for AtheOS has been completely removed from the code base. It was
- disabled since Python 3.0.
+- Issue #12266: Fix str.capitalize() to correctly uppercase/lowercase
+ titlecased and cased non-letter characters.
-- Support for several legacy threading libraries has been disabled. These
- libraries are: Mach C threads, SunOS LWP, GNU pth, Irix threads. Support code
- will be entirely removed in 3.3.
+- Issue #12732: In narrow unicode builds, allow Unicode identifiers which fall
+ outside the BMP.
-- Support for OSF* has been disabled. If nobody stands up, support will be
- removed in 3.3. See <http://bugs.python.org/issue8606>.
+- Issue #12575: Validate user-generated AST before it is compiled.
-- Peephole constant folding had missed UNARY_POSITIVE.
+- Make type(None), type(Ellipsis), and type(NotImplemented) callable. They
+ return the respective singleton instances.
-- Issue #1722344: threading._shutdown() is now called in Py_Finalize(), which
- fixes the problem of some exceptions being thrown at shutdown when the
- interpreter is killed. Patch by Adam Olsen.
+- Forbid summing bytes with sum().
-- Issue #7147: Remove support for compiling Python without complex number
- support.
+- Verify the types of AST strings and identifiers provided by the user before
+ compiling them.
-- Issue #7120: logging: Removed import of multiprocessing which is causing crash
- in GAE.
+- Issue #12647: The None object now has a __bool__() method that returns False.
+ Formerly, bool(None) returned False only because of special case logic
+ in PyObject_IsTrue().
-- Issue #1754094: Improve the stack depth calculation in the compiler. There
- should be no other effect than a small decrease in memory use. Patch by
- Christopher Tur Lesniewski-Laas.
+- Issue #12579: str.format_map() now raises a ValueError if used on a
+ format string that contains positional fields. Initial patch by
+ Julian Berman.
-- Issue #7065: Fix a crash in bytes.maketrans and bytearray.maketrans when using
- byte values greater than 127. Patch by Derk Drukker.
+- Issue #10271: Allow warnings.showwarning() be any callable.
-- Issue #1571184: The Unicode database contains properties for more characters.
- The tables for code points representing numeric values, white spaces or line
- breaks are now generated from the official Unicode Character Database files,
- and include information from the Unihan.txt file.
+- Issue #11627: Fix segfault when __new__ on a exception returns a
+ non-exception class.
-- Issue #7019: Raise ValueError when unmarshalling bad long data, instead of
- producing internally inconsistent Python longs.
+- Issue #12149: Update the method cache after a type's dictionary gets
+ cleared by the garbage collector. This fixes a segfault when an instance
+ and its type get caught in a reference cycle, and the instance's
+ deallocator calls one of the methods on the type (e.g. when subclassing
+ IOBase). Diagnosis and patch by Davide Rizzo.
-- Issue #6990: Fix threading.local subclasses leaving old state around after a
- reference cycle GC which could be recycled by new locals.
+- Issue #9611, #9015: FileIO.read() clamps the length to INT_MAX on Windows.
-- Issue #5460: Fix an ambiguity in the grammar.
+- Issue #9642: Uniformize the tests on the availability of the mbcs codec, add
+ a new HAVE_MBCS define.
-- Issue #1766304: Improve performance of membership tests on range objects.
+- Issue #9642: Fix filesystem encoding initialization: use the ANSI code page
+ on Windows if the mbcs codec is not available, and fail with a fatal error if
+ we cannot get the locale encoding (if nl_langinfo(CODESET) is not available)
+ instead of using UTF-8.
-- Issue #6713: Improve performance of integer -> string conversions.
+- When a generator yields, do not retain the caller's exception state on the
+ generator.
-- Issue #6846: Fix bug where bytearray.pop() returns negative integers.
+- Issue #12475: Prevent generators from leaking their exception state into the
+ caller's frame as they return for the last time.
-- Issue #6750: A text file opened with io.open() could duplicate its output when
- writing from multiple threads at the same time.
+- Issue #12291: You can now load multiple marshalled objects from a stream,
+ with other data interleaved between marshalled objects.
-- Issue #6707: dir() on an uninitialized module caused a crash.
+- Issue #12356: When required positional or keyword-only arguments are not
+ given, produce a informative error message which includes the name(s) of the
+ missing arguments.
-- Issue #6540: Fixed crash for bytearray.translate() with invalid parameters.
+- Issue #12370: Fix super with no arguments when __class__ is overriden in the
+ class body.
-- Issue #6573: set.union() stopped processing inputs if an instance of self
- occurred in the argument chain.
+- Issue #12084: os.stat on Windows now works properly with relative symbolic
+ links when called from any directory.
-- Issue #6070: On posix platforms import no longer copies the execute bit from
- the .py file to the .pyc file if it is set.
+- Loosen type restrictions on the __dir__ method. __dir__ can now return any
+ sequence, which will be converted to a list and sorted by dir().
-- Issue #1616979: Added the cp720 (Arabic DOS) encoding.
+- Issue #12265: Make error messages produced by passing an invalid set of
+ arguments to a function more informative.
-- Issue #6428: Since Python 3.0, the __bool__ method must return a bool object,
- and not an int. Fix the corresponding error message, and the documentation.
+- Issue #12225: Still allow Python to build if Python is not in its hg repo or
+ mercurial is not installed.
-- The deprecated PyCObject has been removed.
+- Issue #1195: my_fgets() now always clears errors before calling fgets(). Fix
+ the following case: sys.stdin.read() stopped with CTRL+d (end of file),
+ raw_input() interrupted by CTRL+c.
-- Issue #6347: Include inttypes.h as well as stdint.h in pyport.h. This fixes a
- build failure on HP-UX: int32_t and uint32_t are defined in inttypes.h instead
- of stdint.h on that platform.
+- Issue #12216: Allow unexpected EOF errors to happen on any line of the file.
-- Issue #6373: Fixed a SystemError when encoding with the latin-1 codec and the
- 'surrogateescape' error handler, a string which contains unpaired surrogates.
+- Issue #12199: The TryExcept and TryFinally and AST nodes have been unified
+ into a Try node.
-- Issue #4856: Remove checks for win NT.
+- Issue #9670: Increase the default stack size for secondary threads on
+ Mac OS X and FreeBSD to reduce the chances of a crash instead of a
+ "maximum recursion depth" RuntimeError exception.
+ (patch by Ronald Oussoren)
-- Issue #6687: PyBytes_FromObject() no longer accepts an integer as its argument
- to construct a null-initialized bytes object.
+- Issue #12106: The use of the multiple-with shorthand syntax is now reflected
+ in the AST.
-- Issue #1023290: Add from_bytes() and to_bytes() methods to integers. These
- methods allow the conversion of integers to bytes, and vice-versa.
+- Issue #12190: Try to use the same filename object when compiling unmarshalling
+ a code objects in the same file.
-- Issue #7382: Fix bug in bytes.__getnewargs__ that prevented bytes instances
- from being copied with copy.copy(), and bytes subclasses from being pickled
- properly.
+- Issue #12166: Move implementations of dir() specialized for various types into
+ the __dir__() methods of those types.
-- Code objects now support weak references.
+- Issue #5715: In socketserver, close the server socket in the child process.
-- Issue #7072: isspace(0xa0) is true on Mac OS X.
+- Correct lookup of __dir__ on objects. Among other things, this causes errors
+ besides AttributeError found on lookup to be propagated.
-- Issue #8084: PEP 370 now conforms to system conventions for framework builds
- on MacOS X. That is, "python setup.py install --user" will install into
- "~/Library/Python/2.7" instead of "~/.local".
+- Issue #12060: Use sig_atomic_t type and volatile keyword in the signal
+ module. Patch written by Charles-François Natali.
-C-API
------
+- Issue #1746656: Added the if_nameindex, if_indextoname, if_nametoindex
+ methods to the socket module.
-- Issue #2443: A new macro, `Py_VA_COPY`, copies the state of the
- variable argument list. `Py_VA_COPY` is equivalent to C99
- `va_copy`, but available on all python platforms.
+- Issue #12044: Fixed subprocess.Popen when used as a context manager to
+ wait for the process to end when exiting the context to avoid unintentionally
+ leaving zombie processes around.
-- PySlice_GetIndicesEx now clips the step to [-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX]
- instead of [-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do
- "step = -step" when reversing a slice.
+- Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c,
+ clear the end-of-file indicator after CTRL+d.
-- Issue #5753: A new C API function, `PySys_SetArgvEx`, allows embedders of the
- interpreter to set sys.argv without also modifying sys.path. This helps fix
- `CVE-2008-5983
- <http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_.
+- Issue #1856: Avoid crashes and lockups when daemon threads run while the
+ interpreter is shutting down; instead, these threads are now killed when
+ they try to take the GIL.
-- Add PyArg_ValidateKeywordArguments, which checks if all keyword arguments are
- strings in an efficient manner.
+- Issue #9756: When calling a method descriptor or a slot wrapper descriptor,
+ the check of the object type doesn't read the __class__ attribute anymore.
+ Fix a crash if a class override its __class__ attribute (e.g. a proxy of the
+ str type). Patch written by Andreas Stührk.
-- Issue #8276: PyEval_CallObject() is now only available in macro form. The
- function declaration, which was kept for backwards compatibility reasons, is
- now removed (the macro was introduced in 1997!).
+- Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
+ APIs, to avoid a crash with the pthread implementation in RHEL 5. Patch
+ by Charles-François Natali.
-- Issue #7767: New function PyLong_AsLongLongAndOverflow added, analogous to
- PyLong_AsLongAndOverflow.
+- Issue #10914: Initialize correctly the filesystem codec when creating a new
+ subinterpreter to fix a bootstrap issue with codecs implemented in Python, as
+ the ISO-8859-15 codec.
-- Make PyUnicode_CompareWithASCIIString return not equal if the Python string
- has '\0' at the end.
+- Issue #11918: OS/2 and VMS are no more supported because of the lack of
+ maintainer.
-- Issue #5080: The argument parsing functions PyArg_ParseTuple,
- PyArg_ParseTupleAndKeywords, PyArg_VaParse, PyArg_VaParseTupleAndKeywords and
- PyArg_Parse now raise a DeprecationWarning for float arguments passed with the
- 'L' format code. This will become a TypeError in a future version of Python,
- to match the behaviour of the other integer format codes.
+- Issue #6780: fix starts/endswith error message to mention that tuples are
+ accepted too.
-- Issue #7033: Function ``PyErr_NewExceptionWithDoc()`` added.
+- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
+ between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
+ chars (e.g. "\U00012345"[0]).
-- Issue #7414: 'C' code wasn't being skipped properly (for keyword arguments) in
- PyArg_ParseTupleAndKeywords.
+- Issue #11845: Fix typo in rangeobject.c that caused a crash in
+ compute_slice_indices. Patch by Daniel Urban.
-- Issue #7228: Add '%lld' and '%llu' support to PyString_FromFormat(V) and
- PyErr_Format, on machines with HAVE_LONG_LONG defined.
+- Issue #5673: Added a `timeout` keyword argument to subprocess.Popen.wait,
+ subprocess.Popen.communicated, subprocess.call, subprocess.check_call, and
+ subprocess.check_output. If the blocking operation takes more than `timeout`
+ seconds, the `subprocess.TimeoutExpired` exception is raised.
-- Issue #6151: Made PyDescr_COMMON conform to standard C (like PyObject_HEAD in
- PEP 3123). The PyDescr_TYPE and PyDescr_NAME macros should be should used for
- accessing the d_type and d_name members of structures using PyDescr_COMMON.
+- Issue #11650: PyOS_StdioReadline() retries fgets() if it was interrupted
+ (EINTR), for example if the program is stopped with CTRL+z on Mac OS X. Patch
+ written by Charles-Francois Natali.
-- Issue #6405: Remove duplicate type declarations in descrobject.h.
+- Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
-- The code flags for old __future__ features are now available again.
+- Issue #10785: Store the filename as Unicode in the Python parser.
-- Issue #5954: Add a PyFrame_GetLineNumber() function to replace most uses of
- PyCode_Addr2Line().
+- Issue #11619: _PyImport_LoadDynamicModule() doesn't encode the path to bytes
+ on Windows.
-- Issue #5959: Add a PyCode_NewEmpty() function to create a new empty code
- object at a specified file, function, and line number.
+- Issue #10998: Remove mentions of -Q, sys.flags.division_warning and
+ Py_DivisionWarningFlag left over from Python 2.
-- Issue #1419652: Change the first argument to PyImport_AppendInittab() to
- ``const char *`` as the string is stored beyond the call.
+- Issue #11244: Remove an unnecessary peepholer check that was preventing
+ negative zeros from being constant-folded properly.
-- Issue #2422: When compiled with the ``--with-valgrind`` option, the pymalloc
- allocator will be automatically disabled when running under Valgrind. This
- gives improved memory leak detection when running under Valgrind, while taking
- advantage of pymalloc at other times.
+- Issue #11395: io.FileIO().write() clamps the data length to 32,767 bytes on
+ Windows if the file is a TTY to workaround a Windows bug. The Windows console
+ returns an error (12: not enough space error) on writing into stdout if
+ stdout mode is binary and the length is greater than 66,000 bytes (or less,
+ depending on heap usage).
-Library
--------
+- Issue #11320: fix bogus memory management in Modules/getpath.c, leading to
+ a possible crash when calling Py_SetPath().
-- In pdb, when Ctrl-C is entered while defining commands for a breakpoint, the
- old commands are restored.
+- Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
+ 3.2.0 where the stdout or stderr file descriptor being the same as the stdin
+ file descriptor would raise an exception. webbrowser.open would fail. fixed.
-- For traceback debugging, the pdb listing now also shows the locations where
- the exception was originally (re)raised, if it differs from the last line
- executed (e.g. in case of finally clauses).
+- Issue #9856: Change object.__format__ with a non-empty format string
+ to be a DeprecationWarning. In 3.2 it was a PendingDeprecationWarning.
+ In 3.4 it will be a TypeError.
-- The pdb command "source" has been added. It displays the source code for a
- given object, if possible.
+- Issue #11244: The peephole optimizer is now able to constant-fold
+ arbitrarily complex expressions. This also fixes a 3.2 regression where
+ operations involving negative numbers were not constant-folded.
-- The pdb command "longlist" has been added. It displays the whole source code
- for the current function.
+- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when
+ there are many tags (e.g. when using mq). Patch by Nadeem Vawda.
-- Issue #1503502: Make pdb.Pdb easier to subclass by putting message and error
- output into methods.
+- Issue #11335: Fixed a memory leak in list.sort when the key function
+ throws an exception.
-- Issue #809887: Make the output of pdb's breakpoint deletions more consistent;
- emit a message when a breakpoint is enabled or disabled.
+- Issue #8923: When a string is encoded to UTF-8 in strict mode, the result is
+ cached into the object. Examples: str.encode(), str.encode('utf-8'),
+ PyUnicode_AsUTF8String() and PyUnicode_AsEncodedString(unicode, "utf-8",
+ NULL).
-- Issue #5294: Fix the behavior of pdb's "continue" command when called in the
- top-level debugged frame.
+- Issue #10831: PyUnicode_FromFormat() supports %li, %lli and %zi formats.
-- Issue #5727: Restore the ability to use readline when calling into pdb in
- doctests.
+- Issue #10829: Refactor PyUnicode_FromFormat(), use the same function to parse
+ the format string in the 3 steps, fix crashs on invalid format strings.
-- Issue #6719: In pdb, do not stop somewhere in the encodings machinery if the
- source file to be debugged is in a non-builtin encoding.
+- Issue #13007: whichdb should recognize gdbm 1.9 magic numbers.
-- Issue #8048: Prevent doctests from failing when sys.displayhook has been
- reassigned.
+- Issue #11246: Fix PyUnicode_FromFormat("%V") to decode the byte string from
+ UTF-8 (with replace error handler) instead of ISO-8859-1 (in strict mode).
+ Patch written by Ray Allen.
-- Issue #8015: In pdb, do not crash when an empty line is entered as a
- breakpoint command.
+- Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
+ a buffer struct having a NULL data pointer.
-- In pdb, allow giving a line number to the "until" command.
+- Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
+ sys.stdin uses universal newline (replace '\r\n' by '\n').
-- Issue #1437051: For pdb, allow "continue" and related commands in .pdbrc
- files. Also, add a command-line option "-c" that runs a command as if given
- in .pdbrc.
+- Issue #11828: startswith and endswith now accept None as slice index.
+ Patch by Torsten Becker.
-- Issue #4179: In pdb, allow "list ." as a command to return to the currently
- debugged line.
+- Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
+ narrow build.
-- Issue #4108: In urllib.robotparser, if there are multiple ``User-agent: *``
- entries, consider the first one.
+- Issue #11168: Remove filename debug variable from PyEval_EvalFrameEx().
+ It encoded the Unicode filename to UTF-8, but the encoding fails on
+ undecodable filename (on surrogate characters) which raises an unexpected
+ UnicodeEncodeError on recursion limit.
-- Issue #6630: Allow customizing regex flags when subclassing the
- string.Template class.
+- Issue #11187: Remove bootstrap code (use ASCII) of
+ PyUnicode_AsEncodedString(), it was replaced by a better fallback (use the
+ locale encoding) in PyUnicode_EncodeFSDefault().
-- Issue #9411: Allow specifying an encoding for config files in the configparser
- module.
+- Check for NULL result in PyType_FromSpec.
-- Issue #1682942: Improvements to configparser: support alternate delimiters,
- alternate comment prefixes and empty lines in values.
+- Issue #10516: New copy() and clear() methods for lists and bytearrays.
-- Issue #9354: Provide getsockopt() in asyncore's file_wrapper.
+- Issue #11386: bytearray.pop() now throws IndexError when the bytearray is
+ empty, instead of OverflowError.
-- Issue #8966: ctypes: Remove implicit bytes-unicode conversion.
+- Issue #12380: The rjust, ljust and center methods of bytes and bytearray
+ now accept a bytearray argument.
-- Issue #9378: python -m pickle <pickle file> will now load and display the
- first object in the pickle file.
+Library
+-------
-- Issue #4770: Restrict binascii module to accept only bytes (as specified).
- And fix the email package to encode to ASCII instead of ``raw-unicode-escape``
- before ASCII-to-binary decoding.
+- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly
+ return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been
+ fixed.
-- Issue #9384: ``python -m tkinter`` will now display a simple demo applet.
+- Issue #14166: Pickler objects now have an optional ``dispatch_table``
+ attribute which allows to set custom per-pickler reduction functions.
+ Patch by sbt.
-- The default size of the re module's compiled regular expression cache has been
- increased from 100 to 500 and the cache replacement policy has changed from
- simply clearing the entire cache on overflow to forgetting the least recently
- used cached compiled regular expressions. This is a performance win for
- applications that use a lot of regular expressions and limits the impact of
- the performance hit anytime the cache is exceeded.
+- Issue #14177: marshal.loads() now raises TypeError when given an unicode
+ string. Patch by Guilherme Gonçalves.
-- Issue #7113: Speed up loading in configparser. Patch by Åukasz Langa.
+- Issue #13550: Remove the debug machinery from the threading module: remove
+ verbose arguments from all threading classes and functions.
-- Issue #9032: XML-RPC client retries the request on EPIPE error. The EPIPE
- error occurs when the server closes the socket and the client sends a big
- XML-RPC request.
+- Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary,
+ WeakValueDictionary) to return a better approximation when some objects
+ are dead or dying. Moreover, the implementation is now O(1) rather than
+ O(n).
-- Issue #4629: getopt raises an error if an argument ends with "=", whereas
- getopt doesn't accept a value (eg. --help= is rejected if getopt uses
- ['help='] long options).
+- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode.
+ Patch by Mikhail Novikov.
-- Issue #7989: Added pure python implementation of the `datetime` module. The C
- module is renamed to `_datetime` and if available, overrides all classes
- defined in datetime with fast C impementation. Python implementation is based
- on the original python prototype for the datetime module by Tim Peters with
- minor modifications by the PyPy project. The test suite now tests `datetime`
- module with and without `_datetime` acceleration using the same test cases.
+- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version.
+ Patch by Filip Gruszczyński.
-- Issue #7895: platform.mac_ver() no longer crashes after calling os.fork().
+- Issue #13447: Add a test file to host regression tests for bugs in the
+ scripts found in the Tools directory.
-- Issue #9323: Fixed a bug in trace.py that resulted in loosing the name of the
- script being traced. Patch by Eli Bendersky.
+- Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils
+ on Windows. Also fixed in packaging.
-- Issue #9282: Fixed --listfuncs option of trace.py. Thanks Eli Bendersky for
- the patch.
+- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions
+ on 32-bit architectures. Initial patch by Philippe Devalkeneer.
-- Issue #3704: http.cookiejar was not properly handling URLs with a / in the
- parameters.
+- HTMLParser is now able to handle slashes in the start tag.
-- Issue #9268: ``pickletools.dis()`` now has an optional *annotate* argument
- which controls printing of opcode descriptions in ``dis()`` output.
+- Issue #13641: Decoding functions in the base64 module now accept ASCII-only
+ unicode strings. Patch by Catalin Iacob.
-- Issue #1555570: email no longer inserts extra blank lines when a \r\n combo
- crosses an 8192 byte boundary.
+- Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a
+ new importlib.invalidate_caches() function.
-- Issue #9243: Fix sndhdr module and add unit tests, contributed by James Lee.
+- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in
+ SimpleXMLRPCServer upon malformed POST request.
-- ``ast.literal_eval()`` now allows byte literals.
+- Issue #13961: Move importlib over to using os.replace() for atomic renaming.
-- Issue #9137: Fix issue in MutableMapping.update, which incorrectly treated
- keyword arguments called 'self' or 'other' specially.
+- Do away with ambiguous level values (as suggested by PEP 328) in
+ importlib.__import__() by raising ValueError when level < 0.
-- ``ast.literal_eval()`` now allows set literals.
+- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF.
-- Issue #9164: Ensure that sysconfig handles duplicate -arch flags in CFLAGS.
+- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().
-- Issue #7646: The fnmatch pattern cache no longer grows without bound.
+- Issue #13777: Add PF_SYSTEM sockets on OS X.
+ Patch by Michael Goderbauer.
-- Issue #9136: Fix 'dictionary changed size during iteration' RuntimeError
- produced when profiling the decimal module. This was due to a dangerous
- iteration over 'locals()' in Context.__init__.
+- Issue #13015: Fix a possible reference leak in defaultdict.__repr__.
+ Patch by Suman Saha.
-- Fix extreme speed issue in Decimal.pow when the base is an exact power of 10
- and the exponent is tiny (for example, ``Decimal(10) **
- Decimal('1e-999999999')``).
+- Issue #1326113: distutils' and packaging's build_ext commands option now
+ correctly parses multiple values (separated by whitespace or commas) given
+ to their --libraries option.
-- Issue #9186: Fix math.log1p(-1.0) to raise ValueError, not OverflowError.
+- Issue #10287: nntplib now queries the server's CAPABILITIES first before
+ sending MODE READER, and only sends it if not already in READER mode.
+ Patch by Hynek Schlawack.
-- Issue #9130: Fix validation of relative imports in parser module.
+- Issue #13993: HTMLParser is now able to handle broken end tags when
+ strict=False.
-- Issue #9128: Fix validation of class decorators in parser module.
+- Issue #13930: lib2to3 now supports writing converted output files to another
+ directory tree as well as copying unchanged files and altering the file
+ suffix.
-- Issue #9094: python -m pickletools will now disassemble pickle files listed in
- the command line arguments. See output of python -m pickletools -h for more
- details.
+- Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields
+ with a name that is a keyword or contains quotes. Patch by Marko
+ Kohtala.
-- Issue #5468: urlencode to handle bytes type and other encodings in its query
- parameter. Patch by Dan Mahn.
+- Issue #10287: nntplib now queries the server's CAPABILITIES again after
+ authenticating (since the result may change, according to RFC 4643).
+ Patch by Hynek Schlawack.
-- Issue #7673: Fix security vulnerability (CVE-2010-2089) in the audioop module,
- ensure that the input string length is a multiple of the frame size.
+- Issue #13989: Document that GzipFile does not support text mode, and give a
+ more helpful error message when opened with an invalid mode string.
-- Issue #6507: Accept source strings in dis.dis(). Original patch by Daniel
- Urban.
+- Issue #13590: On OS X 10.7 and 10.6 with Xcode 4.2, building
+ Distutils-based packages with C extension modules may fail because
+ Apple has removed gcc-4.2, the version used to build python.org
+ 64-bit/32-bit Pythons. If the user does not explicitly override
+ the default C compiler by setting the CC environment variable,
+ Distutils will now attempt to compile extension modules with clang
+ if gcc-4.2 is required but not found. Also as a convenience, if
+ the user does explicitly set CC, substitute its value as the default
+ compiler in the Distutils LDSHARED configuration variable for OS X.
+ (Note, the python.org 32-bit-only Pythons use gcc-4.0 and the 10.4u
+ SDK, neither of which are available in Xcode 4. This change does not
+ attempt to override settings to support their use with Xcode 4.)
-- Issue #7829: Clearly document that the dis module is exposing an
- implementation detail that is not stable between Python VMs or releases.
+- Issue #13960: HTMLParser is now able to handle broken comments when
+ strict=False.
-- Issue #6589: cleanup asyncore.socket_map in case smtpd.SMTPServer constructor
- raises an exception.
+- Issue #13921: Undocument and clean up sqlite3.OptimizedUnicode,
+ which is obsolete in Python 3.x. It's now aliased to str for
+ backwards compatibility.
-- Issue #9110: Addition of ContextDecorator to contextlib, for creating APIs
- that act as both context managers and decorators. contextmanager changes to
- use ContextDecorator.
+- When '' is a path (e.g. in sys.path), make sure __file__ uses the current
+ working directory instead of '' in importlib.
-- Implement importlib.abc.SourceLoader and deprecate PyLoader and PyPycLoader
- for removal in Python 3.4.
+- Issue #13609: Add two functions to query the terminal size:
+ os.get_terminal_size (low level) and shutil.get_terminal_size (high level).
+ Patch by Zbigniew Jędrzejewski-Szmek.
-- Issue #9064: pdb's "up" and "down" commands now accept an optional argument
- giving the number of frames to go.
+- Issue #13845: On Windows, time.time() now uses GetSystemTimeAsFileTime()
+ instead of ftime() to have a resolution of 100 ns instead of 1 ms (the clock
+ accuracy is between 0.5 ms and 15 ms).
-- Issue #9018: os.path.normcase() now raises a TypeError if the argument is not
- ``str`` or ``bytes``.
+- Issue #13846: Add time.monotonic(), monotonic clock.
-- Issue #9075: In the ssl module, remove the setting of a ``debug`` flag on an
- OpenSSL structure.
+- Issue #8184: multiprocessing: On Windows, don't set SO_REUSEADDR on
+ Connection sockets, and set FILE_FLAG_FIRST_PIPE_INSTANCE on named pipes, to
+ make sure two listeners can't bind to the same socket/pipe (or any existing
+ socket/pipe).
-- Issue #8682: The ssl module now temporary increments the reference count of a
- socket object got through ``PyWeakref_GetObject``, so as to avoid possible
- deallocation while the object is still being used.
+- Issue #10811: Fix recursive usage of cursors. Instead of crashing,
+ raise a ProgrammingError now.
-- Issue #1368368: FancyURLOpener class changed to throw an Exception on wrong
- password instead of presenting an interactive prompt. Older behavior can be
- obtained by passing retry=True to http_error_xxx methods of FancyURLOpener.
+- Issue #10881: Fix test_site failure with OS X framework builds.
-- Issue #8720: Fix regression caused by fix for #4050 by making getsourcefile
- smart enough to find source files in the linecache.
+- Issue #964437: Make IDLE help window non-modal.
+ Patch by Guilherme Polo and Roger Serwy.
-- Issue #5610: feedparser no longer eats extra characters at the end of a body
- part if the body part ends with a ``\r\n``.
+- Issue #13734: Add os.fwalk(), a directory walking function yielding file
+ descriptors.
-- Issue #8986: math.erfc was incorrectly raising OverflowError for values
- between -27.3 and -30.0 on some platforms.
+- Issue #2945: Make the distutils upload command aware of bdist_rpm products.
-- Issue #8784: Set tarfile default encoding to 'utf-8' on Windows.
+- Issue #13712: pysetup create should not convert package_data to extra_files.
-- Issue #8966: If a ctypes structure field is an array of c_char, convert its
- value to bytes instead of str (as done for c_char and c_char_p).
+- Issue #11805: package_data in setup.cfg should allow more than one value.
-- Issue #8188: Comparisons between Decimal and Fraction objects are now
- permitted, returning a result based on the exact numerical values of the
- operands. This builds on issue #2531, which allowed Decimal-to-float
- comparisons; all comparisons involving numeric types (bool, int, float,
- complex, Decimal, Fraction) should now act as expected.
+- Issue #13933: IDLE auto-complete did not work with some imported
+ module, like hashlib. (Patch by Roger Serwy)
-- Issue #8897: Fix sunau module, use bytes to write the header. Patch written by
- Thomas Jollans.
+- Issue #13901: Prevent test_distutils failures on OS X with --enable-shared.
-- Issue #8899: time.struct_time now has class and attribute docstrings.
+- Issue #13676: Handle strings with embedded zeros correctly in sqlite3.
-- Issue #6470: Drop UNC prefix in FixTk.
+- Issue #13506: Add '' to path for IDLE Shell when started and restarted with Restart Shell.
+ Original patches by Marco Scataglini and Roger Serwy.
-- Issue #4768: base64 encoded email body parts were incorrectly stored as binary
- strings. They are now correctly converted to strings.
+- Issue #8828: Add new function os.replace(), for cross-platform renaming
+ with overwriting.
-- Issue #8833: tarfile created hard link entries with a size field != 0 by
- mistake.
+- Issue #13848: open() and the FileIO constructor now check for NUL
+ characters in the file name. Patch by Hynek Schlawack.
-- Charset.body_encode now correctly handles base64 encoding by encoding with the
- output_charset before calling base64mime.encode. Passes the tests from 2.x
- issue #1368247.
+- Issue #13806: The size check in audioop decompression functions was too
+ strict and could reject valid compressed data. Patch by Oleg Plakhotnyuk.
-- Issue #8845: sqlite3 Connection objects now have a read-only in_transaction
- attribute that is True iff there are uncommitted changes.
+- Issue #13812: When a multiprocessing Process child raises an exception,
+ flush stderr after printing the exception traceback.
-- Issue #1289118: datetime.timedelta objects can now be multiplied by float and
- divided by float and int objects. Results are rounded to the nearest multiple
- of timedelta.resolution with ties resolved using round-half-to-even method.
+- Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC
+ IV attack countermeasure.
-- Issue #7150: Raise OverflowError if the result of adding or subtracting
- timedelta from date or datetime falls outside of the MINYEAR:MAXYEAR range.
+- Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead
+ of ValueError on failure. time.ctime() and time.asctime() now raises an
+ OSError if localtime() failed. time.clock() now raises a RuntimeError if the
+ processor time used is not available or its value cannot be represented
-- Issue #8806: add SSL contexts support to ftplib.
+- Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time
+ minor versions not matching.
-- Issue #4769: Fix main() function of the base64 module, use sys.stdin.buffer
- and sys.stdout.buffer (instead of sys.stdin and sys.stdout) to use the bytes
- API.
+- Issue #12804: Fix test_socket and test_urllib2net failures when running tests
+ on a system without internet access.
-- Issue #8770: Now sysconfig displays information when it's called as a script.
- Initial idea by Sridhar Ratnakumar.
+- Issue #13772: In os.symlink() under Windows, do not try to guess the link
+ target's type (file or directory). The detection was buggy and made the
+ call non-atomic (therefore prone to race conditions).
-- Issue #6662: Fix parsing of malformatted charref (&#bad;), patch written by
- Fredrik Håård.
+- Issue #6631: Disallow relative file paths in urllib urlopen methods.
-- Issue #8540: Decimal module: rename the Context._clamp attribute to
- Context.clamp and make it public. This is useful in creating contexts that
- correspond to the decimal interchange formats specified in IEEE 754.
+- Issue #13722: Avoid silencing ImportErrors when initializing the codecs
+ registry.
-- Issue #6268: Fix seek() method of codecs.open(), don't read or write the BOM
- twice after seek(0). Fix also reset() method of codecs, UTF-16, UTF-32 and
- StreamWriter classes.
+- Issue #13781: Fix GzipFile bug that caused an exception to be raised when
+ opening for writing using a fileobj returned by os.fdopen().
-- Issue #3798: sys.exit(message) writes the message to sys.stderr file, instead
- of the C file stderr, to use stderr encoding and error handler.
+- Issue #13803: Under Solaris, distutils doesn't include bitness
+ in the directory name.
-- Issue #8782: Add a trailing newline in linecache.updatecache to the last line
- of files without one.
+- Issue #10278: Add time.wallclock() function, monotonic clock.
-- Issue #8729: Return NotImplemented from collections.Mapping.__eq__ when
- comparing to a non-mapping.
+- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
+ disabled. Original patch by Amaury Forgeot d'Arc.
-- Issue #8774: tabnanny uses the encoding cookie (#coding:...) to use the
- correct encoding.
+- Issue #13589: Fix some serialization primitives in the aifc module.
+ Patch by Oleg Plakhotnyuk.
-- Issue #4870: Add an `options` attribute to SSL contexts, as well as several
- ``OP_*`` constants to the `ssl` module. This allows to selectively disable
- protocol versions, when used in combination with `PROTOCOL_SSLv23`.
+- Issue #13642: Unquote before b64encoding user:password during Basic
+ Authentication. Patch contributed by Joonas Kuorilehto.
-- Issue #8759: Fixed user paths in sysconfig for posix and os2 schemes.
+- Issue #13726: Fix the ambiguous -S flag in regrtest. It is -o/--slow for slow
+ tests.
-- Issue #8663: distutils.log emulates backslashreplace error handler. Fix
- compilation in a non-ASCII directory if stdout encoding is ASCII (eg. if
- stdout is not a TTY).
+- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
+ The hang would occur when retrieving the result of a scheduled future after
+ the executor had been shut down.
-- Issue #8513: os.get_exec_path() supports b'PATH' key and bytes value.
- subprocess.Popen() and os._execvpe() support bytes program name. Add
- os.supports_bytes_environ flag: True if the native OS type of the environment
- is bytes (eg. False on Windows).
+- Issue #13502: threading: Fix a race condition in Event.wait() that made it
+ return False when the event was set and cleared right after.
-- Issue #8633: tarfile is now able to read and write archives with "raw" binary
- pax headers as described in POSIX.1-2008.
+- Issue #9993: When the source and destination are on different filesystems,
+ and the source is a symlink, shutil.move() now recreates a symlink on the
+ destination instead of copying the file contents. Patch by Jonathan Niehof
+ and Hynek Schlawack.
-- Issue #1285086: Speed up urllib.parse functions: quote, quote_from_bytes,
- unquote, unquote_to_bytes.
+- Issue #12926: Fix a bug in tarfile's link extraction.
-- Issue #8688: Distutils now recalculates MANIFEST everytime.
+- Issue #13696: Fix the 302 Relative URL Redirection problem.
-- Issue #8477: ssl.RAND_egd() and ssl._test_decode_cert() support str with
- surrogates and bytes for the filename.
+- Issue #13636: Weak ciphers are now disabled by default in the ssl module
+ (except when SSLv2 is explicitly asked for).
-- Issue #8550: Add first class ``SSLContext`` objects to the ssl module.
+- Issue #12715: Add an optional symlinks argument to shutil functions
+ (copyfile, copymode, copystat, copy, copy2). When that parameter is
+ true, symlinks aren't dereferenced and the operation instead acts on the
+ symlink itself (or creates one, if relevant). Patch by Hynek Schlawack.
-- Issue #8681: Make the zlib module's error messages more informative when the
- zlib itself doesn't give any detailed explanation.
+- Add a flags parameter to select.epoll.
-- The audioop module now supports sound fragments of length greater than 2**31
- bytes on 64-bit machines, and is PY_SSIZE_T_CLEAN.
+- Issue #13626: Add support for SSL Diffie-Hellman key exchange, through the
+ SSLContext.load_dh_params() method and the ssl.OP_SINGLE_DH_USE option.
-- Issue #4972: Add support for the context manager protocol to the ftplib.FTP
- class.
+- Issue #11006: Don't issue low level warning in subprocess when pipe2() fails.
-- Issue #8664: In py_compile, create __pycache__ when the compiled path is
- given.
+- Issue #13620: Support for Chrome browser in webbrowser. Patch contributed
+ by Arnaud Calmettes.
-- Issue #8514: Add os.fsencode() function (Unix only): encode a string to bytes
- for use in the file system, environment variables or the command line.
+- Issue #11829: Fix code execution holes in inspect.getattr_static for
+ metaclasses with metaclasses. Patch by Andreas Stührk.
-- Issue #8571: Fix an internal error when compressing or decompressing a chunk
- larger than 1GB with the zlib module's compressor and decompressor objects.
+- Issue #12708: Add starmap() and starmap_async() methods (similar to
+ itertools.starmap()) to multiprocessing.Pool. Patch by Hynek Schlawack.
-- Issue #8603: Support bytes environmental variables on Unix: Add os.environb
- mapping and os.getenvb() function. os.unsetenv() encodes str argument to the
- file system encoding with the surrogateescape error handler (instead of
- utf8/strict) and accepts bytes. posix.environ keys and values are now bytes.
+- Issue #1785: Fix inspect and pydoc with misbehaving descriptors.
-- Issue #8573: asyncore _strerror() function might throw ValueError.
+- Issue #13637: "a2b" functions in the binascii module now accept ASCII-only
+ unicode strings.
-- Issue #8483: asyncore.dispatcher's __getattr__ method produced confusing error
- messages when accessing undefined class attributes because of the cheap
- inheritance with the underlying socket object. The cheap inheritance has been
- deprecated.
+- Issue #13634: Add support for querying and disabling SSL compression.
-- Issue #4265: shutil.copyfile() was leaking file descriptors when disk fills.
- Patch by Tres Seaver.
+- Issue #13627: Add support for SSL Elliptic Curve-based Diffie-Hellman
+ key exchange, through the SSLContext.set_ecdh_curve() method and the
+ ssl.OP_SINGLE_ECDH_USE option.
-- Issue #8390: tarfile uses surrogateescape as the default error handler
- (instead of replace in read mode or strict in write mode).
+- Issue #13635: Add ssl.OP_CIPHER_SERVER_PREFERENCE, so that SSL servers
+ choose the cipher based on their own preferences, rather than on the
+ client's.
-- Issue #7755: Use an unencumbered audio file for tests.
+- Issue #11813: Fix inspect.getattr_static for modules. Patch by Andreas
+ Stührk.
-- Issue #8621: uuid.uuid4() returned the same sequence of values in the parent
- and any children created using ``os.fork`` on MacOS X 10.6.
+- Issue #7502: Fix equality comparison for DocTestCase instances. Patch by
+ Cédric Krier.
-- Issue #8567: Fix precedence of signals in Decimal module: when a Decimal
- operation raises multiple signals and more than one of those signals is
- trapped, the specification determines the order in which the signals should be
- handled. In many cases this order wasn't being followed, leading to the wrong
- Python exception being raised.
+- Issue #11870: threading: Properly reinitialize threads internal locks and
+ condition variables to avoid deadlocks in child processes.
-- Issue #7865: The close() method of :mod:`io` objects should not swallow
- exceptions raised by the implicit flush(). Also qensure that calling close()
- several times is supported. Patch by Pascal Chambon.
+- Issue #8035: urllib: Fix a bug where the client could remain stuck after a
+ redirection or an error.
-- Issue #4687: Fix accuracy of garbage collection runtimes displayed with
- gc.DEBUG_STATS.
+- Issue #13560: os.strerror() now uses the current locale encoding instead of
+ UTF-8.
-- Issue #8354: The siginterrupt setting is now preserved for all signals, not
- just SIGCHLD.
+- Issue #8373: The filesystem path of AF_UNIX sockets now uses the filesystem
+ encoding and the surrogateescape error handler, rather than UTF-8. Patch
+ by David Watson.
-- Issue #7192: webbrowser.get("firefox") now works on Mac OS X, as does
- webbrowser.get("safari").
+- Issue #10350: Read and save errno before calling a function which might
+ overwrite it. Original patch by Hallvard B Furuseth.
-- Issue #8464: tarfile no longer creates files with execute permissions set when
- mode="w|" is used.
+- Issue #11610: Introduce a more general way to declare abstract properties.
-- Issue #7834: Fix connect() of Bluetooth L2CAP sockets with recent versions of
- the Linux kernel. Patch by Yaniv Aknin.
+- Issue #13591: A bug in importlib has been fixed that caused import_module
+ to load a module twice.
-- Issue #8295: Added shutil.unpack_archive.
+- Issue #4625: If IDLE cannot write to its recent file or breakpoint files,
+ display a message popup and continue rather than crash. Original patch by
+ Roger Serwy.
-- Issue #6312: Fixed http HEAD request when the transfer encoding is chunked.
- It should correctly return an empty response now.
+- Issue #13449 sched.scheduler.run() method has a new "blocking" parameter which
+ when set to False makes run() execute the scheduled events due to expire
+ soonest (if any) and then return. Patch by Giampaolo Rodolà.
-- Issue #8546: Reject None given as the buffering argument to _pyio.open.
+- Issue #8684 sched.scheduler class can be safely used in multi-threaded
+ environments. Patch by Josiah Carlson and Giampaolo Rodolà.
-- Issue #8549: Fix compiling the _ssl extension under AIX. Patch by
- Sridhar Ratnakumar.
+- Alias resource.error to OSError ala PEP 3151.
-- Issue #6656: fix locale.format_string to handle escaped percents
- and mappings.
+- Issue #5689: Add support for lzma compression to the tarfile module.
-- Issue #2302: Fix a race condition in SocketServer.BaseServer.shutdown, where
- the method could block indefinitely if called just before the event loop
- started running. This also fixes the occasional freezes witnessed in
- test_httpservers.
+- Issue #13248: Turn 3.2's PendingDeprecationWarning into 3.3's
+ DeprecationWarning. It covers 'cgi.escape', 'importlib.abc.PyLoader',
+ 'importlib.abc.PyPycLoader', 'nntplib.NNTP.xgtitle', 'nntplib.NNTP.xpath',
+ and private attributes of 'smtpd.SMTPChannel'.
-- Issue #8524: When creating an SSL socket, the timeout value of the original
- socket wasn't retained (instead, a socket with a positive timeout would be
- turned into a non-blocking SSL socket).
+- Issue #5905, #13560: time.strftime() is now using the current locale
+ encoding, instead of UTF-8, if the wcsftime() function is not available.
-- Issue #5103: SSL handshake would ignore the socket timeout and block
- indefinitely if the other end didn't respond.
+- Issue #8641: Update IDLE 3 syntax coloring to recognize b".." and not u"..".
+ Patch by Tal Einat.
-- The do_handshake() method of SSL objects now adjusts the blocking mode of the
- SSL structure if necessary (as other methods already do).
+- Issue #13464: Add a readinto() method to http.client.HTTPResponse. Patch
+ by Jon Kuhn.
-- Issue #8391: os.execvpe() and os.getenv() supports unicode with surrogates and
- bytes strings for environment keys and values.
+- tarfile.py: Correctly detect bzip2 compressed streams with blocksizes
+ other than 900k.
-- Issue #8467: Pure Python implementation of subprocess encodes the error
- message using surrogatepass error handler to support surrogates in the
- message.
+- Issue #13439: Fix many errors in turtle docstrings.
-- Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames.
+- Issue #6715: Add a module 'lzma' for compression using the LZMA algorithm.
+ Thanks to Per Øyvind Karlsen for the initial implementation.
-- Issue #8451: Syslog module now uses basename(sys.argv[0]) instead of the
- string "python" as the *ident*. openlog() arguments are all optional and
- keywords.
+- Issue #13487: Make inspect.getmodule robust against changes done to
+ sys.modules while it is iterating over it.
-- Issue #8108: Fix the unwrap() method of SSL objects when the socket has a
- non-infinite timeout. Also make that method friendlier with applications
- wanting to continue using the socket in clear-text mode, by disabling
- OpenSSL's internal readahead. Thanks to Darryl Miles for guidance.
+- Issue #12618: Fix a bug that prevented py_compile from creating byte
+ compiled files in the current directory. Initial patch by Sjoerd de Vries.
-- Issue #8496: make mailcap.lookup() always return a list, rather than an
- iterator. Patch by Gregory Nofi.
+- Issue #13444: When stdout has been closed explicitly, we should not attempt
+ to flush it at shutdown and print an error.
-- Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
- collation name contains a surrogate character.
+- Issue #12567: The curses module uses Unicode functions for Unicode arguments
+ when it is linked to the ncurses library. It encodes also Unicode strings to
+ the locale encoding instead of UTF-8.
-- Issue #8484: Load all ciphers and digest algorithms when initializing the _ssl
- extension, such that verification of some SSL certificates doesn't fail
- because of an "unknown algorithm".
+- Issue #12856: Ensure child processes do not inherit the parent's random
+ seed for filename generation in the tempfile module. Patch by Brian
+ Harring.
-- Issue #6547: Added the ignore_dangling_symlinks option to shutil.copytree.
+- Issue #9957: SpooledTemporaryFile.truncate() now accepts an optional size
+ parameter, as other file-like objects. Patch by Ryan Kelly.
-- Issue #1540112: Now allowing the choice of a copy function in shutil.copytree.
+- Issue #13458: Fix a memory leak in the ssl module when decoding a
+ certificate with a subjectAltName. Patch by Robert Xiao.
-- Issue #4814: timeout parameter is now applied also for connections resulting
- from PORT/EPRT commands.
+- Issue #13415: os.unsetenv() doesn't ignore errors anymore.
-- Issue #8463: added missing reference to bztar in shutil's documentation.
+- Issue #13245: sched.scheduler class constructor's timefunc and
+ delayfunct parameters are now optional.
+ scheduler.enter and scheduler.enterabs methods gained a new kwargs parameter.
+ Patch contributed by Chris Clark.
-- Issue #7154: urllib.request can now detect the proxy settings on OSX 10.6 (as
- long as the user didn't specify 'automatic proxy configuration').
+- Issue #12328: Under Windows, refactor handling of Ctrl-C events and
+ make _multiprocessing.win32.WaitForMultipleObjects interruptible when
+ the wait_flag parameter is false. Patch by sbt.
-- Issue #3817: ftplib.FTP.abort() method now considers 225 a valid response code
- as stated in RFC-959 at chapter 5.4.
+- Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
+ raised when the wrapped raw file is non-blocking and the write would block.
+ Previous code assumed that the raw write() would raise BlockingIOError, but
+ RawIOBase.write() is defined to returned None when the call would block.
+ Patch by sbt.
-- Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
- surrogates.
+- Issue #13358: HTMLParser now calls handle_data only once for each CDATA.
-- Issue #850728: Add a *timeout* parameter to the `acquire()` method of
- `threading.Semaphore` objects. Original patch by Torsten Landschoff.
+- Issue #4147: minidom's toprettyxml no longer adds whitespace around a text
+ node when it is the only child of an element. Initial patch by Dan
+ Kenigsberg.
-- Issue #8322: Add a *ciphers* argument to SSL sockets, so as to change the
- available cipher list. Helps fix test_ssl with OpenSSL 1.0.0.
+- Issue #13374: The Windows bytes API has been deprecated in the os module. Use
+ Unicode filenames instead of bytes filenames to not depend on the ANSI code
+ page anymore and to support any filename.
-- Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
- the current working directory.
+- Issue #13297: Use bytes type to send and receive binary data through XMLRPC.
-- Issue #7606: XML-RPC traceback stored in X-traceback is now encoded to ASCII
- using backslashreplace error handler.
+- Issue #6397: Support "/dev/poll" polling objects in select module,
+ under Solaris & derivatives.
-- Issue #8412: os.system() now accepts bytes, bytearray and str with surrogates.
+- Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly
+ handles non-valid attributes, including adjacent and unquoted attributes.
-- Issue #2987: RFC2732 support for urlparse (IPv6 addresses). Patch by Tony
- Locke and Hans Ulrich Niedermann.
+- Issue #13193: Fix distutils.filelist.FileList and packaging.manifest.Manifest
+ under Windows.
-- Issue #5277: Fix quote counting when parsing RFC 2231 encoded parameters.
+- Issue #13384: Remove unnecessary __future__ import in Lib/random.py
-- Issue #7316: The acquire() method of lock objects in the :mod:`threading`
- module now takes an optional timeout argument in seconds. Timeout support
- relies on the system threading library, so as to avoid a semi-busy wait loop.
+- Issue #13149: Speed up append-only StringIO objects.
-- Issue #8383: pickle and pickletools use surrogatepass error handler when
- encoding unicode as utf8 to support lone surrogates and stay compatible with
- Python 2.x and 3.x.
+- Issue #13373: multiprocessing.Queue.get() could sometimes block indefinitely
+ when called with a timeout. Patch by Arnaud Ysmal.
-- Issue #7585: difflib context and unified diffs now place a tab between
- filename and date, conforming to the 'standards' they were originally designed
- to follow. This improves compatibility with patch tools.
+- Issue #13254: Fix Maildir initialization so that maildir contents
+ are read correctly.
-- Issue #7472: Fixed typo in email.encoders module; messages using ISO-2022
- character sets will now consistently use a Content-Transfer-Encoding of 7bit
- rather than sometimes being marked as 8bit.
+- Issue #3067: locale.setlocale() now raises TypeError if the second
+ argument is an invalid iterable. Its documentation and docstring
+ were also updated. Initial patch by Jyrki Pulliainen.
-- Issue #8375: test_distutils now checks if the temporary directory are still
- present before it cleans them.
+- Issue #13140: Fix the daemon_threads attribute of ThreadingMixIn.
-- Issue #8374: Update the internal alias table in the :mod:`locale` module to
- cover recent locale changes and additions.
+- Issue #13339: Fix compile error in posixmodule.c due to missing semicolon.
+ Thanks to Robert Xiao.
-- Issue #8321: Give access to OpenSSL version numbers from the `ssl` module,
- using the new attributes `ssl.OPENSSL_VERSION`, `ssl.OPENSSL_VERSION_INFO` and
- `ssl.OPENSSL_VERSION_NUMBER`.
+- Byte compilation in packaging is now isolated from the calling Python -B or
+ -O options, instead of being disallowed under -B or buggy under -O.
-- Add functools.total_ordering() and functools.cmp_to_key().
+- Issue #10570: curses.putp() and curses.tparm() are now expecting a byte
+ string, instead of a Unicode string.
-- Issue #8257: The Decimal construct now accepts a float instance directly,
- converting that float to a Decimal of equal value:
+- Issue #13295: http.server now produces valid HTML 4.01 strict.
- >>> Decimal(1.1)
- Decimal('1.100000000000000088817841970012523233890533447265625')
+- Issue #2892: preserve iterparse events in case of SyntaxError.
-- Issue #8294: The Fraction constructor now accepts Decimal and float instances
- directly.
+- Issue #13287: urllib.request and urllib.error now contains an __all__
+ attribute to expose only relevant classes and functions. Patch by Florent
+ Xicluna.
-- Issue #7279: Comparisons involving a Decimal signaling NaN now signal
- InvalidOperation instead of returning False. (Comparisons involving a quiet
- NaN are unchanged.) Also, Decimal quiet NaNs are now hashable; Decimal
- signaling NaNs remain unhashable.
+- Issue #670664: Fix HTMLParser to correctly handle the content of
+ ``<script>...</script>`` and ``<style>...</style>``.
-- Issue #2531: Comparison operations between floats and Decimal instances now
- return a result based on the numeric values of the operands; previously they
- returned an arbitrary result based on the relative ordering of id(float) and
- id(Decimal). See also issue #8188, which adds Decimal-to-Fraction
- comparisons.
+- Issue #10817: Fix urlretrieve function to raise ContentTooShortError even
+ when reporthook is None. Patch by Jyrki Pulliainen.
-- Added a subtract() method to collections.Counter().
+- Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart.
+ (Patch by Roger Serwy)
-- Issue #8233: When run as a script, py_compile.py optionally takes a single
- argument `-` which tells it to read files to compile from stdin. Each line is
- read on demand and the named file is compiled immediately. (Original patch by
- Piotr Ożarowski).
+- Fix the xmlrpc.client user agent to return something similar to
+ urllib.request user agent: "Python-xmlrpc/3.3".
-- Backwards incompatible change: Unicode codepoints line tabulation (0x0B) and
- form feed (0x0C) are now considered linebreaks, as specified in Unicode
- Standard Annex #14. See issue #7643. http://www.unicode.org/reports/tr14/
+- Issue #13293: Better error message when trying to marshal bytes using
+ xmlrpc.client.
-- Comparisons using one of <, <=, >, >= between a complex instance and a
- Fractions instance now raise TypeError instead of returning True/False. This
- makes Fraction <=> complex comparisons consistent with int <=> complex, float
- <=> complex, and complex <=> complex comparisons.
+- Issue #13291: NameError in xmlrpc package.
-- Issue #8139: ossaudiodev didn't initialize its types properly, therefore some
- methods (such as oss_mixer_device.fileno()) were not available. Initial patch
- by Bertrand Janin.
+- Issue #13258: Use callable() built-in in the standard library.
-- Issue #8205: Remove the "Modules" directory from sys.path when Python is
- running from the build directory (POSIX only).
+- Issue #13273: fix a bug that prevented HTMLParser to properly detect some
+ tags when strict=False.
-- Issue #7512: shutil.copystat() could raise an OSError when the filesystem
- didn't support chflags() (for example ZFS under FreeBSD). The error is now
- silenced.
+- Issue #11183: Add finer-grained exceptions to the ssl module, so that
+ you don't have to inspect the exception's attributes in the common case.
-- Issue #7860: platform.uname now reports the correct 'machine' type when Python
- is running in WOW64 mode on 64 bit Windows.
+- Issue #13216: Add cp65001 codec, the Windows UTF-8 (CP_UTF8).
-- Issue #3890, #8222: Fix recv() and recv_into() on non-blocking SSL sockets.
- Also, enable the SSL_MODE_AUTO_RETRY flag on SSL sockets, so that blocking
- reads and writes are always retried by OpenSSL itself.
+- Issue #13226: Add RTLD_xxx constants to the os module. These constants can be
+ used with sys.setdlopenflags().
-- Issue #4282: Fix the main function of the profile module for a non-ASCII
- script, open the file in binary mode and not in text mode with the default
- (utf8) encoding.
+- Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to
+ the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a
+ monotonic clock
-- Issue #8179: Fix macpath.realpath() on a non-existing path.
+- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
+ before all tasks have completed.
-- Issue #8024: Update the Unicode database to 5.2.
+- Issue #13255: wrong docstrings in array module.
-- Issue #8168: py_compile now handles files with utf-8 BOMS.
+- Issue #8540: Remove deprecated Context._clamp attribute in Decimal module.
-- ``tokenize.detect_encoding`` now returns ``'utf-8-sig'`` when a UTF-8 BOM is
- detected.
+- Issue #13235: Added DeprecationWarning to logging.warn() method and function.
-- Issue #6716/2: Backslash-replace error output in compilall.
+- Issue #9168: now smtpd is able to bind privileged port.
-- Issue #4961: Inconsistent/wrong result of askyesno function in tkMessageBox
- with Tcl/Tk-8.5.
+- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
+ semicolons together. Patch by Ben Darnell and Petri Lehtinen.
-- Issue #8140: extend compileall to compile single files. Add -i option.
+- Issue #13227: functools.lru_cache() now has a option to distinguish
+ calls with different argument types.
-- Issue #7356: ctypes.util: Make parsing of ldconfig output independent of the
- locale.
+- Issue #6090: zipfile raises a ValueError when a document with a timestamp
+ earlier than 1980 is provided. Patch contributed by Petri Lehtinen.
-- The internals of the subprocess module on POSIX systems have been replaced by
- an extension module (_posixsubprocess) so that the fork()+exec() can be done
- safely without the possibility of deadlock in multithreaded applications.
+- Issue #13150: sysconfig no longer parses the Makefile and config.h files
+ when imported, instead doing it at build time. This makes importing
+ sysconfig faster and reduces Python startup time by 20%.
-- subprocess.Popen now has restore_signals and start_new_session features. The
- default of restore_signals=True is a new behavior compared to earlier Python
- versions. This means that signals such as SIGPIPE are not ignored by default
- in subprocesses launched by Python (Issue #1652).
+- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib``
+ in order to display the prompt correctly.
-- Issue #6472: The xml.etree package is updated to ElementTree 1.3. The
- cElementTree module is updated too.
+- Issue #12454: The mailbox module is now using ASCII, instead of the locale
+ encoding, to read and write .mh_sequences files.
-- Issue #7774: Set sys.executable to an empty string if argv[0] has been set to
- an non existent program name and Python is unable to retrieve the real program
- name.
+- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are
+ now available on Windows.
-- Issue #7880: Fix sysconfig when the python executable is a symbolic link.
+- Issue #1673007: urllib.request now supports HEAD request via new method argument.
+ Patch contributions by David Stanek, Patrick Westerhoff and Ezio Melotti.
-- Issue #6509: fix re.sub to work properly when the pattern, the string, and the
- replacement were all bytes. Patch by Antoine Pitrou.
+- Issue #12386: packaging does not fail anymore when writing the RESOURCES
+ file.
-- The sqlite3 module was updated to pysqlite 2.6.0. This fixes several obscure
- bugs and allows loading SQLite extensions from shared libraries.
+- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number
+ fields in tarfile.
-- Issue #1054943: Fix ``unicodedata.normalize('NFC', text)`` for the Public
- Review Issue #29 (http://unicode.org/review/pr-29.html).
+- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding,
+ instead of the locale encoding.
-- Issue #7494: fix a crash in _lsprof (cProfile) after clearing the profiler,
- reset also the pointer to the current pointer context.
+- Issue #10653: On Windows, use strftime() instead of wcsftime() because
+ wcsftime() doesn't format time zone correctly.
-- Issue #7232: Add support for the context manager protocol to the TarFile
- class.
+- Issue #13150: The tokenize module doesn't compile large regular expressions
+ at startup anymore.
-- Issue #7250: Fix info leak of os.environ across multi-run uses of
- wsgiref.handlers.CGIHandler.
+- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was
+ configured with different prefix and exec-prefix.
-- Issue #1729305: Fix doctest to handle encode error with "backslashreplace".
+- Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in
+ PEP 3147-compliant __pycache__ directories.
-- Issue #691291: codecs.open() should not convert end of lines on reading and
- writing.
+- Issue #7367: Fix pkgutil.walk_paths to skip directories whose
+ contents cannot be read.
-- Issue #7869: logging: improved diagnostic for format-time errors.
+- Issue #3163: The struct module gets new format characters 'n' and 'N'
+ supporting C integer types ``ssize_t`` and ``size_t``, respectively.
-- Issue #7868: logging: added loggerClass attribute to Manager.
+- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale.
+ Reported and diagnosed by Thomas Kluyver.
-- logging: Implemented PEP 391.
+- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation
+ if the underlying raw stream is unseekable, even if the seek could be
+ satisfied using the internal buffer. Patch by John O'Connor.
-- Issue #1537721: Add a writeheader() method to csv.DictWriter.
+- Issue #7689: Allow pickling of dynamically created classes when their
+ metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig
+ Citro.
-- Issue #7959: ctypes callback functions are now registered correctly with the
- cycle garbage collector.
+- Issue #13034: When decoding some SSL certificates, the subjectAltName
+ extension could be unreported.
-- Issue #5801: removed spurious empty lines in wsgiref.
+- Issue #9871: Prevent IDLE 3 crash when given byte stings
+ with invalid hex escape sequences, like b'\x0'.
+ (Original patch by Claudiu Popa.)
-- Issue #6666: fix bug in trace.py that applied the list of directories to be
- ignored only to the first file. Noted by Bogdan Opanchuk.
+- Issue #12306: Expose the runtime version of the zlib C library as a constant,
+ ZLIB_RUNTIME_VERSION, in the zlib module. Patch by Torsten Landschoff.
-- Issue #7597: curses.use_env() can now be called before initscr(). Noted by
- Kan-Ru Chen.
+- Issue #12959: Add collections.ChainMap to collections.__all__.
-- Issue #7310: fix the __repr__ of os.environ to show the environment variables.
+- Issue #8933: distutils' PKG-INFO files and packaging's METADATA files will
+ now correctly report Metadata-Version: 1.1 instead of 1.0 if a Classifier or
+ Download-URL field is present.
-- Issue #7970: email.Generator.flatten now correctly flattens message/rfc822
- messages parsed by email.Parser.HeaderParser.
+- Issue #12567: Add curses.unget_wch() function. Push a character so the next
+ get_wch() will return it.
-- Issue #7361: Importlib was not properly checking the number of bytes in
- bytecode file when it was less then 8 bytes.
+- Issue #9561: distutils and packaging now writes egg-info files using UTF-8,
+ instead of the locale encoding.
-- Issue #7633: In the decimal module, Context class methods (with the exception
- of canonical and is_canonical) now accept instances of int and long wherever a
- Decimal instance is accepted, and implicitly convert that argument to Decimal.
- Previously only some arguments were converted.
+- Issue #8286: The distutils command sdist will print a warning message instead
+ of crashing when an invalid path is given in the manifest template.
-- Issue #7835: shelve should no longer produce mysterious warnings during
- interpreter shutdown.
+- Issue #12841: tarfile unnecessarily checked the existence of numerical user
+ and group ids on extraction. If one of them did not exist the respective id
+ of the current user (i.e. root) was used for the file and ownership
+ information was lost.
-- Issue #2746: Don't escape ampersands and angle brackets ("&", "<", ">") in XML
- processing instructions and comments. These raw characters are allowed by the
- XML specification, and are necessary when outputting e.g. PHP code in a
- processing instruction. Patch by Neil Muller.
+- Issue #12888: Fix a bug in HTMLParser.unescape that prevented it to escape
+ more than 128 entities. Patch by Peter Otten.
-- Issue #6233: ElementTree failed converting unicode characters to XML entities
- when they could't be represented in the requested output encoding. Patch by
- Jerry Chen.
+- Issue #12878: Expose a __dict__ attribute on io.IOBase and its subclasses.
-- Issue #6003: add an argument to ``zipfile.Zipfile.writestr`` to specify the
- compression type.
+- Issue #12636: IDLE reads the coding cookie when executing a Python script.
-- Issue #4772: Raise a ValueError when an unknown Bluetooth protocol is
- specified, rather than fall through to AF_PACKET (in the `socket` module).
- Also, raise ValueError rather than TypeError when an unknown TIPC address type
- is specified. Patch by Brian Curtin.
+- Issue #12494: On error, call(), check_call(), check_output() and
+ getstatusoutput() functions of the subprocess module now kill the process,
+ read its status (to avoid zombis) and close pipes.
-- Issue #6939: Fix file I/O objects in the `io` module to keep the original file
- position when calling `truncate()`. It would previously change the file
- position to the given argument, which goes against the tradition of
- ftruncate() and other truncation APIs. Patch by Pascal Chambon.
+- Issue #12720: Expose low-level Linux extended file attribute functions in os.
-- Issue #7610: Reworked implementation of the internal
- :class:`zipfile.ZipExtFile` class used to represent files stored inside an
- archive. The new implementation is significantly faster and can be wrapped in
- a :class:`io.BufferedReader` object for more speedups. It also solves an
- issue where interleaved calls to `read()` and `readline()` give wrong results.
- Patch by Nir Aides.
+- Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi
+ now respect a --skip-build option given to bdist. The packaging commands
+ were fixed too.
-- Issue #6963: Added "maxtasksperchild" argument to multiprocessing.Pool,
- allowing for a maximum number of tasks within the pool to be completed by the
- worker before that worker is terminated, and a new one created to replace it.
+- Issue #12847: Fix a crash with negative PUT and LONG_BINPUT arguments in
+ the C pickle implementation.
-- Issue #7792: Registering non-classes to ABCs raised an obscure error.
+- Issue #11564: Avoid crashes when trying to pickle huge objects or containers
+ (more than 2**31 items). Instead, in most cases, an OverflowError is raised.
-- Issue #7785: Don't accept bytes in FileIO.write().
+- Issue #12287: Fix a stack corruption in ossaudiodev module when the FD is
+ greater than FD_SETSIZE.
-- Removed the functions 'verify' and 'vereq' from Lib/test/support.py.
+- Issue #12839: Fix crash in zlib module due to version mismatch.
+ Fix by Richard M. Tew.
-- Issue #7773: Fix an UnboundLocalError in platform.linux_distribution() when
- the release file is empty.
+- Issue #9923: The mailcap module now correctly uses the platform path
+ separator for the MAILCAP environment variable on non-POSIX platforms.
-- Issue #7561: Fix crashes when using bytearray objects with the posix
- module.
+- Issue #12835: Follow up to #6560 that unconditionally prevents use of the
+ unencrypted sendmsg/recvmsg APIs on SSL wrapped sockets. Patch by David
+ Watson.
-- Issue #1670765: Prevent email.generator.Generator from re-wrapping headers in
- multipart/signed MIME parts, which fixes one of the sources of invalid
- modifications to such parts by Generator.
+- Issue #12803: SSLContext.load_cert_chain() now accepts a password argument
+ to be used if the private key is encrypted. Patch by Adam Simpkins.
-- Issue #7703: Add support for the new buffer API to `binascii.a2bhqx`. Patch
- by Florent Xicluna, along with some additional tests.
+- Issue #11657: Fix sending file descriptors over 255 over a multiprocessing
+ Pipe.
-- Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a 1-byte
- argument. Patch by Victor Stinner.
+- Issue #12811: tabnanny.check() now promptly closes checked files. Patch by
+ Anthony Briggs.
-- Issue #3299: Fix possible crash in the _sre module when given bad argument
- values in debug mode. Patch by Victor Stinner.
+- Issue #6560: The sendmsg/recvmsg API is now exposed by the socket module
+ when provided by the underlying platform, supporting processing of
+ ancillary data in pure Python code. Patch by David Watson and Heiko Wundram.
-- Issue #2846: Add support for gzip.GzipFile reading zero-padded files. Patch
- by Brian Curtin.
+- Issue #12326: On Linux, sys.platform doesn't contain the major version
+ anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending
+ on the Linux version used to build Python.
-- Issue #7681: Use floor division in appropiate places in the wave module.
+- Issue #12213: Fix a buffering bug with interleaved reads and writes that
+ could appear on BufferedRandom streams.
-- Issue #5372: Drop the reuse of .o files in Distutils' ccompiler (since
- Extension extra options may change the output without changing the .c
- file). Initial patch by Collin Winter.
+- Issue #12778: Reduce memory consumption when JSON-encoding a large
+ container of many small objects.
-- Issue #7617: Make sure distutils.unixccompiler.UnixCCompiler recognizes gcc
- when it has a fully qualified configuration prefix. Initial patch by Arfrever.
+- Issue #12650: Fix a race condition where a subprocess.Popen could leak
+ resources (FD/zombie) when killed at the wrong time.
-- Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against the
- destruction of weakref'ed objects while iterating.
+- Issue #12744: Fix inefficient representation of integers between 2**31 and
+ 2**63 on systems with a 64-bit C "long".
-- Issue #7455: Fix possible crash in cPickle on invalid input. Patch by Victor
- Stinner.
+- Issue #12646: Add an 'eof' attribute to zlib.Decompress, to make it easier to
+ detect truncated input streams.
-- Issue #1628205: Socket file objects returned by socket.socket.makefile() now
- properly handles EINTR within the read, readline, write & flush methods. The
- socket.sendall() method now properly handles interrupted system calls.
+- Issue #11513: Fix exception handling ``tarfile.TarFile.gzopen()`` when
+ the file cannot be opened.
-- Issue #7471: Improve the performance of GzipFile's buffering mechanism, and
- make it implement the `io.BufferedIOBase` ABC to allow for further speedups by
- wrapping it in an `io.BufferedReader`. Patch by Nir Aides.
+- Issue #12687: Fix a possible buffering bug when unpickling text mode
+ (protocol 0, mostly) pickles.
-- Issue #3972: http.client.HTTPConnection now accepts an optional source_address
- parameter to allow specifying where your connections come from.
+- Issue #10087: Fix the html output format of the calendar module.
-- socket.create_connection now accepts an optional source_address parameter.
+- Issue #12540: Prevent zombie IDLE processes on Windows due to changes
+ in os.kill().
-- Issue #5511: now zipfile.ZipFile can be used as a context manager. Initial
- patch by Brian Curtin.
+- Issue #13121: add support for inplace math operators to collections.Counter.
-- Issue #7556: Make sure Distutils' msvc9compile reads and writes the MSVC XML
- Manifest file in text mode so string patterns can be used in regular
- expressions.
+- Add support for unary plus and unary minus to collections.Counter.
-- Issue #7552: Removed line feed in the base64 Authorization header in the
- Distutils upload command to avoid an error when PyPI reads it. This occurs on
- long passwords. Initial patch by JP St. Pierre.
+- Issue #12683: urlparse updated to include svn as schemes that uses relative
+ paths. (svn from 1.5 onwards support relative path).
-- Issue #7231: urllib2 cannot handle https with proxy requiring auth. Patch by
- Tatsuhiro Tsujikawa.
+- Issue #12655: Expose functions from sched.h in the os module: sched_yield(),
+ sched_setscheduler(), sched_getscheduler(), sched_setparam(),
+ sched_get_min_priority(), sched_get_max_priority(), sched_rr_get_interval(),
+ sched_getaffinity(), sched_setaffinity().
-- Issue #4757: `zlib.compress` and other methods in the zlib module now raise a
- TypeError when given an `str` object (rather than a `bytes`-like object).
- Patch by Victor Stinner and Florent Xicluna.
+- Add ThreadError to threading.__all__.
-- Issue #7349: Make methods of file objects in the io module accept None as an
- argument where file-like objects (ie StringIO and BytesIO) accept them to mean
- the same as passing no argument.
+- Issues #11104, #8688: Fix the behavior of distutils' sdist command with
+ manually-maintained MANIFEST files.
-- Issue #7357: tarfile no longer suppresses fatal extraction errors by default.
+- Issue #11281: smtplib.STMP gets source_address parameter, which adds the
+ ability to bind to specific source address on a machine with multiple
+ interfaces. Patch by Paulo Scardine.
-- Issue #5949: added check for correct lineends in input from IMAP server in
- imaplib.
+- Issue #12464: tempfile.TemporaryDirectory.cleanup() should not follow
+ symlinks: fix it. Patch by Petri Lehtinen.
-- Add count() and reverse() methods to collections.deque().
+- Issue #8887: "pydoc somebuiltin.somemethod" (or help('somebuiltin.somemethod')
+ in Python code) now finds the doc of the method.
-- Fix variations of extending deques: d.extend(d) d.extendleft(d) d+=d
+- Issue #10968: Remove indirection in threading. The public names (Event,
+ Condition, etc.) used to be factory functions returning instances of hidden
+ classes (_Event, _Condition, etc.), because (if Guido recalls correctly) this
+ code pre-dates the ability to subclass extension types. It is now possible
+ to inherit from these classes, without having to import the private
+ underscored names like multiprocessing did.
-- Issue #6986: Fix crash in the JSON C accelerator when called with the wrong
- parameter types. Patch by Victor Stinner.
+- Issue #9723: Add shlex.quote functions, to escape filenames and command
+ lines.
-- Issue #7457: added a read_pkg_file method to
- distutils.dist.DistributionMetadata.
+- Issue #12603: Fix pydoc.synopsis() on files with non-negative st_mtime.
-- logging: Added optional `secure` parameter to SMTPHandler, to enable use of
- TLS with authentication credentials.
+- Issue #12514: Use try/finally to assure the timeit module restores garbage
+ collections when it is done.
-- Issue #1923: Fixed the removal of meaningful spaces when PKG-INFO is generated
- in Distutils. Patch by Stephen Emslie.
+- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
+ given as a low fd, it gets overwritten.
-- Issue #4120: Drop reference to CRT from manifest when building extensions with
- msvc9compiler.
+- Issue #12590: IDLE editor window now always displays the first line
+ when opening a long file. With Tk 8.5, the first line was hidden.
-- Issue #7333: The `posix` module gains an `initgroups()` function providing
- access to the initgroups(3) C library call on Unix systems which implement it.
- Patch by Jean-Paul Calderone.
+- Issue #12576: Fix urlopen behavior on sites which do not send (or obfuscates)
+ Connection:close header.
-- Issue #7408: Fixed distutils.tests.sdist so it doesn't check for group
- ownership when the group is not forced, because the group may be different
- from the user's group and inherit from its container when the test is run.
+- Issue #12102: Document that buffered files must be flushed before being used
+ with mmap. Patch by Steffen Daode Nurpmeso.
-- Issue #4486: When an exception has an explicit cause, do not print its
- implicit context too. This affects the `traceback` module as well as built-in
- exception printing.
+- Issue #12560: Build libpython.so on OpenBSD. Patch by Stefan Sperling.
-- Issue #1515: Enable use of deepcopy() with instance methods. Patch by Robert
- Collins.
+- Issue #1813: Fix codec lookup under Turkish locales.
-- Issue #7403: logging: Fixed possible race condition in lock creation.
+- Issue #12591: Improve support of "universal newlines" in the subprocess
+ module: the piped streams can now be properly read from or written to.
-- Issue #6845: Add restart support for binary upload in ftplib. The
- `storbinary()` method of FTP and FTP_TLS objects gains an optional `rest`
- argument. Patch by Pablo Mouzo.
+- Issue #12591: Allow io.TextIOWrapper to work with raw IO objects (without
+ a read1() method), and add a *write_through* parameter to mandate
+ unbuffered writes.
-- Issue #5788: `datetime.timedelta` objects get a new `total_seconds()` method
- returning the total number of seconds in the duration. Patch by Brian
- Quinlan.
+- Issue #10883: Fix socket leaks in urllib.request when using FTP.
-- Issue #7133: SSL objects now support the new buffer API.
+- Issue #12592: Make Python build on OpenBSD 5 (and future major releases).
-- Issue #1488943: difflib.Differ() doesn't always add hints for tab characters.
+- Issue #12372: POSIX semaphores are broken on AIX: don't use them.
-- Issue #6123: tarfile now opens empty archives correctly and consistently
- raises ReadError on empty files.
+- Issue #12551: Provide a get_channel_binding() method on SSL sockets so as
+ to get channel binding data for the current SSL session (only the
+ "tls-unique" channel binding is implemented). This allows the implementation
+ of certain authentication mechanisms such as SCRAM-SHA-1-PLUS. Patch by
+ Jacek Konieczny.
-- Issue #7354: distutils.tests.test_msvc9compiler - dragfullwindows can be 2.
+- Issue #665194: email.utils now has format_datetime and parsedate_to_datetime
+ functions, allowing for round tripping of RFC2822 format dates.
-- Issue #5037: Proxy the __bytes__ special method instead to __bytes__ instead
- of __str__.
+- Issue #12571: Add a plat-linux3 directory mirroring the plat-linux2
+ directory, so that "import DLFCN" and other similar imports work on
+ Linux 3.0.
-- Issue #7341: Close the internal file object in the TarFile constructor in case
- of an error.
+- Issue #7484: smtplib no longer puts <> around addresses in VRFY and EXPN
+ commands; they aren't required and in fact postfix doesn't support that form.
-- Issue #7293: distutils.test_msvc9compiler is fixed to work on any fresh
- Windows box. Help provided by David Bolen.
+- Issue #12273: Remove ast.__version__. AST changes can be accounted for by
+ checking sys.version_info or sys._mercurial.
-- Issue #2054: ftplib now provides an FTP_TLS class to do secure FTP using TLS
- or SSL. Patch by Giampaolo Rodola'.
+- Silence spurious "broken pipe" tracebacks when shutting down a
+ ProcessPoolExecutor.
-- Issue #7328: pydoc no longer corrupts sys.path when run with the '-m' switch.
+- Fix potential resource leaks in concurrent.futures.ProcessPoolExecutor
+ by joining all queues and processes when shutdown() is called.
-- Issue #4969: The mimetypes module now reads the MIME database from the
- registry under Windows. Patch by Gabriel Genellina.
+- Issue #11603: Fix a crash when __str__ is rebound as __repr__. Patch by
+ Andreas Stührk.
-- Issue #6816: runpy now provides a run_path function that allows Python code to
- execute file paths that refer to source or compiled Python files as well as
- zipfiles, directories and other valid sys.path entries that contain a
- __main__.py file. This allows applications that run other Python scripts to
- support the same flexibility as the CPython command line itself.
+- Issue #11321: Fix a crash with multiple imports of the _pickle module when
+ embedding Python. Patch by Andreas Stührk.
-- Issue #7318: multiprocessing now uses a timeout when it fails to establish a
- connection with another process, rather than looping endlessly. The default
- timeout is 20 seconds, which should be amply sufficient for local connections.
+- Issue #6755: Add get_wch() method to curses.window class. Patch by Iñigo
+ Serna.
-- Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
- unpickled. This fixes crashes under Windows when trying to run
- test_multiprocessing in verbose mode.
+- Add cgi.closelog() function to close the log file.
-- Issue #7893: ``unittest.TextTestResult`` is made public and a ``resultclass``
- argument added to the TextTestRunner constructor allowing a different result
- class to be used without having to subclass.
+- Issue #12502: asyncore: fix polling loop with AF_UNIX sockets.
-- Issue #7588: ``unittest.TextTestResult.getDescription`` now includes the test
- name in failure reports even if the test has a docstring.
+- Issue #4376: ctypes now supports nested structures in a endian different than
+ the parent structure. Patch by Vlad Riscutia.
-- Issue #3001: Add a C implementation of recursive locks which is used by
- default when instantiating a `threading.RLock` object. This makes recursive
- locks as fast as regular non-recursive locks (previously, they were slower by
- 10x to 15x).
+- Raise ValueError when attempting to set the _CHUNK_SIZE attribute of a
+ TextIOWrapper to a huge value, not TypeError.
-- Issue #7282: Fix a memory leak when an RLock was used in a thread other than
- those started through `threading.Thread` (for example, using
- `_thread.start_new_thread()`).
+- Issue #12504: Close file handles in a timely manner in packaging.database.
+ This fixes a bug with the remove (uninstall) feature on Windows.
-- Issue #7187: Importlib would not silence the IOError raised when trying to
- write new bytecode when it was made read-only.
+- Issues #12169 and #10510: Factor out code used by various packaging commands
+ to make HTTP POST requests, and make sure it uses CRLF.
-- Issue #7264: Fix a possible deadlock when deallocating thread-local objects
- which are part of a reference cycle.
+- Issue #12016: Multibyte CJK decoders now resynchronize faster. They only
+ ignore the first byte of an invalid byte sequence. For example,
+ b'\xff\n'.decode('gb2312', 'replace') gives '\ufffd\n' instead of '\ufffd'.
-- Issue #7211: Allow 64-bit values for the `ident` and `data` fields of kevent
- objects on 64-bit systems. Patch by Michael Broghton.
+- Issue #12459: time.sleep() now raises a ValueError if the sleep length is
+ negative, instead of an infinite sleep on Windows or raising an IOError on
+ Linux for example, to have the same behaviour on all platforms.
-- Issue #6896: mailbox.Maildir now invalidates its internal cache each time a
- modification is done through it. This fixes inconsistencies and test failures
- on systems with slightly bogus mtime behaviour.
+- Issue #12451: pydoc: html_getfile() now uses tokenize.open() to support
+ Python scripts using a encoding different than UTF-8 (read the coding cookie
+ of the script).
-- Issue #7246 & Issue #7208: getpass now properly flushes input before reading
- from stdin so that existing input does not confuse it and lead to incorrect
- entry or an IOError. It also properly flushes it afterwards to avoid the
- terminal echoing the input afterwards on OSes such as Solaris.
+- Issue #12493: subprocess: Popen.communicate() now also handles EINTR errors
+ if the process has only one pipe.
-- Issue #7233: Fix a number of two-argument Decimal methods to make sure that
- they accept an int or long as the second argument. Also fix buggy handling of
- large arguments (those with coefficient longer than the current precision) in
- shift and rotate.
+- Issue #12467: warnings: fix a race condition if a warning is emitted at
+ shutdown, if globals()['__file__'] is None.
-- Issue #4750: Store the basename of the original filename in the gzip FNAME
- header as required by RFC 1952.
+- Issue #12451: pydoc: importfile() now opens the Python script in binary mode,
+ instead of text mode using the locale encoding, to avoid encoding issues.
-- Issue #1180: Added a new global option to ignore ~/.pydistutils.cfg in
- Distutils.
+- Issue #12451: runpy: run_path() now opens the Python script in binary mode,
+ instead of text mode using the locale encoding, to support other encodings
+ than UTF-8 (scripts using the coding cookie).
-- Issue #7218: Fix test_site for win32, the directory comparison was done with
- an uppercase.
+- Issue #12451: xml.dom.pulldom: parse() now opens files in binary mode instead
+ of the text mode (using the locale encoding) to avoid encoding issues.
-- Issue #7205: Fix a possible deadlock when using a BZ2File object from
- several threads at once.
+- Issue #12147: Adjust the new-in-3.2 smtplib.send_message method for better
+ conformance to the RFCs: correctly handle Sender and Resent- headers.
-- Issue #7077: logging: SysLogHandler now treats Unicode as per RFC 5424.
+- Issue #12352: Fix a deadlock in multiprocessing.Heap when a block is freed by
+ the garbage collector while the Heap lock is held.
-- Issue #7099: Decimal.is_normal now returns True for numbers with exponent
- larger than emax.
+- Issue #12462: time.sleep() now immediately calls the (Python) signal handler
+ if it is interrupted by a signal, instead of having to wait until the next
+ instruction.
-- Issue #7080: locale.strxfrm() raises a MemoryError on 64-bit non-Windows
- platforms, and assorted locale fixes by Derk Drukker.
+- Issue #12442: new shutil.disk_usage function, providing total, used and free
+ disk space statistics.
-- Issue #5833: Fix extra space character in readline completion with the GNU
- readline library version 6.0.
+- Issue #12451: The XInclude default loader of xml.etree now decodes files from
+ UTF-8 instead of the locale encoding if the encoding is not specified. It now
+ also opens XML files for the parser in binary mode instead of the text mode
+ to avoid encoding issues.
-- Issue #6894: Fixed the issue urllib2 doesn't respect "no_proxy" environment.
+- Issue #12451: doctest.debug_script() doesn't create a temporary file
+ anymore to avoid encoding issues.
-- Issue #7086: Added TCP support to SysLogHandler, and tidied up some
- anachronisms in the code which were a relic of 1.5.2 compatibility.
+- Issue #12451: pydoc.synopsis() now reads the encoding cookie if available,
+ to read the Python script from the right encoding.
-- Issue #7082: When falling back to the MIME 'name' parameter, the correct place
- to look for it is the Content-Type header.
+- Issue #12451: distutils now opens the setup script in binary mode to read the
+ encoding cookie, instead of opening it in UTF-8.
-- Make tokenize.detect_coding() normalize utf-8 and iso-8859-1 variants like the
- builtin tokenizer.
+- Issue #9516: On Mac OS X, change Distutils to no longer globally attempt to
+ check or set the MACOSX_DEPLOYMENT_TARGET environment variable for the
+ interpreter process. This could cause failures in non-Distutils subprocesses
+ and was unreliable since tests or user programs could modify the interpreter
+ environment after Distutils set it. Instead, have Distutils set the the
+ deployment target only in the environment of each build subprocess. It is
+ still possible to globally override the default by setting
+ MACOSX_DEPLOYMENT_TARGET before launching the interpreter; its value must be
+ greater or equal to the default value, the value with which the interpreter
+ was built. Also, implement the same handling in packaging.
-- Issue #7048: Force Decimal.logb to round its result when that result is too
- large to fit in the current precision.
+- Issue #12422: In the copy module, don't store objects that are their own copy
+ in the memo dict.
-- Issue #6236, #6348: Fix various failures in the I/O library under AIX and
- other platforms, when using a non-gcc compiler. Patch by Derk Drukker.
+- Issue #12303: Add sigwaitinfo() and sigtimedwait() to the signal module.
-- Issue #4606: Passing 'None' if ctypes argtype is set to POINTER(...) does now
- always result in NULL.
+- Issue #12404: Remove C89 incompatible code from mmap module. Patch by Akira
+ Kitada.
-- Issue #5042: Structure sub-subclass does now initialize correctly with base
- class positional arguments.
+- Issue #1874: email now detects and reports as a defect the presence of
+ any CTE other than 7bit, 8bit, or binary on a multipart.
-- Issue #6882: Import uuid creates zombies processes.
+- Issue #12383: Fix subprocess module with env={}: don't copy the environment
+ variables, start with an empty environment.
-- Issue #6635: Fix profiler printing usage message.
+- Issue #11637: Fix support for importing packaging setup hooks from the
+ project directory.
-- Issue #6856: Add a filter keyword argument to TarFile.add().
+- Issue #6771: Moved the curses.wrapper function from the single-function
+ wrapper module into __init__, eliminating the module. Since __init__ was
+ already importing the function to curses.wrapper, there is no API change.
-- Issue #6888: pdb's alias command was broken when no arguments were given.
+- Issue #11584: email.header.decode_header no longer fails if the header
+ passed to it is a Header object, and Header/make_header no longer fail
+ if given binary unknown-8bit input.
-- Issue #6857: Default format() alignment should be '>' for Decimal instances.
+- Issue #11700: mailbox proxy object close methods can now be called multiple
+ times without error.
-- Issue #6795: int(Decimal('nan')) now raises ValueError instead of returning
- NaN or raising InvalidContext. Also, fix infinite recursion in
- long(Decimal('nan')).
+- Issue #11767: Correct file descriptor leak in mailbox's __getitem__ method.
-- Issue #6850: Fix bug in Decimal._parse_format_specifier for formats with no
- type specifier.
+- Issue #12133: AbstractHTTPHandler.do_open() of urllib.request closes the HTTP
+ connection if its getresponse() method fails with a socket error. Patch
+ written by Ezio Melotti.
-- Issue #6239: ctypes.c_char_p return value must return bytes.
+- Issue #12240: Allow multiple setup hooks in packaging's setup.cfg files.
+ Original patch by Erik Bray.
-- Issue #6838: Use a list to accumulate the value instead of repeatedly
- concatenating strings in http.client's HTTPResponse._read_chunked providing a
- significant speed increase when downloading large files servend with a
- Transfer-Encoding of 'chunked'.
+- Issue #9284: Allow inspect.findsource() to find the source of doctest
+ functions.
-- Trying to import a submodule from a module that is not a package, ImportError
- should be raised, not AttributeError.
+- Issue #11595: Fix assorted bugs in packaging.util.cfg_to_args, a
+ compatibility helper for the distutils-packaging transition. Original patch
+ by Erik Bray.
-- When the globals past to importlib.__import__() has __package__ set to None,
- fall back to computing what __package__ should be instead of giving up.
+- Issue #12287: In ossaudiodev, check that the device isn't closed in several
+ methods.
-- Raise a TypeError when the name of a module to be imported for
- importlib.__import__ is not a string (was raising an AttributeError before).
+- Issue #12009: Fixed regression in netrc file comment handling.
-- Allow the fromlist passed into importlib.__import__ to be any iterable.
+- Issue #12246: Warn and fail when trying to install a third-party project from
+ an uninstalled Python (built in a source checkout). Original patch by
+ Tshepang Lekhonkhobe.
-- Have importlib raise ImportError if None is found in sys.modules.
+- Issue #10694: zipfile now ignores garbage at the end of a zipfile.
-- Issue #6054: Do not normalize stored pathnames in tarfile.
+- Issue #12283: Fixed regression in smtplib quoting of leading dots in DATA.
-- Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN
- payloads are now ordered by integer value rather than lexicographically.
+- Issue #10424: Argparse now includes the names of the missing required
+ arguments in the missing arguments error message.
-- Issue #1356969: Add missing info methods in tix.HList.
+- Issue #12168: SysLogHandler now allows NUL termination to be controlled using
+ a new 'append_nul' attribute on the handler.
-- Issue #1522587: New constants and methods for the tix.Grid widget.
+- Issue #11583: Speed up os.path.isdir on Windows by using GetFileAttributes
+ instead of os.stat.
-- Issue #1250469: Fix the return value of tix.PanedWindow.panes.
+- Issue #12021: Make mmap's read() method argument optional. Patch by Petri
+ Lehtinen.
-- Issue #1119673: Do not override tkinter.Text methods when creating a
- ScrolledText.
+- Issue #9205: concurrent.futures.ProcessPoolExecutor now detects killed
+ children and raises BrokenProcessPool in such a situation. Previously it
+ would reliably freeze/deadlock.
-- Issue #6665: Fix fnmatch to properly match filenames with newlines in them.
+- Issue #12040: Expose a new attribute ``sentinel`` on instances of
+ ``multiprocessing.Process``. Also, fix Process.join() to not use polling
+ anymore, when given a timeout.
-- Issue #1135: Add the XView and YView mix-ins to avoid duplicating the xview*
- and yview* methods.
+- Issue #11893: Remove obsolete internal wrapper class ``SSLFakeFile`` in the
+ smtplib module. Patch by Catalin Iacob.
-- Issue #6629: Fix a data corruption issue in the new I/O library, which could
- occur when writing to a BufferedRandom object (e.g. a file opened in "rb+" or
- "wb+" mode) after having buffered a certain amount of data for reading. This
- bug was not present in the pure Python implementation.
+- Issue #12080: Fix a Decimal.power() case that took an unreasonably long time
+ to compute.
-- Issue #6622: Fix "local variable 'secret' referenced before assignment" bug in
- POP3.apop.
+- Issue #12221: Remove __version__ attributes from pyexpat, pickle, tarfile,
+ pydoc, tkinter, and xml.parsers.expat. This were useless version constants
+ left over from the Mercurial transition
-- Issue #2715: Remove remnants of Carbon.File from binhex module.
+- Named tuples now work correctly with vars().
-- Issue #6595: The Decimal constructor now allows arbitrary Unicode decimal
- digits in input, as recommended by the standard. Previously it was restricted
- to accepting [0-9].
+- Issue #12085: Fix an attribute error in subprocess.Popen destructor if the
+ constructor has failed, e.g. because of an undeclared keyword argument. Patch
+ written by Oleg Oshmyan.
-- Issue #6106: telnetlib.Telnet.process_rawq doesn't handle default WILL/WONT
- DO/DONT correctly.
+- Issue #12028: Make threading._get_ident() public, rename it to
+ threading.get_ident() and document it. This function was already used using
+ _thread.get_ident().
-- Issue #1424152: Fix for http.client, urllib.request to support SSL while
- working through proxy. Original patch by Christopher Li, changes made by
- Senthil Kumaran.
+- Issue #12171: IncrementalEncoder.reset() of CJK codecs (multibytecodec) calls
+ encreset() instead of decreset().
-- Add importlib.abc.ExecutionLoader to represent the PEP 302 protocol for
- loaders that allow for modules to be executed. Both importlib.abc.PyLoader and
- PyPycLoader inherit from this class and provide implementations in relation to
- other methods required by the ABCs.
+- Issue #12218: Removed wsgiref.egg-info.
-- importlib.abc.PyLoader did not inherit from importlib.abc.ResourceLoader like
- the documentation said it did even though the code in PyLoader relied on the
- abstract method required by ResourceLoader.
+- Issue #12196: Add pipe2() to the os module.
-- Issue #6431: Make Fraction type return NotImplemented when it doesn't know how
- to handle a comparison without loss of precision. Also add correct handling
- of infinities and nans for comparisons with float.
+- Issue #985064: Make plistlib more resilient to faulty input plists.
+ Patch by Mher Movsisyan.
-- Issue #6415: Fixed warnings.warn segfault on bad formatted string.
+- Issue #1625: BZ2File and bz2.decompress() now support multi-stream files.
+ Initial patch by Nir Aides.
-- Issue #6358: The exit status of a command started with os.popen() was reported
- differently than it did with python 2.x.
+- Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available.
-- Issue #6323: The pdb debugger did not exit when running a script with a syntax
- error.
+- Issue #12175: FileIO.readall() now only reads the file position and size
+ once.
-- Issue #3392: The subprocess communicate() method no longer fails in select()
- when file descriptors are large; communicate() now uses poll() when possible.
+- Issue #12175: RawIOBase.readall() now returns None if read() returns None.
-- Issue #6369: Fix an RLE decompression bug in the binhex module.
+- Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError
+ if the file is closed.
-- Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.
+- Issue #11109: New service_action method for BaseServer, used by ForkingMixin
+ class for cleanup. Initial Patch by Justin Warkentin.
-- The deprecated function string.maketrans has been removed.
+- Issue #12045: Avoid duplicate execution of command in
+ ctypes.util._get_soname(). Patch by Sijin Joseph.
-- Issue #4005: Fixed a crash of pydoc when there was a zip file present in
- sys.path.
+- Issue #10818: Remove the Tk GUI and the serve() function of the pydoc module,
+ pydoc -g has been deprecated in Python 3.2 and it has a new enhanced web
+ server.
-- Issue #6218: io.StringIO and io.BytesIO instances are now picklable.
+- Issue #1441530: In imaplib, read the data in one chunk to speed up large
+ reads and simplify code.
-- The os.get_exec_path() function to return the list of directories that will be
- searched for an executable when launching a subprocess was added.
+- Issue #12070: Fix the Makefile parser of the sysconfig module to handle
+ correctly references to "bogus variable" (e.g. "prefix=$/opt/python").
-- Issue #7481: When a threading.Thread failed to start it would leave the
- instance stuck in initial state and present in threading.enumerate().
+- Issue #12100: Don't reset incremental encoders of CJK codecs at each call to
+ their encode() method anymore, but continue to call the reset() method if the
+ final argument is True.
-- Issue #1068268: The subprocess module now handles EINTR in internal os.waitpid
- and os.read system calls where appropriate.
+- Issue #12049: Add RAND_bytes() and RAND_pseudo_bytes() functions to the ssl
+ module.
-- Issue #6729: Added ctypes.c_ssize_t to represent ssize_t.
+- Issue #6501: os.device_encoding() returns None on Windows if the application
+ has no console.
-- Issue #6247: The argparse module has been added to the standard library.
+- Issue #12105: Add O_CLOEXEC to the os module.
-- Issue #8235: _socket: Add the constant ``SO_SETFIB``. SO_SETFIB is a socket
- option available on FreeBSD 7.1 and newer.
+- Issue #12079: Decimal('Infinity').fma(Decimal('0'), (3.91224318126786e+19+0j))
+ now raises TypeError (reflecting the invalid type of the 3rd argument) rather
+ than Decimal.InvalidOperation.
-- Issue #9315: Fix for the trace module to record correct class name
- for tracing methods.
+- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
+ to be able to unload the module.
-Extension Modules
------------------
+- Add the packaging module, an improved fork of distutils (also known as
+ distutils2).
-- Issue #9959: Tweak formula used for computing math.log of an integer,
- making it marginally more accurate for exact powers of 2.
+- Issue #12065: connect_ex() on an SSL socket now returns the original errno
+ when the socket's timeout expires (it used to return None).
-- Issue #9422: Fix memory leak when re-initializing a struct.Struct object.
+- Issue #8809: The SMTP_SSL constructor and SMTP.starttls() now support
+ passing a ``context`` argument pointing to an ssl.SSLContext instance.
+ Patch by Kasun Herath.
-- Issue #7900: The getgroups(2) system call on MacOSX behaves rather oddly
- compared to other unix systems. In particular, os.getgroups() does not reflect
- any changes made using os.setgroups() but basicly always returns the same
- information as the id command. os.getgroups() can now return more than 16
- groups on MacOSX.
+- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX
+ with Tk 8.5.
-- Issue #6095: Make directory argument to os.listdir optional.
+- Issue #9516: Issue #9516: avoid errors in sysconfig when MACOSX_DEPLOYMENT_TARGET
+ is set in shell.
-- Issue #9277: Fix bug in struct.pack for bools in standard mode (e.g.,
- struct.pack('>?')): if conversion to bool raised an exception then that
- exception wasn't properly propagated on machines where char is unsigned.
+- Issue #8650: Make zlib module 64-bit clean. compress(), decompress() and
+ their incremental counterparts now raise OverflowError if given an input
+ larger than 4GB, instead of silently truncating the input and returning
+ an incorrect result.
-- Issue #5180: Fixed a bug that prevented loading 2.x pickles in 3.x python when
- they contain instances of old-style classes.
+- Issue #12050: zlib.decompressobj().decompress() now clears the unconsumed_tail
+ attribute when called without a max_length argument.
-- Issue #9165: Add new functions math.isfinite and cmath.isfinite, to accompany
- existing isinf and isnan functions.
+- Issue #12062: Fix a flushing bug when doing a certain type of I/O sequence
+ on a file opened in read+write mode (namely: reading, seeking a bit forward,
+ writing, then seeking before the previous write but still within buffered
+ data, and writing again).
-- Issue #1578269: Implement os.symlink for Windows 6.0+. Patch by Jason
- R. Coombs.
+- Issue #9971: Write an optimized implementation of BufferedReader.readinto().
+ Patch by John O'Connor.
-- In struct.pack, correctly propogate exceptions from computing the truth of an
- object in the '?' format.
+- Issue #1028: Tk returns invalid Unicode null in %A: UnicodeDecodeError.
+ With Tk < 8.5 _tkinter.c:PythonCmd() raised UnicodeDecodeError, caused
+ IDLE to exit. Converted to valid Unicode null in PythonCmd().
-- Issue #9000: datetime.timezone objects now have eval-friendly repr.
+- Issue #11799: urllib.request Authentication Handlers will raise a ValueError
+ when presented with an unsupported Authentication Scheme. Patch contributed
+ by Yuval Greenfield.
-- In the math module, correctly lookup __trunc__, __ceil__, and __floor__ as
- special methods.
+- Issue #10419, #6011: build_scripts command of distutils handles correctly
+ non-ASCII path (path to the Python executable). Open and write the script in
+ binary mode, but ensure that the shebang is decodable from UTF-8 and from the
+ encoding of the script.
-- Issue #9005: Prevent utctimetuple() from producing year 0 or year 10,000.
- Prior to this change, timezone adjustment in utctimetuple() could produce
- tm_year value of 0 or 10,000. Now an OverflowError is raised in these edge
- cases.
+- Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
+ order to accept exactly one connection. Patch by Daniel Evers.
-- Issue #6641: The ``datetime.strptime`` method now supports the ``%z``
- directive. When the ``%z`` directive is present in the format string, an
- aware ``datetime`` object is returned with ``tzinfo`` bound to a
- ``datetime.timezone`` instance constructed from the parsed offset. If both
- ``%z`` and ``%Z`` are present, the data in ``%Z`` field is used for timezone
- name, but ``%Z`` data without ``%z`` is discarded.
+- Issue #12011: signal.signal() and signal.siginterrupt() raise an OSError,
+ instead of a RuntimeError: OSError has an errno attribute.
-- Issue #5094: The ``datetime`` module now has a simple concrete class
- implementing ``datetime.tzinfo`` interface. Instances of the new class,
- ``datetime.timezone``, return fixed name and UTC offset from their
- ``tzname(dt)`` and ``utcoffset(dt)`` methods. The ``dst(dt)`` method always
- returns ``None``. A class attribute, ``utc`` contains an instance
- representing the UTC timezone. Original patch by Rafe Kaplan.
+- Issue #3709: add a flush_headers method to BaseHTTPRequestHandler, which
+ manages the sending of headers to output stream and flushing the internal
+ headers buffer. Patch contribution by Andrew Schaaf
-- Issue #8973: Add __all__ to struct module; this ensures that help(struct)
- includes documentation for the struct.Struct class.
+- Issue #11743: Rewrite multiprocessing connection classes in pure Python.
-- Issue #3129: Trailing digits in struct format string are no longer ignored.
- For example, "1" or "ilib123" are now invalid formats and cause
- ``struct.error`` to be raised. Patch by Caleb Deveraux.
+- Issue #11164: Stop trying to use _xmlplus in the xml module.
-- Issue #7384: If the system readline library is linked against ncurses, the
- curses module must be linked against ncurses as well. Otherwise it is not safe
- to load both the readline and curses modules in an application.
+- Issue #11888: Add log2 function to math module. Patch written by Mark
+ Dickinson.
-- Issue #2810: Fix cases where the Windows registry API returns ERROR_MORE_DATA,
- requiring a re-try in order to get the complete result.
+- Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional.
-- Issue #8692: Optimize math.factorial: replace the previous naive algorithm
- with an improved 'binary-split' algorithm that uses fewer multiplications and
- allows many of the multiplications to be performed using plain C integer
- arithmetic instead of PyLong arithmetic. Also uses a lookup table for small
- arguments.
+- Issue #8407: The signal handler writes the signal number as a single byte
+ instead of a nul byte into the wakeup file descriptor. So it is possible to
+ wait more than one signal and know which signals were raised.
-- Issue #8674: Fixed a number of incorrect or undefined-behaviour-inducing
- overflow checks in the audioop module.
+- Issue #8407: Add pthread_kill(), sigpending() and sigwait() functions to the
+ signal module.
-- Issue #8644: The accuracy of td.total_seconds() has been improved (by
- calculating with integer arithmetic instead of float arithmetic internally):
- the result is now always correctly rounded, and is equivalent to ``td /
- timedelta(seconds=1)``.
+- Issue #11927: SMTP_SSL now uses port 465 by default as documented. Patch
+ by Kasun Herath.
-- Issue #2706: Allow division of a timedelta by another timedelta: timedelta /
- timedelta, timedelta % timedelta, timedelta // timedelta and divmod(timedelta,
- timedelta) are all supported.
+- Issue #12002: ftplib's abort() method raises TypeError.
-- Issue #8314: Fix unsigned long long bug in libffi on Sparc v8.
+- Issue #11916: Add a number of MacOSX specific definitions to the errno module.
+ Patch by Pierre Carrier.
-- Issue #8300: When passing a non-integer argument to struct.pack with any
- integer format code, struct.pack first attempts to convert the non-integer
- using its __index__ method. If that method is non-existent or raises
- TypeError it goes on to try the __int__ method, as described below.
+- Issue #11999: fixed sporadic sync failure mailbox.Maildir due to its trying to
+ detect mtime changes by comparing to the system clock instead of to the
+ previous value of the mtime.
-- Issue #8142: Update libffi to the 3.0.9 release.
+- Issue #11072: added MLSD command (RFC-3659) support to ftplib.
-- Issue #6949: Allow the _dbm extension to be built with db 4.8.x.
+- Issue #8808: The IMAP4_SSL constructor now allows passing an SSLContext
+ parameter to control parameters of the secure channel. Patch by Sijin
+ Joseph.
-- Issue #6544: Fix a reference leak in the kqueue implementation's error
- handling.
+- ntpath.samefile failed to notice that "a.txt" and "A.TXT" refer to the same
+ file on Windows XP. As noticed in issue #10684.
-- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
- msvcr100.dll is not a platform assembly anymore.
+- Issue #12000: When a SSL certificate has a subjectAltName without any
+ dNSName entry, ssl.match_hostname() should use the subject's commonName.
+ Patch by Nicolas Bareil.
-- Issue #6508: Add posix.{getresuid,getresgid,setresuid,setresgid}.
+- Issue #10775: assertRaises, assertRaisesRegex, assertWarns, and
+ assertWarnsRegex now accept a keyword argument 'msg' when used as context
+ managers. Initial patch by Winston Ewert.
-- Issue #7078: Set struct.__doc__ from _struct.__doc__.
+- Issue #10684: shutil.move used to delete a folder on case insensitive
+ filesystems when the source and destination name where the same except
+ for the case.
-- Issue #3366: Add erf, erfc, expm1, gamma, lgamma functions to math module.
+- Issue #11647: objects created using contextlib.contextmanager now support
+ more than one call to the function when used as a decorator. Initial patch
+ by Ysj Ray.
-- Issue #6877: It is now possible to link the readline extension to the libedit
- readline emulation on OSX 10.5 or later.
+- Issue #11930: Removed deprecated time.accept2dyear variable.
+ Removed year >= 1000 restriction from datetime.strftime.
-- Issue #6848: Fix curses module build failure on OS X 10.6.
+- logging: don't define QueueListener if Python has no thread support.
-- Fix a segfault that could be triggered by expat with specially formed input.
+- functools.cmp_to_key() now works with collections.Hashable().
-- Issue #6561: '\d' in a regex now matches only characters with Unicode category
- 'Nd' (Number, Decimal Digit). Previously it also matched characters with
- category 'No'.
+- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get
+ around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.
-- Issue #4509: Array objects are no longer modified after an operation failing
- due to the resize restriction in-place when the object has exported buffers.
+- Issue #8407: Add signal.pthread_sigmask() function to fetch and/or change the
+ signal mask of the calling thread.
-- Issue #2389: Array objects are now pickled in a portable manner.
+- Issue #11858: configparser.ExtendedInterpolation expected lower-case section
+ names.
-- Expat: Fix DoS via XML document with malformed UTF-8 sequences
- (CVE_2009_3560).
+- Issue #11324: ConfigParser(interpolation=None) now works correctly.
-- Issue #7242: On Solaris 9 and earlier calling os.fork() from within a thread
- could raise an incorrect RuntimeError about not holding the import lock. The
- import lock is now reinitialized after fork.
+- Issue #11811: ssl.get_server_certificate() is now IPv6-compatible. Patch
+ by Charles-François Natali.
-- Issue #7999: os.setreuid() and os.setregid() would refuse to accept a -1
- parameter on some platforms such as OS X.
+- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
+ strings are too long.
-- Build the ossaudio extension on GNU/kFreeBSD.
+- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.
-- Issue #7347: winreg: Add CreateKeyEx and DeleteKeyEx, as well as fix a bug in
- the return value of QueryReflectionKey.
+- Issue #11856: Speed up parsing of JSON numbers.
-- Issue #7567: PyCurses_setupterm: Don't call ``setupterm`` twice.
+- Issue #11005: threading.RLock()._release_save() raises a RuntimeError if the
+ lock was not acquired.
-Build
------
+- Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor
+ of 5 to 10. Initial patch by Jonas H.
-- Use OpenSSL 1.0.0a on Windows.
+- Issue #11382: Trivial system calls, such as dup() or pipe(), needn't
+ release the GIL. Patch by Charles-François Natali.
-- Issue #9280: Make sharedinstall depend on sharedmods.
+- Issue #11223: Add threading._info() function providing informations about
+ the thread implementation.
-- Issue #9189: Make a user-specified CFLAGS, CPPFLAGS, or LDFLAGS setting
- override the configure and makefile defaults, without deleting options the
- user didn't intend to override. Developers should no longer need to specify
- OPT or EXTRA_CFLAGS, although those variables are still present for
- backward-compatibility.
+- Issue #11731: simplify/enhance email parser/generator API by introducing
+ policy objects.
-- Issue #8854: Fix finding Visual Studio 2008 on Windows x64.
+- Issue #11768: The signal handler of the signal module only calls
+ Py_AddPendingCall() for the first signal to fix a deadlock on reentrant or
+ parallel calls. PyErr_SetInterrupt() writes also into the wake up file.
-- Issue #1759169, #8864: Drop _XOPEN_SOURCE on Solaris, define it for
- multiprocessing only.
+- Issue #11492: fix several issues with header folding in the email package.
-- Issue #8625: Turn off optimization in --with-pydebug builds with gcc.
- (Optimization was unintentionally turned on in gcc --with-pydebug builds as a
- result of the issue #1628484 fix, combined with autoconf's strange choice of
- default CFLAGS produced by AC_PROG_CC for gcc.)
+- Issue #11852: Add missing imports and update tests.
-- Issue #3646: It is now easily possible to install a Python framework into your
- home directory on MacOSX, see Mac/README for more information.
+- Issue #11875: collections.OrderedDict's __reduce__ was temporarily
+ mutating the object instead of just working on a copy.
-- Issue #3928: os.mknod() now available in Solaris, also.
+- Issue #11467: Fix urlparse behavior when handling urls which contains scheme
+ specific part only digits. Patch by Santoso Wijaya.
-- Issue #3326: Build Python without -fno-strict-aliasing when the gcc does not
- give false warnings.
+- collections.Counter().copy() now works correctly for subclasses.
-- Issue #1628484: The Makefile doesn't ignore the CFLAGS environment variable
- anymore. It also forwards the LDFLAGS settings to the linker when building a
- shared library.
+- Issue #11474: Fix the bug with url2pathname() handling of '/C|/' on Windows.
+ Patch by Santoso Wijaya.
-- Issue #6716: Quote -x arguments of compileall in MSI installer. Exclude 2to3
- tests from compileall.
+- Issue #11684: complete email.parser bytes API by adding BytesHeaderParser.
-- Issue #3920, #7903: Define _BSD_SOURCE on OpenBSD 4.4 through 4.9.
+- The bz2 module now handles 4GiB+ input buffers correctly.
-- Issue #7632: When Py_USING_MEMORY_DEBUGGER is defined, disable the private
- memory allocation scheme in dtoa.c and use PyMem_Malloc and PyMem_Free
- instead. Also disable caching of powers of 5.
+- Issue #9233: Fix json.loads('{}') to return a dict (instead of a list), when
+ _json is not available.
-- Issue #6491: Allow --with-dbmliborder to specify that no dbms will be built.
+- Issue #11830: Remove unnecessary introspection code in the decimal module.
-- Issue #6943: Use pkg-config to find the libffi headers when the
- --with-system-ffi flag is used.
+- Issue #11703: urllib2.geturl() does not return correct url when the original
+ url contains #fragment.
-- Issue #7609: Add a --with-system-expat option that causes the system's expat
- library to be used for the pyexpat module instead of the one included with
- Python.
+- Issue #10019: Fixed regression in json module where an indent of 0 stopped
+ adding newlines and acted instead like 'None'.
-- Issue #7589: Only build the nis module when the correct header files are
- found.
+- Issue #11186: pydoc ignores a module if its name contains a surrogate
+ character in the index of modules.
-- Switch to OpenSSL 0.9.8l and sqlite 3.6.21 on Windows.
+- Issue #11815: Use a light-weight SimpleQueue for the result queue in
+ concurrent.futures.ProcessPoolExecutor.
-- Issue #5792: Extend the short float repr support to x86 systems using
- icc or suncc.
+- Issue #5162: Treat services like frozen executables to allow child spawning
+ from multiprocessing.forking on Windows.
-- Issue #6603: Change READ_TIMESTAMP macro in ceval.c so that it compiles
- correctly under gcc on x86-64. This fixes a reported problem with the
- --with-tsc build on x86-64.
+- logging.basicConfig now supports an optional 'handlers' argument taking an
+ iterable of handlers to be added to the root logger. Additional parameter
+ checks were also added to basicConfig.
-- Issue #6802: Fix build issues on MacOSX 10.6.
+- Issue #11814: Fix likely typo in multiprocessing.Pool._terminate().
-- Issue #6244: Allow detect_tkinter to look for Tcl/Tk 8.6.
+- Issue #11747: Fix range formatting in difflib.context_diff() and
+ difflib.unified_diff().
-- Issue #4601: 'make install' did not set the appropriate permissions on
- directories.
+- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
+ worker processes: new processes would be spawned while the pool is being
+ shut down. Patch by Charles-François Natali.
-- Issue #5390: Add uninstall icon independent of whether file extensions are
- installed.
+- Issue #2650: re.escape() no longer escapes the '_'.
-- Issue #7541: When using ``python-config`` with a framework install the
- compiler might use the wrong library.
+- Issue #11757: select.select() now raises ValueError when a negative timeout
+ is passed (previously, a select.error with EINVAL would be raised). Patch
+ by Charles-François Natali.
-- python-config now supports multiple options on the same command line.
+- Issue #7311: fix html.parser to accept non-ASCII attribute values.
-- Issue #8509: Fix quoting in help strings and code snippets in configure.in.
+- Issue #11605: email.parser.BytesFeedParser was incorrectly converting
+ multipart subparts with an 8-bit CTE into unicode instead of preserving the
+ bytes.
-- Issue #8510: Update to autoconf2.65.
+- Issue #1690608: email.util.formataddr is now RFC 2047 aware: it now has a
+ charset parameter that defaults to utf-8 and is used as the charset for RFC
+ 2047 encoding when the realname contains non-ASCII characters.
-Documentation
--------------
+- Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
-- Issue #9817: Add expat COPYING file; add expat, libffi and expat licenses
- to Doc/license.rst.
+- Issue #10791: Implement missing method GzipFile.read1(), allowing GzipFile
+ to be wrapped in a TextIOWrapper. Patch by Nadeem Vawda.
-- Issue #9524: Document that two CTRL* signals are meant for use only
- with os.kill.
+- Issue #11707: Added a fast C version of functools.cmp_to_key().
+ Patch by Filip Gruszczyński.
-- Issue #9255: Document that the 'test' package is meant for internal Python use
- only.
+- Issue #11688: Add sqlite3.Connection.set_trace_callback(). Patch by
+ Torsten Landschoff.
-- A small WSGI server was added as Tools/scripts/serve.py, and is used to
- implement a local documentation server via 'make serve' in the doc directory.
+- Issue #11746: Fix SSLContext.load_cert_chain() to accept elliptic curve
+ private keys.
-- Updating `Using Python` documentation to include description of CPython's -J
- and -X options.
+- Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
+ file-like objects using a new ``fileobj`` constructor argument. Patch by
+ Nadeem Vawda.
-- Document that importing a module that has None in sys.modules triggers an
- ImportError.
+- unittest.TestCase.assertSameElements has been removed.
-- Issue #6556: Fixed the Distutils configuration files location explanation for
- Windows.
+- sys.getfilesystemencoding() raises a RuntimeError if initfsencoding() was not
+ called yet: detect bootstrap (startup) issues earlier.
-- Update python manual page (options -B, -O0, -s, environment variables
- PYTHONDONTWRITEBYTECODE, PYTHONNOUSERSITE).
+- Issue #11393: Add the new faulthandler module.
-- Issue #8909: Added the size of the bitmap used in the installer created by
- distutils' bdist_wininst. Patch by Anatoly Techtonik.
+- Issue #11618: Fix the timeout logic in threading.Lock.acquire() under Windows.
-Tests
------
+- Removed the 'strict' argument to email.parser.Parser, which has been
+ deprecated since Python 2.4.
-- Issue #9251: test_threaded_import didn't fail when run through regrtest if the
- import lock was disabled.
+- Issue #11256: Fix inspect.getcallargs on functions that take only keyword
+ arguments.
-- Issue #8605: Skip test_gdb if Python is compiled with optimizations.
+- Issue #11696: Fix ID generation in msilib.
-- Issue #7449: Skip test_socketserver if threading support is disabled.
+- itertools.accumulate now supports an optional *func* argument for
+ a user-supplied binary function.
-- Issue #8672: Add a zlib test ensuring that an incomplete stream can be handled
- by a decompressor object without errors (it returns incomplete uncompressed
- data).
+- Issue #11692: Remove unnecessary demo functions in subprocess module.
-- Issue #8533: regrtest uses backslashreplace error handler for stdout to avoid
- UnicodeEncodeError (write non-ASCII character to stdout using ASCII encoding).
+- Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when
+ trying to pack a negative (in-range) integer.
-- Issue #8576: Remove use of find_unused_port() in test_smtplib and
- test_multiprocessing. Patch by Paul Moore.
+- Issue #11675: multiprocessing.[Raw]Array objects created from an integer size
+ are now zeroed on creation. This matches the behaviour specified by the
+ documentation.
-- Issue #7449: Fix many tests to support Python compiled without thread
- support. Patches written by Jerry Seutter.
+- Issue #7639: Fix short file name generation in bdist_msi
-- Issue #8108: test_ftplib's non-blocking SSL server now has proper handling of
- SSL shutdowns.
+- Issue #11659: Fix ResourceWarning in test_subprocess introduced by #11459.
+ Patch by Ben Hayden.
-- Issues #8279, #8330, #8437, #8480, #8495: Fix test_gdb failures, patch written
- by Dave Malcolm.
+- Issue #11635: Don't use polling in worker threads and processes launched by
+ concurrent.futures.
-- Issue #3864: Skip three test_signal tests on freebsd6 because they fail if any
- thread was previously started, most likely due to a platform bug.
+- Issue #6811: Allow importlib to change a code object's co_filename attribute
+ to match the path to where the source code currently is, not where the code
+ object originally came from.
-- Issue #8193: Fix test_zlib failure with zlib 1.2.4.
+- Issue #8754: Have importlib use the repr of a module name in error messages.
-- Issue #8248: Add some tests for the bool type. Patch by Gregory Nofi.
+- Issue #11591: Prevent "import site" from modifying sys.path when python
+ was started with -S.
-- Issue #8263: Now regrtest.py will report a failure if it receives a
- KeyboardInterrupt (SIGINT).
+- collections.namedtuple() now adds a _source attribute to the generated
+ class. This make the source more accessible than the outdated
+ "verbose" option which prints to stdout but doesn't make the source
+ string available.
-- Issue #8180 and #8207: Fix test_pep277 on OS X and add more tests for special
- Unicode normalization cases.
+- Issue #11371: Mark getopt error messages as localizable. Patch by Filip
+ Gruszczyński.
-- Issue #7783: test.support.open_urlresource invalidates the outdated files from
- the local cache.
+- Issue #11333: Add __slots__ to collections ABCs.
-- Issue #7849: Now the utility ``check_warnings`` verifies if the warnings are
- effectively raised.
+- Issue #11628: cmp_to_key generated class should use __slots__.
-- The four path modules (genericpath, macpath, ntpath, posixpath) share a common
- TestCase for some tests: test_genericpath.CommonTest.
+- Issue #11666: let help() display named tuple attributes and methods
+ that start with a leading underscore.
-- Print platform information when running the whole test suite, or using the
- --verbose flag.
+- Issue #11662: Make urllib and urllib2 ignore redirections if the
+ scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).
-- Issue #767675: enable test_pep277 on POSIX platforms with Unicode-friendly
- filesystem encoding.
+- Issue #5537: Fix time2isoz() and time2netscape() functions of
+ httplib.cookiejar for expiration year greater than 2038 on 32-bit systems.
-- Issue #6292: for the moment at least, the test suite runs cleanly if python is
- run with the -OO flag. Tests requiring docstrings are skipped.
+- Issue #4391: Use proper gettext plural forms in optparse.
-- Issue #7712: test.support gained a new `temp_cwd` context manager which is now
- also used by regrtest to run all the tests in a temporary directory. The
- original CWD is saved in `support.SAVEDCWD`. Thanks to Florent Xicluna who
- helped with the patch.
+- Issue #11127: Raise a TypeError when trying to pickle a socket object.
-- Issue #7924: Fix an intermittent 'XXX undetected error' failure in test_capi
- (only seen so far on platforms where the curses module wasn't built), due to
- an uncleared exception.
+- Issue #11563: Connection:close header is sent by requests using URLOpener
+ class which helps in closing of sockets after connection is over. Patch
+ contributions by Jeff McNeil and Nadeem Vawda.
-- Issue #7728: test_timeout was changed to use support.bind_port instead of a
- hard coded port.
+- Issue #11459: A ``bufsize`` value of 0 in subprocess.Popen() really creates
+ unbuffered pipes, such that select() works properly on them.
-- Issue #7376: Instead of running a self-test (which was failing) when called
- with no arguments, doctest.py now gives a usage message.
+- Issue #5421: Fix misleading error message when one of socket.sendto()'s
+ arguments has the wrong type. Patch by Nikita Vetoshkin.
-- Issue #7396: fix regrtest -s, which was broken by the -j enhancement.
+- Issue #10812: Add some extra posix functions to the os module.
-- Issue #7498: test_multiprocessing now uses test.support.find_unused_port
- instead of a hardcoded port number in test_rapid_restart.
+- Issue #10979: unittest stdout buffering now works with class and module
+ setup and teardown.
-- Issue #7431: Use TESTFN in test_linecache instead of trying to create a file
- in the Lib/test directory, which might be read-only for the user running the
- tests.
+- Issue #11577: fix ResourceWarning triggered by improved binhex test coverage
-- Issue #7324: Add a sanity check to regrtest argument parsing to catch the case
- of an option with no handler.
+- Issue #11243: fix the parameter querying methods of Message to work if
+ the headers contain un-encoded non-ASCII data.
-- Issue #7312: Add a -F flag to run the selected tests in a loop until a test
- fails. Can be combined with -j.
+- Issue #11401: fix handling of headers with no value; this fixes a regression
+ relative to Python2 and the result is now the same as it was in Python2.
-- Issue #6551: test_zipimport could import and then destroy some modules of the
- encodings package, which would make other tests fail further down the road
- because the internally cached encoders and decoders would point to empty
- global variables.
+- Issue #9298: base64 bodies weren't being folded to line lengths less than 78,
+ which was a regression relative to Python2. Unlike Python2, the last line
+ of the folded body now ends with a carriage return.
-- Issue #7295: Do not use a hardcoded file name in test_tarfile.
+- Issue #11560: shutil.unpack_archive now correctly handles the format
+ parameter. Patch by Evan Dandrea.
-- Issue #7270: Add some dedicated unit tests for multi-thread synchronization
- primitives such as Lock, RLock, Condition, Event and Semaphore.
+- Issue #5870: Add `subprocess.DEVNULL` constant.
-- Issue #7248 (part 2): Use a unique temporary directory for importlib source
- tests instead of tempfile.tempdir. This prevents the tests from sharing state
- between concurrent executions on the same system.
+- Issue #11133: fix two cases where inspect.getattr_static can trigger code
+ execution. Patch by Andreas Stührk.
-- Issue #7248: In importlib.test.source.util a try/finally block did not make
- sure that some referenced objects actually were created in the block before
- calling methods on the object.
+- Issue #11569: use absolute path to the sysctl command in multiprocessing to
+ ensure that it will be found regardless of the shell PATH. This ensures
+ that multiprocessing.cpu_count works on default installs of MacOSX.
-- Issue #7222: Make thread "reaping" more reliable so that reference
- leak-chasing test runs give sensible results. The previous method of reaping
- threads could return successfully while some Thread objects were still
- referenced. This also introduces a new private function:
- :func:`_thread._count()`.
+- Issue #11501: disutils.archive_utils.make_zipfile no longer fails if zlib is
+ not installed. Instead, the zipfile.ZIP_STORED compression is used to create
+ the ZipFile. Patch by Natalia B. Bidart.
-- Issue #7151: Fixed regrtest -j so that output to stderr from a test no longer
- runs the risk of causing the worker thread to fail.
+- Issue #11289: `smtp.SMTP` class is now a context manager so it can be used
+ in a `with` statement. Contributed by Giampaolo Rodola.
-- Issue #7055: test___all__ now greedily detects all modules which have an
- __all__ attribute, rather than using a hardcoded and incomplete list.
+- Issue #11554: Fixed support for Japanese codecs; previously the body output
+ encoding was not done if euc-jp or shift-jis was specified as the charset.
-- Issue #7058: Added save/restore for things like sys.argv and cwd to
- runtest_inner in regrtest, with warnings if the called test modifies them, and
- a new section in the summary report at the end.
+- Issue #11509: Significantly increase test coverage of fileinput.
+ Patch by Denver Coneybeare at PyCon 2011 Sprints.
-- Issue #7042: Fix test_signal (test_itimer_virtual) failure on OS X 10.6.
+- Issue #11407: `TestCase.run` returns the result object used or created.
+ Contributed by Janathan Hartley.
-- Fixed tests in importlib.test.source.test_abc_loader that were masking the
- proper exceptions that should be raised for missing or improper code object
- bytecode.
+- Issue #11500: Fixed a bug in the OS X proxy bypass code for fully qualified
+ IP addresses in the proxy exception list.
-- Removed importlib's custom test discovery code and switched to
- unittest.TestLoader.discover().
+- Issue #11491: dbm.error is no longer raised when dbm.open is called with
+ the "n" as the flag argument and the file exists. The behavior matches
+ the documentation and general logic.
-Tools/Demos
------------
+- Issue #1162477: Postel Principle adjustment to email date parsing: handle the
+ fact that some non-compliant MUAs use '.' instead of ':' in time specs.
-- Issue #5464, #8974: Implement plural forms in msgfmt.py.
+- Issue #11131: Fix sign of zero in decimal.Decimal plus and minus
+ operations when the rounding mode is ROUND_FLOOR.
-- iobench (a file I/O benchmark) and ccbench (a concurrency benchmark) were
- added to the `Tools/` directory. They were previously living in the sandbox.
+- Issue #9935: Speed up pickling of instances of user-defined classes.
+- Issue #5622: Fix curses.wrapper to raise correct exception if curses
+ initialization fails.
-What's New in Python 3.1?
-=========================
+- Issue #11408: In threading.Lock.acquire(), only call gettimeofday() when
+ really necessary. Patch by Charles-François Natali.
-*Release date: 27-June-2009*
+- Issue #11391: Writing to a mmap object created with
+ ``mmap.PROT_READ|mmap.PROT_EXEC`` would segfault instead of raising a
+ TypeError. Patch by Charles-François Natali.
-Core and Builtins
------------------
+- Issue #9795: add context manager protocol support for nntplib.NNTP class.
-- Issue #6334: Fix bug in range length calculation for ranges with
- large arguments.
+- Issue #11306: mailbox in certain cases adapts to an inability to open
+ certain files in read-write mode. Previously it detected this by
+ checking for EACCES, now it also checks for EROFS.
-- Issue #6329: Fixed iteration for memoryview objects (it was being blocked
- because it wasn't recognized as a sequence).
+- Issue #11265: asyncore now correctly handles EPIPE, EBADF and EAGAIN errors
+ on accept(), send() and recv().
-Library
--------
+- Issue #11377: Deprecate platform.popen() and reimplement it with os.popen().
-- Issue #6126: Fixed pdb command-line usage.
+- Issue #8513: On UNIX, subprocess supports bytes command string.
-- Issue #6314: logging: performs extra checks on the "level" argument.
+- Issue #10866: Add socket.sethostname(). Initial patch by Ross Lagerwall.
-- Issue #6274: Fixed possible file descriptors leak in subprocess.py
+- Issue #11140: Lock.release() now raises a RuntimeError when attempting
+ to release an unacquired lock, as claimed in the threading documentation.
+ The _thread.error exception is now an alias of RuntimeError. Patch by
+ Filip Gruszczyński. Patch for _dummy_thread by Aymeric Augustin.
-- Accessing io.StringIO.buffer now raises an AttributeError instead of
- io.UnsupportedOperation.
+- Issue #8594: ftplib now provides a source_address parameter to specify which
+ (address, port) to bind to before connecting.
-- Issue #6271: mmap tried to close invalid file handle (-1) when anonymous.
- (On Unix)
+- Issue #11326: Add the missing connect_ex() implementation for SSL sockets,
+ and make it work for non-blocking connects.
-- Issue #1202: zipfile module would cause a struct.error when attempting to
- store files with a CRC32 > 2**31-1.
+- Issue #11297: Add collections.ChainMap().
-Extension Modules
------------------
+- Issue #10755: Add the posix.flistdir() function. Patch by Ross Lagerwall.
-- Issue #5590: Remove unused global variable in pyexpat extension.
+- Issue #4761: Add the ``*at()`` family of functions (openat(), etc.) to the
+ posix module. Patch by Ross Lagerwall.
+- Issue #7322: Trying to read from a socket's file-like object after a timeout
+ occurred now raises an error instead of silently losing data.
-What's New in Python 3.1 Release Candidate 2?
-=============================================
+- Issue #11291: poplib.POP no longer suppresses errors on quit().
-*Release date: 13-June-2009*
+- Issue #11177: asyncore's create_socket() arguments can now be omitted.
-Core and Builtins
------------------
+- Issue #6064: Add a ``daemon`` keyword argument to the threading.Thread
+ and multiprocessing.Process constructors in order to override the
+ default behaviour of inheriting the daemonic property from the current
+ thread/process.
-- Fixed SystemError triggered by "range([], 1, -1)".
+- Issue #10956: Buffered I/O classes retry reading or writing after a signal
+ has arrived and the handler returned successfully.
-- Issue #5924: On Windows, a large PYTHONPATH environment variable
- (more than 255 characters) would be completely ignored.
+- Issue #10784: New os.getpriority() and os.setpriority() functions.
-- Issue #4547: When debugging a very large function, it was not always
- possible to update the lineno attribute of the current frame.
+- Issue #11114: Fix catastrophic performance of tell() on text files (up
+ to 1000x faster in some cases). It is still one to two order of magnitudes
+ slower than binary tell().
-- Issue #5330: C functions called with keyword arguments were not reported by
- the various profiling modules (profile, cProfile). Patch by Hagen Fürstenau.
+- Issue #10882: Add os.sendfile function.
-Library
--------
+- Issue #10868: Allow usage of the register method of an ABC as a class
+ decorator.
-- Issue #6438: Fixed distutils.cygwinccompiler.get_versions : the regular
- expression string pattern was trying to match against a bytes returned by
- Popen. Tested under win32 to build the py-postgresql project.
+- Issue #11224: Fixed a regression in tarfile that affected the file-like
+ objects returned by TarFile.extractfile() regarding performance, memory
+ consumption and failures with the stream interface.
-- Issue #6258: Support AMD64 in bdist_msi.
+- Issue #10924: Adding salt and Modular Crypt Format to crypt library.
+ Moved old C wrapper to _crypt, and added a Python wrapper with
+ enhanced salt generation and simpler API for password generation.
-- Issue #6195: fixed doctest to no longer try to read 'source' data from
- binary files.
+- Issue #11074: Make 'tokenize' so it can be reloaded.
-- Issue #5262: Fixed bug in next rollover time computation in
- TimedRotatingFileHandler.
+- Issue #11085: Moved collections abstract base classes into a separate
+ module called collections.abc, following the pattern used by importlib.abc.
+ For backwards compatibility, the names are imported into the collections
+ module.
-- Issue #6217: The C implementation of io.TextIOWrapper didn't include the
- errors property. Additionally, the errors and encoding properties of StringIO
- are always None now.
+- Issue #4681: Allow mmap() to work on file sizes and offsets larger than
+ 4GB, even on 32-bit builds. Initial patch by Ross Lagerwall, adapted for
+ 32-bit Windows.
-- Issue #6137: The pickle module now translates module names when loading
- or dumping pickles with a 2.x-compatible protocol, in order to make data
- sharing and migration easier. This behaviour can be disabled using the
- new `fix_imports` optional argument.
+- Issue #11169: compileall module uses repr() to format filenames and paths to
+ escape surrogate characters and show spaces.
-- Removed the ipaddr module.
+- Issue #11089: Fix performance issue limiting the use of ConfigParser()
+ with large config files.
-- Issue #3613: base64.{encode,decode}string are now called
- base64.{encode,decode}bytes which reflects what type they accept and return.
- The old names are still there as deprecated aliases.
+- Issue #10276: Fix the results of zlib.crc32() and zlib.adler32() on buffers
+ larger than 4GB. Patch by Nadeem Vawda.
-- Issue #5767: Remove sgmlop support from xmlrpc.client.
+- Issue #11388: Added a clear() method to MutableSequence
-- Issue #6150: Fix test_unicode on wide-unicode builds.
+- Issue #11174: Add argparse.MetavarTypeHelpFormatter, which uses type names
+ for the names of optional and positional arguments in help messages.
-- Issue #6149: Fix initialization of WeakValueDictionary objects from non-empty
- parameters.
+- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
-Windows
--------
+- Issue #8982: Improve the documentation for the argparse Namespace object.
-- Issue #6221: Delete test registry key before running the test.
+- Issue #9343: Document that argparse parent parsers must be configured before
+ their children.
-- Issue #6158: Package Sine-1000Hz-300ms.aif in MSI file.
+- Issue #9026: Fix order of argparse sub-commands in help messages.
-C-API
------
+- Issue #9347: Fix formatting for tuples in argparse type= error messages.
-- Issue #5735: Python compiled with --with-pydebug should throw an
- ImportError when trying to import modules compiled without
- --with-pydebug, and vice-versa.
+- Issue #12191: Added shutil.chown() to change user and/or group owner of a
+ given path also specifying their names.
+- Issue #13988: The _elementtree accelerator is used whenever available.
+ Now xml.etree.cElementTree becomes a deprecated alias to ElementTree.
Build
-----
-- Issue #6154: Make sure the intl library is added to LIBS if needed. Also
- added LIBS to OS X framework builds.
-
-- Issue #5809: Specifying both --enable-framework and --enable-shared is
- an error. Configure now explicity tells you about this.
-
-
-
-What's New in Python 3.1 release candidate 1?
-=============================================
-
-*Release date: 2009-05-30*
-
-Core and Builtins
------------------
-
-- Issue #6097: Escape UTF-8 surrogates resulting from mbstocs conversion
- of the command line.
-
-- Issue #6012: Add cleanup support to O& argument parsing.
-
-- Issue #6089: Fixed str.format with certain invalid field specifiers
- that would raise SystemError.
-
-- Issue #5982: staticmethod and classmethod now expose the wrapped
- function with __func__.
-
-- Added support for multiple context managers in the same with-statement.
- Deprecated contextlib.nested() which is no longer needed.
-
-- Issue #5829: complex("1e500") no longer raises OverflowError. This
- makes it consistent with float("1e500") and interpretation of real
- and imaginary literals.
-
-- Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.
-
-- Issue #5994: the marshal module now has docstrings.
-
-- Issue #5981: Fix three minor inf/nan issues in float.fromhex:
- (1) inf and nan strings with trailing whitespace were incorrectly
- rejected; (2) parsing of strings representing infinities and nans
- was locale aware; and (3) the interpretation of fromhex('-nan')
- didn't match that of float('-nan').
+- Issue #6807: Run msisupport.mak earlier.
-Library
--------
+- Issue #10580: Minor grammar change in Windows installer.
-- Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
+- Issue #13326: Clean __pycache__ directories correctly on OpenBSD.
-- smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259).
+- PEP 393: the configure option --with-wide-unicode is removed.
-- Issue #6121: pydoc now ignores leading and trailing spaces in the
- argument to the 'help' function.
+- Issue #12852: Set _XOPEN_SOURCE to 700, instead of 600, to get POSIX 2008
+ functions on OpenBSD (e.g. fdopendir).
-- Issue #6118: urllib.parse.quote_plus ignored the encoding and errors
- arguments for strings with a space in them.
+- Issue #11863: Remove support for legacy systems deprecated in Python 3.2
+ (following PEP 11). These systems are systems using Mach C Threads,
+ SunOS lightweight processes, GNU pth threads and IRIX threads.
-- collections.namedtuple() was not working with the following field
- names: cls, self, tuple, itemgetter, and property.
+- Issue #8746: Correct faulty configure checks so that os.chflags() and
+ os.lchflags() are once again built on systems that support these
+ functions (BSD and OS X). Also add new stat file flags for OS X
+ (UF_HIDDEN and UF_COMPRESSED).
-- In unittest, using a skipping decorator on a class is now equivalent to
- skipping every test on the class. The ClassTestSuite class has been removed.
+- Issue #10645: Installing Python no longer creates a
+ Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory.
-- Issue #6050: Don't fail extracting a directory from a zipfile if
- the directory already exists.
+- Do not accidentally include the directory containing sqlite.h twice when
+ building sqlite3.
-- Issue #1309352: fcntl now converts its third arguments to a C `long` rather
- than an int, which makes some operations possible under 64-bit Linux (e.g.
- DN_MULTISHOT with F_NOTIFY).
+- Issue #11217: For 64-bit/32-bit Mac OS X universal framework builds,
+ ensure "make install" creates symlinks in --prefix bin for the "-32"
+ files in the framework bin directory like the installer does.
-- Issue #5761: Add the name of the underlying file to the repr() of various
- IO objects.
+- Issue #11347: Use --no-as-needed when linking libpython3.so.
-- Issue #5259: smtplib plain auth login no longer gives a traceback. Fix
- by Musashi Tamura, tests by Marcin Bachry.
+- Issue #11411: Fix 'make DESTDIR=' with a relative destination.
-- Issue #1983: Fix functions taking or returning a process identifier to use
- the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
- a process identifier type wider than the standard C integer type.
+- Issue #11268: Prevent Mac OS X Installer failure if Documentation
+ package had previously been installed.
-- Issue #4066: smtplib.SMTP_SSL._get_socket now correctly returns the socket.
- Patch by Farhan Ahmad, test by Marcin Bachry.
+- Issue #11495: OSF support is eliminated. It was deprecated in Python 3.2.
-- Issue #2116: Weak references and weak dictionaries now support copy()ing and
- deepcopy()ing.
-- Issue #1655: Make imaplib IPv6-capable. Patch by Derek Morr.
+IDLE
+----
-- Issue #5918: Fix a crash in the parser module.
+- Issue #11718: IDLE's open module dialog couldn't find the __init__.py
+ file in a package.
-- Issue #1664: Make nntplib IPv6-capable. Patch by Derek Morr.
+Tools/Demos
+-----------
-- Issue #5006: Better handling of unicode byte-order marks (BOM) in the io
- library. This means, for example, that opening an UTF-16 text file in
- append mode doesn't add a BOM at the end of the file if the file isn't
- empty.
+- Issue #14053: patchcheck.py ("make patchcheck") now works with MQ patches.
+ Patch by Francisco Martín Brugué.
-- Issue #4050: inspect.findsource/getsource now raise an IOError if the 'source'
- file is a binary. Patch by Brodie Rao, tests by Daniel Diniz. This fix
- corrects a pydoc regression.
+- Issue #13930: 2to3 is now able to write its converted output files to another
+ directory tree as well as copying unchanged files and altering the file
+ suffix. See its new -o, -W and --add-suffix options. This makes it more
+ useful in many automated code translation workflows.
-- Issue #5955: aifc's close method did not close the file it wrapped,
- now it does. This also means getfp method now returns the real fp.
+- Issue #13628: python-gdb.py is now able to retrieve more frames in the Python
+ traceback if Python is optimized.
-Installation
-------------
+- Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and
+ add a smarter "py-bt" command printing a classic Python traceback.
-- Issue #6047: fullinstall has been removed because Python 3's executable will
- now be known as python3.
+- Issue #11179: Make ccbench work under Python 3.1 and 2.7 again.
-- Lib/smtpd.py is no longer installed as a script.
+- Issue #10639: reindent.py no longer converts newlines and will raise
+ an error if attempting to convert a file with mixed newlines.
+ "--newline" option added to specify new line character.
Extension Modules
-----------------
-- Issue #3061: Use wcsftime for time.strftime where available.
-
-- Issue #4873: Fix resource leaks in error cases of pwd and grp.
-
-- Issue #6093: Fix off-by-one error in locale.strxfrm.
-
-- The _functools and _locale modules are now built into the libpython shared
- library instead of as extension modules.
-
-Build
------
-
-- Issue #3585: Add pkg-config support. It creates a python-2.7.pc file
- and a python3.pc symlink in the $(LIBDIR)/pkgconfig directory. Patch by
- Clinton Roy.
-
-Tests
------
-
-- Issue #5442: Tests for importlib were not properly skipping case-sensitivity
- tests on darwin even when the OS was installed on a case-sensitive
- filesystem. Also fixed tests that should not be run when
- sys.dont_write_bytecode is true.
-
-
-What's New in Python 3.1 beta 1?
-================================
-
-*Release date: 2009-05-06*
-
-Core and Builtins
------------------
-
-- Issue #5914: Add new C API function PyOS_string_to_double, and
- deprecate PyOS_ascii_strtod and PyOS_ascii_atof.
-
-- Issue #3382: float.__format__, complex.__format__, and %-formatting
- no longer map 'F' to 'f'. Because of issue #5859 (below), this only
- affects nan -> NAN and inf -> INF.
-
-- Issue #5799: ntpath (ie, os.path on Windows) fully supports UNC pathnames
- in all operations, including splitdrive, split, etc. splitunc() now issues
- a PendingDeprecation warning.
-
-- Issue #5920: For float.__format__, change the behavior with the
- empty presentation type (that is, not one of 'e', 'f', 'g', or 'n')
- to be like 'g' but with at least one decimal point and with a
- default precision of 12. Previously, the behavior the same but with
- a default precision of 6. This more closely matches str(), and
- reduces surprises when adding alignment flags to the empty
- presentation type. This also affects the new complex.__format__ in
- the same way.
-
-- Implement PEP 383, Non-decodable Bytes in System Character Interfaces.
-
-- Issue #5890: in subclasses of 'property' the __doc__ attribute was
- shadowed by classtype's, even if it was None. property now
- inserts the __doc__ into the subclass instance __dict__.
-
-- Issue #4426: The UTF-7 decoder was too strict and didn't accept some legal
- sequences. Patch by Nick Barnes and Victor Stinner.
-
-- Issue #3672: Reject surrogates in utf-8 codec; add surrogatepass error handler.
-
-- Issue #5883: In the io module, the BufferedIOBase and TextIOBase ABCs have
- received a new method, detach(). detach() disconnects the underlying stream
- from the buffer or text IO and returns it.
-
-- Issue #5859: Remove switch from '%f' to '%g'-style formatting for
- floats with absolute value over 1e50. Also remove length
- restrictions for float formatting: '%.67f' % 12.34 and '%.120e' %
- 12.34 no longer raise an exception.
-
-- Issue #1588: Add complex.__format__. For example,
- format(complex(1, 2./3), '.5') now produces a sensible result.
-
-- Issue #5864: Fix empty format code formatting for floats so that it
- never gives more than the requested number of significant digits.
-
-- Issue #5793: Rationalize isdigit / isalpha / tolower, etc. Includes
- new Py_ISDIGIT / Py_ISALPHA / Py_TOLOWER, etc. in pctypes.h.
-
-- Issue #5835: Deprecate PyOS_ascii_formatd.
-
-- Issue #4971: Fix titlecase for characters that are their own
- titlecase, but not their own uppercase.
-
-- Issue #5283: Setting __class__ in __del__ caused a segfault.
-
-- Issue #5816: complex(repr(z)) now recovers z exactly, even when
- z involves nans, infs or negative zeros.
-
-- Issue #3166: Make int -> float conversions correctly rounded.
-
-- Issue #1869 (and many duplicates): make round(x, n) correctly
- rounded for a float x, by using the decimal <-> binary conversions
- from Python/dtoa.c. As a consequence, (e.g.) round(x, 2) now
- consistently agrees with format(x, '.2f').
-
-- Issue #5787: object.__getattribute__(some_type, "__bases__") segfaulted on
- some builtin types.
-
-- Issue #5772: format(1e100, '<') produces '1e+100', not '1.0e+100'.
-
-- Issue #5515: str.format() type 'n' combined with commas and leading
- zeros no longer gives odd results with ints and floats.
-
-- Implement PEP 378, Format Specifier for Thousands Separator, for
- floats.
-
-- The str function switches to exponential notation at
- 1e11, not 1e12. This avoids printing 13 significant digits in
- situations where only 12 of them are correct. Example problem
- value: str(1e11 + 0.5). (This minor issue has existed in 2.x for a
- long time.)
-
-- Issue #1580: On most platforms, use a 'short' float repr: for a
- finite float x, repr(x) now outputs a string based on the shortest
- sequence of decimal digits that rounds to x. Previous behaviour was
- to output 17 significant digits and then strip trailing zeros.
- Another minor difference is that the new repr switches to
- exponential notation at 1e16 instead of the previous 1e17; this
- avoids misleading output in some cases.
-
- There's a new sys attribute sys.float_repr_style, which takes
- the value 'short' to indicate that we're using short float repr,
- and 'legacy' if the short float repr isn't available for one
- reason or another.
-
- The float repr change involves incorporating David Gay's 'perfect
- rounding' code into the Python core (it's in Python/dtoa.c). As a
- secondary consequence, all string-to-float and float-to-string
- conversions (including all float formatting operations) will be
- correctly rounded on these platforms.
-
- See issue #1580 discussions for details of platforms for which
- this change does not apply.
-
-- Issue #5759: float() didn't call __float__ on str subclasses.
-
-- The string.maketrans() function is deprecated; there is a new static method
- maketrans() on the bytes and bytearray classes. This removes confusion about
- the types string.maketrans() is supposed to work with, and mirrors the
- methods available on the str class.
-
-- Issue #2170: refactored xml.dom.minidom.normalize, increasing both
- its clarity and its speed.
-
-- Issue #1113244: Py_XINCREF, Py_DECREF, Py_XDECREF: Add ``do { ... } while (0)``
- to avoid compiler warnings.
-
-- Issue #3739: The unicode-internal encoder now reports the number of characters
- consumed like any other encoder (instead of the number of bytes).
-
-Installation
-------------
-
-- Issue #5756: Install idle and pydoc with a 3 suffix.
-
-Library
--------
-
-- Issue #8203: Fix IDLE Credits dialog: view_file() uses its encoding argument.
-
-- Issue #5311: bdist_msi can now build packages that do not depend on a
- specific Python version.
-
-- Issue #5150: IDLE's format menu now has an option to strip trailing
- whitespace.
-
-- Issue #5940: distutils.command.build_clib.check_library_list was not doing
- the right type checkings anymore.
-
-- Issue #4875: On win32, ctypes.util.find_library does no longer
- return directories.
-
-- Issue #5142: Add the ability to skip modules while stepping to pdb.
-
-- Issue #1309567: Fix linecache behavior of stripping subdirectories when
- looking for files given by a relative filename.
-
-- Issue #5923: Update the ``turtle`` module to version 1.1, add two new
- turtle demos in Demo/turtle.
-
-- Issue #5692: In :class:`zipfile.Zipfile`, fix wrong path calculation when
- extracting a file to the root directory.
-
-- Issue #5913: os.listdir() should fail for empty path on windows.
-
-- Issue #5084: unpickling now interns the attribute names of pickled objects,
- saving memory and avoiding growth in size of subsequent pickles. Proposal
- and original patch by Jake McGuire.
-
-- The json module now works exclusively with str and not bytes.
+- Issue #13840: The error message produced by ctypes.create_string_buffer
+ when given a Unicode string has been fixed.
-- Issue #3959: The ipaddr module has been added to the standard library.
- Contributed by Google.
+- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
+ Vilmos Nebehaj.
-- Issue #3002: ``shutil.copyfile()`` and ``shutil.copytree()`` now raise an
- error when a named pipe is encountered, rather than blocking infinitely.
+- Issue #7777: socket: Add Reliable Datagram Sockets (PF_RDS) support.
-- Issue #5857: tokenize.tokenize() now returns named tuples.
+- Issue #13159: FileIO and BZ2Compressor/BZ2Decompressor now use a linear-time
+ buffer growth strategy instead of a quadratic-time one.
-- Issue #4305: ctypes should now build again on mipsel-linux-gnu
+- Issue #10141: socket: Add SocketCAN (PF_CAN) support. Initial patch by
+ Matthias Fuchs, updated by Tiago Gonçalves.
-- Issue #1734234: Massively speedup ``unicodedata.normalize()`` when the
- string is already in normalized form, by performing a quick check beforehand.
- Original patch by Rauli Ruohonen.
+- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
+ would be finalized after the reference to its underlying BufferedRWPair's
+ writer got cleared by the GC.
-- Issue #5853: calling a function of the mimetypes module from several threads
- at once could hit the recursion limit if the mimetypes database hadn't been
- initialized before.
+- Issue #12881: ctypes: Fix segfault with large structure field names.
-- Issue #5854: Updated __all__ to include some missing names and remove some
- names which should not be exported.
+- Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by
+ Thomas Jarosch.
-- Issue #3102: All global symbols that the _ctypes extension defines
- are now prefixed with 'Py' or '_ctypes'.
+- Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype.
+ Thanks to Suman Saha for finding the bug and providing a patch.
-- Issue #5041: ctypes does now allow pickling wide character.
+- Issue #13022: Fix: _multiprocessing.recvfd() doesn't check that
+ file descriptor was actually received.
-- Issue #5812: For the two-argument form of the Fraction constructor,
- Fraction(m, n), m and n are permitted to be arbitrary Rational
- instances.
+- Issue #1172711: Add 'long long' support to the array module.
+ Initial patch by Oren Tirosh and Hirokazu Yamamoto.
-- Issue #5812: Fraction('1e6') is valid: more generally, any string
- that's valid for float() is now valid for Fraction(), with the
- exception of strings representing NaNs and infinities.
+- Issue #12483: ctypes: Fix a crash when the destruction of a callback
+ object triggers the garbage collector.
-- Issue #5734: BufferedRWPair was poorly tested and had several glaring
- bugs. Patch by Brian Quinlan.
+- Issue #12950: Fix passing file descriptors in multiprocessing, under
+ OpenIndiana/Illumos.
-- Issue #1161031: fix readwrite select flag handling: POLLPRI now
- results in a handle_expt_event call, not handle_read_event, and POLLERR
- and POLLNVAL now call handle_close, not handle_expt_event. Also,
- dispatcher now has an 'ignore_log_types' attribute for suppressing
- log messages, which is set to 'warning' by default.
+- Issue #12764: Fix a crash in ctypes when the name of a Structure field is not
+ a string.
-- Issue #2703: SimpleXMLRPCDispatcher.__init__: Provide default values for
- new arguments introduced in 2.5.
+- Issue #11241: subclasses of ctypes.Array can now be subclassed.
-- Issue #5828 (Invalid behavior of unicode.lower): Fixed bogus logic in
- makeunicodedata.py and regenerated the Unicode database (This fixes
- u'\u1d79'.lower() == '\x00').
+- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
+ some functions like file.write().
-Extension Modules
------------------
+- Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
+ signature. Without this, architectures where sizeof void* != sizeof int are
+ broken. Patch given by Hallvard B Furuseth.
-- Issue #5881: Remove old undocumented compatibility interfaces in hashlib and
- pwd.
+- Issue #12051: Fix segfault in json.dumps() while encoding highly-nested
+ objects using the C accelerations.
-- Issue #5463: In struct module, remove deprecated float coercion
- for integer type codes: struct.pack('L', 0.3) should now raise
- an error. The _PY_STRUCT_FLOAT_COERCE constant has been removed.
- The version number has been bumped to 0.3.
+- Issue #12017: Fix segfault in json.loads() while decoding highly-nested
+ objects using the C accelerations.
-- Issue #5359: Readd the Berkeley DB detection code to allow _dbm be built
- using Berkeley DB.
+- Issue #1838: Prevent segfault in ctypes, when _as_parameter_ on a class is set
+ to an instance of the class.
Tests
-----
-- Issue #5354: New test support function import_fresh_module() makes
- it easy to import both normal and optimised versions of modules.
- test_heapq and test_warnings have been adjusted to use it, tests for
- other modules with both C and Python implementations in the stdlib
- can be adjusted to use it over time.
-
-- Issue #5837: Certain sequences of calls to set() and unset() for
- support.EnvironmentVarGuard objects restored the environment variables
- incorrectly on __exit__.
-
-C-API
------
-
-- Issue #5630: A replacement PyCObject API, PyCapsule, has been added.
-
-
-What's New in Python 3.1 alpha 2?
-=================================
-
-*Release date: 2009-4-4*
-
-Core and Builtins
------------------
-
-- Implement PEP 378, Format Specifier for Thousands Separator, for
- integers.
-
-- Issue #5666: Py_BuildValue's 'c' code should create byte strings.
-
-- Issue #5499: The 'c' code for argument parsing functions now only accepts a
- byte, and the 'C' code only accepts a unicode character.
-
-- Fix a problem in PyErr_NormalizeException that leads to "undetected errors"
- when hitting the recursion limit under certain circumstances.
-
-- Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.
-
-- Fix a segfault when running test_exceptions with coverage, caused by
- insufficient checks in accessors of Exception.__context__.
-
-- Issue #5604: non-ASCII characters in module name passed to
- imp.find_module() were converted to UTF-8 while the path is
- converted to the default filesystem encoding, causing nonsense.
-
-- Issue #5126: str.isprintable() returned False for space characters.
-
-- Issue #4865: On MacOSX /Library/Python/2.7/site-packages is added to
- the end sys.path, for compatibility with the system install of Python.
-
-- Issue #4688: Add a heuristic so that tuples and dicts containing only
- untrackable objects are not tracked by the garbage collector. This can
- reduce the size of collections and therefore the garbage collection overhead
- on long-running programs, depending on their particular use of datatypes.
-
-- Issue #5512: Rewrite PyLong long division algorithm (x_divrem) to
- improve its performance. Long divisions and remainder operations
- are now between 50% and 150% faster.
-
-- Issue #4258: Make it possible to use base 2**30 instead of base
- 2**15 for the internal representation of integers, for performance
- reasons. Base 2**30 is enabled by default on 64-bit machines. Add
- --enable-big-digits option to configure, which overrides the
- default. Add sys.int_info structseq to provide information about
- the internal format.
-
-- Issue #4474: PyUnicode_FromWideChar now converts characters outside
- the BMP to surrogate pairs, on systems with sizeof(wchar_t) == 4
- and sizeof(Py_UNICODE) == 2.
-
-- Issue #5237: Allow auto-numbered fields in str.format(). For
- example: '{} {}'.format(1, 2) == '1 2'.
-
-- Issue #5392: when a very low recursion limit was set, the interpreter would
- abort with a fatal error after the recursion limit was hit twice.
-
-- Issue #3845: In PyRun_SimpleFileExFlags avoid invalid memory access with
- short file names.
-
-Library
--------
-
-- Issue #2625: added missing items() call to the for loop in
- mailbox.MH.get_message().
-
-- Issue #5640: Fix _multibytecodec so that CJK codecs don't repeat
- error substitutions from non-strict codec error callbacks in
- incrementalencoder and StreamWriter.
-
-- Issue #5656: Fix the coverage reporting when running the test suite with
- the -T argument.
-
-- Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
-
-- Issue #5624: Fix the _winreg module name still used in several modules.
-
-- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer.
-
-- Issue #5619: Multiprocessing children disobey the debug flag and causes
- popups on windows buildbots. Patch applied to work around this issue.
-
-- Issue #5400: Added patch for multiprocessing on netbsd compilation/support
-
-- Issue #5387: Fixed mmap.move crash by integer overflow.
-
-- Issue #5261: Patch multiprocessing's semaphore.c to support context
- manager use: "with multiprocessing.Lock()" works now.
-
-- Issue #5236: Change time.strptime() to only take strings. Didn't work with
- bytes already but the failure was non-obvious.
-
-- Issue #5177: Multiprocessing's SocketListener class now uses
- socket.SO_REUSEADDR on all connections so that the user no longer needs
- to wait 120 seconds for the socket to expire.
-
-- Issue #5595: Fix UnboundedLocalError in ntpath.ismount().
-
-- Issue #1174606: Calling read() without arguments of an unbounded file
- (typically /dev/zero under Unix) could crash the interpreter.
-
-- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
- io.BufferedRandom have been deprecated for removal in Python 3.2.
-
-- Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
- forever on incomplete input. That caused tarfile.open() to hang when used
- with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
- partial bzip2 compressed data.
-
-- Issue #2110: Add support for thousands separator and 'n' type
- specifier to Decimal.__format__
-
-- Fix Decimal.__format__ bug that swapped the meanings of the '<' and
- '>' alignment characters.
-
-- The error detection code in FileIO.close() could fail to reflect the `errno`
- value, and report it as -1 instead.
-
-- Issue #5016: FileIO.seekable() could return False if the file position
- was negative when truncated to a C int. Patch by Victor Stinner.
-
-Extension Modules
------------------
-
-- Issue #5391: mmap now deals exclusively with bytes.
-
-- Issue #5463: In struct module, remove deprecated overflow wrapping
- when packing an integer: struct.pack('=L', -1) now raises
- struct.error instead of returning b'\xff\xff\xff\xff'. The
- _PY_STRUCT_RANGE_CHECKING and _PY_STRUCT_OVERFLOW_MASKING constants
- have been removed from the struct module.
-
-
-What's New in Python 3.1 alpha 1
-================================
-
-*Release date: 2009-03-07*
-
-Core and Builtins
------------------
-
-- The io module has been reimplemented in C for speed.
-
-- Give dict views an informative __repr__.
-
-- Issue #5247: Improve error message when unknown format codes are
- used when using str.format() with str, int, and float arguments.
-
-- Issue #5249: time.strftime returned malformed string when format string
- contained non ascii character on windows.
-
-- Issue #4626: compile(), exec(), and eval() ignore the coding cookie if the
- source has already been decoded into str.
-
-- Issue #5186: Reduce hash collisions for objects with no __hash__ method by
- rotating the object pointer by 4 bits to the right.
-
-- Issue #4575: Fix Py_IS_INFINITY macro to work correctly on x87 FPUs:
- it now forces its argument to double before testing for infinity.
-
-- Issue #5137: Make len() correctly raise a TypeError when a __len__ method
- returns a non-number type.
-
-- Issue #5182: Removed memoryview.__str__.
-
-- Issue #1717: Removed builtin cmp() function, dropped tp_compare
- slot, the C API functions PyObject_Compare and PyUnicode_Compare and
- the type definition cmpfunc. The tp_compare slot has been renamed
- to tp_reserved, and is reserved for future usage.
-
-- Issue #1242657: the __len__() and __length_hint__() calls in several tools
- were suppressing all exceptions. These include list() and bytearray().
-
-- Issue #4707: round(x, n) now returns an integer if x is an integer.
- Previously it returned a float.
-
-- Issue #4753: By enabling a configure option named '--with-computed-gotos'
- on compilers that support it (notably: gcc, SunPro, icc), the bytecode
- evaluation loop is compiled with a new dispatch mechanism which gives
- speedups of up to 20%, depending on the system, on various benchmarks.
-
-- Issue #4874: Most builtin decoders now reject unicode input.
-
-- Issue #4842: Don't allow trailing 'L' when constructing an integer
- from a string.
-
-- Issue #4991: os.fdopen now raises an OSError for invalid file descriptors.
+- Issue #11689: Fix a variable scoping error in an sqlite3 test
-- Issue #4838: When a module is deallocated, free the memory backing the
- optional module state data.
+- Issue #13786: Remove unimplemented 'trace' long option from regrtest.py.
-- Issue #4910: Rename nb_long slot to nb_reserved, and change its
- type to ``(void *)``.
+- Issue #13725: Fix regrtest to recognize the documented -d flag.
+ Patch by Erno Tukia.
-- Issue #4935: The overflow checking code in the expandtabs() method common
- to str, bytes and bytearray could be optimized away by the compiler, letting
- the interpreter segfault instead of raising an error.
+- Issue #13304: Skip test case if user site-packages disabled (-s or
+ PYTHONNOUSERSITE). (Patch by Carl Meyer)
-- Issue #3720: Fix a crash when an iterator modifies its class and removes its
- __next__ method.
+- Issue #5661: Add a test for ECONNRESET/EPIPE handling to test_asyncore. Patch
+ by Xavier de Gaye.
-- Issue #4910: Builtin int() function and PyNumber_Long/PyNumber_Int API
- function no longer attempt to call the __long__ slot to convert an object
- to an integer. Only the __int__ and __trunc__ slots are examined.
+- Issue #13218: Fix test_ssl failures on Debian/Ubuntu.
-- Issue #4893: Use NT threading on CE.
+- Re-enable lib2to3's test_parser.py tests, though with an expected failure
+ (see issue 13125).
-- Issue #4915: Port sysmodule to Windows CE.
+- Issue #12656: Add tests for IPv6 and Unix sockets to test_asyncore.
-- Issue #4868: utf-8, utf-16 and latin1 decoding are now 2x to 4x faster. The
- common cases are optimized thanks to a dedicated fast path and a moderate
- amount of loop unrolling.
+- Issue #6484: Add unit tests for mailcap module (patch by Gregory Nofi)
-- Issue #4074: Change the criteria for doing a full garbage collection (i.e.
- collecting the oldest generation) so that allocating lots of objects without
- destroying them does not show quadratic performance. Based on a proposal by
- Martin von Löwis at
- http://mail.python.org/pipermail/python-dev/2008-June/080579.html.
+- Issue #11651: Improve the Makefile test targets to run more of the test suite
+ more quickly. The --multiprocess option is now enabled by default, reducing
+ the amount of time needed to run the tests. "make test" and "make quicktest"
+ now include some resource-intensive tests, but no longer run the test suite
+ twice to check for bugs in .pyc generation. Tools/scripts/run_test.py provides
+ an easy platform-independent way to run test suite with sensible defaults.
-- Issue #4604: Some objects of the I/O library could still be used after
- having been closed (for instance, a read() call could return some
- previously buffered data). Patch by Dmitry Vasiliev.
+- Issue #12331: The test suite for the packaging module can now run from an
+ installed Python.
-- Issue #4705: Fix the -u ("unbuffered binary stdout and stderr") command-line
- flag to work properly. Furthermore, when specifying -u, the text stdout
- and stderr streams have line-by-line buffering enabled (the default being
- to buffer arbitrary chunks of data).
+- Issue #12331: The test suite for lib2to3 can now run from an installed
+ Python.
-- The internal table, _PyLong_DigitValue, is now an array of unsigned chars
- instead of ints (reducing its size from 4 to 8 times thereby reducing
- Python's overall memory).
+- Issue #12626: In regrtest, allow to filter tests using a glob filter
+ with the ``-m`` (or ``--match``) option. This works with all test cases
+ using the unittest module. This is useful with long test suites
+ such as test_io or test_subprocess.
-- Issue #1180193: When importing a module from a .pyc (or .pyo) file with
- an existing .py counterpart, override the co_filename attributes of all
- code objects if the original filename is obsolete (which can happen if the
- file has been renamed, moved, or if it is accessed through different paths).
- Patch by Ziga Seilnacht and Jean-Paul Calderone.
+- Issue #12624: It is now possible to fail after the first failure when
+ running in verbose mode (``-v`` or ``-W``), by using the ``--failfast``
+ (or ``-G``) option to regrtest. This is useful with long test suites
+ such as test_io or test_subprocess.
-- Issue #4580: Fix slicing of memoryviews when the item size is greater than
- one byte. Also fixes the meaning of len() so that it returns the number of
- items, rather than the size in bytes.
+- Issue #12587: Correct faulty test file and reference in test_tokenize.
+ (Patch by Robert Xiao)
-- Issue #4075: Use OutputDebugStringW in Py_FatalError.
+- Issue #12573: Add resource checks for dangling Thread and Process objects.
-- Issue #4747: When the terminal does not use utf-8, executing a script with
- non-ascii characters in its name could fail with a "SyntaxError: None" error.
+- Issue #12549: Correct test_platform to not fail when OS X returns 'x86_64'
+ as the processor type on some Mac systems.
-- Issue #4797: IOError.filename was not set when ``_fileio.FileIO`` failed
- to open file with a bytes filename on Windows.
+- Skip network tests when getaddrinfo() returns EAI_AGAIN, meaning a temporary
+ failure in name resolution.
-- Issue #3680: Reference cycles created through a dict, set or deque iterator
- did not get collected.
+- Issue #11812: Solve transient socket failure to connect to 'localhost'
+ in test_telnetlib.py.
-- Issue #4701: PyObject_Hash now implicitly calls PyType_Ready on types
- where the tp_hash and tp_dict slots are both NULL.
+- Solved a potential deadlock in test_telnetlib.py. Related to issue #11812.
-- Issue #4759: None is now allowed as the first argument of
- bytearray.translate(). It was always allowed for bytes.translate().
+- Avoid failing in test_robotparser when mueblesmoraleda.com is flaky and
+ an overzealous DNS service (e.g. OpenDNS) redirects to a placeholder
+ Web site.
-- Added test case to ensure attempts to read from a file opened for writing
- fail.
+- Avoid failing in test_urllibnet.test_bad_address when some overzealous
+ DNS service (e.g. OpenDNS) resolves a non-existent domain name. The test
+ is now skipped instead.
-- Issue #3106: Speedup some comparisons (str/str and int/int).
+- Issue #12440: When testing whether some bits in SSLContext.options can be
+ reset, check the version of the OpenSSL headers Python was compiled against,
+ rather than the runtime version of the OpenSSL library.
-- Issue #2183: Simplify and optimize bytecode for list, dict and set
- comprehensions. Original patch for list comprehensions by Neal Norwitz.
+- Issue #11512: Add a test suite for the cgitb module. Patch by Robbie Clemons.
-- Issue #2467: gc.DEBUG_STATS reported invalid elapsed times. Also, always
- print elapsed times, not only when some objects are uncollectable /
- unreachable. Original patch by Neil Schemenauer.
+- Issue #12497: Install test/data to prevent failures of the various codecmaps
+ tests.
-- Issue #3439: Add a bit_length method to int.
+- Issue #12496: Install test/capath directory to prevent test_connect_capath
+ testcase failure in test_ssl.
-- Issue #2173: When getting device encoding, check that return value of
- nl_langinfo is not the empty string. This was causing silent build
- failures on OS X.
+- Issue #12469: Run wakeup and pending signal tests in a subprocess to run the
+ test in a fresh process with only one thread and to not change signal
+ handling of the parent process.
-- Issue #4597: Fixed several opcodes that weren't always propagating
- exceptions.
+- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
+ test_tk or test_ttk_guionly under a username that is not currently logged
+ in to the console windowserver (as may be the case under buildbot or ssh).
-- Issue #4589: Fixed exception handling when the __exit__ function of a
- context manager returns a value that cannot be converted to a bool.
+- Issue #12407: Explicitly skip test_capi.EmbeddingTest under Windows.
-- Issue #4445: Replace "sizeof(PyBytesObject)" with
- "offsetof(PyBytesObject, ob_sval) + 1" when allocating memory for
- bytes instances. On a typical machine this saves 3 bytes of memory
- (on average) per allocation of a bytes instance.
+- Issue #12400: regrtest -W doesn't rerun the tests twice anymore, but captures
+ the output and displays it on failure instead. regrtest -v doesn't print the
+ error twice anymore if there is only one error.
-- Issue #4533: File read operation was dreadfully slow due to a slowly
- growing read buffer. Fixed by using the same growth rate algorithm as
- Python 2.x.
+- Issue #12141: Install copies of template C module file so that
+ test_build_ext of test_distutils and test_command_build_ext of
+ test_packaging are no longer silently skipped when
+ run outside of a build directory.
-- Issue #4509: Various issues surrounding resize of bytearray objects to
- which there are buffer exports (e.g. memoryview instances).
+- Issue #8746: Add additional tests for os.chflags() and os.lchflags().
+ Patch by Garrett Cooper.
-- Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()``
- method on file objects with closefd=False. The file descriptor is still
- kept open but the file object behaves like a closed file. The ``FileIO``
- object also got a new readonly attribute ``closefd``.
+- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9
+ 2.8 + on Mac OS X. (Patch by Ronald Oussoren)
-- Issue #4569: Interpreter crash when mutating a memoryview with an item size
- larger than 1.
+- Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2,
+ iso2022_kr).
-- Issue #4748: Lambda generators no longer return a value.
+- Issue #12096: Fix a race condition in test_threading.test_waitfor(). Patch
+ written by Charles-François Natali.
-- The re.sub(), re.subn() and re.split() functions now accept a flags parameter.
+- Issue #11614: import __hello__ prints "Hello World!". Patch written by
+ Andreas Stührk.
-- Issue #5108: Handle %s like %S, %R and %A in PyUnicode_FromFormatV(): Call
- PyUnicode_DecodeUTF8() once, remember the result and output it in a second
- step. This avoids problems with counting UTF-8 bytes that ignores the effect
- of using the replace error handler in PyUnicode_DecodeUTF8().
+- Issue #5723: Improve json tests to be executed with and without accelerations.
-Library
--------
+- Issue #12041: Make test_wait3 more robust.
-- Issue #7071: byte-compilation in Distutils is now done with respect to
- sys.dont_write_bytecode.
+- Issue #11873: Change regex in test_compileall to fix occasional failures when
+ when the randomly generated temporary path happened to match the regex.
-- Issue #7066: archive_util.make_archive now restores the cwd if an error is
- raised. Initial patch by Ezio Melotti.
+- Issue #11958: Fix FTP tests for IPv6, bind to "::1" instead of "localhost".
+ Patch written by Charles-Francois Natali.
-- Issue #6516: Added owner/group support when creating tar archives in
- Distutils.
+- Issue #8407, #11859: Fix tests of test_io using threads and an alarm: use
+ pthread_sigmask() to ensure that the SIGALRM signal is received by the main
+ thread.
-- Issue #6954: Fixed crash when using DISTUTILS_DEBUG flag in Distutils.
+- Issue #11811: Factor out detection of IPv6 support on the current host
+ and make it available as ``test.support.IPV6_ENABLED``. Patch by
+ Charles-François Natali.
-- Issue #6163: Fixed HP-UX runtime library dir options in
- distutils.unixcompiler. Initial patch by Sridhar Ratnakumar and
- Michael Haubenwallner.
+- Issue #10914: Add a minimal embedding test to test_capi.
-- Issue #6693: New functions in site.py to get user/global site packages paths.
+- Issue #11223: Skip test_lock_acquire_interruption() and
+ test_rlock_acquire_interruption() of test_threadsignals if a thread lock is
+ implemented using a POSIX mutex and a POSIX condition variable. A POSIX
+ condition variable cannot be interrupted by a signal (e.g. on Linux, the
+ futex system call is restarted).
-- Issue #6511: ZipFile now raises BadZipfile (instead of an IOError) when
- opening an empty or very small file.
+- Issue #11790: Fix sporadic failures in test_multiprocessing.WithProcessesTestCondition.
-- Issue #6545: Removed assert statements in distutils.Extension, so the
- behavior is similar when used with -O.
+- Fix possible "file already exists" error when running the tests in parallel.
-- unittest has been split up into a package. All old names should still work.
+- Issue #11719: Fix message about unexpected test_msilib skip on non-Windows
+ platforms. Patch by Nadeem Vawda.
-- Issue #6466: now distutils.cygwinccompiler and distutils.emxccompiler
- uses the same refactored function to get gcc/ld/dllwrap versions numbers.
- It's `distutils.util.get_compiler_versions`. Added deprecation warnings
- for the obsolete get_versions() functions.
+- Issue #11727: Add a --timeout option to regrtest: if a test takes more than
+ TIMEOUT seconds, dumps the traceback of all threads and exits.
-- Issue #6433: fixed issues with multiprocessing.pool.map hanging on empty list
+- Issue #11653: fix -W with -j in regrtest.
-- Issue #6314: logging: Extra checks on the "level" argument in more places.
+- The email test suite now lives in the Lib/test/test_email package. The test
+ harness code has also been modernized to allow use of new unittest features.
-- Issue #2622: Fixed an ImportError when importing email.message from a
- standalone application built with py2exe or py2app.
+- regrtest now discovers test packages as well as test modules.
-- Issue #6455: Fixed test_build_ext under win32.
+- Issue #11577: improve test coverage of binhex.py. Patch by Arkady Koplyarov.
-- Issue #6377: Enabled the compiler option, and deprecate its usage as an
- attribute.
+- New test_crashers added to exercise the scripts in the Lib/test/crashers
+ directory and confirm they fail as expected
-- Issue #6413: Fixed the log level in distutils.dist for announce.
+- Issue #11578: added test for the timeit module. Patch by Michael Henry.
-- Issue #6403: Fixed package path usage in build_ext.
+- Issue #11503: improve test coverage of posixpath.py. Patch by Evan Dandrea.
-- Issues #5155, 5313, 5331: multiprocessing.Process._bootstrap was
- unconditionally calling "os.close(sys.stdin.fileno())" resulting in file
- descriptor errors
+- Issue #11505: improves test coverage of string.py, increases granularity of
+ string.Formatter tests. Initial patch by Alicia Arlen.
-- Issue #6365: Distutils build_ext inplace mode was copying the compiled
- extension in a subdirectory if the extension name had dots.
+- Issue #11548: Improve test coverage of the shutil module. Patch by
+ Evan Dandrea.
-- Issue #6164: Added an AIX specific linker argument in Distutils
- unixcompiler. Original patch by Sridhar Ratnakumar.
+- Issue #11554: Reactivated test_email_codecs.
-- Issue #6286: Now Distutils upload command is based on urllib2 instead of
- httplib, allowing the usage of http_proxy.
+- Issue #11505: improves test coverage of string.py. Patch by Alicia
+ Arlen
-- Issue #6287: Added the license field in Distutils documentation.
+- Issue #11490: test_subprocess:test_leaking_fds_on_error no longer gives a
+ false positive if the last directory in the path is inaccessible.
-- Issue #6263: Fixed syntax error in distutils.cygwincompiler.
+- Issue #11223: Fix test_threadsignals to fail, not hang, when the
+ non-semaphore implementation of locks is used under POSIX.
-- Issue #5201: distutils.sysconfig.parse_makefile() now understands `$$`
- in Makefiles. This prevents compile errors when using syntax like:
- `LDFLAGS='-rpath=\$$LIB:/some/other/path'`. Patch by Floris Bruynooghe.
+- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
+ Pierre Quentel.
-- Issue #6131: test_modulefinder leaked when run after test_distutils.
+- Issue #9931: Fix hangs in GUI tests under Windows in certain conditions.
Patch by Hirokazu Yamamoto.
-- Issue #6048: Now Distutils uses the tarfile module in archive_util.
-
-- Issue #6062: In distutils, fixed the package option of build_ext. Feedback
- and tests on pywin32 by Tim Golden.
-
-- Issue #6053: Fixed distutils tests on win32. patch by Hirokazu Yamamoto.
-
-- Issue #6046: Fixed the library extension when distutils build_ext is used
- inplace. Initial patch by Roumen Petrov.
-
-- Issue #6041: Now distutils `sdist` and `register` commands use `check` as a
- subcommand.
-
-- Issue #6022: a test file was created in the current working directory by
- test_get_outputs in Distutils.
-
-- Issue #5977: distutils build_ext.get_outputs was not taking into account the
- inplace option. Initial patch by kxroberto.
-
-- Issue #5984: distutils.command.build_ext.check_extensions_list checks were broken
- for old-style extensions.
-
-- Issue #5976: Fixed Distutils test_check_environ.
-
-- Issue #5941: Distutils build_clib command was not working anymore because
- of an incomplete costumization of the archiver command. Added ARFLAGS in the
- Makefile besides AR and make Distutils use it. Original patch by David
- Cournapeau.
-
-- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec.
-
-- Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive
- anymore.
-
-- Issue #5810: Fixed Distutils test_build_scripts so it uses
- sysconfig.get_config_vars.
-
-- Issue #4951: Fixed failure in test_httpservers.
-
-- Issue #5795: Fixed test_distutils failure on Debian ppc.
-
-- Issue #5607: fixed Distutils test_get_platform for Mac OS X fat binaries.
-
-- Issue #5741: don't disallow "%%" (which is an escape for "%") when setting
- a value in SafeConfigParser.
-
-- Issue #5732: added a new command in Distutils: check.
-
-- Issue #5731: Distutils bdist_wininst no longer worked on non-Windows
- platforms. Initial patch by Paul Moore.
-
-- Issue #5095: Added bdist_msi to the list of bdist supported formats.
- Initial fix by Steven Bethard.
-
-- Issue #1491431: Fixed distutils.filelist.glob_to_re for edge cases.
- Initial fix by Wayne Davison.
-
-- Issue #5694: removed spurious test output in Distutils (test_clean).
-
-- Issue #1326077: fix the formatting of SyntaxErrors by the traceback module.
-
-- Issue #1665206 (partially): Move imports in cgitb to the top of the module
- instead of performing them in functions. Helps prevent import deadlocking in
- threads.
-
-- Issue #2522: locale.format now checks its first argument to ensure it has
- been passed only one pattern, avoiding mysterious errors where it appeared
- that it was failing to do localization.
-
-- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
- Brandl.
-
-- Issue #1222: locale.format() bug when the thousands separator is a space
- character.
-
-- Issue #5472: Fixed distutils.test_util tear down. Original patch by
- Tim Golden.
-
-- collections.deque() objects now have a read-only attribute called maxlen.
-
-- Issue #2638: Show a window constructed with tkSimpleDialog.Dialog only after
- it is has been populated and properly configured in order to prevent
- window flashing.
-
-- Issue #4792: Prevent a segfault in _tkinter by using the
- guaranteed to be safe interp argument given to the PythonCmd in place of
- the Tcl interpreter taken from a PythonCmd_ClientData.
-
-- Issue #5193: Guarantee that tkinter.Text.search returns a string.
-
-- Issue #5394: removed > 2.3 syntax from distutils.msvc9compiler.
- Original patch by Akira Kitada.
-
-- Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
-
-- Issue #5385: Fixed mmap crash after resize failure on windows.
-
-- Issue #5179: Fixed subprocess handle leak on failure on windows.
-
-- PEP 372: Added collections.OrderedDict().
-
-- The _asdict() for method for namedtuples now returns an OrderedDict().
-
-- configparser now defaults to using an ordered dictionary.
-
-- Issue #5401: Fixed a performance problem in mimetypes when ``from mimetypes
- import guess_extension`` was used.
-
-- Issue #1733986: Fixed mmap crash in accessing elements of second map object
- with same tagname but larger size than first map. (Windows)
-
-- Issue #5386: mmap.write_byte didn't check map size, so it could cause buffer
- overrun.
-
-- Issue #1533164: Installed but not listed ``*.pyo`` was breaking Distutils
- bdist_rpm command.
-
-- Issue #5378: added --quiet option to Distutils bdist_rpm command.
-
-- Issue #5052: make Distutils compatible with 2.3 again.
-
-- Issue #5316: Fixed buildbot failures introduced by multiple inheritance
- in Distutils tests.
-
-- Issue #5287: Add exception handling around findCaller() call to help out
- IronPython.
-
-- Issue #5282: Fixed mmap resize on 32bit windows and unix. When offset > 0,
- The file was resized to wrong size.
-
-- Issue #5292: Fixed mmap crash on its boundary access m[len(m)].
-
-- Issue #2279: distutils.sdist.add_defaults now add files
- from the package_data and the data_files metadata.
-
-- Issue #5257: refactored all tests in distutils, so they use
- support.TempdirManager, to avoid writing in the tests directory.
-
-- Issue #4524: distutils build_script command failed with --with-suffix=3.
- Initial patch by Amaury Forgeot d'Arc.
-
-- Issue #2461: added tests for distutils.util
-
-- Issue #4998: The memory saving effect of __slots__ had been lost on Fractions
- which inherited from numbers.py which did not have __slots__ defined. The
- numbers hierarchy now has its own __slots__ declarations.
-
-- Issue #4631: Fix urlopen() result when an HTTP response uses chunked
- encoding.
-
-- Issue #5203: Fixed ctypes segfaults when passing a unicode string to a
- function without argtypes (only occurs if HAVE_USABLE_WCHAR_T is false).
-
-- Issue #3386: distutils.sysconfig.get_python_lib prefix argument was ignored
- under NT and OS2. Patch by Philip Jenvey.
-
-- Issue #5128: Make compileall properly inspect bytecode to determine if needs
- to be recreated. This avoids a timing hole thanks to the old reliance on the
- ctime of the files involved.
-
-- Issue #5122: Synchronize tk load failure check to prevent a potential
- deadlock.
-
-- Issue #1818: collections.namedtuple() now supports a keyword argument
- 'rename' which lets invalid fieldnames be automatically converted to
- positional names in the form, _1, _2, ...
-
-- Issue #4890: Handle empty text search pattern in Tkinter.Text.search.
-
-- Issue #4512 (part 2): Promote ``ZipImporter._get_filename()`` to be a
- public documented method ``ZipImporter.get_filename()``.
-
-- Issue #4195: The ``runpy`` module (and the ``-m`` switch) now support
- the execution of packages by looking for and executing a ``__main__``
- submodule when a package name is supplied. Initial patch by Andi
- Vajda.
-
-- Issue #1731706: Call Tcl_ConditionFinalize for Tcl_Conditions that will
- not be used again (this requires Tcl/Tk 8.3.1), also fix a memory leak in
- Tkapp_Call when calling from a thread different than the one that created
- the Tcl interpreter. Patch by Robert Hancock.
-
-- Issue #4285: Change sys.version_info to be a named tuple. Patch by
- Ross Light.
-
-- Issue #1520877: Now distutils.sysconfig reads $AR from the
- environment/Makefile. Patch by Douglas Greiman.
-
-- Issue #1276768: The verbose option was not used in the code of
- distutils.file_util and distutils.dir_util.
-
-- Issue #5132: Fixed trouble building extensions under Solaris with
- --enabled-shared activated. Initial patch by Dave Peterson.
-
-- Issue #1581476: Always use the Tcl global namespace when calling into Tcl.
-
-- The shelve module now defaults to pickle protocol 3.
-
-- Fix a bug in the trace module where a bytes object from co_lnotab had its
- items being passed through ord().
-
-- Issue #2047: shutil.move() could believe that its destination path was
- inside its source path if it began with the same letters (e.g. "src" vs.
- "src.new").
-
-- Added the ttk module. See issue #2983: Ttk support for Tkinter.
-
-- Removed isSequenceType(), isMappingType, and isNumberType() from the
- operator module; use the abstract base classes instead. Also removed
- the repeat() function; use mul() instead.
-
-- Issue #5021: doctest.testfile() did not create __name__ and
- collections.namedtuple() relied on __name__ being defined.
-
-- Backport importlib from Python 3.1. Only the import_module() function has
- been backported to help facilitate transitions from 2.7 to 3.1.
-
-- Issue #1885: distutils. When running sdist with --formats=tar,gztar
- the tar file was overriden by the gztar one.
-
-- Issue #4863: distutils.mwerkscompiler has been removed.
-
-- Added a new itertools functions: combinations_with_replacement()
- and compress().
-
-- Issue #5032: added a step argument to itertools.count() and
- allowed non-integer arguments.
-
-- Fix and properly document the multiprocessing module's logging
- support, expose the internal levels and provide proper usage
- examples.
-
-- Issue #1672332: fix unpickling of subnormal floats, which was
- producing a ValueError on some platforms.
-
-- Issue #3881: Help Tcl to load even when started through the
- unreadable local symlink to "Program Files" on Vista.
-
-- Issue #4710: Extract directories properly in the zipfile module;
- allow adding directories to a zipfile.
-
-- Issue #3807: _multiprocessing build fails when configure is passed
- --without-threads argument. When this occurs, _multiprocessing will
- be disabled, and not compiled.
-
-- Issue #5008: When a file is opened in append mode with the new IO library,
- do an explicit seek to the end of file (so that e.g. tell() returns the
- file size rather than 0). This is consistent with the behaviour of the
- traditional 2.x file object.
-
-- Issue #5013: Fixed a bug in FileHandler which occurred when the delay
- parameter was set.
-
-- Issue #4842: Always append a trailing 'L' when pickling longs using
- pickle protocol 0. When reading, the 'L' is optional.
-
-- Add the importlib package.
-
-- Issue #4301: Patch the logging module to add processName support, remove
- _check_logger_class from multiprocessing.
+- Issue #10512: Properly close sockets under test.test_cgi.
-- Issue #3325: Remove python2.x try: except: imports for old cPickle from
- multiprocessing.
+- Issue #10992: Make tests pass under coverage.
-- Issue #4959: inspect.formatargspec now works for keyword only arguments
- without defaults.
-
-- Issue #3321: ``_multiprocessing.Connection()`` doesn't check handle; added checks
- for Unix machines for negative handles and large int handles. Without this check
- it is possible to segfault the interpreter.
-
-- Issue #4449: AssertionError in mp_benchmarks.py, caused by an underlying issue
- in sharedctypes.py.
-
-- Issue #1225107: inspect.isclass() returned True for instances with a custom
- __getattr__.
-
-- Issue #3826 and #4791: The socket module now closes the underlying socket
- appropriately when it is being used via socket.makefile() objects
- rather than delaying the close by waiting for garbage collection to do it.
-
-- Issue #1696199: Add collections.Counter() for rapid and convenient
- counting.
-
-- Issue #3860: GzipFile and BZ2File now support the context manager protocol.
-
-- Issue #4867: Fixed a crash in ctypes when passing a string to a
- function without defining argtypes.
-
-- Issue #4272: Add an optional argument to the GzipFile constructor to override
- the timestamp in the gzip stream. The default value remains the current time.
- The information can be used by e.g. gunzip when decompressing. Patch by
- Jacques Frechet.
-
-- Restore Python 2.3 compatibility for decimal.py.
-
-- Issue #3638: Remove functions from _tkinter module level that depend on
- TkappObject to work with multiple threads.
-
-- Issue #4718: Adapt the wsgiref package so that it actually works with
- Python 3.x, in accordance with the `official amendments of the spec
- <http://www.wsgi.org/wsgi/Amendments_1.0>`_.
-
-- Issue #4796: Added Decimal.from_float() and Context.create_decimal_from_float()
- to the decimal module.
-
-- Fractions.from_float() no longer loses precision for integers too big to
- cast as floats.
-
-- Issue #4812: add missing underscore prefix to some internal-use-only
- constants in the decimal module. (Dec_0 becomes _Dec_0, etc.)
-
-- Issue #4790: The nsmallest() and nlargest() functions in the heapq module
- did unnecessary work in the common case where no key function was specified.
-
-- Issue #4795: inspect.isgeneratorfunction() returns False instead of None when
- the function is not a generator.
-
-- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
- no MSVC compiler is found under Windows. Original patch by Philip Jenvey.
-
-- Issue #4646: distutils was choking on empty options arg in the setup
- function. Original patch by Thomas Heller.
-
-- Issue #3767: Convert Tk object to string in tkColorChooser.
-
-- Issue #3248: Allow placing ScrolledText in a PanedWindow.
-
-- Issue #4444: Allow assertRaises() to be used as a context handler, so that
- the code under test can be written inline if more practical.
-
-- Issue #4739: Add pydoc help topics for symbols, so that e.g. help('@')
- works as expected in the interactive environment.
-
-- Issue #4756: zipfile.is_zipfile() now supports file-like objects. Patch by
- Gabriel Genellina.
-
-- Issue #4574: reading an UTF16-encoded text file crashes if \r on 64-char
- boundary.
-
-- Issue #4223: inspect.getsource() will now correctly display source code
- for packages loaded via zipimport (or any other conformant PEP 302
- loader). Original patch by Alexander Belopolsky.
-
-- Issue #4201: pdb can now access and display source code loaded via
- zipimport (or any other conformant PEP 302 loader). Original patch by
- Alexander Belopolsky.
-
-- Issue #4197: doctests in modules loaded via zipimport (or any other PEP
- 302 conformant loader) will now work correctly in most cases (they
- are still subject to the constraints that exist for all code running
- from inside a module loaded via a PEP 302 loader and attempting to
- perform IO operations based on __file__). Original patch by
- Alexander Belopolsky.
-
-- Issues #4082 and #4512: Add runpy support to zipimport in a manner that
- allows backporting to maintenance branches. Original patch by
- Alexander Belopolsky.
-
-- Issue #4163: textwrap module: allow word splitting on a hyphen preceded by
- a non-ASCII letter.
-
-- Issue #4616: TarFile.utime(): Restore directory times on Windows.
-
-- Issue #4021: tokenize.detect_encoding() now raises a SyntaxError when the
- codec cannot be found. This is for compatibility with the builtin behavior.
-
-- Issue #4084: Fix max, min, max_mag and min_mag Decimal methods to
- give correct results in the case where one argument is a quiet NaN
- and the other is a finite number that requires rounding.
-
-- Issue #4483: _dbm module now builds on systems with gdbm & gdbm_compat
- libs.
-
-- Added the subprocess.check_call_output() convenience function to get output
- from a subprocess on success or raise an exception on error.
-
-- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
- support unusual filenames (such as those containing semi-colons) in
- Content-Disposition headers.
-
-- Issue #4384: Added logging integration with warnings module using
- captureWarnings(). This change includes a NullHandler which does nothing;
- it will be of use to library developers who want to avoid the "No handlers
- could be found for logger XXX" message which can appear if the library user
- doesn't configure logging.
-
-- Issue #3741: DISTUTILS_USE_SDK set causes msvc9compiler.py to raise an
- exception.
-
-- Issue #4529: fix the parser module's validation of try-except-finally
- statements.
-
-- Issue #4458: getopt.gnu_getopt() now recognizes a single "-" as an argument,
- not a malformed option.
-
-- Added the subprocess.check_output() convenience function to get output
- from a subprocess on success or raise an exception on error.
-
-- Issue #4542: On Windows, binascii.crc32 still accepted str as binary input;
- the corresponding tests now pass.
-
-- Issue #4537: webbrowser.UnixBrowser would fail to open the browser because
- it was calling the wrong open() function.
-
-- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
- support unusual filenames (such as those containing semi-colons) in
- Content-Disposition headers.
-
-- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
- biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
-
-- Issue #5104: The socket module now raises OverflowError when 16-bit port and
- protocol numbers are supplied outside the allowed 0-65536 range on bind()
- and getservbyport().
-
-- Windows locale mapping updated to Vista.
-
-Tools/Demos
------------
-
-- Issue #4704: remove use of cmp() in pybench, bump its version number to 2.1,
- and make it 2.6-compatible.
-
-- Ttk demos added in Demo/tkinter/ttk/
-
-- Issue #4677: add two list comprehension tests to pybench.
-
-
-Build
------
-
-- Issue #6094: Build correctly with Subversion 1.7.
-
-- Issue #5847: Remove -n switch on "Edit with IDLE" menu item.
-
-- Issue #5726: Make Modules/ld_so_aix return the actual exit code of the
- linker, rather than always exit successfully. Patch by Floris Bruynooghe.
-
-- Issue #4587: Add configure option --with-dbmliborder=db1:db2:... to specify
- the order that backends for the dbm extension are checked.
-
-- Link the shared python library with $(MODLIBS).
-
-- Issue #5134: Silence compiler warnings when compiling sqlite with VC++.
-
-- Issue #4494: Fix build with Py_NO_ENABLE_SHARED on Windows.
-
-- Issue #4895: Use _strdup on Windows CE.
-
-- Issue #4472: "configure --enable-shared" now works on OSX
-
-- Issues #4728 and #4060: WORDS_BIGEDIAN is now correct in Universal builds.
-
-- Issue #4389: Add icon to the uninstall entry in "add-and-remove-programs".
-
-- Issue #4289: Remove Cancel button from AdvancedDlg.
-
-- Issue #1656675: Register a drop handler for .py* files on Windows.
-
-- Issue #4120: Exclude manifest from extension modules in VS2008.
-
-- Issue #4091: Install pythonxy.dll in system32 again.
-
-- Issue #4018: Disable "for me" installations on Vista.
-
-- Issue #3758: Add ``patchcheck`` build target to .PHONY.
-
-- Issue #4204: Fixed module build errors on FreeBSD 4.
+- Issue #10826: Prevent sporadic failure in test_subprocess on Solaris due
+ to open door files.
+- Issue #10990: Prevent tests from clobbering a set trace function.
C-API
-----
-- Issue #6624: yArg_ParseTuple with "s" format when parsing argument with
- NUL: Bogus TypeError detail string.
-
-- Issue #5175: PyLong_AsUnsignedLongLong now raises OverflowError
- for negative arguments. Previously, it raised TypeError.
-
-- Issue #4720: The format for PyArg_ParseTupleAndKeywords can begin with '|'.
-
-- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
- the GIL is released, or owned by another thread.
-
-- Issue #4122: On Windows, fix a compilation error when using the
- Py_UNICODE_ISSPACE macro in an extension module.
-
-
-Extension Modules
------------------
+- Add PyObject_GenericGetDict and PyObject_GeneriSetDict. They are generic
+ implementations for the getter and setter of a ``__dict__`` descriptor of C
+ types.
-- Issue #3745: Fix hashlib to always reject unicode and non buffer-api
- supporting objects as input no matter how it was compiled (built in
- implementations or external openssl library).
+- Issue #13727: Add 3 macros to access PyDateTime_Delta members:
+ PyDateTime_DELTA_GET_DAYS, PyDateTime_DELTA_GET_SECONDS,
+ PyDateTime_DELTA_GET_MICROSECONDS.
-- Issue #4397: Fix occasional test_socket failure on OS X.
+- Issue #10542: Add 4 macros to work with surrogates: Py_UNICODE_IS_SURROGATE,
+ Py_UNICODE_IS_HIGH_SURROGATE, Py_UNICODE_IS_LOW_SURROGATE,
+ Py_UNICODE_JOIN_SURROGATES.
-- Issue #4279: Fix build of parsermodule under Cygwin.
+- Issue #12724: Add Py_RETURN_NOTIMPLEMENTED macro for returning NotImplemented.
-- Issue #4751: hashlib now releases the GIL when hashing large buffers
- (with a hardwired threshold of 2048 bytes), allowing better parallelization
- on multi-CPU systems. Contributed by Lukas Lueg (ebfe) and Victor Stinner.
+- PY_PATCHLEVEL_REVISION has been removed, since it's meaningless with
+ Mercurial.
-- Issue #4051: Prevent conflict of UNICODE macros in cPickle.
+- Issue #12173: The first argument of PyImport_ImportModuleLevel is now `const
+ char *` instead of `char *`.
-- Issue #4738: Each zlib object now has a separate lock, allowing to compress
- or decompress several streams at once on multi-CPU systems. Also, the GIL
- is now released when computing the CRC of a large buffer. Patch by ebfe.
+- Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format.
-- Issue #4228: Pack negative values the same way as 2.4 in struct's L format.
+Documentation
+-------------
-- Issue #1040026: Fix os.times result on systems where HZ is incorrect.
+- Issue #13498: Clarify docs of os.makedirs()'s exist_ok argument. Done with
+ great native-speaker help from R. David Murray.
-- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
- OpenBSD.
+- Issues #13491 and #13995: Fix many errors in sqlite3 documentation.
+ Initial patch for #13491 by Johannes Vogel.
-- Issue #4583: array.array would not always prohibit resizing when a buffer
- has been exported, resulting in an interpreter crash when accessing the
- buffer.
+- Issue #13402: Document absoluteness of sys.executable.
+- Issue #13883: PYTHONCASEOK also works on OS X.
-- Issue #5228: Make functools.partial objects can now be pickled.
+- Issue #9021: Add an introduction to the copy module documentation.
-Tests
------
+- Issue #6005: Examples in the socket library documentation use sendall, where
+ relevant, instead send method.
-- Issue #6152: New option '-j'/'--multiprocess' for regrtest allows running
- regression tests in parallel, shortening the total runtime.
+- Issue #12798: Updated the mimetypes documentation.
-- Issue #5450: Moved tests involving loading tk from Lib/test/test_tcl to
- Lib/tkinter/test/test_tkinter/test_loadtk. With this, these tests demonstrate
- the same behaviour as test_ttkguionly (and now also test_tk) which is to
- skip the tests if DISPLAY is defined but can't be used.
+- Issue #12949: Document the kwonlyargcount argument for the PyCode_New
+ C API function.
-- regrtest no longer treats ImportError as equivalent to SkipTest. Imports
- that should cause a test to be skipped are now done using import_module
- from test support, which does the conversion.
+- Issue #13513: Fix io.IOBase documentation to correctly link to the
+ io.IOBase.readline method instead of the readline module.
-- Issue #5083: New 'gui' resource for regrtest.
+- Issue #13237: Reorganise subprocess documentation to emphasise convenience
+ functions and the most commonly needed arguments to Popen.
+- Issue #13141: Demonstrate recommended style for socketserver examples.
-Docs
-----
+- Issue #11818: Fix tempfile examples for Python 3.
**(For information about older versions, consult the HISTORY file.)**
diff --git a/Misc/README b/Misc/README
index b239cee..118f6c7 100644
--- a/Misc/README
+++ b/Misc/README
@@ -8,7 +8,6 @@ Files found here
----------------
ACKS Acknowledgements
-build.sh Script to build and test latest Python from the repository
gdbinit Handy stuff to put in your .gdbinit file, if you use gdb
HISTORY News from previous releases -- oldest last
indent.pro GNU indent profile approximating my C style
@@ -19,8 +18,11 @@ python.man UNIX man page for the python interpreter
python.pc.in Package configuration info template for pkg-config
python-wing*.wpr Wing IDE project file
README The file you're reading now
+README.AIX Information about using Python on AIX
+README.coverity Information about running Coverity's Prevent on Python
README.valgrind Information for Valgrind users, see valgrind-python.supp
RPM (Old) tools to build RPMs
+svnmap.txt Map of old SVN revs and branches to hg changeset ids
SpecialBuilds.txt Describes extra symbols you can set for debug builds
TextMate A TextMate bundle for Python development
valgrind-python.supp Valgrind suppression file, see README.valgrind
diff --git a/Misc/RPM/python-3.2.spec b/Misc/RPM/python-3.3.spec
index 18f3e77..936a21f 100644
--- a/Misc/RPM/python-3.2.spec
+++ b/Misc/RPM/python-3.3.spec
@@ -39,8 +39,8 @@
%define name python
#--start constants--
-%define version 3.2.3
-%define libvers 3.2
+%define version 3.3.0
+%define libvers 3.3
#--end constants--
%define release 1pydotorg
%define __prefix /usr
diff --git a/Misc/python-config.in b/Misc/python-config.in
index 79f0bb1..bb0b008 100644
--- a/Misc/python-config.in
+++ b/Misc/python-config.in
@@ -7,7 +7,7 @@ import sys
import sysconfig
valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
- 'ldflags', 'extension-suffix', 'help', 'abiflags']
+ 'ldflags', 'extension-suffix', 'help', 'abiflags', 'configdir']
def exit_with_usage(code=1):
print("Usage: {0} [{1}]".format(
@@ -61,3 +61,6 @@ for opt in opt_flags:
elif opt == '--abiflags':
print(sys.abiflags)
+
+ elif opt == '--configdir':
+ print(sysconfig.get_config_var('LIBPL'))
diff --git a/Misc/python.man b/Misc/python.man
index 20beded..72e1ecb 100644
--- a/Misc/python.man
+++ b/Misc/python.man
@@ -37,13 +37,6 @@ python \- an interpreted, interactive, object-oriented programming language
.B \-OO
]
[
-.B \-R
-]
-[
-.B -Q
-.I argument
-]
-[
.B \-s
]
[
@@ -155,27 +148,6 @@ Discard docstrings in addition to the \fB-O\fP optimizations.
Do not print the version and copyright messages. These messages are
also suppressed in non-interactive mode.
.TP
-.B \-R
-Turn on "hash randomization", so that the hash() values of str, bytes and
-datetime objects are "salted" with an unpredictable pseudo-random value.
-Although they remain constant within an individual Python process, they are
-not predictable between repeated invocations of Python.
-.IP
-This is intended to provide protection against a denial of service
-caused by carefully-chosen inputs that exploit the worst case performance
-of a dict construction, O(n^2) complexity. See
-http://www.ocert.org/advisories/ocert-2011-003.html
-for details.
-.TP
-.BI "\-Q " argument
-Division control; see PEP 238. The argument must be one of "old" (the
-default, int/int and long/long return an int or long), "new" (new
-division semantics, i.e. int/int and long/long returns a float),
-"warn" (old division semantics with a warning for int/int and
-long/long), or "warnall" (old division semantics with a warning for
-all use of the division operator). For a use of "warnall", see the
-Tools/scripts/fixdiv.py script.
-.TP
.B \-s
Don't add user site directory to sys.path.
.TP
@@ -184,7 +156,9 @@ Disable the import of the module
.I site
and the site-dependent manipulations of
.I sys.path
-that it entails.
+that it entails. Also disable these manipulations if
+.I site
+is explicitly imported later.
.TP
.B \-u
Force the binary I/O layers of stdin, stdout and stderr to be unbuffered.
@@ -283,9 +257,9 @@ executes a
from that file;
when called with
.B \-c
-.I command,
+.IR command ,
it executes the Python statement(s) given as
-.I command.
+.IR command .
Here
.I command
may contain multiple statements separated by newlines.
@@ -295,7 +269,7 @@ executed.
.PP
If available, the script name and additional arguments thereafter are
passed to the script in the Python variable
-.I sys.argv ,
+.IR sys.argv ,
which is a list of strings (you must first
.I import sys
to be able to access it).
@@ -309,14 +283,14 @@ contains the string
.I '-c'.
Note that options interpreted by the Python interpreter itself
are not placed in
-.I sys.argv.
+.IR sys.argv .
.PP
In interactive mode, the primary prompt is `>>>'; the second prompt
(which appears when a command is not complete) is `...'.
The prompts can be changed by assignment to
.I sys.ps1
or
-.I sys.ps2.
+.IR sys.ps2 .
The interpreter quits when it reads an EOF at a prompt.
When an unhandled exception occurs, a stack trace is printed and
control returns to the primary prompt; in non-interactive mode, the
@@ -372,7 +346,7 @@ If a script argument is given, the directory containing the script is
inserted in the path in front of $PYTHONPATH.
The search path can be manipulated from within a Python program as the
variable
-.I sys.path .
+.IR sys.path .
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
@@ -429,9 +403,8 @@ specifying \fB\-v\fP multiple times.
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
-If this variable is set to "random", the effect is the same as specifying
-the \fB-R\fP option: a random value is used to seed the hashes of str,
-bytes and datetime objects.
+If this variable is set to "random", a random value is used to seed the hashes
+of str, bytes and datetime objects.
If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
generating the hash() of the types covered by the hash randomization. Its
@@ -440,8 +413,7 @@ interpreter itself, or to allow a cluster of python processes to share hash
values.
The integer must be a decimal number in the range [0,4294967295]. Specifying
-the value 0 will lead to the same hash values as when hash randomization is
-disabled.
+the value 0 will disable hash randomization.
.SH AUTHOR
The Python Software Foundation: http://www.python.org/psf
.SH INTERNET RESOURCES
diff --git a/Misc/svnmap.txt b/Misc/svnmap.txt
new file mode 100644
index 0000000..142be7f
--- /dev/null
+++ b/Misc/svnmap.txt
@@ -0,0 +1,72546 @@
+2161 3cd033e6b530f6a78b3b14fedbd2074896dbf6de legacy-trunk
+2162 4db9d46b306a9c6ec2d1fe7a7cc36ef7173426a6 legacy-trunk
+2163 4a3a648185ef8965c342860bd8457ed6c03c6de0 legacy-trunk
+2164 8da9225cc60e2da1665a80af90184db0fdda05ce legacy-trunk
+2165 17e490b4dc28b8ac605fa19e482cf722fe80658d legacy-trunk
+2166 5570dbb1ce558b55716eab7d080a1afad2e77e2f legacy-trunk
+2167 fc6fcd7df4f7f2e1c12f17af2464c497d6f6a3e9 legacy-trunk
+2168 34d667dc1a4c4abdcb19cddfd2e9bfda01139ed2 legacy-trunk
+2169 6fc146bd4f03c97d14c7c300b1212a11eb9b672a legacy-trunk
+2170 33701db4ea559100d37be44d2f0d53e568a0ec33 legacy-trunk
+2171 a71e896ed0473421d88fe455269c5a5e54732a22 legacy-trunk
+2172 bcea6c822906c84ededabcc03ec481595def0a63 legacy-trunk
+2173 36a220d3731a03345785593ec32ebc35a29494de legacy-trunk
+2174 06bf2af00e3a9eb51529b618cbdc0bbcf1a4e964 legacy-trunk
+2175 874c8fd565fa09461c21399af9ede1234ea10f70 legacy-trunk
+2176 e9e05fbba7a40034f8211c9d1d12b28879f51fcf legacy-trunk
+2177 0808e5ab743abb8b057a55f7651ac118c83f5b0c legacy-trunk
+2178 a5f01a9174092d29eba6377c2369187cdb3fd7d5 legacy-trunk
+2179 e9bbe4ac32389e8a7a6c0b4aefaf4ead3088f21a legacy-trunk
+2180 71ac0e37236a54e0a6788b384655d8d8209d858a legacy-trunk
+2181 118545312f3bfe103bccfb103f4df2eeb0d0eb83 legacy-trunk
+2182 961696ef3ab7e43c99f5c760f7c621b6a119dc98 legacy-trunk
+2183 2d3eb717a00d103d437594e08193dae600061da9 legacy-trunk
+2184 08562de0166800e1c6d5d515f74369b399fd8caa legacy-trunk
+2185 64a69d6121e0d2062f26a7eca67e9b6a42dca27b legacy-trunk
+2186 32639878d16b604875388e2299611bbfc5189626 legacy-trunk
+2187 45aeb2eead79ee7fa36e4166deb75386c13e341d legacy-trunk
+2188 82c7bab78bb10a706f5d520b1550e724b94aa38c legacy-trunk
+2189 e5c50c688117c6e5bd895460dace6c9cbf581afd legacy-trunk
+2190 342a7c61c0c3c0fe4814d1ad24e77142773815b1 legacy-trunk
+2191 86e0e2350ba11747c4e0fdce97bc7c9bc648741b legacy-trunk
+2192 c487dfc3066339850854fb858c6a833059a9bc78 legacy-trunk
+2193 b643eade654459f87d572d6b793896d9b3adf840 legacy-trunk
+2194 b807c90c4a6822d1cb8b396991caa8085bb32b4e legacy-trunk
+2195 1d22900f77b853bee06dd24a1bf1fdf4515b48bc legacy-trunk
+2196 da06a282b8804fa47ff4c3c4bd92ba9fb8eea929 legacy-trunk
+2197 a2240ce91e52061b432f97957f92bf79785340ac legacy-trunk
+2198 c795fdaced9b8a28d9833277868b1f7461a095f5 legacy-trunk
+2199 10e1821c345ca2d137535a6c1cf5eb01286fcd7e legacy-trunk
+2200 1905f821397b0f0941011608e5b46dd1c9e389e4 legacy-trunk
+2201 f28ac7f621c76079774c30017b29013965d10409 legacy-trunk
+2202 e80efeab49b32c15ac97b24d4f6e8fdd5ccf0a95 legacy-trunk
+2203 4835c2d38b84e5fb558036d47c5871dd966338b7 legacy-trunk
+2204 ea21982a1532425f82ec5a4346cb841917a71d95 legacy-trunk
+2205 4d3a28dffc9b95d38b912cb695742de40d957635 legacy-trunk
+2206 7fecabb327914504544617e5bacd1c05a12e869f legacy-trunk
+2207 ce6f24711504e5956d660099c99eccb951c0c149 legacy-trunk
+2208 05057e3660f82ce8e83e8c2d73d0b58494f2bea7 legacy-trunk
+2209 b0e76221e7ffdbcfe98a44adfae9c235093c7ceb legacy-trunk
+2210 c3fa2d1f30358699ee24e2a5c3c011662f75c376 legacy-trunk
+2211 b94822f54991304b58adbbea23869c98b2f6f3fe legacy-trunk
+2212 ebcb626cfddfb9f1c7b18678acbec44eb97abbd7 legacy-trunk
+2213 1b31077ac64307ab54552651aec67878d80d0bd7 legacy-trunk
+2214 a1e50a8f42e23cfab64be3e99d8a5335ea33a9c5 legacy-trunk
+2215 402f5708b107b05f811e5f8542842e71798da6c9 legacy-trunk
+2216 7a01dbcee9bc0312f5a317fb24299751e78dddc2 legacy-trunk
+2217 a7e8fb7bb6a28eb13c056f3c62a96caac5f644d4 legacy-trunk
+2218 a1c2b4fad136cfb1b223150a48c3480d63e2decb legacy-trunk
+2219 4975f7990b2b35c70d23505ecea5c20eefcd1ed8 legacy-trunk
+2220 433f52d1d958776703a73e80e556beeb0e47f543 legacy-trunk
+2221 4f593b38d0615579acad4c3c9cb350eb600ddc4e legacy-trunk
+2222 5c4dd9348e8113320c4f7b4e9833f3205df18b80 legacy-trunk
+2223 fffd1286c88267934d7486e4c4e467d57b08659b legacy-trunk
+2224 61311506f2cd09badd8b79456af9789214ecb0f4 legacy-trunk
+2225 a22df52d7749a3a8c0770a8213de47b2ca58fecf legacy-trunk
+2226 a72c0a7dc993aae05e7085cd38678b9dbbeb1981 legacy-trunk
+2227 46cb14aec10a8d6e3665b7188070b67e899ad636 legacy-trunk
+2228 f98e41711d177900a96d5745ba90cc88bd82d7d8 legacy-trunk
+2229 36503736fdc2393406c0860c81a20222d73cee59 legacy-trunk
+2230 cccd534f228074f26748484221d69f2ee752f2b3 legacy-trunk
+2231 a36c348a8e1a2915d69b7dd202163fdb7e596c88 legacy-trunk
+2232 ac4522e99ca94377a65c66cfdc26684fa0fdfbeb legacy-trunk
+2233 5e8a0b40a4bdf1e83c5d0bf38efc7745b06ef8d4 legacy-trunk
+2234 3028acaa56b05ed0e11e156e81b5a0671915cb86 legacy-trunk
+2235 bc244df202516b5a55513e463b2f637d18f58055 legacy-trunk
+2236 85eed060a46ce26649fd6802cfbd5eec61910688 legacy-trunk
+2237 ede86799705ba14bc40213571dfe2a1d5f56e907 legacy-trunk
+2238 f72e0c62369e24ccc0ecdab792c97a21b2332bad legacy-trunk
+2239 b1fb4e1f6e516d280c55501b2344498ca627febc legacy-trunk
+2240 6c43e5476de690412699b3bde6b507b1c48804a6 legacy-trunk
+2241 f47101dc3c188f24f9b9705db3b64891914bdb82 legacy-trunk
+2242 de34f4a4d353b9f5f991aaca98c83faac681c6f5 legacy-trunk
+2243 554ac659b2cb9524ef4f96ec2756dc4ca0fa0f9b legacy-trunk
+2244 f6bcf3c1d714e7875356ca12c32ee5f975f4ed8a legacy-trunk
+2245 a79cbb2655baaf54addc2203350036479bdcb7e3 legacy-trunk
+2246 06c92f491f588ed9abe0f2d4f1512069a30c1901 legacy-trunk
+2247 a6934380c6e79b87f7762b1d9433d0e0a8937452 legacy-trunk
+2248 ef2440f24f102c677a02d407988dd85f5da50cab legacy-trunk
+2249 16e8c5d164935f3c6a989eeeadf22b0ab4dc22ea legacy-trunk
+2250 5847df13991de6a836484107553f4e9cecca8a14 legacy-trunk
+2251 5cb843bc87fc086546fabf6b8ec03eed31e20a8f legacy-trunk
+2252 5c357d37b32731c8d02045497020858c79c57139 legacy-trunk
+2253 002066a839c51cc184a0c6e669ec9d63420cda67 legacy-trunk
+2254 9e051fc7073e77b9e15034a19e547efe2b85c66a legacy-trunk
+2255 dac8625c8d9b014179cd583358b4d0e4e2502567 legacy-trunk
+2256 a5bf7d5959ce050f2b051c12e8180895e7e6d8a9 legacy-trunk
+2257 27a5b08c3e742c62a15b68156fe0d488c094ad42 legacy-trunk
+2258 6b75f2a3000d4065146b2dafe6d83d33071e8d35 legacy-trunk
+2259 455d65a11b13ed37792e1f4ffbfe3bcdfaa783ee legacy-trunk
+2260 e0c8efee76bd815784c813c66a2a1046e5a0bf5a legacy-trunk
+2261 ad14aa8a2984432384f7af21d452be5aaba6f18f legacy-trunk
+2262 08e55db6f796a276ecd1c1683a502bafd7247872 legacy-trunk
+2263 f2cacb90c917c8d2927994cc24312a621db13f83 legacy-trunk
+2264 1229ba124e0ba8ece922ce14c0f4aabdbde1d3f0 legacy-trunk
+2265 4ec8c263ab48b49d7727011c4a86c7b109b0fa58 legacy-trunk
+2266 b4d5fdcbf83c68f913af4c175a143c8abf775fef legacy-trunk
+2267 64373c79c099990cb69262d183a45e4dbff42842 legacy-trunk
+2268 1e007dccb2709b0811e53bf07c7b879791ac9774 legacy-trunk
+2269 ae9b366c575d557e6f806f0d16e5478571754c1b legacy-trunk
+2270 f694036b8561eb1b3cb59ef3680d7e96ddfd71a0 legacy-trunk
+2271 e4b1d9e6980a438f902eef900368c2e6a2d50a64 legacy-trunk
+2272 d08f752b56c06146d5bacfb2ef76c1036a3cdc49 legacy-trunk
+2273 d8a1b6456212b28b61264db02d65b2c5f6de72c8 legacy-trunk
+2274 d16961167365ffff817bb8e68a2111fe53a6cc58 legacy-trunk
+2275 1efb8ed6afd33a006c5299d3a415ace12c986a89 legacy-trunk
+2276 4094b46f04c8eaf325b3d599e732a5bf9a8c3a7b legacy-trunk
+2277 0a02ca9dcd6e022f10a1cc5537c78aa71324a323 legacy-trunk
+2278 78733c1c6e36187af57f4ea25170ad07d0810bb8 legacy-trunk
+2279 a809013c2af1ef3fd69ff51b49c2563af7c32705 legacy-trunk
+2280 9fee1ca6c8fed15770cf06f41875dffae9aed42a legacy-trunk
+2281 c9a5fe1660f51985e269be4929464e5c4ea2e5ad legacy-trunk
+2282 0c25faf4a6a445085c4b7a985b7a4300c939cf71 legacy-trunk
+2283 b3803fd3cb2c8d9093136f5a1d2ec50f981b4312 legacy-trunk
+2284 22727b43781e7c53dbdcf52f38abfd09d6d0814f legacy-trunk
+2285 a8d033c6fb54a3eea80de0a2952cf5a980b3f847 legacy-trunk
+2286 f71d6a096b0218a26727bda0d4d3d5acbf3523db legacy-trunk
+2287 27cc0d8237663b75da3871546b203f5685a47a45 legacy-trunk
+2288 d214b5d21df8c5aceceee56be14818445f809833 legacy-trunk
+2289 3bed76cdac0c4655cf8025ba61221f3eccd7b69f legacy-trunk
+2290 efd900497f4f87d717d137db58af995d6a03b14b legacy-trunk
+2291 8f214d617acab80f1667c102b6fe85f680bce0db legacy-trunk
+2292 ad4c5a5ef0ffeee9b9aa885a416e09fa449251b0 legacy-trunk
+2293 65edde022d71ee383b0a546c7297c93898a6e1b1 legacy-trunk
+2294 06889685eb6201d24e913b4c054c1f2274d4d35d legacy-trunk
+2295 5d5c9b2da5622182cafcf1777b8aa76c70ab7620 legacy-trunk
+2296 26ccbc3e41c461ad79a42e201339cb9f9a2d89c7 legacy-trunk
+2297 6523bd2954f0436fb8f6cb4aaafa300507e3ab27 legacy-trunk
+2298 82ef94b8b902e3494b38601d1844bb959de31677 legacy-trunk
+2299 bb24948957e3ca96876e902edb290ab464ba6b6e legacy-trunk
+2300 c294a8caebb9bb3ee9f892a372d6457507046f53 legacy-trunk
+2301 3b8023b0bb48b1066d4a33407317304d3729e391 legacy-trunk
+2302 bf5a8539d8ba7f74f03422c5b4f669070fb96521 legacy-trunk
+2303 c7ea60491e681e9b91f76a012c4dc944b5fff2d8 legacy-trunk
+2304 1870d82de0699afba89a19466b2f9c3651b4cc9a legacy-trunk
+2305 c70eefe480290a1d80d987a2ff599a0eacbeb990 legacy-trunk
+2306 853b736a6a9ee38e3301d430c152ae758e161a40 legacy-trunk
+2307 0f598993d9986f4ae4e6dd9a3491d509b3098e83 legacy-trunk
+2308 3499ad87839af7a1a4f71c15f89d20ab84c78e71 legacy-trunk
+2309 a0c5f2af2e0cad5c4d4de4a893ca5a5fe7ce7d41 legacy-trunk
+2310 61c5260c364f260e4c9c9c59d7f9d2a7d4436a1c legacy-trunk
+2311 c65eba8194c7b403b9e72eaac450e2dadaf20377 legacy-trunk
+2312 9d4c7de0def4fe67ef5ad58244c7699b5188ba1d legacy-trunk
+2313 1d4094c7d58b8c730f034b1b31365185629da563 legacy-trunk
+2314 e5764a0d2d3299da6614eef1922c7f4177665fce legacy-trunk
+2315 f2efceaf73cc9d999b8df53bff7cd218a2e63243 legacy-trunk
+2316 896c825f2f71bdd2ac0df12b5c6ff179e06cda25 legacy-trunk
+2317 43cabac5023d2ac27f5c9a3c835f1ac668c43683 legacy-trunk
+2318 47cc0ce7999c787f6e94bd3a03e19c09022248fe legacy-trunk
+2319 c8659f8a5f63784c5afe400dc17b5fc192d00195 legacy-trunk
+2320 41f3c66b10fd0a65cabc48bfa1c6aeb320d41355 legacy-trunk
+2321 afa48a96a4443cb5857138799e1d09c5dc4bad68 legacy-trunk
+2322 25a7fb44e2978449812354cb07a2b862af32cee2 legacy-trunk
+2323 761869766e4528e68f1d114606ebc91eec8a4efa legacy-trunk
+2324 ef9b4be5a3fea1029b31b51542469de0b268df0b legacy-trunk
+2325 7ce91cfb7ac4512d490773d81749375a8bc32982 legacy-trunk
+2326 a4547af296711baa743772292c74184c9d2785c9 legacy-trunk
+2327 28923e44254ceb767897f45ddede5e229ef54ed3 legacy-trunk
+2328 3fa2b14be2709119079f7a6c630e5b135d5de905 legacy-trunk
+2329 6585aabe1968ba5618f18ea0c9da1c9788b3489f legacy-trunk
+2330 1ed7f6f6598371ebd2350e1681081b267ac301e6 legacy-trunk
+2331 ee0a32fd45678495ac0233caaf6eecd0c884e98b legacy-trunk
+2332 0cee01b68d9c824d33322e36024a02f4a75e7e10 legacy-trunk
+2333 5cf3c36d02ea4cab231c2997eab28fe2c726b11f legacy-trunk
+2334 4656452436e19c412e8808834e3185a9650095e4 legacy-trunk
+2335 20fee4e2eecdc95ee00b2ea3cd2b2ee95b5e5b4d legacy-trunk
+2336 06cc3b00671c3e22157e27e8a7f6e8682a76a849 legacy-trunk
+2337 229168a2fe286a8b25d83d80563d75f460a259a0 legacy-trunk
+2338 bd49ca6c4add243c88a0942abf5f13cef10fc3d1 legacy-trunk
+2339 fb6367d5ff4649054e87797f41223489305913a4 legacy-trunk
+2340 0c355e9ee85458a1d1aee8badeadb82f5abadb4f legacy-trunk
+2341 a405a31242e7c4b4d2ed0e46be5f4f90a3d738ca legacy-trunk
+2342 a823602c22741d5ab9c478c6f5bd1917c20415ec legacy-trunk
+2343 59ffb6d4b34c7673ca74afda82aea63fd4bced74 legacy-trunk
+2344 c9168afe23ddf69cdf5f016c731ed3c4cabcf014 legacy-trunk
+2345 1b08df41587b855f4c625b923bbffd462754b594 legacy-trunk
+2346 33466268b6371ea5e93c931d0ce33540d5ae2e8d legacy-trunk
+2347 89115e7534d580e0b8d2581c8c24d00791db1a8d legacy-trunk
+2348 f47d5e9ea264ef93d35fd9b41948cd142ba70d47 legacy-trunk
+2349 d81818e62671a63e5553c998cc61bdfb3591346a legacy-trunk
+2350 ff0dae1f4db625bf131beb7b6cf73f13ae57c5fa legacy-trunk
+2351 b50fa6d58786ddbd473decd95e605b89e04bc48c legacy-trunk
+2352 5ffd371b7841de650c2bfac127f040b9fb782a97 legacy-trunk
+2353 32ae4a1aab689aef8ee090c4c18916da78e22fdb legacy-trunk
+2354 57f3ffc7b1c405425199eb7fc2d834d385782e3d legacy-trunk
+2355 145f9e14595f4bc62b1e74207c6d59636a7e97e1 legacy-trunk
+2356 45f43f755e5c53bb4fecc858a755423d82e58f89 legacy-trunk
+2357 48fc0b8f33d909b443fd80b833ea5fb4c553ea50 legacy-trunk
+2358 423be876dcce622570c57931994966812d114831 legacy-trunk
+2359 646316c99507888ce9226fe7e6797fe768fe53f0 legacy-trunk
+2360 0a3e33cfd4a9333e9d06d47463aedfba06740e9a legacy-trunk
+2361 9d01965f4f48afd58e9f2c98ec355fde6b8569cd legacy-trunk
+2362 310f8c9240732e0a7364713346439c6f51c297ef legacy-trunk
+2363 bfffc7e0fcc3e190a1355288e8ad71ab13a6c98f legacy-trunk
+2364 ceb36ec6198df399c199d7d018ebd164ba6f6787 legacy-trunk
+2365 3d7da6174e2e5853fc52ecc8dfb5a890d5547dc2 legacy-trunk
+2366 8ffda846d7889fd973ca900524e4c91713135aec legacy-trunk
+2367 3cc54972ab52306af59927d5ba07022bb65d04a5 legacy-trunk
+2368 9ab329697dda547509888524530e0280c54200ff legacy-trunk
+2369 f352ea4dff708b1a72a95c45ed99a8489186fa11 legacy-trunk
+2370 e486c849c50c256ebc6f0903a969ea036d4389c4 legacy-trunk
+2371 91a2f4745852184405f62e13dc9e92c507dc8e96 legacy-trunk
+2372 83f0a724a87c01630a396ba56a3aba9bdbaef46e legacy-trunk
+2373 a793c9e880c7f9359f0633807d7d62d5ac07240f legacy-trunk
+2374 66b55766ba658a56b1ec41de9c2b162b8a8b1b16 legacy-trunk
+2375 ed0311b8e741918079c7f526acf281777616b55e legacy-trunk
+2376 f61e7368def2e9e5f558687c9ac15fa34f00d1f2 legacy-trunk
+2377 1754b8024b55d0c37ffe6c1af3eb01b371d6aeda legacy-trunk
+2378 1958723bfe024d6eb4a4b0c66f29c58d2b26abaf legacy-trunk
+2379 3429c945d817dbd1ec415ac9536d2d214aba8258 legacy-trunk
+2380 a1097cd03348ee81b61c06048ccba6d9c258cb6c legacy-trunk
+2381 1eff6111582e48e0090688f475d16dbdd8f227dd legacy-trunk
+2382 edda9aad3e8f17e2d8fbcc327f17fb6c0efc767b legacy-trunk
+2383 2898d78fa32de7e06b0dc1b4e2ba8b3388d56d5d legacy-trunk
+2384 6693c5d87f3a049d9080ae6c904ed9a2346913b0 legacy-trunk
+2385 e71b6fec86e598fd3026f7ed6308fa3730e6a5ee legacy-trunk
+2386 7819e1615320b4206232edc37eb862bc6f873b62 legacy-trunk
+2387 7e83115edb6ae6d3264ec33c89432b3eda2f0001 legacy-trunk
+2388 7ec6058b539b7ed9fa0cf6be37edcd16fc16868b legacy-trunk
+2389 634c1d3c7d3923f04ca534aa8ff07439929611c8 legacy-trunk
+2390 08597e2b63d3f943cfde6d274344675c727c3e04 legacy-trunk
+2391 7ba9612058a469b34939f48807bd6e2c24ee0f62 legacy-trunk
+2392 b31abf420e61a7a0a5aab4a7129baa158c9eef04 legacy-trunk
+2393 af2e6400769817b38efb7ed505aca6c81c5889dc legacy-trunk
+2394 8f62a5457319e267f44b6be51ef3be1d80a8ef3f legacy-trunk
+2395 914c83cfa5e105c791247c3a8dfbd0816cf44997 legacy-trunk
+2396 9770112e660a903f5eac6578a8d558814f748b22 legacy-trunk
+2397 0a92b6a1b9c0abe877b61a4e3b458e1feb7b68ae legacy-trunk
+2398 16f467717d7ab7035a115aa9d512eb59c70f9bcc legacy-trunk
+2399 fd816ed17e35f1710e8b96b3cc9fb7e091d55e19 legacy-trunk
+2400 fda973f2a512b9a5625755ce701f63aeb7ded2b7 legacy-trunk
+2401 0aad3a7b97ef3529131711fc81abd37794afbe52 legacy-trunk
+2402 41e057870a5354ef5b52956b89892f44a3bf7d75 legacy-trunk
+2403 316a0d9c00969ed066b025c054fdb0d1c44d68d4 legacy-trunk
+2404 5f7c24b3953be7443ed6f1e379b30b53bbd0ae77 legacy-trunk
+2405 47eb81da46dc21677f18bc1f53baef20f44bf587 legacy-trunk
+2406 43133d885c4cc963211699ed28c967903e167a3f legacy-trunk
+2407 956fd5c3f04078017dbb25fb70b2ad1a8ea1b28b legacy-trunk
+2408 359bf109da0f7c6102c0dde90a599e8188eb1f4d legacy-trunk
+2409 9eb13c67ae6ff6bea92f826ce7af135ac0aeb9bb legacy-trunk
+2410 bab1f5494b8eddcdd1e79d71794c4f3e083c3268 legacy-trunk
+2411 b9986009d7dc4b7c289054a89a686cda2fa6ed77 legacy-trunk
+2412 48d58b74a3a47abcc616bcb6358b08d4252259a3 legacy-trunk
+2413 6811912f672d894339132b6b8fc86dcd590ca373 legacy-trunk
+2414 d4e532ee6f3d187c07ed57d44759b4040eccc237 legacy-trunk
+2415 71b0bd5ed16205b21d436a6cbfd4812f16c9f9ad legacy-trunk
+2416 8604f9029cda3d717bec641266ec704c8f369e20 legacy-trunk
+2417 3eab2cf5e4dd51cfcc449df6e4c098df9b0cf7d4 legacy-trunk
+2418 a46558ad0beda958ac5c1701156e46918c0c71d4 legacy-trunk
+2419 3b93bcea10f6df869183835e84cff5bfc587784a legacy-trunk
+2420 6321d3dc57e0c1890a6f622c51d39f40afaca64d legacy-trunk
+2421 26b2eed783814880741330d0d6c2d1b8be114e04 legacy-trunk
+2422 f4a944e9835fa932f142685a7e244f6d29947114 legacy-trunk
+2423 6acd41a45d8da8bb0f3a56fbde0f8c66826d03d9 legacy-trunk
+2424 28f0ffd9facfb99ac5958c78e083ce2266380917 legacy-trunk
+2425 72d1b89be35ae22bb6aea53a37d384484633cf48 legacy-trunk
+2426 187ba1733b1781b4bf5d97a4d4fb33425550d890 legacy-trunk
+2427 b5826bf296776ea0f43a952104d11498ff24ad6e legacy-trunk
+2428 457661e47c7ba9b6dd92653f7b47d7acfa9423a5 legacy-trunk
+2429 0fe2471166f053bf7f6b1b0133d39d8c26efb23f legacy-trunk
+2430 745a46611957d6b24547678de3a1ee0f523ece65 legacy-trunk
+2431 aded208adf6c6285a83e8e43bc5929ed04e42c3c legacy-trunk
+2432 0bf02e1b7f51de6c650d18985652fedbca0e9a10 legacy-trunk
+2433 f0857ce7ed4fae40985e2dd0d216376ffff307c6 legacy-trunk
+2434 af1c8f5d0b37f931bd1761b893d77cf3a95e0569 legacy-trunk
+2435 12a64115a4eebda4b8ccf93f32216b2270784a96 legacy-trunk
+2436 80001c023b2b26fac98c2940f31a46cf2f54be98 legacy-trunk
+2437 1078cd273b4041b79f12fb419f85749b7df9bfbb legacy-trunk
+2438 53c8d762f3a83e203a5ea01213d115c553d3fb40 legacy-trunk
+2439 af9a8636e4a8778747141093415231472b7f9c4e legacy-trunk
+2440 9c924f9c3b16943287aa56bbd9efcf336a16546d legacy-trunk
+2441 702a139fa24b49a84a5301229f30c0e090a211af legacy-trunk
+2442 6dfc92630123470a0447cfad7bae79d900264212 legacy-trunk
+2443 d5c9ae422b410366d5d301774b62d77596bbb595 legacy-trunk
+2444 ed016255892933a9de2e1ccbdd633e7f42ee3112 legacy-trunk
+2445 6ac402023cac5ea9f375f4225d51e4d1f3966bd8 legacy-trunk
+2446 85bd7dac13f3aec8fcf241a844a647442d685365 legacy-trunk
+2447 3905da6c4a8bf1457abb0fddce18d2ea0394c6ef legacy-trunk
+2448 07efda2951a87f1f902205b0bd8e3190b39b7d06 legacy-trunk
+2449 9b43a983124c12c6628d234333d8177253b69e4e legacy-trunk
+2450 c4c278c56e90005313b251c59abae831730286b7 legacy-trunk
+2451 6637eee1c4f8422d763dce848b31ac80e2957c15 legacy-trunk
+2452 06774a94abb5bd73661f31611118e120be35f613 legacy-trunk
+2453 63085f7b3db5ad2bcab650531c27c8ea822ac4c3 legacy-trunk
+2454 f900b692b37e47018d55db3d97aef4cc6d3b0cc7 legacy-trunk
+2455 8938b3132caa9038a06bf685b8328acf3a22ed5b legacy-trunk
+2456 d7a38dece86a8182a4ed32445313bb3e39405c2b legacy-trunk
+2457 7a35d985763b21f959e2d16c8aecbebb5ecd555c legacy-trunk
+2458 abccb0f9f7359bc29b6bddb29cdcd02b37f1eb70 legacy-trunk
+2459 7f8756fd64220e3d10665125d6ef2e29b8a50e58 legacy-trunk
+2460 f7090f5814c2276198917fd865be67155354f8c8 legacy-trunk
+2461 09fb79e7baf7ae7e10eadd1218a4498a691d0a66 legacy-trunk
+2462 c28fabe2116544587987d3c60f14306c7b9972ab legacy-trunk
+2463 d19a665904df5794837c51648797e8cabeaebc32 legacy-trunk
+2464 149dd121d0a6b4eb40340ca9f004012c7f3a7dfb legacy-trunk
+2465 3201b75695ef2883efd4864f47a0f3ac527a86db legacy-trunk
+2466 6b93d4ce8dcb98bf58a2d8e90b93713e1699a0de legacy-trunk
+2467 c8a979029df41d8ac123b23e51380b71ca425200 legacy-trunk
+2468 35a2528f8a73d86fd38e9bba03c17cacb3e07a34 legacy-trunk
+2469 abcd9159303577fbefbf464e31650ac0fea42315 legacy-trunk
+2470 382323f92fce5fd04ec506183f02f841fa0fde48 legacy-trunk
+2471 72a0268420d0674e2a8d0dd657a646ed704a8f41 legacy-trunk
+2472 605e172bbb557464287823e4e7d46f387fe20af1 legacy-trunk
+2473 ae89411f6fc0e06486a1012039becf59e5c5795e legacy-trunk
+2474 b8e4213f65a6e54db4e32e940c519e6cae616734 legacy-trunk
+2475 e83852d1a5e23d6d38d86a90d7739e45af2ac2fb legacy-trunk
+2476 aef7e0a9119e5d37ee82226a4452b228fc70a20f legacy-trunk
+2477 a9d467e8463194cd56c1b6f83780016f70ee10d9 legacy-trunk
+2478 325b40d77235562954d71fe1f59f91b78bf66703 legacy-trunk
+2479 12fdfa010e41eb955fd5c7ee4a276e6fddda468d legacy-trunk
+2480 a1775cc786e6ad9d1254a2b0a1b00cce4a5e7750 legacy-trunk
+2481 26426c42a162a449fe0287065657f5a69238e04e legacy-trunk
+2482 2a84b16f91b098831ba753b3e313d5f865a29d00 legacy-trunk
+2483 1a6cf1f8cceca04bdc2ea70cd23dbdb5d8615581 legacy-trunk
+2484 714c2390e5cb45e6c8334fc41cce9e2d6c124486 legacy-trunk
+2485 a81020d505bf9e8b6c9e0f7829ec11a1eeb33308 legacy-trunk
+2486 baada20762b08185d010e36c668183283d3cec0c legacy-trunk
+2487 ff0862e3d63a96778de280c96875aff1462797ee legacy-trunk
+2488 4b59e63a27b57c3172edd0e95c963135f989ace8 legacy-trunk
+2489 48bbc8ad8016a5b547416ee1bfcfbd05cd2f09f6 legacy-trunk
+2490 f21cb7b53f6cf8ac574959f2ee25e28c4f5fafaf legacy-trunk
+2491 1807d60e6231f7bab842a8b71850a0629d656601 legacy-trunk
+2492 21c266f7eca1d967abf83cc5fc403029e8f9c0ee legacy-trunk
+2493 be3052a77b7fd468954a07485317ade3d983b40e legacy-trunk
+2494 137a5e06fc84ce55cb430e8975d69b0795e4c75e legacy-trunk
+2495 449f5e5d9af62f23ee50952754f3fd91ede7d4f3 legacy-trunk
+2496 17a29760d062b013cdcb4be5760732a7c1c1c71b legacy-trunk
+2497 64189ba7e23bcac30bb0dbac17e41d4e0708b383 legacy-trunk
+2498 4266aef50c2b4cfb1c2f112557b6db042dbca7f0 legacy-trunk
+2499 794cfd455dc6f626bcdc5c8411640c9ef251cb2b legacy-trunk
+2500 08dc37a4dd323a2255b048685e95962704cbfc66 legacy-trunk
+2501 e3941efd73105c1218aa11c39444e058086480f6 legacy-trunk
+2502 90418fd437dbd36750835411e6c1a1a2d5f4b3b8 legacy-trunk
+2503 f3795ac146cefef0b6a55b13131f77f9c6ca97b5 legacy-trunk
+2504 36ace908289ba79d97b7060e85f05dbe9fdbe342 legacy-trunk
+2505 75b2fd163fd715a10033a60837667370b65015c8 legacy-trunk
+2506 2e0ea6d5c6cefa7acdce51ac53915957d3f67fb7 legacy-trunk
+2507 4817ae40a4e21dc08d7d6a54a5375d96eac5ee49 legacy-trunk
+2508 daabe232062e04c63edb54ab51772c44cde52c8d legacy-trunk
+2509 a295d9a3fe89233c2f553c7b3ddee1b272dd7f60 legacy-trunk
+2510 6e5cbd9cd5f95187ccbce50f715b6661d0da1475 legacy-trunk
+2511 3dfaa093d96e918c3e0e85ba950cb34db5cf8059 legacy-trunk
+2512 a3595ae4dc1e783fa499994ddacc993b63e74933 legacy-trunk
+2513 d93259cd379d666efd1234d59a0eb0d1374cc086 legacy-trunk
+2514 1c2cf2bdb6c8a0e55c2df051b2216b51de310530 legacy-trunk
+2515 60da7ee9100e649b402504c422f7c589800c4b59 legacy-trunk
+2516 8a94ccc4c91400b2e46223e9ac17806f1d8e1ad3 legacy-trunk
+2517 ab05efed03e90ff61cb62869c4228afd7a381ca7 legacy-trunk
+2518 23587bea11bb1a8f676f4987cd0f1390fcbfa16c legacy-trunk
+2519 a67ab5d581463c1fdf50951a070d6cca96052322 legacy-trunk
+2520 0696f198753f948e8a614d19f301ad648b9682c8 legacy-trunk
+2521 3b33ac44e36e3c65ce7269dc89c9efa2fd91a9bd legacy-trunk
+2522 c8584a1ba38a94744e611e4a12e1366d0c6948fe legacy-trunk
+2523 b29696e5c4d982d959a22feaca0457e5a047fae0 legacy-trunk
+2524 d70754a96310d62881a899b6563aab32e58d5508 legacy-trunk
+2525 0bf825f55ac15200b6021f8aa3b40d1f4cb2a989 legacy-trunk
+2526 4e3073bb0e3e0397bde9753e8832213c09ca0900 legacy-trunk
+2527 cfbac6ff73af3ca4349fe390ed5a0e0bd0ea8c26 legacy-trunk
+2528 a7d370f93f7526f3433b6b34ab54f2215185cdcb legacy-trunk
+2529 0927bdb816a043bcb4a11f14800ed179d86364d2 legacy-trunk
+2530 46a656123a6965560bf23223806932d537c3362d legacy-trunk
+2531 509bb74ac324129d3235321c9aa5de73998fb1e7 legacy-trunk
+2532 3972900e1b61b272d5f46bff202ff4bad5477ce7 legacy-trunk
+2533 16b18f586fecc41d15444bd4291463cb9a674f73 legacy-trunk
+2534 305e150baa538e5e7ddc0f51ce36d476092bf55c legacy-trunk
+2535 70a18a6689d4d9cd0de37ac2c6d47c85b623c7f1 legacy-trunk
+2536 86828cc1c6468d3ab0f08224a2726c6dc91395d1 legacy-trunk
+2537 5645942b7ae055c56bd1d63f309ae50326adc4b8 legacy-trunk
+2538 7aa4cd621f59264f2f9d301714033b77e671ca9f legacy-trunk
+2539 730757ccb8a36984f818a11886589c91a937cb3a legacy-trunk
+2540 73efe3ea4f1b8af7c2fbbe85e3e89bf8159f7234 legacy-trunk
+2541 ddab50285c479eaf84cf7d6b006cb6e70a607a87 legacy-trunk
+2542 4a96823f9b6849600c588ff38775f8682f962703 legacy-trunk
+2543 4dff23e7cf11417b50d7da7d711d847f3b805063 legacy-trunk
+2544 ba3c1f95e665e35567cbb1781df630fc736f4f29 legacy-trunk
+2545 a3d4d461d4421faeb34aca28fc6643760a941de5 legacy-trunk
+2546 039aee6cbd786abf512ccba2090bf490759811a3 legacy-trunk
+2547 0598f4f25d044d62ab3e723cc63206169bb57a36 legacy-trunk
+2548 f01aee6155b3a2ff2a3df993ae125760d782a8c2 legacy-trunk
+2549 31d509e94271059f12d63c7131c0d58026d8794e legacy-trunk
+2550 55bf66445c85c80f227ac49c31a3e88f9f805e97 legacy-trunk
+2551 172aa2c3e7340c1e7439f3b7e1ba0f3f0cca6f06 legacy-trunk
+2552 caf8466dcc9c3577c1eb6191467fe94f15b24257 legacy-trunk
+2553 f33a3f69dfcb59bd198640a624789e6217b16331 legacy-trunk
+2554 59609b3af978a397016cd35baea2d15e58c3fafa legacy-trunk
+2555 8154385248d81757de911897b27d8b3f1fa0db30 legacy-trunk
+2556 659b8dbf695c511a9955e9c77d42c5ffa9989fc7 legacy-trunk
+2557 c262f421a44c51c4fa897540d43954e1811a9937 legacy-trunk
+2558 4cdcc16bd0800fec0b2814e8c009dfdc0d5f2023 legacy-trunk
+2559 0ac1357cd8989e3b3654228e16677bda1662a399 legacy-trunk
+2560 1e4e6df0718e03836a5bb693ecf3805c42c07244 legacy-trunk
+2561 d189a2f681a6df3759a0a4026bd65ed7413220a0 legacy-trunk
+2562 0c5e4e137de6e0f368ab489e64461ef8b042cbf0 legacy-trunk
+2563 9bd2680d16bc36170f0f2c903f1fb87654107707 legacy-trunk
+2564 d7832af6aba634e5e33adb4815ed907f9b2880ce legacy-trunk
+2565 9cd38d1ac3919f36c0a263fcae487f3f0412ae9c legacy-trunk
+2566 d3d328680328de7f862c1123b623e8c4c775d367 legacy-trunk
+2567 e628d09ce22febddbc5fefaa22326202664ea71c legacy-trunk
+2568 9b3d557665a9180255b6f5773e0925f6fa802247 legacy-trunk
+2569 952133e89bc725ebfa49f38160963e05a22c74f4 legacy-trunk
+2570 b5fe6482072fefa4cb43b72b12cff5e2f6d3e624 legacy-trunk
+2571 fd061dae9e570d8fa8038cece70bacef5e1ff67b legacy-trunk
+2572 0f353afc2870d68447729da0742d4411c5bbed27 legacy-trunk
+2573 4ef31f5d3d927b4b72bf13101f3864eaf6322691 legacy-trunk
+2574 2aff37b9e20eca097d8c9ac90fc6cbfd4430c68f legacy-trunk
+2575 4c45bcbe3bb3bbf712f2aeb953b45e45d3f398ff legacy-trunk
+2576 4f157b324c505b062cf52a296a4af4d2a94356cb legacy-trunk
+2577 2b034c90b6d9a678ddc479939c41a118fc60ac5e legacy-trunk
+2578 163e29060f0bf32f119b7d12128e174199d4148c legacy-trunk
+2579 70323cba3c1369da24c0309fd06c33f993523d79 legacy-trunk
+2580 5a9aa2aba08e96d000e8c3ffd81a43f9c0059185 legacy-trunk
+2581 394301340693372bb8c0fe3927070b21300142ae legacy-trunk
+2582 55ee75f2fea4acdad64ee36e2c4cfeaeb5bbb35d legacy-trunk
+2583 ea5cf09bbf36b467cb78f7cb3764722e050b45ac legacy-trunk
+2584 c8d0a4a41f0ba7ce82fd7bce759af1183c4c1b82 legacy-trunk
+2585 2dceca9a0713933c361e41c6b3d20eacc5c44975 legacy-trunk
+2586 d1ee0fb0c0df565a24055137e3ec660f3dc073c2 legacy-trunk
+2587 61bbc7230c7166e565ed0abfa35530efe344c2df legacy-trunk
+2588 a3a842b399132ec80ede58942ff19b4b71a7aac4 legacy-trunk
+2589 3c7b7caa9da566aace610d11effdfe87a4190979 legacy-trunk
+2590 bb308e7b00394fbc9c7e4455aece4ca50139838d legacy-trunk
+2591 0f9ebc63dcb56389af1b1bfd713eb10b9976dcb0 legacy-trunk
+2592 08b1a89c8f063534c793975741437941e73afe52 legacy-trunk
+2593 7940bb391a6acb2f9f5e036e1f0e52d7e94df7ad legacy-trunk
+2594 8beddc17039668b3480695bb3c8d2b95bf54f735 legacy-trunk
+2595 487b7c62ae774a385133db01156d2717b56de055 legacy-trunk
+2596 2de34b9602e0ef65e48d14e39ed60f1755284056 legacy-trunk
+2597 1e6c8f2aa136daa2754761393e0c9223d0fffae5 legacy-trunk
+2598 402a59ad2493f0b97f32c6feb189a55ee1a5a332 legacy-trunk
+2599 64bc8a284fb3fcfd36a18bcd2fe6b5270f4df1f3 legacy-trunk
+2600 c12d033f6594e6649ffc24b81e07e0ba016997b9 legacy-trunk
+2601 e2db3341d6860ee676b5bd826850ce62647bdee3 legacy-trunk
+2602 600bfa9fb8b76e5a9a475021bdff3703a524393d legacy-trunk
+2603 17f4cdf28959f60a24494ef6f1e4105fb498090a legacy-trunk
+2604 9f85beb1f7c849fe016972d880c8a0ba23cbfc1c legacy-trunk
+2605 1f64f55a52e865aa7aa967b919fa40ba774e42c8 legacy-trunk
+2606 c0683d6676c66bc54ba96efc0197998f8f037ddc legacy-trunk
+2607 c307d10b680c6a398ca156f7c0cd406c22e2ea1f legacy-trunk
+2608 8f6389dbc1cf7b4fa7182799034acc8c8ff08c88 legacy-trunk
+2609 326b89ea67138bac4531c5980622f85e922bf754 legacy-trunk
+2610 a4fea69120d8147731b269492110e76fa50f2239 legacy-trunk
+2611 23497db6687aa1dace196dc61642d031d87ac9d3 legacy-trunk
+2612 b2dce01c366e6ae54561a7a8e86526d71646873a legacy-trunk
+2613 ae1a555e65fac64656bc02ea5ddaacbb370e046c legacy-trunk
+2614 34abca182f18e1b6169eae082c31a3281e881a45 legacy-trunk
+2615 a5f0b8390c879681dbb28494cbdeb8ce1fbd8f88 legacy-trunk
+2616 464d9d93f34e91a228ff65daf440d9ea8ccc7284 legacy-trunk
+2617 92718e4f5adc1b284c768ede2eac70bd84e2b4e0 legacy-trunk
+2618 e8667a7d318ddee085d8e24e8d706e46a8aba331 legacy-trunk
+2619 1fd4712cc66f7b6ac598045c8005f05917865441 legacy-trunk
+2620 0736aefafc6018c164ff80d8e3c284b8b951655e legacy-trunk
+2621 7a60faa3811351ba0b46da90e6e939471866cb2d legacy-trunk
+2622 769cfff4ae5e95041ac396466c05d11de63259e6 legacy-trunk
+2623 678a734c244dc90cd8315ee3b7423c0bf4bc3468 legacy-trunk
+2624 c97f4c6ba6c65ecc63f335bf70acf4126172ad27 legacy-trunk
+2625 90300ca21200592066ba78e27e941b2ac6732a3c legacy-trunk
+2626 ca0391a812f86358929548c75abac9f207b8e56f legacy-trunk
+2627 90cbcb0b97dc7d498443524c522b91193ce950d3 legacy-trunk
+2628 1cb78b625b0723cb49552dd6ac7809ce5a4ba4fa legacy-trunk
+2629 10e3d260413109a9abd37eb4576e0e52f252dd2c legacy-trunk
+2630 42130e7220affb94d0c33f8fe677d782e802cbcc legacy-trunk
+2631 a1025cbba30dad17f995741aa8d5b45288d9cdd7 legacy-trunk
+2632 1be2087692a24446434731392e340ea62bfc863d legacy-trunk
+2633 1d4b0339b83da8e3bca044ee226df52dd41c9f7a legacy-trunk
+2634 4a7f0f06cd27c4b29f76663f067387b2b361f7f0 legacy-trunk
+2635 19365201dcfa85aeae3d9405964ebbdf829680aa legacy-trunk
+2636 e2c3463c4d91843038fa60ab772bf370ff3cb404 legacy-trunk
+2637 bec963f99bc9f591ad1c2e09ee62452eea9b9aa0 legacy-trunk
+2638 436c81030853386733f6b21a3dc497b9bfd94f2f legacy-trunk
+2639 c3bee5a5721f7ecd7dabd96d88df54f8a0c02546 legacy-trunk
+2640 32496a0d01f488a65e758eef45c3e5b302edb250 legacy-trunk
+2641 c64c6702549d6ba2cdb990895f4fffcc75fff403 legacy-trunk
+2642 dc0463453a64371baa0381b53c2fb38a8d661cf9 legacy-trunk
+2643 ee899a81570d0504ca80aa1dd82dd3435cded704 legacy-trunk
+2644 cfbc4cce1a42776298f6d602f457791d8398f5d9 legacy-trunk
+2645 db820da3ce03ed671f6acc2494202458c36f740c legacy-trunk
+2646 3b385bda38f89158a7f0e02a1949e5581a949915 legacy-trunk
+2647 c7a2f5613d66469196ba807d3b8422112c94e45b legacy-trunk
+2648 77b80a91d357c1d95d8e7cd4cbbe799e5deb777e legacy-trunk
+2649 90f35fcf8ea01d70829db56ebdacd2ad43f71400 legacy-trunk
+2650 a0fbc7b6a485f98c9071d287794f1d24f1e63dd7 legacy-trunk
+2651 023c7f69d24002c863937b843e77a43e6b4f02d7 legacy-trunk
+2652 b926580c9c2841863182a08c14790829d813dd91 legacy-trunk
+2653 92a10a1e1463007c035877891d9aaa260529d337 legacy-trunk
+2654 57667ab1e1941d01eebc4c6ebe6d77ae88ce13dd legacy-trunk
+2655 4c211e8286b5c6282ea4527d855cb2c62442499b legacy-trunk
+2656 0ac9d5db41c8ff1febb510bd343a053b4b34710f legacy-trunk
+2657 0ac392b7f76eabead8841717fed1350a503cac46 legacy-trunk
+2658 2ce6a2a318863dee3edbaf90639ba32c675dc66b legacy-trunk
+2659 56bb1067a8806ed2c913de946d6f5bd1b9a81826 legacy-trunk
+2660 80e2e5d67b496665309f1165ea14c8794dadd7b3 legacy-trunk
+2661 7f3faafd83ed3727529d71da83c040d956557c7c legacy-trunk
+2662 ddbcd532c114df75bf73e3073dea41658552a3c0 legacy-trunk
+2663 67f6f71943c16229da75a3676663d6062770686c legacy-trunk
+2664 e14d46440ea71399fff16f7c05d1ab794f8ace63 legacy-trunk
+2665 eb03977baeeb4cf3287afc7a276a8e92552f04be legacy-trunk
+2666 095d9cf4e3e6e24b180b0cc4ffe1c0c8690862fe legacy-trunk
+2667 9f7161db5669e91b568374fd6bd0445fa65471b7 legacy-trunk
+2668 fbff2e7cc49df887b49fd83e4551f4379e9ddda2 legacy-trunk
+2669 79ea13b7df2c162750a427a0b4ec73ae225eb7ce legacy-trunk
+2670 5b5f86ee4f79b7e5521d6e62d768b8070a31acb5 legacy-trunk
+2671 cbcdfda05bc4e22af56dfdf01eca7d7b8f36f3a4 legacy-trunk
+2672 766cc820f511e1019ab7a099a54beff7af9f3207 legacy-trunk
+2673 8414e1f9a5fe4ccb373e25d3183adebf92081ca1 legacy-trunk
+2674 9896dcf08e16fae09e61b54521cfb2e48457b8fe legacy-trunk
+2675 b46d76ebd9a72e5032f41577b2868e4b73d004c2 legacy-trunk
+2676 f8d53b6cd442e800e229ed1ff45930d97370019f legacy-trunk
+2677 69f89739938f9a608fdae6805454b403cd34ff8a legacy-trunk
+2678 43c223159b2827697c8089ade1c68dfe05cafaf6 legacy-trunk
+2679 df0343ac8a21ab158fa4b13996537eac060291dc legacy-trunk
+2680 048e1371c4506c1e3e2260b96235a595d80f0084 legacy-trunk
+2681 02de7a8ae26761cf5c67dcd2921c0ce2f66d4a22 legacy-trunk
+2682 2dcdb0023c320ee52ee7337c6992070a59f955bc legacy-trunk
+2683 be898cc158006a18478395243c35aeb553b10d54 legacy-trunk
+2684 d9b6b0369860c45c4aeeccc76c8906b29b1427b6 legacy-trunk
+2685 b3825ce83c87f2429dff845ec7435f4a76e87d0a legacy-trunk
+2686 742dc838038bfcacad7b03fc0a065db336202de5 legacy-trunk
+2687 2b0ad52ac39686c898499e30f99ea1fa35829673 legacy-trunk
+2688 4357ab68c7d5b6e9c0d6a16b78f5bf310da6a8e1 legacy-trunk
+2689 3d467108b0083c4c56bd5a4747baea7032125be5 legacy-trunk
+2690 1efdb15221ddd1e963570fb71f2818be0c4b6809 legacy-trunk
+2691 dc2ec49a2ad29b6d963013de52a1a835e0fc71f3 legacy-trunk
+2692 8331076cfe152dfcb9d1669f929d4791d5b93638 legacy-trunk
+2693 fee35078ef40a3d5b54fe08b33499725330eef98 legacy-trunk
+2694 8b4a274e546dcca8ca80bc1619121846eb609ee8 legacy-trunk
+2695 96b2128f00aedc24a244a6eae201aee488782412 legacy-trunk
+2696 2696b56ddac4952fcd3802d1e182433def1a635a legacy-trunk
+2697 255728a841def1b5e928e0ed61d64cca48617363 legacy-trunk
+2698 9019848824a10d6e1e18ea8bb676851082cb5963 legacy-trunk
+2699 9d0242b92ca5fb077cedcc00f1610aedef9cc025 legacy-trunk
+2700 ea5146866bcf179745427ed3fa9b99bb700df6f4 legacy-trunk
+2701 48eaf4fc53cb0d80132621a38615c61aeaf0eee1 legacy-trunk
+2702 5f590ab45295776b3c847eb2764be47619fd6945 legacy-trunk
+2703 b586189cc1f5e699db377d40a50c4d2d76944514 legacy-trunk
+2704 d5e1c499f0137df24917317f1eb6188c03da7318 legacy-trunk
+2705 d0baa83000056242ef225d8b104f16a626212ab5 legacy-trunk
+2706 9f06c6689f0d10a43725a45b55031c96abaaebc4 legacy-trunk
+2707 937cbc0be6ecedb5c0b927ba50384b00c95e5a84 legacy-trunk
+2708 e198cc98a4fd0e7e2f339a42e747ed202dc871d6 legacy-trunk
+2709 83046664160e99092d33265d81b6b8638bebd4a3 legacy-trunk
+2710 4efff6cea90f699d7f6510a2988e0b6b05edd619 legacy-trunk
+2711 766cec50d766d3f7b55d526fbd282effe6d4e22b legacy-trunk
+2712 5a61f827f47c3a39b4aeac5390163931aa8d4f86 legacy-trunk
+2713 c158c834765465b73735c374ea24ea46b31b492f legacy-trunk
+2714 264306b61b83fefcf034cd411ea736dbad10e069 legacy-trunk
+2715 2e287a1503b252646f4d80cf9b6c73cd5d6e9024 legacy-trunk
+2716 0780b95a660ec82098f3a854e262baca8ab591e6 legacy-trunk
+2717 adfa082f520a6166f6d35f7301c57018814a7602 legacy-trunk
+2718 1ef63adf4fc5ba6856474312e32e0c1c0eae62ba legacy-trunk
+2719 cfb53322c9d11432da52e3ff1961965db84bd43b legacy-trunk
+2720 683edb0c44634929839f63a5cdc3887b35b5909a legacy-trunk
+2721 0614d887d10abd02be14d89159d9a4d3e29796bf legacy-trunk
+2722 4434393b4ede65668658b46a6b5e5e234f81f324 legacy-trunk
+2723 17068a6a0aa517b6d03aee797564ae8a5550aee1 legacy-trunk
+2724 73e266bf7ac6b03b972b3b306c67ccffae40f5f3 legacy-trunk
+2725 f9c07ee793022f65c2bcbcb57c7211d32a6208e5 legacy-trunk
+2726 5faf93eb9256e336343ca2d2f69b24e4258fd4b2 legacy-trunk
+2727 5a1f9ade15124320a034920b3c51107aaca1819d legacy-trunk
+2728 8c179d023583cd861d711ff313694f1d1f5769b7 legacy-trunk
+2729 92509d304e479c60a7ab4355edf8edea5c7d8adb legacy-trunk
+2730 6c36c273d57d4d9e0221bdcdbed22832545e0fd0 legacy-trunk
+2731 34a761046dbd69f69dd3751f59d181eb11026a1c legacy-trunk
+2732 a5c245923b310d568a0afefa0e4f66c3112953fe legacy-trunk
+2733 086bdbb6973bf35b5c4ef983e0aae094d8c44ba6 legacy-trunk
+2734 4cb55356706f3bfb3e14ee5ff228295a76dfe562 legacy-trunk
+2735 03b9f152adb695325c593111a118336783c7f189 legacy-trunk
+2736 deae80e07a81c98e25b2c13f2c2afb68565e814f legacy-trunk
+2737 3b8f41f96eb4c9533367410acf32cd40f0269e1a legacy-trunk
+2738 2da934ef27c03813abd1afe08291cd87d14daf7a legacy-trunk
+2739 12ecea6e955c12b133f94e36f40a2425835a00c4 legacy-trunk
+2740 6884346c04a048b30f3c53365bcb7c4d8ac1732f legacy-trunk
+2741 3169d38f67742b9816062c9ad94b6959d8c8ceeb legacy-trunk
+2742 bae1494f2ec810230cb57452b060348cbef421a7 legacy-trunk
+2743 5f71f166079d401dfccf5b4cb513776266b682fc legacy-trunk
+2744 c72f26ac491ba8d8228eb8f6f57b816d35f7f19e legacy-trunk
+2745 37aa67f0867c10f4637c7e00f44ceb34f2aaa4cc legacy-trunk
+2746 37905fe1892a27dd8b7c435f444447f43a02c435 legacy-trunk
+2747 dbf40891820161eb5e47d05bde9bff636bd0940f legacy-trunk
+2748 d1547d6bb5b5cf611f8f77325e2940c222cdbda0 legacy-trunk
+2749 7d24de643fb50caab3d24059952eac2b7636e1f5 legacy-trunk
+2750 6077704dab7a3f79b7164e4d1812b654cdda31a8 legacy-trunk
+2751 f11fae8ee1e429d836bf2794437bac321c511e0a legacy-trunk
+2752 9276b3ee39367c61d21bd142cd97bdd2fdbb73f9 legacy-trunk
+2753 9572a7d09dff462ebead49c104231a3a4eec32d2 legacy-trunk
+2754 0868176365d7fac18d9e6e44778b3948e70475d1 legacy-trunk
+2755 47c42ea67a8bd853144d99d0ba8ce761c563e673 legacy-trunk
+2756 f9cdeebfcb670c3068855879f49709829d9d8472 legacy-trunk
+2757 e18f1fa398a30b3e25cafe3c6879080e2b1d7f5a legacy-trunk
+2758 800cf4086fb33d80cb3b677149bf15b6f0322e59 legacy-trunk
+2759 b204f31fbc97e60dd17437b2480d9e68ee2a9517 legacy-trunk
+2760 a347933a6d922f605f502e8cd2af28eb3fd95de3 legacy-trunk
+2761 d49b6a6725bd87f5219a73d1f07155341c44e7a3 legacy-trunk
+2762 8cdd62bb515cbaa0c178f7618a62c96af6deab83 legacy-trunk
+2763 5a35195398ef53fbdd57d6d6bc8841d8d2e46009 legacy-trunk
+2764 34d67da88e84b84b6d8ed7737221219dfbb2d4b0 legacy-trunk
+2765 8a24ef44dfb0a8b42b651458f55ed750790f61dd legacy-trunk
+2766 6b3604159ca9b118c67102e65284ad5154664ec9 legacy-trunk
+2767 c763fc64fcabbe25cb4f32b04cc57af07bd70ea4 legacy-trunk
+2768 0214bbf47bf6dee46ed1530070e4319386232aec legacy-trunk
+2769 9276c2625d64cbfd242a3bf45c1beefc230bff16 legacy-trunk
+2770 0ad5b35e3ad89f86357604696fbafaa3a735e42a legacy-trunk
+2771 dcc6de1c37a4f53526e06254428576a7b98f4e28 legacy-trunk
+2772 e25e2656c8537b115f38261416896e44a6fe6275 legacy-trunk
+2773 f8258f841046e8d6492025c34bfa5279339f2f63 legacy-trunk
+2774 405a2fec74541de7033c4c31db463847f9e0b73d legacy-trunk
+2775 11e86270ed0dcfe7b47ca3e9a4b38439a0bf34a5 legacy-trunk
+2776 40a0ec994c549ecc893b3b72e8151245b2b03c06 legacy-trunk
+2777 8d5725494ede73160b075f2500fd47a317a2c298 legacy-trunk
+2778 755bb8efcc2d53349c8e09fac3700e17b7b5f11a legacy-trunk
+2779 189ee3beebb5e6f6a51c46aac7941f087af3d379 legacy-trunk
+2780 ac7d64453aa9f15ea98888a51b8ce35c1df7efe4 legacy-trunk
+2781 d1f6ec788acf7b5fc4715a0076aa3b39b68173f9 legacy-trunk
+2782 cdec3e88053b3df55f77512984275d326acb262b legacy-trunk
+2783 a0d4c5ef1d5d7895fdc5bdf7464ed433d240ef1d legacy-trunk
+2784 9be658d193a989f92313025ccceb7d356c3f9d5e legacy-trunk
+2785 0e436200bf12884ce1dd55b484455455b10c1df3 legacy-trunk
+2786 7fb5defc8f6faaa595ec1b7b84d6a9351e1b5a67 legacy-trunk
+2787 212ad158a8062e2f538da3d0254b811407e70cff legacy-trunk
+2788 1d65f28c0aa97cb8539956780673047ee8038054 legacy-trunk
+2789 d420af9c1b757a2f826052abf14ed56bb466e73d legacy-trunk
+2790 42a6b8e1391a0785bebab64f2f81ccd0c08a1510 legacy-trunk
+2791 04ed4765b17ce530df14dd94ec945d6deed03343 legacy-trunk
+2792 f5a2bc39e10e2a4d4d887373b1de9748a57a4dde legacy-trunk
+2793 0c1938f2e0c02f84b5ad62a1cd5539534b90cd12 legacy-trunk
+2794 1f6c593eda687b29d52031d7fe17396125f7410b legacy-trunk
+2795 885996a1a631880ef628bacadcde0bb9f83e1904 legacy-trunk
+2796 784a09a52375c4e552e8e3f83edc973dc76592ff legacy-trunk
+2797 d5bb8fe43df2f3bfb33e798dcbf89588dcb429cf legacy-trunk
+2798 3cb686c48cdddf81be4342bbdface714efd68f84 legacy-trunk
+2799 9d01e98ed8493e0766b5e5ff1259804f7189bd54 legacy-trunk
+2800 2f95a01d6c1f3c6456dfd2ad47873fc604f8a6ac legacy-trunk
+2801 0b38000fc823df780f7dd86d3cf6122282997fdb legacy-trunk
+2802 b162b27400bc502dd0ecc743daa0fe5386849fe6 legacy-trunk
+2803 0efb8ddf6c0ed78bca03f3565ac2b1d428e652cc legacy-trunk
+2804 02d3f161b7f55702adfa495a001cd1a73bf56b1d legacy-trunk
+2805 59f9325bb8ecc3e5db40b0d6503cc79174638a0b legacy-trunk
+2806 c0e7b0b9b7507d432f1e05f5ad1e7a875a2e4d5d legacy-trunk
+2807 c832a2b0d4330bd831521ffdfacaa83f8794e34b legacy-trunk
+2808 8bba14f7db8a1dcfe97308b2cc50304330ef89cf legacy-trunk
+2809 f6cc7aa31de69e9a7c621abaea7ec05ef06ca615 legacy-trunk
+2810 da5b1433467c1ca5f594ed279cf92d6125945ce4 legacy-trunk
+2811 489fecc1da286aac2f783ab3354a58686ff6662c legacy-trunk
+2812 73fe7a1a5dd42e36624b1135f76b82b8e0b079eb legacy-trunk
+2813 0457c441b0860779a719e05ea529568a7429fdb8 legacy-trunk
+2814 74942ec70430ae8fb54fd4fa1ae729540c830a21 legacy-trunk
+2815 2e0d6882013effde6422ddaee02d749e8ee3d8ae legacy-trunk
+2816 e7293b5b570d9d6191b10ae480ef9a42754feac5 legacy-trunk
+2817 f6f982cb5401322b4c68681cca05cd58a4c98951 legacy-trunk
+2818 3e626c413bbf488fc288ffac16f091eea9e74b98 legacy-trunk
+2819 5b521fe4d1f6496b0d32f0c1e038937f74bd5d46 legacy-trunk
+2820 6d1599be2b54e0e40062aeb08ce31ef73a654a0e legacy-trunk
+2821 d3770b1da61152957b4ec266c13d28d6331b36e8 legacy-trunk
+2822 7e5f4d9aee77bc6dbafafb9a993ba2c18c2434bf legacy-trunk
+2823 aaff650d7e13660ab1fd6bd34b3cc028e7d348b5 legacy-trunk
+2824 5ed6adbb95f359032ddad63f518db38d6d622472 legacy-trunk
+2825 e3b63a9914f87029c34639cd8d2aabbcc9265359 legacy-trunk
+2826 189078136351571afa2d486fd9d28be4d2103f73 legacy-trunk
+2827 28390375a2b9ae665017f20f8646aaee6b3eae83 legacy-trunk
+2828 164b56fa6558eaaa2f216ee3c424a79ed19e2eaa legacy-trunk
+2829 1049867dca1f9483ca758895ef4938aae827b0d4 legacy-trunk
+2830 c2ba887d9492b1b3c45a2e386976932c78b28d26 legacy-trunk
+2831 2cddbbea9bfb323c57248dda2d5acb197f4a2f72 legacy-trunk
+2832 10002e1bc52642d88e30fd1e442450fd02728eac legacy-trunk
+2833 ffdde7fc71c1ecb82d4e4be6155176d7dc909759 legacy-trunk
+2834 71d496259ad348e6de1c373bf45809fc05e10314 legacy-trunk
+2835 4e2d239dc64c8f12aee9f288e1c7f1e3a4be6eed legacy-trunk
+2836 5aff9f8fd2995efb2c0e5f1b53752e87daf626c6 legacy-trunk
+2837 e34ebcbbdca6ffa4b9b0841c2566244edea40acf legacy-trunk
+2838 6441aa6a41264984fa7db144f7049c4fb1743c5b legacy-trunk
+2839 205b947b1d3c26c7604756c809137b51150e2262 legacy-trunk
+2840 6a60342c31074836a45dccc8241ce7599505042e legacy-trunk
+2841 102de319998e17e0d1ea91efe57940f1512cbe43 legacy-trunk
+2842 1386a72ae6047d9760521f02db9479725a273c67 legacy-trunk
+2843 7544ebac56987816dbe61b6c4e527bb5340c5386 legacy-trunk
+2844 3b09b40cef1d09fac165f5555bd5c8dd55da65e9 legacy-trunk
+2845 9126f4cb1cca4705c7cde2ef544d2b65ca714bf0 legacy-trunk
+2846 ca28a3a82bba8481e24878e71413ba37e0a4547f legacy-trunk
+2847 d244ee03c576e724fa5e7d049ac3a253a54c44ab legacy-trunk
+2848 e15bea971a5bd5379e8bb533060b1f5865ea3b9a legacy-trunk
+2849 5b71863c801d296f52322475c1664e8cac36c422 legacy-trunk
+2850 90ea507860950a33dd86bb2632c853335b121110 legacy-trunk
+2851 891f98357c04355ad2b2d4e9fdc361249f32ff51 legacy-trunk
+2852 d6fa64cec410e60c0a8662736040ca0960c0e67d legacy-trunk
+2853 2dbd7e844bd0827a4db2028b1089a2f9dc4abf7d legacy-trunk
+2854 b49baad9b6406c77749d4178964edab94055a550 legacy-trunk
+2855 5c18d6c5782742f29fb17a4ac7f653668fd0298b legacy-trunk
+2856 87ab9c81e927edd66d8b8c92ea1acc8c42c21744 legacy-trunk
+2857 f37f8bc9190c56a0f5c4219ba54a4c85710218ed legacy-trunk
+2858 7c06bf15fd2abde109411d8ca3183a5ec92c932b legacy-trunk
+2859 8a60649e7987e51a7568f1d9f224560d7f0db896 legacy-trunk
+2860 82c1259a4ef3302a0731236bb9f152a11917cdca legacy-trunk
+2861 14119b1948fb413b5d628733d5cd4b04807cac10 legacy-trunk
+2862 09ce04ef723be71de5efb184fb0386d5e8916b90 legacy-trunk
+2863 f53dcb9a04d6382517fa0344ecb39634e08a750d legacy-trunk
+2864 8ffae0b46fd4927b8f169d6a77f5cd6b01b61ca3 legacy-trunk
+2865 a8022b2a77e6096a1b585ae1df4a4263ecaac26d legacy-trunk
+2866 1e8e3ab67b4585e485e23fad5e36ba20fae0cab1 legacy-trunk
+2867 7582ed13684e49780673b3c0c11423347b7b1223 legacy-trunk
+2868 bfdd6e626dd370ae42f2ec97c2af38b91a7f6abc legacy-trunk
+2869 8bcb50f436fadee6881a2be5e42a2ee640cc5ff2 legacy-trunk
+2870 7236e02c456312674efa7c76ac09f77cb0749c74 legacy-trunk
+2871 bc5c77fa800687cfe740ffc914710b6459fdf30b legacy-trunk
+2872 3d9c2310afe85bc750ae56ad45b2e5ec1a5cc5da legacy-trunk
+2873 00cdb8dedd6f2a546005edeceff8f52fe86c2105 legacy-trunk
+2874 862457e0237ca58f5883571db7516d340e09190f legacy-trunk
+2875 2403fb6eaec621c358e2a5ce55024fb476763094 legacy-trunk
+2876 93e215dc1d6ef1e2c7e216ba2e07db631c896526 legacy-trunk
+2877 4d64abbdf70a96912616e3a4b734a86a2e707098 legacy-trunk
+2878 9e9145abc42ac454e588e74b0368b8609e167736 legacy-trunk
+2879 4d2a199e1202a6b73788e09a5acd1b1ebe065586 legacy-trunk
+2880 cce05a476e0412ee0c3228f56aaa64d4059be3a9 legacy-trunk
+2881 f7278a067fb430365b0123217e2b56db6bf35ed1 legacy-trunk
+2882 d8b17fab3a983f127e767b9016d08c8de4fa2800 legacy-trunk
+2883 57e94eba24848cb8057c10ec7b5f7eadc9c23994 legacy-trunk
+2884 e7571a18bdef1d021455ed1d2ddc949aca523af5 legacy-trunk
+2885 476bb7e5b8547569b18e7d1b008d0988b32fd55f legacy-trunk
+2886 76e48701204bf237c991959a76f4e256860b1ecd legacy-trunk
+2887 e8c6fa9118ebe9eff6b9866863145959b8aa9da3 legacy-trunk
+2888 9a754486ef0b5121b26a25844dff473cf700049c legacy-trunk
+2889 76d92ebb4d82a75c5063ddf58c600a521d0fcdf9 legacy-trunk
+2890 82dd081f380d54a74948eb18c90c15be2054dd42 legacy-trunk
+2891 c81952d97ebe8ad87672cecbb3959ddca7fae6a8 legacy-trunk
+2892 c65fc172f16dbba6fdea9cd9b1bb8ddc3c5fe5c3 legacy-trunk
+2893 0338c7c9f08c99abee9c8bb274db392f2b8e21ba legacy-trunk
+2894 f179d8d5ee8c853dccf96c9d06109472653730bc legacy-trunk
+2895 cf5cabfb3f71f6b779b14ca87686fcd0c907abcc legacy-trunk
+2896 1e205d0875f62df592a5339d222da011994c928f legacy-trunk
+2897 ea0bad9fdf6734e90943c952462157f9a71324ff legacy-trunk
+2898 8246576ef3f535969578124822b2795528f558a4 legacy-trunk
+2899 55c60e7f31eda273bd6207bf5a2a231039f998de unlabeled-1.5.4
+2900 078f9015f178928c6d2234912b99ec01683b0549 legacy-trunk
+2901 ab1b3486b22638f54af6c9b0af266407c7915fd0 legacy-trunk
+2902 d77824543bce96a9f006492bd7e88c8f523f40e0 legacy-trunk
+2903 dc60953f60529907b80f0fc8d9adc0f336620a7e legacy-trunk
+2904 f710110cfd392a56ba3be9afd92acb1961f32b22 legacy-trunk
+2905 dbcb49d742a0cff2ac33810b9477ec7c12b35443 legacy-trunk
+2906 834dd4a77ee20f9998b56fe21d8a9d8962fc8601 legacy-trunk
+2907 c7b23cc8cdedaff4870ddf53f38bba8e47d59b38 legacy-trunk
+2908 6c0f16008bd9d40fcac8b5189e1ef8158e199218 legacy-trunk
+2909 45c8189394ff0e3e9d9620332a8ca183254260e6 legacy-trunk
+2910 70c2f40430c7695ef92d8cc315f333b9cbc1934e legacy-trunk
+2911 32085edd77a7d894f283570abe352e10011a2e7e legacy-trunk
+2912 ff3db955e628f3416475f76d42ad9be4508efd7b unlabeled-1.5.2
+2913 a5e6881cebf09c816b8059630b78ec55111392e7 legacy-trunk
+2914 0d494bc24207f77a56ef745ca84861be917a632f legacy-trunk
+2915 8bd2194ad6f9a9b53e882409a0fcab986c562987 legacy-trunk
+2916 8f7b31a8a6785c8466709f5d3f33fa8cadb560c5 legacy-trunk
+2917 6fbb03dc439ee269b247addfbe3aa0e5483f06af legacy-trunk
+2918 2dd5dbf28a2dd55d4ae72ca5c184a2a113d364d2 legacy-trunk
+2919 5d2f62ad8deec1223dfabd0c54e55acc6fbf00bd legacy-trunk
+2920 9de3d02aa75d19ab9288792490be456dc74fc2c4 legacy-trunk
+2921 bfc655074523d0abf4082995c715427fa3a212dc legacy-trunk
+2922 41dd393487f591a44caaed3ccd69cfa764ca1e3e legacy-trunk
+2923 9b671f397a8f27037098ca366148e4d42ddd0b80 legacy-trunk
+2924 1dfb0c9d05767d0cdb8037a6a7c15a38659236ad legacy-trunk
+2925 57c3e9cfee40ff8599d01d51ef63bc80118e7cbb legacy-trunk
+2926 07d5d62a4a2b201660e300bd3c6c6d55594848c9 legacy-trunk
+2927 7d84e0ddf3be2dc864444a861d657e8609f8ce80 legacy-trunk
+2928 3890f46d6e3b71149a607e6e379b93d465343507 legacy-trunk
+2929 05376c926f580d99b1d89d7771ceae713d0804d3 legacy-trunk
+2930 7a0d03e8bd29bae6d984c361cc15d04e67d0c3f6 legacy-trunk
+2931 676031bf44ee1ad539a5d1ecd063be2dee1b8bba legacy-trunk
+2932 f8421da4efa76b7d5d59d87b2b490146b7238117 legacy-trunk
+2933 744696ba8927ae7bcaf85e65ce7b925b4035b11d legacy-trunk
+2934 2e82dd0f8a9e37dac70ac0660b0be45a8b986436 legacy-trunk
+2935 d945cf33a64f468aa7bebd2fdc95f59bec545a4e legacy-trunk
+2936 c721afab0efa61e5a8e22336dd74e0b87bf17388 legacy-trunk
+2937 7c8abce197984a9a6225a9728629c8d5601094f6 legacy-trunk
+2938 45b3a78f256bae6b498f7c1d62974da21225bf71 legacy-trunk
+2939 7259e96a04a9d45140f0d66c62ce76c09d225a07 legacy-trunk
+2940 c0d4caa71bdab12fb0a333af140c15df9e5f870e legacy-trunk
+2941 6163020a967dbc3f7b95a2d98ee2655f15856ed9 legacy-trunk
+2942 b37ac91e2a0da4b808bf2b5418c2740734abd21d legacy-trunk
+2943 30a652101599ff1e786a90b1b10165fa54d93a8a legacy-trunk
+2944 68584314a1547fde8a670b60dadab0c0c1adbc12 legacy-trunk
+2945 012e37f050190f191165f5a989ba61262700a31a legacy-trunk
+2946 3e1fbe84cf9fc6a2630aa2a07d193def41204a3b legacy-trunk
+2947 fbd68e69214c27e05953813fa018454f8ffcf813 legacy-trunk
+2948 cd81e56804b0942b1a9d45060c3f7c11e1b11aee legacy-trunk
+2949 63d34e877a69708f3debde1e464526893d98ab09 legacy-trunk
+2950 44319df6a91c2967723fee50600212415f7a85af legacy-trunk
+2951 ba4ec13c0f9f982ef9b5e542d35a63a5551695d5 legacy-trunk
+2952 f565cf7f9aba83c1a80c71e1847f7359721e3199 legacy-trunk
+2953 164849f56105fe2c30619a64afe23dc55c6ef944 legacy-trunk
+2954 77ee9b222fdb4a48885785f9aa61425bf15f8b75 legacy-trunk
+2955 dc3b455f76327735b065bbe06e028071c54e1900 legacy-trunk
+2956 cbf0ef998a4a1e57cfdae6487d7474a15cb59baf legacy-trunk
+2957 c7bc5614eead5b4f69fbd3fbfcfe967d5f96009b legacy-trunk
+2958 0cd197947d814e9cf22b9d44a9f669a17d07065e legacy-trunk
+2959 1360618406243415399ac663323f9d94137dd430 legacy-trunk
+2960 3c8b442e5e1f2e6ce33aa4f55fe7b80d91f42647 legacy-trunk
+2961 dfb3b0ec1ff929a6822cd5bc90c0203e6328c91c legacy-trunk
+2962 784c51cb1b7970b7a1c7e0d0b14ad96056773362 legacy-trunk
+2963 44ecff6884b7d71cf4c980fe9a2ad8003059d0dc legacy-trunk
+2964 9652fc830a12d9aba9ad86c0c4c6c87ebe96d5b9 legacy-trunk
+2965 3d6541a2eca5a0625e5f424490041552d2ac92a7 legacy-trunk
+2966 d05704a000ebde5d91a23ce162eacc7348f11de9 legacy-trunk
+2967 3adece2c8567045dc197ff98cdf8b3b43e5af6e7 legacy-trunk
+2968 bab2bebd35e73581ae4d889c1e5b04bffd6c1e08 legacy-trunk
+2969 259923e4d7b17fbcd00d6817f79f1a7bc0743d8e legacy-trunk
+2970 43c86d1eb22c2946660318328f8d559c057d1e63 legacy-trunk
+2971 0cff36b110fe5527469d06c3611840a2d7bdda81 legacy-trunk
+2972 857ed3fbdc0ea39d2b08f05cf68879fa64a3de73 legacy-trunk
+2973 3773b6f6dd53bceb6c47d1c67c4e7e82dfb0973c legacy-trunk
+2974 d6e25792323fb6bfce419726baabe78fcc11e8e4 legacy-trunk
+2975 94ea6ea7f7d556af7e5965c0af1d5a29325a80ff legacy-trunk
+2976 01a6bf57452e55aed715733ff0d1f8ce8bfcef64 legacy-trunk
+2977 f08d34499269de0e48fecb4ebac47e94588cb329 legacy-trunk
+2978 6508c93f94729aadee8c4b13c61f9c2adb220196 legacy-trunk
+2979 e4a27d84ea36780f0864b3d54c3a8d76ecba1adb legacy-trunk
+2980 aa633f0defa61ea955e04eeedb34486b454e6060 legacy-trunk
+2981 e157c12cd6e7f7491ce30fc3c53aacec5abfc367 legacy-trunk
+2982 a1e84b48447ae644bbadfbe5c3962e07782dbbe9 legacy-trunk
+2983 09c69a1ec7b0928b1fb917cddcc1c1ea5a795fcf legacy-trunk
+2984 01fc59003339f7703f0f9ca3cbc02053db862fd1 legacy-trunk
+2985 1eecffd969689e080922249ada2d69aa7ce5706c legacy-trunk
+2986 d1b89e85ce756d3a2d6d6c73f18241a2c4681262 legacy-trunk
+2987 b84a6d4de90e8fcf434a31aef0de981d5dd71629 legacy-trunk
+2988 1d19669f5687696433a5f2c048b93daccab949a7 legacy-trunk
+2989 3cb9a2b7b40cf42de39a4a9004fa5363ab70c43c legacy-trunk
+2990 faf11adccfc65bd0a7481349ca13bea5ea18e037 legacy-trunk
+2991 2fcd401a62323a4694dea0af2ca86c95346d94c8 legacy-trunk
+2992 21b3ea6bd32d316e1d9b67fffe0304582b691f56 legacy-trunk
+2993 ea5072de74273a529fa00642339ffb4d492fa0de legacy-trunk
+2994 3eb05d2dc7b11f41b5631ec893de79be3b6d246c legacy-trunk
+2995 b41792307008deb438a973ab79a2771e68a77ec3 legacy-trunk
+2996 a7882fc6ea2705b8e150dbbc1e1fe92642c93ae1 legacy-trunk
+2997 6bf69f54a903d89e6d5c197a453d74f27dc29736 legacy-trunk
+2998 f2773a6dc51eecb28bde5bf76b024d4919742568 legacy-trunk
+2999 7b4ade536af88f4530ef6e7510c9a4f277b1666c legacy-trunk
+3000 b98aef213daea54c230c83cd6440e33f2b8d8175 legacy-trunk
+3001 07a8c443b8310483cc4e52676cdb5bb12761e93a legacy-trunk
+3002 1780eb8fde2b645f33a0ea732a1ad9f10463eb05 legacy-trunk
+3003 4101ded73c52da8df7ec03e0bf1e4399ba44fd9c legacy-trunk
+3004 3f81b5ac2bb202408592557d02ce0e77fc49e7ad legacy-trunk
+3005 146635def01eab2db371de9a37e1029320a48556 legacy-trunk
+3006 398c00f11a2f45c27e43fcb198337e2f4341b1f3 legacy-trunk
+3007 c55cb76bc837081e0d51af97f48b250fdab9044a legacy-trunk
+3008 851ac4a8be7d885b371cce3eac5217de98ae752b legacy-trunk
+3009 1640cc3f1a53f80752fb2c80bd571c40deebee09 legacy-trunk
+3010 d31ec15f5f710644ae27362983f7d6b0a69f41aa legacy-trunk
+3011 b2a41f6aeac990cacba24d0a92794b2303022e35 legacy-trunk
+3012 fe6a5f2640a276d9017f5edf0074461d3bd9b96b legacy-trunk
+3013 872a3caeff07242035389d6fe65f0282a2036b97 legacy-trunk
+3014 4defabb8296b5b4706d037d58aa0dc6956b0db39 legacy-trunk
+3015 1ac5c6727e8c58dc89940b6f70077cb0cbbbb12e legacy-trunk
+3016 4d58e2c50887a5acae8e892584d57a65ba94ce7e legacy-trunk
+3017 39e5b7e3158885f31eba340deff025a071d5c030 legacy-trunk
+3018 6f499d5daddf7abcf7e49144296dde8a2817005f legacy-trunk
+3019 2541b3d0f20f71e616b97a9f0de262a7032eda77 legacy-trunk
+3020 8bc170e5efee72146a8ce2cc098075d917a38e3d legacy-trunk
+3021 6ca1c44fd5278a329cc7f149590ce3a2f7d65b85 legacy-trunk
+3022 6f3fed250adb0fa22277e1d8aa25ee9fefa16ef6 legacy-trunk
+3023 39134c99c92383a571666870f7aa72067fbff110 legacy-trunk
+3024 76095a8b96caebf0ddcd2b9efa314a7bc37708fd legacy-trunk
+3025 bcf02052e909e81a7c4c00796bd3a6b4db22eae2 legacy-trunk
+3026 b68b10a21520093e8a16fb2737e5b9da40cf77b0 legacy-trunk
+3027 e58f40c2f285cf5e36c61db091452777f4a34dc0 legacy-trunk
+3028 58e8770db44acdfed1d767cc6d01089fd49e2f97 legacy-trunk
+3029 06c078750e808a33b8b731c20536efee3915dd14 legacy-trunk
+3030 cb146aa987c945f96047f78465e762318c380500 legacy-trunk
+3031 b2db4bf34ff8ce49995da7e840483bfe72987942 legacy-trunk
+3032 8e351fb2577a02b262a7ef50976735dd2a5db28f legacy-trunk
+3033 9715fdc1e462dfd4f50fd8c0d7b3da7020a93fbb legacy-trunk
+3034 22169fcc11826da657818f182c26dc3739a25975 legacy-trunk
+3035 7a013d6445a487755c4961ca8721f9db36fdb2b9 legacy-trunk
+3036 aaddf821f5d432cf116b3aba4486115c38e02ed1 legacy-trunk
+3037 4c9bc52b8080d39cf8df6fce8bfd8081adacec8d legacy-trunk
+3038 cd0e7f24faca1b11ab56b5a1b62d8af003c041a7 legacy-trunk
+3039 ec31748837dc2789f487946f3259173197142f92 legacy-trunk
+3040 9fb2a868eeeec65ae7dc619804ed55918d791b5a legacy-trunk
+3041 36323140f7518545e2bad835fae94ad7a2f55695 legacy-trunk
+3042 f9481aa5e776b65f7bd1e26b57963e185b41d3a4 legacy-trunk
+3043 36b934326fed5f455a7c0ffad8d3350509e12829 legacy-trunk
+3044 aff819caf21af54cb661c6990e01409b7d3d511c legacy-trunk
+3045 00ebe5fb0ac67120b604e51a2768c3ed80b0a845 legacy-trunk
+3046 a54e4a717c9bbe291d92e4d630552b4d9d98e8ee legacy-trunk
+3047 c02c3cbb8ad1047741bc6f9b4622cd71fcf3fd58 legacy-trunk
+3048 266de59de8a9d87287cb483deec286d28d0a08fa legacy-trunk
+3049 9a05e2bfa74c36bba6beb7de3f506e6edf0ff19a legacy-trunk
+3050 16a195354b2bee06b7fc3b5d9adb265044c821d2 legacy-trunk
+3051 dd7dfad404cd832da638f175294a6efe9fcb7ad4 legacy-trunk
+3052 181409141a1806d7b85c318fdb9643be247ee09c legacy-trunk
+3053 b3d639ad666d5b20b0db7c553c037e49dae5d66d legacy-trunk
+3054 a8ca720fd9219eea6bce32df6a99d5f95a016fa7 legacy-trunk
+3055 11ea669c231e13d24d49db38c75311028f35c44d legacy-trunk
+3056 226582822cfaf122f0ed3ca95bb12fa9c3d1154e legacy-trunk
+3057 46cb6bce4c475f4fefc52284919666d4fac44ff6 legacy-trunk
+3058 bebdc1acf47459b86e5cf97502dfb062017177cc legacy-trunk
+3059 6459e2f21bf680773788fc2afd6619b72d7c8eaa legacy-trunk
+3060 0c5b2d9e45e82d3f2e5e8aed44af5fac2cb95561 legacy-trunk
+3061 ef86502508e2f1086c1a186bfb13a65a0f0d2f0f legacy-trunk
+3062 99bff1db75f4a0ff1d6729de1ec97a6f3ab1e674 legacy-trunk
+3063 58a7438c2e7ef922b363179e046f0829bbaaad0a legacy-trunk
+3064 fea3f594df7746b776a13cb90f3efa49b3cb7f54 legacy-trunk
+3065 a4793ae266826c0134c4967d0a0bbc3a6384ac14 legacy-trunk
+3066 fd62c28096b5877e66d4bed7c1fa459010657479 legacy-trunk
+3067 7f7ba65a2825c0e46b584f9b1225993bc0356b5c legacy-trunk
+3068 a1f5b216e392cd9b52a5759ac6cabca3eabf85a7 legacy-trunk
+3069 63798cde582cf535645a242eca3dae79fc0e360f legacy-trunk
+3070 32010d355fb6122e5258ea92366346583db5f5bd legacy-trunk
+3071 424f55e67d5d324b986576a5fde98c147cf2b425 legacy-trunk
+3072 4da0b7dae796ff8f258ad6b7a470e6fb9cc3db1d legacy-trunk
+3073 a4f2b2210b02115030c59a157539615733938d6f legacy-trunk
+3074 4fd22602e282c1ee8bf5187fd14fd2b3a84ba567 legacy-trunk
+3075 60e3118d30737bb6f29c3876a4c813c6304d4599 legacy-trunk
+3076 e98a8f802903a629c624661414cc89cae2ac766d legacy-trunk
+3077 74b716e9ac4986e4003789381cd0dd044e2a2a38 legacy-trunk
+3078 39ee7de747502e962bdb5c6e872b367f42b0a55a legacy-trunk
+3079 fec18e244d16882b29f0fd57be7d511fd2ff29f6 legacy-trunk
+3080 cfdd575efff2b41570b37bfbff80b2c3751063a5 legacy-trunk
+3081 e43a220c287aa3ea27b7c1e13f5fc030919f5df4 legacy-trunk
+3082 d3b27fff00b2f12575ec1d213b8e6d7d3779ee3b legacy-trunk
+3083 8c73c5f3b6ca73ddb6694a6c5528709506aff6d6 legacy-trunk
+3084 8078834996ecc582ca4479683140f08f7f30b034 legacy-trunk
+3085 c12b445cdacea1d9f9a088af622a6a5b1c04caae legacy-trunk
+3086 72aceed365d435b7c2953db840bcd05476998373 legacy-trunk
+3087 2505fd20d277a479e0d487662b8dc234d6bae260 legacy-trunk
+3088 61143bf03b4476e05e272cce9daa956613ace747 legacy-trunk
+3089 c156d4960c2b40859b1f058c24fd1b0605043e70 legacy-trunk
+3090 aacbd4b558c7efcfbbf77ccbbe27068346c00b48 legacy-trunk
+3091 8725fa8d7ff91d81a436aa61d34d70f6cee29129 legacy-trunk
+3092 ff02b948c9a80b7b955c15841b931f5412bd81a2 legacy-trunk
+3093 e506197332c0c1a11ea4bf9cda728062e885f04e legacy-trunk
+3094 d8608ed1cc3b13b9823012e0baf6d9a466c5e3e7 legacy-trunk
+3095 615983f1a3ff3fd592e2673b4a7e44bbe33f4ebd legacy-trunk
+3096 c432738cf69aeae15f588cfa6f4f109de794ab32 legacy-trunk
+3097 d383d27331765f8d6ecc06e31d450b4af39bcc23 legacy-trunk
+3098 487996796edc6c731b750cf9586d95213798ee15 legacy-trunk
+3099 dce6dc62f108ee44b047edb02bf44d99ce205ac9 legacy-trunk
+3100 58a4cb18f025af86d9db3d091c91c4f44684478f legacy-trunk
+3101 18369bb9c24d07879f605efa7ec51a50f292d7a8 legacy-trunk
+3102 7243a906937cf78483ceeda35034a4d016c432ea legacy-trunk
+3103 844482b6467aae3d58c81a505705e523ba6ef2b1 legacy-trunk
+3104 cd40e3eebb49390f4e034af311dcbe261bc7a014 legacy-trunk
+3105 3aa65892b75c4706967357335a9876179e539a99 legacy-trunk
+3106 b46f21c83369096f003d97b8fb54d5ab9d758f11 legacy-trunk
+3107 222f04f5508335726ab6e61e1d5df344773d8b1c legacy-trunk
+3108 465b9841770e34565e4d96cf0df70bca4b07d8e6 legacy-trunk
+3109 36e2b7a00d72f36afbabc801e2d035df7005314b legacy-trunk
+3110 260d96db112f87d204bc8e5e2dc4873fb81fc225 legacy-trunk
+3111 e5ae42ffd9a0757f6a771f9671efe6066be23736 legacy-trunk
+3112 bc0ab01754ba5dcb480041e53d9d87a67d55307f legacy-trunk
+3113 b9f24d0c7d9616a7d02f160ec78a4030d9567c23 legacy-trunk
+3114 0284f1079a7bae56423c9ce73ae2383ba71cda5a legacy-trunk
+3115 7d8e51e580d1a23ca33d2028976f52d2b2bd669e legacy-trunk
+3116 2b60832723c1431f795f848d3173b6379a85de9f legacy-trunk
+3117 266a8ba20784fcf41bc4ef28ecfce9a9924ec8c7 legacy-trunk
+3118 03de67080c9562428dc737e71f4ee4ed2252d9a7 legacy-trunk
+3119 a60cb53212110e5400b43b5b88ebd6ce77dc7e19 legacy-trunk
+3120 5c6cdb58a801cb819464e0e8cd1e1dd310f88205 legacy-trunk
+3121 a736ef1840a51fe2b75ea89f5191558ed9413b56 legacy-trunk
+3122 68b302ad84a191b43d9955c58c82939cd6295990 legacy-trunk
+3123 7d3a053c6765ae56eb16c10dc589d5c0ff130995 legacy-trunk
+3124 a31e0784706387469cf0e9f3ecc8b89117fd4efb legacy-trunk
+3125 b41e95731e422421785f15d8957133f44fd3d9fd legacy-trunk
+3126 b5fcb662465e73cf8f67e95ae9d05433e93209f7 legacy-trunk
+3127 4bdb27943e22421370069090dae400e53bfc7f5e legacy-trunk
+3128 14cc4b07cebbd611e770bf7a1b50928d8dc7c079 legacy-trunk
+3129 27aaf94475ddbd759b0502d7bc7fc639f98afe40 legacy-trunk
+3130 1a520290c39c0525a7fe021a21123a8242ae2159 legacy-trunk
+3131 06a9c828b60891b58cbd6a6c323b3e90411d41ac legacy-trunk
+3132 9bfe73c77334cab6130236b7f54734f98fe4e8ef legacy-trunk
+3133 4657f7c980e859f5921499d6586fa3ec784b4267 legacy-trunk
+3134 f671938dfde2e5328aa808e748a01dadb151cdac legacy-trunk
+3135 7b37b5e71493a36718f550354ecd9a635e0dce94 legacy-trunk
+3136 30a290257c31d0b08d1728652d14d6de53152d65 legacy-trunk
+3137 c9c0328368a9e2b643916043ff5b65c22f45b0bf legacy-trunk
+3138 adbac5893f9c60dfb173a2f650176456decbfbd2 legacy-trunk
+3139 31b018bda7e2d3f500d9fc748e4a9be159b1e9f1 legacy-trunk
+3140 576dc14a24009712ecb1063c93864ab7f3afc351 legacy-trunk
+3141 13c99eaf32a8c45fc939819ba018c4b1943b5660 legacy-trunk
+3142 3c55e612a6fcc1d7ec4191ee040e9366a72e1bc7 legacy-trunk
+3143 ffe2fbc583decd791985e263fe979be8f538d9ae legacy-trunk
+3144 9f1db556ffbc28ea3dadd2d6a31973982ae108c6 legacy-trunk
+3145 fbcb8d0bd45e0321ec9d54d5afaddd7873ca80af legacy-trunk
+3146 b045e68bbcdd54d4b45e3c073d0282726a3fe289 legacy-trunk
+3147 87aed516016176b4a400257902a5979265c869fe legacy-trunk
+3148 5cc7a3cd557b6493776a22ab5333b8d0200b1713 legacy-trunk
+3149 2a0746d52478a72ead3d1dcb60757b0160035616 legacy-trunk
+3150 24c98b60dd7465be40b037a66c5c5af58218f99e legacy-trunk
+3151 197a2cf3a662c6b1c702b731001702d2edbd06ac legacy-trunk
+3152 77aca6966b9d01b5a134f0fc99386775e65ee6f6 legacy-trunk
+3153 a9eb7a0d4002141fe7254d5ece2c533ca65e55e2 legacy-trunk
+3154 7f80f336be7f82abecd45d788b8b2bd1b6d52c0c legacy-trunk
+3155 48c637fb150f3289816f1fd37c7aaa8e38e40070 legacy-trunk
+3156 7ce1975f11a90f1241ccb31ebc52325b1063b08f legacy-trunk
+3157 f4db4063ec886ed39aeeb164e46601a6db429018 legacy-trunk
+3158 f025eef93130d325927574f097d5681c22b690ec legacy-trunk
+3159 ffb03cebf3f455e426e425afe3266482cb7a8d28 legacy-trunk
+3160 0be1a5db778474a0e5cff7fad1291bd6dbaadb16 legacy-trunk
+3161 09b48604855f4dd3f3773d2ef241aada0e0c5109 legacy-trunk
+3162 debfcb9a7e08a6474389d2f9a6ec90b1d165b76b legacy-trunk
+3163 6774107c647dc59c604daa70c4b1abe7bc9d55f1 legacy-trunk
+3164 5067f2d38e143fb2325851652454486629bcf657 legacy-trunk
+3165 0ce404e4139c5b651190c84a2e81d45c6ddb2a9f legacy-trunk
+3166 17db059b29bacab31dd901c96065ae45a6ce07fe legacy-trunk
+3167 5d7142ea01b7db0f1780664e69c88adc53a2140b legacy-trunk
+3168 b33228e3c2c27ed92315e354fb805b56ee4578fb legacy-trunk
+3169 903071377d292e599240d93ebbb15619a0f7d5d5 legacy-trunk
+3170 04a8a89c92eb70e12138602ad5474e617d39767f legacy-trunk
+3171 fdbeae2d6e671e215a851e6fe7ddc3c384baf02a legacy-trunk
+3172 09d271ef3b824042790289a95ab7aef8213d3ea2 legacy-trunk
+3173 6c1fd0510d61bcd1708e192e5a8c3ac3894cee5d legacy-trunk
+3174 92678b5057c6556ce54456e50540b15b75a7aa0c legacy-trunk
+3175 806689b93558f956f71e609f232c1e02fdc54834 legacy-trunk
+3176 a1ce5a949828d5c2bf1554f800d3ad7b12fc8723 legacy-trunk
+3177 96acb35bb92bb891d9ac0e18221e19850106c0a2 legacy-trunk
+3178 f3d5e2c3b9a3a531f7ce72ebf4c3910b9b1ba1b7 legacy-trunk
+3179 a41e3ba5b47d96fbb7d921d54adbf1dd973500e0 legacy-trunk
+3180 cb7ef9bd9edec379a538640d9d3b3e7367749e1c legacy-trunk
+3181 3945f3712354901bd7689aa93d5cbac1e0e2d162 legacy-trunk
+3182 a3e768ea802ab907f011017ae1beff5e17a66b4e legacy-trunk
+3183 7442b20c43fdfccc1a3997705373b9a1d51384b5 legacy-trunk
+3184 0d7c82366704500527c45737d3c32c3d1cae1360 legacy-trunk
+3185 9b566ac38c2b84341c8453025037c7f129a1b5bc legacy-trunk
+3186 94ab6761afe2c4ef2d705c7ce9a1d311cfe8fac2 legacy-trunk
+3187 7b4f2833fd902bc558a21ba1ca184b61b83ae517 legacy-trunk
+3188 f993197c3a476e49c37e3d9b44656344807b9179 legacy-trunk
+3189 56d63cabdba7ec0855fe240d1a54ca2d6cca18a1 legacy-trunk
+3190 513940eb4d7b6991b1556fd97bfcbabbbf9dd5e4 legacy-trunk
+3191 ed456e91d95ae854674599e9b63339bb96c1a6b9 legacy-trunk
+3192 2f9805c963e85364807b8ea17ebb3cf341d2aed4 legacy-trunk
+3193 9f0fb114c1e54ce563e54330fd7d18c05df4cef7 legacy-trunk
+3194 7a11a70f7f44dccd42edd1d9b296f87523cba182 legacy-trunk
+3195 432fe7f0837c4b25a74c42fa4be35b52f9552c86 legacy-trunk
+3196 fbb840f64bf89567ca6c93bc0e50d5eae5df1df5 legacy-trunk
+3197 bbd0198eae5bf18faac274c67e2534cdd7e83a4e legacy-trunk
+3198 5fb3f73a627fce59ed0e18c30e1eea6a7ad8fcd8 legacy-trunk
+3199 bffefbfceb60543c348a6fb99841b8ee3c9a7d25 legacy-trunk
+3200 516b5a16ac7718d6e17da21a06ef343d3b569f79 legacy-trunk
+3201 b00438f265ed8f9622daae3a6e0a32aad6634904 legacy-trunk
+3202 6aa0ee14ac2ed606a0e8bc8a646046980bb449a3 legacy-trunk
+3203 0ee59a14e5421fc9b4322420e0756a13ab35e708 legacy-trunk
+3204 3dac204b74faff937f105c8247cc1e3285de1e05 legacy-trunk
+3205 58f748f58df584bb2696e598fbc92c81f77ea48c legacy-trunk
+3206 8f3a2540995a15e0e17de89b773c797167049792 legacy-trunk
+3207 c72ee29cccd018fd7372f6be4124869263c3719e legacy-trunk
+3208 10f10d4542faed8542e6b56dfa9181aea52b6cd1 legacy-trunk
+3209 d6808ec6edc736e63454c3a5b7c79f61ddee58a0 legacy-trunk
+3210 6b5a34db21fe1733682ae47f824bf73cb8e814c6 legacy-trunk
+3211 c1ebfde341a3ecc9a9950efd3e62937455c6539f legacy-trunk
+3212 2ed51117180983827b1911cb86448894733f88e1 legacy-trunk
+3213 f49d2311776bb93dc9d85ece9989249fc616b28f legacy-trunk
+3214 f54e64c8b9b70bb9b03d30cf28a1d8345293af63 legacy-trunk
+3215 6508ea32c6b09999fb4b1f35cdf87ff92525428d legacy-trunk
+3216 c9546a2118f04b6b36507bb35531b46576218768 legacy-trunk
+3218 316ce677c6b20a4c90a286d79003cb2297fdf4ab legacy-trunk
+3219 6ab207a55fca3477f4610bdcaa982270a0bbaf92 legacy-trunk
+3220 9bf75e4d9aec3eab3dba05356289dd460a6857a5 legacy-trunk
+3221 e6642a535db5fc16c0afe9b14659606c168f9076 legacy-trunk
+3222 fe1926b9dffa73125488ded1c4fded98ce9bdbc8 legacy-trunk
+3223 592bac6adffc256662b49daec481e1b8b5db9f71 legacy-trunk
+3224 4f6641dea6458978d021018dd2a2b88987e16ff8 legacy-trunk
+3225 a3fa229775c16d3a32b9fb55a4f13d40ddfd5087 legacy-trunk
+3226 0da16e81482cf33d0ca9b8a48d236c67406e1c9a legacy-trunk
+3227 aaa3bccb143aaf1b77155c7a19b62ba2b1567dc8 legacy-trunk
+3228 6be97039cc11f624a0ba2ca663a3ebba1fda5af3 legacy-trunk
+3229 b5d95acfd3ee3235839c7136b27bfcf7b1aec59d legacy-trunk
+3230 696b91327ea238e51314d403a1b021a31bc0f608 legacy-trunk
+3231 393d54ecd43b5b96d41ea4846f8056ea258a22f3 legacy-trunk
+3232 7162f5ac899aa92a64bc49b445afd7c12d6c5881 legacy-trunk
+3233 0016457bd97a85a5a6c5c11384f8f3fafbe5350f legacy-trunk
+3234 1a54d320f2964aa785c20d7e3de02f927aaca67d legacy-trunk
+3235 2291da05f1784bfb8514de56bd9391083d120c0c legacy-trunk
+3236 767ef7370d33c4d90938c550d33cad55eb528439 legacy-trunk
+3237 2c0432fcc27079d00eef2076c0563296db793109 legacy-trunk
+3238 4dc382ff6fc74d350d60c6114d5e6683ba8c1a1e legacy-trunk
+3239 98cb6a1252cb65b33fcf8208f040b22bbf61312e legacy-trunk
+3240 6ac916f8f86268d080ce5ec0091d52d8c9aa73fa legacy-trunk
+3241 feb5b234b0b5ffb24368b7426b4792b9f2714b01 legacy-trunk
+3242 245003c006a637f4f1d08cf3977ec17d82621e6f legacy-trunk
+3243 e4c6a0dd5c2b27a7a5fe7853265ebcd05b30ac56 legacy-trunk
+3244 7657a75094f1c2082a12ed56593a837b36d05e18 legacy-trunk
+3245 31df58fa98cc5591bc1e62111c320fac11196ce0 legacy-trunk
+3246 08d3c370193df7f68dbf46b3542fdf8e48c9edd7 legacy-trunk
+3247 f086d7b493b4dfcfa1c5a7d03dc3d837e62159b0 legacy-trunk
+3248 b755a46201f6e75c78d4df8cac6306622a88789f legacy-trunk
+3249 965aa3b53a9d86a5a3cc6c6d2e6d9cdf084e7a68 legacy-trunk
+3250 db817f3a1c65448a555f6273baf8044b443f768c legacy-trunk
+3251 b9e4f7321e28dcfb382ca336801cbf24443043ac legacy-trunk
+3252 35824899aacf820ae90c9a1a786e79209dde1956 legacy-trunk
+3253 8d62c9056fe154443076abc6c5d5a8078cc0a7da legacy-trunk
+3254 ab926534a15274908ee2a509321fa092c0cfffd0 legacy-trunk
+3255 6d57dcb4faadcbe9337c910932af69f8d9dee9fb legacy-trunk
+3256 82c55ea9069e5b548b7c13603cf911ee7a8e62db legacy-trunk
+3257 a4376a997fb18b9b96e2b57a781b843a7fa000cd legacy-trunk
+3258 d2af6bdcb6d0a24437672bfa6370e2c716edfbb3 legacy-trunk
+3259 ac0828ef68f29bbd11425e3ca0724a3626d28df6 legacy-trunk
+3260 ce718457b1726577117a008e8f0c256dc22280fc legacy-trunk
+3261 c644bc626098ad7bf33a5821e7455e74daf60a7c legacy-trunk
+3262 c9d2f6bdaa69bd4f3232fe8ff5e75020548b9ed1 legacy-trunk
+3263 3dd7b8255619aa8244db36bcd9facc6057cf1fce legacy-trunk
+3264 ff1899dcda059ddcb30feccb7035b2eeef9b95a8 legacy-trunk
+3265 b757e58bc525c3984e7797608a29815641a493de legacy-trunk
+3266 30c26cf548049673528e4cd63878909aeab0b318 legacy-trunk
+3267 fcaafd5ec69563c0b7d080fd67e17ffb78d9bbdb legacy-trunk
+3268 4154e98d1478b92dfc40d8776cf21aef864aedaa legacy-trunk
+3269 6f2a6efd019e45f80751ce2bd0d70d8b4529a7db legacy-trunk
+3270 8ea546047f0116303a855f8e76d0805364a36ff6 legacy-trunk
+3271 91c186a216e7098c833e1141e2622344366b2ca6 legacy-trunk
+3272 7f8ddce884961d4b9352701520bdd7ef5f56cf57 legacy-trunk
+3273 e2f8077a926eec2b22de74a8c0213329c60c2a26 legacy-trunk
+3274 1d06b1499eb932f37a2d4f8700c2de83b5b96f30 legacy-trunk
+3275 de70d77b3eed74e0c10eba2845ab5598bf30317e legacy-trunk
+3276 8399e9aa03e7fe2e5674aa37bfbc9bd551d6bfa6 legacy-trunk
+3277 46d31a649ce66731acf71a9f3301331eb06a2244 legacy-trunk
+3278 c0aed5ee110bc7d3b1e1699f20deb94087ad2a76 legacy-trunk
+3279 c1ee60bd5de45aa7af046fa1f9621c113d255cd2 legacy-trunk
+3280 c26f5bec3438ad9ac965ead3c1c73f32738e77cc legacy-trunk
+3281 1a0be6e36818b8912a3ffa4284cfddb6118891a7 legacy-trunk
+3282 56636395724d49449cd13df955498cdf31b2db6f legacy-trunk
+3283 ff6e2173099ae3c85cf81f22afd1e1c22b355839 legacy-trunk
+3284 5e65b10dd24d39cd2acfcf76a79d4f1b1eb2a334 legacy-trunk
+3285 75b472ac5b7be32fd3670ae603e3b09a8b6a2558 legacy-trunk
+3286 94d12116756ac75a9287e56cea59fb2254edb11f legacy-trunk
+3287 091474c0831a7a272a2a7730b95fa0629ab34e36 legacy-trunk
+3288 dd70a3aad2665eabb52c8a536b0cd69c535b2fbd legacy-trunk
+3289 0ccb356e88b126f53dc3c0b38b0daac06d0bfef9 legacy-trunk
+3290 41fbd92bf1ad801a109b729c09fe70ec971c807e legacy-trunk
+3291 a7ba19120f54749f4f90b251915bb2dd87cb698a legacy-trunk
+3292 aa9ed3b9eda1ca34ae716b52050b0a8c7170f1ed legacy-trunk
+3293 b6cddfd348ba1a585ae8737d93440ef14e56eeb4 legacy-trunk
+3294 3e9ec85ac49b6ff55af60d18844799a5b4b75a3f legacy-trunk
+3295 e53baf9b4b9551e5588c2faf4891b543dafdb667 legacy-trunk
+3296 6461dac9a9f29777b0d7f48da9e885ad89e50f2a legacy-trunk
+3297 9add0e3e804a05987d4b8a667129289b8d21479a legacy-trunk
+3298 5112d432126b17570476f3cee53ebcbc566ea0de legacy-trunk
+3299 6231e1b5b22b7bead2001dc273388fd1d52da5cf legacy-trunk
+3300 e39309b9a0aa6d166bc09dd92476e8ade1bda3b9 legacy-trunk
+3301 b338262cd0807c4644f8f09056b8014c927839e4 legacy-trunk
+3302 950f01131403e158e35432bd895120be38bc4c56 legacy-trunk
+3303 f49e862feec4d9178d4242be52c026a8c5bfdc29 legacy-trunk
+3304 be89125643f25cf90160a29f14aff6f5beeabcfc legacy-trunk
+3305 54eb2cf2697e6e534e52826d35ba594a83901e36 legacy-trunk
+3306 e0877226d6138e0ed49130b4732e436d3846bc9d legacy-trunk
+3307 e5ce9d0408d0e56f7f41687d4850aee6f368ee6d legacy-trunk
+3308 f20de13226920d938a791110a6f47cc34e671c69 legacy-trunk
+3309 bb7665c448226fb98212ec56daad880ed8910f3b legacy-trunk
+3310 a416493d3a4c2f3b2471fb0b90d88d6c63c97302 legacy-trunk
+3311 3c6a52d2543dc2d052b05ccd1b3d02796571c2c5 legacy-trunk
+3312 fa62fb0e55b2d89bffff4680728aad3c29d56045 legacy-trunk
+3313 c72ecdb33af75791bc496beb8fc973add70aafcd legacy-trunk
+3314 8467b119350bebc6784d76954ff7287d6d8feaa4 legacy-trunk
+3315 194af04d344b0806b94e01322bb6d06a60145d26 legacy-trunk
+3316 65e4199a7982fb19ae1ef32b57aa17df311ae6a2 legacy-trunk
+3317 d4480c08444dc5b63646ef04d1843d6fc3bcf1d4 legacy-trunk
+3318 e82ac452d551dd7cf9523b7e0cd0a0a30c8762e8 legacy-trunk
+3319 29d2ef0c94b9504da8f8092564c7ab6a98182864 legacy-trunk
+3320 23eb27731d9cb32ad9a94b12ea688e424d74fe95 legacy-trunk
+3321 f0eb77abf24436bbcd746c903370694d721acf9c legacy-trunk
+3322 120518ef36e33a47c294aa9e19b6f5ff0b7d63b7 legacy-trunk
+3323 dedd44eb735b3f16512b4ecdf693eaa80f6d79af legacy-trunk
+3324 5244827dd423817a80ba56240b6e31ee119d8b3d legacy-trunk
+3325 9b7f90f9f3c152996eba6ce940b23aa781cfb93e legacy-trunk
+3326 fac62bcd3bb8de1cce3d69f31ce7f78a3e3a0673 legacy-trunk
+3327 eddc54b1d9ab8b675973c05fc84356190f534c4f legacy-trunk
+3328 f0784ae1ff5cacaf865dd6f3b14e05c552be07e7 legacy-trunk
+3329 d990c2b8a1e6d09b0406d7cb3b391d89af61c9db legacy-trunk
+3330 a7cf20c845a3a46e6c36553b17f55cc1515ec2fc legacy-trunk
+3331 a47e0c9baad008249cb8d5b76ae3c103232975e2 legacy-trunk
+3332 c01c95ef1fbda884b4002f8a3cbe1c1d3ca64998 legacy-trunk
+3333 5745e55f2e280f10984be892f31210b719a1e99d legacy-trunk
+3334 bb54ff41348f879be183f0a585ce7da8862959e1 legacy-trunk
+3335 9c1ae607d1353806eaabb7cb017c869575f22e74 legacy-trunk
+3336 e71b647fa3356f50cf4d2854d26a3d5ceda3afc2 legacy-trunk
+3337 955212ed52d37c747f976de15716c1098abb4d4d legacy-trunk
+3338 8604c3949809d5131f2ed310d7e0715b44838f41 legacy-trunk
+3339 717ea1767430bada821910f008f2f0a72c68d271 legacy-trunk
+3340 27154a2b9244027030ce8345ea83554cfdda6f5f legacy-trunk
+3341 533e36de1e4df6195c5fa57ce5f486b9beae193c legacy-trunk
+3342 f9bbb01388d5bf3cb8e71af413d3baeec3bceadc legacy-trunk
+3343 9ae65ee09735d0722a63db3882282aed1972a394 legacy-trunk
+3344 1d6cbeb27096272a9ced3815af1a0cb6116d22df legacy-trunk
+3345 950cd37fcddc5477dbcb08cf228c7f8001991a1e legacy-trunk
+3346 64cf191d21d08c9312f94a0e8af50d1e3c27f014 legacy-trunk
+3346 64cc5439e10a6fdf984effaf0141e94fa4cc1004 legacy-trunk
+3348 cf8ddb29e26edafaea0b50fb2f8b4ab8522e1239 legacy-trunk
+3349 0efef9785a25d7d9aae25ea12a00aa8416dac191 legacy-trunk
+3350 947f8a347c4f1789e8c8937e1d55f4a937789655 legacy-trunk
+3351 6a077c293986c0ad7971cbf4ce6c184607b86f6f legacy-trunk
+3352 584c4142c5379f3a537b27a9953c9062ef2caf5e legacy-trunk
+3353 847c4835628fa8f11b38fd289a712922e4603b37 legacy-trunk
+3354 ea8d4cce782bbfadf0e2c915c82db262f497ca1f legacy-trunk
+3355 38f0054f44a71c6f7901d5bf1045e5349ce73416 legacy-trunk
+3356 78428243feaa75209da7f996d80688a5a88da2fc legacy-trunk
+3357 b7aee799dc715ad1b84fafac35ea7755f9077b00 legacy-trunk
+3358 310532015a7d359bfe7760a55ac438b4ef1083b4 legacy-trunk
+3359 e120936a0c87f9515c14018abbe6ed1a1d7361f1 legacy-trunk
+3360 ce67d91adf5e7e065db35aa0dfdbd3459124ff73 legacy-trunk
+3361 675a02820d66e140e2a5583df629e82abe754f64 legacy-trunk
+3362 2937897a7d8b0387936084f424c69ab5a313a28f legacy-trunk
+3363 718f1d9bcb504f255cf7368197135a8adfd49495 legacy-trunk
+3364 e8223d0b72ac51960bf0931e96c02ac571c1d7b5 legacy-trunk
+3365 0d799d3c4036e7f8b1695037a3e72827165bb5cf legacy-trunk
+3366 d02221ebac2ad7c8b0918d79658aaddf65ded21b legacy-trunk
+3367 831d82aa4dd08189a18f02013795e8c3d25b1941 legacy-trunk
+3368 3573ef421bf41107bf7199e5eaf1b1b49c3c188e legacy-trunk
+3369 ecfbc246eeaa10c483435c7bd22f6801b63516a2 legacy-trunk
+3370 3d1f70879f030414badd989d2055d255ce3a09c0 legacy-trunk
+3371 b564bd4e57e13534497019556159d5f47cbb6989 legacy-trunk
+3372 9b14a4d892073c6089d82eb9dcbf438c90eb8bcc legacy-trunk
+3373 9fe783ca976e2f91afe760621c99f42c88ed3a5c legacy-trunk
+3374 bbef2473e568d292871810ec56bf4357cfd07af4 legacy-trunk
+3375 406860dfaac78b60814a8e76221caaeb06fcffb1 legacy-trunk
+3376 5a4109441eae00951258bc8ac601692eabfb081d legacy-trunk
+3377 fa6ce7f53aa5018a90e906fab26ddbf4470a8a6f legacy-trunk
+3378 416a8a886a82aa2d3f56ea9ce5c23984d79c038d legacy-trunk
+3379 9d6cf529bb71a7f4fe99759dd67770ffc0555bbd legacy-trunk
+3380 492f5e3e6495558d58c8b96fd5d80c367ca9813b legacy-trunk
+3381 1d7a4ed0c985f5ef82234bf5ffc984598c40b7fc legacy-trunk
+3382 51223ce95a6198661c9a2833208384c969c12ea4 legacy-trunk
+3383 64ec7bd2e83737a73fc88b8b303119e0dbc810c2 legacy-trunk
+3384 82f4a6a1964def61ed02416759b1227f4471ebf2 legacy-trunk
+3385 ad6d5c1ef5e61a29006eb58ffc288820ef14b32b legacy-trunk
+3386 ce7ae8f81b06182441338fb9065ed5c32da717b6 legacy-trunk
+3387 5ae4a8cf79ef33eb5c299733e3690803786c04d4 legacy-trunk
+3388 7e27659eb2d966981b9b92fe7ea7693276290548 legacy-trunk
+3389 2753e2c9aa21c9b6aa84e905692b906e9dd1bd1f legacy-trunk
+3390 0659b63d60447d6336eed2ca6994137722d0fdde legacy-trunk
+3391 2026ec00efdcf40c75cc0359c3cabfb3b2a3df2b legacy-trunk
+3392 f018d1d0e91a5df77b419923e9e77e2d002b137f legacy-trunk
+3393 dce7a4cbac112fee589a28837c322622b76b8cfc legacy-trunk
+3394 e0f7ff85fa065383771445cd3b10d4eaffd771ad legacy-trunk
+3395 2688f9bebd9a5a5caa6b54755c9c7e4d9b6b563a legacy-trunk
+3396 afcba88c6acb77defd8d9b87c4afd02ea893889e legacy-trunk
+3397 b3e6a435c48fe27bdcfe8c956ba70ceff402680c legacy-trunk
+3398 586c928c65d34de8b97e930370a25b16c0cf7578 legacy-trunk
+3399 87ed00a62d31013853c5f3d30804d639b9f6e972 legacy-trunk
+3400 680406c4153916ebb4d2bb1f43be98738e688e0e legacy-trunk
+3401 05580e00f41e2c75d79cfe6704e96b6d0815e70d legacy-trunk
+3402 d426c5d59254a50164d79782f535d41e53459eaf legacy-trunk
+3403 0c657db27dbf64f9f8884e70fb837f2336a3c309 legacy-trunk
+3404 e6034edc47ae5c2ed75a27e3c58f5690d1d6b321 unlabeled-1.9.2
+3405 5b8ec8f711cef107081ccfbc442f4565c0b0dd86 legacy-trunk
+3406 a7593ba99dcbabde24160e5a2f5e70b86be7fd7d legacy-trunk
+3407 e55724fbc2af7b0e116715393d56332c88ed338a legacy-trunk
+3408 8f246c89ddceb97ee77fe6efb90c9b77642f78f7 legacy-trunk
+3409 91a77087e83f21c4e52cca68734955187f50855c legacy-trunk
+3410 1a6ba23ae447acae0a5da94390ce7cab9498380c legacy-trunk
+3411 911b8017da46b6328f27c56dff1b3a361a561532 legacy-trunk
+3412 6b3b75f07cbb7b826e0b6173cdc4fe9ce9092703 legacy-trunk
+3413 78cb0accfb0cef29ffa007fc9438eba9479c686d legacy-trunk
+3414 91c1f94b17bc117a81bff6b1263e4c17bc51ef78 legacy-trunk
+3415 49a7a3c3d85089cf089428e596e56e5a3bed4bf0 legacy-trunk
+3416 ca1728c4bd78846f62df78072a670783693bff4e legacy-trunk
+3417 c4cd0d9d8281db53096500072ba047a1d7e8b44a legacy-trunk
+3418 685b31fe89c60d024a8da03cfae4f5da8100b719 legacy-trunk
+3419 bbcec24b243776d9ba42390b74d11414c17bf33f legacy-trunk
+3420 49630123a3f34037e8bbfa31cf5d7dd9bfbb2583 legacy-trunk
+3421 7aa9613ffd36313620e9d01d2b9df205669e0fef legacy-trunk
+3422 1cabc2b6c9701aea29bb506b593946e67bf7593a legacy-trunk
+3423 6b8688e6a7ed6ec5f6372369cbb76473fc1b7533 unlabeled-2.3.2
+3424 6d80e1f8f70a580b78907affa454fe51760ba023 legacy-trunk
+3425 45d7085211881959caa56cf2653001b23e1bf320 legacy-trunk
+3426 b120cdd30fbca591a4473bd11dc0e29bee1317ac legacy-trunk
+3427 2c515f07367ad4147e1aa39bbe37ed13c1e216cf legacy-trunk
+3428 f820e6917f07e5012bdd103ef97389318d5a10f8 legacy-trunk
+3429 65a1e4e9cd546c4e578730a88ddaf234be4d4042 legacy-trunk
+3430 6c58dc1d2f9d208a9106d4448c29a9a6b6c33814 legacy-trunk
+3431 1811e96080d4422deeb19f919deebc7b6d3f4be0 legacy-trunk
+3432 89e4b16661789cb368e48e3de911869e394fe102 legacy-trunk
+3433 d02ce30d7ddbc87bde633209fdafcb12bfae28b7 legacy-trunk
+3434 f5f73c9463a86d2679a6692472a7abd7e27a60cf legacy-trunk
+3435 28948181fb2f795f8effa561448636ab701445ec legacy-trunk
+3436 14369a5e61679364deeae9a9a0deedbd593a72e0 legacy-trunk
+3437 2919b448e3858a108e74b962b74809e1762af5bc legacy-trunk
+3438 7b7411f9b116f00c234a3286e26f3cfa66a0df71 legacy-trunk
+3439 69a066b6b1ff4af5116265d69a413d1bfc3adc88 legacy-trunk
+3440 2c74960d6afef136f9a8b4117f5e0ac5bce4c7ce legacy-trunk
+3441 bca71f2e2cb4ee664618d050c17ffd7f28016a39 legacy-trunk
+3442 f76b7ba99d3efb515237ed747bccb8de74442e59 legacy-trunk
+3443 87146dc1f79c5b7ce980af8af72bac1dccfcb9f0 legacy-trunk
+3444 3ca456f44bf3ef36a974dd75e8addb9c7b5b74e5 legacy-trunk
+3445 9e4206f64d1b5147fd07e327126b6c2bbe689e1f legacy-trunk
+3446 af27a8300d24094aafa6ee746de5567ba9bcc447 legacy-trunk
+3447 c60cb059c481e4a94d5946469d429a29aaff8b5d legacy-trunk
+3448 e0464e7115ca2bf9c80c95f446a6d64dff283f02 legacy-trunk
+3449 9181da406978c81ded1902b94a0cd962ad3190b9 legacy-trunk
+3450 dbce72afe261516d3563cd1720fac236968dca73 legacy-trunk
+3451 6d7fdec9d49e2843b47ae63450d609f343574659 legacy-trunk
+3452 33f3d7ebfcc1b01e7169b7630aedd576a8c67ad6 legacy-trunk
+3453 673dd9bbdbf1511ae90092701adf920a763a2630 legacy-trunk
+3454 9fed5726a36d7ce1355c30592838d93321d580ee legacy-trunk
+3455 4d292c7857d474fae5ec909edd434bced08b8364 legacy-trunk
+3456 7971fecbf28e7e1e098a797964a6dc003f9ec486 legacy-trunk
+3457 517d29ebc840de45b3c9456093d842a1b31c13bb legacy-trunk
+3458 57b80b98b8e50752ca4577043d847acdcea9095f legacy-trunk
+3459 ac3c80abbf4300349c5e6e338530b29ae0fa3604 legacy-trunk
+3460 67261c792f4c14fbcb13ffb0b51a836c2ad5130a legacy-trunk
+3461 4773d5c3b5a46de0f6cfdbc6c03c14d27e94885b legacy-trunk
+3462 c3d09f76d6bf438f9c7b13fc6b116f0bd5ef8391 legacy-trunk
+3463 9234c961ec43ca2857e381032670de9452a5c984 legacy-trunk
+3464 dea7442c5f87c6e1d0a09aef5b1b3eaa87288474 legacy-trunk
+3465 04a7f9bf1e672c4f7de527e889045e633d0d07ab legacy-trunk
+3466 c64af5671cc695e62b364d4320221f9a8d8f6e54 legacy-trunk
+3467 39c766a6ed5f9dab22964e91d125078d80f4594a legacy-trunk
+3468 cef514f9974c983bdfaf1e6ff62655bc699d411f legacy-trunk
+3469 bca7855d8e093f09f55cb0a0f2b910ab67fe32e4 legacy-trunk
+3470 209055e5e46a40d226cff5c46236c805c91267f4 legacy-trunk
+3471 6e37af3f261c39b92fe721dab4420b9c9741f51c legacy-trunk
+3472 99d9e7e9f3767e891400bd38b04be155da8b252c legacy-trunk
+3473 cff7c48fa9e15cec68059a75907abb442eeb3f5b legacy-trunk
+3474 1e8bd354b676112d8b3a84b872d727d9aa63e04e legacy-trunk
+3475 02c03afc513e95f3178e977ee20f365810838c79 legacy-trunk
+3476 747ce7e360844a33ec1b2aebbe88ba6540e0f2ad legacy-trunk
+3477 0830cf2be1d2c5927cc33ae42df8dc6d976e9768 legacy-trunk
+3478 2f691dc54bfa6a8855a642944eed748c629ea8d3 legacy-trunk
+3479 6ee380349c8490232977d51be2984fc56743d110 legacy-trunk
+3480 918bee90f73e1522e176641984915a82ffda1fb8 legacy-trunk
+3481 acdc0b9a6c7848a6937ab79cff4d90a558dd89c5 legacy-trunk
+3482 2f3f293ef5f15597690070cde9511e9488b7de51 legacy-trunk
+3483 ec312b647fcbfa898fdda97494b763cc8cd6bc30 legacy-trunk
+3484 92e6a8cf14bee65565ef8ad6e9bb19fd878d9351 legacy-trunk
+3485 cd397266dc1c8e1e18d02f8d9fe934257eb3609d legacy-trunk
+3486 78742b3fdd44ba90e27c3e9e1ac9e4fbc296153d unlabeled-2.16.2
+3487 907c3996b15c2c8554b0421c3c19e69befe2548d legacy-trunk
+3488 a80677798f84204b1f83560cf108e614bab985a8 legacy-trunk
+3489 f3c907efe5d710202be68f6dd45a58a2b8326a86 legacy-trunk
+3490 fe76585c748e8ea3d82da866ce6b6e2a061963c6 legacy-trunk
+3491 716be765a79b2bc6d32d613ee39097150a7bc6bd legacy-trunk
+3492 25d1c993255822a07376a4b6722b6be8656208bf legacy-trunk
+3493 e5d363540179f9e6c97f1a8eef1c1d28ae778956 legacy-trunk
+3494 8a3574a07b185d5bc2cd0d399398ceace74cba4e legacy-trunk
+3495 e2deca9830082b7039cd84b57c801c14c9da3dc8 legacy-trunk
+3496 519c25039c6a4588a7ddecf2aaa0ae38e4e830d8 legacy-trunk
+3497 409ea74feb217c24c944c73c419fd363a25ca276 legacy-trunk
+3498 07900834cc97d1b8df1c37a781fc4c1c9b82525c legacy-trunk
+3499 e5fb9cdbe0507bb31f463be2c4a1064246a37ebf legacy-trunk
+3499 78a7ed6953025e7ecdde9585099b01a6ae40b76a legacy-trunk
+3501 f3848f74b282799f34a038d1a28dca88c7ce688e legacy-trunk
+3502 4192e24ec562d1e09b388cee72b81b207cdf839d legacy-trunk
+3503 c44545e595a15cc0b218613bcd1ea2ddb0f3d43f legacy-trunk
+3504 f8f64cbd9fb5a19bb00651b9f547483aab929c63 legacy-trunk
+3505 aab30b74cf6a8df276111d7794e43744592d5197 legacy-trunk
+3506 d207beedc86d68bbf3d9ed9ac2e6d426b3492ec3 legacy-trunk
+3507 668853d7b64bcba44099649832bc1b081aa7eb88 legacy-trunk
+3508 13d0fde4883263bc6d525ac63689a558bf206303 legacy-trunk
+3509 f3791c4fb7247b08ed6161bdb58a968ddc06d11c legacy-trunk
+3510 d0a5c300eaaf5ec3c101e89ff312714a4c13bd06 legacy-trunk
+3511 2798d8603bf02873de8050eac5c8d27340e9ef05 legacy-trunk
+3512 f41433c98c5eb02e88cae9998d93c2b87c9394c7 legacy-trunk
+3513 5d0b2781e23b40af57ac812c5e5b2f4c4ad94f20 legacy-trunk
+3514 a22a350d3a5dd3cd024d68cacd25f3b916c85bba legacy-trunk
+3515 5efa76ca17f2ed128c6823327058c8a37b9c4435 legacy-trunk
+3516 a3a027c49eb13c0680e33f117b1e5d8324dc4235 legacy-trunk
+3517 d9cb55ef34e2e504b10fea0d84179205d78902e8 legacy-trunk
+3518 e149c77d173caadc02dfb7b5f547b24b724f92e6 legacy-trunk
+3519 4d1a15fc4748d6d90d4cebe56210af4c48cba90b legacy-trunk
+3520 a6355c83578d8d3e8ef98e49e08e61fa956b944f legacy-trunk
+3521 fccd415e2eb8cd0aa5c1aa3fc186e1cfa378895a legacy-trunk
+3522 2b54ccc852e404a4172bc7eecc88ee10095a9b9a legacy-trunk
+3523 043da19302ef244bf5721f2186ca279bcbcd9a05 legacy-trunk
+3524 2fac209e1c3f552212d296e157251528e44d3048 legacy-trunk
+3525 3e33ca54fbdc1c3261dd8d680df1d5fa3f06ad7e legacy-trunk
+3526 5d74a987358967450d192be08d259cdae9dc2003 legacy-trunk
+3527 1808ca5d8883097c72c6a8a89143041c20ea13c1 legacy-trunk
+3528 7cd533cf194a9dbeae90b8768ff5dd2ee33bf3a8 legacy-trunk
+3529 560407ec632b9f6fcebf89755f383d1eb472e4aa legacy-trunk
+3530 e1c473f929c472647f0210fa68bfc68a9050230d legacy-trunk
+3531 132602d854d8c40f4e493e9faa46f627ec641106 legacy-trunk
+3532 a5fc104849aa21f6321f5d997e3a37fb65a7d9d3 legacy-trunk
+3533 287fc32c1d9c3fb2f221dcb056a253929be307ca legacy-trunk
+3534 ee4a2f893254dd40e01c27dcb61a538d393470e3 legacy-trunk
+3535 4c8e5fcb330159df378f37b583289fafaa5d9da9 legacy-trunk
+3536 89e1e5d9ccbf03d94850f216c419d4c158c56585 legacy-trunk
+3537 f9e5a28236777e50a32f10db193890b19af42cb8 legacy-trunk
+3538 faaf3843b8bd5d1a6fb7c3357a0e488030a064ed legacy-trunk
+3539 f7c606103dd5ed1eea3e5733eef17556131008e4 legacy-trunk
+3540 7be7a7e0c465e76e8d97e5459d5fe638ecf5cfe5 legacy-trunk
+3541 89d7d5e136addce7b58e7875ee28c4f26ddd3ff9 legacy-trunk
+3542 f3a325662d39c62b08cb041b4d307793589b5a78 legacy-trunk
+3543 105d332c277c6519a12836e29ef3519f9b86caaa legacy-trunk
+3544 3543ce88a31ed85f2b1da52e29823024dc562a35 legacy-trunk
+3545 b03d00e24c3c1a057f83c457e7f7a625dcb3c2f5 legacy-trunk
+3546 710c6b13e875083a642ed4e42efe68f938a6d414 legacy-trunk
+3547 a4aa83012af3b23faaec2c09aa0a6e9516768b2c legacy-trunk
+3548 c02b3fe0b33c259efcdf1f82369af64118150ca5 legacy-trunk
+3549 a0a0c76f6ef6a8cb57e8cd7407b001e389efae1e legacy-trunk
+3550 ae4e90fa8bca521894b708a9e04d00e455422b03 legacy-trunk
+3551 b2c7aabfa913b9bb2f9f31785b1ef649a2f52943 legacy-trunk
+3552 158f0d9cdd40f535da8f587121ae7134ed608b50 legacy-trunk
+3553 5a30a4e056e7cc37d72f10ade12340c84a882964 legacy-trunk
+3554 f992ac2a38d5c7f3fc5a47307b60edb338d733f4 legacy-trunk
+3555 dce3c30cd72787a743db7a87e461697b299fbd64 legacy-trunk
+3556 e99c22490bfbd4e175ab0946e0d7c997f8f3edd7 legacy-trunk
+3557 cffe8d6b2f09b7eed1867bd739305a76f4091ccd legacy-trunk
+3558 7c3245c186774b8444540bef6d5393a360196ed3 legacy-trunk
+3559 0ffff40d13ff470e391e8719cd25abc53e3554b0 legacy-trunk
+3560 7d6a2d950f13c740785c4faf20331b56aa61bfff legacy-trunk
+3561 98f51f61cb4b76aff77d5d0bc2eab5a9d369be4e legacy-trunk
+3562 4229275dec326103a8db4867c873735b260c64ae unlabeled-2.10.2
+3563 be61e072a505b9ecb0f97f7e1b0d08a9fee1cd2c legacy-trunk
+3564 4a286b300b5efcaf281fdbe8b5326b19ad98fcc8 legacy-trunk
+3565 1ce2c0f565ef3e6baf444c828ff729209bc9d13b legacy-trunk
+3566 1d841587aedeb071a9a58a29c870ac8e118aff77 legacy-trunk
+3567 cc172ce05561af16aa05b215a07d51f2cbbcc7d3 legacy-trunk
+3568 aac8231a715c7ce4877eae6fbc981edb7bc327e6 legacy-trunk
+3569 cd5989a58bcfe0320ddd2b14c469f7c2b5a4c491 legacy-trunk
+3570 af4e271d07b1dd2ee5a706cdbea6ebebf94d82ed legacy-trunk
+3571 6278933d02e38bb8abddbc754673f79617d1bf88 legacy-trunk
+3572 c814937880cc3cc00676082cc8a9b4a4e5e9d78c legacy-trunk
+3573 90c5e2bb4da55bede6e7d8de44e6a2b0bcde11cd legacy-trunk
+3574 474823e5f7dc13b96d5fd8eb9c809cce8aa90467 legacy-trunk
+3575 a58c061b4f55525177d67a152e7e0f8f93f4fea7 unlabeled-2.1.2
+3576 2e0a8a3eef4a8f975b0c12671352d12577d636bb unlabeled-2.1.4
+3577 b9fcfb99a3e54b6f7663508d10e0d808781b9f7c legacy-trunk
+3578 18df674539da55305f6d26c2dd460306a0ff2c33 legacy-trunk
+3579 f5b1ddfddba833b31b6aaf61d8113049f0423485 legacy-trunk
+3580 315272ec4d5b63d5ed2e5f5f03c8fa11ffcd630b legacy-trunk
+3581 1691ea5d9d4b5b344197a336c7321c5ea3be9265 legacy-trunk
+3582 00f1e8864dccdfe614d24b3ec3445f3e4acbc91d legacy-trunk
+3583 c914b10bf2ed775c032d74f5ae45e0476600ba24 legacy-trunk
+3584 2491774e36a90cbb5cfe263432b1a76d2d3aa119 unlabeled-2.25.2
+3585 f55031d549b79a6beb07c30be1df53fe473449ec unlabeled-2.25.4
+3586 ed522c948d428c37ae0e9d58e4c9e98506dc7619 unlabeled-2.9.2
+3587 cadeb79c132f5502ceff923120207660d9b2572b unlabeled-2.9.4
+3588 2852edb4fffe0ec37895f0314123e0845f8ec0cd legacy-trunk
+3589 06570429f062d314d0b86822d1a3ccda5346e20e legacy-trunk
+3590 d6f6a1cb7d79e9b198fc1583b2869c9e9f400815 legacy-trunk
+3591 f7edfa6d0dcba4872bf4084f6b574d3ea118dd34 legacy-trunk
+3592 b1bb74a2b5930e9b4fc78e9b55f669159212abd0 legacy-trunk
+3593 204001dddcc32e38e13698d8d2dd594cc6d2588b legacy-trunk
+3594 d2f98beec85cf224c88298a0db6de95d7c29e407 legacy-trunk
+3595 fe7298813f1714b47fa2b9306706ff35f83aa4d7 legacy-trunk
+3596 8a90c9bbbdf0c9d71a834c2f3919ac040512de75 legacy-trunk
+3597 0b32ec8a3e20821e648ee1e5ca9139187d006bc7 legacy-trunk
+3598 a2f2a8bd56f9bff1a521a6cc6ed9d05f2047c750 legacy-trunk
+3599 72bddfad351a9a220db24504daba0a68bad828f1 legacy-trunk
+3600 c887a1f305255d1abfa6fe6aefea68f3e6d6d1ec legacy-trunk
+3601 8701b93383ab1dde918eb7c6cd6f02e53b95b905 legacy-trunk
+3602 f7a752fb7b737d1f0e9cb45a8b021276b896622b legacy-trunk
+3603 ada56b0765c1672d9ded807f63165c7785b54505 legacy-trunk
+3604 9c707d8cf0c8d16e6d869efb63a6e83881def77c legacy-trunk
+3605 d7168cc2be07833d0a15a06fa94746c5933f1902 legacy-trunk
+3606 640c36b64dea1cf72fee41f5119c06d534848311 legacy-trunk
+3607 5cae7653171b44a19d65ab6138f7181541cf67c4 legacy-trunk
+3608 46c217337bde4f549989014e2fafa78646d13a12 legacy-trunk
+3609 560ec70308177b4391afa171d604df31e7e3440c legacy-trunk
+3610 89a5ce19d13af208ea12f5e6e001df0c24a7a5dc legacy-trunk
+3611 e499116d45e4919dc46d752b3849682de87dd25b legacy-trunk
+3612 d7e3842b2e7b10fffb04f41ebceac7015012916f legacy-trunk
+3613 e46322a31f622ba1c9d0449bfd0f7da3a1dd608c legacy-trunk
+3614 d82c2ba4f8187b500be6dd604dc7ee3fc08e6b0f legacy-trunk
+3615 cd382456c572bbaa20553e9b11124a3ed16e70c5 legacy-trunk
+3616 28cceabf8ccec682ac67318c23cd8873d1f78b3f unlabeled-2.36.2
+3617 cbf28d65469f506248b32ac4c22b83416d613a78 unlabeled-2.36.4
+3618 4749c957466b77f1080199ec6d970f3867caca17 legacy-trunk
+3619 2ec08a9d032552106cbbbea6cd0a018bdaf79020 legacy-trunk
+3620 f2d04054c9346a3645f6d153ffcc85d3fa52c66d legacy-trunk
+3621 91338067f7501e3e1d9d638845bafba9f796ace8 legacy-trunk
+3622 9fb0f1afb34cd3a87fc3404b003b4b6e399e2e53 legacy-trunk
+3623 4ff608c4cacae0c1474b49f48b45b39d73f39c25 legacy-trunk
+3624 328f446d20167606f8d262c0434a108b55acc249 legacy-trunk
+3625 ae93ec4dd556369bafab39c4e0a8653dc77414f2 legacy-trunk
+3626 d8ca0e913c4442a6b4cd6322326895d7644a9dc8 legacy-trunk
+3627 a8932a4b9624d9bbd25549d2a526c105999a3cb6 legacy-trunk
+3628 a5a4654c33be5b39776194036196e332e499ae88 legacy-trunk
+3629 d773a5f89426879db2febd2598912331cd8bf33e legacy-trunk
+3630 3a5f2f110f7062b9e26512cfed49ac02ae624b86 legacy-trunk
+3632 50101eb6311b077c9d96733694242a41f87f886e alpha100
+3633 b18eb2f4af0cf3c592ec23c6ff37c68e965081ce alpha100
+3634 1cea9d80a2bc1ce4b1e1f608fd26d3005dcbf4f4 alpha100
+3635 d9d21382c73b92c181a02ca3a042094af233a393 alpha100
+3636 5b970047a722c16e126f72e05f51ca4dd29555a8 legacy-trunk
+3636 ef73d40a827951c9da7a32cc8dbe38600ffec7db alpha100
+3637 292c5e79264df2668256c69e4e84be9d05f961fc alpha100
+3637 d8cdac8fdc7450be1be1622865497d4aa0b2dca0 unlabeled-2.25.2
+3637 8b08a36676d4eda47e1da7696e4b228123193f3b unlabeled-2.36.2
+3637 19fa01c9faf3976378f654bb4fa7cd3db2882a4d legacy-trunk
+3637 8eef211555c6d35f4d29c9dc774a249bd1c74cd0 unlabeled-1.5.2
+3637 0ca653d677d349743c29c1ae2212a8dcb57293cd unlabeled-2.9.2
+3638 607b19ae1e13a3220506e85c2887ff749c64f550 unlabeled-1.2.2
+3639 31f1b987cdf82cbcb38f50108a0af08379d831f3 alpha100
+3640 d96199be74e6a448cc9540bd96b9f1e4c9f415d6 alpha100
+3641 f8d3ff6639b59670dc1132d9e8dce5d8cc95fec9 alpha100
+3642 a79b024397f87c718a2a31bdf23dd96de028eb79 alpha100
+3643 5ce40462ae99aed94eb50f818c2c4ecb2772920a alpha100
+3643 b8580e32046c1b6939ceab8e9392eee880f2e4ae unlabeled-2.1.2
+3644 08d4da48dcd5887420812712420fe17f3017572d legacy-trunk
+3645 d8ba3cf9dabca978ff565f361900718a5bc87448 legacy-trunk
+3646 1f8c64849203480015755db5389dd245bdebb2b7 unlabeled-1.3.2
+3647 6c06769a8869b0ddfac74a980e8695525894b46b legacy-trunk
+3648 25c112b3c957ee191525ac547d807d9d0079b588 legacy-trunk
+3649 109d39dec12886be3c0ccdd7eb63e49edaafc3cb legacy-trunk
+3650 5f3d6e4b5503d51ea1cb2242ad717ef57170e916 legacy-trunk
+3651 305748ebab43724525ba4df9e7f0ad3fb96195a9 legacy-trunk
+3652 4dc7b15b6b970daade1e378e733e7f8c2ebd60d0 legacy-trunk
+3653 c8a95c170e1ed873407345b91a5a6c84333894f0 legacy-trunk
+3654 ed36b3e9cd7865ac6b511e0d48ee50a05e2edd59 legacy-trunk
+3655 63eb6c75092757d2004007972a1e42091a06ed41 alpha100
+3656 19c98f20a9b83a31cb489bcacb12287a2f189a73 legacy-trunk
+3656 08cd8b96b6bfc278b66ed411d3b9d7b634b8991f alpha100
+3657 6bce33d7f0d112f4ddb396ee9511af6769231217 legacy-trunk
+3657 f5336d86f58b8d9a4e034fd4bce1d0a3ffcd4dad alpha100
+3658 3059218f630bd8ec0f26b122ee38be756ec791a6 legacy-trunk
+3659 7738ce95ba4dca9cd8eb5ecd3a2bcde0aef05e54 unlabeled-1.9.2
+3659 838aa1406eeaef83216e04490bdbfba31a61211c alpha100
+3659 2430a8602a65d13695366accecf9649d754a2b8e unlabeled-2.16.2
+3659 b4f815f3cf3e108fc97cf0f28b87fabc3850e612 unlabeled-2.25.4
+3659 d0187658cf0b3bb6f449cdc2d8b0e1d9d9186a50 unlabeled-2.1.4
+3659 612c76aac3aa89e86f5e4eccf983b34ced0a2971 unlabeled-2.36.4
+3659 313d9b9309409eddd62b9784e706cd474fcca304 unlabeled-2.10.2
+3659 8dc2cf3145b3bbba53a7bdc5d1fe3c6eb9839683 unlabeled-2.9.4
+3659 51eefc054aff8ba3be18edeccd927b12102d196b unlabeled-1.5.4
+3659 af667c6d2072211194dcc49cecceaf1ebbd1de76 unlabeled-2.3.2
+3660 d4705d7066329248900cf9c62571a22022a7d6d7 legacy-trunk
+3660 1dca33eb2d7a537df14ab383569883f55de9975d unlabeled-1.2.2
+3660 8f44e4310414b6d95785a9fe379563142abaf7b1 unlabeled-1.3.2
+3661 dccef1cbda5a06dc8f179af7c9dd7772227ae69f alpha100
+3662 2ec96140a36b488345a3c1a1ce8fbe40c3b3b265 legacy-trunk
+3662 4aa91fd697154796ca1ed1a85a56cc59cb3d3f86 alpha100
+3663 c751cbeee6882fb3046cba1669906a95f36a5728 legacy-trunk
+3664 23561dc7b15f5e83200aa5fc045ac4d11cad8e9a alpha100
+3665 e560b3342405b3277b4dfdc6b003802277d1ee0f alpha100
+3666 0eb0efc51d9b37c48fa6c39433b7ae28e2468e7b alpha100
+3667 c32e1020468dff84291579ca9dc59c1ab6781eff alpha100
+3668 e263a72a76fe9d6a1ac01e233b485242776789ee alpha100
+3669 93d1297178cbe785f0b255121aab2cecf7ea2148 legacy-trunk
+3670 98c559fd6e2a92a4e5c09ea6b317e29b02de9632 alpha100
+3671 cba1096da55311dd62b69c0bbb80270a0c1899fc alpha100
+3672 2064b16709f2ce5f90f6f84b84ee051bb1ec50b6 legacy-trunk
+3672 345d57bec269d7bfd6f26e7251569ca2cd3cfb53 alpha100
+3673 f86f651c707f410b02901f98e5e47be5775b199d alpha100
+3674 2cb076ae89272179101e6a1eb3f32e70ca867fe5 legacy-trunk
+3674 ebf72880355f18263d1f871d5d04332cd17116de alpha100
+3675 3fe7582b9636df2d43c4794cef1c6aeb6dbade25 alpha100
+3676 48141e68b3698322fc037d1443d81854a107f405 legacy-trunk
+3677 d8366458d1066d1c04a302a871b4889521053305 alpha100
+3678 2be804966147698b4147a94fedeabba098fb7803 unlabeled-1.1.2
+3679 f2f163c09959b3e752267163cad278322a94c995 legacy-trunk
+3679 b66c6e2a6e06fa342e048ad02362d4fa8e18da32 unlabeled-1.1.2
+3679 fec2cf8d6e7799949b06d33102fe26d9e6d77746 alpha100
+3680 870751fb09ebfd5930928592f58b59a2a9923583 alpha100
+3681 0def94f80b38497486833d9aaf7099fb2f5ccb49 alpha100
+3682 24d65653e2ac9d4462cc384022000a619cadbe17 legacy-trunk
+3682 1c4e2d620b1638261297b5fbc3b86142d8065979 alpha100
+3683 d03cea6c0795d4d986c7737f644c3269a3e550db legacy-trunk
+3683 438533b341a6d5699c035e655dba029aad97b4e6 alpha100
+3684 e337624c3ea370535401e3b8a32a917f5e3cd39a alpha100
+3685 3d5d4c9ed19dd8695e9f547dcd6c0bd41c1edb6e alpha100
+3686 b80f1dc96c1a56b3c43b4079f7873003f3dc73e9 legacy-trunk
+3687 eab0196a8d838e72c9cc04f8965bb15274b931f3 legacy-trunk
+3688 b5b1f38befa48da0a8661d4bad18a8c973fcbe37 legacy-trunk
+3689 550e2605958b16e641565777c109f35daabdca36 legacy-trunk
+3690 2ddea8e6dd20b0fb7bef30222ea3a06aec742799 legacy-trunk
+3690 3559b090670eec9fd1b697a9f90f1179094f5650 alpha100
+3691 61a723fa2538c755e4f57a5043d156a2a73133a0 alpha100
+3692 9f3e2e931b4b93fd5b6ed4ec8383a5c8e223e712 alpha100
+3693 5781aaf9ccd35f71d0090c5d824a35f68ab98b7a alpha100
+3694 5019d03d71920b916d26654967c6d671e2ba2509 alpha100
+3695 224c6bd92ceb4540d74fe23094f2348891d16220 alpha100
+3696 8d6d85359fa3b9cdd10c8aabda469572bff31596 legacy-trunk
+3697 e5fa8979b9e66824120e9769276f4edfc4d0255f alpha100
+3698 0a6bee4b6b17518beff90e1b40317e31f79b3e4e alpha100
+3699 2ae02f0d9e6b0a6d4087dcdabba97d49073c0c97 alpha100
+3700 2d4bd8cc404200fa7255cbe5a0c75066b22c68c9 alpha100
+3701 4f8960c78141dbc374027c5e88b7fab44f85a0e0 alpha100
+3702 758717f850f2aa37e5936360d3d43ee6ce41230c alpha100
+3703 05014e0d33ec581645dad04ec4b19380bef8f4d7 alpha100
+3704 76bc6d748890d87a99046fa56e01630356a5321d legacy-trunk
+3705 e53ed67459f56d7346a1e2b3fd9973ea8bd80367 alpha100
+3706 0c8b1812f0b69d91e38b07ec3805a966fd5e384b alpha100
+3707 10ad8bef9f43db75e98aada414dff8de7bec578f alpha100
+3708 a9091c498b101e5823524c8ffd3653542b1b0224 alpha100
+3709 627bc422a9028681f0eebf319efa16ba64166d4c legacy-trunk
+3709 8b3a727dc71b3ac3e99d03b7b4cdf5ab3101ace0 alpha100
+3710 272e2c64b74dbbb89853cb1542ca5d4934430643 alpha100
+3711 6dfb84adfe43119a9a7e121c08cb0bc766d6f081 alpha100
+3712 6b6300cc464e5a4bc1670b7a7259eaaa0d85bd8d alpha100
+3713 50fab233f40421302a4e2c20c03966f4e83cfbf2 alpha100
+3714 3d19ca40eb82dfd2e8f5ad2d6a95b9690fe7f3fb legacy-trunk
+3714 925c952830ce26ebba68b24b3292dcf81c3d357a unlabeled-1.1.2
+3714 627d644bc6c177f9a6ef49553c42375dc9c06306 alpha100
+3715 9637c049617d3376d4ee5177d891f60e236bc175 legacy-trunk
+3716 ed75992177e831719b068dc6ef98c09e5aeeadee legacy-trunk
+3717 29927f0386a69e83e9ac22f0f5afc893b54bd960 alpha100
+3718 c62a6da7feac3d7a5179dd139040b9ae21993400 legacy-trunk
+3719 a5256061f3a00f76ae24c5181e260801ed553e3a alpha100
+3720 5fd55a6ac76e837c3009856a33666a5732604f9d legacy-trunk
+3720 32865c89cf12e63d84445d870c7d2264004866e0 alpha100
+3721 e183502fb5bc6f5c3a6346aec08a590f9fe729c1 legacy-trunk
+3721 fdbd3954fef00b446a41178a5f7620cc0561c756 alpha100
+3722 5e92b132e70fa32b7ba1d4164ea5ed777202321f alpha100
+3723 d0bb07d4c6feb8d2b30ad408fe958a03a0e4c21c alpha100
+3724 7453e2ba5362a443216ea98eb6f00817b8adeb46 legacy-trunk
+3724 aa472e917f6c2339f440148184a9f42df54be371 alpha100
+3725 877073b9f8c3254a83250b2564efc65c9f1abaab legacy-trunk
+3726 e4ef1b17da3dbc5b9bc21f1a0c6a027d6ba4531a alpha100
+3727 cc3119164d5c2f365ec7206c99435655329f5ba5 legacy-trunk
+3727 abc2f9814cc96855eaecf085fe6f108a3eace1f5 alpha100
+3728 944cc7c64e7cdd96105730d0c1da599cfb50a79a alpha100
+3729 9f288cb56ab51f7aa48f4d37f6784b51f87e77d7 alpha100
+3730 a6ebb68db34eb5161fd31f9568d1cecdf3da0e71 legacy-trunk
+3730 77e0ea60796ae484bcda6ef96032d02e1121c5ed alpha100
+3731 a75f70ca1be0a64c3e719159d93d5dba03ffa362 legacy-trunk
+3732 f520b9c7ae6f65db107a80c8cec13684ee66c1e4 legacy-trunk
+3733 568c606a0e311b65479d6c1ab8a7b08b8005fa41 alpha100
+3734 1f7dad576a851d1b1f6cad22ba267dd62e7b566b legacy-trunk
+3734 204b7e793c15b4bd1d40ade5656a5edfedadcae7 alpha100
+3735 783ef361f39515a8aef55695833e3ac4109e37aa legacy-trunk
+3736 8965ef4eb399ac476dcbfeba7ba431aa5d9a6eea legacy-trunk
+3737 3664cb88a03008edbcc7f97484e8558d1843b6b7 legacy-trunk
+3738 523d421188b93a537ab3b247110229b8b26f694c legacy-trunk
+3739 aee55d969a12241a78dd17dee06ac72812bcc9ac legacy-trunk
+3740 ef082c1072a7115dbfc3036ec63fcdf1b89a5c79 legacy-trunk
+3741 5b255a3588330b588c0cd85b1762de65dc37de27 legacy-trunk
+3742 939a95f3dcdea431b838bbdb3b32abcbbc01f6ca legacy-trunk
+3743 be6800a6019b4d421470cc5982cf529f6319f190 alpha100
+3744 3642c64472c078a69b3d8eff3fce96315bb2daa6 alpha100
+3745 3648edd343eb44c6410dddd8824d0479b0305f17 alpha100
+3746 6d24b99dc881b8f3761dc0f7ecb4e9fe2db8cf5f alpha100
+3747 c8b714b9bc5ab2b5cf6017c22015c8d5b307f2f5 alpha100
+3748 5994949a7ee9db401b9e6cb51d04e7d33054fca8 alpha100
+3749 1e2694a0693988be409697390eff6a05c76215d7 legacy-trunk
+3749 91bad376b4bce5eb46c2385d212e34ec654ea01c unlabeled-1.1.2
+3749 2ea813aa2602fc956481e4fde8796f35cbd21b13 alpha100
+3750 f9adb89f20016a9fa645800567e4202c0c52a4d0 alpha100
+3751 fa9e4db7911da9ffc063ae83be559b8ec09f2d9f alpha100
+3752 c5ce358400130a9cc9364c9bd216f195d9f667e7 alpha100
+3753 07267ed13713592c03297b04025e096635600e89 alpha100
+3754 1f841780efc23eede0774b603e61b888c0197bf4 alpha100
+3755 27f395afe60f6966de735d73fe37e1abd63e3bbd alpha100
+3756 fdbd898bc1fe62d8479baa1998b46b882071b0f5 alpha100
+3757 44863c49a436bfa308d092534ff6474a490a7772 legacy-trunk
+3757 a1aee7699bea654e4dfdf95f1f13d559b2e2bbf2 alpha100
+3758 4a722962fb697094653e220c6dc4f87923bc476d alpha100
+3759 7539ccb77d288aa8e6aec2ec6845a4d80457cf1d alpha100
+3760 3336cdcd4a5ff6c76b10178d60cda44d9d8cb5b3 alpha100
+3761 472a347bafccc49813a70dee3c92811201544282 alpha100
+3762 130b04fc54dcc6998e20bb2a149cdece1976158f legacy-trunk
+3763 ed4c116b58934e8283651906da5c640fa91f3c48 legacy-trunk
+3763 811ef6ed4ca1bb4c321c67e2ddfd4397e548d771 alpha100
+3764 3bb788a1dda046dce5a55230a984e19742a1c1fb alpha100
+3765 2bba188c6adade36b75db41c1a2c6fe5aef28d45 legacy-trunk
+3766 061062f8a9bfd7db1b4d6314c472b33c288c7093 alpha100
+3767 090d0cd961af1750ef8de68e559f0b99d381f91d legacy-trunk
+3767 c23c1ac92208243e434811f9dd19cc7ffb152e66 alpha100
+3768 35db6fca4df4d72ec2bff78e92b0b34c98f25e63 alpha100
+3769 081732c6c11298d0a05fc1a7d0a24a270881138f legacy-trunk
+3769 c579875b298078e57cc5b167b3bdde22766212e8 unlabeled-1.1.2
+3769 74819040e72657916fb40ba4ba6acf0e96a00222 alpha100
+3770 09a2a661e8c05121bdab9acb2487b2e2485c87aa legacy-trunk
+3770 5f0f8bf7b35ced5e3395407f8e58ae3456d0fe8a unlabeled-1.1.2
+3770 9b4f9e821fd46eb71112d931c4429eac464149ad alpha100
+3771 7c3fbc97f946770eac40d52f5ba48e6cce77b723 alpha100
+3772 bc5c92508f56030120eef0d18112340d51d63b8f legacy-trunk
+3773 dcc95a137a6f91ce95611efd9ad38a406b82aeb6 alpha100
+3774 3b6f950530436080b7833a42bd831e2dc69f3689 alpha100
+3775 e210a4a3d9f0c86aabb8c56114ae5c61785bbd33 legacy-trunk
+3775 1ff37ff6aff4e4d6b5b12e187a34cdc597fa7464 alpha100
+3776 a27d6ec3fd4a5999f6200ed791f4ac832904d069 alpha100
+3777 d68f6cc2611ece323d72016d152471871817e8c7 alpha100
+3778 f5c1979bea7cd5c2ca2badf3b84de9eb3f4c1c72 alpha100
+3779 56cbfdf37254c9e0857ad1cdde1d65fe3cc2daca alpha100
+3780 c2868ef28bee2b2f1d2bec9f3024270a0c2eaf18 alpha100
+3781 1a8e90a37357bae7b4aba922f1f0ab33bfdcef6f legacy-trunk
+3782 8e97a68b2b17d01dac74586344fb068cec8f8e69 legacy-trunk
+3783 bdbe6d8a7a8f86fbca2b7e0abeb9ac7f502895cc legacy-trunk
+3783 a4f6ba2e47ffd633a256d27857a989dc0505a2ff alpha100
+3784 978195658e9a37e20b9c2096af36174849b4103c alpha100
+3785 09420e2e938845a0d5aeffe93ad4944bff9b4131 legacy-trunk
+3786 e45948e2b66ce485ade4932a9da54fe9655f8553 alpha100
+3787 dd6ea167f2bd1b741c70fe886b92a508d3f2330f legacy-trunk
+3788 0f88f965bff27c88675819720ab0c7e52e0511d8 alpha100
+3789 338fe58b2c6773858ea022f45ae329b087b17449 alpha100
+3790 147e99198838cc67fb810d811de81b0b2b6e0ac2 legacy-trunk
+3790 20fbd0434fb634dfc00b77aaa3db33c4f63c6c47 alpha100
+3791 76891d0cd5fdac1e45104e3289cf8b7ab024b9a5 alpha100
+3792 dc8aed8b204d18ffd792415ef64d62999052b23a legacy-trunk
+3793 8b908e9939757dc35129101358cc24af33a1c832 alpha100
+3794 88ba5d17f30a0f53abfc3671c17b3e41c4bde4e7 alpha100
+3795 5d5eb76bb278aa6c15a29244e776d2ee6e5d95f0 legacy-trunk
+3795 07e4c5726f785678a4f88381bf5865c95432763b alpha100
+3796 bba80088a044a33879063944d9bd4a7f1cfabea5 alpha100
+3797 c23ccaec9249325d3c3f09dab9495ec9698b24ef alpha100
+3798 0368ef49ff4c61740c163aaa67298c6786e91a40 alpha100
+3799 53ecced2f2b2a184f2361f0c9b91ac02f3c1b92e legacy-trunk
+3799 7ce412295ca3cab5a42facdeabf220fb8f1052d3 alpha100
+3800 97c5e607b79773267d288af805c335aeb491c738 legacy-trunk
+3800 8d8b7dc99982e361d685bb03f51304a2c7fa58d8 alpha100
+3801 c9b3f77e18baefae5a92d9585d4fbda80a299ccb legacy-trunk
+3802 c3d7f814b2d06401c7b0cbbbdb9c6883c6856517 legacy-trunk
+3803 2603b420c5decac5178c4466f7c9e3e6a6ecb7a6 alpha100
+3804 e9b0cce3b98093e0f74da427cca9c2a10d4c2cf1 alpha100
+3805 17e5c94f862f7678f0a48befb999de17226da136 legacy-trunk
+3806 15e1b86104a6e618f92c217fd63d78523d4fdbaa legacy-trunk
+3807 995a8ef4a5c04f3e68118168be07a3eb89249ee5 legacy-trunk
+3808 ed211c7610858bd6d594a20707e35fa242bd5019 legacy-trunk
+3809 87cbf9e227298e6a9b6532be92a772bea55100d7 alpha100
+3810 5c6c99066b2c7109628ff403c8df5f6f8b59a78d alpha100
+3811 48aec9d3852a952919c0dc82fa81d7050862ed8e alpha100
+3812 869fba809c689e3d64a6348f95f431e42b869a97 legacy-trunk
+3813 5c01931da59bd1d18e367ec3a9b1782ce3e7948b legacy-trunk
+3813 7c357c6a28bdc89ded8a49e6eb7486320b3f0ad2 alpha100
+3814 7ecd6380566cb318b2ce2d6d6eee63125ee02df3 legacy-trunk
+3815 e053a87828f44262b3ad26392be43e414c996e9e alpha100
+3815 978bf134f44ab7c3c84c476a291e7f4ed97836a6 alpha100
+3817 9fbf34e1c1f76bf1404f8ebe6c2b26372443e422 legacy-trunk
+3818 5a17c43dcff03cd9210d5ccc5a835189a178448b legacy-trunk
+3819 4047f224efdb0ec7882ddabea280220767dd59f9 legacy-trunk
+3820 630e03109c638dd16cde9378afa411f8c29d1f6d legacy-trunk
+3821 df0aee64114bcf1f92397bc8fc8447ab614cbbbe legacy-trunk
+3822 1ff6cedd22412ded75741d9a4d7fc7ada50b9bc6 legacy-trunk
+3823 1c3644bab86ab53f2f29264111d3d82ad11856b7 legacy-trunk
+3824 b68fb73985d836a4320aec0c6d2d31a63427ad10 legacy-trunk
+3825 443471ff31470a2eb323290b62ad8e21a6903a6b alpha100
+3826 ba24fc8d3f8c55df5b1c43beefd12344171f68f7 legacy-trunk
+3827 0efa240b1dbc057dc44fa1d44d4c4d8fedac5638 legacy-trunk
+3828 5055308152a4e2877b9e5f972de27ae873db3386 alpha100
+3829 5cef4f5a28cedfca5fade825edfc60b07ff6e888 legacy-trunk
+3829 9ec7d6f77500ca090c2191e0b3b40c66a3e0fe77 alpha100
+3830 81f26bf1178f9e3710c08adf6b8cc942b16ffd16 legacy-trunk
+3830 ee3d5ea13a37b92c6ec059ee9d829873b1619642 alpha100
+3831 48aa3d3314ac171db5ce17f656e4b4c71000e1a0 alpha100
+3832 980626ecad61d8d056f39fec4e2ba89434fbadc6 legacy-trunk
+3832 5c350631c839605a1d3adc5bf43caf14805d1f1f alpha100
+3833 3e65bfd1576ed98a08a196c716ad5c82a30411fc alpha100
+3834 9930087ea8f5e6e8d7cc54326a6fb84ea28b9c75 alpha100
+3835 8c89f6ef9f9f8f547d57c8586e30eeb83def3434 alpha100
+3836 cb5fd80068cef25689db7dcbbdf9e3719b79e8ca alpha100
+3837 bafc533e0eb6ac5aa5f082eccfbd318278f6c547 legacy-trunk
+3837 7032a8a2c42c5224e3cf52f3c886ec36cb53d130 unlabeled-1.1.2
+3837 c96fc497b932f5dd28603b1dbdc51e1c9eb7d041 alpha100
+3837 b15b8cc9b8d10e0352a0b8b7e8d51fa309db6df3 legacy-trunk
+3839 268e57630016202808609e1a86d0db08838d6925 alpha100
+3840 b70f0890754617bf3f858124cfbb7c051706b49a legacy-trunk
+3841 6f52b5389b88817d44b7148871d7c07049aa9778 alpha100
+3842 e380b4d54fd39eaf3ab89a1c94e3ad1895d6968f alpha100
+3843 5dfd1d51d66deaa565e5a770e46cf00d80eaa5ea alpha100
+3844 6966d957b5b1e750f60fde537b39a50d0b8ca5ec alpha100
+3845 2b5f8b2021bfd73094c9f8228ee48f6624dc5817 alpha100
+3846 8df72e58fa98032c7e4261a152c4348406a2a881 alpha100
+3847 ad216876c47fbff704b3ad2105d99a2a5ab89c24 alpha100
+3848 8c6814f34cdd936f07390c3d07b981588c4fdb0f legacy-trunk
+3848 22b7d3735bd25fec3fcce416f34c08f8988e2769 alpha100
+3849 6d35308261f4f74d85c103b975c8434e407785b9 legacy-trunk
+3849 7723e000398da774449d7efd65058bc19248e50f alpha100
+3850 5973354fb49954f72465f71322caecab46ad0c75 alpha100
+3851 cd279e0f77d853f263ca763580fec1353596d477 legacy-trunk
+3852 c3415b319b4e8692f9c64e277a47fbc16b8e18fd legacy-trunk
+3853 172aa0eeeb6f7cbf0b7541ffdd83788aadb11f94 alpha100
+3854 274066bde24123cac05635cb59238b006cfe49aa legacy-trunk
+3855 df0fb788c0c1f5065331388bb391c64e44850e7c legacy-trunk
+3856 9e34448a005ed75fb0a5b5957714f4c7a2ccfde2 alpha100
+3857 16d1dab3f2c1b9b332a76502aeb06e73ce93b8ab alpha100
+3858 8cc908b0d83bde25ef119c65279407652af09ddf alpha100
+3859 3286bff443c6a0660bcd581b1c7421f8cf8b4d61 alpha100
+3860 274b93b12113f589a55d8fa684c808ca48cb719f legacy-trunk
+3860 e5d665231c5894c6361b33c8a2a07bbce927d0ed alpha100
+3861 8eab2ee40f32dbded8ac64e2dcbd8eb8a6cc75d4 alpha100
+3862 249fe5e24e20eb8d9e3a772b7bec1677fd2e5f82 alpha100
+3863 8aabe9aae0fa07a6aa542d1ff8c282aee6c76c54 legacy-trunk
+3864 cf60a2b2497985889f8bf41b0176551360ba29aa alpha100
+3865 f4db92eef2af717b4ecfd7551b4b0f54745b3513 alpha100
+3866 020d8c2d9d3cfb3d2685a04b36d36bf3d5d343b9 legacy-trunk
+3867 bd1a4d717e9d1ee44ea8ea3a8fece742eec2fce2 legacy-trunk
+3868 780f335bf524b7059ae64255f909e00e6bb5a94d alpha100
+3869 59fd4686f88ca64b4b7b03e8a62db34ab43c3f05 legacy-trunk
+3870 b3bff5ed5d3d08941cbd4d25cf84492e732eec82 legacy-trunk
+3871 9600553900d47ea14050283cd8ee9abada4417f6 legacy-trunk
+3872 b33720d0ad97b153796149ed5a688319c158a349 alpha100
+3873 cdafc951e8e8b30fd13206f4b80df145e3e3dd8e alpha100
+3874 dddcba2038bcb5b2f19fdf0d5fcbd53f2080e83c legacy-trunk
+3875 7d21c923b54aebf3cdd731dff59239896354140e alpha100
+3876 903794df5ea9eed55a300acf2f761c578f264a91 alpha100
+3877 e44499a44cb8e374e35bbf54b3aa6bfa0f617709 legacy-trunk
+3878 370050cd0b6c501e60348b09d4bfbaee243bf8ad alpha100
+3879 8d26ee24ad182ea0e8ab671a47f98d759172c1a9 alpha100
+3880 3acf818f354831f462367551b1bec20a529bba03 alpha100
+3881 cdb14041cc87bb640ad04b04b202fcfbce7bfdec alpha100
+3882 acba4427e89c7000748f984bda6eb23a5fc372ed alpha100
+3883 3d016999264ac2c73ec8d6b440f1d86f7d5821c5 legacy-trunk
+3884 af3f2a03bb18fe0eef97d96ed4ea19a122a92afe alpha100
+3885 3cddc67be3f575662cf734b512471efb500f8626 alpha100
+3886 ae4b9cb5ba1561128acbccc397b006f181390724 legacy-trunk
+3887 06aa608c589e86c586bc1ccd260ff5b5f4f903d6 legacy-trunk
+3888 91f846f6d6a61d043d0e724f85c784d14a715a52 legacy-trunk
+3889 eacaa4f07826d9a00b23f216049d3e38a87ca469 alpha100
+3890 2a0d499740b624b88072439833f1ebe06a765499 alpha100
+3891 83622b7a00b5238f8305906cf8e34c87cbc049da alpha100
+3892 eaaba2cafeeb9c340789ea2ba434221c39531189 legacy-trunk
+3893 2d0ece5604069a162f794340beb1a8c80448a696 alpha100
+3894 72f8e1e614f06303577593c71d21fd69155a9a57 legacy-trunk
+3895 45728bfecb768f021285877c6151fa9e601a328e legacy-trunk
+3896 695fb494a3a22fc936b44f530d859cecd17ba0b0 legacy-trunk
+3897 7bf6b128e98c48868e53d7bf7bbac259288c9025 alpha100
+3898 f3263759678ef38472fd1c386716a1ae02cb2289 alpha100
+3899 444e349f962f0ae30068252e59dbe57791fcc680 legacy-trunk
+3900 b21f048c23e9e028450f1f2ec4d04aeb57129bc4 legacy-trunk
+3901 288a4606d2fde10068dc79cea6acd9f807455856 alpha100
+3902 021daabe69d8795661f79f67eaeb282ff396a500 legacy-trunk
+3903 c17360a16587038c5bebbf3fde9b1dee7d3a3f00 legacy-trunk
+3904 32da57818e97b5ffd208eb96beacb4a0d9830db8 legacy-trunk
+3905 b9634bd5ca55a98e2efd6b279c0d929a0ddf6c61 legacy-trunk
+3906 2384faa5350f3b6d1e0f2b13f2f9f0d056b45459 legacy-trunk
+3907 b3fcdbd2d9bba53b57859e8301242fe21c4ba312 legacy-trunk
+3908 8d7ab2c7e99330910275f01db91d8eee5516d457 alpha100
+3909 e96a8cfbbef1b6a3ddf63ef90fd08ef7d6fe4779 alpha100
+3910 c964364a8f7f8e7c04fe77e2962dc2f284236087 alpha100
+3911 b2d18fa529f48760cbdb4a571d4235072588b8a6 alpha100
+3912 0556617aa3386e70ff470ecce1f6a60371ec4612 alpha100
+3913 d590ffd54f898ca117f0027920347c1bc2e9196e alpha100
+3914 79bb68270c7b12cdb036a0afd62e27ced85a176b alpha100
+3915 41bcd1853fea57db9b9ed7f829b777f8e0f8aa88 alpha100
+3916 131323f1715922fdec0a745ba0c9aa2d98c9f15d alpha100
+3917 81018650dc3245a96ebc0430cfb38f9a2b90af8c alpha100
+3918 c13bbdfeebffe6c1e0f4e0aad5a7bce1d0bbcbda alpha100
+3919 ca5ed52aca27a6a8d760ef0cb917928be2915a06 alpha100
+3920 fc45e577ff9b20cea85379b7d2704ad7ea747f62 alpha100
+3921 a7041d6f7de3e358977da92878dc24554d20ca12 alpha100
+3922 5effaad71ba52e5e6b440c8d853b64f49b296b5d alpha100
+3923 ad2270e71ec3f0b653c27c26fa15ba3cedee9294 alpha100
+3924 3469d04e3e36d5fca899bf4cb0c9f155b5a47510 alpha100
+3925 f0714bb4ea96a1e1008322ed5b71e439f8733278 alpha100
+3926 337abdc1584a425e5443a8927fda31bebba1659b alpha100
+3927 7c75f60468f802d0f733294f1cffb6afbc518a7e legacy-trunk
+3928 2236d709ff2daea608fa04bdec5391d21596d4b6 alpha100
+3929 90a20993747d1f38a5a0c4bb5f252460a56d31bd alpha100
+3930 c1cdeed8c5144f5ee72332e73e5e0406bdc0b5cf alpha100
+3931 3d8ba41848ff0f82254445e269eb1c8e3307cb8a legacy-trunk
+3932 b454dc9247b076b7ca57ca96e8c124e0da0928a8 legacy-trunk
+3933 998c6422cd8aae03d28b8a5d32cbb6ccb668a314 alpha100
+3934 bcf0b8dfdae9f446d6131e49e28624d831b38bb4 legacy-trunk
+3935 7fdeadfa83e0cc68788c37049cbb2870b07e01be legacy-trunk
+3936 ac2e5cc29949d9ed6c3ec059415493af601b32a1 legacy-trunk
+3937 594a8c12d688276f2d2270f8b46c0edf04cb0ee9 alpha100
+3938 fca2fedea71cc67aa220befc25a8fb61a95ab4c0 alpha100
+3939 2c6f1337801cc0102ef73096bf0de6a6c1ae0183 alpha100
+3940 1287fb0595888c0147c455eb66247f778d4eeda4 alpha100
+3941 f6579488934370a4448e6e3c3ff7542d3e75ad41 alpha100
+3942 ac9e12b4ea8c657bca34e18a7117b0b44e3dfe17 legacy-trunk
+3943 20df653376b417b98e2aaaed3adeb475ac915f32 legacy-trunk
+3944 672011871a1b64059b8800fae1e787b402551517 alpha100
+3945 a5bdff9705951fa6ce7a64b94215e9650789d8c4 alpha100
+3946 88de21ef4a8a30f6a9169b896fc26a8c7ac9371f legacy-trunk
+3947 ba6ac82fcb686de15cc36a7e3fd34758c5a4ad8f legacy-trunk
+3948 b3443546d6ee4b0098f92b0c544eb25471e9083d legacy-trunk
+3949 45790356e024f76206bc1a40e8ca7ab51b6a0852 alpha100
+3950 2197dd241d8dc86215cbb2d9abef814a3866fb76 legacy-trunk
+3951 dea67c2a4c07f3bdfec9412b61b8d140f693b348 legacy-trunk
+3951 79ab4df9d0f5ff2f2c9c3a306f1feb1ad2c52814 alpha100
+3952 9e0ece6ed81d7a0ad45934d62180cb5c10d0a933 alpha100
+3953 ca3ccaa8506026fde1f2b968e3c52ae472184983 alpha100
+3954 ecbadb818847503b68bffe1adf1e74cf4e57a47d legacy-trunk
+3955 b2c922cfb4d97bcfcd8950cf9865454258660d6f alpha100
+3956 4bcf584c1572b4f2718000605dfa78e888357466 alpha100
+3957 83b41bf19392ed3ff4ab74a3617bbd399a834487 alpha100
+3958 d741041cb076ebcbe1f4bb397a99efec948deece alpha100
+3959 09d77bb71d75b53deb5a48bc23baf97c45706fde alpha100
+3960 ce32847164e1e6d0772c49136c913c4c802a008d alpha100
+3961 e76c687ac781d42a7435968a27443e735a432fd5 alpha100
+3962 6ec152221792e65f7a11e2ab5eef5d148bf1f2c1 alpha100
+3963 33d33443ec459fd228cd545e14d5e9d5db9bb4b4 legacy-trunk
+3964 301f8ca98e0b5f440c9d01450772d3c8e0ea8a13 legacy-trunk
+3965 57b9b77da21b39d5a9a5c917a811df82f39f9210 legacy-trunk
+3966 5e5a61bdde0b7819cd239eede985b0b6bed68b5f alpha100
+3967 907c5dd89c6cefba8a48d47db39a4097f95b721a legacy-trunk
+3968 4e7eb5a3fbdaf1215ed700368bd9fe8d2089011f legacy-trunk
+3969 c2ff2163f0b70c1ecd0d8aac03d5339a447896e3 legacy-trunk
+3970 e8bf10771781397b8d374529f112f94b49ac8503 legacy-trunk
+3971 60a7214f33a88165c704b7319ee628d53bcc8e8a alpha100
+3972 5488911ebc26ec72965ac3091b27e0310bb172e7 alpha100
+3973 1431abb28353f4850ea5dbc21b20624f0ef0cdcf alpha100
+3974 129d98b517c256fe85b43926376aa0664d7af49e alpha100
+3975 a754bc74e584daea7f10f48bef8c73199cbac94c legacy-trunk
+3975 75939dcc938a71ada1ed89c359126c0dc1601c17 alpha100
+3976 077080d758dda682ed618a3a5c9afcdd77a2ee28 alpha100
+3977 c6afb96a45230f551df14ac2119cc80a365c1eaa alpha100
+3978 5c29f4b1b285152534a0e2576f37276950bfbdb3 alpha100
+3979 e291105b1beeab269c7a34cdb89217f1b178f54a alpha100
+3980 69d5dc24cb3b559f8cd19eae52903d017f305946 alpha100
+3981 241c355fd9ead573ff080891f51312773f4fe9a2 legacy-trunk
+3981 8ded8c65511da43bd0b903470875bb4deb95ed60 alpha100
+3982 2e8eaee9ef45cea6ec1a8b256981e4ebc98279ec alpha100
+3983 be2db31423574d6184bb5a14bb9678ef67e00734 alpha100
+3984 221d47b2974e73ab791a40cb9d8ac5cf44a99773 alpha100
+3985 78acadea3918fc967e558f0ff48b7868de19f5da legacy-trunk
+3985 f9dbbbb17929025d06d629a4bed3e51a1131a724 alpha100
+3986 acea1103129bac11af61dda7f812c518da5b86ce legacy-trunk
+3987 83ee7649823d256cf27913bb448f9c4afc8cff8e alpha100
+3988 4048ccf85b3d24566754ba3033eb74ccf8646034 alpha100
+3989 d7a8557e780cd526a85538aea6a1d0f44d549bd9 legacy-trunk
+3990 c949dcb0348be4eabdfe51ed94c859bd32ce77c6 alpha100
+3991 7b9828bc71dd649259ab4ed7c15d8a22deab8bd1 legacy-trunk
+3992 e20d0694e74014ebf6dab64d9b26d30bfa5e3d32 legacy-trunk
+3993 1036f205cc2d7a5f107cdc1fbee3207498192c05 alpha100
+3994 70492d659e3c7c124d3fcb1409a209b3fd725ccb legacy-trunk
+3995 a8275562784cd2f26919611b087e5699d61438f8 legacy-trunk
+3996 f50fe4b952baa172d6dffa3a28cad6295ed5d731 legacy-trunk
+3996 0326b5d61445ee3a8d3de28119f9652cb72d2e3f legacy-trunk
+3998 6a01f099f0ad8d4547dd7c6a8a1d8eac6e5ebfdf alpha100
+3999 366f8dee96fbf4e774608e0ede9bc0ab4d7ba2a1 alpha100
+4000 2e050a50aa0a01f3535da02791a6a0fe19333ef2 alpha100
+4001 2b27553028aac23e687081798639c419d34cc08f legacy-trunk
+4001 74920c3a367d2d1c7f29388b244401fd2ee43987 unlabeled-1.1.2
+4001 22548229d6fddce33cf57a3931fbb7272c4be766 alpha100
+4002 0477bc39c93592ad923391f783141dda81839431 alpha100
+4003 7f891f32864ca52a1d0c796beb7b302d902cc3f9 legacy-trunk
+4003 8896e4ec09fc4a46848f438b041d208b25534e20 alpha100
+4004 b14c6b955161ca04ae093a86723d4403ca130cbf legacy-trunk
+4006 8454579ab52f371dcf5546cb530e2dd6fd60ff5e legacy-trunk
+4007 9cc858bd573de34f309fe16ea5c48e946b753725 legacy-trunk
+4008 812d0811fcf3e062e45159b438cabaaf00308cd2 legacy-trunk
+4009 a75dc8656cb0a2393dba4c252f31d312be4d132c legacy-trunk
+4010 b6b50d94125fd42f102bc0d8fc0443c47596284d legacy-trunk
+4011 87a2b04c4680bd121fc3e686ffa878f6b4fa316b alpha100
+4012 96d0dc4739eca24820753b14bdbeb081707abd2e legacy-trunk
+4012 1cf6085697cd5a0a4e02b3f0924fa2568ded0128 alpha100
+4013 552b21e7c230a79d26bc315f9ef56098d04d7475 alpha100
+4014 c1fb2b6c474cea93ee54cc81f14e69a0bcc42712 alpha100
+4015 e41a653067062005a2c5ec506cade097d1b84446 alpha100
+4016 151321a18db4a78b887a7b6076a40e60d2e064bf legacy-trunk
+4016 42486bf23647db430265a4e33281846ca72f608e alpha100
+4017 8fbe860a26e1995f1da1fa71d9895d1440d8050b legacy-trunk
+4017 e46e0ee76dbc44818a667ec1243afe9553ad7ad3 alpha100
+4018 a9dd2e1ea5c9ea2ca47b4d0c80aceb6a1456ff0f legacy-trunk
+4018 a19fa055ec48b24467a7a230dbcaa27bcc316a33 alpha100
+4019 4121afd76d734afec224fb2ba9eb8d166c3d1092 legacy-trunk
+4020 5a6c2a238f03876e2a79e2ab329f25e27ba28935 alpha100
+4021 29c4255cd45cd5f2ebc6c11d6cf4f0c557af8854 alpha100
+4022 0202a72d994e3d38255f3a553a90ce1b1536eeff legacy-trunk
+4022 4e1a2dbf93c532a2bffce3c5dfe57a78f6d6f22e alpha100
+4023 3e6b67ca9dbe4269f9590042372b7eafd8c36b77 legacy-trunk
+4024 007adf01543c51769fc32d8a19de49461fcee199 legacy-trunk
+4025 6ce82c1581b92f771db90c4f5285dac56edb9ccb alpha100
+4026 f2602288381a4257f8f62f98a036fde769f0edc7 legacy-trunk
+4027 59039c0856c9396e3f1f3a47449d3169d73f75f4 legacy-trunk
+4028 a3eb2525932942166e340e7c6d848734a8af5602 legacy-trunk
+4029 1f4929a48e64a0047c38ed7891d12eab5921bb14 legacy-trunk
+4030 9af8b3991cedf72ebbb96da7cb611448da1b8c7c legacy-trunk
+4031 fcaf8a2baf3896e900378b860849daa014620bc0 alpha100
+4032 bca8290c1b31cd7d72705e3932756e2d28ee0551 alpha100
+4033 7a29bb3bddb465ae440a35d6f539269e3c804d44 legacy-trunk
+4034 37cf87f561eca985aeaf2a0514dddd97e9a18810 legacy-trunk
+4035 055962f96de7b5f0fa08d3c3ef1556ba0fe826ec alpha100
+4036 14b087fe53470c4e37e14000758ede5559907e82 legacy-trunk
+4037 708654a5ddde0311d75817566cab17c6bdac3e47 legacy-trunk
+4038 0d029dee91290f9a2f6e45a2adf7d5cb08fd3d85 legacy-trunk
+4039 7a47fabb187c6c267cee77b452795632b61c729c legacy-trunk
+4040 fa50d4bd553785a1c1abe72979368b40689258a8 legacy-trunk
+4040 60b0158d948acc3a1905e0b1d7aee25659d8f738 alpha100
+4041 f8498b088aa1a0c50366dca5236cc55c1048cd11 legacy-trunk
+4041 8a7e530dd44a5e640008a936eac3536ae472cb31 alpha100
+4042 623dd72491866441148d80bd051b918f4cd32ae2 legacy-trunk
+4042 19f20751f8defbef146c77815459ecb3cb027757 alpha100
+4043 03e097ddeca2becb8229086f6f250ae6f4f1cd45 legacy-trunk
+4044 6cf6b6691aaeb2817f0926fa2de13f8c4d72b2a4 alpha100
+4045 7ac4e49791f47e1bdad8ef4e468b392bc7624643 legacy-trunk
+4046 9e2b1942a7420aa4067c195ca91d9a9b6667ac7b alpha100
+4047 1c71a27fd6933dc6de55871327a43ab2b048caa2 legacy-trunk
+4048 51a06fdfff789d33e2a006fc168b961854e61404 legacy-trunk
+4048 11ea161a01c2fd92b44a98b22026f2956fa6d109 alpha100
+4049 cf328a9ec5d44876cf024f11d7ac5659f9d39540 alpha100
+4050 19b00ef4cdd997da328e39e3d52d93491109613d alpha100
+4051 7e5f97bab1e6f8dec76d4f07417447eb579200d0 legacy-trunk
+4051 cf24f3e7be6d7e65ea5a5c57fbf1fba8f8ad2fe0 alpha100
+4052 32c28adccd12b0690c195d3a8c238ba12470863f legacy-trunk
+4053 3aac825a53b523df5f02ad0f38771d1a75c6d15b legacy-trunk
+4054 cbee5e1e9be832590426998098310fe69ba137a9 legacy-trunk
+4055 7603a3b2cbee99345d2f9e3e7cfabef93188d1ac alpha100
+4056 90ee71a3a13ebb44836caf16f698db92d218bd5d legacy-trunk
+4057 a4c7eff259a59c8b4f5198a267847dada75b8a19 alpha100
+4058 4def934ff75b8062abfa8a0701dba6795f9756e4 legacy-trunk
+4059 f02a46754f505c3ed30dafd7c4c15548fdb90da6 legacy-trunk
+4060 a862d8f4507b8b4bd3c4dfa13d3f8b9176384fde legacy-trunk
+4061 1b9ec37db2b9abf95ca1e8b8d418b5d0de64e02f alpha100
+4062 5096bb48ccfe130bfe1fe8c1ca004dcf865af94a legacy-trunk
+4063 b5a660caa8e1bc457b541443bb1b1dda2eeecd72 alpha100
+4064 d90aaa09123bf588a79d09ffeff37072a9dd3d8b alpha100
+4065 e2823110c05157045444e1f38c32ed8ec5f2d912 alpha100
+4066 e6a213b7d0d2b9803cf4023f0e64fc0cd7251677 alpha100
+4067 72c9a4dc4847d79489776d56a2423d3ea0e53abb alpha100
+4068 4f449ab60567fbb643e2ad4535ccbdc9c980fba4 alpha100
+4069 ffd495bacbd436f00e8cbeb2bb0c1083ab83f043 legacy-trunk
+4069 8e7d8d0d4e90a945158da56dac988df729bb5a87 alpha100
+4070 f7e1e2389375f232620aef8e4ad48e71c4c58b23 alpha100
+4071 01d26486b0ee6647c3f2d10a0dbbf412a36f82fc legacy-trunk
+4072 14b03418c90fb38af20fed7f472689ee953c4ccb legacy-trunk
+4073 a6e6fad1a01b32fdf44833e4f0f98b73d3724f1c legacy-trunk
+4074 a09efb135de55246350ee4245ac181984b57e57c legacy-trunk
+4075 d074b2fb60914dd7d5cb901b91f95fb92ef682d5 legacy-trunk
+4076 73dd2a979857f17b36e91532b1672fe65dcb962e legacy-trunk
+4077 b5d5bbceb00f6048634b98f07d869bddb4a93b50 legacy-trunk
+4078 a9616f5654655378295e4a9b313e3ed94e84a856 legacy-trunk
+4079 273451892327ce1f1b07f0dd4909d0d56ea68ddf legacy-trunk
+4080 382b4f8a737a4cff1ab7b05fe93b8dd670546938 legacy-trunk
+4081 953e74eac006298169c52ee72a29e7f4f45d56cf legacy-trunk
+4082 ced3d1122f7cbab13e077132d68d4d011928853b legacy-trunk
+4083 344dd28da9c56620f536ea1a38e872823c50db3f legacy-trunk
+4084 a948b44ad4a1550b572bb758102fe5c0830fd046 legacy-trunk
+4085 2fe54f62cdb54972c1a592cc63deae4e97598bfc legacy-trunk
+4086 4c3062c7135fcd3d71d04e4861de82b227eff9b0 legacy-trunk
+4087 6a0e5cd499c45eddd75ccb3bf8243c456d8cf0be alpha100
+4088 496c7e9f11d24820db3453814f6234add5f229c9 alpha100
+4089 ca023399e5c94bb5e7f92f9a5f04a442b03b2238 alpha100
+4090 52fa4dcd1b0e0a162b0fdc7b48b13e43bb5b264d alpha100
+4091 b6c35e1fadae6ff1271f5b5d875b0bb64bfe16bf alpha100
+4092 8f96802733077538f895e3975741dd9b180e6fc2 alpha100
+4093 9ae7f2fd89f1097dc78a66189aeb4bf0b413fb47 alpha100
+4094 4b50f1042e8dc090386d05471791882c3be1f660 alpha100
+4095 76371805d9f374f1973288129a243314cc428860 legacy-trunk
+4095 03b05717b95224ad2a707a76205644d93370995b alpha100
+4096 1e3a553e479af08de3e7d9a8ea58d0738b592df3 alpha100
+4097 3b90a9fc1e039892853b65bccd84b8fea1924069 alpha100
+4098 1f06f71904c241f0a35ba7583477f8ce9e4c921a legacy-trunk
+4099 508b73e0a7e4f1f15bf6ce44c7e76a769fbfd824 alpha100
+4100 3afafac3d7a16bebc29e74a14fcdb4be0a3b6dff alpha100
+4101 02d8c15882ff9ad50968a3be17c803fab18f1127 alpha100
+4102 5290428bad3715b73fa0d1200a394d72190b0763 legacy-trunk
+4103 75bcb1fc65be59c1325769e2a2d27bf5146ffc58 alpha100
+4104 8cf640ef344007689e9d36441ae435eb7aa53e2c alpha100
+4105 1009ea49366cc98cf6faf955d6cd9ad03d89db6b alpha100
+4106 c2e6c9a7a95f8b46af96861a45fa244ca1c213ff alpha100
+4107 0a60460e99f02b4196e4a7bdc3b2988ca7804820 legacy-trunk
+4108 dc8e1d72d78dcce5ef501b43f5d52f27c6965229 legacy-trunk
+4108 caeaee390e43fe573a93d35c2bce8342733a0cd3 alpha100
+4109 1b17aaf251054976bb2c3aec7c4d5941401bb4bd alpha100
+4110 2bcddc905da0b9f8cb527e6fcfb5fe8dc43c7244 legacy-trunk
+4111 080811b1d023320fab3a895ff6cac94d6b13bac8 legacy-trunk
+4112 1cd4fd16623de234e6c21f887d393734c539229c alpha100
+4113 4cbf536a6f1803858e4b57019f6bad76867fca66 legacy-trunk
+4114 c54c07abcfcf31ffbd28e35080dbc50422239c90 alpha100
+4115 6be91c44caffd5e2c3f42913f8ddb23af985b532 legacy-trunk
+4115 6e4a89ee11634b5efc0db0fe10753bd839e13146 alpha100
+4116 23fd50d77b5a05036dabddf4bd847a756c823e59 legacy-trunk
+4117 b5a57af40508c8e4da5eaaa6e588a50ed37591d4 legacy-trunk
+4118 bb61816e1dab0e4681213a721ec4dae39c3990fe legacy-trunk
+4119 94621a468b60d41593c12aa803019f6f36d83c3f legacy-trunk
+4120 93e036786b17a78d0d0ef58150196b5a8d94ebe5 legacy-trunk
+4121 d88af58e95cd0844eb9951a7c6bb42d9057368af legacy-trunk
+4122 e2665d9d4e46d2549d59be08755e0d715dd17c75 legacy-trunk
+4123 cf29c09f07b61f79ea238b17d12b062456d65360 legacy-trunk
+4124 03d351b6f738e4c5b8a2dfb18dbaf837e8908aea legacy-trunk
+4125 c50127809179dded7c7a013892dd4aa3daf0e02d legacy-trunk
+4126 b949224a4bd561a8d850b13eb48f4e9b89f15164 legacy-trunk
+4127 902fff55db381f0934d9ac35e5f22b6b7b1fd2c9 alpha100
+4128 517baae1b663c261b6a07dff59f1b06108e58693 alpha100
+4129 468b8784da48b74a07ea80bb6015c89cc65ef4c9 alpha100
+4130 bfcff8af9751687fe91c1f52baa99317de87bd86 alpha100
+4131 f8540a8cf5d794645b4b58be5b405878d421cc35 alpha100
+4132 a2403fe2c8858055f651a791900828048a1f7940 alpha100
+4133 2b07d925c09d41eedd1bf7f284cbd8afa83fcfaa alpha100
+4134 df2204e47b65f75a05ee21d2e582e1acab2363b5 alpha100
+4135 77c949301db374904bf65b75e1558e8bbf10beb2 alpha100
+4136 787475610b02e31dc5570a132d0a77a3cc6137b7 legacy-trunk
+4136 b7072ec7d65237ace471ad3fb3821114c5c47aec alpha100
+4137 7b1c49a7d375ea095f5b6870aca214d2b1620937 alpha100
+4138 da2afc0298a70fce7d3c1968aa406229c2e645b5 alpha100
+4139 9da494238773c916e25a6e315fd6fbd9ef1f4a22 alpha100
+4140 fb5bb9e7cd7a819c1d4e2aa8534dd8a2d6853469 legacy-trunk
+4140 ebe8681cf5feaf1a4dd980074e0b40206c089190 alpha100
+4141 879e8d04e589677fc64095d00732d6ee178478dc alpha100
+4142 eb11a098b7ff2ccde839ea76010a1c7356e5d737 alpha100
+4143 9e7d206a4922166a219ab59d4239b52d63199e34 alpha100
+4144 93df83022be878c11076a86088b8c20e017534ee legacy-trunk
+4145 77bbe58afeab52532baa170ef59c4368936f9fa6 alpha100
+4146 015af1c47726427fefba6ac04cd6e4b578e5d642 legacy-trunk
+4147 1901e08086f9fd64e70f1e12b927640cb766debd alpha100
+4148 f1b040bca3e12ead4be59cec48058e9cb754d5e5 legacy-trunk
+4149 0fb3aa5ca4c02ece101c3bd0ced584de4bbe99bf legacy-trunk
+4150 ba957aa42241a9ce90b587757799047b716e56d1 legacy-trunk
+4151 222802f0d97829545f410d7501fae6e43bff4ce5 legacy-trunk
+4152 4bba3c907ffae475ca0b2351db35de31d90f93c5 legacy-trunk
+4153 192d869beb9736a18176907436a054b90f498f9b legacy-trunk
+4154 6f81b13fd6ac08d42e6188efbb9b364fafd54ffa legacy-trunk
+4155 de2dc1bc4bae1cc3c8c9e938370df7c477334e61 legacy-trunk
+4156 375b8b863126faedfe8c609b09cb1e74c1aa4e11 legacy-trunk
+4157 5656f887fff37efd939e87f6a3ab5d98873e6115 legacy-trunk
+4158 366a0292b6142e6450dc35eba6ce7c5b2a703911 legacy-trunk
+4159 2ef9d50ab654ba5003be488b9e8295b0831c30a3 legacy-trunk
+4160 bb566d28caa0d3afe91be668e159f1cb3d968bac legacy-trunk
+4161 5840e553eb8d89fc759de3260bd1bb9d51ff9f4d alpha100
+4162 db0eaef42cb94e9219ae896a78743ab8956b1a9d legacy-trunk
+4163 9928d333821de0bbb8b8a54c11a11dd56f347ff6 legacy-trunk
+4164 504bfa59b954ef97ec1f46cb821bcc4ba1529db7 legacy-trunk
+4165 ba9b755e17fe0b2dd20627a070bacad29a90761d legacy-trunk
+4166 0d6133abb6e5fcbf883f8a0bac169184d72a8678 legacy-trunk
+4167 a1601fc2b3e4414ba328a0be333757dd5c2a26aa legacy-trunk
+4168 2f9ba2ebcb1073bfe17cb7e740e4ea6a027e8330 legacy-trunk
+4169 4210b0def3d7815053a71ba21cca7767bad96669 legacy-trunk
+4170 1dd31153709dd5c6278f6ebbabcf42f10f06435e legacy-trunk
+4171 470a51545d6c4dcecc8a125f7efafe30db94c7ab legacy-trunk
+4172 e5a8f647921691d9e2871140634fb00601f143b5 legacy-trunk
+4173 e16769cd7a901ed743fd32f8277950bfe1d603d4 legacy-trunk
+4174 cdf44c14c270890cb0d7540df9629a54dce65782 legacy-trunk
+4175 e80c7139f533e4e39ab14efa380d5cfa74fdbc17 legacy-trunk
+4176 6b0f0ef2c132c7597196f565ec444d3f88c61b42 legacy-trunk
+4177 bd1d0ba40f90ce426b5156bb7ad3d8a696e4e212 legacy-trunk
+4178 7f20f4b9335fa07865343c1bc2c827bbbdf928a0 legacy-trunk
+4179 e8651d0e4a3c718635e440110cd123e6c8dbd505 legacy-trunk
+4180 581fe6bfc9024a2ea054774cd1a09b657bca6d94 legacy-trunk
+4181 afc574064e62cae829486d778f61b36cfaab7729 legacy-trunk
+4182 17500cf9538f1a9feaf6872ed620e496ad8ea4e3 legacy-trunk
+4183 254326f2415f46bd02a2579a1ea7d50848471fd6 legacy-trunk
+4184 86ed53844b07cf647b2d74e4f233adfcf1beb1b0 legacy-trunk
+4184 907d9e7bf4b589fc2f02a9b900c58f41ce554d85 alpha100
+4185 9600d3d5cce7bdd9430927747de6d93b8dcc76c5 alpha100
+4186 ee2f88a4f9e2bce639fbdc25bd8dc8ad9d89f5f0 legacy-trunk
+4186 285fe8979979957655e76dc02bdb00408b8ba64e alpha100
+4187 458d8f3ef3075827e1ffe4be4285b43aa9209e07 legacy-trunk
+4188 29c78516ee3333c095be8fbde2b2b99ed57aeb6f alpha100
+4189 7831ffdb787b83f2d06fe17a9b3c6c59132393d1 legacy-trunk
+4189 21d7f932819b4da8ee7dac9becbddbedcc400d67 alpha100
+4190 e95b0701c8b54f24df8c90b830743575efd7bf62 legacy-trunk
+4191 96009dae9d62626aa4d237fe5dd45fe81ed7b134 legacy-trunk
+4192 bede38c4a9f5ecd4210738e9dd95679c28fa3714 legacy-trunk
+4193 bc11c1ff6cac031f927986b34b0a4b8d92f59b33 legacy-trunk
+4194 595264c2f06d4a60966162af5f41141c93f72b8e alpha100
+4195 6c0e11b94009a25239938f523a72ecde7636ad02 legacy-trunk
+4196 d5b67d2ec7ee03100a6683740fdd0f7ff712261e legacy-trunk
+4197 372903b63711a9bdd8afc37734eec458329d358e alpha100
+4198 1940892d2fe3a8cf3b74cc12d670398c3e480363 legacy-trunk
+4199 e3a9d81df1853c8b3757626b17a85aa83acb4cf6 alpha100
+4200 3f7ddb8bb2f63b73ab071fcb7e1f8a622c652063 legacy-trunk
+4200 e7b5fe76e5eacae4c6628a8e3e29fe8cd4c814eb alpha100
+4201 8286a662502bb6b5b0ae2b1b2a65ba1c8de7badc legacy-trunk
+4202 bceb720ee362b0947e0a8c125a3a71f8c46d76bc legacy-trunk
+4203 0b645726957e2329b9c83af08da714bedbad6ac0 legacy-trunk
+4203 4639c3ad834b7cc081d80d8ffdffef0ee53f7baf alpha100
+4204 ec25aad43724f055a3f826e39df7255da914cdfa legacy-trunk
+4205 cbb62ee8854a643ec9669fe3c657eadc61e6a069 legacy-trunk
+4206 b5468d886cb54a2034bd065646e4bd8de507d4e5 legacy-trunk
+4207 bbe9ea558261ee6debda3f80219443efc303cdfa legacy-trunk
+4208 78a365406c4cebf85ddc7b001c6ca344b797aae1 legacy-trunk
+4209 f533791acc7797ef33a6fafffd3c0eb28e359df8 legacy-trunk
+4210 697ee89addfe1e655c72daaa610eebe4313c1a06 legacy-trunk
+4211 b99578b878ce6c4c6fbe110ae404ad411f51c391 legacy-trunk
+4212 4d421f9e8373cc0a3104e1beb7d66b9f2d198503 legacy-trunk
+4213 48e6b319f3e480d99bf4035eba876efe07f9f42d legacy-trunk
+4214 7a2e76ecb9ef91df73b0b3d213937ef617660ffb legacy-trunk
+4215 9bc3dbf0871d26e051af256a64e45f3ea9752038 legacy-trunk
+4216 d3535d0626b46802b7485bde8fe6331aeab09b5f legacy-trunk
+4217 942c4d094a0c419c55a43f49bf3ba52dce51da8f legacy-trunk
+4218 a04689f9983e7ad7b16fe62fedebd585127765f8 legacy-trunk
+4219 6e913046028867a0eeb49d62774abcc873dc98a8 legacy-trunk
+4220 907605320a5fd7a4a52b9758e97ff708978497d9 legacy-trunk
+4221 68812b763e0e2bad2b794c7336f176d273db418d legacy-trunk
+4222 6cb759c6d1790d06e2c1da83c890416cedd9b38c legacy-trunk
+4223 b0dca2972b2b18d93e6ad8df0ce5763c1fa85715 legacy-trunk
+4224 51c2e5a9f39cd191f2c4db0feec2648b0ee72635 legacy-trunk
+4225 7b3a767924a1a9e32b55071f15976b2d05698df3 legacy-trunk
+4226 df7aa54adcd29bc01b4591eb423e41ab9cbc70b1 legacy-trunk
+4227 9d362e5e4e78990faad8b59174f6bd78c0518c8c legacy-trunk
+4228 17c80a9529143936e93c3398311486e2936513ab legacy-trunk
+4229 5257af80e161087c69570ec2357c0bbd6348e566 legacy-trunk
+4230 7e001c4810bbc762b0f05a779b967714dadd0cf9 legacy-trunk
+4231 ffdfaf1b24d540ccd2969f35965c45638d345122 legacy-trunk
+4232 98a20a40f613b13dfa7a54ae40c309f5d23f3de6 legacy-trunk
+4233 76cc858e3391580d155a5917da3930e2c3136ce3 legacy-trunk
+4234 92df30df5d779e822c00cdac2b45674e907533a5 legacy-trunk
+4235 20897816a4b6c8dd6418a64eb9ea54a0ab0d862d legacy-trunk
+4236 1c28f1934a11eea4b6828d5d3e8ea96752e1664a legacy-trunk
+4237 a3f199e8bac6f003214b00d60cdcbb0d21ea81a7 legacy-trunk
+4238 dd167bfd7a086a9ee661afab0805a43f42ec87c2 legacy-trunk
+4239 7707b9708f6cc7c3f9ebd7d4692ba06a30364b19 legacy-trunk
+4240 cb84dd51c2aa310e5bae71d9db4e741ca0ee5bff legacy-trunk
+4241 56a986e49f567cd6848784bc5b6450f00eee2c22 legacy-trunk
+4242 43ae7fcd78352a2f7ce295aada74deed18517538 legacy-trunk
+4243 36214c861144dd62a20ad4d3b27b9c8293f6040f legacy-trunk
+4244 535aca6ff7e9134718a02b4f4afb22bbe9763b15 legacy-trunk
+4245 a584b4bbbc5934c1ae41ed528ae792c104df52a5 legacy-trunk
+4246 668504843d0f4189c845382d0bd4bcdc57832b4b legacy-trunk
+4247 9b530bb54642ba186bb574b5896012b2009374de legacy-trunk
+4248 fa8bbd09f2e6b6c6e9747197a2838ce877c446a1 legacy-trunk
+4249 b711c901023293269b1de16781fbbe05e789a00d legacy-trunk
+4250 b167e335049120ec7b0fc5e68744c5e76f60a84a legacy-trunk
+4251 f07c4ff0f794686720f0e19be7355f4fb43e891e legacy-trunk
+4252 60660341ee1071b40fef935a3c16610e56e82ed9 legacy-trunk
+4253 ad3f1d362c1406cfc022a40a70ea9807eb3a60ca legacy-trunk
+4254 148ee2aa63e6dec591ac74520faec1d1b12ce7d9 legacy-trunk
+4255 b840296b9e058d274a890044d8cad53cdee07255 legacy-trunk
+4256 fafa5dc8100f849bfe71e4f06820f8b354992f04 legacy-trunk
+4257 b408d6a638195239e627e7a05818edb486d7f7da legacy-trunk
+4258 5b92a083934dbfb39477f74c064c560cc517e014 legacy-trunk
+4259 f2ce3191fc9de38b461bf5bb44e93c8f2a2a6ae5 legacy-trunk
+4260 782509813d572b86f90cc4cd27cba5c0793ec4eb legacy-trunk
+4261 6cfd43d5c0746b0ec80e34e4da59f28e770c71ac legacy-trunk
+4262 d8d941faf5110b2316d237f9381a24acffc3d8c8 legacy-trunk
+4263 d892ac4b4fb99e1491a270522410f0c56be9b775 legacy-trunk
+4264 ea5b13d11a1305bb404ed0ca8a28c1df82ccecc0 legacy-trunk
+4265 2d5b36a438ab9cf3858b7d70bd5962249efca381 legacy-trunk
+4266 c47d526a94d92e38e666e8cf3e21326715c04180 legacy-trunk
+4267 0406a208ca5d3c137b95d6dbba6ec3eccf42af48 legacy-trunk
+4268 6353fe25cdce4be53c9578efc06cdaf5a52cf87e legacy-trunk
+4269 3b4703173caf8664fe14f006da2e9e52e944da98 legacy-trunk
+4270 20e1d296fdcc86bceb82d6387f164094430813b6 legacy-trunk
+4271 a710fb001a3fb4513c21fb134c8804b764612495 legacy-trunk
+4272 a26b31e159bec41d78b96ff3f5ba7f024f390207 legacy-trunk
+4273 ce5447db8f537e2a04bba350ef49e3e454450f5a legacy-trunk
+4274 40594f80ab3c2f289e209f6954f90e4b1bee7ee1 legacy-trunk
+4275 76d0f2b3b9ee71179e0acd521490411fbae2e961 legacy-trunk
+4276 a6ef2c97c7761ed21270ba7ac5dee3aef63e1139 legacy-trunk
+4277 b11a0668b181ccbb456db784822b98bd834c9271 legacy-trunk
+4278 7931de01e6937de5a4d331d43555b0f2b3e627a0 legacy-trunk
+4279 ce897e752ca4ac551531a2022d29f714038d49d9 legacy-trunk
+4280 f5f3ddfec3c7b15cc9dccbaf11a1c517e976eb13 legacy-trunk
+4281 b464e1d0b2fb434c8f6b88b24258c236ffaa7562 legacy-trunk
+4282 c1b0d7eed9fdfac6c0b4d09757d2582d71b1b8f4 legacy-trunk
+4283 c4536d8af7b5d4e805f9f5dfad0690861ed208c1 legacy-trunk
+4284 216b755515e65d01ed2417cea9e70ac4a68c9ddb legacy-trunk
+4285 79e420805c67227b38940db59401c42185e0a5c8 legacy-trunk
+4286 39a4c15acb32dbe210ce8ba1f03fcb58a51fb971 legacy-trunk
+4287 f8baab5c016528505d817a6a97dfb7af9484e6e8 legacy-trunk
+4288 d799889c01e35b93e884d972c6ea7261bf741466 legacy-trunk
+4289 1203f0629527531c80b5974196686dfaa80eb8f2 legacy-trunk
+4290 87364d9e3444e95f47a407a825406562719d38d6 legacy-trunk
+4291 5f6acd1ab5c503fd3fe908b107545cc8c2c8b912 legacy-trunk
+4292 1f4a86dbcd7906417e9a803413980e8f4812ef15 legacy-trunk
+4293 bfd11620a2d81e8304f48f65522bb7294890104e legacy-trunk
+4294 23f03ef00361bc7717795b31ddc93150a5442b55 legacy-trunk
+4295 65cc727f1436c079727ffdd70916cb457b5da8a8 legacy-trunk
+4296 8294bbd945350d41d4eae36e5125863db3436fb6 legacy-trunk
+4297 d1e6c9a64a563841f60177ac907739f953f15630 legacy-trunk
+4298 095c1cc7f2bbb22ff116b0337ac3bd2d2fe37cd6 legacy-trunk
+4299 5243fb187d36c60b012133a1a5c660d7a35a1264 legacy-trunk
+4300 0d318475f9e37198b5a320c8e10e69a75223b14c legacy-trunk
+4301 b724599401ff73fbb8d595b9b3d63093634b4994 legacy-trunk
+4302 6e23af645b40bdd8e31ea0cc4c72d30ef778f315 legacy-trunk
+4303 1fc4db79146ae5ef577c06fba5cdf7c58d2ee47e legacy-trunk
+4304 145391df26579e1c6fc4410808ea6fb914945e57 legacy-trunk
+4305 09de723b259682665c466022c02202c1fc1fe1af legacy-trunk
+4306 9d4add42ee22ff42893eaf37702808a275157f71 legacy-trunk
+4307 2786acba6cec1cfb9a59711f4ce613d02536cca9 legacy-trunk
+4308 9dbdb83d4178f392758ec8af8d43bc13c244f341 legacy-trunk
+4309 1822465a35b80cfce428382e757abb4b27742463 legacy-trunk
+4310 e15f9761cb035bcb61d624fceaa5319da50ef83f legacy-trunk
+4311 0b08196e9ff616ec37463df33622137778d03b22 legacy-trunk
+4312 54fdc9a95f489093ff5ee30889b96ef6736e6872 legacy-trunk
+4313 78898b04a65bef1e621fff951753f573049574d7 legacy-trunk
+4314 d405e3e8ffd349ae763eb7b8cfdcf4fb4ad25d0f legacy-trunk
+4315 ef0946560620acb5879892ffa61d4b5133d28d88 legacy-trunk
+4316 855cefbb271863129ad1ed99a044fc8f42a38f72 legacy-trunk
+4317 aaf1e05e6842d8ed835598e5c7b59c82942d69a7 legacy-trunk
+4318 20e60714788c5da7a77992f7d259e3b8e3398955 legacy-trunk
+4319 9c5d333d3300e93240e15fe23a502686da67c048 legacy-trunk
+4320 758c1374f303482fcfc6f3fdb3b341007ea27de0 legacy-trunk
+4321 63ad28939781aa8d7579e086acc2d576566ac849 legacy-trunk
+4322 2cede61e9b1ba4eb8ba489fb5401d32c30256592 legacy-trunk
+4323 61738ed6cc10c42952ba92fe12174c3a63d4bdfb legacy-trunk
+4324 10a12473ee931cad24c73d5ff727f144e1df5690 legacy-trunk
+4325 32e6c3a671d00f7f0b16ad9e113d41713df036f0 legacy-trunk
+4326 9081bb7acd528ae934c582c2980163c71ecb1709 legacy-trunk
+4327 074aa263826b4669d0e244ea205d423e12bae7e9 legacy-trunk
+4328 8c9cc054c5edce6deae8c41f7d732bd96121f7dd legacy-trunk
+4329 cc5bf6be81a5d26f83d2968abd96a440b28fa00b legacy-trunk
+4330 32d005faf5fcd0be740a35943a2935f26004652e legacy-trunk
+4331 27d4f1f9346c574776747282686f23f811e36c15 legacy-trunk
+4332 91bfb2771554e817ae093e7d1c85e29f93b17e6d legacy-trunk
+4333 05fb9dec2c9cf1c4f8e6f45e01e2bd5bce678d51 legacy-trunk
+4334 3a70e9c0d9f511a57ae44ef04e7b484c5594b68f legacy-trunk
+4335 f84b64df09c3e62955ae9e6da17c17f84123fa4c legacy-trunk
+4336 4214a7583f2ba88b80e4ceb202b12f2a3cbb4415 legacy-trunk
+4337 afbf1186c8974a0debf6bf7b04cce2dc5591174f legacy-trunk
+4338 d3de2cad2c684c16035a49870d380dc82fd9089c legacy-trunk
+4339 ac6a9f90f6fd48d7c25408da0660add630583865 legacy-trunk
+4340 e7c6a18381d9e7a305c84880c1fc4712aca72289 legacy-trunk
+4341 be956b1efb97ccaa75e1aa97bc5d79c1e1eddb4b legacy-trunk
+4342 4e1ceaee296327defce4ab45092832ce70bb7e9d legacy-trunk
+4343 b7de6785c8ac7d9724202246a469c7763c2373ad legacy-trunk
+4344 24ae7af40a0960decde16783f63418d2cdfc7aa2 legacy-trunk
+4345 eec0dc5aba6011baba508fcb56313d7860225086 legacy-trunk
+4346 aba51621244e7b012398aaa3766d7bc16caa7774 legacy-trunk
+4347 2c8b4df22bc2f045c11d569e9fd29a364397e0b6 legacy-trunk
+4348 c2350c87be3fcc79e9751bd71915d5d190d97b69 legacy-trunk
+4349 654aa964dc263f9dbbe0584653d29ee3e38e564a legacy-trunk
+4350 3fbda87688552862cbb69a2b5cfe186a38be48f2 legacy-trunk
+4351 20f17b5accbf8200b872a90cc023505615eb3a9f legacy-trunk
+4352 a6776a788f749ae1d99ba52421f55c5b6e085445 legacy-trunk
+4353 5baf1135a13d3f5a632b7c702c03f3c05be44c65 legacy-trunk
+4354 259e69aa0f1598873001b0a90d5240b5e81ded98 legacy-trunk
+4355 53d17c04b42fb0f3449b4b8562cdbf855674ca30 legacy-trunk
+4357 e450bd43631a984286eb5403de691ebedd42a7af legacy-trunk
+4358 6109069d5612f0388e40208dd882ed5457cf8d3b legacy-trunk
+4359 61c3c1a2fdb443f2ae1e0e67762f1aef7b185293 legacy-trunk
+4360 9d9812f2798b73a650fa1cc121142f51dafcd46d legacy-trunk
+4361 bd94068f0fd037540ac504fe8174232ca8f23c4d legacy-trunk
+4362 0437738279a8d680793fddf9d5abad1ad72223cf legacy-trunk
+4363 0c232194a64f10c71c617a72c69a4c8dedac1192 legacy-trunk
+4364 35947f60528ed0157e21514f554038be26dd0e20 legacy-trunk
+4365 a7f269610ec2d79f7fd49d548f46238872d96baf legacy-trunk
+4366 ada19aaaf8c0c8e5071b57a4ba695df4308b6fc8 legacy-trunk
+4367 8623aa3915db702b102cc772cb3366eac2970340 legacy-trunk
+4368 8934121012969f03d0e8c7e2b0432eddd85a91ee legacy-trunk
+4369 80818c106e3e6f4877a84e426c061c7a7fbb51b3 legacy-trunk
+4370 e125f5021e673d145e3ecd8c6dec98d3f6c87af8 legacy-trunk
+4371 014a1fb9c6463429ac58aa47a638d162cff6bb6a legacy-trunk
+4372 f39d437287724e562796ab651150ff81d230f4c6 legacy-trunk
+4373 e0ae6f95bcfb419ce27389f9ff293ea2f248aa3b legacy-trunk
+4374 5f33ca5214521259e35feb03af956ae0fea7d90a legacy-trunk
+4375 275951b08608c9cc4d7beda47459306cefeb6400 legacy-trunk
+4376 3850713f6aeae6908d64fcb3815629660d1b1ad1 legacy-trunk
+4377 c1088d0bb5623066ce511e0870a20e17f7554821 legacy-trunk
+4378 58b0467950d822368d0ebb05ac4053cb22ca064d legacy-trunk
+4379 a1aba4d45893b0ada9625331663754a8c0b280d0 legacy-trunk
+4380 ea9e8533d6c32a93f0e4a318191edc432847943c legacy-trunk
+4381 e56afd03ca7fc94606d2daeb404e181c4b6a993d legacy-trunk
+4382 a8b7ee0e572da7de000e34e38c7ed4d48f30cfba legacy-trunk
+4383 f07d66c162cbffb603acc2f838999c913ff3036f legacy-trunk
+4384 faca7e328ba749c13ef56c0736141633f560c5d9 legacy-trunk
+4385 e3ff9e2a3eb7af5f16f0fe8d396a7a3c6790befd legacy-trunk
+4386 5bcaaed902f550daf2eb98ab60557f284176a8fc legacy-trunk
+4387 234817652db06c2d4f159aa175f6a5eb5675bb1a legacy-trunk
+4388 f3ae7c17ac087d9a00fb01c087c9e8ff928a1b6d legacy-trunk
+4389 d9a3e30b2e473c8ccab6005b6b3332777a880743 legacy-trunk
+4390 45c73018dd01d71cf383a3a24d5d844eae596628 legacy-trunk
+4391 320baeab787ac9d7054cf09d0d1e0f283b3c7f67 legacy-trunk
+4392 2b581ce43f4a37339829ef6eba54acfca3577220 legacy-trunk
+4393 93de5775966e559ef6c2cbb7766c304079ca7271 legacy-trunk
+4394 8b897b7f3ade8fc4d96543cbfc597030fbd21b27 legacy-trunk
+4395 0a9152f871116023822af0d6e7eefe678bd9ff14 legacy-trunk
+4396 85f1d2bec632ca389ad08c41411b90e0cb3e1f30 legacy-trunk
+4397 31873bd6f4a87168e468b9a5e5e459cbb0a48df0 legacy-trunk
+4398 8e8fddcbdfd2b25e4e13761a58a64b8390e1dd40 legacy-trunk
+4399 4be6ef1c2c1df5e1d834f5adfe16b869281a9a77 legacy-trunk
+4400 bbf82eb4a6d9d33f010800e1c734bb5d4139edd6 legacy-trunk
+4401 ba09d90f42bb263174a6d0a53e3104d46fef3e3e legacy-trunk
+4402 9bcac8da0262445c5ac08595a8c43ac41b03eab0 legacy-trunk
+4403 315d9c8281774d1314e09f9d1b32fa5f3ae8af42 legacy-trunk
+4404 f6b4e7acc7a374fa30c599851b3384a96cc64549 legacy-trunk
+4405 e157c81d03589d694976e14f678f366210798def legacy-trunk
+4406 b2c56e04cb82905e46e583e5678ae77e97208dd9 legacy-trunk
+4407 4c571d8c3ce13bff7fe501860caaf28f9f20d681 legacy-trunk
+4408 44e9415245fb09cef5f2a1fbdfa1a5c52f35021a legacy-trunk
+4409 883a22817472aed05836a05b4b09b64c4cff983f legacy-trunk
+4410 761051aa434db1f09db854ce7f20bb2d1a5eaf79 legacy-trunk
+4411 38dcb090f48b063857f8930eb8f174f2f6e9572f legacy-trunk
+4412 545e235831b7bb49fbcd79ad6abf6c5cc18f87b7 legacy-trunk
+4413 7100acb0d363d7eb78807cf792bd9bd8adaa4207 legacy-trunk
+4414 427c619ca5d07319b681a7102ccc7f71bbf986ee legacy-trunk
+4415 058a46d8faf7658ea1a29e567a9122ec35c88a80 legacy-trunk
+4416 641f6bbf807b9cc9792e73b4e09fa50cf8722dac legacy-trunk
+4417 a10d31ff3527da7d32f88b1b06f268673f3be254 legacy-trunk
+4418 78bf675df5e5dffa964dec008d6530362d91aea0 legacy-trunk
+4419 3ba17305f047f19024d3f999d4d34fbc1f77c843 legacy-trunk
+4420 dd7be8128410714b1946e3996113b659c13d0775 legacy-trunk
+4421 dc1dbf6b5211005bdbcab98f71cc56cbf9332559 legacy-trunk
+4422 4fb0a0807b0567402a26b158abcbf4559078a5d9 legacy-trunk
+4423 3de5a75494dfca2a58485d161e4b7b8bb4bffe0b legacy-trunk
+4424 84637cfdbc0742a97595e44d669247dc4f903b15 legacy-trunk
+4425 87a620d8476633db8b35b19d9e4d34d8bf3f81d4 legacy-trunk
+4426 4454421784d84ac94d39d9effc6254dff052ba81 legacy-trunk
+4427 f22cb5fee9c8b7d8265b379b8f351f301d6f208c legacy-trunk
+4428 f95c193bfe6534fa1f3cf8208656c01cc1a5d53d legacy-trunk
+4429 dcfe7fd1acbc5644fdde7217f5202441a9217724 legacy-trunk
+4430 e23639879cd05b96a5f273ae0787d163dd2fbcf4 legacy-trunk
+4431 ad25c52376b45b809fbd2a6c048d3db60120e2e3 legacy-trunk
+4432 42f95ea75867347e8240169ed9d9026bf6270134 legacy-trunk
+4432 832615ec07646e310c85316b8ba6bc9b17ad3547 legacy-trunk
+4434 2347b1fe812dd5ce653c101a07b1207cba7ead14 legacy-trunk
+4435 4e631032eacf2b9c6f976b658c841b0396f0f33e legacy-trunk
+4436 33515485ead0d6de33f282323a8b1233d63feaa0 legacy-trunk
+4437 80bd7af73201907d25711f1f6828a0ec6d1bd36b legacy-trunk
+4438 40611cacd5bd7a26ac1f01480b4c900985c2a0c2 legacy-trunk
+4439 15a1eb113a4308356860c19edf882a96632914c0 legacy-trunk
+4440 58eef51e30849c6a7834ed9f68d235c4395dcad0 legacy-trunk
+4441 558d9f95a6020ad633f6fa8edc7193f2a61efb4f legacy-trunk
+4442 dc6eaa1a8fddfed5e736b0197e757de4402518db legacy-trunk
+4443 77d1cabf971cccca208267a51b384d849351108f legacy-trunk
+4444 4e6056d980e1a1c073309721bd1911cbcd85f953 legacy-trunk
+4445 744265374450801f0f1fae029d809a886c106b31 legacy-trunk
+4446 f49527ecdb3ad5cd6a97b79efe035c86400c9043 legacy-trunk
+4447 af26d4d5c1d43a2bf364c492e55e634386268e35 legacy-trunk
+4448 fb198e1316b9bdc2c8978f63ee65bebbb9ff2491 legacy-trunk
+4449 1dab99b86fa8c3f6a7c44004d264ef1e36137ad5 legacy-trunk
+4450 f900c09995dfc42f256686c2ebf810c3f930134a legacy-trunk
+4451 63f875849bd8319144129a108c9d764bda7017b3 legacy-trunk
+4452 cf4d8862f19bf45740f9dfc01d5dff3fddf70cc9 legacy-trunk
+4453 c5a514f8f3e3dac5ac7c1accb5f1ed9171db1a22 legacy-trunk
+4454 d5f4d013dcc1443e3ccb4409e78fd95b36d91adf legacy-trunk
+4455 f05b5cd79fbedb73a492ecb96c9b1a04b682cc47 legacy-trunk
+4456 e8952b8dfeffcdacf445183f9ead09eac773fc47 legacy-trunk
+4457 a70883803338a0057184e948cf9f521d54faddef legacy-trunk
+4458 7f8719a3666203b7437db6dd74bb15879360b453 legacy-trunk
+4459 ed5d0ad5ea2f1fde836d44430413fa9511aa6839 legacy-trunk
+4460 3aa9184cff8b6c9bea07a9a60803a1329e35598f legacy-trunk
+4461 7c53e61bc4ba578e04a681881b51b832d0080f48 legacy-trunk
+4462 811c4e4622aabf56bca287c2417f6553f983ea55 legacy-trunk
+4463 392db18811908c7ac72185a18a6911a145121e21 legacy-trunk
+4464 f65ec3dcc5631fd55ba8bdca31e8cf5bf0cffb6a legacy-trunk
+4465 f27800965ff7cedb07d6dba92a9ead4d625b2df4 legacy-trunk
+4466 0bae6ab9c9e0e765e8890248426e29c6eef41de5 legacy-trunk
+4467 dc9b6316b9b354f21f0a33c28884ceecaa4ed776 legacy-trunk
+4468 69d48cbdc2d9a3937427666b1467b62d7927acac legacy-trunk
+4469 ec05d9021bccd82301538c00f62524481aafc0d1 legacy-trunk
+4469 9895475d18c7b5f32adaf78f71886ae041e4d10c legacy-trunk
+4471 a4a85450ebafe324cd34fef275bdd8640a96b6f0 legacy-trunk
+4472 5a0775ce7b311eb96a760de2a8f7be9c0bc018d0 legacy-trunk
+4473 9e3469c0ed75cc24a15df3b6dcd7a58e6ece52a8 legacy-trunk
+4474 7bda0f2c170cdea2966e57dd9ddec30179d4ff58 legacy-trunk
+4475 ee12edfc209599ba1c36cb4ffd9a5fee15b41d09 legacy-trunk
+4476 eee3d715f0cfbf1ea2f4c4297f72bbd3737ccb0c legacy-trunk
+4477 3d431a521132f23a08bd6dc3542215eb021f973e legacy-trunk
+4478 72b2ab56e40352e3edb672ed41c5ad6003047dfb legacy-trunk
+4479 fa7bc528314bc461daa42955cdd6a38591c9a3d3 legacy-trunk
+4480 97d614b24c08cb546361ce1fc75251e8f828b1e7 legacy-trunk
+4481 5c74c3aeda74af6ac72320280bb9ebf3a93fb3e5 legacy-trunk
+4482 d4a06e8056b87f9a3163b6122dc45351569490a5 legacy-trunk
+4483 2a3c8bebf1568af289592750a69fbb67e924e6ab legacy-trunk
+4484 671cf1f8b0c33bb718390ef383ec6756cd210af5 legacy-trunk
+4485 1739f00ffc8631e30a67f8a653691c8ba33eec05 legacy-trunk
+4486 609bfb8ae7f54aee757031816914373a233a5bcc legacy-trunk
+4487 e43a1942e58806a124f7041e78be01cbb1b72b3f legacy-trunk
+4488 f236adc28e7770922e0c671d0bffac22ce970578 legacy-trunk
+4489 ce69742f2e77795d1742edaba7582a052e958260 legacy-trunk
+4490 83fcb9db4ca8ec4e9f74b48e2740e33bdda71856 legacy-trunk
+4491 370f8cbd7c323e885a33024ea7f662553a1cc886 legacy-trunk
+4492 5983d2db590457ab06db6abd6f74485eefbd838f legacy-trunk
+4493 0701769090f49bf1a314b3d5c50eba9033383da5 legacy-trunk
+4494 3d822e32c32970440e577974ad325d60c6c69d81 legacy-trunk
+4495 e28e10e5deb2c3132510f2e6d63eebf27fe223bc legacy-trunk
+4496 ea696f2487fc86285b8c3e111e11e66d68807bda legacy-trunk
+4497 4ebee904924e6aa778e9e410a8bc2497208f996a legacy-trunk
+4498 281e40652e234538455007280d47c26997de68a2 legacy-trunk
+4499 62bbbfe6bbf68286886843a76e373ce2b6fc2828 legacy-trunk
+4500 1ce3dbeeb8909380e3b1b78c8e29198334fb8332 legacy-trunk
+4501 f18c1915c722d175198a36b479c96c3d39db4a26 legacy-trunk
+4502 c85abcc752b1846430690fcf7ca1ecc994928b2c legacy-trunk
+4503 07cf3b3baf16fc3370ac958eb6cc99272551cdfb legacy-trunk
+4504 19363f8570a2fcffd2da260a45d4a207584082be legacy-trunk
+4505 23dfca8aa73b04056de750df84bd3d37cdffc999 legacy-trunk
+4506 d7e91437f0a27e2747ce02ab1ba508f4e5d8ec3c legacy-trunk
+4507 de49d49044d753df113043b4b79362503f78dc49 legacy-trunk
+4508 0319b12321d7ddbf20a0dfd6fe5a2903396d6ada legacy-trunk
+4509 cf31eab6ab5ae2e01f4c66bcc9d5fe2cae0c0a14 legacy-trunk
+4510 aff5d7d06735c8fa0af95ddaa8a2671acd8de50b legacy-trunk
+4511 79c171f581fcdee30993fa3d2cce2491025b51be legacy-trunk
+4512 508036dbba3b4f2f6f12834dc0600a04891d6722 legacy-trunk
+4513 866c81068dbda271ee22b8c085c30c24a718cb05 legacy-trunk
+4514 146890653a57ea13b28ff46d46e92fd4c638eab2 legacy-trunk
+4515 172ba04a51916cb750413540e03f6f4281af41d5 legacy-trunk
+4516 d0d0a69b5ca34b75ec77dbfc89a5affff620431a legacy-trunk
+4517 5ed06594352621547f536816c749058072ff8656 legacy-trunk
+4518 280f31e6c653be40fc3d55defaf1cdd8cc9feee1 legacy-trunk
+4519 26cd4d6c2d12be3eb6ec7ad3352df82fb1e57a2f legacy-trunk
+4520 000ae642f9b889a1adf982494f07228de94746cd legacy-trunk
+4521 1b99451fa1436cad7842fec5c59aa2c04d62ab08 legacy-trunk
+4522 5227324d64e42987cb86cf8b97fa496d44ad21f3 legacy-trunk
+4523 3aa7a77844559ac474b5f629e759f16a8edfc749 legacy-trunk
+4524 be5ab8e89c4986e82298aca4bc653be83892bd49 legacy-trunk
+4525 048e91a59c75e8ce60a35321fad0cac6072ab3f0 legacy-trunk
+4526 cf65a124fa4b769c6921b6a9f65c2934b0fa7ac2 legacy-trunk
+4527 68a38cffcf583c2918a5388905c19bdeba191282 legacy-trunk
+4528 a36cac79c5af7c1c1925a41c52ec2917eb91bd26 legacy-trunk
+4529 4c347e4d13f1f1165c80dd9ba418effdaf1d8050 legacy-trunk
+4530 adc028b977bdf6bb7f5ac1cde602e786fa8ebf57 legacy-trunk
+4531 3848094f259ca7bac69446be7f287919d7ea3419 legacy-trunk
+4532 df6fe8296bc31d53c3494265e75aae3fdba700ce legacy-trunk
+4533 5bbf0a9c9a428ac7864d30009963c614e0be27f6 legacy-trunk
+4534 c21cc7b3ce283373cf7d2e71365895703db3c71c legacy-trunk
+4535 afecdec996ff50033625b5f5cc6b7fc72f95a494 legacy-trunk
+4536 4afa7eb4734bcfaf652fdbfdc877b284fbf73dbc legacy-trunk
+4537 f2d267edbfd68767093915fa137dde70de12ea83 legacy-trunk
+4538 abbf2a4b488b371a2e645995aa3ce161e475747c legacy-trunk
+4539 8921a2881fc7f26468cd8626250ba4af0434edd6 legacy-trunk
+4540 2604d11c8b40459c0acb205fe75ab2bd6099c731 legacy-trunk
+4541 65146b52f16b934ddd0d495aca2d7b71c2c09c2f legacy-trunk
+4542 1940e1e0cedf5d55e73c0fde0f536adc28c78033 legacy-trunk
+4543 53aa51433f7fd5d53c270bbcd0134b4471270b87 legacy-trunk
+4544 f78b387b54e0a3995a0d275d9be46a82df91270f legacy-trunk
+4545 b4d982c648bb3e7602a959f4153058715a48a182 legacy-trunk
+4546 b03b43bee1ab3ecff6a523caa50166c0918cd78e legacy-trunk
+4547 e8cafb2b743a7e4c03d869a342a0cf6cee129188 legacy-trunk
+4548 d356c473db993fe74fbffbbd7385b6bf9303a7c7 legacy-trunk
+4549 0d7e4aa595f7aa5b4d9b80e5daa00b750754c0de legacy-trunk
+4550 d5c935b9a7b50ce54a8fd2a5a3562c04fb2dc340 legacy-trunk
+4551 e4588404fdff25400c0582a55306b90163439e49 legacy-trunk
+4552 b7be0382f9ee69d16a1b8cff72d9fd8ed855935f legacy-trunk
+4553 ba2e21a54ae3991a4bea3b8ebacc8f34684ddcfd legacy-trunk
+4554 4574ed657cc9f9a55cae445415e6a78d9874a89a legacy-trunk
+4555 fdccc3222d0ae7941cc45aa6d93308909fbc3487 legacy-trunk
+4556 30821bc2dcb744fb0af175d7bd28d295dab625ea legacy-trunk
+4557 bbfac3e2570d9ab220dff7f61d91222bb95a7aea legacy-trunk
+4558 7493c6805dc6e5cb9347beb668eb111e2ac111ce legacy-trunk
+4559 ea7b2bf0b52161f96a5a97c2ca8be6d300dc51fd legacy-trunk
+4560 2ebb21284f3451a769bf578f6bfe44cde8e496bd legacy-trunk
+4561 01830dc8d6e5d36bfd01f22f56712ef2239ef1d0 legacy-trunk
+4562 af41f4a21682ea8213627add453212e60c3e7cf2 legacy-trunk
+4563 07080a2960707bbb9f01ef6630a9fec0495bc233 legacy-trunk
+4564 6c4905ffff01e9b8920e4829a928b65ffcd79190 legacy-trunk
+4565 30cbe024df409ec0d7e32a43746d78364d5423fa legacy-trunk
+4566 2669ef14c20541990d6dbcee99e1bc2f43676fdb legacy-trunk
+4567 76c860a18d82343fb4e076dadce4fbbc5080e738 legacy-trunk
+4568 7947c0d16ca041e6914ec8921850c38b4125259d legacy-trunk
+4569 7ea369d05c2ee195e122d4d7cfd0d85123088400 legacy-trunk
+4570 d73eed3530010c4fd4c802a09093ae0ef4d3f616 legacy-trunk
+4571 5df69f294ccc6f6d4661e84e39e06132b070a754 legacy-trunk
+4572 aeda864c11c4463925edd20a186ad1d48e7ebdb3 legacy-trunk
+4573 1dae0d3062d263bb6cc6851e7289a05c766a2e75 legacy-trunk
+4574 84b61fe44573048400cdb1e711f06dacdf4b32aa legacy-trunk
+4575 86d9e91405c8553897c8870c40ecef2b8caf65d0 legacy-trunk
+4576 ba3fd96f055ef919b4d80326b1675bc352838667 legacy-trunk
+4577 fd5ab7e828fccc0141596824f8a75caaa26a7aa5 legacy-trunk
+4578 36847b8b575df651f58aed5813696eb76df6524f legacy-trunk
+4579 bd061dc30842e7504ede4d7c37f3e8e1797905d5 legacy-trunk
+4580 af36bae343fcf8daef48a98541e37c396f2408e9 legacy-trunk
+4581 695401692c46fb62c4e8c8dbd7cf911c0dcf55df legacy-trunk
+4582 92da8901517e3f15c98c918b2df240a091a4cea4 legacy-trunk
+4583 05360cd616ae38867510545e694ddab249e6c74b legacy-trunk
+4584 ca27c2fe0b8d4c6b56e4f06b631a5a6d8c47263b legacy-trunk
+4585 fe922fed6b31d8c84ff60ae8eb645325301ec529 legacy-trunk
+4586 4ddf554457ad5d1b201cc9c6af32311d61bf942c legacy-trunk
+4587 c16d693bfe73f52f43f80780a8f5a1f5126e590a legacy-trunk
+4588 9d61c5749bf82781a7a06039469dc813ae284973 legacy-trunk
+4589 4f90b474beec340f059f05968ad0aa997eb66cc3 legacy-trunk
+4590 c57b5c50a2d2954f6a0c1cd8a1b51f8cb0023bef legacy-trunk
+4591 c9085f1e977f3380340bbfbc191c1b2f156319ee legacy-trunk
+4592 23f0403178280ae07cfb3084fafd8cc57ceac652 legacy-trunk
+4593 94e2ca86590a56d3874dc24be5deb73f953b781f legacy-trunk
+4594 173dd00879ab6000c82dc6498fc8f72fdf7a8d4a legacy-trunk
+4595 84923d92b53e7ac1a6322a3280e341ae7d3612bc legacy-trunk
+4595 16eb4c51ee97169046340998e850a63c65225b0a legacy-trunk
+4597 7ae847b1b269228b9cc384e0bafd04a36793be1b legacy-trunk
+4598 0e60cd207adbb24bd5b3c2b844b7c08673e044a5 legacy-trunk
+4599 e9e93e07354b8bc0b39401462a70a6b9b9dba0f9 legacy-trunk
+4600 9afdbf944c2a03a649a57fe0a323cd12251c560d legacy-trunk
+4601 838ef976882103016785b97d40eb92cd9d301f9c legacy-trunk
+4602 f99a23998770bab7e2f25656f7d004a65b938b52 legacy-trunk
+4603 6060d7fb07e34245e9730bffd862107e884f4a34 legacy-trunk
+4604 448435bfeadc0d46cf55c68c92f503f6d9cf6811 legacy-trunk
+4605 5fd8524dd03a210a9378b6b32ace173b8f001c87 legacy-trunk
+4606 1a52351a00b26cd059a6bc9e2d9518e769a1f1da legacy-trunk
+4607 e54b8654f9384f1227ba2197feb5fe1611addec8 legacy-trunk
+4608 0728feb1d031b48842b7198370af2c78688af542 legacy-trunk
+4609 84971d015965e8e8f2f41f44593f232f68d6a547 legacy-trunk
+4610 cfbab79a799f4653552271da5020be2220516387 legacy-trunk
+4611 1e0838bb8f2208e292b300341623ef832bc209f8 legacy-trunk
+4612 29720c5d9e7ec4221fc87f1b222f805319bfd704 legacy-trunk
+4613 a619a61aad1ebb8c880241fc2ced0f1e062c022d legacy-trunk
+4614 899b4e3dfd4cff99ca40ed72c075384502416e1f legacy-trunk
+4615 f06222e07ca7553795836f7e94447185a691587a legacy-trunk
+4616 c9aea34ae4b699714ae813e475f4874e2c1dbbc2 legacy-trunk
+4617 ee0b3cb37af88cc4c93670a16d19a8e3c38b982a legacy-trunk
+4618 459bf7d04e05beb829e2d4d025b7daf83c96b03c legacy-trunk
+4619 f49b6372492f28bb73b415376d7e3b4d21b8400d legacy-trunk
+4620 7a6b57febac46c10621cdcdd7339218d4c9bbbfe legacy-trunk
+4621 d90c914c577d20b421f10e72a907395e58b396de legacy-trunk
+4622 9a9f3f5d6f86032212f0073a52990d9f1e18040c legacy-trunk
+4623 92cd85470a769df577d80ca624e6a0758ded1059 legacy-trunk
+4623 b45c688756d04fb84d4a0d518fc3d7e3cb25fa8d legacy-trunk
+4625 7ff6d999f059a08c8c82b83c052d514f6cbe6518 legacy-trunk
+4626 8adcb808d8ddd842955481fdc27ff6221eef2d61 legacy-trunk
+4627 6f35a1ad1acc833590f982577c50ebd60bae9db6 legacy-trunk
+4628 5eed83216e6c55b8568a99f5647cac90e1d91210 legacy-trunk
+4629 0445725fe5de4caeabf4938d54ffc06f010d678c legacy-trunk
+4630 1e9e74944bb51f48f862919ba6890c1271bcd660 legacy-trunk
+4631 9f500a34c35541811c564a892ed26f786ddf47cf legacy-trunk
+4632 65d87f06f08fc30b83ac0a37104d66b0c4046948 legacy-trunk
+4633 8da03decef593dde0e44ab127a6c3a4ccdc0b948 legacy-trunk
+4634 9b451c84a7bf93011012628594f2a7b44a6f2079 legacy-trunk
+4635 0048024b7ef84cd9c00e578d97620c15159ec25d legacy-trunk
+4636 dfabb13bce70fc181b26c02b419cfa0550991882 legacy-trunk
+4637 62bdded5f00a23151c48396f2071d5215b7ac4c5 legacy-trunk
+4638 87f4d6d2e9c89a84e990216ca6575b8815f9273e legacy-trunk
+4639 9c8b4323808bc0f99133d9b27e2b145e979cd123 legacy-trunk
+4640 95cb52b85f7867fb47c687994245bc7c5d5b9a52 legacy-trunk
+4641 968e2484d94da382d49c733c03c4e2993d117445 legacy-trunk
+4642 6461ff0c4bee6f30562a15483387c5de176c5f19 legacy-trunk
+4643 d59568381447d0e32995f75a73d20a28588d834b legacy-trunk
+4644 b40e10bda23191d2d76b788346d4d122a486b062 legacy-trunk
+4645 f48951daba4ffc3e75625f34a4df3e63aafeebea legacy-trunk
+4646 f78fbccaf58cc66d1b806635192b51eb26072ee1 legacy-trunk
+4647 1c012d82a9758c22b3745797b74efda96e8b1324 legacy-trunk
+4648 8e476ca3a7a3f2faf6f1f6517d6bbb8874069647 legacy-trunk
+4649 ccc279ff935d0f54a6bc9815fe1512d505252be7 legacy-trunk
+4650 5e568bacfbe99ba62a82a38ac527425bcf782dfc legacy-trunk
+4651 91a43ea11ba3594c902c1ebe6564b102610ae98c legacy-trunk
+4652 27557e70a8f029bcd793b72c6aa097d32e082321 legacy-trunk
+4653 f4671b681ab98e7620fd9729c436180e709c4608 legacy-trunk
+4654 5ae922cfe4049347bb07403d00e56dbeabdfd18e legacy-trunk
+4655 8f1daffe799bcf34e07afbc98d1377088346f4cb legacy-trunk
+4656 9894e55468ec60f75a2af00633df83400349458d legacy-trunk
+4657 cdb373f65bf380dbd29472d78814b2e00e00cb4e legacy-trunk
+4658 02dd63d3fe9b31370ee573664be2a21195a4445f legacy-trunk
+4659 527889ae8450390977d3e89521b4c2dceb913415 legacy-trunk
+4660 0e302771ee5a2bfc7bee19c287fcf9b3f83625bf legacy-trunk
+4661 33ea9cc7d7bae723c87a27226d823403c484a891 legacy-trunk
+4662 c68a0113b75a27fea33bd3640cfc520f1a52ad7f legacy-trunk
+4663 4053d4cb50e0d701746a75749a67ca08b7cf0288 legacy-trunk
+4664 e734c7235727e74b54ad79b30cfcef2d35c2410c legacy-trunk
+4665 eb3e61db0dda9c5af45589ca221e381e6b15f3c7 legacy-trunk
+4666 64eb487ca465d6b6a28605e998c8751caa1771df legacy-trunk
+4667 939791f219a63ed8561ec6bb756c4e77f4e9af59 legacy-trunk
+4668 272229348fe2b77a15c4e3175a7569141eed815a legacy-trunk
+4669 a3bd61632f145ed988a1c2ab7d59a0c504c7975d legacy-trunk
+4670 abed368d68ef1890c6725cd91eb9f1f2d2eeff19 legacy-trunk
+4671 76d43c03384810b52712abedc6b59ea71f9cd197 legacy-trunk
+4672 cfeaa5082ba831b621a034b77293b84eb7c3228f legacy-trunk
+4673 0612132e001857ee4a8c4ea0f91f356c4c316ec5 legacy-trunk
+4674 9bc3a5baa680e38d405ccc7198e8d482e6d05936 legacy-trunk
+4675 74a0a6121af71b6ac734965adcbda705c8f8a18e legacy-trunk
+4676 bbb56dc3b526b552b53f69e72cb2dc03c70ffbd8 legacy-trunk
+4677 aa3365815c20d75b201323ee64e210734ff5d7b4 legacy-trunk
+4678 32435d33f34a6f44c8ecfb5408d4a238d6867e9b legacy-trunk
+4679 497197f3573c10b94e3e108c6e9ccdfe251873de legacy-trunk
+4680 c2d18b58232edef165b3150e62034099590262a3 legacy-trunk
+4681 e53d019e7d47612d2e646ff783f5898bd4fb64ce legacy-trunk
+4682 9588c238e6609c1312412b5b213dafa63fca0ba0 legacy-trunk
+4683 4bcf1b96efec4f116b330940f3713a2fc9762882 legacy-trunk
+4684 92e6f5d8be82ab91448bc673fd4e8ff4d756c58d legacy-trunk
+4685 1e8b347a056cf3666efe53146ae37283dc8724af legacy-trunk
+4686 8d5e36b37a413229fa91e117d78a1f5e478a9725 legacy-trunk
+4687 01037532c0860a1bc9941137a24d9d7cfe3bb2b8 legacy-trunk
+4688 7b6540496f554bb6e574f1a32e6500fb6edc0b33 legacy-trunk
+4689 01ed4cd21576cbb450c8b816ef710cea7d44fcb6 legacy-trunk
+4690 1b662497426b53a10e2e88f00838869cdd653cf3 legacy-trunk
+4691 0b0b18d655d2e9c05e4e57fe2cff8d6a81e21c56 legacy-trunk
+4692 b5dcba7b732d03b0dbdc00051cb801e77f13e705 legacy-trunk
+4693 442bae8fcfdc6514f19d1acff8ba61115df2fb08 legacy-trunk
+4694 94b84535c34e11d8ea25babdbc0bcbbe1461c587 legacy-trunk
+4695 fefae37c053cfd3bcef3d939a8f3fd756b78a8b8 legacy-trunk
+4696 d3b5be0c872f33b1ee91086344ad2c70c62021ab legacy-trunk
+4697 283a8eb2e317cb7d7b115ac8b04a2ffe9f634bef legacy-trunk
+4698 72e05c61c2fe593377ea73cb8eb4b5c87b206256 legacy-trunk
+4699 7fa48ab4be0f4bc3f513a5084c19b6ff3a02f600 legacy-trunk
+4700 1ab35b6f638a266b7176775f4408cd3e9db6abc5 legacy-trunk
+4701 8ad1363287aa8bc9835d2b451299566f452b13c3 legacy-trunk
+4702 438f53e7cfd14e95ea72d89d0c7bc49f5a59c208 legacy-trunk
+4703 a76a79f896cf5fe2113bb9f66ac4dd6022d53d71 legacy-trunk
+4704 3bef1aff871bc349207085974515a356d1d57c05 legacy-trunk
+4705 e0a3242d5ae79d1620a226242a8b3caa1394eb93 legacy-trunk
+4706 e9d11f9b82e2b581a96b7325e23cfd077a389493 legacy-trunk
+4707 c23d092215d2c3e5f803222225df71a6c3a76674 legacy-trunk
+4708 67e8ef698a42ff2720af78150ecd97d0c3348d20 legacy-trunk
+4709 382edef2d6d70d37c34289e8b74113827f26b8e8 legacy-trunk
+4710 d091b246a3a7a5bb2c1415dfa213cf19fe64f65b legacy-trunk
+4711 ee4c954cd5df52e9c407397d4dbcd1ca10424435 legacy-trunk
+4712 b1a6a81af1cff47d39a5048a18ca981558f57274 legacy-trunk
+4713 83d06404f6e11442cd310e69cabafe7a7f260aba legacy-trunk
+4714 a81b6db6d33c94e8d094869a2111b870898b7200 legacy-trunk
+4715 645e96343f89fef8db98f53d6a88f374ff0d5c7c legacy-trunk
+4716 03bd79432f069c632ae5ae8421f724c13ef71da0 legacy-trunk
+4717 7895a97313e5f4cfad24c5a6ba56e8464539e20e legacy-trunk
+4718 85aa2e4d0123c53c5e68e834a46fc70b85195aca legacy-trunk
+4719 4bcc92916fabb2f6c51e4e11518f667edaf7ecf9 legacy-trunk
+4720 3a83c3cef4b2b5c84a9367fe2fb00d36b9431ea5 legacy-trunk
+4721 7411b6a06920cd6d4be2106daf14fc2385d3bc80 legacy-trunk
+4722 ac6f69b1e9930716203a7a54a126fb8e786205eb legacy-trunk
+4723 a8c6da3bd3056dd56f9fe038ccc14b38d5ab19b4 legacy-trunk
+4724 3a658eec1f02e1485e6833d6f0ebd1c8b7daa6e1 legacy-trunk
+4725 8a1244e7cb3bd2a483cf3f69a50f0ec3b8473323 legacy-trunk
+4726 58aa7f3b1692bf5798cea166de32019daf8c3bac legacy-trunk
+4727 0765d0bd88d6da5aff04186724240f3364884452 legacy-trunk
+4728 90880bd09221decd3abc8ff53e7cfff639872f88 legacy-trunk
+4729 e5b9f644053e9e0c4cd1bdd91039ee9699719419 legacy-trunk
+4730 66d6d13df4f8a98204ec4ba43bdb4b33732ee757 legacy-trunk
+4731 df7e26b5c9189ba43a0a0df42d823b4a90ed9bf9 legacy-trunk
+4732 65644766158ae8e4ca9732a5732696f53b5b6f2a legacy-trunk
+4733 618701cdf600010602d9dba694267a3d25ba56f2 legacy-trunk
+4734 650cb67d7659842dee8dca99bc555ffa95725eba legacy-trunk
+4735 eeaaf875f7b6813973ee7dc0f1df75363f2d86b2 legacy-trunk
+4736 b034b4ea2b399026ebceb54db992bb1df08aa0cc legacy-trunk
+4737 7859d3aab1b40519d8913ab222752f1d54e6c2dd legacy-trunk
+4738 71c11a6e4bc00f2b79c219a106b2148054718048 legacy-trunk
+4739 5e6c0cdaa7c1bbccdc2d6d6102e90f2891c0f2bf legacy-trunk
+4740 5546f4a6e3c34fd2e3197f57bcf22e26028124a1 legacy-trunk
+4741 540f8444ef8a8730093417cdeaf3c2af87956d48 legacy-trunk
+4742 b4caac1428d0da7ef0999020a700eede29e5cfef legacy-trunk
+4743 3195db6689fd613eeab16b68b6ed081d18468d1a legacy-trunk
+4744 f5a6e6ee529c07ba75c5684d055c36f5cfddbd98 legacy-trunk
+4745 ac8a225b051b75772217b4f0e4931e03586f7b2a legacy-trunk
+4746 01a95412457724fbd21aa70168698f0163612185 legacy-trunk
+4747 a241462419913b7851a07ea578b13a9f85da3bb2 legacy-trunk
+4748 6263e2fd93988813988154f3bb14fe7bf8f2aa31 legacy-trunk
+4749 3d6c9a47ea445a53fb2371b6db00f95d2f9315f6 legacy-trunk
+4750 f17d6e6b40dab14c5acb15293f69825474aa8f5a legacy-trunk
+4751 9717f6a8f5fafe9ebcf2f68de74278ff2e086e19 legacy-trunk
+4752 fe8db78f311c96ced68cd87953f86ce34e550bb9 legacy-trunk
+4753 990099ed781051d55e4c02f1331af4a02c765e47 legacy-trunk
+4754 d2049a1d3cc5cf1cd2ae658c1de4392a2e337dac legacy-trunk
+4755 adab66fac30e97ec7866ffe03e3703358efeaf6a legacy-trunk
+4756 6a04256ea0877c074d2a9388c463ff3c92ef28da legacy-trunk
+4757 505fc478ff08514e523da618d4f553e197681db1 legacy-trunk
+4758 170b99862d095d96385931a1bb3dfc1459b84fed legacy-trunk
+4759 65a68c51e9f2a70ff36ffcd096e3d903aecafd37 legacy-trunk
+4760 08b457d6b516edf456ff763607a20485a0a7e4cd legacy-trunk
+4761 5aee2c5d8dffcaea3e86a778d07bfaa4a6bc69ac legacy-trunk
+4762 14b126d0b5be34bc97b12d6229809edefadf0374 legacy-trunk
+4763 56ca67ddec858b56d0f0017ff2bc1f6a481987d7 legacy-trunk
+4764 07913fb8f92f0499390b7ab12937d205d5359c84 legacy-trunk
+4765 fc6e96221088b082357ad08b8782c4677c06b9e2 legacy-trunk
+4766 40aec48cd1e2147d8f9af06b1cb0dd00face43b3 legacy-trunk
+4767 ff72a5f9a4ee124aa0d88a9130bdb865496e81fc legacy-trunk
+4768 515e1d03394ad8669ec4d998384df07926094773 legacy-trunk
+4769 1425617514accf8aa30c15c5530506fe8821fe0d legacy-trunk
+4770 ed821a99ba39239507c00ca5d7de73588c0c5130 legacy-trunk
+4771 1ce07f64862e9f5f80c656e68f0157c63e86ed95 legacy-trunk
+4772 99e7ac22bd2e2d5188c0ddc22820d617aac6f082 legacy-trunk
+4773 1e720712816788c6ced8e958f977764e45a8a3ba legacy-trunk
+4774 5f7058d816cf91f253340d4dcd0bf6b9df6c7f3d legacy-trunk
+4775 3161e7cf2054f736f8c28c16cd3b9ac1dfd7d9b8 legacy-trunk
+4776 d3e2f988f1af0e14805c5615fb38c4401579ed0b legacy-trunk
+4777 3dfef67e0ded90e7d1128a3fc2a02420a5aa2f30 legacy-trunk
+4778 faaece7ccd6e71b15d480372025238db60a4acc1 legacy-trunk
+4779 7bde4b1df494097f7aa1996574b63eff887ebed0 legacy-trunk
+4780 e8d207658a0452b1d592773d3ee84b5c08adb6f9 legacy-trunk
+4781 43f9e7549c70e6e837d0e0a666ad2406f4e36b3b legacy-trunk
+4782 3edec8211a36ad57193e9d8819f759000f2e29ff legacy-trunk
+4783 1b262d190a4a4810983cc3d665b5594493399c19 legacy-trunk
+4784 84560f4b29ef09a209cdcc788d4f965f3eae3721 legacy-trunk
+4785 242dd5ed3b085eee2f42672ba6504952226a299e legacy-trunk
+4786 32e7d2696d791c69ec99ab1125617e8f4c78ae26 legacy-trunk
+4787 6468fd0251d2968e631186fa946a504a60afd36a legacy-trunk
+4788 d8b4c7db77ae6bff8b25ea27983aa2504695522d legacy-trunk
+4789 e11e6b3585313aa919d7a4e2f81345797fff6335 legacy-trunk
+4790 b2241177bccc6277332e8a5e957f8cb876bf3403 jar
+4789 9e82daf7605bad7976a9abc997cb5e0abe434078 legacy-trunk
+4792 71e60871c681ce9141974efac3e0b33c9fe3288a legacy-trunk
+4793 4c2f1452125d59d075c6fe7daf9014cbdf178f36 legacy-trunk
+4794 4127893a87ad05a022ee70b58ad81c637fbf9e65 legacy-trunk
+4795 21f0d5f18cdae6108f5fc5fd25451982d6019f9f legacy-trunk
+4796 63fa387c02febcb08b054a0ee2033eb03a877065 legacy-trunk
+4797 670e50ae389d54cc32101cfb4d5ad68f608f0556 legacy-trunk
+4798 4b617fee427d3638c87c0d62d8c9f533b38b9b77 legacy-trunk
+4799 ed0aa4a5d106b9c2b7b2ed3d850e484bd7068463 jar
+4800 279d51a18ae4b4e8dcf007760a9778d8bfef88b3 legacy-trunk
+4801 9552edb4eabfac341a6d3e4f1013fa948c01770f legacy-trunk
+4802 f09d3252a38b213eeed2c776a18bf27a226383f8 legacy-trunk
+4803 d05685993476d4cb70f5b34addf1118010f39f06 legacy-trunk
+4804 ed486461def676f06199acafbadbfcc1dea1ae73 legacy-trunk
+4805 d65c485e0ad82360037f8ab56c438991e5ddad86 legacy-trunk
+4806 a2054933775b0014d605fde3f7f14a85ee3813fe legacy-trunk
+4807 85fa02b85d7d130a14a91d6bc2e5f5c4e5601e00 legacy-trunk
+4808 26b1b15fc8ec3756a563e4e71e7bbc7a81ea4fbc legacy-trunk
+4809 8a8765343cc0d455a061882e57ca8a142d9fb22c legacy-trunk
+4810 fbaf5416971173b36606de4e5c59a75bf56902ee legacy-trunk
+4811 df5b728b8eb62ee798607ba38650a613d8cea581 legacy-trunk
+4812 6a94119844eb3820e44fc3369409fcc9bac73997 legacy-trunk
+4813 1740fd76fc332fbc4795e1fc83fddd073d54916e legacy-trunk
+4814 4c43cbdcd5243d99cc2511e294fb9dfcbc255d03 legacy-trunk
+4815 916a8ff36a85470bfa6a0c7a01563c060f9e6472 legacy-trunk
+4816 7fd7412e718848e0f3333c2b46d618249b97e06e legacy-trunk
+4817 e80acfa13ac0004497d6b31e4a5da5820d2d86c1 legacy-trunk
+4818 747f0b7cb7be434cb965ecd14f52c4f975f36134 legacy-trunk
+4819 21a23cfc48431ae91ca013e00ea11c01233503be legacy-trunk
+4820 96747c787a833c3190d3d3c20194ab32ba8eeb1b legacy-trunk
+4821 8cf63c30ffc877ec0ad94600cc1421925663a861 legacy-trunk
+4822 94bf2f05da319e6ce35e33f7aa97a37cf284b3b2 legacy-trunk
+4823 915fabec64a30ad733b129023a2f0727d63cf29f legacy-trunk
+4824 663aa059e29fec66f0338198fc326d9bb10320e8 legacy-trunk
+4825 ba1b76c090414a3ec8068b5715d946ea132e6cc3 legacy-trunk
+4826 e386035f897dfd91ac635962654cdf3cb8616546 legacy-trunk
+4827 04f61a5a765409c4d50af7420b93574ab0c72bcf legacy-trunk
+4828 0c835c8043224cf590553274717ee4f281700c3b legacy-trunk
+4829 582b00fbab1614523f8d4f432327060bef435299 legacy-trunk
+4830 397478bca0c4dac1dc03e02d4d3b469e20e7c8e9 legacy-trunk
+4831 51c8824985f8a50850ad0eeb6eade1a73bd9675d legacy-trunk
+4832 c31eaed7798bba41f314d38e693a74f9e68a35f4 legacy-trunk
+4833 dab34cbf8d7fa3f42a9979f87e9202b7e8bc5bfe legacy-trunk
+4834 4e87f3a3f33a87abfb08d8d73ae97f80257a641d legacy-trunk
+4835 1a20d505874448bc701abea161592cd5428d8b3f legacy-trunk
+4836 c8a83218ba61870a6c717801fb7ea5b64bfefec0 legacy-trunk
+4837 ff3fc30ed76069a1b3ddeef0f1f4d3b31f07e576 legacy-trunk
+4838 6450d8828d2b988d4140202716d7e9154dbdc4e4 legacy-trunk
+4839 4cc8137ccb56cfff392f69c6bd583623cae736cb legacy-trunk
+4840 f8ab925efda88ae0da0a0e3e5e71780ac9d403a3 legacy-trunk
+4841 c6533b89628887a311e9cf38b9b1d8ed8d96d0de legacy-trunk
+4842 c09dabf70996fb9a9f7866f27b13853568992227 legacy-trunk
+4843 5313ac6f34fdcb03e673c176140f8077c1dd80b5 legacy-trunk
+4844 f979e5bd6a2230e78c523bf0f9e98ea0d091ea0a legacy-trunk
+4845 49bfef17b12b65fa76bfb09cf34ada5a5a68b8cb legacy-trunk
+4846 ddb13862fbb2bea747a6817b9a8ddeca3dd1a5d0 legacy-trunk
+4847 ecbbaa584f3c167398e06b47125f23d31c363089 legacy-trunk
+4848 9dc875ad050c89940e3a593acd68287e4c7090b4 legacy-trunk
+4849 b156bf4be62f1b6a9c571352a2d619ed76ce42fa legacy-trunk
+4850 fa8cdd3cc54540551943c03209d5bf4fdeaa54dd legacy-trunk
+4851 42b5689a74095dd8090265caeb60e0236e8d7a18 legacy-trunk
+4852 29ca45eb3ab7523ba75579997743a9708e7b260b legacy-trunk
+4853 0736a7ec2f289e5dee91d0ce8a2f7f95bb39269e legacy-trunk
+4854 cabb7c5732ef1a38d9f4146ac582618240c73dd6 legacy-trunk
+4855 438a8c265eb9f54c867ceff7acd2b92bc94b13c7 legacy-trunk
+4856 d31f694c11a89b7111706297632168dfaf318066 legacy-trunk
+4857 1325b3e8e3d3ce1f65f076802a384eaeca49bd17 legacy-trunk
+4858 cab699453775c1909bbac860a1928263e082e889 legacy-trunk
+4859 72c715c004c89861d504be7ef4cb50b466c47293 legacy-trunk
+4860 7246b99d2966a2c2b256ee6c1f0345dafeaa3090 legacy-trunk
+4861 0b62b53d43f8786b6541a3a83a7432f3e795a74d legacy-trunk
+4862 e14975c910f0ca1a7d6482dba0a23069fce770da legacy-trunk
+4863 9a94292aa4c15bbdd059ce2642684d92edd26682 legacy-trunk
+4864 77eb63716b4f98d3a5460c0ba8fc51b2c6d870df legacy-trunk
+4865 4fc033cb55445ba6e1abb246a86b677c795e925f legacy-trunk
+4866 403a5631214b0245102c530bdddd85cd4b2c8936 legacy-trunk
+4867 dd1ab20f8223b3986434db5c58b61a0776afbe7e legacy-trunk
+4868 75ae104f7e6c51ea2f0456c72fea2491f4973ca8 legacy-trunk
+4869 810bc15e18f983bef235be16a3b35f6f12057a61 legacy-trunk
+4870 614251836ceb2273096265995b82b5fa33ff2603 legacy-trunk
+4871 ee8e91a17745abb7cfa1423c75f2866c7c91299e legacy-trunk
+4872 75aa5246b2f6f3d1d2fb075dd12399ae84326738 legacy-trunk
+4873 97e57050e2760cfa272f52dc0b2d086eb588dd98 legacy-trunk
+4874 22b1ab0e64735db7f88834a1ed4b994adced06ce legacy-trunk
+4875 4a462aacc1e99145b803cbf8b30a8556571f72b2 legacy-trunk
+4876 6beef17871f982d3cfb54c0bb39d7a1e37b15eae legacy-trunk
+4877 6eda642f19d03780bf029072fa7e918b8522944c legacy-trunk
+4878 f4f71ebea53f145423e10a35ffb4a4396a0183a0 legacy-trunk
+4879 73eeff4d43f84ad76d2bb2f0e0c4fb94070cbb19 legacy-trunk
+4880 00f4e400575a97340e6091216768d1dba54e5fd2 legacy-trunk
+4881 eccf4937f1dc9ad35aefee50d47f3a4ba2fdf6e9 legacy-trunk
+4882 9bf18996eed8c9df6b3f4ead00d5b42ded499a19 legacy-trunk
+4883 bd3ad6634e76482061f9fd4fce59114518f9b72b legacy-trunk
+4884 7924b7819d8f96c72a18ae8f9917a57ec65bcd14 legacy-trunk
+4885 efb0685a6c91cbe6589a9364c0c9af156e262ce2 legacy-trunk
+4886 d39aab6c130d45db8948885f3d6f29c60d1e703e legacy-trunk
+4887 cbb4072d538be7f042aef85afe006beb92abf669 legacy-trunk
+4888 445bea8ceab1d07083d3e4a68d8b3cd15f3a6c8d legacy-trunk
+4889 6cbd2830b5a238cf5828408576664621abfbdb4e legacy-trunk
+4890 5bc341c4071cd093976da8047eb28c14330cf7b5 legacy-trunk
+4891 1e8aebab874ae125e7fd45b86d0d6537a70a0e00 legacy-trunk
+4892 fa98dda07877f088fb1ed7564bfac260ebe90a73 legacy-trunk
+4893 62ebbcfea8272b84d63598d76f765cdf78b7be1d legacy-trunk
+4894 1f59f2a1331296edf012105970142619ec3362ff legacy-trunk
+4895 c1d27043c22f45b6418f647dacb5a6402578312f legacy-trunk
+4896 d577d749918d183dd632d173709e6030c2299385 legacy-trunk
+4897 2f89ec1a9c38c7d72192c74f050089c85a208a33 legacy-trunk
+4898 a5e95f9de9000e57882cbb3ab87c86cd7e7d0219 legacy-trunk
+4899 2dcf7538347a9d68f2e8c9598adca7243159abdc legacy-trunk
+4900 98c1d84101a50813b45a1f01d1005e36b6a47c57 legacy-trunk
+4901 f61716ad0b7f51f31c023f34e5ae42a83d973128 legacy-trunk
+4902 6f1211b2e0779b11062b9b2cce690f24450753fe legacy-trunk
+4903 73499a667e784eda748136861fd4b0f77a813f16 legacy-trunk
+4904 2c6565f1b7f864458dd53a29fb188bed25c0feaf legacy-trunk
+4905 8eeecd233d569bba9f8c23097ddc25697f328eec legacy-trunk
+4906 94a6436655e03fb97538143ea86fe7ec7044067b legacy-trunk
+4907 480b251a046835b1cb458931e51b4aa2d0d657bb legacy-trunk
+4908 9efd408fc9f6bb72936bda6b6ccc6410e6cdac05 legacy-trunk
+4909 cdd3a721b40e3e8e9577539d6488e8cbe365525c legacy-trunk
+4910 899d20874566b986d216d14fe360921104c4bf23 legacy-trunk
+4911 b42ab77f2226031663c31290a5aad35ababe9374 legacy-trunk
+4912 bc03225a4493f5dba6b3f6e6a4fa91b0dccd6af7 legacy-trunk
+4913 e1a7bdfafec932388527889dbf11cccf9effa61b legacy-trunk
+4914 65bcb4182c1a3207979eeba29f40f4e41e1d9c70 legacy-trunk
+4915 bac96d5c463f452ffa7a44f7ad5bdf013b0dec2c legacy-trunk
+4916 1c29f6bdd898f6e24e7bf5533c6bf34549ebb88b legacy-trunk
+4917 d94045bd4a0412b9a6900a40d7966d972c52a488 legacy-trunk
+4918 e9e86ae5f5a4a87f1a4ddb062581604137d021dd legacy-trunk
+4919 e764b78a704f518f1a8342fda1b8f2c435bfcb22 legacy-trunk
+4920 e726f90d2a9ff24959da119f225859255557d6af legacy-trunk
+4921 1f4141aafe3619769a7be4eaf253fc4dc6a26c6d legacy-trunk
+4923 322fc596f1c43791300e80cafdaa9a1455616ac9 legacy-trunk
+4924 4f7c673da918b56ad1ba55e6f4fcd843f3ea257b legacy-trunk
+4925 3d6734ab6cd402dd021e6d4a3d879ec1f37e83b8 legacy-trunk
+4926 8e38cd0a3a315fe1bd7a8e3c9c16f5020e272864 legacy-trunk
+4927 0e1f9a14fbd495a93ab5f312e21be60036392e3f legacy-trunk
+4928 5bb39a42c72912274efa911a8f2bab0bcfccc2aa legacy-trunk
+4929 dd2845d06eb37ae29408fe8bfe07805d0b2e66b5 legacy-trunk
+4930 53f92a473c6f10a6f1c0607c61d642810cd2b695 legacy-trunk
+4931 de4dc165bfb6a115299c9aa1c9b9b1e24d19f29e legacy-trunk
+4932 30205d634a15b528126aebdacacf56a36ef162eb legacy-trunk
+4933 7089d48434072ecdf479b06e93c27c057c721a47 legacy-trunk
+4934 11b937ea00264a5b1f93d517b5a5d78bd231517c legacy-trunk
+4935 64842e206b76cb15a9a003269071800ff6565684 legacy-trunk
+4936 a17da1322c56d510b42d607ac3737d115da99890 legacy-trunk
+4937 bd476555be42a7ad799fa6e252569dfe655d6744 legacy-trunk
+4938 22cd22bf4384e4d46bb057e374cd4d6c7ee10eeb legacy-trunk
+4939 0510b948178e0ba706b5a4e595c14d59354bef84 legacy-trunk
+4940 517bcd4823ab786c74b2fb13710afdf5ff850c6b legacy-trunk
+4941 2a574d4b0d58c2f0e382ada46a40344b6555a26c legacy-trunk
+4942 d630c6d36839ad88426ae67b0fac5bd3311e5fe1 legacy-trunk
+4943 fe37ed2cf7a5c573bffb8214f030d486436cb17f legacy-trunk
+4944 eb14f32a97cdc5c549e72eb1d9a34988c0209c6d legacy-trunk
+4945 80729aff9057c0ff17faa5ac70dc3ae67919e1ad legacy-trunk
+4946 cd64a32ab8032cf76bcb6fe1bcc486e980c89a89 legacy-trunk
+4947 4418e8547efcf150f701bac949880cf01e7d60a1 legacy-trunk
+4948 fb8e08ec88dd56062c1a9356021ae815abd156b6 legacy-trunk
+4949 4b574db5db13f17574b65c4690b0bc0a3b2c29cb legacy-trunk
+4950 d9481354fdc36199be1ba3be832fe836910540dd legacy-trunk
+4951 5fc62562e6ece1709df3c7946154f77e1ed72d57 legacy-trunk
+4952 718c65d0e12db48661af77b576ccd1c36922c6f3 legacy-trunk
+4953 60e5aaceb3eb36ca04d24b1303d92360a18f503e legacy-trunk
+4954 15a86687f8380711457b32b60b6c924b3b31812a legacy-trunk
+4955 ddf60bc7ed3015f737892ad944c0693746bba8c6 legacy-trunk
+4956 c221957a626d7ec5fe263ef878ac597e56f181a6 legacy-trunk
+4957 f217c1b27f8676a5d4b653a7ccbc274b99315e36 legacy-trunk
+4958 b5ce8011441615875c49438e79d0d6d0084ca2d2 legacy-trunk
+4959 d5978238e3ba6f7cc773202f213a7395bb63d400 legacy-trunk
+4960 4dd1af0ddef08db26e26284c31695c4e473f7c15 legacy-trunk
+4961 425835b88099e822b98f092aabe51ba45c9ecceb legacy-trunk
+4962 e920e6c2720821c1c26eaf860286de7f710d40f2 legacy-trunk
+4963 9d6e97d666708d437abe285c91f482659697a1e7 legacy-trunk
+4964 8ac4c0e1ce17ad29bf7ac9a291d6d667da31bcb5 legacy-trunk
+4965 47cc53a1fd47b3d4eec48e392a892766a502874a legacy-trunk
+4966 c6e482870ec30ad0c43c3983e10f3996dbcd24ac legacy-trunk
+4967 c29adb338964cb7fac094ee6096d995a30c494ce legacy-trunk
+4968 c6a6e2b20bd83dd38a8e22e71654f5e7b8506f56 legacy-trunk
+4969 c6f2d51251d075d78dea379b54be2e1a3c6fb29c legacy-trunk
+4970 56e25114d43844359ae064c933e78683b811edf1 legacy-trunk
+4971 f4dc51f78a56dc3fbb141d6dbdeb5ccb043617cd legacy-trunk
+4972 1ce9e67c6856e8fc78ba1755651eb499e5a3c0b9 legacy-trunk
+4973 d0b9812cd9cf40513ac8f739fb7fb2fb0df99c5a legacy-trunk
+4974 2f455627c1f0ed5afb28776d49b5b7b7bffdde72 legacy-trunk
+4975 556219709e9985bcfe120eaa606743323b5fd949 legacy-trunk
+4976 495afc8ad7b969f14e6c0c25b24f5bfee8178f81 legacy-trunk
+4977 847d24841c85699d15182c5339db55d3d6db1322 legacy-trunk
+4978 e7d480cf16ba6df810ae6910697600b7f66cc277 legacy-trunk
+4979 9e4012b1757eb4b6a6cbd93a32b1f77575e44515 legacy-trunk
+4980 8b8a37b7cba4399b989c0529ac0d424161a0d1de legacy-trunk
+4981 6001448fab890350bea83c62aa238651d5d1eefc legacy-trunk
+4982 16ea151aeec3a4b086b93e947d6305b11d0a57da legacy-trunk
+4983 d1123b10cf2372cc4e3e5a56fe9c0cf628c7fde4 legacy-trunk
+4984 815dfaa6a778777206334a7d7ca7b18641cb1c25 legacy-trunk
+4985 ae2b032445f99c33b1f77b2b22368d35b2b43064 legacy-trunk
+4986 16ea57c38c4f741f31696a3c93d356ab6a9e0c8d legacy-trunk
+4987 1a5e7da404c3da3b3cc5f5faa5677683140a596b legacy-trunk
+4988 e39bb240b1b3a7a8445d001ebbbd4616e1c0ef9a legacy-trunk
+4989 9e5a09841781958c2883dbfcca65ee68fcc99368 legacy-trunk
+4990 e506ec4fb2b10d400ee7f638f69f79b52c6fa3bf legacy-trunk
+4991 73d193eaa900ea438e845298fd77684b6a474524 legacy-trunk
+4992 875173f3f31cbd2346cb477913aee75e925889ef legacy-trunk
+4993 a14fc2d04c0625a865ffb43bd8c544945c9509e1 legacy-trunk
+4994 6fcd0b022fa77bbe62df7f7951477bfed2a2bf2c legacy-trunk
+4995 4df00b29477b7f7b26979b9ed3a1bf77fb812b7d legacy-trunk
+4996 534a97c400cc7d60c535cfd24e548401f31ae6c8 legacy-trunk
+4997 d7ae5fb1d255098149781c01f48fe95975064cb6 legacy-trunk
+4998 b72ccf5b7dbc47fc8d1169da3dda2ca7311f79ba legacy-trunk
+4999 49df1576fb54e92ff1cba10a52ce518d3f56d96f legacy-trunk
+5000 1a448dd84edc2e9f3d2148ca39de6ca825eb86a7 legacy-trunk
+5002 aabbfb61e38884b6a0c4c319efa627d4eabaf6dc legacy-trunk
+5004 9cc775fd6e84c5f3385bea90a247e7981bab90fa legacy-trunk
+5005 5536fcbae80ad7b017d338a8fe20a15400b225d3 legacy-trunk
+5006 3281a931a1d9dc977ba13c501af40d92ae4a5ae7 legacy-trunk
+5008 2cac6c5066da509598ab06ee29e90df69bffa739 legacy-trunk
+5009 4196000789bc5e2426e038a74e52120b56f590bd legacy-trunk
+5010 0f6ff45bd8167876b7c3e453b6e2561e76863e1a legacy-trunk
+5011 c55dddbfcf7ce8eb6afbf97cf4fd5988951f49f3 legacy-trunk
+5012 7d70209f355d20ec01dbc73a02fb29ce923f2198 legacy-trunk
+5013 f30bc48c417a21d1cc3b6e66f9739c95f380283c legacy-trunk
+5014 f4d26a0e2975151a6feed00dbaed3c2350f04525 legacy-trunk
+5015 b181dff21b0b8e99cf2c94579890d6813a51be5b legacy-trunk
+5016 f9b07915a0617da0ae4fb0e9ba59361c2cc42dac legacy-trunk
+5018 2aa6b5ad45204e071db1d4f7c1e282ababe59e3a legacy-trunk
+5019 38f3225eff31bdd35bc627088fe72ba0fcf50d0b legacy-trunk
+5021 3f8c8b90158dfd32fbc48cab4291f63b36dfde24 legacy-trunk
+5022 787b4dd6f5f3e6c20e12d1794c1069ebb44da679 legacy-trunk
+5023 b092d936c875e66f174dd1aca76101e2d699ba6d legacy-trunk
+5024 3828206c2dc0c609e64ab6c2983d79d997451eca legacy-trunk
+5025 85c0819662b7b49bddce445971c6820af28a3b48 legacy-trunk
+5026 7fbff52db08774df94d1496a4eefd0f300b62b95 legacy-trunk
+5027 912813d573b42ffa223a95766c8f371d449ada74 legacy-trunk
+5028 919c53a35efaead3e9df8e093cb5d1276c73a36d legacy-trunk
+5029 b5963c4b639ad149717136b6f377ad30e7241e2e legacy-trunk
+5030 2c61786327cff054d37d8b9887e0e8a40f671ff7 legacy-trunk
+5031 7a3733732901c119e5f5a69098ff161263c64edd legacy-trunk
+5032 8be4002b50867c187f3bd0e7fce29de5225eec0b legacy-trunk
+5033 1807864a75f47143cb30c48758ddb650deb13de4 legacy-trunk
+5034 ac13caa79e3ca6342855e103bd7e49e4af0ff3c8 legacy-trunk
+5035 0baeb746a8540329c741251e3704c012c056304e legacy-trunk
+5036 f0b7872da6891c05d67ba8fbd44cac4e90ee7cc3 legacy-trunk
+5037 9677eb105fae824db6c087ce60470e234ee3221c legacy-trunk
+5038 f47bc55544185a5c09b6337434519c1703036406 legacy-trunk
+5039 498dad8045d34c86bd65edb63b7ea56cb394715b legacy-trunk
+5040 0ac27ffd05799c3f1dd867becd5181b89a61c79a legacy-trunk
+5042 bc4b3fda6a8078dc6377faac9fd0b02e8a3b4558 legacy-trunk
+5043 91bc907b1e63cf082f434710efd28d7e78321330 legacy-trunk
+5044 4d28b655b728715e42b3a0ba81dcf85e9154d3cb legacy-trunk
+5045 3770e434780385ef9268546d8d867c6d14dea758 legacy-trunk
+5046 7914915729e3d521b713f820afae6045e66eaa74 legacy-trunk
+5047 4b6c0762d659b4d61e7c29dc5bc31338156986b9 legacy-trunk
+5048 7042aee6409efc7820fd3d18fa606bb0de479345 legacy-trunk
+5049 ae131b8b4e319dbfc13d8739b93f52ece2901dd1 legacy-trunk
+5050 d69954e1f5d418f4fdf0ed23f512b5fb598adb4e legacy-trunk
+5053 bbbf17640c6fa15cbc5963c75819025af3ef3d16 legacy-trunk
+5054 d5d27dad7feaf5d6f539abe303a0950946e94de9 legacy-trunk
+5055 5d0938350ae8e8d87cc8761fe8abd37f64b31477 legacy-trunk
+5056 2a3e489722612f9305c19e59bb758279f857c77b legacy-trunk
+5057 763eb47975dd397e936e472f7b09f53cc9e17a78 legacy-trunk
+5058 8df574a655ad6c3cd5b83e348d89a339e860f22e legacy-trunk
+5059 ce9a7507e1efeb710356ca8e55f8ecbc1c64482f legacy-trunk
+5059 065e31cf5862e27521cf5725b003aed211f091b2 legacy-trunk
+5061 31777622ae93157a20108129149aefcefe2c8edb legacy-trunk
+5062 cd5a96f6239bde452a20f7710bf7a4bacd962c1d legacy-trunk
+5063 b281c3c863ccae4edbd1c6958f9d33aa703df730 legacy-trunk
+5064 bdb63a79755554784192402affcbce437a7114ba legacy-trunk
+5065 588cd4343eed1fc273609f70411a03c84c655fb8 legacy-trunk
+5066 35233640479b2ebc8bb2d83dd7c543492f776e54 legacy-trunk
+5067 bee2aed416d624427ad0af8ca3c36f21da1cf51a legacy-trunk
+5068 4084ecf276cf0f5e46c8822f06ae4036b62c1552 legacy-trunk
+5069 c52b5c9be7e217f424221f8e259c90c9f57a1938 legacy-trunk
+5070 29b90a86ac96d8c88c33f2cde25507acbc2dc189 legacy-trunk
+5071 17c925f0060b8c719659eb60bd0e8760cf8e1bd3 legacy-trunk
+5072 1c814783efc18500a3022ff57a37ef7e5a644b84 legacy-trunk
+5073 eeac170f5f2ff8258c69d88237a5a7fc8c6e981e legacy-trunk
+5074 7ef72873e4d68747f526c78898a89eed398cbfcd legacy-trunk
+5075 b02573eeb1828c6822db28a351ceac57e6cb1cbb legacy-trunk
+5077 01687ce437082a55b7ecf006432800fef5574cec legacy-trunk
+5078 ca6b60d4ea90637c676b10300080a7ce94acd3cd legacy-trunk
+5079 b368be7b062a5302a2d06b93e467f72f0ba8c97a legacy-trunk
+5080 f7049d4653657698d98d120effb1ae5af62d0374 legacy-trunk
+5081 bc326074f8614e81b5bdf39f09f44a29c9ca8332 legacy-trunk
+5082 a92dded4a7c4dcc624a680c008deb68c97abd4f3 legacy-trunk
+5083 ed30bca184bb81e23a8faa9d9bd80bcddda046c1 legacy-trunk
+5084 6cc637c60ce662afeca22823f96a6a2fe0faad7b legacy-trunk
+5085 da47b4146a7c87ced4ca484d6f536cfc2f969928 legacy-trunk
+5086 bd05dcea7b09cd747497cec3bee60723240952df legacy-trunk
+5087 2f9102f57143f1d6fd462bd958e5c5f14c092754 legacy-trunk
+5088 61e3b60aec4419daed1e81f3f267b6bf62da9658 legacy-trunk
+5089 83018aa9b17c956c54868b3364a7c14ac4634d89 legacy-trunk
+5090 6341a4c0082b349375171d5bf099cda6eb00d206 legacy-trunk
+5091 5a337132097545eaf2ed2f5fb49479b34fd88aeb legacy-trunk
+5092 dbb41712165be4fa42f0de787112dcb021202bfa legacy-trunk
+5093 e9ea05702676e7bc81da6599c13f320b8e56c0f8 legacy-trunk
+5094 7c92d44fa6fca510ee1a994e98665e44260210e5 legacy-trunk
+5095 175671cc21d8c644ced17db7ca725481a4ecb9a4 legacy-trunk
+5096 6c89df576d91afadc7371cc93d3969fc733c71e9 legacy-trunk
+5097 912317a37e2b385617ebafddf69cf3a2a13272ea legacy-trunk
+5098 75e9e56b5f9b1a0de3e024efb46d093ef2deebde legacy-trunk
+5099 22912f3a889f12ff607860437d8a402fd1e214da legacy-trunk
+5100 f4ef3b2126ebcbdd65b6c965144fb30f2a4611c5 legacy-trunk
+5101 6f396ce5255d08f1a6e390dbf8c3ddb46a4456ab legacy-trunk
+5102 67ff9f47ab36fe9b9801f76c9f401d02e7929ab9 legacy-trunk
+5103 44087819148e2776788ce8b66b95029e3ed065e8 legacy-trunk
+5104 68c7a0a61fd581c076cf8ff8d1ed8f8e237173d9 legacy-trunk
+5105 f11ba9cc342f280caa87fc1c198aa3ceb159a0e0 legacy-trunk
+5106 f5c40869da10658ec103170c7c39624180034501 legacy-trunk
+5107 f98a2233b337b4953458b7dcdcd564a5d23e45f7 legacy-trunk
+5108 5134c009e1a4fe583dd9e0ee7a71868d87014b6c legacy-trunk
+5109 d9e4cbba958c06918fe16fa6acbfddd168c34a01 legacy-trunk
+5110 7c69c4aecb38cb455e739bf1906e2b277167f0f6 legacy-trunk
+5111 f876cd5c4417d750095d8009f7c2dc8f15e25eb0 legacy-trunk
+5112 de297cdea34ee650e21e2bed2e0acbb4cf6fcc3a legacy-trunk
+5113 9b7e6d9a528da7c88f3f888a64b0b858a04f4bdb legacy-trunk
+5114 b7e8bc002a2430cbcf456f6e761828faa3eb93e9 legacy-trunk
+5115 063a96b49b3e62a94821bf36744de71b991e6e10 legacy-trunk
+5116 606a097dfd002c4a086b151e8b22701b7406ac73 legacy-trunk
+5117 84e2260db1799b350bb28966834f9b764b17e1fa legacy-trunk
+5118 d6350a318997882c69fc76b8c8598a653f696f1d legacy-trunk
+5119 e3ecc4018989ae3811b72ad1b3cd1f50e4cc5e45 legacy-trunk
+5120 f4b3d68c712442cc74b85582e55b31355ac4cda3 legacy-trunk
+5121 db3dace278ac0188deeac00a19c466a5c7b1aa86 legacy-trunk
+5122 9cf604a3411e945b9f4e5d623fbbbb6b41e37404 legacy-trunk
+5123 841f72dc54424b3def3660b5d1e8f234236065a2 legacy-trunk
+5124 3a3df231327c1d0671440835601c8a4de10cf255 legacy-trunk
+5125 266ad13287a4e0ca598cf22815eb13dfcfc869be legacy-trunk
+5126 4eb6ddb9e961c9ab5ba26a11d3d13a9e46dda581 legacy-trunk
+5127 b4fd48e3a3b89b2ad94fe7955bf6cc91a62499b3 legacy-trunk
+5128 df3e1e521fe65de3f0d7cb306dde70c25f2e3ba5 legacy-trunk
+5128 e72257e655454d569468da8b1189e0ec336f3536 legacy-trunk
+5130 513f1cb70ce6a9ecf428a7e9a53243c29c3eaae0 legacy-trunk
+5131 2f8e8b6129f73ac7a2633fd2843add7b52101ed3 legacy-trunk
+5132 49183938d07e97b4c3ce2d6554915fbc67fb8d7c legacy-trunk
+5133 0b7e14bb54ae0eef107b9832c9e488902569f060 legacy-trunk
+5134 e2dd78197596bfd18bf3cdb89f41bdd0d4c762dd legacy-trunk
+5135 34eefa226709aa8edaac6df4bd4d3f6fcf978e58 legacy-trunk
+5136 c945735a4ad70f4202185c02bdc7058a0ee54328 legacy-trunk
+5137 d24190c65b51f0341d7925eec9edd73efffe287f legacy-trunk
+5138 0fb65520fcd012a75051e5c1dca0d930ec5b65c1 legacy-trunk
+5139 4c80cf02d1540c7895041de66800e9a7cebbd1f3 legacy-trunk
+5140 493b871f377547c6ce3ebc7775b69c9ddebf63ae legacy-trunk
+5141 318172ff2f14c6979c0966b9fe39df1ae05c016d legacy-trunk
+5142 107c1800937e3f471e3932e3f2464bcc0cdcec85 legacy-trunk
+5143 0b6c8a7e933a66eeafb65a7edcb66fe2eec06fe1 legacy-trunk
+5144 0e9cae0b5072d68820dd09f497ac21bed32bec49 legacy-trunk
+5145 9e9f22dbed1af04e097610da639c3c26902ab6fc legacy-trunk
+5146 d4644d392a8fe68c43b3c41b4c408f9b3854bd94 legacy-trunk
+5147 2d9b16527247dcb3a357b0c0e18d026db5faba34 legacy-trunk
+5148 690e46f0bf59855fcc8992669efc1065c45fe572 legacy-trunk
+5149 1a481a75af45f12928633a2007f2385afc76f208 legacy-trunk
+5150 89292f6a258dccfe7c2694ae68ca12d09f522fb3 legacy-trunk
+5151 210821fd5650947ad008c64fba90ed0a56bdec6d legacy-trunk
+5152 4b57af1ba297106cd7ec58b4018d0dc4fd8f19c9 legacy-trunk
+5153 9bdc27d151baa6b5d4bb0b9656176e9933d98bdf legacy-trunk
+5154 347cf0e492d811d50c5c280c7f6501339d6b8a5d legacy-trunk
+5155 7335c5b3b43bd244b291a5ab8bb9f541307679d4 legacy-trunk
+5156 c1f48858f1860fac30e655855cb09e62e04325a2 legacy-trunk
+5157 925d1bfcd92593d0aaa4609e621398237f7990ed legacy-trunk
+5158 e1d23a6b930b807a47ed0bf391d9a0a43b5b885f legacy-trunk
+5159 1af9220c6d19d946f17cb9b99b28e04a4f5bb90e legacy-trunk
+5160 1157e14270d68769d78959b712f5b5133bca53bb legacy-trunk
+5161 e0393657ffa4771dd3aef4d780fd52141e5b1943 legacy-trunk
+5162 06235fdc1aaf3bdc756670efefb69a14e0f20009 legacy-trunk
+5163 3ffb31cc8a9b3a0fac3ae488d344133605c247fd legacy-trunk
+5164 538ab82f91a72754164804cb3e839d549f077a40 legacy-trunk
+5165 6d93b4a0f4ce7c7e8c46780b2a953889a79c410a legacy-trunk
+5166 2f42e27382e9d2368a3f5f3d800d926e18321550 legacy-trunk
+5167 12d8c8385735fcab3fb59b6833ee404dad733772 legacy-trunk
+5168 1986b869e3a13122b07a9d550642a1e05a0b83a4 legacy-trunk
+5169 f12ff130e0b5f425459f0e70b6615c0de44924da legacy-trunk
+5170 7973f538726caacfe67674e99c7a40a1dfd67723 legacy-trunk
+5171 9ed45dbf27658a0af89bc5c2b4f604bfeee272e3 legacy-trunk
+5172 4e076944488aab84eb3b8b02a79f8b1360b3c800 legacy-trunk
+5173 1306e761a62383740a59f639f18779dbb8b6804b legacy-trunk
+5174 373c1637d30104e7cafee1d21f5620ed34204b27 legacy-trunk
+5175 500323439eb39b3f700a489371d201b1544a8311 legacy-trunk
+5176 b689e6f92f17a11100112e33c1049e8d67d5cb82 legacy-trunk
+5177 9feb0b0b50b60c40fe752524337c46bd45cb272c legacy-trunk
+5178 74747bffb6a4d27c86490a0da9628ef54882b0ae legacy-trunk
+5179 cd9d86ecc175294c6c19d893d14b0e4ecb4fc006 legacy-trunk
+5180 75afaac8556707cf03d57f99c55671b4ad446f4f legacy-trunk
+5181 2a31876f710299056f02b13c87085ae6b80913ba legacy-trunk
+5182 19b1195a3af847e1a96d64529f38e3e58532b879 legacy-trunk
+5183 6c864ad519a3684afa3bc7197db5a442e2b2134a legacy-trunk
+5184 889c6da7b4ca5119df7daf302436f6b442b24d0f legacy-trunk
+5185 6267a5f222bfded5e393e9a8bd1faddd93eb3525 legacy-trunk
+5186 abf116db523fe4db9b8faf023640950b147929ab legacy-trunk
+5187 364d4a524cec821dbce73e691c49ea2ecc7c82ae legacy-trunk
+5188 a5ceb3e93fa12735ef1a10cf285fc378e6565875 legacy-trunk
+5189 a0fc94b3bb2127042a1d0c6c5a38ad8ffdb81580 legacy-trunk
+5190 6a9ecb05c679ed8c4bc570d7bfa9de5872bfac62 legacy-trunk
+5191 8222041f5a91d54384898a52d47c083d27dae2de legacy-trunk
+5192 d03ccae170eaf2829cf83bd49e67b3354c1c5b23 legacy-trunk
+5193 e880c0164aece226b64d66732a3c814478c7f946 legacy-trunk
+5194 c267e33120308a2ae219c577cc56efca20923a57 legacy-trunk
+5195 5af6db1f6c0cdc42adcb5051f2ed08f572f6f73a legacy-trunk
+5196 10e105e4cf9c3b8f0450adb78a4780f0ef3888de legacy-trunk
+5197 9f82a6bb0010db62cb88508e9e7728a5810a4582 legacy-trunk
+5198 daa150b3a6e43e12b3e159b4e50c95f95ad4dac6 legacy-trunk
+5199 dc64df7f1ad6900f561d42f2e3091e99d85c2220 legacy-trunk
+5200 686f4bfb4da62289c07de2d0a114b75cb389fe6c legacy-trunk
+5201 90240e819becb991c268e33a8737359b42fcec0a legacy-trunk
+5202 37c48fde61b8ed8562e63508a5ad80243bd0bdaa legacy-trunk
+5203 3cf896d24e50dbb4f7402a135e05f8cfb57466bd legacy-trunk
+5204 7df6fcb426f51479b9e0574e6e5ddf8bcdec340c legacy-trunk
+5205 80b5c82272a25c1ef851314e1bf92d2859446aea legacy-trunk
+5206 3e370a4b103be2079c7e2b8bdb5550f8aea79735 legacy-trunk
+5207 982a5bd6d46d07670f208b8c3f35d080e7fe2ed1 legacy-trunk
+5208 a827801ed963384eab16fdfe0ee3a3c19c1fbe98 legacy-trunk
+5209 f1879b1a2c2ae8db7f39508cbd0095b94a809ddd legacy-trunk
+5210 4f1b0cc73507d67295995c590e6054a0184beafd legacy-trunk
+5211 3d5ec1c22055022156e8fee930635dde6308b144 legacy-trunk
+5212 853c486893b82ce95cec10be4f8fea7d4e41490a legacy-trunk
+5213 e41669a1dea024d9bde022c7f3b59b3c250e3375 legacy-trunk
+5214 39cd25678b41acd416436e190aefd0a5e47723bd legacy-trunk
+5215 9516bad979613129ed60f071b369702862613618 legacy-trunk
+5216 0af01f3e06cc9e4a3355f955531ec2df92df6db1 legacy-trunk
+5217 ae64003b2a75651c4de7aba0f0ea567b02c92549 legacy-trunk
+5218 354ebddd362b04c76ce37521898ffde0bfe68243 legacy-trunk
+5219 4b74b3b43269b71f4b660f85bbec2d336addf5fd legacy-trunk
+5220 a1087aa641cd95f0f0803f01416eb02e7c09c619 legacy-trunk
+5221 4389a60fedce661fdab770071f8a8e44f9cb268b legacy-trunk
+5222 52156352fdd6d35cdf9f324a8dc85c9d853920e8 legacy-trunk
+5223 6cfd69585636f02efec39ace35fc14bd8b8122d2 legacy-trunk
+5224 69aba6d9d3783526e34acf74d020d28e6ef86ae5 legacy-trunk
+5225 aaf902cdfdc4a2a2d7ba5b31edcca9935e04490b legacy-trunk
+5226 1b9e90353529119216133bf12fc04b73584759c6 legacy-trunk
+5227 b40cabfdc91de25bcefecf26d8a7982fa46b1627 legacy-trunk
+5228 be21c3e0cc03f48eb6aa4a20ad4c5c410162ea13 legacy-trunk
+5229 b9548960f9450c9ad09bd7bd3cab9ceb9f391b37 legacy-trunk
+5230 ac6c8b1219e671cd455f9785a554460ae2d6e41d legacy-trunk
+5231 6d8d981ef6c4151c366865d61b45d4c60419e9ee legacy-trunk
+5232 fecc939f4d5957cfb7b1e60b5d541c5c99781f28 legacy-trunk
+5233 8ece9227fde104d9fed2aa27c308eb2d29f09762 legacy-trunk
+5234 a0a4afa39d7a01cd4f365a4b8bebd15e988ce68a legacy-trunk
+5235 6a1656db7ddeecb59f9fff2ced6a6262b9543410 legacy-trunk
+5236 dc2adf79e523e102ec572fe8c47479455f6414b7 legacy-trunk
+5237 0e5dafb85fbd2bb63b72d29feb97e9a65989ace0 legacy-trunk
+5238 35432c9a874e2c0d1c6fee96ce4b5e7def12615f legacy-trunk
+5239 1a3ff0148decd8ff646793e4a655a16438756909 legacy-trunk
+5240 b735d3386651a057d7b0b8c9dd56b230249e8eba legacy-trunk
+5241 fd777af67c2310d3cca91832e49eecaf002355ef legacy-trunk
+5242 5bc0edd5b3f932b47d48f602daffb2667f8b36ef legacy-trunk
+5243 bf1ded75962d620615575df1164e7975aa9f8560 legacy-trunk
+5244 17fdec2fb309a91eb1aeecf159580238b8147dad legacy-trunk
+5245 af7d0fea3fb2a2c2ae1e204875eedcfa6dee396e legacy-trunk
+5246 4113f4fbaae537202d09a16e294db9d7fad3cb8b legacy-trunk
+5247 1203e5842255ce64ef2f3ba9fa276141e29438b7 legacy-trunk
+5248 a5d361e2b2e20c6d0bcd50593fc814b88a462c4c legacy-trunk
+5249 9ec44e37f6b133c36ac867be30445a2a2c3b1594 legacy-trunk
+5250 3b7fa56a3b9bcbfb63201739d08746cf85d04e59 legacy-trunk
+5251 50b2f82e6f0ea47adb972133186e008c6309c715 legacy-trunk
+5252 06f228d6236e4cf9adf68be8264f5486bbf07f9a legacy-trunk
+5253 7c3e4f3ee152f88c491653e9d7025f1420158a3c legacy-trunk
+5254 9aab4eb2b3f9837b8dd488c68dbe901b7d8289ed legacy-trunk
+5255 41565456bc221ccc59adb4abab80da55a09726a8 legacy-trunk
+5256 24fc0616a696c829949f0fe2967da05aa9c9ea66 legacy-trunk
+5257 baf0b9b7c2a5aa6938cd6a958b5a80233887ed23 legacy-trunk
+5258 af3aab6b07c43a954e72bb514813c542c05441a2 legacy-trunk
+5259 b8937e74fdf551c0321232fb34a30a65990d4efe legacy-trunk
+5260 823f3a8ecfe41934701bcf38b47c12cf8cc89a67 legacy-trunk
+5261 ea38c363de58b75b49e036dc027f11ece5a76eb5 legacy-trunk
+5262 ebc1714dc738bddc2444314857282509a544a94a legacy-trunk
+5263 7f2c0e7ef84262c5958646342f868f3338cab0bf legacy-trunk
+5264 59c2acb3e7025463f99dfe3aa7e35ec396b0e584 legacy-trunk
+5265 4a998b1a331f0ae9f0f30c7b1e3875a055ca487f legacy-trunk
+5267 ab3dca97ffbeb635a16ec5ed38ff45f62f88808f legacy-trunk
+5268 e911f2fb179c2c32caf9236bbe22cdc23ad5a1a0 legacy-trunk
+5269 750a2dd8a437bfc8bd3199c8d7003c2b4549cd11 legacy-trunk
+5270 a2363b6e9c86e9abc53693b6b5987079dea2d562 legacy-trunk
+5271 60c57777366f755a97148fb50c3abb0d9d8db8e9 legacy-trunk
+5272 b7a06db85cafce413d0c55dcd925af1d6cf2781b legacy-trunk
+5273 d76a714d1ceaaade00780814c3c72bb930d546a7 legacy-trunk
+5274 5ca5d77afd28bac737eb0aab9785e431eddbcb4d legacy-trunk
+5275 9318ac51691e6d86384ffd4430d2164a2610d344 legacy-trunk
+5276 6ffcbe0fe9d3cd00f2fe32983687639119c2f9b8 legacy-trunk
+5277 fc2190ec1bead287bc06e18113246b06f9d69f16 legacy-trunk
+5278 07fc4fefb68375951ee760c8a5153c2346714dec legacy-trunk
+5279 fb3daf9b2456dc1a3d99f56f78c5e6270eeaf1e8 legacy-trunk
+5280 999b5bdc18ce996b02a076aa7c0bf0a953ab1451 legacy-trunk
+5281 c6fe80ce7c2093a1aca55df0aa2cce05dd9399b2 legacy-trunk
+5282 1e82dd6dfe2ef416f4b8a28af84ff9843bcba02f legacy-trunk
+5283 c4c39d171ec3b063d6dbda268c2b1f55f957e282 legacy-trunk
+5284 8b8fb24d483794f2e93031392e93208311d9337d legacy-trunk
+5285 c9b7297a0758720b7ca4325e0e4217ab129c0799 legacy-trunk
+5286 8225c6581b3d36e25ea106d24549f98b29944b86 legacy-trunk
+5287 68d7eae6cbd6c56751049879618baba524952b3e legacy-trunk
+5288 43ccfcd98e806edad3faaa6b4f95c4a7bb327b93 legacy-trunk
+5289 407c7846b886b858bf880384a2f2b386ea6d22a4 legacy-trunk
+5290 282b0b4c1eea590b90a5ff109f36c1d61ece5375 legacy-trunk
+5291 65c7105868f889964e8e47e3812e672b321e293e legacy-trunk
+5292 bebb0ea7de200cec3bfa2dfea3c58360bf857fa8 legacy-trunk
+5293 cd9e6135244a57090a6729f1b523883645d0951e legacy-trunk
+5294 ff1faa4cc1dfbc89b7aff89390ea364baf02076a legacy-trunk
+5295 59a9689c11a8b014518cc430ac25e6a7f21b157e legacy-trunk
+5296 943e1c4804d800635ac97653e1fbc3ba9052030e legacy-trunk
+5297 bd79cd768ff880e71de8616079f320c9a6f84534 legacy-trunk
+5298 eedd6c1f3ae7e4cbd36c96f8d199a10b2c59ebf6 legacy-trunk
+5299 1fd8f316cbe90f89400c8853b9187232c00f770f legacy-trunk
+5300 1643997f1718aa64f5320e4cc77ef25239f96123 legacy-trunk
+5301 4dea3f5545cf3d9352fe419909d734405c6fed3b legacy-trunk
+5302 7c7b3704a68fa2110c0713a28535c117ebe8c9b8 legacy-trunk
+5303 d92ef94afefbecee66b8111391848eb260f17065 legacy-trunk
+5304 b988a4aca6f960a28b295cc8ba19e562d8909050 legacy-trunk
+5305 9b1a326727dfd770aaea07d04b9f4c1e6f8f38eb legacy-trunk
+5306 2c73c8ab8b82ae82d45f81e830438a580b86ec81 legacy-trunk
+5307 d5398acafa2ccc93eeb1563a5d4a0ae1e8b13281 legacy-trunk
+5308 64928f6a8e80e06ce24019b7dd7a61be8040abef legacy-trunk
+5309 420874f7d8bd1ff0489b46a2e194fea380af6221 legacy-trunk
+5310 8d92a3bb9c1ffadcb7c21a1e5a3dee249c98b77c legacy-trunk
+5311 0261bf5b3819b03d83f254562947244634604026 legacy-trunk
+5312 051bacab59afe25e306983fe40b61dc152f8fba5 legacy-trunk
+5313 eae4b2ba722eb4c84c3dee9e314d1589ada583a1 legacy-trunk
+5314 560acc25f89660332a2db066931a7f04ea0869bf legacy-trunk
+5315 4f6d5fe198122f3d62dd66ac96a796e16f4d231d legacy-trunk
+5316 97cfc46e3302c166d57bd35a9b93ccab2d419ecd legacy-trunk
+5317 e3795db4adf898fc23e85e2a5f2ca6f144fba08c legacy-trunk
+5318 beeefff1c44265336421f0dafc7d4b98fe8a73b4 legacy-trunk
+5319 1eeeba09a3064971aa6d3e1ccb54b933882dfec3 legacy-trunk
+5320 d42941d3a95f45f662b477b763c583ab9dc2e732 legacy-trunk
+5321 dd8a30e5f74434c289e6511ca6831f04582260d5 legacy-trunk
+5322 e6bec149a8d72397ef5e3b9deb51c90c4c0ef203 legacy-trunk
+5323 a7af970a94a4272bcc1f480d5444c8f1c14eb825 legacy-trunk
+5324 eebbdbee54f90207d6f39f2d4f7334dc831a2570 legacy-trunk
+5325 eb1ed4d846290d529ca187ace9c8c4abd91b3c6d legacy-trunk
+5326 ba2b30972ffea735e4795b9cd6ca262d4e75d98f legacy-trunk
+5327 6ae9b377e522a4ed020a18b56889e5312f0b130e legacy-trunk
+5328 dc6b3e76cce6642777e0581d49639cc1d00ab0e3 legacy-trunk
+5329 df8ceda84545e7503c08cfaeda5f3eac755e570a legacy-trunk
+5330 10e007aef1cff130a7fae4c061fc65ffa84739ea legacy-trunk
+5331 5f951912e99590cb4f1f09ce22ef4ef5851ddf14 legacy-trunk
+5332 d40290e4245556e95743a06d4a541a79ceeb0786 legacy-trunk
+5333 14111d66577dd5464af7e8992314646390da1b72 legacy-trunk
+5334 a169e68734ff10eb14f764e9d6d7dde77bb8df41 legacy-trunk
+5335 f657d67812afae8d0258da41607dd3fcff59c4c8 legacy-trunk
+5336 b9a62501e76dc89e99ebfb2d686021c4152711a8 legacy-trunk
+5337 520e1855a24d90b21d5cdc2c660839a9affb316e legacy-trunk
+5338 0534025cefe556fac7ec34d479039ecbbbf52c76 legacy-trunk
+5339 d3b07ba3e12df3b82761451b30c387a6c96dbd40 legacy-trunk
+5340 315760ba0041d04cbbb75e321d286d4a37ffe925 legacy-trunk
+5341 927f4839fbfa148c57578003969c73dbc873bb92 legacy-trunk
+5342 71584fe7749c35fd8eaf577ee56abcb3575c1ae7 legacy-trunk
+5343 85140b3548901f87793598d9f2094bdbdfbaed7a legacy-trunk
+5344 beeea9757879897899bf2478db1e2d4ab182026a legacy-trunk
+5345 5a5219c8c2e674fc40fbfcbc071b076ec1ba3249 legacy-trunk
+5346 3637da4c98cb310147f058eae360de98832fd309 legacy-trunk
+5347 6f1ddf113982ada18a6b38b9e7ffe7621684f3b0 legacy-trunk
+5348 a0e8246d52378d51891e60a069fcebc6aa2719df legacy-trunk
+5349 f88bccb548ef4c1554a4b841170127a068e6167b legacy-trunk
+5350 51c9cfff31f3e17ea34721b000bf6ac83157da2c legacy-trunk
+5351 e006ed88b4aa467ded7baa06019d5982d32d82f1 legacy-trunk
+5352 363af7e3ed2d23cb79b5972be77ba2fcd582fd41 legacy-trunk
+5353 21e105460a4999e8bf17ab121f6f0effb745e540 legacy-trunk
+5354 ec0b42889243a7f9e6bc75682023bc38791ec1c7 legacy-trunk
+5355 6abd14485884f61b8d118b6f31405f3d1f116882 legacy-trunk
+5356 e513f0d65368c1e581ad616afd4e90c953032bf2 legacy-trunk
+5357 04e1690fb4d1174962b37a61dc83348fa43f3ded legacy-trunk
+5358 964d76f49a5eca95e8ed235597e77e4ebad39193 legacy-trunk
+5359 33b154b6c61bb9fe9e48b305754151d682c081e4 legacy-trunk
+5360 450ad5496407701defc808515debab0310bcc249 legacy-trunk
+5361 4095782c940eac40e8ca58140b06d4999ccaab03 legacy-trunk
+5362 81b41324d26eb8e46c16493d1071a443fb0707d0 legacy-trunk
+5363 f0d9f800a4aac7ada1eb4be1f7a95bd08d4810b7 legacy-trunk
+5364 4d69fdee9f5d429a840a1c161272030a219697e2 legacy-trunk
+5365 56e628a77c8d58a300933df4bc4d4f3c37447956 legacy-trunk
+5366 65f06fc399600b05da4f1bfa196d965cccb148bf legacy-trunk
+5367 0acbd85bcdba3653881a4b009aa646ea5b0d43aa legacy-trunk
+5368 57ec24e0f35a80f0265fe97834e2e6c0ecbf037a legacy-trunk
+5369 13581b417837b845bcb9090609db9a733a9a6df8 legacy-trunk
+5370 738c74615ac4898acdcf03df7ebcf92b0b301aa6 legacy-trunk
+5371 024fdd9ccdf240bd54febeae12f454512ce07750 legacy-trunk
+5372 0afd42960a1fd360b0f9681a136d66e8869ab3c1 legacy-trunk
+5373 21435a0b9b116a4983f8f35ee3ba6a0f3b2bae76 legacy-trunk
+5374 8957bcebf12c4fb296afe2435e102eeaf90faa43 legacy-trunk
+5375 619f31658b3ba7b1aa0f301c49a3587bcd8c6429 legacy-trunk
+5376 f9b1069a3e265d90defbc803763df81eb87ea400 legacy-trunk
+5377 5a2612fb6c0e31b07e623b5d46b5a03d227d0af8 legacy-trunk
+5378 429d7e1b1f2b8c3682cb48fdbb1d7e0e00bf322c legacy-trunk
+5379 df7b15c1e8b796ff4bc271ce9d3552da31572888 legacy-trunk
+5380 51dd065a97a614ec20b0819a8603fe44031b3d3f legacy-trunk
+5381 e16e18b9626c8f2eee1aa6b78f78c0982d8ee7e7 legacy-trunk
+5382 4509dfe19b6860df1a5280d489f4a41663dad177 legacy-trunk
+5383 764b0fc867a475c7b7488172e01a833e801ee1b6 legacy-trunk
+5384 9fad029f838fd1b92f336e9ab436c6b0b9502fce legacy-trunk
+5385 cfa9b3a84872eaf9d9b2671c0144e2cfd12f67a4 legacy-trunk
+5386 811d9a98e18ab41627e38c1e93bc5e32f5121a29 legacy-trunk
+5387 177f575708bb090b18d1961451164c45c09d63c3 legacy-trunk
+5388 0c50ec8e8358e8d4a0769f22b74a4e570d857c61 legacy-trunk
+5389 4f082be5902ae15386e1678548b39e137df1e4f9 legacy-trunk
+5390 17635604bdce15a4cb2cc6159d0661fd38fb600b legacy-trunk
+5391 44145eeb6100c9c25eae168793923a64162803e6 legacy-trunk
+5392 5eb8bde300b7ede143ba2964f3aaa68fae0139b6 legacy-trunk
+5393 4a53483939c1eb99291896b97a28c3d1e8322360 legacy-trunk
+5394 0ad9d123ff55df349524bc24232c5a967529b21d legacy-trunk
+5395 792e39dfe21616a642c5414d59b2bc5f4c9c141e legacy-trunk
+5396 7d1ecec25c06edfa4987971219527d9975f8c64b legacy-trunk
+5397 7392790328bbf3fd7fb30062c37e727beee45138 legacy-trunk
+5398 dce9155b0401ed87fa44985c7a033729a2d023c4 legacy-trunk
+5399 efbdc50e7f54c53b7274ed33e35ba4ea5f951da6 legacy-trunk
+5400 7e1265312dd42753c86ee063ae4a6ba73f657606 legacy-trunk
+5401 cb5ccbba18568eb3882304e2a13e89172b6922f1 legacy-trunk
+5402 8aab83cc60a041c07667c6336d08bb8c0c3f35f3 legacy-trunk
+5403 0970ebd31536744e389f3712b48272d8ac5d0904 legacy-trunk
+5404 1d8626bc99c710291b5005524735342b759bb80f legacy-trunk
+5405 f017f5cdb4bdb28549e8924f6248473716e34648 legacy-trunk
+5406 4dfdf234cda8f5033239a6c2dec8d4bb4e74ae37 legacy-trunk
+5407 7082c1a1f9ab986fc124c8fd66ac1cc650e37f9e legacy-trunk
+5408 97f7cfabe07e7a940dca5f91cd82bd96707e026f legacy-trunk
+5409 3715206397fe9060bd48272d2eb43fdad6ef0be2 legacy-trunk
+5410 8edbeaa2bbf7a702eeb3847ec0e209e8bef2ec63 legacy-trunk
+5411 c0997b462344b4066290e1089e210c1e3d7acf4c legacy-trunk
+5412 f17b7d0a748244e974f7c1068ce0a23160647a37 legacy-trunk
+5413 10c1030b70ade8f013f513909a012c105053ddb9 legacy-trunk
+5414 a980d076052dabdc1972e1868e6c085ba330ce5b legacy-trunk
+5415 3029e81edbc775b967110245972ea7c9f1af899b legacy-trunk
+5416 bc0803084e60a95bd7ea37a01058ef7e0fb71387 legacy-trunk
+5417 a1a9b7364bc34866cfbb94679fcf72bf26443d2c legacy-trunk
+5418 11d89914c7b9b1f3f5f9cb30e52969e7acff4907 legacy-trunk
+5419 21df421f03fe0d968e5207f588e6c0847c0be642 legacy-trunk
+5420 45ad1a93986a0ebd2c99064349b32c4e5caac063 legacy-trunk
+5421 c5cb3a53933c351a3c43f1023143e5315d161136 legacy-trunk
+5422 527d1b2925250628ebcdab58da99b1bf43d83e5d legacy-trunk
+5423 4d7fd9ff798d551995dfd42ae4f6758038c3c3b5 legacy-trunk
+5424 cc9222b947ee0a1475e4faa4d636ff1c1e6cf105 legacy-trunk
+5425 4f9d4e73057c7632390d6de819852bbf950ccabf legacy-trunk
+5426 eb6eb61b606ffd3256996ecac6df12d2c779e190 legacy-trunk
+5427 f3f7c01bc966cd2781ff2662fc476606b6bd2e21 legacy-trunk
+5428 1c919d02a645975484bc782cac361defd25a1a70 legacy-trunk
+5429 f72abd62d5083f57d5faa0662ad88470d0990622 legacy-trunk
+5430 0235273425996a362d59a0baee3cab4a4ff56992 legacy-trunk
+5431 122d149fa801646075684720546092e2d7ec3e52 legacy-trunk
+5432 d0072d1df82c2b7f9de019efec094b281ed93e34 legacy-trunk
+5433 f9fbfd90315302de3f91cbe67be44c7c473f1a45 legacy-trunk
+5434 74953a41607c1a63e0a59319583c05a370c68980 legacy-trunk
+5435 521306679e349efc2fbe10bfbb2060d01a3da84f legacy-trunk
+5436 c00fae380dc78d2a9f60f53cf5e76713e1001b36 legacy-trunk
+5437 cfc66b8ca2027001ffecb4387bed2810770ccee6 legacy-trunk
+5438 d23d73b4e58a9ffb0c703a2d2f438976e2715286 legacy-trunk
+5439 99945fda719db2221b4613408c102b9f9d9eb46f legacy-trunk
+5440 9864fe059e0dc4c505a8c12026d7dae180d393fb legacy-trunk
+5441 d1c458c87f4a6b0edfac6b46fb461b6054f3747a legacy-trunk
+5442 82356bddf712cebbe6e317f5c731ef383120d072 legacy-trunk
+5443 4de779232aa4c0a49d6128b67f3fa8fbfcc00043 legacy-trunk
+5444 441866be2ec9916a20ad787919c4a3dd0af8c494 legacy-trunk
+5445 7a67dbcb6d83cf2b0abf123d8df48aa9fbb57991 legacy-trunk
+5446 7eea9b4268024b50d99d432bb4f1bb49f51bb605 legacy-trunk
+5447 b6cfa063b89bb0bb13e7af28f9cd213afff27b5d legacy-trunk
+5448 56ad247cbfcbed03c3c33f7a428902f173b0d422 legacy-trunk
+5449 8d2907856b378470139c1fd652c3d3aad29e1bd1 legacy-trunk
+5450 7b391196056415f526d4e1a13ebf7c4ae977b4f0 legacy-trunk
+5451 4c1d809539509b8e6be724cd0309b6be4a1c08ba legacy-trunk
+5452 0d7100ffb61a7e738afb10f919c5cc551448cf3d legacy-trunk
+5453 7d268342dc3a3ac9a47a034c2d6908b9db45c679 legacy-trunk
+5454 f933a530c38f17072659dc03a4da6dcdbf3c88d2 legacy-trunk
+5455 2fe9d0371ecd0671bb95a31b32ea14638f2d8479 legacy-trunk
+5456 04bada8d65de435d5386d8e5fdd0d7bf6a87ccf1 legacy-trunk
+5457 9477a4457e5643315c22fde5a8d1b7964b2e3fc3 legacy-trunk
+5458 448edc923cad40d7072ac6c9f7386eeabba18adf legacy-trunk
+5459 d297c7220613584277d74c3407d4bb2474242919 legacy-trunk
+5460 5d4749a470b4d0200b9cea87b8601ea4d5c08436 legacy-trunk
+5461 ac0152f63bddfb798b1165e7e45def1c8df37dae legacy-trunk
+5462 1a8d6c7dd560f1950e4cb6a7551ad364a4412c70 legacy-trunk
+5463 513a96a5750fba75174ce3ae02d9079507e0e93a legacy-trunk
+5464 d4ff47df5920dfd21468349ed4e3514cad203505 legacy-trunk
+5465 9bca94a36a0810af204d68c069678899f2ffa1d3 legacy-trunk
+5466 ba2fe5f836a83de2d78e5aad65e5f34d2abe0e4c legacy-trunk
+5467 55895b5a3007b4bc91f30baadf97be8f2b30cc6d legacy-trunk
+5468 d46d831bc5f30123d857c80765967bff90f68243 legacy-trunk
+5469 5911f24bcc2de0370ea909addd9d9fa857ac5591 legacy-trunk
+5470 8987cfa758bbd5b7d49800cd1877155878151748 legacy-trunk
+5471 becd581609110bebbefdda91cf7fcf4184e0fc20 legacy-trunk
+5472 ad6f039a5c4922f890fcc0401aa00f8506acd847 legacy-trunk
+5473 20ca58edc85548c80b511a008c3d7a20003a4609 legacy-trunk
+5474 02f2c518aa46b94366ecb301d8fb8afbd584028b legacy-trunk
+5475 a51022f1980fd5a15d68a0e9b30ec1860400e09e legacy-trunk
+5476 7fb6f20e2ba29444e2942a97a3bbbd58cc70d44d legacy-trunk
+5477 6aa4e9209fbd8edb705b727f1db0843bfa81c383 legacy-trunk
+5478 72a61a149e4e6c7019b31032c58de030f55465f0 legacy-trunk
+5479 6b9cb66348975d24323be4cc32c9ceaa74273cb7 legacy-trunk
+5480 210738866166122850ddd5dc3fe8e1201c7cc62b legacy-trunk
+5481 5d3d297046d2c70319c2b30c66f680e45e84c4b6 legacy-trunk
+5482 2671842c72cfc4dc4f4a1edba8cecf6d84062b94 legacy-trunk
+5483 7ae332472629c4af915c2ba85fe98a1281d7a1c0 legacy-trunk
+5484 7774400358133982e776a59d59044b210a35e2cf legacy-trunk
+5485 27390b536640c51b4540afaa945aab5d0cb43498 legacy-trunk
+5486 d295f4c98c8a6460e3daf602e81ba1b4d965b7fe legacy-trunk
+5487 c7671c36c725e685b10ba3e739725c7773a69414 legacy-trunk
+5487 e63d83f8275853aaaa3d1972cb86564505e65583 legacy-trunk
+5489 c5d852735e7f7b490ecbccbc60fb63a97a14b7c3 legacy-trunk
+5490 87847228b158d9971fa9ab3a25fe3c2267231dd8 legacy-trunk
+5491 54aa87b1ccee459dd1e129edd499b33bdd9efc4d legacy-trunk
+5492 3911d4a89ab0cad36892d36b7425ce3bdbefe58a legacy-trunk
+5493 74c8fcdc97daa61aab34b4b7c94073830b18ba5b legacy-trunk
+5494 dc4bec036783e6702fd902692de2c6a1ef4fa0a9 legacy-trunk
+5495 7cd1da4064d784169322fe48f1ccfae70e03777a legacy-trunk
+5496 14753c32e8b42a132eb173f759932d3170281c13 legacy-trunk
+5497 405b473aa4a135c50f2efe81965b8779aba84a52 legacy-trunk
+5498 9c49ace6b1e78f191065314fad8168224ce6d4e6 legacy-trunk
+5499 3b3e680758332b8097a822def175d5068c652675 legacy-trunk
+5500 47d8bcabd176f423ea2d2a7d6e498eb4fd29f278 legacy-trunk
+5501 b838d2b952012ff1cfb6f65481c8c602b41dbc69 legacy-trunk
+5502 ce5f0b83f7e9f4e0e6670f388ad50a62f90b2697 legacy-trunk
+5503 bc8eeffd4d06876d2b728fe031c8977a3e5de168 legacy-trunk
+5504 f8abc037b94f8cde491fb59e4acb7407a9e6db07 legacy-trunk
+5505 43ea2c8b3286e8878248270e10f32e5a42c44d0b legacy-trunk
+5506 016f3662ef9838bbc80bbb65ebd4c08c335c1427 legacy-trunk
+5507 da6dbdfd51db1bcce71e420c06a1198c89f7c04b legacy-trunk
+5508 6b9c575c0cba03824d3416d25cd65d62c89de8c8 legacy-trunk
+5509 6af0fbc8553ab6b056480dc70b5f6e0cdc4164f0 legacy-trunk
+5510 4581a0f0353eaf30f885d59896081f2df8a0fb60 legacy-trunk
+5511 7e7bb00a0a2e25d95aff20d3151dab42b3341d57 legacy-trunk
+5512 bda54ea23a80cc2e80c190bb5cd988be56319cfc legacy-trunk
+5513 94835b3edf3e059d17ed67d75a79e9a1e03b4c8b legacy-trunk
+5514 65ea78875bc812905f9b92d7c9d04671c083143a legacy-trunk
+5515 01bc06c2e47d3bfca8ab108e56a71f9d29fe10ba legacy-trunk
+5516 6c694ead1668753983e24ef214c20c6a899fe450 legacy-trunk
+5517 2cd4cc065c1f6366de3100c10ebcc498857c487b legacy-trunk
+5518 a946e4cc6d5b0170c0f53fecbe92f04bb23574de legacy-trunk
+5519 fd50986f35e5ccda3862d5f7f4805e0df00059c7 legacy-trunk
+5520 5b928b695fa4f7759dcd9d6e09940e3d37df77ab legacy-trunk
+5521 2cb1416010b3361631b38e7fa50ea6a5984b2d30 legacy-trunk
+5522 ed0874398433da8f94b4aa6fb340192796d1d90e legacy-trunk
+5523 7e2c04e6f7e7170ba7e12b64ba4fc6432f36079a legacy-trunk
+5524 24af8eab7b763bb49d274038faecff33e000c573 legacy-trunk
+5525 d94b500cb98630683176e3b27ee74e70f518b02f legacy-trunk
+5526 c12030fbb5b60fb5b97568d90dfbfa4614d6e454 legacy-trunk
+5527 660e6f35991cba47ed973cff9924416a95ce32dc legacy-trunk
+5528 dd54eefdc2c97f05d49eb743d467d80a3ac49371 legacy-trunk
+5529 8d5179277858be9907a0432e6b040e636c0b7fb2 legacy-trunk
+5530 b333f16fb4196e93deef4f9a8c056f08c2a05a93 legacy-trunk
+5531 df7dfac30c3e3a918ce72b2bcdf26b573237bfa0 legacy-trunk
+5532 a5768e4ee0453240cdfb1b0432252f56a45d0cc6 legacy-trunk
+5533 134c6c2d1abf9c95d90aaf5ee8c16533cebd384a legacy-trunk
+5534 6ec820db2ffaf66aac156befc3e166995d2ea1f0 legacy-trunk
+5535 31c52a0a372c0eec75cc4b7224a544d1f97812de legacy-trunk
+5536 328ac74f6ca69834e9e6597989b2ae83aeec6fa8 legacy-trunk
+5537 246d5422124f999cd18ce19b91b6e8cfbf05e3e5 legacy-trunk
+5538 fbb8eddc9309fb1e88206e928b53eaef5f027519 legacy-trunk
+5539 d14cef14fbf27e70b82af18b2b44643295a5bbd1 legacy-trunk
+5540 d6b130fa91b65d39f03ee21aa0d7158cb74ee3b7 legacy-trunk
+5541 971e5ca18bd1d84ae36e96be938510e6c4475f60 legacy-trunk
+5542 e429a7e71e0ccd22d111f6b9b7395a2a814cd2ea legacy-trunk
+5543 699cf8b94f802e87fe83f70fc61c3550ef2904c7 legacy-trunk
+5544 7226dd31755c703b00d0b008cf8b52a07e65f89f legacy-trunk
+5545 e3fbced1bc09b318e562c9364f3fd21438a9167a legacy-trunk
+5546 bfa427da580ecdf34b44bfb1e6012bb94f5eab60 legacy-trunk
+5547 db89aab415a1b7bbe6c3455574947ec8428733ef legacy-trunk
+5548 eada248676def63b807f606c820e2344523dc3b8 legacy-trunk
+5549 87fea261a263e7cf1f9eb45c8b46f15b6743d512 legacy-trunk
+5550 07cb50141d07072aa57aae4ecc5db009fef35365 legacy-trunk
+5551 91c1bb75e945cf8cc96b2709817b1b9815327604 legacy-trunk
+5552 a7c97c437191d44ccd130f7b879b2469d4c749f5 legacy-trunk
+5553 d7eea9013e736288b3dfa7c47909318f3465d42d legacy-trunk
+5554 31684c5bb1727ccb48663268bd3a31c51d6d0086 legacy-trunk
+5555 75936990a330c0a44ecc8d5f473353caa23129fb legacy-trunk
+5556 ef9ac6def71d3b6ec9389e2516f7e048078efdc1 legacy-trunk
+5557 fbfa3d3ca4e09566d34f6beba100b8d4f20bfb4b legacy-trunk
+5558 7ddfb629ac3fe90385a45ec0aaa08b4ac06cc43e legacy-trunk
+5559 1ff12619a14c7dcfdd23e13708533fa49b5e28e4 legacy-trunk
+5560 b3a8013cb4fa3675532e655185394c9b0e41a7ab legacy-trunk
+5561 5a1fbd21fc2a5a5f8461d21d11fc5b17db5cf49c legacy-trunk
+5562 c1d77d74fe35068fdbc36f4c7f8cef7be42ad3f9 legacy-trunk
+5563 84104d6b4ae7edf0054bc6416ba9b791c0e6db80 legacy-trunk
+5564 8aa6918a88c6b1541c7d0cd6f4960c44788fe294 legacy-trunk
+5565 4c83f569b434593b38553240f51764be629af6d2 legacy-trunk
+5566 d249111d4cccff6841fe880bfaf43bb43995b6d9 legacy-trunk
+5567 171eef69a2cd087f63125b28b33b6b95f59c77f3 legacy-trunk
+5568 237c3b2a61871b0757b58e82da84dd34cdcb5fa4 legacy-trunk
+5569 692715abbd0bbeef6f1c3a472c76c90a57092b98 legacy-trunk
+5570 e51e17b2d88b15d9a95986eb13af8a62d6d1798a legacy-trunk
+5571 56dba037b8d6c65645c1f89bc78e21b1cd0dd141 legacy-trunk
+5572 438f88b55154ad4c42c605167498243193f545cd legacy-trunk
+5573 c41a8e50197343c97718f636a70516a6a7fcda2b legacy-trunk
+5574 3dc9ff3abf361632decda19a61764ed1b8f5b198 legacy-trunk
+5575 a8fcc511a89a8f37a9332c77d9278e5a1b11d1c4 legacy-trunk
+5576 14123e08e887e4283ad6488a78464a05d70fa2d5 legacy-trunk
+5577 5c0a7f7836fb1dbd405bd11a07484fad1ff98511 legacy-trunk
+5578 9f76185c96937cf55cda8feb7e655f822543a53c legacy-trunk
+5579 36f4d546991533c94a4026a0355782271be06bfe legacy-trunk
+5580 af82291135bd06c0f835b57f40c45d7cf1015a67 legacy-trunk
+5581 3aab925ebfb034e05cb79c01f574555f7f6af8b7 legacy-trunk
+5582 9497cdcdb6aa51b4f1afe5bea88683e6301d0a20 legacy-trunk
+5583 db139a4112f32f538c350d9dacc65f9434040657 legacy-trunk
+5584 077399cc82e8ceb288b00557258b7a230df4f787 legacy-trunk
+5585 e477094a8ca108820f8f43902b6c370dc47f46bd legacy-trunk
+5586 1071d16c930c1d869ce18dd0ebaa4136f42b48a3 legacy-trunk
+5587 4a12a543175d0ba9a93060cab3805103584c37f5 legacy-trunk
+5588 c10f55b46a1151b1b9bf60aa51809fd6362f0d33 legacy-trunk
+5589 2caa3e283568d075a4cd2066974e6044129f3a13 legacy-trunk
+5590 93562dde224ab7d094e5c765846ae8bee570a2d7 legacy-trunk
+5591 17f311ea0c9a07c55bd20e0b30d9f19b662e17ae legacy-trunk
+5592 90566c9c189f32d1b7947c983ea586bffab2509a legacy-trunk
+5593 e90643f33c64c12a6281cfcdd9a5ea31289e7f55 legacy-trunk
+5594 8710d7149c6f1bbee15b27941eea3214e3cc017f legacy-trunk
+5595 27a0769db92193340e677aecf90bbeab6d9202f9 legacy-trunk
+5596 e835a22b0bdde94febc01ac06735e61e2089b8a8 legacy-trunk
+5597 dcf2a37e73d9d36f181a74aa7cba08acf5a3d558 legacy-trunk
+5598 71bb71e306fe2dcb66e965e0dd8e74593800753c legacy-trunk
+5599 70ee4e3cb3d838264ce14a700a9d082163da05b6 legacy-trunk
+5600 591287a22ee596dec1b1d6be0bbf8e76ef63a40e legacy-trunk
+5601 2677fbb117d62b451afcc497666f28de105404b5 legacy-trunk
+5602 999fcce496f849548982c4a545c05f6db64bedd9 legacy-trunk
+5603 1b4b8a4fb46334017108773ccb50d2784c949192 legacy-trunk
+5604 adcc916b7616d80746c1c12f0e9ac2bab351feba legacy-trunk
+5605 f1f18c55d1364245426962b90f79ea9018c2c3e4 legacy-trunk
+5606 df07f28711fdf32899fbafd73528aa96e3a5424e legacy-trunk
+5607 cd388cc9ba98dcb89fa802e3a1e99d4c0769abf6 legacy-trunk
+5608 3f8a73380c4bccd189084ae403c1b07aa966bf0a legacy-trunk
+5609 393b6d81b126b274d67dd9d61efb5099a09930b1 legacy-trunk
+5610 7c5f94f56f7935869ecdbff654eae2fed9512833 legacy-trunk
+5611 fbf58d278d645d0a527be98e656e4c4a4d8d2ee1 legacy-trunk
+5612 43f8db23ef15e20cb5659da0f02363b5f3f3ca6f legacy-trunk
+5613 a95ff867571810e6e254acf66dfbdd2fb4ab1d20 legacy-trunk
+5614 70a9327f6c4c6b2b3598b5ad5fc1267fc2df5ba3 legacy-trunk
+5615 48db5d9a27941c2e1879410c7afc590ede2937f3 legacy-trunk
+5616 bad97b4051666a2df2f61ade31ea2053601f615a legacy-trunk
+5617 490be865aa0d579eed44a6ae869a3e581e819e9d legacy-trunk
+5618 acff79dd14b7507f6dcba4307593b575672aee26 legacy-trunk
+5619 a36e30240d06f4df267a9a3524f0b326cc5fc72c legacy-trunk
+5620 9a896086d3c3704140dcc5b00701b2f90337c2a4 legacy-trunk
+5621 cd7eaa62cc31b7f663643cc33ea537a050fd8e5f legacy-trunk
+5622 d6dd50fe1ecab75472c34d1504eee2b63ecdc568 legacy-trunk
+5623 93153d5c333d07d11b514529926ac5e69da47b0c legacy-trunk
+5624 469369ad2f2fba4c8e06cb39dc3b2aa2224a36f6 legacy-trunk
+5625 5961b76d78996e35f5d4cb1ff379377f4a6f30a1 legacy-trunk
+5626 4cb12604da9d9ea8a4e6c9a059f096e5099807d1 legacy-trunk
+5627 fd4f008d7743b51ef97d506c7fa07667bef499f4 legacy-trunk
+5628 2205dc498adfbeb0ef5a9a8c4306b28c17a7167e legacy-trunk
+5629 40c68ebd5891d9b4f72be31468cb4aa3dc464fc9 legacy-trunk
+5630 3172c39cdad8087d5a7118a79bc9bbf08c8a6426 legacy-trunk
+5631 95e80b6b8f2e44cfba1ddc7267a6329b246946e1 legacy-trunk
+5632 92e145f8414e96165129c35581e32ca73b39def8 legacy-trunk
+5633 938c433c876a3d695b1d07d783d6811bf7e840da legacy-trunk
+5634 fe9f95b042fc8cf06195310dc44eba712fbab9b7 legacy-trunk
+5635 9489a372c6862a1920542e22912544027607540d legacy-trunk
+5636 fff8a750e7f63dc0a01bb393f25b04d0aa30960c legacy-trunk
+5637 b9b9e6628b3535301c5c4820fb9cad6453afaaa4 legacy-trunk
+5638 13146cb6f67c61de252cb6a223865d6d74cc6f1b legacy-trunk
+5639 6bccfc0ed69594394850d1fd0881524059158db1 legacy-trunk
+5640 6d34ade2e9d45271b0fc65fb60f3f4e12af0f378 legacy-trunk
+5641 f7789945b8dee6cd77e41e18c705527e9c9e1fe4 legacy-trunk
+5642 49b787b9bfae26cda56e643add4dd2cfaefe4b9c legacy-trunk
+5643 06e340f85961d1df205e5f45d88ccb74a7035dc7 legacy-trunk
+5644 cf6c0c5dc73f7863f077c0dc048339351a40fb18 legacy-trunk
+5645 3e1e5f68fd1cca21a15ce10cb501bcd4a166c10c legacy-trunk
+5646 2a4d130373db219886edc98376c22543da753e41 legacy-trunk
+5647 a42012c188fd3879b66bb94c4924d9f3a9ac7bf5 legacy-trunk
+5648 24b53cb3168094510dcfcc3075b4f1a5231816bf legacy-trunk
+5649 8f3f25a837b3817dba9d3a27ba1a931f7e455f26 legacy-trunk
+5650 61ca19a3000fec1288afb596fb3f2cb49db632a7 legacy-trunk
+5651 7b2f695405bafbfbfd8ace9e0375f5e40d436b60 legacy-trunk
+5652 c056f685c0813c8e453a5c97454477cc469488dd legacy-trunk
+5653 8301d55eb64be268dc57e91480c5b8cdb315add4 legacy-trunk
+5654 cc39d62b27fd115902c5640b62d11e346e679dd2 legacy-trunk
+5655 f472b7ec25c583c62b8891de26e923bd856be7dc legacy-trunk
+5656 02c8f74d08dcd84d3620f3be20150bf5ba523a9f legacy-trunk
+5657 28dfc467185fc425838f8db5975b959e7ddc0cd0 legacy-trunk
+5658 f9fd5122680f333d3c9739ea8efed3309174f7c3 legacy-trunk
+5659 2aa79837aee56eea768f15cb55974254a8039f0a legacy-trunk
+5660 8224f0bc5cda4942eacaba041092d7e80785bda9 legacy-trunk
+5661 05aeb91e3b90d0d361f385a383484f324cdee0f3 legacy-trunk
+5662 61193c632f51e1911a872eb54132dea7aec92537 legacy-trunk
+5663 195ad9fb45832c79a32c09d35789540d567b3ca2 legacy-trunk
+5664 5d16ecae8ee711181da68a1630c84dceb0c5baa0 legacy-trunk
+5665 21cd50a4a3f767a93f08d9a4b789a93ab59a5287 legacy-trunk
+5666 8841a4d5cd4beb8fca3d86a75246fcde15f5bff4 legacy-trunk
+5667 8f5ab1a6c9142eba49d08363c9f8e4ca2c70bf25 legacy-trunk
+5668 19b58ce794c902677687b7e69050f2bfc1c707d9 legacy-trunk
+5669 6491bd2bbdeff6859e25481fd13743946bd6d00d legacy-trunk
+5670 46df672c7c270da360b57f00720e4cb55d0b1f2e legacy-trunk
+5671 d5e76a95b5665c9091b55cabe0df2a55da56b755 legacy-trunk
+5672 3d122f02e649872696bf84912893ed906110ccd5 legacy-trunk
+5673 df2f252dcd29dde7ff24aecabd337b1e05318f6c legacy-trunk
+5674 0ed5cd8df51f98161914da09fe9abc053af2a2b2 legacy-trunk
+5675 a227dce484517da6150a0a94a7704703a69f9ac4 legacy-trunk
+5676 2b5c8738130cf9522f1fbf4adba8250aff09c6fe legacy-trunk
+5677 cdebee4a3e3e871a7e6f5fe6c1194ed8ddcca035 legacy-trunk
+5678 98e2cad4857f1d2bd5399da37b8d2f8ad209e974 legacy-trunk
+5679 c7cdd22a4853ad8ba009a1fdf75fc52f21779d2a legacy-trunk
+5680 21d4a07b1875b1adbc70ba6d0cdf5557a4c0d561 legacy-trunk
+5681 ffe0328369373735069b446fbc88cc3872cf8308 legacy-trunk
+5682 3b2be811a66aaa6bfdf85dc37fc62e80b6f089e9 legacy-trunk
+5683 d00a79ebb027348cddf5e2549b4edc6c73c7d317 legacy-trunk
+5684 801265b8616402444ad779fbeb5663c91dc2e17e legacy-trunk
+5684 7d743c865a9aa6bde8b603e32e0542031bba3c33 legacy-trunk
+5686 e45f3d262ae4a923ed8c40f0df99df96ce0f43f8 legacy-trunk
+5687 f1cc247fff137d94db812e9eccc6bbc8ae68694d legacy-trunk
+5688 78e1953fc9b2f33453602bb2de87b05ccc46576c legacy-trunk
+5689 0f38cec565391e530ea4f89203d8e9e0796f9f8d legacy-trunk
+5690 e7417a568586ab392d1a649733fa36f5ec104903 legacy-trunk
+5691 2fb398ab3e6ab0283d9e0d73fb3ad5f70913296b legacy-trunk
+5692 e554a61a84694fb17708810d7cd5869dea155440 legacy-trunk
+5693 8c0a5180fa36eaf24ecec543e091d97cb0d6be2c legacy-trunk
+5694 efb97142992e48978968fbabe0c1ca718fec9ad4 legacy-trunk
+5695 f4a59ffe1a5f5c1c823528ccbb8c01d6e328ec12 legacy-trunk
+5696 e337bf3cb43aea386e6259724c5fa84363f42131 legacy-trunk
+5697 118c063df453c2c2f3d67601735380605df377cc legacy-trunk
+5698 1acc04478dc310e8c4051f3237e6e6fa94631414 legacy-trunk
+5699 ea7ec4a4c8d2f530a6710f87f27a3473060ec802 legacy-trunk
+5700 fd573ac7594740355f05c41c9129b78b6694c1e1 legacy-trunk
+5701 aafe7d63498527edf7d9614b71fab8494e917906 legacy-trunk
+5702 3df9ab03badffb2ec2cf4f869ef2ab7a3d27209a legacy-trunk
+5703 463b26fa4d7b7567850c1b4506aca86a4d7133ea legacy-trunk
+5704 62bbfde41b1443ba6769fb85610e1d6140ba5200 legacy-trunk
+5705 d3510f1118b6b772a94e1fb0403a19497c8309e4 legacy-trunk
+5706 285dba4e0e516c5077c0c14eb9fcde3215540d65 legacy-trunk
+5707 f7fd85b32a7d85e496ce789ac44572e297f6bb60 legacy-trunk
+5708 e92789a960a0272b2d140c256ff2c92fde4f39e1 legacy-trunk
+5709 313637c77daa03a295cb31773e40ef680ee78bca legacy-trunk
+5710 405da556661d66aa479eae68ee2356fadb5bd1fe legacy-trunk
+5711 2842ffa521260dd75543506fb6e69bcc04ee5b71 legacy-trunk
+5712 18b60d8d9e35a264b46ea8ea73452cb715da15d5 legacy-trunk
+5713 7b1a6bba25805b39a3adb4a805784a0901f55027 legacy-trunk
+5714 20d74fa3b50b1bf072ad18bf7a2eb170b08f9da1 legacy-trunk
+5715 5e101ead1e69909524fb50d745a943977ce3ba15 legacy-trunk
+5716 1cf6e10522e0915601e06048da85b828051a2dcd legacy-trunk
+5717 ed0d148fc05c879786ac4d6b7ddc29741650d4c9 legacy-trunk
+5718 1a39d407b4d39029d310ef798240359343479b61 legacy-trunk
+5719 467e0f2d678a11f431b3e6c73ffe7918c4ca4dc4 legacy-trunk
+5720 f89cdda7405ac4c71df22ad6e731540c8a3473e8 legacy-trunk
+5721 cc5474221c8cb1a6021c2bdb13d9b17f144d53e0 legacy-trunk
+5722 33310cb6a5d768342098a1f56143898dcd50f380 legacy-trunk
+5723 a6b0704106c8cfd6518d2de917dbcad44396333e legacy-trunk
+5724 bad7f56c83b2b62a18eed116b85f8662c8f96d8e legacy-trunk
+5725 6e48fab6990f314fb761455b3ff25261c06d6885 legacy-trunk
+5726 db11a2bfea66da43b0636a20e61f86bafbea744b legacy-trunk
+5727 b1ca65971e36faa6685ed613ad213fa15aac88bf legacy-trunk
+5728 4f4083a26bf223390155717fd938104746096a5c legacy-trunk
+5729 bfb63b45ff0f677ac17a06396ddaab784c606db1 legacy-trunk
+5730 8c58ab7aa71ef101f333f5d382988f32745297f0 legacy-trunk
+5731 2c1e3e87510996fb03bf63e762e1ee0dac5ae433 legacy-trunk
+5732 2f837d824120d892cdf88b812e8893c1936731fb legacy-trunk
+5733 159774af2ede66c0c09228b35766a9ae1bb0a6f4 legacy-trunk
+5734 8e733f92edc0934f837ef4ced3ef9328510c9770 legacy-trunk
+5735 7eac02a6176edf281c5f45075c067e6273afffa7 legacy-trunk
+5736 117618dd0e7f533040f8893fad32ec5e182d7660 legacy-trunk
+5737 b16fcd126b1c24e6e99708816210dbcb61058bfa legacy-trunk
+5738 0317ac522605817c6fe17536ac2539de71185bb5 legacy-trunk
+5739 6122730b7988516f46ae53887d9d2b0c530d3c7c legacy-trunk
+5740 f94783b9bfbab7e16096a801274271b91c8a8336 legacy-trunk
+5741 975ccfa721f6beaf45397518df49295c109d7697 legacy-trunk
+5742 3a83c017df1eca955ea31b49205021c3863ee56c legacy-trunk
+5743 f1fb326c7e2fe1a08ec934506db47cbfb62ad87e legacy-trunk
+5744 36a184895eb980a6d8ec3c1ab8ea16967a2ec21b legacy-trunk
+5745 43c5e7a3fc1fb62ae367e96f5c3ac5175b91139c legacy-trunk
+5746 a8065762a38ea01c556ff4b3a92126711913c80c legacy-trunk
+5747 f8a0717024fe4bf7c37b989bc7c5618fb71883f8 legacy-trunk
+5748 871c768d0da22077232dbee1257fc8211d477a28 legacy-trunk
+5749 6a18c4cb68d844c6ea7b6fcc9cf3e68c6a0cc4e1 legacy-trunk
+5750 9fa2e218e2a84c68abf6cba3e952f0687811026e legacy-trunk
+5751 3a0f84c69050a3ab2f8d3752ea0067179d72c8de legacy-trunk
+5752 212eae5b9660b58e31cfdb3551df16d2f1b6a8d8 legacy-trunk
+5753 6d4f71430722b5edad76bd161912b6e56b4a95f0 legacy-trunk
+5754 e38c09d008068cff8ffc0a1a3174422ec9b6f166 legacy-trunk
+5755 288e337f73e7e4368c708ec573ec1e66a7ed0ac5 legacy-trunk
+5756 66f4bf94627fee0889508758d4c25c33aa9728eb legacy-trunk
+5757 3f455777ff2841ad5f3a221f6fd43cb3b79d3e26 legacy-trunk
+5758 45e444547e5a35e8ff0033a11f2355eebbbfabd2 legacy-trunk
+5759 72357978ffd22a185639563daeb07a598e907d62 legacy-trunk
+5760 bafc105bc7cd99a52ad9a52cdd18dfca62d353dc legacy-trunk
+5761 2bddfb3cfcf1aa8d811fdf41c5635827305ea9c7 legacy-trunk
+5762 3ca111e0b1a76877e4de687778bfed25267e0bfe legacy-trunk
+5763 0d6b60b748384caf213c85db8bd1305810e3f357 legacy-trunk
+5764 58ef4c495de762c946b842141c7243636c01132a legacy-trunk
+5765 9a4081440783018fef2f56f6f6c245a02fbb67bc legacy-trunk
+5766 47763ac44c486b725b4dc31dfdc44d91d062183a legacy-trunk
+5767 97cd5771c23e257d2e5739a9a4520526febc6b66 legacy-trunk
+5768 7f5b432b87c48c635f294d160ea70d90250f589c legacy-trunk
+5769 54f0678757b00f6e32c78790aa62e79c6c3200d7 legacy-trunk
+5770 d4d5c9fa78592a16b35610f60999693abc2db2e0 legacy-trunk
+5771 8a5097e9d7ee2f36c677ea0d30795e93f51f1940 legacy-trunk
+5772 83daa54c181dd0bcc018217f65685d7a532845d3 legacy-trunk
+5773 140d8239a446e8f31c4dc0ab976ffb661d587c04 legacy-trunk
+5774 13b24d1034bd3bcc70cf507fedf3d9393a4a59a5 legacy-trunk
+5775 e5246571f0fdcac7d8416ea7c803b7330b894b18 legacy-trunk
+5776 b828bccda189835cf78d0b82c412a35ddc0912aa legacy-trunk
+5777 604b1fc26d633a88e027d0aeb9258006d8397fb7 legacy-trunk
+5778 df0d009162b6751871bf058b31fb65ba1bc731f2 legacy-trunk
+5779 c0664be7f6624b6ca0f85e658e494f808650753f legacy-trunk
+5780 68fdc40add2cb3f55d1afb259b09e14034f71565 legacy-trunk
+5781 58a67322c8960cd3395a55d21949d23cc805f1c7 legacy-trunk
+5782 44f48aaca8bff459bc22f34b84836588cb573e01 legacy-trunk
+5783 e5d1f242daf9c16051df43750b87c24ab3a6d68f legacy-trunk
+5784 e4f57dd3d2465395834b4fb9ca477db2d827ea1e legacy-trunk
+5785 8b8d60fbe3bf95be32483acf4037e1f6e8c5613d legacy-trunk
+5786 32b4e8adebeb84f76cff441481c992d4c9ce4322 legacy-trunk
+5787 4e6d0b26efaf32eb777b85a80741a2f20e36d27a legacy-trunk
+5788 8ddda66dbf2c8926f9e41893ea7067e04a33b626 legacy-trunk
+5789 596347db6a68f79766b3604887660b50c5e4f631 legacy-trunk
+5790 6098aaa8ae7fbcd92628a598b9845646d38169b1 legacy-trunk
+5791 36920bbd81a83441943f9e09facf2f4fe340b570 legacy-trunk
+5792 89514426b9b8e4a2085397b9202a16244d19d441 legacy-trunk
+5793 1eab8495462fb402b91402148e7894e5ee632e36 legacy-trunk
+5794 49f7a4a1f0f6ce77c5afbe809777cecf39e2a8c3 legacy-trunk
+5795 4c655115dfce7dfe41a8bdaf28a0fa4d8d7d46d6 legacy-trunk
+5796 67d347c32fffb8c963615f79d5149193ec68814e legacy-trunk
+5797 9f1b6e2db8e012c37823a455b9cfe2d0a2d582be legacy-trunk
+5798 0da24f1c3dde6da4fdc7cd337197dd70cf6bec58 legacy-trunk
+5799 95643c0b0c0eb082b16e9cea5634bf6fbeb8908b legacy-trunk
+5800 4b5bff95804e72b779caa4eaa4f5701d3be2ddad legacy-trunk
+5801 969bd911e114fcf32ea4d39e3c57e982b3414f6e legacy-trunk
+5802 9bd1e41d6b116a55ad73d58fe963ea80c1ae9a69 legacy-trunk
+5803 2497c43f4983dbcc56f72b1753921dbac67ac335 legacy-trunk
+5804 201de8455c2bc9d1a2726d4e2feb14d15d38b3f4 legacy-trunk
+5805 2db585ea218bfdacc82270074b64ba3c9f4be0e5 legacy-trunk
+5806 16cb0473224cd517a3b6c9ff55fe37a71fcb922b legacy-trunk
+5807 91c3e9821d0a0d941d47953e45a03f7fef7f4276 legacy-trunk
+5808 36416140105a2943bd40a52eaace5764767f5801 legacy-trunk
+5809 00453613cd4c77492c4a92ac9fc8106302e7be4e legacy-trunk
+5810 012376d3aa147b02d263e05828648a6f14f2d2a3 legacy-trunk
+5811 3b484812acf6e2e197ffd80e23f6635cbf794c02 legacy-trunk
+5812 1709d5fed528e6aeb1ed52004da2343ff977019d legacy-trunk
+5813 56897760e95872574e612ab842cf5cd6d39b67e4 legacy-trunk
+5814 faa21ce1ff01dc793ad7a729525a0683a232ee55 legacy-trunk
+5815 efdde1d7424b9046ae8f883a14de8bc8e034e179 legacy-trunk
+5816 8209998d669e16a08fca49cbe7aa289f146d804a legacy-trunk
+5817 2be0bde3a0718e037480898986953492f8180cdb legacy-trunk
+5818 ae004a45050fda44727dbd738be603530c4926d8 legacy-trunk
+5819 81f45f69388e2de7be4f255ecb6d8718bd53ad0a legacy-trunk
+5820 f6a840e83d2a52b8f48fc60e8e51889b75229e86 legacy-trunk
+5821 0b021cf41ddac0bb0c2aa0b754e8ccbbc19e55da legacy-trunk
+5822 ddb4510eeb468351fb8d0f686ddaf1933ff68562 legacy-trunk
+5823 6d762a2f9b69d680335463d6814061b12af2d20d legacy-trunk
+5824 1a17ba50bd681917726543da88383af71e8053fe legacy-trunk
+5825 21d89698329c6b2b2fe7ed8694506351f15b5f1a legacy-trunk
+5826 08985431500b716ed3009929b8b987a7a480c135 legacy-trunk
+5827 e0ef009b270223f2272560de10833f1a80124abd legacy-trunk
+5828 e28124bb7fab318b1fff8df583e4047250850891 legacy-trunk
+5829 6ca9787cd3aaa0f56a3e5aefd9aa75f657e610a5 legacy-trunk
+5830 369b30f78d63fce5a70f022655f0cfde539a5b9a legacy-trunk
+5831 bc17e8313ea06bb4b14e4b76567a3cf22b578435 legacy-trunk
+5832 f8ff2832997162d5fc2e966b65ab118e8aa56c32 legacy-trunk
+5833 c2586588464958d484e6f403a203763624ab842c legacy-trunk
+5834 4e1ad24410a7116fcf4b794161e93b8094ed83e4 legacy-trunk
+5835 af1c2f36dc34869e50ca19d4dcf465273a8c19eb legacy-trunk
+5836 3cf2d8a2d74b13d775d5c0d6173b1e7b25d0997c legacy-trunk
+5837 05084ee54e548e2cb84477c7f2f14dbfdf1b9b94 legacy-trunk
+5838 6b0af78a90e5f1118723a98cf77a35d36fd520b2 legacy-trunk
+5839 35908e375d1a6f99fa221985cb16d389f5f90987 legacy-trunk
+5840 fe198dee06408627e73c66f72b1399295fe7d409 legacy-trunk
+5841 0c8821bf6db566abd73149d80ae92c234e5cb050 legacy-trunk
+5842 28f41ec7c5cc423559f5af5b478a52da255303dc legacy-trunk
+5843 e0862f05e185077eaf0314454a27143f2dfb0a02 legacy-trunk
+5844 82733869909444d49ea67d09f25e83a6f86c3aba legacy-trunk
+5845 6a3ffc1dbb95d897170231ac3ae4565d15d800ea legacy-trunk
+5846 046888da1f44a6f5113cdf2a5e985b4b89f88468 legacy-trunk
+5847 2ee1f923cb193216cc2ed10264be39dc93d2b1f9 legacy-trunk
+5848 b7b2c13b5e332860cfba1bc6ddfebbb139ea5fe4 legacy-trunk
+5849 a44235e994f37f497c7b6b22d153993db1392185 legacy-trunk
+5850 92f11aefb5ca35f441dcb38a9550e0c9d162a85e legacy-trunk
+5851 c71a7a4f5f8ea5825a078acb3df5f070bdafd8d6 legacy-trunk
+5852 d5532a71b454b6c3249e81ea20023f1095712758 legacy-trunk
+5853 6f5feb3b4829f98c07d4a5722795e3996d0304e9 legacy-trunk
+5854 9fa2228bb09620ebd3dd8206d8b4baf8af18af7a legacy-trunk
+5855 1696fbf302b63fd1d61b724c95503bb0d54545ff legacy-trunk
+5856 d15d29bbc1ce11fcdc8f556ba035ba53af097ac1 legacy-trunk
+5857 832f26d0e069f6d59eccf305c9ebaf1283fe6953 legacy-trunk
+5858 1c00d2846e849f69625cc6b72279ac053ae394b4 legacy-trunk
+5859 ada222585366e6f5934a99c23a76d4dcbb14cb81 legacy-trunk
+5860 d9a79977b38d439ea3f139495b5d27a8bf8b38a9 legacy-trunk
+5861 4fea6cd94dfa4d59223deb5f8dfe01254891ea4b legacy-trunk
+5862 f598623050a398ca3b2282cda0b2923a223e178b legacy-trunk
+5863 5464fb2d129e5081921998b1893f51c317ca188e legacy-trunk
+5864 5d7a15df7155525696effc303baa94d755567dc8 legacy-trunk
+5865 409a89c5f66d52b22b4e7f71a909f9df82dc0f9c legacy-trunk
+5866 02435fd95277c62d2bf4d729a3b5576d9df61e4c legacy-trunk
+5868 116db7347d01c4c6e5ee21e4c29a53dc9fcbc4fb legacy-trunk
+5869 1df8f5a8b216d111557edf80bde86ea18bd88847 legacy-trunk
+5870 52dce4cdc930e01a8e2897eac968fbc459c7272f legacy-trunk
+5871 ba83dd458533118551a9f3f2c448454c36d47651 legacy-trunk
+5872 e994e67bcb95001dfd9e4859b78a268f12401e02 legacy-trunk
+5873 c283447b985f52ea47eb0041e94739990e412f52 legacy-trunk
+5874 810e690aa602b0324671d5b1ec2f92e9585741bb legacy-trunk
+5875 f2614ac735d0c26c61a8d788ff3f78d906ccbcf1 legacy-trunk
+5876 397e6d53a7ade58bb8c90fab3b6cfaf2abd38bc1 legacy-trunk
+5877 27406c36e8bd449e788db751301145478ca7e82b legacy-trunk
+5878 022474ac2451e49006ffe055bd3e45bdc4b30b2e legacy-trunk
+5879 14991c4331df084db144bfedc59422c51a9a3b37 legacy-trunk
+5880 f6bdda370cb74b0fd23e675d762a6c7dd379f03b legacy-trunk
+5881 2fe7d489654e8ad5c5731c00c5c0fda194ee6096 legacy-trunk
+5882 098cbd6d196e4f7fdc9fa881bfb567a413795c72 legacy-trunk
+5883 f6a6a69927ffef2153f20ef62defcaab5e48a79d legacy-trunk
+5884 b6c0a41e4a46580c2d033f69432eac91521f0611 legacy-trunk
+5885 e1df90205a333936d96691eb744446b043bb8861 legacy-trunk
+5886 0ac5fbaf8aef8baacf4916e363e2453841b9d425 legacy-trunk
+5887 e045f9132b07bcbdae9036c9afe4a90c49594d70 legacy-trunk
+5888 013bbe4ef9437ac58090e011331d5f1db19c5858 legacy-trunk
+5889 90b54312661a35034e764d183654fbf512dcd5d2 legacy-trunk
+5890 67f5d29d405b2a90f7017f2fa5dd4c628de4da8a legacy-trunk
+5891 02c9da20b41e69366ee2cbb646a6605ccf4b8d53 legacy-trunk
+5892 24bee3783b35f3f4c90fe06334b61d241e33024c legacy-trunk
+5893 23254daa247b875322c82c106dd2c39b80adebf4 legacy-trunk
+5895 6402be2689c579d2dcbbeac24acde479d5cb35b5 legacy-trunk
+5896 af5ff5231d4a1d4abf70b4fa510f6e605eaa6ac4 legacy-trunk
+5897 ba983140718aa47ce80a84b416b111fa2c25db37 legacy-trunk
+5898 da86b3b54363ccd43d90ea8fdb940f4865c492b0 legacy-trunk
+5899 5784668d0576bf12ca937303bce22995d662b849 legacy-trunk
+5900 26bec9e22e5d0f56541fd69192c23732d0708df1 legacy-trunk
+5901 6abc75ec6d298250c6071d1eac6f743bed2814b7 legacy-trunk
+5902 578ca302a598c366f80043efbcc2fc245fbd1f3d legacy-trunk
+5903 529f4d9cbe3d8e7213edd3add48af47cf1e24c2f legacy-trunk
+5904 f72050dd61a9c3f7cdd9b51e0ff4a4df36bb906d legacy-trunk
+5905 db9f6ede58a766c09bfd1875584b1dcbdc2975e1 legacy-trunk
+5906 d70149202c93dc632e4194edc78caa664f6e7133 legacy-trunk
+5907 d0d1a21d48b0ad3cf7cfb8159050c6ec00bfb714 legacy-trunk
+5908 1af1adca8242748a7cab58134d39804c7efbd4b3 legacy-trunk
+5909 3bde4b59a5d2e0cbbf362ef77d87e498eef59080 legacy-trunk
+5910 55808f6009cdd02375e3b139f0bdc4d658b00511 legacy-trunk
+5911 066a8ae4d4063ab9998a7f271b6200c520ff0d8f legacy-trunk
+5912 1ff12804ff2a745ea9bf1d9ace51f36ce3d92383 legacy-trunk
+5913 e76ca34d48f3eef31552906b1282c711eae73211 legacy-trunk
+5914 07977bf0d9970b7c1b9d26bb2e1ea0ee84897759 legacy-trunk
+5915 623ba9bdeb22151c90d456bd13f9bb62434c391b legacy-trunk
+5916 db76fd390f749a1fd05582db098bb34372afa168 legacy-trunk
+5917 f91f6198b2768f6a50da6e7a20c347866cf67d6b legacy-trunk
+5918 c3e51eb1c14fdfbcf93b1baa10fc0480ebd2be86 legacy-trunk
+5919 713bd83773820fbea3d7ab613f0db637cbd87f31 legacy-trunk
+5920 5abbc9b5fdf0b27aa2f21b47e2168d1dace1f91e legacy-trunk
+5921 ec84949f81eedf93a1247331a3f8fe73f772eb10 legacy-trunk
+5922 a7c2737687c212e55fae61d67bce80c63e8f9c6b legacy-trunk
+5923 e646afc50ac73a9a3cfc8744d356a276a5714199 legacy-trunk
+5924 1444a3524ede09b0407a09abbb2c0b50a6992a9a legacy-trunk
+5925 dcc59493499ae70bd2da0c60dd157402f79de102 legacy-trunk
+5926 a71d2fd90fa87b84f9b14ca53c3061a01d318251 legacy-trunk
+5927 408dfc7189518f1d4fa96003870d8d7584d487c6 legacy-trunk
+5928 70522db11019a8cb7c21b8161cae4a7e6de60e1d legacy-trunk
+5929 97b0e9625eb1d5f80ebb6f704fb56518a266cbcd legacy-trunk
+5930 803fbcdcfc9f87f747cd40ff138931dd47eff3dd legacy-trunk
+5931 8b3f2a8620f54fb8b454ca5e8da5af47b9bf7118 legacy-trunk
+5932 d1968a7cc620c16101cf6cad163fe1eb01053838 legacy-trunk
+5933 8dd0188e52a7c8c59b8cfe0325c1b21f88e82516 legacy-trunk
+5934 f0baadbfcabdb52dcb6f20cabb1097784d0dfba4 legacy-trunk
+5935 1425fc6491ebbfcd9b2fbc47259dc7407f703522 legacy-trunk
+5936 450f4d46d9dbf0136e98c73e28ebae2478ae3ea9 legacy-trunk
+5937 620ab3db07934c4181be2e7db9b55974dd5bbebb legacy-trunk
+5938 e9043223935ad34cccf914d4a0b0c91fe3f595f0 legacy-trunk
+5939 b38fdb008f1dc31a958dbc0417009897a69666bf legacy-trunk
+5940 aa8adfdd3aa1e1e9ae5b2ce2c2528bdd7126e0d4 legacy-trunk
+5941 50aa16f809d760032c041fd5d46417be63683a3c legacy-trunk
+5942 a292b7583c015a282a1ef9662c7af7d0c843aa51 legacy-trunk
+5943 11299e95cae840d7013b0360ac192fcc967efa12 legacy-trunk
+5944 073550e312730747f56342141532b90c790fc8ea legacy-trunk
+5945 35c4a48d9da1694c50e6f883a50937e6c1612363 legacy-trunk
+5946 a4f01d43dad699015d1606a4ba5b738ed30308da legacy-trunk
+5947 89caffd2c06148835c28d4646e9c633cb687373a legacy-trunk
+5948 aec8bbcf8b0e5f02af827dc493dedb40c3ef61f4 legacy-trunk
+5949 827f11ad65df63dd87d9da9fba244b513d97c16e legacy-trunk
+5950 e290faeb92c85f783b4323d07caacd8fd9691fd5 legacy-trunk
+5951 00ca900c7742c5e073427640bb335fdee066ed5d legacy-trunk
+5952 fed93d2d88fc46f9cb7e605e5432fa8cc2b889f4 legacy-trunk
+5953 ce27e0328462ed96f390c286f22245b1973c129c legacy-trunk
+5954 61f19a7b1ff106c67e9532962105e85f49dc3ea6 legacy-trunk
+5955 02a23e6e414affe9479a8defc58178f2d946653d legacy-trunk
+5956 83557153f5447401333ec5d1bcbf02b37aaa41ad legacy-trunk
+5957 2c178bf70f7ef39c1744af4ba84318c6e98da6d8 legacy-trunk
+5958 3b6ebf8d2a59e6690c926add464ca99bab896f72 legacy-trunk
+5959 1dfc519ea3cbe45fd7f004c3cd1b63858a1d4f6b legacy-trunk
+5960 16a5f6048461f839cce3698498f92d86b0251e72 legacy-trunk
+5961 08130f00c18db503f4e395ca2e55d1c779119a99 legacy-trunk
+5962 03c6c18325eaca962c3185756421c67ee9372f48 legacy-trunk
+5963 142cbabdd94556a33b54fe0ea24748a07a2e3b34 legacy-trunk
+5964 f70dbe608f031f7bad8a1eec201f158f82a4e1ec legacy-trunk
+5965 8d43b830341bb56aef1afb3f06bb5ff5a133fa96 legacy-trunk
+5966 d6246aeb4a3f2742e2cb5c25647073cfc02d8f1c legacy-trunk
+5967 cdea3f27cf7c70b82094e6652c6c1b52ecef9209 legacy-trunk
+5968 5f25040fd63e6f40d1e67c6b6d747152a204b7de legacy-trunk
+5969 eae70d7f2ec7c8e0a5e11ec577cdbfb92a439720 legacy-trunk
+5970 eb5b8d3d8acf427b3bc3efe166518aff25d17db3 legacy-trunk
+5971 61894ba571f5a83f53ac25b1099c93953e589195 legacy-trunk
+5972 899aefea801c99ae34b7756b005df6e8e88f6dd2 legacy-trunk
+5973 e8d501c88a3e3e9bdcd6fef84f1d04d69810cfb3 legacy-trunk
+5974 f6bd57dbd524deeb7599b78b36ab8b2e1666ae3d legacy-trunk
+5975 d24f8d79eca074c02035cf182ecba2d2a109abf3 legacy-trunk
+5976 431e8d010547a23ac8f7846c2bbfec6eb767df32 legacy-trunk
+5977 6f363a417661172fb248bbde004e7f7ff725111a legacy-trunk
+5978 558dce6553d905bb06501622996401b396198bd7 legacy-trunk
+5979 a1c0c2a38883fabf79f469a783c9707bcc5e4088 legacy-trunk
+5980 c5d30a5643beaeedf586e7e95ac3b015a2bc929d legacy-trunk
+5981 2a099fb76823b32ec3d9f6679dd18537be5aff5c legacy-trunk
+5982 4361a5ffb6382602de3a1ca06bb4ac6fbe6defcd legacy-trunk
+5983 05af29e8df0e756f6e9abd654e79b9bbec02519d legacy-trunk
+5984 566f46b9d7126c993996d559dbea44f6dc67c906 legacy-trunk
+5985 7879f3b39606ecfbc3c57f35442f348efb602f2e legacy-trunk
+5986 542c80e621114ff2c9f9f2ac799d9e9a0b345a3e legacy-trunk
+5987 7f230d4f3655d66e35348d92aea690b96138de4d legacy-trunk
+5988 05e85055582cb4a32ee3e18499d2688f3e7b6849 legacy-trunk
+5989 2b2fc9a0b4ec169686065a27a283be02f94dfd1c legacy-trunk
+5990 d7801a77fcd57bf049de7b453321593230c71d0b legacy-trunk
+5991 0145b8ae2d5fb9fd08f2a23619d0b522ac22ab7d legacy-trunk
+5992 93994519200038ee7223e67275cf1cce707ed7d5 legacy-trunk
+5993 43af523a00cafd7068661bdb7025b8bb72de3bf8 legacy-trunk
+5994 73bc41be7074de33ae41f5a136946b1e16980509 legacy-trunk
+5995 8552e17ada68a18e88c74398ef804e2730748e03 legacy-trunk
+5996 510dbfa8c59987cffcb4d0e4826c6ef39e270f12 legacy-trunk
+5997 eb83e4b0c7337804d10041f7c62fb12d6a49578d legacy-trunk
+5998 50e5b4c5895fc52f57ae343035a5d3902a3b1b54 legacy-trunk
+5999 24fb9f4f8984b47d1fd4455821240b2acadd8ef6 legacy-trunk
+6000 38e1480e7f89dbd68e677630509306e2ac635998 legacy-trunk
+6001 728d5745ae7b862cd922a832561a32b9ea3893c4 legacy-trunk
+6002 e67adc8b2f1667225b1de7e1721d0d8f86c0ef67 legacy-trunk
+6003 20a13fcdae54f9300af94638c4a5d2cd67909c47 legacy-trunk
+6004 ac8d24f1df08298a907cbd232cdf56aa02d3ef29 legacy-trunk
+6005 82307071c665e7c4e1cf723b19c7cd9d1c527815 legacy-trunk
+6006 35bec88d97342af2717ceb5119d29d1e2ed53d0d legacy-trunk
+6007 6c541c63c43a112f49acf1b4427908304acec7e6 legacy-trunk
+6008 5aec491117726a7fbc4d2292cf043e0d001babd4 legacy-trunk
+6009 2b166b220c113da798c689cca10ae5215b4691f2 legacy-trunk
+6010 6c258043cfaa5a8354f08dc501aab0333ea43075 legacy-trunk
+6011 5df2acba0fc501962aa27c9e7ff82f929a06ee39 legacy-trunk
+6012 22d7f54c57927e33bf862c527cfa9ff4fa27636b legacy-trunk
+6013 2c900dae879935bcbf087ae3f6675f1dbda447a6 legacy-trunk
+6014 6f523bd0a3abff29a99da4a34266310d3c672f40 legacy-trunk
+6015 3f7cdf1663f7aff34176366ae07d0c61c38654f6 legacy-trunk
+6016 9ca8ae71bbb08d03cb51ed4bba4058eb1406f781 legacy-trunk
+6017 04edfcbb712130a73b5958d2f66ad40989eea19a legacy-trunk
+6018 f66306bc0663e4d27c1574ae8bfdccd7ce812df4 legacy-trunk
+6019 a95b350a44dae7ac76c1d4ef0d6be628464a217d legacy-trunk
+6020 e8a2a5e4c7b0460b857cdf098f136a3c20a89d6e legacy-trunk
+6021 c7e808596d141c0225a73d34372aff3f2f9e0302 legacy-trunk
+6022 1d035e2112096918ad1c0102bd1bac762658c3f0 legacy-trunk
+6023 24279bafa828429272ba8296010a3c8f7d19cb4d legacy-trunk
+6024 29c18fb13d8f412d1c9e0e186615436ce999f694 legacy-trunk
+6025 53c66d19d127a330fa2116bd68a3f1e35bca1bfb legacy-trunk
+6026 cee4a6d8415ec1baf2a2f9cb8b812c508a081545 legacy-trunk
+6027 098b88d260d12fb066677d015798d5ff927848dd legacy-trunk
+6028 18a9c6280543b5229b771f667594aa35112c1767 legacy-trunk
+6029 b8b1b6b9743387c47e48b332d01aacb5742df313 legacy-trunk
+6030 91893871ba0742346632537f497ce6c67148542c legacy-trunk
+6031 5227841cfa1fb704e9c1df80dd95351aaaf85e1b legacy-trunk
+6032 35b3536fb763b9cf59aee877f2f164cb113c843c legacy-trunk
+6033 91c1082069d81322d4b8fd1482f05e9255f35793 legacy-trunk
+6034 4c0a5ca30f94a674df97acda5c591ca8301f6bcb legacy-trunk
+6035 aa1112d566683afda74cc84192c9a8fe62f2f94a legacy-trunk
+6036 6f715bff17e48229987962817cf3f1e4ebd7ebaa legacy-trunk
+6037 6de44d966292659ae94ca01bbab3f93d8acbf129 legacy-trunk
+6038 922c00165f7612fad771064f14b057e69ebb4451 legacy-trunk
+6039 977ff1ace0701e993125782d93ee517eece7c627 legacy-trunk
+6040 f6b218cec6bef649cfecc6d67477cb28e7871f98 legacy-trunk
+6041 6be365a673b14c03f4d58ea1e80e86ca1efec0a2 legacy-trunk
+6042 4c7bab4cdca6e8cc2e097dda3facc3b0b382d5a4 legacy-trunk
+6043 1ec15424174757f0b57e9801c6ca7f6b17b01eca legacy-trunk
+6044 e2b3a696d69c757c5e37b071677b99fbdf3f4a6d legacy-trunk
+6045 4ec1cac342ddc7fe245a223ecce7a32ab132aa5d legacy-trunk
+6046 6ec7df20697d0865e8e440e9ceabf1fd77550e4f legacy-trunk
+6047 264d196bc4c6de8ff89962ea673b2a8d48a454d2 legacy-trunk
+6048 fd1669f8d8743ba6616284e5be826594f06917da legacy-trunk
+6049 8e663945e17445c592497dcb5c775c21c59c858f legacy-trunk
+6050 ec8f5b75df64dacaf3016ae94de8541192cd1100 legacy-trunk
+6051 6f45beed3873f71cdc0b3e89660cc13e2a6b4398 legacy-trunk
+6052 6ab4cbcedec203b8278a02240f48f5624a2d5053 legacy-trunk
+6053 72ad2f1e9919afec1cc7beab8d89841aaf55ab16 legacy-trunk
+6054 4ed09a3c32018e219da9b7621153bd5f8cf8fd12 legacy-trunk
+6055 36cc3ee54f28b8800ef3fc10f205535c05e4b88c legacy-trunk
+6056 b5cccf1c8f3866beadc39464bb27d6d131568e43 legacy-trunk
+6057 dafc8a10b18680460df7e19d0f234a163424ace4 legacy-trunk
+6058 bd20c04274ffa6e69e1c94a2c8238b7257d618d9 legacy-trunk
+6059 73664ea2030e0bfffbdf0a0661a6ecf3c03b98d3 legacy-trunk
+6060 1c18f90636fbbe0816126a1e68e014eb2738a1d2 legacy-trunk
+6061 2403620ca931aefcee07892dd272640da9d3f4d6 legacy-trunk
+6062 de987fd67c943502d5bcaebf2183c7b6dc9fa089 legacy-trunk
+6063 564912267290f449e1f24eec97b1b40f28ab3bc4 legacy-trunk
+6064 6293723205a6a8294ee90ae14299851b64933507 legacy-trunk
+6065 8800df366b131d2a2652e00b18e562b4da77fe0f legacy-trunk
+6066 e07597389d64bbfb58b68c34561871d25376fd82 legacy-trunk
+6067 6c9260ae0d1636a95d010c36c0b76b1d8702aaef legacy-trunk
+6068 8738b0dd77fd87009cbe8ca1ef1d1207a05b5b47 legacy-trunk
+6069 7c5711a6a47597d931be4ee83254a32c165677db legacy-trunk
+6070 5a7a76166e7e3998194e101221c398e53b42d3ff legacy-trunk
+6071 40496db8cf1fcc98d628e798b026e0d22f687776 legacy-trunk
+6072 d9067c5f50add49e39a42e4b83fb171dae39febd legacy-trunk
+6073 eb6ef7eca207d2989b98b0a7007b1f9c55d70e0a legacy-trunk
+6074 aa5f3ecbf56f32d8fccb4c72d6a5299f4d89cf96 legacy-trunk
+6075 1d4f2f20a27ccb61096a251ddf0d8915cde969be legacy-trunk
+6076 dd74a06006e040217263b80577e84682dd31d4d3 legacy-trunk
+6077 8573e65fa9484f26bb3dafb7f4f44f65a7ac49f2 legacy-trunk
+6078 0b0c4ed1936ac2d2852c39587b9ce6837860458b legacy-trunk
+6079 d0a97ac25dab473658a40d867dc73d8ad61443bf legacy-trunk
+6080 453a9f6e96189de69b633ff735bb848a209c5e10 legacy-trunk
+6081 4866a0fc2bbd4e655366fe5898abd56f80f18cf9 legacy-trunk
+6082 2f314ca0cd338d6ec4618e648c918ee0dc1d080a legacy-trunk
+6083 323165cb1fa5d74aeff8aa7fc3354e478d34f0e7 legacy-trunk
+6084 fda3c098c89958f5293663f95930a257b0c681bc legacy-trunk
+6085 0e5a7b22016cdee03ab22413ee60f3a155066069 legacy-trunk
+6086 6e73584cf575eeda7567f96a24e08e6c1a24b09d legacy-trunk
+6087 a3c97e2058479342a8d9557cdebf6fdb9459d884 legacy-trunk
+6088 ef759669aa0426290324ebb83d65d164db66da10 legacy-trunk
+6089 28c0df1ce284498234482388f7152d153d68f306 legacy-trunk
+6090 f158edccc72ccb63ffe8b1a5959602f9dd3de808 legacy-trunk
+6091 b75edc0e6333ee60c562d1ba80d26c2e666f73cd legacy-trunk
+6092 d41d89eb43e50cd9bf8b9f95fc79f00a22e92f9d legacy-trunk
+6093 5a98a4fd58b842101212eb83851fb2269e0d600a legacy-trunk
+6094 9e46657bb9e8479c8ac986c9dcb97d0c5ae4235a legacy-trunk
+6095 bd6eaa2b41ac36070e4aebe25e595566379c12fb legacy-trunk
+6096 d195b871e7044e19d59bf19a65026f74a729f228 legacy-trunk
+6097 3440777f0e656ace3ed3804bc368413bd04345d1 legacy-trunk
+6098 e54d3910724956f2a06890ce5ad2ee5c08aded9e legacy-trunk
+6099 2eb7e9e236bf57cf09d3d9902e282c4c0e9565de legacy-trunk
+6100 98513437567236d82d4a87ac9a8fbeea54c9ae24 legacy-trunk
+6101 44161fb04b7e834bfc7709bddd69791d013026e6 legacy-trunk
+6102 a7e3bc2a7cac479d40893349cd4c2f0ba03fae2a legacy-trunk
+6103 3abcf725c5f4097762673b02d927ad1fa43fa834 legacy-trunk
+6104 89417895d963cedc2501da22d22e5055f718c04e legacy-trunk
+6105 6768bbd18e09980a707b985b5e62dd0b2b89045a legacy-trunk
+6106 6c0086f9270cf9513cc42b9b858579ddd494e7c3 legacy-trunk
+6107 c283b7bbda0952b272d7b7a859a0d95ee5a6799f legacy-trunk
+6108 70183592370e74ea63fed6314d50743a435ca2ea legacy-trunk
+6109 8d50a96f8680ea811e50200ba540a6669714f198 legacy-trunk
+6110 e4faadb4abe2edb4e181dc39756aec7b9675892b legacy-trunk
+6111 d04975db52dcf3b47028ed822a378ffcd7be1b3b legacy-trunk
+6112 0d1463a45b6f55c6857700e662deed38bb8e5d84 legacy-trunk
+6113 017d3356a5ed0430fd13595a1b07b6e94d07146a legacy-trunk
+6114 49ee89e017abe526c60f3b2ec9b79375e46720b7 legacy-trunk
+6115 564fa6f185a7d7cd6fe67c362e1b53d1e7402533 legacy-trunk
+6116 16ca8f0f3f112401a0fc65f366f27028bf38b4b5 legacy-trunk
+6117 a9fb5a895fa1c32e6fbaaabc5f6d40bf0682653d legacy-trunk
+6118 63cdfbb4a2bb99c4136b294384ad8d7b8bef029b legacy-trunk
+6119 5d6fe145f773a214aac238f1efbe17421d3f389b legacy-trunk
+6120 0602db1d1dff7a5f7e5c7aedef51568ae7023ec2 legacy-trunk
+6121 728a39a3e0d55084e5abbcc3f3f87e7e231735e8 legacy-trunk
+6122 5309cef8c1692cc25f5e610489d1f30baaaf0a45 legacy-trunk
+6124 66eeab5a758c6732f224670d125f186cfb67b38e legacy-trunk
+6125 f89fa7e95b84095f42a182854d34a1f1c6c438ae legacy-trunk
+6126 ade9f996590a5e78f5a8bb0792f0703599504b5a legacy-trunk
+6127 9ac1e0d5667413cfd7e689980a58bfbb090c6a6e legacy-trunk
+6129 35be5df6ef7722b8f50a235eb1f2cf61911c7755 legacy-trunk
+6130 825bd8c11b1c1ac5c496bc7acfc2d9f8c46ada69 legacy-trunk
+6131 058d81d1d56d9326e377de5300f50960670de266 legacy-trunk
+6132 bd6d028d98fcef424525b32437260d532dd993df legacy-trunk
+6133 399470a958c22d97ccb863e6794c3f897e85d78c legacy-trunk
+6134 07164d30429dc6dd07362ec20bc2a91f25ddcb53 legacy-trunk
+6135 ad03e21fda54bca5c12ee778f8d7b8180258ad92 legacy-trunk
+6136 5188374377ae99625fd25beae45cd6784536ae2e legacy-trunk
+6137 556ec82f4d939e15f2c6bd5295774bdd8279da2e legacy-trunk
+6138 eabbb3c1818fe42962b1c15a98a69cd086a83a87 legacy-trunk
+6139 ab92480fa4ecb3c9b30d34355518f7778bbb29bb legacy-trunk
+6140 1d134ecda094ee177c80bfc7d1014ac3874c1445 legacy-trunk
+6141 16413ee58967745684751497a3cfeba0ad0c537d legacy-trunk
+6142 9a8a40f2218c9cb2626588e1fc15850ad9f64548 legacy-trunk
+6143 cec27c93b5cb834c101737dd513e60814aacfce8 legacy-trunk
+6144 f6ace61c3dfe64ea37ef980aee001eb34940d2c7 legacy-trunk
+6145 3eaf2c673a11a788fb6244af2223b3cbe2bd1082 legacy-trunk
+6146 d617de15774b2e7b75a2b7647aea7c9060aac213 legacy-trunk
+6147 74764b3ec1bdb74a5e6592756246f9af7dfaadf3 legacy-trunk
+6148 b05315816579830452c04e29d9a2d37f2384f6e1 legacy-trunk
+6149 bddbaa51aa5a93318afeb92dab2e4e63ae5ed7f4 legacy-trunk
+6150 b8980735d03b3e140938a642463fa9443d73d8fe legacy-trunk
+6151 8721fafdb67aa9b5a922d23cf87c8f232efc05d8 legacy-trunk
+6152 a527f449ca26661f5d290d367d103276aad392ae legacy-trunk
+6153 9466eabb669a6cf266fec655c1c726d73e0268a7 legacy-trunk
+6154 ec39264311ff2414fae01aed747926c910b90b7f legacy-trunk
+6155 606c38535f30451347d1946690faebfe6e17fb8a legacy-trunk
+6156 a1362a063122522fccc18801d7653686e0214373 legacy-trunk
+6157 bdbda939b9998f8ae8b6d51e553bcb136ba7b5b6 legacy-trunk
+6158 d8f9dfc76bbfc8df96ff1ad8ab6cd74c8aef9fce legacy-trunk
+6159 a79b8d81997feaad9ced2c14b4b093b90d2bb667 legacy-trunk
+6160 6dfd79944872fc03c5497493ba9b10926d9ebc03 legacy-trunk
+6161 4a07fe1e0b503cb5bcac48d66768f4263a4ad30a legacy-trunk
+6162 b5d1741ded4a5a48eaf08a05bcaa6d5aca33168e legacy-trunk
+6163 8dc1e74c16956eb200ec683aaf5d88914aa5c7fe legacy-trunk
+6164 818ee115054a3b9ce960122c117a81a15a07517b legacy-trunk
+6165 581f073f071d7d770f472f719cbb502c34fa3022 legacy-trunk
+6166 1454138c6f2d40c5a0b56068da8bfd706ef04061 legacy-trunk
+6167 67390c1daebeddceecf41cdf11b45cc093180ca6 legacy-trunk
+6168 81f535ca1d98cd46a69589a65fe0d2fd7ac2db3f legacy-trunk
+6169 97b1c2a70eae11fb7cd4399c0e9d2ecbeb874ee8 legacy-trunk
+6170 e23afbf77efdf954b3f9cbaf9b1ad65ff9ac9980 legacy-trunk
+6171 931086cb852950337a886795fee18f56c024c7be legacy-trunk
+6172 f04beb80f81677af0fdf618d4a67a3b53e24e431 legacy-trunk
+6173 3408756ec60189017d146d0eddb6f2474ae9f34d legacy-trunk
+6174 ff7fa59f62e8934ab7b84574cb7d1e434c64cd2e legacy-trunk
+6175 17030515f6232754d35112a59d8cf230fdcb1512 legacy-trunk
+6176 c867c294b16c083aa9667ed1819e62287f04b493 legacy-trunk
+6177 db577094f6853e15753be9cbd4b0166a36b90a24 legacy-trunk
+6178 0e9795004cd2676fcd18ed36755f14a84f143e0a legacy-trunk
+6179 0f6f0e98e3b64b4e5381ffe0b6960e1d49c7cf71 legacy-trunk
+6180 dad4d43363d8fe1fbb888005616700f90a9d8a28 legacy-trunk
+6181 7877def94063d47149cff5b9a30e9fc14ea4e8ba legacy-trunk
+6182 c04531fc27096939c31448eeab4fcb5c86967d2a legacy-trunk
+6183 8e4798d21915efcab3cac87ae4bd594d8d48e819 legacy-trunk
+6184 adc86707fa963899b59e29297e2f4c3ec7718a51 legacy-trunk
+6185 c120a483d59098d6691fca53545c2f81f7946201 legacy-trunk
+6186 5c258effe81c4d95bc6044f66a60e13a01f77173 legacy-trunk
+6187 de5279402b9438cdf6433c373381617ada7d4502 legacy-trunk
+6188 5012191ec2dab14bbeb478887818058cacf1f352 legacy-trunk
+6189 9e544a2c19a2da70890974b6b1213d488a68d56d legacy-trunk
+6190 76e5f3598e69b4a2991918535f1480c5b3a6ffda legacy-trunk
+6191 b341def4eef8cbc62a073564278956944804cd13 legacy-trunk
+6192 322f61e4c3875aa481567160c3b8835326a90e14 legacy-trunk
+6193 b2b063aa275510d6bcc484971b500f3f68f4c98c legacy-trunk
+6194 43a37e6b6469a4d21ab0fc3c265c0573d235e996 legacy-trunk
+6195 26442b5f9cfd847b63be2781d4fb3ccb409bbcca legacy-trunk
+6196 0ff5bd8ebb01a60b719a7663a09c7188e4c2efb5 legacy-trunk
+6197 657790db06e3c5945d9e7ad9cfc1cbec1f65d287 legacy-trunk
+6198 a10a0f6014c49a5fbd1a4c34395e2882f855ff5d legacy-trunk
+6199 6f3c7b2f2b8de828b26682d3995f3fba2780f9d5 legacy-trunk
+6200 068556380cb0861c5f8c024430da1617dc80feea legacy-trunk
+6201 ba84d7e8554b5ecd4fcd69d5769764b6ead33f0b legacy-trunk
+6202 de1cb33219e3118a3f9ea20921ea181a69e77e57 legacy-trunk
+6203 523f49a1e42a570988825faaf6d6965db941bf00 legacy-trunk
+6204 b250b270dbd4d0eb040135de668c8efa366fbb17 legacy-trunk
+6205 04c07538cac4db772cd1612795c237646b9a89a7 legacy-trunk
+6206 4692cb46008ee0c9e933f6d6878aa405c3be8f75 legacy-trunk
+6207 6c9c2ac15e4b017f7486bbbd8c117b4d0c231374 legacy-trunk
+6208 6b1b664863f4094025e7e0b5dae0c54cd5b37afa legacy-trunk
+6209 ce74bba8a6a6d18bce77ce6bc7241c7992747bcd legacy-trunk
+6210 79524829a730666dcb1b4844212514ba523f924a legacy-trunk
+6211 e4807a0c1092de2ecd40685597a4289c6a263688 legacy-trunk
+6212 ef59b4d00134907ad39286d9e486536ac9b042b9 legacy-trunk
+6212 4fc85c82cc222554ae6b9c0b87776ed5f2b70c6e legacy-trunk
+6214 b207876df29acac07221aa2604e0ec0178ac42ce legacy-trunk
+6215 ffdf1f06cf8b5c363f9c5476379ff5f95f7e4bf9 legacy-trunk
+6216 6080b2ebc1f14a5c45c2107660a75dacad912859 legacy-trunk
+6217 7504884e8a74fc607a886a21ef526fa2d5447552 legacy-trunk
+6219 ac7018b577456cebb116a750fe22ce64b9de730b legacy-trunk
+6220 56d3350ca1f172d62edf931b532b30b1115c9671 legacy-trunk
+6221 11e03d7a729805dfeef744a55c50e93357bb4089 legacy-trunk
+6222 a22438e94fe974b51913483a52529a3152c15e7f legacy-trunk
+6223 2db6363459caf1d69de2a8baac16fd035c141940 legacy-trunk
+6224 3537c08c1effbab447236b8c12ac3f328698d71a legacy-trunk
+6225 97d2278a331b945d4131be33d59280ec6ad0fbf0 legacy-trunk
+6226 d23fea248a1ec25b1cc177eb5df4856c14eeb1a8 legacy-trunk
+6227 6598a518668f77af258aba5af27d9cd7301fa9f6 legacy-trunk
+6228 82bb7d2a6b31e6f50ef4449ef70f17ab39895750 legacy-trunk
+6229 15b1b03ade93d72cde501750b4e3c1b6e1797fc3 legacy-trunk
+6230 b916d614e3634685ae655d5b862bccad60748a86 legacy-trunk
+6231 56746eedfe0378974b8c3403b5e3a81c2984464d legacy-trunk
+6232 bf8c230df5e8dd320e2c14ff44552b0de2940f5c legacy-trunk
+6233 e603601c68cf4468e53f0665332b3f851af4acbc legacy-trunk
+6234 c57b38e40b2da50c75eceaa252d78d7d560e0865 legacy-trunk
+6235 bb4cc3fa6000b09bdaf7c38dce69f5f5e00d68c1 legacy-trunk
+6236 29fe6a0de3663b8d45c2c7493eb5b4840acf84ff legacy-trunk
+6237 db5488fe495b2a00593bb913095f894139a5ef3b legacy-trunk
+6238 516490c8192cdfb016fa185b927c208b70fdd688 legacy-trunk
+6239 4b5def40773ceafa575fce5b208aee33b0c78db0 legacy-trunk
+6240 d1ae0ea9a585f912d7aa3d004ff817d0dea112f8 legacy-trunk
+6241 2b810a3c7e414ca42e6c89b4a137b4cbd0e46ec2 legacy-trunk
+6242 7cdc0c7146d50ac21973f5060d8cec671db8918f legacy-trunk
+6243 d0988318b7568c6a53ebdbe2fcd79b871edc436e legacy-trunk
+6244 c8d0f78221cc36e81786d64750989e87af0c470b legacy-trunk
+6245 6e40a2a3e6ef0c4a398633609a2413ea06f8e345 legacy-trunk
+6246 4c78d73c56675723cb773f23d0a2acf426b5cc20 legacy-trunk
+6247 ab110b1e92ffa182eac4d693e027e434cb3b68db legacy-trunk
+6248 eccfada47f285ab4a9bfaa545ee4b21ecd77adde legacy-trunk
+6249 f35dde7f4143e5f610baced96ca20f399c300213 legacy-trunk
+6250 f9907f57327ec57638d7a9201ea47a3cdcc7b689 legacy-trunk
+6251 10b5061f6cbcf854c7e81a52dc49094d09a23e37 legacy-trunk
+6252 ac114a5fc8ff846e798218383cf4bb41af7c66da legacy-trunk
+6253 27c377575f4ac4dd9f4fb2b08aa99806b41c54b7 legacy-trunk
+6254 3eb1694edce6b0429dc5ce85f98aa0a68d637741 legacy-trunk
+6255 a6203d17158ba52e0fd33d8c28b1c459faff5c34 legacy-trunk
+6256 b41019557b6e7cff88f2ae088816d81ce8c3198e legacy-trunk
+6257 0d74011310cd1b5beacdcaea82849dda41d2cd75 legacy-trunk
+6258 718c8af7be2a9fce9217b5ebf2462ec4923078fe legacy-trunk
+6259 7766360b85b891ea9db785edfeb85b3dc87afba3 legacy-trunk
+6260 b65368ed86be89d17fb9b1a9589adcbbe6573c45 legacy-trunk
+6261 468837ad45f3823ac8920848984a51e956af8188 legacy-trunk
+6262 7e6536730d0eeed2bb89de2914cf5161816065c7 legacy-trunk
+6263 2f57392b2fde129bc6e309946716432729c3830b legacy-trunk
+6264 e9ee4c905abd28f72e872edfcb59a18b911d6ece legacy-trunk
+6265 ca02d927818011b7f0968e281764f945a589ba98 legacy-trunk
+6266 d1c47f4f15415023f9690faf37b4ec29d9673a97 legacy-trunk
+6267 1f20f51b700e45b8c3652ab26fff58ca9265dda2 legacy-trunk
+6268 ec6963c3741c167407266fcf5548cc46702de5e8 legacy-trunk
+6269 51a7c8fe7c7b2926d8ac04f1878c0eac6b699870 legacy-trunk
+6270 a816abe86f9044d7ac65aad3c0f707adc0754f82 legacy-trunk
+6271 2f27501db3c3e427e1136b95a962a727c0e1c65a legacy-trunk
+6272 acf35ed0f0264751ead01375d345e8814528748f legacy-trunk
+6273 843121a226ca9461b86def6b5c2a14b7108e37b0 legacy-trunk
+6274 48e859f328cbc011f6c76ea4eab529fb575d82aa legacy-trunk
+6275 2eaa00860edc460b2c992579eeea796d57e9c8f5 legacy-trunk
+6276 48776bf4bd493c6c31173b5025f7d5a9648938b2 legacy-trunk
+6277 4f73962aaba6bac864785b2e206976aba7ce8560 legacy-trunk
+6278 93868c7a15c90beeb89441986233abe6fdb684a3 legacy-trunk
+6279 426e796f61152179ea4db9e8a16dc07b16d2f50f legacy-trunk
+6280 17a2891e627fb89e523f712fe651df100c2c99df legacy-trunk
+6281 bf3f80941ec11c8a371c583fc349ba0ee6c93d65 legacy-trunk
+6282 2dbd5081c71e7bfba0560e8daff41f968dc5d66b legacy-trunk
+6283 b9a0434d2cb6f1202d64f4648932cca47ecf02bf legacy-trunk
+6284 6d324fbafadc2f9a365932a92733206c17d6396c legacy-trunk
+6285 ca36e308e33d9de273f1a697796d49a22ee7d60b legacy-trunk
+6286 31e100d9d929c8b0d8baa761614cded15aaa704a legacy-trunk
+6287 cc92fa2cd86bd8ee6df766d84a24c26f93915f2e legacy-trunk
+6288 89d4f5ded670377609997eee1b3f3b3336457cbe legacy-trunk
+6289 f32676ab3f3a0611d171f84990faf4d96e597d37 legacy-trunk
+6290 3c5ca77279883a4312e6705922468d92721d7680 legacy-trunk
+6291 5b6a791ac6e7de4eada249c880cb904992e38f07 legacy-trunk
+6292 f7f3e4b5693c14bed39def63e6bbdbf9c151c5cd legacy-trunk
+6293 240f834aee8bbb484583394346a95587224fa230 legacy-trunk
+6294 db4ea3abf8912c47209503e9c720563c2815cf35 legacy-trunk
+6295 9aac37892e888fed848ba1dad4b67aa4b69f3244 legacy-trunk
+6296 820aba1046c39afdf39169f20f73003499a7f8b2 legacy-trunk
+6297 c3ec69b1fe360933ddc65ff213c5cdf78e4224a1 legacy-trunk
+6298 9831e0fc01de04728e9b81fea2cdd5386c03a346 legacy-trunk
+6299 bc22eb5d4a0a11ba65cd420a605c23372c4154c2 legacy-trunk
+6300 c35d9e2a68608327e52824d04c2409fca0e1b9de legacy-trunk
+6301 09beba9409ddd4af53287401c29642812d0a2e19 legacy-trunk
+6302 3e3e95ddce22fb3489f446aab5d5d327fcf026b1 legacy-trunk
+6303 96851f51ad6bf9fedae5f6a4ef6bc1d8d8368e96 legacy-trunk
+6304 039bc3e4e64ea1208fcc390022212f6e6980b94a legacy-trunk
+6305 f0efff28a24dd1d055c36ac593c0b6d4fab61093 legacy-trunk
+6306 77d912f2abcb4f33040f0cb93d9f875e7b48045d legacy-trunk
+6307 343232c1dc9a074939970e6d151c40a8b3e9abbc legacy-trunk
+6308 fa1480e60ed6b4888cfecf6418b2c2c976c9de3e legacy-trunk
+6309 2b2efa48f28d26b973cccdda03d0d5cb3af76bfb legacy-trunk
+6310 5aab3f668e84696d25d165aea7362740af7286be legacy-trunk
+6311 22e29b1747e139d9598eaa5126c59313af39949d legacy-trunk
+6312 26c2002666119806e007ad367cb85385f7221da5 legacy-trunk
+6313 f66679aa8de0ace36f36dbb3d7b95b329796e188 legacy-trunk
+6314 210816d348ba45ee891469078bcba62da0583dab legacy-trunk
+6315 de0ad7527de7fce8471e86094f28b77e1cb0f5fb legacy-trunk
+6316 0d54a14ef0b8c74bfb62d5332f233e57ec786829 legacy-trunk
+6317 d19338fd38eb69e85405cee1a09a07364f1ee6f4 legacy-trunk
+6318 fcd82a01507d26229555b7b0914bcaecd7755da3 legacy-trunk
+6319 8dab3ad964006bedfef8f594340f30d7362cca23 legacy-trunk
+6320 97d24af348cfe829b41c7d2f2da9d89ff0a18c70 legacy-trunk
+6321 69dcc02e3135fabc734e50eb1128133d9e3721c5 legacy-trunk
+6322 d1cff49e3cc8d280a46d3ca255787d14c1cda157 legacy-trunk
+6323 0ffc0b362fcbb93fabbbb5c578a61dc62b7ed39b legacy-trunk
+6324 97519dfc63aeb79dfe8a01fe922f085a09a85a16 legacy-trunk
+6325 3b114f0315c14561492162ad785bddb8d9e48085 legacy-trunk
+6326 23126e8040a0c1262ea18d0fae72ad4d664f55d9 legacy-trunk
+6327 0457ea94ef79faf9bc79bef1f24a8afa2f546e0c legacy-trunk
+6328 5830ede4086c74404d417de3251dcce316e19d92 legacy-trunk
+6329 83a95bf70867dbf374d7de8599744fa08b5e1fb4 legacy-trunk
+6330 8b71ea5dacc831550239d73794faaba6ed013527 legacy-trunk
+6331 0853166f0d69660d6c432eb38d2570afd4b7b7fa legacy-trunk
+6332 b61939524c3cefcb4ae0e215048c0064d16e0650 legacy-trunk
+6333 8b5901399addb4ea2168beb7c92f54354b1a0c94 legacy-trunk
+6334 d55cdf43c24019c64089efa2c6f872707fffa460 legacy-trunk
+6335 4566a19c3438d14e016aa370f20c38e7f118dd02 legacy-trunk
+6336 7819568323c3753f32d23b57021804c6772736db legacy-trunk
+6337 4591035228a773a516aa40e8573f4a59dfbcde51 legacy-trunk
+6338 a3b09a71162bc22bc4c4ba376376f2606f638d71 legacy-trunk
+6339 e9b35cc88b50e940d27bcdcb045772a9ec7f7a6c legacy-trunk
+6340 2ac2a601205b335bc86b09173e6d59d14f509701 legacy-trunk
+6341 4dde8c040f9ec5165be037fbecc03a5ca5d9566b legacy-trunk
+6342 5b1471095a3a26721fb641f425566a63b4242687 legacy-trunk
+6343 9b195285fe177b15f4de55a3e4a659585fb713c5 legacy-trunk
+6344 4e979161671f439ae85e20bbdd502957fe9f30c8 legacy-trunk
+6345 bc0edc589ad49d9b5d490cab5253ad24a4ebc799 legacy-trunk
+6346 dc5c1117733980e8d87541e627037b4a7e50afe8 legacy-trunk
+6347 2838db83d0ed38604ef628a47d10c4320a3950b3 legacy-trunk
+6348 0638fdc23eec4ba6e6b3e248188f9e617bd0c801 legacy-trunk
+6349 408e374934e5a424d3043bfd64b895aa2175978c legacy-trunk
+6350 4286910080a9feaafde3f813079b8bdbd3748d0a legacy-trunk
+6351 fee928f1661e7752f5726ff3882addf03b9829c9 legacy-trunk
+6352 d0b4566e2107a537418137ee10789eabe825dca5 legacy-trunk
+6353 2da12c9d714f4732bbd409e58566186bb2fe3114 legacy-trunk
+6354 357d7395c998cdf66ebf646be543f83465cfc483 legacy-trunk
+6355 c883d5e24ad8f335c92eaf6d02ac9a8454a44ec1 legacy-trunk
+6356 6dc7ed8a434b1ff3690fb9a59811a2249c1334e1 legacy-trunk
+6357 fc9b165a8a09d31286be0860a9843750b3946960 legacy-trunk
+6358 81f60f52b8732585af4e8c37a9cf47719cdae04e legacy-trunk
+6359 957f42ea0f8444486a237cb792b3057ed7c323a0 legacy-trunk
+6360 3c75306a65ced41663378c690ca5a3454e9dc7a9 legacy-trunk
+6361 5716825f6e9b137ff867e3d9babb43f8e3135a59 legacy-trunk
+6362 f90301544fa9be89a6b8f2a89c85b7aa4d16eb12 legacy-trunk
+6363 d9e7f1088c3b363ba4852cd8ea71c82741e76e80 legacy-trunk
+6364 ab0889e421ed47a2b2a54042b96446b6448057a4 legacy-trunk
+6365 958d4c67526b09cddd2e26225423143e0b2de464 legacy-trunk
+6366 a50ae8393d3780cc743bf9b83704c1b990502ef8 legacy-trunk
+6367 33e5d1d42cc262f98204abd9353c192ea7cd7533 legacy-trunk
+6368 f4a3b16e95f07faaf4ef1d0a1c2dbaae9926c41c legacy-trunk
+6369 318e689c220f92197d9ec765be69ecaf32475d46 legacy-trunk
+6370 94c6bf6fd7f4fa095024c7daf88ab4b4921dc53a legacy-trunk
+6371 584936890f866915d2154bd525e50f3f45f2d177 legacy-trunk
+6372 cba4ce15a0d5c99aa65a9c859684dde5cdd7c6bf legacy-trunk
+6373 ce2d9239ba81145d8c60c2c61f905deb7b86d838 legacy-trunk
+6374 0864a63a10a92c17c51cd30413e2bd03ffcb1cb3 legacy-trunk
+6375 a3f67bb96adc8c326dffd852b0e71fc9be733aa6 legacy-trunk
+6376 fe41163c00c3ff29de5f56e63c3228d4487f0105 legacy-trunk
+6377 97e7011fb1b191a304f65bf43a156c3fc370320a legacy-trunk
+6378 a0fd81688be52f5d572958c9c24cc0491b6eb318 legacy-trunk
+6379 ac1d5abfd78ee4910d7e5832a78c54525d2a321e legacy-trunk
+6380 8671642e14a378f998b91e8206a57855b8a4086d legacy-trunk
+6381 6d5096b7038d8a169a741b09e1aefb15393dd4c2 legacy-trunk
+6382 9cf11af3628c89859c531d535fc4c7893c21c830 legacy-trunk
+6383 a9a92dc2b374946c2864161223ec17fa769d17fe legacy-trunk
+6384 5bbe0dce2e2671cafb8a042746d4e5cc3871c60c legacy-trunk
+6385 f28d3d8982a25a7375a1a51ffd36e12241a1ff4b legacy-trunk
+6386 524cf501c851fd85a39e72e569cae806787e3ca3 legacy-trunk
+6387 341146100f38ca98fa67e70fa8ea009f9bdcc42d legacy-trunk
+6388 84e16cf9219925b5ce38a49890d02599aefc2267 legacy-trunk
+6389 44412e46f26877e94730f59257f78b38ea39ae49 legacy-trunk
+6390 7de5e1153b392cb6d56fae5c3d6a371594ea48df legacy-trunk
+6391 f487793d601846d0f9662137597bed89b31f3473 legacy-trunk
+6392 9366164f5c4a93d7297ca8d7498125aca017613f legacy-trunk
+6393 c2ae0440c424a72284a57ec8421e9753595969cb legacy-trunk
+6394 e8bd430cd357e86cf998d7d898f950542cf25f91 legacy-trunk
+6395 a39d0649752035b7d9a56b2c46ea51dad118a617 legacy-trunk
+6396 063d86741410e2ed87d1c296f9ae17e23c4ff4cd legacy-trunk
+6397 4bcee63d5bb17db0383766fa73400d3a4c33aef9 legacy-trunk
+6398 1da168185e4e05b89a5086a18ddc6e93187ccfba legacy-trunk
+6399 53e757bb67d5d631e6ba981b5f84c7c812d477b9 legacy-trunk
+6400 1640e3559b866799d9c3ea09b225999bb8dc115a legacy-trunk
+6401 ff68a2ec1ff12cb615ccbc872a56c52704f49799 legacy-trunk
+6402 52c19ee83a6b0f71c89007a5d22a8ddbefa1924f legacy-trunk
+6403 882a31b7f87311f8e08f0082da3acb44b92be817 legacy-trunk
+6404 fe11969953446d70aa921134f8d3871070c145dc legacy-trunk
+6405 60bb743b8a5c2000d3b055f722478e594bbde384 legacy-trunk
+6406 f9ad98b58472b08e7e59502e63303e28f583e829 legacy-trunk
+6407 d7d8705ba6444dd0d7a1d5a21848b25714b6c9c8 legacy-trunk
+6408 6e0bba93a0eb3386094dc3a9849783287fead818 legacy-trunk
+6409 decd13f6629d5a43240f5e5e5d8cdee32b78712b legacy-trunk
+6410 61b4cae77f7e8735ab0666de8285ac54b86a4ccd legacy-trunk
+6411 675328b08122b9cc944ed122fd2fcc7fb437f2fa legacy-trunk
+6413 46b33cf8b913e5d0722da1a55e86c55c923e7e2a legacy-trunk
+6414 0d4437d1c2b57ebbbafae200e2b5921cab0fbf6a legacy-trunk
+6415 38684852376f5422613953c2d0d2b0d67d2e146b legacy-trunk
+6416 6e609e266be9d10a9b1a2362dd564f69f4e3e7c8 legacy-trunk
+6417 fbafb0cd0a2a55ff313ad4e7090d1374f804f815 legacy-trunk
+6418 73cf7082b9e8d741472c4cfbe8c66dd271534932 legacy-trunk
+6419 6f78d3164376ae2421f500417ff2cd7902053493 legacy-trunk
+6420 10753e4d76e71dc6a085e52622df914a74c07cad legacy-trunk
+6421 deadea43bb5364535e5dd170f28aef0d17cff955 legacy-trunk
+6422 3acaf7af49cc10136630f3457a0025ea06ad2f39 legacy-trunk
+6423 75d016c97d1c2ceef478fe875c32bd085d1c030c legacy-trunk
+6424 9081819abbf556742a9f9f420b35659eaf40adf0 legacy-trunk
+6425 7ee1b100ed29a4ff1f23157be8c0cfb492a43d0c legacy-trunk
+6426 f0f8b50b5b6cd686ec0e6bb49ccf01dfedab3c90 legacy-trunk
+6427 9d8a965de7ec8ac9f536dc556541496e4a816529 legacy-trunk
+6428 29015b58e92202345298efb9810f9438779978a6 legacy-trunk
+6429 8e309be89ee454f17dd060e1e59aed27b792d0e9 legacy-trunk
+6430 f01e7af1dd60683b1f302e93257ac4738586ed13 legacy-trunk
+6431 b86c80448d355e7e89cbc76c224354bcab312cb3 legacy-trunk
+6432 6af7a703adaeda1c6f5e5d5d2b5c2948422a264a legacy-trunk
+6433 90f5055550d9a04e52a6cf6d5002151c7ec812cc legacy-trunk
+6434 bfd9baf3a9c29fe5ed63e2a6a81a210c4f5aa889 legacy-trunk
+6435 f08d7f368ebfa18e99d03a6a8d4df07d504e4fe9 legacy-trunk
+6436 00722990b80c31f2ed9ddf25f5da483f186664b1 legacy-trunk
+6437 fcfec6a810ba543e67b20f92b1949788d6fb5a97 legacy-trunk
+6438 9c05ff6fb0a4e4bb75e5bd063fe97a21b7126147 legacy-trunk
+6439 2897dafed95a7284ecf9aa4ca27bf0d2e9116703 legacy-trunk
+6440 53019e3a6d5a34059282e5f778f37af2f1d3e273 legacy-trunk
+6440 129f1299d4e97e884bbbbdd00baf101d178973e6 legacy-trunk
+6442 ad88a000521f7b3f3edb554ebadd8770e8f008d3 legacy-trunk
+6443 dc144259498fce9aa689b28fbc97602ca3af30d1 legacy-trunk
+6444 14815252c7a3a5ae41d3f891b5f8b12bb8381904 legacy-trunk
+6445 bb0ce653c2ba027bb412997d0b18b4a716dbf6b3 legacy-trunk
+6446 3d1e4b76f745a92c915a86db3bfd18f377e6d89d legacy-trunk
+6447 fc505f02ad8a280759eb074e52b9b0802005469d legacy-trunk
+6448 b76fe67eed44ea7093020d7956170b6a71f5be24 legacy-trunk
+6449 a34997b6edf42bd7de152030f20ae22547c2cc27 legacy-trunk
+6450 eaec4f6a8be8cff7fe13bb09702304abfed09535 legacy-trunk
+6451 b93c4cfc2cfea4b4c3f463a4cae535888003ee73 legacy-trunk
+6452 87e53c62cac82160c7cd9268f09c7f13e1805871 legacy-trunk
+6453 4b5098b1fcef28060ab890ce9a02fce9236aba22 legacy-trunk
+6454 fb5fc0320e6e5d52daac97545368cc8ba9c6b1aa legacy-trunk
+6455 caf110724cc177e4503bf6078db72296a51297a2 legacy-trunk
+6456 44902516614a901fc9ed9fcc68da91d00f4ab158 legacy-trunk
+6457 0613f17dcfd8653a304744713d02f7b16a67a563 legacy-trunk
+6458 011cfe7490eb5f96f4835b4c65e86cdc69fde2c1 legacy-trunk
+6459 9c2cbf306864d2fb9b053c3d8b2bc41e448a92b0 legacy-trunk
+6460 6fbc5c6658121e5a4085020ddcc06f7fb166ae34 legacy-trunk
+6461 efb3a5a2cdeacbfb1f30e3934e7fab3a3de7888c legacy-trunk
+6462 a815765b46952c1f3a8816182405e108e17f5032 legacy-trunk
+6463 ae8d1b469813a71fa753cb40d103afdd7cd92db4 legacy-trunk
+6464 cfb8b7bc0233a5f12ce17f5ad1091ed6dde5dd23 legacy-trunk
+6465 a4aac766cbf005828ea9d2ba54bc97561e7a7adc legacy-trunk
+6466 6414ffb7f285d362e323c56897550965002e735f legacy-trunk
+6467 3f57ab32b7412b335c0e8a381a412423caaabde5 legacy-trunk
+6468 ca0e05ec85b9aad30d18da90a4dc3a811e5a61c1 legacy-trunk
+6469 0ec2ce97b8e3cbd0aadee0318135a1e2f88c0326 legacy-trunk
+6470 8069790b397400919ee990cd39244f4d40c2467b legacy-trunk
+6471 f630a067ae8cb2210b68cc782f85e15ee89b1939 legacy-trunk
+6472 b0976cdbd59803b303e6ca01369056c7b0aa557c legacy-trunk
+6473 bfffd38d600b5d965a5cfbe61a468eda582d2356 legacy-trunk
+6474 1ed773e159369345c39e2867449f19e3e1bda1fd legacy-trunk
+6475 4241582636adb38ecc14382dcd0a3fa5c868d1d2 legacy-trunk
+6476 138fa15a1032ec1b18c691e681ce8397bf8c8ec4 legacy-trunk
+6477 d3a1f6088c28f13199f0c24600ff1b9b87ecd877 legacy-trunk
+6478 7495322427c76ac6e3f79536763d95d711f2c27f legacy-trunk
+6479 c2a611ae0fecf4969003c2e9f51bb9f142a4d84b legacy-trunk
+6480 1a0aa986f6fa6455b7b13f7eb42a5a2e5d7c1174 legacy-trunk
+6481 18c32714f8ba55d155ea6a8962ce092901c53617 legacy-trunk
+6482 61106986a1a4c9bd535c6111c4ac9df409a0ceef legacy-trunk
+6483 cccf9f2732cf3ed4fe97f7e51f2528870a47dd3f legacy-trunk
+6484 929411db20a8587f61549720d80b87635806a87e legacy-trunk
+6485 22a033bbe655f15b403f461db40b4dfe6a56f522 legacy-trunk
+6486 aa9548885b3f80a323a8712744aa5fc7c576cfc9 legacy-trunk
+6487 4909ef39eaf1db824146845021c8ef3451907365 legacy-trunk
+6488 211215c1c50d4b24a3d7484b3219636ea5f16745 legacy-trunk
+6489 938918ff3537950e69248e4eb2fbf6ae357c6667 legacy-trunk
+6490 5dc8c042905b5c1eb226d587aa65db3aa6704a41 legacy-trunk
+6491 40c929335d7f2444226c4f7b7715e667a8d5230e legacy-trunk
+6492 1dee3e4f67df02224e85d33f84b6b0230e360875 legacy-trunk
+6493 f49e4057eb68302f299b37afcf761229389e2514 legacy-trunk
+6494 cf2630a41f8752e6ff53758c16ece5acab913633 legacy-trunk
+6495 4fccd9eee679c20cc71ea15802d8eb000c5857db legacy-trunk
+6496 892f4561648a0950e1c5a7bb151b569847619822 legacy-trunk
+6497 53d511c0029f54131857f2cd7dde4e0b281f941d legacy-trunk
+6498 854f25fde8f42c0a27f815cb865767bf4891ed66 legacy-trunk
+6499 6bbc13b7dca88b839608155485c6a8fe9e07bd4f legacy-trunk
+6500 2cdb8f5ac365f8dcfd784771bcda14ab396374f4 legacy-trunk
+6501 da2b9ae91d953ec60b916bf48730a90756e9b210 legacy-trunk
+6502 82c9dee053bc6d441ee4a9967a8b375086f92855 legacy-trunk
+6503 e77faf55697b8f3dc52ea04e706c8da3dda49408 legacy-trunk
+6504 3a200002d80a880ea35081fa66ab0d8f8662b550 legacy-trunk
+6505 893949d1d28eaa7e2f7d5287ede14225c706d994 legacy-trunk
+6506 5592de9656de4a920049e05d1eb34b5b8f65ac1e legacy-trunk
+6507 b43338c5231e10531614d20372541a5ce19eeecd legacy-trunk
+6508 d1baec5718524c333498569bf8adf48d4db01156 legacy-trunk
+6509 f7c243d0184469dccfa2015e6784356fa575d399 legacy-trunk
+6510 ca39355be55a2baec990395f0ea8ec413bc2113b legacy-trunk
+6511 261472fa972a7580f3430db8073deedba8c0b5e1 legacy-trunk
+6512 23f280ab5409b79e6173d4e1f851dbb675594d33 legacy-trunk
+6513 f41f0caf1cfce2f54240b61305943894e64682b1 legacy-trunk
+6514 8a010dd4736eb83e0e6356f77f4958a56c578c1a legacy-trunk
+6515 6b4d0f1a0ae9c9bb55c18d0dc0c2aeaa0a8ac226 legacy-trunk
+6516 d6c7e40cbfdf0a393f6b422343550483a894499e legacy-trunk
+6517 ef7e3c499a4da01cd2e12d356510735bd9d9f807 legacy-trunk
+6518 96e0a7204e31d80ff7a184f0a235709ba4ef1bc9 legacy-trunk
+6519 eb9fc404c066313e4e9ae76bd3e07c5d79331d1a legacy-trunk
+6520 3e6863cea383263c5982c73a84525d1a77168b0e legacy-trunk
+6521 f7b13d4182b3dae8b373e22da792bc448df620d5 legacy-trunk
+6522 a2dc7ce4dfbe7bd6fc3cc3275db9d60ce88ad3ba legacy-trunk
+6523 bc065df03ee4ef88c2c486dafaa503c497918665 legacy-trunk
+6524 d6ca6e2079947722905b028908c216225b35765a legacy-trunk
+6525 ef6c89fe21edea1adc18fb55e0115126d504b58b legacy-trunk
+6526 ac925b9a1d6772137e5c6bf93a0d6a0be4366a85 legacy-trunk
+6527 669ccd9e717e8ec9e2ceeb88a6f9f3af3e4bd994 legacy-trunk
+6528 f0110c5c622792b465b3b57bb1c1de1f93a9a416 legacy-trunk
+6529 6deee3b206b9947e44e82690bcfe0fb9142d2f28 legacy-trunk
+6530 818599e39123ccb81b39376b0859622483342c7d legacy-trunk
+6531 21b28dcfa86543d75d742f07bb381282479b4506 legacy-trunk
+6532 d6897385c3185fcbddd9b128023a387dde57cb64 legacy-trunk
+6533 64a58b0fb16710dcb737947ca65594c50c4795cb legacy-trunk
+6534 4bf01c66cb686ca98503d615aad506b8c8e0bed2 legacy-trunk
+6535 d6de2c148819ac7c3cfb822f6743d59b4027d21b legacy-trunk
+6536 a589cedcbef54654514ad15b2411e85ecd18e4a2 legacy-trunk
+6537 78843472fb6fa23d9680dfe85a4f137e65c981f7 legacy-trunk
+6538 bde19acf1045d47e5982926ee9d5525ef5cf7d36 legacy-trunk
+6539 2c89bf04f834eaaeacf1553dd380e9185af9ed25 legacy-trunk
+6541 231a420918302e97dc899e81079fbd79490fb709 legacy-trunk
+6542 4c54ecfadce5e486b068fb2e808316b4a90f9b16 legacy-trunk
+6543 efe86891f411b857b9aeeecf931ad485bf3668c7 legacy-trunk
+6544 19412305d335a69cb1cfc191c8e223d6ebffcad1 legacy-trunk
+6545 c575a920e4a1f35a4f93a161eb6beb1f817eed4e legacy-trunk
+6546 f66562536f11b3d5c72bbcbdcd4e0b71dd90001a legacy-trunk
+6547 58504c9a37dc4a83e3fdc2458ad27de258ee052e legacy-trunk
+6548 7b6eefac6e49376097368802aa6a656d12f7ac31 legacy-trunk
+6549 4a7038e7a3139c09f49f548603f92258c05b1660 legacy-trunk
+6550 eda29bef880c9a5dec27d1a2567f51a656ce7e45 legacy-trunk
+6551 10c084942cf12dd0feef3ba2b229511a0b0c760c legacy-trunk
+6552 18451dca9469a04e2b3087d5e74581222693f9e6 legacy-trunk
+6553 a6e62c21b0e3b01cedf3d7e2bdf5aa371221de5e legacy-trunk
+6554 752b86ba16fc6e938496b76b888afff49dc5525a legacy-trunk
+6555 5f6869a38d851f0696580541ca5a8bd8c0bd8a26 legacy-trunk
+6556 390683818f73417db914fa1b010860ed6d6c174f legacy-trunk
+6557 46617d29c5d0639a7d65317aa6d78364ce31fa93 legacy-trunk
+6558 7f83e24d1d869b67471031e401af9b1c59ee9e63 legacy-trunk
+6559 e0f642ee45bbda01a2f1d1081dd6259230c2a66e legacy-trunk
+6560 831b420e411e421d337c2c4e6e56699e9aa85447 legacy-trunk
+6561 740def697d8b8e3bcda4de6c9cf2a7965c8748fe legacy-trunk
+6562 f81d78547f289291afb2353c3f5c7c4b54796b09 legacy-trunk
+6563 9f70d995d0279299cd92f36e837c884bdca10b7a legacy-trunk
+6564 0b40c8d5b21d225955970ccdac35eac9a1d60da3 legacy-trunk
+6565 dc946cab7b9bbbaf39fae6909d733fd67e5f2527 legacy-trunk
+6566 8592fa4a119b08a88a1ca47623b38d0b1537ac5c legacy-trunk
+6567 f29fe71f11e64f1381efb7f86e28190c8711dc2a legacy-trunk
+6568 8438184e448e037829ba70750f9432409e7c1308 legacy-trunk
+6569 0a59c98dc00535fa73b95fe53f29b0bc10f4a45e legacy-trunk
+6570 8465d8fbc7ac17be97dc813cceea0a09abdd1b4e legacy-trunk
+6571 e538638edc713372253e78b5a52274509b192877 legacy-trunk
+6572 6f6ba7c00823ead8d5e5aa9ad66f812fb99de596 legacy-trunk
+6573 3a3b36716689c5f8713d80cb37daa2dbdc091528 legacy-trunk
+6574 5336c03a131fb5bf02a84360c54d0497b6ef3927 legacy-trunk
+6575 2fcea5dd1d18a25ad61e4526d68741d3462a8cbc legacy-trunk
+6576 9569664ac34753f9d5d1a4c37d6318e4097b3eeb legacy-trunk
+6577 a5a82666977b5e29c788d23d920dc7ad7e369728 legacy-trunk
+6578 869a948085c10fce839da6d5e74b184673f725e5 legacy-trunk
+6579 9c1f9b09c44275762b834842aec7bf5084e8d434 legacy-trunk
+6580 f395163ca9d255ca4f6c08cc1a751c2ea5e4ed6d legacy-trunk
+6581 3ac030cc33f06887bb87a11c0962de3ac512e113 legacy-trunk
+6582 6d9d5e7e588c49fcd2dbda18b3de16a527c5f361 legacy-trunk
+6583 8c7b7e94f4dd39ebbdd09533f7d3185b17f05725 legacy-trunk
+6584 07a35fd2e0a13ee94570abb899d867e73ed59c85 legacy-trunk
+6585 90216e907345eb20b359ddd849e388f8e8cc373e legacy-trunk
+6586 5726be8ee59f30bb3082175489a3ebfb53891c80 legacy-trunk
+6587 b3af325d712de3e97ae089411b01a6f3a90a6597 legacy-trunk
+6588 5d52395f40b0c9a2b5f5b93dc3203b8361e6304e legacy-trunk
+6589 23589c016cb9b8c514406e4ceff273108d881c81 legacy-trunk
+6590 3190398ae533c26a1226fcbb714bae322dfdfc4b legacy-trunk
+6591 3d117587005a1de17ab19197165888311e764328 legacy-trunk
+6592 a86407b3c3ac5397de06ea070d9dbaeba2f0dd6f legacy-trunk
+6593 4f84cee65b8c9e4e2b05a4f050582318d470cd6a legacy-trunk
+6594 650031e1e4190bf6fdaf4724d4717c32b6b55015 legacy-trunk
+6595 083a7cd83545526f477824be496694d433f14e6a legacy-trunk
+6596 d30f5f0fd0e2d29d5ea2144a12dd515a1564ef97 legacy-trunk
+6597 71b43d4b7cd0d3679ea6aeeec4f8c3ecc8f375ad legacy-trunk
+6598 9e6504494ac739198e83c9e2dcaa7515ad721134 legacy-trunk
+6599 0b73c31bab9097ec2b3e0f0dff2a0c59b233f738 legacy-trunk
+6600 c80c515999b9830ddf4d28518eea591b2d2097bf legacy-trunk
+6601 a7a9d83505c47dfc0b10d8777f203955dec226d6 legacy-trunk
+6602 5ade4096fb6b89e32916e5f87dde6856f1f66430 legacy-trunk
+6603 eedaa59341b95d313b2263c8eb9a79f3148fadee legacy-trunk
+6604 7b84dae97ee8a9888bb34ec8f6c5e2943d5a0ab1 legacy-trunk
+6605 6b589334e0e9e6a8399df234296ef27b9e83e51a legacy-trunk
+6606 c18d52e06238703c52462bf30c86428014f79f50 legacy-trunk
+6607 a2bc941564a19fba6b3c145b2cbc04e5e5766d7b legacy-trunk
+6608 69edc67e5a68f20ead1d9d94bd2906a5d6ae9a22 legacy-trunk
+6609 1899b91553d1ef327770e60ffaea6dec335070d5 legacy-trunk
+6610 262fd582e44b34e8353b01491ef25abe7f31b130 legacy-trunk
+6611 8b75d5ea207bd79e3bc60c95d65877ba9e6a5b3a legacy-trunk
+6612 7d3d2ee54a2cb25bc4e8b02869ee4b19a6a9a921 legacy-trunk
+6613 010344b4a616253ead0ddf21c5503a9d3ba2e483 legacy-trunk
+6614 5baa003bf39e0b4e276679398d55d2b5718e0f20 legacy-trunk
+6615 6fb131501bb46d6380f126b4f0375bd503db1213 legacy-trunk
+6616 44872f255f934747b441cee8c38651acf003799c legacy-trunk
+6617 33bf382c2b1d9b5b40c149d3d48aa21fb1d3ded5 legacy-trunk
+6618 efebf1c4eda296540480f687fef9ac69201b9211 legacy-trunk
+6619 951ed9a83f57a50dda5f616f25ba0e0d52fd8e48 legacy-trunk
+6620 c4d66c410c83cd02ae7cb23d9f188428e1e2a9c5 legacy-trunk
+6621 30f1c01f38650b68cc5ecc723ef2f940238dc4b1 legacy-trunk
+6622 ab43715ef4ee24f96e0953f4a2643bcba26ca19c legacy-trunk
+6623 4298ff222d763db7f493a03bb4b821f47d42331c legacy-trunk
+6624 8a0d43b131251d2f6b5b6fdec18a1b8c7f54bc70 legacy-trunk
+6625 69a33fa3dbb8811505cd03132ddad77a58444781 legacy-trunk
+6626 9881a5214fd2c50199202032238cc6ba7970fcd8 legacy-trunk
+6627 cc06e70127fc0bc8c4e7d65f4a852ef7454d7929 legacy-trunk
+6628 02621b877ee5df011ce5b83c8ce072b945ca906b legacy-trunk
+6629 86a62ca3a37b7abf559414eb0da8d54621d7a885 legacy-trunk
+6630 140508c9c6031825ef87200070626fbbe3698dfc legacy-trunk
+6630 44a82ac654a4175569deed8e8a94b0cc8edee08d legacy-trunk
+6632 f3a0d50246d2713fd9bdbe62504d0546ac821afe legacy-trunk
+6633 df63985c1ca960f0e30f3cd9da5024eb37bae2bb legacy-trunk
+6634 811a7ff783b77296ae0b38da3b2200ee14380081 legacy-trunk
+6635 a81c3de3aad95c957d8894cdcf9e68b9fd44b205 legacy-trunk
+6636 99250182c48affd578a5cf36abe8aa2073397fbb legacy-trunk
+6637 582d4937d49971e5c8d084affc8482197cc9c6ad legacy-trunk
+6638 1c079e23fd3b89940fd95eab029fb67d917da7ab legacy-trunk
+6639 b3fde529440fd64de7df2bf64c7443218d1f4307 legacy-trunk
+6640 a71a43d247b09c207c02b3752f29c57ee4748e41 legacy-trunk
+6641 a9400eee040b18eb1074bb489d4d9cd28fad5b69 legacy-trunk
+6642 74b8aa7f1114fbf3f2e24d479fe1e6ed290a7dc3 legacy-trunk
+6643 687899c563e3de387c43d1f2e4b412d1e5938a35 legacy-trunk
+6644 3dc2e675f178170784bf943d0771e9f34eeb0507 legacy-trunk
+6645 1855e7c791e23dcd223573201ef5788d54f0f836 legacy-trunk
+6646 88997802fb9bb0a189cd425f8f31ce9d406cc32f legacy-trunk
+6647 236adea9760b00f274c80dd8ecb3d65c3f807907 legacy-trunk
+6648 d241bfda7b746af42e3d8d1ba95567159fb6b0c8 legacy-trunk
+6649 bb5b9ff72de19518c600fe6464015c7f0560e8cb legacy-trunk
+6650 37d009b1bf45da967c9996c9e2e3e48f8aee2067 legacy-trunk
+6651 315a50cb15e38d8978a16e7b75ab241baec070a7 legacy-trunk
+6652 28174aa38c76277a008d54b356a583bef4eba8d7 legacy-trunk
+6653 33f4a91f871bdbb9d63548c693671b87448f6dcf legacy-trunk
+6654 7ede012a35c5ef346bf7559c0c1cb74c58143c2c legacy-trunk
+6655 3d53cfab882188c389d84b9d6af9cd0498c08c54 legacy-trunk
+6656 a3926484a6583c307c3d5495868f96a4e51afdeb legacy-trunk
+6657 c363645b7edd27b49bd163112e71da87381b1e58 legacy-trunk
+6658 2ccb99c9285446bbabccfe94630fe260725b37b8 legacy-trunk
+6659 a23f4f46727b9bfa546db709a00e35c125c2dcd1 legacy-trunk
+6660 5e12e9b28eaff1121dac801740c7d4d938cfbef6 legacy-trunk
+6661 8bbecf683a5040f6add3d389236553ee0da3d571 legacy-trunk
+6662 c796ae1157832d2ccb5cf248bd2bb7c1e3eed219 legacy-trunk
+6663 03f2c21aecaf26a0379bd3fee41e162114a4dcc0 legacy-trunk
+6664 94da58214d6c75fd80983401c9633dd9c89e7e3f legacy-trunk
+6665 e61318c3ad1e87e164229406f08d2c11762e83c1 legacy-trunk
+6666 d23f78730e00d13dff1caf70b1b7d1653585c3c3 legacy-trunk
+6667 f025d8a377b570018d819de4715365dea5676726 legacy-trunk
+6668 dfbd6e00dd383d2f3b0ec5f84d2ed6c7d97b50e6 legacy-trunk
+6669 e3f6ada28ed095e7d00d9cbdc5102582c8e5c628 legacy-trunk
+6670 67206bbd5bb548bd60db69a2b494a1a937351d57 legacy-trunk
+6671 b70baba1c78932c279693488946a887cf831de36 legacy-trunk
+6672 38383b63f4158f944e768a32db8e1dd510904a72 legacy-trunk
+6673 6fb6e01e2ba14436de0d86d1a8a5c3cd80f1db8e legacy-trunk
+6674 22aac81c7560c1a8960333f1b1148092ff0e4950 legacy-trunk
+6675 c6259cf2c58143db6102305d5217de4acd751ef6 legacy-trunk
+6676 350d0de07739c37471fe929f96989391dab80b50 legacy-trunk
+6677 d1b4743a9a6053e98b405709bcaf98645e48f706 legacy-trunk
+6678 3126f8a146a66f4a76cb04d388de5f79b0bbaacc legacy-trunk
+6679 c7994008378d9de5a0bf04a376d349dea3ee1a52 legacy-trunk
+6680 42ec23c500186d5abe2dbcc261cb573d4558b22e legacy-trunk
+6681 63af2574f71f6c4172b67bd589bacb89cf46abf1 legacy-trunk
+6682 1c00640069f8a541456f31e9cb3fbb85d9362201 legacy-trunk
+6683 3fde9d2a39b0c9a211cbca84bf3846606692a3e1 legacy-trunk
+6684 60fc01d6f7270cc3368dbf1a61220feb5847a852 legacy-trunk
+6685 4a93cc7e7fb6f3e5b70ff088cd21fb483b1ee9bf legacy-trunk
+6686 d7018bc5584e0a9c887be109b0a4245591c6d572 legacy-trunk
+6687 e31b4defad5b45cdf4c600493d7067a02261a1e1 legacy-trunk
+6688 688d566cb15b079da9d9a67b6e0cbce567eec335 legacy-trunk
+6689 0410ed3808eeb8c2541aa955413387d60a714a9f legacy-trunk
+6690 0a5f01d4701c0993b292cd5a21c91b291843d620 legacy-trunk
+6691 c6679b1c6cfc1b4f5c46c5241a8362b44911b39b legacy-trunk
+6692 9e0e8417a98aeadab9c2feb8686e42e3ec5ccf77 legacy-trunk
+6693 9bcfb034b963d2c7cb5213741f949ff3e4a44529 legacy-trunk
+6694 48b2d7a4531df8b82780f30c7856db263bef1399 legacy-trunk
+6695 66913ca7ec470aec9533ff2d169bd8b8f65a4228 legacy-trunk
+6696 1d1f0c647e77b120f4ff8cb2124ec99414b6e572 legacy-trunk
+6697 180c1d3dac41111f7339c9f0e2111893cf0bf5d7 legacy-trunk
+6698 3feecad296f40f4ed8d90044e86e40a9a13a5cbe legacy-trunk
+6699 b3ae0cf2a06d71324fa8998278740a18ebddec0c legacy-trunk
+6700 4facae00bdd61240642ee0edfbf1a8e8a86c23dc legacy-trunk
+6701 573ed5e3879b699998aed881142f4c34483b8fb9 legacy-trunk
+6702 84444ea3f5f69d60f6d847aaa964cfc62b24ccb7 legacy-trunk
+6703 1f692c3f1d32d439f292d20aa3efed665cf1a310 legacy-trunk
+6704 41a52ab263daa2507fe33151922ce9500108f5be legacy-trunk
+6705 5c387aa037087337fb229a7e54ab5c45b952bde5 legacy-trunk
+6706 886c0f775c976e2ccdb9ff46d74b66a59056cf91 legacy-trunk
+6707 1099159ec8219e0f96d568d202d1168d21bd58d0 legacy-trunk
+6708 7bf71a839661bc26006ac83038ed11d3620d0ee9 legacy-trunk
+6709 8f291dc8fa9b469e60f25617920be34246f1e68b legacy-trunk
+6710 780fc2b1674d772b889815f6cb72d3dbcb4f638c legacy-trunk
+6711 cb4900fab76428af8ae55e3199e9469525dec1c4 legacy-trunk
+6712 6c86d9136c090d4fd3453fe92260a3e12fe70f27 legacy-trunk
+6713 6700558a32fb133c9391d4079eaf19b7476e47d4 legacy-trunk
+6714 21e5b94b99b80bdf8e6ccecb22997fa3cc913c25 legacy-trunk
+6715 c62d32c5ff3decee3feaa54c62480e79510094e3 legacy-trunk
+6716 3545ab43a72a219f0fbce325e2df187767a3e2a8 legacy-trunk
+6717 1ce00cdc003d255e8b08b598bc7092b523cd0790 legacy-trunk
+6718 0fae353b04ca2d1a5341678a6edb19be2e2907c6 legacy-trunk
+6719 43e2e592a001985120da5089ede14a06fff208c3 legacy-trunk
+6720 c6ef8b7b26ebc120523f88105ce29335adf2256b legacy-trunk
+6721 da38cd6164127ccdba796094461a954e96b409b2 legacy-trunk
+6722 5f672a512dc41fdb807917612a1a8af039978e2a legacy-trunk
+6723 0cf671452fc543d426d53d6c83c437d3b49928fe legacy-trunk
+6724 4470f7ff0c239c894cb9b518812982f47bd0fd86 legacy-trunk
+6725 ac3fbb6771f5c2db39bb63a2b6a202961d7a1a72 legacy-trunk
+6726 6b6c5d12130cd990eda806560df6d4b4895ba635 legacy-trunk
+6727 02a0321f9468beac7addea966c5b0fee028cfc2a legacy-trunk
+6728 05ae572c1ac566c3e83509631e4cb07ced099f35 legacy-trunk
+6729 64704d36b1981e823fcf0fa5e88572fb06034099 legacy-trunk
+6730 e225e70fd6571fa647d43b0bc423cdacfe8de806 legacy-trunk
+6731 239b100811763d34198d10195dd9b134af0afebd legacy-trunk
+6732 b7e7eb5ef820aa87797a148905ad5c0e91fa331d legacy-trunk
+6733 dbb76095adee095990337bee6bd8dcbbaa77a934 legacy-trunk
+6734 516ddf50194d36806ee9fc9edfbb5ffaf15d5d35 legacy-trunk
+6735 544217d548a5f1d59496edd0294f55352730f1ac legacy-trunk
+6736 67d258edd3d99bcb6fa13ec886b4ee7c2386e970 legacy-trunk
+6737 7b54a3cedbe0c644c705cacb666f6f808eb7ba74 legacy-trunk
+6738 25301b9ea0ccde9d6f27a27bd7c902b4ecd854c4 legacy-trunk
+6739 8892da9554a5bd11fe8bc7d604e4fb267f7c847c legacy-trunk
+6740 f0e82129bd3ea3617a2f1f5a7616c92e474d83a8 legacy-trunk
+6741 6082501ecb2e586c20050bb393c4e65b0f1581e3 legacy-trunk
+6742 2e87b81176f9d325a569383304e3471e54ed9924 legacy-trunk
+6743 38c8a1ccc16c60e037ae8d0eab7c5de4fa7459d7 legacy-trunk
+6744 ef51e4a2e799449f3f5d9cdfbfa374659d5a9d48 legacy-trunk
+6745 65120e91b061ea7df1a6f681c367a484e0fdf8a4 legacy-trunk
+6746 e7890336f10704f3340b88a609d50cebc1b18c6a legacy-trunk
+6747 c48764bf62d1ed06a73c10f30dd64142ff718bfd legacy-trunk
+6748 3799b711631b25ec646ee87783c0b35da4c6255f legacy-trunk
+6749 cb841f1b022ea224cc7c6f5ccd966607afb655f1 legacy-trunk
+6750 ae178f15040300c690a56d2393a77a6650af8545 legacy-trunk
+6751 befdf0dc096b08eec52f3e8bf60bbbaf4dac52aa legacy-trunk
+6752 f6e824b2703235d8c359b32160092fd23d78b1f4 legacy-trunk
+6753 94b761fac4d7bb3c8acc3c9be9e10ee1cb80fc80 legacy-trunk
+6754 56909781a741b1050526b5226e2f64d9ddee493e legacy-trunk
+6755 4bdafa703a04b5c7b6be649d7e5ffe5ed4ae0551 legacy-trunk
+6756 daf12f64d5aa3d51852004e3b45901adeaa74794 legacy-trunk
+6757 839f72610ae1f8be1ba2e31723b367e877d3fb3f legacy-trunk
+6758 e21d3e7aea87196c431965ff33c12028e7238655 legacy-trunk
+6759 b69f4b83892e6885b6089dca0ce760ccf4b51686 legacy-trunk
+6760 db35d2b93eba0f9969f0b32a85f12ad18377beb4 legacy-trunk
+6761 f2f5cd7cb5b56b3a6eba33a23d508de145818f87 legacy-trunk
+6762 43ae045aa10e107c49b5ad50cb2a7c8d6d9ad99a legacy-trunk
+6763 0036dcf284023a9bd8632326fccc842a010ca181 legacy-trunk
+6764 9c6eab0cf542de1b1405c105ee3bbeaeb794d729 legacy-trunk
+6765 1427d61f1307299f8243a41c129a5bc659f6cce7 legacy-trunk
+6766 abd0b9ff67592d1047736a7eef5cd9ebc92ba6c7 legacy-trunk
+6767 69bbc21f55cf2e34e4738aa5324d2363700ec4df legacy-trunk
+6768 520ddcb3d5d68e27b0674128afa8651a88054447 legacy-trunk
+6769 008b9fc565bfdc27284aa6335530be0e2357fc53 legacy-trunk
+6770 75d75732a9e4be8d5b5b12c1928af8a3b1bc544c legacy-trunk
+6771 cf9a97bfc02339e03e4b4060b98e6f4d37e489e1 legacy-trunk
+6772 6f7090a826459d1b53dfbfdea1a7927248227eb0 legacy-trunk
+6773 eb1ed743972c426a8cdd3d803bf6cba70a628455 legacy-trunk
+6774 e05da8043b500b41534debc725e2fcdbc2b95ff6 legacy-trunk
+6775 8680631616658e5ed5ea43b72b952207a3a97ecf legacy-trunk
+6776 fc4f1289fe6cf6fd9456d146700fc24b2bd2e550 legacy-trunk
+6777 388f9c2220ce4f62c2a3a7c6c417738153903f68 legacy-trunk
+6778 95c31931b76af70837a3a414f18db40b00a1fcf5 legacy-trunk
+6779 7809b6b4ffd93538666b13f7f4349e048dbd88d2 legacy-trunk
+6780 e9f48d7e73b1cac9a3e15cd1cff0ace1b862d954 legacy-trunk
+6781 2eec35e2afff73f29e5d4efe948a83f71576a99c legacy-trunk
+6782 1a0f34c18163cc0495cbea13414474af6afec53e legacy-trunk
+6783 ecbeb445f62e506f8f754f13c364030f25e3f78a legacy-trunk
+6784 3f6d261654ca2e9db93915628ac4a143fbd2bf6b legacy-trunk
+6785 c97ffd2ebd5396410de9a73fa677a935ae361f6b legacy-trunk
+6786 937f69fd43fea5e78b16212b7942a98cbe70da23 legacy-trunk
+6787 9847de940790299fcecf2d1b901c6991590062dd legacy-trunk
+6788 3b3870b9acf2439767af855e299f9f904a00ccf8 legacy-trunk
+6789 46d736fb9da32282d528aaeca59b0e5d0e4d1213 legacy-trunk
+6790 772828c1b1f687419a5217acd155af1cf10fd4fd legacy-trunk
+6791 0f51f1d70d4526fcaa99eee63b63bce5047260c4 legacy-trunk
+6792 97d3652e57d35c23a1df2d5034d631436ffe7727 legacy-trunk
+6793 97133996e22f0f2a205a15c9da39a22cc4195acb legacy-trunk
+6794 d587196f9befa5ea6eeeea21a4c7f8c7c302aa13 legacy-trunk
+6795 9d4450350451f1ebde7d6b6c018cfb33805fe1de legacy-trunk
+6796 77397d51f89204deaae4d78a0e5ed1d4e7e86b53 legacy-trunk
+6797 314c13445a02df0014cf1d38b59a211c9399ece0 legacy-trunk
+6798 1afcd1cd333b57c3ff1047b9d57f1710c96cdf7f legacy-trunk
+6799 12c3865aeaa0363506994e4998b7658ff6c82c9c legacy-trunk
+6800 027ff1554e662bff2cb3db9a2d8d325bb080267e legacy-trunk
+6801 fb730fb13fab5cae67495f67c4c0023c99bf9402 legacy-trunk
+6802 b03ab35d52df977c9bd73aea2b54f20aff7a7439 legacy-trunk
+6803 a240be5be6b4c463a47215b894026becdc50b7e5 legacy-trunk
+6804 905f7b4b13238707fe7bb9559d0da1d16d25e704 legacy-trunk
+6805 c2eb38b674f30989248c654dad878f63509ed424 legacy-trunk
+6806 d04469d0256ce8ef1bb041aee64ccae0fc917962 legacy-trunk
+6807 ee20262173499c4e5c4f1255c18ecc91d16a2f4a legacy-trunk
+6808 f37cbfaa7328129a0d8df292482090d752d58db2 legacy-trunk
+6809 366d72f12794c56957bc75e438c9f725ac3d1545 legacy-trunk
+6810 4dbfd4dfe281c912552cb3ae73df040998ec8d5d legacy-trunk
+6811 376822c65810843ef8612ddd23bc0624c5223268 legacy-trunk
+6812 af1684fc9c6324d8d241e22b781be66faa943c2f legacy-trunk
+6813 e7ba092c3cf3c7153b5d9b42d7a237b1e4faefac legacy-trunk
+6814 2df62db366b768302ab34487d2b463d8f16f065b legacy-trunk
+6815 5a75512360635ae3367190fe0eddeea434bfc438 legacy-trunk
+6816 897297abe5b405c162b1d18e3afa6e2c23c591ad legacy-trunk
+6817 4bbde804b69784b4b0f0c58c705053fd8613d603 legacy-trunk
+6818 5cbdba4d2e1525d9420aea979a134cf0ac08725d legacy-trunk
+6819 4fb884bf147cc1c1b63c550d50ba9edc2827a4c9 legacy-trunk
+6820 7b600e73fd2a8a0ffd1828093f6b4ca9a04133ac legacy-trunk
+6821 a5c29accc438e80be201481025adfc0c09a470a1 legacy-trunk
+6822 852ca23c80cce00f512a797378f1bd5bfdf5a06f legacy-trunk
+6823 983df436459570fd8561baef76a0aa2586455bc4 legacy-trunk
+6824 a2099194628503abe76d70c47ba230958bc066e5 legacy-trunk
+6825 02a24e48b376e56b49bce8ff198d732071ce07da legacy-trunk
+6826 6ec0caeaf8230d8efb6107b4c4bd805251dcd807 legacy-trunk
+6827 aac8a99a1f9c4fa305d0b2ce6340c116f24828da legacy-trunk
+6828 69250703953a2a71072f096bc862f965e9edf927 legacy-trunk
+6829 eb455d99ba98226fb8ac4dad0ab3fbd9cffa29fa legacy-trunk
+6830 95ff89d83d6397a84ed81c102500be3e9d4a56eb legacy-trunk
+6831 2913597443b900e00b5e15910df47625801d3331 legacy-trunk
+6832 0212b480944bc20397d689d981885c215010e210 legacy-trunk
+6833 4e00e5daa6128d28b0752fca128e393eda31eb4b legacy-trunk
+6834 dbf2737d2c81ca3e3cf39db348ad386478a8d0ae legacy-trunk
+6835 af754961acc524c9100503d9b73e70a426ab45d4 legacy-trunk
+6836 383611bda9e6dee89abda55418b6352f0a933e12 legacy-trunk
+6837 7b1f6e5e9294630c4b0c4bd2683a551171327eb9 legacy-trunk
+6838 34182a6408e04f95b01d2b2b9f8b2f0aacf95a5b legacy-trunk
+6839 913fc9ff43ac121a97209a8c6420de0c28ebb970 legacy-trunk
+6840 3eb74df672a3997301eafb0162314d81c253acab legacy-trunk
+6841 315a79199fc8ed7cfd9ac4ae91f1acac9fa389ec legacy-trunk
+6842 a05f8d8c6768f81cf225b30e2d2aa034c5287e3d legacy-trunk
+6843 3e77d6637a2b90d32a69740ed092172823f2f26f legacy-trunk
+6844 a70692a6d8ccf5880f2e846c91a9361f1dcc920a legacy-trunk
+6845 c277ee8c669cdb820a9d3bbe23d6035d526dfaeb legacy-trunk
+6846 cbd434b46c1a63f3224f8a8132a0cabfa907d6c5 legacy-trunk
+6847 98ea80051dbc91d09702b5dc24b23700485c7023 legacy-trunk
+6848 46140f5856d90a0ea846ce98e1a7bfe200a1a7b0 legacy-trunk
+6849 31c7d8f45aeb08557883bfe7cf671905d0d2a504 legacy-trunk
+6850 d4f64fc42d8449054f3317ed7492069a34463f5a legacy-trunk
+6851 5f8a653b1779a50de7ecccec048d919b6a481791 legacy-trunk
+6852 96699af481ba9e982d41afdaeb41bafcacc2f5d1 legacy-trunk
+6853 3061676a659ae3e8e796a08970ad9bdebd261359 legacy-trunk
+6854 af1bf0f6e2db1100f4fa2e29a10f61e7988a2448 legacy-trunk
+6855 798732e69b3ba1a624d8cb997d8b6e222c61ee47 legacy-trunk
+6856 ad41decc5fa93f9c88b5a8e69bce284328b805a4 legacy-trunk
+6857 e033c786f2971c764749f9f395240c0e5c38cb1f legacy-trunk
+6858 0de9c554ba00c0d6ef5da358104d11cc6fbf1745 legacy-trunk
+6859 70cc238d563e622792de7ff8281c362fe431f100 legacy-trunk
+6860 3c7efeb607a070cb44592ac99cf2ff7acb3c7c41 legacy-trunk
+6861 2e272bf5a43e8447be08b5e6bb70aedf12b8bbaa legacy-trunk
+6862 a77f4c22697ff9aef7f57b7cb54cb00ffa2d9464 legacy-trunk
+6863 adbe63317ccb3dcc67a4f5b452f6b57c46efbf78 legacy-trunk
+6864 77954fe4376cb491e27b5a4843a5f5006a82229b legacy-trunk
+6865 62b65be2b77f1b1a9d7176a2b5ee6b32450ad7fb legacy-trunk
+6866 72a0cfda20044745908cd8d519a6513d85479081 legacy-trunk
+6867 7980863234645c858b753feaf05231e896a15722 legacy-trunk
+6868 5c86f60539f7427e0ad13cf041ca0614e87bbf29 legacy-trunk
+6869 48d1f5beb16ba649ad42d6ea12c47ab88e578604 legacy-trunk
+6870 d58a84915fade19ae2d82f0d8a59161b4493b127 legacy-trunk
+6871 890434d5bec2f9c39aa6ea6d1116e441820df0b4 legacy-trunk
+6872 ec4c42bea69d6cfb139c4c44dce118be8b9da50d legacy-trunk
+6873 fdd129f0574edcc617b9ea006ec6597ffb1aa4b3 legacy-trunk
+6874 091775a5e19b35e94451b0471761be634e7b197a legacy-trunk
+6875 d16b8621a3f0eada3904b06c5d637a99e0be5a97 legacy-trunk
+6876 1d275cd42c9b187c6329ac8ad225b6f712b8f781 legacy-trunk
+6877 3b3f7c3f6da2f8f0d5e84eb6f61745bd673ee8db legacy-trunk
+6878 1e2d280606d1eff8d233d738fa98f75bc0586a89 legacy-trunk
+6879 e528c0ace4e5da9d21cc3e287a534b285d150ca7 legacy-trunk
+6880 6f032ea26642f6dce00cefae6178d502fbca271e legacy-trunk
+6881 7ddd8b3f6802f0e2e9339e786f8984541a2bed18 legacy-trunk
+6882 6c771ea38eee8729a131ecc496277f6f0a5d83a8 legacy-trunk
+6883 a98011f0f9ca5b4ab1b3ce8d1b815d6d21669d79 legacy-trunk
+6884 4cef23e1dcca87ff18708d7bd57f690f98337b65 legacy-trunk
+6885 d738490c8da193c2fcec0c185a84ce4b5351abf9 legacy-trunk
+6886 ac3324e638e96c2438e155a2869c4fa6cfe10fde legacy-trunk
+6887 77d3d3013692fdc3b44410b1a3960d194007b139 legacy-trunk
+6888 02a68d623805c01215e151927e32c464b515825a legacy-trunk
+6889 3dbed0ff9cf2334d7627fb497de5c3fa7d4ef56f legacy-trunk
+6890 fce4f87e5974947b813e505205fddf2e87e765bc legacy-trunk
+6891 c1435c5da2817b306458eed20b278d99cc4dc02b legacy-trunk
+6892 f41ab713f7eabe9381b7af1076e93e4765202e65 legacy-trunk
+6893 2eacd2c8eabff43554670ea78e3839f79d6b9cee legacy-trunk
+6894 7ffff695f21da77194bc5f47f00168a2ed0c1dd1 legacy-trunk
+6895 93d05e1782164df7b0e7c2fbe64309adea26fefb legacy-trunk
+6896 dd5e9e85718659d65c41a185287d3acb133577cb legacy-trunk
+6897 ef7604c0787781b913e70e6fe0169b917680de0a legacy-trunk
+6898 4f6c56292d34f6bde58ced166c8947d13758c8ae legacy-trunk
+6899 5e038856fa56886fb6bf820ea0d26159860dd98c legacy-trunk
+6900 75abe737e70b61719d111f7097d3f4a5730c3d93 legacy-trunk
+6901 9c7ef030bec8011a3b24f61300e04af0e5673e80 legacy-trunk
+6902 938be7a3106f285bd72b50449f77d767f89a708e legacy-trunk
+6903 34eeb61f1028386d8a52403035beaabbd7874d17 legacy-trunk
+6904 92753207149044131ee2a76e177c5bd12527e876 legacy-trunk
+6905 f2f946bd7f47c5c9a635a968af465dc7908f1b28 legacy-trunk
+6906 1ccce5e4f806d549c1aa3fab9c48a708a4c49860 legacy-trunk
+6907 340adfaa98543f019eb0fee867ad9f2fff0d7fbb legacy-trunk
+6908 ac2a627ce3a7ef78037e93a3dd3897a9b2731681 legacy-trunk
+6909 25c53286763d0359eb32382f0dc40275b5fa19ed legacy-trunk
+6910 a362356312737b77c99b248079c850f6cef7c628 legacy-trunk
+6911 7de457bdc946679386614fe23bf22e885aaa60a0 legacy-trunk
+6912 e88b3215e94a59018b84f1a96577bfd31c971b57 legacy-trunk
+6913 fb1237bf7022bb7773978db3210a2aee98077a7c legacy-trunk
+6914 fce296dbb03e16998103b7a03ebf5229185240e5 legacy-trunk
+6915 78010ccb8a461881ebcb55436c83304fffa33c63 legacy-trunk
+6916 0549e3428d57835dd5acad7a90e7dc9af0f3ad12 legacy-trunk
+6917 1c27449130ba445c211019311b22938bc8152d10 legacy-trunk
+6918 fa9abf9a8624e6f6e745ae15ecf4377ec322b993 legacy-trunk
+6919 02b1f08e30a03cae94fbf72599cd627f725cc194 legacy-trunk
+6920 94521880871d162bdcf9fc35b89a04fd3edee74c legacy-trunk
+6921 1ba22f749489a4354a7bc36129d040432ffa13e3 legacy-trunk
+6922 85d38456adf09485b4042b00ab3f9a8ee7647cc0 legacy-trunk
+6923 1fb9a54e4a9c157bda4af35295782b0c341fb0bf legacy-trunk
+6924 91c696457fd4ed2cd314b0b6a0ef05038f28bc79 legacy-trunk
+6925 c6ffb4fc4da4066247321370577ffa1fcc32bd7f legacy-trunk
+6926 edab097882d80e41bd6b99468384a97cb6653f2a legacy-trunk
+6927 dcc4cf9fa62a86cb694d123552950d3c6f7bb5b6 legacy-trunk
+6928 4c16154fffb97b46f25dc520dcc47172aa824713 legacy-trunk
+6929 7eeefd3267d450a728970e1987f938c7b497d9a7 legacy-trunk
+6930 acb1988b8852fb8976a079f99f4eee1602490484 legacy-trunk
+6931 ab60c5585d1b005cdc54badfd6eb343f6d8f5886 legacy-trunk
+6932 d8759d0b5a67cbbd0a3c0ec6bba5e57bf9a64104 legacy-trunk
+6933 c91aacbf8ed46528940bb06e86cccd2ce9c014a1 legacy-trunk
+6934 5197e0f3f0ffced0c9ebb8664a23140998e7bdaa legacy-trunk
+6935 a8264d70f281c6098bf02b5c3d7315f9d15ab0ef legacy-trunk
+6936 6f89a44a861c7bd9a2a68262417548d5e18c2fda legacy-trunk
+6937 c6a4786e7f8ea8301bac14a7595bae8dfd4f7813 legacy-trunk
+6938 baabfb5d62a88ce41a4891feaadacafccea6c8e4 legacy-trunk
+6939 b51dc2fb48e1804add5799178f5b62c5dbd9753d legacy-trunk
+6940 8d056f53a7f6325a907ec35bcd6cfa5b43db3390 legacy-trunk
+6941 0d61f6c38b37e2578a49fa9767a43b544c0d9981 legacy-trunk
+6942 600f5b8a16cb1c475bdc29c538e8eefe53dfb7b1 legacy-trunk
+6943 5d7fa3f2cec3d56116b6a68a922c3b4244a54c71 legacy-trunk
+6944 d9c5155bda5002f2ce88c549e887397fcee89172 legacy-trunk
+6945 122c8fdfe4ef91aa75bdd0029d3a0b95cab5831b legacy-trunk
+6946 f634609f4028a5e2c791e0d23e7a97b444d1e2fa legacy-trunk
+6947 55fe64c21145cd89327391cea7e1ddec4756e968 legacy-trunk
+6948 4d6babf2e4e1913ad96ab8ddda2fb3ad525b5e67 legacy-trunk
+6949 fb2d1d5e141aa46cdbaca4580df95895320269d4 legacy-trunk
+6950 7e5f0395311059bd44f6e2e3cca0c23bd820fc4d legacy-trunk
+6951 2fdba12676139ef5fd1af64f78b1e60904a495a0 legacy-trunk
+6952 267ae58232d9a86a9eac5514332f09c9cfcb91d6 legacy-trunk
+6953 2343803318e4f6f563214a0c081f4862a69283b0 legacy-trunk
+6955 9e853a5f04ff9ec1922eaca700a4416c218492a6 legacy-trunk
+6956 dd709ed8226270defe01db9cfe973462ce23c3e0 legacy-trunk
+6957 324e1e36e652bc21a3584165e01a1fcfd99dbcf8 legacy-trunk
+6958 1fec88b22e87f824c441ec04adee2b5b0e9ebc0c legacy-trunk
+6959 a60d85237fdb81ea570d0873b18f1345c2cb176d legacy-trunk
+6960 d904f539ffd9ce8efee10b0127844baeeb3d3bc7 legacy-trunk
+6961 3d43510b5e19da5a6459c0d73aa635a0f5dfa343 legacy-trunk
+6962 e0c1bd0a74a912744ccfb625beb6312cdcde9e78 legacy-trunk
+6963 8ce18538e3bbfb1e42996136870c5232af951695 legacy-trunk
+6964 0e623e82301f1fb146f0533acbe7fe4e39643520 legacy-trunk
+6965 974dc36fecd62c16f6e2cec9e4c7109bc6ea1ceb legacy-trunk
+6966 6a75b3cf023cfc7ac3b1807e7131ff9da8470cbe legacy-trunk
+6967 ae75d4a1f5ddb35775c69fcbc00de7af53069a04 legacy-trunk
+6968 99e70c472a202da512664bf6c1990c8302721c55 legacy-trunk
+6969 a95549269de2b0302498f56eabc60eebacd157bd legacy-trunk
+6970 569e3af521875deff6746c3cc8bf152273e6bcba legacy-trunk
+6971 eae8ab3d24e030092e274e41dbbd817deb3dec18 legacy-trunk
+6972 93353e1d1c7604f075752457be31e262c23aa809 legacy-trunk
+6973 d80125d7dc734a1f9e1459eff8647ce80be5408c legacy-trunk
+6974 20fd966485108dc2e08a7c4e1e22c6773bb9181a legacy-trunk
+6975 4ba20f44654bbe7e0cc493869a21fe26913faec6 legacy-trunk
+6976 559aa47b2e2cfcfee64b18f9fc2c7959afe41e01 legacy-trunk
+6977 941b051af675e2b7ee76583838bb6c9430744b62 legacy-trunk
+6978 65d2d8e67da323b74b72e4d805536faa6fd24c1e legacy-trunk
+6979 858fb2e9bc1723c88b9ee7815b11856423bf8a4a legacy-trunk
+6979 db49494c93dc73de06d5721c74eab533a947a92c legacy-trunk
+6981 2b21ea2f39b44326cb20c15f908f03f7d0cfe811 legacy-trunk
+6982 18927abdc26281948bcb954642a6f8a745344ff0 legacy-trunk
+6983 7187c709ebfdea4147af9d2597077127e282c8dc legacy-trunk
+6984 9ca59424020e00f6bc6d11519776ec969107c730 legacy-trunk
+6985 11e0c22089997986d387f01a5e2e72d066875e95 legacy-trunk
+6986 df2c212e4ea3ebcabeef60eb8b4361aae7dbf16c legacy-trunk
+6987 23a104d3bcedc75cc777c4631e2ef4e27379ac8a legacy-trunk
+6988 847445aeab2d190a6c6b57266dfbcfda54147d07 legacy-trunk
+6989 f6976b9a85a43ef9b4785ae552231a1058b2e831 legacy-trunk
+6990 a75858fef5507ee7affb97c309e4cc91066e8bfb legacy-trunk
+6991 4a7c7dd7b1f056339361736bdb1050a5b08c80c2 legacy-trunk
+6992 a4d2aae757a8d5174a9f22f2d61a6b401068e52f legacy-trunk
+6993 691e392cad340bdbf899989c1108c3d8b5014a6a legacy-trunk
+6994 fd524a001ce9fee29f817cae57cb2692b5f2b1ce legacy-trunk
+6995 b4063c101c2cce324939f72ba329779811f563d0 legacy-trunk
+6996 97a61795a169aff7e1ea7acdfd8f08d3b1403886 legacy-trunk
+6997 d25a0ccbfd6b8a8a089a55a9d19927293aaea47a legacy-trunk
+6998 4d0681f7cf6b6b4b5e4f1199015b76dc2ade5015 legacy-trunk
+6999 d0c03c32e8d9430dfca470d23fdd7f765980f3da legacy-trunk
+7000 ffef2c30dc48fd07da82cca288ed657314f0f2b3 legacy-trunk
+7001 db55b80aaf10394a6e5898a8b4597a9a5b9dbf1c legacy-trunk
+7002 7894a0cd8c754b85c5d78fd188566c27a5772559 legacy-trunk
+7003 2824cbdbe12c5bd67a43afe8fe16be694c395c38 legacy-trunk
+7004 337562330fd0fd5903fd412eade098c372e1a6ff legacy-trunk
+7005 80bcb02ebf4ef0af548619c91812113a9fdf8929 legacy-trunk
+7006 9603a60c869be2922ee9840a48cdbef8bdf0c062 legacy-trunk
+7007 30ceca3f105b0da810543218d6aa7040342f90f6 legacy-trunk
+7008 62cef7e896b6ecab2704f329027d098d73c0d932 legacy-trunk
+7009 d90d7b541adab2f6da17dd680d258b7049c404dd legacy-trunk
+7010 9421d2f63077a952f666a0b00333c892681186e9 legacy-trunk
+7011 05750838f8403f88635ff77dcab844d923861e38 legacy-trunk
+7012 bf3768bd31f2c96d574a6575977da57469a85f57 legacy-trunk
+7013 65170da1d2ca5bc4b30cf69cfb1041c5b5232794 legacy-trunk
+7014 47e7c42b9dc6353fdfd883de6495eda74c0ee8ed legacy-trunk
+7015 1f4f1be8a339b8ce7ee517e08d0913182489b659 legacy-trunk
+7016 5748d5ee19ed3cc09945741c1e17c70ce9c0b7f7 legacy-trunk
+7017 652303ef926b1f62d2b5e80cebe40cb97ea0210d legacy-trunk
+7018 e52054440efc5b02fa9fd3460321430cbb5ae99a legacy-trunk
+7019 8d0b00ed8c2b56e67b3b8c81fe2a63e79acd6f88 legacy-trunk
+7020 820bf1ae7e2582dd5f254102572b1d0098ef8fcb legacy-trunk
+7021 cc6521a2ce21ee85ff61ff88581226927cf7df82 legacy-trunk
+7022 54c8008de87bbb53840f2a87c9eccd0c5764cffe legacy-trunk
+7023 bd551fbb9596587b97f16963553af332072b4d81 legacy-trunk
+7024 dbc98834eff2ea56894bc408b50ebe7c70f71640 legacy-trunk
+7025 f1244036ebab6e3711892c9c0e7b4e1633fd0f64 legacy-trunk
+7026 cea318bb9d2f4d8e47254eee9a43ad58d227e93a legacy-trunk
+7027 efb2938ce6763fcf156499d5a19d123860d4b16e legacy-trunk
+7028 8900213764ba19d23739de74a8d42ce31c8bef4d legacy-trunk
+7029 f031466530af67283084aec7007db0df569c538f legacy-trunk
+7030 0450742f36f4ffd10f9afd441b543feb43c93b19 legacy-trunk
+7031 b213d258ff327ded636dd90e1e4de449e7922fdc legacy-trunk
+7032 2c0c680407b2ec4c42b088c3cb489ea233fbb6f3 legacy-trunk
+7033 df9d1ebcf7f30ba181cebadf916dd016e6f94594 legacy-trunk
+7034 adbcc0ab9eb6af401a52bfd19208f77ddb29511a legacy-trunk
+7035 b217da3f9b54c636420e911514d095020bd52dcc legacy-trunk
+7036 c713de72e76ec4329a905dab425ab4f896093ae5 legacy-trunk
+7037 d030ea533e63afae870db428a7ea1545ff7cf877 legacy-trunk
+7038 ea458933fc2af6b39dd1df78447e1d9e75c4aa8a legacy-trunk
+7039 745c7c70be3108b1774f43d0b1a84a05a6c6bbc6 legacy-trunk
+7040 7f47e2b6c4a499f2b0d7987bd179fd0613ef029f legacy-trunk
+7041 6403c94de50dc3c1fe848999190033eb72117d6f legacy-trunk
+7042 a360dc1fa558297e7b26f26476234368129a3df0 legacy-trunk
+7043 4341574e163b3f4915265917e73d450cf7b747c5 legacy-trunk
+7044 e708f568b8b73d30f49cc615a35b0dd0fea5e407 legacy-trunk
+7045 7bb84a22054351e8323677fc6a61ddff26876ac8 legacy-trunk
+7046 a0ec8a9db96054c9eef6adac0d62b411340c6995 legacy-trunk
+7047 2626d06b3b01f7e16ec6b527cf189143715ae4f9 legacy-trunk
+7048 73758db2f464689475072079e55f5298d449aa4f legacy-trunk
+7049 8186039055eda3d3d9b3a375b3b033ac949d4672 legacy-trunk
+7050 aa96508a658790fb3a052d5a1ca6f036de99026d legacy-trunk
+7051 c3b0895c90fbf087d8693370cf07456bd4d05bec legacy-trunk
+7052 fae78cf8541d4bb7eca8dffd977fcc38f162c0a2 legacy-trunk
+7053 6f1a120ae9c061614a9edb29458ad33282c2a31c legacy-trunk
+7054 e3f71ce8e6bbb5f38e185697c6cf40418a4a5948 legacy-trunk
+7055 11bd4f497742d827b737c269b88b8ae4e335dfd9 legacy-trunk
+7056 c837f25c7e47747241c3da065b07139f8246b1a2 legacy-trunk
+7057 2f8d9c22de62e1718c08c18710b61c29e07b6adc legacy-trunk
+7058 4f644ecc5bac4aaa289233122d868017c11e2a41 legacy-trunk
+7059 3871ebd1963c7ad81b7e5e578b62ca2abae857a7 legacy-trunk
+7060 4a8165b3b6603d9b318a8ee16f7333d531589319 legacy-trunk
+7061 b3d2990d8a4afb68b029fcc6f9e2ec022484bee0 legacy-trunk
+7062 09d94e9eb1010019d1b3d27d5262c9c5f5680ec5 legacy-trunk
+7063 4dc67fdd9e0b5e0edc1352e5723e8c02d4ecf333 legacy-trunk
+7064 961bf9a200dd18448a1f9be228e550d023317a97 legacy-trunk
+7065 2124f4b97bdd2bb97ad5bf4984aafa50e73b27ab legacy-trunk
+7066 8cdd94a3d02d996cebee38c4d22e68eb66ac6b8d legacy-trunk
+7067 3bf9e2beaf8c019738f55c9aba60b35d7f8432b4 legacy-trunk
+7068 72d0dfb919fe28a22ee8a2d640c5caee9a108409 legacy-trunk
+7069 41857075d45bac8007c82a042a698865b3f68c06 legacy-trunk
+7070 f8f3da3fdaed582685bbd0860b217002e312b750 legacy-trunk
+7071 4fa19659591efa3ed8ce823867d89cead4bc0f85 legacy-trunk
+7072 e74b607a5996fa992213bb953dacb537749e186e legacy-trunk
+7073 8fdb0539cfb150a10747cd011b589d47f320110e legacy-trunk
+7074 b2a1c99ca642b993a8d3c51356c99928f364e81a legacy-trunk
+7075 d36250aefb8252674c2bfb20e367d80e80a68d61 legacy-trunk
+7076 7d56b496c7dc21cdd1d1796403d20dcabb303659 legacy-trunk
+7077 7c6802d8620f42e7a5261dbf0843830b53425953 legacy-trunk
+7078 5c741d2d97f5b1454947f8f949069f3efd064e02 legacy-trunk
+7079 2368353d9887530197e3aa2a32aae734a2a1cbd2 legacy-trunk
+7080 b98b46dd4367e279601978a1959b777e764c19c6 legacy-trunk
+7081 739b8480f1ac2706a6b2e25da80dfada08e37586 legacy-trunk
+7082 33a8e65eef2309000105457916427d85574b0da5 legacy-trunk
+7083 3ee87d082147c1643bbef043ae9c3c94e693c333 legacy-trunk
+7084 53ef5b51a48b4e0e702f6d2c4b8bb974fe4865ff legacy-trunk
+7085 bb4094ff7bdfed4ccc3c51d47f583bb52cd0a3c9 legacy-trunk
+7086 cbc669fe370ab05b5e46fa42ba1c2e9ea37bf0a7 legacy-trunk
+7087 4de05cbf5ad1987f7a3a422dd5128f518d1990c6 legacy-trunk
+7088 1321112e9e3a4ce83c41e356a68305a3f572adf2 legacy-trunk
+7089 683076432b7f9dae6da845cd35bea5d1054f6310 legacy-trunk
+7090 87617701d721e72d771bc2ee890bff0369b77ebd legacy-trunk
+7091 9cef969c45e45061b3b82350fd538998490ece85 legacy-trunk
+7092 87999dc4d7980019c2305a89a03a9ccb19ebd304 legacy-trunk
+7093 06c7c7de6976897b3d1a4cfbc137653caa34426a legacy-trunk
+7094 c3ca006554d444ac664921fc834681a6c7f029a8 legacy-trunk
+7095 98c08f0c4a2ed6bc9e253703d3dc5a7040a55dd4 legacy-trunk
+7096 a2f171ce25f8105feb06b4a48ffa6d18d41b5f89 legacy-trunk
+7097 68b28b8ca0770e4a56b2eab1626c8607510612a8 legacy-trunk
+7098 1fab981465c8bed4f434a29949135a3471735cc9 legacy-trunk
+7099 b11d96c8075c5742dcbf76d4647e4d395830449f legacy-trunk
+7100 202602faefc7832eebcd129212920c02270f0a98 legacy-trunk
+7101 94ce3e01c30cc300db87aba714adba4f1be8d3a5 legacy-trunk
+7102 6b765453b0410e11b2a75174f17fe50a37d5ee70 legacy-trunk
+7103 7df5d4cf82778a42768066d97c4330b747e44fcc legacy-trunk
+7104 ff26873268a842cdb6033262c28a18b64ffbc7c7 legacy-trunk
+7105 045ed830c035a0d53aedd97b5cbdb9d30214f486 legacy-trunk
+7106 2642ffcac2b4dcc0b114b4d8cfa736b3866eed0e legacy-trunk
+7107 c8d247ff8d2f83b4284bfc06eb834089d5c2e2fe legacy-trunk
+7108 3f10f998a5871dcc85e43d9d75cd169e87ebd9c8 legacy-trunk
+7109 9facbab152cdab0ecabb8182a4f15612439b14ed legacy-trunk
+7110 49745ddb4f698b5bf9e3b88402e255c8dc20d133 legacy-trunk
+7111 bd28945f752bb640c1630066de2cb449bd7951c1 legacy-trunk
+7112 f52c2aa061f8c613d5b79464f6bd2aef4cc6d59c legacy-trunk
+7113 5f7d246bbeb7b6eb0b29fe59778206d40c09981a legacy-trunk
+7114 97ec9dfbb2b6e4ae80e556447fd89110504f761b legacy-trunk
+7115 34db9a21bfb1d482caf196befea9467e877593c7 legacy-trunk
+7116 5f8f605af3384d53706b720ca26c048c77b46ff5 legacy-trunk
+7117 4359e8d389e6fd86c43ef7b1cc4f18bd778c2961 legacy-trunk
+7118 8d909ae1f09964ecb4bd871fae057568c6f416d4 legacy-trunk
+7119 f4ba9e07d9bf2f405e6e3f3b6e52fe8d956d0ca5 legacy-trunk
+7120 68c4b06cfff70956b44ba78529a55256692a642f legacy-trunk
+7121 f4a60f261fbb66e4537784819047aa4fbf25cddb legacy-trunk
+7122 ab6374268caa9246fd4c86e78809ab20bdbad234 legacy-trunk
+7123 6dd851445c7dc0b1c8bf9d0bbbcad1faec18f5fb legacy-trunk
+7124 dab01b84afe664d0d43b1ac14330f5d64a5d0fa3 legacy-trunk
+7125 2743759e39797fa7ab035b73b897f0c3c5b2fd11 legacy-trunk
+7126 6effd10e7233a6859c85d38e1e808b8be6bf7180 legacy-trunk
+7127 3d87cb1b3d17ad718a3f6ec938ed1652d0feec74 legacy-trunk
+7128 3b7cd83b602d6fd8380a145d5b117719baa7d08a legacy-trunk
+7129 df81856db58c5437d2769747dd94b51edf9ae7f7 legacy-trunk
+7130 c75a2f2dc220a577688e61b10d776145834e7d4d legacy-trunk
+7131 186c2ad4abf33c90f6e66f8c70b693e9dc759217 legacy-trunk
+7132 ddbcc038916b2cf53aaef36d2a3e6a9264b8ca11 legacy-trunk
+7133 0dddf49ea416f3bebc0608e493fa5b421c2e8869 legacy-trunk
+7134 e97528482bc6742990815295335883d4560f007a legacy-trunk
+7135 8fb572e1b1ba171e1743b15ce6bc094a7fe3b2eb legacy-trunk
+7136 d5023d0c5502373648ba5e84ee34eb5155f5cae5 legacy-trunk
+7137 22785108f1ea13d74f75693333b782fa09df5c20 legacy-trunk
+7138 4ee4b8bb67c744270ced44b5ba4f3af571c58b2f legacy-trunk
+7139 dcb2f5d34ae80263fe34188c2e3f9a661173e3e6 legacy-trunk
+7140 ed35067e3793e0fc3a805a317e26fd9b2425c030 legacy-trunk
+7141 29bc28eca3e9ed5553d49a57cd3c753eec496cea legacy-trunk
+7142 c42379e4653ba8cee921a3c479d4a5de6185c7f2 legacy-trunk
+7143 95204aa2f4522a5cc8cd78568171d9707957cb8d legacy-trunk
+7144 d501daf0a2f655ffdb29959954287403a6400702 legacy-trunk
+7145 7901fe79f6aa8a2492a061bf7cf5f243c60e5ef4 legacy-trunk
+7146 82df1040df0f8a6cc08147abb9f30f6078725844 legacy-trunk
+7147 5b53268f547a39db17769109a85035169435f9e4 legacy-trunk
+7148 a3cdc8164990e34e343b8ffa92016550dbc824f9 legacy-trunk
+7149 b43ff89fc50d95c227b56adc8983f4838c37d8cc legacy-trunk
+7150 0c01a23c7dcdbab8129723f87888cc7c7ba9ecf0 legacy-trunk
+7151 193950bc9d8f7f4a5f65f075afe081fd2c49bbfa legacy-trunk
+7152 b828eb50dbd50638e6fc2999ef6729e313d932f9 legacy-trunk
+7153 1592970c789b092c59da8ea082c4b7b9b883ea21 legacy-trunk
+7154 89b16126d4e22d1f126288fac434672310dda397 legacy-trunk
+7155 10c1b8f3902fcb28acef7bd8116bee670ffad822 legacy-trunk
+7156 f9c5a313afd932502fcd0cfde330a91c2d423f03 legacy-trunk
+7157 19c8e61cad2d835ae9e2fffb82aba35bd3d3531b legacy-trunk
+7158 31bd0ad0272d5a095458456fad533b5c96103805 legacy-trunk
+7159 d800841b57a8c7ef8908c51724e9d031fd42c524 legacy-trunk
+7160 d7d05e2344d736d896c999bce1893ae7645e0054 legacy-trunk
+7161 c046efaf1bd2c46e631886c5d0b3cf743fd1014b legacy-trunk
+7162 d122753e5b9f603c8626c363e6721f8c1cfa0016 legacy-trunk
+7163 01f4ea05a7663ec12b038218a640e0ef019ec076 legacy-trunk
+7164 8f50bec5068e6effc805c93ebcbda02888df7651 legacy-trunk
+7165 c2b831f923c2f03fd8d5b44e340a7d891e3be287 legacy-trunk
+7166 8015c554930984eab9f4d3ca132cd0bf93296007 legacy-trunk
+7167 cb405b9696d4836572f33c9bb87682c908642b53 legacy-trunk
+7168 faddf6d55af0a4d4020ff47b2fa65e2888c9d0c6 legacy-trunk
+7169 2c10395921e1d0bbb1b886fe95a332309645cd87 legacy-trunk
+7170 f12b1d4d6a9bb882f46e864297ec8cbd680a51ea legacy-trunk
+7171 de27da5f22f17535f7d68ce805ef4f85bb0ef649 legacy-trunk
+7172 1f368fb3e1f786b446d5f7c13f70f26fd51a81e5 legacy-trunk
+7173 ee98e44d4f8551d5e2c7a0ae813cfd4345d90260 legacy-trunk
+7174 a1694e95bcba7920e79f03977c8daf9817719cf2 legacy-trunk
+7175 825038d98ab622bd076952ac993e749f73545e9e legacy-trunk
+7176 8a75b8bf15218754fbca83c3079b7c02e17ad057 legacy-trunk
+7177 e5e58794040f45434019723ebbec5507489518d7 legacy-trunk
+7178 e0bb1dac2dbf55629754d87eafc559fa0b0aa1a7 legacy-trunk
+7179 6c0e35cf0f85bd623ae05f76e4e0d0777e94abf2 legacy-trunk
+7180 cc525182bbb1f36eec1c2091bdaa3cfc92112f5e legacy-trunk
+7181 9785114326ab75252d54ae2ce86a9083d457dcc2 legacy-trunk
+7182 2dd285794d674330836a59379e4deeb7b39e14da legacy-trunk
+7183 775a7d0c29609fafd851649865d7d715a3c742a6 legacy-trunk
+7184 438949bb450805063c2358d733f9c6a68a6de004 legacy-trunk
+7185 7b9a6166281a12c3ad3a27a9527e2a21dc00fcfc legacy-trunk
+7186 d9ff6f83a16ad0a1531b6310e3c68bb184de2717 legacy-trunk
+7187 0253ef267b68c6ca7888f5413c8b2a9bc5aca31f legacy-trunk
+7188 6ccf5dba8b0bb6b7727cd719ce906f4c99a77408 legacy-trunk
+7189 0c6c69b0d3e9c69fa4982d1fcafbaf2048f9a2d2 legacy-trunk
+7190 67759dfe6ee8c7da6f21fe60cdcc0d825b3adf25 legacy-trunk
+7191 a8a547490a127cded3f7d4124cd4d9358a2a0522 legacy-trunk
+7192 12154d09131674fe9deac79576f4993dce70ad26 legacy-trunk
+7193 1834654bebe3212e5684e9ae74b38ade5d057f87 legacy-trunk
+7194 76bb2099d61829f6870d4a257a245bfd5ec2f634 legacy-trunk
+7195 90857fb5739706e0c00a560b674d04de3297c1dd legacy-trunk
+7196 b2009ed152fa5b3bff754f54b8c1639e5fa677e2 legacy-trunk
+7197 c07e5c455576daad19a9db1a3fc8da21f179bcc8 legacy-trunk
+7198 43744be2433f58f03b7a3719a2a8f951dcfe37d3 legacy-trunk
+7199 de01c66f5fa58bf285d3e93f82043e754868a797 legacy-trunk
+7200 8669edb1d9c56587b5423b5f402f4fd80bae8ec2 legacy-trunk
+7201 f7a99161df92aa1aa49c39139828feb1e1f9be42 legacy-trunk
+7202 9ac9ea848d7da778cb21a7465c430d59ecd6f286 legacy-trunk
+7203 b218f294b726abc03239289ede04ba7dd51c9254 legacy-trunk
+7204 e27fa2a3f5265019209a0e3b9b3ce3748d73f4cc legacy-trunk
+7205 62cf7d589300ef9fc55a2cc2f3be72eb229f6cd4 legacy-trunk
+7206 07f0f21363e648219f8e26deb8cafc6774ea52cc legacy-trunk
+7207 d367014200bb5b80117abcf5b98e1e0c8c30ed3a legacy-trunk
+7208 3c7812bfa1a4aaab86760dbcdb0b7e2d806129a2 legacy-trunk
+7209 3db423515626c2fba7132a7045cc280efdc82128 legacy-trunk
+7210 4a3f45b3471ac54e5d5305c89681aa0bbf364723 legacy-trunk
+7211 94ad56ef5073359847e3662f68d8fb2e3d4634c2 legacy-trunk
+7212 426f87c465a0266f314544d24ab5e7d08de8cf79 legacy-trunk
+7213 8edb57c33487baed93b9057ed7ac8805321627fa legacy-trunk
+7214 b01682851a633677af7a8413cc8be4dae790e742 legacy-trunk
+7215 062e88608b5559e601cdcd1c4552833be26d9035 legacy-trunk
+7216 a4402008c569dd8ef788a56d9a8178ee316eba77 legacy-trunk
+7217 ed01ec43eb30ff43f8be67f87a68efa4bc1965d6 legacy-trunk
+7218 357d4544085a2a6d1d338bbf62ad8c05e8e7934c legacy-trunk
+7219 e0523f2d41639c904aa129a4eb8eab45263eecdf legacy-trunk
+7220 7acdf59f31c5ec1cffb7d8ce6cc6a1fb800f4d71 legacy-trunk
+7221 2cbde5fc4b19be1900911fd047dea466039a1632 legacy-trunk
+7222 5b05bcbd4542c6417db81db00a385d548770a5c9 legacy-trunk
+7223 ea1265f26b33274095dd2cc37f5d2964982aa794 legacy-trunk
+7224 ddea69f9071ba82d9b9894e9247571cafe6f6531 legacy-trunk
+7225 fffcc52cdc1e86fe3a9a3ff718b69f6bd1dacba7 legacy-trunk
+7226 7ab835f87f86d21cdbc7b740bf4fc62b70de6806 legacy-trunk
+7227 7367fb1071083ee336b0522f9ccb231ac8f659c4 legacy-trunk
+7228 7b1e784e20a0ecd50ef550d0d9e6187eb4786ebf legacy-trunk
+7229 30703a656d1345cdfff48cdac614890f2d81b8ef legacy-trunk
+7230 1de96c572b02bc4abe82d4a18d2d14ff1cc48735 legacy-trunk
+7231 301d7f6acf0a6d01ed865721de4f5c2f7404a9d2 legacy-trunk
+7232 e1f1725cae6da83001a3ba0a43309ca8d928f393 legacy-trunk
+7233 605fba02e19507762437a146f78916202ee28a44 legacy-trunk
+7234 3fc6042a2acb874a2ddd225557bd032607337b8d legacy-trunk
+7235 5b22e32eaa1764e3f691635ef532d437e1b80740 legacy-trunk
+7236 d7eea694cd3a04e6e650f0115c8c2bfdff45ac6d legacy-trunk
+7237 f926263fb654c29b878f9a82da8b8086412d914c legacy-trunk
+7238 38689aceae7b60c5b8ac6bfd40f47e3d3cff824a legacy-trunk
+7239 88714fbf9a0626aa60cd342da835d0bce77f1d9f legacy-trunk
+7240 f8b36c0ec114aeddb33d37b94cdd22e4e20265a8 legacy-trunk
+7241 9604d6784675c2dd8e502e4e1e4a001de8a234f3 legacy-trunk
+7242 63dae273b07d85931544d8f46dd1f5d18edaa2fa legacy-trunk
+7243 f7a61c6a65c3797471e6946cb1e2c65d29327424 legacy-trunk
+7244 eecbcc48b0e976c2bf6123c12fb6817eb88b4140 legacy-trunk
+7245 72108faa56bf14870d7a7e658d53f31a41652094 legacy-trunk
+7246 4710701690c1c6bdb434338476e142ddb045d1ed legacy-trunk
+7247 b85f10ae4857f1151cefcea53795cba041527533 legacy-trunk
+7248 d55f31338fdcf853cc825e51d8f9ef2676aec482 legacy-trunk
+7249 9e48abbee6c5c054191fb2032fa7d94a2f71e37f legacy-trunk
+7250 0d0c413b6f2539756886c05ee9ff56ae1021b866 legacy-trunk
+7251 4de8b86ba25591a40598addfe5d4361386703332 legacy-trunk
+7252 50d6dc458aa2fbbff6f2842dccc377821a4b8ffe legacy-trunk
+7253 1ccaa441d083f0042c181c0ff353a9f304225cac legacy-trunk
+7254 a571c7f089916dcbc75ca3a4d6539a819cd4907f legacy-trunk
+7255 abef5006f84bdc706b73326cc12d5baf3537efc6 legacy-trunk
+7256 7562a6df91fb4bebc645ada571e767ddfcb1b05e legacy-trunk
+7257 2426a220664b18b3de461318e1cd41021c5c8e78 legacy-trunk
+7258 feba6d58d20489f01638c1a5cde8768eed9998ec legacy-trunk
+7259 e43362910a5e3e3c7d559afb1962096a2eb73040 legacy-trunk
+7260 9fc380b1a445aa14a12f65db574274c0587b9ca2 legacy-trunk
+7261 0948f39ee960e47eb972d3fdd33ea8291d00a1f6 legacy-trunk
+7262 d7e6653d084f6fbc0e759142a7e22635102bb049 legacy-trunk
+7263 f2321e4230717e5c5977e89a2bdc7073cb474970 legacy-trunk
+7264 d45ba64b82fd6bef29434824c89eef91d0852dc4 legacy-trunk
+7265 f37582314123185a05d4e0a2b4f99dd3a73db7f0 legacy-trunk
+7266 a2fd80eed27fa172b61ff85f0ff212375463a546 legacy-trunk
+7267 0b6b1b882866b60a18acbcdee44529b4c5412696 legacy-trunk
+7268 aabf4a03a4b0bbf1bbaf4eda826cc3181e6a0338 legacy-trunk
+7269 80c0ca424510e79cc4626b28804edec7560b4572 legacy-trunk
+7270 b6520c45eb054e77053c4759eb9451aa3d98151f legacy-trunk
+7271 bf72a94ee96b9b3cccad05cacc37e0c52d5f5d1c legacy-trunk
+7272 52258b023aa31781bfe9bb231cb68eaf2aa39172 legacy-trunk
+7273 5db9ad60326dc8c1d9875c0c5a39b54f2eeaecc6 legacy-trunk
+7274 e72b2ed383a98b4fbc0fa0c62345df0f585a61d8 legacy-trunk
+7275 e2a7ff6f4188718f303cf6ee7f657bf934628e5e legacy-trunk
+7276 2d5ee374a73b85d733c2053b31f0cf38547966c0 legacy-trunk
+7277 867feda008407f0d717a473c5d97d15a297f15d7 legacy-trunk
+7278 9965df782afcf42ba7fcbe20075e5937ba10ddba legacy-trunk
+7279 a2c427f9db02b9bf1b9ad8094cfdc2becee626a9 legacy-trunk
+7280 c71ca15c8b555cd8f4c4f1db578d16c930960b06 legacy-trunk
+7281 a3c47725950544308bdf82c3bc34ad3af07942f7 legacy-trunk
+7282 8d2c8b0804017d4131657cf4f0bc8b0df280df4c legacy-trunk
+7283 09d6c5708999e63278512e48d20240bee1b78092 legacy-trunk
+7284 6f8b5c3cd6cb2e5f2a6fefaa19cac2e9858df8c4 legacy-trunk
+7285 2cb469a421a97837fd25fe87f45421e35b185d9b legacy-trunk
+7286 9ae3cccfa7cde129bda5930363362dc7172d23b2 legacy-trunk
+7287 db230fefa702398b6068b13892bd889996e41b4a legacy-trunk
+7288 b6fadf0231af9b2639f925e0042f5cf000778154 legacy-trunk
+7289 98213604f9414fd45cfae28d878be52d6fb370ab legacy-trunk
+7290 fb18ce8c0cf6abb063e4af43f270842659fa51a3 legacy-trunk
+7291 c44540d52d136991076aed08c802eaa697f9fe3b legacy-trunk
+7292 0f7515ebe3bf4ead2df09b3986a8b4fe1c97c08f legacy-trunk
+7293 67a5221a2f60f939cc3b4fcdaac3416df9255524 legacy-trunk
+7294 9bda38c67f4ec25c0ff5f218a77338fbd7817eb9 legacy-trunk
+7295 e72ac1dc614f2a0860428446115d392e6f87eea3 legacy-trunk
+7296 391f08a9746b96d2bf4055efc95e3bee5a2f9fbf legacy-trunk
+7297 44e86dadec944bc1498b3aaf89cc45c538ccc1c9 legacy-trunk
+7298 f42bca3d7be21d30c177bb91533751ae7b1b2193 legacy-trunk
+7299 8783cfdc7c6f993cba48116af85c32d83c03246a legacy-trunk
+7300 b8a97ad5f7ced3a5450743b110c9b48aebe08833 legacy-trunk
+7301 f3b92c95e85b3626a0eeb8c349fb024a06f36d1b legacy-trunk
+7302 be481f3ada0bdaa308c85582309ac5849cfaf3fe legacy-trunk
+7303 97ae8466d1c42074e219d5e3adc182f90e2771cc legacy-trunk
+7304 5a2e7252c8902d4d6d18664d640aa61ec6c187d8 legacy-trunk
+7305 4341ff5c697cfee2a5d03ae171f12b88e6ff23bf legacy-trunk
+7306 d87e87853958f3e9e93ef76758488b32b2badf59 legacy-trunk
+7307 50f4983b6b79d1922219389acbdf21e067d39c40 legacy-trunk
+7308 339d0c49f0b5738af4229366764b9cbd088728e1 legacy-trunk
+7309 c7e99ab627f3b7402969bb814c3302b53371f107 legacy-trunk
+7310 e05480db71ab1138de35b34cd2f8ed5d50b4df9f legacy-trunk
+7311 acb0501d93ef9d30bf053fd1a82be7f78f8f7aef legacy-trunk
+7312 9e1ac9ebe79f51dcd243b533fcd0cea6d90bf5c6 legacy-trunk
+7313 5c1951d573b1d9bf31ff3786001bcf7dfa7e6476 legacy-trunk
+7314 4567e158d20c51292b2cf87671af535d96b01fb5 legacy-trunk
+7315 35c643e9023e72dcddbef56a483ae1415364a951 legacy-trunk
+7316 a7b9c7c813376321a824211277159950253d4ca8 legacy-trunk
+7317 84679f7bbe6d5848a605c140bd8a00d0ab5aa5cc legacy-trunk
+7318 38ae2a0fc4f33c6e6ad0c7f06ffee8c09f2cf989 legacy-trunk
+7319 555f6e76d207dccd3dbbca495deefdc37afe6630 legacy-trunk
+7320 0bdd31538d8fd66670b1b87c270770e77216afdd legacy-trunk
+7321 972026d47274aea5ad6f3abe77d5324cb3dc24de legacy-trunk
+7322 d53812d68408c624fc882b7c96cb693005645aee legacy-trunk
+7323 52695efdf22c2a85e8b89a5804ec98accdb7858d legacy-trunk
+7324 0a49d192506dcba62f74213aa69e8e951bb61d68 legacy-trunk
+7325 0e1897a1f0d52cb09f9abe52985314d2920ed36c legacy-trunk
+7326 f808001a3e0137acbff12d8b54139112465ec397 legacy-trunk
+7327 29ced485aca098356a2bd37ae8da534138414c81 legacy-trunk
+7328 cf90745381bffd0a66335ec505612c5ac6aa0497 legacy-trunk
+7329 167ad394488ccab1a53eb8928248d84aa03fccc0 legacy-trunk
+7330 43ab0fefe4a156af7f44e2814616aedb475a38ff legacy-trunk
+7331 88dbfa2bb9dceffc0e38b4952415fa56f066c5be legacy-trunk
+7332 e0aaee7fd1fd454e6e460b26f25ee9eac389e679 legacy-trunk
+7333 198989ee36d56a5d3e55e581b8a337d27ba0bead legacy-trunk
+7334 ab461c762559a431bc4089f451dd4b507da74c65 legacy-trunk
+7335 5c6fbdc50e1d64398df90698f6314036bd782dec legacy-trunk
+7336 69ca5e3ccc6da825162c5ae9c370872c7e952a3a legacy-trunk
+7337 7d7319811ff0ae1371e1c0e7c692949ae0fb916e legacy-trunk
+7338 b1707bcdc26526cc759d5f067b0276eaf7a8dab7 legacy-trunk
+7339 a53908d09a04c0103021e3986e780146a53f3638 legacy-trunk
+7340 f5073e24147c078815f501f88ff41eb86dcb2e3f legacy-trunk
+7341 3960340a325208c4e5d790f12fc3d455dac83468 legacy-trunk
+7342 e3f2ab0b0aa16d200322f670b0e7777497da8e06 legacy-trunk
+7343 bf4db2a4bb54079ed07b0aa6f178eb874e501e57 legacy-trunk
+7344 0ea0fac68c1c9d8f76d5f7d7aec3f2f27e632ca8 legacy-trunk
+7345 68f4134869db03b77cad2fbccd063b0248689eb2 legacy-trunk
+7346 a7159ba0e45d1d74944661f8a3b889fab2d1ba63 legacy-trunk
+7347 da53e48efea860a2db33de3c5bacec2ae964622a legacy-trunk
+7348 32f6b0d3a66fbf088bcc6f3dae2846dc8a349c7f legacy-trunk
+7349 03bcdd22f6a4c2a27e7d7c84d1102063ddebe9d4 legacy-trunk
+7350 911040e1bb119184bb59342478f540284dd87cd0 legacy-trunk
+7351 0f10fa752ca9256f3c7bcf893770407e811a5d09 legacy-trunk
+7352 e57a8de5aeb39b301dccdd698d1bc5f56b4ad1ab legacy-trunk
+7353 a9e7e0ccaa4ac0c105f63d732786fe16ffc13488 legacy-trunk
+7354 4514023160b45d1e2cc0d5fd40a9f46b2b3eee01 legacy-trunk
+7355 9a7e9f10aed6208ebfd839899bf288d7df5864e9 legacy-trunk
+7356 2241d312658ae773d2466b992521a46338043642 legacy-trunk
+7357 8d17d552d0ec05dac6ad81ed6314332cd173fba3 legacy-trunk
+7358 e742b593c09263cdedbbca55ec786beb786a57f1 legacy-trunk
+7359 65cb261f7736c9a43df81dfc5f762f9d533e611d legacy-trunk
+7360 383c6486346f6633a8e29c855c1f39940c3f3723 legacy-trunk
+7361 21c41d3c26b6511a7239e6e8e47571657068b6f6 legacy-trunk
+7362 342d2eed573a578b2e6569a3edf1e25986dceb81 legacy-trunk
+7363 f1261186722cd209d4e5fb3bfcc806c92d2bcba8 legacy-trunk
+7364 9c6b5a65ce6300d8d0c6e9bf7a61902b731bbca9 legacy-trunk
+7365 8a68f81baad6b16911316adf390606b86eb44f6b legacy-trunk
+7366 d399a4537f6de0f204c9ca6ed3dfd4a7c3e8be66 legacy-trunk
+7367 1c089c5b66e990954ed57c9d7bc83a8448c0fd2d legacy-trunk
+7368 c2eac126e8ffc0878c6499f8f41ea3ba4f55273a legacy-trunk
+7369 f31f47ff1fdd3f49b271b8bd555bc1a314063d51 legacy-trunk
+7370 5568320da9b59aebfef29175e51ea987f30f8a1e legacy-trunk
+7371 50abb0850740469ed8bf2d103329f4caccde3938 legacy-trunk
+7372 90c21dde42843fb04c54d88f3295e97844c66678 legacy-trunk
+7373 4f87fd2d0562eab184a576848ebe40d502b31962 legacy-trunk
+7374 9eff7880e6844805b93b6088c25c3ce1c0d1207d legacy-trunk
+7375 37e97a3102411d20d172565b9c9b9fefad2136f1 legacy-trunk
+7376 770104c8f84a0afa30349924eb3a4740fe9b35c7 legacy-trunk
+7377 d46e478b5767c389f3e77433d66fac109b7b8732 legacy-trunk
+7378 6a629d278a18b922f2b38c6c315599a3fa58faa6 legacy-trunk
+7379 5dc20a9e05067ba170367e9803e39674b1c31ce4 legacy-trunk
+7380 32220c5728f51486e0d31996d6703402e7442e83 legacy-trunk
+7381 fce781b127b92f39d3f73e51ba38ba130a5974a6 legacy-trunk
+7382 fd3626511dadfccb4e53e674a0f38c5132f51426 legacy-trunk
+7383 cfa1282902dacda2eaaae8b3cdc04bfd975d56b7 legacy-trunk
+7384 0834aaddbf1fe44e213bb41626eda1f26f91a22c legacy-trunk
+7385 fcaf9d119abfdc090ef810648d8296093299981e legacy-trunk
+7386 21878c849626ae1b742f8aaf1aba32fa279a349a legacy-trunk
+7387 4b590f58c6a7a393f3a1d6ea19226eb8b5f9a93d legacy-trunk
+7388 9e2c3c6d4fa15c8fb84360b852ef3db7c23888fb legacy-trunk
+7389 250bddb2eccf2dbcd0451946815d8ee54d14f5b5 legacy-trunk
+7390 14ed909a9c809f7eabafb78f87ec7ed20152d02e legacy-trunk
+7391 079eb69471e58339c1ebacd0bc7a38fc636944c7 legacy-trunk
+7392 1bcd4972da7e86e44bd9a2e701b05afd3dce9f5e legacy-trunk
+7393 2a4d3d99b8a45a8c2c6f99bf52c152bb0669eab5 legacy-trunk
+7394 f8e5bc5351a973ae848530d5ac58a7039a9eaee8 legacy-trunk
+7395 e77585af2a2165582864ee8607bb720944a92975 legacy-trunk
+7396 558abac7598d290ee9d2debc012e8da8edf8076f legacy-trunk
+7397 2dec363456658322aa38f6ec18e6586f6406c95c legacy-trunk
+7398 ae573922fdcdaccb61bbe2a33426493a9ad4b36a legacy-trunk
+7399 f07e18db366c491c4ebde06ed0315830b43fb8bc legacy-trunk
+7400 507c460205264d58e3408ab1625787b929a63d02 legacy-trunk
+7401 7069a2bf5baf6a9a56a9a2e7e92cae0f9808026c legacy-trunk
+7402 040493de848d8dd7275d5858039740b3b19ea348 legacy-trunk
+7403 9be65e6c35c826d4f709ad7f6519b463133340c7 legacy-trunk
+7404 5126d4b819e9e19c5ab2543675b01d989d1acf81 legacy-trunk
+7405 536935c2940173d1bc442aead4a13a51b1b0b349 legacy-trunk
+7406 18023e7c3862fcc8c98dba632e85eb541da58b6b legacy-trunk
+7407 b378753825a091fecb94e4c87bfad00415b5393e legacy-trunk
+7408 b56bc25aec852ad29fdbf5176c78c9123a0c2814 legacy-trunk
+7409 6b61912d5f359b084179d5948312aa7a5f81dcf2 legacy-trunk
+7410 095c9ee23b576c0139185b5e1fc81553306044e6 legacy-trunk
+7411 7d0bfb4682f9af52050510ed800d1775cb4624b8 legacy-trunk
+7412 789de7c667129662f0ba4855fb4b0b0e07c8bed4 legacy-trunk
+7413 70db4be1dd4b25c125eb2e98ea578b72004d2dbb legacy-trunk
+7414 217cfb6199be119610c224ccb2a83c8aecf3632e legacy-trunk
+7415 5eed51750284163043be29779eaccb5901dffe79 legacy-trunk
+7416 33e33ba7f421ae7f96ac01034816101e0a855229 legacy-trunk
+7417 a520c684ce8dc00cb9311e301734921bf920854f legacy-trunk
+7418 57aed16e2165c8b2cf87516ecc1d6b5f0f6b130c legacy-trunk
+7419 528c319c6e7ff0df1b9173abc8889bbe603fdc87 legacy-trunk
+7420 6118ca51404d8602ff908bfe9dd3d2a162c86779 legacy-trunk
+7421 ba11b58b2b0a38c0c7e9d202478492976667defa legacy-trunk
+7422 78d880043129e0745f252e3455d9fb0b93f0349b legacy-trunk
+7423 5693434ea538c89fd535cb18de9965382bef43d5 legacy-trunk
+7424 ca9aa47411de4ba2909876161ab01728fd8697c1 legacy-trunk
+7425 19d819b16b8252a021293b3c4a3300ee6aa6167f legacy-trunk
+7426 da2abbf9387c61ebca15c9c8de58b02b32121cdb legacy-trunk
+7427 05fd432d9e2b68d8e92e3421347f06810573ba27 legacy-trunk
+7428 da4a497bea3a94839f885f33704ee784bfac0774 legacy-trunk
+7429 b1ecdb2da24005519e19699a4e23458a86a1c09f legacy-trunk
+7430 e6b797aaa69f7d205b50e84916c793a5a236fb1d legacy-trunk
+7431 73325019ad39ff5bf1de51c13cf3a1155b226945 legacy-trunk
+7432 9d58d0e9877e6e7af2a2b97b05eaf2132372d27e legacy-trunk
+7433 ce438d36d4fbf11d4d7f457aadcadadc47a465df legacy-trunk
+7434 89d07795fd694fe42527f2f6c4af0d72f2440fe1 legacy-trunk
+7435 38f9e46d2317b51073b65b76ebc8c5a713ddbf80 legacy-trunk
+7436 5e63322f4c0613b82d318409f8474a55742b2d28 legacy-trunk
+7437 765d962f444982566fae2c5a9e81907ef0119c27 legacy-trunk
+7438 5ded2bc1908b36571b128a4a99a946eb08dca82f legacy-trunk
+7439 6ce61f212c3e7f001f13f597adc6818cd998201f legacy-trunk
+7440 d84ca197868b35471c3a57bb12e63087783c202f legacy-trunk
+7441 9bbd57d3609fbb4133ca0b422051e7a8f3063ae1 legacy-trunk
+7442 3705f75a8355e236544dce70b6f34c42460ed968 legacy-trunk
+7443 3d32da37d627d8ba022160ab4b3841c731a1e5ad legacy-trunk
+7444 0f1ae62dd3b87e0a17180fdd3be04c00491ce359 legacy-trunk
+7445 805487d50620b4f546e1b8d1309757229f07ee19 legacy-trunk
+7446 8d8c76a1d2504062e1ff7219546e8e907d88053d legacy-trunk
+7447 6ece5cfb49ffdb3fdb43d377b7e4df9bcb9c033c legacy-trunk
+7448 7d73cdc011982a5e71ccdbc2e0dddfc22ae477d1 legacy-trunk
+7449 39745574bf07afc6f18b1e488f98ec8245b8609d legacy-trunk
+7450 b4a400b3595e24ce948c841bae28fdf1767fba03 legacy-trunk
+7451 2e2945d8163c67172838875f19237d013c3d0061 legacy-trunk
+7452 9b1694390820dd0442adcfe5dcbdfb068c738e59 legacy-trunk
+7453 47ee3b4e2d8033cacd99d63528b4d643c26a612d legacy-trunk
+7454 b864b414c457cd9e445605e5a08276f42f789b9c legacy-trunk
+7455 a8d7bfec7c92b7c18ac9ec86c8d2480d8a9bcdbd legacy-trunk
+7456 994376af9064d30f1e82fa99b114456c03e50977 legacy-trunk
+7457 b5e7fc8bf9196368dc30f27f2ce8487ba82eddd1 legacy-trunk
+7458 66cbb37b4c0bd6005319481940f769a634038c1f legacy-trunk
+7459 77f9700768314027603a32cf090dedc14eceba62 legacy-trunk
+7460 4309bc97ecc6a8769e8a6ddc0aac639a17529de6 legacy-trunk
+7461 d8d563baf8747867c07049cea1d073b3d40a5a41 legacy-trunk
+7462 1ded9438fa515d7738a002cc0a02f73d73098971 legacy-trunk
+7463 df385cc0d2e3870efd862d7d7f49f573a27b72f4 legacy-trunk
+7464 65148ded51084dafd6cbd43bb50360004ef516e9 legacy-trunk
+7465 6e17ef5a26c8944a84b3e36ac04888fcb8d2ba78 legacy-trunk
+7466 8276916e1ea8dcde5587c388a5c83c35bb76cfbb legacy-trunk
+7467 11bacb8d731ad6caddcd0d89c5e01d0b59e36da1 legacy-trunk
+7468 b82d847b3dcbccd63de075e3879a9369dfb34e0d legacy-trunk
+7469 9bc652e9f2b46d2928b03003f08c75b881479057 legacy-trunk
+7470 267ed480ec1b84c1de07fa867f0db26b4c7152da legacy-trunk
+7471 8de1f6b07df9cd7dc0fc0b46e72d7dc0d06c3f06 legacy-trunk
+7472 58bbaf284ad66ef0ce7f4818d0405b30ab6ce8a8 legacy-trunk
+7473 cc4ba7214b18f997e99d0703100c8d14bc9e587e legacy-trunk
+7474 468124a1560a2d2eba3f44a605214ec3ae3deb4c legacy-trunk
+7475 7c7a186b6d86b2b2030507315dfe0994ee665b19 legacy-trunk
+7476 17c7a133ccf71125fd2458d4a4e567570c72b7ea legacy-trunk
+7477 ae3b46a737657b3f440ab756dcc165b70dbee8ee legacy-trunk
+7478 65aace2012e52c3f19491e89c1842290ddd1b1f1 legacy-trunk
+7479 4c8e4e9311e4e0e52e5092ecbad1ba264fa49ff5 legacy-trunk
+7480 f17bace48dd68a2c80f44c0115d3aba7d28ca097 legacy-trunk
+7481 5f4b23e3d97cb38d0a93dae418c88295435c5e6a legacy-trunk
+7482 e4f7c331bb1a2fff3e358fbe96fbb984e7e3fd4a legacy-trunk
+7483 f55e82e1e5658c0fe461f4837550c832174b2b0b legacy-trunk
+7484 402e36c83d202900a023e1605ebdadbda36b7e22 legacy-trunk
+7485 f0cf8d275fbc1751428d0a33ef1e36374891ba00 legacy-trunk
+7486 6840ff89d24a1f19fc328e51a01657cfe2cd9755 legacy-trunk
+7487 77f9c25e1f1fcacc93f2e63b0cbbc2b70a4765ff legacy-trunk
+7488 4ca4e54c9cd8376df1417ee29c63bfb79da25cf9 legacy-trunk
+7489 0bfac89afc83fd6b0a929b82b772b818522e244c legacy-trunk
+7490 b1e2eea66cb6cfdc2a5e6469e553147cd1ee4784 legacy-trunk
+7491 f1af097a5e5d790c2a6b06cad00064c4d2613e02 legacy-trunk
+7492 13d38eb7e225d18354ca4a67a84a880826a51168 legacy-trunk
+7493 001a5042b181a7dab54b6cd10ed1272bb62d6b70 legacy-trunk
+7494 28935609dfaea64aa06b96c5e604567902d744e0 legacy-trunk
+7495 0eca9d5f7b2d4b1a07cb6434525a8b9bc73dd5f8 legacy-trunk
+7496 c22add3643518f6c480a6f46716fda0d7e2b5c05 legacy-trunk
+7497 62645787fbc8d92cc29c2a77178c897aa3305c09 legacy-trunk
+7498 75c1ee882a4ad48ad6f45eb9682f47d021a060e6 legacy-trunk
+7499 7e51909996332dab07629e6280eeb01ed57dc828 legacy-trunk
+7500 bff8f5afc67fec641e8fe30f2f5e11775c88c95c legacy-trunk
+7501 b5a1bb2d17fad4361336f9594a7dc120ecd51e2d legacy-trunk
+7502 0ea4ea5b2eb73fea8eea28d105b6d82cd3eb6362 legacy-trunk
+7503 0677c77aa70df19eb496c31cc3deccb54d58370e legacy-trunk
+7504 3f037ee7731be323856ec467992ec15d897d1ba7 legacy-trunk
+7505 00c3cb107e5f278806c4d2c269ed887f310931b9 legacy-trunk
+7506 017d72544df2bec53fd99c240bafb5ebac6bb4ac legacy-trunk
+7507 be31e7e19241b1d5e5ecfd1a4f6411177a1be2ac legacy-trunk
+7508 5b7b703dabfa0783b91f014eb031c192ccdb9603 legacy-trunk
+7509 de2a75c7ea9ff467777b60f9d978b612407ef153 legacy-trunk
+7510 a0e62d85de77a150e2797b1dd8d82696863ff242 legacy-trunk
+7511 69765d6431e1c4a938abc13918314ced323a61fe legacy-trunk
+7512 9ad7b8c36c79405231d0abbf71cdf18221b77652 legacy-trunk
+7513 a820dead06e6762fc78b6b12b607a6381a1ee1b4 legacy-trunk
+7514 38032267968c0172ba6f94afa09e6c4a7422c00d legacy-trunk
+7515 876e57364c623995cfa5f45552060e492cf4476b legacy-trunk
+7516 c497929b237115a2c1d73e0625a367e337c14fc6 legacy-trunk
+7517 9b7e0cf519905ac49199811f12fe72ede1d4c0db legacy-trunk
+7518 104a646fc7a67f27df25d4e941b20035e5876f9f legacy-trunk
+7519 ee3ac9e0a03229862d19056a6743b1934a250b69 legacy-trunk
+7520 b1d82697c0b236674d0e61c0efcb0a911e9c72dd legacy-trunk
+7521 658815230546a4892c2ae519468edb48270878fe legacy-trunk
+7522 7a9cac7cb9109f473acddd1a9d23e268ad95e0cc legacy-trunk
+7523 fde73467b5847bf5d5224e6d8542323d9a68d765 legacy-trunk
+7524 946b2b2a7622fa17ad424828376a5e88a7a013af legacy-trunk
+7525 8579e3441d9bc9995d98e8bf24853fee55b75452 legacy-trunk
+7526 7f6d19fc5acacfc854a73bccdf2a289da6c1387d legacy-trunk
+7527 7841c48cdb5b4967dda63c00afaadf853c3a356e legacy-trunk
+7528 219bdd8afb38ef05ac417e728b59228c7445895a legacy-trunk
+7529 e9c442d0936fb5c3b922c7a5944c5e9ff6d9269a legacy-trunk
+7530 f57e181ff638fdb1c9a36967a30b4c8dcb197d48 legacy-trunk
+7531 e629c88f3dd80773bfec132d3176250fb8a168a2 legacy-trunk
+7532 6c7a76fd5dc1e9320e2176fd071795a419b0a939 legacy-trunk
+7533 371464f6666b66d7f1dd5f46dfa161913e47398e legacy-trunk
+7534 192d571cc4615ce684af41823afc1807c1579a89 legacy-trunk
+7535 5a232870cceab5f3c4f5c9b1e78ce15e1fb2ad81 legacy-trunk
+7536 346ff9ba9d363704cac0cca0c3c103b8671415cc legacy-trunk
+7537 d681631d992f201b441518af22c005454d6b60e5 legacy-trunk
+7538 f0731fa4447f5262f551783c6a8cdcad0489b03e legacy-trunk
+7539 7dded7851fca8c4b4667784aa97294a2975a0a6a legacy-trunk
+7540 b6fce7243ba0ba896f07822728c550206d72e9db legacy-trunk
+7541 77616b3001ef8f7e09c4639c36c284dd971dee3a legacy-trunk
+7542 4aaca42a2a16c95174b2fff7a5c3d6caef85b879 legacy-trunk
+7543 8ecf2d7c9fb1adb4385cf7d0fdaf44312bd1241b legacy-trunk
+7544 fa31476a2786ee8f54d0e5c09e5ed017feb116e7 legacy-trunk
+7545 eb12f4046d0be0f0df64f6f80c6be51021629310 legacy-trunk
+7546 44bdf0b56c0bd8341434ccf8b9a23708a22a0e1e legacy-trunk
+7547 d2483c27742c154cc4620df53e6899e9a17e7672 legacy-trunk
+7548 e21f1d2595de8b99b80adda6872edfdfce0844ca legacy-trunk
+7549 3273acbe476fdaa5fab89f6a223a92d1319fccfe legacy-trunk
+7550 5b9d41f4c08c115f83835ba18a17985d789a7cc4 legacy-trunk
+7551 4edab474974ce0776706472a23e79c3e94f4e43a legacy-trunk
+7552 23c4c7838ac2ab3a6675c1cacb71c00f12701a30 legacy-trunk
+7553 7f4b32e8654557252b67afe2dc9ebf31e14438b7 legacy-trunk
+7554 d6b292a33cfef53c75ea49fc27cbbd8c9953c045 legacy-trunk
+7555 9a8adaf58ce86076b689355cd0db50b72d6d1967 legacy-trunk
+7556 1b619b811c1035a81523b60b348d707587a477fa legacy-trunk
+7557 2c8812eea637941554a4b656d4a9e15acc02200b legacy-trunk
+7558 7ab1aa08d348db0cfa7a352dd9ea4359b38d1f11 legacy-trunk
+7559 afc3e4e08740b638acc54033a16a33bc156afa04 legacy-trunk
+7560 d3706579468e50d6a1a111257181f614512347c2 legacy-trunk
+7561 aa73da661cdffae09af933e2ec214734192c9042 legacy-trunk
+7562 6ed8eb4b664b31be18883ce35e132e316ced73fa legacy-trunk
+7563 e428d2cfed40b3a9cf699a61d0098980eea64d6c legacy-trunk
+7564 91f86306b07b85fabdf8f546ab8a825a9ea0e837 legacy-trunk
+7565 b67c02bd5e2360e4889936748de617b313b70201 legacy-trunk
+7566 3feec85bba9b6399f445ed523b3b57c404e1d2b8 legacy-trunk
+7567 cb7aadd9d9f292484aee4e064edf0ae179dadd81 legacy-trunk
+7568 d996dc42fe6415ad8209672a8c67346fc484b746 legacy-trunk
+7569 38adbb39f15cf57795908498f02ac4457ead0c78 legacy-trunk
+7570 11922a2ecacde4d818c4621a6e26831e38af38b8 legacy-trunk
+7571 30c10b22295318ea9e687bab5beb47f62ce41800 legacy-trunk
+7572 57b7a03a3252c0e53ba7df28b9f2426fb9206ffb legacy-trunk
+7573 a44586bd9fab3f7095a48370d916e7efbcbc2ab1 legacy-trunk
+7574 b4231d592281f25b0a591b6330b899379417ef46 legacy-trunk
+7575 32310251d7674086498e0b65cf8dc03da29961a0 legacy-trunk
+7576 2497c8b041017c96686ad1320bdb1e7942f9a050 legacy-trunk
+7577 ee70b4c718993b60fdab43d19e3815f75a58c90a legacy-trunk
+7578 492c0cae1f05229b116ba7bd10c92c6eb24f98d0 legacy-trunk
+7579 4109a171c901a41f8b391def3b01e42919891f1a legacy-trunk
+7580 00fd6857f76b939c5b9ea000d1cf83d6a3e61f50 legacy-trunk
+7581 940813115f775b86288cfcdb0807306d1e3a818c legacy-trunk
+7582 f9b46b5037519f44333742a17be74fe38624a131 legacy-trunk
+7583 a9a6d416b945b7989217bc8490d580ddb4349823 legacy-trunk
+7584 0bbf97861cd9a1604065001e1d22b62e6142b866 legacy-trunk
+7585 073f1b3ad9d2baf40b4cbf02b6d02581282adc97 legacy-trunk
+7586 21b871325c8534d1b287ba9077fc7664ec9fdec1 legacy-trunk
+7587 ca6388bcc05a5d928a6263772043ceae0ddadede legacy-trunk
+7588 fb8cefcefd81ea3690a013639ed1189f9406dd12 legacy-trunk
+7589 b9ce3cc5007671a8741ce65a346252291d133163 legacy-trunk
+7590 e3ab48988c779853c11b5dbeba9a887edc716ee4 legacy-trunk
+7591 506664767736efb4020e7cecdf6b2c976f2d18a9 legacy-trunk
+7592 2bb0bda1585c7fa549735a09e502d08de5aede32 legacy-trunk
+7593 002865af55e5b58c8c311f906a6fe40351045b53 legacy-trunk
+7594 bda01a37476225baf801cf08114753d580a814ef legacy-trunk
+7595 a48f3678f9e1a8de9394fdb30f426da2784016ee legacy-trunk
+7596 2e6eb1c715ce5ac1e794350f33bf7a125aabe725 legacy-trunk
+7597 57b0f1619e2824042a7c1a5f36768298e4b28f8c legacy-trunk
+7598 05fffd55b014c0150b02c9e105a118222b326eab legacy-trunk
+7599 171591b39f632ed0b45bbac16dcc89e10770727b legacy-trunk
+7600 54a9adca215c6e0b1a745bbca75d75bd3b102cac legacy-trunk
+7601 7b940f29621b85fb9bde5a7a5503ad3d6bbcfe25 legacy-trunk
+7602 f22213192531610c7a46b4763eac787d484d9069 legacy-trunk
+7603 bf1bd64f85e01f29eaa4ec27b547fafab57cc4c2 legacy-trunk
+7604 102e2912d0d1776a762f2fd3d8dd28ac49f8b203 legacy-trunk
+7605 0bf7394dba2205b015423217c65c0573c97def22 legacy-trunk
+7606 ec45276a6dadb9be13dbca5a520c3064dd9cb8aa legacy-trunk
+7607 0fc1dacdafd738bde37522f89ad8eefe9bb90646 legacy-trunk
+7608 666152b77027109f33c7028d385c7fa49b8c0f4c legacy-trunk
+7609 def03d3b8ddbf8bd21f92b1d8eb8239c73708f98 legacy-trunk
+7610 7fa9a644483e82e9b31deb57afb689c91b397926 legacy-trunk
+7611 a513d83c06cb001f0d3aff4fd5d967ac9f805fd6 legacy-trunk
+7612 40eb8b0ee19261b5c2c9224c550c1b212127e1e3 legacy-trunk
+7613 f93ec1ac17aa7190f6080b504098f00fa81fa24c legacy-trunk
+7614 9216f5c25e4ef78e6770bbecf861ccce6258d695 legacy-trunk
+7615 8fbed78e81e71212887b9ab779cbc0af41dd5f95 legacy-trunk
+7616 a4c8b88713761fd664b0cae67f865bed92e3794d legacy-trunk
+7617 8a9f157932382efff2ef73394537b6f44d208822 legacy-trunk
+7618 6952eb9c3a6f7f1599462beca735d5d01d5c303e legacy-trunk
+7619 6b337ec92bd0d0a56142e800979ddb0fc3bc6e72 legacy-trunk
+7620 1e95fac84ab32f6464bbc32cb5ed51ec2cfc673c legacy-trunk
+7621 9cefd04ee53a52b8f617ad7639b5c3077cc7b545 legacy-trunk
+7622 b227b9af5f53dba042fd435f747098d1d2f875e1 legacy-trunk
+7623 89edaa8ed50fe7c7c0e0a0f4bcfdb3a2565198cc legacy-trunk
+7624 78063bae3fd74bb4f63aca5ed2c6afe78da8a58d legacy-trunk
+7625 4665e2849a4ac7becdc994ce3cec83c24effd2f9 legacy-trunk
+7626 2826925a842e2986c8b1706b3dfbb63bea9f3807 legacy-trunk
+7627 bd708fe1934b3b8cb6a89a900c255f0f2cdd4d05 legacy-trunk
+7628 1ae7e2ebc2f331b289f97ed98da284b2635762c4 legacy-trunk
+7629 f6219d775481ba175016e7f3d1d353b4a6dc506a legacy-trunk
+7630 b566e77281cc14d5901de8f56bd0b58b34e64a59 legacy-trunk
+7631 417462ab8b0027fb0d44d123c452947744fc4c77 legacy-trunk
+7632 829c4289318104f0b8024c0eabb8a1c8c8a74d04 legacy-trunk
+7633 351e95c51ddb1acdf5115b9db73d0d60109e1e8c legacy-trunk
+7634 ef8351ea72c1c6323f231c0d08456e5dd428b606 legacy-trunk
+7635 dc33e11a1c28df5d6a33e282986036e06fd2804e legacy-trunk
+7636 5bb70d2e9adadd18eba1aaaae9fbff4573fd1a69 legacy-trunk
+7637 7124e4ee499557645b071b66760cd8503961bdd0 legacy-trunk
+7638 9063f60ea28d4192f99d7163da5c080db719eafd legacy-trunk
+7639 8c277f29b535e0b212529fd7109b9e4bb13bc744 legacy-trunk
+7640 4d15bdf1db9c0072735e568dd80ea173630a2776 legacy-trunk
+7641 7151bb7277767ed1e87d84b54bb8c87b66e17975 legacy-trunk
+7642 61f89beba1aa3c4bf0fdbf122914779ee8808048 legacy-trunk
+7643 dff3e506c9e8d41f6fe1decf4454d9b72e18e992 legacy-trunk
+7644 2ea9c425a7677f2296ac9f4662839a26e33d0104 legacy-trunk
+7645 f5d707ce4223c173edf8e78d3361f784fb95ad54 legacy-trunk
+7646 b1fc4eb2ac5a948fb19a889fc0d6e84669e9ea0b legacy-trunk
+7647 31b0e5f0badf196628724d6a0fb0d1f0853be1c5 legacy-trunk
+7648 ff4f8fa8a273a0290f2f8b1f94c09b4640851e21 legacy-trunk
+7649 c4e5ef9bc361246185630d2216ed25df26bcc1f6 legacy-trunk
+7650 197e3206e3f30747e5ac65d002d89b245ad1f8e6 legacy-trunk
+7651 2bd920e7e5c788585e239b47b208f4ef1720e94a legacy-trunk
+7652 b18e03ba48177f1fa436645c6cea0a4ad6f69461 legacy-trunk
+7653 f974364f3a87a17ea218c878d9c9b8c0a97bfe4d legacy-trunk
+7654 863ffc2ab76a99536f87c7ac5d1ffc02b982c935 legacy-trunk
+7655 6bc56259cc4cc27f79bf8ad7ca8d5a6525d5af0c legacy-trunk
+7656 8a0b80dc6e7114869372d1552bf7ac27b36d113f legacy-trunk
+7657 e0361d5421ff0b4514dd5577bcb0b488df8a3baf legacy-trunk
+7658 636757e812a4c4bfa4bdacad0a706adc6f3e3ba6 legacy-trunk
+7659 5cf83ad3251e5f5b1dff06b7b9789778ba0913e1 legacy-trunk
+7660 c1729e148916b3355b57440b61ae31d6cdd10e75 legacy-trunk
+7661 a16decbb9716585a58748b8d2a117bb2d77c5561 legacy-trunk
+7662 c1a1c306a429b5fcfb861dc6307edb8eb345599b legacy-trunk
+7663 3ec3d8807f9e889662d2150f7fae7e895390968e legacy-trunk
+7664 bab9196a8f30c62415769631a6322160ac4b6c28 legacy-trunk
+7665 a79ecd5af7e5b419b515b9e0407617acd5ad054a legacy-trunk
+7666 fa0fc288b2c90b9610eef6b46547f3344a90f70c legacy-trunk
+7667 b7ac7b46b10c0105b45b584b32ef7d2c4509a8cc legacy-trunk
+7668 f0fd12d76e078ff5bb3bf4a8a6f1794a069080d8 legacy-trunk
+7669 52f3dc41f6c4fcebbdf97eb5751b0fe801bad46e legacy-trunk
+7670 a874f5d3038edbd4f192a40c36fb43b6fff7a8af legacy-trunk
+7671 8ee81ef4e982f4dd68f081b56554198917013f8d legacy-trunk
+7672 74c12704a0bd0c49e871af04f8ea1b3c3643fe99 legacy-trunk
+7673 e0a605e66bedaad8f95af15ddb8dddf915a152f7 legacy-trunk
+7674 7e380df00d00fa1c38c0e62b92ca9c483ddb463e legacy-trunk
+7675 024e738674a5cda78f7bdd7b28ac75fd4a429f51 legacy-trunk
+7676 5878a5af3148d5bfafa0c2aafe68ad3f7cacdf49 legacy-trunk
+7677 af92d779152ac24ffbe7644aa123b900f12c1c15 legacy-trunk
+7678 05c7d8b4ffd6e4dd9b3d00c2637173186b7b8247 legacy-trunk
+7679 c248a07e534164b26080abb9e1069c66d06a8f81 legacy-trunk
+7680 b39203983de66111df93aacb29dcf6c4337445a0 legacy-trunk
+7681 bd5e2c2c1e0872b11a6c03e857f83b79d22f8ea1 legacy-trunk
+7682 00ebfa33cc07630eeda73a0d75d7f55750ba0fba legacy-trunk
+7683 93e87cac483e5bffd6738427c9b995bd0144374f legacy-trunk
+7684 2ec9c933afb8746a402439c3416b868c245e2d5c legacy-trunk
+7685 d4c6b4b0548c1b604380643eb778889c08e3c55e legacy-trunk
+7686 314d0d603f06ee4e27396f8bb4d89f44d9c42ba7 legacy-trunk
+7687 1f38d5fb3d23881c998e9f8ca180d9620be14a9f legacy-trunk
+7688 5b407e0cbc715ea6673101ace5e3e1543d769486 legacy-trunk
+7689 9c16bdf160ff68fbb6cd741f555b903ec08b3023 legacy-trunk
+7690 f70042c19c57a3b76ee8496cb491181df0838ea3 legacy-trunk
+7691 9bf650f23da57130b5b28cc167d021dbb61ecc72 legacy-trunk
+7692 3ab7d58c29631a6a95a0f1c63a9f6612bca2c0da legacy-trunk
+7693 f5bfb9c4c36413af42ba7dbf4088ff809139f842 legacy-trunk
+7694 334d52d6df5dab4d2e9b6de7496185e62589143d legacy-trunk
+7695 e1f613322b23c27f6960e01c4d008601472e6fc6 legacy-trunk
+7696 d9733b4f811f475a64b6083c7891f8741af0d6e4 legacy-trunk
+7697 4d8b7dd5de2a280af5244ef9a6f5f87e254cec1a legacy-trunk
+7698 bc8832b52b50b8cb196d28abbc96965b08156ed6 legacy-trunk
+7699 05774ec39ad205bdbdf475890955c2991f5de673 legacy-trunk
+7700 1b14c5c1be2a528572a26ef181162bbbb0fae700 legacy-trunk
+7701 84c93f6017194ea8500b72aa87dff1c83b3dfa5d legacy-trunk
+7702 97852f4ebde6b0441ead97fbd5dbe0c50b14a606 legacy-trunk
+7703 59e8a02a4774d86a55e3c40032dc40f581fd6090 legacy-trunk
+7704 74caddf4b28a4e284075df9f3a7c47b81f6e9443 legacy-trunk
+7705 0e60de2a42af750c5dcf80ca9550c575c70082d5 legacy-trunk
+7706 93344cbdf5422a368ade2bb18bd590d8496a191d legacy-trunk
+7707 0a5cea427a9fbbae03761cb89e2673000c30fec4 legacy-trunk
+7708 b749d2dd7582881e01acdca4f4f136e8e46bb9ef legacy-trunk
+7709 07ed52e200db69699562fff33581c0173a40eaac legacy-trunk
+7710 4f1fa7b69ba779336e99665daaa914f692e36b93 legacy-trunk
+7711 b4e671bc13311aa08d0eb1e389df87023554919a legacy-trunk
+7712 12373ba24e5d372c6a55cb8c5df8dda77aa7965f legacy-trunk
+7713 15288c8343a5a60886cec14e11c0b01d440a99e0 legacy-trunk
+7714 27635437fa7a2d7d04dce9993f7cefd55b1d92e3 legacy-trunk
+7715 a3233864ca385feee07cb7e4ccb9d39d596b4e80 legacy-trunk
+7716 b89f52821c52e88a569b605ea8cd9c0a25573a05 legacy-trunk
+7717 a50df7f3a10a33d2a79386d82e1d8a41dc2f746a legacy-trunk
+7718 4f251b8e328f5b5f9a77cc79177702a45d690333 legacy-trunk
+7719 247139d200e8c78cc1167dcd4fca15cba87f16af legacy-trunk
+7720 c5fd327057c6c354a7a26fadc3aaaf19bedda3af legacy-trunk
+7721 23330a1b9594d928f5e9e6c52c2cb678b247b72e legacy-trunk
+7722 6db8ade8d8a980d568c201f0b6903c12faf81bba legacy-trunk
+7723 a54720f8dd36cffbf9ed436882e95370adb4ccbd legacy-trunk
+7724 13005872d05346fb01c78d8f6051364e5881b48c legacy-trunk
+7725 52e3b63f2dca00ed637f38b49444e4384aac6d04 legacy-trunk
+7726 1bddba2f100e48da05cd52ab8272bb6a25cb5515 legacy-trunk
+7727 2fd9246b0ee821328da339d58ba156282e76a7e0 legacy-trunk
+7728 6fcf207498d8abe171f3806a502305adb266e063 legacy-trunk
+7729 fe1ccb4e4c1c732002762c2f46c0328b992ed3f7 legacy-trunk
+7730 d087cd060badda76e7ec5194a72d0cc943c61d3a legacy-trunk
+7731 71694a171324ff5e82b3cfd53e3bce2fc17b03d0 legacy-trunk
+7732 81283795f16a8a38e2861daa07e97f6524bd8024 legacy-trunk
+7733 40d2fd472284a4e4cf0ef60310f8f1dcc9b3197e legacy-trunk
+7734 71df21c0a34ed4bc44d7f394dc90697f1625832a legacy-trunk
+7735 1e5d6293c524e3e5b94247a428920095e9829253 legacy-trunk
+7736 72986b71682462a7f344ec1c89ac01a98633b267 legacy-trunk
+7737 5abc1a36beddc73962cc951b017d4bc192875d61 legacy-trunk
+7738 86d60c34ebde778578f1e35d1e947122a4524804 legacy-trunk
+7739 38878f1cd4f1fec9997b43b19f58873a3d3ca357 legacy-trunk
+7740 3c1788ab976106f3016077084c22321d9be704b7 legacy-trunk
+7741 1efc4273fdb7e3490f98d747a84b6e22f7f7df92 legacy-trunk
+7742 d41eee6d2ff7693baf4dc00f5d492afd861e4651 legacy-trunk
+7743 4f331f5bb5f2a4b9219949d7a6934cae5dbecbd6 legacy-trunk
+7744 4e53746e51af90a172be4716a30081ade8c94387 legacy-trunk
+7745 de9d0c5249b0e2a7d461ecfdf1fb35089dbed1e6 legacy-trunk
+7746 aff7063378a8a639c94d350644868c897e66946d legacy-trunk
+7747 b159f98cbfefbd6518441072c46292ad2794066d legacy-trunk
+7748 1148e7ebca354b23ef380cc9a22457fe5962a061 legacy-trunk
+7749 0d6e70a5ab4bd1d72affc30e6c11c84bebfb1a9d legacy-trunk
+7750 099dbc684c7be40cf69f96d28342b4b70d62714b legacy-trunk
+7751 b7cb6976893d85f8921cd2ec0e44067539c3af46 legacy-trunk
+7752 7df5a0d1f5230bdf1a34c0edc6045700ddf74edc legacy-trunk
+7753 01c3e64bc824aab0abd196e4fa41e611d38c799a legacy-trunk
+7754 16372a4c4c145c69cd51a870f8cb1ccfaf96dc3c legacy-trunk
+7755 e8f8cf358054ed6b6d89c48b36fc285e193f5e0c legacy-trunk
+7756 607fa32fc04a1da3cb9a0d2d075e53269f508dfb legacy-trunk
+7757 5250f409d5587231e2d86e697637b5deb4c9386b legacy-trunk
+7758 82a3fbda336350b3a4c35a617db895172842bac1 legacy-trunk
+7759 02b2edf55baf39df9465ad8c64bde710603bbf5d legacy-trunk
+7760 d2c995ec42901008dc1ef9d34c90ba06c744d636 legacy-trunk
+7761 fbeda6f46ebb38ab7ba5264cd4ad39886cd22c29 legacy-trunk
+7762 5af766a1b531250fb648878160858f89793de312 legacy-trunk
+7763 0f1711b7d367dffbb9c51428f44168aaa95944e9 legacy-trunk
+7764 47d3d396d4ef8a21a61d9c9d4eeedc83b1d0e42e legacy-trunk
+7765 d32b8f4d9d30920ce81c0ace1e127a40377cec45 legacy-trunk
+7766 a76a3a39f6bcfb77eec28ac0ae9f340bd371d40c legacy-trunk
+7767 ca568e5ebd19a38055fcce72c54ab8901f8d1fa1 legacy-trunk
+7768 b0d9de3786ec329c0d69c04d14b2656616bf1b43 legacy-trunk
+7769 57a2ed0630cd859e8a588ccabb57ada729489888 legacy-trunk
+7770 2f2760c3dd905d43fdd52c3638a04bc0c4feeb26 legacy-trunk
+7771 7aa4566014c6ac0492b98e9e2efdbed5392b363e legacy-trunk
+7772 7ec733f9c30574bed2bed84d81c95192a693a52e legacy-trunk
+7773 9a32bd8f4ac8a1ce50b068b51b197f40cb89e8bb legacy-trunk
+7774 b523e6e7ac612ade1e2210455b134d652d117399 legacy-trunk
+7775 e77942562dd38e535e66b8c9c5494d1654978534 legacy-trunk
+7776 fb8165304939345da3ee75ecdc9bdadef8849154 legacy-trunk
+7777 5e3bcf4ebf29f48cccca5c866c6582d4cbf56a3b legacy-trunk
+7778 964562bd75cc376fa9a32944b10de2010a73f9d3 legacy-trunk
+7779 4459172f40bb14489d3ae66fc891529cd3245d9b legacy-trunk
+7780 332fe02bf02dc47af903828c422b6325da9496d3 legacy-trunk
+7781 e614bcd34e34fc4f575ebe00a3e831c0a6733dcb legacy-trunk
+7782 c3ed299d593e6cf44fec3a0ec9611cfe3078ad10 legacy-trunk
+7783 df87d5d1bbdf17f973dc7dc84dbd30cd5666b4c8 legacy-trunk
+7784 e756b8e54c7c1c62ca6651af5e41074f58f317be legacy-trunk
+7785 192e2e0cbce50648d3269ec317a4967dbdd338c1 legacy-trunk
+7786 782597cf6151d9dea1f8b59492ce5ae3fb935be2 legacy-trunk
+7787 d0eb183092b0cdc68b5d015e5835e9820c891bd5 legacy-trunk
+7788 e8996884e8e17e6b7b40039287b36f0cd5fb9a0e legacy-trunk
+7789 8fc217d3326754597b16681d5d726eebed77e6a3 legacy-trunk
+7790 65c9e90d8142692df2b8892612d86ac3c536edbd legacy-trunk
+7791 c8e24c4b8bfbcca8399f61417d27aa3575576c64 legacy-trunk
+7792 c72c7e1930b3f2cb07fc4bac8bdcecaeda8863af legacy-trunk
+7793 2c4b802a3b5d8b55ee05d4b6ee1c5113cc541d2d legacy-trunk
+7794 74a1bc0998276e727f11bd41216c673ea5a0a570 legacy-trunk
+7795 c3ddb84a7761fde3c5541893a53389b3b0556c4c legacy-trunk
+7796 e2ac0982cc32f0cf116bc9d9b4b427582014b2e7 legacy-trunk
+7797 38818538b89c0ae870acce87005ce670c94472ac legacy-trunk
+7798 91f99181271855793a322bee71b67f4ba47b6047 legacy-trunk
+7799 489dca3b54ccb60fab614c94b6b0cccd711e56f3 legacy-trunk
+7800 3a07799deba1f6dcbcc3aa97d2decdd529dad012 legacy-trunk
+7801 b6893133940feeb13141542b1397be6b684c13f0 legacy-trunk
+7802 152b2827a1a0873a35b2bc42c3123a3347323c77 legacy-trunk
+7803 359e8f815a3acb492771579702e96ac5eaeb17fc legacy-trunk
+7804 43752e209473c38e1a84854a9d9b1a2f1fed585a legacy-trunk
+7805 5a22f9b38aac2268ab0868483a7f5d27794a9563 legacy-trunk
+7806 6232acba7eb20a0c757ffcb8243b37c5f621a926 legacy-trunk
+7807 8dfc252963c7199e3bba5896fa950fef243dacd7 legacy-trunk
+7808 627316c001fbd451773cc1b2b347b8f6b3fc533d legacy-trunk
+7809 d1ac51b870e218c0476623a1ec919fe8eeede9ef legacy-trunk
+7810 ee9275b0f5c80af9fecd7cd038321d92deb50fce legacy-trunk
+7811 746f687acfc1af5231d95f40f549b91f275b022b legacy-trunk
+7812 166c2232921abfce8baccd53bf7366861d901429 legacy-trunk
+7813 67995bc17f625bc0bcb632a387169158fc2e6e39 legacy-trunk
+7814 b0a3140cc9b1adb07bf23ababdc99155bd32df8b legacy-trunk
+7815 db673e98f28daeeb2f71213cacfec521487ae672 legacy-trunk
+7817 67e5237ce1418b387da223ee324516315d5215c8 legacy-trunk
+7819 67a0b5aaae433ba980efabbb75111b428241df31 legacy-trunk
+7820 4a541bb0c53433c7aa09b8cbb3b6555eb1623378 legacy-trunk
+7821 9ca27188da232322f67011b35c222a4f00e3e548 legacy-trunk
+7822 5b2ed6081eb94ae19f636d852c021732b7ae5635 legacy-trunk
+7823 339dcb9a282570c931fa65ec1ede15860f40e5a5 legacy-trunk
+7824 0061f4ea97be8ec3521dc9cd1463a6c501280961 legacy-trunk
+7825 ae02ed2aac3f6c6a511b523e18b50cf9f8f6bd11 legacy-trunk
+7826 6ab392d7a52fcd607374efcf2cfc6fd92fd99d34 legacy-trunk
+7827 688c3fd42ca62d56211106d15301e89b96cd1205 legacy-trunk
+7828 999c197da57cc16bf596f1ef702e0c2539b2580e legacy-trunk
+7829 d5757aad1a4fea778e24c1ba5675daefedc38729 legacy-trunk
+7830 d40cd910d684f0eb77be3e0756d4c4f4543ef57c legacy-trunk
+7831 2c0b10165f7eca4196ae144b1d683bd26c04f15e legacy-trunk
+7832 179168e17bfe25c57724d9e2dbe2032172809462 legacy-trunk
+7833 47362fd9071bc7909b701e9757841a3845efc13f legacy-trunk
+7834 bc2e3334048e13a1ac356f8808baf70aeff6e994 legacy-trunk
+7835 db40dba3f79a7d5303144806cc32a6b8a3cca815 legacy-trunk
+7836 edea4f1d63fd015543c1bc6cc4c551b598d3ef04 legacy-trunk
+7837 f858038b64c2606539c2fb8cb407249c73f9987a legacy-trunk
+7838 b1c2b79aa51f85c490d1125405feeb134008e450 legacy-trunk
+7839 61e41b2b1b69d488b0b8db42300a730afc1555c1 legacy-trunk
+7840 cc586bda6275525d6758e3318aca26c5ebf78c14 legacy-trunk
+7841 e4af414f5f893b5d8c6ae08ea011defbd95d1480 legacy-trunk
+7842 b7ca98c6dbbd68a7ba37c384f55176b77688ec19 legacy-trunk
+7843 87313333ae3fc373be4ec88160db3417d4ee0f1e legacy-trunk
+7844 8981533e6cc1a127aab803520e51409ab7021208 legacy-trunk
+7845 f2132d1f66a628f59c5efced8150e6a1a93995f2 legacy-trunk
+7846 3ca14503170cc9f9b92fc08758602bb27161fae9 legacy-trunk
+7847 1ea1f019268d9f27074579d715fcb2966166f80e legacy-trunk
+7848 493a34dca53edd725462998568a7525522d30db7 legacy-trunk
+7849 424922afc1bb40e9f520209f5b943d46a89310c8 legacy-trunk
+7850 5880384d7c7148b8c455101f74d8057a630a112b legacy-trunk
+7851 118beef918736d5f862da3092b1081f10bb875ab legacy-trunk
+7852 7f90a671cc1db8a8118faf6ba3c4bb946fd21278 legacy-trunk
+7853 9980faeeb7a513dd825322dc1cecdad8b4bc934f legacy-trunk
+7854 09597a423227ce3066ed273a6ffd61fae5bcf678 legacy-trunk
+7855 319e3eaecdf4fb7904c15a503298679807d25a0b legacy-trunk
+7856 1c9a84e0981d358ba9f0380c82e710677eb15643 legacy-trunk
+7857 2d4c6cba01bf005e4bfdc0be2a1caa3ec33be11e legacy-trunk
+7858 339d4129d3f7f15a489e16985eb010ef44304bfa legacy-trunk
+7859 3f558a32c49800035240ea9c390a7fd49cbcee4f legacy-trunk
+7860 3c5fcf8bf518961bc4ba85fb2e00e0cc8f9f0eea legacy-trunk
+7861 3714b325826d897cd16e7934f249a91950a312be legacy-trunk
+7862 10e7dba01d05121fda1ada54dafbf30f77dc6eb7 legacy-trunk
+7863 43c5e1f9154e6d7a9b32ebb6b34d978e360cd49b legacy-trunk
+7864 09c58b1749899102709fd1691e455d25ceb25a6f legacy-trunk
+7865 13a30cea8dbf7d285fc7ce1f3400fe48f705b0bb legacy-trunk
+7866 5a9706965a4ec3fc1390cbb6ebfb3f260a848091 legacy-trunk
+7867 b24e84a0f30b32acc341be5b3020ce83efa9a911 legacy-trunk
+7868 e92f182d77268c86b79492616708a73d371c9568 legacy-trunk
+7869 194d26df6c500cffd2fc19fb04507d41f18dab4e legacy-trunk
+7870 31e399636675fd41410c47520d975a375b0fa1e8 legacy-trunk
+7871 c2fb976beceb39dad20142c5ccedbe9a79cbc200 legacy-trunk
+7872 2c81d7d68ed3aad3c67e7759fd14a11d3943ae10 legacy-trunk
+7873 d1447950fa045652ff55be3a2ac275da070676c6 legacy-trunk
+7874 fd7eb058ce5db30418c51dfb46c4306ca3e21e09 legacy-trunk
+7875 72b231edfb2523955299a89824259403ff4531f5 legacy-trunk
+7876 0a599773a9cca4fedde7d043d7730965e1c42e96 legacy-trunk
+7877 7918e8739148a4c60ab65794b76ceaa88f6db9e9 legacy-trunk
+7878 487ad0327ae1828b27dfbfb3bbec75b7e414f0ce legacy-trunk
+7879 8f0a793bb0e269571c8bc0ea2ef3a6be177a5760 legacy-trunk
+7880 50a9c140946c489ff23a2db3e133c4419c4f6d8d legacy-trunk
+7881 3780cce14f7d02cddc1fcd1b9529768de17a63b5 legacy-trunk
+7882 b7871ca930ad5bc51a909ee75ec2e5da13e07f4d legacy-trunk
+7883 c2254754192c2eaf15dd2ae4025ef8e3373b7bb0 legacy-trunk
+7884 b7a23dbe0065ecf7f810b9740a738a5392bde18c legacy-trunk
+7885 648124a5880a33297a45ecb8841c47e087a36ad8 legacy-trunk
+7886 18d6a5abd3f8322736c5fc85114e0c02884a79f2 legacy-trunk
+7887 3b2fda31bf1ba8edc505770eafd9726d444b6ca4 legacy-trunk
+7888 6717073de5865a7061de0d03ed36bfdcd3d108fb legacy-trunk
+7889 78d398005bab02a54286f90bc9ff05bc324af7dc legacy-trunk
+7890 10267fdc753116c1d3e2598820335f0b78170f64 legacy-trunk
+7891 013ff6951909f0eb55b4e7719e395b0017d930c0 legacy-trunk
+7892 596380a567d22394ca01eff0905934c34b52cfed legacy-trunk
+7893 172254d41a51dafb746d2159698abd26f26bc225 legacy-trunk
+7894 abf33b882cfdce83874ca164303d3342bbfc90ae legacy-trunk
+7895 a1b63c73ad1dc514cb36c400caa26766459155c0 legacy-trunk
+7896 d9941a895c0209411564f2d4f04172feaeadb05e legacy-trunk
+7897 014ea9d72d03cfe4f978971b71e3d1542ed0034c legacy-trunk
+7898 dacbfaa07c407c26aab9842ce4f0ee1324b38ff6 legacy-trunk
+7899 37332b6f6280bed472bd29d939cfe5a5ca4a1b5a legacy-trunk
+7900 bccb8d7429647b941e5e7e6f87b5043698f5d3df legacy-trunk
+7901 638a99bc8f2ccf7b9ba40a249d062472e2af6b83 legacy-trunk
+7902 a7e309b174b2725ebd53298de9519a242818830d legacy-trunk
+7903 dab863b79debac3389eb4ec7e3329bcbc9e4d64f legacy-trunk
+7904 b0023335588cef7f97a92a729e09a4dad53dd793 legacy-trunk
+7905 5e2c17b374fb0eaa2701dff8a5197d23790eed13 legacy-trunk
+7906 ac235c9e6881f338ca609feca4804fe2d2d59cf2 legacy-trunk
+7907 2329ccf0e58111cf16891d56bad1be32331ab579 legacy-trunk
+7908 a56b44b3550572fd35299900748561e91fcc8530 legacy-trunk
+7909 cee4c45c568f760faba1969deffafb6dfc623874 legacy-trunk
+7910 ad4741d5431cc1bd0bced1cb31a0180a23646666 legacy-trunk
+7911 3d7890236a4e591b38c1338ef376824060d24bc1 legacy-trunk
+7912 591c6420f11d025dcd2c931b0be174e2592a378e legacy-trunk
+7913 cf818b70da3e65d641fbf9b249c205869ccea188 legacy-trunk
+7914 c2dae2b1a1235d1d22d5721dba215ca6748cbe3d legacy-trunk
+7915 e926c331ebbf1d317d7e71952cf0357110d5c122 legacy-trunk
+7916 1dae5b1c8dba12a538f6a80df0ebac1431971e1c legacy-trunk
+7917 9eaa2caed1c3b845a0f898f05e4d614228a6076a legacy-trunk
+7918 3c6db7165bc3d604dca4f869ffaf94deb96663f5 legacy-trunk
+7919 4579a7701949dabdc45ff9d04026f71435da88ea legacy-trunk
+7920 8868e9f13657d30c9c23710f2ea4a5dd0fd780e1 legacy-trunk
+7921 87c4f05a17e51fc60724a6e967c789964504dbcb legacy-trunk
+7922 8f3e1612360049e146b718407d784dce71b09d41 legacy-trunk
+7923 515ed73da5b14b7b5aee88a11969e5719492fa8d legacy-trunk
+7924 0b1e6950890736d24941301bcaea6a274bfabc00 legacy-trunk
+7925 e9f6158846b16b7c380833e45e9b834817a06f85 legacy-trunk
+7926 01f02bf2b44167b6846aa3433851a26abc0704cf legacy-trunk
+7927 4a80e6ca7cd35ef47e302e7a3c3268312f14fe96 legacy-trunk
+7928 5abdde99c9eadaa9d806bfae89e1bc39f68787a0 legacy-trunk
+7929 2a875199a71e86022a3ebc088a3fa8e3c1690b0b legacy-trunk
+7930 9c6c07d449df5403622949b7988c2a66db3cf4fd legacy-trunk
+7931 0f6c96f48e1ba476e56792683b79ee9a8258db7b legacy-trunk
+7932 663579a3c7feb540e7fac2044bc1109b4803014b legacy-trunk
+7933 7316eecb1e6b32e618cb3043f91ebab9ec35475b legacy-trunk
+7934 53440097111fef8e39e0e9e5c5f872107ea7d743 legacy-trunk
+7935 13052dc2d5f6e6e4b9246c12d0a3f3f371c38507 legacy-trunk
+7936 c5d7b6fcee03d225ecd37d4315f1ada2d7faabbd legacy-trunk
+7937 ad6c427dcbd9e4d574d9b080904e8964fe011bac legacy-trunk
+7938 0ded63bcf5de29edd969edf136c6afa05b7aa216 legacy-trunk
+7939 60f6649fd2310deba3c236dcc6ff3ebc87bfedd6 legacy-trunk
+7940 952851d9cce20f8dc1e3849ae0c94c34610dc932 legacy-trunk
+7941 b0584bf7b4f529962d493820613d28a524235e1c legacy-trunk
+7942 09e6b4e34523bae20e5826608a1338be03cfb802 legacy-trunk
+7943 43c86c8181d457661d580e9298a962ec3b89d71a legacy-trunk
+7944 64b693151956d21ad5a83f85a2d8fa2590132313 legacy-trunk
+7945 08e86d439281df056874e6badba0453ac7a0d73c legacy-trunk
+7946 47e81b2169e954ec25af4c517ab5d6e1b1df3827 legacy-trunk
+7947 d9029a4e0f2ac77c6fc8129191c60c5f30459a7b legacy-trunk
+7948 8e5d6d3103aef83e972fc2249b8238817b4fca97 legacy-trunk
+7949 84db154d5b93e8d0be05625580bebe81a2a6f599 legacy-trunk
+7950 c3d4bfb8ccdf01d6a35bd329cb4b47643b919e73 legacy-trunk
+7951 2666e904e40b0ccd48e92c2132667cc0a49e7ae7 legacy-trunk
+7952 a86ea2cceaecdd5b2e7568c751d6ecad185c329b legacy-trunk
+7952 062aed8a4ce2c91c81b80e29f02faff1cf5a761b legacy-trunk
+7954 f44a56e697fb17ce56b86cf419b6076c268cc346 legacy-trunk
+7955 266c9aa8c127761491be8881a031ed16d493ddee legacy-trunk
+7956 6d53ebaec021591b3350960b188a53b6d3fc4dc2 legacy-trunk
+7957 b96176c9a853b69d201f0b5020fa6839a4e50574 legacy-trunk
+7958 f1afc5690b2ab5f201e304f513df9994bb476825 legacy-trunk
+7959 6fa29756ec6a2942747ad8a538ad0dfd9ed25ea5 legacy-trunk
+7960 73509efa724bccecf98587846673b73c75012135 legacy-trunk
+7961 595a5fe140d40c276310ae5dea9035610db68bf3 legacy-trunk
+7962 478c68ea982751a252c26b8aa9ff17bda6a89420 legacy-trunk
+7963 195d5aa1951e03c239d8f4058e5e997fcdf977aa legacy-trunk
+7964 ed0394484082b62c904f6c6013a1ba31974ece25 legacy-trunk
+7965 2e89c55d9a295a2efbc478b30802f59d28ad0405 legacy-trunk
+7966 2d133280129f72c975e8332dd0871e652eff70c7 legacy-trunk
+7967 c1b40b0577d194f1e1aed330774c58601df4ad5e legacy-trunk
+7968 506ba7df42f04631b514b965d66f656a14e88b7b legacy-trunk
+7969 af1aea6b968fd6dacc1303a55fdb02da5e257e54 legacy-trunk
+7970 ef93d51dab362dd59bb535807c48760a688f3e26 legacy-trunk
+7971 bfd03154088b6ac110f0e0c6598fba8b3f28442d legacy-trunk
+7972 e652a793f4e712f457bf55618acbf6cfea525964 legacy-trunk
+7973 0b1946600bdded8f1d0c851aa09e4cab4c897b9c legacy-trunk
+7974 377f8695a9fbb201d067f337a0cd934aee8be067 legacy-trunk
+7975 9a12259239181f8a3428acaeea2dc6f2c466915f legacy-trunk
+7976 b905372edd4fb47a7e08727b6d96c0c4da0041a6 legacy-trunk
+7977 821912fd965a1d0a4a6ed095af4a05887b614516 legacy-trunk
+7978 4660ffb9e483c75879e345c1955ba74f8fc73c76 legacy-trunk
+7979 50581666c854fb1090681f1f49643976c45af7f9 legacy-trunk
+7980 ba005e4db4c53436f23706a82b698b1a485c41ab legacy-trunk
+7981 c88b9b868995314738a114b60ca504a930fc3716 legacy-trunk
+7982 47fa008779242a278ac2d4758e49744397d892ce legacy-trunk
+7983 59438d19d603675ff7508cecfdda8367844ddbb0 legacy-trunk
+7984 56b43a40a5285571752235c87bbd7f105e7c2e2c legacy-trunk
+7985 3643f19d5ca1a40069f338c83bac94acc661aa88 legacy-trunk
+7986 ddedfa55684a60a11c359fcb2282d387edcbf58c legacy-trunk
+7987 7290a930b4c957c5b5641999f7d7e10e5180770e legacy-trunk
+7988 fb39d288664b539eb4fa0d114f8f152730d2454c legacy-trunk
+7989 149d742b0971ce1c5c1848549d779afe802b6a9f legacy-trunk
+7990 4dd5095c3b67e9f77d89cca602e1c3a999238dac legacy-trunk
+7991 64e2fd8f1d68490dfb54ca1a976aece8c573b1de legacy-trunk
+7992 064c86719ca7bdfc617bccf7320ca062b907ae3e legacy-trunk
+7993 2456d8ff9fa823e26468e0bb352fb172704f4782 legacy-trunk
+7994 ca123f240ba9c3680ba489f671fd83cdb9d38aee legacy-trunk
+7995 576b7d927afb909c8d4b32cfa900b98564d579ec legacy-trunk
+7996 13815273e171bba1354f3363d8551c82d61e3220 legacy-trunk
+7997 31d66194a77c9ffcb8466809ea6f9ac82d7709e4 legacy-trunk
+7998 8803bf404b694665560c157ceba1c52ca55f9584 legacy-trunk
+7999 986c308765ae967aad75f8502107cf523a1583ff legacy-trunk
+8000 0ba9f914a708876ee02e113104df0fd870a81ae0 legacy-trunk
+8001 9a237a4cf3a1f6f876d6509fa7a44eec6c688dfb legacy-trunk
+8002 8582f74a1d235d3d3376a02bdaebe45ed0b37aa6 legacy-trunk
+8003 bc9d54523862802b7e9915b8fb3c063616499ebd legacy-trunk
+8004 26eff69ed5523cba47f782b8a71fd2198c79cdce legacy-trunk
+8005 3258463f1ca275e266b9d674b1494162e156aa6e legacy-trunk
+8006 f5decc5d7073ef9f2598d2869e23452dfbf80a36 legacy-trunk
+8006 c9498ac988372575cf7028b86395b900c9b0a840 legacy-trunk
+8008 5454fe4925d36565b2b68bf42dcaf90aeb3529ed legacy-trunk
+8009 30d55982704796e1ac616391d73df1e479ced54a legacy-trunk
+8010 826f28985beadf59105a4256c73fd7b383250832 legacy-trunk
+8011 84d3cca814fbd0d65349211396826a1fddedb4c4 legacy-trunk
+8012 20c2b715188ea975bec482c20e1fa3c3f0e44f43 legacy-trunk
+8013 c6f04e9655081817775db4c1047b0b08645c8e98 legacy-trunk
+8014 b1df938655e15d5390b565fe2c32b3edc0010b84 legacy-trunk
+8015 472c8e4cc9741fbebffab275c63aeb0771bb49fe legacy-trunk
+8016 8f871a030b8d14029859023b966ea3579f1a7b2b legacy-trunk
+8017 a0cc005eccd787b4b19566b80716f4092fbbe026 legacy-trunk
+8018 b579c5918f2cb35b0a19f453e0f0217ab22fdab7 legacy-trunk
+8019 cfc13f3f387699dfa4bf75934904607ac245f843 legacy-trunk
+8020 37c939f70fac01d0262e48764fc7958a5b90e0a8 legacy-trunk
+8021 0bba914bf7b2aca51aa37b31a961f73d702774ba legacy-trunk
+8022 7e4228780ff8c1a34c7a8d1cc8c7f254b0b4c906 legacy-trunk
+8023 6c07d44a708108cc5db440d4ded754670176b09d legacy-trunk
+8024 98d4e97daac0546d7fe60dab0dd7f040cb8f8711 legacy-trunk
+8025 a22caf12934538e4470ca879bff41b5c9de5c458 legacy-trunk
+8026 52610ecee367a7938a0b418399b7a373adf7b90b legacy-trunk
+8027 43822e4fc27d47641a4adc3d5ef68fb4776e913b legacy-trunk
+8028 34509c05266f2298418ef38d0ed04a7c8cefdb77 legacy-trunk
+8029 2dfc707d6e685195be866e88cb7d98d66083da3f legacy-trunk
+8030 18fd07869b13c48b8b527fb91558b3d30ffed0fb legacy-trunk
+8031 b5e648fde099c96fec3cc59f6b16d012038140c3 legacy-trunk
+8032 989f4ff7342915aa0f8eac6fdb3651be592ca146 legacy-trunk
+8033 fa9fada916b453039f99270be1b68d7673c0aa33 legacy-trunk
+8034 4329e4077cf39151cf2bc62bed0c3b227ad62387 legacy-trunk
+8035 ef3ba8b99da2efffba3cffb6099222bcd9e3eb9f legacy-trunk
+8036 1eced1aaad5a8a65e6330d0b5baec25278c59ae6 legacy-trunk
+8037 8ec298b255a20b670a3fad82d7833e8a5a297165 legacy-trunk
+8038 4dcf26fe4da5951b099f5f0dbebf28e0aeb2be9c legacy-trunk
+8039 3f3d2d474aca0f5ca13a44f71a260cbe484670e5 legacy-trunk
+8040 f1b038758bda93b33e5c8cfa83913bac51e9e330 legacy-trunk
+8041 6e944279a314f300406df0bd2eff3ce270666fd5 legacy-trunk
+8042 5ffab65f8d050988b9068746535f2e4f5f685928 legacy-trunk
+8043 19d4a28746454c3411c0f65b3dd25b38bfa85710 legacy-trunk
+8044 932cfc5fc104b24d11888b9ea946c397dda68d82 legacy-trunk
+8045 139ab21d2629be498f188ccf8530393b73ccae02 legacy-trunk
+8046 818cfff3aa5d8bcc1b50602acd6ca3e753e31c87 legacy-trunk
+8047 11e2e3ff9fc7b19ebc40b9408599ed552238d5d8 legacy-trunk
+8048 3e679530afc9ec64acecbe0e726c66f09c96a611 legacy-trunk
+8049 b231855a94744dbde23842db4777f65b65e08c8e legacy-trunk
+8050 bf9f104abe78a55a9de6df15975392b36168e089 legacy-trunk
+8051 84d7cc5e63cdb765cde0a19a8f732fd5185f4eaf legacy-trunk
+8052 6a9f263e2b48cacc8b87e936779f1a828b70651f legacy-trunk
+8053 c7d812e4af0d3d93e38420c304de5f1bef6d48ec legacy-trunk
+8054 6c72b91c8b83d1ac3b451f55e15790281115e207 legacy-trunk
+8055 937d9ec2b560517a2da2f42c2e0aa9185c3b1c84 legacy-trunk
+8056 486d5e98938bba4d4bfe14463898147073f7e5be legacy-trunk
+8057 ce59973accde7e07d29acf4f74563c3c6e08ce54 legacy-trunk
+8058 7e2ad9e32e0d5dd53b8df723c0d5d69c5722f6ad legacy-trunk
+8059 87d5d7fa8d07e6b996645ff92b666da06ec1cd1d legacy-trunk
+8060 edbcfed7fc7bfc89e5e9ca1aeae1047e2f4714f3 legacy-trunk
+8061 85c5043c931677ecabe586e84f0c564152fd75ac legacy-trunk
+8062 57dbdc2b30226f103a01af7a3e589d28541536bf legacy-trunk
+8063 784bafb47e1f6dbf74be0b68fa88ac112fec5c26 legacy-trunk
+8064 6a48a7e711d86ca22aaeb5061271abe029bb17d0 legacy-trunk
+8065 53cdf94b652b83e5652f5c710e9eb34fdd39828d legacy-trunk
+8066 795ca975d96f88e283cbdf66bc59c310211a8bf4 legacy-trunk
+8067 f3f65687e4260dadf7ddc09d1e681107637aab8d legacy-trunk
+8068 da475e107a68f768dc4da31a0be81750a93f5882 legacy-trunk
+8069 e3d52582d3607810d5e3d92afc4049ddd778d832 legacy-trunk
+8070 451c7ccf36b67f2d1af8f44c00663ec6153a3064 legacy-trunk
+8071 4c4621aa9e7677e610963c3cd30201b236d86a14 legacy-trunk
+8072 c5a567af13ee7cf3ca908dddaf8cb73a70115bf5 legacy-trunk
+8073 2e2bbe98562022354dbd59d510bce661d115b18c legacy-trunk
+8074 5516915ffee7d782771b2f337768d30237e218d8 legacy-trunk
+8075 1f206c91daee1800f93c9eac359352e3b9b852e8 legacy-trunk
+8076 b5e51ae9f832e5a39860e842d8418a9a07c20b76 legacy-trunk
+8077 d954dc243eb07aac53f9651c71b08830cb3050bc legacy-trunk
+8078 a61023bca0a974379da7154a330a14587936d05e legacy-trunk
+8079 0294a67bfbdb437facac4238fde52289e1cfffea legacy-trunk
+8080 f43559d23b3d68e95eb61ba37a171ebd0fecdc0b legacy-trunk
+8081 85980ea5e805cf990d283de8df528ce25ffe4484 legacy-trunk
+8082 89af5bf8f8732047cd6b9f261a797e9a2605aa5b legacy-trunk
+8083 495fbde64a73b5db6b9d2c4bc3b90925d0bef9ca legacy-trunk
+8084 cbb4e3cf086e221ad3dfb544c221912023639aa5 legacy-trunk
+8085 79e49cbce2efd2f0c6b9c38709f0ce0b320273ed legacy-trunk
+8086 f28eea02cf94462bb995fab2493189648082d81a legacy-trunk
+8087 10e9cfa010f089761fe79c95cd7cc13f670e6554 legacy-trunk
+8088 5ed3a21cc1229c1798852453c1e7fd4d91b531a3 legacy-trunk
+8089 8d405f71282f96e0168d860df127a50125bb0e85 legacy-trunk
+8090 190e35bbc15ae232787de7b209531fd200c6b247 legacy-trunk
+8091 7254ee2a8abda7089ad140ceef2ce6848fc1fa14 legacy-trunk
+8092 3ba08d6e9b7f2841b28354e0368c0862ebb370c2 legacy-trunk
+8093 bae2c0189f8594a8a366623736670d07f5574898 legacy-trunk
+8094 70855574516b86b98c5158dea1d11426c2ad0ad3 legacy-trunk
+8095 fdd1e1a530af8c07d5c2722eeaf2b26190763c49 legacy-trunk
+8096 7fda7841db9182f8e7847ad20421524e71a54ab7 legacy-trunk
+8097 0556ea687a97d818105940acde86feaa7c1d1f3e legacy-trunk
+8098 e1413fa64b831b745dfa45c979723c26c3c164b8 legacy-trunk
+8099 f8e452a1f64483bcf6ed0b3cd34b05ca52f1bb5e legacy-trunk
+8100 fa6c91a5f41b7838755e3378f656469ed26d9df2 legacy-trunk
+8101 32bafc9e9c4fc36c809af630f270ab480bd2744d legacy-trunk
+8102 acfce015dfdd36dee0aaa1b5a1c0cb9ef760480c legacy-trunk
+8103 696e754064c37f0b6931bb1a50b395d850fc1db2 legacy-trunk
+8104 4d12e6e9c27d1e5368a7450b9319db35675fb30d legacy-trunk
+8105 9924825da4b3a68502e01072e792031b6bab2ed3 legacy-trunk
+8106 e6a233fc8b9b414ad2683846f1265a52cfbd7c5c legacy-trunk
+8107 8af8ee797c0952cf712f8368649dbb4021d5624b legacy-trunk
+8108 8c54c777674490e83bc3bc07db821dadbfb53cff legacy-trunk
+8109 00fc413a3b8bc76eb28e547192449b32f3b7ba85 legacy-trunk
+8110 c69c759f4366c56055d04ab8db2dae8015aa7c32 legacy-trunk
+8111 ec97f41c7a04eb43d894e75d410b184cda48c2cd legacy-trunk
+8112 acc55d70467478e0eee84ac5942488d94559600d legacy-trunk
+8113 75ba64c55f2e12c9504cdeab561dedd38844b400 legacy-trunk
+8114 17ca7e4e8fd6e81fd9f48ec05c787ee68b0fd78a legacy-trunk
+8115 f91439d8f66e4726ff1f21019878a80d867ac66e legacy-trunk
+8116 43705647feb9297d5ee2fa52aac637d964ffd564 legacy-trunk
+8117 57a261fa596c6f264bc7dd7902a4539e76295df4 legacy-trunk
+8118 65ea41f2d34d80f775e91fcfe072a9f52146f57d legacy-trunk
+8119 0ef702b8046ba6fa3991857d474cef5b52b0b807 legacy-trunk
+8120 96949b9f42cb9024d5389b298d55ae7862dcd52a legacy-trunk
+8121 7c209dabd8c80002cf6eefed0461f144808293bf legacy-trunk
+8122 e59374e23fdf6e4656bc75d1a9131b20265f776e legacy-trunk
+8123 c63e283bb2e466148f7c1af54d06c0c49d0befd7 legacy-trunk
+8124 b49d8037a5cbae3f404c47f46f4309926bc04dab legacy-trunk
+8125 0cc97e75a3613929f4c6095605d81d5920374124 legacy-trunk
+8126 07e1aab231153423eefd5503565b6bb8e3d18b3d legacy-trunk
+8127 d45dc7fe42af9e3e986178f7d0fac97ebe4a3ae6 legacy-trunk
+8128 95d6e17955efc8bbd924a464552e9fc53ea0ba6e legacy-trunk
+8129 6009d53905848cef9391d5d2e0f784039f6b3004 legacy-trunk
+8130 309602c8792924169cf079c919341b120754e4a7 legacy-trunk
+8131 8e14d54a6419d29c9f3a3ff02b2f27e31831a533 legacy-trunk
+8132 0b5742d3189a240ee4e39739aeecb707daa34aaa legacy-trunk
+8133 d175cac550b98a618e435572aef5539b86ec9137 legacy-trunk
+8134 dded439b7b8ab161219b77c71e708ea78e669201 legacy-trunk
+8135 1265ca44f04b9bcc9ff99ddb9ce286d092db75b5 legacy-trunk
+8136 6f9a2c874018ed8bfdae042dbfbb5e4982f04075 legacy-trunk
+8137 efdee7d432704d07a37545de0c05d4beef5f4a02 legacy-trunk
+8138 3db754abff362f093ed8b81f3384fce7c912dca0 legacy-trunk
+8139 6bd3a2cec3530fe7a11d12be655740788f7bcc7f legacy-trunk
+8140 18149980ece98369e7374be62ae58a50b1e7e206 legacy-trunk
+8141 1dfa4f17d8fff631de0d790260d47c1050858453 legacy-trunk
+8142 b5bbe5220f6baa96131c90664ff80cbf753e5bdb legacy-trunk
+8143 3470689a97d72a0aeac017390d84381379c0e336 legacy-trunk
+8144 4a58497c14a8167b31cd9d580f17a23ad1b2294e legacy-trunk
+8145 67679f2ed21763b146f8412999617800e459a060 legacy-trunk
+8146 85134b97ae4d540706c36e7dfdd209920abac87c legacy-trunk
+8147 c3501a9d3c2059f1ea8f9a145c145c2364267b05 legacy-trunk
+8148 d66304963ca7fe91680ced67fea75f58c9ed506c legacy-trunk
+8149 1926e6492d3f78d550b5cbf81235848f21b6a4b9 legacy-trunk
+8150 a9ffdff0557f95ef659d3695f1fe37fdb3280555 legacy-trunk
+8151 e5de707300e17f075473e97937619d1c0fcaf0ef legacy-trunk
+8152 fd6acad7cc7a97a4dd41b56d797b4afc462eca75 legacy-trunk
+8153 ef8a15902a487ac18c31c9c997214816a4acfb04 legacy-trunk
+8154 6fda1e6e2616cb57b2a0a01c53186a173e04fa2a legacy-trunk
+8155 64e61165589a79319ad896acf44c7a2932b44e46 legacy-trunk
+8156 d5911ca8d4eb3af4cfc34f6d7c949035f462b122 legacy-trunk
+8157 12d64cdbaaa23e2c3742a5509e32709360bc0a05 legacy-trunk
+8158 d88cb4d26f13ed38259c9fd6b670ed9bf468b326 legacy-trunk
+8159 ea72bfe395ba2161ee9a5d57033f6d64317da872 legacy-trunk
+8160 cd1ae62ed2cffc3b8abe0affc482c53b34f2fde8 legacy-trunk
+8161 a0831de2358c30e22824250dd4b03b052958bc77 legacy-trunk
+8162 09d87ad75278987a9f55cb9e6b3a6ad05ea116cd legacy-trunk
+8163 2077a32d858ef6525cf2d6033815b936e04fd243 legacy-trunk
+8164 8b7face9b1a782a69991a40e9122df2e11b0ddb0 legacy-trunk
+8165 e78d1e0ecc5987c23c475f3e6274c33059e46e11 legacy-trunk
+8166 52c13f1389efad4899b1990ce0de4e26c0e743da legacy-trunk
+8167 4e817b2ad9910bc96036f2955b626771a7a42c9c legacy-trunk
+8168 38383ada388e9a02491f9f7e5a22eeeb4d869ace legacy-trunk
+8169 4428f1084b6c67038eaf943e8c0a6da7869eee26 legacy-trunk
+8170 a97fde2818fbe40f31d770b0cfb6b922c1a02800 legacy-trunk
+8171 010909dfc33e2e06c2f6cd0b861643b50368a33d legacy-trunk
+8172 02ea9d0214274761fedb298e343cc733c3e0bb15 legacy-trunk
+8173 9b621ac092121c256cff345417a187e18c0e90fe legacy-trunk
+8174 88b0b2a3aab56a5a9972ea025ffdba9ee7367f1f legacy-trunk
+8175 ba860dc0a58514f169c80e12e74e2524deaae359 legacy-trunk
+8176 76fd5281f98a7b8f838d389f89602a0546bd0f7f legacy-trunk
+8177 60fca478379356f8d93dc4f2a1ce2251ebcde787 legacy-trunk
+8178 3a1bb1c98c140e8b4824291f1c172de1f26d5326 legacy-trunk
+8179 5766570381f24ae9793280ce514fe845115db5aa legacy-trunk
+8180 03dd1ded5cb3e864e4fe300c5d707a9afbcbcc63 legacy-trunk
+8181 c66236b7cc6ca4b4c2c4bab18aae1cd267e0fba1 legacy-trunk
+8182 ba09b407a0bb93f64a55650d1acc987683ac9993 legacy-trunk
+8183 f8bbd71fb819a5439bd721b9803b704f59272a12 legacy-trunk
+8184 404ba017ad427b80022225e9059aca784f434031 legacy-trunk
+8185 99cd39f6a52db130df282c1b72f92a9eab7fd0a4 legacy-trunk
+8186 671832470aa113476ed540f2af1ae4e3858b5936 legacy-trunk
+8187 f1da294772cf2b5fd9fe316ec8ecb7ef8bce74b5 legacy-trunk
+8188 fb170ce8295129374d43c289b5c6eb71edba4a4c legacy-trunk
+8189 433c9e7edb608907fbd93976d571e0ca8ecffba8 legacy-trunk
+8190 ecee55baace30896f1b2eb1d3d37abac49f3c0d1 legacy-trunk
+8191 dee0a58a9132226808a34da85ddeb41f136e0380 legacy-trunk
+8192 37635eea3bcc8397de418a42af387acf8d83e1b1 legacy-trunk
+8193 ce64a813921666055a930b52494b1111b4d53eaa legacy-trunk
+8194 3c67436a28e61b00c5bd50643f358e48e72684f3 legacy-trunk
+8195 55dff8169cf54c031a8d84611898ca338c29cd84 legacy-trunk
+8196 3b38e8db5f21fdfecd64740e5872f6ed3dfd3999 legacy-trunk
+8197 613bd237cd55c52114c9c605a4abf83df2a78e0b legacy-trunk
+8198 138b176ec40f43c4c0a5cc447d6552268a76e908 legacy-trunk
+8199 6c97368656089055d8bbf55a365d2d5efd2aaa1f legacy-trunk
+8200 beee351f1f72aeff561edff866a9281fb9da617b legacy-trunk
+8201 f9aea738d4351ed14018504f0618ee9c1a1756cf legacy-trunk
+8202 9a3b115aa49190effdc0b7e9c9ebe3755db0bf68 legacy-trunk
+8203 57a7ba1412e265ebb302174c40916e673f9902d2 legacy-trunk
+8204 e0da3d89d4b65fbab5d7cb33ead0910811af0acd legacy-trunk
+8205 04c28274c281812098040874fb3db29959f96c1a legacy-trunk
+8206 617f203394e73f85eb305848b59c489b61a75556 legacy-trunk
+8207 9960797445665d62bc89d5c264841730f632e134 legacy-trunk
+8208 75762c67200caf771416ec4229c85bcd81d72c89 legacy-trunk
+8209 f027dd0a85e4e5edcb0a1dd049d237e6b391a5df legacy-trunk
+8210 8f6cc717d817c07bfa7c7364f6b60cf99adb7eb7 legacy-trunk
+8211 a94b0a122c9869386d3bf5f888af66720b1af512 legacy-trunk
+8212 634728d8bc98cebb57e50c91bbe017c2e3f9a0ed legacy-trunk
+8213 4dca5329e8fc6dd356e7fa5815d2052b2f94ca3e legacy-trunk
+8214 d0c6b49d71018e3745b0606ed1c4234fa850b799 legacy-trunk
+8215 c29fc17d8e4fd49783b99e7b6efc13f1349dc3bd legacy-trunk
+8216 71e11082d73235473f1582a5f12c694bb1e08ff8 legacy-trunk
+8217 6a218fa8ba9b9874d0edce4bdccf87882aba8acb legacy-trunk
+8218 13846379347da50e81d79a57e3b30f872b4d3ccd legacy-trunk
+8219 827a2f3e64832aa007f2fbf0ff8e26f96a790e5b legacy-trunk
+8220 c606dd61544ae07b19775c51d9e22f296da8bd49 legacy-trunk
+8221 ea8a0b090908bd4d68af914aecbde2111783e084 legacy-trunk
+8222 e22eea5d126d9b40888b643037f3ff3f44b20c68 legacy-trunk
+8223 abe8634466b236c15f38b3346908b4e6948bc591 legacy-trunk
+8224 49e0e072d9cab597c9ffaa8e7825b60c5d16605e legacy-trunk
+8225 1c34a0ce7858573b2e30708bccf76a29d8b62e9e legacy-trunk
+8226 20e639986fb9bb2d3adbfa71c180cb0d4fe81807 legacy-trunk
+8227 5a7429ac90c83b1bb143e9c5b361138e7890c741 legacy-trunk
+8228 87d658a128f91b5c682c16e2a650a7e904bb3d72 legacy-trunk
+8229 fa6d013c942b0775a7bae2401f82fb9c3465cf83 legacy-trunk
+8230 64bc782a42ec73159aeaf07b43d08c5c85a00555 legacy-trunk
+8231 9ed26afeeaa52fcb1658ad0236e9406e592cc25b legacy-trunk
+8232 18a639db048c7990ad75a4562250d74f5c57ce95 legacy-trunk
+8233 4b42eea10a029e633fb8e367819c3d67a12c8cb9 legacy-trunk
+8234 8c0f747f11419acfdadffb2416cfb636b410fe47 legacy-trunk
+8235 bfe9ba74c19ed76ed78a3027ef2bf3cfcc669c68 legacy-trunk
+8236 919386fb3e5043322757bab9035272651ef7742e legacy-trunk
+8237 201c8d06e3b7867519fb37fd8176bbeed6092028 legacy-trunk
+8238 a8e31d905d2c0fe976f02d35e3473293a5e409ba legacy-trunk
+8239 79bb9997ce5faa0b786d463e83a1ed9e4fa90003 legacy-trunk
+8240 fd4e9f293c77a8a84e4fb8432bf35636d6bfb4b3 legacy-trunk
+8241 62fe800d171a780c0e05199d6d2cd9d95c313b81 legacy-trunk
+8242 d6421b3ed1da65b48901a3601abb025976a3d776 legacy-trunk
+8243 309aab4c0b98e57445ad977ebba7f2ffbeb40197 legacy-trunk
+8244 03a57af722189cbfa7dfc9097ba6fd4fff393d2a legacy-trunk
+8245 7de59f47e85b9cadf17799dedd141b08044f1525 legacy-trunk
+8246 b7649491ae9246a4decf39561d3635d6f4020bd8 legacy-trunk
+8247 38ef091964f022fa3eb95ee458f198311cc48de6 legacy-trunk
+8248 fb8f079e4eff86f6595c8ddf73a8244cb1ab4402 legacy-trunk
+8249 5f7ddb7ca347cf8f05e0b945e5ce6c5dc8c70011 legacy-trunk
+8250 78319221edb2f28cdadd1bcd2f18d8e6f64bdb51 legacy-trunk
+8251 3ef2563e83ee39090acd612b17b7f86227d816eb legacy-trunk
+8252 c60beb5625e70165f978dad3c1b30098b2884acb legacy-trunk
+8253 f6de0500557695aa718fdf0e73239d385e6c83e8 legacy-trunk
+8254 b449cd85d51971993f0f0d0f7c366a740e119ccf legacy-trunk
+8255 049d94ffc06a01267be2157fe3e294fc4bd11012 legacy-trunk
+8256 3428487b29a385c962610a12a1fd8e07c43f01c0 legacy-trunk
+8257 bb0acfd4b720afd7a051f0f484058b62e95ea55f legacy-trunk
+8258 3b8d00403db85dc37733eaa73e0285730e3cb678 legacy-trunk
+8259 b83ecf6f87300c1b477213c2bc93641624b365c7 legacy-trunk
+8260 9cfbc9bb6423b08bb8af45bbf1dc8ee6cb816501 legacy-trunk
+8261 c043901fa1febcbfa24cc7d03d56bee99ddcfa8f legacy-trunk
+8262 b247297be9a025ec64b55026c81123e10a359ae7 legacy-trunk
+8263 c569873eeb15d82f1beb4877fd8c77286396cfa3 legacy-trunk
+8264 b420b64a40967bf755f7304d085e8e269bdd374b legacy-trunk
+8265 31cae374f786567731cfbadff7079e9e35dd5ea5 legacy-trunk
+8266 88e6ae105ab5810ef8c291788c6f0c9f270b47a4 legacy-trunk
+8267 1d417e9c72cfac7b63c6e9bdad12a03a19dbf6a2 legacy-trunk
+8268 2b7372ecd5072b0a4bb1af5bcccb2b050c0c08fc legacy-trunk
+8269 dffabc620e4e46d018db5d36b70827b1d6a5589f legacy-trunk
+8270 4ce7827a36217b648f714423a9f04b85740a16b6 legacy-trunk
+8271 d79c4fbb1982a1e3362d9358fbce738ab05b14a5 legacy-trunk
+8272 3d1d8055087fb783d3b8b86350d95fc0b6908008 legacy-trunk
+8273 73cf58261b8234813332fd0f941a34d3995846fc legacy-trunk
+8274 d689d2c4f8420b019595cf5c3291c3d3a5482d12 legacy-trunk
+8275 24a8c56de21444ebf2aed94cf78f1406d80b2b98 legacy-trunk
+8276 e862d9b00246abd7c6c449084b1ad1fc3346a474 legacy-trunk
+8277 7e8ed9650fcc118c73780ce24877868ed43b240a legacy-trunk
+8278 fe3e7a05583436901ab105468fbcff9449ba3261 legacy-trunk
+8279 e42391d676d12d06eb924bee712b84b00de62903 legacy-trunk
+8280 b56d527a433f5a505792855c09cda6d7f88e4a23 legacy-trunk
+8281 b7c600ecc27d4200e31ad8bb9dfac30af4bcde5e legacy-trunk
+8282 518d4f0c8fcc49802760182a903a4a873ccef9cc legacy-trunk
+8283 5a9f3c20733669f5c0b4ae9e47fc208b90ee23ed legacy-trunk
+8284 50803ca58b1f91e25c9c72a68c2760a4f2c7e577 legacy-trunk
+8285 dffd22146aab8cccf8a36c149d6b307d8b686317 legacy-trunk
+8286 5120ea86b25d6d11aeec854c648816c6655ec2f1 legacy-trunk
+8287 6d40ebd9222793022099b92f01407f4358dfcf2b legacy-trunk
+8288 58aeb872d9150d0021853e94cc2b8186585033d2 legacy-trunk
+8289 f53d363ef67a9ea28b399d5c62292b29ee1f1324 legacy-trunk
+8290 d320ca843512224027b733c2718d05225a25abd1 legacy-trunk
+8291 55ea56ee20f6bd56643712d7a80402f8cc4a22a1 legacy-trunk
+8292 d8a4f0d9221f075b1601f5313a31f4fadd256834 legacy-trunk
+8293 6a0d7cf19d38fac57b9b94b6797821c197688a10 legacy-trunk
+8294 48b94de85bf35f2442ea548a7b4e3545fd686ac7 legacy-trunk
+8295 3468ea8645ca4238c2b45024351e5e0fae5d1bc4 legacy-trunk
+8296 0ae8c7d33464ee0c7a3c30b18914779d05123538 legacy-trunk
+8297 91dd9d74f3b3cb06ae0b1760c713f1ec08fa8292 legacy-trunk
+8298 78321a84d73e5cd37d175f995df26aa7c68d148e legacy-trunk
+8299 d3f2df8c2286c05eb851dac30d9dc36d10aa7478 legacy-trunk
+8300 ad04d387aceeee81ceec26c29e0098defe69871f legacy-trunk
+8301 3c15ae0fb6ad7855b04064bebc7ef7b89fb5aaca legacy-trunk
+8302 0c33612f11d6b16278f39b5ab28aaae0521ba79a legacy-trunk
+8303 0965d9fd1862dd2337ef84fcaae95a652589698d legacy-trunk
+8304 a79d0cef10a19fdd04ddc96736fb4c8929bb9fc8 legacy-trunk
+8305 9fa2bd8a2b78a526d8029b5504c221c544bbfdea legacy-trunk
+8306 f1127d6fcd7424542053110eb24b31a112210a2c legacy-trunk
+8307 226bca85846f418f9599312e64b3e7b4b6a22e53 legacy-trunk
+8308 985b7bf4755b6cfe91a41292fa1f3ca05f380ef2 legacy-trunk
+8309 285fb6a99e5f85f577bd11af6520862365158dc7 legacy-trunk
+8310 86c279a848eb2d50161394d137e17a635aade265 legacy-trunk
+8311 91aea1af654ff158f11089ef1ab246710223a51a legacy-trunk
+8312 b9063f6f811cbfb98e484f90d55d34333a92bb5d legacy-trunk
+8313 3a798677506cf067586fb91ecedc00c7bb8ed55d legacy-trunk
+8314 2e917f9372e03a54d70887a71f71437a92759268 legacy-trunk
+8315 ed5db0c2a3f34417196c128e0a233eafbbc61be4 legacy-trunk
+8316 1786cc419886ea66a16c3c40f3e6f762303cec16 legacy-trunk
+8317 9f8ff02ede6deeb5d6770641f88e86fcb92a89a1 legacy-trunk
+8318 e16994f3d102ac6afd970cd280f474c4594c6f5c legacy-trunk
+8319 35b14d78c61d9432d75530d12dd49304c7060a4c legacy-trunk
+8320 5a8a5a1a04757f60db6b0bb60b56969a75c31bd9 legacy-trunk
+8321 5961f12ae426586a00a6874e5fe7da5b018019ce legacy-trunk
+8322 6e99686b76da0ce2f5d8f0debc72f5aceaf3e639 legacy-trunk
+8323 852a1fa62a7c4f6e1fd5158d0336c13767532f3b legacy-trunk
+8324 ff9c0110079b7e4621040e14567d67c4e4c4d6ba legacy-trunk
+8325 f64a5f7506966039811575a10e96a3554fb6504d legacy-trunk
+8326 0d7851b37ad2d130b971160fd22798d2389cb72c legacy-trunk
+8327 6f67a1bda15a218b1eb50627c2be463abc9b804f legacy-trunk
+8328 edaf1cb63dc0c89f32f5ef108b30f3c14344242a legacy-trunk
+8329 4a4778e61c14eb19b479b73ae2d9845a424ec7a0 legacy-trunk
+8330 92bcf4cc942119ae9c7a72ec99c9a9d87dfbcd05 legacy-trunk
+8331 358d70882af629a707ced413da4dfe3156d563ad legacy-trunk
+8332 fdd8cea181c0994cf867eead46c085afdc490fb6 legacy-trunk
+8333 c4dd3329fd7d044ad60a5eb94fb16a729687b74f legacy-trunk
+8334 a667d48e68b85697222fc8559c4a78b6d6cc4f2c legacy-trunk
+8335 f5f7c739568760eba51ddfb30840e6da2156139a legacy-trunk
+8336 64f9ce999437bd9282c389733dfdebf9f1b018de legacy-trunk
+8337 728a083242a2a6e708ea2bd64f95854719577d02 legacy-trunk
+8338 323f6a16a7642cf162b049ef1bba55f2d62ddb06 legacy-trunk
+8339 4dbb4ec44d150e6229ac8cf7ed3e34d111c9d872 legacy-trunk
+8340 0ac2c747053fdb74f88b4a4816401e540a763279 legacy-trunk
+8341 87517e8ea5191b5bd27001f9ad9e1585270402cd legacy-trunk
+8342 9841bce37c4d639b95749d7d7a69866d1f4fc92b legacy-trunk
+8343 f1c03276873a60b45212d755c94957eb58f3a4df legacy-trunk
+8344 97837e64c58c52c297df2e9eb347bfbd6d64ff36 legacy-trunk
+8345 e742e41a4b11befc67d089c088758ffaa4b6f763 legacy-trunk
+8346 f2bf7bcf8b8b67ecd18689b2847b7078c936e1d3 legacy-trunk
+8347 fe4f1eb14d53f0b4f069ffa64d22383dde397835 legacy-trunk
+8348 ed91cb7d38761928bbc6dcedc22abafd0491dd85 legacy-trunk
+8349 dd0e9b64661685528a9c27eddd58a60a27080ace legacy-trunk
+8350 c8a8cf95811c38cf27643cc75352f6769bccd9fb legacy-trunk
+8351 c67ad5bcd4b2023e3f081e201720998ee22b14cb legacy-trunk
+8352 d240851cc8c5775fb528f29008c89706e3c72274 legacy-trunk
+8353 a2d3c2a62a30a318b147148b54bc0e7bfc3664a4 legacy-trunk
+8354 0534e54e81062c805693e5cadd7308ef44ed8e70 legacy-trunk
+8355 68f7312a31f629ad9907737a7030bc8877be390a legacy-trunk
+8356 a775a44124d8b0c2a58a0d2a0f616d2ba39b8bfa legacy-trunk
+8357 530ddb707695e7fc173d074f05202fd8376ed3f3 legacy-trunk
+8358 a101a17b8b7b8c7cb6188a362729e49f8b2e0bd4 legacy-trunk
+8359 d6513da9249d397d04c772a86a3c70324f39e8a2 legacy-trunk
+8360 79d1931f17229eecf7d83933664af459d74e01ca legacy-trunk
+8361 b571b6ee7f17e378d162b2b3dbeb4a4ef11288c3 legacy-trunk
+8362 76b1da21f3a8981d02b2f5ed1cf06a30bb5628b6 legacy-trunk
+8363 4c52a1b6a54d62a633e580bbf5b0101052c89f54 legacy-trunk
+8364 2a172b4950b6a6c022917b18736550f3d658a262 legacy-trunk
+8365 0cd74f9189c6a7c9fd1407f75edb20e398a9fc0b legacy-trunk
+8366 cdd125de75bf6f62021bb8b6a1247f1b12bfa5cd legacy-trunk
+8367 f3342b381935a46499b60e771b544f65958d4290 legacy-trunk
+8368 c4d547c01e934ed85d52f057ffe61c5cd4983848 legacy-trunk
+8369 b96ccc7812f2f083ba8c3b263933736e6a8c23db legacy-trunk
+8370 c579b9f98a5a715605268911bc10bc0568de5c31 legacy-trunk
+8371 e2df95b7be789a24efcc0f87e23026404cbaebeb legacy-trunk
+8372 46cd352c76389fd2292c4cf0b9e26f4a342e7805 legacy-trunk
+8373 67022d28a65d2dfe8a9fa22c73e2c046848415a1 legacy-trunk
+8374 7d35a0580356ebdcd60eb43fe5b0548ac721efbf legacy-trunk
+8375 253377a406448475599ce0270a8dc500927c0bdb legacy-trunk
+8376 f82b608afb568df6b0486b74424a0991292d7312 legacy-trunk
+8377 466664ad38e4cef191f84a1c2c738c1ef485019f legacy-trunk
+8378 ba49a6ef7214f7f04a1435c57274bc2da176bfa0 legacy-trunk
+8379 4102f44720329b06d23aefafb537800c4e430c11 legacy-trunk
+8380 b6e48a4cdd1e68b2982e6a1a2216b90c547af7b8 legacy-trunk
+8381 c50cc28af7c79f904f4cfa1e2df0c719610a7b92 legacy-trunk
+8382 c2423843a26f715ec24b7fc40786d43ae4baf680 legacy-trunk
+8383 f344609a48e4ea96d340cc7a75b9c78cf1267bce legacy-trunk
+8384 af92cffd063f53c09940abd441ee5b425d3c1e2a legacy-trunk
+8385 4dd9ea1e94a8801c95ecd84e677c5158cabd2c38 legacy-trunk
+8386 f8259ca9eed37c99e3a6a1e26ddd5025839ad0a7 legacy-trunk
+8387 89771a46ca354d517b6bb2639db73da2479cb40c legacy-trunk
+8388 6986781a07ef0dc14380f1ad06dbad03a67e545d legacy-trunk
+8389 f527c12f2e5528e5af4cb350dd64dd0698e8fe96 legacy-trunk
+8390 6b39f8633ca547a1d87247477af4eb62333eb0eb legacy-trunk
+8391 5155b2c35e159f59dd175134bd042382a81c2e35 legacy-trunk
+8392 db9cfb108623c25ade51887141cecc3a6a8f4b60 legacy-trunk
+8393 d2c80380ad0de7423dc6fe5d41dbc79d6f5a3d31 legacy-trunk
+8394 04a1b82c832b1a7e17f93e31a9ab5566bea84de7 legacy-trunk
+8395 780b68df4560774f5b8ff566bdad2525bb82442d legacy-trunk
+8396 5da18e002b1a8fe85ba5a9558c1c18f84a8cb74f legacy-trunk
+8397 5fb30413b93b219f8015930dc2dec6929615b009 legacy-trunk
+8398 800a5217e67e7869bdae5d5e1156dbe8d9c60108 legacy-trunk
+8399 44ddc711ee2dc8c12d4a75a8d2dca5f44dcc0a11 legacy-trunk
+8400 3e158e69ac5d91c1ca34ad00d00c3aef42a7f1cb legacy-trunk
+8401 08b1e9d847e6b59959a2dfc9ceb6c1cbeab21273 legacy-trunk
+8402 93304b2e14cb36879cf6314badfe474e1af0fff2 legacy-trunk
+8403 8d2194e22e6739cd966254a4fe82a0ba649a6621 legacy-trunk
+8404 63bc9289ab28293985d04ad62396d91feb8daabe legacy-trunk
+8405 ca245c36c6f6f848286329148be9f4b00aa40f54 legacy-trunk
+8406 b3c913746900e161caa3746b1a8de4bb71811a25 legacy-trunk
+8407 e2cce4adf2a7029ebe80d7d972ef407dba0dad3f legacy-trunk
+8408 12fe5cc1516d082d0d27a6c81bc037ddc2d5710b legacy-trunk
+8409 40cfc905c77696ac8b1e12c6eec83aa3a3698008 legacy-trunk
+8410 b210d205981216dedd45d3a8a31f21913ce815b3 legacy-trunk
+8411 0369d63b100b1f4bb8076db91df190d896275d97 legacy-trunk
+8412 d77d3b8e86b25a89207a7d24ed33a0e5f674257a legacy-trunk
+8413 80d24364b9325eb626a1c4e368b50a0d07e7747f legacy-trunk
+8414 5a4d181ffffdf5730cbb2a28317c3813a94e309a legacy-trunk
+8415 222faeb43d020c946ac78cd9d759ea6aaec373b9 legacy-trunk
+8416 2c65bb6ab87cd9bb69f3e3e49c623b4e236225c7 legacy-trunk
+8417 eef76b3cd9aef3c22722d7fb30d8305c44820363 legacy-trunk
+8418 f7fc88fcffa246b3b246316cd426d34b036f1ce9 legacy-trunk
+8419 c11928d2597bddc6d2312ff1565c6d504737b72d legacy-trunk
+8420 ac877c4768e1cabf9a241400965553ab0afbc9cd legacy-trunk
+8421 1bd68e4464ce2fc541e92c7e5ce3bd00016a9913 legacy-trunk
+8422 75b3aabcb7c100919768c49c82438b28b25afed5 legacy-trunk
+8423 9a56452c7e8e92313f79d845791e609fb4f8c890 legacy-trunk
+8424 7ca6a912d455b9bb2f26577309acf4ffb72a3f02 legacy-trunk
+8425 6c060bc3bf3d9b580a3bd897acf4fd10e999997b legacy-trunk
+8426 0b4a9dd09e0db0cdd9f6e2ad03e0f2c658abd642 legacy-trunk
+8427 3fbcda7416965a4420709eac689442a8be4070b5 legacy-trunk
+8428 8d7dc66968cbc6ec4ea3db3c349c458e3ff04f0f legacy-trunk
+8429 b2e018fb2ba915c207d87dbb2a0b7e5f4fe78bec legacy-trunk
+8430 1a99695a41ccf6914684cbcb079d4436b68f8c60 legacy-trunk
+8431 d3835a6a18c95785c8d1b100263f9fc89b4dfb70 legacy-trunk
+8432 1f2dfca522072d139c88626f688c245d21d55ac9 legacy-trunk
+8433 3d6f3f0ae0050656142b19719a8defe5a863257c legacy-trunk
+8434 24ec4624ea9e30992b9daf79d480e7a1fe7e1b38 legacy-trunk
+8435 834461a8ca76714608dda33fbc4c2985d699f7cf legacy-trunk
+8436 1a4fb6f12ffd54b123d23de9802a0527484dcaad legacy-trunk
+8437 76bb40a1eb045323898d6b00a1220e8cebfeea4c legacy-trunk
+8438 35e5acc6532c7e54a69d70be2555dcb43a74699a legacy-trunk
+8439 23e014839ab057d159777723fc90f25e802e1d66 legacy-trunk
+8440 83de5539f8e43220ad9df706dd8380569cba2197 legacy-trunk
+8441 43054021bb57510617a88dfdf138ceea27b515f9 legacy-trunk
+8442 8ae83b9c34a0245087cf2d716199d732d5688bea legacy-trunk
+8443 96a97b2b723e9f53e04f0b3f9f8c4326a88b6a03 legacy-trunk
+8444 9e4ddb459b10d3b0cf94b245a67e3475380fbfdb legacy-trunk
+8445 b7048f5be9a18d39aac4af9a571e340389a71668 legacy-trunk
+8446 5f6a2eadab97835f26e6b95316508495799692fe legacy-trunk
+8447 701d854d1930bb6a1a24f273fe9ddf1eab73dd95 legacy-trunk
+8448 3f2bfc15989dcae75617179cdbbf55d69240e276 legacy-trunk
+8449 8abb4d8c313449da992a345c6a5aea65d0b0d6c0 legacy-trunk
+8450 e77847e1158e213884d4fc35843616e2627aa485 legacy-trunk
+8451 7a0880f8b8ec08ea125213168dc692fa664f38f7 legacy-trunk
+8452 8bba9bb864ae238c4af93a775e4798feebc72db0 legacy-trunk
+8453 5b2c595428fa91f991936acb71932b87baecb3c7 legacy-trunk
+8454 b770796519f603fea5e78d3f69e590f7250ab6fe legacy-trunk
+8455 781eb49d2d66fd0a0642d82f4a7bd1a81d3e9a54 legacy-trunk
+8456 422960523286521529cb68a7340f6f98f5d72ca1 legacy-trunk
+8457 2894bb49e2eee68994d17dc6f40bd10cd52273e5 legacy-trunk
+8458 170c46a650220e62b6f9632a88ac56de8cda085c legacy-trunk
+8459 6aebd970b7a99e84cfa5f47d907a7a26b85f7d10 legacy-trunk
+8460 33385f94ca8ac42a127476e1dad0c48584f1cded legacy-trunk
+8461 b4bbba3af4e8c8a2e765d5930a58a105ca067efd legacy-trunk
+8462 03a8833b4b73d9995d51cbc65e8ba646fd52cd04 legacy-trunk
+8463 32127593c134d1a1e3d236a5ee5721ee744a6417 legacy-trunk
+8464 0a2c331200f5ff0827bf08993ba1aa5941311c6d legacy-trunk
+8465 5993a099d9b036630edf0a7bb4ed0c76d28648bd legacy-trunk
+8466 5b90da8a9dcc176846af16aa0167d1a9fb18fb72 legacy-trunk
+8467 503500652bac48ff402de2bb0ca7ca75a664017b legacy-trunk
+8468 a5737dd96979009ebf991b9cc964a5edc706d2c3 legacy-trunk
+8469 6e5d4ec03791c96cc79d95bfd081f64f363fe35b legacy-trunk
+8470 2db3b7361853c5561fea33af155194b27d8a9a84 legacy-trunk
+8471 3bac52352c0bc7a6dc1eae6352712dcbc0ca484a legacy-trunk
+8472 b8b6a88f7f442df40b4706c0648d6ab5f8f7a127 legacy-trunk
+8473 9e7d5982ab3de96e9a45dcc859651bd2d8878343 legacy-trunk
+8474 fcea57c346a59b61e3f37364e9d535dc5ca239cd legacy-trunk
+8475 c24b54c1957142d1d3af60ddcdc044dd6e2c78b2 legacy-trunk
+8476 f2d134bf6973ba26549dc4291d39587ee6c804b8 legacy-trunk
+8477 d520d5d01115b702bcfcca1a0eb7a556501d06af legacy-trunk
+8478 8056169ec448e233d0b453bc2fee9728a3db5f55 legacy-trunk
+8479 d439c32ce9637ffca62b639c7278989379b8edf6 legacy-trunk
+8480 508921950f2c40b2c0c6f9d306be1b0b8dc9b3de legacy-trunk
+8481 3f59b34eb90f96a31168ac1e802bf48881c8750b legacy-trunk
+8482 0cda9f247d7acb9b2f24e2dcf2850872bcd74e8e legacy-trunk
+8483 7361f2f186ada005db3914670ea0d095ea444b07 legacy-trunk
+8484 9ba72fc4f50364c72340760952aaecf2b74cc605 legacy-trunk
+8485 5dc267cf48952cc1bea2ba1dd35720955cafdfc8 legacy-trunk
+8486 887408eeae9939b51951afe1c5cfb5dad2d7635b legacy-trunk
+8487 871f135dd6129b372a0f1223d24c9f01888d9425 legacy-trunk
+8488 cc577001f7eceed3f3bc70b23728038ff8c3be8a legacy-trunk
+8489 d02ac61cd50f1fae5765188108ce34299425037c legacy-trunk
+8490 0b5a23ea75156f273e4afb2f382d40f8a968989d legacy-trunk
+8491 2f36e0bb37c378a9cfc40ef262e9644f99bfcd5d legacy-trunk
+8492 18ad1106f651ab8fcffd5e48d648952f79dc3320 legacy-trunk
+8493 dff2024ab021fe2886f1aa044e32fc5de4e08e46 legacy-trunk
+8494 50a41863c34a60127992377c853480a55e8ff14b legacy-trunk
+8495 f0554674340610465c7d9c8b4930e0f005d42209 legacy-trunk
+8496 a2f98d7caded1dd22d58ed314c61031e16cd24fc legacy-trunk
+8497 59c349a14a3ade37d57ee9c55dc493c8811095ff legacy-trunk
+8498 601c4eca3de341e77c2b2377d7d562017f31536b legacy-trunk
+8499 802470c7a50f0484f912572edd13a262c19eb522 legacy-trunk
+8500 6a25d8110b009452a6b00069ac49b94b29e88d0f legacy-trunk
+8501 d5f8741a812cf555073216c7c465add643e91097 legacy-trunk
+8502 0ad15f30c8d4108cb6118cf9b861a820d8ab157f legacy-trunk
+8503 b5804154af4df12d2ce62c6508a7e686db62ab44 legacy-trunk
+8504 494e550cb18d15c2ce10d0dee94d424d4f4041d0 legacy-trunk
+8505 292193170da159fcffaa1389b774ecacd3a62ec0 legacy-trunk
+8506 68f2d7704180a72b4d12788e00ca05d74d4c45fd legacy-trunk
+8507 bf803dfd4428f2761560eeb06c80de8e01f55638 legacy-trunk
+8508 6c449dff2fb89cf054fd8af68ebf120d03cd0681 legacy-trunk
+8509 9a57ca229681b682cf3ac58b7220dd88e8c8ba33 legacy-trunk
+8510 ac7554f2931369e35bf995a93bb28507fefb8aa3 legacy-trunk
+8511 1cf79ea8ffa2a58a90d8d106295176282cddeec7 legacy-trunk
+8512 614118a1348c9421b7b3ff2f1ce4d04886619ea9 legacy-trunk
+8513 be1b78e707287283d35f22c703de221172d358b9 legacy-trunk
+8514 4c2292e709b2d27d537f7ccaf6b6031585ccf6ba legacy-trunk
+8515 47adf18d01add7863e06bd332b35c127d39ef98e legacy-trunk
+8516 619232236ddb8a586f330450c04f75ab9fe3a8da legacy-trunk
+8517 1a43699108a63756560b4b327668d2d2c873c9e2 legacy-trunk
+8518 a9e1ea80ea3f4aa59f53f32572527eddf8ef9422 legacy-trunk
+8519 6db3d52d4a78af07efa232c75b3a3221ebdeca45 legacy-trunk
+8520 c079e924c92718961b3b9fe25d5aa0f815c4ef72 legacy-trunk
+8521 0b9ec1b34a7a40880cd29c2b47ecc13aa2b41cb0 legacy-trunk
+8522 6eb1e3549e2dbba626ed3e5f258cc5a90214dd24 legacy-trunk
+8523 8ba46b0778dad28872c9300780e34fe52f168a99 legacy-trunk
+8524 96fecc80a28f7c9f1502494dc31904906cbcff6c legacy-trunk
+8525 e936631176b61d6d1997294960504f2fa5525829 legacy-trunk
+8526 4f12c21f8747968bc407d221cc652e8edfb564f4 legacy-trunk
+8527 60731b19fe34d57e93f23490de320a7c14f570f1 legacy-trunk
+8528 6b0afbbfe0b7819dd3872a65eb21856158f4cd2e legacy-trunk
+8529 1da122718598e7501336cebd50ed09d92b02123e legacy-trunk
+8530 da3c7d47f210a6e5d5a010bc2f2465d2d91434e7 legacy-trunk
+8531 cab9ea5e4eed37d7111f25677dfe053b90325be1 legacy-trunk
+8532 72d004971b26797e00759d02df44509cbc666753 legacy-trunk
+8533 8ec02127c44bb4359e71112c0bb48663aab3eb94 legacy-trunk
+8534 566d0cae91915ab122bdd15ed70fb9b656648562 legacy-trunk
+8535 877dbba3b5a80402c5659c1efbab12de927316ee legacy-trunk
+8536 38784b853d231d2afeee6876fd6fd3237e35076a legacy-trunk
+8537 11429968e29d22ee4a4a48015b8bf7c0dbee6dc4 legacy-trunk
+8538 36df4434b3b303a14f586a350850708316707967 legacy-trunk
+8539 74a78666ddc8afbd30f302c7cec413f592e1b03c legacy-trunk
+8540 a5d503eca7478dd48e5f4f3ae5de7b82e98ab10b legacy-trunk
+8541 e88d2e322c5ebe82cbcec0fd27bf9ccb980f7e45 legacy-trunk
+8542 0f4193bd08d0bcbaed625274b18b6404b0942af2 legacy-trunk
+8543 e4cd092f43d66aaa865fedb207296bcc844aa8c9 legacy-trunk
+8544 3d3fa877387aed3164dc22e938f2da379316dc33 legacy-trunk
+8545 925f90b48d73724537d0775dd021950ac0c0e74b legacy-trunk
+8546 e0f249993a4f7f59c926181998a8136aa03aef00 legacy-trunk
+8547 643fa54f2124581d5a63f38e39b4e271688c5ba6 legacy-trunk
+8548 d91cc0a57daa3a432d76d9ddf1d3f8f9f3d0d2b4 legacy-trunk
+8549 c7b5a722d926494e66e1ca24b7c9f31d46b01d47 legacy-trunk
+8550 ecc9490ec71927838b297811f08a75b22928bc84 legacy-trunk
+8551 5e5e54a6dba6fab92a8eda145b0e7fe96eb6ad82 legacy-trunk
+8552 bf3f487fcd8b57f9909eaa27eaea20e378afb50f legacy-trunk
+8553 6540eb17e5b6457b5ca5f98de13972ba69cb1937 legacy-trunk
+8554 8814ccf2d1cdb658285464aab5b2355c0a10d2bb legacy-trunk
+8554 dc5c968ec992aab3d40a7189df0c443d1c7a1a68 legacy-trunk
+8556 2f1a5cad27b7a2301bc0884add23655458625250 legacy-trunk
+8557 d3c6035ac3cbcab75fbff3e93abecf653b1cec6f legacy-trunk
+8558 0eb14a6484f3f8f7d2f3a84e75ab4fd312c461c1 legacy-trunk
+8559 d7ca0554795eef3fb41fbf197d1c0d08e8cca0ed legacy-trunk
+8560 f159044530b1827046726fb36026ed710bc1f9ff legacy-trunk
+8561 0aa62cbed9f82e91729d399389b58b1e71b9bcd0 legacy-trunk
+8562 f9f0262c4c576e7b7d50bbe44e38c1fddcbb69b8 legacy-trunk
+8563 d89a219b49a7213c1b2c850d5eaf1d7e92526547 legacy-trunk
+8564 622c8d981a6955fa61cb052fb5db2425c20a2292 legacy-trunk
+8565 b044c479cbc8305183e53fa3d2b61e769024ba27 legacy-trunk
+8566 edaee537802133b6be0209ed4d0ce05579121cf9 legacy-trunk
+8567 f13049ed31fdb934317aed5c221d66e99af72771 legacy-trunk
+8568 dc916d8bbb55d882405fd8bf32aaecd8946658f1 legacy-trunk
+8569 2949c0a40b7bd08cadc8aad6145ce7bc2e863e90 legacy-trunk
+8570 d1093f3421b6f5280beb22c7df8dabc9c7cc4a26 legacy-trunk
+8571 a22fca7a5c5a7d12707ff8ae1def70c54301f262 legacy-trunk
+8572 2742264efddedd5d9592ffc807943307e0827557 legacy-trunk
+8573 44b8cfbda4412403226fbdb38e2341177a9abb1b legacy-trunk
+8574 d137e624ce42b2391afb9a4c3053f3c2caf12e69 legacy-trunk
+8575 179bfd0fee24a27388d5e5999509a757c500c60c legacy-trunk
+8576 8f7f477007b388652c567c285186e4c4c3859267 legacy-trunk
+8577 8bb128215dc58c1e89f8fcd0d650a74290918981 legacy-trunk
+8578 a64d14c4914f215e5018216ae831cbfbc193ea09 legacy-trunk
+8579 4d8ebf7affab4bdadb70abed5e66eb85ac1bf41e legacy-trunk
+8580 3bb8970fb91830a59013c704b5a67237571f91b8 legacy-trunk
+8581 f3c0c17b9708bf82c9da0adb8838a9662eae2f94 legacy-trunk
+8582 77fb880eca491fe13594e6da4ef64ad809292bb1 legacy-trunk
+8583 36b3b337c56638421cfa3bdc955dea7f0f37c05a legacy-trunk
+8584 7bd565e4fbb5aa045570c7a5c67ed975a0fda82c legacy-trunk
+8585 1676f5795180bcb76f4aea1f44818de1df2d653b legacy-trunk
+8586 8cb2afd10119500eb0e0b3386e9a3b11ff3a45af legacy-trunk
+8587 260b21769061aa906a1cc2a52ff34fa931e2e3b1 legacy-trunk
+8588 973ef35ef482568f39562c3115f69a6acd71f9e8 legacy-trunk
+8589 5d1f337cee269f911ac6fe26a7b9f67a6bc29d55 legacy-trunk
+8590 d91fd7cd8be7b2f6bd426e1504866b963260d3b1 legacy-trunk
+8591 737ed6652898e9416c80899c32930c7ea0b9b8c5 legacy-trunk
+8592 65c9ba8000302c2f46a5ab80a59d1ff72d38e243 legacy-trunk
+8593 07b7d4320b14adaa52ba849fe79206300d0652bf legacy-trunk
+8594 98a282cfb013e782287ac3421b19ea0e19de693f legacy-trunk
+8595 d13d3c2c9860a9342f120e38336f4bd804bdf395 legacy-trunk
+8596 c20b6980a870fcd61c8fe705ebece80e9c401d02 legacy-trunk
+8597 df29e83c304faa4ed2b483a215bc591229534e85 legacy-trunk
+8598 df028bc54e6f32a5f0f8c0a17ab5be40c2cf2433 legacy-trunk
+8599 db8ac6e109b4dc0b928d06a9cced7bd75387e6bc legacy-trunk
+8600 748fb5a009a7c0c3016a85cb3d1935faf1bf33b8 legacy-trunk
+8601 cc2c84769636a4259f7fe905ea09ce79df62e8bc legacy-trunk
+8602 d4e87aa7bff056791526f3efb4f4d604bc1a1540 legacy-trunk
+8603 b44934c20125efd8a3222c70a3a8c364e0364c37 legacy-trunk
+8604 4254095a5029801c0f926347f052294bdf56cc44 legacy-trunk
+8605 060f83932e91a6f5823e82016c8dfa2b8ef36fa5 legacy-trunk
+8606 5dc078b213e582d71ea81cd0c006c4dfc33af2c3 legacy-trunk
+8607 2d9582eee112e6e8cadfd64f1c24e493d13e860d legacy-trunk
+8608 8542b890398995f9c0329ac278b7182709144a4c legacy-trunk
+8609 94605b0026e7f6bf3772a7c051e8a626669b3365 legacy-trunk
+8610 b4a0be5c42bf759b5c2f0f289b2181b943f78e3b legacy-trunk
+8611 55283f681a1c2101d19e7f370e1cf3969612cfba legacy-trunk
+8612 32f65741743bd7ac6bd188366862a3faf0d4b01b legacy-trunk
+8613 57045f51dd12b04d2586557f928a22f12c0db462 legacy-trunk
+8614 40abf23e168bfc3bacd1d593bf6f61aadb35329c legacy-trunk
+8615 f80e763c1717de7911082e25081b52493133e10e legacy-trunk
+8616 a287c5014e66a8188bae29101e26ca1f6be801fd legacy-trunk
+8617 3c9512401f6d6b76f9b109b3e6ccafa2ac7ad432 legacy-trunk
+8618 9f616a49219661910079f5cf33d2482c56f45df8 legacy-trunk
+8619 144db635b49d33e99b6fd1e5b737745cd1757ae2 legacy-trunk
+8620 c2334d97ce14ca41695e7a9936b6670f0457e80f legacy-trunk
+8621 14182024011109dce5e357b4889af51361698cb5 legacy-trunk
+8622 341fcb7bad903ba290e8b2ba09ef47a16c45af8c legacy-trunk
+8623 a2a1df0ca808f6233492322a377153b8e7aac35c legacy-trunk
+8624 b76a44163e0f603b6dc4c8aeee2a6acec39818c1 legacy-trunk
+8625 4584f08930ac91b403797498c3fe5ca98d4fa19a legacy-trunk
+8626 bb01113087ebc50a37158c07ce6a99b385dae4fe legacy-trunk
+8627 9a78ce1db8f68ef1989a4c0e4b74a07ad978e4be legacy-trunk
+8628 9fd60e640ae5d097710ae341f5c4b395f6da173a legacy-trunk
+8629 d7cbd2651e559bbdfb72f984f8a606ac5bdd0b8f legacy-trunk
+8630 17a26f986007884231775b819ad4e33b17318d18 legacy-trunk
+8631 2ee9811c92fd4b2ecea6620c9eaf727b377bb8c6 legacy-trunk
+8632 47867006f076ae85576ad2d8329cb06809f67bca legacy-trunk
+8633 1a2bfa9a03f742f86498d9ec207aaca2a0c6456f legacy-trunk
+8634 647e60fb3bac3f7c04b310f6430ab3703670fa21 legacy-trunk
+8635 2e0aa8d813964bb6badd9a80d313ac9540ef41ca legacy-trunk
+8636 2b03a1dfdbd3fe6c84531f0e1f498a97524cb145 legacy-trunk
+8637 79592761b331a063f3a58ac25da5aff56367eb81 legacy-trunk
+8638 d3d5a25f3b705ca2563e1aa8e1c78c4bb21349dc legacy-trunk
+8639 9183a3c6b85fca362bcd85ba4fce53ab54fc6064 legacy-trunk
+8640 119d184bb5ed890e8177247fc4ef6a6996b869b9 legacy-trunk
+8641 3ec5ca8af91d1c6358e5aee356fdb38f50fef667 legacy-trunk
+8642 29ddf104984274aff2b59c32c8e4d42059ad55f7 legacy-trunk
+8643 a18e1cebd29fc8cff483d0057ffed08858905b37 legacy-trunk
+8644 9e432468f75605d6b0445fbaa92fe0e7acac6790 legacy-trunk
+8645 2514e9fe29f6d739a3f14f58b847bbccb82dd7b2 legacy-trunk
+8646 433d3e1c02f7d069facf334037bcb395c8d792d7 legacy-trunk
+8647 3e6d688b0d2a272bf251a2ca23a2c63fe55ee023 legacy-trunk
+8648 9a3e6f0d6b5a9775240f3c2cab50ec218ba09259 legacy-trunk
+8649 2f60834eeaf5d63a96ca9c840d77cb7199dae0d0 legacy-trunk
+8650 253e11b61106d8ededd3fb159ad844c06651a747 legacy-trunk
+8651 77135da9f36cdceaa0c8bd9cbd25a3ee19a6cd9f legacy-trunk
+8652 19fe880ca919fa75553d6c777253731a6ec9abbd legacy-trunk
+8653 18f824e5b9eae9bb5169aae5a45b7901682f117b legacy-trunk
+8654 aace502b8e8b13449bfac09bb48564076645488a legacy-trunk
+8655 b55b217f2e0d79c3f38426d6b341c6de4d6c878d legacy-trunk
+8656 6cb66f0ca8d5408f4aa88fcc2fb654988e0b5e5a legacy-trunk
+8657 2ff76e9bc85d7fd248888175e11b6f1b58af9e2c legacy-trunk
+8658 ef9a2953f933439eea44d1331a107c07f5476397 legacy-trunk
+8659 43b8c4a696d114cd0d1c3e5b1997089bb7325084 legacy-trunk
+8660 64e194c5f854d07524b03c64ac0721662dd47eda legacy-trunk
+8661 11249d43984049c062122e407408f6e0e16796c8 legacy-trunk
+8662 32aacd753f343aa38bd88eaaf639c708387057eb legacy-trunk
+8663 2e755d1ff661f150a881de2c825e210fc03fbfa9 legacy-trunk
+8664 3eaba251a32998a852adab0f49f4e50e248dac85 legacy-trunk
+8665 b7c2ff3070399a2a0924c6bb1afe9ca9a413990d legacy-trunk
+8666 e4710119b41cd6124904cd1edd97714ba12247cd legacy-trunk
+8667 b5757e87eb32ea288b03425fd9216427b140b2d3 legacy-trunk
+8668 3a6b7a377dc3a963f39b43e4c45333d611fb95b1 legacy-trunk
+8669 12b8a43599d3373481cdfcb3a4c61ee0e43df375 legacy-trunk
+8670 bf7d7705dce5dcac26e3c0065c4721ce8f25de3d legacy-trunk
+8671 cff105a3a384a7e72f497d6372bcdc99c5f7ef42 legacy-trunk
+8672 d97980e7c05f305d4e8de3042b487daa16485975 legacy-trunk
+8673 ab045ed11bc9678980d9822fcdfe42da27637590 legacy-trunk
+8674 7da7ba5c652584f7f147180069ac134e70a37610 legacy-trunk
+8675 c43ca8dd00818769c798b1c69bbceb11917198f2 legacy-trunk
+8676 fe89709c2eac0bf77e01e07fe058029f104bbe5a legacy-trunk
+8677 c57cede3c7c0022ff1b0ede6d71639eadc74bcf0 legacy-trunk
+8678 dc974b3a6cf4f722f6c8e70196338e5f2e60dc6b legacy-trunk
+8679 ba2f11a82f277c5fd5db9f60baa96a792c3bbb19 legacy-trunk
+8680 f57ae68aa3ae526ed678dfc40f9d1940bab1238a legacy-trunk
+8681 24d668454cb0002319ca01cd5920b60494debe11 legacy-trunk
+8682 e554b9f4a3aa929e2bd71c96d92281bf6b1e9718 legacy-trunk
+8683 77f5b6cbea6624088b75dae1067a469949e6bbdc legacy-trunk
+8684 9c2ee6bbdbb3237f616e227db9f593ea195eb314 legacy-trunk
+8685 7b45d92e3861e3760d888eb2697b0f37f695ea0b legacy-trunk
+8686 fe3fac1a3e517846bbb7a9e3e4cf8870b810a0eb legacy-trunk
+8687 6a0bf6b263964faba711455f97821723d241ea76 legacy-trunk
+8688 a12ee27cad9322b2133c1cb3abd20b90f22063f4 legacy-trunk
+8689 5088ec5a12a6b2e3050340578d4b157759233180 legacy-trunk
+8690 36dfc8cc1d013a3318724b76b6c8a838b7405634 legacy-trunk
+8691 4e1f89a12f992933714670c001e1d7093ae4fcab legacy-trunk
+8692 eb7a01b86f9316b77e9e62a7c10c3dad3fc2c1a5 legacy-trunk
+8693 33cef01961a7110b0272dcfd01f910698ef2693c legacy-trunk
+8694 b701df85c0474765c6560856632fbdeb0e86340c legacy-trunk
+8695 8b59c004a499c1261e0d974ae17e21db54058be8 legacy-trunk
+8696 418d385a9e424c4fc6b7533320a7e15542ef3cc0 legacy-trunk
+8697 ed4924f3b2a561c0c7547a2c6246da09f8ca7d2b legacy-trunk
+8698 ee5bd08517e862a473656773daba0befa02d8f64 legacy-trunk
+8699 78a4a5632a91c559a7943b60a26a114d8c723c2d legacy-trunk
+8700 80bdbc49b4c40b592872c51cd649848e0e92b9cb legacy-trunk
+8701 856d87d282ac6ba3a28ae03ba24384c37b89db53 legacy-trunk
+8702 a85cdf0befc5cbfd42c6a780aed77a4cf04a9333 legacy-trunk
+8703 99855219b37f680702d615cbe67d88f5b567b3e3 legacy-trunk
+8704 613f976a57b492d86ee6f4ace76ade1ec4f166c7 legacy-trunk
+8705 b53347c8260ef1526dc0395004d7dfafb0377cf8 legacy-trunk
+8706 4da4808709c9597757e5e53e45b5f11534858630 legacy-trunk
+8707 0ef0e051b1f8d22c13e2d45abcdf52230836e217 legacy-trunk
+8708 c89390e56b9142ec849ccd78a3eee8d960ef2be4 legacy-trunk
+8709 fc5e1e0049940ae7408d33fad963e3cd451397ac legacy-trunk
+8710 efced8326e3f250a6a6539cf7255b03c993f81e8 legacy-trunk
+8711 4e5fb8d9acb1c63c9570206391925b32f1a734ab legacy-trunk
+8712 24845968323f9102d402b362acaa6e61b4af62b2 legacy-trunk
+8713 6dfec320f9109e14a23678d7a75660ea25673f34 legacy-trunk
+8714 03b8793f76c2cbced5863035309a2854001726ad legacy-trunk
+8715 4462d3c600bf972ac6af621b3716154ce1060e68 legacy-trunk
+8716 f60876835a759c21ee447aa0f4bea1c0682e9769 legacy-trunk
+8717 3b5bbcaf917f87c7ec1b75cff8061fce858a9779 legacy-trunk
+8718 ab64344e87dbdb5b276946e4482b9b68b7eeb112 legacy-trunk
+8719 21a28490bd961ce8c1df8cd7de103c497f2d1afa legacy-trunk
+8720 4279f4eb210a214f0ff0f497272d7744f4dc7357 legacy-trunk
+8721 5ab21d1b61d86bf33b02e3393dab633e4ef022ca legacy-trunk
+8722 15bcec3d32599e6498d1a13e76d8389d71bb6893 legacy-trunk
+8723 4cf20fa883a92e1e74a91785faf083776cb2ca53 legacy-trunk
+8724 1496444e8c8b83047d24aaefe2eacb5603395db4 legacy-trunk
+8725 af114ed9e61ded60a7be97d94e93208f51ea652c legacy-trunk
+8726 f10aad73e0293110257a4f30c6494295f0b2656a legacy-trunk
+8727 3fa4b7ae0e6bc1f0aaae401f05cc9bc80f6fca0a legacy-trunk
+8728 3e0aa7162c881f63d7fbefb857f1c6dcb6eff570 legacy-trunk
+8729 6429db5d0af72d0091eb091e44509fa67c203134 legacy-trunk
+8730 5224ed877bae7d56b4de8456b239757f4b3fbac1 legacy-trunk
+8731 4c76ee01df08db3c4ca41d00253d26677d926797 legacy-trunk
+8732 f446e08ac3027b86f27b3ad66a774bc985dc79ff legacy-trunk
+8733 ce2092714484369e88cae262b26544852e02a9a1 legacy-trunk
+8734 ddd25510f3fb6f31bfff1af481e95753675621e4 legacy-trunk
+8735 7c1ea85e26842abd42dbeae2632c09eb0d59f830 legacy-trunk
+8736 4fbcc42890126c2b6c99ca649e397c36ad236c71 legacy-trunk
+8737 c0cd23e708b586ed288d2ed31f2e60c0fc962c4d legacy-trunk
+8738 d97941ec5eed01154aa7a6b31694f6406d9dff4d legacy-trunk
+8739 5074fab2925d8ac0a853aa5c8186dbb7a9a412fb legacy-trunk
+8740 aa6e0504e0f2ab687350bc0a6798b1f1c4915080 legacy-trunk
+8741 3df22edcecad869712d95ca6c7268b33dcf77a03 legacy-trunk
+8742 8a50249aa72f33d2a92a66de98b00e0fd3f64c9e legacy-trunk
+8743 8c1e020893798e0f3f93a1e272707f3932da005f legacy-trunk
+8744 eb8d1a098b9decb146cf1f260a87981995caf31e legacy-trunk
+8745 020a3c8ab070ba36645e009c878ce2ac07fc1504 legacy-trunk
+8746 13c5329d2c2e912faa1cfb3fe09f69381c58a9c0 legacy-trunk
+8747 dea8dc4b8e225dfbad51d80241b1c924dc8b19b1 legacy-trunk
+8748 e9926241faa4032fbf2d10e214a4ead5c09bf358 legacy-trunk
+8749 775899583da69d104a3618a9cfc5e8aebd72c685 legacy-trunk
+8750 4333775b55fddef6ae5b4c6b44e03f79836e9f0f legacy-trunk
+8751 7a3808edc5390435107a11eb9e49c5bd5dbffb92 legacy-trunk
+8752 f9fbde75c5365a5f580896704814b1b44dd9248f legacy-trunk
+8753 ed74cc59c8a2c504d2939ed4f69fbc0a64c7d3fe legacy-trunk
+8754 bb5472fb4885b9502ca2c73bdd7cf9a71d2f0cc0 legacy-trunk
+8755 2984416a1b2b238c6fc5fcbba80c4c46cc20ea0b legacy-trunk
+8756 07860049f1c4515ff925cca5c9141fa93188d441 legacy-trunk
+8757 a266e94ca5e1cd94283ead672f11e133c4fec56c legacy-trunk
+8758 33ef7ba6e74ba5136bd8bc08d0eaea634fa65a46 legacy-trunk
+8759 f6839e532be2b4ea51252128140db8386ac7255e legacy-trunk
+8760 ebdc48d06cf85ed0295da62c7e7302eadcfeaf0e legacy-trunk
+8761 daa62c2264b5259956971ece81505c4f0626da16 legacy-trunk
+8762 337054e9d4fa437565c4f81725234f25edd5c4df legacy-trunk
+8763 82cd2baa413646f6cc80d5ba5b9e80e87a29b528 legacy-trunk
+8764 489db362cd48d0833a8ba89029a74a83c9c14035 legacy-trunk
+8765 5fa4b1033b06fc1951eb58cf08a536f52bbcbb64 legacy-trunk
+8766 65446044fb8f7129bd6eb40faa82f65f6f5d7d5f legacy-trunk
+8767 47fa3ddfb090c95befcb27603c62f82240d19622 legacy-trunk
+8768 3d61474a1550d865457319c9807fb1d53f06db54 legacy-trunk
+8769 8e31f1c07dc5b2ef01104ea9abb0366329d8c84f legacy-trunk
+8770 6c0a2658a156108a04e9e0b32bb5c9f97d181378 legacy-trunk
+8771 a84ef0a711ba092b70827f013a1067506c502592 legacy-trunk
+8772 eabde86d97f0697f258c9b7bc8cf24ce9eb3b93b legacy-trunk
+8773 c0d43d6f5240de7e99066e81d96527beb9f0bb2b legacy-trunk
+8774 509474b88b01c417c338c388da148b76bf943c8c legacy-trunk
+8775 ebd099889721c4809af0fe58ed88e08fc358e31d legacy-trunk
+8776 0054a3840a752a53703d2c1da142323aa6d2f312 legacy-trunk
+8777 49105b9e99474478830b57987302d56eb9acac32 legacy-trunk
+8778 a43352f0e1ee6baaafba877b2690fd238664addc legacy-trunk
+8779 a62d6d063c0f08983a26e711746d3f3f41b01e0d legacy-trunk
+8780 cf0effc3f585c788c8ca0734567ba0211b9771d6 legacy-trunk
+8781 b378a0886620151edc38897f7e7bc4d23148f933 legacy-trunk
+8782 6e1fa76e79407d243abfd079b37ca768392fb2ec legacy-trunk
+8783 59a9fbf5912863faa0d17849071df2788fe6af94 legacy-trunk
+8784 e1ea4ad461f923b9999e0e8289e3908ebe2def07 legacy-trunk
+8785 ea6e587136b6e3bbd0081a884ce192b68de0667d legacy-trunk
+8786 904a4d783a3372b3f21fd50c4eb52a9651881d1d legacy-trunk
+8787 eb5128e8a8e8e3d7296e87616bbf5d2de6964bda legacy-trunk
+8788 13fbd98d81cc061c7395b1b71e8b36d4cef2f87f legacy-trunk
+8789 7ba79c949b3a7278fafbe0be8ee218bb9e71867b legacy-trunk
+8790 b9458dc99d50a0f1394086f839a8a06f2719be9b legacy-trunk
+8791 4b785e59e8312200551eb7c83548dbeae92f2e81 legacy-trunk
+8792 d25489c5a22f4ffafdb07acf8de4c17daa9d4743 legacy-trunk
+8793 c2359665be80730ce12a7ef6d32873e379f419f7 legacy-trunk
+8794 71b40cc4cc0372f3cdebe2994fb0bde150f8887d legacy-trunk
+8795 cdc5a40fcf974e942ee6f79941f246205ab54030 legacy-trunk
+8796 b7f0b98f532517f75384a772ac657ef79ca0a9d8 legacy-trunk
+8797 a75ca74deecacc88ab93e3d00af99aa3b23b7925 legacy-trunk
+8798 913cd1f373be47b6e9305fecbe2d633dccd5837d legacy-trunk
+8799 05d943c4597c2dc3eef88d8eed451583585245cd legacy-trunk
+8800 3f8d7f74f1bc549a346bc2d0ddbab565ba987b30 legacy-trunk
+8801 20b5647a067ebfefff588bb58b72739d086db615 legacy-trunk
+8802 5cdc3ca053d6e810a565550fc12402d7a4fbf70b legacy-trunk
+8803 b0183994021b372fcf513a2883107381a4e8763c legacy-trunk
+8804 4b4775b49bfac44b617a64cf92fa40e61ab68af3 legacy-trunk
+8805 dfeaf965f48ad32f0bb0e9e6c520aa9f25c82175 legacy-trunk
+8806 fbdca17283c23bf004ceff279972321c175d82df legacy-trunk
+8807 172c7febd7557a500e369772afae2c0513e0003c legacy-trunk
+8808 979c71238e5bb2c3c248a9ff09ac28a525f413fa legacy-trunk
+8809 2f4a925e8b4b24143d328c2063bbe341f8dff4d8 legacy-trunk
+8810 dd102766ea5121bcb303203d80ec6eec83180229 legacy-trunk
+8811 fc1c0a27bb9638a6e0d160599c07a1aae5df94cd legacy-trunk
+8812 575f6b910f88b416a76e3c3230263b50cc159259 legacy-trunk
+8813 a42b31fe976f55441a29cd459cd50beea52fbf2c legacy-trunk
+8814 9e429518cb2017450dd2ddac520fa2c49ed911a1 legacy-trunk
+8815 4b076fc5ba403eaad5d00f48981168573d1ce6d8 legacy-trunk
+8816 6f8eb4a1fa07eb799181d2f0c0142e37b26aecd3 legacy-trunk
+8817 593f541296616a39c8d390adc4247786c5a86fa1 legacy-trunk
+8818 1ed914f8bf0a0fec8c99f2efba3f892dd57a315d legacy-trunk
+8819 e9ed064f39f505cf7b509df76253b15d1ff2ad3e legacy-trunk
+8820 689de613ea1cca271779b3df0a22e78dc8cffa26 legacy-trunk
+8821 e4087cd40c85d800dbed36dbcf1fd688d613d82e legacy-trunk
+8822 98dacc8973a1202f6428aec2f469ab54592e821c legacy-trunk
+8823 a5f29a560c09a338841a7a7d318e568edb671529 legacy-trunk
+8824 2656d1eea7922db9f2d50de8eafa64b28d623036 legacy-trunk
+8825 6a3b9e7d43c1377d233f398d702eb35b02cf53f7 legacy-trunk
+8826 b7331bd0ccf577cb9a9a61a8309134b062ce6db2 legacy-trunk
+8827 9a121b3fbebbbaf1a5a5151d45c041b16104b5c4 legacy-trunk
+8828 3864df294979a06961f3cb97dacec5e0ae77fecc legacy-trunk
+8829 b62a7a59414e7f3e0f785597edc594f964d58f89 legacy-trunk
+8830 666accd66878b768103bc801f0a8bee79384eec2 legacy-trunk
+8831 f4dcbc027cd22ee7ea41b76263adf7d55a0cace4 legacy-trunk
+8832 2e40e27f8b260fc4760b4713d1974bfe4496b8fa legacy-trunk
+8833 a857d2f873364c0f3e8cdc2a9900b5f425552420 legacy-trunk
+8834 174c1bcc8e2d0d828ef96c828673e77ec29bd271 legacy-trunk
+8835 9e82dd76288e8f1930a49bfc3f8fb2df73d466da legacy-trunk
+8836 7df78f9d6d347777aa13a6bb689e33cd13e0ef6e legacy-trunk
+8837 d64e85ed7b441dad7df2068c560c2f275f70d63f legacy-trunk
+8838 0e7e2004963728a3652eeeff0d47cfe4ab743578 legacy-trunk
+8839 32663267eb4061960c0589e0cbf821a4b38ccf59 legacy-trunk
+8840 0c74688bc1ffa49360b9f83a58bdeed0421e0d3c legacy-trunk
+8841 f39bee3ff22bdac2f1e22ad9b02d2981a87c3877 legacy-trunk
+8842 21b93d98926b815ac9ece284d4b7c6482eca76de legacy-trunk
+8843 71c3beb294999daaaa82f847567b09c500eeddf5 legacy-trunk
+8845 2c29b898264337d02a00f6dd5d94ee58a50dca68 legacy-trunk
+8846 94e0b31fdf5f28331588871ff1daa254c681d97d legacy-trunk
+8847 f8224046ccf8cb3362514a86ce39f9d7a7b5eb19 legacy-trunk
+8848 36405309397fc2649067b928e02e6bd11f032732 legacy-trunk
+8849 678a3f1d0c809c700bd2f4f6493d9378b995bee3 legacy-trunk
+8850 c7139b6f73406e1bb28f10f41bcc81350e77e132 legacy-trunk
+8851 47a9a6de23ffc23af28c23c38674554aac74062d legacy-trunk
+8852 f6ef9af4c8b954a55a7b4f8ebaecd164c658dc8e legacy-trunk
+8853 b68185d94777c0d1ae2a49bb4950db4949dd09da legacy-trunk
+8854 1afcac7658e5746e413d4b20c31e634196ce63c7 legacy-trunk
+8855 4cb223f293376fa7ff06d60e39636bd772e118ad legacy-trunk
+8856 8922c7f3a28551189721302c822bf62f1d0538f4 legacy-trunk
+8857 b83ea2fef332b1aae8ad1b3ab0f221cb21316de2 legacy-trunk
+8858 37ff71cd941eb04e743bae5e65b4bbddec915446 legacy-trunk
+8859 44904764dafa8c74d32cf96d59455c0d9db8afc0 legacy-trunk
+8860 16cd39805fd5187ab6f82ffabd1f931b9ece4068 legacy-trunk
+8861 3f1952534367b99154524568f770e95f39171453 legacy-trunk
+8862 238a8b6096e1bb1f27c5425939a1d2ff273c6b7f legacy-trunk
+8863 14d58b5a21c40868bc1b90ac88955d47e5568eff legacy-trunk
+8864 505f52010f2af9df496f5af6c5a76633e5881dd3 legacy-trunk
+8865 833fb01409f349a4b95c7bbb9611438dd42deee3 legacy-trunk
+8866 37e68b4a5397336320c6eb1312037fa2ee52e6e7 legacy-trunk
+8867 bdf4e27f5b9e3d133ecc2d6971f0a4499d89e298 legacy-trunk
+8868 a2df3c9e5f43acfbf4266abcf1e1f4329e4f9da8 legacy-trunk
+8869 7cbef0d74ea341ab18023431d47d7b77c984d023 legacy-trunk
+8870 24f29586de9690367fb0d928d1d622ab577e907e legacy-trunk
+8871 f6f2511bb6baa2f80c4a8c5f42338babe476c5a0 legacy-trunk
+8872 784a16f56643474888867efd81a6fbd4842f38e9 legacy-trunk
+8873 22dae2637e082ed06879e4acaf8a35a66d23244f legacy-trunk
+8874 6ea926b46f8aebbff0e9d0c8a383bc94cae31898 legacy-trunk
+8875 4d55bfe1febbec636216612cdd1a9aefc04268d3 legacy-trunk
+8876 9ed9eb4a7f23a4ff81529761521dc2df7453ccef legacy-trunk
+8877 c7fe3890f103e664f08d93067775ecc50bdd2fd0 legacy-trunk
+8878 0490f6a84d34751698e39cfc3b89f0c8c93a3d40 legacy-trunk
+8879 3224878bd8b3a8e0190de875c87aa11bef40d1f3 legacy-trunk
+8880 9f8134e95565b4a6e41e8a089d2bf88b4a8336a9 legacy-trunk
+8881 9452b77d67ec9fa0e6f3302c3092da5808aef0f6 legacy-trunk
+8882 ed6f6f03221719b2f660e80f19a902b57eed62c7 legacy-trunk
+8883 65177ab6a696c5199a0cfbbdce0f40d6d7bc8e1b legacy-trunk
+8884 81154a51c16ed2a6defe192ba1e2c5fdd2714333 legacy-trunk
+8885 57484e21e3271db2d9c4be312e9f7e9afbb20d15 legacy-trunk
+8886 184093d96d2a2bb8dcfaa0fceb84490a8ed2fb92 legacy-trunk
+8887 4adc7e96aba2528d671c4f4984f9bce0d61857e1 legacy-trunk
+8888 4393800f9261598122b6d8f1e9bcf0e243f6645c legacy-trunk
+8889 38655e3ad19257e35f184bb3a703e8c3931fe51a legacy-trunk
+8890 04f3d259f9e99ac7e867ab3a4a22b37e6aea77b4 legacy-trunk
+8891 c378e7a0234a2a1037b9aeeac1f47d0c94b83cfa legacy-trunk
+8892 ecc53ea8d4eb65c0624c47f15acfa8b99e8689e7 legacy-trunk
+8893 23083bd8c26189879cfc41b7a24d69b08c0918f2 legacy-trunk
+8894 7f77710a22d0a671eedff1e3999d905adcc57056 legacy-trunk
+8895 4491f84ac223a16e912fc704c1606a8dbf3b9c20 legacy-trunk
+8896 48df01eaa09a245e82540505a3f3880df3ee4e89 legacy-trunk
+8897 6f06410e307af45375d9cd7bf3034b83ccdc15c1 legacy-trunk
+8898 abed754c7b7f5b1309cb70b1d048d7f63759fa10 legacy-trunk
+8899 c62e34ea464b2d40e7ed66490cf266c287c926b4 legacy-trunk
+8900 fb9b0d246ef34ebf618f6200eb75fb13b8c421c3 legacy-trunk
+8901 644484e1a37b7ee2bd435da9c0b6efa6664175fc legacy-trunk
+8902 aaca47ef55a8d483e9295bdc85e1b86eabcc1fca legacy-trunk
+8903 5f0216302cd8f4c8375c76d41432ebd632441db9 legacy-trunk
+8904 068254fe5617e4bafb323690a95e9d76db6f29fc legacy-trunk
+8905 aee56e9d10fc93592a1b38b5a0d5e1123b77eb8f legacy-trunk
+8906 e356a344819d7a2260db691ce4f88d57125aa6e4 legacy-trunk
+8907 14a711268c51bb6937b1708923eb09f0a261d9d2 legacy-trunk
+8908 e78b6174bec923e0a3eb8a7929f855db936b2e9b legacy-trunk
+8909 0df0159051008eb51bbd98b538c3d018a3660466 legacy-trunk
+8910 ce56a7cfe96cfd101c6db31e6696f6674212b450 legacy-trunk
+8911 435606b215c52baecfe1a44d097b2d2abafe47f5 legacy-trunk
+8912 c83a1b21c42d2a0860e229fc0fbcad9f0c3915cb legacy-trunk
+8913 053bbab0ec53e2112283e18936781073ee958438 legacy-trunk
+8914 e57c72a2b0656d1fa0b11e2017c73e7b28186393 legacy-trunk
+8915 f384cc11b75bf061325d8ee30d1436fe14f606ad legacy-trunk
+8916 9e46ecf03c3e8330e93a1e275e4cb63e205f51d3 legacy-trunk
+8917 d7760a1ba4ca769e6247a5c1fc3cd8ecd1e7fea9 legacy-trunk
+8918 42bc792ac69fae55ff2304f42ee547c79278fe31 legacy-trunk
+8919 d9e51451ebdf9302c4c62fd0e3b89fc25335e641 legacy-trunk
+8920 ddfcefc0d826807e1e9a58ff63a3c0fe74a2d9de legacy-trunk
+8921 108fff25462d5622dd6a75e6447983f863f0b6a5 legacy-trunk
+8922 93c015ec2d57caaf860d394fd72f04177b114548 legacy-trunk
+8923 bde5aaf3e589744b34cab2bc60191f9df39a189a legacy-trunk
+8924 5803782e73ffb72dfdd8f93a5fbabc14d9d6a053 legacy-trunk
+8925 31a50468366bae37ccc116fa8048b2ae13854543 legacy-trunk
+8926 b854ca4605e12298140bb270e35ec7b6c7cd50cf legacy-trunk
+8927 3350c73550ee83d230926f7b71990966b7c8da1f legacy-trunk
+8928 77a22d49dd8585deec21fd54def59b2dfbaec6ae legacy-trunk
+8929 10413179a72a58903e45c85caf0a71059babb4e0 legacy-trunk
+8930 7ea465830ef45dbdd309d7b5fcd894395c12a1a1 legacy-trunk
+8931 c9b139b9c5fff503c7f5c0d3c0a32f60c9d7d524 legacy-trunk
+8932 b5b35a0cf1aa9282626ca909edba429efce9837a legacy-trunk
+8933 2138cf3bdc5ab858fb25b40abf4f624b9592f7ef legacy-trunk
+8934 2c5c399b6ea463392e236313a85fb7e0294c4e83 legacy-trunk
+8935 90eed9a5d07a8358d12104abbc2ab08c3bd48bbb legacy-trunk
+8936 39348974b22e89007fcdba941fc28dc780e99da1 legacy-trunk
+8937 b65eb44422ba9322f791a8e43af63e4053285f80 legacy-trunk
+8938 777ae5260a12f5c83c7eb7141d8bda7e0c86199d legacy-trunk
+8939 9986272ce24a15c4efabd6f0d36ef8905be2d5d6 legacy-trunk
+8940 22bed5794514c6279107513471924724432ebb88 legacy-trunk
+8941 0b2bcf0424a053a56ee0ca68f7ec3db2c57618df legacy-trunk
+8942 4d545cc6fa99c4b0acd7cac1a4d3fd905872d2c7 legacy-trunk
+8943 c142eb533fb90f9b321341c71758bf1f24b048ab legacy-trunk
+8944 94163759cb021bda779c62d104c3873f37a146cf legacy-trunk
+8945 6a91a0f642fe7b0ac36b74432c602b5b9dc8f67e legacy-trunk
+8946 103c63983cdfa4dbca308d5bb2f8602ab89aab8c legacy-trunk
+8947 dca9bdf5ea08a80c1f3a6c1bb3cb63356746b43e legacy-trunk
+8948 ee4f2b1ceeda4aac26d4443763053f0de7cead95 legacy-trunk
+8949 df659e239e906d9b6167cf71725e62b03af09fbd legacy-trunk
+8949 746654a0af680c7d9b814b210a026eb91bec9533 legacy-trunk
+8951 2ede7c2ac92cf1ee89e8e52419c8901b034b7586 legacy-trunk
+8952 d153242aa6bb2dc3b1fbec8c9ae2ae78594f681b legacy-trunk
+8953 f5f744ed8137c7cc34bfd118d65c623e6e414163 legacy-trunk
+8954 7ab0b05293aa42720d151ca83c7e3bdeb9a5511e legacy-trunk
+8955 c67d8421fa21666808a24c623877e332d7e4c53c legacy-trunk
+8956 297a541eb86574c2327b2c0218d69134a1f0a971 legacy-trunk
+8957 58b4d9ea8e513842f347e3d5a432f3ebfc167242 legacy-trunk
+8958 727b52031212577d9ed5195f947bf0af014714d1 legacy-trunk
+8959 cb05ea2b63d9d000067b5c2e1572fe163c508737 legacy-trunk
+8960 d311b68754c186e8cd3de702bb6340ace9a9b2c7 legacy-trunk
+8961 563ae21b205783639d8618f9c7a9fc0d0df89eb6 legacy-trunk
+8962 b8e26078d8b1ad38f4a2ad12b0b8f4a76f5dfed4 legacy-trunk
+8963 2f258162aae2acdfed76c56ebbb2bde369195dbd legacy-trunk
+8964 1618060716e7819523bf1c5021512c8e1344fa56 legacy-trunk
+8965 630725805c6622ffc724e8840e27ffd0176c4cb5 legacy-trunk
+8966 37c8d7f967c71c0de414baca92b71e9abe68f883 legacy-trunk
+8967 4e1a0fe0ace24f562846102580652e44a191662a legacy-trunk
+8968 2f9d59da72fb86f404b7a0e415c274c009eb485e legacy-trunk
+8969 ae74b6ccef57d437cf7796803ad5cf0fc0d23d4b legacy-trunk
+8970 222dd4d06581294f229565c447f9c491a283e96d legacy-trunk
+8971 bb8c3004d758ec1be9ed731689b50f0ba50324a4 legacy-trunk
+8972 17e3d9b6b42e82858134c2c43c07b66dd4d405ba legacy-trunk
+8973 39d2a4db7c3b80b8036b36febe6b92240b55ff02 legacy-trunk
+8974 ce45ef4c65e91be7b29b5a135b9714af1161c7c7 legacy-trunk
+8975 b38a755b8db1c87aee30cb229db384162d5535b6 legacy-trunk
+8976 4981fd2b3211406aba5d16e4c4ec4ebcb9ce7716 legacy-trunk
+8977 6a08b60de82c7230b12ffed065d8c6aa619b58db legacy-trunk
+8978 879130f1ff5fcb122c7285072a4786a04081bf96 legacy-trunk
+8979 9ef9cadd978c54a812a965c5b59370001acebcba legacy-trunk
+8980 2a2e5b731d1c77633999a12c9862021cf6522249 legacy-trunk
+8981 98b2a0a093c9d49c97dd7ea5ddf3f5927efc380d legacy-trunk
+8982 071a0d3a49b9f90f5c0bf0fbaf0eff99685bf249 legacy-trunk
+8983 b0494bb5201994f91496674f5e4c9b4442e2d79e legacy-trunk
+8984 df6dfaac2d0b51a2efd12dfcdc1d5015346b740e legacy-trunk
+8985 a00073f2e087ab4ce1729c1b20b8a46db2afa476 legacy-trunk
+8986 80735fcc35affb728144f766ec1c54e4ba96a76c legacy-trunk
+8987 f022bbd123386801d1d465a18b709428a89393c4 legacy-trunk
+8988 74518d882ed31ae9435a2be117e74b95aeb7a3ca legacy-trunk
+8989 fdb77636c074302f06a583441351d79e22473531 legacy-trunk
+8990 a3dd591081196a2bcacc3f64be208b98638c90e7 legacy-trunk
+8991 6c5f7e74fa8801fe8ce8122640c544b7651ca530 legacy-trunk
+8992 6d9cfb53c7ed2c2cdf4290d81c393f8338b3d339 legacy-trunk
+8993 eccdfd172740611eb15b5f05414dd6a8d9505487 legacy-trunk
+8994 7e51727d3b7ef3e4230451db3a9a4d907ebed07b legacy-trunk
+8995 1d30e52dc34d9b43571ce2b27021ca88e4634949 legacy-trunk
+8996 1aff19783d746f1b73e967ec1b5ec9c8e5a089ee legacy-trunk
+8997 24da035ceb6ebd1c85c82ab114339e154e875ba6 legacy-trunk
+8998 f1b1728452c130b2b545cf078bee5a5beadc3795 legacy-trunk
+8999 3f84558a24dd84ff2f34812eb7be35145dd6188b legacy-trunk
+9000 9614fdd813936ecb88b14538dd678704551f345c legacy-trunk
+9001 ee496ef1ca8399b72f3ef4e0f55542b65b093e60 legacy-trunk
+9002 e9c67c192cdb66742d1390f259a40e9385ba7ebd legacy-trunk
+9003 5ccb12affb54c0c7169198b14ec391319701c155 legacy-trunk
+9004 46fa4717cf24acb7fcc57b98ebbe854dda364a39 legacy-trunk
+9005 bc1900243e339a0fd2f0e02d53b7968557ab034f legacy-trunk
+9006 723c898831881d075d0829ee916584db507ca603 legacy-trunk
+9007 89e2eaacfd9000add71b8f1ac7777d97f98f361f legacy-trunk
+9008 0cd1f2f1d82d1c958375dccd6d659d4f8ee68f27 legacy-trunk
+9009 e497a7fc0aa856c85845fb0170608288d693b0ce legacy-trunk
+9010 d369629e8c27c0a3dd0b8fe03fd9a129bf5c08fe legacy-trunk
+9011 ba65372408ddc6bbde1a2df3583ab8010fb57bc0 legacy-trunk
+9012 0864a5566d89abddd5aeae1f6109b83cc7a0a86c legacy-trunk
+9013 64c5efa9d2c4e4c00fee924689eccc699cb73b09 legacy-trunk
+9014 18703538af48181718194723e457e02f7cba363e legacy-trunk
+9015 25505e563b37b72fe97bac231475763a09333410 legacy-trunk
+9016 a1a2b711598cd7aae1b2557e7fbc853c8f0286ee legacy-trunk
+9017 d1f46a08d78a86d2c5911f68068a187aee5f6be3 legacy-trunk
+9018 80fc0a9068852eaef8ef2b02aa8a27e0ca98d88c legacy-trunk
+9019 b2dfff06789c6df772672df38efbda818aa153a0 legacy-trunk
+9020 62bdb1cbe0f55f975b67780d419700b3cd46575e legacy-trunk
+9021 fc327ec15c7ede2df7fb6de328bce01a797e11c3 legacy-trunk
+9022 d28932d676c8b9e4c585dfcab991fc4c5d6a390d legacy-trunk
+9023 b4503228583c4b467b3c505a4fbd3f95cb496275 legacy-trunk
+9024 c915c94ebb6bf3a8a023fd045c2b5fa7bb9968aa legacy-trunk
+9025 724382af5339b8e3d0a06514bd7f1f869606b448 legacy-trunk
+9026 dd1e83323c45fde1708169756b7d754997576a2f legacy-trunk
+9027 a8e3b2e9f5d2280c214cd2a5f8a5acd5915d5d4f legacy-trunk
+9028 f406ec35bfca6977ca52efafaaf0515e66d7e878 legacy-trunk
+9029 bdd4cb2a83b575017e543b83d4d644b9bb2dd951 legacy-trunk
+9030 5dbffc7844f55a9ec01970a0dbfe43f463c89e0c legacy-trunk
+9031 2c6f2d92b31508882a17c401031cc826b66dad9b legacy-trunk
+9032 7c9c4f8224c8b2074bd2ad8a049b9ff705fbc384 legacy-trunk
+9033 a5f7eb869f21c332929352f3436f48f659dc5ce9 legacy-trunk
+9034 4280b2729ccecb099b1c9c45fbe16e97f87e44ea legacy-trunk
+9035 b331cd47e0bc711700eed8ea89f146a41dfb6835 legacy-trunk
+9036 ee307f9845a326cb53502612e67584a9bf1804d3 legacy-trunk
+9037 1a233be5fc17a686806546af4d67af32a77adff9 legacy-trunk
+9038 6e9aa92fab69278fa213866b194e0a0901ee0669 legacy-trunk
+9039 fd2d4c0ae64672b97784c3866e7e35a5dc002311 legacy-trunk
+9040 53835043528c8b6f1070374a80a84a0459ddb0be legacy-trunk
+9041 2aa13c0c8f2f6609e7d5a06cc7e96f4f5f16a66b legacy-trunk
+9042 812aad8c05c291416f7e0ecc3cb7c95774fdad8b legacy-trunk
+9043 e1c8d7182d667d2c5aa62a95ae993870910a0e5f legacy-trunk
+9044 be2a0235ae84a4e49c7f681805dc507d7f25a4eb legacy-trunk
+9045 3fdd715e6ef9061eb400c5db6ba27e497d10bbd4 legacy-trunk
+9046 a0b839667d2e3fc74337d24c835608ff8b8bb989 legacy-trunk
+9047 c1bac536045fcdb94fae3ab89914d7ffea4c63a0 legacy-trunk
+9048 b1174045bc4ab676a7824f3e6ae3a352ac57f973 legacy-trunk
+9049 8b14312a0290359ddd972ad404d3eb7dc6df529a legacy-trunk
+9050 3b72878672cd2e2c3235d7311628174d09b37200 legacy-trunk
+9051 67a2afcdd21c102d503b8182bc1d51e79817e01e legacy-trunk
+9052 6ffa9cb654e2b4fcc2cfe55042d75513025157eb legacy-trunk
+9053 00dab75b9ef12e180b773ef3818bac44001a9306 legacy-trunk
+9054 d29c4b2f49ae2722b064b5cfd3c8d6c07724418d legacy-trunk
+9055 85596990db43f99a39e6c6fedf0144db821698a8 legacy-trunk
+9056 01ee5607bb35f458246b3c5c1057e714f2790ea3 legacy-trunk
+9057 921d17cc2692b293ff1cbac54ac43ecab12412b1 legacy-trunk
+9058 a1d85c0cae5a6edb55f4b1bef1dc4dcaf8830065 legacy-trunk
+9059 9e07d5b69ebae6a8829df3a96c602cec59ee7534 legacy-trunk
+9060 f96e57e69846f078ed64952f77a5c9cd4889979e legacy-trunk
+9061 08dde5e5cc274abf4cde38d1b0661f2913d632d0 legacy-trunk
+9062 c2672e5aba8b79f470e4648da805c295d7b90f14 legacy-trunk
+9063 c565272ed2c7407f80aa2281b8cc7694b526da56 legacy-trunk
+9064 753077f9eb2c8a260516269a1ad58ffc701433f9 legacy-trunk
+9065 e0e667bbc971a4ff453b20f70cc771abdd7e7ba6 legacy-trunk
+9066 da00bb4971d8f6f3133f918a372460bc99f062d6 legacy-trunk
+9067 2192b93d5337e58b1b227f92d9a4b6312eddee95 legacy-trunk
+9068 516240ef0e151dc1379eb508f14f904a41a5053d legacy-trunk
+9069 86b67709c2b402cf2d59ec872d950687c13c3eb0 legacy-trunk
+9070 14025a4f793ec5ed143e6799000aba66c6c4a993 legacy-trunk
+9071 fcd8e38b9b2af9f139dbba047cc5b449177f04a2 legacy-trunk
+9072 45e84be6d6405bdc18c648160bd79a9af73efae7 legacy-trunk
+9073 5e0b152bf1e65b1a94917e085dd97576f68d1c4b legacy-trunk
+9074 f15f0fc38cb19d77c2db33e13233cdec4cba38f3 legacy-trunk
+9075 b88fd3894d5a4d39b54d33ee592ccffa4d27049b legacy-trunk
+9076 ceeec8cb0a1e7f5c69544a73e312c7cde5f87433 legacy-trunk
+9077 6d6fec2eeef6a803a26bc91006cfaf6d230fdc05 legacy-trunk
+9078 83ccf44bf1953f944a50ddfc3a0c091494d80628 legacy-trunk
+9079 1e428f51ed4e13c941da2bf189f333412c9a4669 legacy-trunk
+9080 4514a5ea3ec4644256eefb65589be36327542a18 legacy-trunk
+9081 7a0a48d73076a81459a723539f54cdf837bc069f legacy-trunk
+9082 f67a6339ede76ed8e7f711c5c42db3e8191773bb legacy-trunk
+9083 dbb461e273adaa597daa38bde6010fd4d18cbb0f legacy-trunk
+9084 f5b55311e79dae8594e5536fac3ed42b94d12c2a legacy-trunk
+9085 2f459eb23a0ef19ff6aa5aae169f5f2326c5e320 legacy-trunk
+9086 f1e3a3f8a46cdf2e1da0b7b7832e50d59dd6e844 legacy-trunk
+9087 023e5ab0f87d8b98fead7db75527c554e3dbd567 legacy-trunk
+9088 235bc6f9e237a6805fb5fe2a720df286ddfaa375 legacy-trunk
+9089 e6b9d21c8e0c068cfd58ce8e2841f7f77ab965d9 legacy-trunk
+9090 4b2d8dc92db4cac0c17c246055b5e8ea3b6baea6 legacy-trunk
+9091 2e874a5a912f2e1ae971970585f7ae5e80c775a4 legacy-trunk
+9092 e2bcaa96c940841cdcbc28d3e51f7d9c4b330ccf legacy-trunk
+9093 e54d5171902e6a01b8a1e9d742a961b3109b5cad legacy-trunk
+9094 6fe5a51fea303dd608d3091b9d5228f473790f37 legacy-trunk
+9095 2f0b7bac201c5a2ad49557d5eb075e427a1f5bac legacy-trunk
+9096 04313d4f93ff7330bababc36b03fef6358cb7a89 legacy-trunk
+9097 3c4d6275465e8f390a7bc2fc2fa721019cfd16cd legacy-trunk
+9098 00b1b77c4177ca0eb26bb23a5deaebccbb1399af legacy-trunk
+9099 b96aad12a150bb6c3004b485d9ccf028fd2be8b5 legacy-trunk
+9100 f14348f757c7699898120dda26ea8a1a146b18ae legacy-trunk
+9101 82d6774da0c6971eea64cfaa37606635f0d89fee legacy-trunk
+9102 be07921d97131e706bb1b25d2409175f8c54d0be legacy-trunk
+9103 f88b0c2608d82ec1bb79c4dc2e9e96b539a2463f legacy-trunk
+9104 5e31d381fa47d25c0b375a9032688084d39d8d98 legacy-trunk
+9105 a839d3efabce6d637902e196e8584af7c0f1ec7f legacy-trunk
+9106 e96a81647f9c7f34cc137d49953aed22177415f2 legacy-trunk
+9107 cdfe3b7d7187d83bb437caa02f437b7c97051528 legacy-trunk
+9108 8f4d89f0f336c833d575bd166e44fa1f0b7d74f5 legacy-trunk
+9109 d5151b7b9dbcfe9e4bf13c7173c238acfb79f771 legacy-trunk
+9110 52d40cc5fa08cc5b9de210ae86679009d3a5c073 legacy-trunk
+9111 df2a2e43be18ceb3f01c7ae730dd49c1be91488e legacy-trunk
+9112 ecfbad906231420a4a9c5b9bacee1d1e67f97b72 legacy-trunk
+9113 02f59cb286faa3add4ace44efaf9f7289c6fa354 legacy-trunk
+9114 f40827baab8112a8e1524e61281283ed0758551b legacy-trunk
+9115 03392c27bf968bfdedc38c1c5557e4411e44a320 legacy-trunk
+9116 e6d786958fb307ff5a7520606f97604335d84330 legacy-trunk
+9117 da662b345c87602f66af63ee72ad3b4e8fd7a18d legacy-trunk
+9118 f90351b1581b2df1842bb5b7ff91f1673495d2dc legacy-trunk
+9119 ac4b4447386943f4630da4bb0f7a844678371586 legacy-trunk
+9120 2518ac9251f0fc2e265026b49c41d2a32e8219b2 legacy-trunk
+9121 4121704510630e035dc975f630aeebb43047c463 legacy-trunk
+9122 e1d3565d2b7a49251e6e12077f6143b05d7397d9 legacy-trunk
+9123 e8681eda085495d4181fd46b7157dd7cdadfa4d2 legacy-trunk
+9124 1da9f60279c93302101e321488b0d85d1a5939be legacy-trunk
+9125 a7ea74a27993693815b8d720127edbc4cd48f327 legacy-trunk
+9126 0f2498b847bfcc496a7ef04bc2010671051c1e22 legacy-trunk
+9127 20589ed3e8bde5ff5c82a14d03f342ca2c52a92d legacy-trunk
+9128 f6be9b5adbdb7d667729ea1d240db220c28162c7 legacy-trunk
+9129 ce5288ec36d0255e5c2514b03b510d7577e37346 legacy-trunk
+9130 5eac1c8db04f64187e11e453c5e99b46c323dc8a legacy-trunk
+9131 c6c1d133677a78555d97076b28527f9f6cc37fbf legacy-trunk
+9132 6d98b969e1f670972dd84a73c313b9b1a5e39922 legacy-trunk
+9133 466e87b147671f9c30260012ff3760dacc30fadd legacy-trunk
+9134 52329a113e0fa3ef0f976363366e2c6ca9453c19 legacy-trunk
+9135 e499c7dbfdf359a4e82c5ee050b03bb3a61842ba legacy-trunk
+9136 dead6e77f46428eea4e1e23291b53ae03f5eba68 legacy-trunk
+9137 334cbfd51db3aece0df1463552d182f82eeefc8b legacy-trunk
+9138 bb86bb76d61da3c0f0630cea421ab5dff62c57ad legacy-trunk
+9139 99955b65408daa27cb575870edbfbbcf708a119a legacy-trunk
+9140 fbfcf38d2b395fbfb7776caf56cfde00c82e755f legacy-trunk
+9141 9f02eb36b5739a47fd6520715eb74b1a161268b3 legacy-trunk
+9142 7314be6450aa08cb49f640e84b0565f3d291f11a legacy-trunk
+9143 d6d3e7cf897e0b188da599adf40de2015e80972a legacy-trunk
+9144 b2f1fec6a7023e35c6fac90d93129fbf06217d4f legacy-trunk
+9145 089c04d89151eb0cfe7a7cec8be49ec2fdc5fc35 legacy-trunk
+9146 98552704b88f27a476b0349748514a7ac11f953b legacy-trunk
+9147 2f5c8374825c85371198f5a7bb2b9380488b2b2d legacy-trunk
+9148 8e3ee3577d4e9516dbc1625679b6b019ad7f7c4a legacy-trunk
+9149 14105df33c12a21f230f2b7dd953ee5b4ab7c13a legacy-trunk
+9150 98d55793b67fbae3aaee179ccd76a3a332f8a0c6 legacy-trunk
+9151 973187f1bd1d3dc20aca09b79d01104957e9afd7 legacy-trunk
+9152 432d1be0163c75c30e83be34b56cbb0f626ad492 legacy-trunk
+9153 cdb3279b06e79d28b85942c892bec4713f8e3785 legacy-trunk
+9154 1bb8b7fe45ec3ed0a278a0cc785a3cdc4ab748ad legacy-trunk
+9155 e45b83708d9e9bbdd384354e791abd7d1cfd8293 legacy-trunk
+9156 de2f8f494ae3737ef92b8a4ed0706ce37680fe59 legacy-trunk
+9157 f95c9ae2aaefee95a70caa171e6fb6b26c89416b legacy-trunk
+9158 b8a3ba6e7bc9def6a99c42959c72c943fc485e31 legacy-trunk
+9158 8ff58b5730f06be08fbbdc2bf592226f7a736201 legacy-trunk
+9160 effa62b0062b7d2ca5abc16b49f5e462a831bf4a legacy-trunk
+9161 cb889b678053b0135aeb957fb9b317da66fa2795 legacy-trunk
+9162 017467de7933e8c73b57472d1423b564bdbfd082 legacy-trunk
+9163 83147e02e80d8e323d490baade762c99d2200e26 legacy-trunk
+9164 2b7fbd76cef87054cb4b3b10f3626a65d0146f52 legacy-trunk
+9165 a593c220edcc6593d50f6b844b8d2f60bad2b45a legacy-trunk
+9166 53a07ada499af78868e5c6f3ee637249fab6dad0 legacy-trunk
+9167 84b43ff42fa80e1aeb3779f0bac1041e36d6bbc6 legacy-trunk
+9168 c0798487b728b87a1162bcabb28477313d2723c7 legacy-trunk
+9169 d790fe25e148ef92ebd83cba6a3258b70d81cf54 legacy-trunk
+9170 4bcbbeb63b898e5432342efa69da247a3806418b legacy-trunk
+9171 40a8420b4ab36e4ee32764fdcd2a72b1c62e3452 legacy-trunk
+9172 a72bf43a8870b1e0d33437d367664322cb78bf17 legacy-trunk
+9173 b9fcb9a34332822f68c669f87b5ed9b361000a8f legacy-trunk
+9174 e92154022b48ee6cfa71955d075f35c139df7fe9 legacy-trunk
+9175 2e75b31d94c84f31a919f4a94d2ec01081b9a516 legacy-trunk
+9176 b73eb4e6facecfef9f923ae85ee8f6348c741c57 legacy-trunk
+9177 9001c0a7be986339697a11b330116d2c9510798f legacy-trunk
+9178 c69034a8b3f434f7a4f190d1c58fb31056ab711f legacy-trunk
+9179 4d63a001c25ea9c12ba856facb7d46d0155241d3 legacy-trunk
+9180 1516019c90be88f5038db4713fecf683427a48cf legacy-trunk
+9181 b936ccf42ea2d51c13ad66f38c85e930530be33a legacy-trunk
+9182 9d8e48f3b4985f06c56e187c914b55fc2264a2e0 legacy-trunk
+9183 061579395046501d71169b993dfbb4bb1fe5313f legacy-trunk
+9184 cbc5e7d6ad235fba90f9b66771bf8abd2b8c8ff2 legacy-trunk
+9185 39d96d9d3ccb56a61fce5213b3c3cd79cd763c87 legacy-trunk
+9186 47a3f3b6050263aac9aecd0692a2d8229dfea2c3 legacy-trunk
+9187 12a1c98450744076d8eac66d32bccd34fb1c5488 legacy-trunk
+9188 90c6390b494173edde842a4267a5f39eca8874ab legacy-trunk
+9189 98aa927f907cc03d545905b3216699466f74fe4a legacy-trunk
+9190 ff16448e8f2417080cbe3e67b6150b48868190c8 legacy-trunk
+9191 8a5a012307bdd10f969bc7ea6f5a9f715811b023 legacy-trunk
+9192 a5bb0b8dc32042bfc55a481236478b1e706c3e20 legacy-trunk
+9193 39b413ac2cc91c1b59d2c6b9e54643c4a6b9d286 legacy-trunk
+9194 d854a1c7e74d331a75293ebf5dd1a7beb457ef13 legacy-trunk
+9195 64a75211cf729cf4ac06ed7254dee9c283649da2 legacy-trunk
+9196 32f2eda2946cad701b43e6c8a7ec62d4be932176 legacy-trunk
+9197 faebc19404328b12bc2bc3123402a56c5d295158 legacy-trunk
+9198 960853902ebe4192e14cb3f84ba4dbd5299db31f legacy-trunk
+9199 bbf9e4b31d84c4c212d3f5f2d594150c0190f97e legacy-trunk
+9200 21dce332532196221bc0b1aade1eabb031272289 legacy-trunk
+9201 c3f85bcb045ad73f6375218ca318346ecc8b8e8a legacy-trunk
+9202 2e3acb2140bf3a5ff80c8cfc33d6a1189572ae29 legacy-trunk
+9203 283d1ca585d94f2663f11cb53aff30bdcbfe1261 legacy-trunk
+9204 4f3642a201372e68243cd79a8585e4e0b2e4e4e6 legacy-trunk
+9205 2662c9fe1b3e03caa27fdf5616489235b412b41d legacy-trunk
+9206 7cce469160c6eb853b3a8bf44aa410ce1d28d0ef legacy-trunk
+9207 11a7517054a58ea8016a6453a5aac37e42a62fe6 legacy-trunk
+9208 9c9a87b5bb17ec01ea3b3e2503fb04f01e23f936 legacy-trunk
+9209 21656204dd4fbd9a671c6487e8e27267f6747a80 legacy-trunk
+9210 09f6a49aca12ef706d248654f2de7fccfff9d2e5 legacy-trunk
+9211 65ae711db00cb5d558bb54c837d54c19b8741bf7 legacy-trunk
+9212 4c9b256a3bee0c9128a1ec8a27ddea1f96c4e7d9 legacy-trunk
+9213 fab8ab5dc5f84e8f6e96ad98d2cc0bb7a5b253c4 legacy-trunk
+9214 53fd42aa3bbfcaca0e1546b0d64e51c321280fbb legacy-trunk
+9215 ab3d7a28e07d2582adf05d9ed4188b4d192e1ddf legacy-trunk
+9216 3bef55cb744b6e6de9cdeb08d06b2c7aa187b8ff legacy-trunk
+9217 1d4175ed6a9ceee315580f082a55c5efed42dac7 legacy-trunk
+9218 1853b5bc0548ba062c354033e80e39e2b8415883 legacy-trunk
+9219 4cf0da071e2bea3e9b4b075c0cb2b6530012700d legacy-trunk
+9220 4887d754692aefb100bcab4542b3c404e4055c53 legacy-trunk
+9221 4f68c7ac51154dcdce0f458042ce42073644335a legacy-trunk
+9222 80848e918bcc184143a9e6b4d44b5f70fa6aedb8 legacy-trunk
+9223 1db41ca45c7fc88544879728d4644566a35ab426 legacy-trunk
+9224 abe3aad9e0385e7e65f7542dd2b2c65ddb9735b4 legacy-trunk
+9225 fcff531634e14f413d761536e222a71d5b01880f legacy-trunk
+9226 74ea208d46ce81aa3d9d7482bd574c54d72488ea legacy-trunk
+9227 793caf5176479e4e4a8e47a1e36b32b3a6fc1348 legacy-trunk
+9228 5e7c91358ed2cdea91c87c600ae5583e71e33c5a legacy-trunk
+9229 4daf090ff1622651954343f7fb4665b8f319b53c legacy-trunk
+9230 eba6adf3f844ef647fab896a23767877245adbf5 legacy-trunk
+9231 e2e5bbfad1c81f73ab32413fc5e0f50985caef03 legacy-trunk
+9232 07e95ef55f658e7e6795fb0f33630a0fae916b14 legacy-trunk
+9233 fd29cebe88dc8b4562c44acb52fa848b66f67d6d legacy-trunk
+9234 e4070dc6ac35d5d2f3f21e19d813e4d830753ab4 legacy-trunk
+9235 aff6ff52d5e7ed312bd8534b8fe3f6d31015c49d legacy-trunk
+9236 0b5eb32b551d282a2a669ee4a8e54b30cd349010 legacy-trunk
+9237 cae8aa441fbd4d7b65e7e3d9b2bc11b6d730e196 legacy-trunk
+9238 0204d461d2196788ec340b9033073e5a271fd5e0 legacy-trunk
+9239 748abc7f8808f4843914f2553de4a63518d1ea83 legacy-trunk
+9240 0a3c7402d3953d07f000bc2dae39cf1552a8ce58 legacy-trunk
+9241 12824fe04a088521dc54fa62eb35c4678658b188 legacy-trunk
+9242 0752bbf77d813a1f57df7e3b7b3f46a83c254abd legacy-trunk
+9243 e6c033e9b76927b9eb51f27c6c1a54f368c17bbc legacy-trunk
+9244 89092ad1e66070d1865f8120e9beeff2ec842286 legacy-trunk
+9245 e97b8237591c5815155d609d3787288877c74d48 legacy-trunk
+9246 a29a6bf03af3323aef8a3982d10eadff128e2d51 legacy-trunk
+9247 22fdfd283c9ced6d5584ce5c97a2209eed280f2b legacy-trunk
+9248 b5cd768812cb3241082110774c7dd4cbba6ad96a legacy-trunk
+9249 33e2145250afee82ce5cb9c8763f4c0820eb2f59 legacy-trunk
+9250 832a807d00988ead8c62bb40ea4ede7d635b6663 legacy-trunk
+9251 14d6b7a4291942154e0a69ee2a4a39c10bc8fd04 legacy-trunk
+9252 0ef23f513a65959773a15a98b592c438d003490c legacy-trunk
+9253 3117af9dbfce79346eee1ed0fbceca45fe510d17 legacy-trunk
+9254 3dfe0511bc3b32631503ce518bc2ea8cea7217f5 legacy-trunk
+9255 daa77d9af34c90339f9c3f9b8b039a60e1c7fc5b legacy-trunk
+9256 bf6de82aab0d881ab78739e12d47a2761302a3d2 legacy-trunk
+9257 4dbfffc3c23be3945da44f744aada1d0fc4bbb3e legacy-trunk
+9258 9cf8d14f35652cd93ebf36fc00c9a37a1fbcd222 legacy-trunk
+9259 b96d9fbb24e5614fbefce86dea3f1199103b494d legacy-trunk
+9260 89802087f80669cf79befec1442ae2719d7b8028 legacy-trunk
+9261 c18501770895453e7396378c0edefb0e7cc7187b legacy-trunk
+9262 084800502a42084236f8bd47583cd767f2e7a4c0 legacy-trunk
+9263 f4e3a7aeb949ff3ed65e1de130b11e112c21812b legacy-trunk
+9264 bc007cf1d6ba3a197ec0d96199e3b294b11e0023 legacy-trunk
+9265 f6954274e1ca48f884523be0b0b7243a1a67e632 legacy-trunk
+9266 ceabd50317e30ed211e063dd752b8c6b08967a05 legacy-trunk
+9267 bb440a2975ab9915cd8962a0bfc8aa20b8931cb3 legacy-trunk
+9268 b1e6c3fe5de8545d4f1dd5f74a812ef9c260810a legacy-trunk
+9269 9e75d94256e0e6a52b6ace30a075ddf8297d661c legacy-trunk
+9270 f533c3079780bfe9a56714ecf9f8e725329b8b17 legacy-trunk
+9271 857f9065041d520b523a3db55985109df5deec2d legacy-trunk
+9272 b092ee19ae4fec0ba5b322f88391577a844fd260 legacy-trunk
+9273 5b24cbb1f99ba25af5221736ced0cab491bc6223 legacy-trunk
+9274 d100d0252cb1c5dcfdf1f6eb740cad5037c3db2b legacy-trunk
+9275 954417191fbfc781ece8f6faa88a537526cdac4f legacy-trunk
+9276 0ba50c7429e51034b0fa298a26876433a707f91c legacy-trunk
+9277 341a6e47a8ff645feacc6e3dbaf76bf803dcc97b legacy-trunk
+9278 5edfeb7aa6eae3d70488622ce5ac392b9f6c4566 legacy-trunk
+9279 bca948194deaf48294f0db621f3acd4c031f9a34 legacy-trunk
+9280 985be6dc894f35fab05bb48488eb1e707518d2e8 legacy-trunk
+9281 afbc11dd2c65e5fb83c6f77e3a3b6bb962bed87b legacy-trunk
+9282 e224c41bdac6508f074febdc287023dbe2f6887d legacy-trunk
+9283 93e480dedcf094071f8487e9d53f15e5b4e2353a legacy-trunk
+9284 ac1b261f16904a6659fcd627888d280df70bf7ad legacy-trunk
+9285 7f919d4701293fc5dd60b6e6ebc09e09822ea51f legacy-trunk
+9286 a87bc53fc1ad6ee75baeae2b09239a0513c846b7 legacy-trunk
+9287 140e65f839533fa9fbe971970197e252996e616a legacy-trunk
+9288 ca755fb1efb8af43b50109298b965610889ab646 legacy-trunk
+9289 9b406c925140825829ef142f31b14353da865d9b legacy-trunk
+9290 d85147dce185d262f2c078dad52056c174c22f9f legacy-trunk
+9291 667a85ebfc3ed0abaf6003c83fca6f616996f1f5 legacy-trunk
+9292 0fe3dc28b92c0c96c295e59c538381d6511ebf5c legacy-trunk
+9293 6131d3f9af2d60929d0023a55a12640587a1edbc legacy-trunk
+9294 2e3f244f105f357398f9277595ee40bf65fcd3a2 legacy-trunk
+9295 7dba2f3b6c8135c3e77a0016dcc7ec0203b408a0 legacy-trunk
+9296 773fbc8efbd77e072d8dc1f6b7bc102ad462d944 legacy-trunk
+9297 95929b01a2624aa26f3c1e3cadd04544549eb541 legacy-trunk
+9298 8ef481c7c3afc643007f3f9ed72b72edc738d0d9 legacy-trunk
+9299 b19cd431312663ef455d8b461b5057b4ed1e7965 legacy-trunk
+9300 fc11ff2c75b0495dd5acdf0e984190007f821b60 legacy-trunk
+9301 663a49e4bed3268278c738e6c451c81c54c4f48c legacy-trunk
+9302 e39c3b77704172c85af034419177ab0e1b34daf5 legacy-trunk
+9303 ecaa431c5969d9b3a342544e10535d7b37ef0ea2 legacy-trunk
+9304 a1545cbf0adf7f46c4900c71e889530cbc086deb legacy-trunk
+9305 9fe97b763068b669cb9589d69e95a567fa804ab2 legacy-trunk
+9306 ee88c5abc341ece938bb1e145c32dc289e1181ac legacy-trunk
+9307 351c70b8e7313fdb4a8c9eabd5ffdd17945ea763 legacy-trunk
+9308 99209dcf29468ce7308c284d97311fd0b875aaf0 legacy-trunk
+9309 acf247465febfde1bd41dce425aa6b4a171ecb6d legacy-trunk
+9310 9a57b410748d515e84c7eb03440fb1bed981dca1 legacy-trunk
+9311 cbfc5f332d9d4f19f3a46963aab5a111cef519b0 legacy-trunk
+9312 aab082bfe654e53ee97c16d3a752b6bc7af0e973 legacy-trunk
+9313 db191acf8e068e6aac53f876d5654aadf09a6038 legacy-trunk
+9314 0255b5ecde10654299f031681bc38cee942f98f7 legacy-trunk
+9315 96181a4a548249bd6aa8ae91d6f126a57e438860 legacy-trunk
+9316 b75500eeed9b12d2791ec0214a6953b51c7b98a2 legacy-trunk
+9317 6233383512ba99a182ebdf5e2a38cef4f19fec86 legacy-trunk
+9318 58bfece01968cc09c16f11d739245a48d963d447 legacy-trunk
+9319 d7139bac9b99785ebd6ccb129be596af6ba68747 legacy-trunk
+9320 416c79572f11871b6ead17788804df88eb7c3930 legacy-trunk
+9321 ac65db2054c9c678cc4c2be9ecb4b1bb7a61a1ee legacy-trunk
+9321 eb78658d819fb0af09a8e6f9bedcb670805ed5f6 legacy-trunk
+9323 3fff34ea91ab6418d92c75052d61bf131c323a8e legacy-trunk
+9324 599eea930843c14cf2bbd9348871484483704f3e legacy-trunk
+9325 9ded4f9e019ed0a1e5c6eaf1742c1a30615db325 legacy-trunk
+9326 8adb35329af024d9537b31ed07b23ce60f8609f1 legacy-trunk
+9327 51f8d4da81e4b07798618eecd6465e8dcbfc505a legacy-trunk
+9328 52fd8281656145b5e7348c95144c47518c07aad7 legacy-trunk
+9329 d3e516ef9cd1122fd3271dfec8e854d95939d662 legacy-trunk
+9330 a423e3e0da4010cbd25665b1b2ca499d6113e968 legacy-trunk
+9331 672a657abba87c90c55f0e7ac4363814d13bd3dc legacy-trunk
+9332 fd07d503a33c5e56e1cbfc19073aade4d90acb4a legacy-trunk
+9333 1ab307951f4ed088156250ad1bf73afba048b4f9 legacy-trunk
+9334 9274fab2c5f20f5b7205e3fca93430bc19972519 legacy-trunk
+9335 67c10d98908d2beb7714ef41b8da059c2a7015ae legacy-trunk
+9336 61d973eb4102cbfd197a05c70226daef76033d00 legacy-trunk
+9337 51c930079514750044967e14529910a211d19a41 legacy-trunk
+9338 9f1d3eeb784b932592d9da03341e47ba4bb0111f legacy-trunk
+9339 744b8994148ae32c0eb770a2aa89b9dc12b69482 legacy-trunk
+9340 c5bfb1de61a5b70419dcd34f7dfc20a4b2fb857e legacy-trunk
+9341 3202005a720b497570aa80e2dffc189adfb561ea legacy-trunk
+9342 2de398f370e86e16dd51448e5e14462d7d51a3a0 legacy-trunk
+9343 c8cde15dd8ce4c6527c2f03c6f85c1da54749595 legacy-trunk
+9344 0c3efdf281330bea3dbcf7d3b84b5a5109592b92 legacy-trunk
+9345 81dfdf6589f8ce7932cbcab562a0701937150659 legacy-trunk
+9346 2f753f540f45f49901e4e1c822723c133b84d279 legacy-trunk
+9347 278aacf0170713048df0efd9e6b74475342c7c13 legacy-trunk
+9348 1902938e42c6206450824bf3aa39358953ec18b6 legacy-trunk
+9349 79375f71d6c838226c02e4bec1876403a35651e1 legacy-trunk
+9350 2d97fb1d06ca144c78afcfed0e774c2ab9b95c4b legacy-trunk
+9351 9be7f1e37535945972e393c0dd3e9d93f0eceae3 legacy-trunk
+9352 6ae3c91f2d938341f81259e84ee91188c50e3a92 legacy-trunk
+9353 d03f2e2fbf3666dac26bee63a35444b4e3f86d8e legacy-trunk
+9354 4e2cc5044fa513f1a18fecd4e05bc9b5247781e0 legacy-trunk
+9355 5809ef157cddb4e8fbf1c7b4535e506563218698 legacy-trunk
+9356 e285a15f3a92ea0a7fae55971e46d913a1a9cc7e legacy-trunk
+9357 ea218dcf727dd151e9556cc68be4ed5b0fde02a2 legacy-trunk
+9358 c46d87923317c39c4c11509e4a452b6c12244019 legacy-trunk
+9359 38f8a828ac58d3e30a2abbad1d9962df30c7170c legacy-trunk
+9360 3c12c0d69e12302e4eebab93eda44103930a236b legacy-trunk
+9361 baf686bf8ca0b6414c412f1893e836a2f6e950e5 legacy-trunk
+9362 598d2ffbfd8b56222a0cc09c050dc46087243e40 legacy-trunk
+9363 e8d32209217a9d25949f8870b53c991a427a1bbd legacy-trunk
+9364 b7d8ccb457463325c9c09579c2e25c3e8500fb6a legacy-trunk
+9365 913345d54f306c5c3bc6c418a767cb41cba8b633 legacy-trunk
+9366 e8f997887c2d5e321bf1369a03e177490d081c3c legacy-trunk
+9367 c7bab73e63c6e74189765ff30bfd45a417f11c5c legacy-trunk
+9368 1ff9a30f826a45ad810c1495e0b337c3ba421871 legacy-trunk
+9369 047abcbf3f432557c5a379562ccd2922db509e62 legacy-trunk
+9370 5d205f22ab61863aa78a8d89df0d07f85f141b88 legacy-trunk
+9371 d2ef794d9c116ddf08d6116b3f5854f37137d157 legacy-trunk
+9372 05e267aed86ebb51077588567a8961a317f65bce legacy-trunk
+9373 d949a35cae20c83a2f3f0ed617c0dc83c8d25cc7 legacy-trunk
+9374 e70c4af157d54354d288b2800275b981ca26987d legacy-trunk
+9375 6fe6a9c144992f113f33f38e47245687232d4496 legacy-trunk
+9376 37ee18711c3c3818411899a19a0f1ed6c0cbc3a9 legacy-trunk
+9377 214f3c4f54892ec7c8d5ca56c976522fa0132102 legacy-trunk
+9378 24437d8d0ddc3b45b30d4376222b16469426e634 legacy-trunk
+9379 adb300cbd56680d012242fa993976ce12fb44a63 legacy-trunk
+9380 2522c8f8615bd5329cc6f9847ef78bf9ccc1cc6c legacy-trunk
+9381 e207beb5a3629bd0cd953c81ac49bbf52d3fbfc8 legacy-trunk
+9382 9cb2f10b04298efa0e14f2bb0d0d7a764161e3ac legacy-trunk
+9383 7b54f96af3befa03c2a99242a9be65f0edc791fe legacy-trunk
+9384 80ab6030b904dc929ea68a5c8852827f196dd33c legacy-trunk
+9385 9ec6e0a8f353fd2be6ac5a6ea0b868a6d84f5e9e legacy-trunk
+9386 e4cd30e45371ce0a9c6a1b7e4c6b826d20ba52df legacy-trunk
+9387 3547fdeab4dfac8af927199092860217b45f7485 legacy-trunk
+9388 f595e7fc2bd9ea52cec33b440da3766bfc85de82 legacy-trunk
+9389 2c49c02cf7474ab39a8e31e86fbcabb5071ac653 legacy-trunk
+9390 f266ab91a990d00a32e0be1333c568adcc987d78 legacy-trunk
+9391 3cff445bd10ffa97115b61dcfcb77a52379dbbba legacy-trunk
+9392 035e796b890ed6263950301e026ab3a6c496fcad legacy-trunk
+9393 0d51b3b660d1293edbe833669b69b2b1ef5fc430 legacy-trunk
+9394 b9a3950112aea5920ae66791638113d334003445 legacy-trunk
+9395 8dfbeecc2422b7991753bc93026309697611918a legacy-trunk
+9396 950d0519b5fe9e99a13f095adf1c6e0a27a01ae9 legacy-trunk
+9397 10029c8c40e0dc55c25e440c6286fc7d9696b424 legacy-trunk
+9398 afb1e8af7e4f8abc2fd64a88c5dea08c65da1eb5 legacy-trunk
+9399 236ea93c56ff78b75b88d85d7d02b898332e40bc legacy-trunk
+9400 7629c4d985bc3ede3e1fd80e5fb2072ee438dbfc legacy-trunk
+9401 74ad268250608a93dadcf4ca5d2e8f81ac40486d legacy-trunk
+9402 cf317a9c499bbff6155255b1b424f38decd39c33 legacy-trunk
+9403 3db24b4d9c42275bd9d30d97eb38d73ec88b66d5 legacy-trunk
+9404 8c92ec8f6038a75070e2ea297c1ca0548c5dd6c1 legacy-trunk
+9405 52125ce376a42e4212812dc9f39e2f35c61ce44a legacy-trunk
+9406 b9d9c53f1e1df51230bb86c4ef7fb4040efe1c58 legacy-trunk
+9407 74024e907c60d60546a66b91db13ee827fd432a2 legacy-trunk
+9408 7744bf1e485b65f1c5c65a5237f39d3b5aa70b50 legacy-trunk
+9409 4091b04f93adf0187563e4f8644db303af42ca03 legacy-trunk
+9410 c5b939b5a9e02d6d833e3d295304925d9e19a2b2 legacy-trunk
+9411 a72dc52b97add461c39e7b38e3b473f261cf1868 legacy-trunk
+9412 683bc35ab753af78b7bb090e803fe57c3c80cd3b legacy-trunk
+9413 6b6ef909238e05cd0d7078c9cf9b9af44d92c71f legacy-trunk
+9414 455cbab4a9be7d65463d7f102cffb2532132c504 legacy-trunk
+9415 e3c8c340a990c8cdfae002f3803c937ebbd003e8 legacy-trunk
+9416 b3b0ad4712ad0f84a32fefee2192a5bab030bce1 legacy-trunk
+9417 dc3c9c04ef07b933a403a1fd3ca3dd496cfa1691 legacy-trunk
+9418 1dafad3070066b991a76e3757df512c7a08e49ee legacy-trunk
+9419 9104784af15908acd7205a292190929421a216dc legacy-trunk
+9420 06291f04ba9c38ca9e2024fb3b62f9cba7850a9d legacy-trunk
+9421 0c1cc2d6c4f01dc4e140dd6fd3040c16a0e7a0bb legacy-trunk
+9422 feba3d9a30c7200a8a20cc161b21ad30ad95d64f legacy-trunk
+9423 f14e4459fb94dbc7d9d3f51fa6d6e81e1b450a1c legacy-trunk
+9424 5ef4700719de9a226b1d6112227ea1d80e01964e legacy-trunk
+9425 e7bf5453a6ff4ff76482f241e8e244ce5401e7be legacy-trunk
+9426 800cb234f676f1ab03e68672d7509595f05876f1 legacy-trunk
+9427 6e0eddfa404a717091fcf9d5d31d6e4f273eeec4 legacy-trunk
+9428 3912efa5bfca2663e658fbc2626c0ce15ba1e2e6 legacy-trunk
+9429 c8ad9dc8ae1ebf69c21308f6ccf4dd8218d6a3fe legacy-trunk
+9430 1144a9ed98d6ab382d9c4c8b9d28270067548230 legacy-trunk
+9431 dc0739379714988115e9c99475278a0b5bfcb5d9 legacy-trunk
+9432 9642a28df2b14b77878ddede126c416cd5b4200b legacy-trunk
+9433 38493b9376eae181b3a062946d064ea52525f883 legacy-trunk
+9434 9754b223358091cc67be45a550ac101d21967713 legacy-trunk
+9435 df5b56a5afcfd6324fed2c45a8d3fa6fe8d3c1e3 legacy-trunk
+9436 139ad31ff8fd5b986b8c083f9a6b35f7f641069f legacy-trunk
+9437 fedbf9325190b8a6a60306b92184e14fd4414c1c legacy-trunk
+9438 319a51c381cee4f8a4fd9dc14a55c6cac66f8359 legacy-trunk
+9439 c5874f6f5431f294b9fc5afa3b93d8e74a279f75 legacy-trunk
+9440 484a1c68c558956aeaf1ac97aa5f8d497b0bcd31 legacy-trunk
+9441 10f2921a091e714ac77fcf2b1fb1eb3cc19d93b1 legacy-trunk
+9442 33be7d5d498b6072b72ab0a701214b0621fb2ee0 legacy-trunk
+9443 dce838cd42c1809d71352786ae2dbc5110ed3d94 legacy-trunk
+9444 eed63049df95955a9957cb65ed4dcf5a9ca7b03a legacy-trunk
+9445 744e2b68f3b6d940bbf2511185c1974cf99a2da0 legacy-trunk
+9446 31eca648f7ffeaf1d2c64134ff37ef019fbf3eea legacy-trunk
+9447 492c6db160ac99e3e8ff2572eba92b8970819e77 legacy-trunk
+9448 e5aff41036f3d659060e2ffbf1fd9a64f1d7a672 legacy-trunk
+9449 bc125f0d2c5d0f1414d048835967e0de1d65e8f7 legacy-trunk
+9450 a6929e7417dd62c774158815b58b0feef6afe46f legacy-trunk
+9451 bbad2c684ad72bce5f1344dfc4b2d67a867dbccb legacy-trunk
+9452 23b27b0b235b31552d57ef8e33bcae487696aec9 legacy-trunk
+9453 80b1e27f20d49ce11958853523f5be6b9bf12e42 legacy-trunk
+9454 cda720b1919dfe522acb90bacab3fc5ec8777359 legacy-trunk
+9455 a5686e75685f2d3deb56d55712ec38beb1c62022 legacy-trunk
+9456 2f2efb8fa54ff3c63a2ce1a167a3f91bc58e3b5d legacy-trunk
+9457 7688f3106ae441c2cb78732d2d6d5a0333adf949 legacy-trunk
+9458 cfad4b029645e9a7cb3dadeb8ed30492f20daf4d legacy-trunk
+9459 b70ba4db767e09740f5d1ca7c07eb892f1a8e149 legacy-trunk
+9460 f3364708c09e079010b6a17e6d02086242cd7827 legacy-trunk
+9461 ffcaf7afd5d9e3e901fd8dbd5bcef4e1493c3a44 legacy-trunk
+9462 f5fd239b178ad008a681b41dbf506d37461c7b68 legacy-trunk
+9463 d4e9ac757e5c07ff59c6b387cd2c425d1a636c37 legacy-trunk
+9464 638d877ea995835336c0888b13a3226032649fc0 legacy-trunk
+9465 1a414158eb665b110cd4a6872ed3bab5a0430ed1 legacy-trunk
+9466 2e91fc71cbb50198347291bb734d7983f45cc83b legacy-trunk
+9467 fe108a4bb8d58daacf87c7db3f1cb92c52705146 legacy-trunk
+9468 b2445c93f03b89c0a068788284bec9acbc660a06 legacy-trunk
+9469 f349bf0e932276fb64c174737aacac2b28dad216 legacy-trunk
+9470 d00515f92b534d14e5d0467314b8124aedcb8252 legacy-trunk
+9471 987a831aaf236adf5611c7969e7f881bcd38264b legacy-trunk
+9472 60ccfa9656acf0b52354a1c15d7c3f4b869ebb30 legacy-trunk
+9473 ebcf604ccee051129fbaae6f2620dbc4aa0dee05 legacy-trunk
+9474 69112990d8e248b9f3bb80f5def0027e9f8f2e53 legacy-trunk
+9475 fa19430fec4e49fa31e500fbc297c11af1ddd17f legacy-trunk
+9476 8ad17e4ccd9ba8993fb7eb511735cf0dc7dc63fd legacy-trunk
+9477 7ce9da029619f55bc5315f7bd7b6f1a8c990bc4f legacy-trunk
+9478 f2af3c64571024cf79011c056cdff2b90399aeaf legacy-trunk
+9479 feb80ea5488887cee85528b1978080cfe6e5786f legacy-trunk
+9480 f0f9b2e4f4cc0c509f884d8b3fd367ef09c2aa51 legacy-trunk
+9481 2244439fafcf06c1df66f4fa34666c6f06971969 legacy-trunk
+9482 a10c4539127a1cf0c1220f9f03c6ddd4e485e5ba legacy-trunk
+9483 cdeeff4d6cb4cf729a883bb07b501c1f8f2b1791 legacy-trunk
+9484 9773d3941c96e2d3be263b8e0d4a75d4ad854ae3 legacy-trunk
+9485 6f2ab4afa8f94787c06fcf0bd0ad8f37b64d8ad9 legacy-trunk
+9486 4b88711985a2589c3218fe560539f4c5f2321824 legacy-trunk
+9487 444a6b07da465168aa28db71a82c98e831a1bed5 legacy-trunk
+9488 0aba649bd9bb3acd2cf6ba3b3f24384a0831d974 legacy-trunk
+9489 7a8c308196d14655c42f31b7e52475a2832090b6 legacy-trunk
+9490 2db16d1dbd87cba068323680a2e8c25cb3564de7 legacy-trunk
+9491 a5df02b6c7a83082b472b8ff0b48731a0f8993ea legacy-trunk
+9492 c75d899e666f168d7e47b005c145d6fc26d363f2 legacy-trunk
+9492 84461011a1a0ab402e352f06748f29fb5b5559e5 legacy-trunk
+9494 dc85ad1ba0e1563a3febf0a914e2cdafdac2f806 legacy-trunk
+9495 59aa3e1c13dc5821b182979661b37310c231c355 legacy-trunk
+9496 0a951470b1bf30ffb9cf1f95e1ac477a3c69532e legacy-trunk
+9497 ada1311da286ed64007f8c81d2877b0fa3c23716 legacy-trunk
+9498 261b11b0ccd64df04f7de081607cf8908e11d610 legacy-trunk
+9499 3844de2a709f50cd71244b1d8f27211d627e93c1 legacy-trunk
+9500 a66df555f025f2b8a621c4db92e026542eb22f8f legacy-trunk
+9501 ccd471c7b863cde22e4d325a3aa31d9ac9efd007 legacy-trunk
+9502 e17fe79305c7406b8c7b9cc29efe40f92820e22b legacy-trunk
+9503 c5a18fc4f96614bb12df34a3b746b3c164e791af legacy-trunk
+9504 4d645909b83455d21badf3ee14b3afddd571aa29 legacy-trunk
+9505 8da35f1c739010bb8bf4d3cc17ba2d050ca00850 legacy-trunk
+9506 379d1fd42dbf1f91f9121eed91f580c051a6670c legacy-trunk
+9507 a367aaa6503cbde2cae0d3af7318a7c55e5aaa77 legacy-trunk
+9508 05e0e499014f294ed623cdef3533ee384392c4ef legacy-trunk
+9509 8d11ecc177b2b8c5034e4334b1bdff4d7f93fc34 legacy-trunk
+9510 fa85a7fd740bc61bb3991aedf642e4ff26fecaae legacy-trunk
+9511 6147459bfcfb9a0e67cfa72a1c8db8f96ebd5208 legacy-trunk
+9512 ddf52f01bc0a76d6d7c9826ef6687018516d2a26 legacy-trunk
+9513 3161674990059968259c183d9f264974efb61149 legacy-trunk
+9514 d0a97014ed42f01f626133ee3a87122e4080043c legacy-trunk
+9515 2612f9ac31eda177627834b313cf48f4b7b1b8cd legacy-trunk
+9516 49ce18a1699f4c62088876d16c2b5baf6b5a2d03 legacy-trunk
+9517 ab4d604822d0acf257f6af1a5c3347d2d292b873 legacy-trunk
+9518 1c927ecfcbb3b1880d93c90135eeb07e0e44aa19 legacy-trunk
+9519 a52a3e26edc4ce9414ee125fbf3470d525e09830 legacy-trunk
+9520 84e871e20087aecf84622cdf643834757dfafcaa legacy-trunk
+9521 76eaf36040be55cae2bb1db3004ebe2689addec9 legacy-trunk
+9522 297ea67926eb94aa49567dda9008684b37d57f42 legacy-trunk
+9523 ae63fa3cb1c6f91f63627def04a36993ef927fa8 legacy-trunk
+9524 c4a78b924dd9ac88683a8df704a97d9d1d7d17a1 legacy-trunk
+9525 9fe335d455956ccb89814faa6c6a662a8b9e3685 legacy-trunk
+9526 3eca5f37501a79c101333f5991d39af408e17fef legacy-trunk
+9527 aece51362adac5c1aa0e2c768762663a096f68e6 legacy-trunk
+9528 90edcb38fb003f243d576efbb1694b58cd181126 legacy-trunk
+9529 1f2f5597739ba1eb71d0f6f191e4e1160db1974a legacy-trunk
+9530 502880af4654e379d9f7e517002aa5619a3c2721 legacy-trunk
+9531 db0dd117541d46e82a3cc0c6838ab7a5dda1ccd2 legacy-trunk
+9532 42534409750a04ea119bf6e2b1d84b94a48ac731 legacy-trunk
+9533 df05b9c4be7f3770516814db420a9fdf9306c2c8 legacy-trunk
+9534 53e54a14f432339d816b499e0d0cacb6b2242784 legacy-trunk
+9535 0896d32b60a4b1cc802cf267a5ad12b161d210ca legacy-trunk
+9536 f2b2a7ea2a1e355c9f419fc6d860ac71a211cb64 legacy-trunk
+9537 6e3b4695ffae1cae007fc47feb88028f7f9e032d legacy-trunk
+9538 c95e60ead5e06a1e5e3e996f2d40dacb67d42e39 legacy-trunk
+9539 1d0b9028523c6ebb31b8caaf43d350168b8199f2 legacy-trunk
+9540 6b4f8a96e1d444f4fd6a76472a67d1963074eabf legacy-trunk
+9541 e68eeb35d04d1db7e7cbb1be72d0a88879b3a71c legacy-trunk
+9542 0c70264573db3d35213610becc554cd4a08e985e legacy-trunk
+9543 8866c69b0afc8dc7931b4a519f410565d4c808fe legacy-trunk
+9544 fa42306857572ff853aa02996ba70d8dbf4a3ea4 legacy-trunk
+9545 90650bbd9dbb6ac59f307b620ad247a5719de772 legacy-trunk
+9546 2cdf11b2ed9b4410fabde16047d2ad62d7d1bac6 legacy-trunk
+9547 00e612560492c6aa35ae405bdd2de7007c786788 legacy-trunk
+9548 75a1aec6d9b2cd2438d697d4ddd8a2875c8361bf legacy-trunk
+9549 0314ecbc5f5d4e25be6eac792442125562f11b42 legacy-trunk
+9550 5c353c522a48278148b5efd4bc7c82cb778cc0a1 legacy-trunk
+9551 3b519a6d27bb5be2fe80de36698aa8c256430100 legacy-trunk
+9552 8cd573b72d4b613cab0e0e3ddc7badf1668a25d7 legacy-trunk
+9553 3d8c1b8f60990e84c215d1192cd1531bdf53a16a legacy-trunk
+9554 2ae4417ac3309ee682587d0ffaf2cc87991a139a legacy-trunk
+9555 c1ad34b3c069950d474da8930a4756ff542fc965 legacy-trunk
+9556 0314553482a29e74438a251bc36bc623bfa6671c legacy-trunk
+9557 322dca5ee145bdcb47dbd424a0b501098ad9f513 legacy-trunk
+9558 924f8a0117d5fb011d5f3e5ad31719e343f96329 legacy-trunk
+9559 0baa2ab42ee90cddac66f33102f6bb827aad569f legacy-trunk
+9560 419b86b04ae4d98b3e6e68f9da358fe95899955f legacy-trunk
+9561 913e48aaac761eac454142dda06e88c0d979e49c legacy-trunk
+9562 0c6887765939524e4381cdd2472a4ff181cc4e60 legacy-trunk
+9563 9b05c20c5776a4f25c3291714c748effb2236232 legacy-trunk
+9564 fcb2e3ee8995956b80576b55e90a339570957415 legacy-trunk
+9565 ab51da347316d4bfab74b05e11304502db74eb6c legacy-trunk
+9566 a2e054032899c62586c0436aa9d2a1c241e1203a legacy-trunk
+9567 29b1686875daa51513c41db6285a223698bc06ef legacy-trunk
+9568 96460ef33fded7ed12fd75a8a7b556f4e2fe61e3 legacy-trunk
+9569 2e8bcde4c248ffbe69967d7723747eb1cd846a53 legacy-trunk
+9570 8a55643e667fa172ddd05d27613f3992a9003b2e legacy-trunk
+9571 af826b23f006430835e0a72c9b6109a28f5362d2 legacy-trunk
+9572 e5548096b42a5fb9126e8eb6065f5e9b8ef57897 legacy-trunk
+9573 bc1976ff6ffd30fb3534749e897859a27987caa4 legacy-trunk
+9574 5bb884527446f965d1e219aad62bcb4101c3ad40 legacy-trunk
+9575 00a85ab0337f7f87cdf626d3bded5085c8445bf0 legacy-trunk
+9576 1676fad7b63e7529d2f18b5199ef5ab0932b1d8c legacy-trunk
+9577 f7f55bb6a3b3080f2e08bb25013aba99f3dced31 legacy-trunk
+9578 808479f85a29a3b119eaf5b5dce7ad8dad9e3211 legacy-trunk
+9579 0dc2fcb076aca5b7b4a2fd15dd03c4c04478e594 legacy-trunk
+9580 efaa01deffd2db0420e3c9ab78ff6e63d36494b2 legacy-trunk
+9581 2e5a116e54ecd5cce1e4704c97e31fe58f404a16 legacy-trunk
+9582 e7061ab2485215e44bb47abe928e627a2956f7cc legacy-trunk
+9583 28c7d5fcd3ac9da31f6a91f8a8d2e71c16811a63 legacy-trunk
+9584 3176deacb6d1f0eaa6501069e2936d79eaa7b889 legacy-trunk
+9585 6c900adb1ec3b15a103c3c8a2b6a6918cc95db44 legacy-trunk
+9586 ed62548045635e59beaf27ee765e8debe0aeb08c legacy-trunk
+9587 f43667866d5e5e621fad5a50797e841f884b1269 legacy-trunk
+9588 2822368c266a3f0996d06ebe0df9004f57a48f1c legacy-trunk
+9589 f063f1eb2964bc431a70c2206d84dab609d88028 legacy-trunk
+9590 ece4123e36ea2cc99b5de32c921be7c75311bc41 legacy-trunk
+9591 f5f305d7a6175744e2c3dc71a4faddf907266505 legacy-trunk
+9592 fa09372f7872dbac411bd75b2577c368b8af2ac6 legacy-trunk
+9593 ea7dc510e2df569e85b070cbb117e062c76fc000 legacy-trunk
+9594 41514d1ed664e2afac1bdf5d315a0effcdd3bf89 legacy-trunk
+9595 419dca2b3a61790b43ec59dc1fa31a1a3d9cda51 legacy-trunk
+9596 e9108e97a5a017e027df33cdbfa5543e9148238d legacy-trunk
+9597 516189984b0ca394ce2f4bfb5aebcbec583dced6 legacy-trunk
+9598 0efed4d3323b1302acca039bd716e5ccf8d2e363 legacy-trunk
+9599 c8745d205122716c9e10db799fb6f12f9e686484 legacy-trunk
+9600 41d6db8e26dc03393df87b49272c5b249bb32569 legacy-trunk
+9601 5d517ddcbd2ef51933e8f1fe4cc1c5d3233e5037 legacy-trunk
+9602 c037d00b1e2cba8985cb639c1067b3f64557f170 legacy-trunk
+9603 de4c81c0699429bee497fd8b1ad744f8c693d5f9 legacy-trunk
+9604 d2c110acc60c16626295570f7f6a59303f2c3990 legacy-trunk
+9605 1c4baada559e230d3421616a2a1f6a99c9e7b6ba legacy-trunk
+9606 de4dca9e4778cfef97a9a8cf1779d7690ae34bb8 legacy-trunk
+9607 97315bf08fad623d6204d05e07b76d376699001d legacy-trunk
+9608 e4c31dc30623c6d8a8160750810856e3cff14a20 legacy-trunk
+9609 dfdeac5e18c625aad998a0ac7e604bf5d5f074e2 legacy-trunk
+9610 96fa6753e956279b5b69e53c86f1634fa528643d legacy-trunk
+9611 ba849e48f9cae238c933abab2c94a9396f0e5b70 legacy-trunk
+9612 3939f9ff665f8fbea35dca5771e99643185d0049 legacy-trunk
+9613 efa22433e855da4f455b1e5c0c553687245f67d5 legacy-trunk
+9614 93ffe641a51276ff4da17c2f54ac9d1d8d092c8e legacy-trunk
+9615 16a3cdd2f1d13b820098f30f3f514d144172c618 legacy-trunk
+9616 bf91c0e165aadcf5efb10601b03efb7a6d525d3f legacy-trunk
+9617 dc8687b53dd0f1768a01b968ed9253843a744ad7 legacy-trunk
+9618 e7bfea41f617e88e8756fc15a4870fee3a602c53 legacy-trunk
+9619 b81fb67d908d7a973ce1022d6ff034e800947b1c legacy-trunk
+9620 aff1e7b1f523d7305bc3e11d32ca70254188500d legacy-trunk
+9621 3f0be7de7ca5ca54acfca3e1934c3d31897a1843 legacy-trunk
+9622 4ef6a83b2e625e16359cefa15897f8eaa10acfa7 legacy-trunk
+9623 6074847fad1de497028ea92d4fd0ecf3a8b2c642 legacy-trunk
+9624 49e4e3f30e58802ba6dab0ed253e8fcc07aac83e legacy-trunk
+9625 5128c6072aa51ba716bc7fb3bdd002a589cdd860 legacy-trunk
+9626 d48b99d8561742d5d77c85df558127e8d6bed9b8 legacy-trunk
+9627 7edc30df73f6a2cb20e5acb2e6e3a0c6c858e7ff legacy-trunk
+9628 b864029a5bc5c5d03a013593f8c25030b156732d legacy-trunk
+9629 d339954ea57d8987931c4678cb9c154554be890b legacy-trunk
+9630 d39a805852c20ae9c7ef8df7bbb8defebc927177 legacy-trunk
+9631 a7690ef5e15937e10280e9534c4ef1a29c314c24 legacy-trunk
+9632 74916c96ddb96514f452bf44ffa9a038222e9fea legacy-trunk
+9633 30ab39c2b1862e4f0dec3b8d4ee6eaaaddb70772 legacy-trunk
+9634 ce6ad170c0ce72e906fe97b2fcfedc69a91c9311 legacy-trunk
+9635 a6fa9f3cad137caa5f7c5e2c79a9b64b7ad1faed legacy-trunk
+9636 fb71b92d143aa1e16b5b024ca0a1c18cd921c90d legacy-trunk
+9637 49a20d00e34ce5f5c6df759c0fb61651a629944e legacy-trunk
+9638 a64a423d6b540aa64471176fc6cdc61f07194a1b legacy-trunk
+9639 5ab708181fa62232f06546fadff2e028a11f2fd2 legacy-trunk
+9640 8fb5fd075b2ab1320384bcfab03f50de772688e9 legacy-trunk
+9641 e5646eeceae8879fc0a3dc53ddc7709535803bb4 legacy-trunk
+9642 c3b5b1c25c51c7f16cc7a8ba03ec6bf75f772ed3 legacy-trunk
+9643 0d5a9a0e7d64a12e02be7073572582d3dd2b663b legacy-trunk
+9644 66cb00317acebb6f580319a0f3ff580b3df61d7e legacy-trunk
+9645 e58c7b50e9b9c6b96d8933c5f3d276b569258ed0 legacy-trunk
+9646 212597af829bbcabc17977dc583e8d2b8451e532 legacy-trunk
+9647 373d78118113b8cf4f8908662e303db577f2dc06 legacy-trunk
+9648 c5e767e22bd1c3e65d36b623fa89e491cd588aee legacy-trunk
+9649 ce4766fb3f563d17638c91a1c424b2556bb66592 legacy-trunk
+9650 b5b0c324ce59878fcaeeaa153efa1d08b7c37b00 legacy-trunk
+9651 0a4e29a28655e40430ecf24a839a718dd2f7a72f legacy-trunk
+9652 dc9bb47b35528d7df267cca3d601f613043cf451 legacy-trunk
+9653 a28bf62ac335b5f306a3ee57ec92da217f8a61b2 legacy-trunk
+9654 0bd185c2e58103e1e80d093fc388e22d734ad7a3 legacy-trunk
+9655 7c004fc1098737acf015942e87bc6663affd814e legacy-trunk
+9656 40987b86a1c74fb85c96fd7972e346a07ace5590 legacy-trunk
+9657 7d61fa9b57a8c542a956afab2a1b30c3b39cd2c2 legacy-trunk
+9658 3a960b2e26677c1bc5be4b4a5189b0dd16ed9ed2 legacy-trunk
+9659 4f10d233f1dc6d3d0b416bf9abc67a1467316d76 legacy-trunk
+9660 59362ea7e0f8b41064d195009fbeb9fd26707569 legacy-trunk
+9661 de5cb789e9f0f2f87b991a7bd8ae9757c9869cb5 legacy-trunk
+9662 6f78195bf8f687f70ec5868a9df6211da9d3a621 legacy-trunk
+9663 a596bbe72579d8b5e34cf413179f36f9ff5d7849 legacy-trunk
+9664 6e5eb845246c09bd9b4543df0d615764eacda75c legacy-trunk
+9665 2a9ba59abc382b79f1828d84353265a0f0554aca legacy-trunk
+9666 ee4a1a30d7ce927a796a4631fab5bb3747e4e3ca legacy-trunk
+9667 f3cc8d53ac803df2aa30d1b1d3767b0857fdc8c4 legacy-trunk
+9668 1f9d942f156cc932fdef9133455b2f804d0d1fc0 legacy-trunk
+9669 7054be5ad7f6741af9bb06547f399fdc69f4da41 legacy-trunk
+9670 af98b421424cc39b8c6a8b74ac6f6e94de46d9d1 legacy-trunk
+9671 e279572e2da2551667182eda26a7fe5073f856b2 legacy-trunk
+9672 b009a4c24188d5283fbeb02c33536ad5f8c3adc5 legacy-trunk
+9673 c123a5a59cde21d0c128aa3da2ede9a4066fa27f legacy-trunk
+9674 309fffe768a624218552900507d6d7e456cf7163 legacy-trunk
+9675 26d07735ba4a5b267abfc870e63df6899fc51aaa legacy-trunk
+9676 5cd2f699bf69166ad7a5d59f1ea65fb519bc7d68 legacy-trunk
+9677 db007a2ca7b636773521b5bee3dd7292e54a9ed4 legacy-trunk
+9678 98a9da520f1d8c19ab5bd4e203327f4e8ccc5213 legacy-trunk
+9679 720e9183961ee8add7401323b9c5c0153ddf5449 legacy-trunk
+9680 fed3d200fb565d2ace801bc61136a8b37fcbc81e legacy-trunk
+9681 8c129a5678677952a3028c9a0cd0b8a4b9d9be7e legacy-trunk
+9682 48ab66874b1191cdd443a0e3130f0399ad09e922 legacy-trunk
+9683 09ffab273eeb565a7619594d90596852ff4d8e1e legacy-trunk
+9684 3f255aedf621e95e26729f3fbd09024db74a24a1 legacy-trunk
+9685 06db10c76dc952e3fa0194d83b40c473976bcdb9 legacy-trunk
+9686 ce271e5f9bc5ac897c0b9a4d82c3da70e58616b5 legacy-trunk
+9687 c9fe35a8298ad8596a6311a70da29ddeb67bb33a legacy-trunk
+9688 bccdeca81669ce3bd3014a30310cf71f52fa520e legacy-trunk
+9689 c764217ae6eb92d31d9005cf7eb29c8ac5c31714 legacy-trunk
+9690 b9bbfa169920e455b12713d832a887d9f921b300 legacy-trunk
+9691 ff524b69b664a3fc651f9fe937e8874990b5cab4 legacy-trunk
+9692 6222d3371fb80eb840ee52d81236c1f3b896979a legacy-trunk
+9693 5a7f268a0781a94adc5c9d7535d8b19ee8c46ce9 legacy-trunk
+9694 16ecf1554a83579380e7376eeebf11fd3195f12d legacy-trunk
+9695 bc0086404a9a552921bc32aa1182bee35bf0cb89 legacy-trunk
+9696 90a35f1b90085fa19f340844e10526a6fac23904 legacy-trunk
+9697 640b97d105df71152f9732ad533dfbd353ed335f legacy-trunk
+9698 d0ca815c807254813e23c88c9dcd02fc1ab1c987 legacy-trunk
+9699 95c101964414985730a891fd306996bcb0b4a619 legacy-trunk
+9700 10fdf16f4de9c1f94f6b85238bc640b0c3541595 legacy-trunk
+9701 9dde07a593d83fc232c70db0129133302c27a6b5 legacy-trunk
+9702 d33d45622e6711d8b1c979cd500faa37270508dd legacy-trunk
+9703 11f34be0be11ff4277d50a2a479f69d479a04a3c legacy-trunk
+9704 47802e2f5bedb4f22bbc54d316f8118cf0381bd0 legacy-trunk
+9705 045ffa4c56f7856a234a9594dddd76e5026b1cfc legacy-trunk
+9706 bc6482f7e78fa3466b8b941ec91b97ad9dd0ae40 legacy-trunk
+9707 bc28a0ea6640f77b4bdb4084f26060f49eba488a legacy-trunk
+9708 375723a7559c715e094bebc253f15bf01e88512f legacy-trunk
+9709 177ad73bf1a925f009335d7d7fde1a8d92250bb4 legacy-trunk
+9710 74c57288a02b9967ba648f4cb5fbe33b33d4c299 legacy-trunk
+9711 08c5bbfae52c0dfe063efe80231e736b00666692 legacy-trunk
+9712 23c509aa3f0d9473ce52a15a760024706c776776 legacy-trunk
+9713 debe8e08126085f400b3da63b0d23d76424dce6d legacy-trunk
+9714 fd7a5993d06daa2848fc10c17b2da71581b48b17 legacy-trunk
+9715 cdb4a81379ad7e5973f15bee59b16f56e42640ba legacy-trunk
+9716 aa54d7c3daf90167a95fa6bdb43ff73d873ba47d legacy-trunk
+9717 306f737bab576a838932b5984a466dcf765d56fc legacy-trunk
+9718 2b82231a97cc6abf765d83a4a2096dab113f4117 legacy-trunk
+9719 b5985542bae1e69f653a477701fb67da0f1bee86 legacy-trunk
+9720 e75006069367fc6f11530d6ecb5dde9da5fedd80 legacy-trunk
+9721 5f5b9e871886cd8b9ec41519e6e25304ce159549 legacy-trunk
+9722 0b53c0393c88263d7e41b8f19a3bb1db2fd4b979 legacy-trunk
+9723 a71168649dc51ef83b355f26d9927eb87d4c3df8 legacy-trunk
+9724 193d704cbcc851ae738c1fb8a15a44cc2c0cece5 legacy-trunk
+9725 1272b58e84aeb6c2df7a39c0f27bd00bafaf9464 legacy-trunk
+9726 287623cce289453e26cc89bdc9ea9acb43697503 legacy-trunk
+9727 f0bb3bcf397b25496c0d7be4c9f180a4dc4a31c8 legacy-trunk
+9728 c698690a27b2591340051c0cc3c0b8876265940f legacy-trunk
+9729 8a08025ef93d8f9543669ff7e360cca1989281dc legacy-trunk
+9730 d3fd2182cfb8ed02d424016b4e6b8c99d1b36170 legacy-trunk
+9731 4e7402c8e460bfbf8a3b38b11f747e2ed29f10b8 legacy-trunk
+9732 812615e54550e69adad70c1f3869b2dbd9888b3c legacy-trunk
+9733 ca78b095ecf01463e3e69575cab91d8ac12f8acf legacy-trunk
+9734 8c749dfc49bfa38ed6df02b64cb87e4daf2ab6ce legacy-trunk
+9735 8b0d6b64a0ea39ce33e96ed95cb26bc0a5aa9f74 legacy-trunk
+9736 614d8a9084ead475800d1f3d9d9bf44773e70bbc legacy-trunk
+9737 7cdaa4495530793baece70e3e7b36f7937b34dd4 legacy-trunk
+9738 a7e9524a2a52c64aa2863e0651e3e8db765ebf60 legacy-trunk
+9739 bbf3507ef3fef2840a1d524e0a96b423f9021413 legacy-trunk
+9740 c09907104092a59250f7a7f5c72aabb90c4d20f5 legacy-trunk
+9741 41a928cbcc5eeb8e0a6b887837173026d03d06bf legacy-trunk
+9742 b8d484125c92dd6250e48fa7398e9c3fb01148b1 legacy-trunk
+9743 c002ffd1fbbfe7ba4caefc055d4fa0274aac04cb legacy-trunk
+9744 83c0e9dd4221f86ae73b46d2287ac3ab2beb74da legacy-trunk
+9745 ca14fdb955ef827bb47c68f50fe9419af5d971a5 legacy-trunk
+9746 a2f4c944cb8721bfc66eb2f9d67c5bb38799eecc legacy-trunk
+9747 682d3e5b267f470b3c1014b3025352c4d8b3ded1 legacy-trunk
+9748 f55969c1c3d54196982d9ca2ffebc471f357e9d2 legacy-trunk
+9749 0061d3916ae4b15e9e0619af7348155ee2edf876 legacy-trunk
+9750 c817f86ce7db67193a7474c42a48c5dbd4b74dad legacy-trunk
+9751 15ba68c33ed1ceda30324203fae69f5e1c7b5999 legacy-trunk
+9752 f5ea1b30cb3f749e5b98d3000d33d4b94acf9c15 legacy-trunk
+9753 00cd9fe4f6f2b089db5b45da14fd913f3f1bb8c2 legacy-trunk
+9754 39de49434df42611c47b69af6892431266f483dd legacy-trunk
+9755 bf4e790bd61a4b9b139558185147093c511aa177 legacy-trunk
+9756 59d2761ba1cfcaa0c2f048a401ae311a713b8d78 legacy-trunk
+9757 52fbb731210345b01354e640b44705ca2a71e783 legacy-trunk
+9758 f214ee8838de6826f360c41d70b8903f6af01c61 legacy-trunk
+9759 1fd7873879af82c9b938b55daf3bc1d7ec0b10de legacy-trunk
+9760 6d0c485ba5e4193c26b344335b2f6299ae1c3284 legacy-trunk
+9761 3a3ee075dfb6981dc6945f10e99255d636e526c0 legacy-trunk
+9762 2f0ce4fb810ba301bde2d1f5e6a8bf2c3afbc5c5 legacy-trunk
+9763 ef269ab770bcc5be6eb2a6c477614f58085cbf94 legacy-trunk
+9764 1d51179cf7c7fe4549624e896bbb8196c0dd8c87 legacy-trunk
+9765 af2bc5f45918a7012088be557da1c92d0b409db7 legacy-trunk
+9766 4148e4bc8b285f9b10d9c54459cb1ecbe6008e3c legacy-trunk
+9767 6fef030a95d49c65942e18cce7905e8296dd7519 legacy-trunk
+9768 72d531d545729b0036890259ff60715a1bf0ff2a legacy-trunk
+9769 b7f84d179e51a03d5f5b1d6229f4f178e2a2f5b5 legacy-trunk
+9770 6ad234ad8de5c6d59f6f70534d8cb0ca4764a289 legacy-trunk
+9771 0dbec98acfc9674649a7a5cf16ad1fee8ea23597 legacy-trunk
+9772 8e64c5d5548a2a40b455caa17549b26a1c2cd9de legacy-trunk
+9773 285449268c37f08fb0b8c19ea04df4602efb87db legacy-trunk
+9774 b024990d61ec8e23d6da865c59365f36157def1a legacy-trunk
+9775 fb0c5b307476deab21f85928464369b0dfc8d2ae legacy-trunk
+9776 3703495315e9a643329194e1bb5341fa0219c21a legacy-trunk
+9777 08f9b901669ba1ca2cffd46110eaecf8542afb43 legacy-trunk
+9778 441ae4f4cfcf915f3ca7708f293daf24d810ea1f legacy-trunk
+9779 4f84202c377acd1e858a4b2b4832f9ba733cf872 legacy-trunk
+9780 640f2ef4da2124e53bccbdcb972afaa678610586 legacy-trunk
+9781 658b742e435035cc689e1fb86080687392e89c82 legacy-trunk
+9782 26a8e9e8cb8411d68a137a8a439d6c56830a75e0 legacy-trunk
+9783 067e4813c6d67a080cda17af791a55268ec1fe27 legacy-trunk
+9784 f89e9cddc096130557e6d9e7f42c0f51f79d731a legacy-trunk
+9785 c98fef922d51468cf20495080da0cd853aa2f2bb legacy-trunk
+9786 8096fec722ba796af37a297cef146396ff3784c0 legacy-trunk
+9787 d7266372dd371c9d1a7238d613c2b94f6f3eb8da legacy-trunk
+9788 6095a472f5745c3aca7419595b7196535b633194 legacy-trunk
+9789 df764e42b258f577ed53aeb1cfa633b15abfee24 legacy-trunk
+9790 48df2080d7d4829c1298a8c1ada3160ce2009edc legacy-trunk
+9791 5ae87a7f9a323fd652b29bdb914111a3d6812a4b legacy-trunk
+9792 d23bb969e63a0373c6fd2cbd43ea0fc3ca9764ed legacy-trunk
+9793 3a55fbb99f20477d40b4e7bbd35061eb91d0249a legacy-trunk
+9794 f6c6d4d97dc651a5310f74331557b20d1e8e0f15 legacy-trunk
+9795 92784824800c3dd373d14e5965e4527a7c5d51f8 legacy-trunk
+9796 830009b573ea094b74fb44d032d2f17622d02676 legacy-trunk
+9797 09892bf6a50dff15772440ced983983584c85879 legacy-trunk
+9798 1928f05ba400ca2eb633e63c34f86c3e5771b783 legacy-trunk
+9799 98efd5d91fca4ffdd6a5e8073f7086b31e2ee9eb legacy-trunk
+9800 724f807260550de82aea604e5accd57f2d82bada legacy-trunk
+9801 47ecf02aaf97b14e1c1c861b37462feaa77ff1b6 legacy-trunk
+9802 55125b1144fa3a6a5e1691a283d5b81ad934ebc9 legacy-trunk
+9803 6e00fb723f69dbdd63e2e867453d1592a1eff467 legacy-trunk
+9804 fec8e084b074f57027ae3e363f75384ce74c157a legacy-trunk
+9805 45b66e9ab5efa0081be395db1912e55a4bcc8d4d legacy-trunk
+9806 c2a0869852eb845b98a9fd67501a282465f425b3 legacy-trunk
+9807 e4c74f7f3e46594a4db8e184836482dc568cd6ab legacy-trunk
+9808 9ae215ca20db4b877478144ed888f27331e6f8e0 legacy-trunk
+9809 83a30a3583d3f36a394b7dbbb6f2ba4acf246ec6 legacy-trunk
+9810 252539871873c21aa059571f210baac9096110a4 legacy-trunk
+9811 6e9688ce7c57610279fc9d0ed82fb7f3c96d4ae4 legacy-trunk
+9812 3965b69d5116e5990fc463fb06cc0fe382f6ceb9 legacy-trunk
+9813 c37a28a3bb85b267a84543b0da04bc7e6a856a2d legacy-trunk
+9814 e148ce18c3ce4b3c9dce415c71345775ea91b9e9 legacy-trunk
+9815 12939c8b4e30a544dd9ef5c7799656aafc313a6e legacy-trunk
+9816 f9048600905e8cd4348c53e1abe3c994bdd43c44 legacy-trunk
+9817 e8b8ba169b6dd0e6a5391f413c5f3cb54779b0b1 legacy-trunk
+9818 6dccae75b26f6b2a0c635c1f69a284f6ac5147a6 legacy-trunk
+9819 0069f3eba9a2502c9fc16cae4a40adfcf74c2409 legacy-trunk
+9820 9f74f9223b435578075442b03c5998d1e4a6acc6 legacy-trunk
+9821 4ffcbcc5e8fe3933369a236d7c0b2509ec5b8539 legacy-trunk
+9822 bba2b205f8edd49ff4ade6d73b6d034c984cbf78 legacy-trunk
+9823 080969dbfc7c518905f070c0d2cbe697b83d971b legacy-trunk
+9824 5a9256b8c3382a3eb883be9a284de355e261084d legacy-trunk
+9825 d76a4efa1f51df945064387b9fe861a5ecacf319 legacy-trunk
+9826 7ba9cf4e0c40404dca3223180af29a12d41219f0 legacy-trunk
+9827 2bd5fbd6087099a854cc49ba993bdbb7ac7a685b legacy-trunk
+9828 4ff5c1498dc8db9c6f8fd810d6a1bfc9905adb5e legacy-trunk
+9829 1baca5d2ba57a4e5b0cb2c6a79a8a8d8266aa190 legacy-trunk
+9830 0d31c7d9697d7c5ec79b7a63e040eea682670d20 legacy-trunk
+9831 a4d7bbff95a4b5f5645e1d58d8213b3c5975b6f2 legacy-trunk
+9832 e4367d206a55f76302b3fb04a3a2d91e85814353 legacy-trunk
+9833 b285fbc2646a4986a5c5ea93e1f9d15d803cea01 legacy-trunk
+9834 c6325029f7dc88c6dfebe2bca40c593125343633 legacy-trunk
+9835 3e27f9fc75a290f51fa2275cc1ff40fe9a08ffb1 legacy-trunk
+9836 1421aceae3465045a5787de7511178f7ab78d5d4 legacy-trunk
+9837 d70086b08a0faf01a689c98c1162b901e1f0b700 legacy-trunk
+9838 2a07258b1f4e086cf7b319b611455d04fdf0d79b legacy-trunk
+9839 621440bb98b9c26088c98c1313539d7eb835e133 legacy-trunk
+9840 85ff2046e37f81cd84e0010aea091859a2cc3492 legacy-trunk
+9841 f4a4723b95532ab904af660384bc704818ef2822 legacy-trunk
+9842 f1c88d2d125bfd4306dd0658cffb899d4503496b legacy-trunk
+9843 187b89675ddae40c40506b8673549eb71949a3a7 legacy-trunk
+9844 717c3daca08e953937889982d92c15ab5df61fb7 legacy-trunk
+9845 0c79cafec4bc5508c6e6e30721d7b2294b566064 legacy-trunk
+9846 21657bb0be35b4c71dcc83449f2f36d23a2ebc0b legacy-trunk
+9847 fed3cf72683dc1747ec3c2c4b9615762054657bc legacy-trunk
+9848 1f4625fe66e2ca8ce0ba8bf2394d2670517c6119 legacy-trunk
+9849 f5a189afbcf994dd9a145db8f24058ccd1b2170d legacy-trunk
+9850 1e66c4e31d150afd8b0b9e5bf22e56e9dbf1a7c1 legacy-trunk
+9851 89559ee85e540d2ee4f085e6a9abbfc09da2bf27 legacy-trunk
+9852 8d11b3671e5d6187d937e68838b85bc5d127fffb legacy-trunk
+9853 00338a813dcb8bbe1c27f5944eae469942b7d0b3 legacy-trunk
+9854 fc6be7ae012f44cd8d240752d682e9fab18229f2 legacy-trunk
+9855 f78af5bc78edde66b8375ed6760232e1452e56db legacy-trunk
+9856 0e0e88f8e1ad51fafd361b0d49cdb8e640def92a legacy-trunk
+9857 e63f2adfa7cc845e991902d9c514b29d43e12063 legacy-trunk
+9858 62ac57de7adbe46cde8ef085966cef2aceb0e9d0 legacy-trunk
+9859 10840c3737a7dd1093d2ab860043fe2895871068 legacy-trunk
+9860 69add4d7736f106569014ece99872f4e446b0617 legacy-trunk
+9861 f8a77224ebcaf5134bfcc1f938c957684213f9bc legacy-trunk
+9862 b58b2ee65f75f5192a3d90f4085af74bb157c0b8 legacy-trunk
+9863 6dd651caf9e066e3ec91e88edfd6c737807e9892 legacy-trunk
+9864 f4040f3bdcc737b665f9c29ba0a6d523fec76475 legacy-trunk
+9865 46119d1e9413f7a0cce78fefdd2552b8de90b213 legacy-trunk
+9866 edc0d021e4276dfb5f7eff29cf58259acd41f507 legacy-trunk
+9867 543b2b4af53259117641d4c41e16c5f1771cb1fc legacy-trunk
+9868 223433038a47e784858f44acd81e2960e07edb90 legacy-trunk
+9869 b64a8cec8d75c5aa9325a871da257becfd8b9da9 legacy-trunk
+9870 0333e4a952f93dbdc8c31ec5b12b9ec073089581 legacy-trunk
+9871 028f70d508c0b615f62f83408650b56a4a048100 legacy-trunk
+9872 767bf8004cffdfed2235c04f73f22411a89cbc3e legacy-trunk
+9873 786875c4c62c50d7c1e0410780d305dde89e1791 legacy-trunk
+9874 fbc75535ea93cb3f2b5486b10b33d465b8c56fca legacy-trunk
+9875 45d65bc8a550f3379aedb93155fa723fe832c3bc legacy-trunk
+9876 7afc15f08d82cac37239c501ed12fa895cd53289 legacy-trunk
+9877 b8d78650f8df1d5bc5a71c7a2f4726f2ff237654 legacy-trunk
+9878 685c510e14ceeb5d4e2fc67e424e41ac1e766e28 legacy-trunk
+9879 8c01cfee14ba19267b1a2b0c327de69a33994925 legacy-trunk
+9880 c7454ca7d3acc143e02a0b6f9bee0520060b9af2 legacy-trunk
+9881 185c1d47ce7a08749ac73a988cf6711e338f0229 legacy-trunk
+9882 3a77bca226b9377ff2a8da233745bac9400be897 legacy-trunk
+9883 c51f7b6d2556e4695098de2f7ce7aec8198dee0c legacy-trunk
+9884 3a49f5886acaeb09e63bb84dfbd91c8d32a1fd7c legacy-trunk
+9885 2c54901471f5d904d0bcaf6b3845d2ad300b97e4 legacy-trunk
+9886 d88bf767145825ab4c4a6db9d0c8fdeb7abf5931 legacy-trunk
+9887 dfa247764323702458ab0999f16f6cb66324cc18 legacy-trunk
+9888 d758841a7661bc7f3c808cbe73140c473fb95b91 legacy-trunk
+9889 ad891f6a19eeba4d32518720d79c584227ee64fc legacy-trunk
+9890 297bea233e032fbdf7937ab6d84934167edb0876 legacy-trunk
+9891 dedce9b6874240518840270f78d92400a1abed93 legacy-trunk
+9892 65848a7c77b982531a6e7dc970f11bf69b9e5958 legacy-trunk
+9893 a1435c7d339b7fc213763b3bce10f4618c25d04d legacy-trunk
+9894 13f29b62a209538fd5628ac36640ea42679333cb legacy-trunk
+9895 6255dc861fcf1353fe2ad262568c1a8ad2cb0646 legacy-trunk
+9896 b1f195c97ef99a4fc6f249eed1a6cd7845c4aa30 legacy-trunk
+9897 7ca2c3d8766206ae25f5478b4039c2fc561d5063 legacy-trunk
+9898 3d9f51050abca45b72e9674d7627494ac69c0bd4 legacy-trunk
+9899 4393897852b24486b23921d0d4c195423d249e2f legacy-trunk
+9900 2d508822e7f6885a83e393e8f1adaa5c659b6986 legacy-trunk
+9901 6e73f4168b062eca5f77a07b558f23a173130991 legacy-trunk
+9902 11e9337cda3d147ee6d4e02a7dd2d6583e2c6b38 legacy-trunk
+9903 29bdbe039e05ec85ad7945b02f6cd421255852ac legacy-trunk
+9904 b3e3dae9b6122442d146221b04b3329aef5e9169 legacy-trunk
+9905 5af7d3da87cf6acb7922602c8072fa29a2df2e72 legacy-trunk
+9906 3f2284344a41ba24f75d056fd03cc886f861a522 legacy-trunk
+9907 83e7759e7297869ddda1cd17742d1e5645cf6eb4 legacy-trunk
+9908 7df6f0453469177cd08fca58a7eb28a9030002d1 legacy-trunk
+9909 a9fbf21ab7ce9ce7936e8a3cc59945cde084fb8f legacy-trunk
+9910 365526c4cf8bb3238466594d07323dce20582eaf legacy-trunk
+9911 4f45dccda96b28747e33d41e154d5bd1ca4b43b5 legacy-trunk
+9912 3de0cb82e61ae651be0808e620189095edecd769 legacy-trunk
+9913 cbacd1be7275c00f3c63b95eb5a384cf2eb000b2 legacy-trunk
+9914 d1465b5c0a0894e15511dc17babc3b4172f420ee legacy-trunk
+9915 3740ff2ee053ca93d8905bec550aa466b9a289e3 legacy-trunk
+9916 cd11690cb14b072e70f25e8c3fda748a11b9d181 legacy-trunk
+9917 a64c89dae18d60e54a82eeade3286a74f6b30418 legacy-trunk
+9918 590f6254f9a9aeaa42023edb568be8eb0725da7a legacy-trunk
+9919 a8059b96bc355aa8b62fe16537cfc20e934cd316 legacy-trunk
+9920 05189f7cdbeb184118d6168ad331f950c1a9f068 legacy-trunk
+9921 9815b18b23e3b685a9af23542b53cb98d1b36791 legacy-trunk
+9922 3720e996e5512739140dba298c9d1cb255039273 legacy-trunk
+9923 1668499206dcfbb582e7e52a6348a54d40f5439a legacy-trunk
+9924 2933fb34f333fd52c173920fa94f0540e1890b62 legacy-trunk
+9925 826c71801911cb0c6397d8964ad66148ff8e4638 legacy-trunk
+9926 c9b6850c4336a4cdafa2a3f5002edebac4b4f179 legacy-trunk
+9927 5edceb8f1fab7ac680b19a9cd49bd55bc302f2f2 legacy-trunk
+9928 0d767614c941eb10f5ec2932c43ac71ba9adba19 legacy-trunk
+9929 0a9541a86689094de413f4ec6c00cde2d8eb59f3 legacy-trunk
+9930 23cc342ee150ba8401fbc3c39bafe340a35a00ca legacy-trunk
+9931 3c38c8ad5623fb40d4afda2613325c377be9b004 legacy-trunk
+9932 1b4a2e38ab5ec67ae3e5190e7f8ed0b253768630 legacy-trunk
+9933 483286e219e1f644463b4d2bd7b2f126a5f11ae4 legacy-trunk
+9934 bd05ab4731f76b3ce44d430c53e770d4b6946888 legacy-trunk
+9935 1a9b09b3caf8ae5e285b704d2d9ab7b4a4daaeb4 legacy-trunk
+9936 ec95e8dae5041425ae57ca57c196f0e4e4480e79 legacy-trunk
+9937 4aa4710d894c8268f42e6a40816956b6d5b6cd59 legacy-trunk
+9938 bd81538d4ddfd47617fdb45ba39858a9fda64cf2 legacy-trunk
+9939 031de8540a7ea05db54d01facf52f8f423fce0ce legacy-trunk
+9940 9541b9b0937ddf14c0b648b1cbec230472ba5f5f legacy-trunk
+9941 82947a1926f782defbe0cd75397c576099e56c13 legacy-trunk
+9942 021237ba5007425e020e7ce968d8903955860a2c legacy-trunk
+9943 7b2fd486efee1cd8fde20afcc16b88375bd68023 legacy-trunk
+9944 cb1a577c0239cbb0d96879bc04fe29e356f30be1 legacy-trunk
+9945 0360e3e30a2e40c4922f78d5d718182fa55997f1 legacy-trunk
+9946 149a547988961b7ace628aeec16ee3abdcc616f5 legacy-trunk
+9947 ad3e4eb35da772390c50c0293786b86fc9a06e19 legacy-trunk
+9948 6f869e5d33ccbf7634b7a0be5eaa412af82efe26 legacy-trunk
+9949 881a5e6714dcb70a5ce079f521fdbe071d30f0e8 legacy-trunk
+9950 6bb506ad96848ac2a28cf5170b7f57c9bfdfa2ff legacy-trunk
+9951 2cf1cae9b46ef37f02d5c7864dc18850d0accbbb legacy-trunk
+9952 076b82e040a5c9354e4b85dccb21e23956cdffad legacy-trunk
+9953 784fef837b52dc8d60181dcaf50c8c002ff3477a legacy-trunk
+9954 ca66a2536cd549a597d96b18254e03f47f494983 legacy-trunk
+9955 b9421e17ddf7631d07fd23f0afd61ac5b6c4cf7a legacy-trunk
+9956 80739b0bc3026c92a8d23d6a4ba83ef8f6d89571 legacy-trunk
+9957 bfe57efad751fadfbe9b265cf56e3876b0db9650 legacy-trunk
+9958 55c3fd1853cebb2f4ce7b9fba3a068346c7f468e legacy-trunk
+9959 cca39d719aba6e5c04596d3954607528d0d32615 legacy-trunk
+9960 f01ff26facaeb87382a0145da9fd7ec6ea39aca9 legacy-trunk
+9961 ba4a02c0e90c792afa7e1a7c91d3345e4c10b813 legacy-trunk
+9962 580f6c92270bb870169a0aef877ee6f4a3a55b22 legacy-trunk
+9963 1dfc15e3113043d6008efee8c29fadef1d70c45b legacy-trunk
+9964 4cae2de30b57fc5e0bb3d5ccd6fc378317d30ee3 legacy-trunk
+9965 05d0b6fbea9b5dc67ceead3652fdc48267292c4b legacy-trunk
+9966 98345aa1d5fed31633fc82eed19d927921460b77 legacy-trunk
+9967 427b81c2452fe1d72fa100a4b7250bd40b4b1bae legacy-trunk
+9968 3dfc376e6f1a8be4ce9a0131fc950e6a8a714b12 legacy-trunk
+9969 7f28997b2c106fce23bee2bc1edf26fa237894e3 legacy-trunk
+9970 54456f08ebad75512d431aea1a18adca71a6eaa9 legacy-trunk
+9971 6857acbe2e74b00af860af2ba871f512975b39ae legacy-trunk
+9972 c4d56fc63d8f038b4ab416c14799be3b6e58a6a8 legacy-trunk
+9973 6b0266679f9695258d7fa4139c709a9f86457e24 legacy-trunk
+9974 ec7976d2d5e9e413e218892e96d7e79c2ac86816 legacy-trunk
+9975 5e390078460ae8e42b3f95d36687c1364f9b871d legacy-trunk
+9976 1906a7fc75094d6826a3fca5b2cb2a5a89d613ad legacy-trunk
+9977 d9591c9b2c5fa4d15a5be926a604926bbb277f97 legacy-trunk
+9978 9de3cad509050c2ac6c46bebb913da3e12494203 legacy-trunk
+9979 d17db3ebfbc205dc185764c329583fa22c5524d4 legacy-trunk
+9980 f23db3b65c8381fbed7ed7444f606bfd89a9598a legacy-trunk
+9981 754586039c11b1f9cfa410fd27f24192f1e6466d legacy-trunk
+9982 894cffeb89ba53517d6ace6fa6c062773af20245 legacy-trunk
+9983 ef980e17b5939cabaf621804a8034798d2361a56 legacy-trunk
+9984 67a2b96f0189734946adc3e025c3704e86368154 legacy-trunk
+9985 510e524467ce6273dec2bf443803c69814741351 legacy-trunk
+9986 eda0ca138b3d84ba91196338d0e5ea9e0ac2a448 legacy-trunk
+9987 b5d52c415b15e9e4cf0ddf8c5c7824727e24d3ba legacy-trunk
+9988 ec4735ce1360843dcc6e77a30f7f301d78ba5032 legacy-trunk
+9989 35a3cc24ef04327a6ba6db60e041ac49eea01de8 legacy-trunk
+9990 e3f37a2602d504905bb925881b637639683696cd legacy-trunk
+9991 4888f448450f23da02e2d68255d67929acdb4bb8 legacy-trunk
+9992 970e9e058b761c4c847c1b447cd22dfca0298f7d legacy-trunk
+9993 ec0f99f1a2fdb0ab9f69d30f90b84d444ec098ef legacy-trunk
+9994 b60424a56f744e5ee42bfd4fe19ac2ca41273a02 legacy-trunk
+9995 83c2a5a45a41b2fadb939a3c3b6a0fdb25358cfa legacy-trunk
+9996 312ca9fdacff275be920704496a95c25b662c6d0 legacy-trunk
+9997 cce8994d52cf0e8a8300431fe7696e7db882f272 legacy-trunk
+9998 f9da34f7268b51c871f2f143da8006422d4c3795 legacy-trunk
+9999 fbc892243477f6ccb6ea23ae3bcde54a064f9797 legacy-trunk
+10000 dc374711c848cd66137e9b6a6e6eb4c17c04fae1 legacy-trunk
+10001 5e4c2897e62575e9e469a0af0059f7f7cfdb56e6 legacy-trunk
+10002 eeac36bfe01aa3f1fc8d1d1fd5fe0ea873845d04 legacy-trunk
+10003 88992696b9e8d17d55a84de332b59b9c7d7d5768 legacy-trunk
+10004 60e7b000f27384623dc147d52aacc3399bc5d39a legacy-trunk
+10005 26a8771a4cfd009b96d73a58eb55e0072e8c9eb4 legacy-trunk
+10006 3caf2397c5081553b33cfb7e9bfb5a9e2e8e909e legacy-trunk
+10007 034398736e64c418cbd33778755dfdbde11e459e legacy-trunk
+10008 891105dac9b418714488179be2819ed1ca35c4e2 legacy-trunk
+10009 b4660ad7dc41ea174f895963ee5284ac032dcf1f legacy-trunk
+10010 bf236fbf11daae3a22c11467e0cb4b73a21643b9 legacy-trunk
+10011 ea8184bff12da5c0d1ea54bc816236b63713b0f0 legacy-trunk
+10012 f91d5a0339bf3aa38ea904f728564795418aad8b legacy-trunk
+10013 13b60abdb70d19ea066f2203c1163cee4b736851 legacy-trunk
+10014 eedac50d77443b0bbdccf9c6d528720fcfe11fbd legacy-trunk
+10015 3ff6b3d3c4d5e2f3f5db7bcfa9f41b1dc5703625 legacy-trunk
+10016 01a9f84a269c9da0a9be01f0abc278aa6e49fd4e legacy-trunk
+10017 7830e1de9817457eb1fc42db753bf3bd90e946e7 legacy-trunk
+10018 9dae0ab383a498e1b5726684018698a7b7e9a577 legacy-trunk
+10019 c9f4aa2c45edd67fd0c4c45b440e3aa48441852d legacy-trunk
+10020 ca170d761f086e305c8b5db6c707571f121fb304 legacy-trunk
+10021 48f7ac452d99c94b933031d7b7e9d96c4a697d41 legacy-trunk
+10022 d202c82d3c571626d36f1c440f9c5f51fc1c9f0a legacy-trunk
+10023 c0131fae06e9e07211c844a90dea4d72ec8617ea legacy-trunk
+10024 6421ea1de28287b24dd64cc7b2647bffac9531bc legacy-trunk
+10025 d4d84b54c44d8189e203a1403d38d7899d09ba48 legacy-trunk
+10026 7eb19b1ce84d74f2e2c955a630c69a597acc48d5 legacy-trunk
+10027 4b11cb961046a0c4d872d5f62cca53099b4314f7 legacy-trunk
+10028 69860821ca1d5da6651dd466f9b24f367ddcae55 legacy-trunk
+10029 d34fe30b95e8568213893cdf07cf3c039e8d387b legacy-trunk
+10030 c8e5f704623d89011f86fffc294b09e054055231 legacy-trunk
+10031 82eb8b3df6f826543bbf961f70e5254c1e8c1eb0 legacy-trunk
+10032 5df656cd10ade1d35b576c363ad2c12812ca9088 legacy-trunk
+10033 5aecc2509e46d9f4bbc84eab0a7ec12c248c1930 legacy-trunk
+10034 733950804a0b42affa0bfb7fb3b70e8ad616a267 legacy-trunk
+10035 6598384d5f4cbed9c6fda02e4242767ad5c86023 legacy-trunk
+10036 22de5116832fd65e19b9572c3b174e8fca8b2f20 legacy-trunk
+10037 c02af1e713edc8a456473beae144721be5c79503 legacy-trunk
+10038 a447b268c7732bd908682c11527fd06051901af2 legacy-trunk
+10039 cc7e126f009d389d83b254e4d93a0917f0c2d8fb legacy-trunk
+10040 43f47b8e398da53da99a864fb31ed92f7049520b legacy-trunk
+10041 59b1ab01c286ef317a58e67efb29ac5368a1bdfd legacy-trunk
+10042 1a9f9a5df04b16f0bc57ee1e4b4e25051346edb6 legacy-trunk
+10043 ba10c42999b8bca269cb20aae6dfb16f120a9276 legacy-trunk
+10044 2ff2e457ab87ac7aae2bb9b07333b3bf201a2770 legacy-trunk
+10045 00aee4743d7ba69eaa9e8520980240464a8dff89 legacy-trunk
+10046 e15e85d987af89e6660a9bf9e20a53e8b689fd73 legacy-trunk
+10047 b9cbf174c7238920867cfcfa582e4cd6d9b411b1 legacy-trunk
+10048 8aee50a9a1b1fa4c74c95f17f48b8fef11675171 legacy-trunk
+10049 968aaba281c53f02b3f45c191495fe9dffaabfb8 legacy-trunk
+10050 c9f417124e0f76654b88a6f24b8dec3657fc867e legacy-trunk
+10051 aa0e8199cc3183b3d8817786a7ef97dd87a42fec legacy-trunk
+10052 7e7d6b1b8a4b2bdd6a64705b03a6afe9c0af1962 legacy-trunk
+10053 e671145ab507e1d681752a663839847920834a31 legacy-trunk
+10054 2a056d193dd37a7bd49150223732e45901d181b7 legacy-trunk
+10055 827aea5f562190d0501358e2fb428d3435034629 legacy-trunk
+10056 2043c69ff1d455d8392bc64f5bb681eef231e534 legacy-trunk
+10057 42a21806b3d2fee5ac5f46ac9568a79cff4b24b6 legacy-trunk
+10058 d5f89567b5a9f67d0b32305a31752c7be361d2a5 legacy-trunk
+10059 0f565c7fe4bbfe9b47ce9a5d5921571b2f683760 legacy-trunk
+10060 0a4b45338ac285256ddbbe23235f9a4e022c56ef legacy-trunk
+10061 9de0d5049ca1b65f798a46218e8bd4f6b71aa319 legacy-trunk
+10062 d2b5d9326f0915470f6fbad98dbd298c26fcc1e0 legacy-trunk
+10063 2ef0aca96f2d33a55ff4ae75cbb3372974f7c88f legacy-trunk
+10064 0765b958cc67a19be2aa8f746e8d6ba0bde5faba legacy-trunk
+10065 fc760c626950de97786b527634da18637eda4389 legacy-trunk
+10066 4b634f0243f97d032c10bbe46cad23e6382b270c legacy-trunk
+10067 bd0886e78f3b7e2b4e15b7c8cce33fc862f34888 legacy-trunk
+10068 b6d6a834db49af15e476272da6fc4b9e7511c8be legacy-trunk
+10069 2f32323811c5357ca9cc6e8b67f5014d9cd75e18 legacy-trunk
+10070 09440606aac588f49c69c03babe8d67f44bf0915 legacy-trunk
+10071 a19029cd76c5159ef500aacec745f048db7a9a3f legacy-trunk
+10072 99cefaa9c50972c5b3b25a6852b7073a8c57d1b0 legacy-trunk
+10073 c456ebe353374de1e557fb50aa31b744d87b921b legacy-trunk
+10074 aab76220505efdc692df4a3929ed5bea4c08022c legacy-trunk
+10075 39b84a3dceaa50340b100ecdd7ad733dae35b48f legacy-trunk
+10076 72cab95d35e5709ee9906c1485f7c432fa64e854 legacy-trunk
+10077 09415680bd4f6c48142b9d01ac29c51258eb4c19 legacy-trunk
+10078 6a453595e619e980765e7f7c78434a696b588753 legacy-trunk
+10079 ecad234c87e44d8eac0c04278a73ae69fb91d475 legacy-trunk
+10080 7f4a503ce58b26f8ac2b9f3259a8a1ddc85164c6 legacy-trunk
+10081 c0bf9b60c2980b238b4ea8b71e9202fbe21a90c6 legacy-trunk
+10082 a63d553eb658292b9d048cb91dba93d7bb629e40 legacy-trunk
+10083 59407d448b6acd920e3d1a370428feaf0fb508d8 legacy-trunk
+10084 c0c02e9269f3cc956934d0276e08bcf7daeb0bed legacy-trunk
+10085 00ad309bd50810d8bdf9f90d182d814029afcccf legacy-trunk
+10086 893a32095222541fdf6918ced9b5f3e2dd30c9dd legacy-trunk
+10087 afbbfe8f5496704a7ba196d5eb7086a918c47fd8 legacy-trunk
+10088 70bcbcdda74f61a6f3515e82a40ec32776571b09 legacy-trunk
+10089 cdf80f7458ca1a73d60e2ebbddccfd31c6ee2004 legacy-trunk
+10090 46f2c4fc9e381aba2699b2a888aac6b31b2e47b9 legacy-trunk
+10091 192ea9884eb67dfca654b0870e07e82798ad0482 legacy-trunk
+10092 f35b29eb52d197e9b6e69751abe5af05c80b75af legacy-trunk
+10093 dec65fcea21eb91e640f862c6f163f59dd74ba83 legacy-trunk
+10094 0e1e4b4a0821029f5935437b7e71d6d61eba7545 legacy-trunk
+10095 068a6942fe1a12ea54c9f6d49842f45cefab9ad8 legacy-trunk
+10096 a3a6ec259986053a65c8fbf6c8e9887c41483a3e legacy-trunk
+10097 293b0cb3470404c29a27e400c5bb82ffb675be69 legacy-trunk
+10098 ece604ed6228183a8c91cc941d32061668301b90 legacy-trunk
+10099 9cf6f94095965090a75750a6cb32dfc606c5b5ef legacy-trunk
+10100 0a20cce17371498d473b44c0f033fa0eca44e319 legacy-trunk
+10101 c54f1ccde6a9deb6298873bb6f480d3a3c87ac7d legacy-trunk
+10102 a787429e840aeb0ba6cacc9a5a807cd4fe4d8e70 legacy-trunk
+10103 0ce659047bbf3227cb2a1aa480ec36fabf923f96 legacy-trunk
+10104 5aa7037a1e3fb50d93224d6be021c3bdbacf27d6 legacy-trunk
+10105 a0c7aa0522de10d9d7bc023cf3ad8d95442558cd legacy-trunk
+10106 1654562824120dcf99b8f826b14fff0f77b4024c legacy-trunk
+10107 7960da0549c4743e2964b996d8c6c682b2b06865 legacy-trunk
+10108 db1e514f16297302d458c9da84d5f242491cf85c legacy-trunk
+10109 422bbe885cbf71a612fcfece0a5dbf837b0eb4c2 legacy-trunk
+10110 d22cf666fa2c88c5087a2dc82cab024bc7f4bc5e legacy-trunk
+10111 55345d6d2c141c02e20e2a23fc5f61937dddc64e legacy-trunk
+10112 3d1590b5e3ddfdee2b27827f6b4df93b2bddbba5 legacy-trunk
+10113 bbdd28d36f42977fb6f4972b2451469023da8e3d legacy-trunk
+10114 5472ab610fe9e4996f5b1669efe0d29219f658e8 legacy-trunk
+10115 c112443cabe116e2251e00f39848a9ce4d7ef44c legacy-trunk
+10116 1c0f58b76081a8702709f9401ddca323d5d6b44b legacy-trunk
+10117 c6387e242b780afc688c06cf7cd936034392c549 legacy-trunk
+10118 0950127185eab64d69b80e08a0f34db2feb3e64a legacy-trunk
+10119 2bbefec1654204ba5acc7a998bb885a9cf420d60 legacy-trunk
+10120 f7791617c2b25d96d7ebd544e33af48c182d0efe legacy-trunk
+10121 b95e523dce6cce10b18672095a37bcbf97546e08 legacy-trunk
+10122 d8d88447f3c1314c7226a64f8ac234f3c6347bc7 legacy-trunk
+10123 7ad522a4c753a104a1dc4f7159d51b5a5f6575a6 legacy-trunk
+10124 d92f10c451a138da43451af3e555c07a48aa84f5 legacy-trunk
+10125 dee56025d390b41f3d0fb50cd88291b801c2624a legacy-trunk
+10126 02c66428f04841df7237675ad52dd16c08e54568 legacy-trunk
+10127 932dd6b90e13a79230fb58af505a84a95278f82c legacy-trunk
+10128 ea68619fb56d4d541d3a6a478e0dd2508b4f8646 legacy-trunk
+10129 9552d4b3d9b781425e38b2d80dc2d44d27969e54 legacy-trunk
+10130 d64dbd1cd32eb437918160572406de05a3559b67 legacy-trunk
+10131 b86771b0d7f9187cb121aa95559df8de21bf6c26 legacy-trunk
+10133 75d0048c8643db5e4b6e25261fa054c4ae9884ed legacy-trunk
+10134 73eebdacfb77623f8305cd5804cdfa15bdb6fac5 legacy-trunk
+10135 6b3d3a28581f4c0fdd4eeca1adc785e79088c404 legacy-trunk
+10136 f017c4858ba8c36abf819e7b714f4c8ea008f7d4 legacy-trunk
+10137 f75ff8d4434d87b5353b6eeb4c6f0b0ab448364f legacy-trunk
+10138 869373fa0bf8b864d4cb79df7d2a3719256a50f5 legacy-trunk
+10139 f03e665d9f72889dbdcfa62c4082f074e255d47c legacy-trunk
+10140 47ddeb07957546b32073206dfc276635e045f429 legacy-trunk
+10141 ea2d3217d0c721381e091b60340698c36df9f400 legacy-trunk
+10142 acd393a93ed044a52558e11a25673b6a78d20e8d legacy-trunk
+10143 f2855d2acbd39944f3924bf26239c848355536bb legacy-trunk
+10144 abae68af334f652a324a4f9f944b8fda4887b1a4 legacy-trunk
+10145 c9394aeaac6adc27cfd2b3657aa1b8239388a68b legacy-trunk
+10146 35f29b7dacf518c52ab4b67586f3c7c026f96cb3 legacy-trunk
+10147 ad34671cd4c9629e46fdf02461a2ac6a34f125e3 legacy-trunk
+10148 1f8c8e0bb5ef600d57be367ba625933699c069b3 legacy-trunk
+10149 8e6a580198873e60a0b030deec10b42106e882c6 legacy-trunk
+10150 0cf2ffaf4bd7c50edbb454e24883290091693f4e legacy-trunk
+10151 1fb868f25459fe36e230480648bb9bb778db5ab1 legacy-trunk
+10152 528e2b94e8b9873a763d237db87967c4d6ee95dc legacy-trunk
+10153 357b77e345f36560f2eb685e84f19c517b4ec806 legacy-trunk
+10155 7122ff4c4abe69ca2fa32e30a451a799ba59a79f legacy-trunk
+10156 bdcf708ae4dae8cc987ab50632fe217902922655 legacy-trunk
+10157 72f2abacf151e41848ee918a25359ab242c62e15 legacy-trunk
+10158 4030059cf97c13410a30a5fc75e6388bc33b0bd5 legacy-trunk
+10159 a61018a2a502a42fd94a3943673040c79792e706 legacy-trunk
+10160 2c9c248581a2023dec2a145cba880b2275ef3dda legacy-trunk
+10161 e1e76766d8cae156020802360eed5615f8d8a532 legacy-trunk
+10162 5334eef1974c055ce91fd5090ad02365b3c368c7 legacy-trunk
+10163 6bf74264b9c0c31545f717755e277a53a2076b94 legacy-trunk
+10164 f0d33fdb392193f7ebae7a8318f199e5d74252a6 legacy-trunk
+10165 afdcbef17ec0fd0694352914657185f42d679f5c legacy-trunk
+10166 483970062915115aac048fe73dd43f1779addc54 legacy-trunk
+10167 c2e1db1e1bb8fbd1cabe14835f6696e96890284c legacy-trunk
+10168 04d7397970c2067a7fe4e5b5378607d35d7a777d legacy-trunk
+10169 554f2b879fbb11cb20f2f097cad3c3c8130e6d05 legacy-trunk
+10170 f924727cd00b6ad99a6af5e59f082d617159fc01 legacy-trunk
+10171 9bf81d93b995b4c15a56ed92d6d279e8cf2ad221 legacy-trunk
+10172 57a42183897dca8525227e80a23e8fc191ae9dd5 legacy-trunk
+10173 ffcdcf9ff0ebc66aa7821134d5af6e006e10e098 legacy-trunk
+10174 5e3c9d530bc1d3bb402d4f62e7201ee7e090a41f legacy-trunk
+10175 1ced036715749ed8807cc47d35a85488930ec3d4 legacy-trunk
+10176 d23bfe06175eee7a9d63cb663c63a847d7b62c3a legacy-trunk
+10177 e40f2a6e526dd2dc0d375c496b0e99a843b6ac76 legacy-trunk
+10178 abe7f1f4768b01c0feeb4909a52cb4dc9ddfa5ca legacy-trunk
+10179 96b7c1323d30aec9c5934bbc7ff9d8f2e6fe8f8f legacy-trunk
+10180 ac877968562ccdd1cb7c699184ad575c53a57c36 legacy-trunk
+10181 2cc4bc0cd036758ed005f2ddd7397c4bd347db52 legacy-trunk
+10182 4b829e6c0dc555a500ac6930ea2d036e39671297 legacy-trunk
+10183 2cd146e2a3a0db206635b1199525db1d7ba2309f legacy-trunk
+10184 c9d546809e4f8e370a52bcfe068516d251507823 legacy-trunk
+10185 a003e14fed87723932549f1c2c3b4aec0e1d1e97 legacy-trunk
+10186 55e3f891dbb5d7df2cf92c29abcb7fd65b0aa564 legacy-trunk
+10187 23614650e29b1deeecc2f7e189b6e8e484285f6e legacy-trunk
+10188 4991aaab17bdef5512ebe3f14bedc0462bf9d4dd legacy-trunk
+10189 abb802c216ad2436651ac6a2ca31235416e87b34 legacy-trunk
+10190 706e4b95486248a7f9515e7abd1bc074b6a3711c legacy-trunk
+10191 56dcfc27710ab6ef3b3e6299e55fd999688e1ae6 legacy-trunk
+10192 0cbc9df882b6bddf4da4515e9a4e79fa28c94d41 legacy-trunk
+10193 24ff69ad4da2239fe2df6fb49fbf85fbe979c357 legacy-trunk
+10194 8da71c515716adcd63ca748db1484d9558083718 legacy-trunk
+10195 388b097bddb9551ac768c1b976b0ed907a5244bb legacy-trunk
+10196 9271340c7e0cc989409b8e79431ef620003401a3 legacy-trunk
+10197 995aea09291733a6582d387c9aad277743822eb5 legacy-trunk
+10198 f83425cc7e9675e184081553ad3bd0b5c260e0ac legacy-trunk
+10199 d21dc59c86d74d0b01b40abd97673e507f8302c9 legacy-trunk
+10200 5c7bce053d03886efd92fe55e765edbada147d5f legacy-trunk
+10201 f093fcfd5625e1db948c425e6cb276bc58101e65 legacy-trunk
+10202 67318d3fa6dcd64a39e30de09febd51e49e0311d legacy-trunk
+10203 d103c0180b2de06e55e44d107597cc41576dca7d legacy-trunk
+10204 1bb943cd2c23dc7d33fa76065424fa20696e1c1f legacy-trunk
+10205 663367ca13f816401fcff8a2bb2f4025c9fb9a8e legacy-trunk
+10206 095636b8fab7e811e7727c2def90071fbfed2371 legacy-trunk
+10207 cb256798347eb95c6192c6cda8161b170740f02b legacy-trunk
+10208 52daa70bb084934520537b5f9ae22d1a4b1353c3 legacy-trunk
+10209 89582fa1824fba99557b02e9c7df0160a194402b legacy-trunk
+10210 c109d5cad100756f505959611c0b4f44e83c512a legacy-trunk
+10211 9c37ed8868b9efbbc968f9ea54f8d2e232f20474 legacy-trunk
+10212 b8e1e1055649d6377856fd62364a9a0cb5a9150c legacy-trunk
+10213 30e331496930b5baa953bcfa2a1016254ff58d4b legacy-trunk
+10214 725b370e853f0e1f0cfaf35510707a1a9634442a legacy-trunk
+10215 7a9afaba88d842cc39e6b90a7c06688385f01625 legacy-trunk
+10216 ed320001c29a8771e705f24209a06de583699e10 legacy-trunk
+10217 5d7e4d20c89edd998b80b050c7d311d350729cfb legacy-trunk
+10218 bbfd946b0b38c8f16e5e87c3e069a954095274de legacy-trunk
+10219 1091ba2baea4a29ca797b3312664b78e2d34cee4 legacy-trunk
+10220 423be7cd0479522b0c3c5cb5fedf3cd1d3679893 legacy-trunk
+10221 e29029029414b2a9c5e680c55c665b2785f65d12 legacy-trunk
+10222 5bf66ab4dfb6f69c5213b153c7b6296b6ff60212 legacy-trunk
+10223 269a327d6305f27d50ff471d28033eaf5b827386 legacy-trunk
+10225 c498451c5f564163c24183e7e79968ed0b1a8f6c legacy-trunk
+10226 45a3dabf0fa83c902ef13c604996cae1a24feb1e legacy-trunk
+10227 792bfd473f51688dd24fb9342df02030bdcd383e legacy-trunk
+10228 aedd2d0dcb31543bc53e82c6cc06fcf602ce9694 legacy-trunk
+10229 a73ef720fb56636f7360c87eb4ccf6448b47ac8e legacy-trunk
+10230 3c08fb9e134f82cc8888ebf3ae9d44ebe9b76fb0 legacy-trunk
+10231 6972e50f3483e5135286c03d3c690482c366d039 legacy-trunk
+10232 0c837dab5b9eac5de485817207d1e06aa731bdf5 legacy-trunk
+10233 b4b0e4e759c581f0815deed5c60f49c74b38e79b legacy-trunk
+10234 8ef067559d5a382f6b700ec50a7064a6fa0b7797 legacy-trunk
+10235 033dbe9092181541da5a1a587cadd3b4bf4b9793 legacy-trunk
+10236 fb4b4d069cc7cdb4b66532eb49d77ad06d27bdff legacy-trunk
+10237 a419334f3b397b64ea0bbf848283610d410fcc66 legacy-trunk
+10238 78c27e31ac7c9806ec30cc4848b3ff7d421f1a94 legacy-trunk
+10239 c31257b92447ece5d74768da8ba22e3ac86ddf50 legacy-trunk
+10240 a5e2bebe179ae76fb6a2b71273de9927678d2637 legacy-trunk
+10241 6bfa650f311df46e6722951ff56baca3b3b82692 legacy-trunk
+10242 458a33abb39c1aea3ad49600120d948241ed57c6 legacy-trunk
+10243 acf3b950cb437d1b7eedd11618fe3b4368207fe1 legacy-trunk
+10244 9c02e0a26511a4ff2c853b0724f0f8b95c1205e7 legacy-trunk
+10245 9d0dc11775a4e47ae54b9746f5722e49e797e06e legacy-trunk
+10246 8b78653baf1fd122b9e79bd98ba8e374b19628a6 legacy-trunk
+10247 587d0178f8d366f009c3cf2e4e6f4d46c937f772 legacy-trunk
+10248 7fd79ddfbb8b884ef964ca5a0670c06dbd6ccdeb legacy-trunk
+10249 8f177933c41fab3c319f57b8fa47302e550c7f48 legacy-trunk
+10250 469f66918dd6cbbe52ff6de45d2886192a58d73f legacy-trunk
+10251 9f46e70ebfbb2d365a666ccd78b538cc4aeb18f3 legacy-trunk
+10252 707d062cae7bff1ed7858519c2b6bc655cd30e1c legacy-trunk
+10253 9172931fd80a48ac8710adb18c0273f60f734a7c legacy-trunk
+10254 8a567412b21bbaef73abfe635441f5d46a098ed7 legacy-trunk
+10255 5fb69ff24cddc13cb74e2e7fbaba5bd6a82d2414 legacy-trunk
+10256 57f11ab4e2921b14202203c4977c4be01e6e3ee1 legacy-trunk
+10257 db94b15bd6400be530f6c3f9672009bce7bd154f legacy-trunk
+10258 5e215894c555a27289a0adc092f7910354eac881 legacy-trunk
+10259 b17d200edf627bdf51d53a85e6a9ed5b97f68231 legacy-trunk
+10260 1c420699d58a3ba2e22c6657d43d1f499ded97c1 legacy-trunk
+10261 3e1198d20f9ce133757c4431ef58b27dfe8ca788 legacy-trunk
+10262 36b3b6876a580eb0dfcf42c98d341398f1a85c25 legacy-trunk
+10263 7fc32a66255a77acf50d1ea4ed35862cd1530532 legacy-trunk
+10264 cfe6f58dd0d8ef920e1ad18e8cab9b41b6ed9ac0 legacy-trunk
+10265 80b267483828e58203d213a2fb8e0be7599f8012 legacy-trunk
+10266 05692c661434a15d95c819442e92f98705b84f5e legacy-trunk
+10267 6adf917ee7730d739d06160ff6edbebea641c00a legacy-trunk
+10268 44fc7ffdfc77fbea7c33e78ad48b26898fadc187 legacy-trunk
+10269 b1c0915014110fbfc6ad9ff8c6236ab809980bae legacy-trunk
+10270 88c53921bf8809e66c5807dc218a2dcc17cded21 legacy-trunk
+10271 b9e31120a0c4eae9e5c6e655164102e339f6f60b legacy-trunk
+10272 23d0490025689517ab16d968b29c78b6e47862b8 legacy-trunk
+10273 8d4148213cc02a6dc1935f9c8ee8b58f124d0ec0 legacy-trunk
+10274 07453140a09550088d1ddb7a757f1dce884d0dfa legacy-trunk
+10275 375a901065c1b877a58797af2a5d368d3005e041 legacy-trunk
+10276 433c381c3700e3b016598706f52c9c56be4d73bb legacy-trunk
+10277 68e2b0dbbec8eb620a2b9b0dfed441c43d2007ef legacy-trunk
+10278 068a7762e2861316cbed65956e36dfe9d20b7d68 legacy-trunk
+10279 49f11eb4eb9a332233aaf79c037f4a75197e5850 legacy-trunk
+10280 cf723991d75fad16ab2f3e8d109ec352014f3cc4 legacy-trunk
+10281 cf4201ef73aa2c6ab4f49ebaa72999ac514e11b7 legacy-trunk
+10282 047996666c81898b034188a2c30c1b4fb5ccfa4a legacy-trunk
+10283 dffe1e470e6cf3cf117248b71ee34acfc5770c24 legacy-trunk
+10284 0660f17ade603ca2a4ffd18b3666e15cdcf2df48 legacy-trunk
+10285 6d04e8c817fbefa60a5de9d1c1e511016d35a07f legacy-trunk
+10286 4c6dc07f1b6a60ccbfc0c11e80cd15cdc4218326 legacy-trunk
+10287 81f98188012e419d081968492ccab5374ebde63c legacy-trunk
+10288 5d15f4fd6d69feee63146c74114b0dcc8a3898af legacy-trunk
+10289 70ccbbcc10ccad418917815ddc2c8b14dce2cd96 legacy-trunk
+10290 e580afa1c83380b2442de6fe085f126ce0cfdbb4 legacy-trunk
+10291 9967be1f402b1a061349fe3388a318aa2cb291c0 legacy-trunk
+10292 412e6ab03c6ffad99083171eaf6e3000d412c50b legacy-trunk
+10293 c0470844c7bc7c6e5b7080e983f4c2394ee160d2 legacy-trunk
+10294 6432cbad828dc9c8bf3a4554b555a0cb2e33f54d legacy-trunk
+10295 a727ae6bfe50c588054d0961cb1a36d07d90b814 legacy-trunk
+10296 cc4942f0ec4c94cbc97a9e0a4a940992e4ffa423 legacy-trunk
+10297 5132258da78e8af7be8933587922a2c515026fec legacy-trunk
+10298 461738aaa533d2ccc8be9ad85fb5a85458e32ca6 legacy-trunk
+10299 a35b5414fdd9bb6b9751334d9f06bbf01c4581b7 legacy-trunk
+10300 d7abad70f68114d421c65144f4337b2d7f99eece legacy-trunk
+10301 2090f8f9d5d2d49635c60d7f0696f23af5f4624e legacy-trunk
+10302 ed856fccf6397ffe947cac00f675b839cea1a36b legacy-trunk
+10303 d1b23504bd99c3b14396c5d8d9d308d9f0df2d4d legacy-trunk
+10304 0575d5a1721856d201ab6a24a59909d7ddcd957a legacy-trunk
+10305 b85a675b6503e5859799a87b0870505d94fa2844 legacy-trunk
+10306 29dc5d1928bfe1a214c04f4bcfa8aa41256395a3 legacy-trunk
+10307 b71d1bdd187dee6c973aecf4fd7fdbf5266a812c legacy-trunk
+10308 986a74c3a22ca0fa7e4324c073e54359996fd934 legacy-trunk
+10309 8f0e29ce59ef4178e7ca1508bdb2119becfee7c0 legacy-trunk
+10310 e2fb2578453049e094772ad6613adf18f5769e5a legacy-trunk
+10311 34299e096e35390a342dc78d86b9f436a648f6a7 legacy-trunk
+10312 1f8f2002bfb9f05a50a57aef79e462fb9b8fa56c legacy-trunk
+10313 d14b7120c5518d1edbe334c72ecd3f64e5d2d76e legacy-trunk
+10314 643e9728aa492e846e5a91692568d3406c97fe94 legacy-trunk
+10315 147c1067ca33d14ea9b595a9cb737376b6d9dc50 legacy-trunk
+10316 ca735b84a939a5a34d1e0329440da5c90bf8be15 legacy-trunk
+10317 98f6ed131b75cef43f867185db3d45a3961f1426 legacy-trunk
+10318 54d8e85d3c287dc254077e1db72ad07a4862d402 legacy-trunk
+10319 fc950433d158e56fd145a547729aab35dec11cb5 legacy-trunk
+10320 d4f5321b9d9e856fc2c6f0097a72239a021e4c2e legacy-trunk
+10321 aaa204a05f842327151d293c5140829e9ff47dd0 legacy-trunk
+10322 ca1850481e02a41a32b388369b389ead54ad3446 legacy-trunk
+10323 491e3005f54b54686cbf22ff749091fe81172bd8 legacy-trunk
+10324 aac585fe9452fbdefc86f4b07090c2bfc94f7aae legacy-trunk
+10325 6709a02f6718038df132d1e1c751171dacb02962 legacy-trunk
+10326 949b59820185af911b874d92b93698747075c3e6 legacy-trunk
+10327 6c6a48bc58173e704f56cf8deae8584bed875fef legacy-trunk
+10328 3c4f736d5e010ccd627c52c5dc3bf5344edb3232 legacy-trunk
+10329 4fbe6c9c5d811fd4f3eccc45685c27ac89d4a578 legacy-trunk
+10330 9d3b401bac6de2c7093db876dc62ff7575c79a81 legacy-trunk
+10331 db1e49d51fe12c2758f7912a0b7880a98a7295a8 legacy-trunk
+10332 6e4ea0eda22ecc9bd2f803ed079ec51ecd15b241 legacy-trunk
+10333 f34a658e7c1565b616e4f916cd323932231ab6c4 legacy-trunk
+10334 261c639b984732548752560dcb56c0ef032577a5 legacy-trunk
+10335 1f1f949505af04a118eee8c77baad72e6d1752ba legacy-trunk
+10336 b75b2f9d3ce13e96a68d3068c5aa4dc9c2dd7456 legacy-trunk
+10337 956719ea5f5a6dbca4fff932fba3670ee04f202e legacy-trunk
+10338 b8478504b779bb277fcd38e2f2cc00c7682c8300 legacy-trunk
+10339 842ed6bbd0660a7aa9525254debc0aba4c5aca16 legacy-trunk
+10340 b0b33a357c79ed640162fb79db5d7be48a540ad3 legacy-trunk
+10341 9e10c862abfc1a280b8baac6efaa9ce134189c56 legacy-trunk
+10342 e85d6db7bf97750a40b44a89229aada6999a6c7a legacy-trunk
+10343 a3adb16f0895f0b299cb71126271a6970e844ae5 legacy-trunk
+10344 d773db06355c0698d1afd75c70c083f00db6ae8f legacy-trunk
+10345 21a7e3c324df7face9fa003ca97c04cd3bed48d6 legacy-trunk
+10346 176b99e6965be93268631eaf5e8c3fd463dd40c6 legacy-trunk
+10347 b69fa9d142ca5a78c3d6feff24008885795de4e1 legacy-trunk
+10348 c76adaf512d6553aebf1f407517498b48190d053 legacy-trunk
+10349 a61fdb8a449ee1f0363bbec0e828f032c0de5c00 legacy-trunk
+10350 31fa8a0fd17872e42fdad77094d2190655b21126 legacy-trunk
+10351 6bc4f80725d6e28db4f6d32f875491d87b18a690 legacy-trunk
+10352 d15181a0cfbab8625a12892df41da45a9bac3660 legacy-trunk
+10353 b5ede133d9216aefd428c8513a3abd7e104de123 legacy-trunk
+10354 d07b97d29a9e32a12cd15839a308d4c5a5df7cc4 legacy-trunk
+10355 392388c52e21717ef23e3e980acb0c068cef5eea legacy-trunk
+10356 8f425f8f4be2df5de0cb77b4775c6af1fca5bb2a legacy-trunk
+10357 0a873f2b64f4182a3b8207c597ab8fa243b8f365 legacy-trunk
+10358 8e5223680a9da4c689fbdb2cbc4052a8eeae0cb5 legacy-trunk
+10359 ac2d1c1f1971f2a93ded217fcc754a6df20f8daa legacy-trunk
+10360 427a9b1c9abd8e120e2bf0bc9e7ed6f7a6f401cd legacy-trunk
+10361 bde69dfc224f0e737b8668063dcd56c6fd1c8db1 legacy-trunk
+10362 6370f1593c720b92a13df727b9f31cd5e2cbb5f3 legacy-trunk
+10363 b0fbe6b6dcbf11b1a10212c3973a37842d692224 legacy-trunk
+10364 e833bee5d05fb24e740082dcdd63aad8db2c1eb6 legacy-trunk
+10365 dfc8de8f1ec3e69b2823cffdfdc6099e8bae8749 legacy-trunk
+10366 42d3f1f71c56cfb99b9bea01acbdbdc0ac01c3a0 legacy-trunk
+10367 ae9778c4ffcaf6368e6e0ea8eafe28952f64cf2b legacy-trunk
+10368 efbb7e57e6f86fc0f6100e448422d8454284c194 legacy-trunk
+10369 f8f663b432b4356a8bae2070a667bb0e89eff735 legacy-trunk
+10370 41c7d5243be931f83fed61b6cf239ed1e9953285 legacy-trunk
+10371 8a389c8fe6efd2a35ba32796de9d7f4230e6eba9 legacy-trunk
+10372 37234e1bb75ffddeb8531b54e68fcc4fdef95d80 legacy-trunk
+10373 dbd2de26c8d225ffec0fabfd9e78ea9df09ae0e1 legacy-trunk
+10374 8c93544b95e4b3c1c15674986f0b9d9a270d68a2 legacy-trunk
+10375 2673848437c34d4ed3a1104b68f26ccdef4aaf93 legacy-trunk
+10376 e6066b813a714d15e96e42175332f49f3b0f3f99 legacy-trunk
+10377 29ab3f602d0023b5c1937326a478b8db51a178ae legacy-trunk
+10378 df636ded2e702bddfdf8822aa8b8c72964ab86d6 legacy-trunk
+10379 6a0299ebccef90d03d4c800fe3ae174b54c6a89a legacy-trunk
+10380 8f3bb0b18a82bce40719c944d1330fa8b42cc172 legacy-trunk
+10381 1efee503259e51a48dd0166103af3c955265096f legacy-trunk
+10382 9a246d74fcb752a146d34b9f8a1191c8a9cb70a6 legacy-trunk
+10383 a110421d86b7314000fc189fc0e7ceafe74bef5f legacy-trunk
+10384 17368c92c769a53bc439c03411015e952c6640bb legacy-trunk
+10385 3bd668df6efdc2d63513f8ef6ed0279d70bc95b6 legacy-trunk
+10386 80b2ac61fe038a8bb69cb0d39440449a49917694 legacy-trunk
+10387 4b5666dff5e6724967a7539b9251c65116f885f9 legacy-trunk
+10388 3f8b5564f0c7c29e107a544145738db38703b15a legacy-trunk
+10389 1a1d3147b027c4b4fe57877261976925def5ca5d legacy-trunk
+10390 5eafd3eda0af4caee0b62252513fbbd7e05a7061 legacy-trunk
+10391 b71a1257764b032592e637025ecd65702683e906 legacy-trunk
+10392 31f9e2675199e19562dd8f1713bcb32efdc5ea0a legacy-trunk
+10393 5418c0730f0096162a5bde5e021d3de92f11467c legacy-trunk
+10394 64f3e9ebf21acf326841250e5bc13234f532f360 legacy-trunk
+10395 1daecd65a7c5efc9e0cd125c4c48b6f8e8ad8ef8 legacy-trunk
+10396 ba9b1b4aeab9ee8aae5e7ea784bfdd6a02be1443 legacy-trunk
+10397 1318a474baa06dd67fa612ed1a3b37ef06221f76 legacy-trunk
+10398 0905f8666807f338743a76f538218c20c9fec3ba legacy-trunk
+10399 5fab59eb4fa5a1cf4719f85bba704d24c5ca8387 legacy-trunk
+10400 6bc0535dbf527792f8ddafadf3377d43444da092 legacy-trunk
+10401 dde0dffb1a08aae4189bb360e0d495db2764eeda legacy-trunk
+10402 0bdcedcd1549b75951ec3ebec0f12f9047c9e0c5 legacy-trunk
+10403 6be7ab246a05b4c81b1263a8aa6d203d518972dc legacy-trunk
+10404 23cc6ac5eba6c07631c7c76c4e58a80aa84e83cf legacy-trunk
+10405 de90bbe850137fe1efb74b5b708cb9de018e0bd7 legacy-trunk
+10406 33407c0ef14ffe57c13c55e5f0040a26f492b684 legacy-trunk
+10407 e29d435ab142f1e85decc31c9e93f8677f7e9a48 legacy-trunk
+10408 1126e72e5ee9c9a49a1b2d7c87fc35b3051ce9e5 legacy-trunk
+10409 ef300e6b0c71da0bd5a81ecd208bcb6d73c99b69 legacy-trunk
+10410 9d8c0666b0cbbc14f4bc869a705219202dda9703 legacy-trunk
+10411 868dc84bb5b29abe2f7a0d61768c6900952d0364 legacy-trunk
+10412 7c7ff1a365217b453ae1453d40945f0af9b80fc3 legacy-trunk
+10413 0522ab210fcbb08a7651fbc0a50f27c68da6abe0 legacy-trunk
+10414 b2adcd73c150b82c5399774f88041cc5dd9f6590 legacy-trunk
+10415 708de4cb96eb21bdac8bf65da40958e200d3d75a legacy-trunk
+10416 aa7d69d67c81d7da3933ae0850c4fe2c1c1fca48 legacy-trunk
+10417 1f38a2b548bf9d06a6a251e84b05be607fb745d4 legacy-trunk
+10418 f223bf61b4ee03b8ef4edf39e99b5e652111f4c0 legacy-trunk
+10419 ca4e25ef61f8069bd69a6243cdcd45e3dcbb8416 legacy-trunk
+10420 d3ec2e51f67a21b8e5431e14c3fe73659cda0aa8 legacy-trunk
+10421 057e422d2c6109008e209527db0d468db559ea13 legacy-trunk
+10422 91ecda9d52451df73ef6d05100cca9a363e85c51 legacy-trunk
+10423 ee2aaa2f722a847cc6dff91226feca9f90276c08 legacy-trunk
+10424 b31abc131c3df943f02f5643b5545be363fccafb legacy-trunk
+10425 162db3d0c9167e09d6d769b07b133bb2102066b8 legacy-trunk
+10426 dc132cc39573a0ea6df2d26c99909eafb58c5f2e legacy-trunk
+10427 ad114620f8c2782d577db2d043c14752d19e48f7 legacy-trunk
+10428 a2c1b3e179526dd24d02bda774b52d43bd514474 legacy-trunk
+10429 f06913808fe1dace75e12209b765caff1c179685 legacy-trunk
+10430 58d6815af002e678feb873a95be78665079acb40 legacy-trunk
+10431 9cbcb5931d803d6896001eee589cffc66338d70c legacy-trunk
+10432 f42b757755eb32abeb6d8247872bc742b562d43a legacy-trunk
+10433 72d9961540d85b20036949f14b4a41c28462f65e legacy-trunk
+10434 92e36116af421bcfeec9f906bfbdbc76d998edac legacy-trunk
+10435 ebdd40e2816025c9f9432ba9a39b093e08b276d6 legacy-trunk
+10436 cd9e664a1a9fa84bcc61d2ad81e1e2d27fd4bfa8 legacy-trunk
+10437 fc08da2c9a0fa7d9682e11d10e5cd39ab5970a03 legacy-trunk
+10438 8f368df173e688c464c9063647dbc50b191be3d6 legacy-trunk
+10439 9e113aa3758da1048c7ace3307ed277caaa784cf legacy-trunk
+10440 fec8eb2a380dd5171c6550967655707e54710a97 legacy-trunk
+10441 8ca01083140cb992d12b6ced523b16bf136b1451 legacy-trunk
+10442 ccd1c963e5095dde744ec4da0c49e2092c24ec25 legacy-trunk
+10443 d6fcbd371855e3647f185971a227104b7cda37ab legacy-trunk
+10444 afd54f895dc3030dd30d8097ffbb5ee5a609b5e4 legacy-trunk
+10445 d1ea13cf46f7bc5acfe4e3bd2b025cdbd7cb6cdb legacy-trunk
+10446 e8d0b87c8d6b1fb0a22f578263abd98f8a11ea80 legacy-trunk
+10447 8c268d0e8822054ccb53a8ce29ad70264926bad8 legacy-trunk
+10448 bbd2b5d8d0b6c22bca4f7e02b04e1dfaad985d6c legacy-trunk
+10449 2ef6e0424179caff9a36e7758d0a71722ac9e5f4 legacy-trunk
+10450 338f1def43709bf4f32d5b8d01f7f6f646b83bce legacy-trunk
+10451 4ceee1ef99b032810fbb6237deb018779de0b731 legacy-trunk
+10452 469288499c9bde9d53bf2dd4b41334ff1b4e4b37 legacy-trunk
+10453 ff10b0328ff3750bb3033135d063264f93a79f91 legacy-trunk
+10454 091481dbe13d7c51279807b2ffdbca921c1e245a legacy-trunk
+10455 c12c661fd14ef4b57f5317a94a23c2bc685f6bcc legacy-trunk
+10456 3dc5d0fcb167ac1c835b4a349d111da37891a6f7 legacy-trunk
+10457 752235846180414ddd86c157e3704f254721827d legacy-trunk
+10458 51d31fcaeef3a210248083df79dbc659db8ebdde legacy-trunk
+10459 143c556deb2f8559f564de147e0bd2bb6451b11d legacy-trunk
+10460 cc47733b4dd22c55d258987af1a0b61c5065e575 legacy-trunk
+10461 85e886db19b0598b92cd1b5d77da3cdd435bc04c legacy-trunk
+10462 09963a2a24db0898e43bf331b315aac4d785d817 legacy-trunk
+10463 a909a2869ac59a0becc0f673a4261d512f620c2d legacy-trunk
+10464 068303f925ea872bd11cbe92f827a69d340602c2 legacy-trunk
+10465 1d0eb2e96d7679e9f7f46e20c7948b60eb1bfc77 legacy-trunk
+10466 ab4f64561fba3288134a775c34d6df991c96d257 legacy-trunk
+10467 971b5bbd92ec020eabc0c738f1bc77d4c5ace39c legacy-trunk
+10468 697df93e5ddb4764cb415f671c1e1591cbbe3b6c legacy-trunk
+10469 0263d3324f0b2e98ef1f65f274c7c2aabf9e7871 legacy-trunk
+10470 b9eb805579ba8631b91286e31cb73c59ace16428 legacy-trunk
+10471 de10566dec5cd1c286e5bd75ed28bc8df5e9b762 legacy-trunk
+10472 6e5079e8fa6e0533d9298be675112f6f4ec3685b legacy-trunk
+10473 cf0cf21b45454771c7ef5ce687d0c9f891b458d5 legacy-trunk
+10474 6b3fd24cc0776f32a18f4af1a2156b19c24a1308 legacy-trunk
+10475 e8c4b3d386e4f2d3372d95c21cdf90987d49ff26 legacy-trunk
+10476 daffde7a689177f1b11a2089b610a9a4b984adbb legacy-trunk
+10477 89359d072e727e72a6d645f1f9dc78e7ba85509e legacy-trunk
+10478 1d526507cd9ec73e009bc6942a93f28a334fd0b6 legacy-trunk
+10479 3d1d9e25eb22c63257f79a9aa65b9e27ca629f58 legacy-trunk
+10480 0835b8df54f80d235451e2e6a4b46b466c885846 legacy-trunk
+10481 bdf57c84df6ab51cc34c8fcc4cb73c0d1d297348 legacy-trunk
+10482 c8a3111447267a14c33018a1b3174f290e0b7792 legacy-trunk
+10483 b420ae85213c79f05cdc36959c71a1b04770f8f9 legacy-trunk
+10484 5db346e9c8f560dceb16baabe4dab0ec64271f84 legacy-trunk
+10485 900320491b936c9fca3f7238464d00fcd6ac63b9 legacy-trunk
+10486 e98668683bed6358f9c5a7339e9440b7b4f01077 legacy-trunk
+10487 a842c9e63280a96f7394c31b721092f38ad6f60d legacy-trunk
+10488 dbc11dd02f09592350b9fafd305159db8a14bb5c legacy-trunk
+10489 4f4e2aad1e0ab5ba0abc2ce826e04976a29d4fd5 legacy-trunk
+10490 bf6e920c0e799d1612947b8aa1ed0474237cd321 legacy-trunk
+10491 ca0c72591211cd929f3f87147a4ab644edf51840 legacy-trunk
+10492 83ba5309ff226e1c4bb22d25d31f5bcdba149d09 legacy-trunk
+10493 2b09a5d263688d0777f6b6b8ecd92f3314a2fce3 legacy-trunk
+10494 53dde42325f8a9941306947561bef98d4813e37d legacy-trunk
+10495 6e8be6096e56302fa578c6d8459c5c53fa505013 legacy-trunk
+10496 bbbd0b105e2735fee77c98f4a86ac1e46fafd226 legacy-trunk
+10497 46999dfcfae3f05067f6cb1cd353f57c0c0b0866 legacy-trunk
+10498 5264cac8f9035f2c74b5451b57f9e6437b474f96 legacy-trunk
+10499 011ae71fea9649a17a487f76b807ceac41d8ab2c legacy-trunk
+10500 9b8902338e14b709f2385ace1507007a25d25e7e legacy-trunk
+10501 92ba7a9e3b9d97198219edd46c806832633bc9cc legacy-trunk
+10502 3b91affa333e984a606177dcf122e3d7e93a9f0d legacy-trunk
+10503 5d2bd6738eb62e5525a5e527ef3607000521371f legacy-trunk
+10504 d157ee821775c0993452c720cdf4b02f8b8b9e32 legacy-trunk
+10505 49f1cf4b174cc63f3c1d2db320d31a889fed9423 legacy-trunk
+10506 d1c1b20754a817fff5149a91c10a7a990fa650d3 legacy-trunk
+10507 d99a90526ae0b192eecfc21e818f1ec1a17bd40a legacy-trunk
+10508 f5326d358662bb210b8f14bbd5562ff6a9ba7ae6 legacy-trunk
+10509 5dcf9b5d33e6e6f0a0d0476ac5049c70cbd0ac31 legacy-trunk
+10510 95142c8a09c86a907942f016318e3ee0954d474c legacy-trunk
+10511 3f0360376ca00151676d9dfc19deadc58ec5cd75 legacy-trunk
+10512 710f3b7835153bb76e7097307febeb4b0fc7edc9 legacy-trunk
+10513 5cce81e2334996c998d0f6f2a261150a41cd58b4 legacy-trunk
+10514 3ffd45f05e3958f58e5bcfe5ca078966481a430d legacy-trunk
+10515 cd3092069f5a393912bc1a208cd5620c168208f3 legacy-trunk
+10516 6c594988572a7de271367e46a55c13450ec4a758 legacy-trunk
+10517 e091e9d495d5a9d067c7c43d6bff04875546602d legacy-trunk
+10518 5f35e2781032e230ce051dd87c0b4d271241f850 legacy-trunk
+10519 43be0b90271708874c0df62a669dbbb691c195a5 legacy-trunk
+10520 a38550613af3d9d8e9edbc4f9bb49af1406cd67d legacy-trunk
+10521 df0fa5dc599ae0654d79cc290b9e07ed5dca3a96 legacy-trunk
+10522 e2333969a2caca3f7898d8b14a9422019e2aecb0 legacy-trunk
+10523 4919dee18781c13771e5ad3b07bbd6e0082af7ae legacy-trunk
+10524 b8e8ace79cf02ccda7257e1d574a0fbcf9588af3 legacy-trunk
+10525 bd30ac831217234188193bccbaf4ce1f05ce248a legacy-trunk
+10526 254fc91b6b0e7380958074feb44b7ec167b3868b legacy-trunk
+10527 668ce0edb4f1c5429d3d002b6298aae5cd82b4f6 legacy-trunk
+10528 07730b82a143f28f52fca45ec8d65b41087e385d legacy-trunk
+10529 a93052ae0deb5a4d160d0968a700ad420fbe5070 legacy-trunk
+10530 5dcc5c4a18bda6485d98b7096da2790398c67d62 legacy-trunk
+10531 7099de83b191b9246fc909914733b55be7e2810e legacy-trunk
+10532 9b8b574ef0071e1f909fe7538f2c359f2912598f legacy-trunk
+10533 cb8d7338248cef77c875fb36eaa846a09efd9c93 legacy-trunk
+10534 a3d912afc909abcdd2a53162e4ffa7402c6cbb30 legacy-trunk
+10534 44aba4d26b01fbae0403efe654f9fd0347606732 legacy-trunk
+10536 bcaf48b94bb3383c4ca17a919ef82feab3e2d4f4 legacy-trunk
+10537 43e802c16a5b1afbb8600e58d322db61cd2a7e2f legacy-trunk
+10538 5aacdd097941393d6da6ed32a25241f43874918e legacy-trunk
+10539 d9ac924618329cc40997211c36126f9423781eaa legacy-trunk
+10540 77d4e6f662c1bee076b620f6e09eb79bce13a5e6 legacy-trunk
+10541 4285f8b7ba0b2fb179947be29e65dcb812ea10c1 legacy-trunk
+10542 0766df503ea53df416d8a5e5eb1afaa29caa9f52 legacy-trunk
+10543 d97048f891bf06add9aa8791873bbd54436b8c40 legacy-trunk
+10544 98ec423ca6fa9912a820eaa056f6dcfd74c7ccd7 legacy-trunk
+10545 224b5c36afef856b8996f0b3051c88c483121583 legacy-trunk
+10546 f0bd9ee78a521763111ee49a6a57299e0ebb3a6d legacy-trunk
+10547 a7dd0f52f2b60946ac452d3b6c88d7176402b8ab legacy-trunk
+10548 48e2349d11c609372be8ebf0e90dba3f6ddeb97d legacy-trunk
+10549 9f16fa70d090eaebee00403b4875958d7aabda6d legacy-trunk
+10550 86a6193049a96f404f997a769be22702906bbc98 legacy-trunk
+10551 4a2f1c69fde81e96a51a4df24423b5cbad192bd1 legacy-trunk
+10552 052e77664032e18060c2a191b4234377db8e9e4d legacy-trunk
+10553 b8162d0868500e91fe99abb99cc2c3e64fe860f1 legacy-trunk
+10554 5a67d90510262a17ae5f67cccd6485724913922c legacy-trunk
+10555 d0ff41746a2600e4bafcff8cd6728c7de78939df legacy-trunk
+10556 e39145a13096802d4e481c11d6924b0bcf494645 legacy-trunk
+10557 de029e6f983891c7e0fbd0afaf408f217e12c1a4 legacy-trunk
+10558 5bff0417179858e32d8c664cf337eaed28bb11f5 legacy-trunk
+10559 3317f72723bb6096b89b716046c52e00ef35ddbd legacy-trunk
+10560 c15330eeb192ad66d1c4e1414bd3843555125d35 legacy-trunk
+10561 658d184e92041b9c68d8706b16d08e1172e18936 legacy-trunk
+10562 0b0b69a88b7b95b6132f30af5ea193a7d0e0ef71 legacy-trunk
+10563 6b58b79a958d77a58f4e5476a89e70d35661e85c legacy-trunk
+10564 7ace172c2521b02eaa1fd6dce8e3810283af7297 legacy-trunk
+10565 bb3ec812ec90f2487883e8b9a70e704f3e3ee980 legacy-trunk
+10566 5e3bb415600425fd9ff8f13c354410a9d4e63d90 legacy-trunk
+10567 692be123f547f1d34751b4e1ad79f3a49344156c legacy-trunk
+10568 e3dce3b8c28259c61997f1a83955bbb2d3933278 legacy-trunk
+10569 0493137a841461aa5828a58d41542bb9faaf8276 legacy-trunk
+10570 c5f92ee8498f5c8b2c46a50bcda0547cb0985c31 legacy-trunk
+10571 df37ca4038f6c26181e51a9e3c1a68ec879d6cf3 legacy-trunk
+10572 96aa58725c0e4058b3588bce62a8decbdac2492d legacy-trunk
+10573 08e1bb8407e65204420d88e238141b4654a4c7d3 legacy-trunk
+10574 ad9aad813a61b1cbf538f6a94dd57633664f7566 legacy-trunk
+10575 573bc064264cb7e4aaa9df247d022ac7991143bb legacy-trunk
+10576 47bdf45afb6860705143332b50ccd1dfffc4af14 legacy-trunk
+10577 8c1f161c6c8c01ed80b3350318e71c3ebf3921e5 legacy-trunk
+10578 a6ce2dff2735b7725b4d83d21fd30c9e4128c982 legacy-trunk
+10579 b576846c94b38f5446eb933c7f0749ad64f711aa legacy-trunk
+10580 a55cba96376163e0cf6c1afefaf7190e8bfe4e2e legacy-trunk
+10581 f2f912823ee78571fffdc8e2aca7309b3c1253f4 legacy-trunk
+10582 265c2797781a068fa52405938c06e02338443343 legacy-trunk
+10583 427f3489e52b6ac0db6dc5ff22aa34f9a5978a6c legacy-trunk
+10584 11a1bad6df6733e2c6193c9ba8f6fe47823ba7e5 legacy-trunk
+10585 93348e5a85a240d1963a42f6554c10790b167343 legacy-trunk
+10586 791eda52b3d9cbaeaeeb839aca5f595acda73ecc legacy-trunk
+10587 9b3b0132c021c7c6c88abcc7a4512af9ba8d5c0c legacy-trunk
+10588 2810fc609aed0720757827b1977f111a0545d5bd legacy-trunk
+10589 a9973f9b54177724af5be9d36de09e2bd143030b legacy-trunk
+10590 2e49bc89fafa0dd3f6e56ca03ba114e0c607b3e1 legacy-trunk
+10591 f0707ae00433849ad7cb05d77084f3e5b1d879d6 legacy-trunk
+10592 5c9be98f5347394e1df9e90b31926079d015cbb6 legacy-trunk
+10593 b6ce1719323ac7de9f21b7ff6319aa466af25320 legacy-trunk
+10594 e2d33c0732bfb19178cfa187ec927a404e6fe99e legacy-trunk
+10595 530ff3b99722b6c0dc57fe446e3ab64cb2001e77 legacy-trunk
+10596 d96223b77e2f370942fa80df7aab52147bdd17e4 legacy-trunk
+10597 59997fdc81df7f1830adfe2c67218aa036b87f64 legacy-trunk
+10598 95efea68f18d7878579d10d01887b847265749a0 legacy-trunk
+10599 7cf51657b08caab4473a706bedffe7a14ba42ea6 legacy-trunk
+10600 5aecc277e6caa00ca7f5849f2fa3c2744c0941cf legacy-trunk
+10601 068fea15cbcd864f39292717e1ef109a6a7f5226 legacy-trunk
+10602 e904e6dfd70b2525fd2ecb2c7f702153ff52ef8e legacy-trunk
+10603 8c552eedb1afaf1d0e094fb76893e976add3824b legacy-trunk
+10604 0db6f6932b735c71c03ade0c7eb0585f216c6594 legacy-trunk
+10605 bd744af6845f8b1a5c5cb19315df5a52e041a6f2 legacy-trunk
+10606 36404d9cb5e15cbf2e71d9b8c3536bb0caa902c0 legacy-trunk
+10607 daa54131453b77e39d5980c67c88d9904b618d14 legacy-trunk
+10608 047533789359f7997b4f51e227cc8fbcbb00c822 legacy-trunk
+10609 fdba6397b729e473ac3ff63d498d98c052948e15 legacy-trunk
+10610 1094ebbd3a4574d282cc8d3059042e0ede802e08 legacy-trunk
+10611 1bc65687626b879464f68aced6f0eccbcc514768 legacy-trunk
+10612 8b49c918a25f36810a5e0101bcba91d468b59737 legacy-trunk
+10613 4323b2433581d8c8c89311dd6060e00f5ea36971 legacy-trunk
+10614 6088d652b932841abdac5c3ee7d2f66d97e86c8e legacy-trunk
+10615 c7d99f6d2e2f8c179e7d0607d522c81cf517e2b7 legacy-trunk
+10616 ac288db5bc91c442540e2b37a872b953eab8a2e7 legacy-trunk
+10617 cd6b9fc114a415fa4eb5435068bd46b414938d30 legacy-trunk
+10618 44356ee7e579063404da1b235d620ec10ae8a58e legacy-trunk
+10619 9d03101436008ce08d2c645f3daabbc6ecabeb2d legacy-trunk
+10620 ac3ca566cb4161c409fae1b4a7f383c713369f04 legacy-trunk
+10621 23a8377262264b5763c3f9bee38b2996cbd83c21 legacy-trunk
+10622 b148fa1525db998eec31b09af8c85d6c3f2bee87 legacy-trunk
+10623 d601af806a5733bf3756e29b7ce1a3f035ff0559 legacy-trunk
+10624 aa3b48002f887e36af2b2087709ddf61c98a6a3e legacy-trunk
+10625 e033ed50cb376cf6a5c85f0033f271e37292b889 legacy-trunk
+10626 ccd8375db2736de9da650f7599d0b35780fa0fb1 legacy-trunk
+10627 c0e3944b6a64fe2e73f8cdc5a03bf9f5a4600d4d legacy-trunk
+10628 bdbe082ee383da8a02c62ea3b0ca918caedaf82b legacy-trunk
+10629 9279ef6868eba3a55099392e5a50708d9f585449 legacy-trunk
+10630 91aaeef75a7362f87b50c61f4e093b69941106bb legacy-trunk
+10631 3a52028fe9363da2f61cedfe34c98df96f43a7ba legacy-trunk
+10632 46686d40bdfd6c31177b92bf4a415f9806d8e7ae legacy-trunk
+10633 05febf931e91b4bf962e99031b875f87e4cfb740 legacy-trunk
+10634 995fb55b3e6abd21dda0c2cf7fc6eb89ea416ddd legacy-trunk
+10635 255233e42918f349f1e33468a0bc2ad1111532a3 legacy-trunk
+10636 ada40e69fd0936e3516a0d2b71a1fabe5718ec33 legacy-trunk
+10637 e49b30c6a80ac0b7f8c76b8a0aa42fae417763e6 legacy-trunk
+10638 bbfe99c2785c937232b7e3f7b3eb65f5148feca4 legacy-trunk
+10639 b1b26e0e0a0adad3c71dac8d9bb8c0cbab54ba7c legacy-trunk
+10640 056572e0781a6a2313b2d3497d5671b164e8d08d legacy-trunk
+10641 ce9fc64528a79dd910e5466c6e56be94d6961d45 legacy-trunk
+10642 125bfd89696716333cae4e8c347ef7c5feeb8ad6 legacy-trunk
+10643 1bbdd84c7a409965638fc2facd4b3a43372b87a7 legacy-trunk
+10644 a3134c6970ebbe8c4b5ec7a6966860b21631abf3 legacy-trunk
+10645 ea59bb92138051510517919d12b883bc0f4dcfa8 legacy-trunk
+10646 f3c8fbc793fea5e7ca846eb8d80d13b0189ece7b legacy-trunk
+10647 6f5c936ae2d22281d1fa23d5af294ea388e0d32f legacy-trunk
+10648 1546fc76d00ecd5efb0227ebedeed747db25d498 legacy-trunk
+10649 b9d9c0eeb47c2608373bc948a3ef80d506f74e7e legacy-trunk
+10650 c9d0d631abaae0e0272e02a52f7b458511749207 legacy-trunk
+10651 284add74fe3705ec1d5d71d6ad90e149b523feac legacy-trunk
+10652 536e439a65f9d0b523df933d62f56734ebfefabe legacy-trunk
+10653 5732ec2487c50c6d39e7df27752f21b7170eed91 legacy-trunk
+10654 5bc8ca13cfe01c1815552d99b2a792a421d4b4e7 legacy-trunk
+10655 26c622d3717d22c71c7a08b579bb851d48333df7 legacy-trunk
+10656 a8df090a12baf68f5524441e22fbfa93e7281c58 legacy-trunk
+10657 a0a0c14338c074fd96f1e72ca25c24046a6bd9ac legacy-trunk
+10658 ee27f3a9166f801333bf3801133b16974afa48a9 legacy-trunk
+10659 30fbe302c518ff84ea59588a918ee91cd941f7ee legacy-trunk
+10660 4a7ffcde40dc8f7011ea210d5d7a2d11536c3737 legacy-trunk
+10661 68ee8abd97828b053d078daa27c909297a79dfd7 legacy-trunk
+10662 c69ad566aeb1e531db82b276cd04cb97fd3ef0b4 legacy-trunk
+10663 de7fc66c0b4fdfad15aaec400af71e25f3a04aeb legacy-trunk
+10664 6f1db534dfae4adfd4b03fc1973a9212eaebea51 legacy-trunk
+10665 142165ed84d80bc057066d0f453f8cd7e1ecabe1 legacy-trunk
+10666 929b7e6e7520c5dbc02522955c92b8043d85a3dd legacy-trunk
+10667 775808a09e46b77341c1ab467218af0f5f8f520f legacy-trunk
+10668 6735ef662f39d8cca3eb82d6d5779c5172c6cd21 legacy-trunk
+10669 997d5a2000e04526cf59f1346c66fd73c87a4693 legacy-trunk
+10670 ce2d120c3903f254a583f6cc60194b07dbbf470b legacy-trunk
+10671 25c2aea645017cfb141c1aa43cf5e51970111744 legacy-trunk
+10672 35aa67fc4e60f6f6927f37338c55cbde50e84e17 legacy-trunk
+10673 b81bf9ca179d3eb6dcd773e04f4dae80bebc98b4 legacy-trunk
+10674 4894ddd452eecc1269717c657204a222a771899a legacy-trunk
+10675 b6686f753798f82f157b60eaaec02ca9fd2ef615 legacy-trunk
+10676 820d510d1dd60c016e5fa7fdbbadd5705ac8c594 legacy-trunk
+10677 885de49b445c53c57870b23a12bd3128ea9aaabf legacy-trunk
+10678 3a55b4c5e3c71995db2f3949ff06b67c8c72c9d1 legacy-trunk
+10679 83a69305cb06e138a097b68ec7c62e7e05007757 legacy-trunk
+10680 c31c59f192af220415ebc458fef16a6f3685e764 legacy-trunk
+10681 482e4ba33c08f6a6812eb8da5f3239d3e8d5a218 legacy-trunk
+10682 05096052d8257a0378082dad532df9926985f727 legacy-trunk
+10683 9f0bb87dde600ac9bcd93a83bcbb9106fc9294a6 legacy-trunk
+10684 c28b0538a446547fe79186f78bb35e91f35f4eef legacy-trunk
+10685 d6f4c2a5312c4e1dd3e2a90c230bc29fc95b1e00 legacy-trunk
+10686 c4289b813924b2753c3b9e98439733147e7df661 legacy-trunk
+10687 7ed107af9ff495220fdcd4df04ca3f1fa40d00b9 legacy-trunk
+10688 b54949690077974433dc47902b1ff31ae6de3220 legacy-trunk
+10689 e265693f0790207724122b087d7bf31eadac4cdb legacy-trunk
+10690 34cca832a4afe3891260d8c05c7c369c8f8a5090 legacy-trunk
+10691 0b7f3a932085c34220e9933d41d03105da3379aa legacy-trunk
+10692 203e2ab63936a25fe2b0a1f69f05e67bc19f2969 legacy-trunk
+10693 15ea15e0ca2ab858ef4947594403e67a0aca521d legacy-trunk
+10694 a444cd835c0e046571ea03e7776f695c7de439e5 legacy-trunk
+10695 30c2385ca3893a0b92baad5230270b465063155b legacy-trunk
+10696 bc2e9b4eb8dd584723654b99ebb018db5993dd87 legacy-trunk
+10697 f320800f0fa55afe789e04021ae8c8b582327cea legacy-trunk
+10698 a19661076529a8af1fc3ffad3fb43e399fc792e1 legacy-trunk
+10699 f1c9609314131933815dac45d929ed67e4497388 legacy-trunk
+10700 328d46c473f4ec0e2c0fd0b32bd9f5038589bb4a legacy-trunk
+10701 9d54aaf0163db0eb505b22aadca6e8ad492d231d legacy-trunk
+10702 6a087ae180ba358a31ebd79170a3dc831eea5746 legacy-trunk
+10704 e834ae73deddf2bc0f76f90c2a058fc23c165d0a legacy-trunk
+10705 1362c91efcd27e2652affe8efa43d5f2ba93b883 legacy-trunk
+10706 5e394a07a3a4f101e9f409fc21b9d4cdd486d271 legacy-trunk
+10707 9fc2af9e5859a0ba070783fb07aa9f35c397acc9 legacy-trunk
+10708 69f2e05cc378ed35b1c4e06917a73d8988a96dc0 legacy-trunk
+10709 4a13a4d2588b30db051f1c498a4e48f4fa0c1007 legacy-trunk
+10710 9d642a735a1327d1ffad362ce907e7d2bf9ed0ef legacy-trunk
+10711 df752c08b46220442fbb7fdafcda4cd6d485524a legacy-trunk
+10712 85a8ae6de27858417344ba4eb707fdcb8c8984c8 legacy-trunk
+10713 a103cf6d3845b558ac7eec37ef270d9d5a481fe7 legacy-trunk
+10714 ecde8a45d4251318db74376a9d2692938ca38929 legacy-trunk
+10715 0ec9dc9d201f2f1445529922d82eaf1cf1f0eda7 legacy-trunk
+10716 406dd2b367939597cd1b1e41d57b041820027e5b legacy-trunk
+10717 9306f58cdba5a1da24c305b5167207ca2ccde83c legacy-trunk
+10718 14118b57671ec4aa9b944f0d907cb5fa92cff43a legacy-trunk
+10719 2403e92a4a6c08b95317464de0bf89779f740849 legacy-trunk
+10720 07c0a331c26922bef2819d3076165ae85ae3e0bf legacy-trunk
+10721 3be1ad9a8587f36fa3cce59922619f869e6f3902 legacy-trunk
+10722 de2ff89d6d4bef2b5f9ee8adec04c1d6d1ecc41e legacy-trunk
+10723 4033feb26da899a5e2270f23a4cd3d76dc4bc3a5 legacy-trunk
+10724 0792dcde8e311d96f18c1169f5c06734061fdbc9 legacy-trunk
+10725 74edd5cda9fd9c5491e4d8ac83cb12d5d2a61d8e legacy-trunk
+10726 1052b0b2c6ea0f50690cd44a09557b1696411734 legacy-trunk
+10727 2faeb72bb64a19c916bff489aa5f6942c37d31ed legacy-trunk
+10728 8523ecaf59c569a9238dc3315eeed072e2127dc0 legacy-trunk
+10729 7356d4888a8bca93440e29a79fb595afcea2dc2c legacy-trunk
+10730 246acad9c893dbd6e79ce109730c82347b56f621 legacy-trunk
+10731 ab0d5f265d54e98f05d8c79c0fe2aea29eabab32 legacy-trunk
+10732 50d35bdf2042de20c6e7aa21f1b88f42c87fa957 legacy-trunk
+10733 37c3ec4f3d3f9a73d768eec0443c76de985c5d2a legacy-trunk
+10734 fc3350ae5f2a95671f48555b486d788c290d945a legacy-trunk
+10735 bc50f5c20bc96159d8d258baa0938fa417883231 legacy-trunk
+10736 1026d033c0dd9a2a8dc712e5a34868efe7d8d58b legacy-trunk
+10737 10c609fe7debc8b784ed971abd4abee12b261d0e legacy-trunk
+10738 a8c21accbecdb925d1e2332332166ebaaa07bbff legacy-trunk
+10739 107a8525bf5eb5f60d52f43d1adf4c124d92fab6 legacy-trunk
+10740 eb835ed1f6fe837a80c1b5a557b4bad9d5dccc31 legacy-trunk
+10741 9b07d27a31bd79a5d4dc5670219fdc2600fa353d legacy-trunk
+10742 d83f1bcbb1505c6c8b7cab6df0b0e29a9e1404bf legacy-trunk
+10743 b8ba8887d59f7f6bcb0f15630bfbd50f124678fa legacy-trunk
+10744 8b822083726b1c6b36d690073a97871bf1163b73 legacy-trunk
+10745 b4d3d1a08e4dae619384adec8c5c27aaf882a0e2 legacy-trunk
+10746 ce1ed7eb77507796e182b0046d7b09b07683e0be legacy-trunk
+10747 0d3b73d995888e9b9c6c258e0e10f9d2f7ee5d29 legacy-trunk
+10748 ea4b7a54fd92fc4da449c5a1fa932c25c2e5363a legacy-trunk
+10749 c3457fb18a5107f6d07dd519b8cfde2220e8370d legacy-trunk
+10750 e184f83bbb797d4c07d53bf982c39451e635ce93 legacy-trunk
+10751 3d65f616f93e5e452c06e1682a2d8ff43ddeda5a legacy-trunk
+10752 aaa1c8b529f525801658b0beef20e9624a3da12b legacy-trunk
+10753 66a2ea63b4d8578a84d916cdbb0d43a7cc374822 legacy-trunk
+10754 e469a8af04b21d4fe14fad0408a817a29981d5f2 legacy-trunk
+10755 2dd890af187e10446972e0dd826544540d10f873 legacy-trunk
+10756 1db4099a72ce8b079c2104d7f7ac69c8327f4667 legacy-trunk
+10757 7b25006579f4cfc25c6d10999171c3705f803658 legacy-trunk
+10758 7076531efb8fdb33ce6cef450f336975cedb66b9 legacy-trunk
+10759 d81f3161567b5ff175ca689f029e925348f295b4 legacy-trunk
+10760 c7d0b971e0e3925a345edd98184ba4dbbd0ec75b legacy-trunk
+10761 35d1ceed69b9eaefa4e4f9e300c7fd10c8969f65 legacy-trunk
+10762 631a159cf040b1a9b3350d993ea0538cfb26513d legacy-trunk
+10763 2b2d21efc4d715e19b080f28d6acf379ca900628 legacy-trunk
+10764 6588ade0efb774e8bb8dd2ddd97b39ba71a55a07 legacy-trunk
+10765 3818a19f747f0a884c4ef390497a2a60708c90ae legacy-trunk
+10766 f834e197bd146da728e967dea5c9241b0427c91e legacy-trunk
+10767 32bc17f7c77bce7a35556af9450e12ca5d74070a legacy-trunk
+10768 4c88cc62e9e90a8434f0750e379e6ed4a4965cb5 legacy-trunk
+10769 d3bf3c2ad75a9fe6e59567bc0a8ee8c8b9c5ebf0 legacy-trunk
+10770 6ed8a7ffc5953704ab8f46bde8da2def4aca4185 legacy-trunk
+10771 9281b5d35641a0c05cd80fe014bd29304067477a legacy-trunk
+10772 74a910b86b443d352595ef03ff77fa05fe863a49 legacy-trunk
+10773 f8a389b104f091b2f63a16b3c86680de930ed951 legacy-trunk
+10774 ff63107c9fa5d78ffc84ca42f210216fd25f5831 legacy-trunk
+10775 f2bb8d5195b66874a52372b6f2c78ccc2928cf56 legacy-trunk
+10776 35ea0c073ea3d3115487f6b73b08119177e655ee legacy-trunk
+10777 b438986b3c08d83c133d6ae8461f73868807fa74 legacy-trunk
+10778 5dd6f1ff66bc0509952061d317cacd0f24ba63f1 legacy-trunk
+10779 bf8e86b95c9226a57096111b27137938690a06aa legacy-trunk
+10780 9dd79d0104d96f4a588e6f8b1558fffd1e8d8d21 legacy-trunk
+10781 4c3c12e956a75585b734d066731b2785b3e3a323 legacy-trunk
+10782 e3d21c4ca362fd309076fa33ee6bab4c89280e96 legacy-trunk
+10783 8b50751f272c84ee84694697cb5db4b61b68b523 legacy-trunk
+10784 d3f3a0568bd6a08d083d7c4371f66de44b9bac05 legacy-trunk
+10785 b59b9942bac961eca5db37be5eafb29abf0e2dad legacy-trunk
+10786 623c459f8fbedeb76df0d4357ee6e9d102151571 legacy-trunk
+10787 0d2d61f52b9c52d61e95e8259cf00264847b5f23 legacy-trunk
+10788 4674cd2f6f072bce8dd7ad3f5ab2e654f9240727 legacy-trunk
+10789 08df9cb573adac81569022944f60bbf1b8844392 legacy-trunk
+10790 fe1fd56cada702002eca50e68236741f4c587a6a legacy-trunk
+10791 4070859fe62eea40841e574659b5d880b205c276 legacy-trunk
+10792 414247d4fed73a3bdb32cdbdd275f4d5fbc885eb legacy-trunk
+10793 f4fc9d18a53d47338148b914492671eca7db8bcc legacy-trunk
+10794 d67be13da3cc18e4944dfa8757b22b0cd337e993 legacy-trunk
+10795 c62360aa5ea40aab8b9aee87fa4d8ad30158aa72 legacy-trunk
+10796 f94d5ae642a9b1cde8feb1072f9df5c2daa2fed0 legacy-trunk
+10797 e42b94275652b9d581ba46607d5eb8c3581f7114 legacy-trunk
+10798 63cce9d77797622e594573a8c8d1c22a66b561df legacy-trunk
+10799 81057996ff21d1c4af2b129931b855564e2c97c5 legacy-trunk
+10800 ec87b62466d3aad4a513f3e2a4c3fea1bb0d36fc legacy-trunk
+10801 df403ed35bdde00a0e27c7e56be9d75145efeaa9 legacy-trunk
+10802 c14e68f591ce305bd8ddcf384c45fe2a0ab0e3b9 legacy-trunk
+10803 9ddd679319a9d81014c539bfca0e83cc4399def3 legacy-trunk
+10804 e6ef0e39e35ced8d6962d39c10957d8bf9ad946a legacy-trunk
+10805 e1392105032783c5872b147dbec929b1f929b7d6 legacy-trunk
+10806 c49c8f7fdff186ce143b224cf764c49e8f329728 legacy-trunk
+10807 af11dbf35ee5e9fa9af4180a7e77b2e2c3273631 legacy-trunk
+10808 a23b75138bb0fb23ffa34244b0c41152c0fe7347 legacy-trunk
+10809 1897747738f598fa31ae718d527b172bcf1f722e legacy-trunk
+10810 48240f525ec3be583c595ba9dd6e341922a65da5 legacy-trunk
+10811 cd828462acbb82ec09b008debb4d0a41943560b6 legacy-trunk
+10812 7a1e7da922f870572b98432b580b0a5dd0ecb5ce legacy-trunk
+10813 c59b5736f307f350e1a07b3c95e75b6de4d0efd4 legacy-trunk
+10814 9679e77d42e3d58eadb8191c872b5f32f80cc43d legacy-trunk
+10815 a4ae792b9b6802ad20efb034df7f8bb1dbf25a58 legacy-trunk
+10816 5bfb5edc313cb662130253b7ded696eee46e88e3 legacy-trunk
+10817 bf11262026bdf75244c4cc586c731667b0308240 legacy-trunk
+10818 6b7095b98e54ca5b11b76e4460b16ec1bdadd369 legacy-trunk
+10819 8d90e781ada8bc0a9b0df902bafd36e2714ff212 legacy-trunk
+10820 7658c8a149d185b34ba0aa08bf3e6c2159f62fb4 legacy-trunk
+10821 28dae91c5d0ccdffd3432dc005e00706d2006deb legacy-trunk
+10822 a84f658d4ba4cecb22c52e843bf09d21bb75db95 legacy-trunk
+10823 ebfde06fdb8d8cd9df5e53bf03036d0fc68c73c9 legacy-trunk
+10824 22815a0b126756e41d81403f554fecbe065953d6 legacy-trunk
+10825 1b4a37f373450ade9b21e20fedbf0cffc95ac027 legacy-trunk
+10826 d2d82f7b419a6011dfb3f722fe66dddb982a6ee8 legacy-trunk
+10827 05196a4e5448bf8cc5bc55ddfb0fa25b91601d5f legacy-trunk
+10828 1b393db00b1ab8cb3ecf0bdc844137aa9fa524d4 legacy-trunk
+10829 e7dd991faa4af190c097f460ce80a2c1f0093030 legacy-trunk
+10830 8d9373bd8384dfcc67db7bb6a5abe91f89c4b6f3 legacy-trunk
+10831 4172da91441aa0f5642ae8f1dc656374f32d861a legacy-trunk
+10832 52c33952460a8f447a2d9a4a1096010bb82d1537 legacy-trunk
+10833 253bfcb65b77343aa1a8606db527ff3adbd3100a legacy-trunk
+10834 c571554134d150517268b1807e0584324d87ef9c legacy-trunk
+10835 c89191c2e63f0208f901fce2bbcab921f346e9bf legacy-trunk
+10836 f308961b03d7d51def9f88fe03479b9dfd0203f1 legacy-trunk
+10837 1bc0df96b4ddc3e906f1d7bc1a824a0f147d30be legacy-trunk
+10838 a7423e68cee94741f6a5989bd57f3b3775179114 legacy-trunk
+10839 820f06bb41c7f56f5f544a5e69ca264ff3f8eb30 legacy-trunk
+10840 da4bdceeaad7a769d36ca67a85f17ee49477b48c legacy-trunk
+10841 739d5fdafc32eb2a6097e6a5e3c35536f259fb92 legacy-trunk
+10842 e0746a0da7362b032de965fa7c50db1f4ef90878 legacy-trunk
+10843 e80d4c3dbb787c8e5c949f9f953b095ec05a3b14 legacy-trunk
+10844 e41211a7aef3fa511e4a8826713a46e5cfccd5ef legacy-trunk
+10845 52d7a9e7122152a9f77a3b074a2cec9b53bd2b6e legacy-trunk
+10846 455b22945482ff0f4661ce5f9dd8c854bffd6abd legacy-trunk
+10847 5f83f97aaeb8e192390c16517eb06ce840f5d67d legacy-trunk
+10848 e17a019f9390f7f50dfeabbeb81e2652ed1903f3 legacy-trunk
+10849 a464e9c985f8e5bf9dc51bedee2be3362252fd65 legacy-trunk
+10850 1c7a82d469e067167aefd6aa28a542e88aaf68a5 legacy-trunk
+10851 650bd13bec92d113ff49c923ac29545a77b06483 legacy-trunk
+10852 f2b0859fece3bbe7f597002b668f53dee049e513 legacy-trunk
+10853 a65930f5cddbcdb5f72eb114fbb41ef0227fcf29 legacy-trunk
+10854 6ad7c1656d18b693419fc09f151be9d417b3a6ae legacy-trunk
+10855 6c826ee3e5538e41158c8fbfba75386dc12066b7 legacy-trunk
+10856 a1bfe5bc6d8ea81a4438c0750f2aa1d976bb3520 legacy-trunk
+10857 242b3c9c5bec273ba8ad8e337a4fb26a9d68e11d legacy-trunk
+10858 77c1f11d0a8afcaf708901d86afaeb42b23c9ef1 legacy-trunk
+10859 95f7c52b6399477c2347f81e749118e02bbe0beb legacy-trunk
+10860 7ac15f1e5302108f483165b979889674c068f9ec legacy-trunk
+10861 f5ebcc7a5ab26e1f71055929f175967cbea723b3 legacy-trunk
+10862 cd2dfed0c44b53a48c0fa521cb11ad4327fdbb66 legacy-trunk
+10863 822e0812f20c3572d0e56492d66a67ac8aa7dc02 legacy-trunk
+10864 058190c9a4f126e88f5a49a80c124f97f17fab9a legacy-trunk
+10865 91bb5a809481a2b1c96ff5c0732dd60a53cde086 legacy-trunk
+10866 752b9f555788c0277c181077233c2e44baca7619 legacy-trunk
+10867 3a31001849498e374c02437f0682396f528a75b5 legacy-trunk
+10868 d6b863d1beb9244acfb75c2ff52d4341ec181721 legacy-trunk
+10869 8e9d5e5103f5dc175b1a86bf9fa72c2b0d812e3a legacy-trunk
+10870 73a25779e8372e11e00003ff75b4781553ba1b5c legacy-trunk
+10871 de68f83c169ca688e538922f7f417499050816c9 legacy-trunk
+10872 76cd03979fca423a871f04965cae5f79abefa2d2 legacy-trunk
+10873 a582d70e312feed90a90734990af7afe710558fb legacy-trunk
+10874 ef9b93b2a0faa330b4f3b77be024ad42bef65a64 legacy-trunk
+10875 7669ddf0e7d4950a7ca8f3e83f656dec0d6ab3be legacy-trunk
+10876 93aa08c77e60eb2bdfedeae39b7c2d7773992d64 legacy-trunk
+10877 d7c568e7707bf1798d45d26105336a053f283e08 legacy-trunk
+10878 79071a4e0ecab63143e983fbbeea4c7d99395d77 legacy-trunk
+10879 c9b7e926fd86995f18106352822d0bbbb4be9c61 legacy-trunk
+10880 ff31f25017425352c31fd827cbb0d28836c74523 legacy-trunk
+10881 4ef7d260feac931ec18b79d1d351fabf6e5aa433 legacy-trunk
+10882 6270c6bad8116fe17a7ed4c81d529f1d0ab4970b legacy-trunk
+10883 70f93e0c580eecafba292975a90675b625d73d4b legacy-trunk
+10884 0cb0394c2edcfe183cd777c87be8699b58a59e23 legacy-trunk
+10885 c4df8b6637b6945b2f9e82363bf6d15c70760a9a legacy-trunk
+10886 64b88a178328691cd4c25e78de7a5dffb15c98f8 legacy-trunk
+10887 3c40af2d1de9e134b5e7dbd5e3b1072ffba962ec legacy-trunk
+10888 4a33bb7adf7d61bb846d249a3a037e10a481f9e1 legacy-trunk
+10889 096857b0e4b85dbdce07c76902e1f998763b9854 legacy-trunk
+10890 8a4fe199b45def728cc2d32c1d81301eed895ed3 legacy-trunk
+10891 f21867f8035bd38995c2f1aae1c37f805f738bd6 legacy-trunk
+10892 c9e3ce8e74b5d7f51b4f093a2a267cbecbd6c9ca legacy-trunk
+10893 db8b10b7ccf2249754718806f50413b01a6e7ae4 legacy-trunk
+10894 4505160a7e5c6ce136df11202e99a666e99d31ab legacy-trunk
+10895 55fc8d93308766f189c9cf69100e8064616cb96c legacy-trunk
+10896 4064b6729537f031c08779978ee6ba6332332ef8 legacy-trunk
+10897 ecdd4b4686268592c853e74b6209a70a0d3291fe legacy-trunk
+10898 9ea50031149c2204e7b5886d9c2bf630040a7569 legacy-trunk
+10899 f398419d50f974c555eb6f2923df93851492d7bc legacy-trunk
+10900 b5ff663ee76d9ec30631436a6e00b834663fdc4c legacy-trunk
+10901 c85e14293c2ee1cc45163f85decfe2114946cd09 legacy-trunk
+10902 304d4e4887f4ca60a7c47f337b2bc22fa8c2c1be legacy-trunk
+10903 d96cbdacbe7224c9f98b62030e9d298ecfbf8e98 legacy-trunk
+10904 472e425414d8247fd93757c9b55352114c6748f6 legacy-trunk
+10905 0a00dd5711e621319f9aaae8ab6eae16cc974ce8 legacy-trunk
+10906 756e2ef51b19c63fd04e87948f56abe86644f143 legacy-trunk
+10907 e2d41bf1a0f04ced75d3303d6ee1530ad27bd127 legacy-trunk
+10908 0b3e577a8df47bffef9fa5057c32cad781258c01 legacy-trunk
+10909 e96e3d387611f03a27cbbb6bbf3965bb13220023 legacy-trunk
+10910 3e653e204ad7bbfe9a46b7017bf623009cd4e544 legacy-trunk
+10911 f7c58ed2981d1eb1bf5353e68db424c999393d05 legacy-trunk
+10912 12ddb9bd0d3391d56314c09bd260170928bd4944 legacy-trunk
+10913 82f021eece2c787eba0233f126e689f998ba0c5b legacy-trunk
+10914 92c0c98b42c536778b523c8899056aba9152e444 legacy-trunk
+10915 7cdff8aa83183f7f51d31b617cbf8e756dde497d legacy-trunk
+10916 ae746eab2a960554a85e9e887559151071db4f55 legacy-trunk
+10917 78eb40f032843cb1eaa14420b0806f43109c88ac legacy-trunk
+10918 a9a788c74d6e7c2515e03c1e9f6aff4e76b63b74 legacy-trunk
+10919 c7b043136fdbd811b3085c4484200f956eba3d56 legacy-trunk
+10920 c059bbd14b232d3efe24f125e463b412b20b4f6b legacy-trunk
+10921 534602746079d13c929bf916b670d3ee4f7c853e legacy-trunk
+10922 7749c3e0324af066a7e8b85cf5ec46190d618e63 legacy-trunk
+10923 9e4aea5a652d21ad0b51ca23d60e3d883f9d980a legacy-trunk
+10924 fd5cefdd1f61dcf4be4bb804daaec62bf34ae812 legacy-trunk
+10925 c550ee4935b0c786efed7740d8d37cb42fdaed15 legacy-trunk
+10926 6f70ca7c84e66cd32d63b9f75aba89f02edb006b legacy-trunk
+10927 024714558620ebd332e6750d7a4e7e59faa34a90 legacy-trunk
+10928 59dfa9eb7c070ff65eb4b1d3e241e7556018cf1c legacy-trunk
+10929 4e668f1a9dddef5a2a4ca3f634c7cdc7ee0a8c61 legacy-trunk
+10930 a3416091c2a25a36131ae38106625b28352f3113 legacy-trunk
+10931 36ea13ba3136443f72be528346b2b04fdc5a2063 legacy-trunk
+10932 61912d4ad52f6783e9f9b05ec0c566572672b9f6 legacy-trunk
+10933 754de621e8b30ce8ce2d5b191dd8e7ca90782304 legacy-trunk
+10934 84d1b7cf815a79e923dde04308267b9b885535cc legacy-trunk
+10935 4e59d890a4bdad98bee2133217514c2518ad7cbb legacy-trunk
+10936 2bd8d520ffac01a57e18b95448537195ec6672c4 legacy-trunk
+10937 af9273b1073aaaf89721b421f4b2784ff66d069b legacy-trunk
+10938 92c88ca62da7b813696feb57defa6b1f5d9ddb4e legacy-trunk
+10939 af48887c97176b6e855300194e9bd4af04c73e5f legacy-trunk
+10940 57dae1c7ea847bb951092d512bb1d842ba64d5c9 legacy-trunk
+10941 f750b1ffe35292e2db745fbc0daf525a20571cfb legacy-trunk
+10942 2095ae690aaca04d742bfba7b94fa5856f47d3c3 legacy-trunk
+10943 10267c7555ae65101668c646e68302fe26443243 legacy-trunk
+10944 da07663f9fff46fd0816d9a064168787be850bc2 legacy-trunk
+10945 133f4554a26d57ce5934d89efd6a5f7923ecab7a legacy-trunk
+10946 7160e529e9a1eb2ae6bcab91a97ffd5d3ec552ea legacy-trunk
+10947 0e6fbbe3b63c140f78c695f2b7198f16475896d6 legacy-trunk
+10948 41209d5d1d6490c807be6f98e30b4f41f7936174 legacy-trunk
+10949 7638e459420675b6b0805678168df04b50904a66 legacy-trunk
+10950 c27cd5fc46b532fadd4411ae7d2ec18db154e796 legacy-trunk
+10951 9c32cac562505d3cde20ed9d4e9461bb3935370a legacy-trunk
+10952 933882c0e9fba0a2dfedd058d94056ea3dabc8fd legacy-trunk
+10953 c89189b0236ec1f139390d49c8122761889147b1 legacy-trunk
+10954 c555c72f090dd087050c74ae0e695b5930157cab legacy-trunk
+10955 a9d88bfa24af37238503aabe9cf5918e1c7df77f legacy-trunk
+10956 049aa3a8a1720d14ed39844e8ed183d0443d53a5 legacy-trunk
+10957 f8c6cf5cfa7d016c29ce0474ea7bba16f1f4df81 legacy-trunk
+10958 7f95bb2f170489437b74214bef1ef31c745320dd legacy-trunk
+10959 3a85ad5e4116cd506e5c765d2a4ca2cbc7ee492b legacy-trunk
+10960 4ba587aa8a98c9c8b84d99f1b7e31e9ff4ed52f8 legacy-trunk
+10961 e281d5036725297f515c4509a8ffd6e44020e6c8 legacy-trunk
+10962 d93ae374fb998abdba65c6647146416a869459e4 legacy-trunk
+10963 614a7ffee1133e711c8c2bcc43d2fff3e7532462 legacy-trunk
+10964 7e3b72d8ae946202078c16032494e5cf25c19c60 legacy-trunk
+10965 f6e900da37db458274fd19fcf63cb012af0ab55a legacy-trunk
+10966 2e4f178d7e175938c62772bf5665176a1df9923d legacy-trunk
+10967 7f94b495805629ee6eb8c4a2e3685c8e76fadcf6 legacy-trunk
+10968 53afcd28325ef917375e4f86296b89f23b89e4ec legacy-trunk
+10969 51457740f5cae9d57d265a46628f73de5a4af2c5 legacy-trunk
+10970 3604131f942d68f3a6f358ea22f4f8c13735d79b legacy-trunk
+10971 bbb7e1da46862351d0e51fc390c5f6d23a16cb8c legacy-trunk
+10972 7d1dfe66f64bc551c03b9b95e8e988220049b94d legacy-trunk
+10973 038a5c4335861fed7562b2f1ce6a1c5822683ffd legacy-trunk
+10974 eb6f65966fb22b8f370b24c38c997cd0fda96758 legacy-trunk
+10975 28f6b03bb64f058d9a5d7d80a31c098f6d996c25 legacy-trunk
+10976 fc29625df532592c548e05cad5d05fd47db525b8 legacy-trunk
+10977 0363f19887d15b2e60af3f9feaa6d34679c74c89 legacy-trunk
+10978 1d8dab5aa7d10e2939c584d59b22320e42ca7e53 legacy-trunk
+10979 0f91c0bbacc57c442bb40927cf6a20d8fc33c6b5 legacy-trunk
+10980 69c9bbb69aab267fef598ffbc1ba1c0ad3f0757d legacy-trunk
+10981 0447ef8483c8c754e73d1040754da9fce91bec92 legacy-trunk
+10982 92cf7f4277230e9093fb5773da22ef8857dceff9 legacy-trunk
+10983 ba312e790b2a2cb639daf6a2d7a6f0887ab580e8 legacy-trunk
+10984 b8bbcc009a6ab35dfba772112162f1533f38eaea legacy-trunk
+10985 85e6820482ff835cb19cb11824ff814056f493dc legacy-trunk
+10986 de11a88ac498eb4f126d5d96eb28b141f74b989e legacy-trunk
+10987 e82d0277e653c0985f50ff19311193eeabbdd620 legacy-trunk
+10988 6bf5b87af02f9a60c84e221c55bc5a20984523b2 legacy-trunk
+10989 f4809ff1f4da4e6a52bcf79ae8cd08dd49cc733f legacy-trunk
+10990 ded69d12cc6835eb047231c29451375a3d152733 legacy-trunk
+10991 8e820716cf123e2c25fe66d26993113fa2c14dfe legacy-trunk
+10992 de0f0c3ed424e6a6535208f5bac467954a10bfec legacy-trunk
+10993 69662f16a8389643650a56b926b9050f0798b677 legacy-trunk
+10994 4ded4018b0eb3cff32c34a55afb7d381e0b5e6bb legacy-trunk
+10995 da9bf9eed1fc7222af57d4b076b3558a02616420 legacy-trunk
+10996 1ef40d5acce22b766e40b3dfff5146e5aabcb2e4 legacy-trunk
+10997 16b3a121ff772e24dfdf2b296e6f06541aea164d legacy-trunk
+10998 81e29477d2a4c0c762a332e4e8384c32c00591e8 legacy-trunk
+10999 50e87c09c2366c3338ba3bd23e478fae6e625111 legacy-trunk
+11000 b56981c0d61ebb2b81ff389350ba26ccd4f1e56b legacy-trunk
+11001 61a9c529455a9082bd9e2dbdb2f16f4cdc9bf787 legacy-trunk
+11002 b94015c0c837afe6d0e755d59251e0760a37b254 legacy-trunk
+11003 064f85ee9be5b0795a19f9313aaf1436ff8b53c3 legacy-trunk
+11004 4e4fd954dda0fbccc490237db287d895a9503da5 legacy-trunk
+11005 d99920c0bfb015e71ccdb4ea39b9f0691c4305b2 legacy-trunk
+11006 47bf3bb9556e21f8c06a8bda43be22ca965e3a7d legacy-trunk
+11007 ec26d5142eb44021348cd3c7307868b1ee24ae90 legacy-trunk
+11008 d7e39eea76f4ce386d464f88bb6e57e1e0c4442d legacy-trunk
+11009 5f1e431a0a8268f73aab81a63bb4ae9b8fe8ca24 legacy-trunk
+11010 3c8b149b42ff3a656e68b3920ba3d5c92eb9cb15 legacy-trunk
+11011 0366daefa23c26970d247a5b1c39c95fcfbe22e3 legacy-trunk
+11012 4829b8faf2b42b4c8e84e3fa357bff33f53a4d97 legacy-trunk
+11013 18a9289df99a1f5d38c49227910f7dbf29aaa147 legacy-trunk
+11014 2166866af92bb16c854a3487eaf69c6b17560723 legacy-trunk
+11015 e5d06a602469cd9dfbd06e7ba6bdc34286012f0d legacy-trunk
+11016 5f5b492d18043ba614bdc72cd7d0fb8dfc4c157e legacy-trunk
+11017 f31ce46201c9560178fd00104f8d3549465cb733 legacy-trunk
+11018 18a4e031d7ca0a689faa2240bb477d1508ba241f legacy-trunk
+11019 3c4063f0a78faf276653972f7617f978b76cc9c0 legacy-trunk
+11020 213587b3b9d0af70e5ea2860ec1c05c3c04bb9a2 legacy-trunk
+11021 5099f44baf255c19739732cf2be188e7ef7f321e legacy-trunk
+11022 f4b636d15abcd95cd7b8ccd8e42fc5c3b9554cac legacy-trunk
+11023 cf0faaf3c04b6debd0639b01116c309069014541 legacy-trunk
+11024 5c2f19d19643a289bc76db828938910be5d4bf24 legacy-trunk
+11025 e951bf2d7d93b23b032dddaaa48053c3a0815515 legacy-trunk
+11026 35a2151fb1c3f62475a25a53b700ef06285ac6be legacy-trunk
+11027 e63393f536702348392367985a9410d48a109f91 legacy-trunk
+11028 dc8daa748c4093451ac8a52b6d0dae68007b361a legacy-trunk
+11029 d84f1209cba529984693677efa2d487b3926075c legacy-trunk
+11030 fac33716a21834f9e6f495854451a0e1148d3910 legacy-trunk
+11031 1ea195b142459984cf950a173852dca3f3f7311c legacy-trunk
+11032 1e9d65f9ca53cf379c4033095f3d630f25b6d09a legacy-trunk
+11033 589b64135ee65127f9d535e3e3a8ff7e95f0a93b legacy-trunk
+11034 22a0724c6bac51a1ab3dc0b00c24adc738482e87 legacy-trunk
+11035 4357b4eb5c19a6610344efe995cc117ca5939e52 legacy-trunk
+11036 d7ce9ae362a904181fe345b4833e81d186f32371 legacy-trunk
+11037 f6d82334ceb156c603e4bd2fb434eafe135fadf4 legacy-trunk
+11038 d0eec96b4c5623d7ae0cf7f81869f14d744b88d6 legacy-trunk
+11039 b02c43a201ae5dec031a918c790a77174ddf6e2c legacy-trunk
+11040 8e60ff0646099346d3acd17c10ea242e17e79e12 legacy-trunk
+11041 92267838feb9cae72fbee691bc38d3620d53dcf9 legacy-trunk
+11042 46fd630dce6331cb581e3e60352ab186ee3e8528 legacy-trunk
+11043 8973e7085cf49cd3c868893b8bfff5022f4b11bf legacy-trunk
+11044 ff9adb57b8b51b29938ff296ebf655e45ed3735b legacy-trunk
+11045 419ee95df2d88f5d92067ab6d2e4d4de41d3bbb1 legacy-trunk
+11046 e87d22c7de3c3c9838b2c65ebd8b9084327edeb0 legacy-trunk
+11047 19e8016cd38cfe6cabeefdd367428d76f1d224c7 legacy-trunk
+11048 6e8b0e754a7f3709b2d44dd1204cb25c3272e381 legacy-trunk
+11049 bc8619af0923be16f525dd8a286220ce78784179 legacy-trunk
+11050 8716816e08594f408961bda47556807c8a7ead53 legacy-trunk
+11051 450076068b22aee4d4e43cca37f6475ca1adff68 legacy-trunk
+11052 bd695de18ecf23adcbb5b2e97fc147b997809d59 legacy-trunk
+11053 67aa997fbb0e14b213723245151b255ed26a1abf legacy-trunk
+11054 ea8f0f5ab0157e9cae9b878c4c6c0c1fd427c13e legacy-trunk
+11055 6051f2e43517698f4542feac94e4e86fd12ca723 legacy-trunk
+11056 110e97339740eb45f6f9c9ab618a13b7762c8bc9 legacy-trunk
+11057 94ce75f43452f9db56f3668e1d85d1686cfd2fd2 legacy-trunk
+11058 a3392545d8652c8acc1ef61ed96db966d1c5727e legacy-trunk
+11059 f0faad8d5937ce3d9a8533adfdc16e15573c256d legacy-trunk
+11060 2b041105963023afe35af5d58b34e3f7c8aeacac legacy-trunk
+11061 b1b35f50f3fa6a40dd714a63a4e1ebcff6159d86 legacy-trunk
+11062 1ca6895024d9feeb8ccef7cb56192d0f620c3d05 legacy-trunk
+11063 221667f8906486c095db9532f83c77ae1f7c33ac legacy-trunk
+11064 c3497026520d7a087ce5e48c9edb02ed206a555f legacy-trunk
+11065 e8adeb5cd2fb7b7970bef042289dd92a2bce68ad legacy-trunk
+11066 cb7fcfb562754c7a36a9a0c648836fed5f120de1 legacy-trunk
+11067 1e5e9dc6f9939484c6ec121b424b7d1266fd0a87 legacy-trunk
+11068 bdfef8e7345723099d4410e1724c007d8efe1c61 legacy-trunk
+11069 1581c931cb35a6548b575a7e21c61262f4606485 legacy-trunk
+11070 74a100cb7a643b51c92b7872e200ab13357b1c18 legacy-trunk
+11071 97dc6aa532e7214d4e029ffc0e9a3076877b9a5b legacy-trunk
+11072 e1fe30f325b9915d20a68775dd1d2f10a485170b legacy-trunk
+11073 2f43b61a98df5ae19f2ea7a36f69503de054e0d0 legacy-trunk
+11074 ecf0d51529ac59d534c1e250e740054e6949fb89 legacy-trunk
+11075 fd1f4ee1b32a613d5f37b5806c1bf83d41fa007e legacy-trunk
+11076 5d777bea543517cddcecf2bd0b2fc72f58015909 legacy-trunk
+11077 635c3d94a94821594459202899c1b88d8180ad9d legacy-trunk
+11078 125f21fde8c40655e17c82ba0711a0a343fe631c legacy-trunk
+11079 7bc714144b98d84ff8bf231c74fe0413f838adc9 legacy-trunk
+11080 eabb8381bfc74aed8e097220c3455194fb9fa999 legacy-trunk
+11081 d4a688ccb93701c31b22bf2aa82f59baa8851517 legacy-trunk
+11082 283602f30043241d1c4f51610b5c280977de7028 legacy-trunk
+11083 0198b2f6b1c83bb5625d1f1769704452c1e96859 legacy-trunk
+11084 ce362b9ba8361fe75f5fd06d97fbd0810f199f49 legacy-trunk
+11085 c044977148e904dca41c184d9f91995bb5496bab legacy-trunk
+11086 d1f392cdfcea6d7fc35e1c47d93e7d2c70611f56 legacy-trunk
+11087 3c96fc846b88ba3a19445fda2ccb6ce3f9678222 legacy-trunk
+11088 e017371b7ed1b32dc657454c0800eb82cf319208 legacy-trunk
+11089 cc0fde4ddf44eae5ea2ad6ac8f8a70e6779ebae9 legacy-trunk
+11090 45f9dffdba3dc0933ce2a1ffb2f7f1a79c695f47 legacy-trunk
+11091 ce295bfacef37ca63da382b37ea4511a389415d1 legacy-trunk
+11092 66f0540656a0e4a61f15f1e3e8cd03c7de3c6031 legacy-trunk
+11093 04d5987370de2eeec0897018efa402745c24f32a legacy-trunk
+11094 1bbfb91f8e886f27b7d03e8698106d5aa1bf7877 legacy-trunk
+11095 e3d3bbbd93f34c3c18e35fa6f708f7f7faad858f legacy-trunk
+11096 64f0c3188e707ae15caad73a60328d0493902712 legacy-trunk
+11097 e7822b64a33d3d3ecbf33296b3818dde572a8327 legacy-trunk
+11098 2417f17fa3e5fd2c80d5bb7acc18acc07b5bf428 legacy-trunk
+11099 46b472ecb0f90a518a0ecfdd0c5737a6e053e9a9 legacy-trunk
+11100 a8075531e20d60ba12d33769c1eac33ce24c2bae legacy-trunk
+11101 6ed503d9c3d52ca6bdd097b2f147b471db5804a5 legacy-trunk
+11102 0a3c8c23e1da2a490ec4da87fd1f338de13f95a6 legacy-trunk
+11103 9f84b919952e5dc4ff40a9f81dd6d1fc477ec19e legacy-trunk
+11104 f057751cef619c7395be7f0fad4952716f463380 legacy-trunk
+11105 bda5ac9f64e94ebbe34b0c5fd775513c813f943b legacy-trunk
+11106 371c312767cc96083bf31f7e89ada243920fb6f1 legacy-trunk
+11107 51dcbf8a0b92ab60de05b8caed229ada9eb86269 legacy-trunk
+11108 26f482d16140bfd46b825661b56c70124865543a legacy-trunk
+11109 6ed2cc279346fd7104f9123621fddd20c96037ed legacy-trunk
+11110 aea6841ab898d0ba2e519350a86dccbfe7babf88 legacy-trunk
+11111 239492b34f682d5ccaddad9bfcee1b8862198c4b legacy-trunk
+11112 a939d4e14a8d32450de67dac5b64b8a9f63d997a legacy-trunk
+11113 d8673367681581523c4a2e14d95c397d59379322 legacy-trunk
+11114 6d75a44347a202152bee32ebc36b93d93c66ce1f legacy-trunk
+11115 ccdebb5ed33a39b2b240e43d238d6314f32f5f6b legacy-trunk
+11116 1171381fa01c8a750c3235bdde993ba93777f556 legacy-trunk
+11117 5798ce3bff354a2e3ebc5186560154740c7ccc96 legacy-trunk
+11118 dcec983576d514fc3fc2b218f5ff712a687462af legacy-trunk
+11119 9f1e95cdfa173145ef9cada857e7b7ff84007fe2 legacy-trunk
+11120 1e120a5d2e934545edbb6360ba6719a16d878ef4 legacy-trunk
+11121 027a1dad13532fb690bf2c821d84be681cb70296 legacy-trunk
+11122 8e86a797e596c8c9b10acb99c596eaceed5a52b7 legacy-trunk
+11123 b480e6edbc07bdf69384e7ba74c9c3865624cf1d legacy-trunk
+11124 2bfb12355b102a9b62469de5a9b7e4ae2181df9a legacy-trunk
+11125 d49cbec59395c28dce2a38d53bd3101213ddf489 legacy-trunk
+11126 9ae91e9307e0aecc568c597df9a5a0cad9d4e311 legacy-trunk
+11127 ae0b6c1c9e8d6a3dfb22343a1c2174665bdb09b8 legacy-trunk
+11128 e83b353d0a1cdaae84779f4a9964d85c1b7a277d legacy-trunk
+11129 a2beaedf0aeef0b694525ede9480393533a622c1 legacy-trunk
+11130 775188140fe1fabdc5f1615351c30feb6b015684 legacy-trunk
+11131 9af95d7270dfef55cc6af78b17a6e7d4bac28446 legacy-trunk
+11132 3be90646774095a3f1b63214ea97b42f6c647eaf legacy-trunk
+11133 4ba9b70ca56e24f63a49d76a5c12cc1b5f5d358d legacy-trunk
+11134 97a1108b0eb2815911144462475a9c9a30d5b25d legacy-trunk
+11135 2eb9c21c22f7e95155ee7df2521f0ffd5a96dc12 legacy-trunk
+11136 7d4a386bed3fc5392dfae82e04a5eced4b0c338a legacy-trunk
+11137 ed0a38cbc3e63d728f80eb3c8a88206afb767cd4 legacy-trunk
+11138 9e536dd3dc97f39957a419ecf50e2912165bd013 legacy-trunk
+11139 ac43e2246695bec7eeb563d5a12773a49f7d3859 legacy-trunk
+11140 1e93fa0214054b95cd32344e9e07b673d3abe80e legacy-trunk
+11141 ce54b5448c85d75aa611c5238100e32f1a9d223a legacy-trunk
+11142 de759aca10b25289bffd0c535fbef978ef9506f8 legacy-trunk
+11143 30fbf18af29e8ac95cd75193062103a71bda4f1e legacy-trunk
+11144 74f385ee44cbbef8318dda6319f0193af54ea125 legacy-trunk
+11145 2fdde784d849ae1113bce3927daf493632ae7c52 legacy-trunk
+11146 8568aa4944a01f1a9a99059d41cafc85c43f3dac legacy-trunk
+11147 f594778a56af9545f2d3abd94ca46d992c786db7 legacy-trunk
+11148 6245b819bdd85c215bc7468eb6e571db116bf84a legacy-trunk
+11149 3ad1bffbdaeb42059160044b9b70cf03a8250d66 legacy-trunk
+11150 82811c6cb58f5bb298bee7f7fb51c1263b91a697 legacy-trunk
+11151 2b2ff5a81391a2640218c8cd32e30c17df564504 legacy-trunk
+11152 07e47370fcb8b9bd92142d7be35ea0b345a33fc3 legacy-trunk
+11153 7444fe38eadbd4d965c0288c73042eb859324adc legacy-trunk
+11154 b1f1ba429b73f02c22089514016022eb5b1b7229 legacy-trunk
+11155 5a8d9ce90632b8d4b076f2fbf55f543479922a07 legacy-trunk
+11156 d6f4e41b2c6ae877b097075ccfdbefe126eb61cb legacy-trunk
+11157 469e8f453365a39fcea23feb7e8c06652859e484 legacy-trunk
+11158 7d96842383bba9d11a509673db8c0550a62df080 legacy-trunk
+11159 6170683e98e3b27fc968f39bc64cfdc99984a347 legacy-trunk
+11160 48bc470358815a18ffbd9960b4974490517b3f04 legacy-trunk
+11161 ba744462e95831d2819aa0f3d782e104f860be14 legacy-trunk
+11162 468db2b710fd8232006775eb8ad8bf1b9f077103 legacy-trunk
+11163 ce1e591b31263840ba5b5cbc9a8d2c75f3815737 legacy-trunk
+11164 6ed7158ff27cce47781f139eb4d0c84e68ba60cf legacy-trunk
+11165 a0324a3068e9539b5b146997f90048ed8821f14d legacy-trunk
+11166 100445ae45e36bd91ae1aa91cd85ec7a1dc43024 legacy-trunk
+11167 7817318ecd3a2f69970ae0eb0181fb6f7dc52add legacy-trunk
+11168 552e42e4170ee7184fae3fccf3ab2d5891c9c343 legacy-trunk
+11169 fd49ed65cd20b202eaa76ac8efdc673756642c60 legacy-trunk
+11170 a3726fe34d58ec047666e29aec11d1e0242fd185 legacy-trunk
+11171 de540166d7328cf54310a825ca7239cc85932ac5 legacy-trunk
+11172 a0477bc820b272df17212e3ce8262ea340920f29 legacy-trunk
+11173 35e1a140fe4e2006c603530fe76aba8c548db917 legacy-trunk
+11174 c9514eb1fc0627ac2963cef717f20bb6d4a9bce3 legacy-trunk
+11175 8aa9d126e47330700696d478e334be0034cd4023 legacy-trunk
+11176 f41580b4eea15427fe26b78129d95f837376fa6f legacy-trunk
+11177 6d2168a9641fe75377a525652407218e0a0e431a legacy-trunk
+11178 f7b4db0c5b08d57e4d378669b139cb187a80fe0e legacy-trunk
+11179 dc85804c2c645689ebb056f0adea395efd438809 legacy-trunk
+11180 7d1477cda83d37eaf760dc57b15ac624ea07bcbc legacy-trunk
+11181 f10b469c981054ea5c31744cc5c8b52a69d1dcea legacy-trunk
+11182 95f324272f5496c139e781ec80377d9805c154f2 legacy-trunk
+11183 78214e8c9eb4908a5a07e2f51c3e09ec18ba5ad0 legacy-trunk
+11184 2f290560263fb0dcfc674c7ec75d1617bbd84dcf legacy-trunk
+11185 50757465fa70decdea3a74c4128e76d4b1edbba5 legacy-trunk
+11186 83c8adaa084f6818fbba3c6427031cf9d2cfcf04 legacy-trunk
+11187 8571c1246f093d39596e5711e534b25173d72bdf legacy-trunk
+11188 ca1c669bb04169ca6f4830d17a9b9a4856d43a98 legacy-trunk
+11189 4edf3495c69276b18a191055fddde7d51b91b857 legacy-trunk
+11190 acf49c9def7ddb54251dcb0b44ca8f482d8ab923 legacy-trunk
+11191 0e2563c0eb0d4a6b8ff671af4d8667f0b047ef23 legacy-trunk
+11192 208427ab75645b1355afb5db851eea0b4e097cc5 legacy-trunk
+11193 ae6b41dc652016aba984b9c8aa13a8408db72074 legacy-trunk
+11194 7983d86b48af732615efb92dd5000303fc955a52 legacy-trunk
+11195 ed8f4e2eb11a1aa78a8b2c94df9d715e1039767d legacy-trunk
+11196 9731d8a6b4f3df49ff47dc3e6d7b29bc8d3c6575 legacy-trunk
+11197 c750c7a21e037884cef5543030729c65f6068d67 legacy-trunk
+11198 760dcf1970481268b331ca6470a8ea3acc11eb6e legacy-trunk
+11199 946d63977fa411d5f0803921dc27f84b26354147 legacy-trunk
+11200 028eafbce8ac721d4a32069953ac2e3d8752f4c1 legacy-trunk
+11201 8175c6e1e6131a9545d5b410e3a1fbea06f4324e legacy-trunk
+11202 e0d0474849800979f08b68596873637f3115ccd3 legacy-trunk
+11203 d7ca429ef1ab5fba92394e158e681332d35beb37 legacy-trunk
+11204 8a29476a59c543883c316671b204dd9f01cc1b3d legacy-trunk
+11205 6794294eb0149e96e67d1460eec43318e92613f3 legacy-trunk
+11206 5d6bf60cb736d1e35c462654a543eba5ebaa4fd2 legacy-trunk
+11207 f7976e02b87343273e42b402d3cb686baf376e92 legacy-trunk
+11208 74ea4dfda82d241f6d098ff651a143cdb582b40a legacy-trunk
+11209 53b52a33d4ba640dc59719960eab726bed24b66a legacy-trunk
+11210 d5f4851e76113be259aa4f26f646659d083ef464 legacy-trunk
+11211 1907d10a2328ee09f5f9aa8d3139afcd47753c43 legacy-trunk
+11212 8a306dfd9f333e052985aaad034dae646877e7fd legacy-trunk
+11213 75137cfed954f79644be9be9042564f4a6d52932 legacy-trunk
+11214 a8040b9418649d9f3ecb1a933a1bb1b07c1d0d4d legacy-trunk
+11215 aeafaf382a4bec4dd71d037cf58ad057626a801b legacy-trunk
+11216 ddaac06ec3266f5398a3eb7af7b27493341c5dbc legacy-trunk
+11217 80776eabd005fbb815d6423cf15828abc0892ec3 legacy-trunk
+11218 6c20ca7231804787afe6864877a110f26276ad98 legacy-trunk
+11219 8d054954708a2f050b94b2f1e8e95f1d874926e6 legacy-trunk
+11220 781ad32e7b1ff3c5d6f394ea36ecf1a2976e2aa4 legacy-trunk
+11221 1f020f79967d9958d08c1f6f682153fa91de0659 legacy-trunk
+11222 74e0313cd810e345f05e23fbee200837efd140b6 legacy-trunk
+11223 43464b1c880ea96f2e7808beeab052481db6d55c legacy-trunk
+11224 73afe77a3947bf2ea22022d7fc0f491c77221fad legacy-trunk
+11225 2a30a81894ae0cc49ab32c37e502f778582f67b5 legacy-trunk
+11226 1d581a6dfeee11691585e328eda0bca4062b2cb6 legacy-trunk
+11227 e1bcf0bd34d593398f6f52ae6683d4c35b725bda legacy-trunk
+11228 ca1b906149e6209c8535993d476afe49e6ae7517 legacy-trunk
+11229 cd99520320a31fd0ba45bb9d7c75d42c61813bc3 legacy-trunk
+11230 eabe574dc921a910b907ffc8e05429e1cea917d2 legacy-trunk
+11231 d84c113efedbf5a44548e292e90cbeda468ec354 legacy-trunk
+11232 5ec8979bf1768547e38c665dd40c570b2d3e05c2 legacy-trunk
+11233 99793302d10d3e1ae2f91114d8afc03e06682ec3 legacy-trunk
+11234 4e05e38445ceb37b846df9d93e888379d5e066e7 legacy-trunk
+11235 9e089070d4c5d0e824bad85f57da79217852647d legacy-trunk
+11236 e88d4e6e4622b4381f72c0f7ff4ed3438d2aca89 legacy-trunk
+11237 701a85b044b345f50efc667806d38accb676ab44 legacy-trunk
+11238 fba8455dcb54c40e0ca222d563483a3427f58445 legacy-trunk
+11239 b8a719c8a0a6017a0e40c3f7fd37fc88102ef5bd legacy-trunk
+11240 68fe63750f84f50feed9c53b13e58d48b42c88e5 legacy-trunk
+11241 4ac2d435ce3bb5bf5bec9bd349b1c76a25a4ab74 legacy-trunk
+11242 2b2ef82edb5eb734e116462114696368ea58b802 legacy-trunk
+11243 861cd2278348a8329a48a604f07ee5fc380340ba legacy-trunk
+11244 4192a73ca430ebdf2e2a04e83528193331f14de8 legacy-trunk
+11245 55f790a5f64bfb4562b3b87172c2cfce968873a9 legacy-trunk
+11246 07663dd0fe865486dbac14973f8fcaf2ad902845 legacy-trunk
+11247 62fabe2477c4df7b44c7d1fd0a0a10dff6c19cb9 legacy-trunk
+11248 058417071b0e526bc23c22ddfbb492a2e277f9ed legacy-trunk
+11249 8434e9d00b5a5e44e756730f33dc2781a8bbd237 legacy-trunk
+11250 fc2a700b1007a52f5217cd9e9a8d31ee3aeea9a2 legacy-trunk
+11251 06f80bcc956911f3796197279148617dd101c254 legacy-trunk
+11252 256a80f39a88fd79622bf27e3a64e5c8a3b09e83 legacy-trunk
+11253 2f46f87aa80aaf5cd3cbf2095d635847ff7bb621 legacy-trunk
+11254 70b633ff2fb75c5614b94351f13b1e8e4434fad6 legacy-trunk
+11255 45be40efcb950492ee3c73363fc93eb5862e264d legacy-trunk
+11256 edbf631fb7e9e412699a42b896bf5b38d91ae422 legacy-trunk
+11257 d39678d22b4a33d03a59f07afad9c6c26b0f7812 legacy-trunk
+11258 04841eed98ef9164b15d6c9faa547af875a87a55 legacy-trunk
+11259 00524555ef174283763b17109a6783cd5f5d4093 legacy-trunk
+11260 3a1dd01375e09416cae5d5edfe8c7edfe1995246 legacy-trunk
+11261 9138272c1fe6ec3b1d71f7d00b2d893582f80cdc legacy-trunk
+11262 6d61d489d72889143c9801259b0b9b413a633732 legacy-trunk
+11263 9e31415436f62cd9477cb1f9d91594d9dc441aa4 legacy-trunk
+11264 ae3e2eaef9b9525f65ba633206584540a82ce253 legacy-trunk
+11265 8e94ce9394bf246e2cb883ee269c4e9c572c6cc9 legacy-trunk
+11266 c990904624766ee87c1c563a10e4f6f5b214b204 legacy-trunk
+11267 c85b38d58acd8cf08a5ed383d3544a4e51e4757b legacy-trunk
+11268 7d232c0e4dd6c90bf339bec7e673d4c78795717a legacy-trunk
+11269 d2bfc8654280a79c17da26c5acc004c72048d2ec legacy-trunk
+11270 d642e6748d12c3abf377d8550af9c42e88270c0b legacy-trunk
+11271 d32dbc202613e29bab38ccef6df997e51af88907 legacy-trunk
+11272 1076a028365a2ed5bdfc519c2f957feb1b21fd5f legacy-trunk
+11273 33d59336e7e6fbc56774dbd349d205dffd5a2d97 legacy-trunk
+11274 0f5e0b405bc2f2ab745f83640ce64d927e538c09 legacy-trunk
+11275 1f804facf6354fa2f2eb87a158fe819ad5c7ad1f legacy-trunk
+11276 0e30b35b8a3ffe3560a05de52118633773f0da1f legacy-trunk
+11277 b8d2ba59711c227004368c9f91bf9e473008f880 legacy-trunk
+11278 6fbb5607cdd604c414227c23d260f064159e31e6 legacy-trunk
+11279 d51d1a61b1cef47783ea87d6515e557376806788 legacy-trunk
+11280 ca1e5bc5209d8471273e93f52e448a3dbde4ced7 legacy-trunk
+11281 44726b058700ad93ff2083e91d721cc53ec112d1 legacy-trunk
+11282 e8b56b387045ae74dd9c3f98d8d4e91ccaa5fb6e legacy-trunk
+11283 61464037da53c2d05521f97fafc2cee3f843bcb8 legacy-trunk
+11284 81cb9401a21b7c8629e8249b2e309833de06da07 legacy-trunk
+11285 4d18ebd4cf423ef87bbba7964dc32a4ed1e8fe7a legacy-trunk
+11286 5d5a5bc8de5cb628945da99c6f1286b4352fc465 legacy-trunk
+11287 c9e45705ec9e1294003bb192ea7b67e330b43980 legacy-trunk
+11288 8e9d2146ae930215c11661395f3466767e99819b legacy-trunk
+11289 645a328e7fd4949cf6e234387743b243fe4a20df legacy-trunk
+11290 78785985a2ab581b4e555f8c5deee371ed51d3bd legacy-trunk
+11291 c5d72bcda932a8d36ca36005b45abab8fb79d791 legacy-trunk
+11292 4aa76480d8125892c515ae1bc314f90d3e044f7a legacy-trunk
+11293 e58a614fb8e40eaa672121296321b99d08ba6e1b legacy-trunk
+11294 140693744a3c853f7b44694f6a3758b41acc6ff4 legacy-trunk
+11295 dd649837ebd4898425571eab2461d61fd31f8cac legacy-trunk
+11296 6738e53839774fae286d7e9110b8633f2df5ad64 legacy-trunk
+11297 8460bdc3dbf7b7e6d33d739043da8ca1f8fd1075 legacy-trunk
+11298 d8b461989238d82f83daebff599335ff870dfe8d legacy-trunk
+11299 0edd38db22884595aaca3114c745197c21a7eadd legacy-trunk
+11300 71fcc4ca0e8aedc91618b2b013203b5e052ebaa9 legacy-trunk
+11301 c28011000ed3693d63c214d330a4f7b1254225f6 legacy-trunk
+11302 9b0dda9a558bd5eec96e934636eb5e3451901474 legacy-trunk
+11304 a1c16a3fa7db40a375587a22357d0d01debcbd86 legacy-trunk
+11305 bd47ee068b83fb9f2a8b6a989ab40f3f88c4f968 legacy-trunk
+11306 f2a4a2b608607b0afc87c6bdbeb0db1601ba9cbe legacy-trunk
+11307 b04098a256d0046d9cea4cc46c88a9dda09621b3 legacy-trunk
+11308 129870e2179a91d278adef7ac7a59699780bef0a legacy-trunk
+11309 4bfa53bd97bc06762e7c3b131083c4fbaa2c3c51 legacy-trunk
+11310 df1602b6a2a862166186dab40760ad5864d5738c legacy-trunk
+11311 8532141cff4c1f5df6dd5e663feeb5f21502e6ae legacy-trunk
+11312 3cc2fad4e020e17d83ea0b0a75c366fba284b01e legacy-trunk
+11313 eec4dceb4436aae60580e7a69ab400065d8047fb legacy-trunk
+11314 00a6bb65ff293c0e0a8d623c5e2543c9b5d19d2b legacy-trunk
+11315 741d50618ec2caa7c6578ef09f599805f78b9008 legacy-trunk
+11316 045e900a4198e02aca2d1818897c1bbaf5fc8809 legacy-trunk
+11317 336cb509879a49c27c2552d77616b10c5334d181 legacy-trunk
+11318 b04f95fedd50ca1ad5b392daebbf47c1f81d76d4 legacy-trunk
+11319 f1ca41995e62e51729fa6b7c787b14927fc2ded0 legacy-trunk
+11320 929db8385ba4a53e0ba3b1ed684f436f1deb6037 legacy-trunk
+11321 e5a8311684e4bda372bcff77065064f8de4958b7 legacy-trunk
+11322 c2f9e505f75a1da91ca217b07c03b0397459f915 legacy-trunk
+11323 44baef8ab5c89d34b14f9083ecde01972bf0fd28 legacy-trunk
+11324 bd6d97d6b2ae0b770bc829529f43504cf7ae5d02 legacy-trunk
+11325 8a370526de06ad3db0d1c314058f086c4648ad3b legacy-trunk
+11326 1c7d860871d9d10eedeb9accb36163f961395b1d legacy-trunk
+11327 b65ea81277525a9e4dd2767044543f9d312f7d56 legacy-trunk
+11328 b933f584a26d0312641e6c38b0e85185739dfed8 legacy-trunk
+11329 7453345458981be880d960439b13206560363489 legacy-trunk
+11330 0867022501534a1f24d013a8d8e2df59b6ffb711 legacy-trunk
+11331 37c6918efd3bca12fd357263a651518ba92a5876 legacy-trunk
+11332 61ef8818695bd436df0c8daf82480a457d3070b9 legacy-trunk
+11333 c351523ebc05eebdc9c449741086af0f56b3c5a9 legacy-trunk
+11334 534a1a437af3a9b8eaf735323861e272890ed06f legacy-trunk
+11335 cef20ec6f249cc462d9c4f2ff79db4dddee18d81 legacy-trunk
+11336 bbe9d72bccda27a9daa33e05882903fd9f3bebee legacy-trunk
+11337 5f9dff681797ff9407948403b28c06748052b9d4 legacy-trunk
+11338 354cd24e5dfe42a0f82f0301f79aa00876906040 legacy-trunk
+11339 d2804608becd08a1a4b5e29eda0b39050d4fef2a legacy-trunk
+11340 f7d4a585da0186c0b5b88b8014e7ca94f30f7631 legacy-trunk
+11341 567607076d8f4c76a292767bb4438c3c2a94806a legacy-trunk
+11342 8653e1f219f1bd2261e137c96f70ffe13ba50a02 legacy-trunk
+11343 d808eba4b3c65304880f0e2e6d5b123662bdbca8 legacy-trunk
+11344 e14458f136ccae3d7a6b49c1816381ae62ec1198 legacy-trunk
+11345 e024c69625e12f8ed966656a5ff53d05fc1f351c legacy-trunk
+11346 8011f14669a817d4be9cf152d3530d544c32abd7 legacy-trunk
+11347 5cdecaaa9beb0d37dd1e449a819bdea4124e1ede legacy-trunk
+11348 f456f5aa57185a2d31c920a9c362ce0bce30476b legacy-trunk
+11349 a1ec3ec2602eca5826eb80df621490875893b605 legacy-trunk
+11350 bb78cc27469ab4be8738a0ec06fa11882632a967 legacy-trunk
+11351 f8e2ad4cd45bc3b1bd1164508e212a0d6afae073 legacy-trunk
+11352 57089ad4d73c6e20baf8596a295a669cccd9660f legacy-trunk
+11353 3bc3f94d6061e4f2af3578d5de00c6e6c044a380 legacy-trunk
+11354 05c1104e084b3146374c92879b6db24254604798 legacy-trunk
+11355 868a25cf653bf05eb39759e8a7a0afe781dbdbff legacy-trunk
+11356 aacbfdf4943e52987cc35aaa9419c72f9dafd24c legacy-trunk
+11357 10790f14d13abd26aa228f0c18f3bdcd5496a3d0 legacy-trunk
+11358 72b698c3324b9905a43703b128ee7ec39f3f1b91 legacy-trunk
+11359 d342eb44d7bdd54f752980067833e7a49925aef1 legacy-trunk
+11360 eb059a33f7ff31c9928658775f8c4968b998f096 legacy-trunk
+11361 813f527f3bec01cd7c2dd99c2b4ceb0d343ae8cc legacy-trunk
+11362 27ee3231dfa9bec80a82b4e553d62c87f12342d3 legacy-trunk
+11363 a9eb265d2f570debfd4d96d545f0d227c6153162 legacy-trunk
+11364 febca6b1827dddda3a3d29bf96825cd634211982 legacy-trunk
+11365 b28b84e6a429405a31de72e9a51fb3305706c8f5 legacy-trunk
+11366 f88f402417f29f3c43aa6b3764e2d326eab32629 legacy-trunk
+11367 85dce32acf9d79788a9cfb9b6c4fc0207f13176d legacy-trunk
+11368 c0a9ed21dfa05602cf74a99480b56a912069d2f5 legacy-trunk
+11369 04a492f110dbdc706cb6f8d03cfc6fda9883853c legacy-trunk
+11370 8c0524a71244fd0eca8eb6ea0fc2d28cfd97bb9c legacy-trunk
+11371 9a075a2edb1f542f8891b9614d296e730236fb4e legacy-trunk
+11372 3401212e54fc3805cb67c9970142b53c09e3b1fd legacy-trunk
+11373 31c063517c22ec34c7e20d0334a5c819bd04ed4a legacy-trunk
+11374 60b4a610dcfccaa73b7066a1e70208acc2ca5454 legacy-trunk
+11375 a7083295eb38eac00bd1fe499fc13dc43e1df12e legacy-trunk
+11376 09063eeda2b703da89c22b76c607f3b8d325f17d legacy-trunk
+11377 764de731c8063fa43c5626997acd91e325a2d135 legacy-trunk
+11378 9b4bc3b8b9d4cd05e801cff8e138e34109516dea legacy-trunk
+11379 d295a51874a6afa2af217fab9b0f227a35472d67 legacy-trunk
+11380 9db8b5ea6b2122069d7c66bb1069039cb668e4ae legacy-trunk
+11381 492363d6bc9451184c2ef453340f1e1ce7fed09e legacy-trunk
+11382 38544f828d7408e27f9e3d88e024ca4c0fa654c3 legacy-trunk
+11383 6dc0a9dc5bbb91a54c39122bd457cb95158bd7f9 legacy-trunk
+11384 ddf710b7e6eb6ffb5208813b416ee4c683d40feb legacy-trunk
+11385 6f73ae1cf9346a71696bdd5fa593c1e20362c65b legacy-trunk
+11386 6d8b92caf8cdb52e068cccc7aeb55452e0017c6b legacy-trunk
+11387 d41ff5b191d1d116b87bdd307dc59b102f3fd5ae legacy-trunk
+11388 29d847c428f9da71990c492abee7caf48e36bc47 legacy-trunk
+11389 9803556c1ae7c3feeeda1c0ee4eb888ef4ecec89 legacy-trunk
+11390 a5b71a8a1ab586962c4660ebabe83d7cb285897b legacy-trunk
+11391 7d6813521f61359ec76b290ba7351ebd7fceb697 legacy-trunk
+11392 89e65a96a7d3fa805535534f0b7d9e544ae5fc80 legacy-trunk
+11393 b1d1d8c0071ba7cd734b7b1d5fc1403f95e2db67 legacy-trunk
+11394 9a984276cc565ca2fd6f65b6b34f35231964b6be legacy-trunk
+11395 459bda940daa27814f7997bfa546123f04b40167 legacy-trunk
+11396 d6b73962529bb6614f63c25ecef3ca7612bec7b9 legacy-trunk
+11397 9a4054b8485ff4eaf66c4f0b7007d897c446842b legacy-trunk
+11398 552c6b3aba3de5054bbf469ee46f44f56b1b91db legacy-trunk
+11399 6b633df41e5951aacc4f0bf875695cba07c22342 legacy-trunk
+11400 e55a79ff8228f922a8ccc6e8ab96b69136c4d078 legacy-trunk
+11401 acfffe14628e448bfeb08b5a8d3921149f486a4c legacy-trunk
+11402 610680e3b9293fb6cd1d31d1da60503e39acb0fc legacy-trunk
+11403 027f3eef6e5a79eec4428615001138d96e713a2b legacy-trunk
+11404 d0f93eba9baad0c4bab59f37ab2ccf492da52b34 legacy-trunk
+11405 8e41906863be7bb47d113fe7ea0ab49fb2d164c2 legacy-trunk
+11406 28bc5d8e8dca36b33f014f32532d0de2e7c72a3d legacy-trunk
+11407 0954ad4acdfde5c8cf5d563b0d09c50162673349 legacy-trunk
+11408 be935851dc50c3ddafffcc80906b4c990a039219 legacy-trunk
+11409 af9bf84fbc5ea42b9a61387aad91a7521391e604 legacy-trunk
+11410 73f9a1e8ae52c05a5487a6115bee6d1950dcc124 legacy-trunk
+11411 a8249a6b1b58e47dde833239138315b793ad8753 legacy-trunk
+11412 ba8d1bc98b2d8159d9fd0f7a07b4658e4168586a legacy-trunk
+11413 c45a2d911f31566f33e3e167eab8cd24d3cebd34 legacy-trunk
+11414 dae2f2ef9015aa3e38b710ced50484edf65880c2 legacy-trunk
+11415 0ba81b9988eefed1d610107e2edee7618a7aa0b7 legacy-trunk
+11416 dc6edfd4bae5bfb33e5da270963687e5bc4e2d5c legacy-trunk
+11417 20b83ca06ce8a187363e4ceff1053851a891dad6 legacy-trunk
+11418 2f936b7a09f94f1804caca7b714e483cdd445dda legacy-trunk
+11419 5b73d5babc78e91ab5505eb8666c118122595e72 legacy-trunk
+11420 197ac5ad30cdf360938751930a1517abbc072e2a legacy-trunk
+11421 b4e2b2cb65b1bd105f7fcb295a2ace9928f36d06 legacy-trunk
+11422 347884ec5318137ce2b7a4f8bbba411555d407d5 legacy-trunk
+11423 2d775308538592dea8ddb929689a2210d8aeb637 legacy-trunk
+11424 40089e5583090caebc309e436a7d0a8cd3ab1b7c legacy-trunk
+11425 fda463c3b1767897e85071a41664da9449683b10 legacy-trunk
+11426 0f331883cc15f053ee97ed9c46b521af1616e8ad legacy-trunk
+11427 3b0291655e316312abceeb7ebaccd55d948f02a1 legacy-trunk
+11428 7601a7e9583de5db9093a8bb38f950098bc69ef7 legacy-trunk
+11429 50afa28aa4b919c9e6c2d6a75fdd66f4d2b07e85 legacy-trunk
+11430 c91809cd67e541be64a80da22e45032b3e17f028 legacy-trunk
+11431 7cd42c878f1619b2de486d6b7daa3917bc37c36a legacy-trunk
+11432 0a6892b1a4ac2829cf9bac2f17be758a4a127009 legacy-trunk
+11433 cf3ceba7efdded6257a9767cebc65d7b8f7d856b legacy-trunk
+11434 8acc72a8131998f805678f3b1b5e885cbf5e3bd1 legacy-trunk
+11435 cb7a1506919af4f77b7073d8f16bc088f34b34bc legacy-trunk
+11436 990153853e3bb1e79797afc39c4ea87a07557e95 legacy-trunk
+11437 384ffed252e91fd84888ebe5eded48ed96fe5125 legacy-trunk
+11438 c26590b1c396b570ef296af382e602decb3bede7 legacy-trunk
+11439 ac1881c4ba6d9d06a96b71c116397b2146090afa legacy-trunk
+11440 c79defb5a39c1bd73c3d62aa7a0b2a11f892a3b7 legacy-trunk
+11441 249cd4433cf08ebf2b869528320147c5b42e7cfe legacy-trunk
+11442 a1deaf04277bbb8a0da6e3ce75ea643583528e10 legacy-trunk
+11443 9618a86879caefaaa7cc0376d108f550bad3ee0e legacy-trunk
+11444 e7958e8c777a784b9c0c66e619c9527ec646eeab legacy-trunk
+11445 ecdd96ddb0035f7baa713fcb42666649da593567 legacy-trunk
+11446 4b64f131aa4d853423f431276992a71ce04495b4 legacy-trunk
+11447 99ffe0a38a1cad38abf5955b7d5084ac9e0028be legacy-trunk
+11448 be21aadf4908f7d9ef0df5084b2c389b2379f91a legacy-trunk
+11449 c4c328aabd825aae9dd47edd0c9e607f4c6bf9cf legacy-trunk
+11450 de16e19ff1dd8b0f8a88556ce456102150804f26 legacy-trunk
+11451 157e4f20cd716094a7fd95d69d1e3cd447de8f81 legacy-trunk
+11452 45614cf9e911b0d64043327cfeae5cd6f921f91d legacy-trunk
+11453 58d690d4e3128375b4c6517895a2a41654295d54 legacy-trunk
+11454 7885f15da0801c9a3579b6aa8618828e179f9e76 legacy-trunk
+11455 468ca84fbc14a255ca30f99df9d91e1dd9bbb27c legacy-trunk
+11455 fed63ccbe6dc3ac663bfe97a2f7006b1b28568f9 legacy-trunk
+11457 d69cfc23aa766430c1d53187dca20c9af269be5c legacy-trunk
+11458 3bcd6278e658107edbb467a1c4b3e13bb70c26d5 legacy-trunk
+11459 82a43e1bfa4fda060237b01f3974b5d8ebff89a2 legacy-trunk
+11460 07d97d1546d4b3c44795bccf4c3d9af6a851195d legacy-trunk
+11461 0afc3827977e12b0f73bbb9a037cbcdc952bd89f legacy-trunk
+11462 26c041b145c195b4dfb82df8b2c3e9ca596fe019 legacy-trunk
+11463 f1e41fc2783c19dd9657e5c078a90ee639501e76 legacy-trunk
+11464 0398051f8ffae175137cca666a9b3a3f6c3ff698 legacy-trunk
+11465 7c2bc7db49336cc164e28b3a88c1141c2f03431e legacy-trunk
+11466 4ef640acf2365aa715279f179f6941e58c0e1401 legacy-trunk
+11467 6d4ea37d70c22afa50ab7e0e065834a6cf474465 legacy-trunk
+11468 d7878b386dafa811a189ce9d0cebc2ac3a71b2e3 legacy-trunk
+11470 ff67f93c4a9bc0ff3e35d8c5d85737858a43e210 legacy-trunk
+11471 3e127bca84e72fbd94a24aa3e1f3758d0e53ce87 legacy-trunk
+11472 070de4d39ddd86ac96dba56de9dc398d142144b1 legacy-trunk
+11473 5fb3c683e8626235666c6194d4062de524579750 legacy-trunk
+11474 d178227124210eca49499e8921bd43e28c8b4214 legacy-trunk
+11475 db16ca4de4c487819e612e488b369cb5f8836ee3 legacy-trunk
+11476 ee3af911ad56b6ed9b11582a1474e040ba657e25 legacy-trunk
+11477 09183943182eb32a86e9339d8258af30abeff052 legacy-trunk
+11478 9c9c4c3edec2ed00797eed5c65b10c83e79b24bf legacy-trunk
+11479 f14739261a34c180cbe7373913c101de43494573 legacy-trunk
+11480 3bdd0e790bc9869c126088c6e6f0f70d3b3cf692 legacy-trunk
+11481 29e3b1eb46b190e7d38be317a7d8662a9a7c9541 legacy-trunk
+11482 f864c9f6560952b5199786c74a6c7eedbd5c8863 legacy-trunk
+11483 dfb7f468b78d37758997fbf6c7ffafa2a0280089 legacy-trunk
+11484 c2dd4f086a42bfa411faf7dfa69c1baa92701855 legacy-trunk
+11485 445050755586b59122c5fa4acd8cedb38a5ea858 legacy-trunk
+11486 7116cb9712bcc70998df94dea75f55b236309b07 legacy-trunk
+11487 f16a6e64859bb8cf6c986b5548a3ad138be92577 legacy-trunk
+11488 93bec6a8db21b1f135320db2cddcd686eae66042 legacy-trunk
+11489 ec01fe9c28417abee830ccf0a8de2485f37910bb legacy-trunk
+11490 a9f6fb14abd7ca2018b009a10efdaf59b4b7ae52 legacy-trunk
+11491 ff1a8a38f8c11afb5b9a7c347e43299cd3daf305 legacy-trunk
+11492 eabbe0ed3468ccec8b80b2125c76cbcdb9d0bf22 legacy-trunk
+11493 5991672885cb1ac4dfcd8941b6f4a8a19743c63f legacy-trunk
+11494 9e01b74daf77c71c77581ff3e44e19ad001088e9 legacy-trunk
+11495 a110b60699b1b4125517a15fa87dde7505fdeccc legacy-trunk
+11496 36bfafdda8d14f3b9fcf29646198c69d9e7059d7 BBPY
+11497 bfd8472f696b9c8fc69a2c731902ec141d9a4041 OSAM
+11498 d85e8070b164f376f7e6c52d4bfbae4e3cd13496 PYTHONSCRIPT
+11500 a8d47a3718ce9fd8c4ff783769f1aa5953d9d9d0 BBPY
+11502 b4d3f98bf22972d4a1211e5bc3d92dce3753d7a1 PYTHONSCRIPT
+11504 e1f323ae9c4b5237dddf0e18509ccc6e32e52097 OSAM
+11505 11abae284c071edbee4e518475fa0dc7cf6b12cd legacy-trunk
+11506 17cd6e5d294bb3a04bd998cd7a5e635ddaaa0287 PYIDE
+11508 e921cdbcc5dd63afb6334ad93c74e4455eb174a6 PYIDE
+11509 dff6881246572ec791a4b15936220a00d70c2764 legacy-trunk
+11510 2ce3da419e1d39e74e007a08849a3fd58dbeec05 legacy-trunk
+11511 dd5fa1757556db73fc6304d4c45bb7cac09db2c3 legacy-trunk
+11512 b9a070736eacb311c7c721808c6cab4c7a21083a legacy-trunk
+11513 897ce0976696520a4b1e3fb7b202ffad28da8abb legacy-trunk
+11514 b150ebf7b2b72c48a900f2215913bced812d38fb legacy-trunk
+11515 674f451c4815ff4a04062ead7758b7776989aaa6 legacy-trunk
+11516 928fe8bc9eb6d6756fe714a7e0fe44b31ace814a legacy-trunk
+11517 a9724c8e6e6fd2b030c26a1b4ef41f235aba3371 legacy-trunk
+11518 b7e7747c196968f7ea597d5335598a6ba5ddbc9f legacy-trunk
+11519 6a2e926215411de21d8d9aaa5cfe33ad40977aca legacy-trunk
+11520 a87b23d428814e3905c281b6a2e0bda4fcc9a9a6 legacy-trunk
+11521 3df5b9d8335b775a964dee4a61baaf24a1526d3a legacy-trunk
+11522 fb5a5ec2ea1ab01bf749108fdde52f97a2b69b71 legacy-trunk
+11523 d53237bcf15f774215418f73f8bfc2b60b78582f legacy-trunk
+11524 65139719b656059e52c769b2a5fc880886ddf702 legacy-trunk
+11526 b3eecde3679edc133034003d8fe454374f13b80d legacy-trunk
+11527 d3c067934c63cbf76ef7962ca6883bb66f9ce309 legacy-trunk
+11528 d2722a4cbd9c6128b52168668f8f5b8edacd2651 legacy-trunk
+11529 baf9a5a71d2d6ddf68815c4d5ad7f934b04bd4ff legacy-trunk
+11530 9962833d49fddb93262197a15c0ed8d3ec65b3de legacy-trunk
+11531 182c9cbdf053de3a832d080514b459a28e56c116 legacy-trunk
+11532 11b6f0c9eac998ca8f6c83ced3d40e7b5cd55da0 legacy-trunk
+11533 18697f59fd48b77bd546ea91f96dfb430e79ef9f legacy-trunk
+11534 62b94cc98de459e7a803971d14742da5d61851ba legacy-trunk
+11535 24d0a57ae234dc8357683e1e1c431e54b895dd08 legacy-trunk
+11536 f0c8b8a33f08eae08d3ff29d15e0e2087d8e97e8 legacy-trunk
+11537 ebc0c12dbd78d60d8fe08d89296b09b2c13955bb legacy-trunk
+11538 8d18d496af8709fc3aab0cee962fd6c017e2bbe3 legacy-trunk
+11539 9fd915d23cfa03c00d3e8082d22c15f343b63a96 legacy-trunk
+11540 d8ede020dfeb294b75ae7dc695aba92370c2ab30 legacy-trunk
+11541 d437b6683e24176eab75b3da07db8599d2b434f4 legacy-trunk
+11542 ad6bc2c5d353eedcb0236edb67ecac97d4ebc321 legacy-trunk
+11543 91d0860746fc2733bd20a1486c901306f466dc33 legacy-trunk
+11544 6d2eb58f041868086d9871cd1c4af7d8873f3603 legacy-trunk
+11545 118f9f73abe919e92eb9b3de62ff8547c2249db2 legacy-trunk
+11546 cbf72b2210aea9ee7832628799bd7d437a82f9c4 legacy-trunk
+11547 f3ebdb2274e4a829f7f7cd2fb017da35f80100b6 legacy-trunk
+11548 839c6622d15a07210c76d597c53c2ad24316fe10 legacy-trunk
+11549 905bfac0fa32e056957dfb7d20daf9a5253ccbf4 legacy-trunk
+11550 16f8397d8f048de64a1b8d0e20aa91db48086505 legacy-trunk
+11551 dabb2b6a3a81eb0fe8c44e45617df2617f26405b legacy-trunk
+11552 5bc64efc65e029841c335f72678d556f6a614739 legacy-trunk
+11553 05181e104420ac03f5061792ee482fc1dcdfe60c legacy-trunk
+11554 026e1236243e6cbae1cb7bcfb054a25689aa2cf5 legacy-trunk
+11555 19ec534694addeb84dfee214dbb5dd6fbd79db8b legacy-trunk
+11556 86952bdabb21e11fec91c31c15c945c61822aea7 legacy-trunk
+11557 5c1e1fb372de06ee281a6cf10fe24e3b4d203027 legacy-trunk
+11558 0876b6c24007d8666dea2776db267b0e36a68378 legacy-trunk
+11559 0088ad9d96c386ac42bc5460fe2cba008b7eb0e3 legacy-trunk
+11560 5401c71428eefb0e62a681737cc7a3da97421509 legacy-trunk
+11561 0781a49990515c162986fdbc28f79658bd37dab7 legacy-trunk
+11562 257063aae000f3f5987c626aec4bac8c4cb57cb6 legacy-trunk
+11563 3433a9ebdf439e6d18c9f22fba2fee7959de9e97 legacy-trunk
+11564 a5e3c695d2fbe377fef4a28adfa4350e5108a6ca legacy-trunk
+11565 b25d5a62e35763d5883e90d1cb9e3b181249003e legacy-trunk
+11566 ebc8cb07703f89d4652d69467b5844e7e4d78fd1 legacy-trunk
+11567 c2cbe9acfc8e58830cd9af7b239334c79dde572b legacy-trunk
+11568 0188d625969ab313fd6c2b43da822f3c630c935b legacy-trunk
+11569 9cea6b617838e5412f53aa7065c2abc133915f7e legacy-trunk
+11570 618fb830be658cfb443799d8d11dae480209e959 legacy-trunk
+11571 a982b17e938f529dfa04c34d8165f3464d182c2a legacy-trunk
+11572 850acf299ea23dbb1cad1efb106913a3540fbd7e legacy-trunk
+11573 c06272384f118afe0dc6291ead03cfc66a83d3b6 legacy-trunk
+11574 c447d1ad78517d358fff7bd740b914293b159bc7 legacy-trunk
+11575 18f81faf4bd97b41f17ab8ff051a8678f34a6bbc legacy-trunk
+11576 4d2cb212c8d1585493775b871f8a3bc72a96083f legacy-trunk
+11577 e49b5fed744c4ff771c98b5eb72d4978de5abab3 legacy-trunk
+11578 edac860ad710b5aa29210ee4c9d7240f0480a5cd legacy-trunk
+11579 6b85493052e8a36f82e58245c382cbfcf6490441 legacy-trunk
+11580 bc41e86c938cf4b9e70ae5a42c042de578241acc legacy-trunk
+11581 3f4be7e28d5ce785114cdf2b7d59990cfb741f01 legacy-trunk
+11582 e943f9c09901ad818be23cabec8c5d7716b08376 legacy-trunk
+11583 d4eb35c6e6efbe70aff54f261594144525ceedfd legacy-trunk
+11584 acfb3a648dcaabfa6322baa0a76efb963db0c188 legacy-trunk
+11585 7e6c4f57af69920a58d4accfef3b9e84fae2fab2 legacy-trunk
+11586 e71f8392239204a45d538cd57267a8432856b867 legacy-trunk
+11587 26f5bfd715a4656e89ace7fbe7e24d101afd276f legacy-trunk
+11588 556927d868d8d8882b6523cd69efec5283fb4707 legacy-trunk
+11589 2e07f1b298e16db81f359d15f3cd07775cd718fd legacy-trunk
+11590 471c6c2218799ee2700ad6d21db06fea37001e13 legacy-trunk
+11591 0310ee16497a87d7193cc17108912d6cb5f4ccbd legacy-trunk
+11592 637fec8a7dd3daff17a7f6b476002ac7d8eaca26 legacy-trunk
+11593 2088f80253db04f214b5f2b0583afa5a74b405fa legacy-trunk
+11594 4278561bd5e87f59a138777ff46495de7a65d5b5 legacy-trunk
+11595 b826e50e9573f4e0940c82cbf64a11bbb69d3237 legacy-trunk
+11596 728bbeb9e4f965472f892b30e3ffa6016586661d legacy-trunk
+11597 687b66e653d615a08fc0a0e922c65b04037a80db legacy-trunk
+11598 3135316cd670b08fa8caa14493e7bce381d4cb18 legacy-trunk
+11599 f2396d43056b6c6d1cd9765a35c96ec07c6f6a5a legacy-trunk
+11600 77a9b85f762a7648a78c273efffebe8f92196026 legacy-trunk
+11601 2bb7b660f007bef7439c60a12970486a3c685062 legacy-trunk
+11602 9eb2d6f6fd3f4c71ca67daae1770db9849ed0324 legacy-trunk
+11603 ce52e922fbb26ebab539b96f352094e91a650429 legacy-trunk
+11604 24cad4e0db8dd39c325490c55e3722e7215cc0a6 legacy-trunk
+11605 b52864c5e9c9423a53d0b2ecd1e92fe4b7e746eb legacy-trunk
+11606 9e1745679e715003b2ccbbc09ab4732e9fe8e598 legacy-trunk
+11607 0420f5434f44932aa667dfbac9fbe4973318ec2e legacy-trunk
+11608 b0845d09fedf6f816520844475244d4f77edf9b2 legacy-trunk
+11609 83660cda3e3f397005f856971afa2e6b594581d0 legacy-trunk
+11610 dba711626b43241c5e81ec0b34b93ff5c45e76ee legacy-trunk
+11611 d237c808a01e11318d2516dd092280a564d30aaa legacy-trunk
+11612 29380a4fa2308903163ab5fd1cda85696d669330 legacy-trunk
+11613 db1547fd40e4675b728e5b6ca19adfeffc6cfeff legacy-trunk
+11614 4cc10908e6f45f00fe8287388a7015ded9da326f legacy-trunk
+11615 12136542e15549b1e3fda23ba44aa3da8ce2d7aa legacy-trunk
+11616 4486862d5cbdd0fc05def7b1f452199f467e8d84 legacy-trunk
+11617 55c1811bb8efba29b53223d72d08d6c5952a8c12 legacy-trunk
+11618 fdeef177f536ad96ca2b80ae579b551fb417332c legacy-trunk
+11619 86b7129d8d08bd977f020366bf2a2a9bee2218d5 legacy-trunk
+11620 17d0c51e08870192612a7a4284c91c97437fb3b5 legacy-trunk
+11621 b16633b22e6ae170b8b76cbc764bb518b27a0ce9 legacy-trunk
+11622 6cd93322b810b6f53fa1468fe0be1036860e5b02 legacy-trunk
+11623 3d30dd54445621d074ed1c62326bcf4d9fa78ee1 legacy-trunk
+11624 f4129d52dfc5adf3f95c68c3f7baaa52e071e44d legacy-trunk
+11625 ba40065e399f0404139deaf0c3ed5f7713f73bf2 legacy-trunk
+11626 9f1023c88f570653b089455af6206db9dfeca5b0 legacy-trunk
+11627 b0fa2fc12dfb28cd85282c1cb94d6f2b00ff050e legacy-trunk
+11628 6cbf05696120d09b1516dfd5ec7bc33dfa8bc55b legacy-trunk
+11629 ebb010858771aac7d2944fd24e926276b8f87760 legacy-trunk
+11630 0660be6e67914b9cf1a6e3a8f4e774d60a1c6aed legacy-trunk
+11631 88b22109007c1cb918d5ecb2e3582d5e31bbf1aa legacy-trunk
+11632 5af4b102144ae5d904a4995fd92e4d76947db9fa legacy-trunk
+11633 e1b710e30acf73c5b59a8db10de9342b801f37ec legacy-trunk
+11634 0329d419e506182e9a808ece1c307eef717de520 legacy-trunk
+11635 deeb3ce20acf1a85b10c86070acb11b629cc1f7c legacy-trunk
+11636 f5d265d5e9dc02adbfca15f76c064071427cf939 legacy-trunk
+11637 8e3b6d6afe4cc1b551c38bfde9839cf293d15576 legacy-trunk
+11638 881b86398c2043f5a2336e6da7c3acb075a55f7e legacy-trunk
+11639 98dc675d0913b6b33bb880fb1859378791eaa680 legacy-trunk
+11640 7fabbbb7ad9a7a1d47877ade6909c1da2e3427b2 legacy-trunk
+11641 520583bdf0b0290ce98a2529f08ab0cd9552b5aa legacy-trunk
+11642 e578439b981f856144b43234a2c0e59e4aba3841 legacy-trunk
+11643 c4602236409e8b9e0498610100ec32c3afb750fc legacy-trunk
+11644 6ecb248e67ff2c0a547d10dd82d86fed9611d17f legacy-trunk
+11645 e60055216b8f9fc903d95985f4b809a714b0b6d7 legacy-trunk
+11646 1c22cbfb4a1e206a7cb01199a5bacada29a69ef8 legacy-trunk
+11647 4af87ced9f3aab6d9fdc38add643414cf3f289c4 legacy-trunk
+11648 4fb4b00755b5e06d77e8b0263efc340d2ca2eee7 legacy-trunk
+11649 a307656c7788976c444fd1b50c75da42af4bb900 legacy-trunk
+11650 46830e5a0351fad0d4137dea3e455c6289c167dd legacy-trunk
+11651 1e8f310745475102717a35ee39c6223f6f0ba20e legacy-trunk
+11652 3529bb4caefd6e0a5e5db1cf7c1b6b3c4d6777c4 legacy-trunk
+11653 daf1d61b9611d7a2731297024dcbbe2784265c86 legacy-trunk
+11654 9f7291f55026d4d55c425b93d11db23b0eff3800 legacy-trunk
+11655 b2630a29fefdb8b7f45d8c9e904553d4ca576720 legacy-trunk
+11656 f2b98cbc5030188aa2e45dad8e8fa9d7ee9b86da legacy-trunk
+11657 f0a92c0a115ecfcdd555f0f19bc396738eae1907 legacy-trunk
+11658 1e43df7d8be3ffe57e0738b30d1381828a00c82e legacy-trunk
+11659 e2daa783bd4728ea0e8338620965f330cfdb0a23 legacy-trunk
+11660 0a085d731c1c79a8f32856940cc52ffecb14c28c legacy-trunk
+11661 d086414ade6ec49e936a39c29f503f1f0cd801ac legacy-trunk
+11662 d3ef4d10fb954c8e851334250fac4cb35b9cb42d legacy-trunk
+11663 6a559dc78c913f8d6693e7545b096e2603aa623d legacy-trunk
+11664 b0ba319677195823d850fd704096bc76c231d6b0 legacy-trunk
+11665 75a8047dfc1103afb01d7accee532d08e820c550 legacy-trunk
+11666 6be343da29144a3920827b0796b92f7eae6aa968 legacy-trunk
+11667 c00b273085bed70abba0725cbbbf3fc6212f5454 legacy-trunk
+11668 3ce511ba424226132107420b7f072efa7d9e6201 legacy-trunk
+11669 9fd2bbd4454e3678b1cd6f110580d9a8c82ac2f2 legacy-trunk
+11670 32b19491e70b5a79d55899f9160a6f687f9d171b legacy-trunk
+11671 9a88fe204d95cd8567acc99282384b1030cdfa0b legacy-trunk
+11672 68aad8ecfd70ecaaa9415f4c16d90c2b9b4b43d5 legacy-trunk
+11673 6fc920c906408cc2e67591991cc0de304a483a78 legacy-trunk
+11674 958e1faa38a9104fd8b8865317984f5356591104 legacy-trunk
+11675 0625b9958b23bf62af288185320ee0f33d564a28 legacy-trunk
+11676 53ed6bcd0641df37eb2f8ee8e6f35270758a324a legacy-trunk
+11677 253c993ef936ad5a1f93c78542e131a46716d4b0 legacy-trunk
+11678 fa893d55794ecd986638488100239e8d31c86975 legacy-trunk
+11679 e75e228f8395e7ec50f6d056c15ffab8101ac9e7 legacy-trunk
+11680 8e952bdd0fa3704748b08662d1b28daf0b5eec44 legacy-trunk
+11681 f264e57d657dd380603561d3d1dd80010f2c9e22 legacy-trunk
+11682 a86a71bebd6407a2cb8b7c93927a2a034735e0e5 legacy-trunk
+11683 aa73dee23093075776e4eb3ddc8a6349528b7ee9 legacy-trunk
+11684 e21d0798c02aaade23e21d544c309b65d8890d52 legacy-trunk
+11685 a1672e775f331ecc34656b85cd9daa3df64ba0a7 legacy-trunk
+11686 5fe4d594a0f219246baf28859ba32c9be4706f0b legacy-trunk
+11687 3e0c87bdb5889694865b47dad8b1e1e130b6f0de legacy-trunk
+11688 4fe8a7670c0d2a30878220b46c891bad6ce755ad legacy-trunk
+11689 ac6c29d1f10c9c2f903e064a6c50f1c2bd3a7959 legacy-trunk
+11690 02d8f721409abf4fab841153ac38c4f8beae5087 legacy-trunk
+11691 4c20456159ebdbb281267f44fccbfde82d47db32 legacy-trunk
+11692 195e748cf696a696f9fdad6e7d8b26a26c208ffc legacy-trunk
+11693 33984841211d5ac1602472ca717c0d533d012884 legacy-trunk
+11694 47ccdb7fb623ae9adfbd28174d5d3443ff8686d0 legacy-trunk
+11695 58eced5309a06b77dea5c0266fd52f1185b8f5fb legacy-trunk
+11696 b24046720d56045e491323c9467401e837179b0e legacy-trunk
+11697 d578cd64796d126585fa0f9559f96a586a1dbd3e legacy-trunk
+11698 eb803e191887e6ed20d4740bbda904a5996857b7 legacy-trunk
+11699 14ad02d06e32d8842621a01010d18e620666dce8 legacy-trunk
+11700 07dae6fdae79413df92bf3230f93ec177690f431 legacy-trunk
+11701 88505269b4037deea283d7b6cc3ff73659beafa0 legacy-trunk
+11702 0858f11c88d7258c16339f15bcb9a5bb0d4b6dae legacy-trunk
+11703 c1dc19f9ad608e6b4b1a8da631718f4a219e65b4 legacy-trunk
+11704 670967be6db3ceb30df271ac84127fb161afdc6b legacy-trunk
+11705 8148d44f9903de2fd8d22ae9ac2b7cdc0acb762e legacy-trunk
+11706 d3af310f230cb156c962b818df284b5c643c61fd legacy-trunk
+11707 70e49f7159572f13796a9cd35b0969e826f6ac77 legacy-trunk
+11708 f172d474c5a904a8d531b8ad031562be4072ce2f legacy-trunk
+11709 be3d84ff29f9a953ad08f97a1d3a0b7620a3869c legacy-trunk
+11710 89d916df479b15b11ac623ac74c395bd6154c39d legacy-trunk
+11711 c259c3c4d0ccf9bc39e6099facb6db699bc66725 legacy-trunk
+11712 1995cdbe33846e477024e6967997caa363466b3f legacy-trunk
+11713 93699179a50f2f4ac92effa4d7e532cbb67ac34c legacy-trunk
+11714 44ff1ac5295b37d6d5dd62bc1aa73034d5c8eb27 legacy-trunk
+11715 a4e82331569902183c6adf4fc82139c7cf010f5d legacy-trunk
+11716 2999f1d9042996289a60e25a45c90c64a8000332 legacy-trunk
+11717 5621cf9b09d6320b36f0520ec4394ffc458e7cea legacy-trunk
+11718 3c9fec57b858a64f079ee5862ccc756a7a25661e legacy-trunk
+11719 9848f42343c998f4a93f15ba9f59f464b6ac40bf legacy-trunk
+11720 dc1d445f237184d5c6d122b5ec67636d8d96367c legacy-trunk
+11721 73df24f6bccf33adf74847c053fe5fedc2a5dc68 legacy-trunk
+11722 ce8f3cef6aed2bff5c441ff4592882997d232fe2 legacy-trunk
+11723 25da09b427b475f446546f1d101ed93e9745b7af legacy-trunk
+11724 79400d078f1b03fc5f90a65b7a36c4de90ca59e4 legacy-trunk
+11725 a03c6fd81d4d6d1ab349de31deaea0a8f1745728 legacy-trunk
+11726 2e3712e84781fb1246651f55cfdf0599a6eba1e0 legacy-trunk
+11727 38c07ba4b8e411f86cc2f4cc6f019f0240d94ab2 legacy-trunk
+11728 08b8da6d4ca6a07290ecbabd1be93ce5af5f093e legacy-trunk
+11729 4bfd29d53b950c17a7a2a681607e1817621403b4 legacy-trunk
+11730 b18d1f91d6648324967f45a4bc4e3725e3ee60ec legacy-trunk
+11731 41f83c72e0984c917897d1e6805c3b09a3371526 legacy-trunk
+11732 d7252a5b7e1e7ad5fa825fe6a692d1b3d0425aad legacy-trunk
+11733 39c41220f7ed46f2369c71c70cef5d85eb8c402c legacy-trunk
+11734 dd8443bd44740c7a9f912fcbdd3ad66826250088 legacy-trunk
+11735 4c4cec54ba634def41b48c5365661f97fc345001 legacy-trunk
+11736 b55db08dff7bf25927a2e78cb559f8dc9dcea308 legacy-trunk
+11737 229475d2951f70591e1f017e02f7a652ca6ab64d legacy-trunk
+11738 e23ec2403157247b3dd59b8e9d2f21f204c86a7f legacy-trunk
+11739 710da10dee9db34a0e4d11187a8f995952fe199a legacy-trunk
+11740 048002f27c1d8bca5a93c1dabd92764400d64a15 legacy-trunk
+11741 159f9e746754947105e7b79146bd233e723c86b8 legacy-trunk
+11742 8a885f3a5f46ace5456c64e708a336d7f4e759c0 legacy-trunk
+11743 1c4ba0e2f8e743b616b9fd7502e7e653b176c10b legacy-trunk
+11744 b4872bc8d9ef738634f0a269abb92cedd258ab10 legacy-trunk
+11745 e19954ba1bc413788b33b756d8a1a1d6b07b6f57 legacy-trunk
+11746 0283759407e161df015193865e23d609fd528af0 legacy-trunk
+11747 ca8587d215e6fecae38a632d47ee36d358762d44 legacy-trunk
+11748 430038e164337a300112996ba79dad99e1ca8674 legacy-trunk
+11749 590bd9b45bf60d1879b42b62527f1ed91ad0aa75 legacy-trunk
+11750 be1493391c6dd3bc7bad317e7c00bb421f3f066f legacy-trunk
+11751 9d393a0f727c7544a4ad1aba3fe221c9a8b8fe38 legacy-trunk
+11752 080799d0cf2b2bd9a4760ae53579c708af6b3ba4 legacy-trunk
+11753 8d14906292c66cc005f4555e31e9c406aad79744 legacy-trunk
+11754 1e33a8a56bca5b7c63087f565e86bb30c516c8d2 legacy-trunk
+11755 2577c0cc7482a88854f21a400547177916c2fb48 legacy-trunk
+11756 6b6bd14d750b81b844fe274423b46d9f45704cf7 legacy-trunk
+11757 a73cd7f99b95bd12d0a07819c18b44ccfd441f79 legacy-trunk
+11758 acd81c3227deb896899177e60d065190e7fb7085 legacy-trunk
+11759 9d2c12f240e63612ecaa4f87c8dca4bd6e8947b8 legacy-trunk
+11760 65f08cc5955364064924f9bcd953ae4d75ec9cd1 legacy-trunk
+11761 86de1fa0fbb7672c02c5692f302d64480fdfb54e legacy-trunk
+11762 c116bb3e2ad188b3101d4fafc4ad49f2a4192a8a legacy-trunk
+11763 a0f3325fedf191e7c4eebbe55f5b66972b8d689c legacy-trunk
+11764 550a456d8f615876c80ee2b953b2bde42c9ed144 legacy-trunk
+11765 acee3595e603ed2b4b47f99ee42c128cd235830d legacy-trunk
+11766 fbb45060be03243cd53c1781bb2be598b3f5f157 legacy-trunk
+11767 72441113243a85e0acacde93fd1fa1a9836b1194 legacy-trunk
+11768 50d9850cc8c3b14b342d2b0290cd99bc4168daff legacy-trunk
+11769 2c6dd0fa4eb987b6fd97742573efa5a8c524e368 legacy-trunk
+11770 8fed8c85c61a9a57a0ec27e027788124509a324a legacy-trunk
+11771 8791455485e52ccdbd3a0f0ef91df322f3f82ade legacy-trunk
+11772 2f88d8aa731093a7edf240c3ecb51267a94dce7c legacy-trunk
+11773 f37be0c822dc2ad41add0ad41e1678b6e57e1621 legacy-trunk
+11774 284bf95dab80a1f8804d1c21c650336aa99b334b legacy-trunk
+11775 c39218a68df1f376d91851a9d3883657ca6ecfa4 legacy-trunk
+11776 53ab8d0b0d644e11fd209390df4f6fe790a4b7f4 legacy-trunk
+11777 fe7cbd13086c3a490e83ac539c1713650cdb8b37 legacy-trunk
+11778 809dcc1bbc21dcd353f882719429edd7fcdabcba legacy-trunk
+11779 4b9c4ce5999c92b7b153e408b07c05b2e97d40d2 legacy-trunk
+11780 0a6ed384af06a572303b1a1fe27d1372137734f9 legacy-trunk
+11781 faa31b1c0b5405729ba3f017c3bae298141dd475 legacy-trunk
+11782 5156cf8e42691ae5fb11d2aef8ff2b43544a27d1 legacy-trunk
+11783 bc5150652edcad70e6d4d0667131bee3fba42b78 legacy-trunk
+11784 ec3d2b3756d76d95a4881fb856a2d44843ae8cf9 legacy-trunk
+11785 a6cff9c290e52645c13110c76830e6377487313e legacy-trunk
+11786 5d344710fcc3d6a2376db46baada9753096ef543 legacy-trunk
+11787 2340f615da8f4397046ff6d27a13f16d1f35e398 legacy-trunk
+11788 bc31d9f6e0a14e362315b3d2569c8905e1a351aa legacy-trunk
+11789 02f3504b398df4766a5066a6e7a67d9f74b71b66 legacy-trunk
+11790 0a67db47e1d0e46ed7b864be9817810ab12f9804 legacy-trunk
+11791 0de662cecacfcaae98501113509f471b7fad7791 legacy-trunk
+11792 a1ca085168fc81140cc11dd67fe78386ede82f4b legacy-trunk
+11793 d64b4cc81ba62d339fb5c56aa8ba40a8c722151b legacy-trunk
+11794 d28b491f45556aa0537d0eef03b62ba147b7fbb9 legacy-trunk
+11795 a2397255a6d33f5d24d525e46d48bed1fad01329 legacy-trunk
+11796 d64200834a6b4af46c92ae800a9d719726ce2ef3 legacy-trunk
+11797 6903482438001c5831d79dec4dc5124de93d77cc legacy-trunk
+11798 414128a15bbd9f4de6fa6b9deb48accd3f853a36 legacy-trunk
+11799 241d012e82dce58818c330183807c3b695c8dc36 legacy-trunk
+11800 3b6c7e70cafff6bdfdf6b70aa5468b92a7e821b4 legacy-trunk
+11801 cc3e14837379963d5a986e63bf6c20d6140350ad legacy-trunk
+11802 083efa07636610f89d83dc48239a98965403967d legacy-trunk
+11803 79439e4e9976958a0d4cc83114fcb4ce45949d98 legacy-trunk
+11804 928ea5a409e5351d46456ebbd3a9ba7a6c29c051 legacy-trunk
+11805 34e4202ede201d7d9c044cd3074acef71f44207a legacy-trunk
+11806 bd9d38d643694ec5237b559b4adf27ba8d3c2a41 legacy-trunk
+11807 5db647fedba033cecea0440a2872cc3c3650b948 legacy-trunk
+11808 48c615d84da66dab84261d417c024755eaebc180 legacy-trunk
+11809 5ea8836d96700b92aeeaf16b6706cd2450a8895a legacy-trunk
+11810 467df61ffbfa95fee6c39740501d0a83a8025e29 legacy-trunk
+11811 416b77b811c5b831b3959f724517a3798912b664 legacy-trunk
+11812 78487e701686d941d0bc4ba6669ae0bfcc87846c legacy-trunk
+11813 f33b394e5d7fcbc38541eb958ef48daea53abdef legacy-trunk
+11814 003b42c9f24d210827fdfb0b198a9003158637d1 legacy-trunk
+11815 8a26e55e18b812dbaec5f138aa7a64dfb2e6733d legacy-trunk
+11816 8918e4f54eca8d166a40a47972acc216d16d1a8e legacy-trunk
+11817 8e9d979ddf550b302259943c70572dfc03ab938d legacy-trunk
+11818 40d21a5b9990156b048c79298f7740d73a0d887b legacy-trunk
+11819 84e21ac7d3ea358cd8f6fb4212e4929da42c89ff legacy-trunk
+11820 150907c2c2c082797302cec4ac3f4792181f9c6a legacy-trunk
+11821 958e4889ecab56e383e9d231c36d7b6c42efecf7 legacy-trunk
+11822 ca6e2273fbf6275480a04e566db000989b087651 legacy-trunk
+11823 3b91432ba1a413156b37f26b01ed4ed38a9d9333 legacy-trunk
+11824 c91e4d87f69469715af5e3822f975b4c4d332e19 legacy-trunk
+11825 81574e4646b43cadf183c0086d562c824c80f6de legacy-trunk
+11826 7f242f29a45fa8a0007b8494ba140f93752977ef legacy-trunk
+11827 fd5a4309bfdc2d4af825486aeff5ff10026962e6 legacy-trunk
+11828 75237ca56aff37552b6dae803a67e598c9c258da legacy-trunk
+11829 462ccd0bbe50ac692fd3d8fbb85470fb0741b213 legacy-trunk
+11830 9340cb2ad3a8874f9dfee89dd5acefb178e43e88 legacy-trunk
+11831 b605f22a099aa9c696d8c8f1df3511da009e2025 legacy-trunk
+11832 f4dcb90ac419f69ea20fd9d7992f407f03a9055c legacy-trunk
+11833 fb2e7f38e1bbe68aba8999d2e7d53cbd96227d27 legacy-trunk
+11834 041f22a5a39dd9b1e32730a37ab7760f85fcd7e7 legacy-trunk
+11835 ba3277cd30685f52cc99d6318b56c9976522c2dc legacy-trunk
+11836 d740c9613bba7a1adda264ab6654e3c27d7da8b8 legacy-trunk
+11837 70b32f41a7fbfb38ee572946291618440483a4d9 legacy-trunk
+11838 5a3d21301a05145af1002923b5aeb636987991d5 legacy-trunk
+11839 ef68f0e609e198abe7a88d7cb4127f7efd1e0b1c legacy-trunk
+11840 4f78504a5f81dc76bfb858a074d2722a90a29e62 legacy-trunk
+11841 50a2d64276e4b126efe085216113449ed45db1e9 legacy-trunk
+11842 23363bb8bd90cf19fe7e44e9fc8ec773a9fc5033 legacy-trunk
+11843 e16e363e391b433a387107a2dcb963398bf80931 legacy-trunk
+11844 bc9aea718e4e32e3d71b9b33fb4570e9cd231c0f legacy-trunk
+11845 6690838ba8da60e4f5c4f0186ee2fa2416e47b35 legacy-trunk
+11846 bf89f1435b728cd0ee3bde38e8d0086b62e00f2b legacy-trunk
+11847 4422ba389e41570b7280e963865209b315a9220a legacy-trunk
+11848 fdc3c459ed00afc2814f079dd5b86e1d594ea05c legacy-trunk
+11849 cd19a7db87356cfdccd7062eed6bbec9a24904db legacy-trunk
+11850 65b0882a44abcd9ad6c5a2b1f8859352980c2dae legacy-trunk
+11851 61f45dd7c43a5304688c346feec182a55894ada3 legacy-trunk
+11852 6b5f7e9a31cb9e6e037537f4d16a1aa0e401c705 legacy-trunk
+11853 f0a3c1fc7b9024effc3d919a79d50ffcb814777a legacy-trunk
+11854 6b889e4c0754e020914dbb77d7072fd3efb07c78 legacy-trunk
+11855 2fe7bbe71dd8c0a02b1edd1870bf5449d0156c47 legacy-trunk
+11856 d1eada9bbc3c7a27d83cb8f60afd25519158f210 legacy-trunk
+11857 4c23ae6c6e82c61cec7aa9d58f13db99a6497260 legacy-trunk
+11858 b1004b47bac0e7296f5d15b2afe1651d1280a720 legacy-trunk
+11859 50e0631cf117298dd0a138ad3d54ac1a2ecd93e7 legacy-trunk
+11860 f351c64c82edb86486552af9b297e3eaaf453aba legacy-trunk
+11861 9f135b3d9a78315d9b31e6ed38bd37379eaf3781 legacy-trunk
+11862 c80321c328b5d0d9b401d345b7dfc17db3dd5731 legacy-trunk
+11863 981dd20bc71162bf03c89605bd82a9d3430dfbb0 legacy-trunk
+11864 f6819b926fb2c66131be6f2af891fb6b90d10616 legacy-trunk
+11865 f04288ccf77b7b32bcc53df29a087724dea488d1 legacy-trunk
+11866 a6808bcf8ac29b4cb5b19fb611d35035bbdf8034 legacy-trunk
+11867 7c3bea0118958ea36347121a14462e8a971fc829 legacy-trunk
+11868 106faf366e3f07efa11c8a78c9e4b59bdfa5e3e5 legacy-trunk
+11869 6ff0948ff951c7abc8544a8cc8fb4c5eeec64992 legacy-trunk
+11870 229f73f2c878fe3d2149f03a3f75fccab0efcb55 legacy-trunk
+11871 480567310194ca07656981a251bf30f34d54b99a legacy-trunk
+11872 9bf40ef227c92b6b44c96dbf52b35c80537be9a2 legacy-trunk
+11873 42a07bef60e02c73a93005e3683406ff86591cad legacy-trunk
+11874 a4b4ba5c4aa211b67f63c7d6444131c67a518443 legacy-trunk
+11875 e18027130bbe20d34e62fe6e7ee3ebd44d6ec052 legacy-trunk
+11876 bfa7ed0b1a6bd20e4420e534d0feacb40ee3df6e legacy-trunk
+11877 09b5cb47592d44abe784fa2975a66facdf106dde legacy-trunk
+11878 afe50b661548c8d2773d75fe8537974f6c8fb3d0 legacy-trunk
+11879 8a349309fdf433190dd60c36188bc63cf75a3a43 legacy-trunk
+11880 2b34461ba4a3acea668bdb5c1c727a433d372e0e legacy-trunk
+11881 64ca1156edf19067694336ff9d03ce06a3bcf8d4 legacy-trunk
+11882 00b06cc5b9da178114c5f43cebb4afdf562847e7 legacy-trunk
+11883 f5d3974d209f33b92f133ef65d2e40d024dff6d0 legacy-trunk
+11884 f10c6a7438f5ce139c1b136bd1509857e76db50b legacy-trunk
+11885 9dd6f4296479fbf7ca74519a8b57c389052a5c9a legacy-trunk
+11886 6ce0ce4ea3c1847d5ecac0fdaf96e42794785bdc legacy-trunk
+11887 a9ae99f921540187639d6a9dcb1ed7db5e0d9cad legacy-trunk
+11888 211c9e283466f6e5b2bc48eb21f9261cc4699691 legacy-trunk
+11889 3d9a0a3e596b28abc93f9e839a97709876e74cba legacy-trunk
+11889 21d71f2e27248a0f4e393d0fc321ecf9b89321d2 legacy-trunk
+11891 094c385b56243136b5932e51324d0eb54d3b2633 legacy-trunk
+11892 97a543bf9f9a64401e589e3e4a189f9219be515e legacy-trunk
+11893 87c825ef7878da6e36d5c36552ff0f9c5732909e legacy-trunk
+11894 8cb388e71dd905075e5d5df484429fca17afbbfb legacy-trunk
+11895 b0465aeb0efce3030a61e60198a6b88325a7ba50 legacy-trunk
+11896 c19e9ac2b0c8c9978b334321b8d8bc2f66cfdda3 legacy-trunk
+11897 3bff67369b110859fe97e4d46c820d3167d4a4c4 legacy-trunk
+11898 f3670925b098c966674d39eca3e22ccbf14764dc legacy-trunk
+11899 9ccaecd3dea32be664872fd497fcd40e390573e9 legacy-trunk
+11900 58a35e5d13cc62716245fa10a6529a1d4515db6f legacy-trunk
+11901 f50b9cc76c1e6d917359917fb7431644f1ab2c74 legacy-trunk
+11902 3886165dba42678c52ddec025176f7f9ec986c63 legacy-trunk
+11903 63ecf7a4c070ec9b330cead1d3724f74d5dd4258 legacy-trunk
+11904 ee992b3120d3aece5fa39610a42fe25d2745ebaf legacy-trunk
+11905 9f9da0189b7b4dee1341ef1eee44278af3e1e45a legacy-trunk
+11906 44c5468f8d364535617c3b5b820a601d11814f00 legacy-trunk
+11907 620e02250c80bc60933625bf329405484c696461 legacy-trunk
+11908 fbca486327ce1c14b098ae1557e0197d93ebe2e4 legacy-trunk
+11909 0379eb7be323e8e79b11415ce42d605fd0077233 legacy-trunk
+11910 e7254e2f2dc1cd11f275a163b3c83224842428fc legacy-trunk
+11911 c03ffff387f8bdd42453b1f99d4022a050bcc234 legacy-trunk
+11912 7ba7fbeb88ec3adef25deac6b36d1c2a317a61f7 legacy-trunk
+11913 012997b9f1ebd126576bbe11dd297cd546d1cabd legacy-trunk
+11914 e6ea2bc974e26fbbf374150556192cf5494d6b5d legacy-trunk
+11915 f6f86b37f1fc3b9a4e0c15589bb2cb9ab988869d legacy-trunk
+11916 3b8b31d2c9ca311fe72f36db1e6cb1856620e2da legacy-trunk
+11917 8e4fdb0b0bb8e598e4a9aec5c4c69176af25f3e4 legacy-trunk
+11918 02b0b84dd545e7ba5eb67be908ba5fbf76507149 legacy-trunk
+11919 1a59f3654bc113a39960176c56cb5acbd0e59de0 legacy-trunk
+11920 e1806b280f5393cddaf3c51a4567df94768ff47c legacy-trunk
+11921 7f8f608acdbcd370a7c142330d373df6acb2bcae legacy-trunk
+11922 792cd7c5fd88ad67d414448d56703caeb94655df legacy-trunk
+11923 90fbec4343dec62febbff77c766e5b65cc779833 legacy-trunk
+11924 7567ef40de77cb7be95a964d10f350d15c81406c legacy-trunk
+11925 1c94f34b49e3f74c35a085764c4a987ebb36c2aa legacy-trunk
+11926 337ae12d805007ad1c6dfac6ad7dac2b4551844e legacy-trunk
+11927 22c32dd63ff5d77cd741dd17d920ed077159d3ae legacy-trunk
+11928 87b9554c51d4ba6ea5780923094dba35bd2dd814 legacy-trunk
+11929 edf7553fb20efedef9b9019d043974fe71bd59c1 legacy-trunk
+11930 9ea5c42dcbedb5c3e16564f6021930f284034f65 legacy-trunk
+11931 4f6f730d2556dbe931e0eab870b6720826a1adbd legacy-trunk
+11932 63fe85735bdcd954d1a0f445bd7a44ca2123f4b3 legacy-trunk
+11933 49623da3c63f3f52e2d5779aa2d43ed2acee4b45 legacy-trunk
+11934 c6366893cee1d9760b53616e38ab7720f75ea77b legacy-trunk
+11935 ceb878796108169139d4d371b28f6baf98cd6836 legacy-trunk
+11936 e1c330943221e5d99df23a42a095d2cbd506e205 legacy-trunk
+11937 f8ddd234039889d9cfff95c7d0a21a0caae2f15f legacy-trunk
+11938 913eb31b03172212651e7caa84d08c5f4bbde80b legacy-trunk
+11939 0fea5d5c4fd9da8d7831476915234e24b84af415 legacy-trunk
+11940 56217eabc07ab4d5c59832a320a7c97e4e528652 legacy-trunk
+11941 4bd5128e5ed4344ed1b17860a76fc60b47ea529a legacy-trunk
+11942 1880ead3200cd45fe2a91edd9ecbb62776f81103 legacy-trunk
+11943 41c884dfad5ef4b997f6c65ab74f410cbfd33975 legacy-trunk
+11944 25b6929ffb13de005a88618f0a753b535ad3ab18 legacy-trunk
+11945 f242cd10e16a248eecff167540889480e329ad9c legacy-trunk
+11946 d3939ad381766aa3019d6f06533364b58a888318 legacy-trunk
+11947 da71aa1be191c01c3e85d79489b5b298ae41c47e legacy-trunk
+11948 b34f9e7e26914654d4863c67bf487e6006c986c1 legacy-trunk
+11949 4d3e2f1d0ae47edb75ec13172bd1076ba50e5306 legacy-trunk
+11950 8bc0a32ddab5a22bb96e277088f2d2ca66b65226 legacy-trunk
+11951 e5996279f58c7b331ca083336e1e15465eef4474 legacy-trunk
+11952 17bca4b3da9357cf9dd9db954058989e8dab1e53 legacy-trunk
+11953 1afdc55801578cf1ca5672d03c5e0b6b8849a203 legacy-trunk
+11954 54422b46f6d1802cc93c479f2278367ff4eb8894 legacy-trunk
+11955 e7d984f266cc61f6e6aff96c84eb4e2c22d1239a legacy-trunk
+11956 62e1bcc66a93e4255959a7c182d60ca5de098c75 legacy-trunk
+11957 4fa8810e85cacf5cf0e2dea04bfbfca3d31cede0 legacy-trunk
+11958 9ffd604807c21673da30b14094828da43911d4a1 legacy-trunk
+11959 8dc0e97a45ec75208c52a1dc066574b92fea7574 legacy-trunk
+11960 798b1041d2606f0946e9c54fb0c431fd8c47c892 legacy-trunk
+11961 a115c3d492db083474ccb999a001326ba92fc681 legacy-trunk
+11962 4de09ea10ee08e020b0e364ed769915b8fe0af25 legacy-trunk
+11963 6a244e64b3e6b2ec07694bfe9acab44854561d43 legacy-trunk
+11964 feb6c386ab7726583e4f0833ac27c756282ef5aa legacy-trunk
+11965 d07bc8bf2d84593ef79103e822ee1e3cf7aa58b7 legacy-trunk
+11966 1abd91f9703325c7434154e9b72f516ef029a384 legacy-trunk
+11967 c21815fa0778866506167624298c6446b165a30c legacy-trunk
+11968 de0093169649bb30f6f8aefe308e2438b875d04d legacy-trunk
+11969 abf2cd251b24a9c491f388bb9d91fbd846fba678 legacy-trunk
+11970 3f717342f0a36de91d6dcf32d1957d2026326f5a legacy-trunk
+11971 c1fd8146f2e9a79c77e5877abacb162052916355 legacy-trunk
+11972 f89ea9bf9a525d9832d8d21d2770816ed27469ea legacy-trunk
+11973 1ea6d2356e52da40f947bd2296bf71ac09df8972 legacy-trunk
+11974 afa0cd217f4eba72db41c165a32abe2cd69cf236 legacy-trunk
+11975 f6a84a1c7e02cfb2aefc22308bcc4a892fec3c15 legacy-trunk
+11976 39ffc5967b6bacb2447b0643425731334a69a8a3 legacy-trunk
+11977 4abcb32f7ef54a332dc4deb3b48030d13be902da legacy-trunk
+11978 e1e9c9df4f12c8f501d6c107bbd9198c53b277c3 legacy-trunk
+11979 63876cd9984c92681dfa834ba8ef367d58468694 legacy-trunk
+11980 25be00f31da615d436ee593f0b8c3e0f627c6181 legacy-trunk
+11982 d84715523095ac27f7b3992968b1c1f26e9fea18 legacy-trunk
+11983 6e6be896ec466e944b39d3693c88d39ba61c6899 legacy-trunk
+11984 d3928b98e2e13e9238c31534e651f3b73b5b034e legacy-trunk
+11985 8f3e7fe1d4f763c0af5114f3ae5c9626a7e37cd1 legacy-trunk
+11986 b0ca2ca586b158b1d4c1082869c5129ab3dc7620 legacy-trunk
+11987 db7cca09beafe7b7c221e813db2de8d44caafb84 legacy-trunk
+11988 b75d93ec8e5a6f7f1b3e113cf9f2b07d31818641 legacy-trunk
+11989 a3bcf1b365517b54a99ff7fd2810c700c66dd7b8 legacy-trunk
+11990 9647c6ad6a5098ce895ae2d727b9aa8e2463de1d legacy-trunk
+11991 181507cc1a72595a5f00556aa8277882bdcefc28 legacy-trunk
+11992 549831723ef8578a1aa2f11cfde3a19576ffe9af legacy-trunk
+11993 eabebc1615186b1e2e4f6db3317e65022ecf2103 legacy-trunk
+11994 5d81e42c6ba2e8e0598828104322ec77dd6b5f9d legacy-trunk
+11995 96c734acf84f55cf903d5ea796b2fd8cb9564a76 legacy-trunk
+11996 76e935924fae0b48c7851b29a71cfc6cbca52ea1 legacy-trunk
+11997 63a1a8513c1dce70fefe7377416524f4bfefa34f legacy-trunk
+11998 4431e7a319775bb6edb46b12ad57073b5f920e19 legacy-trunk
+11999 37777e0f80e37554ed2b07dcea5c940f250ab5eb legacy-trunk
+12000 60dfa211dde8bad6484d8ae14454713b4025d196 legacy-trunk
+12001 fec862301d6e33ceaa2dd4b11c442cb552307cce legacy-trunk
+12002 f596518d0691e025bcae6ce747c817161dbcdcf5 legacy-trunk
+12003 24497643dcc91d14df652aec86188fcf3599889a legacy-trunk
+12004 04426224302aadae4a23744c51cd39a8c518b810 legacy-trunk
+12005 cd790310bc4f06f2a3105412064fc12fd66d71a8 legacy-trunk
+12006 60d990f7d7ab56afc59c5528d4c87df373cd5660 legacy-trunk
+12007 4a7344d55ae1879528d0a863c3518ef60c7a4206 legacy-trunk
+12008 85444af2be95d055b1233605cf2adcc3b524fffb legacy-trunk
+12009 bbe92932a005e57e228cec142da61bb9de5fbf53 legacy-trunk
+12010 a2e83bdc1feaef73ba596ae1e4c461cad671c7c6 legacy-trunk
+12011 350f24180dcb422a14d7f6eba08b0d4efa0a4fd8 legacy-trunk
+12012 a126107c433a6f9a07c7d36ad899cf955d4f024e legacy-trunk
+12013 983f53f2b6f683cb4faf9a0b7cdb6aa61fbb5c42 legacy-trunk
+12014 58f6da7c8bb894214af39f4ee12c65ea0af8dbb0 legacy-trunk
+12015 fe783984f92ea3a24889af54f2c4e0fe05aaae7f legacy-trunk
+12016 230925fe5b2de9dd6b36b21ec00ba705878f3b3f legacy-trunk
+12017 5ae1a20bbe71eb569e6211c4d4accd9d62d62bc1 legacy-trunk
+12018 315cc06a8161547dd49de9f2b12c32c859298e0c legacy-trunk
+12019 0f27257fb6cf4f415bd6b3a640671b2ed908d880 legacy-trunk
+12020 a1a8df73bfff523fe7c7d8d398ccbc92ceb19b56 legacy-trunk
+12021 ed6cacddc6c68e87b9061acff453693f291d146c legacy-trunk
+12022 c6a1103efa8af31e6e79a69c0e5e1a4859150f49 legacy-trunk
+12023 48c7004109363bb15149543ee6c6f2005f589317 legacy-trunk
+12024 7504f23c9247d9106e89a56fc7d1d843fe66921d legacy-trunk
+12025 f902ecc867d08d34c9a0a39f0902f484494c1ad6 legacy-trunk
+12026 e059049b1a7620c8e153b4149f3c256f67fe143a legacy-trunk
+12027 d7d39260fe82d5ffe1d57b6ca66646a96b4fd573 legacy-trunk
+12028 83f83f002d2eae51ffb823689cdb139411647997 legacy-trunk
+12029 68863f51276c0851105bc925c1adc74812d0fa65 legacy-trunk
+12030 df0777ab7c63854f86330ae9a368964803b276ed legacy-trunk
+12031 79a8a1a7467b122f40e182daafb8e1a7a0b8d3fd legacy-trunk
+12032 53325b8f8ce9b1cd3eb25f8a782d9d3251dfface legacy-trunk
+12033 93ecc51f59d12af383b534c2f3174d117341f96e legacy-trunk
+12034 3e50c1ddab3a3bcb11a2c90e00f8fb0816735fc7 legacy-trunk
+12035 f17ceda6e66692573d3ef1e3a05b5470f5240559 legacy-trunk
+12036 ff392dd7b9709744bc4c483a1cf06c9b0e91303f legacy-trunk
+12037 87bbc721ba2b99df571f78c2b407ad0f0b8e4062 legacy-trunk
+12038 aa2c1a8fa8ce11249494b9984098083ec3b41220 legacy-trunk
+12039 b8ec974afd6956d672592581f6273089f1076e42 legacy-trunk
+12040 1437c2335b3b46a5e8c6c045344e6905a1cdd2e6 legacy-trunk
+12041 6bad69d3821625f82938116a0f521939e92ecfbb legacy-trunk
+12042 16af2582c964ccc7c5a5e055b1c6b3758e166673 legacy-trunk
+12043 d6415c27b3b1b4bf0bed00fe90ff5ede3a592457 legacy-trunk
+12044 aa961a46ae9e09763b313a75dd4ddd5daed14e4c legacy-trunk
+12045 6e249b135ed3b21d69f14cc063f815a4a2bff6a2 legacy-trunk
+12046 8819def1b39c6aca0401db6f846cb1e558078caa legacy-trunk
+12047 485c0bdfe8a0e39efce509b9b5097dcfabda1ef8 legacy-trunk
+12048 d594e832a56cbc19233c6d2a3681c17309b8675e legacy-trunk
+12049 df3985eb5873bc8f763a494e8ab65b0e64474e86 legacy-trunk
+12050 9a4f5baa824e7abbd8b04477fe3b9295f9c1d766 legacy-trunk
+12051 16878a4c260d20a5dfe48f4d4b99a38e973cf8e9 legacy-trunk
+12052 9177c409dc4512a09b2cc080622fce6d632727ae legacy-trunk
+12053 2200904abddc5136544b0dd08dd6a7b1242ce8ee legacy-trunk
+12054 83bb606a32e6f448f9808cab67ad439a2cb43edb legacy-trunk
+12055 f02c6549ed1b5417b462237fc55c429c796bfbee legacy-trunk
+12056 fa867d8ee7ebc0390ed479fcb01d0d034d6ddb92 legacy-trunk
+12057 feb8f8769ef62dc5fac109c8d11d8ef1d9d3b89a legacy-trunk
+12058 06717e52068ffe308573eb5302b09a8dea70f330 legacy-trunk
+12059 ae8e149444147caf2db55e70d41eeea3cc4bd5be legacy-trunk
+12060 bc9e7721c916203f531b0ca5cf65149b6b76c3b7 legacy-trunk
+12061 d85d2d994f1f789f6fc3bcfbd23114583171de5d legacy-trunk
+12062 d13a60b44b4587c65b9094a0e77a77d66489ff05 legacy-trunk
+12063 a091185ccfb6b458e0bc5483abd82053e61fdeef legacy-trunk
+12064 ac742862ca36277884004cbda27ba6269aa8f6c3 legacy-trunk
+12065 b7158db347d9b9feedf89e792a2db900db303351 legacy-trunk
+12066 559911768dcbadb2853bed7671717c6ca51571c7 legacy-trunk
+12067 ab20f5cdd79f6e54a5dab4ac3faee7111b972baa legacy-trunk
+12068 5cdbd8c04016cc644fc6e3da8028867e4c7b19a0 legacy-trunk
+12069 b09a9c412ba2994a979ffda5aa1b141a03973d73 legacy-trunk
+12070 b677436753a872b344d838dbb946d5291b4d25d5 legacy-trunk
+12071 8e6ea5f03e7340cb7ffcce0f59eefd30a0d0b386 legacy-trunk
+12072 aa1e48285d7bce007a8e50c5c593c81b6e138449 legacy-trunk
+12073 cdf5617c2022d2b77180058adc2bc788f14b7296 legacy-trunk
+12074 98ad57c39d20dc1f105a5a648272a49ab12a0546 legacy-trunk
+12075 81dd7c73f7b21f49b388724cac71e62a10d438e3 legacy-trunk
+12076 299284ee669dfffb7a4fc8bc7446c09abf31bf7f legacy-trunk
+12077 f4da9449f01101e2d5746664cda9e5ed45a401ac legacy-trunk
+12078 9a8ecd759e13411c2ae2f051b98cbc9a85f73148 legacy-trunk
+12079 4595ef5a968ac536eb620f1274f8c3bcd34c64a2 legacy-trunk
+12080 88d590cc1116e4f4fa0a9a400e95540463b4f12b legacy-trunk
+12082 6483dbe09f06188ce3fbe16e8c31b4282d0497d6 legacy-trunk
+12083 e66e88f5260643d3837ee810a8679434874e40d3 legacy-trunk
+12084 3c297a6ad4e8bf99a9c1c74c64fca6b04f4829d0 legacy-trunk
+12085 60fdb1db1175665b9d759f02b1dcab10d004f52a legacy-trunk
+12086 5a9ca2e937b5bd734dfcd2e8a505c375b60e85af legacy-trunk
+12087 38023a425e48380bed7b62b3b753b045f33456cb legacy-trunk
+12088 01c8fe44064b32dd2f6e7304f352978046979423 legacy-trunk
+12089 45bd6c40c05ae052fa00536d071a20101c43a4ec legacy-trunk
+12090 7f90736701a350e339553003c0ec5a260274e055 legacy-trunk
+12091 2aafcee220bc0b7689f82f46e09c4f9e00ebf7e4 legacy-trunk
+12092 f22f769bf3d9421c9a9aa14e60654de74c8eb07e legacy-trunk
+12093 86bf70a55efde4de7422a168ac8456126e15139e legacy-trunk
+12094 616b174eeb54830de84e0dd236069e6f13faf7ed legacy-trunk
+12095 3609cddc79df6103ee48459606d545693d1e97be legacy-trunk
+12096 5831bb3ca42a49f88ad662195e0f0a17eb2dcb7f legacy-trunk
+12097 54aafe42c0c3f201ecf685e772bf64c4fd16b8dc legacy-trunk
+12098 3076fff30535f2d0b5ab9f4f606558ec618114bd legacy-trunk
+12099 fcbf222e68981aa6f46decf3944b41063ad505cc legacy-trunk
+12100 0f3f9e366356c7b811885b233b8d37c811335bfa legacy-trunk
+12101 d7986b4b91009c0a22c142339cb0c1ca259c3e96 legacy-trunk
+12102 c4e2da47794929ce05e0afa38c418622c823dfb1 legacy-trunk
+12103 1dc0ef24b15d3202e22991b415b960168ba9d30a legacy-trunk
+12104 6b59f9ab5db1a51384192b60b4eb0f9cc5482492 legacy-trunk
+12105 cb9e3f00d6b65474dfe803a72075e6a87489c7a8 legacy-trunk
+12106 8483953a92483d7eb950431e5d4145501664718b legacy-trunk
+12107 5a36bad1d2489b87abd77a1cbc22199ecdc59ff6 legacy-trunk
+12108 c1f98857cc5bb7f607902d83572ef5c399827060 legacy-trunk
+12109 2678dbf4ad69a330d6e4eae3a1ed40e2b63112b8 legacy-trunk
+12110 570fed4ab8daf6fc97b64514a3d9e4716e9044c4 legacy-trunk
+12111 aa88cffc35ab94a32a81e9a1947e27013f3e98cb legacy-trunk
+12112 5426bef89ec338d04d8ffdd346182b2470ff1c3d legacy-trunk
+12113 ce79c0e74f6fe1f290be48f6ffe928feea14ccc5 legacy-trunk
+12114 c03787ec9811c986b586a0ff6ef9f2e4cfc198de legacy-trunk
+12115 9abee63c6bab3c46d7f6b6be4086c2e48eb28aa2 legacy-trunk
+12116 c12fee4ce363d8f31b0df3f0bb77fad8e37d7da1 legacy-trunk
+12117 991bd353cfebfbd7ab649e2f93b3550734b71824 legacy-trunk
+12118 90fdb37764a22b106b4f52737c3e8468fe6addb3 legacy-trunk
+12119 179fb63b15547473bb3daa08bc2c72181a0c9eb8 legacy-trunk
+12120 07ed38c296ee8f85b89df7ab8500b090f21304ff legacy-trunk
+12121 5672f5f1db4684d1a769b82ef279de8b0cc644e7 legacy-trunk
+12122 fa8f9fe0a33d98515aca4488ef73e5182121783d legacy-trunk
+12123 b2fdd71ca006cb463e37f28dfb039c5f3097cc26 legacy-trunk
+12124 1fe48009d8ea8ca5b7651c89be78cd3a2eb1ca8f legacy-trunk
+12125 98a6fc6877aee2c21973ac0158ba4bcd31f2fb6f legacy-trunk
+12126 4f50c70454a9b2d120cad6c4d63ab4feef983d95 legacy-trunk
+12127 82030ca0fa2ea00c54f5c4de795e6647fca963a5 legacy-trunk
+12128 ca21284e875dcf57e07f793a4828e16fa9bc9233 legacy-trunk
+12129 d66710939a325487f4b252513e1d6cb037e28a9d legacy-trunk
+12130 2b00bb5088036a40588e22f34aaf743324c4319a legacy-trunk
+12131 ac5345814ba0933c3d5a92f2e3bd8258286a2331 legacy-trunk
+12132 e2dc3cb08c60a7f9605ad069b3b92abbbbe62982 legacy-trunk
+12133 8586d911fb390238b23e7edae7d293c7928fad4d legacy-trunk
+12134 44267b88fb59410ef68e4716679c53b84348c9dc legacy-trunk
+12135 e58957f06a15384e2d7dc265d0e58d17d2569401 legacy-trunk
+12136 f5e586b5f7900045aa43e734a2f67d6a45322435 legacy-trunk
+12137 f9cc52374c52c3ecee2c892e7c92cdf0030bf92f legacy-trunk
+12138 da1dd3e54b7ae24a2623d0cd5fdf019f9cbafeda legacy-trunk
+12139 72a2fbb0e1f90038dc08fc51bc84e28134ee1e8e legacy-trunk
+12140 d152adf3f094cb22b92825a90463166b06d242cf legacy-trunk
+12141 08379c7f5fa9b301f21ef0ab2fa383666148f719 legacy-trunk
+12142 c2ec21c65d05005d6076a5c5756a69f7409a9352 legacy-trunk
+12143 2cd58a61b0516073c48c930567bfbc9f8ac4b340 legacy-trunk
+12144 4e15d175eed0c9bb491f35b6957e827f85fb792d legacy-trunk
+12145 4742c529d9c8e1c9d6617ce29ce3721cedae4c1e legacy-trunk
+12146 c4eaef89a4a75d980acd525f878affcca368a444 legacy-trunk
+12147 c66b0d39a736be60e7eebf5e6a69fd7089b353fa legacy-trunk
+12148 47012c13efe47b4debb97081298aec57eccc96ec legacy-trunk
+12149 b4cda3940ac3fc97f4f6aeba81351de75c0d8d55 legacy-trunk
+12150 b77d373993437a99cde89d0d7c7becb0d6f8ddf2 legacy-trunk
+12151 e7ee1884fd5491cfe8ede59cbe2dce01a20d57d7 legacy-trunk
+12152 6941f43d3bb809c7061024a9f3f0d644bcbb2170 legacy-trunk
+12153 917357c1255226c9f88bdedb55e2d6dce43a51c6 legacy-trunk
+12154 bfce73d3576c3208cdc12c0865b801139ce8ae6c legacy-trunk
+12155 ad497cb5d2dc2f989a74c131ff12b98980ee8e67 legacy-trunk
+12156 7dde4501f53ada34d11e62021ded257aea891b9b legacy-trunk
+12157 23237bcb774bf2ef63f9e2c7c3ca7ef269d92cf6 legacy-trunk
+12158 04b0a0f29f65f30aa55dc4c0555273af0677b03a legacy-trunk
+12159 a206c61a89509e5d41c1d71a5f701c1c08fc4f1a legacy-trunk
+12160 4808a8b57af3abbe7774a05bbbc0f145c918975d legacy-trunk
+12161 9ba7f50b825ad0851c3738600babeb0351e3a2fd legacy-trunk
+12162 4449702a096a4fd747c6928a59696814de74810d legacy-trunk
+12163 4eee061dac44cbcb45f533a511b9b8f64bc87f88 legacy-trunk
+12164 e11d75005a5a9662cf2e477b35513790ae597c02 legacy-trunk
+12165 9da01e58a0b55ba98f364b2181f28bdb3f4ce00e legacy-trunk
+12166 914f83e7fa0a02899a37f24860b62ab17ad118d0 legacy-trunk
+12167 40858ab235682139da479c1e37547281f8da44a7 legacy-trunk
+12168 272eccc573e2406afeb9eefcbbdbe6a00d12fe5c legacy-trunk
+12169 214f3044d18c10cf71e9c00e3cf1b6f31f1edaf7 legacy-trunk
+12170 1d40bc25703a57c9d4aebc7e81e0e9bf9824c817 legacy-trunk
+12171 b4843a07d5791c13036b2ef0c2f0292bdb660fca legacy-trunk
+12172 9916fc85b28a59fb24f78a829842dbc0e5a54746 legacy-trunk
+12173 53766fed9f8cb8aea022437a3379151473df0f9b legacy-trunk
+12174 b78049fefceb297c66720b196f3b783a6e7003ad legacy-trunk
+12175 5d4f1347150edea4652fa73d5021f0d0067a33a2 legacy-trunk
+12176 00fed76980bc7f727eca24b97d382e65b088929e legacy-trunk
+12177 f39a19a1229af6e1e5e66f51e330c95cfe69d6c9 legacy-trunk
+12178 877d23bd5bdc2d304fa21c345c99bdce1fbf311e legacy-trunk
+12179 8b61e1273b4bda34a7fb88b2a79271bb8b85359e legacy-trunk
+12180 6154d2e6860328669b4f647650c61a135238a9dc legacy-trunk
+12181 5345fd13de3d9d7a4ff599667860a8950f6d49d2 legacy-trunk
+12182 5a6bd43e2d5a755440a8ccf07867468d93f11b06 legacy-trunk
+12183 10955c39c0e7b6be68d64ce8b1ef911465470dea legacy-trunk
+12184 93cb1aa24f7d1069738bff93ee858d6cb4382d42 legacy-trunk
+12185 b0b815eeed2c491a8e58ea09bdfc2b2112e3967d legacy-trunk
+12186 b883ef3b2d196b2d9c8e0b78704c9513209d231c legacy-trunk
+12187 ecd11542eabe51939039d78c24b2037a1a032719 legacy-trunk
+12188 0a0434efebcfebca90f0560562bb864758369925 legacy-trunk
+12189 31489799c8c60a30925558ba49a16c6783237eae legacy-trunk
+12190 8d3c2a80834cc10bf12187f501c5df3abb11ed78 legacy-trunk
+12191 5389c6e30e54b130750f0f81f69330394c3b5ac1 legacy-trunk
+12192 263655c6b6567180d7b8e3aa184ce0dcf1609791 legacy-trunk
+12193 63732529f6df7e975f7147d8afb5d4ba71bb1f40 legacy-trunk
+12194 7a4eeed54b24514e0b1106eed60fd1fe57b51a0b legacy-trunk
+12195 22f3a8d803a517ec2d961e51231897cc588f7629 legacy-trunk
+12196 93c66ac6af1896d26ad4a9c6dd9022c02da087fb legacy-trunk
+12197 f7e86684cd4c2d3642fa4b79e4071167acda1b39 legacy-trunk
+12198 973c21df2d601b9df17f19b1220f5fd1f5901912 legacy-trunk
+12199 9701c50c69460738a478306a0c86ac1bd572ec74 legacy-trunk
+12200 55590251cf5273b65b13cbde59cfd66f7a990641 legacy-trunk
+12201 6ba7bd563e3bf7fa6aefbc7afcff69a637a105e5 legacy-trunk
+12202 b5d1a1625cd5db4ffdc0d2facacf8286310c7375 legacy-trunk
+12203 439421cda89ea76d673c00cffbccf4f493e8c034 legacy-trunk
+12204 c22dc301b36a81e2adda7344a54ca04cd5a2c8fc legacy-trunk
+12205 1277946054e8c6e162aecf1ea31464dadefcb4ee legacy-trunk
+12206 e0a4fb0abb769dde182523a311dc396adfc711cc legacy-trunk
+12207 f3f6023feb788d91a81957614958d13c67d1c773 legacy-trunk
+12208 d7dd71d0d1831a68f13ab2ac9cd0170bbff8f893 legacy-trunk
+12209 e78bdccd224ffc91ede85f87f8dfcb4494d73780 legacy-trunk
+12210 2bcde34746d1cf0bd41c4966f71b133c9b4014ab legacy-trunk
+12211 a3c9ce2985dee951c8b20eb884e696cabce5f432 legacy-trunk
+12211 f08c7a2a56f80741f5f192fd0ebe0b0967a203cf legacy-trunk
+12213 cf654ed58ff16a08dadab8b486676f8ab27b3f83 legacy-trunk
+12214 d1db7f6ab753c9f34529d8497d60e40238df646d legacy-trunk
+12215 8b25ba24944652a60bf22727f0bbfc5ea3b8628f legacy-trunk
+12216 2a89543dd3cab0e84c8df6d8e6071dc01e815e74 legacy-trunk
+12217 482e63d79c9dfee4a9ed3913394ed7a1685525cc legacy-trunk
+12218 3519de440f892c2c7e15965a3cd5e779a295f53a legacy-trunk
+12219 24ca64134594ad7f336cef1c71f4ea1a8fadb06e legacy-trunk
+12220 72b761b948e7e9ab791cc03e89c2ee778def1c82 legacy-trunk
+12221 3955f787e9a11c14bc44ae6e53429a0e98c3550b legacy-trunk
+12222 04e44c6076e8f2f2f350922945f86df17cf696ae legacy-trunk
+12223 56f38bf3af9f2d63382409b6b162e9d601b4c232 legacy-trunk
+12224 4b1b9432b26bfd8f679edb7413e82a9e3bb307f6 legacy-trunk
+12225 4336a190505b66e2632cda5a1eb47f339ddecad4 legacy-trunk
+12226 eaab8feb7fc0764d89cc2c45f031e0c5c8ed4e77 legacy-trunk
+12227 2ccf045f5a211f1014016c2083d9c616aa7bdb92 legacy-trunk
+12228 2646893cb499375aad00cf9ea568f7b1af0a0e99 legacy-trunk
+12229 6f1ca9dc95dab1751d45b6ed7dc566448064a907 legacy-trunk
+12230 72f50636dfea1e4583dcce37b5dffd6947c54818 legacy-trunk
+12231 10ab2c5fbd8ee7c0d7f9ae0195c9f60e8a6a67ed legacy-trunk
+12232 85d5b5eced9ea99863390e5a53f182e3d01860c9 legacy-trunk
+12233 47d2e4f711478dd5f0e0757fc445b7d4fea5e06e legacy-trunk
+12234 2e9931f44ef4f7862cb086435bec226ab3d7d40f legacy-trunk
+12235 47bbd0ba8e8a059f09a6a116b3d1ab3f1bca7daa legacy-trunk
+12236 3415d13f8bc8c03d09ad73579d8b3e8c3be1c958 legacy-trunk
+12237 9fcc902d740faaea94f92503d3c7899ae00e9014 legacy-trunk
+12238 e6b662a9b70961189b74c67e496723137915cf63 legacy-trunk
+12239 e06ef87b34cc4a885864ed76060fc18c3a4ac69a legacy-trunk
+12240 05fb4d966c73ffab0daab60897196972bcea0336 legacy-trunk
+12241 2507e15eca6b90c6bef2a2ed95b1d9ee1c46e97a legacy-trunk
+12242 0995a7a63782bbd0a4ff06759012b8bbf1ec44f1 legacy-trunk
+12243 85ab286442014141136b65024316c9038d088b3e legacy-trunk
+12244 6fc58d79dac5dc5d16e2e08d8b631218f47e9d18 legacy-trunk
+12245 9342c60eaac075ad238037db83618369e748d852 legacy-trunk
+12246 d6328d74b580efd9045276ed6064d38f104c4157 legacy-trunk
+12247 fce6c11c80fa1de9ab41d2d49e149810c2d4070e legacy-trunk
+12248 967ac5e8907aca94c46206d557f16043203d3604 legacy-trunk
+12249 7ceb92ba86f7649ec155bd2178c8691271b16539 legacy-trunk
+12250 08a9373860e836b1fe6c9b4e34cd7120aec222f9 legacy-trunk
+12251 e45df6f45604b9530cc746d2ecc9094135d772fb legacy-trunk
+12252 88af8a42857d31f2b6c20b053f964d8ce4bde6a1 legacy-trunk
+12253 7663cf95bd0ea86268025dea6d4e66efe6b5639e legacy-trunk
+12254 30f3630b77ca9945cf3435fd95924f3365421582 legacy-trunk
+12255 586d1b08614e2617dc30f8fc58aab592f1787e5b legacy-trunk
+12256 c708d70b139e215e6cfb0de6aaefbdb255e49b81 legacy-trunk
+12257 cd2e05dae4c295fa4fac7ba15c057b6ee4e04906 legacy-trunk
+12258 9e6f5bac15ac24a3a170da54edb06357c91ca325 legacy-trunk
+12259 3e7c43453e5e999c71115bfc2dd411ac5387fa1c legacy-trunk
+12260 cfb90db39958b24a3dd68a4b5a5993308659e5f5 legacy-trunk
+12261 ed523ea073dba049f8afcfc101444a6c19c738b9 legacy-trunk
+12262 16c9a714880fc00f08b6257fe714ddfd1e0927cc legacy-trunk
+12263 f7552dd236b0ad627bffb1861313cc27e5cdfb3d legacy-trunk
+12264 631d96d3cf660fef300b7d10914c2b27d0ac457b legacy-trunk
+12265 0d88733408462256ea652240ec4fd329e6a1fd51 legacy-trunk
+12266 61dde7ebfa951688a84b05900a05623bf96c3bfd legacy-trunk
+12267 4a07d69864f57512221f275fbb1a61dc169ed159 legacy-trunk
+12268 e1508f72c610bad2105bdfb83389d6a0a6abc9c8 legacy-trunk
+12269 8547d277a22f960c5dbc98bb6629ca4cf3191b4c legacy-trunk
+12270 eaf93d5bb46cf65b99ce8642e6c5243f2a911b34 legacy-trunk
+12271 8813627aac466a01fd196c5a59a63d1acf9ce40a legacy-trunk
+12272 e208b274eb808c6bd3e1425e5284f5768f3d6363 legacy-trunk
+12273 770b40fed5f7ab106c651a7bae0ba939ccb931fe legacy-trunk
+12274 b116afb817328ec2fdd0d0838adbe64fc3e08151 legacy-trunk
+12275 770d894e20bd8d23c9e73f5f04efd3e49d57fcf7 legacy-trunk
+12276 8b086349a488cb1a1bead64ff7c90e4b0328d397 legacy-trunk
+12277 da944678b00e0b8f331bc9ccc35112ca35492e61 legacy-trunk
+12278 c4692046b48201bff8cec32329aca332d8dbdb03 legacy-trunk
+12279 4b18f8eaa16b2bf8bb384770114af41ccf0cc23a legacy-trunk
+12280 c91ce49b4075089ad1dc7de2be1dc283ec9b3e9f legacy-trunk
+12281 6680facb4d5b5e27b9de9996bc7d8da9cb9a5320 legacy-trunk
+12282 be24b5b90decd63da5c05ab8c53dbdec3e4f8ebf legacy-trunk
+12283 8dba08223deba164f04a98ff5fba85e08b4b125e legacy-trunk
+12284 facb457b4d32ed6e224f777836a4351081736419 legacy-trunk
+12285 40f723ac26e82807374733b4cb3125f920d2b8c7 legacy-trunk
+12286 1beaf9179125b24af99b1243a927eca0f7837cf7 legacy-trunk
+12287 ecb912be4318a63c523e409f79c9ebbfd219535b legacy-trunk
+12288 08dfbee0a32a1397fb1b1ea6d5ed31295b4b1c27 legacy-trunk
+12289 7cdcdf8686b3c91b7d03f9e861375d6056fe34c0 legacy-trunk
+12290 9e61166ecdd81d5b0809705700cb1bff37c86535 legacy-trunk
+12291 fe701969bc2cf6b7915d59aca754d2244a4946ba legacy-trunk
+12292 737d05a9bb5e8a9af94cd8569ecd02b6971be04d legacy-trunk
+12293 209eed6a2ef658ed38cbe2c21af6af0f51c6280e legacy-trunk
+12294 836f9408c9565aa59c8018d529df5cc2893d3cb5 legacy-trunk
+12295 7ef5a1520ae53d0115efc7c8cda242c21fd662b1 legacy-trunk
+12296 db2982fb63c04d5d943393f4ebdbf876f2bb4e6b legacy-trunk
+12297 9cfc53e5996e0aa0c8c5a469fb89f1a0c605936e legacy-trunk
+12298 9d02afa022c52fd74e944a573a749b2ffeebbb7a legacy-trunk
+12299 c1eab1dc75363a341191bd5648410062f479639d legacy-trunk
+12300 928c93d2c1071db9d0c6ddebb3075d5e11edc628 legacy-trunk
+12301 5668f8a3a4304fbc10a48e3d112681821c5fce4d legacy-trunk
+12302 81b3e6ca4a29afbb138b624c719a3f1839bdc18a legacy-trunk
+12303 10270115cd4b805cff37e13652359c5ba0960978 legacy-trunk
+12304 8d6f84c5948c2851a000df530f673d75ae1da9e9 legacy-trunk
+12305 a9aac002e8435ba2b66a9add6bb037b2f80aecbe legacy-trunk
+12306 415b98411707f1222ff2ac32602c49880527abe9 legacy-trunk
+12307 0bfaff11c5739976bfaa471295202c536483b3e1 legacy-trunk
+12308 93d70308be171bb58a48a9d9fd3facf533c0035f legacy-trunk
+12309 f981c9d36c8af8565356549fe0afb3cd75926b08 legacy-trunk
+12310 1eaebaeaa22b9a2a16094b7fb5b84d50ead105d1 legacy-trunk
+12311 30ee86172168a31c13b44d3dc8893fe944448db6 legacy-trunk
+12312 870109a44e0ebe18a0bb6b7ea6f5008df2765c0c legacy-trunk
+12313 4d044005611e40fec368a39ca39b00413dea95d2 legacy-trunk
+12314 4010e5d243d66b8b21eab51473033acdb76f7ab2 legacy-trunk
+12315 1420f84009249b86d11368de4e4cbbd253d878ce legacy-trunk
+12316 66373727fac85b280be5bed5dceee933269b9bca legacy-trunk
+12317 a3b2525c9370404299139681bd53fed05738c560 legacy-trunk
+12318 bd1ce4120e6f9546dedf85ca97e8ecf1a5ac2388 legacy-trunk
+12319 457cb868c25e45a41b7ad2f3ec433f00854d40e6 legacy-trunk
+12321 28d3a9fcb577dfc8562f1849b4ddc4e4b6189ca5 legacy-trunk
+12322 17e4d81949b9f1ec0394c6106a7f92749eb1c422 legacy-trunk
+12323 ba63c6f6025b4f235b10a021a7486bf92df9aeda legacy-trunk
+12324 4e95065a72a1a6f2d73c98e960f042f52e836085 legacy-trunk
+12325 5bdf9165137726eb77beb6e43b3919d2d091d82b legacy-trunk
+12326 ce0c17cc77ce50fe83716be7c1e584b26b48b8ad legacy-trunk
+12327 ef97b4f6d1875fc6eb500c35138c5213f9f21284 legacy-trunk
+12328 80150f9c8c41fce9da2fc13b3f07199090ff3bf7 legacy-trunk
+12329 1399bef7af61355d6eebee36a6148740ccb3d930 legacy-trunk
+12330 ab55698bff1ca9a8a0b1180ba63992d8c9a92cdb legacy-trunk
+12331 1dabc73b7b0bcc82bdcdc6a97a11561a602a5364 legacy-trunk
+12332 61cafa97eb77af0669b72b7f7eff2ea2e90da3de legacy-trunk
+12333 e5cb157ff0931ff05e36bf3e9bc4ebc4af3c3925 legacy-trunk
+12334 82439d9987b2cf67a901c71febc7be5ff6a47f19 legacy-trunk
+12335 dd3c7fc0a34d4b9cff48fcc59e641d0a18bbf1a0 legacy-trunk
+12336 b0821b0bccf0fd5e44d36ef280e1c0b089565285 legacy-trunk
+12337 f74de77f0510ef3aa9e361d0b975b9d6182bba60 legacy-trunk
+12338 13d0f628c572290f2c4d8811420546aa687aa16e legacy-trunk
+12339 b8fedb226f09c1084bab6ebafcc023602df84e5b legacy-trunk
+12340 aab0f3463af06bc05c7b615cf15603a36a73b502 legacy-trunk
+12341 ddf3d55220b90d82155cb5249ad7032cbec46194 legacy-trunk
+12342 86cb77fb19e88adf8d306d70e92a9eb2b7ee4a96 legacy-trunk
+12343 f34bb47aafacacad4317b648ab931d37af76778a legacy-trunk
+12344 496700374fc438cb3470f940f738762499ca16e1 legacy-trunk
+12345 9a293e77c5546cd7a19f1db0d251aff365ba998b legacy-trunk
+12346 d64ce29801cb1709ad06ba8ffd3e0e5c3fc43cdc legacy-trunk
+12347 5bac56ffcca8f8014b15c933243be5de555aa2c7 legacy-trunk
+12348 e19cd8ec20a2e8fe73c6a60502844fcf82b83e6b legacy-trunk
+12349 5e9ef9d8575bbcb57549c7fca05324e7d7650ce8 legacy-trunk
+12350 ec80ad25ca861328af506839e9858f1b611ad453 legacy-trunk
+12351 6c6ee3bb3fcc22dcdeb047836136622163f6b3f7 legacy-trunk
+12352 01477b1a74f9c1c5674198db9ddd5488293e8801 legacy-trunk
+12353 b530bc62e3b991b813d40fcb7dfa3119b209d4c3 legacy-trunk
+12354 e6cd683a22f8189817b074019e363c3fa14d7cd4 legacy-trunk
+12355 30c1c40cd80fd369fc53ff830b742c22637e8db5 legacy-trunk
+12356 1e8ff8a8792ef7c98cc2717b46f3f99f5eba83cc legacy-trunk
+12357 cdb772aabba25d503bfe98574047a85c8aa0cba9 legacy-trunk
+12359 605eaf8cc6d0eceda2176826cf08444c370fc62c legacy-trunk
+12360 a1585f69255da00d0e1e459b6dafa7018f483553 legacy-trunk
+12361 51e868ef3b31e5a198dbf2f4bc0f5f95422398d2 legacy-trunk
+12362 b93c390fd25d5f14dfeb754639f98133fe77f7fe legacy-trunk
+12363 a7d1cf95dadc59e64947918ba29a44cea8efd7b5 legacy-trunk
+12364 8a6536c1a0a46268061235a1f440367caec7cb9a legacy-trunk
+12365 60f42586866eaf2535f5b24c10290c85a852b54e legacy-trunk
+12366 0aaea48902e43b276073482118d5919f81a41a79 legacy-trunk
+12367 f77b941a0f936de3bd01ff737133365a7c7dfcd2 legacy-trunk
+12369 c95fff8f180a8d7cc86e1cfdee9ce3e08933db82 legacy-trunk
+12370 a58f36352c4f3fedcc314c72f0bb3b7209d462aa legacy-trunk
+12371 33c4ba777a3a7d1ca2224335250849e2ef701404 legacy-trunk
+12372 ee36e1f130ccbb79f7eb93ef7ea52e493356a164 legacy-trunk
+12373 e3a79f93d1d3e58d91429e9b18ad907f9edf7a54 legacy-trunk
+12374 f352eea683734935c6a7d46712556fb152d4f0ac legacy-trunk
+12375 9da424935f78673868718eb2674c2f7dd1da48ff legacy-trunk
+12376 2ab189585d238658c93d633d4dc7d6ee2f7c3bb1 legacy-trunk
+12377 7786297847aca0a60c3a88b62c7a423ab5a1a03d legacy-trunk
+12378 f78fd9b67284adc4caef4e0548d31f787a8091a5 legacy-trunk
+12379 1ac3485f9e3e3676b2fe8cd876531fded88398fe legacy-trunk
+12380 e14feee4c456bc86e3e29ba48f6110d0180dcdd1 legacy-trunk
+12381 b0edc892fc782e90b37c89376b53f0d3f303a47b legacy-trunk
+12382 65937ff718defc5dae29c762d7a2296fccd39286 legacy-trunk
+12383 de41e8d8211dd35db6bfa239104c7c9ad75dd887 legacy-trunk
+12384 3589c0e56ef251661d325027ce6088e7a8ba6b89 legacy-trunk
+12385 7195ec296b3d9440342fb8a788814dbe10be21d0 legacy-trunk
+12386 14dcbb34b9dd3ae31f3740b515dfcea3dfec3bc9 legacy-trunk
+12387 030ee50bd8d1b48580886432c5aa2558d370ece3 legacy-trunk
+12388 fae6d24b897bce64abd9679866ceb440b323d626 legacy-trunk
+12389 ae908ef91cf0cc5698f1a8aa173de83e06f3f409 legacy-trunk
+12390 ddb83b25226eb703bf0000cc2b3294c0ead4a002 legacy-trunk
+12391 9f13d7380bf898332194bef222ea7c4293bb32a1 legacy-trunk
+12392 291c2d0a9683c4c8e4b897a193eb7cedd7225710 legacy-trunk
+12393 5bd6dcf16d41abfab0297b1cd13e05c82bade3a4 legacy-trunk
+12394 b3fb8410f6ae9925b9b72f3c06becd3e00e0ce4c legacy-trunk
+12395 7e2e53e748c8585bbea9adf3557c134ca284b84e legacy-trunk
+12396 4d86b5a5bf9e24a89213b30cfd93c93207228f09 legacy-trunk
+12397 a2d337b2e21ba4bf4de413756119638baee47f2e legacy-trunk
+12398 f88d14aded77040afdeebceefd29edfcd53eb534 legacy-trunk
+12399 7bdef4bedd5ce62881215aacac6302ba90095b9f legacy-trunk
+12400 92ae115573af29bef046f66910cede54f1852b25 legacy-trunk
+12401 5ad1a35f540c6590be22e9008a911065113813a9 legacy-trunk
+12402 bac965552f7e6c4df94e3621481dda2b49d3a6e5 legacy-trunk
+12403 695113c650bb5962ba247ee3b1fa34023793b246 legacy-trunk
+12404 7aa51532006a9e338cd1699ed6fbda9895d5ba25 legacy-trunk
+12405 1c4697080d0719ad0ed4d4f847df5b6be527cf18 legacy-trunk
+12406 d95afe87db4dcab4240c23de4c2876f3301ec393 legacy-trunk
+12407 6cf01eab05a32aabc09ed23cf119f982b2d56af5 legacy-trunk
+12408 78059cf067defba0eee0a5bbe1092c62046aa45b legacy-trunk
+12409 11414f023ad0a1333124b6c595bbb1aa9b320371 legacy-trunk
+12410 a8a071996a73d97fb308aa47b81c0d945922c9f3 legacy-trunk
+12411 37c3affb05ba23ef689007dd9e69990e0b90c89a legacy-trunk
+12412 18c06d39ce2c2a87c15cd9520997dc6e44f82c2c legacy-trunk
+12413 20d98ca3d32fabac0fcf3b3b4f8a677a125ff029 legacy-trunk
+12414 90344c261f2450f57fb0f0ae02fb020e0d8dc271 legacy-trunk
+12415 b74f55e7d208f707540f42365bfb5fda8f22cb3b legacy-trunk
+12416 9e2555edc94f4887e0365ac0c1272580acfb6319 legacy-trunk
+12417 248616d3ed12cdc9e1c5bfecf38e2f72d96f85c4 legacy-trunk
+12418 9a7e78e8bdfa2922371645119a8b302688729d80 legacy-trunk
+12419 286854771b11911f8a852713bd08387c1347c0c6 legacy-trunk
+12420 37aa84d278c559984f3bf65210ba69f2cc95f68c legacy-trunk
+12421 a78100370515cd13fabe4c356e4f0f89a17ffdc2 legacy-trunk
+12422 631248c9c62e1621ff95d436289cb46c87de5ed9 legacy-trunk
+12423 1a799d1d4b5a6e19c38ed15ddfd38813fee61290 legacy-trunk
+12424 6c1077284001d611d90554601d2663638f2a2cd9 legacy-trunk
+12425 76bdad23fcdb8a75eeb26fd22ca867c5e294591b legacy-trunk
+12426 5b177d51ba275813a91232cfbf2bf8a1b2199db0 legacy-trunk
+12427 a58d8e44ce32fd46740505db7bb28b4c99d0aa0e legacy-trunk
+12428 0455402677a8adf1c7843116fa979fda71448500 legacy-trunk
+12429 35f568480764affb396da5065a699ac9f0207271 legacy-trunk
+12430 4bdfe5d80a6f5b923b5dbfae8572897d198adf5b legacy-trunk
+12431 5f4d32b1a6583ffbf3cdf19829f37bd09fbf2caa legacy-trunk
+12432 f867e13da574ce7bdea0424aadf64a7238d87cc1 legacy-trunk
+12433 00fc18ac6aeb8e7f3247614ad6beab21ca9da892 legacy-trunk
+12434 1de3dbb26c2fa2eaae2f371dfe1197126ccceb56 legacy-trunk
+12435 189f1ec5c68f3dd67e2da48b268e36f6fceaa7be legacy-trunk
+12436 15e9761e54de1d57ac48659553925dbaba93cd35 legacy-trunk
+12437 ad749fb0bd4bd45ba948971a254a0367a4c5cd23 legacy-trunk
+12438 a64a615bb756330f7b9d5a3bf0b045f771899e11 legacy-trunk
+12439 c592c1771dfb5e63fe7e9f4a9da250b574b10d06 legacy-trunk
+12440 337843c6a18369d5750beb509060c4e3701359d8 legacy-trunk
+12441 faf351e31571d88ae769009f9f70a1a9f65e3d7d legacy-trunk
+12442 93b9eafe1f1de82a1a2071f8890dd5a82269f5b5 legacy-trunk
+12443 06c7fff5274a7bfd3c9c66c89120123316628241 legacy-trunk
+12444 626327a78a8ee36a9a4eb358fd480647e5707f68 legacy-trunk
+12445 4da1faf297ab8fa3746461ae555306294efbe8c5 legacy-trunk
+12446 396a38ea9b84faceb26ad537d60676b6d71d1f19 legacy-trunk
+12447 c39c4bc45d391e2df1db8a1cf519dd39dfecc3e5 legacy-trunk
+12448 c87662ef3f1db58a2343ca43965c9d08ae0bae17 legacy-trunk
+12449 7c996f3404720a2370c2383c5ab4e7e3f35813ef legacy-trunk
+12450 7539859e985a14a4ac7a44b0cc717fee27cb59d8 legacy-trunk
+12451 98e37347378b006ce6fcc49208e224acc8c3c311 legacy-trunk
+12452 ae83f61d3cd7e7199fd51a344b5da198eae1f0e0 legacy-trunk
+12453 40463d514f3ea4ba48a2c268455301e1a0eeebd4 legacy-trunk
+12454 e5d0df824bf382748c1e0dbc4fc36a058665d19d legacy-trunk
+12455 ca27452711116401c0215280ae4cd9c09797717b legacy-trunk
+12456 c404a6b0cdb1e27a57a00c0e34e6f51d1c15da04 legacy-trunk
+12457 9a842b81d9c3e94de71a41fdeda151e05cafe3bb legacy-trunk
+12458 716dc1d1dbff8901c259101a88af0bb92eaacb4d legacy-trunk
+12459 57bcc6ec638f6eb9ced912228b59142eb99ff656 legacy-trunk
+12460 2750e1de6829ad179be247f1cb09ac1783ceb141 legacy-trunk
+12461 572e131ae3690fb5d20479041b8dce84c6882889 legacy-trunk
+12462 92a25d51ff26ce2515d40e1f8edef9bdf7c92c10 legacy-trunk
+12463 879e3491b661b8e5a5beba8623a7e56919de426a legacy-trunk
+12464 894960fa90bc7559b7a5e7932eaf358aef4fe483 legacy-trunk
+12465 0d2791c7206dafbac9ae8ad9c5687ec1fa3987ce legacy-trunk
+12466 d44cb87e500dbbc7a1895b1308ca2dba6cefcdbb legacy-trunk
+12467 c1091e82e5aab06dd4d25472a19b558727faf3c4 legacy-trunk
+12468 07d333485a5e08b24f70749d323c5acaca454671 legacy-trunk
+12469 44146c06e7ed3c787eb011ce47827abc012885ed legacy-trunk
+12470 485502c42d89a5d68e4ffa90b0bc5788ea3ef2cc legacy-trunk
+12471 ee84f445e6d7a1cf8f8e69c588edab9e0165cfc3 legacy-trunk
+12472 8efa37a770c647b6585e6fda33590154c2f7cff3 legacy-trunk
+12473 0390af6acf7fa9895cdbfd84641aab6caf0680fa legacy-trunk
+12474 19fdaf367d45b6dd241f11d9eda111ce96a67cc1 legacy-trunk
+12475 4ec3b3cb07c8a1ea0252d71556e1bfbe7c2ee361 legacy-trunk
+12476 62fa03a333aafedce72c8ee9e37b9c0f6a233e51 legacy-trunk
+12477 f1a520d2631a8ecdbd2c249ec307f1d16caef106 legacy-trunk
+12478 4e2eff968cf5c671d12a5cfe45dc9cc81436ccad legacy-trunk
+12479 f8fc91b017a14315afbde5cf1464369340fc0e38 legacy-trunk
+12480 f6b2f20da58167dc866616e6b72302813d13ae79 legacy-trunk
+12481 489ef7f640410b2ce7f3e98f8c9ec6500ad293e8 legacy-trunk
+12482 dcbe72a0b3926b942e6aca8a2a5cd2aa27d28884 legacy-trunk
+12483 759121e3d9b6d67295d88c17daa09c1de7528deb legacy-trunk
+12484 adfacbcbd9361c929e2dfe446359265cba913d73 legacy-trunk
+12485 c866f166331bb6655f7f74a76b3bfdd41a9981b3 legacy-trunk
+12486 4af38a45d29c8c920a86bde9bd61f031e35f8d6c legacy-trunk
+12487 a6cb88b5816523f39361521b2fffc9a46e9a8ce8 legacy-trunk
+12488 d4b8ddd9a4fd0fd7f20422a67ec3d1cb8e3ad427 legacy-trunk
+12489 b7bcc2cda1b3b26182f28aed9005b113783f7764 legacy-trunk
+12490 cfbcab8150da91743047ba2aea6a7a5713be252d legacy-trunk
+12491 78ff203ead2454d4f0f66dcb4c6fead2577d46c4 legacy-trunk
+12492 124ef694c28443e4206f14889c4ad21ff6395f77 legacy-trunk
+12493 ddbbed8cb830ee49dac87c52ea9f716a09af1243 legacy-trunk
+12494 009c9ba9f658b259c7dccde40d86d6ab1286d982 legacy-trunk
+12495 16bd0fde09aecb72367f55ce7e68d52106428ae7 legacy-trunk
+12496 a78d3056ab6104b3502f2d359d4cc23944d50acc legacy-trunk
+12497 bdde8fbaea58c7dce2f6eb6a57df73adb5aa78bb legacy-trunk
+12498 eed0cacf4c64d8ff1eca37f15f35ee7f3c2442f2 legacy-trunk
+12499 8c6e705b6b971d42126ba3006182062813f5ef77 legacy-trunk
+12500 a1bcf3f29f66df5d4633286841bc594fa75c6a28 legacy-trunk
+12501 c0daffe40034689fcd222f8e2c7a5442a91725bf legacy-trunk
+12502 441500019d50acc25c5feb4d1516fdef47830ded legacy-trunk
+12503 2b238d19ae88a7cbb373c6505754c0fd1a20e731 legacy-trunk
+12504 4ab5e9f839d9746d9f2ff9530851fc7aee91b6df legacy-trunk
+12505 0a56e5082680b9f25410c169c3ba707a5efa5691 legacy-trunk
+12506 3a420717bc8a42e957501f05000b3b1929f7ffa3 legacy-trunk
+12507 77a94531529ec212a74e8ba87452e6795f55eb7b legacy-trunk
+12508 fe0b522e46cb3c86133493b42d365dc92860e92c legacy-trunk
+12509 ef5cf1a4e52a9c48540c9fd39c392ed77536d0b2 legacy-trunk
+12510 55f8c701c9dad11a541c70b00361071d4d94b5aa legacy-trunk
+12511 ab6dd70f25076f68924a899cd0ff748b9239c0a1 legacy-trunk
+12512 4671ae1035b38959909837abc6d8e369459f472d legacy-trunk
+12513 42b228d78bead12d33e7d030c4b3686379e8c212 legacy-trunk
+12514 4a25dd85df622a5c860db9873d786546765c30ab legacy-trunk
+12515 98fa535b9af1ef60af1fe8e79a0dc88ca304f0ce legacy-trunk
+12516 637eb961c11bf526b8c3402ee79735b91c52e138 legacy-trunk
+12517 2a0cf967719398334cfdee2ee667803c64c4b656 legacy-trunk
+12518 c6913c7326f096c023042f155035033d803b666d legacy-trunk
+12519 f2457d697a2a28e13e939b965efd204799e4756f legacy-trunk
+12520 d7979f4ed2b6163565eeb2847734bf2473ee2e6d legacy-trunk
+12521 8327668cfd1714d12ddfd8996115d92081053c35 legacy-trunk
+12522 94125a1343d818dddba0286d8cf7876506b413f4 legacy-trunk
+12523 2183f506a08e1c8be66b5ef6c0993f6d423219e9 legacy-trunk
+12524 28194f51f7fe54c41cf7bd077529fc5203d5f021 legacy-trunk
+12525 89dcea63c46bea02b5c3580247d33f4a95c5faae legacy-trunk
+12526 caf2c65a6bcf25f9650c35301ce8e060294be138 legacy-trunk
+12527 f572ae36d5bac9b456a39d7ada7ebcdb056e6897 legacy-trunk
+12528 620685e4c477e207a9e187947f562e33147cbc07 legacy-trunk
+12529 080bd46f3848799cdf5010e97d824b246b2c019e legacy-trunk
+12530 167adf31786d73462a7cc6fae7b46c65f0e6780e legacy-trunk
+12531 034b42ba68a6993a8a1f3ae4f157675f00adb9a3 legacy-trunk
+12532 74d0d2f3cb1dba8fc1a8160ca7805e29c6b393b9 legacy-trunk
+12533 de568ea0d040eb630dedc592e65687a685a5306b legacy-trunk
+12534 20e8a3344a0ff60cd8c4c6d1355fe9ca7978562a legacy-trunk
+12535 1051ef99431e5fedcae1c04e79e915ea97303983 legacy-trunk
+12536 c9b070074c85d3bcf2b3110d2ec459bb3172c805 legacy-trunk
+12537 b72a8c48f2d0043f3ff05805837ba2065870ec3f legacy-trunk
+12538 f5df22fdada8859b801d60af5ade98e021675efc legacy-trunk
+12539 f132ecfdb2855777f6042cd51a5ad47ad755fe3f legacy-trunk
+12540 ba03e68df0fd4f090dd706e1d863844b28ad5db0 legacy-trunk
+12541 6dff7696e358112e2a508def15e52a37b4ca5e62 legacy-trunk
+12542 3ad2b2e31f5308ea3fb223d4b5e363e6a343b126 legacy-trunk
+12543 32652f6996e3743e18c6db64f84abd9b7d9ebb2e legacy-trunk
+12544 f2c072b0546654d6214a03b48548d508b026fc72 legacy-trunk
+12545 0dc50d43fb84634dd978ed3b9e8710e7d2f10592 legacy-trunk
+12546 8cf66b1d4155ecd1e90c39191f3be9b4954eacf1 legacy-trunk
+12547 ee9a8fe0cfca5f110d78b89ff483686510ed3a6e legacy-trunk
+12548 c0739f641bd1d581a229222025e4e9befc7afb7b legacy-trunk
+12549 a0b06891d2860066cec97f446b856385d216480b legacy-trunk
+12550 7b88c12b8701cde66315344d5266fe800d197ee5 legacy-trunk
+12551 dce104e1a73bbdccae64aaee815cb015169611ee legacy-trunk
+12552 66858fdf467eba1c52d60323f712da498e88775b legacy-trunk
+12553 f07203cc2740a9197127898f50cbcd7f5662ec02 legacy-trunk
+12554 794a21a5ad35e191ac96a121ffb44d2298754b41 legacy-trunk
+12555 f33ed9e2a607fa4c9cd582a59630f7a8dbe5a0a5 legacy-trunk
+12556 27cc7a314502660a7723a50b9170985ce29d8e36 legacy-trunk
+12557 80e0aab1705ebd54202ac1340348989d84df6029 legacy-trunk
+12558 b82a61a884cf287607a7e72ce46ccddf8ec0ebd1 legacy-trunk
+12559 075f871d80b55eeaa549397dfd9fe18e1b3f8718 legacy-trunk
+12560 ee6256081366d2815c8ae1b363348a1353c52b22 legacy-trunk
+12561 c88aa9593a08ed11030d6f627e28e799850da031 legacy-trunk
+12562 015cb6231f3f8e66eca1df0946fd8a65af5fd76e legacy-trunk
+12563 ddda5854e3ead5220d6fa0b8f5678d2a08234fc4 legacy-trunk
+12564 d5e64a61632003c6c6a7df6ce82fe377c67fd82d legacy-trunk
+12565 8ffe450428b1b3390105c0cc978bc08bb9ae4935 legacy-trunk
+12566 d9b7a2080971ba309eb0de7fdc549ec3da556a2a legacy-trunk
+12567 6abd84aab08a8e5291a02b28b02398b14ecfac19 legacy-trunk
+12568 d7f434d784bf9e6892cdfe5c6bce9bafd353c2b0 legacy-trunk
+12569 7102289042d5e8e4490c4a26635fce63982e8a35 legacy-trunk
+12570 6d6f427ab6ecb18363bf62cda845b1ad014a2369 legacy-trunk
+12571 5e01645ee41b8c20cd6f001359adf62c46f6f43b legacy-trunk
+12572 137179186927a040c0ea82aa73fb3e3196a840a7 legacy-trunk
+12573 67ed05cf171d08f535a0aaa3bc0e930874318baf legacy-trunk
+12574 ecebcd84df37b2aef0e225075ef9079a1b23a922 legacy-trunk
+12575 1e21e22453dc3c4c858d2588d59837701d189cfd legacy-trunk
+12576 d4e9632503dfda3304becafb2535a5ec480912d9 legacy-trunk
+12577 d6ba8e5e55ad4c89a48764e7facb42a16148a84f legacy-trunk
+12578 cbf5503b32d559b63b3c119ca95149476fdd0420 legacy-trunk
+12579 80b215249b17d51b2650f9ba0e88f75934bb1ff9 legacy-trunk
+12580 c3d506794967df841cc21b989f3cc6a923b697f5 legacy-trunk
+12581 bc3602a83ad3295b2d63f8a8b7cb3a2e1fd5f8a7 legacy-trunk
+12582 6f42c8fe875b7de2258475f2465bdcf1b68070ab legacy-trunk
+12583 48af2c6b741e9c80cd30caa64b7951610738b426 legacy-trunk
+12584 b5454dc22dcb811f3f2127ccc07ea5a2b32fc95a legacy-trunk
+12585 4894dcea126b4079dc60e2079ad5d6526284c562 legacy-trunk
+12586 5823b615c301e3bb69ff9917f4080b60409aa313 legacy-trunk
+12587 d3e44e610ea14b227d00f2551ef7f88b679225c6 legacy-trunk
+12588 c7144e7e849420504f423f71d29d9af1109acfa5 legacy-trunk
+12589 9efa42445ec9afeee32b9b01cccbf3a12ca2b2c3 legacy-trunk
+12590 f5a55d3276083ebc501a4c97b90454b2595ce69a legacy-trunk
+12591 2a9ef1e0f541d9de18153df82148f81eca9b4315 legacy-trunk
+12592 aa0336527c4e9563394db04a20a8fd42d461e7bf legacy-trunk
+12593 96586db379fba9d984c636864b40f7b44a98987f legacy-trunk
+12594 574075e9a25f4db7b5461957f5a3d7c6fa609fbe legacy-trunk
+12595 d8c4378eb87dabe94833752055bb0167bb1aef1a legacy-trunk
+12596 1d28c7e1663657315d8ba1e12b3dd81f23fea174 legacy-trunk
+12597 7ead4a04427e88402c7556e3bf4e9e261a5e523a legacy-trunk
+12598 3ae03b9b65edc2a09d8fb4ddcbdd8046558a9163 legacy-trunk
+12599 f5f1b5e9814a48ea2eccb1c141975cbd04bbba3f legacy-trunk
+12600 3f7dc3de06170d498c16cb001b50756aeb612a45 legacy-trunk
+12601 9a3a46928dbfeb8fb2c39efcab2c2992bfe38983 legacy-trunk
+12602 9184862bd8d1e92dc23f7a6f0af6739bde20f734 legacy-trunk
+12603 6b28b5f197cfb0482d04e30815aca441f5b065ce legacy-trunk
+12604 c7dfd619350bc7f4a9c3789bc64a707f0b8aefd4 legacy-trunk
+12605 eff08bd8165d82aff2d733976544105ba4988a31 legacy-trunk
+12606 58e7cc5a3841300ca5ab126a0f4d4fff48483311 legacy-trunk
+12607 e6bba02ff624684bb076cf71d6f8a54e8918d6aa legacy-trunk
+12608 16aa73588d93b68f50203d21a8ad96875b07fd41 legacy-trunk
+12609 697e0c9d0940ec953c0348e8bd9ae8a099339cba legacy-trunk
+12610 52d57cc03f429e82e47ea25b77c08f8ea21e765f legacy-trunk
+12611 3d587e653f2d658d98e11617848c09091e7caf9a legacy-trunk
+12612 31c112594ab637ae8b4c2f9abbfad0fc6c9b8675 legacy-trunk
+12613 3f938587f2a3f02a09ee70cde03a6da5757d5335 legacy-trunk
+12614 abf4930647e2822b780f7d4c0658294f7c14e869 legacy-trunk
+12615 e9f5985b6ea464f81cad3b2493a15decf4306a55 legacy-trunk
+12616 508a639d8feb35af623d5353b33eaf640755d558 legacy-trunk
+12617 a99885af39f88c4ee8e511332e92c087f3773b2c legacy-trunk
+12618 49e7e21849b3cc51fdb65c5a41e8162b5793a365 legacy-trunk
+12619 3145def583e2ca14e399a9c724f406bb1ed9d099 legacy-trunk
+12620 a9fc7398ce7bbf7f667fdff2f03214ed8a2e195e legacy-trunk
+12621 a63c9c3e9ecc01d4f7536be22c3659ad9eb97874 legacy-trunk
+12622 5b15642e7bdf4a28d77778e84991bfc1fe9fdf68 legacy-trunk
+12623 b7d8125c2417d87dc3cb04cbd8bc73c5ca702aa8 legacy-trunk
+12624 cbb3b2c555d7a70a1696412c87910ba165d6c85c legacy-trunk
+12625 bc287c6cfa230f0566e04f673d4bb10c27bec550 legacy-trunk
+12626 fb966562db0e61e611eca266813e07a6cb7ca460 legacy-trunk
+12627 64728a51cb551e86b43ce614018bf30383f7d89c legacy-trunk
+12628 89f6556f059eb683c0f34d227a67df014ff80537 legacy-trunk
+12629 bafcd7b623275c753e2d5f955126956caa2b241e legacy-trunk
+12630 0dd4fafefd6c48a4c386c828d6edb66944c57e97 legacy-trunk
+12631 8b55c515683d927cac30b0bfc94a01593f0e6423 legacy-trunk
+12632 e569f9b0d969a11b6ec7d19e2f1e6f6534cae15f legacy-trunk
+12633 1ac2a8bb7dc10864c09a970a5330b13d3ecd4276 legacy-trunk
+12634 64e64ef08d1c91156ab07635f36627018dd4adab legacy-trunk
+12635 5718e83020ae95e53bbbd511b3a76dceaaf9ba93 legacy-trunk
+12636 139d5f1a6f899d7cb3f09d7a5fd75a68d479b5d1 legacy-trunk
+12637 0c07c0dbe3282c04b9d075e551dc4ad7eaf15e7a legacy-trunk
+12638 65731698c6edf4a76af6e146eb294c83ed782554 legacy-trunk
+12639 49cf1412445f320960c03f1a40457fcdb17a9ae0 legacy-trunk
+12640 b21915e6589e04f98fc137aba1cd5126c3694991 legacy-trunk
+12641 bc0347643ecfc6cab95b83515460711490060ace legacy-trunk
+12642 9232361294bb69245fe1c5cf883633144f618765 legacy-trunk
+12643 09902e130537344e3ceb21c1624612723632c349 legacy-trunk
+12644 5bdb72b1957e16e7ab8873dc0204824fe3bb5815 legacy-trunk
+12645 3c698b53be592116fb30d28766407046b8085ab2 legacy-trunk
+12646 abd3f066c87ac539f54bc2f90421d6ba62da98ff legacy-trunk
+12647 8284927025be6fd2b4ad79c532a56995dd59bd2e legacy-trunk
+12648 bd49f91d59b2d31a428945c8437e16f59d46cf67 legacy-trunk
+12649 3ac7f0066375fc861f349b1d0111e2df04264d81 legacy-trunk
+12650 e40bcf6bc1c8ba3606f418d03e267842d3713933 legacy-trunk
+12651 959e81b39b81122f6730a868fb25ea256ce45c2d legacy-trunk
+12652 9a6c3dc1dcd3f0e14ecea684347f8271bf4a8078 legacy-trunk
+12653 1d3fe7c88cc8c433d8e52aa58c2d432b05f266d5 legacy-trunk
+12654 62dc9ff9cd4c392ccded1759fb09b4a891292b20 legacy-trunk
+12655 9aa4390be38b7c0ac28ae1e43cba3263d31d349c legacy-trunk
+12656 d37f03124c54f823f4b2caf94ec5ea6324653951 legacy-trunk
+12657 8464e31376ed9bf1a30b87300d2b8aae72ff49d2 legacy-trunk
+12658 0f7d694bc334eff0f1cc00103115d4a2c59342b6 legacy-trunk
+12659 13239b48c469c1a8291c05f91c73b227cf5b67c3 legacy-trunk
+12660 625b7cebfde2b2d9d03f893229cb49041e907d73 legacy-trunk
+12661 3b7b6d5f193167dc984dab0bc3a27ddf3592cf14 legacy-trunk
+12662 3ba025ba7f09504b718e9a0d90abb1e4d07abac4 legacy-trunk
+12663 5c1ebf23f1d77b43de4173a5b39ec107ffb0a29c legacy-trunk
+12664 564f0363291625dccc4b356d7db5ab268b7352fb legacy-trunk
+12665 ddf861d84bbb92284b344e39dddc8cbc203a6a49 legacy-trunk
+12666 154c6408c3c2ddcd6cc4f414813b68dd2f1e8003 legacy-trunk
+12667 9c9cf4572a977ef6f7bdf59a798c4c186e0e5aca legacy-trunk
+12668 3f13ee592a40f83e2912e01dea7eed18f1b3f41d legacy-trunk
+12669 bd8c43daef85e2041ad99a1c2914b7b7def6a77d legacy-trunk
+12670 762cfe96faf9d71edb7aac7ba0d3f9cf7ab11b7a legacy-trunk
+12671 ba25b2d3d784d7d7e563c57c07d1e40f4f89d19e legacy-trunk
+12672 7cf97658cae7e36f396354306758a9604e721294 legacy-trunk
+12673 73e5e3f51b874fc9739b02ac2637a03b7556103e legacy-trunk
+12674 96550b5d09e14c2d68f5bb70157753a512204734 legacy-trunk
+12675 6a1cb6f37a52c5b70c43ecbe5bc303acef778e3b legacy-trunk
+12676 744db86e0311afdf66364d01389466b613c690cf legacy-trunk
+12677 49d776f3878d8dd50457ac657155dd3156f07423 legacy-trunk
+12678 a79dcd27bdc3a6b5f9fa908336410d94d1f52a6e legacy-trunk
+12679 35f91caeaa8da375473f84667aac39853140b062 legacy-trunk
+12680 f0a57ccf233cb356d97e35122928860251abcc56 legacy-trunk
+12681 04b88042a92b8fc2dc85b0aeedbdda8634a14116 legacy-trunk
+12682 005ba412a8ecb52a4069502c6ab9dce32c6b59b5 legacy-trunk
+12683 b8932ab41add4f201cf93b0be7f7d90670bdf59e legacy-trunk
+12684 5539aebf8938a86459d1ce65d18113d55c02c64b legacy-trunk
+12685 6dbcd5a6e5e618b751b1bad35d3df6a368b527d1 legacy-trunk
+12686 d86400500aa03731535ae37af8eb9517cfad9f4c legacy-trunk
+12687 b26e25158922ef7d232e7c0c1ad35fc4a29e232e legacy-trunk
+12688 62e61058480a39932fd24ba7c3db08f8aa677c07 legacy-trunk
+12689 ee1d32f7a055f0b8d1b5787863ce4022397b9af1 legacy-trunk
+12690 6633c3fca6263f36ea610bda7415a57f37925629 legacy-trunk
+12691 bd30d39797a409ebd3bdaa60ab0e2e58de3c45fe legacy-trunk
+12692 8f4ad14c34073cc8ec1475cd305f1fb81b184b18 legacy-trunk
+12693 b0f04b7c94071e72d8a961cd325168c04155d19a legacy-trunk
+12694 4af84cdcfdb53d209b46ac3437c33415ba733cfc legacy-trunk
+12695 67f1d6bd58cfba10933ed5485df69cb310bf9319 legacy-trunk
+12696 1d94248fe2b99a299e402c464ba625a2835945f2 legacy-trunk
+12697 a36986569af18d6841d961665fd7bc829414557c legacy-trunk
+12698 1e0dd2ef3971c2acb0d0757e14ae8e45acd5ce47 legacy-trunk
+12699 de7c0003578f8aa6e29fad70a78afafa22931830 legacy-trunk
+12700 b5f07a4a654bf071c15ccb83694f51f4c3fd62ad legacy-trunk
+12701 27902555f6721dd3a0211be2f46ca3bd85a60836 legacy-trunk
+12702 049c91343f9588af50419def5376fe5968a88b98 legacy-trunk
+12703 c0f69cbe805d17e6a943eda41dd3bc2e53a70b8e legacy-trunk
+12704 e1da290acc5f10edd039a7c9be583d03fade5a7d legacy-trunk
+12705 dfdff87248875df56a41a3dc2fdfc46b22001f61 legacy-trunk
+12706 bf41840c8150722aa0b8b8ab69ccf2bb3c6c1950 legacy-trunk
+12707 1c59a99e9970f069534495924ab4fe387f168a3e legacy-trunk
+12708 02b172a5d893d7a711ca8630a502ccdf89adac27 legacy-trunk
+12709 29d1d3b08ca7d4f596e314ab819d5d68aae67960 legacy-trunk
+12710 a86fe1f3cf4e65b37526c9a8aef9bd94e8881eee legacy-trunk
+12711 d282274fbb722fd855c791f71214f723619debbc legacy-trunk
+12712 b1d40fb10af6cbd9de585af68152740c5a908a1d legacy-trunk
+12713 32b43e5d88d3581da6021199685ac35d0de49a7f legacy-trunk
+12714 e3397ae8812921e856342469caa21f52a0e282f8 legacy-trunk
+12715 02e133eabac696df6a7bba0188c24dc46326af9c legacy-trunk
+12716 1fbc4bae28cf0587174b1d77d6d90bd61978026e legacy-trunk
+12717 d1686cf08d116c717e5f3683be6bc2fb98bd42e8 legacy-trunk
+12718 61edd3b85d6369d2cac747ddb29f14737db703c4 legacy-trunk
+12719 cd476442ef715b624e6991d14c93d5ed53009fbc legacy-trunk
+12720 477e98109c7d66151880fb2cc335b8719c435dd2 legacy-trunk
+12721 a29192f2d47afcf6433085779a39698aec6bfe46 legacy-trunk
+12722 0ef1071cb7feed9173577bef9596c09cb9b23002 legacy-trunk
+12723 feb415008765e43ee69124259ed8d93a6304dc04 legacy-trunk
+12724 b30077c57348542bd61e6d81f61dee4fc24b9772 legacy-trunk
+12725 553ed6ae9e7a85fa4f886e2cecdd9f5a7999163b legacy-trunk
+12726 df4a967a81462ebd2fc1fdb8a650194c40d5a98d legacy-trunk
+12727 7bbe71631c3f02883be36e61a885cd012ebe8d51 legacy-trunk
+12728 cd130c9558db38b6ee609c084dbf8d837b0ed447 legacy-trunk
+12729 ae61352975742fb90639023caacf9b2dd1880635 legacy-trunk
+12729 8fe7ec4b4fc1518fcac89e6bf674fbbce16150a9 legacy-trunk
+12731 ce57eb30968a5b892c8d177ca08e51f8a7ffebc5 legacy-trunk
+12732 0e147a5174a15219e15db6ec3750f6b018986db2 legacy-trunk
+12733 a65f87584354ae66a224f06e705e32cc2db31957 legacy-trunk
+12734 8cccfc6d62723674ab3fc48f363fda8fafe6421c legacy-trunk
+12735 249d9a2b5bc968df4929a1ff85fd5f336aeb66e4 legacy-trunk
+12736 92fce414f382308d4c6d412f50eafa276212114f legacy-trunk
+12737 5744a6db2d4f84195506250565fb7ed7c75d54e6 legacy-trunk
+12738 c5e8347eb809c28c552123c54e54633911421a7e legacy-trunk
+12739 f1ccbd6a94ce333d2c4f13f476841cb8e166cce8 legacy-trunk
+12740 86642b7a7a60f5848805c564812bc1e99575570e legacy-trunk
+12741 c1befdbd64e57229e50c565595685e96970e25af legacy-trunk
+12742 359244fa6b52ab0ebbaf9cf03176650e8b0bea60 legacy-trunk
+12743 f138ba72bf2d9f2e3e8e180e395c2f7fca72ef7a legacy-trunk
+12744 b6b93006d07684006733303fb4f0813ac2876d09 legacy-trunk
+12745 575c4ea2542bc0e2f44b63aac0ad12f8b2950fe7 legacy-trunk
+12747 32c4204742bafd6d3c6229aca1cc36edb24918cc legacy-trunk
+12748 bdbfe0ec970f892d6bb820a530c5c5c9271bc92c legacy-trunk
+12749 c5f11c5bf5b220061481ac2aee490f4372c302d9 legacy-trunk
+12750 1a2a0a3e9ddb2e122fcfb19f147887c598312036 legacy-trunk
+12751 895d861a08701fcdc8bbe2a9b544c71c8f4c0caf legacy-trunk
+12752 e59ca5d346f4df2c8446c3c2a0215c3b87150abb legacy-trunk
+12753 47c11e8276999f0078c071de2b98383c7702f956 legacy-trunk
+12754 d83935d14084567f8ea49d648d83567b0e6dc3f1 legacy-trunk
+12755 c27c10c6b9f2827401d8d03aec8141b4f787bbea legacy-trunk
+12756 13b45c74e97b530662261b2da37e9ab5d32b59e2 legacy-trunk
+12757 8feb2950da7b263238fa2b40fb464d9c4e07cc86 legacy-trunk
+12758 0614e7f16741f2a1588e24d4e290c40a0e67b3e9 legacy-trunk
+12759 a4913bae9f93e7f4100009825658e627d233bbcd legacy-trunk
+12760 0cb8e5ea84a8daac0e95d444697ca96a902a6fe6 legacy-trunk
+12761 163fd3d95c17e4048224a1c89211ef871a410d5c legacy-trunk
+12762 0a5cdd7e5fc3f850a6bdc19ed2d5c4346e6c88d8 legacy-trunk
+12763 26a02060bab17416cf824c75f5dd5aaf9f335541 legacy-trunk
+12764 b64f33594a3110698f0ebdc7cc54bc5ccf1c77d0 legacy-trunk
+12765 e83f676d15c289ceb6d7c903b55cf0ab421da0f8 legacy-trunk
+12766 29701e2904ac5497099fd043d031605fd3f13d12 legacy-trunk
+12767 b9bb75ded804aca57be963af2dcdd4856ac92f53 legacy-trunk
+12768 48700f99c6a6d31d522d1c74d3a10f3522e33fdf legacy-trunk
+12769 2f425a57d9afe71ef44edef9e9103083a8b0a983 legacy-trunk
+12770 abac7f62757c83118f5f3fdcb5e8079bd0ec6a89 legacy-trunk
+12771 35df4dc2d30d54362d5a29178aac8815fde5bb13 legacy-trunk
+12772 0e355dfd6f7d15cc32df2728064f1aa66c423aa3 legacy-trunk
+12773 64bca3bcaa374f17650a14222d68d127929427af legacy-trunk
+12774 65a253971ecce86653e5030080cbfde55778af9a legacy-trunk
+12775 a2a7681b25f1f59bececa585e0fbe1a393e287d8 legacy-trunk
+12776 08eadc650ef095c7a5ed6fbae3fe85db9b0394c6 legacy-trunk
+12777 19d6121fe4f343c463bd4cc38ad1c4f67205a9ab legacy-trunk
+12778 632bd3a5ddef5bdd05c193af55938bb718ac23bb legacy-trunk
+12779 ba5c629081225a2a93eec6b799bdcd263782eae8 legacy-trunk
+12780 86035ae5306c117af7dfdd295366e53d8b203972 legacy-trunk
+12781 46ac11b78e9278056aa96e796dae7fd82eb8c307 legacy-trunk
+12782 886ea255f381ff0c6db70e2791222b2eb72188c2 legacy-trunk
+12783 cc9fd50630a699cb03c2af0b324f0b74832191ff legacy-trunk
+12784 cef2a1345695d18f82130d61d562636cc81d3d6e legacy-trunk
+12785 01dafc571a3032851868c1505d7ffbb81c811287 legacy-trunk
+12786 d3bece46486e29d7a2c5a62f9fbc1c511f39dd3b legacy-trunk
+12787 06da3ba3aade2e47ef72bc8e652a8ba04c2b3e3c legacy-trunk
+12788 cd4c4510adbd47e985319df1c070cf1c548c4690 legacy-trunk
+12789 3b81a7d418cbee884763026875ce99ebb38784cd legacy-trunk
+12790 3e3c09e145031d4039b88c9aefdb77b0c872b610 legacy-trunk
+12791 5c0c061de2aeba6f8ed4eced61357ff407dfc1bb legacy-trunk
+12792 1e766de714debb0d37182e581681883af601a372 legacy-trunk
+12793 5cc7122671aeafa8e31037674d23d2961998e269 legacy-trunk
+12794 9be2726c9b254cd8ada6a1e7ea1c165fac0e9e59 legacy-trunk
+12795 1c6b10dea9f05f85647e0acadb93016d31305841 legacy-trunk
+12796 26db1e96caf39469fe98a78e6c6569f7aabe591b legacy-trunk
+12797 b78135b10a8e1e6bf30c954770c885b497adc4d9 legacy-trunk
+12798 24def6c25b0a050aee1fbed0e337f7725803db33 legacy-trunk
+12799 50036d06e94aa840dff546bb49d5d19a8fb2cb96 legacy-trunk
+12800 32411af8c012976036b31a09a06869a40951cc3a legacy-trunk
+12801 cc0c906c2415668d3152c3de63654126f26efe22 legacy-trunk
+12802 a95c7d2a83f7d0151a041d8581711cb7bd794def legacy-trunk
+12803 fd09b3fd1edc4da4f98d377176e1b7744d8052d7 legacy-trunk
+12804 5e8989c2f85dfdfaef99725dcceffb6cb72bc699 legacy-trunk
+12805 88a7d859900e3a1377e832e043fe992a1621b1c6 legacy-trunk
+12806 f1f6364addbdedc1994def01cb591d5afd51f208 legacy-trunk
+12807 b648f9e8b3eda29fa125c5a7bbf2f5689375586c legacy-trunk
+12808 5dbcddbded00b2d8e800a784b6d1f238bdd43179 legacy-trunk
+12809 42c9a8d108344f175827a571c53ff032f6d35f02 legacy-trunk
+12810 e7c09a62bf1f1a6226af4c84efb0da23cc54f2a8 legacy-trunk
+12811 e3089396139827f723372974d6716a4a2250bfe3 legacy-trunk
+12812 db32deb13c9f06e09fc71aece86ea7f7e7fb2941 legacy-trunk
+12813 a4d99607344f078b86b46c1fb9b759898d2ae0b5 legacy-trunk
+12814 cdae6c1145f4c3b8e720f0cda8fd16dbe5407c0c legacy-trunk
+12815 1e57aee505654eeec5a79512c25e75f5968033eb legacy-trunk
+12816 fa18b0fc0c181e43e99af6b7e2e071a08a1ae2f8 legacy-trunk
+12817 90c752ae44a6b91f94883051be5224ca81c898dd legacy-trunk
+12818 44a375e31ae2fe7d80cdcd83338eb9b2d9edd6ba legacy-trunk
+12819 446b0967f7d969cf0600f133c99323b8e1e47b05 legacy-trunk
+12820 39bd7b8478db35cde82db1a667a5e9df4c1c45a1 legacy-trunk
+12821 4dd768ae895e64cc810ee5165dfcd93d6b525147 legacy-trunk
+12822 9002f4b47000a3fc7c3184e66a42c2c3f2ae44ea legacy-trunk
+12823 e935d8947e3396e8d07a0733596aa7af4952a6e0 legacy-trunk
+12824 bd07674c3c8b074ef848a90ede3d9983ce364a4a legacy-trunk
+12825 a87cfea30b04d80a3764bdcede3f875252b74237 legacy-trunk
+12826 fed66bddce6381eb348db379c249ca6555e22545 legacy-trunk
+12827 0d0e2239dfd8c06858b48e3fc1d44cae77941293 legacy-trunk
+12828 4a3e639384694111e91d5e25bc2919f7bda88bf0 legacy-trunk
+12829 4c4f362fa0a6ad852047e508324302e78694cc94 legacy-trunk
+12830 66a7d61cfd84a3dda9d251cb01f2c0ad2ab62ada legacy-trunk
+12831 f438c6e2b6c18e57cd924d6644fb929a9933b860 legacy-trunk
+12832 207b40ec9a7e3914bfacc2d1a6dfb3fb018a737c legacy-trunk
+12833 be05609478bef043955b4334d2e9ec2b9c87c558 legacy-trunk
+12834 abd42029fa0101d543fe6115bd706f3f0b2ad9b2 legacy-trunk
+12835 fff82d2fb369efd2ec09a6be0f69dd9dc6d8fdca legacy-trunk
+12836 b6edec1efe6427851ba190894c0ff882623745cc legacy-trunk
+12837 61224459bb09361b11f340b49f3b289e10153f3c legacy-trunk
+12838 093fc298afd6b0e02e411a645d1c1eca87bb976c legacy-trunk
+12839 ddbf1acb71702dd51934edfbf552b6d358d2cbb5 legacy-trunk
+12840 a8dc59b66f4966cac83fca05b9a1199a373c59e7 legacy-trunk
+12841 5c70ecdedefc33649a7c55b3e2eff0951e73afd8 legacy-trunk
+12842 6ee0eceb775f2d22e901c0caa8f547cf0e8827ad legacy-trunk
+12843 65aed529ad8adaf346d16d3d9a77cdee120e6419 legacy-trunk
+12844 08d3194a3c3fc8d652832107edd6e643bfe45edd legacy-trunk
+12845 8d092a672d09bb18d85f501299017851fa6c7fcb legacy-trunk
+12846 b9a80bbbe4a5a685b385c2e1ee013ee9ef77fd14 legacy-trunk
+12847 6db35ee90bfac03e5c0fce360a1d0cf8a6a6f953 legacy-trunk
+12848 d739e1eb61751c1995a267cd2d766cb0a9d2d7a0 legacy-trunk
+12849 4e2d18973b94a0377f25b2a8de6dd4f017e17730 legacy-trunk
+12850 1d857b59758237876262235b1687dbfbca9daa45 legacy-trunk
+12851 892dba7f40deefeeebe8ba75ec4781d296a57645 legacy-trunk
+12852 7a39c873dc8180c974f1e04a3c76ffcc95bbfc3c legacy-trunk
+12853 67ff9e7dc8aff4a00e5dae3b5d2a4dc991d95da8 legacy-trunk
+12854 a797f0c6c2e1dd139c1495736cc23a3bd9ad9fb1 legacy-trunk
+12855 e6d34cc0c79c962c39fe63adefd83766c2f6bf47 legacy-trunk
+12856 6b5790ce2536dc6e46127e1e2107ea9580566812 legacy-trunk
+12857 50d3099d50c21d3c786e0f9681f52fbc3f31c3d4 legacy-trunk
+12858 407022cf1931c158740e9ea3de57ca79d75e22fe legacy-trunk
+12859 8923ad7e13f2b0159ede1ab036cca937fadf69b3 legacy-trunk
+12860 e98e1ea51f1626d5e6f4d5896e16c3db1322566a legacy-trunk
+12861 da0c1330e66ef2cd0fc05930ec95c5b211cf015f legacy-trunk
+12862 70a3fb1ce23b41cb8260e092921a932d816d8735 legacy-trunk
+12863 ea0bbc3bf1dfa618b4caa19e3007a669f4f04f7b legacy-trunk
+12864 50e4dddb828b20712e5949298849599db95ac2cb legacy-trunk
+12865 1409e7687a9a03b278dfa4b975b5810d9f2a7f0f legacy-trunk
+12866 4daab7a9f566ad42155246926f9587dd4cb44aeb legacy-trunk
+12867 d5164c66acc963bbbff202062eafedce90dc5a8a legacy-trunk
+12868 25d7d4d7399f10caaaff90831eacef279b110597 legacy-trunk
+12869 65e7212df1bcf1cc17a4c96d9a284a8732862ddc legacy-trunk
+12870 c5f49d4e29c503983e1258c16bea4ec2dac5b8de legacy-trunk
+12871 795d51ad228a240dd466473eb6a28dd13a3eadc2 legacy-trunk
+12872 132f94642c74d28724353df3b0ee692ca0cbc838 legacy-trunk
+12873 95b9225a52e45bb256dbae15f51141f68228a888 legacy-trunk
+12874 96913907ae68d9469c512d3f84906cd8004734da legacy-trunk
+12875 fb7fa476211f35d159c2114c14a4b79b629aa9e9 legacy-trunk
+12876 07ee795774d89b41beb3bd57fff7d894ec2dea53 legacy-trunk
+12877 48141da518dfa7cac29d7a6ea714015425b8b8eb legacy-trunk
+12878 417aa425013ad73ea3802f5f036eb3cf99aab332 legacy-trunk
+12879 337733ce9593fb1ea05d6976a79a49e026900649 legacy-trunk
+12880 4cbb2122c7358f48522a41123f9b1e635e3af2e6 legacy-trunk
+12881 d98085de97d1fe88a5ca8d21849868d66008f95b legacy-trunk
+12882 9e9695e314c9607036226f9562b6e362e38e5382 legacy-trunk
+12883 69898acb23f281bd69ca2ef74df95c48deb43869 legacy-trunk
+12884 fb51aa824df2d47217d467f1c4b4a3291e4ab5b1 legacy-trunk
+12885 e2a08a81e56f4ee285695e21a9883348706aabe5 legacy-trunk
+12886 70dd91c215134fae4edfce1856e747e7d1bd9229 legacy-trunk
+12887 d3dc62004776df02f43070d9e5fe11c882e68ada legacy-trunk
+12888 e93352286aac6d19e83d5607df50f1d8611922a5 legacy-trunk
+12889 c589021c47c9337eef4725021666777e2f5fa90f legacy-trunk
+12890 9c5d9bdf7e423419bdfbbdc98497305b04d5823e legacy-trunk
+12891 f4e605bd8f1b76b662f76e0039e13df7fa98a47f legacy-trunk
+12892 0173a5f47206dbe41fa293fb86aac45dc32a2ff5 legacy-trunk
+12893 fb81659489a166564a1ebac8a8d4bbf1c18d80a6 legacy-trunk
+12894 7b810aa35b5ce86db18002ad8509a1e17b820e44 legacy-trunk
+12895 f54bac5af98ca0147d85dafc417c7861084280b2 legacy-trunk
+12896 749e1b3d8173a3093c370b9212ee100d5cc153ca legacy-trunk
+12897 52206532d3891a0933a2ac9f9d33460d8687256c legacy-trunk
+12898 f343329500be79b127d63682d967667e26baa297 legacy-trunk
+12899 c066fd8433ba84ec053d3eba4b7c07b85fdbd2f7 legacy-trunk
+12900 dc9b0d418c009bb8d68a4ca63abd11b55056294b legacy-trunk
+12901 7f147c4e4219b16d6e34da3342866a82348b831e legacy-trunk
+12902 2a4c176de6cdd3c8891766d31098c18169a63df5 legacy-trunk
+12903 94ad90fd27126fe5bf6888995e26913626bee9a6 legacy-trunk
+12904 f81db738abd92c26b0d4130fa71a43b4d11998ea legacy-trunk
+12905 9d4efce11f09b15986a11084ab2a29e309b5bbd5 legacy-trunk
+12906 9c6da30ae675dca5c69ded705686daf88f1abc29 legacy-trunk
+12907 80d2b9afd19cc5540f162ac19d0a837892c747b7 legacy-trunk
+12908 2c039c0104377e945fee23c806cc2aebc0d9c36e legacy-trunk
+12909 159f1c3afe284e9ec9ae504de734abe60ce161f8 legacy-trunk
+12910 ccef5c0e8ddc68ce51971acd96e3ae26b6e81393 legacy-trunk
+12911 a1544fc49a763455a3e07cef5c9378b6e0a88bdc legacy-trunk
+12912 050832d838ca5ef86f7a71a66ae1f4b72aec5284 legacy-trunk
+12913 97823184266a0190200eb39cca90d186b0d69fb5 legacy-trunk
+12914 9952f16bbe8ce3e972f005e212a4cace146a567f legacy-trunk
+12915 e9e69b02d0f0d10ff3aef863fd70fc5f9bbc56b0 legacy-trunk
+12916 4363fb2d434503f751a8568c548184581659bf77 legacy-trunk
+12917 a630e54e97f293bbb681f8943b8e1d83d32e89ab legacy-trunk
+12918 48fbc55c055341880f9513f29ad2b83cf5ae9ca3 legacy-trunk
+12919 52438c87fedcc226a67aa528769cfd453ab0a0e6 legacy-trunk
+12920 dc502ce7575a207210169406fac150298e523a20 legacy-trunk
+12921 b8e4de1c35cdad9096da056e60c43e1136526b83 legacy-trunk
+12922 cabab1f5596e28528b2b2e9d8ba64abb72e7d72d legacy-trunk
+12923 6d58270dbcd43d448b1a8d831742aebd090804d9 legacy-trunk
+12924 0d6bd391acd8370975e7491fb4d582719d79fb5f legacy-trunk
+12925 b3646939826269e3eea89f717eed8b7159dc37b4 legacy-trunk
+12926 9a4baf0c57ea19419edd799fab00338cb4afd852 legacy-trunk
+12927 5ccd3b86b1a637fd302cb7ce0b394521eb05cde0 legacy-trunk
+12928 4e8defec09f8504075c9f0600314ead73a7f3436 legacy-trunk
+12929 c176968bc91c109328c4d931810ec6ec1ff4c6bf legacy-trunk
+12930 e6799a855af78c547d4e8c2d8e9391d1b2471d97 legacy-trunk
+12931 3571b4c1bc0e3d37cddf7915ef5cbc3c8c7ed097 legacy-trunk
+12932 f9ad148c980cce0bf72fd9e5490d55f54f892160 legacy-trunk
+12933 d592fe5e09d574d0df357d565a7ea4d97a2a97e5 legacy-trunk
+12934 0789e0b55587bb2181f3ecd6fe0cbe65bf083b60 legacy-trunk
+12935 1cc5d20d2ed8429681d5b96447b1095aa5ddcd9c legacy-trunk
+12936 2ab0ec847184767c3830c7f2314ec95e95d36a0b legacy-trunk
+12937 a4768315948dc3107cd0fa8c1dfa104b4a470361 legacy-trunk
+12938 324450ea54502b8936222079116a0b97beaecdb0 legacy-trunk
+12939 7d3a60f4e0b47346eea01aae066567260131b4c9 legacy-trunk
+12940 3bc8f53041c015bdaf4815862cdc6c563d4a8863 legacy-trunk
+12941 ee6fa9b868854ac13074b1b160a6beef71fe2fe7 legacy-trunk
+12942 9ce1474abddd7c369d84d26b10dd432e06ca1c6b legacy-trunk
+12943 b94144de2f32b53e2fd51825bda92001389da6d2 legacy-trunk
+12944 9ba5dffccb1bdb436362718e2bbc28ef21b0a348 legacy-trunk
+12945 9184c9e108f97bb66ce1233f9738f92dc2b1fa2b legacy-trunk
+12946 f3a4c4f40446785e85668477ed384f4aa1b9109a legacy-trunk
+12947 2a149e94ef4ac145d5d21e6521acd7717f04a063 legacy-trunk
+12948 00c37cb75c28549d0497eb6f4be8db35e5d0c726 legacy-trunk
+12949 bf26b7c1e6dec19ca7ca99102dbed60973fb06c2 legacy-trunk
+12950 d3762933bff889a90836dd55306d6cbfe2040535 legacy-trunk
+12951 97a06ec7c6f49b723ba5421f434b4df5da00a7da legacy-trunk
+12952 7fef60f8bc4555e63b57296f0d1e08cb06bd7f50 legacy-trunk
+12953 5cfbd489a5d34d09d9e1f97cc574f56a07195979 legacy-trunk
+12954 2b1dfc13951dfb630aa66f6fd3c2a2567b11354a legacy-trunk
+12955 c9e10ed26d9ab10005eb06dc9cfc05d558c5198c legacy-trunk
+12956 5b54fa775e550ecd8eb22f2bbf8dd39561bc811b legacy-trunk
+12957 dad14ffe1c22a06b05f596f0131b00ff54e7d99a legacy-trunk
+12958 11178c8d6be2a6c293a9bc4560ede41b275b76a9 legacy-trunk
+12959 3f213a8fc04e06fdfeaa1b8725bfb8e20e89cbf4 legacy-trunk
+12960 82adc54dd377c4644f34b0df9598f0f8f872357b legacy-trunk
+12961 70910e3125a2763142fb08a89681ded7b2e84efd legacy-trunk
+12962 4c1bbedad14be63cd0f4853d454e1935d9506a84 legacy-trunk
+12963 62781914fadb893cd6ae3fca1bf7b63ee355e72d legacy-trunk
+12964 4abc5abaec9ab880f5124a19ef27e83d802ade59 legacy-trunk
+12965 a6464eb987e8ceaf39fc1c8e35000c7106678ce6 legacy-trunk
+12966 53c1faec1d4666a50643520b91617c457969c73e legacy-trunk
+12967 f74ef1971bd1268084e5627d23d0ef87cbe08bcf legacy-trunk
+12968 5868846201ede20139f0267617b0d1bbf25a09ba legacy-trunk
+12969 36ba4dbff686e853ab0c4d062e6900d1f6a351c8 legacy-trunk
+12970 255abab3c57430508be31f3f52b39562358f3109 legacy-trunk
+12971 9cd4fd926df64499b3a04a772bc80803ded35ebc legacy-trunk
+12972 601b4f2d5fc85243a0bb06b728ff9482c1b8ef5d legacy-trunk
+12973 022b178fd0ed577805e4f1df4104ef26efa4a539 legacy-trunk
+12974 ac3a465e50a67be91a7e33ca61030dd197f85b55 legacy-trunk
+12975 4ee900005ed88e67ad8baa5270b70516439bc2a3 legacy-trunk
+12976 63c463a852936ef400aab2132ad35f4dadfaeab8 legacy-trunk
+12977 f850ef3da43af44dde447739ea07ee0176fd9540 legacy-trunk
+12978 c82a85ba1ddef8e8285be0a4cde1811cdeef89da legacy-trunk
+12979 57704f0ad9b05c0740147262446fde6dd4f06808 legacy-trunk
+12980 4b19461780b99a0c596478ee914f6e158f7b0b9a legacy-trunk
+12981 01250b832374ab2c56ffab88b66dfdf297ea91d3 legacy-trunk
+12982 ee610949f902264eac1030f213bc32a44ecb4ddf legacy-trunk
+12983 c2554bf617c3256596bf5192f2e6d1e63a39ccd1 legacy-trunk
+12985 bae650f57c4150bb0c4816ea872934221c539aa2 legacy-trunk
+12986 75683fd39e91ea4cdfe3bcf48685f745a4409fb8 legacy-trunk
+12987 7474ad7e0a449ab91502295bcae8d5ad4a697916 legacy-trunk
+12988 500f8ec9ded18d6dd4985cdccd84c468d99dc873 legacy-trunk
+12989 8d115e111a1740e93e2568c94e67e243cffe1f0b legacy-trunk
+12990 30c94cd49a688a6608bce28cb211606acda1cf61 legacy-trunk
+12991 05e97f6a3638b350ec395e01eb1a49951044fc29 legacy-trunk
+12992 ecdfcea1243856c627d6500efc027ff0e80109d8 legacy-trunk
+12993 8749e88ab40660cc118f792c249a45a579c85089 legacy-trunk
+12994 390e4c103be2688e0a0ca7aed5ee631d4cc76b65 legacy-trunk
+12995 b2357924a9a926cdcf39b53d932047fc0238bfc1 legacy-trunk
+12996 43052d5b9808349261a7896315530455ed31aab9 legacy-trunk
+12997 f5d7c4945d5f5b4dc92b10a9e811822b0528e93e legacy-trunk
+12998 e64c8b84e24b795fb00e97fd30a41d7faa24518a legacy-trunk
+12999 246b13410a317e4d0acb42544c0b28b685bc20e7 legacy-trunk
+13000 ba1a27d73cdb0a33fabc3768dff9cb3919ce12cb legacy-trunk
+13001 8d40e6ba4c9e21416a28be38d799e2d2814098d8 legacy-trunk
+13002 fe8645e4931480c5b7e77f82c5582cc5c3879d26 legacy-trunk
+13003 993908286ac7165cada1dda10a12d7717941db56 legacy-trunk
+13004 c0f147f4f100db99b999d4537d7ed8f8e7ddbbd6 legacy-trunk
+13005 e08da34c4582feda1ed3e7a77e7a3434bbd766bf legacy-trunk
+13006 fe881f446c5d28fea97efa18625c2631268d5de1 legacy-trunk
+13007 5393ce5207c7065160cddcd0dd14998eaa8d22f8 legacy-trunk
+13008 48cddd0cc733078220a2064bdecf1fb0f3a0d9b0 legacy-trunk
+13009 20feba96743717b5d4555eb63cf47af5eb7cd9bb legacy-trunk
+13010 45e9975cb0939485760290d2e2cd5b9c52a38bc0 legacy-trunk
+13011 753f3f95c50f15c8d2ac594b323f043765448c07 legacy-trunk
+13012 d79989a435d92e31b722ba706eed08e3ff45ea4d legacy-trunk
+13013 65b3cfe6e66692797105cb7a666c80e5d71f795c legacy-trunk
+13014 c3edc14c3880a394de311ac971476bd549f89493 legacy-trunk
+13015 2199f70b0eda72c89c0c086427d4b771839626b0 legacy-trunk
+13016 ca44ff7482c775d16b776d2c920c6f1565c7ca55 legacy-trunk
+13017 81f4a77e7337301b366520d8c97cf6cbd3451b12 legacy-trunk
+13018 96beaead874f76a0792db3ea4a5c0433cd96d8f7 legacy-trunk
+13019 56105449771a68433b9fa6fd73f91a2e8bb060a6 legacy-trunk
+13020 d384868ad4622ebb90c8681a2f125f39374c8c2a legacy-trunk
+13021 e3f59a06472e3a56433997cc659360c74d99ac6f legacy-trunk
+13022 9aa65d48dd051775da126b36468589b15ff98dac legacy-trunk
+13023 b19f2a9820305f9254473beb75d503b93c2dc284 legacy-trunk
+13024 7ee1e31341473f51c24de01e83eb1b5af6b1e8b5 legacy-trunk
+13025 f005ac735863413adaefa5ab01b5958b43e3c6b7 legacy-trunk
+13026 b5dea4c79d24e0a0b560bf64a87a23e607200867 legacy-trunk
+13027 474c5b82d7de99f7ee042a0c6dfbf1a03f2e7eab legacy-trunk
+13028 878a54a06117b39b994b9e83daf318734e19ac49 legacy-trunk
+13029 61bec1e5fa593a97567934251b6ac3be4774e200 legacy-trunk
+13030 4157f3862a09df171746b1bdb7ae703bb4e383c2 legacy-trunk
+13031 3eefe6b08662f4529a32f1bef20d464ae7a64cdf legacy-trunk
+13032 d4ce9f1f62666e4d88d8b2acc5dc47d8c7bdfd45 legacy-trunk
+13033 540c8173e4fdbfecba246547c7b81af95390610d legacy-trunk
+13034 d834ecdf8c26e0df923187f20ba47aca6ef2e220 legacy-trunk
+13035 9ec9abfec794ec141d7cd69c0e5d06d2135e554a legacy-trunk
+13036 c04f03e82a7543820807733a6ff7edfd50d2037d legacy-trunk
+13037 32ba09c86917bb70f5a4868b64bd65eba5ede364 legacy-trunk
+13038 a4a268b725b2a46236f80e7fcc1b3fb661b9ce6b legacy-trunk
+13039 b62724b09302e749cc593f38518e2880cff6f9aa legacy-trunk
+13040 934719c25af82edef158eb7e2fcbd1f7dfd7e2b9 legacy-trunk
+13041 3fe95c2b37134ea696e0fe2e6227834a07067d11 legacy-trunk
+13042 ccee3c28b7eff1bf5e1d1071ced74f74b90b2a98 legacy-trunk
+13043 5f454b706156ea31c88c9fae70fc6e018c5e54ec legacy-trunk
+13044 0beb7d36c1a9769472611208f3644a8707123dfe legacy-trunk
+13045 f28e6a3b9134e183ef1f18cf3c0e4f0ea01b4bef legacy-trunk
+13046 edc7b28d90521136b53dd474379a53289f5671aa legacy-trunk
+13047 5e9ea3eab77c81025307715d51532ebefef3a2dd legacy-trunk
+13048 3400aa1b0073fc78c36286d6e23e45703e7292bc legacy-trunk
+13049 c0a69ecf9646f61a60ed1f68b3f352c3a050458d legacy-trunk
+13050 e68d537eb50feab7705fa21a4475e8c6bcf2da5e legacy-trunk
+13051 5980bb001f864ec0066e4f3ff087f59d00b0d401 legacy-trunk
+13052 8c1cfe965d9b2dc31f1053f408ad8312f4bcc832 legacy-trunk
+13053 ae61b70efdb3a948bfa81c9597d02f1261bedcc6 legacy-trunk
+13054 c69bfe0ecbd8706a35c77ddeaab7c936b4a35f6f legacy-trunk
+13055 aff07e049aeefa2be43208ad0d26d73c48b33ad0 legacy-trunk
+13055 39fb0dcc83dc375c1565ba65dbce0ed59b1359c9 legacy-trunk
+13057 a837a6aed83e6de2f34770eb44b25d0ff8f2d0e3 legacy-trunk
+13058 05cfa28e65f62453722249cb84d98b4ba4748aff legacy-trunk
+13059 243cc6d9c5b8fbe0eda17f15679c3a724df15cac legacy-trunk
+13060 e3e5d7636958679c4136a97e889657102fc5e98d legacy-trunk
+13061 286b2ce6524886493d503eeed5132dfe2d8e7987 legacy-trunk
+13062 8d2a8a49d983921218ba4a04154a832a5c1057d6 legacy-trunk
+13063 afaa3aa835f983379a77893591b9b3cab1f42c14 legacy-trunk
+13064 970d61bb6acf9383b356be4f1f5f0ac349caeb60 legacy-trunk
+13065 3be0525bf47f1ac4368e9642dd85bb75b75ffd25 legacy-trunk
+13066 a42824cf0b181e286b253d5c0772ce5befd391e0 legacy-trunk
+13067 f6fc67d705dead2bd41e087533625d275600c7e8 legacy-trunk
+13068 04afc1ac1a0fd9fc8b3e98d9bb9a4d14e97172d0 legacy-trunk
+13069 104a441b2bc8cd91d5290027287e949af8040102 legacy-trunk
+13070 7bf3f412e137861bfc691927b2a87d2dace5f942 legacy-trunk
+13071 da15ed314e242814763fa49a3294db6378f088d2 legacy-trunk
+13072 bff3382c6d2f51ef88b1675b999a3ba3a5d3935d legacy-trunk
+13073 f58046339cbf35d9b5f088c26dbf69687bc0ae2e legacy-trunk
+13074 4e0cc6e02a0de9cc566f1f1d62bce52e7758a506 legacy-trunk
+13075 4aff391751371da5f954854a9e7d22eb3e8e1bbf legacy-trunk
+13076 10bd2fb2a0d67d9d3fedcbd10ca38d007b94c229 legacy-trunk
+13077 af1e819c044569bfaadd1b210ead38248bacd8be legacy-trunk
+13078 f96b272981bca64ad2ccdb70d51f599b921648f0 legacy-trunk
+13079 56172e0efb752ec653748f26b114dd053e299d30 legacy-trunk
+13080 6e7f14af89b71fe24ad581ddb2a6a29b9efdd856 legacy-trunk
+13081 885be60104d4235508300bb4cb830c4f2c3a3e47 legacy-trunk
+13082 6342ce4ff94654f03984fbdafa5a9f664a20a32c legacy-trunk
+13083 1ed1eb5bc6ec0ae8042c34f655dc4c6d14fe81c7 legacy-trunk
+13084 439fc85324cdd2237406e99586414f33cd6e1dcb legacy-trunk
+13085 bbb5af78a25928908b8ff70f7dfbb0cf6d12b662 legacy-trunk
+13086 f7b8f886b51a78c40ae32b90632b0aeaa7f6bc4a legacy-trunk
+13088 44da03651bd02ad64b2ff1d02c8655809775e8d8 legacy-trunk
+13089 e41110ff8c2fa07b136f40ec5dba4171487f1eec legacy-trunk
+13090 700daa75847a5d4b428600a033459a8912360dc4 legacy-trunk
+13091 8da46d6b8af3b2418652a4b824cb325452a5df6f legacy-trunk
+13092 040b52868fe8ce226815946afc0a941277d0eed0 legacy-trunk
+13093 251baa032af0c3cb2a9005d33a2c942bf33c4149 legacy-trunk
+13094 ce861b43ef5356f094afb73a3f1c78bd674fbc65 legacy-trunk
+13095 0965aa2df5cad8c8c80f249900cab4d1296bdcae legacy-trunk
+13096 83d38c4ad1defb08e15f61ceffb0d9c7e3d347a3 legacy-trunk
+13096 61c91c7f101bab3149adfcd5646ae40e048de712 legacy-trunk
+13098 c31b880ae84f9d22b03546eb9eb491e8e70745f6 legacy-trunk
+13099 29abb7d96c259518c12db793e5ee141e305c470c legacy-trunk
+13100 4e269414eee530a67d14386585b868939dd6ec29 legacy-trunk
+13101 63c7a8ac4e4cf9cd308fce2ba415af256ae159d7 legacy-trunk
+13102 566bd87e0032e692bdf7f883fde256f6dbb003e9 legacy-trunk
+13103 c8759ba83552a56b9f61c3001e6889f71938e5ba legacy-trunk
+13104 876d7e792252c5e05222d344efafcfcd44ab2909 legacy-trunk
+13105 dcdbb100060f2a9f8b0fafe9ba6bb590904f8af5 legacy-trunk
+13106 90bdf8fa78a9b8eb7a80ebd28e03006b8e76cfd4 legacy-trunk
+13107 2ab967f84895b0dd82fcf262a32bc6899ed0dd67 legacy-trunk
+13108 28c44372de3841e2a1c13f372610d14fc59dc4a2 legacy-trunk
+13109 3de044e650a1b63bef33356843af514577b1df1f legacy-trunk
+13110 02701b99f9babb968adc58fe3fd8717388b1fe12 legacy-trunk
+13111 fe5fcb7e73f79bd55102310773ffe3ee687e6738 legacy-trunk
+13112 fcaac41f6f3a033fb4bbe9e68684e1b4c13d52cf legacy-trunk
+13113 b4889f106c3b1806dcf77d3e7836a3ba29fd4b3a legacy-trunk
+13114 2419a6c9f6281063f8fbd7af8d1201bafb1af2be legacy-trunk
+13115 3f1e72c71b3a5cbd6f61ed3e6b7a081fb76e96c2 legacy-trunk
+13116 6f8cdc7e225c9177f69453b8f04806e63ae9160c legacy-trunk
+13117 f425e60ac71a46d82c29810c7c273ddc9bbd372f legacy-trunk
+13118 f614f5cf2dec9e3dc84f7ed761fa642ba31420c8 legacy-trunk
+13119 a077e5da5fa5730a0a86a53d2958a8f7edacdfe3 legacy-trunk
+13120 568e94727a0cc8d9fbbe8cf3ac77873c9705a028 legacy-trunk
+13121 a6b9d45003175289080c30c414bd77255f9192eb legacy-trunk
+13122 012d361fdf23a8a347c3018f28f3b537add5580e legacy-trunk
+13123 f7e9bc8da13d21633eaa42f214a78ccdcce3e184 legacy-trunk
+13124 fa4685fd5adff13448bce4daa5d1539ff96bf3b7 legacy-trunk
+13125 891d089aba412ba6095dae9a0ec8e506daea1fc9 legacy-trunk
+13126 5b170f0da9febd9922c3d45eee39bc0be9571ac5 legacy-trunk
+13127 ddceddef58a1c71a7ceca18ee4f51f295e8bb8dd legacy-trunk
+13128 84d4f172669a6fd37d31ecbfe2e660c3f0906899 legacy-trunk
+13129 34fd252427319f23113ea33fa861c612623e2483 legacy-trunk
+13130 ad55bdba5dffed8ca20b462081a488d1c71d743e legacy-trunk
+13131 37dd8b8b1d84039a28eb4bc7a3eeb1f3f026abbe legacy-trunk
+13132 75f12871eeea7b5c92d1a534cb4c757aa9e096dc legacy-trunk
+13133 18c74d6bcae8807414415faa9e2381369b87673e legacy-trunk
+13134 1bdea17bc471f25f7a97714799cad0c5d89eca23 legacy-trunk
+13135 d7197b32fbfea1ecc19d68b4f3410a10fcfada4c legacy-trunk
+13136 6472728df2d0cf2d64236062871f52e3f184e857 legacy-trunk
+13137 46a708b0ca38f01069c2853284fa2dafc93244f8 legacy-trunk
+13138 aa4ecb716e6e1c8a6c69f24af049cdef2a0e2c2f legacy-trunk
+13139 e264392e15361f956972bc43b03e5d24c3140fcc legacy-trunk
+13140 3c259370ac57ab1ea540dac5ff44d20865c1db23 legacy-trunk
+13141 9fd29021d147eac9d26ccf2d783d2d3382915c14 legacy-trunk
+13142 bed15a015c1c394ec9b86f41197ba61117872931 legacy-trunk
+13143 df8a1c281ad7d74d4898ccaec60f2e34d7f26673 legacy-trunk
+13144 360494c25e0e5a9d802df853cf4107bdf9ae167b legacy-trunk
+13145 eaca3775b425d7bd3846ff64b4e3e2c929d31c2e legacy-trunk
+13146 f6ec4a9cb0b393fd237ba674dee905cc2f5fc8b1 legacy-trunk
+13147 6372c2a4d47bd814db2bea2153cfdbd9d0e14b4a legacy-trunk
+13148 e3a08983cd251f8efe7231f50b131b554affe617 legacy-trunk
+13149 cf62aff104687a4b3c41439da3c8f355d5fc11de legacy-trunk
+13150 46788f16650b07b8042910a6445fd33f70e1a36d legacy-trunk
+13151 e09f19441136ca39d676056f696a031ed3742689 legacy-trunk
+13152 c7470b14dec7c3df081c16134f43fe3b0b11d349 legacy-trunk
+13153 48c33d05367f2a5e825105d60462e422ff82848b legacy-trunk
+13154 43694d35344219bc952be1822adb3e7feaec5c3e legacy-trunk
+13155 c99e687d1ac4ac651a343a5a4f20830da1c763c3 legacy-trunk
+13156 8b38ce42283ecbcfd5e3cf61ca53015c5532921e legacy-trunk
+13157 6c265113e7e8c6fa71a710e29d438bf5d6c0cc51 legacy-trunk
+13158 42dbfd4983876732dd6a323eb0b6578ee08ba8d2 legacy-trunk
+13159 9883e30acac59288630c48766c3b882dd2d2dbf9 legacy-trunk
+13160 299bf53e68616efbfa84e91cc339f025accea10f legacy-trunk
+13161 8e72fc57f55fd431f4b3f0938796b62e6f0fb043 legacy-trunk
+13162 d203cb9ece37277df15a160354624b7e46a412be legacy-trunk
+13163 99681ee866982d064d8d926c37e7fbd960101985 legacy-trunk
+13164 69fb81facb03784c50501a1613d93a1efce81b11 legacy-trunk
+13165 95ac1c8c085e54ce2c79f6573c29d89e94e5bdcd legacy-trunk
+13166 a71c636b85d14a3730fb2b160ddbf86c44bf1e2b legacy-trunk
+13167 ab02334453f96d4702efed4ab432b46dd74292db legacy-trunk
+13168 37a2236d472f2f4f15977fa66364130b93003fa3 legacy-trunk
+13169 933732026e9cd49d87c0d848f0deab3fd0618e12 legacy-trunk
+13170 7d05bb3e135f6277671e276b316a99d16813da1c legacy-trunk
+13171 bebe9830b33cda196b65361bfa2a5c68cfe5e3b5 legacy-trunk
+13172 02eb74749262e55b5f32c1280aab7dd841cbbe42 legacy-trunk
+13173 8c6ffe670963b01ec94e2e42d4b1c3aa5ab0908d legacy-trunk
+13174 e05f6bdc8b52045c35ae99d03da470feb20ef681 legacy-trunk
+13175 8c0a60fb6acf69cd5659a0289d337c501c3d193c legacy-trunk
+13176 798655556456550dbed24e4ed818accd1e9966f3 legacy-trunk
+13177 f6062e59238f3e35ea00d5c2a7cc93cd0ec9784a legacy-trunk
+13178 e2a1c8d233df719207272498c9b0324b4aee8cfa legacy-trunk
+13179 b2606a8fcaaba967db3343c7278ee5728d0378a9 legacy-trunk
+13180 ee861d7bc0e930cfc78a33fb69621e859717ba2d legacy-trunk
+13181 58ddee1256e95405e77332f68f2c8e413d64c38b legacy-trunk
+13182 9e4c573ea49ba6b32ca611d6bbf7207e0c24dd36 legacy-trunk
+13183 19b48700acdbbf74da30ed7bf1c9c736ba0f07ce legacy-trunk
+13184 4cb8494aba620ef27eeaa614d529d32aee955509 legacy-trunk
+13185 ae18e8eebe04da8d4f4ad903001c5e1f022e5024 legacy-trunk
+13186 633d2f7a1e48805c0a8a48a1eca6e531180851fe legacy-trunk
+13187 7137400037e01590154ca6d6506f7efaa5d18795 legacy-trunk
+13188 3bb029c6dd37822a09dc3ee982dbb71d97b57b24 legacy-trunk
+13189 f671195af020ed8db483b9fce93dbab77dd9d07a legacy-trunk
+13190 85cf476657c5de61984e5d5ff0bd4765e1a78084 legacy-trunk
+13191 ae0306aaa688e11be5d8d22d347db0a040b5a2e1 legacy-trunk
+13192 3b8762b8c140d016ce4525887ebd1a22c14ee178 legacy-trunk
+13193 921ff385f256a18ac271802c0fdc7dec0ef1fe43 legacy-trunk
+13194 9b7d8ec9b910c3224b9c48879c6296c252e5d0aa legacy-trunk
+13195 a9d613ab5a765e33519e051486dd47aa3696dca1 legacy-trunk
+13196 ab12c631d735d48ff7c0c62e0add6fea0cc3d52a legacy-trunk
+13197 d30ccb00bd7b80b58374b01b2f7b2b9cdf1b1277 legacy-trunk
+13198 9e0402ee3812068977196ac62976b7f833542322 legacy-trunk
+13199 25cc7f0d45f38dadc89c2ecafa1419796c2cad78 legacy-trunk
+13200 0b8ba9351a06351684b35d0353d8adca53bf3d99 legacy-trunk
+13201 e703979ff5e746928b864a540673bda152c56c1c legacy-trunk
+13202 67a4aced0d88e53a83c0b9d7077a3c38b82a765b legacy-trunk
+13203 4822617b39f14a73779c59159b6edb28adb9d29d legacy-trunk
+13204 aba1cd0d13eafbd4569f6e00b2fd2219d52ac475 legacy-trunk
+13205 81f51105f4288d23bece573b269050fd8880f5b0 legacy-trunk
+13206 346e9a0f0f8c7ce6a690ebee4696fa53aafdd5b7 legacy-trunk
+13207 c903ececba669bb30f0f71605a8b98f0b28d8cab legacy-trunk
+13208 e4e800a78d8dd279949a5c3aac246a1e55ae39b2 legacy-trunk
+13209 58b191badb9a8b5e03b50dbcc6c82ef7395a6d32 legacy-trunk
+13210 4788fd070a30b3e1d14f45e8a382099884167c53 legacy-trunk
+13211 8511efec7309c7e3546cffb935e2a0fb16f9d519 legacy-trunk
+13212 cad7b55a363ff5463c805e77dd8cd0f0643a82a4 legacy-trunk
+13213 b2aae719872386795f3b123efe634ca4f664ccd5 legacy-trunk
+13214 14f6e0dc96229fce1d2d09bae9708efb3e31f644 legacy-trunk
+13215 d8b2f82f33ed2dde415083aa8ba113ec3f40a4ab legacy-trunk
+13216 cd01ba10a962c09fc452c8ab0d72adf9341c1db0 legacy-trunk
+13217 490ec0c40cc600cc7f0b055011335950eed6b550 legacy-trunk
+13218 cfd0932a53e491f83af2479236410f5288839a8d legacy-trunk
+13219 7668bcde9c0ad640872128cb70c5eb885a366a27 legacy-trunk
+13220 67121a2c62bf9314cd1d9a4dd94bcc8dd9996d0e legacy-trunk
+13221 baf66d6e1bc16d21ff012722f9e3eed57c0b8492 legacy-trunk
+13222 80d4885edd66408ae2abf9c8fc33c1cb90a7689f legacy-trunk
+13223 fe1e98190af6ee83a3d452454dcbcfc52921a367 legacy-trunk
+13224 f095077d20b02e2f57c86d50dc64df51d8dfb89e legacy-trunk
+13225 e995bcc4cc8224c8e87913c8d76c0094e17d08f0 legacy-trunk
+13226 9f695a54986548c974d92577c89d7c6958d6a87d legacy-trunk
+13227 f335fa1d6e715ea8c33f9ac3fb457e6490d3a2aa legacy-trunk
+13228 48037f4814b110c0c145818989caa0712a64b3bf legacy-trunk
+13229 f3c7ff7a6e81ab564258b21ec005f7a60652d788 legacy-trunk
+13230 b6d1a32aed7638beb7833e6fa4018b93458e2092 legacy-trunk
+13231 8de7d90b0b34fe4edd36b96f3e8841885c152d3b legacy-trunk
+13232 9e5df4c49a56754dfca9cc417f88b4ae4af5ad6c legacy-trunk
+13233 eea1ab028f431ecc6def8828d310907057a7b5c8 legacy-trunk
+13234 f3876930843862e1c87d9cbbaa662b992e39304f legacy-trunk
+13235 c5f449aa43459214159d554c11a0311fa5141952 legacy-trunk
+13236 2475c3cfe8390326e882c2d3969bc9c420f7dc3b legacy-trunk
+13237 e075272f43f265688f9eeca510a11de5be726cff legacy-trunk
+13238 61051fd65aab08105a95779b21cf4c8288ecbe49 legacy-trunk
+13239 26664d07959799592bbfaad095265dbec902799d legacy-trunk
+13240 7442ccedd5fd3c02b91c327a3a016d31c296a61f legacy-trunk
+13241 ec664254ef5aaa9e1c3774fefe3a2fd9339406c4 legacy-trunk
+13242 27371b6d70c111d6a6c15b7265a5cf792e9fa066 legacy-trunk
+13243 df154da18f0ea0dfc1edf7db207337fe64adf13e legacy-trunk
+13244 e4ee8ea4e8368d2f3da418a2362784df36f1acf7 legacy-trunk
+13245 03e74c4b189c9da549f2c5090e109d538f94914a legacy-trunk
+13246 09c6b2cebee9c61e865a27cc022b49624776085b legacy-trunk
+13247 676de8a7a3cbd25a0fd9ffedfa3e1d2c18e93daf legacy-trunk
+13248 855887a2cc6017c6d8a796f83200ca106b431f27 legacy-trunk
+13249 4c9de6fd267b93facbcc12cb845a58e6e35ea963 legacy-trunk
+13250 3e5b05035eb98429e6afdd3e350bbd035ecb7fd9 legacy-trunk
+13251 4db3691b9c8715fcbf8d8457b4130966ca76ca8f legacy-trunk
+13252 e7ebcfde3b5e4271ac61dcd77e37e18f179f4ea1 legacy-trunk
+13253 f0a619eebe9a2a27331e5d712e12abdc0f8b3294 legacy-trunk
+13254 a0d4a957fd91c11f07aa5e6750ee1fac0287a22c legacy-trunk
+13255 8f3665bb9e3e0c812daf173480518d8a93f18c0f legacy-trunk
+13256 8edbd5ab6217570beadb01bef2f11be61c770db1 legacy-trunk
+13257 8eef6f675677c57c0d4989c32b56e7383a6b7b9c legacy-trunk
+13258 81f54c00e224fe5b1dfc49a815c7dfcbb3d78e96 legacy-trunk
+13259 cde9b2e64c0097e19094c7e857ebf9220c5e7835 legacy-trunk
+13260 bfa0c743347a9dcc922f1a8e7c7aedf12ada8897 legacy-trunk
+13261 f1b2bb535eb363c409128cfc1b88dd471791a01b legacy-trunk
+13262 3c4db6c6e9793cff61a3e434468a0db483be8840 legacy-trunk
+13263 ece098f3e1dc8ed0b4ea49a100adc99ced82d10a legacy-trunk
+13264 aaa5f98cb2d6d9c5ee5ba861f3bfee234cafe61d legacy-trunk
+13265 6a38e667d349808ca3d1dd821a5ee79253b9da9c legacy-trunk
+13266 05d703015de154f9bed95b93a81b768b5cd437cf legacy-trunk
+13267 393a6daf289de3894c65f9b058ceaf56436f9530 legacy-trunk
+13268 150ac0d7092922494af268b664cd913ba14d0212 legacy-trunk
+13269 92a92de959b9e24bdf9b2e33695a38b6d38ef15c legacy-trunk
+13270 3f0a6b1569e7e6ea8e71b3f84899930aed9f6360 legacy-trunk
+13271 dbca470af8f248719349c690e3014ba554d4a4bf legacy-trunk
+13272 e37074b6e78cf4ab71a1c8f5eda450c2704717aa legacy-trunk
+13273 c6a4e46f1b09dde32507537b22c65216735ef3a8 legacy-trunk
+13274 1af7a146708838ae0f084a4eef77584680fa69ce legacy-trunk
+13275 fb1733b6bef5eac0eb3c95074326abb51631c631 legacy-trunk
+13276 2f6b1276e5dc6429fa44245793e78bf1ac6330a9 legacy-trunk
+13277 442483f45345585a72bb23964612ea411321bcdd legacy-trunk
+13278 2b0166d225513e4d435fb5824204f0753f0a627f legacy-trunk
+13279 1d7ebbf1f0f275508954f5d4041c887474cc1178 legacy-trunk
+13280 e0e93e4166ce2d50828be36583380778bd3bd84c legacy-trunk
+13281 c1c70b743df2e78b987f68bbd711849c64e72f93 legacy-trunk
+13282 966594c6b1e256ada51c1fe5744f2a50360c7d54 legacy-trunk
+13283 b70896eb89440e907d1050aab6648e6346c1ab0d legacy-trunk
+13284 9f0f1d8e6ebaf7e73f91b659010c5ac097fa48f3 legacy-trunk
+13285 b39fe51299be9dae94d85d465fb3ce456b9a8caf legacy-trunk
+13286 479b4d1c0b47285df66acb62704fa6d770bf01da legacy-trunk
+13287 54a30d6b01f108a805408e3522100e66708565d7 legacy-trunk
+13288 c39c140b04bcc9cf3a0332cd7af9d23205be24bf legacy-trunk
+13289 32e78c9fb496c388dd03a1bd4cb97bfa64faa23e legacy-trunk
+13290 5db2c0427cad34a499c29e8650152f78b7feae5d legacy-trunk
+13291 a34d6656f8e2ddfa92f7c4271ac86c3c447feb7a legacy-trunk
+13292 1bfaa5374df99758b14a911fa6e3a2d8b27b7025 legacy-trunk
+13293 335b4c02f10df0d900ba44363390ae7c7122c99f legacy-trunk
+13294 767351f4944abade41c1e5f0de2b47b6d51d50b0 legacy-trunk
+13295 105beed068f8e62d273b3dd5f1eb068dd2d33d5e legacy-trunk
+13296 2d36f0689b8a3e0559b7eba345315fbc26d344df legacy-trunk
+13297 b015d5f1da1b571791f440f4bd95a2bf0865c3fc legacy-trunk
+13298 7c40d7c1eef94f77035aab87890adfad08a3fc6f legacy-trunk
+13299 885abe08ea2deac933507d21796770a279ce967c legacy-trunk
+13300 9efe067940eaa87f8b1192ce86abfd721f37a6a2 legacy-trunk
+13301 94c7a3f1c005e6594721c9a85fbf175e31efb289 legacy-trunk
+13302 8f31103c88a8e07e55d923267830a49099f99dde legacy-trunk
+13303 d20e4d0afb4362d89259937e47b2447c2ec166c3 legacy-trunk
+13304 312eb4801a1c816bbe9469cdaaf7c6d0d970bcd1 legacy-trunk
+13305 3d2ea55bc4e68a480f59486b60274093f04776d0 legacy-trunk
+13306 879d1ae5c7a5bced2e049fe9cb1f1cbf69c66f12 legacy-trunk
+13307 781238361f531e3c501994581ac2462ebcad9959 legacy-trunk
+13308 aeb13cb7b78ca5e8084b3a630ff381d27d341ae3 legacy-trunk
+13309 b88a6052426909d62b76e53ed0a10880c7d28d55 legacy-trunk
+13311 7ea38597e70fabbdb45f23bc36976b63f66c110e legacy-trunk
+13312 ffb2a47b645ec7bf1a5bbdafde30a4710d96ce89 legacy-trunk
+13314 f164d9193341c9b4f08e436841dbc346be0eb2d6 legacy-trunk
+13315 0fe8cf7ac6d5a356439415176f2eede429b8cd3b legacy-trunk
+13316 dfbe258e28c1817da22291071a25fe8ca7b4b02a legacy-trunk
+13317 68799a202766a1441a7f19c46963549f0d6a8081 legacy-trunk
+13318 d73a3293c47b2cdf1e85f7d038b6ce92f8356c8e legacy-trunk
+13319 5ad27aee7e58861f625fe7ed867006332041a497 legacy-trunk
+13320 2fe0bb8b9eef79bbdaa1b775301fa03119371cff legacy-trunk
+13321 8de13cea96411226889da0e8b1d5cbf112499f46 legacy-trunk
+13322 331c85aca19572c2f593cb0541828ac3463cf530 legacy-trunk
+13323 c12f7cf192fb3386098b861c599c3e3e304fdfb7 legacy-trunk
+13324 d26a9f9254f14dc31796604691855c5d4fea2408 legacy-trunk
+13325 eb7a62acdd1dc5b4f83de4d8d34ee138543a0b3e legacy-trunk
+13326 5e03ea6927f206f56009234bd12bc15ae18c8e45 legacy-trunk
+13327 dfb5fda3b273ad74cacffdde2c08fb482b92681a legacy-trunk
+13328 d3c6e9a126b29fac6d78f27b7c73dd24be3b7019 legacy-trunk
+13329 49a0b8dcb36a4e26928a26d160b2f09cc91bcffc legacy-trunk
+13330 0bc7c502eb4d2ecc3a9686f4ce99f284b08ac1f3 legacy-trunk
+13331 96389f0b5ef086b4f38f3ca76fb0be24769eed57 legacy-trunk
+13332 fe5b7dea5a10ffadc273deaea843122d301b1cef legacy-trunk
+13333 ea832c3c6e6da263a48cb438009a698f9e0b3e90 legacy-trunk
+13334 2a30ed9112c61d59c9a0dac1e9164b092a8966f9 legacy-trunk
+13335 69d89f7f530c5c79e957f3f4f581ef6e2c8a2ef2 legacy-trunk
+13336 391a9cb2b0729f72a0157bca889fbb26fd5cec1d legacy-trunk
+13337 00344dbf2a6052949ef5888c7b47a4500931346b legacy-trunk
+13338 65db5e26298f266d8ab49ae034ec72cbcb7821b7 legacy-trunk
+13339 aae14c6181b9d88d5dc39dd5a939e60d5b2f6a37 legacy-trunk
+13340 135c1ec9636c686a20d03ed277a353824c97424a legacy-trunk
+13341 5581307db2f737e6a38e2d5c713414be2106e91b legacy-trunk
+13342 e6524346d66cc1859b9d596e400935077819feae legacy-trunk
+13343 efd1573a4b03b22da2a107edf7f012536493ec45 legacy-trunk
+13344 0bf301941efd8c53357fac14a49e71a4e2c913ad legacy-trunk
+13345 8fdac40250325f89be7e96d23d20cea1c6bc6c21 legacy-trunk
+13346 84a4ecd2cb95382486dde3eba0456ae884b8eeed legacy-trunk
+13347 aee74e977add0ff7a0aba7229d054aeba4ce5726 legacy-trunk
+13348 fa6be1d0b8645a33fe5b5b31fc969e019636cc61 legacy-trunk
+13349 352e5824eda6660a41148fcedf30462b9c4642d0 legacy-trunk
+13350 e1b86ef4557c57592faba9e905f7537e6d2d4f41 legacy-trunk
+13351 cdf7ae5b3367eee6e4da244e3d670582eb97979d legacy-trunk
+13352 5ef4b3ca55645712f563dfc32a4b25a6930aca67 legacy-trunk
+13353 b7378df3db56d70431627c17d9babcacbd917f2b legacy-trunk
+13354 c7aa99658383f27fb242e565a27987c1e3c07352 legacy-trunk
+13355 d78cc2676c551b6718740432ef3c37713c9e95ca legacy-trunk
+13356 4da76f838a5e4ed5c3e3b3316a3b36c690d27023 legacy-trunk
+13357 a1415ecea23d4a321d71dadc6562409541bcb727 legacy-trunk
+13358 fcb25335d6aedf2c1e5ed9a9e16c9bfd600b3775 legacy-trunk
+13359 b27ad509b44b350256639c529800c678fb3417ff legacy-trunk
+13360 e2fe65e87761b880c40bfc6e76d995ec58b50f5d legacy-trunk
+13361 f2e123af2ada44713a7c4a64801dd22cbfcdba3b legacy-trunk
+13362 28887f40e3442e0b51d4490a71251674731670d3 legacy-trunk
+13363 be0ac5abe83b7b6ab781ee2cebd1cae664f263be legacy-trunk
+13364 1aa80f5bf9ac91d3c012bd6aab74c91c3cb90296 legacy-trunk
+13365 8202f5ace24849af751f3b1e9a9409935d7c770f legacy-trunk
+13366 e75250e55424f41d948b66130b534860284417a9 legacy-trunk
+13367 cfe472912b7f8b0282e74da8e4cb07a49d2385d0 legacy-trunk
+13368 9a3a0468f51c7f97fb3422e9dc07d78f7ebd940e legacy-trunk
+13369 4f5d4945605c67d34c759c7a9e8257be3513c6f8 legacy-trunk
+13370 f7b41b27055482183dc2fdbfb86f4fa1cf3f9aaf legacy-trunk
+13371 cd2a25b7b43858e5853fab9de4d7bcede7c1b7ce legacy-trunk
+13372 3edb3298234cd0b18e2c447e59ddf6dd97246c74 legacy-trunk
+13373 25138db35ce1ede7d7f1dfeda8ea039dee2ef3e1 legacy-trunk
+13374 bbc2a87894d082931f07a20176207e8ddfaefe2d legacy-trunk
+13375 7d1182d0c4193ea118eefb11f0636f61da6fe478 legacy-trunk
+13376 ffff665f8a7bf29eff556165a236b8558a7e8d0a legacy-trunk
+13377 5c5ae161f28ac0406b9b3ced1338127aa20a1584 legacy-trunk
+13378 7550a35d80f9baffcbaaa28b9a29951dbafc0235 legacy-trunk
+13379 a563792000770e1609b3cd77fadc5e9e454e92c0 legacy-trunk
+13380 9868c807732d58708d6503363946328d28390e2c legacy-trunk
+13381 8634ea2ec4e2fdc2a70d54df16ff74835be464dd legacy-trunk
+13382 1821e64e08fceda8fc28e10d12d8d0af8b45dc43 legacy-trunk
+13383 17ae178a30388c4cd1f03e6f0740133664462536 legacy-trunk
+13384 2669ac7cd76a96f871320ebf927ef9b03612a40a legacy-trunk
+13385 b9ef424165d6253d2bd5fd4608364af729a27433 legacy-trunk
+13386 5020bfa742eaa7511c60851586d61800cdd4fd33 legacy-trunk
+13387 f88d3a763723d5ba0be7599cda3ffbce60b66eaa legacy-trunk
+13388 838cb34abb7919c342f243a960328b3660d0afdd legacy-trunk
+13389 06def8042d8e16fa010655a07bec016a53341a5b legacy-trunk
+13390 c209dd98b869525a1ddf988b67f303e196168eaf legacy-trunk
+13391 f0318a1c9892cb5727f86d127e3992ff2a6c972a legacy-trunk
+13392 62ed32e79b5d29624633407d0dca339424ecdada legacy-trunk
+13393 822c5282c145697897557e754bdf90b25fd519a8 legacy-trunk
+13394 af07389c85175fba594815702fd6bf2b2ddbb834 legacy-trunk
+13395 ba6d3ae3a02147a216fae8071377d9c307bdd881 legacy-trunk
+13396 a628c3705897aceba6f84b1202737c4e5352cc19 legacy-trunk
+13397 632b6705bd9fadd603d1490facb4048ae3c7da0b legacy-trunk
+13398 b8136566caf5c00e0795d8b3d5d59e7a436b557f legacy-trunk
+13399 6783842c104245c036d3d9bf110817a21c4cb721 legacy-trunk
+13400 d38d3b8ea463bfcf1eb094dc65a8e5a39b4b63f4 legacy-trunk
+13401 e183bc0049dcddc00365e59a0813c8b4697033fd legacy-trunk
+13402 7486796fae5b9445fdbccb7959c6e1b5b5fed554 legacy-trunk
+13403 817d0538350d336447100c3b1cc7977a0016c43b legacy-trunk
+13404 3e419abc5baadcfb1093fb882ba560506b01685b legacy-trunk
+13405 95837e27325759d234278ad2fedc9728f7d40579 legacy-trunk
+13406 85cf49a9b00bcee73fa174775b4624b96719fc1f legacy-trunk
+13407 a59e95d2f1810b436697427ebc7bd553fa21e9d8 legacy-trunk
+13408 17ca2f64b6d6717b788cedcbb24485e084bbc4e1 legacy-trunk
+13409 7e56d39d074114326c69ca82fc101ab3a3cd81fa legacy-trunk
+13410 f0a2213444a04945d5d38f8b5d1b78a2afb7e959 legacy-trunk
+13411 957c33504cc124daf71afbafdf2efdbe999d5990 legacy-trunk
+13412 d3174320e3cec9bead59923ab330db2958005979 legacy-trunk
+13413 f4c6ce5593b9d60d8bdf62a6c48c1529b18cca61 legacy-trunk
+13414 c2451614685ac4d8eb6486d85ea54fa35ad6ba18 legacy-trunk
+13415 29e96275a42dcb795d55ee83c958032027db52e0 legacy-trunk
+13416 8a3109740c6aff0e45a5c03867cfaa5b05d8a5f3 legacy-trunk
+13417 d83a4aa70eb428d22d93dcab816e884921f340cf legacy-trunk
+13418 cfac83f5c0efa472c136778a8583af398f3f9585 legacy-trunk
+13419 b1a1eb3349f37ad1b638be34e0e92c514e74ea94 legacy-trunk
+13420 d1b4fd057b4a634ec4aaa8e855665c24e8df8aeb legacy-trunk
+13421 3fdf1c7d9f988f9e91b04719746fdbcb325ccc2b legacy-trunk
+13422 ba797179e2ba6390a5fb21c4efdd544a87e8c3e3 legacy-trunk
+13423 b75d0119ed51a07b8cbb603d23fbd11bf76b2aa2 legacy-trunk
+13424 6b1cb8582a1f92bcc6743c6ae4bf9a4d04fc00b9 legacy-trunk
+13425 a8a1eb99341c21b8e612295b5d9389b6059fc20f legacy-trunk
+13426 bdd6b09a371c40dadda86ea98fb5bba970a4dbdb legacy-trunk
+13427 3faa634309246f6435e76f8f3c4f6ffd2422fcb2 legacy-trunk
+13428 9c403488755729137a167331afde2ee14cabd5e0 legacy-trunk
+13429 1c552dcd43f975cd88c91abbdb94fd09ca28d334 legacy-trunk
+13430 8234bb36fb8c35f9039884f13ebec6d0896656dc legacy-trunk
+13431 5259703f4b5c02022554e46c55672eb1ea522b58 legacy-trunk
+13432 b35bab457350b50aa5f1969111434d71aede5682 legacy-trunk
+13433 f9c03b3d0f146e918162c85a43aeabfd68e23bfd legacy-trunk
+13434 e41049ac828b49c06da83f5fecc7d7abc0dba948 legacy-trunk
+13435 5ed9a2dd18d9e6f8a05ec3aea5793fe9bb47a490 legacy-trunk
+13436 84f1cbe0094335ae6e5ad0508543359bc200641c legacy-trunk
+13437 451b0849c97725dbec10748e8d04f3572b61fcba legacy-trunk
+13438 18a29219f5e06f4dce5a1a621b0c9e85f7d04154 legacy-trunk
+13439 50c3b3c217a39e46a7af54744b4d86b2faedc010 legacy-trunk
+13440 cc6abc99d2ddf1414184c8800919c1409cb4add7 legacy-trunk
+13441 c089020a7a1e5765ff98b58df8e4150b92057aeb legacy-trunk
+13442 dccbf5e8294dd91f6fe3a23b4d51b00c9a804714 legacy-trunk
+13443 8416553c33df17ff2bb7951754bc52f7a84cf776 legacy-trunk
+13444 e8ff4b1298c233d2f55d3e29e3bf471c57cb9a5f legacy-trunk
+13445 af76538dd079d24f0d6781b4140a81f7a0672e20 legacy-trunk
+13446 7128c0fd2bcf524e743f45c1b72702508e930722 legacy-trunk
+13447 8cc0c898f6a74783d1831e4802ce3a4b9b070226 legacy-trunk
+13448 e7eae63e8b90779049e5f8e13af788800c68dfde legacy-trunk
+13449 d976451b465f212b824de70c0d497e613570a686 legacy-trunk
+13450 6ee66fe179ad72e0b052bb394bd5cb8bde75628c legacy-trunk
+13451 35d5b07362422621be864958ad21f9531e7c48db legacy-trunk
+13452 bf6a0983951dddd9a1a9369c94424a98e22ab662 legacy-trunk
+13453 1abc2785b3446c0bf88c6757954fa71ca324d470 legacy-trunk
+13454 3842518cf803012ce50d3f98afce3c3f96f23155 legacy-trunk
+13455 b928f7b9dfa23d3fed46c3c22863068b30104805 legacy-trunk
+13456 03530ea2148c8584650a48bba7f02c57fbf7c2b5 legacy-trunk
+13457 0fc2e857e82285038702d394fb899ab08f1321cf legacy-trunk
+13458 b6d3d17195dcba865556a1295e1f1af6f4b6d9ad legacy-trunk
+13459 31711a0587382368f1dd84baefc28fca141be09c legacy-trunk
+13460 e050d4c01327cd9c6f5b1294338e5c7f16eda165 legacy-trunk
+13461 4d76cabbf99e65580b12cd8504e5f564090b892c legacy-trunk
+13462 42940ed22cebd78b075e12eadeaa708283910b35 legacy-trunk
+13463 66689b2dc8954b5c73aab238504051b47f06f3a8 legacy-trunk
+13464 bdc1703ff92ce7f524bed0e2cfabb8247050e606 legacy-trunk
+13465 c77902541b13a57dc10884166e091477600feb98 legacy-trunk
+13466 bbb03868f21b627127ef7c11b9a27fe2973f5b04 legacy-trunk
+13467 aa3276e5dccf5b2211363eab10b7d3a6357c1859 legacy-trunk
+13468 36fa8352d0388167803418a3da7992b63646e004 legacy-trunk
+13469 4dc9eee2615714567cb1a1e870de664b23c540fa legacy-trunk
+13470 2b9af9d7da2d8a7eb45af815c337e4df43755625 legacy-trunk
+13471 da236044cf6c8a982fc283e804a8e5e5dcbe1287 legacy-trunk
+13472 309d8cf83a117982a1713c20dee39acd0ca1e383 legacy-trunk
+13474 50e7eb20bb1d51ba569265361d46d5973de7e2a8 string_methods
+13475 259237b25b935f9d78435c2091f4666b0a4062bf legacy-trunk
+13476 70cf13609aed68a3ea9f96ed9c84380c603d43cf legacy-trunk
+13477 fbb4edb7202cc5e1fe653ab5ac1d0eaa3e0c54c8 string_methods
+13478 5ba2e4ce58cb4baad352b2958b9411dfd1990f0d legacy-trunk
+13479 5480921ae7f3fee69d66e5842089b6c599215305 string_methods
+13480 9d71c2c3a6756f26e34f46cfc32d1883cf564fab string_methods
+13481 e1407d6320cbb7c102f37f2f98347eb06632c09a legacy-trunk
+13482 6ffc9d8dc5b986a88291194bd6b708bd1b6c8768 legacy-trunk
+13483 17c4dbd36e677644845a5118a3e3ef7725989efd string_methods
+13484 78cef5676ccf612efa7da07747a4f387a977b9d6 string_methods
+13485 ae850813cb7b48cc943dc614841e1e2f9cddcde3 string_methods
+13486 ff0e576e758a7b4e85f459ffa53caa4afd194c96 string_methods
+13487 1dcc956fce649f4f4aeffb7a2fa4874015530e73 string_methods
+13488 eed5eb5b9d4f59cf0386f7f4adebcb9f306ab0e6 string_methods
+13489 ddd216003bd1871d3645f259a3c694cbbd9c6e69 legacy-trunk
+13490 cbbf297aea7a93797b8fd9ac1b4f95b0c2b37031 legacy-trunk
+13491 b2d69f7513839a453299d5d1384191cce3e3a05f legacy-trunk
+13492 ec6c8ad98341079463af9f6384038154da9009cb string_methods
+13493 51969fd73c4a7e7ccb661a5ca52787a1cc96645e legacy-trunk
+13494 2ec04ff2b9b732f9529db81e594367adc3fafc80 legacy-trunk
+13495 cfed29493ed6561cbeab1796593e5c6a1a066238 string_methods
+13496 0f0a66c1deaca2688ae4f44ee6822296f6999764 legacy-trunk
+13497 0f2292f57a83174366920ba9c575780b0e99240d legacy-trunk
+13498 95d782815901d8bae565822fff70ff1c5c50d5cf legacy-trunk
+13499 b2fbd9a5a1b55c132d726d70ed20f16a9bede768 legacy-trunk
+13500 ae96b1a128f8c1698a129516c2bc3d79bc9862e1 legacy-trunk
+13501 f90ed966316e8c6942397afd9f6303606108bb1e string_methods
+13502 4b969265b9d21bcca862d486f5f7f0e2c75d55ed string_methods
+13503 711380372bc918a2ff0d69559ac03ae2d6fbb489 string_methods
+13504 17ec0902eafa06cd740cc3620c7bd5b91560773f legacy-trunk
+13505 bef46ea5ef75c04c4dc65d3562ca88c842b30ed1 legacy-trunk
+13506 39f242bf4622836876a26e3edecb6f1bc44a95b9 legacy-trunk
+13507 1dccbeeaf76acef436c10406e998b97e189ea9a5 legacy-trunk
+13508 63b530c030c54b01e77fc51d09867cf2bbd02994 legacy-trunk
+13509 c73f53762f9b0f2f11250e73f7c1dc66b8de4375 legacy-trunk
+13510 e39a9f12916326d52e3f61d2fe2dddb88606eea9 legacy-trunk
+13511 7a127f1992d1975ddeb904cd75e1607f83319222 legacy-trunk
+13512 6cafa3d4e229e8b0ff50b498646cbb30f62dd99f legacy-trunk
+13513 13462ca6d94755eabeb8eab16d1cbdec1c7593d7 legacy-trunk
+13514 4050995a6639bb882ce674a4bea227b3ba517bde string_methods
+13515 3c351255f173aa9732134477255dd80a259460a6 string_methods
+13516 46a56177322eb06aa49b191b1be61438f7523737 legacy-trunk
+13517 87d3f91e44d4d7c4ce51263eeaa9bcb88205551b legacy-trunk
+13518 3e05fcaaaed219218eba86127a9dda206d387d57 legacy-trunk
+13519 708628b6c04bf22e4e7018c2c6367c96bbb01fb6 legacy-trunk
+13520 0d186c10a70e24bd9cb47955eb28b2dd30e69c4b legacy-trunk
+13521 84ab14d85763430c3dc51c3723cbeb81443e6e00 legacy-trunk
+13522 e68e606c130f51ae90ab85759d5f7403f4b4e7e4 legacy-trunk
+13523 69615d50f58c005d2df59f34ce74cb1f4a6968e4 legacy-trunk
+13524 8a4fc4da768d8ecced6a38215cd246df97ed6dcc legacy-trunk
+13525 fcac6432a7dfb3f51978b5e1df7cf424da7ef167 legacy-trunk
+13526 926cb5a5ee30933597e098aa82a09d11c6b5a7b2 legacy-trunk
+13527 e52723af3cd5e6f10ed95def8b4d984bd793fa1e legacy-trunk
+13528 086b2bc7578f9ef2c5c5c036043ec9b464c4ab14 legacy-trunk
+13529 8c114ede056861dd5e25ba3119bf4b6c3f97b404 legacy-trunk
+13530 c8ed5a14488de6d324d167a15cb1dccfc502b8d5 legacy-trunk
+13531 0872da3f3f5612109fc0631f7e20e68751297b12 legacy-trunk
+13532 b9f55cc10ab3f10aa4b4534e9d7209065ce47692 legacy-trunk
+13533 4818cb8e11101df400d7b7e77d32c260b15a9d66 legacy-trunk
+13534 492a694890286a2adc4a286b1f376905b9f20180 legacy-trunk
+13535 e9442734bc4973d92d9ec422323cd8720b492890 legacy-trunk
+13536 3b3c7b8ade7ffc8976f3b6ae50a8447bc7afa0f4 legacy-trunk
+13537 4077ca3b265632898bcdcf475a9f7c454e9035a1 legacy-trunk
+13538 2a2e99af382914e6296bebb709611635de0fc795 legacy-trunk
+13539 6c92db3a77cf37a03b83dd633d55f926020702b9 legacy-trunk
+13540 41385d50a10c74652437d8cef4ba5f89ac52703e legacy-trunk
+13541 749711f885cd3e560eaea8f05fc130ff062ac4c3 legacy-trunk
+13542 f4c63185ce110874194b40c294bc74247b7b623a legacy-trunk
+13543 308ce21839d63fa0199931dd82c81ccde8fdf039 legacy-trunk
+13544 6127b73858bc91f3531983ee4f7688173fbb8d42 legacy-trunk
+13545 3adc0342d08bd25f683db04a428b36d7781def8e legacy-trunk
+13546 119e119fcf5ac0b37063a6a887f9513eb7cea36d legacy-trunk
+13547 126a9cdf05729e15f40c5ad51d33c38183725746 legacy-trunk
+13548 e6abedbc79c69ee9e8d4891a825bfe4d7d0f349b legacy-trunk
+13549 271af297aa3ea798534b8fb6fe87b6e0fbdfebd7 legacy-trunk
+13550 31fd4ed73d29e51ee41bb9cd846ae51310b58885 legacy-trunk
+13551 649daad6cf5167fd3dbb7b5aa792b76d3d559ea7 legacy-trunk
+13552 771a9a100d75bc8d7096e0378f9937300d46c396 legacy-trunk
+13553 3819eb7c834b358e41ae00fd01b6d4c7c73e0969 legacy-trunk
+13554 f9ba8023976d6620a92a59713051cd6cf9bc7537 legacy-trunk
+13555 3be935be3781fcd3d6f033f128f4aef8b68a2a8b legacy-trunk
+13556 8b7f65b0db18a36c984d59613a0597b3ea642a80 legacy-trunk
+13557 36684ce0d40d63690ce91adf07e7b87083e433f9 legacy-trunk
+13558 cb366321152cb2e6971ebe46f2710cbc4c5be2d2 legacy-trunk
+13559 b6a438cc195b997bac2448a00ca5a62c210b20cd legacy-trunk
+13560 ad15a0394f7828fd1e7b459e726844c25bd06440 legacy-trunk
+13561 5adbb3f04cbc2f92788d30866a8443884ba4c182 legacy-trunk
+13562 12cf909668223036281b3fead0dc6b8df75e0369 legacy-trunk
+13563 5fa96d050319d84bbcc0a2ab4d3a46623844fc15 legacy-trunk
+13564 97896c09ef1b331e0914bc37941225bb95ca80f8 legacy-trunk
+13565 626caeca535a243b0c81ed744631edce3f184f4c legacy-trunk
+13566 27c48df1ceb79591fb2eadc8fb4b97693401454e legacy-trunk
+13567 f78f16fea4557f4d4ba8047689c9f73dcc570636 legacy-trunk
+13568 cc2eb01a16f423bfb04722d080bbba7dae0f479f legacy-trunk
+13569 81498c4e569d3498e41db4ddc23ee5ea05d7a920 legacy-trunk
+13570 5bb4f50da474a5b457214e2a2de4fbc88d53642e legacy-trunk
+13571 fd546cbdfb5f865a91eea478373f44bf1d4314ef legacy-trunk
+13572 aeb10cc2300d6e6a5c84017bdd2ea320c8fab22a legacy-trunk
+13573 222aee96dc42510a8a77d07b9dd2ebe95a78c207 legacy-trunk
+13574 4f51e97a6edf5d78a09f2fcf37dfcd856220c732 legacy-trunk
+13575 5a82fb4f78e594cdf8b8f03be0713c5197c882ab legacy-trunk
+13576 27fbb08f8c38dcae741fe91d6a26ae939dfd2549 legacy-trunk
+13577 253970a2c05d66455c91f7ac4eb796364ab744fb legacy-trunk
+13578 256b878689f3b1e4a089993d4d9804b8a13379c6 legacy-trunk
+13579 b3acd56520cd9faf72321e3732e37ee0ee60182e legacy-trunk
+13580 bcc0be7cb40801db1a0ac8e0f8e53e4077ad9a5f legacy-trunk
+13581 12098a8a95ecb8b5737c08b44a52a9d051383b3b legacy-trunk
+13582 79ee6dc93d0e9e3cbd9f85db2997d91d1ef41018 legacy-trunk
+13583 9631f9726a705b49078f6297d17530353884b477 legacy-trunk
+13584 07b07376ca7288c49314eb5dc23cbe9dc51b1702 legacy-trunk
+13585 902316c72b43f953e0d3c49fef9795d18e95a07b legacy-trunk
+13586 e3ddb87616371cbb57b7c7497e97d97604742235 legacy-trunk
+13587 49e8de0b5ea74a855bb5454b07f4ef781e4de856 legacy-trunk
+13588 7ed6fba8265cb79f6117ef7f95ca9981b201fb95 legacy-trunk
+13589 f11148c5fbedccf2b4aa3227a0a744923fc9cd78 legacy-trunk
+13590 d6ca91063cec93cbebc7f82f59613e33e0a6d247 legacy-trunk
+13591 f526db9a6cf836df01bf837fed2e1442ad62bf47 legacy-trunk
+13592 dfb5add684c3e81215d35f6946cc15cf82677a53 legacy-trunk
+13593 6282ace2795e06cbc5a30624d4656e81bad5bfc1 legacy-trunk
+13594 bae3fbe2b591af9dea3b614c80cedf99bea8657e legacy-trunk
+13595 0b65835e2b2909d65be2be9a4062ad335363e804 string_methods
+13596 8e4dd6a161ffb7cc4780e17f7c78be603026ad79 string_methods
+13597 0dd50a70c47e22d62f810c66faec2d9df955a9f2 legacy-trunk
+13598 2fd65d0f3d415083cc1f730eb82d8b32935b6105 legacy-trunk
+13599 9dd819d993263926c2a4f4eaaf7fe72bcc6aa501 legacy-trunk
+13600 a84f9d3999ae846594a1343dfe8bb72a001affa6 legacy-trunk
+13601 6613dfd7391718cdc5f4143af613a04a1e12a070 legacy-trunk
+13602 36e258b577506693c412118866c784732cf7111c legacy-trunk
+13603 4a1d6c7b09501f93c78e52b9bea4b9d6bfa5ad97 legacy-trunk
+13604 6193cc145b8c7ad8e1cc97de8d19591d0c9d781b legacy-trunk
+13605 d1b48ee14601f8a54469b516556a89bd4759049d legacy-trunk
+13606 87a3935e66aacdcb1d48f357d846da77303d7d1d legacy-trunk
+13607 3e5f6964cd3317b02d4e466eda1efab079f11e3c legacy-trunk
+13608 76008f8a0e5f6cde1715fed1ed4642586dbe9539 legacy-trunk
+13609 d04609a37dc11663b16243abbb5fca0488383a3c legacy-trunk
+13610 5be9406bbb05ca110375cc85acf4306410afb8fa legacy-trunk
+13611 d451a211c16a3d67d8ffcb1d9472648ca0910fc7 legacy-trunk
+13612 25673884a3d0f3cd27387f92155cbb1bd1d34dd7 legacy-trunk
+13613 84612a5688fc93c24e1d5f0d46663fad0a647320 legacy-trunk
+13614 dc6be0ed398cfd37688c67ab4d5ff7fcb0ec2253 legacy-trunk
+13615 4463dd7bb3e895f3e059c7addd9ecc3a99f0d8f3 legacy-trunk
+13616 4a7b2b4d1669aef5f0de9c77154ea83f7d69df3d legacy-trunk
+13617 47e003bd35ed053a89f59f3b4cd7437f88e628b7 legacy-trunk
+13618 4b53f4a0a98acd1bfcdfc63033df5b75e03e1745 legacy-trunk
+13619 7029e18b4f11e77c49578afabfc4d3e7a6c257ce legacy-trunk
+13620 2e00b889035f2f467f8a40f848741f19524633dd legacy-trunk
+13621 728a2500ea42fb5fa831bfc90c55e98fbd47c4cb legacy-trunk
+13622 1d4f5f49de4ecf38f19609c8ce3d8fc82aef162b legacy-trunk
+13623 769c6b4c5b887c34e753ff566e89474b390e3045 legacy-trunk
+13624 4c75596e92f4f8adefbe03caec5377d9d83f7a68 legacy-trunk
+13625 9c292ad8a6d463c034f542fae307ce998f8db51a legacy-trunk
+13626 71ed0a2c279a605f1bdd98f677be5673ce5cda0a legacy-trunk
+13627 fa2e3d06c7902e16bd7a20e73b8538c043454001 legacy-trunk
+13628 872a82fd0ec41d4874b250f402420f5077b28ad9 legacy-trunk
+13629 aa6c5f86df87a4e5eb3cd6d16b699eecac195902 legacy-trunk
+13630 fbf40d7fd4dac265c12143783a7edd55ecda2d3b legacy-trunk
+13631 67bd2aae2732eaa5a1a9d66173d79bd744f34897 legacy-trunk
+13633 068fbf4f558a233c546c6a37a316b83a1ed5e43a legacy-trunk
+13634 5e848c3e9c5c71c44e432d2c4556968ab6952022 legacy-trunk
+13635 14374ba341a67a8f65585eac29bca7e46acccfe3 legacy-trunk
+13636 1cde5230c50819e3d2473cc10d26714ba1b8c7f7 legacy-trunk
+13637 6bf620375976349a96deb146656f837131d47b23 legacy-trunk
+13638 99286daa900dd48e540fb792ca469c41acc87479 legacy-trunk
+13639 12f208db42b0e92fac6a8f9376f324b520d6bbe2 legacy-trunk
+13640 78f5bf1797504a9e669525fb0b53eb2f5aec05fa legacy-trunk
+13641 be8ec828c0723728c27198bf417c322031938cbe legacy-trunk
+13642 010e7b69d86bf0e0f1b73894a3e8a2f211e316d4 legacy-trunk
+13643 dcc09228a3d24223c791a1ed48f05d5b7fcc9764 legacy-trunk
+13644 939d914af5816ffc46cff772556919b6420f6b32 legacy-trunk
+13645 da9c83b5fb0745ecaac4bb52344b8b2bcddc4976 legacy-trunk
+13646 3b1980db4ae99046ced2a80c313154ecfb790cdf legacy-trunk
+13647 164b4bc4dddd0f8295865dcc6721a2b06990f088 legacy-trunk
+13648 3a39ebe276c8f4f8c89778f333000ce08a5a5965 legacy-trunk
+13649 d423f57844b26b72b81d2eaf26857f4211d3f53f legacy-trunk
+13650 306b49d682337cb956d05ec2df0096bd8cff1c1a legacy-trunk
+13651 2eb2879d567f4b3169f2ada9a3c8ff03a622137e legacy-trunk
+13652 7c239711221a24745f3b1e60f931f4b6060d841f legacy-trunk
+13653 442ffe9a58c13c9701c47ea7366cd09b4705e560 legacy-trunk
+13654 5e76c9965fe83901e0b17725fe8b80fb6d7b628b legacy-trunk
+13655 9a20038f0b997ef0dc200cff1510afd686d1ea54 legacy-trunk
+13656 a4b7242a4b74cbf47c9b6ca60472ec051af6ee89 legacy-trunk
+13657 1c6fdc8adab0a4c6fdc5dd16ec63b70c090aa16d legacy-trunk
+13658 f729bbc4a9f310f9f7ea5dff989d5bbd3a8b4adc legacy-trunk
+13659 0d88e0d2184f8939abd0d7d0f0401cb5f93f5939 legacy-trunk
+13660 41a46978a444a729d772f187717d262be3f11cc7 legacy-trunk
+13661 2c585526447e95eb8f43ef9c3bbac0fa34a69a07 legacy-trunk
+13662 8049d2de1e794aac4663fffcb248bb8824ae5c69 legacy-trunk
+13663 84e34d8138ac904351ff8d567a2e3f1a9cb9e0f5 legacy-trunk
+13664 c2ac896926cc4a7984e8528d93757a18f2e96a02 legacy-trunk
+13665 0a5a8f513d1363a7a7931c4960a4e0b683177d8c legacy-trunk
+13666 b56bda1900fc0ed00c79bd6abb3a4aa94d0d48cf legacy-trunk
+13667 2c3af90f3faeb4556a5317fd21c33fbe7a5c8a01 legacy-trunk
+13668 cdfa9cd4e72bb26a7d5c425471884749b346fd38 legacy-trunk
+13669 c09541128c5a41de356f940d601f6b88631f646d legacy-trunk
+13670 c95e1fd87af0f0696fb2797cd0cc5a288df13b4e legacy-trunk
+13671 2b7c43d4b469b0f2220c95a66a0f11a4be68a42d legacy-trunk
+13672 1dbc5e6978f9dd2f588942b421bf840f0415c0d1 string_methods
+13673 41fcb40e841fd6a6313cedf2ecaabd7561be699a legacy-trunk
+13674 d997e27e3312bc0dc66f270995d58731f89f3c31 legacy-trunk
+13675 f62e465c4d014b8e36b85248fa8129de06918ae7 legacy-trunk
+13676 bbd035e5a972cfa1eaa4efac7f443c1e0c368d5d legacy-trunk
+13677 b8a29de9ed54b243abd34470995b9e466be0f701 legacy-trunk
+13678 878ac0cd0e76818e2563deee3e2a9163e29b88ed legacy-trunk
+13679 f4efba32320ec43a8194c21b58a2cd8935d5b139 legacy-trunk
+13680 83f39fc85763bef429b9ff25a08e1c59fca73bb0 legacy-trunk
+13681 36a65462c269d0ccd25c412eebf7d6ae0c85840c legacy-trunk
+13682 1a68c972d0841e35d4e3e1303915421879046783 legacy-trunk
+13683 6852ff03030884bdfe759f2f34c41a24c5c9771c legacy-trunk
+13684 2c4d48e31bd5e78ab7093c2faa38e952d1d3e86e legacy-trunk
+13685 43ccbcf4384f123113202d9aa6a89dce6f36cbdb legacy-trunk
+13686 7ce5bae7f765a46ece155d0e41653b9212baf4e6 legacy-trunk
+13687 2f1026db82280befe7f68bd3ea5959199ef0ccfb legacy-trunk
+13688 aed19af60ea3252c8df0caee656e4fc2dce9b63c legacy-trunk
+13689 0baff135c4b4e1b08ba0ae78bd0641bd3d4bf9a0 legacy-trunk
+13690 d154ae7ca014f79130e4602946baf733a29af648 legacy-trunk
+13691 3c8c5576109c357f1f6b54999b3dc8451fa741dc legacy-trunk
+13692 6e6bdae8808a5319454b7e6ddbc6e3bf1c622577 legacy-trunk
+13693 98e59c84ec31a3ebdbf86282796e1872606f7a9d legacy-trunk
+13694 a4aba205038eb5a2ab99263e02f2301f87438fbd legacy-trunk
+13695 3e0c7e6939bd02a67550ca1052d802da34b4d4ee legacy-trunk
+13696 1a27dd06cce169dadc281d6adc441701803312fa legacy-trunk
+13697 617e10fc5d8d328fa008fd137c7c949c1a8ae09c legacy-trunk
+13698 5da57ea5fc641813b5f2506057fd0117d4b689fe legacy-trunk
+13699 320652242e6ba06c515a3b68e50692ff724e97c2 legacy-trunk
+13700 04929abcad86bcb5275478ed0cdd5ac969a55086 legacy-trunk
+13701 8e74ed154f6087fec72f5e6384c7c760f7044725 legacy-trunk
+13702 f766fb6f85265a49b838b7e3d65a6a1c68a81824 legacy-trunk
+13703 3485a7e4600b9fedf18e655fbf8ae9de5464613d legacy-trunk
+13704 fab81df566d0cfce464bfa84c8b504eb1c530450 legacy-trunk
+13705 64b15e9091a92bb635897cff998757c35504b226 legacy-trunk
+13706 5f5fc1031957aa5a42fe1b627a43c8e273561dd2 legacy-trunk
+13707 245d2b605036d14f149467c809b8ca35a1d2d3cf legacy-trunk
+13708 d6ab72cb16258e9c1111a558bfa4d6e751d5ead6 legacy-trunk
+13709 8175bfdfbea9e40f819f0f6cde6a9d732f6aeaca legacy-trunk
+13710 6c1309d82cb1141ffe31b6cf4213eef85ba5baab legacy-trunk
+13711 35e0d03f2b02f9f8c5ddfb310abb9abcfc5fc208 legacy-trunk
+13712 1e0b1967be7f3e5d94b28c4cd4f580516a034234 legacy-trunk
+13713 938b46fa6394e888e3dbd78c0938725664794a42 legacy-trunk
+13714 dbb8083f0ce71c39cc226db29617d0caca6941b1 legacy-trunk
+13716 24c5bc6bfcaafe8ee5b5f6694d647c1d3dc550e8 legacy-trunk
+13717 f6e6cdbadbb504e0c32be0a6f465a65c938cfe31 legacy-trunk
+13718 123c38da6f4383f83fdc69c3d5d3e66f90895aaa legacy-trunk
+13719 ecee9de79b1ef5734f8f1dcfcd60e1ca3aabe5d5 legacy-trunk
+13720 3d66a1971936980a5c0c9416083e3bd9d597d63b legacy-trunk
+13721 01c51b268c04961ff2ca5e6bdfe45aaa97256d7d legacy-trunk
+13722 c720318e3c49207817dfdb0c369c13999552e146 legacy-trunk
+13723 89961b6813ac3919b47ab92eaa588b0299420f04 legacy-trunk
+13724 c627734eaf929a79c62a335a9da7f6a4150f168f legacy-trunk
+13725 a8195fa329ac39bfc2a391fb2d1bca55531b4c1e legacy-trunk
+13726 1c8e4227d98791baa9d80999cd4c5835d66549dd legacy-trunk
+13727 4fdd33914edab48202965a28b9ce1140afb9275b legacy-trunk
+13728 e8b24cd17df23d872e26e756bfa36a3ec67d5710 legacy-trunk
+13729 c52fbc6bd38a917015b392d9c9e03a94de600216 legacy-trunk
+13730 bca2d14f3e3650f6b17d4233f8c1fce57894c4e3 legacy-trunk
+13731 bf565b18cfdc4fbad10f07eda8f9a382a1a20ea0 legacy-trunk
+13732 7eeeb0d2b0a401b1872827b05a5660fb66737e15 legacy-trunk
+13733 71e0b45d558c2f69e4b237175fcbb2c29245e6c7 legacy-trunk
+13734 9157c6da76193a153a46afddf7deb41017954e99 legacy-trunk
+13735 de8ffd2e71b5faead67022f380af9ae67bc16dd6 legacy-trunk
+13736 98d457383a2d3f4b05fc77a6a1724ec37d77fc86 legacy-trunk
+13737 c388f00affe7dcb3caa1fbcf36c37b5e23b39631 legacy-trunk
+13738 5fe263fb674ab1a0067e6cac090c440665aa17da legacy-trunk
+13739 a8b5a5b392fbc52c09681e0ca2c5a35784a3436e legacy-trunk
+13740 cf7cd7b04fa659a5c213a2818e0d773fb2fcd340 legacy-trunk
+13741 d5f46f599585bb6845f782ec7e9741ef7e172ca3 legacy-trunk
+13742 d5b373440f99a3825ecb87a4805603e738564560 legacy-trunk
+13743 eaf9eeab3bcff91dcdde1989ff5161a3a6ca1769 legacy-trunk
+13744 96501cc3a663b478532547c00b6cef5ad87f6fe3 legacy-trunk
+13745 b5bd3f979dc98c31cab65e5d07d7bfa1956528a7 legacy-trunk
+13746 4aae5afe1f144442f56eccbd240770c85722025c legacy-trunk
+13747 f406e78ec10bcdf6cefd9ca25fd99db2464d04a4 legacy-trunk
+13748 445cbe8db8f6f47e61762ebcc679c1dd6b617587 legacy-trunk
+13749 2d7331f4dfe351bc9fb8fae84b81b1bc1912d53d legacy-trunk
+13750 8bb27f4ebe16e5a974c09536eb932b3f98616cec legacy-trunk
+13751 3089461963c4b95763e5305c307a19b5e306353d legacy-trunk
+13752 ecfe3d8cb0c34710d6bdecee1a406fbb0434b5c6 legacy-trunk
+13753 2856ad5c679ae739c663112975ba5be306460649 legacy-trunk
+13754 9a66e7807c773419e15866b8f766e2186ef84f13 release152p1-patches
+13755 aa4c8e2ef5b429e9086ce81f67a8d161a93df5e1 release152p1-patches
+13756 905226471b4c7f9fb1909c28ff8c338933c02faa legacy-trunk
+13757 e01f23539b6ca8b32c50cb80a71a81e0d6d3b262 legacy-trunk
+13758 a0c520c1d12d46b5e94839a802c9c8dfec18b325 legacy-trunk
+13759 e773d2f0741dc5872492ee8e659948e96f128dc5 legacy-trunk
+13760 e0e67cf2fc64451980b541f2d257134b66d3830e legacy-trunk
+13761 10ebb25b242d7a0094a59a7029a77cf9d2fc6227 legacy-trunk
+13762 b69859b697639cedf569e57352dfc5be1dbed552 legacy-trunk
+13763 6dc4cc318a5c8a1033b9981838632cfeaaf82e69 legacy-trunk
+13764 e746944e9a4a676f9c83723b2f3f7d58c53c67b1 legacy-trunk
+13765 833fd2338c698db46343f76f0d78b10c67a159c8 legacy-trunk
+13766 0287f5b3224cc7817b3d4eff3051844afda631a5 legacy-trunk
+13767 05e0cb36914627a6922bb0350079c04bdc3bb325 legacy-trunk
+13768 7fb2f4562f7657da349b4fa1e3495775d20580cd legacy-trunk
+13769 779ce46e3430a8ad65ad916ce2a346df7dfe0f45 legacy-trunk
+13770 56ef4c2e0d7efbbd91ca58c0d6d3bfb46e38d68b legacy-trunk
+13771 577ea261bdf259aa32416710b01726a09886b5a5 legacy-trunk
+13772 4cc4baa24a4006e3df21b43f6571de3637dfa811 legacy-trunk
+13773 5f032686a3712d6cd83c68926341cb73bb94f654 legacy-trunk
+13774 0061ca4865d734c8e88b1cada6ce2309c65a28fd legacy-trunk
+13775 6aac31cd21025d8241d662540e76318867f948bc legacy-trunk
+13776 4385b1bcbc3b3eab91f439a0670a2614ef5c52a1 legacy-trunk
+13777 854b801253f0ffc6b7d72c01fe9d39fd5e4f5971 legacy-trunk
+13778 d13da19418eca8def277ac1816735a8992542c80 legacy-trunk
+13779 c9c188426e76c2e93c33cc301a414a5e5f6e8f54 legacy-trunk
+13780 e61c486b358a5045425550936d433b88b9d18fc9 legacy-trunk
+13781 aede7b2dd42fe0fe2d35846cc15de49ab9dc8b47 legacy-trunk
+13782 b3f1abd3027fdb9fc10c2cc5f29abdfe2174b12f legacy-trunk
+13783 2f07bc56e97e7ac75b4aa0021ffe91dae43f7f6b legacy-trunk
+13784 ecc8018a418c34757ae07257a55e5e177afb190b legacy-trunk
+13785 c6bdf032b7056e2a8dba82e1f0872efd86c2e775 legacy-trunk
+13786 0d73ce6d62267cae7433fed674136c3442b220d8 legacy-trunk
+13787 427c3b50058eab0c90a467801d83b6650d9d4718 legacy-trunk
+13788 26fbc80fadf25adc0e291eb782d01e819390e626 legacy-trunk
+13789 0d44b0dbdd951b1900df6dee158b7ea50d6bbb47 release152p1-patches
+13790 7ad4e398f3ea3dc242382feca1255b56ef41fa94 release152p1-patches
+13791 9286d3e1474c546359651341be9b8157bfada6ca legacy-trunk
+13792 2341be74b7582f7638a741dfd2854bb70a32d37b legacy-trunk
+13793 0a70a2c5d9e69978cea492e6303a90609c5dc241 legacy-trunk
+13794 eaeea9e423698a3277383392335cf30a2cf2a94d legacy-trunk
+13795 6968fdbb1a3fec93d38715b66b37df8314f0a333 legacy-trunk
+13796 810c25d5041c4a534b2f55cd17ce82dde0bed408 legacy-trunk
+13797 47171f2d7d585d008b282e86a777ac2caf226b1c legacy-trunk
+13798 31becc4325239e0df49420419c661c6df063d9f1 legacy-trunk
+13799 8336188a3c100520645398bde1ee5efe05cd9547 legacy-trunk
+13800 c0b86a44a1203a454f08f1c8b6b6ffa5e9cf4911 legacy-trunk
+13801 2b26e48a85a6a24e053ebeba8e6b7deb1fe80d2a legacy-trunk
+13802 3fe8d13328c8132934725515da85e4fe7298ada2 legacy-trunk
+13803 2e087539da604dcb595f3b34478742a077bc3bf4 legacy-trunk
+13804 2cc6a12cd4118e2dfb774ca6032e484a4d5ab8c1 legacy-trunk
+13805 92f7af42ed91c5aa75ae034861725782a00aaea4 legacy-trunk
+13806 201ac069b0d0b8a883fdb4785abfe64696812d9e legacy-trunk
+13807 ffcdb071169584ff97f1198e4da51f033e419205 legacy-trunk
+13808 efa75c69857d2b282fc8f8a46847157469c35bd7 legacy-trunk
+13809 672dbbc39ba0834b96c91c3a2b76662022bbe945 legacy-trunk
+13810 428865d00eeef552e12c0e3e103b6db50a9c54c1 legacy-trunk
+13811 2e20a0fc2c5f3b2b989948e2b99c75b7e9f4fd85 legacy-trunk
+13812 3b981eacad7b43934e9676a9a92afe28e363f1fa legacy-trunk
+13813 70cccca6bdf061e39fc345c45bad5689619fb967 legacy-trunk
+13814 a499d20a35ca2cead876d2a09eb1ffd1caab3937 legacy-trunk
+13815 cae4b09273b30c786d5bd31408875a3f0792300a legacy-trunk
+13816 adf6d21ccd7f1aa44d8c6c999e93d6d01ab426a2 legacy-trunk
+13817 cdd928d2293c282ef0b9fcfb2055d5fd044631e9 legacy-trunk
+13818 d4112d4c5bb183e64ab77dfe10c979bcd2ce31b2 legacy-trunk
+13819 98e303939b39e22eae27b6f216bf5d8cc5b67929 legacy-trunk
+13820 20350ecca6e4b1328168625dab922c5383df2e44 legacy-trunk
+13821 f67ce152719aafe9ca1cfb28e751e8b8ce5eca27 legacy-trunk
+13822 837fe75d6dc19e036021c80a2618702a380f4216 release152p1-patches
+13823 5189ea6e4bf6ee4231371bcd26d7574bd2eba11c release152p1-patches
+13824 adf87d13a0c1aaf113e9453fc0b8e225ff2940e9 legacy-trunk
+13825 f2c920d03f44ce31d397d807b0aea7c7acd1a0be legacy-trunk
+13826 ccdf5dc2acf652647b8844456c3b8231909dd369 legacy-trunk
+13827 964186745ea6a4d185698b7391e42318c3bfe02b release152p1-patches
+13828 d970af0cece9620d24711b6fc246d3b5dd0832f8 legacy-trunk
+13829 331ee4afe9bed86bde93101ed5ed55ae79397054 release152p1-patches
+13830 b7ad1809be049f0238c1f7b8e2b24f69bcd40ff5 legacy-trunk
+13831 78fdb6c0c0a151232827437363089ceddc0ff04e release152p1-patches
+13832 a9d28a07a3276f89939f3b6b41fdf206a6df6c50 legacy-trunk
+13833 d3696bf08eeea861d805993f7d5c2d1aeae555be legacy-trunk
+13834 c6aa32fb3cf8faf161d3754fa47d752069380524 legacy-trunk
+13835 0094bf18e68885b01ce5b223a820b25c790ff0c6 legacy-trunk
+13836 2560236ecedbadabb793a3c52c33ded414f6efb9 legacy-trunk
+13837 48f2b18bad5d1ffa13d6c84c79bd32abd98b898d legacy-trunk
+13838 6d646f7e1a1c7ef4b156e1ea20d11b61885bbda6 legacy-trunk
+13839 8ec6d2c6c5981ef265a4fd6d0b0e836932238cd9 legacy-trunk
+13840 7f175c323b8e46a8c5dde9170bd40f668d273789 legacy-trunk
+13841 8028908a98899123692c666d7fd6aa9f6e79b0b4 legacy-trunk
+13842 adb5b6ddc1e5ef5c7f04d0ead8ab7ee480e55326 legacy-trunk
+13843 424b31af6d510e155d815176f9fd8986d4ec0269 legacy-trunk
+13844 44c822a4d950186569389c75f3fccfb7259c43c7 legacy-trunk
+13845 15849feac3fa01dc61d0452d7f598171deee96be legacy-trunk
+13846 d3c4c13e0138c24cef4d0c711f20926ae8d6747b legacy-trunk
+13847 77b332dc2063644ef14a5423a4d04e855bc2de13 legacy-trunk
+13848 e344c1ffcdaf536e33285dcb1946a37bc14b219b release152p1-patches
+13849 423203aabefb48ccd66d68a7ccd5f1564be0a84a legacy-trunk
+13850 58b8d216d7214ce3c2b3e68d228db50d5eefcebe legacy-trunk
+13851 e6e45a60e1e0273af880b7380dc1fc7551470213 legacy-trunk
+13852 b44240b273cfb533dcd34723e6e411c127a4f213 legacy-trunk
+13853 b1bb6d7a335f4f5244ccaacea5865ad46bb8f18e legacy-trunk
+13854 15813076cbef6af571871208cde5204d7fb5d138 legacy-trunk
+13855 fdcb89d006954b8e939601932eb889107945e4c8 legacy-trunk
+13856 00d577e44d341e86b230ac2707c37d12f8cd5d4d legacy-trunk
+13857 a594d1e8cd1aa5a8206ecc10fa7e78c280d48ea3 legacy-trunk
+13858 83a986180f41d687e07a594fa85b1aee274f9fbc legacy-trunk
+13859 556664c639fc264ea3ea443cadee43921dc1f727 legacy-trunk
+13860 3c44028b919d4bef67ed49cf65bdcfa44915de78 legacy-trunk
+13861 898c33e216bb3607b17ef6111c156842eea9c578 legacy-trunk
+13862 b4d2f5465b3f898fd685e4c4ede652ea7bdb8341 legacy-trunk
+13863 05f68d7f91ac420c44127ed1685aa98c66c7f0d7 legacy-trunk
+13864 55a1ef9ebd4cdec69e5aa1ffc4c6d48961291af6 release152p1-patches
+13865 0ae24420c8a9f26fb00cd7ce717235fbd92144bc release152p1-patches
+13866 c1b725b1a14462cb31310141deda5115c0b03d13 legacy-trunk
+13867 c702a12d318d686c35d362778ff10c7ccf3f7654 legacy-trunk
+13868 ed1b49822f7055e382f9933f5c3a6216fa0e5efb legacy-trunk
+13869 082f42d5eae30ecd25e3ffa5d4a1b455614a11ed legacy-trunk
+13870 a2b963f7ac99070513c662fcf55e6c8dcb7e3208 legacy-trunk
+13871 595cb29a8867ee2ae669be1c84559511c51f1241 legacy-trunk
+13872 ad757aff8d3795c11e04d72b54efedf26fec50b6 legacy-trunk
+13873 4fdc9c1ecaf6b7ccffaa67b8b08f70df7d231a74 legacy-trunk
+13874 fad55eec5dfcda13f2b89368525ab96b6e55f581 legacy-trunk
+13875 f9ef368b8c2d3fade7cde58b9217035419551471 legacy-trunk
+13876 487622288f9c29945042a6ebe3be7dcb56482b5d legacy-trunk
+13877 3d154be871629ec6b6caa7f12c424eb67f0e62cb legacy-trunk
+13878 70adccd4523a491f2eef28b03f3256df3e283e4b legacy-trunk
+13879 334100218a4b1dd20167e5b8cae3b42f1310297c legacy-trunk
+13880 42941e2eb9d86a48f23dc2aa3d773279971e229e legacy-trunk
+13881 6f7507ef2b115a53bb9cf46b8f1a439ee828683a legacy-trunk
+13882 7ae5c4051041e5a03e87205fd6b7616dcd2c47c2 legacy-trunk
+13883 8b815805f10cb72bd8e0dd995cd25e311d32cb30 legacy-trunk
+13884 d83fa1dd7b798199483ab7b461c058c086c3605b legacy-trunk
+13885 cbc46284a5acb84cb53fb22206a936a3a269e003 legacy-trunk
+13887 4c6c8effcb42a12be25c8fb7705d2852155fb7f9 legacy-trunk
+13888 53b2974ed3d36f7242574f7df67850aff243880e legacy-trunk
+13889 10668e8a09756c14de78bd89ecf5e769dcc1689c legacy-trunk
+13890 826ef8f28782ce8d27219569672cedeed740ef36 legacy-trunk
+13891 cfc6515937a6954bdb812c5aa3342eea225fdc6f legacy-trunk
+13892 c5edd86e26980d4f99f4598cc1189015d8c334f6 legacy-trunk
+13893 678a9a79c7e85b72622e4dcaa8543cdfb51e2ecc legacy-trunk
+13894 03d1b98d178dcfe5550dd5cad70fead964e928b4 legacy-trunk
+13895 915fadf22941139acb3c81a4666b15b40884828e legacy-trunk
+13896 371b9762d63de455143d959228ab42377f82927d legacy-trunk
+13897 5d57c68b2b321274b7c09eb92ea6112c45aaa992 legacy-trunk
+13898 04f024d8541c8d59c749e8ef229adfafc984fc95 legacy-trunk
+13899 e555ba04b92276dc8851a0ee1ef66b956575afd6 legacy-trunk
+13900 5f46c778497150e0af701ed9de170c9a5ab4abdf legacy-trunk
+13901 be603fcba001aafe74283b238afd5c87d2f090f3 legacy-trunk
+13902 ca9bf6935c52a63e56940cbae5bbcbff9f1d3e66 legacy-trunk
+13903 4c7d6043b43a2894443364849aca9715bd57ea63 legacy-trunk
+13904 dfd2c7d34d443c6994c6055407be884310813b3f legacy-trunk
+13905 d345996fcb6521fbc934d418b043bb4c238268da legacy-trunk
+13906 25c0202e01a626381f1a1104e7a167b6507b15ae legacy-trunk
+13907 8fdac16544e1c7c678d9b5bdef69ba7dc3ff3d66 legacy-trunk
+13908 09e8aae16e99803297112dd1f8746091c05d4faa legacy-trunk
+13909 23f278660ca9a9253d4392c81ef48d81612269d3 legacy-trunk
+13910 8b63a6f7a523c4e15e5fa3178615bd6423a8bab5 legacy-trunk
+13911 b9bbe88d955477a3f40b4a8cf77f545f1ee8c9a5 legacy-trunk
+13912 29ce956fa7b75e7ae1362114ea4d07586171b935 legacy-trunk
+13913 41990bce023a810386c6e9679d08b1020d2052e2 legacy-trunk
+13914 8618415e7a66c71bad29f42f81e217948b900a8f legacy-trunk
+13915 d919cf9fdd89e72b11c4ef934a0b0e14e7e9fb05 legacy-trunk
+13916 7e05a7d0b511d5df058c52032fbec490c83e7c29 legacy-trunk
+13917 66216f32403d1a91b4626077c3656c07933e1bb7 legacy-trunk
+13918 040b05816b17f98110908eaf2707ec5b6d871a78 legacy-trunk
+13919 a10db5b6843f290d2bdca8c70695a05825c31dcf legacy-trunk
+13920 3229b138121e2a4cabf4337f64ff5553c9b053ab legacy-trunk
+13921 dc9f1f964690ba4058c1635120a6c9cc3e0daa62 legacy-trunk
+13922 3faa1218950eece33ea2dec8b266d401a767eaad legacy-trunk
+13923 3e3c71f4d2ded1e4f1febaeb906438c0399ca461 legacy-trunk
+13924 4ad14e4dc7e51600c09e945cf653860b4b75e5d3 legacy-trunk
+13925 1ef1807377bfa9ec8ad3d67b1cee51c85a4ea5e2 legacy-trunk
+13926 32c053c79ccb3c2ce0074806eaab51c48c60e96e release152p1-patches
+13927 aca7b5eaf5e82f8a0f00b4c9f9f42c398002ab09 legacy-trunk
+13928 c24c241853516ff2bf39d8f330ef460092808a22 release152p1-patches
+13929 daf88e8edbc0e53dabd42bab427daaef9761d4ca legacy-trunk
+13930 c208c4e9e2aacf8fd282546c8a89b271c6e09513 legacy-trunk
+13931 1466280e6bb0a3b41d340dd5d1c5fb074d5b3a69 legacy-trunk
+13932 c7e723cd63497cb9383942baa4025d0af26651b5 release152p1-patches
+13933 019cd21c8c9fcb65843c7a367279f5ec5d7e9c51 legacy-trunk
+13934 61a0f0215a976bceddc45108fde5263642526c3d legacy-trunk
+13935 895102eea4851a778c05aaeecfec4562e7748133 legacy-trunk
+13936 6ebf6938c887201762188b53f28744ff826d3cc8 legacy-trunk
+13937 5486dcf13d774cacd34631bd27a826bc364505a8 legacy-trunk
+13938 a14d9614da007e1a9306b4095286245922ed4008 legacy-trunk
+13939 0b2e994ef175a5977039f2c4477901df5d36502f legacy-trunk
+13940 4ca7b7b8a84916f5420a7655a9be0fd3dc8dd337 legacy-trunk
+13941 8c5ee3c3d38901bdf4c53631ed86bebb9d595e97 legacy-trunk
+13942 e0ecf1aefe04e2debe1f0d4c9268828c3a2eba7a legacy-trunk
+13943 650e89d1557f1460ff097174f1093dda9c0617bc legacy-trunk
+13944 87c5d0b3de59ebe01930959b5d9636491b06fb7d legacy-trunk
+13945 791cf717c0be4bf1bba61bd5f3a8757c2796a727 legacy-trunk
+13946 6c45171c1a1fe7bc8223f8b9b58aa07e2f3cbb17 legacy-trunk
+13947 4882b2e52cb249a895068f9ed16ba7aaddc831ad legacy-trunk
+13948 95e9698fc908c2d3ed44b9fa609e03b955f273e5 release152p1-patches
+13949 c161d2b85207fa78e00f9eb3af6c2ea2828637cb release152p1-patches
+13950 a5a513fee5b1db3a62143f5efe09e0c4d0fe6c58 legacy-trunk
+13951 53f69b8676f3c1e58f1ee9c88baafa400d786e55 legacy-trunk
+13952 bf368f2f7c006d5e773fe3434093632f4a1c614c legacy-trunk
+13953 525b5a9acfd5dde51c9ab95b7d8b8024a570decb legacy-trunk
+13954 f46c87b66154204a267d0876d822a4a4d21af3a9 legacy-trunk
+13956 507546a87dcfd3bb50ff883e33de9891611d86c3 legacy-trunk
+13957 b5511c017131fe629a24f0486e008f7b17a5467f legacy-trunk
+13958 061156451d36af821f89649c850912c89b259b4a legacy-trunk
+13959 0606682c7ebc35c42f2e11e758f81833b853f1ae legacy-trunk
+13960 24138ec3f396211e464c00892663c0419ae3a36c legacy-trunk
+13961 3fab3711c7dc687330946102e93bf2b2006fef45 legacy-trunk
+13962 fbc2c4858cce8a5017a0e12eaf32f5594e570e2d legacy-trunk
+13963 c8155d05d9ca6faf8e112c25f2e214dedd99f9f5 legacy-trunk
+13964 288740765088d35d6a94c1f19753df1dd384d9ec release152p1-patches
+13965 53b2f21ad67f0816dcb66b9b2a16b5fd78e1cd64 release152p1-patches
+13966 2f9b65b38af2df0751511f2181d1d016b1e5e03b release152p1-patches
+13967 c5821c3befcacbca94c1fd5405b0383dfce06dfa release152p1-patches
+13968 c6d099b4eb42a4419561a13bb61dec72a41c45c3 release152p1-patches
+13969 1e0fbe337518573ccef395a4bd06a0bc9dc2058f release152p1-patches
+13970 a60fa74aaeafd9a5a48d2ba106c6a8000720634e legacy-trunk
+13971 ca769d986514bb2902fb36a91187a47c82ec20d9 legacy-trunk
+13972 1ce41989a03d0aeeb4284e4e021bc4f4295fb227 legacy-trunk
+13973 41e0071db53a800843526ffe511883e1b59ebeee legacy-trunk
+13974 10ad370bc5bd1aa6ccc372da06aa4af6ae911f00 legacy-trunk
+13975 7a188aabef115c740c5e42c642fdaa3891efd7d0 legacy-trunk
+13976 a989ee872961c0687136d5b8ebb5de18cf3a30cb legacy-trunk
+13977 7fb8b0f13da0a09473a9c0f33900d0150ec73f4a legacy-trunk
+13978 3330eb8da22274ce0dd11e7e621eb1876a05398f legacy-trunk
+13979 bc085660dbc13383ba7b44442e9d4fa09fe899a3 legacy-trunk
+13980 f3086548446ec5b0742a73a3c3b8e07ba6b2afb9 legacy-trunk
+13981 9404a5b416b5f769d71d843bd6d2969d8802ade0 legacy-trunk
+13982 98997aa49164236422bc3e624f01cb3e7e54e3c4 legacy-trunk
+13983 84dff5cc721621c13e95d96fb192bfaf55b304c9 legacy-trunk
+13984 4fb893448a6b95a140cbdf3566fce231fc14c1de legacy-trunk
+13985 e3dc584e96230c4c34578847ee13a7f607b7f8a7 legacy-trunk
+13986 a316cf9f81a768f9d372dbde2bdd892f0dec7dc8 legacy-trunk
+13987 8edb81fa0a5f26d8650c3fc52831704583f47cbb legacy-trunk
+13988 09c63d913ae05af41b89bb5273e6d5b397c3df62 legacy-trunk
+13989 3d6b97a58e9ca40c4f8f3a89eef63f85a444b9d4 legacy-trunk
+13990 06670241a7b1da227ee6f25a8bc8162ab826c1be legacy-trunk
+13991 eb846b4d03856488e4a1c01cb34aa3a451f409e9 legacy-trunk
+13992 32a480d0823cfa1c43ea0927be29189aab062733 legacy-trunk
+13993 cc922a9a48c020b05f1ee57d47f8b365e3cfd7fa release152p1-patches
+13994 be25aaca11f456f4c110d38702db90ffb00c84d9 legacy-trunk
+13995 316be08c9ecda1d9fd2f7e293b216eb5880e9a63 legacy-trunk
+13996 5f18e7853d9243e2c2f355262ec1337367e4e2fc legacy-trunk
+13997 1dc3936e84db28161a60738fdc4ca5d8b1ef41e3 legacy-trunk
+13998 013dd38a5031d0b983704710d5adf5230f9167d8 legacy-trunk
+13999 0bc2ba1752305891846f0fdfc6ae6646c7948b6c legacy-trunk
+14000 90f4830e2122f2daa0c1f817256a1816550d4f2f legacy-trunk
+14001 f029d47dd2964a6c496982dfbe36a0d48fedfd3a release152p1-patches
+14002 5b802438d8fc8d23601f52da12e532713de5c426 release152p1-patches
+14003 3a506ab1c1389d0be7f9d7868bbf4fb753cf036a legacy-trunk
+14004 aabfa0d7213c3ea8c817a17c834d6f2272f0993e legacy-trunk
+14005 239ca4788bec0bfacbc07b74bfcee5891a263fa1 legacy-trunk
+14006 8a6871e95d80b0ea5184cf711fb0d2e6fdd52732 release152p1-patches
+14007 cc18b24dee3db79f977ab22ec58f3918d5fa20dc release152p1-patches
+14008 2d79b491a529c549a644852ee5aadc3085583035 legacy-trunk
+14009 e0fe4c7a9eff33debf0114cd7b3e6704e657e3bb legacy-trunk
+14010 0a3bb403a4305a1d09532714938b8a6942ceb990 legacy-trunk
+14011 38c7444f633ab802fa50472d81c19a32223df161 legacy-trunk
+14012 e12be8f5188fd762535446c73980c2bde4a74394 legacy-trunk
+14013 a05a056029028a80583d6afecf2483eb3bb21521 legacy-trunk
+14014 e74ef2b505556ed3dee8ae01190499e3b2fbbc45 legacy-trunk
+14015 7e429e46968a2461a1d3e9d0b4db416878f94617 legacy-trunk
+14016 42698f345bd3040c42569f224984a8cf5a70e2af legacy-trunk
+14017 ef03f16ae5eb2753483c06e24ae778f5527946db legacy-trunk
+14018 6c5e12c5a6164d2d1a8b45146fca67e116a68666 legacy-trunk
+14019 12f462fd24f753ee252ae6a27fa061c75a7f51d8 legacy-trunk
+14020 d0f4a79b985d4dfdbbea5c60161277752679f474 legacy-trunk
+14021 2459f11761f0957d88e8cc0e0c7ae569e400f1ec legacy-trunk
+14022 95a9833b000e97dfe2adc121ffa280f347c30886 legacy-trunk
+14023 17e12305973eab0a7b65ec1790c5489e0ce27040 legacy-trunk
+14024 aaaee7b23380215c86b950c11e4a5a0441c5cb9a legacy-trunk
+14025 6980d06e36075283f85044888915262c9da50bd1 release152p1-patches
+14026 6757e80c74783269a22a058721ac9f6f90cfbda4 legacy-trunk
+14027 077ff6efca35e84612951a7154f624a4a5d4b599 release152p1-patches
+14028 a170b7f04c647a1c4d15fec0513980d50213e3b0 release152p1-patches
+14029 ab2a6f910f653120962fea2a111eea1e81fda795 legacy-trunk
+14030 a2673a8bdca282425a9f4799ddcdd0e4157c8b41 release152p1-patches
+14031 148fd475b393dc72bb828761dc651fedddef87be release152p1-patches
+14032 b4d07beac09beed573ae3b359c100c79dcb283ad legacy-trunk
+14033 1855131a4dcd47a040fbac725172f8dd28de6b24 legacy-trunk
+14034 c05363cf1b73b0f25fc716426260d999a26e5cd7 legacy-trunk
+14035 96f3ebaca6ae580f112e2a701bae46c6875f73b5 legacy-trunk
+14036 4f2768933313ad4114c606643f6f2ac43e3d597a legacy-trunk
+14037 09d351882c510f96f96abded041ac609a541926d legacy-trunk
+14038 af11adc3cbd717c6efea8f3d7570dbc6d3303af9 legacy-trunk
+14039 8b46ee325dc03e628caf7712bf30506bda382fbc legacy-trunk
+14040 c9cd4bbed8e283e265711d98e61cb74232d69ea0 legacy-trunk
+14041 f21f19886ee38f5f8ccabaa8a2507835b6643361 legacy-trunk
+14042 5c5a3a5cc79fcde62d1c48fd0aef3c45ce70184a legacy-trunk
+14043 e2408744dc7f39e769fb692616bc37738aef60ad legacy-trunk
+14044 bab46aca2bece66034b81e4dddc4ed22667af166 legacy-trunk
+14045 a97e625ed5d04d05d1e0f6d8c9634695db278fa1 legacy-trunk
+14046 7dc927204d6582e12e39769d2dd508e42a7813a0 legacy-trunk
+14047 0680e67a0d495737d2132c07ddf94db87f688ebd legacy-trunk
+14048 6b8f746bbd5aa02a23b0cdc3bc5a056709be6c38 legacy-trunk
+14049 34b6a92fa08842fdc770ab20c0fcf183b870e54e legacy-trunk
+14050 9cdf3fadda9276c62a514bd5a55873335d4473fd legacy-trunk
+14051 58513eba566430065430108bb342bdb0fc42ae1b legacy-trunk
+14052 bde06d9d4cb4f162fa81f6e11732a05812dc6604 legacy-trunk
+14053 bdae61aeba55e8738ce3f339657fd816772a61ad legacy-trunk
+14054 7034b75aad03b7146ff515e66875a239feff6419 legacy-trunk
+14055 3b20e50f2d83a3173d3a2fedf5dbee087cd357e8 legacy-trunk
+14056 d023d1c9ac49146f11875ba955defb19f6da6ae1 legacy-trunk
+14057 ceb06de23faa92e1e5a1d81f22926eb8758fabdf legacy-trunk
+14058 612b8230c6e7fc69701f41c89625640f20c36b97 release152p1-patches
+14059 02ae2e555ef9d26efffd476670780c2c11c68f37 release152p1-patches
+14060 59114be21a75f897cd4bd87a9a8a71407fbaadd9 legacy-trunk
+14061 dfe3719d78e9dc6eeacbe364c40de6baf7444db1 legacy-trunk
+14062 33f7b12c776cfb6d94f3dfc5a192c8f01944c6e9 legacy-trunk
+14063 cde8837c8259ad09d26ffc46a1e595557f56cf43 legacy-trunk
+14064 923b43db381462b2f743bbe88b04a0fd5a7fd16f legacy-trunk
+14065 16b11acd3e8c3d58d3f8cd8c1e3f812cab465b1e release152p1-patches
+14066 756351707cacc5bcd0b9e01dd0c970ff64f6367a legacy-trunk
+14067 d7199b9f90912aa3754208e407e58b9f2601b87a release152p1-patches
+14068 4c5030d42c6ffecd327e93ba6be4e5197b21ada5 legacy-trunk
+14069 b04bf2774d05edc74e519b35b75089063599782e legacy-trunk
+14070 7efecc5a394c69a7fd30064d4276fa5ae54c2ea9 legacy-trunk
+14071 7e5f51dc1b4b9a149570346349351d1697821283 legacy-trunk
+14072 9636a502f7917d1d0d22c7d305ec9b74c683df55 legacy-trunk
+14073 33e8e7409b1202031aa49958d0350ee5031dc25d legacy-trunk
+14074 ca88e59a6ebca3b8d31b1717e42b5eb61f28a82b legacy-trunk
+14075 3b71cdfa02c742c262d8ac1962d841161a98a7ba legacy-trunk
+14076 c7f0aa4510e2638e04999e18e3e4e031587204cb legacy-trunk
+14077 da6f1693cd6513c03207783aacbdf46f32a2803f legacy-trunk
+14078 9eacd29e606618042de5284bc083ffce335e9e2a legacy-trunk
+14079 3f274478c4daa989d0767481879d1a59be58acef legacy-trunk
+14080 53d9c1560fe14f3fb9404a579cc01ebeb1233a2e legacy-trunk
+14081 664386d6967caefccd7ac9c2a247936742a322c2 legacy-trunk
+14082 9ca30453dd4e4e4761bfedb25330b13129ad397e legacy-trunk
+14083 f9f75b212da4189cfaf2750c9655fa75cb09a26f legacy-trunk
+14084 01f7a136c677f11983c25e2e37879c3cac1f41f8 legacy-trunk
+14085 175d7f6804d7a3b6c93ada467d2b16e07ab65dc0 legacy-trunk
+14086 71281ff8c6a2ba560916440acc28bf191ef95c52 legacy-trunk
+14087 cc412dfd79f77c7db088a2bbc14b5956e5ec21db legacy-trunk
+14088 16fc717bea3c9aeb3806307f39ee651b6c6f44a5 legacy-trunk
+14089 c0eb63c8f1febb8ca98f30b91ac61ab91ea7de9c legacy-trunk
+14090 ba07fff72511b2c9481c20e7f67be670916556ad legacy-trunk
+14091 4dbb7c609ac1f5b5d013737eac9a826d57ee8239 release152p1-patches
+14092 cbf58cd0bb5742929292664b1c9276ea30adc98f legacy-trunk
+14093 82fb02de542113937c43ed7bdc3b060c49f8d723 release152p1-patches
+14094 5a2f13a7bd45f0793185130212cdd9aac1be70a1 release152p1-patches
+14095 80ac07681abeb123be18ada1363aa4919ff94cde release152p1-patches
+14096 9066f627d362f1193540e4504416cf412630bec6 release152p1-patches
+14097 b5bbccb75f2dd935d6ed5bbe04c2294cc69d896f legacy-trunk
+14098 a46c9cb42123e9e9c750d1f5ce5c7e59363ce342 legacy-trunk
+14099 b12a11ae123cf85b09d9f2433bb2d29f0983e327 legacy-trunk
+14100 5c135ceab20c544dd00a58f17e8fdb9f51d8b658 legacy-trunk
+14101 761d25cfc259412d58fbe09755c482db3ece7352 release152p1-patches
+14102 f886fde765a05700449099bf79137c61b2fb0943 release152p1-patches
+14103 28b8585354de5808943e8e393221fc8461279df5 legacy-trunk
+14104 535f40f9f87dc6798897723470dab3dc94a6f5db legacy-trunk
+14105 f83b74273da23a008c2475573745b26b9bedf2a0 legacy-trunk
+14106 80569d7253291a00e12a5305060bb00ca2517246 legacy-trunk
+14107 8cfcd273fa5ca2b644eff7b7de10955d8d315db8 legacy-trunk
+14108 2951e2d278522ed4037cb8520fd54eacdf8a61f9 legacy-trunk
+14109 a83d2a1ce197a39a722ee82cfbc34a251a9c535b legacy-trunk
+14110 68364bf002f13890b2a8d54594b1ad165a826c7b legacy-trunk
+14111 bbd3a8ad7cb766729a6c164bd74d6b34b94d94c8 legacy-trunk
+14112 b3e55ce0ebd75f4b38a489c4b9db467e60cf20a7 legacy-trunk
+14113 afb987a844dba2178341f46114c89e6b1394fbd8 legacy-trunk
+14114 260d40f200778fef8c2b0d93c4cddfb1798ffbc4 legacy-trunk
+14115 4c693eb323c6f31732ef5ed8c36bedd0746143e2 legacy-trunk
+14116 50f7d345f157a6e075d17d5e4084e09f8d9f5b2a legacy-trunk
+14117 b605c466d1c0e8fc1663cfb066f25d240ce9eed7 legacy-trunk
+14118 18fc08fc9fd478e2dc62178873e24ede1d8346de legacy-trunk
+14119 8d4ca7be73798c9700197607a84f27a0156381e7 legacy-trunk
+14120 90ffc07f5d10f01d6f24a15374aef94e840bffea legacy-trunk
+14121 7555990e8db9a413a2462edd928c87a278cd1a68 legacy-trunk
+14122 f701e9163c76d135299e834bcac93af2bc0ccd4b legacy-trunk
+14123 236d8428c4c50dbd1b28ae0e0ea8da176165f728 legacy-trunk
+14124 c042e4140f1ee3c89ca4f61ccb3f1763eec38633 legacy-trunk
+14125 73ec66add9478deccdfc65b7e08f551452bd25cf legacy-trunk
+14126 8198c531bbc47d58191b4bc930782f0834575b21 legacy-trunk
+14127 eeac54cbb1dced0ec9761dcbd0538724ac169373 legacy-trunk
+14128 8943b77f219af172601691567be3ea7a982fe270 legacy-trunk
+14129 39d66a067d0bf3862313ccb98ea3aa3e9f01eb7d legacy-trunk
+14130 bef86686b752b7aa18221638ae5ea996074eb510 legacy-trunk
+14131 7a4f6249c9787dc6ba291672b09ea05251fb41d3 legacy-trunk
+14132 b17ef54c91c41fe2b403cd271c570c657c079425 legacy-trunk
+14133 156b1bfec3b89d7c0610ea7af72a036d6916fcb0 legacy-trunk
+14134 4520f693b765f683293faefe2dcb70e79dc37c11 legacy-trunk
+14135 22f4cf16b5a31618b332d8528e677271e7602b54 legacy-trunk
+14136 2cb56e98cf523ac5e8e335442a8c9bcff59812cd legacy-trunk
+14137 1e7efc18a89db451502aec1f4ebd472c66f140a7 legacy-trunk
+14138 c71155ce12159faf2c0ad1832d8f130333b87153 legacy-trunk
+14139 ca15ccc26f0c2db592ebf7f24b5a026ebdfdd939 legacy-trunk
+14140 8efeb871215b48f1a3cfaf215ac18f1f61a9551b legacy-trunk
+14141 04afb87d1103d12fc647b0ebb067f93ddd946724 legacy-trunk
+14142 e2660afdc381b8c65f18ec2cca4a6db89dd4f0b8 legacy-trunk
+14143 5255d05040c2522275dd335482107f2eafe0d397 legacy-trunk
+14144 d4731e43fa6053a42c43a09b00153f0746c74be3 legacy-trunk
+14145 6abc50bb47074d38bc8aecba38401271cd85d598 legacy-trunk
+14146 885820fa7e318778ab76bffaaee6a661d484d5fb legacy-trunk
+14147 07d2ea71acdc660062ddf94cbc0dfd87a3d1a2bc legacy-trunk
+14148 22c03ab4fb16525d5332afcb321fa800cc73c583 release152p1-patches
+14149 6adc3c5fa185a11a9ec436fa8511f1bb70ceed68 legacy-trunk
+14150 c5abc81dd1eed902448d5f0358abbbbedbc3a464 legacy-trunk
+14151 fd0d31c346b2bb4983abd038646b1a6b5a1ad638 legacy-trunk
+14152 55df3703c953b67e06d50ce5b3d4208d670b3fcb legacy-trunk
+14153 f57ff4289fc64b6b8d26de61431f7e0d67f79f48 legacy-trunk
+14154 57c1685acb1673eefe402cabff0721517ab37f1f legacy-trunk
+14155 4c3e55c828d3be3a2fc7aceaa0026be0f3a6b239 legacy-trunk
+14156 49d6d30277da77c9bdf49da42abdab0821bc3c04 legacy-trunk
+14157 66aa21f50ea3510cfe0ac29a5f937059e781413d legacy-trunk
+14159 3fe27bb2f119340a0314debed0225fc2edd969e3 release152p1-patches
+14160 273a5e9aa633e303e2c6b7e9f570141213954f8e legacy-trunk
+14161 86a163a53b1cab7e89484f42ed3b0aa3be6cb8ad legacy-trunk
+14162 f3611cb3a261737421f19e927aea8e6ef76304e6 legacy-trunk
+14163 1775900db108754f6f50bee39b39967564b7429c legacy-trunk
+14164 57aa277d7a00de7e31dea8be0831c7a78559fdd1 legacy-trunk
+14165 c6205bc710ee8b2b1d2dd2f3ed855586482253b5 legacy-trunk
+14166 3ffdf05f5635df3bc48fb0b203f883e9ab217348 legacy-trunk
+14167 af5ad5edb7a5da1f018de79caaee9bc5d53e0e3d legacy-trunk
+14168 4bd4bd3b597abe65f966b7bc98ba78e9ea87f42f legacy-trunk
+14169 648d97bd3ac6c3775c8d41de80b45ab6916d3b9f legacy-trunk
+14170 1131bfa1ad99323689df7a23c2c7dcdc1616a66d legacy-trunk
+14171 1b2e3e2a243793f60da02dcf95c8d6039f8d38e5 legacy-trunk
+14172 cab3ff551f4bc62654e28e1aa7658847a6e60a3d legacy-trunk
+14173 f24965e77b8556bad5def0a04e817a60e93de3b1 legacy-trunk
+14174 e0e011e4073c5a5a2db134f3b5edf0a0e904b188 legacy-trunk
+14175 15e5bd89395a7d5207d2381f72be318c2e73caf9 legacy-trunk
+14176 238b439882e523b8d5906e9ba160097cd72d6e12 legacy-trunk
+14177 01171be4769d13e4379f5b747efde87d3ca8fffb release152p1-patches
+14178 770618d9a7fcfa0d78e2ab375fbff5893124d037 legacy-trunk
+14179 78fe87ce0ded1062370360994d37744d5e3ad5be legacy-trunk
+14180 14561e8395bb9defe853e0693f23811c22078db8 legacy-trunk
+14181 0bad9d8b945f722394ef0f17227960230111d19b legacy-trunk
+14182 5738ad7371144739a2ef3c3a4f42d82d0ba5c4d3 legacy-trunk
+14183 2aab4748401222e70b6d7e15b5032ee90c4475ce legacy-trunk
+14184 1cfd81768e7035d39d314780b27a384f85137bd2 legacy-trunk
+14185 ecd66798cf0bdbcd99f39bcdd65520dac7c6eb57 legacy-trunk
+14186 13daad8a6eee108c84193c730d1b74a486a9b4ec legacy-trunk
+14187 69216c11a1bd7c66f224d934427870f582c1c88e legacy-trunk
+14188 9ec7d978800d266883ffe8fc457a212d5078d226 legacy-trunk
+14189 b360410d63c6771b818c7cc6bde7fc99b44aaf91 legacy-trunk
+14190 6d8cb66cd2385645c0567a068dd67bf276614243 legacy-trunk
+14191 08313ac17cf3dac662527d123abb201c04d339ba legacy-trunk
+14192 675284497443e229691089a0264ca0bc09197d66 legacy-trunk
+14193 20af02a57a5f1e35814897a54459e366e9626bfe release152p1-patches
+14194 68c259b6e6cdf8cd3a5feb7e2f33fbbd1234f5a3 legacy-trunk
+14195 590272abe69c85bc3ffc05d2db88067e07241b3a legacy-trunk
+14196 bb1f43f25ce09a53b9baff3d054a9e40b35fb199 legacy-trunk
+14197 a70dc73a28de0932450b44b92ff68e64dc4c9a1c legacy-trunk
+14198 107ce29b04a45d848381500576562a694957d944 legacy-trunk
+14199 528559a0b2f2520e9871d9046cd83df4aebb9667 legacy-trunk
+14200 91245dc940ebaf021f4378e6ebecd338c19fff80 legacy-trunk
+14201 8cf7b23fb95516e03cb1902c26305ace73310c24 release152p1-patches
+14202 c87b861c6ec60611b7309bce012178db0cc6709a legacy-trunk
+14203 0ec803cbd87225ae5f03f4e7fb8d7d46046c978d legacy-trunk
+14204 65dc082f7004a1d3fa588da6803df2136588ba8f legacy-trunk
+14205 6f2119cd99d256ac67e7823835f56719d166529c legacy-trunk
+14206 3c213e372b2289f787a3e6b2944da71478e0818a legacy-trunk
+14207 92c53b0b2ee5a0d690c5508c9d7d92842425775b legacy-trunk
+14208 c6e143dfc5a332b0590b0b5cc4f88f1af53be85c legacy-trunk
+14209 d4ea1361731b63560a810c605690c55b862dda2c legacy-trunk
+14210 47f93a969366aba6e40399c84ea0b510489d97b2 legacy-trunk
+14211 d7e96cde6b47bdd3fb56653b7b63acce1c246bc6 legacy-trunk
+14212 c35eef8a2171a525dfc73ff3fa06012748583304 release152p1-patches
+14213 4e3095c4aea0e77bcdbaa61226cc580c5473aaee release152p1-patches
+14214 dfe2bfc8050cb92938ed64f37ddeba4f90b44e7d legacy-trunk
+14215 b8273e5de374bfb077133f7dfbbead497c769001 release152p1-patches
+14216 cf7a0f1b7b48b6c8ef80a864be7f95915b193fd3 legacy-trunk
+14217 4cf925fcb5619e6b6767f4cd16df5042e7bed60b legacy-trunk
+14218 f4cc603dd7991b31c41bdd31ff6f756bc121a9ed legacy-trunk
+14219 817589156f21617f87dfa2c1e413b3a74b1a38a8 legacy-trunk
+14220 778546dcba052ba0fbd5dba451d1d0f86c5b5418 legacy-trunk
+14221 3322988010b5e172d483145e42cceb00955f5fa2 legacy-trunk
+14222 a7f27f303995db54e214f8ba78756e0b69f638b9 legacy-trunk
+14223 a94c296a6fcccc81156d7eb02e206b0b9c6208e2 legacy-trunk
+14224 cf7fcb0c5bde2b1f539865dd54f512e68bec5c50 legacy-trunk
+14225 1fc8e6673b48ed2623c3ecc21500a4507aab7eed release152p1-patches
+14226 84fd31dd4b121b9a721eacece67a0ea24ed21fec legacy-trunk
+14227 a7df7d523d2935ba76258a75fb4deb9c4273c9cf legacy-trunk
+14228 bcb0d639acf21bd24d1d4eb3a74d5226f0870135 legacy-trunk
+14229 069a1fd40abbd75d67f92ae9239813f9552ba1d1 release152p1-patches
+14230 86890c073c3bfbcaeba23dc1bf8095710f82b421 legacy-trunk
+14231 1dcf9b759374f213aa79c2802df20f6cad5a5e54 legacy-trunk
+14232 4a3247eddc43869cf02f144a4a0415bebc7f85e5 legacy-trunk
+14233 472a17f2ca9fce31702afd5045e6adf7cda136e3 legacy-trunk
+14234 c0d4ee9391b6822616df0d7c4be44c3428e53927 legacy-trunk
+14235 d0934a8038f6a967bad89d4e541bf52a48402fe1 legacy-trunk
+14236 8705ea390dba052b094ae4a127bc2acbece43deb release152p1-patches
+14237 ded96367e8ca72beb2d485add9e1abb39da4109f release152p1-patches
+14238 d33520820fafac4daa9d12e1d574ac39d6300ff5 release152p1-patches
+14239 e8276733da8fbe8c8d0f615c1873cfa7e3a95a9c release152p1-patches
+14240 0b0194d4352f3124c8de25ba6684bf49e221df43 release152p1-patches
+14241 38560a3a324912c5691348e8597727c0e807c0af legacy-trunk
+14242 99a01cb3ddb5ef5d15bc41c073aeba0f3715d69b legacy-trunk
+14243 d88996e46cb2ce011f0efbd0197576a3f810088d legacy-trunk
+14244 99c9b126690dfb0502358476b0a1d6dc827c6165 legacy-trunk
+14245 4c3ca6c05bcb321f8d7fa9b4082f3e536c76f0df legacy-trunk
+14246 0ad23324016e4ed312fb97d4603e560d31f37993 legacy-trunk
+14247 fd5cead733b68288d093100d158c1cd3e823a720 legacy-trunk
+14248 db756d31e727a3bbcd6e7c5fa24249bfa3918e0d legacy-trunk
+14249 023ed266307463cd205ff1d82dee9f2b112acc5c legacy-trunk
+14250 0d27e8d8f04c1a2029644ffa1ec3d7ef556b478e release152p1-patches
+14251 676469f75ae6723d71b65c6ca11208b6864310d3 legacy-trunk
+14252 ea61044f98aed862f2e9870d60d3f260d6ce2e4d legacy-trunk
+14253 ad85940840cbb5b588b7c282aa3c830e24c8abe0 legacy-trunk
+14254 b896c12c2eea5ca349705d8f7b16d634de25c905 legacy-trunk
+14255 c434f9427c9b03c519c47aac87f05079d971488d release152p1-patches
+14256 24f814d9e3ff54545be27f7d94832d7305811ecc release152p1-patches
+14257 00017225f077955513c7682a5701afee32a0ad99 legacy-trunk
+14258 2ab74b193286d9c8dba61da6f7fa836011cb4c26 release152p1-patches
+14259 528ef38b3d3a767a2a845ed74b809e2bf9db6b06 legacy-trunk
+14260 7fdfaaa6582709643152f7f32822b260cb664543 legacy-trunk
+14261 e998b350a4bb1da12bb8ecec1689cdedefe78a63 legacy-trunk
+14262 8283554f1319a4d3ad0cbd24c143c6bcd6a3a3f0 legacy-trunk
+14263 7709c98353828c2bb23babdead2708d31fe7686f legacy-trunk
+14264 b7f262873be04bbe4afc984f6626b351dd88de02 release152p1-patches
+14265 a2386b9f474d8ab1a547fdcd6370b96dda9ac6fc legacy-trunk
+14266 95511f39319a4a1f79a4009d1acd55dd15886b3b release152p1-patches
+14267 b800e36aed4ebdabeccddd285e20fce11d2c23b7 legacy-trunk
+14268 442d4cb440c882288781061114ea5cab9437bb2c legacy-trunk
+14269 dff7a03e7d24eda0917a8fe223a25e67b1b21b55 legacy-trunk
+14270 8afd6fb588ee7b9c653fe82251f60b4baaa36253 legacy-trunk
+14271 5e6e9e893acdcefd43aeb5396feb31fb0d9ee554 legacy-trunk
+14272 a126fb5c62dc747884f8268a8f1f9dfb02336482 legacy-trunk
+14273 48370c67dd9e6c7fb192da3280dc62d5265c922e legacy-trunk
+14274 489483b65b3a3eb1bb9533843743bd409a4f6169 legacy-trunk
+14275 69c99516227064741ef5e70f36bc20635197c23a legacy-trunk
+14276 0756dfeec4eecbd8377ed5143c8d0be434e1ca12 legacy-trunk
+14277 216efdad9a4b6ff6545eb37aa50f8e17cf3baf5c legacy-trunk
+14278 ff91985362c7cc0d25bceb02a417ea3eacdde3ac release152p1-patches
+14279 f94d66016921e9d0e06e7a3f9675bb2de03922e3 release152p1-patches
+14280 919b37c52a842a265d66fea6807c3adf8e84bef6 release152p1-patches
+14281 cbf44102d42afc5db82b861d4d2d3aef8882313e legacy-trunk
+14282 6d1d5f3cca5fb62b978a69b5bbc011f794f78d73 legacy-trunk
+14283 67c6239c7bc7afbfab515d1ab1adc854f6ad88cd legacy-trunk
+14284 47f75a17b10374b2cd4cac60dcbca400b61f5d7b legacy-trunk
+14285 a94713d6d9f6a8300844c22a4ebaacbed58d84ae legacy-trunk
+14286 5efb62acf26ef3d93f7e62eb77b7b4deb7651fd9 legacy-trunk
+14288 b5aec33790c8e5525de4281820dcf33b21d3478a Distutils_0_1_3-branch
+14289 93bed60355e4e9e584876bbf224e0d8caa7dc4a1 legacy-trunk
+14290 8b348187e303326c40403381ec8d118c8576762a release152p1-patches
+14291 ef1e63f77445990abd47bbd8305a236e83dbda51 release152p1-patches
+14292 f680ab106e861e07e26b515152f460a3820df53c release152p1-patches
+14293 47d70f4f635f310e91af4f3d3314396650bcb906 legacy-trunk
+14294 1c4354bba42b9a19beddf207ab8965cc69d380af legacy-trunk
+14295 09dbb47034e0f52bf90df19f947976db79e32f56 legacy-trunk
+14296 4c16f425c712c42370ffe3b8713ae048a9f0c165 legacy-trunk
+14297 e3499102257175112a01caec313bfdb43c3a2f43 legacy-trunk
+14298 f4f9b6b44e9e47c73881623c5038724e3ed9e705 release152p1-patches
+14299 0dd520f4dce8dc1ddd46b50c28e37af48ffc888e legacy-trunk
+14300 8f88b31843abc52449f0f4ca7d833b004a885431 legacy-trunk
+14301 890b11aa2ebc72f8684e0b8329cb1bb63c2cd549 legacy-trunk
+14302 de44f511768ac6670da54cf1d6ff703352dcc327 legacy-trunk
+14303 b0eb421f8ae9beb7d8a178ae3fc315d6c7b60b84 legacy-trunk
+14304 5883713e2da3a61f139a4cbe8e8562e231e492de legacy-trunk
+14305 dacaa34dfca46f943c0b997fffca8b77bc47117c legacy-trunk
+14306 d36d312cf90bee860dae77ab12e6d73e0e498fa7 legacy-trunk
+14307 ff79ee43b8a1fa758e0d994ba23d14897db8cb4c legacy-trunk
+14308 86e7e5ecaf7960b16313889dd8d6502bfcbb270b release152p1-patches
+14309 497e011ef1a325c075fe2fff27835490570ee329 legacy-trunk
+14310 7f29339ec3a50a3a53423a233b6a8d1a42956201 legacy-trunk
+14311 34f53c36ba9a1b1d0c517e5282c8c6c4141c9257 legacy-trunk
+14312 716fb59548be49fc3969a4fbdc4810b557e03c1c legacy-trunk
+14313 d10c108d3fd7621252f95ddb13364ee6ccea6c29 legacy-trunk
+14314 b6f52c1ef6da8a8acb0f7266dd1cf4f68a1cee26 legacy-trunk
+14315 6f4146846337878c0bbf14982b2c0b401d53d87e legacy-trunk
+14316 4a23cc49e2b064d9d26f3a40c4497a53e09dc8b2 legacy-trunk
+14317 d9000ee959e537e8d928634c1f20719da7de6287 release152p1-patches
+14318 5d625a365e7657a292803f2cda29c9e855adc2d6 legacy-trunk
+14319 38c4d61db7ea1f91084b351440655449a0134f59 legacy-trunk
+14320 6546ea06e15709925571a49302f1af70845a7b89 legacy-trunk
+14321 9250e5d3aa31fdd4f9f6fca191e1ceb607209be0 legacy-trunk
+14322 abfa1cb1ed052a542d2a86a9f9141e2100c5e339 legacy-trunk
+14323 b3223f03c9ea88df95f665eb8da0afcb8e17ca03 legacy-trunk
+14324 627b4dba1192e25b098b03c1f94b4bc1c65ecc8d legacy-trunk
+14325 e425556e698ebfa336a9f68d45c10a151d8d1d1f legacy-trunk
+14326 e9169b19e9e5c447c65ad9eeb520f47315c63f7e legacy-trunk
+14327 1163a7a1cc679b820a021ba8966bf5fb87a627d6 legacy-trunk
+14328 839f8f86ccaa3aa1ee31d9419bd9170fb419a8dd legacy-trunk
+14329 fdc9eeb89e0b30e6681a4a24e60e35418d122f7a legacy-trunk
+14330 eb381ff17a3198c2324c644f3164260a6eeba7e1 legacy-trunk
+14331 422337c3229adea1f7761a03abfe35eb6c4cd7ca legacy-trunk
+14332 676e647b1be6b943c985ef562b9a186074217562 legacy-trunk
+14333 71d038db0dd23c2f1204542e3b0f01a4d5004055 legacy-trunk
+14334 b7aebc84cbc164a5e00c9dec57f8aefe73b99b8d legacy-trunk
+14335 a532932ac408387d194ba57ba27cf2e1d95d28c1 legacy-trunk
+14336 1e952d933abbef5d3d9be2623e9d4b0259d106f7 legacy-trunk
+14337 985723498b1ba642cc2695e60971e8b9bf8e6d29 legacy-trunk
+14338 6025b07c5c2966e56c370c9028b0594aed3d9b83 legacy-trunk
+14339 0b46d250e199cfa6e8a71b3082cbc92cddbf06fc legacy-trunk
+14340 72ebf91daa05d5a730fa37391b5aff0c537b6d9a legacy-trunk
+14341 c976d693ddeb36405cd9718034aff9e6efa61c15 legacy-trunk
+14342 78f0098812b74b257b25c541b02e0405539d9702 legacy-trunk
+14343 6a99ff069457d718d4189100ae5eac37d11c6c3a legacy-trunk
+14344 89d308fcf6f458363b4dff032c6945fc6e9c9316 legacy-trunk
+14345 e19a350994b75afc1bd4791c2c1b7a05ffea2bd2 legacy-trunk
+14346 653a9350a81733969b3e702763fda5e04d07ab1b legacy-trunk
+14347 83d351f948ab75cedc8a6e6fbe32db8e4b1975c7 legacy-trunk
+14348 a86bdfe4572584d6c6c66a2b29c8b9dcd0b7bc12 legacy-trunk
+14349 23e7d9781013115693cde029403790930464e068 legacy-trunk
+14350 da7f5f6a849d0ee8a82ae7689cf34cb80812a4de legacy-trunk
+14351 840e18eec07f4f55c8739022a3b5f56c34cf920c legacy-trunk
+14352 c978a23a4dab107591e8d0769f07abdc17f4516c legacy-trunk
+14353 3c77d6c5c8e9180f2fbb9fbc09362d8b7468af08 legacy-trunk
+14354 45c35b5376e4bdbb5bb3a61db70ab88e4bd5fa9e legacy-trunk
+14355 77465d8b9f5e290dbc3427e7cf22b0fde7cd449c legacy-trunk
+14356 7ef39e07120a7dab5f34f6be3a94e02d9ecc17ac legacy-trunk
+14357 76a609a947302238f5148a534b8f8251fd2411f5 legacy-trunk
+14358 5c2770124904edb3c23b3118841481700a249465 legacy-trunk
+14359 77fa3316bf582547070fe40c0761b5cabbcb3c03 legacy-trunk
+14361 4d91221208ffb0b49411240e4002d2e81b90c7e4 release152p1-patches
+14362 3f1da05ced5536a21aca217db80e6afc43feb8d5 legacy-trunk
+14363 3dcddb479a7e64739e0c8ad78d220f12a76f8d49 legacy-trunk
+14364 6056cd50297e4c9919178cfdf680371b5d9157b1 legacy-trunk
+14365 dffbd921eeed45cb3084d7c7ae954659ebfa98cc legacy-trunk
+14366 57fb3501ab22b2f6489849c60e75b0c5af2050a9 legacy-trunk
+14367 6367d829f36bc20c96a6597888a779a969fa6cb3 legacy-trunk
+14368 e3606d30886f03837ac72f21fd2974102fb23148 legacy-trunk
+14369 945ce60d987917368b0986cae858b806cc5e6ff3 legacy-trunk
+14370 020526e72eacf28354cd551a6f72187c510d7b07 legacy-trunk
+14371 9092d30c2bb7d586f7906b1f2fb4ff71aeb639fc legacy-trunk
+14372 62fa8ec8595f02ea2f78aa5c9ae3ccd622cac079 legacy-trunk
+14373 a4eef0813d4cbe0bef87ada4d3852f92622bfb0c legacy-trunk
+14374 9876a64c181aaa61827da76b5a9caf123886217f legacy-trunk
+14375 3579975509d93579629ea2c1476886606b126178 release152p1-patches
+14376 4cf84ddf5129043d2691a2745f9a398bbdb08822 legacy-trunk
+14377 3cde12bb3da5d74c7b61cd5ec3982ee59e1e1ea1 release152p1-patches
+14378 03bd58f8c9d03e12b9bba5b4df1ae2ae7c72011b legacy-trunk
+14379 b0369e8daa0bff396541cdb0b6df59e89efc4695 legacy-trunk
+14380 1a25bc2d3272adc6a1e10f488c1a75aa4b187592 legacy-trunk
+14381 1033a24c4a5298f0d0969136bff3d7cdebb56c56 legacy-trunk
+14382 36c6750cf2275863f3eca16ae18f7ca714db50b9 legacy-trunk
+14383 8d5b90ebb919bb17b8971927179d49fa41656528 legacy-trunk
+14384 707d16f0d345aa8343e28a93965b6b4b0bd28108 legacy-trunk
+14385 7f50f71ae7bf256156f7af471dc9de3ded12de37 legacy-trunk
+14386 2839d84cfd9666d9688882c667b8dfa5e847f1f6 legacy-trunk
+14387 8b6e2b236bab523448fc8c173ea930c3ea23e44f legacy-trunk
+14388 6b8daf337d6babccf3493e8d4bbd2c60ae03ee12 legacy-trunk
+14389 cae8e8edd3e2ab29ca208df685335b930c47693b legacy-trunk
+14390 dc19b5900daebbdf1873c91cbe679492cd569be3 legacy-trunk
+14391 a742147396eee04dbd4e3dd55bdd592992669364 legacy-trunk
+14392 e2bbc3e40cdb964d578cc2c171a0710568ff8758 legacy-trunk
+14393 ec46faa8359567da3246ba028c4e93f35d12689b legacy-trunk
+14394 b7cfc2dba586bbad11bd889db4751d58b963e740 legacy-trunk
+14395 049ab8f34df164fa53a050ab789e8cab36530447 legacy-trunk
+14396 41dc24b20a175a424830000ba94c0680d86a21c1 legacy-trunk
+14397 b6f1287e1970731e5edc883ec7d067bd72d704f1 legacy-trunk
+14398 5af015718285e35614f52125565cb7d00f1d5b9d legacy-trunk
+14399 486721ec9dd746fc540ea56fde63022bfd83425f legacy-trunk
+14400 ae8df07d4b6a1b6ed6d80650c919b16ba358fc47 legacy-trunk
+14401 f83cdcbca1b08f13695b39ab5349c0f0b09da426 legacy-trunk
+14402 860524182b9c8cacd1bf5f5411b2c1b5508ef13b legacy-trunk
+14403 72848c6b611ced404a00e4273e28e955f09a4298 legacy-trunk
+14404 fd4814b59b73a680dc166857ad5ca004afc28f64 legacy-trunk
+14405 7eb127ade0694eb203fc3729635a8689bb273bcb legacy-trunk
+14406 d2ab9553f8712e3f62741618db75d114621cfdf0 legacy-trunk
+14407 09a3a68ce96404ea8d8b35a3017dbd4daa48cbed legacy-trunk
+14409 e93a5a906d73a28f84e8d01dfd462140a0cbe804 release152p1-patches
+14410 733ec6e869dd3173b74f8d684d1e4f20920114d8 release152p1-patches
+14411 8bc871081724778b04eea48c657f1ce8d6634854 release152p1-patches
+14412 f45d8b26bb24534d96c1810be84db9ce490fc68a release152p1-patches
+14413 71ec31f97ffc7e04e219baff4f02056a3afe74cd release152p1-patches
+14414 a4bb3843a582231659e85421592535eeab35ccba release152p1-patches
+14415 454196114fd245359a130a2163f377b2817a5f63 release152p1-patches
+14416 ced8dd6227dd2d2c3b5594652972d58a46b1e07d release152p1-patches
+14417 5af3c5b74c545893018e7595d9daf8306ed3a3d5 release152p1-patches
+14418 295ff3b17522a2ec6e9831039ab80ae573795a73 release152p1-patches
+14419 63ce09df607de19f5813396d55eb65177ead9c29 legacy-trunk
+14420 f53fec0c742bf5b44b4bce03af476aeaeac4a7a3 legacy-trunk
+14421 29e74c70de18afd53d8e028d21f0fc4c190355fe legacy-trunk
+14422 50a6ab3fa036a2dd6386914636daa49125d430be legacy-trunk
+14423 3678dd68586705d9b797a0bfe3f63ba019690962 legacy-trunk
+14424 449b074c3051b171bd15694a403dabc96b67a351 legacy-trunk
+14425 fe960ad3db65bc24096bd21c50bc7f48e80fb8bb legacy-trunk
+14426 e77a286d0eb1030dd3d31a9f53219aeafe65c378 legacy-trunk
+14427 c2286a1c2f29585b4a62f55b794bacaf3cee2a22 legacy-trunk
+14428 57788da164889694f27c9467fc240a3b36277826 legacy-trunk
+14429 ffbe0a23a0f1758ff9306560c5424eaddf96974a release152p1-patches
+14430 bd161a908b3bda5a0c43ab0ec432c69bafe08e17 legacy-trunk
+14431 57167731d1242e38724287712ab0bbde0af50381 legacy-trunk
+14432 302286b160a7a268e2fcc58774f7234a92fcd6e7 release152p1-patches
+14433 8d0b2fed7d55981c2d0d59e0f5535c03f21c8528 legacy-trunk
+14434 cf8fa92ebf3d94e4da10d7749adaf5dc94aecfeb legacy-trunk
+14435 e2b633991e013546796e6432fc1995e6b24230e3 legacy-trunk
+14436 fbc13fb8038ca595f4d5cc7285dfce86439959b2 legacy-trunk
+14437 20ca7230ae3f8a955f8f937f5708f605e9fd0748 legacy-trunk
+14438 6e5ea7dcf1f55b637d32e0e33ff7346a3638d17d legacy-trunk
+14439 eaeda4621f7dcd554e6c99d5b34e0ed6e5a453c4 legacy-trunk
+14440 84f77c19d143b4b142d5e223e4f09861f524ab5b legacy-trunk
+14441 03902bc0214a151d58c48fc6b621b52452664b6c legacy-trunk
+14442 50f12883cdd79cbf4375f39e7707cd21ed9694ca legacy-trunk
+14443 476eaa38e2d6aa77e8f5297b52a676870b4c9297 legacy-trunk
+14444 b7bca050d7debcfe60d3aa004871d6961d97db96 legacy-trunk
+14445 bf1501cf5f082d9b5bdc5b6e5c73502f08b28380 legacy-trunk
+14446 be9500e6477fd31608655b79fb584a729a11e8f6 legacy-trunk
+14447 19de6d194ace9837cc6a5539b224a45bee2b2588 release152p1-patches
+14448 aa07c47f6ee8828104373cbeb5653bc68a1f1cc7 legacy-trunk
+14449 c5fb6506eec40e28a34ec6fe636ac1def0704e80 legacy-trunk
+14450 fc0fcea14ba0723e6df22bb633694924325c5ea9 release152p1-patches
+14451 8878c096fa19e739af605ae75e66a000a9d6dc45 legacy-trunk
+14452 7c255e7a21c2c5748913ad8fce51bb670a982553 legacy-trunk
+14453 3684d5c7903c3edde75854eb2fde2c874e56f917 release152p1-patches
+14454 7bed1f0ec61ac568a1fb8a0a22b1be9121b47a82 release152p1-patches
+14455 c6f84cd1ff705a0e54258bd3b388adf2f0246d03 release152p1-patches
+14456 3b6d8ad2468e35a27cc0b7d113d9cedf3ee34c1c release152p1-patches
+14457 4d5d5cfa8a53931b13a0e3b2f87d360ff7c48197 release152p1-patches
+14458 eb483d9a0f62cf02895d9433f0386543fd3bb4c9 release152p1-patches
+14459 4080c7a0f1ed6c9f9d1711afc651ad63bd4d1ca8 legacy-trunk
+14460 0c0bfadff77aca3451add42dcbe94267720cc18c release152p1-patches
+14461 b2d4b2e03c9953fb708a10f097957a7cfd1a15e3 release152p1-patches
+14462 94b642079398ca6765684cd5cc7fda8b15438d98 legacy-trunk
+14463 718d22da0017f5e26d85e8666d85aecb75d8289a release152p1-patches
+14464 e2512d4fd470831fe74356741716e36a33a828a4 release152p1-patches
+14465 683443d8da3b9d439e54d9ac4712d4ff8a43c494 release152p1-patches
+14466 fe7632fbd4f5369b7c8a4b7d22d45163e7e5bb8a release152p1-patches
+14467 594a76bb9ff031579f856c167fb70c6c01092c33 legacy-trunk
+14468 a0313003cb2d52067d0c60dc0fcaf2fba01f85a4 release152p1-patches
+14469 dd0ae10b72060f574829837f2bed3a41893f9755 release152p1-patches
+14470 9c59cba04d858aa6a67e869fd12f8700e0a4a3e1 release152p1-patches
+14471 51c217454953f8234ac5f33f5cae19541383271c legacy-trunk
+14472 3e52f3dbe3dcd9f36f878b8554639b5909e36344 release152p1-patches
+14473 ecdc78148811897332c1ae0fdb2846bcee342acc legacy-trunk
+14474 189dee70d32a0cb07d58dbb111d015cc1a142471 legacy-trunk
+14475 a046983cb57612d938a70e94ab1989f20daf805c release152p1-patches
+14476 ba2111748038e0285fb96c5df01fec4108ce40ab release152p1-patches
+14477 3287ccd0dd0133ee74ed3a9312d095927168155f legacy-trunk
+14478 d229bb79265900103a9a2e8fcd08341c29b52915 legacy-trunk
+14479 1b731ecd9ed32bdc258e57edcb0a3eaacd71c909 legacy-trunk
+14480 2c7256e3989cf9b06f2872910cf9164d54e54727 legacy-trunk
+14481 797d996f7c6da0094bf7d4b91b21337eef395501 legacy-trunk
+14482 b0c4f261e47032637573c2acb95ad6c30e151ba6 legacy-trunk
+14483 ca5353867be233220cb0ec7d430d373759012d62 legacy-trunk
+14484 7269216746d02fadd9630964e064a38468e7c3a3 legacy-trunk
+14485 91cfb6e68ca4719ea3d09b3f584c5846f1fcc503 legacy-trunk
+14486 32f975cb9f5ff220656a421630dbd7648db75c1b legacy-trunk
+14487 bf6f1746b10ba0ffa1a9a0c7e4c27676d098b4fb legacy-trunk
+14488 e119c0250b20915d32635e5854af06312923dd46 legacy-trunk
+14489 c04e1c70f0f126a12e5a1adcb426bee09d8a82eb legacy-trunk
+14490 e123e65ef255b8469b2b28c0f501a7c5e00bc3ee Distutils_0_1_3-branch
+14491 2517569aa1dd41b8ea2e23af825b3107f4cc0224 Distutils_0_1_3-branch
+14492 1047313ceb5bc9833499ae41801c2b38b2f90276 Distutils_0_1_3-branch
+14493 253ec95f391e1c5a99f2634e28714191a8d223bf legacy-trunk
+14494 e56780b7436a6a57425960dea9bd00c7a3c4ac50 legacy-trunk
+14495 8b70eaaadf4b40d863470c311813b409c40318d1 legacy-trunk
+14496 d15d8f5141a888fb164a4d3360b508a30042a590 legacy-trunk
+14497 6f9799a145e582e465e88794569f7ee19b1462d4 legacy-trunk
+14498 ec062c7c38a59836713a34cf10ac9b4299c140a5 legacy-trunk
+14499 b70dee71534a6ca821b7abbbf5109b7175fc3535 legacy-trunk
+14500 0cde72f6eaceb0bd690b5794e36fad251ee18430 legacy-trunk
+14501 89b52895310c7e247b7c530bbc62c19488a6ee72 legacy-trunk
+14502 91971eb21527fa941e0898b988cdf00bdea1e8b0 legacy-trunk
+14503 e695b52295a86a81b0d2c6798eb2f6156d24fce4 legacy-trunk
+14504 79ea19085fb6ab8c83b79ef6cf0dfef78d2ddb7b legacy-trunk
+14505 1451539a27ecf4adee45d872b32dea6ecbd4575b legacy-trunk
+14506 781f48291a29693fe503fc42ba32b82a2cc9339d legacy-trunk
+14507 bbb751f55d048eb00fa84383e96541111d0b4c23 legacy-trunk
+14508 2d8740647e998c3e03fbaab930e4ac52b0976607 legacy-trunk
+14509 986a87363a66912a3ff8324437a225c70a74cbb7 legacy-trunk
+14510 e00594366ec4f74463e8718f9323c02c9ec1ab3d legacy-trunk
+14511 5e1f4f7d79a754001a3494ee63ddaa99fd19bb7f legacy-trunk
+14512 41b85a26ceedaa4efc7ef2d5e1e9d5a103f7d914 legacy-trunk
+14513 ca350a71988733ed757eaf178d7de94851641ded legacy-trunk
+14514 2fa89e657a4eddef310794576412d3f0c35932d0 legacy-trunk
+14515 069ea5736ff607a81f38234b96cb509e3b2dd424 legacy-trunk
+14516 06104bcf06a64fb08190662d77069b45bd68a207 legacy-trunk
+14517 d7e66ef345d07b9ccba9cc434d5674cd7fad0cb8 legacy-trunk
+14518 32c59e2889c4cc4aa0186c026c3667150adbda11 legacy-trunk
+14519 d7eca5b0960abb021b481ee12a5ca398798e7702 legacy-trunk
+14520 2fe9568bdef2b91b1b607816c9912d2f72190947 legacy-trunk
+14521 c90ac698214db730b547c5fdbe55b5b15a8580d3 legacy-trunk
+14522 444b77ceebe69310e2ce7c26edac23b99d6ac9b8 release152p1-patches
+14523 b91d848c9a1ad4eb43da6e5dce67d822f4bfc4cf release152p1-patches
+14524 71423209d7fc2c51f7e810af3f3a07757450abfe release152p1-patches
+14525 7ed104c40db336599e25f05861dd54883a3c35a5 legacy-trunk
+14526 cab071e92f321f52ac6b32c9971679bcc4a7a5bb release152p1-patches
+14527 52a3b464578f2e87234f07dd4a466178e6ce0ab8 legacy-trunk
+14528 286303f00546bcef507767b996dab844c0be1cfd legacy-trunk
+14529 c27d3e8c45c46667ccad98d52bcd135ca88c3cca legacy-trunk
+14530 5d0879e1ff37c57ea022c3feac4d3e538b73f856 legacy-trunk
+14531 3d73ffc105d0a48c98dcdba9fe50fa2c4ed3ecc7 legacy-trunk
+14532 a7d609ea90cc6826640ebc5714ff2cec53fdfc45 legacy-trunk
+14533 d27684ab215a6a5acb40747499ea49d2d0f2801b legacy-trunk
+14534 efd6315ae678d62e5597453af2beafb27512db1a legacy-trunk
+14535 dc65c5f6ad7c14ca4469f6ed28ff134cb09ec087 legacy-trunk
+14536 d24ad5503831a7d98195079a0266540de6b88c95 Distutils_0_1_3-branch
+14537 9bed33599c339c15a26f10b39e0383f92c22cc56 Distutils_0_1_3-branch
+14538 9c93f10dcd6968cd904cc64ddb9c359bc9bf9999 Distutils_0_1_3-branch
+14539 8ee759d799646ed11422fee1fd20737b2eef365f release152p1-patches
+14540 0c4729e38c3db8f48d0dde8252d5c9b29f2f9a00 legacy-trunk
+14541 54cf3bb3b8b7cf4c7101c17236914e9844cfddf8 release152p1-patches
+14542 10fbfd07f38941b3db3c06e5d32edc0835256ae5 release152p1-patches
+14543 a38fbcb7d335680f6a591aad14eb1329c5bee90d release152p1-patches
+14544 e399abcc5de630ea855cdb630785311aa0b6c378 release152p1-patches
+14545 758a87f4cb2c9e8d8b679483e8389ba4657dabeb legacy-trunk
+14546 39bb0175507909723c24308ab67d36f19bb71107 legacy-trunk
+14547 270a11488c6c5c3d2ec98e5155e61c343cddd6eb legacy-trunk
+14548 81f1069e155869939c73d12396c35c11ad3dbf00 legacy-trunk
+14549 a4570f4098710f4fd7ec311bdcea88ec40f09955 legacy-trunk
+14550 1a49b6144f0de325b5978d12c6483e2e03cd00c6 legacy-trunk
+14551 9432d8b15c9714fd2784c70c71ca86b24f9396d1 legacy-trunk
+14552 e82a9633078bc9255f8c3d55254efa476d295f28 legacy-trunk
+14553 0016633fbd320a1c5867d3592ad646aa154500e1 release152p1-patches
+14554 23108cce169b45dfbb3edac9265c7be02698d3b4 legacy-trunk
+14555 ef8b062b5798044ff3334fadd10a7550883cd5ea release152p1-patches
+14556 610d7d642917e5fcbd13b64679ce0247c77551b2 legacy-trunk
+14557 7842ecf5b42489f2b2338e2ff386b9e1c75000c8 release152p1-patches
+14558 cfcfaa3950d642c9a20b328a43d63f683806a3e2 release152p1-patches
+14559 58d1e77919805b87e7e01a640fb063d8bd216dc6 legacy-trunk
+14560 cd57f776c1df8515f778a01517bb74b993c30da9 legacy-trunk
+14561 2802fb52e99bc79a65bd034f1e673108ba9a0f96 legacy-trunk
+14562 017e592c0fd2c3e853c74390817e3167635965bd legacy-trunk
+14563 4679bcef7a4f645ab39ef8b5b18213ade150e070 legacy-trunk
+14564 723efcdcce1bda5d06b2bafc923b95a0569343b7 legacy-trunk
+14565 62ebe8c715659b1fd2599a9d6c2d307dc727bfcf legacy-trunk
+14566 01d5b7d11fc128e2ce15b0235821b431ec87a8f9 legacy-trunk
+14567 6932e18aff98ad7f16f09d93db470cffaabc8953 legacy-trunk
+14568 f8518f060bedf8f8f5cfeeebfc6a8c096dae035d legacy-trunk
+14569 a40c2fecd5269f3ae82613883edab628aab30842 legacy-trunk
+14570 0a4baccbe9fe934d01aa3be085b44371a4c7dbc0 release152p1-patches
+14571 49b109b450da7d76a9132011b20071cd55498c94 release152p1-patches
+14572 ab1ef1aa402ea5236be25af405b791164abc7c50 legacy-trunk
+14573 b3ca3caa374c518bb58dc5b88dc4e6a8711edde5 legacy-trunk
+14574 11ae1efec871a37a0cf7e59c5693de070b3628d3 release152p1-patches
+14575 d74e12d46580d37b1755925e5cf42f59460c64da release152p1-patches
+14576 00a9ef7447baa5393259f8f73d7a752323abb7d2 release152p1-patches
+14577 855c78f5b5ddd4fc53af6b28a85b5cace9e7fae3 legacy-trunk
+14578 9948fd532d3b4cb2a842dfa76eb9ef9df87f9680 release152p1-patches
+14579 b975a056deb6665c7d9b8315c4fbe672148eb5ad legacy-trunk
+14580 0eca567e532c284b6f5d3afce111cde696905120 release152p1-patches
+14581 fe485a5d043fc7bb7f5b5479147b1d4bb81544f2 legacy-trunk
+14582 c0f18e11f4ef32920d85bdaee78af7370668eb24 legacy-trunk
+14583 c16711fdd9724433c7c99013bf4e32240ac3dd20 legacy-trunk
+14584 1c8a9faa3501ec47291ffb5fc8e266531c912b4b legacy-trunk
+14585 c9d87a7a70b0a2932493345bb3a33a5ab1011370 legacy-trunk
+14586 a6e5f0274e5172c5d08e32a232e65ee7ac85a1d0 legacy-trunk
+14587 7922d08426caae7a3b7d1855c0135570e96733df legacy-trunk
+14588 d1359831e5f264c9ab38889a3256bfb3dd26899e legacy-trunk
+14589 5b03c5278317d649a40b4ad4980d7fdfd652c90e legacy-trunk
+14590 15cbb57ca747257de0fb5c04d06991a49d0518d0 legacy-trunk
+14591 a851ef326d932f71478d8da6c2d2cdcd12b64d92 legacy-trunk
+14592 7cb491e399e619f4e7f5595ac40df377a7776faa release152p1-patches
+14593 29c5c5415da71decbebcd825b308a3a9306dc534 legacy-trunk
+14594 f82b923a7a96c2af5d40df39bad4b10505e8d5de release152p1-patches
+14595 ce2698d8dfebf6d8852a460d52b5a463454f962e release152p1-patches
+14596 06fb2dd38d7d29990acb72cf26783a3cf18b4e0b release152p1-patches
+14597 cfec11b4a8a72cbe8a72f707a300fd830a6f9191 release152p1-patches
+14598 aa0d0b1f1be3e11b62a1902dcd741cb5b2ca3057 legacy-trunk
+14599 8cc4428c7bad91e64fd9a24e8d502fabbe551f3b legacy-trunk
+14600 d097bc5aa7f34444e5f4e4996e2dbb9a202068bc legacy-trunk
+14601 4b8bc9ab8175556f9e87938e8cdbb79c6ee37c42 legacy-trunk
+14602 2a628067969b93ca5604a3b7ff2f42932af9dfcf legacy-trunk
+14603 a469aa8b332a5846355771ed1e889a99a0616bfc legacy-trunk
+14604 79b6a6a882d9e8d57137091daaad706ffaa3ea78 legacy-trunk
+14605 bdb5f6a524b5e3f641791979883c25dbe9017548 legacy-trunk
+14606 9d8f47f8447f97620138d14facf6da2d47dbe031 legacy-trunk
+14607 1b54b21346d24fa24690a762cef1b7cba28db30f legacy-trunk
+14608 aef5a7c62291eb69ee438e87c1baa32c24bdf257 legacy-trunk
+14609 25adc5c8dd68004e3ff1780d6003c0a1a91921ce legacy-trunk
+14610 68e0ef052815058f0225478b4939d2e969ed2809 legacy-trunk
+14611 7bd97c3dd432fd94598d8ccdc5dd324f6160f9a8 legacy-trunk
+14612 c94572a509952318ea138831406a8d58dc4bfdb4 legacy-trunk
+14613 c0d36f916afd8ca701dd56588d641f92cacdae41 legacy-trunk
+14614 ef98ee6aeb42ae01e4cc0f68f9653be11aa372f0 legacy-trunk
+14615 0456a8c2ebf7c2a970f16736162bb314bd19020a legacy-trunk
+14616 73dfbee150271f3a7a0bdf81923f769cba608517 legacy-trunk
+14617 de8404573fe512c7cda69cc604cc8c93c1511124 legacy-trunk
+14618 f6d1d0fdc1c7c7201b490ac7596078407737ac67 legacy-trunk
+14619 421b1620f582f9a7b83fc3b90caa8ef949fb3254 legacy-trunk
+14620 802370a60ef7e3d71f4aa7dbbcb4fe6b96758a4f legacy-trunk
+14621 734f3c07a6bb9f3d5cc27922ed072c6920e6901b legacy-trunk
+14622 1a58e6fc3a954df79f85f38d1303380124855955 legacy-trunk
+14623 826690ba1ae69b8b584e4f6947d6fedc55e33e22 legacy-trunk
+14624 2a40e9cae859dca0488fdcde8168c8f50985c22d legacy-trunk
+14625 d0404780f03bf4e2f2a3208ceea6aaadb34d62b2 legacy-trunk
+14626 5e48d83c0fce1720419baee637a3d047733590d6 legacy-trunk
+14627 a3992a789e2e7bb157e7b298a57e878a71ec4579 legacy-trunk
+14628 5b33fca02b785bb6db7015c11591702d58d6054e release152p1-patches
+14629 addea1157aa7f907298bab9e99705224b265dce1 legacy-trunk
+14630 e10515e7d356ccba7d474164c17a4f5385186343 legacy-trunk
+14631 f9db3654a1fd08766a056e360370ea5f9c7e00ad legacy-trunk
+14632 398a4599eee33ce9b734c3ce9a849341fc63bcdb legacy-trunk
+14634 6e3c81bd8291edea7f7f4d760454ede526542ebc legacy-trunk
+14635 23fd7d10064eb1621fcecbfa02f2b015da9c76de legacy-trunk
+14636 d4662d381748ac6ca6b550ae31269f51dd735ca3 legacy-trunk
+14637 f9141bebed48f4e59a11db12ce60ca545ba0e25a legacy-trunk
+14638 3e5fbef9b1f51ca614aec73e3342cfdc7ab5ab98 legacy-trunk
+14639 24c187b927738486af0ab44e06dd023fd1c79711 release152p1-patches
+14640 7410690928319bd812d6c20b246b473b84958e98 legacy-trunk
+14641 9d53fc8043ba79f54a29601b442d6fd12e652077 legacy-trunk
+14642 be98e055e39d991457dd67c888fbaea4519a4960 legacy-trunk
+14643 24199c1b9182a36cc793c26445ea0bee63be9c07 legacy-trunk
+14644 4412c7a32497f90c2971b2d1d0a1a0c75ee10aae legacy-trunk
+14645 9f261e94b2b25b041dbffa3eb2e5352f74415581 legacy-trunk
+14646 5305f9b01fc75457802b171627f4f98dbe6f9174 legacy-trunk
+14647 507833b18213b70b7c223eb968637d52aa555975 legacy-trunk
+14648 13bc68faeb655b66db653d461de80fc70a17f611 legacy-trunk
+14649 74b7213fb60920a01e421c9450ce6e4696ef40fb legacy-trunk
+14650 f76bf61cb19c4a783afa3f789870aa5e91567154 legacy-trunk
+14651 574283db2b3dddef369dfd0369ce8a88e2b02d24 legacy-trunk
+14652 d0e06efb31651f0e4cdcb43f60787755819a0aa3 legacy-trunk
+14653 8bdc25d22925c21a136c53310178e913dbe06694 legacy-trunk
+14654 28003afa1a2f091f32fff33abb175a2f2b290853 legacy-trunk
+14655 876f35828e870a2f2a72886f31259f2a9dd8d24f legacy-trunk
+14656 513354d87a85e77e311397ee8f9046b3599cf0fd legacy-trunk
+14657 8b88e1bc0e1b4b0c82ec423afac4e31dceecb0d6 legacy-trunk
+14658 3c620f65eaa5b5eb65b4e6fc61e1291f3d7d6bc1 legacy-trunk
+14659 30d9248e11bbb231f738743f3c2d1e55b2044911 legacy-trunk
+14660 a9b5a31ff8cb19137075f93aa7fa9b56bff2b5a5 legacy-trunk
+14661 d7a4a5ae2daec47d675f266c36626db3890094f0 legacy-trunk
+14662 a13294aef02ea4feb34b56e8f8f8855ee01045c7 legacy-trunk
+14663 4c7bc885f420afa58a666f9416ba2402717bb591 legacy-trunk
+14664 efb3a45c66f31ac89a84d7bc479334ad8edc924f legacy-trunk
+14665 88225df35efbac46bb5bc1765fdc28f7419477cf legacy-trunk
+14666 3303a5bac6ddd420133801e695c4ccba801f3c00 legacy-trunk
+14667 0fdac1f54ec81035115ef6fd77c004a7c5d06eff legacy-trunk
+14668 93dac4053189c0f550bf569a6f82f96d72615013 legacy-trunk
+14669 ee6492a5fdee66a834215b16abc886295515dbdb legacy-trunk
+14670 f104251b6f8f37ef5fb001148bee617713d3f092 legacy-trunk
+14671 81702a7354ecb50ce046334dd09d8bbe9ded5f8c legacy-trunk
+14672 1789fae5f0741a03c9d456b4e3c36d4673f6c674 legacy-trunk
+14673 b5e81271c4c8bbcc5af56c5f5295f6e992c318ef legacy-trunk
+14674 4b8b2e28be3492598fc91f1d9aabdeff545bdc79 legacy-trunk
+14675 96fa46d34898acdd7bc6afaa3c199113e633ef0b legacy-trunk
+14676 32627dcafabff72f53c5764bf944d607442bba80 release152p1-patches
+14677 23dc89ad0996e89561b40e385a03c593f1bd54f9 legacy-trunk
+14678 38310eb0659e3a4c41735c8fd93374d999f22526 legacy-trunk
+14679 f94d10b6d0f4d13366d6c7efc20c6b3e7811b719 legacy-trunk
+14680 c94247b5c355578f4626d3f67b95d9e901932e71 legacy-trunk
+14681 8651f2da7c4c8701e5d9293f4b65b9c5fb75f9d9 legacy-trunk
+14682 e362f326048ca2d1d92f1113438be961b9f3f2ed legacy-trunk
+14683 d50fa3670b66a17f563159f20cd5959b94dcfed3 legacy-trunk
+14684 148db6322161fe28496a4066a9f71c6dad3f7cfd release152p1-patches
+14685 01fa5ca98813b455c80c058f0a89f9316acb6f59 release152p1-patches
+14686 75d6c7c3ec5500e46a31ae5391d156cfdf6833db release152p1-patches
+14687 7610eed3e033283ffca9ac515d3387eb89b899c9 release152p1-patches
+14688 f78f4772568ec61caf1ce1946f31f18d36abccbc legacy-trunk
+14689 74d97d795c4ee73cd877394164335d4530bfeebb release152p1-patches
+14690 3f56cda3d2fc417138aa0e34fb057ebd53ce4dfc legacy-trunk
+14691 c7458923f6a2d330345d1109eac2ad9883efe541 legacy-trunk
+14693 f27cc173517e342c3127f2007df39f8c97098d10 release152p1-patches
+14694 0f6eab03f28801b6314f49a9b1beb8f19af52aaf release152p1-patches
+14695 366c1e98f7078bf80c41c65a5e0511ad46bde801 release152p1-patches
+14696 0a706072d50af0f6cf79918221a46a1cbbf6f526 release152p1-patches
+14697 1c935ca3785c8d805802468f3e30289fbb7d7bac release152p1-patches
+14698 438a440bb085e5e952c9f513ac101af3da2496ae release152p1-patches
+14699 3f85c4b99d332205b55dc377829b85484567fc9e release152p1-patches
+14700 faf0c9e9b92feb393eae15c2a63da4ce61952aa1 release152p1-patches
+14701 f23864e4ad2cc55124c1cda0cc852b7a381c947f release152p1-patches
+14702 e57ce4df5707a72fa5221110516914660e02718f release152p1-patches
+14703 4fbf6962087d58f3b10d98cfa2ccb5e7f78eedb5 release152p1-patches
+14704 bdab9c55f168297ecd08d2f6d6a5f35e025c0b39 release152p1-patches
+14705 a33f2a3db8927eb25422ea26e2e9d3ef2c67dd2c release152p1-patches
+14706 2eaaed7589ae5e0d9699bfc2305f0a8a7a6d5639 release152p1-patches
+14707 3af3b1eb67fe14c1a9000ff4dcaa48a283954d27 release152p1-patches
+14708 2612b96b99ac44fbf7043e2166309c8a28fa065a release152p1-patches
+14709 28c8ce665b0320de97ba33ad5b3735c764215a5b release152p1-patches
+14710 b58f2f0cd55b3e42819b6c0d4d2926f60c492046 release152p1-patches
+14711 96348beb9384389fbe7f2d905d5b3bba26332bff release152p1-patches
+14712 169add6a4dc1b0a22963194da36a91840cd75691 release152p1-patches
+14713 5000eaf058db78cd78426bc22a6609af6f0d48f7 release152p1-patches
+14714 703da7e94b2165d25897863ac484c621dce8f84b release152p1-patches
+14715 d7b87f0ff0d2a7f71fca6645b022d046aad8245e release152p1-patches
+14716 9d735639429d13afcb9adcc04010d4f1bdd725f4 legacy-trunk
+14717 e0fb04d1bd934b90b38a60b5ffa0ee480f3b9ca9 legacy-trunk
+14718 74fb602b76c2ffb1de9375bce4a32b8db922af06 legacy-trunk
+14719 127f70f59b026643a232b89e0545c20429c3c6fd legacy-trunk
+14720 663129f3abe001ebd7570e21ace4109303b9769e release152p1-patches
+14721 b47248ce7b6c945049c6dfe5e7ac89be27c7c311 release152p1-patches
+14722 3952318957cfa3364faeaa8fbe6da9f89bc4f9f5 release152p1-patches
+14723 bd1014215f62254a6d04a5b83fe56829ceac25c3 legacy-trunk
+14724 4fa25a292273b754dbab0dde06479106e0a310d7 legacy-trunk
+14725 c2efd17cecbf1d6f25efd78ebc2bd296d9f1ef3a legacy-trunk
+14726 e6c46819db9272976a2d8ff8ceb0b881f401559e legacy-trunk
+14727 ba80c90644918067e6f758ca6c6498d93725da3e legacy-trunk
+14728 a41183670386e62ff3898e1968e7b8fe342c1621 release152p1-patches
+14729 c603cdedae1774e0efc59baa55d8f90dc84168b2 legacy-trunk
+14730 13fd0dfec560a7dd556ae06869a5a4fcef75ae4f legacy-trunk
+14731 e7820352cb80d0f3d7b0eaacc51b1b3f877c6b06 legacy-trunk
+14732 0569725171912e5b7d7d1a5984b3e97927507da5 legacy-trunk
+14733 69b0fcef4c0f21d768b74755e4dbe42d15e2dbc3 legacy-trunk
+14734 76516204b620beb84fc1dde9faedb84344e22e52 legacy-trunk
+14735 1e1aebb3e4f69e58f0b4d8d2053704337d44796f legacy-trunk
+14736 86d9ce1580898ef4786977d3f6a6a414d3c8b1b4 legacy-trunk
+14737 914ed528896e0ed5a50c2d56ad009d1733938924 legacy-trunk
+14738 a0a9c69af9f78794653b6f09c079d19e33117cb8 release152p1-patches
+14739 6fd0bb0c0331efbe7b1f1545dabb1e73519f4962 release152p1-patches
+14740 f07c330557cff863f5e315fb8d5f1d6120523af4 release152p1-patches
+14741 d74eaa92f0b45834492f45e2464c4adc62794111 release152p1-patches
+14742 43d224786a581e45d326ce35373cd6da5ac375a7 release152p1-patches
+14743 628ca1e90591e50e9589898b7f5c1dd001ad38ff release152p1-patches
+14744 f220fba57749fb80305cffe91ba07d56aab76aef release152p1-patches
+14745 0b9633a45d68eb83bbbac9e8b2794b3ca745049c release152p1-patches
+14746 ca017de4f2fd94c67bc2ee20bca1b57023c1aa14 release152p1-patches
+14747 25d3dd0b1ca29380329f44adad668486b2841815 legacy-trunk
+14748 7994d9db7f4d5dfe51ebad300471d01ebbc0029b legacy-trunk
+14749 009d8fae81eae6edbb7fd73f0b0f907efd6ce2a5 release152p1-patches
+14750 0c447c2891466fd13a12d23de54d942b87686062 release152p1-patches
+14751 d2a0061092f8050155d4cb9b44d269cbaadd9fcf release152p1-patches
+14752 daf4efc3aba91bc1e9a925d2983f9d1f595cb1e4 release152p1-patches
+14753 8dc0918ae2c2ffce7caa4ea0d23ac6f42ea016ae legacy-trunk
+14754 f955fbd513ee4f6d4a6c98668e348a27ae01a829 legacy-trunk
+14755 556c27b3ab6ebf56d3378244c83704a4622e2e86 release152p1-patches
+14756 c8e0010c12ef31edcbe3292df66e63d23adfc70a release152p1-patches
+14757 87aee4ef29f5286ac6ac83004a24a4b7af9bb30f release152p1-patches
+14758 325938300a78415c61b7b843cb15e48c3bb302c8 release152p1-patches
+14759 6e7ec9a00cce5cb09d8d657a9168d0b9cc79fee1 legacy-trunk
+14760 3690c87a9bc664c6534c336905940882f8a00229 legacy-trunk
+14761 afab7bd72c4795d4855eab3e398482364e5131dd legacy-trunk
+14762 a05d8338fac573741ea0bd39e8a7bcbaaf3293a7 legacy-trunk
+14763 9cacd116698623cfdad9030901662396cc69840c legacy-trunk
+14764 856dadf56cd97b28f03a8f32c4b72bb3b0668dc4 legacy-trunk
+14765 23fce9b9f3bc9317cc282da564df9af9ce76b068 legacy-trunk
+14766 6f0d1e3346f95a701c880c7eb55b6aa3cdc28997 legacy-trunk
+14767 9404195ff3feffacbe26091c0e10e0a92593d173 legacy-trunk
+14768 d3e4a456928be1da414b6d4e041b26a8f5e2f24e legacy-trunk
+14769 1956ec07678e86f05ea1dc42c8331a87b8f3111b legacy-trunk
+14770 740ec08e6ec1c5927f63e51cdaf4db13b997c334 legacy-trunk
+14771 41a725c12551f61b4b28cf341e5017e33b341bdf legacy-trunk
+14772 d6bc3bd52424e6a1bca61a99fd0c86d4eacda7dc release152p1-patches
+14773 e12041732304093589e3de7ff40238444da1bb08 release152p1-patches
+14774 a4a785a01360aeae19ac4183974ded65ac2ff671 release152p1-patches
+14775 01a60b93c2f500f357306b39fa9f0ee95687eb66 release152p1-patches
+14776 019c34280fc21f3b729fe939ab5587af4fd32d50 legacy-trunk
+14777 a9a1e591eb3a1b1ea05801485b61cda39bd4f4e1 release152p1-patches
+14778 81c23b387bb0848b0f5eaedbad9b4986da1f8d96 release152p1-patches
+14779 2e21ad1c60ff86630138640f5a4b70034aee4794 release152p1-patches
+14780 af4778a130556917dbaade3fa4216315bc397bf9 release152p1-patches
+14781 6374c66691478e672ae9d5f5ba268471fcd7c222 release152p1-patches
+14782 42cbea6777b7ee9faca6bcf776b5fbad071e585b release152p1-patches
+14783 cae56f7e80ffee73a84b6177d2a70b45bcf6ac06 release152p1-patches
+14784 d8b22a781905c19114e101c38e38600d02303d7d release152p1-patches
+14786 5caccace1dcf8842d4c4586ef9ec0e950f672a36 legacy-trunk
+14787 178c6efaed8bae31b3d53eeaafd3707c815fee53 legacy-trunk
+14788 14092abb8bb4be547c84ae914cea551448ad0436 legacy-trunk
+14789 b2d44bb761d4b5a14dcedf47fb9696d85df2e857 legacy-trunk
+14790 a384b0f69512f6ddee6235cdcdcf4fab2e62964f legacy-trunk
+14791 fa12a563368d52f2a727d8872bf9d9f1b8e3ae60 legacy-trunk
+14792 f87b56eebacc72c3eaaa491f71d2e3e49c1418e4 legacy-trunk
+14793 dda3794c9cd9049bae574ecea982c2662bdb3503 legacy-trunk
+14794 b90880c0e5eb225c18f007231204d694ad0903ba legacy-trunk
+14795 d89556c04ef99dbc9fa6b38b786b1f8084222bc4 legacy-trunk
+14796 5d3165e30bce6313c4583b1f44d5108fc0321be4 legacy-trunk
+14797 88b0b32108cfa2d4e34834f9eb3202c68d1369c7 legacy-trunk
+14798 23a1c526c6f02c5bdb056ec6edf97a960794a6d6 legacy-trunk
+14799 5d45cfa1bc91389a86e3d4c8f9d06706c5c373e3 legacy-trunk
+14800 1e5cd70cee10756b888a7564d201ef6c2d8b7796 legacy-trunk
+14801 42d8d76dae6d2c5d5bc108b322b1165d671298b9 legacy-trunk
+14802 c6cb0d266839302b8c9c75e8a91c0c6315cfe38b legacy-trunk
+14803 de296a78abfdc4e502da3657fbff2bd5a2dc5c2c legacy-trunk
+14804 7795573ec3581c5181957377e8dc39a077d9d89d legacy-trunk
+14805 049f00bfb9cef3402886e5690a17047ca145873a legacy-trunk
+14806 c43b38079228f39915589875b18a34b501c73928 legacy-trunk
+14807 ca8880cf3674ca0f826350dac4ccf7eae3559a52 legacy-trunk
+14808 db03a29cf16b5c22cbce4d155c3813788fd69c8c legacy-trunk
+14809 b981a7a9b738e9c1935b03a9152556bfd0c207d0 legacy-trunk
+14810 86cffe50fb172c0253d0b140988e704ceb49bbf9 legacy-trunk
+14811 bcab189ddf86bdecc6562f5f1d30150c0cbbd751 legacy-trunk
+14812 e24351926e13ea60753d01a8627da68f0ff6198c legacy-trunk
+14813 332310fe3d3af37274e869f50eeaf290660491f0 legacy-trunk
+14814 a1bfc8d4fc006c8180859f96282feb1ae78c8524 legacy-trunk
+14815 9750af5e71b0139aecc0d4acfd14d6663126cb6e legacy-trunk
+14816 67d4128da2543a1b40a4495254abaa409297478e legacy-trunk
+14817 e4943ebb5f7d22511007f9e80d527ed0f29c2cbb legacy-trunk
+14818 65f35b73e35054d95afeaabd28970dd386985426 legacy-trunk
+14819 9edede651fb1a48e70cb0880ca2825edf5f93d86 legacy-trunk
+14820 4a61cc81f36735d1635616d85ec3313aed19158f legacy-trunk
+14821 fd2b06c6ff53b72377301c03a4d5872942a80bfc legacy-trunk
+14822 897cf0e5a434a60d17a2baf41ce7f53592ddd019 legacy-trunk
+14823 838dc380e4677ee88570a05c0a6c77344782bee3 legacy-trunk
+14824 44b942f7feb766eb3e5bdd48390b2f4b79a6fd3f legacy-trunk
+14825 dc8aa951def8045c138bf059961db5d4a42290fd legacy-trunk
+14826 603db0d0aed14345c900044bad9e65f1b6c332e4 legacy-trunk
+14827 7e006342e7907c69958a0ec45fb07abf243ad6de legacy-trunk
+14828 a6e522cb59184a5c0af3251fa111b6a03bb0f395 legacy-trunk
+14829 25b63367385eb0653ab2bc284f29f006315ad28a legacy-trunk
+14830 96ea1a800b2393c967bb5f3c82b7c9e388aed3af legacy-trunk
+14831 e2db89a98cb2f49b42c9f157018e705de513b25f legacy-trunk
+14832 3789b643fe8981290c352064631e2a6441ebca86 legacy-trunk
+14833 bb9004492030538bd611fbd4ef2b4617ce24d9a2 legacy-trunk
+14834 9877e978170ea75b2660714d1ce5ab2f8918e6bf legacy-trunk
+14835 ae065ddba0f1467ca2373c41ba474446025ec902 legacy-trunk
+14836 2a60d6f834ffb41202070870a1a4a7cd22e770db legacy-trunk
+14837 e09d7414d3ecf81657f6be32c218749ba3b31da4 legacy-trunk
+14838 8d1c69bdc4f2c2c95c14b2d2c8ee038d0481d44d legacy-trunk
+14839 4387606a1281b5a0f9f377f9a0c8aee4ff9c3dfb legacy-trunk
+14840 c0e4a90dc4ff9f7688bbf4aec5da7a0b5af41e1c legacy-trunk
+14841 7a515fc10c1d77c392628121d9248335397832fc legacy-trunk
+14842 881257d1e8544bf8ad515ae32ee98b25ce837511 legacy-trunk
+14843 40a2689daf37766c21d7f5ff2e64d553e6f29937 legacy-trunk
+14844 41cbd298ffc6c1d2b662b8e579ecb94030f68c82 legacy-trunk
+14845 f0e02adb91eba19b37f5359fef467e9f0944dd28 legacy-trunk
+14846 e81b139ab8a4959feadb3a6923916b727ec6f504 legacy-trunk
+14847 d731cef812b35e614d26385337b488e49ee40e3d legacy-trunk
+14848 e98770de31472d367a882820e31e47bba0c931e6 legacy-trunk
+14849 66f14ffe8eb716f96e8a485d96b1aff264727bbe legacy-trunk
+14850 2a910a77579a4d832f6d9ab89b1cc21d54411d28 legacy-trunk
+14851 32407c08caf4d3589eaeffd205c92b2110342890 legacy-trunk
+14852 6fd43867aa4fb07f9ffeb1377a9f3b422016e54f legacy-trunk
+14853 f7a0d29fb8b81e1445029c13b26dc2fcd2f16193 legacy-trunk
+14854 92ec78e217d29af89904d3f734ac12ccac60c863 legacy-trunk
+14855 e2b02d40a1425c3c8582f6618df09766ace9e36b legacy-trunk
+14856 dfe3baf0aecdce480495ab9c7a5657de00d4caa2 legacy-trunk
+14857 2f2f2b1ce568d61e1d6872a74f084ed6926428d2 legacy-trunk
+14858 2721c7cc0b2715f3d1c51eb95874489309ba2b70 legacy-trunk
+14859 63336f207d5128d55d38eef8fd67b9003d0e5269 legacy-trunk
+14860 e6ab3c603ff913ba617eab621956669ea439fd97 legacy-trunk
+14861 5f2239406dd20d374499cb0ee24cebe6198051b7 legacy-trunk
+14862 30a49d15da975c2637ee9c2d3e5d9d3f7e072742 legacy-trunk
+14863 0699a7dfd737c2351394edd3ffff138f6b681a43 legacy-trunk
+14864 ec58b503b6700c5fd6b5058d51dd02f654879a18 legacy-trunk
+14865 0727ff39e64fb92647e2fddbd5c5f8cfb2099e15 legacy-trunk
+14866 3d785c2cda8815dba67321d876341554580163ae legacy-trunk
+14867 a0ef8fa4b2488b438daea15dd3525797c4671c8c legacy-trunk
+14868 ec360b4e8f66fe7ebad16007fa303c4bcc64b327 legacy-trunk
+14869 e2b3283c5db0a4d682019b294f9f8ad4390e87e8 legacy-trunk
+14870 e6214ad2a60cb07b1dd94988c682127c0d90223e legacy-trunk
+14871 b3a4e451c06c86a0b02f6d950807d22c775d9f60 legacy-trunk
+14872 b5fcb539699947ceb47539b776db4d075e4c7255 legacy-trunk
+14873 2cd9c436bd42b379af17ad4d5e2294a5fc1ea69d legacy-trunk
+14874 1038e58610798e4c8067420ddc35bb5bfa667fa6 legacy-trunk
+14875 b40f679b107ce55829c6b6af6a949b07106993af legacy-trunk
+14876 1b68d0ad78356c0fa20dd7433a290b324ea58f3d legacy-trunk
+14877 711340d447776391496080149ceb2e9bce017f09 legacy-trunk
+14878 c160749acff8571b5ac2c415eb1e62adc3ad7f2e legacy-trunk
+14879 6678787769336a35fb18909b82b6787a34514391 legacy-trunk
+14880 9b9abde032b32455118ecd14c4e81c31d7a986e1 legacy-trunk
+14881 5b5581af951c5d4da80c8fa119229366ceb186f7 legacy-trunk
+14882 5720d1c18f4d1315e1b5e9046d2fc5480b7f162c legacy-trunk
+14883 338e055b7cc09c8039392b9b8156dc5fe568f554 legacy-trunk
+14884 dade82b9ee19ce0f0889eb9bebf90098aa48aa20 legacy-trunk
+14885 4a3fd2c1372f2281e1835f741ccad7e24f015709 legacy-trunk
+14886 43c36f63f867c939201532b272a7f393ece17fbd legacy-trunk
+14887 999fc3eeda99a99b8b954b6ba841dd85106c50b1 legacy-trunk
+14888 4cac37648a7f986024b502ca59315a0d7156bbfa legacy-trunk
+14889 49e027b48627f051bfd275e51558d4c5303486e0 legacy-trunk
+14890 e8c30e69666b0e42a8b2741e86dc60829485e24c legacy-trunk
+14891 14e93d89d34ebd1a5c7902db986ba501334efa76 legacy-trunk
+14892 804433f0112c9b80b2fffb994b49dcec377d7f95 legacy-trunk
+14893 0ac577eb8282f07abc429640efbae8b94beaf2b3 legacy-trunk
+14894 81e5f80000944fc754e4524539324f13b4ab7622 legacy-trunk
+14895 ca938f38d087dfb1f3739ae5784384318a7f3d65 legacy-trunk
+14896 21a9bbb572d737b9a0f8390d313daef21a319f90 legacy-trunk
+14897 830dd581e934f6c7b5130bd5bffe5b7e091cac3c legacy-trunk
+14898 78e36e06e5369d20e29067ba87bd4cffc13ef1c1 legacy-trunk
+14899 fed89b57637a6e42f0217bea51b5730aade576aa legacy-trunk
+14900 db5c03fa8c73f55d9674381ef8c7f274ce7b81c7 legacy-trunk
+14901 be2f003d47cc6f1e13d43594fce6065388c25a0d legacy-trunk
+14902 9e7abb28e92a1712943e57d1c8b3c4ecf5b00e4e legacy-trunk
+14903 75add9644ff34a29f2c099414bd69c79180e632d legacy-trunk
+14904 522eeae6c06632e2a931d33f09ea6f901a3840c0 legacy-trunk
+14905 236ac1eb188e3d269fbfab7b3efcf90b267afabb legacy-trunk
+14906 98b09c40d97cc9d8ca9afa54f1cfe739eba17bef legacy-trunk
+14907 feb9af7527a57f5ade255e0a4ddb5242a0f062d4 legacy-trunk
+14908 42387ade6afbe52e398acacf58946739274853b3 legacy-trunk
+14909 356b8e89f8e30645a300e7d38047af28b0d9b8ee legacy-trunk
+14910 c88c8a85274405b402ff6103e135160a4a0a7806 legacy-trunk
+14911 6e68c7ddcdb57f6fa82c0bb51ae38d4b2db15b24 legacy-trunk
+14912 a2fbc0ff7c2e072e3dc3797e63defb6cda0a74f2 legacy-trunk
+14913 ff6c1a82c322acc45f0513c6468a8eae57e638da legacy-trunk
+14914 f407fab273589a33de222dc6fa3514fd7e98c7d4 legacy-trunk
+14915 2653fd516d4e2ee2017fb7c5f75c1aa4f3a56e05 legacy-trunk
+14916 b7303f2ff613a3a41a6bf0c0c72038f83a6ab37c legacy-trunk
+14917 0d3de4c13cb724cbf0efb8db3f3d3d6e7783df6b legacy-trunk
+14918 2745dae8705f1942d444823287a611f68ebb13cd legacy-trunk
+14919 0155a3b13bf0e0c9b86965971ebfb002b1bea010 legacy-trunk
+14920 db83e63b384b6dc72f0fd50f7f2e37c3f560e683 legacy-trunk
+14921 f03e2a8188aa07cf5c07ccc1e01183195875655f legacy-trunk
+14922 77193e8e0137192eab539845cff0733166427fc4 legacy-trunk
+14923 e789e2bf05b3eee1bfc37ca8b9938dd1bedd4d68 legacy-trunk
+14924 c29cdde8ebd8030888f89a84819ab2099a5fb3d6 legacy-trunk
+14925 b58aed71cd63f377bf7c494236053c694942da4b legacy-trunk
+14926 c888792de6a770880a67c52b99d5a44aaa7957fe legacy-trunk
+14927 242458503b1311b5d68c78166ff4e92335bc9f75 legacy-trunk
+14928 f5a1e9544c5de6ee7435249926b7232b997c488f legacy-trunk
+14929 83257f3394ae310c9cafaad00a110fe6e5e684bc legacy-trunk
+14930 1719e41e233031ed7a1f31b7d704a25702aefd06 legacy-trunk
+14931 39b91cb80b41c1aba48442fb20430d9992fbd7e4 legacy-trunk
+14932 cdf68ce586c439ec5537211cb8eee96d29292434 legacy-trunk
+14933 151b913e74a1376267954211a30f23d8a8abb6f4 legacy-trunk
+14934 94b601faebaceaf2c4eb80b575965efe19af786e legacy-trunk
+14935 e75ac292ef4c1faa85f18b3875e94cfe37f6b0e0 legacy-trunk
+14936 f09e9d656a1154ebde9ac8cef59c9f567a216e01 legacy-trunk
+14937 c3fc2b4617fcd96e2799ad81dccdfa5880fdcdec legacy-trunk
+14938 4dd8b6a3b9c5dda8b4a3598c5c463aa16e3f0924 legacy-trunk
+14939 bc861add5d712a1835bbf6cdd8bd01793cd34279 legacy-trunk
+14940 6d108d509346a89204df3b98831b6af6ba0ae2bc legacy-trunk
+14941 7f18f979a93afa3ccdf7ad47013cce98e27233dc legacy-trunk
+14942 4763a3d59ab9a2558203743e8548620358dfd198 legacy-trunk
+14943 f28e92dbb9e8e14d8b64080f46830ec564b9294a legacy-trunk
+14944 42f21e47b48607072e9fc777d6b485b5a0e094d2 legacy-trunk
+14945 41dfc7d4a36b226fbf523b2372defb583a64839b legacy-trunk
+14946 6ff7f76a6f2e582e10f9b9dda1b8d36648fb3b35 legacy-trunk
+14947 fe3cb7341b70842b4af512ca1352347ff860d49b legacy-trunk
+14948 f83e408aeb05df1291e7d46076d81c6325d08878 legacy-trunk
+14949 253cdeeaf42ef6e87dd175a67959f3df55e3969b legacy-trunk
+14949 605eb9326ffe1fd1e43f40e2338d6652ab449fdf legacy-trunk
+14951 3e3d152a85547040f3fa853b6395384bcd90cd72 legacy-trunk
+14952 b73c9f8c537c1aed153aac3f6a72908de3546a68 legacy-trunk
+14953 0909f5623d4fa2c2c05ec1a63283b8af6eb4f9c2 legacy-trunk
+14954 37d82272f0f445bef0342a7c11f7bcf866721fd8 legacy-trunk
+14955 4bf98cc38db71ac615a12fae5d08377cf3702384 legacy-trunk
+14956 263bee4ef13c59a4e028aa194bbad22cf5365d8a legacy-trunk
+14957 1dc0b637eb1b3a59315919b9b7416aab63cc0d22 legacy-trunk
+14958 a216fe79ae00b417bdd4adf47f1ad6561984988b legacy-trunk
+14959 774817285b8ca2035550d4581b6f151c908a08ab legacy-trunk
+14960 33bfc51dec05cf39476fca554a828d1c5d4a7f58 legacy-trunk
+14961 5ea77341353198e07b25712be4e8a709f928a159 legacy-trunk
+14962 f97bb42d434485c1d69d139367b37147a4957508 legacy-trunk
+14963 530cd9afa80d543babde3aa08aa080f583317897 legacy-trunk
+14964 5a6200ff77aac4547c5c2833bffd9f9f98480870 legacy-trunk
+14965 17ce663967d8408c535ee1c0f525b805375533b8 legacy-trunk
+14966 3e9a1c1a9f56761e92ecc5072445a7889312a73c legacy-trunk
+14967 e82e82b3b9ad565ac8df8135a67fa611356dbe67 legacy-trunk
+14968 2dc1bdb4088ed6f18d56d25d73b46f6196b95a95 legacy-trunk
+14969 c405dbdd26c9ec5dcbe0c70887bf2fd12514b1f7 legacy-trunk
+14970 ffd242fed0e2dc9dc9872780c193cd06d3191551 legacy-trunk
+14971 23660b66bca30c0e5eed8400b68fe4b983bd34b7 legacy-trunk
+14972 77b02e53f6662f4c426c6c880f0d7c493ba7d1f4 legacy-trunk
+14973 7859c0a4ad95430bab52a80fea1d1b7da42f6867 legacy-trunk
+14974 7bf8b10ce2ab5c0d3b380788c18e61365ac19747 legacy-trunk
+14975 074c30ff3206fd9ffdb74fc339d2f164118aed8c legacy-trunk
+14976 63135e9def241e6f0a0a59732a271753b1793c9d legacy-trunk
+14977 d4923775202976e3d149715f8a68e5febcd7ee54 legacy-trunk
+14978 145c0073d78581b4a48d5aca45b287a7a36bb72b legacy-trunk
+14979 ce26d5f3d3ce7fa5c9d9247b97e379aa112adfd4 legacy-trunk
+14980 9235ac76176d452285434a00b3550b046143314d legacy-trunk
+14981 0cd22c84a4f14d6fbcbf9a7f4547241a2caa4138 legacy-trunk
+14982 de0f93d90ee4d19553bbff8334a25a5a85980031 legacy-trunk
+14983 0839838272241ed75a6497f3f5207589bc0820c3 legacy-trunk
+14984 729f3152765cb8f56bdc0a9bab5976ca9b79325b Distutils_0_1_3-branch
+14985 1b7c4945c61c189a46a9546d1cb1e8fbe93280b0 legacy-trunk
+14986 7fa3174849bdba7bd2884cbd5e5bc8b1233479bb Distutils_0_1_3-branch
+14987 190a9242f83a8b00d301cd209839a040996e19ca Distutils_0_1_3-branch
+14988 a0a24d3cfd9611b6dee2c9f7113e183951c3454f Distutils_0_1_3-branch
+14989 17605241663c19c050d13753a2ccc7c25e1454d7 Distutils_0_1_3-branch
+14990 fbffa7eb2a4f74f56e9503f8e25cd0aaa888a4a9 Distutils_0_1_3-branch
+14993 7e9a5cf55c7676a59696168653926e83a07ea6f5 legacy-trunk
+14994 1c3f91951f737a03732ede73627d106e1112c0a8 legacy-trunk
+14995 be3e0d1975223ee6810060df475b20cb505ed6d0 legacy-trunk
+14996 3dac854e611850ede790e1245943ceb8e1ba0bcc legacy-trunk
+14997 612be1bb65ffe1c1bd7f26b650456cfc36cf8320 legacy-trunk
+14998 bdfca54a141cbc3bbf1937b3ed9d46143b562a99 legacy-trunk
+14999 69d11df843c1544b2f2048396587a93fc598e1f9 legacy-trunk
+15000 70154e2e9c890e93f1e9b25707e09a565c7d220f legacy-trunk
+15001 9eb769e15f81bc24067f5b43a4038aedad9a071e legacy-trunk
+15002 0a3cb082c5dbdb4f9e7898cdcab4a473a59d6572 legacy-trunk
+15004 9dde315cde3969a60d1ac48f13a0dd4bc876299e legacy-trunk
+15005 4da06fdd3e6381bbfeb91654a940b425a5f642c7 legacy-trunk
+15006 41585e851f55b614945c20a1f4d7b80af63803d0 legacy-trunk
+15007 66903c3f14db4286d46f93a1262125d3ec580a52 legacy-trunk
+15008 c341e68f1988e393d06b4b1766d86c95c758b042 legacy-trunk
+15009 0ba85709a6712951a770a1b5d597338adac70a00 legacy-trunk
+15010 23266352f138c00ce7a9fb0b158bf7478d51ac33 legacy-trunk
+15011 65bc5eaf47ce96e12eb06d8af7c7dcda7464994f legacy-trunk
+15012 d1d016acce74eb289a4122f7e712c6d6d2d9834e legacy-trunk
+15013 8c0f863ba50c67e38bf747e4b7ed71bb8c026d04 legacy-trunk
+15014 fb20f6fdd16d6d048bc71b1c42fc593fb39aa1d9 legacy-trunk
+15015 aac112cca79b516d9ae213ebe6781a38f90e0a22 legacy-trunk
+15016 ff75e4734dd9fefdca7b0f7386e618e80f02dd1d legacy-trunk
+15017 64fcae78d47af635647b96e5b258c0dffb81e48e legacy-trunk
+15018 66e9c97f9f677c0bc678b08f76b5039c96e0516e legacy-trunk
+15019 76ed139fce59735fc50ed8e150a2b7548cae97f4 legacy-trunk
+15020 3fdaecffc4dddbc52545acc182275aecbd3c00e2 legacy-trunk
+15021 9e1f60976209f27fc3f8daf243fe5004ecf04d53 legacy-trunk
+15022 261e895440854f90d21343d9a0240f6f9eacf242 legacy-trunk
+15023 f6b58b021e5689297b06efe6245b0a9c0a7ecaf0 legacy-trunk
+15024 8a1ec8fc00fea66a603307186d903e7e68d03a6e legacy-trunk
+15025 0ac40e47bdb5e1f22609fd1803da741bd64e144f legacy-trunk
+15026 fd756112420764b0dfaf6afaec9146d2a71d7f95 legacy-trunk
+15027 559b25a79032acbc6fdd9ce4a73aec4fecade12b legacy-trunk
+15028 cf1338bc21c000bf5ed206abd34ee5c481c155e2 Distutils_0_1_3-branch
+15029 ca31e679024b5c88a31c6891be8c98c25be5e346 Distutils_0_1_3-branch
+15031 cbfa95a6a03ee69ae78ebcbfa2def83416458f18 legacy-trunk
+15032 8ef3672342649ea539d37d8139963a3b78d4ddb7 legacy-trunk
+15033 57fdfa00da9337a88f2ff5a1cce906ab3086dec8 legacy-trunk
+15034 647bf71912f02c14638e34974898f4f30abc9693 legacy-trunk
+15035 af8d2113bc1d024bc34e5763525fb2b8154750c4 legacy-trunk
+15036 d06b50ba81a62cc1bf31f7d410b7399828cf779b legacy-trunk
+15037 51c0c3b6d919effc561baae2130e8d44e295b37e legacy-trunk
+15038 3a94c7f85551e899ee5fc707fe478e14e908bceb legacy-trunk
+15039 960192518829b1eee9624ac89dd0f6a60863685e legacy-trunk
+15040 9c96e5d437a821b74994e2d898fcd3cfa0d4e8b4 legacy-trunk
+15041 8186145c4a07d6e286ee85bba7131a59861959ac legacy-trunk
+15042 4c6c2481693ed40691b6eca4246539fd64dec4f9 legacy-trunk
+15043 d1d22a36268f9534599cad3dc5227bbdd78b9bb3 legacy-trunk
+15044 5f3624bfa594c37cdea7c8bc7ca5ae02c0a51e7d legacy-trunk
+15045 fb75e8acfb05799e671362de64396c7584deff06 legacy-trunk
+15046 15d41149bf2429429cad4a1d394145d5d3574d5f legacy-trunk
+15047 b7f2b225d0c0205691ad88139729d237e315cd34 legacy-trunk
+15048 0d64ce7354b999e46f14b7058360e4210d6b448a legacy-trunk
+15049 9af9970657faeb8534d7599c5937c62aac9b5864 legacy-trunk
+15050 35a119aa19b4bee31b949faf5186a46ba9d84ea0 legacy-trunk
+15051 2346ac0780ce911b331955a41dcb65f030c0eb4c legacy-trunk
+15052 b157256dba7697c9bdb8eadf9be74a1d5855df57 legacy-trunk
+15053 1631986db13a664ff8c0fa5fd4d2cbbe78895bc0 legacy-trunk
+15054 d640e7d4aec48c5d61c40db6d997f21b8feb26a4 legacy-trunk
+15055 9172edaaeff586910dc4b50e4c8b44c28b2f69d0 legacy-trunk
+15056 17fc9f95990b48e17827ced93d7b6660e227f3fe legacy-trunk
+15057 40e58c5b6f84fadc28a67bd118d400d93bb5e002 legacy-trunk
+15058 fd905bb2f6b631032f02e439152883d68c893f1d legacy-trunk
+15059 0c62d1c76c06497dc0d38124bd68cbe3520fa672 legacy-trunk
+15060 bbaada41a20b69dd40f42a886c002fbfd6c3274e legacy-trunk
+15061 1f7c32801dc11e85027bcb87912a94d8a1ea5265 legacy-trunk
+15062 0a45b953f4c03e8df29f4e1e8f6fdf99b8110091 legacy-trunk
+15063 e540930642955a87f08bab8f9bcd3d9de92689ee legacy-trunk
+15064 ddc4e62b216b2fcbc56ccafa01be705094535c2e legacy-trunk
+15065 d3239b7c05fe98da51999f81b77852f8149f00e7 legacy-trunk
+15066 3e70c45f8d6bb8eb29cce69f823cf7559f78cf0e legacy-trunk
+15067 a3b046234c093121a4ef84e3b0d1006eba77ec20 legacy-trunk
+15068 f782446395db2d3e59b9dab9e6dec994f8aa8f22 legacy-trunk
+15069 90b2a3cd365fe30a1740de11ac91a50def061101 legacy-trunk
+15070 20a5cbf9fcc02c51c58b04a4db48f585ddc463a9 legacy-trunk
+15071 f1f665e075ca30599c56d71c508c33721d2e6dca legacy-trunk
+15072 540f10881a59729fe410d2c9c01f20533eafc175 legacy-trunk
+15073 29e753493d8e5d7899b6ad795498f45fa97e51b0 legacy-trunk
+15074 20a370f1af8dfa9a66f8005c8b0c44ce51cf1e12 legacy-trunk
+15075 57f34e162e676258d82aecaf3f29ff462090220e legacy-trunk
+15076 5de0b939fe61ccbdf7422455b3c8763d7a6e0c9d legacy-trunk
+15077 b321627382bc14597ebf3a917852b8bba269c154 legacy-trunk
+15078 d7629fa3b29f5817ef70582a2d1ad24bb289b3da legacy-trunk
+15079 1a207c68e8b4d5f8cef53adee9ccb455abefbd1a legacy-trunk
+15080 7296cdde8a5e3be918a992d8038b7c0dd0c21565 legacy-trunk
+15081 b5f6b4bcef90ecf637374c95ffd5b7f106028bc1 legacy-trunk
+15082 9488e4fdafe46b2558ac245b789153efa8119148 legacy-trunk
+15083 66b4906d0fc6be9ea7cff1b4361916294a73863f legacy-trunk
+15084 4f5671a313473c6ad2b54286ab5813714c961a38 legacy-trunk
+15085 3cc77848a62af7b70616b096c1d4257d6f281e91 legacy-trunk
+15086 77e4f21e3ee64a95dbef86f694ef65bd72cf736c legacy-trunk
+15087 d195f17f292731e61c9179bc5243a67b14b6fe8d legacy-trunk
+15088 6b4667fa49381dbed00e0166865f9f6ad20d592f legacy-trunk
+15089 525b2358721e9e90f75552a2bb66dc807f0f7745 legacy-trunk
+15090 37fd2e6c81c7d70e884b1289cb5c434832e8ced7 legacy-trunk
+15091 e69eef692612553376201c27ba0cf76e619768fc legacy-trunk
+15092 d33743102f8ad3f221e9336c8f97c411ee10dd9e legacy-trunk
+15093 8510b4ab3c3debc33a1d737e5becb755ac505f63 legacy-trunk
+15094 185de4e7cef10e2bd40361f08608d3b7c4d5fdfa legacy-trunk
+15095 9e9666f679f72c25680a8c67bdb9d14b90da6f12 legacy-trunk
+15096 e2620aab9f2d6cb1ce85dcc0abbb8b3734c69a24 legacy-trunk
+15097 fc557f431e87e0ddb631865aa51e99a73c94ea54 legacy-trunk
+15098 aa3b02a038a37aaa7da256b75eb287315e42ae15 legacy-trunk
+15099 be5100afa1b7ed1a9cdefbf1792c24cd742b665f legacy-trunk
+15100 fcf588d86b1409efef27fde7c78d029a60ad2ea6 legacy-trunk
+15101 e952a4b920adf07b50340481916fa3960d56613e legacy-trunk
+15102 24d4116897dd447b81c26fb89ac81905474ab07a legacy-trunk
+15103 facc105b641b01b9bde68de95a86875bc3220f28 legacy-trunk
+15104 16804b37d7525ce910bf62ee6f99faac00b764ea legacy-trunk
+15105 e4349b62fd9b419c3148328c6f7f42fc1bc620d2 legacy-trunk
+15106 c59bdc7fd8a61dcacde12059d62c362187b0940f legacy-trunk
+15107 6785619c33e1cb1c95e81c722762be82136c1014 legacy-trunk
+15108 179a6e2850aca5d0c75176d3c88af29e452a34ec legacy-trunk
+15109 54e80db4942375eb9c1dc59d0a99fbac5e8d0978 legacy-trunk
+15110 996eb3b3b33ec5323f506c41f4eb5ca7c90562c5 legacy-trunk
+15111 04802b7e8a1f0846e70a40116707a7837f646a99 legacy-trunk
+15112 1e791d2e88752e2ee76d966517e6b1b7af52ecef legacy-trunk
+15113 5b59ea41db4e8690b1676e4e50c5d0dd66b2b1b2 legacy-trunk
+15114 fbc8dafa4484c7e0b4ca4cc631cc5dcd784faeda legacy-trunk
+15115 11ecb6670f4f9e48016561e1830ed51add4cda29 legacy-trunk
+15116 f73bf492438682f38cfd88db5fa6d896b68f37b3 legacy-trunk
+15117 791a112be3bcf8baca81c269d97e0ba0c36a8a3d legacy-trunk
+15118 877969ec096fd4f610586cb5ba9b6b9912f098d2 legacy-trunk
+15119 7f650df271c9e3ee9f3c9b50089dc8f73dcddeeb legacy-trunk
+15120 e64faa6e27022d33b51c315debd21dda37db7599 legacy-trunk
+15121 7fa76ccdf2de73f3682446907e97e64edc33600f legacy-trunk
+15122 0481096a0f45bc970817d6fb9cf11404d49a3743 legacy-trunk
+15123 677e2147829a9d2ca0b9ff4dcda77f185a3f786d legacy-trunk
+15124 c2d0d6744b3bb7e5144b7b3980a901ea81fbf21a legacy-trunk
+15125 68e48bb940711fb18a6c67b076e333e8c7733595 legacy-trunk
+15126 af87fcae880fd9c8e475fdcfcf88cf3db6f265fd legacy-trunk
+15127 429a37ff9db5cc27be9160d83772567b6528908b legacy-trunk
+15128 214303d32f7664d43f84bdd0a658caad3d234c49 legacy-trunk
+15129 d63b57ac617d4db23bba6a4d634bf2c9874366b7 legacy-trunk
+15130 f57af360b7e5ef37e63a886fcc84a971b9bea2ce legacy-trunk
+15130 011bee8fd9f7f4da457ec71596484fb0882c0614 legacy-trunk
+15132 6ce6c23acd1421c8614adb4aa76d2739b13fce2d legacy-trunk
+15133 052fbd9314921ff7c7e82de1882b325629ae1ddb legacy-trunk
+15134 63ad754aa30ee2e66e6e5005aa5ed6f2632eba01 legacy-trunk
+15135 3be2f754c0239b81be1236426680124f078de006 legacy-trunk
+15136 37d9ded5ab914509f4432e430a6f67acb851ac64 legacy-trunk
+15137 116c3aa3ccf72d15de8c56dd244f7b7939728613 legacy-trunk
+15138 5f29d7c02433871858dcc472158a0df0ba5c6f52 legacy-trunk
+15140 be82573e444482d5093e045d6503a70e2243b18c legacy-trunk
+15141 aa013f2cf80be8bd015aa87bbda49894573f2686 legacy-trunk
+15142 627226df9f0181d9a7510db44e1aefb5fcef6dc0 legacy-trunk
+15143 32e9d0e789353343649a25a9e6a785ee3860d0e6 legacy-trunk
+15144 eef6a25f09c5316db8a2193531c526e0fb3f2543 legacy-trunk
+15145 c48172af13dc1528caee65a06e171ee0f502f311 legacy-trunk
+15146 e5b0bea03cfa50556ecea1005aa854780f1fd43b legacy-trunk
+15147 6edbae6dbcf55a8b7b2c687928945073fb9d23cb legacy-trunk
+15148 a6f0b399f6656959198098b17a8cd6ef21096487 legacy-trunk
+15149 8d7e07737b4c6a14c2efef1a8aa447a34c31b4d4 legacy-trunk
+15150 a0498b15244cd10c8dbaa20063d951cf84f032b9 legacy-trunk
+15151 60dd95c7599993629c496de2c4631403e6e5b846 legacy-trunk
+15152 3bb398996291f93f21f7481b2d3f4b07d136667e legacy-trunk
+15153 f82b2577fa0cf06726f7a48ae1268713cb4e971e legacy-trunk
+15154 f0705bcf673b2c753a14ba073367412c08d6cb0d legacy-trunk
+15155 2392d10e21f1694f67a947240c38872098604a3a legacy-trunk
+15156 8bf913020604ecded47982d46485308cc6ead597 legacy-trunk
+15157 9f2c7f7272fa71edb0c1da9778f5730415be6b56 legacy-trunk
+15158 a5743e147860c16aa65b3c85cb69dfda642b5f9c legacy-trunk
+15159 4c51a966d2a390eb36144ee733de50cdd8749258 legacy-trunk
+15160 81c966b35c1262201bf6cce5fb4533ad1980a516 legacy-trunk
+15161 67e961577d0eb8fa38ed9ca964de54703b728c19 legacy-trunk
+15162 15554d3a68c715c8395ed145c2316efb130ac1d7 legacy-trunk
+15163 ec6b6ca5d111623af75bc6fd052dbbaf2956f02b legacy-trunk
+15164 01cff9fe2d452129558b47dd7df7c1af26642481 legacy-trunk
+15165 2fb6c739d32471c11dde1de5741dbe4e6ee42f22 legacy-trunk
+15166 cb4f0d81880d5b4b5835922eb572bafee224c51e legacy-trunk
+15167 5b870c0ea7b61a0f8db40bbee61612a464279ec5 legacy-trunk
+15168 4c5d62e8675b389124b62c91d88a1174e3dd9ceb legacy-trunk
+15169 ae525ab23eefc61ec52dbe9771e26e45b28f68f5 legacy-trunk
+15170 7de902c1f439e56d1e908ff8103b6f4430d00e74 legacy-trunk
+15171 2fc53dda20eb63e4570ccb434a857eb647a7fa00 legacy-trunk
+15172 0b68990089d2149e0342f02c6fc1e54e5a4b8320 legacy-trunk
+15173 95e296e67a12c01dd629d88c3e684778a4f8f9cc legacy-trunk
+15174 259c4b9c4c88976fb23171ffc9b9dbceef66e240 legacy-trunk
+15175 ae106379e756c2776ca69c043e1fcaf0d974b41d legacy-trunk
+15176 1c85ae676ba7e5dbb821066f84405393b1fca31a legacy-trunk
+15177 3626261189b48d9b17a36c7e531f0f735831ad0b legacy-trunk
+15178 6979966ee94da167a0ec16ad52c9ea8b0be3576c legacy-trunk
+15179 6fb40a85a5197589954f622336e0487bed890a78 legacy-trunk
+15180 0d13ce2e155b938267f3f4199a09bd6844a45e9c legacy-trunk
+15181 0ae63523d504bdfa388c1669b833778f4edb30e6 legacy-trunk
+15182 c0bf3ed9383580ffe072e9f5bad643289e4129da legacy-trunk
+15183 e87e6bdfcbdc677891d236503f6d0c667565853e legacy-trunk
+15184 978c9687beef4fd64deb55484cc2d1d798666d57 legacy-trunk
+15185 6b2b9a23a41f1f8ca5648685c4ec643c0b515bea legacy-trunk
+15186 d9400c476b9dc2e5e311647dcaba43c90e1cf465 legacy-trunk
+15187 c6059e70bab23bebd4867f902ec64ae6734ed95b legacy-trunk
+15188 ca98942fe103b9cc220212818ee4d71a5b2eec36 legacy-trunk
+15189 3fd13222a876f3a187789996c82e679803170625 legacy-trunk
+15190 8161334942d4ff5b31a60198a96d80e2c1970ebd legacy-trunk
+15191 6a8cd06820961eab900b273eaf33a177f0d8626b legacy-trunk
+15192 ca7b99d27a4071a1e1a9c5599d817b7208f44a22 legacy-trunk
+15193 dff7b26116debd3bf4dd14c5dfa225bf18da7b1e legacy-trunk
+15194 8289c0e551cd31284ffb8bfbcb92852f9da7b3ce legacy-trunk
+15195 f0b71913c0aa7b08cc307374ffea037b9a6529c7 legacy-trunk
+15196 456869eaa7d591a5ddb87b5d5aad278d832e81bf legacy-trunk
+15197 d47460b1a67997277043fc2535f2627e4f1df5c3 legacy-trunk
+15198 d763341d3310be0eb46f55ca80b4c9801d42af51 legacy-trunk
+15199 c99bba9e9212cb10de345365fdd5f3599e2c6dab legacy-trunk
+15200 f876164fa1514989d1f431723e543e1395a1493a legacy-trunk
+15201 03b81912835ebe9b5c1aef18c79182f139697f04 legacy-trunk
+15202 9c4a4e6bd555aed0a7613af4de1855f2e6909c1c legacy-trunk
+15203 e367ad3ea59a861d31b10c8e1e8c0f188c2dde53 legacy-trunk
+15204 951d84e1d54beb0076493ef15e0c192565ddec26 legacy-trunk
+15205 e3bb239b2dbf5e05db7e4d822a1a73be48944a8b legacy-trunk
+15206 19f53d8bd298106c2867649cb9e02dae5366dc92 legacy-trunk
+15207 16dc80731c23a20c19034f07ab69e412f65e872d legacy-trunk
+15208 33ba0626ef72a9e103a85e353899b695ae9a5755 legacy-trunk
+15209 3469b2f17624f8627214c16b99ae5df0d16aead5 legacy-trunk
+15211 d0f290b3c0b23bc0584ad94c1c09707720c36d6c legacy-trunk
+15212 486161894507f4058e7e4e7b5746865d5c75b803 legacy-trunk
+15213 4cb333482160c8f82309ccda1e9c4641d84b4e1b legacy-trunk
+15214 de365b65c17bc8d9f32f0ce69a4a8c4de4bc03b6 legacy-trunk
+15215 d5fdc9b1e474c721ceed5fc62591ee692bf9e771 legacy-trunk
+15216 c28fa01e7329c3c416c1fd5eabfe5fda7c72897a legacy-trunk
+15217 e7623d01927c8c9fb5bd9293e511d89b2cff6acf legacy-trunk
+15218 e5b31acb10ceb6bf138d29eff8f0d9e61202221b legacy-trunk
+15219 fd0e5daef86ae6da2e6f7e0b88d2af9629871a6a legacy-trunk
+15220 144a89570a39cf05c5147eea3c2c7a2fa8ffb70c legacy-trunk
+15221 74d4e453a7f7da3965e1538b0ced39601c468d1e legacy-trunk
+15222 18951a024d11df2a758906bb627e599f466a8d4b legacy-trunk
+15223 6f5096a8d03a20b8c575ac6c997961c84d4b5781 legacy-trunk
+15224 49b0b846f683472d343061ed011ef3f0ed31039b legacy-trunk
+15225 0bf8abd02bd8d7cd1e64e74ab18fca6d70025a48 legacy-trunk
+15226 181c6f95f6f6a5ebbe3c7c3de9a78843d5dc382e legacy-trunk
+15227 7613f8b3c1ce4cd5098dee26791e23d1c7422c2b legacy-trunk
+15228 e39eb90b250a02a6241dfc4967076226488c7115 legacy-trunk
+15229 2a2d5ff933080771865b9ba0ee0c3cd39692ceef legacy-trunk
+15230 e567e33de645bf70d25e6a4a628ab079e2fe3684 legacy-trunk
+15231 fcb92b96f1afb56039312c022305dcf787f7115d legacy-trunk
+15232 699dfb1254cbf7238bf292f49eb7c157b0119cb4 legacy-trunk
+15233 c27f484aefffa7fe4306ff1465ea6640143f0675 legacy-trunk
+15234 3500c4350f626e110c08925542e7e8368e1c566a legacy-trunk
+15235 f1bff1ec796b6410932115c1648df7930e4248cd legacy-trunk
+15236 866af1d8797084c672afc8a65357a13877e57bcb legacy-trunk
+15237 a3e1fecb43c6e519ddadd15070e07710fe0ff59d legacy-trunk
+15238 be1d75e16cb81629e4c198e4fddfc4ae9fd1b9c0 legacy-trunk
+15239 a8898a172fe2f07697257575f3465934a69dcd73 legacy-trunk
+15240 a3c0b6cdd168a694313fbad89cb8b795933035d9 legacy-trunk
+15241 19e3e8f8c574d22a686ba391d2491f600d37e872 legacy-trunk
+15242 fc2768775f821983902eba509161d28b237cf6b1 legacy-trunk
+15243 0db5a36025261ff8e671f047a6e748df238b0bf5 legacy-trunk
+15245 10adbf8183e68e027d559995f107f128bd6fb4b7 legacy-trunk
+15246 f1e867ad7d85ac3a30402cc4923c9a9426d0c38b legacy-trunk
+15247 8b330d1638007718056580707175cfa8c5842f42 legacy-trunk
+15248 1958571d25c16bce4dfcc59688285ebf325a94d5 legacy-trunk
+15249 4cee2da3dacfd75dc7d11738b294ac3e35bc4532 legacy-trunk
+15250 720d3556b14385217ff35616b2be56b3679f2015 legacy-trunk
+15251 1725e802e3ebd52e7da5bd9a842760b7a659c7ed legacy-trunk
+15252 04cfa1341a509c17969d91a4f27e79ab50556b52 legacy-trunk
+15253 1cba6589ce667cef7c45699549ffdee08360716d legacy-trunk
+15254 bef24d48afc8c5b4d36ad18c604220667cbe191c legacy-trunk
+15255 2a53a3a47962a8ff2f084ec36cfded78cbebed82 legacy-trunk
+15256 e50bbb8e98dad2ae8bc2c87c52177c4e45b8d270 legacy-trunk
+15257 0d75555ed6eb6d970906ead0aca65923eec42bdf legacy-trunk
+15258 0780aba978989318af20fe4ed62356f1609d0368 legacy-trunk
+15259 eb433efa24deea8462df050859049db48b29cf5a legacy-trunk
+15260 bd92c53b166993344a14b5284541403b89705be9 legacy-trunk
+15261 2ce2a83253e80317c427bffa656bf68cec588b7b legacy-trunk
+15262 211483bd0a5182dcb6360c3e680253b7c86985fa legacy-trunk
+15263 44e521a93648a5127ea4d70a8f5f8894fcd5313d legacy-trunk
+15264 5c3e5999daa16b8119693f7997423568bec5d308 legacy-trunk
+15265 f4dd7c8848fca45d8b3eb0a3ede2b04107c33ec0 legacy-trunk
+15266 5661f4f9a47f798488b49fa597cd72117c87a27c legacy-trunk
+15267 b76bacccd346310d62a979be7da9b1f44187166b legacy-trunk
+15268 e63eccba873b764741ae5424da4631de136479dc legacy-trunk
+15269 13a16793bb1cf08098cbdaac74d0f00b8ca15c8d legacy-trunk
+15270 8747f1c8b5fbeb1f78df3a39f67f3ba79fea09fb legacy-trunk
+15271 a61157328b121e15db61113bbd5d8a453262e8b8 legacy-trunk
+15272 ca0e9d97d554c485add6bb8a8559e2191d8558b7 legacy-trunk
+15273 ba54862c8785c20ef887df49650a7b3be4f8f2b1 legacy-trunk
+15274 fb4775111ed9d512f51c8044dd1e370af518ff03 legacy-trunk
+15275 e6e914d5b2072fe46edd586dd43d768345892407 legacy-trunk
+15276 6ebe0acb77764912ca3e08aa32dac886e2fcca25 legacy-trunk
+15277 9e53a7112395fb409d8056d3833bb2b681e351e0 legacy-trunk
+15278 af9d623babb077177510b8cf008e886614f91e9a legacy-trunk
+15279 b6b7bd20c845b737689b1290c5107a0abbd42192 legacy-trunk
+15280 d357ae8fbfe590aaab1cf5e6ca4f4aa871cb4305 legacy-trunk
+15281 0c28c9cabbdaeb0fb97ed652dfb9603f7c37f0d6 legacy-trunk
+15282 019eaef637ff5f99ce612a1d9f88d4ad93c23e24 legacy-trunk
+15283 4ae127312bbfd785edb7fd31798e4d8f40befad1 legacy-trunk
+15284 b476e4a8c8911d2c4eeabadcf1d7519b3de446b2 legacy-trunk
+15285 6f73848b845219193f0e0d2bae0c5eb0ad19b869 legacy-trunk
+15286 5ae85bdc5f61650a54dd81f81a3b380621ac333e legacy-trunk
+15287 c0adbc9ca581318d6442986cdc32ab4e46626d20 legacy-trunk
+15288 540d9bb16439f07bace07af7a3861442b62e5e4c legacy-trunk
+15289 c2bb5e4b04a89d63f702843424b6fc36625d52a1 legacy-trunk
+15290 84cd52b560e571eba371d7136abcc9c42c27b002 legacy-trunk
+15291 82cbb2dfe8bdb27be12370bda830c92756048d44 legacy-trunk
+15292 5235656f9d0f0e22dcd113a508871fb60ca52094 legacy-trunk
+15293 189298a1fab4c223286fdd26877933e11e41e890 legacy-trunk
+15294 8a503654472778835f1b5fb2fce7130423bbb2db legacy-trunk
+15295 cc05edcccf52ba37af52de48069f682352c40ae2 legacy-trunk
+15296 7cc3dd7cd31ac6a5cf826fb0bc83d6dffc396c21 legacy-trunk
+15297 859e500f07600463d57dbb9f6687e61349a766f5 legacy-trunk
+15298 d7484a7433541aa978f043726bc79f5217da2009 legacy-trunk
+15299 81a121d2134083fdbbf326e6174f13797b34a04f legacy-trunk
+15300 c34ba3e3cfcd3850dcc417e6bba9c7b57289944c legacy-trunk
+15301 59ee1712451159c918ad298664e97d81b4ea0e47 legacy-trunk
+15302 c8dbd5f70288b849c7e0af9337ec7a084636c752 legacy-trunk
+15303 599bfa4ffd49c14594bcb54420c0b431d18a7745 legacy-trunk
+15304 6b647e087925ab7738d41d5818fb48bd47c7b387 legacy-trunk
+15305 769edb2da8b93ff7a214a82a011ba2405af0af06 legacy-trunk
+15306 177e61c55426db416682f9a678cb44ac617ef613 legacy-trunk
+15307 3e6e8f76a988383638dc87587ae4c8b31094ae6d legacy-trunk
+15308 efd1e5d2284af54ea33f3381e03a604bc98725ce legacy-trunk
+15309 dc9d1b71cc380c6f7ee58572e546eb68a0a825db legacy-trunk
+15310 bef675dc11cc0bc184472df670f6fd7cace634ad legacy-trunk
+15311 66e47e85ec53b5eba87b00a5ee10ce7c1e25bc38 legacy-trunk
+15312 12c74b102d027d7db06e3a2a03039d5ceccb3612 legacy-trunk
+15313 8f7b24b40de736173a43c49134a05417e632ee9a legacy-trunk
+15314 04cf788d862be06aa9fff8d9f1f2e5488d91d708 legacy-trunk
+15315 78380dfb2a906dae26dd0cbd4e9e13aa779a093a legacy-trunk
+15316 9a841d68453a7c8deef5219cd32a670b904ba3ee legacy-trunk
+15317 4df8462a259deb880f2a78f4c5e467d8d114e01b legacy-trunk
+15318 3b8d9e63e4e157b715e7968a86fa4bc4c9d87294 legacy-trunk
+15319 38d5a11d9cd4b000ef61a4167fa667873eb8e896 legacy-trunk
+15320 7b8d0a47daa97b66600d926f2ea75ba64c7f525e legacy-trunk
+15321 7b0e0b5867e2d39661033bcb76358339294bf96d legacy-trunk
+15322 b87d75798d816c32a14ccefe180be628fbde5c4f legacy-trunk
+15323 b0a4350d5c03137883412aae4b427f1cf571b547 legacy-trunk
+15324 539a1a99a78b48236f00c2d6283b61de260adace legacy-trunk
+15325 19e61b8f4e006cdf2bf648b5515ece6eb9ed39b3 legacy-trunk
+15326 1be2331588b238b3d8fd802c2c36143af14878c3 legacy-trunk
+15327 66dd298eaf8a5d4aa5f82a668a2c88bcab25ceb2 legacy-trunk
+15328 9a97a714a1be0301efc5a49babbadaaa26e85716 legacy-trunk
+15329 3dbe4138026660843a6d6bef54dcd399f391619e legacy-trunk
+15330 8bcd14313c11cdc91768c16501f7dcbd5a3c09d8 legacy-trunk
+15331 0df18f9472678c6c0c324c860773c8bb353c1765 legacy-trunk
+15332 5952ef6786c200833fcc3b1faa4c729171a39219 legacy-trunk
+15333 aee7c44bb4fe5befbede7a8f8a46760f4fe96f56 legacy-trunk
+15334 8ba8b5857e89756c8ab71df738a75c859c5e7f07 legacy-trunk
+15335 af86cf882d0ffc0d61ae12cf5ef7eebec5712cfc unlabeled-1.98.2
+15336 1c7c2dd1beb1f8106a7afa61d4b8babcc83e1757 legacy-trunk
+15337 dc789b3e2b9b98d8460f00e1f1c915a45d2211a5 unlabeled-2.108.2
+15338 85f00f8cd674bbc637c181fe5ac75a8170e5af41 legacy-trunk
+15339 077456c324bc598901490ba0a45177005e5c10f9 legacy-trunk
+15340 9782535420760cbee960b86c13f38ad17d99a79d legacy-trunk
+15341 e0a12095fac2e108dd7dc346628b70ed0f45ff34 legacy-trunk
+15342 6ac3a2c0040fcb1dfb4c88d92eca86b3e6d9c0a9 legacy-trunk
+15343 0bab1e36a3a6c23f736a09519809ae913290dea9 legacy-trunk
+15344 db9458c2b63107f350561da2fffdc7b3d5e8f19c legacy-trunk
+15345 cde4da18c4fa09aad8219d6596f1bfe3997b2073 legacy-trunk
+15346 0b91c3b384d8cc36edd34aa43613288e3cfd6d88 legacy-trunk
+15347 6ce21e45a96eebb8895a8286fba1132c48e2ae33 legacy-trunk
+15348 485d5eaf0f757106f046b42c978ea7520da0909e legacy-trunk
+15349 54274beb244d1d9b0c6e34df243c973284d3e178 legacy-trunk
+15350 2cc6e6dfe9bb7565e317b5f6b7caf1148574e04c legacy-trunk
+15351 cef45f1a7943078cb04da5c972f3656483a02614 legacy-trunk
+15352 e442662b28e18900171eb9ec3473c60589c5ba22 legacy-trunk
+15353 76b3399b364cdd661498c81fb09af8aec9abd542 legacy-trunk
+15354 eaee924efb192cd9940e0196a7bfbb58febaef2c legacy-trunk
+15355 528cfe879665207a1e4ce7d025d90a91323837c9 legacy-trunk
+15356 05c06715657bcc4e0926a8c52ceda75037be4cde legacy-trunk
+15357 56423b9380f4f76b36c06c2d2df3f2ac53cb84a4 legacy-trunk
+15358 626c97ab128cfe997686d63e7a13f9178db78342 legacy-trunk
+15359 92d1ddc1c57fdb9e06c640a7dd2f2cea1c56ba90 legacy-trunk
+15360 6455d8fb78761e6967f97ee0c76679ce405a5b72 legacy-trunk
+15361 b570d4cd640ac38dfebf3e36a9e9670acf8b5575 legacy-trunk
+15362 82f176b7067b7cf32c66d92d97f1c6ae21a89614 legacy-trunk
+15363 dd6078d20f7f82e05b9b1831f76d9aa0236af77f legacy-trunk
+15364 35cdb3d03fd352c500ded55cc0179f949e6f2419 legacy-trunk
+15365 b5f7ab27223795334c9940300f34dd146b86b42c legacy-trunk
+15366 a11129ceeca5df69e47c1bbc7bafd0e7ff898578 legacy-trunk
+15367 51253e08f7678810cdd140d8a671e95c4b8c2f64 legacy-trunk
+15368 a8ab09ef48b7af55f57546e9755251904941b041 legacy-trunk
+15369 32bd4bad108ba8ccc4b46a7209ac9cd087c52c5d legacy-trunk
+15370 71e420296ef1127ee551504b1e4d7b142b6f21b7 legacy-trunk
+15371 c195fa157541c61cff7d83db61397729691e23d6 legacy-trunk
+15372 b320cf3a98b906fdaf7f57f0a756d50001c8fb2f legacy-trunk
+15373 5648df74395f9b437bd9fac24c900f54a09699af legacy-trunk
+15374 8228c3ae9130aa88083b4c26673670dc2234f30b legacy-trunk
+15375 8d7ad3818ea6e738c5e9ce8709acf57db2d2e960 legacy-trunk
+15376 67233df130373e77e192a2b673fbecce11d546d7 legacy-trunk
+15377 81babba5bd34e99b3103a1c9287b04a39825a582 legacy-trunk
+15378 d9cfa2e6f782085078167ed00acc1cde5d3be9f1 legacy-trunk
+15379 cc4350b1b91fc9537217a8c42ab5d517b82141b8 legacy-trunk
+15380 eb49141d6e10f0754461e37f6dd8ecd8f94465b4 legacy-trunk
+15381 9ea6ae8cf05cbecf89b184c780ce9cad256b7aa2 legacy-trunk
+15382 8a82ddaeba6aa140ac16fd73f3d2caca0ae4e778 legacy-trunk
+15383 f7f9a740ed1cb5d23b2d94a1189208225d902e75 legacy-trunk
+15384 9a7725ea78eb0b0a7114360f724570fee54335bb legacy-trunk
+15385 6e073ba514142d99007509914aa4da8a90adc75b legacy-trunk
+15386 111dc9168e435c2c2e7fa3b411d584757d732266 legacy-trunk
+15387 a6c8413b3c4ff5386b5587b2894bcb44b3d77c58 legacy-trunk
+15388 87f5946c56f566b5fc3721c97e7f008ae38cdaf0 legacy-trunk
+15389 e7c98af0208491d9cc1c38d2d42b0dad464cbe0f legacy-trunk
+15390 3efeaa7521e41b2fadd68db181391ea1409f57bc legacy-trunk
+15391 57d4fc8308e3f17cf732b0729661d99ee4415305 legacy-trunk
+15392 132e27149f9f3d678e1cae13ff4444f06d2a0176 legacy-trunk
+15393 34d2b50eff2eb931d513b0cce84a0b9d7c183a10 legacy-trunk
+15394 a56707b07b81dd4417a461e415eb4eae3b5bc46b legacy-trunk
+15395 ddf986a971b568a422b35f4c5bcbce80a74491a3 legacy-trunk
+15396 bea3d770be0ac4eeb0e45ab3a2921a6d60cae5b2 legacy-trunk
+15397 75da9d63531d3257904486ec7bde76c4160ec449 legacy-trunk
+15398 69481cde511d865df719ac0e66620be1fb191a59 legacy-trunk
+15399 def959352422d18d7db3d619bd28ce199e58bbb4 legacy-trunk
+15400 917d845e6e5f21e499e5e97a5625993acbb551ca legacy-trunk
+15401 3f06f4765ba421b2fe787545ba42b51a69d05acd legacy-trunk
+15402 004bb20db11e0867ec54009736cee707abd883f1 legacy-trunk
+15403 91b2ec20763349ef40ea31298cfac219cb169239 legacy-trunk
+15404 06ff966f69d52f3b037084d43ca5a99f032bc934 legacy-trunk
+15405 00aa63d6d26ea0d5002192756836f5bfb35dd79c legacy-trunk
+15406 c4eb70d24a873fcc43ce5e1923f0d5204a6cf3c1 legacy-trunk
+15407 17d1a3f1f085d7a64e36f50bd30f534a4a492f70 legacy-trunk
+15408 035abb930317f3dc80ed483f1b27738448973b34 legacy-trunk
+15409 2a53f5dc0590fdd80b06b9ccd2c0c7339588ea90 legacy-trunk
+15410 c92668766f5df9b9ae343227f02f7b623f960691 legacy-trunk
+15411 1b083fed9a48f3b4e55a884c1d964850e099d07f legacy-trunk
+15412 faa98c8f3f4225259f404049ba971b81fe2b8d75 legacy-trunk
+15413 866365b44f2374857d791e6c064c8769b4a686f2 legacy-trunk
+15414 0a3081de55a185787dbc43658bd629395be6831a legacy-trunk
+15415 6b143ca4fd7f234e0472bdf14c45d450b87db073 legacy-trunk
+15416 4cc74bf80e0bc7fb2823751bb2b4a532570d6ac2 legacy-trunk
+15417 f7a899647cb3fb0f09b9dc14095b03bb46a61326 legacy-trunk
+15418 805bb90af14d710f43f18fa1506b5c1f4331495a legacy-trunk
+15419 e2e436a6289819122291a2df77da5c33dd7fe358 legacy-trunk
+15420 b6563d9df06d072e3229342e7f1e0616d1f6727e legacy-trunk
+15421 054933faf77a117ddf3744bfbf50099466a60214 legacy-trunk
+15422 b91fdc29c5bd2c0a36d242d32fc4e2fec7d9ba85 legacy-trunk
+15423 aa9a635a6f477a87599b9b2d0b35a495e696e745 legacy-trunk
+15424 1ea8cf885f7bd931bf8c59df68616d861217d1fb legacy-trunk
+15425 b77891fa93b0e43d034cc7c39d9505209ad7c35c legacy-trunk
+15426 057097796120b863cd88dd8c651f6b829d3146af legacy-trunk
+15427 4df523998e5d949763a32772752695cddd1a5ad6 legacy-trunk
+15428 7d0255bee0f98a813da57090f908a0e737fd504c legacy-trunk
+15429 06a346eb3cbf03b065fd11a144d76fbd5418a222 legacy-trunk
+15430 2a6dc65c060f58dd301ea8d998c3aa9b8ae7dabf legacy-trunk
+15431 2feb9790b40456fec7364cbada968359c770da7e legacy-trunk
+15432 a02e6a43ca15b0991e17c54bb3cab68d89b497f8 legacy-trunk
+15433 47bdb636159c805a357e2eb18d0b01609260580a legacy-trunk
+15434 5646773320bea6dad64b55450806a2757781a92c legacy-trunk
+15435 116fc4305a39b132ed2eff7cfddaeb455946aba9 legacy-trunk
+15436 de435a59a4d53555d151e0410f1504ed4927382d legacy-trunk
+15437 07dc3ed17dd5d95b6e4e6af56835c5c8fdca5c3f legacy-trunk
+15438 234074545eb4e197a7f8de8b35654b352d466da3 legacy-trunk
+15439 875e677236a71898826be9820463c12cceff0d24 legacy-trunk
+15440 8e81c6c524b205ad51325f5a46a52ba2c0d9e55c legacy-trunk
+15441 b89da202d18d769c3aa83f699a3fa0f2985ad4c3 legacy-trunk
+15442 bdae6b90934f46dd468a3c308949bd6c30673721 legacy-trunk
+15443 7c89ee40730f40e30547ff037fa5d011cecfda39 legacy-trunk
+15444 2e1b0483b101b3076482cd7cd453fc2c074318db legacy-trunk
+15445 34f0906fe823484614db9fb5a1629fb32b7b2be1 legacy-trunk
+15446 cbf9d67b5fc1f5b0a34e9c4dfaf6f38a70209b1c legacy-trunk
+15447 bc96c912dce8cd59ee0cd846d78589fb16b5b139 legacy-trunk
+15448 6bad16789f79b452533d2917607af92288f9a71f legacy-trunk
+15449 9cb960860528f337ffd4153e7c585348e9694786 legacy-trunk
+15450 20b3b9765cec66bdaa7ca4bd5246d827b6272913 legacy-trunk
+15451 728c16053368aedc60ad6db83a104c40b3541fda legacy-trunk
+15452 7b466a73c961663e8b8c247e83989fabb92d8e80 legacy-trunk
+15453 420f9aaf880bde31de4d10c88f2a1b30a59889c4 legacy-trunk
+15454 1dee93eb9ee3215a7f5ff6aadd6712859e4548d5 legacy-trunk
+15455 a94269bd65859194ad51dae834248c0061ac6e79 legacy-trunk
+15456 a48b60b6eb4837dc68e361f87c0374f65053ed76 legacy-trunk
+15457 a49e450688e2e0d68053df0d9edeb1dfd230842a legacy-trunk
+15458 902800d8e8be115e52e5b24bb191ccd7130b86aa legacy-trunk
+15459 eb1718c5a56c0dbea03fed92cbce1cf4bc6677fc legacy-trunk
+15460 ee972ca65c1c2314aa1af78d4f071814a3e4992d legacy-trunk
+15461 94ede04b9a9eeadfa24c168ee3b0a4aeaae59807 legacy-trunk
+15462 90c7906b0999b51a75d8da51f759eb3081b62e88 legacy-trunk
+15463 58ad6196d81f2b489954e14f3fac72bf1b59d8b7 legacy-trunk
+15464 f555fd8050855ea8c19984fdbb7382a67d2ed9f5 legacy-trunk
+15465 6059a9279d9994b05da60c22f5abbf60f9e39d8f legacy-trunk
+15466 7ff5ae10a771d7c6d9fd88b2d509df6b2b61cc70 legacy-trunk
+15467 29775c2872378f5438da7e4e95d8df29a8cb0930 legacy-trunk
+15468 9abefc5b1d89a2fb6312b74b0c6a028bb4bd7564 legacy-trunk
+15469 35305991719b517e29dd5f1a9aa123e0886e756f legacy-trunk
+15470 1bf714e0c10f5adc6d252aceb18fbf78cdc3f9af legacy-trunk
+15471 942ce221128a283015530f69377f58c4329ccf19 legacy-trunk
+15472 b817f1639939cfd44f396f6eb6b04dd58ab50090 legacy-trunk
+15473 be55f5ddc615bd215c1846cf5212082b88de5c3b legacy-trunk
+15474 7efbb4e6afca830db1fe8dafd249382c6e95e8f8 legacy-trunk
+15475 8dca55867998a592cf09c3f39469d79bb04a1391 legacy-trunk
+15476 6ad8cd34ad8c8f1acb18f2bf57abcd923035319f legacy-trunk
+15477 aecf35f0c16ba3c9e939a2123345de3ff5525ac8 legacy-trunk
+15478 0a6af59ebffd93ad5b89b2d01665120d994b30c4 legacy-trunk
+15479 53e54bd4e5f4acb1baf58e84a0232542f9483163 legacy-trunk
+15480 ff81a65e0a9bb22067fc6a5f4c3ccfa085d4bd3b legacy-trunk
+15481 2ea98d9dc669449f6917ba97af903cedfdf55524 legacy-trunk
+15482 a598ace019439c503395e9578e83046f50c4b9e7 legacy-trunk
+15483 052afb74952ecfd32980d1e480c15a9507b3c741 legacy-trunk
+15484 d040cebd74ac2f253520794f3f7d6532d0ace22d legacy-trunk
+15485 2b498837cd858686771cc26a918c2555c654a64b legacy-trunk
+15486 40d6d2fc9cfff47972156bd1bdf2eaf38e824662 legacy-trunk
+15487 5dd3b35bfd522f8a30c8f7c7885464b83d71131e legacy-trunk
+15488 ce3de294362b8a852bb10717bbc757951f43dc75 legacy-trunk
+15489 4fd845922c49ae0e4ce920e855fd7e3fa75df68e legacy-trunk
+15490 24ab84dc42abf09840a6c4de2cab1d164ccbcc99 legacy-trunk
+15491 147d0b4144ea17df0f803c5419b0ddd3f1d47dd5 legacy-trunk
+15492 4118f002e737732ed077f1fbde7b9ff1762f22f6 legacy-trunk
+15493 7954ff93ee3bc69f79c98c4fd301ab01a9679b9f legacy-trunk
+15494 81383222098a3d9d418fc2bede5395aef0c9264e legacy-trunk
+15495 cab22bcbf5b6dc6a3e94e48c9c5bf8d012524d3d legacy-trunk
+15496 d2d865d958612643b090cbe65180f54c2a257dc6 legacy-trunk
+15497 d2573dbf685254487dc87b887ecde6b70f764e08 legacy-trunk
+15498 77a5a14695b32a9e177a25471ecd4d4e4e7ed9d8 legacy-trunk
+15499 3d26cb3808a7d220ddf7cf124a75d2f97c396a9b legacy-trunk
+15500 18b0356505a5a4ac2677848bfb564e7ff7b49581 legacy-trunk
+15501 89f42099c5dd6f42f42e42f4b60b9c6f4c2507e3 legacy-trunk
+15502 b50bf7d3961f87e56a28acbe0f59d990a26ec77a legacy-trunk
+15503 570facb73e364f777255f62fe94899015df6e311 legacy-trunk
+15504 e878a647e06eaf91fc4d83442d5a090747f4b265 legacy-trunk
+15505 eeafab8c925be6844ffb53d801a1fda815817cd3 legacy-trunk
+15506 dad205d13bb59db6342792dd0a42bb0c00d0c248 legacy-trunk
+15507 3c30f7b510d34136fa6ad376fda48b56f45d0804 legacy-trunk
+15508 6c6844a2fa304f02030d568129b4d92259116449 legacy-trunk
+15509 eb562df0cebe0efefcf0df620bd820c4c8f6e3c6 legacy-trunk
+15510 bce49a6fa8b9e5bd26b23e4597dd8c2641dfc58b legacy-trunk
+15511 2497e1c9ebceea7188e385bba9a65c43c74e36d7 legacy-trunk
+15512 2c2b40eb3a6546319073114076dcc53f250f1ca4 legacy-trunk
+15513 7b49334a63696acc4c83dd07db91e6c261ea59c7 legacy-trunk
+15514 86ec75dac272bafc7e6add99739accc1ccceb1f8 legacy-trunk
+15515 5213abfe5230beb03fc1996010176570488abc4c legacy-trunk
+15516 889f2cb3f72aaf8209635912b6ef67cde29e0258 legacy-trunk
+15517 ecddb2ed4c756a75cdbdff4a77a5aab850e798f1 legacy-trunk
+15518 f0d2253b664f58d3ca499b2a2e573891f47226ae legacy-trunk
+15519 406b0e24d62e73f8ab8b4e56f59d13470ae6b31a legacy-trunk
+15520 1de0017e12267b1011936f571f306c80b7737909 legacy-trunk
+15521 0f1e4e3935d7c40038bf9d20000c9392c4ebed31 legacy-trunk
+15522 da02a892d61186459669713699b7bdf13e19c214 legacy-trunk
+15523 9e1b8050de63a45ea4d2083c8b127f12c5ea8e8b legacy-trunk
+15524 3c149d38abf9fc489f947f995498b634562faeba legacy-trunk
+15525 c8a9d1766465ce5afbee9c00991b7908f6ab0a66 legacy-trunk
+15526 e0ef622f8c23ce94ec29db590c4ccdba19909769 legacy-trunk
+15527 967732dd3f959ba86f16fed8d9cb9e59ed967740 legacy-trunk
+15528 9cbcad2e872384591ca96cfa63b9a9cd85cc2237 legacy-trunk
+15529 b5ab47365bad658ac20a3a91fa7b8eb11a1f1a1a legacy-trunk
+15530 263cdf9c842ee74d41c5049a6f4da9db157f4361 legacy-trunk
+15531 fb4039b1cf8d75f12bd5f9f880ee961a79cb4c05 legacy-trunk
+15532 52c6ac2d16a8caeeb80786612e8cb2466299ccef legacy-trunk
+15533 7a4f6402c67f8875c66df8024959c0c66246bbc3 legacy-trunk
+15534 b0694c1c1287d8b6df939a353da7b1badd251b44 legacy-trunk
+15535 40db909ce2e32aaf6a74e829baa65402664349c6 legacy-trunk
+15536 8e2b35d386aacac76d7954cd6cba3de216bf8486 legacy-trunk
+15537 342947f2fb51431d84b743343a260938b8b1c844 legacy-trunk
+15538 38da864a0c8066ac5d2849f18ed48a4e254b4ef1 legacy-trunk
+15539 0263a99d0eb2888dc9a97ccd8fa3e3b81199d5fb legacy-trunk
+15540 0570de9c8202d5be063cefd18ff006095abf7ba2 legacy-trunk
+15541 9335daa9ddd3b03862614b21e3df1fc1a0a1aae1 legacy-trunk
+15542 936efdc01d524690fe2188b29113afe81e61e3d3 legacy-trunk
+15543 771b3e1a771c8f8774340578781a221c16cc5841 legacy-trunk
+15544 b91b35c1d4c008ed8b99f9a9c0719eb90e5b6601 legacy-trunk
+15545 5398b18f8319d1e44fe5426a6ddb731acbc5ef28 legacy-trunk
+15546 f6e730f65bce62ebf95c82a57a992be6db00e27e legacy-trunk
+15547 f768d4dad9a62a37edc0fc788784d726891004ce legacy-trunk
+15548 6f7df985a80c47d60a3bb53aee8997ba8c19af89 legacy-trunk
+15549 8004d29c77b8bd29629e07c78c4c23113e2a047a legacy-trunk
+15550 f0d03689c1ae004ff7ec162983a4cf9fa0048163 legacy-trunk
+15551 f8c1c5b7dc9f4b9737046cb874693aeeb7aaf213 legacy-trunk
+15552 937f9859c9de1b69688c44f6a95f6e67cb95c9c5 legacy-trunk
+15553 5ce42e07afd85ae9cf78d8475454418221f40076 legacy-trunk
+15554 53974451e31f11668828de96ac8023c3b0be48e9 legacy-trunk
+15555 074819afdc95ab1d1632430f7732863015f25126 legacy-trunk
+15556 ee119051df77f415daeb5b9111896dd22f82b471 legacy-trunk
+15557 5c0edb351c07279188540c488e4d904ae49f6342 legacy-trunk
+15558 09f70f91bdae2e8f5ac9ae1b2ad76db40bd1f0f7 legacy-trunk
+15559 88d0b3383fe2556439ee30650f376a4c10df818a legacy-trunk
+15560 d81c95dd4039dda8f5ad696531fbcab069c37c27 legacy-trunk
+15561 3aab0c5190090af69615ad8ce3144414e6f0151a legacy-trunk
+15562 eef2b918d07ac86924db0ae502cbb8a1a861ade8 legacy-trunk
+15563 33ddc12df267d84d1083122fd7c0b811cde508f7 legacy-trunk
+15564 f6d7e32866092611d443a62c9790a3767847d361 legacy-trunk
+15565 3be92cef191744996fb00bf76fc983f5f2e2462e legacy-trunk
+15566 e36be7fb76ccc7fbaf8402c46462ff1e32f8f804 legacy-trunk
+15567 583def8cedf4310dc1d15e6cec7a1be94f526bc3 legacy-trunk
+15568 bce53b14721e919bc9521efc37858320205970a7 legacy-trunk
+15569 bc1fe956239983f22ed36fa3dba6c6fd07d04c1e legacy-trunk
+15570 258eed4570ce890c10f7347d5e06a9cd73b9ad97 legacy-trunk
+15571 711b329609347d5d270681f9543bb638226e5b1a legacy-trunk
+15572 b12ada2eb312b06d039e140713213973cc5dfec0 legacy-trunk
+15573 0c217e5f055b76e490b1823e4613a06c4d37d83f legacy-trunk
+15574 f1f9c30a415695748b8d9b5404371592531fd01e legacy-trunk
+15575 b1b260a2de987e87853981776a3dddd286af0b3e legacy-trunk
+15576 ff0f7281bfb84bc2644448f82b804fc2507c1172 legacy-trunk
+15577 4272b368bf69f6ceaa3fe7f9bb18bb5c8556bebb legacy-trunk
+15578 5f1f8ddc2a0cde49a87e9378ed2519923291a7b3 legacy-trunk
+15579 666782326d42c0db35b01312ae62b906d2e5c828 legacy-trunk
+15580 a24d9ad6786d66392661aa256d6c58aa484426bf legacy-trunk
+15581 35ea5de1ee83ab5f5679c2172050d58f4f8a4e4e legacy-trunk
+15582 f2db60943d6b831b942ff054df7660135b29a010 legacy-trunk
+15583 723df0c801d1dc4a5a5f75f4ede2ade16b6d8a5f legacy-trunk
+15584 2c7a47c64e306e6caa2fd825c8d4010e52e7dcfc legacy-trunk
+15585 b5319f4225913f04016759c1f02ed3a5b7836648 legacy-trunk
+15586 c9298ec637c5a612d749d29979f8619182542735 legacy-trunk
+15587 7d2a0063e26dffebe2d253a02279eaa00209ad41 legacy-trunk
+15588 04774d622ea2de219be9a85c29195492ea453d5e legacy-trunk
+15589 62ad35708b8c6f77022c9d4cfd8de6501cc5baf3 legacy-trunk
+15590 af38a7a7af10b76c3aa875d302a3d924afe8a8a6 legacy-trunk
+15591 2f606867ab4e7b06179de3049e613c59257bd9ba legacy-trunk
+15592 1f531208be1173b7de03b0462ee5781389d17a20 legacy-trunk
+15593 b90d601d4d593a82f487ac8be5001293244b8c07 legacy-trunk
+15594 41c0c60dcaf5f5296a635ccd5a38090666423bb9 legacy-trunk
+15595 c2a0f2a81fa8a9b5a9ce235de97513a0633bda17 legacy-trunk
+15596 bc35647fe4729c1b3565fa50868d3d8e9dcb31bd legacy-trunk
+15597 3fe304050434e3a0066d799d25ca0c948a676fbc legacy-trunk
+15598 4e9eb866aac6a5835d71debaccf25574b8776830 legacy-trunk
+15599 16155989fa932a62181da50b91ddb8d0ee9085bd legacy-trunk
+15600 b4ba32bb758bec3c88d0888dd44ddbb3728c721d legacy-trunk
+15601 3912fb6c63f6133dbfb46ace56bac6f5c5b89a78 legacy-trunk
+15602 645d57ef16395673cf67e1b58ad268d8052ef65c legacy-trunk
+15603 4e9f7724ac559502c540701083b209edb3650bc7 legacy-trunk
+15604 040c1097cd35244e99fe688c4f42893bd9f589d1 legacy-trunk
+15605 afd7cbe1c492f6356f9a7d25a5f05a5f158ddd34 legacy-trunk
+15606 229fd3a5afa081d4a24f7aa587b778e02770f8ad legacy-trunk
+15607 b58b9033c65a42ec027264747a05d205e3f3686c legacy-trunk
+15608 4916d40d96776a9c844c803f9a1b3eedcab7709a legacy-trunk
+15609 057ad88aae9a635973c882fa5b81c81fe954494f legacy-trunk
+15610 594c27c870adedfedfe63c620c263473d9801a24 legacy-trunk
+15611 a92adb780f43d92e453c4c31d544cb3db28a0c83 legacy-trunk
+15612 e787f6641afb8c90b980f7a557af693b6e4cb891 legacy-trunk
+15613 28909e80f36cf58d6c746af5b44d7cd95a87577f legacy-trunk
+15614 21553bd2e875f2cd6c3c71beada9a6330cbe7866 legacy-trunk
+15615 63d39358db09342e07bf1347af920e63877e1866 legacy-trunk
+15616 0fe0216f6c4e4a13eb04e46284711496b26824f1 legacy-trunk
+15617 0c884c8d1e75cda047f75a6b7a098cfa5ad877b2 legacy-trunk
+15618 6ae046d4cd04203ea2d5b008b0a1b1f800e77078 legacy-trunk
+15619 14b1b5db6cb2debbe0dbae13b1f2cb60650ac4d4 legacy-trunk
+15620 379797f3eeb206044550774eb4deef0af2a9809b legacy-trunk
+15621 4323d4855047b8c724b54d927d2028f34f6f84f8 legacy-trunk
+15622 3971e6b14a097497d51b0bdd39def60d6e0a942a legacy-trunk
+15623 af0def063658036ceaa81ccf50688e9f2576aa03 legacy-trunk
+15624 c0fd88f2a65a9164ac829e6b9c4f1a64a4e08e82 legacy-trunk
+15625 31d0988da8a97314f626f0ee19fc0d263bc539fc legacy-trunk
+15626 e545a0c44fe15cb2f2e30f51dcb03acef1794dcf legacy-trunk
+15627 548cc10df9ebac808e5b64058b01ca7ad123e147 legacy-trunk
+15628 e04649c3ced03db2139068f8c1b2012968b15419 legacy-trunk
+15629 f4b487e352140ce41bcc81d2862417caa81c4ad4 legacy-trunk
+15630 88872791998a0da196080317c3ddecb0b1eb618d legacy-trunk
+15631 527f7e3bb76d7ea84eefb3c6cec819da2cd71879 legacy-trunk
+15632 dda1ca53ea8a2618e96cf2c1e747db0b316a512c legacy-trunk
+15633 e024ed2db625b8e3e8d6f5699b77b2d5c312fbfd legacy-trunk
+15634 efc6d7789d9e6f7339cc22ad47e0355d36a9dd04 legacy-trunk
+15635 d98a7557326a4d80ec905b646afcdde5ac935435 legacy-trunk
+15636 a8ce19c32db9a7cf7aac2379fc453ce7c057fb80 legacy-trunk
+15637 243593f11fcf68e675fba3a93fa135f892662108 legacy-trunk
+15638 78231bbe605dc2ea7cfa83ab5555ebf56b9ba081 legacy-trunk
+15639 6d7914885d63f1c39af796102f182c645088d096 legacy-trunk
+15640 301ff14b2a0ea61fbc0ecb921e8f543ef31e5453 legacy-trunk
+15641 26e20a28d051c6ced4b74ca07bae861ccfa28387 legacy-trunk
+15642 6889de29c5584b28ea9f3060f10b0f9a60a2bed2 legacy-trunk
+15643 11e5bf8eb47369af0d5ebc33084999c0d61b636e legacy-trunk
+15644 7babf91b6d75c66502a57e30d7e8c2ec926c07ab legacy-trunk
+15645 092baf69d6af87d60cbb35e7add0003bed5bfa6e legacy-trunk
+15646 5a0d156c420ac713b0125e11c4a896fc26cd943a legacy-trunk
+15647 1ae035a31cb4835d01e932564a638432490ce4ec legacy-trunk
+15648 11d10e9b508d80b0a484cf09dac53cac801e9a1f legacy-trunk
+15649 b5752de0cfa467354d11f5243460a7037fc5f72e legacy-trunk
+15650 f54c3677bae7d861acb87d03ccb13e54b338ceaa legacy-trunk
+15651 17f35f66ecd8bc954f71097dd156525c24d30d32 legacy-trunk
+15652 0c8b9f96b26ac730ba7cc103bf374050830f5efb legacy-trunk
+15653 0c2cdd7cf7dc6c6272eb09e43e869fc3bcdf2773 legacy-trunk
+15654 fd5881e17427b3f6bc254c162316c5ede041f167 legacy-trunk
+15655 61f6acc4aa748dd40e8c3818c72c711d14010822 legacy-trunk
+15656 f0a8f12734564bc2b6b19499d8804c9c3c0a652d legacy-trunk
+15657 adef97f3fea0f5407de2521ae7a38672f58c78e8 legacy-trunk
+15658 e47b1a0d64847977111d8ce0ccda75d49c13954b legacy-trunk
+15659 f31dcd1ad8c411879b679b21d5b1ed14b2b3aa6e legacy-trunk
+15660 9df91f91e5cc9a442400bb749710ed53b944439e legacy-trunk
+15661 f82b157f45e29c106b656e1dfc20aa911649db75 legacy-trunk
+15662 eff2410685cc460f75189b4d683f04209ea233d3 legacy-trunk
+15663 98eb3059ae760bcdf19de6d8335cacbb094406ab legacy-trunk
+15664 9ee1e594571d7155d8e5e3696c5e71854a101729 legacy-trunk
+15665 752aa8dff520b94edc5169f64a8ffd770b3b562f legacy-trunk
+15666 25431972294b4f37cd67c680459d26c067b024ca legacy-trunk
+15667 f69102c1f413f1c66a4e37d9000207fcff5ababd legacy-trunk
+15668 dde7e91f2f2e5c316d8d40bbb9791a3b7ccf4897 legacy-trunk
+15669 1e784b8790390e33660cbe9b2af480dc2e7ba997 legacy-trunk
+15670 be36f103a9539c3dddddbf559f790ae3760dc31c legacy-trunk
+15671 51398f71d3012278436442fd4eee185912500539 legacy-trunk
+15672 3cee0d75191e231c036fbde929fb0f22e85fb8b4 legacy-trunk
+15673 34452b883a71d5f70b8d816186560de1aac3c42a legacy-trunk
+15674 e5aac9dfacf8715bd92d2b4fdd72bf22ad3a5921 legacy-trunk
+15675 c8e13535fdc319ab20717a75bd34b7f538f02dc5 legacy-trunk
+15676 57e2945435c90049e64f608112e7af119d3273f1 legacy-trunk
+15677 00f5d0df70ad80e1d8e7bbddd482e08692237f74 legacy-trunk
+15678 2a2caaee67973a8dbe119f2bf91fcdcda96c34ad legacy-trunk
+15679 8a23ab057af6176ce2be37d4852b1d478eeff635 legacy-trunk
+15680 31c725d70e65212d3b187535381dc4979c79ab9e legacy-trunk
+15681 deaf25df15fe27e64cb651dcf0d0d5231a0c525d legacy-trunk
+15682 12d0c465b103cfe94089dfc0cccf1a5be9d82f6a legacy-trunk
+15683 a8afefc4fced9947b6e796045002dfb70c54d5ea legacy-trunk
+15684 1caadfb8ca710bd91d8146ece29a4638a68e53cd legacy-trunk
+15685 2d0b99778edf1ba6cabe84ce05594d7e6db774ee legacy-trunk
+15686 128e7b9945059c600b5a6cae1e4b051fe4f954ba legacy-trunk
+15687 df6869bebe03c57c3149505f06c2d9c95f273af1 legacy-trunk
+15688 15df3fa0fd4d7da8e228fc0a1037d0064484cd11 legacy-trunk
+15689 59e494c0802fc9256a65ae6d465f69224800cbdc legacy-trunk
+15690 2eef636ba1b62f6e100c62c183224abb052d8aae legacy-trunk
+15691 6618325574cb953ef27e4ff1534d365454e28dde legacy-trunk
+15692 0aa3f80dbb23ae56d402777fea483bcbe8fab365 legacy-trunk
+15693 1fa7c119b7a56f20a988d5bacb8ebb85a3ddd241 legacy-trunk
+15694 b660ecbeaeb8e32ad8438ef60c28c8f689785f09 legacy-trunk
+15695 753f9163df0bb3f3793195b2a9ca5bfd866a53ba legacy-trunk
+15696 a98009a4391e787916f06a8ff00f9be0bb273547 legacy-trunk
+15697 3427b0f85a7ce71bab9cd2a1663c5a9704145a72 legacy-trunk
+15698 abbceb6a25324b5b44c51bfd61a755ee71b6fda1 legacy-trunk
+15699 7ab5b1eeebde9283934fa9ba65f4c823f2b9b97d legacy-trunk
+15700 88004f25dc25abbdb3507ce0f40df1d6566836b2 legacy-trunk
+15701 3f7a35798acea109b4e5e843707dbfe125c4c4a7 legacy-trunk
+15702 8c9554edbebbb48f46de691593a2420b4c6701d9 legacy-trunk
+15703 a8530d36021c6c81e5996672d71ce541d6ecbc73 legacy-trunk
+15704 429dd02272d6807926b1a23d2f71ff6757bdaf8e legacy-trunk
+15705 b1ec49b2c5c2a903b3b93df172c3393a82b4237d legacy-trunk
+15706 5d2fb67408a7cc6324b89d21169ad055e9f07287 legacy-trunk
+15707 755c9ac9e6aebb5f146813176b5b8fb87198883b legacy-trunk
+15708 6b2ecd172203b4a11772ce5ac9862269ea923bb9 legacy-trunk
+15709 acb0261b6942f3be7b0ba374edb1f038bb923059 legacy-trunk
+15710 2a64f225a10531c24b758299d9cbf2ce8d000b55 legacy-trunk
+15711 894efea71acfee25d70bd4be61ef28bec90dfcd1 legacy-trunk
+15712 7f022e260a4d93377090af34a2421fb07a78d5cc legacy-trunk
+15713 51949de76365b1b540c9748aab3f34bb4b9f57b3 legacy-trunk
+15714 a3e12881cc3c23e373d0a8e73ccef6c1c498e518 legacy-trunk
+15715 430985d57da316f5d34c91b6202d139b1e9d8b6d legacy-trunk
+15716 caae7501dba55685154b9f82e19bd422833224a4 legacy-trunk
+15717 dc0a212fb35390fdbdb909b275683fb811790643 legacy-trunk
+15718 97dd6dc3350367f4e61d43ed951a7e16446f7f8e legacy-trunk
+15719 3c6641c810dba2b57564c9cd0d8ca8e69f5bdce4 legacy-trunk
+15720 2513cd74147c738941bb576d9013418b240802a1 legacy-trunk
+15721 45aaa75f08a37802fcd028764aa284a4ef166856 legacy-trunk
+15722 eb911eca9ee9e819c00029535c31904264313627 legacy-trunk
+15723 bac045b85263f359f4de614104b555e354af17d8 legacy-trunk
+15724 ace13701f334d87bd9924690bebbf3c55f830013 legacy-trunk
+15725 93661d0eb5cc51dca565567aa4a1f94b375218a5 legacy-trunk
+15726 04c89d77dfdbf7d55fdd56f020430036959b4e5f legacy-trunk
+15727 447efb64c72ddcb3ad5108f5d7950735252369a6 legacy-trunk
+15728 d115a91ca5fa7f3cfc9e44e041bd87467a4e7bc5 legacy-trunk
+15729 f31ffb37d72cf733648bf0c30314dbac16535eca legacy-trunk
+15730 e6b407ba47153ecb6f49e7c7e7173a73145a3fa3 legacy-trunk
+15731 63436719d12e02bd93d0da18f2ca9d668e0193c8 legacy-trunk
+15732 bc0d49680aa3df6aac8b4d0401901e2dcc16992e legacy-trunk
+15733 fc77e34ef2743f82957bdb022722c1efbf3606de legacy-trunk
+15734 0b42264ac021544baf6e489770d5ea01606cc6ab legacy-trunk
+15735 e7992d0d680828cc26d6a0007ef1ae458c7eddab legacy-trunk
+15736 df627e61916e20a104e1c990f5f7922249b31e4d legacy-trunk
+15737 f793c47c510e1367334b67e04ce0ab50c9139ca4 legacy-trunk
+15738 dbb103e9a56f513d80df9afac3bfa9022016066d legacy-trunk
+15739 77c651131984b2eeb3772721f2c0e0758dc73663 legacy-trunk
+15740 40038219036497c44659ac9eb18e3527938e38df legacy-trunk
+15741 dfa8d9f1c12318e98c2cd4220308fefbe1697273 legacy-trunk
+15742 9569c56257657e061efff8d615e5e38ead04fb1b legacy-trunk
+15743 89602f332447b4ef32c1b88a7d689304f3cf66a5 legacy-trunk
+15744 b544299e68c5fa74fa457cdaba153d09e9d545e3 legacy-trunk
+15745 536c631299329b2bc22855c0e8b902cc62f6fe8b legacy-trunk
+15746 55e2fc4d340e482997e40f0c3eae07b032d656f4 legacy-trunk
+15747 5279a6e00d367b00f54af4e079ef9cde554e2ffe legacy-trunk
+15748 658c55c08139ccf6b39389212dda77f02530adbc legacy-trunk
+15749 0eb531ce08d18bca7e8ffc0e944fbef42b357d1d legacy-trunk
+15750 272db4605be47afa46ea2c89583797739481ede6 legacy-trunk
+15751 e615596c5c47c001842072cefe622e996db9c4d7 legacy-trunk
+15752 1a40f00a48bf649a0bfc63b5dcf2c9e3965bcf31 legacy-trunk
+15753 3f990ef666679d7eeba36ec6e78429b42fa64c8a legacy-trunk
+15754 8f79c5b69e0ada3c7c05364aa81b232a28a883f2 legacy-trunk
+15755 01ce89fc745fe1aede7d692af1104626bb53918d legacy-trunk
+15756 c910b9d9a0c0e85e0c21fd3698ad49c4fdaf4f95 legacy-trunk
+15757 c75718fbd8626e8beeec64c87ab2474458108429 legacy-trunk
+15758 27f3a18fd29657b65e2036251ec77c6e1f2b5aa0 legacy-trunk
+15759 86d498946868cf5a67206b2f2e92fc3901f46fed legacy-trunk
+15760 7160b52ca74a06b1b003e52a6b504624590be85a legacy-trunk
+15761 bc147e189b7f9b47903ebabbeb6cdab965fc43a4 legacy-trunk
+15762 7cd152e1539c5cbc69a8809076f526a96bd0c20c legacy-trunk
+15763 5f3626fe58ca8ed2a109cce06442096ec435bf28 legacy-trunk
+15764 57707dbcc245c8116ba25c0dc87d47a1599cd8d4 legacy-trunk
+15765 37ba7056d4abfb6df0f65277027cb88433d34700 legacy-trunk
+15766 82181e820de3c888ccbd87cecab14882a4c2660f legacy-trunk
+15767 87003842faeca6efc29bab23602927a9c8181596 legacy-trunk
+15768 5d8ef22adca5146833710c1c4f347922ee4d6bb9 legacy-trunk
+15769 6e1861e0ed6876bbf7027eeb9dd90f9fc2c4d59e legacy-trunk
+15770 7b38678b365265e2bb8e8568c1e0be30a4b24a76 legacy-trunk
+15771 fbacf6d55dc693833606218d1a29f804853abf63 legacy-trunk
+15772 37401ec2e910b0cbbed7c86d4478048f27dac0ae legacy-trunk
+15773 9076efac8420b76080615da860b48999ebcb89ee legacy-trunk
+15774 dadb0cc5c2d285eded982bc98d519cbd24521e0d legacy-trunk
+15775 4f13c2b8320bc3aa29095a69f001f07e19b5b5ef legacy-trunk
+15776 affe10c3b92ece230cbbc10c0dbe603d74a992e2 legacy-trunk
+15777 7a29258c55ddadffe3f63f8a149a97a8d151dab6 legacy-trunk
+15778 383f404b76d7fb162b2709f8b4feeaecc29b3d10 legacy-trunk
+15779 2e2ee117d40fd6b14411cd50d6a2004d7c8cd343 legacy-trunk
+15780 4a3e9871b41bba0b55d8e29a66bc2289bd1cc27f legacy-trunk
+15781 1dac89bbbcd21733d6f132f2fc5f1ab35b08706c legacy-trunk
+15782 30a4e1395211035bbfff0ec1c4ee7d6653a99e7f legacy-trunk
+15783 87ece127cba2d69eba91fb81ff256bdf7fa21a10 legacy-trunk
+15784 4102f7ede8e999ce101aea7940853eded0573592 legacy-trunk
+15785 23e8aa485a70d56e2e158c1cd7a11ec201602175 legacy-trunk
+15786 58661a557dc6934dd4ebd451436bf4fd944e8a35 legacy-trunk
+15787 ca96d8ce12f3dde27f29217cd95c76a013274881 legacy-trunk
+15788 bf2ee8567201548f9493d86e4709caa33b9d5d26 legacy-trunk
+15789 97481d7ac548ad4ca8cfaaaccc0a92f4241ecc01 legacy-trunk
+15790 70b16dc6137f24900da4551fa5f7a26cb52badcb legacy-trunk
+15791 5df0348267352add33e3a7ee98eb27ac3ce89fe2 legacy-trunk
+15792 00a981194ca69ff0f4fa99b778228d424ba5ff8a legacy-trunk
+15793 1240bc997c8fb869438095e26618cd724ae0d401 legacy-trunk
+15794 f7ad7e7915e99f573b4909ffaa4bdc92452cb6f6 legacy-trunk
+15795 f1e40abbedb3e31b569009fcb63440c147b8ddb3 legacy-trunk
+15796 1f61ef6453d54f10487c7214c45892a94e361edc legacy-trunk
+15797 c09a570eb6eb5ff740ac0d125bb23011971f75d5 legacy-trunk
+15798 360320d2fe944d64880da81ac824d3c3efdf2b8d legacy-trunk
+15799 eaa4c6faf3c4b23be9aa2678ba3242a643b8aaa7 legacy-trunk
+15800 1c8c101f2be1e30dda5a7512e594dd9aa6c38dda legacy-trunk
+15801 12ac2c267b932e5c368d2ab24c10a6c4820cc999 legacy-trunk
+15802 84c2a4d2df9f4ff07eca38ee91413bdeb6f5a9c4 legacy-trunk
+15803 1f2441978ab1400636e0ff40cae739814eda0681 legacy-trunk
+15804 7df7452d13cd4339243521c383bb2ebea3ab61eb legacy-trunk
+15805 0d309f7f023fc4aec8bab3914d1a38db4c71a444 legacy-trunk
+15806 72058dc7d545b77e1d17f6765b4b106156f787b3 legacy-trunk
+15807 01d1e10184950f2a4381e756e0ffb12a53ed6d8e legacy-trunk
+15808 f73458c5c35d01dd91c77945bcb948c3776f65e3 legacy-trunk
+15809 700984109cb99febe8baac28dd6e805715625826 legacy-trunk
+15810 0be4b7b650e33dda08289d7f6eabd2c544747ada legacy-trunk
+15811 a195962e389cb2a3ca126d5df0c7f3493cd75e17 legacy-trunk
+15812 f133841055289c7bc6fcbf55e4f8d047623e130c legacy-trunk
+15813 4dbe13027cb319ce1c895383cd790199e1ae61ea legacy-trunk
+15814 b007442378770dfef78c7d0c6c748fcecd87e9b0 legacy-trunk
+15815 277ba826cfc97ffed2fa25decc00797c7f1e7212 legacy-trunk
+15816 cb8109e728771cf75e172d16eb22b479fc33a58e legacy-trunk
+15817 8a07402e23deafc4eeca085549d6c5aea9695528 legacy-trunk
+15818 2b21cc1bb564912ab964b752d19aba0aa763b700 legacy-trunk
+15819 53f4022c0cd587c97ad47a15803a731b66532e17 legacy-trunk
+15820 f402057561b3a1c6c4570fc2769a42b6926ded94 legacy-trunk
+15821 4b4821bf53dcf31b0e7bd7c34c5bb8436bee1693 legacy-trunk
+15822 9b2e70b55c7f15f34e700b4f367c181718371233 legacy-trunk
+15823 cbdb055e79d92502472d6c02182e97c619cd3894 legacy-trunk
+15824 eb243443b8840e82fab7d32380c47371af2b0ccc legacy-trunk
+15825 bd8db71422f6089f6bf0610c2d22139d28181431 legacy-trunk
+15826 7b24c818e2cf2d3197c9d3f98ae80bd7de36464c legacy-trunk
+15827 5babc0add64f279bff2f036ac742a51c381b4db4 legacy-trunk
+15828 a679bdb43fadc91ed4e2d75919812c15dab82d10 legacy-trunk
+15829 705132667f7ba2cd7bc72387223bc6841468c58b legacy-trunk
+15830 b76df68099a5f79631bf6d8defa1c5b0f4f16a9d legacy-trunk
+15831 7392e71f6cce0272ba713931bd901365f499b085 legacy-trunk
+15832 c878dc63d7aefabcafa66e5a840582a49c7188f3 legacy-trunk
+15833 6ab8e1bb167cd3372f8d5eecbe9e6ac50a7d2b22 legacy-trunk
+15834 ef3d498aa33c2ee47226f0d9733710c6ac527610 legacy-trunk
+15835 4ff3ce3f3cc621e4c592b36b5fb96f73da51432d legacy-trunk
+15836 2cf9874b62114ffe8447635c2569761c5f44a9bf legacy-trunk
+15837 5a7083690884b7cc1514008474b2b76d48014fe0 legacy-trunk
+15838 03b1cc47a86d0142273363e1409284ffa4b4f74e legacy-trunk
+15839 1d0407960953a6d80324ae36b99e2310c99c9188 legacy-trunk
+15840 185003d09e766c83b2bf612bbd15977c30fa8efa legacy-trunk
+15841 87b466b702d6083dbfb479824bc99745f8d8856b legacy-trunk
+15842 0acec211a2090fc88431a300ca578e79a1807e9b legacy-trunk
+15843 6b2c6963c40b68f11e8b32dc05784cd53d7b789c legacy-trunk
+15844 e0c903112e4ed4f4ca087031b15ace201109a21a legacy-trunk
+15845 08174bf23702fc08748ce11b9f149aed9934b9ff legacy-trunk
+15846 92468d43a23f034864e2b337587d862033b62a2d legacy-trunk
+15847 de4e30962faba0065989fe54744169e640eb68a7 legacy-trunk
+15848 0f216a54d34b4903e3ee4bca4304988afa6004fd legacy-trunk
+15849 a883488b9dcbf28ace2750a8f120a6a3a1a7a0d3 legacy-trunk
+15850 bf1ebe8698781cf658023affcb5ce23292dd8678 legacy-trunk
+15851 d06012967eaa22ec82f93dc312ba556fd6cdfd3f legacy-trunk
+15852 b9ab3b2acc8ce40f706fed1a8c16805823f528d5 legacy-trunk
+15853 552fb43ae8237764dbc292eaec34862758d16afb legacy-trunk
+15854 cbe02b8aee07890ff8749b85120ce8ec7d5a95d7 legacy-trunk
+15855 07a4d1637e06df93b00864951e77b8550bf8edb8 legacy-trunk
+15856 22309e957fa73ee2d759142a5d0d9454738c57f2 legacy-trunk
+15857 8c8de5b736dc21f0e4d42602f47e2e4a1f19cd5a legacy-trunk
+15858 d849a0d22927ad36253cc106f206b91e6feb215a legacy-trunk
+15859 7be5482426d1efc621beb31265acd62a8718ad63 legacy-trunk
+15860 99cee0c87f6a04f091c4c038c1f174551972044b legacy-trunk
+15861 365844e7558669399ed081fb6ff3ac310d2fa7a8 legacy-trunk
+15862 3cea73a2bbd8c12667042e286248096289312d37 legacy-trunk
+15863 459d197adb08fc67d920283396e486eb6ca3f92f legacy-trunk
+15864 e839e8e8d3e9c0a106d0ff3f0c806e798b1945e4 legacy-trunk
+15865 797acf3ffd2665731c18c1893650c1d71ff2975a legacy-trunk
+15866 fd8467d1375d204a598dfd496c4a9236dfebaaa4 legacy-trunk
+15867 a6725acdf33b1b98f40a9326065e30afe777d78e legacy-trunk
+15868 f61b4a98b97292cd6d973750ce6e719fcabccbcf legacy-trunk
+15869 68e57c5d1bec072877be32b0ec51259d5d397395 legacy-trunk
+15870 c3a01b642c97189ada432f0e3e6fc0f4b5a77cce legacy-trunk
+15871 346f2a1c02a0a34a370dacde50cf470f3ae5c746 legacy-trunk
+15872 52d5fb471e1720f05f1ec170f559515c211afd7d legacy-trunk
+15873 f8bc7f62dc23afdce609d77d4c34b7ea4ed6cfa2 legacy-trunk
+15874 5bd12733a64ac48b23ba0ffd440b07f6906f60a2 legacy-trunk
+15875 90eb58224e4317237f2ecc09bf24e14c5e800bce legacy-trunk
+15876 8193e045787bff0816e2446da3da256c5a1a2170 legacy-trunk
+15877 894613b4eb075a850fe253507db63e02aea27735 legacy-trunk
+15878 26ec1b30efa93fdf5d4b33e8b063f45b1c968fef legacy-trunk
+15879 7ff40da08c2a64650ee32728ce2e00ce4acd7fba legacy-trunk
+15880 fd12cd996154444fbc118040a38afdbe3bae59e5 legacy-trunk
+15881 896b359d1c7d6d2421e39fe44a53b77bf1943b43 legacy-trunk
+15882 faefff43e58a99b2e5339a5634338c67b3a0d893 legacy-trunk
+15883 53d00e7c58484367b0bc31cf014702ca973aa2d7 legacy-trunk
+15884 462175827a74eebf908076317c6c0fab93e9d6e6 legacy-trunk
+15885 5021db67401931f6ce49c380fe055ce4ff90f801 legacy-trunk
+15886 42558f1bbfc4dc71935a5a82cfb8ec9f7b276ad1 legacy-trunk
+15887 78ad4f64adc5f41825eedb1ac64afcf937ccaabe legacy-trunk
+15888 07040d561f0912438f907573c2d4a858b2199807 legacy-trunk
+15889 cb928d926f273db914b78d494aaedc6c6b15c4fd legacy-trunk
+15890 e042c4c386056a8435a82b5791a2d616e17e4a4b legacy-trunk
+15891 7a78715357271e7f7f82595cfd158ba11e091834 legacy-trunk
+15892 05cc45d57a7fa160b3bbea078016a46e7b5e8dc2 legacy-trunk
+15893 eaca9e25a0489607dd51a1b25a17d8daff2b7c82 legacy-trunk
+15894 15651490af342f0625448b23b37cfad7857a4310 legacy-trunk
+15895 f8265254d8a9fcc5718792141bbc86abac8a7138 legacy-trunk
+15896 b31fff59622a3df37cbc6d8d12a32e8c799813a2 legacy-trunk
+15897 b6ed8fa2675c77d41b2ce161224c6f867dabe7ea legacy-trunk
+15898 72e3cdb32a6c61447a61df563e3c5f37f6fa33cb legacy-trunk
+15899 404156092f781b897f4af659cc9b10e44ef5d4c3 legacy-trunk
+15900 c2207d6c03a818ef53f55bd91c61ca00412ccd46 legacy-trunk
+15901 7c6b12cecef26e338e9be16926af5a2f265392ad legacy-trunk
+15902 cca84745da3e00cbf83a4f6ce4debb5c3b48b1a4 legacy-trunk
+15903 f86ea5a69c5eadb8040fc18f67f529840882c378 legacy-trunk
+15904 f5f0f00f922a36aaac8fa0692bff78f2c7eb266a legacy-trunk
+15905 ffa4b4b437031d34f0100aefb63e3dfbda1adc6e legacy-trunk
+15906 0a1463ba293487d6ea56c08b1b9b69b69e73cf17 legacy-trunk
+15907 795b327a95febdabbfc9bddac0201a913adabaf8 legacy-trunk
+15908 2f3e41865d3d3bfbbc3f9ab2f901e26610ad93fc legacy-trunk
+15909 607e52841df278fce2a4107941ef21b564ed44f5 legacy-trunk
+15910 67e7746619da7ed7cb75cab602c94aa73d25a832 legacy-trunk
+15911 f1f4d822e761e7acea9fcd245256509b791ccb20 legacy-trunk
+15912 3f8073c63033c163a7940e63b7975f722d623db1 legacy-trunk
+15913 2b72aaba7895111564ea73ab1a0d8de61af236de legacy-trunk
+15914 32816ce60a49b09ade97591729e2803316ffc372 legacy-trunk
+15915 357b71c6933b8513d25bf91ef94a753046fc38f7 legacy-trunk
+15916 9919d65edc76caffbd6fc28000b68bf27fe10eca legacy-trunk
+15917 c339ac7b6d4f1e112b8bffe61f7c52fb4f981e65 legacy-trunk
+15918 fa3dc21d0e0880e5c42d0d962841848621962cfc legacy-trunk
+15919 1a42a9d10357e146afadde7b4210a670c807e110 legacy-trunk
+15920 53355ed61288928187c85cb7e61c74f2c2cc0c55 legacy-trunk
+15921 139eaf2f96ab6721e32a18bc24debd761f504a05 legacy-trunk
+15922 cce2c7a38bd56de12663497811c9f5641da6ecd4 legacy-trunk
+15923 c360806c06c763261ac5ddd82416b4e88b435898 legacy-trunk
+15924 a09e8635534de12b42e1792682a129f4a5d3659d legacy-trunk
+15925 6faa411c61fb4aedf3102a223505bf9febc7d0c8 legacy-trunk
+15926 c9b1f1986c402948d7227d8b3c82e4ac31a0472e legacy-trunk
+15927 023a2018b96deba84f977772021ed1503cb29701 legacy-trunk
+15928 f7294246d04f8d4c56d66a1031ca9648e3405cb0 legacy-trunk
+15929 5f6f0886905cd3318500eeeb161504211b020841 legacy-trunk
+15930 b78b996e8ebc2b06321cfabf1973c6a5e9f49100 legacy-trunk
+15931 208346e924cb0290ad4071795b26417056aea510 legacy-trunk
+15932 c17fd2ca6659c0148a8b68b5eeb4dae542320232 legacy-trunk
+15933 05e45c5f2de5b7cefd680d8f16b7d0474627a6fb legacy-trunk
+15934 0021f3c0b23803238ecc54227a9c99e50be9c916 legacy-trunk
+15935 9d9e5a7c12dabd39198d774b4c830f33d1dd5d72 legacy-trunk
+15937 d37c027e3fae97bd8c50b696e8907f5fa1b5064c legacy-trunk
+15938 28a8bb794f19d58c8222abb95720f5304a493fbe legacy-trunk
+15939 7a96ec010333dc8261219787d289be442ac7aa42 legacy-trunk
+15940 d37374552a15f9b6dc2f8c4d075c7e1b4adf642a legacy-trunk
+15941 915d985918e21d3a9cdbd7d73ccfd97f61403426 legacy-trunk
+15942 ef13242de433e74d0c277de2984ea596ae376644 legacy-trunk
+15943 6f4669814884a31068eb0853d12f95449ab833e4 legacy-trunk
+15944 1e302d996d58d8cb4a9901b3999d32b0c9c5f2e5 legacy-trunk
+15945 54bffdddc0ef08315d650e9af2ec98430454eade legacy-trunk
+15946 efecbbf727653d77a62ac8076c92a67cadaab46d legacy-trunk
+15947 e9c34cca0c9686243552e6d7c0af6f4479838883 legacy-trunk
+15948 c45bc258f833c1290a6e0965ebb3acfe2ef84482 legacy-trunk
+15949 59294dd4bfddf1e142837168bdb67606fa8e2ef7 legacy-trunk
+15950 92ba928c09b8b8cc1a762113544b7dd2111e9216 legacy-trunk
+15951 7e245bc598b7bc37183a55a69e3351db2c050199 legacy-trunk
+15952 c7be847826b172410f2d0e6a91fbc4964dac20b6 legacy-trunk
+15953 7e71975ea5f090fffc143e9177cf494df54b9426 legacy-trunk
+15954 3128c3cd18e86cea45f2205ff1742cc23b31bfdc legacy-trunk
+15955 541db5f6259e96ac34c73cd9b0b79795d4293780 legacy-trunk
+15956 753af62ab8a19bf9aeb3368e244abb25175a112e legacy-trunk
+15957 96167af90fa03114f198e32dcb76eb0141a2eff4 legacy-trunk
+15958 18920eaa12264a7afa8d74abb9340b5bddff1f01 legacy-trunk
+15959 ede18fd5ed15ae8d6fefaf52a3f4a630172171f1 legacy-trunk
+15960 4deeed58bf764cd567b485dccdac9e6c0dee286d legacy-trunk
+15961 c5279c0f716f05b27ec0fc02d6fab8f382731975 legacy-trunk
+15962 ee1a34e5edb1275ccb3f5758758afff67371ef60 legacy-trunk
+15963 a093fad92ccf8950488dcd6d8807189cfe669810 legacy-trunk
+15964 79c4a0542572442f4f4dfd83f284a88845cdb25e legacy-trunk
+15965 a625ce2fbfbd8552aaa34e79ca95befae8410b9e legacy-trunk
+15966 5a4df9d9c7bf56e3b47f6dba2ef50bc2952ac1a4 legacy-trunk
+15967 b9a56e5e3d227fd9d01d796cd5cde76f0ceb0e71 legacy-trunk
+15968 d66435337e1c2b553b4ccb83aaca09794c71dbca legacy-trunk
+15969 ea4bbabc7497309bfe50c2bada915e2923b7875f legacy-trunk
+15970 9d206873c5bd4b1fa8e89dff75da4b1b9567353f legacy-trunk
+15971 b11e0a898de0955bd4cefade86ac853ff250629f legacy-trunk
+15972 ff243b0f16eeb8855927c126095b585f9b5c8a60 legacy-trunk
+15973 827b576e265b9608d925f333c0c4a8f108180973 legacy-trunk
+15974 f29fba5c98bdf7b08332630e055bd3835912d6da legacy-trunk
+15975 c2909ec7d4cdca025385ea2bc6eec89b082ce738 legacy-trunk
+15976 555b2e22ee8982da2da6f0db9faba47ed1634a9b legacy-trunk
+15977 097684b93ca9c1049a826f2767f5b76d57fe1a79 legacy-trunk
+15978 63ebb690687749d8204eaa1be198b292f4433363 legacy-trunk
+15979 e2aee6190b1985003e02b8b6fb32abaa952a778d legacy-trunk
+15980 79dc1ef5c22d19691892476cc7196065e2aa8995 legacy-trunk
+15981 a92f43d20ecb15f8378b52af9f1c4a6d52e6ea44 legacy-trunk
+15982 042b96cdf7d794500820c70df4077f851e3afbf2 legacy-trunk
+15983 d7b48c849189534b53f4a343d470998a64b6b109 legacy-trunk
+15984 5dd381aeb23b27a88a244cb4cfd4e44795522743 legacy-trunk
+15985 05d5d3f9a18cbfafdb80754772842c21e789dfd0 legacy-trunk
+15986 1cf544ba239e561658de4b53640e3a31290bf036 legacy-trunk
+15987 2ebfff13936c24c0d1bff1dc5e16e0b81314fbb1 legacy-trunk
+15988 12437deb0680abafc11747dae16a900893cc1a70 legacy-trunk
+15989 c2df5d28034da577b89b5bed0c82d20a2892bc6e legacy-trunk
+15990 f195c9981fa1a9a650ebd3b5061bc51acef2eb02 legacy-trunk
+15991 344ab348f1e9c9d8b007332f8608c0de7a358f84 legacy-trunk
+15992 7066be2edc3b69d5f6931e51f4197d18cc1f3e48 legacy-trunk
+15993 209eb44cdbf7e114662258a254c88c5813d362b4 legacy-trunk
+15994 68dd403071726e1f99ac49a569e6915777c26419 legacy-trunk
+15995 86c9f691f3790a390bb72390d0243c98784a5fe4 legacy-trunk
+15996 79f8f6b963c269a249f4680904b5ea2c1b045fe6 legacy-trunk
+15997 78bfc740b61cd1d9ce1db6ef4a3c006854fe6550 legacy-trunk
+15998 31f9fa42df600aacf5ee08375bab4c6d9fe110e2 legacy-trunk
+15999 af72805e9942ad2fdf5afb925c9d253b53ac2911 legacy-trunk
+16000 049395b02602a34d10b45a6288901d1f9d4151d3 legacy-trunk
+16001 650154292ee1173a6304e2b66f11a48c87117dda legacy-trunk
+16002 53be285cfd2cac6bb9b686da44372b9a00403b94 legacy-trunk
+16003 6104b61215e67ca63d6b8536220e47d5ec6f5a7b legacy-trunk
+16004 5466270dbc9268a0ca1a97ddfb9257e39d90c1d7 legacy-trunk
+16005 1e46c23b1dadb74e6ec337e2689b0f22c902c187 legacy-trunk
+16006 a792b74cc9e8c35267b99abd8e99973576bd4a58 legacy-trunk
+16007 09d9172fb1d34cd7200d065a7a6961a705b576b3 legacy-trunk
+16008 57d6a31ee40e0149d19879936968753da61f5fc6 legacy-trunk
+16009 589202c6488791d0e7c7327c8ac49ab0923d0002 legacy-trunk
+16010 8ede4b0803fb79ffc37cb2d076db1775866ab1c2 legacy-trunk
+16011 ac4d3cfbc1c9d184194cb9c2e59c3afd12773ddb legacy-trunk
+16012 88640ecf55061f325cef8b1222ba4f8a9710dbd6 legacy-trunk
+16013 86177fb0edd835ccc4b88d76d12cc8476a109ebf legacy-trunk
+16014 310d7cbba329239c9bc67a2b7379751d0c092958 legacy-trunk
+16015 a6a64e9ab238d0fe41c2684f6ea05ab9f95ede53 legacy-trunk
+16016 ff0974e8821beec32d761e01c9931ff53c6f6e10 legacy-trunk
+16017 916fb024ce942d097b08ce5779474ca6d6ba6b64 legacy-trunk
+16018 87ee82e5c56d31b771f76ed5ce30acb6334f9ff4 legacy-trunk
+16019 34a6e5feca18e3e4b32af52d162944dbe271dc54 legacy-trunk
+16020 babe7b9cc617456f42d355f1c299e05385bae098 legacy-trunk
+16021 3da4934219e5f477e75c4887b8d6de8b445b262f legacy-trunk
+16022 5fc18bca7f55ac33a5290c52409807114bb33d97 legacy-trunk
+16023 1c5a5ade04e2762c9b11e29db9129a2f265aa2df legacy-trunk
+16024 c6fd6ffbcb15c781ca4d4eb8525b6ed6feae2683 legacy-trunk
+16025 84879ab71b9f3fd8daf96bfb77bdf11a12678781 legacy-trunk
+16026 b9adb79cdeb63409f9f51d4b418b1f238360f85e legacy-trunk
+16027 e8bb0d536633ae79523098a257f18c4d52374d34 legacy-trunk
+16028 4c4e95147258111258274f544d5dee756fdd6da2 legacy-trunk
+16029 4ce255495da34030440a58b7c70f4a55abb9bac7 legacy-trunk
+16030 83377fc298d83c8af4ed7efd3d8fcde6e592921c legacy-trunk
+16031 e72cb42176bc7193d9522324d7d35c45acf4c570 legacy-trunk
+16032 6155f532f1fcc4887bfe89a50919badc450d5fea legacy-trunk
+16033 89f0a664e2830b1cebed3e8db3fb9a1e5027cfbe legacy-trunk
+16034 fdb78cfd9e767d92a821163008569d2eb092931a legacy-trunk
+16035 efb4b0c66688e43632dc1355b9c9eb700795b5c2 legacy-trunk
+16036 b53290b7b5468a19b7e8d08f480bd1a79405ad58 legacy-trunk
+16037 1c27b37ed1a1ae77f25e65e66b823e461b6583b3 legacy-trunk
+16038 bc714a7a004284bedc7478b455a754aece52c07e legacy-trunk
+16039 e2b3621e6521392aeb6bb7ccc75f59b35bf526ee legacy-trunk
+16040 3370edad08ced5df888eacba796f9aaeea605796 legacy-trunk
+16041 e2ee38ea7f35e4d4a03e073ce11430023b4ddc31 legacy-trunk
+16042 503a73998222c5312469c81b6b09d62b6c4ce6a7 legacy-trunk
+16043 3f598b98d7f922406fc4d1837bbb03b249909d71 legacy-trunk
+16044 91de3f03ae8927af2f779011722d455b1076b122 legacy-trunk
+16045 3e07a7315af52ff6845f98c4906a4deffd4a565f legacy-trunk
+16046 5102effb0c4b4c5eb5e6c2de85c99c6f9808b6a5 legacy-trunk
+16047 e0eb431e4393acd7f626b1c2ba7396b2cdfc59c3 legacy-trunk
+16048 7295f360264e47cc51e6ae1a6107f107f1190050 legacy-trunk
+16049 4011acfe1433fa9615bb2d65dd4ab3d69117150e legacy-trunk
+16050 f119c2d8d5603f7ff4c1998dbbf9bf4c53f488db legacy-trunk
+16051 cb186402599a727faa10243297290778d403a4b2 legacy-trunk
+16052 7edc480bb9f398e9d241ef58a43f53e47993649c legacy-trunk
+16053 cfc64faf12ce599039ae19fdd4b9ed452ee92344 legacy-trunk
+16054 18c81f1a0da234890394b716f2cae6c2f9de75fd legacy-trunk
+16055 e38be8717ec031b612b8ef5561bae32636d3cbfe legacy-trunk
+16056 800a75d0787f0a01a8895cc6d86ecb999b3ea4a7 legacy-trunk
+16057 6e4df3414a5fcf500c578ba3c12b60f9fead53b7 legacy-trunk
+16058 b91b5762b1cd114ab7c037fd364e8985ddeafaf2 legacy-trunk
+16059 a5e20d07470c5e7b8319d9054fd13e4c99038a6f legacy-trunk
+16060 46ee2715d29839bd63eabab2469bb359fce3fba4 legacy-trunk
+16061 2fb3fb646cc59596304a358d5634cccb839e2edb legacy-trunk
+16062 3db62c75e65b15729fe660e7b02de20430bb5a04 legacy-trunk
+16063 1cf6738249aff5e3339be791f3b49ead03d6a20a legacy-trunk
+16064 90540cdf9c8d9647a6f4e6c88f6fa9c29df88a59 legacy-trunk
+16065 36074222161c0b1b4e7f98a5d45c6fffb437c156 legacy-trunk
+16066 50f977e1e2ab70d2be7893ffd29b5dd9d42cb031 legacy-trunk
+16067 33ce63b0635908fa3fc02377160ad150bd7949c1 legacy-trunk
+16068 384fa9b9e253ca0f74407acc3fd0f44ca0ce1df3 legacy-trunk
+16069 085b015a9291d9d5a13698ec3807c0d442b7617f legacy-trunk
+16070 fc2ad6fa08ece912b38d5176e5a1677e47529e90 legacy-trunk
+16071 c7ef1585983c46654cc4c7a21102a2995c08f924 legacy-trunk
+16072 3c35bf7b580b022e8b7be76034d80fdb4790b478 legacy-trunk
+16073 0694ce3bd48f67b115db5e78954804c6abddfdf3 legacy-trunk
+16074 420ab443021e965d3bccb2c381c2426200874d0d legacy-trunk
+16075 a2bc8dff55dff54744a4c13df1643cfbd470e798 legacy-trunk
+16076 03aa26819ac27651d9cd92e0b94a23047ca81621 legacy-trunk
+16077 58183679c90a22098b609e1f2b40ee501e29e707 legacy-trunk
+16078 fd78bc5f2b2ccb1bf4d38441117774c8445a33b5 legacy-trunk
+16079 66d42c51df16aef92eabe4208ed2c9361a647b93 legacy-trunk
+16080 cd8a41bf4ac20b9a72b4f0f71824be7ef7c861d9 legacy-trunk
+16081 390e5d51ff7332b6512b8f7e41d8978e7d5712d8 legacy-trunk
+16082 67a04816ea5011a300ee37a0636ea473bf344e09 legacy-trunk
+16083 ac24d82d8e33baa63a9e7ec180e6686820e08ec8 legacy-trunk
+16084 af10d9b74143d2c3ab18d88cb8a3fe23943ddaaf legacy-trunk
+16085 ced860f2d8d2ca5e0ec2fa0c94dac29684e728cc legacy-trunk
+16086 3418d5c0f96022ca8ec3ce5e077ce6ad29450a6d legacy-trunk
+16087 7bac10a9bb61cf6ea0bda1f06c3de952c392cc3b legacy-trunk
+16088 24717405dd8990f9b1a96258f1f9230b2063f209 legacy-trunk
+16089 c155bccb7a22fb2468a1e40df4b926518b7ffd08 legacy-trunk
+16090 d8a407777a6f4b7a4a81314c54372f3ed9789379 legacy-trunk
+16091 45494046c2fb61c57bf3a7954ce1ed152295ccd5 legacy-trunk
+16092 63d2887baf118426d32fc4934c36bcc1d532d86a legacy-trunk
+16093 7e3d60455958fc73863b65e44c29d10a42740701 legacy-trunk
+16094 5626d4255fced5cc9361608398743c9decbe7cfd legacy-trunk
+16095 89e47eba277189bc88f4d91a83cc3f5689b694ce legacy-trunk
+16096 87df1ae4f110c5d097d232415a45095b06681c3d legacy-trunk
+16097 8d324d9d518fdbd50e0c893144abff1890c819a8 legacy-trunk
+16098 f0d402d48180be9488db9dde6c22920ae4dcb10a legacy-trunk
+16099 e101600adee44a6312e9f120216be1fca5c5436d legacy-trunk
+16100 a7f72022b93ac897238c26dcfcab379fdbdf2123 legacy-trunk
+16101 f98d6d63ad71b6bc144a0df47e1c47abd1c060a6 legacy-trunk
+16102 dff277d5feb25b0ee9dca25ad83023207e113e63 legacy-trunk
+16103 3f1bd4782628b6a2d5f4746346516409836de0e3 legacy-trunk
+16104 2a5a3cad5174a5fba75772ac3fdca4ecfcb80ebe legacy-trunk
+16105 abed80b50a2ccaba4332daedcc49968607a4fb46 legacy-trunk
+16106 c3029f2760472cd854b0f962e2cfec511d43c7b5 legacy-trunk
+16107 4c40ef5dcd827af9fad81fc28aea39dad6d93d97 legacy-trunk
+16108 fb30996101bc834d29e8a316bea4c0b0c873b281 legacy-trunk
+16109 384835ea0a5a16b385e208cbcad44f78966bd3c7 legacy-trunk
+16110 7628882dcccde87e068ed431c93a4c559835273c legacy-trunk
+16111 b3530dae03bfb97fd8a307723c22d2fddc90c6f4 legacy-trunk
+16112 e0d676e9cb66c140a77eb5d0985788813105e8fc legacy-trunk
+16113 5619c3f7a44bdc5ad1643076146e9cd20ce5c8bc legacy-trunk
+16114 d88535ccaee5c269c6842f975e7d44dc151f63a1 legacy-trunk
+16115 0b289e00d52a27455213aedce0b0d0b21cecd4d0 legacy-trunk
+16116 99f341a97fdeb6f07924ae5d80cfec469495108d legacy-trunk
+16117 b4aedd90c8642e9da0ea4c1612c26d7a6a9e1938 legacy-trunk
+16118 9a1b961e0c3af5041b09a53dfd292cf8f5d569e2 legacy-trunk
+16119 d80381336612d61d7e28f41590398b95d262e8f4 legacy-trunk
+16120 c8706e5a882fa212df33c0e58daaf95417829d78 legacy-trunk
+16121 60a9726d85f8e30346c8fca0bcec1ea15e5ff4bb legacy-trunk
+16122 484bfde70dccbf4cb6bc83c60869d496b548681c legacy-trunk
+16123 bef7b629ac959be135c7cdd05d1e959cb5457b68 legacy-trunk
+16124 02f8705bda05e5206fd86111e9e8b089546d1e1e legacy-trunk
+16125 f36936d43d02bbc63be0309f41aa68bae4ffea52 legacy-trunk
+16126 3be2944959da73c5797175bf90a4fb800d682bf6 legacy-trunk
+16127 b597067e056f791b3459902822febca67e86d8a1 legacy-trunk
+16128 a1110da657e50dde53e0fa930ea4685222251ba4 legacy-trunk
+16129 cbf66e4ff08f0ee9ca0b12a9eb1ce860fb3979d4 legacy-trunk
+16130 94790b0c55d04acccf396cd61638432f23372754 legacy-trunk
+16131 f0c80b8364e20b3b48d28eadb6371bc889f7a281 legacy-trunk
+16132 3a00031f9d60c7c2df2e1fc1d82adbaa90c3c961 legacy-trunk
+16133 cd8b8bafbb33973b194108f67a75322ebfcab99d legacy-trunk
+16134 745177be1a717cf1532a151f27a5c9cd96108199 legacy-trunk
+16135 d679745d986fdb490a7276a3144c4fe104eeffbd legacy-trunk
+16136 8fb7311d1381088e58d670b19bf0ef35a13915b8 legacy-trunk
+16137 cbbe512d24e05ced347a0d6f8219aa1f96aa3a98 legacy-trunk
+16138 bfe22cf6e7708ba642a40add26f1f0b3b1448a1c legacy-trunk
+16139 2017f54b0325c7a69b27ce2dc67c0429da1e93a7 legacy-trunk
+16140 113d833eea7e07a918bb516ab54549d944041839 legacy-trunk
+16141 62e140ba782dc040094d18df85cf7e4357fa746d legacy-trunk
+16142 d166a1e60760fd26f611a2c333e95b2b481381dd legacy-trunk
+16143 89ff5917bc8bc7f09cdae5c373ea917b0821493a legacy-trunk
+16144 b2d10407ab9dbcaca6dc0e7a4e8be248e68868b6 legacy-trunk
+16145 3ff022e1b95d1aaf05b1822fae356ed78c21a188 legacy-trunk
+16146 eacb2e51e1696520bdc85f0273ff7cc4b518a348 legacy-trunk
+16147 aff1c4146c1c2f3a874f96b5342d53cac145dcde legacy-trunk
+16148 3f08bedc1c261516c5223cbe7e9e22d763ba5c04 legacy-trunk
+16149 1be4665190f06951b3822b38cdde828ba84b321b legacy-trunk
+16150 88044f9df833d564d83fcc5c973388c2463c99cd legacy-trunk
+16151 1c0d35ba16b1c62b21c0638d4255e3a621392d81 legacy-trunk
+16152 62754b9ec7dfc05f5620ec67d4c50ef9a86b09f9 legacy-trunk
+16153 1b4359a2976dac3316475bb1be2430ad5da6a973 legacy-trunk
+16154 b05df687215ef44c97f5fe10d0821a8ac7b3a254 legacy-trunk
+16155 bcb14627b8f41ca1116d507fef4c579c5c3ec79b legacy-trunk
+16156 8107de28bc82139d0478312da0ac9edb3c6f471e legacy-trunk
+16157 317e8e09ce8771c62cbc6d7ca244b603dc24e80a legacy-trunk
+16158 759f698740ccf3d6ce96bf73399f89068c5d0ea7 legacy-trunk
+16159 8eb5c36ede9e713d65e0fb8cb2b856989a198f55 legacy-trunk
+16160 e8ce1bb056aec21cdd6facb99edcb80b7442efed legacy-trunk
+16161 21119189ee182cbe80912fdd0a8a5b6eee05b6de legacy-trunk
+16162 98db0c3c1fb9dc004973a01af02a84937209811b legacy-trunk
+16163 8f1a2deeb9b000d483e0a4ac8a4808ade2548034 legacy-trunk
+16164 7fbdb581838f631bdd74c2cdb2e14887516fabe5 legacy-trunk
+16165 e95ff211b9d3c7b8a00f8e0dc9eb61bd83d1e846 legacy-trunk
+16166 4cf21852fd521600917602e627253f3b498d41ec legacy-trunk
+16167 5371478f6f5b86de3e6d251f5ca4b1ad43647b55 legacy-trunk
+16168 a503af7e7fb7ba67a4e30f5178f65175f3ad4dc4 legacy-trunk
+16169 f2633c93e2e57e7a98f8707419415e53782e3638 legacy-trunk
+16170 f5212af9e6413f3174fcb01711af42f3afe69df5 legacy-trunk
+16171 c38bacd8efad2fe2280064e9612f2a16d10650e8 legacy-trunk
+16172 5157eb7be20d78032e9ade262c65883bc47f5064 legacy-trunk
+16173 9a83910548409274d2a03a64cd6bf7e4bb207736 legacy-trunk
+16174 e7106c2fc26cc4743ab8cb02dd0b5348b764c8b7 legacy-trunk
+16175 7fea4a1af0909feaa69cf01124c4dccfca31ff23 legacy-trunk
+16176 6a78ead1398704368b5cf84afefc04e269bbc813 legacy-trunk
+16177 2ba76e315016b236bd53d9dad8452c9186aeb22a legacy-trunk
+16178 da610930638b4785996619c9cc2af08efa79659a legacy-trunk
+16179 70e4cbfc3b2479c8eae394a0cadc05f95a3e45cc legacy-trunk
+16180 85520c220067a29ab1a6bd1d5e7eb6edf729846d legacy-trunk
+16181 db9392a04bed421ce9e0266f05dd484eea1d5fad legacy-trunk
+16182 d3f1eefdcb3a9ca16b1294fad03aba42fe469c67 legacy-trunk
+16183 346df19208737abdeb6c93df3dc7844035845597 legacy-trunk
+16184 aa3d3bece774545d22f618f73d8783b839b80309 legacy-trunk
+16185 a87803eb9dfb1447f59ff6541bf63bc0ffe56737 legacy-trunk
+16186 64a14ba746413853f00d95f68c3c2219cdd3a6b7 legacy-trunk
+16187 263b4492844a206a3b954b7138589e73c622bb84 legacy-trunk
+16188 5ebad689b7a79224e07a474c096a767e7348a387 legacy-trunk
+16189 618a7280f6be50b9767f976729c571bc43fb841a legacy-trunk
+16190 0d6af303a86cb4d36776e94d89ae9d7fd786e216 legacy-trunk
+16191 8a3d50ed06f797c73706442cd3010eed9ef5fd1b legacy-trunk
+16192 088c5f3b7094c9592499dba52846f5fc7baddfd3 legacy-trunk
+16193 c71118b780594bbba9180716f40cd59a79090cdd legacy-trunk
+16194 d17664bd9b657ec54bba6fc9b2bb2b82d02af9d3 legacy-trunk
+16195 fc78e5a7812a510a5958964ae160e7367d1c2308 legacy-trunk
+16196 cde27318cf87b5be82c162817122d0ce5b68dae1 legacy-trunk
+16197 7e3cd9480f6638ac1464e0739ffc07b01c65949c legacy-trunk
+16198 bc9e22ad5c46081182b9b36782a11ced77590225 legacy-trunk
+16199 9fd33369335081db74b8fe252ffe69609d7bae8e legacy-trunk
+16200 ddf074ec65063f881a3d31ef1268d08737d4dee9 legacy-trunk
+16201 968a006e5480c268cc086cd3796627d3966e3f1f legacy-trunk
+16202 f8d084e3f8ecf1f83ea5b20bde21331c12649702 legacy-trunk
+16203 5edee6878943262b7d006ecd0c4835b85ba91927 legacy-trunk
+16204 ed72067aac032884133560dcb3423005f2bdfcd6 legacy-trunk
+16205 7e58c060d5342d48322267f4885924f999333067 legacy-trunk
+16206 5709ddba423cc8dbfedc1558c8a6ff8aea94d067 legacy-trunk
+16207 091ca6b9348f50d518f3f645f7004dba6db44d1a legacy-trunk
+16208 23f9689ace506377bc2e8b52f17a68c5e0f14ba4 legacy-trunk
+16209 a89f7f268de45f1143b4d9b41f6147159c4ddbf3 legacy-trunk
+16210 3e10ac7a5bf36fd3c7673736975648c196db3af7 legacy-trunk
+16211 0409a98cd582e3675c3025e889d72fd43e5f71d6 legacy-trunk
+16212 4ad26968662be062662b6b2b7f2f2ec23f972a8e legacy-trunk
+16213 808b446af97c763611ea7a89ab86eb33a92a9f3b legacy-trunk
+16214 ed4f7a22e928caa233cd922f572ee630ed89ce5c legacy-trunk
+16215 d6198e703602be3070b1608279f0d50d135b9c89 legacy-trunk
+16216 fcc75a3748f5419670f9d3da0822c84249418e93 legacy-trunk
+16217 431538ffb3ad321465a11d48a29f8951707b425f legacy-trunk
+16218 6211315eb592ced2da379fb1cbcd39aae2bd3b1a legacy-trunk
+16219 ef2ebb3b0c647ffac1ecfe9e8235047ddd8d769e legacy-trunk
+16220 7908ec855665dcbd4d26c424f6a6bea2e353f4da legacy-trunk
+16221 0f95c93f200bdeeb2f05a94f41a95da87676ceac legacy-trunk
+16222 e6d17f15ae6aefae95b9a141223d09f9531d1675 legacy-trunk
+16223 f6cdeac44a10528de624203858a06f94c61671c1 legacy-trunk
+16224 4cf0de29c08c71abee95b91ef7e6b30a4707053e legacy-trunk
+16225 b7066bb795810cb194fa105103d81c7ae98d88fe legacy-trunk
+16226 ea8235edfc96158372fa99b8c86484b13a185366 legacy-trunk
+16227 8e92d941e07f50449c87bdbc5712a68648fdcbf3 legacy-trunk
+16228 bfadd363a200a31a68f121858bb914ee7fadd43d legacy-trunk
+16229 6690374a1dc1a5a0eab804de69095f18a52e290a legacy-trunk
+16230 b907ebf3b052b93214464d8cbf52cc922277e848 legacy-trunk
+16231 dd7e13915328fc9a59174b8819e3c0862225700f legacy-trunk
+16232 75b0e8cb07831d3dfcfddcd9272c4e77a48269b2 legacy-trunk
+16233 df189f9cd010dea0efcd899f22401940a0799167 legacy-trunk
+16234 dbe83fd23393a210999aab4422d01a967fba232d legacy-trunk
+16235 31b1f691a7d9189e7b779eea268a522ef1fba721 legacy-trunk
+16236 e1b070d7162c8de766abb4382c6d2dd73bc7df39 legacy-trunk
+16237 2ff2785e52919c1cc61c5cc10e8a3e5f60f479bd legacy-trunk
+16238 8f66c5ffa26c8605253c4d451c794eb750b449f7 legacy-trunk
+16239 1622bb24da55664d38d45820ebac02bb89bc4366 legacy-trunk
+16240 70d351fcb8d5900c86eabfb24c752c60fe79798e legacy-trunk
+16241 93ae34aa20ab363567b1a2e0cb43d88c3eed090c legacy-trunk
+16242 6084f8d3a825c0a7647b242f3b8add5a3007f955 legacy-trunk
+16243 3abecb34737fcc806edd22dcc6b9294aef7d6ba0 legacy-trunk
+16244 000a1c7eb09fbcfa88fa43e6c2ee0e593486627c legacy-trunk
+16245 87f8396851b2aa65f14a53cb95454e0f2e8092b6 legacy-trunk
+16246 67fd19d7452818d694ab6b4b9685992dbe0652d7 legacy-trunk
+16247 e4ec77879ddd02ed88a26565f4a133faa225748e legacy-trunk
+16248 32b686da3e51913a74742adb71b3e24d107b8c11 legacy-trunk
+16249 8424ec4c4bb2030ce36129c8165aa81a6230c32c legacy-trunk
+16250 b31311a78a5da653172951bf11481eedfde23b66 legacy-trunk
+16251 f50bdcb0dd0eae01d9006e12ff2babb0f42b34ef legacy-trunk
+16252 cb539824448e85e2b53cf2b5fac8d25f289fcec3 legacy-trunk
+16253 5da8456f2e4d34437bc29f0b9f8a9a124d97879a legacy-trunk
+16254 5087d1d45f1da66cee7f51523976ae6cf1cbbf98 legacy-trunk
+16255 8bacf8631a11cece580de36d337f7f0c97094b29 legacy-trunk
+16256 4aa12e55bf95d1df223b640aa160f0826a3daf6f legacy-trunk
+16257 423a5b950cc983ca295408b25b67565e83058f53 legacy-trunk
+16258 03bc51e43f7af755bee0a2d7299a2c886e0732a4 legacy-trunk
+16259 95454b73ea91d3d6ba2df7313c0ee506374129fc legacy-trunk
+16260 c830854fa507adda83d5f64b9da741c887cf30b3 legacy-trunk
+16261 046799a08057c29fb9df8f02f07c218b6d067877 legacy-trunk
+16262 d9cc620ff186ef8aafb61ae5e38cb65eef95a910 legacy-trunk
+16263 ca32ff7a067e695c1d3b22f59a8b2b172ecca3cb legacy-trunk
+16264 7348cceee8faa9d4b8755bb4f286939f461ad241 legacy-trunk
+16265 6484098f40fc3d248d4d5db2a525f0c678c255d8 legacy-trunk
+16266 8256d6198ec2f7b89b247d92fc0151b24ac3e09d legacy-trunk
+16267 0edeb4efe6dbc39ce779b3e32712a863cc397b41 legacy-trunk
+16268 86b367d2e7afabcf07bb0fa0f2bba83892622246 legacy-trunk
+16269 c05eb902e5600d5e50d55d0e46c8186f573bd481 legacy-trunk
+16270 7b0f4483c3317604d49b37ceb2c9a600f7b852f8 legacy-trunk
+16271 fa741988db1785d833a86ad772028296eb083b39 legacy-trunk
+16272 d018485271fb4e002c7218ed1929b788df87465b legacy-trunk
+16273 18395ca5c30efbb7e21e1b4650850d03f4897ea7 legacy-trunk
+16274 9a40f18f0561fff2c64b48b79da2f91bb8dc0072 legacy-trunk
+16275 6057f44b0b7ac5cc4799145e645169e39a7f26e6 legacy-trunk
+16276 5304b88fe3ccf079e56435fb61532178807487ce legacy-trunk
+16277 cd7abb4feb1ba6f3f5a3aac3fd78fe618b0c2a4b legacy-trunk
+16278 e44ca61db71584f54bd03d049e4ff602fc5569b2 legacy-trunk
+16279 4f110441db39182aa371b29b245e1933e8e71624 legacy-trunk
+16280 86704432d283a5d4a7dc50963f28e3733fb9f943 legacy-trunk
+16281 070e41f2697b6cf976e810c0346bcfcb17078c41 legacy-trunk
+16282 27d87e072bfb052c9972cfd4ac3e698291693df0 legacy-trunk
+16283 4dbc75c189bced9ce0635fd8cb67d663b8435ea3 legacy-trunk
+16284 acc4638f37d57a60e25ae8773f7f978c7d566e6b legacy-trunk
+16285 02474df546f600a3daf2775cf1481f29ac313abc legacy-trunk
+16286 16e490462e6bf198d1517867f0d048d7cee407ff legacy-trunk
+16287 f336a267a2a2562964cb97a5bf8865193ba58eb0 legacy-trunk
+16288 3686d12362b8c0960fb97d544bd454853de34f6b legacy-trunk
+16289 07c31182f2371d04123cad92cf55c12590b976c0 legacy-trunk
+16290 e848d6ed3eb9d03c62622d1af49297e61ce71690 legacy-trunk
+16291 babae910c2e13a36229f8f6974bfa2c136c62093 legacy-trunk
+16292 ed565b0fe6484178b1b3a8478719e6a5989dc3ac legacy-trunk
+16293 30495d73b943615a647ff35e11bdc61a0dae4cb0 legacy-trunk
+16294 b0636a527a87999adf931025401fa2510fbe36f7 legacy-trunk
+16295 1e7c32bddb8f700434fb53f9856e50f0c27223c2 legacy-trunk
+16296 47fec48ca4959469b1c6869e2495c5f0614a154a legacy-trunk
+16297 8b1345ff98013f92f8ed87cc34599e5c4ed52398 legacy-trunk
+16298 97cd4736392c17779b0c9716d877384abb9727e0 legacy-trunk
+16299 b9f9da1a3fc473f51305792451bcaae3451841c6 legacy-trunk
+16300 4228775d455ed57b14a99b2ad69e63081d112ab6 legacy-trunk
+16301 feab677269e08c15ec0faa95ef6937fbb35dd89b legacy-trunk
+16302 0615dcef024de05d361277540bdace1d6fc79c60 legacy-trunk
+16303 9dbee4b4c03fdac8d3b3e62b6d53dec0d6702435 legacy-trunk
+16304 ddd6138c9e6fe762dba1e731caf8070a333f0a5e legacy-trunk
+16305 7aa51ebf483f992d3e49026a8bd749a064d37041 legacy-trunk
+16306 3cf4f5aee00e2fac3fd4094cbb60fbfe6bd7e5a3 legacy-trunk
+16307 1d66307922125911a63ec50d2892028c52b9bdec legacy-trunk
+16308 1f82a4bfd294558e5a818b7818109ce5a74132fa legacy-trunk
+16309 db963a615bc9312c1c96c31341392092e02abf22 legacy-trunk
+16310 d8b8749de04aba61d6981f8a901ce3f9395db42d legacy-trunk
+16311 33388927ac2faa7901fa645ffde05ba1f4fd9c10 legacy-trunk
+16312 95b9ddb003523e367ebb68e7c724bcb22714cf98 legacy-trunk
+16313 15b18e0cc3fd24829008389a6f37b34c27c568c9 legacy-trunk
+16314 dd2b5218e069ea29e88bd30e0c4fb9c42d7470a7 legacy-trunk
+16315 631b6a03c160eb9c32a608e03191022a3512f938 legacy-trunk
+16316 906efc1da247a361571ff1bdfccb87e2114bf39e legacy-trunk
+16317 9c74b8239ff80f872d79757e0d7f51e6fc419634 legacy-trunk
+16318 37b1a39606ce8bfb4a7e8036d43e23bebc934fea legacy-trunk
+16319 c396b602617dc460b779d18509f2e0a35cb36b78 legacy-trunk
+16320 6a4436d6958b0c67493ec36274515eb848bfc50a legacy-trunk
+16321 b786536f21acbf8381019df4ef072e4ff2326231 legacy-trunk
+16322 6987e9450619b7cbde7fc74e79d40049a95ea9b1 legacy-trunk
+16323 ea732719b3fd07c014312cd13cc5639bca14a273 legacy-trunk
+16324 919f3d5172a95ef33dc5102f4e4afccfe988ebef legacy-trunk
+16325 d1f6b656103b2c2008fc27083e42b15fe5ddd207 legacy-trunk
+16326 7991aeb3598feb2ee7b1c7d4f7e4f1c7f0b5b838 legacy-trunk
+16327 e558eb228a463f54dd5cea9cdde9fd0e1c9832cd legacy-trunk
+16328 47a9471956af9bfabd16ed1cee86962a1c80180f legacy-trunk
+16329 cfb2a0d0a8696f3774234086412db423ecbfba2f legacy-trunk
+16330 ac2bb7708320dbe4752a990c9bda319fbbd972c3 legacy-trunk
+16331 5d61b6f2aea3cda1a7313843aee4d04b4547bbcc legacy-trunk
+16332 ef3ed75f195c780a788c4ae822680f4734cbd7e8 legacy-trunk
+16333 3a8c670309a21db4b1766c5dd8deb6f0995a47c8 legacy-trunk
+16334 e417d9528fd611544c1fe1347c269a4f89e5920b legacy-trunk
+16335 01b23072cc76967622125f4b282f0cf0c5a6a1c9 legacy-trunk
+16336 cb76d7da670279e0e689f854c848c451e2f458e0 legacy-trunk
+16337 7c119f050290e3a2d9fce130874cd942b1f71766 legacy-trunk
+16338 61e4c29d53d8d277bc8c249efa1b73aad10d63b1 legacy-trunk
+16339 2e45b7c23dc6865f818afc41c64646829db9c7c0 legacy-trunk
+16340 a032101ed92644c2e62a36a5e0138a04513ab898 legacy-trunk
+16341 ffd5e8b67c84332b28fd46eba5a95d3667054c9f legacy-trunk
+16342 b4b6f3962bd12398ba0386d5a1ca706e62fe0bd0 legacy-trunk
+16343 e871bd05c6a744d25bceb884d2a44ca1699365e3 legacy-trunk
+16344 084a758051e0e1c6e2b6de06c635c91025effffd legacy-trunk
+16345 ad1c8271b6f828860e566f1311d1ea18bb28b0ad legacy-trunk
+16346 2977fbae4ca51b4a04408e0e3002788cc6e4ef49 legacy-trunk
+16347 89f905870c0a90de7bac6777978dcc9aeb9cbeb0 legacy-trunk
+16348 14ceb159e4499a3766e0a30f208f5bcc73cd35c9 legacy-trunk
+16349 7c127a79a369e574e7c8ba47d1d0c3f1a2ba221e legacy-trunk
+16350 4faf8c22da60be2a2d781e3b1bdd9639f61d1567 legacy-trunk
+16351 5025115d23cf2b1f0d31a89f9dd49fb7a2c89fd6 legacy-trunk
+16352 c503d8e474b370c2a3c901d046d1c297e043b583 legacy-trunk
+16353 2077bf141b377a442684dd4085c96b2f236160f9 legacy-trunk
+16354 9ca50e2433eb41ef2496c343492bcf1118f3c45e legacy-trunk
+16355 df64cc0e84e2a92a74e96e4041893b3b382965f3 legacy-trunk
+16356 5949b47587d9555ba46da25a61f6cd2a942189c6 legacy-trunk
+16357 a13cea430c1360e4e8c2e13c8d2339a3ed936e8a legacy-trunk
+16358 930f4bbbd93aa6d15593f5af9768e32c13e9fe5a legacy-trunk
+16359 258468a20d74576e5dd7b31d602888a759de08ba legacy-trunk
+16360 07d7403ceb0f25acc3c64be3f8a3004e029409a7 legacy-trunk
+16361 3260220aaee43d2c57f68674faf50b440411ce34 legacy-trunk
+16362 39f54b9a7f9cb69622430e3d97963bc6a8997545 legacy-trunk
+16363 ef8b20b9f6f537182762c0cc4c6508c95c8989bf legacy-trunk
+16364 d7aec17cd0b5046b59480d6d59a69e0c73e3efb1 legacy-trunk
+16365 42b672a09c4a103e559fd61033b02f8b68b84ae7 legacy-trunk
+16366 483e75efc1112180dfa4f0cd4300f257df5b812f legacy-trunk
+16367 dc17ef1a761380cbeee2afa420f17f282a44810c legacy-trunk
+16368 c9a4a13161708090b073f84796fb38b1c34b078a legacy-trunk
+16369 5583cfa6d2b0f3cdb143b49ad0487a4c3280e757 legacy-trunk
+16370 a901c2c0166baa6a195289bec335e30c391cbc4a legacy-trunk
+16371 295987f3fbd2201274199a4ededc188ead27148f legacy-trunk
+16372 2eca4051f05cb5f9415af9d6b292c2a400d01c16 legacy-trunk
+16373 88b4f3b508daa5989b5c26943ea9daa8475416ad legacy-trunk
+16374 f3401ed132a14cff4a6283ef370bcceafe153089 legacy-trunk
+16375 26075c03f02279595b02b2755f78239892640f7d legacy-trunk
+16376 e78edc3cfae6eae73236d870856d5161c25fde25 legacy-trunk
+16377 87a416d9d9b6f740154e6e3a0e385bdd9c3585aa legacy-trunk
+16378 f7d9e6185f6222c1eb2d74fb4e6b3a69dc868fc2 legacy-trunk
+16379 fa89496584c627b3fdec232d32dee65a353027ff legacy-trunk
+16380 086947cd202cc1356ea183d708d38d14bba9afd0 legacy-trunk
+16381 b74548a90a63c0369edd247929cf75a522f4af2c legacy-trunk
+16382 5b727ab37092d572aa7894f639cce100c6898f11 legacy-trunk
+16384 f11c472764ad371717ca19e3168214e90eaed075 legacy-trunk
+16385 3791967cb32ef86fc49145170020a876a33dd33b legacy-trunk
+16386 167de4953812facaa6ad1bf2030242beaed06a93 legacy-trunk
+16387 83a595e691e4262b7c242b60cb85adefda307e5c legacy-trunk
+16388 fdfd1049f36e943e7d59468ed8a4e94d35f49e49 legacy-trunk
+16389 f4da4355acde62fe62ca66db30c8a7f7d2ead7cb legacy-trunk
+16390 f4084f443f319da5994a572270b61e75c1264b44 legacy-trunk
+16391 d6d23d5e296d42f4acabf510d7732666fdab5d6a legacy-trunk
+16392 a1ad791e182182ee6c714148e881da9842f64603 legacy-trunk
+16393 73c661be1ea3de63f7386df79389816f23acb92d legacy-trunk
+16394 ff82fd422f1c1a328d2e3ab164a91813e9f5bb50 legacy-trunk
+16395 0859607ca3e53baaf351cd8ebadf3b558a09e53a legacy-trunk
+16396 e1469b7a2e68db2926e2090b7412b59e2ceaaaaf legacy-trunk
+16397 6f0d96e6b5a513cb7b1407f3c612c34faf744d65 legacy-trunk
+16398 dfb7ecfffe3d5b1c66b64b7f12a9576274ad2847 legacy-trunk
+16399 b5120f58c5da58310f8df7c1ce6fd605a4cb18c2 legacy-trunk
+16400 d901c43e7d58ce99f7af8490c2b34c83ffdae37c legacy-trunk
+16401 58398c0f948bc89676378909bda1449a41c58846 legacy-trunk
+16402 e2e25eee6a4b147b8cd3337927ce31811d6e792c legacy-trunk
+16403 3718e5398fad34b7682a9162ca7dfc480f85b69f legacy-trunk
+16404 38ea27455cbb3cb8874a8986276250a7fbec4765 legacy-trunk
+16405 dacc9f167e959ff70b6bfff6dad82282a40fed34 legacy-trunk
+16406 1528bc3ac73d5031948c6e43cc888d0e7b7423f5 legacy-trunk
+16407 2d5aa212a322b2f99583372306e43ae46fec1588 legacy-trunk
+16408 0c08dfa634c34e47bc336c5585cfaaccb3d21f0e legacy-trunk
+16409 52595b70a568488fa35695ba91b0599d25843d05 legacy-trunk
+16410 b2fbd9fce05e5e5005be23d93d4db30e7b2f1f63 legacy-trunk
+16411 8ee4a209a9ef5babd1bf1080408c6de3fbe8e3a0 legacy-trunk
+16412 f80571bb2913e78779a441931e36c97bf7df6473 legacy-trunk
+16413 3d6d218b673d0cf1455a3082a9c10a1e44ddf8ac legacy-trunk
+16414 8a063423e0b7df997488f31e6bb6eac57c972125 legacy-trunk
+16415 117d20968a1042d00518845377ac125a9fc192f1 legacy-trunk
+16416 a74aa49b0c37fad9ee6caa0fda2b9b216d73ba5d legacy-trunk
+16417 0bb49b3dbdf0acadbe36d0e00a06b0fe6e83ad62 legacy-trunk
+16418 12652da6d632ba08d2750fde18c7ac768242981f legacy-trunk
+16419 99dd1c9331616bdb8977cf14249d9250e4588f79 legacy-trunk
+16420 6a5314a6c2c299e33c73c794af31da3a3a102e8f legacy-trunk
+16421 f79434ee41fa86019216240ba32be660bcfc5419 legacy-trunk
+16422 e78153e179fbccaa51297a09115f3f7a5aae63c9 legacy-trunk
+16423 a1ce0721878134b36d50db11fd82f07d843dfefc legacy-trunk
+16424 ef25f32c452393f0d4d101c327347a143e017ed3 legacy-trunk
+16425 a3856ab6b206d7d2cf6ba676b0b51997ceaf3f6b legacy-trunk
+16426 29da35543833216036d9415275cc3ecc60cdb7c3 legacy-trunk
+16427 ee10834d67a36c4f7b263083d7ba73f6a2b47415 legacy-trunk
+16428 eafb79963ea64ee91504ddb4e2881e2c7d95c043 legacy-trunk
+16429 36de7b6ab7eb994170133c1cc39d8e07b06adca8 legacy-trunk
+16430 a6c7bfdd6777464abe9479d282b5599af99999cd legacy-trunk
+16431 d7d81ea9c82de017719c53cfc817413efb9ff616 legacy-trunk
+16432 e94c05351d4374bea5d9a0bb4b617e52baad56a7 legacy-trunk
+16433 4388249506d190a76a4dbbbc70294ef6ba0656d5 legacy-trunk
+16434 26685bd2c09e61bf389655f83ef14f42b56055d3 legacy-trunk
+16435 bfc5b2a8c11f5e626682b98d376fa2ef6970a39d legacy-trunk
+16436 cc0c0dc9fef0dc441b8563a9b44c8d040c2e03b9 legacy-trunk
+16437 c90d94d287d79b745e4b5a0bd5515ceda73174e6 legacy-trunk
+16438 b1959f006566591b3be1401b9cd0f16451ebc600 legacy-trunk
+16439 5423b132bc97af4d24076cef16f273b64faf04d3 legacy-trunk
+16440 edb1a8e6b8595960bbdd78bbc60ae1f7de75bd92 legacy-trunk
+16441 3177e2829167797ea0816cf7072e403cf8c27ae8 legacy-trunk
+16442 61f65de19e1e68eaac975e3bc55247112bfb042b legacy-trunk
+16443 9f6189e89212159469a615ea7241059dda82f2a2 legacy-trunk
+16444 b0e83962f4da708db78ef170b443123bab3b2d0f legacy-trunk
+16445 7de18f04f85a77a1d55ab6191bfe3bc595da755a legacy-trunk
+16446 8cb24e0bef9be59c3df508fd6183b5cf384d99ba legacy-trunk
+16447 ec19a0a8cd6877b19d425e48c7aaf085c7b47b8f legacy-trunk
+16448 129c9775cc19320ce588e04ca87a34770eaed598 legacy-trunk
+16449 9a5855ea3e56ae543940573f57bf39def49053c1 legacy-trunk
+16450 63832ede577fc59f9b48aec99eb4f4ed5a0f633f legacy-trunk
+16451 95894c3108d1985f60485e345b103681f811a136 legacy-trunk
+16452 9db86b27278fc92365a8e4698f76366fa27eaa95 legacy-trunk
+16453 c09c0171474f0f49c1dabc084dad843996b990d5 legacy-trunk
+16454 0f1c6053e8d09223728ca78adce06876e33c7abe legacy-trunk
+16455 793bbad6d09cf0838c580bc61e0492481b2f4736 legacy-trunk
+16456 25fc68077b66543402e72af89a2bdc0abe34f06b legacy-trunk
+16457 b54f11ada91ea013885a3148ad5bd060bcbe6eba legacy-trunk
+16458 a28ed8c5e62e026ca2835ca84b7e5f3710ecd1d2 legacy-trunk
+16459 bb364d6f9f6925604160be36c42e278507402ce8 legacy-trunk
+16460 5e2e91ffadcd8e485efa413f2c8afa4ecde39b43 legacy-trunk
+16461 cb29d4a2c17b0b3fefb4c67c393ee0729fc855b6 legacy-trunk
+16462 026e12ac9f71b439ecc706fef46d3a3f3015cad8 legacy-trunk
+16463 d6dded3c850778ec19be3ce87876493c1352e87a legacy-trunk
+16464 c68003efb796a3a1d08d0cb1bdd77d92ba62eb57 legacy-trunk
+16465 f840bf6a3351e638ca431405a66011a72393df46 legacy-trunk
+16466 979701698cd297115fdc33a8ab5c0a6fe062a69c legacy-trunk
+16467 c9fd52d7ca0ae7c943c99f94f9ebb184ecb97043 legacy-trunk
+16468 461f9b6ee55575ba561aca51795658af43e10b7f legacy-trunk
+16469 2e603bd0c1a93d7c4712924af6165323b7b81683 legacy-trunk
+16470 dd9ffa0a6b1107e0776112eb6aa9bc7bccb763f4 legacy-trunk
+16471 fe89ea1c910898ba3dba19974d593fc00ffad349 legacy-trunk
+16472 4e2aaf1e722a7872517270608cf1e286283f7337 legacy-trunk
+16473 697c88cc4714dfb02d63ea22fd11c8e03513e648 legacy-trunk
+16474 48886fa82ad50e86aa5f85ece5f82da955fd76f0 legacy-trunk
+16475 00030eb88131f840f3b2bee92d037ec4c9361a41 legacy-trunk
+16476 c87a37a3d2e65b7614d71cdd3a35dbd192752aca legacy-trunk
+16477 c9d039196db6108b22eae3ba6a09a5c5a76a739e legacy-trunk
+16478 06d4225919d4d26372679ce30710c6a7e9e6f9d1 legacy-trunk
+16479 6578faf48cd1d49cd9897045e898f8cee563fb6e legacy-trunk
+16480 5c3ee76d242e3e8f1ed66da19aa3bd7679c3de18 legacy-trunk
+16481 17293f12e8840eb2e7f840108e50caa934723142 legacy-trunk
+16482 767b2f7be40e63dfe548e0d2bff7850bddf2512b legacy-trunk
+16483 d3f6940236425bcf88a0225d2341905497c993ef legacy-trunk
+16484 05d59f4476ad50f6a94964d2a6bbe079f133dcb2 legacy-trunk
+16485 b3e8d2e3dc73b04b0ed13dec24f2ee6ec2656239 legacy-trunk
+16486 b7c93c677e56589e66037cea1a747d92f03e8315 legacy-trunk
+16487 57d02f634a02b77890c6092dbfd17bfe02aea379 legacy-trunk
+16488 449dd3a00bd72929896eb10734cdf89cc6473ee6 legacy-trunk
+16489 ecb8aacff2e3ae86ff537ce0b0db92b5346c19fd legacy-trunk
+16490 05177cd441a18e78678ed97a6f42bd2bd3f10ae3 legacy-trunk
+16491 b769e2dd6a51bffd6607e0f5779f3da0252d0da0 legacy-trunk
+16492 54861bf6748da63f784f6de828ac84b780cc11fc legacy-trunk
+16493 689f190040635436b90172fcdcb71e53564f8950 legacy-trunk
+16494 8d996f9c5903bf0cd6e7b68be66ec39fdc7f1e0e legacy-trunk
+16495 9ce3e05b7fdb274a6a7559951e185321d07e8695 legacy-trunk
+16496 ba36a9c3f47714203462d2c2dda83898d5071ac0 legacy-trunk
+16497 3b69a9d044f1c431f783221223fed21358a6cbdc legacy-trunk
+16498 a949a72af969cb2ff9402a1f8495e4fd0a57df2a legacy-trunk
+16499 32ce254f3bea6f90ba466c1295b68117b280266c legacy-trunk
+16500 c31b13b7db740751068b6c74bf45eb1078b6f6c9 legacy-trunk
+16501 1475c1cc3bf1ee9c01595bd87d61cba06f344ab7 legacy-trunk
+16502 82d9c2f13098e5c76ff49accbd6eefdde6bd1434 legacy-trunk
+16503 98d8169563e71d74aae36a31d49cb6b4d6bf4dbb legacy-trunk
+16504 f65b86738d3b58c21b1396f68117b6f53bddfd6b legacy-trunk
+16505 ee8f09e41395461bab8a8e018807d365841fac93 legacy-trunk
+16506 c76e74abb65baf3def5445eb32407559c80b0b6d legacy-trunk
+16507 5a3114e8c027a9463ea849382782e268fbc8506c legacy-trunk
+16508 5c067c1b5ed0d8a5e691f79369d931e972d5c553 legacy-trunk
+16509 a44dbbde5ecfda579a9659b9dbb3a66c29a45da9 legacy-trunk
+16510 7ae9fa409b46f26c523103f61b383cff542ccee4 legacy-trunk
+16511 083b4e547171ef9a4dbe4572d1d54f0f7140463b legacy-trunk
+16512 1e9f30eec4824481edbaa03142d3cf0e06a0d5a6 legacy-trunk
+16513 dfdb911cbec252c93665bbc1d7a9f8adafb4b4b7 legacy-trunk
+16514 83dba3f5f7b46a008b9001d940b5557a0b768070 legacy-trunk
+16515 8d10757a575b0a6cfe51fd88a34328b05973c1fe legacy-trunk
+16516 84f8579a079cdaabfdbed955a8e1495085f2d3ff legacy-trunk
+16517 e8dc0a0be4bacc0817a145a566d721f57090a170 legacy-trunk
+16518 632be99cc2cb1384c02c5f5dbd083ea77f3245e2 legacy-trunk
+16519 00ed4b74302fd7e8679e05b17fdd1c08bd5a65f4 legacy-trunk
+16520 67b9b05ce5a5dfb27521603c0e64275c763ad58e legacy-trunk
+16521 bc37e6a335f215d9b9ca93d5f36c54c310a8dcac legacy-trunk
+16522 493b1065763dbfcbc3f2420e85e809cc3476016c legacy-trunk
+16523 16b60bd6c375da9bf4fae680d50a80e4dd881374 legacy-trunk
+16524 d89da17b46f610aa5fcf96229103fed07ba816b6 cnri-16-start
+16525 6f8d24b332d35d595cf4f2b2d1aded500a771f4d cnri-16-start
+16526 59f8cedcf04951c30fd8a0c2a29ca13cb852547f legacy-trunk
+16527 2d00bced603870a327368a165629cedd30c8157f legacy-trunk
+16528 c1fc4066460382f3d3392276ed833428712a09ea legacy-trunk
+16529 fdbc8730d35698970ddde40f9553aed0e92fc40e legacy-trunk
+16530 b1b474cc8966437da4ea214ee16651478ca73168 legacy-trunk
+16531 dad01317bed72faf705eb5096f19d29f31227b11 legacy-trunk
+16532 8bbc0e6432ab482bb878bcd978360366166520ec legacy-trunk
+16533 323de3a8ff8ebc25b8f36b85520959fce38c73c0 legacy-trunk
+16534 f71cd24535c40619cc9162d9f32453d7e32cb300 legacy-trunk
+16535 b08ab2cdf742d10adc82f243172a08cc840a1328 legacy-trunk
+16536 2cffcd71d5e41471482d3ccca4ba3c116e556489 legacy-trunk
+16537 eea51275acbfb442faedac43fd03f85f3afaef00 legacy-trunk
+16538 b6d93dba120eab5d56102237c3f238a6df528f29 legacy-trunk
+16539 f1c97af4c84709be62a70f66b04ff11308087dcd legacy-trunk
+16540 9fbcfbf8a1d292b8fef03bd38dfc5634e505d69e legacy-trunk
+16541 33df3b5167119e053b0de320adc3563a121f9e15 legacy-trunk
+16542 b3903e05017f16042a6509160fa684c478fb60d5 legacy-trunk
+16543 f6e4a9dd67cdd3ea4accef7696663af2355d93ce legacy-trunk
+16544 ab42d4542424852f90d59e3ef28be22a540b2863 legacy-trunk
+16545 e20fe00526809554c08b4f61b88e4a0ce6c8168c legacy-trunk
+16546 ad390240efb3b095ac1a8fbc128e062b7b028863 legacy-trunk
+16547 ff111d289905d52477c3591109164d7c79951b81 legacy-trunk
+16548 c24f7755b1f52551d05bdbf39b5d314a9f1084d0 legacy-trunk
+16549 1c186030688229716cee3abb1337bcec26c5c6d8 legacy-trunk
+16550 4204564abf20c53ffea64c6500ab1cf82907d10a legacy-trunk
+16551 6657956af31e0aa65fd058e8fd53b82ebbfa24c7 cnri-16-start
+16552 c93687d6c731718f9fc24c92b2d5e27599a6e033 cnri-16-start
+16553 f1290aba29da4a278aae8fc42da988d93062f41b legacy-trunk
+16554 1f966f0d467ca1da74bf62558132b0514704b7c6 legacy-trunk
+16555 f66513a0dea5a55e2afa24f81448f1ba31d935fd legacy-trunk
+16556 4edd13eb759d26c3f608a687f117a23631f171cb legacy-trunk
+16557 c66e991b5f217cba698d7d07870ccf342a6c9b36 legacy-trunk
+16558 0637413e59397e7485c5a568f6be9dad72665fef legacy-trunk
+16559 1b7813575af7dc9428dfea6af6009e3148e90195 unlabeled-1.8.2
+16560 352968ee40e629ad2783ffda0cc5b679290772f4 unlabeled-1.8.2
+16560 6f7ab74b1298dac51a2143b2f83b2b6803ea12d5 cnri-16-start
+16561 8fbf307b90a6c2f4e47afad74ba54ee887cbc090 cnri-16-start
+16562 136d3d72666a7953fc742e38de171a50b5d547b1 legacy-trunk
+16563 4c10bc811fedaad6a1b9b790f776f940015a0959 legacy-trunk
+16564 ba1383c987c8de988289640a30b2cab5432e1979 legacy-trunk
+16565 8295f8506eaea7596f93c75cec01625ddaab191e legacy-trunk
+16566 42a4a417b47503fd31c11cf585165fc0b883279c unlabeled-1.23.4
+16567 2c786896e549d4eeb75f1b44bc378cec1447089f legacy-trunk
+16568 e00d3ce71f893abce5b17670ae8a8bfaf1478b70 legacy-trunk
+16569 031dae08a0a98802da6dadef68a0f84a7879f88a legacy-trunk
+16570 ac48d077eaac97bc5cf322948048daaec8ef158c legacy-trunk
+16571 5466324bb8114ef7ba889fa8f471f24253757867 legacy-trunk
+16572 fd4372787611aa71ecc699dbdb6b9e07e40c6911 legacy-trunk
+16573 b1a7f61ab7811b1ce28d74b52eb0ce0f1495a8b0 legacy-trunk
+16574 e8b22bc88d95ea3f7f1ae05abc5936ab5f36360a legacy-trunk
+16575 c77f8873da84132482c2df7e9516c276e900ed92 legacy-trunk
+16576 11625633d0f6700fc02e8294e8f53ded6f6c8fa3 legacy-trunk
+16577 de90662f2eab1546ccee5ad477220d662d4724b0 legacy-trunk
+16578 ba8db96ea4d9fd45cde7ee8366cf9d571f5045eb legacy-trunk
+16579 374da582ec12f4daa8feb06bddbf102e050230d5 legacy-trunk
+16580 f3968dd1711b25ab7b7590c4f5b88d1cb996e59f legacy-trunk
+16581 76237c0cbf133f6db8a6dcd95a5ae699ee3d1bd6 legacy-trunk
+16582 f38e321be8a43641601a286e10c0fd9ef764715e legacy-trunk
+16583 64873cf20b16b40f991138ae0c88f19e7ddbb7d4 legacy-trunk
+16584 acd0755ee7725138f7250fc477c4d81d0fb04636 cnri-16-start
+16585 4f737fb04528dbdb1ed25cb2f75e42c955cf9730 cnri-16-start
+16586 41ad36fb00ee935efd96e3f7b6144e526fcc8873 legacy-trunk
+16587 45d8f23df2182c1d76669e498fa4de0b18350ac1 legacy-trunk
+16588 51f29fcbd9ba5a30e34fbb8918b25d55cae2c93c legacy-trunk
+16589 33ff4d4d91ac3d8b377236f59531abedda714f77 cnri-16-start
+16590 afbbe674d58a0babfe9a9c4f7c93ab7e423566bb legacy-trunk
+16591 3c0f75a2198ff19123318e43ca3be1c15892059c legacy-trunk
+16592 6622d7631ccff1f70f505df17329ea8b2b76f9bb legacy-trunk
+16593 95eee868611ec68f7c2902e1acb39a6ec24a9641 legacy-trunk
+16594 8bd82cf361aa4240854cb428618987b1d45b809d legacy-trunk
+16595 35e226686c2ed800a38748671adac933c97d795a cnri-16-start
+16596 d430097d1bfd1899e304679e4fd30686f706b7b6 legacy-trunk
+16597 c57b574e67664dc2c8c0bd4130c5b9ea5c766693 legacy-trunk
+16598 eeed7bc8a283d95a38c9332837ee91e964091984 legacy-trunk
+16599 084c63d85f9082954d5516528307f60be33fb4e7 legacy-trunk
+16600 a10dc7215c1ec175bc30491b62d7329da73a65bd legacy-trunk
+16601 c63863abe1aa9ddeab12d607a0359296496b0434 legacy-trunk
+16602 5fd80c82a15a91434870ec6a1b9a1891e9316fdf legacy-trunk
+16603 254f8b7c4a83813659f21da101f2e31548e564c0 legacy-trunk
+16604 61cc54c313f6cd1587fdce14a301c8a0538084f3 unlabeled-2.54.2
+16605 02e0816e4b3717b9f0171afedca6667ca52a275b legacy-trunk
+16606 e4c380ee9079f71352737542c791f7da6fd17dfc unlabeled-2.54.2
+16607 23a62a8751b4762b8589724cd9151a693397fa22 legacy-trunk
+16608 15114e0176529460387ad1b822e7ad750ad43dae cnri-16-start
+16609 403c970d1a5e4ac9cb1aa69677ddc2cbb9ee0cdd unlabeled-2.108.2
+16609 9acfd037cb94da18360602433834abdbc29ad94c cnri-16-start
+16610 c3783a33f84bf03578e926d6b46b38e388d95737 legacy-trunk
+16611 b016ec8738f9d23de8f2b815be9eb25c82efe6c0 legacy-trunk
+16612 5136e37ff548e691017321459bfdec6dfb6a5734 legacy-trunk
+16613 4aebd0f2a0626923f5c176580c504f92b2121439 legacy-trunk
+16614 631b5df44de60951389ef70fb73bea72fba2079f legacy-trunk
+16615 b368aa8208f3a1f4e6cf5adbb1142be7897ad9d1 legacy-trunk
+16616 11d88220fb5228ff8c822d9481b6f0f0b25ba000 cnri-16-start
+16617 2badb322355fce498434c67fbd46bd4a6020549d legacy-trunk
+16618 91d95a7b785837403119b08ef60c2711505e8a90 legacy-trunk
+16619 3ae06c57d09ea8cb81bde9af5f19c9538611f85b legacy-trunk
+16620 465144abf02a2ea99e0c0660d483805df19beb00 legacy-trunk
+16621 1e9d1cc2bc3f7ac58a12dd67eb2661b9a34f1bfa legacy-trunk
+16622 924f0981bf76dcd914fab51d4e1d22fb3dd02a70 cnri-16-start
+16623 97573cf91e6ade9478be0db465fe662efdd68ba8 cnri-16-start
+16624 87488c3113f276d67da455888b5e2c5542666014 legacy-trunk
+16625 00a5c806cf7cb8aba94563f15335d8a61736c94a legacy-trunk
+16626 b37f08635023f2673abfc26e5c2790aded681653 legacy-trunk
+16627 fc873ca0c7d3f48d7f7d2bc8b1e7859bfd85daa5 legacy-trunk
+16628 0525851ba0b77ab70c342c367dd3e1ae445b756a legacy-trunk
+16629 a55e4883f886b9cc96f70220bbe396a4e7a01ea1 legacy-trunk
+16630 dd042f5a8fa221448eabbd9010c820c2afa5685b legacy-trunk
+16631 098825e74a05ad92cdfe7fb05eeabd94128c425c legacy-trunk
+16632 348a7c18e0e63a7f326305ae16eda3fb34882e46 legacy-trunk
+16633 b731a206302ae70a9a4348dcf7e2bf678b0084bb legacy-trunk
+16634 c480529807ab3306aa4fa311d3af73f4722339da legacy-trunk
+16635 07b85fc7ef684f7783a4559e4a2be971f6f99c42 legacy-trunk
+16636 66589b06c63308614fcdddf70688ebbc05029fe1 legacy-trunk
+16637 04a36e93dc3dd8066f5081ab9e60ba9ad1c07f10 legacy-trunk
+16638 45edc325e89a57690d86fef2cd168c6c97ea87ae cnri-16-start
+16639 94add88ef08c06b55184f62f81c3e007d4ec344b legacy-trunk
+16640 6682ff3e318f5f2942839afad81d60b16daeaadb cnri-16-start
+16641 a296ff55221f7120b56f7ee57e00b1b7187eb34b legacy-trunk
+16642 99f0413ef795f315b251d172b72e9c095873aa50 legacy-trunk
+16643 bf8d56e27c7bba56dff8447a0e49c0fd0470d755 cnri-16-start
+16644 94f6ec87930abe5edd4bfda121e2533e9654e0e9 legacy-trunk
+16645 d74a4a43f45fb88adc87cc2db660356ad4815be0 legacy-trunk
+16646 468df5a8cf4acfd342cffb3e915600830cf47d06 unlabeled-1.23.4
+16647 96ad32498db7821486901b02e2a3f33d019a87e2 unlabeled-2.54.2
+16647 1c2adae450697dfc31c66533fb72c8063fb3bac1 cnri-16-start
+16648 f3d5f71ccbb45e736f8cc3ca4ba7e3e1b538828b legacy-trunk
+16649 4c3f977ce06cfe7cb5bd48791a5d50f9f8833abf legacy-trunk
+16650 a94e37ecdbeb6fb68d0de6dafea93f42326c5f69 legacy-trunk
+16651 c58149c0670aa991ed748a16d5ede10b08458402 legacy-trunk
+16652 fc49a3b3863b196c5c10b0077302b28e5e79db31 legacy-trunk
+16653 dfdb601cee1cf51435bb3386a2e6b6b1f38c4c93 legacy-trunk
+16654 592ac272641d22df35ff7147d5c934016a557bf4 cnri-16-start
+16654 a6985d89464376b9173c9a577c670b7d0b767d3d cnri-16-start
+16656 e263a273e321f96e97adacc530b9bee807bb923d legacy-trunk
+16657 ee8c5cfad335e6bc6fdf4a74a8f6243ccaee92a3 legacy-trunk
+16658 4ef461df32c191e9130dc9bcb7b951ea0a114872 legacy-trunk
+16659 58fefef70facb7300a2e456fc7567620908383c4 cnri-16-start
+16660 df7deb2eba414107edfbcbabe96595468a9d6497 legacy-trunk
+16661 8307446bc6aad660dd5117e63118f80e780b52bc legacy-trunk
+16662 35fc9511a36ff2c47a6ba66782a43009c449686e legacy-trunk
+16663 d014c8ab6a824353d33001a232b10106b8417d46 legacy-trunk
+16664 266e11a226f7cd839c226f340179906a207aecf6 legacy-trunk
+16665 ea5eb51ed0f698c4b4662cd0790825491350893d unlabeled-1.8.2
+16666 f911618a0ea0fac46ce96e2cb65cd3f0391d02a7 legacy-trunk
+16667 1c00fea9ae40c0f1fb42fed3eab38218fcb3d970 legacy-trunk
+16668 755e2135a1948a8d3c131f1fb763bd304b24b55a legacy-trunk
+16669 abfa4e4b2f3e9ace2ef282dedfad679dc8841dc3 legacy-trunk
+16670 0f68018cce58f9f1fa9db4276bbff77ef7a6104b legacy-trunk
+16671 dd830c9e5c218fae591826e40145e324594f838e legacy-trunk
+16672 c4e3218342503ac6267da215156d315c3c32da19 legacy-trunk
+16673 881d398a44e0710ae00fd7063e03f3e63c55713d legacy-trunk
+16674 bf7062e8eeacf43e3e7672d77844813e09df251e cnri-16-start
+16675 31a7b004558fb7c3a913e0da1f983fd5c18bd548 cnri-16-start
+16676 33fd60abd4822c4aad571be97967a095b248886f unlabeled-2.108.2
+16677 15ad4088a700bfb05bd300a86af70bc29a505279 legacy-trunk
+16678 8eeaff96b4c24422faaf2716f31c2aac800c0af8 legacy-trunk
+16679 09565784715e1c6655e69899f6929a005fcf2192 unlabeled-1.98.2
+16680 3a5a7d27f1b72b9de1f988a18cd0444b86d910a6 legacy-trunk
+16681 62494a96dccab5aa239e67ede9af61b60eeefdec legacy-trunk
+16682 c0c17347da5bbeccbeff1c75d1ea3f01da504439 legacy-trunk
+16683 aa49d074f7161b0727c9653cac09698fbbba51dd legacy-trunk
+16684 98f08cafe19b12541eaf3d1a3ca6fe23f5669a32 legacy-trunk
+16685 8f0fc0b5f784ccd06a0c71144fbdf1e3a85b43f2 legacy-trunk
+16686 08feb538c837160eb485e9c044cb19995a77a897 legacy-trunk
+16687 2190b759983734a0c4e94df0d521dc8a13c8642a legacy-trunk
+16688 1c5bdb6623c8c11485c258918fc33e8c1240bd35 legacy-trunk
+16689 77b9e041b595cb509d0d82251074200c49b94faf legacy-trunk
+16690 c3320d24d7de46add0ee4b733800bf92f8c6c2fd legacy-trunk
+16691 e2ea00620ed6899a4d4174690616154b8125f744 legacy-trunk
+16692 0430a1309596c8790d37d76fd79f7750e11a602b legacy-trunk
+16693 d3bf97d532a08b4f13f2d3f507955361dc5a2391 legacy-trunk
+16694 25de7193f9fcea65834504a76f58dff2e97cbea5 legacy-trunk
+16695 a0b36598b31d0d298991174593f4abf2faffab2d legacy-trunk
+16696 9c69bd1a2822f0e505f08dd4c3408ac3533ceccd legacy-trunk
+16697 e30a194dca01482c4de21c68db640f158e5e07ff legacy-trunk
+16698 0efdf45bf6bb6b8d1638608317d9cc35bf4094ed cnri-16-start
+16699 0ac919ca8e69624059e87a5ccde505ecbe787c54 legacy-trunk
+16700 99e19c982f9445df8cf8c31cf2fb411de8a4168e legacy-trunk
+16701 9c1e689840273f94237e21722d5cff4fd8416534 legacy-trunk
+16702 c45accc8e6d036ff75ada5bc5158a68b6aa57036 legacy-trunk
+16703 446c3616c323b0f47bffea9c3b01f69c7492e832 legacy-trunk
+16704 52757baf030dda0f083914952a536a2897632ebb legacy-trunk
+16705 b347fc5daeb70c7006d358f7d4a586868c954433 legacy-trunk
+16706 a4259bfca5bfe8ba2f2f01fe034a32e97504f193 legacy-trunk
+16707 6bf1281ec7639bde417168c84da45935a2222801 legacy-trunk
+16708 6024399b78bfa62f93dad9b0f05d0656febd9ff9 cnri-16-start
+16709 9414d031a2c3a4cbf64ce818f5842165b1354a4e legacy-trunk
+16710 c8ff80cea4f7be6191d5d7cc96094cccfd6a8d5c legacy-trunk
+16711 8f43e592cf9a4f68a5b0e521e2d8c416232da80e cnri-16-start
+16712 d70aec2e349ceab5e9f24c8dc5e2bff21cf3840f cnri-16-start
+16713 466e5ff2892620a027c2f4981f5e883bed9cf9f4 cnri-16-start
+16714 f405fcbaaef5a975480c8b8138c9008889a7fe19 cnri-16-start
+16715 e6efcfcf174a87ddd491dad1507759126c65b2f3 cnri-16-start
+16716 cf503450f07b24c62d66d39179a1e5c19227e300 cnri-16-start
+16717 bd67a4d6f4f8c1d6d75ae829ff6421c3acaa1934 cnri-16-start
+16718 08023d26a0ce87509e2469aa5d61a935b8a63390 cnri-16-start
+16719 59c6e9832a2042526ee1dda3f315d9b74459a003 cnri-16-start
+16720 693b615817466907cbf74641c74876a6a7bd244d legacy-trunk
+16721 4d16c8dd899c4eea21094691a7926be631a94f09 legacy-trunk
+16722 bc0153a739aef467e5a2cd31a07a9b01d7dbe5fc legacy-trunk
+16723 03fa40528d179fab652807987721862a7811e70f legacy-trunk
+16724 08092d1eb26af97c96fb27382ad4205f9e5ba63c legacy-trunk
+16725 33969751e351fd79049f7d94ee3a7e9b952bb112 legacy-trunk
+16726 52fcd098547e9ecb3681a6763878925082b5b417 cnri-16-start
+16727 d057cd543ed966df03612a6c42e0711adc760a18 legacy-trunk
+16728 c7b3fe843358675c2b711f04ede74b9266586dc5 legacy-trunk
+16729 1d17c5e67ef57252488008a2f8ae569a8526c398 legacy-trunk
+16730 658b085e175bf847d76d6e1a16cef1260acbe19d legacy-trunk
+16731 ddf302d692113e6e4b9db21cc5376cd614d5cb1e legacy-trunk
+16732 2a04fbb7c07d96477db07256a2d08e6a69a1e8ca legacy-trunk
+16733 b6e07c272487900fdd97690ff233d58372aad5c6 legacy-trunk
+16734 266fb6302f3117d71f8c167398725304cd17ba19 legacy-trunk
+16735 3927a4d9c2fb02da2718f3cf43d4bc0994a6bcca legacy-trunk
+16736 f194d8b24865912bd16c1755301e9be1a3877d72 legacy-trunk
+16737 4eaa463c031a1bdb5e7791c370d04108e0682dd4 legacy-trunk
+16738 60c7cda35cfa4877ecc5a1548e903621ca85808f legacy-trunk
+16739 7172c2d8b92b658f2cdc6d2f4f222c7073cef7d4 legacy-trunk
+16740 4d14eef8ea076568ba75290672c5018ab583022a legacy-trunk
+16741 2e0d1aea9c3741e04adff8da1537620f4f532b91 legacy-trunk
+16742 44b1b818f28e9258331adc4b4ef323bb60a8bde9 legacy-trunk
+16743 25fd9846bd542c344f0ce580734123eb9c2cae22 legacy-trunk
+16744 464a2190d9b676a69357ebfcecbf956341972d07 legacy-trunk
+16745 80089a450c34d0b5bda1f46b1e3a060b9a406209 legacy-trunk
+16746 87af2c341b79ba0b559106d65048f23ea4139b26 legacy-trunk
+16747 ece75b07b13608010cb5a297f4e0ca563a520e58 legacy-trunk
+16748 d56dd1530ce1132c257c1efacf111c9051c3470a legacy-trunk
+16749 31b25ac1f019af303c662ba1070aa7ff027c3c32 legacy-trunk
+16750 5780b198abc899ea787581b49fce1d0b781ce328 legacy-trunk
+16751 648ba40444559fb4fa5df42a64bcdf404450b4ba legacy-trunk
+16752 afdb3f485d8f93e387f1e47c86b460d293c629d8 legacy-trunk
+16753 7a99450da2d64f7b2505efa4c986c4406c5628b7 legacy-trunk
+16754 191f20e0473ee1ffc40e8d3e3b6c48c4edc551e5 legacy-trunk
+16755 26898a98db6ed0bc1ad051482680cdb21bb09403 legacy-trunk
+16756 28afbc5e077004ae72d7f178021306b64e986475 legacy-trunk
+16757 370ade88a52a544cbd643982ef9a2cb7383d456d legacy-trunk
+16758 1b156ef8281b8beababfb79155589c8ebf80f10c legacy-trunk
+16759 70c47ab01a85e2bece30c886091bc375569019bf legacy-trunk
+16760 7445d99da8dd8825514266f3dd16694b11d46be2 legacy-trunk
+16761 82a22d82960710ea9467807d05aa40bd8b8043a5 legacy-trunk
+16762 494cf5fb8f174ef040c4825eb4ccd6b62679a370 legacy-trunk
+16763 8e8a8df0fe734f2b90c8ae30567ef00ea39f6ea4 legacy-trunk
+16764 b9002da46f693ac7f4728398d773ac9a9043b45c legacy-trunk
+16765 0bb0c7167d1fc7b0c471fc4a91c01487a2f83c90 legacy-trunk
+16766 8be7524085d6194a638290726c774e34f466c0cb legacy-trunk
+16767 7dde74c1ebbe4cf5238797e5fab157fbc9ec40a4 legacy-trunk
+16768 c9aa49e8748e715b4d5372aa030d81e09e1d8765 legacy-trunk
+16769 7079aa05bbd058c9567909f69637daacbd4e2079 legacy-trunk
+16770 2ee0f47f14d3b0a44d58f6d6cbef60a9043b01d9 legacy-trunk
+16771 a256c101bf2795ec21ea242c935563ce484cfca6 legacy-trunk
+16772 560175800a07e712dd826df80310b893ec7cf409 legacy-trunk
+16773 91ddeed12fa703a6cc48721bbb70a71a9dc53072 legacy-trunk
+16774 7b7ee58901fb0f0a7e0f2f07d092c7d8906ad1f3 legacy-trunk
+16775 841cf9012ac3cbffaa182cbee3b9d9bd29abb4c8 legacy-trunk
+16776 55e3988205b3480bce7ed05ee0cae168d4e3a048 legacy-trunk
+16777 d99183cdbbdc97a9bb9180facf1ad763afdae27e legacy-trunk
+16778 4eabd7d3925fc98c89760dd12ceaab35e5abbb46 cnri-16-start
+16779 8155a8b30444a4a4a6ef0f50a398798cdfd1a886 cnri-16-start
+16780 6e2c0d0c3fd56d4ae974a03419c005cea8c54793 cnri-16-start
+16781 de2bfc15f9ece5a5be453242edeb4b005e61ac84 cnri-16-start
+16782 aa420270225262711ed6e026710a18b25b0f8977 legacy-trunk
+16783 c258f05eb85dc98b38a39495ebf7b161d7c0becb legacy-trunk
+16784 4e28ca345cfee76fbed555b91dcbe397ea00fa97 legacy-trunk
+16785 3e6e3d05d00b7d5f16cc87b6e6ab3df30b03d612 legacy-trunk
+16786 30713d5288df49c44252e907b1fa4cbba72a0288 legacy-trunk
+16787 8a4a179414d4aa4841b340ed09cbffade55b66e5 avendor
+16789 58ac830401bd5c949fe051b0b799fe3cd8cdbb9f avendor
+16790 5ada9fa548015beb69af50728db8f03652a1f661 legacy-trunk
+16791 eb9a36163a9eaa99431c9ed340d8863c584a4318 legacy-trunk
+16792 b2cd66e5ea4c24b73d53cf6b8d932d91d1059897 legacy-trunk
+16793 63de7f00b5bccbe9ba97cbc40aea4c9bc8d59dae legacy-trunk
+16794 88f4e72d724539ddd30cf4439dcf0700b769a1fd legacy-trunk
+16795 72f682eb9adbe41b2a92e54d31854abcc73e742e legacy-trunk
+16796 43f4f8d15971ea242fb94f3544cb47e2acb35951 legacy-trunk
+16797 1b107c9ba70213679a71ccea0048b648cd672280 legacy-trunk
+16798 2c42439594b7e8034913664b68d55f867d21db81 legacy-trunk
+16799 61347ecb9b0137ee9fd58665403b3567f3635d5a legacy-trunk
+16800 400a5e3ac76c94aabd95159028028e350c23c284 legacy-trunk
+16801 f3bfcee745a7636cdde8b386a2edfb5cae3b5176 legacy-trunk
+16802 e5a74cfcc971c05eb821c683c489649985209eda legacy-trunk
+16803 f2792ead1f06ee889df27f7886ddb467142e38fe legacy-trunk
+16804 a955fd5de0350548dec7f40d5c6a3b64a349598d legacy-trunk
+16806 a284ed21a0ddae71ecd5a80f774609a254dbc7b8 None
+16807 7834a113ce248010dac04f848fa7c38d5863bf92 legacy-trunk
+16808 97f5388a6dce057af0856bbcc248ad4a6e7f4721 legacy-trunk
+16809 716e1c4e3f7894726f923a90743e2537a6142850 legacy-trunk
+16810 2e87bbb87ad4405c6d2118de82e07256c1181b86 legacy-trunk
+16811 65c1abf451dc0530f72f3d6ae655838e8ebb7c4e legacy-trunk
+16812 d8069efcd76e48347c80fec5709fdf9975fdbc8b legacy-trunk
+16813 143ffbf87e51bb1b20a15e8a15f12cfd1e399779 legacy-trunk
+16814 30dbb30ff01919b0e55ed2f0e5e5445cc8e624c7 legacy-trunk
+16815 443f3c77d88ced6877a2d9f3040daa00bbaa8167 legacy-trunk
+16816 55e4f4289e18833b5702f515f7573a7f23394e44 legacy-trunk
+16817 73d976afa8d43f49e9cf17142bb11e60c596c5e8 legacy-trunk
+16818 591afe2fc8230b6094ef731c0cd610b6791ba2a1 legacy-trunk
+16819 f36938874ce5abb9810d72f1311e051869f7e126 legacy-trunk
+16820 9a052696ca1237bb72cd16543d1e164f73c1581a legacy-trunk
+16821 9cdb6f979fa550affb56ad59f8a3ed8a3cbec087 legacy-trunk
+16822 ed369f0aa32b3963ab9a43cd8a2ec534bf7d1db9 legacy-trunk
+16823 eda09f824a9fb908c6c51a8eb85827a7d19117dd legacy-trunk
+16824 6c91ad9c0e06c3ceb85952e88473b4a9878a71af legacy-trunk
+16825 faa970f1540ff94eb8771ea1d0c21e0bfe9b80b0 legacy-trunk
+16826 49c7a4dd9f615d743d336d6ceb3de33fea6efda1 legacy-trunk
+16827 49c8305004801edc41aab59b93aa8811ae5cb847 legacy-trunk
+16828 82f79618b442851806c5d0a44618326611ba3788 legacy-trunk
+16829 6c7fa523726fc556faaf1298a7226610935d315b legacy-trunk
+16830 3d68d5bccd406e88d5b547abe985d5e2d3ef1f89 legacy-trunk
+16831 9b9461a656ddc557ac39a739ec5a24bdc8e737ea legacy-trunk
+16832 9a291889ab5f1788467ce26501d9d771fc7aee09 legacy-trunk
+16833 128f641191c33c895325bbf83a77efc9c65da491 legacy-trunk
+16834 0d805e239d8f44cfe23a6d86c9d5f88ea376c29a legacy-trunk
+16835 5984c3d761f78442e2809034c959d868b8193e4e legacy-trunk
+16836 b4b2612ea3330fd7cbeca1fc6a4865cc5a856f16 legacy-trunk
+16837 5b34b70ecf22fdb4a93f095120b2f5949fa351d2 legacy-trunk
+16838 d44603f2b9289b4a68279e050d31792d081873bf legacy-trunk
+16839 740290a56190a133cd3fd2533b2ebf677a40da82 legacy-trunk
+16840 0460cccefe4e3b6e48c6df3f5b9819f935aaf038 legacy-trunk
+16841 ae228a64293e12dcbc1246daa2b6b1a845c78eac legacy-trunk
+16842 219ce9622352514dbf224173739ed1318ba5f335 legacy-trunk
+16843 67a5448c9a0f25a741c6f05df01fe40e7ded6c33 legacy-trunk
+16844 5b0f3c40060fc18202fa82f52a4d4c66290c827c legacy-trunk
+16845 f5d8e73d77b7f5bbb658a6e42dad762005e51afc legacy-trunk
+16846 a96d7c45d961f336293aaaecf2546819d82a11eb legacy-trunk
+16847 d26cc5bdd24821e6aa6b54bbe5064a41c8bddf2a legacy-trunk
+16848 77a615c9217e199e93cd664708ea1f86bcf47fd5 legacy-trunk
+16849 3ddfa2d67be467cc2f45ca0b01dbe7bf241a5bbc legacy-trunk
+16850 91c659968a8018e261ffb3d8e24a65afea29df8d legacy-trunk
+16851 79bf6b38b7d5ee968b6489718d94731f9d208d1f legacy-trunk
+16852 32045d423a7869f002572b1b2fbeab34937c597e legacy-trunk
+16853 91f847a783d2a027f5f5c8258fa0cafccfe7ed8a legacy-trunk
+16854 18385172fac0b7099bd2d2264df614ed4466f083 legacy-trunk
+16855 a29a8cf5e66dd3f7f1677debb538290f163d6575 legacy-trunk
+16856 83080539f7b4b849938ac18ab9b26e6a4d3ab8f4 legacy-trunk
+16857 53ac3e2062efa96855f90362dd104cdf37971d98 legacy-trunk
+16858 98e3255486790264c2fd06d377cb662464f5f264 legacy-trunk
+16859 023468117514f48ede72c14212455bd10414546e legacy-trunk
+16860 a905c5aa0691cdb9eaa6c45ec172f6cd9b8a886b legacy-trunk
+16861 c4444f68ebf96773fbdabc9a08750dea2bebd736 legacy-trunk
+16862 1f94a11d2b80bf487814bb67a6508feced1af383 legacy-trunk
+16863 0a87c5b75fe3d5ef4d64a9cdb23f5a1befdc6410 legacy-trunk
+16864 8cf56147d7b5dbf9fb476247d1a9857f15497cf8 legacy-trunk
+16865 b913125619c8bb740f51016fd109e1faa57169cb legacy-trunk
+16866 6e2dba45c83e5de413c86c4c7bcd7725449978a9 legacy-trunk
+16867 fee0f402eccb4e08589b8711cb1cbb7730f8a281 legacy-trunk
+16868 275bc4f9d50d1758830ce94616cd18765fee8475 legacy-trunk
+16869 80a4192942ce95f23b5e3cb4649d284820157220 legacy-trunk
+16870 e8301612e7d80b9375723e9aa71f2fc726666358 legacy-trunk
+16871 7a6c5869f4566642d949ccda0ecc660fd16b5e4c legacy-trunk
+16872 6365a85bf4fb1cef3903f8033856b4fc22b72c0b legacy-trunk
+16873 ca8dc1bae67d7dc97a77f1e294ba95b0901326ee legacy-trunk
+16874 f69a372409fc0f012d24e3df8540b29bddd54a35 legacy-trunk
+16875 d0348a26b0939ebabca6305a78d4ca6ae0f1e050 legacy-trunk
+16876 dc2dedca93f70ecb1ff571c560ea074c6e7a092d legacy-trunk
+16877 6531fb1c879fe91887ce710c2292bc89a6e8f02d legacy-trunk
+16878 c722b4c4229a61154c9bfc2efc1ccddbf63dbce0 legacy-trunk
+16879 17b7fc440195bd6a0738895c672c298e494490a3 legacy-trunk
+16880 c7fe7569e4e177d756ffd26f4545d71c2af70b6f legacy-trunk
+16881 c50feffae82209468e493355508fb0c2ecd3dba9 legacy-trunk
+16882 25eea88047e9ecfccac279ae33609fbeaab81dc3 legacy-trunk
+16883 dc2db4562d0602d7e84cc4d9f2da14492df1e241 legacy-trunk
+16884 03401af36b5c0a12e79b5276403e38dc9e7ca14a legacy-trunk
+16885 920fc286854396fd2a135ca5ac634cd2a31b3e72 legacy-trunk
+16886 266d7eaf069e8e72b010e65169eee1d9eabccae6 legacy-trunk
+16887 1fcf7b438cab9b4928b3b2ca30af9cc540690f6b legacy-trunk
+16888 0089b39fe49cbc32388f0aaa1f7e6202a115be97 legacy-trunk
+16889 314ec59e4e14ce2fe58fbdc5ee33c1ffeb46dc3a legacy-trunk
+16890 713dd76be37bac782a7621b7d538dab836bfe54a legacy-trunk
+16891 c64ac83d3f18225de49a49a7e9828ea43192adf5 legacy-trunk
+16892 f8843101c943b8a7b53e1242f1e1ed6dbe2e345e legacy-trunk
+16893 b678491f7e116f8503d39032da194c27b3eb6744 legacy-trunk
+16894 b652a9aa94f13351a136ccca51967a7856d1ec58 legacy-trunk
+16895 51c2eed601590cf83b25f574eaa227a11618df8a legacy-trunk
+16896 5778f93cf22b4c21857ef55542058139ae0da340 legacy-trunk
+16897 de742303c456910d6de1b65a53a1fc6b2523af0a legacy-trunk
+16898 e678e58049b4c540d613f5709f1719e8afb35d9c legacy-trunk
+16899 f19bea681b667c4384e849fdf05a979986c3b215 legacy-trunk
+16900 02abf7717c96e179d9c3d4e5102d5a6b05e3f990 legacy-trunk
+16901 0a63b4789dfce4be20c9db5a6cdb6b053605af66 legacy-trunk
+16902 0612a1cfbbf68952a4ee216aa45ae2065a074dbf legacy-trunk
+16903 5bf56392419438363f71bfe21bd55255d1c17b28 legacy-trunk
+16904 d638f535f403c8e18eee8a84c35794cb220800be legacy-trunk
+16905 579e5c7035e2d0039d2b89a2245079f2607ae4ce legacy-trunk
+16906 9534619daaa12f75d65e363a004e8943f327b17f legacy-trunk
+16907 d3f5b453ade84e1dea6ae205726fbdf38053e769 legacy-trunk
+16908 465c7c2e8f2146d761fc4067600c6bad45d4c865 legacy-trunk
+16909 ec6a0b4a6479a5581755182e36a7db06420aa1ba legacy-trunk
+16910 606714fae1b507c9091a6816bbb1158ee3bfab80 legacy-trunk
+16911 88d11f48a3845b47f118e928f728a5ee462f4063 legacy-trunk
+16912 03db7b2392ae88a402b8240d928ce05919d6969d legacy-trunk
+16913 74638d20c4fd0f4168f4ecec36f105432ee6914e legacy-trunk
+16914 44e666cc8c07bdeec2ba145b7d98cb661bdf13a0 legacy-trunk
+16915 468481135c490b1a31941f5550aeec99d9eabba3 legacy-trunk
+16916 2de0cc174c3be91ae455019b0a95d42eddd65227 legacy-trunk
+16917 e2ed69b82d8d71818528e21c9e60c04f8fafb975 legacy-trunk
+16918 29636f020d4c7b4a5b3af344c5dcd46ca3a91b4d legacy-trunk
+16919 f657dc8ff25e93b877305bbcfc45e360191bb326 legacy-trunk
+16920 da69b7d1f20f0a6cba4af2f036f2b7f49cb2029f legacy-trunk
+16921 d809b9b75b9939319f7485e46b2622eb99580d01 legacy-trunk
+16922 4dac9e3149beac990ff10e4468a10f92b9e6651f legacy-trunk
+16923 e94342eea4f88e42d5fd23a93d2c3a31164deb8a legacy-trunk
+16924 17d3128478c3b93f1b9d258838db548d1ed89047 legacy-trunk
+16925 3148efe5606fc1818c33cce38135f2f61125e088 legacy-trunk
+16926 0abfca0035dcc832fa15c0e2d3250cc081c8facc legacy-trunk
+16927 87b8f0ea50e8d15606534963b7bdec18bb6d960a legacy-trunk
+16928 3ea23e3c1b06e2a649e3269d2a99a92641b3cabe legacy-trunk
+16929 4eacc0c912090ba0e56f060d62a1d0e0052eb9a0 legacy-trunk
+16930 3a3adfddc29d1f0823e615ac6757b9eca76732f2 legacy-trunk
+16931 0f8341dcc3cbc6b4af686fb3d989966ff0c45add legacy-trunk
+16932 92980920d5ed10de5b5fec71f71110516e7f1f84 legacy-trunk
+16933 ac8809959d01644140e721dc514927e117eb9ea0 legacy-trunk
+16934 44f4a84a80a825d8bf0c0830943d56445152352e legacy-trunk
+16935 f6338d74dca107aba86e47e6ce5a19e586a1fb19 legacy-trunk
+16936 80d4668f1e1037b52d486b5e98daf453848ef0fa legacy-trunk
+16937 c14ca20d1fc8d95b511b22f0f3b0eda8e3a9dc80 cnri-16-start
+16938 73c564e4a0f3527aebde66bcfb4b273e43fb5e45 legacy-trunk
+16939 e8ae70c3abb43a179cd9d2b17714fe287ec89f65 legacy-trunk
+16940 268967c9934a0586416c3b486e79bf51b9719635 cnri-16-start
+16941 dc5f67e8a2af193890e3bd055ea8f8fd01e91bf3 legacy-trunk
+16942 cef4da4147c83d58989392e6fc78a0f5cde14577 legacy-trunk
+16943 fd3f8acf103d1e7a3f8f02eead94942503557fb0 legacy-trunk
+16944 41eb755e4ed153f658b863a9ce6abb13c150c0c5 legacy-trunk
+16945 26768e21acf90ecf502d5d5c6549a4f693bc36a4 legacy-trunk
+16946 039583c090c43424b9a84430c1e795dcfd2e9dea legacy-trunk
+16947 2c2ae86dfe877259ab091e9c9c3a63541603aa6f legacy-trunk
+16948 7aad7d9b616e9ddbddbba04f2fbea995a2059eff legacy-trunk
+16949 441da2c5de43a953acb65c65976728f86b689edc legacy-trunk
+16950 44212336d71ea97efe7ae237432f9743038b4712 legacy-trunk
+16951 3eb135d62e2aed2c31fdc327cd3c2b250fa86ff8 legacy-trunk
+16952 76e73389c34070120e662f27fe5824bf1de50e70 legacy-trunk
+16953 996cc0675db67869e96e026bf984bd6bb5a3d0d3 legacy-trunk
+16954 aae37dc99f5755708cd1a0296e62b6e23c4ea091 legacy-trunk
+16955 0708cac59def3a66846833bf5d86f4264e404494 legacy-trunk
+16956 f6e5cc2af6f197a4430315b0fed395f89165c8f2 legacy-trunk
+16957 3116b0b912e975c61869da59e46004f271651075 legacy-trunk
+16958 f7a8c40b3880c413732a011e4e073a6c6b3de101 legacy-trunk
+16959 428729ff88249fdeb5197b6a001da4cfcd57752a legacy-trunk
+16960 f70424ebb39b4a1f48c2240588db4fe8f292ae85 legacy-trunk
+16961 22b590f8cf5382410e0c35d40b03fb0ea93903cf legacy-trunk
+16962 31cda87e9ff4ea47318a68c43f97edd2731b0f2f legacy-trunk
+16963 73e48847126308b20c7899f921da9ab05286be3b legacy-trunk
+16964 f5f8784a4c27c8a510ae3ddefb23f74474fe5a89 legacy-trunk
+16965 21ec69a56228863d89f87c6d497ad216896a95ea legacy-trunk
+16966 b8e5e933801e36afbd35c68c86fb03e6870a6fd6 legacy-trunk
+16967 8dcddcf1330a77d582e0b889fa512023f487292e legacy-trunk
+16968 302dfd53b3c8fc2258ad88b217520ad35a9c6178 legacy-trunk
+16969 72d8a3b203b14f6b1db6f43429902a45e54e7730 legacy-trunk
+16970 3da5bf3c5f1574864e1843c241ae8186b7edaf1a legacy-trunk
+16971 40447b672064b420498e96a703a54b2309e0b512 legacy-trunk
+16972 ec3e0fe17b3d77a99c3987c559f64d43222d7ec0 legacy-trunk
+16973 dad54d44d9ecc273446471be138fb96738fe943a legacy-trunk
+16974 051dcd7cd1991de9e16ed030aae6b1f04bc0e611 legacy-trunk
+16975 e7c8b598ff75fa2395366fd5f21d80c7412485f3 legacy-trunk
+16976 c12e796bc4b675b0849095066b1e0f604b7eda6d legacy-trunk
+16977 6bf061a2fc7802f76aec63b6efd3f86b675f7061 legacy-trunk
+16978 5468b6e3b96a7d17f59b0551f47514d0818db655 legacy-trunk
+16979 52fd496d353209c53f7a7ac02fc064753157b8d8 legacy-trunk
+16980 27d7d89c774b10003a8e83330bc63f6444ff0624 legacy-trunk
+16981 1b9fd0cbd914947cc421ba7e45aa093d7ba9af00 legacy-trunk
+16982 dba4aec970e6cdb50d176512c1b7f0bc60ab5216 legacy-trunk
+16983 01846568d147d16707ed9592d869b906cf1add0f legacy-trunk
+16984 e9c2f830f9ba52bf5968cc7cd268d2ce7175a2de legacy-trunk
+16985 51a33a3b2ba935457fd5fc86ca79dea14f0c7a71 legacy-trunk
+16986 91deadfdae36baae6a2ad7cce2f9f6417c2237a0 legacy-trunk
+16987 b8eadeed8ed351803664a6b878f3991ff73af390 legacy-trunk
+16988 019265b3a85659c4269a9cad7f538800cdff6af3 legacy-trunk
+16989 c56372ad93435f1fcc5cdc50eb5990e11350a15b legacy-trunk
+16990 2b6a63759b97cf97f3e7a1845d57f1ffd4bc68ac legacy-trunk
+16991 f66e863a2a5b1e427d6fc170523bec242ce2c696 legacy-trunk
+16992 35b7989ba20c8a153a47c0148bc624fc1d2efb07 legacy-trunk
+16993 8d1a059ae99d44e226a3e25308b9ca4ef8900e7f legacy-trunk
+16994 acc72858eb72c8360169fdb1c8a169a13169b792 legacy-trunk
+16995 abbc02795c4defeca29e8c6858a15effe1820ca1 legacy-trunk
+16996 dff22d4a48dae36fb0a8a4db2780ff9bdb3e6ac6 legacy-trunk
+16997 5772c4983dd87d382029087dbc6aac477a1e2cad legacy-trunk
+16998 ea7040ab7286f22acb12601b858b2082f7cced34 legacy-trunk
+16999 89f8153fd1ba161f823f1961e3f4a841b85622ae legacy-trunk
+17000 c85a80db6845b062f57994bb5eaa0cbc90f87246 legacy-trunk
+17001 2385ea5872e193be54bb7a0dfa8b532621a13f67 legacy-trunk
+17002 2863fbb135f1f9cc6c97ff4510e4d4de6b69ee8e legacy-trunk
+17003 93013e4bbe02e24b02ca037715b36458051b64da legacy-trunk
+17004 e921228af43567efc90123587e016e9145f0eb5f legacy-trunk
+17005 581460fcf1425600e51a9a412778da6b00cf5a55 legacy-trunk
+17006 6223397bd6a2661843362209fa67e3b819fe3edc legacy-trunk
+17007 277fdd9647fe08b1a7aa27b80af5eb1623b444e2 legacy-trunk
+17008 4e66a3ab757da32f6681decebedf0d005c389fbf legacy-trunk
+17009 bd3d1411b66c1d405d6362d549b9f48174fbb8a5 legacy-trunk
+17010 9bf159ff4912923ed2d45209a31ea57a2127002f legacy-trunk
+17011 211976034cf7ee390c30f797667616edd4a7c857 legacy-trunk
+17012 9d8ce6ed4a29ab4200358019b72e1b6982665c78 legacy-trunk
+17013 999671f69df4d05ff74ff1913509afb5b0b1f585 legacy-trunk
+17014 41234ae95d2a07e5db03411ae452cf10ead95ff2 legacy-trunk
+17015 2787e93817c6a0a18dfbe9a0f33e565faec14221 legacy-trunk
+17016 34e7de4ada70af3cbb6076a3ddf582b74f9150e7 legacy-trunk
+17017 900a177540213cbfda54f3b01c3fa43ed8d7796a legacy-trunk
+17018 ec6a21f55fa1ce7d745a2dc96add001848a887f3 legacy-trunk
+17019 d223620a8112689c8b1fc8462b8fe3e7a8b25711 legacy-trunk
+17020 1b0dabffc51cf090040eaa97a38ee16db92e7e3b legacy-trunk
+17021 1c3445378879ba26b481b0c2d95dacaf606560fe legacy-trunk
+17022 6816db2650cabf9b01dce05fcaae689886dcec7c legacy-trunk
+17023 3ae185b8ff031b148e564c827a4536b422eb6077 legacy-trunk
+17024 4e907a51a7affc1f3cc2db984badef9dc45c1a4f legacy-trunk
+17025 8c7dcd1ed08a57f63a781eb968ca119753c9bc3c universal-33
+17026 c16f2dc9c089e86a5ccc001ba4b7a1f496358658 legacy-trunk
+17027 94d71f2fc9a83cddc7035a89fe521fab7b33ab6e legacy-trunk
+17028 0c0ee886fb03b79057f00bb5172374a0e786b96f legacy-trunk
+17031 19126e557ce841f745360c066bcab59c8e361204 legacy-trunk
+17032 a856c92b1d7bf1a3dec0e301afce3ae5c4517771 legacy-trunk
+17033 589112c4827341008ac8a912ce2a9fcda58f2ed5 legacy-trunk
+17034 63ea2a2df06f3d18ae5d4b2ec6ec2cc5e2180d74 legacy-trunk
+17035 b5fb175ad5282541c6c23d7042ea9897de6537ed legacy-trunk
+17036 0797fdb25a779e17a8bcdef3438ceb160e9d16bf legacy-trunk
+17037 d33179cdc51121d3b929548da81eec8ab97533f9 legacy-trunk
+17038 ae1edc6ff5435fadf8c63fd774376f7d9ff5a34d legacy-trunk
+17039 e79d3cf4443ed9d7fd71f5f94cbaecd91123e8c3 legacy-trunk
+17040 2c328309431167973eb593ecc2a6ec3b8534d12c legacy-trunk
+17041 303c36e48769f939527c2d28a410e06765828d48 legacy-trunk
+17042 e75eb4d8e329b47ab39a0ca8b543bee5930d58c5 legacy-trunk
+17043 d974cf545ca6adb3c22335ee45189dc1ca169214 cnri-16-start
+17044 8c52693397d24a11ddca288a8cc0c5e2467034c8 legacy-trunk
+17045 c39733be0dc811aa8b1109ef9ccd9b5c418f1bc2 legacy-trunk
+17046 a4f5328ccf19227bfdf0e5e6388c55083a09ce4a legacy-trunk
+17047 cbe9590d2344c4b826ccc9baafb65c60ee5bc918 legacy-trunk
+17048 11a26e963dc908f6d400aed0ccb3009d41551fae legacy-trunk
+17049 9f9f3280dc68a0178b64c4309c828ef40a29de88 legacy-trunk
+17050 20377f15b96a7cbf1f18c10e6bd4f52472f0c40b legacy-trunk
+17051 ab0ebf12d4de222c07451af97beef8d23fa74fec legacy-trunk
+17052 31925ab46b23542a1c347e3fc315b26ad27540e7 legacy-trunk
+17053 396b4ab3b9c2a9cbdcb25d7aefa4711c530e48c3 legacy-trunk
+17054 1f1a156ed5af8f7a50ce05fc85f85423a24f2aa4 legacy-trunk
+17055 b97e6202f0b1968bd989031f2a11859023b6e294 legacy-trunk
+17056 3e5d6e2093dfe1c5bd9659b61adb9b5f9d8cc18a legacy-trunk
+17057 63d85897c69fa4d57c171e3b89ad350a7b34e67e legacy-trunk
+17058 58d7995ce795f79feb02cfd9ecbf8cfe017be79a legacy-trunk
+17059 d9643e9c90eb1a5cc9d01e78823ea1cd31907044 legacy-trunk
+17060 74f7f237f739d8d6c91e45371643c74f34c8abe6 legacy-trunk
+17061 0e66b774094bfe551454ce7b2c9b1d5256bb4e69 legacy-trunk
+17062 3483a78d135fd46241bc6f3a68e7cdf58d0454d2 legacy-trunk
+17063 3fcac35c7f5e21ffee17b25b5cc227c5793344b1 legacy-trunk
+17064 0670c4f901710f2d09c22947f416d5bf47635c0d legacy-trunk
+17065 b2a8292c39a9a2df3fe9919201faaa735516d216 legacy-trunk
+17066 7b32ccdf1d4a2024fcf38fcb3ff16d6a7336670e legacy-trunk
+17067 5994bb61916332c5fde914c52f682290afc242a9 legacy-trunk
+17068 9cd2f790c50c382864ea36acd27e6d7b0d058f5a legacy-trunk
+17069 a142ea20fe94f1846f45c89a29834f69f7e7bd83 legacy-trunk
+17070 438871e70532b17be270cb8d5d82f26167d11d4f cnri-16-start
+17071 a1b2fb17bde7ed7ab7caf3f06ae109af686337a4 legacy-trunk
+17072 4e3640a06857206bf166eff5abf678f73db5dec2 legacy-trunk
+17073 4afb0889a165c1975b4a106132b8c2e7e989a476 legacy-trunk
+17074 58f3f936279ff682c605c81b523d24a977afe5b5 legacy-trunk
+17075 a99fab0ba2df88c9a8c1660703b2e76cc5c4e7a2 legacy-trunk
+17076 7459159ba249f46ff1d4305f5bb18bce2fa51c46 legacy-trunk
+17077 830de68de33095ab73e8e148d90cd8180ec8975d legacy-trunk
+17078 cdd95d67a71425829de8b8590853be8770d9073f legacy-trunk
+17079 1fc33dfcec442ccff8e3cf941800e2f16c75fd17 legacy-trunk
+17080 5fff4ffeb35d5c5af1f7c3fd2bb84cbdb04d8f3c legacy-trunk
+17081 6396529a421c9ea4313265a0213556bb5eef7b85 legacy-trunk
+17082 ae275644457b554ace46beaf7b8c8cfadab17eb9 legacy-trunk
+17083 d87ce2d2e425731656840e51107808d14e1308fe legacy-trunk
+17084 adf3a284a2cf1d66e6ab0142ae5bc17b3cc1fea9 legacy-trunk
+17085 9b20a69a505e0e6f2887b8667226930c9ce093da legacy-trunk
+17086 363851cccf2aed22a75f6ab6c679b50ee2629427 legacy-trunk
+17087 660dbcc18b9ec6e96fce1a04883154b3d44bd45e legacy-trunk
+17088 1f76fc98b4c8df007b0886560a6eb397145c15bd legacy-trunk
+17089 d3f92f3fc0b09026d93aea5faf9895afc9c29d3b legacy-trunk
+17090 98608429ca6e4292430d22a3c84da4f2ce62244c legacy-trunk
+17091 cd8b815cb19657a0cf521af0eb5dd4b2cd7f7e79 legacy-trunk
+17092 90ca6ab26909ec341e051db24eff03bee725ab78 legacy-trunk
+17093 dc9d9ec44679395a0f9c6af5b1738afa4be7e207 legacy-trunk
+17094 15b6fc25f605096f9366c73712978c180bfaeb37 legacy-trunk
+17095 21557ba4afbcedbcfdd476d09f917de7aa5aa057 legacy-trunk
+17096 bbfc49a84389642e990a8bbad8c7cc9604922010 legacy-trunk
+17097 18da2bc5058c0fdf8b78f641d7cc3614e34f1897 legacy-trunk
+17098 bd950c50167fa1d81c144f82e71ec8adcad3f2d3 legacy-trunk
+17099 f3a8f603656709953a4e5d4a2f4450174ef057a0 legacy-trunk
+17100 984abd20eec260d25b42e473d9e557f58c507ea9 legacy-trunk
+17101 fb8fb53a2eff013c56fc1a9ed1ba70bbaefeb49e legacy-trunk
+17102 b1a0fd3df1fc8d6107ccd9dffb1486c321c3dda0 legacy-trunk
+17103 68b61aa1aa4aa09404b9cb0f6447988d75dbda4e legacy-trunk
+17104 8cf663126723adafe64f3de4e81e09ca81d88354 legacy-trunk
+17105 4d565095ae9933017272f9780117e8c896e5638a legacy-trunk
+17106 df89238ac74771918758ded49a9573487981809e legacy-trunk
+17107 e25aa56a5207df8a90a571d63bb10aea1aafcb5b legacy-trunk
+17108 d357ad367f260fbb9cb2b370f2415f66768e6dab legacy-trunk
+17109 ea95eeee04e7249348e5daf7e3cbe8c18605e0a1 legacy-trunk
+17110 6ab58c55e0a3c0684065070a7ff4feb76655448b legacy-trunk
+17111 77e2443abf9bde325189fcccf6ebf0f5a0a935d7 legacy-trunk
+17112 2e2fbee53e69fe6cce6f06be77aa6ffe91a98334 legacy-trunk
+17113 59c19052ae4fb021e8037e4d028a81f2dd20e66b legacy-trunk
+17114 bfe304fc06ab91224448576d93b5f34249116d10 legacy-trunk
+17115 11a893cbc1a012a7df88594edb424721ae195d1a legacy-trunk
+17116 26dc62de9b6e15aa589ce5979fc15ea8a678168b legacy-trunk
+17117 053627e7ac141e48e3c25b263af69846d1fb5951 legacy-trunk
+17118 e5253b692e9fbe365ab4369cd759b24b8b86d609 legacy-trunk
+17119 8172ac9d21966cfba509fbcde215ef26ecad4ba2 legacy-trunk
+17120 eda449f54e449ef22e73caad53ce380affe3104c legacy-trunk
+17121 1205b180ba903c6aa04d7edf3a34e202654653f0 legacy-trunk
+17122 becb1ef0a573539076a69b71b2747b3b4ff1f3bb legacy-trunk
+17123 5167ed6836fc4a1aa201c61c01c4a52323a3b418 legacy-trunk
+17124 013ce7ee7167c39ff39e45a788ff1722e5aa5519 legacy-trunk
+17125 31641ea89a534d706c1b083487157b5319e47881 legacy-trunk
+17126 f8b20d90c9af25408060e6cfe96ef8689518242d legacy-trunk
+17127 0198d202039036831455afc9ad55da77eeb9745a legacy-trunk
+17128 e3779ee942d0a005eb326ae9b61660904db76e70 legacy-trunk
+17129 62ec0bfd93f808c67a3b28f6e407ca0cdbfbeecf legacy-trunk
+17130 b24db770dffdda9c08dfcadf9b4e58bb219e594f legacy-trunk
+17131 b8b3f76ffd51d1241a682f82ed72d01f85277c92 legacy-trunk
+17132 7d40bd07b1296635ba80ec6ab8ffd7e7a3d2a3d8 legacy-trunk
+17133 2db807f345bcc07754691ac8177706fca78a8695 legacy-trunk
+17134 97651f28b004c5b6fbebdccf5cb2150642291557 legacy-trunk
+17135 4b98dfded49f40b09a61430fde319c0ca1549925 legacy-trunk
+17136 c0fe1a8b872c040732a953156efb11baec19e70b legacy-trunk
+17137 4d491aeb980fd1d33a76ce65114934af34c24b80 legacy-trunk
+17138 4dfbd9b3412baae36363c7f31a8f9b8ca100ece8 legacy-trunk
+17139 511123dd84243d342dc06f6f7acda1eb87f8866c legacy-trunk
+17140 2dcfad3b2115deb6576afd9408c768a795b92719 legacy-trunk
+17141 33c7df0c549d72fe3daf3f55fabde69e148832e1 legacy-trunk
+17142 ddaef45595e2d762be3a02fd8477d21740ce0ddd legacy-trunk
+17143 1fab92836758f8043bcca653b41c9fee323cad2b legacy-trunk
+17144 ada4ec4cffd501dbcda88c09f04289a5d4fb0acd legacy-trunk
+17145 58f100acc3ac0efa2a58fade3f3c0175f672c9c3 legacy-trunk
+17146 460ff3cf3195be2dc1ed648c4aae8b328f6e428c legacy-trunk
+17147 58842cba8dbcd231f534d28d566eaf5948bff041 legacy-trunk
+17149 22b2ebd78372f2553fee8807192f2d9048b9e19b legacy-trunk
+17150 14a2b8d4fcff08bbf3d0e76f0dfdbca8360c04ee legacy-trunk
+17151 73f39ea4efb7a74f69139962e0e32054714daccc legacy-trunk
+17152 8f2e6134cea00a506a95cef9437bd872453f781a legacy-trunk
+17153 b57e360a6d161a9ac6defc362666b5462f59341e legacy-trunk
+17154 6dee1985c681c10ac502c2e6c9096db354a8e419 legacy-trunk
+17155 cbe423b3ba3a065ba65d638b394068fc69b6ed47 legacy-trunk
+17156 eb7c27e8fe37ee7d4ac602c02c9a17e1bf4400d5 legacy-trunk
+17157 f55b673d9acd7425caf95e0de1189cf18e127265 legacy-trunk
+17158 bea8f14e7d61cf80e5323c1dc99d2738c30e12fa legacy-trunk
+17159 951eb3af349483bd57163a407b508ad232789a0c legacy-trunk
+17160 0115f403fadd8fb50dd304fc2c51bf700a0af79c legacy-trunk
+17161 3b84c5ff89da893fd9fbb476dfc5d8a41b29cfb5 legacy-trunk
+17162 057c7ceb92f04486f297bbf76863e64f152e7f84 legacy-trunk
+17163 f48ed944884bfff2a551734f497d2de1991972d3 legacy-trunk
+17164 801a304f248fbff768cd4ec2e09c0c223653ef85 legacy-trunk
+17165 ab61c335a04dcd1bf4955b6dbc0a51728f341509 legacy-trunk
+17166 d41c41371dc1089040db747e15d328594f799d14 legacy-trunk
+17167 6949b50364dd08c8218ce7b734c696104d923277 legacy-trunk
+17168 7b53ec2704e00a3a5e5d748d3e0f82a28f7025ad legacy-trunk
+17169 432d308c45e8d8b41fc1ac72470287aedfdee2ee legacy-trunk
+17170 5397fdf88ec25a1b5837dec9fc852839abe441e0 legacy-trunk
+17171 2de1fb5302ed87ed68f2bd97d0f531e8ebf939d5 legacy-trunk
+17172 6d0f64f7dedd18354e58c92b3fade6a74769e5a9 legacy-trunk
+17173 21bf9fa92255853ee42caccc244e4e4ec5ca8298 legacy-trunk
+17174 7352bb1632bc01a491612203cfa5c62696ccbcaa legacy-trunk
+17175 ef978520085f10e597826b259aa906b1b7b9e646 legacy-trunk
+17176 93dabfc3a83fc8c52bad882bcb537653cb8cae63 legacy-trunk
+17177 deb727435f39064e35f6825d7948d20ec8902bea legacy-trunk
+17178 0f6809eba50a88c773d1d7118bc3697afb57a62f legacy-trunk
+17179 630c8abfa8d7c08e54567e7949159209fc38338c legacy-trunk
+17180 3b2dfbc34689ded0b0e7262682267fa672a92cf3 legacy-trunk
+17181 a38e12e4afb70c59dbe5e6478441a4af75500151 legacy-trunk
+17182 3eda3010bc0a0db85d1981828c966bfa068f1349 legacy-trunk
+17183 ea9e625b01a2a056d1e5235958e6fbc57ff09a59 cnri-16-start
+17184 35763be75ddb7ca6f7228d57f82cca464f33ced4 legacy-trunk
+17185 d1d5e2dc29db50d748d92da0c8e44debef9ff553 legacy-trunk
+17186 5c51c096de3bfe6cc36ba718dbf0e34f54d0c89b legacy-trunk
+17187 a665bdc4922f5dfb0daddba926dc7fc23d8fc9ab legacy-trunk
+17188 5da406ebef55204f7da1b7a9bafa980cc034da37 legacy-trunk
+17189 665b19e7776b53b201e54296efb0a0d94a42758e legacy-trunk
+17190 c7ed412a075b019dd50d7cfa6065b83656cb34ef legacy-trunk
+17191 36d0b5b094e421fb7e7966a0b54a53637608011a cnri-16-start
+17192 7a1fecc08d70a8ca00e2204e5b22c56ebeb3d222 legacy-trunk
+17193 648a12a780d908344abf7df94fe16cbeb9b8b602 legacy-trunk
+17194 034bf1081304750238a4656696c8a7b95fc0a61c legacy-trunk
+17195 cac939076c7dbee72201bde30c60a33087246424 legacy-trunk
+17196 cd047a858ace19bbb51d760c8e98bea84809d16e legacy-trunk
+17197 09dcff51932c77dde52bbf62a6c5d16f2949af68 legacy-trunk
+17198 64c25fd29d6f6717bdcaff710bc8c676803b747a legacy-trunk
+17199 ed147a53701b80065247814a55aac95dd69b0076 legacy-trunk
+17200 8df166ca09b25ae925b7236315a34699b908f504 legacy-trunk
+17201 6f6f965c5e2db64b947d4fcc7381e83aa0cb0756 legacy-trunk
+17202 fd479960e5e0c2c0778ec42081276b417a02b546 legacy-trunk
+17203 dd4766aa2fd2f77b76a8287782985a487a6aa959 legacy-trunk
+17204 ca7316a00464ea48f18f0ea8519dda925dcffdef legacy-trunk
+17205 b069d7d9ce8a00dfaf71240b912e3acd23ebcfcf legacy-trunk
+17206 cd0c4dd4904c963412bc2c6538573ee85f43ce8b cnri-16-start
+17207 e99b0db16dd7d3c93ca88585e26c0e690ca82825 legacy-trunk
+17208 7958a88edda177389527592a8c0bb8986fd6d639 legacy-trunk
+17209 2d6cf68aa64a55d2fa2b2f7cd3dd532f084d5033 legacy-trunk
+17210 388c721c20cfb953410e801eec16e5d53316da54 cnri-16-start
+17211 cfd074321aad9d1a52cdeae7e00edfd97f8e8511 legacy-trunk
+17212 7e47b370eb675519b87528647026616064cebd86 cnri-16-start
+17213 6fb61b83435da1b6f87d6bb0a8fc325560008139 legacy-trunk
+17214 d395cac786b224b1861e328cddaf3052e0eaccda cnri-16-start
+17215 0507e569d74ae6516ead673ddbcd254f6dc393a2 cnri-16-start
+17216 8a933ec47ef7339cdb15e12ac92ab8165163b3bd cnri-16-start
+17217 39ab28572307f8188ae552c2acd6d88ce9a8ffe5 legacy-trunk
+17218 579a1e731fc8424ee851e2da0e5d06a798a8a7df cnri-16-start
+17219 1fdca0af71d343e88e6bf50f7954421314c9bbbe legacy-trunk
+17220 afd6fae467e5925951be9999395eca7a3fd4bb0f legacy-trunk
+17221 ef2714bb0730a75256e832b70772a473b7a3abc7 legacy-trunk
+17222 9f03d2faf156ade9dc296b105f049f25d2768853 legacy-trunk
+17223 1c438fd5c0e934006eb42b9c563aa510e7a23300 cnri-16-start
+17224 44ff7e4163aa1e0cb22502bc0684b8c8eae19948 r161-branch
+17225 558ea90f5b1ca28c3f6042bc46de12b9c55817cf cnri-16-start
+17226 9b1daf3dee14d4e41cd247cc73768915a5385110 legacy-trunk
+17227 f1bd30447e30b59c08f021c59f17c68d88c6839d cnri-16-start
+17228 1fd64b3af760228bb5eb5134a624ae081d63c439 legacy-trunk
+17229 63d824679b28533bfaa10e34cf497a056d0c411d legacy-trunk
+17230 7e4f602dc68576b2e886b0f5221926d09e11733d legacy-trunk
+17231 2eeb58b43eb1883bdf44372ff4c811c7b831bbf6 legacy-trunk
+17232 05f12128c38dbe424c297b4fcaa3df87670be73f cnri-16-start
+17233 532c9ce6c87c17d9bb51b07aa0fcc4ce38090bcb legacy-trunk
+17234 a10afb3ad2750c0e2624134b1f59bc90090b7243 legacy-trunk
+17235 542d10bd04f477a4b89987fb126750fe9e4d22a0 cnri-16-start
+17236 cd6f705c54b8c453b9cd369c8f16701ab1404d09 cnri-16-start
+17237 f629af1d4bdaa82cb5fe60992b3588ee88b7ebd3 cnri-16-start
+17238 8d47101419b84cab93dc5acf2d2011132b172d1e legacy-trunk
+17239 cd2be153f228f7fce76903d1c8c9a6f6f36c0112 legacy-trunk
+17240 367ca49190bc5265e6d71effabdc795024d6e179 legacy-trunk
+17241 320158026a4bc4ee91650ed907bd40832e14f73b cnri-16-start
+17242 88853c10308797c85cac588759cf091071e5a114 legacy-trunk
+17243 6a5fbe8c5aa6a88938f8122db220784cdaa97dc3 legacy-trunk
+17244 3e37698cd737f4f7cacc44939ea0172874f87b70 legacy-trunk
+17245 8b406856bc31c12af4b780c555672772757a89b2 legacy-trunk
+17246 057bc197034526a5df10ce5f1a5ba4133e09f3d4 legacy-trunk
+17247 d689b8ce9d0a928ba65239268521b0dd3e401df1 cnri-16-start
+17248 8721915a6acb8307a5ec120a870ee228b3abcbe5 cnri-16-start
+17249 b17598ff2cdd7401d8f86651f5fe000fbbaa680d cnri-16-start
+17250 d8d1812dfce0646b2fde559bd262a91c81925a79 cnri-16-start
+17251 d8466855026f5e9bdabab7a2ba3d68cd0326bc07 cnri-16-start
+17252 6563d71e7d95ad0bf8daa16c44718f07d1348281 cnri-16-start
+17252 786a57b7dc6ccf56e630eb91a262016b9a14982f cnri-16-start
+17254 beefa85a3924c3e22a5837bd3eb6186d76ec849c legacy-trunk
+17255 fc10b227c17ddc2f918952abc8736e6042db02a5 legacy-trunk
+17256 8d035c2fc23408583509c825fe7507d892973b9f legacy-trunk
+17257 d1c395c47102a156b422b2bf5d30995592479b01 legacy-trunk
+17258 a76ab7c8fc2921bbc1ec0252acc02900893e9700 legacy-trunk
+17259 4306107b1395518d9d3297e1833abea0aefd3717 legacy-trunk
+17260 a707a5f17139324a84dc2e6e451030ecdf6cb02e legacy-trunk
+17261 b1944ce5492b2f2bc32f0fda7a9a01477289171b legacy-trunk
+17262 86266f763d4419717ed640f207d603822893e3ef legacy-trunk
+17263 90f0946f64e781e732d6f567cecbd46e635a9029 legacy-trunk
+17264 607264e7bf514340b6217911350bf0076cadd8e6 legacy-trunk
+17265 6be446ffa2d9abc913a72d3cc6b928e0ddef9560 legacy-trunk
+17266 d42fc3c7173e5c73c7b89fb2eea6091d4b760f6d legacy-trunk
+17267 10be9682b003f23c2276d1271d25b5b31c106e5d legacy-trunk
+17268 0dcae84506baa9cb7352c27764b719b769bb128d legacy-trunk
+17269 ba22a5ed46410bcd91aa0f566cca07efc6bf8b4b legacy-trunk
+17270 e36aff52fb4e0fc3608c0d592226cddcc88fba32 legacy-trunk
+17271 acd4113e301a3c7ba3d2a7a02da421246a3b32a0 legacy-trunk
+17272 24be049d20379342a5e0677c094b3b4c834a5535 cnri-16-start
+17273 f9448f44e701cad56c7cf581596f1503550c8f59 legacy-trunk
+17274 6460411f473effcfd86065c6d07c7a90630fb008 legacy-trunk
+17275 c616b79107458dfeb4fad5e8f1812a7c250c0103 cnri-16-start
+17276 c384faae5052c5f39e683baba2011dc28de867d8 cnri-16-start
+17277 f8e668447e2a1d290d571a499abc16da86d4c431 legacy-trunk
+17278 448bdf4417923fab7aacd8f5562788618334ed81 legacy-trunk
+17279 bb9083312d814c4eb4dacff17e1c3dec901079a9 legacy-trunk
+17280 ccb37e2b24603b7c222d58d069e1f79ae68fada8 legacy-trunk
+17281 9f1f0a6bc18e757f5274cc72de34afac449863b8 legacy-trunk
+17282 8376ad6645e3ddc59287b5ef1daa9554a8333095 legacy-trunk
+17282 35c4fc1414a59888614b9be784a25f233ba67984 legacy-trunk
+17284 77e8e550ae13f75e1c643702304759e94912c947 universal-33
+17285 4fe014808885a46f47b813a3527387994ab57e41 legacy-trunk
+17286 7886b3b6c40f7bd5eecae5c36cfff18e26797cf4 legacy-trunk
+17287 34379127ee3b4d91ff05e30e583f26a16468357f legacy-trunk
+17288 9fa3c571daff202e377d230bde3e820967d14142 legacy-trunk
+17289 c0509989405ec0eeba76cb7f2f159a981c277078 legacy-trunk
+17290 e348ed946d1f4c1b0bc18b85ffb9dbafa9979662 legacy-trunk
+17291 ac39178fa85fc9e4c24e1d1691619f2f863bd94e legacy-trunk
+17292 3a932cc643233fdcd8dbaa92ef60dc288346c42a legacy-trunk
+17293 19443585cccc255e87c57da7ea18d64f128d85c7 legacy-trunk
+17294 f7fd095c31a6aac99c9e283ae735ebb2fdf7f8f6 legacy-trunk
+17295 c738041f975dbe83ea64bc1e1df458a21dd4b5b3 legacy-trunk
+17296 f4c92a24211bddd030ce5435d70b171f77608749 legacy-trunk
+17297 f051ac8340f7b8a1fc07f23bda2209f914431513 legacy-trunk
+17298 93b1dab097676d92947032ac3fc05cf2e971ed09 legacy-trunk
+17299 520ce7ece253985af089e617c1430e768e576de3 legacy-trunk
+17300 5d12d9660c2ea8d3877e482d2612412cdfd74905 legacy-trunk
+17301 c9ee6f74670daf55d5eb2a6a247f71e48c6e727c legacy-trunk
+17302 3e387507a9919b0551328cf2cb732be10771b1c4 legacy-trunk
+17303 fc5b40616262373ef746bdad7ef31addbcc1380c legacy-trunk
+17304 e5cdce2a2b1649f6d62e7294597e77df5bc2a92b legacy-trunk
+17305 0d0613b95758e7bcf9d093b52e8b4fd902724326 legacy-trunk
+17306 0d1025aefebff2488c935d533297939181ea0072 legacy-trunk
+17307 015a34bfbccba0992bda7451978f14b3b7d969c0 legacy-trunk
+17308 6919d8e14a303690062893ebf7f38aef2110f890 legacy-trunk
+17309 20aceb8edfa5e6ca4fadf9c52987c4246c0ee50d legacy-trunk
+17310 0b66d0300eebe9c207b9fc8cc10315765a264068 legacy-trunk
+17311 95eeb061fc6d4d4551e78379ae82d3e010c014f5 legacy-trunk
+17312 eda26f1232274bf6bf18b04a91fc7ae185b6c364 legacy-trunk
+17313 5edd49d340ea9aa0a4dbb49b530ec406c9bc65d8 legacy-trunk
+17314 db026092cb7e49d8e765ff5c5382e788a08d2649 legacy-trunk
+17315 aa44537d80b53fedd56c2e47956c0d4e15e8b4ae legacy-trunk
+17316 ec165d03d46ca86176c0478f5fa4115cd64a3abd legacy-trunk
+17317 17cec96f75bc1d5609d22315f87a018de413283e legacy-trunk
+17318 e13df4e9076f758bc7d9043d8e8763129bd39847 legacy-trunk
+17319 0721df789270e79438da8c2ec0f9c20dfc32f095 legacy-trunk
+17320 142cb4e7310cdea4c5e081d143e6536828cc1230 legacy-trunk
+17321 0ef6ea58590b60a5a36c87098dc77ad8fac1d53b legacy-trunk
+17322 f90b823205ff1e1c68bb2e7dec298f2061b64adf legacy-trunk
+17323 39ff6b3c43afc3eb3ab4d86f6671aa479e6b86e7 legacy-trunk
+17324 c3c49859e80b08fd110de4ba2257a652649c98a5 legacy-trunk
+17325 f6b86e2dc55bbff26a8ca347512a5d4fa33074ef legacy-trunk
+17326 9537e7893f3c3d453ac52f646ed790ac6843f659 legacy-trunk
+17327 b7bb4a35c121897779a8e1d994a78bf05e838f24 legacy-trunk
+17328 e4ca8c21377a3cb73b93c25e35809d2f5a332e13 legacy-trunk
+17329 71456782d8fd5a1f30b95fd0103e2df67b115284 legacy-trunk
+17330 9998b7087ee6049ac0fec1ff7e0fb2ceccb3698f legacy-trunk
+17331 cc683a0ac568eb844705080cb1f3a3bfe2816e43 legacy-trunk
+17332 89e3b6a54fe93c6dc53828cc99b9e82c4fdd0d46 legacy-trunk
+17333 0d15c8053726b27f4f2b02fd194a131f4bb7eb73 legacy-trunk
+17334 5004349ede4df8eca411eefbc48d82df525d46f0 legacy-trunk
+17335 8a63c604ee598fb640f1ee52f95e23570a7d9d34 legacy-trunk
+17336 c32f5490f5e3ac2e829281b8e4a3d3d71d7f75de legacy-trunk
+17337 34f9a017ce632ccdc8c1728d1256846744e4d91a legacy-trunk
+17338 ac0246586d52782b5cefeb179671ed171481a628 legacy-trunk
+17339 51369a57b0aab480a079c6e8bd13e13a9275a712 legacy-trunk
+17340 8a715d2dfeb9f9a61d7ac260ac63f531c455ee7d legacy-trunk
+17341 aba7eb9d8d61454f89a5fd87e99db3361b3910f0 legacy-trunk
+17342 52a600b38f7ee5980c0ebe620f989c1ff3321c5b legacy-trunk
+17343 f78f287b3addbc887c1944b5b873e6941fe0192f legacy-trunk
+17344 334d9aebaaf10a02ed13a29b70d21165a439fa09 legacy-trunk
+17345 7728b0ea93441c5300acafee3068c68c2204eb01 legacy-trunk
+17346 2ba08d991c4330af4d7ee46810c29176e1928939 legacy-trunk
+17347 b19886bea3787fafc0d21b8d45aa2a70aea4b68f legacy-trunk
+17348 e6a9d412652d28a9ce51c54c299b5cc74dbf0b65 legacy-trunk
+17349 aed37f5aa475e7473f9e8d6adcd29fa4c08c1bd8 legacy-trunk
+17350 d327fc47f8fddfad97dd90ddd0c1b8b3a861ee81 legacy-trunk
+17351 371e88af645f1e857495fda5ee3a0305463d05ff legacy-trunk
+17352 7f23ec5cd9ca8458c96a8f1efbd3dcd6f0d380fa legacy-trunk
+17353 21d847653f54b9599032403139ba34a09337d5aa legacy-trunk
+17354 58ba90e4e985f1baa9cefaaed1dc47e9a8d3324f legacy-trunk
+17355 eef25730e64daae78212429df8837b393ed81481 legacy-trunk
+17356 15acd5c591fd4c0518df24eb9b3109e0f8deee17 legacy-trunk
+17357 deb3e9685a1eddc2e1ba9ecce5cf01f78fd442c7 legacy-trunk
+17358 3823fc722b50c5309d174d55c5b9ba1d49fd5492 legacy-trunk
+17359 28ac148d0129a7802cc758ffc18d86a3faee421f legacy-trunk
+17360 c8727aca1404c89f366bdef0df36ae48bf30d9a7 legacy-trunk
+17361 c2f7ad070b9eff3013e88fae9e36e6d75b202d0e legacy-trunk
+17362 a0392f4389605f870507b29d32da205a6d384cf0 legacy-trunk
+17363 75ed4263436629eab4970dd2b99b529dab1a98c6 legacy-trunk
+17364 29facb78d6f4167408ec6f2287797504d06f7b98 legacy-trunk
+17365 0d49dd0f1bce3135d2619b7822847053ebe8ad21 legacy-trunk
+17366 b34095e488cf1ac8818b2213cbdc29abe8942e9b legacy-trunk
+17367 3b619385a90e47c968cf02cfdc9fb7b3784ed87b legacy-trunk
+17368 1db453296c767bdacefaceff060af5de7afac56c legacy-trunk
+17369 b82802bf7fff2dfcc4a9ae7190f0a510bbd344f5 legacy-trunk
+17371 bf844ac2c81abf302325c8212b24bef033b6099e legacy-trunk
+17372 5167d23bd6b0bf01dad208e03b6942fa8f91b7b0 legacy-trunk
+17373 7435331b48ee6584051165e61074f31c78b0ac73 legacy-trunk
+17374 addaba991077d4838bbd61f646e5a806c00aa2e8 legacy-trunk
+17375 9fed4eebc5864fcd8e4eea50739eccc556fa27ea legacy-trunk
+17376 235bcd3e5f1744693f6a8d837c3fe845e45af4b6 legacy-trunk
+17377 cd3e4d73df8e4863f632c53e0c00790396c505f5 legacy-trunk
+17378 919d36fda8c8d1857118718a7665103ef333feaa legacy-trunk
+17379 fc54e397169ff6eadbcb09f654e88351d3df1f25 legacy-trunk
+17380 ff4ae691be9b50f9c2e6e12e3b4402c6da728704 legacy-trunk
+17381 86d4786734ca1dd6500e4de3940dddb010d09d47 legacy-trunk
+17382 7366bb95f212990a80ba7cf673fe4394601c2d7d legacy-trunk
+17383 be1ab187358c81f0962dbc82cab8035098370943 legacy-trunk
+17384 8d1a468f8e59154b702b9e4ccc5f3174b3ec9124 legacy-trunk
+17385 3067ae27458c240592ecc2ee5a8c62844432a49e legacy-trunk
+17386 7150979f9694156551ef8f6443ddab2f80f3e3c5 legacy-trunk
+17388 635f691233493e5b7935a942874a00cc832ef6c3 legacy-trunk
+17389 a5d65459a7b692030e5451134c06774c08dab4bf legacy-trunk
+17390 68795c13acea00116a15e116cf434cb567f31df8 legacy-trunk
+17391 4175ee80a0858c9876f07306f711c8b9dbf882f0 legacy-trunk
+17392 052b113c75d4cbe6ed960148891cdf0ddbdcb014 legacy-trunk
+17393 369ac185055d311c01da30892cdcadfa74783f89 legacy-trunk
+17394 dc3bef771d0732c691ce5da95a950e2426dcda20 legacy-trunk
+17395 35ae8dff8ed099bea9d9a5d2b072320b6aa2ca96 legacy-trunk
+17396 561c0b1d514b34f89abcb3c2ce4361cdfa6fd08e legacy-trunk
+17397 a45ca1f7f2415bb7241ed978568cadb9e4541b37 legacy-trunk
+17398 c16396511aa356aa1c9db7d88a3f9fdc45530c26 legacy-trunk
+17399 ff712de8bd81345d748c412ac2a1fde12e38748c legacy-trunk
+17400 122775ffa36c93fe02dcd54054d5ceb7a8f41fd7 legacy-trunk
+17401 efba3070cddec8af9bac8a761ab19d6e82901d13 legacy-trunk
+17402 aed1226a7fc4f34d10cc34a070ca6eda1b7899c2 legacy-trunk
+17403 e9c31374530217a668c3804d4f7c8d3100ef9ca0 legacy-trunk
+17404 d490c2a186dafcd9af38e3dd6fd032575cd3c627 legacy-trunk
+17405 7fa4302a5a0870f0463193a250abf4394c37a801 legacy-trunk
+17406 28df4f45967fb64eb92b8ccef519ef0a0139d5b0 legacy-trunk
+17407 a8d1c030b19fe680c70b67695e43613955b11cb2 legacy-trunk
+17408 b3f15611627123d909f99f52c63e77bda8ab0ef0 legacy-trunk
+17409 87745e55472714dcc288b35f7408ebf3c852c88b legacy-trunk
+17410 219e00221c8435cfb7fd48f36379707f9dcc8ede legacy-trunk
+17411 4ac09e9708282df571c05ea241c033902c77fd45 legacy-trunk
+17412 a71385f8b4dabfd81f33d1edbbe88639b89e747a legacy-trunk
+17413 5f2b9ef3f2aec1c3823a3933a04c29627944e342 legacy-trunk
+17414 28caaa3e292ffe1c3b10886e51015d9b62ca2b36 legacy-trunk
+17415 eeb8ee488106a7cb9b9ebf3f9b01c8326134102d legacy-trunk
+17416 07a2dc1b72aea2fed149ecb9c440a311a68e66d4 legacy-trunk
+17417 fe8ef41c3223f99f9b17da60d52cb6136d6deb36 legacy-trunk
+17418 03e6150fd8d524a82de5275f67cf7c43105e45bf legacy-trunk
+17419 bcf23b52b02fd9aeb0ab685d9bad147b6598b372 legacy-trunk
+17420 ac81e0cac5f6cd8b09f6a318e2c04f1661fc450f legacy-trunk
+17421 b7ed543f4c56d2a621f6ac514d78135f9ee5c497 legacy-trunk
+17422 62979c7b9a719b3124392be125806d2a2dd61b67 legacy-trunk
+17423 f444cfd4fa0754109219671e1da0c3207715ff2f legacy-trunk
+17424 55d673024e5f96b7b46691325ecc5c374a196a25 legacy-trunk
+17425 bca1d2013626b9245817bc97e4da51e931924801 legacy-trunk
+17426 600515747c51a35a24f26b9f8429dddd4a8ad188 legacy-trunk
+17427 25b7ac05689e5092ddecf06730f68be225eba6c8 legacy-trunk
+17428 857376d699bb9df429a508c77ad0aface286baaa legacy-trunk
+17429 b4a37ab329da2481b95c3c31a6d9aab0def8e19d legacy-trunk
+17430 ba5421ff02567b02e73865b64be8d4ab97dc483a legacy-trunk
+17431 8369fcd79a64bcdf48f98a6c4e861b9f24554200 legacy-trunk
+17432 1833d2bbf76a49ca10feff374ca46e253ae61fca legacy-trunk
+17433 344d22b9db32ad92b8853cf06b8c50bf31938b68 legacy-trunk
+17434 20b22fde1cb79f8f3d3bd5824ddfc74fc3a04522 legacy-trunk
+17435 5f87eec7b6b8f66d2b6a60ea8e558b2d086f10ce legacy-trunk
+17436 4d744515a73e4b2b432e265b5985f5f47c3f0b81 legacy-trunk
+17437 6435cc47fcc6ff248b19674e7560b3fa0f7e40eb legacy-trunk
+17438 213dbc880159967fc003cc1770c5dba47df97037 legacy-trunk
+17439 89ce480963f9bb40e4cedfa08ab1323550e5e1e0 legacy-trunk
+17440 d84d5759481556aa7a820d39fa90aad22cf67315 legacy-trunk
+17441 cd1b9d8d045dd94de2eb391c33232277ab365852 legacy-trunk
+17442 e8d8758adfdb638c624d233193b9f9a88ca64dcc legacy-trunk
+17443 dcbc084d046eba5d024b2435b9833445437f5092 legacy-trunk
+17444 9ab419a5e052891989a4729e467e26305f856f47 legacy-trunk
+17445 c42105bdb5fc4eb1ae460de6cfad03e723f78b6d legacy-trunk
+17446 16a9c057dc119f2c5357e2383c23ff237614554e legacy-trunk
+17447 90f0789d57b717d30d274dd9f6f4eb6a483cd610 legacy-trunk
+17448 6c317adc18a9e2badf1acb6b8d699de30390eb26 legacy-trunk
+17449 a1e2e8d55ef005007a0ffd73be434bee71307e6a legacy-trunk
+17450 2a4416ad837c4596a42f935e8f1b57c6d717b120 legacy-trunk
+17451 256d1bb63888947fc6160d62f08d454b7ca138bc legacy-trunk
+17452 f486176f56f870870aa471f9d547b3bfa05b5ea5 legacy-trunk
+17453 69f96b6cad292b4060f12c4385887c4900f1e4f9 legacy-trunk
+17454 49a041330461ce84a845e0eaa8efd4ea28b11cac legacy-trunk
+17455 014cf6d2939872daae2a810e8a02b2e1938a4fa3 legacy-trunk
+17456 8e5ca3fbcdb64632b951c2426b4afc69084bf0e6 legacy-trunk
+17457 24fbbf13daa5bd676e3f318d4ea8c733ec2f05ac legacy-trunk
+17458 80a782086a57f19b7c2e6abcaae8f8e191161432 legacy-trunk
+17459 d2609d4304efc5cacfc730d85a8cca9e0240572f legacy-trunk
+17460 8ad9bd9ca60c004aecb7ee8bab4940bfacdfed90 legacy-trunk
+17461 f2fc66a6153b4056e62d9aee5f10c89421362c0a legacy-trunk
+17462 ac583e6a3c8b51a5f20b63586b06559d42a03af2 legacy-trunk
+17463 142a90eea8f4a1892169147b13c91db1103d5112 legacy-trunk
+17464 0b6333258f547d1e900cdd27d6d9e273d9af907e legacy-trunk
+17465 13c73a219cb11d9ee37783d471550250fac2ccf4 legacy-trunk
+17466 dcb926e7296ec0ad2fc4ba03ec14576063ec9a7e legacy-trunk
+17467 1e6c044d8e5985157d6a0df6bb507753185714e5 legacy-trunk
+17468 5a512ec8a7ade28d9e9c15bc8ed5e95259955195 legacy-trunk
+17469 33e2ef339e50d1913d5f5cb4cd26332298aedcec legacy-trunk
+17470 c4d05985c6f3069c912e61f5071faf316ef0a3de legacy-trunk
+17471 284508c653c7c3e931b1be23c1c559f56232c064 legacy-trunk
+17472 9d798a763d241798d70f052d16537ce5d8891a5d legacy-trunk
+17473 cb763835b1761da7e71ef731f79ebb35454ca9a8 legacy-trunk
+17474 4f069f5dfa7b9780b0a52a66dcf66aa145e8401f legacy-trunk
+17475 4accc63d56dc5668648157428e00fd2020d5188f legacy-trunk
+17476 41afcd069a6c5184d039e90ed442348b2171a04e legacy-trunk
+17477 46f762a61b9963005213115ade555d23128b8239 legacy-trunk
+17478 aaa1dc161ce3d2f30b1c381556404dc9607e4835 legacy-trunk
+17479 961860d6bea93ba54f412e452e4061f3162d0fa1 legacy-trunk
+17480 af36ba5061f6e845388ef3259ed0ee1aa7875666 legacy-trunk
+17481 fe47d238b50de252c0d882074a67314d3d741b69 legacy-trunk
+17482 40595017a992e552e3bcae3e9a3ba3a73dc90d8e legacy-trunk
+17483 7211fbe0db9d8709b82a20fc2c899ff0febfb4b3 legacy-trunk
+17484 9d99a2df675f496ab4b076ade928173b001e2b16 legacy-trunk
+17485 789c5b6c0f09a0979c5924fe110eb07a6eb582ea legacy-trunk
+17486 3cd2174ee10d1162234534c25d46c4803a67b792 legacy-trunk
+17487 4d6a5e5fe98dc891068d4e82b4210f97988c5de4 legacy-trunk
+17488 7d0e3450ee410746a46a6827d501287ff9ce35a6 legacy-trunk
+17489 8bd5349e7aa8e04c615c373443b0267e7a609812 legacy-trunk
+17490 db9ea5b5f337e7f5f2ae26c3a6a327d058ad3554 legacy-trunk
+17491 0c303a22d9a497119114d636e146791311c95bd3 legacy-trunk
+17492 37397bd1f8a8db4b186f1015525489059498f093 legacy-trunk
+17493 2e170c2f61e138b0e7b5ae8ef2ff570511225ceb legacy-trunk
+17494 133624abc525aecdebf3eb5e0a278dd5cd7b2e95 legacy-trunk
+17495 3fefeafa3f4a0f5a2a6e6b3455908d0339707297 legacy-trunk
+17496 8a7d47d0798122b4e93a788a0d4e9a41bff9cacb legacy-trunk
+17497 08e1c3c41e607f461fea3a0019b7d29cd2192b96 legacy-trunk
+17498 b954c33f0b4b0cd7934f0a922a7f72ba75117205 legacy-trunk
+17499 6637c091ff44f362b893d1afb7f7e8dc3aef4706 legacy-trunk
+17500 2d30c35feebe5031ae87551e2e81a03990e1c31b legacy-trunk
+17501 1b806553909f5dbbf2246826b819ca9e660f9495 legacy-trunk
+17502 3b70e60299a31877506125bb69bf53adf198281d legacy-trunk
+17503 15cbe399a9c3b585c204348d2814c3890e59cae1 legacy-trunk
+17504 1ec6c63347ea3833e277a56ca2abea4b54efafa8 legacy-trunk
+17505 edda353bde12a1db6be82076f805b0b2543c9c89 legacy-trunk
+17506 7fc4569d962507052cd6b337e840f444cd0bcff7 legacy-trunk
+17507 f4f3841a26edd14bbc4693264e197f05a5e3c812 legacy-trunk
+17508 3d6fe64bcd218a0c4ce7b2eea1b6b3aa63a5d8f3 legacy-trunk
+17509 0bd746bc7627f7f407af0147bb03f2dbe56f79d2 legacy-trunk
+17510 0228914e0c5f0f710b6db2440e3f46373f60fa8f legacy-trunk
+17511 60029e3e05eea8e1fda0012976a962598be45f16 legacy-trunk
+17512 946709e82be02d7061a096c6d7ed6683038c3c41 legacy-trunk
+17513 686d3ccaeb4a7e1a03124146ddedc152c2aa768f legacy-trunk
+17514 699fbbba29a730c8a083819cff6da6bcef100571 legacy-trunk
+17515 983502b2cd43a43f8ab7daaec8738fc7047b9b96 legacy-trunk
+17516 e7f73d35ecd8c2f82f1b6492dbccdddaaf200c05 legacy-trunk
+17517 2d6188c2ea56f1baf9ea9f7a9c15d22c1df6dd92 legacy-trunk
+17518 d1ed3082581a62815f4f1f6993cc2d62053d9b80 legacy-trunk
+17519 f83840986268441f1ba9cba11141a5abf72663f4 legacy-trunk
+17520 6fcf5a70533cf0ceceb92022f6e786d638556a1a legacy-trunk
+17521 1570854911ce06e7fffe4e0eab530c8f3cd6a850 legacy-trunk
+17522 080054b123565a74b3a5f5ceed9bc99e24fd7e8a legacy-trunk
+17523 42c41dadf2936fe40c629d21a87409827f43c69d legacy-trunk
+17524 a5b40295dc19ba7e2878b3fa8d8e82e2c69e1e5c legacy-trunk
+17525 8db8606d84eaa0a56c213de55f691ebeeeff8eed legacy-trunk
+17526 0c6b9de19100f493722170bbcd787db063e23388 legacy-trunk
+17527 1b20ad6eb501940d731c8658df23364a5b16694b legacy-trunk
+17528 df8d575d967d88d05811bd6ed460bbfa671d81d9 legacy-trunk
+17529 756c8c6535fe2ddec2f0edcf8a24d49a0839cfca legacy-trunk
+17530 22011d976917384f6898f109b9bc806157116c1d legacy-trunk
+17531 3c58716fafde8b3f73f6a8ae7d6f818f61403c19 legacy-trunk
+17532 a7813ad73a4edeed032cb5f9a3301dc191de313a legacy-trunk
+17533 94ca87a3e5eee28c580fa7dec964c5c00b5c0e6f legacy-trunk
+17534 08823099ae626e1122b4b9462e3e98f62d1bb1f1 legacy-trunk
+17535 e2d62d747f7a82c183ce7f04c50f9a9d8fc83287 legacy-trunk
+17536 e432a185f4db8331b31eda6c0ef863b31e775f33 legacy-trunk
+17537 295126433856cd333a23a02c1bb8f8a1b57e6632 legacy-trunk
+17538 edf1e15c671a084e538e11badae861fe09abc8f7 legacy-trunk
+17539 c52ff02bbd704fe47c9cf52b6454ff9d43556a9b legacy-trunk
+17540 faf3e734254dd6f611afcbb804c6f8e5a1eaab24 legacy-trunk
+17541 e384f50149c94044508ae9357f0f709f2eade109 legacy-trunk
+17542 e86fa7e850f1420bcb5448b92f1fa8f1f4736a99 legacy-trunk
+17543 d6ffb6d7fe8ad365fc1c55d994711a07932c0029 legacy-trunk
+17544 cec003ba3c7b979c7403bf1b88de197629782262 legacy-trunk
+17545 67a4913c077fefc912ef7b31dcafd2ec37ce1ccb legacy-trunk
+17546 bab4fa6c3c241b6a9da4a3d6c2610d9fd70f9618 legacy-trunk
+17547 c6f43c6036ba105137bb712d451722dea6df1f28 legacy-trunk
+17548 34110538b11844855d8c12a148f572f806a05292 legacy-trunk
+17549 2b9b159659515f889ea546a16bcbb973e0c049a5 legacy-trunk
+17550 ef37078d272d642c11054ed5cddd0c2f1b48edb8 legacy-trunk
+17551 85038a024b191a8881adc6fddd3496592ba3039e legacy-trunk
+17552 9e3dc7c47afa29f10759fa31a9189547e3133a8f legacy-trunk
+17553 407ce1c99e98e32915666d41e5110688d7dc665b legacy-trunk
+17554 fa82820bd3ff3dd3c27a77ece699dbaa00868e54 legacy-trunk
+17555 95fe083c78ee5e0b4832d444b1027dda0fbfd533 legacy-trunk
+17556 581d1e77e35e75ded337bf668567200120b779db legacy-trunk
+17557 91dde7bffe7d9e3c209aa565c4d2fb14565c2119 legacy-trunk
+17558 43936a25eaf10034892624c64e7dd4b5a8596c0d legacy-trunk
+17559 04c398e748789c7c4014f2db426dd443f6eac889 legacy-trunk
+17560 4712f5b8f279af2a87f951108e47bc8e50145530 legacy-trunk
+17561 fef9b89ad1622ae97ac61f51518e341f1a4df110 legacy-trunk
+17562 2fcb990b965f86f5f2aa52b4753a1525ee5f5b49 legacy-trunk
+17563 89b2aee43e0bd527df2e6ba79fb46e05027368ca legacy-trunk
+17564 e024438522dd70bb37caedf564b94f6b8b84c16d legacy-trunk
+17565 ac6df0494c5826bbbf83aad02df1709aa543bba6 legacy-trunk
+17566 19223bbf1aa19e550ae5a2e2ba032367b5e6a2df legacy-trunk
+17567 a6970449df425a5f4dc53c758b1009a965ee9e76 legacy-trunk
+17568 58b832b8745ee2ee63eb6e7881eedd8f798ffb23 legacy-trunk
+17569 2ec59a11d3c61e316af225f63fa04c95505a4ddd legacy-trunk
+17570 830e8ece65639b53bde56ad505f940efdad0ee35 legacy-trunk
+17571 5ae1d8a9f1dd8effb73e4627a68639f187f3bf40 legacy-trunk
+17572 c3a27b6ebe1bcb1fe025b01ec299b5e2af95cba7 legacy-trunk
+17573 69ca46af436a6c23b4e4bf41ba7c3d3ed52c9bc8 legacy-trunk
+17574 870237089ba28e76350756762e29c2e8b2d1008f legacy-trunk
+17575 d8b79e39c47e1442ff099a1316bbf22099bae813 legacy-trunk
+17576 7f49c5864f7741b50f67d699a42d3879f24e9f46 legacy-trunk
+17577 4d2e9cf1eb20b6bdba20dafa01ff1bce19d8cd64 legacy-trunk
+17578 c04aac18656ab2983a18ba9ae340d4614677456b legacy-trunk
+17579 a6f8013bbc3d16f0a594ea3c73d2ba83a4f918ed legacy-trunk
+17580 06bb5d5d89927d5651cf019790059f54350d8313 legacy-trunk
+17581 176660ff0c959669489088c42445133729765d56 legacy-trunk
+17582 bf46f185c5e4c0c1626fdac472c453ad33c94c99 legacy-trunk
+17583 e2c03c30b06ddfc6feacc83dbf7a119ab283a8dc legacy-trunk
+17584 8749cc8479702265a12010496ee9d61f2d545414 legacy-trunk
+17585 ffc300e9d867bd1d98407fd0718891a63a71f1c7 legacy-trunk
+17586 f1abe03b2f168467298db0d35f837197bf02ae55 legacy-trunk
+17587 336a6179e059724def802d57aca3d8e7a06e8187 legacy-trunk
+17588 814f421e03267316d7b7da4278b302d828ad8188 legacy-trunk
+17589 8aa112f9e130c32d17fb8918488889a0c9760989 legacy-trunk
+17590 d46a0436d6e19817f3fe06f3a07ddfd7cd8a98bc legacy-trunk
+17591 2b9a890162b0538e4742d3b4e0472e64c2aefd99 legacy-trunk
+17592 7ed080b8cdaca779a8f7dcafdc72cfc6fe6dc8fd legacy-trunk
+17593 2214062695e799e696365ce3bcba9900d53d5618 legacy-trunk
+17594 570437341a09d07ffb62d6eacd0ef77a685f2433 legacy-trunk
+17595 8bb6dca66ecdc48a7e5a4b9ffb6f474b01f58e11 legacy-trunk
+17596 c1de2c3e45ca6467a23c9e278593c88bdc19c233 legacy-trunk
+17597 d732a3a1398eb08fba9c77da6a3f56643c373ba9 legacy-trunk
+17598 8db096b782f9733d2bdeeeea189d066b00bab467 legacy-trunk
+17599 4f95cf1b2664f7c72b91a4f6b4334f03f34493e6 legacy-trunk
+17600 70942767dc810c8be53f05fe74395d7eee79b034 legacy-trunk
+17601 029ff46c798c7c1165b3ec4f02854346d30df2f3 legacy-trunk
+17602 e154e79f4d22bf96bd143547fec998607c6db75e legacy-trunk
+17603 9f8b213b84157712e16853153cf9c9f6e7035f62 legacy-trunk
+17604 6f3fd7a2a7bcb383bba263b329ea2d0ada984add legacy-trunk
+17605 00e8172ac0cb954b54856b84b72ba37d9f15584a legacy-trunk
+17606 f8984f03de20253191f5a49032bea3f6d3f6d94a legacy-trunk
+17607 46a6990769d170ab56606f6003bdc229acc1f51b legacy-trunk
+17608 9ffcf749c15a9fbbc658815caebdeeaee6a35eac legacy-trunk
+17609 2f77cb8547a1c0142f4a1e6ee0f433f5ee108b61 legacy-trunk
+17610 93207076d61218d0ce9d9f6b0f47410cb554dfa8 legacy-trunk
+17611 6e9331e68a3bd78e9f845e52ac543e2b4c57b7be legacy-trunk
+17612 b4ea57870f2aac59d20cfd033893a67965bfd509 legacy-trunk
+17613 a86568f54375ddc482505af74317ce0ff3a529af legacy-trunk
+17614 5a9dffff0da2b46d03012920cd34199126b1573b legacy-trunk
+17615 b5451a6872a298a1740c4c62ec1093c990953750 legacy-trunk
+17616 c566ac9c52d792eccd5b0f8078b7f415bdc25014 legacy-trunk
+17617 5f638a299888c704d7e42dee58d8877c9d636ab9 legacy-trunk
+17618 d270584049810636374a61a70e9d583394050456 legacy-trunk
+17619 828ef7ecd1f76cd833ac8eeef913099ec1966551 legacy-trunk
+17620 9fe5c82c4c8a0b8c4ae47b6c7a43d1717b1fd784 legacy-trunk
+17621 72860ef0317148671fae70a2febfacf61aec4f0d legacy-trunk
+17622 60ce37f066d8cea1082ec6e6d2daec3585a648fb legacy-trunk
+17623 92aee31d76138ba74dd8828a22b22d330bd8ee0f legacy-trunk
+17624 aa18e5239b469c3bf201ae5b17ca81a7bc44fe40 legacy-trunk
+17625 3ffacf1dc8f05f6e9f90d2d076549d17c535b46c legacy-trunk
+17626 133007646fb4770f724c8abd05c18adf7cc4c15b legacy-trunk
+17627 64863c56ce8e3e90924522cded1a85cf284e9d64 legacy-trunk
+17628 c5ec0b11f8c95838fff1d635f5e168b6432b51e0 legacy-trunk
+17629 52174b002f1ff37f30ad5510cbfac91257b388f6 legacy-trunk
+17630 7456c97c99efa068646d8bdb781474aae673516c legacy-trunk
+17631 1798770ca36b20ac79ec8e0ee73eb8d2cddebf0a legacy-trunk
+17632 6b772c527ca74cfe70b961c855aae2ad60dd92f0 legacy-trunk
+17633 8fae3f91161f8eb4db2d5448e88022964f7ed869 legacy-trunk
+17634 7ba493bc24a0c0f81f469ffa2a9d64209dd4af2c legacy-trunk
+17635 064e434e744f17243f0f2713670662cd733caf4f legacy-trunk
+17636 081671cef7c1b6dfd18762df6fca33c473245fb9 legacy-trunk
+17637 3c01f921c453ec368464703395d538b15d8f0b17 legacy-trunk
+17638 77eddddbb7ccf941876887823f5bb077bf63c41a legacy-trunk
+17639 0985ddfd442be9b088260813c77d180b7718e24a legacy-trunk
+17640 d0b777ec9e027adc1bff5e24433051b69d957cdb legacy-trunk
+17641 ad0d932cce32d763e7dd9814398f147fac4bb21e legacy-trunk
+17642 1edb6b6e3b5b5942376e881f483fbfdd7617cc9e legacy-trunk
+17643 179e098238e809639beec703486ffe2113856adf legacy-trunk
+17644 be2df9935edd8fa1bb109dc68a4a1fe84da8c614 legacy-trunk
+17645 43293cf753c15c01bf59adb759137898850ba0d5 legacy-trunk
+17646 ff88c64cff2e5195a21cd8e1c40fca3c2949874a legacy-trunk
+17647 afbadac60ff74c8f01411ef93cd157163f6c922c legacy-trunk
+17648 ffd3e9da89b0eb8f44318e3164c5fc4e1d0e076f legacy-trunk
+17649 c3602ae4989069d3a56c66c3db7cc1bf1ce78de4 legacy-trunk
+17650 7c574bfa6e138cf3d2d6a60e831616b5180ae50b legacy-trunk
+17651 d6828dd9a92705951383ec943d4c2c90bf56c816 legacy-trunk
+17652 a90dac4bf88a24a100b06c7dd51bc43b3708a583 legacy-trunk
+17653 3e3c2efc79c73c01c9cefc72d623e9b39a25ea68 legacy-trunk
+17654 cf9d8bf56d145075d941192ab6329e818206f31a legacy-trunk
+17655 fca5f8f1a8f471e8d47cda920feee09315fc9a0a legacy-trunk
+17656 2574295545ff7c160d9ca3f6d84a5367afcd838c legacy-trunk
+17657 1d78033a53d772a27680e3c10ed2a48419c29012 legacy-trunk
+17658 29902f7748fa678e9bf4abd7f55d30a68f8d5e92 legacy-trunk
+17659 7da36f6fd544ba77f251dea09a2773d810bcb6b6 legacy-trunk
+17660 69873a30b7c9973840156dd5541292cef06ed9de legacy-trunk
+17661 7461edcd249d451284574777da267080b54b099d legacy-trunk
+17662 6db6952d887ac9b577fc3cad303a4378769246f0 legacy-trunk
+17663 03eea7ea7e5cbdb2d2ad815d120ed4caf878adc2 legacy-trunk
+17664 4d10a13568aa3d9511a6a242f1ebe843bd373e08 legacy-trunk
+17665 523a12ed31f0de3c1791d7444fbbf9d8ce70fa4d legacy-trunk
+17666 f5653aae1cbd7cc7205651fe004288174f90df84 legacy-trunk
+17667 d543daa15d715886d6b6682ca79ac9848ccc19ea legacy-trunk
+17668 b7fb1216f6b6222273eb31dd1b797ba4a1e66da0 legacy-trunk
+17669 b56a88277e8cef59ec19b499137385167090ab6e legacy-trunk
+17670 4ff84e734588facd181ebc1dc196f3a81c82dc16 legacy-trunk
+17671 b413e87eeed4237390ab2a35ec1865029fd21184 legacy-trunk
+17672 0dd204d936e1635226684a79e5291ef14d72ff00 legacy-trunk
+17673 c95c676b184070045bea1210a90fb3979f96a8a1 legacy-trunk
+17674 182d824f2b473be083996ed7662070526360b326 legacy-trunk
+17675 07963421fafcc9fe54485012e1aab23ded44f468 legacy-trunk
+17676 c53695f3d840d14ac380eac9ea60bf12415ecb69 legacy-trunk
+17677 3e393f9b12939268207e39b30a365e93d19cd04c legacy-trunk
+17678 4944e3859a8609ed3607d537566ac9c90a35f3a8 legacy-trunk
+17679 a1033283a25dc60bdf55b1fca0773dce0773ce2d legacy-trunk
+17680 9fd030af2fe039ace4b8b44b5138a4e40a0aaca1 legacy-trunk
+17681 92dcea0859305876ff16c0ee28c9f1203408180c legacy-trunk
+17682 b1a0fb554456cae0a26736235871b90c40052617 legacy-trunk
+17683 9f96c92f03e3be6c3b1687afb721e2679ca25fcd legacy-trunk
+17684 b1f220f636edd1e8cc01ca2877d4dfe0e1dc5266 legacy-trunk
+17685 07288d2db5964246aca396b74f56c7ebce31b1b7 legacy-trunk
+17686 1a1b795f0c9b9edd0d8421e69e55f7eabec562eb legacy-trunk
+17687 54adb7b4f8c84de8dc7bb53bd864e7d93a0b52db legacy-trunk
+17688 ee813e843f3e570e36c7e97440d0282b6f90726b legacy-trunk
+17689 1d627242e29a2cfb6acdcde86d814a93c2a1af89 legacy-trunk
+17690 96d31a143857cf8b5f35494b7832ac3c306d55a0 legacy-trunk
+17691 67e0ff4aa7b977f1ab565a1f5c03d63d309badfd legacy-trunk
+17692 b7787a9052e3d081d00f698f18743695c185ec77 legacy-trunk
+17693 76aad5b06543afc7444cb7a796bcb769c1e63780 legacy-trunk
+17694 3b0ca0cc3750e2233a1bc840e92289cc3528d8b1 legacy-trunk
+17695 625a9a695469b5cc4be3c954bb7ddc55470dcdf2 legacy-trunk
+17696 68189285658f22880ff51dac99d6757d15d4d90e legacy-trunk
+17697 460ab19a3289bb9f73afcc101e5a2aff1d774098 legacy-trunk
+17698 94c246e6399d2201a38d1f691b178485d8e3a0ed legacy-trunk
+17699 e7d6789908d70934b3c92daa1a1a6d100e9143fa legacy-trunk
+17700 88d3a8974409ee72c629257ed78885d6cbf4afde legacy-trunk
+17701 45ec5df9a62d31ead5529f2c7a3d6b84b05b415e legacy-trunk
+17702 f6e501fc32c771dfef54e1195e1b596f7dde9572 legacy-trunk
+17703 e52c24319aef518b430e777044599b12a774bc51 legacy-trunk
+17704 92cdbc0f55d5032f64f7add0d276006ae9ceef62 legacy-trunk
+17705 c8ca93107f2edc4ff8986968375265950e9b1763 legacy-trunk
+17706 5449302c4d2e148d47ed19ef03630f4c1fd81ce4 legacy-trunk
+17707 463faf01685e71271832571be5de3377ceb410ae legacy-trunk
+17708 1293492dfe603ea4ab77a928e35fa3567f68bf80 legacy-trunk
+17709 89bc8475fc84e170d6604f86f5d15beacbed31da legacy-trunk
+17710 ae12b8c3c3b33ab6f058a7e42ca81148b39a937b legacy-trunk
+17711 83aff1ea5b70de6524fda1171c8eaba37e91e0a1 legacy-trunk
+17712 6eda6a1a693c54725e5171cba86d8761ba607c09 legacy-trunk
+17713 166119ec31955b59e57fe3cb3974b1282cafc121 legacy-trunk
+17714 e97660d1f1aaeb12e3cf0a568ec99c1264375c09 legacy-trunk
+17715 18b3def6c4b82762c36018f69f74052374415d3b legacy-trunk
+17716 09c14ae5c2f543578b8cc1965ebd5a75707f4c94 legacy-trunk
+17717 5b8cda6f3b5f69ec247305a04e90d3fa035be648 legacy-trunk
+17718 c3f0d6f19f7bffc3dd6340fd9799921fa12a05be legacy-trunk
+17719 56fda4e9ece9f7c22888104ee2c391c058d7c5cd legacy-trunk
+17720 5baf7f74396f1dafc2f8afa6e1096a6efcfbb50b legacy-trunk
+17721 4c089ad29eeac45a4a9dd6acd95bb1d806da5f18 legacy-trunk
+17722 c892e6aa99976c830193f40c4a47ac9678111ab1 legacy-trunk
+17724 b68006a5647116b01c426114928778c13043349b legacy-trunk
+17725 25ddd3dc7a7a2e4d57c32c40e9b0b144b49a7bc9 legacy-trunk
+17726 e35a3a772dca9efb256865c2f06cd71b0411d4cf legacy-trunk
+17727 fb6b51033c3b60e1176e158d73b0e4af1cf67143 legacy-trunk
+17728 ac14b86f0f8b8f80eea52da0850c596b43c6f4db legacy-trunk
+17729 a93b2f176a5e2f15ec901e4ed1eccb41df9cd8a4 legacy-trunk
+17730 6431cf5c8a004c66651c4f479061208a553df369 legacy-trunk
+17731 17b5c43c08a6c4d8aef0c6d61f976fb23de677e2 legacy-trunk
+17732 73fde44563d1ef928d1ef1a2c60b8d659095ed8f legacy-trunk
+17733 7986a4553930b26301e70c0dc48c3a8fba562e67 legacy-trunk
+17734 68e23f1ff5db7a288c3d6fed6d9a9bca91889233 legacy-trunk
+17735 2809662ae9ce18384e7cac6b7cd7d58e79281ab0 legacy-trunk
+17736 3a59a0733df8c16fa3e16c99e0ac4efa04da6a8c legacy-trunk
+17737 5d089095f40f5ce65db0cd467e771d1e8e87a238 legacy-trunk
+17738 528b52bd4bc32ed23ebef3770bf6b8d44eca01fe legacy-trunk
+17739 d6bdcb0899dda90df3119c6b2f62fb69ca5f3e38 legacy-trunk
+17740 968ae55fe6eeab28d0fc882d1a70cffe60cd8bce legacy-trunk
+17740 55bba197d4870cdae62aeca00e20240a756b84f8 legacy-trunk
+17742 f657930fd274c3b81f2da5408c050522bfe972d1 legacy-trunk
+17743 4fdf6600d8aa7010c29fe245665cfd43430e7b4a legacy-trunk
+17745 653749003db9763902cc8221c3685672bcf76703 legacy-trunk
+17746 c7f55551fe31bccc0b1ba387daf3e9eb01839964 legacy-trunk
+17747 afd7ece37c4695ee69f59cbe620797a9c835941d legacy-trunk
+17748 e4641d193220f386c0d97a7385674d88d177e8d3 legacy-trunk
+17749 1967be1359ee598ba938d11b8f1e65ca536187d4 legacy-trunk
+17750 834062f695e0f21c74b9017ea9266004a77583b8 legacy-trunk
+17751 de1892eaccffacabeec0889059fe8891f71b6f17 legacy-trunk
+17752 420d3c57efec73874eda7b2df0195ab5660094c5 legacy-trunk
+17753 ad98c136475e7b23732b9bd887edce9173d58036 legacy-trunk
+17754 4111cf22a0ad941ca2e4528d9ef9504344fc8043 legacy-trunk
+17755 4bea4f59c4e43c9c5c4a62653b8fe40dff7ead8e legacy-trunk
+17756 606a80834a862238c7ca97ce5a5bb44a9363bf3e legacy-trunk
+17757 f932c128279bcf3fc47776f708cdd47ddf4d92bf legacy-trunk
+17758 291abebea55b2ed7c408e1a09d57642969dbf090 legacy-trunk
+17759 ec756d58e8a70efa775db4f535ea276027481eaa legacy-trunk
+17760 f4a1d3f8f262897703b05f0e5fc77b8dc6903ea7 legacy-trunk
+17761 b15fce868e50b77a069947ef612fb8b9e55cd270 legacy-trunk
+17762 45967ff1b6dc18e5710d0601f54f6dfc78e7e1d3 legacy-trunk
+17763 a0a13f10ce4bf5cecc25dcc0c026a350c8633004 legacy-trunk
+17764 d01394b0aa69880a4b5d59a9bd8daa4cc03a1810 legacy-trunk
+17765 8f59bd95795257768e9cef2627037fa6f7a6ee9e legacy-trunk
+17766 1018727f323176cafd0e2ec91a9a3d213fe65862 legacy-trunk
+17767 6fb2af766892eb87bbb3d6c42c0e2021ca2e0fd4 legacy-trunk
+17768 af8d77aa90f885870b7f4ee932ce59e8748652e8 legacy-trunk
+17769 2cdf7ac9162d93504de2ede64a7f5e8f42ca4612 legacy-trunk
+17770 a062749b80f8c503ee4cdee7ef2822180cb9098a legacy-trunk
+17771 79cdeeeefafa5755e9310bc986f0c5e8a2445801 legacy-trunk
+17772 ea2ba910e5f05fe6caccbc0661b241b0a8cea3e2 legacy-trunk
+17773 aad2b5a3f7bf4c37aa217e25de4b76b244028559 legacy-trunk
+17774 cefb1910ad0d7b84dfb3fd97cad74af85279d82d legacy-trunk
+17775 914ae7f9c64cf7f00614b39c71aec04db6714d8a legacy-trunk
+17776 95b20019b711454c4757c7cd65bd57171d32180f legacy-trunk
+17777 fad8247ef0a52da734c7288f5eb901e49f2dc5c3 legacy-trunk
+17778 3db8b8031a6a47441840598497bdc6c9b6df7b6d legacy-trunk
+17779 9a8700fdc52be8060f37df97bd7643b09eb9fcda legacy-trunk
+17780 75f3d5e7b89ca2e185ac03019f294509d336f6f5 legacy-trunk
+17781 153541f824a36396792576f1e0c66266f8d1e2c9 legacy-trunk
+17782 b4f74482f9afe107803067a7dd06209fde3cebeb legacy-trunk
+17783 76c1e40c5c5de9061e460a6b8adceff9edb2f999 legacy-trunk
+17784 c8f22f15499f8b17de641619820e10292c29810d legacy-trunk
+17785 2ea297869b0271e0eb51928e427529e3006f97cf legacy-trunk
+17786 af1de4f505089b346cd47fc85a133ecb6e465ba1 legacy-trunk
+17787 5610ecd07dc036e4aa21b61ecacefdca15cee0b6 legacy-trunk
+17788 0c93d2e27ac07c13038dcc7a17817e403c01e2aa legacy-trunk
+17789 827e9d21a78164defb3c8a5ef7268419baec8ddf legacy-trunk
+17790 715a3e924737182806a9b50721833cea35e0b16a legacy-trunk
+17791 3da99f0c184f26ba4cbe9ff488499d29238a6516 legacy-trunk
+17792 13488539f02bfe28bbaaf1b3f47f90afc66e5c59 legacy-trunk
+17793 011df2647f413d2d15dd84d773cb804920f5940c legacy-trunk
+17794 fd7f879aff81c5abcd3d5abbc92bfe1144a118e4 legacy-trunk
+17795 c12875defc0e4e39607f304e8b195a57bbe95a00 legacy-trunk
+17796 1629ef738b2f0967fb33904499508a68ddf3ce5f legacy-trunk
+17797 9cea4db41d9fafeed4fc43f6c648e70dbb9512f1 legacy-trunk
+17798 f9cf611096bf502f8fd79b25955e8600c3356fb9 legacy-trunk
+17799 e15e97a6c14a83465183f7c9d4cc1447b026ebdd legacy-trunk
+17800 19919e146ff8f31b5e3fbca9cb7b6aeddfe2016d legacy-trunk
+17801 7592f7219b7c6ca1d113575f291a892cfcb3f5af legacy-trunk
+17802 a59600a975d12470d2ed86fc44524e59468bdf7a legacy-trunk
+17803 9e445ddca2d74a00182ea925961c0bec5cdfae95 legacy-trunk
+17804 73cea59657babc7e63d6cfb6e3db9f2533879377 legacy-trunk
+17805 7acb8bbc215bb72a33088632bfd993e6a820d0c5 legacy-trunk
+17806 14b647d550d37931a921085c46393603252ca8eb legacy-trunk
+17807 f8b526fc39f67fd2641918243e9eae9781a65baa legacy-trunk
+17808 005a0b4c382d35f45dd6b2c12357b1c74427f677 legacy-trunk
+17809 6e70524737786b35e2629ae33a853a232798352d legacy-trunk
+17810 d9e66a83e43384a6341e761a065db120db2f7aad legacy-trunk
+17811 342497ad8fec97632d40e2964dab53852ab0de18 legacy-trunk
+17812 1f9d23777fd017449eb289196dc54ac91aa1790a legacy-trunk
+17813 c78e76a571b65db9392b2012b02bef3b71596a39 legacy-trunk
+17814 db1cce1ffb6082681153b626326d48b9989f8be9 legacy-trunk
+17815 50386c73ba225d2985fd265064594ba9e49dd8f2 legacy-trunk
+17816 b031abca3e91abe05d3e060b9d528a0d4a84186f legacy-trunk
+17817 569214a4182c93e4f3c2671b39b5afba75bfe1bd legacy-trunk
+17818 ebaeb19e03809b8861cbd2cf1b1dee1a440de64c legacy-trunk
+17819 9c3aefa5cd7f5932ad34f780638ca22dec22d6fa legacy-trunk
+17820 73d09322f2c36007547f1560ca933784149d4471 legacy-trunk
+17821 54ec5ec32352f0ea87b3e48aaa8b49014d225e10 legacy-trunk
+17822 1aa37008fd2c825e10ab7842522d0302b14e4b53 legacy-trunk
+17823 9314cc79d6e12e7c1dafdea65441a12c69c56c28 legacy-trunk
+17824 314eb8f7ae13529a578d6cbce812089847e72b32 legacy-trunk
+17825 5336946b6495a1640ebb2d0b796d48ac4d786932 legacy-trunk
+17826 b411238de9d10f12a182be5d3b5af7b2f68f4af4 legacy-trunk
+17827 6af9aa15647f98f7874719f8b0e89a4b46c438a1 legacy-trunk
+17828 32d263d447b7e13a76b5bba2080326377f01e793 legacy-trunk
+17829 3eecda2ba93a384666202765a04af0f79e174674 legacy-trunk
+17830 48b45a2812770016184ddf4eef50e6f407955148 legacy-trunk
+17831 c7907379a6bd22853d06744fdd9fd1c8e41d126e legacy-trunk
+17832 27eab80327662a7ee55dff3b112df986b7755706 legacy-trunk
+17833 839ba35b0aa3144285e4192025c6a01178dc10d9 legacy-trunk
+17834 b012aebbbe5178fa0d91ecb150de4c3fcd8abb87 legacy-trunk
+17835 174d34eac5163b9c94c12277ee3ed401c9a2f7bb legacy-trunk
+17836 e79d07c24571e38e2199c7e9bf2b64029cd07d0a legacy-trunk
+17837 26d2e4f58adca970bddf9984423cd3f48da550bb legacy-trunk
+17838 82123ce02684fe2501fdba25b31076749bb7aa93 legacy-trunk
+17839 0fa58fea30cf216c237f2ef2ece8ae91db20a752 legacy-trunk
+17840 b61cd1a489603bc479f6db2e76ced3fb65ac44ed legacy-trunk
+17841 ece6c19edcc155b4ff7c4bfe65e742db580b9cfb legacy-trunk
+17842 3fc6c5addf1ec1ac2563f0bfc59447867e467423 legacy-trunk
+17844 a9d24a53c55334da22aabcb067e172a5737b98d6 legacy-trunk
+17845 bbe09cccb49be0704f080061ef4a3b899ca03da3 legacy-trunk
+17846 e85754fa69174fa72ec614b172acba09c52f01c9 legacy-trunk
+17847 2b4236580e0c4fba0e6f6f883eb1af1c958bc09f legacy-trunk
+17848 bb6cca57eb8b0c94b16699d8cbe49e46f529c3fe legacy-trunk
+17849 5d41ca49a10adc2e8cb2e968ff12494d9db67bd8 legacy-trunk
+17850 4c4934ca8579620e21b8327c0fc33272ccd47a5b legacy-trunk
+17851 fa5c482367c7af5038debeff6e7c847d3f7932f6 legacy-trunk
+17852 7f4e28045dfb458412462581e748dc69bb95d379 legacy-trunk
+17853 eec2eb121dae0cc1d0c81f46939c5f39064a7d66 legacy-trunk
+17854 5e4eed062b54a9e6f238001c2702d66a2f99526d legacy-trunk
+17855 0c5b02cc5489392a2cfcbf90b279a5ad044a03fd legacy-trunk
+17856 c16bdf555c797811088796c221df71c0be29f72c legacy-trunk
+17857 1a3b5c8d6730d97973d902c802d093edc6ef6b5f legacy-trunk
+17858 0a97f5dde3a78dc7c3739bf82c3884932498cc94 legacy-trunk
+17859 a349b89bf10ee5d51d7b2b24477ba3038aab197b legacy-trunk
+17860 9d5142c8cf2dddd9738bd4f45568f73fbcc579dd legacy-trunk
+17861 0032dffeb163b4fad825a82143923ac41600038f legacy-trunk
+17862 ddb20190591dbbf16f523ef05f8e6e875ff91378 legacy-trunk
+17863 0cf5111bf09cb1bf17050efef229aee18d8c0bf0 legacy-trunk
+17864 8b6fe6b997c2db7b4a3912cfff875346fd331a70 legacy-trunk
+17865 cb4b2a16eb871255988ef1630dfec7eaa3ddff68 legacy-trunk
+17866 aa052a52ef8712f085f6ef55dff85f5cea1a8437 legacy-trunk
+17867 9847b486d15fba809f47f3040faa868b3a530c9f legacy-trunk
+17868 c5cf6fba54ddb8b736627230f0f33f1e6caedfd3 legacy-trunk
+17869 db3a9578ab0befcebc39b474ec7d2e70f23ede11 legacy-trunk
+17870 6c51b5af1bde1309620eeca963dbbc16c05ea8e4 legacy-trunk
+17871 25bc16952a24e5477b9b84452c0b7288e8f2e03b legacy-trunk
+17872 b0d1dec2353a411aecd9cb333498ed9850ab3ac2 legacy-trunk
+17873 da3e8c5064caf3bd22b1d13dcfcfa7e8895200a1 legacy-trunk
+17874 fb7ac8a40a97c24e0da3c27a5c5461eff7e8aa79 legacy-trunk
+17875 c285df15a0503830159dfe4b70e92c3458fbeb3b legacy-trunk
+17876 98b1fa6c16000e7a4f354813cc77c9188ac9838e legacy-trunk
+17877 a6d35cc4bf5ee5d832174bb06ad4eea2646dd409 legacy-trunk
+17878 405ad0a7f7a61099e7bbd8c5787d6acdbf0295a6 legacy-trunk
+17879 f12d35f9948855fc34c96597d4ba34bf26924c21 legacy-trunk
+17880 37b1caeed70557a5906332f62f1f6ed45982e30b legacy-trunk
+17881 db9135f380689a23ea002423f3e51efe3bec1c02 legacy-trunk
+17882 0bb348986d5281b2e3d9669ce750be2cefc59b96 legacy-trunk
+17883 29c2d5e521612b8123b6c94f218c8c3954a675c5 legacy-trunk
+17884 b368e06a3b6275e914656922a36757c65ce60478 legacy-trunk
+17885 5ffa515e620e4d7644857342456e86eb5d42d685 legacy-trunk
+17886 25f1092ecd86d5480f289248eb2439caedee04c6 legacy-trunk
+17887 52eb499f25b09fd57be5087c329de76e082346f5 legacy-trunk
+17888 7a5c3859a361398fa162cfaf130ef0216e490218 legacy-trunk
+17889 9bc52706d2834f7a8c53869e328a9d4e57818961 legacy-trunk
+17890 ce5dff30a935d19f18edeb42e4c197bc39cb72fb legacy-trunk
+17891 6c91a041c1d2b2c95fe6efedbf06079d42f75663 legacy-trunk
+17892 94c031d7e9c2e8289e4a1bf3341667a93e2ba629 legacy-trunk
+17893 894dca225d24aec2859cae9d25fa3bba2b566a44 legacy-trunk
+17894 6e9ff060a7288299f997e17243bcd23edbf9cac4 legacy-trunk
+17895 c7d46eae95d898d88048a14dfdee0dc800ec9b21 legacy-trunk
+17896 e9713cbe2ba8d307d4971ff79c0679ee4ec2c38a legacy-trunk
+17897 921c7459771b412eca24efa81c3000f56a84fdcf legacy-trunk
+17898 d106dfdff480aebf1a359c69a3b9b72df224d4d8 legacy-trunk
+17899 7eefde90ec0ee4b4ce1f4908438152ec828e8031 legacy-trunk
+17900 293caf0e632a17448b26c13b5a1c17aa9f77d18a legacy-trunk
+17901 c0c254fbde576bc019ddc8c1515a352482be44fe legacy-trunk
+17902 dae7cef58ac26addc213051085d6acfbd800ef56 legacy-trunk
+17903 c90c3aabd8f5036a5f8187e172051ed48f43627b legacy-trunk
+17904 c654b20184039c88c5e70700ea3f26b8626806e9 legacy-trunk
+17905 457f0df46dd98055eb8ead001e7af60ec3d6f854 legacy-trunk
+17906 1dd72a92e922c35ad3dc5cfaa2fcee1aadc9986c legacy-trunk
+17907 43c49dbd4546e8ecad1490c1d222832f3ad9581d legacy-trunk
+17908 78bcae77e8c703e866baa934bdd88fe2546aa7d1 legacy-trunk
+17909 fcf85c90a2740bfc6fbc1b64163276eeef853a4a legacy-trunk
+17910 25579cd6cdd903807fe48298f9ac838791c0ed1a legacy-trunk
+17911 be4fc8b6e1cb83a0306286f81dc183ca1de3f9c4 legacy-trunk
+17912 08e6f1019171498b04b7803f4923f16ca424982a legacy-trunk
+17913 627ff578f12f8f85192f1732b94b469e56990554 legacy-trunk
+17914 41bfc9a40fe39496b834d23559d6c818ede8f830 legacy-trunk
+17915 bf27caba3d0e4092318598c433d375442ef9ea96 legacy-trunk
+17916 3a04bebb666aeb0e0bce8fdcf10e7954b0a34c84 legacy-trunk
+17917 acb88607b4bd7e8bc0de42a4f9fbcbe2d7a0e296 legacy-trunk
+17918 177ae1c52037650206acdb57e34134c996074b7b legacy-trunk
+17919 103612516aa8d35fcddea0fdcd999ec7d8d90461 legacy-trunk
+17920 675748378c8199d9749b54a891cef717d26f3ce1 legacy-trunk
+17921 f780469a9577f95c8c975f1214c030e9886921fa legacy-trunk
+17922 c058bc35640f78ae8840db612f2a9bb93bed87ca legacy-trunk
+17923 118ac85af30a05c4bc12171acb6cd8d34281c8fc legacy-trunk
+17924 1879a48a31336a4eb4cd25ed791aa4301465ee8b legacy-trunk
+17925 690b41d47c1d6ad56586fda6689c93b02002fc42 legacy-trunk
+17926 a53f16b20f1d91bd9db03335b89096dde1a31845 legacy-trunk
+17927 57fea8709758f1f37ff80b14ba818442f35c6b63 legacy-trunk
+17928 71a4aadde0198b866a4606f1c73a61f5572e7a70 legacy-trunk
+17929 63d237a25f491e268ecae7624d849c6d88e25249 legacy-trunk
+17930 b25eabf66d8d375c45552823b51b756488645857 legacy-trunk
+17931 7ce9061f7967ffc732525955d3a47ecff9fe1155 legacy-trunk
+17932 77d1d79a65d75e84a84773c37d81c32f50fffea7 legacy-trunk
+17933 3142027b5979daeabd52617515f4184b91576a26 legacy-trunk
+17934 ad8ef155ca390e8a681022ae311d4338d8baab1b legacy-trunk
+17935 dc4caedc59611b171b14978c16a6af1db7062641 legacy-trunk
+17936 47e68077117e4211509dc283a3e767a1238e5f50 legacy-trunk
+17937 cdfec36f12cc9fa1b8e9da5eaa560a865792e9bd legacy-trunk
+17938 0e0ea56e4be84c048820b102865c2a06fdfabfc5 legacy-trunk
+17939 a119e0c8b80b0e4d1963bb334c63ea382b7bb290 legacy-trunk
+17940 c2f13c395b9ae7f885fc47a816aab06f3288e1e1 legacy-trunk
+17941 02ad9cb5222278306a57d8737bdd92c5e8bc1dfa legacy-trunk
+17942 9be67c5a823ab1da1c9320a611acc51e3e73346f legacy-trunk
+17943 f9d4bd79b46480c14ac4ad7a277230e114a3ac20 legacy-trunk
+17944 f09a84af64bd863201bcb65ffebf609d6cd1a136 legacy-trunk
+17945 a13a2acbe214ef8fc06ba35e3800a3ecc34b159f legacy-trunk
+17946 1a6f9158630f1d6efa95bed870b0906e405baa52 legacy-trunk
+17947 d0a6d444d6bc77b16d86637b36ba1e5fbb652a8c legacy-trunk
+17948 5da9622fed7b5474b5dc4e91bc7b5e287c47c0cd legacy-trunk
+17949 41c42b1bd5828b948880c95ce77db2604c0ab67a legacy-trunk
+17950 44fa16f01b4e1229acc3d2456ec67c664896a6ec legacy-trunk
+17951 1b34c475da87fae3ea8d5a54664713eafd73876b legacy-trunk
+17952 ec1f2365bc2d57b11e60c2555de72d777ae6061a legacy-trunk
+17953 c199460ccde906603c9326b80381608518916392 legacy-trunk
+17954 95be43d1d3326571936ede5974a90ee20751a66e legacy-trunk
+17955 5fb8dc289812df9eb4d64620098e84d2330d2033 legacy-trunk
+17956 7de0808f1fe3207dbc65a110f0c604643e2beff3 legacy-trunk
+17957 1acac4756a03beba40ffbd24770d800a04af7f81 legacy-trunk
+17958 f8e962506063ddaf5080d1368658177e443e29b5 legacy-trunk
+17959 a02f9dac216cd989424ff09cd9c33fb3cf46f7b0 legacy-trunk
+17960 8bfa9703a4e4f40370e5e9a4cc474bb683cbd040 legacy-trunk
+17961 a5a9cfc009b5b3c0ab8b3eda914db27b1dc643a1 legacy-trunk
+17962 2900452026ccd5ee2225dd87d8f1de82bbf4f8ce legacy-trunk
+17963 f76a1ecd6b5916afe0f5656e668524588d1af6a8 legacy-trunk
+17964 666091f0d714471aed55d877e3389560596b4b77 legacy-trunk
+17965 d2c17adf2f0c4556952ba7440d93e75ecd5b0800 legacy-trunk
+17966 ce066799133ea475055f13e3de07de7603a2ec89 legacy-trunk
+17967 3081d701be8615f32c9a8910270d2dd1e1b40613 legacy-trunk
+17968 154b71e1656503a69e8b13ea9f2df5f7105f63cc legacy-trunk
+17969 a80541245b663200d1e2c8c184be86a1ca7e8bc6 legacy-trunk
+17970 e96d664de256acb9ded8607136b2bfbbd43dbf9a legacy-trunk
+17971 c6d9afa6e6a05c5e7b384d82dd2956e0c4662a4a legacy-trunk
+17972 fc686de86059b84560f14a87b9bc482d1d402e57 legacy-trunk
+17973 4e1e9f5c0795068e43d2ae8f2eae9df03fc63974 legacy-trunk
+17974 1cd0285e3cfed87c218878e6bd7fd720659c27d4 legacy-trunk
+17975 d16b7413dc696df74ff9ecca4c2b2a74763f7783 legacy-trunk
+17976 66d2483289672d75e2c8d3bdcd8935b8bd2d6636 legacy-trunk
+17977 a358ba707e4d351e545d4b49eb4ca5e2e9b0fb59 legacy-trunk
+17978 0c0e909b8ed23ad40d6b8d2a92c9cbd9b4786755 legacy-trunk
+17979 7d0af4e813d85deeabfa899d33bd417e7935e250 legacy-trunk
+17980 ef1f473aaeebeb3f2e64cb42f87df96c54896c24 legacy-trunk
+17981 32b8c5a480ade35cdb55fb5b3693fd2fab8dd26e legacy-trunk
+17982 3ae9d313bc33e0b4fa5fae655a7323b38c242c66 legacy-trunk
+17983 6803429250e9bd08fc750a91826363db0ca258a2 legacy-trunk
+17984 f771453c3af58864882fc33973d5a9d0f85ccc5c legacy-trunk
+17985 eba323d7407fa136eb2f24d363023330d18d87a1 legacy-trunk
+17986 cf2661a4598ebb27c67e9d82611da82bc3917473 legacy-trunk
+17987 7e6e40e41c6e4a7c36454513e905e2b5e94fb1b8 legacy-trunk
+17988 b3917940e1fa1c1a04a69f1b9524ae0f7eee0eaa legacy-trunk
+17989 34a6e3ead1c0485570f22fb415823870852a4b0d legacy-trunk
+17990 05686f97f38d246dd345feabbc8e365252d1c9fd legacy-trunk
+17991 a5c3469218e9c454cb5ae24db66cd6bbdcc25e93 legacy-trunk
+17992 9ad0764f2e841b1659be767172f4083d2f8407be legacy-trunk
+17993 91201de25f36d649028407e4dd58bc04004c8ad0 legacy-trunk
+17993 e276329cce036a5f9e9d3451256dca5984e543dc legacy-trunk
+17995 da9067bc949428f6d8848bd51624cbcdb97ee2d9 legacy-trunk
+17996 57192f0ac13a7d6fdf93f56a81602805f5835777 legacy-trunk
+17997 dd49f29d98795e25d13426bc37e302346b7ec6cc legacy-trunk
+17998 fb9958933b258b5836ea37ca66146ce73172f9e3 legacy-trunk
+17999 43318746690169d2b4954425578ce25eb31ba3ba legacy-trunk
+18000 563dee598d3a9f463d38364427fd3de9ea843ecb legacy-trunk
+18001 74c020add846ec4b66a20c9b829c60ab1ec3a440 legacy-trunk
+18002 6b01fc22ef6ef8ed3dfe3998c90950b8e08f1c84 legacy-trunk
+18003 a19b1d6a59ce1c68e62abb3c65b5508e0c45ec5a legacy-trunk
+18004 5cf0a02a574b11999bce3c7378eab5de74d96c7d legacy-trunk
+18005 5e5b43118c52da6fc6bc9bee47b024c52301d75d legacy-trunk
+18006 a2fcc487b9da185876fd7e9ce031aeb15b6bd393 legacy-trunk
+18007 fdc2abdf4777ebd2f8d9dd33a6f9fc98dce0ee7b legacy-trunk
+18008 486f3ff14d95ac9782a53cebe19b35fea2ef1df9 legacy-trunk
+18009 ca9f6a8e9885713bc7d8198f602ac3d125f3f8ad legacy-trunk
+18010 ed49a67869e9c20f4b6c3e499cf6663c7dd0b9a4 legacy-trunk
+18011 e17d8cd09689f01ab7caac2df6b463f087f4e635 legacy-trunk
+18012 1730591d5d5da8a253abe3cc0f7796d006da80d8 legacy-trunk
+18013 74f165dc0b5ae7b5abf20400a42f533ccadd5596 legacy-trunk
+18014 becd8a121464f36a4aa9dbd27a674e8a77c36764 legacy-trunk
+18015 459232a9b804c0a0cf64957c923ae9617b826449 legacy-trunk
+18016 7b07d62d2c7961d454f6de0787344c1f320e4fe5 legacy-trunk
+18017 e71971a402d319aefc4e3cab2ec7a2764b93e69f legacy-trunk
+18018 3c21064e8214c27ddee6216a280342c51b2cb74b legacy-trunk
+18019 007a91d77703feb6bc2a564d2300a33b5694f654 legacy-trunk
+18020 b075359803016540cfb94277848eac05501b04c4 legacy-trunk
+18021 a8006bbb6225779c3a0d7eba80fe889750ac8a18 legacy-trunk
+18022 8930ec3bc00a91b722a27fc4fcbd288a1fce7507 legacy-trunk
+18023 2577519d5ea139746a6e2970d04e37f28f08d438 legacy-trunk
+18024 e61e64d1b5ec3b81c742283888fbdbcbddfc2d29 legacy-trunk
+18025 e582f57343f4d5c83743decb7ba8041fd32bdbc2 legacy-trunk
+18026 2edf366f563c8db6876b213a80140c9097808ba6 legacy-trunk
+18027 f6102c5d3f9c2c32d999fb38df55f93124516256 legacy-trunk
+18028 09c7ac188ce2178b87b06504b0e4fe55b3bc4db9 legacy-trunk
+18029 85a02cc37590a6f490dd88cbd98860689465b8df legacy-trunk
+18030 d2f4d748c921ebdb090f3278dca16b84f485ef9f legacy-trunk
+18031 744aa062f4701a41540dd46827ace5c2aae90b80 legacy-trunk
+18032 3eb8687c98c6f7c2c4cc791295b5cca7c5f37b55 legacy-trunk
+18033 ab1f90dd502f8aa8592037db67743dcf2c5ed744 legacy-trunk
+18034 e7823f0ca21a0612aa0599dcc85165c3d5665479 legacy-trunk
+18035 52d2d36b8bf7f7856eec7652326884e0d5c34e0e legacy-trunk
+18036 1b73b3514b5855d5ed47b72385b239575de02ada legacy-trunk
+18037 015da13f0038c166f0e46eb74c169b9f60917284 legacy-trunk
+18038 54273858ead9c6251054e95477aa547967b32b99 legacy-trunk
+18039 2ed358446f2fe33902391e8f482359fd211e8fe1 legacy-trunk
+18040 b3387eeba68dfe4ca98d5f92ad2d4e20f340f5e2 legacy-trunk
+18041 4d2187264cfa7ad11300ce9ed82533d091e0ac0c legacy-trunk
+18042 9e9ee3c5a6078f3aefb13a59e4cadbf161ae90f3 legacy-trunk
+18043 100beebde9dff54d48b450557121a211b47dae2e legacy-trunk
+18044 b2892cbc63db7344180cb52702592ed56b79953f legacy-trunk
+18045 5aa8c5aaffadd64245d409739670a66116d97a28 legacy-trunk
+18046 f044b06e317daa2402d379f6484c7f1490d5a8f0 legacy-trunk
+18047 319c6e3718251c9835343611fd273280f40fc13b legacy-trunk
+18048 656d434388c8e2283022ac14d96d4cb522c42c4a legacy-trunk
+18049 db4d80a67389a2061d1a1a3de2308c340010fc04 legacy-trunk
+18050 1c63e224f616640c68ea4659c5bd87e844e7aab1 legacy-trunk
+18051 e3d8365ea2315126e803d492d7f9d8a701b5889f legacy-trunk
+18052 af02ac580028c9e5d1c092f20352f5cac4a2fbec legacy-trunk
+18053 3743a6dbc4a772b5b08bdcd112b38275f86d6093 legacy-trunk
+18054 48cc77b63ad5df5dec0c3b0597826911316c4f3e legacy-trunk
+18055 23bf30858ef4531ef14262f9061e38e617a5343c legacy-trunk
+18056 d469d15723d35f052ffb64c04cdfbb4e204f2cb0 legacy-trunk
+18057 77ea8fcef24cb355b0be1fd6820835e3f1b18436 legacy-trunk
+18058 c50b786ebc484b24fb907bf201d87a99af53bb45 legacy-trunk
+18059 4eeb02817b5d80e413b7a6eadc5b3e5cfbf27aed legacy-trunk
+18060 9b7ddd9cae33e2771e8d272e6342598961eb934f legacy-trunk
+18061 6417ce914dae87edd2849148ad1f6b42099e40b7 legacy-trunk
+18062 e0a5835af83350a07860ab7e1a79f95f49d08b7d legacy-trunk
+18063 04e76e08e10ff41fe2aec8a56beae6fda351dbaa legacy-trunk
+18064 c94f1c7761536ea70631671fc0ce39c1e104ddf5 legacy-trunk
+18065 701a561bdefa8164864caa9282a4ab2e5a85baad legacy-trunk
+18066 783967b16879a8a84be58b192fe16b97ae922a59 legacy-trunk
+18067 9f3077506d1a16ba487bc510b07ff01a16d8dcbd legacy-trunk
+18068 d2c205c36d8a418f70dc911f08f93b444bd34b63 legacy-trunk
+18069 e4c9b805f39fbd783a09250a109dc177b337d136 legacy-trunk
+18070 50a888ec57c12711fd511a293ce053659120cabd legacy-trunk
+18071 882cefe21dc368185d7ffd7909863cb0675827e8 legacy-trunk
+18072 7d45249b1477d9c78b954fa39403596b45bc07fb legacy-trunk
+18073 9598650f2bc902320b7e920cec82c60fd48d031b legacy-trunk
+18074 a3975d2811f0089f52da2ce3c586aa7e7b6ca88c legacy-trunk
+18075 a82e4c295b9300d308b26d14bf4209bb1f307858 legacy-trunk
+18076 5b5654ca7555b98b0e2b41cf661109d603e43cc2 legacy-trunk
+18077 99f38c755abeba45501098f6a2ab4056635901e7 legacy-trunk
+18078 3e7016c79daa0e7afcd3e452fdf2df700c5e33c7 legacy-trunk
+18079 d7c93a78c94928afb9c28c3b44ab9f17f892e045 legacy-trunk
+18080 3d90e1d7605f712723c4b4d6bce30becc4b240d2 legacy-trunk
+18081 e470a9618ca72aba3586d14a34a3d234614270fd legacy-trunk
+18082 7e92b7a5057c510f1d3bee2792e343df03acd7e4 legacy-trunk
+18083 486a31d8a3b35c5f91fe1727c543c8fa76c063f5 legacy-trunk
+18084 487b3502a45b310fcda70aa09fdb2d658cd5d1ad legacy-trunk
+18085 f792820f3cd4bef56053cadfe8e4de5d012645ad legacy-trunk
+18086 d2b9cc440b8dd42e0315f2b8d3261f310c7a0b01 legacy-trunk
+18087 bd88df20da2f59ab4eddd592a3953760240ca591 legacy-trunk
+18088 10b3cbdbdfd9fd9195f5f54023a2d43f70132097 legacy-trunk
+18089 38c795afb3b8053eb6a8d2acdf6e87b69b6d2ad3 legacy-trunk
+18090 864f1714af2871b307ce4371f96a9aa56c04cbdf legacy-trunk
+18091 03720a26cfe736547f867f4781388d02b7cdddbe legacy-trunk
+18092 8fe2a7981d70b32a98dba640a6442062f0907ed1 legacy-trunk
+18093 c94c2ae746f1cb3a642a5fd14a8303c0a7ebe59d legacy-trunk
+18094 f1ade8ab18695537ccec90f7ce33a86d66569557 legacy-trunk
+18095 75bfbe37ab7a6c09034bfa7c0a06eb76c746e99e legacy-trunk
+18096 9af7fce3638413173a007fcd342242eef19f9083 legacy-trunk
+18097 0227b5961eef74a878230a608d0f1f2a99a5b80f legacy-trunk
+18099 da43b16986b67701d8b7044587c715dc2c793663 legacy-trunk
+18100 657750c1d78354d878773dcf2c32d8d924864c70 legacy-trunk
+18101 2cdfc46e8068d0d8ad9823c45c811f46c84effab legacy-trunk
+18102 e9e8824e3d8dfd9a3bfb2ed9fd47ac24b6844062 legacy-trunk
+18103 71ea2bb01889572f96878668d116d1764149a9d0 legacy-trunk
+18104 e4ea44b10abbef25ad107e0fe1164b9c9ee4d684 legacy-trunk
+18105 6837135081d4727eefde74754bdf2b020a61d327 legacy-trunk
+18106 dd0d199674f82a4cf5e31f713193c0f4d2f97183 legacy-trunk
+18107 8686f284fa8d749013ecf43d9797680d039ef4a8 legacy-trunk
+18108 735ed856de60e418f6757ac73cbae4ba0c0a55c2 legacy-trunk
+18109 2a05c1fbd8947dd23301f8f480eefeda51dc59b2 legacy-trunk
+18110 cc9eb187b7302ca3770b116a9ac2cd4addc88945 legacy-trunk
+18111 9720c2c6f435d3d6cdeb3b902f4ab202b2cd6567 legacy-trunk
+18112 0f9fd3fd7799a8accf1f56bbacefd190931110c9 legacy-trunk
+18113 0813020b29775e1cf2cfa34180f3aade47e67e46 legacy-trunk
+18113 2fa4e35083e02342ca014bf5bfba46aecb816c31 legacy-trunk
+18115 bd4cd73cb0d6d5f88ced7df74d30d7d14b226bb7 legacy-trunk
+18116 61f823009145ca13a8fb5f6987a16292996633cc legacy-trunk
+18117 3142698d172c857bb9918c512f1eb8f05662260b legacy-trunk
+18118 a187ad82c33f47293f44a4c34238d3d44c604ac0 legacy-trunk
+18119 d2aa266ae41c88eb7ec0e21891fea06c45d8bc07 legacy-trunk
+18120 bc4f89eefb04d42eb7e1b1c23f4a366e803004db legacy-trunk
+18121 87780dbf8d174b1bde753af50e8615613e88ab3d legacy-trunk
+18122 0d3babac4398fbe38b5f470ad9a88b4f02a1004d legacy-trunk
+18123 b51629980c886c284eb43b5dcb4426b91ca315c9 legacy-trunk
+18124 387f31ac32e648c543797f43a2ff2390bd8ffc23 legacy-trunk
+18125 c94c1b660ddb156a7efb4ed81d00d84f8c4125c5 legacy-trunk
+18126 d50335ac55803c04911f4c91351c22439ecd51b5 legacy-trunk
+18127 0832810c461243378c530581a5847cb50a0013cd legacy-trunk
+18128 d5740e12ea8a29a9daa4adab5dae59f397b3e5f4 legacy-trunk
+18129 74c6153abbc10d0d7ded240fc47eb25bb8790269 legacy-trunk
+18130 929c92c50cb2bbec8367c058be01912409af057e legacy-trunk
+18131 3e96fd44b9d0f78fd4925981c42afd5ccb8d3804 legacy-trunk
+18132 6381fa8d7df33704bc296d804eb7c76e30ec97e2 legacy-trunk
+18133 68158d64e874e95074c891670ddb44c0d27f3f44 legacy-trunk
+18134 847d99e4f24ad3e207e9a6b8d0abe7e194d80601 legacy-trunk
+18135 65d265d89d8f4255c7357b998d220e9f6c0782cd legacy-trunk
+18136 ba3677e1f81b65dc74c41def95eed5d606bc8d61 legacy-trunk
+18137 11676ddaff015e287a0e781f27b9b670e86a20d9 legacy-trunk
+18138 2541062ed4dd98bac9cb1fc7094ccf0b29522ad5 legacy-trunk
+18139 a5ca54969a3ffe728af53616e76dcb833912a739 legacy-trunk
+18140 af2aa807acde7fa4ca08864304224921ba616e01 legacy-trunk
+18141 bf21e417bed2234920585c32b399bb8e43c86a51 legacy-trunk
+18142 4c7c779bad879b8deb70ddd35ce7a2a4548dc28b legacy-trunk
+18143 b940a0fc29e33949365077a0f5a1e85773373bf4 legacy-trunk
+18144 8f4592f54988dbed460a72d93164c634b21c3ddf legacy-trunk
+18145 132e69892aa5d15ae50880ad1c5aa111bfd9a4e0 legacy-trunk
+18146 3a7afd3e6c97814b40484781303103e715118d3d legacy-trunk
+18147 1f4a9ade30ecc17cb1b78341d1e0b05b8f39fa33 legacy-trunk
+18148 272c2965081c651860368d741c5c6efc914c19cb legacy-trunk
+18149 23b1108d6c8b5fcad7282801b1278d4d1bf518a1 legacy-trunk
+18150 1f9d5eb84b0b20c0bb6e8aba6db076ec84639691 legacy-trunk
+18151 9dd7eab836d7cfc9c59c3eea6b9604a70ce4323d legacy-trunk
+18152 09bf6d30024fb088a508f6902eef50e5034ed776 legacy-trunk
+18153 847dc61e30f5c8e88e97695b447a945a09c696db legacy-trunk
+18154 757ff88e17aadbda3d31cf88c6af4f2930dfb2f4 legacy-trunk
+18155 e6a1085725acf478a9e81eb375e47305f8cd0cfe legacy-trunk
+18157 f20deaeaf8b97c21d6fe02954bedfb7fd0456803 legacy-trunk
+18158 85a509faccc796f302dff964dbfa29dbd3b55528 legacy-trunk
+18159 68bce5d83f7b93a71ee2d4a7e3d9cd87f62a6588 legacy-trunk
+18160 0da4ccc7e8cf36e6fb2bf5ecebfb8d5a3865a3b5 legacy-trunk
+18161 2a9d2765625e5a775dd5bda60d43554a767cd227 legacy-trunk
+18162 b211026cef84ca803d86f9daa2b963680e562ac8 legacy-trunk
+18163 0820994e2d5e876f1e09bf2c475d877dc1ac373c legacy-trunk
+18164 a6f3ef10815ecb8dc10d8d7b9ca094aaddca0fbc legacy-trunk
+18165 07f24261c6e6ebe3efce448ce4946c516f7fb26a legacy-trunk
+18166 a999d058fab55815838c0006235b987889a47ae8 legacy-trunk
+18167 f8721e8494246cba41830192edb7a2847ecebc89 legacy-trunk
+18168 847ae40074d4e00734b30a0d4f76be25aba64947 legacy-trunk
+18169 0758ccb3363cfd64e9f76c488011ced6e5ccb86e legacy-trunk
+18170 5d2a2185c651a4339ba4ea8167d60a64bf560c60 legacy-trunk
+18171 33337e5a4300c98daa159acd8c0f158f7525ec39 legacy-trunk
+18172 86d069414099fe983635421f9e5b87132ab0713e legacy-trunk
+18173 49468c007c0cd5af29c3971eff74964c5415b3b7 legacy-trunk
+18174 87b5e480762f86b17970c5b3ca901ba646817019 legacy-trunk
+18175 b49f522bf893ea52ab059968af6215daead50f4f legacy-trunk
+18176 8e865f5ecf7841fd41912ab04e30bd13f7c81f4e legacy-trunk
+18177 13975aec5152156017338faff1e296e3f8b3cdcc legacy-trunk
+18178 8aa947e1eee82a2ef2e2cf60d0011c0438afcba5 legacy-trunk
+18179 09ec882cde614420b9551a38bc197b0da76ab6dc legacy-trunk
+18180 3bd13a2fc8382484e002c52e73ce1b5a5a234292 legacy-trunk
+18181 11e3a6e16a9f225fa62a8814dec04fe4c03e06d8 legacy-trunk
+18182 d17ba141480ae7a63b778270ace46fe1d4f9e59d legacy-trunk
+18183 fd17217d5ba868af0fea347c8a8ccca9fb3c80f0 legacy-trunk
+18184 d8aca3c890f7a4fc352856b2c1ee48b562350728 legacy-trunk
+18185 65594feb552757e76ead9670e53d0bc43ebf6729 legacy-trunk
+18186 e5d4c424c44f936b764f8a50a3fcadcf83323dd7 legacy-trunk
+18187 c1846d331de9d1d39752d5e511301f3bfeb79247 legacy-trunk
+18188 0d63c0ca7ae422394653ec1b147334ea04f73d94 legacy-trunk
+18189 5d586d45cb5a524ad8a03d818985271e778e94f9 legacy-trunk
+18190 818904a99ca37317e1c237b17ebf8b7b708ea165 legacy-trunk
+18191 788b523d4827b246946c053c55f848b604cf92ef legacy-trunk
+18192 12aec3381c946bc7b18870f235d0af9ad027976d legacy-trunk
+18193 d5157c8bb11a4dda12c0c7f1cfd92b883438b25e legacy-trunk
+18194 100c533d9a3e61566d3c51ea704bb6c41b877bb2 legacy-trunk
+18195 ec79800f4c277025f007cad33cd5bea7e04645fa legacy-trunk
+18196 bbc991ab6d3221a6f53d52c5ef5221886fedf884 legacy-trunk
+18197 a81f9202803dbd2e55160a14955957e3204ed1a5 legacy-trunk
+18198 ca1ae21a3039b341d3e6655f8496ddb9370c07b9 legacy-trunk
+18199 c2d7451b42f66c528b50326fdaa4fe1c27f00abe legacy-trunk
+18200 d99a0f6cfce20c8ae9962666e6ce3955d0a16129 legacy-trunk
+18201 c2d10274a214892f53f723e216cb2b8d293779ed legacy-trunk
+18202 cb11fa5b11f423dfb53389ad4d22315990ee755f legacy-trunk
+18203 acf2b19e434432314ab670213b772cded3b81f84 legacy-trunk
+18204 e59f538bb8293af288511d590ec464befd61331d legacy-trunk
+18205 03dc761d2cc49e884856ad2115ae65536e77d6c7 legacy-trunk
+18206 563dcfec2ae9e6c3ae19fe5bc7c975b98591cfa2 legacy-trunk
+18207 304871d6e866244678477be19739241bb32d37cd legacy-trunk
+18208 d4a46326faf43694ea6739ef20e76073546da3f7 legacy-trunk
+18209 0c19672d47bb1e1711cd4bb2910d6739e50a3b1c legacy-trunk
+18210 b3debf647b53ea8312bb860b752581038b435b96 legacy-trunk
+18211 a6224da7b4e435cbff2e17a94e1b5858591f8d69 legacy-trunk
+18212 3e54cefc58c601e8f20e29d9767ae94023d8b2e3 legacy-trunk
+18213 f480d52c0760adb1492e2c235df266a96f5f758b legacy-trunk
+18214 7be9edc4d5db11b026dc7ca48d9261d9ebba204a legacy-trunk
+18215 2a3696d32721e7009d29f87c1d0510f26f071c48 legacy-trunk
+18216 6e70baa487ed5234d4b3fbd65fbd24eabe07a2e9 legacy-trunk
+18217 ee271c20b05f3b249a0c227ebe0c6df7dfdb8fbf legacy-trunk
+18218 ab3438cf1f3e6b36a990cb8a25ab12e2c95bb632 legacy-trunk
+18219 12b92a35641be2eecba68efeacad0befe42d8391 legacy-trunk
+18220 74e1d79520fd4cdecceafaacdd3fa1ae8bc7c3c9 legacy-trunk
+18221 a3af145d2531e0c36427fc513774f03a3e345925 legacy-trunk
+18222 9a17cdcd3320358dc16533d468472a1a1b8bd465 legacy-trunk
+18223 47d9fbe6537c87cd6db93c2bc6767af9d6a6c202 legacy-trunk
+18224 09952d6ed37259f16d561652b20051b856c4ac88 legacy-trunk
+18225 1e4de601051c1624118dea3364391e57478f2995 legacy-trunk
+18226 3c6083247ce755c96002752ea9c593e7745f6498 legacy-trunk
+18227 8275d8643e7989134edb047a53a231b490989efa legacy-trunk
+18228 900f266c5d8e2c1927246f774d6ab92804c45139 legacy-trunk
+18229 3abcb696661759264cab6a562869ee8a0e39f310 legacy-trunk
+18230 2e1ab0c941c0ecc27adea0933c3af1f799030558 legacy-trunk
+18231 c7f5dd2bdc7d69f53e9ef79b098c2e6ffc4f4514 legacy-trunk
+18232 f6233938ff89b0e648f6f31020e981e5ad697c46 legacy-trunk
+18233 01922a0f6f92b2e3feb3f8c89ea99e219925fc87 legacy-trunk
+18234 a826a46bae54ac90f0fa9ed01fd26520dbacedd1 legacy-trunk
+18235 cee96b391ffc260675eb569812ad216d6e618bc4 legacy-trunk
+18236 493ca9e4260e52a237f40dd34765bca4c8818a8d legacy-trunk
+18237 83cdd45485a573a2ae5bf8724b71518e96f6150b legacy-trunk
+18238 9b1be1d848104673974680acfc4b48f7308c5719 legacy-trunk
+18239 7a82f84290f7bbd30488a155a86b39d2b831f2d7 legacy-trunk
+18240 bb006ad00d9eac6cf957837a12d3ba83fbf4f822 legacy-trunk
+18241 52c27b7116869007249b63f1555c2a4d062e2963 legacy-trunk
+18242 c104f00c9909eb18605d878390283ca987d15bfa legacy-trunk
+18243 eeb7c8a5b79f643c2db77b4709db7c6943353afa legacy-trunk
+18244 3cb12e0e7acd102dc38b6cf4e5b4ab3017e45868 legacy-trunk
+18245 22dbcffc54ef10f8803ceca4cadd5d12480aa221 legacy-trunk
+18246 16c12d1698f6ad60d1d69d2bd6c511e2a4c8a627 legacy-trunk
+18247 b3469eb78bc6681133da25dde50ba73270c256a5 legacy-trunk
+18249 f2901b6ac5ed9468c562c904f283281bc081161e legacy-trunk
+18250 87a5bae1b944a99931f7b5c1b7772db96b0e0db1 legacy-trunk
+18251 f62e3e7871be92392cb93ed214a6021fe3dd119b legacy-trunk
+18252 5192bfd7a8bbd590179324e02dc69b7fe9cf5bc7 legacy-trunk
+18253 fae5b1e41491d636a94df52ac4cdfc8076b611d1 legacy-trunk
+18254 86f06c153dda4a3a3436b79732101e21fa95a5a6 legacy-trunk
+18255 96c394a43b5bafc671ebb040f3e91203d0d3eeb5 legacy-trunk
+18256 d265bf4ada7c9210f56df3d9529835b7358c1cd9 legacy-trunk
+18257 b71459aeda9568de79ca38b44e9efd6673ac31c2 legacy-trunk
+18258 5d5c51304f7c5aa8c705026924ddcb13a69505ef legacy-trunk
+18259 3ab7faae803af24c3c670ce018a66eb6c2782102 legacy-trunk
+18260 aa1ec270f2d38b84e02c17a9e6c48b9972edbfc3 legacy-trunk
+18261 8f82316f69d4051fb981bdeef77891b78249e786 legacy-trunk
+18262 c45c5080c844810f2ad31c916de3a8c573d57032 legacy-trunk
+18263 fded5c9ecc9bbf4a0d8d43fcb0e38bd510ae9369 legacy-trunk
+18264 5b4abceff53d4d395abc21ab79747ec1c2d4d091 legacy-trunk
+18265 9a6894f8e1a09735d993f2429808ff6e1debf308 legacy-trunk
+18266 af1e9e64ed9d241890dea645d73c0fc2509dbe96 legacy-trunk
+18267 77171318e32128729842e671ad26498af3aaea05 legacy-trunk
+18268 375229c3ac0d99eacac9be41b96784ff40e012bf legacy-trunk
+18269 ddd903fb6a7108037cd498239d90a1f0be0b707d legacy-trunk
+18270 99ca419ca58bbb7e13de09db10fd1871cf234b35 legacy-trunk
+18271 b648cb0d1988f17f445984b101ad55060671f5a3 legacy-trunk
+18272 56e97e727569c3a2631087e77381e6e2492cdc1b legacy-trunk
+18273 876cf7b3d3dfb1b5b9f124d79ad619df900130e9 legacy-trunk
+18274 4ae4929b12ffe1d87316e7f8027f0d85d3ceac8c legacy-trunk
+18275 86f4e1ef81caac055b8dc6202a2a7c73905f4823 legacy-trunk
+18276 0f00b6c7b9b95e1364d0b2661b181f3468e4e3c4 legacy-trunk
+18277 c8d4e6f1b5fe975c276f195fa814d8b06bf8af44 legacy-trunk
+18278 6b2524e9c672e805d60d655e816308ce2e9e634c legacy-trunk
+18279 06465ed81826305a887daa218689fad5da346d7c legacy-trunk
+18280 bd41e6273ed9b314669c782a3995c0f4395cbaf5 legacy-trunk
+18281 27e4f5601aa589c20df7628ff12fa52dbcc6c249 legacy-trunk
+18282 4918517ed6b4cb4f0b3faf81459bb66e07d0d985 legacy-trunk
+18283 39ab827e72bd6e77bde3d9342a9f5bc58ceb0fcc legacy-trunk
+18284 7ebdfe425c81eb6236762b837d246ddb59ab60c3 legacy-trunk
+18285 97ea0b49422fff2a84ab9b9f2b841efd452b672c legacy-trunk
+18286 be33079360c6694acd057179edaaf117c8781dcb legacy-trunk
+18287 a9351051923e0b04515a23894bc031cb88b5a37b legacy-trunk
+18288 c0f1ebd320723900835061f55013c8b04ded9942 legacy-trunk
+18289 c833dcdb3a15547a9bd911f6932e63cd9037a669 legacy-trunk
+18290 78a7f8a64f85a74817b59baf7e7d13b505a4e00e legacy-trunk
+18291 d5a5428e965c4d250bb45c145d8541b3e7e50440 legacy-trunk
+18292 849698550b32a68b95f5d136379faf3b3f17e318 legacy-trunk
+18293 2049d570ca5a7b0e43ca15571d05177a645b4b39 legacy-trunk
+18294 ac6fba0ecc29024288fbf7a68b83b4b1d250e6c9 legacy-trunk
+18295 53c9d15ad98ed6934f11148b244ae2ae9a827899 legacy-trunk
+18296 fb10937060ccbc388d8dd637bcee2df857f5378c legacy-trunk
+18297 4e8577fb9407ff6e4e403189b30d757f3a8e6c8d legacy-trunk
+18298 d5f0696c37e81bab2f907bf9c4f9c20b76ad7c8c legacy-trunk
+18299 433458651eb4027954fb7325c0369c0db7c439aa legacy-trunk
+18300 328fac1ca210fcb600b35bfa6425664e3ece2fab legacy-trunk
+18301 ef466a19e3bc6a256d03438094de741e5b656f80 legacy-trunk
+18302 4ac555a876a23f500f764f864175364d6a78fab2 legacy-trunk
+18303 b855c88c6af6a416d2812515be56c37807901967 legacy-trunk
+18304 68de9185b41e2a31ce23ca6e3b8cc4b648f2c058 legacy-trunk
+18305 7e514f1fe31fcd4fafc607bf0f801ec46dea35c2 legacy-trunk
+18306 dcd2bebc180ef43b5e0a654f906eee93ee75914b legacy-trunk
+18307 f813ede134bf68d45c72cc030b04a7602a682b6f legacy-trunk
+18308 f823b9aa0c03615149846b752956a943ce8d1928 legacy-trunk
+18309 31f70ca06c68f94a74f4a4d6d7764895d26721b0 legacy-trunk
+18310 9ab7a597eefe91429edd0887b3c22f3d877584e2 legacy-trunk
+18311 ae49006b2d8faa6a8b80805ba35cb742e077d6e7 legacy-trunk
+18312 db6d9bb7ec9453b774b988f481d4390b8a95e738 legacy-trunk
+18313 f2c176d846a4a5b90cc1c7bb297846b9419ccf78 legacy-trunk
+18314 7721fb50946231d9f863e23cc876fe3861789fff legacy-trunk
+18315 ce77738b81acbf6bdff491815d83cda8cf429f9b legacy-trunk
+18316 d0146d128897e7354661d914882968c0d71fe14a legacy-trunk
+18317 597089dd2609a5ea2e1ed57a56539c9f1f1b3291 legacy-trunk
+18318 af397f7dbbd5eb50757e9e5b56688f4a4a38ab4b legacy-trunk
+18319 5d758cf5111d7d8cf84010f1491a4727766e9c36 legacy-trunk
+18320 a79d3624f8454a6d428218b8ce44e7ee329ff3a1 legacy-trunk
+18321 d397f66775e8bc41ca63c55065136c698708b85b legacy-trunk
+18322 9f775e249ba18084196b56219a7e4c5459be149f legacy-trunk
+18323 bbe8a64e219e58f5fb529849d5a1ce60288fcd38 legacy-trunk
+18324 aaa91ed3fcfd29d594032d13c78c25181676d887 legacy-trunk
+18325 c7f225ae31605b201352f5f3eab15e4980cba7e2 legacy-trunk
+18326 0b84b31aa9751897fb4f86573a2bfaf7fe97c6d8 legacy-trunk
+18327 9731bbb52fb4ac49b6e3e5c7b69b8474514f4322 legacy-trunk
+18328 d7864345b1c8a8c4e7ab92b592f0d3cdf31e0289 legacy-trunk
+18329 21986cc14bb2a7d0c4571e2758fa845ee82308f8 legacy-trunk
+18330 ac220c31ddd7e9ab03d209a2bffd7ed399a5cb91 legacy-trunk
+18331 e0d8a6f2d0911b26d6fa5c5343cbe84c964b5f3d legacy-trunk
+18332 86cf6480d2fa63b7e4da32b3113b45e475999145 legacy-trunk
+18333 48804dab788ca6da5c0ede509e4bd2dde5606b48 legacy-trunk
+18334 2ece8fa56808078b74566fa3e6be724e21b0ef55 legacy-trunk
+18335 ef91393375474fa9d6d349942c36eb779ef44731 legacy-trunk
+18336 655f4c4bb9449b1da60d4db1ccccea314bcfa573 legacy-trunk
+18337 3be1f5c520ad525f2f5769025bc004c68a5e1c5d legacy-trunk
+18338 a5cff8c1f4e4a4214b8f39cef3c0686732062dde legacy-trunk
+18339 856b2bc216f9fb3826cf21514a54614c3a154648 legacy-trunk
+18340 e98964bc26814323140cf194e337e2e4870f4b0e legacy-trunk
+18341 3c33f2c357d3b6c75f4c3069ee19ad1d0aa7d654 legacy-trunk
+18342 07c2e136260c3ece40265d8520f22e1d99ccf1ca legacy-trunk
+18343 6838e72f8dd2707da08e210596ee6d9b8d0d45f6 legacy-trunk
+18344 105c25052de98ec6a464564d06e1f9c6447924d9 legacy-trunk
+18345 07705177ca6bed95a8826649d5499c104ee7f63d legacy-trunk
+18346 1091ad9a0303cfc8a26a39a35fe48fe43a1867d9 legacy-trunk
+18347 b3398c452d9591a21445040609ab3a3027d7a471 legacy-trunk
+18348 f0ca4c67957b57a9f2cc5af06b95a0ceae1cb2b5 legacy-trunk
+18349 2d1bbbac76d307a0f98beecf5dc3403e248dec57 legacy-trunk
+18350 10f6e195671dfe7f7a8b8e9a05d22e1852cedcab legacy-trunk
+18351 8a596d10bc70853bbfbaa91cadc2f907211cb337 legacy-trunk
+18352 58b4ae4ec55c6e8ce2b0baf2798702faf7a5132d legacy-trunk
+18353 f64039023d64923a09fbe48b848c4469f11f48d9 legacy-trunk
+18354 fd84b3524145761389d6cbd8f99690ccba7fb48a legacy-trunk
+18355 8b596451f1c18f174fdcfa9aea3eba39493ef626 legacy-trunk
+18356 32c440d2b0dfd6dd1c76dfc47179b2f4e0b1d155 legacy-trunk
+18357 26d414c0a09202e0bf051db7d8c90904a0a613a7 legacy-trunk
+18358 f3bf5f082a3f8a79ff216b4fcfd56de6b142bf18 legacy-trunk
+18359 46275611cd59be888253d21f2b3c9e143601d1ad legacy-trunk
+18360 8be889e8115bcb04d4fc9aa589bb55e0f67ff2cc legacy-trunk
+18361 d137b94f3ddfd16ebe354f3ef41ca34d99b536f2 legacy-trunk
+18362 55f4a6e8b5b3a7e431b9329bf49a69b856bd0d4a legacy-trunk
+18363 daadd1e8531658184c868d7936a4225f6fa628de legacy-trunk
+18364 39742c91add3e47e1128c409137d95fdd2e69121 legacy-trunk
+18365 4b658c059c23d9df9cbcbc48c726892bc6045ace legacy-trunk
+18366 5e9d0127ace9a1cc601a7054bc3143f2db88da0a legacy-trunk
+18367 ac830c9e9a8372a31c1b75f78717f70990bcb875 legacy-trunk
+18368 34058af976ceceeadf103240bec25e5c9cc70648 legacy-trunk
+18369 ecde771428f9eb472e865e9d30f26cd1a1e107d5 legacy-trunk
+18370 30546a2b9450e589c980951203e2d60231c96990 legacy-trunk
+18371 db7570225ef84219a900bfa7b18ff436812e1d26 legacy-trunk
+18372 3480e83e17abb1e847ac2214ae9a8e685baf1c11 legacy-trunk
+18373 e11c12323ebf5c509251d962c18480749745daa6 legacy-trunk
+18374 efc96aab71c2891d07e103eb3bd218a1849ffe7f legacy-trunk
+18375 3e94cc2a0473ff5f8bd75869ec04533192f1db42 legacy-trunk
+18376 dd583c33f455aca353e48b825c548fa6672fd1b0 legacy-trunk
+18377 c13336572f4f41a01bc38cf5c91908a1f030eb7f legacy-trunk
+18378 5e41ebdfa9a00e43f56c8f38ca99f16419642b6b legacy-trunk
+18379 c0ad4c2ef44461fca286f3727b9d2380e28e233e legacy-trunk
+18380 ed29df7eb5c96186e7d2002791cafce5b9d7cbc7 legacy-trunk
+18381 8854d9d5add5f4621e2fe7195f37cc11f4f5f09f legacy-trunk
+18382 070ee31caf28b70ec05122b1f2146a3c06b3faae legacy-trunk
+18383 aaa54752e4bad039605acc839df09fe963de6279 legacy-trunk
+18384 10221a6c7c3c5f6cecaff3b3082a515ac9add8c5 legacy-trunk
+18385 cf1750c3f7f7f98d08edf000fafc4b0f79570623 legacy-trunk
+18386 32c55f5746ded20a2353f748e293d82ce978adad legacy-trunk
+18387 8d9fffed34f4064bdc90d2a7f5ca833e565b46a7 legacy-trunk
+18388 041d57e3a2b904be5a8fff0cc6f298f507a111a5 legacy-trunk
+18389 5fe2ec504836c10f20999468f656950953ee8abc legacy-trunk
+18390 a93d79da4f8c5dbcf3f84bdc407076654e9d5247 legacy-trunk
+18391 79fcd2b31808bde6cda14786315eb62ac9f53595 legacy-trunk
+18392 ad14ddbd09a725ef6b43eea143bc7281c6057d00 legacy-trunk
+18393 29f42694402b80cd94375b028c21056dacc9d267 legacy-trunk
+18394 5d98d49713f21a1c693dcb3141814724282b01b5 legacy-trunk
+18395 0cb751b563916c30e8e7a6eb3555eb5f6ca007fd legacy-trunk
+18396 7ee39e14cf2b0f82c4be85ae09eb2c47fed30692 legacy-trunk
+18397 c59f645daeded0dda4e8b011259e605c46ff075a legacy-trunk
+18398 50358d64dc437b7e5ab3915c2db82aa44e666891 legacy-trunk
+18399 3b04d3425ff0f310894ce7255872324cbfd3d92e legacy-trunk
+18400 5aac5873aaae7d04df7cd39e276d6b0ec87f89bf legacy-trunk
+18401 9d43129c8c55f337a9bf5956b17b6264915919b8 legacy-trunk
+18402 58bc99e012a85fa997715b8dfd606fda00876521 legacy-trunk
+18403 6359480106ecfa99ad619c4ebd72bcae00c544fd legacy-trunk
+18404 785155e2cfca2949f0d77fb6060e5f89449898bd legacy-trunk
+18405 cbd4f355bb96f798c30c1feb7f30253f867868d4 legacy-trunk
+18406 d69611cce877683bcc597d2e256dde26bcd35ce4 legacy-trunk
+18407 bb93b1dca57198d19ad38428d75ceb5484da7c2a legacy-trunk
+18408 af7c623d8d33bd7a9003c135b12991e6bbb8193b legacy-trunk
+18409 f3b0682d26d6011a37f5b1772fdbc2c4cd60240d legacy-trunk
+18410 2fdbcdee2e1f2ed68a5e9a6edbc61905d933b135 legacy-trunk
+18411 845646b09bf824582b871d0927ff9720a4b2e514 legacy-trunk
+18412 f9b184a57223950179b1c6cf103ddc327f2db8c0 legacy-trunk
+18413 4d9c31f32c09c24bfe2440ca69ca6ce004317d24 legacy-trunk
+18414 57439336c2e0ee96ef5922012f7cb2ef1587fa66 legacy-trunk
+18415 43546c5aeeccea7ed999089c99cd6007dc88175b legacy-trunk
+18416 f72345b4366201cfe5654e1fd11e3d694cf31c25 legacy-trunk
+18417 d3f6f3155c2404bd1c91d67a02ca417e459b9d50 legacy-trunk
+18418 b175400e8b22afd33c947b31f84a31a343aba783 legacy-trunk
+18419 c81bed0168a0949cb19ca2449da6fe8bab615fb1 legacy-trunk
+18420 d08f8ceb3d556e3ee45f461cebe1b71ed5938adf legacy-trunk
+18421 143646bafd1be890f6dfefb157b3ceafef0c395d legacy-trunk
+18422 9453f6facefa45e1769d3619d55ea82316e0c808 legacy-trunk
+18423 74ee661581b6d47e86e544d2ba75b39b7b480344 legacy-trunk
+18424 35e8a29e54884e03ba52efa4641fc81f59aa972d legacy-trunk
+18425 c10426da7bce2420d59307d5ca4781e86449aac4 legacy-trunk
+18426 4c20379e663d4582bf0a4216baf458800f2557c3 legacy-trunk
+18427 99422d610db3ae96f3128b804deac82be6fea19f legacy-trunk
+18428 d38516ce6f1419d7e2938708443256c1ddf91df5 legacy-trunk
+18429 b3420b002d55cf7190a47a3c2ccb3ce01c8d655e legacy-trunk
+18430 56adc68e06f6913dc94739c5494df3283cc4571c legacy-trunk
+18431 d410f6ad3c6018eea314107af1b63a9853a59786 legacy-trunk
+18432 027ee9a870d2c233c8fd1556e5a8639237199fe8 legacy-trunk
+18433 2175e567bd06290dbba7280b280809647965a630 legacy-trunk
+18434 24074f97235c49d3b393d7ad1e6fa24a09660b91 legacy-trunk
+18435 4a9f1552ba68e0bf0398703966578503170c01a5 legacy-trunk
+18436 03c32faa1a49b4c7c5442c2a07e2c0be8621f260 legacy-trunk
+18437 58fe937f734a4878af449b9a599fb9ff8d46e5b3 legacy-trunk
+18438 96c3ae13ddca818b213cc146d3d17d3e641a9163 legacy-trunk
+18439 e0765c5512d719897d05aa4a43b2e475f1f5f667 legacy-trunk
+18440 31d78f361530cf0873e93416e620ad00942c2215 legacy-trunk
+18441 668166a50c7071b65762915d50341cfe44ea277d legacy-trunk
+18442 afb45b7fa2528cea904722b6d652deceaee40d3c legacy-trunk
+18443 6179d4afa4e4e5cff3c2562ab680ff35278e2ade legacy-trunk
+18444 b8f5b7267f1497c45638a1e2a81eb9535ab16747 legacy-trunk
+18445 67c24c74f18cc4344c414b22a7238c1753211acb legacy-trunk
+18446 b2a9bc91668a7f240f493a8661ed8204865aa34b legacy-trunk
+18447 ff84112dabc89523605822f0e7ac506698244781 legacy-trunk
+18448 ebce9b267bb8ea6192d199f1a683c83911ede4eb legacy-trunk
+18449 ce92230281648cfd5c05ac261977f6295b43c404 legacy-trunk
+18450 857a5400be87eadace870fa3832588eb0f67fece legacy-trunk
+18451 1e756f93bf5da1e97d38f23d2ba67bcae86cd765 legacy-trunk
+18452 36286632ff3a93cf23f92bdad9d8facb3f030aa8 legacy-trunk
+18453 52756f613c182a8b3014656a15879699a0a7861b legacy-trunk
+18454 9694909dbb0a79886c520ef28718c049bc26a258 legacy-trunk
+18455 1779f8574a83a0f47cb6e426ee42f69e081cf739 legacy-trunk
+18456 0f42f6669e802c2ef246c9d0c6af5ccea1f464ee legacy-trunk
+18457 59a45fa95318feef779085ec138fa7512c880013 legacy-trunk
+18458 3fe59ed11af10e541286f6bb942e0b72d1e1255a legacy-trunk
+18459 148b8c1b713a9da9a08b015cd5d4469847e77b86 legacy-trunk
+18460 d5c9dd24d977b8c70452b29eec53aef48e8deb9e legacy-trunk
+18461 6630cca298cc0eb9fcda72a5087c03a824c103bd legacy-trunk
+18462 53423ec0a72884b057f46124ecede9c203785f76 legacy-trunk
+18463 e23d5b2e228c42c238b63432d1524722c8dae273 legacy-trunk
+18464 987c74c8842897d6f836689e2b7a1d861ba14c79 legacy-trunk
+18465 15e1eb1019b8a37af488acf36debffb7bcf5b147 legacy-trunk
+18466 e1f2e3ec76d4fe6afbf46fc7d02ffa94f5f9cb6c legacy-trunk
+18467 f99bb6a92e84f781a67ebfce651287944e826b91 legacy-trunk
+18468 59bfbbe581c2d0ba9e76c84a71bb5bdb347cd988 legacy-trunk
+18469 ff0767753d813dc080b40cc160adaab55ffc2e04 legacy-trunk
+18470 0906c8e2c961c3b03f1b3aaf3f80c537f245bd48 legacy-trunk
+18471 ed315b55f19e62faf38cdd0374b7efc33a047556 legacy-trunk
+18472 2fe7427591ea967fc87b0d91dc269991c6d10b28 legacy-trunk
+18473 e57f93ae4fe9f6852c2ce9ba9708e117e41bc53e legacy-trunk
+18474 35749a557f1e5d6d0ba5a7f9b3efc502f13bcd96 legacy-trunk
+18475 7bb7b72fa6666c152f042a5a12edbf16a3864b69 legacy-trunk
+18476 0789dd062d6c0833d01fbb4ff1b423256c853e84 legacy-trunk
+18477 e12b650f0face6d1f87fde9cee91aff54922c031 legacy-trunk
+18478 052e372ce151c84777f3fdd9a28b0b212f4e5f00 legacy-trunk
+18479 d3e86ff893b1056d7e06517d1e9d86a5846bcc59 legacy-trunk
+18480 50d9b590627d64e36d29a0583bb74d73e89e51ea legacy-trunk
+18481 30ec873338ad15644fde7faee24661d0c9ea7d4b legacy-trunk
+18482 8262bfa514c2c00293e736d26f5ba8c67666134e legacy-trunk
+18483 f5949397c8a588ff6ed01d380ea469de145cb60d legacy-trunk
+18484 db69c092c906d397934b3023d67829b89311c7e9 legacy-trunk
+18485 50de3b198a6205b05700cc2a3b807ebdfaedb337 legacy-trunk
+18486 38f09fb18b8020c77a2c6c9d68a9f4dff3ec6cac legacy-trunk
+18487 538097199783986d34b75eae680ccd5d3ef672eb legacy-trunk
+18488 7e2bb994c2d3ac6e56302e12b8d3486423ccf6b5 legacy-trunk
+18489 7f22e34ce40e3eaa2cb92ec56cd7fa8d789e42cc legacy-trunk
+18490 50bbeedbce4a683ba3063f83bb202d82341786fc legacy-trunk
+18491 db7ee5c60af0b87d2306c0208649c766108d6750 legacy-trunk
+18492 552db8d83acd896d21d63bae6df0b9d67d2520d3 legacy-trunk
+18493 19756b9180416626f9548e782a136ec67fe11aa9 legacy-trunk
+18494 2a612ae2509592a2c38098c34aa56b1f711eea5a legacy-trunk
+18495 446f3f939df03976657e191cb3c2b9026df00b46 legacy-trunk
+18496 8385518697904d893b702c405de4249c929d6faa legacy-trunk
+18497 2d6e7689dc42057952bc62f2745dec5aac76693c legacy-trunk
+18498 7fb7c51a2e6162007c3eb3c5ad75c1b93aa4d2d7 legacy-trunk
+18499 7639a9552479e3093daca82d370ec0ae11656b8b legacy-trunk
+18500 7fb5099be20269bc50b723b573a0b8d8b903aada legacy-trunk
+18501 c4bec7c4d6ff64138dce2a2c80df64c2b8e87428 legacy-trunk
+18502 f0cda0d4b53c20826a8e583aa0301754757e736a legacy-trunk
+18503 19c8a2d3807d58da040eaa7d3ce6f388c1f847a1 legacy-trunk
+18504 63b80b77f5b2db309f9872a6eaa511026fc82d64 legacy-trunk
+18505 8cfe26ed728d942d0d52f1a45631dcbced50d9b2 legacy-trunk
+18506 c13f5a20ea312338a1fd69b34dde1a5ce28c1146 legacy-trunk
+18507 5b158fc0ed555a1ab1e84245193231a01901e672 legacy-trunk
+18508 e9f4b76699aa2310dcf1965c13387978558c1704 legacy-trunk
+18509 1a4a5a936f508ce5c547fa00844718908222a7aa legacy-trunk
+18510 56c74483b050cc21670ef57493e0e41935231419 legacy-trunk
+18511 2f178bdddc1637d1b15c28bbcfb91a76764865a3 legacy-trunk
+18512 927bcc315e56e8301f2c55e7b1cfa475967f9da9 legacy-trunk
+18513 3e254f56eef1cd5c4f2765f4219f89dd44c15569 legacy-trunk
+18514 82bec388c63629aac5b840a8a81d4654e8f29891 legacy-trunk
+18515 6405f30aa08c2cc5108eca6e33f7e39394a835a6 legacy-trunk
+18516 83d599652b622b539aabedc8a0df820753116299 legacy-trunk
+18517 173d70e72c9f65ae8a5a96d2ee8a417411db8c59 legacy-trunk
+18518 026a9210514528c4dbefdee7e9a6c235b7702f8f legacy-trunk
+18519 56ce38e575026bb3c2b06967479429ed66a4513a legacy-trunk
+18520 6585d3c04a29d8569ad64d68ba0af51cdf2d9277 legacy-trunk
+18521 eaf5a78bd2827118a26166b30903b4d64a812d07 legacy-trunk
+18522 afad65975a82e5c499ace310721832138cc2b7b7 legacy-trunk
+18523 5f3ee5f1b3d797f9edf48cbe2b7bb73773667842 legacy-trunk
+18524 1e4171717e77ccf181fc6c1d3b70892e9d843acc legacy-trunk
+18525 183d0bd2fd66dc2ec54a08676f420e52f8416e5d legacy-trunk
+18526 1690755c5986babd344055f6a8fddc86cb5feae6 legacy-trunk
+18527 90ea1e3eeeb14d343dd91a4b001db1efd1ea6d70 legacy-trunk
+18528 3d55bf65699addc46a0fe82612905aa528077459 legacy-trunk
+18529 8b4ca5da7dc265d876cb31237199ea67195ba6fb legacy-trunk
+18530 5c65e676f2996c50f0864b4f048382fa98bf9954 legacy-trunk
+18531 51b5898040514f83be74a734337714b9103fe98c legacy-trunk
+18532 c3c8bfad07ca32c329c8c2e93d6ec62a6f547ece legacy-trunk
+18533 277a7a15eb94b0536152c55eaed0c826e7a6710c legacy-trunk
+18534 67b3ac439f6402280f957c310915a35f2de84c4d legacy-trunk
+18535 75c3a64847c49af2076532f5bf53f10d044831b2 legacy-trunk
+18536 93a575bba09f6f85688a7b6eb67ce99ab548a8ed legacy-trunk
+18537 3f2ff38cc6574ed99c12180daeaeee4ed9e50315 legacy-trunk
+18538 29a2a114e9c9332c68d0b4014190e7d666651afd legacy-trunk
+18539 01a4dc31b579b24d1b667e4524b0e05d9a73b629 legacy-trunk
+18540 9c71add7e160818aecca27cc1b2aa936fd9d08e7 legacy-trunk
+18541 ea4832deeac59f17a0b753e065dc4871da2ae0e2 legacy-trunk
+18542 3ca702caa61aeacc6995d0cbfda8a862a4ee10f5 legacy-trunk
+18543 a519f207ed368723dc2096cdb8b4d08a16464ef0 legacy-trunk
+18544 10612cbb4623adefb96cf69de982bf0a17a5460e legacy-trunk
+18545 ecdacf517594525daa5b8e8c244514e309328a03 legacy-trunk
+18546 d6f86619dbc734fae3c3de475e5a9f1102c5c8db legacy-trunk
+18547 986d1c3ccdde91a1416c935e88ee53d29eb1c01f legacy-trunk
+18548 e8f5e61a8b9435a83659511ca14aa016abd92e4d legacy-trunk
+18549 84cdc89ac561f982ab7b98a3d46d565a60a74f9e release20-maint
+18550 175a3b17206880a28d7f416fc110c8ea2980549c release20-maint
+18551 556a4e53c269773391881c615dfa17a10d3ed28a release20-maint
+18552 e605624000bf19105069b07a0c68b246afb67a53 legacy-trunk
+18553 f41705304af442f32ce906dd2f4d8991146cf09a legacy-trunk
+18554 280a78ed003552808dc44cbbf7c576266ae19d4a legacy-trunk
+18555 6f1453bbd56902eb4fa75171101070f1b40f9ef6 legacy-trunk
+18556 139684a90041a0ecc89076a765a4bf61cd593e52 legacy-trunk
+18557 57a4857430ff5d25771d5cf2432537f1e483b99c legacy-trunk
+18558 36f7c09c2d7f243e6c3a6f5cf77fc097fe5a027b legacy-trunk
+18559 0c22af2cdd6fb37a7109894bb6217b21a2447f88 legacy-trunk
+18560 8e01417ec0017ab4e4f259647f3f64d83f983388 legacy-trunk
+18561 4b168eeb61b3b7c74c68bddbaf0ce62344f64106 legacy-trunk
+18562 5a5e9e7fb6b212709c45abbc8e64ec41b4bb5a6f legacy-trunk
+18563 1997dfed8d21d6d9f5ebdd4d5d0c8e8ef41165d6 legacy-trunk
+18564 f6ee0d4672d6296065d6b8816ea0815fe34bb310 legacy-trunk
+18565 612fb7727fa298e16f1cc944af3f8d666f958e93 legacy-trunk
+18566 b408acdcaf3eeecc5ff0f2a1bdcc80de7800dba3 legacy-trunk
+18567 bf9bb0e3dd3413f306762fca19be83da895196ef legacy-trunk
+18568 3075a153a083e229bdca2febaf01930e1e01f4b8 legacy-trunk
+18569 e2978c0b7cbd6921af96a39d341b0bf0a95207a7 legacy-trunk
+18570 161892bf7c15efe98edf49903efa901e2b4b531e legacy-trunk
+18571 a626e39d684dc23fa6f5f4aa61de7986e5d9f0ec legacy-trunk
+18572 2481b5fe86d6dce7ac4603c33b9515a6bf431916 legacy-trunk
+18573 901f38f7f6f75507752d036a2070407a5a1b3cd1 legacy-trunk
+18574 3693abd0eac1d41a47087e0276e754c563ffc189 legacy-trunk
+18575 2a305129d566ec143e4272a8b050bf285619fc90 legacy-trunk
+18576 4d978ad8fb05d604ea974a068673b72d8b90515a legacy-trunk
+18577 362e53f43dd2361b90988fe64c8282ed9438de8c legacy-trunk
+18578 c656f308aa1f87fcfddfa23adfb80b5800b52108 legacy-trunk
+18579 6e2ec8f7c871f74a3bec2ea1fe6127f1afa9d5f3 legacy-trunk
+18580 265f4ef7d7b1d0d625a34306ec06ad8d90683ec7 legacy-trunk
+18581 061252f5c7296cd346848ecc341a8ef62f48e596 legacy-trunk
+18582 ead8b5b994ad7ce612cf60ebc4602cef5e4aa375 legacy-trunk
+18583 3e862a51861fd6b6dcf192e17d8bf7d350dc5a32 legacy-trunk
+18584 ac7ae3ead88a44aaa3549af00b5fe7fe81ba36e5 legacy-trunk
+18585 2dcc4a86a876a71f7c6a9e737ac5a63f5c360a20 legacy-trunk
+18586 8e402aeca0a3d1cdf8dc34bfa0e5f478c7e9b239 legacy-trunk
+18587 db9f1893be01681667625aa348e3a8bc9d05542a legacy-trunk
+18588 641ad6c833be804cadf5ac805e2aa373caa302bd legacy-trunk
+18589 4dd0b97aa6e166928b0c5a5a26b90fd9d99cd099 legacy-trunk
+18590 2b3bc08d4d853aef40484f13d97a5a5825fa1bb7 legacy-trunk
+18591 d3c7ed15ce25778eb9511fbf1071a83d84ff65e7 legacy-trunk
+18592 a06415994cb56a786f61f5e1030094574bda7a03 legacy-trunk
+18593 3ad3004dfe6db6d9d43a866827754fb20600f323 legacy-trunk
+18594 00c6855d742a8d2a51883f68e794e7ceb8a96a3b legacy-trunk
+18595 317c203abee686cb6bda287abfa1d52e99f0fe3f legacy-trunk
+18596 85dc0ce0162e6f3ce656443e0a4640e6b89e7e15 legacy-trunk
+18597 6124cedf8438dc86a0f8395243fc94a16f36be68 legacy-trunk
+18598 27290eb9c5264b07b95c5c9dcdffcd546d91f308 legacy-trunk
+18599 76caf0855d1ffe7e971bc1102ca89290a99cf83f legacy-trunk
+18600 97821a46e000303a6b82c0923161fe0bc05fb0c8 legacy-trunk
+18601 0a77013c50aca2045b14884f58318075c77d3192 legacy-trunk
+18602 9d15baf7145aff2e505c0f2b3bf45aedbb1d8894 legacy-trunk
+18603 abb94609318e6c4340477d0f216b3b6223a4678d legacy-trunk
+18604 bf80866824ecb5ef8a78c59a3888ec119700c3d9 legacy-trunk
+18605 4c043e227c4407eadb09f1f1bd38899fdf24d4cf legacy-trunk
+18606 f5c04134f4e2bd7ad3a9dc8c5abca67a03b192f4 legacy-trunk
+18607 4dbbf322a9df2cfbb55890ac415a43b6cf2a6b75 legacy-trunk
+18608 fa3f537c8249c44aaf660556a5a1ed3229e27080 legacy-trunk
+18609 79f9e333316e6bcde2b09ac1c07ae4597a65d8e9 legacy-trunk
+18610 77c761cd1272e9b03043be5a26ab3d64362792e3 legacy-trunk
+18611 d67cfcc0683eda84fd1641555bb8e01952e4cf63 legacy-trunk
+18612 939b8fffc452e0525b380061b632868d355e6e9d legacy-trunk
+18613 c0822a05e923b6f50094d8590d4240ea819fd8b5 legacy-trunk
+18614 8d00f7555eec2782f850ca0fcfb98670ff3afeb8 legacy-trunk
+18615 7c8fac4ac31abd58c931babe26fe3c09f0043b17 legacy-trunk
+18616 a43a8a1f46ee1bb65c7473bc9be69e2a3fb5360c legacy-trunk
+18617 45979cdcd369739cbb859a85f5f6c5d655a49475 legacy-trunk
+18618 a9e15bcab32cb60133db7610f01b3d26e9ce152c legacy-trunk
+18619 a1d88ab023a0becd5defa50b8c3536f34ce1e729 legacy-trunk
+18620 a31c3868c812fce7666d124b8cb5445f6dedfac1 legacy-trunk
+18621 a56c000e579cf7e435671efcb8a7523738f52900 legacy-trunk
+18622 95ee79dfd746231867d7384eb0b037a4fa510481 legacy-trunk
+18623 def416cd923df22a8b1afda40c4ca649d8690d0b legacy-trunk
+18624 35e08dd37df137e1652856805e9395c2ea6cfe26 legacy-trunk
+18625 7b3f8e761a2d82db376c2833078b4859de1385cd legacy-trunk
+18626 6d8f7e1242c029d8162898c31d6646a05b203d27 legacy-trunk
+18627 d6e6a5cfeb3d6b7d01ae5fede6c4697ec428382b legacy-trunk
+18628 8745fb3a119172ad8eb3f804f9a0710e0f5fbf83 legacy-trunk
+18629 e791f4905d2561c27fda15da32e35ad71f2b70c4 legacy-trunk
+18630 fb143fb236d0af4b654f210fb688afeb4be83f9c legacy-trunk
+18631 18a6e6d9b4f88bef39f634d4be7c3506c024ec24 legacy-trunk
+18632 0868c361af5afda2ff2ace3901367936572ec1b7 legacy-trunk
+18633 edb9666c07c04a8f9e879cc3a9c45e5f09204fc6 legacy-trunk
+18634 076bb29a65dc4b093ccac3287b01845a9439d0f7 legacy-trunk
+18635 5d6fb7ff68c79a69fce44c04b13cac0cf1473c12 legacy-trunk
+18636 e8aad842473a4a5dbc19f5de780718ef2419cb57 legacy-trunk
+18637 4370fc19697e4a96930de0b9c879689e0e5ce0a4 legacy-trunk
+18638 5076544c338b139db9a6ca0839c50a1a39c3ad9b legacy-trunk
+18639 b5a37bf9d12da7a21148e25ca7af66cefaa078f1 legacy-trunk
+18640 c669c29d1b8cdf9bdd80a283aeab0b79214e2320 legacy-trunk
+18641 d646d606892430d16222c5f0ff584fc0ee036a09 legacy-trunk
+18642 b1c5778480a19f95637b0ee1843ea75fd30a8922 legacy-trunk
+18643 ab53524442057eda0e228f82cae30f4979ad6bc6 legacy-trunk
+18644 fca2cf850e4acf122b4e1200a2efdc0b1353a2c7 legacy-trunk
+18645 78c4b63b5b9d354f72e3d69f409d9639e6132ce7 legacy-trunk
+18646 eff11fac5f3639a991c24126ade5ec6b464de94a legacy-trunk
+18647 83e146974b72a4a97f2860b22f5385c063d98c9f legacy-trunk
+18648 b31a046f88a7724129eda583ca7d8439de0b8bdc legacy-trunk
+18649 ddd3d8c2cca0528a8ad52947efe0ed1dbb1af8ef legacy-trunk
+18650 9e9556924b0a7421e8cbb4467bb7d3edd08c92a3 legacy-trunk
+18651 1db3ca9530c2863de7bfb0bd099d7df1b6fc5184 legacy-trunk
+18652 4854ee585e0df881c802560856b68d0d24bd0a60 legacy-trunk
+18653 013179376fa35e53e060ee570f79e11550cad09f legacy-trunk
+18654 0fdfaaea5e2f9031ce301a818ba3a0e19cfbe439 legacy-trunk
+18655 b7d5f68be017f4c8039bb857afbdb19d92f2a199 legacy-trunk
+18656 63c0483eff68ff8d22744968c5fd6828c6b3f88b legacy-trunk
+18657 b57e3e374314e353b5a870aee6f7d7437bac5425 legacy-trunk
+18658 edd19217b39695da9ba76976eb7cc846d1329650 legacy-trunk
+18659 d027e85e209f7d84d19dfc8dfd53140641bc1f63 legacy-trunk
+18660 5a308a9f99a56647fdb3c2d3a41cf824ced58a37 legacy-trunk
+18661 3a260274bcc6a15b4ec6702f8b10c3139d7a9fb9 legacy-trunk
+18662 228ffd36a0ddc739e0b793a460484fa667a00a3e legacy-trunk
+18663 eb1767b068fec2276f732a928e4d16d26c411709 legacy-trunk
+18664 9b6814bfb2c0d9f5322399281ce9acab11836fc8 legacy-trunk
+18665 37819a777fc0c49ef430e47a0ca3d3d791626fa3 legacy-trunk
+18666 5415804fb345c69224bff17f91fafd85bbac38de legacy-trunk
+18667 3b9b8f2ddfe796bcd87308094e9782ed4b38dad3 legacy-trunk
+18668 22fed2b15a54b2b5c1a5684aafab75f6e235b2f5 legacy-trunk
+18669 37d12021df05113459741b82f4533ebdb68124b5 legacy-trunk
+18670 f9772f87b13e3d0fce6da5f7ba2507fedd68bb66 legacy-trunk
+18671 954611fd35e1e940d46cf126ebc1ba71a4f938b9 legacy-trunk
+18672 1a00d21910c89f1b38b12a8653c1a262d6e5799b legacy-trunk
+18673 a563eec46c1abe91f6a13c00a619002316c19623 legacy-trunk
+18674 064026dc764e89e50e7a80aa7b1efdad48305f09 legacy-trunk
+18675 faaf9f10d849439e7913c9d452860d343c3247c1 legacy-trunk
+18676 868d2acf745808c9033f57cd5829d97a69ecf56e legacy-trunk
+18677 c68b06249d8a21467a7ae53c5f3b6c4bebad9a04 legacy-trunk
+18678 645f8fd6fa9dcc59951cc2d29d269805288f07e8 legacy-trunk
+18679 2d399065624800418260ef7f9d43bcec985526c1 legacy-trunk
+18681 79770ca15c5a9f52914b162cb901e5e4b3ee70a1 legacy-trunk
+18682 33b444cbadb992a7e57291bb9e753913b87a6bed legacy-trunk
+18683 0f22feb9397db9b1b807fce604d7f86d94a0678e legacy-trunk
+18684 c7dfba0db8790b004d11fbc3b5ba5571fbd165f6 legacy-trunk
+18685 9821777f8dad6c0f45f32db8353ea99071dcfff8 legacy-trunk
+18686 7f7ef9447e59fca4b8e20a52bdd3153357dfeb04 legacy-trunk
+18687 4328ffe647bf7beafccdd7558138ee2d8b783983 legacy-trunk
+18688 174490e924d47f192bd98fa8dd2ee53d69f507f2 legacy-trunk
+18689 81db92e80ea8863db999fc9eeea364fcf72557f5 legacy-trunk
+18690 05ad297e144fe97de52ee02b750448880c120cd7 legacy-trunk
+18691 9308dc8c85e035c444b5d4fa7a2991b17401307b legacy-trunk
+18692 e00f718e4d8ab395e68194e3dcce158e7ccfbda6 legacy-trunk
+18693 9a2385ee1d99446407617855c84d624ee6bdd932 legacy-trunk
+18694 0ae389e935fc416eb87437bcd35ce39188148c3b legacy-trunk
+18695 7ea30a1634636d8feac2d64e8bb58c3cf9c2b11a legacy-trunk
+18696 6e329f3e17f0e539a628d88d30356ba1d6f28153 legacy-trunk
+18697 b1b0a703ec4e6a3b0673d13d2b3bf15740b6eb71 legacy-trunk
+18698 0e4f48c5fc84d8806053d9c685539086347bdbdc legacy-trunk
+18699 bb303a76a47837cf047266bb4679e7b4cb6d1556 legacy-trunk
+18700 67c8abd21025a542fea7636cc83a1488e5705755 legacy-trunk
+18701 3b643653e07820bf5735b26d56a6617853ebd879 legacy-trunk
+18702 7d5025bba037c6c4fa51091b988e595a65a9551b legacy-trunk
+18703 17eba7404099ce53d3f5862141adbfe293e2d1dd legacy-trunk
+18704 f6cd36498a503f3165167312fdd5ac866a88c292 legacy-trunk
+18705 601c53a9e49df1fb20a92e8f641f0c6d22e0376d legacy-trunk
+18706 283356fb6efc759daa79d451571844d0e2227a6a legacy-trunk
+18707 210bbe53b6d4ac78bdeb474733d1a9493be70883 legacy-trunk
+18708 d41f9b0a40caa6147895ee4ca2576a0efb82b517 legacy-trunk
+18709 679d50705e0695e1166b4352120bc1ef43ca75c4 legacy-trunk
+18710 405a597358416d02a40905df492caf6a49b04e69 legacy-trunk
+18711 17d3a63e22c7428390f8221257c2b87e3dfec8b2 legacy-trunk
+18712 c7042143399f31844a2d0a22421531203fce406f legacy-trunk
+18713 a3c1a234cee718414cc27c8ceed0e680bc3ded10 legacy-trunk
+18714 0d8b5b3d9d83d066ced681b99e3a2cf62e6c768e legacy-trunk
+18715 a84b53ba90c41dbedca33cf436227eeebcea6f02 legacy-trunk
+18716 fc765464b178012c7cc2ab9b42481b71bd0bd59c legacy-trunk
+18717 152d0071800609d50b0ca4e962fee7a778523d95 legacy-trunk
+18718 8c71409ac0c394d196658698e89541de52215a11 legacy-trunk
+18719 0a8da6f397b78f5818d90787841709dee8b0da8a legacy-trunk
+18720 81e3d8626adf0f790579ba8951104291aafec2ab legacy-trunk
+18721 31967a23360092a5c87f87db09f8482dbc1baa48 legacy-trunk
+18722 083a5c75ed90452213b484604608962b8d22c1a9 legacy-trunk
+18723 e7f6d54c014d341ee53a375c9f5e7aa1228c37db legacy-trunk
+18724 fc1e5831fe1077b7821ee3d5ffe0558f9665c6ee legacy-trunk
+18725 71b19d36aafa93feb003c214027902a73db7259a legacy-trunk
+18726 1b03f76ab03ea74255eb75452b96a4995b94c8ee legacy-trunk
+18727 5578e9b424d4aa8ddce56ea0acfd2dc04bbf324e legacy-trunk
+18728 70a59e3fb278bb520e97137bccdc55a8d88d69fd legacy-trunk
+18729 f5a3d98a35bc4bdc74a84fba6eed859d0f07ad29 legacy-trunk
+18730 3060cbfa01be6dfc6fdb88f0f5c10b73bbfbf06d legacy-trunk
+18731 1a4c1c0e14a13f595265ab64cb14cc49138661a8 legacy-trunk
+18732 010d0385354646f1570051f1936f65074331de0b legacy-trunk
+18733 62aeefa01fdd554e30b505e5e037754de71c54e4 legacy-trunk
+18734 3685ef2a55a48e3d6c00a918ebaff730f3b24df5 legacy-trunk
+18735 3dd217fbdd59b1ed268372187dc81d9f15809eac legacy-trunk
+18736 4c01ee0a8073f9de48d2c0f57d8baf8f5d637113 legacy-trunk
+18737 195557a0f050b81272e2a5a6157e10734a9223c7 legacy-trunk
+18738 a33de23b3066fbcdbb27e916f42e840887ed83ae legacy-trunk
+18739 93d0567c9fc9cb1f14e8372f111f3f5ca8d23e9b legacy-trunk
+18740 751215fa0da7f3c31267465f4cd0967581b2a01d legacy-trunk
+18741 90992c82d46e9fcffc4f5af4608114cbf046fb39 legacy-trunk
+18742 3ea10ee91e9c5e5d499b84b0098d12a4dce3eb1f legacy-trunk
+18743 41546353255c7f0a9b84345df10a4128c5c4f17d legacy-trunk
+18744 190d14b70c27b8f55320c5992441b101c447e73f legacy-trunk
+18745 f47d1cbfbe706324b9a6e3d68f3f5239d20eddd6 legacy-trunk
+18746 7cd46ff89bfc3b0effe18c8954c6fc96afee2689 legacy-trunk
+18747 e6a0fd54b6072fa84a28ee5690a280a3ee2fb36e legacy-trunk
+18748 a7025f0709c5b99f9508b8226c1999506144a5d3 legacy-trunk
+18749 f83115edf16af6ad6b47e87f0feec95bac7bc9c3 legacy-trunk
+18750 b53206295bdfef754242952c4ac24fd939802d0f legacy-trunk
+18751 b0ba46b16e075094fb044c95eb937d542aa724af legacy-trunk
+18752 7cbe45d79ab5c0bd062072116f17b22d79687390 legacy-trunk
+18753 18c4c7ca93ea06a19cb33171abe61bf5b583c8ba legacy-trunk
+18754 8ef31a039a9640a05751a136612ebe98b5966733 legacy-trunk
+18755 553a315f58e92fd132d14d6ed8d87b7cc758cca2 legacy-trunk
+18756 1c6b0d3a58eadb5567fccddbd861fc7d94844c45 legacy-trunk
+18757 8764dffbaf234e19687f229fc81da43b9d33e774 legacy-trunk
+18758 c87e2a2e335d0a2902625b52e1ddf4fcf2110fbf legacy-trunk
+18759 c568ba9dc180a2ca230924f514a012d98367dcbc legacy-trunk
+18760 8366fcfb60904cfb5faf683d6241c9528bd33aea legacy-trunk
+18761 152814f6cd1133e7b32a2776afae724e3348822d legacy-trunk
+18762 1129e16a11dfb357917d5a6a8c1d142919711e2e legacy-trunk
+18763 cd83f7a9cdcd1f3159e6391ba16c106b60ec0a1b legacy-trunk
+18764 eef321b6e41ce663c686b7fb6398fa6fd38de6e9 legacy-trunk
+18765 c9ddbe3407fa4400da9accff4f07e75e29b3881a legacy-trunk
+18766 149458a5740af1f596d5aeb78b8bfd185a23e6c4 legacy-trunk
+18767 13e5eb006eb321bbfe4939c32a4174bddaac50af legacy-trunk
+18768 50890e3454c950a88eb4313e504ba6ae8a1043bc legacy-trunk
+18769 1325bde94896dd5dd36f859f151152c3fd4247a7 legacy-trunk
+18770 98e95e0f5bec745e9e010279fe7e0af967be95bb legacy-trunk
+18771 8db319ddfb379e7cf6a779821731086916ede529 legacy-trunk
+18772 f7f3be3d00b9c9ded6c4fb61034d1eceec4b2cad legacy-trunk
+18773 a8edb3f7f4f83b95a053bed054135c193f01f06c legacy-trunk
+18774 e8246440a825c94dea9ad279ff6f6bbbd3148366 legacy-trunk
+18775 d7d166550c4339faef98bb2197ac23e87c0862eb legacy-trunk
+18776 88a1267a3395eaf133e1984915b02d6cfec86746 legacy-trunk
+18777 18511e1128700d1ed5b8d692e9bfaf82a0bfed53 legacy-trunk
+18778 ae636b8ac4808df4bba9cfabb94821133963ff0e legacy-trunk
+18779 a38190f71bf2b5f577ab5233d0fe524e5381e330 legacy-trunk
+18780 ba6d4b52180a77ffdc662130e2b562820a77aba0 legacy-trunk
+18781 be257a7553a2271663fbd105d3f1666d2e49e074 legacy-trunk
+18782 007f7faf62b20318f27da0db1b484196d433545a legacy-trunk
+18783 489692e79151432141480e1cc04ee862f00d3576 legacy-trunk
+18784 fda9f86dc4e84455db939b56b70120dbcc8418ba legacy-trunk
+18785 ff6c30e8ca73c869cfbd12c440fc90de90b4fe43 legacy-trunk
+18786 702ed9965228bb07b60a7f7f0a50e6a626e324ad legacy-trunk
+18787 9d5beed0b93fdf35acf21195f56a9bf4d4d37f2b legacy-trunk
+18788 ac13cef423c833f5d12797232031513694152478 legacy-trunk
+18789 c959f4b3efa11ae49a31796b8adaee2b271ed85b legacy-trunk
+18790 1872e609a634c02c143b187079c5b52c443e1cfb legacy-trunk
+18791 a484593cd407e1c661574a071fb1ffa186753d84 legacy-trunk
+18792 14a27acc755ab4341fb77cc8c66d9ee422710a0b legacy-trunk
+18793 dc3b9a581686cd8c4c4a92dabb21a46e24872745 legacy-trunk
+18794 1881b968989b88da73db84650537455056d6dd1d legacy-trunk
+18795 35a4194f9ead9b96fc63f52201ee722599fa4337 legacy-trunk
+18796 b1a5edb80f5cfcecb5b316ba26141187239b4ecb legacy-trunk
+18797 0b0fce14d4e8826bfc6bcab31dc8b77491579fed legacy-trunk
+18798 bec0f61cfcd56e0634db7f7e314982a44dc78628 legacy-trunk
+18799 d9d0dcb735d7f7ac457275d1c1507a014f8d6fbb legacy-trunk
+18800 8fd221aed35759bf09deb8362049ab72cf4c0837 legacy-trunk
+18801 867a4a6e7cda877f87b6ce00d375f828c6b49e1b legacy-trunk
+18802 ea464eda61584b89894230585d1a34446b2734a8 legacy-trunk
+18803 5abae795742ea96937dfeb1bed26e863d0050e34 legacy-trunk
+18804 64390ceaac1af9cf968fc00fe431675f58d8f859 legacy-trunk
+18805 5b063baebef8c6d57cd94fdf1e050e208eb52089 legacy-trunk
+18806 f464a03be85ae6d912aabe0d5534fa1af8679f1d legacy-trunk
+18807 2edf5ed305839b1ccf2541173e618487a4474d0c legacy-trunk
+18808 4f621708514b1aa5f21a06131041259efbc009dc legacy-trunk
+18809 6a85248b439eaa3d908ec13c62e098b02ea6b535 legacy-trunk
+18810 3bc2440427d331cfd217a90f65d636ffe70438b0 legacy-trunk
+18811 76ad2a9a3e534e1c0564b46335339adf5adc20d7 legacy-trunk
+18812 f2e13895bda7df51807716fd0ae01cd0ea5c09bb legacy-trunk
+18813 db26b43c924f30dca074ebdb7352452753117e86 legacy-trunk
+18814 1f92d63b20f023107fa59eef40799784e8ff6329 legacy-trunk
+18815 8349b4dfc51ade63d24fc9c0b271f21ff17ce530 legacy-trunk
+18816 01eae40857d83dbe59aef839a8683f9edf4a6738 legacy-trunk
+18817 283a0b2aadc5f2aa94abf3fa6cc63b746eeecfe3 legacy-trunk
+18818 857aad842ae7d99d1282f30dff08ceafcc09833b legacy-trunk
+18819 c1a8deb15f0e066ee1a10a1734276070a0bf31cb legacy-trunk
+18820 c8205552dde1eb68de0c8bb5f656a941a9098e06 legacy-trunk
+18821 fda3ff19d1c4a969ea64854ef243dcc5db7b3211 legacy-trunk
+18822 d73b21dae29a2ee89893d04a964f392ac0ea4aa0 legacy-trunk
+18823 c0000bd6252c68032504d14f214735a81610bb5b legacy-trunk
+18824 f1751abf771ffc4acb61199632c2a1975ea945dd legacy-trunk
+18825 cf17a3ce538743ed23af32ae6d0caa5a4715ee57 legacy-trunk
+18826 dc8a30b8887c8073be5a7d22d9e83e78c553be64 legacy-trunk
+18827 5abb47304bc7685e690c5de0829a5f99ca233dc2 legacy-trunk
+18828 e59b835ad89a52ecf971c24e5cc1f264de9b1a89 legacy-trunk
+18829 dcae3e08d84848573c2f2bc97444e77d9b3c7f4f legacy-trunk
+18830 5bba85d49e5af8b6c294d4aa19ffba2a791058d9 legacy-trunk
+18831 e21da84d0c65f0a102424ed8d868c7795d14d4bf legacy-trunk
+18832 77008f07ce25daa03c472837a5aae677a4b13667 legacy-trunk
+18833 ff9c79bbc3eed1b2156f7a2e777b4dc4d6237016 legacy-trunk
+18834 889b7baf8bbb4b3c9dd2036dd58d4a9da7841763 legacy-trunk
+18835 72139263f8a79752d231e8d399c0446ad5009936 legacy-trunk
+18836 5b9103e62fac3da4cf2825f9c3a7c63faeddc90b legacy-trunk
+18837 54205828b1e173c6f92e8f2d9a3341dc8260ef2e legacy-trunk
+18838 51fc45276a433d7a05b5337cdba679a9ed302f26 legacy-trunk
+18839 f16545f58345608b5adce843734907cc410f1237 legacy-trunk
+18840 24dafbb0db58f662e5e0e3b7210afe876ab4c4e1 legacy-trunk
+18841 a36a4932e399135c15404d6576ab9ffe5b825d6a legacy-trunk
+18842 afae4068d2dd98828f23c643946d52d2dd0cb284 legacy-trunk
+18843 d1cb4138fd34a4a969752074b770285eadbcf5cc legacy-trunk
+18844 91304c4c7256f83d60275ca38ce5a858660305b6 legacy-trunk
+18845 2b29319ae6819403ef033c18fcb01ff3df380c7c legacy-trunk
+18846 6c1751f6afe23e0deb434b45afb4b54032749de2 legacy-trunk
+18847 17f23f8cd8c77f2d5958c533afa802c048db6004 legacy-trunk
+18848 bd5aee6b8390d4db220f393c71b240da3beceb8d legacy-trunk
+18849 5fb86507519c09d9adeccc1fa2c554e69472f668 legacy-trunk
+18850 ae29a89b77c3a1264de853e28783c6ccba07bef0 legacy-trunk
+18851 1f1eff081a2a7512e822d9004e38fb8af509cf3b legacy-trunk
+18852 3f4b6002c07d313da6373c9b5b97e1db6b1bad60 legacy-trunk
+18853 62084cd957bd6d4d2481f567abfad6d2414dc986 legacy-trunk
+18854 aacba37476d426ed2ca65d2b986b2a7b03858292 legacy-trunk
+18855 eae26117986fa4b8b2225819b45e75f910608719 legacy-trunk
+18856 f9a15a583c79d9a619075d23af8860e57cef39d4 legacy-trunk
+18857 88325b73a6a3b12966a8e3ce846f7084c3b94f54 legacy-trunk
+18858 c503fa9b265e22be2e55ad4a5cdd29ee9714061d legacy-trunk
+18859 6965c205b60364fe88feb9536a8ea842db58801c legacy-trunk
+18860 f390f43ac4b649a9aa833fbea2a2c59b7c0b51c3 legacy-trunk
+18861 1dc02b2295a974695ec4a6d4ac2d93db28d2d915 legacy-trunk
+18862 3f61ef72aef3506e27c4eda20b25e2acc44fc651 legacy-trunk
+18863 f3740674ac5bf3299eff956ae8fa2971a628716a legacy-trunk
+18864 e1e76fe3cb53b1525ecb5c7c084bb7cc9a8d335d legacy-trunk
+18865 e8ee0785c846868cddd4873c615ed70194b6350f legacy-trunk
+18866 9251cf70ed1f8b5ed5b3c02bce1720d9fe0e5842 legacy-trunk
+18867 ced8041eb4ea7da95546bd74139736c34bd85ff0 legacy-trunk
+18868 51811d78a9daa64fe59a3fa5a46b6c0f2775e66d legacy-trunk
+18869 32352e120c379482c18812d9af264561051bb198 legacy-trunk
+18870 4c856a1804587b051770549b8f4dec04657b8995 legacy-trunk
+18871 2df4574d90fe6d88840ce7b8cb4068e70fd35e38 legacy-trunk
+18872 33f5ee6a0ebe749ff45df2ebf806945622696879 legacy-trunk
+18873 d90eeab5f9a418edf8313281419f75ac63af7906 legacy-trunk
+18874 8e4dfb681689ba0c3f6ee4d9791331f1a559faa0 legacy-trunk
+18875 9bc754413a8c2da3dbd305acb7fc45a07c2104bc legacy-trunk
+18876 754ecd21fbef65e2ee15496575c42b9aaaec21ec legacy-trunk
+18877 c832ef72499db3bd55281ddb681c34adc1146ca6 legacy-trunk
+18878 8ca6d8cafcd37674f0c2f18f6a1d64d70cfd189b legacy-trunk
+18879 7234d7c3c29f975c940403827ae238c84072a49f legacy-trunk
+18880 21e7a18debe681b5453fbdb0666571e0e24c76e6 legacy-trunk
+18881 46f772c6a2003ce9212d7bd6532b3a29d18922fd legacy-trunk
+18882 7c13bc7c485fa7e1a46f7e30c697ec7165403682 legacy-trunk
+18883 cfac2245a2c72e11f009a343176ea381bac697cd legacy-trunk
+18884 d7f53f12dbee1ff91f7df76acccf3fe96f6a8caf legacy-trunk
+18885 ce0e41ce787fff93d50e6535e0ef4bb10a91879c legacy-trunk
+18886 0f8127366a3f7be271745e50724fd6eba9dd1581 legacy-trunk
+18887 5dc1773c7f7c97e07e8283f7d9523f2c662ee6c8 legacy-trunk
+18888 865266011dfa92a2b1a00c1ea96343654e2f25ae legacy-trunk
+18889 5988f76480d6d9fa8740aaf1d10df6b9a6940368 legacy-trunk
+18890 83d33f7e9fd4574788eb76a9778ff59bd1c8da02 legacy-trunk
+18891 55d89a8fe963feb17b11c35e390109df03e9ea17 legacy-trunk
+18892 8ba8909fb82304ecc97e96cd7d2fd27b91780a9d legacy-trunk
+18893 1bf5d8b4cebe88ed092f14979dde2a39524360a0 legacy-trunk
+18894 5ba45916afc7f075b2e8a31abd0c532cfc7d8d46 legacy-trunk
+18895 76155112187e0addb15f35ff01a79129b27510ad legacy-trunk
+18896 19eee2db2b16cb5849943cb2e16d3d81f2796787 legacy-trunk
+18897 1144afb94019cda09fa925b54c999272a92f7e65 legacy-trunk
+18898 73c41b49a9b80efed48cd1e2d884e91ce60e339c legacy-trunk
+18899 ba295e2c73ea608bde1d8e57d2c9d50dda28d5e9 legacy-trunk
+18900 b6863ba8898962d59c9d86bc6e9adf27eb9ac4b1 legacy-trunk
+18901 4a6658e18f36f100c694c1e7de7fa68899eec226 legacy-trunk
+18902 63a0a6d18a604256848b558dba5c534ca30c344a legacy-trunk
+18903 30e31c2ab60fa59bb830b0dd7f4877222bd7786f legacy-trunk
+18904 78bd97d8413ccf7bf7b443f15e60d43333982512 legacy-trunk
+18905 8bac0659393ebdffde4766b85378e3af453bf718 legacy-trunk
+18906 35dff4712c8e625a6dd1649344f709e26ee84a2f legacy-trunk
+18907 3a56f65099aa78ddc842eb0d23fd7d930c50d9b2 legacy-trunk
+18908 7937bcbbdd24a08d8fa647eb246330dfee220b2e legacy-trunk
+18909 e50cfa5475f34207ce191f71a7dea1d065f536c0 legacy-trunk
+18910 70bb1119044aceeeb307d59e5be12173e39c94cb legacy-trunk
+18911 bb805cceb40300a8403e5732b3733ad2b84eb21d legacy-trunk
+18912 e62d5aff0c3af1d2446538d8e919eb6b55674242 legacy-trunk
+18913 4798dc739c19a39f6411bc9fc7e1ce6b800d2bf6 legacy-trunk
+18914 75a21c230a26819f1e7778ad8e3f12989f7ec808 legacy-trunk
+18915 aca05d75d232f100d96802a2ad1b2da4d9b7f7ec legacy-trunk
+18916 4cc9a1ebea628ed1846d24799890b138bdb6e828 legacy-trunk
+18917 64fab0047a14292a720a96fa75e44cea832157dc legacy-trunk
+18918 883c7f615789099c64e57bfc15052d445011f956 legacy-trunk
+18919 e3259e4bec606392d740346036bdea1a08d493df legacy-trunk
+18920 4c40e9d74c5aa5d2045b80952726a3aa7a94d22f legacy-trunk
+18921 564bc242ff0f083eb2b6bc705067ef35a078483d legacy-trunk
+18922 596edf8129a0780d5686b4340be5cb891a0e6669 legacy-trunk
+18923 6b647a5d5b7e391ee92b17cf03eb311a9bd4fb99 legacy-trunk
+18924 afc6f1137ea47c924270647db68242385656ae94 legacy-trunk
+18925 81285f545d546968aa1e33c92079d2e5de22620c legacy-trunk
+18926 a97aa923877113c16561d5867204b2c415ef506c legacy-trunk
+18927 c29da2c14417d8e069ee3e557756cae0760aa8fd legacy-trunk
+18928 d9b69d780a160b052c5bac8b3ad3de4d32e79bfe legacy-trunk
+18929 fe36ab4b3e9732543ad26fcf1819ff4255b05a5e legacy-trunk
+18930 4db664389415202db9a91ae1bdbf6dd7003d95a0 legacy-trunk
+18931 68a803b4d6182ab4c72a5e0a2fd10c56517562b1 legacy-trunk
+18932 b5345e99596bea9844b7057e2510d135583f3ba8 legacy-trunk
+18933 af7d7914fbf99bcb243cac17df21bc2d92339aca legacy-trunk
+18934 bae889f44cd1fddd225186de92bb9f11ea94e764 legacy-trunk
+18935 713ed6c6bcb534fd3f0e5408a3fd818cc327335d legacy-trunk
+18936 7e55fa93f4dbc28790e4ac030d669c4b4fba037f legacy-trunk
+18937 50bbe811b344c906525fc4afd0c10926aa9578d8 legacy-trunk
+18938 eabd008b36ee7feca7e2be86486fdf3a9ec16176 legacy-trunk
+18939 2d3e60179d7afead7160e4cc0370be65d98b384b legacy-trunk
+18940 91a63df7eee418d18716b851d5cc5198b14469e5 legacy-trunk
+18941 c4355905b044de10d5298c895b8fc4e64cb771cb legacy-trunk
+18942 93f836432c2bd2a028d123a59d568a3399ad35c0 legacy-trunk
+18943 1b6e457d03ab6cb5e3283ef264a80879509f3721 legacy-trunk
+18944 e2b2b043ab4ef9755117bad5296cc0a8f6ff59ae legacy-trunk
+18945 abfb11f8e051a013c3822bb9c45f4f36e5c2d2b2 legacy-trunk
+18946 4c307a12dcb976a471666a653158e7780fe2cd48 legacy-trunk
+18947 d56b49265310fea4da655107240bc079578cdc72 legacy-trunk
+18948 481c3d50a4e5557c5b5c715cea48f6855e27e822 legacy-trunk
+18949 263035bea3af210e2448989c7423044b0f29949a legacy-trunk
+18950 dba83809a77507713023417e24a1fe56c1393e26 legacy-trunk
+18951 6e143af84927a86a158b5d3145140f2908defae3 legacy-trunk
+18952 8ac40d48a5814bf971bafe0111003303bf5f433d legacy-trunk
+18953 45c065668ea5c8f99c1281b76dfa4ec7c5588147 legacy-trunk
+18954 f3f6b7598bc5a052362467f913c23a146fb8cb67 legacy-trunk
+18955 0c1acc15455f0b4b0e293ce10dee8039e7cac867 legacy-trunk
+18956 ca46d3454269e69d7aaa5a930ed5a1a6c5f6ec42 legacy-trunk
+18957 ab02f1741a28c7cc1707cde1607ae08692240c86 legacy-trunk
+18958 fb67122e5c1edbae7b511f736f096262b3cd9b0f legacy-trunk
+18959 e3536aa7ae4ac4a4a1a5e1a36cc60e80adaec6de legacy-trunk
+18960 fb767a44961e71925979a3a3fb28969ef9f3931c legacy-trunk
+18961 967abbecc4041a22e11326423d91dc1678f4e7aa legacy-trunk
+18962 ae296229f426957e68b5d44c9841914c0b08bce6 legacy-trunk
+18963 3fcd7f465f349fcb8f6325bf0ada80e1ff09c3bd legacy-trunk
+18964 7cb940c156451ee3e50e265a6ee1e20a9075c7b3 legacy-trunk
+18965 e0418b1f5cb7cb170d2259f7fa5807e73c4471d7 legacy-trunk
+18966 bae9abadee22a4883807db6a1f6dca823b4a254d legacy-trunk
+18967 d69571bf784267bded744f87e4b86ec032f52beb legacy-trunk
+18968 28c414dcb3e18e543f000916482da9467b0155e5 legacy-trunk
+18969 dc1c57714b3dd4f243f60cffd1452a70af53b24c legacy-trunk
+18970 28d8ccbe237f683d21519681a3d501cd292abe87 legacy-trunk
+18971 4d451c92bc50b2d6445a9f618ecc1ad0bb965c91 legacy-trunk
+18972 140d45aa09dc09d601e794cc629501589f0c5f8c legacy-trunk
+18973 e0824b3544fbee81b263771dcfbbce4059eb214a legacy-trunk
+18974 a059d13605a0e1799a2c409027ad79f812a1a831 legacy-trunk
+18975 70666b27c1b1acdd712f3faae71a5db08c7ea558 legacy-trunk
+18976 44fd1a7cb27939af1dea4f4847b1870ef92fe3b0 legacy-trunk
+18977 3e13524ed86cc0ec34fa519d7c406b9a69f93438 legacy-trunk
+18978 60fac62f6c15ea060086ce4aeb3758b32a0dce5f legacy-trunk
+18979 8e012ae9a042327a7d51f99a80ee5da053a0a61d legacy-trunk
+18980 64545c986b98b26f0d4228e0832616e6d6f78986 legacy-trunk
+18981 92b214bb42884858416d5d90ddccf638f514ecb5 legacy-trunk
+18982 e0523a42c78cae92eaae86701535108b55a087cd legacy-trunk
+18983 f6d8a13929d7270524451632ff769b60679cc4b9 legacy-trunk
+18984 239c7372c3d37f8ce4b6491b4c965912a5d2e663 legacy-trunk
+18985 f997ded4e219f30adb0b8944ba6b30a52f74d2a4 legacy-trunk
+18986 4540e418b83ab4f1085163ae1c01639b894dfdec legacy-trunk
+18987 548e7a5429185ff0aeddadcfbf3d57402c3dade0 legacy-trunk
+18988 fbf07e1f3ca071d9270e712b432f7d2e021e78ce legacy-trunk
+18989 6f1fd8500398ca91d9fd96d5a99986b03134e9c1 legacy-trunk
+18990 d0864902c8c7d8994fef4e95101d043a2d42399b legacy-trunk
+18991 56368d3508de560244490f8855815703de22258d legacy-trunk
+18992 a9e3a52815e2bb3e0ebe7bf5ca186a569525fd88 legacy-trunk
+18993 aa03c20e89b7aef92d85b3b61fd6ccf4dd1beb9f legacy-trunk
+18994 8f6552c7030d054fa0eac8ddb2456a95d51862e1 legacy-trunk
+18995 d48018b33e357f49fdaba0061b9c3b27435b44ee legacy-trunk
+18996 a06b73ad371ea7760f5c433c372ee349545c240d legacy-trunk
+18997 513e59b3b9a90b4250f6ff28cf4f3ae67972433e legacy-trunk
+18998 fa9ef0e2dc07dade3e75a2e73a3f0d0003072ff8 legacy-trunk
+18999 883cb0e31bb2b3f53a2da8259755f32680bdc1bb legacy-trunk
+19000 49b7c1bc6004293be22e4a0a0cb2879897ff4ba3 legacy-trunk
+19001 d96ce9708c007c7dd28f0fed95fc4323f43261c7 legacy-trunk
+19002 38dcec06617bdfa1f52b8ab028abaf7405bde159 legacy-trunk
+19003 058bd1bff0080e59b02c51a50e071e97ca76d58e legacy-trunk
+19004 49f94a2b1dd40cf9148840391dddaac110ce4074 legacy-trunk
+19005 6aa972df80d5762cf247a0023dfc383e61c5f203 legacy-trunk
+19006 d12bde4b2ae92cd1efdd9c71338c0df18f8cb9ef legacy-trunk
+19007 26e831bb0d6ec688c50a9d44d2417a0ab56946a6 legacy-trunk
+19008 cd9dddd897a9553e2f86b22e905d37b32b3ec9b7 legacy-trunk
+19009 fbf8abec93d19fc0347ae7cda03e2d1a21a025ce legacy-trunk
+19009 b60831eeab5a06dd3c5e8297a99e39297aa8794b legacy-trunk
+19011 7d765c1d49e2f3157a6f189cc5784d3655985d90 legacy-trunk
+19012 ca055606b3a11c175b34f9e6f83388f681883990 legacy-trunk
+19013 4951f5c48105bbddf72834eee0c7bec73aaa2e6d legacy-trunk
+19014 85e35e68e3db057896e46dd0b2ee5bfe288e5eaa legacy-trunk
+19015 df7bfb34b2a2e8dd688f131c110c0b5863c40e3d legacy-trunk
+19016 3ee558634164daf499f77657035ad84d4e61ff82 legacy-trunk
+19017 b2c8795a34489eb22f668cda6ef68377f93ca43b legacy-trunk
+19018 83c1f14682a2561ad7c4f5e72b7dfb6c6d557b0f legacy-trunk
+19019 62bf73998cdb21b494c36e1289edd60fd948541c legacy-trunk
+19020 6396cc6b1f7a127ed217a9133bf844ba95ecd2d3 legacy-trunk
+19021 680d6a50c2e844f1188a8cfac61ced17bc5ff8da legacy-trunk
+19022 46920b60cd3343f2633554944a7788d40fb13c5c legacy-trunk
+19023 c0de710f31c03f8019455e1dca3432838dc7910c legacy-trunk
+19024 fd278031f449cb851744fdbc4475650752d02e6c legacy-trunk
+19025 5f40fdbdd02c418d1ae3e1c2bd8ae24d0aa0d7e2 legacy-trunk
+19026 2208a03d05a3add1f32c5960a1032d70630891b6 legacy-trunk
+19027 0a72070eab6eba630c488dc746f3859c3140b282 legacy-trunk
+19028 10646d092a52fb2d3633ffe2dd0b182f5b4679c3 legacy-trunk
+19029 71ceaba3f6151b44f9e7cb808b04667cf2d36213 legacy-trunk
+19030 a0e52038cc4e1c813c64e842747c30c6b1b61ce6 legacy-trunk
+19031 78cddba4580532faa77bb556a35325c7f45df9ea legacy-trunk
+19032 2c7df45496a6276e4639bd24217203a22c214f25 legacy-trunk
+19033 7ae6a09d4d02dedd5ec9f6158930d6b53ca07880 legacy-trunk
+19034 725b1baf3dab91c2b431e53b9d597de03de9121e legacy-trunk
+19035 f75b864899fb15315d8108e84f86367abd659d50 legacy-trunk
+19036 30c4c4e9e3d5677f448029d651b924fb9ce09ab1 legacy-trunk
+19037 438428d1bf270e6970f2b4ae561e48e69db4c56d legacy-trunk
+19038 2dcbc1dfca9c54de630718646d7ce3768e9a6b5d legacy-trunk
+19039 277498183030748a0d61952fdf946f15547f5c96 legacy-trunk
+19040 d0e8e1959c0be42f120b9d38841033d9dbfd3f64 legacy-trunk
+19041 3a0eb45b2b5e026dfd3517536445345596364a67 legacy-trunk
+19042 6f92920c115009df45a023882f631b7f40218197 legacy-trunk
+19043 a54c282bfb63da2b7a78e5e6c9fb4f1fac532404 legacy-trunk
+19044 b882f4c856668af33274874258e4fc49427834a3 legacy-trunk
+19045 a130d5f7e58aeb21964dce64a47d9c4dea2fb1c0 legacy-trunk
+19046 e26f8d6cf288ef36e2bb474eeca2fffef365bd33 legacy-trunk
+19047 115fdc61ae914b82a9c8fb13438d0812f27d1624 legacy-trunk
+19048 01e8a6d8da8bb65efef515159911117ed5d092c9 legacy-trunk
+19049 d7218ac99c09ab2cee6da74eb017bbea2dfcbf5a legacy-trunk
+19050 499e229e6ceda892ef572035ea59cd66a4da1fbc legacy-trunk
+19051 991a17d610362769ca425bcb47febb65e4f290a0 legacy-trunk
+19052 c12d8623b29490e120b900dcae5349491568ed78 legacy-trunk
+19053 c02ae7ae011d6282ab2193ca38de7df93a9a9fe2 legacy-trunk
+19054 4fe69a9f8b3076b9ef171f94f19f2305b5350bb6 legacy-trunk
+19055 1ff4f8901d96060955d27b69e1f57d1778e22370 legacy-trunk
+19056 f4ac060a841b399c0716d76e7f47d8d90663a632 legacy-trunk
+19057 1aa8349f66955806b005d047baeec0645089270a legacy-trunk
+19058 5712620298882ac06971f09dccf9bd190b590d65 legacy-trunk
+19059 1bb7651683e741284a142c573f581c885ecfb97f legacy-trunk
+19060 32755b456369d82269b473a1a1f42880e5dfb5e8 legacy-trunk
+19061 01e5d3e58833ad9e990df87e432f6f7b20f69640 legacy-trunk
+19062 3484670c37f2e8dbf206011c3d99efe4cbb0ca98 legacy-trunk
+19063 38678cb0b3cdb8dd62207eee2dc333830e13a3b8 legacy-trunk
+19064 397ae53f1a489906e56151979fe364d60063dc56 legacy-trunk
+19065 743d52075be5efcbf078192a6ec8d2853031a9d0 legacy-trunk
+19066 23ab5992122e81408ffe23452d75a7d759de1bb5 legacy-trunk
+19067 a3f57ed757e50a9b5496402e4dd711786b2357b0 legacy-trunk
+19068 a6453cfb733f1d7af835fffd2a6ea23af667f5db legacy-trunk
+19069 743f163368273b3b5d5f40297e4719413f47d827 legacy-trunk
+19070 8d4a25c81a9b9430fb02da90d0d5883b5eddcda8 legacy-trunk
+19071 55e8c026e1e3ff22c5e624be250ad9f327e3d383 legacy-trunk
+19072 1e43a2456e8fe4cce51d52a42b2fd41c7fbae326 legacy-trunk
+19073 98b65484ade6a84ce811dabb8b0d313f5f1c8557 legacy-trunk
+19074 1df40d7724ccde40657c38c74518a936645515e5 legacy-trunk
+19075 c0f61d4f5a0488123469fb3cc30c5596f7a75380 legacy-trunk
+19076 635e9dcfed2cc6584895ccc421704b6dc33436d5 legacy-trunk
+19077 72860ee9eaf0890fd0e2b6ba593035231c0c9e6d legacy-trunk
+19078 5aea1581543b4482850a5b21aa385d63876e0616 legacy-trunk
+19079 397491aa20a6ebca7c92891b5e5dd70f37d8582c legacy-trunk
+19080 a4e54bfd3c29d656911eaab8bcbdf09929040e4e legacy-trunk
+19081 259f79a36e2f36d0b2de1b4bda825066d4feb1bc legacy-trunk
+19082 185dfc14a9342fb765bd151b4adc5e9e8e618e12 legacy-trunk
+19083 588691f806f4d081a34416702138c1fd8bf30ee0 legacy-trunk
+19084 a0e46c3be63ef2df4f41d4597178606ae48c5eb6 legacy-trunk
+19085 54534148873e6f9c1792ce6efdd2dc2ca566aa83 legacy-trunk
+19086 d3292ee5b6e24a15c545e0b1b9112be9b82e7349 legacy-trunk
+19087 e56dd2dd996072a7949689e487a34fb150513ab0 legacy-trunk
+19088 c7c404b35f33a0d54c82f675899f190c13e50fd7 legacy-trunk
+19089 8c4db8b9af9b90e536bfb500e470e62062e1f8f0 legacy-trunk
+19090 abb9450664367508044f94fdeb02e4c410af31bd legacy-trunk
+19091 e302586452a308380cba49e60602d88e107e7669 legacy-trunk
+19092 39a14bc8a0f790b848bedfd3c6d487b99acea6cd legacy-trunk
+19093 3a20da2893c47f58bd6da9aa265de7d48762a9a2 legacy-trunk
+19094 df2ed5664be51522e12fdf78536d7dadc37b03e6 legacy-trunk
+19095 9bf438c8f5c7938a5f5f5517cd3296060b501a2b legacy-trunk
+19096 41ed4d86db777250c62c41ba6e3d08712ceec5ce legacy-trunk
+19097 5c60184f7f52ab1d52233ec9e39834920afc9757 legacy-trunk
+19098 e5d59a9dbfc028cdef0ed267a239ac2c03527b4f legacy-trunk
+19099 3fe75924eac10dcaa9739a63234ee2b73b1953e3 legacy-trunk
+19100 b4d4f20211144a9c8e28031f48dfa2ea50c7d113 legacy-trunk
+19101 2ff826318e89edfbd0d76ea7ca58254da14c4361 legacy-trunk
+19102 7f618bc1398110922c5556d6cbde3b53d09d2fbc legacy-trunk
+19103 05be5f85f3bf608d6b9d928571b5a3dfd8e9f15d legacy-trunk
+19104 3c5f09422b69a9fd87230be74ee9c5f7021c4bd3 legacy-trunk
+19105 9fd96e2455b62c7757f1e0e17dde5d45960c0fb5 legacy-trunk
+19106 fa209cc84cace3ec8d3c988379b7f1685e417685 legacy-trunk
+19107 09736aeab8311ff237dba5ec0245a63a22a70a9d legacy-trunk
+19108 c41dd2204b9c8e0b303d122180c17cd5da0528d8 legacy-trunk
+19109 a68c7032cdf299f2b3ef8138dca7fa45523d29f4 legacy-trunk
+19110 140c52858f65e4088ab15ff5796aedd97a303fbe legacy-trunk
+19111 fa271d7b2a62bcafdf936f4c16c969d8523b9256 legacy-trunk
+19112 aab871635ffae49b8909ef660edb264f6030aed8 legacy-trunk
+19113 bd8d298af880c2a1e02c18ed799f23486a502e1f legacy-trunk
+19114 3f89e7240086056839413e39f04a7c8bb5cc2233 legacy-trunk
+19115 4b51d069be350ed9a5404f024763969acbf002a6 legacy-trunk
+19116 c1cf5d2c26cae70e30c8c35e2846b1e1b00118e4 legacy-trunk
+19117 f80453e445b5a44158ed96862ad02c5abeb10dab legacy-trunk
+19118 07071872de3e114b0126c3e27ab7e6f7e9506200 legacy-trunk
+19119 fd8c7203251ff37dbb397f7d423ae41f16a03c68 legacy-trunk
+19120 f494ca0a2b346ff68faaccc6508bea2802da9a08 legacy-trunk
+19121 9386b32bff1dab424d0b554f698619bcb543a8fa legacy-trunk
+19122 20ef849ec877c72e54b6a44bf58d45ae3ad4351a legacy-trunk
+19123 bdfc6f1fa475ce67313d93dc1e33ae2bcebaf53d legacy-trunk
+19124 a704ea5eceb6b3d1afc1fadcdc885441cedf784a legacy-trunk
+19125 763a3d42baedf167d292590748af3a06712d32f6 legacy-trunk
+19126 e18889e3949c069f1c341e0e77c2b64653b1fcc5 legacy-trunk
+19127 d614b6e9fb4ed94e1f00b71090e941c139c7ace2 legacy-trunk
+19128 99f346738415a06b32fb7a4bb11890179cd1892b legacy-trunk
+19129 60ee338f0d666fdefe0036021531966fcc61f90f legacy-trunk
+19130 c2ce9b2e5bb423aaeedb0f1d954988a19e197a0b legacy-trunk
+19131 77958266c7d7aabfec539fbb71e4542f6d6e0dee legacy-trunk
+19132 90255d441cd5f621d085a48e3be16724fee3229b legacy-trunk
+19133 7ef2382f6123a065f9076210da7c124593f9ecf1 legacy-trunk
+19134 835e9dd54bfb8ac63feae393d8e1f4cbfe1e8849 legacy-trunk
+19135 c85ca8c62129cc8114c53a7041f3acb1ba6e4977 legacy-trunk
+19136 2aeb3a34c7acdb33ffa5f987e45f7b2bc6a6ac39 legacy-trunk
+19137 9ce5149825f6aeabd0d7cb4690f602fd5b0a84bf legacy-trunk
+19138 ca85547fcb5e424f53bf6c4d446ec0c795966176 legacy-trunk
+19139 16e21772ca3f146202dad7599aed19c42549bb00 legacy-trunk
+19140 b46f956abcf852f560ae99340e42fe1b1e8ab370 legacy-trunk
+19141 785ce619679614283430df4930dff0624cfe3704 legacy-trunk
+19142 8b81a7e58a1d19c8bf6f95abf458782755f7f36e legacy-trunk
+19143 2abcbe44271abb076345372859cc518bc35f231e legacy-trunk
+19144 ea4a2f3b266e01865fd64a32582664b8cfb78b49 legacy-trunk
+19145 65c6a2998b1bded0c99653d622073225fe79432d legacy-trunk
+19146 a0558ebf6612753e0388b6d7ae3c0c04655da458 legacy-trunk
+19147 15e0c10092bb4db0ad673272fa2973128a1c9862 legacy-trunk
+19148 20e3c0d5e46fd343e18f11c60c3ae5ffdaa6a149 legacy-trunk
+19149 4b72888c9e2f7edd336693f85f2f66a32ce39cbb legacy-trunk
+19150 c0a2441a4454bdf30da1d2784dbc2a4b1ae93e8a legacy-trunk
+19151 93ba33dc333af22c7aadedc7b0b11cb106b815f7 legacy-trunk
+19152 7a251440ce67d6894abf2fbde8b326b62f602ca1 legacy-trunk
+19153 09403c5cdafbc08a60b26856f1d4280df3b66acc legacy-trunk
+19154 0501c2a10315fc4f0d4c14853ec10642637cf2f6 legacy-trunk
+19155 27a4a17aec2514cd88646799729e956d185f53f7 legacy-trunk
+19156 28c6ec581aa696822b99e3cf292baa31253d6b75 legacy-trunk
+19157 7b3476c1382ebcbfca5dd77714cde095caf56722 legacy-trunk
+19158 ab99bd39470ce391bac2f8ccc6079999713a10d5 legacy-trunk
+19159 d0d8c9d52f18499d0aadeceb011a40281a466cda legacy-trunk
+19160 2db29939580dba78d506a321a062c2a524092df4 legacy-trunk
+19161 e1e0e996b0035da22d9db56e84bf062e0a8e17ea legacy-trunk
+19162 26c1fffdfff2f08e74c9f4cabc03f364b71c36a0 legacy-trunk
+19163 bdfb81d3c610ead8f39dc6a539673ec61a3b7852 legacy-trunk
+19164 3a1e658e44746c0216c70af6fd5529a9e8792149 legacy-trunk
+19165 e7f413d4ee15ab86d464a15be3fc7dad1d42d900 legacy-trunk
+19166 fc3f505945d4cd082d6506cae318732063174abe legacy-trunk
+19167 fb0f56bb14059973e564596d8689cda87d62c31d legacy-trunk
+19168 8e873fa5450ebf56be406f196a58d4ea8865da97 legacy-trunk
+19169 f84f8d81e32ce707112b386509d99973b4263171 legacy-trunk
+19170 8e66ea602616da8fee918aa71190d487c4a78569 legacy-trunk
+19171 9663d5ebb646c122c8c1b53977544707395f5826 legacy-trunk
+19172 54b0aef650c529d076e878091f77069a0d64e84b legacy-trunk
+19173 8c41f3861aaddccaf2d0f2bab15f8e7f49d87192 legacy-trunk
+19174 b8018145e2a5e79526b569e72a0f7d7573e571b6 legacy-trunk
+19175 662adf03e4fa2f66da6f880a81c071025c58a2ef legacy-trunk
+19176 24e457ba1f926c5b4c74c8c22166f8b0436065e0 legacy-trunk
+19177 28c60ef48fa3a1cba1e1938398ffbd42e2e8a200 legacy-trunk
+19178 79e72ce22a430f01a04bbfda57fdd22f9b5fc0ef legacy-trunk
+19179 861bf8dcfb58b8667d85e96a20732823901ffe82 legacy-trunk
+19180 17cac70cae7662170a2a958e47ecdef636ef6e35 legacy-trunk
+19181 b335d4dd223f3884a676bc40026be9791146be5e legacy-trunk
+19182 0efa6c97a4fab56586ad47c00c9eb55693c75ed4 legacy-trunk
+19183 a58c993d9234572f829d858a4e82b3d775efafd4 legacy-trunk
+19184 925b233f02ea0dce1944696479ddf1d4e6236f7d legacy-trunk
+19185 afd0930f868399aeb250fe4d2d3160a3b254cfdd legacy-trunk
+19186 9d572038206e027608956313bf7e91cea3094fe3 legacy-trunk
+19187 330239575e1e6757fcfe77a67fdf4ae3b6f2ae23 legacy-trunk
+19188 ffd251dfabf42ad82a9720645f329c19eebc009b legacy-trunk
+19189 93afb2bb22ed09baf8f96070480365172d88e1b5 legacy-trunk
+19190 abd383f1905c81ece90f4e22ce3de418c5c5b5cb legacy-trunk
+19191 4d424d1397b2d8b9854783579ebf320d571215c2 legacy-trunk
+19192 be06bfcbe51a2eac50258b772cf4256ac27eafa3 legacy-trunk
+19193 24e8c69cd34da54a582977033a00b82ace3b90c4 legacy-trunk
+19194 bacbb45fe8448fe2367f452210d47a817025d170 legacy-trunk
+19195 01d5b80a3c0382375df94648a746ccb8938def3c legacy-trunk
+19196 36db193608bee1545b7f95941588127cdcfcf3e1 legacy-trunk
+19197 2852eadb7daba512cb31edcc43266352bd488d60 legacy-trunk
+19198 2d8e02902d67e9889714d9003aafe9f26a0fd6f9 legacy-trunk
+19199 fa93bd1d8709d8cbbdcbe04bb97c076a7b0928d6 legacy-trunk
+19200 687f93ddf3d7343ba03bca23cdd99a938bd82e49 legacy-trunk
+19201 654982a46607769eeb20f5cad4821c986b8f1f0a legacy-trunk
+19202 207074588b9fde04d1d6c1f30456e2094b4ffe58 legacy-trunk
+19203 a4bba3eb34c1f1736e29356635de1ad350378035 legacy-trunk
+19204 05a913ff97a6e210f6a201987b959471fcac433a legacy-trunk
+19205 f87a41b96e28cc98d10144e4b0ae846d76bcdf5e legacy-trunk
+19206 a8d8857ab0f1ecd5baa60ce9f559b3028a84533e legacy-trunk
+19207 0cb47955344e444e011ab379250ddcac076adbec legacy-trunk
+19208 90ede5165d1f3c15ea08a2b8788b327a5170ab07 legacy-trunk
+19209 6f1c37e811605bfa05115ccef67d299be81f188f legacy-trunk
+19210 6df12732e262f3c783b2c069a7dd6cbeab8b8eb5 legacy-trunk
+19211 7c4eb40d4ff7928e50de13d2d60d87501b09de19 legacy-trunk
+19212 66d4bf56e32dbb185b2ee2c361e4203032661bc0 legacy-trunk
+19213 ef32bfa5f5c6813480b4a138c614d5735501c892 legacy-trunk
+19214 0eeb2ee207999daaeb1db6f1a058f4ff958413f7 legacy-trunk
+19215 ae04d614a3e033b40ebf7daa867979cb8a7b479b legacy-trunk
+19216 c3b75a7fad3f7806c7490975b2b7b72209704a87 legacy-trunk
+19217 e4420c2468f90aa6b1b61ff170b3bf20fa8052f3 legacy-trunk
+19218 4ff2858d7a855686469576812ff532e4a41cb43c legacy-trunk
+19219 9f2ca855fa44db64a168cb92eddbf9e75d280f8c legacy-trunk
+19220 fa8be28730c9853243b427fc0cff3732420bbac0 legacy-trunk
+19221 109c6a280e51aa2c7ef2c35fd60166654698b4e5 legacy-trunk
+19222 95dae61ced51833d8f18591f870160cfdf768c90 legacy-trunk
+19223 8c5d8b617979abb1e6bdd251f5f98adb47007ddc legacy-trunk
+19224 655aaccd1caf8a559ffc32f163d10228e59c412b legacy-trunk
+19225 c29ca19803038bcb4a2f0aa4969cebbfa1cebc3b legacy-trunk
+19226 f1e2f98f0120780371d20abdae16f4bd6d29ab60 legacy-trunk
+19227 50f7dd1a5357d9c959327b9b1677321f2539cb2f legacy-trunk
+19228 38ca9cc9fc48a1cf3007a9a909bcf20872d9575b legacy-trunk
+19229 3c1b426b3ff4c6ecceb1e126fbefa47d0f734f3e legacy-trunk
+19230 c696a52c26218458231fd8f6371d6bdb9e379b7a legacy-trunk
+19231 c04ca6cba1e3c8e8b52d5a36151148705b7c1026 legacy-trunk
+19232 4b5becfa2eb3acd4f1f59cd79c3063c730137cf6 legacy-trunk
+19233 3fe855526c556049d89c44e06b2f11bd6a5a6754 legacy-trunk
+19234 670a0194a8da7e8be8d19791969f82fa689e2dfd legacy-trunk
+19235 5dfd7e16c62f172e64ad4b4ed850317d9b9d2f47 legacy-trunk
+19236 6325bd063f0a88336fba5507c94566c8c4d9a553 legacy-trunk
+19237 6fd63c5c19a9218b2899ece2943dbe9a5f0c7067 legacy-trunk
+19238 8b1a38224ade9b575a553b2585869a129d231a7d legacy-trunk
+19239 0d4b6ba5eeec850522cd9357793b3cee81ff1efe legacy-trunk
+19240 4cd574469fe1aa8c9da0de8f1cc62742a69a1e29 legacy-trunk
+19241 5f0683a69efc6884c64173a03d8cd03e5462966a legacy-trunk
+19242 3a4d2befbb747342df330a8e33ba6d6780c8a38d legacy-trunk
+19243 48b4acf73ad7abd203d32d3c895a036c2ecd9442 legacy-trunk
+19244 ec8f47a1cc48388781d82c42c771e7ba86bcb583 legacy-trunk
+19245 98a88abe58d42eb7890d9128e232ab014ec99273 legacy-trunk
+19246 c898ceba2261840eb9cd4a1191b48b751fd76c05 legacy-trunk
+19247 1fb6672b20ef3ccaf2104867801b911cd0ad67cb legacy-trunk
+19248 c2555b4f38a3140f612119a8d6be04514478cead legacy-trunk
+19249 556887296d2ad8ae1add4186ab0006768728cde0 legacy-trunk
+19250 fd4a63566ba1f4d99a279598a16c308b13680f45 legacy-trunk
+19251 46a8cfe9afa634d0c38c3d41c1b9cf343aeb5135 legacy-trunk
+19252 d34f25046ad4ba469d77e7a444b7ea811d092ccf legacy-trunk
+19253 2ab28b213d705dcc9fd033a25434ba4dba686fec legacy-trunk
+19254 2ecceb9d87f59e220fdb46daf0166e7ed111fc27 legacy-trunk
+19255 0394270d4d06d5a187257e4945e413ef2747923d legacy-trunk
+19256 f700e6b8de1fa6059e27ebd4e2671b0140142000 legacy-trunk
+19257 74d140a3f034635484824a2296cf5a0d6a0b1282 legacy-trunk
+19258 b22e4dca451a357697c6bbd51c549e5c30272d19 legacy-trunk
+19259 0bb58cdfa688ff1d937fab9c0ea2902ff776bf62 legacy-trunk
+19260 80c0b280a4f911ef6b7c82fe32c9d4a0c3cfe42f legacy-trunk
+19261 dce7b4e6d421bcb8cc713de4a4c3260e7a1d61a2 legacy-trunk
+19262 166e87836e8e6059260c9aa7d36116d26f811473 legacy-trunk
+19263 abe85d2622f9fbdef53cb540e5b8d2fd100915d2 legacy-trunk
+19264 08ac556f2d12de59eba65d345a47d97a7d5f6930 legacy-trunk
+19265 c22e872501a0c952e46ff4599911d58ba47a6ad9 legacy-trunk
+19266 390ca43e5f79d0f2fb09ffc1c0a58cdd4d4fa665 legacy-trunk
+19267 7ad97832a5cd05b17a5ee20a451b2e67cf215c18 legacy-trunk
+19268 2d72db9f5ca544cdbed092f90904af3bb8cb7900 legacy-trunk
+19269 99ede21908727364162c15be2ac624b3a764aaae legacy-trunk
+19270 ec709ee8e6fa6527badb03fd14a7320f7fd653d1 legacy-trunk
+19271 7430ebabdbdcaee329ccb1c7bc2d7aec349d36e2 legacy-trunk
+19272 3d4a7cd0bf178ad63e38bd3ceef50f13272402da legacy-trunk
+19273 aedb93f9c6b80d5991c02dc965e8b0af8e06acb4 legacy-trunk
+19274 10ea4060c8dc55bd53f8afeb01bf22acccfc5ad9 legacy-trunk
+19275 8819867f14ef659be8ff8051c0124a4d9c5d439e legacy-trunk
+19276 185b91967147dd0276615e28a32f2b761d2fb999 legacy-trunk
+19277 12d0048ed6ca5b68c2e647f56a2f37880a457ce9 legacy-trunk
+19278 7d39d9dcf2d611378facc680408024bfb7554dcf legacy-trunk
+19279 901b94656928b0d0aeeb6c07280a29c8f24798c1 legacy-trunk
+19280 1ac7e6186b6e3f77ba7b385aeddc46920465de9f legacy-trunk
+19281 1ef7e43715f540c30bdd6107c5afcb0fc38d69c0 legacy-trunk
+19282 38204093d9c929d644ef9c56bb89daf994587c0a legacy-trunk
+19283 aa844711463aa894affce09a87bbac3f4c7e0e27 legacy-trunk
+19284 8b318b8d78c94466dcbef5ba9125cb53b396f292 legacy-trunk
+19285 5c40113409c3277c66241c9bc7f3ce61ee90ac77 legacy-trunk
+19286 25ec4f8c60aacf6a028349bc72871261ecd72e20 legacy-trunk
+19287 3ffcc9b3bab87f71488437306d7c02bbb0af41ec legacy-trunk
+19288 7ea7a1c5a8d203b3fb2502e68ef155a98809da81 legacy-trunk
+19289 c8ef864ba861f234cb535aafd8f8375e6aff3b44 legacy-trunk
+19290 6496844c4a4280906b7529cd38d491243d4795f3 legacy-trunk
+19291 8a440ff274ecbcb1e53566419b89ce34e05cf5c0 legacy-trunk
+19292 2be7c90c1dded2e6410c177d95518d588453d136 legacy-trunk
+19293 c16e061d23e886bb1b11ccba42948d166377722c legacy-trunk
+19294 6b5e20f69e9ee9d56cbf50cde0463446f8c9a7be legacy-trunk
+19295 0076e8d28f9eba9eff4508696dc33730af2b4001 legacy-trunk
+19296 5a4bdfc66083ecc33c3c200d8184eaf526e9ff84 legacy-trunk
+19297 a6219950766e78af386d9e4ee5e7ae2a05f0e3be legacy-trunk
+19297 b382f1f07ec6b2c95551658b30c6139eeb32077a legacy-trunk
+19299 679f826b24ca269b8f18c4043ecf5c3d5ad87ff6 legacy-trunk
+19300 246b3a6aa7a9411ea7786134a325fd022d4f2fe1 legacy-trunk
+19301 d557ff0a2f6c97d42a803243699c5101ce5b1b0e legacy-trunk
+19302 7a39704a5047e4f6fc73011092be2de92158cd32 legacy-trunk
+19303 c453fbf30f6137781f4f584d069816d87d1c5b03 legacy-trunk
+19304 b2c516bb734a729eaf2de6cc7666dece40c34a25 legacy-trunk
+19305 ce9850051120490de30852d3ebc97c0a0d258eec legacy-trunk
+19306 b78c8d8c52e61f6a16c695825ed73bbddf3df07a legacy-trunk
+19307 f93e23a82a73d2f1ba9a6e0b02409078d561d49c legacy-trunk
+19308 575872584b0cfc6dd5f32610816089a0f192fed1 legacy-trunk
+19309 ac52d37278673fcf47394ee771958edec38c37e4 legacy-trunk
+19310 1877057aa926207617b95f6c9e846f486534c7a3 legacy-trunk
+19311 64a32df5c06345d8906eb25f7823ddbedfc40fe2 legacy-trunk
+19312 af39de262b9c9b8f1b7f89aabcef5f3184fc0a14 legacy-trunk
+19313 99befeac8400ffa8062990b1658aee75fee0b708 legacy-trunk
+19314 2885a339635ede9a0271c290d32d35588b993201 legacy-trunk
+19315 2e3dd62ceac5f88439e39c38012a3b36b18cb59f legacy-trunk
+19316 ddce715e49ba067787d5aa09ba0034b8bf9088dc legacy-trunk
+19317 b305c1536b7aa4d420bdbd87dfbb35cf372b5a5e legacy-trunk
+19318 a506f3b7569414993e814f0775f8124c84372613 legacy-trunk
+19319 3cc8635587933ec5a91ab60cb36b938318c0c7ad legacy-trunk
+19320 c99d6d5afd75d0bcb00ebe8ab9ba5763224bd2e5 legacy-trunk
+19321 5ef71cb6649536141fdefdd85eab6e13a996a27d legacy-trunk
+19322 c18ac8c2f0365ba7d3a59e67258d20194b196461 legacy-trunk
+19323 0bb17127b2f8ea3c28a9faad6c4cdc73c7f11fd2 legacy-trunk
+19324 a4f6b633230c3722d37a8db5b67ab9a1f329e388 legacy-trunk
+19325 2ca8783ce8a35ae7e2ce923c14cd8fe1fc268b0b legacy-trunk
+19326 286a9d987375363d3e2a592588e7156d9349550f legacy-trunk
+19327 65a708950922b6f8f8324f908b50a6c032bc0d50 legacy-trunk
+19328 ea88c2a73173044f1480a9bff12ad8a3562cc19d legacy-trunk
+19329 1c71aa7d55131abf2d00bc1a20f6429f2acef505 legacy-trunk
+19330 ed4338c7e8a45c897bf8403ef58ddd9346542be4 legacy-trunk
+19331 c0b0fc13279e2321647c248da707d644e95cf93f legacy-trunk
+19332 807ca697620aee18bc26ae30d102e3d99abf9ea5 legacy-trunk
+19333 ab02bc6a5ab2cadc088596c68183ef2e27a23d7d legacy-trunk
+19334 549e993a476cd70f253693031a444af1956bc222 legacy-trunk
+19335 f5bcba5fa41c8b0c6f2a9784b65342014f761cae legacy-trunk
+19336 4d406c26c16ea79da7a36973273601d2c2e504c6 legacy-trunk
+19337 b6313c9114ed6d12c6a9cdf161a3d1d8cf64c3c0 legacy-trunk
+19338 f7b167c8331858dd74835fd4c819c827c0142dbb legacy-trunk
+19339 57ce92a16b3c9eeb28a630b75c2896cc6879c9be legacy-trunk
+19340 edc0c99a69d6d22562273dbbb59c45c9c6b6ac02 legacy-trunk
+19341 d59663d3e433a35997ce869dc3340ab0aa2461ab legacy-trunk
+19342 e97217f5b32319f3a7f987e322efcb67ff2dd99e legacy-trunk
+19343 811b0ccb62aece937d103db9ec5a3fc74108e9d1 legacy-trunk
+19344 1fb7befb59f073b01ba1447df35611a07eed97ba legacy-trunk
+19345 c233efcb489e5bf5f47c4e694fde10d48c3afcc3 legacy-trunk
+19346 bf97818dd9e1e28b8ad1ddc9af598e32122d1e8f legacy-trunk
+19347 5f12df88a2085aa2389e0e252db1e9de9b5154a9 legacy-trunk
+19348 464de8dfa59e9a75dad9d47198f6c82ed955b067 legacy-trunk
+19349 771dbb155575fbcfe8da5d7d8dce428e19005c65 legacy-trunk
+19350 92cbefdb674a65cd7821bcc67aeddaa289b6c992 legacy-trunk
+19351 a68884de12ec54e54b68c96d73553fdfabda0fd2 legacy-trunk
+19352 87f2abb731848b6ffa2bf24968aeff65966a7c8d legacy-trunk
+19353 a4c6e401ee184c3ffd5258048334313e23b30276 legacy-trunk
+19354 fc4ace0242cb094b6b36ed61db16683e78c473ae legacy-trunk
+19355 6e5ab7840b05d0bc94d9bfeec1905a2cfbc50c35 legacy-trunk
+19356 f4d15fdd15dd7b1ee751cb769237f2e9086c6460 legacy-trunk
+19357 69f162dcd8b4c09c5ef4ddd4b57b907b79d6f8c9 legacy-trunk
+19358 1ff9d571bac09a781567e06a917da5e099f80e82 legacy-trunk
+19359 d329606361f8b3bc5de584d33ef37d9d52ce8e89 legacy-trunk
+19360 f751b96de621ee714e5aae5bbe8c680e1c869e74 legacy-trunk
+19361 58de2829cfdd3b898102553cf97edf810c94cea1 legacy-trunk
+19362 c97e6189ad96a9ead52aba51f4b938c5e2798b53 legacy-trunk
+19363 b11780b068fa6c1229cbed295df3cbe974075fab legacy-trunk
+19364 bf0309d5fc0a939e90aeb1b763e128bf41672a5d legacy-trunk
+19365 8d7655ac8bf868a534e041389690669ccad20d87 legacy-trunk
+19366 6ffce8be3e0b8dd314c696e661c64806eda4af6b legacy-trunk
+19367 88c87c89b4068007894a11925a8b6ce65c4eca22 legacy-trunk
+19368 b26cbc1fe4e3b5bf6196ba69538916d64c936d45 legacy-trunk
+19369 bdfc6bf7b0dae7d228aa7ffd7509fd6dbbdeeabe legacy-trunk
+19370 5c3bf2e89d8011afb5fef68b98a71a26b3759c7f legacy-trunk
+19371 5f588dd5439bf006a16df0f1451d0df4b9090f11 legacy-trunk
+19372 c87fdf7de0e6b8f917700d108f1ae172a72fcb62 legacy-trunk
+19373 18ef3d5eab4f22cb93a7c7002a6ac6faa8447d60 legacy-trunk
+19374 893a515d331a73aab367d9e1baf9aacebfdf5c88 legacy-trunk
+19375 5643e37b99ae69eef63bbee5e4b7c0968191f7ce legacy-trunk
+19376 90c600a819e96d4606979e2d68e38dd14fdb4112 legacy-trunk
+19377 8ba6bc8c2e09381f376f11939a989c9d3c4114c4 legacy-trunk
+19378 af88465999c7a6c03346bb0b8f75d7e8fa1ee260 legacy-trunk
+19379 eee67a84e5faaf300a1ef2681b899e36801d2ff9 legacy-trunk
+19380 b3d923a66152cd8d5369f69ecfa4fd248d8e1155 legacy-trunk
+19381 631d4c8db7840802867f93b396f225a61f57c357 legacy-trunk
+19382 c802385a6ac3e64226928ac03e28c687d5d453b8 legacy-trunk
+19383 e3d4880748b5c475c4c58e8ff003eea53d1b449f legacy-trunk
+19384 f42799c68929ee64c9c824f6f92aad5de9ab8295 legacy-trunk
+19385 9d625303f914be830a9927d3a54a25105d615855 legacy-trunk
+19386 24e946e951fa2a35a18a5921ca4d69aa450c2358 legacy-trunk
+19387 c36967bdc9dd4dabb78bc5f7240ce3209b7d4b0a legacy-trunk
+19388 57d248ddbe2abab4dff4aa66c5b0868b837de9f6 legacy-trunk
+19389 a8e123df268b9cbfa05018700b6d1a6e59347217 legacy-trunk
+19390 f3e83e514dd89afcef804980f7f401dcf1bf1cbf legacy-trunk
+19391 751e9cc477d9d0349275dab93acba8a4a2462c05 legacy-trunk
+19392 a80f67b72308e9d0515bdb49affadefbec25685e legacy-trunk
+19393 06dd94e20f3b81bcc1408d53728b0126540d3ee7 legacy-trunk
+19394 7fc64df13db0acafc63391d02dc4aa3b61516074 legacy-trunk
+19395 c48af39cb292e01b7c92b700746fcdf68e8a982c legacy-trunk
+19396 b59f3a1eb12391bc1aeda75a69d92c3395f190b5 legacy-trunk
+19397 084b3dc9b6ff3102ae8d5f9e9b7cb4b79b5492ba legacy-trunk
+19398 54f7209cc71e7b6909d32f2c36d14c8ef417f4d3 legacy-trunk
+19399 f4e71bab7853c97b55797909c0efe9664ca1d3dc legacy-trunk
+19400 a540c6fd0ced1d881dbeca17b821b2127e3f417c legacy-trunk
+19401 a47d93ef103a7673bc22f3b65e7f52dcab32b8d6 legacy-trunk
+19402 8236f3e7585e14fc8000a4a926f4e05517c40676 legacy-trunk
+19403 8eed373bce7fe50ade2a61f5784c050a4f98a5ab legacy-trunk
+19404 fef4c039733dcb81dc7794bc2959ce416aa0c3ba legacy-trunk
+19405 1214abea0c7b2a8351170d888455a3e6dd2e1d40 legacy-trunk
+19406 4652723ea655ca82a8fe268a1e1c4667a713eb6d legacy-trunk
+19407 38ecfd11d9b53a26c4ceb31ccc17e48eb9ae8c67 legacy-trunk
+19408 60a2e99c863be9719e314389568db38a9e051a0c legacy-trunk
+19409 cc9cb1e90b3d24bd78d3403b37faba853d1572c3 legacy-trunk
+19410 da8681f17b500e64e1de671d44e453b4feb57cb3 legacy-trunk
+19411 7e9f4051ba4af13ffd5a5cc9f1e4eac02cf33d26 legacy-trunk
+19412 8f70b5ddd5c08f64088f6783caacd5c537f7fb6e legacy-trunk
+19413 7de5043827f70fdc186b6df6eeecbc021871d4a1 legacy-trunk
+19414 e5592f1ef41f8651f27e3fb65c8b10551d6a8afe legacy-trunk
+19415 9a95794e0f7ec65b5369dd845f7b0f00b8bb967d legacy-trunk
+19416 444c0eed5a66c5ac95521b473d07874a4f124c38 legacy-trunk
+19417 d38afb20c336a724aee232438917935b45d64ae6 legacy-trunk
+19418 27fce2d7facdb427d9768ab81a6cc2ce54fd0b84 legacy-trunk
+19419 9ce9e0342cc1f0f02e59becbee760b169d79bbee legacy-trunk
+19420 192e9855c7c006556ad278e30eba67a9d5f5d4ce legacy-trunk
+19421 8c1c787bd6f9e2b5a5dcd35ed24d6e318d52aa61 legacy-trunk
+19422 e8e636cc1a0933d6e77ccdf0c132bf023315413f legacy-trunk
+19423 0d1305c83de4c9e0dc581df3f0316e2b3618b501 legacy-trunk
+19424 623456576d6a8e54d5e90b468068bd8fc13558d2 legacy-trunk
+19425 30d34bbf86201aa98c8b4a86a68ef3a8f10d3bf9 legacy-trunk
+19426 d3484ca40b8a0d7f911cac1242d62eba366e69d0 legacy-trunk
+19427 23b5e7d03f76fbb85940b002009aed11256dd6c8 legacy-trunk
+19428 4cedc826bee8b6d1986488899139cc484af20966 legacy-trunk
+19429 b4ff1cf4a10fafb87829461b7f55298e5c421f26 legacy-trunk
+19430 91763013c36fcf5c6e1e09bc0c2cc431623dc0c7 legacy-trunk
+19431 c904a40e14ea9ff3e472013286b15a22a23077f4 legacy-trunk
+19432 8657384dcc4ab283edd3a72d37cdd3b863c76f0f legacy-trunk
+19433 2c6417ef462850bdef867eaa6ba0c9a238509611 legacy-trunk
+19434 ee0dd0c7964edbca0663a264da5a067492926a15 legacy-trunk
+19435 4772fe2db2c46c245ae3485b836915cbd573b91a legacy-trunk
+19436 bf9c24beda7d57534e930f6699598e702fb7e307 legacy-trunk
+19437 5f3a8350615c8b9ce638723468a29b533c677153 legacy-trunk
+19438 f654468b9ae8a9a051aaa28dce7ef18a46312ff7 legacy-trunk
+19439 068cb8494b7b1e661ff034226997d97c396e0833 legacy-trunk
+19440 b439eeda00828f3bf0d6ae5051a72ed647c7e28a legacy-trunk
+19441 a63dc59be0f986a242ab3f44408983b088c23224 legacy-trunk
+19442 da15e5f68644a960deb0b6c7255b59fe1a39a75f cnri-16-start
+19443 e2b2fe7fabb89439041e1a5c82473676bd8dd817 cnri-16-start
+19444 9d08c37473cb926abf9639d67665f19675dc2ee4 release20-maint
+19445 c0cdf82599e03f394c85216f0b6ccf17db25b100 legacy-trunk
+19446 9a8e961b505f030696d02cf1c8a2c30287041b53 legacy-trunk
+19447 817df9efacbae743016f58ef771d0afef10e74a8 legacy-trunk
+19448 3f6c05e040826dc7229d43db374142416f02d8e8 legacy-trunk
+19449 aae2bb8ac3739e0c58e4f2df7bd5bdce1a39a64c legacy-trunk
+19450 5fa25542b89675d42b15d8dfa55b6f66232b3c45 legacy-trunk
+19451 9bb2b6963c825aa90e5ee6bc0f7911ba7cac57f8 legacy-trunk
+19452 56a8106baf635ada290194b618b05c1d5e988de1 legacy-trunk
+19453 ba84463efc7bc5cbeefd2a730a4b8b91268cd200 legacy-trunk
+19454 f813e987e65ce40a83f4e9362cf0ebb457bef690 legacy-trunk
+19455 df7d52ae20e4cd05360c8a1e7aa08cb98379a5ef legacy-trunk
+19456 74ae80d90fa6cc2643659a88659c1fc10452decc legacy-trunk
+19457 b36251316f6aeda6e3b9fb51d960788aa12d3b16 legacy-trunk
+19458 9ef978c6f0395650c99b72b8a0114d82b04d9b34 legacy-trunk
+19459 ffdc7185bdabd63e04930b01576a8f926789d0ac legacy-trunk
+19460 0855119167762696c6a18a4ae57cafe08064043b legacy-trunk
+19461 07ffb0c3bd5ee67c18beb7b22142f453d540ae32 legacy-trunk
+19462 e104367256f0203754d4ffa5f73b8076e49dc4c0 legacy-trunk
+19463 260f033ae7df3898b933b6f2e75ccaacf1d40e0e legacy-trunk
+19464 885d545248db3807933715103ac0262b3d9f98bc legacy-trunk
+19465 0b455a428967787e04ccf8c38c846a48c972c499 legacy-trunk
+19466 96d8868a00284d99c88e3942824a76519c206062 legacy-trunk
+19467 0cd87a5d1ef974eae7f01c298bea943adc5fd46e legacy-trunk
+19468 ef2be12b18fea3966a97e8a6244b365d403db0ea legacy-trunk
+19469 b05b8b6c0b430989c7b7b6d8c439b55fe1868e28 legacy-trunk
+19470 44ef644cb526eeb7fdc2a44d8e7d8a04ccaa4107 legacy-trunk
+19471 941a76f3874742561418db9dc467f8c19da01a8e legacy-trunk
+19472 f425d8523480b01fc36461092955b7ae68e164c1 legacy-trunk
+19473 73306949119c04d358a10568ae0d23c6f5849601 legacy-trunk
+19474 f0f5729d603fb59f8a96f67371598316c6b6ed94 legacy-trunk
+19475 e3cffc0394bfb6c0452b5865c877732d6d630645 legacy-trunk
+19476 8ef2467f0191bb61004b3006adf0f9f097f7ed49 legacy-trunk
+19477 f68dbffff927bfa566fd2c3a9e8aefb5b6130ad9 legacy-trunk
+19478 20e52e5a408a16f02866a6fae22863d042a4a1d6 legacy-trunk
+19479 8ff4cf49267ec547901c0de6f65218fbb100c6be legacy-trunk
+19480 e2a63584566f82db937e0a331a1b3bdf8b2527e6 legacy-trunk
+19481 e050b94f04d3c9672793ef6a49cd183e3ff93788 legacy-trunk
+19482 56914884aab6301b47624efcb0608d6c5c172319 legacy-trunk
+19483 4e2d1c6f2904da64bef3c5d1291df9ad80838ce3 legacy-trunk
+19484 1c6ba946d8fa0be2e440213fb4cd3a745f5d4198 legacy-trunk
+19485 c958678720fdac4246545f5a898545ddb1302d06 legacy-trunk
+19486 91780ead8c25b2727c422cb8f7ea5fc4e6e264c9 legacy-trunk
+19487 3a6b4a003a17e4b9af6fdfb1d33a7349e99f722c legacy-trunk
+19488 67a0666f11e323070f532852311fad75c3416609 legacy-trunk
+19489 c9f23f80fc930d85fb29fa33ec844ebca6a4d299 legacy-trunk
+19490 611768349dd90f39adf109cdcd9e1ae093eb0e1c legacy-trunk
+19491 063d5c4f6ce58b3408811c9d477af758a5291362 legacy-trunk
+19492 c87e7017d66b33a88abd99e391f95935bd71b8e4 legacy-trunk
+19493 96e9ccbf165f6a4e2015f79d171482f3a909b159 legacy-trunk
+19494 c9509d84f3df7f8eb0f638c8282301eb6844a66f legacy-trunk
+19495 e381453062312635a74163319687b4c5a9996ea2 legacy-trunk
+19496 0564b134b58403551bdba1d098ca2f450cfd9946 legacy-trunk
+19497 217277583468d056884e4f3b5ad5b59fffc79e22 legacy-trunk
+19498 d4559b7457a0e32a31525daab42699821c1d0c0e legacy-trunk
+19499 2fb64983965ff223aea252391ff34ca1b53a4ae8 legacy-trunk
+19500 e30c197532aa126a6daa4b07fc69836a061bac92 legacy-trunk
+19501 59f4f696010168da18a9ba9a790d2f4e2e3f7a3d legacy-trunk
+19502 79568c0d3e77a69362b3579ccf5b475035650a1f legacy-trunk
+19503 146dfe7e03382ceb2190cb19ce9b7d6919d30e7c legacy-trunk
+19504 7d1e7b6ec839453486db2ace81ef1f62592cfe9c legacy-trunk
+19505 38f6972dc8b417ff2bab98532155ec8d91cc6164 legacy-trunk
+19506 15f0064c840096efdc9adc556f1735c758aa191d legacy-trunk
+19507 f7a9776771ab0efe1d672092e90010baaa5d23e5 legacy-trunk
+19508 7f127be07c50957781e1c381edf77b379096a610 legacy-trunk
+19509 d6d5c11f75a922e95ce2b9374cc0eabbd601f878 legacy-trunk
+19510 b9e5481f644c30af74634d6c7e5d49c136f14ae3 legacy-trunk
+19511 728c115621872f1701cee3dcfe7f353b8f3cdcc2 legacy-trunk
+19512 a51b9961f3bbb0c0605da7e12d0e9cb4ef07947a legacy-trunk
+19513 8d85096178741f59408878888e28bd20fa2c882c legacy-trunk
+19514 d3e8b880651b7d47354e98991b133f12c4b32192 legacy-trunk
+19515 91521c52b1db55afc6d6fcca4204839c39aa4fdf legacy-trunk
+19517 da9a4a1698f1f684e79691b9664b7c607bbe1c92 legacy-trunk
+19518 b9fe8bd9e5f4fbb06d29967ab2fe6b0c0dbd6785 legacy-trunk
+19519 5921b129f35048435c06ec749d9f8d470611afd8 legacy-trunk
+19520 1d7aed0769648126a5f604c93c182f71df8bb305 legacy-trunk
+19521 7f8e817ac423c4569f891568b7d101a7e20c79ec legacy-trunk
+19522 79d533934ac1b3095e0c4f9a4b731e21c0efff28 legacy-trunk
+19523 1a5a441772ff63aa9f918c1be9eb59bb2b06a1bc legacy-trunk
+19524 deec6fa804710837d176812df8e95ad19328953e legacy-trunk
+19525 0049f77b36c623237e71d2969d1be1677ff0987e legacy-trunk
+19526 6af415f0c01eb00d23724965ce239e7023e61679 legacy-trunk
+19527 89c1ccef5ce8360e3b466403a03d71045f526618 legacy-trunk
+19528 94a38443f99bb570555cb171d545a99299c5355e legacy-trunk
+19529 5746d0bf5f04df7f253b9cb20f5466156f6d28c3 legacy-trunk
+19530 de0e8752d5b72ce7450cf48550c383b11a2d322e legacy-trunk
+19531 e9fcb46c1f2cacbc39746d5e7f54836adef621db legacy-trunk
+19532 725238293869cc5ac9f665a70c71463ae7ef3799 legacy-trunk
+19533 57a9722c588d4da2b8a5a0e891f92bfd57c5cd61 legacy-trunk
+19534 990fa25cde1ccf1568c869430a8de663eef22b01 legacy-trunk
+19535 a8a00de024e7380a9fe84dcbd725f2a7cb56b9ad legacy-trunk
+19536 8bcc10db562e4f9ff8e22f27c1358d0fd7e0d1ba legacy-trunk
+19537 0d3ae8f0849d92a5397e1e48ca88e7bd66934f68 legacy-trunk
+19538 5bcf9c49b6e78c45fb6ea0e772c7baf1921bb0c8 legacy-trunk
+19539 f4e97ec1dc9ab62e6152efdca288c2749a69fff7 legacy-trunk
+19540 963f95eb7646daa18818a491f31260ee62443d86 legacy-trunk
+19541 294ba16b0e88a4763d3ea07b581a54d4a5ea85ac legacy-trunk
+19542 b955e74955d54c958a6922279171822f0bd19833 legacy-trunk
+19543 06ad5053f40a062c907797e503c0b135be4ff889 legacy-trunk
+19544 db4fc82aa44ba9b53b684a680cfb5afaa12550cb legacy-trunk
+19545 17ed61fd5b6540933f3596c74a37c0b08d0a2a81 legacy-trunk
+19546 26acc2445f373732f17dd5182ac0f2e1c061aa29 legacy-trunk
+19547 3cb00cbe7455084e721e91ccaa8d3553f649ac20 legacy-trunk
+19548 d94fea57834c33a01dab00c9138dcb7580756105 legacy-trunk
+19549 f7ae0d937cd07431a300c723309fe82620a36415 legacy-trunk
+19550 a6f080fe52511f9286aa3352872e8d90f1ff460e legacy-trunk
+19551 a0baf4cd835cf2f40db91544692cb692b0584e5c legacy-trunk
+19552 102ffe1611e0f84749d8fdfc02b8f8aed2ca3b85 legacy-trunk
+19553 6ebb14b141ad51b9cc4b88f217b8db3b183ef088 legacy-trunk
+19554 736bceeca3dbd63af83288db2bbb176f717da4f5 legacy-trunk
+19555 4134b5972219cfbc9efe63a75733bb8055f09355 legacy-trunk
+19556 66266c46ccfdcd62aa97a8ecb3f2d687f6a612f5 legacy-trunk
+19557 2a86d519f80e5e8852137cf9debc835637e43fd3 legacy-trunk
+19558 de5a8dd1c6f24756fa43a4163a0c7f31cb9c5e81 legacy-trunk
+19559 3bdd565c77bdddd22804f073e1597ef2b75fdaaa legacy-trunk
+19560 e14c5f34fa05856a5412ca85d032a4192b3a94da legacy-trunk
+19561 564927c557425f8bf58cdbacd3862dab415f994c legacy-trunk
+19562 c02a9db56fe15d5b0532603a425cd9aaf7221c5c legacy-trunk
+19563 1b400c854a2c2ffe4189d284ee6f293db64d8b94 legacy-trunk
+19564 7334b2cedda8e750be2eb5348d0b7e7c19c7a0d3 legacy-trunk
+19565 d2a8414a1eab3d1e3d85d28d6c74e342d49efaa4 legacy-trunk
+19566 60c90ff9c2f78ad6d8e838b234a07181343a88c6 legacy-trunk
+19567 f9f4c233ee037cd534c568ce10657025a4873d25 legacy-trunk
+19568 8172906c6dc8fb37861588bbbc0ea6e6a5a47a9d legacy-trunk
+19569 0468596e301874008d07e6a7a8a35e010ee8e8c6 legacy-trunk
+19570 932a1f8d92f709172c27d6a9f8e4b2cd7258dbbd legacy-trunk
+19571 617cb40cb74b8f742001d167933be2123eefff3d legacy-trunk
+19572 9696c95d09b7424cd123d40be8f997ae1b7c00f1 legacy-trunk
+19573 57799f013aad254a8f89df6b614a8b4bd960e844 legacy-trunk
+19574 1cf36eb5a25c0f5602fce073fc4361c8cd98e768 legacy-trunk
+19575 58908bb47ccacad7a6170dd0e815d763ed0de816 legacy-trunk
+19576 2c1f8d3bba2f81ebb527b664d521909761e958ac legacy-trunk
+19577 6341f8d909ac5f56c1c2f74d6f9da06239b64d93 legacy-trunk
+19578 e4b47b4393c8ad4d6acd25e28f81b93f8402a277 legacy-trunk
+19579 6d1fd9244dadaabef2a9eeee216ce711165fcb7b legacy-trunk
+19580 3e9396ac4ba07e4dcd98604559f964c152443748 legacy-trunk
+19581 ef64dc68520fdb992fae52df94347d6b5edfa09c legacy-trunk
+19582 a1d8bb68659a47437eef70df7dd231449c3085e2 legacy-trunk
+19583 01c2470eeb2ea03415876ca37c546ddfc3bf7f9a legacy-trunk
+19584 89c126887df093e0d37b754902ae83afab668876 legacy-trunk
+19585 407d4022cc8c0428b154fe96a58e50d03e1dc405 legacy-trunk
+19586 4db0fddb69178dbfcfd7ba1aaf393d76090475c0 legacy-trunk
+19587 cc338a5c16e5c4203e4fe31d16515f335e11486e legacy-trunk
+19588 59f1b57bc90998f07497686cac66a5257229df23 legacy-trunk
+19589 120621bd33fca59a1026a16b4bda5b416b3c675f legacy-trunk
+19590 d170c1e772c553a9b5896b6a4a14def5d7e493d9 legacy-trunk
+19591 583a812c45c8861345567a5ce7cb8c1b75d43abb legacy-trunk
+19592 800b004acc71780e6d993d32bf814343ca915926 legacy-trunk
+19593 256e1599d8d96c3bbd747bc361ff5a0f1469b4c3 legacy-trunk
+19594 74145ab1fdc5bd9df503fa675b64992bc665b3d5 legacy-trunk
+19595 e81dda5d37c4b1b0630206398d6b51f4250e8e2e legacy-trunk
+19596 86c7683b606a90bee9cc90840eab5eb689420219 legacy-trunk
+19597 8f034bcee856badf0f5464f723276227de808b14 legacy-trunk
+19598 c99d19a96e9ebbecf62dc7715166ae7fedb9bc18 legacy-trunk
+19599 05ec1b054b4d93fe06f289e7e8d373cfdd7f6d1d legacy-trunk
+19600 9f86cba4766b54ee951700dd80f50d5b787cb2e0 legacy-trunk
+19601 b3278bf4f091823713cfc47113320c2bbcda9e74 legacy-trunk
+19602 386cc698aef9556f6db40bb1c4279ec1eb2c1307 legacy-trunk
+19603 844fde600a61d3389aab1bf1ded6f6a45cf06cfc legacy-trunk
+19604 ddafdbf914985b8914cd8a04a570994f6a633c78 legacy-trunk
+19605 c10056100ea5dd2fe84d52c2e3270d89bbe9ee0c legacy-trunk
+19606 8466bb37289cd6e7610aa88d38fea24714568fbf legacy-trunk
+19607 db61894b0d6fc3e400e40244c05f8c98684108ef legacy-trunk
+19608 85d2af972e62304c0b920620976dfa3ef74c2a2d legacy-trunk
+19609 35f57c7170bd40a75d8dc32c21054efb1bf2a315 legacy-trunk
+19610 4ca62afec004525fc3cb734faaf5660ca1e91252 legacy-trunk
+19611 b42b22a9228cc8605a59f916b05499abd08f0731 legacy-trunk
+19612 e2a0db839eb1a43b45268639d2e55f292c467c0f legacy-trunk
+19613 e444a52711812cccc710a9adc001541c9dd31fb2 legacy-trunk
+19614 9518893cc8a7d6f5d226ecd780cec2542f33d09c cnri-16-start
+19615 06f6f0e1e10616c8b6634d77d1f996399105cc02 cnri-16-start
+19616 3c0a35002108d2e120431d54d6c3cbbf5157b5ac cnri-16-start
+19617 6a55b677f509645f3c87bbea950cb1980eea1620 cnri-16-start
+19618 7815919e2af8b63e0ea76166dd35a90d05631e7c legacy-trunk
+19619 90e90c92198b7da609e560fc3b3fc767e536cec3 legacy-trunk
+19620 ca1be7d00413e8aaa5e39cf5adc34160cace780f legacy-trunk
+19621 5c3aedc969da45678cc9b0ed20f393485e8b0e44 legacy-trunk
+19622 51977af230fa47bee948137631c05b71829072ed legacy-trunk
+19623 23c7a0108f590cfc7c1b981b02aecc5351857be1 legacy-trunk
+19624 2fb4d625bd39f01a4a2cbf87bcd89be92d65f0a1 legacy-trunk
+19625 3448591e8275e7a75a472e0295f4efc81517cc9b legacy-trunk
+19626 e1fa98fd239e75a13f08f775a82a9d356284e509 legacy-trunk
+19627 8996288a8873b1c4e7814bbb0a8ecda5245fb9ef legacy-trunk
+19628 6c96e8328d5301b7b6d5c1421c98d126a0be47d1 legacy-trunk
+19629 a8e51f6b5cfc097c5d4fabd824521135c5e4285f legacy-trunk
+19630 ff122c404f6431c6f458a4b1ff7744d3985dfc94 legacy-trunk
+19631 db48d0b13b1ed012237190558394f37777533439 legacy-trunk
+19632 2f585cbe71da59de397a77c0a85d708b5a310347 legacy-trunk
+19633 a7c514e15003670aab91fcc59d073ffa35306812 legacy-trunk
+19634 a804c91c182e1c15e1796b151fc0f08cd27f366f cnri-16-start
+19635 0a38f4d9667ecefd9a18f1f68581ab637d619e07 cnri-16-start
+19636 f4f2860d3a5f3e0998c8cd3a6fd2fc600620de07 cnri-16-start
+19637 b4e42d29963dd4cbd2d2c56e90e8291db22f2efd r161-branch
+19637 7ee378d5a41d2d8316ee326f818992419a4804e2 r161-branch
+19639 6348cd459ee49e3e557e7f5b5127e078b30f7b2b legacy-trunk
+19640 680c885dface91b946162eb5622fcf3ce6e1595e legacy-trunk
+19641 b6a52e4383441f5a331401bbbd22b3f99de13334 legacy-trunk
+19642 d446e4ec9b7b39770cff7fa929e4f69b304618a5 legacy-trunk
+19643 905011e8740c5459cf8bb1b87923a05f4dd7ebf9 legacy-trunk
+19644 14affbd037506c4d98bc980740e02a065461a9a8 legacy-trunk
+19645 b235160f1346708519ce25f52a1008bf635108db legacy-trunk
+19646 e4d9ba0ac0b2ca14cb3418d276cd47ca70fcf77e legacy-trunk
+19647 67ed8a6905c339da8e5a9a1891fc6065a44e5bc3 legacy-trunk
+19648 3839f0aa1e7ccece8a12087313f492f3779eb749 legacy-trunk
+19649 a4182c679c61c44825240f63c4ea42dff53c37ac legacy-trunk
+19650 2915eb07bd25a34b9fe84ef3c7910a818ed06459 legacy-trunk
+19651 b9e5c122212ef34786b109b5284698211b7cf7d8 legacy-trunk
+19652 68bd96e426e32bb1b992ba11bf1012adfe9b4cd4 legacy-trunk
+19653 eb29924a3370e1fa820aabb822daec5695c473c1 legacy-trunk
+19654 bf8d2b92ea0ef3251ccab6c33b0cac10c92b08d6 legacy-trunk
+19655 5a1230de436a86057f7fd45828321f631e62c84d legacy-trunk
+19656 5864a9c58c81c2281a617854d19d7ce4a91169a5 legacy-trunk
+19657 4feea99be777f9627b40d86982a70bf82ad7ca6c legacy-trunk
+19658 60fd9d454206da57ef5f23992279e36d6ac2e3ed legacy-trunk
+19659 9977806b86174d96db7761338e67a4bc74245c90 legacy-trunk
+19660 26d3e8eacedfadee6b909a5e14f4dc4a42e77613 legacy-trunk
+19661 9519cad6bf9d4c53b6b183e360d4d20ac7f0a182 legacy-trunk
+19662 00fea41730cf43c5cc81889f2d8722dd355340bf legacy-trunk
+19663 e991d8843ab47e916b9c4b4f6a3a92e8214ec61d legacy-trunk
+19664 67bad9f20b29c1793ee9ac71fcfe9bb25337871e legacy-trunk
+19665 a89f783c133a502888fe70f32e7c1431569606dc legacy-trunk
+19666 dae39ebbc0041cc15be2cfb5b863a768e193be54 legacy-trunk
+19667 7f8f7bebd1f6467679f72ea298a3911ad18fdf9c legacy-trunk
+19668 29aa832b878747866d78f9802dcadfc064f3fbd7 legacy-trunk
+19669 b80243f7f97cbe6a786405dc89c59a1848edf8c8 legacy-trunk
+19670 ac180c982295001a7e4662540cb8e43b5c6154d6 legacy-trunk
+19671 3c2142f076b46fe2ab2bd0465f955c4fdb47aba6 legacy-trunk
+19672 258dcafe2d0b8dc6bcec16e2a232d91877a0268e legacy-trunk
+19673 08d937107fe6cc2095b18a65493c8dd24d924f5d legacy-trunk
+19674 e0062e89d8f427a5fa88e50fe5135a6e92bfed0a legacy-trunk
+19675 2c9186e40b30778fd0701b14a7341b2aaf1163aa legacy-trunk
+19676 a869505195863c87aef203732cfdeeec13af5057 legacy-trunk
+19677 44458fe947ddb05545cf8a846fe8b2578cbb659c legacy-trunk
+19678 8156879fe60d1e2dab30796b9248986ed319204a legacy-trunk
+19679 83895b4ce0bbf1eef5e470f3c6cdbe346d3efd7a legacy-trunk
+19680 b2585d8fdb8bbf44225cf72df61df8951143ea37 legacy-trunk
+19681 74fd1959cf44ee2b3fc0216d023706d15b38fb2d legacy-trunk
+19682 ae7d7207da488036e2f718fdaa8be9f76d7987d9 legacy-trunk
+19683 8bf0c49fce101aba91796b4e04188a10825ec033 legacy-trunk
+19684 50d9159edaab676bbff2ee774e2b26e43f5f39c9 legacy-trunk
+19685 1d1bf6813ee569879dc50769319f9b3dce6c80ad legacy-trunk
+19686 580ad685445f5183a6161a5dcc624943f3e7a537 legacy-trunk
+19687 c3fb044d7e6f1ac8d6061963a7bbab55228b8670 legacy-trunk
+19688 4eaddf478e97a463b77a9917a73f6aa0fa09e8f4 legacy-trunk
+19689 b2cff5705775e2699398cddc7916105113126fa3 legacy-trunk
+19690 765801de1512083d6a4960c0abbcd3fec5e590a0 legacy-trunk
+19691 ffcb3cff94394d0523263150a55264fd1fd1f330 legacy-trunk
+19693 fd2a869769b249b87673139d9e164ee172028594 legacy-trunk
+19694 53e8ebd11620d45c08a7284d73155825dba4654c legacy-trunk
+19695 f54bae86a2c6bcc616be0ce2ee7c811f70e7cd94 legacy-trunk
+19696 f796a877117e715b341f1ba7e00dc0424e203f3e legacy-trunk
+19697 0f0efc2d12f143a686ece7668c35c1785395aef5 legacy-trunk
+19698 acbe74f3a786f2f4579c6f7843c6c2c7e38d16ec legacy-trunk
+19699 d4a315e4094c4871df433d0f6f661b21bb0209e6 legacy-trunk
+19700 51cf451faae460198f97046c0bf54050bc01cde0 legacy-trunk
+19701 a95693491ecaaf712deb788672e7fa0ecc3f2445 legacy-trunk
+19702 ce47498a31585973ba7d3c955f3279804bd98ac3 legacy-trunk
+19703 3b05212c161602557038ac8880e64f8b2d0c6ce1 legacy-trunk
+19704 6732905686d40e81cbf081d29d8ae7d3af01ee88 legacy-trunk
+19705 f5370e1e2392e6e42ad439a9d61a59e05d1d1cf5 legacy-trunk
+19706 27f04d714ecbc536ce7afdf23eae1fd26b5a3e19 legacy-trunk
+19707 b463acd6da22299ed1a070fe8f2bbb7ccf29ed2a legacy-trunk
+19708 bbdeb6d4dea152fc36a518aa296f9cc7f1fd3122 legacy-trunk
+19709 52fe377f07f2ce160b0325f0aec22405736e8f8d legacy-trunk
+19710 5902b5794a17eb7f730ff386f0202ccb43f3f936 legacy-trunk
+19711 f29c766864cb5a388f34277e5b97cf8ed28a6081 legacy-trunk
+19712 0e6a3da4f956130521665ab60a8ccbb1d986fba3 legacy-trunk
+19713 09f6c137205699370886ef6c7c66f1ac79b56678 legacy-trunk
+19714 e1b1e68cbd8c15b81ce921e4ddf6fe88d0314683 legacy-trunk
+19715 950fc2261da461a128899c2e4e01f9c74d2139a6 legacy-trunk
+19716 3d29690a24e8955064d0739d7e323cd270885341 legacy-trunk
+19717 76a684fe3f7fc5d8390da24a023787cc892af8e3 legacy-trunk
+19718 326a4dcbcd22a766f396e4104ac177aaf74f5e02 legacy-trunk
+19719 8156deb0e62de5e121597a896a5ab825059dadc8 legacy-trunk
+19720 09dcf5ebcd8032fc9be3074cc95753aa1f9a3cbf legacy-trunk
+19721 2d2ee30f43eadd5dcd2d7ac087aecd98c1e75036 legacy-trunk
+19722 95a7c5898faa1da7a0c4b6d353a1f8028fc59660 legacy-trunk
+19723 4894ba3edd0a5344f4a19f12e1f32f8dc11fe92b legacy-trunk
+19724 a8771a52abb37fe07c9c5eece1e5b85f256cc559 legacy-trunk
+19725 2d4da6cfee61829f83b4d6dd9db3272a04c67d9f legacy-trunk
+19726 e5f2ab811ec3d818bd467c65ca83ca6fdf10f985 legacy-trunk
+19727 847844248c6f92772968be94c9f30379d137517b legacy-trunk
+19728 05785bdf289cd0608a3152c1fd5b97ed1a62b02c legacy-trunk
+19729 bc89f116160b974ac2688853a93d1fd98bf68169 legacy-trunk
+19730 ec9083ac26df7ddc1a7bbbf7b7ab47ad23140b3c legacy-trunk
+19731 26ce6efc9744279ac67fbc1bb19685df94aba19c legacy-trunk
+19732 c55780815a6e5a35d33af0a66b6c064480c05ca2 legacy-trunk
+19733 b0aaf8f85d128e240a62d894137ad16c66c3193d legacy-trunk
+19734 8d7f72cc2ecc81454c491d669bc03b858a9c2840 legacy-trunk
+19735 cd4085cee3093aa5f410292f368aaa6aefb78f70 legacy-trunk
+19736 9fa2009825833c818618545f56bf3c7f65e2bef4 legacy-trunk
+19737 77a5470299dbe4d27e43bac5146dbb7babb5d949 legacy-trunk
+19738 13cdbfb591a4743a1750b9f34b13c4d600cd9140 legacy-trunk
+19739 d052dddbfd4450a11935d20007679e8b5af2853d legacy-trunk
+19740 2514fcfa0f08254ff345cf5d242093c34159fc62 legacy-trunk
+19741 3a411d41eeb4ff0704d2eb2b45f1beef3cfcde55 legacy-trunk
+19742 7976cf7fd19683b58a44e4c6431fa2956a698eaa legacy-trunk
+19743 7dc66d5b100eeaff09c524e886f40a197e8e106b legacy-trunk
+19744 4126803e1a85dcafddea1eb6f5865718da7d2cbb legacy-trunk
+19745 f399e6a88f65849581621c761e3836f98c40b327 legacy-trunk
+19746 d675d75af8395eb84ae8f32ab1ced8097dee139e legacy-trunk
+19747 5280e8439d5563842940454ba17f7d49f90d223a legacy-trunk
+19748 9d018a3d7946aa71d1975960e060f7c9405a647b legacy-trunk
+19749 79bbf7ad0fc179b26c4da436e0823c125edac20b legacy-trunk
+19750 10b84060b7f39c675cf8ed9d86b2c7455f3fd6c2 legacy-trunk
+19751 8d7486a8d69ac0b1a5bccc89dec307e366a91a75 legacy-trunk
+19752 30ba883764ebb4e1954f61a729c1dc83db2b7af6 legacy-trunk
+19753 1cf52536c381ed0dc31b5c6daec6ffb6b2658a2b legacy-trunk
+19754 abaea443e28c2fcab9414a47a26f166659b2c6c5 legacy-trunk
+19755 bdcd79873924ce642b0ac3dbb30945cd9685f49d legacy-trunk
+19756 859829384663b36d90f94b90a881e6dfe3a118a0 legacy-trunk
+19757 ad7343737aee9e12ee7462e9a2ba6d1867c1db6e legacy-trunk
+19758 7b5b5756b2cad0e1f14e2338adb0ff27eb2baa7b legacy-trunk
+19759 1ce751fa67d806ee7b549270ca6df93726599201 legacy-trunk
+19760 d3f646404a43572a56b041c751de876cb0ce6c74 legacy-trunk
+19761 68ce32861626f8e643356fc8e9b1c0f5a3e20e25 legacy-trunk
+19762 14dbde1ecdeab9c33677582096de6c910223222b legacy-trunk
+19763 fcfb442d7b34e296530594dfc1467fae6cdc6773 legacy-trunk
+19764 0feb634900935aa6b3774a04cf93c44b757fe1cf legacy-trunk
+19765 f287c684e04c45e6801e9ab19f67f92e7d291d0c legacy-trunk
+19766 806c6ae231032475557c0878764508906812572c legacy-trunk
+19767 f27d3299df3906206a9ecfef0a8ef09ca279ef9e legacy-trunk
+19768 f1c8ea92ee852ee4a7abcf19c80d75630b4d647f legacy-trunk
+19769 b3d504bdd979fa36e40a6124b40add7e641296bc legacy-trunk
+19770 8aecdb2234881730a1d811448abe23617e7c7d7a legacy-trunk
+19771 fa84f9f410923116b1cd578771e05084d9e9d1ed legacy-trunk
+19772 74a9d0a4231a5eb0a1b3864b6e142f5e06bf1f48 legacy-trunk
+19773 dcea09388332cab85729343a83f752797bae06e2 legacy-trunk
+19774 320fa50a1a7d2556183d1186ee0fa100fb9643be legacy-trunk
+19775 8d1e844fbb1ab5af0cb0176995acd95ef96c2d71 legacy-trunk
+19776 572b654bf4ed54b07ce306df3722500b9ec3468f legacy-trunk
+19777 f55f35dc53201a549d4cc8979608fad03f955e46 legacy-trunk
+19778 e86875f069b16e34d096b0373b7b48e86772448b legacy-trunk
+19779 41f3f4b2fe4a6762ab01085bdd759da8ff614e1c legacy-trunk
+19780 0f0770a793acd2fb85b9894b923ca1d6c111917f legacy-trunk
+19781 b73249c8de1801693d364d991326c029d44f11e8 legacy-trunk
+19782 f1d45d6c12a28c22a39a8ac14fc73089bc1611a9 legacy-trunk
+19783 6c93f18d323345eaf6eb7f3744d8fd17e8e5fcd3 legacy-trunk
+19784 fa8906ecdb70245950d8efd73e3a60e566fd845d legacy-trunk
+19785 203ad6f3ef8ce12e2bfa192bcbdf399a99a6e4cc legacy-trunk
+19786 da638c484d08c63d65656ea598e5dacca0b03097 legacy-trunk
+19787 a46a13201eeb8844c1392d712f20e645aa3e1f90 legacy-trunk
+19788 f07fa7f5262a92fdc453e7bd8a6c604df8531a37 legacy-trunk
+19789 f2902659374ac88e824b2b2a1bb4875f7c696c1b legacy-trunk
+19790 4934102227192ecb67e22c7ca79c7351642060fe legacy-trunk
+19791 b0456d3a0f1f1d3ec632df16b0b3aeb0fdd89339 legacy-trunk
+19792 bb25f2b7bdae03b8c4161fefa37f0d96a8c05538 legacy-trunk
+19793 6d59817cf7928ebeb5396be49f4bfd116b38ec4e legacy-trunk
+19794 491fb49b46e6fded9658582a9b4f89ea5fcde2cf legacy-trunk
+19795 004985a5ad5a8063a59a8518098d59722916969b legacy-trunk
+19796 415205b2cdb2ddcf251af8a44f96bf4987198f56 legacy-trunk
+19797 b5db23c7a804a192babdb0cfeaf2ec2cc79940c0 legacy-trunk
+19798 5ab4da6ad4fc7bc8840c6bdf46b76ad4ec69db9b legacy-trunk
+19799 b0a982c91af0133f365ad4f260ab64675883bd32 legacy-trunk
+19800 faa7aaeb0210df918c0cf2b8ea14e33a63a3ef79 legacy-trunk
+19801 3c65babf322fb3c5fad36d72ca16886f328b94d7 legacy-trunk
+19802 2548d1a7018002f5a6661edcf42bf2b2c92de205 legacy-trunk
+19803 02e097f72d47b0a3b5c9352846a9d5fad603b83d legacy-trunk
+19804 3a2e8a3ede48193946657e78c3e440b77b96d4f1 legacy-trunk
+19805 9c921a8ed3a723b84dbf9d8f91768829adb9ddff legacy-trunk
+19806 52a3f82617c40c7e4fe1f1f5ef9c9836772504f4 legacy-trunk
+19807 abc8c6c025ce83711964729bea6df2f98e1db168 legacy-trunk
+19808 b046a31af2e06e83a13273e7708fb635a461412f legacy-trunk
+19809 eb4ed9f23d20698e51a615c6f8dce4f0faf91d6c legacy-trunk
+19810 94683c85ec76e6d1604c0684afd0f537d7c3fd3c legacy-trunk
+19811 8c64dda1d26f30deaa3f0e6e6383a7e7cfb67f40 legacy-trunk
+19812 b8259c7ff49c9bdeb58d626aaae5b35d7a47907e legacy-trunk
+19813 5d7e0ea318180cfb04be971877cb7e6e821fe7b3 legacy-trunk
+19814 09aec668df3ae28c26fe3da8ab45bb5570af0492 legacy-trunk
+19815 c28dfe5f87a73be1908c87e1991e62a7a45ebe6b legacy-trunk
+19816 a015aed3a1ac1098fe34e45916911c064f4d3542 legacy-trunk
+19817 af810f08425bef2548b5ffb50877aa816203a55f legacy-trunk
+19818 e9445c51ff29f6923166705ec260a3dff446e215 legacy-trunk
+19819 4baa5a955532ae55a881d5cb4504613249dc8185 legacy-trunk
+19820 8a4696d7f74c0c21e6efffc6382bd179d9ff5306 legacy-trunk
+19821 31e302e94da881b2de3b7da82b8c7772fd254f01 legacy-trunk
+19822 b25131bc6ec7c882547153999e8dea4ef5709de0 legacy-trunk
+19823 faa52f384af65248db4bc262fb2073a183313815 legacy-trunk
+19824 09ba15ee1961ba3357da91972c24e615a36d4682 legacy-trunk
+19825 b6c0cfb1efeaccc6695b6635bf6a022b1e1f5986 legacy-trunk
+19826 dfeb3ae692c1119ed709140903200b4353869c7e legacy-trunk
+19827 832e40909ef484f4adf11088998bc936f80b7377 legacy-trunk
+19828 9fd20cae7b766754c56c7b24842efe78c5450549 legacy-trunk
+19829 c7c535361467d4901d195bb9e0f922d68cd777b9 legacy-trunk
+19830 acd506084727e734d87b302ccfb6f6cf8ffd190e legacy-trunk
+19831 a1b3446c720f1a4ff758e2e141a0f03fb783ae8f legacy-trunk
+19832 cd6e4bc99295b855ff475a8c7f18ef712815a851 legacy-trunk
+19833 e53b32845224e793195216da866b64afc5b485ec legacy-trunk
+19834 91231bbb3842f476f08c6e3d8abf0e0a850e0945 legacy-trunk
+19835 b8320a26c06576d738a5c044da3f48af0a61d321 legacy-trunk
+19836 0d4e806c42ccbd3ec2ba393358ecfac98ca89e59 legacy-trunk
+19837 602eb046b3e7d344479722117c1e81018df32428 legacy-trunk
+19838 2c290d4c3b382f7a87fb5863cd4f4a5f21d85fd8 legacy-trunk
+19839 6f42c1d55e6af068401f1a44e0f53940810c9e14 legacy-trunk
+19840 ec29895ee40cfd2611f9f54a704273e6a2632200 legacy-trunk
+19841 38e17a0894929064f2759801cdff73d051334683 legacy-trunk
+19842 6bbe268f8ad84918cf4aabb727270018a347b37f legacy-trunk
+19842 d0c830db5e68edd4aaa3401216e610c9ff145826 legacy-trunk
+19844 9a9eaecf0fd82926bd2300e61eb9d2cbecd49970 legacy-trunk
+19845 723cf5e378e57dbd2faed87c7b7b1d45c59696fc legacy-trunk
+19846 64532ba5dced5dff3e5c52895cd2ff3f5c828d1d legacy-trunk
+19847 b83a3b78314eb8931993a5efcdcc258fcabf2df6 legacy-trunk
+19848 d888dc7bea32ebf53182659bd8c461fe260aeb2c legacy-trunk
+19849 2dfee333a651006378026dfa6b533878319d04c6 legacy-trunk
+19850 a79ebba6466a637bf359fb816b3be61f95715757 legacy-trunk
+19851 e6c5bc5beab3a07c71a45ce3e40bfd6a0e1063e6 legacy-trunk
+19852 0b4c57a25977eda7a97561ec1c4016e2cd1c99c6 legacy-trunk
+19853 d5e53cf9de7c3309362f4c7de0675175177212a6 legacy-trunk
+19854 2b9354f4852faab05fd8373c20a63ff893db9468 legacy-trunk
+19855 c1e1949f39fea2152e5bff8a1eaa90b73eca339c legacy-trunk
+19856 6702c0df16b668aa03de76f84d3fac8b51e1a5eb legacy-trunk
+19857 c79dab652ea84413c8c34b75f91d68fa3acd6c60 legacy-trunk
+19858 d6ece7c3b35eaf6a5e9d788960fbff65377dd992 legacy-trunk
+19859 f5cb6d66a977bde3308744c00d121627290256eb legacy-trunk
+19860 1a5a03e2da73969e22655fecd6e0c53da8f4381c legacy-trunk
+19861 c5a417e8d84c836374a290c1f087def82b91cc4f legacy-trunk
+19862 61c9fa94ce9d9a4ad9a180ca586be49c0dd101b1 legacy-trunk
+19863 1c95b6b06ae31d27a5ab41586952ad079a66830d legacy-trunk
+19864 4152855ef9a8b635a841010dfe34957af5e11fd8 legacy-trunk
+19865 a975f2c154c0604599913b63ce1f1a11d76ead58 legacy-trunk
+19866 7c7ccfb5db3ef1375bc6707d8b7fe6c2cc324b76 legacy-trunk
+19867 1ddc70dd1d1bbad031988bc3536162147e80116c legacy-trunk
+19868 86318733fe709359fa7199cda6bf11ae640f4d1e legacy-trunk
+19869 459c8ef0a0103598349c0533dcc5fd563294fd46 legacy-trunk
+19870 9104ed38ac051c9d5091adc2d199be94f57705ad legacy-trunk
+19871 41b9249e4d4863bd5aa2bac762a3587915b3ca10 legacy-trunk
+19872 86fd723f29286a2c3fd7367377f707bf8855216f legacy-trunk
+19873 4f9db834825caa0c3fd8b16ed67fb79ace992152 legacy-trunk
+19874 eee7d0c5ae592af4de950fb72b362094c18ba523 legacy-trunk
+19875 e59eda525fc1e7b52b745eb3f8f0a0fcdc0bcd7c legacy-trunk
+19876 2dc3ca1d890c77317e634cdb655a033c19a14475 legacy-trunk
+19877 f3fb05bfeeeb135c6e9266f610bbe2967a25d278 legacy-trunk
+19878 534a93d82edca1adfb0e8e0ce66a8019d6273038 legacy-trunk
+19879 b7b048da16735f04c160c1d6121822ab6a15c728 legacy-trunk
+19880 548716e2f1f13c38b8b5fad82ae00f838e036470 legacy-trunk
+19881 3b494c5c6234dead11a35b8676139824d43c8b69 legacy-trunk
+19883 4c17cb2c621e9bd09abb7bb20906661de9a0a2e8 legacy-trunk
+19884 a1dd0b0709d2063ff3ff6ce7d507ab0559246cac legacy-trunk
+19885 99de4bf2b9e55193b280a70ca9d09b2ee0a32efd legacy-trunk
+19886 d56d77f9373bdef99bb3bff8109d3ffb221039e0 legacy-trunk
+19887 db55604353b3a2a4da2c936c217a6366a9816568 legacy-trunk
+19888 8eaf74a111ebd9205983ae812a711933801cf746 legacy-trunk
+19889 d15ace32110266f6e3d500ba98b4f029959f26df legacy-trunk
+19890 6bdf563c763b3a4d033770c97a6a515a3a93df67 legacy-trunk
+19891 3c650d9c38e74eeac3fe40f7bfc67f827e45c494 legacy-trunk
+19892 19c2f50e539571c4ef9da572c686691b6566c15b legacy-trunk
+19893 3f5a54a8a1fb5058967a3f0b0ddfd7809aaaac48 legacy-trunk
+19894 7a36f6201c940072d2f361acb802a9c44bbcb4f4 legacy-trunk
+19895 89546bddc22cc0deef1b4dc66c264020c9e3423d legacy-trunk
+19896 953c50f12184aae2c4022b4dbbd2674b44e1e54d legacy-trunk
+19897 f0efdcd24512fb8d4b4b4f0e060307790ac4faa2 legacy-trunk
+19898 cd7ac4d9add02079a28b972865bf7db938592a4f legacy-trunk
+19899 e21d4c20565d00ca42473344a52984a37d06ee6c legacy-trunk
+19900 3cfbbcbf7134d117b821380fb2b556dba9deca53 legacy-trunk
+19901 971ff6b58edbfb7e66fb514ee2814819c8c2e0f3 legacy-trunk
+19902 f4146ca0f2921e20b4d742c58f731f1812808500 legacy-trunk
+19903 2a80191d12030e83981bd079a03bbb52f136fe31 legacy-trunk
+19904 51c6a2cb03d1b419e1d4a6a7a31a38b9330cc841 legacy-trunk
+19905 65a638a24f7e954f48077bbed3857074b631c97a legacy-trunk
+19906 3ec500403f010d8efd543071ceeea39d1d027c58 legacy-trunk
+19907 b40ab3105521f1945cddb75c96caac533133291c legacy-trunk
+19908 1e58d782c09ac9f3fc135b9540c3c75cd8c59b93 iter-branch
+19909 d5811af8acf3dd4e328bdbd16b7281c7daaf8449 legacy-trunk
+19910 533cc907edbd2cb61379dd75040f05a087250b30 legacy-trunk
+19911 ba81d79dc3a31daf5701f7fe24f2afee39a494d5 legacy-trunk
+19912 7e1e6725509e6c5971c9e94d82e4dcf7942d47d4 legacy-trunk
+19913 ad741745cb6c0941626fca5404b32aeea42bca5e legacy-trunk
+19914 8a348308316d544fb0681ec4948ad8132d06c27e iter-branch
+19915 420a0781bb92f7c6011c7e88a68021cc1f6544cf legacy-trunk
+19916 c1edb14f043bbb732a2ed2471c069eabee742cfb iter-branch
+19917 40ad0a0761d24fa654b015bed87b140d7c6af228 iter-branch
+19918 f394af8c580f0551e46093aad2d4959a47e690c3 iter-branch
+19919 62f74c259762dfe5e5ed0483bcd20b64a9211d73 iter-branch
+19920 3f5587c28a50f913a7c0d05cbeddd288e28ed67b iter-branch
+19921 f4d498a9d98903fbc1681002de1ce28bf010be27 iter-branch
+19922 52797b4b375bc9426cd1b0742eabdd2ee395d383 iter-branch
+19923 d27f844f6cfe562e273a58e099648dce166fff5d iter-branch
+19924 98a2bb90520d6cf5e283088748bb51fb85d028f1 iter-branch
+19925 afb33fef14cb8e36e4cf4ba88184f051e2f6a8ae iter-branch
+19926 3a8666e129adf9eb6e0c6b048d7a4eabb41791ce iter-branch
+19927 220b62738d7428133902c43ed2f500af615f8f63 legacy-trunk
+19928 5d68afc5227c91b1bf3df2aa698c19215118165d legacy-trunk
+19929 172d2a2816bfa3a0afeb126f0be0357f42894512 iter-branch
+19930 095b80d2e785d9f920c9eb244d2c72f69ef3e82c legacy-trunk
+19931 2ed7c58943e6112af25f9baa7dccf84a71e8e8c4 iter-branch
+19932 c57a1b6781b04fb4517d31ea987a6af30687c497 iter-branch
+19933 7bb1256b506db464de8ac9944cfbb4b11f657b25 legacy-trunk
+19934 3375a2a98e566fd13e43c2bbf69bf837adcd15dd legacy-trunk
+19935 eb4366b3e391aa90c3c83713558890ca5395e11c legacy-trunk
+19936 6ca72d71536e0c7f1deeb84f67857183d410c935 legacy-trunk
+19937 ff75c382f0d32e0f72d3903ddb1a8696e143d502 legacy-trunk
+19938 1f700a7206b2fc44fb3a72ec1d94b1620cdaa010 legacy-trunk
+19939 5e6ab939bdbcc4da6c4edd04b9979fc9e8c77091 legacy-trunk
+19940 bd40b13fa5abfab93da4a355a6853afe106b39be legacy-trunk
+19941 7eb5a6e8c98d450ccbd38b09dcaf6785d079816a legacy-trunk
+19942 7a4175e10626cf7498c3928d411e558f89735134 legacy-trunk
+19943 d58e93dafb98c2fdddf5051ef3683a6da0713c62 legacy-trunk
+19944 4e6f14e7557e99005476c4a090bff1081d42dd3c legacy-trunk
+19946 90e4064ca045ece8d1a98502d82c7f006ded4ede release20-maint
+19947 415a19bb1675c4794c168c64eb8d4252dbff51a8 release20-maint
+19948 743296ce052b187aa07430afdea546068c93a680 legacy-trunk
+19949 14b7a7b8d58dbbf2a4de2dbb184f621e85b72492 legacy-trunk
+19950 797ebb7033d726ef0e928ec48b9aaea4140f7ea0 legacy-trunk
+19951 a1066e5a1065cad416ef4c1baff984c1ded3702e legacy-trunk
+19952 dc0f62e7588b3e895cdd4d8348b164766fc7d256 legacy-trunk
+19953 3f5276cbbc4da244aafc48f929ec65e21aaf9bce legacy-trunk
+19954 a5814f620e86d9a703d697c9f02cdd88c8c17b9e legacy-trunk
+19955 33c8680b3b354046d2324a86c17fc2ad999052a9 legacy-trunk
+19956 d7e02b9ee179c1e43adcfd4a9dac9d790225072d legacy-trunk
+19957 546922fa8d99490a34023d86ef71a1cb60b2eca4 legacy-trunk
+19958 dd04bbfd5a76ceeaa052d4131a32f8cac1f285c7 legacy-trunk
+19959 2c1be7924b04afaf74bac7c3c77e1206be45836b legacy-trunk
+19960 26cded59c17253f97c65e14d3c72490e2f3dfc10 legacy-trunk
+19961 eb4a5ff0f72cc853729dc9bdf37fc233a5ed3ddc legacy-trunk
+19962 ee6793ae06c14e0038728b64f3ccf7a1effde123 legacy-trunk
+19963 b650d7daa593cc96b233006b10c18c7b3cc86183 legacy-trunk
+19964 b45ae8c467aaf44d0aebcc82271024671657d774 legacy-trunk
+19965 43172889e8e66b1898c5ef2276342951b77bb6af legacy-trunk
+19966 462b8dfe875391e9631609627cf795cb0cfa81d4 legacy-trunk
+19967 8323b098c6ce0b1c6311d2ae53d28cc18bd444ab legacy-trunk
+19968 9079f70a5b83f9f228e5da8247d66040dca57c0d legacy-trunk
+19969 85d74f040712e64da530948fec0cadac04ee1875 legacy-trunk
+19970 f7e2c3d9c38791d3179cb54a3411a056cbe8ae4d legacy-trunk
+19971 7e181eba6b9bd4d814b94b011e094135d6a13d5b legacy-trunk
+19972 bc0555be22123a4d5a8dc324cb5cc1887d478243 legacy-trunk
+19973 52cb0c5fdf23809928392d323461ad1c6a22ce33 legacy-trunk
+19974 f2717b0137d07274deaafa501f7359a21b809c28 legacy-trunk
+19975 6434dc776cb975a2c3595064a3f7db900facfd17 legacy-trunk
+19976 1380a52f1a2186290f9ea5cc259a29c7857527e6 legacy-trunk
+19977 ce8ac37db300a5a74048f857b39bb45c47d3640d release20-maint
+19978 6a527be4c4d1907d84d9eb43620e5688f3c8ff95 legacy-trunk
+19979 3f2281e24e2dc4cc9a6199f4d957a5f04534272d legacy-trunk
+19980 c064c0d3c49b9362249f6d1bcdb4e66ece50673c legacy-trunk
+19981 74046782072d608c8ac0d79ccff4998e9a782c41 legacy-trunk
+19982 b1abb26229793df7c5fddbe8eb9330ca3ea60dc8 legacy-trunk
+19983 7e938f0e9a497548e899d42a6d587e8b4644c6ea legacy-trunk
+19984 77196557fd3167cae433db809ca77531c1db62d3 legacy-trunk
+19985 9cfd9c3297dd4293c6023c6b0c54ea87187af001 legacy-trunk
+19986 45ad7a468ba2a353bfc6d6f248aab85ec6a835d7 legacy-trunk
+19987 dd5a1b28044079c0622f05e703cad627440d4c36 legacy-trunk
+19988 579ac8e35f5b5e8277877f555d834e8951e04420 legacy-trunk
+19989 8f339269e027d6f8916c3f3ded6c5d9a025beb74 legacy-trunk
+19990 c214f3720658e2b86535f0862bc9747df069f41c legacy-trunk
+19991 989fed28b74f33a448e04f639cd84f731b472076 legacy-trunk
+19992 d9ee56b6db26a547fd73f8c5ed68e6ec79f0941c legacy-trunk
+19993 dcf73f10f7ccf03d79cdf11bd489151518056287 legacy-trunk
+19994 9bf37493387205acf3ddbea7c80a740df2a1f3a1 legacy-trunk
+19995 edda4a43239bcc30b50c20304e88a67eb784224c legacy-trunk
+19996 a38cce3f41b41dfc220da356c5cf0a50651ee5a1 legacy-trunk
+19997 a488a63cb8674e6b70424c96703182e4e69999e3 legacy-trunk
+19998 8ff24abeb388110cb4c5827585abcdd9ef340ed1 legacy-trunk
+19999 1823fa2315215c04e85e0d4a02d0e09d8b1c446f legacy-trunk
+20000 adc8a41bee9f6976913b2b25191e194776ce2895 legacy-trunk
+20001 33f7769a218ed7b54f6b7a85d9a5625b02805f77 legacy-trunk
+20002 7eb8b240dd6c4b01775fa89bcb8e0fa37c50eebb legacy-trunk
+20003 7ed3e7a08a31019dc8393d7024a71f43327b478d legacy-trunk
+20004 bf678a11c21aec7d19fb7458e70c33a3b85139b1 legacy-trunk
+20005 76eab2ebce58a44b4880e5e2cf3a02209f676f77 legacy-trunk
+20006 4863b595bdae86001246e14bf21333b5d159af9b legacy-trunk
+20007 6fe13d008e25f7a932e33cf0150edac906e1d17e legacy-trunk
+20008 e1214f9e12a3ccf1868e3fd5f258fd02747cdaec legacy-trunk
+20009 d31add99a8468ca8cb130052cdf4d6afa39c0eda legacy-trunk
+20010 33d8dd02aa9912919fe62bc783a63f8673cbef31 legacy-trunk
+20011 f9a07e99907e6eb974e493a44ec529aaa7fc1a18 legacy-trunk
+20012 3b6ea4cfeee062ecbbc0f468694e964cefa218e8 legacy-trunk
+20013 848f08559916d4a731896df3283c4025a14d1d17 legacy-trunk
+20014 646ec2a4d7f4e0cb2760902861290f67c99df68c legacy-trunk
+20015 9e6e4f5e56045f864352225d9e70d7c4c63d5c2d legacy-trunk
+20016 da6c662982b64443aae119f9dd616256694431d3 legacy-trunk
+20017 a8301d4ed2b1b95896e0b7a499e8ef8c2b7067c8 legacy-trunk
+20018 2054cea38754bd3badbca3fc4403c43fbcd46a3c legacy-trunk
+20019 1b8745faa2ed2c9f14beac5ecc25b3732f787a58 legacy-trunk
+20020 54b6d28a6878c9b102c68ed4bf3983481b2e5abf legacy-trunk
+20021 1146070f47ec6b7eac445d5c86689aa543e19757 legacy-trunk
+20022 32bcb4e210054ff182f4cb512863450792375988 legacy-trunk
+20023 0b33fc67ca4e49d7e3af44cd017b00da1736f34f legacy-trunk
+20024 1c90a1cf795c9680b7e478c38f7cac92fc1ee249 legacy-trunk
+20025 55218e0495bc4784f3ba7ea544c8d19428613bb5 legacy-trunk
+20026 d0fd60c59aefad0a8ef8ebb98b9f234d99c7df5c legacy-trunk
+20027 0fa2c05188a0b79c6e92e4054e627e95f8a5c782 legacy-trunk
+20028 206a9f1978e500a869cfa3f8205fd609a67df58b legacy-trunk
+20029 2ed845f81b0c5df884816da2f09adfe04633611e legacy-trunk
+20030 816d860026831b2409df065337dd7c06369c020f legacy-trunk
+20031 7243deb020e87e32c075bbd4149e78b7cfe05cb0 legacy-trunk
+20032 c9b4eff15dcdacf7904845cb9d700b4a55f25d20 legacy-trunk
+20033 f58a65d4cc237837ed54f73c6b14448915115c83 legacy-trunk
+20034 f429ee9448aad4d2eb3764553c7554f3ec476cc3 legacy-trunk
+20035 8fb10affb6157acde57ecf821fb13b97e5a03dc2 legacy-trunk
+20036 c2e4ba3c85cc92cb839292070abbfb7a42ea160b legacy-trunk
+20037 bbf5ea2a22e5597b9d7c4da5986e9bfaaa2fd99f legacy-trunk
+20038 8368404373eccf2637f3fbe300539e6524e0321c legacy-trunk
+20039 f07bc4f8db9e6987cd2f6675ff2313952776f049 legacy-trunk
+20040 349c8788604e293249b9eead92b3ff0c31c429f5 legacy-trunk
+20041 206809e25b50d2dde2388aa81929b9e55b3e1fb8 legacy-trunk
+20042 50807c465034b69a23c28466df70ae861ef42407 legacy-trunk
+20043 c74c4bdcb41122f38083a9dadd99680d362e61d6 legacy-trunk
+20044 260868cae1a1d5dfd877fc4f1efe896f4e64ee9d legacy-trunk
+20045 ce90f567fa4202a59c4d7ae1171b9e07c795b534 legacy-trunk
+20046 0b8b6f8406dcfb806d2ed8f590ebff8f41e6fb01 legacy-trunk
+20047 3b8a5bbfd2e5720d6e96140e4c40d50bf49591aa legacy-trunk
+20048 1550872249e9e8519310f1bffcc9b7849d94076d legacy-trunk
+20049 1be0d1c57834025dd5d1c335d2b090ff505719fa legacy-trunk
+20050 8c6f22cef87822d6e00ab65e11aa69d2c59efabf legacy-trunk
+20051 f72173c793b6d832cbe477f66656f1c2de34e968 legacy-trunk
+20052 10940561e891c100c9935a19fe528510c06b97a0 legacy-trunk
+20053 7291891cb0bf7687cc5df073b6e923be05897a41 legacy-trunk
+20054 e3b5d03e3d7db7c6cfbb3f60deac62bb386e9ac3 legacy-trunk
+20055 143ef88ec85634b44066e6dd7e674552b274ac50 legacy-trunk
+20056 ad683f20bb14075b1ac21141ff032fe916ffbbe4 legacy-trunk
+20057 b44e77a129788de5b906229a8209afda7be528ab legacy-trunk
+20058 dc9a151a0bd52a9682bd07700e8d229b8a269020 legacy-trunk
+20059 9dbab3d54deeec3fa0c546fe0ae89b852b0ac4c5 legacy-trunk
+20060 346e978630a9c3bc7de1bf06f076574109fb04d9 legacy-trunk
+20061 0d52358cb2883419548d4a7f85426225140948aa legacy-trunk
+20062 d807488dfc7a12b7ae3fabc921c952489cca214d legacy-trunk
+20063 962196ce7231563fb05844fb63e6e9b13d88862a legacy-trunk
+20064 4f68d3f8fdc82008059779a845ad4897caec2f9d legacy-trunk
+20065 10902ecabca9c730a1df0ed0617e79382f093ffb legacy-trunk
+20066 73f41b0ff7775afde5f426af1a0d0d0aa9d59c3d legacy-trunk
+20067 cd2455cb13ef55c65ec6f58401c1eb0bec0e3d7d legacy-trunk
+20068 e49078101a68741d77a5f04b8cb74ab5121a7de1 legacy-trunk
+20069 596efa7e7df83cfafd7ba8a441a30a6046939d75 legacy-trunk
+20070 63cacdeb8045bd519a26d6d6a79720001895cc9d legacy-trunk
+20071 707f95d05e690764e88bd1cc4a67b24dd0394d29 legacy-trunk
+20072 8df0f65e38603587816d19577db4b9f01a98da4f legacy-trunk
+20073 a7bbf33fce05ae4bbf0229e12799bb5fa392e89b legacy-trunk
+20074 7916d32aa08125d8c9df6edfc62dd2883c8ff407 legacy-trunk
+20075 5ee3543ea33f4250e97c81fe8c85541f46d97cf2 legacy-trunk
+20076 9e6468356a0b337165f5b25df07d2556cac8d960 legacy-trunk
+20077 56d195f21b4fe0da8e5acda9eeab9f42d7ef9d45 legacy-trunk
+20078 f9a30015e8b0fcb4fcc7f5cf2cf787c2e412e89c legacy-trunk
+20079 f2f8f3e2ac231c1bf49acdc5f274768c0b17bd1d legacy-trunk
+20080 d48d09c787a849d140582e785fbb9ab43af594d7 legacy-trunk
+20081 f5d38c5b1751e3d716d5c1563a08749f82deddc7 legacy-trunk
+20082 d718c293a1ffa2b7f4f9818bc70826c0e10eb105 legacy-trunk
+20083 bacac75d22fde9e86a24d0d60a785530da330c8c legacy-trunk
+20084 eb06a02e05076be4ce16d4ad990677db1a043c39 legacy-trunk
+20085 1153796d21c240706bd093120e833f1d7d52f996 legacy-trunk
+20086 4120ebe08dd0416cc3d7c87cacace5d0f17b1092 legacy-trunk
+20087 34ef05441413f26b65cb15400cae82a277658e07 legacy-trunk
+20088 38ef466359492656903c744eb24d6d05d1e079b4 legacy-trunk
+20089 2e7f47314adaa3177834bcf12d4bfd1f7d4a83fb legacy-trunk
+20090 5705d5a8bcb3cd95e4fab0d33c12a9ef36d8a7dc legacy-trunk
+20091 c58b6d868d0816f5a694e10a6be35241254dee89 legacy-trunk
+20092 7a4940a4aca6f729e29080cb9fdd936d760eb428 legacy-trunk
+20093 7057b6aa46ec55fca180c5fde58d70e0c56dad7a legacy-trunk
+20094 ac656c837b6c764bac10eb92d096f33972ea6afa legacy-trunk
+20095 6cfa3d65ab5469bf068b92e52c6aead481e3e351 legacy-trunk
+20096 90546d6e54454fc68594a205f9112e661121e1c8 legacy-trunk
+20097 b742caf0a862a45c3f1565570a8be73b2057ec85 legacy-trunk
+20098 407d60b2fa41a94c9df4e3c665ca8c07ed33ea0a legacy-trunk
+20099 7822394880585bf7b6a5ba2d2af7e7b21cbb4e9f legacy-trunk
+20100 16f145aac2ec12e5d61217832c4749a7b9f361f6 legacy-trunk
+20101 c8817a9bbbddbc4c0ccdabe1a6b06a79cb6c74b3 legacy-trunk
+20102 52da094b53ec39bf9505aef6196eb8f01d84c747 legacy-trunk
+20103 d3f7c7fadec03989caed79490be9cd02881beabf legacy-trunk
+20104 64876bb8aacdc5b1df9d063748425b2cd255aa54 legacy-trunk
+20105 215dc725db84049ed68f55a75b8d7ef51b6b5ed6 legacy-trunk
+20106 4d6ee7f2bee6609a0c30676cdb12a867541a24bc legacy-trunk
+20107 f1a49eec7c2bf1db7585d2ec273109691f0d1523 legacy-trunk
+20108 f6e1fa2db48cbb7a4f72d25be7f90f03d04fa60f legacy-trunk
+20109 a1b99d088cea8294d5b921327d2b434a03183385 legacy-trunk
+20109 b59a536ae1ef3774fd85c17f623e8926b7b6c095 legacy-trunk
+20111 b3dce06868d6d35f5903452e6e90d7f0ac417c38 legacy-trunk
+20112 3f912fb8c1808184eba632867b20ab1dbbcba358 legacy-trunk
+20113 b60096d5001a6e0d836a0660ff95c79cd11e0191 legacy-trunk
+20114 e3cc20e9ea36ecdd787bfb7bfd6df0211a3ed748 legacy-trunk
+20115 eec391a55f844019eb4f3f9c64c16e33d8231c64 legacy-trunk
+20116 b291833a0efb7e1d1466d3e4172eb0134e3ac1b9 legacy-trunk
+20117 f9395f7627c4b7bf24af4b699396d45fe0dc5d6c legacy-trunk
+20118 ab707209409bb958574ad3461065a415a810d287 legacy-trunk
+20119 02a4b0cfc57e1354b0ef7e0a66e3c95328094ac2 legacy-trunk
+20120 3eb8d725996924c2a757fc0ac96196d40fd6718e legacy-trunk
+20121 32fb6643adf1f04cb878eb6fab5555ce6bc715f8 legacy-trunk
+20122 92b3e08319702a4c733b4bf432cae0c0c99266b2 legacy-trunk
+20123 45cda1b39355bc76639e3f5add9717f720c522de legacy-trunk
+20124 bf4cc99d711d0ac74f001459a5cc1b5ee3d83c14 legacy-trunk
+20125 4e19fb8cf1fbd39870ecbad6b6d7882078e7be27 legacy-trunk
+20126 d2b01d4e17e9dcfd2b276a98ca73d49ddd0f10e3 legacy-trunk
+20127 71af3b60aa629123a5643294c9dfed5b8621fed5 legacy-trunk
+20128 5f71185ef2b5addede7ac21bbde7cf2f87335fc6 legacy-trunk
+20129 1412309563256e1e430163fc7ffeec76685e0e4f legacy-trunk
+20130 390a8315d6342b4c2f70f8a21bea244ec8dbec79 legacy-trunk
+20132 7c0472932fbf960bd59bb28d2c92a176232e5ef3 legacy-trunk
+20133 22d85017bece89899b721062f30b29cde9201729 legacy-trunk
+20134 536e8dd35953244d3026fdf3196b6a84e27c63ea legacy-trunk
+20135 ee480382678479669357897b04043f1761991521 legacy-trunk
+20136 1b12e634003894cc18c8412158fd9e7e1f8e9f8f legacy-trunk
+20137 a340ba4aac270d84af6b8d1e022a7f7d6721fa09 legacy-trunk
+20138 25e93a01f86d9ef05de482ffa12c67803b4960e0 legacy-trunk
+20139 0377f927cafa33846386340b2fe7d449af07fbd7 legacy-trunk
+20140 75103bef0c2455d3386caf0447dfba423f352740 legacy-trunk
+20141 59472bcbfb8e8a5abd58b1727d03b557a71c5b86 legacy-trunk
+20142 02cec00f22bb53cf608d2e306f0b8122f8fed10c legacy-trunk
+20143 6d30552cb4f99087a1f390afdeb1243e9296cc15 legacy-trunk
+20144 4aa7afbf29d82157e249c830f1b976d81344b2ae release20-maint
+20145 fdc522dc9df556ccabbca7fd967486de1b4143ad legacy-trunk
+20146 b553fbac146ddbead069b46919a12b22834ecbb3 legacy-trunk
+20147 87d509d085a0fc38852d7198564efef34d681800 legacy-trunk
+20148 870da24d4baf24e7af078f160512904ec55e842f release20-maint
+20149 22d349748384f8666a80a86e869b5336b39a93c0 release20-maint
+20150 c4a5bd08851bcfab5f7ad8a6206967d815bbb622 release20-maint
+20151 ee264669b6780e97ede504f402ebc3e336fd3658 release20-maint
+20152 a002918fc0c27644c47990c1371b986332cda7d2 release20-maint
+20153 12fee7fb019b3b84356b322fcc76bbc2ec9e7ef6 release20-maint
+20154 beb2982d85aa822c454fefe4c97042ffb1510c9c release20-maint
+20155 11a21d59283487a5e3ca6171869ea4f8c1743204 release20-maint
+20156 a626acc30fc2399abd9abb99689ead66469eb91f release20-maint
+20157 f4ca93e8a2d47964c87d78a6a0d68e3e67442211 release20-maint
+20158 6393f55dbd7be9df7e278cbe7b03c192ca5f0711 release20-maint
+20159 5ed4c7e8b4f98ecfdf4635ac6750ba093fe32f7f release20-maint
+20160 9ddbb76c31145435be2fafcb916eab35f15c4a85 release20-maint
+20161 42b1a699a5ddc1cd500b594deaea696ee246b93f release20-maint
+20162 d467d184b429304e83c1c028c103fdc0fb131116 release20-maint
+20163 093e9a24ee767a1d4ccdef196d15bfb98592709e legacy-trunk
+20164 e2e9146f4ab4d9c29bf34b0b110445c97e85b91b legacy-trunk
+20165 24d22eee94cf371573d1232b6cd013e3264a9272 legacy-trunk
+20166 72fd2657be34287f596f34bb6b7b1d56b1b0f302 legacy-trunk
+20167 536cc126fb9f8a07112b050bd1b742baff08e897 release20-maint
+20168 6dc43e0c6bbf503534330062e73b729ee0be190c release20-maint
+20169 e510c4cc573763d3dcd14b612fc95aae0e322c39 release20-maint
+20170 a46964d7111ddef4a2a2921fd74d0c3c4d4667cd release20-maint
+20171 d7e0d20cddadb3632e5e0006f520b91a38c0f594 release20-maint
+20172 d9ff13100e2f2122ca23a9945f65591a5a6e3e4c release20-maint
+20173 5cf355f67aa37b1f6fcdd50b8f9bae3b4caa695b release20-maint
+20174 573a91388705b500fca5b4d73ac1f3df001ac038 release20-maint
+20175 ccef02da88a67f9918374e8a7ea0c1843f4b1759 release20-maint
+20176 31203d99358273cf733b9fe1dc23fc6f787be115 release20-maint
+20177 9956a1c5d44054d64f61f885aeb0f81e4ecbc101 release20-maint
+20178 192f25e41fbbee988bf1b5d995386d4d1df182a9 release20-maint
+20179 2b5768c1359920293e56e0e8635ad2a374643041 release20-maint
+20180 992460c668c15bf926484cee3036c907e3884d95 release20-maint
+20181 8deca79ea6abb55e33f8b38057c956b8fa0d878c release20-maint
+20182 043775b3b8b296634749bf921f9ac80f8c7e666b release20-maint
+20183 f34c90989138345dcf673ad232355b49685f62eb release20-maint
+20184 d1c1350a3a5f42b585c68c498aa24ec8d479dad7 release20-maint
+20185 5a4e0839cce76cf06de24f134e66bef47eaae311 release20-maint
+20186 5bd686e0ecd41f6001987294bfa87bfcf03e66dc release20-maint
+20187 d16edc704da1f58cc54d828f2ab38da2d3f9dc10 release20-maint
+20188 d53a9679a93bb8be81ad95d3e03bef3d25d168f5 release20-maint
+20189 9776cf5dbfe38d0c7881b6dee2d1b55d6bb0b3f0 release20-maint
+20190 76b89fa3ef34060a3cc1d46e4f9a3ea5f4426de8 release20-maint
+20191 c0114edfd31376a886cbd7caa8e135318df05b4e release20-maint
+20192 ef1223d8442dc5681d9ea48efa1954367202bc55 release20-maint
+20193 6b0ff529d6150243b90e09e86e1bb6744dda4266 release20-maint
+20194 7d04245ed75f39bf2e4fd34bcda671fa75e8876f release20-maint
+20195 d6547ff9416bab819ab89bda9eb08e027fca353d legacy-trunk
+20196 03ba06247486630aafa7e0f4edca2308e1ef5e3c legacy-trunk
+20197 836cdf8d1245d5f92b3d5d36a85369d94912d4cb legacy-trunk
+20198 ea326eb4775cc1c40ee1e212d5dd75968e0151ed legacy-trunk
+20199 46a6c28d35e5db8d14a6171c347692b4f493d569 legacy-trunk
+20200 311e6aeef858ad50523e06ea65105331958924e3 legacy-trunk
+20201 288d805af14218f3f492995bebb26dae0d647f49 legacy-trunk
+20202 506a080d39ecfc229239874afe0cbe61bb2a1bc5 legacy-trunk
+20203 37d9ed55416ff19ad64e4f298e3336e074369357 legacy-trunk
+20204 0cdfccdb68710a10c5668dddf32ad349e9465a42 legacy-trunk
+20205 b0a7faf98a8edb3f3ae03ac40f3fc347eec961d8 legacy-trunk
+20206 7635f8838c6892e29c160b8398cd2a4d49e6fe61 legacy-trunk
+20207 b73547bf8bc2487291c50f5db3bdef5c9797f65c legacy-trunk
+20208 11eba5bbfa14ab51a322c3c4722ed2151e49a9a5 legacy-trunk
+20209 6be8bb4808e14ef9ddf9886b8ec56859bb72f17d legacy-trunk
+20210 57a5f6b0337d1e173884eb854a6f8df216b295ad legacy-trunk
+20211 310066b992f2f8a8e1b7870df2ae93fb8b8a74a7 legacy-trunk
+20212 b25a2413020e2358ced799d71d2dd9098951f263 legacy-trunk
+20213 9906db2a1ffa7861147c779324bc47c699a958bd legacy-trunk
+20214 92b65f121a3e9767201ea7106d636a05b915d9aa legacy-trunk
+20215 9b8ea6387dc609fd0a93f4f469bc6880813e47c0 legacy-trunk
+20216 bd110eadc19ad409951bf3af302c14d49a45e770 legacy-trunk
+20217 e7f5b70b0606abb0d8b5d9893b5c88b576022890 legacy-trunk
+20218 911e211b8930b90e24fbe22d19da5b3a2007308f legacy-trunk
+20219 a3deb201ecda10f815daf4ad926a14834a87d497 legacy-trunk
+20220 bb9e214035e125b913485c27536e360c4f563476 legacy-trunk
+20221 760754418ee0270ac4edeb85a9a39a6cc187f484 legacy-trunk
+20222 080828bf8dbde8fe18b1453b6a96cf79a992965a legacy-trunk
+20223 4b346cc3989baa993ea5758dc94db2f49b72e8e2 legacy-trunk
+20224 12f7f167ac533d46a4fee42cc1b61c506e9945ad legacy-trunk
+20225 d328cfeb0c75bc0464ded00ad5c78f7fa3d00662 legacy-trunk
+20226 181d01320ef43e3f564e76d40e8fa10fd061739f legacy-trunk
+20227 b3fd44ffab1e916102e2f6ab13feb1e8a4440e44 legacy-trunk
+20228 92b60dee7f0835df289cce568216615b7b805a56 legacy-trunk
+20229 ccae412bbc3e22cfa6249a702a97c8d27b210642 legacy-trunk
+20230 2146a73ce35c0bdd4499f3ee9b4b17be854ff16e legacy-trunk
+20231 96ea0eccdb31737888358816b677166fba0f28c5 legacy-trunk
+20232 c32752a28652213e2c37e67837c21db0d1150524 legacy-trunk
+20233 a5710578c2e02216629334c1a1b7ce1e5babf823 legacy-trunk
+20234 ab4e4cb094c1f6430d438c93f7afc73aa9f28773 legacy-trunk
+20235 83ee63bcf036598727fb62703ba12e0f2053f8c1 legacy-trunk
+20236 9876d6baf843896381cfc862ecde09fa41d537ed legacy-trunk
+20237 de9858530a553dc84eaadde821696bd110ab9730 legacy-trunk
+20238 f1d2e88fa11de3260583590e2195e31f8affd774 legacy-trunk
+20239 5afffca66e2fae26f206027fabb0fc09e719ad62 legacy-trunk
+20240 f8fdbeb7366708b7339cf1d7d8c8464e25a60dec legacy-trunk
+20241 876861f135436ce7c79cf96ec05b2970165aa3f0 legacy-trunk
+20242 a9ef44bbd968290597b56866694f2307e8276886 legacy-trunk
+20243 e722d4883e19715ef288a52e1653df0cc03e477a legacy-trunk
+20244 3308afcaa13155d73d63b3ebeb3dd18374ca7fd3 legacy-trunk
+20245 2d30a099705f39fcdceaaed85d6349967e27b1eb legacy-trunk
+20246 ed3e66f30837c22116516fccfd7e3b5f63693a6f legacy-trunk
+20247 aed6b1436db47870f5c800594230a443990b3da0 legacy-trunk
+20248 1943318fae3177a58ecbeec0f3c94dc816499524 legacy-trunk
+20249 4468a8da67ca010424eaea74a7828cdbf0f6f5f8 legacy-trunk
+20250 28cf0a7943cfd7b23531bc2dd68b1430732a4bdc legacy-trunk
+20251 cc8a21ba644998ccead429692453e7bfd8d24a3f legacy-trunk
+20252 3aaedbac95b312be5f1391884994954b6fc6186e legacy-trunk
+20253 a1840b9b14f145f0d1f10d972ca6b7d3fce809f2 legacy-trunk
+20254 9621d0fbc2e52f0d7f4981b73f970ebf0e7f3366 legacy-trunk
+20255 ca565e3d3cc5c0697fca3d3be51839df1576acc7 legacy-trunk
+20256 6b8d91ea9de34340fdda6d42f212bddee1ad9845 legacy-trunk
+20257 d109ec667ec25d8fed1062a3476f0fe68f1421a8 legacy-trunk
+20258 8a3ba10f10f6a254916ad480eabca12385b7c1b0 legacy-trunk
+20259 11e8bb4d845d2c0be53fe01abbf56638117dc3a4 legacy-trunk
+20260 5079d6e3b615080078665fcb4d62fd247bd0b2b2 legacy-trunk
+20261 e2b3e6d853430a210fcbaafeffae3ad1150331eb legacy-trunk
+20262 bb75d93f6a31c9334dea6c35aed80bdc47aada77 legacy-trunk
+20263 f398e5856fa74653055b8bbc38a639329001b1f5 legacy-trunk
+20264 65f363236ecf7fa6a836aa9f35cdc1e237421901 legacy-trunk
+20265 e843eee7a33e8625b0626a497ffa6422329f1b5e legacy-trunk
+20266 d3827922909ca25754db9c7651e1d51544152ce2 legacy-trunk
+20267 e54e11c30e4b15497c3f72cfe469e184d0203a02 legacy-trunk
+20268 cb40e770c903dd8e0b998991f2a134b5f92421ae legacy-trunk
+20269 0c87ac674ce1820674a983d4cf5d231ae7a3448d legacy-trunk
+20270 a80a847f5f4eba58be100950446fbbc54fd163f6 legacy-trunk
+20271 5f68754eb3b6bc8007c33e970fd0ecc91b8d81df legacy-trunk
+20272 30e5270db1283bf8cda0aa86d1626dfd84c3923d legacy-trunk
+20273 0f6d8fe4a3a91cfd7cdc70927f5a42afecdccc49 legacy-trunk
+20274 4622af4da9e282fb1dce78a5ae3119ca19d44a1b legacy-trunk
+20275 8a2dd97873f25762ff4b7cb33970fa625cb93489 legacy-trunk
+20276 d368552c2b726101f9ffb869ac6565579ad9681f legacy-trunk
+20277 7c4bac2f7b3ab718e239b703451ce85163c9d59e legacy-trunk
+20278 9b297af18e2f31508449ce46623b7e48187c8fd6 legacy-trunk
+20279 b612b519d41a5469876e5309a9e6c7126f4ec521 legacy-trunk
+20280 bbcc9837312e8e59f6bc5809d53a81f7e3cca348 legacy-trunk
+20281 0ec06b4755db724d526eda39243e3f34cc74f812 legacy-trunk
+20282 e4abe74bc9732d728b31a5f4a539512903c2e6e7 legacy-trunk
+20283 471ce0faa7750f4208e695216ec744d741dfbfcf legacy-trunk
+20284 b2bc56332045ae02525ab931f882c407c51e5d9a legacy-trunk
+20285 112bd47e078d31930c6c5c8172a58a0eca667470 legacy-trunk
+20286 6873549d484c7585d60bd2bf3474e88a2a32b02c legacy-trunk
+20287 4b06e4db0075dc3b055bfefdc18e6cea3e4c3b48 legacy-trunk
+20288 717b0c8de71e9a1267ee62cc8d8fb6d7c2fffe49 legacy-trunk
+20289 863e8073c7aaf31f317be872fd1d7657dc3c09ae legacy-trunk
+20290 beb9d2b0284657be23fa9f9b34498e2daa88c89f legacy-trunk
+20291 cf8a595cec33748b52362404f73353a5a6f89b58 legacy-trunk
+20292 004c9b0319241c5c0546ac10cb59b54b9047b7e4 legacy-trunk
+20293 70763c4752e2fa3f7ec6ba390125046bf0039a89 legacy-trunk
+20294 13857fb3301770cd2ca4276b1a0bf259d410afb9 legacy-trunk
+20295 853d6a97b7d9b4d386c735f6cf0a270c6e86535b legacy-trunk
+20296 3b905f28f225698c8b4d3f56c513047d98eaf391 legacy-trunk
+20297 34ec5e2fa3561ecbf03aeaeca8599afc9c0620a4 legacy-trunk
+20298 01791a097456b6fe7512e608d7111043a212b0e9 release20-maint
+20299 afbb65b60fa2038193241b505662470e9326ea93 release20-maint
+20300 c9e07bc303a23ed0c783b99061a319270d69c22e legacy-trunk
+20301 9d76d8552c3612774d6aaaf478e647986d0e0f93 legacy-trunk
+20302 694b8c3f25e7c6d3731f142559a842a8c4887d24 legacy-trunk
+20303 84a3d70ec6f44d65faebc749d8e92398255955d6 legacy-trunk
+20304 f967489ee3b64bad86e745d15fd867e4d25bf6f3 legacy-trunk
+20305 bd844b20b9c8544fb9199778afe79f08972de14e legacy-trunk
+20306 3704be3db30286260f628bbfb6abc18efaede4fa legacy-trunk
+20307 bad2daeb7440c3312042d56f8640fefd2d27cf6a legacy-trunk
+20308 4c497c5e72adce1db8dcb85a26c492130d02f1d6 legacy-trunk
+20309 65a92251d6b85cac2359e263d835866a7bd11889 legacy-trunk
+20310 9dcb4bd651548e87699a620f0bc6f90b3dad96c3 legacy-trunk
+20311 b8fcf45dc6fdc743923db7664c9404a2b57c559b legacy-trunk
+20312 965eeb44e4544121c22174690c02613e12e0c2fc legacy-trunk
+20313 3fadc37cfa9209ed40676e5a09c2640a3776c56b legacy-trunk
+20314 64396243c1141dcf908760d73c1d407045bbb43d legacy-trunk
+20315 3402c7166d3081144cca4cbf242eec0368558464 legacy-trunk
+20316 f3f9641743a07e88df9efc7986529abcf0dc69b4 legacy-trunk
+20317 632c4d5b75b7a96dec3fca32d3aaaab9a2aa2121 legacy-trunk
+20318 7c61715752be2026abb58b04513840790109d01d legacy-trunk
+20319 8ec7f656f80831e6dc6612a243e5e5610779f0a0 legacy-trunk
+20320 257b57bccdf3be894b2bd8fd9767ed792163a647 legacy-trunk
+20321 3160da4ddd891ae0be806fd1ffe2eb67ca307798 legacy-trunk
+20322 ec075cc82bdb3f57c2ef5bf78fcdd4738f37b2d2 legacy-trunk
+20323 c2fb2d476bd38cdf27ab385c3494836282bb0085 legacy-trunk
+20324 e5009025e62f2c1af98fc3470f3015fa02dc6f14 legacy-trunk
+20325 b4b3cffc7c355ff214a4b44d57f00f1adce0dd86 legacy-trunk
+20326 bfc10a80545baad8893b2b93141b8c44d6d8b724 legacy-trunk
+20327 b005eb9bc842d97a5a315d21d95ac11ba2e81f13 legacy-trunk
+20328 2ccc0f2c9e1f281fa2cfcc1b2fa063c742d91584 legacy-trunk
+20329 0f32ab5afff89e644b16770614d85aa66266524f legacy-trunk
+20330 98f69245bb69cd247afd43298446bcd93abb7467 legacy-trunk
+20331 02d69a88703891214b78728c52c34aaf1a54ea0c legacy-trunk
+20332 41a423294cb51312859a5ec6066dc32fc3b5da68 legacy-trunk
+20333 fbc12d6cd0511b94e6414b05d570e039b9afffe9 legacy-trunk
+20334 1cdff2838a178ef461d924bb9f8796454ba704b3 legacy-trunk
+20335 74b9fb1c963397928a3e5c0ec8dc8f9ae5131a2d legacy-trunk
+20336 2d521420db8f1e292be2d4c1cd7118de1afc3cd9 legacy-trunk
+20337 9237f58dcc19228f090d5f632ed80a305d6be531 legacy-trunk
+20338 111902c991a904f3ca2e14024fa78a0f54454407 legacy-trunk
+20339 f0f0467a33342dac86769ec17b910378418c06f6 legacy-trunk
+20340 0184c50a87510ada817eb599aea5939eb445abda legacy-trunk
+20341 0475c8b7223ba58b84719a69871a21ff7919767f legacy-trunk
+20342 45c1825196ed6603a7d2da5d59e20aa2898182ad legacy-trunk
+20343 51c8ce1a2e259953f29dcf26c6b201b5fce7f87f legacy-trunk
+20344 f74f5aafdc7e250a5d54d335238f8f945e4ca9a7 legacy-trunk
+20345 9941c44816c1c730689bd4f5fa941e7f7f6843c3 legacy-trunk
+20346 1a2fd5c4dcf570fd10dce443851300a87d146e36 legacy-trunk
+20347 f3b6ac128de9f1375b8a4f8d0748778f89a8d2f7 legacy-trunk
+20348 d915777833357641461e48d916f327bc1cbcc9bb legacy-trunk
+20349 4ee346b35524a885dddee4099cbaaa1925e44f39 legacy-trunk
+20350 3bda59071389513417041e881e1b94cebe08df54 legacy-trunk
+20351 66a7c8c8dd27238f64430b22dfc0f286df7d73bf legacy-trunk
+20352 0d0546bd8448ac5220c01fdb83b201887ace7e9e legacy-trunk
+20353 e846e960e7f631fbb3aa061ad51c3e500fa14213 legacy-trunk
+20354 99c471ced170185cdfcd82dbde604b7c77ed51e7 legacy-trunk
+20355 a004c62e696e6e229106f7a38781ca1931fbbdb5 legacy-trunk
+20356 e8741dc36ad13b9194194894d62ac2293ea8a399 legacy-trunk
+20357 c29ee373f718f78ab42346d5acc14ea8cb63b5ac legacy-trunk
+20358 f1ec52ef771c11a6b4bdc4b78b5a156a3f70a9bd legacy-trunk
+20359 f24272e8962152578851dc912903e3b2005ce5a4 legacy-trunk
+20360 b84f084b2992a81e6b06c209bb3cec35f7067621 legacy-trunk
+20361 4b9e684bebb872eb3be25fd47ee5ac33e6c5b051 legacy-trunk
+20362 8aa4de207ae364b44baac22868ea9b8be0321e6b legacy-trunk
+20363 926b64fba5e7ed59a2f4013acd634313b9054d2f legacy-trunk
+20364 b4e2b8e9f1e6842368f96fa943995f25931e27a4 legacy-trunk
+20365 24e81b43067dc65f5aa23815d0940ac448a2d820 legacy-trunk
+20366 2888fc60bf9acead64de1283d1a7665bc9d920d0 legacy-trunk
+20367 339a93b0084c75b3ac41786d6231fe5455586768 legacy-trunk
+20368 142545d2aafc80a7773a6f90fa7500bcfb8b6540 legacy-trunk
+20369 4ab58624653e7f55ae1b904a280f9215b9d36f4d legacy-trunk
+20370 25f55b2e38acc83d2bd2ea154a177d9d9a4b510d legacy-trunk
+20371 0b69e17e055fa74e2597cf3e76ae11d016a4104a legacy-trunk
+20372 613dcd5476b6e6da9bffee33bef2f2b4e73d10e0 legacy-trunk
+20373 ed07d6a873e7340c5ed9ca2a0f9392bd8ce8b4f9 legacy-trunk
+20374 04daee3ab627a0a692bab92194d52b9c6b493783 legacy-trunk
+20375 99ad0257b942dedc17c6b2dfde0af8e5600d78bb legacy-trunk
+20376 2265032efc9f0f4bc628db24f9d3f635529e437d legacy-trunk
+20377 71752a41b57f98ba6cc65fd88b11182a4fcccb87 legacy-trunk
+20378 7e829dd03f97a8b69cf09ff1aa2fc63f33195cfc legacy-trunk
+20379 640affdf99e507ea51412eb872719d19dac2e01c legacy-trunk
+20380 74e7e93ecd41419da6956adbf2cf7a1dc776c23b legacy-trunk
+20381 96bd4a84f1a494c27e5c4acab3db5d43f6ad15be legacy-trunk
+20382 f7c12ba4273708ec8a9292a7702702e604d242ee release20-maint
+20383 5f4fcfb8d3dd366701ace3083b4b802f4fa0504a release20-maint
+20384 35139a9454d438015ae7b20a7262d925f3f6940a legacy-trunk
+20385 15b7609e3e2c891d4d60234fe60f5a726bfc7437 release20-maint
+20386 b65d089e8841890a10f7b88ad9eaf7a6a1ef1f07 legacy-trunk
+20387 6eea4ceb75165282e2b9b829c60cb2fe8269349f legacy-trunk
+20388 a34293ced63b6109f475e65d88366f12c1f7d4cb legacy-trunk
+20389 e526d9248965f47d4735cb554ef091548da00bb6 legacy-trunk
+20390 0b060cf762ce738519e92e9ea4fc472ad82720fa legacy-trunk
+20391 6a377620175075fd3cb976dfd01eb45fa3c7a734 legacy-trunk
+20392 f72dcd67cccb09cb1a80149d41bd564e4a5e0c1b legacy-trunk
+20393 806fd88015f53b73916266ea4a6a61712e8fd632 legacy-trunk
+20394 5e99a1d0ea4dd79044a70c0114d27187dbf1e949 legacy-trunk
+20395 61d954e7be9923a434ec9783c6807e3e6441aee9 legacy-trunk
+20396 c5bab794dcde6449c2857b0a2cb6726a626736f9 legacy-trunk
+20397 327efb59dbcde7b60cba38c3ac9c38f2af73177f legacy-trunk
+20398 8e1415ef9b28d8326ebfe25bcbc5c411c623c670 legacy-trunk
+20399 11153c14199931aaa646b1162c79d7fa595481c3 legacy-trunk
+20400 55ee15c4eee683f4aaa250b09482f5e4b72eb42d legacy-trunk
+20401 068fb58a11d48681c15ae9703b85c2022afac972 legacy-trunk
+20401 d611276e9ad53b5d32d1e8065e1d811c32f7d96f legacy-trunk
+20403 7b67eb26b39ab68bf562f7362dc95db5e4ae6427 release20-maint
+20404 fd0683cb73012faac05fb3d0c916648d42d136fe legacy-trunk
+20405 90ae37ff617fceb6041639290171cf5d335b79e7 legacy-trunk
+20406 76fae614526cec1eb6b55da95b9c6ede2c7087aa legacy-trunk
+20407 c651cfd0ffd488a5cc37cc9d8d960bafcf754e9b legacy-trunk
+20408 773c64d38ac6897ce4e998ab4d6eaa605238ddf5 legacy-trunk
+20409 81823cfb5b146823b362172dd828b3d03a81a9ff legacy-trunk
+20410 33d71e80a09c77319094ddaa07420f694e3219d2 legacy-trunk
+20411 1e23d91c0a821c06dc68272b402aec0f665fd05f legacy-trunk
+20412 f939ce52a734d5d2f6b04c20680d70b13b136cec legacy-trunk
+20413 f9dfd587c142b68ddbdfe9ccfc9dbe37c7517b91 legacy-trunk
+20414 05bad2f05bfa6ecef2f14e40873af6bb8d7fdb5d legacy-trunk
+20415 c9cae5a70b48297212507ebc48beb147b990ce07 legacy-trunk
+20416 b2840a3c5601d7743000241f6871e45fbf92e495 legacy-trunk
+20417 8389c4df488db05b3e0150bb7873d035b2e367cb legacy-trunk
+20418 79efbc9a03defc32e37009e39d6a5a27cfa63241 legacy-trunk
+20419 5fb0c46753f983010773c2929df1771e25b87c34 legacy-trunk
+20420 0f5a26aa4e4a30ae64b3d3d1f6df792f40a49574 legacy-trunk
+20421 01be08333308ea353bc47d6c6490c2318a4f0a05 legacy-trunk
+20422 500d53460f5608358b061aa5862391eed50f1c61 legacy-trunk
+20423 c4442fb99d265fb1498c91385e241cc958609e27 legacy-trunk
+20424 17a71d2b81f7cf78542cb3538f79693898e81f08 legacy-trunk
+20425 c497fa3fe38a2e3c85d926fe1caf39f52cdc4cc1 legacy-trunk
+20426 dd6be625a9233f85959021894be093b025936f27 legacy-trunk
+20427 1cfef8ade2707390340e9722b60fe34dc1cf1384 legacy-trunk
+20428 025929c1531d3d76f6de4cf7bf2ce91dcdc5ef4d legacy-trunk
+20429 83c7b4b75668ffcd4722eed5139c10f8b7ad0e24 legacy-trunk
+20430 d2da681ccb54df4b0b2e6e3de763c3c0c80baa77 legacy-trunk
+20431 e1c507cdc6f1f7cfd7700e8dea40f9d3f9ebf546 legacy-trunk
+20432 162fa6b1366f3b4a47c2cdab0b492a79730b8f86 legacy-trunk
+20433 f17a830e25eab34e218015573a99ac0ea866a5cd legacy-trunk
+20434 52a8e35df127994c28b5e51171f8cc0e9684625d legacy-trunk
+20435 e0a5a63ad756961bdb6b44b008041da4d6253aba legacy-trunk
+20436 4493199d2b956ec18cbbc2bf33e823405d690e26 legacy-trunk
+20436 ff065e674af6c9ab895bd9eff7d9e9039a376c7d legacy-trunk
+20438 49085bb7bcd9941699c9a0af295adddd6516c143 legacy-trunk
+20439 e522ed80fb3933a61b6a5aa0c7bfcee5b3fc9a57 legacy-trunk
+20440 da5eab33147b9595b04c324bd783d3f2a50550c8 legacy-trunk
+20441 6252693afd9af1cbd9d6d6946a32379b06cde8c3 legacy-trunk
+20442 354a571a05b4f4e5108187c53e43dd35029c28e8 legacy-trunk
+20443 693fa6b41dfa5e0bce6a25cf55087ccbd20d8d62 legacy-trunk
+20444 84d7839bdcf63dc0e3594ac89a497c81de709fd5 legacy-trunk
+20445 cbc9f886559589cc4d40898b1c08101cf1fc937a legacy-trunk
+20446 05436a74012d1c6026d929251eacad6aca79627c legacy-trunk
+20447 1d9951d126f5c345908e32052545d78e36830ac8 legacy-trunk
+20447 020e95d8180d7943fe54701e1db0a7d7d87e2b1e legacy-trunk
+20449 19686a6279f475eb8711758b4ca33d2763c26db6 release21-maint
+20450 fff30221d19a34c0eebfddda30b65975a686c48e release21-maint
+20451 732ddee68957208b1e7efa2809973349750c8c47 legacy-trunk
+20452 d06bbb8c493ac01697eef401484a1b4c85d94da4 legacy-trunk
+20453 28c14a79ad225b53215f3cf44279cefa20e867ac legacy-trunk
+20454 db928a277f8b2e848533d399dbb262325870578d legacy-trunk
+20455 36232f543220eedc8d3af7a11493363657f76f6f legacy-trunk
+20456 895fc5c95763ed10d7a4d74db9813c11da14738c legacy-trunk
+20457 283683b5e767c7914e8180eefe9a080c6de36788 release21-maint
+20458 b6f08d2795b5e2442c8faaf051d9f9ed0ed48767 legacy-trunk
+20459 88a5c76ffc8d3d8aee3424961c9dc7e5d2e2328a legacy-trunk
+20460 42bcaffa5d9b1ae747b3c52a680fc797a1504baa legacy-trunk
+20461 d944423e6fff6dc2627683cd02ce86b0c10ac48e legacy-trunk
+20462 a9ad8deac17d5b2fb26d3913bb6bc43ca46c8937 legacy-trunk
+20463 0405c657d2ac9fddf2dff67d8bb53ce3c874dc6f legacy-trunk
+20464 75e322d604f16e29872ee31f9d01f106daed878f legacy-trunk
+20465 3eac20afd54aaad7477266dacc9042f4d926653b legacy-trunk
+20466 518db454863019a4e8fabb3c14e2af894540c3a9 legacy-trunk
+20467 d112f135af8d1419f37672eafcce9754b887c90f legacy-trunk
+20468 0dd5d6d9a952a6f11105460834452a4ac21a37e6 release21-maint
+20469 7074303846031917c2630d3f98ceea856d13eb75 legacy-trunk
+20470 ccc44e543beef17eb84108b45981f7ce3fc50227 legacy-trunk
+20471 3dd9860e4e2d4bd3e7d824624c26dce49d4cafe2 release21-maint
+20472 228f4b8d18f01a9908739b41b72fb6575083335c legacy-trunk
+20473 452666cb283df8b9245b33905fa8d9917f030d46 legacy-trunk
+20474 c657a3937902077265de0adc4a06eb71e859051d release21-maint
+20475 c1937faabb23748a4e283e7c4e90c7d2ab77a0a2 release21-maint
+20476 2fcb3fa67e3b6878664c52a3479ccc1bb32a70dd release21-maint
+20477 0d70daeb896e1ef39b90403219ff24c9e4efd02f release21-maint
+20478 f99df2a0e2cf9c623118ac6e990018f3bfb0d2c8 legacy-trunk
+20479 d16dc26ec427ab00b9540e8c80c160e17825c2e3 legacy-trunk
+20480 c5f7191ce67e934bd1f12bc5dd17ce3a5861be8d legacy-trunk
+20481 7eb87cf16a5360c144bc529f29f0033abcc463aa release21-maint
+20482 5a5805a45dbf494111e0aaf8f421ef631f71856d legacy-trunk
+20483 96f9b86b7b3ddd6760d0ea3f79611fc5804d1821 legacy-trunk
+20484 1e3042a4e60e2e3cf1247f709ccfb9aa9a180478 release21-maint
+20485 44a3ac59c268dd8ea520f8fadb8082e885deb3b9 legacy-trunk
+20486 1f3a194e21f31f457fbdd43b7e6cc922943c2a9a legacy-trunk
+20487 00a6b0605113535e3f318838e485716589f6b6bb legacy-trunk
+20488 56f1b8ba5ca17d1bd2951afc5855f418495d15e1 iter-branch
+20489 bf94af396b1e107ad3cd8f116716b276ea812db8 legacy-trunk
+20490 1d726f5cd57a0fdfba622faaa35fec2d676c9e2b legacy-trunk
+20491 1b49b177a105e13cca1f1c4e7b41feebc465db26 legacy-trunk
+20492 32e7d0898eab85de8134f932680a85c6e7abcec0 legacy-trunk
+20493 c3bb0ff396dcc633cb67196a43776133f7023ff9 legacy-trunk
+20494 e15ab4e652adcb7fa556a18154cc116d49c7b562 legacy-trunk
+20495 1fe8e50e6e1b982d7b7dd1f68e6a94d406a35b35 legacy-trunk
+20496 b6dbfc45ac9bf19038e1cd3258d9b9ac20842f39 legacy-trunk
+20497 f63f749364effdd36e0f7c849918d9b679329554 legacy-trunk
+20498 d638e419c30452d9d1d7fe9a9861fd0b9d45ef3d legacy-trunk
+20499 d324ae2892ffa4abfb217f5a5989a7d2d09a90e9 release21-maint
+20500 4d7fb24fe7953f90f8364b2a1fad926b2e6bba65 release21-maint
+20501 4abd072ab3d5b5bda1cd6acbd0af71292213ad5a legacy-trunk
+20502 387e80e11a795fce56767cf49fac321a3e7cdf1e legacy-trunk
+20503 22af15f8410a8b2773434d9afcdac228c0421842 legacy-trunk
+20504 79f0cd3a71a1e996ed843a20c7170cb8dcbc92ce legacy-trunk
+20505 624fc9713d18b110156dfb6692d6a5f261f0af84 legacy-trunk
+20506 1eb00a123a0ecd7d6814620904035b0bc5951bd6 legacy-trunk
+20507 c19d6db6e99b7aac7cf7c8ec9a20fac558068264 legacy-trunk
+20508 7dcdb16bd068ccaec59174756d799c3b42977440 release21-maint
+20509 1885417f45da39855b8c4202836a2f43b0067e0a release21-maint
+20510 b830df083a9add0709b68d0b5192316a01118586 legacy-trunk
+20511 7acba78e1e091dbb7eec29083016f5bb91c178e6 legacy-trunk
+20512 aac65f50df6ff144b6701fe51a163b30a6bcd02c legacy-trunk
+20513 b44ba7c0121775d64410cf1c93d0275b5c82a4b4 legacy-trunk
+20514 1b730bf3f8d2ac1d15237ec9eee4d52d267dfc6d legacy-trunk
+20515 efb5c814ffb6ab4856ce822bf3cea731633bc6d1 legacy-trunk
+20517 99e946a82699217060b95da462ab7f7afb006b2a descr-branch
+20518 e2af90b61b2bd2679b4eacce3f84d35dc664dc16 descr-branch
+20519 b7a7135bccc8b3e1ad1485e7f770ee6d411de8a2 descr-branch
+20520 0b5d3e0312018adccd090076ebe11f0a8dcbfb07 descr-branch
+20521 c97b37136d83e35300509bea52a45b11ae1eaba3 descr-branch
+20522 6819310de828447cddfff0d601650691afd559ba descr-branch
+20523 a1f07fcc3d413f7527f4fd952220e3c9c703ec13 legacy-trunk
+20524 44a0a9a277ef691a3cb3db685af1057b93860845 legacy-trunk
+20525 1686080a7c6c376d37b05ee252297fb90478d491 legacy-trunk
+20526 d91fc02268d8d010b725b10f00b574c9e13e7caf legacy-trunk
+20527 9c1132f3095a063ae4be6c387a60722e14546836 release20-maint
+20528 950f1c3a8e6aa15f1d437a2822190316db2a0365 release21-maint
+20529 7e8ed6e39ebd0d75593f01ad313877e91debb07e legacy-trunk
+20530 91cbd01b85cbdf91ac351f7d7d10d63c719916f9 legacy-trunk
+20531 a9485d404f05d241063711450a19776cb885458f legacy-trunk
+20532 da4809947a32105b8f4d2b75261ccf1e556e2401 legacy-trunk
+20533 249123c1f4dc11340a4b40c7df45d2fc33e4467a legacy-trunk
+20534 fcdde680331e5aecc4842b23f10039d016582f2f legacy-trunk
+20535 7f5e3e6b2a39207500c20e09c7db1fa5da554ce5 legacy-trunk
+20536 0bc3377d0d7208bc2239bac40478c60fe6603688 legacy-trunk
+20537 b7df88a78adbab81d9f87b680599969f5af0d6d8 legacy-trunk
+20539 9921a9d27f728c61905613ef62eab03f19ce23c5 legacy-trunk
+20540 8ff76cf30a8cc37cf6eea36cf604b4beb799b848 legacy-trunk
+20541 7d676b4237a9932f913fb281317dc2c919101038 descr-branch
+20542 32e735bef0bc29b0569366474d113ccb3ea885b7 legacy-trunk
+20543 bd65f8893be3aef405014c5a3279ccaa333d119c descr-branch
+20544 b125416394faca3064ffd7f212820db4ebf67369 legacy-trunk
+20545 a19e68e365c7571d9784946131b38857dc21ffc3 descr-branch
+20546 9934225fe29782740bf0bfef08e2a600fb684dc0 legacy-trunk
+20547 9be7758a8c94c8896974319a6330de24dd3108e6 legacy-trunk
+20548 b28236349de514737111d3c5e66c4f11122ab378 descr-branch
+20549 9e81d391b76589d86facc45dac2ad355c3700567 descr-branch
+20550 987ceb9ec02333dc0b1d0353654db7d785d28c98 descr-branch
+20551 887b5297652a3c6fafaf0d2ee4abb62b07ca14c3 descr-branch
+20552 e06c36c13f1286243ed085df05055435781e4914 legacy-trunk
+20553 53ee0fa676617a917c9a82a9e711dc26e4af00f0 descr-branch
+20554 013deb5e172bf5c94a136e117fa0515e77d0b7c5 descr-branch
+20555 7037d1f6e79aeb4694001f7f96108466f52cf524 descr-branch
+20556 587da29d69d5d0ce97143541414796d6be793c10 descr-branch
+20557 1721262abaa82a337dbaeb4573f21f981774fe9c descr-branch
+20558 4b811a71be5c2fad97ae5c9fa220ab29cf1c70ba descr-branch
+20559 ae07599adf33f7a86dbd75e5cfb7ef672811f775 descr-branch
+20560 e2daef068496bc136b613174c74500837ba4e1d6 descr-branch
+20561 56c5445ec83586e5f777aafca5d06a633f36e58f legacy-trunk
+20562 aa7087ac6d9559bc991f8dd09f4decd4b7467005 descr-branch
+20563 bd313a5e20d788ff90d1105057f36f9f41df640f descr-branch
+20564 5dbfe8316236389ce7a3d9e60bd883398c4a1f75 legacy-trunk
+20565 b5f583eecb203c4c284b20cc343b04c752001170 legacy-trunk
+20566 d1ec679baa3db82ab85adc807c2ad19d0e150c43 legacy-trunk
+20567 557aad3e74ba634b02feb8076d13b75b2a2943f0 legacy-trunk
+20568 6c82277e77f357d74a357180476d4c40580be06e legacy-trunk
+20569 dd24abcb2331c78cd68d5ea4d7292915e8cc9417 legacy-trunk
+20570 11181cd3897dc1b801cc1d19764bc31a705cf5a9 descr-branch
+20571 7a367ad43f35238d4664ccfb98af4e0194ac7379 legacy-trunk
+20572 fa8326cc761cb3affd6802ee03e13b35a5f04a74 legacy-trunk
+20573 ebc24a1041329c5eef2e50ae9c9f6a6486288ed7 legacy-trunk
+20574 a84874687cb1cde38717809865c55788a077b511 legacy-trunk
+20575 a97e18e499a9cf7b1bb4c0a9a23d4c9156f05845 legacy-trunk
+20576 0470babdae49fee8336484e4d1239787dcee8ed8 legacy-trunk
+20577 a6698a016afe2061f77745b172b8e0262414f700 legacy-trunk
+20578 085f460b0e3b5994a24bd840b0229aeaf60dbcb7 legacy-trunk
+20579 d6498b1ef50d1cd93f0d7264293b8ef5301fa3c2 legacy-trunk
+20580 deb8a5e151a346cd54a64b0467cdff0a1de286b9 legacy-trunk
+20581 30d7518e17e5bfa9352d256985ac64c7060e45fd legacy-trunk
+20582 0ff4cdf34fc1a50f3e0b6f45a7d74adef1d06a5f legacy-trunk
+20583 64523307794e93547c585625a06b4b71f3fbfc37 descr-branch
+20584 5b6d5961c9e38e0f62f1948dbb36333c60f6be74 legacy-trunk
+20585 d76649bd38d01c96e5de26c1cdf6b00bc3c1914f legacy-trunk
+20586 b9076d8718ab1d2dbad0a0c44daa08fd97f017e2 legacy-trunk
+20587 4c29b04e4d6fc186c51fdf1422e8a1269b751745 legacy-trunk
+20588 12c80b570d00a0ecb929b8cbe67afbd45cc11246 legacy-trunk
+20589 76ee8b62ee2a82d623c6c4e091a4c8cff10edc66 legacy-trunk
+20590 15cce3d80d0fd8d3bb1a76d30407aa96248b52a5 legacy-trunk
+20591 d7d05103c023fc64599ccae34f1fd12437b102e6 legacy-trunk
+20592 8d9eb5a4ebcd98ddb584e94870ad2acab4ee7582 legacy-trunk
+20593 99b06a649b147b750c7d8adf5e6136b892992c06 legacy-trunk
+20594 7948cd4f766374243fca1487cb6e4aae7e47fcb1 release21-maint
+20595 8643e6de13dfa7035a4e8de43b23b7da384eb0b7 descr-branch
+20596 e6e81dcebfde5d9e4c2563a810c02f9e0e4cf54c legacy-trunk
+20597 98f34c4643e9800124cbe4ddf0f64f87c41ff2a8 release21-maint
+20598 0be277039d93b42f36da7cf9351fe32c8e73bec5 legacy-trunk
+20599 d80500076e9fb95cff82b80e2429d8fb5571648b legacy-trunk
+20600 bf7f166d3c97460db0e8922e0a57917ea4464bd0 legacy-trunk
+20601 55e3201895087b3ed1151532f95860b5f296b5c5 legacy-trunk
+20602 1c2d26eef7ed1b59c982d755a14d84e46398038b legacy-trunk
+20603 bb6c59a85ca147dd14d77c7c9ebed37bea0b07aa descr-branch
+20604 8b0c0c482a55fd06d9ece9d37d7c0f667f481d0f descr-branch
+20605 839f6f2cd66f3cfda261996815ae0eb9f8eacafe descr-branch
+20606 3091fb83d5271ccd391277ab53a780f66d365e66 descr-branch
+20607 8fc7becf7839472927ff648cdf6f9bd982ee18fe descr-branch
+20608 0a9e3aa71db9f230b857e89d83843ed5a98c38bd descr-branch
+20609 82f8a2b1b79cc32db16a7698f2c6afba20c2e3a1 descr-branch
+20610 fc658adcedc8e9b4bc286e95fe5bf2c955632b5a descr-branch
+20611 f89e85153d047539c4f474344a0c96802b5fc0f5 descr-branch
+20612 39cabd0aae1ebd2853e5cc58cf366c7b1d34db3b legacy-trunk
+20613 9d1e304ecb18a58db4fdacc3081ad2a75584d529 release20-maint
+20614 5527d62fafe05e6b66a5e80a9f6e0fb1afddc594 release21-maint
+20615 6f8efdbdff4823bcafede21c38a6ea8a1c1b56e0 descr-branch
+20616 162b94c8d2d1a94ae6b8c45f75108eacae7629a9 descr-branch
+20618 e9a4e27e8d4e16e14b32ab266953037ea2468115 legacy-trunk
+20619 399d99601b2dc0d2e7bb4b550d84218c3773d195 legacy-trunk
+20620 0c9877120f381783f7503bdcab4d560050693f6b legacy-trunk
+20621 3cd4af666de6b3e6f00c8122220b1ad9f9757c39 legacy-trunk
+20622 9e093bf8f6a93f2c33d7cfab09166be6d1968e59 legacy-trunk
+20623 1ebb4e566257aa89ded0f3d6f010834f5aa014af legacy-trunk
+20624 49d9ba55588b67b6cc611bc314fb9aaa639b4811 legacy-trunk
+20625 ee4d17862b6180b1407580ff5769377465483d32 legacy-trunk
+20626 002ec733b5dc5b638d5cdd50047aa840474ee429 descr-branch
+20628 d4d06529c21811d30ecb72ae2c2112247ef82104 descr-branch
+20629 9e53a5d71f1da1ef31045f5f33a369663edd1d90 legacy-trunk
+20630 1812476b7fe4570218e3d6c53afe95dd8fa68468 legacy-trunk
+20631 68e71e9bc204542a9a2cddad15b28500b17b750f legacy-trunk
+20632 aab6c1f19289dcfdbdba2c198661ce97118c7030 legacy-trunk
+20633 3064b73adc1ad7704a19ee7c21466d3525bfcab9 descr-branch
+20634 4424e06d415954fa12277b3b6b271fcf43353743 descr-branch
+20635 1e902fc73645185473d74541028c8b46d221d714 legacy-trunk
+20636 ffc2923bad1a96458bc6a898b2a2d8010db7628d legacy-trunk
+20637 f970195196c4fbe76312cdff584f98c19d86becc legacy-trunk
+20638 aad0adf806adc82db26af1472a1298f80e9d4521 legacy-trunk
+20639 379fe887644fb80c63d7927291c170fc37fb2ba1 descr-branch
+20640 54623626da4e3a1fe918beb1ee370f0e484e43ca legacy-trunk
+20641 433013af459878a8b0c445b3b5ff038e2f41f89f legacy-trunk
+20642 ded41be84da4facc15d9fc072d837bf48fa5a368 legacy-trunk
+20643 e3f0fd38c24b70b09b5916d369a81a5d7ff4ee18 legacy-trunk
+20644 f3b8785bd0222a61fe2bba380324dc7b8ac398d3 legacy-trunk
+20645 b41f6ef6ea8f78f16acabc8080ba68a7d537be88 legacy-trunk
+20646 2f16062a1b7c75cfbe660a9f8ea77eeeacf89369 legacy-trunk
+20647 ad25bfcc437715f70cfd377d9efaa98bea29a31f legacy-trunk
+20648 fe4c1034b48013b4f22dc7718d315c1ef9d1ae1d legacy-trunk
+20649 ba8f8e4d42b047925f8161609f10b6874a4ea659 legacy-trunk
+20650 1c86c8d1c9c762a722a66ea6c4ab7acb705726af release20-maint
+20651 6199e5bd370b560c45338852c1c17f2c36c8b804 legacy-trunk
+20652 350be19ca6a5f89ddca6b628a5bbc06bfe1a574d legacy-trunk
+20653 2a7cfc172a684a0a2d7420169b85c69c446c72ad legacy-trunk
+20654 5e3bab8aef7b0faa27c1daed580cd68cbac6a2cd legacy-trunk
+20655 6493d5e941c2a80ffea582fc2741ab4a88c69286 legacy-trunk
+20656 ff810fb59513219acd2ced6924cd930b31797bf6 release21-maint
+20657 75e7814041dacb8ebd3f9432e773397ccee9eec5 legacy-trunk
+20658 a6a399acf62064f9ac2fa412c65304475fe2a0c9 release21-maint
+20659 9949c870e14420a268267b4a8d60608f91656bf5 legacy-trunk
+20660 bb095340ac987593ec194e24a8fc00eff66fe278 release21-maint
+20661 ede29ad6440ac028b83708b40f55f585d786e860 legacy-trunk
+20662 1dea431fb0a041123178724a30f18bae02369734 legacy-trunk
+20663 cd92c0d7eac47f9d475667b116b12e71310b7bc3 legacy-trunk
+20664 9f6cfdf71d5069aa43324c599670427997729585 legacy-trunk
+20665 6dc36078f53e1e8687ea3b10d17b3e2207fa5dbf legacy-trunk
+20666 1b1f0cb285c25836a622f178c2b6442bccd3c0e1 legacy-trunk
+20667 bded6d3186c0d298ad67e90bcf879eda49f99d1f release21-maint
+20668 489663059341322d273d09c4b090afa5234a4411 release21-maint
+20669 a626fa0e3d7504d6ce709c5b140990409d03d308 legacy-trunk
+20670 0cfadd7607d51e254d2259bc97aeae20de5251a6 legacy-trunk
+20671 06d7da81409de1c0fc4f332943b66e0abcdf7b9a legacy-trunk
+20672 e13eedd04a4a81c75c135fb90a60466e7f21460f release21-maint
+20673 e785d7bd7598fa49f0ef5087c9ecb6203adce204 legacy-trunk
+20674 60f8c15c0255db987e3b766075d9c2e088f65c00 release21-maint
+20675 39bf1f6cf0f9bd5f8206815af6af1eff61ef50c6 legacy-trunk
+20676 147632ad1bcc3a3d73332373f233e61da998e56b legacy-trunk
+20677 437482fe55e6477c55233815f20dfebca8dd744e legacy-trunk
+20678 0ebfe9a1eb43e95c44bcd0fa907907defa9b5421 legacy-trunk
+20679 820e5a0c3112fcf3d79b7d9beb366441a3c1ea41 release21-maint
+20680 f971f252d9b87a65627fbd65c202c8a2804f9549 legacy-trunk
+20681 d05dbf3f36f6729428cb9ee6511f2ada62054d65 release21-maint
+20682 ed771b5db5aaf3a776704e01613aed9f330f13e0 legacy-trunk
+20683 1a21dd13e60a6e742ea1b0bd59876f00bae732f5 legacy-trunk
+20684 3ee9a3f60bc7964a1721d15bd4026d4e757aec79 legacy-trunk
+20685 53bbeb25bde719f46ab6b8c6a93fadf439176ce8 legacy-trunk
+20686 b16fc89c194f6a354f15c4178b8dc7fab9ff53af legacy-trunk
+20687 b76d1b5e88600d6eefe37be1a8712aa4a8964382 legacy-trunk
+20688 c57ce75dcde0c82f176d8c1e2ff4f467d5ba7365 legacy-trunk
+20689 261196bd16d7ef22cfc997ebb9cd7861967a6a48 legacy-trunk
+20690 f465cae301ee615d30188db40b35b844a06e25cc legacy-trunk
+20691 b39266f7484c448054e369fa8a61ed5f8a2a870f legacy-trunk
+20692 c886cd1c218473d2cfff7636e2430468150f5818 legacy-trunk
+20693 f4374d7931ba9ffbeb535a414f916acb9f47515a legacy-trunk
+20694 c47cc9a9864c4e421a04f87fe931a2a4f725f19a legacy-trunk
+20695 ef6f3e1818786633b4aba25fbf3c6a5b98380901 legacy-trunk
+20696 47d18602d5ea455106e42eda96b2d6c033e81cea legacy-trunk
+20697 a06a704260e96a1d5fe5f4547a07d2ba79949798 legacy-trunk
+20698 a987cf18143490da8adb947c8acf4e36e3f602e6 legacy-trunk
+20699 5e0ec39c4cecc4c484e634e64f072f1bc1719969 legacy-trunk
+20701 080a1291bf6c9f81f7612c411620be6afb7983ce legacy-trunk
+20702 332697de8db8e2d5294a7c3bdb58415f6dd31731 legacy-trunk
+20703 b534f1073987cd36030686b73ca67d5edd99e519 release21-maint
+20704 098d6f869a9de855174d5f7f0ae32a47ef02cf9d release21-maint
+20705 686054e03ac59c5bd20c604f2dd01a461b557aa2 descr-branch
+20706 ef65bcee72ca2236ca7b3ca0e81043e866797c38 descr-branch
+20707 65e26113b3fb2e11f9b611dae30d8a4d4c344130 legacy-trunk
+20708 4ef1b6a83a4794e144b68e4bf659755e2b7853c9 legacy-trunk
+20709 2f0df9f0b088782d867fdc8e7775813ce4776dea legacy-trunk
+20710 658c077dd3513135c49f2147d6d8f859869c0d35 legacy-trunk
+20711 51aa4250297550db1eaab5e0b76fa653142e4277 descr-branch
+20712 47d44d8542b7b2fb651228be045337db1ac11bf3 descr-branch
+20713 dd6f8c9caff0ec5e045ed561160f9972daacab34 descr-branch
+20714 7a9f6c09791a8eed264a4842da95a181de863c00 descr-branch
+20715 47f4d0568c7cb73274dce8f4162a47f7a111c097 legacy-trunk
+20716 c1880f6b3189cf84c34ef2e0380447fd4dd67ae1 legacy-trunk
+20717 ce37342f6f6e3f30e636a07e1e6bda763424dbea release21-maint
+20718 cc8d148c396ae908c9b43346ad88edc18f5e34e0 legacy-trunk
+20719 fb103e3da2aeaff3c9fe19c22c9606e174d639c6 legacy-trunk
+20720 01b5043a4509f70444340871a1408dea44614519 legacy-trunk
+20721 669604d9343f05d17ca835b7aa559afbd257e59a legacy-trunk
+20722 4b2fdaebbfe5de31c870b34f06cdd4aa18db7bd6 legacy-trunk
+20723 0ea0913f824dab3fe1b5b01377e92bc33c9093a5 descr-branch
+20724 d7ccb931ca79555ef86782461755b12caee17f0d descr-branch
+20725 7a2a122c997c206375bd1301447edc067852618e descr-branch
+20726 dce1f53451a5af4692e5d38a6fe95b63cc73438a legacy-trunk
+20727 59604f5b4dd1290e1ec4fd1abc67fa294781da50 descr-branch
+20728 419ebc673ed8df9c6f9810b8f600a564de410b7a legacy-trunk
+20729 0ebb91521ae6bcedbbc05eec7b926192b2128b6b legacy-trunk
+20730 b4b3657cb1faa4573a4d54de74d69728649879d1 legacy-trunk
+20731 993fb1801f41b24a6ac0808edaeb6c4bdc57f555 legacy-trunk
+20732 a1575dbf7d812b19e8657b003926f4b8b7ad2a51 legacy-trunk
+20733 ab17b8b886962d9100ae60bbb16f08c9e3643b40 legacy-trunk
+20734 5387cb7670594a2f9efd6c4f3c467f4e62177e21 legacy-trunk
+20735 1dacd0d60637c873c9371fd4e0398054f112063e legacy-trunk
+20736 1296e86304ef58f4f2be5c57e5dddb36bddbf101 legacy-trunk
+20737 0ed8c5f3f53062412521c430c306cb3e3f2d4a05 legacy-trunk
+20738 99c49f009388e52cb48249d2ea3a6651e561aaf6 legacy-trunk
+20739 899f367eba56b50c92e106a4e7d3842eb3b9f656 legacy-trunk
+20740 479ea69ec85b320b9bb60b337d27307d714ccac4 legacy-trunk
+20741 22a0b2e3291f02a889e4dec854a31146f33c17e6 release21-maint
+20742 78c64c0f661cbc4f53a8854f52cc09108e54223e release21-maint
+20743 80425b2c1e4c7023cd5eb17fcbef27ce2bea912d release21-maint
+20744 2e015f8a1ac201b12f22534f41eb0a2b6620194e legacy-trunk
+20745 1c604bc6b91e54fdf16167abe91dbf5a2d398402 legacy-trunk
+20746 1fb3eca8969ea8cfe700075ab821ff8aa333f89d legacy-trunk
+20747 6e008c6198553856f117778b861a2fcebcfe4e2f legacy-trunk
+20748 3b5beb9277e047be3311b96f9340a979233e5d88 legacy-trunk
+20749 a8fa9c0f1e0bb5ccd7892ba7790d690e0d1031a2 legacy-trunk
+20750 8aee5395058309253384acfcb2a3e5c20e51bb7c legacy-trunk
+20751 a2b656a522943a19193c12a491f7edd44cb9a04a legacy-trunk
+20752 c19980c03e2de15f47876be7082a40947b4897e7 legacy-trunk
+20753 5597d4bcde07585b39315789ecea36b461973d72 legacy-trunk
+20754 7eb3288c81e355bcf7e78ee2351c98a61db80688 legacy-trunk
+20755 53fccf4d6a414135727ee24d3d0cc47245a4e219 legacy-trunk
+20756 49e71a83f790fa224a17a55897fd39bf50f5d8a7 legacy-trunk
+20757 bf70d1f4f61f6cd151743eebf332753ee50225d8 legacy-trunk
+20758 ce8c356542ab7ce66bc2bd421a31466d06494bea descr-branch
+20759 dd5fb39e65ef3653f2df00675356df5166087f30 descr-branch
+20760 3380279612a33c8bc7b393b824004d0a028ea2c5 legacy-trunk
+20761 ff9a8339ad1b4b2959b6c65872214b447d9951f7 descr-branch
+20762 9f5597ea96fc14ed17fe1e8f0993ddd373466da5 descr-branch
+20763 7f0f5ece45628be9c423e286332a1e9941870014 descr-branch
+20764 14fd4bb7799ac15f7898393b77cf4e5ac7d090eb descr-branch
+20765 1579d309676e3507ca99a63dc58848f4659e58b3 legacy-trunk
+20766 54d395425e9293467d61bf77aa3c8cb6c709f006 legacy-trunk
+20767 c34cab87d7219fbf80ffa81e3644d75ee316acf4 legacy-trunk
+20768 c8362303ec3b1e33223b2e66f23b8fc2d935c4d5 legacy-trunk
+20769 222767eb28f75cee0a1a8c6cf31bac2398794ce9 legacy-trunk
+20770 4f20495b8bedc599ed741e7e35336f8a72bb5ef8 descr-branch
+20771 4af865b221edf0c2198482af4168a02cf2933b57 descr-branch
+20772 b881dc3bcfb3d3b3225d5f9a6c3063bad8f6b406 descr-branch
+20773 4b08fd087d3643e48ba47566d3de5d318583a1c5 legacy-trunk
+20774 8cd8741ebec0d44831cd9aeb8161e7dd37c868ba legacy-trunk
+20775 2211c8995a5f8d85acfcf8aa189e198309cf2106 legacy-trunk
+20776 d6df8d371b674678af90b535c33495ea9470e50a legacy-trunk
+20777 8f5ce58119e054ab723658efde25a21538a8f246 legacy-trunk
+20778 f7c385226f65a8535ed52229d343638469be849b legacy-trunk
+20779 29d84f920d5b9731b074cbf55ac2c72df4c38280 legacy-trunk
+20780 19a448fdedf724b614bcf8688819dd659c06d5d3 legacy-trunk
+20781 4bcf88e4abff2099c45a60c9c12052b9d7aebc15 legacy-trunk
+20782 780248cd1d9afa5b7067c09c511976797b98dee0 legacy-trunk
+20783 50376d47064821778781de5ec20528c1641f4cc4 legacy-trunk
+20784 f12396c51aeaf4d49d2e6cfc176868e6a400a01a legacy-trunk
+20785 0adfbe3289d5ae3cb0e352820b8e8882c75877ab legacy-trunk
+20786 0be16d0ecf64a79712338719e1782676cc33a2e0 legacy-trunk
+20787 07a8752001bacb9c15d1408ad886d08651975782 release21-maint
+20788 0b3da99824c7d5dfcaa32289bb063da07d4b17a4 legacy-trunk
+20789 26745053f840596ac34d911dca6c05fc96812752 legacy-trunk
+20790 b54dbef1f8d36564ffecf08e0aa66ed7bf1256c9 legacy-trunk
+20791 d890a21bebda2b8a14f319246a230cf6f19c8de6 legacy-trunk
+20792 cef5b600fa162846faebdfe81ecf0b105128c111 descr-branch
+20793 7509ea072ccb422d1cf73a77cd018477143e11c6 descr-branch
+20794 5c06a9596fbffdd11d3b5bd1d215b5dad7e5013c legacy-trunk
+20795 1becf442d73559bc566b8ed50ba9a1e31372c9de legacy-trunk
+20796 c3ff572263d332f8515acb0e318aa5501298f8ea legacy-trunk
+20797 ed1e8b6e26ecb1c73ff3e78c0cb363ee3904d7be legacy-trunk
+20798 9ea87c0a7c043780d569b63a71d2244d866fd88c legacy-trunk
+20799 ad500b52673c63986d64bd05e5e56028267508b4 legacy-trunk
+20800 2892aa2607d5f5e7478ad83c4076f16c6e2bd5d2 legacy-trunk
+20801 db074aba9e364ca76275cb163929f04ad91059e1 legacy-trunk
+20802 3dd49542c4d01a161c9e293028aec41fffeb630f descr-branch
+20803 c872fdf10130f469e92f8a08821a3af86a86120d legacy-trunk
+20804 f18e808c0230d0387ad6c22de36e92410ebfdd08 legacy-trunk
+20805 2b5a9bff1b11e9382d5a9af82abd52b0e66fc12c legacy-trunk
+20806 7ed0caebdd861ce2daa2f254225912b1d6e732c8 legacy-trunk
+20807 3e256f9d99ade0a9152897a304d3d689498a4249 legacy-trunk
+20808 ada3bd1b871347ccb2a0efd99fa522f19a568edc legacy-trunk
+20809 fb31c33761c965f0c08b1a28559e13edc11b6d5f legacy-trunk
+20810 9ff35f7661bd73ed601b54242627003e9788f342 legacy-trunk
+20811 7f4554a1cae228f0291976c9e934fa3b78ef783a legacy-trunk
+20812 6960b2bbbfcaa211bbf0b1089d37b7b345b14c57 legacy-trunk
+20813 017a64a4bdc7a98c6018c4d774c80ddc52fb8434 legacy-trunk
+20814 295a2f4927ab69a5caca0d393ef729f913f363c3 legacy-trunk
+20815 a0d08c42e7102baeab331a1491fd969f10ad079a legacy-trunk
+20816 ba97111a6ad9f997f0108865e2332cc2f396a391 legacy-trunk
+20817 055fc046e080ec0e2da4a18fd0faa201069032fe legacy-trunk
+20818 028a1d39efb65c4b38fa854cea4249c163760e12 legacy-trunk
+20819 d2d3f88661a3e994af71782560fd2fc604dcc36d legacy-trunk
+20820 2807949e0ba591f14ff1d2301da5b19988319371 legacy-trunk
+20821 79aee498a2be51bf889a18665a7c182b58357db2 legacy-trunk
+20822 7763549cca4564a4e5131e5e56dc4c42852f37ec legacy-trunk
+20823 b77c4888d7ccadd6f7476bfcf3256f430f3f4391 legacy-trunk
+20824 b53b60f1ed4596787ff1a4ac34c23d949f35a337 legacy-trunk
+20825 335fbdee7cf83c27bfacba335242f75bb6bc4128 legacy-trunk
+20826 97ece9321c5364fe879e8ec6114bb85930ba3337 legacy-trunk
+20827 0e86bdeb0b92617eb7082ce94df0487d77e25272 legacy-trunk
+20828 be969e717b91b0a28bf52c0cdaeca912baf2099e legacy-trunk
+20829 fde5508e82de6cd9d8dd770da6889b2372cc8f5c legacy-trunk
+20830 042dca1d4526e1591ccd965e3d5e7decf977f2a2 legacy-trunk
+20831 ccb6d76633be4d9da27ea8e6a43a44bff3d761fa legacy-trunk
+20832 68bf07e7bccc94dd6e2dab8a7d50c9dd7634e743 legacy-trunk
+20833 b823a33183fc64bbf96cb7671e80074b9e0f7259 legacy-trunk
+20834 094cee6898c1026c4a9867f795f6eccf6398f760 legacy-trunk
+20835 43b7ee718f53ffa91c3e6a642eef056316d9f1ba legacy-trunk
+20836 200f3a5de1c9adb2ee8cad72c3fa1fdf3c338762 release21-maint
+20837 1eb12259feea64798482678675eeb392da1a82f9 legacy-trunk
+20838 eb03c6fc31e5bd9fb5310e081595072d7f6dfde5 legacy-trunk
+20839 151a2fa296fe42afa41fdce5e7ce8585a2b117aa legacy-trunk
+20840 cb11c59c18dd3bffacfe1be62955294398387e18 release21-maint
+20841 13bdb5b207d26d936965946ffd093fe0b4e5ff42 legacy-trunk
+20842 524e0f3c169b2707baa5e95129766371df20c13a release21-maint
+20843 17c200a7db85ad6d48e5ad8ea65d74c4c5fee981 legacy-trunk
+20844 43ab9f824d890d55cb3a84ac9c32242e15a57d8f release21-maint
+20845 d56666deb9538ff3ae039590467dfc8ad16c07fc legacy-trunk
+20846 6027d3cf805cf707a3b598ad8993f709ae7a916f legacy-trunk
+20847 2060ee0a7d92c41f3d2b09d9590b01f4e8a08933 legacy-trunk
+20848 2135d7de86adb2aa5d8711a1c3a3f65f1c2b79dd legacy-trunk
+20849 a93daafbd13d748ce95d16ac9edcabcda5bdc127 legacy-trunk
+20850 0af824c88203061e404ead05bc3f1f9ca7bb8e3b legacy-trunk
+20851 fd5f831887786d312c38b36f7abdbaf1a96c398d legacy-trunk
+20852 93b590729bdc8990eef71ca5451ebb1c3aad66b6 legacy-trunk
+20853 fd12e82b7727fb282f5ed7dd4107bf09622d9d26 legacy-trunk
+20854 a1ddc4080cc572197ece86798f899a36f9770d47 legacy-trunk
+20855 f95bada5273e28990cccc36f36b34ef0642735fd legacy-trunk
+20856 939e3da59c612212630a14fc957100a6b7a5e79c legacy-trunk
+20857 5b097f61717353892d08f47bfa2a54ed6550e207 legacy-trunk
+20858 8da9473f0736b048ba4cae14f8534b32edc457c3 descr-branch
+20859 14da5314664d9482cda2106e0495184df8eaee21 legacy-trunk
+20860 c4f55401e8aed5701e141232ad575cc7cf3fe421 descr-branch
+20861 e2080db71b1b0cbaab66fec9776c48ca68824ebb descr-branch
+20862 c10b418552028ad7bfc11bed534c6db620de00fc legacy-trunk
+20863 f0c3de22caeddea224b7813454f2ba74b30bfddd legacy-trunk
+20864 cc984ed26586ac06c6ec89d6f4770ded7b3d53d7 legacy-trunk
+20865 5d50d1fae0787f592d57ddb173d0ddf072b8b8bb legacy-trunk
+20866 38fdf98da99fdd162e2dbf3aff4c7d6a9c5f63bf legacy-trunk
+20867 34b1504e6644c7e8da10da234b0b1d4f7b444152 release21-maint
+20868 ae8c4f470a0e44727c73924035fa100809e0469d legacy-trunk
+20869 53de0eea4d25c86e998eec57a3723b8d554ad492 legacy-trunk
+20870 69737d7f4776fd6c32943d50bd621ca2138d6d25 legacy-trunk
+20871 a46f1f7a9c869a2c7549e1b5761b53d5e53a9451 release21-maint
+20872 0a7af0e538d4abdcc0b57fa336d6775aec1411a7 legacy-trunk
+20873 9af806b286c61654766d3e30c148c15049c0b117 legacy-trunk
+20874 7b9771f6856b309dd332ca9a6d2ebc6424e1178b legacy-trunk
+20875 d884235fe75c3f4f651313403d192070ece6e1e6 legacy-trunk
+20876 77871c499215fb19c74674fce326b7c3213861e4 legacy-trunk
+20877 619fd8e067daecf077083d9765fa445f19748062 legacy-trunk
+20878 fbffb6de25ddcb3b83edc2f8ed17daf79ef710c1 legacy-trunk
+20879 421b1d66049508869f1c7e728e2964de2c5e03bd legacy-trunk
+20880 84ff1977d7725fb524057ed73ebf9ac74c5aea83 descr-branch
+20881 46909f22170c3e8682602d667d0ea5fba1260dc1 legacy-trunk
+20882 ff6a6d347195ad4d2423d87c6bcc6d5cccd00ecc legacy-trunk
+20883 1be6d68ae12ce7b1a4fc34ab366916b8ccbbfa88 legacy-trunk
+20884 6c5a800da791f4259cd1e1d3f866de0217ff58a4 descr-branch
+20885 a643a87a4b2caa4631c83224e735e9a9ec07f1d3 descr-branch
+20886 70cd9a419076942740427fd883425a30be4e5acd legacy-trunk
+20887 bd5349b411f61a69f1af501fd6ef35459c20dee9 legacy-trunk
+20888 d4269437e8b3dc1fc5f17d577491a1e8c99d4768 legacy-trunk
+20889 ce69fb9c8d561708b8929e3a927ef2cb451666c9 legacy-trunk
+20890 16005b2855762df1da00b13de74ce088fda73843 legacy-trunk
+20891 a1fcfdcb34796681532dfdb2be37e4bafb77006b legacy-trunk
+20892 5abc2329922fed6a3260de816ef03c1b7b310541 legacy-trunk
+20893 a895d7d739ad416b74e2f8d56dea5365d648d1ea legacy-trunk
+20894 474e3de00b050ecbbb0512e34d780b88979598e3 legacy-trunk
+20895 297a266ac4ee172bdd5ff2eaeff0493d9806975a legacy-trunk
+20896 dea0bade656d491510f08abeb4fefa6abb9ff2a5 legacy-trunk
+20897 694c9f0cd8142979348d6b3412cee5390b2abba1 legacy-trunk
+20898 831c27f876ac9dbcd9b77ab766300afb64a0be35 legacy-trunk
+20899 bbf702049ec6b1bf1f9b360d02f961937dbfb867 legacy-trunk
+20900 e4e853d55675a296be3e6b7beeddacda022b93f3 legacy-trunk
+20901 ea0cad92cfd27b7f6dcca73e02ed4453617567a8 legacy-trunk
+20902 ce7f0e380830487bd93d8e0f1d67f80d4a4524bd legacy-trunk
+20903 562176191e60498759db6a00b2bc78f252d0f57a legacy-trunk
+20904 e14b41fd2ab2515218867234f271817454b0a475 legacy-trunk
+20905 cfe081c9553ec78476fd754ac893bc171b3677c0 legacy-trunk
+20906 3e69d7db5f8d50fb5539e47f897a84e3524215a6 legacy-trunk
+20907 a42910b5442a8fd774af6e43dc7572d30e3be71e legacy-trunk
+20908 22b5152d23fc2bee080ff269136ad2380b373428 release21-maint
+20909 22344154044316678b777a1c8b683c5d9b9b147b release21-maint
+20910 b86eeeddae21346e4bcfd2f6e06d44e273af2437 release21-maint
+20911 db43be19d3e33b00015917143588b13bd696debd release21-maint
+20912 096072d8879868acb0dc2bd8fba24df5cf992409 release21-maint
+20913 d0798b3a38c156ef17b2884e378b455fb97b3f65 release21-maint
+20914 2edaa8e9f381515cb0a787e73d9efdc82b8b19d8 release21-maint
+20915 0711f3cd44d0770703943f66fd5d489e2f488e3d release21-maint
+20916 e1816f649ff8e123649811727fd6bfa93ec11465 release21-maint
+20917 5d894a5fce38c2c95de00676765c38a266e5d065 release21-maint
+20918 b38fd2bd68c0a19e452407f4e2fb567b0eead561 release21-maint
+20919 1458b596a434ac8c3cd0479076a74fd79f542a96 release21-maint
+20920 793b75543f13f5b5b3b82f3a5b55108f2f8a4eb5 legacy-trunk
+20921 8c47d9da30de26dc8889bc9bd2255c8391a1108a release21-maint
+20922 9dfd22e8e9b76dd197102866805d86c9b2231575 release21-maint
+20923 a429da7db70695467cd62ce5f86db7dd1f920c1f release21-maint
+20924 248418cbd00527d47e55f5876fb45d83260a8f37 release21-maint
+20925 4ed657d37cea7bd8c3da80e4da12b67db5cc86df release21-maint
+20926 5696ddda3e40f971fba173da24f944129c2ed558 release21-maint
+20927 fc68f6ed701420455f67d08b488ed89b4f470b09 release21-maint
+20928 4ad7a2ab42b42e8c50c98e9da71534093414b2be release21-maint
+20929 e5ba0d2b47e294252e1eab4ef351ec52a3e2e288 release21-maint
+20930 103111ad99f1f0e2eba504316369ddecdbe02157 legacy-trunk
+20931 af489587509dcdde63c092e803dccadec9a1f8c9 legacy-trunk
+20932 d86b245e085801c24c7241438d28de5b95d3c68a legacy-trunk
+20933 95baa333ee43cb8017875adaf2887c8fdd597f22 legacy-trunk
+20934 5e1141157d53fd95e768ca0cec0674f26eb9b70c legacy-trunk
+20935 78f67071c949eb2c92c3fee9dd2a3770cd9f4bc8 legacy-trunk
+20936 178bedf9536d8ce1c0fc6666ee310855c7071e2a legacy-trunk
+20937 05ab0a714e4caea9740ce2589cd475912ec3a00a legacy-trunk
+20938 b2018e5d2142b941d2171208db687ca7c1b5f4d2 release21-maint
+20939 ed8b79c6cb4b2cdaac43f76ab98d1aa8b92e65cd legacy-trunk
+20940 f9a34ac14c8be9962222b241b768748ed2c3e613 legacy-trunk
+20941 73fcc4f4a182290ed15304b9d80853afa966ab36 legacy-trunk
+20942 401ccfcf28c38840ea7e772de2100dc873351b68 legacy-trunk
+20943 2f2ee5daa60db657970cf56e75819dfe7fe298f5 legacy-trunk
+20944 b0b46d7734e0ed3e48c4bf52a4c428cebd3eb271 release21-maint
+20945 527d0ffdf09901611bf6361c338bbf2c3356b62c legacy-trunk
+20946 d579a5d8b3fea81c115cffc674a00e3808402cf5 legacy-trunk
+20947 2a94bf235daacfaef4e79377e091b78ef0e7d536 legacy-trunk
+20948 5e87a08abb057a15ca92cd2ac9bb0aa05e330593 legacy-trunk
+20949 192d3686944558a3f3597dcf4db9c6b13c0fa90b legacy-trunk
+20950 db13fb5c858a51931116b244fe67b3e9f600064a release21-maint
+20951 a2b996c716a1c50445991bf54d10baafb477a048 legacy-trunk
+20952 62eec2936cd3f9e1b600585fa91a35fc6b0f2975 legacy-trunk
+20953 9526f0ed066a047e4c4e8fd054ded5e977224893 legacy-trunk
+20954 47c7c1eb9574d199ce54e5e322b43b4698796929 legacy-trunk
+20955 706bb6c945dff58337a7f934f4665036b240ba42 release21-maint
+20956 8585041ba57b1bece1df7d3944d607ebbf40eb37 legacy-trunk
+20957 ae08a01f2f2dd2f587fa697dcc5c30072cc23d05 release21-maint
+20958 e819cc0a9ef6dc0bedf19f53be45395e3f3399f4 legacy-trunk
+20959 83614d0e00f15e745f0e24c998ae2a9246737415 release21-maint
+20960 cdf88ba2d968b93b0bac5e43809cf84b19541b77 legacy-trunk
+20961 0769e11d9d5f48f3e361a54a9563e10eb7043736 legacy-trunk
+20962 9ee2182481af9a1473a6ab70b82d9be541976cef legacy-trunk
+20963 447ea65181c285c06747982ba47d7ed17c10e8ae legacy-trunk
+20964 298fb29daa81c2734362c67afe08ef5be754a6a0 legacy-trunk
+20965 837825a779c16ea321c53266184b2043ff06c961 legacy-trunk
+20966 5a9debb14440e252e3355f33ba495bc14b96b9b4 legacy-trunk
+20967 27f2422ea335780a770fe147286f6bc2694ac8ae legacy-trunk
+20968 c8cb79772364e4860ab1caf40c32b88bb3d1864f legacy-trunk
+20969 ff644e608528cf6c475ca03c95ae7218c437b1c5 release21-maint
+20970 ec9343ad1e609a7c5ba5de84c2f43ad3324d6615 legacy-trunk
+20971 97806a599c7eb5a69767cc3b389150b130d07deb release21-maint
+20972 45badfbfb00ef6136f0573f1e6116afacb07d259 legacy-trunk
+20973 27ede8b095d6df1d14e19da2ada55cd473e9e9d9 legacy-trunk
+20974 64e1ea34b55300d3f2e5594f74e0cb3ee19d85f3 legacy-trunk
+20975 baf2137e9676cb446c9f7d4bd1a932e24aa0e6e1 legacy-trunk
+20976 e60fc01762a0f90177466448743cafea786ff266 legacy-trunk
+20977 6a2e2548e6cf39a1d9f1d3574b1eabe2cc09b94d legacy-trunk
+20978 a4301431b2ac8e75efc38c9269d74cf56981c96a release21-maint
+20979 50e3380b086a1d47621e3f9885f1ec661acefa6d legacy-trunk
+20980 53b0f65a0a05d75df13ade45f3262ee7ab3cafe3 release21-maint
+20981 180710911f15d7dc67d4a4086796de6dd689433e release21-maint
+20982 582845e14e5cc15cc08cd1887f2b702d82f4686d legacy-trunk
+20983 99aea6f5cebd28ef519c810af2de646d23f2e352 legacy-trunk
+20984 9f97167f164301673ceecb96a7efa744011073cf legacy-trunk
+20985 0c1a04e981342fd5b94d1ca3ac8e58686f85f47e legacy-trunk
+20986 0d6f760b6ef1a64436b18fa7117789150e89bc2d legacy-trunk
+20987 facff5f50fccaf28e9dd9006a4af564becb5f7d7 legacy-trunk
+20988 038e2f74800d978301ee40cd81db512bd3942af3 legacy-trunk
+20989 ca7e2e1ae8df96e5866902d42f6373222e8b74cc legacy-trunk
+20990 e86d33081bba94be9d786e6685f93f9b55c74ddf legacy-trunk
+20991 c987dcd882b9c7318d851f76ddda00c1b80b7463 release21-maint
+20992 bd1c4fe977cbdc75732f5f01cbd1a2fcaca1f689 legacy-trunk
+20993 8d2bbbbf2cb9fdc2fa87ba3b83bdfdbc3320c497 legacy-trunk
+20994 19b504fb9d156e7b17f989221d15d6ca83e0fb48 legacy-trunk
+20995 511587ab2dd2e6f282d6fade8092e088e3b25cd9 legacy-trunk
+20996 024267441761e944bfaaf3dcac83d63155da6253 legacy-trunk
+20997 5391b9d022ac12757151f787b341fcb40bb0ca86 legacy-trunk
+20998 ee5f0165e4e3eb1db0d0944ccbffb5a6fda4981f release21-maint
+20999 4d62a2fec930a2a8840177d7cd5d5f7541323505 legacy-trunk
+21000 6ae6122912d2edb9d42510b8f68fee30f8da3dd9 release20-maint
+21001 9ebe85e715504104c00bcdb3df6e69a1d6fccd01 release20-maint
+21002 b99979d0f9e7c0804db49b75c1a69645254f6912 legacy-trunk
+21003 bd97a4fdb6f3c5f826d666edcbdb743573494043 legacy-trunk
+21004 c00373177bbb6d6a868a46ab378c027e2b8c8cb9 legacy-trunk
+21005 fa2255d31500e92d44762d36801ce29fc48e7ff1 release21-maint
+21006 a02085871c3fe4fc665a3d116661efa5ce46186a legacy-trunk
+21007 df1c53a8150291265d679cd43ec573a15249660c legacy-trunk
+21008 a6f8b2fa2e20183e5111942fea7c676bb27a29f8 legacy-trunk
+21009 91619d7df58b9b07ae9481dbcdeeb11512c7a5c8 legacy-trunk
+21010 6fdce76d40665e0dd623252c0d270433a7576d25 descr-branch
+21011 bf16c3ca580ec64774be9ffacf49f2be5908ee7c descr-branch
+21012 73a1e9f7c83f21661963e403bc54fa19d2912acf descr-branch
+21013 8c45a64ee831b7892bfb7b90693636e000f1d336 descr-branch
+21014 e919473176c8234dcb5818523513e352106917f0 descr-branch
+21015 ed4252bf080c97e1d86790e503c670d0271b53fa descr-branch
+21016 49f0ff6eb4eb135dc2a5ec5426a2382eec3d2855 descr-branch
+21017 c0743025b23db38f1f30382d992854160cce28da descr-branch
+21018 5466ccbb2f97498ebbb0f758fa2dbc4c0850326c descr-branch
+21019 5b5056cf1488c75cc4c3a3d8f3619b024445f265 descr-branch
+21020 fb93dfbd8052357e8d8584eff897bcdfeff09f3f legacy-trunk
+21021 c2d49a732166dbb1d92e91dab82fbdbe3b553781 legacy-trunk
+21022 957f9428660f22964d52fac160f0c7ad03202ce1 legacy-trunk
+21023 3cbb85726f6ed214263d9f3c8e1115d0c1db68ce descr-branch
+21024 e0f0f7bc5da7694bac705ab2ae9ba0bf9dea8245 descr-branch
+21025 3ab6c434a9c8753c24abfe52fd1e700f2919d29a descr-branch
+21026 65322103955a04d090f087e9017d8e8cfcd02103 descr-branch
+21027 0d46b7c7105e2e3ee114bfe2e9f2e1c65148a108 descr-branch
+21028 a78268424868a191abb4ab4c30c53cdcf55dd2ad descr-branch
+21029 0e518a53ec5bead9adbfcb8d91b86952c4fc4fd9 legacy-trunk
+21030 dcb1c3bd8e0e89766dfece47318ed8998af6976f legacy-trunk
+21031 96d11215013ab2330e99edcc0fce9cf823f3a004 release21-maint
+21032 96330ccc870a9444130144273d0d2aa734992c15 release21-maint
+21033 ea8308fd06f23d9a398854ce3ccd0dab46e37ba8 descr-branch
+21034 8593b7e0b6454163fe3082c436d8c9843d572e94 descr-branch
+21035 6569c8499b170fa7b51d0b6665df19c72a0bbbd2 descr-branch
+21036 e79bb5b8a5d0e9aa524fd11a621b7e74f0c26644 legacy-trunk
+21037 1b92701a0ed2dd5fb4723fa9c283c41932ef7a8c descr-branch
+21038 b73c2817cc1ac021cc720f6f8492ba82da30f497 descr-branch
+21039 14dc75a5600ac5aba28be6601d1d8dbb3a7b3c60 legacy-trunk
+21040 81a8d1830b63abc981dbd263cc6c919914c8d391 legacy-trunk
+21041 65a2e3e8bf56d1097f4305e682c0e8be5792b3a7 legacy-trunk
+21042 586fd79ef4d97c8d74917d2cb4f0d16c86dd8b02 descr-branch
+21043 13a8dca4b040af8809db08f654162d58a10a7171 descr-branch
+21044 b0fc836f2cead0b20a80dd8dd2fe72803dff0eac descr-branch
+21045 e897550b474840f7616b503e1afb11a2f43141c7 legacy-trunk
+21046 f8475fa6ba36da5c5ba8ee8170b37de55eca47a2 descr-branch
+21047 c4016abd6b7f3ea1dd505d56f8719c971f962141 legacy-trunk
+21048 a3c329f69e3a60be43a62a8300116caf98484f6e descr-branch
+21049 2b017b2c8f7cb52fa6a85468a40ef852b66629b4 legacy-trunk
+21050 e66cf9d6ad43ed055fc9316707df55fbfb2876b5 legacy-trunk
+21051 9a26832da0f9e6577598723fcc2e284a41888a8e descr-branch
+21052 a1f357696264b3cbefaf853a47d653871eb07ca4 descr-branch
+21053 8caf21971f37879ece28f508726abb06741ddd64 descr-branch
+21054 7de7d0694ba87a4ffb4c33e4b52f4f60db55e268 legacy-trunk
+21055 a232a6c3fc8c7dfa83e12f67393ad0b8eaf27bc3 legacy-trunk
+21056 15f4381cff0f0c68bf4e37b440a0ace509ecbe00 legacy-trunk
+21057 d93b49298afd6f121f92a9c7e7dacbe227321afc legacy-trunk
+21058 2ec08d6c7d120469547a1087782b510862e218dc legacy-trunk
+21059 999b13de39a42dc77b784953c69519d26494f05d legacy-trunk
+21060 1c183ae5c93492bc8f2a3deeff1efe1cd569e793 legacy-trunk
+21061 5a6b83f41527b780b06f428c7e691ad09499bf86 legacy-trunk
+21062 bbac2a6a5d16fc272b1a7ca607ad06737f1a1e93 legacy-trunk
+21063 ac5489a2548de46357b0fd7751f09c112e7a918a legacy-trunk
+21064 889db6d5550601c532b3eab40c74a32a12618d03 legacy-trunk
+21065 bde1cf5740ec69f8b7468cdecaf0d250019d5f18 legacy-trunk
+21066 10992198c9d67aa5ded24679e10e31f8e3dd5b14 legacy-trunk
+21067 62472656807ea98e4e6a0a87536680c3e85d9588 legacy-trunk
+21068 8e187740aa96a68313ce5c5a3c33088df8d65f7c legacy-trunk
+21069 f901a7dc5fb4cb8f167e176b0b211f1a17d06ff5 legacy-trunk
+21070 1f83e4155fcd172b473978194449ab2a5586b0c1 legacy-trunk
+21071 7de5d378578cde1d0076b0a0ebc72bcd2e194d34 release21-maint
+21072 e849488674da26618d54a7a2c4812fee770a428a release21-maint
+21073 410bbf5d98f97aa23581f80253e13b9a8f8f01bd legacy-trunk
+21074 72b15731a8769a3de46e9df707e9fe859093b376 release21-maint
+21075 90193750cc8376bf3c801d590afe5e90ffb2066e legacy-trunk
+21076 f3bab929d70ee0770f5d68fc47d3a2b6a463dafb descr-branch
+21077 622867e4d832fb03a1a1d240481c6f2f24c5ba39 legacy-trunk
+21078 add0956398530de49e35657389876c659f9e1000 legacy-trunk
+21079 bc05b0b5e0578132dab65274b8bc8ad9198e6b59 legacy-trunk
+21080 ff2d7c1837152b69e19682e0bd336e1b55fc5943 legacy-trunk
+21081 4ccbb8e5fb24cbc7395ffe1894aad2272aca2eb2 release21-maint
+21082 b8fbfa569c34803b6c50e1257760514347da627a descr-branch
+21083 6b6e0b0db4f75511c7f6f1efe0b621c660f6e9ed descr-branch
+21084 c90bde8b67b8dc8757bb967f4fbdfdc09bc8bf59 descr-branch
+21085 dabe7100b21f307d9c170e741f48a51be4f433cf descr-branch
+21086 4cc2af8a2f4e6630d1dad65c092eaa09450b4671 descr-branch
+21087 6fe56a9b30218f9204d948ced259d57cf2d92dbe descr-branch
+21088 dd09f11fa40dc95df85f0b69b0197a1c7e25fdd1 legacy-trunk
+21089 5fc6d027e86118eec711dce9caa3745f7cd5f0e0 legacy-trunk
+21090 bbcdbd8f4469951ac05e0092a9392f587b69a08f legacy-trunk
+21091 7e459fb3c3329be2eeeb9313c937d4277ba9e861 legacy-trunk
+21092 592109f2a6fd696069fed63d2cd0c7f8ce5dbe57 legacy-trunk
+21093 6254737cb6296801339965d34ba288077ad289ff legacy-trunk
+21094 86ccf93cc9522822d441e7d7f9842266e196d6a3 legacy-trunk
+21095 18a1e09397dac95c6efe8c73547853157ef2238b release21-maint
+21096 41016675002fe4d99f240d938a6792711ab20433 legacy-trunk
+21097 a001fcb761779de459cda8236fd57cfc1f1a9771 legacy-trunk
+21098 bd0056ee1a6e4905f392d33cfa0eef2fb902ad44 legacy-trunk
+21099 6ea366a2b2a634f4c1516956e1c2da4aa204d30d legacy-trunk
+21100 2367b7a001a7e7e69a9f4af687cd8408ed2d7e38 legacy-trunk
+21101 7a9a692729b4039cf74031fe16b3ad9f66294e15 legacy-trunk
+21102 c2fca77bbf3ab8d6fc27b1d2ede9353bb1437f24 legacy-trunk
+21103 de7f9aa0a63a523bf27164b843a558efe51760bf release20-maint
+21104 f74e92c8eac1a69e98f171e828b72b430768d09f release20-maint
+21105 037386a2b247cbe9320f0387c6dd82c6212979b1 release20-maint
+21106 142129e9a98564906076d5082a430cc1cabcdfb1 release20-maint
+21107 9dda0c11e00699a944028fc1c017f6dcc26ea5b3 legacy-trunk
+21108 a3c9b4140cc5ec5bff7a3b3e1d14a7fcd0809046 release20-maint
+21109 0224873c0ac74b01b0137dcd1558164f84e961d9 legacy-trunk
+21110 5d6fc18c400985dad74916bad498068432485d77 release20-maint
+21111 15c04fe24d858662df532fe20c5721b3a3bf3241 release20-maint
+21111 83459cc191c1c9c8cc6b08ada99c02f0af6ad54f release20-maint
+21113 c578b75ad62fded70b64ab7351fd4a28869597da legacy-trunk
+21114 8cf72b187b3ab9866e8d841df92f184a760e5282 legacy-trunk
+21115 be2ddb25b698b39a879c46451616aeca9bb2b1fb legacy-trunk
+21116 e21cd4135f3db1af23b3e5f710b07d638033dba4 legacy-trunk
+21117 099ae4918069a5bb950836448768c1c50cb4d221 legacy-trunk
+21118 7f5d8044f994c1f51406953d58793e2c07159ab2 descr-branch
+21119 b140b78f1785cba884d5ba5cb11fc8e03e9dc8be descr-branch
+21120 a6231f24dbb6e0a474e483fee15d008597388bd3 descr-branch
+21121 9eb469a431441768de81112105a36f1f61bd28b3 legacy-trunk
+21122 e64c7031d94fcb72a4452c320c1b91ae5276b68e descr-branch
+21123 a4763bfed9f0e9307553b8c25cbef533f9f9a0d7 legacy-trunk
+21124 31cd0db0f09fcd995d198581490921f9c64b1c5b legacy-trunk
+21125 2ecaf9e21a046d6fe91849b8ecd651ab7a0c29e9 legacy-trunk
+21126 7517fca32262cbafd389c9c02242227fe85c86e6 release20-maint
+21127 69910194959944840138fc20cc949ec5c77e8c50 legacy-trunk
+21128 c0616e096430f20d711c449f638435d4eab4e604 release21-maint
+21129 e406815782afd471b8a4a75887c44198668bde49 release20-maint
+21130 40d794b5041df04147051a1674c2f811d4d22248 descr-branch
+21131 02530777b5218d41b96960fc9f96eaefd810ad9a descr-branch
+21132 05054bd7959b6451589d7dc03f04ab044f8a438d descr-branch
+21133 c616655782f1afc19087905f6141b6a217b63b68 descr-branch
+21134 c29f3135a20cb0444956cb154ec57ec49d579ae5 legacy-trunk
+21135 333a2c6eb7438a51715e5ac832a288ba884ecd66 descr-branch
+21136 166b7b36585193ca786d3f7d74de15bb5074c25d legacy-trunk
+21137 9522976d1e996cccb354139f7f03d13442e89e66 legacy-trunk
+21138 ac7dcf0e5104afa140f437be05a1654bc3d21c20 release21-maint
+21139 1f1364806599ca31ee8bd50b1ef2598878c47bd2 legacy-trunk
+21140 9e9eddac25b858f6fc0a1ed9dc011356a1db74ec gen-branch
+21141 27dd9ec3162cd8cab94bd734094e204570351eb3 legacy-trunk
+21142 0af6eaf9f89eef4a9daed14d3f3592edc9b8326a release20-maint
+21143 3642442695063a981092ea4e9776b9e5df22169a gen-branch
+21144 6acba9e4758cb01890be069171f8defbfca16637 gen-branch
+21145 e328218546b598bfe46f689452aa3bf28fa861cc legacy-trunk
+21146 b7f2e2312610ec4fb351d7def43c1083c82b001c legacy-trunk
+21147 9d533ae574d20d14c3dcad2b6bc0436b64700f63 legacy-trunk
+21148 8eea2efb34cd1f16e6cbf7127275c9e5171a2968 legacy-trunk
+21149 85e3fa1eb836c88220eff4a0b75aa97177d2cc27 legacy-trunk
+21150 e887d6862f77b40830d747f1a05a16b4690aca3e legacy-trunk
+21151 b49945e8044a806fb2ba28c501688d5ffbfcdcbf legacy-trunk
+21152 eff8da7c3dcb9beb0e85bbff80857292c7850947 legacy-trunk
+21153 cac207b3a43fd8a89464dd2ce0cae4c3d23fd899 descr-branch
+21154 7a338f537e42bb2a3d1ab4c60d10a400a365191d descr-branch
+21155 a447fc9472999a163880264f35418c989a85d987 descr-branch
+21156 28c4b66ecbc58dab4a3916a79cad59fcd5f98343 descr-branch
+21157 a7c2ffebbd266fafb014e812491df511f3960562 release21-maint
+21158 4cb34314bd9709c0056f733ea732499298f6d156 legacy-trunk
+21159 541e095a6ed6516925e661f8b9bc8c7f71ee76c0 legacy-trunk
+21160 418cabcb763f0ac2d55b0fa5d76c8183e2d98edf legacy-trunk
+21161 354a4df09e385b8493e02d830e95a7a5c7a9f005 legacy-trunk
+21162 31cb5d17311ab52890911f725eaa51de2c221b3d legacy-trunk
+21163 0116e459dad2cbde6e92264df177dc0656f1d821 descr-branch
+21164 4e3019da91a9365eba515722b28d0e81420ba1d6 descr-branch
+21165 22feba9659ce7920dd612cd85362ec942f341a99 descr-branch
+21166 11ac02c03690d4144a0bfef525a7d44f5c34d459 descr-branch
+21167 97a208291cd8bb0849bd55f89571a69483c65456 legacy-trunk
+21168 47c9d0cb6e314dbb796d9813b3471080b6067a24 legacy-trunk
+21169 767c4b28210adeb4ee28c3dab6fa6bebc0a50c51 release21-maint
+21170 dbe82a9c6f7d73f5993c451063689cb79923c9b6 descr-branch
+21171 80647b82e1b2d8746c7cfb71acb0e1ed552c1120 descr-branch
+21172 0e7cad51cf66530e8a4ad7a771fb4c821ea9f5c9 legacy-trunk
+21173 a71fee84b4e4901b95724420b5e188bf57231a49 descr-branch
+21174 8cd4a3f019521d9a7d475606412621a2c0f9fb7a legacy-trunk
+21175 b51b4c2bf5f9eafa898f00e83c19282b8f3b2d8e legacy-trunk
+21176 17b3ee9cc43fa2f913598c3fbde13db0370fd4c8 descr-branch
+21177 e1b30625a467408933d48b0654d8becd467d6207 descr-branch
+21178 2ce70a883af6a7c060e3e7579b900b3ceee00a6a release21-maint
+21179 31c11ab1a3e8574ea42b2ed64ff5c521fb53b469 descr-branch
+21180 0463b9e5704eb287857e8cc326d3ed7fe9a7109f descr-branch
+21181 7bc473b2c654243042784b8aca264cc025ccdc89 legacy-trunk
+21182 1bce8bb41dbd3f09d70e02f90cd82316f099b96b descr-branch
+21183 2e4c6ba7d09c14d10b814877c48ee9a0a6abdf1e legacy-trunk
+21184 9ce8a995bf12e583d4744a433e2a8eeb6bfb3ef1 legacy-trunk
+21185 0676ea2ff867a98da42d9e5d8fdcd4aafd990ad5 legacy-trunk
+21186 54f76293d92698515d50337c8925d3478a925a74 legacy-trunk
+21187 8ef84b83ec1fa435514cb15e0f8e0b7ab559169c legacy-trunk
+21188 126a66b3413cd2bbff42a67eb6f822b8f216de9c descr-branch
+21189 b1f63280b2c298ec911518fec8581e8afcc8ad66 descr-branch
+21190 651c66406bf8211c0c10bd0c5e8e4f2aeb4b8313 descr-branch
+21191 d639a1e1f1f48f88fe43c071f1507fc16607fab9 legacy-trunk
+21192 7c34899ad50623e2c3b51d710c3b56d98bb96724 legacy-trunk
+21193 0ec03e1be5588eb7eacf2c0d88bdc5687aa4957a legacy-trunk
+21194 4d1c78493221abaa321a6d9034f142a87227a943 legacy-trunk
+21195 e5b273e95f74b8498c83c8ac379bfa95ba344344 legacy-trunk
+21196 31bd25a2d8c5b8d7af718955d16c2afbf04fb731 legacy-trunk
+21197 6fbc5f201a1f8760ce7a151e73e9e58cd7096ee1 legacy-trunk
+21198 a66572ac71e7dc784b951a79271776cfc87a1270 legacy-trunk
+21199 02aa133deb538e4e87f2f410d2f99cf9cc9a1d71 legacy-trunk
+21200 f926eb1f57701c2301072d107b9aefdc39bad0fc legacy-trunk
+21201 efb5069cc74fe708c38bf561d37ad0c2d9e948dd legacy-trunk
+21202 0bad42e56320415c2d12752b1b67dc04ac8107c8 legacy-trunk
+21203 cf6a864387d37881ad72858643f6fafa97f4ee88 legacy-trunk
+21204 c5ac6f055c6235c247a04db348916cbd2cd017a8 legacy-trunk
+21205 d3e4399fe2f9431615adbabf6a43b7df64eb8e76 legacy-trunk
+21206 c638a7a2fe77b93222f07fc0dfb280d6f1d529fa legacy-trunk
+21207 6771dab1fe32ff39080c6be44857efdf8a3f1b2c legacy-trunk
+21208 340e9301e85b324fc5c155811bb0fc97c845a23f legacy-trunk
+21209 12d7d4db69f2f6f0516afe0b2d51b10d6935b98a legacy-trunk
+21210 09a08a1e47d68aa76fcff6b04f107aa15c597b28 release20-maint
+21211 e7f7eef18c9863cc3a76cc186695b94c402ece0c release20-maint
+21212 b73241e5055670ee4f4928be46318b179b03f8e5 legacy-trunk
+21213 cc7631fbf7f92e13d4d4a4ae7bb969a95278c9a9 legacy-trunk
+21214 826000a408665228c67500ddd70b7300dd5069f4 legacy-trunk
+21215 2f21febf6d462b7f74b5d679bec39648c6367803 legacy-trunk
+21216 f5ab3479acd4d532a82fed8c82340275f53f4b24 legacy-trunk
+21217 c25876a51f1b59630fdc0f09987daaad8cab12d1 legacy-trunk
+21218 a2e6fff471b0253200967dadca14899a8a8ef9e2 legacy-trunk
+21219 15a24e0bf94f22d12a5f858bd15b5593cd9c6372 legacy-trunk
+21220 d1221fbdd85d8cdf94cda56d285805df7d9d8c8a legacy-trunk
+21221 bd3993c494a1beea1a7b6eb435142161a279261a legacy-trunk
+21222 d3b1956e3de0c13ec04d6a857ab89eefcae689b1 legacy-trunk
+21223 ae0f09c7c1e9116048c7c7cc152b9ebfb38923c6 legacy-trunk
+21224 3a58027cae4e7ddf7d4639386a6a4809888b87b0 legacy-trunk
+21225 a7825441caa4a777a7ec034c84c50ad6c07288ca legacy-trunk
+21226 a438aba2d137b7a59132736b597a543c0d4eed6b legacy-trunk
+21227 aedc3e920debcada8d2f8e13fc8fce321cd23b36 release20-maint
+21228 8e5b537f87a1918cc2753a8621d39a9dd9116540 legacy-trunk
+21229 19bc63a844390e4a82b791be524a00b693107bbf legacy-trunk
+21230 5965339429c9cd22fe5b05300a646c3103cacb2a legacy-trunk
+21231 990b73fa074cda4cab312eb84e6659e806e77678 legacy-trunk
+21232 36e825660a2451acc8b6e551e5c8bdd9590f5c0e legacy-trunk
+21233 9a4cac2b8b8fc98670312c8ad6d8353ee6415c10 legacy-trunk
+21234 1a6b8f69fed62184fa1756a777d8f410c032469f legacy-trunk
+21235 5e43573f0df1f19a7389647d1016c4cb1ed7063e legacy-trunk
+21236 ed3745da741928086c74b9646d260b03a0edcf24 release20-maint
+21237 be42ce295edb53a359487e04dabce5086c1391d6 release20-maint
+21238 58736ca9143c0f6f75fcd3b890033c88b52da64d release21-maint
+21239 9005943c754ee920a0b682f56676ae9cb04141ea release21-maint
+21240 4a8726779bbaf73a36f2ac1a3186f4ba29f97da1 release21-maint
+21241 256406b5cf0c4f4b8fd138bb3bdfd442ffd1fb11 release21-maint
+21242 76c3ff57eb6d066f21490404ad8c754c80b18f74 release20-maint
+21243 6253d128a78bf92c767f50d7339e8d4cb93943d6 legacy-trunk
+21244 e3708cb1e0d07cb9c5ccc1d010b21e2070842c3a release20-maint
+21245 82699499b38ec1d30429c8d298c11a1c2a38ee7a legacy-trunk
+21246 546c7852bac55cd922677a375d3b9a9d11db3a0d release20-maint
+21247 0d4ad89ed32d87ecaedb3e8a5dc13b209901d727 release20-maint
+21247 73de94a722d206a45c0b49d3011c629ead4d62b1 release20-maint
+21249 0757b6c993041437d1fb3008446abd54843a0eb1 legacy-trunk
+21250 f9d127ab32ec9aad33728806064ee3a0365aa68c release21-maint
+21251 b664b02c3e91cf49e2e12eef0ec87390a062e31a release21-maint
+21252 409abf225185d21d3704b9313bf04e0b46109b7d release21-maint
+21253 08619bf1829904237e7a0cc9da8a7f92ecc89356 release21-maint
+21254 e1dd4630ef3b91bad7f21d581d39ae694879d17f legacy-trunk
+21255 6991ddafe3828a2dc18fed5d2f8a3ad3a8dcfe13 legacy-trunk
+21256 6eef21e523b6456949142782b1f8c53f1e36569e legacy-trunk
+21257 3a8732c67898c6daa4cfa0aa5d49e043db5ac749 legacy-trunk
+21258 acd3da5d563cc82cfb0740a55c844c6eb6a02843 release21-maint
+21259 4975173e1a02d82aed889c0733f6a5e6cc76897a release21-maint
+21260 220405c07232593a4cd9a71274c328db2efbff0a legacy-trunk
+21261 83c4748b9390e8ce42440fa058f0318c9a74c5fd legacy-trunk
+21262 aa8e238ab0ad7634e7ddd67da9f1ca78aa3341aa legacy-trunk
+21263 a4dc21b4774dc997e07039e1bebad79111ab38e5 release21-maint
+21264 7d2e6e1d60ce58ba4f9dff09ead1e6b70c835cc1 legacy-trunk
+21265 4ebd292c975f8098f1f5ab4a9cb2759c872a68fc legacy-trunk
+21266 f0361837323d6d6a48274312c4ba1d83eb256d15 legacy-trunk
+21267 b893d12045cb4609ea22135f57c2db65ebf1858c legacy-trunk
+21268 f9261904cebbc559a4ce04eac6227166f64ca3b2 legacy-trunk
+21269 d923b3c8b15269acf27c7d100188ebc79249b653 legacy-trunk
+21270 eae66bf2487888bd46916628ccf3d3570ae52726 legacy-trunk
+21271 fe4071beff41868f8c0f46904cde3431c87beb59 legacy-trunk
+21272 eb524322a1c31c6352979d255a521523267aae63 legacy-trunk
+21273 f8287d84b7551716f5ac8c21e35ad552d8cdeed6 legacy-trunk
+21274 f02605b8fdc1e59715621f881f5db9e081e8cc5b legacy-trunk
+21275 037c8be505e059d774c87345f5115f158cbd23fb legacy-trunk
+21276 a1ef43a6d6e1313f49a917da661f9bbbcf0b84e4 legacy-trunk
+21277 0439c82a8ff475613065abf644fd69c54ea67b97 legacy-trunk
+21278 4517093eb99eacba8ad08b12ef3f0f0a951f4b30 legacy-trunk
+21279 e4d655ae9140e313f9953393d9bf974d9b4e26c3 legacy-trunk
+21280 47717e5667eb15f184e0a772d32b5d7c8af5ff58 legacy-trunk
+21281 24c29b3715102cdb3569f0b6a48c0c2c2b0ee161 legacy-trunk
+21282 9fa54bd7a7cb56ec8e94dd440308df223417416c legacy-trunk
+21283 c4db09b87424230d22e9ffeefdf3e5c4bb7b3099 legacy-trunk
+21284 e3cf3348feca530af483dedc74a7458d1f88a2c1 legacy-trunk
+21285 f1b5fbeecc0e992171472d9e8efe127bdf5f8d2d legacy-trunk
+21286 4826a6cdafc40de22acbece437d00f38ff66f166 legacy-trunk
+21287 45de1ac2a3767b685ca0ba108d58e4a8f7595312 legacy-trunk
+21288 5d3e7f99cf52cf46dfc9a581bfd78ad4bc9bff64 legacy-trunk
+21289 065b17fc0d2ee06f65128b5abeb2621cd3eef170 legacy-trunk
+21290 9f1dfa786ba655eda127f1fe5c62889f6a48de92 legacy-trunk
+21291 0514b16c1a683f3bd547acd9fa0d4663c1beb711 legacy-trunk
+21292 fb7c44ae4a6277d42b6631fe60f6aab66a7f44b9 legacy-trunk
+21293 d50d4f81aa4c5a7c00edf904533c5895daf0014f legacy-trunk
+21294 358cb74c0864f9a8b793a671df2a36aa41d6e3a5 legacy-trunk
+21295 57dd13b6c80310d443b20ff55ccfd63f28b38f40 legacy-trunk
+21296 309fb026c84ecd57fd257095e7c835db0229738f legacy-trunk
+21297 1a2a914b246c22c6f131ebca04f4e8d192158b2c legacy-trunk
+21298 c88f4148605fd52ce0eb2062634d798941f629a9 legacy-trunk
+21299 6b0a8157be3b6806f13e0a32b04feeac0b7d7ab6 legacy-trunk
+21300 41491d196748cd4dff903229f0d6511d2576e47a legacy-trunk
+21301 3d9164d95e789f718d679d82618117827f5f3466 legacy-trunk
+21302 a46e35acf9c1c64ba90163bac0ed4ecd9b6f1857 legacy-trunk
+21303 16e4eb4277978f66be8b466cee548ce953e75382 legacy-trunk
+21304 78bfbe2e719cb3bd90354d4849766d10e9472a97 legacy-trunk
+21305 426e0c721bbf6eb20a5297cbe074cd181941d0f9 legacy-trunk
+21306 ebf61b5b5aebbca711cc6ca754fda21150c4aec6 unlabeled-1.1.1
+21308 fd83212eb8f24efd6494c89a432625c5857ef405 legacy-trunk
+21309 dee498961bfe3c90fc759e02ab4c4a8dd8d3d7f2 legacy-trunk
+21310 4ad842f9d43147a8018bc0f8b1d7d9a319ee7c77 release21-maint
+21311 44122e7b49cf2c9473e68da213dca8925fc49c02 legacy-trunk
+21312 9e326c9e6be5942101c103d6a8c67d55456dfa25 legacy-trunk
+21313 86dab0d43b7312f0b887e57691c4fe78d587e738 legacy-trunk
+21314 9734f895f4fbed98b47fa62dd126698f0f47d92a legacy-trunk
+21315 d2c950032393001f7bd232fc8a8fe45d1b265654 legacy-trunk
+21316 7c8dad5f2d966dc21dbddd70ddb90f91e29b7d06 legacy-trunk
+21317 b5658a230e1a5276045e27bd46a3e9ac13ff8f35 legacy-trunk
+21318 8b7ff44b4669597a647f480623d35da8f687ac90 legacy-trunk
+21319 0632dcd69ea3af19a69835674b4d645a7146b642 legacy-trunk
+21320 e3ba3739855ad1ff77d884bd7f57bdc089fc3e49 legacy-trunk
+21321 f38923ce3c6b0f4adba3167bf249258467f7f85b legacy-trunk
+21322 1f1d2c50b3c784811c74a13a4c66cd6588834898 legacy-trunk
+21323 f7c01b938a1738ad7525f141125a0f186aa09409 legacy-trunk
+21324 043e200174f1b7e9c34f4ed61f1d2c8eec6982c9 legacy-trunk
+21325 e31a349166f4e0cd1e25e19980efa27c3013b42d descr-branch
+21326 bc05a95242a37803a51bde5292a1d9bdbd19325d legacy-trunk
+21327 f6078a30f70a280ea6eb584e233b9ec836a6876d legacy-trunk
+21328 6800bcce04555b9fa3fe24f3405095ae65276ac5 legacy-trunk
+21329 4fa31eca3be4a54d8e917d35080b41ccd3136d09 legacy-trunk
+21330 295acc0755f0c7fec8a1d9adec502a1fea39e1bb legacy-trunk
+21331 55f3a04e06411ecff2765d07f03cd9a70439ad81 legacy-trunk
+21332 ffbb9c918ac046b0ce6c5bb6b7b1440b34866f70 legacy-trunk
+21333 0344e4ac70b0c8f955e215f03d664d52dc9d6db5 legacy-trunk
+21334 b14521fd8e391621a31d0fbfcb135fed1e11c80a legacy-trunk
+21335 20e3a6e10c248fe03ccbcdf452cd7d707af705c5 legacy-trunk
+21336 22f85c6a6520a6958b3a91185c8cd95e5b0239eb legacy-trunk
+21337 932903c7d054b02bb8970ce2f2214f97126018ed legacy-trunk
+21338 982163c4e9d2be0a032f6e61851c8389e022b309 legacy-trunk
+21339 68c12d5556df716bd046cdf883150073462fad7a legacy-trunk
+21340 0ff76d781d2c6118d69821989c4de4949b26f1d2 release21-maint
+21341 ff8e183ae58f941ee26966526124e44fce24a95a release21-maint
+21342 7cd6e515fd30a691617941ac6e11f4a6ba64ccb5 release21-maint
+21343 314842dcd52e94e741ec79ce922ea2a6afe73872 release21-maint
+21344 893ba1f0378a1f644bc05ad4c48b60b48f3dd714 release21-maint
+21345 67c841d821e074a9b7f4ce71401b55d13522d057 release21-maint
+21346 9098415971d01701bc3f2a99cc27241d22b9c788 release21-maint
+21347 be9671e61f4a60867a4ff11d01a8beec2af7d30f release21-maint
+21348 3a6a2e59de03c371ff39f802638229aadf1169b5 release21-maint
+21349 ac0027e2b3b7a4fd3f2b004f55ee76e3ce495b25 release21-maint
+21350 e8650d75e5a454c88c506db26562b95e4f0b5305 release21-maint
+21351 75c1f9c3f0d1f7b8306a86735fcca100963ccb27 legacy-trunk
+21352 9c2bc3e4df738371fa9740f87de5923642ca387b release21-maint
+21353 d52e635e205f8763434abe75882e453e1903ba17 release21-maint
+21354 6cec761df2c34ae198a59435f23223dabb569d9a release21-maint
+21355 fa4a77e424ddb35e893113745fef2b3854203e04 release21-maint
+21356 071c957221ecc59d85545a20960c2e7d5016e095 release21-maint
+21357 c823ec47df495e58cf1738513f030457ad77e405 release21-maint
+21358 1aa591e4181545c3bdc85098341e547c2443596f release21-maint
+21359 140cb246b864aea03f5ab67e1ea068707458e727 release21-maint
+21360 159abfc8b1bc51bfc92d16a0bdd68a05765094ce release21-maint
+21361 0c978728ebafec8732d889c43f0eda7f5c9fa103 release21-maint
+21362 0d287434144b59c2c1e76f4cbd2c405917790780 release21-maint
+21363 cda6ca9dfd590d49f819e1fa7ce3746a8aa995ed legacy-trunk
+21364 3ba7a358ce02885af4d5a3b5b2ed658248d3e493 legacy-trunk
+21365 fb35b3a226046221f7b7d34a2b665b43ba36291a legacy-trunk
+21366 e427afb5637f08c1c240efeae1952b32909a0fde legacy-trunk
+21367 93bdc5ece1bf6987b617b89cab4cf259a6ad77b0 legacy-trunk
+21368 e4527d45e942d1c95f620ee1961bd35b2baf8366 legacy-trunk
+21369 f995c4f2512008b3a5a64c99c9d4e3cb32cffd86 legacy-trunk
+21370 d014b5226900d7332119b68fa387cbeaac7a2352 legacy-trunk
+21371 bf936c5296353c2694ca3efc5cdc70203834fc9d legacy-trunk
+21372 49acc8ac60c232415d9bd57dbcbeb46221b87bf7 legacy-trunk
+21373 41243cb4ea05d77712a546c89645180545484c56 legacy-trunk
+21374 976b0ae4f527c1a1e75c5b5ac4351231daebee12 descr-branch
+21375 3f0bdd4ae68400f64887c0866c33b65a018db5a9 descr-branch
+21376 754deb86820e5f5ca8cfba60f24f2a39950c06bd descr-branch
+21377 6ca3dd82cb07ed4355ab5b2322daad58b4d3f037 descr-branch
+21378 04a64d2d8b2d20578905c57dcec4630ad452b358 descr-branch
+21379 0226d06e3eff5927490ea7ce6758c046b9d578ff descr-branch
+21380 7ef662aed9de4e0a67a59cc2438c61a775735870 descr-branch
+21381 f73029c71b0df09ee079559211b4a406a94ef779 descr-branch
+21382 2d0b69a67f694c65b39b5f37e2e0f09b20814306 descr-branch
+21383 405eaba36b2fc862ec2ba7a4d7eaf9eb28cca22f descr-branch
+21384 27839ba7ec22ed49e2c314f9163abd69a594bc53 descr-branch
+21385 85db989f6a73c6ccc56ac439db68b4e8f5a932a2 legacy-trunk
+21386 6a1630117805167eab9c08d46cd3a9f9745088f7 legacy-trunk
+21387 794582fc0623e3b95877ad8fd5deaf153521cb30 legacy-trunk
+21388 c2a60de91d2c713813f3cd221275ee8e024eb057 legacy-trunk
+21389 edadfa28359f8525300dacb4304401a0fd289417 descr-branch
+21390 58469202ee8d8b1b5c97d1d5d85bae6f4012abcf descr-branch
+21391 fe633534f4478637547a27478b9c369666352130 descr-branch
+21392 a12ec8876515c37e76396b6ac57ac576d7f42f99 descr-branch
+21393 5668a8550be4545b4be4d2153cd89e2973be6980 legacy-trunk
+21394 e90fc34d73d00fa22a1b52aaf595ad3399a26862 release21-maint
+21395 e8dc733867062a149aa12773280f957ab774bb39 release21-maint
+21396 0fdc2779e8d43c4cd7efc2b26b6acfe3299f70b2 descr-branch
+21397 8db94367fae1c808070b1c1fc2119f54007b5985 descr-branch
+21398 b3ba0f48adc4ce805b516e3dfcdf87fbcb1447dd descr-branch
+21399 1166011a9cfca982e030283d52f6232fe9cbbe01 descr-branch
+21400 f70b2d63f309a8e2611f651ab827db648a376410 legacy-trunk
+21401 d32fe48fbb968d70c100e6deb7c2ef3875292b20 release21-maint
+21402 264ed55dec6e1ad35419cf9dd0bb13646b3405a7 release21-maint
+21403 449da857dce59441a91fd27e20f7e33fddf656f9 legacy-trunk
+21404 c029b74332d2aafcbbc0cd8071d542fb6b115c55 descr-branch
+21405 d2c9963e42915556817c1bdc6b6eb59d7a9da6ca descr-branch
+21406 1da724cee22d3f6559cdba01d127ede91c0d3b78 descr-branch
+21407 5a7841340dc7c1c930d1d598435f229cb829e844 descr-branch
+21408 08a2c2e794efde6c941c8a6153f19ff911cb36ef descr-branch
+21409 0200cd22492ec2609cf14fd4063042398cd12ff2 legacy-trunk
+21410 4bab9ecf3e05e2f668ff0bffb0fef106a7a9fc56 release21-maint
+21411 17330429cdfeb5808b081b83ceeb977f2c2f4351 release21-maint
+21412 798b5e6b4915f0de94ea6283199313aab63a42bd legacy-trunk
+21413 5596504ad49afb0a5cfa037567c9ef69a45acf26 descr-branch
+21414 e58799eefa39781c01b88dbcab92041079eb91a7 descr-branch
+21415 27b866514c9ebdcfd2a06808507e843400424202 legacy-trunk
+21416 2513bc1db12fedaa430982c28f1b518e5505f94e release21-maint
+21417 520e1f40101aa01d381b420806a41333595fd1b6 descr-branch
+21418 8937d234b2a8d652fc95b603e3a53f255084d1c9 descr-branch
+21419 c6723cd55458b248da780c51c12c713a04f78cac descr-branch
+21420 650f7004e6d39aa3362746d3fa6d404541271ffc descr-branch
+21421 23bb3f49cb9424983bdbaafc39ba9a3ff883bd06 descr-branch
+21422 44a87c300f2ba4f3a0f84cb43a1822136637b681 legacy-trunk
+21423 3eda6231e1c2584908a48141a0e17e2fc8822d34 legacy-trunk
+21424 d23f9931b03359a85fcf2c297c8e33ff82084467 descr-branch
+21425 4e26b41d2f3dbcb6e74c44880c7245ac2eec7b1b descr-branch
+21426 9de65600420b60718341fbb9cac34e7362f67d6a descr-branch
+21427 9c58ddc47195ad8331181e9e9724d630fb6a60bc legacy-trunk
+21428 be096bb4e3f227a744433a342b2d35dd67453e9f legacy-trunk
+21429 98556cdfe71694eb5c0ea8b70306eccb009c1025 legacy-trunk
+21430 a80e0d39f10b27fa8ad4e951c60da3d0292ab444 legacy-trunk
+21431 fa3a4207d957084752cd5ad3d3cf92c510059813 release21-maint
+21432 56652e684737b9db2fc52e0de0df53fbc2facc5c legacy-trunk
+21433 903212612771290a49f607b6624b25a4f2cd977a legacy-trunk
+21434 117371af544b090a5408b3002b5a729bfe4bedd7 release21-maint
+21435 caa8ffc3cd1c70e07b767f442e516e1023bf57e5 release21-maint
+21436 77f416387922ea7818b2645fa833ba2fd1843c4f legacy-trunk
+21437 c0288670230e9325bf463e46e29378eb0079c3be legacy-trunk
+21438 2e1adbe89e4a58441eb7e129bbac8250ef6265cc legacy-trunk
+21439 811842dacd39e1e9c7991e1b9f4057dbcf30f658 release21-maint
+21440 451c0abbf8a9f54528e1c0bd95f115d54cc37ac7 legacy-trunk
+21441 eaabca13174e03fc4df69ea2b2c9cb5a93201cb4 legacy-trunk
+21442 3fde1d20331eaf61df10d03242af573b16fd12ee descr-branch
+21443 472ef68318a8bf8fd2719203ac9323ed9a81541c legacy-trunk
+21444 4d37b72ae2d260400566c6c121055844143df405 descr-branch
+21445 f24ec23cd47edff76b42d2b68af269c8081de346 legacy-trunk
+21446 c76dad06461b88840207103afb3dd87a72ea5290 legacy-trunk
+21447 fbe0ded5e4c1bf0291e47db39c24c253cd47b19a release21-maint
+21448 fb96a78e72ac6f5487d283c653b457327b8ed954 descr-branch
+21449 764492a8f6a759373e6abe134c5c9e155a20787c descr-branch
+21450 e3eac21e1d304bc376c371d49fe6e31168b675de descr-branch
+21451 9d6d1116bf2cce8c4329d909ae5866bd4abf17ab descr-branch
+21452 1694ab87f1d7c33395e993abdbaeb262b847215c descr-branch
+21453 f399e6bc50afd5f3de4224e181d53d74f4a45610 descr-branch
+21454 01b920ea52f16fded4579075b59c76f876fa17f9 descr-branch
+21455 2e31665bbdc25531489e063b55c9b2a69cc90040 descr-branch
+21456 bfed2123b14d7c4506796e0cb298312efd873990 descr-branch
+21457 0bd67c8a969e0518da9894c27fa0dc0f28b63903 legacy-trunk
+21458 b61f3b6ce1ff90d243c86eb13f724dd464542037 legacy-trunk
+21459 3b295ce2705f67ac6f12b54ac2dd612ec1a67911 legacy-trunk
+21460 e100c05d444ee90165cc9d3cf09baed3e90fe144 descr-branch
+21461 24a0f84ad7465e7b2130cef324b40ddb57b1205a descr-branch
+21462 338aaa14c4e5aeebe31a7faf8836fa149c0e8dae descr-branch
+21463 b21e70c6d09d4a3037f59258dfe508a819effee1 descr-branch
+21464 630c86d3330bd497ca62e47eb5f0797f62f97179 legacy-trunk
+21465 baf04cdf65a300de6a4463e2e2dba011611b1eb7 legacy-trunk
+21467 fdc3b16215c75f32da2d073de2b29fa7b1b5b778 release21-maint
+21468 f6925ad2d1911b38e8727e923b0d435b724e1732 legacy-trunk
+21469 40d19f907e1201546008e9599d22253086f05a51 legacy-trunk
+21470 d1c60b07217f8c62df648a5da61fcdc31566f8a2 legacy-trunk
+21471 dc74823b49ea570dec4d99afd6a27a1d22f839c7 legacy-trunk
+21472 f6b3a7a90d83fc0ba024e03a0c1b3d53fb9ba20e legacy-trunk
+21473 080100647396c8d034fc6e306d77f48e0cb551bd legacy-trunk
+21474 95e3947ca3cea19450878fd8b5d75d866d4415dc legacy-trunk
+21475 83479252309489122f8e8902995f4e9a6cdeb5d3 legacy-trunk
+21476 8cdff545cbde50e2956ff0e1f66d356da315e186 legacy-trunk
+21477 9c6a8dcd722d5553106aaac9f577c79e9be2d2a0 legacy-trunk
+21478 06332b3c4335d43300b2d442e2e71720a3fccff3 legacy-trunk
+21479 6135c12e8448672b13dc4bc8f4b8b0fe3d3356b5 legacy-trunk
+21480 1e02e2014e36a409d4656ccbce7dc5ed5eaf8d0d legacy-trunk
+21481 aadd99830531af506538a1d9e098a53850a93080 legacy-trunk
+21482 74b3c4e3f486110a48aa3a1a87b32c31a7501876 legacy-trunk
+21483 f80f6e9228de6de43f00a9dd6e68c64c665236d1 legacy-trunk
+21484 116532141adee38043843880481575ff1fdf9302 legacy-trunk
+21485 1d0d3e6a3201a013675f5d4c2d417f1e3e8156c3 legacy-trunk
+21486 726e5f2cd36ed0d7deba8390e8e9469d8c478cf7 descr-branch
+21487 7de5c376232cb4a38066197cc5039ec31c5cb675 legacy-trunk
+21488 824d61113a71220cc933cf2f85e843d5583e8373 legacy-trunk
+21489 c8662543ca6a685d4167e8dc7cdc3d002dfec361 release21-maint
+21490 cadc18942a34457911fed63bf883699b6378aa77 legacy-trunk
+21491 7f83ee3797a26466dff4c993f55f07853c1089f9 legacy-trunk
+21492 7b03c150754a09d42fc9ca5f8603d1cf4214a31f legacy-trunk
+21494 afda5fff50271bd42c4c06cf19ad55b23c2a5932 release21-maint
+21495 82f9524cc84412aab41324078756059c200185c8 descr-branch
+21496 b4af091e31c4a46173f4cf4722943f59e97b0d96 descr-branch
+21497 2e6fb6e6428fa097dcf5e2b68b59999c098b07a4 descr-branch
+21498 d94f8b3213e8cdfede5950530fb06411dc4f7cf9 descr-branch
+21499 a45776270c8e11acc828a864d99ec9230cdfbab3 descr-branch
+21500 23208f3027f6831a3cb9483ead1881b9a88d36a2 descr-branch
+21501 a31891cbad4427b4872c82acc11624ae0000a4b8 descr-branch
+21502 69b88d34e722de9f2867801a176c7e242f663690 descr-branch
+21503 47bb06023e80593a94788cd2c7245c561eb6521e legacy-trunk
+21504 f4032bed470f38f2dff08220c03e1bd68bdf85e7 descr-branch
+21505 c5e46634c7d978e471be87e4a852b16ce16b0cd6 descr-branch
+21506 53d4e72bb443b0b358b8106c524b87f523667e09 descr-branch
+21507 ff81e735e184fe351edf9f73dfadd26245f92eb7 descr-branch
+21508 23927664c7295e86ef63aa3e3378cad022c5b2a7 descr-branch
+21509 eb80b49c7b15ffc6d6da5f87114afa2b0d00e238 descr-branch
+21510 e6defe24ce85565d8d008f19e011074a3467090e legacy-trunk
+21511 b68940cf20172104b8a3cb06c257b06a6593b7a0 release21-maint
+21512 1165d3f7eaf3ca5fd04e7dda268ff1cedee3530d legacy-trunk
+21513 9512747afe9e942a79c449ccc716a982f640f8b7 release21-maint
+21514 5682f96f25de24389a1a9de80f6a4ac7dbfd6d41 legacy-trunk
+21515 2836b26861806c695554a0a940d2aee398b72490 legacy-trunk
+21516 fc1680fc9d23689cc2413eed78e3a7f9ccaae899 release21-maint
+21518 bcbbc51f0bb3d96cba3c65c545fa2c3daaf5fd29 descr-branch
+21519 b0f98475917d4e5e1004ab5c25b49b157b86f005 descr-branch
+21520 37d9d2a7ca50dfabc9c0b28259a1e78340ae11bc descr-branch
+21521 eeb2e77c5bad2aa2d6c9d0ae015d9956366a3614 legacy-trunk
+21522 7ab09fbb869a0e5c79ff38d4de478ec616a11c5f descr-branch
+21523 a29bef457ed8f02bccc5054650884087e2a9b0f1 legacy-trunk
+21524 c1e413ef981776514cd76d6eff2a8e403917f092 legacy-trunk
+21525 dfcc038c2d4ca6998fe14c438b07091e8de1e6c5 legacy-trunk
+21526 d8414f51d4f58ef79c36bdcc341766ca93d76634 legacy-trunk
+21527 33b4357aebb8c3b1b2bb33c9637fdc320fc2496a legacy-trunk
+21528 4e5e977bd3e2a740f2543196fcf4ebb4d7cc7913 legacy-trunk
+21529 09235be74649375186111b630084ca6fe3f0399d legacy-trunk
+21530 d56ecae57e0c25293d9e66796d1d9abcd959120b legacy-trunk
+21531 b6cebbeb07d1b29224ea6be406e2edf683a4adba legacy-trunk
+21532 f83bdd075361b1f98a2534120f4428063583045a descr-branch
+21533 9f013d13a28b1daf185f29ec5c1b5a9bfbdefedb descr-branch
+21534 b4411de01662f7f92458f3f48bd45299601f8ead legacy-trunk
+21535 76360afdb97027f03faf66972e356906c8260b2a descr-branch
+21536 fa1e88eb1994a6bdd2b01d0bd91cc5217ea6b448 descr-branch
+21537 1417cf470ae9e5df47189e5668e2a7b81e20018e descr-branch
+21538 d2eb23636cc627ec99552df480ed93d637d3bf65 descr-branch
+21539 46825ed23528a2c3ba00bfde922ec798cd5a1120 legacy-trunk
+21540 f315f5674b95f62ba632926a892d0ef1a27951d6 legacy-trunk
+21541 a97334971a8186b4a79c448086d160ae183bfa8e legacy-trunk
+21542 2fd1377ec48c0d2b1a6b3c130b79358ac9737f11 legacy-trunk
+21543 a83ff77399929f5cffcdab13ef0bd9ff771e6801 legacy-trunk
+21544 6a5ef19941536e1bd4d29559e3dc5e4e4b1b92e2 legacy-trunk
+21545 99c8b5b0c89638458ab7bb6588335fcfc8769aa5 legacy-trunk
+21546 9c354e69a489e8591bbc6e521aa08ff23d9e49c0 legacy-trunk
+21547 0b4061eec68e0398c0bbc3f5bdb5f7c18c8ecd55 legacy-trunk
+21548 45917323791503d8ca769706aa04e55d8d4f4917 legacy-trunk
+21549 71f161e8a1d716867e8d811e27d1a1c865aef690 legacy-trunk
+21550 40e0f5a332e90a66ae040ddacbdb4f1c48b932ed descr-branch
+21551 d9052cd9e0a763e1c19746a938aaeecbb3d11b55 descr-branch
+21552 f04a1ddd741a348654eb703972cbe1e973fe3ce0 descr-branch
+21553 ba8a562be38358cf5d4e912304cde0b9d866b416 descr-branch
+21554 6a5fe1a943ccd5c15d55dee00f6e775edabf7104 descr-branch
+21555 eacb78d9cb8edb0ccf7abfe459a909423262bc5f descr-branch
+21556 6637016df6e28f66f9426f1eac207fe5223c9240 descr-branch
+21557 173bc724d110e2980361f3df8198c64408ed269a descr-branch
+21558 3dae251b5df5a3275dcaf761599ba11d2a8d2349 descr-branch
+21559 5c976901673e5d06f42d549ad6142041f163c6e3 legacy-trunk
+21560 f7de9e0487cf14c2e14462454e1db4b01f06b6b0 descr-branch
+21561 88ee9665de0543dbff63eb3065ce1653704a7ab9 descr-branch
+21562 f7f076bfcae9c8c2d28e39f6d720ecb9127952be legacy-trunk
+21563 b66a652e3c3fe7b8a71f03ed472a5123cdc1fdeb descr-branch
+21564 aa76c17a5f08cd999f889188ab87c7da1060cdbd descr-branch
+21565 de8560c68c6fdcd6671a5648fd9ec9e0b9fb544d descr-branch
+21566 e8c661df303814aed9ccf6837516cc8bae56573a descr-branch
+21567 c15acf2e01108cad3bf2363fa52c3d53c66d5e2d descr-branch
+21568 eb04a0564a818607b109d74b08f4744a2368c2df legacy-trunk
+21569 9653272f036f40a33681eee175264dd811ad5fd9 legacy-trunk
+21570 684b0099032d462c8a2a3ae9b6333560ea0159ac release21-maint
+21571 05c49346b68b8df6e9062ab29de142bca4ef872b legacy-trunk
+21572 31119d0a18e6fc293f098d9ff1387d68db0ec094 legacy-trunk
+21573 103028725253b387d73eeb4e2950eed269a6a2af legacy-trunk
+21574 51c501c68608c53af067d9bb1ec6c3adbc31e9d5 descr-branch
+21575 65c9287abf85ba88e0097e6f28dfeab8f09b8b34 legacy-trunk
+21576 ee7a86f873835fc57b6bd137216023d417ab89fd descr-branch
+21577 a4fbc2f0139a82d7ed7b2d568e6a8aa3d66194b4 legacy-trunk
+21578 9c04e23f8d43b39186e2344a5dd27d6160e45beb legacy-trunk
+21579 d45ab7146b37cf8768d40fd597edb69d91bd57de legacy-trunk
+21580 6da862339a0e99db5d97e5d36143ab8e35c67793 release21-maint
+21581 2933ae49216f26382c2af5027b9dbf6d4e62492f legacy-trunk
+21582 ca2ea75df3f252b072886136a33bfb886579b362 legacy-trunk
+21583 946b816ad5cb8fdf83d725bcbc6c287d2d6f399b release21-maint
+21584 9ad4db97e2d9b6ed291093791ecbcc942782769c legacy-trunk
+21585 d4fb94153b308209e5f9b0c718986fcef54fc6d4 release21-maint
+21586 fbccf18aa57bfeb0c3d7fe0a17e4849c3057a2f5 release21-maint
+21587 a78f4bd59e10a0b3ef3d3de30deec84040369b34 descr-branch
+21588 abc4a3b7d18e01c791b18aff01d007b9044a2cdf descr-branch
+21589 2f1b4cdcbb06c442229bb62feda73468595a58e9 legacy-trunk
+21590 e78a51268c81dfc75707fbb704a249927077c8d6 legacy-trunk
+21591 8c38449df74609411c134a4bdbbb4075c3beca09 descr-branch
+21592 fee5b5717dbbb890d4f94ad7db0dc3ed9bf3cb52 legacy-trunk
+21593 c6d8645d4c885fff99a03289b6b8e4fe8dac5619 legacy-trunk
+21594 70af4a173a9564f08809e69672702fd6e3a7f9cb legacy-trunk
+21595 cb2eaf457386b786901444787e4527d60920b587 legacy-trunk
+21596 6b931bf6bdf67f9b7e8869387c0f4e966d90a862 legacy-trunk
+21597 cf8149cedccd21af2ef6c4261286c6e4dcbdecfb legacy-trunk
+21598 00934d62e78167232dc35a8b69512fde6f55deea legacy-trunk
+21599 3db921f3ede0ba55c8b6196d5274f49cbb17f0ae legacy-trunk
+21600 ed0f0d96750cde6566494e56ac81844501b7ad01 legacy-trunk
+21601 939bbc51cd2193d2dc21d34545678893227734e2 legacy-trunk
+21602 c1a5e5175907b1261d64b96a5c2bcd3a36e08d43 legacy-trunk
+21603 cda16383bc6baa2ebd75e4e94be5c756978cc7c2 descr-branch
+21604 3b13b2695b7a6b7603a2ba4dd7fde8acccaff3e7 descr-branch
+21605 b73e1f422ea8bfaa3b24c627cade7602b7dd23c3 py-cvs-vendor-branch
+21606 404c60e0034470673b912ce12ccc0d10b0bf2f9f py-cvs-vendor-branch
+21608 8d6b4ac0440b4c0c2177eafc2db0ada4c231f889 legacy-trunk
+21609 feea3d2f3563f0bfaf586e1b7af1ac4003a028e3 py-cvs-vendor-branch
+21610 11d9e46f147051719f388a7bc2c22cb6ab3b1a90 py-cvs-vendor-branch
+21612 8b93d04fa7a9b9f50a586f0a8caaba7a09f708c9 legacy-trunk
+21613 9f74965e0f35855c860c8f184ecb0bee8d052625 legacy-trunk
+21614 34d5e48c1ed26257c5adf5798b5d68a6a9860ca6 legacy-trunk
+21615 6c501d8920030a92add96a4cf7214b8a1803cd58 release21-maint
+21616 498d7dd99da41e9266389f1e318613252d9a05cb release21-maint
+21617 99ad6fd279e9bf5a609a10e54a8f1438c146304f release21-maint
+21618 b1a1de18f91fbcd0746458198368193ec192e5ac release21-maint
+21619 87ee1c3fd0c82275585e7b07a7a4f8ad6fb39c3c release21-maint
+21620 82a34932ea22d629d14ce2f87f387266a621cb85 release21-maint
+21621 c99129a0a47d907bb7d4f325f008dcfcf746b68b release21-maint
+21622 04e25c01849b44bb44fe29474b4679590ccc859e legacy-trunk
+21623 c397d4cd837d206f5a10a31d9c2d3bace005a58e legacy-trunk
+21624 a4d3508aefc0f958a99008cc09441a09133dcfd2 legacy-trunk
+21625 dfb77422c60742967020741b2d30124732fb526d release21-maint
+21626 106c9995db68ae5c8f769830c7261b04871479a9 legacy-trunk
+21627 795aa45902110a99861d73fb8736abfa206aebd0 legacy-trunk
+21628 2e2ef47114f77240d068b1c373e3682a65f37f48 release21-maint
+21629 2fbb25c3072eb6d47e668113496017ed81473e5c legacy-trunk
+21630 e061155f99e8eb077043f20409cd0a9c9b380cf8 legacy-trunk
+21631 98bde6e5e7432dc7d7767ef74ce9b2798994a51a release21-maint
+21632 26fc905ddc12e55b7b781cdb43f60433191cffdf legacy-trunk
+21633 6f8a2402f6fa4b3f91e50dec31f4477561d4a09c legacy-trunk
+21634 9977cf206532b146f319272aa8230bb9cdd4b8f1 legacy-trunk
+21635 4c33dc345902a9157ff0394186a7b56e5e3cfd74 legacy-trunk
+21636 c7a24d3b359739697297bf0d51e93cd1343e4faa legacy-trunk
+21637 4b7fd3ae1d930b92258e4f97cf06e8921bb1fe45 legacy-trunk
+21638 f4092a5f7bbc7140b1d4097163d2086c98ce862a legacy-trunk
+21639 069b81519be7850bb40aa3ce64db43b32de416ca legacy-trunk
+21640 5846c258b88963696d8e55ec8fbab834797dc6dc legacy-trunk
+21641 c4f75857502a6d3f6718f076abf639d05a687fae legacy-trunk
+21642 ba1f3de10085434f11ef9711735f1e05b5c88e45 legacy-trunk
+21643 42741e67733841f293d8bda48910b8fdbe22810e legacy-trunk
+21644 ea7c77fe50ae99daa4d05e9019bffa872c693875 legacy-trunk
+21645 2bb75a1f318419285cd8c28789d9d4e709670248 legacy-trunk
+21646 e6ecd8a07ea88f27bf55048ae6bc2950885514a9 legacy-trunk
+21647 46dd873d26f644f49831c6f84f4cb5a7a86a32a9 legacy-trunk
+21648 202dddb7c97474ca706f67664cf18c4b7d2a55ed legacy-trunk
+21649 8626171b2c72528552c160ae6c635950c5695d21 release21-maint
+21650 cc2486757c8bf3e22bb94c6b3352bc027ff63bdc release21-maint
+21651 c5b50552d56d1f6273c31c63c6bb13d508a6b259 release21-maint
+21652 32cb295d0862c22a1b07e81459176ea0f7e97258 legacy-trunk
+21653 86b1c82160ea98d57a0f9f41a2d0bb89e8bb216c legacy-trunk
+21654 8de91042173f7f4e101fa4827dc092af8ab74eeb legacy-trunk
+21655 254a4a9af0fbc6e8580e49ba2c5b721b5dad133c legacy-trunk
+21656 f4ea21a0f9542d37fd38a4ac56637634f3d0d571 legacy-trunk
+21657 d211709f25f1eecb417ac521910ee180bc23864c legacy-trunk
+21658 b2bf88e06fc5997b5fddf62d4109c3a4c1ff8138 legacy-trunk
+21659 65afac84d4f73236eca13e7836404e871768c4bc legacy-trunk
+21660 7328c8cd917d9ef60eeb186d0ac3afc08af9290a release21-maint
+21661 a59ca8446f92b6edb77a19c31b399294a796c980 legacy-trunk
+21662 4861373959176c58cd267a11b413749c4d76d403 release21-maint
+21663 f72bcecdd1f7e2fcb1d1a1c22b91204dcced1c8a release21-maint
+21664 d97c82cbd76691ccc036bb15dba95cd4e6cf6753 legacy-trunk
+21665 d50266b5dc48c5ae1cf0644d579b990a4450ea37 legacy-trunk
+21666 eae9272903571a277cb08dd4b9a478879d6afa30 legacy-trunk
+21667 b1d6ae329dd058fd5a5655b4eb33392c614f6c37 legacy-trunk
+21668 fd9461373cab3008b8292a55139ca5bf43071688 legacy-trunk
+21669 21b5b2eaeb3d41e62823a133e84a616e915a3b3a legacy-trunk
+21670 1fbcf549c1c4535f3be803a1844d806840c7224f legacy-trunk
+21671 64fa72a8434749003905f80d5ace4bf0a8a87601 legacy-trunk
+21672 23d8eb29e4fa0ffe683f2c01c8a917e418295d16 legacy-trunk
+21673 e4d6a739997d961d2d48206d302d60c7d1f6fd0f legacy-trunk
+21674 37ee9cd54a113fcb25252bc3175a44792c27243c legacy-trunk
+21675 e064f526a6efe8192a2acc3a9f9dac526a16de77 legacy-trunk
+21676 fc5a3ec0745e1d6b87f590a0571fcb970559de95 legacy-trunk
+21677 ec9aa0dc8b73606a716eb1ea0f9c3270045261be legacy-trunk
+21678 bf562418dfb81e0f66a3a4bab054ca24bcbdeeeb legacy-trunk
+21679 cd3b4dd3e4ca191794efeb30352aa14bf608576f legacy-trunk
+21680 ea26c9b66fbd9d2eab353fdcc37dccad0fbe3af6 legacy-trunk
+21681 0c70135389983cc45c542a13723aaeeef7ff1413 legacy-trunk
+21682 b287f2927db38a3e51d0dc05c89114ea11495894 legacy-trunk
+21683 3fcf98ca6c4a146f5af7c8fa309d4aca2f176e2b legacy-trunk
+21684 9060c06bedbc4318444ab20a8a91937ceb6afa9c legacy-trunk
+21685 c4930131f5e3ac7275a67c4d352619cf8a3f6c44 legacy-trunk
+21686 c1ec87f1044a49cd1786e80e9eab0db50da7bbf6 legacy-trunk
+21687 70461f2d21098d1c52928430260d9e2f31946d54 legacy-trunk
+21688 e675ff5748f05f279ac469f443ec162d003f3d4e release21-maint
+21688 22bed2dd1b286564dea4d9a67d4ed80dc3225193 release21-maint
+21690 13783e0a34237d50d52aa920d07559d0ea1250c1 release21-maint
+21691 6d4c8a29be7087f906ee2f469c894a65acd54b1e legacy-trunk
+21692 047d7c48068add7a3504d412d672f54b33f5c420 legacy-trunk
+21693 f53d8c52c81f8d9e34d2f18c069b4be799d901bd legacy-trunk
+21694 f60e85384b7981a6ef8e8a11ebe159bc12b2cc12 legacy-trunk
+21695 0023a78c1c82c71520d45357aa7caf7be0d32195 legacy-trunk
+21696 09a5fe2a742673889c19b12348a035a24b56a452 legacy-trunk
+21697 72939a2230d3bf17089a3d252cfff38f22253561 legacy-trunk
+21698 bfaa97a19b3083f34f87acb49ee1c9add1d0002b legacy-trunk
+21699 29be871bd87685663db85227a9658ed2a51175a9 legacy-trunk
+21700 6417d58816cfdd5b9654090617b92c96af43c4c5 legacy-trunk
+21701 a06831b3540761b085bdcdc9315a5302c069bad1 legacy-trunk
+21702 fd896b7cabb7422532c2ee4506f43b7f7b7b5d93 legacy-trunk
+21703 7461348d99da4436ffd2866c9866947910ac7071 legacy-trunk
+21704 eae17c57672742597a06cfa746de3cdeafa9a4e5 descr-branch
+21705 cfe53a620cffe8127368e69b00abdad2f3b0e765 descr-branch
+21706 49c07acc6e83e7b7b671bf719e5c66f5ca298275 descr-branch
+21707 c940287dba79bdf56390aad93e5fa638686ab2c5 descr-branch
+21708 646e052e05bed51ef2d4301ea45c17c7baf2e05f legacy-trunk
+21709 58eb50528692c8e6c438172b8ececbd01f197e73 legacy-trunk
+21711 12e7ad1082291605de554b7f49209d4b676164f7 legacy-trunk
+21712 9b42df4b74d4563ea4f9b3faefc33520a3e0f75d legacy-trunk
+21713 f40140588b1e83a75faa55e3bb39c4ed6d52b672 legacy-trunk
+21714 e760eed5f6882cd4760c50708150255e7c422616 legacy-trunk
+21715 aa34436145d033dbb024140c6c273adee2e08bbb legacy-trunk
+21716 5d3964e622a852cc3b9e96744fb61a68a3522c10 descr-branch
+21717 638d9044fbe21eb8fa638d5b0ec877494571766a legacy-trunk
+21718 a75ca217f73777d4dff665f6e500070cee970f5d legacy-trunk
+21720 ace70e327929cabbde5d919a5d52d10580f590b7 legacy-trunk
+21721 55511caa24eeb596ec6f782631b5c5c10842a717 legacy-trunk
+21722 5e1a14d993b35b92356298b53aaa9db2e751000e legacy-trunk
+21723 99b5d334de1e431fdb6f00d05ecee119293d7f92 legacy-trunk
+21724 144a3005b5bae3da51c2a4f3ec8765a6775e954a legacy-trunk
+21725 9b8564f6e34d51cae29582dba2cad8ff00bb6929 legacy-trunk
+21726 c4041072d101010db2d3c8549f97785f2593c0c5 legacy-trunk
+21727 346dcafc878b466e6e081f297ce7b1e93dc749ec legacy-trunk
+21728 670464c94b92a682320d179493135c9b0c3a8a3b legacy-trunk
+21729 7d77614fd0b7fd701c786183baa693f32078904e legacy-trunk
+21730 c6c30e45ab5ba662b585f34933cd69c64387e900 release21-maint
+21731 4384f919b448541ff128ce8c300cb9626468b3f5 legacy-trunk
+21732 8d62dde7627cef7cf0e4f88c03fc3c641f1eba1d legacy-trunk
+21733 132a06ad96eec1a5e89d9b6f322ad0ef24b557c9 legacy-trunk
+21734 a86195e6c7e332a57b68bab0c3ed2f814def1267 py-cvs-vendor-branch
+21736 6b60d0d974c31d5b9dc96e97b9e825131d7c8a7c release21-maint
+21737 28818766a64ca5f95bbd1f68e6d3a8e2e207fc60 legacy-trunk
+21738 61e50d0aa59a1d8969d9d897e7341eb9c2985d96 legacy-trunk
+21739 405352ea50a07d31f65d7b1bd0531280c1ad22c2 legacy-trunk
+21740 4247b4b2c48e69147a98b1e1a3722ae8823aea35 legacy-trunk
+21741 fe44428f9774df845bbf3735cfa8aa5a396d1625 legacy-trunk
+21742 30414b41fac9784b6f135ba75b1ea2941303b3a1 legacy-trunk
+21743 e9954567c54b02f704a9cfd0a125dd5df0dd74b8 legacy-trunk
+21744 21a04d15e38c26d833d1e01b969dfe3ba2e78413 legacy-trunk
+21745 5b820d7a3e7c13e29f3f342cc9466d8ab4cff911 legacy-trunk
+21747 2783183043579192df503497cb89220422736480 legacy-trunk
+21748 c7bef6aa6f926727d1199fbaca7a5e56ac072d7a legacy-trunk
+21749 21c549b66702411c8e6287153137c4f25912912e descr-branch
+21750 1153880597cc72a8cecbd1eb3e83520319e70466 descr-branch
+21751 9a373a143a130f2abc863400b8231a03e231f9da legacy-trunk
+21752 19250f9181dc44e1a956a93957f6db6b842c8208 legacy-trunk
+21753 23e6bba88d6a7fc7f5b9c986210696b63f605987 legacy-trunk
+21754 28b6291e2a5cf7f552d3db99fb7e9006cb76d51a legacy-trunk
+21755 3f283c98e815079b54cdfd3a073d0639ccd3cb13 legacy-trunk
+21756 1151ab8a2cdfe58e250b50561ddbd1b5e911c870 legacy-trunk
+21757 7fdb41603e9a3c3c310ca97a74e00447848684e2 legacy-trunk
+21758 85950522485020efb01f8b238fce85df35a2ae99 legacy-trunk
+21759 721f1a893fbbc248cc071fe323f58cc3ee255e4f legacy-trunk
+21760 9f43e3a9bb6ee2526e289c926d59ba82674495d6 legacy-trunk
+21761 b9d47d083d2caf34287b5d8977f43279f58e747a legacy-trunk
+21762 275afb5a767e2bd91110b9795603ec0bc97d8b58 legacy-trunk
+21763 f84acc9dfd0b5cdcbad9cf31402e7005ed2f529b descr-branch
+21764 0857fb489fa3a631077a9731d8e615f703939e6f legacy-trunk
+21765 730ab0bed6ab46f0a170878cf1b48c975472ae53 legacy-trunk
+21766 faf7f171a9f322409b518e016fc355e8da0e7e44 legacy-trunk
+21767 dcd1a0aaaecb49ca797ca6cea7e5b86fd7e76332 legacy-trunk
+21769 21d7bae9dc2db6c2cb3d72d9e3f73d92a93a8085 descr-branch
+21770 59446d0f8341dd1730f161e03e1d72962157409c legacy-trunk
+21771 1f9c7b4cee77afe9fa8a4a5e4dee11000776b52c legacy-trunk
+21772 fdb36a0c7e6e98e620bff1fa0648865610e68135 legacy-trunk
+21773 4ac98fe7abd2b5167626986746de42c464531443 legacy-trunk
+21774 6238a222b7cd658ab4339ea6c3a6ba4775ca889c legacy-trunk
+21775 384a61fa6f5a2047dc4f39ef6fb359d6777cb143 legacy-trunk
+21776 0a90e5ec61b6981e656e7ec8d49a2964f8375877 legacy-trunk
+21777 01fc98ba399f1a8af1f39d4f74344be40f214e34 legacy-trunk
+21778 19dcfb935f60e4e0f8acf86128bc30428d4cc771 legacy-trunk
+21779 271064da1d52ccec98fe1853100b85834c8cf5df legacy-trunk
+21780 1f3d766dad91e5ee26928e592594c21cd5cfdbb1 legacy-trunk
+21781 9159222e6463fd5945048b67d3c9d762bb6a5ad9 legacy-trunk
+21782 10717f8a6d9684c297e1509bacfe485af4b03d2e legacy-trunk
+21783 98d81cbe8bbd7fdb39617405a2a0ea7323aac734 legacy-trunk
+21784 35fec487bcef77738d5fb3ffa9d838c72d14aa03 legacy-trunk
+21785 e5e5bb5482d3b72c671126a897138cb4187e7a00 release21-maint
+21786 920ee7f2a5922e685ea8c543207d93ec65c617ef release21-maint
+21787 2b5e7383c77a16f34ede4876e3ff81f8d7f5f4b0 legacy-trunk
+21788 295518e6fceabe1907625d854bed99022afe0fee release21-maint
+21789 c06d8179e9e3b336896a56d9d208d386d1785987 release21-maint
+21790 914940946e2ea1fccae003fc0103dbc8090ecb83 release21-maint
+21791 c9b4c8ae617923051a61ff26327b8c81eaf81163 legacy-trunk
+21792 4030c9019067c5c2067e8830a32f01b0c684e254 legacy-trunk
+21793 fdde9facbb6ea7d155d0d4de28ac6cc1ed6e086e legacy-trunk
+21794 77c82824df4129f37bda611977ab18d3881440ff legacy-trunk
+21795 d59a8476afab9df54aa0418ed5ce043c7a372e21 legacy-trunk
+21796 c8e4728d2ab0f3ca8a0d2b2169dffa4c05cef555 legacy-trunk
+21797 1d3c57cc8d085c8687b78d89e698ad0c336dd258 legacy-trunk
+21799 983acac56466b3bcfcddd2c4318290ea7c9536dc descr-branch
+21800 05cf6b3e63de554e17b9356653440d6bc53dba43 legacy-trunk
+21801 e53bcbc3165e39679af638993ee25bb450756ccf legacy-trunk
+21802 d3c25b06b7e5b44dc5301fdfcc26488009665df2 legacy-trunk
+21803 57e59525d217dfce35d18a46eb8d248ebab8ceed legacy-trunk
+21804 fdf8d0831278953a28579c1dca032b70d705d534 legacy-trunk
+21805 f7196486f42d1809d5e8a4a6edd7c1ccafd5352a legacy-trunk
+21806 6a50910ca303ad04a37cf9d8aefe99c3ea6c8cfe descr-branch
+21807 55717dc227f4de10b490c8f5f633b5d65cbc1ea2 descr-branch
+21808 94fbcf196549557b8e271fb6d9eaf67e8d9da57f descr-branch
+21809 0772eaa176319ab4ffc5948e68038fee04507785 legacy-trunk
+21810 7335ac7c53157fc00d9c1de38a520aa388fba07d legacy-trunk
+21811 cb5ea4d8e8bf9811d666df44c3b40a0c769443a9 legacy-trunk
+21812 e5a2e8916e0b4e64c3f2780bbe2504661e37b17a descr-branch
+21813 c43fe213ee108f535339b9b293b5579ce6b4bae4 legacy-trunk
+21814 ad82cafe45acf491f898615daf92a3c2d2743943 legacy-trunk
+21815 33818ec6395bad90a8dcc328fdba5f321475fdf3 legacy-trunk
+21817 1f1c78ba57ff457f600a24c5463562938645d611 descr-branch
+21818 d6233f7b74c18fe5caf6445756157f17623ef36a descr-branch
+21819 8aa63aea7269598a713be447486ac56e88a82017 legacy-trunk
+21820 cb66a983096f7cf39515b4c33ae4aee1566c50c5 legacy-trunk
+21821 3b888859d52b3a607bc85b59d6a8c8940deae0c3 legacy-trunk
+21822 ca8a48aba22ece29bd67709d55eab9d58dfe1ce5 legacy-trunk
+21823 5ebee5c060d0e7db218c7c1bfe2108da5a7b64d2 legacy-trunk
+21824 748f6b3a8bf627481f29762deb225438c2cc9f06 legacy-trunk
+21825 ac11af7d860a35f5ce766947614de3fc5385512f legacy-trunk
+21826 fcdb8c94b5d8f33deb8b4670b6f27cefcc7b9e98 descr-branch
+21827 cd639a9471b8f7905ef581ec946a90ac0fc137ea legacy-trunk
+21828 e638f1206ee0bd99a9a91f2452d8938d0a53a2a4 legacy-trunk
+21829 70275037f12d8ded6ad22bcaf93ad74323c0fb8e legacy-trunk
+21830 74623b076d1be9e33d08fcdf65e11d7efb6ec965 legacy-trunk
+21831 95ddcd444d392fbb136c767b1a3a237aa1482a16 descr-branch
+21832 d89e936e1b1065c5f570c0259e73302dd643c5da descr-branch
+21833 70711a98d9897c89379bad04afe439c315dc9f8b descr-branch
+21834 e09bee9b57292d7613ee76244be8424a56747ae2 legacy-trunk
+21835 584be0bbd942b6455c3992fab486cf1616c90e9c legacy-trunk
+21836 f65ce5990547d5104cadafa009652c6ef8b60118 legacy-trunk
+21837 b7775ebbf449099a4e1b05498258515cf0e63f5b legacy-trunk
+21838 f14800229677dea0aab6e8f5a7db2f4fb958fd88 legacy-trunk
+21839 92626f42e0433cef66f5de660dee8a48b652856f legacy-trunk
+21840 5fc2ba1c3f2423ee939303328bda66a581e06be3 legacy-trunk
+21841 a02779fd9b920eb7fa95b79c5c4132b9e59287ef legacy-trunk
+21842 1f9743a1ed7b0b08aa9418b8e73d72b22c15522f legacy-trunk
+21843 6d4a530fe7c162211168980d6e0a9119d4fab194 legacy-trunk
+21844 384b9113a2e0c69adfb42d5a71d92032a1d2a7d0 legacy-trunk
+21845 7927e8cf46150ac4d12ae08722c7f75a938c9ee8 descr-branch
+21846 38206f29b0fc1c5475d77185aaba53f222cf1bb9 legacy-trunk
+21847 cfb57db4c388e755f9de1a05d72eacce60b63881 legacy-trunk
+21848 492a1bd4d0c5fe1a2dfc6dbc12157f5ae5b3d9bf legacy-trunk
+21849 9ee8f16b0e272f69ea440af58f28957b85065846 legacy-trunk
+21850 f7be7e9a6f20281cbbe5683a0d1805851bb92abc legacy-trunk
+21851 d3bc82d1c5a92855c04087443cd1e92c9b7846f4 legacy-trunk
+21852 e421aa45040cd08691ca38224955f2573b2ac0c6 legacy-trunk
+21853 a7bc339ee2f350897ca5751ca3c11631cf2fa1e8 legacy-trunk
+21854 2ba1d9d996a383ee2124dc3b77161e7f8636a5fc legacy-trunk
+21855 0505d9dc833d74035952835331da2cd4ce6af6ee legacy-trunk
+21856 c659d4c009cbfb37f144cd8f06d86999ed71173a legacy-trunk
+21857 ad2f526f0019d41981e992080427527eabe40991 legacy-trunk
+21858 8ca70c9c1971376e54b5555964b980fa1ebfbbf5 legacy-trunk
+21859 47932d82b8eb1ff6018ad1c8abd31e6d701c4656 legacy-trunk
+21860 a38e77240a673980ee8d981814615f31272d2442 legacy-trunk
+21861 54d0459c8e0fdbd63c24bea3b45a5876501578d9 legacy-trunk
+21862 fd74cb5b95732c89f4f90f683a2a5501648bd81f legacy-trunk
+21864 09c6fe7dbb1c53cd7ae1e85bd41256185e6b1e39 descr-branch
+21865 45f53fe44c0e6d5ca6c52f474b4424b1f65eb186 descr-branch
+21866 62e24bc47b62072d3157413e424202dd39a2ca5d descr-branch
+21867 b21df091fbbfd6d7c7ffe86816c84be41e412bc1 descr-branch
+21867 d250959133b5a996b1edf8a4772fa02e58a3a972 descr-branch
+21869 4c59e934e765de503be9369898e6911669ff7e92 legacy-trunk
+21870 064de84385caea0d27d7e59d04e6a9cfa238937c legacy-trunk
+21871 51c382d5851b9192f86d1c45c6182e794a5b8ad4 legacy-trunk
+21872 07917f143488621603ec56719d799b740d213f22 legacy-trunk
+21873 00695551d721211705dd73a2251632f21d86bd95 legacy-trunk
+21874 4381461cce5df92ce135d5a4d4bc3f0f26e7f15f legacy-trunk
+21875 9218fa652391f3a891c724c4b98d37f86b7cc475 legacy-trunk
+21876 25244bdb163d921e2130ce6ae0e02e2af3f61a47 legacy-trunk
+21877 1c2da78b839b9b058d66b6735a28e50f0650cb29 legacy-trunk
+21878 6794dcae5d0cd984e0d0d7483aa5ae8248d0bb36 legacy-trunk
+21879 c766756d84d33758338e949f4ae7ebd2d7c5f700 release21-maint
+21880 daea94f06429609f4bfbdd9bfb640ce79361b838 release21-maint
+21881 a1f19ee01aae0d5ee3c32b97efbc3c3f1b531f54 release21-maint
+21882 53545c371fe3840d120947c591c40c3d82e169d0 release21-maint
+21883 3cd3081df601c20a92f81af425188ab17c0723b1 legacy-trunk
+21884 95ea610f3f54d72ac866e3497b816b8125e7dd61 release21-maint
+21885 36c561ee96b5329f50b030cdb93f5a9bbef033fe legacy-trunk
+21886 8df77415a61d564c86395682359b4cc1b8cf6faa legacy-trunk
+21887 03c20e7cce6acd4d2804480db4b7bcbe1dd935f6 legacy-trunk
+21888 70e1858ad703221a6260837ecab9298fc8f88d52 legacy-trunk
+21889 237368644c13d537c7c2cc873a593315f4432509 legacy-trunk
+21890 726f4d06bd4bd3880291eca1637ca9e20551b152 release21-maint
+21891 24d00557fbc95aa7fd1fda33812f8b7e100c29ad release21-maint
+21892 b094965960af91d0a93167a289fd1459eeb4d353 release21-maint
+21893 4c0adb8a5bc65393428f6451a4047c8b47332131 release21-maint
+21894 8cf53d0f85c874e7a1e7f7c015fe2a24d3b5dedf release21-maint
+21895 5c73621c9559b58fbfcc0569cf7d83e07a59719c release21-maint
+21896 5b07470239db8924b873643bf4673334e979b610 legacy-trunk
+21897 4ca9aced55037cf3165719971c84362caeea2471 legacy-trunk
+21898 55320d6291c9f5ab8e8d61ee450beba61f74b722 legacy-trunk
+21899 3c050d1e35b102a96cd13105dd1b838ffddf9b67 legacy-trunk
+21900 11f4cd45a80c07837d08495dcded8d04fdff8687 legacy-trunk
+21901 baaac94fec547520afe716646df524e46e68b575 release21-maint
+21902 ee9b4580433770b427de6f2ee1d27329f6c5f0a9 legacy-trunk
+21903 ca9d7a63794f015b8b8c785e5d139e57a4ac88a1 release21-maint
+21904 917168fbfd94b3df7fe6a3e8eb31de8209fb2184 legacy-trunk
+21905 a557e95b92f0bdf2ee1e5719b28dbf629b3fedb8 release21-maint
+21906 ae676cf1495d4fcff37e788ccda52888752a9473 legacy-trunk
+21907 c780c61b35cec98db92e93b4f5bfe287a8324f08 release21-maint
+21908 ad6c5c27ecbe63e8616a23f368ea19e09dc817ca release21-maint
+21909 f8e2869976b0e507509145220aa6b852248a5d82 release21-maint
+21910 d51b2d93381478619c27cfa4d30bdf5e904e12da legacy-trunk
+21911 335e75bcb51ad86e00bb758e425e524268c09c61 legacy-trunk
+21912 2ce6a9b0a51d684779207504a9c92246a1f4200a release21-maint
+21913 140b729130d0c5f0be328ddf5723bf3444489878 release21-maint
+21914 b0329649b8cfcfa5ba361fa162ae9476fed5d661 legacy-trunk
+21915 c25f2c13d3806f4c387657ecab39e5668924d140 descr-branch
+21916 df4b6b5ea9b85c5c78b8dfe870e94a457b95a486 release21-maint
+21917 59d14c88651cb444ca0e92575aba125b41175cf0 legacy-trunk
+21918 fec8f4035fb2866ae45e814823de691c9aae7655 legacy-trunk
+21919 de6f15896861980ca8d72f3f81d3a77f90c0052d legacy-trunk
+21920 b26ff1643211f14c2c60d4a38e911c9cd211e2de legacy-trunk
+21921 704486642079fe63137c3a1385e61b62d1d93384 legacy-trunk
+21922 1aa7e219f52dc82a9d56c680482ecc96d3a599da legacy-trunk
+21923 c7cb1c9e9d9c57db526175b7f3ffcd2852b5924e descr-branch
+21924 c712b16ffacd63b5d6282b1339d0126dbba426aa descr-branch
+21925 b142b517309c752d111a5455240eea8411a1e086 release21-maint
+21926 920e0361dd6e3e742cd5032c4ce70456ec8410f8 legacy-trunk
+21927 133e570151014f9df07a2206dc22614631b6fd68 legacy-trunk
+21928 8ca2ef663ad20cbd9e8203b82df89f696d3542c8 legacy-trunk
+21929 276bf596e8d18086158e0eb8621c88be87dc2b70 legacy-trunk
+21930 df9c4c54ef3ef9d634258573eba2ff5fc658a47f legacy-trunk
+21931 74b7b8a9628b66200f0142270039d34b26d6db55 legacy-trunk
+21932 e5bafddd1da042e9c40f0a41d0da1cb94bcfdcbe legacy-trunk
+21933 d0938bc12a11e67b3be08e1ebc603553150447a4 descr-branch
+21934 c6ef71e943dd640b4fd21ee3bb92fd63faea8363 legacy-trunk
+21935 aac62aaa846defad0bc45549ca3345fef27d4f2d legacy-trunk
+21936 db647f7c831bc58a23026dafbae7438ef062c13a release21-maint
+21937 92f81449e16c21e7f8f94a45c4a18a111218ff88 legacy-trunk
+21938 01692bf02f97850557a6e44c88662e319bdf13f7 legacy-trunk
+21939 3cd03a64c338c0034398a324621d8be1631fde79 legacy-trunk
+21940 f8bd14aef4d6fb5ddf4e9d7c726f2fd8689c497c legacy-trunk
+21941 af9ad90a44458b6e2d48ccd8dde1c314382d65f7 legacy-trunk
+21942 4d46a1b33c6213be00e7e7c9459e4cd3d0e3384f legacy-trunk
+21943 e70929e10663cedda80b6b40c4a743b8e5578b8f legacy-trunk
+21944 802a84e84ea942f606408d1d4667234bb561f361 legacy-trunk
+21945 29e09b96ed3635a93c39cdedcf7f55d613851334 legacy-trunk
+21946 74dfe3200423dd36c3caa0dfbfbc4c6208847343 release21-maint
+21947 1d5083e6d17e6cce57e6a9a00c2b83bf8382d111 legacy-trunk
+21948 6bef09da9b9324f282d9ad6b33f3642975f7af58 legacy-trunk
+21949 0ebfb259ecc65e8cc2715e6a4e959840e0979fd3 legacy-trunk
+21950 cbd22c9027b2b3d3f3496665f9a01e4642cabad2 legacy-trunk
+21951 ff8e0ce1d9869806fc68d6526ad5b006ca5ab611 release21-maint
+21952 141bd70e0b723059c6dd548fbc797d4ec40ae684 legacy-trunk
+21953 2e173da11d2d146c8bb823a72ffc59f3d6871bff legacy-trunk
+21954 8242907c89573f8eeb36ace21b4c092915377ff7 release21-maint
+21954 572533a3038d1832c8a200fb8718112dd83758e9 release21-maint
+21956 79d304e3ba257c90ca914a9852ff14b51d5b5d1b legacy-trunk
+21957 b10ff337896be577ed7c3ef401b3d9ab63db56d0 legacy-trunk
+21958 5de23a638ad64e9f595dcad9774cd02f37a9a9b3 descr-branch
+21959 743f8e1d953cbc1bef6894aec06e08ab2a8ea7a1 legacy-trunk
+21960 57684d3cefce91c03919b1c51db43d8dc5f54cac legacy-trunk
+21961 2d68626143a79c9faf71b09e7bc4c5cc041099bb legacy-trunk
+21962 22b2f4b436aff839025a5377c96d3130cfb895cf legacy-trunk
+21963 4d33acbdc508f4bd796bf1b8f2cbb04d83765ea2 legacy-trunk
+21964 23ae47e00119f3c6962eb74886190538164c37b8 legacy-trunk
+21965 44155121f02b1e283741f562b2243ab6b50fca50 legacy-trunk
+21966 5eb460a65ff70a34e5f45885e9c079c645d59607 legacy-trunk
+21967 01ae962df885e4e6e7bccc8f2554610238cc3174 legacy-trunk
+21968 98484ef225f9289f6218159ca7f3b84f716c8007 legacy-trunk
+21969 ac13a6ce13e24cd0daa18cf402c88c374594fc56 legacy-trunk
+21970 01c639971bff13bfd54f84496e82bec960502198 legacy-trunk
+21971 b465cd50cf364a96235ab237c454d99697aef179 legacy-trunk
+21972 0e22312c47334bbd89cb9de321b53cd55de06c7c legacy-trunk
+21973 f999d3609f7466dc6452732fb7a5bd573f015804 legacy-trunk
+21974 2402070ee024c32e21ba5c0778f027564cf07e9b legacy-trunk
+21975 18df0978de5d2e1122876dfdc9d2056ae2866026 legacy-trunk
+21977 b307e5a8b4d8d591f9fe9461892c2e3d61dca617 descr-branch
+21978 014639dc65f8c764d9164ba4b484fc2385fd779f descr-branch
+21979 7cd22bf56d7bc2181c432de677f509a7caa8b212 legacy-trunk
+21980 d1119633a73e9cdda6b7d1dfc41cd5c590ad5ab2 legacy-trunk
+21981 02b81df048bc59f67fc69a5c106f23e42ee66866 legacy-trunk
+21983 c2fbb5941ee56fb8a9856e93b303d447f09c2fdf legacy-trunk
+21984 4d0ea4c2386d5d88c4337191f0b1770a9b7780f2 legacy-trunk
+21985 3d53b59f48e66c835d028639c8688e63ba910a4e legacy-trunk
+21986 604790d493fa7359d66e82f9d08f928fcdb2fa8c legacy-trunk
+21987 18a3e0d8808e0f75564b13c91e8bc130ca7dbf99 release21-maint
+21988 d591a96aed0643d59ee6754bbefa6cccbcd51bf5 legacy-trunk
+21989 96455f4abadd33e7ba41104f0b4222e96767519b legacy-trunk
+21990 4a431952676b57b02ebb17b228379057585b76cd legacy-trunk
+21991 6d9874bb978fbf5c5fd9f62ee8e37ad35d6a6df8 legacy-trunk
+21992 998f80514a1312988b35449580d444c7b05fd646 legacy-trunk
+21993 763bb6fae280ff7027ed74fe00e7e4566dec2973 legacy-trunk
+21994 70b9b6f4e79c2a82964cf97e88e7c242d412fc35 legacy-trunk
+21995 4462c57f6c948ddd8d026bce6ce5d16dfca706cb legacy-trunk
+21996 74f050f7c364defb58c19a578b6f745f26c53d84 legacy-trunk
+21997 1b6868e89a23e8f0a0e07cab1d8ceec27942b2f8 legacy-trunk
+21998 a8b1acc7a21f54d3d52d4efef4e073b864c5def0 legacy-trunk
+21999 81315b6f94695102074f4b1c0477f32c33a8e0da legacy-trunk
+22000 41007d50ccb73d275603dce64063f9bf1884cbb3 legacy-trunk
+22001 29e661c52c0b55e9b58bbb17f0256a7eb4fee9f6 legacy-trunk
+22002 0c3ad503ad6c4920281e36cf9e398539f9f1942b legacy-trunk
+22003 c3071bd6a713318cb0ab79ef969fc33fd5c30061 legacy-trunk
+22004 107326515425db79a92942b056905b816a84e75a legacy-trunk
+22005 693b39831f718107255746e20145b54644cd9197 legacy-trunk
+22006 50004bed4e65a916b3b515234a7af9b9533caecb legacy-trunk
+22007 315b3cb127c06221d842eeaedb5b0001842110c0 legacy-trunk
+22008 cebb4e1874499d48305770115502b8622c64ae3c legacy-trunk
+22009 dc9baf80c45afd9267679a65663d9e1aa47ddb10 legacy-trunk
+22010 4677d2ff31508f5fa6aab640c5834f5590633f49 legacy-trunk
+22011 a6361c2e5044acd4471aa8549c3ad04ce10e9978 legacy-trunk
+22012 33f82080559e1698d407923922c40c17ae6aa696 legacy-trunk
+22013 3aa87f34cab01b644d2622a0390f1261d3c9499f legacy-trunk
+22014 6f9242d87059e84fa8a8aa67eae49bcfded62667 legacy-trunk
+22015 40900620293e6d6dcc01cd5dacfe2296039f11f3 legacy-trunk
+22016 b80ac8e31a802efe74960d338752812433037573 legacy-trunk
+22017 7c928116baa00de0f3d1c246505eb4a3ef89e8ae legacy-trunk
+22018 081d96fbcf432cbb7518dfe760d57c0f1b65e80d legacy-trunk
+22019 1bc1fdf1482b06c77faca560a5c2c6b6cb6c5aa5 legacy-trunk
+22020 fdb388f2df4eaa73190b425018454e0e91d4feb6 legacy-trunk
+22021 132c4bfdba748018cd0660e0c92349c278939f28 legacy-trunk
+22022 131a9f75e2582dd54ef6c13da9656570ce5f2d48 release21-maint
+22023 3cc66750687d5ce834e6518dd6f3f51a0d95dbfe legacy-trunk
+22024 7e52bf52ae33487dc475f2034638fc5bc9079c6e legacy-trunk
+22025 2dea40e40d9d573e5067a5c760e990a37524d0c7 legacy-trunk
+22026 03305602ba9b85b3bfa81a337b26d45e4cb8a448 legacy-trunk
+22027 5e0a40ccb9da4cfc95a727e540a0b3edc49f06fd legacy-trunk
+22028 a8575f358b9fdf7d70a54c1354e9aae80f0ad7ad legacy-trunk
+22029 ab8aa4302109913226e317f07a79165de33ec7ba legacy-trunk
+22030 c032aaf6c812320df21218508dfd396807997040 release21-maint
+22031 a1f6fd01205f022ccee3026df0e5ba8f0dc01a6b release21-maint
+22032 e66d647b732f23f75b41a7ebee857967b1b669ca release21-maint
+22033 1c5d256b125a4c48a0983cd2880edafbde4cbef7 release21-maint
+22034 045f55135ad004a4cbb1fed7e55358dac5cdc05d legacy-trunk
+22035 876aecef6483f34e39523cc892a832c079332c5b legacy-trunk
+22036 3e5ce99459862a2227696842f51eeb7dc85fde1c legacy-trunk
+22037 e1464143c46330624464bdef9ac144782074f98f legacy-trunk
+22038 12cbc942f549d538efff05d976cfa67070096816 legacy-trunk
+22039 77fd20bcc7661a70b84b5b14d43bacf8a2a9b42a legacy-trunk
+22040 43ac1804d2aacbddcb5c9398b898e5130d476c04 release21-maint
+22041 ef2031c5487576324d67f3671b9d51b843f0586e legacy-trunk
+22042 5331f47058a199123201a21ffdc27472befbc42d legacy-trunk
+22044 2b16526a35a4de121eb7f1a2f6e5f6c68c511c25 descr-branch
+22045 f52c083b558816e13b6359ff8e74744707bf231e descr-branch
+22046 3147efe31eb898215369cb71d1a810b69aebc526 descr-branch
+22047 d972ceb4dc0640cf0519b5d382675cc9348c2d75 legacy-trunk
+22048 d64628cc8ffc8a86dff73fc13b675f3d53aca462 legacy-trunk
+22049 6f301b3cf323ec93549c6886f01b05b829e75874 legacy-trunk
+22050 4ee1fee1d4adb743040be5c9c64c8d457d71b1ee legacy-trunk
+22051 d1669af9d0ec52d37b7495e13c3530d613ee51eb legacy-trunk
+22052 7343622f2b85d14124a4c3b78e980e60c5b9b8e5 legacy-trunk
+22053 d3d9cea2315669a21e74e4e8ca22a6dc01f05143 legacy-trunk
+22054 ae19c6990749620b0ae918a787e720462c36dabe legacy-trunk
+22055 9ac1d35f81366ce2b254e822b5af88ebbc2e1a16 legacy-trunk
+22056 ea8e963d9e6724469dcf6361601ba6f1c2799da1 legacy-trunk
+22057 6f59032af158f185614605e93a0e9635309c7ec3 legacy-trunk
+22058 81337fba7ddbe059b09182f15f8df1527999d443 legacy-trunk
+22059 c07655f72647b0dfd9442df602dc2b2eab9b1801 legacy-trunk
+22060 a5aaf68ffcdaaabc9187ddaaae4a278693cb2d3d legacy-trunk
+22061 9eccf78fea1ac03eb589bc79061fb8a63c4b9f0d legacy-trunk
+22062 432457f02287841096bbff41d5adadbd732a2f65 legacy-trunk
+22063 cb76117c1b4bb8009b39e4d818116fb1ee747395 release21-maint
+22064 27636c91cb27c5a10544874a651ae236ee037bf1 legacy-trunk
+22065 1b09a9cb06d59f5000e327dd37ada27aed6a3b50 legacy-trunk
+22066 3c12eee7bbd4236476bac441a7c74a35a018b212 release21-maint
+22067 a3566ee5b1f948444d9f4b6a0405375164f487c2 release21-maint
+22068 11112b736c7b5ac0e27aae7e4041d1c74b77e8c8 legacy-trunk
+22070 12b4bc4a80488e583a300167ecda403d54bd2d6f descr-branch
+22071 4081b56f20ff59bfb1135644a8ba2eea10642d2c legacy-trunk
+22072 2dffa3d3d94ff1ada2b7df00c505d883cf157997 release21-maint
+22073 0e212e88d33d092d9d47167ee6a741622b045459 legacy-trunk
+22074 4d9ebeedbd045fe18a97dc46a51d0eb26caef81b legacy-trunk
+22075 8c402adeeccbb5b03aae6de6f3fcc000c67c292e legacy-trunk
+22076 0b9cea63bcfcdcc33c98429943746ec6990f5f59 release21-maint
+22077 f5e25fe466a4191dd5d0d623177992446eef71ef release21-maint
+22078 92ef38b013463b263e379b550e0f5c49c0d30e0b release21-maint
+22079 0ce35e7d6e33663536cccb99a04edd547edcec49 legacy-trunk
+22080 64343a1272083c050cc2ec6b68a5f65ac194c288 legacy-trunk
+22081 22456d0ee73798c4722663f6774f1b9dd860448e legacy-trunk
+22082 c7bb9563b1498037c3a02bfeeeb73333a523a012 legacy-trunk
+22083 9b291ca6546c4b4f924fe6fc1b2ec9ff2536dcc6 legacy-trunk
+22084 f12e1a766a142d5475547dd4357d721625296a37 legacy-trunk
+22085 aaafc852c2d53f8d29252f77e8938847a5230692 legacy-trunk
+22086 fb837c5ae5d3f36b1869ef3090a5590850c5d080 legacy-trunk
+22087 5bdbe61a0c28bb2c3f9605850fdbd10d2c27248a legacy-trunk
+22088 59b7e8ecfb9667321d29f4a3376bcb65144a275f legacy-trunk
+22089 71feae7bf56094bf34017194cf0a6c9991a21c02 legacy-trunk
+22090 bdbb7c4dc63adc5776750a15d2dd6b63101de6f3 legacy-trunk
+22091 22155a71825415e73bf85aa9e2e14776080562f3 legacy-trunk
+22092 dead9fabbefb7b57a019ecec4e95540f01a0c5f5 legacy-trunk
+22093 0b1625a9e89a72cfec67cf7cea282cf70e5e134a legacy-trunk
+22094 d20a4ca0705c1ead9309d36a264a2aa94e10ba85 legacy-trunk
+22095 0132af63506b9cde0d7d76c71d924faad7f2ffda legacy-trunk
+22096 8584217ddc8d6d20821fa279877c3c91c877034c legacy-trunk
+22097 cbabe522b8f1676e5f7a81e271aa823d121154bc legacy-trunk
+22098 22e8231463ba6b23e15e4dda145c6dc9abc6cf65 descr-branch
+22099 edf058b16ddf3fad3f22550d45d56bb24a43cf38 legacy-trunk
+22100 cbfdf623c266f693fda29e551cceb14b87e5b463 legacy-trunk
+22101 5af1ee42257527b524ad6ad9c3ef71a0ac39d461 legacy-trunk
+22102 7628aa816ada9da968a24c3534d10be9b323fbf0 legacy-trunk
+22103 29104173a072ebd63c1cdfe672cdfcaa3087501d legacy-trunk
+22104 443a8622e851abcf62e2865facc25917fa028764 legacy-trunk
+22105 79c676f9b34a9140b9847e79c05819a050b1db83 legacy-trunk
+22106 9753b0269f3ac0dd6840ec8a21943ff2ebf496c2 legacy-trunk
+22107 34f01c6cc81861372ef98980aacd383796bbd8cf legacy-trunk
+22108 55b45b47fc4878fbf45448dc737938689c2b4c52 legacy-trunk
+22109 36e7d1eabd921ab0434e7520dafac1d3197b4c48 legacy-trunk
+22110 914122fbead2dc2ddba998b3dd1ac4534e0c389b legacy-trunk
+22111 f61df8f0cb438a675394e7099aa943de2590dd65 legacy-trunk
+22112 deaf7b139bc8f4bbc0c6cd3ea1852f73ae7df48e descr-branch
+22113 f082189a444294b46898f65e5a9d6dd5b5361839 descr-branch
+22114 510f7f6a877ecf74b563fefd86e49c40b146ed4f legacy-trunk
+22115 2bc648932d44fb1533dc466b870af40d4498477e legacy-trunk
+22116 b732690f561c6e765b503758a0e0e956d3bc599d legacy-trunk
+22117 e7c3c9bf52b27d58eab6c9bbf1a1550db3f741dc legacy-trunk
+22118 42dd6251cc3cc4f01bd411eb091319c337428452 legacy-trunk
+22119 72a3691f1071faf2e2611be9bc1d7ba2b4bfe47a legacy-trunk
+22120 52bd9e1db3d90a52169ee1a27e06ad7bff0324f7 descr-branch
+22121 52e92cfab2376a3d450a08d984881aa1dd234274 legacy-trunk
+22122 2f27838d8fc594275862486f0335050138e05748 legacy-trunk
+22123 2e49f0e92bc5aa5c8b86fde9bcf2ed3be32eb0e7 legacy-trunk
+22124 1efd69bf184c3908523b39185775a5b12dcb0b2d legacy-trunk
+22125 fa02f79bb491cc7110f874a505ab228bb636aa31 legacy-trunk
+22126 0aa1916cf103491dc7b6d4ecd89bbaf5d6f3587c legacy-trunk
+22127 8e2f6296fd7b4a675d5c0ba6ac00ae2f6accfeaf legacy-trunk
+22128 f49a12e7e24a40a0f47453478242918ffb2468d2 legacy-trunk
+22129 4bfd8a5da0b1df1b7f7789d64144ad13a5d6eff4 descr-branch
+22130 23f55b9f4bc744b110f5b555f4414d9452870bf2 legacy-trunk
+22131 4a8ded087262f2c566e07add30b61c10d45c56a3 legacy-trunk
+22132 0dedae7be3aa10471bac0ee97c96e6de06659a33 descr-branch
+22133 0fdc5eebe42d1c5187b964c6b510b76119e0c9a1 descr-branch
+22134 6c0185df7147c39830452f6c5fc34966b8a406ac legacy-trunk
+22135 dab95ca8acfc2a4a70652045c759aaf9334314eb legacy-trunk
+22137 41908693774675ab6a01e878bea9f3bb2c654828 descr-branch
+22138 650973e2926ca1f40782d1a7312bd081cb4176d2 descr-branch
+22139 09df3254b49d7c9306585302fe815ab0bdb53439 legacy-trunk
+22141 1541d5c6a8f181208aa7376e578b07a072c9eedb legacy-trunk
+22142 900e38524bf291b1cd6aee2e13b098596df3647b legacy-trunk
+22143 7149173e8edcdac6bfb26ae553c0d03ba9922463 legacy-trunk
+22144 f858f987e772a292006e8f462cfd045c954ac6a9 legacy-trunk
+22145 6c21e9394b44f4fe1ed88d68b7c9a2a7c136db67 legacy-trunk
+22146 fe3bc4a4ad8436e9ae1d8c530907c33004fb3c6b legacy-trunk
+22147 a5e4d4a30c98385367699c1d2c3730e14aa620e7 legacy-trunk
+22148 013cffcfd8a3b4019aa632d0c52521d149ca8acb legacy-trunk
+22149 90d06cbce26a4b014578953cdc2127280e1d4685 legacy-trunk
+22150 e01d29639d8e5d3c7a57e37c27f5f55194b467dc legacy-trunk
+22151 a0819708fe9c72d58b4fe617508af51031a4b25c legacy-trunk
+22152 f8fdd5083af3659380fd55914f05b52096c68f6e legacy-trunk
+22153 2b14f1308275527d2b4d4ea2e66a23b7f26220c6 legacy-trunk
+22154 1346ecf318f277d0be52cac0975c43ea309df61e legacy-trunk
+22155 9306daddc26fdab78580ce068c891dfed61c4b3d legacy-trunk
+22156 388df49c1c3822828c353ab1914e6d969446eb30 release21-maint
+22157 4ddc5ab9bec419f630c3b4e7484ac783bbd44c2d release21-maint
+22158 f72d61b1246ee01c131868a29ee89172bf9e2bcc legacy-trunk
+22159 e90a658a58d4f633afa1638b9c0c073caf5a15d7 legacy-trunk
+22160 48e0fb055c33caba249e375e4b7296c95e88749d legacy-trunk
+22161 fefcc1e80cee3560ab5a7124cdc1672c70d9401b legacy-trunk
+22162 1db6900a07835a3f5c3e9ea89495277427dff7a8 legacy-trunk
+22163 b762220a6159fc33cc2e77219fd24a87da3dfe5f legacy-trunk
+22164 f2885b0ddbaeb60acb0608ebb4aa182933bc6434 legacy-trunk
+22165 4789c12a89f1bf44323bb07f3d89b8dafcaf46e9 legacy-trunk
+22166 cf9254210015db6f96641fbbc9ba2e469a1dbc9f legacy-trunk
+22167 9aa5d66cd13dcfa3d22e5db6d80880b2263a4ad4 legacy-trunk
+22168 eed8a8a8f622c8d99d39cc8826a014c6140b9f17 legacy-trunk
+22169 d7590122f9a2613731133a3b62e6d4f6d09c48b5 legacy-trunk
+22170 9313b48f11c3f8c67bd27285f9051107f8555269 legacy-trunk
+22171 919e60d773342ca4aaba391a499e55c6292c21f8 legacy-trunk
+22172 f946b7f7d8318ef304d3f565e52d9db2987c0b9b legacy-trunk
+22173 ed62ad30834eb0b53558da711adf521766291632 legacy-trunk
+22174 1ae718976ac6dc118eb24bf3477de4ab2ad285b5 legacy-trunk
+22175 0c307fa344b5ca63563191a468687db2372cdfe1 legacy-trunk
+22176 b00e7b38f77f2751f4d750a726c9d8dceb3ca931 legacy-trunk
+22177 bd972fa841c5feb6acd47405a68644945483df00 legacy-trunk
+22178 9c3d5395e3fd9309392bc6fd3b3f2eb1d3a39425 legacy-trunk
+22179 d144c81eaf44680f95076c825305dce2ac19eb95 legacy-trunk
+22180 dc4be7bd67461041e00168c254262354e4f9e19a legacy-trunk
+22181 651e6394208c8d91d832bcb5ea88cfb8e8aef13b legacy-trunk
+22182 1e686b0898a2f6873ef3e1bb9fe6310e333769eb legacy-trunk
+22183 471a9018129c3fd19191d677ef7509507d9386f0 legacy-trunk
+22184 f1cf2a4441749fb2002329eadfc71ba028dc944c legacy-trunk
+22185 34284216201bea9935b41823c1e9d1935eab6c0c legacy-trunk
+22186 3dd8e64f512e84afc4c388bf4654b87b4cfb7719 legacy-trunk
+22187 9e4c12673fab44fbe526edbc6bbce092d4c9be03 legacy-trunk
+22188 dac9cca490121c1ab60a51bafcaf72b0d7d809dd legacy-trunk
+22189 8b9d87af61ebdbf6953bfa0a8ae5ec43452a93bf legacy-trunk
+22190 113f0b5744c40c91f09051045f4112a60f49d217 legacy-trunk
+22191 00935031b373c549086e2d036dc7637dfd48cf85 legacy-trunk
+22192 ba9e4f55133f93be36412b1c396abddc2efcc9f7 legacy-trunk
+22193 9f78759a51b0f73c838f86c535090b2f80fadd28 legacy-trunk
+22194 4f4d8303de60cf6c06fde4f8982d7b5e2ea321b1 legacy-trunk
+22195 08cd81cdffa9dd2f4d6693928e367f76d08c385a legacy-trunk
+22196 accf1925431c770e831f16b574d5dde7bb1ecb5b legacy-trunk
+22197 2b11d166b07b71a0c50745639f9e9ef2fd873291 legacy-trunk
+22198 360cece7612355e3fae4bf4ac28bb6d11a220eab legacy-trunk
+22199 7fa1f87ca6b2d3f62ab8a878cfd1d4200ad81663 legacy-trunk
+22200 b0aaf780bca66c7df41c8ed79233922aba86576c legacy-trunk
+22201 114a90a43db7e9e807bfd4152481fcf864b316ce legacy-trunk
+22202 805090ce328a0017c8ee092970c791ae24fa2ca4 legacy-trunk
+22203 9059e7c1d8b018b7d1715f7e5d821f5661edb4c5 legacy-trunk
+22204 9fc4a5abb36943aff3e334fc7bc9c7c477d1e8bb legacy-trunk
+22205 ae43f99b47e1e2766bd29886753ceecaf2f66d24 legacy-trunk
+22206 a2b3587f592a8f5dde9de7c64d1bc173d590c49c legacy-trunk
+22207 8ea60e2b0f219e4233bfba5bea168140e10857d8 legacy-trunk
+22208 28f0ea8d62781b4ac2c54e8fbaace49f0077bb30 legacy-trunk
+22209 2ae37cfb189f9e9ab48b2253f5ed94c69264c820 legacy-trunk
+22210 19a3c6af4374464e0172c16d6495a4edac6c98ba legacy-trunk
+22211 b16f8d01c51e3a33a8358165e5fae42dd56c48d4 legacy-trunk
+22212 c942a9821d0997386b4e4a5c69d9fddffee34002 legacy-trunk
+22213 81114209ee8eee89a639628dd59159673a88c752 legacy-trunk
+22214 cefdcd60a8b2b01644cec7df62e4e1413ddbe19e legacy-trunk
+22215 f5b7a1ec4b9f2b1d467d51649a819ac5095f2e6b legacy-trunk
+22216 1bc67cf57d0ab6a6b731638806d6d93b06a15ad8 legacy-trunk
+22217 fe20d1cfec3d9a3c39e1fb1e08d6bfcce54f73a6 legacy-trunk
+22218 c1daa94c21d830e32e8ac185f59da3ca38c531c8 legacy-trunk
+22219 bb85ccbd4fee5543de92ef8aebd9f9f474c71c07 legacy-trunk
+22220 7d27e388ec6c9ed023515986a8a186d52d36ca82 legacy-trunk
+22221 ec676e14073d7fcfa521cd881bfd458e77169e27 legacy-trunk
+22222 50da637341ae522fba2acb525aec01f0d53eee36 legacy-trunk
+22223 03849946672728f1a7c2ab07da2f02e5bd61e9a5 legacy-trunk
+22224 078c1961e17514600d65fa8c5212c64ab184d0a5 legacy-trunk
+22225 821e35706c07159f5b112231be8b3747d1c6b771 legacy-trunk
+22226 30ae3aff03bd984899f5a710295e43c9d51fb78e legacy-trunk
+22227 600ac5dbc6664f54b63156327204b9646fee0006 legacy-trunk
+22228 e5754f048f0bc35fbc00e45ff5142f2d333b4d47 legacy-trunk
+22229 bad408c7d9d785406cd5a9b68326bf923d380706 legacy-trunk
+22230 7b1a0804161eed87245dbeefbcb1818778369003 legacy-trunk
+22231 0ab8f937ff665b858dadbb9729971349b4dd9a89 legacy-trunk
+22232 23876e2d84b6f1e51225010ee5f3565c329b12c9 legacy-trunk
+22233 60a75002a74cfd02b57b79db1bd31fbdecaf8d0b legacy-trunk
+22234 98315f0e1d26d7427f67b601e65e48d2ee2a19b0 legacy-trunk
+22235 6b8b65fccb03d9f1fc836b1fa18196f58e9e699a legacy-trunk
+22236 263dcaf00eedce0cf2b6cb4d1925ddcc081937bf legacy-trunk
+22237 e4b6705dc84f90dd1850052587af843e6957d56c legacy-trunk
+22238 9e578fcb8ddab73fd130cc2ae209767b79ad9d0b legacy-trunk
+22239 d3268d62e46221d26ddf8d977c812a9d10054c58 legacy-trunk
+22240 d915a0edb2ea3111d736ad20daa7c321d1388eae legacy-trunk
+22241 b15307d29be7bc4fdec883642b1be4ff326005e3 legacy-trunk
+22242 c1729cdc07340ce620d4be8de72d280fa7afbd38 legacy-trunk
+22243 3a7d67ee10113e8fb256dc47191d4eb2727843c9 legacy-trunk
+22244 803a7a1448b2d1fafa154007932de8507670a73f legacy-trunk
+22245 2d0a04e27581e8adbdcf1a049e503c0af45928c5 legacy-trunk
+22246 f66ccf2c63eb3a93e02adfc90bbc448e8772cde5 legacy-trunk
+22247 4df72ea78ae806280c2e7c76924ffc4d211d3cdc legacy-trunk
+22248 9a88e50bf11456e18e5e0040ddbc0dcbb09da20c legacy-trunk
+22249 ad2b80755d2d4c6bdbe470bf987d2a6a2a7b5bfa legacy-trunk
+22250 8d47a21d95e04207cc74b9548ef20839ef33e37d legacy-trunk
+22251 8e60f30037a1fcf98d856a23a5e18fb281e64d41 legacy-trunk
+22252 745774dbed58e75f8bad622affb8467cbf5878e4 legacy-trunk
+22253 7db5b5423ccf9903dc1b2fd3f5c831676fb37dcc legacy-trunk
+22254 35050d188a6ac1c1c49fd7f9c47954c7ffe9944e legacy-trunk
+22255 e282d6b2b758e64f34d25227cc54951d7c2eb895 legacy-trunk
+22256 28b643bad74d2b68507ec3ea66b2cf37438223c1 legacy-trunk
+22257 0c5e51694b0f7ef4dff6407a316d5a29ec58368d legacy-trunk
+22258 f20727cc3d0f2f3bf124dae188f0b9ac5f239178 legacy-trunk
+22259 3969fcbf950086f4e672e08f7a516fbe5a64bffa legacy-trunk
+22260 2bb242dc69d8e49a76dbc014a0adb27efd62c165 legacy-trunk
+22261 11bba30e9c2840e0431e45f76b3d7b1b53f086a4 legacy-trunk
+22262 c90f0036109d4baa71ac621f0b7e1081042a8a53 legacy-trunk
+22263 a3077f96d478959f2d14e5cfc91c0bbb2817c648 legacy-trunk
+22264 65fe6b07247b00707b5c894a47a87298d2830a07 legacy-trunk
+22265 f9494135b579095d0bcbd2ed7b866ad1c97e4359 legacy-trunk
+22266 c979625feb496891e54297ff6699724051bc5361 legacy-trunk
+22267 8bd06e3249bb5e0c1b98a084aeb8b18f4426676d legacy-trunk
+22268 f51b13bf5d54f9f2a8e0daa40ea4e0d9ba43fcbe legacy-trunk
+22269 e426230ea5731c9f1611562a2e9f9f1eeddbcd5c legacy-trunk
+22270 9cc67aafec6c188002bf94dade988793e7da361c legacy-trunk
+22271 e57a4614469e6f4cb037bcc997c1948626568c7b legacy-trunk
+22272 ab2f8095c4fcc6d02b83a49a9bb551c92cec4985 legacy-trunk
+22273 a1b4f3a1ee079655cbeb5cba9384cbe058416279 legacy-trunk
+22274 d79865c0f804589d8b7ba1ccfd325e0e0b8a3c99 legacy-trunk
+22275 d00802c74ba4dc4190241e3044fd05b9829535e1 legacy-trunk
+22276 b62c80d58d1ec3be5d07777b45e3e86aef77a894 legacy-trunk
+22277 39a73c6773f12ed99bbb0db6e918c819f7b70e7b legacy-trunk
+22278 764923d985a76814e4a7c92be94d7fcd3e3d4ff3 legacy-trunk
+22279 310a9170aad476dae12d6c498f03de5ea46d434e legacy-trunk
+22280 efddcf719ff2efc72a25fd714d7d5318c1af9074 legacy-trunk
+22281 94ca8eba7e4f097ba1620d245ee688f362d00744 legacy-trunk
+22282 e2e589fead30f1ad8fe74c217d035bd796dc6085 legacy-trunk
+22283 f75125ead0a23b9634806aac1e86bc5b60c905c0 legacy-trunk
+22284 c3e8f47fe7c84df55c6c73327335e085cd3446c0 legacy-trunk
+22285 0a9ce81de399916a71cacc4b99c336d0ae5a5fc5 legacy-trunk
+22286 cb8fdce9e65a6d29c999a56b3e18eb8d3b1d3bec legacy-trunk
+22287 27b4dbd428fe7d5b0066e9bccf8e7fc195ec320b legacy-trunk
+22288 36ca376e586465ede088f876115cd041cda1dacc legacy-trunk
+22289 88d124c7476606f6d2c3220fbc5180eacc69399f legacy-trunk
+22290 5c27f0e4f50f736ef85e6167a7e71c009ee4b14c legacy-trunk
+22291 9f785073e48bdf3c49df43a2bcda746a034eea50 legacy-trunk
+22292 6e958d5e988bd05c346c7352d5307d938d008ae9 legacy-trunk
+22293 f3e278bc439e2708a1ad07422c9c20c602e4e9f0 legacy-trunk
+22294 96ebf2b886f76829b4f979a9763a81ccababc342 legacy-trunk
+22295 1960ceec1a00ba5623914a0af430ce23c0f886d6 legacy-trunk
+22296 c4b31be7e080b95bc96ee1b19a9a0ed8548e474d legacy-trunk
+22297 e411bfb9db5764abb45e375ea835774fb432deef legacy-trunk
+22298 6faed615b058dfc02a29a65b30be1ad4edb8d736 legacy-trunk
+22299 e79fd3934f61027ff04493aea9d5d75b8fa6abca legacy-trunk
+22300 97de868ad0f402843c56c1156789fb1f06e4d394 legacy-trunk
+22301 8ebf71e1ed298ea921b6821cab65e982c26c9832 legacy-trunk
+22302 11a9767e5d8a53f25e4c1557bc8a317768f0b325 legacy-trunk
+22303 45ccf3b889b50368dd015fa90aac777903b20d49 legacy-trunk
+22304 9e6f7804ef145dd8c37563f57b33a6281479c266 legacy-trunk
+22305 c95f0a12b51a59d06a751bf7609d0a07e0f76c41 legacy-trunk
+22306 de5d7a9428ef90cb7f394aa5166531b1b348e18f legacy-trunk
+22307 c238745e0aae6c066ce2208395229fa77f827c69 legacy-trunk
+22308 6350bbaa632a755d839c3d66ca0d844ff105df9e legacy-trunk
+22309 9ec5611cfe9c03303432ba7590c9a13d1ffd2e05 legacy-trunk
+22310 3420c9e6af1129e5ba64580f7cd719b16464a09a legacy-trunk
+22311 875ac8e935424bd6b035328414b172dcbbf881a8 legacy-trunk
+22312 eea8dfbbee860290f7831fb9e2a7e7e6b4076840 legacy-trunk
+22313 10ec3968428dc83c85c211df6003adc84a8281c6 legacy-trunk
+22314 131a01b6f6c714e5918beee5d50a88c06d726864 legacy-trunk
+22315 b7984c9bbf2cde038b43a006a5c570bc0aa757aa legacy-trunk
+22316 373cc59415900b44b59be2736ca07453f0ce341b legacy-trunk
+22317 0201bb5e3b836b37b6fa5cc4b7cfcccfabca28df legacy-trunk
+22318 6ba4415072204a61bc27b18e29cceb700b944cb9 legacy-trunk
+22319 b55478bd9165c4fe39f42662f7f8428ea19ea48c legacy-trunk
+22320 b355376d0731278aec5fad1e93992ba87897d932 legacy-trunk
+22321 7826cc37a234b8b10bfa5e5ad85978f63c39916a legacy-trunk
+22322 17525b6c532c5924e61f82c1c3714c5971be978a legacy-trunk
+22323 13d0f34b6a160999fec11bf7519f896400777042 legacy-trunk
+22324 8cbf984c9c13f475a6c08f0a7964f804c58945bf legacy-trunk
+22325 91299418b72dc9a8bfcb2e612612b2e70515299c legacy-trunk
+22326 600a9a2b7a183130f0b64fde2c0f12eccabe8d6c legacy-trunk
+22327 95515c6b694ab5cfaddc65e4e532287c2800dd58 release21-maint
+22328 77e405f3a942a917ff1e458c61073ab1f8e981f9 legacy-trunk
+22329 6729bf30d3ae5b18df656526e514034e8244a7ff legacy-trunk
+22330 e0847ba1d6f4eb06a3e8681474f4aa81d8c4348f legacy-trunk
+22331 af482055d5ce490a0dccbdf6bcd53100c660e473 legacy-trunk
+22332 f8b51c8ca0826318c6f287a03aeebae584dc9789 legacy-trunk
+22333 67be3a68fde492414ba22372ef433508ea93945f legacy-trunk
+22334 78752eae132e1b2ca9d1731aaf9c75e3201f1a0c legacy-trunk
+22335 4901a935490dd86bb4072eafd14961a56171676f legacy-trunk
+22336 c3959f6e404478bd56339a3e16c031a62a0216fd legacy-trunk
+22337 957dd646b5b7434fd89a306174077b312b6522bd legacy-trunk
+22338 67698d68920320fa8e21aee3efefb014a6b82a3f legacy-trunk
+22339 40a17d9500a8b6ee7f294f63b246cd32baa7c528 legacy-trunk
+22340 98bba983bfd37cff99092db70249f4894a5c3ba6 legacy-trunk
+22341 d98121930e7061f4cbf7252f07f7c40ad5a4728d legacy-trunk
+22342 3f8a56f52cd61bba55c980ebd94c5e91479bb030 legacy-trunk
+22343 6463cd9db2fceecf58c2e68d439593208d5de015 legacy-trunk
+22344 fb12ea9290b2d2172916aa35c32a731c1f902e05 legacy-trunk
+22345 815e78125357af798d5828555e5190e56e22250c legacy-trunk
+22346 4a8ab67773a9c6c53a5305cdd618b706b50e63b8 legacy-trunk
+22347 8c378f9086cd73b54bfbb21bbde066802c03cd3c legacy-trunk
+22348 e001a9cde6baf6c8acdb6e5a2de937ded9d8bf65 legacy-trunk
+22349 2d67d238d4e918babec1b34a260ec115ac2d3d35 legacy-trunk
+22350 85292d959e1b877e957839eb5165fec33b73dd0a legacy-trunk
+22351 08cfd8e99806628419923cbdbbe0d8793da0134a legacy-trunk
+22352 f0d52a8fde5fe8d99389d15b1f51e55bb45a2f1f legacy-trunk
+22353 edf8d2d1a90b69893d5ae6b58e043f8baa8c39de legacy-trunk
+22354 2f3b18309cce678c46fcdecb668454c564f02b13 legacy-trunk
+22355 809aec64a78eba2f81029c2ab4e929a78acb1d80 legacy-trunk
+22356 481b81d300df82e94e980f45bc11396dfc558c9b legacy-trunk
+22357 3f34f724f01489bcbd6193e88ad0665a03cdaf83 legacy-trunk
+22358 cd44254360b6ea94c7f4d17dc2226ecef1bf5e51 legacy-trunk
+22359 1e6f4bb65069d23e24c6003bd60af6b96b6b91e1 legacy-trunk
+22360 64d4ad73a8875e0e8182130d40ad09ccbe796bcf legacy-trunk
+22361 7a1ef675d8acf044ad01ca408bc77baa05ce4093 legacy-trunk
+22362 2f41c952beb058ed38f6933febf5a013d0470a42 legacy-trunk
+22363 776628eea8f7367460fad09d53add4c695f78556 legacy-trunk
+22364 b7658e665d2ec7a39874d8ffc77ba13a1891f0a3 legacy-trunk
+22365 97a3d3d7029f8fb26b24450dedc547fae19e4572 legacy-trunk
+22366 3537062b3dc1be081d4b8e4682714e4d5c1fa8ff legacy-trunk
+22367 9d024ae05837c94be8653ecd123e869c64b8a54c legacy-trunk
+22368 d64e059cd199da38ea12f6437a4c20dca8b151dd legacy-trunk
+22369 b06d9dbdaf8fbe75bb31318cb5340af99041bac8 legacy-trunk
+22370 b160fa63f40c57a441368404f51b5ed1b03b9a11 legacy-trunk
+22371 5d6b2c17ea2cd7a8718120068f365c699cdc8513 legacy-trunk
+22372 039e3d26ea35ca61338aa2510969de8639fe6709 legacy-trunk
+22373 67f354d4347d58228236b6aa8df5f5ebac088e98 legacy-trunk
+22374 30860be3ae7be9f4ddf5f17c60b7dae52b4754b1 legacy-trunk
+22375 802c4f940a4ea31a099361b3a6c003c249a1a23e legacy-trunk
+22376 9661093d3e2affc3f76930370fec5291da779550 legacy-trunk
+22377 81f4cdf8685572262b2b981e9d5c5559ad977efc legacy-trunk
+22378 2f6593bf58afbf93fda46d6b5045a06740d78364 legacy-trunk
+22379 cb346baedad6c4a418bcbcd8062140a5b1a5e94e legacy-trunk
+22380 f0db345621ba7efcaf2d02753c1144b8295b7b68 legacy-trunk
+22381 704ad834de27696be5a50e91eddbe687305b9b54 release21-maint
+22382 b0002d7c22b1f0cdca96ea5511825fb003dbd122 legacy-trunk
+22383 fff6c662859d9c0a09b881a7dbc03b1615eb294f legacy-trunk
+22384 50f88ee71d45a3d7f28072069bb418d3736da28e legacy-trunk
+22385 ca12e1e333ea1040360289139ee37b885c48d246 legacy-trunk
+22386 6370a0f988f0d3f65a2179c9af69f6e916abc239 legacy-trunk
+22387 fde3b0f72e38902eece578cd8a4355e13e47560d legacy-trunk
+22388 1d462b737810dc820d997f2e813463b15ebbc552 legacy-trunk
+22389 fc39c22b5a7ad15b4748ec5e10078eda4d96cc7c legacy-trunk
+22390 b14951cd25673a60166c70e8a4914756e1a16c1d legacy-trunk
+22392 2967ca96d07ee7ee0997bb680839155746c5c9f4 legacy-trunk
+22393 78d00f7023a216f1b775821368bfe1f0a1f6daa0 legacy-trunk
+22394 cdd0c7a45575a2911f95b90ccf39b4fff9dec9c2 legacy-trunk
+22395 30f8b654c2e5bff3cdaf12a9b18101cd5df5c016 legacy-trunk
+22396 bcfe30cd1f0de16c9ed9582c4c8707db84e884ef legacy-trunk
+22397 115e4099f3d979fb0deb44c9b6b3b396fff210d7 legacy-trunk
+22398 bee7557213b22993296463d88903239e2c96c7f9 legacy-trunk
+22399 a97c8064c9d83a4158a7ae692ed988b1f371353b legacy-trunk
+22400 680232fb61f30207f1dc7ffd274f8d469aa59fcf legacy-trunk
+22401 095c89a825a90a1bf97d88115b055660813b7ac5 legacy-trunk
+22402 7e9f5c59e9f27f0264da26570474f9ad35af4eee legacy-trunk
+22403 7e44873daf7bdc37ba1efc93b1f223189dbdc1d7 legacy-trunk
+22404 301bcb01b50345f1ad603749df86b78ad94fca2e legacy-trunk
+22405 01a9b7807160b18108a38942b7f31203fb68f7cc legacy-trunk
+22406 3c1c9948ff6557cedc0cc42f4cb288b5dc906bf6 legacy-trunk
+22407 3837dccd11cad3527500da124aff380a84757c85 legacy-trunk
+22408 50fb4683a46186379fd57b318dcce7433d310efb legacy-trunk
+22409 2c4c2caabcfcd93b34bf239cd2eb73fde3418e8f legacy-trunk
+22410 47a45da03b09ac8125fc5075ce27995309277a42 legacy-trunk
+22411 cd1310e87fe2155f343c5a578938baa885f678cf legacy-trunk
+22412 67dcf04fa7541854c5aaae818f96df66677708fc legacy-trunk
+22413 acc0ffab0771c9037438dfbe9547983d5d074589 legacy-trunk
+22414 de1c2d4d72ba177a2a8fe3a06dff4932134da043 legacy-trunk
+22415 fb153e306152886e340d5bd1daa475e445ec3709 legacy-trunk
+22416 7b53fb3ba01192bea049311356a40cdfa006b74b legacy-trunk
+22417 8691484c5bef533dda04cadbfd55522d2181f3ed legacy-trunk
+22418 b484b207e96419e80c5b3c462db16495305436c0 legacy-trunk
+22419 4dd38d9301573c90ccd94e8852fb2f8d03c563f3 legacy-trunk
+22420 c9a4e6d1bc30b198ebffaf11047b2724e3c853e4 legacy-trunk
+22421 c0a16b4c9edb7e1a09bb6a331a56dcb6a8ee7199 legacy-trunk
+22422 d37e17658048dab8ed3e980e08c0b8b7906d025e legacy-trunk
+22423 f513c6c7d1670bcced5963a125bc8a1730c11579 legacy-trunk
+22424 e8be40c75a3f717c7e55c4c81dcfa8cce39200b9 legacy-trunk
+22425 77640c38847ba257b39a98bc015c8b5a1a29cc30 legacy-trunk
+22426 d16a3a5c8a86b130b29d2ca10a2edf1d7fcb57a8 legacy-trunk
+22427 373b6abadc500fcc8cfcc66136f624fb11882c7e legacy-trunk
+22428 242ac427f0d0f0d3d6f917bbe0953fd81a3a7753 legacy-trunk
+22429 3c7ad5037ab1bc5a223a946c9d39111e2524b38a legacy-trunk
+22430 41785793a8a375e0be1ff8afc00f439fbd9f83ca legacy-trunk
+22431 cd1c2787ebb4a930194b2a4c3dac8a6002373758 legacy-trunk
+22432 6e46c7cd37490e1414490d30a420ad8857025e55 legacy-trunk
+22433 71f05fd30e73d5cb782754365cc4ee94634dd78a legacy-trunk
+22434 255926698692d46c91a10fa40d70d1c058f5a5c7 legacy-trunk
+22435 84b60213159b0223680925ad3a936911dff08fe6 legacy-trunk
+22436 0f612d687ebcd77474ed91321b79bc171ba01e5d legacy-trunk
+22437 53f3995987999ec3f6126a459c7b2226d2e8c146 legacy-trunk
+22438 acb18c9fb20f6a51908ab1de3ccd156115b52231 legacy-trunk
+22439 e29ba8f1e7f80a2e6225ec5283347f5340359a8a legacy-trunk
+22440 65885ea76c37716418dd12d6cadde90e1f941da1 legacy-trunk
+22441 cb7fb565c89b94fc831f49d33ad3e8002cb357dc legacy-trunk
+22442 c3363e4d6d1d60ad4aeea2acbfe6362395a7ad2d legacy-trunk
+22443 c6129428e053ccad01bd7e61cdfbfcd5c8ffdb43 legacy-trunk
+22444 38b5906ff031d3cf93c1268d5d0951124d081bd8 legacy-trunk
+22445 e110cd4fc3c6250d160df362653e7598d8726294 legacy-trunk
+22446 5b87ee44000baa06b85b493b38ed9557b62c46de legacy-trunk
+22447 a08d0e5861ccf258ab3d48f9556363d3f0955d31 legacy-trunk
+22448 ac6d9c742864325316d8f68f80ddeb83fe5ac600 legacy-trunk
+22449 d3dd0f2fb1f441a8654fbc7f9431a4ea1d843cb0 legacy-trunk
+22450 d99c1240d0ac3ee99b4ec436d0f5c86fc65e16f9 legacy-trunk
+22451 788a16351e18943886952f6fe58ef4b516841498 legacy-trunk
+22452 fbe2074c5fa5a2191423e94891bd538b442c4ea7 legacy-trunk
+22453 3b98cf1692d4155cf92fcd1594a5b43963f5e5fc legacy-trunk
+22454 be024c274e02cf9a27c43ff485a8686afc84cfac legacy-trunk
+22455 388bcdee5129a3dfadc5d05601546959428fad77 legacy-trunk
+22456 9f80c70a7a51ebf701232658fbed9553b9a6f1bf legacy-trunk
+22457 06f9027141ff9ab92280db23393ae2f7447a40a9 legacy-trunk
+22458 2ff5702adb56dab8429c030c6403fb3725d8b3d9 legacy-trunk
+22459 3956b22d5e2934f62ebd71e34d441a75702ff5d8 legacy-trunk
+22460 fbf1ae7693066015cffd539bb969b48cff6fdee0 legacy-trunk
+22461 968d169501f2766abd0b2e5136aa2ccda7cc1b65 legacy-trunk
+22462 6617030c51e3ad85030c7de1d5327544c5df67ce legacy-trunk
+22463 af1c689324f5316af65e15057aac5dfece656ad1 legacy-trunk
+22464 fedba86865e294c94b0fc9ce5c8640e0d4aa1856 legacy-trunk
+22465 1c39b96d29c325fad11529578d50cdad9213e2da legacy-trunk
+22466 14f782ba40f912f7588c608e63bd925cee795010 legacy-trunk
+22467 04643a184546a1167f9fbfcfe946dd200e8dc22c legacy-trunk
+22468 49fd724351f4a854b7b22b2f25e25a8c15cce214 legacy-trunk
+22469 ca7dbacbbe1866b6da74d707bd590c7b7b513552 legacy-trunk
+22470 c3c87ce4afdca6b378beb3d1bfc40848df00e78f legacy-trunk
+22471 7861ee951a91c4e9f5ff71402c24c2ee4dcd2446 legacy-trunk
+22472 eb5e2b68354f5debf23d3020f8aec2434e70dd92 legacy-trunk
+22473 bd8cb665b5e108b2f94cf04d48c5ef6f2734304c legacy-trunk
+22474 e9a97b02889b080f83c9df4939e74ce99c81db4d legacy-trunk
+22475 a9ff0f6ff260ea41361199ab8d692b64ec834b76 legacy-trunk
+22476 dd82cd486d8a1d19a2478cf01c0dc70a857f169c legacy-trunk
+22477 35c65d9aa86a26f879bbef60f8d7c9d9186fc131 legacy-trunk
+22478 b65312238c0b664aad32dec8eaf87efb2752a2e9 legacy-trunk
+22479 1ce5a90fb192b846982cfaf27458209ab88cead1 legacy-trunk
+22480 d899bfbffbba1794757cf0176f3d5523f631387d legacy-trunk
+22481 c34bbf17385e4d4d0c85c4643763acc34d28f7fa legacy-trunk
+22482 5501958edc361d14c81e0dd720328e5b4ed66df6 legacy-trunk
+22483 4c8d7868a8e76100353c4a6730d5cd5203c53f12 legacy-trunk
+22484 9fb49ce240d19ebe4ecd91ca0ee0d612e2c6a32c legacy-trunk
+22485 b9502d1a27a7a5978a8bacf71cadede2e39e48ed legacy-trunk
+22486 1afc3116c60235ba30de92ffdde426f3d5dfd8e4 legacy-trunk
+22487 1ba9e3684d35482b73a374ff5742b564ce36ddfb legacy-trunk
+22488 f10b68eceefc1aafe2945eeb9f31e33c538a689a legacy-trunk
+22489 be85f686ad97bbbe20fc4e05ebcf3b26e603e0d4 legacy-trunk
+22490 6f6acbf7893943f834b5c423c9e39081b20f7917 legacy-trunk
+22491 b865cd5c1925036daeab3d8b2adfc3b6a35e50c6 legacy-trunk
+22492 a5a932c215830e095057d6c26659ecf2273e51df legacy-trunk
+22493 ba8c62e5f92d69dfa31cbeb02d8ffc5d6b64ac90 legacy-trunk
+22494 14e6051d5f1f07a8b440a27cc053ce834ac0a4bc legacy-trunk
+22495 3aa060644903166e91d75ac7a1243aa41f8e8949 legacy-trunk
+22496 5ad71fdb205b3567ab2b0b0774cca6bff19a22f9 legacy-trunk
+22497 5c2bf6cde12303b1c2ac223a9b27a27f062a8dd7 legacy-trunk
+22498 f7a2130a256367744de73843ddf6928d7f958708 legacy-trunk
+22499 37558e865ead54c279c96157dda557b256c47baa legacy-trunk
+22500 c3d53d34ab44debc694b30b36de3eb96d05dd8c2 legacy-trunk
+22501 1e87db0ca2482e1c8e53136c7c69722e870421bc legacy-trunk
+22502 1456ec7350872d67a952b952f0e594d267695dc2 legacy-trunk
+22503 157bbb896198b98c1ff9c9a3531cb56830464a79 legacy-trunk
+22504 1069090b124ef87f3e5cd3f37e8799c57698f055 legacy-trunk
+22505 3ddb210932ca6dd1c8c34f6523ae22e1c78009f2 legacy-trunk
+22506 6c4a8730663ade0e8e3847e98995ed019932a1c5 legacy-trunk
+22507 6303026664662b9fd0b943e7f5e8783c8767b191 legacy-trunk
+22508 81440dd326bbe1752eafd10685de85f229eb909d legacy-trunk
+22509 b9701538f8276a694c5fab5a7c5f6cd9df584276 legacy-trunk
+22510 ed9abab971078cdafb11d8bce8fb712c469aa72b legacy-trunk
+22511 cea945764db219fd94b6699bc862d7a26e324608 legacy-trunk
+22512 11903eb009f67021c9bd6439f5a5466e1c86deac legacy-trunk
+22513 fa786f8a7570a5b3c26289b023e8aaf52b180cac legacy-trunk
+22514 a7bbac69c8ef2266067e6918ceec1fe2be5c26f5 legacy-trunk
+22515 b0d2de8ce24f4c257334cbd66c2657241183de87 legacy-trunk
+22516 af0018bb8cfc319ecbb9613232775aa17a6b2026 legacy-trunk
+22517 0c2b4391df7dd0c4e5adefb47a5b360976809111 legacy-trunk
+22518 6cb9f538dce4987d0f2bdad336dcfb89d33461d9 legacy-trunk
+22519 fc761731218283f7b1b6e17658927c809b66175e legacy-trunk
+22520 a63a6933554f950d82e3914bf2fbb496e4d008d0 legacy-trunk
+22521 6f62f5a62a2c6bd06a91ed74aa939090ddbbf022 legacy-trunk
+22522 2d88dea464177ca57c272ddef3c64a1068dbc3e3 legacy-trunk
+22523 1f4eb8c925d518e59bca8026a4242ba41ee44a54 legacy-trunk
+22524 f7dc21cb1661dc378b239345d8d21bc45b383310 legacy-trunk
+22525 3ea2909e051ffb667718d51476e3c7b839859e33 legacy-trunk
+22526 cbaa545c788daa97921046068154f2b7fbb8187a legacy-trunk
+22527 d370a58fb7fd8f3dd0592fada4ad346033a7e78d legacy-trunk
+22528 7957b3f5d462d7dd015a30acfe357346b6ac97bb legacy-trunk
+22529 42246b8c58bba8960b3cb7442d072d804567d861 legacy-trunk
+22530 1fec0301234678954c03c2d6835f7a62da62e97c legacy-trunk
+22531 261e28e7fa01faa125e34bb2b47c0d29f9d640f0 legacy-trunk
+22532 b525e602f6c2a42859649cdc97418f3f2f6ee24b legacy-trunk
+22533 db488cc9f259886e66e71d851ee63c3982760b9f legacy-trunk
+22534 efdcf42f885272ebdd8a91a2bfb078572886b955 legacy-trunk
+22535 73f685db8c0c79297f8b75f2ca242c6529ffdb22 legacy-trunk
+22536 b41638a11e4e439efdbefb005aacf5d28ee287a8 legacy-trunk
+22537 f93c16c10a55c0e9dda3730bdca3aa06a2cb8131 legacy-trunk
+22538 ea9cfc38e11bd80e187cd91326ad3134910a70f2 legacy-trunk
+22539 ba87c244fb59be654b7fbaded71667a1c079ea33 legacy-trunk
+22540 0613fa57ae6d9c7354fef84b5e2568002cf06aca legacy-trunk
+22541 05c9a35f214f28b49f575fed7ce0d730234b60c1 legacy-trunk
+22542 60264d1e100e9d64e921f44b926edffc44304958 legacy-trunk
+22543 d6b084c25ba8bd1174f0f42b9e2908e92e52bbe7 legacy-trunk
+22544 ebfb74ce7e5681347749212b275800b1877cd463 legacy-trunk
+22545 b1112a2c354ff3b4d5f490368a3dda94ae473846 legacy-trunk
+22546 786aced937c5389b1c5f9185117c1ef1a9ef90ab legacy-trunk
+22547 6130deeb4cc615b4c02c0e651e4b08fc3f6e05ef legacy-trunk
+22548 86cd57f9db9b96f0ed6cf959963fb3d0e13e284d legacy-trunk
+22549 d46682bda82ff5cd802a61adf493218b13de27ac legacy-trunk
+22550 8144722dc0765ef92a3f07fee76bb94cb60c267d legacy-trunk
+22551 7257e87e072016a37800e16cc769761702ad029f legacy-trunk
+22552 db9762529f454666642b0e049741fedcaf00da3d legacy-trunk
+22553 38be177bd493a08f12574c209eab51c2bda1ed40 legacy-trunk
+22554 a48a3d75475ecf2f035d5c40499a285e4553462e legacy-trunk
+22555 3d97a4b5c6aa5e473a9088d86afd93c2185e958a legacy-trunk
+22556 13f4ba055687f47e718925428722cdd6dac7766c legacy-trunk
+22557 9b5a2c1a02f3c0b9d578646e211c5ee2b815f2ad legacy-trunk
+22558 5b6a6d7d44aed2b201b7e4254a6c01c20b887a5d legacy-trunk
+22559 f920ddb77d8b3f8407a9a9d9d8b366a1cd587436 legacy-trunk
+22560 94905eb72f4fcb5b2358991df7bb297e2dd18fda legacy-trunk
+22561 051d8e380f382fed1a46fdc1ed2aa74ee4f71ea3 legacy-trunk
+22562 e93f5c385ff4434c34b10887a308f3b25b89b18a legacy-trunk
+22563 d5acff178ad5e6643fee2e21676a76e7f311fcd1 legacy-trunk
+22564 c0ee10e0e13e35e542828f04bd5087d2060f6456 legacy-trunk
+22565 be9b50704e4c0a803149c580c41e0ffb787f480b legacy-trunk
+22566 0dad0dc7149b2b7c1db07d2de7d3c33fcd3bad7c legacy-trunk
+22567 eff8ca679bf6aeca673d0ae45ccd8b6a22f99276 legacy-trunk
+22568 ea131ff1d8cd82f999089831def1baf08582306a legacy-trunk
+22569 9222b6e3b3687ef02925c2268ab854276c1de1d7 legacy-trunk
+22570 78dacb543887efb81b5edcd9467ba42f35810531 legacy-trunk
+22571 f199d0aa9f810f7ca5ea41b29a389bb39e17be9f legacy-trunk
+22572 b738428238f19500cb10ad50c0fe31d9d3255f37 legacy-trunk
+22573 a1adbf07565773c9710f5fee7cc549b9dc78d483 legacy-trunk
+22574 63b9b177e350fd66d53640749e26dc1e5a474c67 legacy-trunk
+22575 17802077e77cf59fd147c92b40a5f7b3a44045a8 legacy-trunk
+22576 3b3079b8572743520a77a7097f4546f87d49122b legacy-trunk
+22577 8c2a29b7548ed6242e15d35020ce2951e213fa78 legacy-trunk
+22578 bafbe5cc941ff1ac7207d57a5ff19dba61244263 legacy-trunk
+22579 2bf2690966ffd321ac653a1e1f667d63ce9a457a legacy-trunk
+22580 36fa8e9bc2da9e8254390a94d25b0e64663d9964 legacy-trunk
+22581 033462df17bf58b7b7db779d6e3c15b5061c95f3 legacy-trunk
+22582 c4b2a6b04d0b90c104304a4de1fe0bb99158404b legacy-trunk
+22584 fcab36c93327ca5a56fc0a0670baff454a222bb5 r22a2-branch
+22585 484c05dc49984177d15feddb9621f3e72d35d79c r22a2-branch
+22586 294a56bf7315f0004bfd5a1d788cbcac552466f9 r22a2-branch
+22587 fd119899045c8384cceed86360ee40e221d62b56 legacy-trunk
+22588 9e4f739e9a84868ea05f60e4e1ff811abeb39314 legacy-trunk
+22589 6386f01f240162d97a08b9ee2b867639e4f82d64 legacy-trunk
+22590 5f1e7571b129cb07b92a551e3ac860780cd7ab3b r22a2-branch
+22591 8a6cda1755eb991d243467d7d9061b944324e539 r22a2-branch
+22592 734066f2164f36e42b2651c017019f113bbade1c r22a2-branch
+22593 5c8de68b3cdcbc463daa533594b7e242b73fbf9c r22a2-branch
+22594 af058d69eaedd7922bf12bd6eb512973febc4e55 legacy-trunk
+22595 d764d55692a14f41c653ff9d7a610df1c43dbf4e r22a2-branch
+22596 479b560deca701717aa9f2209534fa9833781a3d r22a2-branch
+22597 935aa074cdb86abc91532bb56bd64b073655ee0a r22a2-branch
+22598 2a083e050617b5921d222bcba68c228b5a741150 legacy-trunk
+22599 50d3b366e8c8a90d6f30dc72e1419818a86437a7 r22a2-branch
+22600 88422081095af408ecb8868da3c8a57386a1835f r22a2-branch
+22601 e9b795d4c060cd722043d722937746296587c369 r22a2-branch
+22602 7b553b1c3e8bd14d0c8b4169c4bc236aa34ad9af legacy-trunk
+22603 60d5cbbeadc3b868f6eef5efc6befda15dc6b411 legacy-trunk
+22604 fb47db85410e49f855830087f1dcfd5fbff65e3f legacy-trunk
+22605 c2db18c070fecda16c4df45152084ddef8f0b39b legacy-trunk
+22606 5ebdc3ad88779fe8adee9d2ea7e4ade762d09bca legacy-trunk
+22607 ce6ea4449e97cb1ea299036bbb8601e2c14a9619 legacy-trunk
+22608 b9caf8cb12a2ec38f61f3a1b8bdc25305133770d legacy-trunk
+22609 b45084730916d99e0120274cae0125cde0da723c legacy-trunk
+22610 77f495e822c158201af9eabe5380fba421ce6ce2 legacy-trunk
+22611 0e7aed53b583332bdbb679ac7edddb4fe582d29d legacy-trunk
+22612 3a2fe745a0bbfaff7559c8281f45480b225ada12 legacy-trunk
+22613 b22658a468cfaad436542c01c722976386a57c0c legacy-trunk
+22614 6218499aebda2b999262416030065897c8e0d894 legacy-trunk
+22615 0f873d06ac13fbe1531738252fcbc7c6be06e5a5 legacy-trunk
+22616 fb319e9cc2adfed3fa587c201f1eaab465fa0a7a legacy-trunk
+22617 7761ac8beb819e2cabcce9ba1b3647602b7ff01a legacy-trunk
+22618 0c6c6e878388b9ac49cadbbc5348166f70ca6862 r22a2-branch
+22619 88b1ecd048fbc23c507e9092e8414679a29af9dc r22a2-branch
+22620 8bc7bca32a9568c6ac2d638312817528205a59c2 legacy-trunk
+22621 2fc102b838ed820f76816a45ffcc9191bb473f05 legacy-trunk
+22622 96263cfb2c9662999bc6aa7a243582d7eedf4054 legacy-trunk
+22623 e851e6148ad8d9e565ff38ff83548fe86231077f legacy-trunk
+22624 100dcc9e6f2f3aad900291d663077292468ed0f2 r22a2-branch
+22625 b94ce7d70cfca90655dbe6df8b6770c21d8ee6ff r22a2-branch
+22626 60c0cff5d57ecbe0e9cf1b75dccdfd38ea4dc2b3 r22a2-branch
+22627 853dbe12bbe68a662aec76b524c0b29c130e4b97 r22a2-branch
+22628 be5be989caffea046ba0e330cfc7e5856f2a16df legacy-trunk
+22629 8607bc890b1f025d2ddefc8f0cc1f314b1531c7c legacy-trunk
+22630 a038993890b23e6c32cde94580149651ffbc7796 r22a2-branch
+22631 554450409a738e21f98009370a0f80573e69754f legacy-trunk
+22632 d9ea99a6f6b446686e7c87ed610c83c0f67ba62d r22a2-branch
+22633 5bcbc590f4a71160ce861111604638027e307cc6 r22a2-branch
+22634 8996dc520b57bb724a93fbc6a1f75c6534c6a5fc r22a2-branch
+22635 ac6bfa55fcebf4b80106b5163792561c8f887db1 legacy-trunk
+22636 6125d9f92441dc32a53d6115c88291c46ec7e378 legacy-trunk
+22637 9de83dda9f09a3d16bae29a9ca43155957c5b954 legacy-trunk
+22638 9306f828fbb7734fb12d577f4f095f761095f369 legacy-trunk
+22639 01e66780af61631beb768166da5e833cff1b49b6 r22a2-branch
+22640 81c7565a56acce858e6edfceae86335c776ab34e legacy-trunk
+22641 7e5e974b3d376d4bb5efa13198abf2ac9db74577 legacy-trunk
+22642 bc9c8cebc2efc807860514a9eef0c8ce5d03bf25 legacy-trunk
+22643 c403af003884e6adb5f523d91f76fdf84e9c1ad9 legacy-trunk
+22644 0d1bbe65a1d877b857504e832b34a54ff3157729 legacy-trunk
+22645 d4ba6e2aaae34ac3e0bb0391179f47bf1ded5380 legacy-trunk
+22647 ccc4af687cac6cd218ec01395ba1ab9daad89784 legacy-trunk
+22648 5f731115e3526bda78a31acf9a9703f0360bfeb2 legacy-trunk
+22649 47633b79ec19f3ae66edddfb61cf669776032825 r22a2-branch
+22650 b2dad4d17ca9ae1dff3fb5c238f05de7398cfa2b r22a2-branch
+22651 0928cd62ddea5d20c1ac802407832cfb63d83334 legacy-trunk
+22652 a6ce2d16d739f72b24b719d8fa09529e1f71f77b legacy-trunk
+22653 0b11f09cf1e40d3cc0517c8f760492ffbe2f04a4 legacy-trunk
+22654 293a412c9fd97d9524be59ec661178c16d173c89 legacy-trunk
+22655 125785f1e12fe7b82a51882e50b659ad71786d1d legacy-trunk
+22656 811f289637ad24ef1e2f24ccdf1dc89931bff750 r22a2-branch
+22657 b159ce3315cb8da68c0bed50b8c755dd235b81ac r22a2-branch
+22658 34a74b81c9b2fa685640082b2183c0d4ef823fb3 r22a2-branch
+22659 730dcd6d590b2bbe1ca8ead2aa7bd9ebb186c180 r22a2-branch
+22660 f52fa2b703d72c6dd019f25ddf674c15ee2f733c legacy-trunk
+22661 e76f7c83eb0d5609797a648bc50da57681c37ab2 legacy-trunk
+22662 5c03584cf3cc1c65ddb196a538d700698ff61a1f legacy-trunk
+22663 2b7c0bedffdbd3942946305cf01645f5565e8e17 legacy-trunk
+22664 858628cf6e256945472acc969deb6c772977f533 r22a2-branch
+22665 17e7b1a331f35dfef02db89df489b01e41bc24e6 r22a2-branch
+22666 fa39f00dd5c333bdaccad8d7ea00eb17e948ce1a r22a2-branch
+22667 ffef4e41f06edc41fd82adc1c54524f34bcaeac9 legacy-trunk
+22668 c637f29c8198ae0372c582d026692c4deb1e70ba r22a2-branch
+22668 d7f42c9de9440d7a6a252c50f3dcb05c97ebecc4 r22a2-branch
+22670 de2fbc52c1eb9f4d819b27d2167bfd1d13277e17 legacy-trunk
+22671 75269ab26d031377b1702614c9f2e4cd09259e9c legacy-trunk
+22672 8d640445344857e48d5a34972aefbc431662d76d legacy-trunk
+22673 c72616d6143c2c897272af1080a42274416ec993 legacy-trunk
+22674 9cf66958111034be6328107fab4935de0e5f5874 legacy-trunk
+22675 500c359038c7b235f9917fa08d23982eac1a2a3b legacy-trunk
+22676 b139bdb6d48a4bcd5099cc8fe37f842aad01e911 legacy-trunk
+22677 999de54ac6a621e6e7fbf2f98959bf8a81a0986d legacy-trunk
+22678 5d81c6bff306e5af0a6580162f9eff6b5a2ca4fc legacy-trunk
+22679 c140bd7d3bdcffcefee0e899b4f99673d63af5df legacy-trunk
+22680 dad3209ce97332a9da2559e6b9f5e9109bc889bc legacy-trunk
+22681 e16ad5f7f387221bf7ee0be7cbe3fcb7667c50ad legacy-trunk
+22682 5fec1c9a21eadf4e955e02b4c68dc8b1df5881e3 legacy-trunk
+22683 7be4c73bac53e14937a4b88b8d083eeb23d954d0 legacy-trunk
+22684 de748347a40480ff424029fc78de7b2a8e866656 legacy-trunk
+22685 ca1b8cc1ba2bd65bdeec026fdc0562e7018503e0 legacy-trunk
+22686 0757098350c2857d506f4f030c974888fde6503d legacy-trunk
+22687 4d69d742db2f44bd864e08a5aca3ff731395b672 legacy-trunk
+22688 0922d609acd1252a77ea095d9c76bd247b5df6b4 legacy-trunk
+22689 71372a0f50e1b4d50d80411a7c136257bc11c3fd legacy-trunk
+22690 2aea394f47dd40e1f2c64c741a06ba1c62e1d959 legacy-trunk
+22691 f5d87c41f65b2027b6090aae57fe6130866933b2 legacy-trunk
+22692 3bfcdcaba70342544cb5c51986c3eea5efc71fa0 legacy-trunk
+22693 25d2f648338419fb5a0a93d23dca69998f3a7d73 legacy-trunk
+22694 f94c4bb7888b2c78279a31b45ce6ecd272d8e847 legacy-trunk
+22695 cee1decc4ff209a3f42ef37e5c43f4c4ae6bb780 legacy-trunk
+22696 2817f1d3adbe303f0aa054a1c8794a57e6b951d9 legacy-trunk
+22697 10b44e3b390547a176fa40ac54436841012bbeeb legacy-trunk
+22698 7fb5f15685dd06a9268ab94ed5c5e0913def427b legacy-trunk
+22699 9afd9d5fb97a0b60e6c140620936947835abaed1 legacy-trunk
+22700 25b9b634d9e3d1eaff570531195c717d39101beb legacy-trunk
+22701 3b5f34c5bc6c93a170080d5b4755b2489c4543ab legacy-trunk
+22702 6c2b7b624ef23f22d2847858798c7fb5065238b1 legacy-trunk
+22703 8f90e1f50c11838fcad03bf802fee1b8fc347741 legacy-trunk
+22704 50019cb784e0dceeb3dda154f6ab9023970778b8 legacy-trunk
+22705 7533412dc58cd6a9fcebfb6993d9a74dfc84ecf2 legacy-trunk
+22706 f7aaf721a81b3cfb75c85bc56f9d959876e04635 legacy-trunk
+22707 134e133d8c445cc6dafc6591d7b57b3da3ef807d legacy-trunk
+22708 0b642d220b02e2d0df893ac2388dd769a51fb6ae legacy-trunk
+22709 45d0e114212e98051648bc1c68e97806ed73d7fd legacy-trunk
+22710 4a30ec798e6c2eb858a070b85246a6844416fc31 legacy-trunk
+22711 61d53c053e434e9ea0662c513c20d1f23c4bdefa legacy-trunk
+22712 6e6fc7b6a3601bde6ef483738adfb624c2608d29 legacy-trunk
+22713 0dcee9bcd813e861605278ed96ec174167a083f1 legacy-trunk
+22714 b3c92f013869f0689effd52cb5a0199aa79d5c9f legacy-trunk
+22715 45ea3b5fcbe5787b05cbec65761f65d8afbea607 legacy-trunk
+22716 8d2b2cb2febcf04e95121d8a68eba8c3f403f390 legacy-trunk
+22717 553d688438c43456ea745e548cfa234813259145 legacy-trunk
+22718 c392c3e49dd56ed142fec6ebacaa31501d226ffe legacy-trunk
+22719 f9f4bdcbc25aae3b852db4c12c489a287a0217a1 legacy-trunk
+22720 bc63afc701ef70da65e0f7d6986fc3286b9cdeda legacy-trunk
+22721 0e70df98424edcc36b8881fcb0da2ff433b7b1a4 legacy-trunk
+22722 e1c91ac55cca804ce7d12923b458367e423e44d6 legacy-trunk
+22723 67b325ce0226d40af10124dba3956ffe1d230727 legacy-trunk
+22724 4796a67a998b990cb823378b8d7e1e1cdcf1ed35 legacy-trunk
+22725 984ffa12460609b9927c1b977153224378637225 legacy-trunk
+22726 77fea8fa1f16431c39fee72dfc47bdacc1efacb9 legacy-trunk
+22727 93cb5ec4401798d523a681f2abd650ff031a2768 legacy-trunk
+22728 c171b07bf6a9e8deefcd97acfa6c996aaa8c00e7 legacy-trunk
+22729 de977d7627ebffc19171206ca41502eec651bcf2 legacy-trunk
+22730 003a0fe9c3503eed06ae589a47534a6aebc8cfbc legacy-trunk
+22731 5c859d2cb37bdc5069652ca8340b33b0a487cfae legacy-trunk
+22732 3e68e1a02ad208add8f33bacc2d7020bf4c62018 legacy-trunk
+22733 42b2f19362546ed3b81517fbdb7381d2606eb20e legacy-trunk
+22734 3e74318a1b763bdb4b14b3882660136b7db098ff legacy-trunk
+22735 c6385038de39afe5c712626bd1814b706e81e58a legacy-trunk
+22736 c1ac5f827bc263003c6c2f58e4cab336bac0b033 legacy-trunk
+22737 d79b51867cdb51901a5ed124f93ecfc03e5464a0 legacy-trunk
+22738 56b50e4d687eba5123dd90149b8409fa6e144032 legacy-trunk
+22739 6734c80651148f5a0855af68d7e7ddd836b51c15 legacy-trunk
+22740 4354ba4735a096776144c867921be275adbe9845 legacy-trunk
+22741 617555579611fa3bb2576990fe732a189b423a3f legacy-trunk
+22742 547b6ef1108c849479d906a34badfb1ecfaa4150 legacy-trunk
+22743 fc5c75807e1952cb6de96222b027cd9f859615cd legacy-trunk
+22744 078292bf94cc7210a75aeed04d428408b5bfa50a legacy-trunk
+22745 d0ce0460f4a7c61add484bb5eba7ba0aa79d8d26 legacy-trunk
+22746 ce4f1e98ba7e4369b3ec906e93a783f8ac6637cc legacy-trunk
+22747 62bf9401a1acfddfb9ec9e4e533c80bbd1f5ff18 legacy-trunk
+22748 17b2afba7a6fb04a3121e2416c999e70ebd94ac4 legacy-trunk
+22749 59931db572b2449a8827354b0fd1bbdc3b9aa7a1 legacy-trunk
+22750 fefe95319f24b0d22220f023c845b220cb369736 legacy-trunk
+22751 87628030ad75d687bfde49685b59d979835a0c77 legacy-trunk
+22752 076ab8cb451ea023769cc0a631ef8c6fe6198a69 legacy-trunk
+22753 dbba2ca7dc1e5d4d36edb99dacd5eac40556004a legacy-trunk
+22754 334f4178477aa77721691c44c302c7dea7326754 legacy-trunk
+22755 ce319b82a8e4dd9d32fc26526eee7d9a7d09bd8a legacy-trunk
+22756 5cf9241d35b09a9b0ddfc3d929ede7c73a2dcb8f legacy-trunk
+22757 cc02341dede47e058d5d6477142de7ffb70afa4a legacy-trunk
+22758 24480a6d27c4d47935c944cd109c35c700fed753 legacy-trunk
+22759 b1acbcf7d5868426cecfb40f8968e51694755e69 legacy-trunk
+22760 546ef318ba5dcd4a73b9d77a8b8536cbb40960eb legacy-trunk
+22761 4aec9cb7fe5d9d58332005cb55809e47d75ebc66 legacy-trunk
+22762 1a6cf325141e0d955f20ffee225b481c5911434d legacy-trunk
+22763 fbb35268fed4f878b1eca8234c79d05a6a7be0c8 legacy-trunk
+22764 99e953c6709ceef4718b3e2172754753ec860f7f legacy-trunk
+22765 c0c5fe7902cf271c2614c744eb920ed9dd0f74ee legacy-trunk
+22766 412d0eb5d4ba521426d824a4e19b94a478df3114 legacy-trunk
+22767 a0847b7a89028c76615f80b1b29e7c66325d860e legacy-trunk
+22768 3a90211a02958feae487e303e95dad9e26b51db2 legacy-trunk
+22769 ab194f1f053b66fdf86cfcbaff83cb79e1e3bfb1 legacy-trunk
+22770 f3ec5488908b3c499d8600203722dbbdba80f0d9 legacy-trunk
+22771 4433eba739e7f16a7c0df0123029f9d55ca4803f legacy-trunk
+22772 ec51e10a6229c6ec16297de2f5ed5182e58322f9 legacy-trunk
+22773 96a0bb3a8521a1b6b598237e487d09706aed4a81 legacy-trunk
+22774 dd8d6153a8c65db8e1c475c544988fd81c71c1fa legacy-trunk
+22775 ede7fcb8b0b23771f7180fa8cd38b976bdaef297 legacy-trunk
+22776 deacd60272be3247bf086d7d05f2b27dbc5ff4d0 legacy-trunk
+22777 202d8dd65eb5b2ff4f70c97f30e4a477a96547d7 legacy-trunk
+22778 3e78978224597f416130986155f5aa283edde319 legacy-trunk
+22779 de10151a7f63edbd19f485aa5af0f3a44533b13d legacy-trunk
+22780 9753608e2d57a3d3c8072c1c4305ba3acdcde195 legacy-trunk
+22781 cf9e34188763c0214523c79089fbe2338320e05d legacy-trunk
+22782 47fa4ac042d7f0e32e81296cae61d3dda84e7f9c legacy-trunk
+22783 b4a3fc1479294b4393c41a5e15ab581779421577 legacy-trunk
+22784 72d9b7c0d211db7695b377b7b732636188661e8a legacy-trunk
+22785 e141b392b61dd2b43e5657f7fd2b819198499762 legacy-trunk
+22786 3e10c087401cfcceb5d0e00cef10072053d3f146 legacy-trunk
+22787 2d2516e37299312ca7464cfd95c0f9a27df0b13a legacy-trunk
+22788 1cd87642359ca59529f8935f194b39bdb82ad924 legacy-trunk
+22789 d711e82ece2332f101995ef7c087919a8244468b legacy-trunk
+22790 85605c93652b5a4e03ab20ef04cde253ed0f8e61 legacy-trunk
+22791 477b6ddd42425f62d0836e667d446b91173e091f legacy-trunk
+22792 7e628f60245e9b2d3b0efdc476022ff270b943d8 legacy-trunk
+22793 da5eebbfe41da5f758bfd4d3eefcd9385026513f legacy-trunk
+22794 11a758c5602790f6934a3027fa0fa553421550e9 legacy-trunk
+22795 19d271f297dc758ce37e75066ef092d5e16287cd legacy-trunk
+22796 01a6901cd305e29eac72e52e2a7761aa3e97bdd9 legacy-trunk
+22797 6c30d20d27f2cca8aaa5e925ba8e5219c9672a8b legacy-trunk
+22798 7b39d91424a2af0c9f12f65070f81e389ebcf844 legacy-trunk
+22799 ddc4c2f5efbc9598c5a81d87ef02b612eb65a3c1 legacy-trunk
+22800 ea76dea6440f9785769bc443e13a72872fd57984 legacy-trunk
+22801 37e0b0fcca540f67b38169e5ad54eaa789ee53ba legacy-trunk
+22802 2c2cc31bdf153ac6705c2ce4459c2ac35109efee legacy-trunk
+22803 02251b048bbbf192cb06607e4404d87e76808501 legacy-trunk
+22804 1849f49aa6f8665fb98e7f10288fdc44022ac1cb legacy-trunk
+22805 07388a6a5526b95a4423fa03dd733494467cb940 legacy-trunk
+22806 81168ef4cb658bf5cff479b134e0b69ae9e490d9 legacy-trunk
+22807 49bb41a69dfc38ebc6c4a78090300093cd732e3b legacy-trunk
+22808 d9ecb2170354f562dfa6bcbde8e92366eb1f2fa9 legacy-trunk
+22809 3811580fdc373ccd72d8ecfc94f44ef517e69284 legacy-trunk
+22810 3fa29cf7319d48450568dd9f5c29bf301b698b65 legacy-trunk
+22811 856e3fa14cba68ff843d06d9839cea029bd67e38 legacy-trunk
+22812 b98e4346257bfbc37c18f83109b0a9c767506d98 legacy-trunk
+22813 b0f5278a2ab437f2d11679fe5184bc32567f1b61 legacy-trunk
+22814 cea7fea1742b4038416354b02f34b71612f19672 legacy-trunk
+22815 9da68c0379abb9bbeb5b1fdb91ae52d01741533b legacy-trunk
+22816 c485d77376fa40750608f353c577f34582eae713 legacy-trunk
+22817 476eb7dceeec2497d4b17f2b0e0b72624c38b110 legacy-trunk
+22818 725762ca27749ad6ea97c3759a8492ad97af1dfd legacy-trunk
+22819 26588d7035308f10c39540f4328c6a8d561e566d legacy-trunk
+22820 7edc2fce1f881574828ed8deaafd4bd4fcdc9b2c legacy-trunk
+22821 b67309407cfc8854c1340f00c2458d16f7cfffcf legacy-trunk
+22822 fbd49d1717c4c2838adceaa35affcfc9fae61abf legacy-trunk
+22823 f6f93419bfb68023cc24b80fee0f0fe34077388f legacy-trunk
+22824 43ddc46c5a99678c7902e26e83dda52696370ced legacy-trunk
+22825 dc27839c0b80fab1ef0a3078aff72e54380d8849 legacy-trunk
+22826 fd48a55ac364fe307fac26a786ba8413b41bdd97 legacy-trunk
+22827 13a93a5dcb1de67e72b62b42abcff4dd809abd80 legacy-trunk
+22828 44a62e3b706f927f2ab3016b49b24eed2dc7fb68 legacy-trunk
+22829 c0cf1a24fc13dd9d931447e322bf26fd5c2b8b36 legacy-trunk
+22830 c43d7a8f00a4595aa002fe62ce4eb6d34bae6904 legacy-trunk
+22831 c59f06f38a468f9803e0e7a1dde3649b73d16824 legacy-trunk
+22832 5009fa6ddfeb3228675b561b5587f179a1b502e8 legacy-trunk
+22833 2fe08918fac667c9f0e0a11f6d7c726f14d8d71f legacy-trunk
+22834 844553473fa4668f034a9d812dca4e29275cec02 legacy-trunk
+22835 bf2c77840f1cc6ffb0872a19588a67162f174a91 legacy-trunk
+22836 47e0c0fdd4c8a00797bc7a7fe5fe25c9a222bd06 legacy-trunk
+22837 85765e61deb0c31d83d40dd59022c0a227a7067e legacy-trunk
+22838 a80b4b006eb7cf33f8382b21b3b369151b7b1060 legacy-trunk
+22839 c48654959dc46fd0149e913bdbe0ec0b21bdd518 legacy-trunk
+22840 db36e396f0431722aa6b0032ae9e2706636e9d79 legacy-trunk
+22841 1be18ef869a47889373da32199b44cfc7971758a legacy-trunk
+22842 bbdf86f358e955888b404d7d51d540c7919e0e4b legacy-trunk
+22843 0663154479416b097b4fd52add26ad2db8306e29 legacy-trunk
+22844 00de719ae83197794b55fb9c5af0248d153bc2ec legacy-trunk
+22845 1cece743a70843ac331fbbb6dadc5fedd7e2c83f legacy-trunk
+22846 04fd3869c6bbeb205d1191d711dd96c75bf2e2c1 legacy-trunk
+22847 904b2f9811a2912edd5af556a19135544cd0de8f legacy-trunk
+22848 5d973448e691df33854eb46cf21e7ae21ea5e1cf legacy-trunk
+22849 4ac9a44c7e478c9f9b8f1faa962a90370f3a9171 legacy-trunk
+22850 10bf4bed5096f84b17314de050a7ae966b95c966 legacy-trunk
+22851 6d5ac3c4341634f6146d2ab9d22b7fc71365723f legacy-trunk
+22852 43fe9377e2cf603656d514b39c2b289c6ce1f819 legacy-trunk
+22853 6beba8b6f60add96b0a6ed8953d0a03a8461e9ea legacy-trunk
+22854 b4e918612dc9750bee38d1a17976a767441e722b legacy-trunk
+22855 c773daa448406e8c94dd9db4af66dff329f3281a legacy-trunk
+22856 8f035800a373d76c9966fd72ff076c3c68bfc2cd legacy-trunk
+22857 c396afef1aa92329a41e70831d4e9d2335e2450e legacy-trunk
+22858 f7cf8961c6678e40e3d54e30d4f6c692716b7654 legacy-trunk
+22859 f4a899e7ec93af0568b6b2627a7e6a776ce15828 legacy-trunk
+22860 253aaa1edcbd18053b2ab14cb2c0b8d68fca9dde legacy-trunk
+22861 337b53679c73489d9528e114a16d688e624832ee legacy-trunk
+22862 b730107dbd13752a0fc97730150fd00508c29812 legacy-trunk
+22863 a885d8761bd290500f4aafd47d7ad9d88b54389c legacy-trunk
+22864 5663b883ea5d999b618476e8b80b7a03ca83e197 legacy-trunk
+22865 b706c027c3c0ca1425d491621093cd383d0b0d29 legacy-trunk
+22866 0bec699783d009bdc2a34f82b661af5559fd875a legacy-trunk
+22867 1ac110e905c2f25e4a495a9cba00b0b403bb62d7 legacy-trunk
+22868 38a6ddff866f1786e5644e205538c04bc0f036ae legacy-trunk
+22869 0f51465f9f3340c69d1264335135542607e0f92e legacy-trunk
+22870 d10653e71cfe042205c3680bb287bcedad0bd632 legacy-trunk
+22871 f09be641c7a3a1b192ddd2ace7cf01bc6ff95886 legacy-trunk
+22872 545080e30627cdcb0ecec04013802282f291b78b legacy-trunk
+22873 ef2cf9943acda7eed2c42c7d0bc7927051f24877 legacy-trunk
+22874 43cd0b4e7261fd810f8f3b991d36e24a083f27c6 legacy-trunk
+22875 ae056f11497496553e8897d3bb2298fd40223000 legacy-trunk
+22876 ad0cce4a5de1f78a2093fabccbf3e1936fafa36d legacy-trunk
+22877 20fb7591f88559c0a6965520204926249ede5ac1 legacy-trunk
+22878 c0a44829bcd5ff26115f1b95a777cb401d7e2f30 legacy-trunk
+22879 cf1919ea94c28a2f1d3d9840c86b647c873c1268 legacy-trunk
+22880 f5cde7eeb6d77da69fbf5873c56003ccb80b5039 legacy-trunk
+22881 71d45f314d90ae352ef16e3829b33a8d30954a21 legacy-trunk
+22882 08abee2a398efa54ef46a98d4619559655d0c144 legacy-trunk
+22883 40feaedb7867e34c778f6f7bcbf0d8bf22bdc4bd legacy-trunk
+22884 60f290a7eae8c1489b3f7d826a96812e2cea5c96 legacy-trunk
+22885 f4af27cb263240a0a21e2e27475ed847e1cacc23 legacy-trunk
+22886 c9647fa78f052f3ef0b53baeef3501f056101236 legacy-trunk
+22887 e03ce2d6558557a2942dae26280869ce2de1dc9c legacy-trunk
+22888 b1b0479c9106d5ed73afffc51be6a1594c2cc9b6 legacy-trunk
+22889 92df6845120d64618379efc9d67754dfa8d544a1 legacy-trunk
+22890 d55b75ac2fb4883165f485001975fcf58eda4ddd legacy-trunk
+22891 797409d9702245a39b37c415a88adefc67560b11 legacy-trunk
+22892 01dae8a03f86376206c84fd6beada6faf11378d2 legacy-trunk
+22893 a3c045fa49f50ca957e3859ab0775d9b078d9cc2 legacy-trunk
+22894 a4feefce0ce84969ac49574f1e72107233ff61ea legacy-trunk
+22895 d4b3b8e23544b8f4def82b76a9b890c4f46a08dc legacy-trunk
+22896 b39e56dfe35d2b9944e421ff1df68e8b12ceb621 legacy-trunk
+22897 de0f035205ef9a347c3b4676c88578de2cac5938 legacy-trunk
+22898 79e2327e51d6136d8d22f6ef35defa28c95cfe0a legacy-trunk
+22899 6b81f9e9d8600a284fea3c2e838e1eed3f03bad8 legacy-trunk
+22900 92d0fac8a16934f59e222587c51b3326e68c214e legacy-trunk
+22901 575f50ceceba1831a98920f4237fc801d24549dd legacy-trunk
+22902 937965516b5472f29f4f4568b982d9bd0e455588 legacy-trunk
+22903 2fa615dfc464c80e26340a64ba88b60d6dc1dd38 legacy-trunk
+22904 80bebc5389fd0d18bf5715c11bc4b6473a02986d legacy-trunk
+22905 b4edce9d6e990ec4e91563fda6f618a9d576396f legacy-trunk
+22906 84be0cab63a884b46b0a276fe7caddf2855fdfee legacy-trunk
+22907 780e741585e10e26c56d11f8bfc1bb367af86831 legacy-trunk
+22908 8f8e971132b867384654271430a47264ee29d191 legacy-trunk
+22909 ec7a2a6cdbe9c486a7a68914b830f65b0f00357a legacy-trunk
+22910 08c3c9edd99bb0ba1e48081abc40fe8c0747f2af legacy-trunk
+22911 cf65ebf875609131e8c93e632c65d138a85d55d9 legacy-trunk
+22912 8d358c24dcfbb1043a970a8fa11b7ddc16efb983 legacy-trunk
+22913 cc604b71036c4ff8c2d213b48ebcc86275909c78 legacy-trunk
+22914 87e8fc0a9862b5539c7f2a6f27b1613c4f496779 legacy-trunk
+22915 78cfb993f2741906d74187f0f365284d917c692d legacy-trunk
+22916 7df300d284c6aa023f3b3ff25083085ce0688af6 legacy-trunk
+22917 3584550a622ad59a692eae8292ae19cbbc7fd40a legacy-trunk
+22918 b3271297b984ea49b693614deacb84b5778cbbc7 legacy-trunk
+22919 715244108faa0f7718be9b5860fcb2def2b5c69e legacy-trunk
+22920 685dcae5c1237029836b9eb39e1367457a209289 legacy-trunk
+22921 c768d3191df1c1ebea5b9d1876aff168d1be6ff6 legacy-trunk
+22922 91533675d6cbf0ad5f2751751d157005545e5467 legacy-trunk
+22923 82db9a9006ac5ee3cebf373aaafa5d64ae78dd2c legacy-trunk
+22924 6958784b1cef015cddfe232b8856a88fb995c44a legacy-trunk
+22925 3f84b2000f62b4148ff7a4ff62274068013a14c7 legacy-trunk
+22926 7de4e6b8d199c0e4a452dcedd183dda90d73340d legacy-trunk
+22927 8dfb13a4e175c0f35156136da1d3c584e0de5770 legacy-trunk
+22928 8cbc74f5586b50767d30d62ef3ed6e725eb1985f legacy-trunk
+22929 714aeecc23162f747bad1aff7e2eedcc9f63defd legacy-trunk
+22930 6ebc26333e6d7cc1eaee38ae56da4a9656f6f425 legacy-trunk
+22931 749e49c947c071be9030a8d850bfd038ce3059fd legacy-trunk
+22932 3731ad1d90333ed11b38387358b377e7f1ce02ed legacy-trunk
+22933 31a66c0c7d301e6a3ae257af1078758d5d4879fb legacy-trunk
+22934 cfc5e5160cf5df8265021b73924265dfbb74914a legacy-trunk
+22935 6b82853df2edb786777fb2dcf35f97b6fd405494 legacy-trunk
+22936 933e812974c3ea90d93e2e020457667164cc0c10 legacy-trunk
+22937 04218e85b156fd658f4700c01004300f4b70edc0 legacy-trunk
+22938 617f5e72b0ec8332d92fd95a164c2431a228bb86 legacy-trunk
+22939 3716b116fb3132255b4574cb15909feae31d4d1e legacy-trunk
+22940 9830d00b887dfa426d0d99206bfda488e7db4279 legacy-trunk
+22941 843da9795381307f015247b1fc19fcbe9d734649 legacy-trunk
+22942 bc6bd35f5998df49f5dc4f221019416c6be773fb legacy-trunk
+22943 372d8c1d2b64e288d6102070ce61e8f5561d1db4 legacy-trunk
+22944 2a4e3c9285b54fbe86bc87c12ba1e67421909d6d legacy-trunk
+22945 fbaf4e55263f910393f9f87a3f0dce831492dbf3 legacy-trunk
+22946 45657376b9b8cc934635bff68f23ca63a2ef7736 legacy-trunk
+22947 d6e1b109160971b37248ac1dc62e3c073463e2c8 legacy-trunk
+22948 e202a75d881e147995bb436556f6e7869d6eda69 legacy-trunk
+22949 1901f875b7d3d1d8d4f302d12798b62b1db83fba legacy-trunk
+22950 b7f6fbc087a77eaa707671b26ba0ee133bbe843a legacy-trunk
+22951 5005545b6487f06a7ed69affb3d320451af24479 legacy-trunk
+22952 11b373b00f2afe1aef057e8cf230f809474d9f7a legacy-trunk
+22953 6eafc4a6359a80a8ee1541e07865ae468b8111e1 legacy-trunk
+22954 0b0c84078f9160da2615ed80f70c3b479c90c44a legacy-trunk
+22955 1c8a950d69700e75b1443e818b478ef0110d2209 legacy-trunk
+22956 bd252b1832a2dba1890802ea0c3616c565d00902 legacy-trunk
+22957 b4521436e8f8f99d281727a3776783a57dba53fb legacy-trunk
+22958 9433dd3c197ef4b1f6a3d5a5992b641b509605f5 legacy-trunk
+22959 450e5a0e926b940db8939a1472b875784c72406b legacy-trunk
+22960 0d96145c44b89f6a0fd3b81d728635e6192b620c legacy-trunk
+22961 fb2d83aaff68645fe7f6f2a10f6c1854bb196650 legacy-trunk
+22962 01de0a7030698c74c328e514f53bf2ba2e656666 legacy-trunk
+22963 d19648ca8749ccc1a4249b14575259db25b8b5ec legacy-trunk
+22964 cdfdd5359411a0974290b4042977b72eef47a08e legacy-trunk
+22965 a684b4c1012843e931be30227a64ab4579713559 legacy-trunk
+22966 7766ea72432094f79f3abf34938d9628f4424f55 legacy-trunk
+22967 21d2b9eedc2de17996043c459ef5a2046ea32660 legacy-trunk
+22968 2a9bbdbefbb1c94f1d2fe2096316e79716612c66 legacy-trunk
+22969 ba9aabcd89e3decea2ee92e1ecd5777996d2fb41 legacy-trunk
+22970 226d5eefa44afd6b5cbc56b866887a600d9963ac legacy-trunk
+22971 5487d9d53a0e1e552121bc900db73333750963ff legacy-trunk
+22972 f3036d4e3c22af812f089aae14135fe1f790cf29 legacy-trunk
+22973 4d2cb6eaa41138c9a0042b253eb8d1d5eb5c05cd legacy-trunk
+22974 deb08af89a35d69884612d32ef114289d066309b legacy-trunk
+22975 2e6da2dd2ab82070b4111f59ab44faf535477a48 legacy-trunk
+22976 85eb1c911ae5c0c766c0f788ebf5ce38f802cd19 legacy-trunk
+22977 b7dc5159448f48a77322b92defdbd9a34283b562 legacy-trunk
+22978 2c1a983098a064b48d925a2938f4fcfb2c4f9e56 legacy-trunk
+22979 d9daa4a67be262389a10c4f622110d4aa1434632 legacy-trunk
+22980 f56c91820fae2d2ca83bd3fa821d56b0a8627cfa legacy-trunk
+22981 0e4646bf804110e337ee38494a7e1e49a9812a47 legacy-trunk
+22982 56c549a253a6e94c6fc9a6a11a4793a8e9b29326 legacy-trunk
+22983 5dd28aa2be6bfd00404312c0c66421592009d51e legacy-trunk
+22984 8d2c7436b9d27f7f325ce649b432702cd384ea09 legacy-trunk
+22985 8e6e248dfdd865bb8b6c32028b5b426172689a13 legacy-trunk
+22986 a5eeb1e70f41f2fe86dd852761282867fd99c3be legacy-trunk
+22987 2a465b0eb54e420aa3df24796dbf2e3f0eea2004 legacy-trunk
+22988 8541878cf2e13d25604fa95038b4bf8f4c3b870a legacy-trunk
+22989 f1430e3382bbe4baf8242b8b5859981693c1759c legacy-trunk
+22990 dc059bfb53b22ecd6512287e9f0bbd225578e22e legacy-trunk
+22991 98856a4aed101726ae6d24b5ad067d01d8712cc1 legacy-trunk
+22992 7fa40597da7e7f92e3480fc67ba20c575543b2d0 legacy-trunk
+22993 c93d7d0857a276dbcb1a12431d1152ce434b5c18 legacy-trunk
+22994 fa0621e4ad8ac7f7f8d574c4fae34c531ae369c6 legacy-trunk
+22995 35b6a1d0b1e054b4d64e20589af8d24fd8ca156c legacy-trunk
+22996 3d76dfc34c57e6375528d8176e01bf8d5421bc82 legacy-trunk
+22997 dbb9d82c7ce37ff428573049a4f28acbb7934803 legacy-trunk
+22998 c0580d8c193e3e33fcb78c5794b3aa648d24558f legacy-trunk
+22999 e1f1e9ebf05013a706e6f07913c632154cc9fdb1 legacy-trunk
+23000 5a7ac8c063cccfc0c6ec27a304cdd9f5e34c0fc4 legacy-trunk
+23001 a1d3970885bdbebbe706adb649f1e8a2b7070056 legacy-trunk
+23002 ca7f7576d823e8c70b86d02a5f8882def051725e legacy-trunk
+23003 64bcef1702ad97ae017fef6c079fb718a1b6ce9a legacy-trunk
+23004 8e87cdded96fbfe7f5a6e5c2c4e3349d5e7616b3 legacy-trunk
+23005 96da985cde98426aac4d3a1b5d4da493a906ac20 legacy-trunk
+23006 44175bb0b7bfc807eec6dda92960dba980d4a14d legacy-trunk
+23007 d09268d0ea529b64913ce04b9bbbfbc53b0a72b9 legacy-trunk
+23008 94d0f2eea047e2e8b123e319751df4f1070f56d5 legacy-trunk
+23009 578ef36f8fde0a42b6cbdd4a4bbe8e98d84c3287 legacy-trunk
+23010 5fcd0d41a446bd652507094e00f4a8ae4147d7bb legacy-trunk
+23011 2bcce8bab8bbe8dbd37823c826577a40ea330ec9 legacy-trunk
+23012 d54378d3334fd428e0aaec91942280cc4f50d109 legacy-trunk
+23013 d4f53b1fb4240dfc2b387cdee0d26ccfde95b579 legacy-trunk
+23014 a5eaef47a9b3360ff422c7d3a6a428302c9043d9 legacy-trunk
+23015 42d0bde73533e1245c63531426c6fcb25f1ef440 legacy-trunk
+23016 432591328410245bd8b506617f141b018ba6cdde legacy-trunk
+23017 335bf3eab9f1add9d9a5f03a896737489016f5fb legacy-trunk
+23018 6c7dd9b3e50b5f3368d4132cb23300393328ccfa legacy-trunk
+23019 c5523b0f89d583deded1ea70e2e01b3873226ddd legacy-trunk
+23020 ee12c38e46a6fc035c87ac023e49fe9416067791 legacy-trunk
+23021 b23238646d156b2d1709541daaaafeb875c98c77 legacy-trunk
+23022 e7147156ef33e74a477bc0713a1ba4099027ff2e legacy-trunk
+23023 1c62b4a597f6e72b05c73df2fc12fb5f37c5ee81 legacy-trunk
+23024 07bb09df3324f10201c8829299798dd6a4673788 legacy-trunk
+23025 1cc84dfcd6bd274f3b57f4b3466ef89c0cac25d2 legacy-trunk
+23026 7b722b6cc77b31c289f265801ae7ab3023bc7862 legacy-trunk
+23027 9de2f7e1b6e8b9be381ba10af1069536397bc98c legacy-trunk
+23028 13b654ce63a477bf6d685a5a18dcbb1d23da4909 legacy-trunk
+23029 173122e5ede4172c411a1e8b680ad706b468095c legacy-trunk
+23030 c737d13da92d2ae0a06030a6a908b218915557e3 legacy-trunk
+23032 4abfc176685c302a21c1603c57e4c7bcc43096f4 legacy-trunk
+23033 f814ea6bb6676b824195c51208dd663a7c9feae2 legacy-trunk
+23034 cad933a454fe61d4df180aa2be2938f27e8dc66b legacy-trunk
+23035 94e141e20d618e8e131f90bf7cdac2611baa88ca legacy-trunk
+23036 0b57729284dfb4e6c239f16ab34941e19426e098 legacy-trunk
+23037 9079710ec21696e398467982cbc61c8c91b696c6 r22a3-branch
+23039 960474d129aed7365ec79aaeb0a26bca4dfe8643 r22a3-branch
+23040 c97dda238b362661bab77bba9d0ac3a79c52a219 legacy-trunk
+23041 3f621489be721da6e4ae52bce446729dd705b727 r22a3-branch
+23042 b35a2bf0c980ab453b4daa431dd1a4a9dc27df37 legacy-trunk
+23043 e2e9f1722c4fa29f0cfce0fcdd8394195872e00d legacy-trunk
+23044 95ea66122325688e24b7eb1714af322385ff573a legacy-trunk
+23045 9c54a16ac8b9edc534da8a6d3215f46c286e02a1 legacy-trunk
+23046 700fefdc03d285f324face33b3a8785fa2b82cfb legacy-trunk
+23047 c0f94bc5ffe806e77861f692bbd16144a138d879 r22a3-branch
+23048 77097a55e9731f05e04f78d5a532569d39e9bfe9 r22a3-branch
+23049 03080e395c9ed0fea858356fe90375aebefe7a8f r22a3-branch
+23050 78e73b851aa9dba364fe91ffb637d347968ac899 r22a3-branch
+23051 285b740b844192c67f843820c626d64edacc66a3 r22a3-branch
+23052 43dc827dd717cafbad5b4a445a7f2653f51e8135 legacy-trunk
+23053 091c01d07d981427ca14c12084d22f998f9ec9dd legacy-trunk
+23054 d48014dbb85f6a9a5b6d2ec0440cf5c306292c09 legacy-trunk
+23055 ed54943ce24e0fe446888f95f806d18d96cc4761 legacy-trunk
+23056 fe229727a40cfd49db41963bc51aae32cf6377a9 legacy-trunk
+23057 b47d29699cd298b1b2b4326f84553be695da3918 legacy-trunk
+23058 32cfce4d83dc060480b91fb48a47bc48bea3e842 legacy-trunk
+23059 9031aab27eaedd2a50b4b3f4351e03d0f788c5c9 legacy-trunk
+23060 560155e750878c2df000d9af5750691eee02a3fe legacy-trunk
+23061 8cac5eb703fd8465dc2409efca966e4555a5c28f legacy-trunk
+23062 086ffafaed5525990f54875a0ada3e047a200509 legacy-trunk
+23063 0584c9132525a588e054462c74fd8a6eb02f989a legacy-trunk
+23064 79a31ba873a343dd97538ae04e2bf42bcccc1d5c legacy-trunk
+23065 ce57fff939629d0cabe8131ea13085089edc336c legacy-trunk
+23066 38c12faf612aa589c809904ee407875111561853 legacy-trunk
+23066 08796a137f1ada2462f7a3177306df5f67a767e1 legacy-trunk
+23068 70411eba225b1a51f7cc3a7f268ee96f5f753bec legacy-trunk
+23069 dc87d91d0dfd685e8544e1e62e47ddb4747b7e85 legacy-trunk
+23070 8d585d822f9d0db1cc910a82d55a2c030f48e73e legacy-trunk
+23071 0cbb060da2c34bcd094ef5a1bb192d0998c35aff legacy-trunk
+23072 b7396287cf65b9726c24851979279f5d770a01ac legacy-trunk
+23073 6b1be14d765032490375d200e8444ec1c1da3902 legacy-trunk
+23074 53e0cae3cf6cd0931b6e7d7e8b782661ce645b0b legacy-trunk
+23075 fe5ec1a3a7e0f730b07a1d659cc2ba4ed2cf9e60 legacy-trunk
+23076 3f73a8bf76f7c99ba96f168e46cab1e27f954293 legacy-trunk
+23077 3dc315409968142c0d6d56d511be3ddab543c376 legacy-trunk
+23078 6e57dc30555108a6fc18334a1a2d8016cdc02e86 legacy-trunk
+23079 372149779240669f8475312bbb889d3d9d5be317 legacy-trunk
+23080 919532c50a1759b894db95f0105534b41d1b5a01 legacy-trunk
+23081 8ef456949b76246aee84c68552d95e435c3e17b8 legacy-trunk
+23082 39eeab689d067b09ca5fdb3809b1da73194c1758 legacy-trunk
+23083 5b28d7dc300625b583f2df162d883318df3857b1 legacy-trunk
+23084 bbaea53ac087f5865782d50580f592f94bdcf9c8 legacy-trunk
+23085 e419060e13c8d4413f0d7a6da4c2cfaf59a03904 legacy-trunk
+23086 1359fac617f1bb47b866f06a5954cf095ca54cdd legacy-trunk
+23087 00d80947d8179f889a0c782a8b6310235af0098e legacy-trunk
+23088 f44606b242c5911140791614269896a85f2e1985 legacy-trunk
+23089 53250cb106eb471b74483ab681e66d8225f13491 legacy-trunk
+23090 9cf1338fd8d985002229dbeb14b3619bc35d93c3 legacy-trunk
+23091 5420e7d348a44c631b8c35ec9bb55643401fbdd2 legacy-trunk
+23092 5158e478945921810e0d66936cf12699cb06a79a legacy-trunk
+23093 c15920c2cf6ccb9fe9884484d4023f6d42c8ed13 legacy-trunk
+23094 10f5927dbf05d089dc6b6b302606f5c55e4413e7 legacy-trunk
+23095 377746a389721998c41b9db494798718fc996fa0 legacy-trunk
+23096 d8dd75e3b30465fb1e573b6908bdffa8b055fe6c legacy-trunk
+23097 20924a70fa1bbc6473a82a77246760bd8a648496 legacy-trunk
+23098 6ff7ee84d5a15835d9c614bc7e0a97db186b3f6c legacy-trunk
+23099 9e4d1a6307f63855525b30b709e30f8f0c3e3d74 legacy-trunk
+23100 7a980c98c8aeffd3f22e3c9017c842c7b40fd975 legacy-trunk
+23101 662e22f99639f5074e2c84e844ce29cafa80d312 legacy-trunk
+23102 c5c241bef88d3b066f4b8fa1fa097c2c2d0895b4 legacy-trunk
+23103 8af74f0358ac39a9bcd095b01b4a62e42946e527 legacy-trunk
+23104 bf0202dac4417160beb7551fe7efd249df24b6c8 legacy-trunk
+23105 2b581f4c69b4f2094e3f10e238f31724e23bf900 legacy-trunk
+23106 f3f694111ea08160b47a36124d91e8b08d939d30 legacy-trunk
+23107 5e79bed3426f93df336fd6a77ee0d19a90791a90 legacy-trunk
+23108 9830323f5f8eb2e58ba6ea5a678bd633932733a0 legacy-trunk
+23109 43ed8a345f4d83391d385e5cd7f28f3704c9c70c legacy-trunk
+23110 5568b320914f6db95742307f8372133be410e3e7 legacy-trunk
+23111 41413c783836793739620e6d8faead342ba0e779 legacy-trunk
+23112 9a5bbf845c633ec7a1e65c58cef161a10c4478cd legacy-trunk
+23113 873be8e3462bee67bab53c7f8bf829ec158ca56e legacy-trunk
+23114 5871e0aa021b850ccd9ec9dcca19b123610a6e60 legacy-trunk
+23115 2a809b3d03e94bff6066d3d2a6ee7c9cba139839 legacy-trunk
+23116 d9970d6318780b988f5354e390aaf90d2070c7e8 legacy-trunk
+23117 36ca16dc35b9d999df04acea3015780b5316240f legacy-trunk
+23118 676298c0c76296348878c0fe072fd4cd1508c13c legacy-trunk
+23119 304652ffc6ac60354f9dc73a133e4808041c5815 legacy-trunk
+23120 f2a3009b528e93e5c063ca546e2e75a3bb88de62 legacy-trunk
+23121 a34991b91008619cbc7e05f05bb8ef0bbf8204c0 legacy-trunk
+23122 5780724470eeb4e7a0bd77e1e03f6bb01e421e6d legacy-trunk
+23123 af98282e9277b7cdca8619b769cb9e6f4a4894b6 legacy-trunk
+23124 df493646ec4dcd9e86b133e23a986a0f70865b53 legacy-trunk
+23125 e91b99138985ae95158fb8a4131eff840eb69658 legacy-trunk
+23126 18086c913ed5c5131b24ae09326efc94bd8e48eb legacy-trunk
+23127 51363348dcfab7b02f7d0f44bb735550d8560bfe legacy-trunk
+23128 a19eea41668fcffa00ef12bb40805cb7bb19113c legacy-trunk
+23129 ed3e529fbe4791c8abe9d42f80656b885383c454 legacy-trunk
+23130 70bdf84862ad1cb3343f8f53a444eb867bfcf62f legacy-trunk
+23131 b87c0586281559672ec4db897ea855f2648ae08d legacy-trunk
+23132 62d31ec43df663497d42c8d73b1f1f1e26b0949f legacy-trunk
+23133 cc146ee528975b5273acd86c1f57f0855d5ac04b legacy-trunk
+23134 bc50581b3d7cde278fdcc050cbbbbafa1ef6f396 legacy-trunk
+23135 d1cd4cd72271e07a757ff9004d4800df4a3ebd2a legacy-trunk
+23136 16e4d096f787d1a9524892bb91f147a34dcc541a legacy-trunk
+23137 96f53f8831eee4d2909f68f8b867235bc6a5a96e legacy-trunk
+23138 c8fece37f020b0e962623f28901de9c3619f9413 legacy-trunk
+23139 df66b4dd0b0dbb4488bacf6a3f6ba77a0d7f6c85 legacy-trunk
+23140 72e6eb65331207b816e3eba5b082b4491442af52 legacy-trunk
+23141 3b0da13ace485722ed2e4689150a022c6ad47e21 legacy-trunk
+23142 b28fc8c36e3de78f7e151193c890444b3bed1c35 legacy-trunk
+23143 2da66ce7ee22951747209341312c964e15d9bbc4 legacy-trunk
+23144 733314fcfdaa0a95ef6bb78d7feed2482c2eff79 legacy-trunk
+23145 31fe8b3e276baade4501f75d58f07b84cd810aa4 legacy-trunk
+23146 c33a855c12745f82a9c8d52dcf8d9bf272de2800 legacy-trunk
+23147 e913d75713e643251739ad621b866455a0fea0cb legacy-trunk
+23148 3af006503678a7c4ea6255ab05f5ee2345690f09 legacy-trunk
+23149 51cc82605d32db7b142f55366e91de6b1da41fef legacy-trunk
+23150 1c41fbd09d93a68611c20eca7b08d478cc0067c0 legacy-trunk
+23151 0491ea611bc4b773c1bb9fca5b50cfc603fda5e7 legacy-trunk
+23152 84376356ff890e9027920dd2246f0d6dda4eae0e legacy-trunk
+23153 fc40d0b540437e9887342836e1c339a2cffd64dd legacy-trunk
+23154 1f61526307c00b6788a1a698bc89f47085696815 legacy-trunk
+23155 ff377472eac940b25da13124469e274c68280f1d legacy-trunk
+23156 07818cbcd302688ca1241756fc99ef7c19eee6ca legacy-trunk
+23157 de39956b545804365f1624a52e52d27b49d128d1 legacy-trunk
+23158 c082971823ce913088a198df9a8ebc19d5cd68a4 legacy-trunk
+23159 58d50094bf808474011f8b74dd3819a8639aa791 legacy-trunk
+23160 a7ba00e3b0de2fd4bdc729d30353edbec7f15bbf legacy-trunk
+23161 f39a9be7c9af74685c411ea57832923a0ca7fbcd legacy-trunk
+23162 d68cfd85e6db9b5fbbc832f6d2c531a0c9733bb1 legacy-trunk
+23163 d57a6c813658cc0300f5f4d369aee703d3ced5b6 legacy-trunk
+23164 a288a55f929151bbad5ea2e6a8f46430e6a77803 legacy-trunk
+23165 49b7e3980853bc2d55347c1bcd7e6da2ac1b8543 legacy-trunk
+23166 cba449ab591579c94fcd2d7c0b5fa77f596d3682 legacy-trunk
+23167 71c853dedb07291def0bce8c460afc246887723c legacy-trunk
+23168 ca0f54dacdd8c45fe5fbd0c60084ee0b04eed937 legacy-trunk
+23169 2027dc124eddadbc9e804ec6cf0a2f6426cf2e9f legacy-trunk
+23170 2263cb43eaabbea0cfd5eb1ce312547bb6e22613 legacy-trunk
+23171 1b55d79c69d5fe049d353a753033adac1a6f461a legacy-trunk
+23172 294a38a19b5a97ee5aade1b84cedbf09545b967a legacy-trunk
+23173 d96cdbb4d27bc1e15c7b5fdf8bef967d83dbaa10 legacy-trunk
+23174 8e4d35bc673ffad9db3c2b974b8783d9e1e1dfbf legacy-trunk
+23175 63930159ca3c72a8b8f443f343973faa8c220057 legacy-trunk
+23176 16f64d7da8e321c21da0756fbd7d1065e329450d legacy-trunk
+23177 97cf6dcd0aed27a6bdfbea2aefea188463bd43c7 legacy-trunk
+23178 cb35d0f704de0b70b06b1bbfe1012b03cc61ce26 legacy-trunk
+23179 01f66f5db3261853182dc4f98e982e7246bbd828 legacy-trunk
+23180 df409844b659793f369faadb85aca968e693dd41 legacy-trunk
+23181 ce414a6d30b46e836ece661d297300b480f47472 legacy-trunk
+23182 2894458877c829937129091a2b5463077cbc53da legacy-trunk
+23183 6046e9546a702b61532361a91c6fcc974c0496d5 legacy-trunk
+23184 9bc76e36ba57ec8f5a3fbcc3148dfe3b8522f1b1 legacy-trunk
+23185 36c07a1718e989298e60d8f0f457e8aab57e379b legacy-trunk
+23186 c327a8ac9f2b5fd100f05fa4260ae7d8285dabed legacy-trunk
+23187 621ed13445de55f79a7a101796b9d23a59eadad0 legacy-trunk
+23188 b6cf2f27e44faa53daed25339d24307d7bd47905 legacy-trunk
+23189 f2f25a738f7f093b44c5292d576966dce8bcc971 legacy-trunk
+23190 619a2d6b5ea9219d1764152e3c56a1e99f60528f legacy-trunk
+23191 6944f5b9de03db9e860a8b91c8d47da913d7ddef legacy-trunk
+23192 896f2d1e2f46d76c1734333419d9943a9cff241c legacy-trunk
+23193 fd7a7f832258d7a97238a9c3382d4e16bc5d089c legacy-trunk
+23194 aaca4d3cf62b675be070c677a230f8414383f8de legacy-trunk
+23195 3bf622bc279218193df1881715545693a020e560 legacy-trunk
+23196 0d535c86be5f52f0a8411c8dc1a9a1922fa4ecc3 legacy-trunk
+23197 8522b022f80a2935f6602ac0e8463bc552edb9ed legacy-trunk
+23198 6773dcfe34a3691f580f19e262522c4efc1b6a52 legacy-trunk
+23199 d940af5258408ed48d0bd9fc243a3303c9af73a1 legacy-trunk
+23200 be4baafa4c528d0623564e3ea754590e1ff9b6e7 legacy-trunk
+23201 41799b70a96c1e3cc119ea933c62f9a508d91b59 legacy-trunk
+23202 3f192299090349240ca32da09ccfac4587c15700 legacy-trunk
+23203 eaf1203b85cfd084e027bb4e4a9a7f8b93e6f4a4 legacy-trunk
+23204 04ce2a48c0a831a84b1a22b56099e84b06ad1b86 legacy-trunk
+23205 76133a465e0396f48cdf3cc95d2c5462675fb25c legacy-trunk
+23206 78946a784351202d052d2fab39bf4fca8d52c632 legacy-trunk
+23207 96c4a3f08dce24dbdf5f7051e19900cbfee98bf1 legacy-trunk
+23208 0f9df563b65de4e1482231a3e4d484bb17e2161e legacy-trunk
+23209 84af1dd011ee33f7acdf9de6665edd0872b77917 legacy-trunk
+23210 f36a2d40a1df68af3422331711046a7c84ff2332 legacy-trunk
+23211 33669c8914b4ae123c3c958427a90d9cbf541451 legacy-trunk
+23212 9098a308a57b078ca026743a570b7299b8a5bc08 legacy-trunk
+23213 6081d736167b0e693f05b379efc075f6d015511b legacy-trunk
+23214 03f3ab0c7286dca1aebd136ada7b64d17d428b65 legacy-trunk
+23215 cae3ff31bd912c1437dab46c8213a8c3b59f83fc legacy-trunk
+23216 08374a8526e2103fd6c0b6cd420b20d21dc07a2e legacy-trunk
+23217 cc52b05ac9795442a7477df81cdf811c35a8c17e legacy-trunk
+23218 969e306b62fde9bda678486370b93c751820aff4 legacy-trunk
+23219 43e5fd54f8c98d9a7df5f29e5d6d93dd8cf868ee legacy-trunk
+23220 817745e5adfb376d165718cd4b8c241de19886e1 legacy-trunk
+23221 48689346e8bbd66702b4b174c6e14c35a52e3021 legacy-trunk
+23222 0b51e607f3337f94570244d969ad555f83f14314 legacy-trunk
+23223 e9128ea45cda823e778e5902051609405e4f1cd7 legacy-trunk
+23224 b1408a28d8be2b6f16789e31c51942b45cf36b52 legacy-trunk
+23225 f761cab28c1c10f495e9d1326ffab9b3bf8efa70 legacy-trunk
+23226 d4c9653166104f69dfe4b371c14182ca4200ea86 legacy-trunk
+23227 20adfec61467d5bc4dc2a23f723785aa021a1c27 legacy-trunk
+23228 05f6b09899532a6617b56cc29b9dd0d2aeb9b98c legacy-trunk
+23229 8edc44bd0ac7f143a3907e53f858d002b663c8b4 legacy-trunk
+23230 4e445a3e07c6b5358b9fe1ff8ebf42f2b244a23f legacy-trunk
+23231 da00188d52709af689a353d909fec13228954e9e legacy-trunk
+23232 6313fa38e90eada34d6409229780a971ebadfbfe legacy-trunk
+23233 a960e673077fc5b28355e31f1f542af72afbc8f7 legacy-trunk
+23234 8dcfaf0e6559bb6dcb41ba694cb82b2abec60894 legacy-trunk
+23235 9ab6af6815afcb6da0605cfebc8c8b092d9e138d legacy-trunk
+23236 0fd95200ab6ec4d7a049162f5329442f1d05d282 legacy-trunk
+23237 bf4b1b08a2c6f229a98fdcb8372d283bcb9987dc legacy-trunk
+23238 d5646c0c5130cc2f92de071ac138b8be878369ac legacy-trunk
+23239 98812d2210751806ce72f63628312104bbe14ab1 legacy-trunk
+23240 712afdae112394c0a989f0f14a5cc958c908d278 legacy-trunk
+23241 f42f89b5b8f9bb46a2c45b150f3fa392b4c2b8be legacy-trunk
+23242 db16e26a071b8343c39b904c9e91c0e26191a244 legacy-trunk
+23243 fcb877069faa711732c09bf208380e2784f2f582 legacy-trunk
+23244 cec9e25af121b16571f8107b1223d722cb1c1de6 legacy-trunk
+23245 ffa1a87ac43a886ef254822023586a95b8d0111f legacy-trunk
+23246 87134c7f2bc77b836454b6d6a9739179213571ed legacy-trunk
+23247 9d7ca5914d1ceb563b50b83def78478e5265a813 legacy-trunk
+23248 28ef22a2598e5aa31b17ebe5a2e47bd0b6e6bdf3 legacy-trunk
+23249 ab6c14822de1bf65ec10dc0e766bec7fa1612871 legacy-trunk
+23250 b07cb51d731c87115a1621570f3c9f81ccc682fd legacy-trunk
+23251 646e247288523b8ec90a0a74e29f227c2b1df04a legacy-trunk
+23252 941c28686039684f0218c79047b4fb03a86ba3c9 legacy-trunk
+23253 8a0c97453df4835d2fbcfba324d92282697e11a1 legacy-trunk
+23254 1f4e2627b627011d43b10243fca1f6706d445859 legacy-trunk
+23255 34af19dcef593f1cad0e67e9933e934f813256c2 legacy-trunk
+23256 7ffe276a6854c83227d24d5803bf1d1bf62a6302 legacy-trunk
+23257 b0afb6913401aa74aebc962acba5f0875bf1c566 legacy-trunk
+23258 c7caf79f51433d86bc4b9518bed0ffd44e64af2d legacy-trunk
+23259 3815c8ad02d0334091e207a86d099d6bbfa27121 legacy-trunk
+23260 9c8b1961503413435604fac2e4676e7fc84dfe84 legacy-trunk
+23261 2a7b4d4460d3ebe86b2d93ed1f977800a3f54f6e legacy-trunk
+23262 56ffee1eeeec4f990da12fea4bf139b7b90720fa legacy-trunk
+23263 ed18d4439f084f29ed962a8b9021a69d59858d7f legacy-trunk
+23264 0fe318a789904149fc02855a2c923784b63ad980 legacy-trunk
+23265 d03c19db309477beb44e93e5d7275ded0ce20aad legacy-trunk
+23266 75b7e8bdb21ef60545c96ea81c031f9f619935e1 legacy-trunk
+23267 3faabf54b8b83d125dfcecd5ba9752406c04bf33 legacy-trunk
+23268 e3184e46303b549829de680a55621dc808d03db5 legacy-trunk
+23269 f020da781b915cc6aba3da673042cbf6b3f1c05b legacy-trunk
+23270 ca7af2a5d915b9c64f3a338e5942948f3fa15593 legacy-trunk
+23271 71895dd268e2d0638478615fb796bb60c897dff1 legacy-trunk
+23272 08446a986a562d2aa90ef359e19750d57a4aa4f0 legacy-trunk
+23273 8aa1ada33f64e2027bc4c9930f264cfaf1d56fb1 legacy-trunk
+23274 0fd12f92ce8f0c60c6572cef0207458c0776c243 legacy-trunk
+23275 b70c08813ba97c24aa0730a3d0e6964a15132112 legacy-trunk
+23276 40cc6621eddca0721bd199e7e79de2f4fca84be5 legacy-trunk
+23277 109def4a5f6e9852a6221b23d5a9658ec76bc79a legacy-trunk
+23278 729fdf0454941e960b923d9b7eafb8058f1955c3 legacy-trunk
+23279 4f747142e84c8399260a339cd8539018c033c784 legacy-trunk
+23280 b7ec985d85c6196e220b52043ffe6cd131faf93a legacy-trunk
+23281 7c5cd685c1de02d975f39e0ce74acd7a1aeb24f7 legacy-trunk
+23282 e63f97562a6291416febb4d4c08ac00ade9774e8 legacy-trunk
+23283 df1b83fd0ebbdbb7adaf7d09ce2e6bf9a0bd83a9 legacy-trunk
+23284 4bbb4d9b4d77641d0d59a92ccca28affce7f1eea legacy-trunk
+23285 6378cb117b73bb32ae9d50d9c4504d292ba505f1 legacy-trunk
+23286 e5a3f9d7766b7d0f4b9401ec6c788af5c3bade2e legacy-trunk
+23287 5c9a955ef17cda1173012cde629e171a3f14a92b legacy-trunk
+23288 104b5c9b88eae97ddb8c59162394e216998e8c5f legacy-trunk
+23289 062ac9aafe47b830b349a4bcc58197882ab7a2a2 legacy-trunk
+23290 0996f07d04a3acf0d60c14e05fb7841b118b80ee legacy-trunk
+23291 ab62d147ba90f359753888d35753f2e16f2c32df legacy-trunk
+23292 e521fc370be2050f453a6a1e980bd4470e00df4a legacy-trunk
+23293 8a6f2ee6eaba31a4ca468ad7f4a2a1a72ab4e9a3 legacy-trunk
+23294 3a4a0039edf32bf69258d9d0f99dd529d2ed7267 legacy-trunk
+23295 59882e7aab89c912440dd7b1509d372c74aed13b legacy-trunk
+23296 cd72b64aec9789cedfe7f0729ee41244f1fed2d2 legacy-trunk
+23297 e08f423f9165c05ceed34031691a4d1bc6569daa legacy-trunk
+23298 66bb10ee49612b9160db7d9aab25ae57285eaf64 legacy-trunk
+23299 1929fc696a04841c3d61def99f9075db6afec5ed legacy-trunk
+23300 7b8c11739714d2700646f63cb2b7c01aeef03311 legacy-trunk
+23301 9b818af0d730e9bc0a5768bbe8cac5c24ea86664 legacy-trunk
+23302 4c5cd3d1cf4b5bc3c81d27cbe9a8fe85757ead32 legacy-trunk
+23303 6310837ca53439177aa467ff904beab47c933a3b legacy-trunk
+23304 1a58c74662e93d64d8669e67e3b2632b352de804 legacy-trunk
+23305 6e93a1586800a79a5ef6b0fd4b7b98b8ab9000b3 legacy-trunk
+23306 4966cf793b44c062396f9cb231cf9c6278e625cd legacy-trunk
+23307 0ee8903d3fed017127cd142b8620a1f84bbad2e8 legacy-trunk
+23308 bfd4e03ad212d249df497fdf5f81fe1ecf5eafd3 legacy-trunk
+23309 920c63cfca0cde3282ad5fdbec56dec40c48c6e1 legacy-trunk
+23310 88a03ea57714f8f155dfa7e6241e2ea0e231b09f legacy-trunk
+23311 33edc99861b90d4d3f5a4104a8f31efb37ac7b2c legacy-trunk
+23312 5b1ad7acabb5bc54cedd944f82865ee742fcfb55 legacy-trunk
+23313 c2bf0b13380e304f0d6609769e94683f52a493f3 legacy-trunk
+23314 d2d835b35d475e5b75d2f4a3106df0c4d1c553ed legacy-trunk
+23315 ccec02bfe9a058f644968eadac5866a560be60b0 legacy-trunk
+23316 2caddb82ffea2f53bb98af35474ea6d5f505e49d legacy-trunk
+23317 6390139ad0825dcb1dadb72ecbc1352b694a2eac legacy-trunk
+23318 9a599b1d9d1c84a7778cede5732d14c9bc1892a4 legacy-trunk
+23319 ef3034a60a3ec2ef29dbb20e4303a425fbeaea13 legacy-trunk
+23320 f84691b114027a9a991972bd73b98d2b4147731e legacy-trunk
+23321 14c83cf7f3382e2fc0f0b1950e569b5cc89bd754 legacy-trunk
+23322 299f5fcb0ba80ecdd6d0ba6edcc6690aae6b33c0 legacy-trunk
+23323 69e820624cbc316a39e1895e0ed0a3d9d9da3813 legacy-trunk
+23324 90a4f23abda7dcf062d1e35ca4122e3cae54c800 legacy-trunk
+23325 93977f17552d58e8393cec00367ed940cc0f6d64 legacy-trunk
+23326 e01de8bc5813778af8c576c9ff2a320aa0b7a670 legacy-trunk
+23327 399d777af04851267dd07044e20a1b39ab95f0c1 legacy-trunk
+23328 d8abf9ce3225325679cc3847adec9ccd21d38ef9 legacy-trunk
+23329 511776d6d7d8685a86a4297150be306aa94a0fb0 legacy-trunk
+23330 aae5cf7e58615c47cb15fc858d71bd4a3d732772 legacy-trunk
+23331 d9250d5b79a75926cb1b65226bc3dc8610a5632b legacy-trunk
+23332 8f19b2a8c63c677970d274967c0d2152d82b344c legacy-trunk
+23333 004cdefb70d1f9dbcf2d2957d249e6cf23a57e46 legacy-trunk
+23334 9298fee446b7740ad3fc6caf348090edcd48f1a7 legacy-trunk
+23335 f48a41c970215694225a2965a49be1ceb5cccd2c legacy-trunk
+23336 4397fa5152fa416681b6526e1afc23356f65f6d0 legacy-trunk
+23337 18df32f6cea13e3e27fdf4da14cf00226e4ea7fc legacy-trunk
+23338 fdfc18d556153089d11e509dba378b73fb1ffb92 legacy-trunk
+23339 48e93ef3c5b70b8e443b7d0ce616d07b18515057 legacy-trunk
+23340 3192a32fd48f6c4c989bd170a420ce5fe9031820 legacy-trunk
+23341 dad94ca47e213914e411ad45299cfc7e7ff5278f legacy-trunk
+23342 b4161ce585e64ca1c9d21ed1ab9aa4d82feece84 legacy-trunk
+23343 386fb26e08747ebf55ef20beb8daf42e5ecc2718 legacy-trunk
+23344 3719ba5ee8446a6dd231dea7e4ef53aac0c1744c legacy-trunk
+23345 933bf68e26503a8c2b36c1823c1c77ec2d7a7ffa legacy-trunk
+23346 40d4d1cd6c84a416166f6ce2998d4e4a3e3640fc legacy-trunk
+23347 b52a63052306869b2f5f569d4925a55163f328df legacy-trunk
+23348 b28c07a1b40df99e513323c2e2becf778a74a0fb legacy-trunk
+23349 d658a15a90ad959286a6272ef805d60ae1cbf397 legacy-trunk
+23350 289c1a7002864b95c3f59eca3460f2153496b749 legacy-trunk
+23351 19abc339d3fcf2f1ba92da3027396c770179ec19 legacy-trunk
+23352 a381ab0f9d283bbab266c8884ca1a3361395a2b9 legacy-trunk
+23353 56bdd90c9fd6dd8666f74273a8b0025bb41397c2 legacy-trunk
+23354 819b6ff7e56a6b5fc601846faa2e537dc7f38a78 legacy-trunk
+23355 2a68c6e1f9c54a9daac267d7dc9715d6691bf477 legacy-trunk
+23356 ab1af1ca030c5c5bc40da4b0bbcf0b4e1fab739e legacy-trunk
+23357 6009d859fb573ecb0baf2c0d8fff6e2393654a76 legacy-trunk
+23358 d1910223b247df3d301e338cec1dc6e7a48fd0ae legacy-trunk
+23359 8a1614ceb3777ec0bae0c5a194bdb7a9af6f2563 legacy-trunk
+23360 3df4b8cdb8c6879c0bebd007a8130287de0ad22e legacy-trunk
+23361 8f25ec01018b5a865d6574945e26b5fd5f4617c7 legacy-trunk
+23362 83216ca67ebea1b340ef6377424fcd0d39fe503b legacy-trunk
+23363 334bf0baeeb7eb91a0e5956431f6f3de843e1a58 legacy-trunk
+23364 d7d84eae92ba0a129b167113498614f7e94a13d5 legacy-trunk
+23365 befa7258c200f38e89e15a3ee6f55cb0c8c64476 legacy-trunk
+23366 80e36dab21117a440b1fd7a93842f352698d2c7e legacy-trunk
+23367 e8a29d23c70a8d3cbcfb00323cad2e7d60feee67 legacy-trunk
+23368 12a787fb71df3526e0187efdbc37839d22215a58 legacy-trunk
+23369 233f9606ba8e24e032174f1780b93d11a518d5b6 legacy-trunk
+23370 8ec95ce787358366abbfedbc6b76d2d4243ae70a legacy-trunk
+23371 55874d8e0dfba8a0d6ca58a2f5c660c13b91fd1a legacy-trunk
+23372 e026f517f655b4509602dd00728285e623427159 legacy-trunk
+23373 8c371435f693c0fbe6d8fa8747db9ec973ed0e94 legacy-trunk
+23374 b9f60b825261a0f95d630840633fea2bb4ca053b legacy-trunk
+23375 0176f61af845d4c8cf2bd2a50f49470dcdd054ce legacy-trunk
+23376 f822b356c3d9dfa80a5b6db4946a773f33c5e022 legacy-trunk
+23377 098186613b057d81caa0ef843f51d82894f610b5 legacy-trunk
+23378 aed62118d632e88d35bbf6d2776c44c749114fe3 legacy-trunk
+23379 9c2b9b76a08e3ecd996826cf4fd8e7d5ad1c170c legacy-trunk
+23380 3bcdb519abf88112929d20f62647879b0fe4bbb9 legacy-trunk
+23381 3fb293fa17c5468489feacb3b62790b3a037be98 legacy-trunk
+23382 697206e747639b18aa94a78dee80b50685056bca legacy-trunk
+23383 fdfcffc2152c60eab6237eeebafa5ee13a1999fb legacy-trunk
+23384 e3a2e6076bc52650a02b7aad1802bf716873c5eb legacy-trunk
+23385 73fbcc958295f39569e3b5053b095610fe3d410f legacy-trunk
+23386 a276ae5fe8c3029b2d298e79116708f8f416cfbb legacy-trunk
+23387 ba3714191a7a2f3eebda2b7a041a4a4dc05cd567 legacy-trunk
+23388 441b2e155826c18ef726903a46e6b4ca63a0ac78 legacy-trunk
+23390 ce27d9c0c35823154aee9ad6cafb716755eab741 r22a4-branch
+23391 c2782c35e72d745b35fc3f0c9bb89b67736a861b r22a4-branch
+23392 3aac916c1505c7db76f8db06a1590831c3a1e9f7 legacy-trunk
+23393 a97fbc5b18b6fc11c980c48d276bc0bb82a15a3e legacy-trunk
+23394 fcc216c58c87fa2c62015ac362802207cad09617 legacy-trunk
+23395 727b95dd86886115a15cb9529f657da3c1cb4587 r22a4-branch
+23396 1c529128054c8c20ce1a59cd292a99c08e3b9781 legacy-trunk
+23397 83256bef0d75e3135e48714a69d667fe5f021ad6 legacy-trunk
+23398 70e57f7594027d28f8fcd44ab1518ea66933db5c legacy-trunk
+23399 ec2d4f99badc4b713cd1eb21c6be1088c4f2b26f r22a4-branch
+23400 6890071877dc860cdd963a4da745e1ae8f99aa8f r22a4-branch
+23401 225f17ec89323a8b17b8950ce991c44b9eac5ea0 legacy-trunk
+23402 9560f86c4fa4a7f30d34937c66371bc47d249ac5 r22a4-branch
+23403 ca95bce5a33efff7b8b3ca8af5356182a1882073 legacy-trunk
+23404 bde9deb59d1bc095731eb7bd6b79ec59794103ca r22a4-branch
+23404 2ac6c32fc206df914dc2f9d456e79c59653728b6 r22a4-branch
+23406 89e5f10c9f99400f2870ed870b86b93a43f5cb70 legacy-trunk
+23407 b94bc7ec7be851ebef4df3444fc29ef56764ffe3 legacy-trunk
+23408 e78c8f4e2b8c943553304e2bf2b1dbc7a35d0a12 legacy-trunk
+23409 c6fc8781055143c043ed3f9ecf3dd503da59326f legacy-trunk
+23410 b5cc586ac25aed0d82f0601d5c9a0a22cb253fa7 legacy-trunk
+23411 88da38a5f0bf5a85262f64ffafcc72d0c4a6742c legacy-trunk
+23412 206b25febde3cea0004445e26ebc55fb073785c6 legacy-trunk
+23413 1f4d99e7b1e75499cc353be5a8dc71f9ebada394 legacy-trunk
+23414 5707da90093629bff6b1bfffff51730a3115372d legacy-trunk
+23415 c8fb00f5eb5e5da8e9b409d950c4ce7fdd8ff0c9 legacy-trunk
+23416 72a5347d2f9ad99e8d904d0488563f3cd81a453b legacy-trunk
+23417 c68ef47b1709dae66da3acfdc753e256eccad99a legacy-trunk
+23418 d5d000862a669a9846460c7e120371d511792b11 legacy-trunk
+23419 bbb353d31e25425c8ecd6a34c4b0daaa0aa1201b legacy-trunk
+23420 416f0bc228e8b945979d89415b68697d1a1ed4c8 legacy-trunk
+23421 8ba3287183e05be1ad6189b929c00ffb875f6d8d legacy-trunk
+23422 2c8a5a172f47bb35a85a10d45da82ad4aae523d2 legacy-trunk
+23423 6ff531435b34dc71984fade021758d222c716dc6 legacy-trunk
+23424 bea686449595635482b04bbeb8fa468cb3244716 legacy-trunk
+23425 edb0b805e5498890ab00aa52f40aa9e93d9e9fea legacy-trunk
+23426 3b356f77922d8db5d13383e73d01f696066388a9 legacy-trunk
+23427 470c1c72a0a7a5f0b9ba0490a4ba447c363614b1 legacy-trunk
+23428 5b4f7321d9cbf81b6bd451a65aacae94e642e38a legacy-trunk
+23429 db82c0b40dfc40fee1beddb5fde36f6126f828d9 legacy-trunk
+23430 6508adbd0bb1bb266374d7b4972387c7e5d26127 legacy-trunk
+23431 006cfaac029a7684bc7bb18934641d9ef26f560f legacy-trunk
+23432 091e9e3ceeaf07b429fb1511c4eeca5051344cf3 legacy-trunk
+23433 abd6a08b2c3271afd8f044b219272d3420a770fe legacy-trunk
+23434 5fb0691fb690391e37c217c19a9b1242030d064e legacy-trunk
+23435 83106633f93334f5728674a7e38d2bf9214329c4 legacy-trunk
+23436 de3e851818a4327fb99cd0c5f3b7f911703d5d26 legacy-trunk
+23437 f100793ca9afc70fc3fb980b81b928641ed43c5f legacy-trunk
+23438 8f79fa537bd24b30a38c1975ca6905d636666f97 legacy-trunk
+23439 fef289d66e8e15823129a7c775e455fbeb3f3526 legacy-trunk
+23440 754b816284d138eecf6787ccbaf83d794615f41d legacy-trunk
+23441 8799dfa0f76ac47c512af9c2e5dbfc02dd596cf2 legacy-trunk
+23442 01a5c43f1894cdf1c136f977657933097ebda5d9 legacy-trunk
+23443 5ecc02c1edac3ac67960db9c06ee3dfe637e4303 legacy-trunk
+23444 784e21bdd9a2f9dda34fe6c3621206353f7a2e7f legacy-trunk
+23445 9de291694b1e1bd1cfccdea7b2cee600e8c88e31 legacy-trunk
+23446 6d73b54d92052014e231ba979cb39b6535507398 legacy-trunk
+23447 c6b6189a8397608c6424dc849eb0c5dfb9c45e53 legacy-trunk
+23448 4c6922f266f0794fa801552b940f75d35f6b41d9 legacy-trunk
+23449 8d79db01b2ba25db8ee1b923d9a8a4507050d890 legacy-trunk
+23450 c7817b6074b58044ca68b7c93c1b0224fe19379f legacy-trunk
+23451 8e4e491055954bbf67b048a7b74583d7e315f037 legacy-trunk
+23452 6dda498cccc4855a22df03252b31e5f65948596d legacy-trunk
+23453 58b4cfa5487191c1fb2f82f0e8ba019993d6b845 legacy-trunk
+23454 5642d37f1b161d55535847c91329531049417a88 legacy-trunk
+23455 e946c5d2fe151f5b1b2751d83b0a90ff9f3dfdc4 legacy-trunk
+23456 49a13e6e935db2966a25ed1034417e0c671481ae legacy-trunk
+23457 be548d4be888f47eec86590c8bc821922ccffe28 legacy-trunk
+23458 21060318f539af099aa4c717618298355cf57eb6 legacy-trunk
+23459 3408d929bb940ad610d2b694d66c793903501535 legacy-trunk
+23460 6de4ee477949f8d7863741f3941852c2031304d6 legacy-trunk
+23461 b4f0f10a6c5f4d37212518c62f2aa4253d8dad3a legacy-trunk
+23462 578c1bb7283992565964a08b1e4c8962f8573794 legacy-trunk
+23463 72ee57347aea653341ac6f75c73a12e1b9e9e78c legacy-trunk
+23464 f5d791c2acc950eeb8efec855ff23154b732e101 legacy-trunk
+23465 7d5ae7d7c7a9636eac7c2bdd0ee4ac422dc3d518 legacy-trunk
+23466 e5c3ca7b509924b5c4582172012fe33bf51cd13e legacy-trunk
+23467 9873c99c43f753678743c4c339ff6ed8b6974214 legacy-trunk
+23468 8e6f604b079937ba874c17e752dc2d8a226d6935 legacy-trunk
+23469 00152e68745a518dfe2e52f6589c134f4a75f125 legacy-trunk
+23470 20ba42ccb36f6765492b886802e245ab3369b417 legacy-trunk
+23471 e2da9a929acab55290e9e76825bdc2d6fc86f835 legacy-trunk
+23472 ba5aaa6bc1e56b5bd7611fde01e9568d8367c3eb legacy-trunk
+23473 e7ef881389419a6867708920219b17b4af58f50f legacy-trunk
+23474 69b941d131767535f891b10c9a03afbc77e12dbf legacy-trunk
+23475 b2f957f9c6f413bcf3979f0211cba7eae7d6788d legacy-trunk
+23476 e3d75778619e3dc6b7ef629a5f6597a73f5e6bf7 legacy-trunk
+23477 d053726fb01bdc64aa58ba74302d96f93c1d83c7 legacy-trunk
+23478 9698b71b00315ab9ab73895bc4d674342db9cb15 legacy-trunk
+23479 face1eaa68ca9b5aeeefe6826958016cda601c45 legacy-trunk
+23480 a5a330646c132ac2f43de50eac8ac3a3ef0eeb8f legacy-trunk
+23481 c0a6f53773e353ce92a2fa8113426a6f350feb19 legacy-trunk
+23482 bf5574f4f41f76fd64e0ab3c1f74ccb0a192f0cd legacy-trunk
+23483 5acd2a81d6fa714677a87e02054f131c185d5c73 legacy-trunk
+23484 0b99174d6b17845876be789355a76cf54234c2a7 legacy-trunk
+23485 abaf9ea2e560729950962c7e1737d4dcfec55dab legacy-trunk
+23486 a4ef03b5a9286d9dc91b511b00d19f08730f8550 legacy-trunk
+23487 a81db1295a9e2278ecfea20b977d5cedffbb0d45 legacy-trunk
+23488 d6eae64fdb5ac1860f7af9b5138af062b2c7b2c4 legacy-trunk
+23489 aa18c0ecc4fb67847ee454739ac5d9d1b6e8cbc4 legacy-trunk
+23490 ab5042058b6f1efea40e6952d37dd6765ed908b4 legacy-trunk
+23491 92f86436b6be633da30a388860ed4b1f6224c01d legacy-trunk
+23492 1bee49bc8d9c55ed9e6175c960bcf7df9c9bcb61 legacy-trunk
+23493 8bad55edfdf39381a66affa7b784e3385443cbf2 legacy-trunk
+23494 5a2e7c78d43345eb6c827c9f6da791666ed8876d legacy-trunk
+23495 464f9a09a91038a9dcc84109181cd0842ac5c1b2 legacy-trunk
+23496 d4782494a1e3c29ed324ee54629c546d98b6ebf2 legacy-trunk
+23497 81386a71ecce865c882c7d7a7503c7c9aedc4f0e legacy-trunk
+23498 7ea61da878af1073e1e8258d198494e76a392015 legacy-trunk
+23499 acfb278662c62c32022595057e820e945f1e3626 legacy-trunk
+23500 9ee6a98f032c313e8f089fa4ee552cf7b8ef0c9a legacy-trunk
+23501 d1671ddeace0b6441664fcda088e951e1c14c412 legacy-trunk
+23502 e7aca2a302cd7134844f991c3ad54bc0dfa03b59 legacy-trunk
+23503 2745c3dc24af29ce43096d042b7bede8d0b80e1e legacy-trunk
+23504 5c4261e744780cf00311ca6821dee98e6ed423ee legacy-trunk
+23505 aff6fcd26c15c471301b6da9c11aaa5dcd97d1f9 legacy-trunk
+23506 7cedbaaa12e474fc56827930a30abb263d1d9ac3 legacy-trunk
+23507 0e940da845bf8379082b24363567c5c7f930b954 legacy-trunk
+23508 16658df8456a66281b5fc0f570712bf6c8a9586b legacy-trunk
+23509 7160d795473e9183e74ddc1b283f9ceed9190b49 legacy-trunk
+23510 f3b3fd5abfa616dfa3c70e0373c288ec7375ad21 legacy-trunk
+23511 a4d328d5089759bcd8185ef2e519e077d8f4682c legacy-trunk
+23512 10b97ae69025c654a735c63c36800e9973c6549b legacy-trunk
+23513 1acecc908ee86b4f3d107c19eb7dc5f894046b4f legacy-trunk
+23514 1db5aa6765c01b145d1a3c69aa43024c3bd30efe legacy-trunk
+23515 b0ce92561e075bd5ab373854047dae3bedb2c3fb legacy-trunk
+23516 b85cd163cd5cd0e7d1565f16804c3ed78a446f0c legacy-trunk
+23517 d96cd38a3fec72942607dac1421cff8d9125132d legacy-trunk
+23518 c68f3641bacd82723d30a515a74b9e76cf560a8f legacy-trunk
+23519 6692855922884b51c88abeb2e29a9de5b674790b legacy-trunk
+23520 6f02569cc46fda5217fcb774d37044336dbfe95f legacy-trunk
+23521 e3f63a95455f7c02482f98bd5fffcf3fcbe80798 legacy-trunk
+23522 318589404b95727830beb5392a02e7941c93cf7e legacy-trunk
+23523 6152f82ea8238030dc57ac90e4572074e448229a legacy-trunk
+23524 1ea5bbbab7d771dca989c67a23fb8066eaaa3911 legacy-trunk
+23525 56f17810534c2d3b558d98b820cb603c9c8651a1 legacy-trunk
+23526 de29c8e4de9b314a875649f61bf362b5a92d12d8 legacy-trunk
+23527 873d584c1221390b99f15c6b4503708485a5e1bc legacy-trunk
+23528 d092abcf9c4b76ef282cbdb5bac79eea45001e99 legacy-trunk
+23529 e4e749c42f4617fe640ed14692f1400376e6a7f1 legacy-trunk
+23530 241ef8a923c7639a3f187a59eae8f94f834918b2 legacy-trunk
+23531 5934aeeb397f0efe5e9bbdf0b2bd1e7022aad2aa legacy-trunk
+23532 05250476158a655a5902499a2cd4582fdd2fde58 legacy-trunk
+23533 7ea04029d1aead7a2932193c87bfb2b72326dcf8 legacy-trunk
+23534 ce4a7e4ad6c48c9f016f4beb225ba983215b7fec legacy-trunk
+23535 612e86a4cd9f6ec3a5140261ea40dcb40e2e3f12 legacy-trunk
+23536 f0916a6dcef275ffe2ca490572fdf16dcc65749b legacy-trunk
+23537 2269cb371e05fc0cb5cf4f5480da3d7ab68997ca legacy-trunk
+23538 d7d956b47d242e2b7e60d495f9bb231bc31aa80b legacy-trunk
+23539 167e7f98b51fb37d016405087035997f0a10f177 legacy-trunk
+23540 66a56a20cfa3f6ce2269505587cede356450fb3d legacy-trunk
+23541 2983b54256c7225e61decbb2bd5e59dd274f5899 legacy-trunk
+23542 a265d8bd2f2777c1e596d33b6d99424619e56bc8 legacy-trunk
+23543 8b3ea7335c1bdc653203d31c0252489b81c422af legacy-trunk
+23544 97cfa461d793d35de79f5ba5ed4600d46ee465f8 legacy-trunk
+23545 380d4b4ee60243c223ae05a207e1c36b5a594b9a legacy-trunk
+23546 e3751af0f1dd178c2405862d1ef9a93c716f8f35 legacy-trunk
+23547 04f296f711df023afd1f21c91918ff90407dd68c legacy-trunk
+23548 fb5f1211703603509625adc32fed55afe6085902 legacy-trunk
+23549 ccb7abc714edda7e949d8127b82fe7aa04dd2c38 legacy-trunk
+23550 c853d246f3c8f700410654719d5a251ac1f2d8b1 legacy-trunk
+23551 f48782237f853288027b288667fe5f8e6b2445de legacy-trunk
+23552 5ccfe04492ac9b7346bfb4f35bc01fecebd8a1ef legacy-trunk
+23553 6e7d5ae2800fc9474140ec8bc81632c9bca9bbd5 legacy-trunk
+23554 acd8378216c31f1cc2b6607bb7caa28e18f8077a legacy-trunk
+23555 178ba33f67e4e8d1e467ded4b7035396fa349907 legacy-trunk
+23556 a43cb6c59070f80e50c67b7d96faaa58d1075ca8 legacy-trunk
+23557 b285decf0421ec669914003490f56410c234e2b0 legacy-trunk
+23558 426b379a138b41b71ab76a75d9f4183cd08775c4 legacy-trunk
+23559 5d2d1e2ec473b10250b1894504c95db319b0f16a legacy-trunk
+23560 6cc0b48049ec4b59ebd75eef6c5bd6467a54b993 legacy-trunk
+23561 79392ab2c02a9e2dd9bf931fca21610f659afdc4 legacy-trunk
+23562 6211684ed9ddf077360126ac9543ecd7824964b8 legacy-trunk
+23563 42b52793740c0df1705a1fc29db37821247915cb legacy-trunk
+23564 874bb17074b0d4df8f30ca69ae2570257f75ea1f legacy-trunk
+23565 3b3ee97633c11db049e7a2ff9ada1724ff0544f2 legacy-trunk
+23566 c5345c0abd706193064059a76d27df8b632c4c5c legacy-trunk
+23567 faec69c11640361a1ae8c19f798e546ed80eb403 legacy-trunk
+23568 e44cdef791ee84055a82e5b1ccdb3dd7c0bc8f45 legacy-trunk
+23569 08295ec58ea97dde165bde9bdde93b5ae89e2b7d legacy-trunk
+23570 1ca228e21a987a722f1446c82ec79cfa6a4a455d legacy-trunk
+23571 aa681345bfab13373d2af29a5ab41558643b3783 legacy-trunk
+23572 ca2bc5cdaa8e9ed21d462e33dcb8ef5eb1aa899d legacy-trunk
+23573 326e5a72c66028e2ba7d0b262c594b6452a924a0 legacy-trunk
+23574 b4447bb5aa0eadec956a95b7903d6a3f07e69e45 legacy-trunk
+23575 12353b131224c6acc8599669cc4e2e8b72b07878 legacy-trunk
+23576 3393d6f807f5d7b5ba31ea1d9ce29b9f6a1e462e legacy-trunk
+23577 ea1910d2c781dd0a9ddb80b430fba2739eed3f5e legacy-trunk
+23578 284eabe3b552cda3fcdd068a5668f28160e988f1 legacy-trunk
+23579 7b41f7a2e52854f29bcca078d8263c28ff150b96 legacy-trunk
+23580 2e073bc72686951a2aa93609e6d58623360dac6c legacy-trunk
+23581 4ef7eb90b69ac74dc7f4601911eefd68b14856e2 legacy-trunk
+23582 f9a66b24bfffba2e2f60969408a40e526465017a legacy-trunk
+23583 1253553fc3cc8ec2b3190f4f4383de2787c32e30 legacy-trunk
+23584 f29b8ea0b695449cb8b2c4906b8502583ba322af legacy-trunk
+23585 267c6fe0abc2eeb8b7db128dfe358c4dc066c837 legacy-trunk
+23586 5a9880156d712537e54af64fcbbb1ac96e2ba3fe legacy-trunk
+23587 bda274dde27e10264b10e538e202a5ad15fc1601 legacy-trunk
+23588 429a08e2fc782c3c6b6ce8902d19af5f8f27c484 legacy-trunk
+23589 8585535e404bcab9db4d14835d198440379cbbe6 legacy-trunk
+23590 b32d66a4b5e6ad42b8b56ccfa7ed6b792fca93b7 legacy-trunk
+23591 54f05b9b1fc4bbba92f6cfe950c7e87827f0d687 legacy-trunk
+23592 26b5f8b94872b7aff72ad7471a15a9fd077e2d68 legacy-trunk
+23593 a9763675b74c7a5fbd2b5447f0535d2a141503e7 legacy-trunk
+23594 79fbcfff57970be16a9c3bc08bc4cabe18055a27 legacy-trunk
+23595 c5247a366ff57bed888dd494d2dced87b28e6359 legacy-trunk
+23596 04fee70fed8feab94c239d5a4f37fe0239fbbbb5 legacy-trunk
+23597 86896b5f1ebc2f81b2138ab4b0faf9747cc7d0fb legacy-trunk
+23598 c70a2b57a4dd251eac245f1a5a6896327107e08e legacy-trunk
+23599 83837ac5bb40f4d5a514087876513e4e73ec5b69 legacy-trunk
+23600 1b3ffdf121509bf644141dfb901d478eddabb15b legacy-trunk
+23601 4bf3fce3f6cedf5ebfe79322a6b6f2e6ac41bb21 legacy-trunk
+23602 7096e44cd1bd29ee10f9c5ee8a6bfb93c6dce8cf legacy-trunk
+23603 85226df9a5be91e178a83c8b41bcbb2615107684 legacy-trunk
+23604 53a9572b623777e01a79bff607d8c751d1ef6fb9 legacy-trunk
+23605 14e0fe152711fa2467dd90f0737f0041af95c830 legacy-trunk
+23606 44bed254d8373cecfcfbc0d8997473da835caba0 legacy-trunk
+23607 7bd12270dc3e77cdc9f4f8b23b225e426d205327 legacy-trunk
+23608 36d148214d8e27dff4258936163d42b11a1c5e0d legacy-trunk
+23609 67a7a99f2d5ac38c636dbc032bd415d797914485 legacy-trunk
+23610 32e12f8d75d8326b3467490496d289c618a20ce9 legacy-trunk
+23611 b79ffd3fca28c8ff5a9da8beede4e4e37b8715ad legacy-trunk
+23612 425c6c558fac1aa99c459548b04cd59d3e0fcbf5 legacy-trunk
+23613 33dac6181be57c8e928f013b1ea85f510db0b223 legacy-trunk
+23614 0a915b22e006aa1cbb00eefec91d41412daa61f3 legacy-trunk
+23615 66e77585b4bd95943752390e9b95e50d6663d215 legacy-trunk
+23616 9e7a0af4c0a3b6a71c4774d8b5629e3a3b619a9a legacy-trunk
+23617 d1c7b3ede48159262024d6df2f8b055f20fd579d legacy-trunk
+23618 fdc1914406e26e272ffb469d8c2356c59d26f778 legacy-trunk
+23619 4dbb50581d903a4428b4158ce78192aedf609ed2 legacy-trunk
+23620 c0d66296627274647c9ceb21f51c72df3e49acf5 legacy-trunk
+23621 92d56ae63ed3f7d0dc530fba406afc5ce442cf90 legacy-trunk
+23622 98f597a17c907f962d832bca1024e5de400609c5 legacy-trunk
+23623 e191ceee672ffe155f5c4891862d6d76ecb0e827 legacy-trunk
+23624 8a09c855f957304105db8b612da6c02c41a5a102 legacy-trunk
+23625 c408333d37f06155602eb573025215b312fa3bb1 legacy-trunk
+23626 b997ac70e445edba3fb51763fd312f84910cca51 legacy-trunk
+23627 6b1d8cb9904ac01d4126f2d20f884ae13c29d03b legacy-trunk
+23628 b0d8306c09c51b0b69dca86c360d6450580be72d legacy-trunk
+23629 e46f69f5798b688c1b02cbc8096eeeb4de64b36e legacy-trunk
+23630 7bcaca65338824d6462732dbfbc8881c03bba295 legacy-trunk
+23631 300b1d8bfa4de1d35131dea865b697829f6c8a95 legacy-trunk
+23632 9e72bceb540b54740f4dea144db2ad9b9945641b legacy-trunk
+23633 8830be3209a2ad1bfd3a416701566b9ae2fb257a legacy-trunk
+23634 abfd17001e8f5efe1a739cbf3f263a7ea08d8f6b legacy-trunk
+23635 8ef3e95182c36dc13d5b52fc15d54f8054d894bb legacy-trunk
+23636 dbec863d33d7ea35015c40e05fef9e94891cbbcd legacy-trunk
+23637 4bcc231c1a41a4e293d3e6e22b4d469b4c1e82eb legacy-trunk
+23638 94983942c94b9b7eabe31e929a7bccb8c8b78a52 legacy-trunk
+23639 3ab3b535daf2495f6ea09d2dcc6fcc9079052c91 legacy-trunk
+23640 061da22f42039ccadabd1d34ec57e7d7ad63faaa legacy-trunk
+23641 9c2d444674d0901f594f5e2836cf4c85889da8f7 legacy-trunk
+23642 2f89b344fdb3dd5c84c27dc59fb8abf65c6f17df legacy-trunk
+23643 aff8d14b28ada3d79ef0b65a52af895e3a425887 legacy-trunk
+23644 3adc3a14cde4127ac1f4ae4df9b40d7dbfa27618 legacy-trunk
+23645 b4f829941f3df411e1143a11cdc7dd18082e6705 legacy-trunk
+23646 be08734b0afd2101692ad89a2245d9116a86c597 legacy-trunk
+23647 3b45c04a4833be90ce7c4d54b8c830c8720ee615 legacy-trunk
+23648 2ba4018de2e31064809b5c6d53e24b9f7744577e legacy-trunk
+23649 be58eee69a949443b0a9eef889468fbb5202b49d legacy-trunk
+23650 3c01c34d07f68ec16ca4c952c72a887a8d5ad5b7 legacy-trunk
+23651 f908b063f28b7975e5ef885bd6e962c72d81dc8f legacy-trunk
+23652 be8cba5a3b7be879930cda3de3762ca00d96fcbb legacy-trunk
+23653 b47168178d879cbe329380d7d70b717274df97a8 legacy-trunk
+23654 946bebd00132c3bbd4037820bcaba00de7a2128f legacy-trunk
+23655 773a130b330ebeacec93b144704facf62c638997 legacy-trunk
+23656 853c268bf24795e7a25beacb743aa31546c108b3 legacy-trunk
+23657 c27cf913b1d691030d7e2d33e71402fd88d22323 legacy-trunk
+23658 ad1f081280aa009f5e32fac539e891d87b88efd2 legacy-trunk
+23659 2050877c0c363ac1811ab5ca3105517f61405f36 legacy-trunk
+23660 7294932d74ecaef5c53c956d58a46c2aee6fa481 legacy-trunk
+23661 9fe97548d9521fd8ea8497b28bbf4c694737ba38 legacy-trunk
+23662 c9a212329da6f0ca1bc7e1f38aa2ee6864faaee0 legacy-trunk
+23663 65f60d3fcdd77e02e73025a44ff220c7c2300452 legacy-trunk
+23664 65790562033c13cbc82b0fd4c18ee7ac27a78c46 legacy-trunk
+23665 b74610c92d8b826d0b3bdebeb27ec210f2413360 legacy-trunk
+23666 f57f17cb41086542bcab0a2208c8f9203a3dcd66 legacy-trunk
+23667 ed2eeab802d2c49bd1549402738f05fd96717f02 legacy-trunk
+23668 9ae78ef858e2ca9bbea6fb02b09b632e1f1bc674 legacy-trunk
+23669 b6a5fecbec3cbea6f8cccc0c09628fbf185d6a39 legacy-trunk
+23670 c3a937cf60a5f5cda7d65bb315141aabab239841 legacy-trunk
+23671 6b104083f5f33a90b8e7cf17b6a8102e5549053c legacy-trunk
+23672 469a8e1f7edf5137f0c32214cb8248370c27aec5 legacy-trunk
+23673 b98185c882e4e76fa1929a8c1a585ddf4a9bf690 legacy-trunk
+23674 2a4bb7d19b603fe856d485ffc3c55434586064d6 legacy-trunk
+23675 4dab61f484581721fb09dcbe627797b6d5fdc9fd legacy-trunk
+23676 698bf7c22bfeba62ceece79c4ae987848a52885d legacy-trunk
+23677 1ca627c4c105f21fbd2c27e955d3978835cf5b18 legacy-trunk
+23678 e4d0b1f94eca8d6b23245725463db8ec31ac7ba6 legacy-trunk
+23679 621c7703e8b7528e9df9ba3738bebacaa68663bb legacy-trunk
+23680 5900a9d8084809269c55bbbbc894d0be15595b7f legacy-trunk
+23681 c168eda736e44a7c8b4cdae34b216c7114186b85 legacy-trunk
+23682 903221852c3a59c3170736ea243ae2a138de603a legacy-trunk
+23683 4f3d1240830e6f53038a802edda040804d5b5a1f legacy-trunk
+23684 3a18133f990643504b48e0004bc59184d2b2f234 legacy-trunk
+23685 ee89567bcab4450a51ade88411a78a528112c8a4 legacy-trunk
+23686 f618607e8f98420d6888c4e47772be8228a9a800 legacy-trunk
+23687 4698a3ec5fa8cfad9b4d795139e4dadbb646f596 legacy-trunk
+23688 6da03718c1330c3c221187873aa9c978819e2a0b legacy-trunk
+23689 7d1f490b6cb172824f9ddeb073ea4df515249f08 legacy-trunk
+23690 518e30f90d1f7d8844e27188daa59cca56c4682f legacy-trunk
+23691 4712bb62cc25d05b2d0c76a93cb3bf58aee8891a legacy-trunk
+23692 632b9d3a8d1a7b2906f7c82b1741fcd6b19642aa legacy-trunk
+23693 b02986e9a6be47226642b7e5ed657de18bad8e54 legacy-trunk
+23694 5d5ad951a6d6e170d4f33b6429a68ecca8ba9096 legacy-trunk
+23695 cee0fe5fce115da59598a84fa9e8c27b3ce05f3c legacy-trunk
+23696 56141b86a7f2c95a12f66deea4982f74a5359cb3 legacy-trunk
+23697 7f51a4b7deb440ee2fd5d6c473c4cf101d163d5a legacy-trunk
+23698 ba2850408f0a260d58d9436ca2434a4ef4bd47d2 legacy-trunk
+23699 5000b5d4c3265f5410e778b33ad7c2e25387bd4a legacy-trunk
+23700 20118f4129defdfe319fe0879781077fdcd50bb5 legacy-trunk
+23701 358397b9070f6a7ee95fe3934097a0fdf1b979c4 legacy-trunk
+23702 08d7a6756bfed92a888a80b3af4ec97c4566791a legacy-trunk
+23703 85571d5f6545b67ba6ebf8087af7a640eaf80e1d legacy-trunk
+23704 9be2cc6b9959d831c51ab06e04b0134c699f2246 legacy-trunk
+23705 562834ed8babdf7ae31cb6b9318189f4f91441ad legacy-trunk
+23706 467ac453ccc32c7eb63d2b9deda5f2847acbf7b2 legacy-trunk
+23707 03624d7484fa0600e0c48fdeca74a184217e75e9 legacy-trunk
+23708 bc905a11c148a48bcb5fd40b1335a52d9d649f30 legacy-trunk
+23709 27ab0327b2fc3a9e7a7bd03a8e863c3345ff4912 legacy-trunk
+23710 855245bb4d4276cef78a2ccedd9ef6e63b546667 legacy-trunk
+23711 353a3e9f8516c1599b78fdaa3e368348ce50ca5b legacy-trunk
+23712 b1a8616f13e4cd726be5580398f744e04ae9d38e legacy-trunk
+23713 69e65e7391b817bc04846b7e8a1bf70985f40270 legacy-trunk
+23714 b72568a2c17cec23089114ca1d254d3dad45e6bf legacy-trunk
+23715 99b2bd25bb12d47a01fc14314459555ae616ef24 legacy-trunk
+23716 41bed1f6d26ceb3a757b3ea213398c2f8156f2bb legacy-trunk
+23717 64f4ac606ae5313d425ed8a3c0086cfacb12acc4 legacy-trunk
+23718 598c02ab062d43ffcc66f1de94b47c0c163b5bd4 legacy-trunk
+23719 ec9596687292963e36e4bad4b79d1884285f75e6 legacy-trunk
+23720 bff6c2d76f336c52d6deb48c6791433ea7a03fba legacy-trunk
+23721 4f71dcfd0a9370ef7be426b4398727681827c72e legacy-trunk
+23722 a96235b2ca625b30a68646a6384eaeac3c68d97f legacy-trunk
+23723 c68d1855daa9ea24851aabc1f309c875b979487b legacy-trunk
+23724 ffbf94fd9cef8e2f6e8531dace03e31ee2ab0063 legacy-trunk
+23725 7e71eebab4ea39e99d626d72cbb395aa5e976a5a legacy-trunk
+23726 2f0c5af4d5ea07fb56a05b6e6d15ba4bdb1dd4e4 legacy-trunk
+23727 ce12bb1097a4167534e43c464f7f1e7651c53fce legacy-trunk
+23728 98df0115ecf9012c46cec999aa96c37c1d65325b legacy-trunk
+23729 c72915d8aac7289f86cdc8b324014a4fa6e5f43a legacy-trunk
+23730 60e12f83d2d225e3b1a892ef04f1b96a8646d3eb legacy-trunk
+23731 5b5c15a095cc7abb515f487154e444b9e9623210 legacy-trunk
+23732 ebfd87e87884e06f802e10daab2e93189ecdbf73 legacy-trunk
+23733 c46e94fd6986b6e0ea66f78c044351e13837fbe4 legacy-trunk
+23734 8964ef84c92f4d2178bb38fe41d1f9fa34c58e4b legacy-trunk
+23735 bbdc0abfbb1397ff51ba9734772bcce5ef2d99ae legacy-trunk
+23736 dc7204dd2686ea3ecfb928ad8ef069543d252089 legacy-trunk
+23737 8d5c000e0e5b44388f533392be26097ca385f3af legacy-trunk
+23738 a5a30ba2899f57e9def61fc79b3c5c24c46bb611 legacy-trunk
+23739 2f095c3e007dd776d47449cd81a5bc66fcd09b69 legacy-trunk
+23740 0cb287cd7547a847c6243eed6561455f222505b6 legacy-trunk
+23741 c23989e22ffa50114fb15ff882df3850fb632c4c legacy-trunk
+23742 071cfee8d8eb9ac29683aaf800437e46a8041514 legacy-trunk
+23743 769df85d70bc13ff0dc425e43f46d4ce74e71c4f legacy-trunk
+23744 dd0cdd3defd839f88c6bfefa1bb00b4e08f175d0 legacy-trunk
+23745 cd96c4b01ff0f0a8313ec031fbd3604a682b01a0 legacy-trunk
+23746 8f473179b0730094f2a58088f4c0c2e7beb4e479 legacy-trunk
+23747 5d678356c89429b2e4b93ca9fc4af10c4463efcd legacy-trunk
+23748 1a9494f9edb270217d68008488209a225fdd9b9e legacy-trunk
+23749 4af8d24fa691eea1a0e6a1f50015ed3ea9ae44d0 legacy-trunk
+23750 4bfdbc82310f1bc35a6d0b6e4ad2a52040f49a67 legacy-trunk
+23751 b69273bee0950cd7c90b223205ee3c6e6efbdd76 legacy-trunk
+23752 be67b66e5fed0f7266cee793d16f9dab0b84cc25 legacy-trunk
+23753 e09fb48487653528fe6412c3c33461a85b2448dd legacy-trunk
+23754 7cbd407be6e7d3d16d778642ef122a7006021b25 legacy-trunk
+23755 149a65fa427c34959b621dffad72586f7edca80c legacy-trunk
+23756 bf4ff05eab5207ad066eeb20531412a9959d5de0 legacy-trunk
+23757 1d9e69fcf0f8d4f51627eef21e9edcdd1bad3687 legacy-trunk
+23758 c8b0e99451599f5c77178b162ead634523c1e5d0 legacy-trunk
+23759 68fefa982c5c291e979c7c262656a5c51d0b0df3 legacy-trunk
+23760 7cbd2887f60fce3e4a94692a09054fe3fb148917 legacy-trunk
+23761 a9b19db180a2600b021b3c681e6bfc9d435369d3 legacy-trunk
+23762 2bc4183fb57e69fa160dc241d48ec894a503f496 legacy-trunk
+23763 a0c8c2e5a44d0872ac523f8d8b98f7567414f3ec legacy-trunk
+23764 fddacefeeb36dfa26b1512a571eda168883fecc9 legacy-trunk
+23765 733cb268ad2fb0b7407cccf5d85a279fe374b80c legacy-trunk
+23766 6426a5adbf7753bf06c7c75dd40a16decde477f0 legacy-trunk
+23767 84331c8d98a41add90d7b6714ff43f98f9fe5bc5 legacy-trunk
+23768 e0864aac9b6b25d27fc15daf9c689aea973550fd legacy-trunk
+23769 93841c5f475b100a8c254fdfda6397d074c24551 legacy-trunk
+23770 97c75f981a9e6273d73c6f2dc17b2230bff1075b legacy-trunk
+23771 364c238a68710fd94632bd50860e1d8fb53a4b50 legacy-trunk
+23772 8e0c31849c648e7d36efbbd1ce7581bc5d419b61 legacy-trunk
+23773 dfc9f23c8655345332315dd724b3aea57074d373 legacy-trunk
+23774 bdc486c66df04ba0d7449191a76ec976e8ab37db legacy-trunk
+23775 c13a473ce1b7eddbb08df08b63cd04f889500542 legacy-trunk
+23776 dfb2efa559672b87eea0f57b5e59685066b5501a legacy-trunk
+23777 62b207588866cc6f50e5508f3aaf31be95c9cc09 legacy-trunk
+23778 f938cd1ba94ec4e3273005404e09aaa850006b9f legacy-trunk
+23779 06f1254d22808ead182023aa5c6649d0081b7e6b legacy-trunk
+23780 d21160a921791389c12856fb13e50f349b5c3fe4 legacy-trunk
+23781 d51fe520e5fdc020c3275dba4002102bb2876e18 legacy-trunk
+23782 23dc7bb0be4fb77868e05396f15101c95e0e9489 legacy-trunk
+23783 d01c5f29915a28c838a47252753e23f85f785b19 legacy-trunk
+23784 bc3c8419874c6e1f389cf5c8797f20180077aad0 legacy-trunk
+23785 cb87bd97f740f1751affe4801e251b29d0931f7f legacy-trunk
+23786 3d13417a63e0fd735a85e2d1b06c8ee0717c8f01 legacy-trunk
+23787 54a8396045403c0e287f2ecfd1b38a70fd0e2816 legacy-trunk
+23788 fd56144a96e8fa644c5e29189b65391e6a5e593f legacy-trunk
+23789 c948bcb0415e0c32ea41386bf8443fdd04cc9192 legacy-trunk
+23790 1f3c1e831f216a49be6c08323a730629cf7e0957 legacy-trunk
+23791 3d3b6b4cb79f399b22e2149a77072a926173f215 legacy-trunk
+23792 cb334a8c8dd23a566fdad0bf7b0445c129dae2c7 legacy-trunk
+23793 dbfed3bf160eeda03d3a3201799a31a3535e8436 legacy-trunk
+23794 f0e33c57e46e801014d978d10bcaccb456d9f92b legacy-trunk
+23795 9b84efbf6b0d0b7767332d234c3e7e46df412631 legacy-trunk
+23796 bc138bc73cdd1c354f719e763367a796c01ad311 legacy-trunk
+23797 4f7befec35b0197f4b79072a58a189ae42876bf2 legacy-trunk
+23798 c2005bb879b467d5479ff32acc27f58644cc7358 legacy-trunk
+23799 80b8bfa04406bf3f4915f7baa2bc6c40f7134814 legacy-trunk
+23800 4b1615bf6eb09d31c7621c65a9ef913413e939b8 legacy-trunk
+23802 01af91aeccd44725424179e27af6831f39368959 legacy-trunk
+23803 fe1b6ce4eb936359892c470fc79522976a9440eb legacy-trunk
+23804 2d599a36b67a8c30cb98a43def49c7edf37ed9aa legacy-trunk
+23805 ad2662095d7724691d0c484aff46c2bd296d4880 legacy-trunk
+23806 f567b45737c0e3480e28d12f1102883e05216cb8 legacy-trunk
+23807 294901ab8630b5dc09703cfc07708a246fae4ae0 legacy-trunk
+23808 a8995a6de8d005e66366e7315c60f83098aad402 legacy-trunk
+23809 4ba4548ba9417940de2bb83397c12f3c9a631396 legacy-trunk
+23810 36714b98fe5120e65271d8031e7daec9fe598cc8 legacy-trunk
+23811 73a1395a23516490969a0431f6d339df1814f432 legacy-trunk
+23812 a12ccdbce8da93eba65b8fa4e429c51467897c68 legacy-trunk
+23813 a56427e5c5e17284c22f927ef1cb342e3e217ee4 legacy-trunk
+23814 d8825475b80072e8ea9b987fe86cb830b97e0382 legacy-trunk
+23815 6a5a10a5b5265dd13e66508bfa01fa1acfe5ee18 legacy-trunk
+23816 c9608c790f6f5fa8513914a349e4eea5c7e97134 legacy-trunk
+23817 65dd6157f99934ba41070f86c8f63eac90d2034c legacy-trunk
+23818 722bb1fd31ea096fcebf0cc01d1f86e9da3bb5f1 legacy-trunk
+23819 0336ee5b46d4222ec307a4bde6f7fb5c2d9aebd4 legacy-trunk
+23820 949ba47e8f30ca7f3d638219c539fd17cd7ee0df legacy-trunk
+23821 87e5fe056d299f5ea2aac52d8a7890d6142ea771 legacy-trunk
+23822 ae507cf67fbfc43d2f19189920081fc470d27d79 legacy-trunk
+23823 4a257a58be8bfb7331af76a6b902948d1f8d4359 legacy-trunk
+23824 da81125b2af8eaf10bd132fab30ae76572bd636a legacy-trunk
+23825 473adbf52171848d21733161483a30e556028724 legacy-trunk
+23826 ec72b63d269aeb9a329284b00d7e6ab5ecc7a64c legacy-trunk
+23827 d0621a669c5690d06bde2850e6b36d695d334c4a r22b1-branch
+23829 ec05afafe13b95d7f64aa512aab76e7e07c780f5 r22b1-branch
+23830 377b09ac726e7ea2e26584271b7a3da8d6fffad3 release21-maint
+23831 9058e49c6c57d237b90bac640e8c504e80cc02b4 legacy-trunk
+23832 ce2a3f15615f6ba3af7273ec1353224cbeb99abb r22b1-branch
+23833 8dddfffb9f2bb7e4c8f7c1c92e5bf276e215361f legacy-trunk
+23834 6f9902ace18d8eb6f0b802be6926a3e3688bfc66 legacy-trunk
+23835 08f165f135a8a64360e4d82359f84425db8653df release21-maint
+23836 cb8e8b42cdfbeb5e174304c41f9a4f9cb8478e61 r22b1-branch
+23836 e9fad55ef704dbebcde5e14cb8db96af84c22e55 r22b1-branch
+23838 61809c514ad8069ef24323620d63c4ed2cd4ec0f release21-maint
+23839 805f184b6de09a529ca2037c163dea5764fff2bf release21-maint
+23840 d06446d4e78da23408bf5855b2308cf938ba65b2 release21-maint
+23841 711135ce1e54f5e769115012d1c9d3fddc37d319 release21-maint
+23842 541f825c7d637cec9dcfecd24bc6856a916547ed legacy-trunk
+23843 a9baba16ebf39d1c9987000d77c8fdfee3eb1ab6 release21-maint
+23844 5f4950dd37c8a9b73c4216ba778e42a1315dfa75 legacy-trunk
+23845 5af6c89c8cb75f337d305e976879290039b3f4d9 legacy-trunk
+23846 151e45e98c11d356301957a300e523f81a23d38c legacy-trunk
+23847 2cb32f7f78c2d1e4fd6ef81b26cb247ea83dc0a2 legacy-trunk
+23848 ce88eb465ce76c13ad09d911b0ab1dd91a7f38ba legacy-trunk
+23849 9058bcce69e318c80d44fa03af22ea5c2b026f60 legacy-trunk
+23850 84a586acdc023733aae3fe1da8ee3133b37ca53e legacy-trunk
+23851 376ee174ecd077421169b89033c04774e4b457bb legacy-trunk
+23852 bf03b8e3ef93af1150909d8c95cc333cb46037e8 legacy-trunk
+23853 80bcc8b7d6190eb73e0a11f41f6404e3eac47a5d legacy-trunk
+23854 b5ca0687ba6a8096b11bbf8d6e6e95e0bacbfaae legacy-trunk
+23855 887a93f9d5d5d9cbfa38c4bebd232509cf34fe0a legacy-trunk
+23856 7d1257485aef2e7b80f71d7fefb8b10e01ba28a4 legacy-trunk
+23857 9bd603d434f552ab833b0331555755081f7aaec2 legacy-trunk
+23858 325d513a50bba8e900bb6fa42eab2604cade22e4 release21-maint
+23859 aad762503d11e8c2443265fa95432e3003c73fbb legacy-trunk
+23860 d3298435d85b584b6509fb08bbcc2773ecdaf763 legacy-trunk
+23861 050ed8a21cde5ddf3efb5ad5f332e8deb614e022 legacy-trunk
+23862 9246b6c7e7422bc6e923573c02a2337561969680 legacy-trunk
+23863 82bcfac896425cc8affd5c736d16e812ec25c867 legacy-trunk
+23864 25d764d881491c73d10198e48284e1ee20a4f55c legacy-trunk
+23865 0d5e6fc0481d614acfc9024ed37dbc15c030a505 legacy-trunk
+23866 c4d9d86745062ea1e324b1947b1779a81a4a990f legacy-trunk
+23867 ca5f2ff839792ac82e95b99a3e8e51b8d023e22a legacy-trunk
+23868 b47e15fa43e851c36072b8f6888ff0517cb2ed61 legacy-trunk
+23869 eb6b953ecf7ca7ef353c8229531c2a7b9018826d legacy-trunk
+23870 ff57a1a370b3501f25226e2ad26b6c72dc4ca420 legacy-trunk
+23871 eebddd3b94a530ca91503a45a8e6b25f02edf009 legacy-trunk
+23872 5c1dfd92877d457d7511a5cf7f48a9261e714db3 legacy-trunk
+23873 9009c25694d1fc1bbce55a0da0d60a7910bb874a legacy-trunk
+23874 4b79d7d91b4f9a2a3e93ee2938d954edcb7ea68f legacy-trunk
+23875 7945639df26500cacddd04168aa8ec44b7c21b75 legacy-trunk
+23876 73702d7f13b1b159a38eee9e70feeb97ffd961a7 legacy-trunk
+23877 2d8dbebf81e06a17cef4bc8fdff43f36d85711ca legacy-trunk
+23878 7f3d0cc2188996ff031db7a3bf72a998999af7cd legacy-trunk
+23879 689d0bbc91b139259273f4acabbac1013679d6ae release21-maint
+23880 828cb0c2c4805de314db32044543d539b58d24b3 legacy-trunk
+23881 7dcc8a28133a22b0943e851b58bab7f97aee42cc legacy-trunk
+23882 716a406e9b4fb3d5a747095f0de4ebd8e8fc9d5c legacy-trunk
+23883 bea9404ce62cd2483acbd7f3815eb1be012e3da0 legacy-trunk
+23884 bf4b37518c14772ea23eaacbf300273334971a62 legacy-trunk
+23885 403dd59ca7d5df012038dec7b349508ecadaad41 legacy-trunk
+23886 302a1c025dc792ea882b9407034f8468344af87a legacy-trunk
+23887 a3d6b31e8bb9fdcdec40d824500edb590a54bc6e legacy-trunk
+23888 b9745229bd132c7249a9aedd229970fd63acda3a legacy-trunk
+23889 57b51966a4f1f06f3072e691d98c78c704265195 legacy-trunk
+23890 0b1c1394bec61193a02da9b0567f84a5f3362ac8 legacy-trunk
+23891 e4f5138292e659be265fd700b4a096a285dde9f9 legacy-trunk
+23892 b6f8197f4df784aaaba68e28fea3b404d69cc0b3 legacy-trunk
+23893 aa5647569ee2ab3415fb2d0836da331a3036e9db legacy-trunk
+23894 4fb7727e4f475beac0840ef5a41da6da5e372e06 legacy-trunk
+23895 7c381dd0779ca76c9fb0615652e87969b5642cda legacy-trunk
+23896 2c1a4584a704335e0569e9905068644ce09fe1e7 legacy-trunk
+23897 3d299b15651118cc98fef293685b3c96259b852c legacy-trunk
+23898 97b18c09d22a2a346417a1c107f25d857de775fe legacy-trunk
+23899 1598588ef1adb7e4f8d9416cd6251e9a6e5f72a7 legacy-trunk
+23900 acc7e3b4d042fee5a7742339814ce87ba2c9e56f legacy-trunk
+23901 e496b85229c79bd02a9c76c92378877ca1bc68c7 legacy-trunk
+23902 d5b31ef23cebe31f36b710ee4503f4e27a7655e2 legacy-trunk
+23903 6c84d55abb58a1357a70c88aecc39af0757655d0 legacy-trunk
+23904 fed8a18894f5f9bbd4c85f50e305157bd41edc1b legacy-trunk
+23905 899bebc89047e5080b3209b42d20896d5f5136e0 legacy-trunk
+23906 04f2801d99770f59347ca5ee5e1d9fce71a939c8 legacy-trunk
+23907 3f80c91b5c3cfdb54e8a0f7be6eaff1d7d4b8df4 legacy-trunk
+23908 8b9e2fbcae1ffcfbcc24d759601bb5f8aab90402 legacy-trunk
+23909 6f2cb18068ddf90652e749976783cc9222fd4134 legacy-trunk
+23910 aa46c66188d36c955023d12bd0dcb9525fc71c2b legacy-trunk
+23911 71a9b053ab42b2cd2bb507984cd09b45b3a7dbde legacy-trunk
+23912 c80dafce1b74a6adf9432327ace09f50b53bcc6a legacy-trunk
+23913 ab833d9a09b980af0dfb97717006859f1b259ef9 legacy-trunk
+23914 ef78ec602a4063807d09cf4fe091bd64ae36e716 legacy-trunk
+23915 7c41c4fbf9c73c2a75f431e37855752f786ba9ff legacy-trunk
+23916 b078991cb56a3d03f04c5d240a25e471ab03578f legacy-trunk
+23917 cabb568a558b1e634ce5e3f50112b59748286e51 legacy-trunk
+23918 dd78b1a71f3eaf731215d2483ee5aa44e704e9d9 legacy-trunk
+23919 fec950d8c25d7b4fab2c93148b24648cea331e95 legacy-trunk
+23920 52957a2dfafe690459896324203b4bfbed1c30c5 legacy-trunk
+23921 eb004cc008d2776c8a810170a137b5354eb11f31 release21-maint
+23922 8deb3b5fd7c1789fb6d29c983a48f84529ec8352 legacy-trunk
+23923 2d3cee9f163320ac3460785d031eda381654eba3 legacy-trunk
+23924 757bcfa201dc198a46278227b39d432028da7008 legacy-trunk
+23925 edd9d0b3c47efae7fb2010e133290b56eaaf0b7f legacy-trunk
+23926 7344687bf2c0ab8fdd9d50d717198f7f174d7ecc legacy-trunk
+23927 d0eb2036eccaf264e95fa5aa87af4fd92d4f7d4e legacy-trunk
+23928 393556adb2950a3772b41a65fcd86eabf1bdc9a8 legacy-trunk
+23929 dcaa2c89430e78fec11a7fafb83b97a7a920cea2 legacy-trunk
+23930 ce13aa31e189a0981dc45c2f2566c07b145ad21e legacy-trunk
+23931 c05d4895234c10eb9df1e31a928012c69de78a46 legacy-trunk
+23932 f7009167dd67c38dd04ad2563097736d808a8119 legacy-trunk
+23933 c478a5091f3fffbd5a98923cf98baac218bd7376 legacy-trunk
+23934 5cd8c87a88aed81b474a0eaf270183b51364f03f legacy-trunk
+23935 0397a75a5bfdd5fcfd2b14bdba5a8a4ff5cd59de legacy-trunk
+23936 3ce03e2f01ef7f016f2418f2e277491d78e38d15 legacy-trunk
+23937 88a242bfb23ab0a15d94ab800d17621e9fce0016 legacy-trunk
+23938 98e5d901bfdfd9208834433fef9d2805a87d8109 legacy-trunk
+23939 3e9b85de447b9a607c6ce2974afcdd99b091f984 legacy-trunk
+23940 535dc3650becf53deaec8cf00fccd46fe4c1ea37 legacy-trunk
+23941 3cfd578f648b248edf2078bdc1d24eb0b2904d67 release21-maint
+23942 3fb403eaede1e627ae2f3c67a19706dd710ab499 legacy-trunk
+23943 d951c2de095caec496eb88df51d250d92e4a5939 legacy-trunk
+23944 af9f290264afdd793b47c370a69e39757cd27b8f legacy-trunk
+23945 aba7a4895e4dae491ceb0418162c92cfb128dbba legacy-trunk
+23946 7418e0d5fc010fa1879d066079568aaf586b16f3 legacy-trunk
+23947 ae94b5f7dd30f5541019cb1c858b4925be3e2347 legacy-trunk
+23948 f614825d326ac278b3b796d2114c00332a3f5a30 legacy-trunk
+23949 61e8f01de821258563e447d9cbb12e7babca426f legacy-trunk
+23950 e89c25ca6b29f6050676e1f6b7ceca53b5839e0c legacy-trunk
+23951 e3c24fc20a8dbc06c44942848d0cee691d564b77 legacy-trunk
+23952 a0f1c2d2ac9e4a230332349c47d72550c53c5c4d legacy-trunk
+23953 f31b12a42951cd757f22b201025f5cc53bab373e legacy-trunk
+23954 505dd34e0eebf9f828936b5952af7ff85f89af2f legacy-trunk
+23955 433ae48387035f19673f1dc71d570d453ce4cd96 legacy-trunk
+23956 99ad2a9d20e1c1278f0acfa86962061a92ba196a legacy-trunk
+23957 311a2abea8a47ac32a3534b1e59f3bc79a7c5407 legacy-trunk
+23958 367cd8e5df479494e7ce075bc1f5a4543f10724e legacy-trunk
+23959 99ee719197ba7ec0a40d3571f8dd9d19a0917644 legacy-trunk
+23960 a0332ae848e26fb96ac60379eb631db3fba2c0a9 legacy-trunk
+23961 86fb18fa346f8a8a6978744f276b5d48e5fb1766 legacy-trunk
+23962 c3e0bd20775cc49f4344b56c2a52ba413fce2b43 legacy-trunk
+23963 38380d5f27d40b2cb46dc15b804be74432865ab2 legacy-trunk
+23964 6903420f0a825acceef498ac9c8ac5b9075e3041 legacy-trunk
+23965 d02068d163cfcedec106279ead27b9fb0a38db30 legacy-trunk
+23966 adf565f0f8ae6085ee80cbbe60a7fa0ac8a870c9 legacy-trunk
+23967 398135e400c7f83b52d976a7b64f7f3f9e1ab5b1 legacy-trunk
+23968 648bc74c47ab7262e3f81dd3a94610aecd22de42 legacy-trunk
+23969 b229208a2a72738b98efdd0912496dbc2b6b58f9 legacy-trunk
+23970 fa0bf6c79e042a02af33d828c089a3470928a346 legacy-trunk
+23971 5de3a5947257bbb144648d1363f4a3c0260baa0d legacy-trunk
+23972 5f6850d1f9e8523921dda1a48b9096466dc377ea legacy-trunk
+23973 4b3efc7501396fc201d638645d488dfec7dbdb9b legacy-trunk
+23974 b3a00d3165bee2308e1259352eb4c9cedba7ab2b legacy-trunk
+23975 2925e27a281c521a3bf1aa1431b63dc99aa39871 legacy-trunk
+23976 798f61997c08d5d2d041edbfd174ba51e81f2230 legacy-trunk
+23977 4133abef5abbd1a0fc9ad832e45215c14e2592d6 legacy-trunk
+23979 184b8b9a2654cbdfcfcf57c46b7369206c722414 legacy-trunk
+23980 e912b683ed3e1536f0b4c9f5e6e1d3b56a20f544 legacy-trunk
+23981 310450e74f2f57ddfdbab2ae68a92bb35e477465 legacy-trunk
+23982 a44cc0c21cfe315425e380e646c01ad2d1e33337 legacy-trunk
+23983 2890769b1e696624f6f93d0a981dc41bbbc4de35 legacy-trunk
+23984 a6a4bd2f06d0f9fe284710844978f456a3fbf4aa legacy-trunk
+23985 7f4089519926e5c5a143317244cb4adbdf3c1524 legacy-trunk
+23986 091f9656d79b35918f9042cab678eaa218251ca7 legacy-trunk
+23987 5e6f8187bd4893f395450b2f1c38485ef78307c7 legacy-trunk
+23988 dcf769c12d8b412fbdb7157952294544bdeceb50 legacy-trunk
+23989 84715d52d954e9d507947b565bd000d0b934ebf6 legacy-trunk
+23990 c6384591d846ce6a1b3d66c724a1737e352364d9 legacy-trunk
+23991 5e347e4e05bf5ecc8b0da423fd4934d5a68dcee7 legacy-trunk
+23992 aaefc2f21baef1ce39e82d0b3494fcaad61f1fb2 legacy-trunk
+23993 acb854b897bb6154f849a390a6842ea3dcb97240 legacy-trunk
+23994 676f106a50023d410f25a00361b7d41238f102ff legacy-trunk
+23995 6ac45244c41e0ae7cd5770c58442533fcd3c0bf9 legacy-trunk
+23996 f224632d02603f1b68436ef4267b9465b45dcb8f legacy-trunk
+23997 7130750a62222e44fc4b1ec1c484de24671a99ca legacy-trunk
+23998 587b74854f8c050492be3a9fee609118b2cd1a12 legacy-trunk
+23999 abd71e89840f77841f0548f6c2dae9a18f27044f legacy-trunk
+24000 cd835caa506c092b104a1f266ff586164eab7e32 legacy-trunk
+24001 cd600039a123e0f7b5573aea0b2edaf5ec9a30e6 legacy-trunk
+24002 73cabe664c11eb6ba7bb2b4217f4c70c6d515f9b legacy-trunk
+24003 8359c1189f73025049df91e0dd0c62eab55d62cc legacy-trunk
+24004 b3b2fa76a3929ecef06c1b793801e3a7e286698a legacy-trunk
+24005 635fa14eda509a81eb3542c940e049f51905c433 legacy-trunk
+24006 b0628043e537dad784a501bf2f62690d9f4dd87f legacy-trunk
+24007 faa2726dea37157837c8b92962b206cc2136018f legacy-trunk
+24008 a7884e7eecc9b2589399171c91587cb2eb11cdc5 legacy-trunk
+24009 00a581bdedebaf0242f51c9dab78801e95ff5448 legacy-trunk
+24010 c7aac78e23b49c31be19473ddb9dca41f88113c3 legacy-trunk
+24011 3b87740d1bbc85a62884456dd9e0468272bbb9b6 legacy-trunk
+24012 ad45d22b195d13a829f52a4147293341dac376ea legacy-trunk
+24013 3e4625818f5ff5964ca8e9c0af8e922dfefc106c legacy-trunk
+24014 d5f6b4d58380eaa5d64b7ed92ba79015c299fa2f legacy-trunk
+24015 7da4179995111308f6597ff13bb777e6a6ef94f0 legacy-trunk
+24016 23d230ef415ba56a32b23e2ff6723588d0ccd4e0 legacy-trunk
+24017 8360d6432707c5b87443e03d132573ce6398387d legacy-trunk
+24018 4617d3d770c5990fbb30d068cce13e81e53083ef legacy-trunk
+24020 9f62955de4c3a1e72b0d21242d0849cd0128d01f legacy-trunk
+24021 08dfd3c22f41dce3a148b6c0a2b8227f5cb54af0 legacy-trunk
+24022 775926bcf06925f71eb781868e8fe50f0bc16dba legacy-trunk
+24023 c8ba2db1c3c24bcaf01d7549873f7bbe66aae18d legacy-trunk
+24024 85109a6099b5e1f27b433766b3d02b629c0c09bd legacy-trunk
+24025 f2af42cf827ab7e39611db6d7674330ad27d5756 legacy-trunk
+24026 ecd64931482c9f2e75516c976eb7158fe46381b0 legacy-trunk
+24027 272336648d1ff1e2ca1e1df757e18cb414d72a5a legacy-trunk
+24028 17f7c9c1d66a514abd88232d7719c4a17548ffaf legacy-trunk
+24029 828bf317880a205e9e7432057aacc37fdbf4eecc legacy-trunk
+24030 050fc52ab3d4152720a16da8c649f21dc0fd06e4 legacy-trunk
+24031 a4bf3c5cc45a2ba23c47a8899949aee0a0b19142 legacy-trunk
+24032 5b236f377a258871fde606f270357f8d35e116e2 legacy-trunk
+24033 6aeab380292ed4699c82ff9ab0fc1e66159b44b0 legacy-trunk
+24034 08341362259597ba4ff3c129ffcf1f89b5b348f0 legacy-trunk
+24035 6b14d29e53089702f0b1358a798f85bafa95a8e6 legacy-trunk
+24036 781ae176bac2c252008f4e51ce2e7a93298a7947 legacy-trunk
+24037 37b8d92e12f518dc70fa18bdcdc7e64caf4b3aaf legacy-trunk
+24038 3a07bd2b0386e1f3b0ffe844fb81c1e983a2f544 legacy-trunk
+24039 a6af009347e13128869c5ef5d4870927c8eb9902 legacy-trunk
+24040 b3f48c5d6e1674826b3a35995cfc364155626e83 legacy-trunk
+24041 7b0546ee4789edd65705a0bf9a942c06008dc15d legacy-trunk
+24042 523ec70218e490a6e8b82e7ca0e22bcd2b7e2776 legacy-trunk
+24043 eba63dd0c2f5a92dfe5046c899545c682be0073d legacy-trunk
+24044 1244ee18baec33f46f6a0dede094ef28a9d8cd74 legacy-trunk
+24045 74412e59bff8261000b5f684554af93f6a89c8c2 legacy-trunk
+24046 76a85752d4524c24480b1e7357b032ea90ec0721 legacy-trunk
+24047 1043e10be7800912104112198301a747e3c620b7 legacy-trunk
+24048 744a19220a3cb76fe330df22ae05af715189169e legacy-trunk
+24049 a6bba31b3cd77581421de0c14131524bc8f4a2d2 legacy-trunk
+24050 57c61c6224a2f4b60c7278e6a3aa35a507a14845 legacy-trunk
+24052 4bb6753e7d53ee57d6d569535e1dfa1db22ae505 legacy-trunk
+24053 61123b860b4556a4aa7d6ced39296a282f3ee1a1 legacy-trunk
+24055 ab2e315849a7b6c7aa315bfc851fcf255391a027 legacy-trunk
+24056 61226ddadc975723684c53cfd371456bf1ffc810 legacy-trunk
+24057 b1d9029e09d14d517758bd007acb0267d5d7285b legacy-trunk
+24058 a2b11d00b697466c276b903e89d99e8023a530a8 legacy-trunk
+24059 a9002fb0a7d79d3b4cdcc1314a13a66e39c10b3c legacy-trunk
+24060 4df6527b78822078888f70b75412587dd25864cd legacy-trunk
+24061 feb80509fb215061836da8ce2c6ead50085026f5 legacy-trunk
+24062 25fed1d0960535e3108555ea7d979131cc1bc7db legacy-trunk
+24063 40de84bc62ad02148f02ac2617c18252c39d0bf5 legacy-trunk
+24064 961b24f8e1d8298f7f35d85a96e667a477538cd2 legacy-trunk
+24065 c91f17a4dc7bf22e97ab02b8bc6de16551266e5e legacy-trunk
+24066 2f7b6926e38dd1255648e969b867b0921ab27ade legacy-trunk
+24067 e0af282f5dfac4ab9c3c5bf6eab5d6d5cc27c767 legacy-trunk
+24069 79fcbc31a03ec9de4395ea403a44b7b6199d7a58 legacy-trunk
+24070 83a3e21a7cc3f47ab3b3dc6cb1caf57f62c9fcbb legacy-trunk
+24071 73abe0af7e070eac178768712bd41a48f99daa77 legacy-trunk
+24072 9c23abab962da50af06217d51e3cb38f9f4f982b legacy-trunk
+24073 fa97c9972d1b38eb791c4352c0feead600f23adf legacy-trunk
+24074 610a644fd4c3abf42ae2d3fc530c937159443224 release21-maint
+24075 ef8bd8be98beb0b5a2413da605dddc1971903456 release21-maint
+24076 ee70fac9535b4509b57b7f329cf043baec83426d release21-maint
+24077 756b9edf254fc213d4f231a09ecf8a939cfdf7da release21-maint
+24078 51eacadc815a29605fe8d83432e93b0233e95805 release21-maint
+24079 104223b3226a40ab3b71d4f4eb140857a4bb028f release21-maint
+24080 0629666e65c53f8d4cb448381d1990e9831fd542 release21-maint
+24081 076e5e49e27d394627a6e1af0f4013d06a7f704c release21-maint
+24082 42f22ea6a0f1361373eebad65391ca506fa61b9a legacy-trunk
+24083 026bf0ab68a515b4d79a39f7793f400fc7cfb3bf release21-maint
+24084 464d213da888c7f2f1162c21ee966275279e389b release21-maint
+24085 821e142e19fa4cd81b0a3ef54d3f4a5ae6a4f099 release21-maint
+24086 6d38fba05f3574e82701c74cfaf648a5fedb21c3 legacy-trunk
+24087 8d4b6642a604a001b7c2c59fde7467f4c3dde758 release21-maint
+24088 1965116d1aeca944b1eb5b5f102614c56dd87640 release21-maint
+24089 f4eff3247c66ac9f809840f8e278d65717d2ad2b release21-maint
+24090 ef1e9c8aa3ddfdb680491626b5139973fa39f7ce release21-maint
+24091 57ab65c2f170791d6e0ac41bd9f857e6e009186b legacy-trunk
+24092 3e098a963561d77037920869ddf16e4d436d1563 release21-maint
+24093 3a748caa03b91a150c5afb0821acc1748e32f289 release21-maint
+24094 9aded6235d890e90a23738dfd9d85b0295879add legacy-trunk
+24095 261a70c0aa792c3b686e746be209d67465123f8c legacy-trunk
+24096 5346b6906d1af85e91a3f7203dbc389b9ce97a88 legacy-trunk
+24097 ca418a5fa471cb8d25973eac9bb083a4de17a0d5 legacy-trunk
+24098 656c3c84debef4ef7b9c477d0589e2945a50193d release21-maint
+24099 c7aa332a2ffafb73404d57c4d22e275e187ae00c legacy-trunk
+24100 b3d8d2615b23bf4f0db3b08f7a84d28a43854ec4 legacy-trunk
+24101 def2a119d5cda31a46bebb6edc5fb65cc5ca24ee legacy-trunk
+24102 3751366c2f3931ca9db28113d67ed55aefee7d71 legacy-trunk
+24103 95201153251cbb0bf9345fc4fb79d77ffec50581 legacy-trunk
+24104 6f259f7bbed80e4a5ca9f32d62f0a0bedaa13c7b legacy-trunk
+24105 14dc693af532195699a8035824f19aa13df6c24e legacy-trunk
+24106 5f24b20e103d232d984795c4bec1437590de6e81 legacy-trunk
+24107 dab52dbd12aa1444be97738db84e9219eab320f2 legacy-trunk
+24108 d139ec49d204d70789f842fe71d7213ef8dcce59 legacy-trunk
+24109 860472877dda15111b811b4da430dc98cb686821 legacy-trunk
+24110 b0c310cdb9869af693e0bb2fb67cb6739b3dc0ef legacy-trunk
+24111 3fbd253dea5d4a9c6f853f2b4bda43798838e160 legacy-trunk
+24112 c1ebc0285a5e7d1b19c8079080b6bbc73642ba33 legacy-trunk
+24113 981e5468c9b531fed49d002335bb56c299e45088 legacy-trunk
+24114 f187d24056f48d856fac47a4298c2a621ca50d9e release21-maint
+24115 f6c7460ccaf899f12388ff8d48b028edd6620a7f legacy-trunk
+24116 3803af9d87963f8c297b47246f61fb0af8501f96 legacy-trunk
+24117 eacf81df6c42756dfbc1d73629791e48d205ab7c legacy-trunk
+24118 916f191fcff43f05b6495d40458cedcbb3fcdf8c legacy-trunk
+24119 8d14f534a5c276f69c5fb903a5d96e24334d106b legacy-trunk
+24120 6990fe9c40f6a7a28b0e90a249913c2cfc063001 legacy-trunk
+24121 4ade76a6b245ba78dbee858be9037f3b2a5da208 legacy-trunk
+24122 e10d9070e10732c11ec3ab53c4efadc47169f352 legacy-trunk
+24123 ec632a41ee35d9b646134dcaa18a5952eb8930ca legacy-trunk
+24124 d9a9d92624db97428a34c2aedbdde4d0f956f97a legacy-trunk
+24125 404aeeca51e9c451a10bcc3a1affb05447009258 legacy-trunk
+24126 2962f01924c997a35cf92eef4cae640dd6d0dde9 legacy-trunk
+24127 f34a8df8bba460088b1ee9341c435a8e75498ff7 legacy-trunk
+24128 053dbd9b58df03c0023197d83095bbf086ebc51f legacy-trunk
+24129 77bb2ae067c258cd4a7d66caa93d1a271cd73bbf legacy-trunk
+24130 0444f576c92b19e81c2455dc6205b1043c754684 legacy-trunk
+24131 6398d1055fcfb9de2cdd865c8a74209a82e0c695 legacy-trunk
+24132 8cf1d9266911328e83d6e486992dadce00f9671f legacy-trunk
+24133 d1b3ca89d78b49dbdcfcb5b092de8e3f2f4997e3 legacy-trunk
+24134 24105e989f178f2f608e51d1df0a7dbf9902f2d4 legacy-trunk
+24135 15c924a11aecc4de4a678d9439871ce84e8080c7 legacy-trunk
+24136 0caea5fefa5c1c7dde68b1725983aeafc478f710 legacy-trunk
+24137 5a47b58a44bb4e4ab13c1a55b6383972d9ebd650 legacy-trunk
+24138 d9b9b5b4815b621dcf32b0c466a93b9a8edfc78b legacy-trunk
+24139 d6ff1daae39817646e78a84b407ce9816814e157 legacy-trunk
+24140 8957341f98f847d6f4d63de0d4607e6f5dee8a5a legacy-trunk
+24141 f54828eb8e07689a1f5dd5960b010f9783e81a88 legacy-trunk
+24142 ebbdc38eb11c8a8bf9f165e9568eea01c9b7c86d legacy-trunk
+24143 40a88989d6cba44e853ae2ea0950864aac257473 legacy-trunk
+24144 2d9e41a72a68b3924a5ea77986cc9b1e0fe10d75 legacy-trunk
+24145 7bb31fb483bc867b44792a39598c58693328880b legacy-trunk
+24146 a8a66120badedbadbf8bc18b935962fe7e7ae2ff legacy-trunk
+24147 f576ffd57966b57dabd65d652b71239a6229b565 legacy-trunk
+24148 7e8cde464db40e9928fc8cb4325b640cdbe657b3 legacy-trunk
+24149 7e247f0837e269544d2ba8586f8554cda6f66b7a legacy-trunk
+24150 811ace3c40d01c2aeeb0e43be8f6b3ebb1190fc6 legacy-trunk
+24151 179cd370b621fa24fc36c83cf267e47d9d2bb82c legacy-trunk
+24152 27874c86026837311918dc641cc4cb502db84c95 legacy-trunk
+24153 d54e294484b2bfdb3b271a04c8b0861cf23cf101 legacy-trunk
+24154 732ea22eb5182fd30a0eb27f3c08dfdb616d57bd legacy-trunk
+24155 8a72ef6b8118d7c5ac77a41e8e5691196502b70e legacy-trunk
+24156 eef9bd87fcc078d889611df259b78e0f96309082 legacy-trunk
+24157 19817a4fa2b6cfbbb550af7dda086a0a7f70d197 legacy-trunk
+24158 89d171f6bc7d630582570487186bd51494033799 legacy-trunk
+24159 6ee19c19b2c373a8363b7c5f0f0ca1407eb88c16 legacy-trunk
+24160 5c435b5b59df90ef152fcb99c76434c0e765f99e legacy-trunk
+24161 a60c1e8b0bbbeba8f0825f08d1a69fe951adcafd legacy-trunk
+24162 7f561fe9edfc2283c492f2a9b85f77a5680a16aa legacy-trunk
+24163 0c17515b05db8b7a2e46cf6ab21715a9c672dea9 legacy-trunk
+24164 2cd2ae4de30d921ab2f4f4c244ec5fba45fa670e legacy-trunk
+24165 640f0284e30ab294ccac583524682ba74a837fcf legacy-trunk
+24166 e23140f6fb90396e33476a923a849d06113db1ce legacy-trunk
+24167 41d2d00a31f15d9158de56deccdf1bc48da003cd legacy-trunk
+24168 f4679f6a958f954e96cdfdf956040fcb88574490 legacy-trunk
+24169 de4f6b14d380acd135fd17f2b3893760fafca96a legacy-trunk
+24170 5b61a2ff696d0f5a864a4648e22df7aa7a302efa legacy-trunk
+24171 b5fe9a9414fca66b96f5723bf79b80b630496ee7 legacy-trunk
+24172 af3673812e33612a1abbf5f884c1cfd0ab4a8aa6 legacy-trunk
+24173 e184bbd7167c3f047f9bd241cf104b3d8bcd29b1 legacy-trunk
+24174 c3d3dc82764c9f4a19e1111bcf3547ba69ca918d legacy-trunk
+24175 8722b0abeac6278effc8e761f967c7c29bf41e3d legacy-trunk
+24176 0b6332c2aba01cace676c436e5b19e8877ad0508 legacy-trunk
+24177 358648873adea2dbe0bd6f91c20a477e036a7a7c legacy-trunk
+24178 d3f3d21ac04bc936328d9076080cea569cc7cd0f legacy-trunk
+24179 bfcc2ed9caba27ed401f303c5f9b5c86be97fcca legacy-trunk
+24180 f2c788adbdbbaf3b45814f0822aa5e741a26a9f6 legacy-trunk
+24181 b0a6dbc900470639874cf2d84f6208dfb6205f3c legacy-trunk
+24182 6027fdf1ebda3ac099aee53ed405104c549a31d9 legacy-trunk
+24183 316fffd80b161c8d23f491a3174cb38a7fada91e legacy-trunk
+24184 80baa27bf0ec3165279f4581625068941d4445b0 legacy-trunk
+24185 669eddf470badd6e77873b2cce65f3317aae60ad legacy-trunk
+24186 8346255cca7c7a912f8dff6940d54d5d3d4cf1cd legacy-trunk
+24187 55a060f4173f72066d69c804479bd210920e74d7 legacy-trunk
+24188 06d95b6877c45aaf990dcc9b803dfa266a645589 legacy-trunk
+24189 d88dd5c2b282b9506145fa6e56e5302454d53b6b legacy-trunk
+24190 93253c65d863115cef55500fb3a4929f2f5d531d legacy-trunk
+24191 23a209484f028e661e84e3829168c98786137ad5 legacy-trunk
+24192 b9850c44756b3c78c0b9aeed57e5f3c4ca7198fa legacy-trunk
+24193 20014716556b6bbbaa682318c7e42931468b6658 legacy-trunk
+24194 7b5864947baf6cc9348953641aec7c55012cb308 legacy-trunk
+24195 b21b42330e40219898b77144b183db3959102bfa legacy-trunk
+24196 90871fa43f4e0ae01147b417e9862aa02a4cff14 legacy-trunk
+24197 9e8885bbdbc95331bc4dd870f12607076256f0a1 legacy-trunk
+24198 7a991d012cd631ca120401f99bbcb355029af678 legacy-trunk
+24199 98dbb079c5d48c1c9c7c9a8d423f4745a84d5515 legacy-trunk
+24200 21fa7579082223c76514b29fa02de2bcc0e67e36 legacy-trunk
+24201 ee1437f5de0332889d5e834ee7f405f0e86415a6 legacy-trunk
+24202 7cedbfac746b9773d2499d5747ba273f5f191d63 legacy-trunk
+24203 5c02d215a38db9026841cae153009ec94237eaff legacy-trunk
+24204 2b5d3329d7e2a4be93c9227e667ec4f490b93c8a legacy-trunk
+24205 9aed74528661f725376ac40263d0bbf30749e295 legacy-trunk
+24206 fa7e0d00c828e45e46e9a75980ecc1053b6df185 legacy-trunk
+24207 cd606a584903e4815efbdb5052931d7e28eb0647 legacy-trunk
+24208 197505e6752a254da8b54300f5fc9fbe3e12a848 legacy-trunk
+24209 ecce5d7da607de4af293ce4e395f1216c0e9fe2b legacy-trunk
+24210 ba9455fc4c8b0e25b2da64953368d826803192fa legacy-trunk
+24211 0b64520c200c88c7d4e45c03990dd66e5f87a8cb legacy-trunk
+24212 e053e44f9666ff8da467d99439d2ce149c5927f8 legacy-trunk
+24213 13a18cbffd9c70bcbdc1d203d01f1be1367e0b84 legacy-trunk
+24214 540e5325fc6b08db22043145e2c6ab0e8c61f259 legacy-trunk
+24215 13df8b6c2b80c75281622dbcc0333f69f114991d legacy-trunk
+24216 45c952d2a61135233f2174db0c86f33d2f94bb40 legacy-trunk
+24217 5e735f197ca67dbf86c783957063c552532c3479 legacy-trunk
+24218 d3dd0c2a1771d85fefab6d92e391e6781390ddbb legacy-trunk
+24219 e4d380f5f2976641b6b62f48668e0633e461f80a legacy-trunk
+24220 c3b33ead3546ef41b9741fc7f33b4eb6e3d809e0 legacy-trunk
+24221 3c5d0eea1ae2b228ca7a8c8cf69d14374d4e2117 legacy-trunk
+24222 ef12c9ddefa705603b9034e5a673627c77d72b1e legacy-trunk
+24223 c555f1e7c4be4d93d3986a29d27c73e12814e407 legacy-trunk
+24224 9bfc31ca80f342fa2467ea16a3d6692655c3d5a4 legacy-trunk
+24225 d27ce8fe43f83991f31472e4e733e8be93b37e90 legacy-trunk
+24226 c3b08319959c4ca09d2d350c598cb99e365bf418 legacy-trunk
+24227 0d1767844c4b707a24b0af8ff141d8d20bd165e5 legacy-trunk
+24228 771b029bdb8a1836ccf0e5c02bf8b4e8c48bb420 legacy-trunk
+24229 9ede4d6cc9de8d5edf2009f852acef14137c368c legacy-trunk
+24230 c3b3e2e40035ea0e7e29fae7b3d5b1022f930fe5 legacy-trunk
+24231 615a4f56026851068732c16417eff8a37a343a71 legacy-trunk
+24232 f79cfd054f21b81c9e237e5ed05bb9f264357472 legacy-trunk
+24233 ca8bec4b3383742cf3abe38b11378fa547e921e4 legacy-trunk
+24234 a13d7cd0ef7f27511d14cf6b32328e14d50ac196 legacy-trunk
+24235 da5fbc1eb1d05ff91c6164a24349d462a2a4146a legacy-trunk
+24236 3d522cbb7a81f1965b277b7548e35c6ae510ceec legacy-trunk
+24237 300b68d63b9f4c25bb5b0623a72355c688d8b79b legacy-trunk
+24238 a3c57e59b5a813bfdfb4ca7171535cf6dea3299b legacy-trunk
+24239 3e9d6e9fbe58f6a636dce947066c920251184fae legacy-trunk
+24240 9ca7e46faa24bc2984a8dfddd15166c6868d7286 legacy-trunk
+24241 5545818f581a82f6d633b1c6e7d9ec2d361e8371 legacy-trunk
+24242 90a0f09518c8f6ef2b51fa49df85679ac14cdcce legacy-trunk
+24243 bb8716095a81a5cd55652acbc61fec0eca5de0c2 legacy-trunk
+24244 f1cfdca73f8695877c8be9ef8eb0eb49a18f14f5 legacy-trunk
+24245 c1ecafd15560b519b1e64419e51ecec4a61c26f2 legacy-trunk
+24246 e167b82c64440d80c0dca7f7b78246b405e54957 legacy-trunk
+24247 eba8c771db64cb5098a2a7b1f5e8a61c70580e0d legacy-trunk
+24248 ce69d4ee2fa00e17af65cc8572899c469f766880 legacy-trunk
+24249 ac51916bfda07e2d890c092931be2f4543485ea6 legacy-trunk
+24250 f1671a61007993960ae3de47006bce724fe3e375 legacy-trunk
+24251 e71ccfbf36bb8ded628462daf54749c93567f118 legacy-trunk
+24252 07f1d2c5dd041c8d84118f4b6a66ca40bd8da0fe legacy-trunk
+24253 95e3584abe4576e1dc482b62747d1b7562f77b0b legacy-trunk
+24254 44f3f5a5bfe245d74aa7d086dd559aa27a6f033d legacy-trunk
+24255 63c14669527e497d9041a2f19b12f18fdb8e24c2 legacy-trunk
+24256 4b9e63cf02a6f828c9d0c9031c2dc5657cdd3d05 legacy-trunk
+24257 b0df1fd818fc1f565b1a245e18acb90aa5741782 legacy-trunk
+24258 b163e786ac74e4a567e4108b905187c40b749a2b legacy-trunk
+24259 f711cf458525eed7cbf8a2c0d16d45ab8ff8eca5 legacy-trunk
+24260 aace4faff17dd9245edfb7fb514f2fef32440a23 legacy-trunk
+24261 f96e891cf0e4ee52db9b44d0aef178a98469aedc legacy-trunk
+24262 ac2bc07e8697f765ea5949a639481cb039aff4ca legacy-trunk
+24263 a85a3c10ba4da4ad90cb381094717ce1a4541962 legacy-trunk
+24264 01e47ce962010f6c14aae0baa12beb1dd0c245c3 legacy-trunk
+24265 816264bda136ce6217f859f0f0c87ae1fd7ec4fe legacy-trunk
+24266 0d1deb40219f9fc0287fcdfa1715f255db1c670a legacy-trunk
+24267 5b578d4d8902b95b521ddbe0b488a0ca4cce8011 legacy-trunk
+24268 d9b7853a0431b36848863eea2d15f0389e5c28be legacy-trunk
+24269 3a543af19c795fa193f4852a2621bd1ec00d234b legacy-trunk
+24270 22df3ed11e2196dc2b38f40e87e2c4eab2e1f321 r22b2-branch
+24272 09244c46830f7b89086bb8c2f74d262948c78ac2 legacy-trunk
+24273 174ccb035b3d85893bb80baf8851af09cf8265c8 legacy-trunk
+24274 570a54bb1a598882c105b7e1c2ddb4b269c11f85 r22b2-branch
+24275 c329b811ee5496bd59c48492404704ae38a3682a r22b2-branch
+24276 f0b575d6feaa70df4339e4047ca77307e9b2c28c legacy-trunk
+24277 555a9e0019a77996b939bd9e77c96c9eba07b450 r22b2-branch
+24278 6bffd2e2326a31418069fd258077a8a89ea58dbb r22b2-branch
+24279 84bca1ef1168bc97a82e54f7d47744ddd58d5dde legacy-trunk
+24280 3e0ccccc4dcb1e77aab1e95d5d18739756dbbb99 r22b2-branch
+24281 465bab07d2a884808f6005d48cd635225961532d r22b2-branch
+24281 f71581ce7a3ced69c1bbe5ab913990a5c8c41694 r22b2-branch
+24283 92d6f6f97c70c94f6887a5c3234c81dc4ef45ee5 legacy-trunk
+24284 30e13f0ea76b21c7a252ce42346ba02322ac8b3d legacy-trunk
+24285 436531b0acf81a147ba07e627044eee8ea1345a3 legacy-trunk
+24286 f7b6100593dcf17695c3dc33375d1288da79e00c legacy-trunk
+24287 bea92c3d77a32a416e63b0ecb60789813dd28c82 legacy-trunk
+24288 394da4effbec688284c28f313f74ad9c0872bb1d legacy-trunk
+24289 d914e0f39f8378e31937630a5566cabca1fe0d4d legacy-trunk
+24290 1b4e2a7975961a089da940ab09107e0ff2d3b9f1 legacy-trunk
+24291 6e10a1499e2423d2b47d4f4cd24b6ec79fd6d434 legacy-trunk
+24292 94fe17c677154080279062e7b4515a4d6b5b0a36 legacy-trunk
+24293 61a2df56746eee3fda1f98f869cd21783d346d62 legacy-trunk
+24294 22cededa2a73cc596c6fa7a8330128b37aab7e83 r22b2-branch
+24295 b5c2f794d80593717e2e877f61804974d947470e r22b2-branch
+24296 1fdb89a8b62199ba8e6288179d3e454be97ca0c6 r22b2-branch
+24297 44c7781d3f0ccd48c1197c49ba8a5696ec9d4bcb r22b2-branch
+24298 41ef982a64b1b1d19d7aa993efdc0d63fa1568f5 r22b2-branch
+24299 126895a392ba73fb978357c3bdeef1cea2f95b3f r22b2-branch
+24300 145faf298cdcc1324cecbebd5db23615cf6b47d8 r22b2-branch
+24301 94c858feae7f88610cf3e327c072641a87b31741 r22b2-branch
+24302 c52bb862d0f77354da7c4daf47c93806fa50990b r22b2-branch
+24303 30a4080bc30b591dccba8313dbadaaf74703bcb6 legacy-trunk
+24304 4a9a9cc041dece6a19e1d08b00c8cf0741efcfc9 legacy-trunk
+24305 fe29327e471ce2e6f4f1c54d1f151e7a8671d773 legacy-trunk
+24306 8c3219a4dcd6deb619a85c6b707471858c68be12 legacy-trunk
+24307 41b8d66730d61f4a1a60ea995b4419012cfbe83a legacy-trunk
+24308 33eb63b86a1936ee4748cea2fc7215b525b0470a legacy-trunk
+24309 49dc144a15557c17e6a91573c94db16ff67031a3 legacy-trunk
+24310 57c791a5f81c75872bedbe4bd0319f71ef305677 legacy-trunk
+24311 2b650c21a5638d58fade8704b67278ecc55cccb3 legacy-trunk
+24312 42365b70e9d8b8e4eb504b3050f40674620d9bf4 legacy-trunk
+24313 f4d9fa207e40e5b0ebadee72648a0d351e595874 r22b2-branch
+24314 62c63ba90df210ba360a8f975f661815e83e977f release21-maint
+24315 0f408261b3c8b7aabac1d39b255d69d59f0d289f legacy-trunk
+24316 a9653811731a003ba4801cca2d703bc9130dec20 legacy-trunk
+24317 9f66aaddf8d40bf1a3821f2ad191f9dc387f8e6c legacy-trunk
+24318 7ebc3e2983d11b2d5fa3cc56549d9fa980c598e3 legacy-trunk
+24319 1daebff177ef1377e1cb990e32fbd01f9fce9588 legacy-trunk
+24320 f957d396c84e71df227bef730c62128e2aae58ee legacy-trunk
+24321 e79fc257bca0e6ed10781b07ba83776616ca64ea legacy-trunk
+24322 dee0e866653e6e41b5f651a20922390ebdd98b0d legacy-trunk
+24323 3dfbbf42bf16ae97fbbd2a46ef13b19b0ff0c5eb legacy-trunk
+24324 1ee75bd4ee3468d517bc5175bc7df61588f7a836 r22b2-branch
+24325 109ed6964832adf87c9b04dc456062f71e01c4ec r22b2-branch
+24326 bd2e89d77d45adf17be07f8d512812f37ae4b615 r22b2-branch
+24327 4c832878de74eb721a5f6cefdc16b9ab4d425d0b r22b2-branch
+24328 e3e3cd47bad5fd383bc58bb2258925828af74128 r22b2-branch
+24329 d21028d5cc8528c465d78d66e26ecf44b1018731 r22b2-branch
+24330 48260b0b526f69a15a1d470d7dc76d1efea577b4 r22b2-branch
+24331 ee24bd0cad2903b1084af0b183369443f739e67f release21-maint
+24332 c7e833b3cd9c5aaa2fef5dd2cb523b36d89ff178 release21-maint
+24333 9746219813f997927eedc27adeec550e65892c1e release21-maint
+24334 11cb3de0823da8ec28b8e25642d571595879d222 release21-maint
+24335 223953069a1a09f0296af2a9daf10ed369104029 release21-maint
+24336 3fc06c1149a43db2f866a7539ee7af9cb0b93ac3 release21-maint
+24337 c4499596b1a40fd8bcf1d8967887088274b8db61 legacy-trunk
+24338 1cf77df95f452538976593e4f9b7ee81c327dc8a legacy-trunk
+24339 5981dfdda8570b61723ed88f99198932309bc67f release21-maint
+24340 afb789aada16fd8da6fd42d93e4bd6eae81cf613 legacy-trunk
+24341 778e6a80fcee4f55ff4366d88adcfdc32956b416 legacy-trunk
+24342 c3e6e63d9ba2d829f01cc686394a18bb8ff69165 legacy-trunk
+24343 e5cf74f791679bae15ea3434267e14dd314834e6 legacy-trunk
+24344 0846b4e2517df028bca2a4b6d2a002e8fe119256 legacy-trunk
+24345 70b4306f488db1460ea10097af781e4f5b1f2db9 legacy-trunk
+24346 b3d627ee2b73fe1c05f7061a32b965a8fd76f632 legacy-trunk
+24347 e6eaf957ea26f7164dfb6d0ad04c06246e888b74 legacy-trunk
+24348 b114b1007418ee2e10d1416c0f1a20d763ce4b95 legacy-trunk
+24349 881f49befca3c01a04ba98cc6d07a1d2a452028d legacy-trunk
+24350 cd0b75b19df7d8262782aa557158cab0351f0041 legacy-trunk
+24351 fed5071da9575d4d69445f48c3021e411e6af246 legacy-trunk
+24352 7ca5a481c0d179556963cd2dec556ef57ac847a9 legacy-trunk
+24353 1ae2afe675fda7bcc510cd96ccf9ec504c763164 legacy-trunk
+24354 da388e1d404bfb83f59103bf28c662edcc3770b9 legacy-trunk
+24355 b7f38e765147933935aadec6a05aecdadaf742d6 legacy-trunk
+24356 bcbda606d8c75718b40283c7c5f981c160dccb6a legacy-trunk
+24357 d45691a6987fe967a05fbbcf1b7f097c490cf338 legacy-trunk
+24358 bac942e685fad2dbbd20d9f63ae819b042c837da r22b2-branch
+24359 36c897bcf4d7e6942401138623ef3c39f9912eba r22b2-branch
+24360 f8fdbfa8d5f3b82fea99f95eb799f87d872d8636 legacy-trunk
+24361 2c0a9a5086e10b99f041d0b0aca2db6cc1ddd473 legacy-trunk
+24362 9df82c13c675f074002d02832bfad991359766de legacy-trunk
+24363 e76306eea3709750db576835eac5b67d21c42ffb legacy-trunk
+24364 597d10cf7938e9bb26597e336f5aef26d3d6e168 legacy-trunk
+24365 1802a9edb4eef4d8e60efd8e1759c9400aeb0727 legacy-trunk
+24366 bc02c3b09626a045f66b4790d2c9f77c66de499e legacy-trunk
+24367 f187496ffaef9d21fc263890e9a597e893e9c793 legacy-trunk
+24368 a2d78e21a7857e16ec07e406971010425c02bb61 legacy-trunk
+24369 50cfbddc6037e9751e8e197ea479a7c162dd330c legacy-trunk
+24370 225c7dd17e37267943d3d73ace44027bc3a9a80a legacy-trunk
+24371 c9c4c523dcbf128d7a65ab79abd72b2d14e7cc8d legacy-trunk
+24372 9b059f1b2a1f056998f99865127c3102dc01a2d4 legacy-trunk
+24373 7d3a211ef233699fedaf49ad909724d8862aa19c legacy-trunk
+24374 ba67b9c97b696bf6255d5b39b0c2f5a075a59ae5 legacy-trunk
+24375 6392f03222e010e803386728a79fda868f37582e legacy-trunk
+24376 639c0a3ae8dcb45da161f2d80ecd8d2791016d6b legacy-trunk
+24377 304b34023876920f570465c2862bed406f42c6c0 legacy-trunk
+24378 47ea73fd7e6ba30cb986b0137914d737902a603a legacy-trunk
+24379 dc641e1256f9c4de80727ef6d25dc300209e80f9 legacy-trunk
+24380 c5fbe92e02d3a15700c9f49c4ed8a29b36df8a4e legacy-trunk
+24381 379fc66f4c96d0a1f7c176f9bedd10cd735b6d2f legacy-trunk
+24382 025ad27d4224f457245134fcc9baee0b386ce6a5 legacy-trunk
+24383 8cef75cacb01604cdf0000adfeb668c671d4985a legacy-trunk
+24384 5b459677fc444fc9b0c03bbb96dd50ab18a0d199 legacy-trunk
+24385 94f5a9fa35834750814d1629d67d43daebd940b3 legacy-trunk
+24386 c8d775b9ff92a9bb9395d50b6af6fa21686da430 legacy-trunk
+24387 d3b6401ca273b5e4c8ecda3aa9377589fb804331 legacy-trunk
+24388 52ce887db3c931a638e1af5fca5c23e8f7978f3d legacy-trunk
+24389 3eb24f4c88d5b19cfea4f8deec9bf1444aefb3b5 legacy-trunk
+24390 ea5b0f0b716f254843268a927a284c747644d1b8 legacy-trunk
+24391 41ea2abb74fb39c1bc777b6ef7a8ab1968e57d92 legacy-trunk
+24392 347ea693002d52b89e310d0b45860f3b13fb4b53 legacy-trunk
+24393 d95a4ec685e0e38a3974eecba69d505a216a4991 legacy-trunk
+24394 5e25c669741cf911a1daa91161b557b4f37c2a93 legacy-trunk
+24395 47f6533674fda2db626bdfb63743373585a93cbb legacy-trunk
+24396 53270d281bf083bd8d164e2876d4464fa609ae5b legacy-trunk
+24397 7de133cbbaf18e8683a0481329112a4564b45c80 legacy-trunk
+24398 c2150313d9d13e6b526eecb1f52a40e49d3b1865 legacy-trunk
+24399 b1280cba79b59ac3f6b9cd4df1fc434b47d093e7 legacy-trunk
+24400 cdb70bf88db1a8d0ba600f402462da133ba0600d legacy-trunk
+24401 9ba3c82946b8961c17679e6e03eb697ecf87e4d0 legacy-trunk
+24402 82d8413636e7790d55f9f8fb83b4475fe3fb8ee0 legacy-trunk
+24403 83fc88350f80a22b9ecac575bdd1111774695db7 legacy-trunk
+24404 0feac45ee662efd09e730c64800c3fe52e5274ff legacy-trunk
+24405 183f28599736631d509230398fb27102521f9119 legacy-trunk
+24406 d6c183ca093c803b46ee86b704a963b9a1a2bff6 legacy-trunk
+24407 cec800931a370d25c94a9fae33a8ff34f6e29125 legacy-trunk
+24408 e422031b8fd70862e05774a03698954657b8edda legacy-trunk
+24409 67471070b96683c1f2e5f0f3fb5fe07ec2294879 r22b2-branch
+24410 11475dd46fa76132704723e33e882b164f4543b3 r22b2-branch
+24411 34fc5238310d33c408534eefa8f720219dc74e9f r22b2-branch
+24412 e9a01e24a4a974f54c0b4b8dc1b354698dca79cb r22b2-branch
+24413 6185a67b30128409e953817cd9de18d52d05b533 r22b2-branch
+24414 03aea7575afba6bf9820d1bc432309090082adb0 r22b2-branch
+24415 a718ba992f104af3d9abe7a9ea945b6b94d551d0 r22b2-branch
+24416 be39fa5558c545da33e9c833e4575e1ac97df050 r22b2-branch
+24418 d19513e2893c99efe5ebcbf15e5176c504bc0bc1 legacy-trunk
+24419 3827f136e0d6e6a0a1954aa3925be9829bbab2fa legacy-trunk
+24420 2711f8db164cfab5e7d94ddef4ce23c9ee3a3e32 legacy-trunk
+24421 12668d0af8f7f54f7927e869a2cd02899503fe2c legacy-trunk
+24422 05095398f9392e2e874a3aec69b9db557263b60d legacy-trunk
+24423 af1c5fb6a70392b30ec61a1f1a63131ac4ce190e legacy-trunk
+24424 8d0c106d909926811e33a037eb33f116b34b0621 legacy-trunk
+24425 38d0bd0fa7f2e7b70bb53e9c9e9453395a59d642 legacy-trunk
+24426 ed3dce17fc79b7a6c6ffccc6a29dcc5551be06c6 legacy-trunk
+24427 f7db2c0a30fce8d5973c20e8b184dd9e0c7137b7 legacy-trunk
+24428 0ed6fc7c1c093d06cd08d58f443a89fb6b33227e legacy-trunk
+24429 0a67463f8b7d2259c8ff2fe1e616e4e5e88ca5a9 legacy-trunk
+24430 cf79703340418fd74d943c7d80f336ab967f6a33 legacy-trunk
+24431 2e6ce3a56284bfeca5b8f7a5a600c344d878b216 legacy-trunk
+24432 493f932d5829b1dc8c1802c118240ffc6ceefb2f legacy-trunk
+24433 4685307384eb0d7fd31a0860a8c65d016805dc03 legacy-trunk
+24434 671a84866ac999638ecf0ebd8a662e8786aa2e03 legacy-trunk
+24435 687b8c7192a1a166c06d47ab70ec9fe1cb0b9501 legacy-trunk
+24436 21820732a1171bfc6746b72ad3f9ff4071782e4d legacy-trunk
+24437 21bb4c4b7e26f508706eb78b4fe548cd5aa9aa34 legacy-trunk
+24438 17e87aa377962c5864d6ad09f7240fb81015f734 legacy-trunk
+24439 6b6a9cae256ee31c34cd865deb3021808dc24aa2 legacy-trunk
+24440 dd28a4ecb37f6093949510e9be4e389f6dc2aaa7 legacy-trunk
+24441 15ff504632ed6a8e81d77f901e3a9ded541e3137 legacy-trunk
+24442 a13a4393f45c01eaeb0c025136f14c507dab323e legacy-trunk
+24443 6e34151aefe663053f1bcd28fde01ac3fd977223 legacy-trunk
+24444 60e36d518758f1e294fc172b9cd2a66fc0e56133 legacy-trunk
+24445 a9a87341a9e7b06ecd048fd40704d5dd55947fcd legacy-trunk
+24446 ec88fc430127611e6a880ebca9f60e5f7541df64 legacy-trunk
+24447 abe14ac62024213755387d62c1d090964865cac3 legacy-trunk
+24448 943639b944ab4ee32b33d94fb15e0b7d8d883284 legacy-trunk
+24449 197a90489beed9c5dad5470ff15c5f0c8af01a65 legacy-trunk
+24450 5b8f07e6399c1e6702e9da4235159f168baa977d legacy-trunk
+24451 a2d03ceba80ebfa625cc2a457e8f104507f3eb05 legacy-trunk
+24452 67508a351aa2bfbb6279040bf078f97d11b2092a legacy-trunk
+24453 1c6c027fd110bf9b5e3f4f49a292ef48bc650e8f legacy-trunk
+24454 51b4572cf013d1a6c8c796b18e20f56b859e7350 legacy-trunk
+24455 842b280421ba61ecd4a19adbfc091b706d2e7640 legacy-trunk
+24456 72966c9df9a9987ecc63143b2298a459597f4b01 legacy-trunk
+24457 96a08fd38ef812598d458ff8a374184f35bb919c legacy-trunk
+24458 87fa6e9bd77ec3c7bd61813dd6c532c7b256cc01 legacy-trunk
+24459 34fe7433526ba4785ba6e206f02848fab7281e41 legacy-trunk
+24460 90a0d80033b4f70346bff960fe77b0eb9969ec85 legacy-trunk
+24461 d4509cf93f50f92c0a672b3187d3cf8a4188efe4 legacy-trunk
+24462 8e7245460d30bff49e8d751e16a5fa24fdece504 legacy-trunk
+24463 0dd16fd36ee8e5c4b91555c76f4570cced0bbdd5 legacy-trunk
+24464 918b57354d8748b9734d13c2a442854a2d0e9946 legacy-trunk
+24465 be5f52962adb34d2d53ca1a0b27dbe6e0b76b961 legacy-trunk
+24466 11a969e2fa505356b0f06d3d0dcfd0b4ca393161 legacy-trunk
+24467 a20b372fb939c22084108ea5a021cc9b430cf52a legacy-trunk
+24468 bca53a37a8a5afe249986e0929660d26e7e9251e legacy-trunk
+24469 9fecba5269367aeb93ca755af81a85c904514eb7 legacy-trunk
+24470 e592472d55a38f0bdd488da1ed395e9341c05218 legacy-trunk
+24471 1acc4ba73b9d16177c36d7175ecc0f7ced908d94 legacy-trunk
+24472 6fa96b329e15ee1c05df793b6deec0407377d3da legacy-trunk
+24473 73384e13bd2ae112be46dca5a8b11fe89c080487 legacy-trunk
+24474 943ca81ad1df3f53997333f8b5da3c085956a30d legacy-trunk
+24475 e1a67be6c6e40a3e0b65f24bcf3a1d4a6214c301 legacy-trunk
+24476 7b6879714b7466e449f17a27336ebccdbf47ef4e legacy-trunk
+24477 21ac55fb2dd8c82ad20fcf6c1ca8cd93d848170e legacy-trunk
+24478 cfe407e4d8c015da64b1878ea6b29bc94e8df2a6 legacy-trunk
+24479 0b4aeb413d7df730a8816ee8360b0a1802f1aef9 legacy-trunk
+24480 fd42eace50ea5dab467634bf1f785f5aea87277c legacy-trunk
+24481 475c8271e057e9fe8a6684e4e7e0d8209306a9db legacy-trunk
+24482 8905e6725ca1b3a830817bf05b37908ed1c74748 legacy-trunk
+24483 2dfc600f99cee6d621a79dff21a15f1af7f311a8 legacy-trunk
+24484 2458cbcc1dd3765e6f6ce5b832c9a72d6fdb4c70 legacy-trunk
+24485 df2ffb0cd6bba60b22cb8b8505c893044f1ad762 legacy-trunk
+24486 0b6a18c6e59ec450856ac6d1bb59f8ec6915c915 legacy-trunk
+24487 789292cf0914c4363d4146e4c6b1097215f2f56c legacy-trunk
+24488 c9a796400a51c51487c271e33541956c7e8f1a79 legacy-trunk
+24489 d4cc05f6e1839d30f4db0ba9819b51770a9d288e legacy-trunk
+24490 7d1eac41ce3ecfe0ae2cfd492712c8f8f54a736b legacy-trunk
+24491 bc51de643b5e58cacf3eb167cce94714ecfac80c legacy-trunk
+24492 485422900ef079c217fc75dfb3fb717f599e6160 legacy-trunk
+24493 0fbc9289a4c7ce4039bc4f12cd480c8c7f52ae4d legacy-trunk
+24494 944d6e02f35917783b4cb8b3655d6c0e3479ca38 legacy-trunk
+24495 473f29411f3b2ed2387356d716294983fea83a7f legacy-trunk
+24496 ac1357fd1aea1f8a124cd82265ece7afe94bd169 legacy-trunk
+24497 c2bffa672b759bf9af3753331f7dee6e9812b96b legacy-trunk
+24498 aebce485b56b9cb5059aa68abc1a7189e0fea2d7 legacy-trunk
+24499 0189186f4ed9182291fe74077d78cdb911590c1d legacy-trunk
+24500 ef6f692c76e22a9bef1e783d3a9a904d1968bab6 legacy-trunk
+24501 08f21a5374d9a9fb9c9ab24ebcb94c3ae23d62d5 legacy-trunk
+24502 a623f9cf95354231a2dcbbc25b0c0d273ac84d9f legacy-trunk
+24503 6a73d58e174722f29f8e14ac8be3d00f2a997e68 legacy-trunk
+24504 33c8d335a2c437762e8a7c1a071b4beeb3337a50 legacy-trunk
+24505 c18ad52dece35c381cdc8dac48c039bc1a6e7c30 legacy-trunk
+24506 426c0d24debd8a58ee7b616d0517d3f72b26ea5c legacy-trunk
+24507 1519d6faab1594045eda57e37c570195f34b4260 legacy-trunk
+24508 5b3b292475735a98fdcf18e70ff640bc09af503d legacy-trunk
+24509 920902f5a884c09f45a8d012f49e5dffa16048d1 legacy-trunk
+24510 ad7b4424aab6f3b33b4a34874b7d64154a7b71a7 legacy-trunk
+24511 f17a37de6285aa51ddeaa93ac58b68c1048d764e legacy-trunk
+24512 60415bf5f8f2a4661e09f9fa5bc584e079ace7c2 legacy-trunk
+24513 947931392694ed39a32a9fb35f37e2e1d90e2e70 legacy-trunk
+24514 db9b5976829e447c3a36f3fa97a2edc3e3656d57 legacy-trunk
+24515 c84df848616366f7afb87641088eb8b761c257d7 legacy-trunk
+24516 d95eb7ec4553542b58eaa2c1525cc4f7ce8e5fa8 legacy-trunk
+24517 f79e4719db9645f5c3808596ee48a2ca19997860 legacy-trunk
+24518 864cc593bdda277df9799f401932e783e70e6ef2 legacy-trunk
+24519 81928c9d70117eed6d3a2c4202a3f7a331d4dc4f legacy-trunk
+24520 bcf666e883121d2b7e37e7153dc0c0e176613f7a legacy-trunk
+24521 ead1fa269502a1ce6fb4fd3b58d18d57e8f0a8a5 release21-maint
+24522 d8265a0c3cf0288a6d21e9edb9c50555f37cd579 release21-maint
+24523 2d21650f46f89d2ea0fc5bda66b7bad571d4515d release21-maint
+24524 151b6967bd210b2c12ce5b1d7f8d9f281d685b01 release21-maint
+24525 6709ad4fe75ec8e558c6eea9f1bcf95344758dde release21-maint
+24526 3b09ea723ece722e91c803929de1d651f02f70e9 legacy-trunk
+24527 d26e659507402c376d28c5e3ac74d5043df58150 release21-maint
+24528 198aebe123998d965d7aaafb516218ed17e4f234 legacy-trunk
+24529 a39af800b9a3ed9f47e514f60d0bdf9c2c839c98 release21-maint
+24530 148ffd957618d32eae094bd998dd4356ab09ab23 release21-maint
+24531 656c4cf5165fa80dc35a676784cbce74908df3cb legacy-trunk
+24532 9205cfb7709466500418082d9b01a7fbce451bab release21-maint
+24533 d2290e97de187d3dd964d3babaa3536c69842146 release21-maint
+24534 34327cf452994a8f05b386ad98d24642449f464b release21-maint
+24535 22d821673e5267a1335d88e23ca2882153a096f6 release21-maint
+24536 02d0170397885c6de76578d754000b8a21b348aa release21-maint
+24537 4af3186e66315188170b07b0bf2b971ee2453e8b legacy-trunk
+24538 5ab0dc7f2eb0462ffe3451e780f18966c04c90e6 release21-maint
+24539 95b42f1055c24e70c194bfab0ac6725373790636 release21-maint
+24540 0bc8838407bb5796e89abafad6eb1386bdf0dbf9 legacy-trunk
+24541 accbe5684ac614d5eb33d99c39f80f11b2a217fe release21-maint
+24542 00ecfe19a8d29fea44edd29386c9aa83017ae9a1 release21-maint
+24543 060c37587951b1a841c51a42ab9aaa80d64e6840 release21-maint
+24544 a3d01a22532973db6131cbe157fcaaaa06b08459 release21-maint
+24545 4930198f92dbf36341c020278dae6d2dd9950259 legacy-trunk
+24546 803ccbe3ee7cab5c21828a0cdb58ce473e8ca1b3 legacy-trunk
+24547 9dc87e61b5a2e22ee229e02cc99f71cb9bde6b75 legacy-trunk
+24548 b782490da7f08218426140e0b25c0818ec734c0d legacy-trunk
+24549 89a5c1106b82f1808720fb7958cde539d9fdc2b6 legacy-trunk
+24550 42d0819546d609fb82b9bc26358584c7b3fed9d4 legacy-trunk
+24551 3e8460fb2fbe49f8076fe5318e705745ee0a577c legacy-trunk
+24552 9d6fbcb950f9b34a4dc1dbc1e455871163bed6ae legacy-trunk
+24553 54ddc379d4fc28980289c00040bff949054b7bda legacy-trunk
+24554 ad87674de3a1b3c4efee2563ad25742eeefd6dee legacy-trunk
+24555 5c0ba6ebc62d0cdb9325363450b61c1a0a2b0007 legacy-trunk
+24556 2034902b0f1ac84afbb5ee97c19f82dadb1ec7c5 legacy-trunk
+24557 1289a0559e5a44dd1d0c7e07a54bc75a41654b8f legacy-trunk
+24558 ba6a7a5c32e871731bfc7d5630baec6d90081876 legacy-trunk
+24559 cb921d483e00942e44fc1263c199bc4c8d5bae17 legacy-trunk
+24560 ba16856bfbabd8d4dea0120f6d900e9d06ed722d legacy-trunk
+24561 062c6f47106fbe1acf4c808fc31402da4b62af03 legacy-trunk
+24562 224edbaf630191544251ba2875071e78e33b3296 legacy-trunk
+24563 b26d58b9810cad7e8316c20618738f037f68de51 legacy-trunk
+24564 45e1177424e1c7996872f5bbee10b73ee75d7fea legacy-trunk
+24565 e386f6e26a42e381f784e9e1915f50bc30fabcad legacy-trunk
+24566 d024a5c72cb563c4b434469c483dc98baf82dd86 legacy-trunk
+24567 19186b17d25aa3900d7baa0a883f0e09356072fd legacy-trunk
+24568 14507671c02cc9989d299ac132da6aff8b642682 legacy-trunk
+24569 fbf68c59d66ccd26071a74a87ad37530d7aad739 legacy-trunk
+24570 08dbf6b3c3164318ebb2570dba87af1475a5b067 legacy-trunk
+24571 e5d295542c7fb9661169c17a88015dbbf9007111 legacy-trunk
+24572 102d18ea02cfac39a2138eab729ea2591c88b03d legacy-trunk
+24573 c506bf7b26b8a0f1f98f2ce9af0ccd396b7c8652 legacy-trunk
+24574 4271da70ed9e13621f3e5755bc0eb2464b92d3e3 legacy-trunk
+24575 e8fea95a82a40360780adb300bab4f47274ab535 legacy-trunk
+24576 2f2abeeefd878bef337c716be89e02259d5325ad legacy-trunk
+24577 26567f28677e14afb45ed9d5ef3a838f685a06bc legacy-trunk
+24577 abec4e3b081f2f802c0f27bc1ea70ed752abd84c release21-maint
+24578 4dae842aa7c58ffde4b47bf950283f707d379345 legacy-trunk
+24579 7a7f557b4d5418eb3702da52e95dc9c83de96e2b legacy-trunk
+24580 d296e6bb17e54cf07cf01e1aafcfbafb7490c9de legacy-trunk
+24581 2b5dc6c77c3de6dfb5f315f959b9a3c7457e5a07 legacy-trunk
+24582 97709fd8fda026bee8aa3d7e8eab53b3b3186f97 legacy-trunk
+24583 ac3fdd1412d9eaa83c7cc015914956d650663069 legacy-trunk
+24584 d64dfbdc5f8c44806c0243c2602b32c201061c4b legacy-trunk
+24585 ecbbeccde07dd3b9605e4cb085a79293e863c0ef legacy-trunk
+24586 cfbe38a03e8c1907c0cb2e699a33366f8402a796 legacy-trunk
+24587 b01323bfcf6ce9329f492fe2a88402bb8e6696fc legacy-trunk
+24588 28f4cea209d78ea86a5279df867f90519c0e2605 legacy-trunk
+24589 f702ff390e4dc773d2c1f256a58a5a128c3cb25d legacy-trunk
+24590 03f3155cb6ebe17fc67d6e58aafc7785b8f6666b legacy-trunk
+24591 643244f7f46708d1e7194d1381c97b2320b7d2c8 legacy-trunk
+24592 3657befaba4f0a81da1be1eebbef4222955c5084 legacy-trunk
+24593 991b170cf4385d102571da3a926eb023f035a454 legacy-trunk
+24594 d35a5771c4c69f4e3b7863072178180054d5c83e legacy-trunk
+24595 d4907cdcc2994543666345f8c0bd8d0b8c6e4502 legacy-trunk
+24597 43b8a962a32aeecee23d2b6b4f20994e9ad708ac legacy-trunk
+24598 50f28ed8044ffc1c445fc73c0fd1a8d1779a1966 legacy-trunk
+24599 1e7c0b849584d7ff7ffbd73fa20ff60a15826c84 legacy-trunk
+24600 d51f2158fa79070a4ad153581800a50bf4aa3f0d legacy-trunk
+24601 d0c2040fede7d4fad85f3a9100d9792a44e1d681 legacy-trunk
+24602 776dd2e7678e043d65e84c1d40891caa23dbae38 legacy-trunk
+24603 9835bab2876e42f83d6bec54a0b782a60808e314 legacy-trunk
+24604 2375d2dfb5b3a62b86cda8f3bbc2944bdae8fb39 legacy-trunk
+24605 e8ddab13732abad0b2949c8b9cbc63aded70e362 legacy-trunk
+24606 b810c30b4aa1a7ad90e07dba96d0475c4f7f5bc1 legacy-trunk
+24607 24a6c3fd0e58bc0a19436d0ae7cf5545c802ea84 legacy-trunk
+24608 59894496b5c7362dd4ec9cfa656431f419d5a312 legacy-trunk
+24609 bb78a52b8ffce2705de83a95106026e52c16cbf4 legacy-trunk
+24610 119422430e8fcbe1f20c90898a75f15e4a19937b legacy-trunk
+24611 9a243ee354a134cc5d3fab7736b57d573461665c legacy-trunk
+24612 62ea317dfc7f4a0a58e5f026ef6d5b6d55f02561 release21-maint
+24613 f5532cc1514b7db635b0664e78660e9481827f52 legacy-trunk
+24614 12c094a2327346e6b9b3a4913a3f9c8d40cfbecd legacy-trunk
+24615 de764663c325c0467a4402f6a6e13aa882c3d9f0 legacy-trunk
+24616 b6f592eec241d6ecccb26d9c98b3b722f34c3de5 release21-maint
+24617 d980ebcc696a288295a8447ccccc5d368bda60df legacy-trunk
+24618 d86d6e0d158c5c82407412cc123e07c74c3868f5 legacy-trunk
+24619 0d2eef636d129c575d92d98585aa67662e890bda legacy-trunk
+24620 898c825e08acccd64505f3d2e6279fae55d787b5 legacy-trunk
+24621 cb6203ff29e5a1e3b58800706fc52644a54fcc49 legacy-trunk
+24622 2607433b13e9e81eca282d32a3602a42683899a1 legacy-trunk
+24623 90804a348923dc7f2768bd03793606251c7e4efa legacy-trunk
+24624 bfa5f7b4e788598beff1f20fc857ec03d5bbfd0f legacy-trunk
+24625 0102692417af0fe3e12e1b217ec1f955a30ce6a8 legacy-trunk
+24626 91dd223829c6e0356011be2c6c1f4bb479b165a8 legacy-trunk
+24628 4d5098cfa781bfe3a7bf33ea664bb2a159c2f1ae legacy-trunk
+24629 9b2d1f8f4be34983b8409f29103f090e58ac5efd legacy-trunk
+24630 0c2ea233ad2493b5049b0c2d82eebc10fe8a55b4 legacy-trunk
+24631 b583caf1be882b329809b1903f99e600eeccb820 legacy-trunk
+24632 bb566f525f12cf88edcba007b987cf8328553523 legacy-trunk
+24633 4bcfb9dc57e03dcb350882e760746d7310afa681 legacy-trunk
+24634 60df2bf854ace417b71008a546018ad12c2395a7 legacy-trunk
+24635 3a2cf5e45656a98a75729435a363d6c9c0af0a9b legacy-trunk
+24636 1852caba7014b415497b398b2fb2095f1d7fd465 legacy-trunk
+24637 644885118fe779876c7399baab34bf56dde73a70 legacy-trunk
+24638 752fa485c4aba5f472a1125af7691aed92f59950 legacy-trunk
+24639 8a26bb369f5377d68a39710fca454ef76d9a2ccb legacy-trunk
+24640 c9adace3c823efdf57d4afd99a3e6022415f70d0 legacy-trunk
+24641 34a1a50e6ab6f8191a16c6e2ff3bf64bd8deed03 legacy-trunk
+24642 784c8bc0b3034a5485a3fd79a82a36fe026825fa legacy-trunk
+24643 848f6988829f1a2e540d4fff77f8a752065c31ec legacy-trunk
+24644 4420a4bd96a44c1a30c5a09cb76426deec791c61 legacy-trunk
+24645 2a7d5ffece1c9b87bf443b8a5c836179398d56ac legacy-trunk
+24646 fbbd8a4ca7a6fcc5b9898a9b7ec6d047b842cbf5 legacy-trunk
+24647 6d874a91b58b81b883a0c9e3fa3c6df451c82b56 legacy-trunk
+24648 cf2fb20a6ce7eb3b02ed29ebaa63bad6101714e3 legacy-trunk
+24649 18f60810b94a3f010fe4d8145e3de357ff7bef7d legacy-trunk
+24650 7c6df964b04bb414ab45b9ba562b20b5c5c1b1e0 legacy-trunk
+24651 93f54058ef48f5dcbfd9ca0522c56392342c4450 legacy-trunk
+24652 68040db084b6aa57acd5e6f2267e5f9029067531 legacy-trunk
+24653 525c77368cd057df35976ce7ba88487e2fa3e30d legacy-trunk
+24654 3d68e3110e1fe58ee6e6e5321cbe47cd34137577 legacy-trunk
+24655 0b1faf116f63ea8c56d17f24795012aa9d4170af legacy-trunk
+24656 a392e1fae61dd22fe91228145eee3ce099d2220a legacy-trunk
+24657 7a58cd337cf440a1c110d12c9e1250535d823f89 legacy-trunk
+24658 f7eaeeac9c65e7be4b81c8736d85b2c3e6e9ab24 legacy-trunk
+24660 d1f938eee700a26291778ad908519f730e780f78 legacy-trunk
+24661 8a8f57dcf9fe736397f499b3253387a635da4464 legacy-trunk
+24662 f59c6b5dd1222b2fcb22d54fafe6e7228d749ed5 legacy-trunk
+24663 12310d643d8d729765d1132c4196e32bb092ccbc legacy-trunk
+24664 938b5bf74fb94f5bf855f7832d0a233d6a486196 legacy-trunk
+24665 a5146f843010062750b341e67b97331f77549b79 legacy-trunk
+24666 be990e703d0f1472cfdc7424f9118ef646b26c02 legacy-trunk
+24667 be3283ed8f97588439304c859400e276716dab8e legacy-trunk
+24668 257c938900a6e5e3d4e7801fe8a8f9d0119dd98e legacy-trunk
+24669 fbddb64d21c2cb3d98ecbfb0c95152166fb83875 legacy-trunk
+24670 003dc573b2950ceb4e7831526261d458e5a56e7a legacy-trunk
+24671 c67046ef538567bcd4ac95729c270e50b535482e legacy-trunk
+24672 de3c88b5f88962bd7fe1a3f6454a9096a0c1a673 legacy-trunk
+24673 2eb25ef34386c3975dd2dcf2eb3d70a7ae398d2c legacy-trunk
+24674 2c208dbf0cb03875707bd107cd71e5ca3bf58759 legacy-trunk
+24675 29072e8e8d982b1afba426791ab3e71997ecccaf legacy-trunk
+24676 e8b098fe3df878f8c41bdda383e03ceae88771e5 legacy-trunk
+24677 3012f626df7cb35e130ceda09b602f73c804b32a legacy-trunk
+24678 71e5eecd589e55c3356ecbccf0ad2c802f7f8f5e legacy-trunk
+24679 040230c1589047a7e2cc2f5ea9387fbb559a7f10 legacy-trunk
+24680 5ab9a65e234661461535b1a4471fc6f07ac6febc legacy-trunk
+24681 f57767d76de6db7f4f4df50a439a37345db74c31 legacy-trunk
+24682 8a89ff1e0662db4da04e59e6b7ea8e3fc86fbfa1 legacy-trunk
+24683 d87ca932e70fcd0ba500aa8708ecca513647945a legacy-trunk
+24684 af51604d00db271449b77f13b6816a5067b7fbc2 legacy-trunk
+24685 8a035087eb729776b27ded2daebf194fe7051e06 legacy-trunk
+24686 73466a76f25e2e71725290487adc7ea2fe14431e legacy-trunk
+24687 c2966a7bd1135149839d43e0b1fdce0d69812fa2 legacy-trunk
+24688 c5939d0c747a492c252efc4728c3cebc361ae169 legacy-trunk
+24689 49772d318440b8b4956baad3064ca9f50660057b legacy-trunk
+24690 7e0d2d59bbce9b7ec487591bd766625de9ca6890 legacy-trunk
+24691 50d0366e8f05822f9ceb8134cd1348911d070fe7 legacy-trunk
+24692 5f571344c89ccf032670b0dd71862eb79b32b3ed legacy-trunk
+24693 116af2f01442a900b088de7e61790a254bd0da5a legacy-trunk
+24694 743f67befb57e953268c727e5fca13c2a583bb99 legacy-trunk
+24695 44ebeab269c5a77efe208002fc8c978cfee7b5d2 legacy-trunk
+24696 913458eaef900b9c169fa4b756f84c7e8acd2e51 legacy-trunk
+24697 d16b327181a8d6b1613d226751be56efd2cc330a legacy-trunk
+24698 abcd2f52f316da07f324d5a4c1914a4131098fef legacy-trunk
+24699 c44c911606a44cf713a020fe04a80a3a6f1da88f legacy-trunk
+24700 eb78f03dcdec6830283f3a1e709e460abe0e32a2 legacy-trunk
+24701 81a578eb7346395cfd772efb6ea907f16eddf94f legacy-trunk
+24702 42cd50594d0d9782d1c7b603abb210f732ad8513 legacy-trunk
+24703 dfacc733cbf4b5c9456c27d2fe5d3f1304c85547 legacy-trunk
+24704 75037d86b1136318170f8ec7e9ed02c29fc32451 legacy-trunk
+24705 96bbb3d0c6a044f01625e1abe7ec457f45e1ee6d legacy-trunk
+24706 2c32fc5f23c037043f2e5e1beb731db337b6e71f legacy-trunk
+24707 6578c7dc328b1e72769f99be4d6245d92a9c1669 legacy-trunk
+24708 3f3ef0743537b27a40870ebe7d9ff380a0221a0f legacy-trunk
+24709 82af54b43817751ce3e4f4104bd44502705d05c5 legacy-trunk
+24710 560222e9d4710b0a4f6275f2bd753aa265d4ff30 legacy-trunk
+24711 ec32e59df400bb767d4072de6c2efb2f94001304 legacy-trunk
+24712 5c9ba24183901bf5924378c91e92ef22788882f3 legacy-trunk
+24714 de125792bfaaddd082a7906b9256c024fcab5ad3 legacy-trunk
+24715 33d59e18b68d444a35d577c6ffa90541bf8dfb8b legacy-trunk
+24716 cb08bc6986859e74d65a69ac0479475bd083ac21 legacy-trunk
+24717 6da6091a31eef209a61147c19bd3e88bf1414e5d legacy-trunk
+24718 05bc5905224934efa4364080332b33c611bc400c r22rc1-branch
+24719 22c988cc152d122b24717e76dc640837e952d92a r22rc1-branch
+24720 3d97a054f9d4afe5a6a786d3b6e817cdf0a137a6 legacy-trunk
+24721 698b6eeb9a86d89381bb3359a8248c1b39a3e749 r22rc1-branch
+24722 ebf8a036151d465c2596ea82cf0a211a90f3de7a r22rc1-branch
+24723 204d1d5b08d68a8c78f5708385dbba26e951c6e8 r22rc1-branch
+24724 fbd57ee5b77d7825009291ce75a1d5d86a220936 legacy-trunk
+24725 3ce871a0455b52d5db4421ab90fd56a9bfe131c6 r22rc1-branch
+24726 363b2f7529351edcabb05e9bbd39f1263517821a r22rc1-branch
+24727 6ea7193bdc2eafd1943e5ad8357a922806b6fee2 r22rc1-branch
+24728 064311149cb4d3dfc48bee2fc4ec917c07ec6ac1 legacy-trunk
+24729 2afe42f2455908f0d00e43dbfaaf2ce823f04d03 legacy-trunk
+24730 9c80b5af8121a74bda2708efa3af8c1f60eb5174 legacy-trunk
+24731 fe18eb055107408269b5296bdce002035d7bd78d r22rc1-branch
+24732 cedb5039155a6553314a2f743ff6397c4876643a legacy-trunk
+24733 31a249a340f817ad291b7bbb7b75c7c5e8bcad1f legacy-trunk
+24734 85086f3e70f3478893f4c6cedd72a94be8202e1c r22rc1-branch
+24735 fdc0cf56ba9cfd5f024ee42e7a90d5b160dffdbc legacy-trunk
+24736 27668dab77f88acf2eea05f7f0d58d619c1cbd13 legacy-trunk
+24737 0407294021a0a6a018a16823451fffdd45d925d0 legacy-trunk
+24738 1d89da825f957886ebdb2ca1318ff52613abd5c3 r22rc1-branch
+24739 0a948ce47e7a06a3526757f7b3fafe9353ec1ddc r22rc1-branch
+24740 e63f4668c95d087093eb664a7e241f5592168f74 r22rc1-branch
+24741 ff1b571aca710f40391998d69c5b049e0a3dcc31 r22rc1-branch
+24742 8fb0c24f4d450d940b4e5cf6333c61ca63c5c82a r22rc1-branch
+24743 b11774ccd101f730e927130cef10c81861b038c2 r22rc1-branch
+24743 7f4678eefafb143935c39c0364e0b53b33d28820 r22rc1-branch
+24745 4216ef19620bbdede4cb3b1f305f596a8e37ee63 legacy-trunk
+24746 8b2bd0780925f9d5f1c6b7770eca882d31244467 legacy-trunk
+24747 f536f85295b8637cbf15a75e3a57271ff222b46d legacy-trunk
+24748 3fcb2248bbe8d907e8e6cce1885c6b1182bf8e22 legacy-trunk
+24749 6b30c3f4378d4304ce1e7f686426751adc5ea3e4 legacy-trunk
+24750 c3920c4353331884f2f228dafe52caff7be967e4 legacy-trunk
+24751 571d5b7b746c82ad8118d42c3b6a2afeceae06ed legacy-trunk
+24752 81349e51659b51c5fcde2aea2cd1ba4996e70cfe legacy-trunk
+24753 4cb223ef869ba0537c7c91bcb7038da753858660 legacy-trunk
+24754 aa4753f945722141621609b997d1f0ba837b2ac2 legacy-trunk
+24755 55921255ec93d234384af1a676e47814103564e0 legacy-trunk
+24756 274aa91b417c13f5099022f20fd96327a33b7d83 legacy-trunk
+24757 e0e2b6161c7fd6bdeae7aa8c14246cc550263501 legacy-trunk
+24758 a9656ce015b0d8f129d79a8770ca40475fa2e79b legacy-trunk
+24759 063f8a31b6b8b729e2c8f87e19349f6227ab64ec legacy-trunk
+24760 a620ef84b0fb2623185182843dfcfcf5350b7c71 legacy-trunk
+24761 3fcc2e2992d4d5e57b477b9455e008f17f14b8d8 legacy-trunk
+24762 b2d3391364bbb7316cf030482896bbd790734219 legacy-trunk
+24763 dbd6a76121596be03b3ccaa73dcc4fbf4c294143 r22rc1-branch
+24764 a029e348304c8e7ca59138f09465ebf2a8b93211 legacy-trunk
+24765 fd9d7ae3f94a7025de65d5218f34b388dd76512c legacy-trunk
+24766 3d2cc8577127e563e8fb2ccb4a04a2a50b598f25 legacy-trunk
+24767 1450ee6b8b9ecd7da97ad6026624390dbe2e037d legacy-trunk
+24768 c65fac7c28433e6e8614f5cf86e89342f593df8b release21-maint
+24769 97d857881c82af3d2de97b87eedb64ecb209bc51 release21-maint
+24770 f546623ef0c6565dcfb4e914ae38c9dd7efc5430 legacy-trunk
+24771 5a590f196ec583a7180ae7ca558dd2d6b1d9b49a legacy-trunk
+24772 9a634d60542ae7164462730c55467ec039651b36 legacy-trunk
+24773 d7a9eba74fe2611cfa0eb0f10721e10db3c93505 legacy-trunk
+24774 30efe46f8e3caa5ab1fe440a18b31739fb7ea464 legacy-trunk
+24775 05ad7a69d93311c7df1a9d3ac5b3549086e5252f legacy-trunk
+24776 d7d25ec02d4129bece3ef0ec6ceb02b4b7284367 legacy-trunk
+24777 4f621bac75265da27ed42b33a8f211c94e8101dd legacy-trunk
+24778 5193290aef0a5b4c1e338682e7541880af3fddb2 legacy-trunk
+24779 40c56fefa1772b6294069aa253ad531b5151c669 legacy-trunk
+24780 77c7476f41bde76741283a05907c7d9c22f2b698 legacy-trunk
+24781 7e7455890fd6eb1a59c6fb554416b2ea033410af legacy-trunk
+24782 97f099671bbcdde8f02b8de03c6bb3153c83f613 legacy-trunk
+24783 3abf00215c1cce06303b5202d7e29f150e5d5ffd legacy-trunk
+24784 fa0bde3c86b278b95d0dedadbd7f4dd0ad9c92de legacy-trunk
+24785 be5ca0b25bfdc7bdb2631830a5d2e1aad080f395 legacy-trunk
+24786 fb6b3fc4e0c1aab134680c9ebf0f87467370a2af legacy-trunk
+24787 bd12b5973daa996524e195a646f767b969f852f4 legacy-trunk
+24788 7af45affd3532a0b08cf7ba84c6b75b5d68b0d7d legacy-trunk
+24789 98464394cce33683baee16ffb8b2ca8463c5045b release21-maint
+24790 e3c2fd177a6e4e2ee7898936a80c5cee528ec4f1 release21-maint
+24791 c5797a0083d8fa2a0d536e6d84d59fa91faf9ea0 release21-maint
+24792 465c9325af69f41864d26ce8770edc69b52e9f3d release21-maint
+24793 f685f0704bbd3a985cd2ce7eb77b8fe0100847ff release21-maint
+24794 0f74db74a8f4080307bc48a7bdd0b5dec96c628a legacy-trunk
+24795 3303f2d92cef9c8d34892ecc740479e701d9a378 legacy-trunk
+24796 664ac8227cc53f3e34ac9dfe906b9bae2ddd866a legacy-trunk
+24797 df770dd0bec4a76fefba4b17e217bbe818bbf8a1 release21-maint
+24798 b27599abcc49a117e81dde57997fadf49a2cf96a legacy-trunk
+24799 9423245514a885ec9e77bd9b7cfa8a1ceda70554 legacy-trunk
+24800 3a93145b6a9632db26946da9b97af23ae705bf8d legacy-trunk
+24801 4e35fa5d5708dc5570cbea31792d6a74c3b1c2fd legacy-trunk
+24802 8348e8441eaf75be88ebbe97792c30821b42b571 legacy-trunk
+24803 f18cfde2e8049e8e0d296fcddd4f3cbca6d8e31c legacy-trunk
+24804 959a2ed5735cd0859bdbe9dd6fc19ba5f911c71e legacy-trunk
+24805 803aa0c2b130f92d5d425796c48f35c86f4d1c86 legacy-trunk
+24806 673bbf1155089225f4e9bab260f8349866e6d426 legacy-trunk
+24807 e1f3fe5677da3d8ee5ee8a4a08bd8fe532d43988 legacy-trunk
+24808 a3b0673ba2ca5fa43c39855677f4e45d457a126f legacy-trunk
+24809 aac23331a25d7830efcfb63a9d30c73c35f02cc5 legacy-trunk
+24810 af2623bb5d0bc3d8da4b2ed1ded907f124d8e62b legacy-trunk
+24811 ccb26a118867e8204c74a76de880a74625073484 legacy-trunk
+24812 b48910a957971a79e9a3974ecb793a886ef4503f legacy-trunk
+24813 4c82c8ed6df4d4c47d4755a9943e0cf2a7048202 legacy-trunk
+24814 21c7d7565977cea69667fd84634393e68d13e72f legacy-trunk
+24815 00b3ad1ce404d6ffd33ab64eefc356d0a108bc9d r22rc1-branch
+24817 003a985cab95bbb6a99b63618b0afd23a43c62c2 legacy-trunk
+24818 76225434a6fed744a1c2d4e9dedee0147ebe87f6 legacy-trunk
+24819 873291a4889ec92e6eb08f47605c638341cc4fdd legacy-trunk
+24820 2d376d926da82a9021fa8142b4d5ef460208138a legacy-trunk
+24821 9d95c1a89cfcb0a3397a968be74a30fe36c248c3 legacy-trunk
+24822 5e06f8fe38ee4aff837e116d1a43db838a68dd47 legacy-trunk
+24823 a1992694c82425e0c425c4e3131123f4aed7d591 legacy-trunk
+24824 bb168de50a032b7398c8e450f1ab362619bdd3df legacy-trunk
+24825 1d1c46824fc3e7ed500aa74a54bf47e2b1a5bf4d legacy-trunk
+24826 bf6448f0227374eda9189eee5bdac58276cbd163 release21-maint
+24827 ca450e4dff9a62648405217c4e4407defd8c8ed6 legacy-trunk
+24828 044630161093c91744c539e6f50b9ed40b63ada6 release21-maint
+24829 162106b16e444c1a475b6084d0dffa44b314dfb2 legacy-trunk
+24830 44c479f84e368c0b5f3d853584bc889af3268128 legacy-trunk
+24831 2474414d4342924b06fbb9dc18bb06446faf84f1 legacy-trunk
+24832 7c2f95deccad5e248485c05017387017036b7a81 r22rc1-branch
+24834 65f4094f43f46fd529a684fe29a78c15220213bf release21-maint
+24835 814ce092953ec23f39814fc8dc0d40bfd785e75a legacy-trunk
+24836 e9202fe32f0b8ff6eab8599d2c34f768bc8bd6fd legacy-trunk
+24837 88baa4c4eee105b6e479af4e5bd13766930a8c7f legacy-trunk
+24838 cca56a976cb25cb06024851e81fa12f20b2a6b46 legacy-trunk
+24839 4a34862a399423f47025939d344fc38f0ad83570 legacy-trunk
+24840 652e18279583c146a9296485d17cdd9e4aaff14b legacy-trunk
+24841 5a504102a09c50247a123a77d91d2acf3319dbac legacy-trunk
+24842 a03b13be2f68f95bd46dbde1b2ca861bfcfa499a legacy-trunk
+24843 3815a959819c469383b5e7f13ff8811caa4c441a legacy-trunk
+24844 3c9f391d7e0338420cc2bf8959afeb050d9b2cbd release22-branch
+24846 3248ead7192879d8cbd0c40474f133407fec1d69 release22-branch
+24847 d6a44fd1f4c1437090679276219f4d676661fc89 legacy-trunk
+24848 e3de38aa646231481ad0364e49d007c844067daf legacy-trunk
+24849 097dd953e119624f019f8905ec38bf755336d6ff release21-maint
+24850 568c75dd50782a9b40311716c23b98cb0fe3b0cf release21-maint
+24851 85e694e9b9fc14644d2551b0341d2d0afdede997 release21-maint
+24852 e3aa5aab2876dfbe1d9ad1af9ee5bdfd07aced12 release22-branch
+24853 82ac8347446291125ae1cecfcfa83c68b760fdb6 release21-maint
+24854 25babd432b24f4bb125dae1e2cbee8f176006fff release22-branch
+24855 326d9972f6f610036f9a4e8bbee21a1a6a7f6407 legacy-trunk
+24856 e8d36c18313757374fbc2865bd200e47245e9db6 release22-branch
+24857 04612dc323df30820c48e8e8e8d217054dc73cff legacy-trunk
+24858 767d245fd8dcfb69ef6b4f33b4b9b281f0f37ee5 release22-branch
+24859 09518c4c68508b42d08f7089a44b89ad900a2564 legacy-trunk
+24860 48f32198ceb91f49dd8a00a40d92dd4a55fe057d release21-maint
+24861 0825eb1dbeb81cab76017f5f4ea37fba008ad827 legacy-trunk
+24862 17997820971d0c29be57dcc5a1d9f98a923d14e3 release22-branch
+24863 fc9e2711714dee99596ad36413d02a2bcffe87bd release22-branch
+24864 6c23a3fb0b049872a53774aeb1750672506b3a2e release22-branch
+24865 606354401396f5406bfa0199d72fa4ab1f7063ff release22-branch
+24866 3ffeeda020dcae10d682232e7c5ab3a8b400e4db release22-branch
+24867 479cf882bdb5e662cb718fd3be33a05072b45d02 release22-branch
+24868 11003b665545d61f148be7c085009c2ec507d50e release22-branch
+24869 324684adb4835241053013ce8700a5640608005c legacy-trunk
+24870 74c5dcc15b735565492688a5be60ae865a716853 release22-branch
+24871 e93f144862de972b1b117e46a1fca32ffe204467 release22-branch
+24872 8af86a952b2ca3fa20b783fe8d8de0341d72ce7e legacy-trunk
+24873 4f8932134dca3b3fd7a48102123bb6748ea44109 release22-branch
+24873 dca8b58746439a9f7df212f643ee4d40eb8df24b release22-branch
+24875 935b8602cad9836704a3aa17cbbd8e4ec9824092 legacy-trunk
+24876 9025197a8ea0c4bbc76a0d08b244e4a7dd8b0232 release21-maint
+24877 e0a5d16a9cb95196ca18614423093beb221e39d0 legacy-trunk
+24878 cb55f15b2730105fd9b593e21a990724c9b945a7 legacy-trunk
+24879 b484aa61cab4a6aee6ff07f1892f95a45a9b7ea1 legacy-trunk
+24880 9d480d0fe690571cfbae520b2d71d65bc1eae022 legacy-trunk
+24881 268b57d9daed18a3c8e76b5d43b0fa8a5d90c934 legacy-trunk
+24882 fc813164ce9f9813e67200b467bc8e9f858bddcb release22-branch
+24884 349d66cd874c335dc4656094bd3bc476f1ab952d legacy-trunk
+24885 7c28e956f9b0bad6bc6a149e3eeecbe01f27ec06 legacy-trunk
+24886 ac3ce1faec68ea3c7114a1cf0de4cfc2660f7a34 legacy-trunk
+24887 4232d257e4ff22eb87f7b335018747a9d76b30a7 release21-maint
+24888 41ff4777926eb519199a5db971ee55d9eacdfca5 release21-maint
+24889 1339b6d32e953db8b8b6b40676879947822344de release21-maint
+24890 e69b21f2529ee6c459aa2fb7268fe9483fa355da release21-maint
+24891 4a2c3ae09e0c4efdea2a563cc83706cb1e3ddc02 release21-maint
+24892 2a785b668a1609254edc7f60b3d6863fb0a72cde release21-maint
+24893 006c55bdf7e156fc2e5756eddc40f527ef6992ba release21-maint
+24894 c48d8b362acee1cde2b07406bac13c08d426bc49 legacy-trunk
+24895 ca27d82ac89b46e3d3e9ea3e07a334892c9d7708 legacy-trunk
+24896 e8cb236aad279626faaf7eba6c4f86b58153c61b legacy-trunk
+24897 7bde9ca90554934e12eda6d4d6d91bcda48de719 legacy-trunk
+24898 0af9ac87ffbc1d9e32566f821531116501a0be8f legacy-trunk
+24899 bf519321e7967e2d206c190b82cb78015dadc7b4 legacy-trunk
+24900 5d4135609efc1a84083dfeb1f1cfd52199f0ca9d legacy-trunk
+24901 9c32e9200abee91e2170927275c91cdc0a43768c release21-maint
+24902 5f3213655d955f417b5101b87c4ad35586f6821c release21-maint
+24903 114a6bcfe86bb84f1fca67bcec51b1a1c028fb8a legacy-trunk
+24904 f72244cf85a9b7622b47bad6d74eb08d69a6e16d legacy-trunk
+24905 ad126c0636548d35be475a11d616ce6e77bcb633 release22-branch
+24906 a60fcdc75346b3e368a4484099fe1e57bc7a7344 release22-branch
+24908 d59868bafeb10b2ced8c2ab26bd4638b06689e90 release21-maint
+24909 58a82a4be8b173e52e9fcce1fee33b6fdc5a3b00 legacy-trunk
+24910 68842d295d2cccdf86b90ccb9c1c8464556a7158 legacy-trunk
+24911 82cb17498fc1fb7deb73b2f3b992638dc548346b legacy-trunk
+24912 3b39ba2b800edd7d9a24547f05f30d59f383fc6c legacy-trunk
+24913 1894796e930c14574bd334dbde5286e51854e989 legacy-trunk
+24914 4554072e76b4f09ab6fec993b8ce90804ea1a241 legacy-trunk
+24915 b2e79caa68e0b1c9bc85ce39dcb33ba11ab4f2c1 legacy-trunk
+24916 e6a7ad6c3652da3a38d4bfa26597c8db5fcd0776 release21-maint
+24917 58b77ef472d4c2a3320f65c498b76e74b0a8db09 legacy-trunk
+24918 52053afcad325c63867a9c56e08150bccc998613 release21-maint
+24919 1ec34a0d02a77ce43ab29bedb553d88eca8a9355 release21-maint
+24920 43b64245f1aa7b9e13c77e7969ca999789b9d1ff release21-maint
+24921 ab92eaa140ef94e75cd2f639b95e4f6eead6bae9 legacy-trunk
+24922 847425d5bca807939b76d918691081f68437b3e9 legacy-trunk
+24923 f8475135ac13436f062c35ee19f8c6c7c88f25e8 legacy-trunk
+24924 fcb649b1004de37e98d1f277d4fb17a38041dabc release22-maint
+24925 5d77825bbc10658f211513355e87bacfbadf0f99 release22-maint
+24926 9e0233c0e003c918c7524398d0f0208667b10fb7 release22-maint
+24927 ac8d85da6d0dbbe48737c0e1071e5c2fc6f7828d release22-maint
+24928 e2047af0b2e6e6fd2b525ec190ad16d24d5f65e3 release22-maint
+24929 12e0d58e44bdba14ca466a3d77d438a26e45ea0e release22-maint
+24930 18db91c0a78f1ce7f20b42827ea12d85741c5736 release22-maint
+24931 efd04d1f3085e1fa6142df22382d6c21ec6a7c50 release22-maint
+24932 cd77aa11eddc19f6c8a3f5f251f2ca5fd9fec69c release22-maint
+24933 812d1543ba089aa103f4656b3b89f7e812fb53b3 release22-maint
+24934 d089d1e8411ccc4349b51c5345cd9798212a4bfe release22-maint
+24935 f77758c872fb511f63b001bda0c71a208f7e9ea6 release22-maint
+24936 8d51c7539719b19c5415b8625d81f6923cd4e546 release22-maint
+24937 9ccead5fd2971178a6d164b78e60d51eda759fff release22-maint
+24938 3977ad3b08257d50a647ab8662d8ae4898a05674 release22-maint
+24939 b9371f3241b85007e2b8a5f6d5055fb9be281aa0 release22-maint
+24940 ac4b1c4c3b12f284df371a0fec7fd4fbe40a0877 release22-maint
+24941 7b2d701ec404d739a880662c22ea301686772742 release22-maint
+24942 a94e4821398da29c582017d9023d1cb3e917357d release22-maint
+24943 a2eab4de5505399b2014573ab98ccf0ffb165aa6 legacy-trunk
+24944 ec623047073a2be4172844995fc0cd5dd64c4cf8 legacy-trunk
+24945 16a82423b86020457a4f4e819c804b4bff227e9c legacy-trunk
+24946 fdc39e27a494e8b6a74b2e503721716cc98a28ed legacy-trunk
+24947 29c1a58dda53faf3599ece6f8a1ad9442253035c release22-maint
+24948 097ae0adf47fbc416ccdfd400aea79113817470c legacy-trunk
+24949 6e9a4f9a55a41b34a6f9c6f3b3db87c15a547f69 legacy-trunk
+24950 d04eb8d664e2df30c6fbe04adee0dce3edfcf829 legacy-trunk
+24951 92da74c8e5e8c02b7d7a1955790cea5fc5834390 legacy-trunk
+24952 5b7b386cb0d453576a7b851968b8d1fb79174cff legacy-trunk
+24953 7dd39598827581cb15cf6f6e9fb76f47ebe7b6ee legacy-trunk
+24954 ff70e5634ae9127a791fb1b37ebeda9462f7620b legacy-trunk
+24955 18a70a82af15978861462f7b96fedbb69459d98c legacy-trunk
+24956 e56047db653847235322b45020222ca3b34a3e80 legacy-trunk
+24957 5ff8bb25031c82308c81a1a19afb2be82ad6a2fe legacy-trunk
+24958 8578355d23d3495a04a308c79c592e00523ec692 legacy-trunk
+24959 cac931ad3cc5a672d0e26635916bdd9001ef60b4 legacy-trunk
+24960 697051f67e976a503a683612f8fb8077888c5ff3 legacy-trunk
+24961 fe54e8d93cb48c20d1f85006e071474fba5b9bf2 legacy-trunk
+24962 52b3b846f11f54dcb5d67a0362fc22f00730a260 legacy-trunk
+24963 a50df65aca7a9b815004cccbc43a69311a5475e4 legacy-trunk
+24964 2f4073269dafd3387ba181aadf99d3bd2e0ff78b legacy-trunk
+24965 64d0c949f33e2febda7bc1e463fa8d67640b5638 legacy-trunk
+24966 035d9c96aaecfc8840d582440b5f1d7bcb736369 legacy-trunk
+24967 67da11293406cd4f744fc3186775255030582266 legacy-trunk
+24968 be213f1cd462e1b58aafcaf1d2402efb47ffb085 legacy-trunk
+24969 fb34f55a03fabf40217f2174dea1c23304907b63 legacy-trunk
+24970 3ba0f1b20320c974fb0bc095c411b398123b2213 legacy-trunk
+24971 a9e06ffaf7fbe9d8c79a988e684e6814bfabdd76 legacy-trunk
+24972 937cc10cd39df0177c1e2cf97187881eb5a0aef3 legacy-trunk
+24973 da8b997469e7dc0fb58181b15a73c36683c44cf5 legacy-trunk
+24974 8dfbfbc931b4a67b891f421d884fb9c58ac17720 legacy-trunk
+24975 095cff21956cbf914e571e9ebe2e20f4d56a2116 legacy-trunk
+24976 ea85eea6b2b949fda62b5650abc956db451570ad legacy-trunk
+24977 3b43f40af27a984a1a660910fd3000fc67bfb0ca legacy-trunk
+24978 ccea8782b847231e0ce84cc3ab784d4c2bb811d5 legacy-trunk
+24979 3c8a9ef3b9543962eb7db0b85c24e4116a0d9571 legacy-trunk
+24980 5d009e5e13f799eed854480c0bcd9fd865e85f11 legacy-trunk
+24981 7246fe5e5a2827e2d4e990b8c6a90e185be04730 legacy-trunk
+24982 d594a58b446d5f3ce4bbecddf18ef1d001d8e8dd legacy-trunk
+24983 1491f1137e0ea570e58ab49c218704c415af37d9 legacy-trunk
+24984 be8697c70e7c2e55449a56213b9bb10992b540b2 legacy-trunk
+24985 a33bb73246839db8cd93c471064e7bcb34622047 legacy-trunk
+24986 758339dbdaea782d5fe015883117006294c45104 legacy-trunk
+24987 de1ebcef7d3107e4b30822f92dea537731705a02 legacy-trunk
+24988 051f3b65ddab8495bcf1b066682ca24ec48d5639 legacy-trunk
+24989 6d4288e8918b2674b87cf438b2d371770e1b57b6 release22-maint
+24990 dcccb9cea05931a2542472cd549c568fc9b204bd release22-maint
+24991 dfc970409f7ed02341f7e22b670ffc526f76336b legacy-trunk
+24992 66e0080c6dcc901b0b84cc8803b4a7a887424a8a legacy-trunk
+24993 5861885577e997051a2923557d801b2e5841542a legacy-trunk
+24994 6f6f0e103566dc9c951f6f329906fcbb624c606c legacy-trunk
+24995 63a2fac2104c9a7a2dc510b3fe4ab625d1db5e32 legacy-trunk
+24996 6ae85d838466a257cf53c3e61f03a7d98bc0c617 legacy-trunk
+24997 9c7da272c9b94e881627c7b8a60fea1efd3bf4a9 release21-maint
+24998 cd07e84235e6db0353e1acfc039fd86701baf732 release22-maint
+24999 2b746543ab3d728de47683e2a418f7d559e657ca legacy-trunk
+25000 62219ed21599bce4d930bdb51dbf82c98c797c5e legacy-trunk
+25001 851e4bf30358ef8d03e046cd093c17d336ee4e1a release22-maint
+25002 b72da0780e7a592a2e5c409ebfaf2c35dfa628e2 legacy-trunk
+25003 3a4a34fdfa81a096bca8b1dd68abaa21a596f743 release22-maint
+25004 35e3f2418b2da9f6f298c6c414126faeb4d328d9 release21-maint
+25005 3c0bd2f37a788a1ff04bf9d4517d92ae5aa576c3 legacy-trunk
+25006 a3a62e440f2a692d0ff75380b31094a8d3e8420d release22-maint
+25007 7e2a3a2bac33fc988fe61466bcf2123fb9eedc5b legacy-trunk
+25008 a5be0765c57136119f54e4ae258de8453eb84f1c release22-maint
+25009 9912a96c1fb394f0c11770cf70e6aaec53762a55 legacy-trunk
+25010 195917b7a60242fb4d06ef13065b0d77c176d556 legacy-trunk
+25011 eb0519a467aba24fd073d8dfaa56c1f256864fcf release22-maint
+25012 ec48f96c9295dde080ef27ef49f54b1cb3940af4 legacy-trunk
+25013 c3c6de14530996a66baca276897bc7afc2fe7c34 release22-maint
+25014 68834a69746a85f7cbbc0d3ef385b1f328212b25 legacy-trunk
+25015 29b3dc90be95cb48aa5e5bb8d96c95b4510b6dc0 legacy-trunk
+25016 9a26829826e9792b8174f37b3f19d79c91041afa legacy-trunk
+25017 6b0e16cb65d5929edc8df778127f624eea9dfb3d legacy-trunk
+25018 34eddca1fda79a5540c279e47e0cb60f7a7c1fed legacy-trunk
+25019 7c582d1b9cf81e1a4abb36f1ba4150816a84a277 legacy-trunk
+25020 22dad9fe09ca13dcf99ad11e298f0316c2709d15 release21-maint
+25021 362915b3872444cc99407830257996c6c8fff69b legacy-trunk
+25022 9de350a6542edf1a87193474b3e64b2fcac36729 legacy-trunk
+25023 b56843c15249b3989ee456d31838b944e6fc4191 release22-maint
+25024 a911934126fd866dc10fc9a50f1f1502b23677e4 release21-maint
+25025 7248c37513f375dd303056b8d9525164ceedd5c6 legacy-trunk
+25026 8239129e75d0a0aa525c227f95f0b59da6c4aaf6 legacy-trunk
+25027 72bb70e9640e4804b126cbd751e4d59490dd5e66 legacy-trunk
+25028 0d3bb68e3a28a32e12606aef4e3db53c6f8dae88 legacy-trunk
+25029 544e262061a362ccd20581cf1e72190b22e55ab7 legacy-trunk
+25030 646f8c088f5d847eb870dfac98fe994d7d9c199a legacy-trunk
+25031 8970e746681133a842a5a097a08c4e24c5b2be78 legacy-trunk
+25032 ffabac50973dfc619394d0a8c63eaee6b5cad6a3 release21-maint
+25033 a1c328337c8e848862207c0b5afe3c221f0f01f2 release21-maint
+25034 88c463f879ef2755bb314b52e40353b9c570a500 release21-maint
+25035 068e873f0932aabab37846dd383e4c265803124c release21-maint
+25036 08a3aa9512e982b20ab840cc6db48a0315f454e0 release21-maint
+25037 299968c279b980d73106d1c9218f54cb7902a084 release21-maint
+25038 3a5515050b436bc523f693c171516c8addcfc67e release21-maint
+25039 a1d6cd97e31963ce2ef6ab93120a700e268f82c4 release21-maint
+25040 edc3532fb2b8fd0ffd610619e486fdaa0c0a83a4 release21-maint
+25041 c4fe95fea3e6ffaff02d2c9c79f2b7b1c88bef43 legacy-trunk
+25042 d05ebbd965a37125f74715846f866eb9b8f03cc1 release22-maint
+25043 116e3218a7ca607a8e277c771ae04eabf843e3ce release21-maint
+25044 8b245297c166e6cc256cc2f03e38dca8821086c3 release21-maint
+25045 5915d45b8098416f98e1fb72490435921b9d151e release21-maint
+25046 a49a65a95e35cd369cc8e6a3dfa290fe11d253be release21-maint
+25047 1edf5ed1af081a0255d0e81f5b93ca880392261c release21-maint
+25047 f76a425b14e4ee8ade5e9239598538534b3a90a4 release21-maint
+25049 3e78bf0e2be8d2ddf1926bddc3c23845ffbbcf11 legacy-trunk
+25050 db2c128125f4569ab9bddbf0aba8ad8f2bb9c56f release21-maint
+25051 10d1d7d635d422ef74a4d63be959272175c3e1ab release21-maint
+25052 2f3648600e601fdd9959c7a4539b64feca68a085 release21-maint
+25053 7fe3e61abce3ea82c2d3b49aaf26e1aa185f8a90 release21-maint
+25054 5c62efbce4fa061dddc886193c2e66695782b10e release21-maint
+25055 d74dc406641689249027ec7aac73c220e148e1c4 release21-maint
+25056 aedd85187496487eb91c74b1a1724b2540d062b9 release21-maint
+25057 ce35e570ffa21ebdb0747c6c49fb139da7617475 release21-maint
+25058 a0b352e76862df0c8995bdb9e575e80a27ed31f8 release21-maint
+25059 ea1755d73e921ac90a603fc2e2f6c78083ba3599 release21-maint
+25060 2e228461a391b18d7965c593c4c9c6a82a43f41c release21-maint
+25061 32c1c0afcf98dc4c7d785641b6a0f1cc877b1da5 release21-maint
+25062 3b54c44524eb624343966339a57ef257bb7ad658 release21-maint
+25063 48ecd6061e88d0dbe902ce673c7143d91b53453e legacy-trunk
+25064 4027361e7956a21eff9f04b108084548f1865436 release22-maint
+25065 7531cc592e463a1f840edd57648a0e3a678e29df legacy-trunk
+25066 4a5a010c8f444299796ade5de05dba72984b7265 release21-maint
+25067 aa83fe6e9c4f5ddc4fe41b73a118ace46a5492d4 legacy-trunk
+25068 3b73325b32e5943fb417d568661da877d41dbf9b legacy-trunk
+25069 a6a31c55a16d050088d37c7554abaac69338cb8f legacy-trunk
+25070 866615f0ae2a7258d6b0451fefd4cb81a97dff4e legacy-trunk
+25071 3be40d3aff945f6a9038a36f63adcba3816be3d6 legacy-trunk
+25072 437393e780cbff3d32ea9440241c40a8ec47f072 legacy-trunk
+25073 c64fc56f60725f8928281fcd24ffa0b99c0ccf28 legacy-trunk
+25074 e223397b26fa5a265fdf3492ffaccef80cea4152 release22-maint
+25075 630293be10356e1b0627356a4e76236976cd2fae legacy-trunk
+25076 4c6c13aa8a997529f70628c5ff6bca75501fd654 legacy-trunk
+25077 4eae66be1d291ba27459ab61876d28abc9a39495 legacy-trunk
+25078 1d91820128a1c99ca08448e1968920066d0337a6 legacy-trunk
+25079 81a83a65246d3006c967a4c5247cdde78e38f538 legacy-trunk
+25080 ec6b67d2803d2fa22dc1c2e5f8b7340430172cf9 legacy-trunk
+25081 e99198234d96d24d54b4930cf90711b38ccda4dc legacy-trunk
+25082 25e44a0125e457c6af66d74546f5b66e47fe64a4 release21-maint
+25083 9e173cb35b6dfdd73ed35b0d1dd6342e4b93d950 release22-maint
+25084 ebe6bd576f65d9b8aee08c289143e3cd288665ad legacy-trunk
+25085 884e57bf3ada41073b6e6d7918ab8ae2320893e3 legacy-trunk
+25086 5d2bfbd47f1be2a02afb020527d2caca19d6ba28 legacy-trunk
+25087 67761d5b4ae6a2ef1571df7d469a52d0fe542c2c release21-maint
+25088 5a329a257197f952c6ddf6da7c46dca865e3b061 legacy-trunk
+25089 54eccc5d22dd2741ef89f80e0056853e9a8e6226 release21-maint
+25090 e65475b4f3cf8b58e6994a4c0a9aaaf679e78237 release21-maint
+25091 3e26f5dacbbe662f10b59cf8cc61f43f26c63a9b release21-maint
+25092 d963184381187288df897841f066ff6759a6af53 release21-maint
+25093 31b25014174bd6c848243cfadce9466945e2d779 release21-maint
+25094 dccbd7bb5bd5c8515333ecd96974f8f09cee9297 legacy-trunk
+25095 c3a8648bf097ab70128b4fb1fea963dc7f75b047 release21-maint
+25095 cf31b10e45b48615094cae90e3c5bd072587d8e6 release21-maint
+25097 ba8db90eef4ecaa8a1fcbe403a6e3a48b0845ddb legacy-trunk
+25098 30a817038af0f4bd6db689dd30d665239d288419 legacy-trunk
+25099 ca1b67f5a3ecd8f47b63a477cc5ce02e9de4d46e legacy-trunk
+25100 2b56af69f67ded9f684fa336db6df6383db8e87a legacy-trunk
+25101 8f4cc821afaa7283a5e8e813fb2575d953f43f28 legacy-trunk
+25102 ea8c8400a4c8d00e74e74ab4e183e1cf60df5ab9 legacy-trunk
+25103 9d5adff87f30020aa2bd8c34b37547ac850c3a0a legacy-trunk
+25104 34f85a0a7faadcb7dcfd8dd8ec6af20abc69e0c5 legacy-trunk
+25105 53fc6ec8a837605b31fc8098737e73eb1050c937 legacy-trunk
+25106 1b7ec395d3924f8f29f54de47a37102cfb3d929b legacy-trunk
+25107 442eff29b49f7b33638f8305b1e8e79e36b1ce78 release21-maint
+25107 d823fc135e90e7bb845915cec90277ebfcd2c8d3 release22-maint
+25108 74246a2d996223ec1ee1dec9a746a87c971e9253 legacy-trunk
+25109 6605f076f95a2d056c23c0c8ed11e87752adad7c legacy-trunk
+25110 c4f72b4722da634d0c517e04de434bb2de6c3a92 legacy-trunk
+25111 9c0a0c89773f182b006597ee9f48adcfe10d6eba release22-maint
+25112 9d7708ddcfb998e294902542ebc05e3436cf6978 release21-maint
+25113 19d668751b1eaf0343008066c5e3cb83959e4f44 release21-maint
+25114 cfbde8519e500e1230a3e674b3d03eae31932e51 release22-maint
+25115 0eff961a15b5388eeb531e47b9d393ddfe2a986a legacy-trunk
+25116 d60350d71b605828e5b6044ff718b1ac9973aa83 legacy-trunk
+25117 40631ae74b17bba2051c874b9592dee7f5c4330b legacy-trunk
+25118 cb40aca41889ce77385f6f468eb939ef0d21faaf legacy-trunk
+25119 7233b86be656e39f94ea92f60b03a1427b1b59f9 legacy-trunk
+25120 dbb703eb6b3d9b4e0a3efc8d17da9621b2e0fb41 legacy-trunk
+25121 1a26dcdfb6cc9dee3d8d3095759ec2be90439a33 legacy-trunk
+25122 a1b0658293a709913b81394d965225cbbe93205a legacy-trunk
+25123 652dc51b5f832187cbad0734ff840ae1651c82cb legacy-trunk
+25124 0110a0983e61930cc105d1c461784df6f7b48511 legacy-trunk
+25125 3685615d21b327f5811e68d123f0297ec14a3664 legacy-trunk
+25126 8b116a8449bd5eedfc82cfe763d2a2d327c7229c legacy-trunk
+25127 8a2cd1c0c1354ec8fad6b38f2335c00b88fa046f legacy-trunk
+25128 e227c8d03d6d8c24d454c53a71631da4fcd09727 legacy-trunk
+25129 e6d5c4c745bc013c4fc631088c53fb317445a7b9 release22-maint
+25130 5787fc48c2b55a50718aa406df4a391b618e07f2 release21-maint
+25131 8e67d9035b699abba211812c553b65e2d9da195b legacy-trunk
+25132 ec750e37671be3eb525ed88ed17e9d4a9d58201e legacy-trunk
+25133 d5a38a32f78b50cc8588ecc2445a42367c4e55fa legacy-trunk
+25134 1ed268ea2d26303933651c6f1c1021e5e698c14e legacy-trunk
+25135 16cc538401b3f082ddd8fd567e7d5a23d1f9db1b legacy-trunk
+25136 9bec183fefff61ced3ccad1c05d6d3f160b399ee legacy-trunk
+25137 633e64564edfa1abc5ca2a6568608feb179b9f0a legacy-trunk
+25138 f8873625d8f604b6fbf583d1e33339cf0e19c5b3 legacy-trunk
+25139 6f958f499b4295705364e5cefbf5c14f0edca200 legacy-trunk
+25140 0fe875866d4ef5686255381d6bba58643a58fc82 legacy-trunk
+25141 da17a10e2f231c920765942eb5b27a1061a4cb25 legacy-trunk
+25142 3e0db984bd3e304c77ae19b3a2cdf8fec87bed42 legacy-trunk
+25143 2c6617f270e2c92dbbcf01f0d21c7db6422cef6b legacy-trunk
+25144 5a5d94c499750e3d3ca8c594368f5deb46b16f1a legacy-trunk
+25145 6c5c112d45339bd772853bf89999cd1d89fa6126 legacy-trunk
+25146 1383e6f7b11f99d74369eecb903b293b502bf6c0 legacy-trunk
+25147 3ef7bed007f6ed37c29699f64cec03d8677da400 legacy-trunk
+25148 05fabd8f4e7f8d65f3d1b0aa5315af942a4e2062 legacy-trunk
+25149 19e0a92e32777ed6fa5dc27cfbf9e8871a75edfb legacy-trunk
+25150 6a8c46d8212bc67b292e6982e754146711f29ab1 legacy-trunk
+25151 95760ab118755f571fb1dc9e423b978c8aad4597 release22-maint
+25152 a68ba755d700e5e31acfef418ff23fe53c28de2b legacy-trunk
+25153 ce10a7f967e5a7bdb624ec73d6408a5d13559b4d legacy-trunk
+25154 483f5f272defc6f47e499c3f69b766bc1e174603 legacy-trunk
+25155 c888620e8062c7c7d0f508b0218b339a37ca70ba legacy-trunk
+25156 26a54d3f55e47ff354734fa065c59c3efca7c570 legacy-trunk
+25157 e7d8a9da3b18040b7f312db36d88fd4df23a3835 legacy-trunk
+25158 03a2ba74179b9f15f0dac73bb74a0b1a52a0821c legacy-trunk
+25159 adcc14142432e814e20755ac8d3aef054c3dd2c5 legacy-trunk
+25160 24098f4f682ed16fef16dfa22952bfe75d7faa0b legacy-trunk
+25161 fa3051e0fd9321209f7ea467c574980828cab148 legacy-trunk
+25162 2c8b03ed39063a4e30fe0554fe76843aa457f68a release22-maint
+25163 e0dbd1754aa908c17c15f8e375b8b6aa12c9c067 release22-maint
+25164 aae977ca58a3a7b1e13e1402376b8bb7e24303b1 release21-maint
+25165 345b92ed2a3fb7aa2fc9a541d4dc9456fb5835e3 release21-maint
+25166 9260f69432a93c9a7d4afd22e4b195c324c61348 legacy-trunk
+25167 59d09ba1f782c8f8eaf3ae17b6045ffb871561a1 legacy-trunk
+25168 63cba423fa040bf105f2c88c8b18e53072d19dc5 legacy-trunk
+25169 7441533aca3bb9bf6053fe8bf91d936c5178942b legacy-trunk
+25170 7a11bfc66214317137f35618ee0d64559f1cc3ff legacy-trunk
+25171 444591affd0e03cc306c6c66349c67f4fc5bd388 legacy-trunk
+25172 ffc4116ec119f8abcd9bf9efb6b70c03ad41785f legacy-trunk
+25173 f3b0e3cb340b30218910933c9b9ca18062ac8b91 legacy-trunk
+25174 05e63111c3106e0d9ba3b98588f3633615417428 legacy-trunk
+25175 905213e286775713cff3e6baa5ced83125fb2803 legacy-trunk
+25176 969ce017bd3a175b550545621995ebab36a44373 legacy-trunk
+25177 3a707520de3093e7f81a9f8000cd3bc1c004c57c legacy-trunk
+25178 90c1f3f37dae46a85fe72f6b10bff6171df6b829 release22-maint
+25179 b12dcd276db0fd23e9ee9a079813a0b21de24fb3 release22-maint
+25180 a4e4736799b18f369f7fcb23ebe09e54f12c3fed release22-maint
+25181 1d86cdb17291609ed0edc3110f532325c4fd7d90 release22-maint
+25182 14da7dd37c94e6a648b283791bef6eff2491345a release22-maint
+25183 dff228ad17b983525a37658dfce8129ecae1b421 release22-maint
+25184 6f455d4918715f3719ef7d83d6219c0115b79d15 release22-maint
+25185 06f8a821b683cd13555c8e58bc1f80a9fdc33732 release22-maint
+25186 7e7964c682b56238fcbd3338977d6252ed161da7 release22-maint
+25187 7ba2a8c162fa267a773a151b312055c90534f804 release22-maint
+25188 9b414df48e147e95744421c618656c5ecf8c773e release22-maint
+25189 731beb67fec9017a926b26f9a6f2b59043748e0f release22-maint
+25190 5caea2b132ca185e07e0bff50d93a736af919625 release22-maint
+25191 4f54e9a2976e6c221cd606bfa96c7010a8fc3f95 release22-maint
+25192 aa713c4c498dedf3db20fa5717d027daa59f9764 legacy-trunk
+25193 070d392042e3eef6702c51878bcef3372edb8a25 legacy-trunk
+25194 c1d55a627897740377cf1e7f0c09ea14ccdd7b37 legacy-trunk
+25195 f379bc0c5e3fc972473c63e29b1e5c1d4968c44e legacy-trunk
+25196 6a1e74adf8d6cec4d2c112667966581987a9008c legacy-trunk
+25197 11cc0598574d81845f18c2dbfcea0323ffff53ab legacy-trunk
+25198 fc10e70218d3be3c25fca3389e3744c5ad91f630 release22-maint
+25199 5e67ad76c72fdadbc8a7148099944af7bc76657f legacy-trunk
+25200 fd4184da09830f6dcb0b51f6a1432621eeb1619e legacy-trunk
+25201 4b3b06de02a3115bc0408e5af55c367648ed3195 legacy-trunk
+25202 fe2b64fc57a0a0e40fcae860e4a2b8c037db4565 legacy-trunk
+25203 43d9c2f9a2f6bc021735d90623bbae8e7463865c legacy-trunk
+25204 48b59fa6f64722d5ecfc758a1c4fc51411f26883 legacy-trunk
+25205 a93a7bcbc386fd6878ada40bb26d9a5d5670cec8 legacy-trunk
+25206 26b758c00fb6064531116c112cb81def487cf952 legacy-trunk
+25207 45731f1360eece265b92ff359685d5fc8ed14301 legacy-trunk
+25208 fd424f519a8ebe83e860383e1495fd575055e4a1 release22-maint
+25209 faaaeb535d392e7e0dbafbe36d46a5c86876b210 release21-maint
+25210 0d08cb849511808a39debfdede77f8d364fb64b0 legacy-trunk
+25211 e0fc286d57a46cd6a787aa5b91e19ffb2a64aef6 legacy-trunk
+25212 9e384f10304721087ef75b1d1f956832b6925a9f legacy-trunk
+25213 6583c95cf692242db139fcd0dabd9b08b8590d3b legacy-trunk
+25214 c433de17c1583aaa7828ec8d6a058c9684761b76 legacy-trunk
+25215 1f2e92850188738889ac3b0d905efa026c2e835f legacy-trunk
+25216 2f616474eaec7df5ab18c5733629cc2d089f6ccd legacy-trunk
+25217 9cff890b4fb076a8351f3dcaf0ce670684d6e330 legacy-trunk
+25218 d521cf0899c803b52b0daed49b7e9d8587b72155 legacy-trunk
+25219 76607a0c695608f57630443386c46841d34ea1a5 legacy-trunk
+25220 20bc4ff1215c0fe70c8740140bcfb474294dd067 legacy-trunk
+25221 f5aab8eb8124157b2dfc98a52aacab6d02140bce legacy-trunk
+25222 53ac8284217afd1fa733cf2295e3351711811327 legacy-trunk
+25223 cbf41925dd3e93171b0dd9161a3ff60dbab86f7c legacy-trunk
+25224 f708a907dc691a7acb387441640d34a6ac36af14 legacy-trunk
+25225 53fecc8dd4c905ccc775ae34bdac583724709ee4 legacy-trunk
+25226 6f62d51c9c12819ad33888689b39ba0c93fdf924 legacy-trunk
+25227 da008b5c5035ec05db5289113a4325dc7ecbc8ed legacy-trunk
+25228 3cd0b4bb5e34d249aac38179357319c4c19d79aa legacy-trunk
+25229 b5d002e90827e06fe7db1bb5093200916888b61c legacy-trunk
+25230 042db0382cd3b832f5eceacede6c36331586dd9b legacy-trunk
+25231 5043b738b0720c3f0e04c2752680e7f2449ebc72 legacy-trunk
+25232 ed861e0d4a71d4866ce6150308a41b7340fc768d legacy-trunk
+25233 844fe725b1cd43128ff5ffffebb2f5469f36568f release22-maint
+25234 4d721357bddb5a8af5699e6cd942ee6f3561aa56 release21-maint
+25235 7faf0fddf7e68aafc9d2c6276253a7e526f2a517 legacy-trunk
+25236 78e36f0523a8c858a3bd7317081d56fd2a9f8559 legacy-trunk
+25237 e48846717c26f3c368bc797a61b53d47d6bdcedc legacy-trunk
+25238 49d93689402b54e0104bc30f6442d737ce2df83b legacy-trunk
+25239 8dafe4a78cac46515a63f540343704648fad3172 release22-maint
+25240 35f84893acf769c8d2f00a09109aa5b1bc41b097 release22-maint
+25241 1c769217c1059f3fe3357e0ce8956543675360f1 release22-maint
+25242 94bac88f150f00102f54026ba4f21aa946863b44 legacy-trunk
+25243 0a813a3ddb92dd9caf9a5b1c2b23e8b2ea58b657 legacy-trunk
+25244 04cf4e13e5c9fb34ed74130d5d19abf92c15e60e legacy-trunk
+25245 c8286cc702c9924f1e2b213cfeeae2202fdd0402 legacy-trunk
+25246 abedb2418f6231adf24205092a59996f1f1e4c02 legacy-trunk
+25247 e10869726cd41b72a8b1f91dc0af3b33f4fc7455 legacy-trunk
+25248 836c1dbf23a0ea981cdf63b3f71d354264bcbf1e legacy-trunk
+25249 19834cd101d91b5f326e451d9142e9114aaefd07 legacy-trunk
+25250 64e5a39f1ff0961582f61a395627a5bb5d425f4e legacy-trunk
+25251 17a56e1c6ff8e27d2d3dd9653e4b1d06c1f8925a legacy-trunk
+25252 8ed7c61b5f1ba35b15a1a4b51931126621bcbe54 release22-maint
+25253 8613df17f19bbd38e591418c84dd1f23ac118007 release22-maint
+25254 f245955b3fbe7f4a2c1aaab2250a5db6fb578d1b legacy-trunk
+25255 21f59d9ed169f4db0763b83ce0047c0dd81ea503 legacy-trunk
+25256 937348ef18b8560423a89e69258140b469a2173f legacy-trunk
+25257 98e92a64e73c2ff751ebab255c1f8d1451c3e6e1 release22-maint
+25258 86fcd9438cbebd718378e54e64b22b9ec225ea9a release22-maint
+25259 4b5c28a62d16e4a4f78c3b4d3a127f0ba3711854 release21-maint
+25260 57eaa5d69ac35f50d80a7dc0d0fc4830f1fb9e5b legacy-trunk
+25261 4c1ccf36025cd97aadd0ea13167fafcd401c9004 legacy-trunk
+25262 1f6bc498e6e56e2fc55e5ef3d0440bfa27a7d83e legacy-trunk
+25263 c0518ad72b92e0aa9cada51067056b7f70ee0010 legacy-trunk
+25264 f00781d664a9a4b431ebb07e43fa168d6d7475b8 legacy-trunk
+25265 dcc0778eb7d3b41c1782acbd367d1012365515eb legacy-trunk
+25266 f881e0618df0af6650d11d6765a4f314ea77c459 legacy-trunk
+25267 7f6523b321792623a61c26f0b325276d42e19f11 legacy-trunk
+25268 16faf687500452f9d2b331183c4ea6aebe16cbd5 legacy-trunk
+25269 7c30cb17c2f656d7a0536eb9ecc327ef208dcf2c legacy-trunk
+25270 16c2ae369d715e2e9f67f06f21528f3e9cbe3200 legacy-trunk
+25271 794fe37ca5f4e8b59963b18d77a6af3bf8c63603 legacy-trunk
+25272 1517b4547b8766ca3875053f590d81959621b403 legacy-trunk
+25273 9d2ae85319440458806e4fd9aa1038a48918f28a legacy-trunk
+25274 0c69992cce09946d38975f23413d601f4770a8f1 legacy-trunk
+25275 e163713b47cf21b13cd9b8591a6dc15af682ef2c legacy-trunk
+25276 15c0e7aef666d1883c2d7e5f72c9b8a40dfdcce9 legacy-trunk
+25277 b9815f4d8be35854956ff2f77a8e662cc819a3d2 legacy-trunk
+25278 076e9dc77aadb3857023655f5ef510d88989b7c7 legacy-trunk
+25279 c3763976112d5affbb9e4559f90102185d9536b7 legacy-trunk
+25280 59bb43b6eb11f25fc9c420df23e298697d86a916 legacy-trunk
+25281 0f5dfa33f9ee84e0d6c0787654caec0e2bab4116 legacy-trunk
+25282 f7aa327ff0feb9271e3effa2a649e69e1f8f8d00 legacy-trunk
+25283 efb6e617aea39dd1aaa7f1cc8c90ea42156ac90f legacy-trunk
+25284 87aff648d994e237dc26ef66d4482a5afd52a8da legacy-trunk
+25285 1097f730294b2c90a9c7abf62553cbcd75bea53b legacy-trunk
+25286 9f6e0cf1ab3097a155e75ff2f13f887c109256df legacy-trunk
+25287 24482921a78a9b92d4a595d956654df47b64b31c legacy-trunk
+25288 a13bf2f72629ab68a7130754c7a5cd16608d7415 legacy-trunk
+25289 7e7159c0283091f8feb7b0eebf60d5cf12eb22b4 legacy-trunk
+25290 88e217e5053fe447dfdd078f50b0e4af47de2f28 legacy-trunk
+25291 778241581d4a356c60383eed6db607603dd0f29c SourceForge
+25293 7f35bb92fbf7534802b89d7ee978789c6036bdd0 SourceForge
+25294 7d5b2c679f3bcd13d6f68a07feaf7c110d7b6055 legacy-trunk
+25295 ab68ad43d51435d6103a5554b4e3288409b0b1f8 legacy-trunk
+25296 b38629b9154512bacd31d1434f51b765e1190867 legacy-trunk
+25297 71ffc9fb5986f59531a0859ce002bc8e99f986a4 legacy-trunk
+25298 e20d12b5dad1c0fc623aefe60850fd4b0806cf0f legacy-trunk
+25299 d742798cd4b4a46b8c47a719dcf8013ba9b666d7 legacy-trunk
+25300 8298e9c535da84f1935fb52f263ee15e062f8edb legacy-trunk
+25301 4ab29b06a76cba0e22c48a23a15325fb6624a4e0 legacy-trunk
+25302 6bdfc9f6f059032d5effc808b4b1ae61014f3621 legacy-trunk
+25303 32d0ef6f19557062c2b030a6083bdf9c001f2117 legacy-trunk
+25304 f7457fab76f0dbbc70b279d1874cc3a091006505 legacy-trunk
+25305 9d44e752d617ec5409b4adff8f5f59bfdd32197d legacy-trunk
+25306 9c8323abf1dbd27d9ca0cd7d725499e9a5969176 legacy-trunk
+25307 f39213405e05c48b639f3c7ca2cbe0e682bd43c0 legacy-trunk
+25308 cbf1dbca1f630cc3702fcbde0b71bd628a46cddd legacy-trunk
+25309 766c5937a61ec677a9d827661239afff102e6129 legacy-trunk
+25310 91a6db6efa149a2515cedacd9e46eb53651901e3 release22-maint
+25311 d2441105a9bff108cec9032d235cde30d87719ac release21-maint
+25312 17f8469f09d207aeb3520b94617f26a33cc3da03 legacy-trunk
+25313 81c2bda5d37788864d238ed1ebb6ec8c9e672e39 release22-maint
+25314 4864444520d92bca0dcf0786c1e250b494aca32b legacy-trunk
+25315 676db0300f067785fbd9284b01e467a3719b8b1b release22-maint
+25316 0c9ebcf17ebfd59296e169a4a9952a5aeeb8407c legacy-trunk
+25317 97f49edcbde720a07348b451bf8c76a6860d341e legacy-trunk
+25318 b55f2ff8b25f617e44f3979b9671d117c805c0a5 release22-maint
+25319 2e9e1b02b7d7b62b2822d80745cbb153b3c77ec5 release21-maint
+25320 9fa5d40cc7222d6f17d59194f08fb043003d7b0b legacy-trunk
+25321 5ed782bdbb2aa0079a6d1c3550b38c5ad489d758 legacy-trunk
+25322 3957d155f8c550194a8e5d38ea63939f568a4094 legacy-trunk
+25323 7a917ad8f4424f52fd496b10ac9f7efd5c73151b legacy-trunk
+25324 ea23e6e492903d103e636635b397c590daf52140 legacy-trunk
+25325 d3b1f2c0ebcfc3e3f99055dc4648f0ab68437f63 legacy-trunk
+25326 2faa23facef72df24ef8b36a2ea398ae5d162b5a release22-maint
+25327 94b90cdd6e0fe5e3f7a2939bb5a74a78870dda78 legacy-trunk
+25328 c5d3e458749e781e8cd306ed24fcc4d7cfc1586d legacy-trunk
+25329 9c402523f8f5ab57d458878a4b45b72347bcf201 legacy-trunk
+25330 4d554700c4d1723268a98643f8b327ee7ea094b4 legacy-trunk
+25331 62741b25ed65178648525593effc6755188c12ec release22-maint
+25332 72c95448ee4b3c0b5c4d82f8efcdff7c317adafc legacy-trunk
+25333 b1a871dc51962d5b8137f3f2864dfc3f7dcbe59d legacy-trunk
+25334 fce7278d46b0a8490e469b5fc39d0067228cfc25 legacy-trunk
+25335 4a1337906608fb76a3e94011682fb379f7d8b921 legacy-trunk
+25336 ea8db6f5d1c57926ce5713dc8db4671488d1720f legacy-trunk
+25337 052efc06520a21dbf68c1c86cbbeaa1076632996 legacy-trunk
+25338 8e0c3b75eff58b15a9866bf80cc4e9b499eb810e legacy-trunk
+25339 e964e0fc4bfe71bb3d0327e08a6050d1e5bcab89 legacy-trunk
+25340 a0ad69c0bc367f3413d587e4d8095297972bcdd7 legacy-trunk
+25341 19e3f8659eece2c50c3f36c7abc52455a140ebdc release22-maint
+25342 88a8fcad02d0dccbc4ff797a678f24c6fc3a07e8 legacy-trunk
+25343 c80f56010b285c83beede31f6984b61a383312bb legacy-trunk
+25344 4e9cc26e03fde9038c9fb1a6191af2d26d1f4370 release22-maint
+25345 e08ab347d12e8b3fafe2aae3a49b800cb3353a40 legacy-trunk
+25346 4c3387ba119d0187b22a158e4b421fd198302046 release22-maint
+25347 18b5c7f64c805c15e4f6cda3ca51b6045182b42f release22-maint
+25348 9b45a5874c09919ac0c4ae6c6058faefaa4237d2 legacy-trunk
+25349 35d9f569361afe6ca3d09654190aa0c1d1be6cae release22-maint
+25350 0f63111bf4c5d775f926697d3da8843ac6dab810 legacy-trunk
+25351 f92e868eb440b7609948a55762dcbc9aef6c9ce7 legacy-trunk
+25352 c843be5d58a9dc8c7dc2bf54a5a76c9939139195 legacy-trunk
+25353 09ab9ce1f52a6024eeb52e7152ecc380f82a7d5a release22-maint
+25354 08c5b0c7d9d818e7caec9c75137f7129b5bcad85 release22-maint
+25355 a7fbde6e34a50f458fdbee1c34a6aeab63a4969c release22-maint
+25356 4e996314f8fb44139d381b8626d3a1e754760912 release22-maint
+25357 1aa0ce60f6a85270c152468b219d61c88b65e8e9 release22-maint
+25358 2714739d483b627d712890c9bdaaf6114a4b45a7 release22-maint
+25359 0b15cf11431e4d176e0ffc1a867547b8d4999cd1 release22-maint
+25360 cb5b4a54ff12a4cd8301f6246ab389983e2a3670 release22-maint
+25361 defd2b1a842688bf16390963e1cb715b54ea0da4 release22-maint
+25362 7aee0f8afac508ce6fc18e0d71f34a5f97119e81 release22-maint
+25363 bc5bf72fb5d45d4c0d6aef6a3524fb0de6c7e486 release22-maint
+25364 965874279ee2d266596105e3e6fd53df21c0d934 legacy-trunk
+25365 5e95f3ee77ec143c7e23f0e665c5716f3a48b61b release22-maint
+25366 a6a5b1fcc2a7e8f54ea00cb22c42e6e82d78d1b6 release21-maint
+25367 51266b2b4360d4e6d099699350d8b9eb5156f1b3 legacy-trunk
+25368 52aa3e3e577f120c592c8fec0a77379b20e1b540 release22-maint
+25369 4cdaffc9e18cc0f0be538203e4658668abfcc821 legacy-trunk
+25370 8a791330fc203b6c2507453577521e996420bcb4 release22-maint
+25371 d24aadfe3c06a9a8bc1737d09f433ec11db1dab8 release22-maint
+25372 8ce17da98e8cbafcb98e0b18218749045aff029b legacy-trunk
+25373 82fb0f99e2dad318de403a4dd98bbc5c029e1f76 legacy-trunk
+25374 963675fe97e7891e238fbfd9b772abd88a812690 legacy-trunk
+25375 e799498836b94ec9fd45fb0c61d547a1b1a8d606 legacy-trunk
+25376 9885da3feeecd1b130ac3e40e9c086868bf81336 legacy-trunk
+25377 e3fb8d16a51aca57d3f9af2a8fd388c04a048a00 legacy-trunk
+25378 4eb81869f6197b5b25aedd0372d9ddcf897596d1 legacy-trunk
+25379 481e9a46d68011b32378beff0a6fb9baf36755ef legacy-trunk
+25380 80a04cbcd0c8011a602ec1066613e4691744ff93 release22-maint
+25381 44edbe0f21748e8e2e3cd50012baa8750dd5187a release22-maint
+25382 32d24f8d64f7b36da7442916446bc6011e1475b5 release22-maint
+25383 9f5e35786752527bdbe9660adabd3eb9eb147712 release22-maint
+25384 71f25f95e90259d52106d74e5d2cbd5e648e6c21 release22-maint
+25385 b8691601d2a0288297a56d199e19f00644f5fd2c release22-maint
+25386 e068440e116f9396e85fef142812faa7163f46b2 release22-maint
+25387 95dc3024927c988ebf162da6575db1dd8a540897 release22-maint
+25388 02a7c64e3331f997dc50320787b247681b3067a4 release22-maint
+25389 fbe820e0c601d66579f1b0130cb66dfaf8019679 release22-maint
+25390 7fbefe3e3dee2d722a5dcdc5f5ee32baaa32c0af release22-maint
+25391 556fb7f1b606743e18654de3bf549f1cd7b6c908 release22-maint
+25392 a5b25a816a6d68c2e93cc864dc259fa8675c86de release22-maint
+25393 99341e85017ea46bde80cddcd345656f9879cb43 release22-maint
+25394 761075280a95e60be1a56df5462578ae7c392939 release22-maint
+25395 b12e97143668d87d8b6db3a582d40557d9dbcebb release22-maint
+25396 fdaafaa89587d7990c4eceeaa0d0883a73a256a9 release22-maint
+25397 ae48d541f65ac39aa65eba8d12f46a50bb1d82fa release22-maint
+25398 2293e0d7b5c4506fe13583e76df9f05aeb0f1ce6 release22-maint
+25399 229b624c6b54c9160b392343bba64a565e32746c release22-maint
+25400 7223c54b07276d980dde8933a5db0299023a5bab release22-maint
+25401 e6d44cf29dbf976a51e4f5acdcbabf04856ef003 release22-maint
+25402 1339cbe94cee5545a32bb2fee41c4d3598da787d release22-maint
+25403 875fb5b72910c351f8a243d0303bc1fadbe56789 release22-maint
+25404 e0a288db022de1b11ccbfca64abf55962f189e86 legacy-trunk
+25405 f3863303a9f4fa55f0beac7790adf70cbb6fe7fe release22-maint
+25406 47aa1081af28098007e1dff8859fa64ab4d53053 legacy-trunk
+25407 1498c6e4b43a1f6db910ebfefcd4be39e07add8f release22-maint
+25408 ca2cba10b4487aaf0fff295ef0e56cf0083dcb57 legacy-trunk
+25409 2762d2251e85dc64a76210a11a5f0e4d3cef15d9 legacy-trunk
+25410 efa23d26fa35d46e4fecc4744f511b81d17f8ea3 release21-maint
+25411 6be65923c02d6dc46551f99b78704dc9fa7bf71b release22-maint
+25412 9b1cc99f5932a84978c238e35449aca6b32e6231 legacy-trunk
+25413 ecff4046197da1808b7a21d80a3321cee70a8ff3 legacy-trunk
+25414 e31ad4dd30d99883338db7533779b0cc4b785eac legacy-trunk
+25415 08d5cf596b01071c0dc63c4074ec610371271d69 legacy-trunk
+25416 49197fd76362b2f74feebb35cbb2180faea4ce51 legacy-trunk
+25417 5cbcfde3ad550767df88a195145467a3ed6e3de7 legacy-trunk
+25418 86d0f7f86550587a191457ff85d45a76d90d2d98 release22-maint
+25419 9f1eb8ff17956ad8e281765524fddea59f2dec44 legacy-trunk
+25420 4385431164da59fc65c7696b7c929b9eca91f575 legacy-trunk
+25421 ca8a2849dd56ec137c5ef6f1b515e38405f0eedc release22-maint
+25422 46bcee11b48050d11595f2d03aa345c3537de643 legacy-trunk
+25423 51ee3bddb72ce6e4134c712db43a1bec63088a9c release22-maint
+25424 5cb6cc46cd42ce4d648580e5fa7cd6233c555358 release22-maint
+25425 1087ca519eb9ae7f25e363f3a883caa9baaa6147 release22-maint
+25426 a50baa126c75e6e8d6cf8dd54bd0532f086ac8c8 release22-maint
+25427 b8374de84e2ae735151cba461c35727d04693fa3 release22-maint
+25428 97224a9cc83c6512a70dfb6a987ce7776aafeec2 release22-maint
+25429 f576d900026f36b95993f6495ef580489397f55a release22-maint
+25430 5c148f5e1c114200259bbc784e5b470e301697a3 release22-maint
+25431 3c3acac86734549fa2503328a9e3c2ec21d0ffda release22-maint
+25432 5032ec891e74563e8d2b13637bf33d826edc1ff2 release22-maint
+25433 4bbacaedc6e2d7415bb025c46a5c0e85efa7413c release22-maint
+25434 c2f90ce597553983137ab077287bf5fc640e1d76 release22-maint
+25435 52106290d392c94ae4ed4b42e5a5c8989bcdd630 release22-maint
+25436 ece4315c1206f7d42b441b982735eddc3a8f8f48 release22-maint
+25437 65926a970a171c81e32d0383606ddeac2d40b6dc release22-maint
+25438 5d1b2203b6ecf7cd256b3f7863f930786232532d release22-maint
+25439 b383c3ff3b1ecbe26f1634ca338fe6290c7bc562 release22-maint
+25440 2852b4cb7f6abf08645d55700ab299c84a91c5ef release22-maint
+25441 b70211c1d25679e4e4a3ccc116a5807396c67afb release22-maint
+25442 b5b77350a004403d704e7e0740128406aa7445e8 legacy-trunk
+25443 8d5dc1a7ee187bca102e00e5738f64591e665b68 legacy-trunk
+25444 6072fa410dcc94a4c3c9c03ce9eb3b1a8e64be93 release22-maint
+25445 55c4d083c309a0ea772a70c510949888b4881600 legacy-trunk
+25446 dfeac0334574f79e06b934c3f0958d45d0eb0149 release22-maint
+25447 ad3d59612345a24128b86c899a2d3a9fcf08b01e release22-maint
+25448 68a6a9dd42f8011cffc51b65f7e2d3092d0a2629 release22-maint
+25449 a9af89868689a058ff0fbc3eeb29f356a2a8b8d9 release22-maint
+25450 5b24a6ae2dc4f0d8dfeeb2aa847ce3fe4de7319c legacy-trunk
+25451 736fb5aec9b3b7c1e5776fda8288a0399f6ced52 legacy-trunk
+25452 4009c08402b145605520e6748cd4542c8e2e0d96 legacy-trunk
+25453 90d3ce3eb19cb59ac916627d0e9b75ce623bb2d3 legacy-trunk
+25454 7065135f9202f38ce88da1a4cd75a29050c3947b legacy-trunk
+25455 7a3e03b541ffb127812aeec7348d0f24564041e3 legacy-trunk
+25456 cc8b7f71127d84d0fa538d8b801739c4cd6cc70d release22-maint
+25457 66c745a7abb1fe821eab54c526aa4513e7fbb148 legacy-trunk
+25458 5955e0e2976d3e9151476f7f6b1abb7d3838dc43 legacy-trunk
+25459 9e5ff6747437f9fe4396a9a1927d0243e63acfa2 legacy-trunk
+25460 2efd43ca033f649de13525791d1e8eb869f7e93d release22-maint
+25461 9667250958546df2ced99bd971288e93a00c65bd legacy-trunk
+25462 d0acb3cb011da55eb75631174d4f79b0e9fe567a legacy-trunk
+25463 423bc9b51a7e4133c5db455d9f7ba488b465a5c4 legacy-trunk
+25464 c81e8ea0c4ba7c736579648bcb942d8a8c52bcb3 legacy-trunk
+25465 fcf0c244e287e92d6c6006abdcdab0df3c0aa459 release22-maint
+25466 6442fbe5dd04240a165750ecc905549d4eee0d7d legacy-trunk
+25467 cd0ce470c153c948aaaf8fc4c539d291ac764d09 legacy-trunk
+25468 d38458052442ff152cda49ab987d0771e44eb86f legacy-trunk
+25469 93eb4b61f687bbdb4064244cc5fd91205ad70f85 legacy-trunk
+25470 13ac27fa0704839410fd5bedcebb3447c7ebd4fa legacy-trunk
+25471 354cde7f90a1527aafb68f8197328fbbe0619b7b legacy-trunk
+25472 58f2c299b6544338b07672ebb989429169d8842a legacy-trunk
+25473 ad7969e8f58dfac395198642945bbce65a0cd60d legacy-trunk
+25474 c494084dc6d8890831d32dec3ffb895eb5081e78 legacy-trunk
+25475 8b104a85b99c7a277774a1fe6092c911a82a90ab legacy-trunk
+25476 79f292dbabcea295db6a610c942b5311591aef02 legacy-trunk
+25477 c454b76d51e7b900715cfe4229d0ec55c482023a legacy-trunk
+25478 d104bb50a194d32aecd50155eedcb13dac076bb3 legacy-trunk
+25479 0c4230269ed3efb98c97e4b68402b0b4359b57f5 legacy-trunk
+25480 1046964896a1a4e3966465852dac4b49fb9df867 legacy-trunk
+25481 cbc08b172d1fd6175bed9b64063495116224d732 legacy-trunk
+25482 0859e764509e6a9626144275424b3a2d10c4eeec release22-maint
+25483 b2a2cc0c2a63730b8530cc35d973a6ab0e009169 legacy-trunk
+25484 d4406fbfcb4e54e9b41534e909784445c82f2208 release22-maint
+25485 074b7e3e548d8e73111e9ad92fea8a0cddc160b6 legacy-trunk
+25486 3a06e19df46b903b297aee3834adf14e6848cabb legacy-trunk
+25487 edf05c69bbf3bbbe5035fbfc4680c0690d185b5a legacy-trunk
+25488 74f16f7a63696697c619e6de12f203a0bf9917f8 legacy-trunk
+25489 986eb1d4ebef53af456836a30b999df5631103ce legacy-trunk
+25490 5994440e5dd52b86c537da30b070a5bfe4fe592b legacy-trunk
+25491 2bfd137a976f5983e4e7c1691d27dc953013a978 legacy-trunk
+25492 e13aa4c672a949ba870c8d8c86572679ede37e5b legacy-trunk
+25493 e81b3076a6c30d9ca427c65db921dc965a82aaf2 legacy-trunk
+25494 cca988f3f64f2047a3f4f3e142c6bad4327c18c7 legacy-trunk
+25495 99e60817ce6ece253196f194234ac3d18f7f655e release22-maint
+25496 54932054f6a941e5eba8c8b275bd8380296ebecf release22-maint
+25497 e599e7b8abf70253bde5bd4deb4e7efb6425fa15 release22-maint
+25498 9fdde8ccdca65e44b8673f0a23314ed21989f118 release22-maint
+25499 7e188140b6181c279309eae23985a6c9dd053de1 release22-maint
+25500 1a5110b4bd72a2e06b96236339f5be1070e62ee4 release22-maint
+25501 ed2a17a376d0c6bee6e34bc1bb0dbe2884cf62df release22-maint
+25502 3477030327a60e30faad28c8cb6d02237ad34f21 release22-maint
+25503 1e8be74a374bbadd6226564e1bd6f6be4b5c97a3 release22-maint
+25504 4ff9f8a74c827ef3ea2b3125de8e5c9b0df5b90c release22-maint
+25505 c25d6d780b1b472d8b5a635275b36e3ee9af092d release22-maint
+25506 fd0ee0a07047d17ec718f1424899eddb61447cc5 release22-maint
+25507 8eb591dd768268d0fab916bb9c34c0343ef80bcd release22-maint
+25508 bef44d108e5761380f20db3d73b09fda71074bb7 release22-maint
+25509 db040938dc663b3d6eedd6155e1ef72e50cbd923 release22-maint
+25510 1d1a01d956a2ef0e849f08d68e65c166096b0866 release22-maint
+25511 ea9be2e5d95445441bf73f022d1c51dfca3de3dd legacy-trunk
+25512 1e60b1e18145dde282ca94cb12b8919bd1f11bf9 release22-maint
+25513 e4d7e5129e4c167d0cbf9a26d9f4d812cf98fe15 legacy-trunk
+25514 4b345951a5c51cfdfd535a796d422c1c7b161fa1 legacy-trunk
+25515 a53730cd29c1474a5d7cc8be3c8929b7fa786d91 release22-maint
+25516 513103249462d7c5b3f7ba0b0b8fb428ddfd89e6 legacy-trunk
+25517 e81a4e99ecfa3c6b12135b39ac5dfbcd5005c867 legacy-trunk
+25518 345def37b0d7a587e750a46b6fe0382f9e663eb1 legacy-trunk
+25519 e30162b1b30468dbfc6194f6772f05fcb3e81154 release22-maint
+25520 2b3f4380673f8162ff128d2ccb892b1bfb00f398 release22-maint
+25521 b1d573a2a7745b3793fdade46843fca87347a4a1 release22-maint
+25522 71902e1cfbef30b176b8b6e89fd9cea48dcb45d1 legacy-trunk
+25523 d697d88d25b40caeacc50a41f798df10b38bddf3 legacy-trunk
+25524 af52bf8e2b89f4355a0aad261e41a96686bfee8d release22-maint
+25525 81dfa2db4c61b30ecb883ef5f84a875115a421cb release22-maint
+25526 42862169541fb9d5030a59a055f008071e6a2023 release22-maint
+25527 af6122df28e07e42ca5698085f22a554fa8b26c6 release22-maint
+25528 22c66587c452e24998cc239fc1d7eff9395a1d03 release22-maint
+25529 837951ecdce95754c999e855d1da9f6fd5ee4feb release22-maint
+25530 8579d3d301d48d4850aed6444d0632de1b4cea74 legacy-trunk
+25531 68831ac5495bb013fd03f890420f4e82d4d003f9 release22-maint
+25532 4d5becc6902bccf3f6cbf4c7836900040ba9a3ee legacy-trunk
+25533 32a1b484a2f3a52a8c4e8e09f3f77a3aca6ac5ea legacy-trunk
+25534 103c4c4cccfb7b794be3537f0e9cc5ae2d021732 release22-maint
+25535 ca8bd997e419d418969c86b911fbc632c3c084d5 release21-maint
+25536 c5c9e36c39099f939371e849d78d1d295e82a22e legacy-trunk
+25537 0e3e69e01ecd647d9bf357b05cb2b89f1665c74d legacy-trunk
+25538 cda306b2321f6d62b55b6434ae11bd9ce9226f65 legacy-trunk
+25539 e2196ba34330fcfd9a686527a28c72def1128db5 legacy-trunk
+25540 ee33bbaf3381934f6b7fab7812adc67a958d93db legacy-trunk
+25541 6fa56c43a1bae48c8a019c95a8f018fa780156c5 legacy-trunk
+25542 daf04db1a6998d792c045d6be9c0f9aa77ab266f release22-maint
+25543 266334a5c4ca26c65e6323f96dcda26e21433bae release22-maint
+25544 d2a76f7dd651066d677bd4e5003c522fd1e0837b release22-maint
+25545 f8a9db67fa5b45e9debbb153b702733613673e87 release22-maint
+25546 534e79059be10087684df906601ee8258b6469f2 legacy-trunk
+25547 81a8db15fb988bea40934ded4fae213f931794ed release22-maint
+25548 ac1131f73d1fd709db76883af93436ba8e15f4f9 legacy-trunk
+25549 c6289ec8da0a79cc18dedecd9d87eb6cde78f856 legacy-trunk
+25550 2c5f80371261edfa9dff3a24ebacdd9330120dfa legacy-trunk
+25551 c6a660f89ffe8568efd9d0b218df58004841f887 legacy-trunk
+25552 1ca2eb650e1377b55f7c9a740f420a9c5a5020d6 legacy-trunk
+25553 95e86430982be7d920067f239d0c21ce0f579871 legacy-trunk
+25554 cb4edd10877d917c8edf7af347dd54ec5f754e1c legacy-trunk
+25555 044f9e71320f62cec6022d35f9c3b90e6a03520a legacy-trunk
+25556 98a3fa5f687caaefc159fd1e56a61bd9d902e4d1 legacy-trunk
+25557 fc6dc2ea25cf77b8c0703f6621b886a60401b2de legacy-trunk
+25558 24ba693e9c739e676ef22450083a91db9601da8f legacy-trunk
+25559 01d4582697502d6501abbe7609458a1f19803827 legacy-trunk
+25560 d7f3f83b96588c2c0e50fd5b72a4a9d8c4849f23 legacy-trunk
+25561 26e3b563e26132dab8b14fe7491c186ece21c208 release22-maint
+25562 4ebacaee3009e267ddfdb59e70e0b2155bf67e99 release21-maint
+25563 dab05ab0347b93b717e0602b6a9291851aaa2ccb legacy-trunk
+25564 ad81f8fb4ee4751438a7512ed0cf8360ba358b02 legacy-trunk
+25565 5f2c0f6f0af7349c751d0d835210da63ed6f8627 legacy-trunk
+25566 409ac0f6898f41b2d7246a7048a1a66799bc7320 legacy-trunk
+25567 928c1282e5e2b5cfc8bf7a33d6ca48f712b42599 legacy-trunk
+25568 f4487350c53787a8f4bc49e292aada3c3d242310 legacy-trunk
+25569 b898c0feb754e489fc4353fd9fa29efc6e715ec5 legacy-trunk
+25570 f0ae376251895c80bb19cb09d633ae659f441dd2 legacy-trunk
+25571 7fef356dad75f91bb7c246b635ffeb63f8774987 legacy-trunk
+25572 0b08eefb6fc077edde6d7578e2edee4527f7509c legacy-trunk
+25573 0dc10d55706238d477f9ca1fea8c63e69fa9d99a legacy-trunk
+25574 239269c9651443dd2dabb258b068065934ab1d6c release22-maint
+25575 23606b49af74304643a907ae06d50e557e98329b release22-maint
+25576 26bebf20891e759bb20a041da3fc4c9cccdc71c5 legacy-trunk
+25577 e24ba04d01b08e71cfe66f3a2a9c83a65a34598f legacy-trunk
+25578 907832ee7173713943c032c8c8b20c8794962cd6 legacy-trunk
+25579 64c731d180e91e1dd26784199e26fd06b7d88c4c legacy-trunk
+25580 da518fc7806674326847c6f98858346cbb9793c5 legacy-trunk
+25581 5440e4b17affb2ee3a2a23784a28d04ff6e3656b release22-maint
+25582 78bdfbb6e59e135de9ba11b75aa2ac02b640287b release22-maint
+25583 81255b5be219fa361f397e55b0dce04c70af3959 release22-maint
+25584 d6d12e21d44f5270b6d5a299ad288f97ff9e027b release22-maint
+25585 e61d2982fc135d415c7e37d84eab14376dbb70fe release22-maint
+25586 01a55c3d505c0d7aad795b7885d8c1520e132706 release22-maint
+25587 a762edb0461a7bec470a0ccaaa67940867aa1555 release22-maint
+25588 67a5e25dc88bc74eb1c90f10fde01c8d8d02dc1a release22-maint
+25589 7f4d15d878ccd6052c12cf0811ee5a7286125a54 release22-maint
+25590 2f48ae5c8a9470d19d24bcbac01cb46f4a80515f release22-maint
+25591 4b6eda7d0c8f54cecd1a8d80da3960d3626f7428 release22-maint
+25592 9968d8dddd53dd6296ccc1e701c95d2634caea7a release22-maint
+25593 fc4056b9cf18c17168a76e095de36038aad12f88 release22-maint
+25594 452cc0f3ae3ca8f79f3a10571874f706dcb09d51 release22-maint
+25595 641f263f4f44bb8e494dedb040848d4a0228fee9 release22-maint
+25596 182f0173a8eef5bc1552a88660947e577d3fb444 legacy-trunk
+25597 22fc8b822d40d2b0611e1390e784822e0b90b098 legacy-trunk
+25598 298879a9f9f4bb45bf00fd5b87b53ade27accc83 legacy-trunk
+25599 50c6666fc4567039a6808f38004c6f3b7072a3e4 legacy-trunk
+25600 427e331b41a2e1ce4294c2dc7fec77388429321e release22-maint
+25601 ae578c8c6ced38078654ce1eb330e32ddfb77f1e legacy-trunk
+25602 e54f5c50ef09b9daeaf16efd3cfb0c0b8c96b6dc legacy-trunk
+25603 236ae53d646622463117be97504e7d7ac60431b1 legacy-trunk
+25604 7584b6f1afde424dd4052e7e6a165e0fa7fcf1ca legacy-trunk
+25605 163de71f1942938ac2a5cf91c900d16ebe9b441b legacy-trunk
+25606 6a279e172d223e6ff29de1b0324890e9ffc29a11 release22-maint
+25607 72fda64b2a2e8cdb4cc380c37acf24a8bac7c706 legacy-trunk
+25608 e8e465e6d45f9f0931a13367ba1adc8b46799be3 legacy-trunk
+25609 27a0fb019599124ba361954656374ec14918d4d0 legacy-trunk
+25610 abced5581c1850a4ac2311f998b7235b48c4c824 legacy-trunk
+25611 1e7cc8e4baab95a4ab676c2d090b4bce4e69088f release22-maint
+25612 272f965385c713c78c30fa8fd25df9ea15ccc1f3 release21-maint
+25613 edabad025ef1a5b5e5172a593051a700ffa99db5 legacy-trunk
+25614 9f119132ffbc463e9790da5f9b4fe445cf52bd35 release21-maint
+25614 70edd292c757af68ca22590cee8c7d1319c99ee4 release22-maint
+25615 37b69815af22fd56f63dff4f84b5823aecf89356 legacy-trunk
+25616 93db723d5e4789120a18322741b3fc191e6029bd legacy-trunk
+25617 093942bae1a639af03811a548b50a5a50c91b76b release22-maint
+25618 54b636160acdfe646d522acabf2a10c8fcb53f8b legacy-trunk
+25619 aa3bf525f482cb98d57727a40d52e04312a194cd legacy-trunk
+25620 216ccda284d8585e5bfdc26e5b46231738537b36 legacy-trunk
+25621 07505a4510176bf3804bd331e84ca87c969f19c0 legacy-trunk
+25622 d30797e5cc1ab8553593897142e120d377ddc03c release22-maint
+25623 6c34cd3a98a93e028fee7ed9d2cb25add63d9239 release21-maint
+25624 aff21453befff1a331a25f86058183cb8a01f771 legacy-trunk
+25625 17e8a3c9310cc3902f4c7a6e8ed50ba662a9eb8b legacy-trunk
+25626 8e99d56819846ef4085f53858cf24dd1f874d275 release22-maint
+25627 150a2a9c55b87caef24731668eadd5a7a96e27ab legacy-trunk
+25628 6485d1ba735cc5ec5a6830034f6e9e8f1848c63e release22-maint
+25629 f9a5a8fc317796e01c60c8d33f3fbb36af360355 release21-maint
+25630 2a8bf3d0bd865eb70c19e52c86a1294a6d36a717 release21-maint
+25631 10007aa78a5e954628d9572b3e00f9fbae2d35e9 legacy-trunk
+25632 69ad2a1ad689e1460f019e7e7403de4755807251 release22-maint
+25633 0bb17d3b5197d16b02d6c8c19c058596421e40be release22-maint
+25634 283816529e7250ffec5442789a2b64364470fe97 release22-maint
+25635 763d5ae89e9ed87c04d09afd183e2ffb60b52cec legacy-trunk
+25636 17ca2907d1359d1322e893e03725db6eaefe0291 legacy-trunk
+25637 3c685c037794fa82dd8184f30adccc877c8fd389 release22-maint
+25638 f2da258aac20968566be4a648b675654f7460faa release22-maint
+25639 9891958fc4b296b71142cfda321d86dafe0e0c17 release22-maint
+25640 aa44d3799b47bbb352ac6c12e8cc81939ce1c5a7 release22-maint
+25641 6d4e05d257596f4e6358e106b9e03abb52f144b1 legacy-trunk
+25642 22e0dada56d7b864bb3ed5248fa7c5f607ba6914 release22-maint
+25643 6a348a3900cdf8360500bf2554fe5328243c1c6b legacy-trunk
+25644 f0346d93077016e2c6a1317b022be8607eca8b38 legacy-trunk
+25645 5ade7e8204e5202f61151475eea1d934c47e3bfe legacy-trunk
+25646 160e335fbe6fdd2b41ded163629c5f3ae3606973 legacy-trunk
+25647 56f4dfcca9d81fc152b524df89a87685f9fe1463 legacy-trunk
+25648 cb6c85d8391f5ed5172527c4c8020c92b2085581 release22-maint
+25649 e4e54fc5fb3d395288aa1d04d666d0fd8fd2fb38 legacy-trunk
+25650 9078f2976bcca3c044e88dda5f663a14e2434e25 legacy-trunk
+25651 1873833c616df433b17dac1f976b3399b278eb3b legacy-trunk
+25652 a7958971de1c72dc3ceea8c494f618371647ee99 legacy-trunk
+25653 12577ae9595623266cc99fee88c2820d45001829 legacy-trunk
+25654 49edbee9dae22248c5d31c8647a3209e27467fe4 legacy-trunk
+25655 24af842030a0b4787863a499facb98fd5b4c06e6 release22-maint
+25656 c6c1a5fbb6c1f3edeef9f77cdf69aa530b42bd1a release22-maint
+25657 3c74a1b1287afacce2b87a7a8906831880df1a79 release22-maint
+25658 9a091d72136ac05f15e84762b68197777af7d719 release22-maint
+25659 543b2a48467b64cdbe3646692502188ac292e745 release22-maint
+25660 633a96a65009148ece93ec8af8433972cf5f06a7 release22-maint
+25661 41b5153d705e5f7c0a681bf551eb230c3618c1b1 release22-maint
+25662 54bcc5ec3a5125572d09015ba3905322de41ac37 release22-maint
+25663 a3460cb23f194515487ed289422c259bf0b5914c release22-maint
+25664 a0cc52735e6e468d94ff20ef6446194cc2793af5 legacy-trunk
+25665 c403633355855196668af573706db2cffd8ab7a8 legacy-trunk
+25666 9c435b1b59a56c044afc9f07c02469a7eb4367ad legacy-trunk
+25667 ea3b187746f7d539e7c2238313b861587e9fa4bb legacy-trunk
+25668 089ab5ba9466b46eda6032392e2661d9a4cfeedd legacy-trunk
+25669 99e1fec26b405abb44b6210da3dcb051c0aee492 legacy-trunk
+25670 b55d7bc05ec88676b2f108f48965e33604b27223 release22-maint
+25671 134cb41869466abcf42f808eb5ba1adc7dfe0f4c legacy-trunk
+25672 049739ca0c135d1a51c1e5129289ba995df4926b release22-maint
+25673 35c9be693888e00bdaf850aa0fd8b0d9856097af legacy-trunk
+25674 19d1d35020bd437d3bdb461240cef0d206a4d38a legacy-trunk
+25675 3f6ddeac4856b5288fe0703f2c54f1a097d7dbbb release22-maint
+25676 a415ca3e890386014b78012e5e2e84b86cf9e67e release22-maint
+25677 0408ecd84aa2a26049f2e91dd4f6be66fe5c3253 legacy-trunk
+25678 cc788b3b21b6224b36d76995b38eceddfdff7244 release22-maint
+25679 dc80ce11fae3909a314175580b4b324a0b4a31f8 legacy-trunk
+25680 5f4ffbfe6be681b5f960b6b19f4390ff03aba6b9 legacy-trunk
+25681 ab74ff80f9d0ac53b2322cf5fbe638969e540e6e legacy-trunk
+25682 dc6054e5b642cd3c3f1f617d7d43290e24c2d0f0 release22-maint
+25683 096b75120e72b44fe4a32de293cf8cb200ea6b21 release22-maint
+25684 5a778ae185123891ceeaa0d619ac4a2fa5f87cb3 legacy-trunk
+25685 ac976d36708d3d781c0f7a60668c714ef4806bbb release21-maint
+25686 31d9d11a294ca97d5bcfb91cff9ec60b243c1ddd release22-maint
+25687 dff0a44b2368e414a44568eaf72a135ff960b4b2 legacy-trunk
+25688 16f0defa45c20df2604160af3813cc291022aa69 release22-maint
+25689 3992544dc145fbebfb1373502866cc4948809c6b release21-maint
+25690 6d08a2955bb62518727921f1408812ee75d83070 legacy-trunk
+25691 a6193a87f500e2777b3f196838e602b6bf7fb854 release22-maint
+25692 1a750fb93b169361cbb0ef8d0461f5060f2e96fe release22-maint
+25693 f2eb95fb4529e276956f06adeaa7b322b154085f release22-maint
+25694 28e37905bee458293485973bb0c174cd2898e38d release22-maint
+25695 79856ad749ab7dc73986a93123206b51cc75d3f2 release22-maint
+25696 debb005f1673a0392f73d078990eb801a1d21360 release22-maint
+25697 0fd3831cf2a0757a3f637075da624f8c29ff02de release22-maint
+25698 029e4cbd231299b1bd1cca2aaf6fdd44ee134ce2 release22-maint
+25699 c901d158ad68936e9c11516f23ad288a13b06bd9 release22-maint
+25700 a34f9195f611e73f6325fef4da3b011807208095 release22-maint
+25701 6c3e32357d9108c327616abaa2e1bbdaf36abc9a legacy-trunk
+25702 7ecc49117d7e88b67250f4c3437f263b7f7d99b1 release22-maint
+25703 2548e2f323fa7e9ce3f0864b3724ce0490d73cbf legacy-trunk
+25704 12d204d93af3653452fcf1c1682cc6a45297465f release22-maint
+25705 641fb4b4720e769ceb81fcd4621a575b83012c78 release22-maint
+25706 f976faa330ea167d82ad5efbadd84548fa2e1982 release22-maint
+25707 1f73251c625ac62209df66c6298af1868bb34cac legacy-trunk
+25708 27f36f4bf5258bec45033314fbfd50828234e0e4 legacy-trunk
+25709 b879e6851be3b98f1b1c0a510c92a25cb276eb48 legacy-trunk
+25710 51aa9eb24d81f627b0d9cf27b7f53c3beec62f75 release22-maint
+25711 fb9a00821c0d50d33f80dc6dc12bcf4b7438d46a release22-maint
+25712 4ce517b3e301f6cc52d64da88d11ca1c9bc18e96 release22-maint
+25713 a2733feffb36697a1c14dbb5af8649c907295b78 release22-maint
+25714 1bb4d2babc145c6f2b5e7ac30c0f28bc23715928 release22-maint
+25715 5a9dada7cbac37d55d72426890a55b0c03ab431a release22-maint
+25716 dca4a7c36eb99cc9a5b43e8ba639c038ba107dee release22-maint
+25717 3513a9d090a9a95e3fe4cd215ce362860f7baa03 release22-maint
+25718 92ebe49d22c53bd158a9cf614888e0e9acc33b5b release22-maint
+25719 84f2c7783d310165b7bfd84f808615db57628d2a release22-maint
+25720 dd17aade3beb8a55245efba67e8bbb37f410157f legacy-trunk
+25721 df979bdd6aefd2bedb24537008804222efc854fc legacy-trunk
+25722 c8a6ea00a9e1adcbb19a62c01eced04251bf0b27 legacy-trunk
+25723 17d561243ff812dd12af6ed80575baacdd562ef7 legacy-trunk
+25724 8ed647d31f44ef4fa95b15c6fe1235842be00c14 legacy-trunk
+25725 6ac4150c4e8841a29b21b6ca266f3bef8919a297 legacy-trunk
+25726 34cbefd2c3fe966765585700517e418f7c8c5943 legacy-trunk
+25727 c854b6d0b2c04bb71977fc1c4f248973d448abe6 release22-maint
+25728 121e198f6dda9e8b953d746f0142e824412a04d3 legacy-trunk
+25729 f2b6ccc00808514ca34c1bbed35389420b757f28 legacy-trunk
+25730 715d631eea2f42623acfcc8affb51412d3a06854 legacy-trunk
+25731 7f0d39014e2e15ea9fb3daa100a926c9242d8271 legacy-trunk
+25732 c210562e15580c626517cf2b92fc6575c6a334bf legacy-trunk
+25733 b357df301f5f256f2f34ad29f3387ab5304b753c legacy-trunk
+25734 071f503e5f4f4aec353b4f9d2992aca3a06bb4a4 release22-maint
+25735 0a96dab70a1574eb8a0bd5c41fb7d087e577fd45 release22-maint
+25736 2417694324ef08d130ff3ffbee9bec8f1b9c8425 legacy-trunk
+25737 8600dba4f59d3d2521722cd7daa12377389e5b09 release22-maint
+25738 cf9f1b6dba3b4787deb9fb5e9c19d9bcebbceba3 release22-maint
+25739 775da6178e86557f01c27adb6162c18e69ed7d99 release22-maint
+25740 4668d1c926cdf049cf58cf9a7aa93a2da083707c release22-maint
+25741 55512fe1d6f14a4172e54e7519378ed94f3aac7f legacy-trunk
+25742 b9004b836994d943c94ca0d4fc3638cba3442380 release22-maint
+25743 68e7e8dfc5f502bd63e472f0d4a8649c6b9e1a81 release22-maint
+25744 165e20ac0ab12a7c29439359445d9fea070627b1 release22-maint
+25745 d5f63e7cab31bd4b653ed61bff2c10fc7831bc62 legacy-trunk
+25746 42e6c3cdc0958276c62260198805b5170a5ee31d legacy-trunk
+25747 8fc9a576fbffc41da510c0fcf2117c3cd57d4123 release22-maint
+25748 0929894cdf95fc0561af20b19387d0569b8caea4 legacy-trunk
+25749 b59e8a8df57e867b2b558d9bc132e176410984e2 release22-maint
+25750 c73c6a5b6a8044be3795fe00504cc56bace9769a release22-maint
+25751 fd050ac1e0ce5b28df7eaedba09dbe39c07a2e50 legacy-trunk
+25752 af8841ac2989dbabe2fdcc4664486ee05526e860 legacy-trunk
+25753 11f6f8c1ce734f98577aaea98a5ee591d6ca8563 release22-maint
+25753 765434e7aa019c1bb82f9813b8025830867cbdc0 release22-maint
+25755 e88d5e2687ee473066efb8036cd7938b94d90ed0 legacy-trunk
+25756 ab6616e6cebfd1fb9c78e2c49af08a60894fccbf legacy-trunk
+25757 0c8a385fc8a0130a10c3c80fc87c59c684fc2378 legacy-trunk
+25758 6706b83d1bd15c39ab95df4379f4c379dfc85bba legacy-trunk
+25759 132a064da656e523e6f05ce85f1327c24db8000f legacy-trunk
+25760 963e814e69ccf5fe602c4bc0c264a059f31748c9 legacy-trunk
+25761 984eb995fb9edc3c5cc1e88230db26721cc8de6d legacy-trunk
+25762 71857f162231155631bf16b215495b553a80b163 legacy-trunk
+25763 8bfcf68272482bab7310474b213279f5199fa801 legacy-trunk
+25764 a6bb80028acf2dcbb642ced78bb6341cbff8784d release22-maint
+25765 351f9b4d80c5d270c5bd3ef4c5af9311e50a74d0 legacy-trunk
+25766 cecda4ecc090ca6988db8dd62772be91817b2f6d legacy-trunk
+25767 e150109d2b9c60c9ad838e274b00548c905c08be release22-maint
+25768 073db68a2c2bbeffa1b7c1467fe9f8e3b109aaa0 release22-maint
+25769 0c8ed3841a64f8f826bfd5788bb79030174a0cbb legacy-trunk
+25770 a3ee7132036af05d11ec622ab1e688c6d63178ee release22-maint
+25771 4e823bf2512cee87f96917634c09e2e6b0b1e4da release22-maint
+25772 457bf184e7ba8b578e2ae4a0aa77f6ece70ef9e3 release22-maint
+25773 4a4597bc4ea222784014e0cc4a38af6edd2d53ae release22-maint
+25774 36c52cfbd0b75e6054d2e0fee8868526943b7f21 legacy-trunk
+25775 927bd4f6e35b2ee8e6252a7044cba6db453d3049 legacy-trunk
+25776 53a1f21b04514893c5d7dec5518a9a12eaebd339 legacy-trunk
+25777 701340c8772319bc6e4e409b488a7fafc87ebf10 legacy-trunk
+25778 c78ffbfc36d93660ddfa8c7d0113f03eb3bd4c15 legacy-trunk
+25779 df35656e7d99718ff7a7ddecfadd582da48ca63a legacy-trunk
+25780 e62174c7d8e517686f884efd00b7c9acc92003d5 release22-maint
+25781 b148e18ae77ab0391b2729b3a85ca4dc838057b1 legacy-trunk
+25782 7afbbe288af3da6cd9c8b9dfa9ce1a6fbb55caab legacy-trunk
+25783 f64a1197a52a478165baa398564d7448bcc779e1 legacy-trunk
+25784 9895e2e336c3a10f6bdc1c75b83c0aec5fef0d72 legacy-trunk
+25785 b523a470a0ce98be94ca0aa644d4f7b4b30a8a20 legacy-trunk
+25786 5c3a259238cff53c4677b0cba557b183b7b60849 legacy-trunk
+25787 be492df83d03008ba57cae126db91544295f925c legacy-trunk
+25788 f52d6a675f5f78763146c8ca1bc98084cabec5a7 release22-maint
+25789 eac560cc0399d7f338b037adfeaa8ab6068d8cdd legacy-trunk
+25790 c1068b092879fce61b969baa71259c9861f04c4d legacy-trunk
+25791 f4e24ab0d124aedb58949949503c12b565ee10df release22-maint
+25792 7002f24f818fb2c7e09a7c8fdbc085e1d6fc8b00 legacy-trunk
+25793 503b92e66a8c765eecf59c0f0cabeb33aa336b35 legacy-trunk
+25794 832058f21aa274455e23f5a88e3cccd8318ef9cb legacy-trunk
+25795 237ad43f89a8f94502fdd0403f64643c05f02403 legacy-trunk
+25796 c0ae6f46f231574322ecab06ef2a0005ae4c9883 legacy-trunk
+25797 d8d981d0a47e5f2a9edf5920996e0ded8230c19c legacy-trunk
+25798 888fcd9b858dce3317380c98bf7b35214ac57d1b legacy-trunk
+25799 d2e457c44bf2757529fb5ac1ef1e71667db26289 legacy-trunk
+25800 08f742df9937a2ccb3c9dc572c318393328c4c16 legacy-trunk
+25801 273eee38712cffea1b3a7f5b184d3d69695c1f73 legacy-trunk
+25802 10846f1e1592f99abbd0b70f1ae3d49529956444 legacy-trunk
+25803 b1836ccc951c97f5015c6fc5240e6b9eba9b36fd release22-maint
+25804 9afeaf9979a0a2ba1f8577beb5347ad9f1548857 legacy-trunk
+25805 d1aecf66316790e5e81f867be560ac5a9d09838d legacy-trunk
+25806 72fd8416984b808508d46aba6e22ba1ae186dc26 legacy-trunk
+25807 ec1a5a029f74c57fe282936c507f7eb7112eb894 legacy-trunk
+25808 d5aad6c581c9ae473e92c5d2c74961090c2d6d3d legacy-trunk
+25809 ef6e2fef81d2a8b8ba8e1205bb09c3597e7e9771 legacy-trunk
+25810 9e8aa29523f0979762bfde0eb5a5133fd9866c54 legacy-trunk
+25811 881b6484f0dfaa61b27e3827f0ef0f6be51183f1 legacy-trunk
+25812 52208fe4ac471148cc71f748b4c5d09ac31b38b1 release22-maint
+25813 d864e2bd91a6e1143fe9dfb81cfd623a1ef4ce02 release22-maint
+25814 23925df4e3713068fed89e50b88bf42213bf61c8 release22-maint
+25815 7b5d6f1f1c6ec7653b3982221eeff6b94da032df release22-maint
+25816 2a7f71a9bd2e30ceafcaddb5e3e5d78b95c867d8 release22-maint
+25817 1fe3802336a356cade87ef60c6f3ac49fbd8ce79 legacy-trunk
+25818 a367bc61d5b607e9f1ed9b2807131204c60772dc legacy-trunk
+25819 f6e6fdb935d21421934a534f05e9a743b6341f4d release22-maint
+25820 68fe2b391159472ea0f46003550597a61062bbd1 legacy-trunk
+25821 bea01dc2f00e2bf3e2e7b84e5898118c75a9e4f7 legacy-trunk
+25822 c3e0ea09737366db994c2c9c60b4681e72e45bdc legacy-trunk
+25823 9ba9d1238804f458708ef4de9513404d63d4048e legacy-trunk
+25824 85bd534cbd19f693315884580204d3d31eea6884 legacy-trunk
+25825 f551af92660eb22f06b541e9501c77f28a40c868 legacy-trunk
+25826 ab98a0def9d763337f01b665572b1bef2fe0b6bb legacy-trunk
+25827 ab24ef2c932389afd755739e4c8766065841473c legacy-trunk
+25828 1db1510abe2187b656eb247d9d96c5462c4db4c8 legacy-trunk
+25829 aaf5ee3b8f9355648e5fe651473717f4f64dc520 legacy-trunk
+25830 eebae4f60d05ca3442773d784d59c636a0da05c4 legacy-trunk
+25831 8d0061493c57d227bec9c9b9be55d75119b1b1c5 legacy-trunk
+25832 0e4758ccfe2be690ec3ffc8f5c2cb15c134e13ac legacy-trunk
+25833 acf5ecd806afc79fa5187f4e75c896ba467bf622 legacy-trunk
+25834 ad3825d04decd62264891d1b03b2fd578753ffda legacy-trunk
+25835 bc88f1b47648de6e6e57b1faae31cc05fdfb63fc legacy-trunk
+25836 7aded6d0696e34584cb99e28adab1ada3b7bdcda legacy-trunk
+25837 e4d10bd3973f16483e3668c9ccb2d842a5ae0e30 legacy-trunk
+25838 d77e748865ff9b89ba93c8c39e2cc899dbdf2145 legacy-trunk
+25839 805be7c0e26c5309f35ec968eff7ed91a1e520bc legacy-trunk
+25840 6408384c8137b248b571584c1c43e59ba8107cd9 legacy-trunk
+25841 fb45791150d197777396b99358ae218a3a2ccc85 legacy-trunk
+25842 15702e1b961ebb6cfeaa4aa6603382ef07a7f646 legacy-trunk
+25843 7de3c9b58db8fefef4874753484a8c7fa6ab06c7 legacy-trunk
+25844 23b9ae6b3f7afeb5a04b3461151675ee5f9d9186 legacy-trunk
+25845 0f1ae37cd8eb027e93757a8200db64b8eb4fe839 legacy-trunk
+25846 ffcb2fd2947e128a7812ae6965734f7610157a89 legacy-trunk
+25847 b360a650a0dbe49ed319b5b342fc3f79920d1885 legacy-trunk
+25848 8ecd1bad24081b5c95218405a1ee77acbefd799c legacy-trunk
+25849 f02cdb2bc17a73fb9d41296f8fc2e0c046d073d7 legacy-trunk
+25850 1361f7bb3f1993716bd4902a160fa5a6d2bdf7dc legacy-trunk
+25851 6039254aaadc48727978be9477daa490c6f4194d legacy-trunk
+25852 d4f541467b6d52e588ff0c423264599e1a616818 legacy-trunk
+25853 ff9ab7d30bbfbd21b6b7161d4dbc3552d37a570f legacy-trunk
+25854 422513f420cf39fc271b456ab14cb5736002d114 legacy-trunk
+25855 66adb551cd38f3d2b0fa58c6071279f817af24f3 legacy-trunk
+25856 7224a1df4809fb471af34b2dd0f32a937c92eb5e legacy-trunk
+25857 91f9a24887cb5e5808ee053a7af0cbe332169c7b legacy-trunk
+25858 ecd181b02a8a966ae1d7ab91f10fd21e1dbb78c7 legacy-trunk
+25859 393b0c3d9773247a6ff313ed0f93cf8cc2c7c3f5 legacy-trunk
+25860 54bce3cabccd57c7c38f6e430a6ca6988583ff39 legacy-trunk
+25861 3a3de6567f1a5d215972e656afb6995513772495 legacy-trunk
+25862 82bdbca02c0751aca3937a3e9ec35eaee54f757c legacy-trunk
+25863 9e3d6b5cee0762d66053962a0beac8b907c801cd legacy-trunk
+25864 5b8be8611d8cd891d122c898d3ae5f5dd3708540 legacy-trunk
+25865 c8165758a6de7c2a05acc95795a6ded57e275d3b legacy-trunk
+25866 25e2b580b2cfbbcb1ba154822d0e76671192435d legacy-trunk
+25867 a32c7b3f1f1106c9c88d802ec41ad1d0e9d56156 legacy-trunk
+25868 e94eddecf330a040429498fa7fd92a8ed25710df legacy-trunk
+25869 e777452648306ee6214a5ce8aa370090649d0d36 legacy-trunk
+25870 3bd22bd187c32b53c2fd6b89b163b68b26d517d4 legacy-trunk
+25871 54c05a947bcbc58d8950171457c33924e63a89aa legacy-trunk
+25872 0eda3f82b6f3f42814f798f1a48ef38bfe432abc legacy-trunk
+25873 205c10632f087f39e18b41e520dc3e727bcf521a release22-maint
+25874 658ea026634c4c22013dc81da9538d9e9560981d release22-maint
+25875 0dd2f9b57cff5ac918e875b27f64652afad192cc release22-maint
+25876 a40543b3e3bf32643bb35d9cdd52d80a1bcdf18a release22-maint
+25877 814329a6426cd77d9606f13c8b035e2e1ca30c06 release22-maint
+25878 4ef3693f1a26aad9037dee9513d2ef19823b9cc0 release22-maint
+25879 665791d53c4356a226657b98c156af52b59c1824 release22-maint
+25880 16245a9cbfa1df370da7f142fbcfd9f281ef07a2 release22-maint
+25881 7c7c90fc7005a7efc79f7084af30ea07b39334c9 release22-maint
+25882 c3df9b7a6acab189c4caf45df332931d773bf424 release22-maint
+25883 795bdd692176025a4a91ac6cef85281202f0c4dc legacy-trunk
+25884 8bfc91849242c30898dcadd998947445f2e8c2af release22-maint
+25885 64a68361848cd4026fdfda1b7145ea693b0dec36 release22-maint
+25886 0aae09986fc98f56d79c32be041cad1dab43235e release22-maint
+25887 4ff37c58ab89393ad927a2160328892561dcead3 release22-maint
+25888 0c1912f9d1ce83defe471f7d0f9f6b0e57aefa54 release22-maint
+25889 a2fe0ecd0ce2abd0cda6699f5f8cd25ff2f67260 release22-maint
+25890 2f9c6cbeaa628d5e3ddbd5c655e045b023fc81ad release22-maint
+25891 d66e4e7c9e9a70c5603e4598fd9213e700627912 release22-maint
+25892 45721c02160664fcb5dc57f622a0f06c2ad8ee3a release22-maint
+25893 ef314b37e260cedbbc571b6fc5203718015e9bb9 release22-maint
+25894 9198fb0435fbaacea9071885cc1cdc855cdd403d release22-maint
+25895 2912015a1e7b76b85e5e3c2a746aa4baa906c5a3 release22-maint
+25896 8090d0d63ee1a5917e0dcb95e8828948f8f62f9a release22-maint
+25897 f6a7fdbd30d4f216f61da606e9889ced51e3d3dd release22-maint
+25898 21e8972d37e4681ecb4e99a43d8870f140e7af63 release22-maint
+25899 1afbc56188b00748cb9a10778f149b0a1e08c48a release22-maint
+25900 da9adec66e2b219a147158b89d49566238ae65c0 release22-maint
+25901 e2cbe9c33411a0b0b5784ea558f340f08d21bfe5 release22-maint
+25902 75ef1f16725ef4ecabdced9602b3145448cb6eff release22-maint
+25903 b726e6b3a8523ca4522429775a33570354690648 release22-maint
+25904 16e542af2c45bc07903aa30cbed1ba6ca5688878 release22-maint
+25905 c5c1326166b921a47964c0d95989d816668667e8 release22-maint
+25906 7566187a201cf2145986f7389b25ab59f59a5dd0 release22-maint
+25907 142fd3e1073d1e07584202df38b6167cd25caa87 legacy-trunk
+25908 6b3e99b2ff91c4571a0d6b269b2cbd539e2a1fd4 release22-maint
+25909 0922c919cedbe37c0d5970f2390084a5691b8feb legacy-trunk
+25910 63fbca898eac26ac448485d380cf77df5dfc471d legacy-trunk
+25911 fad071fb4141fe609ba676ff7585a45a9f4e7ff3 release22-maint
+25912 ad15b39ad8f712404011a2935333440ef9a98ba2 legacy-trunk
+25913 8b636fcb8615ea2920ecdb977f5d261a42a48378 release22-maint
+25914 9eb4e62309b0e232e07cefd407cfe731ab6b1a18 legacy-trunk
+25915 25b599f360bc21d183574fbb99c3da44fefad60c legacy-trunk
+25916 6de1a19f47a425fe11f291bac6ba420a2b2b4b0f release22-maint
+25917 f9d96dedd1f466b47d1047a633ae902322f25cc1 release22-maint
+25918 f2a3af4fa4ffeef34b7ec70e8a1465b95bed5301 legacy-trunk
+25919 b68af4a8000ba12a61adff8cd5629a2444defd25 release22-maint
+25920 3f421634c37cc6c5e2f5502857b57bb864af70f3 release22-maint
+25921 b59ad4b97a426e14fb5f03429c8f8f5ae8b9a0b5 release22-maint
+25922 7a4cb4e979766aa60ed57435569e772687abcf9d legacy-trunk
+25923 043ad7adc896f4a48fe33452c5ef02f9ec92fed2 legacy-trunk
+25924 303b6ad13a32d995112c9a313f07dbc567c7d8ec legacy-trunk
+25925 3bf2b5aca61ec1850d50269822426d18e6bbcf08 legacy-trunk
+25926 9bb450365df7871c0e49c3e24828385739736f93 legacy-trunk
+25927 906ad36cb7bcce75d5c885108cdfaace0075f3f3 legacy-trunk
+25928 39e42d6f5da2d0704a5262bb3b9dfb0bfa3bced4 legacy-trunk
+25929 aedda0abd313e00eaa47cd2587d8fead5a39330e legacy-trunk
+25930 6a1c8752a65fb071fdd4512a953dae160fe3c206 legacy-trunk
+25931 ee4b59b5feb72f7beb02d2709a40b1d99853a8a4 legacy-trunk
+25932 470e9da21c4ae4ff51f3627825073adf7314ef0a release22-maint
+25933 d190b2d303c281d7bd2c196d481420abbe04beb6 release22-maint
+25934 5a30d4b3da37a10c6014a7814602e961e240d1c9 release22-maint
+25935 298802abd38dfffa79b472c2f5ddc3370eb24ffc legacy-trunk
+25936 06a8156e3bcf73bfcb6457d086bb25ccd6224f6b release22-maint
+25937 bc20baaae3ee119e39a9f2e2a2f6a243d19db048 legacy-trunk
+25938 d71d3b715b13ea294ad83f52fdfbf1dbbb031a14 release22-maint
+25939 e6c6babceee5360f3db7384d7a48cac1a959e278 release22-maint
+25940 3a21dbe1b6fe4689a8e85d60dc51bc17734daf19 release22-maint
+25941 64a1049fe53b961a51b8990d5490a9bd1402b7dc release22-maint
+25942 f0ef8b426d8d9b07cab3fac7bba34c9bf2884d87 release22-maint
+25943 2d33cfd6c17f0779bf7cd3d40241b00b88a69570 release22-maint
+25944 9a17b3a3af0989c0d41f4ad314ae3da1ff413e18 release22-maint
+25944 11c952c7d4be6638040764910be80bd9c3c17de6 release22-maint
+25946 bcd1fdf13acfe3671af68664120a4fe88cfd4bc5 legacy-trunk
+25947 93daa4fde087eddac83d5125a199b4a1789b66ad legacy-trunk
+25948 3d68085f495f9e58e365247de32149686bb0e195 legacy-trunk
+25949 91eab745810f113c405fe6f2476a526ae4d619c0 legacy-trunk
+25950 f1dbecb7e4160d274e2fad42b44d80d93e36793f legacy-trunk
+25951 66e85a732ddde192586ca4a02b40295f41b4a8da legacy-trunk
+25952 c18fe487257160fd68373b0402b27595f9a21bc6 legacy-trunk
+25953 7bce4751bfb340f2f1828ed1f377f6cf22e07f57 legacy-trunk
+25954 7d0f0bb9448b0100626d838aa7276f17c17fd9a4 legacy-trunk
+25955 a758d4c401e08eaadc8205acf36c77080366c581 legacy-trunk
+25956 9b5310cfa2e0ddb160c73f7b7db5bba765ac7cfb legacy-trunk
+25957 204d46fc54f68e0334fd7169360dd809a290c1a5 legacy-trunk
+25958 0a3bf22aeca4a2e4b85f4ee721a17bd5541e34c2 legacy-trunk
+25959 1c7207ad5db815782338edce57f5ca14f9b268f5 release22-maint
+25960 80821a65fd4981818d4e728b9c8e7437a5fdfd00 release22-maint
+25961 194ed5e0dc8ff0de130e9b25e689320416b36f8b legacy-trunk
+25962 0c5c64b75d5d0a1812de9eb3a075551b6c497404 legacy-trunk
+25963 a331c616bb0ad5cc54ea9f793edffd668ccc34f6 legacy-trunk
+25964 f3a913e64eb8ed4db926b10090a9dd1ae802acfe legacy-trunk
+25965 2868e9a9e280b68a39652e2697e52b7a5442a684 legacy-trunk
+25966 3f4b2f93e8b5b5426e888c49b449b7c5f83dda99 legacy-trunk
+25967 da1645fd9c2438afebe74c093207db8bf65a99c4 legacy-trunk
+25968 1c838be6d004bb886062f3edc98a6048f093e602 release22-maint
+25969 ac24c2c9bcaf83d8cdf5ecdfdab80166e6bffa53 legacy-trunk
+25970 83776ba580ef20a5c435de42b7d6c8752cb88401 legacy-trunk
+25971 4c7bb0b4d354bd247613bffba13b96e466c0d317 legacy-trunk
+25972 c9b732628e6c6063f18f0b2d05fc695e45def737 legacy-trunk
+25973 26785fe63cbbe2d4c6591adb8698d6326b34796c legacy-trunk
+25974 f62bfb0b0946cd6c1372759371ca0fa515787ede legacy-trunk
+25975 ddc9543c76a031c9cb2d2378d3b12532920215b9 legacy-trunk
+25976 f294fdd18b5b08a4c0731fa905a4ecb07672761a legacy-trunk
+25977 d6f5064f2673713fa65e93fe14872c0ef4cf906b legacy-trunk
+25978 3299b7aba8ebe70329c1ec1c04fecea945914f0e legacy-trunk
+25979 6796dd30a6024794bd0a10b7d4a696e60ba29bd6 legacy-trunk
+25980 19d4e836bd075eedea211520c26adb100bd6953f legacy-trunk
+25981 ec6ecbb34b06b9e045b88e662d5dd8701be231d3 legacy-trunk
+25982 6a850448fc8e8e3ac9b36ea970754943ff118277 release22-maint
+25983 830c829a7eb2aed5522a7a47978969da86f4ecff legacy-trunk
+25984 a6bb3cc919b9656d67e77d8859cc40b22bc64a1c release22-maint
+25985 d9f30303c860d0218c1d5804263f142e178d0b47 legacy-trunk
+25986 880d3106499bab5bef4b976a37dd2beaca125e7d release21-maint
+25987 898c392477d91d128652c574185184e72652b990 legacy-trunk
+25988 0446eeb787b7f92dad21a56dabd2ac7314ebdc54 release22-maint
+25989 51b1c5ea0fbb456174e540b88f73a45a37ae0013 release21-maint
+25990 84684fc02da004f48c3ec95f0a5c57866e16e97a legacy-trunk
+25991 7230e01c3c494ed4c332058a924f8c042938680e legacy-trunk
+25992 e6fccde610866d1b2fa267b4d71157f185253d98 legacy-trunk
+25993 7870fac049f7213a77861e509744132b11e47373 legacy-trunk
+25994 349404426faac37e245c5d72d58912c582451b9b legacy-trunk
+25995 f8c659848ad6f782b78b0ad3a0baa728c6cf40f5 legacy-trunk
+25996 b9ce969281cb73821351f69e98c564d0dfc00d54 legacy-trunk
+25997 726c961f3db51a750feeec15f99d9d66c6de6fb5 legacy-trunk
+25998 0f801626c2d379c8c8b4a492307048850a1e6f72 legacy-trunk
+25999 d778ea9de780fac0f878633154621946c745f8b8 legacy-trunk
+26000 c1666104b554f9a6cece3b4a1f3461d015833b97 legacy-trunk
+26001 9c2ca37bdeec58156e4aa28defa5f44b201b7a13 legacy-trunk
+26002 ec1043f6d05efce7778a6cfb86e4b3272856c8e7 legacy-trunk
+26003 cecf31db8b0db5734380c28ac35c646ecb83402a release22-maint
+26004 96b136b611784548eba0732319de61e55821df59 legacy-trunk
+26005 d29119d243e9e37a4a405dee17fd515e7c0ea2dc legacy-trunk
+26006 b172ee93c13c6c932ddb0fe6fb69a00a965b8469 legacy-trunk
+26007 150f03407d0d2697243d16aa3bfbff25de84bc70 release22-maint
+26008 86a27ba1bee75f022bde22de12a096d8d9f6ed5c release21-maint
+26009 5655bfb607ca7224ad97cc95bbc371f39fb1dd18 legacy-trunk
+26010 8a836d0b5974165ff0b847fc31b4b21cb051e442 legacy-trunk
+26011 1616bd8b31bc04808735409798674a5b418d1dd9 legacy-trunk
+26012 2288c724fe2bad0140fa699c64c200d04cffda95 legacy-trunk
+26013 f3a416b178c423cf09c40f41ded96f0110cd5feb legacy-trunk
+26014 e971475c0471931ceeb63e7bea6cd1bfbdff8f3e legacy-trunk
+26015 2da1137600ae7e9eaa1d53899dae2d0b05399921 legacy-trunk
+26016 a82ce198fe698c2e576d42e2f95f9b7a1dbba1b2 legacy-trunk
+26017 107023c0c456df3c2c8324945598fa07eff6de26 legacy-trunk
+26018 3aade150e717247b39aee04687d6d89f1310faa9 legacy-trunk
+26019 af71914d8bdf0dfe5db47d995fd0a00abb837dbc legacy-trunk
+26020 409311c78383653d681099314c04d99e1b77aecc release22-maint
+26021 bccd4613c496a30bb1bad6419ca7849bf59ef6d9 legacy-trunk
+26022 46407d0a6000f5ee288b5ad948e4320cca6ae731 legacy-trunk
+26023 c16bea79f4db3b4e7c51a5133e733975ae243cc8 legacy-trunk
+26024 1aea7af09260e7f214f3fce54d22f201c2f1f911 legacy-trunk
+26025 9d2a8f6b06b6fb9c45d776dddf418b777de525d2 legacy-trunk
+26026 f63f2bc8bdba6f0d5d8e42a3ede7b5034b357287 legacy-trunk
+26027 45dbfcf0fa19fbcb807a56b19ee7155cc1ce055d legacy-trunk
+26028 532c27a735b7b925b668dd9813aa9cc94e9f3494 legacy-trunk
+26029 d971d1eb72f6e24ffad9b9a9f6a9024dbfa7be29 legacy-trunk
+26030 3e0da84939d0b33406bcea08362c60dda7a2e4f9 legacy-trunk
+26031 bf3b07c62cf7be24e469e3c418ba65474f68ba60 legacy-trunk
+26032 fc2e7e397bc66bf97a8609017deb43d3b92205c0 release22-maint
+26032 4045e6e92fafabad42f6c9989b67076fbad452ca release22-maint
+26034 86ce9ee140450e16a5babfe14d03a57b56c400b6 legacy-trunk
+26035 b96740c42e8070b72d431564560894591283655f legacy-trunk
+26036 911fe0793050468131aa7d92c7d866acd779f74d release22-maint
+26037 57811c355f3abcee57b3330718e642c9e11bf521 legacy-trunk
+26038 0b58ea07495cb07eb8ffcd8fae4e8782ee3c6b8f legacy-trunk
+26039 881a6c2d5db2b8cd6fabe8fcbbb19356b97c9a0f legacy-trunk
+26040 18cfef011abe7e68af5e0fbdfcccd8f81cc934cc legacy-trunk
+26041 488b9b3f599ad410db1c1267597c85fa9be40c90 legacy-trunk
+26042 7c0ccac97f8efd7d856813ce4c854d3ef33f1861 legacy-trunk
+26043 120e4ba0550bd7097979291b897195dd9de2f8d7 legacy-trunk
+26044 44be5e74f1727be45590cf221dbeb88bf94cdb28 legacy-trunk
+26045 6f2f1b04e82e0dc96d705189773c488bcc3d488f legacy-trunk
+26046 fd1b8ebe4eae48b6d47a188032539c20f620beba legacy-trunk
+26047 b457636539e80d51111b0d8f556602c95b05e7c2 legacy-trunk
+26048 f8bd930644aa344e5969efeb94cc636c731460f6 legacy-trunk
+26049 eee3372c2f962d4855292aa54d47158fe8005a8d legacy-trunk
+26050 c0596f84a8fb149b3783709d951628cd6eb150b6 legacy-trunk
+26051 614167df20960a62bcdcfcf60fad9de96f341e5d legacy-trunk
+26052 00b2972ab4a4b1a1b3e98a695f2f09555bebbd9c legacy-trunk
+26053 5ae3c31673e4dd6621a7ff7038bdf6eab1c291c2 legacy-trunk
+26054 2c02cf278f0282f17ec959ad6d9fc130654dd71f legacy-trunk
+26055 596167647bcf57da46259af63cb35054390590dc legacy-trunk
+26056 1738712930344aa24c43139cd29533be5f3e051b legacy-trunk
+26057 f0583b1e93ab0f8a5263f4d639ac2c42867ab37c legacy-trunk
+26058 fa0f35f944b56300d4afa9830f3b3abd5f067a02 legacy-trunk
+26059 6bb4386b111103344ce8833b3721cf273bbedac1 legacy-trunk
+26060 a4a1e6f555318ae02363335789220731d0d85fbf legacy-trunk
+26061 35f58c297899644cc37916b61e6937e4a91365f4 legacy-trunk
+26062 0eece73c13c08dead74a095e4f82d1be1fe0cb28 legacy-trunk
+26063 cf1a05c86595c10cb20a4fb15306cea9ada6754f legacy-trunk
+26064 f07ca997230408929d2431d54c9c68ac62338ade legacy-trunk
+26065 e0ee009417df073ed1e40c79ec0eb9cd03ccec35 legacy-trunk
+26066 18dccdf2c46d80274ebbdd9c3b9e3565e4571f63 legacy-trunk
+26067 8703d20523399866f2917c57ec250f21dc7ccca6 legacy-trunk
+26068 14ebd76109026cacc7f3d34772a52a9604d378e0 legacy-trunk
+26069 dc2f745fcc67e82c7de44cedfd42fcf5cab9285e legacy-trunk
+26070 aea6dfeaaab841692c0288d00f5cb313d732e710 legacy-trunk
+26071 3aa4bf7ac31e985f3513a867a471715059c57a1f legacy-trunk
+26072 8a225bd8763ad0fd60bdd3789aef9ea4ed8c918d legacy-trunk
+26073 ca465e4d88bc1f72bc36934ea395f973451191f3 legacy-trunk
+26074 b383dfe36eee7dea36fb32a623e95b1a80f21044 legacy-trunk
+26075 cc8b73040e837d6bee3071187e2e86d6954a0301 legacy-trunk
+26076 ceca6cc444208c108cd6987e284282d501826eaf legacy-trunk
+26077 e0edfeea5183b463017372683af9082753b6176b legacy-trunk
+26078 22fdb416ba2f1b429fea76203d6bfc1122bec915 legacy-trunk
+26079 0bdd413a34169b4694961b093922a6198df542c3 legacy-trunk
+26080 c3d637308954a3123dca87afa39a532e7095ac6e legacy-trunk
+26081 fa0ac845929b21e0ece65a0a6b73309fb6a95ebf legacy-trunk
+26082 6c4b193016c675c1c5030c317679daa904d480af legacy-trunk
+26083 253de588f2fb65e2f174cddd923aef8256b67b79 legacy-trunk
+26084 ba68dda15df0687ecca122e76b103da6bf0fe243 legacy-trunk
+26085 1e3062e69f2cc110359d154e62c2ea7d41694bc7 legacy-trunk
+26086 9baa8c9a1e843a98139becb6959085d938bac6ac legacy-trunk
+26087 fa9559c5b103715326436ba0f546762d5cf9b2de legacy-trunk
+26088 c84110f05dc36c47197601f69ee623c9cb5f5b3e legacy-trunk
+26089 0973693e4ad21d688b3a477719b6af57e50ea117 legacy-trunk
+26090 14b7986a92e1038fa902c4069163e70ada6cba14 legacy-trunk
+26091 cdff3c7c1a76437910f419ce0435cb9af1cf782c legacy-trunk
+26092 6931dbd2edb421db523e2b9ce6b0793dfd9daab4 release22-maint
+26093 0b64550a746115c47eb6e8342ff2c3ab884b0a75 release21-maint
+26094 00154a0fde6175a4c854df6b757b34807c564c2a legacy-trunk
+26095 d24670384c39cd260c40efffbc367ca33ed5d4f0 legacy-trunk
+26096 1ae423262fc986815ed968ac19c678904bdc648d legacy-trunk
+26097 f02ea8e824b0c13788e1e143bd76122853c3d7f0 legacy-trunk
+26098 73e82722b03c392f156a1ab0597d63b59dd4b7e9 legacy-trunk
+26099 810c14f243736d922b72033ad1d98eb00dd074cc release22-maint
+26100 826bc1522d2212c3f4eb3000791ba46d40da74b1 legacy-trunk
+26101 e449c81c1c01f4e02c50e8bc156c1e13e39cbbd0 legacy-trunk
+26102 271d621f0e9fdf22da83a828cc19551bde48600a legacy-trunk
+26103 771b2a8d445dc321ad573f79b3cd8db7d22aeff9 legacy-trunk
+26104 f51b7788401287efe3ef6e67d6cec794f6cd4eac legacy-trunk
+26105 7361ec88188a91e1a1e8c4bd4fe3d5ddbe55c96f legacy-trunk
+26106 280e7a20e31a5c86834abe4aa9c2309b1f94c9d7 release21-maint
+26107 c118d095bddeb5db1736cdaffd22d5c78c3fc75c release22-maint
+26108 fee2f66f3c165ef0c161914fc2bae39ef6530269 legacy-trunk
+26109 1bdf217bad9309b766916a48fa0e7dffcbc10ecd legacy-trunk
+26110 2224afc63a5bb963ff351444dd244d100697b44d legacy-trunk
+26111 53ed9dd6bcd5d4909e7994360f1d8107b54b3967 legacy-trunk
+26112 522405ab35c1ad2c6228c05626d6fc8fbfaa8caa legacy-trunk
+26113 4c10f1692523264579d160bfb67d49e4238a66f0 legacy-trunk
+26114 4081eff932fe287926b3cc921225965dec2959d8 legacy-trunk
+26115 2aa949d02d405328d3104c425723869901891d60 legacy-trunk
+26116 cb5fca3ce79a9fa78c6a72a79088f07d5a1cdfd5 legacy-trunk
+26117 fd44999e7ead4217fd513f5085dadf59062154df legacy-trunk
+26118 6871e6745aa54210a9b102ce8ca3c47548be3f28 legacy-trunk
+26119 6fa46c21766d9231ddaa8dc7caafda741bf61489 release22-maint
+26120 e70c9b7aaf3d68964e1fc3c962e254754e5a4df2 release22-maint
+26121 8719866014ab36a909f7560b28e4642aa6210c63 legacy-trunk
+26122 9931f154be988f5d88d4e9ed0a865de9d7172a9f legacy-trunk
+26123 817b494c9b5e497b4fd0037970ac0a4e2a2ab7a4 release21-maint
+26123 5b54640e72b66b8c085795e28ef756d58b955c6c release22-maint
+26124 a7884d7d2d48900f95d2d0d46af934d449319128 release22-maint
+26125 3428229f12bb19a2869c33fb42e09e85342c745e legacy-trunk
+26126 ad3ce73016bfaa1bc6cc5e6677c9e767363ad1c0 legacy-trunk
+26127 d26d8575ac621cf2fc8ed6b982eab329be4e8f84 legacy-trunk
+26128 54ea8a93ecd7e62197b3b6f332decaf8ec23b36a legacy-trunk
+26129 3a5065005fcfd12112aa2b32cd365a588a559514 legacy-trunk
+26130 9f509e490fcc79cffeddb2d4f5f3d61eb6bf308e legacy-trunk
+26131 314e1416aa5d5f5dcce601b4a566e19a642c58b9 legacy-trunk
+26132 260a1720f629c4ff3701ab4a4d662366d65ae158 legacy-trunk
+26133 59d3913a29c4439323c7410a7bb648c9eec24fc9 legacy-trunk
+26134 a6f8e1286b1556edeebd5123ae04d66d772a3b68 legacy-trunk
+26135 02fddf7c25c2de3e32bf078183327b3503a0f3b9 legacy-trunk
+26136 74de8641828410e2562db57f72646cf5d2b16c18 release22-maint
+26137 d6ef957bf290fc6e65f71fd72342c694161ca2ea legacy-trunk
+26138 a6a8c69ec0e7c58e13b90cb5baeecefa63cc5367 legacy-trunk
+26139 36186af3c125164a70ea1fad2a57a97270e6b8ca release21-maint
+26140 149fbbb0391575b5f885b7c92e0729d96acefa85 release22-maint
+26141 5f7d70ab74eeffdfcdde721cda5faeb715c4aee8 legacy-trunk
+26142 ec67fce3fa3ced4a3c8d8cc48b96570ff2fcdfbf legacy-trunk
+26143 d99a1ddf951805178d8f185a7f326a82b3fa1be1 legacy-trunk
+26144 01c5ae6fc5bbba3a7e1aa157c66d1e55e93f30de legacy-trunk
+26145 0b2c087542bcbff3704622349abb9d9c5b5b06bc legacy-trunk
+26146 aa8d59823add1a8e7f7e8a7fe8c7f710a97e3c8b legacy-trunk
+26147 a8c75cf74dc14112c0ec80c2c2dbf65afc739da8 legacy-trunk
+26148 028ebc8fb3908a8cdb7a940be1a1c45c44172868 legacy-trunk
+26149 22396f77c356aa309fb8f020a689d8439a433b91 legacy-trunk
+26150 97a34643e544a9705dddd48781d821832105112f legacy-trunk
+26151 06668d8d9343f464d9108d3d2cabae4f58b39b65 release22-maint
+26152 9acab76b00178d6487d64cb00d2ea85003a3a34a legacy-trunk
+26153 1922915cb73d7a8accc51ff95d54880819ef6f62 release22-maint
+26154 3c8781492d1fdb8ba3950e2e94a4f75eeb2e4a7b release21-maint
+26155 f663ffbe9e5c40d4a2ac59e8a88d5f08ea92b8ad legacy-trunk
+26156 4ed06f8aadd37863288e36daa6ee316e4be9baf2 legacy-trunk
+26157 ac5e1d9029b794526c7d32082c7e3080d9ae8e11 legacy-trunk
+26158 693e00164081aedccc8cf47502f8848e8cb6f155 release22-maint
+26159 0eb83aace071667da95a832fdeaaa86f36af38ec legacy-trunk
+26160 58b2f4626b64d78a1f18458762471f8455dd189a legacy-trunk
+26161 2100887b47cbb9be2cfec1f3c8b6acddf81f085f legacy-trunk
+26162 f0277146aa16db649f7d3f9a72f9b5aa44885f93 legacy-trunk
+26163 17a1751ad1d9021fea84a19605c3899b7dfdf77d release21-maint
+26164 21f353124145c43a3921c8225e9e557305cf9aff legacy-trunk
+26165 77343aa03e2f363c7b41041610f78c8334cb61f5 legacy-trunk
+26166 f1af8ad11000a089be0f9fdb5ba372c1982c17a3 legacy-trunk
+26167 c815e003dbcd8bd5c0ce45844114f617f656be4c legacy-trunk
+26168 882ea5cc7687abbe8f4c70c024d88a8e3ad43297 release22-maint
+26169 3337c41c132b114a94c52b50c184fd9f2c80242a release21-maint
+26170 2b7025a232e1f7f494cc99b33cfb58932a6d3e24 release21-maint
+26171 a3bf2c97e808e41648d64b1a5fa693f11b88f713 release22-maint
+26172 dd8988ca4b1466d367a18fcc0fea8605614506da legacy-trunk
+26173 12b003be5d96c538977047a32f6e5a1fae7c2cd1 legacy-trunk
+26174 533cd5197575da77c07f11a66a5d3623b059fe70 release22-maint
+26175 43ee737a1b7f10aaa0a9bd59228f37b689df3cd7 release21-maint
+26176 3515767123d8c8ce538fa2e351f6d86efaa17b30 release22-maint
+26177 35b798438527eb62fd762b6b45f5b98607a4adfb legacy-trunk
+26178 6afffff1fff1eea57fed03226a4595146e0fa785 release22-maint
+26179 43cee18182420a1cc6853c60329b9544f54fe608 release21-maint
+26180 c1aec6324ad54e0a8e5262fe3ce3b1a6a274861a legacy-trunk
+26181 0acf6820d9e351033573b6488ea76e63a3e07320 legacy-trunk
+26182 42cc87c401036b1f3067b95f558fbaadaa5ccf9a legacy-trunk
+26183 c56eaad3a0b39f2ae0f538265042e62bbe5f413a legacy-trunk
+26184 f89f201087ea675a511b89b2ab26c775fafb2c22 legacy-trunk
+26185 f68ddf7f21f84a5b5e0e242ed73a7475c8f08162 legacy-trunk
+26186 8ba499ecc6c9124c6043aeb6fe3253942d99ab18 legacy-trunk
+26187 29551f747c0ed9d46718d844b8ecc9aaac96f769 release22-maint
+26188 3b6f48b54666ecfa121ea16966a4b7340f732d93 legacy-trunk
+26189 aaf572e334c3c8ba3949daa136acb3b4fbf235c6 release22-maint
+26190 d3cf383df096c2c8ce6545c08437230e357339ff release22-maint
+26191 a9dd5e6d680563e07863d74f7d58c28031175f03 legacy-trunk
+26192 3af8ab1b05fc7f12902366f13b7ea58617a73bc5 legacy-trunk
+26193 5eda7db007d6d78e6811916e305c836c055c4ae1 legacy-trunk
+26194 c865cf8bee40d6951b0321d260cf13287d33fdd0 legacy-trunk
+26195 0908729e94e0f15f1d6d870015978e69f39ab6ff legacy-trunk
+26196 73d145bfd8e45e0b0cc18996f4f41f88f5bda2f4 legacy-trunk
+26197 f1f57bf09092ebe6c269933c875950e1879329b1 legacy-trunk
+26198 ef2fbce717369dfce080750cee23f4e8881b67f2 legacy-trunk
+26199 d7531307435551a0db5f58720a70b49f01daaa0a legacy-trunk
+26200 2eddce44b3bedbc712051285bfdce988595c39d3 legacy-trunk
+26201 18696fc35062f62aa40c13849041ddc07245f109 legacy-trunk
+26202 39ea09ff5734eccdf1c6272e5f152b3fddac8ffb release22-maint
+26203 079abe05e8bc81c3d8b926ea5baec119077d31fc release22-maint
+26204 382791ddce1c1832f050f5e6dbcff906be1766a2 release22-maint
+26205 216dad7209bc70132ca229b920d94ab2448eb720 release22-maint
+26206 d7029679435f7ec29060ce18057e143e9455bde0 release22-maint
+26207 68071a7269706b81ba579516644c031adb4aced2 release22-maint
+26208 f6093bac9fb64fe34f25b684f75e64af7764e875 legacy-trunk
+26209 e589e473f232fbf77f89e84197801dd7995d40bc legacy-trunk
+26210 d6d64239aa05158a2f78362b6c8b626830d1698b legacy-trunk
+26211 f6600b0db688a77680c001ff0f7e50f747748cc8 legacy-trunk
+26212 ed03806d88cdc9729ef005b90d4ca1f280b634e6 legacy-trunk
+26213 6e9c0d9bdd7fd4a6241787f44cefe4a7fe5c2a1c legacy-trunk
+26214 188b0fa28007e86a98e5135c1f025bb44926326e legacy-trunk
+26215 32eec6d79c93f2ab512628150d436eb89fdbb327 legacy-trunk
+26216 416db8d96216b911ec8a9554f75ec33aa425ac31 release22-maint
+26217 273f51f520001917846d45d2ec82f1be1050a33d release22-maint
+26218 e24b8d0b64704b10ce3b150408b214e3ddbf7177 legacy-trunk
+26219 22f7ef7ba72ba45ce569159def77d3d456182f68 legacy-trunk
+26220 bbf05af3c19138d3571725294cf6d23da5da6744 legacy-trunk
+26221 04367cff86895f6ccb580f72e201ca971b90985f legacy-trunk
+26222 a6527d1ee47428ab622569f177abed2586ed4971 legacy-trunk
+26223 f9236cad69e6280fa87724b7c4cff446585884f4 legacy-trunk
+26224 6f8a5ad39e6fe72e1f0e1085d0c2e5a7d41584c7 legacy-trunk
+26225 6804e48a0033b46645b878cd1a491ec661745f04 legacy-trunk
+26226 7014921820a51cd1aeead3d1da438245ad238f51 legacy-trunk
+26227 a561ff1b4ffa1fba979e3312d17cd7d59abdba5e legacy-trunk
+26228 e2f2187c3d2c1ca798eaf968ab95136252504dd9 legacy-trunk
+26229 00e640e680bd298dc77097c8ee7d77410c903656 legacy-trunk
+26230 b1fa90f8b6c21203d0bf036db62a74f0ee99cf62 release22-maint
+26231 c91626d1f411f0cbfa274afa15b0c1c745d30370 release22-maint
+26232 252438bb05d97a84ad1d881ca52bbad68569df10 legacy-trunk
+26233 d462c790cc5bd769787f9b81b743cb33e7bb77f3 release22-maint
+26234 8d337b3b655a3aa6178a265b91eacd948a76e90d legacy-trunk
+26235 c3e9a052e268a0070da7b2a629b7ca9d577e1411 release22-maint
+26236 e3de9d19faaafc6cf8a184621662ec6dfc2204c6 release21-maint
+26237 1a3b08663ebe01e7bf79a16605c272a4b1948ab1 release21-maint
+26238 a41a1e0051c5d6e202df29d954ae91d71d4f029d release21-maint
+26239 3a6718b9b65a838b2876d69d1111fd9b683ffaab legacy-trunk
+26240 e1423ec9e6ec362d0967a754477c4b7ebb61d9fc release22-maint
+26241 389d429ada72c6d47e23ff3732af9bf621a667a8 release21-maint
+26242 7928751bfdee5187ab39b6b88a4bb3850a209b83 release21-maint
+26243 5be0677d810d026a79556d1ad39782d7696fd8b2 release21-maint
+26244 d8bc68cb17e0370128b9de4f350f414a20200809 legacy-trunk
+26245 5d383006d36b9d364a5242c06942e2649f52e3d9 release22-maint
+26246 289ea1d5c5acccdc19dfa6e77677624aa8a60ba4 legacy-trunk
+26247 c0dd8bbdde6040834795d65a2ea6a403a291696c release22-maint
+26248 f97473b340a5803cb0dccf764e4350742ebcd7c2 release21-maint
+26249 2b3a6a844bffdbb9e8de853fee53586464911184 legacy-trunk
+26250 170fb5b9473f8a3424d2a60bd672443171c00cf6 release21-maint
+26251 af72d2cf2c55eb8849006d0e00065a810ac51d08 release21-maint
+26252 b81d0e890412cc1af2c45202a28913f84371ad0b release21-maint
+26253 33b2a89bf4a6a5b267b5d183e25853657086fda3 release21-maint
+26254 1a375661cc9732950104d205e4c7881ba0c4f797 release21-maint
+26255 570a780279d1a461be642e3b74a11cba18f9ee9a release21-maint
+26256 b5aade97d723fa8a63e7b19bb1630dc61fe2c70f release21-maint
+26257 7d40b691dba7637ccbf77a1293dd238e372e9ba4 legacy-trunk
+26258 8baca4ece6455352707ab6faf1113d0ad5269d0a release21-maint
+26259 ea43523b5be7627f4ba622b78a9878aef35cc2d8 release21-maint
+26260 c0d7b5788cbe63baac024495210739d0677d8974 legacy-trunk
+26261 8913dfa11027edaa7aa115cceb7016cea9be9f13 legacy-trunk
+26262 11cfe8383cf88751fad3d79e1e6b2bd3122d0066 release22-maint
+26263 fbdd40b92b870b7ff7bd4edd6236b067b8b4ada9 release22-maint
+26264 7e84da9c98eba6b8081fc3c3cc1a67eb23aee57c legacy-trunk
+26265 9d26d568dbb30763c5ee2ab304b3a2caaad91b1d release21-maint
+26266 b608445b25f029b2dadc85ff0af31ceb723f3ca0 release21-maint
+26267 ac99bed24b7d106ca51b6044c50d7ca1695860fd release21-maint
+26267 7d1504c80fa072b4ba86edda13a13b0a05ae8eab release21-maint
+26269 5ab3e8f14d46639d6c40c9cb62d0d7cf8b876873 release22-maint
+26269 394790316aa380d22e4d670bc69a639e725f0300 release22-maint
+26271 99001fd95e48db815a8fd01b3dd01779e1ee78e5 legacy-trunk
+26272 0773d23224d2aa6b55051cfd0769aef3ac6fdf7f legacy-trunk
+26273 c26af1abc2c6213012ad590f941d9a89eadfa190 legacy-trunk
+26274 12133c8b83cf5f4ee324ce743b40bfdab495ecee release22-maint
+26275 7281a06e3b57f3bebc5752141eb03acf5bb652fa release22-maint
+26276 feb6d1bcdd1d62e189de2305dc58e2cb5773c10a legacy-trunk
+26277 9081c92a0cc85e44fc67ec3fca73449bffe8781d release22-maint
+26278 8a02c33ed2c18bb3840b09b1e0f5e47fc65b01e0 legacy-trunk
+26279 15c18bc9d71565fe787948fde6a01f0ea3069cae legacy-trunk
+26280 54229c35132e7751f1bd06740a2f940a8bde56b3 legacy-trunk
+26281 2392af05f0526b5603000b78ce5b8f61b9af2a66 legacy-trunk
+26282 3c876ff29a83ed9efde4925a18776ab55bba0b67 legacy-trunk
+26283 3f21e4e39268103f21543509229b95efccc5e081 legacy-trunk
+26284 a5eeb288e020f730c90d68498119a42ef5a3d408 legacy-trunk
+26285 077ce8b5d83b59b73e73c7aa5d103b453f2beda9 legacy-trunk
+26286 4c499447cc49f8873ee185da889a8e945db20380 release22-maint
+26287 3323f3f422db09a1224ce0b93fed79f433de444b legacy-trunk
+26288 e23381fa47503802cd143bf2afa93c9e4468fafd legacy-trunk
+26289 e2dec3cdf3c2680ffd7e862dbc82bfa1aca67169 legacy-trunk
+26290 e307a94dd77bfdcd5b7de7db2405aaa53e876976 legacy-trunk
+26291 267b9732bf465500b2a04869904f6f6f117bf51d legacy-trunk
+26292 a96e7e5f3407715a70232f2a5fc78cf86a1152b4 legacy-trunk
+26293 f76ca9fbc7a4762c48d63078bc47304336144413 legacy-trunk
+26294 32a9b19dba1dd6700ae3b7e9bbbb2a26e22325bd legacy-trunk
+26295 44ee68ac5e7f961b6fc399147f0c17c242e86b2e legacy-trunk
+26296 d4f9e19b8c0b42760a387a7f480d589f474d729e legacy-trunk
+26297 f14e4550b2f3cea8c93b77a44dcd7ebb41606ca1 release22-maint
+26298 a54b23b2f1720c337271b887f90decabd05bebbe release21-maint
+26299 5c553772ca54c3fd4de9f0bb4e9a84c086a916c7 legacy-trunk
+26300 534aab5bccea45b3c6ebf06449822e2d661d630f legacy-trunk
+26301 ab679931ae0d17170fbfa0902a838ccdecc969fd release22-maint
+26302 057c5d79c988addb77976dd7c98f583e7b376c9d release22-maint
+26303 97939834a67352201a4d2c5a5858c76a4800d809 legacy-trunk
+26304 c8750d63dc35584264d3cf71c13da8d01e04d031 legacy-trunk
+26305 50c9c241463d21aeaf16be08208db36fb6a428e3 legacy-trunk
+26306 c04906fa178c88bb024f47a64067df4c7a007fb6 legacy-trunk
+26307 cc50a091f573affc3112dccecf3db8448648bf99 legacy-trunk
+26308 1a8a7498b0bb371ace22ddfc2d3a5443546f4214 legacy-trunk
+26309 6cb52829da1a2aac67696c0b438c7c20a96eecbf legacy-trunk
+26310 5f5454a48b5ab96fe39334d0fd765dbc72d8cf6d legacy-trunk
+26311 21f31939dc2f748f2ff90e838bf39c246899a809 legacy-trunk
+26312 6a36112a3dce0675bb2ba567df564d9f69a9f9c4 legacy-trunk
+26313 c8c1dc0727cd50cde7dcc6b3a1ff5b3ffa4e1f6f legacy-trunk
+26314 bfa330b8520507d99127dfc82b8ca070f23876c3 legacy-trunk
+26315 9a58e97db447c3f496a96854189c9f067016874e legacy-trunk
+26316 cea852f8aa4763037f015e23079795c86d6d7bad legacy-trunk
+26317 03a83340c914a92c6fb78371de8f589576b0ca00 legacy-trunk
+26318 4f9d5ea4f37d9c121b80a857f0600edb48fcc9f1 legacy-trunk
+26319 5f2dcdd0932936c5d2bf4ba47f410feaa895959d legacy-trunk
+26320 f81701b712164f6622ea8a054c063ca0400fa8ca legacy-trunk
+26321 a0bb5fa1ab2dcde0ef0c3397d2413556c85ff17e legacy-trunk
+26322 3f23d72ef410f666e04e8b2901afdebb0b3a1126 legacy-trunk
+26323 6d731b64670b690d24b3885be4ef9a785e88d29c legacy-trunk
+26324 9563c9664a0bb8a2ece689f35b4a2040225dc107 legacy-trunk
+26325 a00473f3317b93f754845b1694c78533c523422d legacy-trunk
+26326 b37314fcbcc9f7520747e2d0a489f8e11aad284c legacy-trunk
+26327 084ab73777a34174de7d898309e4071cbfb1bbc8 legacy-trunk
+26328 5495b6df0c65d30f7db3d51c48c88072fe402152 legacy-trunk
+26329 ba0236f84318c239ed83a8bf56ea8fd53ad08b01 legacy-trunk
+26330 3100ba26913c7d5baa1131fda74f50c136d424eb legacy-trunk
+26331 f93a26d1bfa0e9dd831811806c4275c7c1ee7198 legacy-trunk
+26332 90b834ce57077feda5fc19a05c328432a7d2f930 legacy-trunk
+26333 95819f7f0bcd2cdc8fe5ca29b0401585964df820 legacy-trunk
+26334 699cc139d2d24866a10ba1adc9632cbece031a74 legacy-trunk
+26335 72778ec94dec66763827331100bb8f18a03bca55 legacy-trunk
+26336 29e6cb832497b5fe8ad2e73368bbdf03b94b0bd9 legacy-trunk
+26337 a9e4024d8a377019560529bade058712db50bfe5 legacy-trunk
+26338 4ba091cc70b89b16644aa75e1737dfdd24d400d6 legacy-trunk
+26339 363c7fc174ac8bdb7b831981b89c63c3213471a2 legacy-trunk
+26340 9fe94c01eaf1fff5007c0384255e4181bd0dcd75 legacy-trunk
+26341 9f949027d7ba193bd6143f2aa644b90370467d28 legacy-trunk
+26342 dc1fb19d990d692f17cd1e0ce77105cc32c54580 legacy-trunk
+26343 d09740b2e03de1f85ca084356a45d01ac02ecca4 legacy-trunk
+26344 1c26a310665310f63fe57578773fd0331a2be352 legacy-trunk
+26345 c5a67f50532e914711d0cff597ba3ec946b4e401 legacy-trunk
+26346 d9d82c1ef86450df2335500e9be3bb73bab7c6fb legacy-trunk
+26347 298a7c51d2c01dedd5a080c469e6c0714cee20d5 legacy-trunk
+26348 c8d61ff1c0d6b7495490aa99d403f2fd8e33478e legacy-trunk
+26349 be54465a39c454a58b2b17c34ea9b95ab0e72d17 legacy-trunk
+26350 61661583a12fab2af0cfd0c5083c3b32ae131a1e legacy-trunk
+26351 24663b86b97505eca60721917d473e2b2339d79c legacy-trunk
+26352 1e1c721433d8e4a3b08753ce481aee5bbf795d02 legacy-trunk
+26353 beb3218905a2fe9b14b634e20b2d9f94a243a15a legacy-trunk
+26354 0a19f016a994647ea1289cb41320c2bd3a10a54a legacy-trunk
+26355 196dfa7ed348dbfe9615762681945db21086b941 legacy-trunk
+26356 690d712e2807c3e1c8cc5120b7a59b34472bf22a legacy-trunk
+26357 b9ad1e9f59a85ea079e870e8e165647ee661005a legacy-trunk
+26358 2dd0f84af07169290161ea35335a4f8a2dca560b legacy-trunk
+26359 a9cb919e49e331bbe8be911d6f79c770fa67ca7b legacy-trunk
+26360 25a6e39c31a2070e151fe8f6afe6dab064412655 legacy-trunk
+26361 0b1e20c34c8ea6c19e4c5315575990b9d2dd8f12 legacy-trunk
+26362 a0561cf491634db14c76e3239adf66af0cc0b441 legacy-trunk
+26363 8f98cb3a0f368ca43f1f50330c0410ca8a4a14a2 legacy-trunk
+26364 4f063b80308d9923d05a671e47a492d0992afe8e legacy-trunk
+26365 1f7af4fb3a5152ca148e1e0ac2f663e4856ea128 legacy-trunk
+26366 e54b9c3848b7a3492080a489f345d71730413ede legacy-trunk
+26367 1ceaf7f8055d6f30afa7dafa5d782aa7efe9b426 legacy-trunk
+26368 db003b8a9bb9546009095b030a77dd17fc579c78 legacy-trunk
+26369 d5048f9b8b8257b1c1bddcab919cb54adf7c28ba legacy-trunk
+26370 8be6238748c4d0af3cc70a0bb663ad717a849c75 legacy-trunk
+26371 931d448820aeef38db62203bb09bdec1235af007 legacy-trunk
+26372 989377cdf0532d7776cb667c6c5637fd3c7a8e6b legacy-trunk
+26373 08ab0a6bf1ebb14a90f4cb9328cd0f6dbb9a3a3c legacy-trunk
+26374 d6322983069e06aa24c93de98fec95985be72b86 legacy-trunk
+26375 3b083b26296a8e812764d28e136b27ba22586816 legacy-trunk
+26376 202ae5b75cca24382724873bff998fa02346143d legacy-trunk
+26377 b5f9f7a8f5666e489fbb55d2b0392ad1f936b368 legacy-trunk
+26378 44637bd7f59b64298c2d2c2492b4b3b585fc0017 legacy-trunk
+26379 b1ab4bc52243d00d90740c88232f339c68461dec legacy-trunk
+26380 c6003de7397557b9c84d35eb370cf6827972aa53 release22-maint
+26381 e2848618bd1959ad146a9b1a1ef9e5a8ced0914b legacy-trunk
+26382 2471832700958f74c9236aab3861886815b3d8d6 legacy-trunk
+26383 ebe3ce6cbfd78615228beccf90e3b7e1c785f7c0 legacy-trunk
+26384 899002a882a08a509ff6b2ec243a1fe47d7d23ed legacy-trunk
+26385 4e58a38e3c061aac1d7de7d4eaee8ee7dbecec26 legacy-trunk
+26386 3e892582a850bc8b6118fd7e7082bea43c8979d5 legacy-trunk
+26387 f3fc97da68a9858c3f9a8f90304e8edfe15b84b3 legacy-trunk
+26388 03c39640d81a8942dcfc45a13ea9ae7c3a1f4d5a legacy-trunk
+26389 a9a6c118dfba7543b2f61eef875faf74c61302b7 legacy-trunk
+26390 8291473fde3eb32c517c07516df8a99cb2960de3 legacy-trunk
+26391 1862374ab25399d55f8698779c5277ba324687ab legacy-trunk
+26392 5bda546ebe24acf9eab170bf21c6c807516ae5c9 legacy-trunk
+26393 1db3a02965e655ef4ef851a58fd8a9759d2e83ad legacy-trunk
+26394 8b9260e92010b54e8ab5e8e34fd6e8b5469b2f94 legacy-trunk
+26395 53ba9110a1f17797c753ec3d7117e6bd440e3749 legacy-trunk
+26396 b1ee4321a50a7b2c59bad1301468a3b2702d4235 legacy-trunk
+26397 8f645180534d53f6bf637355159eaa36aaf69584 legacy-trunk
+26398 89db9e3f35a748b19d95b34a96525e8d52064c3a legacy-trunk
+26399 9d352667d715eec078348c8d954f600a7aa0badf legacy-trunk
+26400 454351ef50f1d1970ce4b9c3bd30ca588123d656 legacy-trunk
+26401 cd202ef6726e3457f53b65cd5470372a3a61ef5f legacy-trunk
+26402 f1aa18c8c96b821c95b20b54f210157ffd73e118 legacy-trunk
+26403 e1f8e29547499f4973ff9babdb33f3b8fa0b9b33 legacy-trunk
+26404 7fecd6d58f38ef174d3ab3424bfe9ec4342cd50e legacy-trunk
+26405 0f37cb5a7e9e8cd5b082d7f51695500d41f34e67 legacy-trunk
+26406 8b1268bc371a64ff5bbcf3779ccc10f4159251c6 legacy-trunk
+26407 769e0a538e543d15cd8786bb7afc4fbfa36bac78 legacy-trunk
+26408 751289cd1ab712d9e762a1849e8250b92defe559 legacy-trunk
+26409 c1668a819242c513a2aec193c45dd2f0888da2b7 legacy-trunk
+26410 9e6ff787280a95dd4c08fd0ad51480016c9f74b7 legacy-trunk
+26411 8a8affccf463bb5c5780de70f9899973977f9521 legacy-trunk
+26412 19ea00feda336cd11d994691800d55fdbe082dd3 legacy-trunk
+26413 8eb6dd3d8322efbd4f8bc422c88123a109a09eb1 legacy-trunk
+26414 04fbf65c73ef6fc6a788fc488c765e70559a613a legacy-trunk
+26415 71be5ba88aa7a72c7ac00e62828e38a87493ec45 legacy-trunk
+26416 3af2cadccd6ac6523e9b0e9c62356bc7b64669a1 legacy-trunk
+26417 a135980dd4e9b6b9bf12ebe3d192707a188c60d8 legacy-trunk
+26418 6be283d148f7e388255949441594d30f91a6d4dc legacy-trunk
+26419 8005fc1aef39c8f0624e415c6912f70eaf5b29d6 legacy-trunk
+26420 4c0ab5d6a63c41eac29ca287c7d7c61526265e62 legacy-trunk
+26421 c328d7250e92660036c9ba8ad5cc4df02a34b6b9 release22-maint
+26422 dbd0ee7f60e056970a6a0731b4d590a2378fb583 legacy-trunk
+26423 c371bb3e85291b9e334fc53475c4f6d2429adeed legacy-trunk
+26424 530aba3116a40d085e4a108979f603e29bebf3f8 legacy-trunk
+26425 dc0c1213c79abdda0935b38064a3ff20af3c2bb8 legacy-trunk
+26426 938ff3cb51c26bfe419eb65ceb7aece37b9d618f legacy-trunk
+26427 03ff3569ba04caf6c5681d280ee6addd3f0c169d legacy-trunk
+26428 f3677414bc3def6a09055fc6ea7494d2b6336ebd legacy-trunk
+26429 42c99728b6cca2f9ec2b783e53f14cc767294810 release22-maint
+26430 bbab3a17b4cf4e3c7cd3f4f4c5b712fa5500917a legacy-trunk
+26431 97b9480bbeec75e6159c54097137707345de389a legacy-trunk
+26432 fda73bff21ffa56d5a9ece2f249cf1c8cbc8cb32 legacy-trunk
+26433 d89e5573dd237e13b06247ad2053db9f3dd2c1e0 legacy-trunk
+26434 21d252028404c80dd8229ef92c68ed9a82e014d2 legacy-trunk
+26435 4ff90c99c302aa6bd43c4d2281ec3fe1fefb7722 legacy-trunk
+26436 b7e87732f6ab9413d54fdcdaa9ec99ff34b6e169 legacy-trunk
+26437 0fce55675cbcb380c242f39def73b8e3883148a4 legacy-trunk
+26438 3bd336b6cb03a67f73e710ef16640ad317f5a3ce legacy-trunk
+26439 4addf4ceafc547f47bfe048c57b2ec681ea24504 legacy-trunk
+26440 969c1d118c97debfd3fa6a8ff6a12cab492e524a release22-maint
+26441 10e0122b5fed5f88d721da9dd9ad7f595578f81d release21-maint
+26442 3bf762e0e06ed09a91e3e26644142fa1b9eeba3f legacy-trunk
+26443 393e9a216a88b500109f031836ea6cff2cd0d07d legacy-trunk
+26444 e484f30dac77a6171a27b97ee365601aae8c879f legacy-trunk
+26445 8c3dd1c2ef479ee6ec4e60e19baa8ed357e272de legacy-trunk
+26446 423a3678bc7c7176ea60ab1e2177a9b6fa19eadd legacy-trunk
+26447 4e82522847d0de81e003775063c5eab592d94b12 legacy-trunk
+26448 09db3f5d0bd0ea0bf3bb2a5f59a164d3db3daf22 legacy-trunk
+26449 8c7a39d0fefd801f6ddc89ce0fdfaa126f390ce7 legacy-trunk
+26450 314f92a24293b2abbcf07cea3e7d57c401645c19 legacy-trunk
+26451 b395477d84d0d76997307d4da688a03783ae7be7 legacy-trunk
+26452 99757562bfb957fd4b594979f309ece929772b8e legacy-trunk
+26453 9eba60ace2dae0c25c489ec6f5a059dc26a7595b legacy-trunk
+26454 911f9f14e2d57e9b6242c6a2aec29456d5adb7bc legacy-trunk
+26455 2a542784062f5a93d5c3c0905c628f9931e256df legacy-trunk
+26456 b5aae2a65f6d122a0f735fa2e5e9b846263d72f1 legacy-trunk
+26457 f8679f6798bf67b914f371e174c1cb7671808487 legacy-trunk
+26458 03abfa7db4498c5cb9cedb0f9d589c2eae89c0ed release22-maint
+26459 7172cef23b0549ebfe693f8bb9f86c9c36e517ac release21-maint
+26460 73895c99fcc5bbeec75e1c73b2a85a9901879bff release21-maint
+26461 b6f432b321438cacb54cb8875dbc03b0a0b6f9cf release22-maint
+26462 569e383be0da9a6d6c7e3fc6c69ffa37068aed15 legacy-trunk
+26463 d44545c4a47a82f320e505b0226acb18c4697c69 legacy-trunk
+26464 d27e97b8a866e6dc4fbccc28c506c6c54561d795 release22-maint
+26465 26e3fe8a88f57b71ccafbc2da238e71d8fd36dff legacy-trunk
+26466 01f73fd663109fb12243d8be559ecf3160183c4a release22-maint
+26467 97836f6193dc30715b820fc110b8f0dbc6b14375 release21-maint
+26468 f5edf7025267685e3172952ebb6cefaf1f764ec7 release21-maint
+26469 df45adf77d36dfde4d8b614fc2cc73462fed7852 release22-maint
+26470 7b00dab988cf440786e39ca589957850ec0a77e3 legacy-trunk
+26471 2d3a2beb3d4d7029f3ee98d57ed5b739c446b66e release22-maint
+26472 4079e9c23fc172763beb6d8f9f4bf9a17dac8330 legacy-trunk
+26473 a3c982d412b46e1cf94cf44c723338d70f9de4fa legacy-trunk
+26474 e7513e142c70edfbc92341069fb248675c6701ea legacy-trunk
+26475 1da02bba627673acfc43b03cb41e02cdb37f2518 legacy-trunk
+26476 7121d7d572d01af30b6226d850fa771e5cbbe11a legacy-trunk
+26477 fde878bc0e3be5e498178f15c2dafd0ed2d7d595 legacy-trunk
+26478 0ffb54b1c3ea5ca1e88794cf19ed312bc8582752 legacy-trunk
+26479 f917e7a6e911b771e1d61458ddf37bafa2e50fa3 legacy-trunk
+26480 fa41f24106887312b5f622cb12994f1635decadb legacy-trunk
+26481 737f4458e5de011e03c319e08e395368fe7967b8 release22-maint
+26482 b0e59f1e495ac6db9566f887dc822a37257ff44b release22-maint
+26483 627b7ca5221ac0c91ea19391a723fee8bc50ceab legacy-trunk
+26484 22da2608285cfe77a4eabc665fce7b52356503a5 release22-maint
+26485 0ba23341e5cff4e8e5ed1b7676fe5769f7aae785 release22-maint
+26486 90805fcc6c702573f118eb99dbc7da26dd3751f4 release22-maint
+26487 368e8081e73c4dbd28043ebe1c8baa3e678df1cb release22-maint
+26488 70650ae1a2cf0023f17381be28defb78410420e8 legacy-trunk
+26489 5aaf3d7b8d8c0893b150ef0db779ed0fbe4486df legacy-trunk
+26490 ad44bf1179eb254b5ca97c755fccbfe2bc559acd release22-maint
+26491 de09b874f07a688ccc66270b783e7ab05d28813c release22-maint
+26492 90adbcf6201361c7dbb8cc83539ad977502c4453 release22-maint
+26493 67578a830d81ca3926ebe696c919e039b5f03528 release22-maint
+26494 6da1f9917e9b3e5335fb55ab381bd42a597f7f48 release22-maint
+26495 4694a0df174e48b951baee7b9bc5cced1cf3063c release21-maint
+26496 a047f16fb8b3e7220c9215b48d27524e6819e807 release22-maint
+26497 d9b71f62814f8d1a5fe6d9519f41b89cc5ca29c8 release22-maint
+26498 91a2228f3021b792d0dd8d223e961495b842b062 release22-maint
+26499 ab5123274ccff3f6f0eb9478e1cdbcff26aab895 release21-maint
+26500 2a11144f8f0c07783661998a4b67fcccc17c05d5 release22-maint
+26501 46ffb149ea73a44144265b2edaaaf996782c3171 release22-maint
+26502 8ba30e2d8ae656d2e276d51c8ca75dd4c18e27cc release21-maint
+26503 b7f9506e60c94fe01ff6fd96bb97365e388276fb release22-maint
+26504 a575e6ee85d99695514d1a90556740ba0cebc13f release22-maint
+26505 a36f9fb2c4042af2645286466e276a236027e354 release22-maint
+26506 0ecef8bfbd4b02002597746ca4a4981e7fc0ba35 release22-maint
+26507 61cc08745d3159360ab34a8ae0c9fc6b083bde6c release22-maint
+26508 dbf013cc3deee0a45fec946df1301c4d7624e083 release22-maint
+26509 c4609ca17e3ea0d07853bfb3cdf02295f118ccd1 release22-maint
+26510 62fabbd457be6b4b49cbedade08912149549b91f release22-maint
+26511 52257affe0c9ea3aa5327780678cf220902ae9f5 release22-maint
+26512 f769b4958e66639fbf6c237b6e7bc4391e05a550 legacy-trunk
+26513 95052715651b600d604ef5974b96a059b51b558c release22-maint
+26514 9368567a1047ce78b98b92e7ad86993aec9c5f50 release21-maint
+26515 1eb42fc68b5f85e8f29cab6af3030fe863fd878e legacy-trunk
+26516 61eb7182535ef08509ce06f8f8a892259833dc68 legacy-trunk
+26517 aae814f94baddfad088972be2af417e69e6374b6 legacy-trunk
+26518 54af4496760455f55d19eddc470f099034fbee80 legacy-trunk
+26519 4ab21e354403e05bfa1cc5edd567846beea1fba8 legacy-trunk
+26520 fca379c30906e1d6fac9bcb4a85ebd9314be2e07 legacy-trunk
+26521 c548e726b3bc8be6c7da0becd6eaa8521875a9dd legacy-trunk
+26522 362c1b81ee9c79eb6e6af3e17708bc9ddcd3e75b release21-maint
+26523 dd416374ab3862e2ead90d3ca6fa1ff658821367 release22-maint
+26524 8c144245b315cf444cae373a25bc952fe5bc9901 legacy-trunk
+26525 883d69de560bff911f732fb9042887c6bb445f61 release22-maint
+26526 195fe5ff50ab900b1c252d4c388ffdc82ab7369e legacy-trunk
+26527 f0dc97bb9c0dfa5726eebe2792516b363fd0e063 legacy-trunk
+26528 0ab245de7dda74cdc44d532cf6bb98c18ffc29bd legacy-trunk
+26529 b63f4a19ebdd27f87264a0c9e5da5e14dcf1165c legacy-trunk
+26530 713ff889d094859d413f4e1b21947cfc0df2e062 legacy-trunk
+26531 3a0a2f077b8f0109d4b0a01be4724484a206217a legacy-trunk
+26532 d5ce7ff531bd16bed0161c7a5326d1480f8a53ee release22-maint
+26533 f03572084851b49ef8fa0d9a03d34e0d7c84b50d legacy-trunk
+26534 2fc94ba5dbff132927dce7f55954da7deda1392b legacy-trunk
+26535 e1d0d7c6999a516738d76d590442ecdb33131b36 legacy-trunk
+26536 16328761eabf594cd23a3b949476152cf519c762 legacy-trunk
+26537 68d70b41009ed96410cf842dd493d6cb3e2fd182 legacy-trunk
+26538 ef73ff7a989e7f0e59649deb81f4452f4b694779 legacy-trunk
+26539 8cf1ef814ee43a8b8cc8d5618ad10bfd050b8602 release22-maint
+26540 6218828b0a112bdea866cb0e4eab241a2b620083 legacy-trunk
+26541 1a618196e15a9c573035db9633e9bb411dd210af release22-maint
+26542 1df9318b2b8e06e3f01a9a263ceda5bb24583bf8 legacy-trunk
+26543 1a77af6111059fbd74d72aa92a30aa0b9650765b legacy-trunk
+26544 998cc48464fefab7f02ff146ba83b00ec9e667bd legacy-trunk
+26545 c277ebc3ce0f1913ba2ec159b8b284c4b501e2d3 legacy-trunk
+26546 e7799916596d39e5965ca19d21f50ddfc4c2e410 legacy-trunk
+26547 b4352f5a3452212468d58ab96b317f6f2475cb6a legacy-trunk
+26548 7c0e8dbcf57a594eedfa4168df45c491844bfe52 legacy-trunk
+26549 2fd63d75e92f952854cf97ef4f38a2d28c48f58b release22-maint
+26550 37435f9f04d64552fa00486ec81b392d747c3a3e release22-maint
+26551 0bc3a41d4e40a26b671775d11eb83121843bb5b3 legacy-trunk
+26552 d478f8afc36dd5184c8dd73fab8fd84fb7d94204 legacy-trunk
+26553 f1d6142128d3e4939927a99b80ff1ab7d069b858 legacy-trunk
+26554 508fd952c9e9f23e43e904025ce8981ad6a2716d legacy-trunk
+26555 0c8e762a677c481cbe29158ec996e7f747ab872a release21-maint
+26556 f3be05e62ad1a8d68d088a4f723b2fa672de2d85 legacy-trunk
+26557 60f242589c327a9395011d172f9d4dd29c26f0ec legacy-trunk
+26558 6759be088d68bde67cb3418f686e6e837903341f legacy-trunk
+26559 950a22eb8cc8adef5ad6922b68f47ecff188f415 legacy-trunk
+26560 217eea9d6615958124b7ff589c4df10646631eb5 legacy-trunk
+26561 d078f848ac3b880f5c1c87599e54314c9558b432 legacy-trunk
+26562 c408e8b2675aa2eae72118ac41ec27e8914a928a legacy-trunk
+26563 49bf5a8fa1517e1bf91a057a9af442f08a232914 legacy-trunk
+26564 583c226afde6cb204a2bdcb7b263f921c0ada088 legacy-trunk
+26565 6e568ee31a9cec0830a5d9b0b089f90303ce272e legacy-trunk
+26566 8f9ad2c05dadea9e5c3e414b070097bcf9e3b06d legacy-trunk
+26567 fd609d2c16691f02102f87955f85b9e81e1411e7 legacy-trunk
+26568 5c301775665d9cfad85f9df7c3933e51614166b0 legacy-trunk
+26569 382e37ac374da2ca754d766bf9eca8825b121532 legacy-trunk
+26570 6b2af6dafe7c73f568a2f4c0de59a5e144bc8dcd legacy-trunk
+26571 0e4497fb2de8d4a109481ffd21fffc7738427001 legacy-trunk
+26572 e16dbf8753037383be85c169c1e24e1824e7d334 legacy-trunk
+26573 ef919d295a120d6585a8b04898b0e7797c50563e legacy-trunk
+26574 19f53aa4e1e51477328943bf985f0878a01d6321 legacy-trunk
+26575 d8e9f6f57f13365339fb48c9d4a128f2c9d84a5a release22-maint
+26576 b19a5adb69900493a6b6bc303f3759f057872a19 release22-maint
+26577 ba889989a7eb01fadf0a6db13692991174b358ac legacy-trunk
+26578 d614ae948bc3ae3b5beb1f7f26ba4ac1f82562d1 legacy-trunk
+26579 b236d20830fe53d58f24beac79bd538b1e3a748b legacy-trunk
+26580 b08b51dce264e3f64188e74dd9d0b95b68697ca2 release22-maint
+26581 bd08c6955e9bdd1644509f8bec5d453ef80e5e0b legacy-trunk
+26582 554f2197a7a76c8f7391335a4e7bc1ac3478beb7 legacy-trunk
+26583 ab4fa78afddf619a26c7fccbfede6929e7df39d3 legacy-trunk
+26584 f5aeeaaf03974e1e7e5ef7a0ba6223b875debd1e legacy-trunk
+26585 ed5d75912d60da91d5b93f236610174d3faa4daa legacy-trunk
+26586 e639e34ef9011e8f3af38b7c5c1aed11bda09557 legacy-trunk
+26587 dd350b63930999468d38d0ccc27e21c6dbe81bc9 release22-maint
+26588 a4318923c7aa334864d1b6c8b356ca5194435735 legacy-trunk
+26589 6db6e3dc8366bec666425e67ce02b7a34d148154 legacy-trunk
+26590 2b47d0dcfa666a8d581c34b0a6abb738d51595ee legacy-trunk
+26591 86312554530159306b4fdc844efd460cada51635 legacy-trunk
+26592 8bb90e8bf363d3d0f4defb173273e53e76ed118a release21-maint
+26593 d32543337a2175e5bde73899390d1b21042a1c84 release21-maint
+26594 40a1880553691fcc99b3e5acb845c25692aaf27b legacy-trunk
+26595 aef248c1645a242bbc715e0631ce906a4e10bae0 release21-maint
+26596 770c2d2f547299bd512306015edc51224a4204d5 legacy-trunk
+26597 f51d1a2d4a4a1fad1aa3ba46de4b4db5c042a066 release22-maint
+26598 5d135e414c76432dd3e21421991c2f29e14dbd79 legacy-trunk
+26599 d328e5bb8a880f648258b28b1511a87e59438a6b release22-maint
+26600 dabb0a3f47a554202051fb8d5d678bddb2b2d6dc legacy-trunk
+26601 76c45037113fda363c2095f2b2e45c8ef504db75 legacy-trunk
+26602 30458a11b5e093ad530aff9e84543aef877201cd legacy-trunk
+26603 4e234b87170b08ee26a5dad9a9b7c8b46d8b322e legacy-trunk
+26604 24b3ead89cae878360e43b9e3e2cef3ae1ede652 legacy-trunk
+26605 8fec110e9d0208490dc90ad2f6fa7606f7f81b99 legacy-trunk
+26606 e0470f2dd410e8bb7521f4383ee8c005be31ff68 legacy-trunk
+26607 5fdadc94266502d72673dd2f3ff1254348805783 legacy-trunk
+26608 b0b632106fd765d1cabd9cf818c54e6e73d38607 legacy-trunk
+26609 97650edf58bb17db3960225e8ed1af1be690e5fd legacy-trunk
+26610 5e80ad36d8ffbc44b142b7fb48f5f15a2e99d619 legacy-trunk
+26611 284cfca74df40d61356d41fba0cb6f109ef0accb legacy-trunk
+26612 405b291c321da0e91c113afb049c74abc6ffb440 legacy-trunk
+26613 4f335ca3f11cc1844181c326d019c55be2634e44 legacy-trunk
+26614 72ca0fd4dca6bf5658a20ef6533c1dd3de0a429f legacy-trunk
+26615 9b175018fdef785ca2c9f7e9520cb566211ec453 legacy-trunk
+26616 2922113217697c1b071cb7934d8db5ef4d0b2702 release21-maint
+26617 a839a6be85788d503704af4f46c7f2963534eccc release22-maint
+26618 667b026a89d90e2e48c1f20189260e3c0264adc7 legacy-trunk
+26619 9a9bec10aa8c6cd28b729ec0000f4e616671f738 legacy-trunk
+26620 1cf885931669390728bf79b7c396de70670ba539 legacy-trunk
+26621 9e3532b75471e68f6ccf69896d913bf8785e958f legacy-trunk
+26622 e5249a6cc1d87fe6c3e32946884497603a098c40 legacy-trunk
+26623 7353977d6b64acf20bf255f7bcf1dac14733e25c legacy-trunk
+26624 37812f2ba1aabeb58ab4183ce1e4e174b560ca08 legacy-trunk
+26625 b572f7a0bb5635c56f4df7db954b9807b37be028 legacy-trunk
+26626 8d4b25ceeefe9f918ecf5ef157ca0eed1ebbf820 legacy-trunk
+26627 7b66cd15dce99031a97a406c144a7c23379336ba legacy-trunk
+26628 21ce5d5e0ec714a96cb672750031717bf7838796 legacy-trunk
+26629 493206b701db517419cd2f87e341750f4c6b373f release22-maint
+26630 ec2a5559e7695bbd6e756fe5fb61eb2efad63664 release22-maint
+26631 f970588e89b10d32eec09d72f907e131ccc53ab2 legacy-trunk
+26632 803e6a6953064c399e3378b3a5a3fa2b72f599b6 legacy-trunk
+26633 582855f6d35bedfb0b167cacb2cdb1fda6ad7d91 legacy-trunk
+26634 70a0897223935bf21ca2f04404806844c17fa3b3 legacy-trunk
+26635 29ca9e12bf1019a2c9b7e9ed05a6198a27a5a03e legacy-trunk
+26636 d47290dd2d57e65165614df4b1f9ee8c8e0a6edd legacy-trunk
+26637 46450f17a070561c6f5ac872120f27645fd88d91 legacy-trunk
+26638 314e08e8090fb4d90a6fb4c5b11952a24f25af3a legacy-trunk
+26639 5f5cea272b46231c08e10e62cc2e327fadb943fc legacy-trunk
+26640 200559fcc664f7b66b93828251e2cd81b23a5a7b legacy-trunk
+26641 9e22a8702de2d84d48ceda870ddb0f718a6030d2 legacy-trunk
+26642 f5fd7e295897595cf1276d35bfe352732b66a96e legacy-trunk
+26643 a4e75d53d32b4f577b561ad5fa04a46aed926d97 legacy-trunk
+26644 3eddd9d68af7dbc045f1d69a8f302b7d122b25ba release22-maint
+26645 00f66360be19860652343bab79ea1621120be663 legacy-trunk
+26646 afe263672fd84babbd35385a428cfd521411fe74 legacy-trunk
+26647 e11471a0626c122d45a9188748291deb37cc62e9 legacy-trunk
+26648 b60b73d41eb4a83de4f1ad61898f68d169f5a550 legacy-trunk
+26649 4728bedf4b789a70518e812feb3681b17136cd6b release22-maint
+26650 7c6094b18d16100ae9d42d478b473a361a187b08 legacy-trunk
+26651 5dd52a9b0438a8695fc284374ca5fa52e0ecf807 release21-maint
+26652 65610bc4e6a573f047c54d2dd99509113d44a8d8 legacy-trunk
+26653 b93ed1a4e49f1a8692e018a09da51643cdb14ae3 release22-maint
+26654 8f1b371ffbaf61d7ab293db4707285d85299930f legacy-trunk
+26655 b735e89ccda74f80d702f33b2f6c27da4dc1c546 legacy-trunk
+26656 6fa76b4e59fefe81c511198c7f8965d02a279374 legacy-trunk
+26657 17cafe805f045f652a652349d9f853c8804fcf90 legacy-trunk
+26658 08e6f94f3ab0079846225cc3c6e88432052964f6 legacy-trunk
+26659 5a6be8fa8de24e6c7afa3797d5371590f2fb4dd8 legacy-trunk
+26660 01478a1329089b8029ce1cea837bc334ef309504 legacy-trunk
+26661 b5f6e9f6e7f4b798de086076b5202e3a8c0c69e6 legacy-trunk
+26662 5732a9cc91c7a942b0bffa3788d06aebb7b9be80 legacy-trunk
+26663 53ebae7823d9742f3514bcdd18598eaa372071c0 legacy-trunk
+26664 a2153285652460096962d3fc4fb1fb2e41751679 legacy-trunk
+26665 20a7b2cf3c1fe395e7e5b73a9cd2914f11750634 legacy-trunk
+26666 ef6e31f0cee127616b7b70aea41bb4277904d04b legacy-trunk
+26667 cf9640be6f8a9520e3f21cd1c6aaec0ad0c275d0 legacy-trunk
+26668 8ae7b40ac6d07ebed6570d405dad71e0eaee768f release22-maint
+26669 d0532ae05ed72ac2c71a93d2b0942493541777ed release22-maint
+26670 4ce611650d0ce87e2370302b96b3e9541d1ab878 release22-maint
+26671 01765d30532e29d46fbb944dac848ec0901d0869 release22-maint
+26672 ba6721ae4b80933cb5b82e035d70b781c43d2f99 release21-maint
+26673 5dbc79ee0885bd563c34fb3ada014e0127eae0ee release21-maint
+26674 0b089c8ac0773012ec60f693ecfdf0357e15425b release22-maint
+26675 aab4273a7cf716739ad6ae66fe6b8468c17ecb96 release22-maint
+26676 4c8f5a890f98beeef376baabb3a1b6fb1408cca0 legacy-trunk
+26677 1337633327673403af8c0c2f3f3e7cab7f214ddf legacy-trunk
+26678 af1ff41be47b845306c6ebf7d2fd467418148ab4 legacy-trunk
+26679 46cfb85f0aae760407e34b3b4b7528840f5f32d6 release21-maint
+26680 a443e5e5ece7f61c2cabcaa2e6c70b54306d4829 release22-maint
+26681 23bf68778a2a85c291abaf1fd17dec296f2a19bc legacy-trunk
+26682 388449370946247f07e77a87e3c9b524b127b940 legacy-trunk
+26683 174ba03c89fb4813a4a8facb4c8eafd1ef7cb310 legacy-trunk
+26684 af499b50a094643c77f7b6d12777132fe7c78d34 legacy-trunk
+26685 3c7b22d112d35e3cf23ee73c3e29596ed6b93e7a release21-maint
+26686 1806d02c08c447a52fac194685509c415307db9a release22-maint
+26687 68926d0aad403bf8a4dabdf031c3b94f907557a3 legacy-trunk
+26688 ba2901287cb7ca86bfcd3191912f86b1818ca493 legacy-trunk
+26689 8b5926032b56a205a4caef3ee13f63bf6ce1d52b release22-maint
+26690 ffd5d86e96ceb0f92411fadc3765c0fce8ee381a release21-maint
+26691 c33077dc0c83b9c19da627941c050a9eeca3daeb legacy-trunk
+26692 aae6dc6b2a5898e32c100c7f4581062c5fdccfa5 legacy-trunk
+26693 c1d1ae15de92c9af54669f2d974b300e8fa3886e legacy-trunk
+26694 cd02a36704fef23aba5391118795f659c22307ad legacy-trunk
+26695 c917fe9bc654fe966061770dc40d4db5dc4859c9 legacy-trunk
+26696 3debc8c34cc910c823708ddbc5ae2b50e98a0cbe legacy-trunk
+26697 87c98af61fc4ab95cf034ffbcff96dfef8959066 release22-maint
+26698 838427f0af232d14da469e1e1a3022faf8340479 release22-maint
+26699 97e0b504c0009881aeb94eabb956852010579e85 release21-maint
+26700 02d5283b1e21fc62e6e9ac19b86f856a9061dfa6 release21-maint
+26701 3697a336400fabc261406466a67017eba0f31a38 legacy-trunk
+26702 55423c1abcd149de8830e5fa68f7b3dbd7ed0ded release22-maint
+26703 13056b6267a25f16eca0eabf9c66a7c76feeca0f release21-maint
+26704 03b1e989b1d977458d77bc6d396516b0dd05cda0 legacy-trunk
+26705 bffc7236c4ba289147de8dd8aab7a3709c8154db legacy-trunk
+26706 d93f537a752b886edea64adfbe18cd9c88b54d73 legacy-trunk
+26707 87c716b28a3ecf0b0fb70df4f7a2b1585105291a legacy-trunk
+26708 2d2faa51dcfdae8ce3e01290444e2688c4406222 legacy-trunk
+26709 aa08554d1a9b41ab9a232476c0d0cb46669bbc97 legacy-trunk
+26710 1c9ce34d529dc38f29607c4dca675930da489582 release22-maint
+26711 b491ab7877d2d2a25a97934bbb0f2902024869c8 legacy-trunk
+26712 238dfec9c899e8e33dc47810b57c91579fcda37a release22-maint
+26713 981c6b6ff2f172019a9d4009beb3bac29a208f3d release21-maint
+26714 9c9e07359d6e64047a9cfaeee776b25cd0182625 release21-maint
+26715 d466bc19f7312ae5770bea14225a84ae98f42c0a legacy-trunk
+26716 67bcb4f5237f24526079ce5ef320ac0dbf625ee3 release22-maint
+26717 0a4d6b240ab24877bdee841f17bfcfeecbc9b62f legacy-trunk
+26718 066d8275ad643abebf83bd1af83ace844ad032bf legacy-trunk
+26719 fd69f3ee77eac1f62a267421346dd83b82bb7d61 release22-maint
+26720 ecf070c34999e65637ac9ad381efcc807ffbf0ec release22-maint
+26721 7bf7cf3a35b9044cdac30d3e28de0cfeca5adc4d legacy-trunk
+26722 aee8f16f27741d16820854128aacc95c90043113 legacy-trunk
+26723 18f8a7b56f890023eb0eae096ba65a96d68ce727 legacy-trunk
+26724 36840a989722d7e8443e86e89a2de1c8a2fd89db legacy-trunk
+26725 bec157dbee2e08a6b25663db9944d4c2a2c27ce8 legacy-trunk
+26726 3efd34fe6668064aa43f3a119dbe7ddfaf318ffd legacy-trunk
+26727 3b323df945bb6bf19cfae365bdd9df9e64d636ce legacy-trunk
+26728 b27f36cf3d3e023dceaa6e770aa7789c82d0ce7e legacy-trunk
+26729 d3d857a882f0f839b771b5c7ccdb0cf7afbb9c79 legacy-trunk
+26730 7ed49af048ba093e47384e7464f764f8cbc2980c legacy-trunk
+26731 105be936b5c36d6378e717a532806cdcd871f89e legacy-trunk
+26732 ad97fce9dcfe25ec68a6463f0b0f114525b14ffe legacy-trunk
+26733 c56888d170984e132f3fec88bdf818492ba721c4 release21-maint
+26734 4af669f9c42e082b1ae7ef599ad2cd654342a822 legacy-trunk
+26735 6751e8bcfd293fcab07640d3fe246900a53d72b4 release22-maint
+26736 3b825675d11944724afab87d4bab13b42b63f827 release22-maint
+26737 cbbe289e7c2e9285f38ce4fa70ac3ebd671db084 legacy-trunk
+26738 2f7d869dad4df7bbdf671191fe6deeac01ad90fe legacy-trunk
+26739 4d6beab766e274d9f9fe32169dbd2d1353004457 legacy-trunk
+26740 e5df086ed4551850eab9a969526690784f688325 legacy-trunk
+26741 9be01b7b6c80abdc9d31dc006943e2e8fd36f4b8 legacy-trunk
+26742 82a850db7ec577e82700807a857f5cde5c9ed0ac legacy-trunk
+26743 1303dc0723fcc123c9cf05869461fb7a54ae4e78 legacy-trunk
+26744 ca907f28e2d5582ace162cc7584275faf4ec5517 legacy-trunk
+26745 0719a377a616c139fbd0d87f4c30c81a85bf2b16 release22-maint
+26746 422784709380aa4ea7fb4d364b6f0b45a1c9ee13 release21-maint
+26747 f8ff9fab92cee454fc931baa9c1667210ed0b1f1 legacy-trunk
+26748 a9c98183ff87fe6658dd7d9dc3d036e92c617b25 legacy-trunk
+26749 6a7b26bde0e8b9c861d4ddca44cc96b584921fbc release22-maint
+26750 c78b52dac9630c043c6aee33ce1bb8b6a47a46d4 legacy-trunk
+26751 40fe183a892202d5c6477d4ecc2a9e89616b94f6 legacy-trunk
+26752 fa7320cb37d95ec4ff8590075078c0a0fc9b2efa legacy-trunk
+26753 2300734145040bca81aebbd8cb6d80e5e463f66c legacy-trunk
+26754 dfd98e9521b37ef909a07eb321c96d4f4546cb1a legacy-trunk
+26755 44fecc33889d8c00dd11dff88b4b4f29c10002c0 legacy-trunk
+26756 bfe91e1e31b200627693c3f0d2598d491ca483b9 legacy-trunk
+26757 38841bea24fddde953cca8750d73a9a372bdc1f2 legacy-trunk
+26758 0d8740094beca26d70ee65de423ca13a7470a15e legacy-trunk
+26759 956d038b1dd26f56c157c640273df3077c439af6 legacy-trunk
+26760 a868baebe9564656e358bdfb25d4da7c67b5de07 legacy-trunk
+26761 93542efac06669baaa84a79053b28d317d4240a3 legacy-trunk
+26762 4e7815c95d3eaa94d3031e4b596d1d33fa19d541 legacy-trunk
+26763 b9726ba71aa3f5e7b2c75b742adbbeaf30efd051 legacy-trunk
+26764 c5c2b24db8a711950899af34d0c61231e24582e1 legacy-trunk
+26765 b2aa2648df27b0ae6d69fa06adb858172250eff5 legacy-trunk
+26766 977e534fc6c774220cd258bbed6fa3e0f3cbdc1c legacy-trunk
+26767 e0ed68adba332756f423a32e62db8c26150fc1e3 legacy-trunk
+26768 ee292a53e5fce894f05a5d0a64bc196788215532 release22-maint
+26769 c5c4c1121087797dea10f3b4212999167a707e59 legacy-trunk
+26770 10ae2d611ae9417d68ba2e181c04e6f448eb21b7 legacy-trunk
+26771 473385fca2992883fbe946485e2931b13260865e legacy-trunk
+26772 94bf6aceff788befadfb58449890160e82bf0a82 legacy-trunk
+26773 2339dde6babecf8f1292e484e7df30215e7c0eee legacy-trunk
+26774 60d86b2eab0fafa22892e40843c5ae0d8d7344c6 legacy-trunk
+26775 e5ef166fc22f623e8c60ffc16ee8158c243632b8 legacy-trunk
+26776 211b16ac066a70483472112874b78c97c6ea57c9 legacy-trunk
+26777 58cac70602aa69935909469b7d6b7f94f784a19a release22-maint
+26778 39e5c0d6c1822a80e7bf9c88b6eeadee01e7bc63 release21-maint
+26779 81d067205b86f2b7d051eeeb3015a9ef5fa7e8fa legacy-trunk
+26780 4f67e56686e58d9aedce698c088195aa1717fc67 legacy-trunk
+26781 90efa1cab3bc2c7561d8d871b9c74b64dfbf9252 legacy-trunk
+26782 642a453e7a2e923e05900e625921e87c20f87467 legacy-trunk
+26783 f38bdb2fcae02d0557c7e2f01ceb8992a4441776 release22-maint
+26784 c375c5b266312e1303598442259978dc14be6196 legacy-trunk
+26785 63890bc29a7cbf4f8966b20801629baa7f87ae2a legacy-trunk
+26786 62403b93f470b22e09828a289f7f1ced04d6c1fe legacy-trunk
+26787 1157281f00a02b1377f8f7d1eb181d5ada2bcc94 legacy-trunk
+26788 a4d675b8b53c0240793be9252458b1030ace9e41 legacy-trunk
+26789 8eba4c92df2b4e4e5617e5df4929d65aebe673b2 legacy-trunk
+26790 e11e950acc235161051fbfb871907da525ccd320 release22-maint
+26791 1be6e79b1d460508396a53b31714721ff4d022fb legacy-trunk
+26792 ab52312f82c79188640bc1a918523555c6f32f09 release22-maint
+26793 56240bcda88c91f0b131c9fc636d5c80b5cc3df9 legacy-trunk
+26794 fb64f21176afaeade35499d8f40ae26bf04fd941 legacy-trunk
+26795 993c77587dca239232cd7b1fff675584cc5f4146 legacy-trunk
+26796 25fd4a8f9e092274cd3e323e9b12aae173af8c29 legacy-trunk
+26797 f9d5e1fb2aa6973caa42f7eedbb49fce44a00bed legacy-trunk
+26798 82460fda4f76710b63a212caea508dd6e4bf2419 release22-maint
+26799 08d6c8b780d9699d298d69e8cdb4cb5b6ec30df4 legacy-trunk
+26800 de0ac03e5e72d8c856fff8acfc2e0fed4c7e8b33 legacy-trunk
+26801 28f71c4bd16bb593ad5041415161bf8b859ac24c release22-maint
+26802 6b2ba3b7ed326be4aa487930d82eaf4b34fa8b49 legacy-trunk
+26803 b1589605393334a304070a9f164271a6d89d230e legacy-trunk
+26804 03dfe7d343dbac3f80b58a9416dc29cbf85ef1b7 release22-maint
+26805 f12193059239db2a49418825da6bd6fc1dc2403f release22-maint
+26806 d3f275bd2c60a1d0f8610da3bd10058b3565cd9b legacy-trunk
+26807 19a9492537812fa211820c56871db548f098ebbe legacy-trunk
+26808 08ccb0f3e2d496c7be76ab3b3d31626eeaf4ddb2 legacy-trunk
+26809 453e59a472b21a28f9b1470bc3203ee34435a47f release22-maint
+26810 72f0c1a245f8df94f0f167a2f39d0b223a2df668 legacy-trunk
+26811 1cc93d501b45f06b84bbec7cfb470eabddab51ae release22-maint
+26812 273dd2508c57e1b657d66b8f2c478165f9537974 legacy-trunk
+26813 6bae0c31bbfb26104fa0ff884cabad757f8a24d7 legacy-trunk
+26814 24e2334e7bb2f8afb6f185bf7f31f869a818fee8 legacy-trunk
+26815 26b924ad266cfb56af7aa77fb41216c9f350b22a legacy-trunk
+26816 f98a27cb92823942e52c6549ad512019664b800b DS_RPC_BRANCH
+26818 68c776ba5ea5ad1c5dfbed5c49b1818ac5207cd2 legacy-trunk
+26819 64eb119b816d5ad5f5182be96b9007df0892d07f release22-maint
+26820 ddb41e87d6514f760e2786e3d9d66a8ec255dcad legacy-trunk
+26821 8a45bfd6b4717c1b425a5c8a45838357e2339e9d legacy-trunk
+26822 7e5141b68c5f1d04dc0b774107df7e99fadac2ee legacy-trunk
+26823 d9bb4ec3e75b327882b0020397c2be3ff6e5f170 legacy-trunk
+26824 e43aafffb03c676f1a61a9ea48defb7596eef9ba release22-maint
+26825 61348aa2ff986d5bfd6cf7d99877c9eb9bc36fdf legacy-trunk
+26826 8183859dcfcd215155cfe812d10cd952dd3f31a1 release22-maint
+26827 be54ba4b2c440e8ec9723136bbdcc97a8a503b5d legacy-trunk
+26828 c2556e30fcb482add0ea201dc4b07cc919505110 release22-maint
+26829 ab234107e267327c53169bdfe692ac73e92b663c legacy-trunk
+26830 3abff11f82b3537569b80d2ca1757fdfa71a8029 release22-maint
+26831 10c820083c2dc1644c82d0c88143115d0262d8df release22-maint
+26832 12b465758729da290044c7d94dae2d6816dde059 legacy-trunk
+26833 bd1c4b65db79104d45efc7fb1fbf82479216bc6d legacy-trunk
+26834 a2198f72d5ebea007f3df5f1ef5a7d3e248c5f32 legacy-trunk
+26835 be0bc55ecf4a0f618fb085b83f47144745c6ffff legacy-trunk
+26836 077d44b0405be6b20cc8533efcc65c1216c6701c legacy-trunk
+26837 344ae531e6a73e227117179bea04ae33d5a2c9b4 legacy-trunk
+26838 7ce0188378ef3a8d86761a8bf165150d7988e690 legacy-trunk
+26839 50a97a9629987a02cb7136999f3201c653ebaf12 legacy-trunk
+26840 d3e025ef1fb2df98c0861a1979dd40046c20d7db legacy-trunk
+26841 d35b9fff81e09b25fe37b5d59e93e9ccd83e3625 legacy-trunk
+26842 73249abed683760db218b6d62df26fa8a5809c05 legacy-trunk
+26843 5d73a2c7fae63fe6132666bacc6c9b5be33d91e7 legacy-trunk
+26844 d917857fd334ea9e8d5399054a5a41bcb7012afc legacy-trunk
+26845 5bd30a36897b1e4760dc479d0f111b193885e2b2 legacy-trunk
+26846 17562106c2a046682d72687baf320523b30cdd7a legacy-trunk
+26847 cdd5c751823cd92885e5a176fa115ef91426fda9 legacy-trunk
+26848 c76e5c1c6e4545b5740b443b6c91aff8572dbb98 legacy-trunk
+26849 bb5790c6cdaa1473745ebae2651ab9c0c0099027 legacy-trunk
+26850 9b1e3b7bd7f124269bc368b93c29643771eaa87d legacy-trunk
+26851 be6536f2ebefb1633225bba66b3630137fa18633 release22-maint
+26852 267ae59eddb4c4b5e56b1568e8c5d8a4edf0dec8 legacy-trunk
+26853 684edd16bbd81fc487b2cf3806b40e2f5a9161c6 legacy-trunk
+26854 8673c2edf21cbe404a571cdb432e02af30a0fcb4 legacy-trunk
+26855 bda98bac695601c2bbdc47e26e35b3943a64b9a5 release22-maint
+26856 0c42cee475dff35d62b113c4f45bfccae4afb4c6 release21-maint
+26857 76f376bea5e5a9a9188536d11d5c7516c8c09ee9 legacy-trunk
+26858 68e3f3dd4d4884919d95dc08d4292bf13b599bf0 legacy-trunk
+26859 f4318885ce9a63288b1009ea097c9c1f0cd6928c legacy-trunk
+26860 989a7adf84efb357c5175dccc1844dff4cdb16b5 legacy-trunk
+26861 85615ea65b1bf80af965c6786874064d6e5b87f3 legacy-trunk
+26862 dba4f5176492f4541e56b4cd30a3125ec4b728dd legacy-trunk
+26863 ad904db7344a9f941ea0ffa2a3851cf9d68bc8f7 legacy-trunk
+26864 62688d6ac3879c0cd7e5e4c33b04ea362d4e671b legacy-trunk
+26865 dc3a7f98d4ed12f3e862bb522baa024ac11e7c29 legacy-trunk
+26866 631f928667329bb6c6d28add1aff9b308614c3c5 legacy-trunk
+26867 172b6250d52603bf7758e334c27dfb2e67685d46 legacy-trunk
+26868 76ef4b942b131bd883ce1b57c6f6b303b783dfd9 legacy-trunk
+26870 7ab8c38117239714ee65d972982bcbd52703d996 release22-maint
+26871 c44b21fcd38ad32e678534b9baf4f5e7251d6331 legacy-trunk
+26872 b1d8683521ec4f374fa92a774ac29eae84c5bee0 legacy-trunk
+26873 fba05347bb30ad7aa26ca6beaab5bb0c9bb8f50a legacy-trunk
+26874 82309c7325efe3686c81a08966fbd8ba17184591 legacy-trunk
+26875 7bc31ad9477cf5f65e02667446a8f8e63e370f7d legacy-trunk
+26876 2675b158bf677dfd9309e9fb426c42ed5b3e9227 legacy-trunk
+26877 35f01bf34d604376e93424ede7e86b55e78af899 legacy-trunk
+26878 9eea5edd857f6ae4e3c139b03c7d565e67b10178 legacy-trunk
+26879 b3898d326519ee2390646b85684e7fa673b3f689 legacy-trunk
+26880 bfea14f8ff353c5ff28015cb01bbc4e45ac36b67 legacy-trunk
+26881 73c01b1cbdb2c0161e31d3d24c5c0691b4e8c115 legacy-trunk
+26882 c03e8899d4b190442fd77176af698c9f165abf1a legacy-trunk
+26883 0014387fd6044d1125403bfe257d042d9cac0c48 legacy-trunk
+26884 b8728d58e9c333eb0e8568620bdeb43032bdfdc5 release22-maint
+26885 a90faa5f94171c7071153a7139fc03a669c4aab5 legacy-trunk
+26886 2aff12e2a94f5c9de35697117afc12f117840d0f legacy-trunk
+26887 b602f2291b5fd3fe487e85b700aa0ba5b02e4fbe legacy-trunk
+26888 0e1771fc012f26dd73c48a4f5f783f1ed2a22b67 legacy-trunk
+26889 c79b1e5552e84959af24eac891051cb78a4e8655 legacy-trunk
+26890 98827a9d62c32eac6b9618eb8348ff354f873e7f legacy-trunk
+26891 b21b6965866289b0d33910fc164852f7a4ba7903 legacy-trunk
+26892 8a49a13fb28df70e3347b73b77ee0c8f54c9ac5a legacy-trunk
+26893 ceca281678008a3d134dd135efb605fc2bbd2b87 release22-maint
+26894 ecef65e57cc6bd99b4fce02f91da8f0b8277101a legacy-trunk
+26895 a98e93eafef7e03ee0c33a3f0f356b94e2c29bc3 legacy-trunk
+26896 2600cf7d33af823cb6b943c2f56cdd5cccb39e5e legacy-trunk
+26897 a4efb59f87671832540d363d3dcd61f8bb7a580e legacy-trunk
+26898 70b5e111ccb0902f720b619e0c174e72d29ace37 legacy-trunk
+26899 8d946c9339e82101ebab7ea718392ea1a3d16c8a legacy-trunk
+26900 0a4c92559a0b41664f21ac04e72c511dd344257c legacy-trunk
+26901 fa8fe2e980625ae68bb5d3f43c47e9cf05a2668f legacy-trunk
+26902 9e67a0d5705fbab9fb6aaf3ac2696bcf87172403 legacy-trunk
+26903 b490ff1706d96462f329d914f1173a2591a4fdae legacy-trunk
+26904 bd58946aa521b2ecf7ee4f55d398122f71a3e466 legacy-trunk
+26905 f6ded6efabcf3090260b3ed92170e72c2390cd54 legacy-trunk
+26906 220b98f0641564a0597b4684c3b7b2d112505b89 legacy-trunk
+26907 40a031155897f9beb72ff7d0a8f3e2691cfbc1e5 legacy-trunk
+26908 1bf34f4394c517e43446013258734a0bf6499003 legacy-trunk
+26909 ce1da2f978076e4c69b29c41871a8dfa115b3fec release22-maint
+26910 88903853f180ee6bb2e0c1e8087cbd288b02424f legacy-trunk
+26911 b74afdd072eb0a1899fcd4f1665f8a820fa8b9a1 legacy-trunk
+26912 303d81e15e70c3a2427a72ae682ef07695bc28f7 legacy-trunk
+26913 446b2f2c01d8aaca3257ab3c1c2c13853f48af4c legacy-trunk
+26914 b3c50f69f38bf238bdd560f7d1ae588e58a3d250 legacy-trunk
+26915 a67248fd237010f82a5734f9e7f1891125b9dfd0 legacy-trunk
+26916 3b2a7ee0866761dd8403de87e8d5546b8205748c legacy-trunk
+26917 3aecdba455285a0e6db4744fc4b47aa3b87dbb77 legacy-trunk
+26918 e5242f58a5b6f90d86dcda730241014d43c9bc11 legacy-trunk
+26919 c4fa37f8978399321e48662a99460e3b77a7435f legacy-trunk
+26920 fecce0173254f7ea2dcea2aa8375020f91f73dc7 legacy-trunk
+26921 a399d8b13c2f458b49510ad80546f7e2fa55b70a legacy-trunk
+26922 5d095898dae659bfd1afc7dfabd5428d429599b5 release22-maint
+26923 53c614288eab94f6b0edf8a457084c4afa54170a release21-maint
+26924 3a4793575ecd7ef68cedaee257e09eb96699960c legacy-trunk
+26925 c5e8f89fd35868d51fc265c49a5401e041a66f60 legacy-trunk
+26926 eaca627f2a546ce8e8fc542e6f9b722edacdf348 legacy-trunk
+26927 508965ce5e472f96d926ac712e0b27aba458cf1a legacy-trunk
+26928 3f242cdd0904ee115c5f465e50bcfcfa101a8c1b legacy-trunk
+26929 1a67fbc7a0668231b98e49299d44dab1a8d77d3d legacy-trunk
+26930 caf62eef7723e4c87844fd7a60a5d3d43b7a38dc legacy-trunk
+26931 3d83fabef0a40ee5d1f0dcc49b76a33ec12edefa legacy-trunk
+26932 ae0a3b14d2e8be78014fed53c8de2ddbbc0f4e32 legacy-trunk
+26933 dc2623e0243e28bf77fae9cef50825b2e1616c0f release22-maint
+26934 b6c32beb4dbcc9c802909f37cb25fa848a0f2909 legacy-trunk
+26935 d5ae6f714cd51cc7d2af972460fcbf00b1ec0a40 legacy-trunk
+26936 4d884ad80dda554e99e87885102c344e12cdc5eb legacy-trunk
+26937 0ac653f469f070d44ba5abb9bb6566540fa702a5 release22-maint
+26938 668c5ca4e0d48c6172a5cac12a6921d16a14135d release22-maint
+26939 99df257142f6438da7e1c5124a1e235e9b29cd70 release22-maint
+26940 7d4c5e4a0ccc26f99850ae63cc2477f7a82a431c release22-maint
+26941 8f7b79cda0d321d7e83ead635160cf7fb0c366b0 release22-maint
+26942 c367607bb5f7d20489865b0a480e1d6e12e49b7b legacy-trunk
+26943 4e3ea55f7e118ca6e27b8e85a7de2237808a4b27 legacy-trunk
+26944 7dba80d58ffd6644368909c6f3866c8c038db5bf legacy-trunk
+26945 beb527158cbcde72c19857f438072d3351732068 legacy-trunk
+26946 190b6bc1912a5d5d62d79bc98e5a62f176600a8d legacy-trunk
+26947 0602c7e6b94d7213a4ed2776ae0cc9062c1a2a16 legacy-trunk
+26948 c6af574bda2928f1cdd18f363d93c987df5300b4 legacy-trunk
+26949 0e8370e7088863cd3d155a02767a6e8dd36512a5 legacy-trunk
+26950 fba57e40f547d0bd63981deaf5190492ad94af3f legacy-trunk
+26951 f12491171638603821b8b826bc53c01f338ebac5 legacy-trunk
+26952 ab94ec4af98a934f6d9c7fe64b018e308350137d legacy-trunk
+26953 b0658feef939e16c24a165b2266036ee61adf8f8 legacy-trunk
+26954 a4bb18212b480eb93d1bb758a83d52db52903842 legacy-trunk
+26955 acbe8e7f99d93b7ff34dc2dfbe8206654fe1aaae legacy-trunk
+26956 d67f1e3a9f1abf58f2b3ae2dd33b3ba2e8ec1c34 legacy-trunk
+26957 c844fcc3c9523ffa7c7b368316d0a1bb83bfd0fb legacy-trunk
+26958 c3a67ce58245f4254a094c87f5f7458f2473fc24 legacy-trunk
+26959 4380a7aa18dc6cdec8d889458c5f3eb997d1acbd legacy-trunk
+26960 c2bc2ed145f727c5c1b436b09441cf3d7fd8520c release22-maint
+26961 ed007e47b3a1399890b22ab1af0e74f29732ac53 legacy-trunk
+26962 2b1d61781d63748971327b6de091d9ee2a68d9f0 legacy-trunk
+26963 197fb305fc5cccfc82342cd47210303b29bc0c70 legacy-trunk
+26964 90ee55b9d72ad1c37c790c29b015f2a50a6c8357 legacy-trunk
+26965 7e400583755ff4806cddce0d45c32f8bea7834b4 legacy-trunk
+26966 dbabb1f7ed3a44cb78db7d5aa8875a67d283690d legacy-trunk
+26967 cffd091f56d0ef05aaaaf8e5f7ddd5ea195022b4 legacy-trunk
+26968 ef8d456067fd28c76285a279b5117261137455d9 release22-maint
+26969 7120620f432bd090a61ef808aa01dd0b523660e8 release21-maint
+26970 5edea752a4219dc2ad958d6be8ddb85d00533a66 legacy-trunk
+26971 a68faa26853ce739aeea1c0078065353c61f7fe5 legacy-trunk
+26972 ec27ac19f9e3c1c9f0983c0b54f178bb27119842 legacy-trunk
+26973 456d58451feea747ce11e87b19085cce21f3688a legacy-trunk
+26974 0a2818cc342ce4d4216cf691e637422a7fd5ef0c legacy-trunk
+26975 21b1d742e4a7009cda0651dd6f8fa6a6a32041fa legacy-trunk
+26976 3caee2958387cd92f3de460b3b2df9a61cadf15a legacy-trunk
+26977 4a1f5bd486ff9f80ebbefb1171d15af8c13442e8 legacy-trunk
+26978 f4eab268e617e9049261fb48de131bf6b6391b17 legacy-trunk
+26979 a6715ad416e5da2eef0d0fab3e18a829f7a62e09 legacy-trunk
+26980 9da85837ff25084b3e388a23d708f6be0414c733 legacy-trunk
+26981 3e3b3c1770ac11b59fccd593171e6b90051f61a3 legacy-trunk
+26982 54483bc21871ef85bc7a32c8d33d761fb9d9746a legacy-trunk
+26983 92626e5ab067354dd1b9db12a73de9e1e86caeff legacy-trunk
+26984 a1de0bab5475093f905a225f6a26330045cc1bfc legacy-trunk
+26985 87f40377cf5438b510619dbc783d491811e3322e legacy-trunk
+26986 5edd80726d966fda2e90dd5bfe4b27c4b3b2e5a5 legacy-trunk
+26987 c00febbe09295e300d1816766505782350dcdcd1 release22-maint
+26988 aed39caf9860dd608bb2c84f81e3577cfb5522f9 release21-maint
+26989 65cf478950ff5c3a881a5ebdda8753396abe57ea legacy-trunk
+26990 63d14141dd10d0255ccfb6c0c4c7776a23cae83d legacy-trunk
+26991 a6a765c7d33b4d71a763b96a0d6fafd31eb06a86 legacy-trunk
+26992 ea979c5206b7e6b8755d907141d379434a7beb64 legacy-trunk
+26993 4a4d120b2b0e09a8f56b0532c883257b59d5bcff release22-maint
+26994 afe946918267a1c5063d121673100f52edf63684 legacy-trunk
+26995 1a52162356028d4f3f4bc79efc904f42e89f8592 legacy-trunk
+26996 1166013fab779536f65533a6a4189150ef31584e legacy-trunk
+26997 0ee8ef7ca09c632e3722a4da6fe6d09f2a15beba release22-maint
+26998 dbee2f628a906722fc430e0e342c8295c8a1ad0e legacy-trunk
+26999 1e60b5d41417b1384a0978e48beb7e37f5250da2 legacy-trunk
+27000 8551e642727c235e157329c3b9dced67237bedf8 legacy-trunk
+27001 0b7fe0fa9dc6b1c3a9e82fd4011cd4a1075d3274 legacy-trunk
+27002 8c215ddfd3d1a185cfcb5fbdb1b19c763b21848a legacy-trunk
+27003 940fef324ebcb5f8c313461e7c381503f212d1ee legacy-trunk
+27004 a25080f6901fe6c8e933b6c438d8c0f0bce32b5a legacy-trunk
+27005 04a4a0e71a8dcf701c8874f093558cb28e956030 legacy-trunk
+27006 c6463afd9f0860b843baef01e20c953bb82aeafe legacy-trunk
+27007 70d76833550b0d935958945808fd964a6d245dfb legacy-trunk
+27009 3ebd376aa4cb6b7975251a91f09da37b35fd33b4 legacy-trunk
+27010 e1e90b0f1f4500bb55cbe302988603c1cebc8638 legacy-trunk
+27011 220ed7febb0019ca6fa676eff9fcfa5742bee77b legacy-trunk
+27012 ec8949e4e46d7824625d06feeb2f30be3caceb98 legacy-trunk
+27013 b94acc18740e7e6862ea74f23cf7ee9eca3f4771 legacy-trunk
+27014 b9218efae8f55c8fbbaae2620f986c9e5269f6e0 legacy-trunk
+27015 a34523121cf4414e91c1cdac5e43f7efa648d527 release22-maint
+27016 f0ca3935d011dda72f38de04a148f0c61e25d9d8 legacy-trunk
+27017 b40165a4efe9ad2bdb36bb36d10ecfd285bccaf9 legacy-trunk
+27018 eb6a1651ccda0372f67c2ed9ca3a609337ba5c38 legacy-trunk
+27019 b86eaeb0d7dd42a77e9ceb56ff3a366fe5c9f3bd legacy-trunk
+27020 ee772f6e881bb23420a377c6b91b1a6eadd11469 legacy-trunk
+27021 bfdbe25a45b06868f177e08e8d7edc846f367d74 legacy-trunk
+27022 5f978196fd3d02ff17db8d761af2f706b9cc95d2 legacy-trunk
+27023 94aa4eb9bb7d942d05f422bc0cbaa4a5c12d2770 legacy-trunk
+27024 5c5fff5de250d73b70ef3e2f5ebc010b2d22d180 legacy-trunk
+27025 18d58de203d6e8de30df3cb381b2addb2464a377 legacy-trunk
+27026 b5c3f10ce63979d6767f28ab212f203dc4d44039 release22-maint
+27027 27e2120cb476313f927b7faf94d26adaa8181c8b legacy-trunk
+27028 e419066f408f2d42e7a705702d034a16c5634637 legacy-trunk
+27029 810dcf9d81c98dccfc6c117e0cb61f80b010f089 legacy-trunk
+27030 6dcd4b6ee5da9e94d958c970c85828e7c78abaa3 legacy-trunk
+27031 2becb5793acd1c986fd1f428b7d39ad8c484d6b8 legacy-trunk
+27032 dc7d5c2d5845a9c16d87c251e1a2405205fff788 legacy-trunk
+27033 ca87119255eb177fe7d6e4de5db5a2d06cb32028 legacy-trunk
+27034 e32152afde4abcca8926d7a37fc7584a678ec69e legacy-trunk
+27035 c3dba91afa6d142e39f9adfe3baa83b2f1af7d99 legacy-trunk
+27036 8efa52e0a84485939a24a5409678da9910f0956b legacy-trunk
+27037 edc423940cd6639e44c1f1b5a8dc6da51fa5312a legacy-trunk
+27038 b92f81938843f9b6f97cf750da559af6e0a3bc0c legacy-trunk
+27039 2fcc6d4e4cd261f265864a6b6d912f6aaeded80e legacy-trunk
+27040 f35e751f5ff258466134c59c035e1a6b390e0d08 legacy-trunk
+27041 3a1ac11ebe50c3e206f158cd6d76ff540c1284ed legacy-trunk
+27042 732b69318168c2c8119340e37ff50724d5c13f8b legacy-trunk
+27043 5c5902de5a54214f2be505d091eb7fb061700298 legacy-trunk
+27044 b18348bdca083e33e5f63c31093e9ca45f896e1f legacy-trunk
+27045 f159ea955e80ea2be4a32feb40a7b51f1fd16a46 legacy-trunk
+27046 e3a840fa584cb8be9c67caf2b499942922904727 legacy-trunk
+27047 d507ad86234232376679d2e6cbf87aa9e00b3f18 legacy-trunk
+27048 61358f800b61690279ad14f84e51edf4c80bb96c legacy-trunk
+27049 325bbb4937c5dc9f3f472a5097250583c0c394df legacy-trunk
+27050 8a9a3aff32fc58d41d89a9c5737ff29f25ca267f legacy-trunk
+27051 14938e76276a1a69660c993729e14a7188598ce1 legacy-trunk
+27052 c4d2d305fd982a7dce900ffb97de1442df4db38a release22-maint
+27053 d7bd7b7329a7ecd73958b72453877341472a755c legacy-trunk
+27054 d6faa137948defcd3f40c64078fdc4a05dd38053 legacy-trunk
+27055 399afce86eb0d8082670ef201f7cb702e578689f legacy-trunk
+27056 3bdfc45d90968c9c99e36a7b7d45ca7c38d52c81 legacy-trunk
+27057 3a2a6af9099283bd99f61eeca021881d22efc2de release22-maint
+27058 8983158e9f11346ecefdd20ec15f7dc175c7aeb3 legacy-trunk
+27059 08057a987910b3f94a1a57b6b1941edb67f2f006 DS_RPC_BRANCH
+27060 a56f8c30af71c895adcc886a0f561aee827e5e04 DS_RPC_BRANCH
+27061 8b9d9130820ef7ed84d364c29820e16ab26a847b legacy-trunk
+27062 6266f1bd1ab93efdf168b44d28349b3a720c4f9d legacy-trunk
+27063 0199aa274c7bffde8634b7fcd9e6a1d1cd5f12cd legacy-trunk
+27064 cceaf78b85dc72e01c10efc3c5a4d76eebec0f9b DS_RPC_BRANCH
+27065 0f570be6736ebe2ef4cb6e59202888efafd092e5 DS_RPC_BRANCH
+27066 c0e8c07ae1d6cb55e18c2e939e6e2e83d1a69dda legacy-trunk
+27067 7718b274ad8b12cd02a0e48d399cea17dadbeeae legacy-trunk
+27068 18ddc02ce36f3582e920941a61ac2a0150e833f3 legacy-trunk
+27069 67b9f53a78014cadc5170c14d1cf1af6941e517e legacy-trunk
+27070 9a5c485796339ed6a0f0e739cecfbb9a7c330f4a legacy-trunk
+27071 d4f6e2adde4846c207e291a162d87304c83fec23 legacy-trunk
+27072 abe1bb76ee4474494b6609f0b2c14d72d14f2333 legacy-trunk
+27073 e4add7bb5f148db51cd70bcb3a1de9a46cc7ca89 legacy-trunk
+27074 f85f4531c3c16448926601727dbbddc8eff01024 legacy-trunk
+27075 e37f1c0f9a1e936fa7638ee701dfcff8e903f43b legacy-trunk
+27076 058bd2d50e3339f614de0c79ccbdf0319a0d1fac release22-maint
+27077 56a4d3a50b76b86dbd52d65ed15949198d5f7691 legacy-trunk
+27078 3b379ae3569d9310c4f35d13501eb98523e25df4 legacy-trunk
+27079 44b9977d48487deda552510249b6a16c0f6b1932 legacy-trunk
+27080 565032b48f509c53338eb292e51305b6a13d88b9 legacy-trunk
+27081 28b9971f068f7cd4b4c4d9483754c838dc985ab7 release22-maint
+27082 2b1219a72efca6ec766faf1787bb04c7f4e81897 release22-maint
+27083 969bd597f9238c79666eca2de6c305d25fecc49a legacy-trunk
+27084 c2733e8f6612b9b25ea8c746b076227ca1841171 legacy-trunk
+27085 fc5361e028f3d7d6f70e5e066485ced084f6d0c0 legacy-trunk
+27086 77154cef29d19f40f35c8a62d15291f502ad6497 legacy-trunk
+27087 444954c5434c1ef7d814f8f28faeb4a6a26fcda1 legacy-trunk
+27088 237cbd2a91e9bbfcb26e63154859b095005b92dd legacy-trunk
+27089 b062085c1ff2b80a6572b3531bbb677f3ee7f73b legacy-trunk
+27090 48e937e1b3fe3d10c26aa0d39519f336ce08e49b legacy-trunk
+27091 75c51999c8d54f95ad1b5880131e4bbdd86450f5 legacy-trunk
+27092 2f6f8708e3e945a71692bc9b76964e760c970f53 legacy-trunk
+27093 db239ec307e07471c2e8ba1f3002efe2e2708eed legacy-trunk
+27094 1235a95fedcd6caf2f4f94d66760cb1a1ceccb09 legacy-trunk
+27095 2cd6ed1c1b583ba27875098000a6bacfe8036097 legacy-trunk
+27096 9d11f51860dd3e1fd3f3ffc2bfd95c880fd8ede9 legacy-trunk
+27097 5562a499fb7f8451cfe9cdd155ff5c5af2d8ff30 legacy-trunk
+27098 5f85cae25e1855419f2eb3423e896fa40e820487 legacy-trunk
+27099 af8d40e4c377732071aa2869345770fd1e2494f4 legacy-trunk
+27100 e0a91c67388f4fd0aa50d762b566235483ad92af legacy-trunk
+27101 bd26c120591a578e9b140cb516bb26329ba9c424 legacy-trunk
+27102 7eaabe77d5cbd9f7fb3e6a30c438c6d2bbee9611 legacy-trunk
+27103 308122b6996e44dc18ee9583c54e47335a363f52 legacy-trunk
+27104 655f486284369cd4c83753291e25587da0d6689e legacy-trunk
+27105 1842db6a13948546c1d6abd4cdf3d9dd389f523e legacy-trunk
+27106 df1a275ff4f25b54a3542db935afdd94fbd30805 legacy-trunk
+27107 a68d2466d94bf5549208bfae4ddcf6f40903d5f8 legacy-trunk
+27108 27f48314ba9d0e1ec3364f64a11605a94528a810 legacy-trunk
+27109 a2136ae9d4f76e725090743233b722608da8c5ff legacy-trunk
+27110 6895200d62b19ce9d8b4c1fe37efbc68d133d7cb legacy-trunk
+27111 fe769b07150353fe21c47639e27c779b54408344 legacy-trunk
+27112 2e1def417ecb897c94ef76f118402f525648dd2e legacy-trunk
+27113 ea035490f6245c28914821dbc4391b4824d32d59 legacy-trunk
+27114 38832000f7e945be5c44a676604e507f664e250c legacy-trunk
+27115 43ddcdcd3c71fe4ef7412c6940d2e6c64b8d252d legacy-trunk
+27116 4d593254ba93925deedd00aace975614f9891630 legacy-trunk
+27117 2d67a0ba9020d28e892d8d65c3a4b23173e340e5 legacy-trunk
+27118 366877edd48763cca8a1746d533370d9231d4775 legacy-trunk
+27119 7bc48029eaa9cb3d90bbe827ddf7672e9b47ea41 legacy-trunk
+27120 a168b2f6d7daad6f5826ef9ee956379671890faf legacy-trunk
+27121 471a57bf2dae185d480ae3d8cba0496a31519d4e legacy-trunk
+27122 41097e92f560f99934bb2acfcd281648cb1f911e legacy-trunk
+27123 2c8ea7f9a3cedc37ff1a6539ffb5d39291c07a90 release22-maint
+27124 0279040ae03cba4d89be10ad5426365130f67718 legacy-trunk
+27125 8e5f267966200b03372273f79ca4cdb2720fe200 legacy-trunk
+27126 0771f9382d1e32de89560bfee52fb311e3fc482f legacy-trunk
+27127 c7e8078171591ccd7cebd7ef545e1e17f7a2be1f release22-maint
+27128 91317301dd098ca33b7f21021b75668f7511a39c legacy-trunk
+27129 e640d89b4907415a08408620ff322efdc2f9a846 legacy-trunk
+27130 94d0dc9d6e44ef107423be6b930ef8bed66a8074 legacy-trunk
+27131 badbc53344886122aa8982531dcbabee0a4ebe0e legacy-trunk
+27132 f16f6da4f5ffdb6d5ddc70a210dcd82966a0c64a legacy-trunk
+27133 d58fb544511888e6fb591863ec859e66667aa938 legacy-trunk
+27134 a7ceadb03edc9174544a592b561164f82681d275 legacy-trunk
+27135 1cbcddca33b0283c3846e802c39a3cbcbcbdecbd legacy-trunk
+27136 5fb08d832eac9c90837d4f23cf8fe9d5db721eed legacy-trunk
+27137 4680ef4fe90ad4533d34bb646074953e2a704996 legacy-trunk
+27138 35b6290855fc1e87438835fca91537aa903ba2dc release22-maint
+27139 f6b2719fbf119897ead25071cfdc2ad59d35a0a6 legacy-trunk
+27140 06dbd0898b39e243da31d47e71afd6f038d1f18f legacy-trunk
+27141 a5534fae5110168677229117003c1837c2da0b30 release22-maint
+27142 0c65f41fd9219ed8fd23bdc46b91c5d39b5f9f8e legacy-trunk
+27143 50063016d04699d1186fe28d17eca7c681e17c4d release22-maint
+27144 5f86c21bd9fc8905656a2a44f7b7bff449d32c0a release21-maint
+27145 71db428f6e08a459ae4c42b1e86e45bc9673a336 legacy-trunk
+27146 bec1b942e0bc3cd71e769a0172311f569230bbb8 legacy-trunk
+27147 245224d1b8c9201a2ae843ee1217e3be3e751644 legacy-trunk
+27148 55c9226699131341e27f48a4ee837b9fac511c70 legacy-trunk
+27149 c7cda63a007e44f616d05a4b096bdd637f8b59a8 legacy-trunk
+27150 730490ff25ea39bd65021a9e4ee0a883628ac7bd legacy-trunk
+27151 54f6f89139db53d918e5561c755973f2305a526c legacy-trunk
+27152 0dab8ba1d298079f9c0459e6e15ee5d6eb2c6c3b legacy-trunk
+27153 24b0f6d693e34b37c52df05908e2b7c5dd83d6ea legacy-trunk
+27154 7a32c2356e567cf899a2684623f54f00a5b21497 legacy-trunk
+27155 e0fbf9c4d46c2d2be8d78537dd2fb4eb77573aed release22-maint
+27156 9329770637a85852194f6eb694d14753902d2575 legacy-trunk
+27157 9da2d8c132090948358b863b5a0b7e3a310a0f7a release22-maint
+27158 c01c1b4a81716d1e237d410bc3be19968c4dc640 legacy-trunk
+27159 486f4045d13df60896aef9bc21d9616f35cfe947 legacy-trunk
+27160 cde6608739c42d45a1f6b08507f7557c489c4510 legacy-trunk
+27161 7dd432e1de2666402ef6b590ff320059e2ac6f20 legacy-trunk
+27162 7cdc531e6a504a09d7837f7fbbba53c290630eae legacy-trunk
+27163 1f1a6f7dd60014db06cd8baeed889e1479a3f952 legacy-trunk
+27164 80d450e552f699ce67a0f781e7ba1c78cf92608b legacy-trunk
+27165 fcc36ee1924b316da97646e8e9224734597e0cbf legacy-trunk
+27166 ba29485d0720beea8f01657e42a2d5e3cf2e8984 legacy-trunk
+27167 1da6d67f4a05c5e30f3f542f6bda52acd4615502 legacy-trunk
+27168 2ad13ee6d8505c2c2410086c196051f851883057 legacy-trunk
+27169 bf1555a927117db18d3ec6293da894afa8fc4617 legacy-trunk
+27170 b2b1f1ff5c71cda7c2df7458fc9df9feba6b5555 legacy-trunk
+27171 4ec58c270f3ec0c0c9eef8989513766631bd42ca release22-maint
+27172 7ead2d9df7f968cd54cccf6b1b70657a70473f44 release21-maint
+27173 0b12afc4012a806cba45e63544b0b795ac877d73 legacy-trunk
+27174 0601ecc7f4bf739dd3978217c2c3f3470ce077cf legacy-trunk
+27175 c74d86dc401774dc98ee40514fc6ced67982deab legacy-trunk
+27176 cc65b5bcfc38369b8d9b6576a479af61c169657c legacy-trunk
+27177 79dcd57f272dec49333356c9045c764f96766206 release21-maint
+27177 bb5b370492d6a3769e7e3aa50bf45706c2d342fa release22-maint
+27178 01e4b698ff7efe0b1f3297a1b69cb7ddb24ac6a9 legacy-trunk
+27179 e3e019bc4e1ece4145ee175751cd6c6b84701c55 legacy-trunk
+27180 89a7fa918c3b7f689af434bf578b36f367ba4f9c legacy-trunk
+27181 f6c26d083bf6c8df30893ee6dabf4fc986186f5a legacy-trunk
+27182 c7d7d2319b3a1c7bb53b1def1a687c1730b81d33 legacy-trunk
+27183 203d1412a7e826d3c042962ef5fb2519f51f36cc legacy-trunk
+27184 e4d557d46b96fd65422dbe37665a473df7303ad4 legacy-trunk
+27185 2d97bc2ba50d278d0beb62f63df43ed0666b75b0 legacy-trunk
+27186 8a0a14e3725e3763f1567776faa0b971e1df2920 legacy-trunk
+27187 43d658dc8dd36e44736d3b516bcecc93fdef3128 legacy-trunk
+27188 130fff486fa64ef82006d27055d24761e4503b85 legacy-trunk
+27189 3126c42629629b795ac3dc04c647c17ae37097e6 legacy-trunk
+27190 99d22723252f5908995dd86a36576b275280bee0 legacy-trunk
+27191 c48bf5df614ac04a7d255687a9b0d7550865221a legacy-trunk
+27192 8ff691dc7f291ddd0c7b52687adbb58ffa17dc86 legacy-trunk
+27193 9f0009ca97b9a5c2d7c87ed8da8d3c05112cefc0 legacy-trunk
+27194 abcfa49952c432627e6d114c6f00c8f818dcded3 legacy-trunk
+27195 d5e88c0c9e09ee55ab38159003e33da9ea21f899 release22-maint
+27196 41c4ddab36f2e21e2c1374218e2ae0ddf6a51668 release21-maint
+27197 e4272ad1a63694a20d1b1532cebe449af773f380 legacy-trunk
+27198 ade1d56109a82f950b598920301d76a32b3bdc90 legacy-trunk
+27199 f7306ae8662db58820cfedb28465f9d497eadb51 legacy-trunk
+27200 ed1ba37a46b73f0c5b271245554c2dc7be47a32f legacy-trunk
+27201 9f0ad0eb61f086ccd7a7f2a662ebe08d343f4079 legacy-trunk
+27202 8ae26d9be1b4fc13f4df5911bc14a8c59d5c1aae legacy-trunk
+27203 1cf1f9812219798943314f13af25a0083bfba5a0 legacy-trunk
+27204 065a7f23be2fd44ac7ab09e6e3c7547f85549487 legacy-trunk
+27205 359a57e96d5eb63bdc577e22e8d670a3703ad1bc legacy-trunk
+27206 95263ccec819ccc52fc1deb58248ca368fdc5cc2 legacy-trunk
+27207 c8815bd01ff578e59a565462ba0d55aa0929210a legacy-trunk
+27208 903112c1c8876088b97ff117793623af4ad4f14b release22-maint
+27209 3f196b4dc4c106ec3668b7f69ebfa9127b2cf12b release22-maint
+27210 6c619c161b87f8dfd8112656b0760f72d6096d1e legacy-trunk
+27211 85a4e727b16ba1e73aca4d5b128b1d3b19e5cbfa legacy-trunk
+27212 bd37eb4daf3b674828d60c49ca487e9d219f0717 legacy-trunk
+27213 b481ba967ad83710d369aaa596f143e50929cd70 legacy-trunk
+27214 beb699e10b29ce224e010e598940ec82982b06d8 legacy-trunk
+27215 f6c2c089fdf2ae03e379b699c46323dc313e87c6 legacy-trunk
+27216 7252b867d81e28efcf629e109a496fce48e8a4d5 legacy-trunk
+27217 c9c8f523ff1b5667ffddd6c2818f936ccecfd686 release22-maint
+27218 854583cd63c7ce573b7b87292d0be40caad419fd legacy-trunk
+27219 d6ae544acd24a1f72ce00534fed464fde91ee504 legacy-trunk
+27220 46275f9e740710d9b0e5a0af264bd42d96717b77 legacy-trunk
+27221 8a476924ecfea194f47c0c2660cd06db1d80a35a legacy-trunk
+27222 8bc4e5ba1f6517a7887e892a8bc72f3155a80261 release22-maint
+27223 2b071337205c01c2685b1bbf22aff3a5f054f52d legacy-trunk
+27224 868cfbdca909699b0c569300a1e0274d275a8dae legacy-trunk
+27225 5027e7c12a16003a06fb03a0a441ffcbed8dc951 release22-maint
+27226 5986dbd0094fc3b3f43241e01a9e8bcccabedbaf legacy-trunk
+27227 6d008a4e263335eff7ee36d7514b47e9d0ae2caf release22-maint
+27228 63ee31bb25f3256029377f6b740367c8a8e052d7 legacy-trunk
+27229 d7b307c379c8dc1dd5d036ffc479da7343b99370 legacy-trunk
+27230 b79d43305c72d9473f58536cea1931ff93a73e64 legacy-trunk
+27231 dfa68668d00ecdb56afbfdbe45d86c536305b675 legacy-trunk
+27232 6c1a0dc851b6c1cc395c86f17af6729ae18c236d legacy-trunk
+27233 1a76e3c4508f36353b2e3db65ce2fe7d6fccbb43 legacy-trunk
+27234 487a6b99f7811b0e8106c03ddf21e1a4eb37d2f4 release22-maint
+27235 45d6769338828f7f1bda308e17ae417586c23ef2 legacy-trunk
+27236 8e6760bf1884e7cb40087a1bf6e493544db5b512 legacy-trunk
+27237 8ad81b3795520058ae1c7843f01030d62ef52aa7 legacy-trunk
+27238 63d1e3263f4562f39545926136416be1424f94ea legacy-trunk
+27239 95e7bbbd0954945eda987ce701ea3736515e4179 legacy-trunk
+27240 c02d1c9a662e665a407d50994a444f221431533a legacy-trunk
+27241 4588b6820a11e54bbd409fbefcc57190ba5bc542 legacy-trunk
+27242 15ab29393779f19aa83a2abf4c9df3b7b75011d6 legacy-trunk
+27243 5afd14a2a8bc6c87601481a652d881f916ce479d legacy-trunk
+27244 832f0501148bb78ecf2ee43e29d3b2695c4ed17f legacy-trunk
+27245 0499df5884d2f54ffc43f04f6731e466726851d8 legacy-trunk
+27246 4f6d31dacd5e67e49c52c57739be2cd00ef89314 legacy-trunk
+27247 08475c87d24f50d27b843e12e8e107659fd777cc legacy-trunk
+27248 bbaeaf2719c4bbe6562e87ce0a0ce9186576a7bb legacy-trunk
+27249 8b7d87ea4894e1d60960bb086fd2853b7f76aad6 legacy-trunk
+27250 3dba866e862e9ffa61ba451b4b6f971d50300236 legacy-trunk
+27251 000ab584e77a61b4288aeb1b63bcd0e75cca57f0 legacy-trunk
+27252 ea7e717dee2723b416499760d55547f098086022 legacy-trunk
+27253 4c67dd42a1d9ea38c599c97348feccccc7d41bd9 release22-maint
+27254 ab5355d873dd587c1bee4700dd203f3e8aad7cc9 release21-maint
+27255 1cef61d59478671e05bb3254a16d8cb2e62e5cfc release22-maint
+27256 7b66f0034233a766741c336e49601bf3b67dbc12 legacy-trunk
+27257 41ab532d4f601cca44cc6995b0037b5a9b38dce1 legacy-trunk
+27258 c145fddea34084ff63a190ba361234fc0080f37e release22-maint
+27259 ea9d333f9034e1d5237462bb830032883feeae40 legacy-trunk
+27260 a44f3877a386bf2738754e19c53178bdd880d477 legacy-trunk
+27261 83e458a63c3fbac4376e42d94b22dd6381333fd0 release22-maint
+27262 324c72675c8d04b4b2253c0ca428b68d44db2efc release21-maint
+27263 02c5045d5b4e0a327f8fe8892770b86eca832481 legacy-trunk
+27264 ad1d862fb63264df0a3f822cc486a8564e117947 legacy-trunk
+27265 8305a19584bc88ae16e68a8ecf55ead120666028 legacy-trunk
+27266 f5030a29935dcab3a32cda0a86b1010aff8ea761 release22-maint
+27267 285702f0824a637e73c8e5f1ba5f4bafc4252d12 release21-maint
+27268 0899409a0cb6d1e1e3a8636987cc39c6fea56429 legacy-trunk
+27269 01cdd38d35fa0d0c20b1e3f33fa9f1a38addd573 release22-maint
+27270 a07bc303a60d8ae3b74e595c160c3c88faf55168 release21-maint
+27271 066f8938071a55088ddf7dfccb692281afbc3a90 legacy-trunk
+27272 4f0606ceeef8c94394eb2bcf293e1de505e35702 release22-maint
+27273 e8bae253784b3edcbce13264274cbe473722b77d legacy-trunk
+27274 9ce71b1cc17f718e9cb9250cb20df27c1ed3ea71 release21-maint
+27275 73cf4d847570ecaab5485243da87bea41591097c legacy-trunk
+27276 92f289c2f7c63d977b15919e8b38dafe49d359bb legacy-trunk
+27277 b16d4be6a232ee181118475e30d0ab91e4e451ab legacy-trunk
+27278 921064c26297b25eb23ba96d4cc1beb1743a58cf legacy-trunk
+27279 6893ceec8610e9c54843461d4938d795f2fa4ba7 legacy-trunk
+27280 075f755a65da16bdefff370900a83922a0541634 legacy-trunk
+27281 1298e97fb343adb16b2dd1edbd3c46ce6c75dba1 legacy-trunk
+27282 7e3eac5d329979cd9620f8e0b1fe34a5847ca0de legacy-trunk
+27283 620b699685ff0428d29560c9979ac32d3e3dfa1d release22-maint
+27284 ff0cd6878bdde5fbf236575711a085d34b57076f release21-maint
+27285 ce163f340cdff5c3622f96228eb81be3142a6e90 legacy-trunk
+27286 0bcef3ca21c06a372387d1918e9758ed7a39c717 legacy-trunk
+27287 5f69d6f17aa31092d7077af2f8cdb8758c2a30c7 release22-maint
+27288 815d02800d980bf02120844955ffd0828145c8f6 release21-maint
+27289 bae996bb7d82ce2dee9241771f4a2ae5cc259766 legacy-trunk
+27290 37560f434f6a2beae0da6d2a75cb141c187cdf6f release22-maint
+27291 12f49fa8f47f2aba2466bf204c1c419e18eb07f3 release21-maint
+27292 9211bc7249a07eb3442d4ccd052263ae59570516 legacy-trunk
+27293 fba7d1035fed5efc1aa40331a10c47b5c3fce488 release22-maint
+27294 5586f208581586b5f91b8d9307c3443eeebb7342 release21-maint
+27295 970aa97128131ae4977e79927061d04d8e292aba legacy-trunk
+27296 7dfe48c7aa65e0c6cecd15e981afc0aa84b086a7 legacy-trunk
+27297 26ba17b758b9edd99bbdcce9458655596f5da47f legacy-trunk
+27298 8eb2f31eea9eb3eae2aa2c64386f289c041a05b3 legacy-trunk
+27299 e558a40b6b52311610d8b091e4f38c08b2aa31ba legacy-trunk
+27300 eab8eca9ec51d2b92f729da23a503fd298dca4e8 legacy-trunk
+27301 5a2302f797249e9a166c0691089b9ad45b95a955 legacy-trunk
+27302 3042dad149ae73e73cd2c549257b189f0eff40ab release22-maint
+27303 b5bde77da20e07cf917da8ffcb282b8219086216 legacy-trunk
+27304 d3b5fafecb29df8fae1f6c6692b1b79fbdf1c0dc legacy-trunk
+27305 3500da666c0c3d696e1779e8d31aebb41efacbca legacy-trunk
+27306 d62e684542b9bbf5366cebed3dac311ea7ec9b0a legacy-trunk
+27307 84f092b106efb90fda60291116d66180325a7d01 legacy-trunk
+27308 83354c2ca3903d16b4159d8d3eb20853fbc9c5b1 legacy-trunk
+27309 a60a3d9c6fd9a6e863a838e32081bce0573c22d6 legacy-trunk
+27310 6e2a3c5700ac9c7a11dba675b4056df3866494ef legacy-trunk
+27311 de625517ade802d4d33f84f8cbd7d58118bd55be release22-maint
+27312 aea8fb3e3f3d7db835de7a31388888e9ec37a27c release21-maint
+27313 85e1204b66171bcf7a982a0c0d70de11bb4db133 legacy-trunk
+27314 652f1b318e5a081e7d5cd1462839ede3364c730b release22-maint
+27315 37118b6e5f46124ca4460b72b02517b60be59739 legacy-trunk
+27316 83aa99deda74de158b5d992405729089120e66b7 legacy-trunk
+27317 ed62c04b19f520e359b6815c0e3bfdb22f97de8a release22-maint
+27318 f7ce696979e18b011a7e407795f1d98aa2324c43 legacy-trunk
+27319 d4bd6601701d35dc979fd7a995685e9f7f7481cb legacy-trunk
+27321 3834cb0e7be65c5ccc850309d16eba5649d617bc legacy-trunk
+27322 cb08ca57e2a96628871807ddea24f44ba3b51392 legacy-trunk
+27323 11a6d9b5f9906596a11a8e3a2ae9282818eaec16 legacy-trunk
+27324 aa238770d808f53eee661ef58fd3353f9fa7b63b legacy-trunk
+27325 1a2b5344d1ccf3e6148d061e9964ed08b73870ba release22-maint
+27326 03bba7282852cbd2ac4a1c8d8463dbb4073fbcfb legacy-trunk
+27327 3138167201aacd78cc3ee2f5699057dbb415620e legacy-trunk
+27328 4eed51ad493d4ef3a5f3c91e438f0d23c1099284 release22-maint
+27329 096b475e1bef025837390cc59f8f8f44c22e8753 legacy-trunk
+27330 7d8c6b889b54e301ddfa8c60742f446345485d26 legacy-trunk
+27331 111c1e59ad72ea0265153b022421beadcd27200a legacy-trunk
+27332 f5405c6ec4acd369d3e29366fe1a09359877fe54 legacy-trunk
+27333 f7e191c8db23f3266fa0591c11300ee37a14c587 legacy-trunk
+27334 1fe005c4283687bc5a5d61e163c24586ea8c9b24 release22-maint
+27335 25b0af27ddc8572d1001ce6d0055fc025c1eabd1 release21-maint
+27336 1a8096bb4c48280c48c242f8a036bd955815703d legacy-trunk
+27337 e2fa741c547f51510daf6d57aa487dc05ca952cc release22-maint
+27338 edd7c0146ac824f5b4e4c9cc55f2adb93d3afbe9 legacy-trunk
+27339 a72997f7db4c7018f5b9544d70761c5f388aa089 legacy-trunk
+27340 7ebd2cd3aef01b7396b813638ffc90897e6ff069 legacy-trunk
+27341 8149d978b006f770a91a7998696b6041effd242f legacy-trunk
+27342 fe9c7132a867e8e7a2a854462dd899bbe03a589c legacy-trunk
+27343 c69dc43b700a97f95f85fc505a12b426cbe83943 legacy-trunk
+27344 481e4a4b8de069c157d0d739cc6ade4c0affe4a5 release22-maint
+27345 3600d8d07358329d77ee46e9cfff142dfcd1ecf2 legacy-trunk
+27346 a7b169ef83eacc1cf83222a80b930cd6192e2fff legacy-trunk
+27347 26a0d0da1312c3c0cfc6680f22daee8fb94c1af2 release22-maint
+27348 0825bd7b5b558e01e9a444a0e3b48d8cd401482b legacy-trunk
+27349 35c9894f06b960ce105c3629ac7d2e7f94a1a9aa legacy-trunk
+27350 32463e8e5e1ae6cd9834c1167c577937f5785fe1 release22-maint
+27351 a181ccca1312832dc2b3a032eecff2ec9a5b341c release22-maint
+27352 d7a62042e7efa5950d0f5b2576ef904afa8bdb09 legacy-trunk
+27353 212ee6365bff983d91d8519842e34cc620863d66 release22-maint
+27354 7d8a150496a8f06d06a3702588ed2962f8ec3286 release22-maint
+27355 d7f8512da4236c9fc1d59730fa6c917611d60f25 legacy-trunk
+27356 a56292732566dd47824a0ea2a7b2fbda9b1c5e08 legacy-trunk
+27357 8863076e2df9307778625c4d99d9256ec2ed158b legacy-trunk
+27358 33ea522dd3d22ea9913ce27fcdff04705b557019 legacy-trunk
+27359 b771857ed7888de33b968abeaa38738bd9ae6ead release22-maint
+27360 4ab9df2416f936dc2af37fb0471e343013c23998 legacy-trunk
+27361 95da99187c575420937d7e5f2114a5069ad46d34 legacy-trunk
+27362 ad6fa1c04e4747708ddab223e5f2ace7ebe01879 legacy-trunk
+27363 48ad470c1f8e16a42ad19395a286bfdd1dce2deb legacy-trunk
+27364 41468f9353ce9a893333c17203286155f0464b4b legacy-trunk
+27365 703e63ae0f01fc4df00cebc248d82642bb439301 legacy-trunk
+27366 1f6510051c8ae862d92a4e4a27fe2823d7bd5331 legacy-trunk
+27367 dab8701bd3fa24b415e8c3cfcf1a503a8ececaf7 legacy-trunk
+27368 4e63e9771f30c509849616d8ee79dfb2f7a51656 legacy-trunk
+27369 b8875f16a4be545f2b79044ff4817207b50ee129 release22-maint
+27370 45b9e122c33a7a1edf1822a37db3ed6edfe28f47 legacy-trunk
+27371 b71e0f96de23357af320833f2abae07a10fb80e0 legacy-trunk
+27372 ea18778df6c37008c219ad692bb3e52c86a7cacc legacy-trunk
+27373 14e2eb9e5ef2bea60abd8b149a5fc31c94d4c46f legacy-trunk
+27374 19a609517ab8a6bf52b3c9e43f9358c8074b2faa legacy-trunk
+27375 14d8ee1e8de5ccd14c510802474f0fa64bb6c18a legacy-trunk
+27376 00e578f78caaa2a8763ed0c527e583f32df48085 legacy-trunk
+27377 44f7fc30767368384048e207559d98e4ec53e7d0 legacy-trunk
+27378 c882904607919ca31da74dab1c7395909de73a74 legacy-trunk
+27379 dc872a2f513b4421ac0e94cf139de49318cf9103 legacy-trunk
+27380 9d89a9a054e0409ef137e5ef2586a56b47e695bb legacy-trunk
+27381 e8a263db1be033ab59cbf4ff338991c1698d3b76 legacy-trunk
+27382 71f13cf4f9e2d932b5d98904f467b6b8140653f4 legacy-trunk
+27383 2e5a1e8c0b481d64a38ffde5def5b7c0590ec4a9 legacy-trunk
+27384 edf950bf423258c6fa626439ce4f487134f4db3c legacy-trunk
+27385 58433b66f58389806d7177859f90b5ea983db546 legacy-trunk
+27386 7f83b2124b4ed3936ece995b3b86f7f76edea51e legacy-trunk
+27387 d8de9b5f561eee8ef2446561465a4a4723da4a2e release22-maint
+27388 3848aa3edafc6c7734799b770868b5bc2c70c202 legacy-trunk
+27388 74d5cd698bbf71cd9b4b96419d90c0908835c4ad release22-maint
+27389 fcf2e01c616a604eaf0f535a5e88fe27430b8cfd legacy-trunk
+27390 913570ab0737433779362e816238d3a74ba74e53 legacy-trunk
+27391 9a9d6ce5ed4e225fc5cf3f76fa0f3971d3b5ea6c legacy-trunk
+27392 bbfef948c43e80041c51fff88c3ab72ddc18e2b5 release22-maint
+27393 74368987f7f0a03de1945e8f7cdbfb1b05bc7e46 legacy-trunk
+27394 bbcee7478fcb84048975dd44a1a798f1a744e3b2 legacy-trunk
+27395 34b8cdbbd8fe3394e54eb587c8faaebcb8ee64c0 legacy-trunk
+27396 9b6d259c25eb7ea601ee4fcb91a6dd5ccb1d0b52 legacy-trunk
+27397 5b508ce049f5d085b3619de65cba783a1bd015e2 legacy-trunk
+27398 c4d68f82a6ddb8168b890e33c730b805d507c6eb legacy-trunk
+27399 d10f1c6d9ee943068295e01a5f500a20591a1865 legacy-trunk
+27400 c10c09192c12bca1e1c908531ebf6489444a694e legacy-trunk
+27401 07e74993573c5b5ed5ca65cae2adcd16e93edff6 legacy-trunk
+27402 275d04a35542264bd22b3cd85acd68d20cfb0088 legacy-trunk
+27403 77a96ac4dde4c0805aa616fa9bd713310276870e legacy-trunk
+27404 eae496efa460132746c513e1d8ac265196f1bdbb legacy-trunk
+27405 2c2245aacef88fc85e95d0a498e191826f64106c legacy-trunk
+27406 9377158652dd0d4b86a1ec2b2fc0b51ad50f8f4f legacy-trunk
+27407 a3d6128afb2e5531c92d0150763f6dd7c3298759 legacy-trunk
+27408 a78d41ee9474f76174a1cc2c145e250296db332e legacy-trunk
+27409 af0532f23ab3ffff9e7004176ad539eb0b7ae45c legacy-trunk
+27410 63fbbed10714aa54680db8f6565bf05d434f7e36 legacy-trunk
+27411 fef397b1b85c3d89f7ad4cce2d6160b5ace9ae9b legacy-trunk
+27412 90cca857d20322a1b27e7fa9e68a2b4d612b9167 legacy-trunk
+27413 4046282cb338cf7e536aa1246bfcf25368f0d939 legacy-trunk
+27414 8ea86564fb326439feef6c0a79ba93ef6d445747 legacy-trunk
+27415 bc6aae74ddfe5c40b3e753661e934f14e67ebda8 legacy-trunk
+27416 2c79b1a8d616539151f6ff9ea8232f95bbc9700c legacy-trunk
+27417 d93f342015038a798f67958d3dab0775e2ea8c92 legacy-trunk
+27418 71840a1bd82fc7c4647b43b11b426819a3e2dc3e legacy-trunk
+27419 a922112d780c5897ff44570c834a04f98c8762a7 legacy-trunk
+27420 cb16995aa7e809ee24e73fadf6dde44733cbd261 legacy-trunk
+27421 9913cf7c40861ff4944c98cfefca2c248c8d8f8f legacy-trunk
+27422 67f2b40bab7070a2da055c01eb3cfe5e6ebacecc legacy-trunk
+27423 e9a6a0c4b33f3c8dfdde17ff14e9a2a0df080a6f legacy-trunk
+27424 dcc2b75d7a78c0f4d041b9d3236d60bceaa68351 legacy-trunk
+27425 1871733524354965cfe9b2de7cd69f361d5058b6 release22-maint
+27426 37ffce2d9c3ce0536f0f59b94ba6912bfa6f3afb legacy-trunk
+27427 d24c8c946741bfb797331c91677aa0fe121a3937 legacy-trunk
+27428 dd9d2ec96ead0ce724a358ff666be8861fe07513 release22-maint
+27429 b9e0c5753238084b65cb81eec26135cefad8ee00 legacy-trunk
+27430 3e863a65b1a442cdc46b36146b014e99b33b86e4 release22-maint
+27431 e8789751a5ccc3665148bf1b993e0729117133fc legacy-trunk
+27432 92834a248c15cbf7ef3fc14d8418b8a8032ae48e legacy-trunk
+27433 60e41a54e7b109b20bf0130395e09aa93132727c legacy-trunk
+27434 2c6f931d8dd25141bba60e7b43679fcc38b7c9fa legacy-trunk
+27435 c79432feb862154aa86ff78280f474bed61f19cc legacy-trunk
+27436 5af9081a6cd409e4aeb108a311f2babc6d300385 legacy-trunk
+27437 0d9716c3b8ecf35c9924ffe30484a366f2c6e0af legacy-trunk
+27438 b128255c2bea7077db3289eda28e44493a845068 legacy-trunk
+27439 8142f8d668a0f4ab7aafee90bec9bbb31727ce07 legacy-trunk
+27440 86b3760d285d60f6dc9226da7c8dbe27f5ef03c6 legacy-trunk
+27441 1314642ca0976bbf0ebc563bbca846cf52a89a85 release22-maint
+27442 a1805a54666fbbfd91a0c6f328b58e2132df0772 legacy-trunk
+27443 32db075def3f564b5b6b1d0127ad4c5d5021f83a legacy-trunk
+27444 95ccd5bbdc86d4f25cd8f9e9d496b3874f054967 legacy-trunk
+27445 a5162fd65c3d5bb0d9862b833959f4aa9b662413 legacy-trunk
+27446 702a5900df7d65f9d4068b2510089875c68c6963 legacy-trunk
+27447 183eba2d22140c1e1eba5c63c1e2dfdb6e597a44 legacy-trunk
+27448 15447a5573bd11489273e5141e300de23002141c legacy-trunk
+27449 800912f7df2e392a048d16fbbd9dca32254c87bf legacy-trunk
+27450 e66ced481c77a4bcb25549d9e309aae85ec2b00b legacy-trunk
+27451 d7126c34128a9d9bd13366f09160fb84f19ef57e release22-maint
+27452 6fed13422bb1aafd1239619cfc35e1f73b1ef1b5 legacy-trunk
+27453 22d2f037af9d3c4ceb43c6ec534fd50bb2fc52fd legacy-trunk
+27454 86dfb96a1831fd27eaa3a0c3345d2f0cf1529cc0 legacy-trunk
+27455 355e46cc124ff1116e45cf033e2f14bcea809493 release21-maint
+27456 b74d4a59793aad447b515c21c9d7096eb70db253 legacy-trunk
+27457 b185c85952fe838d709a3605cb7d6bf2af3b8c0b legacy-trunk
+27458 bc00eeef0ac7bacc04301536a02ecbc7671860ee legacy-trunk
+27459 4298e269bd672010438ca3cf8955c227a9d681ba legacy-trunk
+27460 4026565fa7ebdff190b2c529181e55e889803f04 release22-maint
+27461 a2b677af7b289d65a0c1150912884b764736dcef release21-maint
+27462 68995e854a88e3d5d7f7bda777643e17060df8b3 legacy-trunk
+27463 dbb14f85ae7b60dd328ff1a6e3a4da89b3777c92 legacy-trunk
+27464 2a20574400afb60880a45a98c862a8c46a3f507c legacy-trunk
+27465 f7abbd15b4f4819b17d0c84b2200779ac9057b00 legacy-trunk
+27466 cfcfb5df6e61cc4b50fe3c52b075849d8664bb8e legacy-trunk
+27467 51481b39cd865c1e7ee4b321ea8028fb69543aea legacy-trunk
+27468 0a18ef5cb3e7ed77198c730f2e9f40c26362cf08 release22-maint
+27469 f8d41e2649b7e5de77b66912717eb68882dedd75 legacy-trunk
+27470 28f2bae1031bf3f08556a39e28f710921e9f8fbc release22-maint
+27471 46a84d2ff4e2ac7a028dc4c31df1a43822affc10 legacy-trunk
+27472 6676623b3b7421916e79549fe74bd433a0a870c1 legacy-trunk
+27473 8ceee6630322c57545436c376b0610f4a85fc36e legacy-trunk
+27474 f7c0d6871b07f0311fd6969640a93200a815de17 legacy-trunk
+27475 7336f51faa46cb7e1b5220343a955e428097df52 legacy-trunk
+27476 6cd932ff0f09d8cfe73d6dd0f15b738f99812884 legacy-trunk
+27477 80162dbd47f0132fa59c8fdf20c6cab3deb6e849 legacy-trunk
+27478 805c228cf77b6fff920b987a4e645322876b47c4 legacy-trunk
+27479 34d7137098a7519478581e4c1b058d2ce12961f3 legacy-trunk
+27480 cbdbb92efd369f8497ea8a823412fd9b615e87b0 legacy-trunk
+27481 f35e29aa0d924c4245be41b15cad2239d328767f legacy-trunk
+27482 ff6873d28a14683e5c0fb8467c96690cf87b181e legacy-trunk
+27483 fa6be9ee6c9c4eb7fdb395ec4221c22d68d6ffa1 legacy-trunk
+27484 13240b8f8ca0141a2eafd890262f77577b8ebf97 legacy-trunk
+27485 1e0acb45ca8f0fce1c5f65ad21ea5bd20fd0c3ef legacy-trunk
+27486 f36fa10ebfa0c26057ece3f7e71298ace02fb536 legacy-trunk
+27487 f33bb9c131f8cce5644849de15d0d016bb7ace0f legacy-trunk
+27488 b51a578f5769b5f1999998acf501b61d2c975f21 legacy-trunk
+27489 bf3421a287446cd21682982f3bf27b0c6065ee65 legacy-trunk
+27490 d332484e394a80b46f0ff0f64b50b7c64a061151 legacy-trunk
+27491 aa6217bf977643ac478dd108ce1a830e443152f6 legacy-trunk
+27492 5da605d2b5477a411974fee26d840ddbdaaabfac legacy-trunk
+27493 f38112b88388e78fb38b68d94dbd94ed9d8f3abf legacy-trunk
+27494 7dcef2f87068226dc7dba9b2cbdaa0c2894191a6 ast-branch
+27495 e33393ce4c513ad7c2ec0745afba1428fae4c191 ast-branch
+27496 30c7cc5f25873ef873baff0a09c562794aa511a2 ast-branch
+27497 33f21eabc15506dd5bd91b60157ab76505f46707 ast-branch
+27498 c96e58438a9f165338f72d4f2dd6deb6600af0d7 ast-branch
+27499 f74f3c3190993da2496f64ca214cd89a3c0ec4b0 ast-branch
+27500 c42636306e96b6d087d0698cf5e9239b92d93d7c ast-branch
+27501 2a6ec992228ba7a35f04f214fdf25fe0efd3628e ast-branch
+27502 844f129fa1285285577ce455903911d8d046b5c0 ast-branch
+27503 fdf80e04e4bbd12a1c16b33db077393251af989e legacy-trunk
+27504 311375464fac332acc32247c8f0184744686b021 ast-branch
+27505 9e63b0f409d4b36067b7c361756e31fd6fa412ef legacy-trunk
+27506 76e9a14fb7c5a0af3b9679fe88f4eb23770ddcd5 legacy-trunk
+27507 399b09a27af314b470b3163795f29bb3e9fe673b legacy-trunk
+27508 707c6f026142a40d6b5d86d16d2fd94a099e9ac7 legacy-trunk
+27509 e5ecef5a123ad890f351216ac72fac7f542811a3 legacy-trunk
+27510 12f2be85da259a5263019b94f3ea4f17f5cc42ed legacy-trunk
+27511 8dfacb06c3d1a4f102ab1c68220bf5f1069e99fb legacy-trunk
+27512 865a77ce40a9f863d74432b6a019913d3ec5f13e legacy-trunk
+27513 7c1a76b7871222c2a19bd2ae8841b08ff42eed7a legacy-trunk
+27514 a483c5ddb7f1b5e7110fbd9b0ef19476241e3f5c release22-maint
+27515 176ad706afbc56bb737d3732e1ef24aaaa4266d5 legacy-trunk
+27516 c36be79fdbea171603c4519a791f96a60cdee0f3 release22-maint
+27517 abedc5cecc649d73c94fd1018b09034686c0ec45 release22-maint
+27518 39c0bf201db9c431ea9d8423ba7766809ea18b24 legacy-trunk
+27519 40bda3e090f67ba684b3f6f76d43650a232c1077 legacy-trunk
+27520 21bd86e00bcec1b3346358053b1492ab1b90de50 release22-maint
+27521 e9e6111beec1719e8fdd594d4e1231318499b4ac legacy-trunk
+27522 d7d816e1f52264aa84982b11f3a183040e50919a legacy-trunk
+27523 7189091217371bf4bd788222c9edba3456e786b3 release22-maint
+27524 69fd82658bfb3274819567364ae6c01efc1148bf legacy-trunk
+27525 be02d514b9a6696c20c7bfb3e17c9e15a86491d2 legacy-trunk
+27526 481080f71439ab32becb906ba0b8cf0d0e9efd12 legacy-trunk
+27527 7bcd8177628f35aa6a3968a83d0186c69923191b legacy-trunk
+27528 ea03843754c0024e743ed92528406677e273bf87 legacy-trunk
+27529 562d7f8a82a19bb32e1da83f14432550c4cba2d0 legacy-trunk
+27530 bb7c396de3aba780a10a23968db57636d34ab085 legacy-trunk
+27531 a59df2fa4ec8aff466839038a657298e7d320c5c legacy-trunk
+27532 208fb1d611484e711c04ff25c7dfa000af410987 legacy-trunk
+27533 9456a2ccda610a1da4dcefda4729762f7af5fdad legacy-trunk
+27534 44c19699fa7ef9dd3f3292c9d68d092407245992 legacy-trunk
+27535 9dded6f188191d08744432d4d84348b2c7b4cfdb legacy-trunk
+27536 233a50e10e66ba4cf035dfdf7962e8320ba1cb45 release22-maint
+27537 cb728141ae12a253cd6e5b413c510f1dc50c4dab legacy-trunk
+27538 637dfcd963b9832a4b851dd78050d66235477a11 ast-branch
+27539 d4d5c340e054382b078ed28be7003f372bb84372 ast-branch
+27540 22b212dd86c1da3c5dbd668fdbaf1590aa11925c ast-branch
+27541 fd17394f6dcee1b8f2780e0440a5645c60a068f4 legacy-trunk
+27542 e685f32d80688d18a9ad3c30ea9368ba40258543 legacy-trunk
+27544 8ee2ab4f2a2d498e2a207be48621935dad45eea0 legacy-trunk
+27545 a387d4e539c2d82e7dbae3ba795bd402ddb9fe74 legacy-trunk
+27546 78ab086a354846fca88547d86be9d657664a7289 legacy-trunk
+27547 095426af4a4240664692235272f3fa0d80a9a826 legacy-trunk
+27548 80da951c89fbe141e174201935210279cada36b6 legacy-trunk
+27549 d3e490a51408b88fb889a45f3da3ca40897fb7d6 legacy-trunk
+27550 fdd836575248f869df83c38bcdcab35c20d1e3cd legacy-trunk
+27551 c31afea88934e0646821392bd267b2d515cde283 legacy-trunk
+27552 0cab4e4fdcf380c61a1d992d4d07ba4f70e12b35 legacy-trunk
+27553 5e4b8d1e9fd6b2b97d0be40f573433a3af6b6f36 legacy-trunk
+27554 371954785739f57463d863c7f998b8549c0fd0b2 legacy-trunk
+27555 2abf9e940274f08fc45ea8e11ae6d1f329c2fddf legacy-trunk
+27556 43fbc67374a57b6ef6603747e5ba7a4ddf2f03b2 release22-maint
+27557 25fe3a0a80fb86238cadac702985e227ece8a81f legacy-trunk
+27558 98ad772defaabbc206c38eb9d6b8aff06f3b4b4e release22-maint
+27559 a038abd08e4ab52b0bb4b2ab0c864f5a48b5ab54 legacy-trunk
+27560 c89d333fe0fe346716575d80a472292c3b65df6a legacy-trunk
+27561 b993e651eb745f7846a02bc278054f075e9c52e0 legacy-trunk
+27562 cb73e891d3ee3f60b2956a90bb9e10d08d3f0046 legacy-trunk
+27563 63a887d8a1e3a5193a27f973210276584ce4d5b9 legacy-trunk
+27564 5c151d958fc1442113c521d224d6a6d3ab3060ca legacy-trunk
+27565 1723bcdc1e854e891b79d571515757dd510a4bf0 legacy-trunk
+27566 c4dcb80f48ea158ee05544a49174576f9f67913f legacy-trunk
+27567 a33f2dd46444b67d09cad5216a1bb8a48b6b7e66 legacy-trunk
+27568 bec5b66106229c70a895069fa34d816670226cf7 release22-maint
+27569 982a90a4d67b83e38ba2bce377348275dcaff6ab legacy-trunk
+27570 dc20c7eb434f521ae67ac9fd8bbb9f7727724c5e release22-maint
+27571 cce9316a62f88678c501e3e0f153aebe1f50a823 legacy-trunk
+27572 a2bcb00dcbd595b11495c137f86f43a92507fb32 legacy-trunk
+27573 7b5e61373f6edc9bd500598b34575c5200bbe6df legacy-trunk
+27574 b9f23e2253f887c2885046298b1b7dee5c33acbb release22-maint
+27575 6eb74e83a6f11a483950983605746481022c3964 legacy-trunk
+27576 07809f6a7968b27daff506745fdb6e613f6e48ff legacy-trunk
+27577 bf64018a64ff4c754ce103f0abb58427a49877a8 release22-maint
+27578 5ccaaad4f33b1bafc8d631ffb95ecabc3fd749e0 legacy-trunk
+27579 3d1f3b7ade07343396375ad6f41efb0578712588 legacy-trunk
+27580 f02599ec5cb93106f3c3227a30a2a7d70b047e96 legacy-trunk
+27581 990fc04cf0d4001415515e9a5664a368bded6b57 legacy-trunk
+27582 0b6a2ae706e21a8761a64d3f5474924f724894b1 legacy-trunk
+27583 774dc07f1c16e2396e094331dc6c101a33d79a01 legacy-trunk
+27584 9deba35e624cbf9522b667af3f4a1483757576ec legacy-trunk
+27585 082023c20cef225058e0a5a7ff831fcc08d43c2b legacy-trunk
+27586 e48a4b0bdbb55da496dd5f4a032b6e85e724ce75 legacy-trunk
+27587 f2012db1616c3e5692472154eb8ac8e38705358e legacy-trunk
+27588 fa9af245ceb4ead2565e3fe9d41cda2abf7c066e legacy-trunk
+27589 561e33a6a3138417c6d9817a8a360eeec2c08b77 legacy-trunk
+27590 efabc1511dc271ec097b469dcfdcd7106828b6c4 legacy-trunk
+27591 a546593968d64df4659d7627538c479baf8a6fdf legacy-trunk
+27592 25367c7c40a4c6de5408190892adc23445d214dd legacy-trunk
+27593 06ee862d9815434495296348670887c79fb35da2 legacy-trunk
+27594 296dd32425d6a73f489d49e4793ed5ed7fe0c008 legacy-trunk
+27595 0867da5e85489ac855f9717ae1d9274f712c1125 legacy-trunk
+27596 f0a2ec78bd05c3757ae043cac513a829ee4c7066 release22-maint
+27597 16314ff58ef48052c5c32e690a1a54dc57e39b24 legacy-trunk
+27598 c8a19a4283584bb9bceaea0e27186bb267fb357c legacy-trunk
+27599 494a8beb458265a1dba550aae2ac2cb84a97fd02 release22-maint
+27600 dfd85e9023fcbc496b9be4ee4d95e0e4b0d3dec2 legacy-trunk
+27601 daa5b14492ee909da2ed1a292287ee75476fe860 legacy-trunk
+27602 76af8b30894a7cf9f0534e51174990dc782093ed release21-maint
+27603 ad5f3a0526d1f43e78140fb0c08dd0c3f4c4d6a7 legacy-trunk
+27604 565781ea137be2bdc528c36b5b95bcbbf75b3855 release22-maint
+27605 42ed02afa63bf76b6fb4dd556b78c1a2db79376c legacy-trunk
+27606 b347233783ee393bcec5bbe8763faa647652674b release22-maint
+27607 9bea2c0c838e6c6778464c8aa3cb0fed2cc00c53 release21-maint
+27608 62d8f974811f1a4626e9781e794be1fb23326d07 legacy-trunk
+27609 8a67f28a42a5dc18cf5016b9f2e2f7536f3cbec2 legacy-trunk
+27610 5b66e63d7abb70d484f38ce9054b0b506854250a release22-maint
+27611 40d96493a42951bf9b2665f1a742bf2d1c37ac44 legacy-trunk
+27612 2860be244263e404974c7d79499df430335a900b legacy-trunk
+27613 b6213843d8bed00ed02631c213a1edfdb5e25eb6 legacy-trunk
+27614 e06b1ab0bdb80c3484c1f8481f0e4d024b482fa2 legacy-trunk
+27615 11c4253698dc73dca4f5086c8ef105cb7f76ffd4 legacy-trunk
+27616 c8917b59c0659aa38f53d862707778308001de62 legacy-trunk
+27617 73a884487a76680ab3a26a86bd03b9aa994c2089 legacy-trunk
+27618 2be63e20a4982d5ab7491e8f2cefbe6fb5425cce legacy-trunk
+27619 05977c5f880cf8a1ccc90f460374ac48a3851927 legacy-trunk
+27620 3895b78d3ee0cecf5d82e864dc28a31c27510c29 legacy-trunk
+27621 51cda6e8764a6e22d5732c6c0b2dab481363153d legacy-trunk
+27622 9eafb4cea47a5c9003f6bb08dabc8a18115375f2 legacy-trunk
+27623 fc27ffe2036aa10fe72ebc66eed852ccc225c6f5 legacy-trunk
+27624 a3fc1d8e0ae81e4a3fd20ef8bfdd01b0373724b6 legacy-trunk
+27625 c423a88b22ced346a8c4c378ff7a2ddfe829e124 legacy-trunk
+27626 da4c7120143f08d9338512439fea8efb2d433eda legacy-trunk
+27627 50443127b21dc49718234c24adb85552ebfc81c9 legacy-trunk
+27628 9a58d64f8fc3fd5264c680aa00cb371b12951c49 legacy-trunk
+27629 5d3ec28e9a7ad3e80ca2426fe06921fe8bc7afd3 legacy-trunk
+27630 305422d69d31332da9931d54a2ce3b21352511f5 legacy-trunk
+27631 4a7b3bac381287b2416cf6137464e9a226633671 legacy-trunk
+27632 804ea51cfce6e2c03212b53f8e84724a456383d7 legacy-trunk
+27633 7d0982056f72b57d87a935acb57c3dff2c837be4 release22-maint
+27634 5542bf0bbce23cb8ba2d231d38ee0f4e3db1f5fc legacy-trunk
+27635 62f4b45b05fdda13b9440194d76a16c20f1b08c5 legacy-trunk
+27636 83120f5a48c2139eedbec8145ceb9ee593ceaba5 release22-maint
+27637 41c54b37e03088472ab7af015843731972529317 legacy-trunk
+27638 88cd27db79b93f2855f0efeb8583681262eeb3c6 release22-maint
+27639 a6717275195c92903bce60c8f6ec28ea1ed6f0da legacy-trunk
+27640 eac54a83272f4200e9dae1f2a55d7a01d3edf407 legacy-trunk
+27641 2f60f90ce3093dbb15971376464aa7093bdddf12 legacy-trunk
+27642 6aa2d09e32c13fb56c9681bef21604742dba83d0 legacy-trunk
+27643 27e94cacb43bd6c34faf5600cf0750e13a5b770c legacy-trunk
+27644 3b571e32a6e45fb825bbb69a961fb20d2e510aec legacy-trunk
+27645 e6033254df21455b8fc414585293e526e463cf0f legacy-trunk
+27646 18c1b290e4842974723f3126cd4fceff25a2227a legacy-trunk
+27647 4a5c6f69447d6b9ff7778b20a5ce02ccc5902d86 legacy-trunk
+27648 d98b0cdf7e51b6a190fa40343b3a8b79c1224c90 legacy-trunk
+27649 76cd286e7de5e7795b919305d9bb6f3ed974eaad legacy-trunk
+27650 3a3e071d84f985fdc23995607d79cae6a0fe4fa8 release22-maint
+27651 d7237037f3794d924741ff98e3848f7301d8ae59 legacy-trunk
+27652 a4f4ce5e8aa9914e32307f588f7805eb0cc52952 legacy-trunk
+27653 d1b2bfd93a2708950ca0ce6d6b3f735b39dfb700 release22-maint
+27654 c3cf22338e1ce94728ffd7c4894ae541661838da legacy-trunk
+27655 c320a07f014671a3e30a8d3c013289a0cc634776 legacy-trunk
+27656 1cebce50fe71224d1094c65da0a349597ebf89b2 legacy-trunk
+27657 99da93683ea5b254860e1613f190a0494d0e36c9 legacy-trunk
+27658 3529ad213955943d3458a10292276b65ae7f5151 legacy-trunk
+27659 eb04f17cc008ca7533d748d37a53db0f97e98a60 legacy-trunk
+27660 71f1f35c03573476ea3983135467f0407df0d01f legacy-trunk
+27661 1a703f9bbdc0fedcace479f754fa3192876df325 legacy-trunk
+27662 1598a1e473e24798fd59acdb143bc61676831459 legacy-trunk
+27663 819c8033705b954f556e72feac235f7a10d8c265 legacy-trunk
+27664 970786d02e805df17d4d9b647077c4ca1dbf64e9 legacy-trunk
+27665 c0a67a1cab09c9737c21e7a074334e5fe0e408b7 legacy-trunk
+27666 d8909792005ab82ed1bc2b1310fddaf6cd184b2b legacy-trunk
+27667 44522a75deecea944c832efe4d39d67111b21902 legacy-trunk
+27668 4e85306a9bbfa81ec5be5f386b143281d2ec8629 legacy-trunk
+27669 1576a2dff01f8e98a255a1e87f56253f4d55347e legacy-trunk
+27670 d814a731924a315ea597ee2dc4df4d39caab1817 legacy-trunk
+27671 b5962b587cc0929ea1cff4d5eeadc027b16d017e legacy-trunk
+27672 09e4de5dcb3bab1ecd48ec548b47938cf6f5fb65 legacy-trunk
+27673 3cacef249eb550b263026c9adf671568338f24b5 legacy-trunk
+27674 2d407484a4e6338eff546c1dec4f05b904dffcc8 legacy-trunk
+27675 640370f08e2af29967bab88afc414a6a4d5cabcc legacy-trunk
+27676 0a08ed05bd425c0a16af7251c3bc180a3d61dbdc legacy-trunk
+27677 a26ca8ab27f2b201512a98514f2eddaa3ffe776d legacy-trunk
+27678 87e2534e9d64b37050c2707f8829dc55f87f4eb2 legacy-trunk
+27679 e662226211e539caedfd14c9ce23bfb842c87f01 legacy-trunk
+27680 379b01e0742219906963b82f9dd0fb3c03963920 legacy-trunk
+27681 a03298a3acad1439092e0f49830e0ac8fbe2292c legacy-trunk
+27682 52b0976e48a1d6e49d4053b9837d9db4a778a20a legacy-trunk
+27683 9c01784ce7cab51431d8b9d450eaefcbcc730b62 legacy-trunk
+27684 c4bf45ca4d556769f0127cfe66968d0119e7c558 legacy-trunk
+27685 93434bc0899d9fd54a79b8e751195b442e4d07c0 legacy-trunk
+27686 c91b7f34626b9cd3e5873cd2b54c793479f54de3 legacy-trunk
+27687 428cbbf05639069853089c906c7af4f17dda7a6d legacy-trunk
+27688 132577f693b1cc1597318194b1e824537781d5a2 legacy-trunk
+27689 416654e27d88933563f2bb4254d74c024924cdf8 legacy-trunk
+27690 69134c61f87c06bc1ad3811433bc200e26159e6c legacy-trunk
+27691 08d307cbccd95120aed9c67b83ecb650afd6364d legacy-trunk
+27692 5ede9bcc651eb2f019a4ca6e3e629de7655ac3bd legacy-trunk
+27693 a353d6a452769ea02bb291b87d510ec00adca210 legacy-trunk
+27694 c4b3a2b247ac37a37125f97e285f7e0d171eb24a legacy-trunk
+27695 658e12cc03362d5a6427777c8c16c3dbb35abfee legacy-trunk
+27696 74f9a206d4f08de1323e2453aaa4bbd27336b063 legacy-trunk
+27697 a8df0c0be2423aeb6d61feab36e42c8f962b6d10 legacy-trunk
+27698 dd38291b89fb540075b9dc1ba5b1d524792e89b1 legacy-trunk
+27699 29ae8e89153bd6e557bdd99bd0e27d63f88d4902 legacy-trunk
+27700 12815d05080cf69c2c9a993e4eec196070402398 legacy-trunk
+27701 c43466f7dae8416457e7081a6b4292b64b8404d1 legacy-trunk
+27702 478a2d64ac58308fabf4e4cd757a7264fe973c7c legacy-trunk
+27703 31227353cbbcc010b5d826960e306746d981751f legacy-trunk
+27704 afe479a6235ec08415e74653bbb03362d0244ce4 legacy-trunk
+27705 ab1877a7b2625bd6c46efb31490c56a5efe3929a legacy-trunk
+27706 d9add40f92ff32f19847de325b5bf3efa0da3ba3 legacy-trunk
+27707 17d5262977557f7e6180ce7ab179eec16ae50abd legacy-trunk
+27708 aa4b9a7b3817a19e5fa58491a9a03acc216e9861 legacy-trunk
+27709 eb39ba60dae0cfc295bc83ce8d0d4da65d0d1e87 legacy-trunk
+27710 d497f523b82ed74aca126399516e33a1cfd808aa legacy-trunk
+27711 e3751fc03e6c8782e976bcf50ea3fb1f96fc1fbd legacy-trunk
+27712 53b32271e8e1f16df4d938cbcbd747f36fd8ba23 legacy-trunk
+27713 697777cc83cc0ff06358512fa4ffe6ffd71cc757 legacy-trunk
+27714 8b4a165baaeedf6984e4ac0ebf015a71753586e2 legacy-trunk
+27715 ddf671633465e506f5b7c967ae1c1f6f96207ad1 legacy-trunk
+27716 2131bb790af958c6513417857504b600a1484ed8 legacy-trunk
+27717 06b9a8dad721b1906e0f9bdc0f1f21713585807d legacy-trunk
+27718 2f60344a49e88ce4ed997435109319513f05493b legacy-trunk
+27719 49a3e83347dded0b0997849ce7058b90aa876c91 legacy-trunk
+27720 67eaabb017e0e0d01b89ad0e1e6b7d148f09211d legacy-trunk
+27721 a9b809c8b9dbaa3e415e165d616b343971886d27 legacy-trunk
+27722 139859016b44bb9d06724b10e88e64263d6d5e9b legacy-trunk
+27723 3ef019caad1e51508d49b68f09fca8cc19e88ed7 legacy-trunk
+27724 2ae0145931f1f308d3ddb2928eed8e82ea33c046 legacy-trunk
+27725 f09cf8eba7e23790fd3655658fbfe96ef263252a legacy-trunk
+27726 bb0692e30fc6b01d3a150ce0b1cd351bccfc3ecf legacy-trunk
+27727 232ab0d663752ba2ea6a11e1346e14f8714f25e6 legacy-trunk
+27728 2dc23f0f34215d6f46a379435904222a0e10ba36 legacy-trunk
+27729 48930b0043b772b8a6029134c4e1de6fd2f37834 DS_RPC_BRANCH
+27730 187c4fade3db3eb5f911a5d56599d19175664065 DS_RPC_BRANCH
+27731 30d0d8dbf24458eb1684d8b06e9f232861845a19 DS_RPC_BRANCH
+27732 7fed3513abfa713dec166de98bcad6c51334682f DS_RPC_BRANCH
+27733 3a3bc7d9f1f5e6161c208f09838f699bca960497 DS_RPC_BRANCH
+27734 4f6e56c44739fe6b94fbc7df3be857d0dad8701b DS_RPC_BRANCH
+27735 d2d81d53d4a12df30acd61ed03dbda5e4a5a59c7 legacy-trunk
+27736 808b4fe5184fcad765f1eb9afa3949702287e0f0 legacy-trunk
+27737 aa5c99b61df77741ad69b2e69fd31e3e0f2bd792 legacy-trunk
+27738 137fdde700060102f24c4293d9a1e4ffb38ed857 legacy-trunk
+27739 157bbfb17f44ce92dbf6b58f7822bbb4bc5dc5e0 legacy-trunk
+27740 55eab10e472d39f384622bf7da5bcf511bcd788c legacy-trunk
+27741 fda513b671b6c9f62be6799744a0093c6ecc7a4f legacy-trunk
+27742 4eadf7dfcdb4a8eed4da3a19e75f40aaf03dd273 legacy-trunk
+27743 194140c83276049df55562fa4657d38974b4345c legacy-trunk
+27744 a3571436837c1a245d23092c8e5cb13a36883db9 legacy-trunk
+27745 17e94e62353c738d375e765fe77c1a9d21e84f15 legacy-trunk
+27746 3308a96b976f6e8950d7f76ef246598da6faf7f0 release22-maint
+27747 f3c8e3af7b6bf62678b2a6f70523b4d15375e23e legacy-trunk
+27748 020d96625357867cf60f5717952908e9b8bc19a5 legacy-trunk
+27749 e8fd5cab0db3ea726075d498ae9eb207e94e586c legacy-trunk
+27750 713ad7e0406aa62ae310efcb096c0c833369df1c legacy-trunk
+27751 979ff5d0ae07af543a77373647edfd5e09f939c3 legacy-trunk
+27752 aa0d2d51fbdec112af30433216717dcdde5fd169 legacy-trunk
+27753 a7186bb9142c929ee1d005a8ae6d3e8b217f9d46 legacy-trunk
+27754 1012906e8adf0fc5101a6465c0a9e51006b13a96 legacy-trunk
+27755 8d23bfa20cdbcdb0aaca048e4c2d7a7d7293409e legacy-trunk
+27756 4ab4dac462ffdc995f3d92669d8ca75b0225f28b legacy-trunk
+27757 e3605eb2f866b3b533f9c5d1f7b1b7b97000284d legacy-trunk
+27759 f6eaa9d996ec242c65b6d867c1ef07309dcf4c15 legacy-trunk
+27760 40e0140181cf85000c05a11456a600d5a347736c legacy-trunk
+27761 43ee1c0750a23554bde554ff73a73303db9398c2 legacy-trunk
+27762 dfe54af29a473ffe8e379823d30b3576af576d44 DS_RPC_BRANCH
+27763 9d641ce66af35821ca82c5f0886aa8ece88dc3c7 DS_RPC_BRANCH
+27764 f79c7aae6620d8b2b3f78799300617f2fa4dc451 legacy-trunk
+27765 3070b717fc3d833266b8fe8a35ea4a96674501dc legacy-trunk
+27766 89ce62126664f24b640bf9c9462b82acf184c952 legacy-trunk
+27767 aa9e054270a2a9fefa66b9eeab279df3d535777b legacy-trunk
+27768 ec2c854bd196d3acac474c3305cd6be1157eec2b legacy-trunk
+27769 c9de55fbb2b1dea7cefd13ed6dcc42e2761bf2fc legacy-trunk
+27770 e2d461befc7a8c5b2174af770e39d1f5bb404692 legacy-trunk
+27771 672843ee4b61fb391a08f3aa5ec5e6979d9a85a2 legacy-trunk
+27772 d8a682d4c6924047006c9b248cb33ed23b236f77 legacy-trunk
+27773 4156bf9b0043c0b78b9fa0443df06cc5bf78fb4c legacy-trunk
+27774 3c45dcd0101deebee94e0f88c041421b3bed55d7 legacy-trunk
+27775 6673171fc37ebf1be1858b8d0ec2f5f61e396d3e legacy-trunk
+27776 dbdada9668582df14dcce735574583237abaeace release22-maint
+27777 0e27b67247daa4b0f0ea484c4429e0acf5be4b72 legacy-trunk
+27778 b45d1b3040aef00f75c962575334d468cafab62f legacy-trunk
+27779 3aaad9df711e43e4fe924ea39fe2785795a93c76 legacy-trunk
+27780 eb759da064aa85db863b6933537aa30c2236d87d legacy-trunk
+27781 ac49b2807b750d47978f089245990d6f4bfdf215 release22-maint
+27782 b8e3596cebd7d344c07920c2e511cdb1c43911fe release22-maint
+27783 0a327b76886874abdbf1970189283439edc349d6 legacy-trunk
+27784 07dd2fc6ac9b77abca385bb7c0227ac49fdb3809 legacy-trunk
+27785 bb64a8614f668174e43c0389b72329eacf70d49e legacy-trunk
+27786 477c74d0066f0627680ec92e6e68cbfe8a392349 legacy-trunk
+27787 ed98c88b2353be4093b07053a9962d7a5c530f97 legacy-trunk
+27788 f6052aeb134fca1e816ff22bfff0809cf0e00a23 legacy-trunk
+27789 c7ed925c75b310a9aeb8fa3318f2096b8806f8cc legacy-trunk
+27790 608735dd2ebc7d6e51c8206dd18a20e6cb517262 release22-maint
+27791 81ca6ca5c3074b343ceba7f9f1a50679a316f1a0 legacy-trunk
+27792 bd3665bd2f783324096e9383a6311fef7802cbbf legacy-trunk
+27793 8c6a992245579f3812a959cc9aa3b511540f2d44 legacy-trunk
+27794 eb554aa361e9ce8206e7ceb3c4d77425255dc780 legacy-trunk
+27795 ca5ac967c7c4ccca13dcb9d85c702d8e05c0e7e5 release22-maint
+27796 80129d4a8cec17531e3e63ea7e89d263b04f02e4 legacy-trunk
+27797 30440871c6e5640c6d56e501f3947b435ed0efe2 legacy-trunk
+27798 d049fd58e4ddc4ddeec7482de24c9bee8814f1bb release22-maint
+27799 4de5c7e6231e5d36905f74c7da1f4b74ce0abb8b legacy-trunk
+27800 d6ec4dab927e67d228574a5f93c7aad67ecf3573 legacy-trunk
+27801 31a7119bd8d4def71374211961e3bedbaec03e25 legacy-trunk
+27802 8e266d0acd10a0821d5126ffd718d786300812d6 legacy-trunk
+27803 4708c09f0350f954640634a080099c16c5aefd85 release22-maint
+27804 08926cc5f2afd0416f0a73fb1930ca403cd3c137 legacy-trunk
+27805 a088cd08dade766250d1866069d79d7c47907b6d legacy-trunk
+27806 f5cfa0ee02cf3f66a2ab73b4e2a6d81d66c0bf42 legacy-trunk
+27807 dd6a9711b43cd906f0e421b6923f8facfe435005 legacy-trunk
+27808 a0a59e52baec5dd0c8ea605c80b70f63dcbed8a1 legacy-trunk
+27809 515e8723caeff659634f09394f9acc60bb2c78b5 legacy-trunk
+27810 275693bcee7402b30b6c8377b61290d08707115f legacy-trunk
+27811 36e2fd3f08f7580dee46ad8b069e93897e73bc85 legacy-trunk
+27812 5be961a8e9db3e180f863df422ebba98f0f0fbd1 release22-maint
+27813 bd6268b17b7577c917abd2db9976dbce42e44636 legacy-trunk
+27814 3db261a93a5b9f73a37e6352983ea8979ef6a7c3 legacy-trunk
+27815 f4cd78b3b774cfb94a72aa6ff5a45648071aed09 legacy-trunk
+27816 ed892411ee0d00b5ea84e48bb920d0dbc311fbb4 legacy-trunk
+27817 9afac0dd6b6e4ea0e632e0508dc2958e9a992f35 legacy-trunk
+27818 ea482196404324c3b0f99d42c514cc9bc6c0b337 legacy-trunk
+27819 15ee445af07f7a8526991cd1c82063f82f56199c release22-maint
+27820 f55d58ee4ea3fcc00e26044d7bdfaa308e79262f legacy-trunk
+27821 14bd5ab0cdb66c65f5758cea372861bbda19b513 legacy-trunk
+27822 f4436e1b1868fef2f12dc72699e52ce58348b9e0 release22-maint
+27823 7383e674fcd51b9300e75985977e3b5ee7b9cc70 legacy-trunk
+27824 fe2250f45ac084530b91c7348861c3dff968bd9d legacy-trunk
+27825 9ef82377669d53a9bb5c1b822f9d7e6a7c82c751 legacy-trunk
+27826 7dc3f4077e59553ec7f9593df243f3a056d6dad4 legacy-trunk
+27827 d98f8e03fa312a3b46052235ab34445b500dcb31 legacy-trunk
+27828 301dd5465b8e2b2860d8fbf50025d40556ccf1e9 legacy-trunk
+27829 6698966838c8e4902ac3562c789dc6d929465391 legacy-trunk
+27830 fe03ab580f955b92b6848186993911b05dd399c9 release22-maint
+27831 2cd51b052ddf77b935b71405cac329312ee64868 legacy-trunk
+27832 6d61126ace695b387592eba422266753c6902e34 legacy-trunk
+27833 226ba34bd998b5ee3fd0aac9ea6e0e829a341fea legacy-trunk
+27834 9d473d4d11a693e7dcc06958a4a4a3dc38a3dbc0 legacy-trunk
+27835 32dde37c8d959740feb1f53f8fd0cd6f1ef32b6a legacy-trunk
+27836 c3d9e01c6124097eb3bc2748caaa8f5b5b31c729 legacy-trunk
+27837 6f824d6f128629124b71194134994cc7ef6a8bd8 release22-maint
+27838 ddd6ff0693c4f00dd7b1ef73bac63127ce183c23 legacy-trunk
+27839 354323371e3848d5ba3b518fb5f7bd3812c92322 legacy-trunk
+27840 2add27b55864ab00d9b6d7c9046be2223927d72f legacy-trunk
+27841 747fa65a9b475a92e40c4c9c12ae8c2569bf36ae legacy-trunk
+27842 22570e76cca1621e6dc3f096f5928d8fcdeeb51a legacy-trunk
+27843 a5ea4dd17883a7aaa6129eef08cf935bfbe20b19 legacy-trunk
+27844 f0d1399a2445d0dc9b548b7911b2012c6e6f36ab legacy-trunk
+27845 f828f32206ba52b4e344b7dc0de147b40a138f27 legacy-trunk
+27846 d971b8703508121cbfafe4cb5ee4c0bc542b5938 legacy-trunk
+27847 d216e67ac221c220a099f769dad2c344ed2a5d8d legacy-trunk
+27848 27825d268317a1116044cb18b37fa400bfa1d765 legacy-trunk
+27849 5f149ade9af191616b71ac945ce98e2a7a0b613d legacy-trunk
+27850 189eb6fa9ded8531ffad2b1b10e00a5d7a239e03 legacy-trunk
+27851 2d77be41ee5fb07e58a9d249fed3561473c7a002 legacy-trunk
+27852 7fc2cec4dc828d49ec9b2d430b1ef3c5fabf8c33 legacy-trunk
+27853 a1bddf6a32cabf6da133897fc6b42b0122bdfdef legacy-trunk
+27854 ebc8667f325adbbc70b8bd720556641f3fc8ee20 release22-maint
+27855 e334dd4e510ff1727f93e540ac007fc2db0c84e7 release22-maint
+27856 4a66bef15c3bb67da0374520d3e1a30e00d947b2 legacy-trunk
+27857 161a5ef0230e39069eacc0e8c12cf931b21a50dc legacy-trunk
+27858 9b2497e297953a99f8e1d8dcec66de39165db4f5 legacy-trunk
+27859 e56298dc0f8ae821442e419cbdfebdd532841c5d release22-maint
+27860 79f129b073debe3bdc0a82c51c9593540dfc8569 legacy-trunk
+27861 b6a82f8185406c4cecef37992433d05eecaaab3e legacy-trunk
+27862 f66b3a3509c70ca06b36587200fce5264d2522f3 legacy-trunk
+27863 45b4fc63bf67193654b0ef4772860e8a28bf42d2 legacy-trunk
+27864 90b49668d0ac3f98a96bf625c52936b66cdd4962 legacy-trunk
+27865 5dbcce21dfeea67220416dc2a9df7fefa34092af legacy-trunk
+27866 e1409ab0fe698735d2cfeadd90637a3ff7601171 legacy-trunk
+27867 ad4d23f1bf6e6a2bc7386d468567c9d0d4065f7e legacy-trunk
+27868 b38754f1cb61122eaecb2dad3d75b72fe99f7123 legacy-trunk
+27869 b6e51b086cf4d6cc5a9e367937d3fc7bd701bcfd legacy-trunk
+27870 564629d1f1ac4a20fe10fef876205bc75c49a57a legacy-trunk
+27871 03d85d197052a912c6eff91954cdd7b336de3020 legacy-trunk
+27872 8691eda4c05733479a35691d561a846679067d81 legacy-trunk
+27873 7899fd2af9125f86515393f7666eeabc79f03def legacy-trunk
+27874 71ba2e969c11415d40d176c74f33805377b9ac64 legacy-trunk
+27875 e0128d616f87959f86adea7d79f123786df1eb7c legacy-trunk
+27876 f05a311d79886257e27b294192e7a531d3320a58 legacy-trunk
+27877 12aaf8d5ad2be7075728626066079056ee44b252 legacy-trunk
+27878 4e627d8cf9f4d2a8496f4a379fdafe85f207fd10 legacy-trunk
+27879 df0628662b481e3854945396a66af601f948ed7a legacy-trunk
+27880 bcc35a0f1a78e8cfb19e0ff839cb990386804932 legacy-trunk
+27881 0854524ece00840da542326d42b6f71e8d3c4872 legacy-trunk
+27882 4bfc8c519b6dd54a95d9bdb6ec917c531cd9b02e legacy-trunk
+27883 fb0691f10d912b49f43b87e5c50badf83f51088f ast-branch
+27884 3ddace1d12a9fe50c6cef4c908c3ca04b13a37eb legacy-trunk
+27885 8091a4a3b8aec2ef32e17f8b28eadf9530bbdf35 legacy-trunk
+27886 ec1a2d7ac02bc04923992d63598951bb7691bee2 legacy-trunk
+27887 30335c68b787f91fe0618fccd6f1c80cc83a7887 legacy-trunk
+27888 2670a5db684315cfe4573dc133ba75af49a39e8b legacy-trunk
+27889 daf7579c22482192cce98545bde7f5ee4664d5db legacy-trunk
+27890 6dcf128d7e0308acf85f6c0660dcfc4a8c352c76 legacy-trunk
+27891 ac7628769ba53e1bc564a8fb5df39331d29b4b8c legacy-trunk
+27892 17a8b74bbe5cf04c68c0e9446024785598d8babe legacy-trunk
+27893 dfe6884b59e0e7e40bef66b7d30581a6cfa2a64b legacy-trunk
+27894 fe2cfce4e65863ed3172b5b13454b9ce40e7b196 release22-maint
+27895 4897e29e19cc067c6b930f0fe2303ce0c4075b43 legacy-trunk
+27896 87f828726fe6eab619598fed618a11cb978ce336 legacy-trunk
+27897 324b2e7af68357a0b73f9328018e35f05e0bd333 legacy-trunk
+27898 fa32e7a65a7e8f8bea33c9a5c28377c40d82ca9f legacy-trunk
+27899 dfe5a689979ba823cfbed750ea2151e05bdff526 legacy-trunk
+27900 abb52d56ba5aabc5f2097c2a9701f8ce4e612e8c legacy-trunk
+27901 12d85b785263634e7a269da711831dda51bf56de legacy-trunk
+27902 7ecb6eb1fe773974573656e2bb4f107a28f3b60f legacy-trunk
+27903 7fac133d539ffacb0a257a8b5c4542674ae8023f legacy-trunk
+27904 56ce4c8f4f169f21c9c178d51a00b9c9ebdc580f legacy-trunk
+27905 702e113d39b0d55bdb8d8eb5c169aa99e0a79578 legacy-trunk
+27906 d8ba373bf2b3c727b41633b343e70172555a306f legacy-trunk
+27907 94ff07438377b87d48b658b4607b20c5094bb370 legacy-trunk
+27908 ae2fb8da3863e9964259de4817ae71b6b06de771 legacy-trunk
+27909 75fd862901d83e7f03365ac2f4fdb387d6642df4 legacy-trunk
+27910 8a10a721b84bceeccbebeab367a0bdd7d024754a legacy-trunk
+27911 0cf4e0539cc1f580c3f6bd6a648174253283318a legacy-trunk
+27912 175cd0e088aaccf93d4a00056b39454369c536f6 legacy-trunk
+27913 adf0b215a52ae25904fd28d0b76e9739eb387bab legacy-trunk
+27914 5bd0f241ec5adbb928a5f1572e2c9cd39b140713 legacy-trunk
+27915 a73a5898bf492a5612ba1eaeacae9e4aca0f5c97 legacy-trunk
+27916 a5324b094942e32856744c005cdd3d1a153e67ff legacy-trunk
+27917 3cb055aae73957d80223537b8b2c6655e1f0606c legacy-trunk
+27918 1f017870552e653bb8da1419ba3bb813491f6918 legacy-trunk
+27919 32f92d766b8136aab43b62b71568d6196fce09c8 legacy-trunk
+27920 62f6babece1fc324574dc2be5266e9a03451bc3d legacy-trunk
+27921 3444005b652703d2fb41dbc91a7a9b5d6eef179e legacy-trunk
+27922 95df87d44923bfd4cefaa0d9a4b585486ffdaff0 legacy-trunk
+27923 950c5a09ad9989419dfaaff4af3901c34da62a46 legacy-trunk
+27924 82c48653861b56e8bc0c386aa0ce478f1e7ce54c legacy-trunk
+27925 1c26eb7682936d0190762a814e5fcb1f84f3d28d legacy-trunk
+27926 af1fb4fec2b44d4260f4069a76159ea982b3a363 release22-maint
+27927 41895609d084cda75083ac965b6bf60013d6a303 legacy-trunk
+27928 e961cd2f22e428a41e25c751199746626b99bb0e legacy-trunk
+27929 28a5c8afa056e52ceb70de0a2db1cb12c01fb2d0 legacy-trunk
+27930 8d5e0e3f644500f26ef8b2947da163d6d47ad257 legacy-trunk
+27931 06f1e2fd05bcaae16f3cd83fd316c94ac29f74c8 legacy-trunk
+27932 614358e3c4f6aeff2b0d9886cdf91ffde9b3631a legacy-trunk
+27933 ff9efa692594fbb83feb85f755617940d2df94b0 legacy-trunk
+27934 d0d3f760d0675de3770654191f272d0a63a61e5e legacy-trunk
+27935 c00df23e856e5e2bd1dbb14944233d9c734a95ac legacy-trunk
+27936 0bd521eb714eaca86f8ca2453ae4fb5364be1be3 legacy-trunk
+27937 dd993d01e7404118838443cd5c31d3aa483941d0 ast-branch
+27938 b5b9b0334469c476feff0fbf6d2c769c20252947 ast-branch
+27939 d2f41c8a81f0d9538ca52a320cda2e3388ec6168 legacy-trunk
+27940 96fde9808e15c7a033da73fea4caeb35be3cc52b ast-branch
+27941 42286d2e4d2ff75a61828d01c4bac5a09a2a82b6 ast-branch
+27942 53f21f434956656ac97979fd489d253e7bdfd611 legacy-trunk
+27943 4f00134b561db534a32f5fd43bfae20756d97eba legacy-trunk
+27944 f2025c676e2415725f6d3fcc3f430e95fbc7aa5c legacy-trunk
+27945 d8750897c897caab11436f9fd503730221094185 legacy-trunk
+27946 a6a4a951c616ce7a93fcf57d245513508d7afc84 legacy-trunk
+27947 e21381fd8756410add3e79dd6aaa6d094621cbfc legacy-trunk
+27948 c9808f52120afb9e26d4d8df6383c3d98d9855ca legacy-trunk
+27949 d5f17d85f6a06583b6bf7ac66ab23b7926ac1aab legacy-trunk
+27950 df4a9d3abc56a12a7ab08d8484ee2f98292079a4 legacy-trunk
+27951 5d6e470ce05cd5b180e21fb4194ff238c99f66c3 legacy-trunk
+27952 bbac4e3ccb6252366b9cbd930d4f33c66b1e4821 legacy-trunk
+27953 4bf94149d21c7e463ba8daba1db19149f30c6785 legacy-trunk
+27954 d26b62f0c6dbc352f0c250f5b745074c93bc82e9 legacy-trunk
+27955 f059d5435d6532ede70583843e922381719873b2 legacy-trunk
+27956 b4269fa67c3e9cc4a0e1f4739f342faf6599753b legacy-trunk
+27957 b25c31e008c8c7d21497e3f56baa661d7eed98d5 legacy-trunk
+27958 9348fa20f214920d1aecbd3fbe30bc2ac7fc2f69 release22-maint
+27959 479f8f4ee4ad455ac351e2c7235ba2544eddf90f legacy-trunk
+27960 0bb3986cf653a605eded86b9a51ca59938c2c398 legacy-trunk
+27961 c8d694b641f19249d9cdbc994ace5e1e09b0e298 legacy-trunk
+27962 aabc97902e1046abcbe523455099d759a72a6eee legacy-trunk
+27963 7ca46e08200dfee53e216b17be31846a62f259f5 release22-maint
+27964 457a04783183f56f701618ae4d58bad5fbab70da legacy-trunk
+27965 8c38ea092f207ebf4709c0becb579b12f85260ec legacy-trunk
+27966 10dbde698766924dfcd377a2879dd2e8da9d8665 legacy-trunk
+27967 81c56cbc1d5ff485e642a7cad855b4d5703a032e legacy-trunk
+27968 00488ca9e04f754b867121321dca358217de55ae legacy-trunk
+27969 851121ecc11117a47825893c5095c37e3f005672 legacy-trunk
+27970 80fd0d361e17f604adaf6f1a76030fab30df56cd legacy-trunk
+27971 920ad09930dc509c97dd2d64da8c1a6dcd2ce723 legacy-trunk
+27972 3e718c3d51efabd138a1d172b011a74ed40235a7 legacy-trunk
+27973 a32cff0c75dcc7efb5dbe2da9f7aa373c8b1f8cc legacy-trunk
+27974 cccbc2c78c098b379fa128c6e73a35a1e5aae702 legacy-trunk
+27975 244117aebbd585bee9eeaf5ca004375f6e936ef2 legacy-trunk
+27976 ca20be24381fb305f32912f794ccbe2dc8796c5a legacy-trunk
+27977 4382b23743901de724ec588ba9c7ded5540afb79 legacy-trunk
+27978 9b1b2b58c866623670ca640b5199eda853d73c2c legacy-trunk
+27979 00f8dda17ee2b52afade95148c1079e0eff14df2 legacy-trunk
+27980 ec2e28300b7659c679733b0e71a8da7048b3f455 legacy-trunk
+27981 25d67c94a6d1a0c7335c9fd68757d3fb9910f85a legacy-trunk
+27982 c39aed45dbe99dc9a3478a3d59740d19082ca919 legacy-trunk
+27983 9dba12167db6f7d226fa9452ef39f5ea66d93c6b legacy-trunk
+27984 cb308a13a1fd204687ebc46f3dbcbeaea15b5ade legacy-trunk
+27985 fd05c2d35fe7191f2daed8edbea80fc8a7953054 release22-maint
+27986 839315de0ca10e2cb49851316276c20d28f0a473 DS_RPC_BRANCH
+27987 1ea569ea51fd9de800874195268ca9b218dfeb9a DS_RPC_BRANCH
+27988 e7b6bc2b35e2e42be877a4d316b17a34944694ac DS_RPC_BRANCH
+27989 307332f37b7d937d4fe3b516549f2268c2e69221 DS_RPC_BRANCH
+27990 3257efda451331e7bcd3b60d0174065735c82b36 legacy-trunk
+27991 e4a8e3e4210d977e7e79766c4c6735741184401b legacy-trunk
+27992 da88e990f92ccd2e7183d63771b364c99a1887d3 legacy-trunk
+27993 6e0deeeb9787d3b3d7fb72971563ec4ab71e17d4 legacy-trunk
+27994 f928f7eea2d698586d304fd54b78ad9ff00d99ac legacy-trunk
+27995 a506ab9bb4a4147049ed7d7405e5932b18e17a4a legacy-trunk
+27996 a02aba72cbb2499e5a3017766d872f3b2dc429df legacy-trunk
+27997 00167b2ecacc5ebc379b6ffb507ac5055c64790a legacy-trunk
+27998 12e146171f3dc906b91bae0c6c9f4d1fbe4aa69b legacy-trunk
+27999 d7ca0a2ce0746b86b3122756579ba82d8d51652d legacy-trunk
+28000 59d533580e72d6153c8ce4d6317da059c3ebe150 legacy-trunk
+28001 262ad16b4de09a32b1c134bc25001f7a01795741 legacy-trunk
+28002 f5e29c7336dd88ebe160e43e52a16de4239e2d21 legacy-trunk
+28003 73b309cf02135529c99d84bcc3f34f9863bd1513 legacy-trunk
+28004 2b0766afaa222d0ab071eb07ca8f824b3cb0a3c7 legacy-trunk
+28005 fd4575b56a4de018e678ce47366e24e884f98aaf legacy-trunk
+28006 940c4f546e7f17e7483ce9d4479657c1648f623e legacy-trunk
+28007 3e4d432872ea7918f3732d2851ea8fd3518a3416 legacy-trunk
+28008 b6707e159909a65f88c8c7fdc263985ef06e68b8 legacy-trunk
+28009 434ec523f32c7d606df28630a8046740665bb8e3 legacy-trunk
+28010 13de2f6f07dddc981903b3568c486b484e3f1c94 release22-maint
+28011 6542dfa40e77c761d014809686a227a6901bac3b legacy-trunk
+28012 8a74f335cfbab9e12775417b9726e3985a374853 legacy-trunk
+28013 791bbedbbbe9e376cf8bd494b24b82e73ac767c3 legacy-trunk
+28014 40eb80dc42500e980e18cacd3f6839b310f4842c legacy-trunk
+28015 8a1c086ad213a765d41ee60980f522a30fae15ac legacy-trunk
+28016 35dba6007ac37d2f4d4d8c26edd949f7af591961 legacy-trunk
+28017 dbc0f2f1141420cdf2978b5426e045f2c6de3ad5 legacy-trunk
+28018 642ddcfe864a4feafa88ef6bcf012b55ea7b4948 legacy-trunk
+28019 b64db550972c140f44a1ffda9ee9cf65795cd86a legacy-trunk
+28020 735441fdab7e474fe450a16d8a66b445795e07a7 legacy-trunk
+28021 80b12944a42b0af71505752286b8888901bce93f release22-maint
+28022 c9d2428a6a85ee885eee4a8289a21a6890df2847 legacy-trunk
+28023 11b262fed5809ccc454852f7d54bc6ef70a90b84 DS_RPC_BRANCH
+28024 fb4591c0470e2800fc887574e1dfe505abef35f1 DS_RPC_BRANCH
+28025 d6e5e9a1bca08d5c42722ffc35858ba2727f134d DS_RPC_BRANCH
+28026 b47a6a2a1e560c2911e60d7826b75869c1d66fe4 DS_RPC_BRANCH
+28027 1869cecd3933492104dfc383317672c2dd3e78e2 DS_RPC_BRANCH
+28028 f732597684267a9bbb4f90d036b8231b8cfb9c7d legacy-trunk
+28029 6445e44fcb78360d725e9c80a5f3d40bf52a0ee6 legacy-trunk
+28030 482c941d593f861c4ff51aa59a4e293e3f77f650 legacy-trunk
+28031 f3e69b9acc406b3e1df0d143204232122023a524 legacy-trunk
+28032 ddcb9ce0454649632db28fb664643347a76ac5be legacy-trunk
+28033 0df9a9c08c139e961d3f2208d2e1316084096898 legacy-trunk
+28034 7f8967f59cf82f0f220d7de3dcce78c7af111a70 legacy-trunk
+28035 43caa212b959cf7b0a9a85704ccbfb3245159210 legacy-trunk
+28036 110c6edaf62f3858e4d611a6e82a9448947ee7da legacy-trunk
+28037 f6a97cd3ba24b4557e073ee0ba0e0b69ebe9ec2e release22-maint
+28038 1ebc128e4842c284a2c4c4b4f777cb64b365ca57 legacy-trunk
+28039 778093533a46399abb3b107f8b491406a79a4f68 legacy-trunk
+28040 7ae3d7486801e7fbefccd774bb83460d61c39637 legacy-trunk
+28041 da90653fc2c6ebceb0c2d4ef870b6bc4ccfe3d07 release22-maint
+28042 f33c01cc414c897545642094e9bd46eec07b9e91 legacy-trunk
+28043 a9f2567c2f837658217e6dca32757eb1af9961bc legacy-trunk
+28044 fb1d0e55b1521d6babdc698b18b2396e0adfc556 legacy-trunk
+28045 beed1c1e7c6df6771733ff2e249a28c022c5e805 release22-maint
+28046 0d98660e365395ddd945cb1763a9deedbfec67e0 legacy-trunk
+28047 a0eb8e382d74cb122b7b1ca47002c3cb582ab799 legacy-trunk
+28048 27da2b81a496a925e111b45b8e7f3678e8f7c02a release22-maint
+28049 7ba3e5fbaad80c330addc7c5f6687f43db45c2ad legacy-trunk
+28050 8cf00338b728d387dccc109e134fc81de9373bb1 legacy-trunk
+28051 4b342ed309e02cf9b6bb22a77d36e9083fa6d550 legacy-trunk
+28052 697d223a2f76660366d3252d7fc6f5d728863dc1 legacy-trunk
+28053 edf757213a92db03cf88e7109afe0c9bded7a54f legacy-trunk
+28054 224c516bc11f1e1446ec73d4b9338b200df3f08e legacy-trunk
+28055 9d84a5bd767fa8d065861f248e409e452817b397 legacy-trunk
+28056 ab5eea2dd3c00c08d1414dbaf18cb0d2dfd84d47 legacy-trunk
+28057 fd1b5efa0ce3eacc8932c850721d44d1120e26da release22-maint
+28058 1ab27c1770df5b869b7de7ca050b01011b59f0fb legacy-trunk
+28059 f672e1dbad922411b432c82821136a1c855fed33 legacy-trunk
+28060 18ca4e783f987bd33a6c52dd2ef57dcb60a1ffa8 legacy-trunk
+28061 e61b118e9cab2926cb54ebfe20a4dd9c294b92a4 legacy-trunk
+28062 955914b0a4d646e78b1ab80d7cd06e22605cd456 legacy-trunk
+28063 8bc265b084d97c1f7cff3bfe4b2118f1ea49b370 legacy-trunk
+28064 59d9228778ad63e8bd768f02a65d7fb1cc450666 legacy-trunk
+28065 729287f7fc2e5fab0041529d95bd40dc0578606f release22-maint
+28066 2f411f2d791ade7696500dfa7964c1a8e2746059 legacy-trunk
+28067 a61893d7cef250cd34dc2148c0ff88918d8e05c5 legacy-trunk
+28068 b265e76bab88329341ba8447a52e9c983b87653e legacy-trunk
+28069 6a6d02be321ccd10182373c50b92e052b6a7c628 legacy-trunk
+28070 d25cf94d20b1eaeeb0888dc621c227094c138f4f legacy-trunk
+28071 4fbf534211b97c882c09844bc004b1680af11ec9 legacy-trunk
+28072 579f09c0fdbcd92add8663c42b76031c6032f552 release22-maint
+28073 bdba72ffd21bf9d62674bb1063bb7d7f61d66a4b release21-maint
+28074 95c4623f818508f2fb944f0a72f30a50d2a7402e legacy-trunk
+28075 70b6753117cc01bd7f7742476a38be0cd9ba04b8 release21-maint
+28076 647f9367750e8740131c44d1caed6a98d85f787e release22-maint
+28077 688eefba0869bb5d3f2c816a500eac203520050d release21-maint
+28078 3796d39f0b80c81c85edc97c6d4b0a9b9fc957e4 legacy-trunk
+28079 3269bdd65988eff897637084a831aceb5be43a99 legacy-trunk
+28080 fec0b0aef14ba487e066864a86f4eb395f838103 legacy-trunk
+28081 980767c6cd975b617e3a07cf1b6fd8fa3a05d9c2 legacy-trunk
+28082 479cb5ff2e609c5a217a82940bff9393ab7c2319 legacy-trunk
+28083 71dca7c76fa22792be93fb90c4c4be7e90925c1c legacy-trunk
+28084 7b10e7ff794dc5000faeca1f30602fe1ed81b270 legacy-trunk
+28085 6d26d4b9c5a36c18e5507393b0e8782edb5263aa legacy-trunk
+28086 aee18ea3d2847653507f2b1ab169e418a3df411a legacy-trunk
+28087 0492ad1ac6235d1faf3a84392805ccc2aee51853 legacy-trunk
+28088 567704bfa595a5ab7b4ce71a96c4162b24017423 legacy-trunk
+28089 274e42a691e0c843653ff8b2a24c9c6b2c949cd0 legacy-trunk
+28090 36493a7c62539bca995a93b13671f4c4cf930536 legacy-trunk
+28091 be47db38307e1831a6b4f47c6ae6281e5ba81111 legacy-trunk
+28092 8b470281645e601df32dd0dd865e7d01c200bf4d legacy-trunk
+28093 734f89c194dd9f103ec304bacd9ef88c435ef9ce release22-maint
+28094 debcf72067f05967b5d75647d6344d1f0980bf06 legacy-trunk
+28095 9c6f0e1999035a4f147552627215d75dfa74d68a legacy-trunk
+28096 0cdb6e9bcb5214db3870e5b8a6a1452ed08c37ae legacy-trunk
+28097 a28c9c336ab7119171db7e5d6cc3459035c9d5a8 legacy-trunk
+28098 e71bbba0a0b97668c76840f4d6a30de9bdb3d4a6 legacy-trunk
+28099 82e3fdb2816450c2cb5eded0fc680c8d5299c010 legacy-trunk
+28100 a989a2eaa2ac10925584b0d23ff7837dc1407219 legacy-trunk
+28101 ba3038a27c1e39b755f48adeba6c15632bde951a legacy-trunk
+28102 eef73e8823d5aef91d49b7ec1c701f97873d9327 legacy-trunk
+28103 31b9d369861d84997d95bd1ba45402b751be3c1f legacy-trunk
+28104 80c7a82d614489e94504f168bad68fff180d603f legacy-trunk
+28105 34128ccf2ee6193b2ff47eab8fa4ef3e7121e9ef legacy-trunk
+28106 a2f9bb54231b13a9bc737f5a10605e89e252a015 legacy-trunk
+28107 6eb958716d97c840ced2becd493433528107db3f legacy-trunk
+28108 4181e3a42d0a23dabda0f7cf89a09d1412b050c6 legacy-trunk
+28109 564abb98deb89c4e29d9a7c69fab55b283b7b835 release22-maint
+28110 e5bc470d1d1e1fe0766686c24495a0a66caf4a9e legacy-trunk
+28111 0d46e4b89cae7a4ea1e3ed4b2ac9ed06d516ad45 release22-maint
+28112 2dcd4d92814703f991df4ea68ff2b1d8dd7e1438 legacy-trunk
+28113 aa8bd0dc4f8a106f06840a37ae9a59427e4f7c08 legacy-trunk
+28114 6c96587a197f9cda432b8f5254bfee0ba5b4d9f5 legacy-trunk
+28115 11c70103880565193ea4c5f079e7b2366dd2f1e9 legacy-trunk
+28116 406788caef6f26ecf0d5071bf99febec16474a84 legacy-trunk
+28117 9429c3cf42a712bf40a0b8f168fad0e85f187ffc legacy-trunk
+28118 db27a42ccf48ac30eaa172b142df26882992ae5f legacy-trunk
+28119 74143db6ae2f97fb6a540af758ea6057dde264dc legacy-trunk
+28120 4c746ba24de21c810b50a79abf057ce31684eee9 legacy-trunk
+28121 343e64c92eb28e09b5e0c74943962239bf0cfc44 legacy-trunk
+28122 1d3d980a3186041c062396b9cd57f9926aa7b9de legacy-trunk
+28123 129d8d2e1904c726944c1d59c71cc2e6e07a5c76 legacy-trunk
+28124 5c77316b21f70d758cdb65c5d88a20ff23c85d18 legacy-trunk
+28125 374f879c5d8bd97f0ac4bbf9cc751ba446a146d5 legacy-trunk
+28126 2d3c4a7aec0a706df5252b645483b4b389c12199 legacy-trunk
+28127 510e73ae3e9e9d123ea33602eef14937613fe618 legacy-trunk
+28128 9e2f539634e80a1ed63cc861e0912a080d4ee0bb release22-maint
+28129 1125d9489dfa4007be67abf77988885ae753e8bb legacy-trunk
+28130 69079ac7c512e560a81ce4072ab63eb6cb304b35 legacy-trunk
+28131 bbd5f8af588ac10cf14d30af7096940fa5d9673d legacy-trunk
+28132 b5640e74aa5c28befc19bcffcbb446a89152757e legacy-trunk
+28133 3b8a707b41c462f0d90e6fe09b0d3dec7d0695cb legacy-trunk
+28134 b2f7df4677221ccadadc59365aeacdf0e85df472 legacy-trunk
+28135 8d850d58f109c7f57ed47ac2c870158cc0c5de95 legacy-trunk
+28136 d715ca9db3aaa2d14c086a2951ff2ac833c8df61 legacy-trunk
+28137 09ff0ed33efcb9197ea84b7e4cfd9b282e670f61 legacy-trunk
+28138 b0273f397cf122dba232a9c329fed0a31e21045f legacy-trunk
+28139 4923160e0707f7c3e4fe01c596d5e54f3b01c01c legacy-trunk
+28140 b0d5fb577ab601cda38baef424faaf9894e25b36 legacy-trunk
+28141 ff05eef3a6d1eb0d0ac5038d1e8f10613364a823 legacy-trunk
+28142 eaa87632b1e8edf8e2be83f33e902d242dde6dc7 legacy-trunk
+28143 565609bb8d898d3c375b61e583898439ecf30638 legacy-trunk
+28144 eec6832818a37009e8d70b3bb93b4a04f553a29e legacy-trunk
+28145 10391d58d18411e37640242680cf0db8ef02c03c legacy-trunk
+28146 e756867ace810c8fbcf599590c277e26c1ea01f3 release22-maint
+28147 c659f04ee499368d54636015d0ceda3eb5431fb0 legacy-trunk
+28148 6d9974b45fea1333949dad666f569cebc6189ede legacy-trunk
+28149 1a3270e26c162f499a0f164353f86922f1f922a6 release22-maint
+28150 ba035f4b47c15602f115407c46537678caaa0c3e legacy-trunk
+28151 49169d00ab182243c94ec9f7d0bef26dba48f167 legacy-trunk
+28152 19e010f792a383e2ecb7359de0181898bf772133 legacy-trunk
+28153 18c35bb5fe0743ff571c8026d4e7b9a7199aa854 legacy-trunk
+28154 a43519887b1794d7017e1a7178bcae79abb90486 legacy-trunk
+28155 c248bee52dc6a78e9d8aa0613995ce4db39e3e7d legacy-trunk
+28156 dbf6e563023b9d4f6755b7efec6dd2a565046e52 legacy-trunk
+28157 c1eb668525e11ce47fa947b100990d34b03c489a legacy-trunk
+28158 27ae978bee58573429a9766210d0d5389c0e9802 legacy-trunk
+28159 8ab303375b305e8388547e1d4c7eca84687de754 legacy-trunk
+28160 c88d0848c5c930c26c00dbb11f58311820c9f7c1 legacy-trunk
+28161 9c25aa13c36e1c92b904ef030b78bd6577c8706e legacy-trunk
+28162 b504835685c34ea73e720e6680038a8db892d82d legacy-trunk
+28163 27eca4766937aef4cbe2fb9edd99b5623489d04b legacy-trunk
+28164 3d2335094b88c17fa6b5f6d08549dcc42b25fb8d legacy-trunk
+28165 dcfabe65c22e5b2b68ce1553ae07249e5e9f8bc3 legacy-trunk
+28166 e0431d9c44742027f728b5c3260ebb9b8494c5b2 legacy-trunk
+28167 ccf66a1aa0b84429d5548d2b53f6019d5172ad80 legacy-trunk
+28168 5ed7c977d2a96db6d400cf9fa5d6e487d1ee3c22 legacy-trunk
+28169 f0bd5cd4b1706b339f0a137e4aef29e6c6090c1b legacy-trunk
+28170 4cafd9dbc8b47916e923564238aa936eba30909e legacy-trunk
+28171 58ea420ddc5eeade0e2ffbcba04bc24a0f33f457 legacy-trunk
+28172 2722057ffe860109974610ac616c6b436262b9ea legacy-trunk
+28173 acb258545a5c12546b4519c0345443692967ad43 release22-maint
+28174 0afacf5dc42eabf8b0c299d017e208a92303e65e legacy-trunk
+28175 d75bd9e5c4d9c3d84d53185018d8ce4a16851514 legacy-trunk
+28176 1824983fd94a744848a32d42c9a0a3f533e51fee legacy-trunk
+28177 c60e895d1125b34db281334c85c1e9dded116989 legacy-trunk
+28178 801a44ab2aae672189dc78e43e3e3c65c9afb1bf legacy-trunk
+28179 9e7ec2f5a1bd373ebb81bcb82b0e15610bfb4b63 legacy-trunk
+28180 6c6df69236b1d295a866cc9e27edba0633b387ff legacy-trunk
+28181 fe3472f2f8eb722d5ee13891f0ff8d9d89d73fd2 legacy-trunk
+28182 696a284569e64cb8a10f6d37f9a3677c5eade191 legacy-trunk
+28183 f1d18fcd56e696285992dd261dd2762c1b50d234 legacy-trunk
+28184 53cb71638841e6dd8839526d75e82589df52925e legacy-trunk
+28185 1fe06655c50c959e3eead48143eb685e1cbe1eed legacy-trunk
+28186 fae386d5e35456e5ab19e19d318f9b1a15d6aa4e release22-maint
+28187 c23853f7ebeb9e05ceb358cbea11aa00c1a6e06d legacy-trunk
+28188 01d6c5146ff9aeca2ff31074cddef0eb5be80372 legacy-trunk
+28189 cec41e3761ac3e4348c5cfd8371d652ad63a1a30 legacy-trunk
+28190 4de9ac0e4173661be1f1de3211469cb0ffe1a346 legacy-trunk
+28191 f0d63aa1dfc7e909a2d03aa26a708df3e4b63dbf legacy-trunk
+28192 0f61e074147fb1aafca247835a770d200da66412 release22-maint
+28193 1fd38900f53b8610ee9f20ffb36aa401f8c58d35 legacy-trunk
+28194 fcbde226545cc38c263b5c37541503365c447f5c legacy-trunk
+28195 825948c21f0dc13885cb810eb32143656543b63b legacy-trunk
+28196 dbf4cc56089883e079c708e3e68d677df2e36279 legacy-trunk
+28197 4c46b3edaa587c0e1f750b394b9012d9833d9d70 legacy-trunk
+28198 1951b2c6604438b132fb18378f8f202f0e839ff3 legacy-trunk
+28199 1c63d30826569ea17465b905e18869cb7b12d1a0 legacy-trunk
+28200 452d6a9161962463f565ecd91a4c627f85ce8cb7 legacy-trunk
+28201 de71e6fe64b0525949d329599c2bfdce672e2f40 legacy-trunk
+28202 6a9ea0c22cea1f9ab1089aa850953d3ee14b46c3 legacy-trunk
+28203 461afdb5cb9edf6306d3ee87ae327806dd6d4c36 legacy-trunk
+28204 d9ff97ce75bbed1e7673978a1370fc7ad1466371 legacy-trunk
+28205 931fb3700d0ba91b905ecd128a78e170a95678a0 legacy-trunk
+28206 862695b920fdd88f8a6b377e023b8d7318f9d4f1 legacy-trunk
+28207 a62cee4eed966f1fc2d3d92c9dc4e5144cdf0016 legacy-trunk
+28208 18cbadd807125aed42b18a1e7bba603bcd535bef legacy-trunk
+28209 30cff9c1bf693c08cea2a96ed3e1917f47216683 legacy-trunk
+28210 f147b594424467f14279394857a48ee584e38313 legacy-trunk
+28211 9b06f44bd4a34d873d6d5c35486418f72f799c78 legacy-trunk
+28212 685cd52c4c438c3ff554707025750aa1bcb0e49a legacy-trunk
+28213 ab63af3ec3495cbc7c8903a31c74b80c3d62a2c5 legacy-trunk
+28214 c75cdc471b2244a8b3a7c5e1ce94a1aa3e5f0b9c legacy-trunk
+28215 7ce82e9d08c78a50590bf80fa2219aa494b67593 legacy-trunk
+28216 58623ce94d406c4914d59de505e789caca96a569 legacy-trunk
+28217 74ed457208c1a0f534897ccf863a5434acff0afe legacy-trunk
+28218 7b7d8820ae380f09e60bb6acee193dc1f6d31978 legacy-trunk
+28219 6420b97eb59f17c11abca4b4797a8c283742491d legacy-trunk
+28220 50faa6835ddc41799421022197b81ae87688e5ed release22-maint
+28221 c45642e1dca93c535f2f5670e329c51e43cdc7c1 legacy-trunk
+28222 3ae8e3ff7e3f3437cc6e91cb8bb2def824b1e1a9 legacy-trunk
+28223 31d2860089e600b6f4b21d5896129d83b454ec1c legacy-trunk
+28224 4e44fabe0fa017bb85b2501c42168210d8b3edf2 legacy-trunk
+28225 011138b5f389a2848e25eb6213ce57fd34be89dd legacy-trunk
+28226 ae9c9f90b4b01bfa0b1911b5977d25d6c98c873a legacy-trunk
+28227 d3d7de703a22daac8d9d9727d66f9aeaa286d19b legacy-trunk
+28228 588d145c44dd9e6c9617d9e72036f7931ff46064 legacy-trunk
+28229 7c91d303c563ebe86a81d95ea6e6f4ce85a8ac94 legacy-trunk
+28230 c001e5a15369f37a7ba121e2097f6ae862808295 legacy-trunk
+28231 a7dbe4e7f5dedcc2f0fc3853c070eef4263be8fc release22-maint
+28232 e5a07cc815590584c5aca3f1abfd4be92f5fdcf9 legacy-trunk
+28233 4cf502716d15d53fefe5cdaaab2c80ce31cf8044 legacy-trunk
+28234 31ee32c23d29c59f9f31033fb7e35b511423d6da legacy-trunk
+28235 8e3e0e11f14caca333547abed3fba4d36e79be14 legacy-trunk
+28236 a602e4878b4ecd0caab39459c42df49dbcfa9ffe legacy-trunk
+28237 453c88f963ec326388e85f35d5fb38f0eea18bfd legacy-trunk
+28238 ca58f5a4558b8fa928c3d2e0ba36914b743fad1f legacy-trunk
+28239 64f4dd770c67da6509a9218418f84ce274fd5bcd legacy-trunk
+28240 e399d0a875b7e1ff38924cddd8e473b88836a642 legacy-trunk
+28241 c004b2bcd5421c4447e345ef9ee49df1eeec903b legacy-trunk
+28242 19f25bcf5a002ed1be7bfec194131fd55fc34b04 legacy-trunk
+28243 aea68cb368596134cc2a51a231ee65ba9b17aa01 legacy-trunk
+28244 17e95cc06f693b06c8dcf812c1f64c1d7fcf28bb legacy-trunk
+28245 2ff4268f25dc738a9896020566eef1b2ab447132 legacy-trunk
+28246 3af8d81d7f86e48af9c83d159321cb683e16b420 legacy-trunk
+28247 c9af875048e7296b50f4b71b7fad720b52bc3061 legacy-trunk
+28248 11c1cc97b87a31f6f635dfa513ea282e29075b7d legacy-trunk
+28249 cf5928fab108de9fbe02632d07176c717c2b3aa7 legacy-trunk
+28250 6939d72182e6c4991cc74e54c74ce50349738b5e legacy-trunk
+28251 10a4ec45549d0d894910dda9818b9788193545e2 legacy-trunk
+28252 873f12f68e3b10149bcd7f3d98d295f6ffb99ce7 legacy-trunk
+28253 dacd10d46e529405b8cf84e9cddfe0902f46cf9e legacy-trunk
+28254 3c9c56d97e55e723b6e73b83b17dface5ab2b8df legacy-trunk
+28255 8ab46df3182e79433cfb29e71082a1ecf7c1ad0d legacy-trunk
+28256 34cc98892e892e6737ee1b31438802e42c71e1f5 legacy-trunk
+28257 ad361e1d54bba3e2f4b12503a6dfdc4a4014dfa7 release22-maint
+28258 e9dd3e91e65310b70789f09af8075c3a71628d87 release22-maint
+28259 136b853622cc92347696077ae32d9470d89fe18f legacy-trunk
+28260 bed5d5e536bc0cec2baec41c3f7c4dfde851f14a legacy-trunk
+28261 87448a228cca2becb272b3856693cf7eb9a223c6 legacy-trunk
+28262 0ef6c2ad076b13390d69b85f18aab038b6ffb6e3 legacy-trunk
+28263 592406e0c9b019b6642ac4b02d6d98bb9ba3ef95 legacy-trunk
+28264 f2447686ec5ebe7f199d7ee0960cf8cf7bcd5e43 legacy-trunk
+28265 e45d1611e869d640dd5137e92d38afae31329ab8 legacy-trunk
+28266 4e795fe9f54b21b8fe403e31fd9a50ef2fd83e0c legacy-trunk
+28267 5b656c3e132b86741ce6c5a23326cc7a512771b7 legacy-trunk
+28268 a3ebd1233c00eabf909be82223ffbd5f18fa925e legacy-trunk
+28269 e5014ac97ba1879a6e49465983446545beb94bbf legacy-trunk
+28270 b54cfa98b66b9b34c634725b8ff35009a02400f7 legacy-trunk
+28271 f0dbd5b49d8a01f5197d106c41ded8c97340d420 legacy-trunk
+28272 255d1d3e66a3ad9b2d3bb1a1606dbf1aac49d4e1 legacy-trunk
+28273 2306001f6eaa350fa0597231b68bde40c4d8c421 legacy-trunk
+28274 9ca89642337432cd38ac3c7b6ec6eaf2ba984004 legacy-trunk
+28275 df2326a4894dee743aab94a7eaf90550918440eb legacy-trunk
+28276 258e0b1347c2ad868d3b678438f87f9453221289 legacy-trunk
+28277 9becfef6e31a6bd707eeebc76673f6cc548cff82 ast-branch
+28278 4f13e59fd0a03f9650af7f6d9d232a97d2ecae0c ast-branch
+28279 cf561e612378c1a3afc9dd24ec1ddfeda86362c4 legacy-trunk
+28280 99f5d18be5880386da6427530b9d8b7515827173 legacy-trunk
+28281 b517d9292ce7c0f1f2632a23d9ca17258664b75b legacy-trunk
+28282 8089ba397480e40ccdbb655258e64df8099f16e4 legacy-trunk
+28283 725337b68ca02b3c1a80799f838e81cf42aee356 legacy-trunk
+28284 fc7403e11878330c3ad4f857dfaa5eca3cacd1dc legacy-trunk
+28285 f485104e4ee852b4c291ec9dd64d23f9935bb874 legacy-trunk
+28286 239bdabb63af9d717fdd9c72f48539c5de43b3e5 legacy-trunk
+28287 710bebe2182cb144a199d2d9f017c3dcde2b49df legacy-trunk
+28288 d3541d90d5e06e5bdb06417f7f66857d22f0fafb release22-maint
+28289 aaae6932177171838bdf937730955acb28cfb569 legacy-trunk
+28290 5ff3d8aaa8f8a06b1829a0343c7c76a0cb3294f1 legacy-trunk
+28291 c4e550702a29a3459ded126fe408c2dcf96db80d legacy-trunk
+28292 8791193b09d6417be4fd60ebe28b2f8c38a352d4 release22-maint
+28293 02b2f0885c5210240dc2fb139140b2576020641a release22-maint
+28294 d797cfa8ca0d045d5d3aa0e0b1909801e0f22a34 legacy-trunk
+28295 24f1d845cdb57331aaf5a4d715e6556f0d8576f4 legacy-trunk
+28296 492addb812ef1178081a9f32dfd1d44c6a5ab51a legacy-trunk
+28297 d7ef2ba1b6f5ef0ac1f59628dfe556da993d66f4 legacy-trunk
+28298 aebf8c52a842d41d92a8e63004ceb00ac35d79fb legacy-trunk
+28299 4e4a344c9b6ce7b0c71cb52800e60408f8f148aa legacy-trunk
+28300 44d1d0b623a9af7942ff7b15862158dfec1438a7 legacy-trunk
+28301 8862bc59685acd637f5af4664cbf6bfb0dd7d9df legacy-trunk
+28302 c8d9592c9e7497a217a20200487148ec4b4d8dae legacy-trunk
+28303 27f0deebf2648afa557d6a54d13649eba924bac2 legacy-trunk
+28304 6310a4a21eb892ce3fb8ab7419281714a65ea915 legacy-trunk
+28305 a869d2de536f8d30cc6e7c6fd3501f4b26e9d77b legacy-trunk
+28306 8f8fe990e82c334f50cc6a5fe9dee12c42b8b6ce legacy-trunk
+28307 2cdf3d0dfabd5010a69a7dbd6178b790fe26ab7e legacy-trunk
+28308 bc660f73795cd7ce0709cdc88a76acfaf1398069 legacy-trunk
+28309 f57d6db423f2dbdb473b8c5e7519a4983909c1c2 legacy-trunk
+28310 ecd4ada252bc09ad9a85f4891d0acd39396f1e22 release22-maint
+28311 641786bea13e2b5a61a7f8ea429b20d965d7546b legacy-trunk
+28312 aab7debc73a88e2135dc718ecd7227f71ff7d061 legacy-trunk
+28313 31145d667b14a5e664d741ecf385fe3862767e4d legacy-trunk
+28314 b3efbdccf7c64c0bd57f46c2b5044fc610989363 legacy-trunk
+28315 c6ad603bd2645aec8be6509f2df828ed6c0b3706 legacy-trunk
+28316 5acae719cb8aba5c44ea83533a619447e955f880 release22-maint
+28317 5c38457f6b3b85b6c1b741483046d9d406216cb8 legacy-trunk
+28318 35fe5e3cf885f646a69e10c0924f7c11a173046e legacy-trunk
+28319 0ee48aefa4749e73d9173bb99e7e62f60ab7484d legacy-trunk
+28320 59acd502880447f40e2dd0d38bfc48c767a6da83 legacy-trunk
+28321 684ab0640e04fa0ffa893c85da3c13b6294b3ab1 legacy-trunk
+28322 01e1d6abc50122f28ebc1453e58da829b5186dd6 legacy-trunk
+28323 e3d96e00dc6c1c3339f39efe34f5d6da37345c8c legacy-trunk
+28324 886686fc92a99cfd1d3140904e7fab20d4273a04 release22-maint
+28325 0d5d8e1cdc22ca16706dc1ce502d294dbe65128b legacy-trunk
+28326 4cb253c556b10a3d4b9f41f731fcb592ebff8787 legacy-trunk
+28327 714797156c512b94dee42f41bc016c24aeb6f9d5 legacy-trunk
+28328 8eef03850f57767fac70041d5dd837691e8e7e57 legacy-trunk
+28329 5fc46098158920575cda6b749666d07668ee1e18 legacy-trunk
+28330 51c26994d8ec69a7307989230f37592686d00223 legacy-trunk
+28331 a1143224ee0d0f7694a9468aa156b1dc61a50abe legacy-trunk
+28332 940605d4155fdc6793c10443ee84948dae1dedf2 legacy-trunk
+28333 d2eb007448a3e658ad67240a4fdf6993c25b6196 release22-maint
+28334 c4a4b742ad6c65db3e17e3c6fcc00a87b2f33342 legacy-trunk
+28335 0dd5bcc1ee0bd3e9988f1f7f629b64e45b00e0d2 legacy-trunk
+28336 419d47c77143428efd6ec055b6f9d08a3031fe4a legacy-trunk
+28337 e8f77307d9c6a28d017f7f515fc3780e167450e9 legacy-trunk
+28338 c0e980ab54db3bd950a63d25ef11195d7d017037 legacy-trunk
+28339 617bd55b4a6edbc24f4ce5e7eb237893d40cd3fd legacy-trunk
+28340 9ee4f4cb977069981a41b49e59813cb6b75e3288 legacy-trunk
+28341 6060cf6682c025698342b954637f551f75a6b9ab legacy-trunk
+28342 64508a37a8d5b50c81c1e18e8be358bd7c1b6505 legacy-trunk
+28343 294f7be2619a6031ed9cf378a6a0ac5d55f4eef4 release22-maint
+28344 219e7038907267997cda7391977bd02fed054c9d legacy-trunk
+28345 e9500709d49c98a86d05c2f6fd3cf5ba3c7074ab legacy-trunk
+28346 2b66adde02306692426a3c47d4d06b908ce9dcb5 legacy-trunk
+28347 bb6a71d3fdcb755f8747bc141ece89484649cee3 release22-maint
+28348 67048454aa1e7467939d72cc0865a89c305ba632 legacy-trunk
+28349 d13551cd663e5772e8e329bca9f9488b419b3269 legacy-trunk
+28350 5306408657fc664aac0299eeea501d93c8411be0 legacy-trunk
+28351 54b601d3b2a6dd91f265e463c22ebf367f122e84 legacy-trunk
+28352 7417a6dc736662d3a1bad7a9115af5e438c22489 legacy-trunk
+28353 0c201548d3d4fe5395c262a05e188333624f79c3 legacy-trunk
+28354 544a326baf7f29f1263b0ce5301fdcfd1019aff9 legacy-trunk
+28355 8adca5f9bffd86fec632f4eeb989f9e20421d04d legacy-trunk
+28356 9f26e0c0c6927104bcfb62d0b033819bd342fc6b legacy-trunk
+28357 13388cafc16e9633b3f1d5230b006e1330d53994 legacy-trunk
+28358 1bcafbc69c967275dd7c470ae5c6d9882f8b852c legacy-trunk
+28359 6a18b4e838eaf3f9c75322923e0b711ad2ea474f legacy-trunk
+28360 330f6e42274f8387c08d5724b78f2eb22128d0ae legacy-trunk
+28361 05da95bcd724dff7e78e47e473811436857c8e42 legacy-trunk
+28362 c55e8d6c091f033cf7eeb636de437b58dce21f1b legacy-trunk
+28363 62810beb9af477730bcf07fdc786ec664a2066f0 legacy-trunk
+28364 dc66eb4cd17ac2a000ff19060e8a38441a92a69c legacy-trunk
+28365 6e78a54bac3c84041bafe3c00303f545d8ef089f legacy-trunk
+28366 8b6bf5bc51226b7228fa316c677f8d50bd22fca1 legacy-trunk
+28367 b933d19ae8512cba01e7264ca45d1ea000181367 legacy-trunk
+28368 043eba518c689cbddb371e5b70ffe9904c5d9205 legacy-trunk
+28369 c1f682beebea1cf1e1e8eae72799723cd3cfcc33 legacy-trunk
+28370 73fbcf21b2c0fbacc9f72d447896dd0934a3a449 legacy-trunk
+28371 d90a6add7ca398287c0f9468fa88dada67e3f11b legacy-trunk
+28372 1b4ef9cd189742bc80aebafbe5f4dddd64320689 legacy-trunk
+28373 c45b28658805fa6694e393652eb01929358b2ae3 legacy-trunk
+28374 80f65c63e860c26dd5b2732a863572a1a64f8c40 legacy-trunk
+28375 95186591cbcfeee146706eff08e3c57387c2bdb7 legacy-trunk
+28376 81679ebec07d719ba6cca59e2d5b7680625f4a63 legacy-trunk
+28377 f6581299bc03b518ba7dcc15198f8767a7969dc1 legacy-trunk
+28378 4263638a469f8db867db098ca30cffbac72a023b legacy-trunk
+28379 8ea117ebb2f349de5e8e3d4419f78aa8e417ffaa legacy-trunk
+28380 668eead13a7c57ee65db60ff18ce93754848b6bd legacy-trunk
+28381 7190348d466dff5d66056caa2273a2890640f1bd legacy-trunk
+28382 7beb16923b71bb70fe95af36a658e6986f928ddc legacy-trunk
+28383 063f2031660c3e258f36880f5d08d43189b3277a legacy-trunk
+28384 25f6954fef3423d07b8f3af8e77585d73866e24d legacy-trunk
+28385 b1ab4e8d7d9c5a0b289f3d4368c89c2b44c7cdbe legacy-trunk
+28386 80ac86194a12bb94ad621e7c21e36d5ef69e9bf1 legacy-trunk
+28387 9e11bb83d953ba3ab61e3b963e547c57cedf1556 legacy-trunk
+28388 ee99d222570a94600df070038ef73d44fcfa8ed6 release22-maint
+28389 22b70c3983b538cae574ac8cd7bf941098821351 legacy-trunk
+28390 4bb776a02e6e84f8a7a082c5c20e964061e9a951 release22-maint
+28391 80d035c451493ddec74fcb0b244e49b4ebb1734f release22-maint
+28392 1461b94606c5414eb29b1657aca77d1d34d82bd7 release22-maint
+28393 00f11eedd603345cba9923a36dbaf056534516cd release22-maint
+28394 9130ea6693da7ee99a3c4e3b7d53bd05ec7ac1c9 release22-maint
+28395 0d6617a9cb610d2722aa252370d5132a3ef34c40 release22-maint
+28396 f4bb0ff310d3489c23f748642053e3ded6cbf399 release22-maint
+28397 bc81ee20628f3cc9d5010cd418978f5ae2dd6a4b release22-maint
+28398 6461acdeb58c9082afee8e564f0bceabcdee6104 release22-maint
+28399 c5417f0ee5f0802b187389b718b12d31b9455471 release22-maint
+28400 fd066d194cff41c2bbf7a4a5a3a7fded56c45cdc release22-maint
+28401 5e4eadf1903a028e655ab5829ff5100e902e586b release22-maint
+28402 86aa2c2da40e4b52cc6dee103f5337c6e66bf7b1 release22-maint
+28403 c512a9433eaf3b3f160bba6905dc55535ae73841 release22-maint
+28404 a0dc6f50497285a146b120f93a1e58dc4655f83e release22-maint
+28405 ac468e20b4ced8bca06ea4b8eb059e5ce46d498c legacy-trunk
+28406 3a7499431dccf3cffd1ff48dc27f32bcb900f2be legacy-trunk
+28407 f95c0b894f2766e92de815f948e819a9aa8bb60d legacy-trunk
+28408 2cccf8242009bac5598b262b393cd11a6a4a59d6 ast-branch
+28409 fcb5201c69ed86752a584663a456a3a53da05915 legacy-trunk
+28410 48138373709b47004043c4390b0af042a408afdd ast-branch
+28411 bbaebe6b7c1adfebe7da59c5baeaf3027260d611 ast-branch
+28412 0b726496cf44f17adfe3b7cbfa46276e4cce4137 legacy-trunk
+28413 59b7f4e9fd61470dbddad0a6e505ae708a504490 ast-branch
+28414 c744144c4049df6737adde7bb0d6096ceb8e052a legacy-trunk
+28415 94adf699618fed5ad47c7020198c788d0bcb8da2 ast-branch
+28416 8fdb0877d352383870ab09b49a9070f908616e60 ast-branch
+28417 762dd09edb8342fb048439fab6ea81d62c131d64 legacy-trunk
+28418 b43986f73fc9f8a28ad9df67033078dd07e6172c ast-branch
+28419 f82475d7841525c86f58ebd82aa504424162fffe ast-branch
+28420 12bb6f0c60f8c638c12cbdb8a4f4692f4b71ee14 legacy-trunk
+28421 0857aadc612a3358ea24cb144cbbe4fbf04f06c5 legacy-trunk
+28422 b5b70e410f124f8eb95936ec7316475068ec2161 legacy-trunk
+28423 acecdc4f733363c4e7e1452abded6937713a5ba4 legacy-trunk
+28424 c68311efd346ed9f4067789233464a01d5a229d6 release22-maint
+28425 d421bbc9961c8cfe0aa2659b20c80c6874e19af8 ast-branch
+28426 35749db10809305610050fbf61b5d855cd2b4e1d legacy-trunk
+28427 f36e16ca8f50580f5285ed83e3212f060ed1c561 legacy-trunk
+28428 f2d75749e61c5e322492a1e28cfdcdc079d30318 legacy-trunk
+28429 68627e0acd15bab85baefb3da2ada9edb6bae38a legacy-trunk
+28430 feeb0b02b8f2529e5e40c97aa3fdc568e9a87eb8 legacy-trunk
+28431 24e80d96bd0b6e926ab98514a0444ef68eb57f55 legacy-trunk
+28432 0ebec83eb3ddfc1c5b5a2afd12de762ade3aab34 legacy-trunk
+28433 aa4503556339edce0374932abb25d9a44a7e89b2 legacy-trunk
+28434 81be61056717f88136062fb72889f7678b512fa8 legacy-trunk
+28435 bb28bbc28c323ab29d50655e26788890c46c6c76 legacy-trunk
+28436 e41058845b792ed6627e984f0ccb12d4c01d26f6 legacy-trunk
+28437 90b13d99982710ff6c39e092beca67a7391d32de legacy-trunk
+28438 81acbe1680a3308bb818ae0632f77f915c1b0c50 release22-maint
+28439 a6de50c0d457eb61cfeb5992d7511c0cc81d73fd legacy-trunk
+28440 049096efa2c3ca876b19c37b2468d73845fd960a legacy-trunk
+28441 8fa753a97077ba09ad5c421c00707cadc09036f7 legacy-trunk
+28442 2c2b84bda141b7a4c8c5931eaf7a0f6a2b272bd5 legacy-trunk
+28443 3484309573f21c839c775392b5cbedec1123f180 legacy-trunk
+28444 ad289fbb6b48d72b7838e83fe0f30b7f87f36fa9 legacy-trunk
+28445 aff067ba8d0788f0a937e9be3def6250b738a587 legacy-trunk
+28446 8c61c92025b6c77b83e92bc7893074b047c1dc64 legacy-trunk
+28447 40e9cfde1c50880a1f18e0a4bee1313cdf49187e legacy-trunk
+28448 7fb3759d3866d5084e4a222592f0dc76795e848b legacy-trunk
+28449 8c8052378017cb453b0f231550ed73ae57605298 legacy-trunk
+28450 4e996e959ec187c7137817777e71c104ed01d287 legacy-trunk
+28451 d5ebd616a3e6f4bcd58093bc55c38a36596c1183 legacy-trunk
+28452 0e01b85add8126e6ac737857ce99eb6f03b1db33 legacy-trunk
+28453 7d3f8306a01ed5ae543eb848afc59fdf84db70c6 legacy-trunk
+28454 0b9792cbe90042b17701ed324393c16e667d38af legacy-trunk
+28455 3647b30aa9de09ac56b2db72f74a16e4ee264983 legacy-trunk
+28456 db49ee76b7d0e3f76dcf05ba2b324c83910703ec legacy-trunk
+28457 ed0b02672f0905dd0a9a3fa60f2fb05b8f201ab0 legacy-trunk
+28458 1189f77cdf845d2ce79e9ced02f86e2107032fc4 legacy-trunk
+28459 8cf205892f66289606cc26a388b53ecd33451abc release21-maint
+28460 bd2aa0247adaad8c46a97d97472440c99ef6765e release22-maint
+28461 76cf88e89376dc254ad7ff6120e6f831c0946ce3 legacy-trunk
+28462 434bc1dea4f8ba7e77d6586b33ed4ef7bd11f03c legacy-trunk
+28463 ec373696c17bc3786265c9721c7f99fe1e64be77 release21-maint
+28464 d0413de143ec245ab0e125fce3d33085f1384b99 release21-maint
+28465 d83c14ae647dd0310c1aa0fe05f0fec46d3b5ea2 legacy-trunk
+28466 4029d67cdbd5fdbd4225fd77b8847e0b0383dd51 legacy-trunk
+28467 cbee2ed6cd755a7727b3b8ea026c86cada534464 legacy-trunk
+28468 a7a60b141d1da6838dc9e1e1c33499995e6b7531 release22-maint
+28469 63ca12aba07934a59a5f45c737ee6f7f8cb6ddae legacy-trunk
+28470 8e8d3e4af4f46894b782c9a7d20973b12e22f6cc release22-maint
+28471 1aa0815fad4b11671c58135249a9f9efcd041fb4 legacy-trunk
+28472 e0b855aad2302092e336dad0167b0e3f31a8a516 legacy-trunk
+28473 e2042c76af06560cca2be6a431da95d8eb6ba399 legacy-trunk
+28474 b8067ddc11f87a97d45f3fe72759b3ae1cbc34e3 legacy-trunk
+28475 ad3be471b399219330685d41fb9b2f5df8212bfe legacy-trunk
+28476 0d492902894a558870e753c46eac49082d5c39a1 legacy-trunk
+28477 7c76c0fc2e92a097bf8e900583b1d5a24e0a5e64 legacy-trunk
+28478 100f154982c8bbe09ca518ad0f93dcd4b49f8c6c legacy-trunk
+28479 7dc7ab5db9099e84649b4c354b1d4d1180169f20 legacy-trunk
+28480 81a36d2a2d137d1209b541823fede4d37aa82320 legacy-trunk
+28481 5a88f174b684cbbf80c1c7b7164ed802308c38ec legacy-trunk
+28482 ab176e164eab6948b27925e4f21ade6f2d0ac2f8 legacy-trunk
+28483 46b050455533683bd8dd22706efc16c7002852e4 legacy-trunk
+28484 03eadc57d4299c414a1de9912d63a9267287b3b5 legacy-trunk
+28485 8231f86c8628a4639c190140ca79ff4909ce5a12 legacy-trunk
+28486 274fa0b34ca7e6b3d44a115dd7268aa21514da10 legacy-trunk
+28487 05b15ce28e31fa4f94a852948c40d3c82145e0cb legacy-trunk
+28488 5fb6f5bb7698fb8f9911e2f98f0f2020e6d47626 release21-maint
+28489 efc128a334a55f274a3bd1c31c9623f21272eec0 legacy-trunk
+28490 825fc85523257d9e90c67228a9cc803c3b5e4578 legacy-trunk
+28491 31a774a6f604b570f91716e558e7daf4a41d3244 legacy-trunk
+28492 6a221834ed7df42e80c201a11426077dd4e62900 legacy-trunk
+28493 a54c5cfa3f8fb214cd35f41b9a1f8cc473e526d6 legacy-trunk
+28494 be2868a63ed53d1f24e4c071f48906e5a13928c2 legacy-trunk
+28495 004de1ac23c44233d9ab4201feac3a6181eaf354 legacy-trunk
+28496 4aeacf9f9858e45fd0200414be83201d16600396 ast-branch
+28497 26c50f322622002280bdf32c8ea799bd2a766db9 ast-branch
+28498 02e0e6d3813e9eb342f5d36a84f42c60192049c0 ast-branch
+28499 8e47361c4b5b03949be9271fc14e6f5445b7c901 ast-branch
+28500 13e90e3c4c9931bff5b057b80a7b9fa7b2cbb0b6 ast-branch
+28501 c556906479613012936942c972b3324ca64d0c35 ast-branch
+28502 89421505db5903293dbea0aea0225e3b3d8b1968 ast-branch
+28503 0c54488a748219ffda8be6ff8c8546d5f3f62fdb ast-branch
+28504 ed2a8c548c444d8b9f95cbd365e0154c446bac99 ast-branch
+28505 5a1016b2c440cdc1a42e842e8ab3bd6f44e5a055 ast-branch
+28506 5a41a70bc5d17ce143ef69b11bdc1c48106aa602 ast-branch
+28507 2be969d29510ba9c4cafbedfed2c038a46491b09 legacy-trunk
+28508 9a2de39e8da75fbbfeee4b260dd4a7f7a4332024 legacy-trunk
+28509 70603f48402946a2387e0e35c38821299ffb8791 legacy-trunk
+28510 4c4f92b0af9036954320fb52e2b7bf6c11ff47c5 legacy-trunk
+28511 b337ef16c0d2d8bc3130d73544c775731a661a37 legacy-trunk
+28512 5fe4d93df429134ef8695c12e59ff962ff8b73d2 legacy-trunk
+28513 84bfb8a805fc9ff66b381ee1e1646c1d3212a346 legacy-trunk
+28514 9a178adb4e2db00872dcc5fc579301dceac4bf56 legacy-trunk
+28515 19982c5eb493af09a22f507a5be502ad57e21da4 legacy-trunk
+28516 877198705c92adb028daa2e06aec994eab2c14e4 legacy-trunk
+28517 c149d39314344740f4696c95065adafcd4b4ea84 legacy-trunk
+28518 0337dad8403e10a7358be5675f32663940ef3d03 legacy-trunk
+28519 427efc35b5beb6deb9bd29f0231be57683d32058 legacy-trunk
+28520 ae1469e468a0490896bb1ab91fecb9ce09494207 legacy-trunk
+28521 6a85a1c9d33d8f3af32e74461f037a03752d4e47 legacy-trunk
+28522 1b80e0fd5a4814598f44a557068e6bc8a05efc03 legacy-trunk
+28523 98ddc4297f361de5dbe9bcb33452f6357503e6c4 legacy-trunk
+28525 5672b1573855a515aa363fd7f8e7dae2b4270b9d legacy-trunk
+28526 73b2cbae9d9017804370ce5beb5fa99c70b2665a DS_RPC_BRANCH
+28527 c02a668488d082c4d0db8b3872777e68c1a2c2d6 legacy-trunk
+28528 a69a12484d69aa866e67268f7a761452d03a2752 legacy-trunk
+28529 bc590beadf0bd17634bb0e1f642db6677ad7d38b legacy-trunk
+28530 32331d26d7cf19114f1f80b3eeb59a5579f48e95 legacy-trunk
+28531 8a16de0be11178092bbea05065014c7ad4b47efe legacy-trunk
+28532 f9e4243ff792e79411c188a5116de25c686f16f8 release22-maint
+28533 4b580a4625080cdbeb22db8f140a5a05ec5b4b78 legacy-trunk
+28534 39e09f30f7ef2846a7f1ab596230e1f44c4e6d3b legacy-trunk
+28535 c0d5ff8555adea4705d4556ffb099547ac8bbb65 legacy-trunk
+28536 0ecb3cabf40b9a86e636cb997876b5d671ff3357 legacy-trunk
+28537 3a26e352f0a6d275ff1e077c80aaa8cad2129de1 legacy-trunk
+28538 00b6dd414b80461fb7801a4e8c1d6d3e1c1b871b legacy-trunk
+28539 0401a0ead1eb3347d120d2a0814dca522f12b813 legacy-trunk
+28540 b470b417839d8cb46df31a345270b7e32e36efe1 legacy-trunk
+28541 f0ff060cd194e5178725e5c92821766940382c34 legacy-trunk
+28542 fb334b1a56a65c07108ab38be819307071933e5e legacy-trunk
+28543 a2b1f3c11387a64708c85ede088cb1d1d0b50db7 legacy-trunk
+28544 8834385f29bf5410d9f728aa0d37a6d76c578894 ast-branch
+28545 75961cb3747f9db9bf401cfd1a94fdb14031127c ast-branch
+28546 69293b849d85807b4d6e181bb246b550aa2fcae8 ast-branch
+28547 7c73338027149b20c869a9f40da5233eb687c35e ast-branch
+28548 4ea08110030529b8b8b28df95b09c82505257db0 legacy-trunk
+28549 efc0edc30fea4350fec0c05bdf9e33c5632f3e0b release21-maint
+28550 3015c678f81ddf850df100e5a86e313dc0750006 release22-maint
+28551 0ce2722a3e154d0934bbb9b5526edc5e938f8284 legacy-trunk
+28552 4c8163a27640297a6b1cbc99f5d45df5d2d8998c release22-maint
+28553 953ebe0c0c25eeaae3b3ef78e54a18be09808f8e legacy-trunk
+28554 c7310f348c78e2afcafb6acb1beaaa963e1f98a3 legacy-trunk
+28555 e500f18f3131282a97e7c6fc3f5a46ec315bba2e legacy-trunk
+28556 6b67d26079f255690ecfcc22de2b20757662bef5 legacy-trunk
+28557 27c718c82efde146c4f89c174468fb6114d6cb6d DS_RPC_BRANCH
+28558 48d108e5b8841a0e89389f01f8c03e0e984c5981 legacy-trunk
+28559 172845c09afecf54253a4f843ca4ae7ee35d104e legacy-trunk
+28560 56f9f5ab6ec11f8a9fc3b68a4a1f8c2dfb2b021c legacy-trunk
+28561 5165a0ee84c620a6f6ecd03d53adcdd942c67a47 legacy-trunk
+28562 f1c69c32c42b2beae64933cf3ba356b3638550a6 legacy-trunk
+28563 964d6888a2368e9e1c0c12e4c4346a230be855b4 legacy-trunk
+28564 368bc3a4919e305c5c8372fb3506ffeb90b0867b legacy-trunk
+28565 8529e558f71d742fe5bf7683f91206dd1771a4c0 release22-maint
+28566 b89ebd57ceb4a95f2cb3804ad34ffd1963c35da7 legacy-trunk
+28567 38fa74a205ea56d8566f469f5d404a4704450961 legacy-trunk
+28568 cc53ddb6424f3b41525f908e73d7ce6d4e957b46 legacy-trunk
+28569 0f0016632be49f9f09a050290d4abcf817bf5b36 legacy-trunk
+28570 0d92eb63db89ae894b8b0488aa7b1ce8b1b88a7d legacy-trunk
+28571 ddad367b80c3d46812da2dc5b8e389d16aa47b40 legacy-trunk
+28572 80634ca02dbf9364c2122192f91c30d4c09accd1 legacy-trunk
+28573 d446b5151316ea82e78053a015feccbd4eaed3bd legacy-trunk
+28574 af6945f33b0860ff10c060024735ebb1b9e2ef51 legacy-trunk
+28575 be25d236f286dd4e71aa11d9a72a0a003fa548f8 release22-maint
+28576 deb64dfc84166ca515675233b1360c86dc7e2473 release22-maint
+28577 65e0f2e395ac83766026bdfefa6ab2e023ebfab7 legacy-trunk
+28578 adabdb99ecc4ee746d28cc532f12aa985079b2c2 legacy-trunk
+28579 4b154f19d1af2f4f0edc3d3f4c9903e5f8bbeb07 legacy-trunk
+28580 0e2366879289e2260ca2930bf855d9f712fd3074 legacy-trunk
+28581 4b205e0fb46bc1f86122f67cab6f38eba9409982 legacy-trunk
+28582 5c24338f3ae5f422b69b439f731b1e619486cc7f legacy-trunk
+28583 10f9888853cc60412bcfbee76c1a84f97bf98422 legacy-trunk
+28584 ac741587e66b9234748d6deb4d1c98d926161106 legacy-trunk
+28585 5cb8d572b4def01ac3c22d51c2bf4ee661b07e64 legacy-trunk
+28586 0c9dfd5a06d4470c0004299ac45b06a411bb678a legacy-trunk
+28587 741edd1ca23a8be9bf4d6187f5d11f61a8ff2c2e legacy-trunk
+28588 e566af94648ba6632094521c8c407abf043de4e7 legacy-trunk
+28589 645dc33cd481240f08597b5d36fddecf7ae61a27 legacy-trunk
+28590 bf90fb71aa76d93a3613126cd5c9392ca35990de legacy-trunk
+28591 c1ca03ee516e13dc6bdb088ceb6f7be113b3ad6c legacy-trunk
+28592 0f0d3474f3f689dfe2137d53f8aac41c69e2f264 legacy-trunk
+28593 13a5f32628321257bec7d03bc068d316ebf782f9 legacy-trunk
+28594 e1617156f93fdc9a738bf4b2f69ba02063ae65d2 legacy-trunk
+28595 c213e9b8002629979e59191fb07ab3a1ddfaabde legacy-trunk
+28596 a37cfc1c9716c7a65834f93aa3960bdafa51cfb1 release22-maint
+28597 2ac10d932d7f559172b36b989f44ccdf8bb52d0e legacy-trunk
+28598 61048ada05bcc9549327d8a5b61263aa7e48ed3d release22-maint
+28599 b6bfaa6ca84d054a8189dcb5f700d4974241d23a legacy-trunk
+28600 b8b92b3f5b17c6ecf9b790e99bc177a15ce15f33 legacy-trunk
+28601 98d8bb2ee4c338481ca1a7a1ae2b1bd62db2175f legacy-trunk
+28602 40c3519139de8b6c0203ce926b421b6521cd0c39 legacy-trunk
+28603 9ee2fb27d33a72184c87b232dc1e9b20bb4d3df1 release22-maint
+28604 13d06e5c8a5c3ef4b9550de625f478d74851e285 legacy-trunk
+28605 1c0197f49c59c037765d58a221312016834849d8 legacy-trunk
+28606 5a17f0978326009c06a106bff9685ef997da0cd2 legacy-trunk
+28607 f4e9f09df4f23983c638b0186522a7bcb39190df legacy-trunk
+28608 29efc2d83ade619a0a36c6a2762a2451967e0c57 legacy-trunk
+28609 4f4003043b50131ed7dabcd000d1a8953fc7279e legacy-trunk
+28610 038711ae13e0e18348a531018b408c4a83170b5e legacy-trunk
+28611 bcdb60df4e3efb3308b9e8515b9e4105d6ce6b9e legacy-trunk
+28612 3efbd1943b8c1e888cdccf6e3d3a2e65e79e0f0d legacy-trunk
+28613 1150560c1003108f2661dcc691462a4f29c062ab release22-maint
+28614 24fe2ac5adcc19c98924809d9608c9ca0c8016e3 legacy-trunk
+28615 8a6f54b763434076c92e6ff45e456c7170980cda legacy-trunk
+28616 4b9844188d04e70d27e0f569502a98cc74c53863 legacy-trunk
+28617 18160cb636509cfe4dcf62569cc9a216c9cadd7a legacy-trunk
+28618 a0be182631cc3babd2b7444cad6f52d86c283a2a legacy-trunk
+28619 46ac365396a49784cb201d9d152fc80e0c8ea783 legacy-trunk
+28620 2bf098924ba40952d346bdeff0190246f6b488dc legacy-trunk
+28621 f1885b99a39cdac67c6afe0f08b5fa3fa176dc61 legacy-trunk
+28622 b3c458e3c280f8fd61d249a2e204d18b773e48b8 legacy-trunk
+28623 46e72a708857844b82fa05a018bc4471f9020aa6 legacy-trunk
+28624 90960f7f4f3144de1a7b7008bfe856bfab70fec6 legacy-trunk
+28625 45df2de34cd39bf7cbe264e7092a1c0463528e0f legacy-trunk
+28626 5d207e57d040140ce3b52a76ee2601d723df9d95 legacy-trunk
+28627 5508e04d497c68516fadeeb908364cf61eb5058e legacy-trunk
+28628 96dd9927e011d8b15a5a43cee992781e473a6f91 legacy-trunk
+28629 4b32be6617785d350054b5d4ef98e4cda88a53f4 legacy-trunk
+28630 47081a753ecc48264c6d928b17a78e1dc377b2e4 legacy-trunk
+28631 64d105dd0823ba9b884a0db2d0d89b532a318a7a release22-maint
+28632 8dd6f55fd4b7e7ed9c5a7fa0868e84837322b274 legacy-trunk
+28633 c184e4168d14c8e979cf585a3fb190e06f6c8347 legacy-trunk
+28634 cbb6cc79d336507545009c6b7bf77c5e5f2ff503 legacy-trunk
+28635 27f8354f41b6e72468ef9278a2c1239ff277485f legacy-trunk
+28636 afd0030e4c38c60fd9a6658dbdf2626c6dfdf4f2 legacy-trunk
+28637 abd625417a5359a05390b8c2fe50dc03b287469f legacy-trunk
+28639 2e7fe55c0e11ace76755c59d5fd72a9bc56604a7 legacy-trunk
+28640 2d13f9d9813577df5e7f86da90511c8080ec4a43 legacy-trunk
+28641 bf75f3a45927ffb30a3530b40f98aed5a960855e legacy-trunk
+28642 1e46da1e65226d07ea5103f24bef134a87217ef2 legacy-trunk
+28643 2490cf7e68a44ae1ea547ec2bd1df915f3145160 legacy-trunk
+28644 9f3ea37dc43cb7858f407e4867982872b80d638b legacy-trunk
+28645 76768adb6f2328b2e1e11808c68830f693575bfa legacy-trunk
+28646 cbcd73f587ad7a49880bad907935d77d7a3f4b69 release22-maint
+28647 12949eced55ff7d9c44f9cafe37deaa546bba244 legacy-trunk
+28648 75cd4c203d8f3bdf3475bf44043b6eec1def871e legacy-trunk
+28649 5330c0620810e5daaa8a7bc38ef7bf5c17c20fc3 legacy-trunk
+28650 0220b0075a35d4985a82c15cbba962e80f877a49 legacy-trunk
+28651 951f5f28f2feb33a394bfa1167a031cf969f2b64 legacy-trunk
+28652 cdad6b0921d578253115990cabbcb8c42717c815 legacy-trunk
+28653 4fd0b76c749eeb61c7b75d934686b0941be65e7e legacy-trunk
+28654 8a7a2f1f88f06534c6bd3902c81b7937c5d43ab6 legacy-trunk
+28655 ac0e1e931f3900c9ed60a621b6654f199ba917c8 legacy-trunk
+28656 40e5b2da9f2843cb2bc38f5872aac554f6f45e0a legacy-trunk
+28657 5f5f1c8257844000c5ffc41c71280ff62e8dbdce release22-maint
+28658 2b1701cd4566214f66a4dc436efba65c3c2ed2e4 legacy-trunk
+28659 e709a3c8bfecc5dfdcbf180231cbbf8c1061b2ec legacy-trunk
+28660 23a2bad8d82ce6417ebff0bc38609bcdccc812aa DS_RPC_BRANCH
+28661 fd8aa7aed4d51e6cf786eab39a225eca2f1773d3 legacy-trunk
+28663 19904750c3657c7573633060f8f3e73fb2579141 legacy-trunk
+28664 809c14f1101a95b9063ba7361198da41274c40e0 legacy-trunk
+28665 1a7895f97b30d13873ade977295050557c3a0672 legacy-trunk
+28666 8775dee60d89a559aac9b7909597fd20eb9e755f legacy-trunk
+28667 2970e5e7601ff26be427965d6a60a14db8362577 release22-maint
+28668 8fd4e22e78f01c5c872944bc9c1f5ee69442b255 legacy-trunk
+28669 aac1ee966f56a4d60a292499a1e6c68ea733a810 legacy-trunk
+28670 8d751b62ecc425b4e07ff434574009435ffaa5de legacy-trunk
+28671 96b2ffb77b017437e50d4913ad1f33af6f43d523 legacy-trunk
+28672 2930faf125ca9f3fd45c153b36dda727aedb58d6 legacy-trunk
+28673 7008e53579ebd758ff78f97ead47b2f5d5c68fe4 legacy-trunk
+28674 a0f6419cb13fe6acdc5ced0a10275e143e5a9f86 legacy-trunk
+28675 778f7221f95511552124723ed4c8bbb58b5573ed legacy-trunk
+28676 cc35d7b87852f4188ab9c6a09012a8047daf6b45 legacy-trunk
+28677 c8044123d110b6daaa197b19b51c372c2340a9c6 legacy-trunk
+28678 0bf968ee15c7654ef77753fd6d1391a3a1a0e2f3 legacy-trunk
+28679 1bbedf5481c8bb9d8c804cf4ab3ff75083ea3e34 legacy-trunk
+28680 e1ba41dc9784281682ce24167f33381e478bbde1 legacy-trunk
+28681 dbf3cc1f4733c5ea9bc45e407fe0457d5427c34f legacy-trunk
+28683 1385d179a17ada421141ed8e0e7abf00e645ca17 legacy-trunk
+28684 b128e8a11e295ae23e998665a1c3fb8dc0f5599d legacy-trunk
+28685 480caf7c0a14e045ec28c01efc9d77f3684a851e legacy-trunk
+28686 fc2b73802f7b9d971d85d46e6fdbd5c17615d3f2 legacy-trunk
+28687 1dd7e51fe0be7cab6c9b8a460b916e703b0a80fb legacy-trunk
+28688 4690ca755bec639fbbbcb6f1be243db3df3c0c4b ast-branch
+28689 6b0e846b8d37e54157ae76feeb9b10a426e86237 legacy-trunk
+28690 9fcb77b04f97fb30970ace527e8442751be48fed release22-maint
+28691 6eb8db53f7fcac480a0415305e19d1741e649351 ast-branch
+28692 e205c7de5a5a454a3c37112d3975b96fe908131c DS_RPC_BRANCH
+28694 29559e21cd530493fb45cdadfa905ab275e17727 legacy-trunk
+28695 1bd089b1db7fdaac95b60ad76d36966a8208c17a legacy-trunk
+28696 3db03c0d15310aa4c17971c32689647b3688a3e9 legacy-trunk
+28697 e57e4bb532bab4890216f5f96f459aa19b89f089 legacy-trunk
+28698 04a541e6896442a61666ff8ece847afd48ec4c03 legacy-trunk
+28699 ad6528691c309aa8792eadb64ef0a6e21759f74c legacy-trunk
+28700 0ec4753ccb0fb62e15434b84607ebef84a8eae05 legacy-trunk
+28701 5272b763c29c9ba7f4fc2b009bb6fa5970a77432 legacy-trunk
+28702 6158fca5bcbf22a9f61815a2c032f67dca6498ee legacy-trunk
+28703 4b6185128814c143cc918b08b198ef6aa9dd6c9b legacy-trunk
+28704 fda48dd94b0704931e52ae2dd7a86c3aa264c3ed legacy-trunk
+28705 73429ca748cebbae2e49d9fe08f9e294dadacdee legacy-trunk
+28706 e9a63e483109ce8c9b5950eca4cae16d216f649e legacy-trunk
+28707 85d81e09e2f7d7954a2a46865d654c1454ed50b4 legacy-trunk
+28708 6ec1546840ae662ff85af8a3699d100d99cc61a6 legacy-trunk
+28709 a03f77869b2f549602f1daf5f29978ef230bb19d legacy-trunk
+28711 973f5ff207cc58a5b952d819793c57d32061d939 legacy-trunk
+28712 5ea82cb556823d5bc8a10175a6b60749ae826b8a legacy-trunk
+28713 854dd7696eb2beaca27cf57483afbe88c4759224 legacy-trunk
+28714 57d3b96651b6ec863508479d798bc7968fe80cc6 legacy-trunk
+28715 8ce4ba85396919d1f24f298ed534a00b1c5f91cf legacy-trunk
+28716 c6de68cc8e2bbce970c3d37ed494498dc24db438 py-cvs-vendor-branch
+28717 93e254577cfa531b988d8fa283ba79a20b040df7 py-cvs-vendor-branch
+28719 98e12aa8c5475f57b4327921d0d4a965e69720ed legacy-trunk
+28720 fb00fd93188a7659f83dafcedf8e1eb72d8311a8 release22-maint
+28721 c772640d535e04418a74fed23924bf41e2481446 release21-maint
+28722 6c21e95a48817756d6ad0e1719a9d9d09beee061 legacy-trunk
+28723 9b8924bd5b5ccddd14a66ce1370dcb4bb42d5912 legacy-trunk
+28724 f3d88ee05928d5061c0df4147af476e620288047 legacy-trunk
+28725 4692c487ee911eac58dcac5eb50b623793552edd legacy-trunk
+28726 1bbf8e55a8bb9b0ee445c949ca6a70856eca050f legacy-trunk
+28727 aec0f944f6a01761f303a44031db74ce55ced57b legacy-trunk
+28728 609f3d31d1c24a73088f5c35f47ec0f7fbc4bef9 legacy-trunk
+28729 cd70c8803eb5c0d0a4abab4d2bffcafa5baea11d legacy-trunk
+28730 c97a4ce3c58edabe6871878d709ec060a5df94f9 legacy-trunk
+28731 4d6f8204234a8d69ced2a35c30ebc9cf413fefad legacy-trunk
+28732 b64fc6a1049e9b7157f9fc71d39640a4b692b121 legacy-trunk
+28733 c45564768f526edf9a6be1928cdddf9b88c3f220 legacy-trunk
+28734 055f7fae81509134fe39ec1ac6b41af0fb7628c6 legacy-trunk
+28735 752f6895cc630a8ff4db7afb08387cc958d31a38 legacy-trunk
+28736 f5ec08d458592874c49dec2831b75c63931c9a87 legacy-trunk
+28737 da4e5e46ae3fb9ed6981bb08abe5d1c3a661e31f legacy-trunk
+28738 6777811961526077fa8dbe7994257a2c2fc07096 legacy-trunk
+28739 61c2506ec2e8ea4d0cf9d53554a24c2fc4aa83f5 legacy-trunk
+28740 dbf92c55fbb8b78922c641b6e3e5e210d5498048 legacy-trunk
+28741 40149b50020cbb686ec7784558f73ff52f68c0e8 legacy-trunk
+28742 1b0ea47279c68ad8f40d40fa235135a5e2b1a187 legacy-trunk
+28743 7be26544be4e35e4fe5bc7e7d541db603e6f467a legacy-trunk
+28744 c670945c869522889c205898c360bf016eb8b57d legacy-trunk
+28745 22d198910b208a60674266cc212675ab10064447 legacy-trunk
+28746 1c7ee23dc49e1698ae79505c760c5d392c9be2b6 legacy-trunk
+28747 efe639151bfec5be21af52106291039395101cc2 legacy-trunk
+28748 eb28dcddd34dbbc26e7e20f9651bbaa0455ccf51 legacy-trunk
+28749 df03fcc66104361838735353014c3116bb32dc7c legacy-trunk
+28750 71779b839e09874d9ba4939775a00315af5eb2a7 legacy-trunk
+28751 0399c8aea7b2861d17d82f1b99cf79b379693191 legacy-trunk
+28752 bd6510c5cabc47d95f5f6ff0943ccb71530f2b94 legacy-trunk
+28753 468c3be6c3e2cd12489aebd12677a53300059752 legacy-trunk
+28754 abb768b417a1330d6f43edd68467b8f5cbd95430 legacy-trunk
+28755 86ff95b1c636d5e159e0b458f9fa6c300b6ae1b1 legacy-trunk
+28756 eb7b7b719ee5649de93644e522c35d87d371f383 legacy-trunk
+28757 bd3b92dc940a649ec7ef0d2d1a166b76584cf3cb legacy-trunk
+28758 8eda166b104eca904da2d861139a79e76018ac7e legacy-trunk
+28759 92a3d897e8193ed238d34f166700218b64f534e0 legacy-trunk
+28760 53e2c448b169a32752401aa6d81b133e4ab3c68e legacy-trunk
+28761 b968f038235ea1a55134e8177ccca1e943a6ba7a legacy-trunk
+28762 df0ff5b17e1aa15ddb9d8076a0305dd312d2bde3 legacy-trunk
+28763 e9e74cc5540ad8ba0f1b3de28ac2859f8abf1803 legacy-trunk
+28764 bdc3def3d085ddad1fb8a9e3b982cc5e88ee0df2 legacy-trunk
+28765 823f02a22210d8a6a4ada7427040eef73de12cce legacy-trunk
+28766 14ad560f4a97f81b69f5fd6a9d6675cba19bbe01 legacy-trunk
+28767 f1758272764c70c5293050020d0bc091c4b8d939 legacy-trunk
+28768 7de88cf0783e2cc3c22d56c7da8ebab1db11df6d legacy-trunk
+28770 9c7a06ac8b2772e941cd42f0f0503bd439aa807d legacy-trunk
+28771 24e789b6ccb6416d043f64c9af2e24982c555783 legacy-trunk
+28772 6b62ab8485eb819647cc4716b5b5419e76fe64eb legacy-trunk
+28773 0739046a0c3a514834dfb2ab927b534b592243e0 legacy-trunk
+28774 337fcc24985b344ab6b8838c37de588dae436d19 legacy-trunk
+28775 a3b295918c5fd5a53cf10ac624d6b20aa7bd2179 legacy-trunk
+28776 33b249af4364dc84b8ae21cf5444e6e7fe4ade30 legacy-trunk
+28777 9c954e64d17a94a0b1430edaa568cb0d9ba57db6 legacy-trunk
+28778 a302308819f05da879177359fcdfffdd7e817193 legacy-trunk
+28779 2f44a90fff077eeafb7c2c9629a2f468f803691a legacy-trunk
+28780 2ae2a203f47ac2a6ea59f520ba98788d47c1898f legacy-trunk
+28781 9f61710628c4f295bb516d533c1ded490a24a9ae legacy-trunk
+28782 2c3b5397c3f9ec116896ab8f0be2eef47ed70512 legacy-trunk
+28783 bd24c2598a429d76f1510b8790eccc077fb79bd8 release22-maint
+28784 b529ac2f9ab64b90bd0153adb93284e91b7e5f9c legacy-trunk
+28785 49a3ebe9df14766553a111e7f45da31a3e975abf release22-maint
+28786 6ea8987c746fb55e76940e91e0c73752de1763d5 release22-maint
+28787 27ff694c8c050b45f1a97c994037bd85ccfa8178 legacy-trunk
+28788 3aeca6c50f3800cae8b529ebff8acefe6c318407 release22-maint
+28789 802583f88ae0d825929ffd1a5a01cbfb3f38ca29 legacy-trunk
+28790 c8cb8979062ce7d616b461a051bd925ccac953eb legacy-trunk
+28791 0eb882068a7cee36bf1c929b20369694f9a0a03f legacy-trunk
+28792 86620afb22124bdb15d88a0a4b641ca03db82f95 legacy-trunk
+28793 6dec74f4424209df3a8959a90d801ff2de95144e legacy-trunk
+28794 37fc6a83a134ea72d95d604a640f48481cd40c08 release22-maint
+28795 586fa24459824732b45cdcad49841b43be5f611d release22-maint
+28796 c43c428390118e15438cd20c12937aca5c4ff717 release22-maint
+28797 e7db1c9a10fcb87112286f8eaa860031e0168b8d release22-maint
+28798 033adcbb4cb2a744a9b342574aa5fa5cd65e9539 legacy-trunk
+28799 2ba80a4312ff50207b523b776559fb7533bee38e release22-maint
+28800 85ab4650dfaa6a4312fc7c59689bffb21b8355d8 release22-maint
+28801 96e2effec94d1bea590a637044769f7e5d97f62a release22-maint
+28802 988f425d17665e7dcce5020fb94215817d439981 release22-maint
+28803 46170e560e01e18c7d2a83934d015f8791d6a249 release22-maint
+28804 1f9e9798302bffc0b171b8aab84012877acb1dca release22-maint
+28805 0fbb76b5074b7e91ff4ccdb2b4d350ebfe152a9a release22-maint
+28806 3f5041295448c86be5b9b0678c889833f52eb7ab release22-maint
+28807 5255b45fddc259ab78b1d82d9dfff923daf273ff legacy-trunk
+28808 f3c3e732d12e694be1ccf4502be3c3777decfbe1 legacy-trunk
+28809 52420fe67c9690047da3c8097911825ee345ae3f legacy-trunk
+28810 c6312360c86171fdca9ed227d0ef0736177f896c release22-maint
+28811 37d88b42ed11a8a092379dc8c32f6e27f16a261f release22-maint
+28812 6513466bb7747a0734f9ffc7a275cb2b8667eaab release22-maint
+28813 0b68d810a8becf2b87798c42014463d93cad732b release22-maint
+28814 9dd21c1fad9a400703009114d0978d98a267df9d release22-maint
+28815 786e0e9a5f7f92827e2d57dce1eeb0c1aa857900 release22-maint
+28816 116b0858d4b0bdb0244df4da32a113383a21fd7d release22-maint
+28817 651abcf63fe13d3e26f08838870cc160820860a2 release22-maint
+28818 2bfe44c4dacbf378d4285966e002fc78df2d9a22 release22-maint
+28819 caa3a2fc6a208659db158203814184a7eb656ace legacy-trunk
+28820 c066dc3ea1521698e6c0cbba435dacce5da69345 release22-maint
+28821 e84d324ac66a48865c48fc22f878b8979e41bbb1 release22-maint
+28822 4df0e691f4dae86b07ceed25338fff1f58cbdd13 legacy-trunk
+28823 2dcbbbb007c2ab77c0dee99ad59f6c0cba4914b1 release22-maint
+28824 4d10c3179ead0f562813605ec3b328a7f3763bdf release22-maint
+28825 fbc820d701bca98cbc404fffaa50493b833175d8 release22-maint
+28826 5e4e8c1ab704001312e07921a0a0f4137b260136 release22-maint
+28827 4df807adff873d50b13aa3c9be37b480ba5c61c9 release22-maint
+28828 10767a8c2e2d65cd9e35b21b02419fa31e155094 release22-maint
+28829 0c44fa04f5335efdd8e3302f8fd1ea3b42ad2430 release22-maint
+28830 e53787b1ad8581806c25ea6ac4ab898a10082880 release22-maint
+28831 725f87597ad9e27cc478b1ee251d68a340d7f85c release22-maint
+28832 e8891e6952eb6015cc06008fdc7b707e7fc686b7 release22-maint
+28833 462c35b9ac1fa4a4625c01e7a93c866a43a04362 release22-maint
+28834 80ce384d408a6f9e946e39b2915ea137d5caca79 release22-maint
+28835 911107829903b8ae30b72307d5938417a5da9627 legacy-trunk
+28836 e5e057a6d281f315fd2a709461d2e1a6f0fcc03d release22-maint
+28837 de21e93badf6365833c6f793ea4e6ba8026cf1f9 release22-maint
+28838 7929d7566a9428919780149a9bf48a656729bcfa release22-maint
+28839 bb2033c8b92fddc419e3f19b27d086d7c4cec64e release22-maint
+28840 f559e97a41be4d0b46d97af1e758ecf466cd94e2 legacy-trunk
+28841 30bf55491e79edd9698ad38c9a43b25f1582716c release22-maint
+28842 9ca609f8bdf22617c4786cde733063c0ba7b6b19 legacy-trunk
+28843 88d0f6d6b03ec1ba59f0b203143ca4d52e1ee1da release22-maint
+28844 b46c7da06410e71f97c49773a2de7f337707f454 release22-maint
+28845 dc31668a7c09dcbb1572793de3ccaf0e927b3dfc legacy-trunk
+28846 97424b99df91c58f2151635017123252120c1729 legacy-trunk
+28847 d4ff9841417ae06f252f39ee326cff38cb39875f legacy-trunk
+28848 0226f1656d8151f78afd9348b8ff67224a8f3d1c release22-maint
+28849 710354833bd198098f566ae450fe4d85199f00b3 release22-maint
+28850 51cdf470f974409f5b017bbf1e6ad3b42cc20f2e release22-maint
+28851 75c4a67dcb8c360321abb51fc6b42850c99f6288 legacy-trunk
+28852 410f6eabbc0b8844a0a1f20ff4c1ccaaa8d87906 release22-maint
+28853 6fc0b716c0389a08d371e242f09447c4b192d666 release22-maint
+28854 40801df859121a4e60a0978f641824746dc88bee release22-maint
+28855 b48a236b8c7b77d810ba805b464b34bb493c20cf legacy-trunk
+28856 d935a1d70230b918fe62e9f088885225191bdb41 legacy-trunk
+28857 4d7e9e40d3e4ac98271fd2f4fe6d230c26de2b5b release22-maint
+28858 d2dbea17fc6fe8c0d06983f9d1956404b1162807 legacy-trunk
+28859 94315a97b39e66ecc5c1502e53418d2deeec761a release22-maint
+28860 7d0c4d7e0a8c7191d2b898e66dc70cea72f14c66 release22-maint
+28861 45a214f1bf0b454aff93c87709aa2105c996dc37 release22-maint
+28862 832084a3028096c37e0eef78f5f2a9a591fc87f5 legacy-trunk
+28863 048968ca2668d42352250520b5d7d577a7bcc2fc release22-maint
+28864 253e397df67b1e3743f91ce693f407ea3048deb2 legacy-trunk
+28865 0a095a257424500392dcdcaf74e3f76ffc800211 release22-maint
+28866 1849e23552dfbc1e16a9c38feef94c0dfe46da6b legacy-trunk
+28867 56cb92dbbaafc05bdeec1034353db36e61894bd0 legacy-trunk
+28868 aa3048ebd19a0a5a6d84908f3a1844336bac8f67 release22-maint
+28869 f749d50dccdc5ebfe5049a92a413b5c37efbf0f0 release22-maint
+28870 91b4f7abeba8d552cb22b9b0fe0aeb4dee5b5daa release22-maint
+28871 fb0f7cc5a69f6bf4a56fa897cd83a2ba0380fc02 legacy-trunk
+28872 6237be27a59735bf6e70216e0e94fbcac7467b14 legacy-trunk
+28873 554f975073a0380ef71895c6ba8b8d7d3202b59c release22-maint
+28874 29f6160ec0bd93c809a434ec224bd3f13c420bfc legacy-trunk
+28875 fe6211bf90bb8f5498d696e27201fd9dbb4d8560 release22-maint
+28876 c6f3072d595d54f5131276acd686a93609eef58d legacy-trunk
+28877 eb252b374ecfc85e6b772edeb2589182bbf7ffa0 release22-maint
+28878 1f9b3cb66e098e03c4daa22febf87e5e9ad3c7cc legacy-trunk
+28879 11088c53467a1768d6ab9b446d22883eaa9795c1 release22-maint
+28880 72d56b4460cb9df3ca519d7513100accb4bee4af legacy-trunk
+28881 b62514c217629e203e43a6ce6fb3e2be3bedf3eb legacy-trunk
+28882 3c3b8946dc63c5db6928a5cc767105b70b922483 legacy-trunk
+28883 0c779492cd8077889f93571f2de9dc6a7cfd6400 release22-maint
+28884 854534c607a16cd4dfa9405b5360330169af7df2 legacy-trunk
+28885 dfb74d61183d737890209fc3dac056d591584d3e release22-maint
+28886 cd837ecb1d70953e5a5aa868aecb298de9a0ff4f release22-maint
+28887 bde0d2626b205dcb38651a48fe2992f9968bf6d3 release22-maint
+28888 d32588c8863329468cc4f6d99758cbd5e9903c44 legacy-trunk
+28889 898304f6da23b5c9715c5c0fbca67a005151f89b release22-maint
+28890 b6112327124b46a2741ee05ef5d46694fe71b8b4 legacy-trunk
+28891 aa31c68da84df6f28d77edef8b2e7d674d567c6d release22-maint
+28892 db5f1db7b34e18c4ba6b57f7e305f6727ef24cd8 legacy-trunk
+28893 9ba0111388318a4c3bf0bef684f655ac048505a8 release22-maint
+28894 e8cdea44f7abcec6a1583658d4215882b1c74e2f legacy-trunk
+28895 6a2df44b8bfd496fae0751e9b0f03b9c472caec0 legacy-trunk
+28896 7cd6f5490758c63b616830769f5d61c7b339fb23 legacy-trunk
+28897 f8180a74b0fa5c6ec75b5d63402f8d77587ff2bd release22-maint
+28898 05ffe201e902d80f88703a03a7b32277cb368293 release22-maint
+28899 2eb4eed538c6d3efd5da2c5f501dfc1b3e82e8dc legacy-trunk
+28900 d0aad519e7130da3d0122bc23d2b2b7c419251d6 release22-maint
+28901 4d367872fcc665bfc24fe6ac19e953fff99dcb6a legacy-trunk
+28902 76ccd5bf9ff2629fe43b154452d63ce05ec650d6 release22-maint
+28903 41eb24b747c02cdcf5a902b0ec6028fe5486d0d4 legacy-trunk
+28904 dcafd99c85b68a88307391294510a828ab55e8ad legacy-trunk
+28905 a77254cbd4f06b1e825b95a5abb9606dc5725f4d release22-maint
+28906 d07f8db3db41e4b949782a60cbd3733381535d66 legacy-trunk
+28907 b5a9aac4b10fff783c944e88e823e04ec7871823 legacy-trunk
+28908 09551c6da299f818cb9fdff71d2b86bc184be2a6 legacy-trunk
+28909 16e66197093070c8876b6ee795960f50850267a0 legacy-trunk
+28910 1d91edfd75f2b45d6e4e89c3ae7dfae64f127155 release22-maint
+28911 4da8a4de07c233d07b3dc07f00456194a2d361d5 ast-branch
+28912 2830f961429405fccae781575e709080164c85db ast-branch
+28913 d8f4980b965ceba01a92489a32d9a2025f98b8bb ast-branch
+28914 dff48c417980214de5b61283dab6df942c7da0e9 legacy-trunk
+28915 96960d6739e0972c9ef0fe9a9c23c9151387d1c3 legacy-trunk
+28916 1f2b1e68485036b8343d8864c7915bdb08ae4b4c legacy-trunk
+28917 7843b53009d069229ec8e637ade78a53948a8844 legacy-trunk
+28918 b686ddb25c69b4b661ee30dd47bfd9962bd24a6e legacy-trunk
+28919 55f090b38b88d38f3383f6da7f9df9a590f35d0c legacy-trunk
+28920 0fbbe79b4edb5b0a4ebd5913cdf48c2245e2edf4 legacy-trunk
+28921 18e679be21193689a7d632f62c4249796efa89b2 legacy-trunk
+28922 8a6eeb0c7934144e6e6bee7417f6871808fa79fc legacy-trunk
+28923 2a763e7b7debd07dcc5bdac4756513c47e3348cf legacy-trunk
+28924 25654b811616b0f057ae90ef1c63bf67725ed908 legacy-trunk
+28925 57ec1643188c9031fca65ceeb8aa53a837b9df9f legacy-trunk
+28926 e2f65a49ca343e1915e6f672875f14e3631c3211 legacy-trunk
+28927 7d269bc12587dd573731e1265a6c990736ecd71b legacy-trunk
+28928 8c95486301b3f749c6cc58c89a50ff6c6a2ca512 legacy-trunk
+28929 bbf8cf5ee9f942284eb693dc391067e9db0f1766 legacy-trunk
+28930 9d50bc831bca04c6b6b916cf4c3c3484ad241dd2 legacy-trunk
+28931 21444bdcb09c04891d0687efe69c19737d67924e legacy-trunk
+28932 80f67385f599dc1733a179d9185b209911acb2cb release22-maint
+28933 fc534d1c9c283967a1a91875c2dc5c0571d9ad11 release22-maint
+28934 cac1b034b90376ba9dbcf38eea0681d32360a4f1 release22-maint
+28935 e4752f316053fa368bfa0c98e0360ef0c928c3aa release22-maint
+28936 ce7bbf3d9493521328620140361b1e85d3b68491 legacy-trunk
+28937 877a3914df224384c69407d0cacb7073b56b1aa8 release22-maint
+28938 766bfc93ecba66b6d66d26438083f96764ca3b7b release22-maint
+28939 75b08e6e97c60d6eb1ede79fe1327a29949bf0d6 release22-maint
+28940 20d7a545590783b477637d9b5ba732024e8d48c8 legacy-trunk
+28941 6d58715430a7bb8044d5fbcad6e39da2534f53bc legacy-trunk
+28942 2ac7b0964c7ba9767339ac1a20abee214e77b33d legacy-trunk
+28943 4e05aab60bdfaa5fc7c4a19133f3eb456fc92a41 legacy-trunk
+28944 c3eeaafe6265e3b45b48c80397f78b910ff35106 legacy-trunk
+28945 5f5fd2c4fcf227e8a370ac10b10aae8731d829f9 release22-maint
+28946 d0e574326d18b3b38bac2f234aa2448bf397c8be release22-maint
+28947 b526e12b941b7fdb6ea11e3ea0df04e2b00210f7 legacy-trunk
+28948 c573848c75c332aba9b7c20139f2f6fe9e1d03cf legacy-trunk
+28949 0aa64eebd4932cf9c65316d1aa71db2394e28835 legacy-trunk
+28950 dea619b5882d0c9645ecf7ffb3534704faf70881 ast-branch
+28951 195833a3f10daf0d2b723d1a9720f86838532822 ast-branch
+28952 c4628d9acc9a1570d504dad8e910462b5ccd3bcc legacy-trunk
+28953 db9fee373b303b00db8ec99aabf4684c0b1d2a0a legacy-trunk
+28954 7429f22473cc7c04c43d963863fc87fbaee933d9 ast-branch
+28955 56dd86b4cb8777e17f355b392ac8a244ddbe2bcc legacy-trunk
+28956 2c98eb1c3162d8fddd571a849ca150d429f2a51a ast-branch
+28957 27f835519a5e7debe87e379619f5ae75eaa29d75 legacy-trunk
+28958 9167490b0de94bc230c5dadf9d6e5e876b0e898d legacy-trunk
+28959 2bc2e02fd6dd12db45ee244bf26d0d95872bf5c9 ast-branch
+28960 45577e1856d0e938649cfd424aafa6da4b6b0344 ast-branch
+28961 7fd2da201823d1ce7ddc56093d030b3bfeb8e1b4 ast-branch
+28962 24c5a1c87f3bf1229e506f87593d4c1b13855957 legacy-trunk
+28963 6694f0ccf8ea4be75674f15720bc3462e6004f6a legacy-trunk
+28964 bc0978459ffb780cf3836d47d744a5f5f6373f8a legacy-trunk
+28965 b3a98eea34c841c23f8c7364eacbf0b04acd5223 legacy-trunk
+28966 2d80bf65cd0979d902a437ca42a87a3fbb54dcfe legacy-trunk
+28967 e1a732885be096158e6f4f50fd890e24d5a9bc86 legacy-trunk
+28968 d1b6b2ca9d9b851d2364922cc00c38bd48c6be4d legacy-trunk
+28969 d124fb08777855dff2a7578d291c8866bd7674e9 legacy-trunk
+28970 bd04e2bd437fc5d39dd2e62740a38e971ebbd810 legacy-trunk
+28971 59f82d96682e9a8085dc4dd7e10df83156f1bf5c legacy-trunk
+28972 377d64cb53470b06629bedda138094357b314b31 legacy-trunk
+28973 d722bb5205ad7029ddb16f5052c0c815fa1bccb7 legacy-trunk
+28974 40594ef34b309c4ede3114c870dbe42a1099878e legacy-trunk
+28975 ae2f234882b216863e247911520484edfacb01b5 legacy-trunk
+28976 a3647d11cb71347909a95ed10ee24eca46084e48 legacy-trunk
+28977 58bfa7ddc999ac9642ef8fa6682b26816dd438a0 legacy-trunk
+28978 b5d05f10d0a5bc2c348913f2feabc12d0e555e0b legacy-trunk
+28979 1ea6e3547610380f88060e1c9030eb8cb3f61c9a legacy-trunk
+28980 30ee99a8b0ae35a9b8cb1f7322e0bebbadf61c3f legacy-trunk
+28981 c12a4f7a00b74af19f510b56e7ac54a670ed64b4 legacy-trunk
+28982 2e140700fb6c0c53baf4011ceb6c951ac3652555 legacy-trunk
+28983 d7bba7eb0ead0c713f1274d5d8e5edae01835f62 legacy-trunk
+28985 5420969ddd70ba85bb2aa451e8e7318e2838855e legacy-trunk
+28986 636c0f8b39879368944b27ad44398928d2029a11 legacy-trunk
+28987 195d2f2576e42ca486da3ec6fc14f1578adbd4c2 legacy-trunk
+28988 115736dded7d08ce48a6af5e569a5c7f9a13cb81 ast-branch
+28989 b9233ecd9d41947323f701bc10fd1772e9eb7b5f ast-branch
+28990 70d93b62370b7bba94952ad11b56fda48d13d8a6 legacy-trunk
+28991 b96b8264d6ad2ffd9e2183e8ad45079931966620 ast-branch
+28992 9e815f2c0e84f03749f921463882e3bc6b9a18db ast-branch
+28993 1094c6e0365e5b0570ca852c2292e5ca72fdef28 ast-branch
+28994 fe95cfc6eba7dc34d5595c8703c64815c6fb2501 ast-branch
+28995 8e4cabb2e003d29b9a9dc64a8e32e2d6a9871946 release22-maint
+28996 ca01f4b85853e44b36f424c13a436945dc68894d legacy-trunk
+28997 75e5a2a717295ac209d4526b7e9073790dd21a29 release22-maint
+28998 08148e916d3851f28b7e799f7efea5f277b2e5cd legacy-trunk
+28999 8610652564870a830b97cb4dc80e40deaeb86c96 legacy-trunk
+29000 93ef745555d7c0b52245c32a0f471672b8c441a7 legacy-trunk
+29001 61d624f5c107a7e87735c079636b0e803e8eade7 legacy-trunk
+29002 2c0e0f0dca6f512f45df22bb6228a9a7ce2515ab legacy-trunk
+29003 5fe07cd4b2bfd711452148672274c47504251deb legacy-trunk
+29004 2dc0da5372b4702be55f2540887dd28b0d1e1dcb release22-maint
+29005 47aa9fc74da8cf530fa0c4daf3a8e8526a255b61 release22-maint
+29006 98e58d3c5fcfa489fdcb407688d37c836e2ff6b8 legacy-trunk
+29007 dfeec3b34faec2455d4059cefc4d3e417d6e2264 legacy-trunk
+29008 2fa559fb6ec52299b87171e9b8f1e14dcd83b828 legacy-trunk
+29009 3731be28e1a3264c894d2b5adcabceff8a27ea3e legacy-trunk
+29010 c7b9da859b55f836518cb4a4107b31ee37bf4837 legacy-trunk
+29011 61822d2b5e886a75e4756654e097e428541e2bd1 release22-maint
+29012 0ed82947571748d006c7a9daff0bf27604430f61 legacy-trunk
+29013 0e928807536c16a21338d0487733a41e637e2e1b legacy-trunk
+29014 1da5e17bfe63a208134ddd38055e57ed55666061 legacy-trunk
+29015 41e1d8c224df2e3aae7815828e1927f909998e71 legacy-trunk
+29016 555234d4f0d00914c68cfa5857e80fdaaf8647c0 legacy-trunk
+29017 f61d1d2b9ce3b22da4a62b2da4e95b93e6f7d829 release22-maint
+29018 36124157b317adbab835fb6398188d6a88eee0a4 legacy-trunk
+29019 488295d1ba11eb2167444ceaae54912c1eb667c9 release22-maint
+29020 8cb0740da1fd5992ebea0757b5f8ccc4d5c874a8 legacy-trunk
+29021 fc7029081093068f473fb2aef6406601b601f4ab legacy-trunk
+29022 14c4c833cda9ca4e4edd71f1b7bb6779f9a99c1e release22-maint
+29023 13fb4d16f6042bae0230e017967823f7d3c106d5 release22-maint
+29024 fb0ce77a318abd3840e54086a2ccf8c29375788e release22-maint
+29025 0705ca29ab966fd132c7020690881303e77171aa release22-maint
+29026 44447f315ae9115d9d4d1dca3565830c359c708f release22-maint
+29027 779bb6ddde4b8b242460f7569ecf62478735d12e legacy-trunk
+29028 6dcd0664b09e2cd92456c24dd52eb141cc9076ff release22-maint
+29029 d0728b4b07c33b17d6f40ec275e158650b5b090d release22-maint
+29030 b19902ad185fbd8b38db2445e321f841a64dd875 legacy-trunk
+29031 b11bc214e4f2f76d99fb90b1475331e8dfb74712 legacy-trunk
+29032 c42c988b2b99ca90a2fac4084e687df78958ff99 release22-maint
+29033 aae8b94385d6b58a9ba52dbf20b4283ee0942e71 legacy-trunk
+29034 de370e6503df68a23ea83c27ab101d01cfa7dac6 legacy-trunk
+29035 c85d7cdd983f32856b2a901f4746a33f4b0991e7 legacy-trunk
+29036 43671e0116d52f053812cf01e6c66a5fc4528dd9 legacy-trunk
+29037 0231cc54f87eac4844aa67fb8df7e6d24089267f legacy-trunk
+29038 824162eb7977370ff038580db1b5a9c54a252f82 release22-maint
+29039 c5a81c3bdadabc57861ed0d77bd4c6ee0198dfd4 release22-maint
+29040 405a5b4f453bec4705e21bc965221c21b1182ec5 release22-maint
+29041 6cca614b5e033a796feccc83dff325ab2389d46c release22-maint
+29042 100daa36198dd858e388bf54323e4213b285484c release22-maint
+29043 83f64c04f002690f27c2c24d2b02bf3ba8757dc9 release22-maint
+29044 3679c4fc68bc04866e9a61ecc4fca397dc511b31 legacy-trunk
+29045 276b6c4529994ce35ab66db5ca7223c0bb862f0a release22-maint
+29046 d49f164e6a974d74f0efd164351542fc8393954f release22-maint
+29047 c1a6f44e2534d83b8fc4d8f69d91b5109a0f21c3 release22-maint
+29048 a52695b71e7dab5cbfc753735362aa810d5f154b release22-maint
+29049 dae2282bc76b42727d1cd8fb30b9cd65aa65dcbb release22-maint
+29050 b287bdacde39faf36c024cb83fe57636627355fe release22-maint
+29051 6003991731a9906c8ccc9284e356b58a858024c9 release22-maint
+29052 2347f901843153d934ebfe43b388fb983be45fff release22-maint
+29053 4492d77327c5ee09f73c07acf3a635f4490fbd04 legacy-trunk
+29054 2911eb377266d975a9889014a32575019053ebe9 release22-maint
+29055 b3256487aee8886364dfaf2f9e79cf8f9b0eb398 release22-maint
+29056 774771c50b187cf6310ff6ca5651583a69e4bebc legacy-trunk
+29057 2a942a1c42e849fdc54b7f9afff71cb8b13cec33 release22-maint
+29058 fed7c41caaaef55321ec2a66a242faa4c43ef58b release22-maint
+29059 c62fb63dcfd1b53d1792d70914bd02d736f14831 release22-maint
+29060 6b1d4643a0fd50e808496ecc5d9c373ffb6c5007 release22-maint
+29061 e84e08372efa1ec5053aa1aa80e63260344b9623 release22-maint
+29062 523fd890359878adebd5fa7e424411d4927acf4a release22-maint
+29063 1e359dcb4fb3b72244f87ce505992b2cc27abf58 release22-maint
+29064 3938e9a096894c6c866ae44c8d526a19f6d1ed77 release22-maint
+29065 86f66061003c06cb97437e04fe313f7adf0cf91e release22-maint
+29066 ad37b93e7a2e6f134124de01d0370d88fd4a7701 release22-maint
+29067 a67b9a195265b5eb0e41dd4546f4d51e23a49804 release22-maint
+29068 a6edc1b3fd56616c46b33f054a31f04083004bf8 release22-maint
+29069 c1f7af42a7f1767934c7a69a99675313032bc9c1 release22-maint
+29070 1b8697d60568c47b74b4407958034fceeb4d2fb5 release22-maint
+29071 1daeabb3624430ee22c7241f88708bcb455ab162 legacy-trunk
+29072 977fa135906d1a14b845b8efb8f4047083945a07 release22-maint
+29073 288c1ffd606eabbf5b4d5c90f3c9530245f93cb7 release22-maint
+29074 f37a34c256c4b043e31a2cae53129ea60fb04811 release22-maint
+29075 f9906e6261c5f0d4718dd1f7cd61b4d0118d1384 legacy-trunk
+29076 3eee72931d1783e50ea990e338f1b13d93fa6282 legacy-trunk
+29077 f3e70cc26422d0d139510980b35e580015f35cbd release22-maint
+29078 c4c093e23c6dd1c80587950fe79f662120fe08d0 release22-maint
+29079 38a1e56b9bf352495aa34e16c9a09800e0d6edc4 legacy-trunk
+29080 6379a5514065c956c125da57307b6a2f907caa91 release22-maint
+29081 5f2c6ac215c7995edd794b16cf28dfcf87c4c980 legacy-trunk
+29082 b5dec0a554b380ffc27d45c14f723a639844b6bb release22-maint
+29083 df276b73fe4b579480cdd22be2f45416e2c2d8e0 release22-maint
+29084 2dcde90391aae34758aed02e19d56cb9c7437396 release22-maint
+29085 87daa565442db8018a8dfba9200fc8b1fcda0dc1 release22-maint
+29086 a0005d26773d02c1053efa731856fbf7cd53ed96 release22-maint
+29087 b98f85dc2d881558b113463e5efe18fad6912e41 release22-maint
+29088 8a759733676fba9aae6b633ddecdaf62ce9c28ab release22-maint
+29089 4bb918ea64d1e2bc5dbb0c9afa01e515f468b91c release22-maint
+29090 f867ca6c7d698e5ebf21e695d3d59c46a474c923 release22-maint
+29091 3b60952043cd05093d55378efcd16e136ea223d9 legacy-trunk
+29092 5bb2c057fd40b88a2dd6c7c735fd06127ed85022 legacy-trunk
+29093 446b835fc19b2cfed79380b7e8fe83cd48a5ca1f release22-maint
+29094 25d1f4f91487e0dabc7723786668b17c81207fed legacy-trunk
+29095 85062a12c24f8fb4544796a338b78fc85a90d88b release22-maint
+29096 4ca32e4f78393a27ae806e647bb09e7ea7436051 release22-maint
+29097 efa9a86464d342cf1e63a0d588091024806ec1a9 release22-maint
+29098 85539279094d15e711585fe2893c24c40d4c8408 release22-maint
+29099 a94f272e600d90994c245e44cd5fd7d0dd1c5218 release22-maint
+29100 eb849973b9418de368e0532a3acac5a4bfe9c071 release22-maint
+29101 42139abfdbe5beb5d63e11f3c3ec06acc0089089 release22-maint
+29102 29d40eae8736b3f3bcffba7396b7e13fb88cccff release22-maint
+29103 0e6f0a22c6a923c85f37f01a7d0039070fd71775 release22-maint
+29104 5cf33db550d75cebc8f9a9d23626661d5e578fb5 release22-maint
+29105 13438586daa6373cdb4c164e96f0f7b1589f02b4 legacy-trunk
+29106 bf28d0f78bd5b29b436a3c676d807364b6e4a955 release22-maint
+29107 5c6fac95a94b4fcc965a1d3364d4930aaf1bbc9a legacy-trunk
+29108 199f0f6a8a363206d7493547877b7f4dd65ff2a3 release22-maint
+29109 88c1c4d789166dce33dd628fc02c84a5373d3c5c release22-maint
+29110 33bd6445b7e9394c367dd7a173fb069c8248dbdc legacy-trunk
+29111 e21847531674384c44203c14cfc7ec80e36594cd release22-maint
+29112 15ee299d39e671d920c818af5adfea8c4b242036 release22-maint
+29113 5d8bb00fee1899c76a9e56953cbc54b6e056222d release22-maint
+29114 49927b6b5f40fa43e5a1a341f92b4766d1738a05 release22-maint
+29115 3fa544a3c5edaaed7ef6091dd0e92b2e868ddfb6 release22-maint
+29116 1157c400316b1e6c96c435201939211fe9baa82a legacy-trunk
+29117 2103846eef73af5489f786539bb45bdc2c218615 legacy-trunk
+29118 c58041e6a79974e4c8cb48bf389e577f1bd0941f legacy-trunk
+29119 0a1c1c5e1ab4f29e0f97eb000cb1787f353433a1 legacy-trunk
+29121 4be97eda436bb63309ea2488314136a2f653419a legacy-trunk
+29122 0690ea6d1153572b32c9e77ad10f87e2a02447dd release22-maint
+29123 f5099a530d67af80aef02351b730cdcbb53de266 release22-maint
+29124 cb9c1f94220b99eaaeea5c868a7944f49d74305f legacy-trunk
+29125 000d15581a7686d95ee00a15295dce8bca730e88 release22-maint
+29126 90274ba04424d76105e26a1121d1a79ec0e7638f legacy-trunk
+29127 14b68f59295e3956b7f135bed7f8da8c020bda73 legacy-trunk
+29128 37c0445bdc90d97d54b8df4f7bbf76b0fa41c91b release22-maint
+29128 0128313c2855d71753f00fccc60bb39ed92a0c54 release22-maint
+29130 ddbf69abb95cc886ac1bcd2a1b204e7209f75ea2 release22-maint
+29131 4a825b902310e8dcf488c430f8dd83a44dd0c8f8 legacy-trunk
+29132 b659ab494571ea7e7b28ca70fa35731038c3073a release22-maint
+29133 63c6f45e947de49294df16944e866ec1776ba854 release22-maint
+29134 cf92660e1e3ce3f4ee98d9abcc20263a03cd9f54 release22-maint
+29136 c5d91791e57b29634d6a95b44356013697908fc0 release22-maint
+29137 8897a0b1cb075418a0d25d1a89128aa40836b547 release22-maint
+29138 1a79b9e39e7252b6081ac9178d6f13df11becabf legacy-trunk
+29139 9cd6ed954065db620efc2378ee1fd827f64a2014 release22-maint
+29140 62853195be68d1fd2526b895147d1f56357cf713 legacy-trunk
+29141 41e8280a3685a7027e08654b0df8187a0177db06 release22-maint
+29142 bac5a493290599a8ca9343f0c296a522d73c3bb4 legacy-trunk
+29143 6896ceed46a6b2d2ed3752d1291fff14ac0b864d legacy-trunk
+29144 c52165f2cdf4391fbb64c3c401522f7e7618712b legacy-trunk
+29145 386e6fe2c8d2c9a06c0538eb49f3d78869bb96ab release22-maint
+29146 65dffc9c0a169e7beba3d74b3283275869b96c15 legacy-trunk
+29147 ba522c74a93101c435aeffe7eeaef29b0e607bb4 legacy-trunk
+29148 ce49f12a1769e6a97c9dc64d7e77f79124caf075 legacy-trunk
+29149 38843d35b646602a46bb56a5ed1267d6eb9710f8 legacy-trunk
+29150 c7d5801bbae8bcdc58955cddc81ecabef4733c86 legacy-trunk
+29151 695ad8f87709511339fac2d88cbef6acfa1db951 legacy-trunk
+29152 0809dc598fe23a2b32c7018e1997b59c15ff7e10 legacy-trunk
+29153 f4aa656710f039f377f4a0e70ea0cb7f2c0eb5da legacy-trunk
+29154 56c0ba20329b4ded425f1d777bfe1e7cc933d63c release22-maint
+29155 b2e837f2d141c6fbf9d71ff2f2717802f0f0e595 legacy-trunk
+29156 d8ec98b74fa78b554ba9c1f14f7fbe9cffdc1d39 release22-maint
+29157 b39bd03a8dab6692388d9c16844dce5c85ca0ad2 legacy-trunk
+29158 13d639a4afd7b83a98c3af03146a5a7f230d587e legacy-trunk
+29159 a9621ba7e3dbd1340b0d087a76ce44c34842755c legacy-trunk
+29160 e9e7f160aac990e215bafdfa0fd8b3fddd19429f legacy-trunk
+29161 50013d1c6a43ea1beef526f13c067b53eba26849 legacy-trunk
+29162 b78f5c7e579021908353a6208702ae970acbbbdf legacy-trunk
+29163 2fb910b139c2e25d56ceb1447547bb4dc8c35df4 legacy-trunk
+29164 feb8863b6fc4674bd7b9d4791db59057677cb62b legacy-trunk
+29165 6ae6f2060e28d36435a9299a184fecc7daee6d79 legacy-trunk
+29166 c621f71bc7025609f09b8d188cf55140e8a40d7b legacy-trunk
+29168 81204e20cfe59e372a7a6011fa6bf565045a77f0 legacy-trunk
+29169 0a7aa874c450bdda5999a32c0b2da5e2c24f356d legacy-trunk
+29170 e959172caf49321880f83c98dfc36e3a938cb842 release22-maint
+29171 447762ebb11d2d72a151889b9b2e46185a8772b0 legacy-trunk
+29172 ee756ab6a13e0df738fb79bec18d1e73d116b9d4 legacy-trunk
+29173 0f50536a10bb7764e7d7722fc0f067d4bf0421d6 release22-maint
+29174 1fe1a57d8eb1b27b8e387bdadd79e70dc99baff8 legacy-trunk
+29175 733df2d1eba971bf50a4710d5806a778bd063656 legacy-trunk
+29176 1a9f478852604a7d0ccc3801ba36afcd73623661 legacy-trunk
+29177 bad9699576d9d9bd560d82d4b278d08e8debd7cd release22-maint
+29178 ae6863e8772437bc1c7256cd13e4094cadb6c93c release22-maint
+29179 06f6173b80fb4171d0797b6949a06fa37e66ec48 release22-maint
+29180 e06743fab4775ca84339b3c5c0c78e7d7b6d03b7 release22-maint
+29181 41c592122f629fd5d9d609a47bd6df7f93116c5c release22-maint
+29182 2adadc19923ce12f3093123895336f2e37f587d8 legacy-trunk
+29183 290ea0c6de6a5a1acf2a3c06b221671621d320c5 legacy-trunk
+29184 55b18394123b7ac625758dec77d4c859ce9b2f55 release22-maint
+29185 e374ea7ac4ce48a044929548280ade19fccafde0 release22-maint
+29186 f532e9b69551c2e7e784abb1e5cf02ec9882403c legacy-trunk
+29187 3c26ae61e9523ebdf3505c1dbde9785c002e44ca release22-maint
+29188 8b20b26f11869980239cb10678d715d8d22c94a8 legacy-trunk
+29189 f6edb1ef2e3f800f65c6e065febf4fcad1b44e7c legacy-trunk
+29190 61e6b57ebbe1d80eea2820bc720d735b72dc5a2e legacy-trunk
+29191 d634fbd5e4232dd7c091707e428ee29e19d25dba legacy-trunk
+29192 8e92be65ded3668fe6aaaa8d4f1754523e07b86b release22-maint
+29193 65fa193ea1090ce7d9cf964f41af7fef83eab5ac legacy-trunk
+29194 f461827dc7de6c3f3f35f91ce903f70426eb345f legacy-trunk
+29195 fa173719ac8c0ea611b8a66ae4da63790f8cbc26 legacy-trunk
+29196 b59d1a1193932db36d33f61c9b436e3797e05b02 legacy-trunk
+29197 ace82da3b450e4a29abf1cf30cdf1ce128ceb6f9 legacy-trunk
+29198 787fecd0aa1bb1076869f513006cab999fe5dd69 legacy-trunk
+29199 c59ce513def625bea6a0580938716e6afca76e31 legacy-trunk
+29200 3a3d5aec7a6aff1dfee4f538d79fbcf657bab74f legacy-trunk
+29201 7005f4b6cc122ccd9ffb911ba89a6e2e5dbea24f release22-maint
+29202 6d21383896672562057f3b75cafa94cbf0994615 release22-maint
+29203 92a8a352e02430633a8ecfdf614c0527060def64 release22-maint
+29204 b0fa5f6a8bb97de7a55789f34830948fdfeedca4 legacy-trunk
+29205 eeed7c8b231aed16767e370e77f2c123e0568b60 release22-maint
+29206 97002b250425679d18626a67c782ece7a6891c67 release22-maint
+29207 70f9026a2b16fd38d87c2724d56f03b38c1c91f7 legacy-trunk
+29208 21ab2a674c0a1464ea06bdd2c9eb0b44e4d7d4c1 legacy-trunk
+29209 396c8a24880c825d5424f0e6cf2c4bf9ce17f197 release22-maint
+29210 86bf840c2a1ca8be4fdd40257702e30157bce835 legacy-trunk
+29211 54ebf085d26fa964caf62df67c6a741c81fb315a release22-maint
+29212 f7ccf4991565c3fb332028a1d3c2a6ac3ff1a6d5 legacy-trunk
+29213 7340b64a4908223ebbf3e02ae7e8dda1d463fd83 release22-maint
+29214 4890f1bdeaa642e20c7e4f87691cc25437966f37 legacy-trunk
+29215 f7a46b0d3c07aa30e65ae1c26333aefb1675d167 legacy-trunk
+29216 d43e82b8d79d5689e8bc9bb766db84c3c4968d2c release22-maint
+29217 ec0a48ae8eb47ea16f737848165ece8d499fb9ec legacy-trunk
+29218 9bd2f9792efba67ff54fdafacc982fc08a3a3190 release22-maint
+29219 3c95e09768448eca3423dc02e0abf60500419606 legacy-trunk
+29220 2d17e3cb774e8363d915444c4e1cd25563ae3412 legacy-trunk
+29221 75cbec40db7d5fc541cfd0fdbe3bbe503e62cce6 legacy-trunk
+29222 6d35d4292dec46d21839262c5faeb23a1d12e379 legacy-trunk
+29223 63225811498d511d31b1c3b042adfa6df49deb0f legacy-trunk
+29224 0838c424791783fec8a5e3ddb6d1d40d045b1818 legacy-trunk
+29225 f449fb5bbab8ad69a53b2542c4d19634c2932d50 release22-maint
+29226 5632841a32a4059ebea3757f5c36bf7f10519d43 legacy-trunk
+29227 6ed0bbdabdc819ec0a25a1a07d050a1f22072fa4 release22-maint
+29228 69aa60d771d1f3199ccd36314d50a6c42c348ba7 release22-maint
+29229 b4ed9f9319cde4115da1f1594e8ec070402a06a3 release22-maint
+29230 f447b69601b9156e1d5aa20f1059575a3be5de28 legacy-trunk
+29231 ca989a71b6c7dd7dcd115fbf1f9e270631fba3a0 release22-maint
+29232 71e3a8e9d884061c1d57f96b99a241f8149e3954 release22-maint
+29233 44729fbb3d5bbc1afc6c7ea70ecc36dc22a120d4 legacy-trunk
+29234 8ae9c0b0aa0f154dcc48df15a1d3ccbbb465f314 legacy-trunk
+29235 7a57ddf72794ef9f139a64f0c0e8be948c3ddfa6 release22-maint
+29236 037dfba070ac78c38a602d2da99f7943c75d45f2 release22-maint
+29237 5698f0fe2ea00900608eb74bb33ade630f3716fa legacy-trunk
+29238 951e3fe7ed3ad3a56e4b6cb77c81d7d3a8c20918 legacy-trunk
+29239 3a879f2fca066ad26824860e4196ee5bac8f8180 legacy-trunk
+29240 d5871d6e735d74dfc715aeaa68913bb0df728dc8 legacy-trunk
+29241 362301a8c3e428986d40523c24e9cd3e3519527d release22-maint
+29242 91ebf488b5a187bb3cb31239e1360a4e548f91be legacy-trunk
+29243 c355fd37d6407b142fc2df178cfd8542083799f1 release22-maint
+29244 84ee5a4997430106886f9d689e34f6e72682bb1c legacy-trunk
+29246 edf5e7e55d140a77175e702af56dec711ad96efd release22-maint
+29247 ade8af1aa3c68f433b672f8d1791ee9d63a3b80d release22-maint
+29248 1dacb6ac38e9cee530a7f950b478b89bad1e5cf8 release22-maint
+29249 cc41b9cacae847e513f6fc513484be2a45786389 legacy-trunk
+29250 f0a74ae09ad73e48a351955d609a885c700f928a release22-maint
+29251 2ef71f351c74a2e1f50f136e26dafdaa0eb4b25c legacy-trunk
+29252 423aa5ef9247bd4f5dfebfc481b900752401971f release22-maint
+29253 cf18ca0eea892d55b493948bf12fcff148a2d84b legacy-trunk
+29254 af20aeaaa98204a04627d27bfc9cf26c76b8df9c legacy-trunk
+29255 bf384111b3b38f7f8217e1db0286efb52119456f release22-maint
+29256 ea1a4cebc530a5b3de7ebde8fe88a430adad626d release22-maint
+29256 61d531533a86224a1c26917c18013d91f592fbfb release22-maint
+29258 83828583d91738f6ba86e568888fc5f750661f39 legacy-trunk
+29259 31b2fb448514632a5519db767f9e7f72fad353c3 legacy-trunk
+29260 a3d612f0563f16436db7e0ca654d9122fdf76543 legacy-trunk
+29261 b858f4c883ddde4d084c9b8e4bd4beb38bf9df37 legacy-trunk
+29262 001b789f1f84c0078ccc51f9d6decb0fc122c933 legacy-trunk
+29263 ac14317a9ae8b316e4ba527c707492cf774f6df5 legacy-trunk
+29264 3eafbde56b219f1daa5e2c852eae09ac1bfc5dc1 legacy-trunk
+29265 66e3e5f093ca1137487dc808693fbcf3bd426e8a legacy-trunk
+29266 85c87b3ac96bc26e574f954e31b76bf94a5cb875 legacy-trunk
+29267 6c930e256a16d248986aed7903d7453ecf090f5d legacy-trunk
+29268 bc81d531c62932252a7258e36b8211f7dfa9bc5c legacy-trunk
+29269 34284825d9cd81c29333fed89a3f194ded5ffa1d legacy-trunk
+29270 c77d83570b3fcaff6a36b78204846e5f9e04c86a legacy-trunk
+29271 ab9d4016b587d5ae9a7d5e942f214adeba3a898a legacy-trunk
+29272 6001265ec686156c7a7a4d192e305acaa3005f2f legacy-trunk
+29273 b9769f7133c60ac2b426a241f7ed3c214ec226da legacy-trunk
+29274 0bbea4dcd9bed6d81c92745cf68e888b16fbcf96 legacy-trunk
+29275 37bd2a901c100a9fcfc0bbc5544be7a198d7e129 legacy-trunk
+29276 fdca87c4234ea46a542afc178b7200e5e74141e4 legacy-trunk
+29277 cdcb102f8e56c2cf4a90a873f43f5bb5ba7ddbae legacy-trunk
+29278 915112671152f43fa9d7dcb6efa30665a861d917 legacy-trunk
+29279 54834363ccf0da69f340d0fb7417dea2e56e6d00 legacy-trunk
+29280 5d352de9441580c83c2dc02a6ec4069146817b73 legacy-trunk
+29281 777998a227b74d17f4dcb27192ebe7b9e9ae69c2 legacy-trunk
+29282 b8cbdb735cf2b199e564f94e9189b4af420b5699 release22-maint
+29283 4a92c7d9d4154b05fbd245ffe06dad8a4e0d7060 release22-maint
+29284 76ac16293e4b6c7407ea9514f9372b7d81a0f81c legacy-trunk
+29285 ff67d5ff123e569cb0b555cc4e4987e74344c3ad legacy-trunk
+29286 79419897a36fe7977556b74d6008b566cf122340 legacy-trunk
+29287 c4403a3efa5d5f8b8d84e46cd2b898dc6bfd1503 legacy-trunk
+29288 12227d79f6ba4c76df05fc671f15c6b75186fec0 legacy-trunk
+29289 0f4e998e3ebb6334cb1ba7a521365b6de030ef71 legacy-trunk
+29290 032f196059aa0b4f71e0c80e4fcc0fe97a6abe13 legacy-trunk
+29291 990b275149382b4e7d7d94b4af48af91dba6c429 legacy-trunk
+29292 1afb228e4265b5a86f08c0c84db4060694315016 legacy-trunk
+29293 cebee2a9e3cf9960c0055535f39a04b5eafe56b9 legacy-trunk
+29294 c2dd4130184108be53b51f7e39a8589f1fac5310 legacy-trunk
+29295 093fe5b9f6f949aa5bbd114f035c928c01d55c95 legacy-trunk
+29296 7ea674ac590ef5748d3c4a1db741760774c15713 legacy-trunk
+29297 dc420de17a6ee63cee020b519647a13f2a345631 legacy-trunk
+29298 deabd053b6de1f4ed656afd39795ffe9857d7ac9 legacy-trunk
+29299 8050157a4430bb7bd87213598b74384bb0003a98 legacy-trunk
+29300 090b72c0d2eb730259a9a76295de25126d1fa86a legacy-trunk
+29301 44cc7c62d98db37761c4317c54ec52f2e5027cff release22-maint
+29302 035b8deb52c1ef4d0eb53017ca7a402c18ee7396 release22-maint
+29303 4702921297d1255a10cc9c73bd1287b35a071071 legacy-trunk
+29304 a89d014559e057f0162329cc4d8e45b9709ec64d legacy-trunk
+29305 2f3647b21b0763390f2d17875141d83554f49ff8 legacy-trunk
+29306 8540887bcec6c9b90a2aaab4102279522d1f7c59 release22-maint
+29307 243503926c81d80ec53e1ab04b035d335bedd042 legacy-trunk
+29308 eea40c41720539fbf7b3430d0d0ba33199b12772 release22-maint
+29309 09e3f0d8be10beb5ab0efe8484ada47b4a7b22c9 release22-maint
+29310 eab7940277fbb3c134bdc4411876d2e92c34b7c9 legacy-trunk
+29311 7b7b96555842a94d467573c46c25c4705b33cd1a release22-maint
+29312 31bdc66fb307f015cf0e8c0708a58599d4ad361c legacy-trunk
+29313 4acb5501b4900c713d022f03de7814c4eb9f5cf3 legacy-trunk
+29314 8fb12ac79c937aa437859656fb1ad613ab615b47 release22-maint
+29315 eed0fcf85b62290429c2119c5dfd7f0ce067308d legacy-trunk
+29316 a5db246d94a0b91ad94434b2c976f95303fe2937 release22-maint
+29317 057de41daf4892d01ffde99e386fb3446b67e796 legacy-trunk
+29318 67381ebd5f4f726083ab855d7a25e4f748018cdc legacy-trunk
+29319 7885899fb43eb50cd29942aff71044abb7b0821a legacy-trunk
+29320 1f5f6481886d9ab34811de6e45f930625f52f7d5 legacy-trunk
+29321 680bfcc9ca066c6c6de27dc03e43bac7dd0b72c5 legacy-trunk
+29322 2f9b0a35e205788f7e23a1bf477d088042a2481a legacy-trunk
+29323 a11cfae71deb0786e622300704989400ca96540f release22-maint
+29324 84a3dd994cd18804f633b6c83f5f296d0bd13535 legacy-trunk
+29325 54f32ba7047cb3fb18920713e7bb4e4be58c5ecf release22-maint
+29326 9dd9c531ca78c4f10dc1164c612998035d6705c4 legacy-trunk
+29327 4c8a8c74f4bda94ff385f65c15e4bf237f0cff0b release22-maint
+29328 823e947e2450257ffc57c981d25cda1bfaeea6cf legacy-trunk
+29329 35f476d6481ef429dedac0e62942f3629093a8fb legacy-trunk
+29330 41e0361a219122fae733c0f6d2d532f10a34a562 release22-maint
+29331 e56b52e78bc9790b53b678850a3f37d2f281dc98 legacy-trunk
+29332 151aa3434aa67023972ca73addccfc3789417a97 legacy-trunk
+29333 d17ffa0522b759ee98a73cd51d67b8dd699eeaae legacy-trunk
+29334 b9aa871f844bfcffcec6256e7212652bcc2fb8a6 legacy-trunk
+29335 b7b012e78da35e3bc5517c52011d5a1a96b9b390 legacy-trunk
+29336 2b158267b00e4c09c011307b09c28a262e72eea4 legacy-trunk
+29337 2bcb41611fae919352b4072b09a7fbea9a20b192 legacy-trunk
+29338 4eb94c56c46a471a46d3d9a7d0d7a08012f79181 legacy-trunk
+29339 cb910c39492714953750140213ea25e5690a3624 legacy-trunk
+29340 a9cfeb42e24099864a3fc066ccd317d9dbf37d77 legacy-trunk
+29341 57fb3d5e3dd37601eff8279eb065b7adda15fbd5 legacy-trunk
+29342 79305a2efa8c878ec37b1bc90ff9a9b11689bea8 legacy-trunk
+29343 9253fe86b922fa1a1d12b20e01e161c33a9b3f0b legacy-trunk
+29344 5f7a334c0925109943b5fedbf5ee88047afa5b7d legacy-trunk
+29345 15607ec49faf1081847bdb90482971cfd7d8387c legacy-trunk
+29346 d4cfa4043c094d7ba0bf05c6c412149993ca62c2 legacy-trunk
+29347 ca025e9fe5bc2e904b423ef7aaeaea06bf7f87de ast-branch
+29348 83a32c547b4993b60f5a483a482dda7be8febff0 ast-branch
+29349 098cdbad55cf2e76042f672446e0183b481243da ast-branch
+29350 2d7f4277073325ca88da387f1a8cdf817e5473c9 ast-branch
+29351 4587d1af2c4143e5a490afd63a9d310ebb0b54aa ast-branch
+29352 aa2ea5ff5f42709d748d68d97dc83c159e29e7b4 ast-branch
+29353 07c6d3b9293c275dc95199e436bb6c03bd4ca944 ast-branch
+29354 46b5673ca380dab845a5fd99ad2bb8dedb90121d ast-branch
+29355 e365e6bf41bb01f6832bdf23be116d794e587744 legacy-trunk
+29356 4d50318b3eb181db7d6288fd55a03501eb96ce62 release22-maint
+29357 8d44d614941d477a66bc317f045633cda220b609 legacy-trunk
+29358 6f18508bed3d27885cbdffae9a3dd18ed7efdf16 legacy-trunk
+29359 7e80e7d05a16c839b7da275a6946832c4c866c8c legacy-trunk
+29360 34f17fb49c5131103986ce9b215d11b4b0e62bc5 legacy-trunk
+29361 fec15bad386d9f0d30705c4d6c345042314bb037 legacy-trunk
+29362 a70fcc5dbba505ddb558697f176a3ed08a84cdf3 release22-maint
+29363 529da505eabc731038930bf8711bdd9bf412f092 legacy-trunk
+29364 175041e34587a761eabf6e870aa904a8dc9841f3 legacy-trunk
+29365 7f030b8f917d90b02c4f39e0b02e11ebef1c8eaa release22-maint
+29366 fbea70a402915421831fa5cb2a1480a71f922cba release22-maint
+29367 ac239ee0c9e8b871da086d04a4c3d67f7f666d41 release22-maint
+29368 cf87920351ace9277a67b914c35856f3a203cbc4 legacy-trunk
+29369 402fdae67e440f4d86a5739137644bf58cd4b1fe release22-maint
+29370 19500c9b58c161bfc53a6e7c6006f659ec3e699f legacy-trunk
+29371 509bb0b6dfa3cbcc90b73720fb868e7640782c79 legacy-trunk
+29372 1249245212e446161c4f5a7ef7b0cda4ffbaac8f release22-maint
+29373 37d87dc803d7a4bd62de75f1122aee17dc3688c9 legacy-trunk
+29374 d3b7377c8afade1209df8900048723322e757864 legacy-trunk
+29375 c3398c25dfef7d90656ed3cda1371a30c2c69195 legacy-trunk
+29376 fb7c52ca9840510e6ff1b6b3790139374dcd76b4 release22-maint
+29377 095dbbeba9c04fd644353d3951d4083cdf4aa9f5 legacy-trunk
+29378 487d3c2490bc03588120ead25ad907fa985f10a5 release22-maint
+29379 03c3f610e0541308b4b584e6f2e83d15b12e2edc legacy-trunk
+29380 51828ea50b59c0e81e4c77ce50a41c9f40260853 legacy-trunk
+29381 179482875cfba5c40f7f8872f7189ee5fac89869 release22-maint
+29382 50905db35da5b0f069fdc4f25d59b016fc8c18b7 legacy-trunk
+29383 6ea9eef991084786308f9878ea6023cfa89f72fc release22-maint
+29384 df055a9eff9cf90778c0dbe6dc30a910b20d7c12 legacy-trunk
+29385 0bac66e1b356904eae42d7880ce7b3fa4655b672 legacy-trunk
+29386 accd2f54e1847ac45a9ed890394184e2af1eba8b legacy-trunk
+29387 d32c45d278b2490df55e9f70823f211aa848eac5 legacy-trunk
+29388 f7da33bce1d93996c8e7bcf24460163982f82762 legacy-trunk
+29389 fba16b9bc9517f4bd9f543a2fc38615ff1e5e837 legacy-trunk
+29390 b0638329e3b9a1a9b65ba1b70be5c310fbbe6ebd release22-maint
+29391 f2dae3d9a75bd3c3e586de22a29c16c9412407f9 release22-maint
+29392 8bb6003f7f54c5966eaeee48e6d90bfd50bf200b legacy-trunk
+29393 5b6d55b45287c434f62d10c77ea42fb7077bead5 legacy-trunk
+29394 9901fda7c3664a7f753232e9ea8de8efe01ceb59 legacy-trunk
+29395 4ef7686c4c889f67166862b23eb416d991b670f3 legacy-trunk
+29396 4f4e0260b771323813f37cd95a0bff15c11dfb5b release22-maint
+29397 e8fc459ec015585bfb10129719bf1519fc36195c legacy-trunk
+29398 6e414fba46f68c29a0865ccc5ce4da9ddd51e5a3 legacy-trunk
+29399 834b0e0389c5a9b3a92895425c74d69704a3975c legacy-trunk
+29400 dc4a0336a2a33cc1c6a849f431d53836272266de legacy-trunk
+29401 6d5542ca277a39a89764c67a37078252af39564d legacy-trunk
+29402 58941fcb6f5bc156a1b1eb8cd45247d746252852 legacy-trunk
+29403 7049268f252d2725e78d9556adc9d7c843aedcdc legacy-trunk
+29404 75756c8558bd91171cc5840737365dce9ed5f545 legacy-trunk
+29405 def9609d9369ca8ae6ee29d7a3a5f34af9ebe492 legacy-trunk
+29406 3065b54e3ab71bf17df26a1bd3b0b07d7cc97efc legacy-trunk
+29407 11fccccd36004791674a45fbf24cbe02dd92266f legacy-trunk
+29408 790729477610ea77b816773bd736026fdd5e99af legacy-trunk
+29409 04cc12bdcedeaa75bd54b0e629feb0314c588dae legacy-trunk
+29410 be881614848b28863ff23d57fe0107e8966fea03 legacy-trunk
+29411 94240ad50dbe2e71b8cb3d68fea9513ec7fed775 legacy-trunk
+29412 b6ee8047b250d4a94dfcc96f8a9e5ec2b02763b2 legacy-trunk
+29413 fb57d5777a2492b7273f04f5c8a24093a6b40627 legacy-trunk
+29414 48e4612f87cd928b9ef7ac97c3ec6af398087a13 legacy-trunk
+29415 43f70109cda5c558be29669c5f4928916fa48089 release22-maint
+29416 e1db1f90e17f9d370f1277fae94d7660a154ac8f legacy-trunk
+29417 7b773a1271c3df3824f709e04c85ef6b7a948b3f legacy-trunk
+29418 3db772d45f9886c9bc2301642b0c9378dfe2644d legacy-trunk
+29419 26b440c37c94c89261ccf9933c6cce3f56a2ce37 release22-maint
+29420 253e9edfdfc060ff77b4896f4ae2b771cf0989be release22-maint
+29421 aae3764c4d58d491f4c65f1aa2e004ce1021b6e1 release22-maint
+29422 b9246f8fb8fd304cec736eebaa1d229a9870e8ad release22-maint
+29423 808e513a2f5c2fc48896f87a76213aa0de609cfd release22-maint
+29425 8585fd9aecef95ade6585f81d8f79a12d6449f21 legacy-trunk
+29426 36d418bea55218f0f0f610483f256a48b6398a57 legacy-trunk
+29427 445feb26adfb9aa5201f26455ebb30804e9da61f legacy-trunk
+29428 f4f17678fdd8658dba4bffd9e920201d10ff307c release22-maint
+29429 949ed8365d58d351bc720556a31ed0fe2bb54aa2 legacy-trunk
+29430 18edf23bf4993d7102947e344789e3c135a043ef legacy-trunk
+29431 dba60d024e484363a2f8e9cd3974eeca7b44ab19 legacy-trunk
+29432 096642d7eca25bb7d2cb22632588c52180dc72e0 legacy-trunk
+29433 fc6a19f69ac7e2b60ee79cefa2ffc163e2d09f37 release22-maint
+29434 01bf9c88d96036b6662a15927add26c24c456ce3 legacy-trunk
+29435 72734b39f8aa0acf526ad23a679aefa46aa028ae legacy-trunk
+29436 d90ef46d083828bc95c0bd46b911efebc92be731 legacy-trunk
+29437 4a24c6a6429a6673507e3a6b795306f598d67719 legacy-trunk
+29438 91d3d4452c48220b46795c033cc4cbe4f3057b16 legacy-trunk
+29439 e349fe093b34a91849d1899ada55ba3b299b7d34 legacy-trunk
+29440 323e4c1146d0c6025f6bfde48c2f106430e7220f legacy-trunk
+29441 5517c36ac497dc3640b06bcdb91ed94397a89a74 release22-maint
+29442 6875bd7cb570573eec33cbe67435eb190ccaabeb legacy-trunk
+29443 5b828ffe1b35f01ee6cbe370215e7b3c7d9d9b75 legacy-trunk
+29444 4252b04f3eed634ce23ccd207f8e556442f19486 legacy-trunk
+29445 8e73383474eaeb7ee292f6d39b639dc56953b50f legacy-trunk
+29446 d7da080d776304c8bc39ed757deb17eadaa09ff1 legacy-trunk
+29447 472a42e2024409adc5960a63012d2295f8b0390e legacy-trunk
+29448 cb8298a6ed47c44ddf10651a6e702ae419691718 legacy-trunk
+29449 6662f9d4220b5cda0645e16b639b3aa984f0816a legacy-trunk
+29450 a68c6d62fe788df400491d8f688aef39729c4fd2 legacy-trunk
+29451 040af9c736bb198be8536327fbf12753de5ec7c0 legacy-trunk
+29452 b6478d4635554be1529ae95da89124ecd5bd316e legacy-trunk
+29453 2d837e2083faf350942d6c46f6d8b8e66a7e8e45 legacy-trunk
+29454 1d02b405e31fb219c0752d402298f59d2005956e legacy-trunk
+29455 4f1b7396a3c5426894477e731ebb80933163cba3 legacy-trunk
+29456 d812b8aaefb31b4662fb6b56cd9699c7c744bda7 legacy-trunk
+29457 0147ebef9453c361f43842a9e337a5bc41bbe1cf legacy-trunk
+29458 06e005666c42291f8fdd0b5652d5d4624a2a8240 legacy-trunk
+29459 e1bf4604c0a584b1bb18048239065577e826e2a9 legacy-trunk
+29460 d308df824e2d15bc012f9c17db2573cf1901db28 release22-maint
+29461 15221980714472d1234a06ba4b198c73b15ac274 legacy-trunk
+29462 1425bea2ea66a10c8db38bba03a5d87401d78746 release22-maint
+29463 9ced3e5187ee1d6658ed40e31fdb10744e5fd674 legacy-trunk
+29464 6e11ae04af10949a60e5dbcaf708b7ea302b7025 legacy-trunk
+29465 90f4eeefc516f9f3d3e07c105c31adf37f100b82 legacy-trunk
+29466 611af79c0e892b4ec343ba0d9f29c952bd91fdee legacy-trunk
+29467 273cad7f7df721967dabb4c44e1ed73a742e41c4 legacy-trunk
+29468 19762a4936fc84b4c09ce05f46e191a2620e2dfa legacy-trunk
+29469 0fdfccdfec06f2eec245b3acbc9173e237c62e96 legacy-trunk
+29470 90a09cd15305931df5d01764328b6097e83ab9a9 legacy-trunk
+29471 bb813346b227ee1c96461f2c3e5a39894fe5e7a1 legacy-trunk
+29472 1aaa12c08b35949f94d52964a6ad6697e086ea2a legacy-trunk
+29473 a7536ceb06f63cbfefc2092aeaccb6d278a63480 legacy-trunk
+29474 548e6ffbff757ab896ace089250697628f2afcb7 legacy-trunk
+29475 3f3b7a6086b73b3beb0c877b836e7bb59da9c2d8 legacy-trunk
+29476 8a88e977a71bbe63ec0b7c672fa72d3f0f412f05 release22-maint
+29477 83d21ea9457db2ecfc6d191463d9f2bdf9ae29be legacy-trunk
+29478 bde3660542cd3e190ac98f6bd5eabd74b3b98fe1 release22-maint
+29479 41ecaec5b4f81ef83db7ecc352020a3dcebeb6be legacy-trunk
+29480 72057ef902aaee070d11fcd33f3441bdf756612c release22-maint
+29481 28cff60a609702de7991719640e960591d676d01 legacy-trunk
+29482 4946d4f37d84e2aa4888dc0e1aac55ef8898a9f1 release22-maint
+29483 3d627e3d956136521aa7b74433d337135239a514 legacy-trunk
+29484 31b5849cac42fb58134152bf2d104194d952c224 release22-maint
+29485 b28e9bf0f046ae9a3cc9d108a343096f415f76b7 legacy-trunk
+29486 029e75ffe750d34c3ade052212e230cdfd696cfc legacy-trunk
+29487 36ea31bc907650e104f8867ef3518d99e2912f51 legacy-trunk
+29488 03b0270e116b372a5c813d8f041d9e2ffb301d1b legacy-trunk
+29489 c6ca39b158cdf9b3603ef8319588c6e101e75327 release22-maint
+29490 3263ad4fcf811a157ea990ece8b938c8da82e9f8 legacy-trunk
+29491 d424558d24f9032a9aa0d7554b314a62a3dfdc54 legacy-trunk
+29492 5be5c84dea23ff70248d6429a2a382eb6256c8f5 legacy-trunk
+29493 bd677c8e4067024946acd6f0b96039426d6b57fb legacy-trunk
+29494 36de5a731257ebab14ec11fdfc28ef4664ae91b1 legacy-trunk
+29495 9bfd47a9c8b350194bfd5985c2328ec43219ac37 legacy-trunk
+29496 6fa5c95408ebd84418f803f1a3f0a17087b5a561 legacy-trunk
+29497 8e32468427734c9aa16b5421064bebb179a683cf legacy-trunk
+29498 758301ee0bb765c8ade79bf642a1bd6e163b71fb legacy-trunk
+29499 f54e89272aded2953b19a26716309c4fb2a188a1 legacy-trunk
+29500 9b47386ba5b8054c77fe7799e7efecfbd854f416 legacy-trunk
+29501 1244f4c3834f49022fbe82bb4a195c6d45c6ca25 release22-maint
+29502 18e09720738f6ff531d7746554b9f04aaf014cb8 legacy-trunk
+29503 0bda20afe6233fb37d299143f4e46d65f0a42aae legacy-trunk
+29504 d68fc49a709601bc009b32b96a5cd4b82b8891c3 legacy-trunk
+29505 64a96b97e1e97ceb7cd5c63eb73bd0fefd6f661b legacy-trunk
+29506 2df98ff2cdda1a65276411ce13b4dbad4e694141 release22-maint
+29507 a2f36934639307ebfe068c9476079a695503c09e legacy-trunk
+29508 f5439f8133f857b389f69a4aea5a11dd3158e8b8 legacy-trunk
+29509 225ea1f52de95a9196055eb98fd1a6a5e0f063c9 legacy-trunk
+29510 1de7ac729bfa923a2e00d62588263a38a13ba856 release22-maint
+29511 183fc21fb8662323dcb329803f33eeca62ce00ea legacy-trunk
+29512 6ed2e23aae456523806e2fd712f46797edfd484b legacy-trunk
+29513 771b6f521b9561d8e42e924d1a15433e4c693923 legacy-trunk
+29514 521e89c4ff4478209173a458988f30061b12a63b legacy-trunk
+29515 3a7606a2237bb695721cd063915b35a502dd69a6 legacy-trunk
+29516 525cddb7682acee7ed8b93864a578d21e87201ab release22-maint
+29517 e9aa394c7191727fbac5f5e85d83ed29c8f6c976 legacy-trunk
+29518 ce369cd5626be7141b3b82a6f8d2d96b088bccac legacy-trunk
+29519 4b8044d1f1ac32819a6c0b60119c706f57d91b0f legacy-trunk
+29520 9da026937fa5280950c5879b0d68f58043c79a54 legacy-trunk
+29521 1c99a5a0b87bde602dda0fbedcfe435a14e4854b legacy-trunk
+29522 6ee2f9b4bf5c4b72fc107745563be98f1c92f362 legacy-trunk
+29523 1dbabc5beff7f55a9bbc402b5ba83e783a6038bf legacy-trunk
+29524 a5599740a6e80f90821a6e817d959bda8ce6fce3 legacy-trunk
+29525 b4a6283b915bc61d5b6699ec3f495a2e8be907e9 legacy-trunk
+29526 5819c4439ba2464e9a344e47d479f1f62410234f legacy-trunk
+29527 c54716aed26a06deaa6a9d51e2488ae39f231b6d legacy-trunk
+29528 1b4c5e66a4b4ad17ca105bc48fc9ee6d07049e8b legacy-trunk
+29529 8121358e321703a574e89f07d4635701fb638ab2 legacy-trunk
+29530 696864aa05d334310250702560fc9ad616070161 legacy-trunk
+29531 6a42536fb9eebb9900e4ebbaf39a9176591ad831 legacy-trunk
+29532 ba2194ad3b423c3eb83c8d438080b426099990d5 legacy-trunk
+29533 1a30ed19f64aff90c0e1e6105a2f310350e89d32 legacy-trunk
+29534 13b2ec536e0705e9813c3dca56c7436bb4da4384 legacy-trunk
+29535 9dd9379ac6d6793b7768b1b9a3c5cd4b8389a0cc release22-maint
+29536 3c23e4c3da02086f5a6fcb72e3476af2887d69bd legacy-trunk
+29537 951dacc21847d7050f2187948af8ced51f002716 legacy-trunk
+29538 9b5b7da362a5c6fa5def3201bb55470c77d62c48 legacy-trunk
+29539 0dbd6b73abd231f1389f96e63ddd6cf1479d54e2 legacy-trunk
+29540 fe6e9894c2d42a4baecbd06c8d95ab929b7e0f5b legacy-trunk
+29541 9514079320019d69d0177dd812e31a8e879a4078 legacy-trunk
+29542 d27e5cad38d7824e4e8809f1ec1dbf11a3329bce legacy-trunk
+29543 ef5893bb79ef39c99c7564817411eda591961952 legacy-trunk
+29544 87b7fae10a1930777b93a172f1a70b2da0e72eef legacy-trunk
+29545 868ff0dfabd2cbb064940a209bc3080aeaf45e8a legacy-trunk
+29546 f2ed722ff00350c26081a6bcc8e84d91a31ed9b7 legacy-trunk
+29547 88bbc30b08478d1326732af95c471e7bceea2a02 release22-maint
+29548 b063c43f4df032ce881d11c57812d086e6a160d8 legacy-trunk
+29549 dab2c12b682e78755871c37bae94e99ab2cf5757 release22-maint
+29550 7fa93b5ddfbd49257e43224a8093881559680f05 legacy-trunk
+29551 d2be796c4b81d7b9a7372ba61a4a1cbeb05d690f legacy-trunk
+29552 1afca375f2a9e36f289915b06235228ad54096af legacy-trunk
+29553 f3d44926a1befdefd7e0fa884b4df17acd2051a4 legacy-trunk
+29554 98322c075f4d95388625c7b0bce1d5177d6437e0 legacy-trunk
+29555 53a3823448d93af23f7e9c4294aa2d85e1df8639 legacy-trunk
+29556 cab167613e43b737bf954c82d43dcf5a2998c57f legacy-trunk
+29557 13af80f0208008f12a000fa9a4693f570bcacfcd legacy-trunk
+29558 999accfa91c56da7aa8eb2326384c683327f2ece legacy-trunk
+29559 f3a64035ba8bf196329534e2780bdfc99b17d3aa legacy-trunk
+29560 2c1bbfc122c1a66fed26640d2ece1207d213a8b2 legacy-trunk
+29561 4a288b494cb2c9a80ad3e3d4192734a0cf1e59da legacy-trunk
+29562 d69e8a9fed11fcf359824509dc1c2ff9f3e1a86e legacy-trunk
+29563 34e70b89bbb723243a6920d0e2ebf391b76ac410 legacy-trunk
+29564 b564ec4b7e5b3319e42c372690f6730459c98d99 release22-maint
+29565 f3537317b1b25a6f1e044bf550826c31478931bd release22-maint
+29566 35158fd60b3ba22b72d8af39c917794cdf875b8c release22-maint
+29567 62f88c02c98728f306eb6bd1e27ac7b8059be35e legacy-trunk
+29568 d9474c0445babf556ae41728b2565d042d92971c legacy-trunk
+29569 52652fb8649d731ad9d709aa3af867662867eb00 legacy-trunk
+29570 ff1c6046f10b947f61a6f8a870646700d3e3e703 legacy-trunk
+29571 f62f773bc9fdd2a2d9a0f6a33ac8b04a2b341a24 legacy-trunk
+29572 f467427e03fa9d5cbc1d3232bca7875f5345a15c legacy-trunk
+29573 cbbf7f2425d9e108a264931a9af04e235dff1d5a legacy-trunk
+29574 e526365ddccdfd0edd00999b0c94e56cd04e07ec legacy-trunk
+29575 933c6d608d01b3cd43097a32261fc919b3ced1b8 legacy-trunk
+29576 135f08b73bd5d8b1e710a1cf95b0bf39566f1ca1 legacy-trunk
+29577 756319a137b8326df0a0c82e5df5512556b6af67 legacy-trunk
+29578 0820ad49829d80b9875834bc327bbad38ba26f1e legacy-trunk
+29579 1f365b98f11cc545ab1c6e971beaf4764d5ec719 legacy-trunk
+29580 081190484af61616aa1c7ec95406aab2075cfd8b legacy-trunk
+29581 00848342d4984ae475c3d098c837ba9eb46efaa0 release22-maint
+29582 53e9041efbe3fd6a49198f66cb0f47f4d83203f5 legacy-trunk
+29583 540881ee2d4acc4c58867390a967a77b5a529c28 release22-maint
+29584 ef3f6929fc0e195954bd5a7d5641ccf82b8b47dd legacy-trunk
+29585 2832628ee8cc8408a366aad9b84da1db702e40f4 release22-maint
+29586 e61b946474dfc69282cd917eb6a0fc3c28986292 legacy-trunk
+29587 964d6b79c22e2e9c3dfaa538311b70d7fcb4bab6 legacy-trunk
+29588 2673732ad5f191b669ad94634876da3de0655884 legacy-trunk
+29589 adaa450e7d70dc021a2174ae9d4268acee9474e7 legacy-trunk
+29590 9ffea50e83301779a8d0b04eb23a940b63c25af4 legacy-trunk
+29591 2f2a2fd844bd74ba8f640b449b671eafdcc4bf25 legacy-trunk
+29592 9048207992f00bb53ca2de1557dbad40b71b5889 legacy-trunk
+29593 8965a2b804b50495bcf71379d2cfa1cd11ca77ea legacy-trunk
+29594 e9aebd4cf56cf4f8268b2af0f3de52d1ef4c602a legacy-trunk
+29595 9c4bbb3bbd0de7236ee5524387ae9b931ac53bf5 legacy-trunk
+29596 004216d7a1dabc009f2f09f18d4e9efbc8740d8d legacy-trunk
+29597 1ebb5dc7f696ef75277660778955e49ddddccbc7 legacy-trunk
+29598 64167760998c431439bdeb861be1292a8751d90f legacy-trunk
+29599 3ad4fae9ed3ad0c6c8445506ce7e1dc486fda125 legacy-trunk
+29600 cfb317e4a7701d2bfd4d2e474b7519fefced6708 legacy-trunk
+29601 a6d16e84fec054e9421d1d5d06cd7eb61785f227 legacy-trunk
+29602 099d36cbbb611ab5fb324bb2f42563a041304c8a legacy-trunk
+29603 98f3fd1ed42f057665522d941f0e687714a8336f legacy-trunk
+29604 e2226d47ebf01297c98a1a907b4ac5910bd44db6 legacy-trunk
+29605 23ef7c163a125029f5109c9855715b398c7e55ea legacy-trunk
+29606 4203047e202237e4c91a8de425b0500ca75f9fda legacy-trunk
+29607 a56c90cfc00c0dba7507109178e839ba71a2e04b legacy-trunk
+29608 42cf1b5e63926f6dda369ed986ae14d1431830b9 legacy-trunk
+29609 e98a213101b38a9b8d53b8c1c212a528014713ca legacy-trunk
+29610 4b905e1983b610b25a3535b9592072a6987eb7a4 legacy-trunk
+29611 076512a0c6c22c92b7283214cd89b400b2fa6b69 legacy-trunk
+29612 f4278af8eefa02bafa79686fd9ec4bb238cb49b4 legacy-trunk
+29613 6e41cfd25bdf0fe286a1d6d733dc570f99da9adf release22-maint
+29614 a2ae635e43b6187112585721d9769cd1356ffe0b legacy-trunk
+29615 4ab6b7c3f3117d276302627e6b9eb0d0047e32dd legacy-trunk
+29616 144d9d48b96cfea837a00c9e3e4e1c2c3681e393 legacy-trunk
+29617 00b4cff93618e8002d9b37abe9bdf919bb5a86cc legacy-trunk
+29618 6ce9228a3da200a2cd1135be1937c1179e07bf4e legacy-trunk
+29619 c2ec789dee5676bed02c6a6fe725990bdaa499fe legacy-trunk
+29620 bdde94e029180b54e353001c907f46706f9a51a0 legacy-trunk
+29621 a48acb5b40efc455685d57b14fb9e5c4ab987f7b legacy-trunk
+29622 913927d3261edb213dd6267585c35589d9c1d3cc legacy-trunk
+29623 9bb4adfbfcc83139748528dae136d790137e5169 legacy-trunk
+29624 65d6f0bfa4615040d4ab8b11cac12c340c99f7b1 legacy-trunk
+29625 0b611e50c5fc3c4dcde7e0740bdeacb8e6df79ad legacy-trunk
+29626 58083d8ea9a5ad3e601b3a00c36cb835f34ef347 legacy-trunk
+29627 3e1e9616f8c865a02428c5bc203ff601233eb14c legacy-trunk
+29628 9749732a0f6b9ffe80f9fd2303f2735cc6fa9d94 legacy-trunk
+29629 ec3414c58872629846159354938d11d4885cb3c4 legacy-trunk
+29630 6078abc69036fc76fbe0e9c4835c4d9b5669467c legacy-trunk
+29631 bb718782e7369c5c25b7ffd5e242806c7937fc93 legacy-trunk
+29632 8ceb455f554112cc7f5e0258998cda08225118a5 legacy-trunk
+29633 f49292621b173aaf7d98aac10ab007c0bf8bbd47 legacy-trunk
+29634 24a5522d0784b359d209d489be71a6b03209994f legacy-trunk
+29635 f0ee37e8932fac8d053e706319ad5f197166e98e release22-maint
+29636 27f64314f0de7efab6b6e9b75dbf9088bf815e4e legacy-trunk
+29637 e62774b447c107a888c44df3630302d54a78ee56 release22-maint
+29638 dd10d97d329a60e70e12a4267f916be5f6804b56 legacy-trunk
+29639 3c083f881655d34f6cc30085c6781741f310834e legacy-trunk
+29640 af5b4176f4ef686da1eecd84fc7c7200ab596e32 release22-maint
+29641 63a08639dae2a3ec0e23f70371438e549f991da1 legacy-trunk
+29642 29f7d1d5e6d6249ffea624f861409c86acd438e0 legacy-trunk
+29643 e3d2691fb6b8c2fa0cc7dc4555528bba91382256 release22-maint
+29644 23df4656e8a2aa477c07adf4b3c59777de52d8ba legacy-trunk
+29645 1ab657e007627584c9f8a7dd58bd8bb19c7bb4cb release22-maint
+29646 95c9c566bdd6d8cecceaa7950cbbc3631ba936d7 legacy-trunk
+29647 4b6d8f51669817f13708e6ca33a2ac5ffd084999 legacy-trunk
+29648 251e552c835210e67ba03da8bc76f6b14df5e246 legacy-trunk
+29649 5b62b9ea460b239e32fb62c36b3b80c3ae7d985a legacy-trunk
+29650 e71770a7f549fa8d3fbc6423a4da7fa4179fc3f3 legacy-trunk
+29651 04d3f95cfd89f0c0b480fdb08536030fd33d78c4 legacy-trunk
+29652 082930dfbebddbe96fd27af122467369f6f116d8 legacy-trunk
+29653 1c055171b8711fbb99864c3d9c7cf4d8d7ead54a legacy-trunk
+29654 f96fa3a6dda418c244c1ed8fd5ca8aba5760717b release22-maint
+29655 83ae4a902df08f739932226bb6f878d9ea22a9d4 legacy-trunk
+29656 dbe25687be6e5c369173d7940864fbdf87c34f1a legacy-trunk
+29657 0b23cda004170d9a62c20a490b8530d4d017f61d release22-maint
+29658 46d0b46a754fe1b57afb9bad9b97e149d6036c32 release22-maint
+29659 1af410e33becf581d74b7f4299a4541b91d069fc legacy-trunk
+29660 f72b1f8684a2b9826d4408cd3027a6652208a78a legacy-trunk
+29661 3e59d674b8c36433ece0c5a09fc86d76bcbf8c44 legacy-trunk
+29662 4c2532c1cb2de24d3d501333d4e4e0a9d8fd67b3 legacy-trunk
+29663 af3964679e2fbd9bf9696afca0d41b836fa6b122 legacy-trunk
+29664 ae169f5b94e048136489485889b33873d7a931c4 legacy-trunk
+29665 0e0b3dcf7878989431d98875667203cfea18e6e0 legacy-trunk
+29666 38d1f83d577108a6e309e0600b80198a71877144 release22-maint
+29667 d6dc46b9af3c0e268ea470e27c7260cdc8501550 legacy-trunk
+29668 390bf5d2d8e7df66001919da2cbf050ce1138cdf legacy-trunk
+29669 9c7aa43b21a9a9b0efece0c83cff376931a5e902 release22-maint
+29670 d5633e93f707f342b542003dc9edf310c9c4fd5e legacy-trunk
+29671 9373578822b590e07a010d65ce764cc2e3e4dc59 release22-maint
+29672 a42f63a80cc8736a7a650fc4a16e1cacf45f9567 legacy-trunk
+29673 785ad074027bf0e33fcba54596a09610ca533593 legacy-trunk
+29674 cb71e7c620e2f50a97aef24c03ed72e03df75449 legacy-trunk
+29675 1df98f68d607530eaac898aa547ae1676e089ba8 legacy-trunk
+29676 d37f1378d8b8bf9ad369abd0632bbb2e2477289c legacy-trunk
+29677 e0233c4425026ea8b09cca3d889be349d3e177c8 legacy-trunk
+29678 7e58a15048726f2bb04ee9c9a7f5b95630f1f962 legacy-trunk
+29679 1cd8106bcd2071c9df56a1194a524bd9bc8ec542 legacy-trunk
+29680 baf87d26ba03d537beb93f6085d9a5d03c52442f legacy-trunk
+29681 3f5773a8888efd665ba7636aa6fcc418bf61d30e legacy-trunk
+29682 d33005f8388e74e1957dbafeb37cbeebf10a4919 legacy-trunk
+29683 ff92cc27fd1ff30d5415b8d0e1190ba716e134ad legacy-trunk
+29684 ffec6740914059bdea9122c33bdc7110f19fdb78 legacy-trunk
+29685 58fba595726eadafef61dcd023a75e6eadff741b legacy-trunk
+29686 383587027c74d1c1b8373df078812052d7c94da8 release22-maint
+29687 f465d6692bde33503314c0534fd091c487958fbb legacy-trunk
+29688 7f870467c182a75e0d44854f4a78d52aadb7f260 legacy-trunk
+29689 b8303413a57e5a15dc17c49c7468e646ae6a5208 legacy-trunk
+29690 a5d1e0814061c52ab2bc37f61d41e51ee0628096 legacy-trunk
+29691 e89056718235dca87a126e522db537e96fd7f5d0 release22-maint
+29692 7cfb52f981396feee89e71b3f2076b699f87d58b legacy-trunk
+29693 127e4bfacbb75049c314e5b107d9282ca7630548 legacy-trunk
+29694 76f32fbe03cc54e554f2049faa01eeb430112f44 legacy-trunk
+29695 57fcacbdc885a557c2233e21ba24e5dc3e1df053 legacy-trunk
+29696 20fa6329b58ff804062aa89f9532f9b7b4c58e10 legacy-trunk
+29697 eb0c0c83b92a09ff6adc4846ed6d35dc9e92012c legacy-trunk
+29698 ffbead3484e1033b2c30c3860cdaad6bb442ffdf legacy-trunk
+29699 c95190532c0cb6d9e1e044870632118ac461fa13 legacy-trunk
+29700 52f6133e20d20eb603bbeb3868423f91d2b1cc0a legacy-trunk
+29701 adb93f4e978051e46faa00a7d8dde2a982648034 legacy-trunk
+29702 190389fd8159c7c46ddf998ae29741b2b3a3daa7 release22-maint
+29703 ecdff46202c0ff35cbef059fb1468dee16a1634c legacy-trunk
+29704 529719a5350e75ee31f1d4394354dd528fab8f81 legacy-trunk
+29705 cb248704b784e3c727459199d67d619c54c2a2b8 legacy-trunk
+29706 79420fa222b850595ac57d488d3c2a6278b99f36 legacy-trunk
+29707 e26ff75dcf6911c01b231d2bea165e3da37d0a9f legacy-trunk
+29708 c42b637b95146d7386d485a01b19344f1997f9ce legacy-trunk
+29709 c85480692cae9cd900a50a61dfcb4e9ed09eb2e7 legacy-trunk
+29710 87e69bada195eef5f6ca5ef8bc76d5b25a2472f2 legacy-trunk
+29711 93f30c3889aa4b7a82b3411f17f2c3a3501b06fb legacy-trunk
+29712 3ee9519eaa4c47678f60e590e5537e16edb1a5d5 legacy-trunk
+29713 e9f89dba5093b0a383d9b721d018b180eebb49ab legacy-trunk
+29714 449b2b5caf582fddc8911ee7d32d60cc7d27850f legacy-trunk
+29715 edd2eb88fd6ca0ecb4d647bc979dbc497fd994f4 legacy-trunk
+29716 a0efa4c9569e3196ddbbe4e0d526df353b1a259b release22-maint
+29717 e42997acc7f1e7546866f7e7dcdddbe6a4df6ea7 legacy-trunk
+29718 a4e3021eaa7d40b9edb6143157880af0e7936955 legacy-trunk
+29719 b1388f58bdb5d10e160332b0c59d1d8bba066ab6 legacy-trunk
+29720 4c06bdd7d05c2f32b7f412fe3914399d46be8dfd legacy-trunk
+29721 8ed66edff387c6d482447471b8f4b59c10b4e1c9 legacy-trunk
+29722 ff7639ddcaf21cb6c6ffc341665a2d59ae0036d7 legacy-trunk
+29723 61a0ef542b6f5e1b585b0a498870ea7b0961b068 legacy-trunk
+29724 d62c1ba3396406864da5d062de335e7d0a16bfca legacy-trunk
+29725 3be1bdc779e06f04960ad91db2e1f28c4fc6dcdf legacy-trunk
+29726 0e8990e892b6d6a2c8cc34cd155fbe7b43601c39 legacy-trunk
+29727 02d48ed447a83b34cae88b37f7218c33a28c5a08 legacy-trunk
+29728 149165cdff7cdc493719513a14634fce0ce0943b legacy-trunk
+29729 cdd289a06614a3c349724fb99f34205e8d4b00d1 legacy-trunk
+29730 679b2b8254ae666d78f6f53833ddcaf5bb88bc89 legacy-trunk
+29731 4be34bd73dff41e67a9cee17f64923a57247b77a legacy-trunk
+29732 22d7325ba7ac4969823ce8cee6d54d9c8e449d79 legacy-trunk
+29733 a8d130a6a74d68e9ba05a7953ea8f58ef2ad8260 release22-maint
+29734 f23c35f81033999c8539875c054cae146899ec02 legacy-trunk
+29735 b19443bdf447e7d81a09c973f76a115ed479191e legacy-trunk
+29736 60d809a25baec8139090a774eb48fc834635d3ae legacy-trunk
+29737 b327ffcfe9b7b9614aa02863d1fe71e461413590 legacy-trunk
+29738 205fbf1bd07562f2425606adf8f912fd596b8095 release22-maint
+29739 76601fb078d4017c8057942b2761458123749790 legacy-trunk
+29740 244e8fbe4e204540d3f44eadc35a815f79472949 legacy-trunk
+29741 533eb53a7fbdd03ef546e7b20f5657203e0b72a1 legacy-trunk
+29742 e38d50337e8cd83024fdd3aa4ddb7941b2f500d2 legacy-trunk
+29743 42279f7d244df74b276b3095015e0f5f3fd7a053 legacy-trunk
+29744 34fbbcb105a43b665602b5eb4fb789fc4c8dc84a legacy-trunk
+29745 83ccaaab3e5e477d62f97650485a2909f45bb5bc legacy-trunk
+29746 6b556c545ffb38adbb70dc4092c0bb80bd1da594 legacy-trunk
+29747 e270c0d41a05057a311647c624bd2c9c8da3bdcf legacy-trunk
+29748 c419fce1529e57be4af02f7bfc1b0af5897f61d0 legacy-trunk
+29749 fbccef8b315331b1427782fc482fb44b9aebdc82 legacy-trunk
+29750 57c6e84f71cec66a0d7b81566bc69d096d59122c legacy-trunk
+29751 958d07085dcf4ae808c6db96ed3f35cffa20571e legacy-trunk
+29752 50c958f703e30289e26a6c068f009867b748b567 legacy-trunk
+29753 d66129b551db4fae208f27ac59c4766fb6c55a30 legacy-trunk
+29754 3ac464c37374c4384fef181504dcc3819875ea9c legacy-trunk
+29755 7c08f6cb90e4f96e12c931ed4285045fef5ad6f2 legacy-trunk
+29756 d4411d950d48325503459605da105d927e52ef09 legacy-trunk
+29757 875140d30e176560adf426ddf5349c0b8c15f7dc legacy-trunk
+29758 eec99783716c3acdc4bd542fa600fca394b6e571 legacy-trunk
+29759 ce640dab10e432c87989b80e4c55e71487d208cd legacy-trunk
+29760 efe58c10ccf16d0066bda2124184d9a3b68f6f7a legacy-trunk
+29761 4ed230a0c931eb0f1ca53da5d9fb14f4e341ae7f legacy-trunk
+29762 42bfc98d295b7851e170177def710ff24928344a legacy-trunk
+29763 96bdb44763c36df19654192899f4a85bbb217a88 legacy-trunk
+29764 a24bc6a2e2cdfa6663ca25072df4c69b8c513d38 legacy-trunk
+29765 b0b608598170205fd1740a43345be744572e781a legacy-trunk
+29766 0934a8a0ba0d854fad342db258d236977feaf4a4 legacy-trunk
+29767 e96575f7e96a7ec2f004ae71cde052b8a2e328ff release22-maint
+29768 d31ddc66b1b551f99cffe4f86fbf3a439bca0b95 legacy-trunk
+29769 316fddbc1e07eeebda806e1360281d6c854706d9 legacy-trunk
+29770 ff5b510eba6b67945bf8312466d07c09ed38955f legacy-trunk
+29771 6d0cd80e280430d88cb0021988587ce280bd9a2f legacy-trunk
+29772 1bd9d9f02ad1b4562c8b038b5d064a68c7a394ed legacy-trunk
+29773 bea991e65ffd39c89e8108cfd580deda34983a56 legacy-trunk
+29774 bacd678b3c4ced234c2c6d9434ae27cc16283043 legacy-trunk
+29775 f6e46585b6b34c0dc6be994c3e314401108d2786 release22-maint
+29776 c77435d87c2e920dc405605c8b383439997433b7 legacy-trunk
+29777 dcde25347e938901d51a3fed73022a82912c021f legacy-trunk
+29778 e3b8f77a69800b2cb2b08dd095ed64df0cbcb5b5 legacy-trunk
+29779 ff7ad32c9554edf28b9dd72df64a60b9309f627e legacy-trunk
+29780 0c89937cebed376e40de69f86141f809529e3bf7 legacy-trunk
+29781 080838e38e7c4ae84d22811e186bfa76b02b286e release22-maint
+29782 32df8d5960d182fd7c4a11d2af2e2bc3fa8de240 legacy-trunk
+29783 251dd136bac3bb03157c793d07132d500dbed062 release22-maint
+29784 ef1e3832a9ea20235270c2b53bbe7244b3459bdf legacy-trunk
+29785 403dcbc9043f6874d0ffadb4cd1140f3977293ce legacy-trunk
+29786 7fc704cca1813bb3c07fc513ebca3af15419ca93 release22-maint
+29787 baa47d7e84e25836092626ab12859376919b6f7c legacy-trunk
+29788 f2fc38f8ca9de2e8b51d0367460d7eae3b326faa legacy-trunk
+29789 8b638be76cbe240b564d4146bf7476096c42d0e4 legacy-trunk
+29790 41ff50b4d097423b0f2a53c6d9bea446bbd54979 legacy-trunk
+29791 8e6013bbe7a7c3c4fe99d0a5472ad9550f7d8b40 legacy-trunk
+29792 3fd8c2aff305297399ff1fbf257887ebec14ab9b legacy-trunk
+29793 a27ac9d32f2338faac4f89509e9e20f30aaf9aa0 legacy-trunk
+29794 a4dba058f70eaffc3f8b36ce3185d9b7d704b73e legacy-trunk
+29795 910fa739f4a4e7c348509c1f93e5d1a1b53f3ffc legacy-trunk
+29796 90e9a3ecda449dc6bb1a6a5d9ab878888dfce89a legacy-trunk
+29797 d41c4b95e714de18ff8324749a11a3e2727b3827 legacy-trunk
+29798 680360e68a063a678a88a505253a79024bac3ac2 legacy-trunk
+29799 fadcab65aa874b64921698c32fb8141e25ec722a legacy-trunk
+29800 06754d73c63e4687be68e07bb4362707cb49b6ff legacy-trunk
+29801 05d6ade3e92b4b1c5815d99e287070531affb4a6 legacy-trunk
+29802 823896ce2e5d0568cb9c3437fe5e0128c3d2152a legacy-trunk
+29803 2b0e815c0b307ffe3c5dc2130f05e4413d792827 legacy-trunk
+29804 ea1d2050d7daaecf562adf50f905c697f88cadc2 legacy-trunk
+29805 f3a69037fdf0fad3a59f03757e70df4bbc43dd62 legacy-trunk
+29806 44d7eaae0d8d38b2262d32ccbeee0a6765c4ea58 legacy-trunk
+29807 3086e111783a791041b8cd8dd503ef9d303b67b9 legacy-trunk
+29808 60bd7af0324e80ca377c9445448343b98ac2fed6 legacy-trunk
+29809 601b8fc12fb953a1870c789277bbdfc23a3968c4 legacy-trunk
+29810 f3400ef02a459c47b2019925ebe80d524aa28192 legacy-trunk
+29811 c76762d66f421c172e52c00a2454bc209473a8fe legacy-trunk
+29812 957ca2c5179049a3583e548289870a16a4b6e09a legacy-trunk
+29813 10871f44e7db29d6cdf638e79ea41f8c6d0a14ae legacy-trunk
+29814 733e4b9d592ebceb094c299d098fdd58af11e396 legacy-trunk
+29815 ac7872e554059bd98940347aaeaa16e72cca5a12 legacy-trunk
+29816 6589c37c0ddd72b3f3c8e7f8489e74b536f051c8 legacy-trunk
+29817 4ec1902ee6b77ca8d95c57401c9974260fe81107 legacy-trunk
+29818 561185d13d5cc41f7612d6684ecb6397dfe1117d legacy-trunk
+29819 f785270cee197d1714c859d38d3da6155b02cfbc legacy-trunk
+29820 3c64ef87d5f89f5468044b287445dbccfb12fc6a legacy-trunk
+29821 067a2ef6d8a9f16f3b8bb48780eed3802b26c036 legacy-trunk
+29822 9f469da591a9e7faf1c5608982b552751a224dd0 legacy-trunk
+29823 547de407c133473ed3f239cb64254890b42cc00a legacy-trunk
+29824 3e02ead8de058007979f0b743b62fb7fa567f252 legacy-trunk
+29825 46bb9ad8318f18fa4d54ce9fcfd734066be0df1a legacy-trunk
+29826 7b9096501ea80d8059eecb9860c8163f890e1036 legacy-trunk
+29827 abf565cf5b5474c82e4e901ce29271955123e8a2 legacy-trunk
+29828 13c1aa15e0fb5da94837513d624ee208324ea0a0 legacy-trunk
+29829 dc399e9cab8986e9272a383cf5df2992eddbfb0d legacy-trunk
+29830 322b664a2022d8784a96338477526bcd9265bfae legacy-trunk
+29831 35f125d52cf5a81b12c010b3ea3a0b516bbdc651 legacy-trunk
+29832 8fe296ad5936b37028bed6f25dbffcb1deb0dbe6 legacy-trunk
+29833 77093d57cca997be6485c82b0a695b0073e1199e legacy-trunk
+29834 3f7aea5b93a1867928032a37b353a15dd78477bc legacy-trunk
+29835 79118632e37e401e079cbe008fb52b769ed130af legacy-trunk
+29836 54a74b0dfe26cfa62d969b22e534ccf335e1c0dc legacy-trunk
+29837 8236d528841256bc1ed778bc00609470765a03fb legacy-trunk
+29838 878fedc6c7e7c4e551430c32bedd6414e308d6cc release22-maint
+29839 6e228e1aff38587e01e331837a4b2611911c6732 legacy-trunk
+29840 b82428b17978fb0db6e0bf9052ea6d8a9b024f51 legacy-trunk
+29841 4f2d5174bd4ac5b8eeba80f0c23b4a0e5778fa59 legacy-trunk
+29842 d1d8959b138acfed9f64530283adf74023aed213 legacy-trunk
+29843 08b720cd387e33595cb6a65d1f2c0d5669843c24 legacy-trunk
+29844 0c7cb2746d8643458eda2def170d4da859840bfc legacy-trunk
+29845 c1caa5bff292af52e0f02684bad1b2957d1d1608 legacy-trunk
+29846 c2604d69aa5d52bc2d683cbc3a2780dbb58f3b11 legacy-trunk
+29847 9e489a0df7b5af9d668d65390c8b620a9babeac5 legacy-trunk
+29848 3d0e02976bc336647a79595bde52ca60489e7c87 legacy-trunk
+29849 e168763e861a2c49127fcc847fbc5c1bc4a6d7ed legacy-trunk
+29850 d4cc971d18a63e10fdfdc9fbdf901622c932a199 legacy-trunk
+29851 135bb11215a094be862ab69924b85738e8bee634 legacy-trunk
+29852 d0f2d1f3fc8542a6309c009a3b070c37e8bd7b7b legacy-trunk
+29853 0f2766302ba0a9f368e78b5445db7e0dd4cb10fb legacy-trunk
+29854 d2fb42ec8bb422e316da333627f9488f1a2071c0 legacy-trunk
+29855 ab3763d477cc408a678cd13f1b1c469c54525b32 legacy-trunk
+29856 1885b2d6393a8acd704c28398c1a93ca67ae10cd legacy-trunk
+29857 f8a1ba446158469cec687bc2917d323f387f51f7 legacy-trunk
+29858 119197fa61408ed5ab81031bffbabe4bc1ad302c legacy-trunk
+29859 3d523dbc99beea4a79458b0d13cb4e536f52300f legacy-trunk
+29860 e7486f3ef759a8b2e5427f400e2d97a2df831c3d legacy-trunk
+29861 df556fdec69d05f35478e1dbc5c6e8b48bcb4b49 legacy-trunk
+29862 1f800057b63728f5257a1a673476826645461ec0 legacy-trunk
+29863 df719736e151b576468c3c0f9cb96fe60fc4dcca legacy-trunk
+29864 fcf9734e10214be3c4f377075a3cac232ab6b5c3 legacy-trunk
+29865 1baf1cddc0ecd969c674c7bcf74c9b6a3e204762 legacy-trunk
+29866 8a010c27d6cb9a36cfe5ca9f55466d460ab9e435 legacy-trunk
+29867 a8cadfb0ff832f6bcbcf0dad7f32ed9066a58094 legacy-trunk
+29868 d207d1d78c5d5a1fbdd429b755b2416fbf1c7203 legacy-trunk
+29869 482ae055bbd4fa0ac5c4cae5d57683ad20cf728e legacy-trunk
+29870 bb38d7abc3fcdcf78a973fcc72d1b4d42264e308 legacy-trunk
+29871 491bfc4a0f5bb62297a7cc7aaba4de3c9754e5b4 legacy-trunk
+29872 b055e7883c83fc527466bd11391e55af6be4af0f legacy-trunk
+29873 e3fae7b6c2078f4d8ac56e11f76e2cf08cfd7eb6 legacy-trunk
+29874 b27c1cad77ea70750ec4f96fff83d10b4a80f739 legacy-trunk
+29875 a0d752be557730be31902a94d9b398e392695157 legacy-trunk
+29876 2812cace301acd7fe59253c42ce61cd05f1dcec4 legacy-trunk
+29877 cc62854f636cf2107a783610584c91a2d6ffb7ee legacy-trunk
+29878 4380435fef66504f4c1d48580a83724783ff1eba legacy-trunk
+29879 cbd81d08c4301c4b80ccf93dbb8b42b0d83e981b legacy-trunk
+29880 48816021f58829215fc5e9ea08a57ca0fffcefde legacy-trunk
+29881 1b47b576e0d4a61d15f8f0d099d10bb0e943abbc legacy-trunk
+29882 b38533e01d65fc9fa8bf9d7bfdea4fe387fbf481 legacy-trunk
+29883 700e182b2901934277c3ac2702aa96eb8827d72c legacy-trunk
+29884 f71017022fcecc62efc7567cb927463a9d6fcc64 legacy-trunk
+29885 3fa6ded0a1e9480fe3bd837b5ed5a69cba74728d legacy-trunk
+29886 544727d41f5687fec9579eeada235285a23bb248 legacy-trunk
+29887 26918e2efd177aa7b8d192fe9223b94ca6b5cd10 legacy-trunk
+29888 1a094ef0fc862c44bf0a1a86663246010c0333a2 legacy-trunk
+29889 dde9c62a72fe03ab30c64a90b2ef24301f4a35a8 legacy-trunk
+29890 569e193bf59fca703519222f71b19d3172b4ccc9 legacy-trunk
+29891 f28355310867055b5183abc17d397f88e6cd5ecd legacy-trunk
+29892 d58824ceb35d58679d32107cb446c4e71df1e587 legacy-trunk
+29893 bd09e3a2d53640e83dcab2f48c2e581193676593 legacy-trunk
+29894 03035523b385ee963bb2307d82c1a92f719ea126 release22-maint
+29895 35f444ca5e05c373701677a0333499739c9fd8f9 legacy-trunk
+29896 1e514e377613e1768260191bbc9af3b6ebd19353 legacy-trunk
+29897 ab6c7b27a4cb914cd98bf6f6c7c6a5198efd51c3 legacy-trunk
+29898 9d6aed2e60e28f6777d65e6ec08ca6f74b03212e legacy-trunk
+29899 4d471526ace124b99d4bd12c3a7407d19a5cc9d6 legacy-trunk
+29900 3d2869de2336cb1293a1290121cc32fb555871c4 legacy-trunk
+29901 51d005781c86914f6a17dd6ade14963f3f697f11 legacy-trunk
+29902 609b5f37f14fe2bd91f4d9c6168dd3925d6dd968 legacy-trunk
+29903 4574b659ec37abd887b29e47b6a489c15bae1e3e legacy-trunk
+29904 6511b16ffe89ffbefb9f7c1c4586fbe925b49cea legacy-trunk
+29905 0103f0b75fe26347e88608edee8c654c1359bf1a legacy-trunk
+29906 4bee33790940ccddf230a0d49ff37b43a3a4d6d7 legacy-trunk
+29907 b0489a60597f74141c8c812beb74f1ccfe4e8e4a legacy-trunk
+29908 ad75efe2f0a66c7fdd1f06a880add249a8de4c78 legacy-trunk
+29909 c522c8c71cab0c10e856c573c01861b32a6fe9b9 legacy-trunk
+29910 c6ffd8e61cce6dbcc0f0a138f6e659b1c73e6971 release22-maint
+29911 6d5906853a7d907e6835501af4953d06e1bc7a9f legacy-trunk
+29912 c2be4dc254055435870897e9729f3607c7358a3d release22-maint
+29913 4a01209926916d9ab53e00860a4e9b3478ef7543 legacy-trunk
+29914 57d03375aead77a859950249ab6fd86ae22bfda4 legacy-trunk
+29915 d44945b81ffae00775f12fba85f17b73d4845461 legacy-trunk
+29916 c5b1305081dfd1299fca9c595a3bb5156516051f legacy-trunk
+29917 aa0e19b6e1e75a0c574ab773f158a4ccc3a96add legacy-trunk
+29918 a350a487eac11b36559c9546d50a1ee31971d6e8 legacy-trunk
+29919 367252214daf0f27529c0fb4a4ac7f56eeb268a5 legacy-trunk
+29920 c1258b1a36c6f68df6c019ead9535fba6953a1ed legacy-trunk
+29921 4ac38f28cd10a15ccc924c94c3cdb32701e2f3f2 legacy-trunk
+29922 7421367274b45481ef271da627dfc6a7f52f6b44 legacy-trunk
+29923 7777dceb66ee144ccc565fc3b5667c0478553b65 legacy-trunk
+29924 7a09b36ca379c2c07d6d7918c0ff4e087f244110 legacy-trunk
+29925 bddc4131533650d8bddd856150ff2b3cc0728aae legacy-trunk
+29926 8ea2e35997a04b205430e8144c2e9c035513af59 legacy-trunk
+29927 8b988a09de96dda669ac9750afe3692ee170dcdd release22-maint
+29928 ca01f3de664e8b6093129195d644f597d0257945 legacy-trunk
+29929 cb85aae789802ad67a655ec74bd7c8e013900c25 legacy-trunk
+29930 60e57797b8e61a311caa29ea64cb568bec60cf88 legacy-trunk
+29931 27204f0712a26ee8c458cf921f55b968b3f93064 legacy-trunk
+29932 5c7a3a17310d1a2a8d36f73e3039aced66d13b3c legacy-trunk
+29934 49f49aebf5c20be32d8e4cc62b910ff677872919 legacy-trunk
+29935 e51cbdca2085ba972a77effbc80cbb6fc323692d legacy-trunk
+29936 03afda9ad0908a3fc128e83e3bb2360963ece037 legacy-trunk
+29937 dd817bb3646bcb92ddd94ddc043da644facdc661 legacy-trunk
+29938 37a178c0fd59f2f2432e98c557be89030fffa73b legacy-trunk
+29939 ddbb057e5ab315bce9461d1c062690d438a1f4a1 legacy-trunk
+29940 15957b7e42479e2999fd80e49df3753a5bee3a0b legacy-trunk
+29941 c88f6fff1c3f1c7817364d339d9ba8e1321b86a6 legacy-trunk
+29942 14fc187334c5815a98e381d0bd1e7a18a4f5c849 legacy-trunk
+29943 e1a33136b4e267bbf4989bc33333626667b85b12 legacy-trunk
+29944 418a7ec9259930fff873573455355d3da746cdd7 legacy-trunk
+29945 a573af5db807452eac74c716ea2f9ea7d9f027fd legacy-trunk
+29946 fbb24cd54766ce77b90e305bae50c69bc3b094d9 legacy-trunk
+29947 f79ebbaa48334d582eddcdd5ab82d27addca1435 legacy-trunk
+29948 95edb48dbfa16f63e682be8b0d3b180570783b61 legacy-trunk
+29949 99c78cf9561051a9a030a5ceadc04c6616efec89 legacy-trunk
+29950 b8fffbbd68326636ddd661b4e3e8c1c8da134b6a legacy-trunk
+29951 0690f81cce78be74a10820c099ced15db63e730f legacy-trunk
+29952 13838530f61957447f9d99a0400848d526d0ae5a legacy-trunk
+29953 6c45985a8fdbff3aa14d763457bb86646e3fb22f legacy-trunk
+29954 f255b3f5e91361c44eac32e1ffeac22660786a88 legacy-trunk
+29955 e07948d5cf67c45dc7f88198b29104bb8c4c85b9 legacy-trunk
+29956 7468b68e98286f4ec1ac17de3bfccb40f9cc0bdd legacy-trunk
+29957 d1b4e7016d88a52eb8b62cd547c98aaaf711d62c legacy-trunk
+29958 7ba072db3828f7d3ad96260c6b4a3863acfe81d7 legacy-trunk
+29959 b268a6e859cb7b28649cef98aa8dd3bd9c62d891 legacy-trunk
+29960 28efe16a8b7df7ad0e964dc28346c54a5ebd46a2 legacy-trunk
+29961 e26a208ea71b835716fa03b5e5f2d7481eb44753 legacy-trunk
+29962 0f848b06146f0c975467da0148e5544dd800ce8d legacy-trunk
+29963 b4ce6ac17f6079e66f3421a8f065b07d082e423d legacy-trunk
+29964 2f40fa79b59a5f279c03d71acc0d1fd9dd8a43d0 legacy-trunk
+29965 b8a7c4cf3e6d260059720eccb582079aaaf35cfb legacy-trunk
+29966 c135fb2bb825ae8085b281fc69296f2d33abe775 legacy-trunk
+29967 a56e0b2517bd83564a823d69b720f6b1ad130ff5 release22-maint
+29968 af4698e591ecc8e2985b3e913c20d2fd40eead2a release22-maint
+29969 e0b596060313e63708f7a294e5b00fefa441614a legacy-trunk
+29970 238cac97d16584be3155b7a4ed444c4e66af5419 legacy-trunk
+29971 b31bd004f430c73388a09c73b0a823e71b608d18 legacy-trunk
+29972 3f8019273549ecf2a89e96ebdc6fdfcf039bb00e legacy-trunk
+29973 5467c6e1f541b04feb501739874e7fc006f87664 legacy-trunk
+29974 2775de35dd29d49ced506d6b72d0ac715a76fd1c legacy-trunk
+29975 f0772bd7cc4012c20f874f813d8930c848846fad legacy-trunk
+29976 f8d1c6820bfaec5389d771966175243edee4a46d legacy-trunk
+29977 76f79bb36fc773dc91ae41397fd5e7ec3cad5419 legacy-trunk
+29978 cd1fe4b5f7ffcc23ee9c92b962465a925e1db48a legacy-trunk
+29979 f86130f45bf750d8f9bd88d5e24dbd69d6391ee9 legacy-trunk
+29980 671327195dc30ea5d2c47eb29495726063606722 legacy-trunk
+29981 825445f9d6b8b02c8ebca22275a81cf1df4b050f legacy-trunk
+29982 0015d3f189e149a29b66a52175a68404d2dcc737 legacy-trunk
+29983 eda8e6898dd3ee7c11e32d0e948d7a5f3aadd7cd legacy-trunk
+29984 a9b4b6aa12202774ce4833e3d2eb05dc00490a50 legacy-trunk
+29985 fa4532ef99c9a9f0883a2b11beb1a9b488637bf2 legacy-trunk
+29986 e923f6d3b4a330917717fdb6973ce0028e57a08a legacy-trunk
+29987 9e4c80340fa1d9755ef2cd83fb58fb23339d611e legacy-trunk
+29988 f40a2d3a2ab55372a5cf6f2d124d0f870059bcd5 legacy-trunk
+29989 2d44abe57b4263840dcf80589432cce33cd61dc7 legacy-trunk
+29990 376bd357c4d5ae6d167a2fad7a7d626e54ef0694 legacy-trunk
+29991 5a9e7064c9234d127d20847b0399ec31d09b044e legacy-trunk
+29992 643100170bde91f865e8ec3e804560e446bcdc6a legacy-trunk
+29993 50c633a87e35547f1b3d9ca0a2c9c7b8b381b500 legacy-trunk
+29994 fd6fb73fb20fda1fc988e9e8ccf409e7df673c78 release22-maint
+29995 8504591e4c631b4477aa01c5a0a563f900d13f9d legacy-trunk
+29996 94c553eb88c3a57792cd9e9f7ea6424812527d52 legacy-trunk
+29997 0b66d4e9f4f4859679b5b40580de304222d8d2ff legacy-trunk
+29998 17d123f33611060058aa54dff03652c67d3f88da legacy-trunk
+29999 79f9063fb58ecb28dab984b08f078c7ff1624474 release22-maint
+30000 4c16428fbcd83c5f1703902668dbe09ac7232b40 legacy-trunk
+30001 a5a8735711e816f851d42bdde840b290e75adc4a legacy-trunk
+30002 7aba859cee545327c88e554e5ae31b3135be048c legacy-trunk
+30003 d2d7817fccbbbae13d8e917e522a7e9c6307a311 legacy-trunk
+30004 9fb8aade887f855cfd25b1708c807031079ec83e legacy-trunk
+30005 18dcf80e6f8dedd4e1c09fcdaf5e2672581b2c9b legacy-trunk
+30006 38fe5eb6ac25672126179ee2e02793f9e45e5923 legacy-trunk
+30007 3981cf2a5730534d896dc74dc3fbbbce5939d058 legacy-trunk
+30008 b5837b8f3b2c4c2b6b005eff2767ca13f51ebbc4 legacy-trunk
+30009 8e1567dbcba893fe66b3c093079d3d69ccc70c0a legacy-trunk
+30010 6177a13e4c145a40d18f2cba0efe4c4effed0aad legacy-trunk
+30011 d6d5222b7e5552a92e7a20ab543aade7927f67fc legacy-trunk
+30012 ca6fa69711bb5e0e2df969f3f02a7a9d82972379 legacy-trunk
+30013 61e2b8cefd86700bf1dcf1d073be03ce7bbf3ae0 legacy-trunk
+30014 6ea786528395ab7440797a923d47b2b0a3d7ac69 legacy-trunk
+30015 997fa02244bac2c2ad065a69d83b1b276736ebd2 legacy-trunk
+30016 2621968319f0344a2fc179e2e7298ac46551fb9f legacy-trunk
+30017 0e6e39fb9cd732ad6dd01c884021d4025e65d3f9 legacy-trunk
+30018 910fb66c3b81cbce3b658ca2fb2b61951bd98a5d legacy-trunk
+30019 e42732e289b9a416dcc666f4d3e6d9c8a34c7d84 legacy-trunk
+30020 58440d0b9b4ea6c7c6bcc82d9d2ecb552ae29f06 legacy-trunk
+30021 975482d5eb5ce794d5213e4828b95068e57ef3a8 legacy-trunk
+30022 9970d77980a0e2fb939c9099ab73405439bc4443 legacy-trunk
+30023 8a75c66bfa14de4ba72acc5a0449ef9fa4600c28 legacy-trunk
+30024 09c7ed1b7a8739d827967228c6014dd78dc76143 legacy-trunk
+30025 687b4b165268c759fd477e288eb8550bb6220a96 release22-maint
+30026 67912d83799f73c0ce957164b901d24d06dbd8ab legacy-trunk
+30027 8b3601a62336332de24b06b34bff457e95866e27 legacy-trunk
+30028 b9c912e2c3c0063dc90b54554051bccaa88184d7 legacy-trunk
+30029 0c995cd070267719603fa713d95cea493cff2c1f legacy-trunk
+30030 4e6ac2fe68f0bca8e3f190609aa8f03791f86b7d release22-maint
+30031 c884a6c47e060e8b1ff03039ee54b9560cdf39c2 release22-maint
+30032 4bebf1a19319c415ce93c3dd7c01438e40f6d77e legacy-trunk
+30033 a36dffd753009b8ef3ee92a3d81270a597e2f886 release22-maint
+30034 242ad5c592cc2afda85da0bc293a1ead42b9db84 legacy-trunk
+30035 4be62dc9a3e7d749260c43148c727df575d078ae legacy-trunk
+30036 701b797bbdc8fb4460d0e3532cc0c143122a5669 legacy-trunk
+30037 0dbf98ee118e26953b6171c4ddb9a84ba45ebc89 legacy-trunk
+30038 8f743ebe6c6632b00a3cb2ef137cc6742fded6a8 release22-maint
+30039 12bc4a3e45af8a24c1b8ecfeb86db85dd72b7348 legacy-trunk
+30040 851c629205d2f3fae32a8444989348d6e0989859 legacy-trunk
+30041 b566be8bfc23c790264de0c8bd251d3571da44c6 legacy-trunk
+30042 fa65f94dc4cdbc74590f58087501bd41bd1e154c legacy-trunk
+30043 a9f6c006aa458869096c438f531fefcce4b588d7 legacy-trunk
+30044 715e2888f377fb92ed213fc459cadbcad0648768 release22-maint
+30045 0601a90558fdbaf39ecbd786eab69f86b5156349 legacy-trunk
+30046 342c34c438a2608a155465fa2ae483604c6ea5e8 release22-maint
+30047 82b9f5c7d01a146627fee68f4aba4f5abadf81a5 legacy-trunk
+30048 2aba1ac4744c967939552fee8dbdb57f0025de80 legacy-trunk
+30049 cb8cfadf75a27bf8b53e3a068b0798a1e958a592 legacy-trunk
+30050 d755d4292f3ffb12fb817c703e2267fc79d6e350 legacy-trunk
+30051 29e8de59756a45b62edfcb88268b50d910f7ac49 release22-maint
+30052 1d9e30c05cde4cb269ac15ddec617ade04bd7b7e legacy-trunk
+30053 93b5ca9423eb2795bd7a318133113b957fd70a52 legacy-trunk
+30054 7ae9c36cbcb66a719beca803490f0b8272ea3fe2 legacy-trunk
+30055 405239a7e0d8bc9488c7b86bc1ac2beb16551a5c legacy-trunk
+30056 8ca80843a6716175997290e96ada02cad97431cb legacy-trunk
+30057 e8940d4cd8cae7ae36fcfbffe66473e3dea8b16e legacy-trunk
+30058 d4b76817c9e63c65103f7c433e9371573fab260a legacy-trunk
+30059 9206b004f152c43d5a1edfc2d23b2f0f54abad54 legacy-trunk
+30060 952687ea9cb12d98d6601e4c802cd735c4a169a7 legacy-trunk
+30061 8991f78817c79004a0c8173fc94cb162d6319c19 legacy-trunk
+30062 4e94aa07276862055f4549b2b966c9d16e864d0f legacy-trunk
+30063 3f4383a04b6254b36a2e3302f77d8bd7790353ee legacy-trunk
+30064 e64425bb94d89a320c903bb7f112927733b2ed5b legacy-trunk
+30065 81032e97ba3ca20021d5af9799f1b1020d928108 legacy-trunk
+30066 f5b4e17749617a9601057785241cee4a6bd8007c legacy-trunk
+30067 f9d516c61e7b932cf65f7ea8f705981495195138 legacy-trunk
+30068 615a25a6eb5baac666fb54654ba53e9ba5051c27 legacy-trunk
+30069 c234f48de138f499b0d4d9f374ce751be3b4a529 legacy-trunk
+30070 0c646baeec582325bb1d940d3d60910b16ed325d legacy-trunk
+30071 211038505e56c4eb973abb56a02e123a9b3772c4 legacy-trunk
+30072 056387767832559801ab50398fcdb3aa5b3356ca legacy-trunk
+30073 c35768d7883e4847e9ec60bd9b0b62f28a25a234 legacy-trunk
+30074 3084bf8bd11c0aa60a3f3618f104c8c07ded2434 legacy-trunk
+30075 7ddea4dfa519d3ad8e602a984b1ef73227571a66 legacy-trunk
+30076 56dbd9079a13ed6ef741af5647abb2346201adb0 legacy-trunk
+30077 ecea8410178e065b12740fe3171f61f7d5d2f109 legacy-trunk
+30078 75bfc24fd74850d17e952325ab55dd5cc756a600 legacy-trunk
+30079 cc05c2c8660e0c68accbc56bd8e68872de55f169 legacy-trunk
+30080 c163ed17f8ba385aa87c03492c54cd7a0e516dcf legacy-trunk
+30081 bfb2664cdb1be87c01d61dd48b085221acf61037 legacy-trunk
+30082 af5119be221f439993f3cd42bc82c35ea82e1419 legacy-trunk
+30083 378ce020d9e68c675f466e12eb2a4e55cd0e28bb legacy-trunk
+30084 9db396bce4e75f205b74302ef38dfc41641a1623 legacy-trunk
+30085 e39e74aea2fb8a73414d9fdc5d64e0e7e59ce81b legacy-trunk
+30086 14f53b6d7f58b204b6dc38be58f9be3b3a654c3b legacy-trunk
+30087 2fab0b6488b510ac9363298f52ce105054b25a35 legacy-trunk
+30088 74d1ad61f843cb2fe4e8e2bc038cb875ff6b4a3a legacy-trunk
+30089 8771993c9aacada40fb8122c403592c68a52db4c legacy-trunk
+30090 97f83542f8eefaae1df41bc4e9579db91d4af013 legacy-trunk
+30091 28bc2d3af91db689d408018275c8f6232566b814 legacy-trunk
+30092 2c7bdbb50e7628ca50313dbd1a05deed008f290a legacy-trunk
+30093 02785248e00a6f44c7f156b0ed29811d2c14217d legacy-trunk
+30094 20e0755f35541d69ee649771913e9607b0918ce1 legacy-trunk
+30095 3be4f5d377d8b2c54a765898be854b8b08c95d84 legacy-trunk
+30096 9e751eee81f504e4525e644b82014a84951ebac7 legacy-trunk
+30097 b62998f98973e331d81acab712f413e21f12f216 legacy-trunk
+30098 cb93d9287b4eaec4df30e864f41293990a3d04e8 legacy-trunk
+30099 7d192875a12f79902abf3619e0bdae8565d264da legacy-trunk
+30100 19507a1d02548eba92d4d9a4ce1e93b7410bc6ba legacy-trunk
+30101 8096dcc7af65bbb6103cf6df47b162de1c064cf5 legacy-trunk
+30102 637b10b52e02e67f34361dcb0aa140caf794026e legacy-trunk
+30103 ba1578be5706ed5e95db1734c8ac00c8b7e5de56 legacy-trunk
+30104 e41ee2b8e73deacef6cf1e61774ae65b6e322a8b legacy-trunk
+30105 7babdaea7d19d7f3a1b2a1d8b9e29510e0253eb7 legacy-trunk
+30106 8dfc0fc4c14b510010220b51ef8245b59a716b4b legacy-trunk
+30107 98164666d2a8972a475f2931e37b62a9aa0456bc legacy-trunk
+30108 59dd9257bc0316f6ac765c5e2081a4ce2779e8f2 legacy-trunk
+30109 d7d525e30cc020f6158df05fbde87af6c5dfcdd1 legacy-trunk
+30110 890aa93dd9c38e73268c418349d5bbe6021dfae0 legacy-trunk
+30111 b0bf3604244fd59cd3dcc7a76db0308d93eb72d8 legacy-trunk
+30112 fd455df55b135bb533db8b8a16d2a1e11b5d733e legacy-trunk
+30113 96b8c8ae7262edd68ee8fb8be38c803722ee02d7 legacy-trunk
+30114 c69b8e61e695bd1e89d8f40443e94f8bc976321b legacy-trunk
+30115 3429955724b27922d6a7aee54ea2bb8475b01953 legacy-trunk
+30116 fd6be87e5c297e58bb703f406030e98af8118d6c legacy-trunk
+30117 0ff47362bb8114a046e790a40f898250d1e9f38d legacy-trunk
+30118 bb6ea07909479a63d673c70ccbe489c279438557 legacy-trunk
+30119 e783cdfa0b419a1b404b0efba38a5a6ee6b2f097 legacy-trunk
+30120 d2302339a8ad784234cc65a6e89a8810d537b9a9 legacy-trunk
+30121 02ba4663cad2127a60ae6b0a2ff8fa2c6d268f40 legacy-trunk
+30122 41188e389c6144f2c1e9388a3093eda8c49c562f legacy-trunk
+30123 d176cbfd3765600eaa3957759f45181d9f6ebb1a legacy-trunk
+30124 9267dffff32d31d3e1670fb2cd56fe9f9baf1f77 legacy-trunk
+30125 f883ed7b93c868db12ee74443885fc1385f54f4b legacy-trunk
+30126 6efa8216db6a892827a61fad6273b78e23400c1a legacy-trunk
+30127 7b1d107e63ae6f76a5e52006e7a38fd71538a4ec legacy-trunk
+30128 caa245af7786418d53af805b430600905d7beeaf legacy-trunk
+30129 6e2c2f1221e53528b6cbc9e447cb1a0fdd0dbb6d legacy-trunk
+30130 4834f8368036386d7cf2d03a48ff9146c9c91efe legacy-trunk
+30131 a800015e7cf2a6db08b67633f6d0c020517c8977 legacy-trunk
+30132 61b3d179f868e741569c2964ac1c1b6a404101c0 legacy-trunk
+30133 f356fcb70eae55d37371feff0592333da78f9779 legacy-trunk
+30134 b7bf38d44598f5589c0943e85abd7bcbef4c7547 legacy-trunk
+30135 63d7b5e396fb89d1ee8cfd768760dab6712ddbd8 legacy-trunk
+30136 40f8b648e7659b79154071d26402a233d79772fb legacy-trunk
+30137 d99e38bb6dcd35bbaabe27a1b7ef4f3acbf26bfd legacy-trunk
+30138 f838bc9056cc379d59c2b2ffee5c030e13186061 legacy-trunk
+30139 b12e326b4ea247f4c57517c8167a10f1dbb2872b legacy-trunk
+30140 e8dc1a0d6f4d4d10a40df754b95d2902aa42d7cd legacy-trunk
+30141 338e025fde8b516e8ec9bbed5222ded39a5e9e91 legacy-trunk
+30142 fe2d422385b1fee66f9987ab6e0a99221bc016e5 legacy-trunk
+30143 cb06bfc8877b249b2cf9ffd956ec63d0fe1fee9e legacy-trunk
+30144 98d11855b46cceef8343bd7f4f154b3329868b23 legacy-trunk
+30145 f76717707a6d7a092c2f402b0fec6bbb1923a6de legacy-trunk
+30146 373d0a8ed6be64a5d1f1fdf4ee09ec87a3a2945b legacy-trunk
+30147 ed28b9752f8d2abf8de54f774b2dabfc5a037d0e legacy-trunk
+30148 1312297887a3f7e06ea9b3ce8cd1dc7a25d47c38 legacy-trunk
+30149 300f926f2b3eb58fd49f041e3c4d23b01a796baf legacy-trunk
+30150 8dd25a6f5913904c7da83236f7a174d6e444f9b1 legacy-trunk
+30151 5b715cad34d0825dc18318ea1dbd4e91ff7708d7 legacy-trunk
+30152 c7ec8ad0234faf4d219751507b553dd1f1eebc36 legacy-trunk
+30153 bc9056d847ef7d46fae5954dba5ef7e2960b4fdc legacy-trunk
+30154 f7d8d49e8f5de27cb3c1e7901628c0e66e523819 legacy-trunk
+30155 43b54c2bc4e60205de05aad7702530f0b2d488cc legacy-trunk
+30156 78d872cd064c2edc490cd9c690a87c55e343f290 legacy-trunk
+30157 ab50a21b87aea12df1811a0ae4f5abd811e345da release22-maint
+30158 bc6662ba3a7755bba568fa22cffdd3e17e29abaf release22-maint
+30159 5791019b6e4e8e2beeac4d4fac16eb054d9c8bde legacy-trunk
+30160 c11a6e1cede0de18e15c41ba965d4f9b2613df2f legacy-trunk
+30161 6059e41bd77a3e5793a85c7634cdfcf57d796a8b legacy-trunk
+30162 a9974a48a4d6cf9acc0f522a3a74bf65b36ddab2 legacy-trunk
+30163 a20cb5abab6b78f5a5ccfb3acad8e07216478743 legacy-trunk
+30164 ad3f66e7fb1042013a941a1f0fec45ff2e40f743 legacy-trunk
+30165 6b390548c6980040b8021fdce0e3e8481b3007dd legacy-trunk
+30166 c74b69ab4742ab848474fcf578ecdca92680b3ee legacy-trunk
+30167 2318f4bb0bc5cd85bee74db0e25c20e821bcdb28 legacy-trunk
+30168 2e0dc9e08222896a34258430a9ac003e2e815eb9 legacy-trunk
+30169 36cd2641e82674cfc42a9e087b0f0a8637ca152c legacy-trunk
+30170 4173e43ef40cce66f63dddacf1dc0723d085ef4b legacy-trunk
+30171 975333d40bf832a402a06bfa9662a66aba098015 legacy-trunk
+30172 c4286a6ab00c9e35b9c6ac24cea97a2dada821ad legacy-trunk
+30173 49ceee026d663e2089a447d1a2433309c5495951 legacy-trunk
+30174 51e74321ad3d6073db39f40097cfbc2872f6e898 legacy-trunk
+30175 a223e25541901ce7768c6cef5ed4319c969a7218 legacy-trunk
+30176 af660cab1cbe911de9cefeda0b47dd91a7692c40 legacy-trunk
+30177 e404bbeff08371b35cc61f5517fb6464fef1b343 legacy-trunk
+30178 3ed47b07850819d1daf533c7fbe160096d45463f legacy-trunk
+30179 45ab31127bf922b99a5429e9cd81631564934d18 legacy-trunk
+30180 101fe32f56ffea5408a8028f722dd2653d571fd9 legacy-trunk
+30181 bfe38961ca42c886d51d3718af98e9511c101753 legacy-trunk
+30182 f91d78e19c866f9e68da5ed8fafd1b18921fe496 legacy-trunk
+30183 2ed34f01c81ca12a7e3f700b1c3a890079c46206 legacy-trunk
+30184 d64214694083bebd4d284dc9c0d7bd4b6355fb28 legacy-trunk
+30185 1e170a95b64fdefb8fe161a9b01041bfa1845ba8 legacy-trunk
+30186 3593f2b91d7d605e5c45808e8348e82c1b6db592 legacy-trunk
+30187 89317d93f639739e1662c62fcf2644be4751d16d legacy-trunk
+30188 d348b17ceaad69363f986cc0f627aab718d2cbd5 legacy-trunk
+30189 d939adbca774f00db9f4b20c83d11a24475c725b legacy-trunk
+30190 04b3a9f6be41f4e42e70148b2570930cfcc4a6b3 legacy-trunk
+30191 eab6d7c803419179d202190b9ca3b9a64c3a86bb legacy-trunk
+30192 2f523ae90e060c87b3e56a2b3424c4f62c2c3090 legacy-trunk
+30193 e82326996481b2104038a6093642b0386e0af77e legacy-trunk
+30194 a3600c4ecc8bf2c22abe49c6c1450339de74a474 legacy-trunk
+30195 f55f5e1e30bc9257597a3045099bf13cab50566f legacy-trunk
+30196 dfcc2057a755ae7c6f9dcb8080deae3de051e5d2 legacy-trunk
+30197 538447c9d543db2b40534f2a4bd53957574f2a95 legacy-trunk
+30198 a12e1727850af9b0615fcd9fd44cd35402791537 legacy-trunk
+30199 cfd5a682937e0c4364984ae6ab5835abf0b3eb4e legacy-trunk
+30200 924c4f22bac79491cc9a9f8216ad1a77c69cd2b3 legacy-trunk
+30201 a54363ea694605691a33074b2a1ae9117c49d8dd legacy-trunk
+30202 901e47cc8cacc820f35523e5c1610de95ef700d7 legacy-trunk
+30203 966b8279d1fad8144be37b1c950357fc88bde12b legacy-trunk
+30204 4967790472dbd3ec5fa8bc02e02ea8cd379f57f3 legacy-trunk
+30205 c7c2b222bb8ae8d4c6ff5c2824c8f2c430faea3e legacy-trunk
+30206 5fba51f3729b2ddf585f3a992e912b84ab988a6a legacy-trunk
+30207 41bd37bef3c773beb523dc0977e712d7b8c39736 legacy-trunk
+30208 9b4c014b3a218e76a9d9760c7d455f446a7fa446 legacy-trunk
+30209 573e482edec1a5836916c2ec1a0be944c5d1c8ed legacy-trunk
+30210 a03ce5d8f29754f76c6fd68c65e32c38261595c2 legacy-trunk
+30211 709f9054158521874807f6a7e012ebb912172d53 legacy-trunk
+30212 d8fda4818bfd5f56aa52057bebef50160aedb290 legacy-trunk
+30213 16aff7077e4bee4ac0970aaad144c5840121aed9 legacy-trunk
+30214 2b46d7292f277430cffc38c4b36aa969d5ecc5cc legacy-trunk
+30215 6f1f84203ecf0b1a565507bdd03c8da85abcacee legacy-trunk
+30216 78e857e9dd4769055f4881d3e8fb99131c486d26 legacy-trunk
+30217 c65e8cb91f4c36d9df8b9dfd7aa8c7b4f63b6b8f legacy-trunk
+30218 72cf089d634a1984349127336225c1bbf4e99009 legacy-trunk
+30219 cadfce66d8619a6bc3579d6a22af8b7a56c246f8 legacy-trunk
+30220 2f3d6b79f11bd3c4dbd10cadcb381fbd45f1c993 legacy-trunk
+30221 d052112731a8e25bf1721b1f51c1fe69a85948f0 legacy-trunk
+30222 b0acf5de3421ce0f6ca9041bd78e2ccac393e518 legacy-trunk
+30223 c1c8bdc4e3dbdcf0b9bd022a8f84888fe511b07d legacy-trunk
+30224 06586404ec4cda3020d269e5c7b213e79f766eb8 legacy-trunk
+30225 336968821dcbce1aa8d06d01d4d8777da59e124f legacy-trunk
+30226 db9fca1450584b53a3e9000593dd9427109d8429 legacy-trunk
+30227 60b389a4dc085501ae455673bf919f3651ecacf2 legacy-trunk
+30228 b9e45b828ae11a0e55cebede6b502a9b5b8d34a5 legacy-trunk
+30229 65acec9cbe69227e52fd6c37005508c61554adc6 legacy-trunk
+30230 16288b054fc3f1330db78a77b2557e8c530e3308 release22-maint
+30231 7c15bf7726b24e522500e46e002ece257cae6608 legacy-trunk
+30232 8c3ef524faa067fdb8637ac1595c11f255fac9be legacy-trunk
+30233 95bc0c0520345087d305213836c248a4f4e44254 legacy-trunk
+30234 ccf0b027b5856d57bf36b8d3617e31d39067d3b4 legacy-trunk
+30235 7fd1bf20a0c0e9cba517f2fcd3690db05abc0d0b legacy-trunk
+30236 c1272f3f28f5179b233d3c6e37c00364e616cc1c legacy-trunk
+30237 ecc27a1c33ca798952e12dec33800c2a1efdcb34 legacy-trunk
+30238 620096fd5564c36d037663edbf974dcb40c985e0 legacy-trunk
+30239 c609cd4906fb4aedac3caa544a2827122fe23e08 legacy-trunk
+30240 49d022b5fd6405190f9566f6abc5c6dd6ea33c81 legacy-trunk
+30241 4c9fe4905e8fa06b27d59257e793d64fe22048c5 legacy-trunk
+30242 6b31b26e418ddc8459e26e4a775e8aa9850d0b5f legacy-trunk
+30243 095440b975a1c87058ff973f616d956a4711d39b legacy-trunk
+30244 af217cca3bfc7c1348d84869bd32918d42584fd3 legacy-trunk
+30245 ad263d26825548024809e862c1c2d1d813bca527 legacy-trunk
+30246 346a07270e87dd649c8b3c208a6209ba3fafc08b legacy-trunk
+30247 aef3a03a79f10e177ae0d7cb56d1ec64af5e3057 legacy-trunk
+30248 8aa756e5accc85fccc9b156fa7d8c74af2467dcf legacy-trunk
+30249 fc7fdec3fb863d2c91293baad63982ae0bcce401 legacy-trunk
+30250 240fdbef8c60c36a0b88a8d164dfb6cb7b9addb7 legacy-trunk
+30251 0f1405ace437e926c9b84522ef2dad58cc2b2196 legacy-trunk
+30252 89dd74f7ae326c0ee32e4204bebae0a3a1a796b7 legacy-trunk
+30253 d160816b91e583d230dbc8d0484c52459ed96839 legacy-trunk
+30254 f85cb0895535de768a60d9bcee2f33798f94b1d0 legacy-trunk
+30255 bb4df0000b6d1ac4e771f37a5512155a619d2b31 legacy-trunk
+30256 44d7468d6db6e233918bedf8090f1898337d2605 legacy-trunk
+30257 92a406115e7cd341666ba25065f0ee22d88bec4c release22-maint
+30258 5efe6b0ac0e6bcc20a560ab8f300df50b25827ac release22-maint
+30259 c55e6e601b998d72b89a56b80ddb3bebe963e618 legacy-trunk
+30260 bc7f8913f5ca866cae8a21dbf71f2f9caee4f471 release22-maint
+30261 30013429bb8459e3b806407369bcbb1400eb3fbf legacy-trunk
+30262 8e27512cc17ddcb7d47b717c5bc74a3f6631dd9d release22-maint
+30263 0b34f51eab4ea487ba1c01ce9941346d6a70eea1 legacy-trunk
+30264 7c5196f01524b9e97c182268c66d6a7ee9747130 legacy-trunk
+30265 2f28436060c45654bb8581fcc07514ca2c59e0a5 legacy-trunk
+30266 143922a40fac6f7dd500454586950a85e2c319dd legacy-trunk
+30267 fbc85aaa260ba1ac4d589a7a54b26975515b7008 legacy-trunk
+30268 89c9c6c405ef8c415de87f0136606d04560b66e9 legacy-trunk
+30269 58bd7100ee157f17b85d944801ac1ec2fe54fcc1 legacy-trunk
+30270 816b8ddccfe1651614d164018999cd683ac9391e legacy-trunk
+30271 db9388f37d8c471f1fd54d8c07677686195af787 legacy-trunk
+30272 06868376aa28d39fc6e9ea289d91556e9797acb4 legacy-trunk
+30273 a2d402e7cd8add32a78bfad25b22ae73df4e8fd8 legacy-trunk
+30274 cf73663cff59ea4163d8f1295133ce880621dce0 legacy-trunk
+30275 47e7c70e841fe33027c4eb9a96c69dedadcc6ff5 legacy-trunk
+30276 0f06156c8e03766f9ff4fd18975887eecf3e1d3b legacy-trunk
+30277 507aa96a128ffdad9417ba54e9eeebc5e254aeca legacy-trunk
+30278 b2b4797052c6fdcdcbfefc61b9433a94cc321b5a legacy-trunk
+30279 299621eca9ad5312ee42f03af752957ffd0156ed legacy-trunk
+30280 30a7738943818b7ad50226c0bb0de8a6847126c8 legacy-trunk
+30281 82d8b5c6ac4a7fc2ee7d9ee0c8290966a0a42ed3 legacy-trunk
+30282 2585d4596d903b0a1080e8ab5a43f666d43814c5 legacy-trunk
+30283 ffc1e9e5ff9a7247cea6b567a52bf89aaea58375 legacy-trunk
+30284 b204b4a72b4ee8baf0450c9a5b32fb38c14cb09a legacy-trunk
+30285 2319d13d54f575155058f5710320730cc2759804 legacy-trunk
+30286 7f81d16e2c5d7aa384cec19f1e37248d2a1200b2 legacy-trunk
+30287 858ee11714a632427e33c87bc6f81a2916a580f9 legacy-trunk
+30288 9d0e62c9a128d7a147162b3b567a6fc1a6e6c2b8 legacy-trunk
+30289 edf304e60cc61ed9b6e411e928db8095b511e91c legacy-trunk
+30290 178844988812f2df0628c23f205bbdc69d53c95b legacy-trunk
+30291 2251195a3dd1fce714f51bf8dbe17c58aed730bf legacy-trunk
+30292 7c8af1979e7885b778995e738450294d77d26e67 legacy-trunk
+30293 8eccfae04bb4f6fe661941c82784b581c207886d legacy-trunk
+30294 6932794817c2d1df116a94ef6337c24f3d56417c legacy-trunk
+30295 0c85a947e2c000d667b934b32b2bcf0ea2464ea6 release22-maint
+30296 e094a03a80ff45ef6cf34c1c2c8b58cbf8f07603 legacy-trunk
+30297 57a00db731fcf1f2ccd34d827217ba914a1715e3 legacy-trunk
+30298 6bbbe67d1eaf717319df7eec6b9796bbed897acc legacy-trunk
+30299 d6f483fc9e02e3ded7bfe8fdd03a82c80d3027c6 legacy-trunk
+30300 fea92e7ec67ae3505590972609d1dfb680513e24 legacy-trunk
+30301 2e2195fe6c28a794ffe9c56d36ec1c75193330ed legacy-trunk
+30302 fb36d9b50df58c871f94aea1b9b7fcb2a8d96427 legacy-trunk
+30303 e153961f961f2f6ba71777d221029456ae15d95a legacy-trunk
+30304 3c32a94b0b1762629ab9b1bc0af2da6dd8881848 legacy-trunk
+30305 13d59dbfb8d44ae64bbadebb401165bb5d2a444e legacy-trunk
+30306 7d7a01bfcaafb86975dbe67d0d528908d29f9494 legacy-trunk
+30307 f64c96922708a5104bfb06e8de7a4f6de739b3aa legacy-trunk
+30308 f4b1beed64052d0b3c51b76d25ad854a33691d4d legacy-trunk
+30309 9e409107aeeaa1f3c31b830aa7fbba4788768d23 legacy-trunk
+30310 bb1546b4601bd0d2fbe17d110778ba1c7177454f legacy-trunk
+30311 58d75a3c8afea7ea4df3131773f7e461f3bb07c1 legacy-trunk
+30312 3e1bd137d3c2b88a5824e1f5da63b713b21adb2d legacy-trunk
+30313 5ccde8a1526a40d92dc54c8db79b67ec3f1099c5 legacy-trunk
+30314 79c9a07b289659286f14351fda3824189da96a84 legacy-trunk
+30315 15bb676f2e8c0f2c2f8d848e57123e131dbd5aa5 legacy-trunk
+30316 00075f1ef866bf44ac7d8240f4e1b90cb953c336 legacy-trunk
+30317 c44d994b39e542696244c586eaaad05abba1aa7c legacy-trunk
+30318 786798e86469cb808c3008cc5e4619da1372ef8a legacy-trunk
+30319 37ef017646c4618a3fc0bcafa00328cdeb961bc4 legacy-trunk
+30320 d2b03628140313b88a1d02346f669133424052e9 legacy-trunk
+30321 a9b522e545cf6f083e09cfb79a9c85ded612ebc0 legacy-trunk
+30322 5419ef4a4d70b0c5fda29a848ae1ad721da9873b legacy-trunk
+30323 673dcb9b51ce2bdf12dda3512edc22bf4fcb9e03 legacy-trunk
+30324 fc5169aa41cef85b9697c3942fdf955325b65501 legacy-trunk
+30325 ea75919c769db65db2f49b598e04317f5e26a883 legacy-trunk
+30326 865c59b5bfd712828f34cad5a377d8ce0093f585 legacy-trunk
+30327 bca5409b76ecfb9342d24baa12321d95c869eb39 legacy-trunk
+30328 8033025731527be4ab340988e8afb2d69a40d660 legacy-trunk
+30329 5f74e040012d69ef835e2c66ef5a7a73a66cfd50 legacy-trunk
+30330 3ee54fbfe846d89edf0e5add3a9e4b019259eef7 legacy-trunk
+30331 2ce8cf284b150c08181454208f45f523cbbaa460 legacy-trunk
+30332 daa458b283851bfd3c94fee19a948b1ea7494ac3 legacy-trunk
+30333 660996a28ee8c4e6b16695f1e179a8dc3657b4b8 legacy-trunk
+30334 704842f05b091e58d3e93f4be3569fb091f19ece legacy-trunk
+30335 6cf637767ce24d2c3a811ccd6b20f0618280a3fe legacy-trunk
+30336 b4ca5b9ba9335528aa68bccaac09829d41116ca4 legacy-trunk
+30337 2752e9aae97bed601dae8fcfceb5b516152521d4 legacy-trunk
+30338 3cf5a7852a2f3fd4f0b0a6dee266ef99069bb98b legacy-trunk
+30339 3a130047290163a05966d3adac2401417793fab9 legacy-trunk
+30340 0369199a265af841ffa1614ab3159197ef5d4bc8 legacy-trunk
+30341 029eda937bb4743f0e171603da630fa48e7f2586 legacy-trunk
+30342 83f8bd6ae8117220d2b12fd07871639cb5ddfb1a legacy-trunk
+30343 aaca8a3b23cd05d22283098f01976f6cff31ec50 legacy-trunk
+30344 a6f0bc6e8b38de5f770634c4049be561bafe2e66 legacy-trunk
+30345 f305a578b3940ec83cb86f77ebebf79f97b8eea4 legacy-trunk
+30346 48afb8e1420bb86f9c9aefd8fac4aecba8bba94b legacy-trunk
+30347 42279a02125e28461ea474d6064fc004430aacd8 legacy-trunk
+30348 23a980eb8afbb35a2933e2e8bee36dba69251d47 legacy-trunk
+30349 1eab26f717199d7ca28368d7ac4fa24438c66c0e legacy-trunk
+30350 f483efca224c6cfdb357e0f57d48ce75633fa32c legacy-trunk
+30351 3d1060db80628bc5e949fd373e286ce9e0c374e2 legacy-trunk
+30352 26df6013b303d4abde4df31d5fa0ee64d506a790 legacy-trunk
+30353 d177dd0ca8f70e41be01c7ffa0e3345d9e850094 legacy-trunk
+30354 35468ad5022a7745691d509523ec4199e6e3801f legacy-trunk
+30355 120afba2dbf6407cd77b56c15d29685e8117390e legacy-trunk
+30356 c249607ef535f11284f7d30577bfe18a45209b28 legacy-trunk
+30357 31b1b0460303d85d7470da8019f247a7a65decbb legacy-trunk
+30358 90934e4c91ba4bcd2866e2eff7b3a64e8ec2d7ff legacy-trunk
+30359 6ec386b45e1faee169cbbed7a33246d82b61e8b7 legacy-trunk
+30360 d2199fc14d0624ad80d8612533fa34e1ac7c581b legacy-trunk
+30361 2133cf355bfc8a2c9250977ab023ac0e10e525a5 legacy-trunk
+30362 f0f9acca4164abd78b5e1d604a6d8e29c3c66317 legacy-trunk
+30363 54aacb87beda3037dfabfe3bf3e67f9028006fed legacy-trunk
+30364 b625f1bf72f90d04c495093b41d39c4e368e115e legacy-trunk
+30365 45fc0e4b508452275b46bad92b2e5e71c245a48e legacy-trunk
+30366 b9c1597d8102e45ca45d8b3e6eb6f226bff44ba9 legacy-trunk
+30367 12753e7b15f7e86be14356e54d109cf3657971d6 legacy-trunk
+30368 8053bc0b8bb581b4b8670ca5fdcc6b66487f1b51 legacy-trunk
+30369 bc20e8b46de0d0ae7aef268e4488d786e262fc0b legacy-trunk
+30370 95510f0a0624584b41bb7b75faf8865c89fcf51c legacy-trunk
+30371 2a95b7d5fbde0d4ce707431302b76631b0d000b1 legacy-trunk
+30372 140644f22f648cdf0b3d3cc4cb5d0e98d9e609fc legacy-trunk
+30373 0a0c759ed16799aa2e06ce9f3c98bf84a41b2d4b legacy-trunk
+30374 4cbdbb0bdd5d4aec1025a6a68866c8459abea302 legacy-trunk
+30375 3bc2af41c016579a8e1c2af4c3a7a41c7235934b legacy-trunk
+30376 096d12db2636523ce5b755fdc3cc38c5b708fc77 legacy-trunk
+30377 a4474e14fac97b4a6229a05f77623039afe121e8 legacy-trunk
+30378 18d4f71f5ed6a936a4b073b846d0dc90692dcb4b legacy-trunk
+30379 d5ad29a473e1d990a3011410ddbee3c62b3ef0e1 legacy-trunk
+30380 2c52abee7d1062c500ec28cada715041a2f4d52c legacy-trunk
+30381 97c5aa82b3e9c1524bbafdd749ca65a72a322620 legacy-trunk
+30382 40db78159177620de13ae9be01dbd7160e73c18a legacy-trunk
+30383 7ea7637341d0a147a4c346eb58b5b3d2633a1a2b legacy-trunk
+30384 47e6ab8d5751d4a07f8c6669856d889f3c311938 legacy-trunk
+30385 ccba3b66d676661f6e163e3109918ded04a3973a legacy-trunk
+30386 bcaca36a583cc4593b5ded91b77f10b9394f909e legacy-trunk
+30387 074919715355ac86e373c80a533d7ee7f5b71a97 legacy-trunk
+30388 688fa6cdab943c580040526978de8363a65dc2b2 legacy-trunk
+30389 8999d72c2e6cdeb1a600fd15d197caadc47baa21 legacy-trunk
+30390 0032dbeec391c157022f8d4e47f7ddf3d7e4b51f legacy-trunk
+30391 7cda3603567f967aab2da71e3ac6b599c44e020d legacy-trunk
+30392 c25d7d2c1710426c76616933341f1a3019369503 legacy-trunk
+30393 fbcf3c4b4272e215fc2d75f5d3157bd2a8327e15 legacy-trunk
+30394 f5161ca4dd680d4fbe33a19aac79b6340a65427e legacy-trunk
+30395 a43a2b18b5c48bfe6cd7ae3a211a0d2a123dc8a0 legacy-trunk
+30396 05016bb91766fe9d1b19b16b717527c2868bc3ff legacy-trunk
+30397 b93845226db68d832c2aa1846d5a315b9c5cd910 legacy-trunk
+30398 42f19a6c65701cdf36500e470e9b0ee0db14a24a legacy-trunk
+30399 faf965d73824bf244eb64f1fea028ee269a0bd7c legacy-trunk
+30400 9d0580acb45ff45ea7571d4330c9fa6cbe6157e0 legacy-trunk
+30401 dbfc3ef7d00350e09e9553e956497364b5b3de90 legacy-trunk
+30402 31adea49a558f728ce93399befea8f5bceb2161e legacy-trunk
+30403 96468870d206d94f1a8a4d9cd043018194a7d280 legacy-trunk
+30404 3db165f021074363b1608aaab15c35704ef66a66 legacy-trunk
+30405 33dcf4fd0ff903fbdfe3076ce84b82bd8b6954d8 legacy-trunk
+30406 24cb62225040cebb282abb24ac1c3adc29b8e00d legacy-trunk
+30407 ffa4ab37036f015fe99640d214a9b08c8f14a10e legacy-trunk
+30408 32e4c77534162c5f7afcda4d41d01b8b02770ce2 legacy-trunk
+30409 6c535dcedad303c13e43472b9d0f78d27831973d legacy-trunk
+30410 79466f04f1c54b52b72ed21c9da527091555f65b legacy-trunk
+30411 b91d95e9b249a79335a6a6609c11e6aaffadaf8b legacy-trunk
+30412 a085cc0476810959dacd0c077788fe0f56fd17c1 legacy-trunk
+30413 8468e3fc3a2bc71cc2b70886d9614c1cc0436318 legacy-trunk
+30414 3d5abd3d9e4ba8051943f855c45bf0b52b1245b5 legacy-trunk
+30415 bc305849522df7872982e720b80d3653b8ef5bb9 legacy-trunk
+30416 a82d92f78472c707e6e7e11c50feed43d5aada97 legacy-trunk
+30417 bd0c407195836bd0f199fbd6bce27c96d389c0e8 legacy-trunk
+30418 6e541a72af1ae65437742d28456e7b92453307b6 legacy-trunk
+30419 5ca7072361bd95a00d4aee1098ad236b1925469c legacy-trunk
+30420 723721ea402596c435ee66fc7756f2155627617e legacy-trunk
+30421 55141144dab5e50912b1074440c5be7a454ce1e5 legacy-trunk
+30422 beea4215278743da11eadb539bcbeeba48a70381 legacy-trunk
+30423 526742a74d065b3b3ff4326d6d33c75b9140f077 legacy-trunk
+30424 acdb39b714b1eee48d4dbec23381b834e0a02355 legacy-trunk
+30425 02c6fd5cf75bcf56fb4bec776bfe0189110ce087 legacy-trunk
+30426 be732e219ed10267d902783bee7314db14a252dd legacy-trunk
+30427 a58cecf59b063f5551c8b4a13c454c07b0470a2e legacy-trunk
+30428 7b5a7cfc17a9e5017f7503d032ae5abc85e074dc legacy-trunk
+30429 94bc812a3c5285158e60fe1245e4179d21eb8f75 legacy-trunk
+30430 35fcabefc9d2fd35695729ea9ad6b4cf2b4a235e legacy-trunk
+30431 f1559460b952626932c4651f711c854a71bb27ad legacy-trunk
+30432 163563ccb7d60adf84e8b50604a9b6563cef1019 legacy-trunk
+30433 240a2401c404de6af9983c24cd0096343c45dc08 legacy-trunk
+30434 38927fd567b4e4f2f9288f8fdc734d3179935b4b legacy-trunk
+30435 b82366bc5438428a9d95d6c24c8e76da5e69bcdc legacy-trunk
+30436 3c041b19f1d3677a3c391abbf55b8c942345e37c legacy-trunk
+30437 b8c72e86a12d40700b1be0746732945eb9fbe103 legacy-trunk
+30438 1c58fe5c769f3c06e71be3b0000c878909ca052f legacy-trunk
+30439 a5c879726b3a32337516bf5b10b1d1bd2942af5e legacy-trunk
+30440 b9c462d23f3c65214d47d16a5cb54cf72b6442cf legacy-trunk
+30441 a573fede88e2b18e4e7d1f078bffaf99bff090d7 legacy-trunk
+30442 5df7a284eaf4ed771f1774c2b3b465ca7dd5f997 legacy-trunk
+30443 b790da0671f7a71e9020e4128341b50a7b9e3644 legacy-trunk
+30444 4b4ce2490fe2ed7eec519b6a2ccfd864999282a4 legacy-trunk
+30445 103899ce88b2fca3e7f1e7964baa19ed1b693730 legacy-trunk
+30446 bf9e0424237f515622d8050e1aca0fbb641b9d2d legacy-trunk
+30447 776f270a6ea9c70bfe67e44e41354a138eb392a5 legacy-trunk
+30448 4448ff8b32390bfd925f69353d5dda1715be1027 legacy-trunk
+30449 4c03a4fad72ef261707b882ece4310e2e0e841e7 legacy-trunk
+30450 84879e18377384949fa29bca621eab550cc399f3 legacy-trunk
+30451 90998079a1a23893254dbbf592d2a48e6ebd78ef legacy-trunk
+30452 67df2893a50ee8177c102697c49409b4badf869c legacy-trunk
+30453 701b1029af40790550ee7d4991b1fb1c2b278c8e legacy-trunk
+30454 70f0f25b134e428c1d17fb82b5377e1237ca13de legacy-trunk
+30455 774f754fd1ff15038fbe9107acade91552f227f0 legacy-trunk
+30456 35e5b021b774447203ee73416b9b19dc2f09c85b legacy-trunk
+30457 784e7fdf8c524346fe03f53dbab05f1d1436f583 legacy-trunk
+30458 698960d561f8da5898e0fdaa2fc03aeee1721823 legacy-trunk
+30459 5b1575968f7faf80e7028341b1cb926bf24dc687 legacy-trunk
+30460 5677e980e047e4248fffa0050b772f71d0a93b44 legacy-trunk
+30462 2c67169f6e13fbdd17b4776dc79bc52aee25ae49 legacy-trunk
+30463 e02daf6307fc8a8eb5e0026e8c70dee9ec07386c legacy-trunk
+30464 549d07d0aed7eca19027c965cb70911ad3acf1d5 legacy-trunk
+30465 f722a830140fb415e5e2873d4e1114f4d1ee78e4 r23a1-branch
+30467 7e2351bc6e7a69bf68df712535186bc5b06ac271 legacy-trunk
+30468 1c65fa5e52c3d81ab01ba8ef3a0bded4af3f6bde r23a1-branch
+30469 15017a79bacddad27bbaad4f392bb4b091177318 r23a1-branch
+30470 d6dcff4b357423480e47a555ea00bf32f2ce8f32 r23a1-branch
+30471 2b80116815b535dd9802d6c3591a6d9cbd64ab97 r23a1-branch
+30472 92e572e3ca9f8c8339f7e96a956ba9b782b8826d legacy-trunk
+30473 8a8dff250be4362fa1a67d31ad48870b603f26fc legacy-trunk
+30474 bcbd94c610e823f295d1b74399ebb68b878fac52 legacy-trunk
+30475 7cb73a732f771eaa236f2df42b98f85242eb90ab r23a1-branch
+30475 018307765d34dcf62d6d2ad66bd7f7bde531efa2 r23a1-branch
+30477 cfa13ce983ba2b78966c0ec78711cdf7c822363f legacy-trunk
+30478 69905059c7bd18859b3f8a263ce87eeeb1ea27e3 legacy-trunk
+30479 74079be6f3f114e192283352f90271a76d1003f5 legacy-trunk
+30480 cf81f825daac926cd547a242a0e55cbec41519bc legacy-trunk
+30482 4e0932a112f42b559b731c9ed8f87dd9b6316ced legacy-trunk
+30483 96e1ab8df88384ada783022b875cb9742fd5aba4 legacy-trunk
+30484 2a87d9489112fa2e34aa3e875b6f2360ecfdc2be legacy-trunk
+30485 00cd1d7159c2b451311211ec0ef9c9f95f442abc legacy-trunk
+30486 6ca1c0d3ef1931224414250a12173ecd3e695116 legacy-trunk
+30487 8ed472e5bcd44dd321b435f9bd199055a079ced1 legacy-trunk
+30488 88df267db859e3f4b89fd6864d91be4430141947 legacy-trunk
+30489 bda4185670ccb748e8399af6190c779faf19b7ee legacy-trunk
+30490 293eda3e69f5f58214aab299ca03896db14edc02 legacy-trunk
+30491 f57083a3419664ab48e094c0b4e7a3e187e0d154 legacy-trunk
+30492 1c4060d9e6874c35fc2b7fc3d0aae0b6b8f514a0 legacy-trunk
+30493 ea67cea676e99345b0dfea245bc941aad9ee48ab legacy-trunk
+30494 d85eaf478556efc613f6f4f8909b0b62793ad05e legacy-trunk
+30495 81209c0f08a05926f7bd0e9f9055acceadb02d05 legacy-trunk
+30496 4579e83c663b702ea20bab1a6232a111b5b4aa74 legacy-trunk
+30497 72c3f7347e88c894406dedda787a16facc5a9c61 legacy-trunk
+30498 2687a9085411e7857f6562e022708615360bd7ac legacy-trunk
+30499 5c4fa04c9f628d8992c25066abb4fc9bec46be66 legacy-trunk
+30500 6a5cffc62387ddaa090bac533ec50a87c9f7b7fd legacy-trunk
+30501 c0b3bb485bcf80016ce860adef5daadede4f90ba release22-maint
+30502 97dc530d90eb785262d159f9593dcaf93e780969 legacy-trunk
+30503 479310149b2ede1e70972197a4ea9f5822eeb2fc legacy-trunk
+30504 fd9f20ce3bba1fc9c38bb33c830704f4b52123e4 legacy-trunk
+30505 741aa9d6d8bed7405fc331f37bb2300ed263bf27 legacy-trunk
+30506 0b3fccfbe2a28761ee4c57861b125020c6ab40e4 legacy-trunk
+30507 9ee4fd05d3cbcd5ad7dab3833bbcf90b2dc0f8c3 legacy-trunk
+30508 bfa32613dec8eca0e817626f984dfdff5c58bd58 legacy-trunk
+30509 727bcb811c50f95fd945b2f0ef438928956a2a51 legacy-trunk
+30510 e2c88c451c19a5444c95bc709f32bf50b5933418 legacy-trunk
+30511 f441c4e5b234656545c88fe546319b7d9bb4a736 legacy-trunk
+30512 1098ccc84d63f892f62face823951d5b7bfab476 legacy-trunk
+30513 806d36e56bfa3e08011f49bb0b3be770f3d4b80f r23a1-branch
+30514 ad12ea9c7efdf46b6389bf3cf65e55de9fde5c17 r23a1-branch
+30515 4414707d937616c6ad4b60c260a331a9af849592 legacy-trunk
+30516 e3271e8b14dee0fbe07d1a852c00f8213f7f7ffe legacy-trunk
+30517 c429fe5de4173562d53031c0f38516a4cdca68c6 legacy-trunk
+30518 338ac86f442d99ac1aba7544c4f1ff8e4cf9c14a legacy-trunk
+30519 d279d763f46254ec5dc1fa6d25e2267ea72721a9 legacy-trunk
+30520 d59b7cbceac1c6c9657d1b391c469aae22b6bb1c legacy-trunk
+30521 b1e23c35707be4c0102b7598b54957dc9bbb7523 legacy-trunk
+30522 b61a66022d5a401f4f63251071303539f14f3558 legacy-trunk
+30523 8ecddf4ad8b0281d69466db856cfe266cb2a849a legacy-trunk
+30524 dc33d027645a4f3d90da6d33ffa2b92bb9b57298 legacy-trunk
+30525 93b6a3f6132dc828732331702ec60dd39881d877 legacy-trunk
+30526 41f7726e3e5117a91444dd4380919193d1558032 legacy-trunk
+30527 a98673be20c2802efa45c74f5d1742262708a528 r23a1-branch
+30528 42f33bd69c724cf4f5fa4f185025b5d29a2551ed r23a1-branch
+30529 f0bdf4c590ec40f981fea4a239205a37c03243a6 r23a1-branch
+30530 be511203116f06f308c6756fc8297c41d8a9d3bb r23a1-branch
+30531 13c9038fa93769938c61d7ed62c60b12f0545970 r23a1-branch
+30532 dd6f1df524ddc7402491c4abf84b1384d5561ac2 r23a1-branch
+30533 68dafe1bc0169a86679acf302f50475d18c672d4 r23a1-branch
+30534 0259856c1e47610827c50d5e95e50db39ca27af9 r23a1-branch
+30535 99df0e52f63433265e567f2805bbc491e4d56d0c legacy-trunk
+30536 1ae782493132b9a40e908afba452c2b2169273ad legacy-trunk
+30537 b30fe4dcc6979863be676ec09c62fc4ddde7abda release22-maint
+30538 6e1a7435df25d353173d360df22c6da410cbc9c5 legacy-trunk
+30539 e65ffcb4369518d72a15dc81f4cc10d108197b2e r23a1-branch
+30540 ae9d8f50e76a3603c2f55be26f17a565783575a6 r23a1-branch
+30541 f9a5557c9447aca16dd6382523b5bbef173119da r23a1-branch
+30542 041c52f49df2278df3b92e7f2f40757495df3452 legacy-trunk
+30543 188416fb7ac52d2eaa518b9469e06c42bfff5815 legacy-trunk
+30544 ebf7265aae4ea92fccef305e0e68d2d13c7bd309 legacy-trunk
+30545 23280a64288e3ea17a440b788d5d0af0225a04ec legacy-trunk
+30546 5d997263b859b92f275f7eec11ff38378ba434d3 legacy-trunk
+30547 237a146207859b5d675f773a8ff8333ffcc51590 legacy-trunk
+30548 737a5476396b6416841f202a3011d7bda8c9f8b4 legacy-trunk
+30549 267f45be9c02cd40beed370448ff7c0ecfce663e r23a1-branch
+30550 554121fcbb9dcbfd6034b69d2a800dca078af8d7 legacy-trunk
+30551 1cd9c8564875b85b5207a4d05958c38c4d6092b7 legacy-trunk
+30552 70d2cb36fa17a31fe7a5d6dcda6527ed20ad28f6 legacy-trunk
+30553 78227709ca044f79e4fe1bd6596047fa3469898a legacy-trunk
+30554 af3579511f8468fd2102d62c93ddc4555d7c9fed legacy-trunk
+30555 9d08291cd41166219ebd1b52fd0d5890cc3b8094 legacy-trunk
+30556 714cdf0806c16f7a4263604b0ca95378d161e63d legacy-trunk
+30557 e382d393331d5c121ec7fafed899b3f483ae75f6 legacy-trunk
+30558 94b9cf4274de1e05f9f160a2bdaf93b31637029c legacy-trunk
+30559 ee34b64952c0f8a672b07eba975680e238ae36ab legacy-trunk
+30560 cd3c4df19b035b6aeaa0d14fa22e4246a202450c legacy-trunk
+30561 afeb70c876aa3514217b914d1f8b4adeb559c66c legacy-trunk
+30562 cf90309efeee622df641a9690500b0839ad753bf legacy-trunk
+30563 6977e320a756c4685ebcbb219dae3f8dd3790135 legacy-trunk
+30564 d3ba7f4a9f88afe5d8260d900e305e6c98598448 legacy-trunk
+30565 aae949506d2a7d32839316c58e638a25b2de1b6a legacy-trunk
+30566 157a95f417f3d7bccd03f30fa1f3a04a2a73b27f legacy-trunk
+30567 7901fd95017f094783f221cea73c0f6b1c68e4f7 legacy-trunk
+30568 cbdf60ccf54f5dfc7bed00cadc70244c15dbdd39 legacy-trunk
+30569 eb322ef67c9fec501942f3a20a50160de59b104b legacy-trunk
+30570 cc5b2d0a4ad1d86fe26978dc9f4e8a7fb6f7e636 legacy-trunk
+30571 06b3fa25d9f1de3fa753e172f679fb8cbf9739d9 r23a1-branch
+30572 1712e204aa92f1207f2e16d7f8bab1dea16351d5 r23a1-branch
+30573 ef531482bb37b0fb38bf0162a8627cde21ff3d31 legacy-trunk
+30574 e92044c0b8ecee8175aa466ee53a33cba4535e27 legacy-trunk
+30575 c30f9728760294f2f88efe35d9eb33eb2c2d20e0 legacy-trunk
+30576 1564c6839e6b0eb8059ae4c81cd02159dc09db25 legacy-trunk
+30577 0ba46606f0f9118decba40d3ff08280e258e77aa legacy-trunk
+30578 b865925ef68ab63f748eefd68cd409d226b98ccc legacy-trunk
+30579 c29ada6c1c904a2745da5a05186a8a28b00a32e1 legacy-trunk
+30580 753306f9b0a0e338c9b13622b4def5458601e207 legacy-trunk
+30581 c1f4e53c42dd0ce05a4831da1da5400432b64576 legacy-trunk
+30582 972fec21f223b7138bc9bd0755bac1c7097a7c59 legacy-trunk
+30583 a74c88838a55b421f8bbe99249e72fe0743afd2f legacy-trunk
+30584 2ae1d17572da6a8e74fcf5f70116cbe55fa6c451 legacy-trunk
+30585 3199e974f55aa3f6de52f6924e208daba9161570 legacy-trunk
+30586 64e8c6986610c2b378648064bdffd14ddc71f2a3 legacy-trunk
+30587 d5e09d412b5388067eb93dc8fe187d0a2f5aef2a legacy-trunk
+30588 f7226422c1d0a4b71416ba305252b380f138ae4b legacy-trunk
+30589 90350b5d3397c4fd68ca3ec46cdcd998c9ac1ee6 legacy-trunk
+30590 38319409e89567e2428a16d05c9e01bdc7991056 release22-maint
+30591 93f322f562f3998cff265126002c2d1b783d2682 legacy-trunk
+30592 abb5a69d60cbff994639bf34086f8b21553a23c0 legacy-trunk
+30593 a123793ca193be7d4905d53c0b4fbcdf103fe26a legacy-trunk
+30594 3a295ceba401f57ad6da6666ed7b055c3e379c09 legacy-trunk
+30595 388e547477400f452f3b01ce4ff7e9bd768e4085 legacy-trunk
+30596 54ef7d5296f1040aa38d81aeb356190d3d53d154 r23a1-branch
+30597 1ac9994dc6c2581302ac98a535634ed093421f61 r23a1-branch
+30598 1a0eabbda654aa551edc6e67c46bb613f0b2fc73 r23a1-branch
+30599 97b5ab67b9f2909d84d24295060c3dcb6d6127a8 r23a1-branch
+30600 52ce71358e32a1169dcf03ca74c1f4dfab31b86e r23a1-branch
+30601 7dab27731be818d04b228fe527c5161fe55ff71e legacy-trunk
+30602 bd750378d5c1ffc2d3307c501602197cc1c512ac legacy-trunk
+30603 e841c873a93703cf46a35443c344aa53c9ac8b13 legacy-trunk
+30604 27e9c3cd58afd332f393a4fca5ba242b0daa9412 legacy-trunk
+30605 6c4bd487fd260bd93da0aa9426e6ffe22a35c009 legacy-trunk
+30606 a1664b7da76f79c22a78d210db25cecff9145a7c legacy-trunk
+30607 3e23de802a5dacff26c6a693031a543d86d3b2a9 r23a1-branch
+30608 b42255c822b1e571d5c4e03d96a06f85bd55e0a4 r23a1-branch
+30609 8d7ddbb330d31cbcfa5590d150e5e5b8aa44873a r23a1-branch
+30610 5ab4b648a4cf47dfc32a190b685b4d4feb8f33cd r23a1-branch
+30611 96a8efd91948c1eac358d73f67f02823e90c9ace r23a1-branch
+30612 33b4610a892253c3b6ea4c6f0357bbd9c1c9020f r23a1-branch
+30613 f9a5ed092660061008cddd3e91f4aa01d35652c9 legacy-trunk
+30614 a16bc64f1145b448f5e229a076cb32f053dfc310 legacy-trunk
+30615 8226658a63bb2e3c5061d833321f2a0f1b9d8719 legacy-trunk
+30616 6d7daa5329c6acaec9563bd6db95b1bf13edce17 legacy-trunk
+30617 69331fac4ef25b0d1080170068301173cdde99aa legacy-trunk
+30618 4306c665f857cce8960623084075db11c177891a legacy-trunk
+30619 2443c557cbc3d3c900408e8d30b53e55d4ac62a2 legacy-trunk
+30620 82eac31e6e2dc9976d35d56924f996b18d6b972a legacy-trunk
+30621 aee43a4f3570d7238410a60a18441274e9efd9ae legacy-trunk
+30622 a0a6f4dd7328685685cff79fb3d0a3947bd4de1f legacy-trunk
+30623 faba6e6c824df9e48bbf4f28aac101dc0c15ba7f legacy-trunk
+30624 0464acb5b3e46b1e57b3b8fb5f76e2fb66346787 legacy-trunk
+30625 55de2b95181e939f2bd27ef403d57dbd3503e162 legacy-trunk
+30626 0364aae5a5a40baf807c93cef5c47407f83ceb56 legacy-trunk
+30627 e719ab46adabfcb1a87d577c18b1639db76e53fb legacy-trunk
+30628 d2fa1ddcdf6da6edf2a143681e1e29879e470d37 legacy-trunk
+30629 b2fc494963b2ec9425526e6f07766ab4c07bf852 legacy-trunk
+30630 9db4882610e5b83bb06dda8f4822b45d9e3e19a7 release22-maint
+30631 a2f17f4a6a22cfb9b3c4a58b4d54c0ca28eb0c24 legacy-trunk
+30632 37beb4d6092983bc83b8bb655da95148f7a647ce legacy-trunk
+30633 eb9353b43cd12c1792e3919c9b860c2ed15ef0b5 legacy-trunk
+30634 b3c8d9c472dc926bbce360b49044d93aad4db7c8 legacy-trunk
+30635 86e7a1f7f26527706655d8bd1fc3d00b60ab5ba4 legacy-trunk
+30636 7ec7718934102a99bb6633e5f6fd05189398e2bd legacy-trunk
+30637 c0d5fe9a0f1c3e423763371070d6b7856dc3ec52 legacy-trunk
+30638 1b881d5e4a903e5c467bec53071d284aef2e4633 legacy-trunk
+30639 d1850a36ae41fd9df93bfaab904738d71dd89148 legacy-trunk
+30640 e54855257a4f930f31d422daa9dd60be57540ff6 legacy-trunk
+30641 acc80eace4dc134e1e331794295fd76f6a8d7a4a legacy-trunk
+30642 46a6ed7cc4fe95eb81412adc262569c20746c19d legacy-trunk
+30643 45f1e6b12a813b43b3953304e5f3ef8141c33d7e folding-reimpl-branch
+30644 047b6e16ab2e4d9f8f1d1a9fbaac417131e8288d legacy-trunk
+30645 6dfdb1c0308ad1fe864aecf6867832f15f47af28 legacy-trunk
+30646 8617c2506b8e4549b2dec3bf0020a743b33c4aba legacy-trunk
+30647 e87d590a5de18747c75fb10ce6c1d04f4d93c8bf legacy-trunk
+30648 22d660494f29c4d791c46498e55707eab814f66e legacy-trunk
+30649 49bcfecb29627256ae2883df0cc2265171d2e76f legacy-trunk
+30650 657aeafbbc9a0c84fd69898331e6d9dee63e74a5 legacy-trunk
+30651 c2663ca31d7d0e38dab38ed778c4a00325341415 legacy-trunk
+30652 3d2962b0249e5451ae1bf58132e67a6037783f8d legacy-trunk
+30653 3330a509d2bd835cfedc401800cae8414b7cef88 release22-maint
+30654 af8a30de66725a01aaa0330309861f157a1cc8c6 legacy-trunk
+30655 7bbb0dd8d2306897a49a4f55ac6f5495fb5fe30f legacy-trunk
+30656 8e21bcf2158ac91047c16369a56271181f3e0668 release22-maint
+30657 5d4f316d871c0e6c15bf812cde01a0a2614dba36 release22-maint
+30658 81cdabbd63d7cd9984428926d6d341a845d7e228 legacy-trunk
+30659 acf1b51212c59a9b7dde9cee9d12c00f6b19b95b legacy-trunk
+30660 e204dff3fcbf9e04d10cb3070953f8e51a1c32bc legacy-trunk
+30661 92e922e7327ae32739361d9d7d4cb8ab9dd10e37 release22-maint
+30662 576e2b5d8cf8825a8567f276b3427892518da41a legacy-trunk
+30663 1375bfcb677e620ee135d557ec285b01d5c1beb2 release22-maint
+30664 47799c27646117e96b1512b0f8ed703eef22bc52 r23a1-branch
+30665 56b8f908813cb0cbc4db28b36ce1990c3263a677 r23a1-branch
+30666 5cf410e4725166305ab2549de4b541d5f1bc35c3 r23a1-branch
+30667 e265efcbcbd16520719da343ad457e4493e0a7d8 r23a1-branch
+30668 2227ad86d33c52382331322718c3405348d1f35e legacy-trunk
+30669 5ed820670af35c9de7491f804b2abf8efed11420 legacy-trunk
+30670 b943560e5f7b52567084e5a044ca9ecc57f6bab2 legacy-trunk
+30671 29f89c7257bd0c9806e7b7562462355eb566dbf6 legacy-trunk
+30672 e18008b711b022fcb5f3774a1af0766287c2f9aa legacy-trunk
+30673 ae838f774f6c1e1d1f7fd89baaf5bd280163c5f2 legacy-trunk
+30674 80fceab06835e61928be9ba4d7b5904037c174b8 legacy-trunk
+30675 3f4e80ebdca8354b0b1f5830425e429cdb5acca1 legacy-trunk
+30676 585a6460f5776feb8febffcab47c84b71dcd58ef legacy-trunk
+30677 b1f5fdbe63972f793be6722c448f9f5c4c726af2 legacy-trunk
+30678 eb6b36b26e8d2b6a2fe03f322ab6d1abecdb1331 legacy-trunk
+30679 23260198885acf3b1f8d65adf656570c6dae9419 legacy-trunk
+30680 c5d02d5370d937bf006c46a7cde8ee9430424cc1 legacy-trunk
+30681 b49a40db7b472a245f40d0e83575c71cb4756d99 legacy-trunk
+30682 910e76dd04daf65eac166e96dc38a7e827dddf97 legacy-trunk
+30683 734ebd47bc2a9d4303613f2aeefe907788d69af0 legacy-trunk
+30684 2f93c231eae0ea8cccc91820b2f2d8e19732381c legacy-trunk
+30685 ef43de562fd1b251bb157c2bb64c6e32c8f68860 legacy-trunk
+30686 0cadc29180e615cf0d17ee063c67157800f9ddbf legacy-trunk
+30687 7f09b1992ce9fc35eabe92a1b38af085336a8c91 legacy-trunk
+30688 ccf59f1ab4312864f30b29aed0b82ea066a6ae9f legacy-trunk
+30689 0bd07391d921bcc1506416da342b8f2231c083fc legacy-trunk
+30690 adf4ab3eaa621c441fa77b2b2d57fa3c7a57321e legacy-trunk
+30691 4b89d76fb205ac0dd334266b7414420520ccfb83 legacy-trunk
+30692 d5d12ea3a5809fea23c8dd75cee1d4b7592171fa legacy-trunk
+30693 b9f5bee8ec18e8ff04c9820d39e74c04267c4b8b release22-maint
+30694 0a9796a6468ef13f231566c31bb8ac248b6805d9 legacy-trunk
+30695 47b134bb51c302d8ea2ed0146d64c72732847341 legacy-trunk
+30696 318aba94c1e7b1eced94cfd38446c3d50bfa2e64 legacy-trunk
+30697 925a7b1f93ee00f8e04e21ff8cad262dfb4122c2 legacy-trunk
+30698 07c6c2e98a1cde1cb51eff16bb5fc39fa07435ae legacy-trunk
+30699 6fe49dbf03fd46fbf6366e8ed5debd50be824071 release21-maint
+30700 a0e0cab5c927fc1af92ef0c1b516bfca69bcfe4b release21-maint
+30701 cdf1ba2ab715294226b8e15b6ac825be08637d51 release21-maint
+30702 7706a06f5e692694f5bae7bfaf2341eb0965708d legacy-trunk
+30703 01d9fd595375fe55dbd04f8db5b49abf12f367d4 legacy-trunk
+30704 728383dc739ef00f253ef82b91e183e02b5f72ad legacy-trunk
+30705 c798613a87655ba2635782753f03467722e3c5b1 legacy-trunk
+30706 04aa86d49d93e556490bcd892d7959aa870ab87e legacy-trunk
+30707 fc4bb3820449e3f0fade9bbde56544dd1c049b70 legacy-trunk
+30708 bcae2a70e1ec7c9f844031380527a130b88ec864 legacy-trunk
+30709 7ea4430522df493a084dd7cba89f1e7c3725b90f legacy-trunk
+30710 d03c13034560a362e4d8d1929d8dcfada96dec78 legacy-trunk
+30711 b29cfad44097b58c2b162aadb1d8e7584e5be742 legacy-trunk
+30712 b346272544a182c16bd3ed01d4faad35bbd0cf49 legacy-trunk
+30713 9347327874194bf8ae464ba9b494cc990cd1ae6d legacy-trunk
+30714 59309d4bf841b69296177770bfea6df919b78d44 legacy-trunk
+30715 65dc0110a735c10128eef209c0d14f6958b9efac legacy-trunk
+30716 d4c8af9119d1918ff66f7957b0267bdd3fbb00a5 legacy-trunk
+30717 a51e5ae29882bcb1bf5e342a2c3bde2cf8bd0636 legacy-trunk
+30718 b8724341bb1abc32f9ff615d8f01d3f87efd5f23 legacy-trunk
+30719 77b70a8884cb23b86fd012e41a0128d27da3b576 legacy-trunk
+30720 92812f6cd63b5b2c2bbd855ec7bf070d250fde29 legacy-trunk
+30721 dc6fb8a6af3def2780eff5e6948038265643400b legacy-trunk
+30722 ae122675df1e90ce96414365642af7b447e9492f legacy-trunk
+30723 81da73b93c3c62f3c226768d7a2ee2c673dc14b1 legacy-trunk
+30724 0a035f9299a979f789c1be116f579b056e1267a6 legacy-trunk
+30725 3c8d91f3f4c67de78317a574f391ae6db26478dc legacy-trunk
+30726 4f19c8524f1ac7e4e7acb44169d7891d14719e50 legacy-trunk
+30727 6ae361df870eea318f7bb00dba4d49fa2821f32b release22-maint
+30728 b0d528327c4c1a6cf6cc539e9cfe466e8c65a770 legacy-trunk
+30729 80ea048fc0d735f1fdaa90aefc7a006b642e0dbd legacy-trunk
+30730 428eecdfd57fcace2e7d191ea8690e63018c3494 legacy-trunk
+30731 a494f5a8639f29045fb797075c04b6c1255c4eee legacy-trunk
+30732 4a62a941f3b12a3035acb719bc5d8d09dc54995f legacy-trunk
+30733 de2c95d81984160f59ef001ab5caa00ac3e10094 release22-maint
+30734 f96772e31e233f777ed21ebb738b8cd5d3994049 release22-maint
+30735 3b3ce964adc9c13f2fa5698a2a7f674f2e15c3de release22-maint
+30736 7a4d782715f4c7662494ce6ccfd8d223e1b4235d release22-maint
+30737 10b7e60245b569401b963627eb5f8d072b847663 legacy-trunk
+30738 38d2238c795e46e9b16e7ab3992f24c401545242 legacy-trunk
+30739 2ed518ab2fd20a2d22294044649a316f1d2250e1 legacy-trunk
+30740 17878d458cf12f3dfd13e2a10490aff778aed7a4 release22-maint
+30741 1119d582609a14f24e0f4a7e6f22055038c52c2f legacy-trunk
+30742 209d67212883d010c36c6e56f1d2731a06c90cce release22-maint
+30743 201cdeb305f64a09403f2fed46c929e6e116c404 legacy-trunk
+30744 420ea205f0241ee451954026c82a4f5eaa507f55 legacy-trunk
+30745 5d42dba49fe507275b980b4d1dc59d4028276672 legacy-trunk
+30746 ebeb00b8d502a0c9953b41ad90cf882ebea77e0e release22-maint
+30747 11b34564a0fd05821da422056c980192b348debc legacy-trunk
+30748 3a33bd0f9c4bfdc754ec8fe1e13523c9c808dab5 legacy-trunk
+30749 f34c28650f14e18e5ff2535cc84115e2d995d31a legacy-trunk
+30750 7f37ed54292003ea8f0cc48fdde3ac3455cfcc61 legacy-trunk
+30751 18f072d140a9c7fe75ee4b14514c6c71992f2d7c release22-maint
+30752 fd3b0711b25fb055faf0bbd8382775cd82c5f41a release22-maint
+30753 eebc4fdac594e692cf1f0800e3a1d488aa587b3b release22-maint
+30754 e9f45b8efd6b4d7c876b40e5bf24a66c65fa382d legacy-trunk
+30755 8bd6b2ae2874b079fb0e5af7bc951f5101bef5fc release22-maint
+30756 3ede90d6e1cf125a0203b49ef3c749848d8f175a legacy-trunk
+30757 84a8e7d1daa9769815d99d6d3ee7958529b765c6 release22-maint
+30758 3bfdbc3dfbce928c9171dc48a87178f54f192b41 legacy-trunk
+30759 0a6b88190b8b1d3bef52a9ce473527ece5a8a9e2 release22-maint
+30760 f59d80c7e1bb4d18f9000d501d031fbc9dfcf4e8 legacy-trunk
+30761 f95e9f3c9fea78d4d717eda03d1f50d864874610 legacy-trunk
+30762 a7706d4c690c20ae61ee816d2d93d45a4fd08bf1 legacy-trunk
+30763 3afbd55fb18fa4ab13a38cf1b14d215163e7744a legacy-trunk
+30764 b3f105399d22811dba5d199a95660c4661f44724 legacy-trunk
+30765 d3ab532b3b6d6ebb20a71f6a25f2cc95f1675f1e legacy-trunk
+30766 a56c3c56288b9feb27db5ba909dd452b570d8d88 legacy-trunk
+30767 5ddb90f8169a58939ae443b07724b7bdab02b82c legacy-trunk
+30768 c4150f7f6a6961524ae8887207702e2b7757b4f1 legacy-trunk
+30769 7c34e5bf2e22b1f8589f8275efeeecee32c13f2b legacy-trunk
+30770 16a8767462850c746d025c38fabdd8ac0f4782fd legacy-trunk
+30771 c99493aba098d253c2db78d196a164591ea7f6e0 legacy-trunk
+30772 40cd74782600811ad0287e78c4d83727f65d17bb legacy-trunk
+30773 1ca7b2d692425dc67b8409336caa5d38ba4f44ff legacy-trunk
+30774 261547703443dab454097b50d51551c05274d6e3 legacy-trunk
+30775 baff56adfbc338248f95eba79f5775a41ec5dcf6 legacy-trunk
+30776 ae89b556050ae0572f4c6debd57290049873ca91 legacy-trunk
+30777 3fbffd736d9d04c2208896ed476923d6d3f9bc6a legacy-trunk
+30778 e8c1a9542f66a668d78f7d2ffbe78ceb3f88751b legacy-trunk
+30779 faf256a59eceb293777f27647245e54be34403ea legacy-trunk
+30780 4cdb501ab6a2177af3bda0882276856d8d57f45c legacy-trunk
+30781 f05764d7082cc1a0a1a2c7fb6172f913b95b2930 legacy-trunk
+30782 77428e835d67ed8063408a4f19ecb51d8f97ce36 legacy-trunk
+30783 7acf57440f4e09fe5befcca08559c9dc3d5e48e4 legacy-trunk
+30784 8d0e07c270ef9b3114774cabef37e05588bd9947 legacy-trunk
+30785 af811172717d0a31014eedfae544d47ab6564a21 legacy-trunk
+30786 a9ddadf789eab8f698da373e7c729a73e624f34d legacy-trunk
+30787 b744508d5b12646af20bcec2514ac3b113ee9b7a legacy-trunk
+30788 be3d1b7e62dc269cbb847bdb41ce1287b414b9b7 legacy-trunk
+30789 dbe4f57e8bb2956cc98ae9f219731229035c4f42 legacy-trunk
+30790 392feecd2f1c71ed8b73cc9271e0816edee28d3b legacy-trunk
+30791 91d678a94c7363f50de9d9f67302dc004f2cb1c8 legacy-trunk
+30792 64d3fe904a0af8d674b24eae045dd5df3937acba legacy-trunk
+30793 cda5ab625774fadd520297945d94e22a66265cec legacy-trunk
+30794 d2ae5affde14e7964012a461790f67bca6fca96f legacy-trunk
+30795 bedb75d90e03c399f2e016f6182ea37adac03137 legacy-trunk
+30796 7fdd5d62c615af20af64b98102a5c1988febe85d bsddb-bsddb3-schizo-branch
+30797 9da43cde8a1661e68c455faae8e476fe5b42ac88 legacy-trunk
+30798 cbf355f28ca9f689287899149c9a33410c7e5e0e legacy-trunk
+30799 c8234e26115c66d4ac9b48a2bec6e6164e2b6baf legacy-trunk
+30800 9de064c7a247f11fc38e04bcf9a7421002ee5181 legacy-trunk
+30801 87b66b6ff5e76f7702ea3eb7455073e3e544df74 legacy-trunk
+30802 5a050200f736586c5f8d50cddd77ffbf7c9e8865 legacy-trunk
+30803 c6f49b797963ecbff985aa4be8c7daaed6c437eb legacy-trunk
+30804 866756f670ffd58453d15ace00a7b4a875d8f158 legacy-trunk
+30805 df2754aca71704f4ba47e8443aace45c5fce62df legacy-trunk
+30806 40e5eb9e04e0e835ab5ce5f65ec5c2109eb901a0 legacy-trunk
+30807 04e5610c5efe97af458fcdd4661ec7d7465fa5eb legacy-trunk
+30808 88faa985d98c3f3663a073676d503cfbc09be825 legacy-trunk
+30809 97f494bf73190ad9bd06b2bbae5bd8671b7a7564 legacy-trunk
+30810 75da49977571a4eab9a192b02a6a2ab8f1313eb6 legacy-trunk
+30811 e83a42a90df16396a7afbf875ed40e8a5fd7e8e3 legacy-trunk
+30812 7039375226a7f2627af0b55458daba01252e74b9 legacy-trunk
+30813 d7f80028301deb74a01f58551273fdd411d593e7 legacy-trunk
+30814 bfc140c7e3d0651f03a3939aeb12ded9f49f38a7 legacy-trunk
+30815 7055f4c1edcc341e7d4c454d6a194c685007c28b legacy-trunk
+30816 b8387730dd8ff415e7927f6fa2d44383a8807609 legacy-trunk
+30817 c1c45475f170e40e7e92cdf5239f0687e833dc23 legacy-trunk
+30818 81551adf12f6d1ecf245c89986dd77a7346ce8ae legacy-trunk
+30819 05ff904ee4e07b6c66cf72a58e208dce7447bcfa release22-maint
+30820 4fa9ad85c3b15dc2df8be86545ab7c9f755b803d release22-maint
+30821 1369d24bc861dca2687158de9d001405e3682b90 legacy-trunk
+30822 5a975e82d70fb5bc049cd44620d8ed7aad5941f2 legacy-trunk
+30823 de801733ec18875bc2cb6d8d36267d1525891058 release22-maint
+30824 0f8d189310b45a9fdb64543f54e8cee9280af3fe legacy-trunk
+30825 a555230be3cb0073b3e82dacab0bb7857fb589a8 legacy-trunk
+30826 704639d20a6cd625bc0a312b67f5eb4e4148878b legacy-trunk
+30827 ea7680eaf937df738264252d5560736d00f0bf75 legacy-trunk
+30828 dadd178b65fa568ae0da6c85e078a0d29858ae31 legacy-trunk
+30829 ff179bade3f0dc39e4bd0a99ce5c32d9da387fe8 legacy-trunk
+30830 185847140ca5dbdda11ff8f2b1e3263d8c1aecc2 release22-maint
+30831 a2f84d2835faf825d8e03e4c61d42a472b49e012 legacy-trunk
+30832 eaa612a41dd0d69eb0d9f09572ba30ad5bd464e0 legacy-trunk
+30833 9220098f0327e9b2c0130c480e87ef368f53897c legacy-trunk
+30834 c68290790d53d6e01dc32270dd4094c8112fc6ca legacy-trunk
+30835 cdab2b74f307ead63797568e59543f63b391d580 legacy-trunk
+30836 efa2f8abb02c9a615b004b891f34e94329cf8cda legacy-trunk
+30837 3c7023c9e8e2671bdcdd764bd956893c6bce773f legacy-trunk
+30838 d966bb54b3de0d8e5d75041f8115f2f40992f485 legacy-trunk
+30839 7067d36c3cf47019561075ccb5570931a55df85a legacy-trunk
+30840 75f38c415e7d4d07c864bb0012bfeaad8b9c28dc legacy-trunk
+30841 1562c1e10b497da97148cef96c20d6cac93069d9 legacy-trunk
+30842 299ef2dabb52c6624c037fb36337f9cfd2156612 legacy-trunk
+30843 88bf10313584de4167f38674058f957468e50282 legacy-trunk
+30844 1b6229adb3df9df02c44a69f1ec429ae35bc410c legacy-trunk
+30845 d5a3386c76f49456cb505b1f982720807e256b84 legacy-trunk
+30846 c404879cf999b03305e11b19ad450f5d5774240a legacy-trunk
+30847 44e352d7d52ffbb44fad10d721af250176c55bfd legacy-trunk
+30848 e2da0df3613d1ca3ac4ab38872a203861d5599bd legacy-trunk
+30849 683339b852abd49b9bda6b65bfa5db0724bf27bc legacy-trunk
+30850 87045a8ec547179160307175e99a8f0491c53055 legacy-trunk
+30851 6cda7c612154a76868578c9dda952c56f542c204 legacy-trunk
+30852 a0a914723c480b7126c199d6c42cb280a36ed7d3 legacy-trunk
+30853 597aa9966ec6bb333077a8764cf08e1f7215c484 legacy-trunk
+30854 f4c694a014256835b7cca0ac6ed5f454cf661764 legacy-trunk
+30855 22fb76c539267516dd61c65ae728cf5cb5fafa3c legacy-trunk
+30856 2c649c7ae8f3f2bf7c4ae1d00ac6a11287862d0c legacy-trunk
+30857 cbca0bcf1c31e9eacd91d719d08b774ab37a7da5 legacy-trunk
+30858 b470ca84fd2b5ec99ea69d6af1e9be53c22882a3 legacy-trunk
+30859 e80456ad195b68d806eb6606bb61d2124107fc2a legacy-trunk
+30860 d34ef00d9da8a086086443f725f8a863d7c4d1a9 legacy-trunk
+30861 8b53b0ce06d458e7f41ae601aa2724c4dbcaf2cb legacy-trunk
+30862 ba63d717c75f0004c0bceac7124e5b9a3b3ca221 legacy-trunk
+30863 9fe36ae2a4a2b2a85f4bbdad8a4953bc14c60202 legacy-trunk
+30865 9be3149fbee717b463a88ad47290aaf97ebddfc5 idlefork-merge-branch
+30866 412e66e3530ee7f0b6712748fdd80bbb9ff4b5c2 legacy-trunk
+30867 4f59981f7817dac11590890429b36497eaf45270 legacy-trunk
+30868 180067c2880fee5c4d46cc8224dc34e98d9e1716 legacy-trunk
+30869 2055d037295cf0998c0c90c3cadbfb10e3f721cb legacy-trunk
+30870 30da8c96fd29ef365b88fc96ae29504c08bba73e legacy-trunk
+30871 5acf6967d6dd3714860dc3dc96f190c039f8ae99 legacy-trunk
+30872 ddb52f5673db5a853e725feb65f78ec1b189de84 legacy-trunk
+30873 22992fa518310fef18a85c1899408162d31268b9 legacy-trunk
+30874 bbf14185bf1e7e6b6d291e1184ac588be4132116 legacy-trunk
+30875 40677fe8503d30e0e1c1b8eee52e1ad0deb917c5 legacy-trunk
+30876 27aedcf46bcc92ff3f1794ddcb811798eb03273f legacy-trunk
+30877 428c8a423043eadd365b6a8633a69b3a4e356201 legacy-trunk
+30878 dc61162782593d8c740dfe1d880b53138ca2ea28 legacy-trunk
+30879 8db2e74ddb0e5aa4f4f0ecfceec8c8f2477b7093 legacy-trunk
+30880 afd1dc62e354dee33aa39cc438ae2d8f5628bafb legacy-trunk
+30881 58bad769776e5999e4ad3313f7e3a203628d9864 legacy-trunk
+30882 04e4565832bdd39c8b4b63a4df1ffd41e92acf0d legacy-trunk
+30883 273b2b49bfd868998604c4fe2b4f6f1cc86d4a2b legacy-trunk
+30884 891ec4d266d17867eb0c33c18489641a950e8a20 legacy-trunk
+30885 4a49b5aa5d212718c414f5e2f917dca6214f3279 legacy-trunk
+30886 eb1e529fdfdf0d4b9c2d22925886d3bfd93a08c1 legacy-trunk
+30887 fde78d80e0989d2a3403af3c95d5d3dad93db7fe legacy-trunk
+30888 00f294bf8299f6176231e9f651092ce3d2adcbd3 legacy-trunk
+30889 6147bc14d277b6dbd56acedd7071c0dd5c748949 legacy-trunk
+30890 ff0e1ed998dedab3cf716e5e0a0958a0ff3e6329 legacy-trunk
+30891 c1dc50df578cdceba5f25d2461aed720d13397b6 release22-maint
+30892 13beea2d2d26aa1a1f51a1ac84fc494344039f72 legacy-trunk
+30893 9c4b4207e979dc3bfc04609a841f1e1fd294faa0 legacy-trunk
+30894 5b3fbff05ffda9b3fce209be70d9f2b110456853 legacy-trunk
+30895 b7256496c9b01c7463fa1d1b98492f3fb94edbc8 legacy-trunk
+30896 d29c78d27c5e3b88ad8f19e17869b319358ab429 legacy-trunk
+30897 be178afd41814511fea88e446754480fd217a62d legacy-trunk
+30898 e2d79ffa2928c40ead4e15ddb781e5160c588c8a legacy-trunk
+30899 840e9fed908a1fb85dfed5e21556f9ce45e44c67 legacy-trunk
+30900 f3babaede189a0b6a3a2cfd7f27a92dac1299c84 legacy-trunk
+30901 81569ccde5bdf00df65ef75fdde14bc884e73a94 legacy-trunk
+30902 a457531c0fd4951072176950e04f1c177f0f7734 legacy-trunk
+30903 629603f644126ca352c119970cdd173bc37d8008 legacy-trunk
+30904 8d869f921f22642127f99f0283604f2b119e360f legacy-trunk
+30905 9bcf85d0135c2e74afe8c8172034ad06c9ea7d98 legacy-trunk
+30906 5174b4a71e6e4b774fa95ff68f27e56cbb8ce867 legacy-trunk
+30907 d363f83c2846a52f5723e155cd2a68e13b030f7c legacy-trunk
+30908 91a573243d5d79eaa508278cabada558e9691300 legacy-trunk
+30909 015647c7e1843364a66a3a0f9a965a07f36867a9 legacy-trunk
+30910 f9c48ed67a93ad6ea790950450d26c884feeaf76 legacy-trunk
+30911 e7cdb503d1e05bae9184b374d93cbcbf7ceb2ff7 legacy-trunk
+30912 aa94c820b3ed02dcd9b462e4b795afe60b50c215 legacy-trunk
+30913 882e3eeac3dd7a30605a06a16f489aa75aa97e17 legacy-trunk
+30914 e7cd3cc112d300109243537797892cac533a6203 legacy-trunk
+30915 28b3d9a8ee1a336aa96b0255c8bd865e55913ee4 legacy-trunk
+30916 e7be686803326e48081f1c4ad196c7d1f09c4324 legacy-trunk
+30917 12359e537512c328cd23f821ddf1d9916f7824a8 legacy-trunk
+30918 00640714a59a5d88d8c3d716238925f605a23958 legacy-trunk
+30919 f1dd90357dcba17cd829ca0d424b8eb977bb4814 legacy-trunk
+30920 eaf3f80700b3d5d19b89bfab89979e2166a0f834 legacy-trunk
+30921 47958c99452de36e2f8e03c3ccae28ef778a9b7f legacy-trunk
+30922 d16a977746a237c624e495390f384e254e62b7b1 legacy-trunk
+30923 da0c991255c2ef648431d04fd01eadf886c76206 legacy-trunk
+30924 4172b286d658c7a1b8a5e165b075eeeb3a1cbe7e legacy-trunk
+30925 e945a03ee56c69ef57d869daa0f8fbe65fb51f11 legacy-trunk
+30926 aed2ef96ed54d7959bc531bb205bc2b1bf2fc1c2 legacy-trunk
+30927 6eb5e1a09b95d5e6a91a73d0661e12b8132908ee legacy-trunk
+30928 acedecd20126adfb337d411c2e9470abb801f7fa legacy-trunk
+30929 caa6df9e08805dcc754a73f40c097fde8a3655d7 legacy-trunk
+30930 d19bc3b1813cb518c76bdea225f602111398fbff legacy-trunk
+30931 ea5ee3e7bfb10a78fa8871997726d4df01a9bc4f legacy-trunk
+30932 1fd04c37409ab3eb547e00d5f1d9d08512609d3f legacy-trunk
+30933 a24fd45aceb18bfb214a49797c03c0d771b66d6c legacy-trunk
+30935 56d83d0c55b60fc17f9bd674414ec0afae2d83bf legacy-trunk
+30936 550c15c4919b16283cc80beb4a4ad8520b25a02c legacy-trunk
+30937 5c133d13f32562cc42f7618241b660d84be46752 legacy-trunk
+30938 9924f22d6604e4294b30b6f96fab906e1362d32e legacy-trunk
+30939 2742ea93ab233a488276149fd3d6194756ecc38c legacy-trunk
+30940 20df24a13349029e6a2595df26c59faa0fedc015 legacy-trunk
+30941 9e430acccdb8f5c01e063b8a9d27eea2eea1e291 legacy-trunk
+30942 009f3abbf7262a25afe8ca1d00322ae01fa5cce8 legacy-trunk
+30943 c74cea24372e8f5f321ca13a60e639feaf192947 legacy-trunk
+30944 7d3c6ad4e3edc9c2caf29a823d44b33808ce6417 legacy-trunk
+30945 0aeaa3d1e0ff7942c17a76ef40b767c880e24b33 legacy-trunk
+30946 24c8fbec761f231d7f38f22849b7ed040b04c397 legacy-trunk
+30947 3c3e4c8c4a9dff026b2cc16c3cb07c2730917c31 legacy-trunk
+30948 93ba42cf4e53acf8b112becca9d5b5c18e2f35ca legacy-trunk
+30949 fa24538f8650a562c55014e0a22dbba0a1d6da97 legacy-trunk
+30950 e26a2f7f224b59a42238639d744e31a7ab488316 legacy-trunk
+30951 bf0bc8481502143b1c7db210ebcfc9818033a85d legacy-trunk
+30952 3cd9ddd5562ea099ba2ab6b58cbcacd2ad2abd87 legacy-trunk
+30953 b465c9d2196a3cba8793bfe3ab3a1b78a0331805 legacy-trunk
+30954 1ae0b142370e4084eda4cb220492e3f6bcca039e legacy-trunk
+30955 f8a90085acc41e9a0612bab78c8babd63244fff5 legacy-trunk
+30956 4047821419b57a88590c19d8b7e10b4b8636c331 legacy-trunk
+30957 35736591dc1e7a531ec32d3c999d74b037ad6b7c legacy-trunk
+30958 7116cb5bac5083d49b22fb5ce2f59ccdecef621c legacy-trunk
+30959 430ed1c8e071dab011540f3da9c28c9d27f60e84 legacy-trunk
+30960 60ff1ba428c3fa0b064de78292b90050dd076f42 legacy-trunk
+30961 91ae292c3a97f0cd38a02bc3b29fbb5b197822a4 legacy-trunk
+30962 18e8ed80e8d1748dff5f3fb740a3b30cd45ebf2b legacy-trunk
+30963 d9d24ce1cbf658d0733aabd8329066dc0743575d legacy-trunk
+30964 e4a5f753508bc50b015447a14db56bd9288a60a6 legacy-trunk
+30965 5db2cf3e77db33c980fd0e149c80f6766b47d91b legacy-trunk
+30966 6b0dbde0fed715a298cb74211aed1dff59c22ef5 legacy-trunk
+30967 8f13729a94a966a1a18ca47d811dc4659844c350 legacy-trunk
+30968 1f6327140fc23cfb807d9f916e135efb91594cf7 legacy-trunk
+30969 a16262bc6098dd08017c36168f84d43e2be2dbd0 legacy-trunk
+30970 925edf8e000ca7dfaa210f7886a3134fc29daa18 legacy-trunk
+30971 d8c2c40b386b19a0d6786eeb871911f471ba5559 legacy-trunk
+30972 b3cbe7a0142a78d967569e6bd732c2ab634fe890 legacy-trunk
+30973 0a47d832a64b5b4f13a20ac88429cdba65bf3619 legacy-trunk
+30974 4015a27a1d13f2c74d63c22cf1eba194696aec2a legacy-trunk
+30975 a230d1200bc35b3d2665afd3a99cb168d05b74e6 legacy-trunk
+30976 7fb5e8a541ab8fce73ad659f4e68211c0e869526 legacy-trunk
+30977 3509ad07d156acb6e5682b3a1c44f1b1fa309169 legacy-trunk
+30978 9fe32154d28902ee65f7f9009f4454c0ffc308e8 legacy-trunk
+30979 b2ce9c637a2bc602c829047259665e15aec7412e legacy-trunk
+30980 115ee40518a84dcadebb1b8ee08ccacd4aa7fe27 legacy-trunk
+30981 62c66893c2dba2a4503d464a1a93af8eb6a6801b legacy-trunk
+30982 4c03ef06c3ff704fa1d0b8c28b36ad7502051f51 legacy-trunk
+30983 ea480406cc65621cf0ee62d547e6438b35cd6afa legacy-trunk
+30984 0554b7c5f6d7d2692039c00f252f11ba42b2f2df legacy-trunk
+30985 883af28b9a0d0660efbb2f98711c9ab9c9439883 legacy-trunk
+30986 26a79200766525b952e6afbb47d80df44992611d legacy-trunk
+30987 2ee9742aadd892147e5543022c02be26f133b4cc legacy-trunk
+30988 ed0d4ae6c6ce409188c05f1b6c2bd891218c2b38 legacy-trunk
+30989 8dce7a5e5fccd27ec50db2015d42482cf1398760 legacy-trunk
+30990 764df2fdc9c63675ec50a6d2e072c1ee877058b0 legacy-trunk
+30991 f4911f7aad0253852406bcf020f340b42ce4091a legacy-trunk
+30992 6ffafcef98fb37fd5f4215796e6e8ca2262075ee legacy-trunk
+30993 5c7548bf377b2288c6f3858ed00b83ea084d2b29 legacy-trunk
+30994 17d87c5ba6e4b71520072e3d75626cac818d2b04 legacy-trunk
+30995 05f7e1c65d7e8383b6317d925c18850114ffcb66 legacy-trunk
+30996 f4e8a6d4aa7c37e1bf644d50b99bbbedb8c2ca53 bsddb-bsddb3-schizo-branch
+30997 f8d28e82c4cc99a3be102a54ae9e688d16689cab bsddb-bsddb3-schizo-branch
+30998 de4061584c839157225fd8c9413e67eef1432d97 legacy-trunk
+30999 fccd9e943211ad63b3e666713e1be0b6465b9ab5 bsddb-bsddb3-schizo-branch
+31000 b79c1afff1128351a882302878c3d33745bcbf1d bsddb-bsddb3-schizo-branch
+31001 154bac0b26a54ec190926c7c8bb554b6a6f3b73b legacy-trunk
+31002 31014fbe20dbb08830141e6a74d74456702d99e4 bsddb-bsddb3-schizo-branch
+31003 38c7c2d4cd5acf435e3a56440319bd82c25946d7 legacy-trunk
+31004 924ade80104b1739666ad517143c09c904635d17 legacy-trunk
+31005 ba9310fef49dd82938def878ad5b10cc7a271548 legacy-trunk
+31006 6e89e80e6a267c516467db2af5b801ad0e2cb571 legacy-trunk
+31007 712b01d52e8cd2b3f95ba8ee944a3b24facd8943 legacy-trunk
+31008 14b1758dfddedacda05b856f2854914f0280e06b legacy-trunk
+31009 29fd9fdaf52a905a757479f879e1175bb98e1486 legacy-trunk
+31010 ee0e515407fd979de318b1f5a97f24bc02265518 legacy-trunk
+31011 7c8dfd3f4ae906e3aa1077e270c0d301c72b4e9b legacy-trunk
+31012 f9284b57b4229aed86c91f46fcbcbb95f8f96ea1 legacy-trunk
+31013 5ba7934a7ba02184c52e3d5057a2ae53197b884f legacy-trunk
+31014 36f71fef5b108fc803230bfa310fefdbdd1589fe release22-maint
+31015 e9578747f43dfe66b7065449bfe6d2e8a7f16cf9 legacy-trunk
+31016 0904d878b8f18777daf7657917d64b6c4af62f51 legacy-trunk
+31017 e9cd228104a130bfd61184e23a21ffb293830756 legacy-trunk
+31018 3bc71d234a29e9899298e9b6b3bb522c45cb0ecf legacy-trunk
+31019 b83fa8fa121e84d833e60a59fffbdbee8b6e5dec legacy-trunk
+31020 4247e640e2a6eb2a58c79d00babb588591de1a6e legacy-trunk
+31021 a89c077e648a18fcd2e46b42e8476aff03eb1901 legacy-trunk
+31022 7b7d3b9063630e4affd14f40754931018ef60d8e legacy-trunk
+31023 1f16abfaf63e9f0ee488a89ece693b7fbe0b908b legacy-trunk
+31024 adbc3fe8c81cc3a3a0a951be8a49fe3c982d19d1 legacy-trunk
+31025 5e4355d80dd1597340fa76b17031f8ed0d5309a9 legacy-trunk
+31026 e905b22e392ba58fef935eb67bb3e61ab0989ad5 legacy-trunk
+31027 d8750e0d3fb888836ab7838a8065ed7d2a0c629a legacy-trunk
+31028 4c35a66fce4df0ed95eb9390447afbdb253a9e13 legacy-trunk
+31029 ae31fcb7b58e4ccd881121f09f29b0304f4fd271 legacy-trunk
+31030 090a50cb26900e089e4527f341ac6ba3abd3df31 legacy-trunk
+31031 e42e3025bae3b49a5877259d9f74a84116fca4de legacy-trunk
+31032 620539165e5308ac9a8480a2ee7de1088364af33 legacy-trunk
+31033 0dd8d8a76015ef0dbb96befd92ed7ffbdf586260 legacy-trunk
+31034 fe40fcf49ee566dfb5fc29189170d1566c016e29 legacy-trunk
+31035 b480a4f707f6178b20626801fed056a34e3f1734 legacy-trunk
+31036 d9d57f5f98cda722b784aff9de88c0efcaf32857 legacy-trunk
+31037 14276e43ece60479dac66721402e41d9c9f85507 legacy-trunk
+31038 44f465683927b3cfc6dc3c3a6f034a40d9960e5b legacy-trunk
+31039 20c581c23bce333686524347490d492da54cf91d legacy-trunk
+31040 0de14252d26ce6dd3c1411fa7aca201e5c814699 legacy-trunk
+31041 a2d96e7d91a1a9f9eb0914737758f435e4391ff9 legacy-trunk
+31042 b1d1fe7fb514b173a808ca5db969f5b40ed26508 legacy-trunk
+31043 d62bd24072919ab0453e47ffcac22ce43d293346 legacy-trunk
+31044 0e6dce1ec231cd47c430d2f1f5b29c4af2e7ed26 legacy-trunk
+31045 5f32942a225ada9ea5b95adf80bfdb75b0099a8c legacy-trunk
+31046 51abb5e862262555fce528d3a429ea744307b7c6 legacy-trunk
+31047 b2b574118ffda3fdf74d6a2fbe2a9fc876998aaa legacy-trunk
+31048 81a2d188ea1f9f6a33fa8b495ee079cce50b0fef legacy-trunk
+31049 6786e86b8ff0ad0ba257382bd3faaa5c8bf2ce4c legacy-trunk
+31050 17bfd5dbc0f16dc85c16b2088acc42807d693235 legacy-trunk
+31051 0f9eb8413b61b4e6251e49f077625947bcb22a2a legacy-trunk
+31052 b173a2a230825a41fab1daf8d0c548e3b4f2b977 legacy-trunk
+31053 d5f47e1465d66de5032829abbe24e350e772d018 legacy-trunk
+31054 0bb154fa8047c8f0fc803becaf6a395d141be6ff legacy-trunk
+31055 ddee8c158301c683cfb98e57f96fd269efc90552 legacy-trunk
+31056 2e18dbcd9e04cabd647edc32b9a0ca788c3c2b4e legacy-trunk
+31057 689257ca4d092b6d79d8520349b70d5df1219d4a legacy-trunk
+31058 696c42da7875331821130e089eb45142bc7f6073 legacy-trunk
+31059 5765d524de71e2acdb9edbb0a3e502fed4556dbb legacy-trunk
+31060 d11223daaf61d3c513becaa0af19f9329d73a6be legacy-trunk
+31061 02f138c639a083a1374e074466fd7d72088cf66e legacy-trunk
+31062 842d6a24497ae83a5369281b5ebad3ab0bac7ad2 legacy-trunk
+31063 99099deb602640bb956f4312692e3936dc5bab37 legacy-trunk
+31064 72b38d5fe61f9afeed2a2c6fd4d160e5a854caa8 legacy-trunk
+31065 cbc86028d9f3bab70ad824975b31acc0089cfad9 legacy-trunk
+31066 fdc52b1197090e13290f98438e5583562a648221 legacy-trunk
+31067 87943faf4fd216a6102e07d499541c8abc5118e6 legacy-trunk
+31068 97b28170634ccf192c9aef56b58089b986461274 legacy-trunk
+31069 2add008b1b7d075d3302774ba99f55fe2fb2269d legacy-trunk
+31070 88ceeeed70bd151d5ec09011139bbec9ac384c9a legacy-trunk
+31071 0c8810373a1a77286490c961bb545cf40141d5dd legacy-trunk
+31072 ed2d23d2fd412b9f7e765f266a1709e05d0c92ee legacy-trunk
+31073 c47de88ae85d7e547a2fd916c539db5ff23913c2 legacy-trunk
+31074 f9822b18cf919c56cbc9fea65cb5833991cd9b39 legacy-trunk
+31075 bd63f28ce7a8bfda10005c3074781bbb9fb4516a legacy-trunk
+31076 ce748afbd6efd2d4a73414b6219277fd5b3dded3 legacy-trunk
+31077 c425f66db45822503d9ec9d44e24577796b1be4c release22-maint
+31078 7fcdeeb16ec0d64ebc2fc89cdab6077d4d6102ee legacy-trunk
+31079 31807880f59965914cc01b1fcf552fea81caa00f legacy-trunk
+31080 d3af1e793243892bdbc2a20a5b3a1f458751b6fa legacy-trunk
+31081 50c734250e0529b66b55dc297e0c4afeb5f28585 legacy-trunk
+31082 6597c09b1e6dc9d00d1f3528e27698c31680095a legacy-trunk
+31083 3ae0a2f87aa06c74d69ab70f79f0842aed63331e legacy-trunk
+31084 c267f28724ddccdebc53188eda5da9e0ca7205b9 legacy-trunk
+31085 24e34abc6295009730650a50e167c56920650a40 legacy-trunk
+31086 5eefec94a7848542b9a06e8c5f21c1e8ddb8b701 legacy-trunk
+31087 8d83578dba8141d46fffe1026aad35e14685a844 legacy-trunk
+31088 faabd9867fb8dc49940d38c2296da7a6c0abbbeb legacy-trunk
+31089 4aa4e6b3eca723f4349e746f7b6630d56171a3e2 legacy-trunk
+31090 3c89049fe628d34da1eaa1e49aa650812e5dc5b2 legacy-trunk
+31091 d42d83e5686c3b96bedee4d3bc85dc88149d587e legacy-trunk
+31092 ab143aed49b906fb83360003d2e6d76e9a488f82 legacy-trunk
+31093 256789aaacd65c03232ac2f1e144038dac29c7f5 legacy-trunk
+31094 620bb3551bb6747a660b4defadde3f204552714e legacy-trunk
+31095 8763a8f6c0d5bef2e80025c004912ab7c56b4820 legacy-trunk
+31096 c075ba2abf7aba6f6fdd3380f7cf523e5261d4df legacy-trunk
+31097 f33e6448462081c74cbde1bb1869bccbb8bbc445 legacy-trunk
+31098 76fa8c79a89d0a690bc35de9e9db79292db7e408 legacy-trunk
+31099 ba57c3daf6e9a39d6eb02d2620569f33b329ef03 legacy-trunk
+31100 bd8e6222e16a32a3af4326b01093037a2ccd6aeb legacy-trunk
+31101 f235f135f3f8a2786293a7693901ba049cf7e077 legacy-trunk
+31102 674f3eecffc5069e71cc7aaab2f836dc2b15868b legacy-trunk
+31103 0190872ebcf3d774840163fc6649e0640d53b867 legacy-trunk
+31104 3b9fb57fac34a25d498a4d55b13cc4c233a44d3a legacy-trunk
+31105 1608507bcc3ff847af561b96bb62f213f4194995 legacy-trunk
+31106 9bc1c84b23e662369328326699cd60f78b1e897a legacy-trunk
+31107 2f227ff11f5e3aec164a959b344ad4c5c7be2823 legacy-trunk
+31108 6ffb5c8e6538ee85b8a2e42240a3b79bdc259fee legacy-trunk
+31109 f47af2cdb983b41f5eacbbebf313726685396657 legacy-trunk
+31110 2d7c0cbc83cf3f49b9a00aa1153b433ca3782091 legacy-trunk
+31111 d1edaaa938fbe74852ff5552af453c9ca4de6e17 legacy-trunk
+31112 a2db437d314b48937ba0bce789f05555c2716420 legacy-trunk
+31113 65635c72135e1acc9c67335bdfe5c776b7d3140f legacy-trunk
+31114 a05814184e8c6e5061cf0bf32e0214d857ad9c12 legacy-trunk
+31115 98197ebe5ccb7def78e7b44779bff916264c3102 legacy-trunk
+31116 7283140d431986b243daa702a8f3b98a8fcf3326 legacy-trunk
+31117 3eb10a14ba00d96b340464c2edcfb3b89d155f09 legacy-trunk
+31118 e3fa8377f30c580a50b4b9aeedc66fd05acb93cc legacy-trunk
+31119 93210564bb46079f0d62e154635f4e4be7c0da5e legacy-trunk
+31120 d6b65e3855a2500d8d159e3b4d436efbf8212d95 legacy-trunk
+31121 78e43b36e7844eb8d459e8b942c6c39c9b044e54 legacy-trunk
+31122 57bdf4bac435a7e66ecd5fcc17f9e66907f4b927 legacy-trunk
+31123 e5d18112030349115eb26dd7310b443c5066c466 legacy-trunk
+31124 915d327a214a9afa9b6e8401f9e16eececd6e4e3 legacy-trunk
+31125 72228a25daaa25923490911e608963a726969e9c legacy-trunk
+31126 8e60ec88ecb84d92530d834642a389695fee8b6e legacy-trunk
+31127 a35dfca93318d1f9e83c1786c5c593fd97a2fa2c legacy-trunk
+31128 d158d10ef4aeb027b744f56aae5d3daaaea49a3b legacy-trunk
+31129 313e944a2c886236a6e197afb1c5a75c63f94709 legacy-trunk
+31130 9a3b8443d5a61615ffd9de3f5f38705393189479 legacy-trunk
+31131 c4214c20b21dc020a807f60b123d42499408e1f3 legacy-trunk
+31132 82a8ca3c928c0ade33d97b211b00d30eb8596e2c release22-maint
+31133 1fa4441498589d5018573f2a5027d2ec44c60748 release22-maint
+31134 42b617fd9c6923d7572282b9c17db168efdc1ecc release22-maint
+31135 22551e1d2c6e70ed4d48bd3be8591ebde642a028 release22-maint
+31136 ccfacaec0968919ebbfe8bd9993b0660e1bdc776 release22-maint
+31137 beb2008a3c3295d7e5bf0a2aa4895c2a555f87ec release22-maint
+31138 c9ccc9d0ba99a88dbe9ea45d911ac4fc5946584b release22-maint
+31139 1d8c86234d9c2bdf0641028808fb5943f0b4986d release22-maint
+31140 0602078bdce123b02b029fe48c6cae43e84e294a release22-maint
+31141 0729f8393b1603f7e7e245d438fe81bbff1c3d92 release22-maint
+31142 647c29147d5d27ee84bb43a1f6748f8b63eb10e8 release22-maint
+31143 83701fab32fe11758958f5d77a7a21a25955e9e2 release22-maint
+31144 45ad77a43d87f69baf402b005a9283cf8e080c56 legacy-trunk
+31145 2a81c1a883cbb5c3eca2011f47b13d3f20db06f4 legacy-trunk
+31146 9cdc233b7224b037bdcd7674b6080b9b194cf8cc legacy-trunk
+31147 74d9604e935316d7a167d3f5793221eee14a7594 legacy-trunk
+31148 558d0f3b62548bf4360f835ccb28b0853c447e14 legacy-trunk
+31149 bbd8abaa0f33512823f6ccb5b2dfee939ec1373b legacy-trunk
+31150 19d0c999555e91cbf77113a678e3862bf8976613 legacy-trunk
+31151 65fdbd781ca99af199d8e5e91259985808512bbf legacy-trunk
+31152 a24528318be96cba3fb20215444fef12f19a1fdb legacy-trunk
+31153 8201038bbf30bd5bd1e412ec4b70f8fa958db5e5 legacy-trunk
+31154 eaaef516a6853de7248472c6fe6b41acfb091fd6 legacy-trunk
+31155 45906223efb236a11d0c2f36427f01278bfa4ff5 legacy-trunk
+31156 4c9d02c5657b35abe8709da050d1cabe3824011c legacy-trunk
+31157 afc9a095a2d56f8f789e84bf0334a4e2ce70334c legacy-trunk
+31158 f7b3826d013a1dedb213b302dd59587ebe9e8307 legacy-trunk
+31159 6567f4829e7ec4ff1a5bfd3f0a6b63e6d7bdf00e legacy-trunk
+31160 7bf7dac4dc49614b92036de27322a168bd14d0c5 legacy-trunk
+31161 640e52dee1a03d2a225871b065146ea4862973c8 legacy-trunk
+31162 48033017c78f2018cad2254bbff4328c667ac4ae legacy-trunk
+31163 c40cb9bfc8e7c3df16589bde2bebfc9e7b719f0b legacy-trunk
+31164 e4e26fe286c0b89c2ba61b912ec2e4eeac4d0aef legacy-trunk
+31165 974f196abb87becceb86e4d4b39aaeb037739be8 legacy-trunk
+31166 601549c64039c84bbe81e460497bb97e1f358a6b legacy-trunk
+31167 2cd4e0dff3a432760ae9421af820ee19fabe29c7 legacy-trunk
+31168 6205da383e4cb41b68506998b3a23018de34cdcf legacy-trunk
+31169 00426c7f147d201a43256daef87d3347340491f8 legacy-trunk
+31170 dd73a1218f69a8964a0d2ba54cf55a83cbc5f882 legacy-trunk
+31171 4d04f45ff8a1e6c58e705ec9b5ddc15ec31efabe legacy-trunk
+31172 934a2b497d1dd2ade53308e9482261095698d530 legacy-trunk
+31173 8a147a41c3f7fae0bcf5332e26e7cf6fb8c0d650 legacy-trunk
+31174 b66acbe29575c45d5aefa69ab37059d99bafa477 legacy-trunk
+31175 e99615de764763c90e23e40b1b06890841688287 legacy-trunk
+31176 52ce57b78c71a86012f82e1faee8269c1abe4374 legacy-trunk
+31177 db784d29f481e05bb7e23bc55e8b966d42a5f226 legacy-trunk
+31178 f619861405030aaa82ee54fa4f0be781e36b988f legacy-trunk
+31179 f260343eccf1322cb9304ad44bd2220c1cdb187b legacy-trunk
+31180 59b4ebc29d5317a6b7fc1b60d39c3ca371b0db7a legacy-trunk
+31181 ed91bf601b2de98af084dc9772c6ef58994d7724 legacy-trunk
+31182 106a44a4b975db4f1b086af45cd47ce52b6aa5d4 legacy-trunk
+31183 a9dd217a9bb101e08b12324d8323665964bd0284 legacy-trunk
+31184 e11e976fee7812ab4118c5bfbad32e34807d5920 legacy-trunk
+31185 ba3eaff49b7ae089a88fc01286f1da41e6516ff0 legacy-trunk
+31186 67315026d6d3599b66ca5914731ebac852364af3 legacy-trunk
+31187 b595c4735fccc6fd003b3a878e88a41505969d41 legacy-trunk
+31188 0bbbcacc05fb9e7e8ee8470ddc6335dccd98f67b legacy-trunk
+31189 6a1394660270741702566ed876c52a27edd68abe legacy-trunk
+31190 35278aaae775cf971c20eaf2c55040763b557a12 legacy-trunk
+31191 3a528aa222b6c9d6dfe213bbe6c71b5858d88e81 legacy-trunk
+31192 df363d1b38428856fb4b5492382ff3dd69c87a59 legacy-trunk
+31193 652df4549708552a306ff72be74bb58667e17b70 legacy-trunk
+31194 d5eb12bccd1e9f5545a0d46400d3b4d984411886 legacy-trunk
+31195 5d7888fbea00484b75001c5e53d85e3422c429c5 legacy-trunk
+31196 f62ec2405e9fcb55ef1ddd208c54f54939b7584a legacy-trunk
+31197 8e5de43529b7573cfb450be8423bcbce41623892 legacy-trunk
+31198 3e98d2e2d847f16c43c2153e07c20c264d510772 legacy-trunk
+31199 20330e13211eadffe7b5b46715db172fdd4a2d56 legacy-trunk
+31200 3b0b36cdd9cd99e74ae053a63af56ef5fb6a4f63 release22-maint
+31201 c8943f87c68b99f2f165ffbe207d16c138bf2e05 legacy-trunk
+31202 960803f9f698994fa3d0aaf470893671d7bb9fa4 legacy-trunk
+31203 ce3faab06de753a6a91439557f77810188b100d4 legacy-trunk
+31204 8f8448fb58d6f8960752a35396ef7a689b57dda8 legacy-trunk
+31205 95f3a1cd00e160d85f4e87388ef743dea1a05e25 legacy-trunk
+31206 5199f7ea6746f398335a793e998b90868971ffe9 legacy-trunk
+31207 261915a6c6852c984fbcf3b70703a62e03a6d384 legacy-trunk
+31208 d698c5623da06f51ec597ddc700d835e62b26bb2 legacy-trunk
+31209 b19aaaeb6d64203163ad9cf90de63f0bd4f01851 legacy-trunk
+31210 e5454fe1aafd0dcf9f2ea68baef96a3b8dbdbd4a legacy-trunk
+31211 74aabd4419d40d65bc7ffbeed4d439a26aa67ca4 legacy-trunk
+31212 ed1d4e7971095bfcc4a1ec93134263caaec7614f legacy-trunk
+31213 96fd004a58b0d32feead8f6259c09b64934c3d9a legacy-trunk
+31214 9e47f9ed49f64622cb787ff19f4726cdd2d46a4f legacy-trunk
+31215 3599f6593fe90c0c99aad683f609c490e1fb3a50 legacy-trunk
+31216 20b803cf219d0984fe8a6a913e3b5f706e606a4e legacy-trunk
+31217 4c7b1b7d7f31116786690e187c6bd3b0346fed4f legacy-trunk
+31218 0ec3896886e696a789f0ffb9330d362a1ee4dcbb legacy-trunk
+31219 8f37835cf4a411b42f01cdebc2ffb324d0892347 legacy-trunk
+31220 9ab971cd1965724af0ca883356e848aaed905741 legacy-trunk
+31221 63d634ed945cc01e88704eeed67d25faf0b12ab7 legacy-trunk
+31222 ac453bb370a2e9c71ba883049fe7bbd41845afa4 legacy-trunk
+31223 7c4dda0c145f0401b55e0a1a6c4716d7fb8d12ce legacy-trunk
+31224 1a300f47533205c08665d84100b73a0a4fc6d3ce legacy-trunk
+31225 eb28789409058604e47cbb6e1bd62fc79d8bc142 legacy-trunk
+31226 43143d4dd6b1d513b12e88ab2cba0a1291285ec3 legacy-trunk
+31227 1861335e78aa116c7d398024fd4cf60e3d7448d4 legacy-trunk
+31228 0fca65a09f062828c5e59a81689339618bc77ce2 legacy-trunk
+31229 614abba5b7624fc357f88576609dc92b12b4a8fb legacy-trunk
+31230 37999f6924b4e5532882feb9e0cdeac36cf1eb3d legacy-trunk
+31231 84f2c438c3f52ba18ef32f93f8bef4aeb3e64a08 legacy-trunk
+31232 0428d59069a984127df67b2e791f0a9604933c54 legacy-trunk
+31233 c8c7816d3a2da6e309644cbe01f743b59bd99e88 legacy-trunk
+31234 0f6731d126deb18c37ed769af05c4635a4f95b77 legacy-trunk
+31235 537bfce2b7303f1af1d6087a5126c7cfa86ff6c0 legacy-trunk
+31236 e0fa52067dbefb8273f7b2b8f19ccae43f636291 legacy-trunk
+31237 f87b6d16bae85a79ffe150ac162bffcd137b0f4e legacy-trunk
+31238 9c3c993e9b9cf2334ad23dea733df1099840e165 legacy-trunk
+31239 e4fe168e35f143fbca52ee0c941e02ed99aa6321 legacy-trunk
+31240 001cf74dac501a9e653d335720c7bab387debaeb legacy-trunk
+31241 16856c9514e05a8846d4dd65456ea97caa7e58c7 legacy-trunk
+31242 aade4bc125f8ff2924e4f3559b1c6842c2feda9b legacy-trunk
+31243 76376e5af388d0192ea94ba0d36b3b7c82f43ad7 legacy-trunk
+31244 e3b5f321eebb03f4bee5052e851166a2eb67c186 legacy-trunk
+31245 5935b8243d74e4ff18dd25479f0a9af476b71005 legacy-trunk
+31246 41313d20d1dde268abe38cf3ed352397118dae61 legacy-trunk
+31247 522edd591d2cf1375ba4275d0e3951993f8e220f legacy-trunk
+31248 474cbbdf00ce7d64478e80509aea70a873a58b78 legacy-trunk
+31249 21283b6ea7f1a6dfb70865f2b1ff126a09e48218 legacy-trunk
+31250 04384f4290baf6efbc8e191dc2c19d242c074247 legacy-trunk
+31251 cad1185eeef7c168aea1a29c50b77d817a911ce9 legacy-trunk
+31252 7267214f07856bce7471862c5f7f080ef1236bcb legacy-trunk
+31253 3982f117679efb8368b982e62b77795639e81b70 legacy-trunk
+31254 f2f06b6ecdd71bd75f44a24ec2f8e92c1944bbbc legacy-trunk
+31255 5e31529fdd4faf9861fd2f139f4dac5708c06ef7 legacy-trunk
+31256 d502187b2b06e00a7f5b7b3ea06b18759e71c9ab legacy-trunk
+31257 8d92af144c16ec7877037aa38cae421246a737cb legacy-trunk
+31258 03cfc637c3935882f23c887ff0341ebc0158f896 legacy-trunk
+31259 b466c5fb4d8eabca3aee03c3b00df7cb09d6c8da legacy-trunk
+31260 c1ecdde32f863c48dc8043c5f71630a1c17c0ce0 legacy-trunk
+31261 fa9f9e57e98f8608c24aee936e439d7a8c40ace5 legacy-trunk
+31262 e5e242cf46b1c4c77a527042ba20e40c77b1924a legacy-trunk
+31263 7b2cd800c2296d42eca42f4d541c7ca6120d2310 legacy-trunk
+31264 32fb94a6a4fe9becce32ed916a2199505ebaa00c legacy-trunk
+31265 db416bd18d4f79f2f8ef0011c3528d62aeeec850 legacy-trunk
+31266 4367f805db09c3f66066c027b5e968e098408932 legacy-trunk
+31267 d8c765c09d8c1a8ea66b98c4e3a176a7e58a65f1 legacy-trunk
+31268 ce340fb4b6149512b7fdbbcef25c39ba73d4a0c2 legacy-trunk
+31269 4b9b8df54de9ad8554224eacf6467ca3e81c52a6 legacy-trunk
+31270 df74127e2c9fd152158929452cca388aa2ba890d legacy-trunk
+31271 9503685fb4e8808925261e8ee6d627038abfffb9 legacy-trunk
+31272 b331e5e5cc4abf355deee7de0975009354971ef7 legacy-trunk
+31273 abf9a912cfce9c5bb80a79480fbf0ed1aa2bb92c legacy-trunk
+31274 c49638305a28b0d2806f2a474a91bd2df9f4bc87 legacy-trunk
+31275 85359217091caac2bfb4ba42baa7660961d81271 release22-maint
+31276 941de791b17aeb327df0d2c3a68644d565d8cd20 legacy-trunk
+31277 59ae41e04ffbe7fc7b8564e40785d22a27f3e645 legacy-trunk
+31278 9f94009b1ae0ce78ae24b16d24a2fb6aa7d870d9 legacy-trunk
+31279 47a6915d1c36b4b3963fc9347fd9336d67d3df7c legacy-trunk
+31280 c7cf1b5d471b7e7f3e2efe44470a3de1b5698e83 legacy-trunk
+31281 7850fa7fb6f1a149a8971b32ff74dd5d90580e3d release22-maint
+31282 329a00777e320cae7ea88a340bf4686c4c17b1c0 release22-maint
+31283 6b1789ac2f95813e12859342e993bc18b6cc4d08 legacy-trunk
+31284 98c34cc1cf400b64e48af2cb4449e22fcc3bb69c legacy-trunk
+31285 0395512ce1b5ab89c1c6676700cd245f05fed415 legacy-trunk
+31286 38d05056195c9c187e786d07ed96f0dded7d6969 release22-maint
+31287 a4bde915118c605934ecab0aa50d3aaa246e1c85 legacy-trunk
+31288 59482317166e6a7732473afe21c6c931baf1a116 legacy-trunk
+31289 c8148d7f0c986e0f0de8f62d0960713e357dc8b8 release22-maint
+31290 a8a647e1927b56e9d677246c5fbe5be5423bc54a legacy-trunk
+31291 f4cdba83be56028e65cfac9370daa93efafcad9f legacy-trunk
+31292 fc88174c0c0adde36ca63861941acb4cdfb2186a legacy-trunk
+31293 a036a5197610c7c929d0c904f8e20c2d9f373379 legacy-trunk
+31294 7b5043c0ff4768678602ec92f39d6f737cf8d4f3 legacy-trunk
+31295 c5ad0a2489b8275d0a2d4d038313c3da3e5be6ba legacy-trunk
+31296 82cbf1178e4f4f2a6600fd49e29dbe29f0facac5 legacy-trunk
+31297 2d55be3a8ec34ecb19132d4babf101614fbbf76d legacy-trunk
+31298 dc5e1d9180558134d286fb74882d84e219fa6517 legacy-trunk
+31299 2c389a0448a4fb08c64526c7ca3b8ead47752ea1 legacy-trunk
+31300 9f713c7b7fd9100e565385c063fe712f963b5b99 legacy-trunk
+31301 3566b84e66b9e756b2306ade62602b1c02382278 legacy-trunk
+31302 24e8c7e521f598e5d0ed6701a49c20458b11df28 legacy-trunk
+31303 bfc52437930711841645ef72d038ae81a3154796 legacy-trunk
+31304 c18422716ff26b88105272e9ea89285e012236ec legacy-trunk
+31305 8bff3d0944ba769fbf27b4caeadf8b8417ffe38f legacy-trunk
+31306 5f6931b8352e41f0e1bb355bfbfa476fa24a9539 legacy-trunk
+31307 1dc6366543d485e764af59a503af301984c42f74 release22-maint
+31308 fc5a60a61e32f53edc088832205b9de7aed80652 legacy-trunk
+31309 dd1130253f103b96d6abdfadd1e2287e435602c5 legacy-trunk
+31310 cc01fb654ce3f55cb6de3e194c9390dc57be982d legacy-trunk
+31311 904f0e769820905ebc765c204a7f52fb238204ef legacy-trunk
+31312 ebcaed7948e80e1cc97f6bf52ab0c5e87df60cd1 legacy-trunk
+31313 2100182f74e38ac55f40b44337ffdf771736c99e legacy-trunk
+31314 c20fecb5cc9c56e37fe67f88978f9352a1f7bcac legacy-trunk
+31315 f34446fa216e5fcc1372a45acf592605db5d8f7c legacy-trunk
+31316 0bdfd65bb122593109c976b10a6a3026a9179aef legacy-trunk
+31317 39b1bac89365f820cd39382f4b97733da8442331 legacy-trunk
+31318 f2b431364f6fcbf0fa42232cd194de2428309fd2 legacy-trunk
+31319 b650a54a76fdadaeb7e1531e4f2e2f28e6144bc3 legacy-trunk
+31320 9a6054c6d46fab6db3bff2f99da78e61777ab138 legacy-trunk
+31321 b56f00ec808312787be22e2f8ac5047355949ee4 legacy-trunk
+31322 f0409d754b9377efbcb9fe5dc16e81544eca037a legacy-trunk
+31323 d2b01c9dff16835b9eaf8199bdfa0efc9bf80902 legacy-trunk
+31324 2042e2051d9784756375799e7a6cdb3e152a28d8 legacy-trunk
+31325 0400ba78a8979a4f8898096ed438a76ab39381e6 legacy-trunk
+31326 61973d5f6e253c897b89761050d775db4cb1e9ad legacy-trunk
+31327 e62099c65a3c3c1e3494017be1eaf2ab85f0b267 legacy-trunk
+31328 b0539a450917250cc6f5e1fb2b5f62776e9772f3 legacy-trunk
+31329 3611976cb174a5f95349db5a76c19ffdd6372670 legacy-trunk
+31330 0c7e8c3f642f615a572a6ca44562108bd3bedb80 legacy-trunk
+31331 372e3483d32754281c61750ab0ec6ff97028d9ef legacy-trunk
+31332 c7df225e4e4a57518d3f067137930c8003a82562 legacy-trunk
+31333 8d1b272c9e71c24294dbc76e778397c8999066e5 legacy-trunk
+31334 9ec47e65117d39daa3434f69b6b7fb05d5d80e69 release22-maint
+31335 e8878c8f54df5d5e11ba7bd507d63c7082060436 legacy-trunk
+31336 b95b9abb9bf39e571e736e316e055f859dcae944 legacy-trunk
+31337 d2e7f468f224e812ed53fef97deba27128664653 legacy-trunk
+31338 8d6ee15866b216d41ab9f00b76182be8c4191f82 legacy-trunk
+31339 5663e0c818602f1840fbe5056fc94d0c1ff9d8ae legacy-trunk
+31340 42396a786f59332dc24dd47656bb93fb9d11e6e4 legacy-trunk
+31341 cd05af701e5d65bb7021dbfcb5e25f9bcbe0ee08 legacy-trunk
+31342 f6c95f9138ad372d912863047b99be1f21cc9df7 legacy-trunk
+31343 48dc4a59a50ef86e1a030d436592f53b839c6339 legacy-trunk
+31344 cb1eeaeb74a06607893aeee8d4638d730a57f303 legacy-trunk
+31345 faffb11f54e8d0a4f8795c429d6112b58d0404de release22-maint
+31346 bf083e35185f5430cc1be5dee327b9614392780b legacy-trunk
+31347 59fbae33a0f9d7e5de7b20bc295ef938fac8fdec legacy-trunk
+31348 ee10d7e7f818cc43bfd7bc7cb4347bfcf53b9df8 legacy-trunk
+31349 fbc45beaf0344cfddcd33e57c1a861b543c9819f legacy-trunk
+31350 b804ee5beb49239de80332a9311f1b26f1403dd5 legacy-trunk
+31351 19ac12ac80415353c8fc2fdb0b83ab211a0bccc8 legacy-trunk
+31352 651d1123ed6e3722a3aaff02a9e9c2401c9617d1 legacy-trunk
+31353 bdeacf7b15c966bb514175b180071a0f4ee9f74b legacy-trunk
+31354 011f734258db9bbeb4720c15c4aebb76dc2f861d legacy-trunk
+31355 7dffcc498c45831b6cbb43704a6fe8b93e68f7e1 legacy-trunk
+31356 c377c56edfc8d36b077cd350b73eaec17967b3f5 legacy-trunk
+31357 6ba940cd99ef9831c6205a8667169233b56e806a release22-maint
+31358 4a02ca6bdb6f4f7ccc9c7a247739ce97dae6b04d legacy-trunk
+31359 bf9ca086b8aa627042a278dba7543b49beca07d8 legacy-trunk
+31360 6b5696541ba4ef4a93e58284f8b036197c90f472 legacy-trunk
+31361 7f171f9db8afe48405f08c42ad03575a992315ba legacy-trunk
+31362 523efd773261a672aa9fbbabebf5c83f6e8536a5 legacy-trunk
+31363 94bd11b11df7d5fdb07518aa692977a109952dd2 legacy-trunk
+31364 5d2d24a7382592d013fd9fa2573af05becda2683 legacy-trunk
+31365 221eaf7814f44b629060bb2bdb1a32bca48e6034 legacy-trunk
+31366 10259122bf5f2d139ae677497c9751960df2b93c legacy-trunk
+31367 b51970ba218063309452962bd6aac5c5a9dca01c legacy-trunk
+31368 50173ea1fd440716a9002856d9914d477f0dd746 legacy-trunk
+31369 15b031748116c368c5bdb30c367c170c9c8e2802 legacy-trunk
+31370 3160d304152194ce087d8c212969eb40390f2592 legacy-trunk
+31371 1c1299bc33d607276cb3249f6481bf1cc4889769 legacy-trunk
+31372 23f6b0d01bc6ad434cb6098d9e5de32a6dca6eaa legacy-trunk
+31373 e4dbf0f0095be86cf351f74ba1dd64e7669ca32c legacy-trunk
+31374 daa4495cf61ab14c45863cac82f9468230b9ff19 legacy-trunk
+31375 e9d7102f82780ffbe02294a1c48962b1c619a810 legacy-trunk
+31376 e0da4577aaa62415967b56d248384a8c36fee6e5 legacy-trunk
+31377 cb2c3fbba72ee76bfee16c505cdc9bb8f79e681d legacy-trunk
+31378 3eb0376e93e8420650b4330cb434de95f1d2b2c9 release22-maint
+31379 c5dd077de0fc646a7e17dd327193298697a2324f legacy-trunk
+31380 7a20bbdbff3682f7f6653d5b9702751385419325 legacy-trunk
+31381 4b75a0b7685719bf8b3e13244f97da59c9026f81 legacy-trunk
+31382 5620b078627119b69b6d034f875c52f95ec32cd2 legacy-trunk
+31383 81afca747caa5c186ed01879e62079b8235f9692 legacy-trunk
+31384 0160ffcb19e337bf13b829c52711befd2ad32fec legacy-trunk
+31385 cd10fa721a512ac8b382e0b7e3c33774e6b40e44 legacy-trunk
+31386 a8780479d4e0977c228eb7f8c78269569e8eeadf legacy-trunk
+31387 9453d8cdd01e8f7c08b50536acb089fcb6d3f182 legacy-trunk
+31388 e7cd0861c273b56264cb7ca25e7ecc3d632cdc4e legacy-trunk
+31389 38746337ae6e08e15386c54632ff9b3836ea3d20 legacy-trunk
+31390 f8440bb8ede5d19f49fc2f6feac5eaff923b782d legacy-trunk
+31391 83bb6c9dd78c0c63bc511d940906daea13f9f505 legacy-trunk
+31392 d19661e198f7472b60360edeb45fe8be73792e3d legacy-trunk
+31393 b4eb34372bdb5e712c7b648f038cad20fed6b74a legacy-trunk
+31394 65494469ad3eefde24dbc62cfd222b75f6574569 legacy-trunk
+31395 bbbba0ee61fb6f2f608466384aa9bae8399fd6c0 legacy-trunk
+31396 e6cf9557de42a899c9f9ab5476df3732fc0de89a release22-maint
+31397 a52137b88eb3cf64d9b65fd10cb5ccd9c3e7aa55 legacy-trunk
+31398 870cf14add2adbc706a49d47b357aefe0d9a7fcf legacy-trunk
+31399 a9c96bb46953bde8b14d7d328c562ed90a90ec90 legacy-trunk
+31400 100fb684cf3e5f5343ca0b04b641ccf530ee6e2f legacy-trunk
+31401 11e6123de6fed6ff9065faed9b70a489acfffaa2 legacy-trunk
+31402 88a42a7c238a64e79025eccdf4e58a1818ec47ae legacy-trunk
+31403 6af780e0862d009c680ae0894045d699c5913207 legacy-trunk
+31404 abdeeb818a9a07c413560e1539c4638f6b9b3bac legacy-trunk
+31405 8789e9822aa4c971df1f8eac63a127f436119acf legacy-trunk
+31406 8a6c45910ec908d57836496bd13a7c88e8e7cce6 release21-maint
+31407 be7683a6f521c5a6d0283c5f74f136457a2eb4a1 legacy-trunk
+31408 884fb558f2b91d0bd02167fa3aadb66cacc8770e legacy-trunk
+31409 5fed1142fd34b9066a46f1377991678141f4b9bc legacy-trunk
+31410 148d8c0b96472339a5b28791af48dec86b823061 legacy-trunk
+31411 46659675d7f79209cfde460f55aa9122ec02c5ad legacy-trunk
+31412 520a8c0c9a25ec8b71d37a45cd0902fd6641ef61 legacy-trunk
+31413 2094e199fd55631f0c62f1007c5186434e523d9e legacy-trunk
+31414 eacf97759038c3592d80ce8cdb03340fa5667ec2 legacy-trunk
+31415 206c5e3b5be75b19ceecffeda69bfd2d9bb41ce2 legacy-trunk
+31416 cedf9efa68f814f38a3127955a3729d309541473 legacy-trunk
+31417 31e8581bcf259378e95af2689f4052e7498cc827 legacy-trunk
+31418 57d0bad73c8e5a24bcf1541ea0f260b22e1f0424 release22-maint
+31419 e7d59db6839a719aa5f74aeb49ad9fe4202c84cd legacy-trunk
+31420 5aee1c272938d50503b084ec4d382ed53304b8c1 release22-maint
+31421 d8b06012b3815f2a9cf0b4e877404d9de89bf405 legacy-trunk
+31422 a759057ecf1b320570508c6f99ba7e5e91bfcbb7 legacy-trunk
+31423 66fa24777f0aefd8c4d78ce9043a3ecb11bb5d80 legacy-trunk
+31424 7428c12f503f6d969cfd1c28b39e398d143f2a36 legacy-trunk
+31425 4e31e40868498a8bab9c4a8e815e8938c8e978d3 legacy-trunk
+31426 cf1efca82b1837fb0c3b597801e3cce003f52fd4 legacy-trunk
+31427 c163f95b300c649f905718aab86896ca7ca665d4 legacy-trunk
+31428 d0f4f3cd4fe41c85752ea9f02859874ab3f451e0 legacy-trunk
+31429 197d64dc04dc246f4870a484ff419751a275cfc7 legacy-trunk
+31430 55adf08a213a2d8461f17f7a2bfbdc1163775228 legacy-trunk
+31431 81b2bcbfe39bb60083bdd87f18492196cea2515e legacy-trunk
+31432 e5820a150d87fe8434ec80edd40b834fc4705fdc legacy-trunk
+31433 9bdaccd8a908c230215006022c968943723d83f1 legacy-trunk
+31434 233ed6cc8e14a724ec6f97c7c8e9d78e3015ada8 legacy-trunk
+31435 a682cec6b880a4974791cd00fe0f12a6fa71d743 legacy-trunk
+31436 3e169d294395b81d4a808f0730ef96f2593232c6 legacy-trunk
+31437 174749f5b32faa18633b6647882de3d2dcd74ac5 ast-branch
+31438 47b8cabab7b103fecb594d8cc7d3bf97a3e92133 legacy-trunk
+31439 9b42320f1e0fb04879ac0fc5686886f3b8e3083d legacy-trunk
+31440 b0dca92c299a5e963e4a1eb30ba4d52cb096ce3d legacy-trunk
+31441 95b750446bb99d4ad1a03fc31131201dfc2ff02f legacy-trunk
+31442 c5ebacbba0bec05931a8767a86ef3b9220f39b5e legacy-trunk
+31443 cdb1abc1b40929b801a190492bdfac68c2f56ef3 legacy-trunk
+31444 c7d7f350e96c45a968a5f4a870991b584775f7a6 legacy-trunk
+31445 a6dfabf3b92bd7a355e85a107080f20687ac98f0 legacy-trunk
+31446 93d44870e8b58a1ecd123d6aa9bd9c94ce918d20 legacy-trunk
+31447 c346d095791d788857d60f4a5d819f0f294f32a9 legacy-trunk
+31448 be371ffc4cd07a1ae5113a7ec5505d8fb9db0e96 legacy-trunk
+31449 4b5c2e025c5ef5f892df7ed8dbb4a432af447b59 legacy-trunk
+31450 8e7432cdf7d8fc654acbc9a4160f811607615170 legacy-trunk
+31451 2759b048da9b6f409dc19c043c3fd843bb590354 release22-maint
+31452 efc465810e1edac9ff11aa829c9e2bc2e583099e legacy-trunk
+31453 ec1052ef73ba89c473a47ad32936b9fc04ad7bd2 legacy-trunk
+31454 3018f31f6830923b908cfccef185366655c355e3 legacy-trunk
+31455 2c4ab1da6eb47ea18ca64f6db88162711ac990f0 legacy-trunk
+31456 bedaca9853f904cb3b9b481378fd46cc934b40bd legacy-trunk
+31457 84d309b676fa7b77128b49a2ca003d1e1d202745 legacy-trunk
+31458 e31b39930a312834ecdbc8735fd5042f71fd6b4a legacy-trunk
+31459 3da31778ecd724f8a140fe7746d443d1f5a3a222 legacy-trunk
+31460 850c0da101b63ebbebc46a2ce874d4e871ee3fbb legacy-trunk
+31461 2d50049bd21df7caa11ec2b1d50539d7996e9ccc legacy-trunk
+31462 70e29ef9fa62f01d4f3b3f792e75c40eb5799b17 ast-branch
+31463 ac683ac6759afcff54384a471792cfa03073f0a1 legacy-trunk
+31464 44f3e315929b9e4d9fdf33df9aa9fc37d22dfad2 legacy-trunk
+31465 f67ab6b664540b42d70aad0f4fea1701bfad260d legacy-trunk
+31466 86b506dbea18032ff1cc10e58cf80a5088504bca legacy-trunk
+31467 1afafed9fa7755bc386543de708ef8297df33a1a legacy-trunk
+31468 8c211ccde2b4b4d8c55be364a4f60afd7fa9722d legacy-trunk
+31469 c9401a36bae714f0cd5f141cd17f467326ea587e legacy-trunk
+31470 8c6c797727a935fb0579531cec390dff5c95aa9b legacy-trunk
+31471 1bd4857175646260b9a4517a77261016b04358e0 legacy-trunk
+31472 14451dd3acb04d1add811ac16d4c066bdaf2cff6 legacy-trunk
+31473 9255fbde43f362d1c04f34de463eb7a72f0f1094 legacy-trunk
+31474 3b30f66362be00587944ae969c692b0fac1e2654 legacy-trunk
+31475 a6962f52f23981a4c189c943b38f840b98a0178e legacy-trunk
+31476 b5560ae4d971de055332eb74cf0fce0b6f914d8e legacy-trunk
+31477 dae79d78320579606c5fdcc3b23c259a4c5c2276 legacy-trunk
+31478 0f018df974dbb9c81139885ff1e015c5bcdba768 legacy-trunk
+31479 db1d4584a5e1c115cb082a25fc917ce4867d7957 legacy-trunk
+31480 b4eeb0bbdd48b8cb45b7d143f1d27c7de3faa73a legacy-trunk
+31481 47a764e43e901853bfe8f346046b3a58bde0dee8 legacy-trunk
+31482 b540e608bb8a6bcb18460ce615d66476af7a1224 legacy-trunk
+31483 aa88aef3ab0eea84037331cad8b726737bea8d40 legacy-trunk
+31484 1e76ae3c1154d6ef1afbca26872a1b30ef6981a5 legacy-trunk
+31485 f310894107cb1953a1bd5a779bee6db527bfa96b legacy-trunk
+31486 f3310dcef3f8b5e089f67c43fa7471e702badb16 legacy-trunk
+31487 70e196af476d48eec351ff610b035f2b90f9459d legacy-trunk
+31488 91fc9637e56a09c2030d551cffeef036211010be legacy-trunk
+31489 e07b21ea3c45ddf44930efe91a081628d73601d4 legacy-trunk
+31490 cc4ad9afa21d33880ee2d2232ccef5bb16ed4b5c legacy-trunk
+31491 cb3f18908cebee05b9c9184200f90ee5641a5f10 legacy-trunk
+31492 ac10729f0932d09ab978b93d337801feed530ca7 legacy-trunk
+31493 e27342a641737f7e0046817f1e72dc94ad0bf98c legacy-trunk
+31494 226463445697203a275035bd06b3296e8cc0886e legacy-trunk
+31495 3baabd027cc4d4120e8e1270b750032fe633a78e legacy-trunk
+31496 8dcc520d3a2967a2bbc56161f6b2c6d25c8dca91 legacy-trunk
+31497 b28d4fde9e9fb8f3c8b90ce93d8879354bf2e0c8 legacy-trunk
+31498 4337a899fd13247f32421e413912b56d1a5e3c2f release22-maint
+31499 47c9421358dd047d29c33207538b0c86651f145a release22-maint
+31500 4c85de247eedb97f44c949ff8d386c64e20ec0ac legacy-trunk
+31501 e0a8c3115005e1c339e936a6900a27acd75de3eb legacy-trunk
+31502 2e0aa68d434fcc406ada9ff5a398a78652adb0a8 legacy-trunk
+31503 53c802927202e8427538446a457931ee53d50240 legacy-trunk
+31504 8fc91f50b8615065d6fccee8fe8318dfb7d89938 legacy-trunk
+31505 d0d29df2b6390053d5b3db4959970352524ea5ae legacy-trunk
+31506 cc95bb7870dc547c0cc8e835fd7418e67f791a35 legacy-trunk
+31507 d5ea2b67b5f443f3c6575fcbdfc8a6027474eba1 legacy-trunk
+31508 0fe321e78ad31a1baabd965d55791617287a6340 legacy-trunk
+31509 4b99a701defe0eb70b63198810a7604251bcb0c4 legacy-trunk
+31510 96327ec76d9e02b8431158d2461c18cc3e4fd8af legacy-trunk
+31511 e01d5dbb66a459011e14cfc82b47030c3927609e legacy-trunk
+31512 eb2a984d37473ecde735d25bbe9668ab6324a1ba legacy-trunk
+31513 387a4122cbd1e66c2dbcc5ce5319eb6e3b6bc24c legacy-trunk
+31514 9e0f2242277bfc1fc402f14602b4a677adf110ae r23a2-branch
+31516 cef7c95e748c1cc68e94b9acb32549dfa9392fca r23a2-branch
+31517 765019758e95102a2baa1cb22a02bc4d89b99164 r23a2-branch
+31517 721b6f181fcb9a9420bca88d7c0f5f85474823c1 r23a2-branch
+31519 c4b919fa0be3eb94f73c748b68daa5bddf96f59f legacy-trunk
+31520 4809fb0e86601884f8f3e0cc7586c84bd57e0bd2 legacy-trunk
+31521 f59870976146860babc5d364865e6d7dcfbf1448 legacy-trunk
+31522 658602124df52823a6592a6d658daef506a1ab7e legacy-trunk
+31523 2c751936f69767a7af4349d1dcff7253dae9ee7f legacy-trunk
+31524 b26f5758414a0f13508f0ba49aeb3e729b573290 legacy-trunk
+31525 e7b26c3f356f57d359c55093f692f8a46774261e legacy-trunk
+31526 0b3db0edb151ec007fcd3fb524bfd764cf48226a legacy-trunk
+31527 5367cd0eec477c7590a30d20ee169ae403f977ad legacy-trunk
+31528 4489918a4ccdb9036024cc83b276b8a999b05c8e legacy-trunk
+31529 beea4f21c9f057c3b139ff9680f5816261b0e838 legacy-trunk
+31530 e267ed100d85fcaac956c090298f11b81319c73b legacy-trunk
+31531 e11a178bb453fa4476d14a5ddb1666641dc7cd74 legacy-trunk
+31532 107d988901a0f93c468ac910507660101228703c legacy-trunk
+31533 9e38f817092fef092adf7ac4734da6c07118fd69 legacy-trunk
+31534 e27f58a5073704829c7d9b127a79a53a7a229b6d legacy-trunk
+31535 8f70602fbebb3c3ce1771a04f90d020463869c0c legacy-trunk
+31536 1d92c15bd0e72589137dcd64de04b49389f61e69 release22-maint
+31537 739ecfb5f15e889c0ff118c8e2ea04b184f32952 release22-maint
+31538 77bef6aa48e55fb0d86a8b18d4336222031aca3f release22-maint
+31539 16b25032217ff510136a9cffbc7291c32db5cd42 legacy-trunk
+31540 d92d9b6a8a7d3c2687bb51ef027b4b5c995a407d release22-maint
+31541 eb5e296173109d0ccf098ffab9f15b5069dae556 release22-maint
+31542 5cf0921f4b962625e9dae2f1a1cafc95cc4b555a release22-maint
+31543 2df92049d925017bbb860152acf7ab76844c6b16 release22-maint
+31544 a4f9d91a321a79df48b757955d26d21430f6aa2d release22-maint
+31545 fe10ece8ba68c4aefa48d1337357607e3af9e17d legacy-trunk
+31546 7aa2163889acf87f065491ada81503943e5e2a49 legacy-trunk
+31547 0eb948364990fb991524db467f951d064b34e0f4 legacy-trunk
+31548 facff522e7442ce01fa8cb380b652c5fd138cd37 legacy-trunk
+31549 729a1c2ec4e8e0fda2de53a3fd7ba142adedf5ce legacy-trunk
+31550 612883eaf50c6e71ca187008e6f51e99f8eb715e legacy-trunk
+31551 79ad6156d6c424465817c5bbe6f4968f4b1a4635 legacy-trunk
+31552 056ffa554517a788777deebd17b224337e5eb91e r23a2-branch
+31553 a8c0af82288846e8a95eafe68b002f46e32f1a79 r23a2-branch
+31554 a2e970588e5bb68802eacf9928002908b3ae51dc r23a2-branch
+31555 bce3df075f378093b280f4f0f32b5841e0328e1e r23a2-branch
+31556 3bbcc3bba560c8b4673f31f8afd1f86bf2cda564 r23a2-branch
+31557 b849482c70c6d9f0b5502cc2aea02995ba93cf24 legacy-trunk
+31558 fac762283abccaf1026ffcc00cd0bb757f098682 r23a2-branch
+31559 1e907462e83adbcf54dba754ef44010e60e8f9fc legacy-trunk
+31560 78c9c4a018cd1a038b7fae59434dc12af2a1ab32 legacy-trunk
+31561 32a0c2f422f18de9164e03011e613798a08a3f3c legacy-trunk
+31562 21a50c308db4592ed0f8fd5fa0944cae44bf3738 legacy-trunk
+31563 5dfaff98091001dd6f25ab20cc7341f50deb1946 legacy-trunk
+31564 872c6f2028fc4b7f36ffff5c35cd5ed6f58d4b32 legacy-trunk
+31565 808437b83b151866ad23b098e5b5d5930c50436c legacy-trunk
+31566 61fa6b55c1de2d65a4e6332d1a898ee05cca1ca5 legacy-trunk
+31567 e63f1eccd250dad39a5eb9188a90b83a5ed3dda1 legacy-trunk
+31568 906459614b5e712b518c91629e853fe1d0fbc9f0 legacy-trunk
+31569 43a9ecbd9607ca33d18727916a83a935d05f4d4b legacy-trunk
+31570 abd57c5358bd7a0ea03102e9802903004a739e21 legacy-trunk
+31571 6e20b049ed6f6c45c819583b118ee0703fd12e57 legacy-trunk
+31572 25fd28c8bb6bae9a81e336f2eb52d5257c0a4bdd legacy-trunk
+31573 904a8b822dafbfbc6efa2458569f36fe14bf7713 legacy-trunk
+31574 53bef20f84ccd2e923993bcf5ca1f2a2fda5fdd2 legacy-trunk
+31575 1c2c97d3456384e72b9f1b140d9e50fe3ea9dacb legacy-trunk
+31576 91624a47537c701d58e84fcc879302a00b14ef00 legacy-trunk
+31577 f34fcd63ae28e08357726cf8fe7ff291cb508c03 legacy-trunk
+31578 53ffab5db015dd7ac6ab8a8ad657f7dc57d0bcb0 release22-maint
+31579 be09d32687d8c5ef579d59d0c12c44cbd80a4b0a release22-maint
+31580 3ddb092acea8b8ae533e28ba2d56e37471cd23ca legacy-trunk
+31581 4f6c6330806337d50b284cf38bcd8e61b7d142ac legacy-trunk
+31582 d8b9d7c04146543e71abd5fcb0fdac78b3154c3d legacy-trunk
+31583 1b6538aa09591e1e9b42608b7ea6a6de0d940841 legacy-trunk
+31584 4ea378a71f966a8bd8f02d66c35828cc8bd5b0ad release22-maint
+31585 db92c77b05e26b5ce3905c7b223b56a492a0604d legacy-trunk
+31586 486a0f516db03d17c7087fa45b9ea4384c2e6893 legacy-trunk
+31587 784ed605b5130baa6f43fb0ba2af44aa2cd437fb legacy-trunk
+31588 7802d8c1adac840b204282871e57e328ce8de28b legacy-trunk
+31589 2e8f0531919bb2f1441c2ea77d5c4831ef517820 legacy-trunk
+31590 192bd6e135aada58f575c373785d7e4e28e4bc89 legacy-trunk
+31591 b38cebc76d8251f5a29dbc3019a2ebec0dec35ed legacy-trunk
+31592 5abc5d08814f968a3acdb4c3e3755a50e88cbc4f legacy-trunk
+31593 823d5b1f32e12eb5995533aa56e047f2e8b9cc41 legacy-trunk
+31594 0a89b406c732f1f6a238c2a19859ba8be45dca74 legacy-trunk
+31595 498db1bcd664894cad3abcc37cc83455535bfbd7 legacy-trunk
+31596 ca5b0cd7a5250495cdb0adcd436e186f6afc9334 legacy-trunk
+31597 40134070e6a6a0ddbb1f7ea78849f8fe7ae3f7aa legacy-trunk
+31598 a8c87a0beb9803610915cd06613b03076b0f831f legacy-trunk
+31599 1a0c231c6b0cae80429426f1899a0c186f6f7993 legacy-trunk
+31600 723c5457307d9385ab2aabee190e940167ff9222 legacy-trunk
+31601 7f90b5b7001ed1fd88f983db5f035b815f2cc0ba release22-maint
+31602 fb79cc2630c1ee4242bb7219c058d7b8bf24d186 release22-maint
+31603 f8fc5e14bfe87a5cf5dd75c2d1631e4c7048852b legacy-trunk
+31604 c75661444655388325d20135cdbd7625e62fb110 legacy-trunk
+31605 c3665df66d6d5b2c8da9b965bb1cc02912e1c919 legacy-trunk
+31606 324896b7f4e1e25918af1a8e993534461ecca978 legacy-trunk
+31607 c61ef183ce2f15645c4a400ac01fa65a9a9c8622 legacy-trunk
+31608 d6730590526c314c5ae0f6f8ba6a71e3647a113f legacy-trunk
+31609 9d297d3de36f5861a5db767e9ca740ebbe157d75 legacy-trunk
+31610 f72c383bcc45d4f8844f303c44619465aa15ecfc legacy-trunk
+31611 86d8384d88102fe288723017564b1376a2b6c5e6 legacy-trunk
+31612 866964c85b8e26d8395c417769ea4e525ccf3832 legacy-trunk
+31613 5b3d59b978a2d69f166e3d972aab321d2ddc9bc5 legacy-trunk
+31614 a8a64364a711d419d6a8ba5f6be85dedea1bff95 legacy-trunk
+31615 0455cf89b12398a0e68c3e653dc4089109bff595 legacy-trunk
+31616 b04625cea0613aad6da680a3ff7b8df092a61e8b legacy-trunk
+31617 7fdcc4cfc75917554e9ad7731167dfc2ec78b9f3 legacy-trunk
+31618 00ded62d2678a435fd40d6bcd0041b8bd096a68b legacy-trunk
+31619 fcb39b0a6e306c8058cfe745fa01fdedddb9df72 legacy-trunk
+31620 bb6bd549f92a7964eb969afe04caa509fe02457b legacy-trunk
+31621 b8cb90fc3523d36849a4a09880bd9691557f8e6d legacy-trunk
+31622 0c89dc6254be8d874ef10b3c9ff18e48cc64167e legacy-trunk
+31623 cf9d9128345c3f1b49adfcdf6ee9cb27e82975fe legacy-trunk
+31624 a5874453bf17c6608e592d7fba82f7b3d944871c release22-maint
+31625 29965d0d465059d30874e6f780c5484ae126cc43 legacy-trunk
+31626 44ba1572518f7029da54b0ca363b9167c7eec117 legacy-trunk
+31627 f42fbc7c7d8e9ac2e05fd42e7420021bd06afc05 legacy-trunk
+31628 2474381527bbc9c42a20d5e949d75223d4a07707 legacy-trunk
+31629 465405a159c1f4277f6a4e6d4674c81137958319 legacy-trunk
+31630 d9e9c964b6a46e50daff34936a5b9e073eb2376f legacy-trunk
+31631 14f65d6610848e5bc956b4768d49c8c88dcd5663 legacy-trunk
+31632 3c5a8814470c9c4bfab75ec70d356023f4d84de3 legacy-trunk
+31633 04a93b7bdce496115b1078b97f292cc3d94e741c legacy-trunk
+31634 12bab87a3dd2345ce9a43a02340fb9b933a50852 legacy-trunk
+31635 899f2d210a34d8540e6a3ff4dc6e46d4e9651395 legacy-trunk
+31636 d5aaa67c096af35692e3bdc942aefeba80ae8bc3 legacy-trunk
+31637 748f2e5b8293882f7fcbb2189a289fc2bc942b23 legacy-trunk
+31638 31008433c74fadf8bfa9b9d16ecb604e57b2c559 legacy-trunk
+31639 d50d1ff42b5ace8d55616f1209aa651e73edb9ea legacy-trunk
+31640 2d59ca29f384d792b3a816b9e5a5e222cfb6ed75 legacy-trunk
+31641 7e649138312b3ff4dd82db1cd4f5df65c7434dab legacy-trunk
+31642 54b35da9879e98805cfe13b54dc363bab6ca20bf legacy-trunk
+31643 ab27183c8927f6509651499b54f39bb4727b34c1 legacy-trunk
+31644 f4e72a1a9f13e86c262ef453c55202755157a1e2 legacy-trunk
+31645 5e5eefa25f3ad1bf5968d0c42721b870f82af5f9 legacy-trunk
+31646 bf866ab39dff2a578746b7138845bf4127f45922 legacy-trunk
+31647 2f3cd3f540ad1aa50d8cee31b0b189f20e6fe842 legacy-trunk
+31648 d9b487b9034a493f6749c7ca2864269628d2ca88 legacy-trunk
+31649 15773e758fc73abc49574c9d8dd9e40cf5743841 legacy-trunk
+31650 98d1071362f040d438e57ab5a8e73fbe3901efd5 legacy-trunk
+31651 dd6a62578bc8640644f9ba1471bc41a6b1fa3d72 legacy-trunk
+31652 d36dd41e890f2ba196c380e176ee46f81df24bf8 legacy-trunk
+31653 7a2f683395e7282c8b33dfe276a860ddd940d968 legacy-trunk
+31654 2c8c2c6b2ab79b1e4f26208979a0f53cb8ad271a legacy-trunk
+31655 62888a7edf0b554f3cdd205186d976eba8d7a5ad legacy-trunk
+31656 14463f4782402268aad366b3e91745900238dac1 legacy-trunk
+31657 2fc52be77999134d70f256f527f82ff5d4d7d2c3 legacy-trunk
+31658 9378f6e551ae7216a1d0bf50e2a80e52c232b61f legacy-trunk
+31659 9b4eed4bb3e2e4a18339c529887e61761c4a4422 legacy-trunk
+31660 4f4f2a1544784955ae318a2fcbcb56e73ebd8f11 release22-maint
+31661 869695cba2cd37e63ad5d4cb92ca55aae58b45df legacy-trunk
+31662 d24564e7e999cddcc9aa3d257484ec0558657cfb legacy-trunk
+31663 c24a23b1f198af0b535719cba7a68682ff6ce57d legacy-trunk
+31664 39cb917b5f7ab4bae9242b60ae18812fcb16c90b legacy-trunk
+31665 f1981ee98223ce5ab250e70063a8048d0d30f035 release22-maint
+31666 88e58e3d580773e704e16195db61fdb962a3e491 legacy-trunk
+31667 f469a6d077f1e9508e7b44eddd5a4bda75d88f51 legacy-trunk
+31668 4cccef9b4d545757be2a314356f8c597eea90d27 legacy-trunk
+31669 5f923165319d5cb68c959b86368febfdfd73761d legacy-trunk
+31670 87913529f248098f9e547d2b6b5937728ea0b9ed legacy-trunk
+31671 a24aabcf5ea28186b85d6a3c160893e3a6b26574 legacy-trunk
+31672 b009c3ef27b51c5379b03b739381aa37f0093749 legacy-trunk
+31673 50ea8ded29d017f372539d8c5390753473a553aa legacy-trunk
+31674 047b5d000aaa5164dd78be5d11606777865afe84 folding-reimpl-branch
+31675 1d662342e19a64b3699c4bd77e09a8a77112c79a folding-reimpl-branch
+31676 97b97e57190cff73998fd19e23a9f48466ea958a legacy-trunk
+31677 f9f3010fc86f76a91bc2f54019984ba3c5d1e5d4 folding-reimpl-branch
+31678 9ca4a67b99736fbea07d8a0962440f093b3588ba legacy-trunk
+31679 cde444184336fbdc7b656a50cc3297f747e3fc76 legacy-trunk
+31680 b53455a51b78095f53d0766e6cf006680d9d0388 legacy-trunk
+31681 655a08557a43ec1624ab65b22266c1708b64638e legacy-trunk
+31682 789b24d65d42045778678bbf87f4463f4e268ee7 legacy-trunk
+31683 eb15de6a4a4cd06d20eba08fa73020a418917717 legacy-trunk
+31684 b20a3685d23e1d1a6e35cf41ef5bbcfc58a2425d legacy-trunk
+31685 f9db9dc456ab5703817ce74d4a32297b067f7cbb legacy-trunk
+31686 7d04bd8976618745a01c8ff4f43273d3a05d04c5 folding-reimpl-branch
+31687 41a9a072c68176af6cc8d520edd977979a9a5921 folding-reimpl-branch
+31688 2cc19a325d667640e9329cfd4a738c72bbdbb460 folding-reimpl-branch
+31689 dbf3ebeca7b1da62e622956e5529206e62386623 folding-reimpl-branch
+31690 377961d766105fee37f408212780e2ddd87d1fb7 folding-reimpl-branch
+31691 3992ca700e65803134f661c68727ba96721d5966 folding-reimpl-branch
+31692 a3cf07bac37369f2a65d52655868203cc35f9421 legacy-trunk
+31693 524e5f9f85e6af0337ca3b8956c58f0d36cb4f7f legacy-trunk
+31694 8889654c0dd5d099f05858f05d89b1c5886094a0 legacy-trunk
+31695 843d5c78952a822ea01927f02b5ab0043fc5e5e6 legacy-trunk
+31696 898ce4e96f592b0c5b065c1564c09d451b71530f legacy-trunk
+31697 f9b702c52daea29962ce0392a375a06e05d143b3 legacy-trunk
+31698 2815c1a9f735834be7612b06bc269a1cc40e79d5 legacy-trunk
+31699 9e737d63f3801e74dbedf30c252dfacc3506cc30 legacy-trunk
+31700 44c31236743a07815210d04ae10597a57bf4b3ad folding-reimpl-branch
+31701 2947459b078923293d768bad0709baeb2f38bf46 folding-reimpl-branch
+31702 902fcfd5d65d098ae8ab011097a3990eea75083b folding-reimpl-branch
+31703 76d0618f3fe0d8792b842e75543236112e6e143f folding-reimpl-branch
+31704 a8361bca1c5cc77e46a111db4cd0d8c782c98ec7 folding-reimpl-branch
+31705 5c0db41d38f93609b8326fadea12bc4bb90e62fc folding-reimpl-branch
+31706 95abf3fc2b2d3344c4715f67d68b0c83640098c7 legacy-trunk
+31707 12d4df71bdaa35df42ee64471edb56f6b1ba81a1 legacy-trunk
+31708 bda490fc2691eb98774dbf94d8dbd556136f014d legacy-trunk
+31709 0d8552408fcde18a75dbb062cd273e6848cae955 legacy-trunk
+31710 e9fc2c1416089eb87019f79307b61f177e3bc612 legacy-trunk
+31711 6d78c6bf31f7d2c8fcfac177264f59d230cc266f legacy-trunk
+31712 178d19cff1638132fc7303fdb3af7b37d4122843 legacy-trunk
+31713 3fe72a994103b35cd3d3e19e936e593b6141b333 legacy-trunk
+31714 8a71301afc2da602b6794ccc18adff8489db0ead legacy-trunk
+31715 43c7d8a084fbc39d9e2e5ec75aa0399a286eff11 release22-maint
+31716 e405929c223e57cb2d8a4b3fd2c67e02bcb8d60e legacy-trunk
+31717 29d80340fd414f8433630c70ed5b80b96923a1e2 legacy-trunk
+31718 01aed72e309e52c1dbe60bc0dd7cc4724c98a820 legacy-trunk
+31719 ba1bd6f6e6edc5608dc661255e874eadd627899b legacy-trunk
+31720 ac965a502d1b77c5da6b981ddd0ae2f4163d05b9 legacy-trunk
+31721 ab85c756c5df3c61bc63344804e2af23b07ddaec legacy-trunk
+31722 89137be25e7ad7ee4fa0d0c88c0a4db906777940 release22-maint
+31723 87704f89ea3f5cf39a15a83949cd1d5c3cb8b2e3 legacy-trunk
+31724 37cde078b9332bd2928fde94f9618b052373dc58 legacy-trunk
+31725 3030d67fb4a56697d5443f8417adf44e5e3ea68e legacy-trunk
+31726 bc2d07230934d4ceeeff1ba1df3ff8af385a4333 legacy-trunk
+31727 ce3760e8e6406a775b2404fa22f0f35308955a69 legacy-trunk
+31728 24fe023901b07b5bbc2a42e099fc765e39951c73 legacy-trunk
+31729 a6cd9d6d5ca3a490c3d017634c5ea63e9c2fe94e legacy-trunk
+31730 5776fd188f205458682c3e166a72ab7d606e3127 legacy-trunk
+31731 3f90d21debe96e1822594240a2c3f9e1f3252d32 legacy-trunk
+31732 395eb561ece13676c0f2ed08ffad6949845a937b legacy-trunk
+31733 48a5113dfef9812b62ed5f770fff57203837040c legacy-trunk
+31734 59ca3200b6e5034e23e0af24122911a742d68fb0 legacy-trunk
+31735 0a8e8632c6318b8c5f0f4385993280fd785747b4 legacy-trunk
+31736 04df965d675b7d7d3cb0737b5eebf278f86c48e2 legacy-trunk
+31737 5852352d95222bae690a7c0f508be2281c607806 legacy-trunk
+31738 cd21be82f50bbcbbe78fe635636d40dddd901a1a legacy-trunk
+31739 a1b8e654d5fe15f99f3c992f47259860b1d03417 legacy-trunk
+31740 92f1d02e28f0a9a4f59c7523c075459f06771a59 legacy-trunk
+31741 736ad73df5b48effc67e0608616b8268125eafb0 legacy-trunk
+31742 46a81bd8ca0cd03114d6c787fabf6da2f46b6852 legacy-trunk
+31743 29dddc01b5ec3769df34c953fc187bb7e8071d0c legacy-trunk
+31744 8e607185689a4d6aaa2e00d27660fadc0b4363c5 legacy-trunk
+31745 17e6e814d094e9db3fb7a7eba434bce196fabf7f legacy-trunk
+31746 e48fb5fbfdf4da7bae2efba86a8bb918ae082fbe legacy-trunk
+31747 149a5772dd0c462b644d484665860fc1d74f2a43 legacy-trunk
+31748 fcbc824b6e38094c7fd54b4b75e3ec2952bf2546 legacy-trunk
+31749 027dc213c57e72dae3c6a42b98c00e6b15beeb73 legacy-trunk
+31750 5ca650a9005fa4b2c8704c73fbd5281e7c7528d6 legacy-trunk
+31751 8f008b7cb97b3c4249348ecf6ff47e7ad8588a4e legacy-trunk
+31752 2abd8a5af6ddb118ba86f48ae26783cce00618a7 legacy-trunk
+31753 b7c29dc8afa0f305b916021b4f52fda4ee6e296d legacy-trunk
+31754 efe249d069ba41b80579c6aa09209bf8459f45a6 legacy-trunk
+31755 81415048b2aef0010451f4e3ab207564b8670c37 legacy-trunk
+31756 8b7d9eb49758c5612b83a4512a679b19f32f772c legacy-trunk
+31757 0749787994dbf383ff74c566f6015655be40d4a8 legacy-trunk
+31758 f57d30d50648ed800fb7931bc7a80645a798f238 release22-maint
+31759 a7f01302b16d2b147e55448a7d548f95e3c38ddc legacy-trunk
+31760 0ab454593b53a15f5acc73371ea23fef11fb2eac legacy-trunk
+31761 05575b7e67140843eb0e15205078f4124f9b9c27 legacy-trunk
+31762 a382263df01d5a27f30d67c4414723445fd8c7d8 legacy-trunk
+31763 bad915645fa22dfe965fd1c373841a62a4c61453 legacy-trunk
+31764 771961e45314f02c1c10d44fb8499684b169eb6b legacy-trunk
+31765 439101d4705bb05ebc1f7c147eb10c4fbedf7883 legacy-trunk
+31766 2c3ef46359ef4605cb578b93aa852b8d6def7c61 legacy-trunk
+31767 fb8f76df64ff40555d3da552b5f31e553661f516 legacy-trunk
+31768 92e3b611dc9f920720b72b60adcd87401740cb31 legacy-trunk
+31769 008a26c353af97094ccc81f6b7af8198dff692a8 legacy-trunk
+31770 c03be22fdd24c1e57d231445165535e4ab87d317 legacy-trunk
+31771 d4b262fbd04a207e65fce6dabcf0b80ad0a17483 legacy-trunk
+31772 f2bd0f4d85750b8cee43c695844bbbfa65fc0d75 legacy-trunk
+31773 b3c1587b2b8e322cd72714c2de801d6520ff4db3 legacy-trunk
+31774 73b0dc28c91a7ae8c054a735bf4bb39410305d52 legacy-trunk
+31775 9070404f24fad5874fee0cf6d166ecfc82609216 legacy-trunk
+31776 7c8e8807aed29c6f2dfed93c2a4cd2fcfb81b5ed legacy-trunk
+31777 997d481ea40910a14c4cd2fa395d5d209e01f9a9 legacy-trunk
+31778 dc9475ec79855cc908896cc6cf9d639287c8b5e7 legacy-trunk
+31779 eca697e06a07cc294b16e5a75b7bb39abad5df7a legacy-trunk
+31780 733aebb57fb009c0ca304373e52ee2cfa8d93e7d legacy-trunk
+31781 a2d79b93b50a0a93ebb7dea0433bbb59dd152895 legacy-trunk
+31782 27addea33e0cad48aa71a49432291fff690a0a29 legacy-trunk
+31783 cdea5b1b8280cf9ef91616d7723ab9e780702682 legacy-trunk
+31784 43066f67c5dba7417008f5938f236bc44896844e legacy-trunk
+31785 b84e6b4e18c8599cfd3975184ffe81b29acc044d legacy-trunk
+31786 6e49ba3f60be556009e56e3c85a1167d67c3f0f1 legacy-trunk
+31787 a2e68adde8b0f4ca0948b049cf3e3e8680ff73c3 legacy-trunk
+31788 4cafa514101252d5917d9160640c83fe45b21665 legacy-trunk
+31789 47cb85cdd5f31de8b5ff7e1e3a97b52878a0cc48 legacy-trunk
+31790 d44f9cc27290555532e1feee823cba12e3f9c5d8 legacy-trunk
+31791 271baa88424be29a883a5219ddb79331aaacaa71 legacy-trunk
+31792 6273a158fb0acd71c75b7818e2e8126f6231109b legacy-trunk
+31793 b5d6c38eb1636fe63908032c71adcc7fc3cbb60f legacy-trunk
+31794 48a61a4b73a10be158000ba9c4fa06731fd98ad2 legacy-trunk
+31795 30fa1f61b231a7ed6b83b4a80aeb6ce2eb361362 legacy-trunk
+31796 8f23d39a9a3387a6287dbc886b34611bf4868aa0 legacy-trunk
+31797 ea70032a24b102421fdc3324ab331afcf2064458 legacy-trunk
+31798 00892affb60ae84f60d8cd9f745336d71a3684f7 legacy-trunk
+31799 fe1d571c3f803e373f099d6edce030ee6d4035c0 legacy-trunk
+31800 f13adc00c16520347a90d0a8b62c9652f5288f57 legacy-trunk
+31801 0574326c78bbae46b7efd876ec7754263a30a0fb legacy-trunk
+31802 5855915b00f5e5147130db1907d8f4f92ba43e31 legacy-trunk
+31803 5c3acbf22a26f672fb0d814769b1f3a9b60b9f97 legacy-trunk
+31804 6269eaadd41ef4bb3b8b303936fc33d1434999a1 legacy-trunk
+31805 f95dfb33d76293c8089114e9a6718f73b3fa62ce legacy-trunk
+31806 a59d8e4cb903867bf1e70200201ece39f5b8ad69 legacy-trunk
+31807 4f679aa623c2f6c2563d4fddf078974150561ebe legacy-trunk
+31808 4b6d7c75698ac7bf31f674c04680584cc2a13a9c legacy-trunk
+31809 6ee8d5a30cbc2224a1d412bc58dbd72637bbe5a5 legacy-trunk
+31810 3655e91b3deacff2cfc1a5e45763314147dfd8f9 legacy-trunk
+31811 4b1fef37ac7bd7aa8c1b75ff689dfb171f9eef8a legacy-trunk
+31812 d76301858941c90b8e76d98e82ab222d7c71edc5 legacy-trunk
+31813 b246ca033e3ee7d8425daf3c6164fd5dadd985cb legacy-trunk
+31814 03d3fa3e1d4e5ca4fc5755eba2a25b02e4137523 legacy-trunk
+31815 fa18df746ec525d7726a5bcb5ae5e015c5cbaf79 legacy-trunk
+31816 5c46c9587a2fa3178ef1c0bef7360cd893f3e497 legacy-trunk
+31817 927a9833f83b79ae1ba9872bfca8fa3ae12a1926 legacy-trunk
+31818 6c0667ac939edd3f5c06fc7a2c9c23fa07d9b1f8 legacy-trunk
+31819 92b9301300c396805ea1fd42961ba7df2c119294 legacy-trunk
+31820 2751c5ef98be6cc97933d084ad8feee7d4eb6d19 legacy-trunk
+31821 a4e7edc69054d503bf230abe685470be0991bb84 legacy-trunk
+31822 156911dba306c127832c7d79c4fe72f8be8f58ee legacy-trunk
+31823 bea3d1fda3dcb021121f7bf6bddceeed75baa449 legacy-trunk
+31824 b78d8bb5ebd71474da799d0857b6efde00722814 legacy-trunk
+31825 e28b48fc900bfdaad33121f1be8be84f8d73e9b3 legacy-trunk
+31826 fc929d71a450f438d8823c3c14e84ad39d8c0d24 legacy-trunk
+31827 65b72267382909737db3f563098fd7f8fdd6eebd legacy-trunk
+31828 fd9b882be07975bffd5bb27498e447f0123cddd3 legacy-trunk
+31829 7f0bfbec987fa0df27eed06a0a0cfdd9a1cf15e9 legacy-trunk
+31830 3365664b82942bac665c9731203e1bdc9d6e01a8 legacy-trunk
+31831 4c644a60c30d93855df1a8bd403dc1fec7fa79ba legacy-trunk
+31832 b1356dbaab9a2b96efb6a81182816c8d01c36e55 legacy-trunk
+31833 fbae20a2e116deef7af0944d4e4e5d611f8036b7 legacy-trunk
+31834 1028dc6807a5f9805cba9b6270c13ab01d9c2bdc legacy-trunk
+31835 459c4291f759630d7a15e933746ecf8501b575ce legacy-trunk
+31836 6a2d9ae430bea6c1f352081865a624b206a6f694 legacy-trunk
+31837 a2957ffcb59865d2f60774e0d4f8be6e5e1b0863 legacy-trunk
+31838 ef525c99b4eed66850cd3c6d4842a34fbe7468aa legacy-trunk
+31839 51c74b795e9e9494c09fd7716fd006d3cadc659f legacy-trunk
+31840 162ed2a9cc0c8a27e6836313e9fa5fc100e015fc legacy-trunk
+31841 7fc3e64d14241532ce63d283dfd6338a11cac3d4 legacy-trunk
+31842 73814cb5827f8c5d234b379428fe78928e28aabd legacy-trunk
+31843 8d10f68d7c3b0af291c15b81e526668d06c68f2a legacy-trunk
+31845 a8d24b97c813b20ddc4a6364fcbd6dfc228ecc26 legacy-trunk
+31846 b972be806477f131aecad1a966eed5b7115d27f5 legacy-trunk
+31847 c9fc35d0a3ebabf0d4c01485ab4a27523b22169d legacy-trunk
+31848 22897ca10288dd1c2d566a1597ea99565b5574a0 legacy-trunk
+31849 5a4c7e6f008e212f3f060cc548b7e1ee04c8e646 release22-maint
+31850 e40527769864cb29d691bb1ce39b27803cdd91bb release22-maint
+31851 171f1862dea957354e41c1f6893c9480b82f4ed7 release22-maint
+31852 65dd9612a748080161107b6447bfd55cd938233d legacy-trunk
+31854 0ba17e93f139f574fe3a5b30232d75385cea86d6 legacy-trunk
+31855 7654c24decc4edb9c442be79dc1899015a468dea legacy-trunk
+31856 2c22b5c09a58dc6193e2a74e7a03d713c5bec892 legacy-trunk
+31857 abfe4b380305ed8c2a917be093ca233b9b224ed5 legacy-trunk
+31858 14316df1c298b71653dc754b51d084026b272ce0 legacy-trunk
+31859 9602c664ed7a2cbe681f2019edadb675977612a1 legacy-trunk
+31860 73434fa9d2852b79c999d2787c4ce1a39bbf6fc0 legacy-trunk
+31861 8c082936daafdaee323957acd9dec5f6cada8b38 legacy-trunk
+31862 470504ef578b205366858aa47a0209d9aa64a1ff legacy-trunk
+31863 b14d6741f49651b86f620001ed3b6600fb9359c3 legacy-trunk
+31864 702e547f31e0d525df554cb3ea04587f0801970b legacy-trunk
+31865 226c5bdd160b95ae7c70fdb81afa9863452068ca legacy-trunk
+31866 00bda56f5433063cfbec1a5571203f3ba72b8d33 legacy-trunk
+31867 9c3572a5575f9973224d9051ba8744ffcb2d2eed legacy-trunk
+31868 5c9dcdc7fe8d69b3b2f4c3e7a1da18af7bd3844c legacy-trunk
+31869 4f47df20415c71eb990961dce614ff336f368321 legacy-trunk
+31870 2489d22228dbbc97dd101a18db6c7b1f06a9b81f legacy-trunk
+31871 ef55f2232a10d731bdeae07efdc48c860ffabac0 legacy-trunk
+31872 90f7fbcb3706957ef7698d86480b4c023dab2f03 release22-maint
+31873 9188cb8e191b488ca530bdfc50e30e57f795409e legacy-trunk
+31874 9278b1c80a67f0cfcead295d4cb4957226538efc legacy-trunk
+31875 3e19e3b72d9b1b976dcc4716553002950cea18bf legacy-trunk
+31876 023d3b50e597974eb3d41c2a7bad3d4ce6332b7f legacy-trunk
+31877 bc370b8753f1260a0f4d669b16bb4df5c13bf164 release22-maint
+31878 360a57805676dd23ab9a640eaf84884df28d10f9 legacy-trunk
+31879 fd5ef7003469a63186458ca17e1aba2cac4beef6 legacy-trunk
+31880 92daf8b06abc1862f5efe68c51078e046f2e9a9b legacy-trunk
+31881 9ebc61b9e8bdba65a39152ec52555215031e77d2 legacy-trunk
+31882 67b22fa4a8fe5f464efbfcbbcd934befcda6fe04 legacy-trunk
+31883 4e221368af707b4b153abf7a86fe79fd040f05b0 legacy-trunk
+31884 850626d475749d46deeb74658ba2fc894c4d7f69 legacy-trunk
+31885 3358dfb1b18b422e0a9bec84016d70bdcc26622e legacy-trunk
+31886 1858bcb6170682c3b77e3b4e8b8712bb997a5286 legacy-trunk
+31887 cdd5d0cfa6dce358d926b9ee8361c0eb1be74ca7 legacy-trunk
+31888 62df17e501dc683a3624889f0e5d5280679e0070 release22-maint
+31889 02ce22830ab960979a02685d020c6e89febcb671 legacy-trunk
+31890 b91a81d680680e01fd614173ab155ff6c6792172 legacy-trunk
+31891 291b9d866ecf2a9c8d7f3efddb79859cb81d0bc2 release22-maint
+31892 eec3fd164a7db8dd4c7fe88c19e2240dfe7431d0 release22-maint
+31893 9f287e5eb03775249ee1d48a23997b4123dedd89 legacy-trunk
+31894 70003b0cb8379520d680241cfe80695149f3e62e legacy-trunk
+31895 b56d10ed33c5e85af2eedf3ca5a00ba1952b4169 legacy-trunk
+31896 90f17c374f592728e89e499a06647c324d420e9b legacy-trunk
+31897 3434d1b9206a5bd8de974c1a500ba7f958447d83 release22-maint
+31898 cc35ed2b26a8b2b50433544c30d326c52fe55231 legacy-trunk
+31899 5cf1f2f30dbd6cc4065b34d5e59c6fdc5bb6f7af legacy-trunk
+31900 797909492c3867204437d1be5ab1c9fcc4df638d legacy-trunk
+31901 26808ac7ee51ae992a9a0a7ef7bde740336f35d0 legacy-trunk
+31902 980d6e0112ce1e4643d4dd1ac2c97fcfc5b7f84e legacy-trunk
+31903 61b0ff98d95dd381e1cd73da9f30492bc4d6e687 legacy-trunk
+31904 143915776cbc2ff31762e3a57924a01325f5479e legacy-trunk
+31905 f5c97b65f9e8568579cb93259b74417ae178c45d legacy-trunk
+31906 1fc1a305e3999a4410830cd47e205a6cb491b34b legacy-trunk
+31907 b7340b09555d30be8bd34df5eeee820b506b9429 legacy-trunk
+31908 3096899f774feac9283aa9b658c3e397f1b111d4 legacy-trunk
+31909 e36ff492cbb1623c0dd7c16308bd2754df3a8ecb legacy-trunk
+31910 d57421623449b7ab092a9ef10bc24a9b327175f1 legacy-trunk
+31911 45054bf592e5e03ed61713f5bcd23364ca51ee5e legacy-trunk
+31912 dd83a9a53dbfb91f89539151e86e9bb2442418f1 legacy-trunk
+31913 d34bcb3cb216ea969693afb7c6e1c88b35dd9f3e legacy-trunk
+31914 eddf59f5cc5841477de6222e8e71b45d2da0e703 legacy-trunk
+31915 3ffbbb4f48da633f2ea43723ab25e133f5490821 legacy-trunk
+31916 8d7ffe4caad9acac841c58e8d2d31aadd549a2a0 legacy-trunk
+31917 34e22cdfaad246385380481768123a928381a9f1 legacy-trunk
+31918 c7ceb9560eb0e1baa197fec00cb22f8959a03826 legacy-trunk
+31919 72247ee2265374cc55b90c8825f9190cc6cbde66 legacy-trunk
+31920 6fddcdd11f49fadc0c78ae4902f58f1a80bcbb57 legacy-trunk
+31921 31a511f74b2816b10bcb81f93d3b28168b4e4ee3 legacy-trunk
+31922 bab2b2863a6e04c038f433dfb53051fb5cc7165f legacy-trunk
+31923 8e2473ad7c0cbab3f6cb00d9bf613ad7b14fd463 legacy-trunk
+31924 c97c104c2d2496c8b1d15d5c733f96bc8930c91b legacy-trunk
+31925 9aac870f03a29902c1f83bb15d87062dfa00a7ad legacy-trunk
+31926 de013276584aebee49c670c77bd4005e5f4ac653 legacy-trunk
+31927 ff78c3c3ebc466d0290f91aa9a95d05612b8b8b5 legacy-trunk
+31928 eb48278c2e1025cb086735b7b66cd402818970ad legacy-trunk
+31929 7f981dd7fa8d2dca45c9957383fdbd9c03333861 legacy-trunk
+31930 fbae645513d74734f1bbb57b828059d53b4a4e8b legacy-trunk
+31931 770892d78f2bb7986a1e27571434371aa3f056c7 legacy-trunk
+31933 45854fc707d649942b681020b1ad4fbd48b3cd14 release22-maint
+31934 30748c15a481af771631ffc3b45a0783159f0bf0 legacy-trunk
+31935 e333d765f41ee1f395aa39971bac4430d0ad8843 release22-maint
+31936 d877ffa4f7f22ac5fe6ee49a1455a342c6500729 legacy-trunk
+31937 ce4b928c8340a1228aa904796e7d5d55c58d7aee legacy-trunk
+31938 795d6144d2ee4cd843039f550e7b11ba7e30b695 legacy-trunk
+31939 7da2ee3a9c43b3b9f24382adcc22d34b9b4a595a legacy-trunk
+31940 ca43abb07638687930d7f0f81450eec72dc6e889 legacy-trunk
+31941 e0ebfa2fb9369dbc8c746421f1fab33436f2f9f2 release22-maint
+31942 f6bf781731d42564db8e6cd737ef83d9ea051c58 legacy-trunk
+31943 f99cf9bfbbaf5beeff3c629a71c389d4192e68a5 legacy-trunk
+31944 b872297406aa9c9fb86ec164c6cfd8e7b5737129 legacy-trunk
+31945 b23434211d01dd800f21fd9163eb9f6197ede9d7 legacy-trunk
+31946 94601d8fa51db68d8b42f9ab24845d57de0e77a0 legacy-trunk
+31947 983e9291a7b461e2ad66a40757610d8ccfccc4d7 legacy-trunk
+31948 f81239c12c60f80622319e6ae5858e6b16ec5ee4 legacy-trunk
+31949 4ede57a42c620b2d1e00e54bf6329d3519c73255 legacy-trunk
+31950 33319458fe995bedbe5f286e79392c9066872d69 legacy-trunk
+31951 07617d0904a63f3617eb19ab4ed4a5bebff87b69 legacy-trunk
+31952 5ee29f1364f3357815f28c24ba1d689e57ac0792 legacy-trunk
+31953 16aa72a8c281ef20a51db7a8cb3f04d28c317d61 legacy-trunk
+31954 bc9076b0169498aa53b374476f08554c740fceff release22-maint
+31955 1e0e679471758b59f0657e4f65f4acc5fc27f98c release22-maint
+31956 d56282c28a1efcdf5eccd011934540a102d44ddc legacy-trunk
+31957 4f038d3a8878cbf7495b724a51deabb257405226 legacy-trunk
+31958 a2110cb165f111bffe945b44c3172f517007c8f0 legacy-trunk
+31959 664212a6e283e2a2bb8134a125d5bc7b9cf38d53 legacy-trunk
+31960 ee94a98cf396c0445a38ba976f6aae7209a4c5fd legacy-trunk
+31961 c6c2f26df65b04ecddf71722fe7f58e56cfe6215 legacy-trunk
+31962 5f5364ac4adbc47c0dc81494fd2fa6bdfc55547d legacy-trunk
+31963 f00cd693d4e02d327a16a47506e53ccbb5f42b67 ast-branch
+31964 e53043bdb8f23ad4d918d8ad338eaae0a126b998 ast-branch
+31965 cb8d427afd211572cd6c817cfc4ad05fdc236972 ast-branch
+31966 fa35c8b45b2456d532a4f00b196bcc4f0648d80c ast-branch
+31967 d1d60c2e0ae993a6c18a09e614d37932c7a2971a ast-branch
+31968 305c17511a869c96e723b094816c8d639e5d57d0 ast-branch
+31969 55d0e998bc46c4750ebe68b887e84bf4d28b3c2b ast-branch
+31970 7365f130f1583da6fc4b7980172cd82d8651377a ast-branch
+31971 9073f8ff72562ac7971a831e988fd4ce024c63c7 ast-branch
+31972 63ed85290413360988980ef336f7bb04ee382341 legacy-trunk
+31973 5ef6132f3cabc9dde1a80c205f4471f4b40ba51c cache-attr-branch
+31975 ec803cc5718517e26598e53ae0f1a7a8e7de9437 ast-branch
+31976 5b152aac813d7db0be0efa5f92cd540a50f6aed1 ast-branch
+31977 8fffa6d1544a8435e400a18cb3519e92112c87dc ast-branch
+31978 dcdc451740fab4b9542299d1b29fa7919efe2803 legacy-trunk
+31979 f362c9aedf134a5aa45699628258d9d35515a050 ast-branch
+31980 7367a384a745558a7070026169097a0e8fa62ead ast-branch
+31981 11d827d9390429b8b166f4b79e42dca0654dd4e9 ast-branch
+31982 633a4bbd797e17ee89e641cfba8d5026cf95b7a3 ast-branch
+31983 756f987c359013b9661c37b30969135d7d5bdf54 ast-branch
+31984 350ea26e7fd95e9e813a2b49e6d6a79642673421 ast-branch
+31985 230ccb9e5000ea32a88f4c18236b2ba28a1b4deb ast-branch
+31986 07f3fa639d8ec6d5e64e3d91e84fc6527d981b7e ast-branch
+31987 b09db0b96a76bc28be65d0ecd8c45f72b74f877d legacy-trunk
+31988 2da14fc9e72bcac8b87d6ced6ea960468e431679 ast-branch
+31989 c25bb913a2363bf6972e27eead3cc592211ad1d2 ast-branch
+31990 8e67bef429a408dd089ab943be00becf208195b1 ast-branch
+31991 25a3cc376572a6790bfe3e0ed31f2295f08773ed ast-branch
+31992 909fbe243f902667c9430baf5138d866d425ff06 ast-branch
+31993 6ea20b86ac8dcf648b7d9c42cdb3ff8a39612910 ast-branch
+31994 f6a11920146eb583caff196b10cce53294482560 ast-branch
+31995 4bcda63e10541c5761ccfb49151e17f1aaf9a94d cache-attr-branch
+31996 f84e1f4d438eb08e757e0a3deeb17ca165db1df5 ast-branch
+31997 44962021959f28d1234663ff73a3e6b13f8b0054 ast-branch
+31998 63ac3d63b9fe7ada940cc4f6180d87c489aa1f56 ast-branch
+31999 13e567af94d8a9c233724cd12716bcd0cbd2d261 cache-attr-branch
+32000 bc7657ac46bbe7eaf8a8a42fe627f3d1b567d7dc ast-branch
+32001 41b1f22fcb01756e301c608571bcff03b7342bb3 ast-branch
+32002 1456621800d4596554a0c5270addb85000d082f9 ast-branch
+32003 8e8a9113fa2d85d2740a60ecd1f96d538e6f7dba ast-branch
+32004 364bfe79478f4cb56d76ec5e24bdd36a5a474a04 cache-attr-branch
+32005 af1764887aa23c59ce0f90de60dc108dc8b493c5 ast-branch
+32006 3efd834d0fc52bf1ae180c6a71054b25c77ccb0c cache-attr-branch
+32007 733729261c41a226605410ae23a15c7d9b790071 legacy-trunk
+32008 b0ccc5b5f7e2f2e84f7a4445afe49fbd60ed7cc8 cache-attr-branch
+32009 632a6cae0be6f164ce08db9fdb1f2c9e8231dafb legacy-trunk
+32010 ac721ed619144fbcbdcb9f1fdb51fafc860b6306 legacy-trunk
+32011 e06c540dc2e2f13aa75bb9e77202f17a72d70789 legacy-trunk
+32012 fea29292b931b6769777a7383fcc0ef0a130c420 legacy-trunk
+32013 f3d4cc2996d2c86183bf3055892737c7bfdf635d legacy-trunk
+32014 f529decd821feff48b4bd3727b18360547073cef legacy-trunk
+32015 ed3c7008f90e8c5e44f271b9ba620997f3d6f52e legacy-trunk
+32016 0cf4e32403807e0c9f06578605f511c40ad68dd0 legacy-trunk
+32017 5496b861c89ab9276731505eb68c1f3093a3282d legacy-trunk
+32018 70bd8d8c877bc3d30522420da897627f4374c37c legacy-trunk
+32019 0c802eea561578a928c65515121d4250098aa9d3 ast-branch
+32020 b6e62cbbdf3ded28a53f041a37db620076f59078 ast-branch
+32021 b451a9e6d94090faf4016569d54d9d5965e7303e ast-branch
+32022 33928a51f2f112bf38b3cfd2c24576356e11bbe8 ast-branch
+32023 1a2fd109f6b696194711c1e8429c52a1411fd251 legacy-trunk
+32024 b57546b33cb1367f054631a14d13a42f09879021 ast-branch
+32025 ec6221e9b79acc46f2a2fc3b37c9cadbfcfd2911 legacy-trunk
+32026 a9351270385aa04a1c0267a2ea308decb93e72b1 legacy-trunk
+32027 30d1c848d2b016858ff08d26e3a14c2d0c11ff04 legacy-trunk
+32028 d6553d0827ab968c7908d35b1dd31ebfee257a43 ast-branch
+32029 84b163523cd4da1cd8729a0a202453e90df0d980 ast-branch
+32030 152baf4e355551e71abc5492a580d4792800992d legacy-trunk
+32031 721e9e4eec1ef08e11270dde01ae12938a61f78f legacy-trunk
+32032 fa795f4e6dc774bd6349cee1bdffc527a823a6da ast-branch
+32033 e5c0089553811126cd524314f047ceefce301ae9 legacy-trunk
+32034 a8ec73d13d033c5afdaf1fdaee50927f58eba84f ast-branch
+32035 bb85be8376b8ebb907c963b934dd1289699f532e ast-branch
+32036 8ade90af614c38c2deed3809df3241effe7d05f3 legacy-trunk
+32037 2ed7c1c457b93fff7bb478ab6101bf0fa85496c4 legacy-trunk
+32038 6c64616d17edbc9bf6763ca21ca27ef490bcccfb legacy-trunk
+32039 9d3a25e99075b03314a52c997ffcc59d5cbde51f legacy-trunk
+32040 1b1d99dda2a1d641ad1fead52b83d0c611517d18 release22-maint
+32041 4459cdcbf538427ebba590e2a6bb72a59e997aef legacy-trunk
+32042 cb332d4491716e238706fb0b3c2fe715dd1d705e legacy-trunk
+32043 cd55887624b325f91e4d3ae562c4f943c618bc43 legacy-trunk
+32044 21143486ce40b37777684b910010f743012aa9c8 legacy-trunk
+32045 04182e5a60b1122c20763f43b65271e5d748971c legacy-trunk
+32046 2e20692dd2868136fe95314411651ca630acca38 legacy-trunk
+32047 ee1c709050b24946057b0befdd395a7d1ebc910e legacy-trunk
+32048 630409f41cc3f59afbea833be618b620581e2065 release22-maint
+32049 871da703e4c0a5c27c1a2dcf11b84f8b379b2606 legacy-trunk
+32050 5ddbc979c6559518308a635c3670551a8da694d9 ast-branch
+32051 d7001fadfefc3775eb425d84a00bdf09e195616b legacy-trunk
+32052 d93a845ce5c0903fdd1c1f2e19be102a31c4a9b3 legacy-trunk
+32053 934dbeb40b3171575f7da1d31adabe2cbc8b6f7a release22-maint
+32054 f2580c2e74dd79668e3a7b39ad61c1dd74d53907 legacy-trunk
+32055 0092b69f7f99aa4ada4ef010c8bf38e1363a113d legacy-trunk
+32056 161b8bd8a226fcf9da58e90a8f3ec55248797286 legacy-trunk
+32057 2405371be34c9668e520ef30da5fc0b828c1a7b7 legacy-trunk
+32058 3fc5764273d96f0aa38f441ea377575c26f573be legacy-trunk
+32059 500f545a24f07f7f172b64bb3d3f004d77aede82 legacy-trunk
+32060 f0ad8fa88d7ccef2d44c306b4f91a6340cc6e669 legacy-trunk
+32061 0a3ce306b11a5d4a9f81c7fcbd402a9d6baa41dc legacy-trunk
+32062 157c872e6892b9b3d6e565f0f9d62ce19604ca19 legacy-trunk
+32063 37eb8929f0cb4030f2a22c85e6ba5580695e5d13 legacy-trunk
+32064 56d9bbbae6f810ce011998092669b80c0d1c00a7 legacy-trunk
+32065 05443430d7ed3dd4d6fa6c231052060cc6c38714 release22-maint
+32066 df9b7cee1339516bb857fecbb069c9a94eb175d4 legacy-trunk
+32067 f3078654a5c02fdf89b5da61a98f9e8f403f3ca8 legacy-trunk
+32068 235d543e0b84971135f4e1394fc071ec26404235 release22-maint
+32069 7a3f72983a7ed577efc2c104874e9232eff76d69 legacy-trunk
+32070 804473cf71215440504f01d08cb0182345a14911 release22-maint
+32071 d8f98dc6e7e04a17eedc0bcd7e5e157fceb92f09 legacy-trunk
+32072 076c867b916e2306a43a2f34141884e25faef986 legacy-trunk
+32073 df65b0217dd7f08e681ed9f29367b7f004d90870 legacy-trunk
+32075 af05f88b964135965aef4c444ed9c0bbd3033a7d legacy-trunk
+32076 a8d6576b95afacb1d1532a6e41519e900cbb30db release22-maint
+32077 9c6209253615ff40bace439a478d46cdab8f71e9 ast-branch
+32078 5fbd8801fa2625eb2a89429297398a33d2b3cfb2 legacy-trunk
+32079 1592ea36a702327e5b6b6356d2526ba97a366171 legacy-trunk
+32080 ad42cbea2258a772294a5fb81cf9bee6a8b6b7c0 legacy-trunk
+32081 c7f10a900d6328883a92ae5ae89475f0c69e561c ast-branch
+32082 b87095fbb05168d1ce2e1706298ad56de0a5cfd2 legacy-trunk
+32083 fc841535180c984bcd86e51bd180c52de297f2a1 legacy-trunk
+32084 7140a6236c3a88c982a42b1ff5e1fe440d61dee0 legacy-trunk
+32085 751d7ce9b4b23a84c8d7c14bf4b8af961697c4aa legacy-trunk
+32086 b66a2e41da3ee9915ff5df645b4c738155ceb19e release22-maint
+32087 04c1ba51efdbcbbc99f532b288d49cf8e7bacf09 legacy-trunk
+32088 852aae84c981373e02ac4ef5d870babb8bcb77e6 legacy-trunk
+32089 0f558eede6c577a58cc139b5bcfd3e2fde14ffbc legacy-trunk
+32090 505e8c0fa92fe2ca2c2b764878b2582e304f4677 legacy-trunk
+32091 bbb748f6814d640a649df35441ae3abeb2315ebd legacy-trunk
+32092 f3add416628dc741436fa5cf47419ed80a85e07a release22-maint
+32093 b1fbb83e5139149e9b765952ac45955fe5d86744 release22-maint
+32094 8802de0da53391160fd3e35d7b9523742251912d legacy-trunk
+32095 e13a7e1fdb9e5b7c28c12cf27d2bbe939511962a legacy-trunk
+32096 86a4cea70973abeb4732863555c448e4f4460ed7 legacy-trunk
+32097 12dad2081e2e823fe921956445f81e09933e7be7 ast-branch
+32098 4aebacc7867bb1e0faacf22031c8e8308bbaed07 ast-branch
+32099 f1154473dac8a70df435fafeaf8707f97d43ed43 release22-maint
+32100 afd5c2e4b4af6dc1ece08205c4b631b27df80618 release22-maint
+32101 287daa6a7f4f220de8108f8f56074e2e3812d4a0 release22-maint
+32102 8efe9445495b0b76d406a5aa5cec945dcdf7b664 release22-maint
+32103 5550f5a9d70ca76202ed30772af0e3f5b059c187 legacy-trunk
+32104 a8e5ec070433f5aca2bbde7891f3345f355e175a legacy-trunk
+32105 36222d3823f129860341066564cff11d7d63f952 release22-maint
+32106 973f9d35cf1d0f1524d734eb5d79a273a5c202ed legacy-trunk
+32107 ab2a543e855bc988ebbb2c93b523b36369f90747 legacy-trunk
+32108 f38ca9e1b683bf7a8b6b84cb5dc5992487617c29 ast-branch
+32109 0c4335f10c67a2d3a7839f7b4b02b227a2ebe6ff ast-branch
+32110 4308e8a6c480de00be2f60895d833028db88f60a ast-branch
+32111 dc890a4c0528055ed31fb023b3c3d5050dcca8e0 legacy-trunk
+32112 b85a205631a45c038a5fda332f8ebd9e7a5cc902 legacy-trunk
+32113 f311b5d21ef564b10db85a3db68d87e0cd570ab1 legacy-trunk
+32114 4f8f17af3487bab14b00b46b9787bbac3c4f3d52 ast-branch
+32115 738e378fa0cc1718c10faf1c68dc48a826c271f3 legacy-trunk
+32116 32bea41fef68d048a26ccbaca59496c3ab5ab84c legacy-trunk
+32117 d7d7af5f3231f012d58f53d470c4a6bad6be8bcc legacy-trunk
+32118 492028e4726f1575503ae5a3c58e79c18a45cbaa ast-branch
+32119 81bcc0f57d570fbdf5f0cdb2360271995933892b ast-branch
+32120 ceb7bb7913533663005fe3d6edb798c4bddb7fd3 ast-branch
+32121 ed21d8b37e33d55f5f8ea39052343ae16f653435 legacy-trunk
+32122 3d8c1214a1c79ba78140b3f74ad428a25e66dd52 ast-branch
+32123 ed73d658725aa78da6fcedf3d00a7f9610bdc96b ast-branch
+32124 40d9659b56c946c57151ed5b20fa2ceb0b44325a legacy-trunk
+32125 3e399a8618db35b47bd51b82abc27d12448cd20d legacy-trunk
+32126 42dfa0891b3326611708d2735956cae90e385668 release22-maint
+32127 cba0aeee0d651531b9aa555f4c8b03a093845356 legacy-trunk
+32128 00a56fbea69fb0a70ab70e614d440483862221c4 release22-maint
+32129 0fcf9ae25cfebe73c10b81210e8928e9c314c5de release22-maint
+32130 4b6e20f0ba4cda539c63c90018efff772ba6d88c release22-maint
+32131 cb5db5561cdca9d34d2b06646275b06a3cd8e8e4 legacy-trunk
+32132 849dfea182ca377339ddbec4d9b1446b46035e50 legacy-trunk
+32133 117ace8521a1d2967ad1e36c21ac989aa6d71158 legacy-trunk
+32134 a0503bdb0c242cd88df3f26e67b03600eed1f763 legacy-trunk
+32135 8233a0294c41e3de005744c0dda16108f9c10682 legacy-trunk
+32136 375fdb82a3cae328a582727f483defbd32a7be51 legacy-trunk
+32137 0de0ded19968ec4722187f6d972ccac0665a2431 legacy-trunk
+32138 acf3596fcc28d504ffb8157a17ec048366041192 legacy-trunk
+32139 174ce4cdec4726d91184c7c7fd89c4300e436843 legacy-trunk
+32140 90c77b8af1a4974460f26fb2b37d75dccd54abb2 legacy-trunk
+32141 9400504cb0b261e033eddf288c26192cfdd51c31 legacy-trunk
+32142 4c596dd60c22d30d4debf8674e144a934b4da388 legacy-trunk
+32143 78f846fb570a0632a76e7be28d5029bcfb39843e legacy-trunk
+32144 368bebe327433901c667efef1b58559371c67720 legacy-trunk
+32145 25e7467871c5872b9b71cf847c9c352b5655a3d8 legacy-trunk
+32146 2a3095a415b10ba103573481a71a4b04372632ff legacy-trunk
+32147 6653a56002ef9d8316db8a3fa4d60490149bd0a3 legacy-trunk
+32148 964bd97ac1f5bd3d9537eb04396041892423d7d6 legacy-trunk
+32149 487df294d32810c8eaf150f2f5f77bfedd22066c legacy-trunk
+32150 c01fdc3a918042d941ed5ec70d6eb47fb87da461 legacy-trunk
+32151 4ff611b16484933f0234fd08c61f9a27c149d70d legacy-trunk
+32152 92d01f102ca0993eb144b5b7c3677014c8d3c13c release22-maint
+32153 b5b3e6f3f317ed8d4396a77a4518ad1c1f2ce3ef legacy-trunk
+32154 5b5462ae314ddd3573e274b2cdeea0098306e6e4 legacy-trunk
+32155 5fa8344d6e6f01d52ac09462ff9a96e832274f36 release22-maint
+32156 8bf084c4ad9f74b8a3510422ef53f7bdc6f2cfa5 release22-maint
+32157 ba716224974e9769f87c296b22303b2044709eff release22-maint
+32158 1639f635d983b9fc470a77349ef8949e0f762309 legacy-trunk
+32159 878366b0e97ac715a2ac3508b5e8275d678c2b2e legacy-trunk
+32160 f213ee6ce55ee8fa3c14b6590efe86e58228f92e legacy-trunk
+32161 b9064ea0593ea1d73472bf66fdac109dd849a0f2 legacy-trunk
+32162 ae0aeb0d631bc5c5ca3f0fe35213c529b367c508 legacy-trunk
+32163 469fb6ce969351fb3076ff83a8590bf1b8973923 release22-maint
+32164 c7bb254ab890e1b9524ce4b75c98bfc8a55c4d57 legacy-trunk
+32165 71103df9d64b07dc3c1075c199b5966a417fbbb3 legacy-trunk
+32166 bbed7e12b8422c091eee2174957a36f33e7d0a1d legacy-trunk
+32167 8984df2dc27b270d8c290331573085e29adfca82 legacy-trunk
+32168 b61a9e21a66dca59fe18acdfe8892f06ecc0d0d5 legacy-trunk
+32169 34483769078b33370adfdf7820db73fe17642be6 legacy-trunk
+32170 e930bebec8c0f5dd3c40f90cf3b35c961b407913 legacy-trunk
+32171 ee8853cc8ca1f69a897386a9cfb61c18ef46a77c legacy-trunk
+32172 017d2e3ea2ae4ba6dd4275f525526ebe9125a627 legacy-trunk
+32173 fd434beb5f56079b349d322f7c90763f3f02c6e4 legacy-trunk
+32174 6aa1c0826a39be68344299f1dd07fcfe6252540f legacy-trunk
+32175 d10dbb94c9ee1bff9c14e6c5f0878157312f6594 legacy-trunk
+32176 2d4c1e4e5b36b54499216656b65f73302ba92425 release22-maint
+32177 db4799ca2021bcf55d927afe34823423d47b8dd6 legacy-trunk
+32178 9acdc6c4416ac522882578ef84f23b10ede565a0 legacy-trunk
+32179 b37b2982086bc333118962213aa166138dd0b043 legacy-trunk
+32180 62e883e2d51711f008f13983e0e149bc928f9cff legacy-trunk
+32181 e6bf08dadd5c217605ee9dfcb1413fe11b09fe3f release22-maint
+32182 b4487a3b5f1a1d1bf34420f9add34acf5ef97758 release22-maint
+32183 78395e5b4782cc3492884fc3e9c55d09775df1b3 legacy-trunk
+32184 ba2d8921a8da019b8f20322722fb6ef46f5ca831 legacy-trunk
+32185 84acba22795424cfde5c14383d32093584bee83e legacy-trunk
+32186 aff080f2efb4868bf8aa6763f6497bdf3d32f6fa legacy-trunk
+32187 e92c25d428b87f022bddc1ba0d31788ed64d54e2 legacy-trunk
+32188 21f7cff1790fdc8d59e51c7c3b8a79e7e1ab0a60 legacy-trunk
+32189 cd501121715b068a358c2c052f117c9aa9064f53 legacy-trunk
+32190 7a6281493d2c671047c1dfd55850b4bc70940c10 legacy-trunk
+32191 f21cd079d10835f414143cde41f895a1050adb8b legacy-trunk
+32192 6e7efd6c2510a2b2d1cd1b5fb7b0ea3065c1c88e legacy-trunk
+32193 9ddc498b7013b86e71b88ab600392fb9518803d5 legacy-trunk
+32194 bc8923fdd83b588fbacdf54d2a83c92b9ce7b5b1 legacy-trunk
+32195 d08d7b4be532013212ffbb00a5e799dc0bddf55a legacy-trunk
+32196 75113759252c788c1627729f7356c58a3e2478f5 legacy-trunk
+32197 bfc7a9fa34d6db234e891823109cb41705dd1199 legacy-trunk
+32198 5fbdcaef9ddaa2325a7454e59346efb2c2122249 legacy-trunk
+32199 faeb708bacc421667f60a3a4f6705cb911207272 release22-maint
+32200 da74bdd93441bd40246b9cd96164bd9414b6ea46 legacy-trunk
+32201 be2ecafb15ad0ea026fa96bc21acf5c1d533d619 legacy-trunk
+32202 215f1f4851a4639aecf642197e73dfceaf77e242 legacy-trunk
+32203 1bd50c28203fcf27e30dbc5d3e03a8539b52b477 legacy-trunk
+32204 f301eaedde858bda7d002c88fe569cfdeb2d8130 legacy-trunk
+32205 8b49445c0a0e0390bf05bb13699414d9c1ad6069 legacy-trunk
+32206 981032e647362f081a891d911ca47486bc193cba legacy-trunk
+32207 a5c5da546c2928c7df15868239ca0d1ed12c6711 legacy-trunk
+32208 c2ad62f4ea9b30b5ae03e7a31c5a08c8b0c0bca2 release22-maint
+32209 03bb0c408d57318ca5be8e9f952fc915e31a4272 legacy-trunk
+32210 a0c0020505265a8e3897dd6244c62d9db5f1a1a9 legacy-trunk
+32211 c36bd1c836b8c80cdf6d87999ab2004bbf664ce6 legacy-trunk
+32212 0d268c6ef00acde6a0180f0d8fe6b3241333b5ec legacy-trunk
+32213 94a9865aa1c64419c3bb49c83bd0a153bec85e05 legacy-trunk
+32214 8c93075b9cb5510ba93a918323e05cf41d8383aa legacy-trunk
+32215 02c87f348edb22f8e5c123f48e2f9cb81b33e81a legacy-trunk
+32216 a57ee7b2a879de02bb557ed8dd5ca2a3431bc85c legacy-trunk
+32217 95b6dd04da8fdc1d8dad8657636c6a7bd2c210bb legacy-trunk
+32218 883a694795f5703cb41ecfb5ca92f600bbedc278 legacy-trunk
+32219 ef05f981bc4b8dab1bbd89baa51cf4526ea88c5d legacy-trunk
+32220 6f13adde1b51bb492946aae0da26cc234f3370a7 legacy-trunk
+32221 de50934e1145bf6d90b65959f6ce186f2e05290d legacy-trunk
+32222 22afde26b3d166ac0f26a6a459fffc6f2f3e2fc1 legacy-trunk
+32223 9fede7003c65f6f6e1b195785869472eeb987409 legacy-trunk
+32224 d2d232e2427bf74eeffdc54b2c7f1cec93bae93a legacy-trunk
+32225 3cf26b9f96f7e646408720b3add5c0dd33aad6cc legacy-trunk
+32226 11660f4361f8a3689759acaa5601cff8cc0436f9 legacy-trunk
+32227 1aead0c845077e080754722af290287cd7223fd3 legacy-trunk
+32228 58db5fbd9c282a4975d745aea0f706e78b6690c7 legacy-trunk
+32229 20ee68cb0bc47c673d0e992f247b4578820746a0 legacy-trunk
+32230 7fe33c1541dffaf81a93f9f26d10b71ea2fa022f legacy-trunk
+32231 eee4969adbae0d1642fa1a2c446c5073ed6b76fd legacy-trunk
+32232 9441694a70c7ed39836607642df433ca2dae474f legacy-trunk
+32233 436d812f2b94b7dab7aad2c9705317d1eabefce3 legacy-trunk
+32234 f3b24a2f6f4da86a9270e9aa4b514a3561022f53 legacy-trunk
+32235 8322077d234cfab80ae986c366103516397c348e legacy-trunk
+32236 6952373e8fe5c872e63791480262298ec238b5fa legacy-trunk
+32237 67d36f4dfea124ae85c0c10d28b833833ab72b2d legacy-trunk
+32238 c71b9ba1f04c14829fa9654d9dd53d0bb379d1eb legacy-trunk
+32239 0792caa6371c9d1d25d04bb0c7575816243ccfee legacy-trunk
+32240 b1671550c7e1dc7828172bb0b462a691c7678eb1 legacy-trunk
+32241 4c6585253e6f1324d213af4b9fa46d1f849e14c0 legacy-trunk
+32242 b4b8fe2a632c3bcb452bc040da8d238ca8738a9e legacy-trunk
+32243 4f0b7acffc7d4c4c7eb42d3c0b08cca29f57b59a legacy-trunk
+32244 d5357aade4b7306470caf84fa0f1eb292f0dd2ac legacy-trunk
+32245 9fdfa736578d736d708a474e53c65dc8f07ae594 legacy-trunk
+32246 eb55188f163acee7a3c9ae7912e9330e2642dd37 legacy-trunk
+32247 ddd906effd9c3b65d0e13c9d855fc5363c13ce2b legacy-trunk
+32248 824dc28f922d299c176bb736927264323fd75ee8 legacy-trunk
+32249 6c00046909418b721bcad411f98b91e7a4e2c610 legacy-trunk
+32250 81e5bf623ecf758bc25c62cbb1ebd4ec120ded92 legacy-trunk
+32251 e80f18a49cc9ac8e311f41d8d6071314fb04799e legacy-trunk
+32252 07d8e0eab3af49d58e3202b9e82694e19985be0c legacy-trunk
+32253 2cfd916dd31249df2d4558ae3b9bd3e93bafcd13 legacy-trunk
+32254 3c39195dab9a40ef31908f64d0fe84dde38aa3b0 legacy-trunk
+32255 3d93c3039c871cce91978ffc7b48e6731dadd77b legacy-trunk
+32256 8ab752db4775d553f731afd3d031209ddb7f8051 legacy-trunk
+32257 fa82f86eaa09940a66ce3934b85675564b3f5797 legacy-trunk
+32258 3392f38bd114b8e159a21e202df00c4f4cec0eb4 legacy-trunk
+32259 947c2937c09e2213e155b035fdb943baf09a1d2c legacy-trunk
+32260 a26b6b275fb72d9897ce1c9979b210e6f5bf185e legacy-trunk
+32261 36e9ba40549259f3ee1e74e2f4583d868bcfde53 legacy-trunk
+32262 c629ed8a9dbb3a84cc35fe9c3dab27a4ff5c9ee2 release22-maint
+32263 11f7f118072b64ff01ff2362429169edc45aeea1 legacy-trunk
+32264 acfa0ff8c5a4016b59ef0561d2b9a4c161e72f41 legacy-trunk
+32265 9be4103807f5c745ff9b25064fc6f2f768c4d1b9 legacy-trunk
+32266 be0d4ec6bf5a9b80e91ca53fb3d273afc66bc08f legacy-trunk
+32267 4824aab12549bb0c37ca802a33e1c70017801fe6 legacy-trunk
+32268 a8e640b477f66d5b61522bd79c9c580720f4a404 legacy-trunk
+32269 cfece1822e942371f7f99b4b23d2f6665ed1238a legacy-trunk
+32270 ca2482012b3c600f865d3af9f89418edeb8f2fff legacy-trunk
+32271 8e541b078edb509b6cdef0c207610dc4983c29bd legacy-trunk
+32272 b9745cd791bfdda78006f0bd7b23e3c864833790 legacy-trunk
+32273 193b8aec00ce1be2f03aa9699a5d6f6516cf7930 legacy-trunk
+32274 9d4e138494fb312ce28a8524e91b05d264f8d387 legacy-trunk
+32275 0e8416be208e0eb604cfffe7cb570f636b3c03d1 legacy-trunk
+32276 04b1728432929812148cb1c68d85de876e59081f legacy-trunk
+32277 d8a8f744a3e508b5e130737626fc4564d9565ab2 legacy-trunk
+32278 7fda09f751ad5b1c9b478f93d70b3676771d683d legacy-trunk
+32279 28a2975514cd61d43600c853efc8d792f6da3bc5 legacy-trunk
+32280 56006d97bcef0be50c7bbf8a2bb65d36908d0ea4 legacy-trunk
+32281 1e9004553e1d905b4109cd736699fdbb8d5bd518 legacy-trunk
+32282 16f47bd431c48792cece754b0c0d4da0934cf1da legacy-trunk
+32283 2fae5f7631ef4aae7a0c1bdab6c4537252bd6d91 getargs_mask_mods
+32284 4d2259cb77a0e1cd7d854dd0d50d582ee73f2b78 legacy-trunk
+32285 7fa14f20aea42232b64a6ae06424170512c7a650 legacy-trunk
+32286 8836529e9e6670a55f745717ec29a5655a43e612 legacy-trunk
+32287 ee165fe1b42f634c6c960b1f26e5621a9f526c50 legacy-trunk
+32288 5f1ef1882b25188ee06e2a84becc87ad889dcb42 legacy-trunk
+32289 7e665c160583fb66378d3ec5f9f844063772ed9f legacy-trunk
+32290 ee6df2c668eaccdd9c03a2d24677ae70142e067f legacy-trunk
+32291 12d4409e59e303a3978f5d0b433a7e8d67567946 release22-maint
+32292 e33fedb581f4b07a9f8457e80188989bc2688e1c legacy-trunk
+32293 239429dc029fc8d557ac680cc82423b5c2ccd1ec legacy-trunk
+32294 a938b13e029112382af405f8da2b21fc207e4bd5 legacy-trunk
+32295 5bfdbc0fd1722a8433c3938dffd437504b29e7c5 legacy-trunk
+32296 046bc9d7fb0e433c45f17772674716ffe22a141f legacy-trunk
+32297 0d8d4c8dc68bb889be4d3a5cef6f176ef2539ba5 legacy-trunk
+32298 c555cd02b0f963ce041e6dcc2fee6454565b7f13 legacy-trunk
+32299 1925413431a6ec28fc86a9f6799cd682ac32e1fa getargs_mask_mods
+32300 fda2f7d783c24af3aac3539150852cb7cdb1c702 getargs_mask_mods
+32301 d41d8de9768f37f171e73a07ae57b465b17db9ed legacy-trunk
+32302 2a23fc83720fa1264c3c5da56a3263303257e853 legacy-trunk
+32303 c1ba50790c838485bbdbd3e85fb1f395dc5a0e13 legacy-trunk
+32304 9eb6964b4b6c988d86ece4ad1377e65c28304bbb release22-maint
+32305 1556a38d52781541d99a4070b42fb943c3c891ef legacy-trunk
+32306 5ff1f2f9fc3493f3baca2357d5467a9fb52e9ded legacy-trunk
+32307 1815166e8097875e26c2643ca7e93a462d40eb13 legacy-trunk
+32308 31cb8e0260db5102b0ab506c4aee39c9d12428ae legacy-trunk
+32309 ab0c067fe286fbd303acec1688374274b5896627 legacy-trunk
+32310 276352bfcb42b41aae96614fab3de32161ce3f82 legacy-trunk
+32311 ca64c1be230bace4a3be2b103c930408b212187c legacy-trunk
+32312 cf45ad3ca4b75ddcdbc512d72b93b3fc0d5414b0 legacy-trunk
+32313 462a4c3118bbc06829caf1d0c28afcf4a36714dd legacy-trunk
+32314 8bd34dd58a92aa33473f9f97eb274cb7cb166b37 legacy-trunk
+32315 c5bd8a8452239f36be2318a6344c56d7859977a2 legacy-trunk
+32316 70d6f8b0fc6945e71f4438ce07b4a91ca130c318 legacy-trunk
+32317 40d287c3d90620a77653015889ded5bbb8464d6a legacy-trunk
+32318 d0ae620afbd4d41b8a65f125052ac90e24e7d6f5 release22-maint
+32319 ed5ecd63c1cf9b7f4f299c812b868de85a0e730d legacy-trunk
+32320 9642fb4cda2fe4af56e0b8c98c8df5c553226223 release22-maint
+32321 c9925fa29ea37e5588486d9752659dbdccfa3d46 legacy-trunk
+32322 06d137a427e9611d3fb260a213df418fcae9c77e legacy-trunk
+32323 7922d5f438543a5765de64f80229ce3171d20347 legacy-trunk
+32324 a4154dd5939aa6bb3a1128939e9074d6b1383d15 legacy-trunk
+32325 d6afe196ef82083ff222620c9aa595efcc539fb3 legacy-trunk
+32326 658b10c5ba2a3d6be167f2f4d7a11e3a7b61660d legacy-trunk
+32327 018170a4a2d7ac250aedf077fb968e6ac968c87e legacy-trunk
+32328 aef01a076ef967ae793c4d63c72440b5132dc13d legacy-trunk
+32329 97890134c9c44393bb36a3827c07b556ab205396 legacy-trunk
+32330 41f458b8da20a334eec67818edd9868279a5e446 legacy-trunk
+32331 42de50e192df5b9e480633a23c8698fffcc009f5 legacy-trunk
+32332 d6e13d1210c6b5850fa15181d40db9b80895f069 legacy-trunk
+32333 2ce39a7be79d9a5b17e8dcd7d08712bf74aa82b5 legacy-trunk
+32334 fa7874ec6a71ee8c99c322c2b84da110c2a506c0 legacy-trunk
+32335 be14970a995522fedaa89fbc475fb147825d0b5d legacy-trunk
+32336 52930be9dfea5a55b4cd821b04ae8a63f786dddd legacy-trunk
+32337 de76905275843e79a64ba51572e95ba70a8ca377 legacy-trunk
+32338 edcfdb2a852e9af3ed9f7ae955224758a4e900b4 legacy-trunk
+32339 29f3b2375049ef06827e53b1c30d577fe6131539 legacy-trunk
+32340 149bd0ef94fb84de9bca2a0005db6c74a7e2d6ab legacy-trunk
+32341 820d9570edebc3c2bd8ffd05d9414d80e4a91fe1 legacy-trunk
+32342 d3127b671d36c38d8d7bcd4bd58ced54f4eec771 legacy-trunk
+32343 d08d15a702950b57ad2b5dcc7fd2ac9225f630a1 legacy-trunk
+32344 ec2a0f15c14cd19d44943ccffa9b82a79fdc671a legacy-trunk
+32345 1d8e84d96ddec6df1706d88a3b587c8bd870ea8d legacy-trunk
+32346 ab4fbf8ebab3b0b5806a6b41ddcc2892a94bfcdf legacy-trunk
+32347 13d0a3c4e46575bc72def38c449745c854167f7d legacy-trunk
+32348 16ef5b9bc789cb9a38540d5121ec2824d40d4736 legacy-trunk
+32349 5e6ffa65546234cb28a15a64dcd8310b3336e443 legacy-trunk
+32350 03af46d1ac2840567551dcd8a122dc30b3345901 legacy-trunk
+32351 4649f318fcb02dafbee2f6199473f081a6954fca legacy-trunk
+32352 8160bc78c93ab1a622eb875f9a204734d210a5df legacy-trunk
+32353 89205f5bb440bfcab5df0f9bc2a41805c9006c00 legacy-trunk
+32354 9ea0ccddbead3694ff3208d8b721525fdda1c2ed legacy-trunk
+32355 de6d1e7e98257242dce44212da57ecad641b44fe legacy-trunk
+32356 ac8dbbe62432b94f3d6006e98b98c1a2eca0950b legacy-trunk
+32357 051a4f12cc4625717853d835c310fc5149b36ba3 legacy-trunk
+32358 f968e93e3ce018717698ad14c426cd135d0683ac legacy-trunk
+32359 31cbd46f0c7d68db0ec39704c833dfb8cdbd1f54 legacy-trunk
+32360 ac58608cd23ce86e5bbc5325d635199632e3ac19 legacy-trunk
+32361 86f4933fa4295e1edd3b00f605b31cbac3345196 legacy-trunk
+32362 ba909236eb13b108e0522f66e808ac2e44bf88fb legacy-trunk
+32363 43d32f4f8913847489f3600efcfcde25e1aabd4b legacy-trunk
+32364 5c886e03b43e41cb71f64f2d6cb060bcef41ffca legacy-trunk
+32365 7bba3e2be54e7eaa5002f6903bf07046026bbc7a legacy-trunk
+32366 aa634adb41a900ad8c97601e420cf495adb490ef legacy-trunk
+32367 d792544ab111f442c96ed4b0a177bcc49552b370 legacy-trunk
+32368 52f3d90c17e83de53454d88152669baa77bc6b64 legacy-trunk
+32369 cec9d13c43ff7db82ab80d630acb36c584d29fdd legacy-trunk
+32370 d3297e298211b8c7ba516f69333c00d29c59d3b6 legacy-trunk
+32371 66cceb7562b56a934ff60ea1ef312f3d4c41b577 legacy-trunk
+32372 bd678e65f784320f43bc3dc2be8898c6f4ad297e legacy-trunk
+32373 6e2e5985375c6247ec6be05da40044f937d3ccc9 legacy-trunk
+32374 014cfaa7a784fba0a262fd343b4213a9ae0e0c8c legacy-trunk
+32375 1f96049a79d4cf9f2929903037d8b171e8449e16 legacy-trunk
+32376 c0a26c5a7936470e19c2b75437323584938ed500 legacy-trunk
+32377 563baa3e428f69465bc4d1899143308a3d23b7e9 release22-maint
+32378 b49ff04c18de7ed0e4d7ef59dd3b297db441e7f3 legacy-trunk
+32379 89dc32674554eed00563613344a27edec2d64abb legacy-trunk
+32380 756512fbb5278d251d45b2997242f8dd2c0b7b33 legacy-trunk
+32381 a1d7ccd95a5e83d6148980caa8cb8a34d03d86b8 release22-maint
+32382 0ad7453a9f827750306efe73bd20a6818eaf4239 legacy-trunk
+32383 085f68009cad818ceb4d331370e25978d12ed1ab legacy-trunk
+32384 9c7ad1e455960cce746237abc3affabfe7700981 release22-maint
+32385 dd022d423b8a0886def61346718a7039efdd26cd legacy-trunk
+32386 0717242295b11cb37faa08ab1d2bca767cf606b9 legacy-trunk
+32387 99e82dbaf0ccd82987764ad7adcbc905413116c8 legacy-trunk
+32388 7f23667d3cfc4addb421737220c85d7180bdec82 release22-maint
+32389 3df0cf16defc228f7c382decbb2723bc80d2a0f1 legacy-trunk
+32390 22d177682ae14ff17fa16f6f6f12657fbf2e2340 legacy-trunk
+32391 171dbddf0a021670b538cf53455924652d2653ba legacy-trunk
+32392 6503ad8dca8817dc104ace8bc5891707b186a90c legacy-trunk
+32393 6348b85bcb9de80b5886e1b47e063ea45f64d212 legacy-trunk
+32394 9c0ad694e3e20a3f26fef0a3c8b422138070895d legacy-trunk
+32395 2c7447efc2a8d0e16e0fd46e38bdd54edd4ff9d9 legacy-trunk
+32396 75382d102749cce940dd30b34170335e43589c1a legacy-trunk
+32397 60eacbea71992c1671e61391a86ce8d04848eaf2 legacy-trunk
+32398 9b79605171ebd4f5568829174a93a8af69bf2f3f release22-maint
+32399 9466b6e248332e5a26ba998ad0da05ac8f86b54c legacy-trunk
+32400 00b89472620d7e4ba884ea95c23d412c6b307e4d legacy-trunk
+32401 29b6a48f4c450cffa774807bba0eff0fd051258e legacy-trunk
+32402 0ea5991f6edbc4c273ce58d65137af4177de6280 legacy-trunk
+32403 e06f2bf56b4068374c92fb32786d265c3f568f8f legacy-trunk
+32404 c9bee11eaa8b9e5c9c2bcb3d0d215ad39dafa880 legacy-trunk
+32405 bc4231eb2758416f653140ed9dd6f0af065968d6 legacy-trunk
+32406 211c02fb6570afe1c2ed0409a99ab11828d17995 legacy-trunk
+32407 3ebb4bcebdd7ed647061962d2906f58c09308783 legacy-trunk
+32408 0d53029b79497a61d871dbaa06211322301f88b6 release22-maint
+32409 708aea82ade870ab2b3f22fea7f034f0aac4b560 legacy-trunk
+32410 51ed9f5e36a18c772463d50ea36bc37d0cb5bf33 legacy-trunk
+32411 787d665e1cdc7303cba9e3e292d7865e649d1182 legacy-trunk
+32412 395f2b99c752f906a7c352f284b163e09e7ea51f legacy-trunk
+32413 2c5bf097daf855a0daee9e1ca7da08c6121283ae legacy-trunk
+32414 749819f8b2adca73f5decebedf2a1c52dedb130f legacy-trunk
+32415 63eb0c987de7db4029121bc97b0b1ae35fbd51f9 legacy-trunk
+32416 8a6e4c92bd7f2bd127e23141928845fe761edb2b legacy-trunk
+32417 6816719f439c59fd726e59211e9405e112df9730 legacy-trunk
+32418 558689b6d7f0eb52ef1f61abb536ad088600f585 legacy-trunk
+32419 015d891f3873dc0348472d9b0100ceba0935dc98 legacy-trunk
+32420 24d2a05f41cca1802a7af8acabf802915cb6e656 legacy-trunk
+32421 64d7b876722fd8794616f107afc9da575040d22a legacy-trunk
+32422 8094c0db95f8b6a94868360a2cf2599fedf4b211 legacy-trunk
+32423 803bca224c8fa7d21720802273840c151dcbd7f6 legacy-trunk
+32425 a76a3683012bc37c40002d150b280c12ae208037 ast-branch
+32426 05e57388cb8fdcee8c8a99743384deb3321c656d legacy-trunk
+32427 725b281ccead38bf712163b62d1d4f25799e62b2 legacy-trunk
+32428 f874a4d29ca4178eb512930ae8fe8ac1049d52af legacy-trunk
+32429 21633e9df8cc46c86451218422d84881f34b92b8 legacy-trunk
+32430 112540160b652e6ac22b7e9dc10a12b736887b8a legacy-trunk
+32431 46d26afa8b9563fd125adb3722079d828de2f159 legacy-trunk
+32432 72db7575f97000c97b269a1ac6df709fedee0b9c legacy-trunk
+32433 a9b56c78e0d64ecde434c9ac33838582ccac9b61 legacy-trunk
+32434 25c8cee4457e6ad0aff21287e0007132ea0e12e5 legacy-trunk
+32435 c34cf9ce952f9fa282ba6618a6fffb62286f6aef legacy-trunk
+32436 0c950e3323ee4ee637062b9eaafa50ec3cfa06c1 legacy-trunk
+32437 ca4bdaf5c7575859eae3eb499c5b9ee6834d6088 legacy-trunk
+32438 102f9e358f52138ecf4c4140674758cdf17037e6 legacy-trunk
+32439 c0a1efe1028473ccbf1fd25d8c8233f39510b3eb legacy-trunk
+32440 2ba20fc9f4953c08ba95ab4776b8ffd80970ed68 legacy-trunk
+32441 28a09767a24ffa791c6713e4235ee25bffaea93a legacy-trunk
+32442 a5e1b1662ec01191ed397b0f9bc9e524c6d70733 legacy-trunk
+32443 2af93fdff60888e5476d58ef4965a568ea72b1cd legacy-trunk
+32444 113c3188875561466d11ec35e114739aa7c7f0c3 legacy-trunk
+32445 ed74ac21c133220fc2c64e46750a3c320a2e95dc release22-maint
+32446 b316293356355eff7654fd4da1fca3bf2f17f0e1 release22-maint
+32447 73dce893eb4b38028d3beb6b32840494036698f2 release22-maint
+32448 6bd28abd31a7f0d3e6a92d0f76a6a9e8f83c5936 release22-maint
+32449 91130a4cc1ce0ef46d29cf842c3b6f409d306746 release22-maint
+32450 57e61588571b20b12b0052c6ece968430f9c9b31 legacy-trunk
+32451 045bd14f746825b2048ed6ef45a477ffe35aad2a legacy-trunk
+32452 60e722384d62c6f8067d2df21a6d03ae815c093f legacy-trunk
+32453 64cb657b0338444d2e38ef7db9714259adea8ccf legacy-trunk
+32454 def09ec0bc3172c54f75b129a2151381f8d69bec legacy-trunk
+32455 7296cd3f45c7f473de7b2a5d96ce28a43ac46fd9 legacy-trunk
+32456 0cd8d570c591139bc4ac61e13c0cb76d2601e8ac legacy-trunk
+32457 2fad548391ded6ed4bd01a6087877c9bd8b9566c legacy-trunk
+32458 9c785ab1eff03a271188df3c9c0c5b479280260b legacy-trunk
+32459 dc4e47e6f00235dbbb640242a79b245b01f52f15 legacy-trunk
+32460 b37af21b77be315c820d7e1de9ca6cab9c064e32 legacy-trunk
+32461 e06aad90c0ae24d98fdbb18b2f929219a71811e1 legacy-trunk
+32462 1c5ad936038ef26c29d60f5653c9441be7c51ef5 legacy-trunk
+32463 7012ca64bc7495c73bd07a39c6d521e7d96aeb25 legacy-trunk
+32464 e4a5f38ff0089bf0c2b6efb08ff87e7c41661e86 legacy-trunk
+32465 fa159fef273004df5af6d11481f427b9ab4e4e84 legacy-trunk
+32466 45c4a2f157b38ebbcf6225a493dae674a159ebef legacy-trunk
+32467 98e31cfd26dc261bb4ff200e45f90bf658eddd72 legacy-trunk
+32468 d822388082bad4714962c65009ab64c9ced5c79b legacy-trunk
+32469 c2a05e0785f148fae9777982fc5a9568947e0ef7 legacy-trunk
+32470 27af37dd5a0bf521845a832b4c7b0562235e6a8d legacy-trunk
+32471 39d82d038878941ac1280f20f6f85e2757856715 release22-maint
+32472 490af00fb1830c354b3688973f68a304c4bfbe4c legacy-trunk
+32473 ef079defd2cc11f5a2889bf8379428f48130c90e legacy-trunk
+32474 ee815a6b11e202beb2655288df5863ace6906b7a legacy-trunk
+32475 86511b96d980c7ccce68061ce95f5a1212eaed2f legacy-trunk
+32476 cd82253f20b70c3679a7fc2b62c0aeda695e8f15 legacy-trunk
+32477 feb35954b03868d12dc1e1b5d56ad9c8993b3bbe legacy-trunk
+32478 4c53b694afa6982482ff6265c27bf8d057037ee8 legacy-trunk
+32479 f351fab73897dddb8b3b82c5956868ad63cbdf9a legacy-trunk
+32480 1bef3eca20ce0991f3034f17f2de60526b2d51c0 legacy-trunk
+32481 ae17fc819308b3ab66f71b4f6e93220163667dc8 legacy-trunk
+32483 736bbdecaa1df9d4bf8b61de45d03c90a9259887 legacy-trunk
+32484 545faec790c473260c652baa3bcba111b9cef134 r23b1-branch
+32486 5ccb5536fefebbb64a3291756a5638bc279b2b6e r23b1-branch
+32487 5cdb7280c3266d9548ccd8a6b3d406a21f38c9ca r23b1-branch
+32487 5fc60e0b883680207cfb100865c42ca3a2b16637 r23b1-branch
+32489 576fa17ff07cc173d2b277e45e4a4deab46abd2b release22-maint
+32490 171ecfff26579b759f88b9eac5a15e3537dad69b legacy-trunk
+32491 bdcf37be904dbd2e353f1c7faef3162ba61a0281 legacy-trunk
+32492 3030d94a9c0590be41720b9c7caed15214e7c83e legacy-trunk
+32493 b62d8781697695412d686ed0043ffd71ed1a414f legacy-trunk
+32494 98f5bfb19c868b363fd4004f332feb846c5c94ee release22-maint
+32495 68c6186dc1a11bb412ee03aeb9d1ebadd7c3bf17 legacy-trunk
+32496 b67f5c395a688e5905836804892fdb36e6ce6248 legacy-trunk
+32497 103faa0c2e1e6f6fb4b47b7ed2454250a00a7122 legacy-trunk
+32498 db9845907e8bed0396465a3bd73bce6e2ef78615 release22-maint
+32499 64230ee8eea595be2e404e3e31db9c3cdb4e0f2a legacy-trunk
+32500 f50d0d0f29a2d0b527a5a28f137ab4d3bb7e1f41 legacy-trunk
+32501 6d852ebff36ff63b7986e68e23a6b0699c5a9610 legacy-trunk
+32502 16374052cb5db3c8c6c2424b653b75b332ab2ea4 legacy-trunk
+32503 53ff23bb3248fb847280700bda67cce548077219 legacy-trunk
+32504 743ae9cb3a83dbff23101c468a5e11d91b8bb52b legacy-trunk
+32505 1a0b7fc4625b8803e3383bd309a6f36709f424f1 legacy-trunk
+32506 3a8b8aede100d8c8eda9d658a8ec1289cf6bc467 legacy-trunk
+32507 a53529095e954094384f73a7ce6f59743896a18b legacy-trunk
+32508 5f3e8bcc8c7ebca64bcf016e6d3b7b739c0ee209 ast-branch
+32509 b1bc9e171c62e829aeccaf80098ac89719937f80 r23b1-branch
+32510 1d97f52bc84fb0dbb9533d3a1447ee0054c365de ast-branch
+32511 71e191b83d0465bcd1714677c78cde9017e984d7 ast-branch
+32512 b846121829bdb007cf5477929f7fe39dfdc7ce47 ast-branch
+32513 a61330a3d59c21cd6249577f164f1d0e4098131a legacy-trunk
+32514 f55b553a0b34999f60506a888014b51bc16e8b08 legacy-trunk
+32515 6392e843758881312073558b6a3e2e966b9d0db2 legacy-trunk
+32516 c6d6ad862a8c33113ee74b2c3a40b05899211272 ast-branch
+32517 65f720fa6200fdaff40ad29803184303d26607bf legacy-trunk
+32518 240071a2b466e4f2a33d82e93449b7c380785879 legacy-trunk
+32519 85f0e60954ca7b00076668c1fc346685dc67d5e3 release22-maint
+32520 9eb5be937990a892e5a73aab618a621f50798d38 legacy-trunk
+32521 0f0f6234f2ff4efdcc73f3ca631780a9b37c8f7c legacy-trunk
+32521 67ce4ee4a29d1e7ce357ef8d1c00c69d557c10b2 idlefork-merge-branch
+32522 e2d29569996d80d605da66e17bd42941e03e1c97 legacy-trunk
+32523 2318a9e16ab0a9dc988dfffe71583aa3fccd7473 idlefork-merge-branch
+32524 75c1ced93bb52c2abca06bfd1211e474281e3435 legacy-trunk
+32525 6c417552f4735c08c8db5661342eeab3bbcbda01 idlefork-merge-branch
+32526 6e9862066e296ec84868ca7a0203d046937f5c3b r23b1-branch
+32527 99881b6ea9f7d980b141758f2b0b869da6634864 r23b1-branch
+32528 a341976ff476d8d4cd11da3bb421075385def00e r23b1-branch
+32529 b18d2f2db18d090c6190b3332e0150a1a7d43dd3 release22-maint
+32530 89e35cdbeccc0cf192ccf9b2c8d0aedc640711fe legacy-trunk
+32531 6873379b8d8c5a071525ac5e35c88322723f0d2f release22-maint
+32532 ea7772732da19c3147fbe0e891daacf1dec3ed83 legacy-trunk
+32533 49486c544acdd56172add46e8cd27b2094e6b0d2 legacy-trunk
+32534 671e4e2eec4ba73e84a8587c882cd0e168baca30 legacy-trunk
+32535 af53729d3cdd64119522547063970032fc5ae90c legacy-trunk
+32536 e4eabe5b3da13d4faa3d271c3a038e5ab9de7f26 legacy-trunk
+32537 d3164a304598b14f14da93ba1da4afe80f7e5655 legacy-trunk
+32538 96b6cc5d408b84d25f1ef2601ad4ffe201af7447 legacy-trunk
+32539 39f4b97ce82819dc2f1103a05a47dd2d43df8816 legacy-trunk
+32540 d5e291f0ae3955caa7d7001b73018ee6982f55c3 legacy-trunk
+32541 35c90d9cc31357506a8d8676276a7dc784bb409e legacy-trunk
+32542 d30a6a574979c8b6f165acd2c58aade9a235e4df r23b1-branch
+32543 bc135d7b7df16fb7ac1da0605b0fe8f3b1742397 r23b1-branch
+32544 eddcb790ed8d8bd51f19076669c0c634236656d8 legacy-trunk
+32545 2d069c16c8b2d191285777694104c45b53d97a35 r23b1-branch
+32547 d1cde3daf9a9e61667ef76fc984d88f423395746 legacy-trunk
+32548 f4238036000c4556c439bdc1894726281076258d legacy-trunk
+32549 b9a3073f93928c1b801124bf47b6e8355840e3e5 legacy-trunk
+32550 81d373e589838c339e032e6ec1711d8ec1677685 legacy-trunk
+32551 237f97c71691bf3f840f6fcd24cee5e4eb86865a legacy-trunk
+32552 081ef7b6be04376837fb245a2722e7db8741ab96 legacy-trunk
+32553 0e35c159741b571de53106b5df5ae7087636ce8c legacy-trunk
+32554 aab0dbe3c0081fbd84a9dfedd6cb281ba680627b legacy-trunk
+32555 039ab31e10347796b4b8068caac4f2202c4aca81 legacy-trunk
+32556 4528cc0edb6da54f9630331f87f9e84fe5e312d8 legacy-trunk
+32557 1d1a85f0e5e999857c103f7289f3dc499d123723 legacy-trunk
+32558 fa5950fbe73674d6e00c5fa197ee3b76066153e8 legacy-trunk
+32559 1eac1a35b370429e6bf6a6a1d37ed2feb427e403 legacy-trunk
+32560 e4e72fa4c91412f3626826e30e1dd875e3a74768 legacy-trunk
+32561 ce9e2ae8d59d66416aee9a3e526bf3d74be99e9f release22-maint
+32562 06abfc9c68e7727efc0c78e677bf51fea9a7fd28 legacy-trunk
+32563 6a51d11fb1e915f76ad48a424c9c3f7e3a312715 release22-maint
+32564 96eee7d04d88407d739666e84d9ca3cb1ed3ad06 legacy-trunk
+32565 4ef108f8181f30c54e592869f33c78e865da2182 legacy-trunk
+32566 b04c074586aa426634ae4c31da4b93424f9a23e4 legacy-trunk
+32567 33475661823d373d65ca93517c27a57d62fdbacc legacy-trunk
+32568 fa006392851817c308fa262f7f616411923594fe legacy-trunk
+32569 39ad76143288ba2aadc29c354ccecb2bd4165867 legacy-trunk
+32570 1741af48fd9f3e69fa3559283cde67e6ca921a7a legacy-trunk
+32571 9287278916e3c5f1f1e7d8d3ea2f4e5c557198f8 legacy-trunk
+32572 f2c74cfea0512474adb23638f88e52e4537ce479 legacy-trunk
+32573 00fc138d8556587749bb7a526581f94bb7f47905 legacy-trunk
+32574 888a3118e0d42288aeb1732d5f3f17b2fd4f9e9d legacy-trunk
+32575 114950ee9aa733ee2c01ffc3ec880b459863d916 legacy-trunk
+32576 83533016c2897165cb4f7a66acc0d6626b1b4a49 legacy-trunk
+32577 b3b284436c24a20a3829f970b667d3440f5537bc legacy-trunk
+32578 a769e079bb12ff83ec97ef3807131173677eddcb legacy-trunk
+32579 783ddde3792b6694864e944ae6db184ee93f5642 legacy-trunk
+32580 0a180ee2473bd99ec4cd6fbe4abf3a5d8db63c79 legacy-trunk
+32581 c798d28dee46b19d161260e7b41430a463e70f88 legacy-trunk
+32582 92a1e585abf763ac351642aa2dbcbc6f52c5a757 legacy-trunk
+32583 18082b2d2ebdf15b3fd3b9fb547d803bd8733636 legacy-trunk
+32584 a40b5671a563921d29d057dfb7a20d45caf7fe2d legacy-trunk
+32585 6a3117df5e131259ae42f9e2800a1112b96033c6 legacy-trunk
+32586 d91821d9d4709672c0bc69551cf4434ae0b0960d legacy-trunk
+32587 99cf3368d687ea89e7fa673c845176645009ea55 legacy-trunk
+32588 a114ee74267c73130b5870d962b52669aeca6ce5 legacy-trunk
+32589 2eee9655d71b0f896d6bac9bee78b20736097389 legacy-trunk
+32590 c5f18db1c9661d58072533699578b2fbc4dff85d legacy-trunk
+32591 5d4d4ebfd3171e7535c94187c85c7a887c7cad0b legacy-trunk
+32592 4756fa5385606fb122f5e9a7d167d9df3f557f19 legacy-trunk
+32593 fa057824c9b4b427d094a39e548160ca744eb42a legacy-trunk
+32594 05da7726c027e47f1109b17c9b7ed54c838ee0b8 legacy-trunk
+32595 393429a6fa16d1d904857eb5da60964e61a4eb20 legacy-trunk
+32596 e059a8b11b9eccb10072f7699e4ea49dea35c26b legacy-trunk
+32597 faf2cb5070b4c8d13b7ac59a5f98cf7416bf2f4c legacy-trunk
+32598 001a905557808a15e8439b583c1fec6989ae72f9 legacy-trunk
+32599 dbdeb734ff9799da816c5936c5c436c431fdac11 legacy-trunk
+32600 8df897f14fb86026f34479b2e0969c80f4bc4dbd legacy-trunk
+32601 33598e8e49b20ba4b5a799d2a1bc28202b983882 legacy-trunk
+32602 ac487a7f7f2c77097578bed1c8b89fcc7c3a5460 legacy-trunk
+32603 3a9f5f0c512eb4980ec1ac809faf6674afed56b0 legacy-trunk
+32604 1964012f6fb0d23bf8d7ba399bb5e8574a261c20 legacy-trunk
+32605 6c4a04ce965c258f3a9bb0f94d91ec0cad7b95ec legacy-trunk
+32606 09422c3018265b85a80f00893e16a27d5e36c9a4 legacy-trunk
+32607 9d5a7591697109580c58def62c917e07e651e15c legacy-trunk
+32608 1763d9d3fd9dfeecd6d6e27bdb567fa14c86be9c legacy-trunk
+32609 9b4ff4bf033b81647826aee9fcb17c7e1256cf5a release22-maint
+32610 baea318be499cdfc49b557add11ce8398b9432d1 legacy-trunk
+32611 25b2218da09b59f96b896ee6b410a68a28001197 legacy-trunk
+32612 35a4d74b5b8ed99bd17051f097db1923c6616b9d legacy-trunk
+32613 6ca94aeb292ac4779a30f76bbadc35e60792a869 legacy-trunk
+32614 ac29015ff6a81ef0418da196d859db4f9380c9f9 legacy-trunk
+32615 189fdae8f492bf6ced3d5ae0b14a32c29f4a6513 legacy-trunk
+32616 25e660e70dcd061e9982b0378abf36f0367c0aa2 legacy-trunk
+32617 2e9956d01de332f7d12f2184eb0e91a65470236c legacy-trunk
+32618 4ba763bc5a560dc57dd180b2d75d56e96b57b782 legacy-trunk
+32619 350ee31aab0c0242473d50ac90fe33fafe04afec legacy-trunk
+32620 9959d8fa4ddf0f8c040960ef10acce6cc9aae0ed legacy-trunk
+32621 b174d0927f0e257949c9c13bff7f435c2c04537b legacy-trunk
+32622 c9c6ba7952a8227aa8d3b2b9259bdabdeaec962e legacy-trunk
+32623 9f9022c210562349f4701875189365e67b6441e0 legacy-trunk
+32624 65bf69f7c1489d8848ab246be3bc5ad264daaebb legacy-trunk
+32625 c92412d634b10b3002887f42350c884a3f2e0286 release22-maint
+32626 68f042fafb7dd09bdfc26fb346fe464cc5e0e0d6 legacy-trunk
+32627 bb17709a37a3ac0749ec12a41017401cb21b1b2f release22-maint
+32628 3e88cff05822f2c1b58a5cc0748fbcf98b91e3f1 legacy-trunk
+32629 4bf86518d9ae50182070f5ecf008803e57cc5442 legacy-trunk
+32630 4c139168648c6ade3c301aa889c2969733430e4e legacy-trunk
+32631 83fe0f5c93597cc6c16a56a0321e826fc561bd51 legacy-trunk
+32632 cfcc45f18515a0da7eedaa93bb66e7f0d522ed40 legacy-trunk
+32633 5892c1e515b4da9e1074957954366f464648a105 legacy-trunk
+32634 815ff0ab24e728c1cb6dc0093dbc13373c2c9108 legacy-trunk
+32635 312f1186aa394581b5b14501745a2d041f835358 legacy-trunk
+32636 a5dd5747cdfe268d4a56c5f1bf6193e91e98e497 legacy-trunk
+32637 17bfa786075adcb3010886e4c04281e5b47a83cb legacy-trunk
+32638 b54a84d29c00016dea8bff20358c9581bcd308d4 legacy-trunk
+32639 41388e84261b242a62bfd0504a8121d3309cec5c legacy-trunk
+32640 222c3d2fe431b1372bc97009f278d63da1078065 legacy-trunk
+32641 82fe3a9ac371d4346acf6efeaf647dbc736452a2 legacy-trunk
+32642 61d3f8e66d8fc06008dd79540eb25a384aee118d legacy-trunk
+32643 493fd7e52206a1ae5a044107c16455054988ac5d legacy-trunk
+32644 ce6c3cc422ab5162846abdb4ffeb264f217e4a9a legacy-trunk
+32645 b3702b683f2ad2be6b20ac7cea2e17697cc54e16 legacy-trunk
+32646 f1fcac4cabad86fca9100c0731a1c9e790273f84 legacy-trunk
+32647 d54610f4f261dcb9e16946afc91b5a8285d39c22 legacy-trunk
+32648 6b07f369cf03dad8426cf5d7b023372010ff1965 legacy-trunk
+32649 380a9a5afaa0bdb2f5f68cad99702a4d6a148c02 legacy-trunk
+32650 ed4b098c7bca1d98af5bf66a4a95dbf064cdfd4f legacy-trunk
+32651 6fca6e07c2fa9a6f5a6a3391b88a9b56394b07cc legacy-trunk
+32652 e107c921b8f3311621af65d731da2a5c8ab300f3 legacy-trunk
+32653 5095378394246affb0274a7f27bdc0f79c634e46 legacy-trunk
+32654 6c40b73c70457efbce168f9cd5730818f75018c8 legacy-trunk
+32655 50841898cc19c0ac357d501f20614747edda1b9b legacy-trunk
+32656 013d95c346d2355432e8d17c6f563c0636a3553a legacy-trunk
+32657 a07def0dc7851ea48c5b16d4a92fce8777e49cb8 legacy-trunk
+32658 3055c9bdff5f5119a6028ddc6cdb76306ce22df8 legacy-trunk
+32659 f9e6f9fb8df0c5f205240ddabc17d7a7d8d2f13d legacy-trunk
+32660 a3b2610b5041a92aae7d251cd5fafecda8b0cc47 legacy-trunk
+32661 c27a64b387627f1bbdda432fd5e614cf131f43c5 legacy-trunk
+32662 d2afa00c20e3c4fe72520fa4f7a98716747a0f4d legacy-trunk
+32663 9b7164cc0c9266ed6e21c5d37f1122e5e289c621 legacy-trunk
+32664 04613161a32b6baffac06f173ed066c78c1ae9f1 legacy-trunk
+32665 e6968886a97da190f85d129b1fcba90e94689962 release22-maint
+32666 157a29e19eb9ec78c25a309d35e5c6b306c037c4 legacy-trunk
+32667 067a982329acc3386a807b36072da1236772f130 legacy-trunk
+32668 eeedac49e86b388fb23c1513571716d74a5757e2 release22-maint
+32669 109810a1ada8606f28030b3cd7439d3cd787eae0 legacy-trunk
+32670 d4f6544f79ace441da7eb747dc67a331c9b38652 legacy-trunk
+32671 13d8f29737e5de2682766bdbefa5ff217c542c86 legacy-trunk
+32672 dc3f3f3038a8cfa94f18ae2afa5277139dbe1ee4 legacy-trunk
+32673 089f2421eb18a0baa824e89728b0faca4f01355f legacy-trunk
+32674 2f652a59ebb01f82df31ee77521c1ca9514722eb legacy-trunk
+32675 2f743de8c5e2a2bf73c7d140a2681d8ca786c33a legacy-trunk
+32676 cb832c2cd54d4aa797736a5ab586231cb67f992b legacy-trunk
+32677 3f70d75cd28dacbc4c6348468919fe72ea3e3dfe legacy-trunk
+32678 4de02f18a41b42ebaecb764fe420205ba1764780 legacy-trunk
+32679 574b9551cfc9e619fbe15334402feae00373beef legacy-trunk
+32680 6bba48d1ce3bb0697b8ed7d0e8c368f1ccad63c6 legacy-trunk
+32681 1c2e603fee0230ed75f68b7876acbe2d53b7d629 legacy-trunk
+32682 4aeacade66009b186fb719b3b0fbe430b5a55e56 legacy-trunk
+32684 d5e487362d3add4965056ddf22c06fdd6955cb28 release22-maint
+32685 fb117d7f5950c64b4ecc02578ef570098dff1e7a legacy-trunk
+32686 3f214c264f63d5bc40064723f5416a5ffae0b721 legacy-trunk
+32687 13db5b7de0dde7523ea15a406773f568ce01af68 legacy-trunk
+32688 656493534cc7766aa61f697236426c73fabbba73 legacy-trunk
+32689 e1d5ca8ab7dc82c726398211938a27b72b5eb6f4 legacy-trunk
+32690 ccf7e138a126dd30fcf2c60f62a37fa600751bba legacy-trunk
+32691 db90843b00fcdb83428d949e37b0b3a40dd49311 legacy-trunk
+32692 d3c1a03a51308904f35389b2b7c4f70f13bc3669 legacy-trunk
+32693 59b1b3e2a23b5e94c027ad98f7214ed53277021b legacy-trunk
+32694 eff86cf8f3bb3e7edbe0b48cb923290c832164ea legacy-trunk
+32695 81088df0b1df3640e89b4d5cd9645f3bd82f9fd1 legacy-trunk
+32696 0559877ada5cf309a603dcd946585f28c39f1024 legacy-trunk
+32697 8e79dc3731bffc26b9ca8da36a0335353f9fa9a2 legacy-trunk
+32698 43002233cc2cda0143d94a63187fbc194a6263a4 legacy-trunk
+32699 de564a8733d22753fe83092d2bedd7d44e2fd442 legacy-trunk
+32700 58c8e28451a977e0fa4a6710c3a352b4c29f4a80 legacy-trunk
+32701 d06adb5a3cc96dffe3bb90a99679bba4d7fd756b legacy-trunk
+32702 54f1ffa37429eac7a50198c159fcae9d977d7bce legacy-trunk
+32703 064419773956b7098bd4c397318c27daa7aeab61 legacy-trunk
+32704 f278b27ef105d34ef446a40dfa0bacd6351824e9 legacy-trunk
+32705 7750b8462a8fc4086f7f97e3f8d54e57077a12df legacy-trunk
+32706 143fff8d21899d093ffc862e28baa7212bddf71a legacy-trunk
+32707 cffb517f4e15f9d6c850c7ce4df6685fb248398c legacy-trunk
+32708 2b0c0bda5cca7b6ea735315edf0edfe3eecb6c70 legacy-trunk
+32709 6dc82dcf55892602d24fb83d77abdd3e53b572bf legacy-trunk
+32710 45bfa6d591f7ca4a52ad49700b0269c167c18c92 legacy-trunk
+32711 bae67e414a13a42f09defc6753cfa0e03c3304b0 release22-maint
+32712 e09399e3b2c090df49ec3bda64c45014dabc7d96 legacy-trunk
+32713 92ebd3daf5072ef31ab5db5fd6796d988e38c328 legacy-trunk
+32714 9835b41133ac06e6968ae25d8ae4fdbe941f6b2c legacy-trunk
+32715 1babbb4919a7f17d2fdbe9af703aa64502698fc3 legacy-trunk
+32716 c019aa827f86056976d29100ee00281f7f2d9383 legacy-trunk
+32717 ab7dc538f6f72d28a21b92eec046c55873b0b1a4 legacy-trunk
+32718 8e92f2e2bda9f5b0c0fb0b8e050ea3295698ed8c legacy-trunk
+32719 bf1634b023d5aeceb848d9a717a238e8ba9ab847 legacy-trunk
+32720 90342f395721df64e190c6ed81f956f5cd4f5199 legacy-trunk
+32721 04065c4a1c6b5afe5398a09a913e0367bee97049 legacy-trunk
+32722 1c848e9f6166231c07ecdaf85140cc32803f967a legacy-trunk
+32723 5648970c665f17f38d88ee28b532eb3fd7c99cd4 legacy-trunk
+32724 b10a7facc1e886de842329c1bc3a63fe14fbcad7 legacy-trunk
+32725 85f1a94af374226f49440940e60f5ccbb4b7e6a7 legacy-trunk
+32726 cd48903e41befcde161667f6ab3f17083cd6db56 legacy-trunk
+32727 c4e8c6721e456653ad17cb8ad6bbed00db0ef12e legacy-trunk
+32728 988b3e8070436de23b567669cf84870652cdce86 legacy-trunk
+32729 35a09dc8084c9d0aef922914a531120bf0399331 legacy-trunk
+32730 ad84fe58ec2f8ad77b644a918c93a4a9652dd9c3 legacy-trunk
+32731 754c41bcc81a2c813ace580a2ecae2ceed48858b legacy-trunk
+32732 78efbad53dd86b77ba39f78a978ad5b53e923032 legacy-trunk
+32733 f57751ffd6e78abeccfda3e65a0558c20464215b legacy-trunk
+32734 437bcd52cc045cf63660cbda8f09570653bcf386 legacy-trunk
+32735 ff136fef7231c47f44f021e5d0b6c5e2139d4bbd legacy-trunk
+32736 540a772028d26a539c4cbc3d0e37adda5f922c4a release22-maint
+32737 707e5f89c211b0d5ef1efab6aa5fbbfd62522a47 legacy-trunk
+32738 ce1d7e10f49e9d0ca6632ae2fcb2a30c48f90b9f legacy-trunk
+32739 5a0bb6eaa7761880a9d11a49865146b16a50988c legacy-trunk
+32740 432add84e062dca97bcbe701b9ae9e5faec81abc legacy-trunk
+32741 526f37fb380d864704f45a28fb0e8164ac28ec51 legacy-trunk
+32742 4b2e05c1754e6d334b70b21b16937858a11d4d65 release22-maint
+32743 a571a9d6257a2ad1ad057e1354bf31e362b6f2cf legacy-trunk
+32744 5bf96186db31c53982e4282942a9e921e1d55663 legacy-trunk
+32745 22060004b94aeefa08a59596e11f20acdad1ca13 legacy-trunk
+32746 4ae3c2d98890bd897461dcb87b58fa00c8676944 legacy-trunk
+32747 a1d56319ef0eb38407313e3408b228a167e6c488 legacy-trunk
+32748 22b890d157f7db1b66fc3b5b79f8f7775b3a603b legacy-trunk
+32749 c5e9655ebed72b90ed52fb7d4bb688289c3dc99e legacy-trunk
+32750 3cd5aec59ed23da5ec64d4017618fea78ab2be6d legacy-trunk
+32751 e8b5709052e25a2d010fbed505b39daf2ec5107d legacy-trunk
+32752 248096a45732c1a051535730f44e109154a843ba legacy-trunk
+32753 5ce6296421559e1d62b0eac8dbb2bda9a06a86ef legacy-trunk
+32754 34d63b8c275bb9c30407d55fdb9c7b9a03feba6c legacy-trunk
+32755 32e70ad79f66d0cf87b48fb235505bb21f65d7d5 legacy-trunk
+32756 7a1ae475e0dad5ffa9b8e6d4f994fabd64cb7b48 legacy-trunk
+32757 64a9e1be32513d589fa4018d5463f1134168855b legacy-trunk
+32758 a5e99e7e7ff033db85c5eccb5cc8124a2d136f44 legacy-trunk
+32759 19c414186b9e505b1725f807a11e0faa714f91e8 legacy-trunk
+32760 91de3a0924a298ad9528b4f354ad289685e01cf5 legacy-trunk
+32761 93c92f20b6bfb6dd0256305fc32ce8087950e65a legacy-trunk
+32762 cb0025451482bc367bae3a9e00e808e4151f9f18 legacy-trunk
+32763 c06bf6b2b19d902cf8ab9efaee1c2bae91ab7877 legacy-trunk
+32764 d6ba819a2f9013b58aeb851fe7c1a9924b44fe0f legacy-trunk
+32765 f4d406acf1ca0bd54db8d78f3becca743a8ed619 legacy-trunk
+32766 85406045f014dd9dde285e58722c23687fa407d9 legacy-trunk
+32767 52372dc190fcfbfa075e75452cac3c0e65888c6c legacy-trunk
+32768 4b0220260f62e1f4b64940a9cee5c286451944ff legacy-trunk
+32769 4f87a84e9bebb29fb0dd876fd79c54bc003e07cc legacy-trunk
+32770 24786c3130ca876dc4a59cedca896983f5985ab7 legacy-trunk
+32771 6ac0a672b08213fee708589740b618fffe941d86 legacy-trunk
+32772 d7ac1a640d8f9c00ca62224dfbea8635cc017ee8 legacy-trunk
+32773 7875fcaae7a3712f1e4bff8e378ebdf71f18b9ce legacy-trunk
+32774 addd437be74921627dca989365a672363160198c legacy-trunk
+32775 29f19460f067855c6dad74a52e80d92849ef08d6 legacy-trunk
+32776 c7dfda993b2faeda32c079eb1692eac44b749e5e legacy-trunk
+32777 cff6b8f422d17a660ca2175d171db8a92fc919b9 legacy-trunk
+32778 7f59dce8f8c0d4249131a028db97dbf2434bcfe4 legacy-trunk
+32779 92e53c8e7a7243b2143fa87acdee3170ba3aac79 legacy-trunk
+32780 6d933307761c01559f9c0a420b6b8a06e1d2187f legacy-trunk
+32781 e6691ce91b9fd9e59897f4ded25af1c04dd00605 release22-maint
+32782 52aebc1400687d34668affe9c4765895d882614c legacy-trunk
+32783 cf338633b0746c0aebcfa0156b0a787d09961a83 legacy-trunk
+32784 4cbf77edeed52792b117331b33d05f4dc055f8d4 legacy-trunk
+32785 9876b18edcab40608aaae67b3c24395dda9c5f78 legacy-trunk
+32786 66aa105c8d1798b197b3c7622d6a9ac9e7d2be24 legacy-trunk
+32787 60e73c505cf2c1c29b617e56c2e184f7967d0117 legacy-trunk
+32788 53dd8c4263fd31dfa99e2e6a551d759812540dbb legacy-trunk
+32789 2c3592d12d694e3ab835196a215d2121ed3326bd legacy-trunk
+32790 c1e83b8d5b70fede52b57321b99832df9655afd9 legacy-trunk
+32791 e9f9a196fdefe4f72e8760bab041960f46247de6 release22-maint
+32792 c310f9ddfdcbdb1a7b553b1f28093e5c29a39438 legacy-trunk
+32793 ae04a73bf8fc1be713059700c014f1d86068be11 legacy-trunk
+32794 e57e22aa56a48677035d4c0582245b4a34ad86a1 legacy-trunk
+32795 f93512f1e20ff16e55c438ba590c6a38f8b2499d legacy-trunk
+32796 5da198480b6a76fe38a1a66a61a3d02795debbe5 legacy-trunk
+32797 4332f20533fcdf3ea94f260c7b3c8004379acda2 legacy-trunk
+32798 693155cdae03f8210b4985d893a471205d809a54 release22-maint
+32799 e6e100efbc7d31ea41a41b407bbfda13f1cf6b6c legacy-trunk
+32800 2bf28904a8ecaa530a15732c2f132d396f436abc legacy-trunk
+32801 b6191ca8ed8071592bbc8e32e041d771bf2bee23 legacy-trunk
+32802 bc52168963b321d0ce8abe1355b79e055e64e8ff legacy-trunk
+32803 ef3ef88e3614f6a1270bc3c0849276d7dd1dbe0c legacy-trunk
+32804 6c30bb3e332577c43e85dac5dbe166646f038217 release22-maint
+32805 8be9a316eb9de165c5428f7c1aad656927998c96 legacy-trunk
+32806 2982e61825661ef1b9b96c10b92ca1da6f50d0ef legacy-trunk
+32807 16721d73ad293bd9271fe6ba68615702116a55a9 legacy-trunk
+32808 5e6d0dcf155f8734e8e0f24a27ea612132be4e4f legacy-trunk
+32809 46fc3f8e9eee339c5fc82373f02ff5917c200cd3 legacy-trunk
+32810 9d8de565e5deacdc7c5359aee912c90b42b7c1a1 legacy-trunk
+32811 7f0074ee8ab995329781792f9cf49328cf42af01 legacy-trunk
+32812 001d3c7e96370c65ca83ddaa7cf01aafacb3d5a4 legacy-trunk
+32813 532de19332a479310779b3988fb9f5e49df0c099 legacy-trunk
+32814 4c1d1b359f0669c8a5fc5180bd9210d44107eb3a legacy-trunk
+32815 1d4ec52b316c0b80d2a725fa3f8e0eaf68a2b653 legacy-trunk
+32816 384bda343725a0ded0dcdf28017d46dacf8cfeb4 legacy-trunk
+32817 2bb5ceef9ac3c2d22147fbbb07bb1c6842a6c09f legacy-trunk
+32818 4d9017ef7b5f3110899c9d44a3b4f163f106de72 legacy-trunk
+32819 3f9aa6f1aef08c4d22e62182f65998889c7e6f4f legacy-trunk
+32820 89b4e8e2c230cbe85f06441d4bd0a6b07d451cf3 release22-maint
+32821 643f3ac430be87dc4e10b9447398fac36a156583 release22-maint
+32822 6545e7498635ec219db0b0f68e07afc6da2e581d legacy-trunk
+32823 434ef174f478623829b6993a057a877501044270 legacy-trunk
+32824 f0b67731e545b5b94473c4ad37c3b2d24ba180c7 legacy-trunk
+32825 9cf09f92b198bedcef8427aa08fc7c711003df33 legacy-trunk
+32826 9ae17b3779bbb02d0f24a9b4b93f2fbe0c42134a legacy-trunk
+32827 421ffd7c57afeea738023adc152ae128fc272700 legacy-trunk
+32828 efe5dd60cee88abf7cf586dca2b41ea08d9a20e9 release22-maint
+32829 45f7de7f1052c8b01cf6adce340202d861f7360c release22-maint
+32830 570a7b8aa154216565c72ef3579b51826c64a1ac release22-maint
+32831 4f531cdf242e8ac2f91ecb9e73daf083436adc52 legacy-trunk
+32832 1dc7c0a020d3d7e35b72a11b048edfa474874bfd legacy-trunk
+32833 6e95add92c99bab8f3c0fd72118740d02be73c1a legacy-trunk
+32834 46300b9af02b94dadce5214bd9e6d27ad4d2f6f8 legacy-trunk
+32835 f475bec3169551445c7eb5d8e409643bbeb039d5 release22-maint
+32836 054d9bc0d8608ab7344d06ad601ad716c0da95e8 release22-maint
+32837 f39c271a9a8e6c228a41094042d44c4dbb1adeb8 legacy-trunk
+32838 9aa06cbd9cc1a307c4c9c92dc9f30168c65657dc legacy-trunk
+32839 c7f6f73743b08b48b33fa47c4a879dab02759acd release22-maint
+32840 2aaa39edc511e7d300ba21346377dc188d3e17bf legacy-trunk
+32841 896bbd0806e8f3f20bbd5781b72ff2aff39da23c legacy-trunk
+32842 bee3d1a1b9a9a3cb155b76615828cb51e68bf823 legacy-trunk
+32843 4b1c150d07d8c5b041bb35d5adb7103af8a46c11 legacy-trunk
+32844 227c6646cc6bb5b1a2b4beb15b1eb8d6b1e7be33 legacy-trunk
+32845 1297d405155bd36d157e6a1dcca7b971193de5f2 legacy-trunk
+32846 9b242506d6dc7d47f3db8d675be732763432dd9a legacy-trunk
+32847 d665c6b98cd241ba67daaa62afa5b537d7591739 release22-maint
+32848 81296a80a15f2e205b7c9d37b7b4e0e343715097 release22-maint
+32849 6d6bda2549b6bd460d5b34f0e4efb25b89469002 release22-maint
+32850 a9210bec3b5af92749166724fcc130893acbf458 release22-maint
+32851 0a97adc6a47eb245cc9a7ec22b4e294773fafa32 release22-maint
+32852 b9762f003f308d1752731ae3fbbef30f1cf1f97f legacy-trunk
+32853 cd1c826c98a2bfbce4aaedb5b1f009cb3bdb075d legacy-trunk
+32854 361fad63332dd24905d22839f0fb662cdddd9f69 release22-maint
+32855 754fd34ad9784e2c77e71679b5c466fe3f920a6c legacy-trunk
+32856 f6e91ca56a498c7f60b59fd7820c21cdcb88171b legacy-trunk
+32857 315a747277bfe76d58395378e9e104b59aa0b476 legacy-trunk
+32858 b1f643690a887ce21ede68b2f2e9c174bbaff156 legacy-trunk
+32859 56ffca02c8243b351fe742432f195d68fee67396 legacy-trunk
+32860 e70943933739efca69064e1ed2b008250d9fb46b release22-maint
+32861 5ecc48ad6634000e7ed63c405b1f5b6fc0363e61 release22-maint
+32862 ff9ba3d1e280cc62173c48ae2e6bbedc41add676 legacy-trunk
+32863 da2c5d9dd60e07e3334382832ea771c62180c0d1 release22-maint
+32864 35b2769b02b63409986521722149bb02493c984f release22-maint
+32865 e5aff06037b794e6eea867b1ad3ed178d959c065 release22-maint
+32866 d9cf536c5340cedde7f57e7fef42adaeceaf2589 legacy-trunk
+32867 584dc46ca066da0383c2dde64880e2018058a8bf legacy-trunk
+32868 6462216fe3a87abc0ad595196ae2bc93de16836e release22-maint
+32869 4bac4d0d3e3ed1b28877b79536cc0f53c7dbf8cd release22-maint
+32870 699746633246c7296e522d6edc04432fb7e3c265 legacy-trunk
+32871 f05bae412b71b245707f037121e1a71c9a1c62a7 release22-maint
+32872 98567065064b7bb597b23108d08c20c66fe6e249 release22-maint
+32873 0523f09bb3486756b7ee9e320b4821565669beec legacy-trunk
+32874 8560b146f41f1d07c26724234991b65520f1879a release22-maint
+32875 f15626c764186739e714db9d11af62ed31d96899 legacy-trunk
+32876 27ec1471dcb6a92f2a119115a586065fac636f2c release22-maint
+32877 ea2958bd4271ff166362fea9d5f8d60c735aa801 legacy-trunk
+32878 858d568ebf7631107a1ed18b40b3b10bfa5be1da legacy-trunk
+32879 f3f306457b430ea19d7de7946b7b7bb851450f09 legacy-trunk
+32880 3aaf24b949dfb620915c69053c8d67cc7dc51358 release22-maint
+32881 052c6263df269a264c2184fd838cb6da43e26391 legacy-trunk
+32882 108a1006a9053a4fc36c11205be6815361705dac release22-maint
+32883 f7dfaeaa4ab988a546aee2a8db1afeeb37f967d0 release22-maint
+32884 bd82161b61e556946b248a20936ca759c6ce6e71 legacy-trunk
+32885 67d560d608ced76afe1e1b4572dbe236d96a6a2d release22-maint
+32886 856c81f71213da23e9604fbc8ef9fae91d9b7020 release22-maint
+32887 eaf90e850d12e9ff107b5fb2d45434f79f7fbe20 release22-maint
+32888 377a29f6d68793d687b197ef7e32bd183647023f release22-maint
+32889 f3d1ed1411882d58e1c992915720095876816ad1 release22-maint
+32889 ac77b91342534d09b1e432e1dc3b70dbbec3a919 release22-maint
+32891 068529a909926d4f603cf0b6d6a0d4a3344addff legacy-trunk
+32892 752fc5ea16b9bd13fb16401d2620af55990935bc legacy-trunk
+32893 35d700d9015e05888cb0cd9b676b84abb6e5f6f9 legacy-trunk
+32894 e721025cca0939fa65e2c36dc26404ff40dfe69f legacy-trunk
+32895 387d7c2216a169b6c66d84f8e41b2348cfa630ca release22-maint
+32896 d72ad07c739ea2c8e35601f9762f932c5e97652b legacy-trunk
+32897 64227f8de7dac1058404456cdfe4ce113f4516f2 legacy-trunk
+32898 23ad8b5d7b4a0ef368974d306e16e9e4f05b48d6 legacy-trunk
+32899 ca0c8137de84455eafe192485321667d71b0cdda legacy-trunk
+32900 39b87167846753d22550310e8e5b987dde26c006 legacy-trunk
+32901 1c32d4207404a86445f190e044f171b759f56b85 release22-maint
+32902 2f42875d937f24d54d799af77329d317e1acdccd legacy-trunk
+32903 893ae526677653f30a35edaeb5734458be01538c legacy-trunk
+32904 34609fa35b11c17fb53a5349f220e0409fbf7898 legacy-trunk
+32905 3a8b1d16b7c6cdcdb552ad14dcfeac70865eb3f1 legacy-trunk
+32906 0b76679bf3f98b7741cfa8e8652d6957566342f8 legacy-trunk
+32907 b4c92e9803a621234db6eb49c6f24dc73f6b206a legacy-trunk
+32908 be70b8477f43d08a68279818af8a0b68f4fe6ee6 legacy-trunk
+32909 3689b0055c2db2296a9e9a997ac2a505192dcff3 legacy-trunk
+32910 b909fdf0edf8dde0c6782857709a2c0327f1d5ea legacy-trunk
+32911 dea38116c373526dc466e1c7298615071db7ca66 legacy-trunk
+32912 18c020463965d029df7c103fe30d4c8df49d6976 legacy-trunk
+32913 f1e56748519448bc9c04c202a4f3bcf6629cfacf legacy-trunk
+32914 161f05f4680d9d3d82775fc9c91a12f0467e8f67 legacy-trunk
+32915 34f42e3450b4d62c3952e968eefb88fae92b2b6b legacy-trunk
+32916 7ea550ecf43d74ed433b5298dad52bcc02fd5b5b legacy-trunk
+32917 45c6be35733fdd6af8bcad5c7699e70a138aa7bc legacy-trunk
+32918 a9d778bd965368833f297cdcfd8aac69f107c649 legacy-trunk
+32919 74da4d2eaad3679bee75a4765b14000b1129defd legacy-trunk
+32920 d23e9320d35002d68a985af11321800e4515b486 legacy-trunk
+32921 3c4d95a4ce177e7bbd9d8006d85757a63d7ee04f legacy-trunk
+32922 7887fe3a9a8ff6a9a7ad821940f56f565e3bd648 legacy-trunk
+32923 c56338e087cacaf8c041f6bd0b01e2a20e354411 legacy-trunk
+32924 08630919bf52b2ec934c1096ee1184b6b1b4097b legacy-trunk
+32925 8f73df0999673402a3bc00c1e8eb8637d6c0fd5d legacy-trunk
+32926 b7cd1ff0019b9adedc3296a26588f3e632e9f466 legacy-trunk
+32927 897812318ff41d49702d8578c00887d2d737d303 legacy-trunk
+32928 df80a5b6957b5ee5a7263cbcf68b34122722a123 legacy-trunk
+32929 a043af608e94cc73112798595a3a39cfcf80192d legacy-trunk
+32930 fec7f33b697c185a68e8421cfb2f7b5b5ea831ff legacy-trunk
+32931 6673053edad3f3d98eb31290a0843ba40cf6980a release22-maint
+32932 cfba76f7764358ff2491d5135572bd50d3b4b35c legacy-trunk
+32933 b372b903d10e7add3293a977c0e918735484df3a legacy-trunk
+32934 8f2c5cf61763906c32fc8d68deea6bd70d519bda legacy-trunk
+32935 4992c60d422b28d1feb6b33abb8f5acd166554a5 legacy-trunk
+32936 c325e8f20d6e94095f30e07a5080ea52314bc7c9 legacy-trunk
+32937 7f130a4370c9e34c65fe9e16aed3effd1a8c9d1a legacy-trunk
+32938 8eeb1df69f35751743ae07a14e87068296480d67 legacy-trunk
+32939 949f41829f36f4f7d3faf7d94c5326fa48882422 legacy-trunk
+32940 a5c8eca54aeb01f3306e9bded82175fa5827d8bd legacy-trunk
+32941 de41f3cd647445214fcf3fbb7992c31b96fa38d3 legacy-trunk
+32942 0437cf4b9eec1e2f023342c9ae6e7b3cb4ed1a7e legacy-trunk
+32943 811ad5f2f7014c11feca57b2c973905c27dbc740 legacy-trunk
+32944 b5badd3a8d4f3918fc8ac5e03068952f8ba7987b legacy-trunk
+32945 70626c573ed71dd9b6c1ce25df7f445fe30d1518 legacy-trunk
+32946 21451f76059631cca95f2e5f7ad9d9a7b858723d legacy-trunk
+32947 e8c4c15f459e35ec0c88c55b652f4ce71432da29 legacy-trunk
+32948 bd349999cb0828898d80eb1dcb5ddeeb8a0d625d release22-maint
+32949 d46459d82a79278e593846af922067d2cf1e7266 legacy-trunk
+32950 7f7a078046fb5c10bf3177275347490472d163b5 legacy-trunk
+32951 c1e80f2f1c471a23cd766b6163e7793fc5862e3c legacy-trunk
+32952 b5478d1dd67edd9d66e8ad0e9d9f64cbdc2b702e legacy-trunk
+32953 0beb1a6514435802d03134ca07b50ab09327057e legacy-trunk
+32954 732836666000323fef52377521a66de16925bb14 legacy-trunk
+32955 98affdbc416c410994d558d5066771b7e5c0d5c3 legacy-trunk
+32956 08a1cbdd0367fd01b2738ce3ec5be5a0768872f1 legacy-trunk
+32957 e3aefeba411609a22c75f937015a4b1eacc8eecc legacy-trunk
+32958 98d81599eca74ec33ebfdabfed97e30efb287415 legacy-trunk
+32959 c3a02074cbee9b6ae83879806295b086077f7bca release22-maint
+32960 e6f8e2687c6fd57524ea6d5d8ba69c1153293a20 legacy-trunk
+32961 6468f0e1f4a85bbedbf4c53952cbfe7b2aeb1ffb release22-maint
+32962 ad1e67ac567b872994cba9e6c8c4a0da93512c36 legacy-trunk
+32963 46294eddba5513bbb5415b32ae8781553b8b4140 legacy-trunk
+32964 671e9c3af4f385fb88ede7e667ce1bd64e755e72 release22-maint
+32965 ed70779f64021c90efbfc0387522a5ce22251cdb legacy-trunk
+32966 b1792a618e6dbcbe11e40763daed2ebd8ef01139 release22-maint
+32967 dbce556cfc96e90709f4463407446280138db2e5 release22-maint
+32968 51ce69bdf4186e820147941de4712925a504cc43 release22-maint
+32969 c291ca2949e92641e6cfae2c5d68f07cfcbe80fd release22-maint
+32970 272c75b1d22ebb05fc7be2b0577ea08946edbd70 release22-maint
+32971 f44fbf74eb61dc28c17ff8450335269afb886d07 release22-maint
+32972 f7f46d673c61c72cc8cd093c017fe0ffd74f2e20 release22-maint
+32973 65f7efd35f11901c70f5c97b2a9fdd73f3a003a5 release22-maint
+32974 b31c84ba1f3144f5047565af43711bd3a0a6c42c release22-maint
+32975 7746269b951cdd62cf6908bca4b1275805f7e103 legacy-trunk
+32977 bf2dc0d17148827d60a6fd2c69ff5bbdf4836bcf legacy-trunk
+32978 12f9ea32f23a52970bb459ef26699a73bde30fe8 release22-maint
+32979 008cd101269df68296804f3174bc952c70b4c020 legacy-trunk
+32980 7bec628998fe9e757267e56abde3dba68065fe8c legacy-trunk
+32981 e950abc329227ab68005747100dcea6750904264 legacy-trunk
+32982 3682aa27141b4422ce6aef9efe9c9bf7469e44c5 legacy-trunk
+32983 8700a1c7016b10f0988d9baf3641afbddcd8752e legacy-trunk
+32984 63ab50ec4a46615af0d4695716fc88a2ac4653da release22-maint
+32985 e4583d166cbcd7986ba1b4e2a2108128e19ec082 release22-maint
+32986 29ab1c923f75710a2b94df381a7a23074e0fc2a7 legacy-trunk
+32987 47c725a32b0ec10f8aae7e707c1a67f9a43bd5ba release22-maint
+32988 c001bb0005580d2a569ab2e72eda227a6d5fc07d release22-maint
+32989 83a2e7133b010553b54756057cc7831183dca5a2 release22-maint
+32990 890cd7a2223efb9688462bee4b4cd68bfbf59f75 release22-maint
+32990 f4f134ad46abd0bc973d3f6094ea56e62ac5c492 release22-maint
+32992 f9495815c18f319d9629df4b7456259d646b7e03 legacy-trunk
+32993 f409b33c29ce49200e3198173c37525035341704 release22-maint
+32994 fc286e28556f7d86dff8ffbc205fb37ee85e3721 legacy-trunk
+32995 c69ad9227afd4f931b74ca56602feeed217dfc9a legacy-trunk
+32996 6abcb690b47b54a7a8b585bb214c94a07c8355f1 legacy-trunk
+32997 d89c0837f8f4183155d2545fd55d80264ee8b4c1 legacy-trunk
+32998 e4f70e602598d48ba2b429d575bedf2302b7b7bb legacy-trunk
+32999 97fd1f49f026aa504c5caf7a08679ce669e3108f legacy-trunk
+33000 b3455c4c17988778d78ca5b98cb8d6c95948ea13 legacy-trunk
+33001 75494aea47ca7265491ea2417a3c0829daeb5483 legacy-trunk
+33002 4585ab0da00377baf0e9ca0feceb0fe36d5503ae legacy-trunk
+33003 f5891459b813ee244e5d53fa6b0893da49a04d8b legacy-trunk
+33004 2f731c57cdc68f5940d03f9908c8bc9486ce4a7a legacy-trunk
+33005 27bd4cd02bb87e377153b3ee2470cf03201904c8 legacy-trunk
+33006 fb84e0eabad4e4b3d1680343b5c6da298017ec70 legacy-trunk
+33007 1ae8b674090652065cdd8aee9140bcca4053c964 legacy-trunk
+33008 b1395014714ad7f06ce2fade61d8ef4a159feba7 legacy-trunk
+33009 b52e0ad30585880e92666a24770f37dad46abbb9 legacy-trunk
+33011 53d9b4eec4ce0a284fbc50fd252e3ab5562ec7a0 legacy-trunk
+33012 a369336224dda49539a1dcd64597d8124c5d56a7 legacy-trunk
+33013 20894dbc7f6a8a571244253aea17158183f46f27 legacy-trunk
+33014 b1eb2a4756bcc3293e91bf271ca959750fabb44d legacy-trunk
+33015 ed949b82f95d9c8a4b1974a4400cc181e1036666 legacy-trunk
+33016 3f10a29e0e6a1ae005c5f205f095c38392e569d7 legacy-trunk
+33017 fdac9b4d37172513299748afa3b79432f7e43f3c legacy-trunk
+33018 f82b6d2b73f111370a8c84d293a883d992c360fc legacy-trunk
+33019 c66100c09ea11627d49009f252102957651a4da6 legacy-trunk
+33020 e0f071b476fd16fddd7ab85ab93da6386fd7a1a6 legacy-trunk
+33021 72ce7cc03f27fd2622ee724ff170ac2155ff2165 legacy-trunk
+33022 2616fe5eeee178d363c425023edcd61d1f82ad36 legacy-trunk
+33023 ca20c3cbc956ea323bb98dc90799cce925683fca legacy-trunk
+33024 1219021c4865ae807f33140a05b54a268f35ff84 legacy-trunk
+33025 58c1ad417ee7caed428aa2226865498f08b815b5 legacy-trunk
+33026 c01edc35ffd676ba4a66b0d1dc0b5d952e81d04a legacy-trunk
+33027 8c6d4da5ccd3f89d5e57eb192690bd8faffb99f0 legacy-trunk
+33028 20e1ad3ae8bb0ca1a23ff06538efca461933e1b3 legacy-trunk
+33029 9e7d22930daa12f27a57c2c0b064d2f595252678 release22-maint
+33030 23f6101cc87ef1513a942975cdba1e34fb78ea4f legacy-trunk
+33031 2e2dd6143943977ed7e734050609f938fa2ecae4 release22-maint
+33032 4081b490d54cacf2101f271ea762e7961588eb2c release22-maint
+33033 c055979300f178052271066ac4bffe23ccb8b0d4 legacy-trunk
+33034 24e74d6879800bbbb333e079af475a783adc0660 legacy-trunk
+33035 347e7b6dfd53ad9d71778ff14f299cda28c01165 legacy-trunk
+33036 24fff32ed065c33dae039c59f79814bcb0e66c82 legacy-trunk
+33037 15f1dc5b7ddc1cf614b6b2d5b004db27cf1ba2cd legacy-trunk
+33038 585e303a9491350c806908ca42e767ec26a40ba2 legacy-trunk
+33039 0d588fadc1f82ffaf55e555251523743a55b2a70 legacy-trunk
+33040 2d39ec0e55aa5fa4dbc3c23876a897c9e60813ab legacy-trunk
+33041 bae6ce6d1e5a37d26dc10a673eca589601fdfd16 legacy-trunk
+33042 cd5ecc5b38eb8597f6636154067773b6fa95d013 legacy-trunk
+33043 eff33334ca6737d20617419fa5001d14ef0d48b0 legacy-trunk
+33044 db46cedaf7ce20b21440913a4756c78ac146c55f legacy-trunk
+33046 857428cb418c7c8e3fa69194a36c77f02e15856d legacy-trunk
+33047 654908847eef8bf60da656fdc0f043dc72e7b090 legacy-trunk
+33048 3b2e2b14681c02e0bb2339c137b3c60a7d20bb9b legacy-trunk
+33049 9e1f8fc5e71d334722b61377f7300deb5456b77f legacy-trunk
+33050 26e07a684890cbcc974bf668a2d81a29befdd1d8 legacy-trunk
+33051 ce25b4d746ea10067e0ca35fc5c1a7ea346b7bc3 legacy-trunk
+33052 92ffe502112819f33c6711b1ce391fbc7e32668e legacy-trunk
+33053 fa604af0cdbfb631bf4b14fff85e6e3725c25f5d legacy-trunk
+33054 61e966c9ece8d908dafc5c0324ea51d0561dde8d legacy-trunk
+33055 e6b0a406dc31ef42effd861e75cbf8dfe5f76788 legacy-trunk
+33056 525766817eb68b62dae100c4af76bc51c08c65ff legacy-trunk
+33057 b0a7eac6c651101b7fb703597d97daae1a557672 legacy-trunk
+33058 83236f58e68121e3652ee9b1f5a2d82524dfa1ec anthony-parser-branch
+33060 cf0baaf16e0d7f521deb00e1f95cdddfb4404205 legacy-trunk
+33061 a2d4c64f5b8b314b53e4ada067b96a75defb7c6d legacy-trunk
+33062 d1a8c732359e7d9412b20adcc94f723149fe7283 release22-maint
+33063 8c5a6853a02adb81bd67ea8a08f4c26f5172b8d7 legacy-trunk
+33064 beffc73666fd20ca38b63d4a3b46124cf3eccb61 legacy-trunk
+33065 3b54dff133101ee29b948ba0817c946edd4eeb40 legacy-trunk
+33066 9bb6f3c5b04a3ef8cec14f0e30f774aa2aef8a8b legacy-trunk
+33067 31b2cba64b399bf5931723e166391bcc2783155c legacy-trunk
+33068 29760056884a9e71521eae50fdc6a36b1b329e35 legacy-trunk
+33069 f2df9c9f0fcb609b6e9684699820260c0ab6c3ab legacy-trunk
+33070 bac2c0e7c20a12225000ae699dd7fa8c2f7a1ca7 legacy-trunk
+33071 356bb59c5486b2e5eb2b1f5a2a29edeb66b9580c legacy-trunk
+33072 64386464f71691177e9a42d71ba4489a1eace1aa legacy-trunk
+33073 0a40c687af5ec968008032e74de2b1540326a803 legacy-trunk
+33074 88951a5fd2a9eec03f47159ac178b50b44f6084f legacy-trunk
+33075 ab1d85f98485687550b126c43f25b18b77017c28 legacy-trunk
+33076 9e1d7809a99816ad9a07952866009a6bd22b8e17 legacy-trunk
+33077 19f4f48bb02a7e6e014c3d3f29fad514b2362f36 legacy-trunk
+33078 5a8fd5b3e4c40510b05780acd39f5e61ba878507 legacy-trunk
+33079 f87fcd0870bf2c986dd1d8053021e343d244b700 legacy-trunk
+33080 2ba5ec6b3cda2fb0e7eda5479640ba3e70766545 legacy-trunk
+33081 cf8ae3b0dcdc970aa894e2fd0dd016006c1267af legacy-trunk
+33082 7c49831d23c59b07b66360d7478329082d9d7fcc legacy-trunk
+33083 fc392dabe2e30f0ea8e90eb3c2d2a8086538bd06 legacy-trunk
+33084 b6c271ba03e18144365a38721f6f36ea00c394ce anthony-parser-branch
+33085 089fbe3a114ef9bec64ab59d6d77053d2dbb600c anthony-parser-branch
+33086 0d61a27c38969e06846ae9cfa91b2c12e7f5b4ea anthony-parser-branch
+33087 ffd02baab259320e7326c09763791b7f677c943b legacy-trunk
+33088 70d625ff562b5d69c359b74c4c2d46d3bb2ded3e anthony-parser-branch
+33089 923e6fb855ff4f7a3732b3ae440c1b355bbcb155 legacy-trunk
+33090 edcfef944e2f406c827ab116f80fb4a643be95d0 legacy-trunk
+33091 5c56bf3cb2055085292984b2e28859a117edfb73 release22-maint
+33092 c481c686275a785a593045f0da0995c5a86c6a60 legacy-trunk
+33093 b80a22250e4f11a4b47b5a01cd280c855db5cc54 legacy-trunk
+33094 efed68973a3bef34082273605b2cdc7dcdb7cba3 legacy-trunk
+33095 e2f2410c096e03f3d420f7a0307ddae5e8aec26d legacy-trunk
+33096 193397c44ae5164f2ec0783f3e04095eddda3844 legacy-trunk
+33097 e69e54552d108db674447bdff8839d97e2c5a6c2 legacy-trunk
+33098 0ba7c101648ac828340c8e4e7354fbb8581fe5df legacy-trunk
+33099 fa48a90eda125aeb2e848b1e096a3fe6f10f7c94 release22-maint
+33100 179d5452bb9d9f6114a4308dfad73a81f872d686 legacy-trunk
+33101 b40902b42290db694efe33bc2366306e6109cf7e legacy-trunk
+33102 7b7004393b5b26f253e6f1c1e157eea45cb17c04 legacy-trunk
+33103 52baaec7e5cf089f3516568d6158b2af8d65ad2d legacy-trunk
+33104 17431ba8cc4bfada32684aaef471625ca5715f19 legacy-trunk
+33105 6fecc99afa69ffd480a292e620d501ee6e75473f legacy-trunk
+33106 bb19134e0a4d0b9e44332bd85ea97c30d43daef3 legacy-trunk
+33107 8d160095eb6683e3c22a5897639fdd677307d842 legacy-trunk
+33108 e5d03360571d97cafded423cc868a9e62e06334a legacy-trunk
+33109 e9953b399d553d5cc8df0ae9a790742f42c32136 legacy-trunk
+33110 2cb969ffe1bf28e54b09fcc6477a5bef65abf926 legacy-trunk
+33111 5c762752782c293828d0912cd54fcc470539e4c2 legacy-trunk
+33112 2d69a707c492985492a31f3b57753b9b2d255a75 legacy-trunk
+33113 56343816b5897f8af702f25a0d1580e8696d3255 legacy-trunk
+33114 05058d8134418d48858453e114bf09b4dfcc2896 legacy-trunk
+33115 3016a19e320e6451706f9e0f57c2c41b7942d3d2 legacy-trunk
+33116 efad59f39564bcd948179717cbdf86b0b6fd8d1c legacy-trunk
+33117 9b72558a1eb9f40bb2c0a4be171981aa765a3188 legacy-trunk
+33118 6d160ee37196559e3dc6237a77775461530ce38b release22-maint
+33119 1f334198e6d763c6c0ab78d8082aa479da671d33 legacy-trunk
+33120 b822c2a8e08f4305fea4a67f2a5addd5bd5ec292 release22-maint
+33121 8bed55203559f8dd5c5ac391b76ac7f241b79ed8 legacy-trunk
+33122 21bfcb7c976db5e43c8770cb561f52af5da39a5d release22-maint
+33123 9883cf8ff217c9ed88253dc4e41a12db7ba29daf legacy-trunk
+33124 8b1766c8ad3bab4e9cb150f240b828d76bf918ef legacy-trunk
+33125 062e342ccff58b6295354cdbf10f1d45a243b001 release22-maint
+33126 74a28f2e94cf9e292eeed81085f956555fb5f6ec legacy-trunk
+33127 2cb8930ce2259926ae4a79a7b9cd3b9cfda9622e legacy-trunk
+33128 1e2e54821785f9a4ebed6ef87fb44d85d7c2c973 legacy-trunk
+33129 3523ba92450ce641606c897d2d8ce4d09e8123e6 legacy-trunk
+33130 0415af63412258be1aa45d691dc65636cd8a235a release22-maint
+33131 5c5b587464866dd3d7337cb95a13fb4e9bca526c release21-maint
+33132 0cf1ec58e220ba6862a1499b5678a74b54bef05e legacy-trunk
+33133 a721b094f7bc2dbfd7112556be60fe5441a054d5 legacy-trunk
+33134 4f076fc0195ac2624aea478f8ba562df443d31bd legacy-trunk
+33135 1ab9978123becea145f090fa1fa0a11b4162cd3a legacy-trunk
+33136 14a1547129fbf5ebb228bc829bf00a0f192f32b3 legacy-trunk
+33137 331af45dfa0dc0178d8af3ca251a77f918901390 legacy-trunk
+33138 4874614cc7a3570392d3ec9fafd7e66cd2f69955 legacy-trunk
+33139 51060b169b3237a4178061f9cac1fe3703108d85 legacy-trunk
+33140 892dfc9e72567fdb779f9722e0a410440d848ace legacy-trunk
+33141 deb9715bc8ae7c00e6c462e9395260e11a3ce5ea legacy-trunk
+33142 834cd1218f1b4d24585e8000399d3bbef56c9fcd legacy-trunk
+33143 086bd9e7d2442a0ba6c35ead473d686bdbe318eb legacy-trunk
+33144 06f28adea6d2c091ac887f3b7ef1946d2db65630 legacy-trunk
+33145 bdff965d2603299ac661ec334328e809ad7317db legacy-trunk
+33146 23e7b2577a468805bf6260cb1fa65464b0899e0d legacy-trunk
+33147 3133b50e99f3265f9935941e44d28b3a5cb9caed legacy-trunk
+33148 87a253aaa0d52137cd75136a65c476333770c44e legacy-trunk
+33149 81e70f12d62fc84779b52d256c3d87bfb589a119 legacy-trunk
+33150 1386f86c5095f47594634eafa1481cb5001d7f56 legacy-trunk
+33151 5143cfe7cc75cc044f09f50df0c18b2fd8399284 legacy-trunk
+33152 60daba93775c523603659d565b33bcb435b1b6f5 legacy-trunk
+33153 9718df849da92102db5d0684e693f26e2261c75a legacy-trunk
+33154 08904660127065929e9b42ab3d25c86d60a33006 legacy-trunk
+33155 5220474660ce81d268848cb78be6d12f1848fb87 legacy-trunk
+33156 abc2a20dc3a334c2cf4a85c2caddba2ed272f59e legacy-trunk
+33157 40c5f1c08ec8aab0d1f8cae0520af683197d2461 legacy-trunk
+33158 100708eb8c82d2c787b9d75e7d3b89948a94df60 legacy-trunk
+33159 94f9107d9a63a9d9a2e9225733005ab47285a727 legacy-trunk
+33160 6531c76b604dcafe2c254cb4c55f18b93dbeddb7 legacy-trunk
+33161 1402f265e48f613baf9eb374c50440d010bb19ce legacy-trunk
+33162 d0d4d696ab24e8d6283e95c32a1476769e35b9d7 legacy-trunk
+33163 aa84ede1c364ebdcf52ef3656bee1943924d3052 legacy-trunk
+33164 6c6b321d1d10efd1f040d5151acf700387e6febc legacy-trunk
+33165 71c06bc5a73ea1b6e653926db126955744143940 legacy-trunk
+33166 7e3363a7661d2551cc65e68d3d241bc949438808 legacy-trunk
+33167 d72b3f0a57a9dd2c740484bcede2a8fd83ddc608 release22-maint
+33168 5f01d5158d1f86e233cdb3049cfaf33b3bbf4c9c release22-maint
+33169 db43129474940d80479bf01e911b7949adabae20 legacy-trunk
+33170 11518b6ce5ec03d39f51bc866bcbfe166aa4146d legacy-trunk
+33171 53554688e5a22e8fa250ead53cbbdf22fe9643b4 legacy-trunk
+33172 29eee5c1dd42fc8a4103801c282530faba37eb79 legacy-trunk
+33173 01e925371d7c94088ca818923e1d1fde01064fdc legacy-trunk
+33174 d1acf89d1c49a6d60115fef34fa488b6030dbfac legacy-trunk
+33175 6444ea3dc83c44e15821847269b10f4bf6465dbf legacy-trunk
+33176 e54e2de46bc3d58737f4f73bc92189d50f242bea legacy-trunk
+33177 ca9e3598ccfb5ec81b3fdbc9f9f264da632e5010 legacy-trunk
+33178 231a3510e246fe0c943e56ab04cae88765f867f1 legacy-trunk
+33179 d761ff55b3bef41fe52fa3e95a67c8b19c16d808 legacy-trunk
+33180 94ac1d42a4204f2d0b86cb48a48cc04881b35a2a legacy-trunk
+33181 05fb51d07adaf5bf314a8785ec850a2e0429f988 legacy-trunk
+33182 c6eb569e4b79309b850a8c8b2520bc94e208cb6a legacy-trunk
+33183 5d11fdfa7c008475005421b3c1d450c0004bb72c legacy-trunk
+33184 b74e0cc21cb044fabca55e2a885ed9b4fbf9bd68 legacy-trunk
+33185 70e649fa3fcd13916a8ab254cea605cae770eefd legacy-trunk
+33186 87f30fcfad48881a23a37bc61bf7710397952e42 legacy-trunk
+33187 b1aa1d439cba355eed902e1e2f167d04591d555b legacy-trunk
+33188 fb332a0949b74f56315f743673693a627bbbf08e release22-maint
+33189 f6d503de45bde0f9f1a4388cb38502b6475e300d legacy-trunk
+33190 f67e4c5aea937dc3814408448b576e83d2d36056 legacy-trunk
+33191 7aee6ef596ddbde6383a965d51863a50e49ed45c legacy-trunk
+33192 f48bb94f328958328726e838dcc24b854ffdc91e legacy-trunk
+33193 f175f779be890b7f9f1d0b08a510b79c15b60174 legacy-trunk
+33194 ea77d43e203d1f56f50c15b94efe112237fc929c legacy-trunk
+33195 2fbd256a1db25626bbff41da6c90f86980ce0b10 legacy-trunk
+33196 0b5322b853d2f751b60310bd6b21050fa4dd38eb legacy-trunk
+33197 8b0300e7f1dcb199019c69f38b0f06dbd11dd2ed release22-maint
+33198 c64687cd5b371d232383923f7b08f55468a3f6d7 legacy-trunk
+33199 34c040ddf9e8ead2445a21d7b2bd0a915f57e84d legacy-trunk
+33200 cd62b3359e9560e5f8745158426cc0e3dd483b38 legacy-trunk
+33201 dc6c21dc8684e06397cc016d22c7057e849af8f7 legacy-trunk
+33202 fafb6eb0f97e8e4c694235330e3bdebf097ea635 legacy-trunk
+33203 c3bc7ed9d31599e0e0f9bd3884e6e64bddeca1b6 legacy-trunk
+33204 2d4027efbc12e22fda2785eac3cb3e8060af11aa legacy-trunk
+33205 69bc7ca5cc1a8f501f93682a00f908c21be569c1 legacy-trunk
+33206 e228336aaf08d7c357a3d066f8aa2c970abf56a8 release22-maint
+33207 9197285a39335e04b2e444ce49b328a3f3b404f0 legacy-trunk
+33208 32592f1a6f22b499a212c6868fc399f880654689 legacy-trunk
+33209 6fe023690d7f10d3cc506bba5f16bb37700859e0 legacy-trunk
+33210 944f602b78fe4889a124c2af3bec089d9e02720c legacy-trunk
+33211 8780a49d8ef2c143fb65812c5143135fc5265d21 legacy-trunk
+33212 7c7f4045ba3671a0209064df69e5ff255f4f27ed legacy-trunk
+33213 4d1fa9c5cb2cf25d90cca71623bfb77e97c6a065 legacy-trunk
+33214 e973ded8a92a88285e0291002bbf18b2c68ec55b release22-maint
+33215 5200287889bd2a4104ee38b27d1d53cd13128eb4 legacy-trunk
+33216 6a5e95c67d321c10589d93d9e2d0264866e42858 legacy-trunk
+33217 1a49869223577203e2435bdb4f0d07026adc1680 release22-maint
+33218 4b86dcac2201076d6396ee0f20f1a80145b43901 release22-maint
+33219 de3d49e0f64913c03891a0e1b67ab41d514e21a8 legacy-trunk
+33220 4272322b92e5e9e82566d222dc66859a602bc867 legacy-trunk
+33221 e5d3b1d89c401800d04d7ad405fcfa29ff3aaa27 legacy-trunk
+33222 958b40d80b331830d033bacc2aa00a0cde8437c0 legacy-trunk
+33223 a296214d2ebba3170d191808ca83efce11335d97 legacy-trunk
+33224 71d3da115838f331ae0f4b58dc8b979f970dccb1 legacy-trunk
+33225 448c1441964fd60e9bdc57d8894dc13d715b65a6 legacy-trunk
+33226 756468307e6179fe84f1d8d345709d25db5612fd legacy-trunk
+33227 91259ae35e29946723991ca6986b33d81994742e legacy-trunk
+33228 8e92cc04b64b0004c22af74025abb1d489822b77 legacy-trunk
+33229 d15e2b7d991cc90b1554bc864db27b7f13d9cf78 legacy-trunk
+33230 ed45a995131268b24ce0c717cd3947dfcbd48d48 legacy-trunk
+33231 ad02a38a96ea9edea1e272fdd37a46cec7337186 legacy-trunk
+33232 f26d13236ce84a809ec27b651cf7103c2ce16c58 legacy-trunk
+33233 1aa9057c38b4ed7a8b525a1caa0113acc7216b1b legacy-trunk
+33234 eed7430b7af14a7f59e3c5e54984d7ab380168b9 legacy-trunk
+33235 5c8737bd4ce6d4fba52513de6f5fb3cd1a124dab legacy-trunk
+33236 e2f7834880248d4c325fbc389de89db8e2819eb0 legacy-trunk
+33237 cdc75de2f5c1a64f3adff0b47a3f082d80bcf46b legacy-trunk
+33238 b8b57bdbfcedf4c8f14604024315f0990c94642c legacy-trunk
+33239 f93b919e57290ed26d52721a2c2f6e1dc489c421 legacy-trunk
+33240 169e01ec359659fce3a63a410e440a65e37d44be release22-maint
+33241 5623f9e2b555f0e97006ca8a0c21ecd4466e2609 release22-maint
+33242 60ce73ea9c92f342f552f6755ece14ad0ec6a1db legacy-trunk
+33243 a9a93fc50b8d8ae7878b61c5ddf105a2ffc40636 legacy-trunk
+33244 312fb76b73cc7c74d1916dfa723e5e36254f2cf1 legacy-trunk
+33245 ee14e5b06ed136b12383dab61d1629ebbac7779c legacy-trunk
+33246 7fe4e9f166347b641fa4ded6d3cdd4d6cd2145f8 legacy-trunk
+33247 da0248fcfc5251bcd710cab1517d2078c204855b legacy-trunk
+33248 9df1f3d89e600c4187e33d9514b638c11412233f legacy-trunk
+33249 8b163370372ddad0e03406488d05b0c5991ba6c8 legacy-trunk
+33250 7f79ead712f58d471df7a44306735097123434f8 legacy-trunk
+33251 9965ebcdd172f92f4108f3530a5a590f4d8aca60 legacy-trunk
+33252 b78d63dae03076e9cda7d5f7f634ad953ed0cf82 legacy-trunk
+33253 8807e901c526cb44bb9a660e36978acd2c76317a legacy-trunk
+33254 4a3ef38078e55157d37ed4b928085484907f16a5 legacy-trunk
+33255 9a3044e5781eaac5884c6bccbe18e622a03fa936 legacy-trunk
+33256 a40cf1d0a887fdfb7c6e329b3d712b7fffc4b4fe legacy-trunk
+33257 eaa062fdd46ab0265616c84054d839b2a1ee8bb6 legacy-trunk
+33258 8911ca88981af862e63e4aaae9cb24ca7c5b7a8e legacy-trunk
+33259 b35ff9b5914931c38880d92709f4e69522fec43a legacy-trunk
+33260 466b579e00882262bfb12a2ae31158a319ba4e78 legacy-trunk
+33261 201ceaf959751f442a3a609b765bfd2ffc205e87 legacy-trunk
+33262 2b13b58ae3a8e7637af843ccf724855092669e57 legacy-trunk
+33263 ea384b1d0d13dbb677cc196f46214c01e258239e legacy-trunk
+33264 7b519ea7501aabf28ab3a91e81581fe429c5195c legacy-trunk
+33265 caa8c120e2cb2b296d607cfe3dbd09c993dc88bc legacy-trunk
+33266 fea8dee27332ffcf52f595e1fe9d8412623b3b76 legacy-trunk
+33267 8a2916c433d94fdb2c94773695d5aa49861a4118 legacy-trunk
+33268 e43126c470a76ea9fbd3b92e7e8b78af631ff795 legacy-trunk
+33269 2d16c3efe147e7bd44b7d78f4ffcd3f4f5a986a7 legacy-trunk
+33270 60b53db14aa3cc41a2ceec847c850fbf5f8c2d47 legacy-trunk
+33271 be620007ec1f52652018601bfbe2f58054156a65 legacy-trunk
+33272 0169acdf2b5bc2697e17ae02d2656fcdc8563aed legacy-trunk
+33273 cd3f9b170c37fcbc192a7c0e5098eeb622dea03c release22-maint
+33274 cac855387b567b69670ac8dbe689763b8f630ebb legacy-trunk
+33275 86342fa8920dafe30bf1d3f995bd6140791dee61 legacy-trunk
+33276 0bdb4aced6e20d866cc35f87f7ccc8451521d59c legacy-trunk
+33277 cd093a99238d723647d92e24c7d559f236a3b48a release22-maint
+33278 4481c5bda1966ad860a169e3001ce6970099c469 legacy-trunk
+33279 1ba90d51497ba685700d8f004dfef09f441db01e release22-maint
+33280 badcd158d81ca23f6179a496cd1173e212edd1ce legacy-trunk
+33281 58251e0a8b787bce3b34f5f5fbc09bb384df00eb legacy-trunk
+33282 f8069f7edd4a29bf6c504cdfdc4a9549014fbb55 legacy-trunk
+33283 77eda0fb0e149d47200e2b8481e98bb2d1a3f686 legacy-trunk
+33284 ded9abcb9174aa774d2a7552d41ecd1e599a3202 legacy-trunk
+33285 7d30585a593405515f514c4835e4ee868dad1900 release22-maint
+33286 853e6a2b9068ee64321431711304d5ffae9d3b1a legacy-trunk
+33287 a464020f15d6753887f62a74b1c099d6789840df legacy-trunk
+33288 7d41785fb60c6e4827ed6ba5cfe4b5d77ce42b5c legacy-trunk
+33289 ba12d2b4b31ddbb6ad492324fba185e86b1ffe8e legacy-trunk
+33290 e1fa07bf8548885b0929944ee0cddd6943fd813b legacy-trunk
+33291 bc1215f7dba386b5dbf4df1a2099b3a744180b3e legacy-trunk
+33292 a4d6bc71f091c27c9e4ae92b71bff9cef70de38c legacy-trunk
+33293 410b3c2222114c985b73aae1263bfc087dc4428a legacy-trunk
+33294 f883db25d3444bdeaa33ec039dfb0e9c02b307bb legacy-trunk
+33295 676aa62830d0e9952bad0ea71519930a31e78422 legacy-trunk
+33296 5304bff25e1834a62769fcaf77c1bac53bfc110a legacy-trunk
+33297 6aa972a21ac4c172d652d56f8ced9647cb2f9fa8 legacy-trunk
+33298 1ecdb94a18522f89ef7ca101e678119e22c26d7a legacy-trunk
+33299 9de82dbc3bd02b7bbe87b91f338b106f64f5da46 legacy-trunk
+33300 973b1e2e27263815d28bde80ec00f8a8ba3d8568 legacy-trunk
+33301 5d7e6e8282187f5d3417a3c24c1de87fc44e2358 legacy-trunk
+33302 7d5a9c1a019708460c1a6efd3ee6f45ae5061b3c legacy-trunk
+33303 ad2dca5cfe81a7707e8608109e8a36c3774f42d9 legacy-trunk
+33304 4909aa64405fb1c206f0d74e5d22272860fd5702 legacy-trunk
+33305 58f141d1ccca2995c1392218bfdd47b57769882f legacy-trunk
+33306 fa97293533a91f4dc69286bda69358dfee17d319 legacy-trunk
+33307 a63ea7c475cc5e2801d01f8dbe7edf89df1ebe5e legacy-trunk
+33308 61f98ed4b6b58d3bfcc26f84d887bf065f135098 legacy-trunk
+33309 0509a7652167f48af3fea15dd3d58fc645c41d64 legacy-trunk
+33310 d668a8336774781cd7fa06fe9d92d39cccd154cc legacy-trunk
+33311 462de9333251ca801404716bd64410292fd5c70c legacy-trunk
+33312 8bd2580e0155521dde3476313c162998a2c5bc9b legacy-trunk
+33313 3881883b940ec0e430b486342115adaf56614bb1 legacy-trunk
+33314 0a3751df41952b54f90649c901686fd98ae2d9c2 legacy-trunk
+33315 604542e591fa681c648879bb6c746f6fe77cd0fb legacy-trunk
+33316 16eed2e98fd935468dad2ca618c9d022660a5339 legacy-trunk
+33317 66b6d1ce42fe61e20394936baec9c7bf9da0d765 legacy-trunk
+33318 f9b8d4bf08fb9ad8a986180e110882db4f37c7fd legacy-trunk
+33319 582887ba7a68dd7cd426fcc98d87d7ba9fee8498 legacy-trunk
+33320 5b105a9503348fb2edaeb5b4022d0c732c96ac50 legacy-trunk
+33321 9551cdaf6e7e1a884223abd6ff357e176e011951 legacy-trunk
+33322 69619542a916e343d2b370141f02702c147981a4 legacy-trunk
+33323 9a4bcfddbfa12f15453bc2b75f96a5cc5dff06c1 legacy-trunk
+33324 79303de9a05a6ef3c8932e6e652118dcd7fb3cc0 legacy-trunk
+33325 1308d7ec99535099e3ebfff5e01d4066880a09e6 legacy-trunk
+33326 cb93b862532f49031c2d2627a5508ad303e65c70 legacy-trunk
+33327 3cb18212521d3489b05fc5da8410fa52706de0b0 legacy-trunk
+33328 d7626b80de951694af644eeaff2138eb90ac22aa legacy-trunk
+33329 710c09f4c05a23f4e324a6a7778bb24f595d3d68 legacy-trunk
+33330 ba75af7ab136f31a9d8bc8dbdf6e2a4f532f07f1 legacy-trunk
+33331 36a17904a3ed0060e4a1cc97fd78ae88f8d95076 legacy-trunk
+33332 96ecaab4cba68138c5c578905e97561a9d1e8cc0 legacy-trunk
+33333 be99f597068890cbfce27c03e92d74ce0d456040 release22-maint
+33334 66dc0501047d4c26097ac66bbc895a58e04ced19 legacy-trunk
+33335 4ff83c0b45e92522b18cd59fd50222157775fd88 legacy-trunk
+33336 51397edd2bd4d5d36a8573259823ac5578eceb13 legacy-trunk
+33337 f081147c0c8afab5484dd38ce77f558a68b25ce5 legacy-trunk
+33338 2692b1c92e8d91a362c5209c2e417f9323250743 legacy-trunk
+33339 052bfcbabb7b9d92f1ac96ce35f2d7ab7f64d795 legacy-trunk
+33340 364027a815b8cf2531e25c291875114d9aab31bb legacy-trunk
+33341 280fbe5f4e16ecc6ceb653beda55cffbbd267df6 legacy-trunk
+33342 d0f15977f37f4752c5a8761c469966b3d2a9380b legacy-trunk
+33343 4e1a47f5204cbe4198654e3351552c68a90ab30a legacy-trunk
+33344 c149dd4cfd66df1af1a79330118dbaad98b95618 legacy-trunk
+33345 920777640d2898d770d97cc7ffabf33813c8b139 legacy-trunk
+33346 d3880c237627fac5c57e4d5774bad801f0b8eb9e legacy-trunk
+33347 6d9ed54a482190c7352bc0d1ce196033bbf53ca8 legacy-trunk
+33348 eb0b67e3c04ec567a29a7e7415714778a3d9e9ab legacy-trunk
+33349 371092ce5c2bc33cd5f83097b8c94df3d27fd434 legacy-trunk
+33350 c5bb31e45c66876b008456338a5b1752195e401e legacy-trunk
+33351 9fe67f7f3459ab56798a5bea7e4b7a0a1c79d581 legacy-trunk
+33352 7a2766c9a7b58c8768f3b49297741801a7415986 r23b2-branch
+33354 f4e2e5a5ec622b117b8b6c8b16947087766a753a legacy-trunk
+33355 25b9fd6d8e300b40455295ab1f6cd8490c31a5b3 r23b2-branch
+33356 72dcc63f4dea6b6f0e1f555d6fb32df1ba58c497 legacy-trunk
+33357 842d9e30db9c3726f08c439a0b7c466d7e1566f6 r23b2-branch
+33358 ef7a1d2857714947b6543b6b255dfd7bbbc8de52 r23b2-branch
+33359 f4f11ed3ae4409e76bfd6204eaff12b9e3954845 r23b2-branch
+33359 dc1b1c7a6b9e64f7a211ea9e8a7da483c2bba167 r23b2-branch
+33361 537c8b1aef7fac8866e6dbbbe43dcb27336f42d2 legacy-trunk
+33362 c4f9ff291229bc8846b15c66426394db45d2d19c legacy-trunk
+33363 d7164fbec7ce140391bba68efc0289632e0597bf legacy-trunk
+33364 26ba71aa5b215556a73f56b5afc6be7ab8b1d859 legacy-trunk
+33365 d0dc956467bf1b6cc6f94b0e090a6a8b1447e932 legacy-trunk
+33366 3ed2c9a76965683352eeed166fe60f12f953829d legacy-trunk
+33367 1d763862d1a1d702d901362d79d7f10c771ebdc9 legacy-trunk
+33368 f1c279d700a6d6f0cfe76138f34606990c2ef8c4 legacy-trunk
+33369 8dbc4ec5720dbd5f3d99c5a5646bacfc4b77e60f legacy-trunk
+33370 6483eeaead82c0ebcfe26db56248d74037054350 legacy-trunk
+33371 7b6fa7bb24f064684f380530d5446ec7bd44518a legacy-trunk
+33372 8ff040e9d5669512a2c7e29775f1d97ac4b5102f release22-maint
+33373 d677424c9ca7105931724a27e7773e6037109a73 legacy-trunk
+33374 891e5502ec9e3b118db822ee681bd380ea2b3117 legacy-trunk
+33375 1536941b547f06d3c8b27e7de871bc5f968bf5a4 legacy-trunk
+33376 a4fead0e24f8aefcbb9447c1d3fe19cd79ff18dd legacy-trunk
+33377 762e2a297ab97a21bd7e5b60ded73c0850c19404 legacy-trunk
+33378 e38164aa5be513b7db8b18cb732efc1bb73693a3 legacy-trunk
+33379 1f3547d4939fdc86e72a828e253b651a9dfa6396 release22-maint
+33380 4d26547ebfc3884c634b2c97a4c57da89f587aca legacy-trunk
+33381 d8d197551a1edbeefeae2d8e5a433f213848b021 ast-branch
+33382 b7528dae76567b1f5f116fa69df621066a384203 ast-branch
+33383 58132c813d7be945ea76d8af8a7e89218cb518f3 legacy-trunk
+33384 8ed2ed7786941652e28c471585f38d8b588e3fe0 legacy-trunk
+33385 292e84466e78195d4f5637c73fb2f5e374357fa7 legacy-trunk
+33386 bf0634cc0f17508fe8cc7bec79dfa9893f0be3c5 legacy-trunk
+33387 e9531ee5f1889f98d154228ab1be2efca8ce05aa legacy-trunk
+33388 9d33dd2ccfe6a6e976ff11e4365ee51457c594ab legacy-trunk
+33389 2a5e6ce3f3a157520a5c40b0506285e312b4588e legacy-trunk
+33390 724f2ed79da9b3d36dbe46e8935143d8846a2137 legacy-trunk
+33391 fa4cf878c538448c880669bd295fc18b998d7c8f legacy-trunk
+33392 052fe96684eab6d86d962f547d89e99b31dcb24e legacy-trunk
+33393 09e42f79f830bdf249d28383c4dc5abd4cc12c95 release22-maint
+33394 a44d267f01629fa4c330943861f06db4203b601c legacy-trunk
+33395 cdb217a8eb0445dc9837bddc29d2ac68bcf53b3e legacy-trunk
+33396 3b7b4fd5f7cad56be7f0aa1ad1e529c164afa301 legacy-trunk
+33397 7d0af4561eed1de06d537427e0f8d710825fcc6b legacy-trunk
+33398 85e52ec8562997670c19c5a8d8e6513e115f9ac6 legacy-trunk
+33399 962f443ae1d91b3844f7ac5c4f2d5fe297ad0987 legacy-trunk
+33400 4c90a631d632edfe4e61001d89d2b37568487810 legacy-trunk
+33401 37216e1c674724e0d05f4ad031b30e8421521cf6 legacy-trunk
+33402 0e131e2946625e75cf782d0fcd63129a545aed61 release22-maint
+33403 452e33a08d5570a06f8f3f8e8df94d4e66158d6b release22-maint
+33404 1247f84aa6a6c03c91585b40e58a15f13672e138 legacy-trunk
+33405 39be5b262792c9800dddfc1f582dc469e27cbeae release22-maint
+33406 f43296cbc9850134e4abfc10e4005e766af1e7d9 legacy-trunk
+33407 e850cc51c28fd88f7f5f9446a2e080a390788026 legacy-trunk
+33408 65e52c2475ce513594ed9bb6cc45f72d78f4ad5a legacy-trunk
+33409 a5e7336c008d38adb89e217dd7ba14230fa9444f legacy-trunk
+33410 d5f27e67e1aae8cccce6191918bc6faaeae23b5d legacy-trunk
+33411 3ad898b8f813ac55f1531b84f0e8471c8fa549ff legacy-trunk
+33412 4c9ef2a62864d5ab891fa764f8b7e603273ee45e legacy-trunk
+33413 8ca9ce36a206ffd1a843b74f8d080db484f1e305 legacy-trunk
+33414 68835bf101ecb13cc9574efcd88d996e6dfc1b02 legacy-trunk
+33415 b9c40fda609dbf766bcbced08cc6d394cd69910a legacy-trunk
+33416 4f9293ca2de612b0351a59fa72ba87c7bb7f2d4f legacy-trunk
+33417 32f96bac2113cf1d68bfa40c85103b3cdc8ba260 legacy-trunk
+33418 61fb996eba6e0eb00b593ba2b30f2ee385b12f8d legacy-trunk
+33419 eb828c64fcc7baeca007effe8dff9244c1668363 legacy-trunk
+33420 5af89037ceba0815f709ed3a30a5771235fb1e64 legacy-trunk
+33421 ac9a1f0a33dc8ee7a80c95f734163af85c725392 legacy-trunk
+33422 b86446f0350ff018d87820b1102272d841286c22 legacy-trunk
+33423 b5821e1764538012b5118956bc9cd74ce9fc16db legacy-trunk
+33424 9a442f4a6443dd1d61452b8b92ec322fc656653a legacy-trunk
+33425 b44deeec5c5ec8fc2b0723cee97c3b068a356c94 legacy-trunk
+33426 075b29ad97c321d57d6357b02d71f64156924251 legacy-trunk
+33427 59da5b57c61bacd229ed7c51c549b246cee7406c legacy-trunk
+33428 3c1f78340b65e862f0063eb82cb7151b03d616e5 legacy-trunk
+33429 b493a7e75d977fa2a2a43cb01ede356e90e75122 legacy-trunk
+33430 0591fd956b9d2857bb221df40ec4af2cc30ae182 legacy-trunk
+33431 4ec880c53e2a307de0c16dcb4cf5598d3689cdc9 legacy-trunk
+33432 9eb6dced16e6be077658857c040b1edccdd5caca legacy-trunk
+33433 78c5109ffada06319b790933722fae60e4fa540e legacy-trunk
+33434 005765a56ec39b22602a63f188726480d73a9f01 legacy-trunk
+33435 b84cc3c7808f82397f9a7a99c4e9935e44099ba2 release22-maint
+33436 fe5eb17800f9c31b47d455be3dce622c1097446e legacy-trunk
+33437 e9e5832d706ff1a09308501d2cd11033fa4edf2d legacy-trunk
+33438 7a478d13f27da3369c6e9b6f66e64971c4b2a7a3 legacy-trunk
+33439 7770b7881346d2e5ff27759cd016b165f9983fb3 legacy-trunk
+33440 eda5d015e11c1863778f38c9d822352c3c51663c legacy-trunk
+33441 28cfa546f1ec764de23106667ebc8e52ae3ade0b legacy-trunk
+33442 070345ad8d71ccbaad27eab4e888b7c53452ef15 legacy-trunk
+33443 32efe54d0e8ffd18f0371d4f0b1ba4d38a21f92e legacy-trunk
+33444 ddc247404dab3ef0f9566f1acea3c1e6217bfdca legacy-trunk
+33445 8e27e5cde59aed193d7813b3746ad77ac5f55604 release22-maint
+33446 9396134684cf59c9340faee1fab2b22cf372ab36 legacy-trunk
+33447 e6f9f6b5d8d7e71013bbe67e91a34525cab86fab legacy-trunk
+33448 f733bac78f87e4efe8543001234b14fbc63fd791 release22-maint
+33449 7056cc5c8167fc2e4a333fd8dc436fe423c0de6a legacy-trunk
+33450 ce988394c75478fde1a7b7e9395b63e181663778 legacy-trunk
+33451 2fcde32a8a5799e5843876b0e978d9dcaf4747ad legacy-trunk
+33452 dc6a467318606f98586da97759fc199e6f68c0d6 release22-maint
+33453 d7afcdc69ed491ccb575e6b61a78aa29b8134ab6 legacy-trunk
+33454 c73faf5de1bd3d143bfadac526cebce90b485d7b legacy-trunk
+33455 466a540cc229fab2984ca4799f7c57c8e976504d legacy-trunk
+33456 4fc56cae4eb8c165dc20274731dcbb1d8e758357 legacy-trunk
+33457 31d92354f72f09deb9c67f09d18166663686b9ae legacy-trunk
+33458 c8fb4af96de0e5bee20d09c501880263afafadce legacy-trunk
+33459 4baffe14c8874a12d93af289e029acead773888a legacy-trunk
+33460 2e84fdb4fe30d7b9fd84c32c8b55430ec6b729a2 ast-branch
+33461 9035fe768689d89e2a05ad077f738b47b1c1ded7 legacy-trunk
+33462 defa1d825b08cd624bf0b1fd96afddce609f5423 legacy-trunk
+33463 1037feacb54fc998ac8726cc18611084acc39fdf legacy-trunk
+33464 c70063c3aeeb8df745fa2edf783ae4b54befd49b legacy-trunk
+33465 cfaedde50bd643268ec7cf0ba0fe58c71edbf2aa legacy-trunk
+33467 e6a78dd425c8e0aaf90373091655293bd29e0ed6 legacy-trunk
+33468 94e5d1b8f696989777da5ee2cf7e081fba57a803 legacy-trunk
+33469 d7e1a1bd4880b761a701bf56f8725a294aa42913 legacy-trunk
+33470 c449663fa27de39ba76fa89785c814ec983c62c8 legacy-trunk
+33471 bbc36e0e10a157929081d1394721cd7c9327e70b legacy-trunk
+33472 57b93c94830a34e20abf170aad1bdf6cf680b5c1 legacy-trunk
+33473 e5b99e60592615d2cd0120007c97d56fb4e29984 legacy-trunk
+33474 1272f79547ba916119d86c691652562aa734e0af legacy-trunk
+33475 bab89e406f30e245b9d7a29142d4f77556445db8 legacy-trunk
+33476 d283b1733c0d7a577cd6f2b9b7b4cfb0f47d03ae legacy-trunk
+33477 ac0fc0893aacf337539dc79764f97ff16fe6ea55 legacy-trunk
+33478 0df11b2bfca518aa6a5ff9fcbedc13938957b70d legacy-trunk
+33479 3280355329dd39bb4920045697552801ee1b25e7 legacy-trunk
+33480 5b21c70039745e6492236cb6d00b9959025cb5b7 legacy-trunk
+33481 c9c6e2c9ec975c85b48e41f0610fcf5d8353fd3e legacy-trunk
+33482 2b17ad668666e5e8ca60a8321c006c4b8a52c3c8 legacy-trunk
+33483 9916b59261d76335add8ae8336fc3e21150d8157 legacy-trunk
+33484 e02a5d1849f8d87cbb78195ffdf78d0728729c42 legacy-trunk
+33485 6443a0fee7e1014303c2b00adb2b240e32432e70 legacy-trunk
+33486 3b41c633d7696b96f546a2894d15fff3eb9d0b45 legacy-trunk
+33487 7be24cc6c28d7ba55c8b3cf0cc401055a2623684 legacy-trunk
+33488 cb3ce7cec2612f193f6ebf8b8c043784dd6d34c4 legacy-trunk
+33489 4837bf216ae5f50d700e392917a3c4d4a675f85d legacy-trunk
+33490 ed43155b1d3c9079655e8adfe366589413a11357 legacy-trunk
+33491 d4ffb0490ac27dd4b19e2f43e04b97ff91b3a91e legacy-trunk
+33492 071501824bbd8d9307455e781cf8133473e040e4 release22-maint
+33493 859cbd7c9b48140f2597d82f70076da07b42b6ba legacy-trunk
+33494 1dc158652e5b373a42ffe5a66618ec807099ef4b legacy-trunk
+33495 e1a6bf4565cde4e47fc6b2161fd706752fa236f0 legacy-trunk
+33496 456912ada69ff91dfcd1bf9c6afb525b98505c40 legacy-trunk
+33497 ba5f0b8081927b4622890f4496b6d71c89c54158 legacy-trunk
+33498 37bc23c6cf6c92212e4bfa5f4d5bbb5e613af5ce release22-maint
+33499 a37106ac7c8cc017e90f091b2889536c535322ed legacy-trunk
+33500 e6edb040a77d4ace981162f24885ba46ee40d264 release22-maint
+33501 2ec2f62087cb8ebbc224dbd7fb9c7335f86e204b legacy-trunk
+33502 5e81d92bf67db006f4a6667fd36680dce7e158bd legacy-trunk
+33503 09da9e56555d80cc2e58a13276056a875d2d3d19 legacy-trunk
+33504 4029a726faa65503682fe8fbf2c25dfe91e1e916 legacy-trunk
+33505 92f1eeaeb41d751932731d1e59ffc42ee87805dd legacy-trunk
+33506 b9827c05460f38f8c19a228d6402bccf2eb498ce legacy-trunk
+33507 d45d317fda351adb546e4ae71bbaaee0bb5dc7a2 legacy-trunk
+33508 778b21520db8b94eaf19c27191ff1fada9fb5ded legacy-trunk
+33509 8d45a4cea93437e7c54144db1ba08d4d2e1d7bf3 legacy-trunk
+33510 e57a9bbeec5b277cdf1d026c14cce84198eb33c2 legacy-trunk
+33511 64194e775b0bc28c2750e067aa7ef44e60e6625a legacy-trunk
+33512 fe79a5ab392b85905a8384b3ad8d02bb9d16dd1f legacy-trunk
+33513 2d5becd900eeb5666a2870f39d1f9714846de4a3 release22-maint
+33514 06cca327bacdfab7552b10b3bd70f9e02cacc777 legacy-trunk
+33515 dd8ca083ea6678802417559d17a39c2fa3a1705f legacy-trunk
+33516 014cc362aa912360aba6c96967c637d7dba114b5 legacy-trunk
+33517 e686765236774c53c56f8890e24d85f918523cdf legacy-trunk
+33518 7fba33ff21358a305bc8fd2010a6aa2e9bccef15 release22-maint
+33519 b85f8bb5c3754c68a7116e1d3c1d161aae7847db release22-maint
+33520 57adf827d4c7ad64741cb41f8bc7a5e4288679a3 legacy-trunk
+33521 2bb523ad9b765b896bee36fc7df9802137298e2d legacy-trunk
+33522 7052c3e5af026fbfaebfc7253da89dde536176bb legacy-trunk
+33523 42e8263d39ac661f755bf93833e88b8cccfdc7eb legacy-trunk
+33524 45dc3343332356dd398e17e946dbae1d12402837 legacy-trunk
+33525 cdab25d2f84292e8b9fdfc50a1578c1c84b94c49 legacy-trunk
+33526 84835846eeab114d19d30833cf4421e128b199de legacy-trunk
+33527 9c57eb5337b721804f487019985c00ec7e45622a legacy-trunk
+33528 8eb1cae1a77bd957ba61ff09b4301d7431b8cca9 legacy-trunk
+33529 421d805c11f33e33249b4955898a9011584a6c37 legacy-trunk
+33530 bf00b56c14a982eb11d435b7983ab1ddd773179f legacy-trunk
+33531 5777c834f55ce92c4b57efcb1f8b82ae73234acc release22-maint
+33532 56c01c45092c09282d42e5eaa3ebc50272e68e66 legacy-trunk
+33533 cd0bcaa0bd81fe4015b415b9f1838ff0c96dc576 legacy-trunk
+33534 1bae78c83be94bec261b8831ae9120bf2159b08e legacy-trunk
+33535 1c3b8158760c3d023e101d2c71f1fc109c975167 legacy-trunk
+33536 f339f29b06cbb792525defdf9352137fab3dfd2d legacy-trunk
+33537 98c59bbdd8ec47942f29ffe7caad6d7d3f968244 legacy-trunk
+33538 84bccbeab5fac5812f185f3ce9f7ff7eefc74aa3 legacy-trunk
+33539 b766152c79045c5c9b8539e348cad4692819c10c legacy-trunk
+33540 b44eb51931d0f13445974b09c1a2b4388aa999bb release22-maint
+33541 199cd78d6d78d36a6ef0fba232c7bea83f414adf legacy-trunk
+33542 604d93823ec1d0128970125edd894d8813bfaf5e legacy-trunk
+33543 3442e7cdace86e39c659d7ded9e4479e32892d04 legacy-trunk
+33544 030227de80518aac7aea9d58542c03d5a77f1284 legacy-trunk
+33545 954717e6fdb50b45db87d1ceb1e431f7c50428f8 legacy-trunk
+33546 1a42b128c5814a8af389becd705df5e217d86f70 legacy-trunk
+33547 fee1776e61c7056114a9703332dbde7d6a6ab55f legacy-trunk
+33548 47501184b5435f7e06012b0b019767b968002f40 legacy-trunk
+33549 62f3063a1a0f876bb762f7919d5141b76003ef33 legacy-trunk
+33550 a0a7231c6fe0e34f4c3030b4acf1be69ff875035 legacy-trunk
+33551 72cbc41ccc2f380e3652ac750f77edd161fb1124 legacy-trunk
+33552 2c5194baa9944f9ac5e4b04c5d7e7f9b672dcea0 legacy-trunk
+33553 ed8709b1a3efb13a7cc4f66475f8628e676c6fce legacy-trunk
+33554 3f214b39b4df95497f41136160101cceba13dd4a legacy-trunk
+33555 19511a490e7c05113515097d3bc1dd25240bc7aa legacy-trunk
+33556 92a5fe57838038fda0e6f79ff9dc5de30fef7bcb legacy-trunk
+33557 d37d1590e1a7d1a1f91d6f38cfb9da285fe05cb8 legacy-trunk
+33558 88b93e07a1f80af7c258b9fa89502a07272785b6 legacy-trunk
+33559 f89d545505c715454bc8595b1fdfc690f2929756 legacy-trunk
+33560 b68fb4a43d0fecdb94dfea4f34fd4a840a746879 legacy-trunk
+33561 22bca28236856861b0e9e2eae706cffdf82796ab legacy-trunk
+33562 4e05c55514e1d63161f357e047921edee937597c legacy-trunk
+33563 e2b40312757ee11ff02b29da911b02bdc0688cf6 legacy-trunk
+33564 da7eae44f487b4bca295bc4d4d0b37b56b598a1c legacy-trunk
+33565 9ca291865f9c1f2a027e2fd55951ec346b548c78 legacy-trunk
+33566 79ec7e302d535776b69d0f506eb8692dc17b1072 legacy-trunk
+33567 e9dddfd2a62f0cea25cc792e5ecdc325b6a6ddb5 legacy-trunk
+33568 ac84f179bb841339c9a2f86b5c52baf66cdae08d legacy-trunk
+33569 994b6be48e2879af6867fd1f2cb720d0367ff81f legacy-trunk
+33570 b47a7274ce5c15838a5c6b049bb65a7765cc6b16 legacy-trunk
+33571 dbae05c29e938544b9862dc7326731e28831befc legacy-trunk
+33572 d1aa5751fbcfdba3c1fead90cbb1ce39c0bf2813 legacy-trunk
+33573 434b6cda4fa5af7017cb6c509a59ef76ceabbb95 legacy-trunk
+33574 9deac1aa421db69fa55e4387ee64ecac3f2edff6 legacy-trunk
+33575 a23106dfc94d3ebf6fdc37f6cc63e285445b700d legacy-trunk
+33576 9f60c3ee985a2ae10fed9cb97df5c148a07edf4f legacy-trunk
+33577 80ed4d97f1baea0de9958df7a1b96f1dd88c94b8 legacy-trunk
+33578 716395c19586e2a106692c259278da7d11eb146c legacy-trunk
+33579 8b155e4a10a25d2b87161070a74b15e8325cbcab legacy-trunk
+33580 1e2e1c79316e12fbd5fac40bf1a37cf16636b57b legacy-trunk
+33581 5a944ac8525c1f61d5daa3feecc905091bdb7e8f legacy-trunk
+33582 451b7e8393fc41eb143fea2349f1d384225c6593 legacy-trunk
+33583 d59e58bac3923750b143d92457a990c91b019b4a legacy-trunk
+33584 0e2215b8226d2ae3aba63f07a862d11dbb98d9d5 legacy-trunk
+33585 4e613ddf2a1bd1656c4ef74ddbb2a10cd2353061 legacy-trunk
+33586 416d9458ee97cb3f2e3a1c304363854c39589b8a legacy-trunk
+33587 52760751c61ee72ce90a1fe38c89b11b600bf31b legacy-trunk
+33588 f773b568b2e73d829ea192c210355927b262f6b6 legacy-trunk
+33589 fcf6680b6a6fb771c8b598acac68567199f3cc99 legacy-trunk
+33590 df9ea749409a3ee453c4f713450d3734533d2511 legacy-trunk
+33591 564a49eea414e1009316946aefc292414dda0f68 legacy-trunk
+33592 ec9f186154856a90af59044fbeca290708dc1397 legacy-trunk
+33593 7b16cf70ebd89e424d5a242cbe9e8c352f282aaf legacy-trunk
+33594 0b3422b621191196c33e76a76bdc29b98f49a0c2 legacy-trunk
+33595 2a40ca06a22c88d92f7715bdc082f9af78423080 legacy-trunk
+33596 96bab7c82e2cfc96c100690390442b8a09e6628a legacy-trunk
+33597 c86b1354ac6f6f74da300ac8d8c53cf04e68dce4 legacy-trunk
+33598 1bc2559229db1dff379e6866020c1e6853ffbde0 legacy-trunk
+33599 7fd20ae44142f0c9df05af032d7df049ce75bb0c legacy-trunk
+33600 8dec0fb142854f36b5d22cec260cf173433ba836 legacy-trunk
+33601 a73c28deef6dffe73493605faf0b575b2e371e2f legacy-trunk
+33602 86c476a425a7dc52736b288b63e986fac8411722 legacy-trunk
+33603 08d2636b8e58443d1750f678a8d1eb688d48a546 legacy-trunk
+33604 25800a724011fb2544563a356a6e81acc8e6b240 legacy-trunk
+33605 cfad54283e0004764124452d018412076d695183 legacy-trunk
+33606 722d7c7a77e2b47f3aa8959d6ca82786b29f56f1 legacy-trunk
+33607 60e3d299fc8678f44261680065ef2b9eb915d5ca legacy-trunk
+33608 bb8cc72915f56892c3b53133daf07af1915c6b29 legacy-trunk
+33609 ee7e223dbcacf069cb77e50a56d8391adbf76719 legacy-trunk
+33610 b84645c3195e484d6726ca5b9759145a647d1756 legacy-trunk
+33611 4d4417df63f4e808bf320953a8d4f35f768601ad legacy-trunk
+33612 03153fd2d3f214c1a7a02c207914120bce564fea release22-maint
+33613 628dcf90bf9e2e201d22c36dabf856a493ab4973 legacy-trunk
+33614 407c0dec2f4adc92c61ea8244075a8cb1e607160 legacy-trunk
+33615 29a63c5cfbafb94415b2e8af84d01499ae497d68 legacy-trunk
+33616 da0c90c6afd01fcb6ff8b73afda58db894ef12e1 legacy-trunk
+33617 9013d3c1d655064c800a796357fdec70b2d36500 legacy-trunk
+33617 d054c29647f90bccb8345bd779bca1eecf2dd7f2 legacy-trunk
+33620 8a293449829d7bad082be8b05bc6d67fd41daa47 legacy-trunk
+33621 da3592962a7af079979bb40b29ab6b5d78d9e374 legacy-trunk
+33622 108aa964857321058a42ff66228139b9db82f65f legacy-trunk
+33623 9a6f5b37e81d2d9a8251d3b83b2d207413ea045a legacy-trunk
+33624 ce8b138f4473adadd0b6a164d52a40306a2e5137 r23c1-branch
+33625 337d44010907378e4fdb78a4b656199fd66194f6 r23c1-branch
+33626 ad09687aaaa0a7552685f274fc603da0dbfe7a24 legacy-trunk
+33627 2b8a564e1fd3d026a1246860986322bbbe10e1b8 legacy-trunk
+33628 a9c899739f4822bb6d8b9a9b268dc364ae539a64 legacy-trunk
+33629 1cbc6b7836dcb8a6f19e22bcc5911a45877414d5 legacy-trunk
+33630 3225f1d428835a2755a654e8706f51bfda016d4d r23c1-branch
+33631 2c483f7bea4bcf8671547234281f638fbadd5100 legacy-trunk
+33632 baf2241070bfd717a236c331f7e42cd083f5c487 legacy-trunk
+33633 09c459851264146eb327c86ba74dc5dcd49992d2 legacy-trunk
+33634 5faee7cdc5aab24766b97cbeb3a172dad0a1d907 legacy-trunk
+33635 cea7f8af8e0bb82e4d9a94be342ca3a04936e546 legacy-trunk
+33636 4bfcfed64ecb968c98285dbaca8630b39b28770e legacy-trunk
+33637 4c143ceef419c672d0c0268c03d37b263f71dd26 legacy-trunk
+33638 a550af711aba4a22b46af3178fbb43bafcfe9106 legacy-trunk
+33639 950b2500a1422214acd3c05500506af916b79647 legacy-trunk
+33640 668dd336e306f15bb8e0a8abcce2f200b58f0aa6 legacy-trunk
+33641 c42a7317c887abb7b9f386012321170e33d8e9d4 legacy-trunk
+33642 317f1ee24f1849b78e70c7445db9b9ad7eb49ab0 legacy-trunk
+33643 4cf2bfffa56410f8e82101202cbe9c2f6354dea4 legacy-trunk
+33644 fe499bc7381fb903bfdfeee32ad64dd597019957 legacy-trunk
+33645 a4abe17a5feb91f46224e8a968ad50a3747bdda8 legacy-trunk
+33646 13c75fa780c8c2222225a50d22274bffaeb0349b legacy-trunk
+33647 303f5fda1a2840ba02f89972dabe2ce2d27dade8 indexing-cleanup-branch
+33648 a77aaab0146de696e6d66e993b5c64ec59a5ddf4 indexing-cleanup-branch
+33649 5addcca3f4333482fae344ff48add5fabdd27bf9 legacy-trunk
+33650 e339ad250af0f41fc34b8a64cd9b8356e1018a00 legacy-trunk
+33651 82ee1fae38194b810990723707bbef51ac99f36e legacy-trunk
+33652 a408ac5527c34578728f5f313080c97e3321d2c8 legacy-trunk
+33653 b9d0a0ee2206a72a9a957703d6dfd697029c7f88 legacy-trunk
+33654 d37f13199d95297b411146d36772a29ab9145aab legacy-trunk
+33655 6149f0a0b8f584222897b61d35b9d298bc07d19f ast-branch
+33656 21edce091069f9acd2dca2a89193b64b07afc48c legacy-trunk
+33657 2c1e73b2fca1107b71741160f9ed152a9a4e3136 legacy-trunk
+33658 118809b1ef206129b620dea2a36c77c1b26e6344 legacy-trunk
+33659 27395c844e23b7ad40aac5fd85b4a656ebffbdfb legacy-trunk
+33660 6549d2e408f0c63bfc66e84096b020a58214930d legacy-trunk
+33661 5ad439632de54ac19e3bbf0bbf737d31a06cf3c2 legacy-trunk
+33662 17ce12369477a7c86dc867fbc0f20b7964492b01 legacy-trunk
+33663 21187097854c90e522b014e8496520b9ef813480 legacy-trunk
+33664 1bd6e62fb06f77937cdaf74d6b211c19d8bebfc0 legacy-trunk
+33665 7ba42c96294cc693c084e99633b4baa1c7febab4 release22-maint
+33666 f2708ef60169b192d9e066d3cf6a264fe4d002ef legacy-trunk
+33667 2da05b5b5c65055a36716c3c71a6258f8c7d45e0 legacy-trunk
+33668 29f07adc3019d075c9b32a853db146d14c6eb4b1 legacy-trunk
+33669 8f306d3d6d56ed8de37426d4d1ab1d438832c566 release22-maint
+33670 0009a03832225a675c9053907a0133829424fee5 release22-maint
+33671 b5949591d9d574e045e21d0581c22cdaa0084707 release22-maint
+33672 86e4725a9dbd4b954df8d429ef720a9c271c5f09 indexing-cleanup-branch
+33673 b33c60fcce74f9df0d1f6015b4cdd5935e12833c legacy-trunk
+33674 35ccfc140cac0c2f3cad9eb6813aa4769abc8c1c legacy-trunk
+33675 730abfcf2610e9c71cb0055b29be6341c2f551b2 legacy-trunk
+33676 673bced99180fd5ac75254e9a269e0b26cdf8755 legacy-trunk
+33677 aa44e0688896a045385298a3fa580c7f9d1e8dd1 legacy-trunk
+33678 02e5b4b67a66303c49a97d96af0a8c696bd3bfa5 legacy-trunk
+33679 095469c7abe72702002cbc3ebbfa4792e75c927c legacy-trunk
+33679 fce5c9e9abc722394cb2e909b7e2a39080d4448e legacy-trunk
+33681 e1bb1262f0bc14623d646b00cb5475bd01988100 indexing-cleanup-branch
+33682 83e06fe124a193a534e448899b5b59755504e4dd legacy-trunk
+33683 53b760b027b7712b067d24ebc03d517edf810cae ast-branch
+33684 96fa8f0b9eeba7fcd2af051c94bf7a24e885dcb0 ast-branch
+33685 cfbb7b82692d70f0971e37df57507e3005273a89 ast-branch
+33686 f82eb160440bda49ec22894ff7c59296e81ec8e0 legacy-trunk
+33687 52dd548d3be9a97ad779bb1651cba4c4166642d6 legacy-trunk
+33688 3adda81a0e0bd0524a7cbb1a4939949b78df943f legacy-trunk
+33689 35dea10dcdc45e85c1ae49722f7b25545a017c00 legacy-trunk
+33690 1fbaa05b35c1bf0ec15b59e1164a1f4cbfcd4f60 release22-maint
+33691 8cd94d117f8778927c44b29aefa0fe1db4482c9a legacy-trunk
+33692 37ccf1bc54e044fbdc6b2445be59901bb8d4a860 legacy-trunk
+33693 15fc83c505e31497026b0a9f576f078af49cde87 legacy-trunk
+33694 cfa9f049c204c68aa2f2224dc4899099e731904b legacy-trunk
+33695 4b5702306c581b3ef6bcdbdceea5e89ff7bdaf42 legacy-trunk
+33696 efa1bb656b2b6e519a723bc562845d1019a4c938 legacy-trunk
+33697 a13152b25fe8df93d0a161fc53de6343d9cd6edc legacy-trunk
+33698 de7d9a2b5fac30832406fecd80cf269a37e3858c legacy-trunk
+33699 ee8bacc6f068d6174b3bc3068324da09eb3253e9 legacy-trunk
+33700 29094016397d6260d4ef94d611d8f78adafe0c28 legacy-trunk
+33701 674cf5a24147ebb6833ca275d3339f63d0ef1b37 legacy-trunk
+33702 12a7f21564815417cd8c64b0e80a41ac6dc40d3f release22-maint
+33703 74a5ce49a92fc832ad4405808342c40f97d6df0f release22-maint
+33704 0d79dc854ac4690ed415c80c582a17aa4e359802 legacy-trunk
+33705 a62153d9c8d6517251dda7aa2fb9a0576976b432 release23-branch
+33707 21b81399b628420a68c86b98025bcbe67c57510f release23-branch
+33708 a5203614caa96d6b9cc2e4e31f1e95020dd754d2 release23-branch
+33708 18edc7d57dffb56be8374f35e47f39329f5e9d31 release23-branch
+33710 ecd8573204cd24b1ff1f84b77da8210b85f45816 release23-branch
+33711 43b0a404d4a01cc1798e413558559fee80aa2fe1 release23-branch
+33712 c3e69f376f29b191143414e2ed029904b379dec6 legacy-trunk
+33713 3fe82d57d0d17f1d8d395eb52b004381a33956ff legacy-trunk
+33714 1d63e153989f03546ae8b2ad0d70b2d3b7bb3247 legacy-trunk
+33715 b7e2d7380cb2097c71a4ae2c08fe6c761ea632cd legacy-trunk
+33716 702aa6eb11f9b3d0d37e4ef4b8e12a337837e872 legacy-trunk
+33719 b82ea0b07b0ab8b5b4372d47d9238ee1ff8e56c2 release23-branch
+33720 c340b27d739b112fa560789ec551d4ad78213ebc release23-branch
+33721 02529fb18815a088cb91596b9cab1162becd8bed release23-branch
+33722 e59a36a1805ed6cbea408c9a69fdc5fda66d43f6 legacy-trunk
+33723 e4ee986af1a07f7d48e25f0b53be2329572c4e67 legacy-trunk
+33724 e148296d8a9388efed90793295f175261be10841 release23-branch
+33725 18731d24e3d103771b2b5dce0f20820e1cd5f88a legacy-trunk
+33726 2f03f83984b071c90013c8548ebf7207f9d88e26 legacy-trunk
+33727 6784a241633150a98590d91785a7c12c1d871d85 legacy-trunk
+33728 e621a97bfa16b1ddf5f0f30a23fc49fdf5fe75f9 legacy-trunk
+33729 e213cfe17a624d3a6081b8c27f323e2d8b7cc12d legacy-trunk
+33730 d72547c915d5a64ef5cb4d08cc660babee0c3cc0 legacy-trunk
+33731 677038873a22b94ded48d36167dee5ea7ae6d8e3 legacy-trunk
+33732 08f38dafc98a7064c4b6e70c53b7ff2ba7092cc7 release23-branch
+33733 8d8cdee344ad566786d314d7400f239c6c2f9f5e release23-branch
+33734 9e0d39a2d37e49dec3a1b62621e42727dd40817e release23-branch
+33735 0406875ca7fd3b613ce61613f51ae3f32cf677ba release23-branch
+33736 6f6de761ef9b7adb8cb51c36503f2363362d82ee release23-branch
+33737 24e73798ed04e4ed7af1e056e3269bd99d2af23b release23-branch
+33738 7058dcf733d466c002abad24a14f0d1aa89015da legacy-trunk
+33739 43c9771e0be10aa50d8662e721caa78d21dec832 legacy-trunk
+33740 ce185034b3807dd835ffd9d0ada08094e6864681 legacy-trunk
+33741 69c8e39f6ee6c56a26ecc2a53deb6e6099d8fb52 legacy-trunk
+33742 0504ba8efbb6cdd11f1a47caf0b424fca433295c legacy-trunk
+33743 0c621801409af2862bbad1b19aa7bc839d9e0231 legacy-trunk
+33744 d8c8fe0c73edeed83d36dc6c8ba254b3c102bbd9 legacy-trunk
+33745 643ffb7db18fd05f9fe278b712198221505c8abf legacy-trunk
+33746 d09944cee3a4fe4ed141dec431cf61530d4c1420 legacy-trunk
+33747 526c12ab36af3982f704bf252e7d8a6462b4e5ab release23-branch
+33749 d738a07a293a35f4033bc79dc49b9e380cba765d release23-maint
+33750 c9a00590b901dddbe66ac9176b8522b34f7fcd73 release23-maint
+33751 8014fb80d144539b74df328dcea1d16d1835bf23 release23-maint
+33752 db9d630237a65765823c75ee9f63a8eb58e9ef1f release23-maint
+33753 d8e52bce2cf903b47acac440401b710e95c446ab legacy-trunk
+33754 5a2a91b97810a1cb343c9e4ced287a9c40b1d828 legacy-trunk
+33755 2cfaca62a99073dac04d0af1dce8d5648323b947 legacy-trunk
+33756 ae8485867d30711ab98a7d4700d5f5ab337fdd82 legacy-trunk
+33757 494b07a5e2e57cbc23883d55af8d9d13c8adc690 legacy-trunk
+33758 7801b13c52c94612c7426290da6cbbea17b4bd96 legacy-trunk
+33759 0cfc6cabce884a530cceb58db87a1c332d1bebe8 legacy-trunk
+33760 a0300ea638ddb4130190967f2180fa16e75a2af6 release23-maint
+33761 b24e9d71fa3cdbc7c910ee78067a1406d6ad2f0c legacy-trunk
+33762 1d5be6981d57edd872c4c533e496a19f80d5e4b4 release23-maint
+33763 e477b599924da83f557380a6450019850997983a legacy-trunk
+33764 aab1089f0f85deebbd545f9cc23f4f4a20298c66 release23-maint
+33765 4adfd76466bc6c06e484b52fe4a2386bdb8276ed release23-maint
+33766 200165d11a94622acebb021f963584a816943446 legacy-trunk
+33767 f2619bd683db3db1bb78b0f055616b7ff7ee14ee release23-maint
+33768 354c7ee438bf4ea0174f93a7296c7eda0e017672 legacy-trunk
+33769 7aea1b5cdebba2f76ffc8b38f87d1160d775b0ad release23-maint
+33770 589d5545af4116302644071a87d1403c18bb7d78 legacy-trunk
+33771 0e64240800dd13c71d9d47ac5a5034d1331b8d56 release22-maint
+33772 98e6ac1d837971963f4518e2a389bf719a8b3f8b legacy-trunk
+33773 ae0242e3459eeaa9523f3e7467391bd08d418c75 legacy-trunk
+33774 9bd5c052b308b78a72ea2976aed07cfbe73a437c legacy-trunk
+33775 171814f5dcc63210b621a43b4a7f95d3d911435d legacy-trunk
+33776 ab10c0c25c0304ad4a39810330da97636d43b319 legacy-trunk
+33777 061d86fc11bb3834db597e72775344badca7a279 legacy-trunk
+33778 735ec08694923feb6061cafa0e10e7783e5a5dae legacy-trunk
+33779 7bd40205094cc4823baf3b9544ab840306984830 release23-maint
+33780 36c277381d78b3bb637705df51031ab37febddd3 release23-maint
+33781 8cc80002fb903708ce41540c8a8f8289149c91be legacy-trunk
+33782 2b14c9827d9cd73ba677e357da17efd0d3309573 release23-maint
+33783 5b1ddc4b49b9bb1f962ac33efe73ac15026add55 release23-maint
+33784 8b7e37b5f1ee451d24918a93a5ef0f6fdcc4004b release23-maint
+33785 762e1b2088e5188dfee63069949bb7983aeb21c5 release23-maint
+33786 59ff77b0ac724ab12a56e656c8867037bd34de9c release23-maint
+33787 8f93b09b2bb5f34c24510ccfced79cf67d858264 release23-maint
+33788 7f5489184d94330abeb4f3606377cef653b58be3 legacy-trunk
+33789 6216e74b88efbe36859d99a3a642f94cd466ca85 release23-maint
+33790 1c45194d124d89524f4b6cd8900a9cc40dc08163 legacy-trunk
+33791 b076f69c5dac312c86c8ba5bbeec02117b859757 release23-branch
+33792 d05d0ed465d80165dead18ff9f918ec2c5908ce8 legacy-trunk
+33793 dbde3dd3106852efd21f38b7289b4338e314fc74 release23-maint
+33794 8ebb9b3576d13c9d03474d251a82e11eaa89b496 release23-branch
+33795 53c2ff1d81d1698ad09b3b5f34a4c47ac846e892 release23-maint
+33796 bfcc98de7fcc25048b899d58c348a050b51bf860 release23-maint
+33797 40f5f0b44cc447f78e602301ea7ca2340374e478 release23-maint
+33798 ba48e571a4d5ce9f6341f5c79fbd8411d706a347 legacy-trunk
+33799 5c8b2a6666c36fc632d2ffe0e45d0aced8cd6ffb legacy-trunk
+33800 afde402e3a55a99b257c9d2bfc68bf9ca09c7cb5 release23-maint
+33801 d4cce553478a810d04a92352ced8dafe3c602c06 legacy-trunk
+33802 0ac4396b1894a0e29d8c0b1cd590a4d1e6cefbc4 legacy-trunk
+33803 74ef8b8e006174a53c0b5a645c89130d96c1e2b2 release23-maint
+33804 e3c9b48de60ae274068b6848d023b6dfd140438e legacy-trunk
+33805 06016d5d81d7d4e1d480a3800a57878d493c0092 legacy-trunk
+33806 1c4d19b9baac653ff0c3ab9d75b859802115d6cc release23-maint
+33807 d6379620fb08d14a706d3756e7236acaccbffb21 legacy-trunk
+33808 3dc8f2b4248c2b83ed3a44cfb9dbf56af9b2977a release23-maint
+33809 09a2cdeab8c0ae83e29a0676f7cb3159560063ed legacy-trunk
+33810 530e23bf9e193eeacf88fdccc8eec65401740763 legacy-trunk
+33811 900327095b051403fa6a884024ab71e79815a7b5 release23-maint
+33812 528437a3f5f7a75c191088a797bca2bef40f3033 legacy-trunk
+33813 665f8a6f437db46bce837f741dc6928000db891b release23-maint
+33814 4353f04422e321fd124b1ec02c2c6cd877ca445b legacy-trunk
+33815 265079883668738f6df4c675f6edb5b95f4947b6 legacy-trunk
+33816 616a8c0cc91706abe041577ca9567b274db5f52b release23-maint
+33817 a88e6dfbfd6d34f107bd360fb5fcee7ebe645f54 legacy-trunk
+33818 fb2abca2d2d559c61d6d882bce17aeb5d4338403 release23-maint
+33819 92d68083a0fd67bfabefce744a994755f6b9641b legacy-trunk
+33819 8e63c5a33f470f7c363e38a7c162d249edcb2bb6 release23-maint
+33820 461030e6bd676c5b7d997bc716b44a829fd9b391 release23-maint
+33821 67a91f750c6312cc4f78933aa235b0304efbb7c5 release23-maint
+33822 9f6e2dee1892f73b9206eaa2c6c5651a6cc29d23 legacy-trunk
+33823 7b906571dc68b4f03a06411a4249932949387c6d release23-maint
+33824 fe057bea885669cd5d0ec9a051cbf0b7a5417ad3 release23-maint
+33825 40aa4a10f49b6a5bff203cb41ec149895e61e722 legacy-trunk
+33826 3779eb483e6bd5da43f213c9a52e34321b5e7747 legacy-trunk
+33827 720f44c6d11c2d14f05dcea54eec67d452219ea1 release23-maint
+33828 19c0f817cb47575c065e4745536e281bf8c9261c legacy-trunk
+33829 998b06730c9fb0e59cd1852a4b92af37d617e9e4 release23-maint
+33830 210676ec9d5f17ee64ff3ad73888e65ffa66c055 legacy-trunk
+33831 1598fbe693f99c85265320e12283a8db3cedfe24 release23-maint
+33832 29032f37dc8f827f3595e182ec6668a89a73f443 legacy-trunk
+33833 4b46d5449d4995722bc47743a49ee486eee56dc3 legacy-trunk
+33834 6842ceb39a14416d4ec770d59049253acac828de legacy-trunk
+33835 2c6f92cddbad9a9a2fa458fb56ffb521c898377f legacy-trunk
+33836 53f9069fc650eeacfbd8ff5ee65fff9a3abdb2e2 legacy-trunk
+33837 b8623b2c9bce6ab96f32d90f6c47ee19059b7828 legacy-trunk
+33838 82a1d3f210adf08a0b6610fb76de73ec9b888b14 legacy-trunk
+33839 c33d3689ed5b6ca0b039205906fdf7c3df926a02 legacy-trunk
+33840 de28d992885556dae814ef93d6fa6123554c7db3 legacy-trunk
+33841 5d0c87b9570d3acb7b19b3e05ba1b6986ca45e29 release23-maint
+33842 523c3d61dbdde734a0f56dbdb94a08032b230017 legacy-trunk
+33842 304b5a365576114218b8bc3daff86d13a24906e3 release23-maint
+33843 18b67ae9cf4582436763a58d8da5904e6ec35fd2 legacy-trunk
+33844 df654861ccf6a109f41352c3604e6f4f895c7e02 legacy-trunk
+33845 f746d5690ad6d839df5b4a77361ed2a1fba801a8 legacy-trunk
+33846 aa5cb8e3b9ea5b7d4d01e5f18d13a9ffc0db0ea1 release23-maint
+33847 f3654c5ada9448ca15145913b5acbda11f259b2c legacy-trunk
+33848 46bcab2b74e924849be6c1e6d29e3088cc646443 legacy-trunk
+33849 4505a0b9724cf17d05487fbec7161ab15ccdf7c4 release23-branch
+33850 05673b16bdb8c1e9a929239c3bf05f7be502d79f legacy-trunk
+33851 f4b4bf7e87d7e0be5e4fe4aebfda0fb386f6f268 release23-maint
+33852 d9f027dc676dd9cd551c6a0aa418fe63481f7342 legacy-trunk
+33853 7cc0a33946a30416f48e58292cee6469504d2f2f legacy-trunk
+33854 f0dfbc14148336b8fc6c087d74afdedeb28f0256 release23-maint
+33855 590d8ccabac7bd0c0525d5858a7caa673d1143d2 legacy-trunk
+33856 6d74f006f84ace84c69a901836dfc5f856b6e722 release23-maint
+33857 59bad7efff021694702c84b324b83199c8c7dc75 legacy-trunk
+33858 5686ca297f55f4f9279cc7d4603be3f8ad6f4a4b release23-maint
+33859 9f53e53f388023a10438d129ed2a261d39c1f534 legacy-trunk
+33860 0813b33610cc35c39c8513ff7ac819122b4ab39a legacy-trunk
+33861 e373630bfeab7640ebf15835199b56ee1493c161 release23-maint
+33862 a49c1b76106ce4ac8af54cd62e0ea3ebdad3221b legacy-trunk
+33863 e3281b0df6a41c5965a8b4175f0457f18ed4aea4 legacy-trunk
+33864 b698209b982788354d30d4a00f27c72c9e2d90e6 legacy-trunk
+33865 9b8916631eb69ec32e5c9c420552b6ef9a9d6dea release23-maint
+33866 4460979deebf5ec6553262d72beaf7868157462b legacy-trunk
+33867 941d49a65f06f121fc6a3262f6b6eb6f78b28c36 legacy-trunk
+33868 3329b058db2012ec6dc97b0d5d5a222a88d79be6 legacy-trunk
+33869 54617ed2d83087022966ff413c17c4f2d86aca6b release23-maint
+33870 443533d08783dc78d6f7487645e1201992db9f17 legacy-trunk
+33871 29b1d0763790af70c6a4578d21f2a0d49d25e7ae release23-maint
+33872 7cb4ad5932e626dfe5d78ca44b8d364589f5596a legacy-trunk
+33873 4708fa086121f23d274788be8e99bde6e8ee2f0e release23-maint
+33874 ef21681a9c7fb609928783ee8995867781b40031 release23-maint
+33875 dc4249dd9e353a8225def12adc711240ddf3e402 legacy-trunk
+33876 8e2ef27f688b5396062f69020011376896ebe4de release21-maint
+33877 2d274da09274769f0b12d3d1421ab72617dad0f6 legacy-trunk
+33878 942ceebe9671af86543c8b57ca94601ce2ae3d3b release23-maint
+33879 3dda53c312a5aab23cd094e635c32b59154e9d93 legacy-trunk
+33880 a332dcc7902b960aa026a9bc3827c3c04a256b68 legacy-trunk
+33881 9414886f5c7adc6199499e7c8b57d7a80ce8da11 legacy-trunk
+33882 2a941ff0a13665e02fea168741400ab15bffc54c legacy-trunk
+33883 b55d4a3f41e86e39875044b4a94b5b1d65be5d4b release23-maint
+33884 3db50d31340d93c18b3556244d33729201d59173 legacy-trunk
+33885 4ff38572d036e4fa3fa2f4c7aa59b56808aed6c0 legacy-trunk
+33886 71dfd1e1f2eccd218cb8562181d8966a420479ff release23-maint
+33887 60aae8a1e23726a453a4ef81af8522539433744d release23-maint
+33888 94665291ab1bd331dd273dd0f45a1b3d8e4b085b legacy-trunk
+33889 ccb40da8c412c601873588602807f75597ed4981 release23-maint
+33890 7bc772527e44db8c903dabcf818398e737b529e4 legacy-trunk
+33891 af5535b0e009e66830b00a9f8d348b62835765ae release23-maint
+33892 3ea52bc74d171f3be8ce8d9c0a32941d5ed1b1ee legacy-trunk
+33893 d279c40bd7b36bce3108e2a77a67b30f816a157d legacy-trunk
+33894 a55feea3f921db5a10c04c8ae13d7eb85f20034e legacy-trunk
+33895 fd824d574a8fdd1005478a8124cc60d3f2e38395 legacy-trunk
+33896 131c54f202fd8446243b57d2f35fad378f7a7b57 legacy-trunk
+33897 0fa99d31fb48120e461caa4ce4e1c5558f01745f legacy-trunk
+33898 c10a1cdce62b51b79a4f4f9384b6ef101793dbd2 legacy-trunk
+33899 9a5d6eb81cfaaf376bd04539dc5d9f24cb55afdc release23-maint
+33900 3b9074ad723e4bf2a5697cf7f2532a11c2f0949a release23-maint
+33901 39e928d00b64398c77b48879896d0d8520a5556d release22-maint
+33902 d78779187c7df0493738dabd3e02600c1b354253 release23-maint
+33902 ef1f2973fad80908243313bd56ffe9f5f07ae8a0 release22-maint
+33903 5c54a78f1d5152b15dc10a743f7de79fce4a4b27 release22-maint
+33904 bc69e0dfd2a034497b56ecd03907fcb0ff8d5b73 legacy-trunk
+33905 669568899309fdb88c8845e6d31cb2ec0d997f15 legacy-trunk
+33906 251fa07fc5d1f5f2c000f72a31ef463f7ae93171 release23-maint
+33907 4c0af22a8f3d126db7a8ed47e2659f98852ea97f legacy-trunk
+33908 41b6a5367ee5646b8ed6ab56505656c6467f1966 legacy-trunk
+33909 dc01ce2f85582dc24549e1c5908fe31622fd6e9c release23-maint
+33910 756b65c79f400245c1db3d9a2a19879d5846c42e release23-maint
+33911 0aac07663448e300d5b08382af96e32856bcaab3 legacy-trunk
+33912 f8ebade2e724dc61fc2b6f73b78787081f73c6f9 release23-maint
+33913 d2e4c94efbaab310d0c4877eda95957568f75ca7 legacy-trunk
+33914 ac86b0717ad19463de379478df2053317813f4fe legacy-trunk
+33915 0fe60fa617d8dc7041d75fa9982ee1a7efd48bc8 release23-maint
+33916 2db8c63e69cd64f2b9a2d0d79539c95a16cad497 legacy-trunk
+33917 6c1e47d54a7a301d83e3b7ce89e52913b3ae5143 legacy-trunk
+33918 a380610eeb5ac795da399e29a9604a67ab40f642 release23-maint
+33919 d15d44d9d6f5cdd5d8a1bf87a181639c01bb0c8b release23-maint
+33920 5e93a4f6d9a99fa23a2593466b490ca02b3325e4 legacy-trunk
+33921 b519035006c71980c05365313ff9739bfc557817 ast-branch
+33922 e4ff0db3b0886d03df47db81b65be6f31043c53a ast-branch
+33923 ac0db034dd14bd7f0d450473561463cb9c12edc2 legacy-trunk
+33924 8481c9baf785d5d2d702295ef1f3ce07c922b8c1 release23-maint
+33925 7ab1a41f16dab1530036c1267a64e7f10fcc02e0 legacy-trunk
+33926 21d3b06df793cb1ac68591c6b65fb6db056a8dc2 release23-maint
+33927 8287f522bea1784cdd531a6f3f25b1f5b7b61865 legacy-trunk
+33928 df8cbde5c588298b5fce9b0573f0809ed932e49d release23-maint
+33929 056f16a7abb03496995672223b6ae34ba67cb0c5 release22-maint
+33930 4000cc6da9252207ab89fdb9f8584f2fc5d35307 release23-maint
+33931 a5f606f9ca0571a24ee3f081ddec90364b25c9f1 legacy-trunk
+33932 c06dffb6a98229141f3420de41d320bf41d458ab legacy-trunk
+33933 e8173542393fc4735e161eff27a09594bb7a41af release23-maint
+33934 24341cb21fd5cb18f3f3e7cde5a3af03f022e6e6 legacy-trunk
+33935 806179400f354edbc1ec333f9ceb68c8c41409de legacy-trunk
+33936 c30ed13d358209a3b84b210822f7a71fbb4faa36 legacy-trunk
+33937 a0f53a069470353aa58241cce49d110fb4d269fc legacy-trunk
+33938 109d63f7037c93a3fdd11ababb0d7992d41c9aeb release23-maint
+33939 496968f3649e8c138448bf13117daa975397dc71 legacy-trunk
+33940 dd451a63f89e59a16187390bb73ca4ed7e5a229c legacy-trunk
+33941 b940ab9a2abf44f3e998454ce374fa0272c55b23 release23-branch
+33942 dfbd28112e097cda65bb220070ce246b30c1882f legacy-trunk
+33943 d8b7687804b237d86630a147a8bcc3ad3d17ce8f release23-branch
+33944 c47f5ac8b06dd3ddea6de5731108075bd97efe62 legacy-trunk
+33945 3d4a5503e46d912c3873a0299136712bc05a361d legacy-trunk
+33946 7f34652d71612aecead8365c287268f2fec29f95 legacy-trunk
+33947 c45358935ed3fff8fa09e17aea73434b182e1ceb legacy-trunk
+33948 4214714abacbf2394f6bdf7c1af28f7cc59005e2 release23-maint
+33949 a570bb9f133f709284fcf5ac9e3cd6e481004f98 legacy-trunk
+33950 e83575bb29da90685f088c1c672cb7fc2c660fe1 release23-maint
+33951 f1ea311127cf159790b989be058e706a517a89e0 legacy-trunk
+33952 3fb3747ce304c19173e001502369f49952fd6cb5 release23-maint
+33953 7f660fa288aabfe99314a80722ad6a67b79d6df8 release23-maint
+33954 53a322c6de522a909049c44b00b012ac0523c071 legacy-trunk
+33955 9e3d51bec53a27e96ad9fabeddac818479dcfa5f legacy-trunk
+33956 4976594505348ea4964bcccc4536599093ab913c release23-maint
+33957 97f3d66558fb8ea714a7bc17a21d877fc3b032df release23-maint
+33958 95695cc45cdd2ead5dcc622582b02e9de20da1b3 legacy-trunk
+33959 9951b6e9a3ea57be4b83f533cb982e16a7cfb1fb legacy-trunk
+33960 bf2aa7de437d346ae98609b701604937ac3d22f0 release23-maint
+33961 830c0cd8fdb220221fdea0d92f420c7f70c71991 legacy-trunk
+33962 0dfafaa10401c15c94b26563a1b72d724b30a3b1 release23-maint
+33963 66654ac69622f1b198daaf42fc7f6814b523d040 legacy-trunk
+33964 3a50f8369ad564e368c2e7182c83b1225f412c75 release23-maint
+33965 718e1488871d403151c0540d2bc79ce6d311fca5 legacy-trunk
+33966 f9624f94061a7e50e6e2ca7ad53488f0bba05883 release23-maint
+33967 da1b191b0a6a2d95093a4e22e262a370290090f1 legacy-trunk
+33968 a55eb54a56d0bc57cdfe3f678b7557a9789b7024 release23-maint
+33969 37a4502f161074f6d6f5ebe1f8b9bf45d6c4e7d1 legacy-trunk
+33970 9dc5e71596f7fc132026e0b91c9aa8df16ef2307 release23-maint
+33971 ebb83f266fa4f2d48c7622db3b27f69a81036502 legacy-trunk
+33972 270052f6f0e1ee0f0e71fd9f64d4c131d1294472 release23-maint
+33973 7b577377d546fe6773e24f9624bb7810b625153b legacy-trunk
+33974 948fd34eb05096c038201f3e417b268dba940be4 release23-maint
+33975 114d693a5b893ef3589db3a406fc591324905302 release23-maint
+33976 51744279458fb0049a452e9f6b051e57c14f4e2d legacy-trunk
+33977 57951ba5e9b10799dd049138cad9bc2b2e22261d legacy-trunk
+33977 0c13ba5359182f2a469ab1e010fb8f866edbbb8b release23-maint
+33978 436d5772b87fff9e823d8801318ef48490ef898b legacy-trunk
+33979 0f26af7c3b52b1ec961f8bccffb5efdb34dd2feb legacy-trunk
+33979 5c0a704e1be4d7edd23e3c047c4aad13c0c5701f release23-maint
+33980 a4051ad7666e5d5f3efc7963e742e9f1a8df09f5 legacy-trunk
+33981 89375a13a18c8ae97cd184d4a84a738eab3e3488 release23-maint
+33982 244b55c90e0f3066e2d338932b202aceb9fead04 legacy-trunk
+33983 7d232981d3e38c46f093b7685bf9235ed1ebc449 release23-maint
+33984 ff805a147b6a918988f35404e639308509165708 legacy-trunk
+33985 b177c96ee3503ba89a2cba8c3a2ffca7026de23e release23-maint
+33986 66ba0e0ec202698e033fccdc1718ecc14cca630a legacy-trunk
+33987 a74b463bf76da7f31c8fbff9547c00e21195c949 legacy-trunk
+33988 84988e7bc7b7bba954c2ed7fff5808587328e28c release23-maint
+33989 717cc2c9fd60ec79009f9e57f2d23674d59e7511 legacy-trunk
+33989 5ed40f2f65fb5aded8267450501b4fccddb09991 release23-maint
+33990 9a0aa1dbf351470c192d45ca5d0e30999ddd0269 legacy-trunk
+33991 63100cc3f15af40afa712a1d4647453b3cf5e5cd release23-maint
+33992 cc2d9ea4ebd50fc648fd5ac4e5ca6cd9a27a5d42 release23-maint
+33993 df0093a5985c3cb18e1bfb8f2544eb7d5e34ff08 release23-maint
+33994 22502f795b49c8376e617188852840bafce187e3 legacy-trunk
+33995 4a59122a6646a1cb060c27d2db260c820e5c1a5d release23-maint
+33996 1d6d6fb7f10b77bceb1c25a2c682799476188e93 legacy-trunk
+33997 8091bd92ee015bc60dc9feb070e474d507d617d4 release23-maint
+33998 4b4b581b3b2c83144df72c890c7387d193293908 legacy-trunk
+33999 26d3f5b87ad3dfae787dc88820e50e6f3e65eb3e release23-branch
+34000 2905646a2af3757b09163f6c80015e0c8a71612c legacy-trunk
+34001 79b1a9ec52231012e2a4f673af773f86695002d7 legacy-trunk
+34002 646f0f11c519b56a31378e636a5daee12d3526f1 legacy-trunk
+34003 115fac9d90456b9b58595f9ddea4d2cd78f96af7 legacy-trunk
+34004 52f4f2a8cce79da37cd8a8c08df81433d312a954 release23-maint
+34005 55a4a417273ed12077c24670af277b41342326b7 release23-maint
+34006 dde594f70d6ce4c1da8d772a446bd86523098fb0 legacy-trunk
+34007 bfc974def47401c1319616688c3ed1f2c7d833a3 legacy-trunk
+34008 700c0ca429efcd494ea35bc654f1fb938f8af408 legacy-trunk
+34009 6dd9c7c5aa13d43fb4e03d70df2c0585dbd2c7f0 release22-maint
+34010 da434b5376649284bfb131197f838b152982830b release22-maint
+34011 77da9f873a4fe41717dc684767e81035d4d00a80 release22-maint
+34012 f4295559ea836ab571b3f4ed8ec43780846fe0dd release23-maint
+34013 cb281538373cad16216a05340622e016b5c34948 release23-maint
+34014 24c62f53a1c92914ab0480eb70f8df7a8fae4c51 release23-maint
+34015 41ff2c13ea4a98a79e78915fb462105e829c8a92 legacy-trunk
+34016 1793b65a6230fe46abb33cb017b93641592c65c8 release23-maint
+34017 c16c553860c2defb487391eae5d5866fa33abed2 legacy-trunk
+34018 fed6501188da427da6efff26c49ecad985fa23a4 release23-maint
+34019 74bc3493ce0352bfb78d6b031a3180ccd38d8963 legacy-trunk
+34020 f003e48f562dd45accb4d694e18bbab7ae32f4a5 legacy-trunk
+34021 7e3a1d3c90f530ae0343e1f9e5a74843bfc649d8 legacy-trunk
+34022 6790cf785f8c5c3eab134c0f5814119f1e2978e8 release23-maint
+34023 33dd12b2ebe6d6670620009caaf6df18adefb9c8 legacy-trunk
+34024 13a914e0c5c144c67953e6b7a9bfbce68aa1d6e1 release23-maint
+34025 19611d101d23129a1fb1968bfe3cad561a348eac legacy-trunk
+34026 c2507fe2e69e1188026d790476084bf17a1a24f7 release23-maint
+34027 770fe83bf89f656d9f6b99b97ce1f6b0fef57768 legacy-trunk
+34028 16c592d316c2a94d0cf1022bc8b55e0917aa2594 release23-maint
+34029 521d026a8048c93efd3f44d7879bbe5b9c038e60 legacy-trunk
+34030 214df62bcf13a8f9f034397320ace183b21c0944 release23-maint
+34031 963c680ed9b20b62fdccc58cfc8662448e5de584 legacy-trunk
+34032 0bea9d38929dc394482f3f03819cf8affc7fe8ab legacy-trunk
+34033 06075f1bd945b65360520c5ad696d1aef3f9397c legacy-trunk
+34034 d5a6b6367bb1c1f6494f5dcdede2555e78385c10 legacy-trunk
+34035 a640bfeeb9b5635297bf468963b61b4ee052207f legacy-trunk
+34036 78bab8fc8ed5cff206cebb3e7137bb248b637c2c legacy-trunk
+34037 2a82914b08c5e0e26d074e12e24504166bd869b4 legacy-trunk
+34038 7dcc454a70c3b077e53b325b1d7ecb450b1470a4 legacy-trunk
+34039 2ec92febcd1a8f6d8438148d24ea1224ea1e2aaa legacy-trunk
+34040 16ce7e947a3442b152d2db0cd6a0bf21624030da legacy-trunk
+34041 6b84802c952424ceb04fa3e79e0f3d175c82fc1f legacy-trunk
+34042 b533224f1373f7357708cb95a78fe3abfa6e7df2 release23-maint
+34043 3afbc339756a6b7be67f9dd7f5671ba9d89ae43a legacy-trunk
+34044 387a9e184074aaf8b5f11dee0c535a3f28120018 legacy-trunk
+34045 c42944ea9743e67bff4a230bbd8696c0a2a5f371 legacy-trunk
+34046 562089a8678f28026309af343daf33010b6a497e legacy-trunk
+34047 05a8509cfb3cb195a8032f870dd1d55b79aaf078 release23-maint
+34048 63df74305d7bf4b9306b3f1a67b4205fe53cc769 release23-maint
+34049 a11e1cb306445683cd526a3f0afe6fe8382ca2a0 legacy-trunk
+34050 8ed0ce62b82f195d139918cface45605be1e600d legacy-trunk
+34051 d5dabd151753a54000b16ead436d2b7a269dd27d release23-maint
+34052 205cc918f1aca8efb57e7ba9c2bae4b860b157f6 release22-maint
+34053 d59eca2efa6a0d44ed7a7c4659fdc44421bcbd8d legacy-trunk
+34054 00453a0508dfe767b5f5569b56ac049d0c486c1f legacy-trunk
+34055 aaf6b6a8510bea0be78784ddfe279bb6e2c17eaa legacy-trunk
+34056 f6fc6d0cf1e5ae73b864591b39a4b4240682b442 legacy-trunk
+34057 804d1cd1b06deb44c4a49b1a9458c58de532aed8 release23-maint
+34058 d6153603472e3c2d52c18cd02a098cb858d487ed legacy-trunk
+34059 f86d863687c60635142664027a8a3ce17c8b56b4 release23-maint
+34060 0891d22adf4f4b8c5097ccde05f408fcbcc4957d legacy-trunk
+34061 1de1da3ee3e87dd2bbe05621cf24c0629beea452 release23-maint
+34062 8b9a8c4de28e6b5b749813bbe2661b53f35318dc legacy-trunk
+34063 06eaef7d02f21e3441e8f240123d869dda91eae4 release23-maint
+34064 e5bd50c7e19336b44a30336d45cc63249e103d01 legacy-trunk
+34065 7504812fdb7eb1c9e2294bfe1de8b71586db0136 legacy-trunk
+34066 f14e251369b2d5c88ce7d1e63d822c13fa6835e9 release23-maint
+34067 85e642543ddaa6c2997b41461b3ba0a5f03870fd legacy-trunk
+34068 4454736c6a82ea63b4c19bb4a22518d9501eb68c release23-maint
+34069 be9582734b56ae1f1a61343e6bbe1b78330cb2b8 legacy-trunk
+34070 38e8753534b7974000368a90fc4a11c5e2d736f8 legacy-trunk
+34071 21b2a2159046dbcffe5e22cf046d25a1314032c5 release23-maint
+34072 8dc94bd9b83ae0645dcaf4d72a3b7a57a4dca3ce release23-maint
+34073 80a4b8f6ae0e52c4612099d5cf18ab3eaef55b60 legacy-trunk
+34074 46bdb66adcdb762029dbc675129b516ecaae2746 legacy-trunk
+34075 05e8b503cd414e2b36a7f14019f3d91c68764fbc legacy-trunk
+34076 4ae8b65caba8889ed69a1a1ecdad2225076aa396 release23-maint
+34077 c3b2cd6ef27f88d99d1bfe0a1ca71e84604981a7 release23-maint
+34078 e4cc232ed5830db25e2bc9fd01e8359cecee230a legacy-trunk
+34079 3b793cf748c5690578be298dc90527c2eed13657 release23-maint
+34080 dc51abc3f1746d518b901e5474ebefbfb8710f77 release23-maint
+34081 db31d25b137a433685d62ddbd5df9cd671aa8ae4 release23-maint
+34082 cf7fad9d6fcc34a8875dbb37aa19ec395fde85d5 legacy-trunk
+34082 d05af1562c64f19816b26d958db9f4c8f0d42207 release23-maint
+34083 4aa84a8b1fe497d72456cc649fd681346e646aa6 legacy-trunk
+34084 3edcce0efc54b8c2546a7b4c1c20f5570aec5ce9 release23-maint
+34085 5155b38502d4831a3ed516f131fdc815c54053dd legacy-trunk
+34086 35f9249650e6b5c9d79b8f39d82baf1e6c1a65cf release23-maint
+34087 0c368ec0cccb44de65cd7cc8cc22729d16aa926d release23-maint
+34088 accc251cdc4a9ec0ac6f2805261a1653fd03d419 legacy-trunk
+34089 a52a074e8ae5db154f9ec00da5391cdb0bbe7d74 legacy-trunk
+34090 1987b855cd3a0c3e21582fe74d16f138fbd45d3b release23-maint
+34091 fe1cd3795a7a93ae6ead7d0262c4d15e4a01e466 legacy-trunk
+34092 993e3ca346560c1e1be2832c299b5ea9301d88b4 release23-maint
+34093 f15a11cf853163ceea1cb54f20aa7402afc894d9 legacy-trunk
+34094 280b0a1e31e3641c49f4f9742a3f411281aed785 release23-maint
+34095 1e86f2f712f2193f86120d6f0208e63ca033fb93 legacy-trunk
+34096 58ffb6b9f6c572e517b97444ad8ec5f9267288f6 legacy-trunk
+34097 c972d9e431688e4463156cfcc4488c88b0286921 release23-maint
+34098 6a9101471ad371b811e7c73a3cda0658fad5b685 legacy-trunk
+34099 aa787e3612bbc6fa5f7294bf0a2885b6fd467525 release23-maint
+34100 0039928a0f8439bb3eb0d14037b649b6185782a2 legacy-trunk
+34101 e38ec4cb87e9c16427bf53e33882a837e7ee5c8e release23-maint
+34102 d039b1bb1ea97f5211d960fd267a4bd703f42ad5 legacy-trunk
+34103 62153e82564ba313d7c69343be575ad43a401b44 release23-maint
+34104 e44a359c898e0c150307916a4b8b7b994ce90781 legacy-trunk
+34105 10ba6567852fd068ff700fc5e4300aae7912d21f legacy-trunk
+34106 94f252833e1314f0e965254c121d65e101ff5363 release23-maint
+34107 fd16018407e7e5344479d8719dd663be4fdfb6d9 legacy-trunk
+34108 96756948d1c92494b90268465c4124607ab81a66 release23-maint
+34109 11c32095c30561c1041d32511aa53f49fa97a551 legacy-trunk
+34110 a430be683a7ad33b5b5d20997c2a8bccd7c2a4d1 legacy-trunk
+34111 a6877ffd9582d8ae03344775f16be430330f27ce legacy-trunk
+34112 54ab1955d242e349d78213763db7bcc666b72b7f legacy-trunk
+34113 dd98f29cfc986330d29ba277cf0ffe7863793fca legacy-trunk
+34114 7773ea7b1c67491d853eda43bd39c127df94ea04 release23-maint
+34115 b8737a31050ca3cc5d0bc3734b645c0aa5466096 legacy-trunk
+34116 62ae219144c4f62ce5afbec011d6f9e53ec1465b legacy-trunk
+34117 045174f6a79db33bb107434a615f3a72d76a571e legacy-trunk
+34118 41bbbb489764c8c6f7db39e22817ce1cf2fb66e0 legacy-trunk
+34119 34bd5c198caf87249068df29292d48480e971540 legacy-trunk
+34120 68e1f86056bc349b7ecc3b82542ed87cbad2fd51 legacy-trunk
+34121 53f1c32ee69d75c26f54b31ea1e58c36cf83771b legacy-trunk
+34122 e17c44c79b03e71987510c1a52147dae7d23bf88 release23-maint
+34123 37f0e0b14003855b90a0abbe7ffa2277c1cf7684 legacy-trunk
+34124 20d97885e5c8934d49d04ce3d3f38a23adc20c02 legacy-trunk
+34125 23921bc8124bbc5c067924e06c202adc1e61c8f3 release23-maint
+34126 c68eb4d4b7879e20482d331accd2bd474082833e legacy-trunk
+34127 f44d8addd3e86a1ee072dcd9dae181db3695c832 legacy-trunk
+34128 13ec8c479ff103b49b370211343131a89b8d3103 legacy-trunk
+34129 39be99c677d5e27852615139fa21419d71729569 release23-maint
+34130 4d204fc3ad32f0a384dd6c2bc9fd10e63144823b legacy-trunk
+34131 7433e7c9e2ca45335c1fb656421b1f9d496f9a47 legacy-trunk
+34132 4627c16849aedc9b55be05fedbf701ce34f03d2b ast-branch
+34133 a274b9035d1eae2390a8d72f9b59d40891347e9f ast-branch
+34134 1edb5473809e6b8f4e62105dcfc5e66ec591f497 ast-branch
+34135 95ab55d14256f680292060a758d92b093053be7e legacy-trunk
+34136 d864f3168cacfcb5d0ba66abf6c5775fa489e715 legacy-trunk
+34137 2f5822d0f8e15c0bba5d5c903f0e70c76137d4f9 release23-branch
+34138 79919c550dfeddae7850917bdb519388ab34cc98 release23-maint
+34139 0a150ea8cbea28f4cb80c35e7f4b253c8a02afd3 legacy-trunk
+34140 c2c10f1eb8e2b74bbc84ca476d100e1934b7ff27 legacy-trunk
+34141 c9cc35249322d78f113356b27d441f58e8e8dc95 legacy-trunk
+34142 a8f04cbf659cb026cc2b81c3e4cd0b4a2ac4af11 legacy-trunk
+34143 cd0c3f916b34ccf269e56d2e8c46ed2413748c61 legacy-trunk
+34144 e8147f841a4ab2da3e7db1c6e098b1671f6ee062 legacy-trunk
+34145 c9f9eb13eac9305eba134d811d84560edb68f2f1 release23-maint
+34146 1725470d0d43cab2c8d1700fa0cf989fa17a09a5 legacy-trunk
+34147 ed8b3c028174b0526baa3bfdba3f52cb713e8da2 release23-maint
+34148 6bfb82bfbb56cddfc31a221d318f114e10bc9364 release23-maint
+34149 41c2e1723cddd7ac17c7ddad06f0f43688862f54 legacy-trunk
+34150 ef4a71f5af2238ebb6ab48cc09d9a5d2fb1c8307 release23-maint
+34151 30e495efe90a365d205324afb69b45a515d2fb95 legacy-trunk
+34152 784e38abed820316eb086316f63f0d2f702518f6 release23-maint
+34153 76e998aee6446585f18a34f4b70d817895daa0fc legacy-trunk
+34154 59b0a48a5644507b3c693a8bf74d9602996b6958 release23-maint
+34155 f89ab79853a70c39e19f53f3e9f588394e2793c4 legacy-trunk
+34156 0b0ad7d1ddd6a98530f4c8a4c8c1de47f3c5875b legacy-trunk
+34157 72bfc786a4f892d513f305f07f01618a41c4cbc9 release23-maint
+34158 a8a1bef407eb26cc8be4b314c9f5c5a6b75b439e release23-maint
+34159 662233e66d282eca07f76bf162eba971b6431048 release22-maint
+34160 7cb6745be525c0a84ec0b19b14446a0034243bc3 legacy-trunk
+34161 2a49709c0d563e4bdc24655081a1417e76228652 legacy-trunk
+34162 834bb9a15419b0f61d91b7f73e9df1b33fe3e4c0 release23-maint
+34163 b39cb9212f5c88cc23e849a2e75b910034b1693a legacy-trunk
+34164 ba1e03cd2f40fa12c319efac745d48f829c3dceb release23-maint
+34165 a85a7012ddda73cef5d0fd6ff255fca37715350a release23-maint
+34166 0cad9094e23e9cb712790eae9262fe587c53e322 release23-maint
+34167 bba7e1e0f1c753a82200dd03e0d4fb12df21f7e1 legacy-trunk
+34168 91ff72703ed35aadf65d4daa9f41770c7cb00aaa release23-maint
+34169 9233ad0eaa9846aab7e588655ec2b0fe707abe4c legacy-trunk
+34170 61dba0aa9e374df22950fad493127bea1388e8be legacy-trunk
+34171 1d63106e7dfa4883c1c0a4f801a353b6f3196277 release23-maint
+34172 d5c45b8daa52bc18fd095d72db7eb9573ada5b47 legacy-trunk
+34173 8d21fb2e26b069397349b8309142815fa962b628 release23-maint
+34174 65bac59a3928068e7f9385b7dd29c9c3d36c3970 legacy-trunk
+34175 cb72369920acac16b1431ad4259c3098100fcce4 release23-maint
+34176 d7f13a49e5ef68a2b548ad3609de85d0bc92a7cc legacy-trunk
+34177 5f92d6607b9f0ba245698d56d625eab616648fe2 release23-maint
+34178 1a817694ecbd7e49fc915a5eba9dd56c19f9bb4d legacy-trunk
+34179 518ccc064cb9f32b6a61f49c62d00eb23c62a704 legacy-trunk
+34180 a37b23714d3dddb596e1efc15e193544dfae32e7 release23-maint
+34181 55857aebc24f23f2f2e0e8852d44ed2049f6d730 legacy-trunk
+34182 1e1e685d69ef78bdb9917670981ea7ffa2fdd4bc legacy-trunk
+34183 94d829367473703b18d9daa54b03d03ea0531ff5 legacy-trunk
+34184 084408fee9614e5483efef0e6f592e5c0a037682 legacy-trunk
+34185 425bf07ea70b8c2d1e6a1ba91fc9bb3b2512e0f9 legacy-trunk
+34186 8dd07f7d093b7a0052fa73dd62513b70c193850c legacy-trunk
+34188 185c5f6b6157840b0541ac01b2785e76b5c395e5 legacy-trunk
+34190 dba6ef304aa4408806f2ada308b7fd9b224d9825 ast-branch
+34191 76d9d18ef3e495ab0b0f6e382c21d9974d449c40 release23-maint
+34192 07e640c4016dfe38d225aa42bd868ec091d8615d release23-maint
+34193 b2919a4c558c6f408a23cb6a3a9f6e54b106bba1 legacy-trunk
+34194 2f3f56f1280fcecdac09fc1315f8d91d1067cb78 release23-maint
+34195 9df9bd430c36d2c838c16ca5a0816f7bf6bcdd67 release23-maint
+34196 77ac45580c408d5862f46ffb0e2ae6c765e45b4d release23-maint
+34197 51e85e8bfa4732ac980669b314db2627d63a89c7 legacy-trunk
+34198 c48a2cc93780f41a77aafceb7a0a811634703079 legacy-trunk
+34199 1a792f36b69e36a4c5befa61a237fbf5be80b7a5 release23-maint
+34200 02257f6a682a78317ef46f95ff13bd6ce145c889 legacy-trunk
+34201 1bc6ef1f6bdb4791a98451f3e8ba27a5e293bb75 release23-maint
+34202 d7bf1232a86d144d4ba170b507b6d2b0f8194fee release23-maint
+34203 b0c3d986f63f75835310d67db93194c3a81384d7 legacy-trunk
+34204 a7c4aa81eb85c010a7b859d37333110a16b507c8 release23-maint
+34205 76979afc785bd63d00661bfd5dc12eb03db6e97d release22-maint
+34206 ad253c06baf1d4af2a321397cd6476cf2413bfd2 release23-maint
+34207 0967cb90534cc6a7ee1863b880e0a30c43e047a1 legacy-trunk
+34208 e2b9d436f8f7af9cabf10da69ee0643de8bf4f05 release23-maint
+34209 3f28964f8eccc94013e868d230c71ee5cd28e2db legacy-trunk
+34210 871776d38213a9067c6d9baf8918eadbc17d389f legacy-trunk
+34211 177658785feb8d26315a91dce897c6b958e25207 legacy-trunk
+34212 8360c74d053bad5bbe0339fc3cb9e41c88ca6536 release23-maint
+34213 5c5adb5443cce89814bde0ed730380ced3565138 release23-maint
+34214 d6f4dd5a5006b9f13667654d393855f7ad129fba release23-maint
+34215 339c8804f804a8ee451eb85bb2c33377e835b3d5 legacy-trunk
+34216 58f01cc0f300ab18f1481ec4066cf379c23d64e9 legacy-trunk
+34217 58f96a00d38dc002ade8188e4f4ee640afbe0f0c release23-maint
+34218 254bd3e891f6d9591c91e0f8bb1983104f6502c2 legacy-trunk
+34219 0ed1eace2a60baea74dcd5e16bd39dccce6c9912 release23-maint
+34220 f4a01c405a44b61705a13cf7596e5e9bdf229571 release23-maint
+34221 ce8d1f951e192fec8f467e3504abd4655749cd35 legacy-trunk
+34222 d75592f6e2f7cfe0ebd879301432421519657182 legacy-trunk
+34223 954b609b84cd0996fb4fd3fb4e807da75bf37290 release23-maint
+34224 774a9f21edb97d448e6a559a63526711a9da9041 release23-maint
+34225 e97230e5c1ca90f77ca275268ceff48af927491a release23-maint
+34226 931e888991bab741108b0f86f98a016a819d78be legacy-trunk
+34227 f3ce19d961dda6e53fe477b60885050653b8aa27 release23-maint
+34228 5383d562a38d81be2e8fba40e7e53d99141419d4 legacy-trunk
+34229 6e1f7dbecd84d53b49fd80437b0350dced96ad31 release23-maint
+34230 c97008ee7166074b049982d893d62dd7da090a8e release23-maint
+34231 b2728c87df9fbf233478a3f75689690e69cadc1f release23-maint
+34232 26cc5865a836633bf3f0ffc3f7c3594189d645ed release23-maint
+34233 a1b965e1bbe9d8f4d86b4e9d8c17b358534ecb13 release23-maint
+34234 816d4867f21065e1b392a8a9868d17f4fd004486 release23-maint
+34235 7e60d82730fd8ad4163719c625dc9adfbf9608f9 legacy-trunk
+34236 0182cec508aab4ff9e819a2d77e140506f148258 legacy-trunk
+34237 db63cb0fc7da179a4a32a24bc2a4e7fa1010fb6d legacy-trunk
+34238 9c2eb415130f34d3fe5ed747f7532f1d22852470 release23-maint
+34239 7389ff57787390b3473211d7fd5690a18be4203d release23-maint
+34240 b92b37b01ffb1608334ed9ae26c32005cc5708d2 release23-maint
+34241 e5bacb9597f7b44aa7dc0d2d420a958db674cc25 legacy-trunk
+34242 fbad3efa40bbdcf6d4b96a39e052d616ca4ab072 legacy-trunk
+34243 62c6afe37d123aa3a84a017c90bf7779d2153fce legacy-trunk
+34244 929e548174c5fae93bc90f50b621a0fabade197b release23-maint
+34245 dbe8391ed06f239b439d5ce12b2bbb97047a8078 release23-maint
+34245 fa65f6527fe134aa97e03e1b2af365d443b67dc7 release23-maint
+34247 da9b7407e56c2aae9d2466c0c4a65d00ba9e4ae8 legacy-trunk
+34248 a15b1c3c236a4b24c9692850e0a453d55358e611 legacy-trunk
+34249 717024dbbbac7d87cdc4823c60d99ca8a6177414 legacy-trunk
+34250 2a165ddf222dc429b758e27712560748268de967 legacy-trunk
+34251 5290a4936170dc88fc38f8f7362a2a4c583e0201 legacy-trunk
+34252 bb82511d1906a2798b2058d592f6b6e88a0151ed legacy-trunk
+34253 693d17dfb8fd48d52264abd980567487db8965a9 legacy-trunk
+34254 56390891d988c8759ea10c904d314571e1820bd8 legacy-trunk
+34255 9cd4f4ae7a4c2b8cdce3aa64a7c14770f9f66c6e legacy-trunk
+34256 5ec4233edcedc47255a4d11c7f0d86622efbb205 legacy-trunk
+34257 703782d901613c608aa69523c2bf5e5709b2c83b legacy-trunk
+34258 5d2ba437e1bd3b34ad575ca73e89fdbe3c1f906a release23-maint
+34259 e2f50a7cc494f90749281f33b38cebbdd6ef3583 legacy-trunk
+34260 2ce9f89c4bbc9b57b4f97d7672aaf914c9918c01 release22-maint
+34261 dde276a88c88a0d4ba2569314797dceab4c86c0b legacy-trunk
+34262 361b50a0d27fad7b4cfecffb86f21ee569c669f9 release23-maint
+34263 332bff275b218c4e8d1d783ad22f373a413e8d8a release23-maint
+34264 ad18f5b8d6f4c61b2aa7786c5475f21485a43efa release23-maint
+34265 8c9f48ba50fa1651286d86d71705a369392a3db4 release23-maint
+34266 0457049f25e0a0a177c3e5160043f8c577bb4148 legacy-trunk
+34267 b7a2135fc156aa61a7102e60619ca945ca7cde2b legacy-trunk
+34268 032b9258885b718293e4c7eb39c407b34dedb0c2 release23-maint
+34269 a5671aecf39013c6c690504c74856a96a62a07e8 legacy-trunk
+34270 a566c49b70faf9f674b47f24f13d4e498f01876a release23-maint
+34271 8529eac5065d21697fe7f75a2b1910b34afa7178 legacy-trunk
+34272 d96e7f82d3999994ba8e56a44085456100446190 release23-maint
+34273 e1baa249b3f23d92249e5bcb40dfedf04338cde5 release23-maint
+34274 6f3343de65b22c7316a76c666876c0fc8ff039b1 release23-maint
+34275 12da34ef8854fb134df1f88767af37bbf8961528 legacy-trunk
+34276 7f48e89439e0bedc33ca6a91752d5364286ccb4e legacy-trunk
+34277 dd4485943f23f485aa8070f89ca7fd9709a38fb6 release23-maint
+34278 94b4fce7a998b2382bd926a1c3bea7ee52fcf1cd release23-maint
+34279 6c0402dafb18cc58ab7e99bfb18524877631dcad release23-maint
+34280 63ae1b91a86855addc4aef45922840c24907ca91 legacy-trunk
+34281 035c9783a4ddbafa174e607d254b768f760ac94a release23-maint
+34282 8540712d6e2d3175c81a911d07e662b9aaf9f221 legacy-trunk
+34283 e18c10ca74082868daef62eab32ac8b5cc3131dd release23-maint
+34284 59b851b6ad33a57f51056c7316b70f732e0d296e legacy-trunk
+34285 a53eabe02729847cae48b845cff8e803e2e78aa5 release23-maint
+34286 7bc51be75febfd7227e82a90763446b2f188aa6a legacy-trunk
+34287 3d1ae1c86fd393671754e328e0ca73093c3b4749 release23-maint
+34288 e6cea77abee36ff1ef1971448c4e1619ee2f8a14 legacy-trunk
+34289 06164c6dc509f14c3da9c4015eaef40676f86317 legacy-trunk
+34290 bd4c4b6e09a1724476b1b19bed1ecce54a242a50 legacy-trunk
+34291 0c9aa7e554157c58cd81f6cdd24d1e059d22e904 release23-maint
+34292 fc7ef4fde27a1edfdfc07d54566df5175d4e5987 release23-maint
+34293 b957976cd8e7db4605f5dc02f4f5d302827bdc58 release23-maint
+34294 58b98f988a0819a0d3155bba7d88df84cb4296a5 release23-maint
+34295 3ef87a0bbbad0526224022ac5dfa5287409cd256 legacy-trunk
+34296 ab3e770c3a99bfb771721027722c3e84c8effa11 legacy-trunk
+34297 98a6b60152299632e8481e3b93cf7ab6d2e8b518 legacy-trunk
+34298 d34b6f92dd325d6bdc6eb8ee7610fbdc2396da28 legacy-trunk
+34299 daf8c932786d2984f5e929752449bd41eba086fd legacy-trunk
+34300 34175e94081ca96aef8c22d5cea8f446b6e9c57d legacy-trunk
+34301 c951f9c306f324f77c84411f1c6351b3ae77623d release23-maint
+34302 cddb7c8db36791513e997bb27e3ea896b5c0ce94 legacy-trunk
+34303 67cd3e7d0eacd89c851d29a64bb2babe2d758ecb legacy-trunk
+34304 b6c0f908beb809f1c7d5da0e22047ba875fff6ac legacy-trunk
+34305 741f79f1012a0eb433495d2b6a4294dc1d90f1e1 release23-maint
+34306 207124f6a8d7b2d4c153526e5a557928968a7a37 release23-maint
+34307 fd540220ffc4f0801ef69bd4428f86ef1dd22bf7 release23-maint
+34308 3e1bf751064110de318aaae55bf1528ac861968e release23-maint
+34309 c876ac4d0337195f8cac7d37e4f4b87aed2605d6 legacy-trunk
+34310 63c64088ff498005657214e1c4626a5b34a23e76 legacy-trunk
+34311 0028ef45a50ea55aca7cbd3ea77b8908db8ce7c3 release23-maint
+34312 6d75383274342f0035f0e3f8834494502a45ba88 release23-maint
+34312 7d7362a71253bff4fc1b0c825c14569778db8c36 release23-maint
+34314 1b9c3a8c49db68bfec8aa65661c05471b036c37c release23-maint
+34315 0c6fe58af7d12479723863111ceab1bbece516d0 legacy-trunk
+34316 6f9782cc2750d286ee9c66f0a048ba8c095c5bbb release23-maint
+34317 6cfd97d7fe98d78262335ac621628c1411bfbb0c release23-maint
+34318 fbf6ee5769d42a0df83e8a944638dbf298b2d613 legacy-trunk
+34319 d3fb75bc6356e9cd5510a3fc3fbdfdf072dbdfc5 legacy-trunk
+34320 de8552f0acc57643dd61c2891dc432cd15076020 legacy-trunk
+34321 bbe63a87969fdbf6617f571f5a3b3a6686dde267 release23-maint
+34322 c983022252920d34930c0f9d9e4d87fd49b494d4 release23-maint
+34323 82700a7e9fa4b40de2085ca27564d211fdff955e release23-maint
+34324 a673d85f5ad0a55a5d90853c9bd45feee645db9a legacy-trunk
+34325 66fd827fe1d84ba6839bd4417495fa09f0adbae7 release23-maint
+34326 9e6164198c45723b3577a6b031db9a6bf81e1c62 legacy-trunk
+34327 c73f16225a71adf010c22616317db8b982d30d47 legacy-trunk
+34328 7bd6c6b53f87170aeac03bd7b3df6de040f86ea6 legacy-trunk
+34329 b1c5696ad47585844a2a85f9c346d0b0965da5db release23-maint
+34330 27959a02d39de9c1a2e8ce8fe7ee5a6ed48efafe release23-maint
+34331 1079be587baa07962c3413e39d8890048d6166c8 release23-maint
+34332 d47cc6f71f32a32c167ac9626a4eb79560e853b8 legacy-trunk
+34333 b7d01effe89950a8342f6ffa7b396c92f71e6bdc legacy-trunk
+34334 84731eea6db90fe29cf8fdb3fc99c9cab914393e release23-maint
+34335 f29f108ab49eeb5da2f352da46d396bbd2748280 release23-maint
+34336 5ff24d5d9e922b02eb881115b92197a12f960ccd legacy-trunk
+34337 e73f3a0327636ad8d66c8235e9e43be67ef0bc71 release23-maint
+34338 573a40bec07042a661563fc2faa3e19c4a048a24 legacy-trunk
+34339 f4dee015bf84c2c6c320758be43f3d4a1f1fe4ae release23-maint
+34339 be2533fb10a587c8da89b18c5f381f478d720593 release23-maint
+34341 e5e60892c3e357e5e743cb64ec70c3459625d7c4 legacy-trunk
+34342 18e239f23029d80e873149a1913eb497eb337ef6 legacy-trunk
+34343 c4e3a6cacfcabfaebacd8efa73eeb8f9e97ffafd release23-maint
+34344 2ef8d62dcc0910610dcffa94273830179f9d1358 release23-maint
+34345 9200712d31e790ec19c964c961a861fe305e670a legacy-trunk
+34346 817b6e0f48d1ba87433393c385e6433b9914c58e legacy-trunk
+34347 f9dfdcb897bb664a41a8f3747a5fbda4d394e7e4 legacy-trunk
+34348 c1a672ee1530352ea160059a3358129eafc18c60 legacy-trunk
+34349 7fd553fb4315037c6a11af909bc4e77f3b2185a7 legacy-trunk
+34350 0471c67f61bd797651158bafe2524fa8cc803ec0 release23-maint
+34351 0d401784621b4f498523508bb57874d7e93d7f4b legacy-trunk
+34352 a3015bba3999bdc03f317f3f123f550cea6e690a release23-maint
+34353 39e635da2326a57ee80d4bfa91fa3828cc9a8656 legacy-trunk
+34354 5ea0fd26bd36462dd65ba547f87918ef84d25bf3 legacy-trunk
+34355 1543a840fc7f3a0acc8a9befb6a861f7574cb640 legacy-trunk
+34356 71757cea257f369f0d12a03f344b78ed59f81f91 release23-maint
+34357 044798d8bbfc7b4845ca030ca058e73b037e7011 release23-maint
+34358 8630dd8b5cb46731eda7c7d3eaa5fde348b5fc81 release23-maint
+34359 205a293f3de0802e70dcd2fd4ffac264dd4c7d7b legacy-trunk
+34360 d0b8c83c2a6b69d204f33d256295597cfbda4a9f release23-maint
+34361 a6fb6822814aaaf61c6806a822e5f646ea66af1d legacy-trunk
+34362 1eade77ea9ea79fac1cf45e0dc124bcb6c76394e release23-maint
+34363 d79bb29ff96cc0947639aa1bd6006d94cde92db9 legacy-trunk
+34364 8841d34a2c37eb98929d33d586ed4adacb859ec7 legacy-trunk
+34365 ca030320963f5fd5012774ab8fff117aeb0dc41c legacy-trunk
+34366 6fdee3f9ece3ab7cf96bab664f5dd36fcc27cfb4 release23-maint
+34367 ad6306d35ce3a195d69f6181850a7277b3c71526 release23-maint
+34368 3b47d60571517ec207ac65b176733d279a46227f legacy-trunk
+34369 055a80881e96d936f1445304b239ceec8cd10bf8 legacy-trunk
+34370 0e0ba929550c03c7a1cf1489d0301eb250533a09 release23-maint
+34371 8141eead19073f4aa9141970ab7bcbba035bef6b legacy-trunk
+34372 144bc8fd911ee94cd009eff8f2b7104d9a512d11 legacy-trunk
+34373 f00a32ec41393004c53de95c4db48f9eba9f9d13 release23-maint
+34374 acef4e16ceae4830a6b7ad04a28b6a481f5e999e legacy-trunk
+34375 36992ca918a34933c7138b0eaaac8b0fe97b2911 legacy-trunk
+34376 bb3ce6aee693ecc4ebb4152abc1b8830672b467a legacy-trunk
+34377 6ef2451360389af97770f8e7e0d367e2dee38fae release23-maint
+34378 5c0174e2e14f451f5f860789f135d9993db1c7de legacy-trunk
+34379 298888e395ce0c05f374fbcc4c102a8e2055eb42 legacy-trunk
+34380 4776a05e630b5fc38f01e8d983c3b7f3d487444d release23-maint
+34381 58fe64f7fb193aeb8f200a319641c3f919157d37 legacy-trunk
+34382 400674958025e9e4816480bfbc462d709eacd08b legacy-trunk
+34383 062c255b57a8e22e973625f91dd873043e295f9a legacy-trunk
+34384 d5c3231ba5baa41632039c8cfa749d92b1422817 legacy-trunk
+34385 7f6134f8bd06fd3fc6828cdede2ed97ac9427e35 legacy-trunk
+34386 adc60015670ae8c23db3e3e18e940e3957535151 legacy-trunk
+34387 41b7d1f0500f0e4c1504e2d6f99e13297b02c6f4 legacy-trunk
+34388 604830f1caa65526ca89d18ab80ce2bd9db64257 release23-maint
+34389 a742821d9e75dc7aeaad8f067de383f679cafadd legacy-trunk
+34390 fce80ad8347709f1c1a67dd1b4a6cc65e3a930b7 legacy-trunk
+34391 fdf0a97bab600d595db0c09261065a6099647ad7 legacy-trunk
+34392 cf02c17d7f449bc5f2a8a4bf85490d597639ea65 legacy-trunk
+34393 837ea18637bc190fe59786f72693ebe0e817d6ef legacy-trunk
+34394 4a0c89e5e05677be78d43f73a1fd889a9b8ecce5 legacy-trunk
+34395 c226f84d7a66e2aa81665e30ec6dc02f991bc32f legacy-trunk
+34396 9691cc64416007bdddc177bd1bea6824d7d70a65 legacy-trunk
+34397 473f4e2959a8043d9bcbd7443ecbc314c1965bea legacy-trunk
+34398 3b59fa5d25b13b5c65e09607949ac06af9086dd6 legacy-trunk
+34399 0ddecaf8b75cbeca0066004df1c3dc31e51abdf2 legacy-trunk
+34400 6c38406c3fad84128e5fbb75752a8ec87a45cb1a release23-maint
+34401 0060157844d87be2ace7e95326d752007a0a29be legacy-trunk
+34402 8ea832603e4feb17e19e83805d77acaa4448947c release23-maint
+34403 b491bbf17dde8a18456e34cc2b7fc4ff02924f16 legacy-trunk
+34404 501a79346784ae626a8b4f0cd0498dea07ca158a release23-maint
+34405 fd052c4f884f4430c2838022ea5bcd8995ab1e52 legacy-trunk
+34406 04f418af680d07f4b40e4961af41b0d8fa306ccc release23-maint
+34407 a3e86665f245ac5d7e5ebfb722bdebfbdc15c8f6 legacy-trunk
+34408 4388bbad0bc37ae948c23a0ba4e31e247a6627d3 legacy-trunk
+34409 5a1d3bc6cc1802e00835576af07d571250d5abd5 legacy-trunk
+34410 2cb4f321798cd6f0418c4119e1259f7a6460dd79 release23-maint
+34411 3429b1d38b400c60e0b850f018d6d1934d244a36 release23-maint
+34412 f1c30bfb0cc12617e2ee0a341b9fb745e9eaf966 ast-branch
+34413 79897ed53f036f179515b55340d4a57368a9337d ast-branch
+34414 1345c23a059160503bb53bb8fa9465c74dcec6a2 legacy-trunk
+34415 3e3fd56ce5958cd47ee60e67a82e20679efd3316 legacy-trunk
+34416 efed489df5459a801b0cb993534e4887bda80da6 legacy-trunk
+34417 5201f66c92ef3cdeeb2a378c3c52dbcf428e3a7a release23-maint
+34418 c3dfdb60b988f8389c96ba3e2f0bb0913356581f legacy-trunk
+34419 c8b8821e872d1c8e917698d7e8e32dc88b8e6d98 release23-maint
+34420 8282aa1f93437c666c30d1c46fbe8df3446ff261 legacy-trunk
+34421 04bcfdcf290a1509cc75c836b89bbb06a18e69bb release23-maint
+34422 3ff03446f362aeefc9fa9070e6c88801d25abd4b legacy-trunk
+34423 be0ca26ad5740ec6437a7063b750d6aedc97d720 release23-maint
+34424 9e21e56bf5f3ce18fc1fd6c7181bb35630d73c13 legacy-trunk
+34425 3a99294c8e5b5e38d1a174019fe60c1f5640e1a6 legacy-trunk
+34426 1d5d72436f2a7c42ba388ca682607875fe9e091e legacy-trunk
+34427 a234daf19810ab3a879c86f36bdce80b8b44242d release23-maint
+34428 6877f797cf36151a1b432ebc010c34664cb6a44c release23-maint
+34429 a6634309d70ee6ebac993640e969b4f3505b8630 legacy-trunk
+34430 9c7e0227c83568f3d80c5432cd6630cd6bd4c416 legacy-trunk
+34431 b11d973abecacbbdc0cd85374962b7e7c8d8b346 release23-maint
+34432 c12d4f1853bc002b3d6307922b37bf09d151ca95 legacy-trunk
+34433 07a0a0726649946710e9ac5dcd1ffba31af1aafd legacy-trunk
+34434 12e549295f7f5dffc2419c582b85e17e7d9ef65b release23-maint
+34435 a28a830031a9ab322ef95a1cbc4940f1136484b4 legacy-trunk
+34436 7dfdf9e8d95d370110877a6f7cfa8b3d79743d5b legacy-trunk
+34437 2bc79b3a953dfd87ea48a4088ad17f352dda4176 legacy-trunk
+34438 f80d8377840f2ed5130e2299d66cb0f62f56fec2 legacy-trunk
+34439 651fc8d98d99b50f7d9aaed7b5ca7b6ccea3b5ca legacy-trunk
+34440 6f15e73b59f2e3a03f3178745355cf7ed268f594 release23-maint
+34441 95df600ab9bdeb51c10189b3a1faa7a180a598d0 legacy-trunk
+34442 e87d6d76e36575c12950d7bd7a62dcb708d6b875 release23-maint
+34443 1024c5bf7fee91294159192cce3c1a7ef2a92cb2 release23-maint
+34444 ad5822977152fe7362045db769439d083d843dba legacy-trunk
+34445 977efaa8634e61f4b9e86251b973c18486d2bc8c legacy-trunk
+34446 b108c442a3744154b17de8c7627cae79c26f62bd legacy-trunk
+34447 0ea41048b2d4752588802e798a4670a1dc80e2f8 legacy-trunk
+34448 f0da0cad5cd51f47ffa3cfa5266f373a839496fe legacy-trunk
+34449 44f98002181fb2906932f87bacef135f4f187342 legacy-trunk
+34450 9455deff1c7c0ef9e02ee34c78e5d3b5e1c7cad6 legacy-trunk
+34451 916f782ed6d50c6bf9028ef85e23977969dc5109 release23-maint
+34452 42445172928f1faf51aca15c8a445fe6c3fec215 legacy-trunk
+34453 0e8077cb3dd5a167bf7285af3252f3a291c31f1e release23-maint
+34454 38b0b7d41936b17fff2f094a045e57dd3e09aa8e legacy-trunk
+34455 903b31d7721a1d56c00c7390c3147a1725164154 legacy-trunk
+34456 38b94c05b85b92e76c19cd6f11613ee40e592e60 legacy-trunk
+34457 494d5cf0bbe3e2113642352e3bd65ba9d245e15e legacy-trunk
+34458 bc8f22c5342ca37ce4f2fdbf18913c0638591330 legacy-trunk
+34459 a810bab85fbc4d0a4aedbe24cb6386205214e555 legacy-trunk
+34460 f874243ee39ba26e71c831e2f5ed8ad29c140852 release23-maint
+34461 001209b818a67c9191d0c856520501267f72c0d7 legacy-trunk
+34462 dbe788223ce968ef5ec96fe3a68022de9dd6b589 release23-maint
+34463 0c62c1ac9684db3178578a53ee947ae456c62483 release23-maint
+34464 77d5308bedae1144b49c7b9ebefe0c7ca3de8a44 release23-maint
+34465 6248dd5d192a805dcb964b592f3807409d77d1f5 release23-maint
+34466 fae3435761af9f589deb9480e61689cbe98772c9 release23-maint
+34467 1d92ecdf2bb14cd914cc60cf68cafb3dd3c9b462 legacy-trunk
+34468 6fdde96a72227a2c6e5808da76d141a66db9511e release23-maint
+34469 d770dc264212de7ce56b9a1bb0b22e0a11bbe382 legacy-trunk
+34470 6914b5e2076f224b77da5c2c59f52756debddaf7 legacy-trunk
+34471 8b2eadfb8f0cddc32bdda99687be466fff00f2c7 legacy-trunk
+34472 4d79e8490c76e6e6948cb9f7948b06e00249fc2e legacy-trunk
+34473 b6902c0a75782edbce975eda22f1a0e988eb803f legacy-trunk
+34474 e0ec644f5b36c45e3a5cfe9ed0c93a41c7f44c49 legacy-trunk
+34475 26bc01944ae8ec9e441de33b295a0ff87b75f12d release23-maint
+34476 f772d3403ca7d24842f329e0d43bf4ba706fad49 legacy-trunk
+34477 a0545e32dae788413aa7dafa1afe87071b8778a9 release23-maint
+34478 0fe30710da8060b08ff639a05e4f4951783f59e7 legacy-trunk
+34479 8fbb0623b8578d969bb389f7a65f8c0ac8466f62 legacy-trunk
+34480 48b9cc51742b9bf3e97c42b39f6990930cfd836f legacy-trunk
+34481 b948e775a79ee0bc425b6fe6751846b1725f6218 legacy-trunk
+34482 fe3f5592305dcf4f61f430ca2da92f0a79ebbf11 legacy-trunk
+34483 982e3e40bf1e5864946947fed62d8469c21a47f0 release23-maint
+34484 790ed5c599c3f42fadbf4a2011f381ce500dcd22 legacy-trunk
+34485 279736990a14be34e7ef71a73490f3f6b383d0d8 legacy-trunk
+34486 2bc95d49fc7a60f99ffb2c9dabacbc02cb9cad0c release23-maint
+34487 e0841b5cf2fd1c1be8d020b6b5a461c4c2b1db0d legacy-trunk
+34488 a6879d1733d7bc2d3472b890a84c22564daabf34 legacy-trunk
+34489 897afcacba0072d7aa1779c43511e45e2bb1c2e1 legacy-trunk
+34490 95fd55545cac2698416e6f1fc1c4df30febbb77b legacy-trunk
+34491 2d98710f272ece6bd06c6fb1c118d945df8bc559 legacy-trunk
+34492 062857f6927f793b1f24c8647a9f5835c76cd856 release23-maint
+34493 df9d8f7e4c9c353008072047d1a57208d1fdb959 legacy-trunk
+34494 65bbfda246c9308c5fa41275c23681628dadc3c7 release23-maint
+34495 3e3d53963c8881b07c92976f9ba5e46e7abb2318 legacy-trunk
+34496 eee07f30ef068c10c93ba30ac31cf11b78e6ab79 legacy-trunk
+34497 f2e61d99095e7316f4f3b2119ce0f8b11c4be23f release23-maint
+34498 74747f62f286a861ba1ec5d5b7f7497e4f988a7c legacy-trunk
+34499 f51dc9026e4df9beeceb058ee5b98871c5bd5825 legacy-trunk
+34500 4833a9cd377ef1fad1ba6076686ee8d46d7050c2 release23-maint
+34501 37285a0346c14ceac29a651cc05759e36a795e5c legacy-trunk
+34502 d996e2dcbd3a7e57fea7ab52d552a903ba2403fc legacy-trunk
+34503 225d848a5f968c88d96cf775a810dccd9f03ed4c legacy-trunk
+34504 ea058504104cd726d08c0e7a8abfec1e8311f9ee legacy-trunk
+34505 c2ae91a87a48ac65993aa45dc962eaab18c0105f legacy-trunk
+34506 84ff13bcc7502f0b071f86a5adae20ae8e6ef633 legacy-trunk
+34507 a6008b70c93934b78e5754fcc2b6bad4c492c72f release23-maint
+34508 4c9a67cf2833a9fef171d274de7a156a6fe47832 legacy-trunk
+34509 7bbee99422a02ec77f759b1c5165e1e10b910548 release23-maint
+34510 ac985d776650171090efc666a8de72ec7f20c259 legacy-trunk
+34511 4139b45acfed017ce7561e7d6635ab99ca37c57d legacy-trunk
+34512 9da537167b7497bff3f5e2de06397724281f1773 release23-maint
+34513 8eb898814fb917449cedcb4781523d1c18462250 legacy-trunk
+34514 7e9314926dbe2cc5b586f552cfb19c2dc4f40204 legacy-trunk
+34515 7ede772f03d3bc1b74694ca3e9746dd1b0b02576 legacy-trunk
+34516 034ae49f9b7aeaf9130e573e76c63757921c0c4e release23-maint
+34517 af443d820a506772c7a90c2ca947c9c5f555f5a6 legacy-trunk
+34518 c42c40034536cc9c26f1205cfed48d679986533a legacy-trunk
+34519 b4b945c5da4d745a3e510ba0bdfb0b8b47859c18 legacy-trunk
+34520 aecbba0294bb506378eb4be80b8804a1dab1fff8 legacy-trunk
+34521 ac8c7716a85dafbf2b678cef36380be60f8dbd44 legacy-trunk
+34522 6a87ed63967c259f8407dec20cbf811f9fe8f1ef legacy-trunk
+34523 631118b9aec62adc4696fc47ea8886795df62f01 legacy-trunk
+34524 7ba43efd0ceb32a49867ed668e8f588dba99d14d release23-maint
+34525 832f3a989058a6fc4f88847eb44949016081b2a9 legacy-trunk
+34526 8db64abf856f8c44a75eb5991a7ebedd0ce6d6f9 release23-maint
+34527 2cba0de70df62beb85c68706a32e398ea98f6f52 legacy-trunk
+34528 1fbfe9dc0ba8b92ac1cec8f90a92efa1eb2cb8c6 legacy-trunk
+34529 7863ebcff121f1576389cbaa88406245ace17775 legacy-trunk
+34530 a0d2978562d5e12f9523e1a3e73f8346758f2238 legacy-trunk
+34531 5652849fbe2960211e4530697a2500dd66a2a2a1 release22-maint
+34532 c8041b0eeb3cb32b658789c7f81b840d5b449bd9 release23-maint
+34533 07e7a02061d87c574e4016948ec0f0e1460db7eb legacy-trunk
+34534 1510244beb5e0e683edd1d394f99f46eff907e36 legacy-trunk
+34535 44e9abd07eb31e2736cf09805f31735d56dc5577 release23-maint
+34536 9d8acdb58f9c38892f0176fd52c9edc20f8f4c58 legacy-trunk
+34537 528cc0fdda41cd1f3cb9045245efab0bb10fa755 release23-maint
+34538 ec1a4a29d25da4588c1310bf421a57f623461b78 legacy-trunk
+34539 8cd691b73845272cda210bf8ae6d22cdf6e5e9a7 legacy-trunk
+34540 98c8576b8da7d24002d80760005efc316eb03df9 legacy-trunk
+34541 6422a39500401bf77d9980e1d92a0c702a2b083d release22-maint
+34542 d1533ca78d8cca85c1cef8fc8a7850ce6a8ec77f release23-maint
+34543 fac8c63c78381ab6f04daf73f6b0f37fa5bdb6ac legacy-trunk
+34544 b5f64be5b21fdcee7d6e8888a6b8a463640fc4b6 release23-maint
+34545 e59ab708bbb0ca8bcfb7dad946ce67127faa8b30 legacy-trunk
+34546 9833aa5bdf387c83cbae174229b08daa072222ff legacy-trunk
+34547 cbbe3f8bdef6f283ae8b038400f4801bec65764a release23-maint
+34548 827d01df61a716a8c33d10e31117d297b6530103 release23-maint
+34549 89dc069aad2c79377a7c100ee144c4c147f76f26 release23-maint
+34550 3cd9206dfb792906445f9d8445a73d8ff07e568d release23-maint
+34551 d6c09a9d7241d6e605ddd023a348d4e6ef344d07 release23-maint
+34552 562143c1c7aedadf5840b01add23348a2540bc3b legacy-trunk
+34553 522a3d7e0a96229dcaaeb24a07c2201bac2ba55b legacy-trunk
+34554 e676c95e4844870e5e5a5e68f7985d9cbf5cd097 legacy-trunk
+34555 19bb1b2fb2338df1d0769b9da8658a8096818513 legacy-trunk
+34556 feec44f19ecc78dcb8920a1c6f50ba8008358b6c legacy-trunk
+34557 fef6fdec5292523f0c88d9027bb98878d9a0f50a release23-maint
+34558 a997614b35dc975c3856ceb2b4d4633726576e4d release23-maint
+34559 fe9a5a2dd2c1514de623cefe2270873c5ddc44da release23-maint
+34560 08c02a265dbd0dd9a1510e00618e043e367b33d6 release23-maint
+34561 4e56fba98f1e4508b6fe26b602439dbf18b7ce20 release23-maint
+34562 57f743fa3207e09a56308fe7c6762a0bab89384f release23-maint
+34563 3be43af992a6d72b9c6dcfcae11b8f56ddebcdd0 release23-maint
+34564 e5d221f8d410b371ddc61839dd95eb4b42c0bee0 release23-maint
+34565 931a58f27ebb085fe39e9377ce846b5dd1cb63bc legacy-trunk
+34566 262823a12ca75332805e3d9420c59945ad0ccca4 legacy-trunk
+34567 ed058bdad2adf6e2d73662b98f5818858a23a8ae legacy-trunk
+34568 dcae62d3588493472f551c6e2a9a4991cba5d471 release23-branch
+34569 080df0edb0a4bcac41787886585c9d9496e41bc3 release23-maint
+34570 af731846ff72827c305a68e115e10450049ee5e4 release23-maint
+34571 8a75f9ba9babb100a9c026c6cded27178b3c701b legacy-trunk
+34572 4e19a2ff376a05f9d445bfb6b4a6b06cb9c5aa04 release23-maint
+34573 ade97b60535245f776ef2ea159c45be8b6350726 release23-maint
+34574 7135c7ca9842b0dcf0ae1201d8e1da2f54d52740 release23-maint
+34575 776a77150620c293ee8be3cad0ce3b75533550d4 release23-maint
+34576 c31eadb6977914ee489fa408f077a64333a1ecef release23-maint
+34577 9f5dd302bd915338fe86689577b959e1c2e72f08 release23-maint
+34578 820d1d043d3accf4f62a138e9037fed7c581ffbb release23-maint
+34579 c89fd7eaf87547688251088dcbeac271d1bcd867 legacy-trunk
+34580 d45f8981fdea91fc8e229e7a2807492126f46dba legacy-trunk
+34581 070c89eda80bdb5435cc7e20d05f5fc5ae1b0a34 release23-maint
+34582 67606f9c2d113dde1773b84e60a5c5438e3f8042 release23-maint
+34583 41c4e143e6e6e18e4131a1ed8958ac4481a53e71 legacy-trunk
+34584 fe5cea51a3fffff029c2656c82a6fd4d7da9074a release23-maint
+34585 04ca4d1f751f2a8a0252eb16c925e3d6a5fb0754 legacy-trunk
+34586 da5056a3b152841cd16596080d4d470c43e87eb4 release23-maint
+34587 0acb95ad19dc867fbc59f5bec9220bec5c08e3fe legacy-trunk
+34588 e468b2451d54b0513327e3b49f614c6ec7feeb29 legacy-trunk
+34589 9d7b7ee04470e19e0aa60b2f703457d79d0a204e legacy-trunk
+34590 e7091d5754aec0154eb8e945a42546b0db026877 release23-maint
+34591 1db0de4c8454323bfb087556e0cc3821fe8f7d2a release22-maint
+34592 682d1b67c7b55247872513af19c67b1e2dcd7ed7 legacy-trunk
+34593 2acd28bd4d0f1fe614e310f26f7ac439128f7f89 legacy-trunk
+34594 e2a9a7fef18a33f80d4ae71c9710e1a2ec0896b6 legacy-trunk
+34595 3fa9538ac496727d020f0e9330b8909e17c9d910 legacy-trunk
+34596 f0161327a902678410d9f910b0e24ab163d5fd92 release23-maint
+34597 4ed40b3f880235e75caf97a0e0af9d658f9ce97d legacy-trunk
+34598 d338983d071947d6917ce9be47aaf9ca3b4753cb legacy-trunk
+34599 2e497840c45880d5d0223f1f46734ca7ab42dff1 legacy-trunk
+34600 72d70dcc4af2c7f7320557ba061b2e1f0a89a9d9 legacy-trunk
+34601 2f0e60d4233a665be2f01fa5104cb0d14be7ef85 legacy-trunk
+34602 cbd93cf32effeae9d763d4a692ee5eeaa59f88f0 legacy-trunk
+34603 e614083ab20c8f1d2cc399a112299e52c6d15384 legacy-trunk
+34604 e48c61fa2f983e1e0d266d2a8a2e2ca7bb50b5f3 legacy-trunk
+34605 3ae82928b1131cbb105af3ae89990237ac9032ab legacy-trunk
+34606 7db778cb7e08a448d3eaf7f83446ec680b8d111e legacy-trunk
+34607 ceec69d240f019ebb77b0aee20f816087ef8fd0b legacy-trunk
+34608 1997a14f6b088e1a651e1fdb8c3cac7f5f1bfc36 legacy-trunk
+34609 89ecfa2545283b17ff1970abaafd55f2ecb2429a legacy-trunk
+34610 f08a5e95c37cf3db726d9bdda9b0bb671e961c24 legacy-trunk
+34611 1e6863ddd84b9e83e7b3a17571ceb4e6ee99c93e legacy-trunk
+34612 543713919499e66131d34d9768e2fbdde41601e2 legacy-trunk
+34613 2ed36833853aacbb4ef9dacc422e8a397e4d31a9 release23-maint
+34614 a0a8f15401db0fb1374c9b2ba22eb75bdd866cd5 legacy-trunk
+34615 c5e5208cdbb720e0382513ff6c7b6f5e743aebd8 legacy-trunk
+34616 37c7763fa83dfa643f3e7cc3a370438b2214b626 legacy-trunk
+34617 96170f75e3e9fefd82a35ed50f566b636bbb5d73 legacy-trunk
+34618 3096fab2a19c054b594bc2b5689330d12e19a558 legacy-trunk
+34619 85f3836518fe5d16697fd1f3f87b945fe6be7784 legacy-trunk
+34620 6037040a2cce47124c553d13afc9cdf71c35bf50 release23-maint
+34621 b136353adde6a6cfa5f8266ab0c64a795a7447c9 legacy-trunk
+34622 510bd7eea925fe10fc792d6fed9bb5b1e5ebd521 legacy-trunk
+34623 d261839ecf87cf83e20e4f9763179b0b61634a5a legacy-trunk
+34624 39fa7b8fcc077aca714f28038b2bc7f56aa064b4 legacy-trunk
+34625 3d9b36d6ab898b2aa0915da511e2af3f1003f1bc legacy-trunk
+34626 cd7624b025a0fe82e2e36bf2c7c555c7ffe77aeb release23-maint
+34627 e3ebd740d1efb4868bffd183c753a40c9720d21f release23-maint
+34628 a29a585b03d960f3114a9b7e4802a0f3d9e2a348 legacy-trunk
+34629 4320cca4ed843837720984a9cb6a1c95c4b9b97d legacy-trunk
+34630 d432f82b986fbf1b47d18b1bb8f5359108f64076 legacy-trunk
+34631 567fa0649e835e81cc4eb69f98346695ea18bea3 release23-maint
+34632 f648c7f1e8b8598b3022a82806e5106b50a02ad5 legacy-trunk
+34633 8081643c373ffbae21568e08bf67c785ee2b3371 legacy-trunk
+34634 81733c7a95c8dde611f070d13bc6c26fd2d9bf45 release23-maint
+34635 12c22d6b1ec068b03bca67b73dbef2c0d5ad2423 legacy-trunk
+34636 8aa9237f6dd6aa108e49bc78eb7d6f51922927cb legacy-trunk
+34637 a18198f494f4478dde21b8338e7a91b610f50c54 release23-maint
+34638 3213aaa82c7b796b3c9fb1c336ac2eb214181ab9 release23-maint
+34639 0468f9ddc069d6ff0f3fa769635d315e6e048d88 legacy-trunk
+34640 a0ecae3332a8b6b1bd31081ea259a0038a02d366 legacy-trunk
+34641 7a6b1c9fb89e540edce6c842da0d93f36537c980 release23-maint
+34642 87c0422cde708c368ea266490663187cea44d305 release23-maint
+34643 526682456a8d5a6917f1164d0217af989b848c0d legacy-trunk
+34644 9654e5f2473e4f949702120e9cb7d3007631b840 legacy-trunk
+34645 5c4cff8fa6ecf91c4d4990e7c626adec72038559 legacy-trunk
+34646 c00b5f179633cebede088a0943b2ec4329f8ecb3 release23-maint
+34647 54ff68e973eebae0d990e1be5306b374b0f4842f legacy-trunk
+34648 287200af946fb7bd51733889a8958c6ab0c15be8 legacy-trunk
+34649 fa6e8d4f88c678282e716de0d59439f62520f245 legacy-trunk
+34650 7f695c5982873b91ec7e5d4b5a7b8d2d3843cc3e legacy-trunk
+34651 19ff972434b3d261bfc3c33c8d3fb1b7932d009b legacy-trunk
+34652 4effcbf80b45c6e40f451780de41ca944a2c0063 legacy-trunk
+34653 5d2b0e9062d5337d06979b221323b6312d8c5376 legacy-trunk
+34654 8941f2ee90949f03e114592b4c129c63e1995240 release23-maint
+34655 51ebf5474f3dc984f1cc8ca9b0959fd9d17bb61d legacy-trunk
+34656 813a6d9c58882907a8991f7205ca33dd1b39c415 release23-maint
+34657 b24995a9664bd54840aff3894cc1f5f88393249e legacy-trunk
+34658 bf1319581dc479f9cba0a2017d6bfd8f62b722da release23-maint
+34659 cb7d5e23dbc77f104141f60f0586d9c504b4d1d3 legacy-trunk
+34660 701880d266eccb481304cbbe467d6d78455d2b5a legacy-trunk
+34661 6ca0dbd6ccc98a196eebf7a9d26cb5337e71ea82 legacy-trunk
+34662 62517cc4c4e7920301f285f1971b09d25c699c3f release23-maint
+34663 7be45f7a718f356944134b30eec7bc700a3df78e legacy-trunk
+34664 f729c4d53048ac22432725ee9d43f18396169972 release23-maint
+34665 5f49fc231b4c885f1050511e6360ea89d85a667e legacy-trunk
+34666 23382a134d5ab61a80d58d8be94cda80dd11e12a release23-maint
+34667 1da39a75ed384a8a13da493997375da35143e2ba release23-maint
+34668 38e72f4f3df5e9810eeffe85ff3f2a266859fe3a legacy-trunk
+34669 11636e7987b637fec1bb6a14db96e09848e48b56 legacy-trunk
+34670 45f70728dbac48080e4ae059814e48b208a1a6fe legacy-trunk
+34671 3313571c65743a9ec43cb96b2c84e11350c6e4f8 legacy-trunk
+34672 8fa3c5869f51a7b5edb8efc153e69e8efce8250d legacy-trunk
+34673 07d3c8668f8b471c8aae1a2e609b4e34866f837c legacy-trunk
+34674 53d2813395f4ef8069e44d8187438ce2071f3d67 release23-maint
+34675 7aaa40bc2b17c94df2c057edf3813a127da2304f legacy-trunk
+34676 46b9fdd27ec21fbfa7dabad30a726bfbfc700441 legacy-trunk
+34677 1904d8b038b668d9e98db6bdbd740de146a0d828 legacy-trunk
+34678 8afecd36fb8e35157703d4490c13b9d4138b0c24 legacy-trunk
+34679 317fcc5a184d48b894955aed5e8daec010241bd5 legacy-trunk
+34680 22107c5a176e31338db8726366b5d759436f7b62 legacy-trunk
+34681 f19625f3c198eef4a02431edfefc16246c3cc5aa legacy-trunk
+34682 5bce9589ef0b036a97218b78c25cc81470d6f0bb legacy-trunk
+34683 4edabc2976f73fc51328b2547cef13270175006c legacy-trunk
+34684 dd6a510ae0d9c099443470b17c14bd694d7fad68 legacy-trunk
+34685 3c1c81d642e0877ec900549a19d0d72d5ce48016 legacy-trunk
+34686 b6c139544c16d6ab7a241258dc154adb0467f08a legacy-trunk
+34687 e4f9e74ba56dc857ccaf68943d92358b4aecad01 legacy-trunk
+34688 16c682e3e57f9ef280233c2126d204fd578fda02 legacy-trunk
+34689 4b2c9e14b446b646de90be8a633e0e28b9b4e340 legacy-trunk
+34690 ce96bdc6fbb8d4096cc2bdd20ee9741b64fb4099 legacy-trunk
+34691 53e4b7fe0969c146932fdc903e2267b7efceb7c6 legacy-trunk
+34692 d12f07c1c3a0707308119039825d827192d56919 legacy-trunk
+34693 4ce30d9a1e0419bdf93d9a96ed7c72c240537be7 legacy-trunk
+34694 ead4c61219d0f0c1761a27c76207656839824a80 legacy-trunk
+34695 7fe201801c1499f885158d8697544ca26973ee70 legacy-trunk
+34696 4c8160088b34754ae72aaba392e3e3f41c53d2c6 legacy-trunk
+34697 86fdf8fe7f1720d10615b5ebc5c51dbd20ae71c0 legacy-trunk
+34698 890f3c2c118300597b6b725684bd63b27ca016c9 legacy-trunk
+34699 eb04265fb65b86b666a4fda25422c76b27516d2d legacy-trunk
+34700 e543b3f0d90602e265e2acc4bf8b1a65232aaf50 legacy-trunk
+34701 334edcd1e5ac61252f300e8d81ae5d60f02cf273 legacy-trunk
+34702 830e5ffc6d25c704f8eda0b984eca59d1863bbf4 legacy-trunk
+34703 fdc8a88a9a5a4344e4abf5d08ed9168057d3d9c8 release23-maint
+34704 96001a70c5057f0b6f915158855ea427523fa70b legacy-trunk
+34705 d99e022966c9438c588fc682860d8cca4b6fa5c8 legacy-trunk
+34706 caa1a48da4ccdfcf0b6d10f3e633faf9b6e1f44b legacy-trunk
+34707 4f6382d2809df4ae8c2363f7234c06a72bb618f7 legacy-trunk
+34708 8326f64244c25abfc7ea5c10fbc04830c8a82175 release23-maint
+34709 14d321466a0692f149c3c5af36f3ec001c03e6bd release23-maint
+34710 d401790176395d59ea5406b38dd8a0a627409e89 legacy-trunk
+34711 52de58087b2f3a45ecbcfd5315115492b7fad289 legacy-trunk
+34712 632b223cb8e838788c934137dd5793927afb2470 legacy-trunk
+34713 d4826e097a3febf284b8f29a5bebd091bad73256 legacy-trunk
+34714 9fc5341fa6956a833bcba27482c8865566d1994e release23-maint
+34715 e0a75a7570b40289f8c54f382f01b0a73804f8d0 legacy-trunk
+34716 18df203b8e985482a4eb7f30e9c6ea19e3aaff72 legacy-trunk
+34717 4da99f73a1df84d12362a8d27fffc08a062a38e5 release23-maint
+34718 22bed2fdffea6b96584a32d96746dfbc0e671b05 release23-maint
+34719 d90158df39c45312fdfe0ab508d76e6d872e417c release23-maint
+34720 622a76bc02376939b0aa78791e872bb95d02bcd4 legacy-trunk
+34721 278976b19dcca6f8473c84cfb3c52460d683a581 legacy-trunk
+34722 5b77bc4d25b1b9df59f7f90c0c77b953788cabbb legacy-trunk
+34723 4696c4b7f792b2a7aff3a2864d514a37b69e89cf release23-maint
+34724 1fd81894cb973f2fe425bfba4d06eec84b37283c legacy-trunk
+34725 753d72bd214b2c5d2f886b16527314447853fb7c release23-maint
+34726 4224d807911c4a09f02eca1a24ddd9876f1349b1 legacy-trunk
+34727 70f32f0d8ecf0659b5f1dcad94a785fe8c71f878 legacy-trunk
+34728 2ddb1cba18d64396d27a4895699a88f3edf1ae0c legacy-trunk
+34729 9628bb54a9e074ca22a28568212e07cfe7a93153 release23-maint
+34730 46de3db9a5db5344b0d1ab050833813d7c64bd49 legacy-trunk
+34731 32c2c799c9248e3a3d60a5a1bd8793040e678ed5 ast-branch
+34732 270d59e346e6af89497aaa81a10ee2237d1b42e6 legacy-trunk
+34733 c411a762d5dd6a2ea6f6aecdfe8fcf47c09e4f97 legacy-trunk
+34734 8d413578eb1ac0a8e63971de902d61f07ab22acc legacy-trunk
+34735 a4b913f937cdc917ac13d6269df109c960a12669 legacy-trunk
+34736 17aa5302e08b217d0751e54467adcb5c65195781 release23-maint
+34737 bcc7873c707e52eafe15f86e5d61017291e287de legacy-trunk
+34738 b2fd7af17186906f33e4db81f4ddb462fec056ba legacy-trunk
+34739 d2eaa53ceabee2a3cccc7ded01c6937ade0593e6 legacy-trunk
+34740 21a10c3600b5c4d47924b98ca80e56bdf377e9ea legacy-trunk
+34741 845f19b145a8fa0f2cd4f0f3594af6e1e7cc8ba7 legacy-trunk
+34742 85cabe7b216b7bd05531a74724228e27da6d821c legacy-trunk
+34743 0ac409dff3909159a972662395236fff96ff49b3 legacy-trunk
+34744 2b6a10e0672738bea2d634fcafd9f0ab2d25a1a7 legacy-trunk
+34745 024b4799a41d52517455ce85fec8924dd469cb00 legacy-trunk
+34746 bf038986cb8fdf126fadf5356e081c7fbc2f14a7 legacy-trunk
+34747 f967589df75125a78986ef9cdd514abd7c747055 release23-maint
+34748 ce07118ee5d277dcd35fde63b30920c479ca6194 legacy-trunk
+34749 7c55ebec48f577a5dbba80c5d56bd60eb3b5467a release23-maint
+34750 da1578cfae182e54bb266b90f205f5146c372cbb release23-maint
+34751 6d3e0e6d7be6159984125d85b56b16ce3352ec01 legacy-trunk
+34752 4b6c7e5cb889b33d811ec403ee8438d013ee9cd3 legacy-trunk
+34753 2c3a75c5483349b84cf340838ab8c3eb643a9892 legacy-trunk
+34754 fadca17164c06c62243b32e8e037ae6a86edb79b release23-maint
+34755 44ab242c9b8cf5aef5c83d8348d6960397543ef1 legacy-trunk
+34756 2d690a95e4fd1e01ea481a96fd8f6a9fb571b587 release23-maint
+34757 f71a21679436a510ccc465298855bbfed8c99716 release23-maint
+34758 6cf09be0491de86be83367f03ef7587ff09c783c legacy-trunk
+34759 4009b3992616a0d60c358a025d485c810311c40e release23-maint
+34760 6f01700c180898dec3ed137d604f1a70cfde2b95 legacy-trunk
+34761 9c846c3df6f3e024e0eaab4dda5b9a388bbedf4a legacy-trunk
+34762 73d5213305d376d5049c848d58b37c310efe1fb5 legacy-trunk
+34763 6dc19e48347a0b78f26b4476b26f928c6d7bcf08 release23-maint
+34764 dd5707f71526ace94ba8558ba1a0baf09be8b5e2 legacy-trunk
+34765 0ff69259b005f473f4f7956b20ed407c515ee2c1 release23-maint
+34766 fd87ce1819fa378b225db1a176b40a98fd4be0c2 legacy-trunk
+34767 d50e26f20f1084f9fdf1f526c19c1b0970914155 release23-maint
+34768 f5eab628328664fa83034b7a60577a9dff2fa0f0 release23-maint
+34769 3548f234831e099f190511b782869f61dd390636 legacy-trunk
+34770 d3ae324f6c895fa0bfa90bbc204480e7092483e3 legacy-trunk
+34771 456e274f86026266c061fd6942fff4bc1872e189 legacy-trunk
+34772 5dea73dc968b8427df9e0e7b192b6c0583b4b616 legacy-trunk
+34773 3d1f0df75a80c6cb5fd2b0f38ae314597a83c195 legacy-trunk
+34774 38338c970f7d0799d379ee6111a4928013f5b1b2 release23-maint
+34775 251717566e912f8bfafe25b2a63099bf943daa2f legacy-trunk
+34776 f69589179c559c058f1ee596e50cf173b1f94571 legacy-trunk
+34777 bf7df48012cb2a6813ded413212dab1081e82eca release23-maint
+34778 4e11250564cbd3f0635a4c94094fe014b47431a6 ast-branch
+34779 d6c7e5596247eb089b4331f8fef06785e2a318e0 release23-maint
+34780 4a361bbb5278ca57e2b3c8b77a1c8436e0a27794 ast-branch
+34781 f0a197dd212d539442bc7a6006c06cdce68708ce ast-branch
+34782 f1433d3c6447d77c66963ae9f2efabb815a37552 ast-branch
+34783 b0bccb9fb70a8b3a5c63f8ddfd11c537e117c233 ast-branch
+34784 64ddda2559524ad813ac136b3a29c5ebde07b407 legacy-trunk
+34785 4e31c261a66895c4d4066b91106d36a28bd75ff6 legacy-trunk
+34786 0ac98878cc32b5c87c7a22995a0727b33145dbbe legacy-trunk
+34787 e05fe177552064e319861d078606a5c6ac98137d legacy-trunk
+34788 eb509fc47f0750868af9cd6110542dd18cc512d3 legacy-trunk
+34789 41f4ce6c4e504e3241d2c2da6271eef9e9afe489 legacy-trunk
+34790 a102da91640e346a9f9dfc82f59b7900432d3ca4 legacy-trunk
+34791 0ec4d3ebd4337f1d8e798f0e9f7343af92933a85 legacy-trunk
+34792 9314be0bbb64019b8d97bc594e68106bcfc06cd8 release23-maint
+34793 5a0658c00879aa35f33c8a4188b3d4c5a2935b3a release23-maint
+34794 783694d4d4cf0cfddbd245be30b8d57aa87b5ac9 release23-maint
+34795 d4514ce14b967f7d96798a31f58e25cb663a6e19 release23-maint
+34796 da14d806e89c752f6a7294a3e4a69bb074ec4670 release23-maint
+34797 de2855b3f4136bf1ca0b77b02885b7d54c8ba1e9 legacy-trunk
+34798 48695c839d98b3a272c609310495ea11e62a846a release23-maint
+34799 5b515cc90b5a43efe42f46312b6bae10ef0093c4 legacy-trunk
+34800 a52d74948dd4f4e3fb8ef112bbf542ecd1df249b release23-maint
+34801 2a6fc4d261f8e68dab948a7d665fda52d4fac881 legacy-trunk
+34802 2ba9a86965602d8e054e0f2d1c8442fa2dc30bb2 legacy-trunk
+34803 622991cc1e3c58b51c5521a32a819cd9e1bead89 legacy-trunk
+34804 36062d645fbb95635ebeb5015827f2ae6d7cfd7b legacy-trunk
+34805 6eb473d680424c54486f9c13fe37834f6f349d39 release23-maint
+34806 1f09819f508b25d454cb7fefaa1830b3da3c7357 legacy-trunk
+34807 d00f01207837b67225f4e9abb82988ea8424c882 release23-maint
+34808 e3025fe70d8bd04f722e73792f88c4dd6def78f7 legacy-trunk
+34809 a2f6c6a67f2414099cc70193bb6038f75b6076f2 legacy-trunk
+34810 b24d6a71b01f126598f06ef04782210b9e6633b5 legacy-trunk
+34811 8dd159279576a5747e3f2ce7d57d81b8ed99eaaa legacy-trunk
+34812 870615bfaedfb9e4b2e9c3fd5946bc9bf8c8ce4f legacy-trunk
+34813 2f796c7596eca23f18c194d8a6c107d93f6cadbc legacy-trunk
+34814 0a7f1a53c773b4ac1f5c8d52b2375a1e544888d3 legacy-trunk
+34815 3861eb467c29e07ba6b3669760ddf72cb33b448c legacy-trunk
+34816 de391e9d70ea167f1e81ba57a0ab3c6867731ad0 legacy-trunk
+34817 f2e7646f7763161bbdddf276d747f56ff6f4f310 legacy-trunk
+34818 9ca9d318af78b7d5f83f95637ea19d9bb2dd6227 legacy-trunk
+34819 30382ab06cd1c2c0b904263d0f40440c7a1f8668 release23-maint
+34820 d35f8799cf122205df5f8466a3eb32062b786cb6 legacy-trunk
+34821 03f43d619ff4b8a550a6d1ec3386aa5f7b8b8297 legacy-trunk
+34822 bdf60bea4177a78042c0f09231838c44c2dc7a93 release23-maint
+34823 759214f1ec69107141f9a0042496fc62deb5c758 release23-maint
+34824 113eafe8848ff587141c37a2b5adf107c42e1eff release23-maint
+34825 61b70eb8d160b31951804f3b5c6465c694e98058 release23-maint
+34826 86cf2b810f3a2be77b4088e1a9673a1f06d1f6c6 legacy-trunk
+34827 c23a86215d9f7e1750f9b5ae4ded4e86007bee22 release23-maint
+34828 2014f9c636fbe756a944ae37d804b41a06a6478a release23-maint
+34829 0a63d4d015cf950f188fbcdf91ba55457d468acc release23-maint
+34830 915aa0e69485989e77e9460894b0c737cdad6fe7 release23-maint
+34831 a096d7b8ec8a29e12036a58e572b66c7794d4a1d release23-maint
+34832 972e7fa1d5986a5b177166d3a15a891de6e9daa9 release23-maint
+34833 45cb284b84d3ab265aa6f2447a9e7fac6d54ba20 release23-maint
+34834 d7630ce7aa9fd5b1235a652f399ca7f93f0a5ad0 legacy-trunk
+34835 9d626688ca7bceb062baf1c4cae1b9a14f65165e release23-maint
+34836 7403e38a2f107c9a9a824ee677c0aa793453c5ca release23-maint
+34836 d21d4ba2f973467d30794a3d2ac493658180e503 release23-maint
+34838 5663519cf06ff43fd242e4c5f5b39754b64fa792 release23-maint
+34839 e96e39cd2d142b1fc3b589818855c094dd8f259b legacy-trunk
+34840 ba886ae322ec169fdfd3f1dbd44c09bbe9d23af3 release23-maint
+34841 60e5d8b7e964e6ca914bcfe4b8ebe06027d76481 legacy-trunk
+34842 835b79eac812ce908f3b60fdfa348b618389bbdd release23-maint
+34843 8e80f551b0e9681c45bcf85c8bb8d8831a8e0ba9 release23-maint
+34844 38beccf4a0bbf7770f0ed5b8b9e459bc817a3eea release23-maint
+34845 b77fd469ee3541fa8f7bf9d80a0cab5b1a15cdc5 release23-maint
+34846 69de5aee1fbb510d1d56e4ea1fa0ad195f9d3cb3 legacy-trunk
+34847 7c8dc640423a5148e17b34137a765c4136d68d35 release23-maint
+34848 5352a6ebad9ac4009c30bc9fe8471cc221aaab26 legacy-trunk
+34849 17e6e9829c7e50bf1627299e780387214d5a0044 release23-maint
+34850 f108db59eb76a26b7a15a94276c107e408e29b87 release23-maint
+34851 b028fd54194198a9e3123453dfb5d217cda8db06 release23-maint
+34852 9395cd92d2cd7e5b6996fc3bab6946d45f76b45d legacy-trunk
+34853 be9ef9b92d6138c0b70fc7d019432e6c39c9d9e9 legacy-trunk
+34854 21aeb9832c1d328042c4ff6cd2da117c93e9e688 legacy-trunk
+34855 415ef5521a8afd85298f035bbf6b16c2e0157842 legacy-trunk
+34856 c953fdb51cdd7ef8813ab20b958d5ed0c70f0690 legacy-trunk
+34857 c6f16504c8c2f5ade96379097e1a9c657e889430 legacy-trunk
+34858 75b63e5f03f21216251b41dd8c473e49c1d58f8d legacy-trunk
+34859 89d26e03c65302b015ea35184bfb239d9461ae50 legacy-trunk
+34860 fde74fadf780c9a8139bcc1feef3c683c2b1bdd8 legacy-trunk
+34861 7aad24caddb5d0a8f9596dd2d92375caf2217740 legacy-trunk
+34862 5088a8234117ecde2c644312f3bc7728ed17602a legacy-trunk
+34863 eb127e401c6449d3701301ddfe11a2165af79b4d legacy-trunk
+34864 97ebd1b2f468557d03b3ada26841e9497ed65772 legacy-trunk
+34865 e9f3b822ce02ec986cdf529422044cfa5a5429c1 release23-maint
+34866 9e750753010ad82cbbb6d32d01ebd7fa92001937 release23-maint
+34867 052e4c5722615e1f4993f4b543e7dd2506fd4ca4 release23-maint
+34868 017048565936b832ab5c4916bf7f2cc1c42c698a release23-maint
+34869 d362273d468bd13e8135b7f97d1f7906ba96daf0 legacy-trunk
+34870 9ed7525594777ee4fd5403dfc47b9296777f8b20 legacy-trunk
+34871 381ae326ee6555e74df7447fb0b97298925db22c release23-maint
+34872 dcf5be0f0a1f9aa05834955fd185a029669bc6f6 release23-maint
+34873 8518c4681771f704042fb8839d650a6266626216 legacy-trunk
+34874 94c1bd7a55aef5448fc695f28c53f1e5680d7384 release23-maint
+34875 60bc11e300682ba4ad091e4d4a4904c2b3e89124 legacy-trunk
+34876 614ad5388c9de00038a541739a1dda59604faf20 legacy-trunk
+34877 d1d28cca42c197f1eb77c9055ad2a7c237c1b712 release23-maint
+34878 1ddc86b58040062bc5cd9f7cade0baae1b4ca8b2 legacy-trunk
+34879 26efa8a53925943b3fbbfbb4340b9c790bb8a708 legacy-trunk
+34880 94dff4a02ca30677b6cd038df533eb5d8f21f8df legacy-trunk
+34881 9f8c05587213e1d88515c0f5a3f53015ac055822 release23-maint
+34882 4eb5f0cab09e4ad1e65c9d171d43b75030adf879 legacy-trunk
+34883 e1f1fb74451b9c0d0166611ee6865d914ff34343 legacy-trunk
+34884 2a0782cc151f840417cf1592b8769b7f6efe485a legacy-trunk
+34885 4a12d91af8c3f95f1487896aa307b1144f3b1213 legacy-trunk
+34886 c727ad003fdbacd2be8f4dc40a396961ddb78718 legacy-trunk
+34887 03673773308447dc936de699e5e8bba2358d9eee legacy-trunk
+34888 aab3612f2c352b0a1a49081e0b26ba0c903e60e8 legacy-trunk
+34889 885dbf1578bcb06bc5ae123ad26fe026e631d9d8 legacy-trunk
+34890 063b7d225e8ab8476b6d27f3783a4bb50d5d3e98 legacy-trunk
+34891 45cabe9cd9c9261f277fb788f1860fc775eefb17 legacy-trunk
+34892 48702f19ccfb3eb0bf54b7d6d9ae3db332913da5 legacy-trunk
+34893 4cc16615b07245fa4715e80673c47e7899b21539 release23-maint
+34894 c22eec807224742d3b138378cccc38aebc8450b4 legacy-trunk
+34895 ca8a69969f038f50616205b9ae5383235559cd54 legacy-trunk
+34896 e4fb6164158c784d93dc78e3245262a762ebd52f legacy-trunk
+34897 c9bbc967ac9f609f91d687576f7b6ae31eb45dec legacy-trunk
+34898 88e80a04328a3847ce0fa95d5b98c6e623312276 legacy-trunk
+34899 5cc1a400a02c311a4f1c598978cdf5f3eaf37c34 legacy-trunk
+34900 381140e7e9d7715cfe71ff7b49f517cfbd7e4235 legacy-trunk
+34901 eeaa3660671cb6ad696c03bbc38b28c3951e8a5e legacy-trunk
+34902 1bbc2085f213b0ba641285b9f1a6a55d16fa30df legacy-trunk
+34903 21a27c21a2c57ae3b670f1f79154d9686c9d5049 legacy-trunk
+34904 4942a0b63c8ccf1fc5d11e7cbc97b6c17c0ce620 legacy-trunk
+34905 e5d97ab710a225d3e4cf16b8cff9e3cde70c965f legacy-trunk
+34906 c99620cd9c6552959dfcd864959f0c484539575f legacy-trunk
+34907 10c4cc352d13a5be482608f3e159fbe7cd22d127 legacy-trunk
+34908 47eaa38b29cbf65579e0bc9e7965139b50ef8a68 legacy-trunk
+34909 74c154708b0ca19cadf765c0511883b65bc9c603 legacy-trunk
+34910 f28982060b20c0863a0549fe4f15a2e8799853b8 legacy-trunk
+34911 f2e0d630cf39fe74bb75e2fe2e4ecd6a136f5350 legacy-trunk
+34912 b2a0cd2e9d551128d3db8afb3d55ca1c06eb2d88 legacy-trunk
+34913 c85a9ec5796cd09c96ab61f53caa521860db4da3 legacy-trunk
+34914 292ad135cef14620ab4b8f508cc0ca2626f79b77 legacy-trunk
+34915 e4682af7aea9ec52d322986e2ff9f834bf0a369d legacy-trunk
+34916 22f09ab0bae946bbaebbe93892c34f616f3a73a5 legacy-trunk
+34917 1ad0df87ed6c2e50088254050359caf207cd3470 release23-maint
+34918 7a6d0814b561ed1adfefe1987c9cd04c67bf8286 release23-maint
+34919 229bb9f2e96f3fe15a11a51e3be455aa547ca71a release23-maint
+34920 d6cea228fb259ba923520bbf34293b69dbbefde1 release23-maint
+34921 6845697353a31525a8a025180ee8164f253aa610 release23-maint
+34922 d9811759e7debde01a2a184fc18b96ff5d61e071 legacy-trunk
+34923 504943c89193da0dc13fc07f660dbdf981f4529f legacy-trunk
+34924 63cc9fcd285e4b3fa54109cf3b4a96c0c72955ba legacy-trunk
+34925 e50658b3df0e712b4f967971338b87d7dc77e827 legacy-trunk
+34926 02ebe345659531813cbd6968dd2f8ee06e590e2e legacy-trunk
+34927 bfa0369d6760b228b439aa2815ca5a30bc0529d8 legacy-trunk
+34928 dd789072d949030e56d5327c556eed0c8bebb0f5 release23-maint
+34929 cbbfd4127e24754e6c57fc2cf7665eda10f6ad12 legacy-trunk
+34930 3771ff99d5f28ad012a2202e7387e92d34fad6da legacy-trunk
+34931 f388e83f8e4338e175f2753ec8ee5c9103fd7d92 legacy-trunk
+34932 9493dd222fbb9b086b03e989bbb5aa605473b13f legacy-trunk
+34933 5e97757d87e73037f0762c3d1a8386b0a9f6ebc0 legacy-trunk
+34934 c06b570adf122bbe8c21085e161997cc3624d173 legacy-trunk
+34935 4d0756a13f6b9e4c8edb71b627dea4a397a41de5 legacy-trunk
+34936 5b035e6e44dc68aeacdd6e1d0698522871a70b7e legacy-trunk
+34937 3607f23352b98598b6580be0d6d2947bee4189b8 legacy-trunk
+34938 def27527728061a419d0e898a7c79a88c7434854 release23-maint
+34939 89767c18c61608b6eb9df4fbc023f91b9b07e5e4 release23-maint
+34940 88e00021acff6eb8bcfeba081ab36063bc935a20 legacy-trunk
+34941 97062d3658fe7c70792bc24affbf87c664561289 legacy-trunk
+34942 0f709cea43c716f1898e65b9329761bb1b4893f3 release23-maint
+34943 ea3c6f6e46791c6fb2e796d72c0fb0b16e06f867 release23-maint
+34944 ede518b0b9da79f8542e8eeaaafc3e82d14fd4e5 release23-maint
+34945 c2967ce7c01e45268462a05e79ef3040f2e8e4cd release23-maint
+34946 955cb9697767fe299517e5f1784f55f4e3354558 legacy-trunk
+34947 1a988a06bd336b76566e06d941f4830d4cd5ffce release23-maint
+34948 b80a3b82dcf9e2e427d5fd843039ddd1fe869656 release23-maint
+34949 395082dc219429891dd716458fad18cc851f2cc1 legacy-trunk
+34950 64166eaf62124b010ccfe924fbfc9e506bcca232 release23-maint
+34951 a5922b9d0379a07685043c21393f08ee04f4bbb3 legacy-trunk
+34952 38855fda428a68d612974222ba457a6d71a28d94 legacy-trunk
+34953 2b0c785ab30a6e227d9d0560af49ad6b2359d921 release23-maint
+34954 67b9de62ecb86927701c1fc3330709979dd9a51f release23-maint
+34955 9a3a16b82dcbbe4a0ba8262a5e6ea0ad3fb5c131 release23-maint
+34956 fb759e281a2f230085241d4aeb3647b338f88dda release23-maint
+34957 d099ed932993f93d9185a1652a604ae8e9d6915b release23-maint
+34958 5dc5757b118abf3ccf67a579bbef7bf0eea5b1b2 release23-maint
+34959 b220b590e2ea8ea740cc7bf9f31cba7d52ab05e1 legacy-trunk
+34960 acbc7563a8e7edf735c6f468308f471c4d602678 legacy-trunk
+34961 a6f34fba93706987c7aa90be77ac04a044d591e3 legacy-trunk
+34962 4edf200a81185a47fb7461f43ec9bc4367ae76bb legacy-trunk
+34963 f0ae313a2ac86472d44b0864b8d1a58a7a53b0fe release23-maint
+34964 3c4c087494e0cb8841904282069a8b2fe64e1634 release23-maint
+34964 a8f1286f217129cdb53e320ee125d2c2c80e1377 release23-maint
+34966 28eb0046ce8a763a8d3addefb3daf3b4afc174fc legacy-trunk
+34967 df8e879c8d76d50ceddf12cbc1de7768b29cf4bd release23-maint
+34968 9c6a51d87930294466fea866ec239ccb3f0bd689 release23-maint
+34969 1cb87dad263d77dd40c2ce4e9864cdd9195d9cdc legacy-trunk
+34970 8ea3a82f913f6ca3c09275b4b5f94358a51053fa legacy-trunk
+34971 ce165be8c6b8986bd1f125e1f4d28db7ec1e2e69 legacy-trunk
+34972 353a16033f6a4ed695890e5196e95c271b91d277 legacy-trunk
+34973 35393a92acd1d3711342321551ad7842eefb36d5 legacy-trunk
+34974 dfd0114cf9ece7c620d412f76635dad273bfcb53 legacy-trunk
+34975 e118e4e8e2248e4d65b3d73be58a91e5742a66e8 legacy-trunk
+34976 892116a886e0051a8d32afc3a2332d6a03a4b92c legacy-trunk
+34977 c1402176e1a655b235f05c9d03315fa094193956 legacy-trunk
+34978 f6064f8c14604e3cbf7833e91156c930a38501ac legacy-trunk
+34979 a807726df4b7f954ddedb1f3af666fb5a5f41ce4 legacy-trunk
+34980 552a5355d8a8f635d17a28657eb7373ef1e6f547 release23-maint
+34981 706c96e151a089f248f0f27cfe6deeac90324759 legacy-trunk
+34982 2a8f5eb8d83e1302d54c5abf366a3fe02b1d0ff5 legacy-trunk
+34983 be882a9a3d5b5220ddce023ab01130470fea575c legacy-trunk
+34984 91b59f2fee7c1f116ea364ec6d12de722635d2e6 legacy-trunk
+34985 47129152cb7010a7cb6675470e4911051e1277d3 legacy-trunk
+34986 ee53280546ce7d3349f931684be31dca4594d737 legacy-trunk
+34987 1e16cb8b02219e6369ad8accfb534c47421fc355 release22-maint
+34988 cc7f29ac2e981641fa6879a08174ef7f9c094527 legacy-trunk
+34989 90560a9cf3e8b9a1f70f523ec536ad2894599d6a legacy-trunk
+34990 0be925d16e293fdff1d3bdb2679f647d156a69b4 legacy-trunk
+34991 53ae1c3d4a7c18565a9844442dd27fcea4990003 legacy-trunk
+34992 0ffb626d78881fe42419769250feeca9a9947ba4 legacy-trunk
+34993 a8e3bb23f5a8b7c620c5b7ea2b1fc2c3261917df legacy-trunk
+34994 e26fda9de67f28944841f2060fbd62cbcdbb26b5 legacy-trunk
+34995 7ab080bbd60a685c317ff7f7941a54a6a1add1de ast-branch
+34996 55d42aaeb0eef86635969503575c9dccbe9a9a70 ast-branch
+34997 7cc11127273e7e94c74ba798c614895e26dd45ca ast-branch
+34998 ea6b19a10a016402787db01a04c835f5517c6e80 legacy-trunk
+34999 29c1b7b6fd7e5792578ebf9225ab38581739e47a release23-maint
+35000 25519d6c97b86e7368f5802f8595745012ae631f legacy-trunk
+35001 802d937f596abeb04b32e91fc7efa1e1566bdbc8 ast-branch
+35002 1ae267994fa0350aa5865c52af014f713772f6f3 ast-branch
+35003 6a11695fe698eb2c844a2671a6b77e820e59c568 ast-branch
+35004 090816bd8bac001d652bc9d7a9c4364c433fb8bd ast-branch
+35005 24d34ab4ef7549c2a7c1526a2f2e531d58bee744 legacy-trunk
+35006 8c13ab69ba4f147a5cdef04d5fdf7c61ae3bfff0 legacy-trunk
+35007 1dc2659ed9fc39ccee49e8b458d6702f359962d9 legacy-trunk
+35008 6c3c3b771abcfc9e7bdfcd8e2511accd41af2466 legacy-trunk
+35009 31a2809024f521b4a6407d51c02a371e5bcb6654 legacy-trunk
+35010 57553157c1966c279bd23a11d29861b7910c22c9 legacy-trunk
+35011 3158dc1532fa173ce1a2c09e4476c356df29806e legacy-trunk
+35012 b87d1998ef0004d3e54d6b6959234e2eb04465d2 legacy-trunk
+35013 8b62f4194a7e79369890bc565e4cf4eefd969624 legacy-trunk
+35014 d6d1efdcc5fdd44b270a2d8563b0c66398f6e659 legacy-trunk
+35015 139a6b6c150a59fb87f4d3a12ff2bf777e39e487 legacy-trunk
+35016 7366875a3cd707cfadf4f21d3d205e48d44799bb legacy-trunk
+35017 3894654b4848e1756e221a80a7e8d649a70dba74 legacy-trunk
+35018 1c0e4a52673aa5838d2a72177b4de97a031df048 legacy-trunk
+35019 fd4cbbeace79ecc41edd31b3316b2a5793577789 legacy-trunk
+35020 2cd96629fe8d1480d21387025fc7ff628a89b94c legacy-trunk
+35021 ec4a99d14ca4604d242f759653434e7ce6b38745 legacy-trunk
+35022 868cace2219ff72f8ee5ca66b9fed00ba5d545dc legacy-trunk
+35023 8e70892a9f25cb740b2c8524ce23503603df9a5a legacy-trunk
+35024 c854a1f2d19b8142274e0da78a080b68b8ccee5c legacy-trunk
+35025 2c1ba241b3c07a28c0456533707f9afb857635e3 legacy-trunk
+35026 28d00b1a844760640e58bddb7207ba25984da1ac legacy-trunk
+35027 284db2a5f620b085ff1a4318c8e321221d982f3a legacy-trunk
+35028 26eca708b6dd675240f2181592185a018e9f371f legacy-trunk
+35029 ad3faf52e19e403adeb10002a10e23e0b28a7d4d legacy-trunk
+35030 7ea067d749a006604b430ce19583b42b628e8c3f legacy-trunk
+35031 bf8402a56fa427b2551f313de0233c361bda3761 legacy-trunk
+35032 74c073ba6c3b2a42010af9f2106932a0a8054a11 ast-branch
+35033 e401c0f29f50d88be40d42878975fa4ba2108ae2 legacy-trunk
+35034 38b23e6d4c4b964fecf66f628952d549b8396278 ast-branch
+35035 e3474ed80a5ef7a0053eec0071dd33530a363140 legacy-trunk
+35036 6d418801f142dff1931ee4a452ad268663d231c4 release23-maint
+35037 744323b768f0d4ae99135f08b8b5465b65b6daf7 legacy-trunk
+35038 c53daf35bbccc0a95ac37a3d470bf498a4305cb0 legacy-trunk
+35039 8737bb44e22fa8dbf63dc7b6cc1a78da79f757e1 release23-maint
+35040 061effabafcbd7f451425c39f29a4326c5fb1923 legacy-trunk
+35041 dcd743e79ce356ed7094b41952802ecaa9fbf99c legacy-trunk
+35042 3368a4d25f177dee618e74c58153680298c5f7d2 release23-maint
+35043 583d5aa8101ce3a8750b6940c668c1ea4859c9bf legacy-trunk
+35044 5eb9e25e63fd5ed8640aec1594a5ba9c0c17f000 legacy-trunk
+35045 0ea8ebeb6aa2b8a58e68ed40130882cc03c525ab legacy-trunk
+35046 809978c304be4b96c68731bb6bc2bd665280c6bc legacy-trunk
+35047 fff1e85d195c17550b3e54144a0e0c4c6027d657 legacy-trunk
+35048 cd7b70a4c440210a0506ef05e6770114547bbbe4 legacy-trunk
+35049 a53190b38727b770640038261ac115f5ee7ba5f7 legacy-trunk
+35050 b674ab5808baffb2607ab9caee894e61cc39d702 legacy-trunk
+35051 099a4a2f1f77caf9be9ebfbe541f91d3cca65a70 legacy-trunk
+35052 33294206d539f59f2b156464b1d7b7e8d1ca38d4 legacy-trunk
+35053 ca4374662632475be7cc2c394ed02bd14148289c legacy-trunk
+35054 ed689d0c63c13b1b4ab4081f81f2a3ba6e6c21e2 legacy-trunk
+35055 96722377d412c214556ab4f77d06994dfa7a8eb3 legacy-trunk
+35056 c6701d84a3fa1b3f7e0ff4a434f603703a7fc1da legacy-trunk
+35057 af946db67afc44d4ba6ae25d60cfb14372c6167c legacy-trunk
+35058 b4532c246a3a0ec413ccfff8888f63d39f81c632 legacy-trunk
+35059 3cc0d8fd4e2b681acc8183f635ca26027e445fc0 legacy-trunk
+35060 8c7090908cecff69024f5ee528f2883506ab5b91 legacy-trunk
+35061 477f0a252150d75b3e517b1a8bedfdc3d84f56b3 legacy-trunk
+35062 a6bc131ab6188c87c562e96246285e927e5f19ea legacy-trunk
+35063 b67ca3f688f78ba202201c2e63819086fe71447a legacy-trunk
+35064 38514882a5c4c45d0d04fee18e8ff7d4a26689ca legacy-trunk
+35065 f66939f385235d664b68599876bc4d6df3913b7c legacy-trunk
+35066 0baa2660a568bf1f70bb93b8a1bebd69ee74429f legacy-trunk
+35067 416a5d25cba68d2a1767c6664890fe0ec0667642 legacy-trunk
+35068 76ed8a78839185737a143400e8b58597096906f7 legacy-trunk
+35069 4727c81db9499087efb967f30e6a5856fbbf274e legacy-trunk
+35070 6ea5ccf065be042ac63edf06565e8d0da4f67a4d legacy-trunk
+35071 4ac6a0221f7d4b87dc9789945f79bf3ef62d1223 legacy-trunk
+35072 05423c3261d415f5867140ca1465e913caebaf61 release23-maint
+35073 e8dff11e93587965df49944c88de5ab3b6a040e7 legacy-trunk
+35074 4915fbec608f4f0355dc1864aebe8c0628d027af legacy-trunk
+35075 fd6497cf7228e82698db48d47ea7183f050a2424 legacy-trunk
+35076 0c1d2062dee3539144acb87b2c2ca19a8eb697f1 legacy-trunk
+35077 a0ae2d9de69111d0607fdccaacdca4d110c7bc77 legacy-trunk
+35078 bb3c3c98cc1baba1290633735aa6696e52a3bd1b legacy-trunk
+35079 f0e2a8536759fdc120e434e761e69cbe227d815c legacy-trunk
+35080 a0b17732835a20b248ac85efca9491aa5779f705 legacy-trunk
+35081 a340c50e924a374ca1831bbd90ace61165d22044 legacy-trunk
+35082 55412a43d2d3e1c42106a0e974c3825768322cb6 legacy-trunk
+35083 eaa1a4b743287bbcfb6c48a752e23586dee81b22 legacy-trunk
+35084 a32aa7906251495c41b2842ee9a62ce0aed95452 legacy-trunk
+35085 efe07528979350ef5a07e0530f210a055847ea62 legacy-trunk
+35086 ed20259a1ea557dda518d6cd290e1fd2503c1c10 legacy-trunk
+35087 796c99f0fa2c62cc791ec34b0ca8e1af1cfbf891 legacy-trunk
+35088 d8c2db782bdf5ff35211a015578c8351f378eb27 legacy-trunk
+35089 9140ece3db0363392386288eec9960baa754da8c legacy-trunk
+35090 c088584f55339e9aa4a54fac6b0fac4d36685d86 legacy-trunk
+35091 586a49c2c641e538e547f0229a3a480b40440a32 release23-maint
+35092 17ca347303d3f13e2c1ca3d55fa823c844024766 legacy-trunk
+35093 0f394f439ad6a04f63117c575d563a369f6dbc96 legacy-trunk
+35094 ec75ff8c7721219d3c42aaead8ffa8abfe79990f release23-maint
+35095 f166911f778b8571cd131e0aae5dafb2a81c4242 release23-maint
+35096 f7a05ab50d3b4e226720ae6db52a028f9cd0a6fb legacy-trunk
+35097 b2a820e329a90a33e56c87e6b46e7edff57e4ddc legacy-trunk
+35098 57bacb119a976825a2daad18a3d08223a8d1c5dc legacy-trunk
+35099 99891b888cfd29e9f0eb50186c38877b78e9ce01 legacy-trunk
+35100 1df5b6a1dbf6a540142c1e36134eb0bb84785bfc legacy-trunk
+35101 b3d65326ca66b456da9c09f7b0c35a322d87df4c legacy-trunk
+35102 bf36c11633307fd196cb29f8d66e8030e3572cd5 legacy-trunk
+35103 6a8b122aeb2ff7a46b201924395dfae57c73daa2 release23-branch
+35104 a6284e9f30a2e6eb299e1b1217d50309dba21620 legacy-trunk
+35105 f84d2bc6831d4866f9af45face8df7800cc00a02 legacy-trunk
+35107 4e40eff1ad186ea289c8bd86d931395b475fc656 legacy-trunk
+35108 d3258f43d484bf1e264d2e54d859c8c7a93f5784 legacy-trunk
+35109 631ce23f88d6ae597eeedbc7ef75ad2a1a3a315b legacy-trunk
+35110 f38bd393e95475b329e2b5970e71c04d02aff4b2 legacy-trunk
+35111 9da94e569d48bbf8099995e5d67e1d36c1575003 legacy-trunk
+35112 fc57200f70f24dee4a1e9a966ca2d06b267e7107 legacy-trunk
+35113 64ae832131e14074cc1f757b7d14155e7a6e8e74 legacy-trunk
+35114 4055375dc05ea2198d2eabc4027d8372239a67ee legacy-trunk
+35115 67a1eead72bab4bb87cd5cd3bca9e90dcd64bcb4 legacy-trunk
+35116 e20fc1b802051a02012dcd4c0a0f8111dc73469f legacy-trunk
+35117 46ad21b5bd334c496374e35c879f7db9da0bc136 legacy-trunk
+35118 0aa6441c7fe6d8bfe9fec4b6e68d9808ff581871 legacy-trunk
+35119 5bbec8f1bf6d650ceffcdfc6e54100e835ec7ea1 legacy-trunk
+35120 cb9231ef3bb93eae31df3eb40050205f86910e53 legacy-trunk
+35121 887ce39f95f2ae9818fdc59f9daf7b963b90e3bb legacy-trunk
+35122 4067bf48154d374b190473e0f00bc9d9e82ef7db legacy-trunk
+35123 ec0c906210bfa3205396ca33e1aa5e88025dc621 legacy-trunk
+35124 aca1ce1b4b6144202d6ccf59d69148b6e2e4c180 legacy-trunk
+35125 9169d79ed3048e0811728ed02da318e949549e70 legacy-trunk
+35126 cef613d904957cfbed8f498b0d4bfe6a5f0d972c legacy-trunk
+35127 c9bed200500e4f7704ea04d9680ed33da872cd0d legacy-trunk
+35128 c87a7e813a99f63defee7c7b8754f4ae19c38a80 legacy-trunk
+35129 38dcec2f7b03444a50338df95b163d92afb68e66 legacy-trunk
+35130 3aa20a82de867f6055134eb0052c79235c30335b legacy-trunk
+35131 40d725077dcb0d48f9dd14b490042c851a7545f1 legacy-trunk
+35132 b9057a6763d7d013c8b468e7ead9f4cc83299654 legacy-trunk
+35133 b3d7ebc13d7d5eee0e58f78e22396a4b95be4f66 legacy-trunk
+35134 0fce5b173a7402eeb0e6603bbd379c941749608e legacy-trunk
+35135 25a80164cc7afef4aaee4a4d2bcf22789dbaf213 legacy-trunk
+35136 897de9208199b96dd6b11cd30155db4811a6cffb legacy-trunk
+35137 12cc336828e9b271956f58baed9e1e156e6e68c4 legacy-trunk
+35138 9005f2662a70eab22ca5093d6ed50297e4fc2f6e legacy-trunk
+35139 7407a246dbe02f80c9186ef080944be1aa89997e release23-maint
+35140 ff9a54953c0bfea77e52d0439051e4950523c99c release23-maint
+35141 69a365e47ac0a20965c805747d2e1f782275c8fb legacy-trunk
+35142 1dc54225a4c22899a696594264164b5e33f67548 legacy-trunk
+35143 e7124e26925f64b5db31ac492ff91e3dbc1a657c legacy-trunk
+35144 690105fea59d38feb34031a9ba694d4b98a1e922 release23-maint
+35145 6e3758ed1ef412a92e16d15fbfe6060b29fba99f legacy-trunk
+35146 bbc944e1feccb611a947bc89cd8be1f1ea068426 release23-maint
+35147 266f226f471d0465259870b938dec083be02262e legacy-trunk
+35148 ec8a4685b360666871eeed78f7585eb561d81d92 legacy-trunk
+35149 14dea6f8b0c344fea5c91e767f8677c32000a873 legacy-trunk
+35150 c380dc29304ae1b31b8839539cbcaf7dbfb17b99 legacy-trunk
+35151 f7f42f3c3fb4757eb46190eb5e4b7b529174f8b9 ast-branch
+35152 a15115290e13b28fc8a634180ac5bfba7d24e036 release23-maint
+35153 7fcb35552d53a34a087ac2c3b215be834b60be3d ast-branch
+35154 0380878f3db5493149ae4c7291a5a15c73381081 ast-branch
+35155 603a9eaa74e155d8dfa69b357e10e50ce9dcc832 legacy-trunk
+35156 ac4a7ba54792904ad827f2e98673f9cf809ff410 legacy-trunk
+35157 b1dc5e1148ea34efa5cf7b7a8fb2e6e4efd5ecff legacy-trunk
+35158 be56fc485e270d6e246feed8179ff2318c5fc3e1 legacy-trunk
+35159 7be5538059493e63fa8d16d559b7dbf8ea7661f2 ast-branch
+35160 561fe7f66515e09f90121024ca60e8b8790f97c7 ast-branch
+35161 c4d3e7a1ff869f0fa65ebd0b0cca9ceaaa3366ef ast-branch
+35162 61a20df4b0ef5fd793fa98a0c9502183083463d4 ast-branch
+35163 b81480f7cffe619a9417e7df08fb33d9cd284f13 legacy-trunk
+35164 186319cff4b224e4037385d5f5f6e08dff081c0d ast-branch
+35165 7c88a069a1439a09e3f5def277864894e6b8654c ast-branch
+35166 8b6084848da189a0c679bff4409c424f0e4490c3 legacy-trunk
+35167 66a4230f945b148eb3c735e0d4d761ac99b95466 legacy-trunk
+35168 8f47281fea7bea4c955f811485bbf03bd06c2940 release23-maint
+35169 46224690a3655a43ddb9af34ad6a4f621303cf17 legacy-trunk
+35170 f2fd4e5ddf195ac2335d0253833d3a6ea7b459db legacy-trunk
+35171 e4d73ee8d4e16ba4c4a81966b603a7af719328a3 legacy-trunk
+35172 8d06c192f0e6d3ec9d70baa09d0b465f1234c94e legacy-trunk
+35173 adb6dffd8dd5314b453146158074559bb62c527e legacy-trunk
+35174 1ebd0626d176108329b7015724fb87fd22ef84db legacy-trunk
+35175 2880ceb8119dc1b525e35053d97318e30def5b7e legacy-trunk
+35176 e8b96b2bfa7b20fcd817747a132837ccdbc8da1d ast-branch
+35177 8f8bba0a75b4cd0826a5a5783e393261e4dd4caa legacy-trunk
+35178 4e7cc50b30a16438f714b4b36dacb6efab4a4ab9 ast-branch
+35179 501daaccbfe0cb64cba0a94c3fcda0f00c0c44f7 ast-branch
+35180 d667e33e02523fb7b0d9db31208d06f1fb85a3fe ast-branch
+35181 65778352066bf94f08880eafca74c8f31819e8bb legacy-trunk
+35182 374697478b5ac02e60abb583a8ed6f0524fd8875 legacy-trunk
+35183 f76feb73a0e47169a3615b928d60d06d908ddc64 ast-branch
+35184 6308adf172f480350724efa0756fb1c39dc4bb00 ast-branch
+35185 952517798cb5d30366f4953b1126f0eb779036df legacy-trunk
+35186 63fa60f2d61ca836b5e2d0959ded1c0028194aed legacy-trunk
+35187 4a9e56368c6904c39251c82ba701eb80003f6fce legacy-trunk
+35188 3c57a1c3a87aef1388564f9059cb4a87f1623c78 legacy-trunk
+35189 3c2677c4a2bf369e81fb6faf8b13dc64d2444fb2 legacy-trunk
+35190 16b315df13ce48f7b3acbd5ccd6eebe0ef84c532 legacy-trunk
+35191 49370769267194b769199854a7f5d816f1daf8e2 legacy-trunk
+35192 a2fe1a35800a06d477d250c24363d9800fac71ad legacy-trunk
+35193 afb4c9726d1a45a231d4fced9d5773db15dfe293 legacy-trunk
+35194 a282801b06b648df0c8cc46012285a7abffbc69e legacy-trunk
+35195 1219f1162d1d1a95897134f5e649651dbfe2e8f0 legacy-trunk
+35196 97bcf2e88ceb8916ac8c5038988729ecb3905cde legacy-trunk
+35197 16d269866a4daf7bb2bea31f215e1f6f8971b604 legacy-trunk
+35198 dfc1819b4eb4732f9a1487655a283458d1c30a02 legacy-trunk
+35199 b4bc83f2fd04d9d211bf72b81b0082f7d7858b3a release23-maint
+35200 92565ccce92b80cad7a35fc476e30fb97890d7a1 release23-maint
+35201 66a550e9b2fb75c2e212361ee0984e98fdc50b8e release23-maint
+35202 bb7146d117fbd390ba48a21afc7075fae1764ee8 legacy-trunk
+35203 3cc3cb79043f721800bfbb13722d7abc1197c018 release23-maint
+35204 d4165d12f73c19f9651eb9aea8fc78f54b9d2d95 legacy-trunk
+35205 37d501b9e2d5bb0f824b6a75c8e9f3b684bf10ba legacy-trunk
+35206 566737bfaec95054bdf45f2206927647e69e8180 release23-maint
+35207 8ae88db7843c1f0c0a6e18a02b8083ecb92f5b09 legacy-trunk
+35208 c5824c8c6ba7227577ca2e9591340ebb23d496f5 release23-maint
+35209 032cb17ac2d6cbfb7ffe4d365219b795c4b40ea4 legacy-trunk
+35210 cc10b010f40ba1e4e2594efc45f5c5b77ea370db legacy-trunk
+35211 42003c8600f4d3e37d17ff48705bf8c0fa6ca5be legacy-trunk
+35212 d5c047807c697b341ccc3515703d4813f7c09602 legacy-trunk
+35213 a577410e5a60fde7042bfe72950adf63490b3497 release23-maint
+35214 aabd9b54e469ef88101c55e872fa24fdbd989788 legacy-trunk
+35215 85f4932d8ffd9970055743bd161e4a84e1eec685 legacy-trunk
+35216 f04ccc288542b6db62385f5661ba61648582683a legacy-trunk
+35217 44d4438ed57a5a6e8ce0394b4581fdddfd6ce954 legacy-trunk
+35218 de2ed800fa50fa556733c9e025d331fa1b53eab5 legacy-trunk
+35219 8495b027bce366099254a27b1bd8d24555bb80bc legacy-trunk
+35220 66e43f25046da5e7053bc0c69b00b4f8d198649b legacy-trunk
+35221 1dc96d87974eb688b20e12dbb41795702582bb26 legacy-trunk
+35222 174dcf171df52c3f53241a053bf5b0b2b481da74 legacy-trunk
+35223 7b34d849c2290065d093cae983d7bc7024ee9680 legacy-trunk
+35224 3ce4ffac27ab44c2a19e0a5e31bc2d87e604ee98 legacy-trunk
+35225 308c193f51e317856cb1bad42b6ed0a4f44e18f2 legacy-trunk
+35226 25b30439fe229f0026e4d7d6323e6efc10188156 legacy-trunk
+35227 ba9aaddeb956847ad064ec36c2468dbd0aea3d71 legacy-trunk
+35228 f30aaac00195e876532f353a2ee1d93d8f51452a legacy-trunk
+35229 573b089fab71d3e625be91c8263233dfe38a4c85 legacy-trunk
+35230 91af65b932d622887bdb0d6a1d048289cea1354b legacy-trunk
+35231 d5b4c44c76ce06a84cd52dcdc2e2e2e7a43a7cb4 legacy-trunk
+35232 d984b3bd1ceb1a0d2acacbd0c734188156c436a2 release23-maint
+35233 65d28fff1172e15f77f8457faa74fecd71f56da4 legacy-trunk
+35234 53dff60f55089bac3fdbdd727dd6eb4588546a92 release23-maint
+35235 e178eb43efddee9b9b31d32ae202de1f8e7a2115 legacy-trunk
+35236 727120fb03652dc2811a65bda5be6debe9ca1a06 release23-maint
+35237 f57f5ce22c8dc8d2135b9798d79b7afc4a982204 legacy-trunk
+35238 08ec4db5064eb6a25d4e82b25bd769bc78335887 legacy-trunk
+35239 89f9070dc1bc0bc109291b335e63c363755a5ae7 release23-maint
+35240 fd2d64af2640ab613c810ab3310d73bd6bd27132 legacy-trunk
+35241 db4da93f0ba0ee4be0e17a1b2ed548440e4aefd4 release23-maint
+35242 8e218cc8edab2bddfe193d03b9eb815289343a09 legacy-trunk
+35243 feabe2ff0e1e09d2a3d2ebc730f38b270a7e7e55 release23-maint
+35244 6a8e8a13c7455fcf7a905035cb56c0dc3b93a19c release23-maint
+35245 4c12d3b0166fcb02139ca77241312a5c90eef015 release23-maint
+35246 fef9f2a41c34c03760f6f3dd379a3fc0eca70ceb legacy-trunk
+35247 2b7e08dcacb14c9678331eb81fa147ab6cd3d27c legacy-trunk
+35248 51c3d452af2f2cfb8a404d87318241a4708d295b legacy-trunk
+35249 75dcf2666d54460938b57d1a7485a723d6246935 legacy-trunk
+35250 5d9a3d76c94e60362fe4a52014b914c364b8f002 ast-branch
+35251 8f06320098dd60413a30c613a8a92af7d2ecc4b9 release23-maint
+35252 14f860b03be273aa9cac25f1a1263dbce64f1000 legacy-trunk
+35253 59538d3b7cd2d5d3d2e13b52646f7cc8ef9b1f24 legacy-trunk
+35254 eb48b2503f201d44b4ade64fc6d3a2084eb5a969 legacy-trunk
+35255 2abc52c3d4c2fceac365a1d8956e8fdfe89bda20 legacy-trunk
+35256 1f5f6cca2f210d108c7fd18819ad8e4b6ea7303e legacy-trunk
+35257 eb69eecab4c7b6c0a144151b9062307ad1395ba7 release23-maint
+35258 3541291438094cfceb0cd6748d97458be39ba57a legacy-trunk
+35259 71864820402d6569de4ec7dc77d621a283e8e5ee legacy-trunk
+35260 ce58d1cc6f405f3319148fb70639741d2dbbc1af ast-branch
+35260 cdc66292e55d369e74b4b3226bcdd8271ce708a3 release23-maint
+35261 22199ef64ffa0452aff2b69af799eac7946efb34 ast-branch
+35262 106fa94b42de0c905a0ffc4b005bc5b282b1a282 legacy-trunk
+35263 5a45b5c2371e885154cb78191c4413918ab448f1 release23-maint
+35264 eaeea587f90a29556fd3241e02b641bfb02cebd6 release23-maint
+35265 5bedba55ba037fe2c2f38b5abd04cd6a72bd608c legacy-trunk
+35266 545229dfd9098587d43b341a7ecaa80a1b026ff5 legacy-trunk
+35267 71a294bd79509cd42097797e39d6026ef9030581 legacy-trunk
+35268 9b3daecaaf2544d9c1e0f0c585c35890c631a699 jim-modulator
+35269 15600a237492a3fdd516a0997215f3d60c6580ce legacy-trunk
+35270 ee44be8e19fcc94a262f14317a76d206c961b250 legacy-trunk
+35271 2e62fc978d8ae97c3ec56250dfe1ffdeaa00235a legacy-trunk
+35272 bd0acc42829efe4397ac82da47fc2852d8cea8e9 legacy-trunk
+35273 58d5ede5f4ce2d9787c45053c284b571c7f1f0a6 legacy-trunk
+35274 6b7b2c62ab12608841f2590ee9eb313232072ed6 legacy-trunk
+35275 239443933324b023f7ce19d6fc9dbe4e968e0c5b legacy-trunk
+35276 76c813894ee6f30555eee9f5c569b90791dc0541 legacy-trunk
+35277 3d927e1c78c884d167c6f2c24a5524bf5ebbd7f8 legacy-trunk
+35278 4ef568c653d9c6bcd8daf6074ec9b986be140643 legacy-trunk
+35279 ce0106df6a6a6325e34a9fd1e8b3ef2a29569786 legacy-trunk
+35280 27bf05b2a4f9e3b64da2a23cca71c40af643b167 legacy-trunk
+35281 1233bd95da1a93f9e2fceedc1faf4a45badad9f4 legacy-trunk
+35282 bfb40a03cc0c01fdc80ae1a9d8798f455e1e6b1e legacy-trunk
+35283 95a32c78672db3e2cbf809721618faa0e84df7ce ast-branch
+35284 35495d36ec957ac6403fa3030b708a8558fa7195 ast-branch
+35285 8d49c29e9ac1e81a117e45b9bd9c6081dff71b6c ast-branch
+35286 3ba4ea8fce3e501f311faefc0061f3514fdaf626 ast-branch
+35287 fa981350976cbeee5e6c889aa0657b38887a2f23 ast-branch
+35288 25a35d8f40837c03bff51186de131384505eae20 legacy-trunk
+35289 78362aaa491dffe7a2eca7a1e9787e82d8c07adb legacy-trunk
+35290 427e8baa70574be2e19a02afaa45b34eabac19c9 release23-maint
+35291 35c0ac8e087135f5c5596d660923d26bc0c3bf8d release23-maint
+35292 5eeed51e82c4db1c2fa25ef1a03d6993135e731f legacy-trunk
+35293 f6d8cfe7c000996d2295d44ede6eb8d33369702d release23-maint
+35294 7c052be401693b6e372cc15a89b2c18ad5032cf1 legacy-trunk
+35295 64c08db8dce4460ea0bd748ae134c9a243786765 release23-maint
+35296 79bc56bf9220747f7e99b60ccc64cd048d1af02f legacy-trunk
+35297 b0c6f7c5ade65a4f45e507a832508cc80da2e999 legacy-trunk
+35298 9f45a2d3666de7ddad41b0d78cd3a969896c6a05 release23-maint
+35299 0a334b226f3a311d7b318724c2b5f99f98b73a4e ast-branch
+35300 ec6232ed911525be444a74eddd5d9c023a68b1af legacy-trunk
+35301 d98d0255bb0ffd8e4e037c751bcc72f9902b939f ast-branch
+35302 ab339d80c9c9af7db916c6c8f88c6ee0b56cc983 legacy-trunk
+35303 a5457b62022658a9ef8d8916baa2a3af1ce3cfd7 legacy-trunk
+35304 72e970c0accc1225d8456f30c81ae1dbc0f18d39 legacy-trunk
+35305 391011840a03f767386d07435a56d952c5ba5ba5 legacy-trunk
+35306 2c8a43063d82c8dcdbf5313ec14c603a238c749a legacy-trunk
+35307 470f95ad67507db4f5cb4c39407252a3e982c748 legacy-trunk
+35308 97ebe4014edc9ce09a7f9ae1a709c444654f9998 legacy-trunk
+35309 3da6c2adad343cc6090d527eb196027e581851bf legacy-trunk
+35310 bdf006dee6986b805efcb9c801b57dff88486b26 legacy-trunk
+35311 a157cc20f1b7db5e7faae6fded7b2f100ab48496 legacy-trunk
+35312 2263250d7b2fd302567a4d51cf8bb442ed24272c release23-maint
+35313 a6d8d5ace6a78d55c7790cf84bbcb0d858c39ede legacy-trunk
+35314 3828339adf867cae6f1be2683c5fcb4af41bdcb4 legacy-trunk
+35315 119d0182bd5e43364c09442fcd8bd48c306b490f legacy-trunk
+35316 c303ec019cb2c8d104301a607738257174a06a22 legacy-trunk
+35317 9cac9d0b19e3131e8580058ee3eae5ec6091c2a1 legacy-trunk
+35318 cc7943189a5bcac13c027d6d0cd0a92d1e9e6745 release23-maint
+35319 c75a4edd1e527f06d4cb0b962bff605a60f0726f release23-maint
+35320 f1e0a7c48f360339db83743aee9f9f1ce372ad10 release23-maint
+35321 6dd38e4586fffd8a675c044c18135873b3e617d8 legacy-trunk
+35322 f457f18f5922139fa72571b007fea43318a49fc3 legacy-trunk
+35323 475bf4e7920edfcc69843eb900a4b3343aa35ffa legacy-trunk
+35324 7a761cad7513d37d9aa3062b9fdbbffc8deec403 legacy-trunk
+35325 911b3215d0dc46d0b0438058ed0db3f1d97b7ffb legacy-trunk
+35326 1c0663716db357db4279a8f02623bef90b3e07b1 legacy-trunk
+35327 8a39a98c878024c3df1aeb30cd0707e6414bb919 legacy-trunk
+35328 4632fcc5544a146ccd43c81cff0cbf6ebed6f8eb legacy-trunk
+35329 83502e31e06e19d05e8aab69b01971ea4d77b297 legacy-trunk
+35330 7e4e3137b2527a29ff1dc729a06a694efe3b596d legacy-trunk
+35331 78f758abc79f29e33a65db13a3c400afa170b206 legacy-trunk
+35332 8ec3aa879eeea0ff90347a0a3130446f87b0859b release22-maint
+35333 3c9b4fc3ef147c099cc20d7064cc8013cc2bd935 release23-maint
+35334 c37c407faf52ed92c12fd74d9b763c8e1bb2b618 legacy-trunk
+35335 19b6fec2e52d28b240cb5e410dd6182f5e28eda4 legacy-trunk
+35336 650ef009e08c196fa46bd7274d13eec8524e5f46 legacy-trunk
+35337 688228ab05aeb5742510c1bdf79f32ec6c7a8525 legacy-trunk
+35338 8183dd1a4fe6bbcf2fe964e908d4e2f24f318831 legacy-trunk
+35339 a9fd47644c0f798ce5c23c86420731114954d691 release23-maint
+35340 f2d94ff15ac8f4279f19cf3a8cc4f1b9bd4b2ba7 legacy-trunk
+35341 5e7455fb8db6b5fe4ab5f5fda2fdbf4a5500eb3f legacy-trunk
+35342 2221f960180df72ea48fffb410b228c40a9ea275 release23-maint
+35343 0b13761820b0c1d8898ee5ccbdb2e618dfb996cd legacy-trunk
+35344 7abf42479880e5f595af6ea3d7b725bb89216baa legacy-trunk
+35345 2c6123d925fee96fed5037c2fcc5e141352fc496 legacy-trunk
+35346 54685d9ffb876ba4bf97a2f88fa913b0cd7aa48d legacy-trunk
+35347 4b2d6d130061999a99dad8ffcdf20322db049393 legacy-trunk
+35348 69ac672b49b3ec7aed33db6df58e9612588f5e59 release23-maint
+35349 ca3c998afa555fd33ddc551b0dd64afda0d83d5c legacy-trunk
+35350 c723b0c1a7e1db4aeca28e53c200f44bd51576e0 legacy-trunk
+35351 26a80f0af9f3ae75a22d0607106656de1f337c9b legacy-trunk
+35352 c6753db9c6af8e2ed04fb06909574243a7bf34f4 legacy-trunk
+35353 706d6d11ee3638193ea6cb3e2939af956457b02d legacy-trunk
+35354 123718d0dc09e488537dc7b22b552ee104efedc9 legacy-trunk
+35355 65c502b60b4d19c122718d01a4c4cadd03b74b2e legacy-trunk
+35356 af25ccc75feacb9e64b76826a19c78db85962fab legacy-trunk
+35357 05e1c27c0a74d81b50c426e50926cd329a79306f legacy-trunk
+35358 cd87ff6ea8140ef3e21d7f98477bca67aa4a2322 legacy-trunk
+35359 f1d0fa698b737b8c3622af509b9da4625b51aa06 legacy-trunk
+35360 d7ff05137cea3df565233b23a112aa95b4cc54b4 legacy-trunk
+35361 f3cb4cad585e669498f70cd201fad67013aa053d release23-maint
+35362 06d824f5f2c98ff55fbf8d2203dade56a3c36929 release23-maint
+35363 15553a1b7a17a102741014cf77230b49221e67d4 legacy-trunk
+35364 071ee0ff74678968c2cc8865303e994f30d8bcd8 legacy-trunk
+35365 2fed331de014a4c2cf9e6703d901d0b875645345 legacy-trunk
+35366 fd2103ae6f29a1e06b3ff8cf548adb64fca2d4a2 legacy-trunk
+35367 8ecee8f47108c8b5a75cdedcdc2d765f061cdebd legacy-trunk
+35368 ae8dbf500172a1ac1b9354b18e1950cce170c42c legacy-trunk
+35369 80bd2b85ed8a1e9979a8e69a43e7ee68bbf5cd79 release23-maint
+35370 dfdbc0058d8590e21859ca036765aa4ebfd7ef96 legacy-trunk
+35371 0979fa062debfe7d6c5f054c287cbb2fbab43ef8 legacy-trunk
+35372 248beb99a304c93eba4640dda828e03b30e4630c legacy-trunk
+35373 46df08eb0839e9cf56a80f0870c9a619127b520c legacy-trunk
+35374 c2df8a5c357e00e601d3be0ac14506536fdf310c legacy-trunk
+35375 739ab9de2a1baad5fe11b8780b3a6eaca2112c20 legacy-trunk
+35376 5b3898d9ba5977ac6804bcbb8cf1caaac01ba59e legacy-trunk
+35377 ebba5582dc0db5361f4b42c030ef4e252638a1db legacy-trunk
+35378 bc006682acb21a1e1edce1c0128f5c505a8d13d7 legacy-trunk
+35379 8f60217a7547599da20a5f240ea7c3f5b515cd8e legacy-trunk
+35380 47890c395ebaa20e4be1cb7f754c4fb4cbcbf45c legacy-trunk
+35381 635eebc473b065c754c8fce43d7a3236a43011e5 legacy-trunk
+35382 7080a0210cf187f209c2333b36c5893b3a054161 legacy-trunk
+35383 d34e7eaf4cd6a747e836fed61ca90aae68c03c5f legacy-trunk
+35384 b795433e0bd91941d8d7c0a916ad11b93a3ed9c9 legacy-trunk
+35385 1b02c77cdcfe135c0c327824ff89fce229c6128b legacy-trunk
+35386 1543afab1b672b1247b1be8605b18747a19d92c7 legacy-trunk
+35387 7e4dd93f4b27131266061940a4a888d4d1ea4d36 legacy-trunk
+35388 72e38bd94e5698f6e309af320209f239d379130c legacy-trunk
+35389 31577c2815de51d97a2846ef74931df578ae5b35 legacy-trunk
+35390 b4e4dbd24fe77fc4e2eb6a8a6cf2c098c90f5734 legacy-trunk
+35391 228d264c5fbbd9d8ab1536457fa289dbd2cd779a legacy-trunk
+35392 dd69e3f5225bafe508981ac2dd6df1b9ef5f2aa1 legacy-trunk
+35393 5bd455638c7a8a49d4df329a8a2c4a17390f30bd legacy-trunk
+35394 ec6ba03ba9627deb8f346a064c01cc4fc7ef8f82 legacy-trunk
+35395 04eb2ebb46e27a1f26fb87705ef9a847d9f90262 legacy-trunk
+35396 95bfb653fffba012089a23ed4a8f359e96892c67 legacy-trunk
+35397 1253f6e20cdee05b4d6d77f52c778948b81cdc6a legacy-trunk
+35398 0d53ecf22d91523da50364fc3be31e3a6e864fa6 legacy-trunk
+35399 047148089c35d59e7acbafbc51af7328c7719cb8 legacy-trunk
+35400 42f8820686c9eba7d99a90db843b0d1ba0a84000 legacy-trunk
+35401 eea674bf7b59a86ae21596f899335923d4f4d4f8 legacy-trunk
+35402 30e305bfdddbdc488d7751bce561f8ad0652fa44 legacy-trunk
+35403 a0fb27b44d78383a38bff7b22f2038c5bcb5739f legacy-trunk
+35404 df06479c6e7cd11d2d4717d6fc60b3bda1d031e5 legacy-trunk
+35405 5760b4dd3a224e477e1f1ae56a5ffc54693bf03a legacy-trunk
+35406 83b0382e0d3625aa9d74b07463974beea15c8112 legacy-trunk
+35407 d10c778af167a0f3cef5fe054d378a02073064ac legacy-trunk
+35408 76944084e756a16b8d581c904e164ff8f86e45f9 legacy-trunk
+35409 243642bbd03f35e45e1c6a8e3974ed31340711cb legacy-trunk
+35410 be782d07c518d28b25816fa8406abddeb5194e2a legacy-trunk
+35411 35cb8114b45c25b0e93a2240c7942f643abf0f42 legacy-trunk
+35412 ef06c2124cb06e1f5093d53cdcd3760fa725e9c5 legacy-trunk
+35413 f2600448e85c9506577c6075b00921a8f92dafd1 release23-maint
+35414 7fffdb94a172da45d21c1e6d6f8f5825905b06dc legacy-trunk
+35415 f26d8286a43e9e45c4ff0a920ff97034aeba2f15 legacy-trunk
+35416 03693af46afbcebe66e89909f690a6047e3f57d2 legacy-trunk
+35417 26cf2586f2fd299e20769d084e348ac547a0a166 legacy-trunk
+35418 b8992e781840a085a342c5051328fa685df5047a legacy-trunk
+35419 206d8575f64419fa66d396a18b3961759bf1c247 legacy-trunk
+35420 35f56e08727f959533c96b53ccc054f90032d29c legacy-trunk
+35421 152adaf765eb2f05f05218903ae6821d4f32b8f5 legacy-trunk
+35422 88e9c0444d4dda7ec7863b272c58708db76ab7ac legacy-trunk
+35423 3f693a772694e23119708f84de84268878cabf9a legacy-trunk
+35424 ba98996b4d50a81cbb60e59eceb15848d9e5bc7b legacy-trunk
+35425 9a4c49c5ac03ca8b0ed1711e415b2e3db518992d legacy-trunk
+35426 ae6037a3adce99556c52035eddec8efd8c7ecdab legacy-trunk
+35427 a3830ae294ae683db21c41a47fe7484dc54d26c0 release23-maint
+35428 ae6fda960d39bc3049da054029b29d1ecd47002e legacy-trunk
+35429 606f0473a96687f489f5fc3c38021495344e4163 legacy-trunk
+35430 6bcca47918499b5def10884bc8c1aace415ba42a legacy-trunk
+35431 08c3b4905961df6032db644d7a91358230777b49 legacy-trunk
+35432 a6bcf4df1a8576dba9dded57e5e901a1547e6985 release23-maint
+35433 530a0de3517aaf0e983783e9a75ab591915f4528 legacy-trunk
+35434 2830d8e1af185a59dc9235881bf69afa24500bdd legacy-trunk
+35435 f7374e3b279a88c73221f00dc9945db10bdc777e legacy-trunk
+35436 2bfc8866ea993868ec229f714b5143b440efd193 legacy-trunk
+35437 7bb030066ea4b650973114eede8a48dc666530d0 legacy-trunk
+35438 c0a542a1fc1c8b9b7bca0ae65d5077174a2a9ce8 legacy-trunk
+35439 da78b96b6aabeb03e58f9ac235f9ab60a3887e87 legacy-trunk
+35440 bb3bccb3b77d5aa000f511628c36a527aa70823b legacy-trunk
+35441 ce83ab07ea07308864f61d9dc0f8f3d3e3f3d92b legacy-trunk
+35442 6b75060464f44627f77d9859ee95793aca666b8d legacy-trunk
+35443 c32381f4dc6f2e5447d56db2d0b35347c3c9d94e legacy-trunk
+35444 016f006d71cc3fbc0fe4efe393d65989a619e0c1 legacy-trunk
+35445 aafe5fef58bab7c123b3dd9769471bf79779d532 legacy-trunk
+35446 823279ae43eb10af96f0445d9fdfdee5607710c6 legacy-trunk
+35447 a885e4d64ad0b89947209219f7a0499a92679723 legacy-trunk
+35448 ce70f1446f399e12e722b98a0227e973e75a07ad legacy-trunk
+35449 0fb5066fc2a7fd468f0e5b5a9708ef171280f47d legacy-trunk
+35450 12bf37a58015af9369b89a77bdcb34e2275692a6 legacy-trunk
+35451 5e8c6f38e15b5ace15ca579700d1f8aa4a7fcd1a legacy-trunk
+35452 f7bfd8f91c2b90c74231cfc2d353f0b12e4ee700 release23-maint
+35453 6d8a14148159b1bd62a22163b7621b3016543492 legacy-trunk
+35454 ad5c6085023e2493139e16c101d9a37a473d82ba legacy-trunk
+35455 332d3ffadf287eb24a4ecfccd109218c47f05d60 legacy-trunk
+35456 507422eaa763593e7b95990cc8e380e1d7c9c3b2 legacy-trunk
+35457 92d402209e90f977ef35b8f27ce2947f0352de02 release23-maint
+35458 d087726417ea8a13ed539e5c41a7f1e222f1a634 ast-branch
+35459 03b0fd1cd722584aab7b6d969df726e4d360bce8 legacy-trunk
+35460 6bf87985aa1e98e0a84e1b765eedce4ca68b2749 legacy-trunk
+35461 5e63c2e9b79253137022adada2683e54a970f619 ast-branch
+35462 ceb6aaddabcc5d9a6f41dbc5b2f1ac769b2b8edc legacy-trunk
+35463 5b2247b95323c327d50b3aa84fb762fd8ae5cf18 release23-maint
+35464 36a2d0e8a99335049d262973ac31cb2a32047d51 legacy-trunk
+35465 93fb4081d107fb4e99b52582183cfb2619d7d52e ast-branch
+35466 ffae2f1fdd46c8c6d1899e13c5e93b57635226ea legacy-trunk
+35467 490eb64bc5c97bb5b08a62afd3b557b32da8fd57 legacy-trunk
+35468 179e04307ecd3da8af21e41223f8b0db31b2e715 legacy-trunk
+35469 ceaadbd7f19a7e26f45ea851b17b2e5691cee36b legacy-trunk
+35470 d948dee6f4a1bed9be19585898e319b1d3d67e08 legacy-trunk
+35471 0b0086d53b8e87957616c49ab046815ef3fccb27 legacy-trunk
+35472 c4ebf7ca1bdd01fdd6f50a50f3435ca2ab9e3e47 release23-maint
+35473 65b0c7b561daf42f67cf154597668495b920d7f4 release23-maint
+35474 52ba1a22cc2e1b0f82229ee54df8c8bdcf454839 ast-branch
+35475 cd4766b0637ea1d22b2f6b051f86216b9abac540 legacy-trunk
+35476 d63c562ebbe5742d3916cc7fa10dc14dfe2177d8 legacy-trunk
+35477 91260fb3c814763771eaff44bc7f80972377a16d legacy-trunk
+35478 cc7a9fe80b1b7560f7768f5c36e1de668425d4d3 legacy-trunk
+35479 820bb818d6984c59b6b27c2b385076acbdb7862b legacy-trunk
+35480 660fc242a7669b06bceec83871a6c9cb2044fe16 release23-maint
+35481 fd26f29e7eab8f2fe1a41d57b96eea0e9f67f0f1 legacy-trunk
+35482 0420d3cfe4a4aafdc13d8fbad3f5389ae14a472a legacy-trunk
+35483 8ea45cfe17fc6038fbd0afb243efee11728e5dbb release23-maint
+35484 c83795324042742c63cfcd388c462be20326f612 legacy-trunk
+35485 faffd9572d8d3239a02518f653355260fee5c3b4 release23-maint
+35486 c75876432fc6b5ab6df113607aeb635e259a6fee ast-branch
+35487 284669409beb46abd1c5adbd36957328c8339595 release23-maint
+35488 d69fb35f1eaea438a75cd82ca978eb6d940d20d4 legacy-trunk
+35489 7a434f493c3ea8b89edc94e3ce61bafbef808f14 legacy-trunk
+35490 63865611ed2fe3524502cf057b8dad36f2836b57 release23-maint
+35491 26d0fd03d5b30edaf6913aca192b961d6d442061 legacy-trunk
+35492 c4d9a96be2ddca4535b437e9713feedd431ae502 legacy-trunk
+35493 6509354e78769db9a2a76e337e9664c87e781ea0 legacy-trunk
+35494 1ec3d6984b0f10877628e2da762a638a81893a2e legacy-trunk
+35495 b967627a2f4fe9c9ad54fbd0406b033278ea3037 legacy-trunk
+35496 ce68d7c0629cc381670eaba176afdee9e5c88fbe legacy-trunk
+35497 e8312402c813d8e8d308216befa999d86e473a3c legacy-trunk
+35498 c023501c38d783e9a340efb3a7c92061710a4cfe legacy-trunk
+35499 920ad4465aaea5a35415fbaf9fb79f932c7df20f ast-branch
+35500 d898232dcddbba805822fbd3cd01408377c816f4 legacy-trunk
+35501 ee0ba00b277cdd2385935c66aaf20f4d8c43ed74 legacy-trunk
+35502 6fcbf6ac699a89029689a178e0ace33c5225b0b9 legacy-trunk
+35503 57965b2db20c6dad9c9790628f3e69e77498039e legacy-trunk
+35504 07a2b4c5d50341772fbc2aee5e3c2886f8294132 ast-branch
+35505 dba8db412e354996b183850dc35e6842ab215e80 legacy-trunk
+35506 49ec0d8f08ecd3f705741e210bfffb10eee7a38c legacy-trunk
+35507 ae00d2d127d1d0a7d795e6b49ce2d9296e7f1c5d legacy-trunk
+35508 1f806cbe2ce0481c77eaa3583b88b27d3d431fd8 release23-branch
+35509 4eb458c3941d5e85e733506fe12d17e3b714119b legacy-trunk
+35510 3101c00f7547f01ece49ad4e2881aacb09e7a409 ast-branch
+35511 c061f25f74e0cdeba7f26ebf7053599eb9ab7ab0 legacy-trunk
+35512 907450e4bc6757da1a4a7bd88446cfa62afea6c0 legacy-trunk
+35513 3475e45684710958887ab834a6e7cf014daa7b23 legacy-trunk
+35514 8bf163d06d29af8aee9cfae757fcebfd2bb44edd legacy-trunk
+35515 7b6c8229799bae9bf1bbba6bc5585bccb69ad4a1 ast-branch
+35516 671adee6a3e3b11dd7eca2b4f86d3c9790cbe13d legacy-trunk
+35517 f54cdb01a1ad5df44f09ad1893313efd6fb9d1f3 ast-branch
+35518 14f8c933f88c099c006966118f7b9224a1e2a4f7 legacy-trunk
+35519 fe5541aae2d8f874f713cb76233781a9f4e6435c legacy-trunk
+35520 1d3e48ccad573a541c31e3d79bb42365a705772d legacy-trunk
+35521 45144cdb7794a4a65c97a363831b7d84403fe7dc release23-maint
+35522 ef180856df761918fd8bddf0cc7cf6057e814a4b legacy-trunk
+35523 c2b01aa490e147b5b73cbcb8cd3821663b8e428e legacy-trunk
+35524 2eb3175fc59b72f2ce9accce6fc88e8e8db7c297 legacy-trunk
+35525 8a714fecd059bdd837d87a6385f90d230f41e756 legacy-trunk
+35526 a5bd8b4f3e55f1329536618a50f6710e769abf08 ast-branch
+35527 555dc846226dd2861322569db694b9bb4ee0cc9f ast-branch
+35528 b39fdc9c807e65b32893743707a6d93475faf71f legacy-trunk
+35529 1407484836120b5334ff81d0012dcec73d9baae7 ast-branch
+35530 a737f7a0f2b8bada4d38f0b7821d168f70b270de legacy-trunk
+35531 16bf484b38649474831e60db6ccd5a3331785f24 legacy-trunk
+35532 3e49eb32470bb787aacd4cb6ad5e14414c5c0772 legacy-trunk
+35533 be5d2a07bc269badb14a7c7f46cb75056ee1b5a7 legacy-trunk
+35534 9536b297d83c2d78e8d631463879b04ad4271004 legacy-trunk
+35535 f4a4ac7331ec91e84d8fd4e9b663f85471e025fd legacy-trunk
+35536 6426b37bb2a0fda8232e7c6c1a4e06caee01b1be legacy-trunk
+35537 3473dea3aa4c0508777a679b38acc4343ef9c28e legacy-trunk
+35538 5e916d46a3fb6926203d2d1e195077fdfa8ed8b4 legacy-trunk
+35539 24e070e95bf8a1d15373e42d45e36e8efe857d44 legacy-trunk
+35540 75a91fd8b50cfb0681cd4e3f0248ffbe511d3192 legacy-trunk
+35541 12019251603392c303a84ad3d44393f2d491b9a5 legacy-trunk
+35542 9817dee5d9df085c42c1c6ac6800c4099bfcf8c7 legacy-trunk
+35543 7f464dd680aac08e4adbb7ea2cbf75a738d8f29f legacy-trunk
+35544 ef591e7c34fd8e09f55fdddaefef61e8b8b1eacc legacy-trunk
+35545 76053a1dd45244dc1aa8d36de2c78b93faf71a09 legacy-trunk
+35546 fb557ac5bb9a25b1455a99a03f500609006d299e release23-maint
+35547 9d84ced64d10c9ae68ee56ed4439f3b80b0f24ab release23-maint
+35548 164ce1bcab6e1e320fbaf01cad8a50d729fe9f30 release23-maint
+35549 33d48df9a93783454778acd9de4e06e5a25fc35b legacy-trunk
+35550 29be729b32c3fe941679addd7253f22d13de6cd0 legacy-trunk
+35551 cc47c1eaf80ab723909ef46ae3177a3521ea798a legacy-trunk
+35552 c4bae089bfc8f115ba93b54e58a44bcb2f3663f3 legacy-trunk
+35553 ec37cb1c0ed8887ce4c7bea1f9871926c7c28ef9 release23-maint
+35554 d448cc261f69f4b08275ec0de709ed0d2edf07be legacy-trunk
+35555 ce1e0b494ca7024c273889af326750d05a9926a7 legacy-trunk
+35556 6a15056133584bee358d6a3514701a4b72cf7e5a legacy-trunk
+35557 23e5cc34a9812e434cd0303cc7b8d88941ee9bf1 legacy-trunk
+35558 835b690d7ed3a5072d9e4f5b54f0144e115da985 legacy-trunk
+35559 dc5bd8422d526acbbd27ea3814262215d0f53d27 legacy-trunk
+35560 a4eaeed4098b4d8306620ab86fda46d974f8a1f6 legacy-trunk
+35561 fe94335f38e24974d1779b520360dd2b0ef037bf legacy-trunk
+35562 2024b4e6e38da8352591b9be16fa83df706c31b5 legacy-trunk
+35563 befb1ea6c88eb2bd8102bb19956503dc16887bc5 legacy-trunk
+35564 29da8bdfeb4e3192b3b9a595a47461e1439f4a11 legacy-trunk
+35565 858697db1e4bedc7ff08d6242a5142b0e132eafe legacy-trunk
+35566 52c172289add1a3a38710d24010bf821242626f6 legacy-trunk
+35567 4ce098f005f002f7c43bab0ffca62d9f6a734903 release23-maint
+35568 f1d44295ebf7d9e91558e7bc9d5508d1a65e534d legacy-trunk
+35569 bf37429f6d9f0513cb25f3f10ac930191099e8ce legacy-trunk
+35570 1c117dbb2def4f93a60b932b71579853e4e7189c legacy-trunk
+35571 846b3ee7e106f122f8d7e3c17867ab93c85400d4 legacy-trunk
+35572 c76606f372d134b97cbf75cd28c84065832bfd7f legacy-trunk
+35573 e6379bda91d7968ae2a960fb01aba299a133ce5e legacy-trunk
+35574 37dc8c80ca7ed921fe92831442bab84b284e6018 legacy-trunk
+35575 277b5a2f08f5c9f4091da20e2067a8fc151a27ce release23-maint
+35576 59fe09824363b0e4fabfca60ca4d05e5acefdb9d legacy-trunk
+35577 c051dc6ab374387ba261be6df15bafbc9b3482aa release23-maint
+35578 0261e38011f6de42a47695dc7d95d0343dc5cf83 legacy-trunk
+35579 cebda23aaadbc69133702b0a5131c010c3a53c2d legacy-trunk
+35580 078032444ecc89c30caeb46eaaf26b20364b453f legacy-trunk
+35581 bc6ec95f57923d7f94f45d05a16fa95f2de90d61 legacy-trunk
+35582 6c6910fd013a626551e84578fe88bcfaf611ef8d legacy-trunk
+35583 f98215daa35fc257054d05e1794898187879607b legacy-trunk
+35584 7a120400888aef6a827e2bac5be2685ee74349b0 legacy-trunk
+35585 1be5499f378e99700bb198bf695d31b96e28629d legacy-trunk
+35586 4db95872918eb9289f13c78b218c03919207d799 legacy-trunk
+35587 8184c677713fd61e0105509291729fc10ee053dc legacy-trunk
+35588 9a11a236154745df31a9a582110844e58636eb9a legacy-trunk
+35589 4b0930b56565fd20fe29d776514e52768ec554f9 legacy-trunk
+35590 75e2f758ec5a06b6da3a0df513371ad26f1f93c0 legacy-trunk
+35591 948996f699d2e292ad3d20ac315904ab4cfbc176 release23-maint
+35592 6b1858d12f8ca9ebb2e5f71814a75d80c2808e54 legacy-trunk
+35593 168dacfbee65aa7c9fcba151c7cfdfc01b26a564 legacy-trunk
+35594 8170aadc9eca74edf83e525db53a07aee9d2c84d release23-maint
+35595 b082b4d481c2562ddd31c3c82404b789389352c3 legacy-trunk
+35596 a4aa7d61e4af196ef60b409f86aeca1dd19a4ce0 legacy-trunk
+35597 a2e80fa7359b5500080d771c2bb972f82b99f7ca legacy-trunk
+35598 331de8b9d1ed55c45fba39ef57958a0748202c89 legacy-trunk
+35599 34d5eb1e507dc27af1b6c697e63d9d41e60f570c legacy-trunk
+35600 d0788391c13bcf230572b788f5fffb0ea14b99c6 ast-branch
+35601 aada91c5d6d9c7256cacb636ab7dcf342a43fac7 ast-branch
+35602 2290853ab40a62d79504582fe3324fc4a20bda23 release23-maint
+35603 5932469dcb35933277ceac759b1059d334fe878e legacy-trunk
+35604 3ef58884bdd521a16edb54c92acbe22eae215817 ast-branch
+35605 f4e5f9c2e2b3b90c7c930035ce4a3cd3891b25ee legacy-trunk
+35606 a76ad83a413f0e12150bd41374f82ef71f8b801f legacy-trunk
+35607 9b17f3cc23edcef6c24ba9444894a988d8a761ff legacy-trunk
+35608 e261e0c2c72d75fd3713fa84a1b38de3dc9e46a5 legacy-trunk
+35609 64e2f7ec5576b3a5842faf4579ae46aee169ca4b legacy-trunk
+35610 a910b822b12cb3fc4fce19637929578fe844cb87 legacy-trunk
+35611 739128c67c30ef8d987e79f61ce41efbcdd837ea legacy-trunk
+35612 433642f93d59dbad4c8a2fba4c1704dfe7643b4b legacy-trunk
+35613 e42cbaff8027d91faab9cdfb51b44f8667b6ac93 legacy-trunk
+35614 81117923ae8f0c45c1ea7e236b983809e6f3c559 legacy-trunk
+35615 677c0bf05735e8c1863fed24d9e105f3bf0d26c8 release23-maint
+35616 4c06f4faed877bab19b3cdb5794c6bddc924cd30 release23-maint
+35617 d20cb6357f5ea161b35a10424c425117a2e0bf3d legacy-trunk
+35618 b1ea2f3f467ef78562dfd76d181f8e6b0b981f4f legacy-trunk
+35619 faa714dd86d3f105d3a8c0bae2aa16bf0261f5b5 release23-maint
+35620 f4c1c3e627df8fe86631e2429cec11349801431f release23-maint
+35621 814cc9f83faab8de259e654cf8a3f9dd244461cb legacy-trunk
+35622 64cc163eeaf12135136d722a0ca5a7737e86e727 legacy-trunk
+35623 92552467145ea7d8f26b4897a02db2fe6c20565a legacy-trunk
+35624 c57cfa8328d43aa99ce6803434c53145687b8539 release23-maint
+35625 c4c7f0f39fe9b8371e8652cf12866542701f0795 release23-maint
+35626 8d382ab99bdba9e9d2eb5c676d41689c4cd35ad4 legacy-trunk
+35627 696f4ba9ddf7b16d4d9ea8a79e4a7095dc8c38cf legacy-trunk
+35628 adb42a71169604d3609ac2fbdb64cf8cd1c7250b legacy-trunk
+35629 2cfe14275a04408b63f0d6298e0dc7c83d8987ef release23-maint
+35630 3ad42b7d4660ac3c1952153276d573f4dca983f0 release23-maint
+35631 f8b28e4ac435a977894e0237a4ffded64a8a526d release23-maint
+35632 5f60b226019e9f3b413af0ef80fdbc2aa98aa14c legacy-trunk
+35633 8bcb121c54111bfba1736325d5255511b3eaf900 release23-maint
+35634 05989b4d6ce8157d6f252ebc24abb659e7893984 release23-maint
+35635 0d8ee28bf6f03ffccaa40fec28f5933ccbb9c6ab legacy-trunk
+35636 5765d656e0efd87d1cc278764678933ed9f32693 release23-maint
+35637 50128ff199658b14769ecac0c48efbbf8f8c1fbe legacy-trunk
+35638 d04d786ab4581379510dfa5f6cc962ac59e34fe1 legacy-trunk
+35639 dbd3fc214b666a3683a0cd9fe484c53c77ea8f66 legacy-trunk
+35640 0071d6eb80a1fa20939e868959715b0487aeb59c release23-maint
+35641 a40d79fe2a69e2afec537336961b8fc776e8d3b7 legacy-trunk
+35642 b4ec9299560d8089b240557d67f40617b56e2fb0 release23-maint
+35643 552044b5058d018d22d20743e6cbf1b1d739deb1 legacy-trunk
+35644 51aaceeaabe11eafe74d62cb3427c7b846f70b80 legacy-trunk
+35645 156037be355d98460766d0f03dad8baafcbbc3a5 release23-maint
+35646 5a36e4d5aa8f0d40585f45deb403ce908abe4fd6 release23-maint
+35647 c7f9fca946d16b704c23b6028536eb936fbdfd03 legacy-trunk
+35648 020dc5dfd5c5d88dd0f4572695dc4cfc8c4052ce legacy-trunk
+35649 9f5fe6b23e5920e579d3a6bacc3ddd01eba7d48f legacy-trunk
+35650 227cb7402c6e9bf67a00a0235754687201fe5ac4 legacy-trunk
+35651 c88d4610f283cb6d162b9583cf47ffd0d2e14cfc legacy-trunk
+35652 1fb2313ac3cee58fe7d3952e21a7b679e735242d legacy-trunk
+35653 c906bb2a1824551fc89fc14fc867e11f46df2b53 legacy-trunk
+35654 a2fb167841e838c26bd4779cfed9161c9e4ecc48 legacy-trunk
+35655 26ee1b3eb3451a70b47642cdf12edf4ffe849534 legacy-trunk
+35656 1a3a48cbb1628d4340abd5b2e83af61e1d7bfcd0 legacy-trunk
+35657 4c6fdeb8e2e0217f356bf1ae0ad94c5cf7436107 legacy-trunk
+35658 f35b4acc594f90a9f6298ba45d1815e2f575f379 legacy-trunk
+35659 69970653ecbfac94ce75815ecab2357b8c55e54e legacy-trunk
+35660 f9cd79926ff77881a213c9095c090b4d1b59c23f legacy-trunk
+35661 986594c3e4d9dc103462cec523cfd6134b267820 release23-maint
+35662 8c26420d1f2353a03cccbe336e72c8baab5905de release23-maint
+35663 7b817119bb660b531a3333b7bdc5626e9f8f0329 ast-branch
+35664 c681d95cf79ec50c5b859345fe0c11ff7bc5a6ba ast-branch
+35665 c370aae982321636db9cceadab52246d01b4ccce ast-branch
+35666 b4684234bf0701f08a749b1ad2c37c01635ca7c1 legacy-trunk
+35667 2e52c20dea4f61da8daf0a27ebda287680ea5ad4 legacy-trunk
+35668 dd93a32ac33eff3cb86d27679968504db04c2612 legacy-trunk
+35669 dfc8c5f66959582144dab6ed9cc16a52e9c3ca92 release23-maint
+35670 848bce2215d35b6dffa9d85fa12ca664762807a9 legacy-trunk
+35671 c70bb32227cb3bfe6a0e833fdbe97ff413e63f36 legacy-trunk
+35672 081972ae2f84421fd64a3206a4426644e690d479 legacy-trunk
+35673 241089e437e029e9ca0f20e39907cda08029eece legacy-trunk
+35674 310dd98ea064619cb9883d80e9c1cf0b6dcc411d legacy-trunk
+35675 c56ea60cb3bf7763d95b3df0c0a029c7911b3042 legacy-trunk
+35676 ca2fb5cf2fd575c729be1252a646835bbb3a630e legacy-trunk
+35677 2794f627ebaa0015f887438985d24aea0df97413 legacy-trunk
+35678 64fcff121f7b5dedc677e078f2c45cda45a76621 release23-maint
+35679 6e54c592853c64c77ea85e4606cd5d06cf0d35ce release23-maint
+35680 0265bf9912ea2910d5831e71fbb1de0b65313324 legacy-trunk
+35681 355473534c706810f67466809d23b08dc4693cfa legacy-trunk
+35682 c4888a8fcf7061b646a1f64e62102df14ef86306 legacy-trunk
+35683 e97518c66acc08156d72f37e759d3c6881fbf5dd legacy-trunk
+35684 8975defbf3a8b0ab4aef113d8f12b5d8805f5d71 legacy-trunk
+35685 e76092d4902cd44dcd6fc75135ba220f216b6119 legacy-trunk
+35686 f39c56f8ccc2be48645af9de40360b6fa56cd3b0 legacy-trunk
+35687 88d625d928acdba07e05ebcff3735975f2162d8d legacy-trunk
+35688 058821d8aefdc50cd47f9bdc7d337152f45e390c legacy-trunk
+35689 6b236994684af929c460013e621e8f423f2c7552 legacy-trunk
+35690 cec740f92fa42250035507967f6e1661e5de05ed ast-branch
+35691 b33ddb48b7e04e156d821e4ca511bb6197969f34 ast-branch
+35692 eb6f58c3d9725f050d3dafc04abeb1c6c620a4a5 ast-branch
+35693 16e753ff31b2268c855663bbb60f803a8fa76b0f ast-branch
+35694 4a543306dffa168f0c5a841fee646d5fd07db50b ast-branch
+35695 f7f413c654f4fc3b4e747677c485280b902f87c3 ast-branch
+35696 55ca97e7bd0fa36d07b12a7c825de386f4185e7a ast-branch
+35697 b242b4d7e177428b0350f42c22c6f0c03383271d ast-branch
+35698 e1140e601e72284e7d71affac08cc378ab8b8372 ast-branch
+35699 73486ff6b552f3887d8888667ea7794ac120f372 legacy-trunk
+35700 9df5185fc5cabe1a774c9f02e908be54d17ce86f release23-maint
+35701 a586f752b2bdccef5f2d1054e0791f312cf1f024 release23-maint
+35702 7038977cea8de61321ab69bfbc45bc4adedc6cbb legacy-trunk
+35703 08a391fde68daf375c86e8f3d8771556eb2220d0 release23-maint
+35704 56fed09d01f37ed4372eed82a81ec82d2fc4f07f release23-maint
+35705 4bc620f47fb42eee0f59db05ec89c82f059be656 legacy-trunk
+35706 81619dcbfae7b556466bc52eab8d6674824d141c legacy-trunk
+35707 3c796413f05e729de340364a02efcc9f331088ab legacy-trunk
+35708 39c36526d1b08223e58ceacbe4b69aa21de70929 legacy-trunk
+35709 d03b54e60a676b1f7d2ecddce41d2f26a6aee6e8 release23-maint
+35710 4db0c84f5c6a359acf9024b675082be973893dd2 legacy-trunk
+35711 3c618c6939e3342772e0a53ea71d48d42f8633d8 legacy-trunk
+35712 fbcbcda14b92ec323519ed3693b50fdb23793435 legacy-trunk
+35713 22a55028a78d3ea806539439db27e236b05170d5 release23-maint
+35714 5184d69c24dcb9c62107d44ad2ce4dd34a218b96 release23-maint
+35715 09800ba2a65348a33bcf107610072a646eac35f7 release23-maint
+35716 93917dd8a87c210cfc49d9ed81811909b7f64b55 legacy-trunk
+35717 608028f388c5c49c77778ec2ab3efd774a541088 release23-maint
+35718 886d66f51105c47369d7cb80733c390804b6bd58 release23-maint
+35719 f8c0ac5bef028cc15cecaa535ec3cd9f91355de8 legacy-trunk
+35720 63b68cb2b442f4e664ffa58d598697941ae24893 legacy-trunk
+35721 1f2934a318b781ba59f44192cddd270235c99325 legacy-trunk
+35722 10ba2416239110e8af7b0454d8090d39af2989b1 legacy-trunk
+35723 fdabb6808d52fbfa254b0e1821da62af7379992b release23-maint
+35724 01ea03e7b265f8b78f5978ebc90a8b439403a322 legacy-trunk
+35725 01e316489d67992243660d1d80e7bca3bf68b1eb release23-maint
+35726 66368118a19bc0358b3a91fdd8d29837c8377c07 ast-branch
+35727 f1fd1ae42136a023e4f347eabd59370edbe89250 ast-branch
+35728 c9214382665f4cf9b3bb7e6acef533d8de07bc69 ast-branch
+35729 06014f71f1636a9cf0454e73efa649069780c756 ast-branch
+35730 7673bff741228b83495dd751253ff161097dacac ast-branch
+35731 4c34ac9da93d4246597bdd1ce1baf8698f4f97da ast-branch
+35732 7c7a2981455ca8b3bcb75887230b14c7bb0911a1 ast-branch
+35733 ff5a31a71d9a6b0ecc558320f7374fbbc74da343 legacy-trunk
+35734 ff258c671d3ccd512d1a9229d299029046751a3d ast-branch
+35735 db8c45b9e8186ec2e52e37dfeff67b6fa4741982 legacy-trunk
+35736 9d1633e6c42eb9d38aaf5b9011dfeec1ecbcc89b legacy-trunk
+35737 059740d52ae5c4e8f3d9c4d2ee645fae06d720c9 legacy-trunk
+35738 320354b766e72d304dc30629da3bb334b70883ce legacy-trunk
+35739 126d815546d3379fb362acbe738259c749987c18 release23-maint
+35740 228ea75770e3de832a417d8f6147c4cd4d70fb6b legacy-trunk
+35741 30ea0b352fc02fdb2d31088aae07ea3ae23b6765 ast-branch
+35742 3b4403360775f04223332e1cef3339f2e4f6fd54 ast-branch
+35743 ab49e6fd7746500e0a2ad97da48b88fa203743ae ast-branch
+35744 20b5e9a6ef6b0a5a7abe2e1742e144cc6418c14a ast-branch
+35745 2822ed956309fe8d95df08e333b71757ab735df8 ast-branch
+35746 aab776d41b4f5184ac45dc5bdcdeb6a7678cedf3 ast-branch
+35747 b61e5f93ebe0a13340088f1ed68164b9bf7b8608 ast-branch
+35748 ce76a9d6e65308f004a2e7dc1c18f53dd0534d87 ast-branch
+35749 061108a89516f11f45a5d2fbd925a1d8bf1db314 ast-branch
+35750 2448f684ce9e9c4e9bf6ba7e2d3041fc077e8b1a ast-branch
+35751 4f0a1e7ad69ca159c7cfe2fd8c34a4563e0f95aa legacy-trunk
+35752 8f1ce7b0e423e329609c0a3ccb84c80e48f66b61 release23-maint
+35753 69c1ab6b2602141b0a7ca45a4136eb1f448af774 ast-branch
+35754 54ae9de38f0c2ddc0027d4a4a606d63160b34f5b ast-branch
+35755 020443a10c20258d38061b7f252798d573d485c7 ast-branch
+35756 bb255f855999e9f60e53fda7ec404568eb2c95eb ast-branch
+35757 182295381f147efd835952e6155b6c5840f76d5c ast-branch
+35758 5465a2cb0aea7e773a6dd586a608a7677e726e30 legacy-trunk
+35759 0c66761243089a43b984512468365dc8f155c96f ast-branch
+35760 765fe16f665b88d31dd349d394a2f0a9e278a800 legacy-trunk
+35761 4be8e010bdb9e9c02ce2b765770232af7b5899d8 ast-branch
+35762 200bf79c0159609d3c75bad56a4915d797dbbfcb ast-branch
+35763 56f9b31ac69fa40f92e563dc64419ad16bf31a68 ast-branch
+35764 340e49e01576647b7939fb508f3055871fca6602 ast-branch
+35765 0aecc07e35d9fc625ea588007280ef47bfc75b7a ast-branch
+35767 f950ef309d7512f5ecab4e80971f39b8438c5f95 legacy-trunk
+35768 3838cdee1a201b3c2e59bf2ab6c087a1414787b3 legacy-trunk
+35769 6167e78a17a826a838f544b9fcd8961e302acb7e legacy-trunk
+35770 0e9e0c5349a0deeb0e14b9ce9ea8ba2a394e72f3 legacy-trunk
+35771 90e0894aec5bed38d332c18e7493023f29d4085d release23-maint
+35772 583178518bd0cd307e81a6db61ad43886d731525 legacy-trunk
+35773 cfafaea93d9095dc4a9f7a75e96c445a754be184 release23-maint
+35774 ea9ee9b746729cb544ec4641136dc14ac432f0c4 legacy-trunk
+35775 f2cea16a1f382d4b9733d90f98203d01f45f8d18 legacy-trunk
+35776 47ed7bcdf08646b4cfbd93d32087a2ebf8eb2cf6 release23-maint
+35777 338577afdab6d8bd12238608f557d5b98992073e legacy-trunk
+35778 1ca3a62a009ad4c5dd3d4cbe268bca125b93b8af legacy-trunk
+35779 f9faf55717202d33c4ea82453e9fa80b56ba003f legacy-trunk
+35780 faa7eeb118cf47ada5e8bd9426056a300a680618 legacy-trunk
+35781 a48e608ba605fa1be7449389d8bcef9edd6c0b0e release23-maint
+35782 5ca103c37d5e0bdd80b6d64c5c74527a88d3c27e release23-maint
+35783 5ab812cd0db75622654805d726326573ff8adb95 legacy-trunk
+35784 ef34dec004cddf79c7825ab5167b4103a37041d6 legacy-trunk
+35785 204b7bcead4c98efbcee8e1766626e3d17819c85 legacy-trunk
+35786 3d046d063a84a9ba01341668892373389c8778c5 legacy-trunk
+35787 2276de891fe2ef4dcfdadcb16b6434fdc79577ca release23-maint
+35788 0c76a9e5c8382c3bd63a2a03fb9c16330d29c50d legacy-trunk
+35789 5c35b3ca5ba93d96a7b6a4e3852debb224b9c95f legacy-trunk
+35790 0e9fdb76ac855f9b3cbda907fc5d5cf4ad12937e legacy-trunk
+35791 51e1b6dcff61e922c73a7b59f0965d6c88ca9ce9 release23-maint
+35792 7a7499fbc4529966144a52ebc4ea6c1b821c36db release23-maint
+35793 6c12a3bad7d539af95decdab2717c948b3e236d1 legacy-trunk
+35794 630e4fbcdea265e7e802d3d4c33605706c5679b1 release23-maint
+35795 c5a552578344f5ca7f449deda73c65239eeae259 legacy-trunk
+35796 9b2b7d3b42f3a61dc90b66db1a2f7b6d9bdee58c legacy-trunk
+35797 687b0c8254faa45d29d68f21ac33895f104028b7 release23-maint
+35798 6667a1d8afb1048d0aea44cd3d90da0c69b78275 legacy-trunk
+35799 a46264b91a518f954eedcc1dcda251a14caaad37 legacy-trunk
+35800 b61fe828b73886f26fbfc7ec5fa7eed68d3dbae4 release23-maint
+35801 51a5fb60934d752375c27fbae2f9704719715868 legacy-trunk
+35802 222908dfbf58be980374530aacfd051fa655fafb legacy-trunk
+35803 8615f278da5f35681bf6b2e6b5a59f371ed09193 legacy-trunk
+35804 9f8bfd54251f7442899a1129a908ab061038978f legacy-trunk
+35805 8b2a429af42ff16415cf6a58af3174c1e50e7707 release23-maint
+35806 ab680c4acd35af813d02cec65749263ba6d21ab8 release23-maint
+35807 5eb7a8e2f34539816aba46607128e36d662e40c3 legacy-trunk
+35808 b9f09196526eab40048090fc88e3f60798603b61 release23-maint
+35809 cbbacda84480ae2bd85d1c6126be763c9f711899 legacy-trunk
+35810 a142e4e97f131a0d98f66f7b81200b4965ec0852 legacy-trunk
+35811 e8a31ab7a8748e61460fbae7462edfa7d52f73a2 release23-maint
+35812 4dee58315cc41fb04d7b5711e9edf7be898f8cb9 legacy-trunk
+35813 646cb0146942e1f57d03aba736d55c3bfa57a1f7 release23-maint
+35814 82bc69961022dc9cc9c2cbced33f8df2caff95cb legacy-trunk
+35815 f793a046ed981426ea2632d61007786106b6ffee legacy-trunk
+35816 ebfa5cd8cba4d23e5cc841b18f9779c84a65f553 legacy-trunk
+35817 26839f32e70d071bbfd0bf5b9c2b06b1ea30c69f release23-maint
+35818 64084f9baba1ec046cf8b9869b47b94dfae71ffa legacy-trunk
+35819 4eb574b1225faab7f4489a37e1441b2b62860c59 release23-maint
+35820 2cc7149774793416e07fb9d85beed4c6180a2078 legacy-trunk
+35821 984b289992c0693c35d7c1b4f290f5481e23c0df release23-maint
+35822 c249305bfcac8a54ec367e734c08c95b69ccf051 legacy-trunk
+35823 e4f52e2e38000b4645c517027e640d7b9200858b legacy-trunk
+35824 ec09a71849cc63adb26a6fb6156e07dd3740ad35 release23-maint
+35825 e2a0ef87d4d40dc44ddd48fc46c56ed0b212e14b legacy-trunk
+35826 14f7f9b89da9c5dd3fefc04064578f7b4b6216b7 release23-maint
+35827 6e078f7613ad7ac11c24f68658898ed7e0c091f6 legacy-trunk
+35828 42e2b5afa7157353cd726ee8b4cf5ff30654681e legacy-trunk
+35829 544f2172363d21f7e48629b6f48dbe991a674467 legacy-trunk
+35830 50708b8f0d28782f7169d1012924b84158618e16 release23-maint
+35831 a29bac0ae905b94abfaba01d014047a81c544296 release23-maint
+35832 26e090ccbb64c37d0b719bc224549f8c3e74c8a3 release23-maint
+35833 582dca02e60f657a90518638b9edef70f12eb56f legacy-trunk
+35834 2d7b0ca0c26c9603663791f128e3916b4121f7ce legacy-trunk
+35835 e90269fc19365b12ac75dfca7cd04ad036384f3e legacy-trunk
+35836 37121c8b691da08a0bfea5e3563b94d6154a1e6a legacy-trunk
+35837 98a80788835c0660e6bc4e855077e6b9b1481b4c legacy-trunk
+35838 4c82558b15fb3b6409f316267f8f23724222145e legacy-trunk
+35839 a1b374ff0184164a4985551094c507986b5b5a25 legacy-trunk
+35840 c13bb7f4bcd188a70e3bfff6ad99fc8ad91e5c66 legacy-trunk
+35841 635ef110658ef8d3c89750d58764b6f054af40b3 legacy-trunk
+35842 db6a6d391a998f52e325aa8e5a764d96650f41ea legacy-trunk
+35843 b5594d7279df69e35bd1a7e4456fb5bce9cc37e6 legacy-trunk
+35844 f4376f7674a222e86fe597523c95abccbbc4eed3 legacy-trunk
+35845 b9c658ac0e20cd6b6bf54d07fbcfd0d1971d83cf legacy-trunk
+35846 696d92eff022fe4f8598dff5a0a1b2f97a8667ab legacy-trunk
+35847 33f6a15dbf6cf01d8a37886533eea22de331c57f release23-maint
+35848 00eea28135f8fb71b1a800f69a3e0bc8536d111c release23-maint
+35849 383109433a97284f7041064c37c336bab8f2a2b0 release23-maint
+35850 ba31216e37c8f21a572c6bbc0e29ebc8ba3d4ae6 legacy-trunk
+35851 0b33e3737b4cbd7c3767e9d7c4d3e7b580d8407f legacy-trunk
+35852 dcbe042b892df5bba9f553b2a7766c5485a66630 release23-maint
+35853 22b0802aba7437f26ead6107dc055ddfe80863f2 legacy-trunk
+35854 91f76cf4073a2ae94e958a5bcc8e99c2aaa00b37 legacy-trunk
+35855 3586a7801bdaf36c485b645cdb668ef0728dfb68 legacy-trunk
+35856 c36ea07949201e751708bac40a87f09e32190740 legacy-trunk
+35857 d803afce8ac4e7f8f3a2ace1eb93f69c25328c45 release23-maint
+35858 136efbb1117debb3a04383b9981e8786659b293c legacy-trunk
+35859 955e206e53dc35e049c5ad504513a7547d967b69 legacy-trunk
+35860 6db48c5bdb27abeeb6c1f24d931e66832327ca70 release23-maint
+35861 50d8a27214e6f8538a1db2f3149f15d6e16a6688 legacy-trunk
+35862 66ede0387f3674284a36c4a0c4bfabbd6079143f release23-maint
+35863 9f6d45f3c023d5719fc6443f11070ad9ddaac5f2 legacy-trunk
+35864 c38a39d38489b1264b22a85ab7f067baa82fd591 legacy-trunk
+35865 5a22465fda24f9d6f9abdb0184201cc5eb694511 release23-maint
+35866 e85355cf175aae0851d1b0af383fb7ce60056f3a legacy-trunk
+35867 d09bafb9769f7e5c7830f13b8c14d01a8b206651 release23-maint
+35868 8fe1a2662aaa538800fcc89704564af1b3581feb release23-maint
+35869 c79cc0403acfef39d4b06df81968cafdf4bd47b7 legacy-trunk
+35870 c680080f900c16c6020836b3aee9d0f5bc29e236 legacy-trunk
+35871 e9bce837c1c38c9ddb5e690bb0d55dde6ef11078 release23-maint
+35872 8601c785c683dea22c58cc7848d387c42c53b802 release23-maint
+35873 cf392b936a2e4942220ae7dbced21ccd001829dd legacy-trunk
+35874 17bf95ed7562c98106a601ce093b3aa2285ed8b9 release23-maint
+35875 1538a8cfb0dda54a424f231e4c1d5144c941365b legacy-trunk
+35876 53abd9ad19098f93e577530c58d181678cc41e6b release23-maint
+35877 f63dd299a60b27359aa9c73361e20fafc8ae9d19 release23-maint
+35878 7afeb836f66c56fe76f091ae923cbc1f948df9ff legacy-trunk
+35879 a38cd63d17a74e4eb35a3377d7c1809d3f28135e release23-maint
+35880 6758b630acb7ef861448e0b151ce46fb301335b6 legacy-trunk
+35881 69433fc1c816cb22a16fe9631c7b51c91cf48dea legacy-trunk
+35882 469dcb0ad738bd4d02089bb78c54606f4de7f18f legacy-trunk
+35883 61b26b95eb33ecc474929063ccf1e287d61cf66f legacy-trunk
+35884 121aaa4ba92358fec1905e1e4dfb1fdd2dd37eee legacy-trunk
+35885 1c2381d797c0f758dac85f1bc98e7a24f854fd61 legacy-trunk
+35886 27da87c9318f5334d2f583933d7cb496ebaf4fd1 legacy-trunk
+35887 02f769d7e4a8e174d5784ef7e09ab6f18e1b2df3 legacy-trunk
+35888 24c46001416e1a052478a9ed2b049a105de408d9 release23-maint
+35889 b319db3869d822a622c2d9d4b81af7f695e9f39f legacy-trunk
+35890 630a0915a3101bec7a085441c1a2d6be3e2ca1ca release23-maint
+35891 c7010760e8ad19abfed0cec06d572095b1c45cfb legacy-trunk
+35892 ab0c8ddb2c92528f441a09e23ba607f0c7fde8bb legacy-trunk
+35893 d6589c88d23b7a5cc6843ee4750e25313ff762b7 legacy-trunk
+35894 318bf698e425b5ddd79035e49817f20a74ec6f67 release23-maint
+35895 606aae95f128922f8ef185f5a2ae40c2a9d90bde release23-maint
+35896 657fb2a50e8ed33704ef2d6e274fab6291d0a23d legacy-trunk
+35897 52e140ca146c5ece527b5219739bf9b384bcc804 release23-maint
+35898 45ba2c69c31fddb72cacb019b066cfbe92907ea7 release23-maint
+35899 5e17d0533ad364197e734b24bd38b8a5d8bdda66 release23-maint
+35900 02f89d12f036f6a8321dd2aff7be1f78a93dce61 release23-maint
+35901 20653c903d1cafda2d012a752e2f3285e267604b release23-maint
+35902 f78d938d7bb0804a76b8a04b6a96f6d9f9167c6d legacy-trunk
+35903 245835ed8de8df377383d1b865d9b3a93a5b57f6 legacy-trunk
+35904 7afb13c2d526f48373edbb936718b1b341338ce5 legacy-trunk
+35905 0593158d14f2d5d1253bc8bdf061f2ef658ceda1 release23-maint
+35906 ace3f13c1836f790ba6f52a67721cf932e0995b9 release23-maint
+35908 52fe93b656cf593d49966306e2f665750c847b62 legacy-trunk
+35909 a4b526b50c1220e91f884418f45201c9d549edb4 release23-maint
+35909 3639861d02646af1da3123c25560c4db3d7edbce release23-maint
+35911 ee7fcde5636ea170f808342449aab7b5063ceaa1 release23-maint
+35912 9fe45797c097f4388060fac1c3b79f04fc9f9d06 legacy-trunk
+35913 282dbd9b1ed6b7a692516395eaf7dbe2f0f70f18 release23-maint
+35914 6772391083c9b751e43cd4544bd7d8cebd6e48bf legacy-trunk
+35915 d6deae8bf79bb052abdb3aa1308332213bf23956 legacy-trunk
+35916 00949bc67e49bde8fbc1ea9f667e435280fd26d5 legacy-trunk
+35917 8bd32c51545e3df814b1435cebff9fda53ddb570 legacy-trunk
+35918 3edf8db6f8bfd9597fed1029009509e83b1dab65 legacy-trunk
+35919 9d5847b8f3011b6fb12e2512cd6726339b18e06c legacy-trunk
+35920 d3ca6bdcbf3c4637673e98748fac440b9daffbe8 release23-maint
+35921 16386cbcab99c1ac17bfb568bb97a80a6d78ab53 release23-maint
+35922 2d34585c3b9947e648dea38118a3178812920679 release23-maint
+35923 37538a36b6e2b2ac80ce0e4033d9e776b6c3fcf3 release23-maint
+35925 b5255552aa6da49fb63f83cafe4476ad3e14a373 legacy-trunk
+35926 96b62699b218f9df9dde0063e8812808a1887861 legacy-trunk
+35927 6672f73093da333c86c1f4a0fa9ee26b9bae8550 release23-maint
+35928 7e3a2c274b3683ff269960d6b3873a50c8401325 legacy-trunk
+35929 4a7f7e8016fc26b5d58435d36bf7b20390b5853f release23-maint
+35930 94b4845e4da8c4964e6a246ca5d879450ce812be legacy-trunk
+35931 300d5d462387215e2029e7fa27d69c84b5d12835 legacy-trunk
+35932 3ae01a11080122fa47c55ce1632b90f4a0239a03 release23-maint
+35933 fa753c16c6333bf3f992e43fc2ee5a753035a1a6 legacy-trunk
+35934 1d13574906efcc719c001aaba34b59daca186370 legacy-trunk
+35935 70023af2085ab50ec3239c84ff96529cf58fddaf legacy-trunk
+35936 84dfa9a67da146183231a097070720db4eac8bbb legacy-trunk
+35937 b6e4bf336db8a2477154a70d947891ee8d2870c9 legacy-trunk
+35938 29a59f662dd104912eee3e2a43ec05c32f035957 legacy-trunk
+35939 0da44ea099f568e1ee418cd52bf92227ecb340ac legacy-trunk
+35940 dd1e55deaf52f8db3b9b3343f92dd00d3f3d4111 legacy-trunk
+35941 c25a8c04de3e61509460f0c18ed5f93d4316f54b release23-maint
+35942 302d399cfd37eeb1b97dbbc819e661d3317832c1 legacy-trunk
+35943 95577b635bb4192822e34895697b99752b1a49a6 release23-maint
+35944 5f4f2f536f961ab200dfe732e4d28e8c420d1c80 legacy-trunk
+35945 d1a9874c09b694dac0bc87fb0ab065e1f69266af release23-maint
+35946 b9edd3418a31d91648d3eafa4e7caf46f2c2e14f legacy-trunk
+35947 b1664a80348adaf8ad1b0ef00ace7ea18a096eb6 legacy-trunk
+35948 bda066c96e4f1a238d3b1fbdfebca06173d3528a legacy-trunk
+35949 b5e40f5d000b6a730b0d105f0ed47405214995fa legacy-trunk
+35950 aff69f80f998254934fe950bdd9b65cd71a8322c legacy-trunk
+35951 b5a1e3673e5be159146c5150e93d4fca34da75d0 legacy-trunk
+35952 9e4d145bb5cc464144f6945d5135e01111ed52ba legacy-trunk
+35953 277d483f5968962db1dcba6ada84deaa92b97b49 legacy-trunk
+35954 b58d30f116e2a824ce376704aa73364332371722 legacy-trunk
+35955 31bdbec8f282c06b1f2b3d9bbe8d14857fd6b3e1 legacy-trunk
+35956 4e5b978e6b78036d11d6171fd65ca623aa3e5d9a legacy-trunk
+35957 c1cfc5e4834d193e75a250cb2dae9ffe6449cfcf legacy-trunk
+35958 e0803407e3774e73c156be99594cb7365735d41b legacy-trunk
+35959 c39527e28010fc1ef71b8712ffff15e7357c04f2 legacy-trunk
+35960 b056bbb4edf994db07b36646a8f6be349ece25d8 legacy-trunk
+35961 899a1f88cc5f242e8cc4c809e44f1a397391f51c legacy-trunk
+35962 304a37c2cb4257b6ed3e17bbd909fd32710e81ba legacy-trunk
+35963 aa23306a3f26996a1ea7c1939e9ae5f03a0e2499 release23-maint
+35964 ce3c2777b222ff59ab7c100d80661116a25998d0 release23-maint
+35965 37cac068f03fd46e01de9f86a78f05fd43019e86 release23-maint
+35966 59aa53458a93b624b0dd6c54c61f982b0cf9b0cb release23-maint
+35967 a104aa549a022a06e239b2187fedd70d878a71c3 release23-maint
+35968 5cb24db8fc95b359c6225ace91b0c262cd37434f legacy-trunk
+35969 baedf5ffb26b4d2b506351f270ef220815a97b29 legacy-trunk
+35970 092ac13a4c40a2fa2d11250715885c260913abb8 legacy-trunk
+35971 65f9ad9bc829dc8b58efeb855ea5479695e9f28b legacy-trunk
+35972 0afa81db4cb7d24ff2d99af93ed579275a8f90b1 release23-maint
+35973 266884b048bd127cd3940a0a9ff8def83c51312a release23-maint
+35973 a74f9081c6970878cabe151f969617587915400c release23-maint
+35975 8536598cf04d6369d35d1e6cd4d2c1e02801eceb legacy-trunk
+35976 efb84ed7377ddd6c395d4f0c0175f73535c74ab3 legacy-trunk
+35977 56a4ec066621da39040c27770ec01795f18cfa17 legacy-trunk
+35978 2862bf9ef913ef05b392398b277db561ea464558 legacy-trunk
+35979 679e5c8effae2112ca8a48376087be3eb1c6ea9c legacy-trunk
+35980 2c169ca5fa69b849ad3dfe4511b16fd1574a85fa legacy-trunk
+35981 aec9c98a47d2e9536624f87e2d8be1754bf4060e legacy-trunk
+35982 c65855c5d56b1d1471b6fdcdf29f95458f1fd222 legacy-trunk
+35983 e53162252fbe5378a50e6eea5a7287644748ca2e legacy-trunk
+35984 fad52ffd889243ba1d0c5a1da37469ce1cfe0d32 legacy-trunk
+35985 18d6a8f998238614ae8f586ff0a2612cc50fc47e legacy-trunk
+35986 44828cc136e0c0bd5df2e54cfe25107f021e9191 legacy-trunk
+35987 f9d54e9b30bc819f6531ee1d117b8381d5c5328d legacy-trunk
+35988 d087a95e803231902b28c10e0e20b4a2e73ddbf5 release23-maint
+35989 60ef1db10cefbb08211664b80c294d2750695666 legacy-trunk
+35990 f8ffa3e6c4f2dd8d0074374ea31a558f5d1c9d5e legacy-trunk
+35991 aca445a6beb791a7a532fa6a6f33074c91d46f93 legacy-trunk
+35992 97b908a9971a64f0d1cb13d1eeef70d18895c239 legacy-trunk
+35993 747b2dc8244fea31db391797d69a66a1886dc969 legacy-trunk
+35994 c79befb3c314d5f5ae1c27da6328138a6252d6e2 release23-maint
+35995 e2b81f2c8a70da25e79a230134938f04807b4856 release23-maint
+35996 8ee5a56b80312bcca2d5bf1b344a72542fd6be59 legacy-trunk
+35997 eba6baeea4eaaf89b98a82e1704b79194521fd34 legacy-trunk
+35998 d361c135fa74e8d8ff530d5baf480b649980bd25 legacy-trunk
+35999 041f89c98c35bee901e38fc4e06cb06b6f7751d2 legacy-trunk
+36000 275a77f9a50066434145cdd8eb7f9cdaf5626bbf legacy-trunk
+36001 59bb3b1d6059d3260384d54ca5664bdceea3eb17 legacy-trunk
+36002 f3d0568c9432f0baae8f4c1e56a8c920ad7b5f60 release23-maint
+36003 22662589c4e20989c2f00d583fbbafd2d3ab4217 legacy-trunk
+36004 a799b0d1c5687e8699d67ffde384f43b3dba5ebf legacy-trunk
+36005 f159b15f1f5cbafef899fc5b43d1c8df1399ec5f release23-maint
+36006 7c461aee741bea1b656c9f159235c5841d8b4093 legacy-trunk
+36007 aa39fac2a9fdf9fa7a0e4f8c13f0ab36b0428f36 release23-maint
+36008 df9bd127730adc9e82b678cba926803e02cee5b3 legacy-trunk
+36009 730a03f5d8b4de2d204df7141bca654dcf31e88f release23-maint
+36010 c7d9be73c7ddb335a85f493998ab0bbda3ecf312 legacy-trunk
+36011 185f5d6a3a88a9a13a57fb223c2ac55a8e448b07 legacy-trunk
+36012 03c895839979c3dcfa312fd295ff024d9775ce14 release23-maint
+36013 ab5c08257ad7b4e779c5d22a548c6c9401cfbbd5 legacy-trunk
+36014 b3c981ee9ae95581fa6602e4f63fd03df363d751 release23-maint
+36015 d3aad377a5a90d9ff0ba8c135a90431a4e2a4bbb legacy-trunk
+36016 88071d208b34aa4ec432bda43e20df0c53f4376d legacy-trunk
+36017 ab519de176bb948f455c9102ed00f17dd7d7067f legacy-trunk
+36018 3a84e23b042f45e05c78c832b6ae2bdd54d0dd5a legacy-trunk
+36019 6f265f2ccb33cab7e3f33e271644bade61364c92 legacy-trunk
+36020 6822026d3c3b419a8bdd1376761970a6d08a1091 legacy-trunk
+36021 22fdae7bba1af7051122f93cbacc472eecaa9936 legacy-trunk
+36022 e621e2a1ab3102d3d7320210cc4490b57bc1c1ad legacy-trunk
+36023 e5b047765285b37285b735688114380ec83467e6 legacy-trunk
+36024 abd4b79551d2ea91fa9ba918f14b6b7aaf2d1d20 legacy-trunk
+36025 9a3901bf6222f9919c206a6c997e782e5c2016c4 legacy-trunk
+36026 6ffdda4cc22215bc36ba1f8b8afa14b06015de7a legacy-trunk
+36027 5d942bedd28f93b6b3b229f0cf1d1d675b5465ff legacy-trunk
+36028 b9d3aa3cde8a5c1a4037bc263b2ee67cee87360c release23-maint
+36029 3771ea9a93aada72ed009e4f6da92f61be33b099 release23-maint
+36030 84e8fe912440d4b1b974bf44bbf7566539744f0a release23-maint
+36031 eb41a489cc2f78d1d41227cfdfa19e2cee1a9cd6 legacy-trunk
+36032 01057e4f0a62d0d1fede6c2ec29cf0149f8e7c91 legacy-trunk
+36033 eb0f87268d70ae1b2876603672af29119c56ca48 legacy-trunk
+36034 70dee2b193f7d531165645ad6dcf49ce260aab3e legacy-trunk
+36035 6478eb6ae3c01e84691d954a94119cd21b6fe474 legacy-trunk
+36036 b00b26cbc303afe1a1f72ab693f2c49b10eacaef release23-maint
+36037 c086366479b1e00b6d10eec1fe58891c185622f8 legacy-trunk
+36038 91eae1e925781b54c235d2d341d453978c2090f2 legacy-trunk
+36039 fdf75eef6a5c33a8ff2ac7baaf4eb04e3652b090 legacy-trunk
+36040 2cc7ff42b9a3d116283969fd6c50e2fa58f125b6 legacy-trunk
+36041 3c2158876194a1acca2c2d626d95dda7d159a4d4 release23-maint
+36042 ed228e8a139fb90897cb1f9d78d37b7996db39f5 legacy-trunk
+36043 efca51ef789daf5a4ca0dfef415c3495b2970e35 legacy-trunk
+36044 b1087e1d447963aceb9973146e87acac20de7d97 release23-maint
+36045 ff68d6a5a441f6bd2f5953357c433795f0235352 legacy-trunk
+36046 1954b7edbfe700036eb6f543f1d137a1bcc818b9 legacy-trunk
+36047 99424604d36a377d291dd117987b866e4a95230a legacy-trunk
+36048 b791f6554d28f2eeacd2d1f03d506ec9ee9c3c8b legacy-trunk
+36049 3bfe2f42b8f9383d605afa54ea85bee98f7f3724 release23-maint
+36050 27967fbba48f31d4a8254b8600021dfaf674e7da legacy-trunk
+36051 6fc8827c403c163418b0eb4883c3221e98c9c17f release23-maint
+36052 525abc66bcc28c0fb9432c9be8b34797f4a648b2 legacy-trunk
+36053 09012c6b206805c3f35c4798d9acff406c5abf1f legacy-trunk
+36054 ed3746dad705a2b966e53baeb1a756cff1d87b41 legacy-trunk
+36055 6c28ad8047f2dfba918ee3e4c5ee472eadbbbb3b release23-maint
+36056 8c407906170858c5e75adb955d1bcb61405e94f6 legacy-trunk
+36057 d244b53ecfbebe0c5e6e70ecb9d3b97780ac0537 release23-maint
+36058 9689da001197fa9eee8b4bc5d97d11a196c1be42 legacy-trunk
+36059 e8b4f54f7d19ec67688b802047ff704774d67204 legacy-trunk
+36060 300db81e2e4acbec221ca3c380108d97e1ac31f8 legacy-trunk
+36061 a6e04847280a26dea5e698943e84f98bb89f8693 legacy-trunk
+36062 b9345c355f04b7197734e30e926f116e49e72063 legacy-trunk
+36063 0bdb49a5a8fa633652c4094db8b43730120cda5e legacy-trunk
+36064 694528e85a04d1fba63e5eff6aa1e3f5b3576343 legacy-trunk
+36065 c8a22b5cf58a58baa2a6854972542e4dfc647208 legacy-trunk
+36066 3d6424c038882ed5962e216a812bcdf041a5b27c release23-maint
+36067 70cfe065eac592646a2aebba325b3dc2286093c4 legacy-trunk
+36068 a98f50e50befa1e52b05301efd34a83c7d2ff797 legacy-trunk
+36069 df4943d24cb6ddde4772066ccf38bbfc908aa1d5 legacy-trunk
+36070 7409c0c370e213258df83c65d0ad89efc2698632 legacy-trunk
+36071 efca353e7fd675f71178ad8c116ad2f9818c79a6 release23-maint
+36072 29f87932c7c78bca367bb757a9545a5943bb76ce release23-maint
+36073 a72bc425733651eb61495ee35ecf24b2ff7bc8e0 legacy-trunk
+36074 ec6f9a190831931cfadd5573964d8381009d45da legacy-trunk
+36075 10a01ce3ea0ae01dc355f27efe11cfb2927671a7 release23-maint
+36076 3634418a858e8273b4a00af759fd38a392457c7d legacy-trunk
+36077 2f5f38f4bc2b90089b956739af186d109c5168d1 legacy-trunk
+36078 8c0394aec6dcd40fdc3e813aa8aef055d665c4b7 legacy-trunk
+36079 3dfe81ac0e7cd0df4e233fbd14b1a6bb7c39cbb6 legacy-trunk
+36080 a80ee2004e6ca492b0b9a2ee8e4c939497d09652 legacy-trunk
+36081 cdad005bc030775fef7bac673c392d6569436ce8 legacy-trunk
+36082 cb957e65f4449b8698b4940dedb6a6207b0e4c22 release23-maint
+36083 36798f1c8e9a1a66fdd77805ef976c1a148830f8 legacy-trunk
+36084 b9c9e7e8be7d54fb81a2195ba88075f52ce25732 legacy-trunk
+36085 ac4d420cc799e5d266a7f46a7df5a75d7372fa82 release23-maint
+36086 bdf2387989499edf067496d90ce0fdcc80006a01 legacy-trunk
+36087 a89cc535b4c5755aac86bb1ea4750a4d44cf0dde legacy-trunk
+36088 eeaa7fb2f16f7a0ed3fa32bedf41a33dba0b2d7f release23-maint
+36089 8e5958c93c88215d458792a6af58e2a83efd4301 legacy-trunk
+36090 8eab7655601fed121000dc0ec44afc60babb1224 legacy-trunk
+36091 42bb1dcdf16e41bd332e01d0726df36357d59c15 release23-maint
+36092 47d64cb018205ebed41bc9a2c5f23ea96082ae7c legacy-trunk
+36093 014b0d84422f7b631e003f279d040389e3cf6bee legacy-trunk
+36094 95287cddbc1eca56c96ce78001b2d998e7732a14 legacy-trunk
+36095 61af47213fe6674c836267198da6fe434c2c0353 legacy-trunk
+36096 1eeaa5093fc0411160402a7d00b41540b51e4d88 legacy-trunk
+36097 adb59d89b099160563a4873dd95ca959b05f1626 release23-maint
+36098 7e7273c8d21eb7b6773736da03bdbd49705bafe3 release23-maint
+36099 c2bc248d3e9c70b565bf630d2868948951ceb363 legacy-trunk
+36100 c0d1261da848d61edc71dd886ad6f86b2c526514 legacy-trunk
+36101 cbfa042855290a2381c101cfb2fbb2d12360df1d legacy-trunk
+36102 b60fc5eff15594d77504d0fe30d739ecc5ab6f19 legacy-trunk
+36103 fd52b68079248cb19907839e612877db3b0509ec legacy-trunk
+36104 6dbfee2ded8956e6f79563fed9ba655394f0ef86 legacy-trunk
+36105 94b841adf485bc98aae8da4f44d6ee3f986c7eba legacy-trunk
+36106 91388c845b1695fe4630b65382564a5307a817bc legacy-trunk
+36107 882cf11372a3e4bde466453e6595d14a16f38561 release23-maint
+36108 854a2417d35eb518adaec66e5104e44fdd4cb7d8 legacy-trunk
+36109 a018ae386f99e1a49d174c15f63bd1cc3868c8da legacy-trunk
+36110 5c79b4f13b26f82900da9ef183674f69ffece577 legacy-trunk
+36111 71b3d2bbe63bfa78547692bfe78d89dea839e25b legacy-trunk
+36112 40c524c1c0fefea67eddfe8e4d57d43da0aa6608 legacy-trunk
+36113 e1345ce275f79d83472885ebfa239ad355b4264b legacy-trunk
+36114 6d7d00bf1aae596ef6695ab2051fd2c748d7ccbe release23-maint
+36115 82fe6832e505deb24a77b4ea45bab7ded24ded2b legacy-trunk
+36116 8acf4241ee94f5cc11f2bf660def7d6c6d572c51 legacy-trunk
+36117 aa0c84d1f0677868fc7bd5dd195f26c295936047 release23-maint
+36118 cf84dbc6a881c7b31c27b6217990b3074007af04 legacy-trunk
+36119 29d761c5103e77b5112bb80f8de1b37981d29ae1 legacy-trunk
+36120 92f597a055815ee3eaec3a39e24429f2669d8076 release23-maint
+36121 c84fd6be5a14f44361adfa4d0c03b32258d1b04f legacy-trunk
+36122 41c59d80bbc5f6fbcbb2c2b38bc6ca5ba7c2727a legacy-trunk
+36123 e196b823e6c5bad1faaaea087c99bf8ef3fc138a legacy-trunk
+36124 a0d8b14568193166c86a4b36d7863963b604968a legacy-trunk
+36125 16acc61d33c02d6cc861e637210b3092e6bb5fc4 legacy-trunk
+36126 13656d58d450140594cf7da78958db0869b12fe0 legacy-trunk
+36127 cedc95459636d532d75e051aee041e5910ea4f1d legacy-trunk
+36128 ec88f278a1ad49909e886b161ff0bc8d76588a36 legacy-trunk
+36129 32197375128e226588c232d27ff5f42ce9d65618 legacy-trunk
+36130 fc6a73905e6f38c9d47a29ea15858318c7e6fece legacy-trunk
+36131 1918887d387b0104e3f3c3b3a79356e94975a95c release23-maint
+36132 bcd21abaa5b4f15b878b1297c217202a7e94ad24 release23-maint
+36133 4301ecbeb3adfa4136c09834c8f41734bcfd7163 release23-maint
+36134 fc4762ebbe2cf673472d6ba9afd405b42b5377f3 release23-maint
+36135 439e71a4e5546854c54cf89cb5d3aa2c75eab850 legacy-trunk
+36136 49e7413cd91c0e588639f26ce485587025ec3e0a legacy-trunk
+36137 9e5af45cefcb5f412ac1697fc0148c4207d880c3 legacy-trunk
+36138 d69c8068eae61ced8e714c503a77414d00944b11 legacy-trunk
+36139 418a0c6bdc7d4a0edfa42d3b3cfda95b989d2567 legacy-trunk
+36140 b9de6b6652736d6015cb78ac740018adde7758ff legacy-trunk
+36141 87302ac072552435192a48b0bf5ee3745fb94562 legacy-trunk
+36142 b0f454f558e5eb2fa6dc6f0841f4509b5c5126db legacy-trunk
+36143 50f3a550b4fe6aef33fd2a77cc00e573ef9994ab legacy-trunk
+36144 c1fbbc3eed39e5fec669735fb9f3e20f2f3c48dd legacy-trunk
+36145 b054cff7bb86d6f127c06e3408d520ccc2886c8e release23-maint
+36146 cf28f4a6e67618a5a77fcf3f8c5c523dfa65169b legacy-trunk
+36147 7a198d9c92612d2443563d5d31bf5523abdeb95f legacy-trunk
+36148 3152b747a2e4611b33fff25bd5165bbaed17e741 legacy-trunk
+36149 f49471953689a3bf8b4f646e8514344d5fa63409 legacy-trunk
+36150 6fead5ea4bba237262f0b084e1f6faa1e0c8672c legacy-trunk
+36151 541327cb8f8bf6b557154c28a237425d2cd2ca8b legacy-trunk
+36152 2253a8c2ea62dc5d3ffe576e8176ede60ebcb85a legacy-trunk
+36153 f0eb7778a183083f0feda8ff326cc615978c6503 legacy-trunk
+36154 63e9e5a2160b5dc9bbafb98374a016d484470c54 legacy-trunk
+36155 444fa5d50c14d20e0a8e2bd7a6e54120c611c703 release23-maint
+36156 c7dcb09745d35b49bbeab9157abb6dd540cbc644 legacy-trunk
+36157 6e4fe5560d81d48ac41c3b0c8bd291a8ca01e440 legacy-trunk
+36158 bc9ae44b2ce41fc3db5f922ef293ba363f3c17e6 legacy-trunk
+36159 a627d9493149533999d1f45e3ababca14b941e05 legacy-trunk
+36160 408a40e65247cd0a772e4f993b5567e2fd9841ef legacy-trunk
+36161 c7da6990c4ed9b887e3479c33cb6df2637c2a78a legacy-trunk
+36162 5d27269c9e33c6a28d833fd6bb1f0647f375b6b6 legacy-trunk
+36163 c9db793caa80a254948da79ad615b05c8e8131ec legacy-trunk
+36164 54b257e55f99150155948dd3dffbd41f5810cc46 legacy-trunk
+36165 748129e6e1082f33df1e78a5cb61f18c1383cf7f legacy-trunk
+36166 8b2df9a07cd704dd6ff6c7959de79d196e98869c legacy-trunk
+36167 0413005fc0b2ccbb1bce89867198814f862c2d5c legacy-trunk
+36168 e950bfe1856e20f4271030291db590aa9674d27b legacy-trunk
+36169 9d8655b475db48d048c3f1a9e6ab2b208d8abd0f legacy-trunk
+36170 44e8e84f12808252d4e9a51466f29c3a740c6eab legacy-trunk
+36171 11c31a98dfd690a85945b97fde68023b0c94f529 legacy-trunk
+36172 13ce447845bcbd47bfebed8bd6e00abe279577a4 legacy-trunk
+36173 348db77a07e918c8c56b8f5b1707ea9a859084d5 legacy-trunk
+36174 40acb68ad224773b9f857ba20a6c7ad23efdd87d legacy-trunk
+36175 581a8a128e11ca15369a1d17621b5005e929b238 legacy-trunk
+36176 12f24cb27383c971b7c0267f15b4112e7005d5c2 legacy-trunk
+36177 61180c31d4bdb3eaa5055dd415e38e6ac311b23e legacy-trunk
+36178 a46bde9e0c74bb761dce68454798e226839b5a3e legacy-trunk
+36179 6ab5e0526a32abd40173e453794a38e34aad0a44 legacy-trunk
+36180 e5bc947c44caebc029174bc8e2c8cf071b1e3989 legacy-trunk
+36181 86f5962fd9b7ec6cb78402fa76074390b69c0d30 legacy-trunk
+36182 55ba51bef0a81a04294ee2e260a00f1703d743b6 legacy-trunk
+36183 a7d6fc17f257552762945bc250edfb8728bc093c legacy-trunk
+36184 b8fce2258c2006a339bd2a9372c2f1bad3b66c8b legacy-trunk
+36185 f4a4810f982ed5e854ac63ed5625203e54f54e4d legacy-trunk
+36186 331e5d8b296f76a3dda891f2e5aa1db74266c0fe legacy-trunk
+36187 509072c3fa26b92a251e5f547b3b02930d2bf0fa legacy-trunk
+36188 1fd3aa4bc123ad1319e97834b74648f3a061ca81 legacy-trunk
+36189 b99a552738bfae379323a288d79c9561527b5fac release23-maint
+36190 391173c68bb3c9077dfcab2aa646bf6d9c8e856b legacy-trunk
+36191 963d23557020f2229951431ca58b60e820714238 legacy-trunk
+36192 11982da98792c4767f14eccf66103f517601fb50 legacy-trunk
+36193 e43da4f99941567c3ab9050cd879dcf30f039e24 legacy-trunk
+36194 0af41543c9b65f71f0dac87856ea953be8acfaa4 legacy-trunk
+36195 f539a9b94f79457444cb9bd1dcbdd2dbb2b59970 legacy-trunk
+36196 6384078e7edf976bef3b14a9fa7355abbc1fc496 legacy-trunk
+36197 434d3f2cb832828e1eabfc18f12a6830011896e6 legacy-trunk
+36198 f73a63dd328856766ea126c1533d6582efe0925d legacy-trunk
+36199 a9a4b0df512ad4f94da7fdb66db604ae69879dfc legacy-trunk
+36200 5bfc7543d7efa0fd00e356e09b874c8a57ec9dfc legacy-trunk
+36201 c6ab0f88895a5c58ea50636b0e12eb838e2d96a8 legacy-trunk
+36202 763277378114c3d05afea452f9ba79f80e4ff3f6 release23-maint
+36203 cde2feab7fe0ab70d21c8b515530ae6c5d758f05 legacy-trunk
+36204 27e712c8e1a3649e55a7c7669de4b800777f7f90 legacy-trunk
+36205 ec64a6be32f717dbde7f322e873e189ccd3e3297 legacy-trunk
+36206 d0a6ceb846464706d63ae01e5262954f0320a50c legacy-trunk
+36207 686e5d38be421abcd828578a542735ebf24574ff legacy-trunk
+36208 0819508aae3ac3e15c765967a2d883f2c84297c7 release23-maint
+36209 5cf507b64f31a0d023dcc13cda23f8c22ec67384 legacy-trunk
+36210 f9569526e8d40d1b1680c6066874cdfe1b17fa2e legacy-trunk
+36211 4c71bcfacde2f2a3e3812c16df04ecbc853860b4 legacy-trunk
+36212 6fc02915f637b0244d20a645c1cf6bd9f861f755 legacy-trunk
+36213 98e4632721200b080777ddb68866382ced60f2dc release23-maint
+36214 e5df8c8faa099bd324ab9f1343e0b1758cfe4648 legacy-trunk
+36215 1d584ca56b30495f13916668f96ea01c3675f37d legacy-trunk
+36216 6bc6abba8659eaa49a28c82bd25ba8538b7017b9 legacy-trunk
+36217 2f76e72ad190cb59394ab1ae5b760a20132850ac legacy-trunk
+36218 75861d8c58715a2dbf04e4b18afb15c2401a61e3 legacy-trunk
+36219 014d87c732102a7f11668188d1dc37d66cf0dd8f legacy-trunk
+36220 472023d0a10d64287e26b9cd6125a2624d73e540 legacy-trunk
+36221 6ce67f7b0430a8fedc90906fb14618c6b1d5db1c legacy-trunk
+36222 cd47f6221d8d1f5618260e8c8b659101aea01bea legacy-trunk
+36223 1c2baae14828239779c69273cb0b60e6176832ad legacy-trunk
+36224 8ccd8ec63cc20c2b4a20f9890cb23f9686a69304 legacy-trunk
+36225 75e5d1e8b6171a2a9f7d2a6de8cc7d7a08cdcfb7 legacy-trunk
+36226 7b6ed35c5850e6f57005e9973447ac1ffacfced8 legacy-trunk
+36226 d99b5bed007884b25f1276e2bafb9ad061f2a959 release23-maint
+36227 aaf9295ed45b006ec70ca1dc23f95694eaf7f696 legacy-trunk
+36228 e0a7c461311b3dcaf6fa356ca8dea134114854f1 legacy-trunk
+36229 77913be294b9211467b45837edafc2beea261a6e legacy-trunk
+36230 8444849c9448edeab644df544d6ac3ab33527910 legacy-trunk
+36231 8101e8d24f0528c411300a645736d57b70e3bef4 release23-maint
+36232 393c15c0c5a48f65eb4a1ce4563749efe0917d18 legacy-trunk
+36233 d7110bb6c13dc439f4af3ee2e6abf9b19e2492d2 legacy-trunk
+36234 fcfb2d4220b0e573e327ed85730d0b689371bf09 legacy-trunk
+36235 b1e71b392799aa5714d47e06806f566bb8c26e25 legacy-trunk
+36236 950cf69c69b61dc3e7fb3d6cb5eeaf00617d6cc7 legacy-trunk
+36237 27e22f6bd3ae772fea4fe79241b7cdaa291c2aa4 legacy-trunk
+36238 255a71f2d215a8f70c1d5db7a79fa2b7c0fdd990 legacy-trunk
+36239 84e5b585d201b884a95fc0a4b2a9d20ebe5db03c legacy-trunk
+36240 a4bc2ffd8e716a914784e7d1d8c53aa7a6ca24b2 legacy-trunk
+36241 485d2ef43419d1900170aebbea9d6b682c5cb917 legacy-trunk
+36242 3df36e2e5ddc1149af8eb52e20bc225d806236d4 legacy-trunk
+36243 64534fb3afcd9400bc30cf7421fef83e3928dc31 legacy-trunk
+36244 3ddc7a23176b62831d40a8364f5fb772fb4face8 legacy-trunk
+36245 e371183d0e190ce7e0e724bf1ad58874ef059178 legacy-trunk
+36246 f8d61ed2f0d3a0e1836e764a6159c5c253858adc legacy-trunk
+36247 915b0e833b5bfd2ba25f5392ea5a42a666d4db3d legacy-trunk
+36248 1c69f909c5a61378da27f0261e42bb0137469bf9 legacy-trunk
+36249 d8abf582f89306eae73e43f1ac4339bf9ddf5772 legacy-trunk
+36250 48ca27ada81e65fd755d09ae276c4a502f3d59f1 legacy-trunk
+36251 c7d2b24eeff99d606518dab29a67639019415aa0 legacy-trunk
+36252 20adb7ce1b085f421b2e3ecb69394a3b248ac268 legacy-trunk
+36253 da7c3c61d40e0050fb0adab0eee423ecad8b2338 legacy-trunk
+36254 5ec78e2dc4bec96ede78238b56957de1ec03d448 legacy-trunk
+36255 ff6b97cdd864f4f50bfcd31decb0fe03cd523b12 legacy-trunk
+36256 3a7e34dc6ae26de8b1fd8a1fcaa6ff3453efa99c release23-maint
+36257 f47ce2304cbb2359031524a8b75f7a8a771a42c7 legacy-trunk
+36258 38f883403e9f8cb77af24e90d44a51eb3f634c7d legacy-trunk
+36259 7333be092eec0ce935d8407205b17655955c2276 legacy-trunk
+36260 ee38896e0d24173e05dbabb0c575cc8b671bc4c4 legacy-trunk
+36261 53f274f02f698059dcf3aa80fe260d1d98373a06 legacy-trunk
+36262 1edc0687213fe3fdc41835b69df4ff5b0ac816fa legacy-trunk
+36263 b18f480c37a076813cde26f196fcfc9d41ea20e3 legacy-trunk
+36264 c56168fabf8e33ed9b29ebc741e06362cbc2d33f legacy-trunk
+36265 5adca58149ff49df05e73cd1adbf45f3fa35f4da legacy-trunk
+36266 464c808d0dcda38bb82a06e2f6b93db2b5666ad8 legacy-trunk
+36267 7db4c586e1d6ce27f67784e7b15691c89f4e0ca6 legacy-trunk
+36268 256b496af4c4a075d66f8c14c2f42db410678d70 legacy-trunk
+36269 bb00e12e774160577a9f2ee8d0529cba2befb163 legacy-trunk
+36270 0e28fd6fea00c2bfc32c19b034b0511383776291 legacy-trunk
+36271 d2c1c7ae7cf432365bceca7128b41859bca71e18 legacy-trunk
+36272 67fbc23dcfdd4b926ff2249fffb418260fe3c671 legacy-trunk
+36273 0f56ead968176552b98079bc1d5a5d4da52c1826 legacy-trunk
+36274 73154ab8563a5c116056f81bb1e7ffa1a125411b legacy-trunk
+36275 d500f72fb1acf1b938c72e4926cafcfbeddbf5d3 legacy-trunk
+36276 50068b17f41eaa1ab4fc9988d9abd4fc9d41635f legacy-trunk
+36277 6c16612fb118381580dafa10f1e0f063580ef1d1 legacy-trunk
+36278 b73ab309ada7fb2b7a4f1e37b9c68fff9ef9a86b legacy-trunk
+36279 6b1ea5c07ff73eec5dbd360c44bf820af40c40ae legacy-trunk
+36280 c423e018a29e03ef2766a7934e9805e6b3372cb4 legacy-trunk
+36281 e3f82df54c88e0835bcb7ccdd48e46e7f91d1176 legacy-trunk
+36282 1b9da5fe905394bea2f517c5dd5c6d51062a80da legacy-trunk
+36283 d4a59230e93a96a71ab57d29e731422bf0884293 legacy-trunk
+36284 757ab200d47a6ba7df0df0644c09a982c4a3368d release23-maint
+36285 b5743e447309120ccc1f0aef244408bf99e65dfb legacy-trunk
+36286 3c5036b3e8e675b38879b220b2bc13757f96dd97 release23-maint
+36287 df13ffb8f498637ed06aa34ad24a477c47f2dbfe release23-maint
+36288 18916ce41c260f2be1a8c23ffb0490934aa48a13 release23-maint
+36289 b8710e6d8d780df97cb3db1f30a3d54b3f23bfe9 legacy-trunk
+36290 05f12bc1e5b302235deb8be0066f3ccdb07a3195 legacy-trunk
+36291 2ffcd836817eabc5079416b72dcfd7372f4471d5 legacy-trunk
+36292 4383db77b19a9b802588747ac61aca77f063ba0d legacy-trunk
+36293 14b4155d8b0a452124ff7cfe75ea172b037b3bdc legacy-trunk
+36294 9e8f7df4a6fe760116db18a243f4b649907beb06 legacy-trunk
+36295 796ccb9082ef356c34978344af65665c9abb97cd legacy-trunk
+36296 fa78ac56830998448baecd2e3d773c3cb636292b legacy-trunk
+36297 bc586db9945a0ec04f49a7cfee2c3e5a747450b9 legacy-trunk
+36298 50e844a4eed90f68ffe0e1fa44c6223606b42555 legacy-trunk
+36299 fe80f772bfa12920ba1f46cf912a221927ef8824 legacy-trunk
+36300 77df1cb415332e276a9473d1773722c2a6788503 legacy-trunk
+36301 b835d5c61d8649f44bfeab14dab4824a9b5d6147 legacy-trunk
+36302 eccd0fbe0cd5c28c139242ce5e2cd88f3432c36b legacy-trunk
+36303 c6acf261d61479d18683c01da430fb6c43921c4f release23-maint
+36304 f3cb95cd413f49f44485790029c4b9ada9477ab9 legacy-trunk
+36305 002ac6259c2cb9d22fea3fa09812926781c3444f legacy-trunk
+36306 91cce7bba37269648595cd020e85d091f0f8375a legacy-trunk
+36307 fa23a9b189676176b7083af351bca60fdf54b91d legacy-trunk
+36308 3923dc90eb8ebf70a05383a1e48d998d864d9063 legacy-trunk
+36309 ab0a2b74ddfd969ea1f8647800a2d4a313d47bfc legacy-trunk
+36310 79df4f87d67e7aafa0e37f883aa54bd1a21f1dda legacy-trunk
+36311 db503a263b433cbab8fc4c7fe210c024a3e304e6 legacy-trunk
+36312 99fdf80706adae6e3a1bca0750786b27fe7a19ce legacy-trunk
+36313 202ae0578ebeb15ce98fd248b4984ef1558e03ac release23-maint
+36314 f56503a8dba3c41d046f9a1cf218dbfdf5c20777 legacy-trunk
+36315 6ca122f2736ab89e151fb37bbfbdaec069e4f19e legacy-trunk
+36316 9c87518faf6b6c4e74ac5804555b4c6d19e5d42b legacy-trunk
+36317 054ede01e3d3057e0794aa019a69ad1c7acf847c legacy-trunk
+36318 51eb67a8568ea1b5e7f20cdf41b6daf45125e620 legacy-trunk
+36319 6fe2d241008a829c869ac356a6ac3f14307a5e6e legacy-trunk
+36320 fbbd6727401b6162c38b1ac5b5e7f156f91df2dd legacy-trunk
+36321 0db63a765a7701e9ec78f5fe8f121bc05011c08b legacy-trunk
+36322 f04f081ff231109e1154ef7826e5e2b8a85b1006 legacy-trunk
+36323 87401658eb45729698cd08c4199d9739f74b9714 legacy-trunk
+36324 c4eeffea196038b17ee6e774d193336e8048bf9e legacy-trunk
+36325 191796b7a05456d544fb2f05a29424f7d4cb2ab7 legacy-trunk
+36326 f5f04ce2516357616846ad2072d230f17a90b2ea legacy-trunk
+36327 682f740886028fded1f93fcc39f04559320853b2 legacy-trunk
+36328 8e768c3af015d712957457b349014ac24db34f06 legacy-trunk
+36329 3d689e715db244a925463f536b4e6678d5a89c2f legacy-trunk
+36330 61f9034a10f71f1de9a60ab2843921a9372397e5 release23-maint
+36331 8e7c91de949196172103798759f2e6cef7674a21 legacy-trunk
+36332 c4ed14fab12a36b75d6d212835e626ca12e165d2 legacy-trunk
+36333 ec928ed01acc55e26910b146c27af5cc87eb18a4 legacy-trunk
+36334 b61c41d197787088d5465d8db01774705c42751a legacy-trunk
+36335 329ee4830b041214cab95fb0c4f8a0ecdfac34c8 legacy-trunk
+36336 4549e75a62434e482b25031e68af242e3ba43db1 legacy-trunk
+36337 5e41cbec04653ff51c1536d3f1c76a7779e63ee9 legacy-trunk
+36338 f58cc334d15c462c565d6a833575908fecfc4f3c legacy-trunk
+36339 10e75ea596054833aa7d966386db2891405dd736 release23-maint
+36340 4bf8fb11894f4b81faf74db036355dc31c834f6d legacy-trunk
+36341 737e892a2c2cf686058ba11a88ebd31a1f4ad922 legacy-trunk
+36342 cafd134fc1cd44b699ce42c8806c40d83aac7c57 legacy-trunk
+36343 da63e2d6eb8a3d1f0eb352eb4a59ae96f3facb04 legacy-trunk
+36344 987e36afb879d2667751ebac2448df7bc4dd23eb release23-maint
+36345 ec5d0e8739641852c81c007cb2dfc8e9710e5e78 legacy-trunk
+36346 78bd25b42d463142c840d01f0ccac3ea3a16a9e5 legacy-trunk
+36347 0da660e05e690dca108bf681db2cc9267e8b58ac legacy-trunk
+36348 67539cfcf09fe8b534ae40ebd9fa6fd301e6a4f0 legacy-trunk
+36349 2476a8334286b7a0bfe10acccc39e7e321f31115 legacy-trunk
+36350 2451c9572edf5c009522ce707462fffb93a89dcb legacy-trunk
+36351 87d196e1c2d01d58f087bebdb4454ad07cf6515d legacy-trunk
+36352 92820ea5ae8cbe13da0b023e7ab6bd0ab47e72fd legacy-trunk
+36353 201986d6d9d6350cfb2a658cdc6c3972bdec7c6b legacy-trunk
+36354 1634f601188859959a178ad777e59e36cb4ce958 legacy-trunk
+36355 32455db9713576c297eb8cece5bd30e75578f573 legacy-trunk
+36356 43b809815c7d759c1ced9c767cb4ce73713e2db7 legacy-trunk
+36357 7fd6f87e5d1fceba158fe1dcf547b0965b031495 legacy-trunk
+36358 4fab4a5cce2f5d440e4ee505a963ebb926c316bf legacy-trunk
+36360 7e44f3a8b5687cfa612e2c45c81850bcd7415509 legacy-trunk
+36361 7ad68587c9acb625345afe77820b39b173300008 legacy-trunk
+36362 7759704e78729251a954df70d9a5150c51104a45 legacy-trunk
+36363 ec8e4ed2b157cc9cb73257001d81722d21c54eff legacy-trunk
+36364 c4d54c4ba5543ea82cf5744b14599ea5e58969f5 legacy-trunk
+36365 4693fa19e22bdca2ba96356408cf5d8472de5f49 legacy-trunk
+36366 d1fb4bd48936073c2842b07e7e86c4422990f5e0 legacy-trunk
+36367 d42749db9339252ca37078608df688eaa9273807 legacy-trunk
+36368 9288d524d757997225aba9693ea493e5c80ab80c legacy-trunk
+36368 92ca658fd420095b6284c9ce6e9082a80285ec9c legacy-trunk
+36370 be1a12d0b895d251692025ab3948d7aa79b6455e legacy-trunk
+36371 f3f11d863a02f613af7d573f56d4b127e2c8c767 legacy-trunk
+36372 f46d49e2e0f0b18fd93259f676b55c8554d97211 legacy-trunk
+36373 3706a3704aeac02a52d864a135e413ad4c1bc9f8 legacy-trunk
+36374 c099aa767952d98a6d7a2681d530187b3430f113 legacy-trunk
+36375 74c3b713e35a6afd55847a7becc554752e6e1d47 legacy-trunk
+36376 d909a0ddd1932de0fbbe21944b79ff27a3c79221 legacy-trunk
+36377 ec28563b052e8fd6b9f4a74167322463d8431f4e legacy-trunk
+36378 029dffb63f4bf1cacb797113eb30348ee88a3207 legacy-trunk
+36379 7f4b66dc43762da8ceff78fb6919a4597731b5df legacy-trunk
+36380 ec1b56b43af0465d4be37a58f26ece714f4a1b4e legacy-trunk
+36381 e4b96c3a3e1229daa783cfcf9d930ea2626051b0 legacy-trunk
+36382 6f351b1bcf534c8caab024a1a8419fe2fd528e14 legacy-trunk
+36383 a160b9669db1e320ce2ca3ffdda7ea7cce4ceb99 legacy-trunk
+36384 69bb241b056c96f152423aacebe44e51963c9545 legacy-trunk
+36385 cf138c55d41be6bc6edcf2c9743f357fa7301f35 legacy-trunk
+36386 1118683cd4d1cf5c05f6c7e0d0a11463f96ef9a7 legacy-trunk
+36387 3aadfc3fc4e6fdb807fc6aa5b70cd53c349fadd4 legacy-trunk
+36388 0064f55bafa7c968733898b24d93dcd400fdc008 legacy-trunk
+36389 844d99c888bba14f65308b316cde65bac4113ea7 legacy-trunk
+36390 5c25ca6ffaf9e59556ea674ae6c30855e3355343 legacy-trunk
+36391 70b1504e17ffcf6a0d99709cfdb3c33d9061f0d3 legacy-trunk
+36392 bec0c761862541e58965c0686f53c53a33457c6b legacy-trunk
+36393 8ea2cb1ec5988d9a312c164ba6b22382b4ab5a46 legacy-trunk
+36394 153c517bc6e96e74fc213130dd89979874749cf4 legacy-trunk
+36395 228323895271e046e675c044c2c39ee2fe8c0608 legacy-trunk
+36396 511ffc62b298a7f11b361f1534ab09561526c47f legacy-trunk
+36397 83cbc025bfc74e4e18a88711181b876c49346601 legacy-trunk
+36398 fef7911a5705caef705938a379fe18e1f31df22d legacy-trunk
+36399 21fd6e62cd276b27279260747891a99c48feb1e6 legacy-trunk
+36400 492dc8b8e58ec15e7167aa267df6c943490f4e20 legacy-trunk
+36401 230397bc7e32046cab5b07d85f4541d04fc0c56d legacy-trunk
+36402 0dd473a8e53c09227a1e9d9116bc199ee3c85ddb legacy-trunk
+36403 4d2f4a39ec5ed274904c17279d30fa9d3c25611b release23-branch
+36404 7362e372c8970d1630f82cda3546fd35ba6385cc legacy-trunk
+36405 f2f0c5fd9b6c9d3f31fc17d3e7bbe4b173b811fe legacy-trunk
+36406 a64bae5c33b7e76a08461afe8d2283b5c8381e42 release23-branch
+36407 de326d7e74e8b83799851138d74a1e65ab705816 legacy-trunk
+36408 a03bca1654d0a2ff8037ce299342edfc1e20fe5f legacy-trunk
+36409 67a84a33d0f8c343c0f2e00592d469afadbd6264 legacy-trunk
+36410 4be4c63673eb15c931bdac3ab504a7191ed40bf9 legacy-trunk
+36411 3e925959fa01acedc687738167dfef37f010c425 legacy-trunk
+36412 c78fcdd0246446df13345c481d2f2ef6c8483686 legacy-trunk
+36413 f3f4765efe668338e23d3c352a51cece95e9c2c0 legacy-trunk
+36414 5b25c6446aeb33f73644dc9d4c1e2b4845822d0e legacy-trunk
+36415 6d7ab0cad72de16cfc1d792f324450f058872e89 release23-maint
+36416 fdb9377513e42b299554cfd428854a853db61cf5 legacy-trunk
+36417 f6b45d1cb0a2bf67b11ab6f66156a607ff3dcd18 legacy-trunk
+36418 b527cb1b2b9eb4ad9466c98665927e50f96bf0a2 legacy-trunk
+36419 1c5ed81ffa235db890f27188c19982963e4c8cb3 release23-maint
+36420 c16b03ba1c22be4043f4059abd713dfd1760cdbb release23-maint
+36421 90d5cee7e66e47a949806d2eaa4978b94afbf508 legacy-trunk
+36422 598a5ce63322fae3ace6b48e01978261a5ab52e5 legacy-trunk
+36423 50745d99fbf16088d3d12dfa6f27875269b41120 legacy-trunk
+36424 5e1f55ec17d6c710a20376f36859a2f3f4b9201c legacy-trunk
+36425 ab979ff8b02aeca54798acc166a59c41458a511b legacy-trunk
+36426 799bcdff2cdc0561b62865512f382293c5871d9d legacy-trunk
+36427 08d90460ab4d624870ba7afab0cf294387fbe8c0 legacy-trunk
+36428 57d21c5e0eb8af0b2ba35623244c3f564e379c01 legacy-trunk
+36429 cc1f74d19fcbb7cb1916a8e44e615d4a7ec0b7b8 legacy-trunk
+36430 c4316df2fed46885c233c5dd2c8ea41893cfbdb2 legacy-trunk
+36431 6e9c182958f9170fb29eb3e97276be2289a49632 release23-maint
+36432 2b10e2b5e81ef23e6a57f72f9deff51efde5075b legacy-trunk
+36433 4f2483abb623af6408d85ddeba561b9963c76a72 legacy-trunk
+36434 8b3288f607e1f824070cd57088b1a3ede63eabc9 legacy-trunk
+36435 5546c7ae24f70d7f5cdd8774cab0959c940f3199 legacy-trunk
+36436 31b65d8371af8d26aef0e18429787371f8ca7319 legacy-trunk
+36437 f081f3a568fa887e15bfadfaf3ad592e4315a4ae legacy-trunk
+36438 09eaee72973c50ebeec8ffa083bfbdfb3694bb0d legacy-trunk
+36439 c538a7644ffa6cb78ced3cb6e384509b025a8be0 legacy-trunk
+36440 e6f7ef7073c679620d998dbe04a661fad33ec368 legacy-trunk
+36441 afb403383f5d07a2fd7ea6f8e755383094ce4551 legacy-trunk
+36442 f603e5e96a4f7c8094cdefae6793a3fc2db16e96 legacy-trunk
+36443 2fd69240729aae53f9d34c48a77fd071a86cbce2 legacy-trunk
+36444 6aba6d075899a6187d83f67741323f54538d21bd legacy-trunk
+36445 1446095a971ab8a356f5e6cc8eba62fb0b419bcd release23-maint
+36446 f86bfc03e7636546642aec9e29d067363bf04278 legacy-trunk
+36447 73016bd01a714afac4ca9043fe3dab68c0b13ed1 legacy-trunk
+36448 d42efc2b45e95c68fb46131c331e1f1d975e3a28 legacy-trunk
+36449 f9ad5d202e8ef44231175aea0578ff710b65efd6 legacy-trunk
+36450 457fd41c961d2ff8a3167e77ae44997b9d8f21ba legacy-trunk
+36451 5139892ade621cd8c67760ac4fcee050c59ccbda legacy-trunk
+36452 6173d97b829e6e4c12d295e0417a54b68dd3fd7a legacy-trunk
+36453 059dae06585befbeaee2993a3c99d32603514624 legacy-trunk
+36454 ce33967a4ab0f33638e511aa6beac6dcf1206949 legacy-trunk
+36455 cf0c9e15f6f4d6484fed4a9109d735192ddf786e release23-maint
+36456 c9869a18e62132d3f8a53f37fbb18f59433f1e35 legacy-trunk
+36457 ab18ef83f5a62ac4a61fd185c7919bbdacd76e8b legacy-trunk
+36458 9b5c63802bf9e2ab68645c25fa35b34423ee27b8 legacy-trunk
+36459 6f36e02b1f697d0cc3466cd34ebfe196d7291eb7 legacy-trunk
+36460 99ac530e8b3f57b42f815c48c7ff8ee11a0067f9 legacy-trunk
+36461 ef2394014d245e51a432383eff0247b91c6ec5a7 legacy-trunk
+36462 2dbf596e0524e959100f33a82aaf9ac8f332ef11 legacy-trunk
+36463 fde4327cd4724d4a08699dd606ed887e7d519e97 jim-modulator
+36464 da18210e311c2c20e2c24580eef8ce31d96c0288 legacy-trunk
+36465 d8f317ca80bd30cbf6c7fd2c6603c6fc0d76cd71 release23-maint
+36466 db994849cdf3fc4136f156fa46160949526c781f legacy-trunk
+36467 cf0baefe8d40130a32878e6ceb9acf62d5931347 legacy-trunk
+36468 fbb901d6297b55dc3e3e7937632d43efd29dee70 legacy-trunk
+36469 ff59ad58568e1f5ca355c7a9d3dcf41ddfcdcd35 legacy-trunk
+36470 e899060b1f051ef14bad60999621ce1b1aeb7fc8 legacy-trunk
+36471 dc32e0a8a0edb15f2cfc2835b6502988025b73bd release23-maint
+36472 9bc2eec1478b6ba55f0b07e68912e85fee532810 legacy-trunk
+36473 9c348526a699407bcf31134558a8291aae8a3a34 legacy-trunk
+36474 6c1c5957fed5f9e0fdc982b6735fd02c91f1e5ff release23-maint
+36475 3c2d9e7ac5a1f99f88cca0c5b82855a1a8fa6acd legacy-trunk
+36476 7bd04a4d28b931f189a6394edd90c585b4bb4345 legacy-trunk
+36477 929444ca22d8f6dfec9edea399c8e7cefee2cbca release23-maint
+36478 f725a1910d0d07733b7d516b355c79fdda7589f3 legacy-trunk
+36479 463bf5ebf8a33ab4333f44d976677f693c4a712f release23-maint
+36480 391937571065ae1264aa5a48cbf8796385c72d98 legacy-trunk
+36481 be1427cb0406f629f73a144e12431b8e1ca18753 legacy-trunk
+36482 3cca28ab385442158b0c92dff5a2faaf3e2c55b8 release23-maint
+36483 ca2aa43ba38b7aef237314ea6ee2cf115a599118 release23-maint
+36484 58843f186e80fdefe491a349ac95f47c4b7edb7c release23-maint
+36485 c131c788a06fac818533dd7bac3681ebefcd278c release23-maint
+36486 e4d9d840ce6e559cc3ee5c3f5ce1cf5de8fed608 legacy-trunk
+36487 6c5f01ec2f75b6e1479f45151a4b114d8bb3ddb8 legacy-trunk
+36488 8bd67bad143cdc562de60d9685e97c131f5779cc release23-maint
+36489 3eb6d25360a37a0229b9fd50101c144ef6400715 legacy-trunk
+36490 c13d911ae05bc0f365a970031896280fe8cc46c0 legacy-trunk
+36491 941c239cb6d2968c03208b7f0480759d1c8524a4 legacy-trunk
+36492 594996caff10d13b66d1272dbe8416ba8d53cc7a legacy-trunk
+36493 272ab5a54b9ebc9c61ed1a72fc8515960541c82d legacy-trunk
+36494 a1a9776fab53ea2f64024ec9610c05b4f90bdfad legacy-trunk
+36495 52beafd936c80e58e533fe76b34463f58aba053b legacy-trunk
+36496 d2e66eaa5f74e81e7889c911bbdce8b9f4412ec4 legacy-trunk
+36497 97768d87394a441072573dc2c3576cfb8d670704 legacy-trunk
+36498 3479610fb288d9992bc84b848bcdd8b7f025648f legacy-trunk
+36499 949473fa48285e5c86bf2bc42a79b73d78b21a65 legacy-trunk
+36500 88f5405761af7634c714114c15cabeddc535fed6 legacy-trunk
+36501 687d2ecfa6485e8b758b2fa19ed5149303bab699 legacy-trunk
+36502 cada2e9b685c89e9b870f687eb19a65f7013f188 legacy-trunk
+36503 5581d68b3ae9e72384df51aff6925022f1d4027d legacy-trunk
+36504 d3d426483d71043b3b597fca5f07850ffe61a9f5 legacy-trunk
+36505 104a7fc06bdfa2a4ded4d5e7990e28d800f88d12 legacy-trunk
+36506 bc4dd31c73fdf4f85685e149ddc686efe80ee954 legacy-trunk
+36507 8fcf2052d16e2062292a87d0c8a96c56763a79ec legacy-trunk
+36508 d64dcfb495b2b715fdd16cc3fdea20658c76d0b7 legacy-trunk
+36509 35d40ff69eb6264e9b91e86206347c3fbb6294cf legacy-trunk
+36510 9a3b4219bcbedeba49c51bff799cf9bba05366b0 legacy-trunk
+36511 fae460794d3d39f60a940cd978e75cee5dd7b28a legacy-trunk
+36512 1399dc616720f4b03b3cdc22acd6193fbcea3a05 release23-maint
+36513 577a9e4c82fb71e26bec9e922a488f3cbf7959ca legacy-trunk
+36514 2bf869d31f0ce615e7c3385cc083d615f4ae0236 legacy-trunk
+36515 5fb78a2d94f0ade0d9a52aa573a2dcf3caff64b2 legacy-trunk
+36516 211db67ccd09ed9434e7f092eff2a6d777e94c5d release23-maint
+36517 780a33787458ece213b3667cb87d8109eea196a9 legacy-trunk
+36518 3c382d90f302d3e5628ff7631df7fb9c4eb503bb legacy-trunk
+36519 ff26714bf86dc4c22b4e158c16735b6614c9880f legacy-trunk
+36520 be6f2e1a78b763c26bb12d35b973c6962a549367 legacy-trunk
+36521 49baad7b032e0b0c4dabfdfae44064ab44a631e8 legacy-trunk
+36522 7742f85a37238e2c5eb0bc08d2cc430ec1b65169 legacy-trunk
+36523 dc2fe77dd167edc8651f53024a05267af78c418f legacy-trunk
+36524 0729d1db5118380dd0703208c26e698df4ffc4da legacy-trunk
+36525 ed36621b126a1e798544d3d2aa15110b4dfd0ee4 legacy-trunk
+36526 df4e6cc6661d045889949c70ee57c70c43d3ea57 release23-maint
+36527 4be28093e480eac15ac3497427b9772e3a9a590b release23-maint
+36528 ab0b2a5888f9e70d11f6b7c9f0c757b59587c717 legacy-trunk
+36529 5069f5bd66f3f6d6b70fd1134619d6f0b614d1da release23-maint
+36530 d1ef86f8785f93df48cda06fd4611bba8f3faec0 release23-maint
+36531 f08529879db1ad3d5ca457efdc6bc941807ad94c legacy-trunk
+36532 abe04e77a4b0fd7a7e8786fd242f7d3f33dc68ee legacy-trunk
+36533 846ace57389c92a9dd7e4f8806d131eba031a231 legacy-trunk
+36534 df88fadba2f56cbfe441922e7894933c19ce0dfe legacy-trunk
+36535 c7c9b68ddda29c561dc8283707fb9acc227206ba legacy-trunk
+36536 255ae23c78fb6193bfc5f538c6f6c237979be3e8 legacy-trunk
+36537 38ad9c6e717c8b0b8bc972f61f3382f2a087537a legacy-trunk
+36538 17406543f15b27e8abcb98e3f3709afbe0e6c83a legacy-trunk
+36539 5b0c87de6d05096ed418104c6b7c6dc775460e13 legacy-trunk
+36540 f79cf13a9a7d10a832abe02265d7e11555dcc4c2 legacy-trunk
+36541 0e890ac1c0f265f447f27ff37fcf032f838bbe96 legacy-trunk
+36542 1bd3383bad985036480365bed3391ff966724740 legacy-trunk
+36543 109550f5a829630a8eff21082c0e0ebf0f082e3a legacy-trunk
+36544 cbb25fda95a580f2c67f4aa9bd44078882e6b46c legacy-trunk
+36545 d09da71413ca04fcb6cf33facfa23c5a40afebde legacy-trunk
+36546 4d43b0abc22a8b61fe2ac50ceae996fce7a63492 legacy-trunk
+36547 efca55bbba0ab12a04f976d469639b50502c372f legacy-trunk
+36548 6acd7070ed66f7ad65310db01a2f8cbaa8f7c3a6 legacy-trunk
+36549 7559c7eb47802743498626968c63b8441a560c15 legacy-trunk
+36550 e4cc78884fc426c26d2192b216559f45a269e059 legacy-trunk
+36551 69dadc2ca14dfcbf62ae1a16be2903fb03805c2c legacy-trunk
+36552 81784f666789b9024f876e51cb99fdd86c5c557d legacy-trunk
+36553 e135e82cf6e48916f6b9d465ca9ca57bfffafe08 legacy-trunk
+36554 07b48eaf2b01ebc48c4fa407b6b6371e8533c6c8 legacy-trunk
+36555 bebcb79f37cbc94983976413d04492faca873731 legacy-trunk
+36556 dc3f04afef7570b6831e0ac45244443e52c96248 legacy-trunk
+36557 977f267b00f93ec62919d76a513b3f133c419055 legacy-trunk
+36558 b1d142d714828998704606daffdf165c7d47e90d legacy-trunk
+36559 2bc66f1df7cc7c823fda3ee64b2cce20ea77e89a legacy-trunk
+36560 c3a096bfbd6be9395990e7908c5f887c3537a867 legacy-trunk
+36561 282927f7bde242da7cc3959a33fe8fb564a8033e legacy-trunk
+36562 8bdd794a4197e8971136111ba1ec1b93fca514f9 legacy-trunk
+36563 c1bd1c8e64b4574859c91e3b37f9738bd767f7d8 legacy-trunk
+36564 b6f1252b681c51cc083c4ff7369d0475a7560820 legacy-trunk
+36565 f97099f9ff1c31f849fa7a5df59127360829422c legacy-trunk
+36566 3377a72373fbf85d5658c966fc062075160f1406 legacy-trunk
+36567 4e07eacb1bdfd8d754a38510898bcd7fc8033da1 legacy-trunk
+36568 d1436c28dca32ee2e677735219eea41466faabab legacy-trunk
+36569 db1a27b6d7750ec276b973bd1d9cd9b6806435c7 legacy-trunk
+36570 c1824d68d10eac43c983c19f817fbc11916f5430 legacy-trunk
+36571 e4575519ec2623a0fd5593977b9fe1c12dc3616b legacy-trunk
+36572 05ca2232efcbdbd396899c6f89735918deb6ad5a release23-maint
+36573 b7951e1f5ddf29b0b4403043a43598ff61610132 legacy-trunk
+36574 5d9f72d0843eea9d8ece3cbdbce7b6e100e43fc3 legacy-trunk
+36575 95eb6e18a54273d35cf8969cb3afad54643eb237 legacy-trunk
+36576 dbd3a04eb0c648958736f40896a37261025a3380 legacy-trunk
+36577 b5459bf482624ba1ef2d54b8bcfc2f23f236cb5c legacy-trunk
+36578 938dc32ddbc41f1458d2d6b745c3660f61cf1645 legacy-trunk
+36579 257563dcb442344faaf987cc823c4ab9e4e80722 legacy-trunk
+36580 db26b3dbe8027cc9b050ec34c6cc8a5e178b53e1 legacy-trunk
+36581 26cb058907f21b78164a9b22940bed2b76a58d98 legacy-trunk
+36582 859ea8612eb0dc528b4a14d17f0b23f0b3dc2937 legacy-trunk
+36583 d1777f51923bb6181540ac1f1e6b7229c5d79f35 legacy-trunk
+36584 dcc5c2d58f325ffbc811bf207a217a35c5f7aa8f release23-maint
+36585 61be904a1d4e3553d7a2d71d2905b293bc5f73b2 legacy-trunk
+36586 76ad814bc67c94eeffb97806e953f8aa160d01a8 legacy-trunk
+36587 8ad5a1620092e4d0ee61543ef3058f7e47c115a2 legacy-trunk
+36588 ecb0c97f1e4260daa727a711f3ff4cd28e9162e0 legacy-trunk
+36589 50ece3d4ff3722878b206e523a12da53789a2175 legacy-trunk
+36590 d15517f2abe8bcf28a59074ba539ccbf055c27cb legacy-trunk
+36591 a91e7a45f14241f696ef91504a0ffae5e8e9ebbe legacy-trunk
+36592 ffa8ab0081f213c4957478f1b0040b8211396024 legacy-trunk
+36593 983a91b50f6e7875025205b60ad5429439230132 legacy-trunk
+36594 a3b1d6c99e4621be4f7d4947413b2dfccb55e682 legacy-trunk
+36595 62f843fcb823797bcc9a59aa1cf63f4f8ed7973e legacy-trunk
+36596 2ec451230b8ebcb326565aa924e8fe2e7ec70ea9 legacy-trunk
+36597 b301e5dee938c238a010d8242b1bef6cddb52793 legacy-trunk
+36598 8a91cd7d7e8254dd5c1d27552a7044502940271c legacy-trunk
+36599 826069b725db269ea1cdc44f4a69aa733b254af5 legacy-trunk
+36600 6875cf0882e0123cb6462ab7be0dcd314704ddf2 release23-maint
+36601 13d20322787d5a32ab017718c3ef3f1bb38a4b59 legacy-trunk
+36602 7af695bc54809265aa28c814c533550cb2b8c529 legacy-trunk
+36603 31938a463f287e8f6746446debb3f2d7cab86a85 release23-maint
+36604 517e00af13a1a7831152d1915206d5f680420cc2 release23-maint
+36605 caaef302f1e33c59433f98f842d6280fab90d1d6 legacy-trunk
+36606 7917fd2c4298381f2e241135159547f592d02fc8 legacy-trunk
+36607 d6e73e52880e47797ecca7fed33c8bd225b432a3 legacy-trunk
+36608 e6b847b07553f3cee668aca336cf6a43ea369601 legacy-trunk
+36609 034b3b92c5e0313904c06a1e3fb77252bdbf5dda release23-maint
+36610 4f4b7956287cab6893a67c49c41505220769ab6c legacy-trunk
+36611 807fbe8d3584013e6507302bed9d8787c3488c71 release23-maint
+36612 00892420e0df5e0865ceda760f3a9b37ce3b37ff legacy-trunk
+36613 6df9322d6ab823789f8b31ec7e6254dcd347ce35 legacy-trunk
+36614 a940b6c07e5775eba3bed7419f9a06a106d15cb7 legacy-trunk
+36615 55f73c82e304bb89dc8e6491fe0f5847d0d76746 release23-maint
+36616 73045143be63e8cffbc6fe0dd7c9d151559d9f17 legacy-trunk
+36617 1e2187f506317157c36093f371dedff5282c8e97 legacy-trunk
+36618 0f9c39b3e5f02f48554f927ad4c5af109dde7047 legacy-trunk
+36619 46e0431c9701cac0ba30ff8da19dad4168582185 legacy-trunk
+36620 fa49c1e2d2c1070ce964c34b98f5f42952820d80 legacy-trunk
+36621 ea54fdb86530ece54d4ad943113a6b3b4a950544 legacy-trunk
+36622 9267aeb72985d0524bebaed9dcd125262fc253da legacy-trunk
+36623 eaa8a37e1e850ce666fb4b4755bc32f6be2ab591 legacy-trunk
+36624 fe4145ba39bffba6178237af5b5846f268906489 release23-maint
+36625 16de4f90ef4468cb6f9e739f3b7761d52a4c9631 legacy-trunk
+36626 d30d51b2efe012a8fd5c1186d87192ca9cff4512 legacy-trunk
+36627 dac28136d59b0ac57b961a475f138b38202737aa legacy-trunk
+36628 cdad62533094f0ca1b7457b47784de47c55a8256 legacy-trunk
+36629 b8bc59578a475630879c5d90810215d15c0ed7ec legacy-trunk
+36630 3e04233852d4fadfdc0082401b2895f9b16dfb1f legacy-trunk
+36631 4a51cdcf861533668b0efcbb89f6237f89380093 legacy-trunk
+36632 edbaf610227b9f316245e9fd2dc4f5c59b5c467b legacy-trunk
+36633 b2879a72b34661e90b2273f903169696beaaf956 legacy-trunk
+36634 623ae12930ea16ad6948c1d3857cddb042ec02b7 legacy-trunk
+36635 6e79dea85189afa944f722559ef710bda5a28381 legacy-trunk
+36636 d5c97d69dfc7c171c5f0298c7081c9832282f888 legacy-trunk
+36637 9582fa2e5e0da2a06fe180e8035a4f89ac366a31 legacy-trunk
+36638 f616d65359933063c94cd8497d35ea1df530847b release23-maint
+36639 ee7b841011604f499f1480632a148049e5f34293 legacy-trunk
+36640 d2adba4781d5b0798ae6841ebd224fd22df7c8ed release23-maint
+36641 bf686ef92cb0bd242e627b8c34cd47ca7f936e7c legacy-trunk
+36642 bf6a2069080c6b1f6cb7e263cb7963111883fdb2 legacy-trunk
+36643 d1ccd2f45da34175c89fefd1b6b846c860781aca release23-maint
+36644 80acab9c3c176177e8cd55e81371979480c100e2 release23-maint
+36645 b358d2f44a7402dc4709b449e329e2e0b0e60ed8 release23-maint
+36646 3835dff2efdb5ad02b89ea4db8c3bdc408382cd9 legacy-trunk
+36647 fbb2d34f75a3bf70125f21d753e179b026f01b04 release23-maint
+36648 71633d37e98e92cf9659baa9018bfeba4685b8d0 release23-maint
+36649 c6c58b61f6b5a8f034a6011dc6e90a96522d927f legacy-trunk
+36650 d956820895050b4959ca28de2200f9028f5e5204 legacy-trunk
+36651 37a75b2b4c2940717596689b109de4334b225575 legacy-trunk
+36652 07a57d89b1e0dfe8c9e73bfc11c75af19f669d16 legacy-trunk
+36653 cbd4ae74890d3c104ed6b235cfc171a066860eed legacy-trunk
+36654 060de504ebbeafc07683bba804a1691c9f8c0d71 legacy-trunk
+36655 4353ffc437f19fd88145dded835808cf7920c341 legacy-trunk
+36656 fa4c7063a736a5c9e3428e988750f681a49ff568 legacy-trunk
+36657 dac9d0664fc393345085750298c9489aaed9c64d legacy-trunk
+36658 718305112f9fd611c090409165dbda161c3b68d8 legacy-trunk
+36659 b58cf6b5fc914380d50d2ebc61e34a63cb02fdc9 legacy-trunk
+36660 1dd3cc927d377f5e939f3d55e8f74214a3c3fc31 legacy-trunk
+36661 70e8f634a589029bf8de651b89a0aff27ddd72fa legacy-trunk
+36662 24dd1d07afdbc0689f244b29c158ba99fcffb52f legacy-trunk
+36663 7b44c2782793e9c634963e44bf2107ea7c35d168 legacy-trunk
+36664 21318d7695f9cd3f562c77f9834ec606e183dc8f legacy-trunk
+36665 0856d98e2a683da6b3f75f3368871bf218428cab legacy-trunk
+36666 d5b76a167323aa1530b9f964c7d28929995f63df legacy-trunk
+36667 dab3f08668df23ae356eec0930189421d21dd225 legacy-trunk
+36668 a4f18c89865fb8d0d2ab2b82ee9f187a66fa1812 legacy-trunk
+36669 db21081f5bc1b16188121bda9a0e0f384874d9c6 legacy-trunk
+36670 865513112f7a0e7918fc33015d13f1759259e22e release23-maint
+36671 5e480a5c647da73449bf3e982fa2f5e20f2aba76 legacy-trunk
+36672 e3a35fbce8ec22176d389328563e3042d11efdda legacy-trunk
+36673 e7cc74152c55297c3ca9f8d6dcff198e204e849f release23-maint
+36674 09e633c5273079ad9c45ac55c1d28ce8d56a14e2 legacy-trunk
+36675 052a43aa35ecf72ed228851cad20bc5d7af13143 legacy-trunk
+36676 0f94f4886bf55a8a550f1b06958f01a05b58b662 legacy-trunk
+36677 1682201f05b2a8450e65bb693b33e635ddc0ff5d legacy-trunk
+36678 dcb241c89f42972c7120adb055772a15866b31f4 legacy-trunk
+36679 96d991477a829ca77d12d9c835ce02902fad7d5f legacy-trunk
+36680 06a63c35df9e3c65cdb2ae886605ab358f0df45d legacy-trunk
+36681 724fb26ea05f24c9a23c87acd3ac4ea862627b58 legacy-trunk
+36682 fa0526c30da805f810f7e8708355e7edba8b2d47 legacy-trunk
+36683 45f3222b84ee0ee31f27b2bcd261685a31bc9588 legacy-trunk
+36684 48eae20d70c58b86c4e3f073c0eef9d01dcb1811 legacy-trunk
+36685 fc3687a627b4343c09e950d6195392aba5357ddf legacy-trunk
+36686 9a00b65aecdcc8437e230705bbee450190800bbf legacy-trunk
+36687 6ea32b0e9507fa26f1fd5c2b8b2158043a93a9be legacy-trunk
+36688 60a708bf351ae11e9792cb11295603d44593767e release23-maint
+36689 c57010db123eeac187cb4be7c0e30aa499e3735a legacy-trunk
+36690 a53b5cefa60d7d0524f8403a2f1e629a3b0b33dd legacy-trunk
+36691 8d25835f88ae4450e9d329bd8d18b1f09f365ab2 legacy-trunk
+36692 bd46e6f80623bf9d22968455dc2d095443935e0b legacy-trunk
+36693 ca6efc54b19ff719cf3682014c8f7bdea192e396 legacy-trunk
+36694 195655299ed364874ad61563d2f41cad8830c16a legacy-trunk
+36695 6be894014a8c3bfd6f617d916e354c68db4e773f legacy-trunk
+36696 d013393c7d982f4a6c24b631314bc04779909cf5 legacy-trunk
+36697 ef08f48b63a1ce54e1b3f473d1e2e666208edb36 legacy-trunk
+36698 62c53b8e4aeb31b6f04171965f312e1ef6defddf legacy-trunk
+36699 b390cd91c76b11f5862f54e3ec0a11dbc44f858b legacy-trunk
+36700 018c43045b53e638ec89c7999555c02202bf7489 legacy-trunk
+36701 2929fc54b49a5d47b85bb4fab5d848cd7272a2ad legacy-trunk
+36702 ca1aeb8ab3802cb27ca8ca2d98d2d47f332a4294 legacy-trunk
+36703 d3d609d657fd269fdc77952f167a82dcd40faa5f legacy-trunk
+36704 510e9e2b081746110e962d0a94c647c478736c40 legacy-trunk
+36705 26b306894b9eb4610c9f48941a8399b780fa4655 legacy-trunk
+36706 331e60d8ce6da19b168849418776fea0940787ec legacy-trunk
+36707 e28b8733a66d7deaea58c50a767031845cbaea86 legacy-trunk
+36708 88a1d86d442e8114b9774713ebf4db8dbca903a8 legacy-trunk
+36709 2aa7aef4e4033c340c9f987e0122eb3c53698381 legacy-trunk
+36710 b323bdbac7e4772b8ac76f62735fa57b5bd84e32 legacy-trunk
+36711 1be4033f84980891d4eb1e7fc1c6423172a82681 legacy-trunk
+36712 c7e03cf8333e5a3a8ccfe9a0ee85946763307e01 legacy-trunk
+36713 2095cb59818834eb9eb4603373bbcc0c710afcab legacy-trunk
+36714 b8c2aa2be19a31441b25552f8ed2e519f09169a4 legacy-trunk
+36715 a9b25c230732729f2cfbb932bd9915c3fa54d884 legacy-trunk
+36716 685a948b3bc9cb5d594d6ceb288288c3ed54d8a4 legacy-trunk
+36717 51d7a12244af31381fed75d9414281f09059cce3 legacy-trunk
+36718 d049a1fe26763fad706a443123ef714161ffbe00 legacy-trunk
+36719 63ad6f6925c568d4faaf93a9e9d9b6bcf29425d3 legacy-trunk
+36720 a75815e315451264abcdd9b2c35c1e5fab841cdf legacy-trunk
+36721 0dc8ffaac036453e69fe3b05ced8a875a1a73df7 legacy-trunk
+36722 daec2d311def3a03330078da2be9e18aab00e818 legacy-trunk
+36723 84efa005419aae27ce8126cb05940ded374b2200 legacy-trunk
+36724 b8e10acb4efb622260ede789d88d51ec09232256 tim-doctest-branch
+36725 ac73f6662e117c2a44fdff7f7689f2e6ef797bf4 legacy-trunk
+36726 30d86e356bf24f714b10fdce3e6953917b318429 legacy-trunk
+36727 79c4e82ee997c8f4100d93fb85e4097b045a082a release23-maint
+36728 33b8ce66202ec9197bcbff0acf2dae177644710d legacy-trunk
+36729 9146e2ea3bd50cd561d22ce351f8bc48f0c66fa3 legacy-trunk
+36730 f412fa2b3fdef7c93ddd3af57832ea453fdd9f65 legacy-trunk
+36731 d4dd7b82cc75bb6b5b9a558d3ca83464c6988e0e legacy-trunk
+36732 65f11a8d7c8b39e7412e22e80208dc0b1008accf tim-doctest-branch
+36733 e22574be87649a47f5aea64adbda6e617cfe5087 tim-doctest-branch
+36734 4cce00047f9749806f335edd2053efe4dccf24fb legacy-trunk
+36735 d674d78d8da6642fe183dcb7787222f6ced54a22 tim-doctest-branch
+36736 6d16b07addc3a6d3f4201f8e2145e9c69f5e0655 tim-doctest-branch
+36737 54671736a29e4e74d0cd408ad4691daaf970c8bc tim-doctest-branch
+36738 f53b901c8afe8bf215de477761f2be964ecc2ca6 legacy-trunk
+36739 65319607bed8a186aad2697a16f2aab1a44ddf45 legacy-trunk
+36740 66c556f091637d19eacc1f722e5935a3bfa9674e legacy-trunk
+36741 1533719c613839e42a7e95d4895376949dd24a90 legacy-trunk
+36742 329d4906c33fc7d3882392f7190c56667526ae8c legacy-trunk
+36743 89159a1268ccde5c1eb6a4e299eff6b6bcdfc42f legacy-trunk
+36744 cac5c8f3e990f2e796ffc67ebeda89d520ffe1b8 release23-maint
+36745 a9856e73e32d42d17d45f6999fecf60c89a9a874 legacy-trunk
+36746 ff77727555ae510429e05b6ca4b9ad089c24b67c legacy-trunk
+36747 41facc3ccdd339c94ce2be6b8f18754bba3b77ea legacy-trunk
+36748 7e7457a69b4d81ddeeb8d0403289834eafb5cb45 legacy-trunk
+36749 25b669f4b56cf62c3b0c3f640bc673fdfe0b46d6 legacy-trunk
+36750 bda98304deb5d94f852509b9dd6945c6c8ebbdbe legacy-trunk
+36751 3824fa29be49cc1c1b78dc33653732921c564907 legacy-trunk
+36752 69370253115ba77bd7e6490467b8a2ec49df82a6 legacy-trunk
+36753 f1bbf147810b294635a6f0a3ce9cb03fa424532d legacy-trunk
+36754 936712b31bedc8a325525379b4d8eb3a938e471c legacy-trunk
+36755 663ad349534b0084d7bddc08e9abbef339938612 legacy-trunk
+36756 5f58fcd7accf62214f314dbcd85e92191412bb96 legacy-trunk
+36757 c31d8f38fd7f6f1fd4ad4bf00d44c67b841228e6 release23-maint
+36758 ce488aa04f24ea368ddf9c11a4006f9e338f408f legacy-trunk
+36759 8ac4faa282e0b9cf29144f677b25ac7ad1754218 legacy-trunk
+36760 5c2149f36c3eab6ca0551c3e510910c00b6d12af legacy-trunk
+36761 ec71ae3bc2ddaf5ee883cc197e0280312d010ce5 release23-maint
+36762 bd3dd6b3ff972688286ff515dd037b0b86d58c15 legacy-trunk
+36763 45a170c4ca56ced26ffcfa4797d5c4a51d2d44c5 legacy-trunk
+36764 91fa80a67811bcde50eb9006c1d05998b04b903e legacy-trunk
+36765 2c2f5cfefa605683ef7d146aaba822d482aba6e2 tim-doctest-branch
+36766 dfde085228eea50b46fad657d5eb68cde7fe4819 legacy-trunk
+36767 f071a553aae58a453f66394696d637f50f8c93bc tim-doctest-branch
+36768 473cb0ef82d24346fc511c84901e226aadcd1fd0 legacy-trunk
+36769 2663b4f535b7cc58a5a3cdb418aa71c55be5061b tim-doctest-branch
+36770 651188a6638dc3fc47e1b126f70db49e106be5de legacy-trunk
+36771 8ce344f6c954eec8cf1108e9d5cdca21596911b3 legacy-trunk
+36772 5aa85097cb2cdcc96a84f4d4ae41d487e1061d45 tim-doctest-branch
+36773 582eb51b849214506b01fcd30c81954adcd62c17 legacy-trunk
+36774 22ded309648bcba33932547c9920b277e9fcd3bd legacy-trunk
+36775 66dc211bf50721ad01f713efedc0589b8ae8a762 legacy-trunk
+36776 84b4757999182e0fcc9a511e246bffc337a2bcd7 tim-doctest-branch
+36777 63df4cb492a16c6afa9fd573d933fbb0d208196b legacy-trunk
+36778 9fb5138f58dd81b918d26e334cf3f2aa4533af72 legacy-trunk
+36779 f63d45fd3fce74489492ff2180f68520c06ff55f tim-doctest-branch
+36780 e027921122889ae8dbfb8f8c866a30dd6eefa98b release23-maint
+36781 9f8a7ba21055ebe0da0d6033698b350750f503e4 tim-doctest-branch
+36782 8b390df7af873732d9cd65f8fba06f5bd0993dce tim-doctest-branch
+36783 e4feedb205f2d6b8fd0064f6308107e29bfff256 tim-doctest-branch
+36784 314422a28e3fb858b5f5e9638cce301d5172be79 tim-doctest-branch
+36785 d741cb377f8295ff10630edf8124d09f045d8a80 tim-doctest-branch
+36786 fcd690c8b2ca6d8455e3291378c6c77c54ce6bff tim-doctest-branch
+36787 cafd7e4e77ad0782b3e00a8646808ef5b0319d97 tim-doctest-branch
+36788 fbb5428ebf4109e6aa78c25057eb2dc1f0a4aaf4 legacy-trunk
+36789 db38c1e839652d1ef59a561df0945ee10377e844 legacy-trunk
+36790 b639cb45b17313def20c717185c8928999aa6153 legacy-trunk
+36791 953ce5af10a31b2935d339a994447f820031e904 legacy-trunk
+36792 9ebd405683cd8572415f92b99ab75eecf11cc239 legacy-trunk
+36793 adfe7d39a049d6a3c93b42ff9fb92695782daee7 legacy-trunk
+36794 024ff0ab458803355a3d3676c075419af3ea1043 legacy-trunk
+36795 b56481a90519e5a20a18d533aa3fa25314ed624b legacy-trunk
+36796 971e51413447c2e8bd3c6ac5b1670e2f64addde1 legacy-trunk
+36797 2bcbf3fb7021efb64305da74caabcff70b694636 legacy-trunk
+36798 e2fea22e0c513d61bc98a5691319c4023da3d3a3 legacy-trunk
+36799 071d3381753b60d22766d17fb8728a5499602fd6 legacy-trunk
+36800 a9d59197b1631dd4a3bea0ee068aae0ab978cbc8 legacy-trunk
+36801 156ac6de9625c47df15bb1124d20d44e5ee36667 tim-doctest-branch
+36802 0bf0f4bea1441689b81a3413c4c68a090123e0e2 tim-doctest-branch
+36804 e9c6414dbdb61537353998e86767057fe154d7fd legacy-trunk
+36805 2bc332616cd6f9fe1ac742f2521a98105a687dc7 legacy-trunk
+36806 7aaa852fa856fa3384526c5343d5e0ffd66b9090 legacy-trunk
+36807 5e8e309c0bb06973d97bba618e607081cc654b0e legacy-trunk
+36808 341b7adba9447a18bce3851df43e2fd06f0ca5da legacy-trunk
+36809 9f66259aece3165cc2c70e0a3354423bc40dbe0e legacy-trunk
+36810 9ac643544629b04977b7a9c08a87bae937ebe7df legacy-trunk
+36811 ea338baab8599d7157f02f40dbfb0cd8affbc541 legacy-trunk
+36812 9821e388b59d93f396b7377fd7eef58e9f9448ee legacy-trunk
+36813 ffaa175d0aa337f8842847471acbda59eceb24a8 legacy-trunk
+36813 055fc6955f3c6522bfeb7ed4c671c97d5baaaac2 legacy-trunk
+36815 e6d009276c547961a430b98bba134bbd488a1968 legacy-trunk
+36816 3e909c54e30c91dd277be75de19e97c4f3e79676 legacy-trunk
+36817 ceb1c3f1ac8abb461c50edd99817154cfee5f008 legacy-trunk
+36818 5f4bfbe26a4dc464efd6f1301fbafa0fd6546d31 tim-doctest-branch
+36819 84410a0d6ea9413401ea596b4c3efffeeee5c13b tim-doctest-branch
+36820 ea87553e25609f8afb06831af603460064aff123 tim-doctest-branch
+36821 bd413667ac16b67dd2d33955477e98ffcc326094 tim-doctest-branch
+36822 2e67c27086708b11ba88f621375dcc8404748c82 tim-doctest-branch
+36823 b6890ea5fde0f6e0529cfa72d7628b0a9b58cc51 tim-doctest-branch
+36824 79600658be6892a90573ceb717b96d7f1fa96ca6 tim-doctest-branch
+36825 be584cda547d642c89bd9cf5a5751c4e8c236c2f legacy-trunk
+36826 f7d50e91bef39edd4a2e6e2c5e479658a933e9f1 tim-doctest-branch
+36827 197517d8099e47e000543b549aedddeb57055cfc legacy-trunk
+36828 4c9efb3a6bb3f60c420a85537c93a9653c92d8d4 tim-doctest-branch
+36829 c26a4fd69744adc4ccefec71dd197aee30b5d810 tim-doctest-branch
+36830 fb6ffd290cfb39d21aff1d72082df6cc3ffce1e9 legacy-trunk
+36831 aacdd0eca1eb562e365da525fabf04ce2af8b102 tim-doctest-branch
+36832 9b188158181f7f1367545dd2856af95c52a133b7 legacy-trunk
+36833 4f01894ab458dc77abe169354978f41bb2420e62 legacy-trunk
+36834 40c3a51cb71cd354761218fa51d1c20ebcd1acd2 legacy-trunk
+36835 360040d3d4fad8217c11678f7ff856ea1d9cea6d tim-doctest-branch
+36836 5cab33618293004b5c552d9ed06879ce8b1792f4 tim-doctest-branch
+36838 678d40fce0b14a99e7630f511b8ce07ca30917ae release23-maint
+36839 5cc55d36bb1dcf9b085d3c5a9eb1b05b706b2b7f legacy-trunk
+36840 e89ef0bfa1ff8cd4b10a42e8142a1a2770ebc9e7 legacy-trunk
+36841 50c122bc7aaca3882c747f8e55d7298ea6068664 legacy-trunk
+36842 ae8772d15a5fa7160a366029e7c0a194e5f5d27f legacy-trunk
+36843 726db585474614f1140014e48b62f6cd38f87cdf legacy-trunk
+36844 4b3f8dd9269ae07192a9b746b54a2fb422241657 legacy-trunk
+36845 f519896cf5dcbde39d543761788938a7a13d2fbb legacy-trunk
+36846 61c01715775683445faddbfa1e3dbeafad2368e6 legacy-trunk
+36847 8f87440c6e80cd12ef9a78b36165b2fc13c73f1a legacy-trunk
+36848 a8a486339d80646f5c4d3d2f7f5d059c137205b9 legacy-trunk
+36849 2ea09662a2d40b5cc13127b97da8296689a61ab4 legacy-trunk
+36850 44450129ce356e5f0e9de99635a06bfd49d72ae7 legacy-trunk
+36851 c9ae95d77a427f98f481fca5a9e8cfe85f4c1494 legacy-trunk
+36852 b34a8dc3ccaecf2c5871f44a89f67349a1e3692e legacy-trunk
+36853 4e2c66021bf380d243262637abd025034b2714d0 legacy-trunk
+36854 43fbf29dd83a978c814bc4de0aa6ffb1262e80bc release23-branch
+36855 252c65469114695c6aff7f49afca05cd5bdd5e50 legacy-trunk
+36856 1aa40a08982fa55eff208ad62a7900592c3a8223 legacy-trunk
+36857 30025965324a581e071c17e4ec5d0cad71893d0b legacy-trunk
+36858 309bebedfc97a1cc231cb27c86fd6e3d9c4fc569 legacy-trunk
+36859 2c116e7ff1636be0caf3c0d7f87ebaa42c9c1bc6 legacy-trunk
+36860 441ab3ad6d01a0cb62c638880587dcc9329d083e legacy-trunk
+36861 4bf6854db656ed980c335fdfe8d378faa567d381 legacy-trunk
+36862 4fd59651fe3f9a626c9eabe21856e2ec8795e667 legacy-trunk
+36863 396d011f8348ba67a12b59e542fe10aa0cdb798d legacy-trunk
+36864 b5dcfe7a415960ab0fb3c32e05ef798927bdef98 legacy-trunk
+36865 867fef2b5060ac8201c916d8bb9f0e633daba764 legacy-trunk
+36866 fa3d01f0fc442152d52b406f79ec7f140b4452ce legacy-trunk
+36867 8d707d49cb9bc7f8bd6d9760a43dca7ece9540b0 legacy-trunk
+36868 9fb2e30f26bee5ee1e856166fadb28634cb8e483 legacy-trunk
+36869 367ce516ad054bd8ee72804ab0f4a80a40664d91 legacy-trunk
+36870 48cb4ed494a65810212a3955719dc26d3937b022 legacy-trunk
+36871 8f6d205d531bc97eccc0df2e1c8319e1fa09d5ca legacy-trunk
+36872 ff17624b264292619f240d2f8213b89a5cd7711e legacy-trunk
+36873 b0e0a53870b6f9f8097027f414f722655afdd2eb legacy-trunk
+36874 8ca8febc0a0d750090c43b9e336ed3c117c4ee56 legacy-trunk
+36875 0beb756965df9cd4657cd2e93e0ce30a091d3151 legacy-trunk
+36876 e5b9e872a7d3ba285426981ed11ad30c566a5d64 release23-branch
+36877 6aa31d75c4f990d95b8e6d5cce6ca2f7d48c57a7 legacy-trunk
+36878 5c940f98e46559c922eb8a15ebbcdf20d11ddccd legacy-trunk
+36879 ab93aff4c90a84bf0c0153099445e2fb430045f8 legacy-trunk
+36880 1f358a6b4bc336e5704514b2827ea1859bb5d2f3 release23-branch
+36881 204d29acba2801010affa7f38bd61a3ada8f2163 legacy-trunk
+36882 5218bff564494f6f10a5b2ad2316294c5ad24509 legacy-trunk
+36883 ad818338f8c3306569cbc6366924fd67173f1c17 legacy-trunk
+36884 530c02b83eea5ad165b6c8c8406602f1ac613cb3 legacy-trunk
+36885 2c93fceee42d13daf054e66f740fb066085c8fa3 legacy-trunk
+36886 4f588f57a93b035ad03b8d0460839fedcb7fa587 legacy-trunk
+36887 8897e77cd79a841bfe775c571c16d20c5508afff legacy-trunk
+36888 9464415a1f89499199257d907940533269bb378e legacy-trunk
+36889 49b8083203e6bbc1f979611c81734c3dfe15b8ba legacy-trunk
+36890 9ddfa74cb250f496f81432aa75d9f49540370e49 legacy-trunk
+36891 85002cf4e23bf50d8a81ed57a956a3fe15636cac legacy-trunk
+36892 2e7b78032702c7b6ba6d567ed187eef7811928c8 legacy-trunk
+36893 8607ac2f81c83920dd42a49d07cc224e4f3b3797 legacy-trunk
+36894 26752df939139033fab6c3873b0c49e5f6db752c legacy-trunk
+36895 1660a68fa6a407a73dc7cac7916c9bc1eeb3d2d0 legacy-trunk
+36896 7c3d569522c492aef7e3993b554985918e12b67b legacy-trunk
+36897 b669a6097ba89c826d40b03ac61e811bca434847 legacy-trunk
+36898 ee3aaa79184292d802f5bde9751176fc5608613f legacy-trunk
+36899 f6b2f192e03b53fb338b1546294ca293a15caf20 release23-branch
+36900 ce2a196203c5ece927becf04e2918e8e575479f2 legacy-trunk
+36901 233c223858f77bbac52ddb58591cb5744d5f255a legacy-trunk
+36902 fee2038b8fa9dc82b066d23e3b033447f333b26f legacy-trunk
+36903 420488408e0e3d6433c7d0953434281e45228435 legacy-trunk
+36904 5a4d77b6efa65ea8ae18677ab2635277297ef03b legacy-trunk
+36905 3045f4f34ef247bd5438f20a0a1a5b1407a9155e legacy-trunk
+36906 17fc88a1b8735784c42cc3ddd30b445bf9e49f91 legacy-trunk
+36907 1dbd0f345a78860c49a62783667f348662e1c664 legacy-trunk
+36908 2749334d71a47143e01557757920e7f9aed8b683 legacy-trunk
+36909 163621517b98254ca8558ec99ec6346ed73e0da8 legacy-trunk
+36910 67d25217bc7f0c47421c3cafa5829b30291bbab9 legacy-trunk
+36911 c81ed079576f2a5e7e71c457b1ae829eceed97b3 legacy-trunk
+36912 c3487ef3a69c4d28a01da5e1d706f3c1ce2ae760 legacy-trunk
+36913 d0eb098be2648f25776bac9ce71c8c5012270858 legacy-trunk
+36914 c478a71c2384042b82c7b77bfcc444ab79582fc0 legacy-trunk
+36915 455667146d4b99ecb5c45c48e3ea1a22b1b3b3cc legacy-trunk
+36916 985375aca9707310f0754625fee1cd4e8b93a73f legacy-trunk
+36917 1af3ad49d06fe0e2211b36f3c100fe75a47bb71c legacy-trunk
+36918 27ada25509ff26268cf185b915bc7726d3d980ff legacy-trunk
+36919 fbea2be355628be23f44a6c72d7c05d01d6323bd legacy-trunk
+36920 29fa9d6afea01fd8faa70b5ae50e42e9cfb3c4c5 legacy-trunk
+36921 f0a6ef3a874ef8dc5a8dc93f33058fb53f965955 legacy-trunk
+36922 5e69f7c80ef427334385f6512ed4c769c9aa9e1a legacy-trunk
+36923 6f38e3b64ef4726efe9d4ec5c60fc15909c0fdeb legacy-trunk
+36924 31ccea9e98a746fa0ba91a9791f247df1842f980 legacy-trunk
+36925 ee43ca4a2c238e41e732330cdd946b94c1d1fc41 legacy-trunk
+36926 764d28fc3d3698ea8fbfc0139a57faa6f4b2f7f2 legacy-trunk
+36927 90da7098640723974c8ab88c0ec9eb9111a1e764 legacy-trunk
+36928 03043b288b287586002e07d81b59d067fc3bcc85 legacy-trunk
+36929 45329d9fdb8d545471e40a711837f86c9927a474 legacy-trunk
+36930 cda0455bd0a031890069942fdb8740bd12934819 legacy-trunk
+36931 2a8c3758c4a1906be31da3aed9253f7fc19192bd legacy-trunk
+36932 451dd49df53109cd62abbd91abb0cd166b34f0b4 legacy-trunk
+36933 821c557ca6124b5fb2057dc36f3b89f8f9ffacef legacy-trunk
+36934 4e6f4e9ec9b3d3a566dae894cf40703e413b0bf3 legacy-trunk
+36935 04d9fde11330948e2a3d0cb7be0e567162e14e7c legacy-trunk
+36936 4dd1815b44efaaf98567e53dc57f76d4be2145c0 legacy-trunk
+36937 bfcc4e39fc452b35326676346ac811d1e7d3745d legacy-trunk
+36938 981fff7363b92e8e74df17954af22169dcb01d80 legacy-trunk
+36939 01cc5e3f6375221a1b7c974220ab3dbe8d361f8a legacy-trunk
+36940 836e77266f97791314110f3b470a77fee4a3e022 legacy-trunk
+36941 743abac9f9fe33ecbced9739c15c0ff9d7d7ff31 legacy-trunk
+36942 d075cba851fd86fd96096379a27868c6337d16e1 legacy-trunk
+36943 058e851e793eafbb11482b958ac318d61dd7020f legacy-trunk
+36944 a7928726dd8f5bd44e84e9b45ec3d06f76f2d92c legacy-trunk
+36945 5eae4ce105fcf4c5649f97db9df0ab8ef3442f8e legacy-trunk
+36946 240eafae3ea74da7354a9f5e2dfdc18d8ccb391e legacy-trunk
+36947 5f33507cb55982371efa3922e28af8633a67de8c release23-maint
+36948 abecbd66a6280c7d99cde3ca51937b8c5168df21 legacy-trunk
+36949 44457cb8f97014972d933c494082854e7558908a legacy-trunk
+36950 afd54126e9a190fa040af4f4ced66ab541435666 legacy-trunk
+36951 5347da31f076c6cf27d4401c0aace9ee92006621 legacy-trunk
+36952 9937d0e63ca325f47d0b3ce0a63e1b9ce31cd7c6 legacy-trunk
+36953 4fd18505fc35fdd7b32fc63e7d17f9dd72c1b702 legacy-trunk
+36954 4b0a0fc1baea31df93ee256d50d175b3e0f9fe09 legacy-trunk
+36955 48100a01ac7c053a4175a861ed67ba693e2424a1 release23-maint
+36956 dfc25e1b96058348c9d24435be4716b15c6d7e8e legacy-trunk
+36957 20e90e50797de8f5d064ac7a2e923d7d8a0183ee release23-maint
+36958 b166ae2f77321437e8fd536f95b7323b2df6792a release23-maint
+36959 ddd24d72ad6aac569f8106778e745ab1db98208e legacy-trunk
+36960 01a3855a4b03e8297cde93409b10e91482ac8467 release23-maint
+36961 c70c33f69a44c9463075ad6c458ebcd5d4223a32 legacy-trunk
+36962 3b5d37f7cb5ad1e77ff2008c6dbd28e31480d401 legacy-trunk
+36963 ce016d0ec7015534a250dc485210df17e279c32c legacy-trunk
+36964 356887410bde74b998751f133376201914307b91 legacy-trunk
+36965 81efec0e9d2936be86cc2cf0c32955acbcf8f097 legacy-trunk
+36966 f27935b46985ac61e0bd56930033714e7262febc legacy-trunk
+36967 6b8e499687d62586ea75b7ac268de4894c445c68 legacy-trunk
+36968 f455bbe7ea7e2b16d47961511e6b64055070c606 legacy-trunk
+36969 e5f6c3f50846653ca293b4bca721fd9126f31e3d legacy-trunk
+36970 babd11eecd883acebcae274174c534acc9e55854 legacy-trunk
+36971 c9ac9be95af9e2e8a9b8b0f567955f26b580912e legacy-trunk
+36972 ddc0304c151fe4f6ee11de21f3afd650b52a115b legacy-trunk
+36973 450f5e21eac8dc24a0dca269b9f5677704fc59d1 legacy-trunk
+36974 0a0c247f0584456e15174392cfe3c882dee1b68e legacy-trunk
+36975 7de7c1910ac9ca40e9ed4a300b14e41b15ca48aa legacy-trunk
+36976 a77c0372a1d7b52cd1c3b55482323eb0e7c8711c legacy-trunk
+36977 28e877ff74cf7067336389e9a78bf23fc67e26c1 legacy-trunk
+36978 e4a73efa4d234befe3c222ba55528ab6fc881acc legacy-trunk
+36979 dfd3803ee0c1813d8a70fbbb64094aba5157f5fc legacy-trunk
+36980 3a4e73a5e4347f1d15aa1754fc8dc98cc26e30e5 legacy-trunk
+36981 bf69fc3bd067e4e5ecc1c28f07ae7ac7a6144e21 legacy-trunk
+36982 f6ac417b5eb08b73f1c03820542c9e01a3e3de37 legacy-trunk
+36983 1cf9de3a8503a43978578b0ad8e961027ff5b314 legacy-trunk
+36984 d7fcdf9776c4dfa4b7d23bfb626eb9ee72ffdc5e legacy-trunk
+36985 920f5f64f2f0fc8038a27d4e2da8c196bba39441 legacy-trunk
+36986 0140785befdb36d0c1b042e634eee4a55829154e legacy-trunk
+36987 6c16ab4214af8e8e50a803370d9bd4fc8f2b17d7 legacy-trunk
+36988 dc647df539217a595cecb190539cfd62cb8972a3 legacy-trunk
+36989 3a7f82e60cb2292428502714ab077f821f9cdc72 legacy-trunk
+36990 ccd02bd344b38b0e9e2624237768ea12b28b17ee legacy-trunk
+36991 eddb37d702b5e05223606ee1fc4285583ecff7d9 legacy-trunk
+36992 c2384601a241117d1e77fd5482f3f4040ba84149 legacy-trunk
+36993 ae9b47a8d6484856f0c8de130c447b1f4235ea6f legacy-trunk
+36994 8a282797895f3f125d3595ed54834f19ba600c87 legacy-trunk
+36995 846ba2972d7c1bdd4c4da638521245034fa6c808 legacy-trunk
+36996 e4992e930cb2e5961801a44190461bdecdd8227b legacy-trunk
+36997 3db9a932775e60a6af7dc273d46c5ceff220b88e legacy-trunk
+36998 fc1637fc45889fbc92d752363063b1b3566bfb69 legacy-trunk
+36999 7375ae5f9dc4d5f59edf09747e5c51b4a26eaef3 legacy-trunk
+37000 1d9835082be5aeca6a5f7ec26600759c24a4c5f2 legacy-trunk
+37001 ad268a8408f4f6beb572bed30f592abf5debf5c0 legacy-trunk
+37002 a35e4d35d142512cd28d6285144f4614f0a9ba9a release23-maint
+37003 3beb54f9d2bbe8827fea76cd4dab6669e4da4bc7 legacy-trunk
+37004 2893dc9b4ef4dad045295f156885a6eb3732d20c legacy-trunk
+37005 22fa96c413aec3a15878a66e0c4d40051934c9d6 legacy-trunk
+37006 951ccd8f342886ebb60ac82b18089a242bd54b43 legacy-trunk
+37007 8779c8c4d181af4752cb91d815b72004941904f0 legacy-trunk
+37008 9c841caa0e814ae6f4965db5c94d982d5fbcd4c4 legacy-trunk
+37009 28a205ecb4dd80564762334617f1ffbfbd0dbd1b legacy-trunk
+37010 8e87a6834942e4efa7612b19c59a2d91ea9d3194 legacy-trunk
+37011 8c0b08b2477bfd3a851c65bb37948edd9998852c release23-maint
+37012 612de268ed4be0be33b5493e3969ea9a02f5562e release23-maint
+37013 fd92ea8b5b51bd1a646ee4973891e4b8c61f7caf release23-maint
+37014 7aae06b1f1ddcb3679b4175b1d83a32213ba58ea legacy-trunk
+37015 ff9d5a72d54b720800f88c5488e700d2adee4451 legacy-trunk
+37016 b55dbccecc715066601dec3aed131113934a5e1c legacy-trunk
+37017 4b5b6e861fcf6eb3b98126afb7c8f96cb3bacb1e legacy-trunk
+37018 933548fe7b97b0a2b6371aee7cf273d923a205e7 legacy-trunk
+37019 a362016e950d50c52c8f9e44782f1df929e11f60 legacy-trunk
+37020 2b8bdb069e0aebdd6fc09352e871fe0a78a51549 legacy-trunk
+37021 b2f427db228b146f521e8edaf5849a293e288752 legacy-trunk
+37022 3f9d21ec504b4fbfda70fd149006c673b5ad86fc legacy-trunk
+37023 a059301a4cde3d411ebf2d6783a2224f09abdb76 legacy-trunk
+37024 ae4cb2947400eb2af39c3be94cd4db2fc5ae7920 legacy-trunk
+37025 bfb291f858715a77ee0a27e5a2d81b4980c47310 legacy-trunk
+37026 208fe719c749b51eb27f88b3b9c0ff5fba003087 legacy-trunk
+37027 6f09b520c01c590fc8a1030d7787274fb2b7b1b5 legacy-trunk
+37028 1d6eefbcbb3747e0d2b909bd70ec0793ca6e219e legacy-trunk
+37029 357b24c346bb0d668eaf6e56de104f94ef749e20 legacy-trunk
+37030 2e8d2bdd33decdb68e84b958e3f5707b09968f3b legacy-trunk
+37031 96bf402488c70a61530d4f3a83c5bf851c23bb2a legacy-trunk
+37032 bed45a6b993ba94ab3f1799dcd8860763eff9eec legacy-trunk
+37033 5778f6331334ce36c3d8fee2dc32eeb35d7b9362 legacy-trunk
+37034 a5769e8f1c6fde752be0845b0e806b747dc93065 legacy-trunk
+37035 4cd77de551e745b1ae10ce0066fbc285a63ed657 legacy-trunk
+37036 1f9522238c863217b15a49cf6f092acdc5aeb58d legacy-trunk
+37037 e05e9d05830d091c3f8f9431f3ca47f6c93e2f92 legacy-trunk
+37038 f6fa649fc4af74d3fd3a3675d2f20f1ca82ecd49 legacy-trunk
+37039 a6c80170fc5382f939281228b68c4099b69d5fcf release23-maint
+37040 4536b03151577b954efca110c27aca81c3201134 legacy-trunk
+37041 17973f2e3e0e897c749dbb291c9e5643f19c87d7 legacy-trunk
+37042 666557c2924dfcfb16d2b5ac4a3f4a1312ac3aa1 release23-maint
+37043 a2514e2d1c74e06d97b6f75715a027232301fd94 legacy-trunk
+37044 aad1186435988b2ab9cb6de8e990f8c6031b74f2 legacy-trunk
+37045 0d1627c447690cafd3bbe06e31d871a3ee251e87 legacy-trunk
+37046 2965ae94a23fe341cb7c0d95e82e7cf5a755e416 legacy-trunk
+37047 4401dea724f0afc16526afe011c64576aeb5077d legacy-trunk
+37048 8e917b9e70e7d7c81e3d925cf8d53101a9da3e40 legacy-trunk
+37049 feb5247ba0c80b22682e58a72a87e27a37a62f29 legacy-trunk
+37050 4c78fcb60df3091c1880465cd746160c6219777f legacy-trunk
+37051 35bb62ac55feda4c2c57e3fee262433505c562ad legacy-trunk
+37052 0feccf19b16d5c4c0da41836c73f342ad9e4dfd9 legacy-trunk
+37053 de804edf8bcd57ee9d03e24c1522a93284103a01 legacy-trunk
+37054 b0f2681bcf7fa740dd15cdcb75aeb921b4fdd0b9 legacy-trunk
+37055 edb853ed6c78b3505266938c1bdda2f4721b112e legacy-trunk
+37056 bbe68474e5220d76f9d3cd537972056fe5ca8532 legacy-trunk
+37057 d2883c42c204c04f2467fef87d89012ece7d0d18 legacy-trunk
+37058 096de45827c7b674bfefe6e3527cb027d039756e legacy-trunk
+37059 7f57b3c7ebbffcb5e8e8de413ba3eefaea008e8f legacy-trunk
+37060 934a5db9b95b61229fd8fa7ab8b2b4da0b6b9ba1 legacy-trunk
+37061 7da9201bc8b532c6dc36997a2667215da5e388cc legacy-trunk
+37062 017227e47c3def31b8c018166d8f2acf7f32cae9 legacy-trunk
+37063 ea4874e021e80eace64f812fdea87539fb1c4452 legacy-trunk
+37064 26563204660cbcb8e244493d79bf02cdef0d30c7 legacy-trunk
+37065 347d71c0e018dd179150534a37b083f7c03933c3 legacy-trunk
+37066 1d0f4c0357d004f29efb15b65a86fee8b4118a6e legacy-trunk
+37067 eab21fbf9a70f970dd9d0b1d064838fd80149a10 legacy-trunk
+37068 c18aca7e81cb5f77768ea9c4b4e8f1f655211c05 legacy-trunk
+37069 90569ae3e3f3f1cde10d7afd57d87afc39f425a1 legacy-trunk
+37070 69700687e30f515a644a42c09a170b6b1411dd67 legacy-trunk
+37071 bed62f399dac0bf5471e2689ecc328ea3fe99877 release23-maint
+37072 04864c39b006333f32ac249ea18e276385b99354 legacy-trunk
+37073 34a8d75edd2b03a51a7b14181187414f6cb1b44a legacy-trunk
+37074 16dff30e66ec0e5d8c8b778dacdd0ee7ae30b077 legacy-trunk
+37075 c9b99308b0e8cbf90f586f02c8ca191454622441 legacy-trunk
+37076 94230f6b5ebe52f632d12732df54ead708b08a8e legacy-trunk
+37077 db1bafa9b656136b87ce7bc13040519374268932 legacy-trunk
+37078 d9765eb59edd7855cb664cd3c243725a0f2a07a4 legacy-trunk
+37079 8d77134aab82f408e26b8ea780964ee326f97487 legacy-trunk
+37080 6b743cbc41710e6264e8cfcb424cbf915bf330fe legacy-trunk
+37081 8252e989cbb15bf476b7aa52f2f0544cfacb18e7 legacy-trunk
+37082 066c7890cd615530aaad3aa198595c23b1061df8 legacy-trunk
+37083 d861aa8745255887e1a63a81c95fcccbb70ffe82 legacy-trunk
+37084 3235e739bda12ef18977c08cbb18510382f842f3 legacy-trunk
+37085 acd9bf2e3bcf5159bffed79927945fbbe1f958f1 legacy-trunk
+37086 e6304d66d945b56979d387b89a61436cb998dab3 release23-maint
+37087 8abd322a013ab68cdcaa6de3104b93eadb3f7503 legacy-trunk
+37088 84931080e05cc3f9998b754bc8921ee991778613 legacy-trunk
+37089 57a66d700c7cfbaa66a3b47cdc6eda2a3b609889 legacy-trunk
+37090 0a8d39aca98c5feccdf7c91761e74047f080e4a1 release23-maint
+37091 a1cf4a29ac3007087ea898fe996256f11382303d legacy-trunk
+37092 40b5aee20b83172ed34b41a816fba7ca629b2291 legacy-trunk
+37093 7fec0662cf4aa2ddfe4db7fa0a5498dae7c01747 legacy-trunk
+37094 9c570af5356e7e1b76d91aae403bc03ce638a7cf legacy-trunk
+37095 dea98eed8cf0c8aff36284117c583247f893dba8 legacy-trunk
+37096 69976cf591495fe84aeca9e5bf565214efd84045 legacy-trunk
+37097 77d3642eb87be7a87396f14131bb2758b730637b legacy-trunk
+37098 ab34980ffa1690a953bf3210e3ba73af55addac8 legacy-trunk
+37099 f9f4b19dd755d901ab195767955971cf3b15c41b release23-maint
+37100 22b63ed2d5b2273fbe9ea0cb09804e75871fd1e8 legacy-trunk
+37101 2e0966dbd678b28ea85d9f388189d9119a38a0eb legacy-trunk
+37102 f98e59f2f89d091e40aef56dc4b63509836073fd legacy-trunk
+37103 fb9869044bba9f721789acecfedfe8c7cf064640 legacy-trunk
+37104 71427915796edc1c3352889e0cbe5e8aa58909db legacy-trunk
+37105 2caa6f19a2e66cece8db1bb0a8aa291b447453f8 legacy-trunk
+37106 561702350e09807b3c528cf9ba02990abbf55809 legacy-trunk
+37107 cd2a95cfc7eb48aaf5ffa43fb3407ed17056087e legacy-trunk
+37108 395bb3746d1d4e066478258f750b40c250282b7a legacy-trunk
+37109 84acc77c06b888a86fa491a002ee15ca5410907a legacy-trunk
+37110 03440272028c79734b981f2e51b2af5701f81643 legacy-trunk
+37111 98db09fd443cf67b5aeb3e6a08c2c3a2a7dfb52e legacy-trunk
+37112 1f9b9c226b43ed20cb61e6d21aea6cb966e8bcd3 legacy-trunk
+37113 c654334dc9618ee05cff2583731b1d05e65f6a09 legacy-trunk
+37114 12ef56f88a90be5368c25c53733738ae74f07bcf legacy-trunk
+37115 95744a4208a270c05b9c9548c111659bb0d8323a legacy-trunk
+37116 377c518d848343976b9294790132f63a38f1c6f2 release23-maint
+37117 8dd35f5c79282a722b69584e18f06f3972024170 release23-maint
+37118 b4cb49829d3eeedb0f4b1c2770684ed5d8f5d80c legacy-trunk
+37119 3fbd2d1ca5bb60d3a6709b17eb9c1af066a81d33 legacy-trunk
+37120 6641d05425927f2afa6c100e0f428e35521c9b1d legacy-trunk
+37121 11a4fbc88a800c5e1a348b7f5fd4961b623b354a legacy-trunk
+37122 993fd8acc90f284733a088a5da0d8da34ac5e6eb legacy-trunk
+37123 b63b30821ef478d90eb8aae707423e3b3287c07e legacy-trunk
+37124 965e96e1529905637e7bd5f2f17b9b834c2739c2 legacy-trunk
+37125 1cf7d7225a996387c70656818145fc1522cc9e97 legacy-trunk
+37126 7a1fb316e65522d16c7674a7fbf2f805ce2bba3a release23-maint
+37127 8cd57796a9cf810bbed8e17541fe143b068d0506 legacy-trunk
+37128 f1072a30bb58108e8d776e7fa10cd3d3db77ffa6 release23-maint
+37129 b045070172cb2f759e35ca43d3ca3f5f1f591a99 legacy-trunk
+37130 4e9ecbf47b6ba97c8b75c2ae1e354d07cd8183c9 legacy-trunk
+37131 d675e3e0fe7968ec17064488332fcbead731313e legacy-trunk
+37132 a47f3d2ffd22154ff78df95fb628f8bd063d2c80 legacy-trunk
+37133 0ed4fd7a0e2e0f503f2decb73dccc424b775de6f legacy-trunk
+37134 3016471ae5489bbf9879c1d73cec2fb0c03c26e4 legacy-trunk
+37135 3dbdbd572d9412927e8836520310e066135ed913 legacy-trunk
+37136 bac997b79b1925d6b892d3f8b4cf980b8327e5f1 legacy-trunk
+37137 4ca9fa2353bfa43b386edbed2bd94804f5be3025 legacy-trunk
+37138 2727718e9e8f4264fb6d17a17df198e2ba1cf3d0 legacy-trunk
+37139 a12d984bd962d952dca07fa64b49b3db9d494b0e legacy-trunk
+37140 8d1b4cd8a12454ef6caa0a9c501cd5e5e2ecdb5d legacy-trunk
+37141 0c734932c6f41ed2d50fe3c067c20b7db7d27a45 legacy-trunk
+37142 2b136441035c833ee4bb25caa78c2c01ec78db9c legacy-trunk
+37143 b25cb2045dacb097dd113ee8add7c110ae6796a7 legacy-trunk
+37144 826ad896a7a5c35ba04b53727c52ba7d11f26d53 legacy-trunk
+37145 4aff1fbce7524f1c48f8d12b171b0f974ff7132f legacy-trunk
+37146 eff766e29c5525a0705f2bde6c5dbe7e992e6240 legacy-trunk
+37147 2747dbd5938b56f8d97500eedf46a01ba7695ff5 legacy-trunk
+37148 345fac66daa9b173dfed2d8a391abc15c5574894 legacy-trunk
+37149 ee703a094dfbdf100a9dbd9c35037dce6932f3e4 legacy-trunk
+37150 e586cbecdeba629033d785d01533515467946b1d legacy-trunk
+37151 449141aa011c9a436137dc9998317bb951295907 legacy-trunk
+37152 8aad5296fec960347095e1c475f804cf20f46789 legacy-trunk
+37153 ff88da400778589c329382b9effdef2e176c9f2e legacy-trunk
+37154 8d276551cea972a0b7e1c17426a642338e651f84 legacy-trunk
+37155 4b00ae1efdd86dc3934534904f5cf26498e80089 legacy-trunk
+37156 8a4c3054a36c946f48138dc6ae8b5f3deb7bac35 legacy-trunk
+37157 5fab4f43b94f7371b5c00da96bc7e88644aba208 legacy-trunk
+37158 67fbbeb1e2181e002e410a84bb98f891f255e991 legacy-trunk
+37159 e07a6234b73b1f477580fbcb27da25158c602f03 legacy-trunk
+37160 3e25d6e3da19485b9ff8b0491e82719e3a6777ad legacy-trunk
+37161 96d538488aeeac3bfe6639a79414b670741f9de8 legacy-trunk
+37162 a37ae7dba814b73fa5301867a5c46ebbf7243297 legacy-trunk
+37163 b2910e479f07b11031434b11544672cbbfe03d2f legacy-trunk
+37164 77de38534d2632876463d5beaa9796389033097a legacy-trunk
+37165 b1c26e89c464d6a89c67baceee1598e594ca00e3 legacy-trunk
+37166 e19b00975d5e862f0aec9815f2536c35997ec397 legacy-trunk
+37167 521b8795df9be4881002a1779ba3e55061bcb873 legacy-trunk
+37168 4b32489c34a7a11d5bca895a66f174475082fed3 legacy-trunk
+37169 78b578c46770e50e6028fcbbe7f542672c98065d legacy-trunk
+37170 7f617025565e80f07555ee937772cc6ad74b36a2 legacy-trunk
+37171 cd15642309478ed5e0da6d3524695d3813f528a5 legacy-trunk
+37172 f28072e64f8176743dc038bc3ad4be512b91d0fe legacy-trunk
+37173 598050017b5e401d020210a1aa40e3b538798d51 legacy-trunk
+37174 8579859f198c78ac143ee67cccf92a769d9eb525 legacy-trunk
+37175 59bd121eeeb71c75cef8a3c8853f788f250872a9 legacy-trunk
+37176 bf0ef5fc49f1e8772a7fcd3d5f99195a0fd2338f legacy-trunk
+37177 542a5efa4883ba2668d5a04447f407b346234216 legacy-trunk
+37178 2f52df17395295b64263038a0bc78e91f0f7afe1 legacy-trunk
+37179 96bb46691e860632d23394b3bbcb38005a0643d5 legacy-trunk
+37180 0b181bf230c93f6617bb503fb4b05b178755ed74 legacy-trunk
+37181 cf0ea19869af5ea6497d3588a8d3aab4bc146b57 legacy-trunk
+37182 b57612f61ba3f3ede1a92e275bf0725d15ef304a legacy-trunk
+37183 6d3bdd19beeb39946bc690828278ac3756c2b9cb legacy-trunk
+37184 d5b097608c9decac5d2083c8d67f812bd0039f6b legacy-trunk
+37185 3ee5dec0ca07ccc35fe12d19540ac6a3a8bb8584 release23-maint
+37186 1ba7469a3b49b4d0d4f2ff1d721e7a2a9b78b13e legacy-trunk
+37187 00b89ab44cfd7cf40ef0e41a4d104d9ed31416d6 legacy-trunk
+37188 a25af68d71fc6d4d747b102af114c4f294eb75f8 legacy-trunk
+37189 1768aff92864d68c8bde9785dec6c3221309e9c3 legacy-trunk
+37190 787fff51bf2aad2833a63ee9f77836062a270436 legacy-trunk
+37191 5452d4ecddd0c47ffdb32504edc3874101aa1fc0 legacy-trunk
+37192 fee592fb56436d929199881cd809375a86618084 legacy-trunk
+37193 97fca735c8da6f9db1a8e78ff2a956e931cfa3d2 legacy-trunk
+37194 20881505c1427390d7dfaa7597777a025b2a83df legacy-trunk
+37195 d538ecf0bc6984adcefb8171466460701b2e7221 legacy-trunk
+37196 062177de86858a7e0fae95c2109df5afa580a59d legacy-trunk
+37197 fc0b45755743276511857aed3e509a7e3245e50d legacy-trunk
+37198 04245ef53949c1bd311166d49d9e2ec1bc39d721 legacy-trunk
+37199 505c9063850e4c43b0af41677719e3b6473fdbed legacy-trunk
+37200 84fbaaa20358a70ef12e3267024c4a4dca675be1 legacy-trunk
+37201 05c125c987672075b569a3fd2642de1568b59c54 legacy-trunk
+37202 00e619851a569748ad47ba26036c45277243d3d6 legacy-trunk
+37203 b7acb970f536513d3e4f12318dbd0a6ece0e22c1 legacy-trunk
+37204 f30993d058908eb0b7ae3e19a79f5b958bd0dcce legacy-trunk
+37205 68e68ed46f0e9af742ba031df4edace4228e0502 legacy-trunk
+37206 d9e03938a333bdb9542df5325d7819c937d63e01 legacy-trunk
+37207 d5c34dbc36182f9fe54fa9d0bb23cbde86ddbc0b legacy-trunk
+37208 0a79d7a9040c769afc5eb9344d0c0eeb991869af legacy-trunk
+37209 e5b4fe97f74d1586b1905f65eac8e757060bea0e legacy-trunk
+37210 1a54fcf48fe4e644fe18ab1a567b42d48780452e legacy-trunk
+37211 dad827794745cbccd411ce8480f55234894fcf71 legacy-trunk
+37212 adc66d314c78ed16dea11e445e8aba3366b52506 legacy-trunk
+37213 ddba154c0e000ac456b0e73e55988c475fba989b legacy-trunk
+37214 c44f083465f9c5aee1aa3c62068effac750d6e5a legacy-trunk
+37215 cfa72a8de143990caaebaeacd426d9ae3e8e3530 legacy-trunk
+37216 128d528457da565f96d9dcf1f644a4b3365eb1cc legacy-trunk
+37217 f7474d31ba3fa9bf0c50799446f9bf2719bf4d6c legacy-trunk
+37218 23df6cf29650d45aae1c6b62a7f9ee55bb2b82d4 legacy-trunk
+37219 999d31ca8a19f7de0716b3f7b83bb30e0517760b legacy-trunk
+37220 e56192e9fd7e7e493fb0025a6be1e2e7e16f9f8c legacy-trunk
+37221 1dfc97e2acdfe4ed070f9a28cdfd37751c1a24e2 legacy-trunk
+37222 96040250694072bb97d80ec489b2aa9295b0d027 legacy-trunk
+37223 c9a82e9b7b4d18516ea2cc0d24e8c5c9ccb4bf34 legacy-trunk
+37224 a6eac3fe542f930c8e6131593b4f3ecab0ce7bfc legacy-trunk
+37225 03be06bca160fbc9c9b58a8313be15346294cd93 legacy-trunk
+37226 268c5f83fb877aa41703eb3bed5888b8e484a239 legacy-trunk
+37227 26e4211865ed7b390f4e9411289a6ffd566e73cb release23-maint
+37228 0f53ba159e54e21ef557c04684c8e66fef746f04 legacy-trunk
+37229 b10b7b7afc00d9b08ce83393bd4204a05694534a legacy-trunk
+37230 3540e10525a1aec67bb1603bf88a1c5887bb1722 legacy-trunk
+37231 d0c01e0fe2496757dcb6ff0b85aee1c3c987bd3e legacy-trunk
+37232 d41256a6f2ceccecd20314bb344dd5312f677493 legacy-trunk
+37233 5f0c7f5ca6f9f1194111b87975837332b2acb280 legacy-trunk
+37234 af65004f622fa0d88eca0337fad70625a0613c19 legacy-trunk
+37235 ad43df19784c5e44d174e1379af6c76da03e9e17 legacy-trunk
+37236 b20d455586536d342cf7a2e7156840f79f5b4f75 legacy-trunk
+37237 76a9bda3028e86da48aafc55803859c2a90f25d6 legacy-trunk
+37238 ada2a66b86a4a17b851c1ed04a59613b34a9e103 legacy-trunk
+37239 1246422203e878652c500da90b41e649da4376ec legacy-trunk
+37240 9465fe6782226643d6c57ed515b2c5d97efe7671 legacy-trunk
+37241 aee2ee745f2c5d98d86c06273e69bbf973131ade legacy-trunk
+37242 7551c725fe96a01a24069286d2c9ce86f9dffa43 legacy-trunk
+37243 fb61403180a85c47690a5db5497479f0603304e2 legacy-trunk
+37244 bffd494354ee702a1b69943336f9422e446461ca legacy-trunk
+37245 f0053a6a2bedddb9963d97d9c644a0ebbd95f441 legacy-trunk
+37246 3e062897d2e7a91073462d3cc0976aecb68f16e2 legacy-trunk
+37247 df4770b7caefb47b999814c1bbf7c9aafbafadc5 legacy-trunk
+37248 43852c9631604149271d4474496419fbb39cb3c0 legacy-trunk
+37249 9f2ddde93a6395d62dc723d5cfc62085ac63a6c6 legacy-trunk
+37250 c2c49ee727d0dd3477b88d9ad05b4d9987140e4e legacy-trunk
+37251 943c22a7c701b2730bb5ea9e26ca8ac65de3c18a legacy-trunk
+37252 1100605870feb8c7a8c124c0187814a03859ef08 legacy-trunk
+37253 c9168e79ef4cc2db2ed1f80fd7af0198ab362770 legacy-trunk
+37254 d113c613567a9e52c07c489db68f3c6050503623 legacy-trunk
+37255 2281140d20c75c3e2d0877fac3e7ea4686914e9d release23-maint
+37256 f83c5a8579f848b7a059c35b166b16e441c1bc52 legacy-trunk
+37257 eb9b380253c99d2035bfaf0259f159107d7fec5e legacy-trunk
+37257 186b72550e53533ef6175f6411f932c1298193d7 legacy-trunk
+37259 b14f7ee25d50a934fd52cf15b98ade6786d9b80d legacy-trunk
+37260 534693bb010bc2f9be67c0d102b31e75cff6182a legacy-trunk
+37261 98c8017e8535b927ee1c6ab396ad82add020fd42 legacy-trunk
+37262 d1f8c632b605a5fb60a0c4c7e783195490309865 legacy-trunk
+37263 3fa79cc9da5da290e1042744aa97e5464965ae4f legacy-trunk
+37264 b9945335da272c28631de5b9f0b3b55923c0dc9d legacy-trunk
+37265 4745f847cfa14514551d828e34b633a7a6cfc13b legacy-trunk
+37266 df1cd4072177dd2e56fea114f139078286da294c release23-maint
+37267 5ed56493f0b0160353b2c57a47efe976bd4705f3 legacy-trunk
+37268 97c207db90a1d07db69ebb84f592b404e001fa0b legacy-trunk
+37269 21c79340ded5de0038ebb78db30cb0f19d9877bf legacy-trunk
+37270 483c0b4b63328f29e79e795bc8e981831bdb7145 legacy-trunk
+37271 6ff1a5bcdf22d4304e59ee13f50c191bbca6538b legacy-trunk
+37272 07845568287572e08ffa6708a7a5a4cc042d7f66 legacy-trunk
+37273 8e23bd3d5b1a70faaec083a7edfedff0921f9488 legacy-trunk
+37274 fc2ce580216c8dceedae80ad7a2ce27d2f45f035 legacy-trunk
+37275 136b388569a0c460c638892aaec920792d6f9abd legacy-trunk
+37276 c09318b0090d6b97b55b204c2698d4a1440f3c98 legacy-trunk
+37277 e1ab2c12cd5ef25f0d189d0c0b6018b7650d45f3 legacy-trunk
+37278 8381d073ad386b313c48144e2ae8ae8320f0fac6 legacy-trunk
+37279 dc97f581f23341164348e4ab3df06529b7300813 legacy-trunk
+37280 5b6fba6454a09aa870ceb88e36eaf3053810de6e release23-maint
+37281 ad00f7c0ad07426ed322b07bae231d5680439afa release23-maint
+37282 767a38dcb3009446feef3bfcc54e8d689a2f6230 legacy-trunk
+37283 d9a33ecbc7f28aaab07167a9b21a591a8de52a0a legacy-trunk
+37284 30e273841bae0b38d068e2bb0fe5cde8c5566426 legacy-trunk
+37285 b6e875aa508bf8201d753f3585b933174ee72cb4 legacy-trunk
+37286 71083a1725cbe787cbe5b20c84455883790c3f69 legacy-trunk
+37287 b5f6118317d0d015da591da74478e97132759c9d legacy-trunk
+37288 6932943de6b1f59bf765f965d7f78accd9550021 legacy-trunk
+37289 3afb67d9742b7dcf6245f171a194bf7e4e3c978b legacy-trunk
+37290 ab62f76ca8e2cc3865fcefbefebf9695b6d5e996 legacy-trunk
+37291 8480b72aa624da338823574a3313b8eba6380e99 legacy-trunk
+37292 57478a13fbf644d503da66b29111db2f960c29b3 legacy-trunk
+37293 21383fb1a8f291ccb97d132971f747ac7bae2d07 legacy-trunk
+37294 96d3efb940cf343c21b3958204cf286b877081d7 legacy-trunk
+37295 cd070ffc892d140029dd62b51c0358d251a8800f legacy-trunk
+37296 4b708fa0a60ab5d172b87b513f63a250ee511922 legacy-trunk
+37297 06abdcd57fa8d39c08cd3799ccb7f3c41d236447 legacy-trunk
+37298 68538e124ee0a9b3fe6318f6b0d6c51418724f94 legacy-trunk
+37299 30697f446286d091e99eff88ceb2405e9a86c3c4 legacy-trunk
+37300 897a363f0e86faa7c05fbec90015080e99deecea legacy-trunk
+37301 fac2a53906f1705065a9fd086317adc1b8c9a587 legacy-trunk
+37302 a243296786ce7840120e53773d144eb5a6418c6c legacy-trunk
+37303 629200d880ea28bacdc175df216aafb591eb47ed legacy-trunk
+37304 5b31b4c3b7bac5d41c0a130a955370165c39e59f legacy-trunk
+37305 e4489d56f10902074728c5bf4f08f19a294598c5 legacy-trunk
+37306 4daa7c725a798eeca878832c6fa26c4552fe9d00 legacy-trunk
+37307 f24a7fa38f4f91befb78ee4f4894defb0c230ebb legacy-trunk
+37308 7bf43be829f7e7a4de449beaed817fd9e6bfa72c legacy-trunk
+37309 cadcbf962a1fd67a42c16ad73c4759c7f2c74fa6 legacy-trunk
+37310 688d981c6234b13455a669a8ffe545d346678f0f legacy-trunk
+37311 64d4e796b3df126e6433f28a0565ff5e68b117bd legacy-trunk
+37312 5570fae1f01cd053a2d71cbedcd77c7e19e6e971 legacy-trunk
+37313 324693ef320a587645b12588ab3ca2a1a1158b7e legacy-trunk
+37314 81618a7d490e71d819d4fb8e0fe9677e9b45946e legacy-trunk
+37315 25fb9e5f5f45333307ab9ea4545c3873af4c10ec legacy-trunk
+37316 e83093abc958d04fc5e393955341f2d5e4f2debe release23-maint
+37317 7a7516e6feb2f5f13ab6ef8970515f8b22247287 release22-maint
+37318 3daa6633f017ef47f68fb008cd05d15f3d06e733 legacy-trunk
+37319 9e3c52ca3a04d3f121f2b3fdcb743ea5354b64f3 legacy-trunk
+37320 487280cf71b95d0219a835559a403dc8c83cb18b legacy-trunk
+37321 016d7016c6c63d505f9190845512e883234aa3d9 legacy-trunk
+37322 91c87cea77671160da9033d763c9a1da6f6e1706 legacy-trunk
+37323 9497c58126be400afaa7d27fda9a6dd61ba75bf1 legacy-trunk
+37324 dce624933c387ec33b9cff37ef4659fe2686a4c6 legacy-trunk
+37325 c8825a74e421f1fb3ec9acad0d383d55e69bc080 legacy-trunk
+37326 5876636ca8c6ccfb14024535a8225fb80b7ed6a9 legacy-trunk
+37327 28ef5fe0b8b5de31898444a872dde11b560ebd96 legacy-trunk
+37328 d8a261a770283b0314ad78ecd80d4b93b386127b legacy-trunk
+37329 eb51728ed11f0e308ff055cc7b921e5b95ecfc95 legacy-trunk
+37330 477cd0f622b9edaeb1d14e7289e218c382f4e481 legacy-trunk
+37331 e23ca94ed8edb1f1d73138bb00dcb1184a0ba3d9 legacy-trunk
+37332 a04515a98831592e208e567ed6bf112c114bbb20 legacy-trunk
+37333 925cf9b3285bfb8a3917c976ffeb70e28ec76210 legacy-trunk
+37334 7473a195d2231223820d4930b2b7d444c2c98063 legacy-trunk
+37335 41dbee5ed29586cb9843f0c10d8ec47096d9345d legacy-trunk
+37336 36767fe24252b14da14c05319a53304172c5bf79 legacy-trunk
+37337 3f86f2bb9b56e8473c4820423d225fe5be66995c legacy-trunk
+37338 7fd22ecdc9db090350d24d8769a0f2606587e609 legacy-trunk
+37339 4d16785ba5dc1c4bfd7b1a521355cd236e70ca78 legacy-trunk
+37340 e808cd31fbdc6a09ea1f31ff11b7e6534b1c4f96 legacy-trunk
+37341 a220073536d69a752e7ada825c33ed49601a1ebb legacy-trunk
+37342 1b3ac674a57cbffb33dc66897821a9f1209a7aac legacy-trunk
+37343 b87eaa46c9cbf1de5576a01d77ee64d170e2ffbf legacy-trunk
+37344 5373a5aeb80022b3ed30eb30828364815bca7bb5 legacy-trunk
+37345 eacdc29606d814492e783bbd69e17b8f8e54decd legacy-trunk
+37346 2623668c5ff5b4d6086faf8bf72398c90f2e8692 legacy-trunk
+37347 c93d2bec68bec48c5da6227deb09abf4770606fc legacy-trunk
+37348 18c7c17ccf86315754fff69dd876d068ee10b720 legacy-trunk
+37349 823d645b32bfe3f36f4c9670e781e4ca1bc220aa legacy-trunk
+37350 53c1357c9c63d54e82bbb50fc49f9034f22fb119 legacy-trunk
+37351 cfb2f5e0974093667724ff65381db08c460184eb legacy-trunk
+37352 71ed4b35fdc48876d1abe9139c8e86e71e99f400 legacy-trunk
+37353 4cb1016525b7def5bd669f720bacab5edb80fe70 legacy-trunk
+37354 7385ba2680eb71bf79fc585c2911c556ec93e232 legacy-trunk
+37355 0c299cabf4f06c847da5243b64eb2b50270c17db legacy-trunk
+37356 294d370e43d14dd9154bc7ee291b9db44d58784a legacy-trunk
+37357 433606e9546c35b8e6b83e86c6898f1c24d85e78 legacy-trunk
+37358 d984cb7e235236fa7ff6e60628530a01d54a4f24 legacy-trunk
+37359 2d6e1854082e94854009403cd5619be07f98cbf2 legacy-trunk
+37360 9e2b94a3b5dcc0f18fb93d5dd0fb445d9816bd35 legacy-trunk
+37361 c3ab6f40b6e8bb2aa33186448195ea19dfb227e7 legacy-trunk
+37362 abbdbba56a8b73d035f840b5c773693f56103d7b legacy-trunk
+37363 a4d3673bcd66473068b2eea46347192fb0f0df16 legacy-trunk
+37364 da1da331f64ef8edbf95be71a3594d66f6c39d6a release23-maint
+37365 af9bedd5a8e721067e264fcba274e0d9a88fbc4d legacy-trunk
+37366 a70b3ee2e30b89f59b088308b5b4aaa4c012a500 legacy-trunk
+37367 45c5742c1e13ca4b3eb4fca981c3d60d9f40c1fe legacy-trunk
+37368 78c1c03779637fc64062dbfd203fb967d7fe0b46 legacy-trunk
+37369 cc0ae03743b8e2da3924508f052f99a38db1c818 legacy-trunk
+37370 4b8198a7487312b89534bfebf9d8540a5a1e1581 legacy-trunk
+37371 725c44421a42f59b79e3826b2a03f4dfc88dd51f legacy-trunk
+37372 94f500ebf60a45f6e58cd115e4d9d8017fcb6dfe legacy-trunk
+37373 1f540bf9a9b4027bd82ccd62005e5d4de0d4a350 release23-maint
+37374 322184ef7622d67f3a2108d27d02c49f74b7312a release23-maint
+37375 03edb63ae0718f4f5aab09d3f58f9c1534e79b2d legacy-trunk
+37376 11d4500be6fa418e59f02b5a5ccc4c0a320c026f legacy-trunk
+37377 f4640815e5bb500ad3378157c517448797ff08e2 release23-maint
+37378 6b3da47bddd68a445a1727dd4753b2982d0c6704 legacy-trunk
+37379 a77257e54996aaf5ec2e012a8adebe9c6870c399 legacy-trunk
+37380 e9e65ef946ecad26d78770beca26ede806ce5b85 legacy-trunk
+37381 301265b80c41442cbe28b0f06c13e54641a0401a legacy-trunk
+37382 d5296159f11cf4da50f45f3e61a36b1793c888c6 legacy-trunk
+37383 139a4012beadafc9383e059226519a6b7468b4bd legacy-trunk
+37384 3e17aed2324c317c01dfe802af4e15bc47fafae9 legacy-trunk
+37385 55eca7cd3531dc6a28d6478f4973bbe873ec0172 legacy-trunk
+37386 06f28238df31159c26a8ca4e5580aa0017e83b12 legacy-trunk
+37387 d83670f24d5cc2c3b4a42819fb94652f89e73ea0 legacy-trunk
+37388 30d428f992f9a970a1a5ba1c260c6ce894619c49 legacy-trunk
+37389 d3d6d42009a8c47a58992b58c1c6178ca0fb5fd5 legacy-trunk
+37390 175eee09cb98180ab899aa80cda4f61148e13c0b legacy-trunk
+37391 1809abd393426378004d91347205c2fc95d1c6b8 legacy-trunk
+37392 a3fb5ebca30d71d63fa6c7945a0e554f3527ccff legacy-trunk
+37393 25e07c44e5d05b18ed80dde08ca458331b9449f4 legacy-trunk
+37394 8f64a84fa8e6bef72ca8febfebed4f55ace3fe20 legacy-trunk
+37395 5ac8afd8d904065698f1d85f08b1b41deeebd9be legacy-trunk
+37396 695e5bb08382393d93550717223ba0fc3ae7d21b legacy-trunk
+37397 e7fa7b5c9441c39d28cce5dcfe54a3f8ef121b8a legacy-trunk
+37398 fe242f69a9d32822af3e035e2ef422e9bcf05d36 release23-maint
+37399 ecd654daaec9f00b2a490c27b8812d4f255d1d50 legacy-trunk
+37400 92dca98cd434314f5f492c2a9ec20e325545a02e legacy-trunk
+37401 526427e883e8241cce19f7c47a278bfa8e2c0caa legacy-trunk
+37402 bd13a478e8d61dfdd397bf0b9a171c527fc9bf38 legacy-trunk
+37403 2b49b4a85d9eb4a4cfa9f29c21d649c383945671 legacy-trunk
+37404 f6789b7eab4e30bccb851c42eb3c89b5580499e7 legacy-trunk
+37405 781aef97446388b38ff43d47410278e96bd8dcf8 legacy-trunk
+37406 d74ddcff07244776654e23a0c91fcc4dbf9cc8b6 legacy-trunk
+37407 a3d78d6bca51924237c2d49cc77416c59f3ea78d release23-maint
+37408 d6071a05ba84af9bf7803cb63aadbb4022e2fce2 legacy-trunk
+37409 6d055a275b4bd395a306f6423702ef7d9618a7ae legacy-trunk
+37410 bf687316507986bd23b3476637a0a617d04c7aa6 legacy-trunk
+37411 702367da2c72bf42e5fa393808356798f5c7cf04 legacy-trunk
+37412 d376fe862b18854d72db8405e14250ad0b1b3d1c legacy-trunk
+37413 ecaf0e8fa7379e91dc3870f3753b78b9cf92cdf8 legacy-trunk
+37414 66b56d56e680d4b055d85f6b63e3f98c0773744c legacy-trunk
+37415 7d7ac404c8049f93202c98fd79c0a7dc1b00023b legacy-trunk
+37416 bf9f917ee4f9f1400d1f55d2d04b0391b75de5fc legacy-trunk
+37417 a6dc176c5d1292022b1718c890130383ad6365ed legacy-trunk
+37418 a57713fded23b35bbd4df4f661332d5301644d29 legacy-trunk
+37419 15a7cc00c5a141d7b98077d6220d10df68755573 legacy-trunk
+37420 fd934778f4b451ed0ef29b2060540639d3ff7eaf legacy-trunk
+37421 e12ca5cdf74105dd514f0a399baabe4b12cb0c87 legacy-trunk
+37422 f2a2ced1fd5dcb03d16b246bdd623b47950470c9 legacy-trunk
+37423 be8cff4a1ecadc7254433c8463e8b4c4378f26e3 legacy-trunk
+37424 97cb9eea212e237badd69e5636266a401e83af1c legacy-trunk
+37425 a76126003992519e3607b3ab43f60ce4d72a7c11 legacy-trunk
+37426 c39f83fdd4d0323d074ec8c8e952c887dcef8a95 legacy-trunk
+37427 8c6fc877126042111f42d480bba0b88d8d7bcaf5 legacy-trunk
+37428 59841c819f4c975d031fce4ec091003916f61e9b legacy-trunk
+37429 f246d7464b5c8a4316a9514ce984615e7ea3a5f0 legacy-trunk
+37430 9692af01c1a835ac045a4d2441b3d55145e09a25 legacy-trunk
+37431 c4eac6e901614b6727aeac6f4088055e4df3c755 legacy-trunk
+37432 85da088e7a8bfd8f7e1cf60ffd9e22a7744c2e42 legacy-trunk
+37433 3bd93b814031977ba3385678bf47c45758f0e056 legacy-trunk
+37434 c37e2074a8c54859e675277f07caaad41e77f5ad legacy-trunk
+37435 a5682bc73e04f6076c576984db26497c65820a62 legacy-trunk
+37436 986a5b569adedfdf87a411e467436eb7334963d8 legacy-trunk
+37437 50b6f94a38a776736ffb31ddfd629980a4cf1713 legacy-trunk
+37438 e478ebe1cb316c84d834a40b141f07ad1e52398f legacy-trunk
+37439 f27584d113af3e380423eebad41f4f2e6ea4734f legacy-trunk
+37440 c28ffbfb0ae9092925c50fb4a5640fc5ecc9b01a legacy-trunk
+37441 31bc5f0f4cfcc9fbce4f049baa1c45ed8ed896bb legacy-trunk
+37442 325a88c6ee7d5cd767fc90fe10db9de4943852f3 legacy-trunk
+37443 8a5c87f685cde9ca1473c90ddb12f263222e53b5 legacy-trunk
+37444 77660eaef24dc4a1caf53976e5c566151179e3e8 legacy-trunk
+37445 613a5533854a0d41b36b4abd58e43b75532910ba legacy-trunk
+37446 808428c56096876432107584be04c3c6fdaa44ff legacy-trunk
+37447 1b6b1042cf456956558d0e6c82868e1d764d5757 legacy-trunk
+37448 2bc2353263160a48a052a8a76a5d4bcb779d1a6f legacy-trunk
+37449 dbdc45564d24038a905770fa2559c4583994dbc3 release23-maint
+37450 7919cadeb91dd7f4afa93a124fa57b979bbf30d8 release23-maint
+37451 14081ea656b2c0a17c001a67eea36345110ba18b legacy-trunk
+37452 68d11e439a0b5a431bef8a85a75b3902c0b0ae04 legacy-trunk
+37453 23036c7af6876ee21983a89fa257a08664ed3a5a legacy-trunk
+37454 8f4bed970ff951456bb4fcad323811c5db724951 legacy-trunk
+37455 077954d41c5325b3dd3c996572b05871c4bc883e legacy-trunk
+37456 2f6419d007a9cb864037822596e7ee18a400b53f legacy-trunk
+37457 b48474bad76fce9c913a6be12a0ab7b588434e30 legacy-trunk
+37458 e9370bcf02adbf3b26356a63521ab4324b127457 legacy-trunk
+37459 a7895aef1ee801d887aca24737dcb5fcf7e3a475 legacy-trunk
+37460 0c32f01ccd997e8f455fbffe4a1e4e23560aea54 legacy-trunk
+37461 355b15e4a4da2329bb8ff68d945cd9f68b6bfbad legacy-trunk
+37462 cf1aaa7e40055d9c85d1d7adf5bae0f25bd2546c legacy-trunk
+37463 32df1d05cb2d963855860a3ddcee396a1e13f73d legacy-trunk
+37464 4b5416b184664fea8de92f679e33204621a3e35b legacy-trunk
+37465 7511585f2e6a46a6c89be5a2e3d7fb9114308a20 legacy-trunk
+37466 7d6679ee39f90bb66b81666a791d0449543f7bb3 legacy-trunk
+37467 fc3e89643888902eccad2b2a223536b7a61fead4 legacy-trunk
+37468 641152fb7d88296d2ba3de3a81ce16e25028385b legacy-trunk
+37469 b3408a85c89c9d3929c00b1a93fb0d1051c339ba legacy-trunk
+37470 4d7b0d206bc73adeb65ea033951903765ed278fb legacy-trunk
+37471 54c33d095e7e49bcdfe24804e4775b34dd10c443 legacy-trunk
+37472 db6f21ee61359725416f963eb1da3287c159b829 legacy-trunk
+37473 084988c20b75ce5d192a44ccf82375f68559f2a8 legacy-trunk
+37474 b8922a36f08383f98c037d0243dab5d216ff618e legacy-trunk
+37475 c7c39b79e5b7e8a5af37b6f5ad4509d838deb4f7 legacy-trunk
+37476 4ee48e2efb6879745a1389f135fc2658cfa45896 legacy-trunk
+37477 7664e8bae19e21b5497a263f024db932b1a40840 legacy-trunk
+37478 831319f100d0a9f0dc2321acf3622742de1c9a37 legacy-trunk
+37479 b11f9162ed0dd547934effa33393d39894568fbb legacy-trunk
+37480 31b08670ebddb501af048785cce7fcadf94db48f legacy-trunk
+37481 2b9c19872b01760fa5dea394a4596a199c6c2610 release23-maint
+37482 8e20ee2ecc0c9e6e006ace3a2b50f90196ee5da9 legacy-trunk
+37483 e631805c71b072f60d594991be12f04b62e5d20b legacy-trunk
+37484 27aa0e119330a37eb5ad7647ff7d20d470ea1297 legacy-trunk
+37485 34b07008aa78be799421c2f9121a7b7a414628c4 legacy-trunk
+37486 63fc0522a95b5355f91ec99944120fa838d1fd84 legacy-trunk
+37487 8e9dcfe14d8162e4da509cc878698604a7591b0d legacy-trunk
+37488 5730f77e37e41b6341b9f6e9a37e57a2c177f190 legacy-trunk
+37489 f074db0c14a853f9032e6ac0917f472d2841a7fc legacy-trunk
+37490 cd58a9b4ba6638643764d7442a002981ad55244e legacy-trunk
+37491 0ae0bef10014e5fb85271b7b2624b91e98dd1d93 legacy-trunk
+37492 83a3e2d1914a90a4d3037ec1b4726063ee79f92c legacy-trunk
+37493 c84dbe717d49cd864ebff47a8addc1a55fbf6144 legacy-trunk
+37494 0f0ddb4cb0437344801e3e2a595b266d6b7ecf09 legacy-trunk
+37495 655f74ea0f31f561a0e85c2ef4ca26cfcc7ec91b legacy-trunk
+37496 23444cbdea5550a4a50e14f93f364f289edf3212 legacy-trunk
+37497 279f01e71071bf5635357380836631fafb28aa7b legacy-trunk
+37498 6bd4a1056716b772a4739481c245d9acb6bb8a4e legacy-trunk
+37499 836e92cc5c4fbdb6a9ab0bb7607e8f243f37d811 legacy-trunk
+37500 e5de698ecd4b4e059d5ebebe97a11d4eb2f00f20 legacy-trunk
+37501 6f4bcb3bd202e430fc74881392282f2f20f0a78d legacy-trunk
+37502 5e19fd3642f073e2d3498fb2e136f9ad2db01d4f legacy-trunk
+37503 40350fbe665dff1b2da8c6af0dd538dd931ccda1 legacy-trunk
+37504 30cb200d418cdfeea8569c51176693447a44eaae legacy-trunk
+37505 cd70f1ac3c25d6860a96e3b7fb49911111160d43 legacy-trunk
+37506 4fb8c89f66a0b97625a6b00e484dfabf1f83c9f0 legacy-trunk
+37507 91634f3ba213a52b9030a4ed52fd0e8ad298e373 legacy-trunk
+37508 00c36e1bc50bc6b2c876fa802edc8e60de0dd185 legacy-trunk
+37509 0c4f095863b9ed2ab7c2399fbeb2ab07c278b9a5 legacy-trunk
+37510 3d8d782175999d9d5822b25ad16d753e63a11198 legacy-trunk
+37511 5a292a03ea41677370310847478fdcaebc4c0b49 legacy-trunk
+37512 7c50cde1e4fd05e4884d3731ad7ba395dc29c34e legacy-trunk
+37513 7450bb93c395cb064a19c379b46d83736dc3fd08 legacy-trunk
+37514 486e9c40cfb93fe4f06022e0980097b102d7d7e8 legacy-trunk
+37515 946612f64a832e467a51e194d385c0a7df6e9d93 legacy-trunk
+37516 c591fa1d435df075874b1bff7b46e7de29189fa0 legacy-trunk
+37517 7e42a8ebb3eff117cbba7796c8b1e2ddd7c48684 legacy-trunk
+37518 c81925b613dab063616256491b81d3c5595d21bf legacy-trunk
+37519 c097abdb55663e3e4cbfa7e8901b0d5fc8220033 legacy-trunk
+37520 0b7e318ef0926558acbc8ab58e152583ade6f508 legacy-trunk
+37521 45b1988e26924fbacb318c5a5fa5bf290f706ba9 legacy-trunk
+37522 ce813a57d44d3aae88c490da6ccb95eb0ed2bfeb legacy-trunk
+37523 9189946838eeccd9d5bc6a44f5044ac9f5255e7b legacy-trunk
+37524 0bfd35a76a44f812cca6de6dfcea96ee2674cad1 legacy-trunk
+37525 63a0389bd5fca9960568d3f5c117473c3f354740 legacy-trunk
+37526 cc4684051c4633530503af25620f0bec219d013d legacy-trunk
+37527 5412096d0f95de08c926cc3c6b25b4dbf4a99d9d legacy-trunk
+37528 e12976e98f613f430f0bb80b10c4012bc9fd13b0 legacy-trunk
+37529 5def66f2c9abee5f08eaa2844674eff0494f7b4d legacy-trunk
+37530 ab588ce9e71fbfe0c23785650dabaced65e06a56 legacy-trunk
+37531 118b6f69e3f153b7879e34ac6dcdb0b50a2703d6 legacy-trunk
+37532 ecf1e853406b7cd2eda6933262d12c889edb5fb9 legacy-trunk
+37533 60bf2afd73122546efaf1a7a69ed004fe0b95b18 legacy-trunk
+37534 89faacd9ec76955231a6835ec5140cd5509f5d21 legacy-trunk
+37535 22ee91643b3f34b947d01490f2adfe6d459a912e release23-maint
+37536 b0f3a693b854b7ff82661e661c6198c828795e03 legacy-trunk
+37537 d8e74a0b46775db684a893ea87a65fbe3ed3cc0c legacy-trunk
+37538 d99de65f5425827bb5cb769192f63d8527b606d1 legacy-trunk
+37539 ba8e1854a84baacf94ea16862fba13ed4e09dbce release23-maint
+37540 5ae3a1c80e3fe7589cca10fa928b39ee16782384 legacy-trunk
+37541 262e1cf41d34bc75f9ce87bf4c4c86c60482460e legacy-trunk
+37542 b31a5120677485823c6e414d7a091d64cab8222f legacy-trunk
+37543 55fba88930bc7b81669d0152942a1310e404cdb8 legacy-trunk
+37544 bcafb68ad9858800a52627fc910e63652c76e148 legacy-trunk
+37545 4784bfc99a41be03507dfff98bfb2b4b5acd891d legacy-trunk
+37546 37c65a6b2ef7f4812de111f7b4ce7891b8a9c960 legacy-trunk
+37547 fda36af226fb2bd947f816017ce581a65273ca61 legacy-trunk
+37548 3e6f56e8104a2bdc3da2c613f7d2dfe53d103d99 legacy-trunk
+37549 9a38625fa2b08d46e54ac7f639649cf12a035878 legacy-trunk
+37550 1701dae6474e1482f06521391e4b1cbbca5b5417 legacy-trunk
+37551 683a2f8f771dc718dc757bb245a929a4d33260fd legacy-trunk
+37552 af300403edb820f4d11abe2f63d40268804ec5b5 legacy-trunk
+37553 a5c88f2e86a3f467f73dcf9c3e6e238bcd499554 legacy-trunk
+37554 3617d1ee2797fbe62e4fb86c233c3fe578f1ec3b legacy-trunk
+37555 d8fff706a9c25cef81443f22cefd73cfe5d25b05 legacy-trunk
+37556 ba9bcf2141a2329b577833027d34997c4d1e408d release23-maint
+37557 962fa3e23215be8f1b2849811a10dc28974e2c40 legacy-trunk
+37558 ba9fdc44c7782566c357624c7686972977ad3817 release23-maint
+37559 924bb2aad4f481b8b14a0289e855867ef585247b legacy-trunk
+37560 dc3a6767e9608427fa77131206d99de2ecb7668e legacy-trunk
+37561 aac4cc6618b54bb8ebcb6706e6524cdf6bc119e1 legacy-trunk
+37562 090ffcb83f0aae46ddb1bdcbe3d0ad77fa1d6ae8 legacy-trunk
+37563 0c26db381673e2405732faeb30a0540ab085c2db legacy-trunk
+37564 66327419eb0044bfdc53486d3b4258d26faa3782 release23-maint
+37565 08b767470663e35690823345811a67fb530866d5 legacy-trunk
+37566 3271ea60b82dc321cdb07ad6e5d10aa5db617420 release23-maint
+37567 54e6527f315089810c669a411a1ea3b4473b49ea release23-maint
+37568 295bd8c55a788c303f17fbbeebb9df59a0929741 legacy-trunk
+37569 891042c94aed01f44feb1227250c13796b6721c5 legacy-trunk
+37570 4981ba54f43d81812162833940e89fc577ab176f legacy-trunk
+37571 742fdac3d5ae2ff435eb0d1e25dbec370117e7f8 legacy-trunk
+37572 4013f0a5383510f81247c2b4ebfd19ab79f620fc legacy-trunk
+37573 e7c7b3af616468a302c7f6cbc1b559d758c7d3ce legacy-trunk
+37574 461444de7b1fd0a132c0547c0570ffbe496ee588 legacy-trunk
+37575 664b18aa6fc124b255f0b095609c9a8691de1c1d legacy-trunk
+37576 baa2653f7a76d94b83890142c84aa25191f55339 legacy-trunk
+37577 517e4ec0df89cc5299cc564eb87de6a08244425f legacy-trunk
+37578 635dd8a9ebd93c12118ba10a3fa78c3726c4aade legacy-trunk
+37579 a46b76eb9053c83d3f87a282fcd8c2e73518f0b2 legacy-trunk
+37580 c552446b7bb2f4b9ef37b982bd1768c0ec3db201 legacy-trunk
+37581 f8cb8f0ac8f13a35379364ce7212cbbd0b67d6ac legacy-trunk
+37582 e6f1ae13be84df2f6d73be26e2db00506203a0ca legacy-trunk
+37583 f234be1728000e9ce2364bb1710d31c04b2f73a7 legacy-trunk
+37584 c2ae482ff42d63debb4f29305e44e7ec7ff8dddc legacy-trunk
+37585 2c79b50afbab5e3d8350f1b12de76df5bc1621bf legacy-trunk
+37586 74a57e6684f391cd3368f90e45dc3e333dd3cf28 legacy-trunk
+37587 76641824cf05357bfb74cc21067d14dd78e1ca25 legacy-trunk
+37588 c7fe2277d171d4fa8a5b70dac23e6db3ed2cbb69 legacy-trunk
+37589 c9b1f2694e98aafdf93a4c29a07491d3416aed46 legacy-trunk
+37590 acc191b714b997357e9c384d19d52fcee39424af legacy-trunk
+37591 0236b6530c4631c3e0d33531a40908a6b5ab15d7 legacy-trunk
+37592 a01be350ed61581b4273b6320a62f2dd4e0faf17 legacy-trunk
+37593 0d6d56b2164b7ce8c900b282754764efa0e798e0 legacy-trunk
+37594 44cdac9bf7859eb77ce6ad6834d203d3d5f4f51b legacy-trunk
+37595 53c468d0955baa08d1e9dbeebf6c3a3e4e33731e legacy-trunk
+37596 d9404db29bc6577bd409a995b3e770d9e67dd110 legacy-trunk
+37597 39a13e39d24eb9de0f0bf2079c141e939833b2a4 legacy-trunk
+37598 eb3d6030d9501070dc92720b82e5cb3e4d81f4b2 legacy-trunk
+37599 1383c4692af74dca787856ed1f59a597fc23e241 legacy-trunk
+37600 a804280e34f90fe214e07ad6c403275f450d7948 legacy-trunk
+37601 e4f7d3b0c5d4fe47fdb27bcf37a87e0acf534622 legacy-trunk
+37602 a4f747e721381cf7dfe7634f1a914d157e1600a8 legacy-trunk
+37603 76355363101b0a115501875a0479844045505c93 legacy-trunk
+37604 44e176cca33721ad8d83f5073bf1744bfa85a660 legacy-trunk
+37605 d1f0c7079b82879a55939766e8ba5a9c0765bc87 legacy-trunk
+37606 179e42ea2e9c97198817128616809333cc40024f legacy-trunk
+37607 4683983e84b355d1ae04392395dd2d106cd53766 legacy-trunk
+37608 99caba8145654ca395c34f57d53fb22a0ca21882 legacy-trunk
+37609 74ceb6fcb4327dd8c85e100d888b36d5f9defb35 legacy-trunk
+37610 a27b0271711bd05bb035eef2bb9418e5707ebdf8 legacy-trunk
+37611 b0ec4c9d595b00b266bd1a939e7cbf7200d9b893 legacy-trunk
+37612 b86c7c4774edfd832eb68fc94987e18cdb181d8a legacy-trunk
+37613 2cc107c9646e2bdb03f2d0a25bd979f6e4ee345a legacy-trunk
+37614 ec993b7266057288de953b7949263801471661c6 legacy-trunk
+37615 aa2d6060495a07bb4f37ada8eac9748c13410f59 legacy-trunk
+37616 ddc2d6e547c15394f83dee604bbfa15da46c9680 legacy-trunk
+37617 92e05b63499786906b41d5a53a27f5f7be3a592e legacy-trunk
+37618 10b25414628cdb82c80d260f193e63a173143890 legacy-trunk
+37619 4f8db55ce124a2ea7f8bc103425787831c1f9411 legacy-trunk
+37620 1977752cf807bc789d900b93fc1682e5bb13ea1b legacy-trunk
+37621 8a5061bcd4179f82480085c016d46f4ea4b5f8db legacy-trunk
+37622 fb273a83c75fd92571978905af58c8024ed49a15 legacy-trunk
+37623 11d01fc650dc052afd49c744c950e9355e97ea96 legacy-trunk
+37624 46217d05a4766a461bf42c880aa8ad1070ac2321 legacy-trunk
+37625 d1228127d29425f644ec79143b22606bbefac2a8 legacy-trunk
+37626 26fd00b368f1d452e74b641e66ca162d5844908e legacy-trunk
+37627 166bd339d3bfd619c4d7055ad8612401ef8380a6 legacy-trunk
+37628 26bedf63e4a89c53f8f8fb35ee196d4bc9409fdc legacy-trunk
+37629 b308e15bd7fba925f17773116f985db2c0cb1297 legacy-trunk
+37630 1907ad54d351ce77fa822a5e3aa32071bf7cb1df legacy-trunk
+37631 55482e9deb6638364c2032b0b1eec88164d1aaac legacy-trunk
+37631 53cff04283855adf88ed0c0fd3698827ca843637 legacy-trunk
+37633 72c5131d4c4af0db37ab4152878b58de000eb61d legacy-trunk
+37634 c6aac03474c5e238286acdb42f14dedc7ded1f94 legacy-trunk
+37635 88bf48c069f9c362495bd4f6a65d263fec6b2085 legacy-trunk
+37636 ba75fda9220c2a154d6652e300bf5fdeca72d7ec legacy-trunk
+37637 ab09daac5691b78c49bb447252e220de665732db legacy-trunk
+37638 fbacbb26278949819e0b68c5050c0b3e0a9a33d8 legacy-trunk
+37639 e15c15a4fbe88151119ae33bd15c4334b3d469cc legacy-trunk
+37640 c5d951a0e0c3e90a625e572e68b4d13a9699b084 legacy-trunk
+37641 e4b7c923ed5f2737f66156a88f6601e14c6557b5 legacy-trunk
+37642 f1c048e743e2d8060aa8940f32a68a11adb8c184 release23-maint
+37643 c66e6c9ffc2dbd3d019a74d3b1bf68a081154fab legacy-trunk
+37644 4688d2a273d90b86fbcc3023e778ea9f361a0ea5 legacy-trunk
+37645 d9d3b475ceb258663b13121d7479e7eead562630 release23-maint
+37646 a52de911b2848147182169cbfc322c6f52f90100 legacy-trunk
+37647 3fdd96f0ce866c5af6921f36848158fafc0bf3a6 legacy-trunk
+37648 f175c98383736d587f43617760b61254a9c3a54c legacy-trunk
+37649 817c241bffff8df4f1188fba632d4cf8b29d1566 legacy-trunk
+37650 bd1888e9299f735ce7119649c98c7ad4f9fcf1b7 legacy-trunk
+37651 b8778cf7d0e373871fef039972649273a7787840 release23-maint
+37652 3342bc2300c3ac2e6cca5e7f72b7a650792c0b56 legacy-trunk
+37653 8d8b39234de9e6f0be978272cff523aa417f6c7b legacy-trunk
+37654 83a01912899f604600adae7aff113628cb88b628 legacy-trunk
+37655 6dffdc33fc6c5c01f01cc96ef7a5aba83460b724 legacy-trunk
+37656 d063e4de567600ea6c7b7ead88b37bf13d488861 release23-maint
+37657 223d82260452aac25c858807121a41ee0d450430 legacy-trunk
+37658 a2243d66d40bda1e31985c693cd8c9f400065f22 legacy-trunk
+37659 69c96881aaadb48482d0294959c3fa4582c50d9d release23-maint
+37660 6819ba0236676fe03c62b0105e8e1eafecb6f4eb legacy-trunk
+37661 aeb6ff308848c875d5e4a3b52330d7026b33e2e5 legacy-trunk
+37662 4fedc529ad32db957044c1fe81c65a2335474456 release23-maint
+37663 b1a9ea6e8ae20a33ac0e6ccec3c047f28f7678b9 legacy-trunk
+37664 199dace024ba044d450ddf38bef6d79aff5172b3 legacy-trunk
+37665 d485e78a43d6584bbb928e36164d42d4eefe9bce release23-maint
+37666 5c862496a9f6aa831da9f87e82a9610afdb59148 legacy-trunk
+37667 d2e95940482692b8e8ba61723c27af7858e2434e legacy-trunk
+37668 e9cbe0adb28ae7fa7ac23189afeb8c2ef3234127 legacy-trunk
+37669 a9e60514007477f20cf488276dd1586d14293f8b legacy-trunk
+37670 a3dfd801533b61841ed71c8ba9a914fabc47a93a legacy-trunk
+37671 47b38451977575606de2dbdda57565c135c68b7b legacy-trunk
+37672 59e0ff0cd3d4c91e2bfcd39ea60f6865ec90cab4 legacy-trunk
+37673 d443505e7eec18b9467b492df6d52ba250ee584c legacy-trunk
+37674 3ff252715d93b04efed6f52ea1a288310a127cf2 legacy-trunk
+37675 1c676e891b3f9a8372a13f6f3269ca1d30615e2a release23-maint
+37676 ad90888b17bc02345891e1ef6d2a6a9fa67d8de5 release23-maint
+37677 f54868855b1ccdaa2a78150bffc6b97d80dcc204 legacy-trunk
+37678 82142a24e845c33bd9cf010419aeefde3866ab0a legacy-trunk
+37679 0afb2530e986aa06dd60fb3702f4574231542929 legacy-trunk
+37680 b0f0c57b1e0557020b22a1900c5d2d2c02e3bea0 legacy-trunk
+37681 ed041e0e451ef11cbe91882e90478fb76f25fa31 legacy-trunk
+37682 b3a30e2842b9675bd3eca39f1a4706d4823dea8c release23-maint
+37683 8d38f2f2151cca5aa219800ea5c0e26a969e80a9 legacy-trunk
+37684 2a15318c4038c3047dc9c1c8a2aa493ce21d36a2 legacy-trunk
+37685 f14329a7898191215056e3f59de8c23b88de9c42 legacy-trunk
+37686 bf18caca07304371704dda26a553df6f31cab383 legacy-trunk
+37687 db8710f1365088ebd00f9bc2ce1c6ed253add5a8 legacy-trunk
+37688 29b945bc0a17f1c9a9b1a6dd8cb621af6ebbd19a legacy-trunk
+37689 aed2526da1fc7ed9343d64c9c83a6e34b9868723 legacy-trunk
+37690 28ef0a3f57f6cd7848a76fb2fa9631b6d34062cc legacy-trunk
+37691 d938b9ed32ffecae8c404945c3ce62b89bb4ad9b legacy-trunk
+37692 17d8661e7d13aae46cc40c5c9184264153828b65 legacy-trunk
+37693 6c41695284f6ff7c949774f56154d14dbf0c247e legacy-trunk
+37694 317101cffb729345527bdfb3813b0dd3e26bd0e9 legacy-trunk
+37695 9ffc344891a626edaa2601fcae4059b641b31f19 legacy-trunk
+37696 627f77e3ceb651ba1d0aad60c4f56b98cb690558 release23-maint
+37697 10512ceba30c55ce64d5a26a7d90f9e0db648102 legacy-trunk
+37698 ef149ea594a4c0f4a8138fd4b99f8a7ff11836ca legacy-trunk
+37699 991d3490f698eb2af8d380562532d727a51e296e legacy-trunk
+37700 dc8ecf724488c26f75d9023bf4ae2655136f45ca legacy-trunk
+37701 bd558211ba552c7149a836c8d6f2bb988ccaeb00 legacy-trunk
+37702 fdce3d39bec14d4d470401552e7ac667660cbf2c legacy-trunk
+37703 4dd97c37c2cc2c3378f2c916a37cd1fea7ad899c legacy-trunk
+37704 6fc10306bf312bac993c7521f65371c92c5c1072 legacy-trunk
+37705 105bfe1769b796c427f5e2fdc6a30037cdf70e4f legacy-trunk
+37706 993b128d4e294a51709354fbb00fb4d2d138f12b legacy-trunk
+37707 ac4fa942f92e78a6cbddd6a8d7dbfd84d73e0128 legacy-trunk
+37708 ed13937079df17cac26c970672ba42eca23af3d0 legacy-trunk
+37709 032f342efcd24f24c66ce6bfb0ec138077a45eda legacy-trunk
+37710 79bcad14e96aaa775896d4fe44847533bd8e9276 legacy-trunk
+37711 5510995ea26fb5d948a04df9619f705c7ddecb4d legacy-trunk
+37712 3398c5ce8b7a096074e4f1b918004f8a08e65328 legacy-trunk
+37713 d83998a721a0a2ef1e437f3d6d8a0491b1aa7233 legacy-trunk
+37714 2625537a6dfadd53608cc783298ff9c538c49ce9 legacy-trunk
+37715 2ee0301b483ce2a84f7e39b98dbadc7fb2ba3ef9 legacy-trunk
+37716 943862b2b4dfe56e58dc52e6eb0d08541d9d7a0c legacy-trunk
+37717 d41ac11e9c604a6596c3cf14e3db83343e8d1192 legacy-trunk
+37718 eec317ee5c35b8f872125a31f50b54c158f2b9d9 release23-maint
+37719 1cd19daaa9d42fab722320a8d9afcc32e929b0b4 legacy-trunk
+37720 60c60dc75c77264b9e2c2f5f4bd6c61fe3cfb1a8 legacy-trunk
+37721 6da07873a0ee375495db9b85fd297badb3a180ca legacy-trunk
+37722 0ddae8b0fb19a38323b42bc5b8463cdf19ad8db3 legacy-trunk
+37723 30732434107b6cfe6d928b4400d322e7207cab80 legacy-trunk
+37724 3467288089a1e25863e5d3d7441a56f43c4e53b2 legacy-trunk
+37725 4a3eaa1aa3afd2f5b94ce2ed0b2e9db7dac20ec7 legacy-trunk
+37726 facb5a2f4b53e97d312db319099eb79d491513ac legacy-trunk
+37727 b585bccfb250543a66bb8ef4e45d10a334107edd release23-maint
+37728 6b61af083493313b538e5154d276f1f58767557b legacy-trunk
+37729 f196716ea0db45d63767f2d3b77eca41fc13824e legacy-trunk
+37730 2632f43409f4965aceb712530995e4d4420ceecb legacy-trunk
+37731 07d94a162cf8951efadf6835148b36738e7720ff legacy-trunk
+37732 308e8ef2d3edf5f551bfb12198a25b505b9e3f7e release23-maint
+37733 223d20afc8b5e1eb8c93fa6a1da1998c3418fce9 legacy-trunk
+37734 80ca1a8b232162e09d7d52663a5216aedb5217ab legacy-trunk
+37735 5afa5277fcd9793ae0bf1c8c169f7ad3060fcf5b legacy-trunk
+37736 180dc829efff81751efb812cf0da04bafbf5f08b legacy-trunk
+37737 bf2d03dfc38e28f1c4c491f97930b22b929d5337 release23-maint
+37738 0dc3f9705577073ac050d9e0e10139fc34744756 legacy-trunk
+37739 24fc3eaa19e0b5dd9acf79dd9d487cd2bf0f17a8 legacy-trunk
+37740 633cadebf68d4dd8cf0c919ff5214376bebc8c49 legacy-trunk
+37741 a8c979cc4fa658d826d21048fd781a520b03b26b legacy-trunk
+37742 ef5030bc5f671c4b0481c88cba91315849cadb6e legacy-trunk
+37743 687362fa471c3c093170566f59e49b3f6b3fdc12 legacy-trunk
+37744 8a09c82e42610b0d496fd3185794fd7fb34858e8 legacy-trunk
+37745 bc0421b9657a0058aa950cace8c3b05e7585bad5 legacy-trunk
+37746 a6f97e0e6318964c26c8fbae0d4056c13a535ec0 legacy-trunk
+37747 5eca248f639e42f4072c9c7df9abf9cd3f4d3f71 release23-maint
+37748 c19e81112059316a68243d70d38f02b02775e394 legacy-trunk
+37749 a576cf1ac6a04e782f7a7127332b5ac886f18d67 release23-maint
+37750 9768624f035fa238fe9553f7c635c403e4525358 legacy-trunk
+37750 0cb1ba92241ba29575505828eee241cd126d4693 release23-maint
+37751 0d6dbebd8b4a2d043398a24c19e01685f72e9647 legacy-trunk
+37752 53aa019370db50a3e029c5745212bb51069e14e8 legacy-trunk
+37753 c308c6ba002f5b5b2489714808b4343ffa588fa0 legacy-trunk
+37754 feb4017cbad42a745c25b1c773dc4a6611e8776e legacy-trunk
+37755 786d3b8b9beedbac44cfb8b44f35ea14e1ea220d legacy-trunk
+37755 7e387a9dcc79954a77695adef8b593da35be1214 legacy-trunk
+37757 85db016e8dac63ee959aed455e9186b3f082e155 legacy-trunk
+37758 d783d51718119e41068c3896c5bc95e86e9acc90 release23-maint
+37759 710b7e8d2ff2a60b86573e93eb30eb0697a6e8e0 legacy-trunk
+37760 dfb7b07dcdedd0092a5bcacf620ed6b31d2d2fcd legacy-trunk
+37761 a5129d6ab1cc6a5385e9621f8d7b7f4c24b90cc6 legacy-trunk
+37762 eb979c3f14ba963d9542e3390fafe278f9b09649 legacy-trunk
+37763 5cc383401294fb4c54a3d7274cf550cfe8e2c239 legacy-trunk
+37764 ab6b108a8cec89a20db0577c44639b0b8a71806d legacy-trunk
+37765 20873295e91607574eb4f1067c599cb08a5fe629 legacy-trunk
+37766 19c2dccfaf653d9677ade78e1cb6ab5d96d86924 release23-maint
+37767 13289a7442c37f5b49cd5628c98651e966519e2d release23-maint
+37768 36024fa3bf4f4ea4193ec6d29affb76ccda9f6cb legacy-trunk
+37769 8f8c89bbe439d0e184e4ee1dd8dae07a591e48b1 legacy-trunk
+37770 5ed1d97b49a12459a0b6bca70dbe90fc8f9bd114 legacy-trunk
+37771 7ed899b61182806c9b16d16d06709a62e29f8fb9 legacy-trunk
+37772 2fa872784eb6201b21ea73bf6c91daf0ab5a6b25 legacy-trunk
+37773 b3ffa64ff4c647023a253792a15f502dd4c177db legacy-trunk
+37774 99b9201863671b8d690ee2650fd1750067940104 legacy-trunk
+37775 9a862425a98a146cad69a1293553e292f284b9a8 release23-maint
+37776 9ce5764019aef0446170d134a121059ecd3a5cc1 release23-maint
+37777 ea6ef40dc9220f4757c4bf0ce150d1ed9e78002b legacy-trunk
+37778 7e88c0437ecc620ea7ae3b8811f7b67d467e7553 legacy-trunk
+37779 02016d5a4dc6a83569dbbb1826c2e6bef8bec54c legacy-trunk
+37780 25714e0fc89db13cdd7bc880b7c31d3768631a46 legacy-trunk
+37781 8e91a7eaa7b7995b656e1a36c07cf580dc0a60e5 legacy-trunk
+37782 8698653e05fc1091b5910228b726d2364c5e720d legacy-trunk
+37783 d82fa932b41bc0391658116bc3e97b8c53a93cf3 legacy-trunk
+37784 7fd4d350ff8262b8d585097dd7956a1b0babbd15 legacy-trunk
+37785 9173b9e0ab773497040ebbb742307291c1a35c5a legacy-trunk
+37786 018dcc7ef887debc7a78fd9dcc6fe929ff8afeef legacy-trunk
+37787 662c155106e425c105f9ef2f9f8b0f68492c4fa1 legacy-trunk
+37788 e4404046e552f86d75a1dbf1de6f6acef9a39faf legacy-trunk
+37789 8390f939dcc1f3cb830828af9fe4137535edae1c legacy-trunk
+37790 829ee325a18e5387ff78937b2c34c389f8c74ff4 legacy-trunk
+37791 0d4ecc31cfd83db5d4ad6c478fc19af46c29e479 legacy-trunk
+37792 66223a9ebe486359c1f577b8e86edabf2e43813c legacy-trunk
+37793 4fa1df3b062f497a23c48b4116b58f469d57a828 legacy-trunk
+37794 548f38a56669e22f7cdb383b11ead8b1cb1e233e legacy-trunk
+37795 59c43fd8ba73f0788d1adf67137527ee9fe0fdf2 legacy-trunk
+37796 eb231544c1ad5e6050b97a02df96d8b46f871178 legacy-trunk
+37797 0ae28c3a8d2406838f28633fc246b91bdb1c4266 legacy-trunk
+37798 ab73217730db232e3e09d26a79f885d9e429b9f7 legacy-trunk
+37799 e4e23e3a7844bceef0eca3e13f569879d455a3a3 legacy-trunk
+37800 4de354c78a7efbc0485bdd8a25dc1822f386db8d legacy-trunk
+37801 81cbf031549a1f9e0b109d232235d69c6e193f9f legacy-trunk
+37802 5fbbe8233b763336ba1ea1c880e8ca66721bf4bc legacy-trunk
+37803 dfd07b7be4072f7933f11af15139f286d52ee85a legacy-trunk
+37804 463a03a5ca2283e6ab903e033020b33192e44e5f legacy-trunk
+37805 82d02564123dfc2c5168263f21303690a7b52841 legacy-trunk
+37806 359ebc56093e7eb2f4495cf42f7445b1d8ac4853 legacy-trunk
+37807 96179c096d65adca3a964007c191557327fdc2fe legacy-trunk
+37808 904771bef3f47fdbd1f92713b0d85ed8c5ce178e legacy-trunk
+37809 afee3c33ae6d8c75590a814e2071e84f74bcd7eb legacy-trunk
+37810 8b2a2f7c13b80dc744ab8615be39712dc9fed2fa legacy-trunk
+37811 f2ce15b02ba3febbdfec218093ba06860d4b60c9 legacy-trunk
+37812 b9819b9a0dad542117eee4ed670603542da308ff legacy-trunk
+37813 633be43bed17d037bfc9a36b5de30563b5acaa35 release23-maint
+37814 eb344e03cc712562ee1282ef60c43043934fa117 legacy-trunk
+37815 b4f0ad8159c734df91b90592862457b368f06189 legacy-trunk
+37816 e1f1402609478af78644b53070e2e5248ef671ef legacy-trunk
+37817 0fe8a16a336aea8a4681b0dc2badd97b690991a9 legacy-trunk
+37818 77b1c15174b44dbf1211765d75e26fda47303e3b legacy-trunk
+37819 942f8743adf0278b7882e0e7e70a73dfc5d7bb0c legacy-trunk
+37820 4f7456d03cb9de6239850a69e69d64d5f7f8e6be legacy-trunk
+37821 c871ef96655c8d38bdc944329d049253bad24f88 legacy-trunk
+37822 dc80476b782b790ecda4276083bafabe0fed3915 legacy-trunk
+37823 cadd3e8d349f09d3ebb921e4b2a0a754b60922c4 legacy-trunk
+37824 958dc8b7a826a1805f95af5ff0ef3cc2802b5741 legacy-trunk
+37825 4375006e5f079f72b6c9c95b38f44c3220d4734c legacy-trunk
+37826 fbf30646cd13641fb799b58f33e47dbb5466dbce legacy-trunk
+37827 a91e92b982acaff038b7d580109cce672df7a146 legacy-trunk
+37828 893d46576737abba8ccc3cd564b0c34d06ae6e7f legacy-trunk
+37829 06ee53a76f0173ac040cb9425a23a10c550e7b39 legacy-trunk
+37830 9bd983cfbe81bc865b4f9da9943742c6b250313e legacy-trunk
+37831 0739f36ad54419a41314ed0dbf54e7c897589e2c legacy-trunk
+37832 feff4e4f345ca5e336f7b00ec80917d45947e27d legacy-trunk
+37833 0238013323955eb4ba2a4125079f7f439e6da3b7 legacy-trunk
+37834 23b103abb8f7fa7a796fe3895018617c1f088fb9 release23-maint
+37835 53b3f53d7a0d32a9f550b993b2b72fa0406e5ddc legacy-trunk
+37836 4cb7b923681e47aeb6e3e51bf449dfe9edb57044 legacy-trunk
+37837 d25615ef5d8f605951603a6d5cffb209893b1b60 legacy-trunk
+37838 2213cdb3cae793cb0dd6ead28f24d98bac80f17c legacy-trunk
+37839 4394463510fb2db9e09d8d4b7d684d450e0ef564 legacy-trunk
+37840 dcda06cb078a3ef96987be24a5884b80450cdcef legacy-trunk
+37841 33a846b777a891a93bc3eb3ceaf7f2d096375a62 legacy-trunk
+37842 f92616f8c33c74511198288c05e1a2922d6d8be6 legacy-trunk
+37843 4005f79d281ad0df29fd83298bd414972eed1d23 legacy-trunk
+37844 ec29955b85435bf81602831d97d8ab0ab48aedf8 legacy-trunk
+37845 468a10ebbcd501a084ffff4c3d28b0bf2ca27971 legacy-trunk
+37846 6525e028afb3c9c726e849849e0fa612f49009c3 legacy-trunk
+37847 7010a99b5e6124176ece421688aed908595bbf73 legacy-trunk
+37848 32ed2861c97f18ddc77c58fa5ca6bb17a86666b1 legacy-trunk
+37849 49b6e966e57f08846e27f62f2223a6d7e225d096 legacy-trunk
+37850 489656dbdf5a7f3113f8cff02d52db82e26e7e66 legacy-trunk
+37851 a05085a63dec8364b174e9b283c1e2f9d8a94934 legacy-trunk
+37852 4f2bbd471a21c58138d0ca61a124be24c7c0b558 legacy-trunk
+37853 71372449582d326856473ad6076ec56f1b2c64a8 legacy-trunk
+37854 f13ce0bb606c02d9448524332932a3ae0af2b174 legacy-trunk
+37855 a8de2195efd66bdd840fd6c024c56880e8e03b1e legacy-trunk
+37856 6771e1840bbcbf03c187b029380328c1159f9fba legacy-trunk
+37857 b4adb10211030ab2508c5ca290be1636d1fe5822 legacy-trunk
+37858 b871b94f07b6d6f3faac96c14ef4bf45f8255d6d legacy-trunk
+37859 365638dce5f3436029f29110d040c7bede1cef5d legacy-trunk
+37860 e01a17bcdf28ee87ccbf96ad6c3b2c1ccb2ca3a1 legacy-trunk
+37861 f5311303a357002d61f61fd0c2f0c9a69b0a4d4d legacy-trunk
+37862 b48ca96eb4408dccdfc5069ad8b68f9bba79ceaf legacy-trunk
+37863 9a1309a90b5df6d0e4ff0524b53cda96835a79ec legacy-trunk
+37864 bae1919f85481dbf60f09badf4544cdf581890cd legacy-trunk
+37865 a00cd670341ba7fecf89835d691475aa282077dc legacy-trunk
+37866 ea957d9b369cd8ddc370fce3268e1b89cc5ced65 legacy-trunk
+37867 31e4da1664b7ef60567a15804581b040e5626cc8 legacy-trunk
+37868 d5ba4f3050b5870e29ea57c1b6a2e09a43ef3f48 legacy-trunk
+37869 78738a89b22311db7125f227b0facde10d2f1963 legacy-trunk
+37869 ff80d8bbef6e13426c8a85d7f9d837b8f8f89834 legacy-trunk
+37871 209550256a7441601fabb17bca9326da42d8153c legacy-trunk
+37872 ef7a02b18ecca3998706aa46a712027a89ac955c legacy-trunk
+37873 8204a4d2012cb72df42cafb4e04c809e6f88a4d4 legacy-trunk
+37874 71930d7b3b8a24f247788cf1b376f7281b0ada0b legacy-trunk
+37875 96f62c6798e81b1113f3e33bf0c9b9258307c3bd legacy-trunk
+37876 9b0c5bf4700c08430e5475c1ec9dffcd8b3f6fe5 legacy-trunk
+37877 8daa5a448403a9fd58e60c88658c580618e05cdd legacy-trunk
+37878 2b9c2ed5a76bff7e3ab030b4359fefb91aed5cc1 legacy-trunk
+37879 264e45baacd5331c1845a5a2263399a208f09143 legacy-trunk
+37880 e9599d9d91c6e707c22b1bcb8045f2cbb54c361e legacy-trunk
+37881 6bd8021f741cb8981e6cc00498455db1cf237417 legacy-trunk
+37882 bdd14ab6c5cf15bfe7c190db1b574e32b78d0c6d legacy-trunk
+37883 be370abb020f9c975bda56fab94298157f3bc488 legacy-trunk
+37884 c10adbad44fab98c27f223bb1aca3cb33f08c16d legacy-trunk
+37885 1576e845c57bdadec77d4538f3a36459d0785200 legacy-trunk
+37886 a8ff6ed856e893b47f3474d4725892e9638b1577 legacy-trunk
+37887 c1483f0e800d02e8ec0109060049abb690996f61 legacy-trunk
+37888 7f95fe98d8216d2168e84c3db8c7b6c98fd19183 legacy-trunk
+37889 71358f6575b6afe0efd1534c757e530ea288e0fe legacy-trunk
+37890 7e99b0680adf113212db8cc87e28ecbe81e0584d legacy-trunk
+37891 8da57c28b910f5138291b8874397ecb06aed764c legacy-trunk
+37892 81a1f754d32cd208f73501ebae430e8ddfa04634 legacy-trunk
+37893 c88d18418053b54b345030dcad2ad6bd0e3f4289 legacy-trunk
+37894 5be31a207d86d7f4ec15b1d47c748804e9c81b85 legacy-trunk
+37895 7a5a56a173775926e9d3be35e875b5664bb521cd legacy-trunk
+37896 163409a601bef41cbd78923b063db3e14c97b69c legacy-trunk
+37897 2c83b622a3ee68c5a99d26f94f97d26bf90bc35b legacy-trunk
+37898 c9c7794060b0e6edb9317d028dba40074d0a1a98 legacy-trunk
+37899 7e955e987d69ca7d7230b52950f2bb2b9fcead05 legacy-trunk
+37900 d33b3a2b094cb83c8c9d08da66c4d72a11ba5c5a legacy-trunk
+37901 d0716ab03d9ddc4507b871147334229f6c6b03f3 legacy-trunk
+37902 6a806fda668d6c5f4ae239088893c8f4832daba4 legacy-trunk
+37903 2830e6cb415765b153e63bea7f13d6aa33ec8e5b legacy-trunk
+37904 fbea714802b3da9620a51106d0efb356940af3f7 legacy-trunk
+37905 7a12904438d6ca7971071e52ea5d34bfd6d85e8a legacy-trunk
+37905 f31e18d313c7a4fc66914b2d27e130a0f72c0b69 legacy-trunk
+37907 716307f7e617c418513af0b9ca11bdada78095b1 legacy-trunk
+37909 63afc2d1b0da3722e3058fff62296e0a80460182 legacy-trunk
+37910 cf3f8bee7f7ab12a93be47243a652a3e805c11d6 release24-maint
+37911 2ecdc83fa86cd2b93b11e50e03d1872bdf89578e release24-maint
+37912 38432ad11c2a4226ae6f328f5395f0ab3c6e6ffc legacy-trunk
+37913 aed1fed37ad5865673fca069c5c3c8fae2f779e5 legacy-trunk
+37914 fd1be494c31b63e611015d5ae4b51d7c4341a992 legacy-trunk
+37915 8cecb8dc43a3807bcf3ae956559b483484ff6d87 release24-maint
+37916 79d2ae0a62efeb740d64fdf204eb6e2504ec7d5e legacy-trunk
+37917 a6e251de5e41bdd82d8567f751563eb69d6d4d5b release24-maint
+37918 7026d03850811720bacd5b6af025cd93f632cb08 legacy-trunk
+37919 1c4dbe4a06bd0549c0b4359c49152257dcbad01c release24-maint
+37920 217d741049c0d626f47aa53271ad7fb7d566679f legacy-trunk
+37921 c87261ce7ac932754c6e9e7e7f3a4bd51566b4e4 legacy-trunk
+37922 8eaf808fd980c107ed4478dfbb9cf9590a7eedc6 legacy-trunk
+37923 e43532b848d75d803aeed6eb47d346fa78781c77 legacy-trunk
+37924 7e6482ab9455da1777534e20c4197b5bf6015e8a legacy-trunk
+37925 6bfb0ab883f20f76bcf43e203d7f660d549b991e legacy-trunk
+37926 da967fb7a7fb4f43a158a9d9483a9ba76979a62b legacy-trunk
+37927 172b47ff2e4bb380bef7aaeebe24f26db14b8a90 release24-maint
+37928 cec31edea414fef4e9207ebafce56a6571f48adb legacy-trunk
+37929 4e254f028b76fc1bac4cd8c80acbadd746d89747 release23-maint
+37930 33f748e5d1421c80357218188cae5ef2a8daa32d legacy-trunk
+37931 8c8022b81f020a6ecbcf1e3900d093054590f57e legacy-trunk
+37932 abe3ee5fc6c37da0c86e3c3826bd2b29c318ff99 legacy-trunk
+37933 f18a4d937142a052e80cd765e5524ea0114725bd legacy-trunk
+37934 8bf765b480b80f9a0bd0ae091b79b4449539fc26 legacy-trunk
+37935 50e0c345d49b3bb7bf09724308fcc4861b4ae8e9 legacy-trunk
+37936 4c8106c358ce0b8d8a63e023248e4aa506b63f05 legacy-trunk
+37937 157fae769536e633a64bf691c41eb1928aa5b807 release24-maint
+37938 611561cce740ffc8f87fcc9d2eb0b9193e95bdf1 legacy-trunk
+37939 fbf6e04def69024c24449195ae53109b279d5b93 legacy-trunk
+37940 43c00f0e63055577e70853404d0442f4cb90e1a7 legacy-trunk
+37941 f7328096832279081b88a70ee3660224c3645e6e legacy-trunk
+37942 4b601bd346a4f43b138c3e8bd9fdb840b7596e13 release24-maint
+37943 c4b13fa18a103da17f858b36546fc825c8a008bc legacy-trunk
+37944 609bcdae108a657831b25297eef9092f4a427eea legacy-trunk
+37945 2399632fd9e0e27f70a88f94c999ee273b60524a release24-maint
+37946 d2f26eaace2c1f320115a23a1626f25decf201eb legacy-trunk
+37947 d6203fbda2517d3894268fb7db9bc1f7262d3e78 legacy-trunk
+37948 6e0db07fbf9185d91c0e8472131cc230925352e4 release24-maint
+37949 cc9ce6837ea9b73ec48036bc1eed71cc5349535b legacy-trunk
+37950 95d276d4f9e465796aedab4dc1d150521ad87f43 legacy-trunk
+37951 624e9635c3ad11d729c52860add31e230c679b2c legacy-trunk
+37952 f02cd0d4a2a05a7c9469c86c264878290bd1d9f4 legacy-trunk
+37953 edc20d539a1815d58394d83fe85aca18c7650da7 legacy-trunk
+37954 175f6125549cad71b8ab52a14d065dc13fc4aefb legacy-trunk
+37955 0ec344663f6a9ecf88b32b97cdd1066f54e68468 legacy-trunk
+37956 8cd3176fd6f030b60421ad048efad5c1322241e7 legacy-trunk
+37957 8f929513993c91dfc646aee0772e0e73c8efca8d legacy-trunk
+37958 24f0da92001044e8249b3497b0c07d864dc1dc12 legacy-trunk
+37959 5172c28c0b3c8c982507d61212e2a52199029972 release24-maint
+37960 cf555ec698ebce4fd6dccc63bbaa51582370e7c4 legacy-trunk
+37961 53c6a959f9cfd5ed8f03adbc5622d28235f5a1f2 legacy-trunk
+37962 0dfe608eecfac20cf699bb84ad697b79d43b26e9 release24-maint
+37963 b966aade548cf8b13a70e4605e190378e85a7b7e legacy-trunk
+37964 8fd766bb76c9e48e102d544d1d289ea0e29a9da0 legacy-trunk
+37965 f409d4c6dc6041eb54f4acb33c9f1605f3d66c8c legacy-trunk
+37966 cddd016ae06acfe9cc394c30388845476824acd7 legacy-trunk
+37967 0f56a6655ebfa28301a6f2013f5c04ff6266e302 legacy-trunk
+37968 ef6d1e5eb4d329e3f92cd6f1fdb528f1e06052b3 legacy-trunk
+37969 25571ea5eca62f085b8a017725f04d01ac08489f release24-maint
+37970 6989092cd96d5cd933149065b3d5a4e117fdd55e release24-maint
+37971 421a5df508b87703f27ea8ec6b88f3f49ec84e17 release23-maint
+37972 1d1d6377acb123d18c82c169a73377085ace3338 legacy-trunk
+37973 957429c46bbf8d750e76a8c90f78ae056b1a2b83 legacy-trunk
+37974 05f8a4fec3562946faffe553da59635a65e87548 release24-maint
+37975 73b09c2b788b8a2212d4e265fee8ab99ff955fbb legacy-trunk
+37976 1d04936a6456a04a9ff10c25955a9c80aee4a3a2 legacy-trunk
+37977 9c1eb33fe110bccd3d9e494111686f2b2699eae9 legacy-trunk
+37978 96721a03ae30024d6ef1bb815e12de2771facafc release24-maint
+37979 ab8b0b731717a58030cb81a939a583ecdf78bf6f release23-maint
+37980 f0fc6befb0607a31a78a26a95436de3583e32352 legacy-trunk
+37981 ccc50e0b466d4ecd8d200c4ae0c106412d98d81a release24-maint
+37982 4979a44345434096f090ef4e2aeac80399868835 legacy-trunk
+37983 60d482e8f845017c0ad55a97cd8175361d400a3e legacy-trunk
+37984 1531b25ebdcd3bf36076d4f665157b7a2f7878bf release24-maint
+37985 e46f98e73e5272ac0816ffb7475b93ca800e5e1a legacy-trunk
+37986 fed5a734465d364f77505e7a8e06f95798ef7f9c release23-maint
+37987 4e8fb12f8378722aba0689aad6cf8fd66c1f1931 legacy-trunk
+37988 4e38ecd1912e4a6560a32a43bea193fb9984783f legacy-trunk
+37989 1a938f456053851102c783a9cd95db5fb2bdc8fa legacy-trunk
+37990 79066ea38c50313d21db460658f3506ed9a62894 legacy-trunk
+37991 4dcd78f3b5d1ba16b9e31dd090917428a69f9651 legacy-trunk
+37992 710b0b0e07eed72a24077431462535804dc1dea1 legacy-trunk
+37993 015b892c98ee2466a8b43dc2ad7822028022a354 legacy-trunk
+37994 ce4bfbd9a16cd588a0b7fe8deb341704aaa53075 legacy-trunk
+37995 5912b4181584619e7c5c7a9daf5a086e7804d062 legacy-trunk
+37996 a857c25a37b968f5fa1b56665f5e87cd6bcc95b9 legacy-trunk
+37997 0a6dd3f2abc7d38c9fa7303574e386ba000c6b29 release24-maint
+37998 afe90e9e4b484d879abf237437b1a848a4faed78 release24-maint
+37999 492653857782fe63acabff7b1f36c777aa77ec22 legacy-trunk
+38000 21abeceaabad6d61b9ca5a089384b0b97890db0d legacy-trunk
+38001 f05dd1816c1f7cdf5a468ed181308d3910504bbe legacy-trunk
+38002 d0a09c79740964e20f19722ef683667cc67a77c3 release24-maint
+38003 db8f699ff7825f7f17f5dd6fda71cb00622ad37e legacy-trunk
+38004 b132ba9259ab14f5a4ee7e935546975c007d7155 release24-maint
+38005 71d710e336dfcab99565262b522fc7043b3116a8 release23-maint
+38006 bedb340f12f970a028034d21f86964d2d81f5330 legacy-trunk
+38007 752fa86f06d25c30358fd442f90f292e2fab5c11 legacy-trunk
+38008 c2eba04e304151083bfae9d384849dd4f4e6c57c release24-maint
+38009 75f3a51a4e33db65fd93cf542eef6d7a872a3dcf release24-maint
+38010 16803b03964e4d52a5660dcb6ea950f799862777 release23-maint
+38011 6574c515e03566ba8b63793a39561eecbd126cd4 release23-maint
+38012 be450a335e9696e3db1dffa690d373692ce33ef1 legacy-trunk
+38013 a659b0cecb92f7de368184a760a078a9db82a982 legacy-trunk
+38014 e692e77cad5d5a43d5ce79b91bfd5851f8e28ba1 release24-maint
+38015 de4701fc176f9e4008f5036f42f14db12de62c65 legacy-trunk
+38016 bbdaacc44f6f4a0b3f9ce83a35fdfe16baba8859 legacy-trunk
+38017 a86866bac366b8d8acd459ca85e0c409fdf3c3aa release24-maint
+38018 51b0d18da447b735313177adfcc320dd21c553df legacy-trunk
+38019 c294b11323d17a47d231f68f51c8ca8e23954d80 legacy-trunk
+38020 258560adc43b31b5ef80e529e1e1aa437ff10e48 legacy-trunk
+38021 f1edb47ce4fab46b9d8ec04186c731addbff3460 legacy-trunk
+38022 3626db433104e071d3391ef4fa4421d003fdde50 legacy-trunk
+38023 0f00727a27b30be992071e5bdbaa21df060300f3 legacy-trunk
+38024 69611c7cd23bdf47c4066500eaf1c4fb8ad715fc release24-maint
+38025 ca2ca1aeb08053b697f2cddf7f8489692aa495af release24-maint
+38026 8b1144ba734efae1ffbc540fcacdeb7e650f82ef release24-maint
+38027 cb54f1153b9354e982ee9bf42a0b0693e9642aa1 legacy-trunk
+38028 5ea025c421d7bb8777d5326101d967d213003b6d legacy-trunk
+38029 c20f5b38fa20964ad72df5cbe18ceac60834f6b7 release24-maint
+38030 e53693a02cf055d0df92626fa6ec892764a2476c legacy-trunk
+38031 fdecba26fc87dbfed9ef452243271f46bd533125 release24-maint
+38032 b3afc01c05a05a56a3b460dabeca094b82da6fc5 legacy-trunk
+38033 db9b64939d45c728edc44d9acbc70bf3034075de release24-maint
+38034 80f01fdbedebc498b297b219df30e78c42be18c5 legacy-trunk
+38036 6c02ff902f820d62d8534b530b0c1af0727ca8a3 release24-maint
+38037 13021d35135863d5cf167dcc78dcd5e9236b710c legacy-trunk
+38038 2144a352aa37fc0b1ca771301b56ff1a2c299b59 legacy-trunk
+38039 30b97c1bb12ddf32f9eab43d6f7a9b9f0604f39c legacy-trunk
+38040 9c3a64c281e1b35a01fa3f0ac825c3379418d952 legacy-trunk
+38041 05bc8acaf0bb4c6bc21e982c31d2b062ab6ed975 legacy-trunk
+38042 e89b1a240ff7ed152b57a58290f4f775dd32b685 release24-maint
+38043 c139a4997d9f14c4388f1b30c36f1a907ad5748c release24-maint
+38044 8fdaa97a8ac3435eeea6c4deaa07b2408640bfa5 release23-maint
+38045 11db28e9209fed3e31501e194a4fa3a60ac0bf5d release24-maint
+38046 0efcc16f5a0d1658ae8c586ffaf233fe2e8a64fe legacy-trunk
+38047 4714aff4bf75287ff31aaf4398906540b614484d legacy-trunk
+38048 9e8195e21da69eb2c23e80c0cf6496a58ba3ad23 legacy-trunk
+38049 36cf94f574151f4bdb35bb136f9650da4fb2b923 release24-maint
+38050 6f4a6e9ad6f33abbfa2a3598a16fba5c130768ce release24-maint
+38051 521bec60eb302fcbc35200509064f05ef02f57a8 legacy-trunk
+38052 0470d75417ff155a743048e7f2193c47ca07b354 legacy-trunk
+38053 d04701e59872847977ed1c6a78e39a7454b899a0 release24-maint
+38054 44ebf98a5868203d36b4ef5742783405d82f8ae6 release23-maint
+38055 a4bd5d21c8b26cb2af1b1325f059c4e2c3e833a4 legacy-trunk
+38056 cd4dd6dd9721bda70e2b01780194287ebdf1396e release24-maint
+38057 98d79b469e74d31fd72f806e92e57819832938a8 legacy-trunk
+38058 1285ca1345d5c3131db7473112d7685506414370 release24-maint
+38059 a234284f9e0602f1c5d4db0ece5ff93e9ed87de6 legacy-trunk
+38060 46fa0e20cbcfe4086f876ef73b25adfd4a920014 release24-maint
+38061 1990f7ec0d9ad0b0a792130215d2e596c3bc4594 release24-maint
+38062 dabd43bf0dddfeed5fe89dfc3ef7052eed8a277a release23-maint
+38063 be976ddf0ff70721ce40a34174eb6001adbd9e5e release23-maint
+38064 d4702e67e1197fb293c9018907d44b573e989323 release23-maint
+38065 7fb67ae93128e195165795f420fd91b20bc52f2e legacy-trunk
+38066 a0c7df52ba415731a92d66456d8833a926b3d00e release24-maint
+38067 9cb8c687f3d67ffa7bb6c58e8d2238b1d3d128f2 legacy-trunk
+38068 308efd7268c26ceaa1ee7fa96ea9958bd77adeb7 release24-maint
+38069 7d5d6bdc4f979d5a85a8068313d810af60217acf legacy-trunk
+38070 ea340006c1f30b86e11827f60a983dc259cb3b5f release24-maint
+38071 86a60d4fa87a356acb6740de0fe7b50c3a6caf12 legacy-trunk
+38072 19286994f74f32a316081afede5665a73d9e107b release24-maint
+38073 7c413d3a40a52ba0ce2aca3ab57d97708ef605ef legacy-trunk
+38074 02fcb5eb84cb6a1fbc6ff68618e1e50d35f67c54 release24-maint
+38075 034c611b2e844e0ce5aecc6e0e465ae7173be74b legacy-trunk
+38076 98654bfa80ea5ddb2433893507513a49842907a9 release24-maint
+38077 1e8b033f91dc3baa99f98bf64b2cbc5feeb73729 legacy-trunk
+38078 a6ba28d1d806aa83148532b0d1ab5ac9e2a6c3fc legacy-trunk
+38079 abe3145dde4e7cf687f9c217f027bfdcad44a7a1 release24-maint
+38080 b6619423c196101952018f832b5f3d6677af89fb legacy-trunk
+38081 c1b440eacbb180bfd9dd944a1a836e65cd72d3b1 legacy-trunk
+38082 99e3ddb3a74aad79fc1fc3827c0beea6929561cc release24-maint
+38083 8d60077e9951490a8e284e5809bf06ffd490f34f release24-maint
+38084 6719369083c1eb9219e4682fdef3ddb90189105a legacy-trunk
+38085 9dc96ac94342382ddcfb2454b10601fd0d21289b release24-maint
+38086 2aa96ee3fcb5c90b72d2500241294338ef2f6ebb legacy-trunk
+38087 4a0c1e517e6bb0f58fd7339b8dc5660fe0e039d4 release24-maint
+38088 3911726aecb9001e7195d7c65f855119db0f0ced release24-maint
+38089 642db1fb3481b33dad0697657550e8479d5459c5 release24-maint
+38090 bbdc1d7310f497a78b5316b2e488ba46b5b5ca34 legacy-trunk
+38091 ec1925f07ec97e02c3d176b83b31f7b745165feb legacy-trunk
+38092 e2088ae0d67fd667ffb3b42a633a0bafa0e55689 legacy-trunk
+38093 57b23e575ffc630c29c44ff02a2c428dced5d86c release23-maint
+38094 95bbe991fcc3319f8f99664d16059054b1cf2da5 release23-maint
+38095 cfdbfa54dc6a701cb5900e33f7c8c968e16b8bec release23-maint
+38096 a7ffdc09f00267d7648f4bccda60a77de9d38544 release23-maint
+38097 694670f65251d5cf80fd133dd75315aa4a972ee0 release23-maint
+38098 93b1b0beba59f9036247a65760c1c215e86d0b6a release24-maint
+38099 ab1a17c633aebe9704a499ecd8f587fa2a05a5e1 release24-maint
+38100 a4d869ecef338beb32ef221cdc47e1aae7ba17b9 release24-maint
+38101 c0cc6601ddada2ea520e51ae5d221f6c224640cb release24-maint
+38102 90cd24a1ee124961024cbef3e61e10ca4eef8556 release24-maint
+38103 aea2237b388ff72fe968fc113ed73884b531baf3 legacy-trunk
+38104 2920691f63f0687cbc500ac320253852ff2ba0f8 legacy-trunk
+38105 914534f6ef6126a462f3f6ce5a81a871b75fa503 legacy-trunk
+38106 a15fa059f9f03007d17356e55f400e832a5b6c09 release23-maint
+38107 c9e5d1d1e887cc03ac5fe8809c1489830315f2f5 release24-maint
+38108 df0c2f3acc7c961b097049eb4a808931e0b237dd release23-maint
+38109 b044735c927b10426127867a1518028407eb4ea0 legacy-trunk
+38110 46353568e40d99d3ceb531f712b6f288e5c75d2e legacy-trunk
+38111 99ebec2be0312921f836bbc5a873259172928694 legacy-trunk
+38112 aaba1ce4b3ca05fd920d6cd72f624d95dcdaf994 release24-maint
+38113 86c3a7c6b00a1ab2802b25559ad12d92db152f8a legacy-trunk
+38114 f54e14000d6bd0e2af1a3cc9b5f2c193859e433d legacy-trunk
+38115 e82d183258f9c1064a8fe5d367311ef7347d5ffa release24-maint
+38116 5798aa654ec640d8da995313163bc084fb4a7617 release23-maint
+38117 28891dc25580caac87b0c0c2ab0ff2939269b81b legacy-trunk
+38118 584023dac406915b56872d1c88a35a7ae28b1249 release24-maint
+38119 4ec006ca2b91bea7e52d18245a3d015b153ad7e4 release24-maint
+38120 e81152152433fb18add4e9ad0297d70ad8807737 legacy-trunk
+38121 c702390a8e1222e979007e1ca53a9d6484c4e899 legacy-trunk
+38122 0d9163da61a3bb0035497bd000ac3c6d9055d8b4 legacy-trunk
+38123 646195b5920577d4f5b62ec58feab2dede8a2544 legacy-trunk
+38124 74a91e4559ca5b2532035355b8d80cc684396f9d legacy-trunk
+38125 321bc2d49a5a2e10fec4e43dc0dbe850c1882925 legacy-trunk
+38126 586a76f96b09dd4f24bc39e7874038dff64edcaf legacy-trunk
+38127 58981fe90befa4e7008478c9f2d8d6224b0209c8 release23-maint
+38128 1914c4db4b2860c96563e50b8a8b8dd7340e3217 legacy-trunk
+38129 b2ecda4dd70fdf68c050bed8acfd8b22d9e86eb3 release24-maint
+38130 af01336ff19db3068296a8a6832b629baf6fc046 release23-maint
+38131 04427174cf6ab13f7ef9bf8a17512214b793af3c release23-maint
+38132 055dd7f90b1ea8b6ee6cf855beb8c5ffd5d0cced legacy-trunk
+38133 a9a0336829ba0403ec7c13fba8c05d32c5f55d6f legacy-trunk
+38134 0006b2dd37c23691d621eb4b305334d9f36788ba release23-maint
+38135 00562dabfd4f37b83087c65b4537933c4e6be28a release24-maint
+38136 4acf7abe582577ee6eead718dc796862ffd4b284 legacy-trunk
+38137 a13d944ca76c9764ec1eb1db4eeb107cd523349a legacy-trunk
+38138 21dd524be036aca4ffbadbb6c85e9555e8db924e release24-maint
+38139 72cd93f463b5ad19a0b47096081a9da578556fd3 legacy-trunk
+38140 93772b716e3f9178cc6dc7c0436a613be71098ef release24-maint
+38141 d8ec4afa1ffb0af2fc09148b59794d7b97de020a release24-maint
+38142 e9cede91d3c32f6cd1bee47299bfee894d6a9209 legacy-trunk
+38143 afd9b82e68f1f8da54615c3bbfbec17168f0b827 release24-maint
+38144 b3af7c6db1c60ddd71735bb0386452021da5dcea legacy-trunk
+38145 ba8c3eaa43a59726bb4172d9ab54c5c95f2410c5 legacy-trunk
+38146 b2c9981983049c7821eadacf453112bb6ffe7cdb release24-maint
+38147 eab174d0ed031ad5cf544df75eed63b5ee952a9c release23-maint
+38148 a8a4afe18b6134a3034357ef73322f98e33c4540 legacy-trunk
+38149 e221d9954626895ae5008b3b9df0cefa0579498d release24-maint
+38150 f75ac86bcef44ef4f80f457699eaec4c9e7a485f release23-maint
+38151 57bfeb53f2fa34b223fd7e550038171406cf56f9 legacy-trunk
+38152 3ec54c5f708148cb262dd21c8a351da53d7425b2 release24-maint
+38153 5dc274e15822766bbcb136ee9bd69224354cb0f4 legacy-trunk
+38154 1810dfd615ae7dfd8af17f98d9579d8ae1697fe4 release24-maint
+38155 7622909651c53d78bc9f7aec2afc687611e77d6f release23-maint
+38156 5368d2b7d66a0a57e9faaab19a7b5683f43b4e0f release24-maint
+38157 4d383b998bb48f4769420a1e77561c1db3a77479 legacy-trunk
+38158 cd517701fd93c9448c582371427aa84f057158a6 legacy-trunk
+38159 3e9a4d531e563dd94d836ab9481383d040569c4b legacy-trunk
+38160 40725f304e18d73d948ae1a0ee90504d6a3a344c legacy-trunk
+38161 67f2190e1f6d9b6505519012aa99043205aa3db6 release24-maint
+38163 56e610327b816c5be7b9df94dd716a0ac59bef50 legacy-trunk
+38164 dc9d0a9ede8864d3bb67936db4e714ad97ab0c10 release24-maint
+38165 df380e196c4b5aa3445a0671d23283ef95196f46 legacy-trunk
+38166 1d625daed5944282369b85eb80e5129a632daf9a release24-maint
+38167 1f7cf8521bb5886b5a0f82423b4dc40f2c3a497a release24-maint
+38168 998fb1e1c8e9a6d23ca2e6632b33ee5cd7cb6943 legacy-trunk
+38169 cb30cfcb39e744572a4287cfbb3e3f0a842c6e95 legacy-trunk
+38170 991041f764478c905aefb3930e7396b8433206b0 legacy-trunk
+38171 0c326327e722391b6c64cc35c5bf71e47cfb0ddf legacy-trunk
+38172 f1c35da64d554d3d6a5c054a81444312af819888 legacy-trunk
+38173 f00bc273ae70d1e9dbae1cc4d49d1a40d360685f release23-maint
+38174 e8bf62083ac4446f326f19349cf1c0fc5cb64a02 release23-maint
+38175 60a4b064a2480a7097c6d2d26aaf57515436d14d release23-maint
+38176 bbcd8127b326829465bb44ab0e3dbce9820751e9 release23-maint
+38177 6127c089a06c9e22b5e4cde7901a3cd7a3406dd7 legacy-trunk
+38178 79ade2ddd306881d144a2515d75c649467c5654e legacy-trunk
+38179 72417fa21c7fcd75e95b7a9b5f50546e35e9ef08 legacy-trunk
+38180 32163a8c3b69d3870b5fdf443cfc2b67c98461fb release23-maint
+38181 e58ce04066cd822a0cdea4b32ee615f742c7c80d release24-maint
+38182 a6c81ad1f44cb7430bcfa0649d9302ae86294fc0 release23-maint
+38183 ad8f9e75f61d24208f54eef3e827985a468c4276 legacy-trunk
+38184 2bbc8b4b5b9375c234b85ba3510b80e5e58b110a release24-maint
+38185 0974376349689bb261658f22cbec57cdd638a42a release23-maint
+38186 f1ae41e8abf3891e96a676bec958884dc27bdb28 release23-maint
+38187 b647edd3b96b81f5c5cd774aa1fd7b82672bf8ab release23-maint
+38188 41ca7b768b4ff4efe584f7e448769b75a1d898cb legacy-trunk
+38189 3a950f1afc55ff376b78bcc5de6f71f1ee310a41 release24-maint
+38190 9dd87ba61795501a079467555b394c1324c6214f release23-maint
+38191 ee808e08dd6fb89955c054da665615e6aefc2844 legacy-trunk
+38192 06643f071335093049bfaa29ef24274814d2fa96 legacy-trunk
+38193 4e5f06c4f9579cbc7bbd56f4c415fc89272c88b7 legacy-trunk
+38194 ffe7542f8f1f7a784547bc1637240f6b9edf5ea6 legacy-trunk
+38195 9caf9cd5453d9e962561e5d27bd2551a3e1aad65 legacy-trunk
+38197 44611e5499e7c27e76ed62218c3410654cd7bd18 release24-maint
+38198 3fc8ece9d2b80a400aaf088b0132f2e9bbda236a legacy-trunk
+38199 a62b3b4ff52cb91897905424ac10d97c6b57bee2 release24-maint
+38200 aec59665029234426cf0234f68fb7104ff6091b7 release24-maint
+38201 d926b8a5ef6e34a243fc0ef4256ba40c3ec70d60 release24-maint
+38202 84f43d3a15354a244854cc4fbdba9d5e305cc19a legacy-trunk
+38203 e6bf2e72941ee0eef351b0750f1daccc3b894eb9 release24-maint
+38204 e15cb62b3ffbde0b27a0d124f39a3ff174f3887e legacy-trunk
+38205 ba24a0324a033aecd37d606775eeb626dba1d912 legacy-trunk
+38206 df95a41515c4144caac5ac98029510a08557b3de release24-maint
+38207 be4929e5179bc0b329b1149d402ce1bc2e1949ca legacy-trunk
+38208 f80bb8aff4192fcd22443d6c5a4158914cd4c981 legacy-trunk
+38209 8f8f560cec97ec5bbb8d184109f2505c2c701de5 ast-branch
+38210 2080c8c4772977d8985bf36b5960a00915d64552 ast-branch
+38212 f42a7c335a5b9ab00c034213aec2160843a39a90 legacy-trunk
+38213 8243e51a22deefe6524c3b03f5d9ae8aa400b977 legacy-trunk
+38214 a0c0cd3e81fd477b8cf5e0e076a5165827a6304b legacy-trunk
+38215 baeb09f60c828265aed0d5c3a838fee1a6ee9d17 legacy-trunk
+38216 3fee7c9116c91fd950bc6f66305a5077f65ec97b release23-maint
+38217 26cccf3e84829626f5b021b75daecd35a991559d release24-maint
+38218 a8ecd4a968256951f990c47cc04bec600e9137b9 legacy-trunk
+38219 63f3445f2f597350778c8d744d077aef01b9bbc9 release24-maint
+38220 56e0cc437b8b505f22a4cf46208aaa139dc0dfe1 release24-maint
+38221 6800600279ed63e1c5feaa5dda6cecdcce75f6a7 legacy-trunk
+38222 f263f943ef7b20aa0f75e4ca4f1b5c196ac01850 release24-maint
+38223 a123fb4d45bf4a67d4502532e764d8510393face release23-maint
+38224 ca7f4315b2126f7c64f23532314dfe42a2e23268 release24-maint
+38225 e51a821628464f25cbab67b4a09658b7305015e0 legacy-trunk
+38226 b2d3879004cd06dc315b5def207a65816afba66c release23-maint
+38227 b7bcbe398baa689adf2845b7d2408c08015d2840 release24-maint
+38228 b1a84233d8557d3e219fdd06a52e7ec3bce35111 legacy-trunk
+38229 f0db9b186f3ddc0e1c71db0ca9717bb0df02d447 ast-branch
+38230 d81b6173f050bf98cd281642a15ed26f5ccf104d legacy-trunk
+38231 23366889c6b94c2abb7b5d78a0507f34f9e3fe0b legacy-trunk
+38232 8618168dca270545bb5eafb00dade3c7e18d413b legacy-trunk
+38233 cc27b249755de6eeda5056dae309c5507982c54c legacy-trunk
+38234 35f31790c6f96bafa9168550170516ed61bb649e legacy-trunk
+38235 19e61a2a56320c65061f446589b1c87229581048 legacy-trunk
+38236 aa246b9f6184fb9a8fefdd1b9b023190cb6c26b3 legacy-trunk
+38237 b22ebfc488f3024f0d381dcbc352da8c31b24557 legacy-trunk
+38238 5cd4fffaf9105af83466a8d913293947b9253670 legacy-trunk
+38239 dbbe83c3294a3e31b0a097d767df1b5c6adc1c48 legacy-trunk
+38240 ff73e15a3fb923a1992a674609c5a8440a4e2fac legacy-trunk
+38241 ce232072eae6493bd174fc456acd24040776547d legacy-trunk
+38242 8a8d844767b6662f055722ae9993edb164ed2f3a legacy-trunk
+38243 cdaa1686960855ddd8875a63e5922c20840f0ede legacy-trunk
+38244 b8988134837535d912ec1a75ac332305eb43c5c8 legacy-trunk
+38245 9e30d9e2b433639255766a7b591c666f78099c99 release24-maint
+38246 c5975433aa6877f9d824bfca537eed9a1ba2d0b5 legacy-trunk
+38247 2b485974b4715bc626abe83a3f379eff2dff722f legacy-trunk
+38248 a94da2c6a626e4d34d9b6915f8ecaedf42baa6cb release24-maint
+38249 a0bc4419663c3105ea1438f21a6533171744773e legacy-trunk
+38250 287e71f44d79698d26535901d0dd6f0130f8156b release24-maint
+38251 1aea81551a222f6bfb229fd5ddfd7b64c50e9046 ast-branch
+38252 ba6e17271c628916911215de075763e1bcc0f76c legacy-trunk
+38253 4bd180d171cc034485710ef3e49cddd41593e3fb legacy-trunk
+38254 a31681a6cf88728783ff0049b6199202f3edebc7 legacy-trunk
+38255 18cff3ed74d3d96df9cf096aaba6c9a0e3c7e9f3 release24-maint
+38256 a216003cef04402d80e155daf5a30070db7f4a26 legacy-trunk
+38257 3533e3cb7b97a57e932395fd4a4c571610018584 legacy-trunk
+38258 91d55a30382cbb081479f238645ebe4048778bfa legacy-trunk
+38259 f25dcd7f3e4880c0487b18002152dd27fca5f8f9 release24-maint
+38260 598d16fa02c19912148c4d32e7f995710da6a58a legacy-trunk
+38261 7391e18b0a7cddef6447496abc7e3351e50b014c legacy-trunk
+38262 28f84938468dea1e53c1a3f40b33bc87923ff33c legacy-trunk
+38263 0a1608a5eb05aee49a483957043a62f8a214051c legacy-trunk
+38264 e2c1097d7e8fb0be517833d39ebc7bcaa0b9fdaa legacy-trunk
+38265 b6ec1b3b9fce79c77df172675856fee667f04a28 legacy-trunk
+38266 b480abaf1f6f6e6ab7d2a53a2176cfda956d5c85 legacy-trunk
+38267 6c02bb3fcca6790980982e0f1d09d13e655a90d5 legacy-trunk
+38268 7059fb8b9eb3934e5ef51706d7ccac35d005c388 legacy-trunk
+38269 c4db992f840f304edca60a2732c924294f3a6f4f release23-maint
+38270 45a320f38c48901f35bc4cfe21355fe5e7dbc482 legacy-trunk
+38271 d7968621d28d2e7cd195ae8c1322ce103a033224 release24-maint
+38272 8bb46fdce8fd38441ea7c245528d662a95663489 legacy-trunk
+38273 a99f5ad29eac64a2bf047babf9da45d289fb6430 release24-maint
+38274 8eca8d980260ded25a2cce1887b1ce35cbce18e7 legacy-trunk
+38275 13a85806ba48c9793310a72847fd34b816c39473 legacy-trunk
+38276 a8599c788218d8885227ae39ff5c89c9c9c93b9d legacy-trunk
+38277 4282f882b285956e3bead7b10b3c4bdbd688516b legacy-trunk
+38278 b93845ce445495e3b485cb6b39aed5f183b70110 legacy-trunk
+38279 c88ab292bf0528aa95a6712d0f1259a021285d41 legacy-trunk
+38280 72fd373cd0f95a1c2f6ed45c6a1970a69f220fce legacy-trunk
+38281 1d866c02a8cab205bb1a402ba9770ae45ea4a943 legacy-trunk
+38282 a70dd8767b071b34266ddbb062e5c6322f4f888e legacy-trunk
+38283 02f398fbb0f06d17c45b3ab06e428bc8c158e073 legacy-trunk
+38284 b32ae0eecdee71ad0fc4b7849ecbe72f49dfe746 legacy-trunk
+38285 8f5730a3bc4abf727e94373466945d69820663d8 legacy-trunk
+38286 347392c8eb8b36c53cb5eea20b211366dc336333 legacy-trunk
+38287 8fc030c5c70abe29191245464fc88e3a9b93eed0 release24-maint
+38288 563cbf4d6be46565f45f0405bed83e21d75e0949 legacy-trunk
+38289 fe7a1547f2faea448feabe6e516c3be4673ad11e legacy-trunk
+38290 fa65e3425a4c5ad6d1a0ed6071d4e1c058905a25 legacy-trunk
+38291 652b85d35a75dda10e2d331a576e93a0f73707ed legacy-trunk
+38292 269a2c14bc57084d36d83cbd1cec9832abffed12 legacy-trunk
+38293 3316aa540e68c807284191ee962ff1b62d44977c legacy-trunk
+38294 13934343a53b832632427158be5ac8a460dec5e8 legacy-trunk
+38295 5449b7f806fb7df2c22ef3801eec157da41fe3a1 legacy-trunk
+38296 5bd2b3e4fdcc4f57130920cbe505530cbf620ee2 legacy-trunk
+38297 8436a295591b68ca80a9041f6f64d49fea5d9a6a legacy-trunk
+38298 4b8fa8b0af916ee5d042f2ae2ab7fbcf3ff01d72 legacy-trunk
+38299 dc09cc9b2ee6c78d284d53ea533e0e01f7923a0a ast-branch
+38300 689c23385e4f9dd123d792c711377ba9b70ada09 ast-branch
+38301 4af3bffe56203aed22cce1458cb48d125878b98f legacy-trunk
+38302 728edefb1e17356e8f7d62bc07a65bc26cde6b8b legacy-trunk
+38303 e1305894bf096a8c9c96ecab7983e08424392557 ast-branch
+38304 49017d9ef6c986b68738f4f1e81c6aa88af2023f ast-branch
+38305 4b74ff079652bf5db0291a97f7f3316223985f70 legacy-trunk
+38306 69b68f91cc776690cb6323b49e4300b810ca1456 legacy-trunk
+38307 f56463494bfd94ee5a7d09703ed9c18e669e5153 release24-maint
+38308 039807e1e4d1282b971f918fa7114e2ac1a0bca5 release24-maint
+38309 e1a7eb832cb51abf8b7df52b5fff0270f0d5221b release23-maint
+38310 4aa554b00cb0b556d0283c139804b5878188ecd3 release23-maint
+38311 2246ab922eb48e400037af1847b29b03fd9d2351 release23-maint
+38312 955da080b0cf3680cb9d97b672617d91525b3ea3 release23-maint
+38313 7d99981b2ece32ed7a8720ccc69d90cda871f473 release23-maint
+38314 6fdbc4e833e20ff94672696fcf83f0ea34bf6a5c release23-maint
+38315 775a72b9d52cdc768a29e8511afe9bb99a2f6c70 legacy-trunk
+38316 ed4dc05ea4b8c126aa707ab0e36919888b7cb659 legacy-trunk
+38317 18f6cebe47aaae73599d2e3eca9c461eb3aab01a legacy-trunk
+38318 683719e04218182b02ed6a3cd840a77c70b5c53f legacy-trunk
+38319 cd6b54ba272fb4774bf7d9dc4b94f70fbb1937d6 legacy-trunk
+38320 d93b68a99f96e3815642fe36413befee42d8f967 release23-maint
+38321 6cf399aafc668e44263c0c11c27b8416f3987db1 legacy-trunk
+38322 21dd733eb118c3bafe79f878cf60cc7c77df4c31 release24-maint
+38323 8c0e3c0a233cac3ac47f0a573ab4f1ce8d1689b0 release23-maint
+38324 a063f0d6db280e4e45fdb9a48c66634214520996 legacy-trunk
+38325 af630eb26d59b7f1cd948cfb61de818d2d5c2d1e release24-maint
+38326 2931f6504af5c3d60ae2bea6bcc0c5c6e212dedb release23-maint
+38327 2eee90ef32abc7275a7d66858a67ff247e2c8c59 release23-maint
+38328 ad126054ade57500c9e479983f66f01de037d3be release24-maint
+38329 670de301b887f101baf945e23842d229fa60dd1f legacy-trunk
+38330 59523eb35c1d7126c017f1d2448fc4d923ccce37 legacy-trunk
+38331 a093aebf1b40e7d116c7df3486eb7c731e3f6bc4 release24-maint
+38332 6605e12bc16d713e3792602310dd94141e142924 release23-maint
+38333 51a0f0ad46ac0d9c317c5f829aea5eee7847eda4 legacy-trunk
+38334 70a0449755e261db83bfcbb895bd7d8af4c469af release23-maint
+38335 1f5c2351605a157dce1c9b87202b64f962242e6d ast-branch
+38336 3298ae6f366587c0578e318519c414f951214e78 ast-branch
+38337 8b6548f5f279dd94a0d8eaa6355a12594e9786a2 release23-maint
+38338 cc3bd4e4d9f0a563153e1b4cba4779e7014530e7 release24-maint
+38339 0133b022626eb2cb45fe67b6baee57b02112c09c release24-maint
+38340 d5ddd06d55fc9da3f1f4a0487fc02f3ade5f9f42 release23-maint
+38341 9d763937a25b4b48af4800c26cadb4a29b0d8aac release24-maint
+38342 ff53d14717c528135a4544467ed543fdf9a9df39 release23-maint
+38343 7df077f4705690d25cd7a57dd18f90868c88dd05 legacy-trunk
+38344 d5ce88ebdbbd0d750198c447dd00cc5cbafebee9 release23-maint
+38345 83c975b4a2c3722a06d2b59339822e6c83530e50 release24-maint
+38346 c4413307a2f310bcb7675e26a572192b1ab3a1ec legacy-trunk
+38347 f738d64c827d30871806fb704623340fad9b3656 release24-maint
+38348 63fcd67e3329ab3c1206e3d1c02d3852ea264522 release24-maint
+38349 2b258f0cbc31cb95d1f12cab09187441bde8c4cd legacy-trunk
+38350 0f41fe3fadf45e1f89cb4b02a0d776148c08f189 release24-maint
+38351 f246e4485637a94e441080e65b595dd7970c286b release23-maint
+38352 7f52417e530b34db29069bc28a254e9cb1d33228 legacy-trunk
+38353 2369dfe2dad469ea5c9d0f28972919a3da3c0d31 release24-maint
+38354 9724174262247a3aae7070dd5dd4169f21b6acbc release23-maint
+38355 b745595d41d1f16341800dbd0ec43fbd64498b15 release24-maint
+38356 e3d74830ed2fa7d5f3bc62c97908281378d0254a release23-maint
+38357 b9bc49b53f4d625d5c943e66c1f9572aded36d44 legacy-trunk
+38358 36abdd478e0741f240b499d6792298b32c769967 legacy-trunk
+38359 9c62e7d690a52aa985d0bbb6f788761d4f95ea82 legacy-trunk
+38360 e852cf6ab5b55217a985295f06c8ab39030e6622 legacy-trunk
+38361 4a1fefdfc7930463331f83ef786584d32fac17b8 release24-maint
+38362 8c9e3ed594fed2c86619c29aef549e0ac39815a7 release23-maint
+38363 bb0654cf5e5205e3738df3dcecd661c913bdcd47 legacy-trunk
+38364 4d29eb3a3ddbf2c33a0e3cc4166ad875f2ee6ec6 legacy-trunk
+38365 41f29e26f68f44808d37e62b2c15543acbca484a legacy-trunk
+38366 4209ec1706aba1757c41afc23b71a8696cd167db legacy-trunk
+38367 a72ee63c6c8490216c972cceacea289534c995b5 ast-branch
+38368 fc580ff00f6f570c9dc1e70fb7b7bacbfb59f739 ast-branch
+38369 6b1c7b18f59d87b581cb23747efcb45ca8cf1d30 release23-maint
+38370 6e7033c74c70b7c08e9dc46e31e5f8fd95c06484 legacy-trunk
+38371 68020bd1b9e2e2ec9314f3b7d7952d749e38e4c1 release24-maint
+38372 6b6e6b982ac857bf75ba7acc0468435c0feaf95b release23-maint
+38373 08e3ca8fb071f59a7c02c710e97f1968ee58e91e legacy-trunk
+38374 4da46258bff8cec961f166c267e62db76c26d0c7 release24-maint
+38375 c9337c9d2f2a94661d1e0ac082d7a7ee2c3b0d59 release23-maint
+38376 8f609eaac3f002a30c05fdd140a444e42d7a98b1 release23-maint
+38377 516ca0b92971b7039edb5f6042333e2b805fdbcb release23-maint
+38378 abb3c1ad00a7bb51c3cef555743e07f7fb8b0618 release23-maint
+38379 ae73286897a34a39e01a9f163328e2272fa8f929 release23-maint
+38380 c1641eeda7c9285507269acbfeb1ca468ed7f1f7 release23-maint
+38381 440c25bd99df85c494a961ce4badf2a6083f461b release23-maint
+38382 87224f2c5e10002da4d0dbd43bd64921fe7ca828 release23-maint
+38383 c4f76ed2eafa3f7a5b7dfd8b292a3bf97178e960 release23-maint
+38384 e949d463572ce6611c3173446363e8f66dcb4e8a release23-maint
+38384 2639b10daa985b20b3cabec45169d523cac29d68 release23-maint
+38386 bda933873758e54e3cd689374251ad3f31d85ba1 legacy-trunk
+38387 18ba085cc8bbbf5fead3b8c56d5a6ba1328a4104 legacy-trunk
+38388 13176ed52e65c484dbcf4f81fb8e7845f3a31ffe release24-maint
+38389 6f2dd081fe0512668206102bfdbd8201b3b4f21d release23-maint
+38390 1c349060ac08f370ba6c214c23507194edbf04fb legacy-trunk
+38391 91038801eb45fc32babc8434b0a4f3753a7bcab3 release24-maint
+38392 cb7896d77de522f24b91c705bedfe820bce30c4a legacy-trunk
+38393 925d54df92be950bd5edb7e67b5b5694451f02cc release24-maint
+38394 548134ba279fec29403ec784ff6a2727ee2f955b release23-maint
+38395 e3074e94fb755e0d10affec3252a33a5fab3660e legacy-trunk
+38396 6585127744681515121bb21fb3a3abbe5c1319d8 legacy-trunk
+38397 9b4e318d6c72674edba9e176d959f23f1c1f5cd2 release24-maint
+38398 6c90cb766e6ba40e23ed24a3ca93a9fbd85c6190 legacy-trunk
+38399 88c29e51b029a18c292d28488ecb6bb7faa6d6bb release24-maint
+38400 5fd5065163614ddfb2b20d5b36c813aae5f5ae06 legacy-trunk
+38401 804c5673643e6ef5038eef2c2977f68f05424d9f legacy-trunk
+38402 a4225cdc2047fd0d62a78bc722febd82a19ee4fc legacy-trunk
+38403 f430718f8b430e555195052e361ceccfb556a005 legacy-trunk
+38404 f0134232bd84db33287b1cdadb7de2c2be0b6ed4 legacy-trunk
+38405 0be17259aac886c5c5d4b83728d3f0e1d14d482e release22-maint
+38406 737649a6c935c9f0b08f56cc91b1b053da20399d release23-maint
+38407 b846dd1b97510ae923baff8c08671c403c5d6acc release24-maint
+38408 1c072615e5b86e36dfc944ba74310cc098ee0863 legacy-trunk
+38409 cd74321ecdc47a713158b65efbd0c280d39bcb48 release23-maint
+38410 69ed7e912b3d2970161e873857b0e9b45de6b4ec release24-maint
+38411 ccf6272eedf484c574968a1622068d1db5ddd928 legacy-trunk
+38412 1b78fc296fc895889a9df2b17e18d7fd6f799955 release24-maint
+38413 c68be8659075bbc99ba885e757f61f71e967f795 legacy-trunk
+38414 3d00b64255057ecc995708a00344f718cbd36ef4 legacy-trunk
+38415 3d99adefbf3c050d56518ca914bbe6f70e2e47c4 release24-maint
+38416 320c7643f8e9ef9934c4068be3b13e45e18531fe release24-maint
+38417 4174f978e564732d4ea7e9a6b80950dc9bec0f44 legacy-trunk
+38418 37b2f11c1a005f71dce9257c756ea63f2f166389 legacy-trunk
+38419 8259ff3ee4936127a107c7a45461a22d3441313e legacy-trunk
+38420 ca91799cecba0134bc39f8d25342893a2cbe956e legacy-trunk
+38421 9ee99a35568d01fa8baf62a3f0e2d68f0502466e legacy-trunk
+38422 46572442537009e37834f151a84753e0e61e3a89 release24-maint
+38423 7e5103b4b289d7aba89b2efe95551bf0232345bf legacy-trunk
+38424 f24117a3628aade603b018c6b61530e4766a0fb2 legacy-trunk
+38425 9d66fba78444f1b217f664125dd1074033b11407 legacy-trunk
+38426 7c8f3378f6f61aee9a74a7451e16a5e3a735ae1d release23-maint
+38427 835b645a168f74c01a658787612cb2408f6fd2f5 legacy-trunk
+38428 1c2943f95468639603ba0aff32c3e2b671d4b380 release23-maint
+38429 6314e94d0d35d97ba2db83a573332a36676b52d1 release23-maint
+38430 6858c24840108213102b0aeb60b90999487431c4 release24-maint
+38431 028f92e44b48147fbf34576497160fc7fca9ffc1 legacy-trunk
+38432 a24e70f4684b1d0bf69b90125e89c255ff7a5c2b legacy-trunk
+38433 cd04f2d18a6fccf918240f880ba3058c88cf690a legacy-trunk
+38434 c878bd01b81a16347f66a60c649d709d43b150ed legacy-trunk
+38435 93f2665ead5e2dcdec1a069db7b1585cee3e5b6b release23-maint
+38436 6a2440d05f50c3272e673f820764f5cd2b1e67ac release23-maint
+38437 3c144a3c911a7be1bb49a3428dfac1f03c066b73 release23-maint
+38438 e61aa86215bca79783fc121e98211b9ecd138b4c release23-maint
+38439 bb7f36ac9f3a8788971e6e2e60f83edbe973b24a release24-maint
+38440 29e6bd708fe75d3640f2a364e3d17d42899b4bde legacy-trunk
+38441 4040aa216b8ab16fc09cc48d0f6c33adc7a7d794 legacy-trunk
+38442 7a1277fad04e92657fc9783849e20b3b5600088a legacy-trunk
+38443 f77966da6de5dbc2c8017fc787bb853607e9f5e3 release23-maint
+38444 891c31dada4eb92511bbff1fec7780e3f31e27b7 release23-maint
+38445 705b7fb90056caefc6b4de6a0226118dbcf3059f release23-maint
+38446 37b6dd38856dde38842189ea3c5f902e97f463a5 release23-maint
+38446 d228509424172f977edad4f7860a9c747cd655c8 release23-maint
+38448 ff3ca656c281debfd360f37d0202f53d131c4c88 release24-maint
+38449 89b8ccf14c0c015ee9c67973446d5861b9ad80c3 legacy-trunk
+38450 9c66ab54c1ecff9ebdee601573b531e73f3f9f9f legacy-trunk
+38451 e67b587fed779c211338f1859f2e039821f2c9af legacy-trunk
+38452 3c172c826eed364d3c9f2c982487aa4d0c916f7e legacy-trunk
+38453 19327db75d1c92e36c361bd1192b1ef5457599af release24-maint
+38454 369e8e71ea3391678aadc084e2688a144fdbcdf6 legacy-trunk
+38455 4545a154fac1583be41bc798882bc0e2bb6112f4 legacy-trunk
+38456 3fdfbcb40130ce3a543d5e97cc09e460701a49a0 legacy-trunk
+38457 77fa30e7f12b06d36c68e0ec3508857c6633997c release24-maint
+38458 607c48b5efd7261550abd219f91ea9b6b720f4f4 legacy-trunk
+38459 5c2608504967a2a1784c3c6d1433ebcc8dd35403 legacy-trunk
+38460 ca7c18ef8bdc102cb64845258c1630f0fbf726b5 legacy-trunk
+38461 cb47d622aa1e2fc119fcadcb49db3192ea23ac8d release24-maint
+38462 0a6e779d347d6f175e29dccc07cc61071fd0c985 legacy-trunk
+38463 86ab3a75ff086b96e4d7fab1cca26c6150a4bc74 release24-maint
+38464 b94f2247388e92bd0e9a1737ee000cafc47e1335 legacy-trunk
+38465 9f183a258bed0ee9f62b3a4053f26082b77446d8 legacy-trunk
+38466 7e7e86f45255a9594820fade6bf79dd4fed4f797 release24-maint
+38467 e9ec2ce340fdc4420d361f5382ebbfc151093bd7 legacy-trunk
+38468 70cb0c3fe4a7475e2f9e9724e4cb349afecdda0d legacy-trunk
+38469 a899d690f264074feb5a0be3e4ef20e7d2bda500 legacy-trunk
+38470 ff3def77b1295f332698c6a2381a0bb19afcc611 legacy-trunk
+38471 1ae2c3b66e57a34637f9e483aeb74126b6f72a03 legacy-trunk
+38472 fa52f1ffc16115575069310895c0d25df9c86c6f legacy-trunk
+38473 376a71f8979ba1d563c8d9ac8561bfa03216b7e4 legacy-trunk
+38474 32b89606f0cda17ae64ecca645e1e3b147f764fe release24-maint
+38475 7f7c3dfba985620c6c4900177e129d472ae39008 release24-maint
+38476 1a98983e59630dcc0aee80390ccc31694e1ac9f2 legacy-trunk
+38477 7fba5ccc961e14ad8f13b30eae7569252bcf46b0 legacy-trunk
+38478 67937a3852fe4482ed36c9cec089c2f873d9cdc0 release24-maint
+38479 5e7aded3251ed2bed9af5df3efe35643b3126639 legacy-trunk
+38480 d804a50a20ab5279e708ecc28f22e620b0860957 legacy-trunk
+38481 8098c7c270971e2d2a320b5bb6990e9f05ff980c release24-maint
+38482 24a333741cec99a09c9e8e674572c680e51b8c56 release24-maint
+38483 7dae1a81ced83805f2868dfb647fffd1de318f0f legacy-trunk
+38484 77703ed543a10f2d1aaa2cb883895bcb031ecade legacy-trunk
+38485 d439c748b45451cdb4762738ad90adf79a27bd3c release24-maint
+38486 8b4dd2c1c2a063f03b700a7488e4f97fd079fe90 legacy-trunk
+38487 4b1207cb01ea66fcc724fb657ce6cf5b0336b6d4 legacy-trunk
+38488 813030e4d7b0a1dacde421a4639e6b2dd8cdf6b5 release24-maint
+38489 c60fde8b0106b09892c54424db6eaffc37a1b7d9 legacy-trunk
+38490 7c5732652a23cbd71e9bf6dca8b5ce573009d3ea legacy-trunk
+38491 618cf24c329f99fd5b017bb3b07ca31abb3c9a87 legacy-trunk
+38492 07cf1a1640da412349df47077c8b1253bc2313e9 legacy-trunk
+38493 a4d13974f6eb7c4df90104102025b4e3b40dbea7 legacy-trunk
+38494 ac6dfc67c77ff6d1d8aca61c139f6abc6f18d940 legacy-trunk
+38495 a36c5fd30e2127ae12dd539f6694787e93a1f0e1 release24-maint
+38496 9f02276d54cb4ec32ec39a528214b9995f2360c6 legacy-trunk
+38497 0386cc1ee964e4d4878427ee3aafc787cf2e1e05 ast-branch
+38498 e0f4eb64d00391e3c46b5f289058b29ff2fcacec ast-branch
+38499 2676e05c01f21aa85ce1cbe5c7d5eb7edd0885d6 release24-maint
+38500 c99ae8635f3b54db883904d3abcd730f128b8bf6 legacy-trunk
+38501 0dd146fed9dda3ce3fb9acf951ed831216513598 legacy-trunk
+38502 556f6f1056a8f6d5d03a28ebff4bc33f97453e7b legacy-trunk
+38503 1edea4c2b011b53afbbb53c93c402029b329cc47 legacy-trunk
+38504 516bb8fd75b4bd57981acf1a77fcce33178bb0fd legacy-trunk
+38505 76c9ab85f5a887452467fb21532e4cd11ff2fa33 legacy-trunk
+38506 5fde17b3547254baba64999d21019e64299ce5e1 legacy-trunk
+38507 c5a498c10723598b9b4f1974c6aefce9a16e59d9 legacy-trunk
+38508 fcacf9d4b8f0faeb7562f96ce868b181584f573c legacy-trunk
+38509 d259984962065fe58b876f455820eddd0c04635c legacy-trunk
+38510 3e7a20c297a60e6e7dde501bafc9f9e42e3db72a release24-maint
+38511 080d8cfed9d4a7a54d5ccbeec7e0ac5602b2be1c legacy-trunk
+38512 660419bdb4aef9bb5de285c765ae6dee142f0c97 legacy-trunk
+38513 416b534e9cc968effebcaf1755be9e3cfe382f5d legacy-trunk
+38514 77b57087fe45db247178f0e235e426f7e4d28f91 legacy-trunk
+38515 4329a1a00469d163ca584b7e0803117b3e20df59 ast-branch
+38516 89cf25e3679ae99a4902bac05015beb862777b70 ast-branch
+38517 d1b35af292630b6097cf6b3ba20305dc1eddebc0 legacy-trunk
+38518 a2b7cb73d9b1d70ebb48353d64ccecc82357d954 release24-maint
+38519 5f26298811b7142a6f7308678d6d72bff86c1455 legacy-trunk
+38520 3d0bb3b05d39f0bd14d9f8c69e17751841d474bf legacy-trunk
+38521 1176f1bb4e1aea2ff5182720c46abbf60c1f1ac1 legacy-trunk
+38522 4a0c202ee789a373f647dd00934864ee2979b277 legacy-trunk
+38523 d3ce7a94616e917cfedbe0036b4f10fb1cb806f9 legacy-trunk
+38524 636d6d433b62637aed4efb18b3071bd4312d7624 legacy-trunk
+38525 fd6d359ca266221b7aef9a63266df5aeef22372e legacy-trunk
+38526 b5a25c56a8523d7f948ab06693f96c910c85a169 release24-maint
+38527 6050ae842c8f1c88b9aaa235625ec4d83d9d5bc5 legacy-trunk
+38528 c505cbb26cedcd050f46d0b7e51b5b40fbc45951 release24-maint
+38529 fa3cdd4f9cd017a7eed97e157f24c8d7e679a98e legacy-trunk
+38530 b4315e67edf510b92f6bb23e9954a236a4c3c648 legacy-trunk
+38531 a9f161e36bf9041ee0da869e19f5a8e545b1e549 legacy-trunk
+38532 d48fa0afdcbafd50e1433921b57dc829ec6ed443 legacy-trunk
+38533 13a950a3624bcaa2b4d20b0d4d4d9f5966f2d3ff legacy-trunk
+38534 11fcdbb279de92aefad893f6d621712f987bb7bc legacy-trunk
+38535 d9927a65f5f92e276d92286e6c43d931c1116dd8 release24-maint
+38536 cac31b4b5e78d4d25789da3505381e0dadf83f48 legacy-trunk
+38537 861be9cd04d7ecd48fc3ec40cf7e4ceae8465090 release24-maint
+38538 4aafb1c9a70d900e871eee3134077571b15cf87a legacy-trunk
+38539 e48b5a61d80bd6ebd55fa8d1ffbfb97b62bc2e1f release24-maint
+38540 a6d2315109a4f2ac9abf6db84517bca93225790e legacy-trunk
+38541 2fd9b85ba65fdefcd5f2ff0d8d0cfd51cf4eac18 release24-maint
+38542 e6422525c24031895cd4911a7990ea98ed0b40bb legacy-trunk
+38543 75564530f50c1efb405dfb927668cfae6792fe02 release24-maint
+38544 918bc6d56d26f66125ff54f6924a51cc7179c3f6 legacy-trunk
+38545 9fa768a98c5ca361b808c262cba6f0e8721fc918 legacy-trunk
+38546 b40586129bb0872b5e0c04bc11745e279006ee69 legacy-trunk
+38547 9d608419cdf8d536cee9455d21af3a3ee949e54a legacy-trunk
+38548 3785610ff76301f4df99b61dceef8616a8f0beeb legacy-trunk
+38549 46300b1aa2f6825fdfc412d370987a663ec8a1f8 release24-maint
+38550 4812f6a7f7355683b22b62ac73ab0ca5c81718ec legacy-trunk
+38551 8c3563d08c623dea8cbfc79c2958a782fb98679c legacy-trunk
+38552 9b3a2c4302aac06e09e9ae856fa42e321fe71ae0 release24-maint
+38553 0d4108d3a3a8b77dff58e1351b0b16c34fd570e0 release24-maint
+38554 4c66c17c4b2809b344e5c7f4ed29470416d58458 legacy-trunk
+38555 db7a8310b19a94d617a95af0fe47519146ffadb3 legacy-trunk
+38556 085bc27f92b7519af336a83d634331f68086fd33 legacy-trunk
+38557 00e47eb136b2c095151bcb2574d37111f30efffe legacy-trunk
+38558 7a1a8ec6dc5344c0d023b0387a67a2d9e6fb8f34 release24-maint
+38559 8f0456425715815101d9014650208c6b4222155a legacy-trunk
+38560 4abf21be17d354195c09a37330913ea7a37071df release24-maint
+38561 e9ffad6d88228ec83dd79ee4d0d9e139321db2c2 legacy-trunk
+38562 51afb6e7747408e6fe970e077f1ab1ed77b8b221 legacy-trunk
+38563 81982584c61bc56246f59e6b625f76aa9155a8c9 release24-maint
+38564 481397683eacef0e9b3a81a850dff496308f2ddb legacy-trunk
+38565 ed6ec000a138897e5c17e65b7c58543cd47885e2 release24-maint
+38566 903045a70c3eb6045bd8f0aebcc6fc0c5e286a3f release24-maint
+38567 0c40803e5e4d408e2c7f172fba1c62fce9e8fc08 legacy-trunk
+38568 f87a8d0df1252bb91548e1d4bb1ec0bd69bc3696 release24-maint
+38569 49d7bb2e96d2f5cbccea1e7432730e943e30ee7f legacy-trunk
+38570 ae061fc6318dce0729f3d95f42735379ec1842e1 legacy-trunk
+38571 eac01cbcaada9bbd7bfd5503c2c054169d340eae release24-maint
+38572 1ac24e9183e5177d6082a76ce5f3fa827f0b9baa legacy-trunk
+38573 4ea9de01d31156da7277f2aa78f6f91091cc56e1 release24-maint
+38574 c2b591d7f29efdf9f3bce560f1cf14e6f8b42d2f release24-maint
+38575 0725f0d5a5c7588af09550d4d705e3488298816d legacy-trunk
+38576 817e22506fa8f9c96ce5ce9b8c93ee503bed07ee legacy-trunk
+38577 604ff98915ec818546b2dacebf01f26306d23421 legacy-trunk
+38578 9f078d7668044477424725644a9c1ccabf2fc2a5 legacy-trunk
+38579 c05178f41db390785b32713d93666ac75c0b9479 legacy-trunk
+38580 a0d3f773543db281a7646487e91cd327f85e4719 legacy-trunk
+38581 79302e50910eece20f2140650b422f3e69c8aa0b legacy-trunk
+38582 a91a48c9de00c9aba9f2a66aebbd8325860c2a11 release24-maint
+38583 41a9ca866038203644bafaa64208a119151636f9 release24-maint
+38584 84859b4a62c6ecde56651801cf54265989dd3614 legacy-trunk
+38585 5d0d76d7b31fd882e1b1e27e02bda84daa0e8060 release24-maint
+38586 1309f69b4dbbde8b7c570651319d47a54689eb9e legacy-trunk
+38587 7de76f34b3da2f09685a1f4f91dd8e57e2b73ab5 legacy-trunk
+38588 f4da46b94570892235b1063ef89e3b84c92132f4 ast-branch
+38589 95b66d9db2ee659a0c2a299d3c414a562e9600ca ast-branch
+38590 3098efe42a0f2086c44058479439e540686b5f08 legacy-trunk
+38591 7d2c8daa403b619cff70c8f570c68c390501e0f5 legacy-trunk
+38592 d687a8a09a72d74d648d4b890ce67baa7a161587 legacy-trunk
+38593 0d44d9071e97fbc10639ca645f4f337b1e1eca99 release24-maint
+38594 f1fa7bb2bf9990f40ca09babde7348a3b0941681 release24-maint
+38595 697b9eec55da82c4d7a0b3d6d965566abe2d9a43 legacy-trunk
+38596 d5449f1f840ecd4e2652dd2624e89b34f8d50be1 release24-maint
+38597 f29012181cf017b8fba5fb8e79aa2a25f247302f legacy-trunk
+38598 e5d19031a295d77bd8600a4529efa856c43f9536 release24-maint
+38599 6b6875edf607e32b588cfedede081cfbe2ce0488 release24-maint
+38600 84713d4b19af136e4a4a3f56c05f80752e68b5e0 legacy-trunk
+38601 44f148bfc6b88175ab67043e66efce9fcf5f2b90 release24-maint
+38602 ddc2276c247e686f8f1a08481becfa6fabf3cc0a legacy-trunk
+38603 516f155215984db3b6a494c487ec13b51d15d625 legacy-trunk
+38604 b5433d3c6dc88476f22809fbac48d43155c935e1 release24-maint
+38605 21e6577ff074e116df6a73232e8da9b63bde6181 legacy-trunk
+38606 b122fd93a5b516e0190dfb362e7d0059330d0e97 release24-maint
+38607 16cef09a8342daccafcb85819a2dbfe17141493b release24-maint
+38608 9906e4da086fdccf44c7efe53956453a3d2c3c67 legacy-trunk
+38609 52b651a9750d5db34ca021ea4c3ae7c646156909 release24-maint
+38610 430356839d28591e622fa826fe36d860ab8378ec legacy-trunk
+38611 2c73367f54eeec8962635a0d1664004f31801be1 legacy-trunk
+38612 0349257e1ed52e1f792f860572a918bf76368705 release24-maint
+38613 b1427cff2f83211b70aca32c1498a53c8945f3c8 release24-maint
+38614 cfae4b1206f8ac9d50b0b4f762e67541230da543 release24-maint
+38614 1195f9ba3439097cc5b5a367e3ae1b43f157b264 release24-maint
+38616 0be05eba116d8184d86ea1c32988331e64beba24 legacy-trunk
+38617 ea024a4b29b6d1112f6b917fdfdf25dfc580369d release24-maint
+38618 1afefcf14f0638c3a55936913dd1e696df464db5 legacy-trunk
+38619 e83309d43a82e99a7501b4987b2603207c490331 legacy-trunk
+38620 d355da1d7c8fd19bb207db2caa3c78062f748290 legacy-trunk
+38621 65e8aacb0e94b16239ced82b42113036c398bfef legacy-trunk
+38622 81b5a13fa38a2490273da6611c0c0dedbee8b5b1 legacy-trunk
+38623 8d8ba66780ed778502ce38b6674aee3fb1047aa1 release24-maint
+38624 453d89eab73936fb915f989579c4ab2b2c3f2af7 legacy-trunk
+38625 0c82a7ef9554dad9fac879288e0a77e7259e63f2 release24-maint
+38626 3bb759498767d690fe6f2c29cbbdcc23825e1538 legacy-trunk
+38627 fdf2f8fad8d45736386ca38569c007c82ba96306 release24-maint
+38628 6f9b36fc111c9afdad42f985c3138fc2f82fa982 release24-maint
+38629 b8d905ca9e999966d677ae6454764afba3a60625 legacy-trunk
+38630 3d97eb3b7cecaff46fdee269005f67eda48c8e63 legacy-trunk
+38631 72b9eb74226307bf2abb6c039d2b69a2da6d0024 legacy-trunk
+38632 3fa34759548720b6f9626fc3a979e0a54797ea1b legacy-trunk
+38633 5180cfcc87bfe72640e5286d03b13dcd67012301 release24-maint
+38634 dfa097ccbc49da453706115eb7a93d432622db81 release24-maint
+38635 218a76275932ed68d2a67978f28842f9bf967614 legacy-trunk
+38636 679c161156131c9d4572a076710184d74574e82d legacy-trunk
+38637 962800ee30ef5f42a325ea62be603cc4f50d531f release24-maint
+38638 04baa644ff003391debfdc2a67a027dba4295ae1 legacy-trunk
+38639 11b4350b58792da9f78176560c53c36c900696b0 release24-maint
+38640 e5278331d9a9058fada7a4b4a106c2c3ecc5d872 legacy-trunk
+38641 6f37d116026109928347a70b6df7920071530bc8 release24-maint
+38642 7f7cbdb2c61137dacc4bb6eff6c481811e429c79 release24-maint
+38643 5f893a4cde6fd8d6dde8b3382877137732ab1357 legacy-trunk
+38644 50509ee96364c7e862b6c037ebfe428e235eacf8 legacy-trunk
+38645 313ed2817d6809e33d447b9c0887a158e73f6f2c legacy-trunk
+38646 4db5ea9577babdc7cb84bd94cc875f5e08d9f56f release24-maint
+38647 07745166f5713ba56c1b8ae812b9af4fbc63888e legacy-trunk
+38648 fcb507414c4148f41bea1e9bd9068a6e02d77f03 release24-maint
+38649 23ca2630657c48509c35b6b3845a6b04b40b6727 legacy-trunk
+38650 6a649816124a7ce45a5a13c69897ac4195c14a75 release24-maint
+38651 bc159296d2535696d040851ad38b8e4c029f6edf ast-branch
+38652 511e7a93a1e9f105e6422caa9355285b685f3a89 release24-maint
+38653 84eb5e1855476166bf29ec7d0fb9fc9801faf7b0 release24-maint
+38653 333cf303543b680ec5e3fdf7e8c9661f9488a50e release24-maint
+38655 beb1cb785e1d5406cb035f52d52b4a34ecc67d81 legacy-trunk
+38656 7d7404a6a5ea3d2437716cef19cb9a16bc6243f2 release24-maint
+38657 719eb102ea44884ffb9962cee45a0b5b501997f1 legacy-trunk
+38658 fb39f4eeaea476275c0184a70705d8c0adc3d778 legacy-trunk
+38659 2ee575b9b60e5d2a950aad3d44b78ab6fd5b9912 legacy-trunk
+38660 fde5a1c6a497e5456d6cf755f13934a801c9ab63 legacy-trunk
+38661 9d80e63004cdc6c51978b22abcf029ec35d916b2 release24-maint
+38662 a305fedca1bfff534b6b67658dd822472926ce11 release24-maint
+38663 04fa132c9023dec04ae81cc3690607d64dceda51 release24-maint
+38664 336fea406fcf06b88f3ffeab7153fc751c2e14bd release24-maint
+38665 4bce2e50961e1cb80ddfb92f8a72d1be414ef62b legacy-trunk
+38666 997b255e1ccc88bef9180cab9048732776971547 release24-maint
+38667 76300c5fbcec8f5878f5f2b3b7126ebbafca3609 legacy-trunk
+38668 fdee87b7037a3b6003ec82e20d0bba2e1cee8ede legacy-trunk
+38669 0a6a4ccf5ccf9fdd0a9b637e9894d43f03aed6b6 legacy-trunk
+38670 23e3dfc0c647a8f50eb6ac1945e2e55e92f7c30d legacy-trunk
+38671 2b38ed66c67ff769e0f44d6d2d944b3de965f54b legacy-trunk
+38672 dc6f315f1f7f15f96b95d34e999f50ac3ab55005 legacy-trunk
+38673 13c1c3316c6fdee42a4deade6e44d9155597ba36 ast-branch
+38674 cf4302c21e003db8a73cf71e3226e3ef7c2363e7 ast-branch
+38675 6d1ee9db1543ef24006c7d2f72dc6d485e4b07e8 ast-branch
+38676 9f454af17f7a38fb72650069130d9d134a9b9038 legacy-trunk
+38677 3e2ee219727d100d62cfb137410b5047f9af1d71 legacy-trunk
+38678 b14c8e6310e712e756dc23649752a252fc7c4be0 legacy-trunk
+38679 9aea9f8bdb2c4781d9b45d56c6447fc2f733b492 ast-branch
+38680 107e1e8c8fc7e5a0d143bb4234ff315fe0bb87f7 legacy-trunk
+38681 23b3e7906e0f638fa8f92cbc2412c566de1da28f release24-maint
+38682 c06c90bea7db07039fe2d6c9cab2e401909bddf5 release23-maint
+38683 bbb60e269ce8dc5087cbb8e43dfce6710c4790e9 legacy-trunk
+38684 3da21fdc2ee722355f0627dfee8ae20efdb23087 legacy-trunk
+38685 f3f99acae59ff870fa1d043a4cc2b03713db4f16 legacy-trunk
+38686 4c13b0146b3f6bb4246935a753b6285093835727 legacy-trunk
+38687 6d2000baf3de9aaeb468d1afe1b674e090c9afd6 legacy-trunk
+38688 f13f2cbdf4de29a5a6999ca00b37c6c6f2bce4d0 legacy-trunk
+38689 0852d196b59043efd91a3c4e428f21414abbb349 legacy-trunk
+38690 7933531d02b462142320b53addeb3292aaaeed74 legacy-trunk
+38691 69e10e6357bd76f6cf59aa6e7528d93d15e26e0d legacy-trunk
+38692 cebfbab017a6e6335029363dee4c2451b92ae669 legacy-trunk
+38693 718b0b5a6419f8e5a801d39b65ab1ce420315cd5 legacy-trunk
+38694 99c16e44e5d46f746c586678dd0588d0764c1ca5 legacy-trunk
+38695 d55deae4310dc23d1a79812fd05c22b01a2db6ab legacy-trunk
+38696 8f21ec3274f1c469bb16f83e01b6f95e177b3487 ast-branch
+38697 b8ff9bc023e6759c7faf74dd5be53ad1241496f2 legacy-trunk
+38698 4b9df4856f37a6306577be5660e90456450345b9 legacy-trunk
+38699 2380f9d1ebab95ed4b0a49ce829dafb0869d4ef4 legacy-trunk
+38700 5547f90301098345d2f9955e1bad1271129ffc8c ast-branch
+38701 91523caee183905e646d06f9fb49d0d41e2f83a1 ast-branch
+38702 e0f519853a9f2808610f93c0e08aa767dbde2f46 ast-branch
+38703 57c6a6a802a083167cebb21d2f62ee5bc9e92bbc legacy-trunk
+38704 3c7b19689479d8ac5d421aff21181f94da1ff206 legacy-trunk
+38705 8fc8e7a6071c50416903c85263a55aafea130717 legacy-trunk
+38706 49e30c6c91c8ce5afbfaeb2fc437a34ebb700363 legacy-trunk
+38707 b016236dfbd9dd02cbe4cc3e45445412846f18c0 legacy-trunk
+38708 26f3272d9e112ea1eaac30d63b428c7645048c14 release24-maint
+38709 a412638950a13ad340da97a64bba7010399986b7 legacy-trunk
+38710 721e60f454f3c890654c99c7d303527f78c9772a release24-maint
+38711 2956df8e0a4045c0ff13c6dea42d2afbdcac1770 legacy-trunk
+38712 07a4e8d8eb692212d90dd40324e911b09801799e legacy-trunk
+38713 4eaab38566c94ff849f400b9cd68a1749abd7ebd legacy-trunk
+38714 01ba3b40431f29fed629e7a210185062fa4018c4 ast-branch
+38715 f1c6303321d70bc35ef5df7dadc65c27ec05b858 ast-branch
+38716 d69fde40c719c95c6d50584b0607a972c81bcef9 ast-branch
+38717 7611df21a59009d5340c1716ba4125799aba9fc9 ast-branch
+38718 93caa7decee3606509341cbc31ac5ae40c6ed20f ast-branch
+38719 ab81c83a9ac6ccaaac4e27ed16d836a8f3fa266b release24-maint
+38720 653cc09fd9310162318daad96501be0b78aeb996 legacy-trunk
+38721 47c5803aab4581b9877a10fbdb89eab38e34d4e3 legacy-trunk
+38722 ec87a11640d002bc26f0e0a4c44c1748f277d861 release24-maint
+38723 f92d845f8703334d88fa158be0d7bdbf29b01b3b legacy-trunk
+38724 a50ffe65911b0d49880a6a1058ef05835e9dd28c release24-maint
+38725 00ffdbfcd5a9278692ee6e71152d556bfa0e2a96 legacy-trunk
+38726 5caf80f55c8638d8f9550747daa6645aaa8197a1 release24-maint
+38727 985dd7f0642081ea94a34f994e9add9f2f1d3002 release24-maint
+38728 4f0838b68bbbf1de29d766b3de3625c29691ac5e legacy-trunk
+38729 b72df8aee56da8f9cd276e86cdb03ee9add0f09a legacy-trunk
+38730 28892e6512ba6b9b73197606f3f2d8f4d98238f7 release24-maint
+38731 33a9e40a58d52a020c2b52868079489532583a85 release24-maint
+38732 ad2dd884137ff57038d4e05369c128016ab6c176 release24-maint
+38733 bba039f2e0529b16a3ed5628b12bcb15cccf82ad release24-maint
+38734 7cfda989886396831f52e3a58250b4eafd8cab86 legacy-trunk
+38735 3bcdd446a13b9cb79d28c6e7e8d4d3b2c8ba9868 legacy-trunk
+38736 306f7d4db5efccaf1784e7fc32d43d8cdbc75fb7 release24-maint
+38737 a6c586266dea58fbc15a2125d8deb7debbd41b94 legacy-trunk
+38738 7e2d8e17cf14a411b1e560548d780dcef2df38c6 legacy-trunk
+38739 30b02c7ef8ba6702ebfa6e6b2169b5d3cd5385e9 release24-maint
+38739 f9054d235870029afa33ef945bca7ece99616c10 release24-maint
+38741 f31423c495d67f0243e134a5c75992e58af3f3d9 legacy-trunk
+38742 de121899d021616340bf8674097b57cd1a3de730 legacy-trunk
+38743 5dda1f9e62a736cfb5d0bb010a405c10bdd3bfc3 legacy-trunk
+38744 0658e6effac7048f1e951e76dbb91c20782fafd1 legacy-trunk
+38745 cd2c044f699d7c8ccef5116c814aab1bbb17e6a4 legacy-trunk
+38746 13d5caa1e9d02aa999703e28d3375be8c6009658 legacy-trunk
+38747 51ba8ce8d92afdf03b68a81102dcffc2ab275b42 release24-maint
+38748 58f3f0d045f545adb9ac3f608efb7641aa434e45 legacy-trunk
+38749 84453050847567f801729835f1bf5b300187cf34 release24-maint
+38750 aef713de7a23c6451188ceda9046bc9e749abbf3 release24-maint
+38751 ead5e73abb53c98f3c68a9d3b63d57c96b37fd4a release24-maint
+38752 63c5d6ce07634d662e14e877d2bbd5dfb6274d98 legacy-trunk
+38753 7e1a3133fff2ea592f3281997a682518f390e88b release24-maint
+38754 6aff22600e15aa366af8e6a910011c0eb63fb1d5 release24-maint
+38755 11fd2637e5bb744e3fddfd40a4dadba2da237dcc release24-maint
+38756 eb6c2915badd35c348eb71a7ddc3ced590cf5739 release24-maint
+38757 a9511c15124be5a58032ebefc17db50aaaab0a09 release24-maint
+38758 2ea3d6915204103d99ca0dd0575a03e8134f2e94 legacy-trunk
+38759 3936cd7f16f255f11c9c24389afd7439dc3ac13b legacy-trunk
+38760 b85e810460efc5b42771a7585e75cb8744312ba2 release24-maint
+38761 fe531b5dcfd6092b144400438f3a4eda7b59fc21 ast-branch
+38762 80cc44eabdee259a0075018c26a63dd5fbaeb7ca ast-branch
+38763 6b21dc9438ad5c1ef999627f8f8e542e9c6affd7 ast-branch
+38764 ca4d8b4fbb05db31069a6e8075a1271199c8c159 ast-branch
+38765 5c1ebb5ae52143968143839af7df913c946b03a4 ast-branch
+38766 5e8c8cb11e5bdc2f3fb71cc76aba0f14672a68dc legacy-trunk
+38767 ab5822f7515a5fec572f032ce991b3236cb22adb release24-maint
+38768 71fd7ee4b7f50bc933f7114081af932de88abd2e legacy-trunk
+38769 34cdfc5dd7ea34e5766d8898e24e01b1a8173c25 legacy-trunk
+38770 b49d39111c486ced8391c79ca35f285aec8e16e7 legacy-trunk
+38771 5535ce0ff7f9f6f5de98014268e00b575f880f02 legacy-trunk
+38772 da460841b63cb83d617badf88fbdb12d8dadac9f release24-maint
+38773 bc9fbc23cd4a59918db1271b0864d40b4dd956a3 legacy-trunk
+38774 b649973d0962eb07b589bef3425fae63fdd99435 legacy-trunk
+38775 6dd2d136e84661c07838d42339341405e9b2c455 legacy-trunk
+38776 e762fea78cb2363be1635ee746fea2f8c914e54b legacy-trunk
+38777 0143d990d60cc60120e46b4a11307a973cbc6c0c legacy-trunk
+38778 18dc9158160d5b787947a30c76058f66033e17a3 legacy-trunk
+38779 5a522225c4db359fb7d58385e34dc2c33609dc17 release24-maint
+38780 20b3c723502ad4b39f38381b8e44c0becb1d8cdd legacy-trunk
+38781 c2a9c3a184776fc6142656e500b23ce723cfa2d7 release24-maint
+38782 9a7f46c4277314f74d59f6bc124dfa47b695d91c legacy-trunk
+38783 b996747c08b689150206541db52c839a1e1bb49b release24-maint
+38784 af5d48014b3e636586a866c5d51807b17a12f72e legacy-trunk
+38785 5bc91bb244b1902ff431f715cbfb6b7f40b64364 legacy-trunk
+38786 64bc5a922f5791b4b875cec0dae7b1857a757746 legacy-trunk
+38787 143cda5a93481fdf0732ef4cc60184f694f0255e legacy-trunk
+38788 03613097b9cb345410f547f460b0556b637000be legacy-trunk
+38789 79201f820ed04a90daacdcad4616f5af09d8e2b2 legacy-trunk
+38790 ad6aa2eecb569b145263ee9d10bb3a94cf283fbc legacy-trunk
+38791 076a7c7fe28b810b5000059ed80c3d3b933f95e8 legacy-trunk
+38792 7c2780c9e51bdf33a5eb1a9bf83546e507b2313d legacy-trunk
+38793 862ebb621355109258ab9494ee717914272dd6a6 legacy-trunk
+38794 9e659cb727ea68c9a5439e8c79667515d92b2008 legacy-trunk
+38795 44468efb525ed5786db98827d21d9ae674c91a91 legacy-trunk
+38796 48c71ff385782cc227253e2d0ce85c0b43e6da3b legacy-trunk
+38797 1924a07f7f23af7e9bc9cb1510457f7906a38c1f legacy-trunk
+38798 433d7378dfc2fc23100f0a6e91b1a3b7a90c1499 legacy-trunk
+38799 61ec8b795641c4d2ea5432f3cbca27edc1817d76 legacy-trunk
+38800 3bc28f63517a4d03c34605c03035dfeb1e61f5ed release24-maint
+38801 d52074d894df2929487690dac26261e3446a6082 legacy-trunk
+38802 fad1e8e09456d0d51eecc4956e404155e7d5a3f5 legacy-trunk
+38803 fbcb1da480dd4b1af2b17d771ed7a51975c5e175 release24-maint
+38804 1ac914d3bdc3948d345e56bb78c994cd25dceabd legacy-trunk
+38805 dad2b62049745559ef8d6801bc5f8a3314ae8274 release24-maint
+38806 34f9b2adae2c6bfb959adae384a687a02c287ce3 legacy-trunk
+38807 38b6548369fae85c2e98f075cf209b7d7b4ccf7b legacy-trunk
+38808 cd3b952708af0f9abe8809b6949408cd0caa0f0c ast-branch
+38809 4e629ebd0e3e57b0f79747d096fd23bfe4498070 legacy-trunk
+38810 020ed671aa6215ea91162fe5671f4da7f2d91e26 release24-maint
+38811 d7a2117fca425350e288e151671365402bfb4dab ast-branch
+38812 c60729a579325f431fd435db2fa042fb622752bc ast-branch
+38813 8e6cd500c8fb5a540807bf733432e0473858bcf2 legacy-trunk
+38814 fc442c2eb0cf6dbd8ada1db15e17bfdd867e35a8 legacy-trunk
+38815 986d46c4faeb229098c7628e90c0e78a633f709a ast-branch
+38816 c8afdd92715c3277514377e32f10d7d451942015 ast-branch
+38817 60830ad6275e2c800e6677a447ebb969a81bf22f release24-maint
+38818 a99ee250e10c1c5633b8c9d0737b73241324228e ast-branch
+38819 30f37c0e159256c9c83661cfc539d11702bb64fd ast-branch
+38820 a96b501498a808f022ceb83f0a6a602e93d520c7 ast-branch
+38821 5c60cbb65330cfaa578b0544e9c1d318dd1d4b4f legacy-trunk
+38822 7267fc40adac153b783e373720b1b838887c4f8c legacy-trunk
+38823 d435d214a5924145207cd5b4122521cea2ed46a8 release24-maint
+38824 87719ae9288cedbb9983ede51bcc651bd14d3d84 legacy-trunk
+38825 0f3061f49a9e89ab68f80ca8a981949cf9459005 legacy-trunk
+38826 af590f622c0bc3be6fe292132eb26494941c786f ast-branch
+38827 d4ffc771e9ff9688dc41624d506596e444dbde92 ast-branch
+38828 b477c4d7a20c1a6820c17cb92834b0e601bb985f release24-maint
+38829 c4ea17cf521115643f1e3d9264cfadab1699a5e6 release24-maint
+38830 8b03b09141d287171f1e963f06d67cd87162c288 legacy-trunk
+38831 a13096b8598b9a67db53602267058b7ee8a687dc legacy-trunk
+38832 6bdc3426d4113f125e0bca49e0111874e55a2f81 release24-maint
+38833 f9e31db6c7036036ea5bc36f4417940b943f52c8 ast-branch
+38834 fbb2f3bb8cccd15f41e8960c69d1bcae9d569c19 ast-branch
+38835 2804aa0438cc8d36fc3de1c89d20f9e1a53f3090 legacy-trunk
+38836 ae25d45f89876354bf843256fe37fb6ed731e95c legacy-trunk
+38837 67a89b43dcc723a55b8f336b63cc4c11be072c39 legacy-trunk
+38838 4c8e5243ca42531e438f9b1e090245ee970a8333 legacy-trunk
+38839 d34bded319aae5cfff40b9acb3cf9ead5b7d318e legacy-trunk
+38840 bc123b9cef7fa969c7b0229a1f1e23ab64ba3e62 legacy-trunk
+38841 c66a7fbe16cf9e51c9b11049032c564900daa5c2 legacy-trunk
+38842 1331c77996409362ddc7a694614800e9b01eb47a legacy-trunk
+38843 7f72109dfb4fafc78e2113a2d264ad925e88318f release24-maint
+38844 d055f94d0936a690f21f1d6ea75136d76212a598 release23-maint
+38845 9857daa22807b739bb05a9edc56cc2e62d93f725 release24-maint
+38846 3581840c82e701b4b41da390c59eff44270ecc83 ast-branch
+38847 08e20e9c76fbf3ee37d8aa1831c1b5bb6edb6919 legacy-trunk
+38848 294dabcb379b51be7cc41ac231e0b12725ebe22f legacy-trunk
+38849 9a1b1e1ae653fc95631347322ab4f7b59c34557d legacy-trunk
+38850 49c6dced08c21f443b6a54141edf1af166b37096 ast-branch
+38851 c1a8c2d7e528bdb7970f52d58048ac925e5c7ec4 legacy-trunk
+38852 aaeab249c86ad327ef1272c30ff7b0548698d157 release24-maint
+38853 ec97e4c370563af97d26488446695f396e608468 legacy-trunk
+38854 5ccc8777cea2715796e33d26c611ab8f641411be release24-maint
+38855 a5185ac1e4ec6cafc7d2e54828e7526303c3af19 ast-branch
+38856 10af16583b755589cc0f4624f74b29b4030b0d6f legacy-trunk
+38857 daba85ef654a49abcab0a1476db2234f3474e6c9 release24-maint
+38858 c0b4de741b383dfc385da8563dc1b6b79a6101b3 release23-maint
+38860 a1293ee6e1db9a94c8fae92e21e6ab5bc6384aae legacy-trunk
+38861 3c679d00879ebb1b513b18ef6aeb1412cd420f77 legacy-trunk
+38862 475f8adcb032940e6f66e407d15ceec42781477b release24-maint
+38863 7287b41145ae376a0fcea7012217605aeb706767 legacy-trunk
+38864 2c7498c2ae707fda372cd744dd5f2fda9e8d862e legacy-trunk
+38865 74c12c1f3692946193584384eb73b238f7bbf9f5 legacy-trunk
+38866 9fe7801fc9a4a21893a9ca46e3227e44ee15a3e9 legacy-trunk
+38867 a17001f8e1b4eb411d41ca2ea5c4192bdc129fc9 legacy-trunk
+38868 9c9172be1f6975ebb5b424246a17b4e941f04160 release24-maint
+38869 e4e0cff16bc7e97b9742e7cc3ff5888cdc1f9946 legacy-trunk
+38870 75f51961097b9d9758d041839567852608b44fb8 legacy-trunk
+38871 1e7a6a5c36143e4cf69e967b63bde3c3cc3dc48b release24-maint
+38872 b116339ddf2785f341170f8bd95e379fb0ba8ab7 legacy-trunk
+38873 3658a7e11c148d83c08ab83f09a3b5ec0ed70795 release24-maint
+38874 ae5f27446f81924753ddde1bb2a4103bff6f8604 legacy-trunk
+38875 f33007864243f0960668916078e800c4ca5056c6 release24-maint
+38876 9339c99a29828107a7ac93efa82f4cdcac0b54e0 legacy-trunk
+38877 404088503a780296a11d2d1210733490291cffa7 legacy-trunk
+38878 3767cdaa6728248caeea16e94d236854da71fe4c legacy-trunk
+38879 c91e5e31c5ff1c2afbb0c7f75836d070965aea26 legacy-trunk
+38880 6ba293b7115b79ed21e9c76038159bd6e072172a legacy-trunk
+38881 80fb2891b33bfcb113b0c43382597295d75567d6 legacy-trunk
+38882 4a33c58c319c08b86183a5ea9218c804f793b398 legacy-trunk
+38883 047434acb5a919d364061a6689377e266739de3b legacy-trunk
+38884 50bed678edda2d7f2082b6c836557aa20a5a12a1 legacy-trunk
+38885 1ea8077693292d0170e365ac9ebb703d780f1fe7 release24-maint
+38886 f6af94301ebc275193dbe049ccbab2a34a90dde6 legacy-trunk
+38887 145c03a85ea8387251e0c0953387a38db6ef42d9 release24-maint
+38888 93629770a93f4679d4d6a7b948232b6d26763c96 legacy-trunk
+38889 86f4b1817caa69c6aa0c541439cb6e46b0661a36 legacy-trunk
+38890 672e5f65172c2f169a1bd48641e3c479bc6eb839 release24-maint
+38891 d4515547997666c0af8ecf2be083c4e0c6cf4fb7 release24-maint
+38892 0905812df4a5f14925d5117d42b297c2eb16e246 legacy-trunk
+38893 1dd8a0d644321cbd03e58af49677f52081bdcaec legacy-trunk
+38894 916516981261061fe0652ec46d661e5fe3bc2164 legacy-trunk
+38895 38d04ed028d1ef5aff53113a323ac8e078edfc91 legacy-trunk
+38896 5e511ddef48b2db5d6b90d3bc0998587e1cd5c85 release24-maint
+38897 1873e8af5a8ac2154d52af058375f6fc764a15b8 legacy-trunk
+38898 3caba807204bbc880bfb5f165e4d69eb3d9f18c8 legacy-trunk
+38899 0b01ee86ccfd88fbf9ff55210eaa20fbffd6223d legacy-trunk
+38900 a291ad9aa6a10c0181a8a815b39677020d71cf7c release24-maint
+38901 9a07f6d4816ab1cdb18f3c152c4289637a95d43b release23-maint
+38902 184f10e116fff943551e5ef5afb279249b3c0456 legacy-trunk
+38903 ef930cae63a8e21be52d99b274aaa20056fdddd2 legacy-trunk
+38904 66e0414cdfa6ab088c29e57066fecaafb144a8cb release24-maint
+38905 1699dc51a5b5769c65985edd7a8e0041eb2ba793 legacy-trunk
+38906 b141d57c4fca96c01854a4d97b6a7ee767cc3472 release24-maint
+38907 9854472b921ba47b17a966395884c1a14037c858 legacy-trunk
+38908 ef184562e8e03de961b1876aba8e9bf6202a2e46 legacy-trunk
+38909 c095888fc543c80c950c030dcf910fb3d249f9d7 release24-maint
+38910 b31736f625ba7f9c75280d51531b867130d545e6 ast-branch
+38911 02f13e00e2ed1303588ea8d79e7fbf9d3c133fba ast-branch
+38912 8b05a4732cf361a38753e09a04ddf9ba7204196f legacy-trunk
+38913 00cd350cf7bf0c62d3fe2ed1c0ecc6bbd6cbe2f9 legacy-trunk
+38914 c0ead2918cf74540241cfcc1c9de3465a94ce8c1 legacy-trunk
+38915 f713e8abf14e3ca623f92c9886d4fe8dc57cff40 legacy-trunk
+38916 a2b2227773e7fe94b7384326c23d99a3c2d1b521 release24-maint
+38917 b423b427e17e8d61b1eaf60d138f41544b5a20e9 legacy-trunk
+38918 7bcabbb6b4b7ef43dadb8a33163d76d7fd092ff4 release24-maint
+38919 e3ac5f0ad3e3acb9ed2cc8ed16139093f82f6a5f legacy-trunk
+38920 21251e221e562f0dcec2c19859e3b9c0d41dab91 release24-maint
+38921 25a0e1faa8a5ed8f091fcf1a0e6a11be4c263974 legacy-trunk
+38922 fcd2c38478699f231cc8efb641320f5bb7da608f legacy-trunk
+38923 1cdc0334d877c71abff12fd4d67fe999f140f2ab legacy-trunk
+38924 17aa28962b85daa393b1fcbab707e361906c4991 legacy-trunk
+38925 1ca7ae48a93151b45efc5ef63ecdb4a7a7636685 release24-maint
+38926 52fed2d0641a5bd8efa4d78a506d7628f102b78f release24-maint
+38927 8880d91cdb09383a4fff3201797743acca21b04e legacy-trunk
+38928 78d0a558b093834e867d3062f15c2e4d095eef7c release24-maint
+38929 65c95ad672ae8fd57de344027a66bf5f5f763a0d legacy-trunk
+38930 de76b343d9c82b2b6a72e8e0bbd8ce62b5c7eb1e release24-maint
+38931 44e3f21f052590ddfabc12909af5188a4cd89d8c legacy-trunk
+38932 1fb768ebd90e2b2c6f5d65b15a90d4cabe40afdb legacy-trunk
+38933 8e9682fd57f8ea690ca4700e8a35dfc14eab2296 legacy-trunk
+38934 b74a1a5129178a61f3244857bf1c37404be01a32 release24-maint
+38935 e394f7e8a0c15f8704b27cd71084767845564750 release24-maint
+38936 4a02a43176555baca3045d5552a6fc70aec228d4 legacy-trunk
+38937 27584363052286e18c876032bfd0f2eeb1393229 legacy-trunk
+38938 90fca08145d11497e65a0f66184bd4262f62bdf3 ast-branch
+38939 62eac8d953cf1a0f061955938707f18d548c55c7 ast-branch
+38940 bac898d39b538f1282f55bca1749d88b0bf94381 legacy-trunk
+38941 b38c2aa66ee7b3e4a749fde20451cf948e0b4409 legacy-trunk
+38942 75fd9a5154c461e1d87debeb6d761694e503d9e9 legacy-trunk
+38943 40f7e1da1bdfe552e56f87435025636d9d2d1131 release24-maint
+38944 ba4727da07e54eba4fa8e2f248cda6004507ee72 release24-maint
+38945 cb2be4429a4cfd3ac8c19524e619dd6d4a37bc6b legacy-trunk
+38946 ea5c2280f91574237f3d41aa188fe02b5b970263 legacy-trunk
+38947 0df05eaa1e096eecbd02127f1e65b5934738413d legacy-trunk
+38948 ac56d17bc3d170cb1bf6ee9a5b0f1e8719984c4e release24-maint
+38949 fcf010c370cbceb77c35faa48b761f425128b208 legacy-trunk
+38950 5a1a31d9e37e3c139de97b9bae4ae818e47156d3 legacy-trunk
+38951 215b7885e10854c51997766c1e3acafb7a7924dd legacy-trunk
+38952 329b28a859474a3507fa3f251bca256d9980d889 legacy-trunk
+38953 e03714804845b929e8cce5f000a61d4e528210be legacy-trunk
+38954 8bfebcf063637014511e1e4c0f79c780f70710a0 legacy-trunk
+38955 a49b88e5030598f94323495f4cedf1a6a9fd7309 legacy-trunk
+38956 b73f130c7b84058e67a35244e6b44f80dbaf5d1b legacy-trunk
+38957 d4daababaa45a5fdf745df0fdffc82b871735999 legacy-trunk
+38958 29d3def3a56ab5a2dc40a8835fe703b5532ea78f legacy-trunk
+38959 f3b02222a80a204322ed7781da8f21f12f920155 legacy-trunk
+38960 c55899863b9c79e9c0622799041b9741f3218231 legacy-trunk
+38961 19a5091f2658064065078e058cfb2de54ef1ce39 release24-maint
+38962 5554511b37254911a68641621a153f143858d1ff legacy-trunk
+38963 087735f86701c19d4301ac0907c9203063768533 release24-maint
+38964 d6047e55f7ad3d6ce1fcdccc92aa92112f765d84 legacy-trunk
+38965 3b41bd878918d03098f341aae2d71f95895efcaf release24-maint
+38966 1490f811f93a94a561109e66b0e0826ae3d6fcb5 legacy-trunk
+38967 73f24f5c4e3f93258f0a3dff2f000aa8d1d095cd legacy-trunk
+38968 c05e45e8724e2fe4a2ad405676e553833cc55562 release24-maint
+38969 55545e023199fc06a5016cf3e294b907644450fb legacy-trunk
+38970 56088749721a8ad7b7a87e7c9ce29735aafd63c9 release24-maint
+38971 d430b29641ba40be4f3f7d176c71315c2f88ea23 legacy-trunk
+38972 662488d4187db688a25250fea8b73e6807f1e273 release24-maint
+38973 82373d2525ee0bdba4994d3c550fb807e89e3423 legacy-trunk
+38974 5f763f9e50f9370de83b8b7b2d6d92120b92c68e ast-branch
+38975 f23007f9217b135e10ebc8e4074db91d1d11bf26 ast-branch
+38976 8ae8e64ca9bd4d8754c9efb991743f758b518093 legacy-trunk
+38977 e79793a8eeeab5c9852f5cc6cc58ae0b4d2e416b legacy-trunk
+38978 4fda4063cc8cc2c7ce5fe9d273ca031e721f726f release24-maint
+38979 ec4c16fe7384ced565a9bcbcef8bcfab662f727b legacy-trunk
+38980 5e45dcbf7cffd04c3e2ff431aa42751cb8b7472b legacy-trunk
+38981 748c8e2d40eec05cd5fe19ac2898771f6726ebc8 legacy-trunk
+38982 ca5ef7ee3f417ac311ccf10949bf471fa84faa33 legacy-trunk
+38983 ee99db06c0ebcfd86ac5db93c662b4e3b10163d1 release24-maint
+38984 c55510daebd252d417b4aa6b600a7f02fd02c094 legacy-trunk
+38985 8076424d455d0eb37b71e243b4a7afdc9dc1f80c legacy-trunk
+38986 078da474b302133a31c9f82d7ce9f3a906fad2d8 legacy-trunk
+38987 2eb569b6ce234a86d69bfdda40e1d91246bb8f31 legacy-trunk
+38988 924e0282b57e9835ec6a11f87fe480f1cbb1eb17 legacy-trunk
+38989 92cd951cc4b18d8b2a3c89394da4b8f3eb2e07e3 release24-maint
+38990 851458fffd34210f620eb380e11c6aa333496a3c legacy-trunk
+38991 173e90e0d2e31d7d8b406660046c4663577eafd5 legacy-trunk
+38992 aa1c5366607d6f5a94e9d327afdabd4a1cbf25c0 legacy-trunk
+38993 a2b5045df4f85680bf0fd6d0038380bce8f8e595 release24-maint
+38994 74a8458b227602f9b4d55f8d50aaca9afed9e951 release24-maint
+38995 abe5a5e39ccc7dad23fdea89c767bf9be47995e9 legacy-trunk
+38996 91b8cdbfd7b4659401f9af1748af4176bf6f5ba8 release24-maint
+38997 1332f2e705b216ed1f45eb9b237c6a2b09a78ce3 legacy-trunk
+38998 835ab06984a9c8d8f65a1c127453ade1f3c84147 legacy-trunk
+38999 5fb2163231d335d59c15af645b71c0ad4e3b6d01 legacy-trunk
+39000 db1676fdb5b91c06400c3724a82a6c24370bd453 legacy-trunk
+39001 f89cbe69db63fa25bac8aea686db2af673307c69 release24-maint
+39002 51fe24138486e954cc26bb94563e0b35e9c8c837 legacy-trunk
+39003 c425cdc8ae8a7ca886c1a84d24a55588ea8a24cd release24-maint
+39004 4f5d26f5e3e6452fd215333f449ae9573a903dad legacy-trunk
+39005 4666b4574c9cb583ffa6503c2393a48a835fddb5 legacy-trunk
+39006 696458240a65ec4c37d8056ec828193b89a3b964 release24-maint
+39007 0a9a410bf74cbb038b546d79edf82b8c8c309a57 legacy-trunk
+39008 2b5186b595b1adddda7f0522e92b045ae8415702 legacy-trunk
+39009 27aa5eec54004d7c323e65762d933854b9f8f705 legacy-trunk
+39010 d1bac20c0b9f4e12bfc1880f428eb5501ef730ab legacy-trunk
+39011 abe9686325c38ba0836b3375e22ce0c5ae71ccb5 release24-maint
+39012 2015d16d2647046b52fbff05e76c4f628ba91f98 legacy-trunk
+39013 c6b7fadf0adae27fec556a0a431f211a6ba452ba legacy-trunk
+39014 17ccac6954134000ac9939f48fdb94d7f1ee53c0 legacy-trunk
+39015 4a5f181ac32408ad1feaf6bb96b358654c6e5895 release24-maint
+39016 a53587295f20596596203ed1f9bef810ebee0106 legacy-trunk
+39017 3238ae6d2b30423339f37139480c6d31a3fb6edc release24-maint
+39018 4384e587912614199c1393d2a744d759755cc592 legacy-trunk
+39019 68bce68c8f93278ff5bdedc2c5a0fb90518c6456 release24-maint
+39020 b2bd05c01a351cf83b2b11b177f44015551ac638 legacy-trunk
+39021 98179c8281cdb613260ac4d2b37d1b82c49869d3 release24-maint
+39022 8341cefdecace8c32aafe992b218d0f3a416ed2f legacy-trunk
+39023 f0ae1194db69ea5e5e17a3d81cd60a5fc8e275f1 release24-maint
+39024 860d7f93e6b4c9aea45b3d20d01e90214e6020ea legacy-trunk
+39025 56ac43d9d6258b1a606a5910f9f7c67e337de841 legacy-trunk
+39026 1714c249928ef8a0d5a669850e379b9fd204b0a4 legacy-trunk
+39027 2d0693b9f0bd8c794d49fa305d0b4972edc87992 legacy-trunk
+39028 f5589fc3d9771483b3daf8269f7f028d053d046e legacy-trunk
+39029 acf68f67b975c751acbbc60abd5d9cabb52433ad release24-maint
+39030 234b22a2acf3b7962eaa0474b7c2e7e570057cb1 legacy-trunk
+39031 2e9e642a58ced1f89b4e4d8784a8a928017b898b legacy-trunk
+39032 4c2376201115d5aab924230c98d8fd3b7433898a legacy-trunk
+39033 522c9a4904413c98935e1d277323e15bb3fb5f00 release24-maint
+39034 09a910cb6c8ff03b8157b28979dd07c6dd9222d0 release24-maint
+39035 973aa4ee16152ada37662ac6d0f6be525ec39907 legacy-trunk
+39036 b6d2a9d1a933a7c0f8b353f34212740c32c33945 legacy-trunk
+39037 f3d3151f84179f1ffb6edf1f521e051f50f90485 release24-maint
+39038 ab83ab27c837b641c0a39c4b0e21b8e5c33edf8a legacy-trunk
+39039 58632092e023270c9af341be43bb74c11bdc66e3 legacy-trunk
+39040 adf189eb4f58a8e59737fff06e82c9411fc06550 legacy-trunk
+39041 585059de2b404adfc9a9b9d2647f66bba8b2784d legacy-trunk
+39042 bfc91d4af64532a0e1da857266f0f50e6513a50a legacy-trunk
+39043 2fb0c76d0251a1a70265882fd8111576f583d996 legacy-trunk
+39044 7ea2be2c0e1de0f7ac8bce8600cbd2b14471ecb6 legacy-trunk
+39045 2d833123b1190638b88ccdf9202bd897785ed28f legacy-trunk
+39046 04868959f1fe6832cc9949a3cbb5e3a3357a7bfc legacy-trunk
+39047 da772007d34d8059d9623b2624e8ba603a7d8f62 release24-maint
+39048 0ec71152c7e2be101e1592da7c6f931f8a41b00e legacy-trunk
+39049 2ee63ff45970fde337022809cb9048fe5019fa57 legacy-trunk
+39050 534f8ea57377ea8931d5b297b6c7cb5e749d3058 legacy-trunk
+39051 db2cf759948af2512b5c203b0c6fe64a5d94db9f legacy-trunk
+39052 cdec978b916ce25b71530aff205c8d83f8c658b3 legacy-trunk
+39053 70681267a74a9a6376153155d787b59cce5c0878 legacy-trunk
+39054 3e0dd62ee31bf7cd86445fcf3998f36c668fe0c6 legacy-trunk
+39055 0087af0953f4dc5da9e275deb215e39bdd12c426 release24-maint
+39056 5d33d83e8dec8a94a0d9ca39e6f3d72e68a1b245 legacy-trunk
+39057 6e93442e26dd03f49b655bccdc6965271f48bab6 legacy-trunk
+39058 012a0ada0d05fe82f4a31a82715685ea698ca9df release24-maint
+39059 2cb62860005f600a409adbaf000c71574c3f61cc legacy-trunk
+39060 86e9f61697d8afdf41575214de4e72ac5aa922a4 release24-maint
+39061 77de21ccd210e4a2d269b3f2f4a69e26ddb84d66 legacy-trunk
+39062 dc68de70376b407e9ae7104717b6aedabb7caef2 release24-maint
+39063 39bb8a40a2c85e5d8ae0b24da0c08722569840b3 legacy-trunk
+39064 829f66d56140c29f3f04dd2ec9a886434d374f04 release24-maint
+39065 3dd8d41ec350302080402a6dca6987f4eab393dd legacy-trunk
+39066 33a4d7e5c82f2bcbe4d5d45becc620f53f369273 release24-maint
+39067 bbb84b5856fce4decb5f2fecae69055139efcb58 legacy-trunk
+39068 fb2f5aa4d5ab01f5f56dcdb48f783954268634f7 release24-maint
+39069 8dbb731baa60f0654abc4d88a631b6e0c4b80aaa legacy-trunk
+39070 d60a50a90fd150ee82353c6fbabd7f1daa7e010c release24-maint
+39071 3253dbd72b60acdaf862c57a76023b6acd81978e legacy-trunk
+39072 e5f62e049c6fd9210b480c4488b8a59406704ba4 legacy-trunk
+39073 910b5db4623e31ea0501ebfe1c382126d22741f5 legacy-trunk
+39074 99309802d49048efcfe688df4d87bfddb8fe2e41 release24-maint
+39075 2985fc6309a84a9e6cb2d9a13b4903f2bf099177 legacy-trunk
+39076 f840f447032519d11545ccafd78bd4dbf94c52c1 legacy-trunk
+39077 b84138d98cfa03fd90150361e8e3af2c4cfb7868 legacy-trunk
+39078 728a0de88395c230f66a42a99f5044b3b692960e release24-maint
+39079 06c762722892b8ccd2bf50552d8be0d06bec2ba1 legacy-trunk
+39080 4d1da63612eb5c9de8744f5b7f8c426db804c949 release24-maint
+39081 a31a770bb7785874e44711837a0e3a0b5c0c2a53 legacy-trunk
+39082 f5473a762b5016b62aa53c86fb24cb8116973024 release24-maint
+39083 3c6aed3f3a3102bbb1c32bdfe2732cabcd393521 legacy-trunk
+39084 81ca35ad9199e881482d1af999efbf1f835841e3 legacy-trunk
+39085 daebfde0e1cf1c43e8acb61d1b26fdb47d2c3ac7 release24-maint
+39086 c82b746c428f8b3bb47a85fc4f02523c7b355878 legacy-trunk
+39087 f7c088a8b5d3c819d39297927379fd9842bf4801 release24-maint
+39088 b33a7264454f06019eb7197d9abff303f7f512c2 legacy-trunk
+39089 c574282d50bfee40c3b4ee171754449c908dbffc release24-maint
+39090 98f96f07d5498853813a039a64ac0d1a6a18aae8 legacy-trunk
+39091 9a812eb8a0ab286e6c6b330fda24c0bb9f92d9b0 release24-maint
+39092 739032be96d5d905fd38b015f5475fbebb2f8548 legacy-trunk
+39093 6ad3f860346e993a2e273a3dc2897712ca68e0b9 release24-maint
+39094 021a4abf7f274b3245364c9b7418448303d35387 legacy-trunk
+39095 1a70cbf759cae5207a2d2a79c4195e4dbabf7c54 legacy-trunk
+39096 d57428e858fc0d04fcf03a15c7918bb119d2227a release24-maint
+39097 eafa13beef2646dc3a5a461a2d91dca8a6103c0c legacy-trunk
+39098 d6a18a33bd6256f7223fa39d34728d27b5472862 legacy-trunk
+39099 7990455e6ae0a0d6d3aa16093b39b95aab3b70f3 release24-maint
+39100 9e49273a1334396a07f23b9f7871f52eb0e08f80 legacy-trunk
+39101 12287efa8777f722a7a5221aead478c2ab8d0ed2 release24-maint
+39102 0fc290026939a6c0d8307d915d4fc3e5931b5343 legacy-trunk
+39103 8fc5d6bc35ffde223dd985a153898706694089e8 legacy-trunk
+39104 27a718221e72e784f41a161876fecf296219eeb2 legacy-trunk
+39105 cf7a849ce61fa605f941dadc4110171c4a9bd46e legacy-trunk
+39106 695283cbe43fc90c3785547e2ce99c9ec439366c legacy-trunk
+39107 16dfe152b9e6da5f423dc20fc543707e5df701df legacy-trunk
+39108 30b13401c9125640883458971e8d434245567f31 release24-maint
+39109 9e4bf29e6c2fcd3a8ae47f62b49ad40b74e7d577 legacy-trunk
+39110 d7c5bd59698d0688f090187a3cc3d3cc34868813 legacy-trunk
+39111 e6b075bd7855af54a565dc31a59c407b80310fba legacy-trunk
+39112 b05cc12a2179f29417365441b0d4dc1a1f6d93f2 release24-maint
+39113 a2043affd5433021145b979bccf485399563b849 legacy-trunk
+39114 5d977d7cc33569714df07352ac05d5bb002703ef release24-maint
+39115 18184d82daeaa19ab4887588104c8ff94930eee7 legacy-trunk
+39116 9d1e46111d9a70825db4c0b96cdbb57e87faf196 release24-maint
+39117 f8f15e6aef3a4aa938301ddf533e5d817f3bf419 legacy-trunk
+39118 8f7e47a0aacab6c80529a0d847c9a4d0880ea0c4 release24-maint
+39119 68266803c0134d4398b395404cf0328aaa264039 legacy-trunk
+39120 d07e9c37bea09e1b80b0c4763f4ab44003211857 release24-maint
+39121 210ca383abe7620d78f42235d7fa5907cab5fe1e legacy-trunk
+39122 7804bbb264928edc04f0d25ccbab713c687b62a1 release24-maint
+39123 47418502942a85ab6a3195eba80e611469aeeb22 legacy-trunk
+39124 2f9cfeca27996cdffa2c71e2451239d63fb18282 release24-maint
+39125 cd879ca84624486dc1da485703ef46f35bc6fe7b legacy-trunk
+39126 726c9bc49c048aaf21ff9009b6ab99bd3ee0d3bb legacy-trunk
+39127 5df1c692bb4166644ebc0ed91776fb7bfebc9221 legacy-trunk
+39128 e02087ac4792680196f19251f6ad68f72d79a0f2 legacy-trunk
+39129 3340536436f5a0e28255041a8d63fd7cf9f24313 release24-maint
+39130 c5888413412b94ebcfc06e1ce238db89766dd556 legacy-trunk
+39131 f94d5bfad078f81bc25486514394355a3a5ea240 release24-maint
+39132 e2636d108d7d09a65d8e996faad03131ecbf9ba7 legacy-trunk
+39133 89710805bc3defe8624fef12ac5ed24e2c47ab82 legacy-trunk
+39134 d6c8761d7f31475e01d5d715d629efdc7bdda9e6 legacy-trunk
+39135 666c0ed4fb9d480eeccb2cbf1e83533a4e3dfa10 legacy-trunk
+39136 857871c71c3bb9076b0b39e37dee610ec3dad3c0 legacy-trunk
+39137 c857070e97e8d1e3a7544948b8dfb67d81c943e4 legacy-trunk
+39138 b3cb64289d2be247680fc2b1ad3fe60a18dd84e8 ast-branch
+39139 2760a2d99238f121c1942f0771b18fb2792359a9 ast-branch
+39140 5b23a5dcc6a3ff2b6f88e6ea09b24ed642be3702 legacy-trunk
+39141 fdcde59dfa1bd89f26ff13cb5a3d0d16a6bb356c legacy-trunk
+39142 73e6cb5f4039e6c0da595e83ed299a7f5675a640 legacy-trunk
+39143 3b5f5466f105eaac2c7c395bd51246b2b9aef1b7 legacy-trunk
+39144 734925b46ba7e47df7b8ea87a5e76ea2c591847a release24-maint
+39145 9241218992c1e06716b3ff811ab40e3e215c1c7d release24-maint
+39146 b86392f55b597ef43376017c980a21d6440daa5e legacy-trunk
+39147 b8c9076d174e92c53da01e8261489112b84e2631 legacy-trunk
+39148 58d5a6c7b6290fc0088ce19684cc793c3e109b37 release24-maint
+39149 4bf99ef06d38db366170aa4d07f9c1795d39766f legacy-trunk
+39150 31d955ab2232ec9ef61ca627b0f74491edefbfe9 legacy-trunk
+39151 9c188ff63131976c28d4fd8775cb4038923445c3 ast-branch
+39152 8127a55a57cb7bd780a54d14114d1877bc3b647e ast-branch
+39153 9ecf03dfd5d6177b23d60fe2c7d05a7dad65fc0c ast-branch
+39154 d25656ab3e1d03ae80bc359a6313b0d57034adf8 ast-branch
+39155 aa2f2faef7d291da7dc0476f6bce7e8dab2cc33e ast-branch
+39156 8d0d395c211ed796a92aa1e03d94587c3c3bd0d7 release24-maint
+39157 e0598983f0a5f623978709a86ba2162525e07848 legacy-trunk
+39158 e1f7fca784f3a6fa345227cc219656c1b6482643 release24-maint
+39159 ddd78ea3519c51acbaab8473ab58e417397d243a legacy-trunk
+39160 955d4baddbfc8659a287d6e18718c867fbcb492d legacy-trunk
+39161 214c96e549050bac3aa9a0bf68a6edf32487ac47 release24-maint
+39162 b6700b3de6955d51d2b609d4ef341ffa613e0201 legacy-trunk
+39163 db76831299d00085f9dad724d322c11ba740b315 release24-maint
+39164 35592bad345bded7a49c99aa953008c057bacbb9 legacy-trunk
+39165 763e85b107b40dbba95651cc5da420e64e838518 legacy-trunk
+39166 57a4d27466323846d973a5fa0a8076ccefd081f2 release24-maint
+39167 847e58ddb7d9ee6f8d8c72beb2ed511c0a7fbe1b legacy-trunk
+39168 ace7d836083fe7410173e63ce08bf4601ab5f006 legacy-trunk
+39169 f9c5ae69c16ee2b5a1d28dd03b67201bdfea1eb2 legacy-trunk
+39170 d0c6965b525ecbaee87b0eb3e16b7f757d497f92 legacy-trunk
+39171 c088eca90a63509214acc4982c86a9e2fb121329 legacy-trunk
+39172 526faaab00eb9519dfe7f0d9f98ececbc4ebbcc2 legacy-trunk
+39173 1fdbca3514989d817d2fd492d0d4a23cf2bc5d48 ast-branch
+39174 a0c31b70bd180f78f68385a2ee71615cad2ff63d ast-branch
+39175 09e88fd7d55a68a1f10da4ae755c407b9ce9378a legacy-trunk
+39176 b735eb4267e8f94cad9010d133f726c44128bc4a release24-maint
+39177 7b6436d2344d1f45fb6cf3fce7088bf19b1735ca legacy-trunk
+39178 74c371766121c8163e05964acf196bc0aaee641b release24-maint
+39179 cd595a69dca5ca2d94866a21805b96c10bb57aff legacy-trunk
+39180 919f2d131982b8b15de9f0452285a41ec14763a0 release24-maint
+39181 558163cb70a9682f37397efbd0ec208a61aa24fc release24-maint
+39182 62f8194832939be14f2beda7ab4d7f22be34ba6f legacy-trunk
+39183 1949722f37874d236791e54420e9ae0676f2c5bb legacy-trunk
+39184 8756973a6b99124c9cd095ebb172c26d12ff6031 release24-maint
+39185 c6b69c6d01a377d4c9355c612ce6224cfbe834e8 release24-maint
+39186 95a9ff47b11d039929799391586f2fe63ef2e1bb legacy-trunk
+39187 a498dcaae9d78269b4450ae88a5e9de2a969bced legacy-trunk
+39188 027e000d1f6df0e04113faa2ccc44c1c9152798a release24-maint
+39189 32de7a8d886ccdf4c59eafc5e2d17e6573e3354f legacy-trunk
+39190 07b01b3340f9c25426b9c20b4270b83f9bf6e757 ast-branch
+39191 3a6eef31e95ae25507fc30312312f43a135a8546 ast-branch
+39192 d61efcd87c8e3836cc651f28a33d1765e64d67df legacy-trunk
+39193 d476e58cc7e745c9c0ba46390364f393535967de release24-maint
+39194 92b37c71f935eabc461c070f2b802f948c4399d1 legacy-trunk
+39195 74f8202d83150137c8c39ee110ad91ae9544d3f2 release24-maint
+39196 c52cd1fd94fc54bb84ed256dd2dbe32fc2b8af5b legacy-trunk
+39197 3f86f8cba05ed568902871a1776d3de16ae74a94 release24-maint
+39198 7e1c1d6dea1c3169a3b0e1a84ad3596480dca1c1 legacy-trunk
+39199 968d9422af787fe6ff1a7f330146895f83b66c14 release24-maint
+39200 728f82bebc3ebd663f237218d5fd72d39a5547f3 legacy-trunk
+39201 879c876bc57a3898363f5a71bf8d0716316c5feb release24-maint
+39202 b431ed7bcdc2250af16d90345068fd864b1b13c4 legacy-trunk
+39203 860e0fd2fee8ef69b94aca1f0726df7052af98ec release24-maint
+39204 aeec39fed8c5c16f765ac39425d1f21f687211fa legacy-trunk
+39205 faad096decf6ab4d1e4faeb10e3878469b1783a1 legacy-trunk
+39206 9f43655123260241e0265a3566e7d6ebf4ab4037 release24-maint
+39207 2b117eb18944d22449ccbc09b627f934d74d6298 legacy-trunk
+39208 e789703fe4bee4aa2256872f8ad7bb7eff8592cb release24-maint
+39209 a917e2c476f6618812dc5933d17ad42967245455 release24-maint
+39210 1ac2c3a1c3ac3d39d4d7ddcf0ec015660b88a775 legacy-trunk
+39211 9d838dd967b2b22aff1f33179f4d55ddbe7e84d4 release24-maint
+39212 be6ab3d86c2925ad8ed07e6bd10862ad16b839c0 release24-maint
+39213 53ab5163c1aaa1953ebb1ad1d1e7d11bf7ad0668 release24-maint
+39214 4adbd331d3352eb5fafd72fcb589e512f4b35db2 legacy-trunk
+39215 6ebc423f2d81ce90a44890e6fbf5a28ddca515f6 legacy-trunk
+39216 9707ba2788941a03e3d692bf4b3b586026a8462a release24-maint
+39217 52acbb8584eaeb461a7969a0e80c7f8a8238994c legacy-trunk
+39218 ca66a16c379dc210739c102d5c05771b10edd6f1 release24-maint
+39219 42cfe4603c30c00172935c6f99c8c9c59a137ca0 legacy-trunk
+39220 edf25c1a4f608c4db38955e97e62ee242df89976 release24-maint
+39221 f8e60a3f34409e9f81fbacc5276f56790f55fca7 legacy-trunk
+39222 c8bd3b5230c425ca485bd8465fc97b9e4ea30a4e legacy-trunk
+39223 b4e570337bf477e236d7d3f6ca25c90395259c52 ast-branch
+39224 31447adb1b35ec0ba0934829acda9bcc043533f6 ast-branch
+39225 1774fe7ec0c7c70d8509ac365b8b5490789af12a legacy-trunk
+39226 85a35f8701b3bb69a157cd0e251f46f31dd1efa0 ast-branch
+39227 298d3fa4ec39dd1802ef79c3a37b942c3091de34 legacy-trunk
+39228 2feedf850789d0753e2f1dd40ab92b5b641ebbaa legacy-trunk
+39229 636e5f1da733d7b747bda9c773d46754e17375e2 legacy-trunk
+39230 7a50bd82df25f2be9e3faaa8222e7d775b5ffcf5 legacy-trunk
+39231 349a0fd598e079d217cede9d2b82638bda665d0b release24-maint
+39232 c6c24ff1e3da5928ac1f80c228851272a4840148 legacy-trunk
+39233 35a698302c63c5b1f06859a78ad871c9838c4b16 legacy-trunk
+39234 8fffb4c95487ee2373087b72368f990d1b9c343e legacy-trunk
+39235 3f1b48f9ff0da9f347cd01154618ac4e8c952242 legacy-trunk
+39236 f30ebdc3bddf79b1fcbb637f7f21c88ceca01b1d legacy-trunk
+39237 d91964f5fe0d6bcb0d2ae40024e274d0e3a2a71c legacy-trunk
+39238 26bf6c27e9cea5ef537e86eedafb1c5961de0501 legacy-trunk
+39239 b2fe5f8fcfddc84b1a034c4245b7842c323a7f73 legacy-trunk
+39240 5a9134fe5709060a23aa27be6a2958e5ee79ba93 legacy-trunk
+39241 099128ffabe6319a007ffd422237b21406c6db83 legacy-trunk
+39242 3086620db46b97fc2d082017e7bfccf7872449c6 legacy-trunk
+39243 b48f0b2e0df6095df59cf8d8903ba5bfb6e9dea9 legacy-trunk
+39244 b363a28ed24f9b103c54f94a0907408eea6d557e release24-maint
+39245 abde217c5d90d1a651e654bacc89dece96bb6b4b legacy-trunk
+39246 37600233db76881c8f89974edfba8cf84cf50385 legacy-trunk
+39247 455c3b765dc3a8f1b91c8b198e1cb57ef317c270 legacy-trunk
+39248 2590fa0ec7e881b2308ca0e1934c5ac44c2de94c release24-maint
+39249 d533f08a9dfaac73f7f3dafe613003dfc2ea35f6 legacy-trunk
+39250 5fe9ceeca1118814c44f4a66de1ebb1186f95d60 legacy-trunk
+39251 f3996aa78cdea5b596f29da16169360b655071d7 legacy-trunk
+39252 541bfbb10030bffaacccf2604c95176629a9e1f3 legacy-trunk
+39253 8aa9bd80286b2201e75f1a3732413dc17f4b3473 legacy-trunk
+39254 a689a20f58f763ada032dc7c9dacfd325ef9f6ce legacy-trunk
+39255 1d8611d8555c5cafe00c8defa06fc318a91c61ef release24-maint
+39256 a6cbfcd0e691ba0b1c5a57c9e4e0cb99f98d6e69 legacy-trunk
+39257 ce0995e01d3c745743cea76eba49baa46e9c450e legacy-trunk
+39258 fd00461861c9070645e26b69ff9f902a1876cf02 legacy-trunk
+39259 2612e96b17bbc5bcaac72aea10f1df21e60532b4 legacy-trunk
+39260 bd9af260e927942af5e0d98023273a31e8b3671f legacy-trunk
+39261 fa95fe91cdf760be3db12042c7a79dc5f1271825 legacy-trunk
+39262 bdcb01a9b60c579f716ab04b884463b748ad07f3 legacy-trunk
+39263 b92a85c3bdc816aaf9277ce4dd9f2de3b285b58a release24-maint
+39264 3fa58e5bddfb29a5c040f22d0586423d1e12055e legacy-trunk
+39265 17e0444dd12daefe1cdecd818eda69f420b3a992 release24-maint
+39266 ac9c0ee199fc96eea1e4bc3b32208e0834f1e00b legacy-trunk
+39267 3094843e7b92cb103ae0fbe1b3b4648dbef2fc46 legacy-trunk
+39268 6aa73a1f0cba845403c7f81669f444d3296d5c43 legacy-trunk
+39269 0ef64a93f3f25e0d6381e83383008b7cb69fcc4a legacy-trunk
+39270 300f3aaf853fb888a4dfc43efdc629d1b6812f07 legacy-trunk
+39271 044a5ca2cdb82cdf67fe7a56c346fdd8b1835b80 release24-maint
+39272 ef11cbc08daba0fda490c1967389e8dd55cd3b93 legacy-trunk
+39273 fd02b84fb2db229be8d78bce2d9cdd86c641a0f2 legacy-trunk
+39274 dc8ae499efcf3938697148a6f483325f1117de1d release24-maint
+39275 725671db779a68182bd26c07c0f886ed75b768b2 legacy-trunk
+39276 9b2227a60daecdf592d8d1efb4d0721c683516b3 legacy-trunk
+39277 503c3697578f8c9e40d2de284a89c03bbfec6209 release24-maint
+39278 def434e2a81afbdc4b0042d4cd799d84395079be legacy-trunk
+39279 d6575cd1ab67fc6632b0e255d6449f9250e094e4 legacy-trunk
+39280 028e94a6efc56a9877bb7f800179538670c334cd legacy-trunk
+39281 b8c5d2222ed7583bde1075328a123b1ed47f1fa5 release24-maint
+39282 f6b462d2a3a36c53636743ebcb1cbd058804e7f2 legacy-trunk
+39283 3c3a45a9657721f0ca1066354cf1965986ec5235 legacy-trunk
+39284 dd4357a5da7cb7d704797bb9fb33a5f67a23f5cd release24-maint
+39285 c5499f256786b2821f82f1731e3abd45cb497f9a release24-maint
+39286 700f08369092785820c8e36d8d23e5a4c3725b10 legacy-trunk
+39287 dd2357953fe3871484d88b0cf474c86e8400e98d legacy-trunk
+39288 39825ca346473ed5680546945d18b71cbf19bda9 legacy-trunk
+39289 2f1bf64b837ef5f49e1cf46e35e7d2f2431dc5b1 legacy-trunk
+39290 6f1cd28d6b875012d0340e50632adfa33badad00 legacy-trunk
+39291 729be8cc0098bf5e17ea63f1c3b5f32c02c9e734 legacy-trunk
+39292 c1d22d4c08655280ce37e3b51a704267dcad3dae legacy-trunk
+39293 cd8d8e634ab806e010e6b7696ad0a81446b012af legacy-trunk
+39294 e8806094d6448dff0de1f8bd6df19e006e6fca00 legacy-trunk
+39295 de2d84e0447eeed861b54a9f5e356914eda48721 legacy-trunk
+39296 4fd038737e21d2acb8ef1008f7175f7c5e85afed release24-maint
+39297 3a2fff690558dc043be2be343123e2ea7dbcb781 legacy-trunk
+39298 877916d632e07069b857757be8e505e1dbcef126 legacy-trunk
+39299 20b18b7f8309578e0c5029c06a829a9421242d9a release24-maint
+39300 c5bf5685267b8e8da6929610b9b419cf17837886 legacy-trunk
+39301 d7f39e6208ba9ac885a48a6cc0fbc5e520d0e27c legacy-trunk
+39302 66057d550628ae765bc7229aea89f563da3e0d92 legacy-trunk
+39303 50283a4417d98870f8c9bcf9b96851a9a6912ebb legacy-trunk
+39304 f2069195757811338d1e203578dd415f515fa258 release24-maint
+39305 aeb8580a1af74898872cf1eafe2caaa1d0ed497e legacy-trunk
+39306 8b07d731be603ded4823481b65e188b22d1ec2f3 release24-maint
+39307 3ea8f58a8c8ec6434f04faee86675a8fed919afd legacy-trunk
+39308 4e588725c3d758e7d11f3211e93de12b73381abb release24-maint
+39309 cde27782a1692ad41cbd171f2aa92f46ab038d77 legacy-trunk
+39310 f5713e30380c436ba8de12a8a6f4851d69635085 release24-maint
+39311 7f9a430b8ce71ec97a78dcc7376640fcb3569c79 legacy-trunk
+39312 ce12451220b40a927b62fe37b4e24b33bcea10e4 release24-maint
+39313 76b2722806abc5d7953cad89e527cb8b84aa9676 legacy-trunk
+39314 084d42df7bad4e940397c6cbb3a69809bbdd9c9d release24-maint
+39315 797d82eec62521b6a68df9d36d8b2924c6c2a4be legacy-trunk
+39316 624918e1c1b2efee9e4b7bee31ddb82212d11b33 legacy-trunk
+39317 a46732571f2e8f05edcd5bba796df925c8ea6451 ast-branch
+39318 f84cf853464aaaa67b31b3d14b3f59fc4f0fe7d0 ast-branch
+39319 7c14c7d8b396ff611de979423eef075602a6755d ast-branch
+39320 46800f2ad308a48887aea4e2befa67d8dcfcffef ast-branch
+39321 0014596b840c6cfdbe8d566b38045f288b5dcaf3 ast-branch
+39322 b463bb4825949bd42610a5ff38f73b6d90ddcf9f ast-branch
+39323 e7ed0e6aed2f273944c317eeb36d17b760b2b8e6 legacy-trunk
+39324 448c6fbff6413122a57e5ce206c0f3b003a36386 release24-maint
+39325 9330080a3d41758e26a36fc7c3bb85f6523abc50 legacy-trunk
+39326 926169fde5e633f1e2ba8827e65cc3cf0b03e4cc ast-branch
+39327 fdeb4a8bcb4e25099a038a770cfa85a02ee9fd59 ast-branch
+39328 43211be0de415fda1bd7c6a3f9ad900e9bea61f0 legacy-trunk
+39329 d682790d5db0e24ab337dbc2f753bb1f7f2bb20d release24-maint
+39330 0f1a231c2c7cab5d21dff93bf07ce992e494a66f legacy-trunk
+39331 787478923e82f27e3bb056bc534798aca32dfac7 legacy-trunk
+39332 04dd5b06d3c8ed53dbe98e96244be78530630fbc legacy-trunk
+39333 34ff7ca4cef8527e3b1fbcbc950f7421650d9cb4 legacy-trunk
+39334 a6e70004e9870cd87ef31b2dc0e34c20dbab527f legacy-trunk
+39335 38824b6e36007c36951fcd51f39ef4f434ebf99c release24-maint
+39336 0eb386ee940e30326c47bcaaba15b921f08e503c legacy-trunk
+39337 07137286773caff6ef07590363892a857aa6289d release24-maint
+39338 4acd30761bc2176303bf42c74bbb28e096fcc4f4 legacy-trunk
+39339 6b37eabe2ac437bfd44849df0ad5e903e064faf7 legacy-trunk
+39340 5f400fb2dd8a69b7cd69a31891cbbe644460860c release24-maint
+39341 3973d63d26677c06746136f1b152657137811a5b release24-maint
+39342 91d968b77579a5a3661bc46e01fea9a6d4b495d9 legacy-trunk
+39343 43cf59e7a6145ac718fe953843f420acc83a1d7b release24-maint
+39344 4da6d4e0c3d5628c0cf1def5ae350cef6eade1e6 legacy-trunk
+39345 12a9bb24b6d9646607494d628eca89ec0faed8aa legacy-trunk
+39346 bed93d0416dde82a3498e2de77c3993e7fb843a4 legacy-trunk
+39347 7f16277666216c1e787b20177bbcdd0944a774b0 ast-branch
+39348 01eff6079f90b6faafba7465df78906ab1b117a0 ast-branch
+39349 1708479ade4d5bacd402dd6312e34e847516b708 legacy-trunk
+39350 c9eb25fe39cbbe05d5ad2fd3c8f52bd49c205cd8 legacy-trunk
+39351 9e05ea3b1bf3b85f3a299e4d342d4fb1947195d9 release24-maint
+39352 5c7cca25472deffee46d75ca98c7152ffa15f83a legacy-trunk
+39353 6c0865beaab731292080fa22de4aabba017f5433 release24-maint
+39354 8837ddfaad45eaf83817ad81ad3175a9d7a62d25 legacy-trunk
+39355 f96287d1b5f6f98be785c4b872c985b64be7270d release24-maint
+39356 634ca4d8a306a222219d6aeeb2a6220fb0c6121c legacy-trunk
+39357 b7097d91f04d1ebd56e47b0e7d201da57efd7b42 release24-maint
+39358 5b1a2fb864a7626c1647a0b5319761d9acca8566 release24-maint
+39359 3bb932801b6452f88b79bd2eec20fc59973eec6d legacy-trunk
+39360 3745e3c6a3e1360168968425e49f057e5eef5fe3 legacy-trunk
+39361 dde056a666ddef52ad32032da38e591d329af995 release24-maint
+39362 3eec91038fbca9f439aa2da97465b9f55f43127a release24-maint
+39363 0a6dbcb4e05662305cad388a3ab35324a06f6eb5 legacy-trunk
+39364 4d05f9e7e6e294a9e417da57606fbf3310f52bdf legacy-trunk
+39365 156abda4e4573a8e2f4f1fa07a906ed12508671e release24-maint
+39366 ff2e66fc0a292904dc04d37202c88bdce05c1d3a legacy-trunk
+39367 4896f8334bff24453268a5cb5880bdba9f519b45 release24-maint
+39368 e48fcd4c358d497c07f6073b6b554b9c467d0178 legacy-trunk
+39369 37fa7b6dca9bb89bab2d91ed1d65cf00f42aa4d3 release24-maint
+39370 2a6b6942a7f7cb60406056bf90c9b42147e3ece8 legacy-trunk
+39371 c4e5ed7a2ba37d65100441bf20eb3a5a1a54b014 legacy-trunk
+39372 85f0a6e8380b5dd792cd587124b670d19823e228 legacy-trunk
+39373 481463a5b20c896fd8f17766e4826b0691b2bcd4 legacy-trunk
+39374 fe3235fcdd77252edae7ba141c50c74e3ee58e10 release24-maint
+39375 7caabc74997567eea2814f69422f04146fc76699 legacy-trunk
+39376 d5df5222fd6d542c9afb5cc68b5a91d4287cc020 legacy-trunk
+39377 16520fcc060950cb0f6a3ea5804179e02baf09e8 legacy-trunk
+39378 55e2759d021137249f1af4cc574687cf5a9dc971 release24-maint
+39379 245e8f4cba1db2486a4a4bde3144bce497777c86 legacy-trunk
+39380 e0bd6f324fd6a1d295c756063d608c85d978a03d legacy-trunk
+39381 1b7c4fbee0b8be10f3088207f9aae2dd574b8304 release24-maint
+39382 c1f0f170936d5572b4a6e75df467758be10bed3d legacy-trunk
+39383 130b6ce9bbf3dc1276085df2fd1468ef50aa7125 legacy-trunk
+39384 eddce40ed1b16e17d6270afbfb47d19d17fcebe5 release24-maint
+39385 7d3e8c2ae339132e86cbadc9a744ffda9c743bfd legacy-trunk
+39386 9d343bc81863816b5b61da57b2f1653f5c9cb1f4 legacy-trunk
+39387 4a5077873cba0bba99ff8befcf6bad76358acbb9 release24-maint
+39388 3d03d2cbe1ad16de594f196da9cdb5f67f20d8ec legacy-trunk
+39389 65238c9a7a6601080d05a6860770602ef6237859 legacy-trunk
+39390 1707c945d6c24dd08779d6f3ce819ac72d6a91d2 release24-maint
+39391 595451c2c8ecdc99c406811377f1155eededdc7b legacy-trunk
+39392 a17012345af6aa29f0c05cc0205ae48c080ebe6f legacy-trunk
+39393 d0e86576f0b5df57989c8a629ccba8f2aee63f65 release24-maint
+39394 44612593471c960b734f39e2e6866db9dce04c7e legacy-trunk
+39395 cb499aee36e78acbfa7e2a85e2623b8edd1e99c9 release24-maint
+39396 7a0d0b4c87d064511560992af8845d4a8cea2ebf legacy-trunk
+39397 582c90deda9dfe30425ca6da05a65d5b2c533d1d release24-maint
+39398 0999290c67588a1025acfca75b41169a16ed327a legacy-trunk
+39399 531686854f086ea360edebd2e5bb24bd8224c425 release24-maint
+39400 1fdfd0130e28192138efe0d327c967b166bd913b legacy-trunk
+39401 97c97194e64bb8723e628309bdf01e7c171f6619 release24-maint
+39402 36514b95002ab1d592f056bf9688dadf81acc209 legacy-trunk
+39403 59a63b09a4c269e52675ae3357ab8e39b0b6ae79 release24-maint
+39404 3855a960a6aa96ca9ec859fe9a1210791b62858a legacy-trunk
+39405 9a837380c3c5f127a178db6d0622e8bc73000c06 legacy-trunk
+39406 8a3d7f9f02cc2fe1d15f36e3ed043ff43b303347 release24-maint
+39407 cfcc2641a910980d32b872ed8b3893b2faebf8c6 legacy-trunk
+39408 9d41afa63b7953133e464ef0062b4f109875bfa0 release24-maint
+39409 38e588d1d8853b8a49bd39eb560f6c6e93862aa1 release24-maint
+39410 08528fbd48049fbcedd4ceb6f31a6548876e68fd release24-maint
+39411 9be92fe8a7a810120e5504cd190d564efbe58976 legacy-trunk
+39412 035409ef09011f55b56deeb2e9670c4397ace5ce legacy-trunk
+39413 256e7384f24dbd333cb35d2bb9bbb90171681256 legacy-trunk
+39414 1312946f32ab5ce1173a5e2af1b42864ec6d1bd0 release24-maint
+39415 adeda9fb3485d674c70cd20267ee08a066dec6c3 legacy-trunk
+39416 3e5c07faab111399b2402ce9ce5bcb771ea6c568 legacy-trunk
+39417 5233d19ff87f277f1d2648542f5c5198ea3ee6dc ast-branch
+39418 72d3ad08b2c620baa660cdb1f4a9c4ccacfb383d ast-branch
+39419 69eab85174fba3d862cf606b928a576b78994dfa ast-branch
+39420 33f662f6795f33a1e19c794706fb02d6c38e267d ast-branch
+39421 713ccff71fdfe4b703233ef2fcf6058e39684229 ast-branch
+39422 85960ca4fc089e9a16f4ba93b660509cf913c35d legacy-trunk
+39423 dba1e2dfd8dea7845ebb9cd72cd365836afdd267 release24-maint
+39424 200e2ef4dbdc643c47f454f6911375cd3b427128 release24-maint
+39424 0f405a1c53405494264f97b4dde82ee1a68904c1 legacy-trunk
+39425 aaa3646f4567126b00b44212fdb8cd92d621725e legacy-trunk
+39426 0234c84a7d8da826a25174d8216596d19bc6fff9 ast-branch
+39427 e52ed878c5ee0ade207cd29e94f44630b468b1f3 ast-branch
+39428 496d29b0ba5bbaf6396cb229c9a10da0b986900f legacy-trunk
+39429 11e15f7ab9406eec5c62ad1c46f2a5a31591d3f5 release24-maint
+39430 d92f0ed6a7f2f9d7eeb5b7c35b0356e8dc2d204c legacy-trunk
+39431 a84cdabb8af06dabd97e93948a14afb63c729f5c legacy-trunk
+39432 89e8a5ec3da0577b72b14da4c3d27f980e1a78c1 release24-maint
+39433 6763c91fcfef4099e9c46bf5ffc2e42e954fd4b0 legacy-trunk
+39434 baed8b7deb56d1c95ad940c55b901cc3e907ac9c legacy-trunk
+39435 9b2104011f7026a5cc961e0f5ee128b12d6112b4 release24-maint
+39436 bb677079f827ce20165aa0ccf310ddc6b30fa0de legacy-trunk
+39437 0e8964f53732bdc920c6cf10ee29a9c1bb9c5f33 ast-branch
+39438 516ed60a8f9caf670f3d097183fee4150458eba3 ast-branch
+39439 6061aaa44ebc535e49b6b8372b391481454ccc76 ast-branch
+39440 d332b2168cb247269a46fc6a5fabacfd736a4358 ast-branch
+39441 cd7d6c6f2db21754e2b203977b2457e249ea3ef3 ast-branch
+39442 e158f1e17ab4b7159ac1fef61a56826ff95b7cfd ast-branch
+39443 06efeec74d59a521249887a8eb7d73f5002ef11a ast-branch
+39444 3438eeba58c38a8fd36634ced603b35e4be69e3e legacy-trunk
+39445 81a06a9a1ac47c497b9c8c86315047a830364f5f legacy-trunk
+39446 ab3ddbbd0862c8f43ef713c84f07268ca9d6ff65 legacy-trunk
+39447 bbf8157d03984e96a9a8678898805fea27199359 release24-maint
+39448 4fc7a7edcb4b6afbc9424196a1302d0f515d01a8 legacy-trunk
+39449 6b8c55877755c7fdee05434a6e9891c186bb5f04 release24-maint
+39450 1a3cf96c8d464bd5454892d64750e1f1e623a6d1 release24-maint
+39451 bcd9811235d4962be04fb6d87599599c88797ba1 ast-branch
+39452 a159584db65c134157d56128b0f033781b55ae8a ast-branch
+39453 ba844bd7a32b6bb6510531a63ab0dc002908d668 ast-branch
+39454 4681a8fa46d06ecfc7a4c67744fd3580ccdc458f legacy-trunk
+39455 ce5b7532520a87d9467403961f6b988b3a449749 legacy-trunk
+39456 0eae5219f3b824d0fe627a1d7da4737abe488845 legacy-trunk
+39457 3e6212113e82a0dcbb09e9e09595722f65515042 release24-maint
+39458 a185d69630b38a278cc74650312cd1bda8b8deee release23-maint
+39459 c353c2782ae1595d5e47547982d044922735afdd release23-maint
+39460 97dc8f06c4fab7d954ab53d6200004d9370a6305 release23-maint
+39461 0bcb303b341b664b9e1654c4d5a8ac5e0c3e14fe legacy-trunk
+39462 0fe8117b761d74ad1a2ef72048ff51ab34cacd3e legacy-trunk
+39463 fe0ca6048267027722cb16d817a38fd8ab3cf8cb ast-branch
+39464 07956d4a8e4abbdd75c1f6ac3f38ced7d51f5f84 ast-branch
+39465 129ab22c4b19a9ca4d19e7ce295e79bd53f1c797 ast-branch
+39466 f54e50c53a72d39c6add7f63b9b3157488652523 legacy-trunk
+39467 c893caeb11370579ca6364838e31e2158843a261 legacy-trunk
+39468 22a4093b5151c69b87395cec269ac06f6faccccc ast-branch
+39469 daf338ecdccc6bf610a3f64682c730d44626e114 ast-branch
+39470 b720104b7db9165a038a55378b1e7f453ffad25a legacy-trunk
+39471 ba44e9e2b554729f720cdd7cccef9ea00cb239a3 release24-maint
+39472 8fa83a9ebc6eccecebb9d095a1591af70bde64c5 legacy-trunk
+39473 ed65e0ad221595b7829644f42959d93a1d4db58f legacy-trunk
+39474 771847cbe3b6cb68602447ad07afc0bb8a1c5ea5 release24-maint
+39475 f63e6960c5cfbe26b1b59af1aa2219bfa8eaedc2 legacy-trunk
+39476 0b7fa6f0552abe9051ee4f4c33cdcf6479e61172 legacy-trunk
+39477 26ba3d4f4fc41557fd26e3dfec2d3f6afa8c197e legacy-trunk
+39478 a578002c8f6599220d0baa0b60388bfc7eb8ace9 legacy-trunk
+39479 15a8975f7fa93d5a068f7e2bfb4b264a47b09546 release24-maint
+39480 1f2af259968b455d40b35ad7c4514ece438ce796 legacy-trunk
+39481 0a28d48636c8643fdfcfc8b7205175190cca3360 release24-maint
+39482 5d58443f489b4fd2910a40f01da356a5b10bf170 legacy-trunk
+39483 e7fd85550bc0b59b8f966ea2ef5e9ae433e20941 legacy-trunk
+39484 9516ba54b9df44757de4828bbfa27b406b000860 legacy-trunk
+39485 5db27315edcffa5a68eb7a19ce15d83f4e814794 legacy-trunk
+39486 4abaf6923437194dbc6320af6a512eef434feec2 release24-maint
+39487 ceac0277852349be6589c13dacbb0eeca0995c5a release24-maint
+39488 de1c5d17fde6c630e9f50aaa5f461edef30639ec legacy-trunk
+39489 436be2c891402f4dced3fd96627051e9f4959db1 release24-maint
+39490 7dd431750bd365fd5d3711d437063e7753a1b083 legacy-trunk
+39491 ecd61c92adf3162e6310273ff8ee367719383097 release24-maint
+39492 9521e380380f0ea3ec433e2fbb5efd9aca56526c legacy-trunk
+39493 6bde6cd23954c71257354ab3232a7981e08a9d0b legacy-trunk
+39494 17b1dfd3cbbbd33fec166b9e984721ce640ef6ff release24-maint
+39495 cc9416ee58e19f282abd4c11c2581a72c8c13484 legacy-trunk
+39496 f7378e97b66a24787cd67b7da5fbd5a2d9b804b0 release24-maint
+39497 e73accf3eddb4a32f9cc65150a8afd24604d37b7 legacy-trunk
+39498 336b664a2210e92d94be1d96b3338a1b70f5a7b9 legacy-trunk
+39499 5824130b7ac350ff27ddada590aa1743f3817411 legacy-trunk
+39500 a7cccc391228022a82b72103f9ec468d60ea4e68 legacy-trunk
+39501 dc8538845b0c890ea792754b4f52db4c9949072a legacy-trunk
+39502 363e6dd079fcac397f3e9d136bb353cb27e3406c legacy-trunk
+39503 39dbe3be327aaafc7ba4c9848a8fa525283d8d3d legacy-trunk
+39504 d504a302bf53e3a3dacb4ced94c7108e0ecf91e7 legacy-trunk
+39505 f17ed3b62adab15669478378b0d081ccad4d29f3 legacy-trunk
+39506 ea53e7d98b006aa239f933431735825afde35697 release24-maint
+39507 fa73765e8ef51d857369af1c3759fc10d284fa7f legacy-trunk
+39508 46f0a44f49e643fe7ca2c2ad35e750dfe6908cc6 legacy-trunk
+39509 966deac15a890df73a0e6e50bb586278bf8cb84e legacy-trunk
+39510 875739d72fc1c7b986ee605de5c795b40e2a1aa8 legacy-trunk
+39511 c0d6bae35b4e78fa20f77f31637df2ab754cd0ad release24-maint
+39512 e41fda9f0fd1033cf191a8adefb4b127a2017148 legacy-trunk
+39513 7d0a5ac24669ab6be470ad99ac71db8a0a14ffa0 legacy-trunk
+39514 81259009ba2c8f024111c7308bc77476e5470845 legacy-trunk
+39515 25378bdb1b3a0da8cddcef420807cf94e06f9e38 release24-maint
+39516 acfc0e22cd8fc58e6b2226a66de0dea1279a2ec2 legacy-trunk
+39517 76e295ea5152c9846f1e09673ae472779b668a64 release24-maint
+39518 11a2650e8568dc0a751bda6b84d7d056f013028c release24-maint
+39519 bbbb7dda32f3ee0859b86233bf6f37f57cb25ad1 legacy-trunk
+39520 d79af065115506fbd3083eb0832341f3eb595e05 legacy-trunk
+39521 b19cf73c54a78001d6d6d5a13dfb05d97a71b2a1 release24-maint
+39522 724bbd489ad4727e9052c69b56341b2b5b2cd2a9 legacy-trunk
+39523 57f630a9de2619616f2b20ae1c357fb43e012852 release24-maint
+39524 9b7d117eb4bc96dcca74c6c8cee8abc91849192e legacy-trunk
+39525 11744f7bb47a82d78b369f9be37e6f7300c29eae release24-maint
+39526 68ad52b0445bdb7f228aec771cf7838b51333947 legacy-trunk
+39527 41413f23345b4f75e045671480b809cd2a3d96ca release24-maint
+39528 8a6c99f865ebd39cfe79c50eadf8415994f1db5d legacy-trunk
+39529 8ad9a2fa8eb2a6078f96af30c83e2c559dab1eed release24-maint
+39530 bfbe2c9b121598b6e5a3fc15827f2041440e741c legacy-trunk
+39531 f235e8ef0d56904fe204adaba7375dd7272a62fc release24-maint
+39532 07eaf60f75650b170f35d39b93ae5f1da29adbe0 legacy-trunk
+39533 b8d1b45292071163368b57cce71b40c3e37930e1 release24-maint
+39534 ac88044cde486b00a3e478d7785b7fd7ad32bdf8 legacy-trunk
+39535 dfabf0c7f1adfd17c4526cf2bd9ca3dcb802fb87 release24-maint
+39536 c8655885e4065d355338349090913f85caffdf35 release24-maint
+39537 6dbfbee585cc83fe33232646c6d78a8ca84bb5be release24-maint
+39538 152ae7193c9a77ea2ba0c87c4c74760d80be6059 release24-maint
+39539 fa0881fd49b7a9505e176965cfa7a7c864704926 legacy-trunk
+39540 8bad1bfc331992c8e1f349ed52ba9e1645f99b11 release24-maint
+39541 2691cbdae59bf35617f1a336805063edfaf4c27f release24-maint
+39542 90930d2d0c191076a2a027d59dd7f27ef33495bf legacy-trunk
+39543 35c43674083a9a34133e7a0fa24f31227441b1d3 release24-maint
+39544 1b25fe8834aefd7ecbecdb9003c4268497b59abc legacy-trunk
+39545 fd51ce8d35ab4fd42af5eff61d02dcc270b443c1 release24-maint
+39546 cd31027a7167a37548f285679c5c967a0bbeac6e legacy-trunk
+39547 d3ae7930cb939533fcffd44d1695d9362ed0a4c7 release24-maint
+39548 73fe2163f0b30d33a026c8ba6d25290ea5259062 release24-maint
+39549 5a6c483ed689f41058784288207eb990da31046c release24-maint
+39550 c28d0ed86ff058b98100e6b771304d42d1151698 legacy-trunk
+39551 8ef500c4506c72b74bf9fa0500a959fdd3d50ff5 legacy-trunk
+39552 f4c2c61cb560959529941272e180de463261e25c release24-maint
+39553 37859c6ad5bb5f7ebad19a169d98dea426c12152 legacy-trunk
+39554 52c65d73fb74019f6f9ab547c0fb185109b2b0bf legacy-trunk
+39555 098ea1e18e8d97604d8f6f18d0af9da1a8a35b90 release24-maint
+39556 0ae3072127550ae24b742f1b32bcd1c4152b12fb release24-maint
+39557 0da3975fb0bbfcf782d8c0f67e65e502b106a747 release24-maint
+39558 e6119d577cd35fd8d5385e50cc1fdabe4cbe4795 legacy-trunk
+39559 02a8c0643f5bce266beab750ab91c7036ef7817c legacy-trunk
+39560 1cf17037a2ca8c758177cb7daa141a038a461823 release24-maint
+39561 5f2785722cbad03941a21677167c796f73f3fea2 legacy-trunk
+39562 4806cb009a9ce623cef8c1a11aa98013d341a602 release24-maint
+39563 9a2e20318c9f5fbdb78a91944af088d9efccd3ad release24-maint
+39564 620992aa0a9ef583d36bf93c4c119cdc282ea097 legacy-trunk
+39565 b68b135b455261d28299707c66e530cf908749d6 release24-maint
+39566 bcd05cf2d61ba80ce9b574b9387a2db32553f6e7 legacy-trunk
+39567 8ccad732315f892db53b3db519d77e8d004e4acf legacy-trunk
+39568 afdadd56919705c1e191951f2bd4cb54a3b70717 release24-maint
+39569 5c0c06e226ec06ea64f4a906d3691e6070808a7b legacy-trunk
+39570 40ddf366f5a152f6bd20e9820921929bd92cf341 legacy-trunk
+39571 9b994c67e909c086f0261711b99b64a774b9101f legacy-trunk
+39572 873a1b2efdc736576da0484814cf656089c01ced legacy-trunk
+39573 2c280e4661d0a069444ca21014b5a4ad566ff7ba release24-maint
+39574 39eb6a221cf3124221a14b38e63d4991cf0cd8fb release24-maint
+39575 21bc6262eb9920ac8c2e57ea1e3f0bfc7de6a0a8 release24-maint
+39576 89cf2e3fe728a68f4bc66fca9c0af79e0e085a9a legacy-trunk
+39577 f86cd27786ab319b7365510b560503f665a0faa6 release24-maint
+39578 77571f71b3e67b0bf3f5d89a463cbe30502b930a release24-maint
+39579 5a8bf8e7d0102c0e0b1efdd81ad00b72071f21be legacy-trunk
+39580 a670a5dd1fc6aa917bb62ad45604c3fcb683f49a legacy-trunk
+39581 23dda92de9938a28ff555ec8138f94460b312051 legacy-trunk
+39582 1f236e598ae97631d4db4472302500ff33841c3b legacy-trunk
+39583 af3a06625a6e59c2dbf92b40eabb74bc2d45681b legacy-trunk
+39584 35a99eccaca679326f5e5c990b3b9f6a694cf9bd legacy-trunk
+39585 ecb78863a4ee7f31432b79fcc1436149c0550dc1 release24-maint
+39586 7b2b8db9813633507ce5965df387d2455b7e04b2 release24-maint
+39587 c6d7f1fe9d1ebe91a6abb8f325e0b8ce5920d8ff legacy-trunk
+39588 90bb71122257c1123cec89b5509b7b9281efcf46 release24-maint
+39589 4d1bd9d0c006db663ece579c8a240ee6ba37b073 release24-maint
+39589 d02d387554e200befceec999b788f4593b434b49 release24-maint
+39591 70927c799a21e26b3b5cd0f6fc105cbaf971cdf4 legacy-trunk
+39592 8ffeedb606d330cdd3a4d16ba676a1a6ea30b4cc release24-maint
+39593 6f3d209555eb55ff48f55a1d945d4eff0aa21e48 legacy-trunk
+39594 72660c0866a19f0036e72081798bebb8f6e1ef1a legacy-trunk
+39595 774bf9a38b2ab94666c5fb654da4e24e24a5ca36 legacy-trunk
+39596 17a82ba45452ac1b5a12de9ddd433cfa639a375d release24-maint
+39597 399c41176bb79a2f2485c9d4a3807a8c2095d4a5 release24-maint
+39598 a95765f6928251d86f0d1357eb46641ac4833912 legacy-trunk
+39599 4e0d2a7f5f15441bdc152fb1e0ca4e00affc05f7 release24-maint
+39600 777b29d913a622a2e99f83a7eea23eafb0f6709a release24-maint
+39601 495e7ffad7e8cc0647bfe2dc304e90ccdefa3fc0 legacy-trunk
+39602 687faa9cf6eb08c162ee392f5504f488bc326630 release24-maint
+39603 c260d3b7d5829830403d15fbd54a744896048c89 release24-maint
+39604 03cfdcbc4d1f3a353dc38507fa40c2ff73d2a0a1 legacy-trunk
+39605 45aaa436b945126063124220bbd518ec88837cbd legacy-trunk
+39606 3028e30aa83559035cef272b47dbb0b7dbb07100 release24-maint
+39607 27e1426b7f31d642e4114a2fbf613d8df6484f24 legacy-trunk
+39608 e22334b1da67fb2916e686d3c4df9ce63b5c97f7 legacy-trunk
+39609 7dd4e6cb9d275283ec580ab71cfa3c619e10afed legacy-trunk
+39610 68dbcbf0516c57658620793e28463a7822089965 release24-maint
+39611 e31564c7bdbf7a26b3d831ae808acfac56171860 legacy-trunk
+39612 1e7b755194a4ddb7495e4081cea677a9f5131436 legacy-trunk
+39613 407ac499a5a391f660e4cd65a3de3e9f192a2592 legacy-trunk
+39614 e0a9f66b70146716b6c174effe16438dfda9e472 release24-maint
+39615 ae536e66e86f5f01c18cd425e02dff67df771c31 release24-maint
+39616 b64639cea3ed87fff4ec0e4a92b6e4315bbb7ccd legacy-trunk
+39617 f5bd7ead16c472371d55aa19ae240368d9ed1f6d release24-maint
+39618 4ae7daaf0a661188449ab83dfa9a376cdad98a81 release24-maint
+39618 8d37276fdf077d6d23d963d3f7f95381d00f1926 release24-maint
+39620 6b42eeb5214da8a0322d3162e53fee3192b97cc4 legacy-trunk
+39621 8f2bf18674cbe932820f3e9d40d2a283a1dc9bbb release24-maint
+39622 d33f4fc84d4af2b19e63f603235a914978becc92 legacy-trunk
+39623 c3783a12a1bc19d3d0eb28124877e21bec28a32a release24-maint
+39624 ca844517c84952c456430bd55b604b0370fef574 ast-branch
+39625 6a20831d357d57cd624bab90de3733e51eb51313 legacy-trunk
+39626 9ef25c89d0d6c3069cd80ab9597c0a2700e16157 release24-maint
+39627 b5a01282dadafc99cca4ea6112344053db86781a legacy-trunk
+39628 8eb75c28ed941c432f5d13dc150fc37cdb561082 release24-maint
+39629 a2cf25642c8ecdf96a886f423fd862ab7351b8ee legacy-trunk
+39630 cba10c6d34e38593e66d6a968d51e0b87be010b8 release24-maint
+39631 a83e8df1349862af3184a6219de547efa7fef7f0 legacy-trunk
+39632 1d4d85c735e7c4f8a19e60eda62bcb5114fd2c67 release24-maint
+39633 6d04cb2cdd4afccaf588c4eae4aad124e5bfe99f release24-maint
+39634 85651eb3d9a90d121a0f42a5b04b7412f1536e0d legacy-trunk
+39635 67848c871768b559c3f234a94f96bb4ffc2d87d6 release24-maint
+39636 5611db451a39ba2ef7b8a50bc2aa245860cbb5ef legacy-trunk
+39637 0be00775a80c451c051601a9c405d764aff3c431 release24-maint
+39638 dc5d706283d62febc4587abd9b9c292be2202f3c legacy-trunk
+39639 b8e571e6de2e3e5767eb0eabd650a2b9654e7e62 legacy-trunk
+39640 e454d6c1b3c1f3fc3c31700b870bac343c4e7b1d ast-branch
+39641 630ff5440dfc6e943cd43135c6e85b7d96924777 ast-branch
+39642 753457879425590a413596088032a1d8bf5f0c11 ast-branch
+39643 6c3d0a0c19560087b54353d2546dae41ec8cbd8c release24-maint
+39644 84541731b166a6c4553aa8cfbc9df797f01f9728 legacy-trunk
+39645 f6a209b6950cab73aa022b99b57b252ccbfa95f8 legacy-trunk
+39646 ceed33eac43616812a2671eea65d83eaf8f97f46 legacy-trunk
+39647 5d5236eae8bd3d60df8038cf597e060634415d4b legacy-trunk
+39648 412d21e30c130e2276b9847089a617548fe87ce3 release24-maint
+39649 612a12178e47b7084c6e103d5095e0f1ef46912d legacy-trunk
+39650 d14813e78a500fb2b91ac54ce5ca1d4d31903d67 release24-maint
+39651 9d43381c184cbbbc7dacc2a26ed5e0085a409a9a release24-maint
+39652 e1df48f2847ad8e8ddf602b7f29409a68ec9af9b release24-maint
+39653 e9bae2febac800e03bcbceb7b4e48aaa3d097250 legacy-trunk
+39654 f0951fdaed37c0af33858da0a7fd406eb146ad44 legacy-trunk
+39655 172fcd9c1952615c81fd0ca81d8e10e55506fcd5 release24-maint
+39656 8bdd8c2c6c495f8a6f58a41fd54a6d63216d49a7 legacy-trunk
+39657 3e0bb7f75ab765a9c8a57b9011b8219a7f615c09 release24-maint
+39658 e466c0a550b88cb87ba42a51bb37becde287b196 legacy-trunk
+39659 02fe5d496fce99246c63b5230a272f2dddbfb4ee release24-maint
+39660 6907e471bdace400d230a094c6f630676e4a24e7 legacy-trunk
+39661 3be835350082862b5ae6883deb400f2dcc3e0eba legacy-trunk
+39662 f9879237895417b7dd8528119bcf4867d8a85e58 legacy-trunk
+39663 2985e42eb2d2b091cad18a62f3dfebb4b995f474 release24-maint
+39664 330c2307505419106f716736e01231500ff1bc2c legacy-trunk
+39665 2fda7b174794d9c0078e9b6575fe08fd41fc99d4 release24-maint
+39666 548bad215429f39af93737ea195b95dda02a82b3 legacy-trunk
+39667 e2995563610f71794eedc5f9abcad021ce08b8b5 legacy-trunk
+39668 7a7e879b2aa1b2e0591eb544f98a4c6b8efffbfb IDLE-syntax-branch
+39670 b61cdd4f888bf9f6128f3662251358f11130db14 legacy-trunk
+39671 08a551e7561cc2b463dc7725afa28bd2feb384d3 legacy-trunk
+39672 95c0dd11afa78d2a5fe18c642564bcab744f1546 legacy-trunk
+39673 586b48e3cb98a033a3d731120abb016ef80a461c release24-maint
+39674 921afd08a5dcbd42012987e8b2b7cde39f0d8192 release24-maint
+39675 d0af7b098a99d62eeb2e67f6173bc28706b09c4b legacy-trunk
+39676 923723a9c43cb96e818532e032a19570f515cbce legacy-trunk
+39677 3572249c1e7710294288d1cd5996323336e4a173 legacy-trunk
+39678 d43dfe695d08a4a743b6de251779a2348a94797d release24-maint
+39679 e16b6bdf3f899a7f76b8173db5db793d9e4a4e3d legacy-trunk
+39680 22a720b35314d01299adaea6b2fa0511a3b332c2 legacy-trunk
+39681 e78e84f1a82487fcc453ec3e44d1ebcfc5b829a9 ast-branch
+39682 76635ab7b7074d856351bbb87d34df97fc19eb08 legacy-trunk
+39683 a64be138f0f6c48060d643de894f92814bde5305 release24-maint
+39684 6e04a557ae20cd6efc2dcb6818c7b147088e0cdb ast-branch
+39685 4e398837373c9ad6e3751f59d8a347409057170c legacy-trunk
+39686 aae37430f525963477a0c5aac3a13bfa60d634b4 ast-branch
+39687 8567eb23e65deb4f3b136bc1957ed0db3c93c632 ast-branch
+39688 0e69078cad900fd37a2553b7e87b09b33ada4081 release24-maint
+39689 5685ec59f35b8413021f143d8e846396d1cfe560 legacy-trunk
+39690 aab1d5fdf64df656edf3a25f363e2d127875201f legacy-trunk
+39691 8e86dbad8c714e988c8a0921b8b1f7fe13aaa1b8 legacy-trunk
+39692 59c4a65642c567ad80a38c5547d5ac02847869a9 legacy-trunk
+39693 6e70ed6dfad67579709b22197b7e09910e6f6a4d IDLE-syntax-branch
+39694 e9e30d92871e9a27aa3a6744502aaf72f6ac0889 ast-branch
+39695 7b35c29040c992fabe9424e347edfdfcec31e167 legacy-trunk
+39696 7b7eb3e7620df9100188b3b9ca318a6623051346 release24-maint
+39697 72febee58e7b9e3680805ab6b19a43de2ce232a3 legacy-trunk
+39698 c38e4ec7b7f11d56e3cca3436c62c054a90af0af release24-maint
+39699 7e7989b6ac36c4b915597a8bceaf43f0d3c0a03a legacy-trunk
+39700 5a62686f7dfdf64eb6c13ef33ea2dbe35efff7a4 release24-maint
+39701 307b7eee3e3d922073a66c7be48c9e8ec3ea15af ast-branch
+39702 d947fbec35d3f04f148de4f0af4ff826f905bb3a release24-maint
+39703 72595a615571b40671e933d2331e72c6c172fb41 legacy-trunk
+39704 c3d64bc7f6962286d4a40b08c75343bf357744f2 ast-branch
+39705 57f62e5a392166600e4c076b605f7899e6ac1b2f ast-branch
+39706 c7a7e3d1bfa70a4208dd09781bc591a709073265 ast-branch
+39707 ac7f5407246f40fd3fad48d5069ef5916aba5e63 ast-branch
+39708 ef7cddeb327cc8c4cd70555d45014ecd3b7e3379 ast-branch
+39709 b1081c495d46733bbfa7d2bca3b132080dda47dd ast-branch
+39710 1745c2edc514d9232ce54f951e97428d0eeafafa legacy-trunk
+39711 a4429b7787d44e5b9b2f861251e20d1c6eecfedd release24-maint
+39712 2342cdb926956b2d8d8df3053c575f0e6c41feb8 ast-branch
+39713 ece5eb6f2b5a33dd28a9165df2b11564dbc64fe2 ast-branch
+39714 3bd74824a3acd0a1e406b539dcbfbda37b06ed49 ast-branch
+39715 d2044e5a06c7e638a2ca3ab70f7d0251e9b34bc2 ast-branch
+39716 a4bec7b6b6405b3eaac28e45f215e84dc92a51c3 ast-branch
+39717 30e88a175fdc90c797518d69dc9c3ebf67d46994 ast-branch
+39718 525dac0d285bf2e248800c523decbd2d0d606a7e IDLE-syntax-branch
+39719 76b91acad5e88ccf724c4af144e36e48b1ace037 ast-branch
+39720 bc7f6deab340ae75738462ee7cbaddaf94e9befd ast-branch
+39721 dd29261cb43820ebd9be860c5a4e75328bccce78 ast-branch
+39722 9eb441a707246bda1e7af1db38101ea61930f15f ast-branch
+39723 cda87357185fb93cf0a7930ccc8c171f3b2d7d95 legacy-trunk
+39725 5669307c131c53846656ace9a6f29c1a1699694b release24-maint
+39726 42d3a4400d3866ca8645c0fdd6463e23d8ef7d1a ast-branch
+39727 21611ff558a502383b569ebab924db5c9a50f473 ast-branch
+39728 ae539af4afc501d4396d12ef60cb4439b44dd004 legacy-trunk
+39729 60dfe2f55c0f53fc649168a751edf3ff499b181a release24-maint
+39730 66792a2ef3dbd043ca4e96d3741b47ac64f43945 ast-branch
+39731 06ad6345649fddb6a48aab627c8ddb05ca99e72c ast-branch
+39732 d7f40709e158540dafa756180913b4ee5f492ef1 ast-branch
+39733 bb5ba54359e5bcd382f9989720074a50ba4d1423 ast-branch
+39734 496eb5ded5e45b3ec824d332f24df94ecc09d9f9 ast-branch
+39735 c9fa85b4053b75b792494688cb53639c626583fa legacy-trunk
+39736 eb2c09d87870183f79f7449eb64c33ed6c8b0d86 legacy-trunk
+39737 fe10373cf8a271ddabd7d59fb1b8e4ffa33909fd ast-branch
+39738 83f245f72832e391f8fea4a2d4d7023daa6398b2 ast-branch
+39739 536590c32311852a33a188fcd71ed6dcc8d6c9c2 legacy-trunk
+39740 5747ced35424a6f1065a20972d221eb7bb10c806 ast-branch
+39741 cb5cc48b5c295af082a9775047fe5fe4ec97e2c7 ast-branch
+39742 bc7ca16334bab54ad8811bb0059871de59dccdd8 ast-branch
+39743 9ed43e637ae7b5aed5b1adc8dcf9b8fcf7b113b7 legacy-trunk
+39744 6913abb7047aeff18a820b33338e105db9abc6b2 legacy-trunk
+39745 8bec120dbb16a67944eb3defb4a6623943fd9114 legacy-trunk
+39746 0b8268e0d70e778299aa2f2f9c884c478aba1f6e release24-maint
+39747 4f2843dfa23c79ac27a8ea60235a814e0d2e88d8 legacy-trunk
+39748 d1201fae06a850073e153a3e7ceb56918a03552b legacy-trunk
+39749 dfb8fc377b58e68de60d78da297b0e7744d12e99 release24-maint
+39750 ea6808ba1637bc2787afbe3d02f5e6d59233affd legacy-trunk
+39751 7ed87050e1697466c2214d58edcf30e35e2aa229 release24-maint
+39752 5390ddc77eb866dff372d1aea2d2b51be74b329a legacy-trunk
+39753 e018fce14f1006541e10b8413149cb0920d38dbd legacy-trunk
+39755 d0399379d0cb264c382313030c343275e43ad6ca legacy-trunk
+39756 b32a39091aedcb6b069cf0cdde6e9304cdc01cf7 release24-maint
+39757 3716051830c2cc5ab0d5c1c8229e05051d4dc9f7 legacy-trunk
+39758 1c4d192f1568df8cae2d35141a729247564a3cfe legacy-trunk
+39759 05b715822ba596e2755555c515c8d372c08043f0 legacy-trunk
+39760 e7815495bb279b192ec14de53acd9aa99d3e585c legacy-trunk
+39761 407c3dacbd7c305fc674230286a27bab239e1dca legacy-trunk
+39762 718e9de22ea725e25b40fb5785baede30dbec1b5 legacy-trunk
+39763 fdcb58cbff4df0d6d02176fee9d5fd2084160612 legacy-trunk
+39764 25ba2f3313c91cc4e79f6773beb2b57894c26a74 legacy-trunk
+39765 17828a00a4544fa3fb42065bb51d60be8f56513f legacy-trunk
+39766 a7a493db62313d033bdbc4c65a8877f34b956edd release24-maint
+39767 e56144704808d7ce6c305c0b4f0514e1ebbdba51 legacy-trunk
+39768 47496e7dbf2fcd3060c7901a123fc61b1c2762fe legacy-trunk
+39769 81ebd6e177a3f8a904357d8c070a707a3b83004e legacy-trunk
+39770 14409b820933fc77bd5cab9b11a3aef25a16567e legacy-trunk
+39771 c28c1a37b86ae180081963099264685add54c865 legacy-trunk
+39772 b72b3e517a4de7a24de9b233e7f5c659b54740e6 legacy-trunk
+39773 eb15cdd4a2f1001792074ca0789026989452ff82 legacy-trunk
+39774 e0e320f36c9363f6d5f8bfc4073dd6c527944f99 legacy-trunk
+39775 d91ed7107fd2da03d356acbc5243a68d0b505851 legacy-trunk
+39776 79c5b817fedc1157930b90e01f23fb9606ca35ce legacy-trunk
+39777 7a5ac203154aaa2d7575a1bd925d8843d7e6e202 legacy-trunk
+39778 3f63341d9312f69221d6670d5cfe593d97147aa9 legacy-trunk
+39779 528e038839a2aae7d3dea2e57b8f454e76a98e02 legacy-trunk
+39780 4aaf506a7d0992b8c154a50ab56438d3fdf2f1e7 legacy-trunk
+39781 f376221bbb76c1d272e423840c348a1c5c23dbb9 legacy-trunk
+39782 34ef9f138c303b762ad8682a0ba4850b05b9336e legacy-trunk
+39783 7ee6880cb16f2852e07f0df513d72d4e2e175eda legacy-trunk
+39784 576b9a9ce5797cf7c672a97456d6921da102da94 legacy-trunk
+39785 7d065435e86c1b882cffab0cf4dc90cf87277f38 legacy-trunk
+39786 9a7c2d1e56de31daea20fa349b21ed0049decd29 release24-maint
+39787 044d8e0f65f2fb9e361157ad1b38253171c25fd3 legacy-trunk
+39788 f64fb284ed154d487295a890ca5f2824822243fc legacy-trunk
+39789 0aef351223daed984c385d258d6a6ef95cd764bf legacy-trunk
+39790 66b9075d142b8ec53b46a34fed98d76a47c16a3a legacy-trunk
+39791 144b52535434fd35e18d7981c71d8e63b2e39149 legacy-trunk
+39792 893be94c889182a9091b7920adb4e3d1d377247e legacy-trunk
+39793 efe60730a1eeab6d2622a0f2a85d66fbdcf7f9b6 legacy-trunk
+39794 95d0a857ae51fa15a59ec019cef98033f32ba754 legacy-trunk
+39795 19d796bd740f4a097496621c2a83910a572a0080 legacy-trunk
+39796 72cb041ccde3ac7beb296d49bfc203a5e43af7d1 legacy-trunk
+39797 31d36dd5959ce9d9e624bfa22ae2d50d6d2eba53 legacy-trunk
+39798 aae411352fbd6a4c30b9745a723bf7868bc0fad5 legacy-trunk
+39799 b1a0e1a2b28facbbeea7bb7986d08d0954953171 legacy-trunk
+39800 c6dbf88e4b14b86d0216f4c775c5248e3f43d514 legacy-trunk
+39801 dca70f4ec77b674294803069fab50b71f7800794 legacy-trunk
+39802 a0bb0fd5e143a9c84869008a2174058413843b12 legacy-trunk
+39803 1661e73c07aba399998d830b57879754bcbf1020 legacy-trunk
+39804 db9e2dea4c113d6be9fbc7180a0f982b89295082 release24-maint
+39805 19a37a9f4ef94b26c1670294edb7751ebba9beab legacy-trunk
+39806 f7b0cbea905b5b348d10b727952d2af3cc90ee3c legacy-trunk
+39807 1ac9ed1b5a03c19353d76bb7d87d4bb4b1ff9b67 legacy-trunk
+39808 b8b13b1ffe7571b4af5f5bc8b79af13d02823e2e legacy-trunk
+39809 914ec0afa51c215b1087988b23c9277b459b344d legacy-trunk
+39810 39f3630a7124d90f7b579f49624662b38f54c79a legacy-trunk
+39811 dbc988bea55d6f6c5145651db6c597baddd6a821 legacy-trunk
+39812 fd630042aad43decf50af64224b6a07d134c0be1 legacy-trunk
+39813 3778083fe2c862c40d93ed23c6711b342316c0ee legacy-trunk
+39814 857f68fba27544daca328b09d3ccdb67c3a71e2f legacy-trunk
+39815 842caa245917d885cd9c360f10c8dd13802789ad legacy-trunk
+39816 4bf6459c8e3bb9643326d5ab9d61724387fb934b legacy-trunk
+39817 e17a307b1216940905db3f1cc33290a7d096bb02 legacy-trunk
+39818 8daefe84994934de3e6584fcff30538d05f31c8f legacy-trunk
+41338 193305c9dbdb3549ad5963f5f82da747a62c554a legacy-trunk
+41340 76a6e908624d7c5cdb7e77f77abc7fe64cd67d95 legacy-trunk
+41341 52f65898874a68885b327b7f7d864c69c3df52c6 release24-maint
+41342 44fe157255bc4cd8a05f7f0600c8fe278f2e03ac legacy-trunk
+41346 dfb1139edc55a1b0f7f272ed7735cf54a40046df legacy-trunk
+41347 c2a98ba371c8a90c0bdc1a42c7273992288279ae legacy-trunk
+41352 88523017414c1873dcf3c2c158159f9dc66fbf19 legacy-trunk
+41353 39b1e74ba17c55471896e1a4404512698620ce82 legacy-trunk
+41354 9b0dd1f53ae2186d9f28ef2085da2d6bc02ca732 release24-maint
+41354 abbfe91787319b7f94543f40ea7ba15d99ad6e0b legacy-trunk
+41355 2e25e98323a7f651fa925c54074cda92088be5d6 legacy-trunk
+41356 13deec5281efcb20a5d424300aa48a0e4164c63b release24-maint
+41357 eb9a39c1a78bb73edf3f1e3d94f4a051ccee81e5 legacy-trunk
+41358 a000f322dd05dbfabc5d661f355ee769325b15fb legacy-trunk
+41359 ed247f6e6f0754df80cce593c9e187d568f26e10 release24-maint
+41360 20bb7ff1695277bccda6e503af1642307527857c legacy-trunk
+41361 a497e10b23e470cc76b36f27ee704ae50882cc2c release24-maint
+41366 69034a08e5a3a34f9f9e72a84a77407764dc60a9 legacy-trunk
+41367 b652f535201d6fcdf74b088934e3044248202737 legacy-trunk
+41368 6cd110743bd2089f0d653aa96f29d4d57ad3acab release24-maint
+41369 8b02d8a5e707f26f0242f967c3ff1505d1aecf5f legacy-trunk
+41370 f9e50ff96ff85ebf76b4cd6ac8b367121d5e06e3 release24-maint
+41371 cc17a582518aefd42a33760e958fd0341760db27 legacy-trunk
+41372 0ecbffbadc0056823e593f217aff3524fd8425cc legacy-trunk
+41373 ab3d1e6a0237270e2b015276b237d9f3224e8baf legacy-trunk
+41374 bffae2f812f74aed75b020a23cfb2a48d5bda392 legacy-trunk
+41375 f3caf80bd66d21ba8294a064932434c9b1250c8d release24-maint
+41376 029b6c5f258e5ab46be2d20799967368c30269ea legacy-trunk
+41385 646ba76115acb4350cc30f5ec5a0d78ad67ada54 release24-maint
+41386 7bf48400f24a8e7d9144cf2e6ddfcc1170812051 legacy-trunk
+41387 9b1efb0ed63592de12d5befc6745b629ac15db7e release24-maint
+41388 418a61ead11b85debce3fa51a2dcf24f2aa09e21 legacy-trunk
+41389 20aa1d5b3b08327ea643a2e793183b13b620ee18 legacy-trunk
+41390 fd08918394f9c3b11192f658fa46bef166064c96 release24-maint
+41399 a8649869cb60bbea095dff5641acdddd595e7522 legacy-trunk
+41400 49baf8b04681255af45c0196e14099e57c645e8d legacy-trunk
+41403 de090bf67a5989dbff25daa55deca1eb85c58ea4 legacy-trunk
+41404 ecf9f4ed109e5cd00dea622b3447787ec7674863 legacy-trunk
+41405 6e2b282434d49510944fcd14292c984bb1779be2 legacy-trunk
+41406 f85dc31f1f3e4fe0f86485d3dbcbbaaff5f34a22 legacy-trunk
+41407 d812e39ae907a7d5991f865fea702c93660ade73 legacy-trunk
+41412 caea0cc09a42f91c9166c47976d7c1c219fca299 legacy-trunk
+41413 1d1957f55626790dec8ed0c1cb831b7b21d4f77a release24-maint
+41414 fa1d56947301307faa67086e4293cc33e0fa3a4b legacy-trunk
+41415 f0e3355235a5e525c82fee672d61a519e1e8e93b release24-maint
+41416 5f71a50289a2556bad7cdad0798bbdef49fe9f69 legacy-trunk
+41417 aef8526fc9bba6f9d3ec0e925bcb048d7384b609 release24-maint
+41418 f6d8b0de134a20138e495fb2de0fb2dd7757d426 legacy-trunk
+41419 413c68b314871ea41a955358bd5d01e30fbccb62 legacy-trunk
+41422 ee3e0ee1edca7d3482c919b0729b500af79781fa legacy-trunk
+41423 2a92d5ce0c0d8c48f7ca1dc0515261df1ebe7591 legacy-trunk
+41424 7f37ccf698cf5b014632d68c16da9f262a32005c release24-maint
+41425 6888ddf1ea9d53d44faa59174eee02158d23bf3e IDLE-syntax-branch
+41426 429f537cf6d6b7e592796f14251412ba3bf1e7e0 legacy-trunk
+41427 4462871a6dcec013db287bfe0850108dc63dfb97 legacy-trunk
+41428 87e2210e07f49ad5d50e5be9cfd64d20fdd0e085 legacy-trunk
+41429 6a018d8c59c91e046cb671d465982966859e603c legacy-trunk
+41430 6015df136b00d1bccc412cdbe2088b1c04556e43 legacy-trunk
+41432 9b885c934144b7055e36bd617a0e0ac8e1207d14 legacy-trunk
+41433 3e634e41b6ec3c79701a2acf2bb16bfc36d0b660 legacy-trunk
+41434 6867995a18a7da900e79d220765fd18aa5cf25ba legacy-trunk
+41435 79f2ce3201925c9d63ecb16448876f5dfabefa9d legacy-trunk
+41436 dbc93ee53e2feffcbfb9eee4157784b3e93506db legacy-trunk
+41437 600bbba56f9bab382bd805c54057857aaef0933f legacy-trunk
+41438 9f73dc0953d20204a549c8c781a4c4884b222cea legacy-trunk
+41440 f4842f42700bdb7f73db88c7af633b117f4a893b legacy-trunk
+41441 37da969ad116c5ba9b7355c23f3bdffa070fef08 legacy-trunk
+41442 9003836a036f13352b5bab1b2ec7372a20d8e24d legacy-trunk
+41443 f531c05cd240866e460eeecdd1001b86eefdbe56 legacy-trunk
+41444 947656630b128dfe8ee207c76d6ff44a2156a1e2 jim-doctest
+41445 3acb6b341075c9a6e834626dd7891b0bb94e7ab2 jim-doctest
+41446 4ac3fa158927902307eec2f90934766413e4bf7d legacy-trunk
+41447 583ce9c0c664ebba98d2b71a3053328b548d6693 legacy-trunk
+41448 76ed7fdc9d85bdf58291224c0592df2c1028b6fa legacy-trunk
+41449 44d63eedfacaf0470f3254269e1a9b35db8c04ac legacy-trunk
+41450 086caccfff0e766ac3c7598c0ee9e3451ec28ade legacy-trunk
+41451 f334efe76f6a5462025bf9229f2e21712fd845b4 legacy-trunk
+41452 6d8ce5570cb7020cdcbc030971b6d1845258b4ee jim-doctest
+41453 40f3d79b21250a415f799d24112fefdd21bc4631 legacy-trunk
+41454 94a409da4bd40b7326f71aa6d865453f556a955b legacy-trunk
+41455 1f9d4ac35010282312b9af388939fe50efc38eb1 legacy-trunk
+41456 0d1e2e73c3ec03377a91e6f1c9c4fc5606746f18 legacy-trunk
+41457 29420bd3b5cbb18a4e892064c8103f0efbb1a00b legacy-trunk
+41461 3236b5fb1fb70f30972329f9ab6f715388514694 legacy-trunk
+41462 e716483cb3f914cb196fad626b4c168a5d4e7cd5 legacy-trunk
+41463 03867fc6fd8078cc3b4b569ac372c30f95e6fcc3 release24-maint
+41464 5b82120cb49d6122dd0aa6e3bff48a2f161796a7 legacy-trunk
+41465 f99d6cb88f6f208be961f658aec91102947582d8 release24-maint
+41466 3956d620af09ba00d067ed101c33890e9b881dac legacy-trunk
+41467 4789e75a6fe7d062062d22a593bd2882157c061b release24-maint
+41468 e2473c4f2ee0d7fd7edc2bce12d1676719e6586c legacy-trunk
+41478 f414ff287823b60ff327221fe5451ea1cc9a62a0 legacy-trunk
+41480 8fd46b660e66950b69b6a49d6e357b1f610518ae legacy-trunk
+41481 71ea6b7f58ce38d2250509a7c54adc7fc7ae1d07 legacy-trunk
+41484 825655bfdf2064500eaf062f7ef25adfd1964b90 legacy-trunk
+41485 044542d705c2caeeda9fb5774fb415e4d31b7320 legacy-trunk
+41486 fe4c627b20965e9059643ecf9b97178f269035ae legacy-trunk
+41487 e4a5a84e5ebb13973dd350fb01ef283801bf45a8 release24-maint
+41488 ce9ba01eb7ed5ffd13be21a357674ec8daf6d702 legacy-trunk
+41489 d72db82a70cd7adecc6b503451cd6049be366849 legacy-trunk
+41490 df5928558a57b40fecd691b86faf8fa28336ad21 release24-maint
+41491 e9be9e6188f4d4e326d7c14eab4e72e0e737575d legacy-trunk
+41492 2b0cf50e77ec98a154e75f8f97cc084753bb7d11 legacy-trunk
+41493 9fd0cd362affc7092fd6d14e2c1d8e77dd13a12f legacy-trunk
+41494 800f48a14a8a38112fa11038673cd91c154fced9 legacy-trunk
+41495 a6bf7caed13570564e2c6e5eefc7cc6f08a04283 legacy-trunk
+41496 1dfd5d62d764edec5c72b26f7f1e53bb0b85ee9c legacy-trunk
+41497 f937387f4df121f8f3d1f90e8bc0708e66895b8a legacy-trunk
+41498 4d1d277178a57ad3c5372b5dffcc0c6b28092a80 legacy-trunk
+41499 4e5e16a3be0d3c3885d92795ded9c2c65e35ca72 legacy-trunk
+41500 11a1bc352917a3edf1aae2ca52d01673c521c823 legacy-trunk
+41501 8feaed07fccd714526bba893035cebc6777c2d5e release24-maint
+41502 cf15714c9c8aa353f6d9237437bdfdcd9f74c85f legacy-trunk
+41503 68b398a85a3874bd42e6e8c80dc3165c6e40bc0d legacy-trunk
+41504 12f222b617b89f6ce10332ecf0a59a53e3611670 legacy-trunk
+41505 3fd97de0a79083e48811eb57d2a163bf8701a51f legacy-trunk
+41506 f13fc0c9a6b3a56846bb5a2e0d192e234ba56af7 release24-maint
+41507 51f4ee4f97ea1abf972f83e9f40386db2bb28f24 legacy-trunk
+41508 1faa306993c05af5188d5821f18eff66ff4ce32d release24-maint
+41509 9fc6bf655f9cb0294b7d6cac05f88b5fe74c5b81 legacy-trunk
+41510 d4a6d2591cf58a118f05a00f11c2c4e7e1728aca release24-maint
+41511 e11323189c84912e0ee26e91331c9cd532936bbf legacy-trunk
+41512 74e561a7e82cad7ae38d85c327e76dcfd69d67e0 legacy-trunk
+41513 c94268277de9383685be863cce018a2a76dd7117 release24-maint
+41514 1f7745292e50ed84d38e27b6d50798c22e0cb56d legacy-trunk
+41515 f2605f5a6d46f83a79dee09fbb2a8dd06c9b00a0 release24-maint
+41517 c2bba5f46ab6eae177a6e49856cf2125e8a62f86 legacy-trunk
+41518 fab37136dd6da53a8a09a2990a9151e3051612d5 release24-maint
+41519 9f6852ff3d191e48a4c1011dc4e2b741ef27336c legacy-trunk
+41520 1e1c3f55328a08614047e2b701218bc15ab0db29 release24-maint
+41521 72d5c60fa45d9edc395bd9b7d81a80282c4092c6 legacy-trunk
+41522 9e630cc1d3090b9ec20e5fd77b0eba0a29403d7a release24-maint
+41523 cf2b4c8ad1ad4e46f6f2e6fa5c678af6a8ae217d legacy-trunk
+41524 b7c6c461a808180b0bbfb7141235092060c17975 legacy-trunk
+41525 e0ddea881f4abf71c4eca4e813370b209bf9b0bb release24-maint
+41526 1fdebbd60d7ddda0ee0ca3c7cf3ab3d49ee85c0b legacy-trunk
+41527 7c8800b81c50c9f659acd741a88feaad48b4791c legacy-trunk
+41528 2150af84a185e908d5ec58fa4a5bb57cdc4ced56 release24-maint
+41529 e6d31cbf2ed38c5c1c29c6f5502b429b3e00a910 legacy-trunk
+41530 bb80b8f393eff1d2e19ddc19e40f5f5200107dbc legacy-trunk
+41531 79374eb6db516cca9a84bdf96b47a1785888fd17 legacy-trunk
+41532 cb1ff2a85e3ddd22815864992b1e7179f17f4c99 legacy-trunk
+41533 033bb4db5ae8c1a624b8b1e381d1b6baedb36d11 legacy-trunk
+41534 6d6c7cd452989e5818a0ba0ebc7a7a3061dff754 legacy-trunk
+41535 5c8dc5d218d8d70f2f03c898037609d113fc794c legacy-trunk
+41536 b46dc6d1098675431da0afd12cce98075e22f8d6 legacy-trunk
+41537 e80a1af67623f0f5729c1cdac3a71fa7a06eefc9 legacy-trunk
+41538 b2eb1589c22b5137ee131dfa2807f7fd522a96ca legacy-trunk
+41539 4572fb4dfbb3f0fb6ad4573296d78cb658799ee7 legacy-trunk
+41540 ef608b58bfd8ad5c13d95ecaeaa52d5970fe3797 legacy-trunk
+41541 f8056328f01a163dcd0e53766d2acad60bf9813e legacy-trunk
+41542 b9c682ed910cdc62b37694ce0740e77247421e9c release24-maint
+41543 90797233208efe0fa1658f570857c65706939ca5 legacy-trunk
+41544 48353cf513403a1dc6126b345f3cae7f0f5782bd release24-maint
+41545 d7f63ede495e85e2551eb71ad5943c224be056b1 legacy-trunk
+41546 d7f52fc422458a16597abdd2ade19c788c0b3f72 release24-maint
+41547 d9d8b2e2e60adf06ee08c38e20c715e66b884390 release24-maint
+41548 75a79cc4cf7b6906c5203bbbee8e81449ea21c8f legacy-trunk
+41549 9fc7dfe86f9663605be8f650ffff3143d90c993f release24-maint
+41551 1d8effde82f1b43ef5c8e596157df624969b6b25 legacy-trunk
+41552 fca7337710fd7b3417e474367ecf850bed55dba9 legacy-trunk
+41553 658444baeba37efc8e495af7b1a2314dd5c15bb3 legacy-trunk
+41554 72555a967d6a85cb37cc1f13f1b2b169c3555ba8 legacy-trunk
+41555 73ebdc62bf8f0d1c913b164f310a130e6fbe07f0 legacy-trunk
+41556 4d06162ad209c82a5dbce46bb4e15af91fd4e7fe release24-maint
+41559 d172cba964b781ba3e7eb460e8f79ee855539910 legacy-trunk
+41560 9d9e4ee4da89fefc4a670b93400ad07436bfa7d1 legacy-trunk
+41561 9c4765e9dc927236525535d5da6db0e24ea6fb97 legacy-trunk
+41562 f997213836bb290d61d4d1f9a38f7bfddc37c77b legacy-trunk
+41563 a1b6e6784ca580e5a304a56316d5ce28cda52e44 legacy-trunk
+41564 15cc6016795e03466ce815b401d3685ba376f400 legacy-trunk
+41565 74e9fe068c4dd21843f4cf15e1c3dc6a4950790c release24-maint
+41566 4eaa72ba19a2e727bd30b52d49d70c3829e10af5 release24-maint
+41567 a17ccfc372e99a98404feb3433501e0a871e542c ast-objects
+41568 e675fd295b4b9e265131c44ab393fc72808f513f ast-objects
+41569 ccd8a0d28950966d853f5862a64e675bfed69423 ast-objects
+41570 5b0f5d9763258f9af87fd167952f1db9bb6c2989 legacy-trunk
+41571 a5d8f05baf98cf2c50d8ff5736f3a74e974e50cb ast-objects
+41574 96a4e806425e41855e75cf5332ccc4abe1a50753 legacy-trunk
+41575 46501490252db7aaa31dc8ca798c981918740032 ast-objects
+41576 eb66eae9c2c8c34204201f3cb3a53bdbfb2c3c1d ast-objects
+41577 8507d5825354af795bb5b5fe6a04691b6838d354 ast-objects
+41578 9c0490997e66200ce38cfe9007409d864ad28c88 ast-objects
+41579 abfeab73c8f19ccef72e8440a51de7727704be02 legacy-trunk
+41580 80563dc134875f0faafc896554e9de1ce5a49428 release24-maint
+41581 6f4610f692e0eab855bbe83e2da43a73fc4003a1 ast-objects
+41583 7aaa09f1a04724331c3f5f55a4424b3b1e378211 ast-objects
+41584 c593f33643ddf50bed50cb1ee6e07853bb459fc2 ast-objects
+41585 81c944c3d13a058f5ff5c7ecec71e640202f98e9 legacy-trunk
+41586 191b59909ded8d4038c37a631ae8ee8d068af438 legacy-trunk
+41587 e72bc5dafe16ebeee9afb55e13d5e7ebc008900d legacy-trunk
+41588 5d96a536bbf3e65d23da802f3996754ab6555d87 legacy-trunk
+41589 ad0f0385c6f398fc4daeb9a20af04fe34118536a legacy-trunk
+41590 cf31b2c8e85460f0d4849ded0d07448ec8f8ad49 legacy-trunk
+41591 03ae0b8eb6cbfb4b1cbaef54842084f7a2ad8878 legacy-trunk
+41592 e26dc3348909bf7005275486e69d7cb7867c37a5 legacy-trunk
+41593 16e03cfb9a022ae1d393b6eb7ca393fea0ecf8a9 ast-objects
+41594 75d536b247eaa9c18bba502f235e3520ad913364 legacy-trunk
+41595 a087e7bf50f1de3784401aed04601a425da9bdad ast-objects
+41596 509956a54f376176186d63763b7867fa0fb10f06 ast-objects
+41597 3a4214bfb6e44b005ee12bd815ff57516ff1ca4e legacy-trunk
+41598 52251224cb995e1bd7896ed98085864009f132e6 ast-arena
+41599 5ba920eef0160438139057ac7966d0443b4024cd legacy-trunk
+41601 8eda1a58a490370a26f2249fede4a5722519fd2d legacy-trunk
+41602 f020a7ade6b5d5eec7db483cfe450cdd42b61e0a legacy-trunk
+41603 1e1287b6f6526f59cb3f1d0940a7921633167346 legacy-trunk
+41604 cb3ae7cea10666249c3f2a031ef4fbb2a3edc0d7 ast-arena
+41605 5d031bd22307bcb4586caca95e07f2fa175c35f0 ast-arena
+41606 3c21d5bd15be63ff5fdd3d48df63e86590241c6a ast-arena
+41607 c89707daa011449c4159a3b5fcea2c50f226c081 legacy-trunk
+41608 01bd146dc5207f7d7c17be22c34c7acbebbc6344 ast-objects
+41609 c8009bd6114fa65b086bec8d18c860f971c61c4a ast-arena
+41610 ee55430e5cfe778dcca66736c07c527f141c5008 ast-arena
+41611 551d58b3d0cd3c76c530fafdd586386303566e9a ast-arena
+41612 aa5d8e4a00a8a48638645d85440a8c8e65727a1d ast-arena
+41613 c1e678e7bb12839bba38f1e874ee21ce43f5b4b8 ast-arena
+41614 a29dc58a99f3894ea49e3de395bc42b4eeb5fe6b ast-arena
+41618 11ee982f8c8d0e460f4f1a4d0daffaccaf9fda33 legacy-trunk
+41619 d47abf9758c9feae7597c6fc4b82ee9a9eb62ef0 ast-arena
+41620 c6298125039e4dfb1387bb0911eab097f2ea9d1b ast-objects
+41621 c0c12aa757e709f09c76bd3176230777f2a5e2fd legacy-trunk
+41622 abe1b332eaa00f70740932c1f69860c6a637a9c4 ast-objects
+41623 c236eb6d99345275f9d4fdaeaf376e0aa9ddcb63 ast-arena
+41624 1e69e63ae3a08b49f98eb75f013a938ad9abd5fc ast-arena
+41625 ab8ab9be6f4b47ca0bb1ae69a9810c43b4ae98e2 ast-objects
+41626 a29c89b4e8c63095c72c14e25ee81939990aed37 legacy-trunk
+41627 8ad319f3a935ec5d4afa0f1c5e28f9ce86802d60 ast-arena
+41628 51e3a838aebe7401dc8628c82166c002d9cf202e ast-arena
+41629 ab431b324a4bd43997322faf9ad3b563817522f8 legacy-trunk
+41631 b77edcee888ca3451a705bbf341d098d2d3f05fb legacy-trunk
+41632 dbcc8912a24dec44d6eca3d09029d7c38caa6d71 legacy-trunk
+41636 649c34180a0f50e005504bdf94e042fc8ac7016a legacy-trunk
+41637 96d1fa36964d4e11a0273b49e4f06dc12fb957c4 legacy-trunk
+41638 9541369b0dcaf048f1bd986a28c96ffeee37f808 legacy-trunk
+41641 cc3261597136c6256f91ca7630ddc6c932907f3d legacy-trunk
+41642 6321669f2f4d10c6bce5be35e91c17d992355160 legacy-trunk
+41643 0eb6ef92c56e25796b3b29cdcc19048d13ceb3b9 legacy-trunk
+41644 52f1d57f237dbbdc5d83744df6d13f464bda6131 legacy-trunk
+41646 e4b621e1eda662205650ddc1146f5aa5154552cd legacy-trunk
+41647 32e7fe9c23b91cb2f51188fb82851b87aa6b7266 release24-maint
+41647 f6e734b1f261c546d80e9849038054bf097ff84e legacy-trunk
+41651 6f502d35fc775be67b831d4db3e5a59941a10861 legacy-trunk
+41652 102140c3a3614db3e9325ab021245714e1ddd16f legacy-trunk
+41655 a5ad76a78f4b29a8aa7f747ddb6f16a82dce38fd legacy-trunk
+41657 522e0073d9c9e8bb7517bfc69c2eb3bc3bd9f245 legacy-trunk
+41658 f94418715e5531299f3ab7ccdc215c0a2c30cb37 legacy-trunk
+41659 07fdb4d2b8f62337d39364a5693596f4f1ad104f legacy-trunk
+41660 07ce938857e1ba2f185c58d3a2dea9761e1277c0 legacy-trunk
+41661 16470b722f209c012543e8a900ed9bd714664d90 legacy-trunk
+41662 40367874f8616ac70457a833f1debdbd2c3b94f2 legacy-trunk
+41663 377df39bcda1f26fd33f7bf777b3bc243316040b legacy-trunk
+41664 ed347c436d58966cbfd84febc140c53093acefbc legacy-trunk
+41665 c253e993df8ace82161eb2dd7329ecda07c76d6a legacy-trunk
+41666 68817315b74ca969a4c76e530d677b182c5e6030 legacy-trunk
+41667 bfd6a6fc70eaf53d6c10be0cb412ed4ba4abfbf6 legacy-trunk
+41668 cf88636cdf4be99d6bee9ceb254e9f28d33c34da legacy-trunk
+41669 a14a7f614a96da4bb9bf46045928e9a078afb8a8 legacy-trunk
+41671 bec9fac9f77c730341dab6788ddbdd7ef86a8f96 legacy-trunk
+41672 27df2fbe270664ca2285fdd72ae3001d6d29955e legacy-trunk
+41674 db1c0aabc405a02ea55adcbeac66ac17ac949af4 legacy-trunk
+41677 e01d8524b6f642cbb390941ad473fd580bc3baeb legacy-trunk
+41682 cd8b5b31e02aa4bb8ac97fcf9677ac6d147572a0 legacy-trunk
+41683 9301a7c0312ac03b769539b02933e79332c33991 legacy-trunk
+41684 35fe90325f5b7a22cfa4b124236ac0059c690f56 legacy-trunk
+41687 f0a5330f2b3e11b1f570cfe4abc4d4353f850964 legacy-trunk
+41688 635e0d909645ef65a3132a380caf339f7a959f48 legacy-trunk
+41691 6d7d1a996a023a8da35efd99aa616c4abae1463c legacy-trunk
+41695 249ffe13caf8a54c6fd6bc00dbc93c8494426f3d legacy-trunk
+41696 fdf0ac36eb74612fa468b31e58497fc6d438fb58 legacy-trunk
+41700 4bfcd5dcd0bfa250a59903522b36d2b51fc08c74 legacy-trunk
+41702 7548d7656d89864b3ae0b3f1dfce9adfbf0a36f2 legacy-trunk
+41703 de69a524f4edbc6c3b125e988784451c51a8467d legacy-trunk
+41704 64c6ab5671e7d7729698b0918b17e64c481523c2 release24-maint
+41705 de0c2fea65c21bc9acbed38d8a001a7e4050a268 legacy-trunk
+41706 c691fd63eb3c095c6ed0bb8968946af358d9d3f9 release24-maint
+41707 18d27c4447d1136cdc3b13e006ea303df66b65fb legacy-trunk
+41708 c11513693cb9703ce69a614211f1329e99fd1af2 legacy-trunk
+41710 98653d9f9cc39c3e593b414bbecbb8da143c4c83 legacy-trunk
+41711 652bd5e5b7782f86c07c3a1521366ea109fe0744 release24-maint
+41712 18f09ac619e892f2e9d5b0c835058e2297edb41e legacy-trunk
+41713 a55831d32915a05f61a1cf9edac3a8a916890757 release24-maint
+41714 4db17a00bdcd35307f36872011d5bd35c63c4ed3 legacy-trunk
+41715 dee253a3116c456f9b86cd7781e25dd3514b5556 release24-maint
+41722 4ec60111090613761e990feb6e3dcd3c8b7165f8 legacy-trunk
+41723 6586cd9920e7e3ff6b1ce049a45943d01d4f887c legacy-trunk
+41724 9b897fb7ac6a2216d6898cec08dd3b5106790342 legacy-trunk
+41725 f893d403a98c1f819c0216a63f529393a1c5ffb0 legacy-trunk
+41726 fa08c697a2758db3fecfd0d8f89220bb5d1a7513 legacy-trunk
+41727 ade678687d3b32805c42699fa8cfa3b220698717 legacy-trunk
+41728 321efd037859ccce83de663d9c367c2ffbdd2f2e release24-maint
+41728 f1ae11457d34bc3b0c67f7cc0343e89ecd5296c1 legacy-trunk
+41729 877b5d4ca368172134fa70b2144f4b0a7e9ab379 legacy-trunk
+41730 731032d10159fbc0d5242453d682779e1467f579 ssize_t
+41731 27919cf84dc3ddf0cdb30ec1134cd6c7c8a922c2 ssize_t
+41732 cec9c2c14e28d44f40606527ce8112a4c678caa0 legacy-trunk
+41733 9ec5b165fea0814a27baa8b965f1529109d11a3f release24-maint
+41734 796310cbffeb2324e946ff59e2ee2e5126260623 legacy-trunk
+41735 4c15a8e91ae74fec5bd0ac530dc66ff31f1fa935 release24-maint
+41736 81d5995951fd410ca86dc3f74d50df16365d0df5 legacy-trunk
+41737 980561958f1d3933fd621351f9add3ed299c0c46 release24-maint
+41738 fb6e64eb86c038f302ce28f3d9f6f72c9789116a legacy-trunk
+41739 ea083efdc96c73a992043efec7dce27771e3d1dc legacy-trunk
+41740 719ba02d2e2ca63d15122b446dc3f293ffed4c63 legacy-trunk
+41741 7bfb097f95976f4ebc76a3795ce3007525df1898 legacy-trunk
+41742 3d1baf717c5af5d9ef89186f5037594e726b9a0f legacy-trunk
+41743 d0214bb1fd512b67f1ce4ebb0ce23fc1e1196f29 legacy-trunk
+41744 9697eeeaf246632ec4093a776a86a70061279a8e legacy-trunk
+41745 45f7b7383a4e20a9710f52d9cd96e583726f6576 legacy-trunk
+41746 de16a85c3b4cf38e2e56a78836fc7571bdd21f29 legacy-trunk
+41748 15b58e45f1a1316acc15b74d17e3800e9df7f0e5 legacy-trunk
+41749 da0bab5dd74089f727b86ffc72923d1ee72f73dc legacy-trunk
+41750 f67c4ab304ecea81aa8a43943af5a32673080957 legacy-trunk
+41751 aa7d7df853d57059066d3d5e5a9fa713d3a2233c legacy-trunk
+41752 3b90258fec9f6b2e6b3c983940bca01484d6d757 legacy-trunk
+41753 1ff4790b7605018c641fccc459692147a53d0152 legacy-trunk
+41754 8ebe34eb3eb74802a49f2d7710f7e4d644a64d41 legacy-trunk
+41755 10440bcfa061719c7b7e9eff75d21e747019ee2e legacy-trunk
+41756 19d96c2d7df54e29f0ef584313aeb1bde9a11f50 legacy-trunk
+41757 3f358afbb3d3f37af20323c6a70784c13b7e02c8 legacy-trunk
+41758 4cbf2a010d945b6bcd955fa05187c2579970eb00 ast-objects
+41759 e3eca65ae144f5dc840b846546dd4de65991069a legacy-trunk
+41760 301fb0a9937144ec97b323a5b8f453eb8b5be755 legacy-trunk
+41762 fa69f0fa36fef9b2e9c6a6217ce4d1334c4b3d11 legacy-trunk
+41763 e14f479647481e4fd9c51836162f298c73276a9d legacy-trunk
+41764 49a0493f245e3fb84e55df19e19a2e90733fbda0 legacy-trunk
+41765 a9d4fb8607d29fe9f0008d47eedcdcc74e974a38 legacy-trunk
+41766 ec3452840b966e6d8de2d3cfbfa4bc70f70ac20a ssize_t
+41767 4aa01879a8f5a9bce8339151392f5721d5b7c47f legacy-trunk
+41768 8cb686dd6e6458ff49e6f83ee5487b9c599f13db legacy-trunk
+41769 7c4d5b38c55e662a64108864a34b9e4e6b099775 legacy-trunk
+41770 b70b3e5b3cd1c96b7299bbb4af06a2c2d34cbe99 legacy-trunk
+41771 b8b3782b2dc075be27946ba5bd0674dfc738796a legacy-trunk
+41772 e90e7d9e989109a10197902cb2385d7f0714ea22 legacy-trunk
+41773 35596307e786021b10b4c2ffa17b495a40acde02 ssize_t
+41774 963d749c977640c19ec4e72fa89a1276d45bb021 ssize_t
+41775 5a87644a39000f55c169866b2e7e6434e250b1f4 ssize_t
+41778 8dd35dd6b0e89cce592c711e7b291212cbead883 ssize_t
+41779 3ba230c77d40003103c9e13dc0586c354a251a52 ssize_t
+41781 16e3eeb85206fda2f0bd1babb777a7fa6b382ef0 ssize_t
+41782 4d1f3ec4ead5968a72e5cd94e6c5159ed77ea9f4 ssize_t
+41783 d6ea1530da3004355b637e3a8838f3176add29fb ssize_t
+41784 42acf33aa3c8a28f0e4803c0d316ea58d7e22219 ssize_t
+41785 08e80a2bf40cf855d3f3f7e9fa50dbb01111c9ae legacy-trunk
+41786 988fdf0252b794d706cd5a022073ebc290971dce ssize_t
+41787 61706e581ef9ca449914c73b9f29465969f9c369 legacy-trunk
+41788 f2fa40e883630b63ece3e495a54ab661e652cde4 release24-maint
+41789 913a80f458e687479a6b88d529c7768dc2d3f39b legacy-trunk
+41790 c80897bb5053ceed878f31ab63e340e7c023c7b9 release24-maint
+41791 2a5e6009a4452703215c845df104c729150256ae legacy-trunk
+41792 50fa58a24e60f4170e779596bb55e96d80c1fed4 release24-maint
+41793 0cf3248e27e658a6ea48129c0a24654b46de2581 legacy-trunk
+41794 3ed5a4acbe7cb3b9cbffa7f2adebfbc914ec121d legacy-trunk
+41795 a93be519f9ec40724c7a0bb1814c097816d23ae0 legacy-trunk
+41796 7ecc40d2058641fc7cb331fbe6c8e35861937191 legacy-trunk
+41797 74bedfd0bd6b2ffca1eaa3293a14adafcdf9c6bf legacy-trunk
+41798 5ce47103f847949e359d21a5016666fc49701de1 legacy-trunk
+41799 3a39431a54a53ab7633cb8a92291ad72099b2058 legacy-trunk
+41800 34a5154e611cc1069707b8a788095595378d6f51 release24-maint
+41801 f011253d3c470d3391e0ec703078249efb0997d4 legacy-trunk
+41802 630d01fecfec641e4fcac04a2c7883a8d2b6bfdd legacy-trunk
+41803 56ddf3aa12b11ccbaa3cee9d915dc312bacc30e4 legacy-trunk
+41804 98e2595d737f01c3399b2a26de702878c2c203e5 legacy-trunk
+41805 e9a10f74cf88ac7e37c28e0978a4f1d14d4acde7 legacy-trunk
+41806 03dbec0d95046e1a1f9136ca2c587dfa3f49d86b legacy-trunk
+41807 76741e73bb64978c967a80fc28ac002a3c243dab legacy-trunk
+41808 7d6ab9f39996ccfa2970ab0faf841a5e39303f53 legacy-trunk
+41809 044d35ca34247b6e7921d8e2adb7d8a375e3dfff legacy-trunk
+41810 6cb5739b71ce0b84cce171913ffc737bc7574115 legacy-trunk
+41811 43bc7ca2d9dfb879bbe034ac8667f967ad74853f legacy-trunk
+41812 686306a67e9b24625faf50fcc98216e0cc1ccb33 legacy-trunk
+41813 cadc778aec796f235447c45557d1fcf2f5d89168 legacy-trunk
+41814 6f0638e7bd23688a486c05e9300e0f809d1599fc legacy-trunk
+41816 536f24e16af246802197baeef3b134685871c9ae legacy-trunk
+41817 16277718ceb9ae6631f297557f5c8199bbdc5aad release24-maint
+41818 23eb8677bdad138ff6ded7b389618c3733e8998f legacy-trunk
+41819 76d51197261627788ad44c63feb1b642492c1852 release24-maint
+41820 e4316da19cfc1d94ae8b6fd552c655b79189aaee legacy-trunk
+41821 2143371bb91fc237e3f9d5c97c4a53902d620b50 release24-maint
+41822 156df77f992ebefdf6e88e1ede4ad12ec036e3da legacy-trunk
+41823 59a89b588c3096a36be690f4f18bdbc73d5b46a9 release24-maint
+41824 e06df5e13db9db71737ecd793340a61d6b9cdf3c legacy-trunk
+41825 730f84c2fddb5b11649d879aaa40b6a6ec2addf4 release24-maint
+41826 49d63f377fe72d7195f1922bbced3aea9d9c8b93 legacy-trunk
+41827 14f002cd0371b4a87e2faf987303489f14862d72 legacy-trunk
+41828 c886cb16a15646568d22b6bad694df12bf8d9488 release24-maint
+41829 f39bdbf4b0c1b7fb4a998fa7db9eebbc5abf35ad legacy-trunk
+41830 a6ae102a6e119ef317c64d77cf02f62aae6a7478 release24-maint
+41831 b540b6076fd9915ed8d8ae3e625084b5355b4edb release24-maint
+41832 7cc215f0c09b3bf1ec27d416ba02d3ab64e0bdc1 legacy-trunk
+41833 233975da247e22ae68c0f7d93f6443e183e9ca18 release24-maint
+41834 8e438bf76cbbf25062a554ac8579dc696686d614 legacy-trunk
+41835 101b61a9eed2e518c8c3a5f09b3ac860d33aef68 release24-maint
+41836 82a52a464aa256cbab77e65df7b4939518d4b247 legacy-trunk
+41837 74d16eb2cabdd2ea43d3b1711111e640e4b65de9 release24-maint
+41838 22dbf5818b0b294e41f47459e9007cd10c16febc legacy-trunk
+41839 850f7d1e4ca27645f3095b68a3e65bc158475339 release24-maint
+41840 aa707041505d899c334287711acc9bbf5d410c7f legacy-trunk
+41841 e44a833eca4335d85122a2667f3cad7c2c66b097 legacy-trunk
+41842 2eb78f5d14500e4652f3bcd5738c6cf3e44d4cba legacy-trunk
+41843 73da591f9bdbdd5ce978072615aaa7a1df7b0142 legacy-trunk
+41844 f9281283b109a49bd427bf67721bdbd09aa5c873 legacy-trunk
+41845 042eb3d1ce3f338ae61e35f3c5ebf74da50a52ef legacy-trunk
+41846 963a98d8fe2e4d2cff27d68725434e72413d7ed1 legacy-trunk
+41847 fe9bd21f27f2289d50ee26143717455d48ca5387 legacy-trunk
+41848 c71ca1cd363b75f348ea764bff4b73a41b9d5a6e legacy-trunk
+41849 96eb2a5cfbef623eefd0b611adf38715c839796b legacy-trunk
+41850 3451b109a24c563e91ac98084aec82f523708650 ssize_t
+41851 298fc3269310be9d7a1797e95d6fa55b25f2c75b ssize_t
+41852 26107c5d057c1ff8c891e745486a0378f708b58b legacy-trunk
+41853 f4507774d4e41ffe4ee9540a1024e4020b813315 release24-maint
+41854 d993a3ee891ed82a41c537d6ff4808bbfad6698f legacy-trunk
+41855 cfd1e1f4fdddb1276975fb8fd29fd622eb275e9a release24-maint
+41858 1e595b6c924e1708f5bb2cf0bfc9f26b191bfe7f legacy-trunk
+41859 bb51d6c6a3e03a393ec8366e046dc033a0d55b09 legacy-trunk
+41860 50886d42b444e40d7e9363c1ab62a24029129072 legacy-trunk
+41861 147c35f435a0b5ad0817208c6faed66557d93f1a release24-maint
+41862 6f25029de9db4368471952996f98b71db4f6c22b legacy-trunk
+41863 834dd664aefca9fe3532f091502dcb543f465fb5 release24-maint
+41864 8a2ab5f51932fea3a122a6e3892daa9667a53402 legacy-trunk
+41865 652429c4f2a492f73ce5a89a40481fa8fc782e60 legacy-trunk
+41866 266bbdf91bb53e72b22fc5de97efd36f908c6da0 legacy-trunk
+41867 00df05fa81614ae60921df431390b2bb2a7a8cda release24-maint
+41868 09ed6c9bdbd9a295c5c2c8e0093ac076ab8e1db8 ssize_t
+41869 c18504cef2ba65ac3251352139f4391f4b731f0e ssize_t
+41870 c3adc77eb2891e204f2bced7ef3140fde2ff247f ssize_t
+41871 f5443bdf9b0df8c193faa76acff8b6546a10faf2 ssize_t
+41872 12484b659fa867a844833a26cec268f429293b91 ssize_t
+41873 46ff5c586d8639710eb33d1a32b629a6983607f5 ssize_t
+41874 a227ef26a18dbd42d892b70465d48cea8d02c9ef ssize_t
+41875 50a47521b40f430e5ebea47b8c983c220a5176f2 ssize_t
+41876 c88a830d831c1bf37260f451050a97ec6d8ae3ab ssize_t
+41877 292435a732e8c249f91e9cbfb3a30b4ad230c859 legacy-trunk
+41878 ade46371f04b05c9a0f662039631a79a0458ddd6 legacy-trunk
+41879 6dd62542b6e5dbf8e1f0de34c1a3f839f50ec5be ssize_t
+41880 85b2d804ac0abc789947996cfc543f9935ddc1d9 legacy-trunk
+41881 b9086544382e2208235f749ce171e8e28442f729 legacy-trunk
+41882 f321be34b85d5f55847ef3b50997728a9cd83bbe release24-maint
+41883 03a0b18a75bf5ddc804df29ef80435b94351a554 legacy-trunk
+41884 a811eba30fa4df3afb770281ed891de88f176afd legacy-trunk
+41885 9b9ced4d7921f6ca135e4240dd38d1983fd182b8 legacy-trunk
+41886 3f62d31d5985ab28d16f0160fa0ba8813767c3c5 legacy-trunk
+41887 431d6e87b9fe0bf4ba4ced9ab366ce1ec0669746 legacy-trunk
+41888 b2648ca231e802532d40260ae535b93d4bbc42ce legacy-trunk
+41889 7970e02fc847b85160b7e6fef9f96fd3936be15d legacy-trunk
+41890 c82975e91e9985c9fdf513af682b4432ea95c466 legacy-trunk
+41891 bf7eef5072b691693b361c2dfb76932240f25b39 release24-maint
+41894 81fa47d2d477bd9bf8e6948159a59851877a4fe6 legacy-trunk
+41895 ee984fe981b4efba9e3b291b05d2a6e6213d7978 legacy-trunk
+41896 f80ee142727a862d2dea9b575cddcc5cfd39e5dc legacy-trunk
+41897 dee92ecb8a113cf28b5259640bcf34152d8d4763 legacy-trunk
+41898 aa45644926603b04c5152e77e6f246678d71779c legacy-trunk
+41899 79e70fa8c212fec7020ea2eca3125e1076b173f8 ssize_t
+41900 ceefcace6f2499db50143662fde86fb0bc523aca ssize_t
+41902 6c8145fe495edc9058c8c147eea1196c03aad5ea ssize_t
+41903 ef2d7b9fde7cf9e4d95ac1a20fec0aa28fa9ce4b ssize_t
+41904 691ee524f02754a9bdd278b159eef1532c88a49c ssize_t
+41905 7654da36fe9cca869e03d1a16053063fe3367a8f ssize_t
+41906 f06133bcc05e667b0535c909177d16a87524472b ssize_t
+41907 52a74a3236820677ce112759f318465a718f099c legacy-trunk
+41910 6149483f7a3d5543c8c5d77301de7e56648f9237 legacy-trunk
+41912 ecfed1f7478ccdb87921242e97928aad91552472 release24-maint
+41913 9208a79f5683cdbb4958c927599c6a5731d42af9 legacy-trunk
+41915 03608d66e59f0c544001bfd8e7eb8f5cebc3dae2 legacy-trunk
+41916 0b10e855dadf64820e36a1eb6ede1aa20c6e3fd7 release24-maint
+41917 ea6cd1be9837b5289534bc517c61d010d5c8886a legacy-trunk
+41918 26be8b1d1853017dc485d9bf35393f62acfe44e7 release24-maint
+41919 92ef56c97cdf4210ed63e6c4ae0102ab7fed3d6a legacy-trunk
+41920 b3482164a10038145b18e7ff0f1bc5893ee8e1ae legacy-trunk
+41921 44f0760e24a169edab83f445e2b79fbcf70adf47 release24-maint
+41922 38b0fe51b0b4f995e5c9d5fd4e80bbcc70de2948 release24-maint
+41923 44cfca6136c6382a6e9abba930b1cc12099b1073 legacy-trunk
+41924 032924e75c24ba00dbf161bf8bc6b6699d1ab3eb legacy-trunk
+41925 01cbed5e8731070b17f3488f5d50c5aa7c029a8d legacy-trunk
+41926 8791e8c448b31e30074c317782789300c1b50b47 release24-maint
+41929 825a041813fbee078a3bff3f113def3a4eae9274 legacy-trunk
+41930 21531e392116a061fea3185589d456fce3be1170 legacy-trunk
+41931 03a5741cfea9f60abef3cce7fbab3fbae72b9826 legacy-trunk
+41932 83364763c7b2c6a83921125539c599b75380c341 legacy-trunk
+41933 6d743e5baf147ae4b51c42b92bf24609bff241cf legacy-trunk
+41934 cee05980f1fd1c523f34237165ff98842a23c197 legacy-trunk
+41935 9b8885c9e551c39ca438980a7243f0f6d1843603 legacy-trunk
+41936 c9da08d482c36affa99165b2ce5457f47be8660b legacy-trunk
+41937 241078ee6e87ae863e3eb114fde15f337848c459 release24-maint
+41938 65df25674d1aef72d2171672326d84402b9206a4 release24-maint
+41939 77b4aaad6903ebb8fde1ce94b431ff342f5331b2 legacy-trunk
+41940 f723e19fa3b71a20b21fde7402f9eb588bbdaff0 legacy-trunk
+41943 b139c999665d99792689fc3b2ccece04a42452d5 ssize_t
+41944 122058dfba768a93d92fdba19a859c5987541d3f release24-maint
+41945 6e17968d4de92b1632a83ff8625f382f2442d2d7 legacy-trunk
+41946 a1b1e451d82e85e794facf92e72ad1bf33f769f7 legacy-trunk
+41947 4c8a74a2022783483c8c2b738a4c9bcb20e304cb legacy-trunk
+41948 cf69e319121828b4a752abd81ffb9bc325c6ab01 legacy-trunk
+41949 1685dcd2f92993cf51e5e33c9efc0243ff73ae6d legacy-trunk
+41950 56ad9f275bec193d2963c0ba2256a0a583267680 legacy-trunk
+41951 bb6fa4a31f152976039e3b67e1a387ac086db61e legacy-trunk
+41952 026ae1b8a7e3ba05e14cab10e0f1ff6bca13bdb9 legacy-trunk
+41953 e7c96c1d144ba74285438e13761ce5ee80d2a6f4 legacy-trunk
+41954 e8dec78cfa2e3e6f4f328cf12c4f774ddc4ef17a legacy-trunk
+41955 ded4a497eb76fb87bdec82ec92b99a51d8fc54b0 legacy-trunk
+41956 d3f4c467e439a257853ee5e289829da0923e3182 legacy-trunk
+41957 a77e5b046a50876338e8c177ee7fd0aa32fd59e3 legacy-trunk
+41958 b9dd481b3972dd64013b5cb6cc9eeac1ce849695 legacy-trunk
+41959 e94ee59a2d461d9504ac7fe911c3eeb92737ce9a legacy-trunk
+41960 9f66bdd5a061239241c87f05f639ca82ee1c655b legacy-trunk
+41961 ecd423718a327df56d9963b8f3e8c165c75f28ee legacy-trunk
+41962 8ab78fb4d17ed4ac19e6d7e95859c1f30084be59 legacy-trunk
+41963 0f8c5546d3bf44b754f3e0fd8ad0274dd9e0fdc2 legacy-trunk
+41964 92e2468bdb4a6a40317cdebe38e57378689d4dfa legacy-trunk
+41965 00bdc08a507dec9da0c6de63a114cc4f35fe63c7 ssize_t
+41966 af7d484208e9271a4cbabe45825e663b79661e57 legacy-trunk
+41967 d2224c8d45492625493c9627a92cf8c05176d9e2 ssize_t
+41968 557e9b6ee7e11e6f7ea5ea0427bfb047b0e5474e legacy-trunk
+41969 0f51896072640ae116792b1460ffcbb3d91c7eff legacy-trunk
+41970 60a5a1aa1682b670e23e7fdd09bbd93c31ed6659 ssize_t
+41971 a9abdb14cf3b78a47a9ebc34ceb6ba1c1fbc7e52 ssize_t
+41972 a2643253ac796294b3c68d919d94e8ff6f141fc3 ssize_t
+41973 0968f062f3506988b886a4f9c1b52e4c267f1e30 legacy-trunk
+41974 e7880f4f53a40d313c7a047d504252336224a8b9 legacy-trunk
+41975 d3e68cb739fb2575fa59a4cd48b38e15a1af5217 legacy-trunk
+41976 591df54d2d30f14e061245c679854a452880eda9 release24-maint
+41977 3ba9ff79bb29b947eb97e8f9935091d853d16fe5 legacy-trunk
+41978 811d644d19176771054761a27dfae8150d716bd0 legacy-trunk
+41979 4ac9b8fcd63ea8d85312699449354e2ded7ad59a legacy-trunk
+41981 f09e6091a7629eeffb76165b0798b30e3d232314 legacy-trunk
+41982 8df194294c90dc4a11df90bb5d2ee32259585b4f legacy-trunk
+41983 d434b3c7390160f35220943d5c43ed86deace8ba release24-maint
+41984 27bdc1e27eedb7ec459bcb9e3b0434c8efd6eb9f legacy-trunk
+41985 c3b42b7bd6d9daadc4a97686febd847ecbd8064f release24-maint
+41986 3c15976ff61872b5b902bc2bd3ebedaa06a23864 legacy-trunk
+41987 6cf7d04dcc1f57e67337d1609ef7e6e5410cefbf legacy-trunk
+41988 09c21a6be60418478c7bc99dfc15c6303415b298 legacy-trunk
+41989 9f6edc874541cd29c2442e491140b9b60ea96bc3 legacy-trunk
+41990 26e78b196c17278a8609f3eea06f08232864dbec legacy-trunk
+41991 cad591d921ecb02d401dd933934762b479f0381c legacy-trunk
+41996 303dea84763904fb854ccc8b8e6f7714e1f5abd5 legacy-trunk
+41997 76a1c20e830e55c021a25d37b8fa8aa03204bcf4 release24-maint
+41998 3c030edff985a6bc999bf3f72c776aa326b73ada legacy-trunk
+41999 9df39c960bf1c680bb34f17fcfbee603be98f6be release24-maint
+42000 790f8d9e498898116802a72fe7504fbf2b01f92d legacy-trunk
+42003 41ef2910dd498b0f84e8f4cba3a81e3dd3a55898 legacy-trunk
+42004 35df6dd809110c7b4eda321fb77c87babae1b32a legacy-trunk
+42007 0d5335387ba732c84df8e59a1632c51fcf9f8874 legacy-trunk
+42008 475b645e12f5ec058c3280bf402586ad54c6e13a release24-maint
+42009 8747bf4b95422cb23cf05512151c8224df338b84 legacy-trunk
+42010 21e178b93030d1bfa2bac63c9dc0b074ac235a45 legacy-trunk
+42011 84ba299e2b5fef411b0a71fb816ed5472606cc3f legacy-trunk
+42012 d0104364f6d1c8408277184ebbdb0a32b23e950d legacy-trunk
+42019 5d816928a2245e174531ed73dac7065605ece84b legacy-trunk
+42020 e1fd7bd2895b07d48ffe3af904a0d659116e30e6 release24-maint
+42021 192e83894e898cac4036485dc06d7813dae7412c ssize_t
+42022 8b8f1a51468ad248112a65d4cff7d96504c0d3b7 ssize_t
+42023 0fe75a046c005480f24b09b5b4ad4e617eb90db5 ssize_t
+42024 4f9507be58579b42cd29670a56b1c50793b48064 ssize_t
+42025 662c63954df294b74844001668ed6d47f4d594da ssize_t
+42026 fd1b12d3abb69c39afc891c7b31811488ee6d985 legacy-trunk
+42028 5277770bc9d1ba6abb7b480a05b4449b0a157b90 legacy-trunk
+42029 ab130d5669319e8ea83e6d0c75e00f0d0ff95e76 release24-maint
+42030 5e2a58c867f72c371bfbbcb5f66b4906029bd5da legacy-trunk
+42031 da0995ca1f307e787c24f81cc09d66511fb62eae release24-maint
+42041 78a69759547ebe8013fed00e93ff6e917746d566 release24-maint
+42042 21d30f8e41ffde678cc440e22a9a1b9dba904e35 release24-maint
+42043 e609fea92d1e18a5fee1faeeb04caa941437b3fe legacy-trunk
+42044 0b231c05a7edac166d47b427c9b0da103c6e32a9 legacy-trunk
+42045 8697776bb42037c2325315847db5d7ecd25e1b27 legacy-trunk
+42046 ae44809350160e583329166532a8ee1ea7cda9c2 legacy-trunk
+42048 c128000213969931d5da14df5e7248053fd293ac legacy-trunk
+42049 c9ea5570dac7e6c1f4c0f9419fa1eb8eeb2d0eff legacy-trunk
+42052 7ca51cb70c2e24da629f99f238be02b3ad62c380 legacy-trunk
+42053 b94ee92a6d6b5eb59e84c8e49948eb3fc6ee0493 legacy-trunk
+42054 07fbd34f1f6ed131afcb46e46f2cf31738ff93a7 release24-maint
+42055 ef1d8d6ac6befb6e487ae4190f17e32635371228 legacy-trunk
+42056 ef3b43578a5ffa7714373b5f0e9a2e9cf718ed4b legacy-trunk
+42057 a21253fb08c972d0061a245b71ab1bc5a771ae64 legacy-trunk
+42058 e7033dffd60cae8349561767c30dfe323e07e0e1 legacy-trunk
+42059 c7cfea1ebb323419e29afdcb1ded75db5b2c4ecc legacy-trunk
+42060 6d2be3b76f2e28365734574dcc63afccbc1ed4e0 legacy-trunk
+42062 9eeaa33f9640633c61628bd7adf5996e50c6ccc4 legacy-trunk
+42063 b0d7d28cd7461f2f1c34d35690c128dfae03d8c9 legacy-trunk
+42064 388ebc6e3de11797331507d2292b8ab11164e13b legacy-trunk
+42065 e8fc60c4faad7e3a77e2f869faf3802f3e6e41eb release24-maint
+42066 405ab0dc9cbc3913f8849e90315251ebc0fbdea2 legacy-trunk
+42067 43b16eeff226b2eedccd4350292c6dfe1ac821a6 release24-maint
+42068 2afbaae6b88e0bacd2f027df9074af3c3e0cf4d4 legacy-trunk
+42069 2c8630b6bc359958b2a07e657f3c8c5464500d1e legacy-trunk
+42070 0294e6662749ad4c53eeaa9ff7fa04d4dda2692c release24-maint
+42072 beceb8e66b0ba04ad0d309c14bd689763e34eee6 legacy-trunk
+42073 2f7b54022b3b1ee3c6cd43d7a8a53a05492600ae legacy-trunk
+42074 4dba61e49037febc9086755eb64f2d579d602e3d legacy-trunk
+42075 20f21dc7396f23de9c7f0b10927cb7763a767639 release23-maint
+42076 3709ce37fe1c4f1ed6a1dac53f651728f3f4c98e legacy-trunk
+42077 65fe9aced002bc8a50c691dd8f99ba64586ad0c7 release24-maint
+42078 bc183b5f8bc19defe71fe3a84aa95d48c5b5ccb7 release23-maint
+42079 e3648ba918ee400805ecd3f46d63929e34194f65 legacy-trunk
+42080 2ae416aacb887757dd94e957736af6208e64f784 legacy-trunk
+42081 7bb64aceadd7c8c693cf3b194929ab25c5feb42a release24-maint
+42082 c4c93bde185c7ff4451b0281082e8d0b10bc452e release24-maint
+42083 1ef5063a0c6d954ef3fec28ef1d57afecbdd76e2 legacy-trunk
+42084 f62d7d2c50deed34f8b6e43055d4f1511ae04508 release24-maint
+42085 4966a361f93642465fbd7da2ce58b1fbebb2bf1f ssize_t
+42089 85b5a2cdbac107bff17405f4728f822a36c88f45 legacy-trunk
+42090 ae07b0e7d70a89a077c045003956aad7428a6acc legacy-trunk
+42091 c583214d4c51094c8a46d97d9c1c8415c25ed34c legacy-trunk
+42092 d79f043284bd506fca8f0c3c7fe649afbb37e101 legacy-trunk
+42093 1af7f719ed28f27775b1aac99a858d018aab2279 legacy-trunk
+42094 3ef1380fd83c2eb57792fa0ddc1f11cca2b9fa22 legacy-trunk
+42095 2e151bc820f7184098e1a7ff97394accdd72ff4b legacy-trunk
+42096 212bc23632ab5d47493cd15fda312a9b9f31eba6 legacy-trunk
+42097 2d3a1c3c93056913b2bc60ff35b222ce88dab0f8 legacy-trunk
+42098 6874f2693eb8a0eef9d68cecebe138a9916cd956 legacy-trunk
+42099 a530176185865ef9ebb04229f1f12c6100f67dd2 release24-maint
+42100 b587610e2069a4d9c4b679ae94eb4ce7541c1731 legacy-trunk
+42101 1d764638abdd803176a05c13237b54acae5aa329 release24-maint
+42102 ea6a46d8c51ec0abc94f2bfe4fa2c542cbd7fa02 legacy-trunk
+42103 98faac1df5bbedf5eb0ff5f270415419469854d4 release24-maint
+42104 070bb421a303bce200273419b0f12a824dab9b5a legacy-trunk
+42105 928de4a3be6f549a10b804c6839c6895b021c58a release24-maint
+42106 5e8af242357506341b7223d896ed3f94e46a6a74 legacy-trunk
+42107 fda912fe8b9adc4078b16d2a7fb6bae738568429 release24-maint
+42108 76aba3fa4e2f817b5e531f3397dd8dd1501139ae legacy-trunk
+42109 17f099479e6b73dcee5d672560c7e72b98782851 release24-maint
+42110 4bcf5fe54d8340aad74ce3b25cc603db2c42b9d9 legacy-trunk
+42111 9eae32bdf801b6701bc7b9f8e9d8d23035099fcc release24-maint
+42112 aa7ac9087a1c30632abfd7950208647501ab671e legacy-trunk
+42113 c2b1497310d10159bc3c53485ea70a94ca1e1353 release24-maint
+42114 aed32ce35b82dffad7e5b29ca6bb2e133a806dcc legacy-trunk
+42115 d48f4a4a306f593ef0a114dc15c360e17005e513 legacy-trunk
+42116 58251c9904e189270446e6335ea30b255da7a794 release24-maint
+42117 eb4a47b819424ccf369811cd6b322aa80a6b7d50 legacy-trunk
+42118 b0a9a8d14ab22244c0ab04a3c5308ea2bb0ff813 legacy-trunk
+42119 315f4407ab12d577e007e8a7c73c6a70bb824a56 legacy-trunk
+42120 f8fccae6a0f5dc8287f06ea77652ac4e0b2dbbb5 legacy-trunk
+42121 6e12707371a130eed42db120200e8e6f6e61285d legacy-trunk
+42122 18a2d75a3c69644f713c2559bc3e99587f5b11be release24-maint
+42123 3a92e56547485ad88dfd6b8dcb1e4ac75a904aa3 release24-maint
+42124 ba160464a8c6c19ca13398dcfe6ce9c78b05c0fc release24-maint
+42125 04a96cc88583ec3c21f90f3af4c7d1d30fb31e17 legacy-trunk
+42126 24456338026c04f2d5df8203aced524589e9f2d7 release24-maint
+42127 1e8f4673e447473bac4c4e141d9f66826cd67ab4 legacy-trunk
+42128 b05c4ca859434db761ff3cf5010c9d7ee8972d0e release24-maint
+42129 4746fab3401244ffbf4bf8cc6cbb374fd46095ab legacy-trunk
+42130 ac02f655b31e3808e2faa77b9fedc52bdaa77218 release24-maint
+42131 ca6c800ad5a02c119bb0c3a39dd70aef6ca13b65 legacy-trunk
+42132 6fcb5405074e7a5e5849dbf4a0f37f7e7637232b legacy-trunk
+42133 97885adf73b5471ac7da3a432f3df81d02ccf7aa legacy-trunk
+42134 78702a5028a41f85ab80f4ec70c1d5f81a502d40 legacy-trunk
+42136 9f7ce2846c30959c545d91146f81749553a933d8 legacy-trunk
+42137 61b8e3e3d64183acc280644eb64991c64bd4b9c4 legacy-trunk
+42138 280650792ef72b7cee8b938983b1af074ae03b84 release24-maint
+42139 f94991d5dd2069cbdabff9d4859af05db43446fc release24-maint
+42140 fdf1be9cfedf2b30196032d9333f9a574f336973 legacy-trunk
+42141 00ee2171537f75de7a70958fb798547e4d945366 release24-maint
+42142 f01543e15f85a4991e32011d1a2b5a13e41c165e legacy-trunk
+42143 4315c53f51bca60429da56db3e5b31637d064a49 release24-maint
+42144 4d2a09a6485d3e9c98cb9a1a6f65975f131282d3 legacy-trunk
+42145 3b63bc904d92e7b5b525043e066192d70dd90050 release24-maint
+42146 4f11b23e361f454d9e9a9eb77a94e4a6649848fb legacy-trunk
+42147 446cb5fc3d280bf7fc46f2d6dad2c812602985c8 release24-maint
+42149 a17b73826f9783a80168e5478e7b34c4450d87f2 legacy-trunk
+42150 c83c022a3491eb16fe1aff5a78e41ece69733dc0 release24-maint
+42151 8140f000e9d459ef34f329d35b59f0cc2c0cec1a legacy-trunk
+42152 604fe87ad47c7c0c1924eb39f9daa7ca8582e0e7 legacy-trunk
+42153 99d491faa65c2b9df7e14880971a6d110652bcf1 legacy-trunk
+42154 7b3d915b6e9d00123e8fc7e5cf8ad472a264fb6a legacy-trunk
+42155 4f90c7c05364f424b63d62d4d12b13fcd271682c legacy-trunk
+42158 838b5f5924ee17141467e918815a3d53e0de3813 legacy-trunk
+42159 3b4b4454fe8664bc4beaf15cc8e1c1973e83063b legacy-trunk
+42160 5ee46bbed1f9fe0469e16e2dd443f4cd65e61908 legacy-trunk
+42161 5c487cb63295078db3f339eae3c670e6b6d827a6 legacy-trunk
+42162 7f05974c8b80317f287069218e2000e10a7c50c9 legacy-trunk
+42163 0006ae10b7f0c92c91a3e090274c2a8fa4025039 release24-maint
+42164 78bd78a1ce74b461f258b56b554b5fbfe07cb716 legacy-trunk
+42165 2012c548ce698cbf40bb9e45c6a83810ad0a719c release24-maint
+42166 3114eb060d0aed2ea7865e2f3b42d18ea998fe63 legacy-trunk
+42167 74a598964c9628d0a47f9cdde4a8e442b652a816 legacy-trunk
+42168 a29cc23bb89c4c5f77bee20c3094b98756ece38f release24-maint
+42169 0372e25e430ecc572f2f8a92f69e81b85a42285c legacy-trunk
+42170 a50f5635a4949c956fe7cfb0ab12f786b42c023a release24-maint
+42171 d68f73f96f31f72e34439c5fbf4f8b95976ffd46 legacy-trunk
+42172 6ab82c4706338f1e465b2b5a1bb980f2fb545464 legacy-trunk
+42173 055fcdc652dd4356cfa8c4850fc76b0c4d0292e3 legacy-trunk
+42174 1b9eb9632c89b8a094b31ba0719dab4cc4207f12 legacy-trunk
+42175 bfb247d7bc3f7252f33991891f43d4c865c9979a legacy-trunk
+42176 d5734dc07d4abd995e1e95dfbc451a70ad6f4057 legacy-trunk
+42177 5123453690e51a18886fea1ed5144833ed3ad7b4 legacy-trunk
+42178 d62da36aae155125acfac3ac95a9d777ff62eaf9 release24-maint
+42179 e7f19ed1ea2dc0ca1bc20009d43fc7d7cb2bc138 legacy-trunk
+42180 c01d2272e6c3a6fb4974f8e5e2e48b4bf83b0b70 release24-maint
+42181 3df63461b116d379d7ee8637c0c37273e1221396 legacy-trunk
+42182 e0289fba6ff1ea9391b6ca374fb600cfd4639b4d release24-maint
+42183 040d7fb4eb56847adde10d8bf3b6a3ba66d9d36b release24-maint
+42184 e97818bc291944af6d09e1d67b2b04d7b7b8b3c5 release24-maint
+42185 1359605f3713fb59239effc0fa2537b1d1927573 legacy-trunk
+42187 af684d73f3a673df9731a7310eb06feca8c89aca release24-maint
+42188 c3b6728d886b877cbd41fa40dc2fe68f2f6a3428 release24-maint
+42189 cde6ea091aaafce45e3152b94c9ba53aea528d96 legacy-trunk
+42192 0602887dadf5f5741f355476d6b0181901d566de legacy-trunk
+42193 f0ada6f0f67899293a9c4219741124e4092a11c7 legacy-trunk
+42194 a625e887640703818e23f30360fe5467e3b83073 legacy-trunk
+42197 950e3e3843bbf00477c31e2e4496b0f602bdf53b legacy-trunk
+42198 0004a9d04d036657146a2e21f4f5ab38d69441e1 release24-maint
+42199 22899502117fe6891f6921c7ac109098861aa422 legacy-trunk
+42200 fc12cca73c35d0bcd16fbd80c94c71b41d7b68ad legacy-trunk
+42201 29bfbb588d93f887717ab61e113e10fee723d04b legacy-trunk
+42202 23fe47e9337d8f9c68412a1a65f4f52d3b2709f2 legacy-trunk
+42203 bfa227267f4814e82e9fbacea9a321e6a11afc94 legacy-trunk
+42204 0f2d82003a0fb74d4d2ae49b71b357bef29957e8 legacy-trunk
+42205 280d6019cf426c0a0366128cda76b34a87129bf5 legacy-trunk
+42206 38a94e58a6956c6aa9708c8ef7e283c053115076 legacy-trunk
+42212 16bfe9386068cfbe18a35ee9c2992e61ceb9b6f8 legacy-trunk
+42221 81942fc9a20d1669e87269fa6a6bf268194df954 legacy-trunk
+42226 d680fa52551226c40f254c9b4f6b1288f751c600 legacy-trunk
+42227 6a8d5e054e971d3db4df0a9ccc2f9dba9c9d7473 release23-maint
+42228 f2366108bcb281c6d6cf6b9eb343f93f733c3fc0 legacy-trunk
+42229 bd44c7c0977f576729165f7a540f104e21dbd712 release24-maint
+42230 26e0f68de86e6bab10008a3334e5ff6db17c88e8 legacy-trunk
+42232 655fa22606798463f3ff153a0ad9c7c79713d880 legacy-trunk
+42233 e66228580ea264848a8cfa3447d368e02b42279b release24-maint
+42235 94d27e01833da479bdf8ef58b6e217d17e3bc9d4 legacy-trunk
+42236 cb0dbae72a8e761b19894c929b17180c8f68b1d2 release24-maint
+42237 5e2acf7441bd69bcfcde5bb1e4b372057b01b66a legacy-trunk
+42238 dc32463015f1bcd8426ea0a32b458ade5bd07c06 legacy-trunk
+42239 8e23a7ccf615d194bc4cb33b60a3d326dd97b0bd release24-maint
+42240 9a4ff6d6e7246413c87a1e5ebb179beaca626630 release23-maint
+42241 a07fb2ef52ae7599c6af43c86259bf617126ebad ast-objects
+42242 d1ef23a16760c23134b89d56a13d4a426d854cad legacy-trunk
+42243 a3046d43eb52f2f1cafc8b99e56b48c6e455ce3b legacy-trunk
+42244 02f0744a9cd02dd801368045286c5af32bb7f903 legacy-trunk
+42245 3edb1bcd434d4da1b9cb39cb2f1fa7f225bf2059 release24-maint
+42246 388a583e7a6344d5e0de5a09e23c3c6cea42b919 legacy-trunk
+42250 4ed30eaa0256125a4210c0b253a0b52c1a3c2d89 legacy-trunk
+42251 c193283e63bcb761253ad9a8835ae21fe74756ed legacy-trunk
+42252 8404c9efdc35ebff7015d552e68c7eeef77c5d41 legacy-trunk
+42253 7789cc557e1efa54c08ea9d36a30bd168b485163 legacy-trunk
+42254 af67b6265af6ae0bdfd5aefc369d6eae82519459 release24-maint
+42255 002f9b8fec21e70b6efd5010a5c9d2f48896925b legacy-trunk
+42257 0a2a4f14110b94a841dcedc1a0aa9df4ff0ae3b7 legacy-trunk
+42258 51f760288104529aa7d045f85f695decd35b1fd1 legacy-trunk
+42261 f38b635263d3a1fff6aed4d7041d797b1a8164b5 legacy-trunk
+42268 cd4459d08ee2368e6ce8d0e2b76bb20260294d3f legacy-trunk
+42269 3abf332641463361d8f9b8ef0a2cc5a9ac71f2d7 legacy-trunk
+42270 ea54eaf92016031885dbcfb57a1ea1c12e33ec9e release23-maint
+42271 d59619a371c2179c320fe7d6d60557babdac2b46 legacy-trunk
+42272 fdacf72d4976302c92b45519da459456ba023c97 release24-maint
+42273 552464d81e1b216961ea2a76aee5815b92a5bd4c legacy-trunk
+42279 8416fb320403919a6dd066f0286d95be8c2ab5df release23-maint
+42280 397f639f7e6b8afd0b83206a0c8fd9d1803631bb release24-maint
+42284 4c2d6eb8d5e9c3c627eaa8f9be5af39474c66cd5 legacy-trunk
+42290 89f1da1342ca47df8abbda300947355da19f7eed legacy-trunk
+42291 3cf8a9ed446b3e4b105911594d13125b25ff3fc2 legacy-trunk
+42292 93efa59b3297cffac7f906ee9a9391377ec50d15 legacy-trunk
+42293 05e314ee26f770885dd7796673869e66903f9068 legacy-trunk
+42303 165389b14d6ba719bcc1519fe4174f50f503c4d6 legacy-trunk
+42304 81f44d12bef7a18e38f66e5914d0335f8cb937aa legacy-trunk
+42307 7b19a533ce9bad95df857b3ca4add8ace79c0dbf legacy-trunk
+42311 0c5ae8924104ee6417db0d45c05b7518fdae8bf8 legacy-trunk
+42313 1c3b15df67a2939ff301db8df0c7e6aa17673d42 legacy-trunk
+42314 c073dffbe70ec95c23bb40e40e08b0a999c43a3c legacy-trunk
+42318 d21875d3592b64974b26b0a001ec143f4c7e31c8 legacy-trunk
+42319 e2d4608f5c1d6d0f8f455ef847a8ee0a77925999 release24-maint
+42320 d496c0764ad614a7e58da983b77c4fdc1ec86efd legacy-trunk
+42321 ae1da51243824a8d7ca37ec702773ffa78fdb3a5 release24-maint
+42322 6c6b429a7030c65009d8fdf18f7ce61e9de014ca release24-maint
+42323 51297831b5f8909ee364f4b82a97ca1fb625b46a legacy-trunk
+42325 b48a04729cc498b0bd3e8da33f86ad538ee318ab legacy-trunk
+42326 20f75d5e79e953be46fa15f2bbca4209a61246e8 legacy-trunk
+42328 c0070d76c0db3e05531e2a97962f6c07d32a4ac2 ssize_t
+42330 36eae3fc373d501052ad4f2f1cac093a2d993873 ssize_t
+42332 71530921ce93b3e37e5bd4ba99dd86a7257a9e97 ssize_t
+42334 2a3231fe72e298ad9f9913fd97cdcfba7ef5832b ssize_t
+42335 99dfdcc6d613dde44b89a8146c39e62cd0791620 legacy-trunk
+42338 c46de1e5b9a032018085cad6f46d5c01fe74bd01 ssize_t
+42339 65ae730b623143a9b5ce2a1bf15392c77be9c8cb release24-maint
+42342 07ba8aae3dc671a861901920ba2d4eeeec46e78b legacy-trunk
+42343 a2b6ddab66d78a0b899fb879487dcb7f8612598d release24-maint
+42344 e471f1df2d031f10668829988af18a52d42c1074 legacy-trunk
+42354 74b2533b59b8beb47dab27554ca7c12c4d6fe3e4 legacy-trunk
+42355 c7ab417c59bc8b03d86695b4c2b887e751a0311e release24-maint
+42356 acd702e306fb414b9dae8b6012ba6e276f695d54 legacy-trunk
+42357 574c25fe60284520ed253e334c2759f89ce23c99 legacy-trunk
+42362 344754497cb3f588e65875812456db0a1905df7b legacy-trunk
+42365 220497e089ce8deb5b0c9637f1131e407c3734ee legacy-trunk
+42368 db2fca9ea2640628186e361d0a55328ea376330a legacy-trunk
+42371 c0c36bbd5e0c1943768b0b3993b6c5194acde219 release24-maint
+42372 17ec17dd2ab3d7fc4664124fb4718d33eb0efcbf ast-objects
+42376 96685f112709444452d4104437f6fd68d74ce1bc legacy-trunk
+42377 35de8bccfd0ed728b99bc41acfb5e2229e508346 legacy-trunk
+42378 98f7b743d91b035bef25a4966d913045de5d2f41 release24-maint
+42379 c034cdd7960cec6144ea2bf65a44def0f81989be ast-objects
+42380 3625c8b143d9cccd5928cf90cfe1bcaa70af8fb9 ssize_t
+42382 7fdc639bc5b4d3c092cb3fd7d87f73db3d47ba27 legacy-trunk
+42384 b8e73c2d1f17b2750c65371f2772599d83517ca6 legacy-trunk
+42385 7998d85649c9e000b37bc0d1f016df4663c768fe legacy-trunk
+42388 da93f9f2d6e8a81fddbd53a0a95166fe9d3a79b6 legacy-trunk
+42389 5825c6ace28b60eb57a5d5425593cef3be1c062a legacy-trunk
+42390 775defba4ee74b561bf438dfd71e42bc3418cdf7 legacy-trunk
+42394 767adc0984161bf6330524360ab307c6b525179e legacy-trunk
+42395 7322dccba22428a42ac899d50ed94e8d95f24162 legacy-trunk
+42400 13e98e369abd9f86aec74bb34c33c15c878a736b legacy-trunk
+42401 0f3894bb2adaac8a9a5a56dc104ca01de69fc3dd legacy-trunk
+42403 1596ff5c79b502e1b3c4c8f2c38528b5ea2bbac3 legacy-trunk
+42404 3350f85c889fd80bd3fbeba78f9512d02d1c62e7 release24-maint
+42405 445c0aa811ca70dd9d7b807826c46a1c6254c3d6 legacy-trunk
+42406 914f5b0da54ee1f402313e5911341584914048b2 legacy-trunk
+42407 7c9cfd3b5d0fa6f1d44e5cf34c1c859ffb9eea4c legacy-trunk
+42409 7dc1fe77713f2d20cc94155fb919f8f02ac10a70 legacy-trunk
+42410 91331a88718e02be211b4973412fce8fb68e76b7 legacy-trunk
+42411 9f3f87e920a6d1e195577191a1b519c9b1d695e6 legacy-trunk
+42412 d6d415df0df0aac2a1ca7f31b4958f9643e01871 legacy-trunk
+42413 26470cdeea3d6fbeca0c337dd5e7cf148c573299 legacy-trunk
+42414 30aef3ce2b26c0919caf7cf6bbafafadba5944d4 legacy-trunk
+42415 2791676b38259007630d977b1446a9462bf36057 legacy-trunk
+42416 672c30bf95e69a7de18c1d77bc5bf3d579266d1d legacy-trunk
+42417 4c8606191c0cf322e9e7851784009d7f2e2d7220 legacy-trunk
+42418 2297b270fcf68d960ff21ca05496e430017224d8 legacy-trunk
+42419 00f9c6e150ba2587c68f32f1ce856771d7efb8fc legacy-trunk
+42420 9df61b96aa4264bd9425993ac2b8e78a360e19a7 legacy-trunk
+42421 76ce880dce49e1113de6e30f5266771b97cdf84b legacy-trunk
+42422 442c0fb3c4ed1118d8b1d2b5f0ddccebaf57e0da legacy-trunk
+42423 92aff97417c46a1aaa06d63092d1f3b36c6cc702 legacy-trunk
+42424 71e6f6b415a4c263294d2c2407df86fc49a8df38 legacy-trunk
+42425 0c096be270003dacaa3e5c68617a04251e93b675 legacy-trunk
+42426 ed07c1a5e24c627639a2e101ec7784b8995f4d68 legacy-trunk
+42427 862493ceae4b32378d3a30c5260ae3f56fdcc005 legacy-trunk
+42428 26cac371d7b6ef9afb91d6aa581cb2e675bb6df5 legacy-trunk
+42429 c06ee0c9120957a77261baf977c78b32a458f354 legacy-trunk
+42430 fdabdf148336205ee562ed40a5ab9d936a0149dc legacy-trunk
+42431 316938b4f8d00283c9ba1bc3626536f2e4f60bd6 legacy-trunk
+42432 0d489128441af6b976c839ce418a289e5ebf719e legacy-trunk
+42433 7db3cb9e839fae35ad2872cc06785e3e7d7abb45 legacy-trunk
+42434 f7f0d2a5b20b825f270f6adbd0e8ebb36874fc0b legacy-trunk
+42435 97c81dc03dddbe763f8cb01e2ab2871f700c767c ast-objects
+42436 056e5b4606da4331a7d7f96e9ba2e9bb362b1c8b release24-maint
+42437 36325caeff9c65b14b1c5468e60d0b9d6e804de1 legacy-trunk
+42438 23e23e15e7e7c1401bda17226850a2c9f464479e legacy-trunk
+42439 1232e87cb81607994c388ddaded6fe612024e4d1 legacy-trunk
+42440 5bd02da037bfc3cf63b162df299ca6da92dc3f89 release24-maint
+42441 c9187912b59e9917f340d21d7b30d00243651377 legacy-trunk
+42442 693da8678946b6563193197c27a25b0c2ec31103 legacy-trunk
+42443 ad3c4b2c17300942cb5fdb9038fafdcebcc4280b release24-maint
+42444 bce3f356cd7b9d1b238b3f6e5f333a5606aafaef legacy-trunk
+42445 a9f9db9fa974ac82468e7330ee84897942ad0255 legacy-trunk
+42446 c5650dbf936ec0c1161c2232f4191ae604856471 legacy-trunk
+42447 5b39614817a3e9c35326354c4018a99652d5f121 release24-maint
+42448 bc47f1a6acb99e5ba56570a4afb6c3455c03652d legacy-trunk
+42450 4668df450672c2efb99305c2c9e4048fd4e6d012 legacy-trunk
+42451 1576f9beb503bc48ecda9a20ecec13ea9b0e7350 legacy-trunk
+42453 787febae30dbf3c6a3e484c29efdb2b7a7fd0147 legacy-trunk
+42454 d3685f9b7b71b9757ae907ecb9dad7967ab6aa90 legacy-trunk
+42455 09230357f9279118778e14406d2b1d997aaf8624 legacy-trunk
+42456 9a8396f460affcbdb92095c62587ff97c3069610 legacy-trunk
+42457 6bf78d2b53b435fceffdb611e455276f9383bccd legacy-trunk
+42458 a1232602262cbfad155d92c7eb6322dd741a91bd legacy-trunk
+42459 b9381a5623e2be76ca1b6a0d6126d19ad6e6784d legacy-trunk
+42460 8de58246fef8e0c4f19b0e48dd86e0f28fa097c8 legacy-trunk
+42461 941786e63ac8e6a5c75af3b56d860620dfb0e3d7 legacy-trunk
+42462 0ef7cf5222b08ad7c18c1b6496fb8eb6c6cff6eb legacy-trunk
+42464 9d29daecb9faae8af4b4afe2248b82ec6db6b39d legacy-trunk
+42465 5ce32a5bd240a7492c067b8ec558c9295e186db4 release24-maint
+42466 2386c105a894364132c6a6b83a4e4b06622a2f5f legacy-trunk
+42467 3e1d8d3b4b6ed8932220e553596ac99b3e21d009 release24-maint
+42468 18458711ebed86c5bc248e40e68e33357d292cde legacy-trunk
+42469 8b4cb225b497578889c2066b13daa0cade41cb70 release24-maint
+42470 59b532ab337692320aedf521320bf5f192c17f9e legacy-trunk
+42471 5729b4bc9b8d3969a9e436e64b45cc0999bbc5ae legacy-trunk
+42472 b60c50b16126b5dce7076ea837b3a24bf864e0af release24-maint
+42473 33adc5dd2bf2198b76e7bf472408cc3ff3bcb9d3 legacy-trunk
+42474 92004913b4122063ab8bff5c6a270a1b04d6c950 legacy-trunk
+42475 81ffdeea1d06601fcf4b9bf745c84b16a3e99a2d legacy-trunk
+42476 02a0eb1a2b21bb949c11c78f72d64a0ccb8a4d24 legacy-trunk
+42477 8e13236243dd34cfed39a60482b2dbab00c063aa legacy-trunk
+42478 dc6dec15686982d59325bc4048af564873b04321 release24-maint
+42479 a6450f988aa44572e8fc38ac8985015000e10a11 legacy-trunk
+42480 0f1fc8efb70b582ac124e16f0c4e6f2964674bc7 legacy-trunk
+42481 989aa285edb9bddf57417eb005e29436736bead3 legacy-trunk
+42483 18f272f53699128a5b209f50737cebb2eadfc14e legacy-trunk
+42484 2475fe95782d00565ef94892cdada45a2897f65a legacy-trunk
+42485 82bbd5de02f1c88698b7b43dd55467611b278ecd legacy-trunk
+42487 c6bd01c7a568c506ce09352023b423992a952539 legacy-trunk
+42488 210cfe9d307741286f1bfdf9131b93019d18d9b6 release24-maint
+42489 0d5f8077bd24195a08bc155387a4e44340c316e1 legacy-trunk
+42490 a1b30fcd9e28eb845f1ca34b6ed1affe6859c4a5 release24-maint
+42491 05ee06b7b5473700ddac579f8fb981e74b02feae release24-maint
+42492 bd7f2d8e8deabbe0425d3d414a0fcab8345bde8a legacy-trunk
+42493 781654be55ef0c8de3a5983b19cfde108124f44f legacy-trunk
+42494 c6fba456227b973fd25c6aa0dacf39c3b1008c5a legacy-trunk
+42495 e57377f0a167f146d3c2ec23538afdaaa82a8c7c legacy-trunk
+42496 38f4b098ea690c95c7f6305664db0129af3ab544 legacy-trunk
+42497 9d97c8338d4c24c3021a5b623573f46143d9edb8 legacy-trunk
+42498 c58e79b2ca05eb9446a37ccd1318e621f63056d7 legacy-trunk
+42499 e8a49eb8519c35659b8128d08cf18ebbe5cb4d0b legacy-trunk
+42500 2c1870abb6ce56dd5ccf23af97a8567fdf044d4f legacy-trunk
+42501 9c0fd586475c1706442708fa8efb761fbeff9092 legacy-trunk
+42502 946cf6d58fd115957737c7b0dec3aaf334892980 legacy-trunk
+42503 fe4ae0c417c7b29666da6a6524dc13bcd7715fb4 legacy-trunk
+42504 cab36aaee2e3d57a52915f88b9ee45f735e0a8bb legacy-trunk
+42505 f6d6e5220823e16a4f60a5930e16a0c15afc2cd8 legacy-trunk
+42506 1a98798a4b1da7219c53489114049d04e442f291 legacy-trunk
+42507 3a5f71d6bbee94111e785704c020bee90305e0b2 legacy-trunk
+42508 46ec948cbde8f7969f2778c746866e7ff6d2510e legacy-trunk
+42509 0671f3c462d50068e4df289b427484e6947e9349 legacy-trunk
+42510 4d7653e5cb3bcaaaa296e1a03640cd32f35b1e54 release24-maint
+42511 9523a9415e1810e12d69f32d085a4c8b4829043d release24-maint
+42512 dcf62113c2e32c1c513e9b76ee4034ad4dad6309 legacy-trunk
+42513 7d292cbc713ab0fe99e9062db9e2129fe1865101 legacy-trunk
+42514 361c658a55e6e31a30aeafda26df8ebca4912c91 release24-maint
+42515 c36e37a18f1a39694b251e93b5ef089b448c42c0 legacy-trunk
+42516 a9d6b1aec0963b4ccd8e3ca9c24b6f94dba456be legacy-trunk
+42517 6d3ba004d5e5971b0e468d59c6fbc8ee114a7092 release24-maint
+42518 b766ed03d4256a6ef4f7d49d2c1c4024aa79bccb legacy-trunk
+42519 c6fde8a3b9df8a05eba66b12addc34747c18d041 legacy-trunk
+42520 4b4ea38da98ed319846630b9ff1af1f719b8e305 legacy-trunk
+42521 d0080750573b63cdc776f93e0cd2c632961b2bb0 release24-maint
+42522 d112da7964d629a2a28592a622c6b23985dac1b1 legacy-trunk
+42523 ff9afeb05b342674da78bd2495c26faaf39a5399 release24-maint
+42524 bddc13d57b882d2fee2b30b5333d8a0c458fb567 legacy-trunk
+42525 1e3968fcac6819ee46501c117619cfaab43bb934 legacy-trunk
+42526 8a6faed0af04b5c973152901d2b4d999e7436771 release24-maint
+42527 d4e1762b8e15340ffca1e97f5df712d49e2f5960 legacy-trunk
+42528 28413c082c08762e0b58a51855b6038a1e8d01c8 release24-maint
+42529 eb0977932e2de865ef52b74e7de57c0a8b2c534b legacy-trunk
+42531 49d9c120357ad1015f9b1fb5e1efcc3ee743f279 legacy-trunk
+42532 4d988dda6478644b91d61f3da3c9abb225996eab legacy-trunk
+42536 20c8fa1e066838f059adddd58b9a9fe4611bcfaf legacy-trunk
+42537 98f6b59a6e0a09da6b6f7861c44ef8fb102b264b release24-maint
+42538 145d5fc9a6a51a2643f5de121b5a080e70b20e1d legacy-trunk
+42539 4e50aa7bb1b52d1c13e035545eaf2b6adacfe51c legacy-trunk
+42540 d0ebcb4f603139b34039a5e2edd3e1052c08ae65 legacy-trunk
+42541 69c0bec1100ac83c798385a1b5182b227a03786e legacy-trunk
+42543 5f2cb445e1c549edd9d5c2e6b7f2b6d3d09c1047 legacy-trunk
+42544 e0c2abd581c5b0b55e426cff9b408e41ebf3849b legacy-trunk
+42545 36ae3d929832d4ff8cae73c6946bf54add9cc58b legacy-trunk
+42546 2c8dc3581b70f2d11a44ec49a4f213429c0fc7dd legacy-trunk
+42550 09d1937f2da895fe8dc40c57dfcab623215531d7 legacy-trunk
+42551 81f1b0ddc8a16f1aa3e62e0afcacc0cbd605a451 legacy-trunk
+42552 5a836986206dd390daa6a154e0e8837b07a3b8ba legacy-trunk
+42553 2162216139b95695432e174879afb8998546ba64 legacy-trunk
+42559 911c7fa495b2404706f8aa45ccce0a9a14f8aaa0 tim-obmalloc
+42560 143c348ff71769d60b0daf4bef207419fe3325e5 tim-obmalloc
+42561 4127614f752a1f436c99ec79aa84ac695627cb0a legacy-trunk
+42562 95800875bd12594b30482c9f8b32079adc69f16a legacy-trunk
+42563 e1c3ffe926c11562dacc476808c0349ce40da8cd legacy-trunk
+42564 5d828703c6a1732add44201d3f3e42d87052b482 legacy-trunk
+42568 62564dc7bd7262d1010841c150eb066ba7073bcf legacy-trunk
+42569 8db985b4086e18cee73d6c91740e0350b39f2a17 legacy-trunk
+42570 2fda4d150c3db46f647029bb717501ed5a18a5a3 legacy-trunk
+42571 6b42920accc9264f7cabff5c386172c224f345e7 legacy-trunk
+42572 c6506442dfe01522ed8bdc186b3a9131aee018f3 release24-maint
+42573 92ce8bb8b12a7eb5f4a932d6a43bdf9e2ed8e486 legacy-trunk
+42574 c996a12234c259c0fca0f35288ac9a4a405dc944 legacy-trunk
+42575 3924afcf95e7fd9b513c1c570cb7215e572ac913 ast-objects
+42576 c9fbb067c2a6c90e30ab917c1c860fe225489ea5 legacy-trunk
+42578 bb48115e6dab3353096c2a3764210be4e9e34d63 legacy-trunk
+42579 3c0b26113df6ed5b36a60649d2fd31262e8681a7 legacy-trunk
+42581 710cbdd478a851b340acf4ef3810e970ecd5c633 legacy-trunk
+42582 2ab9270ef19aeaf7f0ea8f48c451066b26d54444 legacy-trunk
+42583 5788e0a689e2577e8a5e306f488d6d08b63bc746 legacy-trunk
+42584 7bfbfb2ef4e2145a5934383bdde8602101d500a9 legacy-trunk
+42585 58a8451ff79587e3e78b25460b5d0befe0d47194 legacy-trunk
+42586 6165927431d6a685508fde4086e671e5cacd82d2 legacy-trunk
+42587 db571f9cad6f87bf0d90d316bda332b20740f8b2 legacy-trunk
+42588 8410f06ad36e1885958949d19758df4760867bbf legacy-trunk
+42589 9504f7ac3669c281ce214e1879da6fc0e5959db3 legacy-trunk
+42590 296cda9b3e2f809f458888a3de97943ad31b93a0 legacy-trunk
+42591 584637d831e3fcbecdaed2483e2e0eeff0b26797 legacy-trunk
+42592 6c0b6c1cd1f469d594943a255c402eeda8e70b59 legacy-trunk
+42593 2ddea5535f08649e565cb742208d4e77b12d529a legacy-trunk
+42595 780b7afe61785af7c147a9b7185b024fc561ab38 legacy-trunk
+42596 dba6494735d02a55392e5cea16902844170d27db legacy-trunk
+42597 67c74efad8c23f7fca47f487482e004cfdb0c01f legacy-trunk
+42598 5230c4c29ebb278643e7ec2067624ed82ea81ffc legacy-trunk
+42599 ac498953ce578faa9027223c7e2325efb4f2c34c legacy-trunk
+42600 e1391910b02652d834e118460394c60e8e9b75ac legacy-trunk
+42602 54eb5b1fb3632ec8bac3cc4e14446f49e49fa775 legacy-trunk
+42603 e9f0db429f2bbae3be1650f7acf22e8fbdc1b14f legacy-trunk
+42606 52cbc447e1c9fbee7af502fd2ce760d45d64a104 legacy-trunk
+42607 da2a1049215d6318bf3f7f21d2148d48253bc779 legacy-trunk
+42609 0bebeb393045433d0afc4152908081e72b6f8a01 legacy-trunk
+42610 b873ec6785605136c3c64e4395da9e480351276b release24-maint
+42611 8611f39cd82bfc2af3d48c19d143e64bf12e4446 legacy-trunk
+42613 7d0f12340c9e4f58b61c068e91c9a40e0469ec88 release24-maint
+42614 e0feadc7affb72bf81cd5a1ad1854581626f97c3 release24-maint
+42616 11484a72d966fd88ebff9a77eb4ce6aeed1032ef legacy-trunk
+42617 acaa79e731333e52d0a0e542d04bc5b6d1fb3f5a legacy-trunk
+42618 dd3e5a945962c1ec9d811562dce64ecf76f03a8c legacy-trunk
+42619 301710535d15027481c0cbcdd07d8b1aa4733c31 legacy-trunk
+42620 180dbfcf3bed0650598563279443072c6713e7b8 legacy-trunk
+42622 0151a02374a82e253a35f5422e8cab8210525dc2 tim-obmalloc
+42623 dfab22ae48e367f40939e3510324e1b6d0c0deb8 legacy-trunk
+42624 b6d2f6fd3e116b9b9fe95bc982ac763c359ff103 legacy-trunk
+42625 7b58fbde5e5dfc1bdd39810c675ed40ac401d3f5 tim-obmalloc
+42626 e0a77010d033bc9322a77cdd0ee25ba7d2715825 legacy-trunk
+42627 78de5f6b2f67b3e8539388b77cae0e324ea7841a legacy-trunk
+42628 30567be90c851311e92ad100bc190cdfc48ea9ba legacy-trunk
+42629 aa040410fb9a2df99d0a383b38db6f7eb545682d release24-maint
+42630 2a2d46d1929a406afe65b13e3d7ac38c2360ed40 legacy-trunk
+42631 e3248f1fc54db718a942384279bf48d56be525f9 legacy-trunk
+42632 35dbbc1ab4487dff876498781f3889c42a934392 legacy-trunk
+42633 c3e28409686cbe2c3a67900ebb0db781df5ceec3 tim-obmalloc
+42634 6645db094943dd2b444fc1e01d481876783b83f2 tim-obmalloc
+42635 9f3e58dbea631bc66535940753a5288968d62521 legacy-trunk
+42636 3d68f352c2ff01f207d6a91ccf4c70c0b736cc9f legacy-trunk
+42637 8ff28fcf872e0a9b95c6c9aab05a07743cf68a11 legacy-trunk
+42638 b6b1c44d911052853c7cdf1f743e83e7bddff544 legacy-trunk
+42639 cd847e7268372e4e7ebbdb041f019d60cda279b9 legacy-trunk
+42640 81be15b84244539826aef1e6bbbc3670048167b8 legacy-trunk
+42641 bea94754441b1a70b713feeeec81e6c6ee99e427 legacy-trunk
+42642 258990242898e6c603e7364fa5814c728a84bf47 tim-obmalloc
+42643 3c07b6c5cf788b7bd0c8fea8a994a4c6c9150803 legacy-trunk
+42644 f15302d8b2de59f1a141241dea803cb2deda1db7 legacy-trunk
+42649 5c36c222e7ca5310e5cc8b8db283bd669d1e24d4 legacy-trunk
+42650 97ee7b53366481780b6f331550d664ac863f6682 legacy-trunk
+42653 c3445b1cf1bf1ed04dbd1c2df5a8151b4102d179 legacy-trunk
+42654 4292b42683c5fcc7554338bbfd847bb53e91ac52 legacy-trunk
+42655 71d873054d29edbd22032c8c915cf0eecbb8b5c3 legacy-trunk
+42656 ae39fce0f9a16ec0a588d71899dd46b77d514610 legacy-trunk
+42657 45e6f901902ca5857eee91aba048df7dd5601864 legacy-trunk
+42658 66fc5b262868bee7d231c759846c1fed3cd5edec tim-obmalloc
+42659 942ae25cb39150409102d4d666e37314895a42d1 legacy-trunk
+42660 402de0fef116d8e7c14c02c56dde0cfeb5f74b5d tim-obmalloc
+42661 115960640f25de5b01d229b322b79e75f8b20aa6 legacy-trunk
+42662 f7b4726ada6c509c039f6762fe0aa1ab316b3bf2 legacy-trunk
+42663 c40a33ca65b9163b9d82dc93eb9b172f36c3bbee legacy-trunk
+42664 e580c8b0dceab40ebf29f85869a465c48e0c6aff legacy-trunk
+42665 5f3822c2e73104bbe4f9d7ca081bb0b30385243a legacy-trunk
+42666 99066bea17f8f032e8078d5ad78c6aceb74fc0d4 legacy-trunk
+42667 bbf16fd024df7bcebc0f6fe882b7cc8cf9760b56 legacy-trunk
+42668 c06613e53fadf3749b891e8fcfd4acfce8e29c46 legacy-trunk
+42669 f2a895d33a5cae913f6edc83a0515a0b97581257 legacy-trunk
+42671 d6cbc71b80109099d2d3678bba6e8e92a632b28b legacy-trunk
+42672 87706438dc3c41ba27c7dc94dd1356221177f10d legacy-trunk
+42673 fd5497b64209c24117a47c86e3e87958fdd98c9c legacy-trunk
+42675 8a2a5f71b8b3d7e27006a120474024c99f399b8d legacy-trunk
+42676 6583c868817aaa4c9b9ce37c35dc13efb7e12ed5 legacy-trunk
+42677 4a4e0c58d437e87f0c3159995cd7eb58e0a803d5 legacy-trunk
+42678 4178150623378a1e91525cacc4d9aa776254ccb0 legacy-trunk
+42685 bbce8ec2ff81d0dcf9837161f168fbe20475dead legacy-trunk
+42687 8b6851382e275358fa8b28c52ef7fec7922bc446 tim-obmalloc
+42688 fa92fe15251a0510857b2029e6fd2b75c1959662 legacy-trunk
+42689 43b9d5f0901be6628445f5aa5308c73cd9a080ce tim-obmalloc
+42690 43c70460ccd590d0b5948f458dbb4c81adfc31f9 legacy-trunk
+42691 796d150e45a94bff120587420233497b7c70b7de legacy-trunk
+42692 a3e4bd475ad7f7485840e13a4832fb4dd229a120 legacy-trunk
+42693 c0982b8155c62d3ff45a821fd6ad315b5723be0f legacy-trunk
+42694 658f8ff2a442d018156e5581acb19778c6f0e463 legacy-trunk
+42695 31051a70b2972d8f2ce40e489cedea94946400db tim-obmalloc
+42696 dbf9cc6c36ebd71cbbd92337fc23beb69b883170 legacy-trunk
+42698 a2138dfb5965264945526e012c7f5e281ec297f7 legacy-trunk
+42699 3ffc1e1d2f576f64f6d7181a63365326e0aceff0 legacy-trunk
+42702 922539dbdc4e5d9c86c50f538bf033fb7d7631d1 tim-obmalloc
+42703 e821b936f3fa756a1768ce63fa45acbe0b89c860 tim-obmalloc
+42704 8df55014c8fb0cd2714a33da3b41b0833aeebba9 tim-obmalloc
+42705 ef5246ce8fe65600f0dfa5aa9af4aeaff4618be2 legacy-trunk
+42706 dba77092d46ebaf2bb8f242bc2ad03d877b4f579 legacy-trunk
+42707 0f7284c491a317bd7ff649e76ceabf81150a762b tim-obmalloc
+42708 c2942cdd88b32507f55a39444bb8d80198f26066 legacy-trunk
+42709 0b5e9ace2e87b3868250f3dd3514385c9a2e3d22 legacy-trunk
+42710 92ba72484ff3845248ee997b169fd3a6e065057e legacy-trunk
+42711 8e04de2480e49ea84676c18ab3fd65f7ac64d9a2 legacy-trunk
+42712 7b66b2dcc5e96a64a18df21d13ba9f2af11b48d5 legacy-trunk
+42713 1e83f182b5f9af811d4748ed91aeafd36b451314 legacy-trunk
+42715 2f19b981ac247c323d040419eb617cf32ea7a5e0 legacy-trunk
+42716 32e2b8bda535b8a68715d1725437f39a362febe0 legacy-trunk
+42717 d0ca6302dd3c98ccf071d83c61bbb7c7d834dce3 legacy-trunk
+42719 c4138ad1e09a0e39c782304ed2dc9e80bd6e1fa2 legacy-trunk
+42720 3e19271efc46e692638cbd361d7e10ea52a14651 legacy-trunk
+42721 83b860acfe95e6f017ccd620293f7543803e469a legacy-trunk
+42722 a366dfc7035fd1920c1aa03b27f3547af19e48da legacy-trunk
+42723 3dd92d97a67ff821df2e37819b3cd86e928baa74 legacy-trunk
+42724 22c51632b459d7702e4ac85615afa2fb0662b720 legacy-trunk
+42725 5e463ae707076dd28708d767d3ef2b2c34b4486d legacy-trunk
+42727 95a92b2b53ee49ac63786eea731bd2c8a592983a legacy-trunk
+42728 0674796b696cc5a2060cba23396bf3d39723a611 legacy-trunk
+42729 1daa199b784be4a63f50c805f6ab43a9c6796edf legacy-trunk
+42730 e364bc76bdc8d463f64fb723b6c0350014dc7875 legacy-trunk
+42731 d6c30ce3868b13d7c9ddd337e9659ffae7b2d031 legacy-trunk
+42732 ab1b53d54901a8da7167fea24cf90978cc6e465b legacy-trunk
+42734 623763457a4e8f757016348b1b4655538e965242 legacy-trunk
+42735 4cc95fce65da7639679fe5aba9a72392242aee65 tim-obmalloc
+42737 f8ffa7cbf9605de58cc4cf787e77a5df52a498e9 legacy-trunk
+42738 af9f9b593a536d728d2c478de66f0586cd501448 legacy-trunk
+42739 64ff3b225d48516154d451cfee8c4f04d73d20ea legacy-trunk
+42740 35612a131ac62481499825ddac2101b9d2af83a4 legacy-trunk
+42741 a54948180a3de229e5e1cf835ac03c5bcbd6be0f release24-maint
+42742 1aea3aeca535a630cad634d845b246becc5bdf5e legacy-trunk
+42743 1211a68b28dd371779dc42a58326c47af2e4d3d0 legacy-trunk
+42744 cd7d2919178c75763777e0953be119de53c74ea7 legacy-trunk
+42745 a7b3632d0e051525bf5871ff6f6841bd22186f0d legacy-trunk
+42746 a00a9eef6063ace997fd3e378cf5c59f9ea06de5 tim-obmalloc
+42747 376792bfb57ef9b8340f4ba47f9f325e2f5a2d12 legacy-trunk
+42748 25f8e6dde4a3b096b05ab30736a1dc6346156abb legacy-trunk
+42749 2b659268a73aa3e68451689ef420d7e96aed2e1d legacy-trunk
+42750 965bb4a54096632bf1441dadc813696008754b67 legacy-trunk
+42751 d853bc06847e66da4a5da7d2f604ffa5d611ed9c legacy-trunk
+42752 6e285c69efc05b7f8bdbb0990aea7b0c93bf8d56 legacy-trunk
+42753 57322cb2ca1117b7f0d2b4c0dd54601e0bbd2faa legacy-trunk
+42754 0cc58dbd87febe1820ab3649d53621bdbf396554 legacy-trunk
+42755 c3c5d06faa01ecd1f67bea515a3f2b68ab45d65f tim-obmalloc
+42756 f666bc9f617d8702c458228fc642aff8213b1e62 legacy-trunk
+42757 09d17430f4c25ac4942adf6b16371aa725f0a0b1 tim-obmalloc
+42758 0e2cd94c53a98a0843fef7bfb21bd1195fd4726c legacy-trunk
+42759 48a28b35dd645565ea2c24a34a4cd350ec23a4b4 legacy-trunk
+42760 02d9b4769a88e86edec2a83107bd7f78a39a2514 tim-obmalloc
+42761 604a126f83c214f4095d1958d60fa2a16629d792 legacy-trunk
+42763 688795873ff1cea1408f4f2bf8ad243298665a4a legacy-trunk
+42765 1e8cb47beaaa48df856f7dfbc673f34846b5c832 legacy-trunk
+42766 df843b07f5fe0a8c324e410526bd623cc8e18403 legacy-trunk
+42769 89d69d9212a2dcb90fc84f2a00e5cd7a0c6f8289 legacy-trunk
+42770 047471cb9e4d97b573873c70a480ac0d879e83bb legacy-trunk
+42771 7285c37d7633e4de3db57b4d9f8d52134c2b3543 legacy-trunk
+42772 8ddcaaa08fdded3f1f81e2e5cb56d4cecfd77ce3 legacy-trunk
+42773 42487d8cf338008f814731ec3dd3bcab372b11b9 legacy-trunk
+42774 04d18bcf7519f82daae59d8ed2bf92d8367e8650 legacy-trunk
+42775 515ef7dd16bd97d6725e67c2464fec504ac53523 legacy-trunk
+42776 88dfd3281f71d7cad51680796cdbc8084e563fff tim-obmalloc
+42777 bd0641d62462537ed49ef3e878838875411df096 legacy-trunk
+42778 8eaf9531a2ded296d01b64587db59eca7907caf9 legacy-trunk
+42779 6582a4490d1aab15c5ac4e76730bd0b3700d3eea tim-obmalloc
+42780 c552f2275782cf62b8ab4cc8187f17bb54c63864 legacy-trunk
+42782 e01f17c27ef30c9f4c83733626315705b144c038 tim-obmalloc
+42784 a00bd3cdb7287aafb36c4bb485ec0c8affe6d240 legacy-trunk
+42785 d5e5a5d9fe7c02547f198d9f393d2381ffe8cc6e tim-obmalloc
+42787 7099f6e68183eca649f8100c39af1c2f03c3d532 legacy-trunk
+42794 de4816d344eea4858e6f4c722d3a3eb4aa014c80 legacy-trunk
+42797 b1a3c2238f97e1a6552f95d048e534672ff99bad legacy-trunk
+42798 2c2dffe070df2836128408cfb22b574c85c96909 legacy-trunk
+42799 ef8779d455ec5cc964e9ab7a5dc5c7667cb9c3e9 legacy-trunk
+42800 aba73b46803c7790b1bc95b2496149209b522f18 legacy-trunk
+42801 1d055ebd83229fa770bbd6d61a13d9850a614b42 legacy-trunk
+42802 54754f0d25c72f7a5f1a9ef95a5b46cdd132d7ff legacy-trunk
+42805 7a30dc2af3293858105d4516968576092304b2ea legacy-trunk
+42806 6b7ca3b201f3efdfacd87ec7eee74cc2a373eb40 legacy-trunk
+42807 4f2af56d8ebe4d027e1333da99e03a1e6532cf0d legacy-trunk
+42808 bc0797b06a99ebc6ea675b5170832bdeb7c586e0 legacy-trunk
+42810 d38ab5cad945b354c31f10114034b65f0a080208 legacy-trunk
+42811 bb5e30467fe4d1762e508183955ed8a734152a82 legacy-trunk
+42812 c1c46210b4b7e40ecc5f537376514269c281dbf8 legacy-trunk
+42813 12bcd16c31ade6fd453ca94406cb3fba6f4c10bd legacy-trunk
+42814 d02b4cfefa0a0be60cdefb0720364a8a0853ab80 legacy-trunk
+42815 7a6b174ddef2f18e30d7efc794545c31d8fa9b08 legacy-trunk
+42816 07f330ad1b475e2ab756bc73200f2ab240df9495 legacy-trunk
+42818 9b9d8391b671cc5f0e5650b293ae4b80029488d8 legacy-trunk
+42820 db6131c5ae5abf208fde1b384f9ea70c5c01e0ae legacy-trunk
+42821 b2416fab13fe6d3fd3d57e3a34a1bae2a20339c5 release24-maint
+42825 1f584164e0131761a5ac2c1aef151d7f321f5dc8 legacy-trunk
+42826 653d8585f080a01796179bf54f86082125ca871e legacy-trunk
+42830 74701e4fcdad0f94859205a111143b72ef1ff659 legacy-trunk
+42831 bac6bd343a1247b8075b21c27df755c6f6c31ff1 legacy-trunk
+42833 3c519a612bdb7eca2432137196842d77e72f3e9f legacy-trunk
+42834 9e81788b0d4b5912d32f9a05967737244ff52096 legacy-trunk
+42835 0b7809660456f7922d06306715b675d5915de969 legacy-trunk
+42836 9109b1a0d265e1aefc6fb283d67ef828dca98e03 legacy-trunk
+42837 01bc8ee3d2ff846c4f7a33a619e0b286b5b25d1a legacy-trunk
+42838 3a3aed49b2456e917d8b6620638d625179f8be3e legacy-trunk
+42839 dedc2c94d112624418562ced03c04c9bc51b6f7d legacy-trunk
+42840 7c1aca8e3d7d7a5ab9255bf31e4954b5e5d52d7a legacy-trunk
+42842 b1929e8d15f999944a52a7caf67941e7b45ec17c legacy-trunk
+42843 d3d0dd92c731ab7e0ac47bf2ad41a7e524edc962 legacy-trunk
+42844 a969bd15788f51405177f9432baf6135bcd72c35 legacy-trunk
+42845 1848d75bbdb38bd5c44bd276000e9ec1e49112eb legacy-trunk
+42846 4284b3324ce2e4b641d0a278c47346d9b0cf9c99 legacy-trunk
+42847 391f74c9c26368097036fc4dd409045c332caaa7 legacy-trunk
+42848 adbaa9eba97543d7a11d3e95657e3c1deb08934a legacy-trunk
+42849 4ccef47881f79d938f912598818928a0493ed10f legacy-trunk
+42850 2d1df24e33df710e4d367c882f1c67b07a6e1d09 legacy-trunk
+42851 3b675ac9a9254e1205d025046773720598bc4898 legacy-trunk
+42852 8cd152746398797d86d0e76aa06607283729daa6 legacy-trunk
+42859 6aaadbab3530155ec19d81cda3bdabb3061fc6f1 release24-maint
+42868 f80ca713bb4bea3539390c21137567aebed019c5 legacy-trunk
+42870 9b13da647a5ebb552bb87f08a59e03c6cd93618a legacy-trunk
+42871 8e0f0fb14d358b7bfc25acbaffff3c3e4a56511f legacy-trunk
+42872 204c307b01ce57ec37feb1bff3ddc632ee6afd3f legacy-trunk
+42873 fe0736ccba75518072346373b9f32c5871989e4e release24-maint
+42874 cd72eb55d5f8d8cca71b90b4524c4a65059683eb legacy-trunk
+42875 7fac5d79d043bfae97111f0574bc9a70b0db4c2b legacy-trunk
+42876 4f628ecc30cb2eb4e23e945ec025c27c97001d6b legacy-trunk
+42877 8ebf7997c6cd56e83c83d6f30e485a70e53cc546 legacy-trunk
+42878 895074e5ed3ab80a463b10e6ba98cd0658faf1a2 legacy-trunk
+42879 1e043a125be683f5b410478835471c7be87e63c3 legacy-trunk
+42880 2d24f3a37a1b35f5343e0a0111685d13beca636f legacy-trunk
+42881 1e191392ec5c6182ec66cce16393628c8500a573 legacy-trunk
+42882 15d33295615f6f0a44a9ff87807313f0a79190c0 release24-maint
+42883 9eb24f92a784bf0cea66cc2bcc66c1edef2a4f0e legacy-trunk
+42884 a735df552f02d9fa199632b2440486e09eb56b94 legacy-trunk
+42885 e62767e64de8196c5212f84bfc19f9f128a2c254 legacy-trunk
+42886 c91215642dcd45de00e27cd73f1e53b9483f82ac release24-maint
+42887 455672a8f87761c70eb64b03f88d08f8c08d8114 legacy-trunk
+42888 257ad89d92df8452236b8fed67eb80ae4256b0fa legacy-trunk
+42889 b16e504413c3b8346c58a15fb8f15a318c840a4f release24-maint
+42890 78c9acbb463c33af3ad56b96841006415159b17a legacy-trunk
+42891 9bb590a0b7fb04a6560c73e37ee2c8b31b6cadd9 legacy-trunk
+42892 68a0943dbbe533db28cb26b7cfd1715adfb78c41 release24-maint
+42893 ca4bbcbbd0d5950f1011bc91d660dd616d0218eb legacy-trunk
+42894 e9a7a2784e17efbba2308e1acad667fcbbefd283 legacy-trunk
+42895 accfb156f9cc641eaf4c23a39ee74a12cd925e23 release24-maint
+42896 8d41ddc31e61e63b22e127f2a5beddd881646fb1 legacy-trunk
+42897 b22c48fe62a4b286438da744a2a3552822febe26 release24-maint
+42898 4706b7a1256c29c7497e94b86b7b749537193c2e legacy-trunk
+42899 6a9c7165b17bdb7b85136e1ee13158dac280647f legacy-trunk
+42900 b17da5e0a697a0ffd191d5f80e816e649186a493 legacy-trunk
+42902 cde7573354929fbb965e50bf362174e1100468b3 legacy-trunk
+42903 db56f570b0ca1205f3e44bef0cdc1cac3306e8a2 legacy-trunk
+42904 d342b0dc493414fb234c599223829124e9bf3731 legacy-trunk
+42905 13b98d0a7baa8b6efbe2d3f1bde30141afa84294 legacy-trunk
+42906 7cf5d9ba5f97eaa3a4867a03b9cbf2940b7e9dfa legacy-trunk
+42907 b48ba7cf4576eb5ca28992e828808041723147ea legacy-trunk
+42908 f6b7e0c384da9fddc30f50209988cd8746615b75 legacy-trunk
+42910 a9697de5e18bff42013be04888ba89f33045c73e legacy-trunk
+42911 632a4daa8d4afe15373d33c32cd939fe942df199 release24-maint
+42912 4b347c654635f6a5e52fc2ebd13079f7d3f4336d legacy-trunk
+42913 552dd5fdb9d84fc78115f4bbed2c5340d0f7ab22 release24-maint
+42914 fd735596f69c1cbc3806ce083997b13954f7eb83 legacy-trunk
+42916 435f7f3c8b6da475eae5d469e2cd962323321e8a legacy-trunk
+42918 6f2eda495d9de6b68f1852e0eb446034b3781530 legacy-trunk
+42919 27905ebaddab5ddac5fe029551a4e67c7545bdfe legacy-trunk
+42920 0023c0cf8febc0b9af3c1251650142017eb9e979 legacy-trunk
+42921 9227ae3db7ed1e2a4af43b2c7c2871721bf3161f legacy-trunk
+42923 12b08123ecbccd82e18648c980e50bb05dd8c221 legacy-trunk
+42924 4dedc05ad6b4764aa52bd5044987ee44ded1b7e2 release24-maint
+42925 21033bb7ecbe19a114e75e36a751b2fcfec30491 legacy-trunk
+42926 56a4cf2b02fddcfdd766f35c762ad3e601f096f3 legacy-trunk
+42927 ca29dda563b7a46a4fce327c58eb3142a1c2a1fe legacy-trunk
+42928 902ef1dc2979b6cbf82817e35a380d4a718d740a legacy-trunk
+42929 69eb6d1b99f56d6a644952cd08276aab5c5df475 legacy-trunk
+42930 3e2b5747038fffd4657f34c9970b3bd1d477c743 legacy-trunk
+42931 0bf53639014a94bb3e083fd4199b9033440268c0 legacy-trunk
+42932 91a9e2e31e930d4616ebf07b2e933aa5b57c277b legacy-trunk
+42934 b4e89d29bea8c45cf2baaacc9d1f10b8dc2e1374 legacy-trunk
+42936 b2184d910a00f8169636428de6924210020c8190 legacy-trunk
+42937 0e36e7c66b8e8a5a3fe29fb109a03dc794fa8ddc legacy-trunk
+42938 f1eaae7f962d3f7a1aad31294ac552a012531157 legacy-trunk
+42939 18f911dde3e2400ddeb0bdd02ecceeafcc4bd865 legacy-trunk
+42940 502a68887783999baf5848410350a8c20d3e83cd legacy-trunk
+42941 d40b48df83e794d9a2c0400a958501ff0b30cb0a legacy-trunk
+42944 6e9b368789df0ce5663e31a52393fd2dfec26918 legacy-trunk
+42945 3652b5128b707de8331140b6ed723a316d8bbc8b legacy-trunk
+42946 79d5b7f77ac4594f337e644c0fc8fa9310c5f788 legacy-trunk
+42947 97d38797b8bc097ab3f0a3b731be1e09ad925c80 legacy-trunk
+42948 d3d2f9ffdc06540c6b9eaa8386a71a919a5c8408 legacy-trunk
+42949 805800181e0e19fe6ca2cc01cba89e7bef6c1dff legacy-trunk
+42950 48e0a5e39403ba1ff0e47c3dc711f95768b51fb5 legacy-trunk
+42951 7c17e9221f941f6a1cdd4071dcecfa2bdd62301e legacy-trunk
+42952 fc10ff322df1b793ed85fc82425a5b3492d38ff6 legacy-trunk
+42954 3266a020a0dab7f0a7294bae981f6e44b8afa21f legacy-trunk
+42955 11f8b5b8ce20187869a9e97a2ba0776ef75fd4c7 legacy-trunk
+42956 fab44c5c8df42b95311e757e305f7911b8e5d705 legacy-trunk
+42957 2a9056f4c1647663466091627c2d6fdd14edc0e3 legacy-trunk
+42958 db4650493c2b8e392c992ac523244fdf6e1bdf47 legacy-trunk
+42959 ae59fced2e142d4abfd22c7b19747235eb3b7790 legacy-trunk
+42960 ebeba73538947df32700f837c85d45c2018319ee legacy-trunk
+42961 f120f740abe41e677a61af38097fc5cfee83bcbd release24-maint
+42962 06e3f627ad9958989b56ed89a0dced653aa461ba release24-maint
+42963 e256b5302b55c38471e3c25733c971fbe0092b8c legacy-trunk
+42964 df43c04d25545ed4bbde5c03de94d29cb41b07d5 legacy-trunk
+42966 1dd65204c09fe7d791f619feb5b54cad11670969 release24-maint
+42967 03ef987043ce00e904490fcf9f64292874418d8f legacy-trunk
+42968 e4465d2737c4e75dd6e41c06135a6e4eaaedc7fd legacy-trunk
+42969 671877d22a1cc8828f273df22b1c4c10e62361c4 legacy-trunk
+42970 4b867e654a8a4cc0731ebc35faf1f535855196aa legacy-trunk
+42971 f06125a9d40635715d96852e3bf39cd853336ee0 legacy-trunk
+42972 7351aab87e6de0fb3bec7e4d9eb85df70fa5c097 legacy-trunk
+42973 0f19a6fc975607a60a4026df8b3b93c011f33e03 legacy-trunk
+42974 fdb05c8ad5333a3917807e586ef44a5a83ad2bdc legacy-trunk
+42975 40256b54c79060b604d603dc123b0a87768b6971 release24-maint
+42976 6913eba78d407910c2fe6e9d91f287917abef61c release24-maint
+42977 c77ece66709d17e5749552e21820932343a53c63 legacy-trunk
+42978 ab00319c3744861054cb10b9efba2afc791f0e6d release24-maint
+42979 97fed618b5e723a4fa3ace4369b19e0ced8593f4 release24-maint
+42980 1a8465baf07dd4f729abe24fed7586574abfd582 legacy-trunk
+42981 c9e49138f659b1e149907c2ae5264836bb0b3523 release24-maint
+42982 db5e720b0cef9e28fbcc23e7fc2475a0d2fcae46 legacy-trunk
+42984 958425007ea6a8a6935d6a45883fd13234f67e77 legacy-trunk
+42985 3be2425d77400d88727e498671cf31b98a3050af release24-maint
+42986 cb984a8b11342f0be161eb48dd937a296ffc941c release24-maint
+42987 4309b3fb5b435eea9021a1159c428e009a4754c7 release24-maint
+42988 32b868a49659309c959319c20bf89955a936f88f legacy-trunk
+42989 3ad42f99a6dbb7fdc047e0c9065b5136bb9697ec legacy-trunk
+42991 dda4241f9abc7ea1edd29f875b5a12eb214e9b62 release24-maint
+42992 3d7adf8874ac58b8386fcf93abdf753f90781d08 legacy-trunk
+42993 8292e3e6ecfea97ad29e17fcc00036b1ca00a360 legacy-trunk
+42994 7eb2c0f0d0fd665126d1a5e28df5a7cb4a5bc173 legacy-trunk
+42998 9a08724110d0beb96db81c3296b686620a0cf3ee legacy-trunk
+43000 32103c5dbefac3e2bcdbfd46928092b0730fa14f release24-maint
+43001 a8fd91cd317acbb89108ce4657275103158e65e4 release24-maint
+43002 15a458171eb00890635a911da64c62dd9ec06225 legacy-trunk
+43003 0c0408352ee69cafedcaa465cfa1c027e3e3f6be legacy-trunk
+43009 035cc84147fb04e489fa07ad92b1aecc46419bf2 legacy-trunk
+43010 85188e5b4912f54b710048bbc60209927f599b12 legacy-trunk
+43011 b5a13570592ddc94707c6c8f2abba5d812c918c0 legacy-trunk
+43012 6b1b32a85f47601d8fc96a97803a09ed64d13e63 legacy-trunk
+43013 29e6e7a107de39205c540a2867c4c26c868798d4 legacy-trunk
+43014 bdafca2192d37eb1f1af30095f8555be39b4dad9 legacy-trunk
+43015 8c1bf799952cf1d0345b072bc0db42b3adb77323 release24-maint
+43022 95469e97fd9000ab28c70f9964b7279fe1b2018a legacy-trunk
+43023 4808ee62b156a619a59c2a825486512a19bdeabb release24-maint
+43024 b3c3640d92f84a12e05e298458155c070f346133 release24-maint
+43025 c8ffc913d0143057c75033cfce123c024b5c6753 legacy-trunk
+43026 ff3024259d91d72bae7a7c3c7cede223220e893b legacy-trunk
+43027 e2ab755ae68580e0c02338b58918eb9103be7f1f legacy-trunk
+43028 22fff1f3c78ae5451881d071965a323a9396cecc legacy-trunk
+43029 cde58cd07e7d85043bee5f32b68c8e478272bd6d legacy-trunk
+43030 4a896fc1238427241939bf80dd40bc0fa042d4bd p3yk
+43031 570c616acf0c14ec7a8ef27437e1436f3b29bc20 legacy-trunk
+43033 375ce1c04e66b59b1f713d5a5436d4d4ce5b0873 legacy-trunk
+43035 49c6eb688906b1dddabf578f08129e6729d6151f p3yk
+43037 aba814aa4c6a7bd82d1a33f0c4c08e1c8119dff5 legacy-trunk
+43038 69cbe0fb7a6d204b019f2bc3267334e91234b181 release24-maint
+43039 8e8d0e03f076a242c2b407cf795d1e530e83fa85 legacy-trunk
+43040 251f921cc81dcc1d9a55f25fb1c641ff606bb21c legacy-trunk
+43041 5fb54ed8543bb073bbf8934d305fd8861b45e13a legacy-trunk
+43042 d969e339ac1e537ffc645c0bbd2815a90b6b11d0 legacy-trunk
+43043 f914630f419c1c4e68122fb6dc7ca574ed24a257 legacy-trunk
+43045 7fa4c29d703015a798179e2d81bf960c9a109982 legacy-trunk
+43046 9d3a2cde0dbd30f9c705e108336f63d7b4b02215 legacy-trunk
+43047 451da3a5291316da1e88759f62aa4995edebb500 legacy-trunk
+43048 179084899d969b379556dfe60cecd3270733d603 legacy-trunk
+43049 86f13301c3db414cfadca459be1cc03e7c89765f legacy-trunk
+43050 55e4f4765763ecf6620ac3cb9d729b2f5ec95d35 legacy-trunk
+43051 5b38dc551f86f8c5beb233a070c4ee8cbfe091cc legacy-trunk
+43052 4f44412e9f6c127cb5a200de17e8bb89d725f4a1 legacy-trunk
+43053 3bf23061d86cd9435f56c4942c338b03fa7e2a65 legacy-trunk
+43054 6738f7b282f65c5c91c05c425bff094a1f24809c legacy-trunk
+43055 354e22f3dac6f322dac846f869d2e6b3573d7f19 legacy-trunk
+43057 1ddf0d81d6c590ccdcb335207fe3a487730c4ca7 legacy-trunk
+43058 614d80dffc1f88e200fc9706a8e77b19fffa4ee8 tim-obmalloc
+43059 685849bd905c4ab3d3bc62520350340aba932513 legacy-trunk
+43061 9787f830d025b585c4ac744e8cc73872770ef984 legacy-trunk
+43062 62409a1bc4db32e4fe0c94fe90fff62b0db0f4e7 release24-maint
+43063 ab17da68426ba854240a0e9f915285d33f7ea8c4 legacy-trunk
+43064 5d2ab4823f3cc7fe2f7a72fde17bf0986f74d45d release24-maint
+43065 f0b0aa357d49e4349af5b45d9ad7f0d5e95eea3f p3yk
+43066 25007c155668dd74e3d12cd62ffe944801badc71 p3yk
+43067 560ac1ba99274fbed987da2fc603eb162ed4b831 legacy-trunk
+43068 4ae0bbfc6866e195477798af73a7164bad24f311 legacy-trunk
+43069 d68344d932c458f8767911a528e0a45006c5678c legacy-trunk
+43070 85eaf0ca64f2e4ff6c3d64b31076adacee6819fb legacy-trunk
+43071 7dad83ca702db2b09dfe27c2917d6c1167e22429 legacy-trunk
+43072 4920bd492d986b5aad02a1ed6d685299db87a6c2 legacy-trunk
+43073 4727f260f6f8d96935e0dc9c75cf4596b00c3603 legacy-trunk
+43075 0f6b4ceea580538c83864a06327f6c22df4f7caf legacy-trunk
+43076 495344fed255b5ab8d1b33aba9ea18f7302e5dca legacy-trunk
+43077 f70c036489ec4317808a84124d084548eb5d9911 legacy-trunk
+43078 03894a7a32ecd3fff4397fa3da0c221d4d1fe39a legacy-trunk
+43079 a2a604931ff68047fc606ca2880801da2ac19192 legacy-trunk
+43080 30203e2b97d732d5dff6095b9be8a61b741d5cbf release24-maint
+43081 92be2e1170331958c55dbb02ff08a29986f99419 legacy-trunk
+43082 82f700fc4de20de58b7edbbcec6e43da2a6dc772 release24-maint
+43083 a253958bfa4c42b302ddde4c89a65f7d34e2b012 legacy-trunk
+43084 e721d68dbf6f12837d8c6edb7b5ff36d2e8438a4 legacy-trunk
+43085 3b30720fa57a114b2f0a082cd4a142967c75b2a2 legacy-trunk
+43086 c0aeb10654b2f669ce3e3a1e2d0f1b53022da52b legacy-trunk
+43087 fff4eecdef45f6418de49d81ec0de1c711df7dd5 legacy-trunk
+43088 bce5c7ae659a52523ec06ba07750686d25e8961b legacy-trunk
+43089 c449944068d228f6e3447963c4e1b3d934e8f7ee legacy-trunk
+43090 bfb74a420ac8eb35152d0762d9537d40b40f7acc legacy-trunk
+43091 e415f1a874b109efb47203f570ca59f24e7b120c legacy-trunk
+43092 a9c3c93824653e068921f70bc3815ffb7563b640 legacy-trunk
+43093 53c806f7a25086c243f7e97c9ed2fa4b3aee5cd9 legacy-trunk
+43094 bd3715353a09b5626679452b44030196e71d97f6 p3yk
+43095 7ada16a14968674623143d2d08116590526ced7c p3yk
+43096 cd1818ee7ea9a8ce839bf1b76101fdbfcab7a5c4 p3yk
+43097 ff381b388cff42c9754487f6fea6fa66bb6c217d p3yk
+43098 081b4f0e81b7baa680254a30b72c45451d71b78d p3yk
+43099 3342b3b586304053a76a0f63dd950e512b6ceaec p3yk
+43100 3e1ee6e16c81f912f691c244af1466a0db517b9a legacy-trunk
+43101 c048a09d06ff8674e0509494a5e586aace273c04 p3yk
+43102 11839776c66c324366a77c20891cd1fc0060786a p3yk
+43103 40511bf59297983e49674bef9a2711edfb86990e p3yk
+43104 a01672a96d47270463660bf55709f85f9d965853 p3yk
+43105 ce267f68065e22092f178ec176364a7fc32ac44c p3yk
+43106 9ef3fac5d2c0a2a949622e54f99310e090b0104e p3yk
+43107 ea5b66af6245a409e2c23d766215f87d4e83509f p3yk
+43108 fdc05b167236e757217dc58d1593e70d1fc8a5dd legacy-trunk
+43109 5aecedc98af6559e04539ac593541e7e0e454e2e p3yk
+43110 f7fd11a75a6a4dcb8a23b0f60b3cb476bd32b114 p3yk
+43111 c2c12814f854abf0e080a115fbaa45808fb7c663 p3yk
+43112 2b04b9c7b58eb2d006e5b76119e35f51d318362a legacy-trunk
+43113 f02a03254b91e77ca7402c58f5773180f04b7506 legacy-trunk
+43115 203c06fbb07544743c2d6dd4addcb535241a932f legacy-trunk
+43116 d7d12d7fcc392f9796ac7f8de979380b855410d0 legacy-trunk
+43117 23045f1e39f2f91c8fd1fa453e340182ed3864b3 legacy-trunk
+43118 64c83e0f683e566ac6de0096e2b624cdf6e23bbe legacy-trunk
+43121 b01c80d88267fe50afbb34674bcf3cb370c5f981 legacy-trunk
+43123 4c804ab87eadac0aac6024f6bcb3c643b52afed3 legacy-trunk
+43124 1f4549865aadbe554aed42595aed8aed1b256a42 legacy-trunk
+43125 e43d5d2ca50abcebf4c67ef6af806473a731205c release24-maint
+43126 dd49847a60d300d1760f1607c5044da2651de72d legacy-trunk
+43128 b33d9166869615cf2974dc87e892b6991856cc63 legacy-trunk
+43129 994931b6b87548929bc3612cd8c655d26512d60d legacy-trunk
+43130 43c393b2fe9fa479d07db4b79ced01ea558c354d release24-maint
+43131 81d0e93208d9e8105d270dc6642ded4a62f15cce legacy-trunk
+43132 d13430a8bd2ce259ee95285e3d8a85aba650b88c legacy-trunk
+43133 b55f53041965359644cabdc9fbbc52384085d4ea legacy-trunk
+43134 685e2123864d3f6af04b867cc9069a9231855865 legacy-trunk
+43135 38400b66240475a2959d210b2e0f052026b143c7 legacy-trunk
+43136 3f90a93ff5d0ea918824c51f080ac67ced3a1ee4 legacy-trunk
+43137 92cb4a7fc554effa6916b71abd225a6db9f4fea5 legacy-trunk
+43138 6771f0e08b60a236f216e667feb4130b108f9d80 legacy-trunk
+43139 92952ac8e8911f067f56bebc49aced8d9574cafe legacy-trunk
+43140 bb491e55fb4c2433a51ccb4e1eeff56078944f1d legacy-trunk
+43142 843928c6b24cddf6db8c2587cd279cfd838acf03 legacy-trunk
+43143 6c3ec3736c514df7ac1dd0801f574a08b9a9b906 legacy-trunk
+43144 9910ff69af973be339c2a75798b0b0e345b1aeab release24-maint
+43145 3b7b295cca902bf710ffb733dedde5071a6c9b67 legacy-trunk
+43146 c011af4a2b01fd2517eee8e3d2a23e65a92de955 legacy-trunk
+43147 07ab557625b9ceefefc7ae6438d5a396ea597f7a legacy-trunk
+43148 23357b88c03eafa6be2985ddf556ce1505e35ad7 legacy-trunk
+43149 1d3081cb3ea6735bb2ce6ca8a957befba164737a release24-maint
+43150 7c22b5aa343871db94d5ee631f4e0af3a7764dbc release24-maint
+43151 8d42f661fec8029e1a20c343dbbd7b18a7c6990f legacy-trunk
+43152 775cd69f8a237dafedb94729e6a12f65890793a5 p3yk
+43153 6b516f321d8524cbbee14d1e66179842c8f9b1b9 legacy-trunk
+43154 b31b7ec5a6b43940cb8e9010bbe9c32a5888e81f legacy-trunk
+43155 3dabd9bb496e9a68cd6cd94b7622973fc766405a legacy-trunk
+43156 b4d0f8d95179a46bccb49d80dd5613d05ae0c24d release24-maint
+43157 de8f5d1cdf4d95824aed3b0e33d78d72f3b9b506 legacy-trunk
+43158 d62b13488943d78c9c8d81732293232a84b79047 legacy-trunk
+43159 852de33ed427d6a430f61cd89d3622d9a3905a8a legacy-trunk
+43160 2dc63cdb09cf0da83bf149ff35070a2d43337298 legacy-trunk
+43161 db986be2c00c5d03a5de545ae631ed82c05cbd78 legacy-trunk
+43162 e80fdb3a0f40a9639b481faf8f68fd21abaf42c2 legacy-trunk
+43163 79e4dbe4bdc6a638804c6f55cd94bb32be7d76ff legacy-trunk
+43164 a06c9fd251208cad2deadbb59e945c0d83bde8b9 legacy-trunk
+43165 d860311f8a971e72a9eb332528ffe394cddc6058 legacy-trunk
+43166 3605218d03fa0437ae4f3b33eda11a5d152bafb1 legacy-trunk
+43167 de2b942f37f948e0cc6af6db4be9b91b3ddf519f legacy-trunk
+43168 5a7750db09778e0227fea1ef21b8aa9f06d4fea3 legacy-trunk
+43169 a0ac77259b99ce7fc69a027fdcf63822e271c524 legacy-trunk
+43171 d8592276b13745a91b8b34d3481d6d27425b664c release24-maint
+43172 4907fb879cd9c7a6388aa379bf76782056a07ded release24-maint
+43173 6412ed6975deee8fa8d99eeab558f39f1c36ad54 legacy-trunk
+43174 87ed1f3d272e4ec3200f0f958ef275159e9f2c32 legacy-trunk
+43175 82aeb54b0baab3f1d681a707c3342bf005b52ccd legacy-trunk
+43176 136b457b543ab65796bb6fa641e1b3dd1c094fb9 legacy-trunk
+43181 f7993dc6bf264f8bb3094881d7f03e5b2ee10d7c legacy-trunk
+43182 db317e4357ad54e6c770ce2f675cf7767679aa20 legacy-trunk
+43184 db297b9442e40ca56657af125cc024835a3c7611 legacy-trunk
+43191 e73b35d81617beb1dd2801249c866ada8062de6b legacy-trunk
+43194 8dc44e9d5c939b82d62411f4c21ce4d35dda66f4 p3yk
+43195 a9c1e52addf28bbad801c94f74717067f22bf54d p3yk
+43196 251ecec04f1bffd635b570f1d6e8d83ffd68b838 legacy-trunk
+43197 e34506e44e67682b7d3323350de54fc8a74f63c0 p3yk
+43198 52dd45db1e85047abbcc0e56f788e2abe8121313 p3yk
+43199 baf65dc639c14fe0e3952f7b504ce7af00936b5e p3yk
+43200 08cf8b9ec2087237b4b23187864a0917bf902980 legacy-trunk
+43203 2f4a4f96acd1e6f4829c188328467984d6c8cde5 p3yk
+43204 aa039de891c987fe6fe045e598935fa4931b95a7 legacy-trunk
+43205 0bb7700593f75a21e7a7c56a5781b96bff700201 p3yk
+43206 6e929238e3ac47b1829f31590efeeb1027e52b75 legacy-trunk
+43207 c9ee32b793e78846ed2c6468d2b2739d2dcfd597 legacy-trunk
+43208 e72d1c7c85548909c2fcfe9fdd1fc82b599b6c7c p3yk
+43209 3f824141eeb99ebd834add31172ea1a4e7c9cee5 legacy-trunk
+43210 7dadd3fc5efac6bb0c9da99103f19848c577b6ff legacy-trunk
+43211 71c5694e3423b245f24c825580e785bc22ceffb6 legacy-trunk
+43213 617743114600bb4f3bbc9b91694f5f287e091f4d release24-maint
+43215 767e6be589a040dbe546d76ae60940fd5b541f70 legacy-trunk
+43216 dbaf0bce8d4602d20a551ad416a4fb15415fa59e p3yk
+43217 7eac23c8e4e9893e074fe59626a1400ac79bb338 legacy-trunk
+43218 4ef99695f7bbbeed995b3d831c1e1ad9513c4ac1 p3yk
+43219 7049dc0c621a3d2b02b321c8556774ad8465b234 legacy-trunk
+43220 5217c703a94f8abea518dca3561ac0870a5fbb83 p3yk
+43221 91dd4d44d3bc70da6f574f8ad4c291ffecbcdcdf p3yk
+43222 d7513f38b22f99ebd48459f94255ed34b207893e p3yk
+43224 691dd0591691717c7f6c5f279c838c3fa0b03bdc legacy-trunk
+43225 0057862a3bdbdaf61ea88da218b3961f24bf9aa7 legacy-trunk
+43226 2d92ab7f5e89e0d8bbf4a2996f99fd7831a140f5 legacy-trunk
+43227 4d80607033fb315de56f02272b41cd0a42a6d8d2 release24-maint
+43228 10cce3f6517029aaa971cf4b525c070a0a8aeafd legacy-trunk
+43229 3545811239b40ba39de47b3115f6c130977957b1 release24-maint
+43230 16b8859b07605ab6d1f9bd1d50086c5fee71d195 release24-maint
+43231 9ad0e517527ff41b773717aa4033391615c90c19 release24-maint
+43232 8149d0a424a55e00550e19263fcc029469612935 release24-maint
+43233 1af245fac90a6b6faef88aff004d953430d24ae3 release24-maint
+43234 c1e702d28cf287fc64af6a3ff41ce87919bb42e0 release24-maint
+43235 a950450ef4eb9287264aff18c9c7a903d046d9bb release24-maint
+43236 d1170e9aa789b3a4ad0153dda2d073c2ce4db35e release24-maint
+43237 7c5be7c0fdfdbbc0ac1d91c07038bc81412da412 release24-maint
+43238 3e09c8566df1afd70a554db06052bf3571474d83 release24-maint
+43242 b2e6d6aa86d1c1b322ac3504f920cccb3459dbe5 legacy-trunk
+43243 b4d92ef2f3380dedb29e30fff42803201afbd6d4 legacy-trunk
+43244 0c602938ed8e879783a1d6425b94c3ed64ed09a7 legacy-trunk
+43245 2b7ece78e293147777643865f73c17a7e6ac0bf3 legacy-trunk
+43246 45dd938b7feb20fd908ccdf002b616d90de80dc6 legacy-trunk
+43247 027c6fceee0daf980e3e4e8362542739cf4a5e26 legacy-trunk
+43248 41d70578578a381160f48f9b2f223f08ce048014 legacy-trunk
+43249 4f97b6a229ce0315f43923aa52eada70bec1474d legacy-trunk
+43255 066c9ce48c3002beed4e3b6ffe6e59037aec6369 legacy-trunk
+43256 29df4fe128a0abeabf01706f94de0e42d507b1c7 legacy-trunk
+43260 72a720dd64fb4b709ff6415ec23044f41709b72a release24-maint
+43261 1ed7b8dc777acfd5f6ef53bfadf4993fbb49bd1f legacy-trunk
+43262 97357fe342227bd9bea0e078a9ffdcebe79df231 release24-maint
+43263 7e3bf8492c03a6965fef552e6fe527acdd050757 legacy-trunk
+43269 a18aa3fbdd4ab0d81e72526913ff82722d908ccf legacy-trunk
+43270 fb481e0f5786e51ee3e1e2655a16335498a9c990 release24-maint
+43271 a8de0b9600275bc46830491134a5579a594a1c56 p3yk
+43272 231d604ded846e0a41b4c3c11bdfe31691c64c96 p3yk
+43273 520e55bd76d6c23c9be619338c0cc89482bbe929 p3yk
+43274 64ae32b078299a240b61f3264b7066f2e558f0bc legacy-trunk
+43275 caa9aff085a6663d23d904a993200cf1f4ed88c1 p3yk
+43276 f9f04115fbb5f5003db1c049270ad3e6cc4af071 p3yk
+43277 b2a05ea7eac1ad2dc56484de787df2e99cf04f1d legacy-trunk
+43278 868ab2a65c730eeb4960fc343622c4d02b91e2cd p3yk
+43279 668a5ba77dc6f3dce758c277c84685a18ea285ce p3yk
+43280 35cc5e180aa3e664e7c7cb34f9ce96ba461a8f2d p3yk
+43281 63c61db553a8696dc3d318b84b61531df792fe8a p3yk
+43282 760ffb0fba3737d4eeb0e4f1d32f23618b9da1d2 legacy-trunk
+43283 b8567b84c53137f476aa4101ae628558f72cda81 p3yk
+43284 0ad387fb6314323cb5df593ef35a46fbc595677e p3yk
+43285 4bfe8afe8f65ed133e121333395113bd805e9c93 p3yk
+43286 593e8fb9a3cafe5c477cd5637a1dc27a75724573 legacy-trunk
+43287 7f322ef684387da1a79f4db8950e90b3ea5fff81 legacy-trunk
+43288 e38ff21191de51e9526efa85a94238615ffb637c p3yk
+43289 24363301a299c5107efe5eab036943c3a7c5d5d7 legacy-trunk
+43292 c1a6ba7ecb234a95e08ca47f4202034baac46efb legacy-trunk
+43294 64317c71ed6d39361e07365133ecec364eec34a7 legacy-trunk
+43298 bed3f52f0dc63f7f2a0ca0a247958c41b9a4a93b legacy-trunk
+43299 1b72d0e4f4aa0ada9f39fd8d69bcd5d694602945 legacy-trunk
+43300 8ab01a9c140b702a297fa2f4ed94569832209fa8 legacy-trunk
+43301 395ad0d5423d60a41cd62c0cdb8a4b06672ecc6b legacy-trunk
+43302 f5cd3091d99f9acf11e7cbade3963d23e9aa9d79 legacy-trunk
+43304 b39c3d7a5ad450cdb16abeb13993661eb4f31db7 legacy-trunk
+43305 6425a43bf3c6e9ef58fb366aaef713a75397a769 legacy-trunk
+43306 49622d65c29d2af1780f65b964c040ca234e84ac legacy-trunk
+43308 51df994885e978f364a46e5f695a0072f43ce163 legacy-trunk
+43309 96e4d53128c9e73e85831a1f03d9652cc9d9a928 legacy-trunk
+43310 a82ee3298e1ad2b6428e0f7746228f2d7b791e29 legacy-trunk
+43311 c844305aa8ed1f22e080c5e9eb191f292e670c1b legacy-trunk
+43312 69c358bf6a3456d538cda310320ab2416b657f1f legacy-trunk
+43313 2c1fe761f019419980b2e504eb4fa906a13c5f01 release24-maint
+43314 06d7613a352319c2956f485720360f104a8a8b03 legacy-trunk
+43315 515118c0e338b83ca5992ee86960be15c0f9c816 legacy-trunk
+43316 b34440419b679e7e1137e0eaa10598db09b6be29 legacy-trunk
+43317 30fabb87fbcc30ffdf17dd648813cc67593935b1 release24-maint
+43318 54aa5aa8f2cb26a7da93ab2a4cc5d7924d184d35 legacy-trunk
+43319 46176ffc8bf5ddcdfc1cffd1e54e9bb5a44740b1 release24-maint
+43320 e234ff8beaa2021b2e12f49e77543942f485a386 legacy-trunk
+43321 d7a6ec9de88755813d9e25fc54228bb0236c882d legacy-trunk
+43322 5bbf7227ad6e9b93c3125973ebef78fa57779435 legacy-trunk
+43323 f19890a86c4332c5ed36d4527e089da707fb75bb release24-maint
+43324 4163487484604489aa0f41fd2a16367e88ad2bf2 legacy-trunk
+43325 c0818f21f65a2dabafcd950dba9a0eeaec96c714 legacy-trunk
+43326 9238f04eeaa6ce8544959bab70be2c5c75d682cd legacy-trunk
+43327 8addc313ab0fc72032a7417f969ec98bda5a71c9 legacy-trunk
+43328 799b40c4a2c61ba9a15901e7894e46e850502f77 legacy-trunk
+43329 8d57d25e654879c869dd9fece909d274aa057272 legacy-trunk
+43330 8f7c03acadddbc7629219c7a6907e62a8c6315a2 legacy-trunk
+43331 6e1a899cac8ee6dd23fab66a5e5e352ed9ed212f legacy-trunk
+43332 a4d2f7b847b1e8289582fc24484b73de589fed5e legacy-trunk
+43333 94f54ec62d1438b043076397eb9bdf0e7b353591 legacy-trunk
+43337 e5cfd4a3e65c6172abe91266722101d9771fb0d7 legacy-trunk
+43338 0098e7264eaac54a3efaf8e2be382136bdec228f legacy-trunk
+43339 34f20ab44cefd4909aa0fe25b53cf28fceab3829 legacy-trunk
+43341 9d8b33aff60c100e5529fa05b5b62cdff92b1542 legacy-trunk
+43342 b052247b1809ffec573b9296807d20468df695a4 legacy-trunk
+43343 ee36c16d8d2bb15e9d43cd0a8a914e2b281bc353 legacy-trunk
+43344 c041b362bb04d8cf1753c47bbb26ade416da8658 legacy-trunk
+43345 dc1835fb9e7c3b28a5acc6197e6e7662a54b08d4 legacy-trunk
+43346 43452f1fea6934b9438299ef647d28da806e9b3c legacy-trunk
+43347 373f7fe0e733f4babd10446830bb71bcb7118a28 release24-maint
+43348 22345d1e6852703d7f45ee825ab99cf8d8c8054b legacy-trunk
+43349 261116f6889c2c4c7a94daaeeac63af38f973056 legacy-trunk
+43354 3b61e4aa7ede1a7ac0b29f0fa3225ed28ee4eda9 legacy-trunk
+43355 6eb9b16d6e215863d23aa9bb1d90769b13059e81 legacy-trunk
+43356 41a2d78d43c697ccc028531feb745f67840bfd79 legacy-trunk
+43357 049004d79fefb1802b6e5c828c581bf14d00acc6 legacy-trunk
+43358 00e9d59c23b4e39a2552295c305ca2680bdaa167 legacy-trunk
+43359 3520f9714e8c1042d18a5bc60c19f797e30c2db7 legacy-trunk
+43360 c8f87f08fe0bddf08d1d25411adedf0e51a1715c release24-maint
+43361 c11fe2e2984d9b3758988c4a27c19ddd0a65cb4d legacy-trunk
+43362 52debbc3cc08a2ea370eb2d49ef978704c0288aa release24-maint
+43363 93344da76acd0e5f410a23ff7fbf18c74357b3c5 legacy-trunk
+43364 a7818c28749f4aa726ef2a82d75b17a951267cee legacy-trunk
+43365 f4ca03b87160be6ddd4d8128dfe1764261379e24 legacy-trunk
+43366 94f1613b87d5b2baf09a99227ae2b839d6fa6eb9 legacy-trunk
+43367 034c0cf5007b28424feb61295bf9c4da6733417f legacy-trunk
+43368 7b52480c12c62befc65f6d9e396e29c85b4ad99d legacy-trunk
+43369 af24eb3bbfceb7dee71ca0478c00265eff72c936 legacy-trunk
+43373 e12e493b5244454af82e7a609c24c4a9d13dcc9f legacy-trunk
+43374 bc5161f292b771301938a956e5f9f45c7ea65089 release24-maint
+43375 5a3f228087afde3ab369f053124c732e7a7fcdae legacy-trunk
+43376 b75440cbfd34f15e9f5c58e14cec2bd7128f5e2d release24-maint
+43377 61461eebd58f7e3bc40cb81a7e0b6f073f184c57 release24-maint
+43378 a2847bb328c0e6e2e53aba91d2405aa239d94bb2 release24-maint
+43379 5d625f589f2a7cc7f8941eeade9ca75b26a6f90b legacy-trunk
+43380 d8de7500291dd45761c1fa316f4813f338c67524 release24-maint
+43382 a7834844dcf610168cadee33da32efe344b291fa legacy-trunk
+43383 badaa7e91d9a7e70dae6331431a8f87438a4f1a1 legacy-trunk
+43384 a03c955ffed10ffeb3614d8c9e4b5f2b6e855f33 release24-maint
+43385 80c4fc03ff9b7d68bfef63d1b8342549a41e9f86 legacy-trunk
+43386 dcd459b036706c74724bf2d43b9a742a34de74cb legacy-trunk
+43387 b9426093d7ea67ad199ce9c194331ff1f6a2e67b release24-maint
+43389 63c4422667056b6c1c11ae6d6e97a49771f40a05 release24-maint
+43390 8cca2492626ce408cd567110811c0692fd1d37dd release24-maint
+43391 762e5b8d189daea07df14e9770ab5e89dadeb9e0 legacy-trunk
+43393 efd141cbf6cb37694010860420a4b42414c245a3 legacy-trunk
+43394 bb1b485161317fec0a2b27090d0fd107520a3404 legacy-trunk
+43395 4e1aff0e20d18fb748280ca3da7ffa77d12d482e legacy-trunk
+43396 ccbdcfc40c81c468b82d7504673a220fa6a0114f legacy-trunk
+43397 ee4a60c71357127f7e5814627abbe9f7d190e831 legacy-trunk
+43399 9c69378516ab0fbb5882b78e9931e1907c9c75b3 legacy-trunk
+43400 5203376f15892cbde94fa01e89f77f86a25cd362 legacy-trunk
+43404 ef8059f87fd2f92ebd411378116776588832e2c7 legacy-trunk
+43405 a157f5a69d35c60908ea063f9a7b09dea6927417 legacy-trunk
+43407 ab3efbca5c9209841868740e9767189b9488b106 legacy-trunk
+43408 e49455e94bee288f094f793492824e35da0d7fbd legacy-trunk
+43409 1f61aa46fee5b3d3022801454e99b11477a096a0 legacy-trunk
+43410 437d276c732c7bda7935da80628ced3f7f5656f3 legacy-trunk
+43411 89142cadcfb9e74769138ce579ec7e479459ef81 legacy-trunk
+43414 93ba15619f5aac9278ef4f4829200cef31aa61bf release24-maint
+43420 60be3f39a72bdf858a18084c1975de47633b55d2 release24-maint
+43421 1ca012ce427e3364ac50eb61f5747e2fed5cadab legacy-trunk
+43435 b85ad2166c01be7ad0ee20e4c3442a63e51d0a97 legacy-trunk
+43436 b8d1a45a3057329638efb42bb832b11b61496c51 legacy-trunk
+43437 81d6119dbc66b57daa933c040a0298dfd0133860 release24-maint
+43438 efb09dbaa40e67db9962d4add5c0d790615d0539 legacy-trunk
+43439 acce040e0a1aabb0cbf40020c7eaaa527d70de9a legacy-trunk
+43441 44e6fc8d02e1c1fc8f7920f0c811709c4c882e20 legacy-trunk
+43443 24347e4656a4fd25d3b1ef20483c82f7a3a8cbb6 sqlite-integration
+43444 e9e8098f657248e61b3a824a1801cf9066825108 legacy-trunk
+43445 f284e854fe72ec47c30a568d40f8d5dd9c4581e3 legacy-trunk
+43446 e156c5814fccbc5065ae43e13c8cd4f2b0eb6020 sqlite-integration
+43447 08bf1122c1440f275b3acd0f9bef443155cdbaa7 sqlite-integration
+43448 fb7b52c4116c363ff912227a33f66ed10a29b839 legacy-trunk
+43449 133d4bb61bab2f3a11390f0444dd3c303ff35e01 sqlite-integration
+43450 955a86f8a140c02680d190df4a2d5a1e9f54c3cb sqlite-integration
+43451 78cac20f9642d72d610c2c4add6fb03166badd9b sqlite-integration
+43452 69187799a9f6be7df80f62c5b5e9cc9217fbb683 legacy-trunk
+43453 79a0f080f898c254bca999b9d3c3373d1c89f4ba legacy-trunk
+43454 5e1b6f55376313c5ac5ba8a25e412bc60877c66b legacy-trunk
+43455 84967a1962cbb2a5c7427a3ea44a7f53253cd257 sqlite-integration
+43456 ce56c5e3cb2050eaed0aaf451e82b1cf88ec8655 legacy-trunk
+43457 e58a71a8550e7c937b620adc388cda5c71c2fe4e legacy-trunk
+43458 aaa04bfafc5855a1fd5f4473345addca6162c042 legacy-trunk
+43459 235f635ac45a04870bda888092dd468117d2db7a p3yk
+43460 36190d7fd8ab2eaac98a645c31012f3f6407fa50 legacy-trunk
+43461 0899a804a594ccf928bbe692e59831e7fe9cee5d legacy-trunk
+43462 61452bd125e5e106ad946a182592e33f40dff839 legacy-trunk
+43463 228e25c93a9793b6895cc436c34ed21962c7a6d0 legacy-trunk
+43464 c72bc8470f6c9eb824f7c9059864a129c7602655 legacy-trunk
+43465 19059df45cfe902f0e0909861d1d3961950ce54b legacy-trunk
+43466 049606933328e890821e133290bc9974d5357046 legacy-trunk
+43467 f5e792a93c431a4db0fff55568b8b802ee10992e legacy-trunk
+43468 98f5c918a24acb931e1f77bebf30843906f44569 legacy-trunk
+43469 202fe4aafcbb2c08230ca996bbc31a4ee7ee0c12 legacy-trunk
+43470 d1993ee8ac411d1fc12176db428cd02a0fae8d5a legacy-trunk
+43471 cb2645a554d882af7a2b7afd2cbe1273e5888c1e sqlite-integration
+43472 0d3e5ac072b2a17b49e3730250590aca83763da9 legacy-trunk
+43473 32e7676990014bd1a9541397557c1ca4afb620c6 legacy-trunk
+43474 164f95e8e0ccb5068decd20d5acea00aaff7edc3 legacy-trunk
+43476 c4988ac58999790e51ff43aea646867b109c2788 legacy-trunk
+43477 d65a9c9c8a7a2ea3717346a4c4f1acf03b6eccf1 legacy-trunk
+43478 59912b4812e6ad85ee4c6751cbee732e0a668586 release24-maint
+43479 fb7d895a8897f53e36e884b3c4c9487563bdd9f9 legacy-trunk
+43480 866da7f30e56860a61186c80a6e15ca1b98e4e10 legacy-trunk
+43481 67192da3e69c985bb1272da932d7de6073033fad legacy-trunk
+43482 c77115dddbe16df52fbf682249dfa2a3bc5b5588 legacy-trunk
+43483 aac005e8bb8007903ed2e50e71f59fb989d56006 legacy-trunk
+43484 b80b5f84ae54f2d452315cf688be41774c07cb3e legacy-trunk
+43485 a7ec78f8d0866e6882f88d58f03bf800f1a6cc94 legacy-trunk
+43486 a4950ea556b53439b958172abf9b916b070c46e4 legacy-trunk
+43487 75f9eb011226e1f3ef7ae1c56aa60a611ff090ae legacy-trunk
+43488 6c6b200443e36c7b44e09161cdc7b2855e561510 legacy-trunk
+43489 c9a6273775b503c41f6dbc6d5f7c4c4027838ec6 legacy-trunk
+43490 da770659f77b842f12ae4f6e0f8eb2c46e670b6d legacy-trunk
+43491 6fef957712b906cf3cd2460f91406bfea02d6ccd legacy-trunk
+43492 a61d3afdfc4b493c98304d77f46f1b925fa2acef release24-maint
+43493 f330048d8bdf8202414a3364cad24f195120e6ee legacy-trunk
+43494 d610fcdb89f7ebb1bf809f52220a5bcb6af9999a release24-maint
+43495 fe3b93c224814f360eb60b35b10d1c98b6d2c8f1 legacy-trunk
+43496 c6cf11acb41fb30be844f37e4a53af9ccad0a246 legacy-trunk
+43497 e60c8b9b2b4f3eded5c90c031eaf30e1ee1bb7e0 legacy-trunk
+43498 cc35d3a879ad494ce3158fc2bb654daf122abb45 legacy-trunk
+43499 3850a443483a1fa2cfcdc05cc8e3f45166982c2c legacy-trunk
+43500 37040459bf2e41a845081af79bfa1bc8637e31d8 release24-maint
+43501 a24cbf94bb8e0cd45835286c2e4739eaaf538577 legacy-trunk
+43502 bf664a160fc0adc743cdeb8cd8a94e9944ffbd5e release24-maint
+43503 2914e7b4d25a40070fb5a80e3f8af9cf8637e2a9 legacy-trunk
+43504 436b03ffa8a248fd62611ccdd96ec144c19e4452 legacy-trunk
+43505 4a8ef70de212e42c2cea19fb66686c2c302e7ebe release24-maint
+43506 016d3d23ff52dc4dbf0c413445af0b1722dc7e90 legacy-trunk
+43507 a7f8b0be597e57384f1ef1f1a9321521cc4fbb2f release24-maint
+43508 47fbba849a6c81973088a4f94bb19da5751be20a legacy-trunk
+43509 8670a2701a0f96f2b86d595aa2615a4bb980cf53 release24-maint
+43510 fab672c3dde6587432597cce09f85fedf3a0e484 legacy-trunk
+43511 462c9d2a07bb37ca286cb2c46f45291f04eef057 release24-maint
+43512 98251780236d7f44ab4b029a00c328b773ed11d9 legacy-trunk
+43513 f05bd98d935d56f5ec18b555a05683ac149b5fc2 release24-maint
+43514 e546274d6503ea22134580b576807b1b3fb24954 legacy-trunk
+43515 59185ffa861da0f160e3a9c260df25f45c1752f4 legacy-trunk
+43516 b47d8219ecd61fdaf90678760e833220fdd34535 legacy-trunk
+43517 35cf91297693ef04fff6a44d52049668fb27d322 release24-maint
+43518 b823f5fe980cc39f0b845121114fcef8249100fb legacy-trunk
+43519 a533d5b5db84014e7385a2b32194732b5cf83781 release24-maint
+43520 05914e8ded73edb99eaa34facd2334f503b8972e legacy-trunk
+43521 858ae954f055876473379f9876a8628d6fb2bc1a legacy-trunk
+43522 870d56a3a20be485a6cf2c07ad1f74d005771a66 release24-maint
+43523 492044034a87bbb4ea45d95c7babc26f538ffea0 legacy-trunk
+43524 42312e5f11fd115b3082251be1c522359dc712f2 release24-maint
+43525 f64812b2b5c1cb4d19692ca826a325480750bbf7 legacy-trunk
+43526 b068aee1dfb5b35624e018ce12ed844a3aecaff0 release24-maint
+43527 6f0863bedcea32d1cf33dd4a82c7a8fce6c1fa0b legacy-trunk
+43528 b0981f0c18feb6ec3e7f61e627454c01ef6188fb release24-maint
+43529 8d0579d2b662792a3e905d03a631b3750eaf1b9b legacy-trunk
+43530 823c48d6871ec793af3ab584b202ab5f991d4bb6 release24-maint
+43531 2cce9bcdc9f64595ba51ca8efa872e3e693311d2 legacy-trunk
+43532 5f357e60cddea59cf151db0927271e6c35d8461f legacy-trunk
+43533 91e9fb5cfe14255b39638de77df1b0f42e3a8c37 legacy-trunk
+43534 83988354b64d9a88bfaec30461c59d74cdd9d61f legacy-trunk
+43535 b73174af26a9b5d7ea93f0fbf882f02ff813de97 release24-maint
+43536 fab469361bbc0e4b998b5de12b1d0d650da10cdc legacy-trunk
+43537 ace67e3bca6832e14ba4eac5a5ddbb0baa774efd release24-maint
+43538 3a81dceaa9a8be413a7ef7e8c331b327752b5e55 legacy-trunk
+43539 4ab8ec9e59dfaf3491c3405154ffe5c1ab8804c4 legacy-trunk
+43540 0e4b3cad89fe6c226f0ab35676c2118b94815552 legacy-trunk
+43542 3d4a3f4fc98e8b1faea43e1f067ce6fc10814cc2 legacy-trunk
+43543 5e1cf21d4ab23190ea53da59fa6172a6b4401526 legacy-trunk
+43544 4b65ab41c7717fd5ead3460d81f622e357b4cb46 legacy-trunk
+43545 fe97c0016d4b13ffb757f8d92ce41b5415d87d6f legacy-trunk
+43546 a6bce7aebe05bcfd3a113a650379a62bd9db4b8a legacy-trunk
+43547 4a206fce5fe7a8428d9ab3d4370b5c2e3c8a7006 legacy-trunk
+43548 5a6c7d6def0c9ce55c0e685dde792fa51383d009 legacy-trunk
+43549 3aa0a4827888b2444e90f11bcf7ba69d0d5020fe legacy-trunk
+43550 8068c22c3724e6cfe340849f4e72696d7d548b6c legacy-trunk
+43551 53ef6c377271df8dc8db3a548e034cb7e102f139 release24-maint
+43552 f4d88cfaec60ac520e76d22a524082159d65e1c2 legacy-trunk
+43553 4837722a60f03d9656fa8e0474e7067eae6ff992 legacy-trunk
+43554 cf10f2443542f6d2be4e6d9745c4ce7e785fc69e legacy-trunk
+43555 2cf3b5c451d745b355c3b2ca6ba1821edab72857 legacy-trunk
+43556 260ee391f908f23e2ee69706274c9c315acec849 legacy-trunk
+43557 a06685f088867fa7bac7b87bcc83035643bece58 legacy-trunk
+43558 e955284cd69402dab2587763ec1f0fe21f371e0f legacy-trunk
+43559 85b26f4fa2a504fdb534c9a5126869eb02b7639c legacy-trunk
+43560 2834ccf552f37f67ce7aadbe8629f7ce448fa427 legacy-trunk
+43561 a60a9443e8dad9e2fd08864cf8baeadbb2a24988 legacy-trunk
+43562 9c2a462d66bb73aac8a842d61ae953082dd4c866 legacy-trunk
+43563 4020cf6c383e0606e685a495cbb0f02b9582192e legacy-trunk
+43564 ea9a03b8b9f6b1ee60cf35f5214e063a6b0422b1 legacy-trunk
+43565 dfc33ec7f73a85feab082908ca1a8079aff88c23 legacy-trunk
+43566 7826049acb4b1d3ac112c8b5f7b0c2238f5caedd legacy-trunk
+43567 501fda511b0abd4d7dad7f6f234f92f6494a4bb7 legacy-trunk
+43568 09b8e5a12146cc98f997338fc8b45a303089193d legacy-trunk
+43569 546b6319240062e9e64a7bac2c918d72d62f0229 legacy-trunk
+43570 10040d187c2104f58fbbd4b46fd3520a8a1eda32 release24-maint
+43572 cea54c9d921d57a98e494e3b3f1f4bedb47674bf legacy-trunk
+43574 e82aa8041821a35933051a715c2df081a5efe2c1 legacy-trunk
+43575 a3481871132ce655c144742255c7fd84d27bd7e0 legacy-trunk
+43578 7986a5b131ed2c07d4982171a20073c1fefff9eb legacy-trunk
+43579 e956e16e7444fb24bc8fd14267dda6aea53e5b4d legacy-trunk
+43581 57b1ff138995e87019a55d5dc53d4e7bff206445 legacy-trunk
+43582 3eea65bb896edc063f27abf05486799efb745a8f legacy-trunk
+43583 5133b5b0b4a8458dd5e859750ba45176dff9f159 legacy-trunk
+43584 e14255df7fd161e880b457aafd6f9b9009a9ccc5 legacy-trunk
+43585 92a17a2821e04e169bac1459822108dc00d810d6 release24-maint
+43586 eb69d2e3134ceb0a53d46f2b972e7a62a18a5064 legacy-trunk
+43587 e814ad970fc6a9165d05f4138a324fff192bd434 legacy-trunk
+43588 fbc62db97e439c5bff15215db68284b44ec7a65d legacy-trunk
+43589 a8cd905fd96cd3ead2ee3b4b537d552cc89c882b legacy-trunk
+43590 796acde70195411f1306c1f11ea18e12da3514ba legacy-trunk
+43591 bdbe07d96b8ef4db35ca1a47b11c3cf395f642aa legacy-trunk
+43592 01fd093b878cc77023f45a6d23392c10972a0f2f legacy-trunk
+43593 bbe1cdc926051ad828c8045e30c03dbebaea2e6a legacy-trunk
+43594 115428bb1d3f645be8f88780dec5956ea6ff5227 legacy-trunk
+43595 5cc6d71537a31a95f3d390b1a6737dd044fd2ba6 legacy-trunk
+43596 6d50fd364cf5cb596d3f0d42e7c5691785185bd9 legacy-trunk
+43597 e457b24f98c51f73f8069ef1b4f292873abc7f8b release24-maint
+43598 35c4b0933a8b7e59d164bbb43a5d3e7a651967b0 release24-maint
+43599 f5ad3c7ec2cbf453bfe5b8a229b95f38c63ad31d release24-maint
+43600 bc9d53c00dad6c363010478dd3041602d5a1b315 legacy-trunk
+43601 e2b3a7d9aca918ad5c52627225f9f6f75ab95b73 release24-maint
+43604 1049e9aeb38509feee1da53ba0d1bedc482b1e69 legacy-trunk
+43606 a3830377e1a796219c124bfdcf290be3301251cb legacy-trunk
+43607 2cd1e5b15e050de3bd6e4a3ca7c365b2a6e633ad legacy-trunk
+43608 29a06a2f3f2d8f25837c67805d10e0f29dd94064 legacy-trunk
+43609 60bed641b6d033004453f8b76942ced410f39c25 legacy-trunk
+43610 5aa3cef4a8a7b4922ac83b9a453d5aaf07b812dd legacy-trunk
+43611 6dbea911e8810a4a25325a66a804fad9c61defb7 legacy-trunk
+43612 0f3b7afa187ae66bdc1760d0feedbbdac8236d8f release24-maint
+43613 49dbedfb1d74830e6a155991736d9f33c1a4e94b legacy-trunk
+43614 16a64e3946022fb8b31f6ac5242abaaee9ce9e2a legacy-trunk
+43615 eff6c53483ff39a326463d47099d633f623ec226 legacy-trunk
+43616 07e44fd06cf7639e7851952cc7e972dffa678cde legacy-trunk
+43617 2f57da921aef7c1ea6799c799a72e54ac578b5cc legacy-trunk
+43618 dcce81b7e64d03c855419c2207f41f7c9f7c14fe release24-maint
+43620 d27058c409df3c695cdc507399730d6dced05894 legacy-trunk
+43622 c1cef1d2dccf4b9841f6d0e448707c7a35f25af5 legacy-trunk
+43623 d2697c52ccae59b92b00b73aeeaa062bbb90153e legacy-trunk
+43624 6ab15fc85c2d0c68c77cc695f87cd26bcde9b7fc legacy-trunk
+43626 b603307292fc74ae86af6a558ee10437adc8a3c5 legacy-trunk
+43627 add007870bbdad390921d920a64d3d2a25826790 legacy-trunk
+43628 d34516588272aee1c83b98e4db543bfa89fcda79 legacy-trunk
+43629 2c38ee4bdd8ab295e499ab533744b2ecccc1cdc3 legacy-trunk
+43630 c115b3ae1c1879a3b00bed0e57bb7aec97104a6f legacy-trunk
+43631 1f109a4953c69a2391691144f668b11eb7f90efe legacy-trunk
+43632 04afb365084760eacea6dd8adcfa2827fa04fb64 legacy-trunk
+43633 a17b5294e993ca96fc101ce5b98df99c92213047 legacy-trunk
+43634 9ecbce55a45465d8a04bbe4de9407f92726eb77b legacy-trunk
+43635 8efdef2ecf3b19585d125bbd03226d64091f79b1 legacy-trunk
+43636 f8fc30c0fc7c3452193a1f8c3f3b1e9b8a86b779 legacy-trunk
+43638 20ffc2ca03e0ca51baf89660d8fb9c3e69662011 legacy-trunk
+43639 62567bbe7d88da58b014e9039c0cbec473e7f805 legacy-trunk
+43640 58b8d2982144f88d365cb4992db9aafa94463660 legacy-trunk
+43641 e6582905eeba6b56bc7f25a3adb86414888ab728 legacy-trunk
+43642 903e3162099e290f88b1be517188e1cc9e803fdd legacy-trunk
+43644 852f1c1a89b4d34e617987148162db7a92d00d31 legacy-trunk
+43645 e709e62886e6039452395205035913dfaa257bd1 legacy-trunk
+43646 d6ecba596e1e6891d04a6a1bd8e679f39ae7b0df legacy-trunk
+43647 296392c710690e60dd14d3d4ebb113c37d5f9361 legacy-trunk
+43648 4a999c6e00c02fda5ae01355e58c5d26d8967f36 legacy-trunk
+43649 a982b02bec0bf1845062bf585a4fd1a6a1a515a6 legacy-trunk
+43650 105a8dd018516653bd015f666b783aae3c790684 legacy-trunk
+43651 896f9fead17e720ec4a21de3ac214518da84845f legacy-trunk
+43653 a0f2c38d85f453ac96e596eff27e0c041330c9b5 legacy-trunk
+43659 395b1f5c9751493cae71b4e84140cadf19294668 legacy-trunk
+43660 4b761a63399c427bb78b53d2f8762f2c847fa408 legacy-trunk
+43661 69f79517761d12a63eef06ddded79100a1f51a1f legacy-trunk
+43662 dbf5b2f2a42916870174276d1a8c65f03643145a legacy-trunk
+43663 653338aa69f2d7dc0d16bf71fee698c222b1e922 release24-maint
+43665 09990661226dbaa5c30de14c947db4d60105ade3 legacy-trunk
+43666 ed6fe7291083998e56c359ff672194c0710e432b legacy-trunk
+43667 976c01091b385ded90452e1bf5f58482535ae8a3 legacy-trunk
+43668 d3969aeba777d1006cdf99db460a8dc8a40e3872 legacy-trunk
+43669 4898f196a24debced5b485875608745a383aa4d4 legacy-trunk
+43670 3d4f353c3d4fb2694962b2564d79ed977b20b2ae legacy-trunk
+43671 48d12def32b3c8ceb99447f00f7fabb6de7a3e7f legacy-trunk
+43675 97bc348dbc5df2d9d86190caa341966109e4ebc2 legacy-trunk
+43678 5ec8883a2ef9a1642b6c07fcbd768f407d7154f7 legacy-trunk
+43679 f6635f304695e66bf595938df773c209ed9c4db0 legacy-trunk
+43680 48cde2f8d50e1f139321d44cf3ff778bfca47ff8 release24-maint
+43681 369bb5f67ef6857d3150b40b3b57aea83a2208b9 legacy-trunk
+43682 960bf6aa854dd665ccfab9db388a8b110e6086f1 legacy-trunk
+43684 fc8c90a44e68b793279b3f50dfc33b7d1cc6bdc2 legacy-trunk
+43685 1daf4f7b30216a11dbb21c169ce2a613ddffd3ae release24-maint
+43686 5b119f256cde5eb11a6df2a21bf6a0f5b4ebf567 legacy-trunk
+43687 d5cb772322bf67c3334c31058e38e0513f911511 release24-maint
+43688 3f095c55c2d9b1d4d7c17e17ae491838b0140a4b legacy-trunk
+43689 4284879a18ead863eff4cd7128730273485e3a65 release24-maint
+43690 ad4f7550d8a406258ae8c6b9cdd0b195828e6412 legacy-trunk
+43691 d1dda1148f10969b8e125f147a4000fa7228f37e legacy-trunk
+43692 d03201f2f9c24a593b898864f3864cc992ed72d9 legacy-trunk
+43693 2b0a5eec028b07dfcdaa0b6c07e87dc2142482cd legacy-trunk
+43694 c16b752ee93bc2ada61f51e337228eb7f4ee6143 legacy-trunk
+43695 7cd3bf2399e620a6342bfbeba920ed40ff93f0e8 legacy-trunk
+43696 ce4af5416d765eb5fa897dfe18a5e4c3cf85c088 legacy-trunk
+43697 79d3c4ad93109b799a9b9fe10f01e1fe8a2fdfe7 legacy-trunk
+43698 ff7187dca2f1af411a3e3e03369495762515c4f7 legacy-trunk
+43699 21141037a1233bd94ee28bd040d3ffec32c870ad legacy-trunk
+43700 7c4048ec0c688c5e56a449da06e7547497c1a853 release24-maint
+43701 5556ce99f20c4846f78d56aa7354aa477197ed46 legacy-trunk
+43702 0a014884017cdcc63e1e533a05040c381ac4f568 release24-maint
+43704 01845a247c8b155e6a660304fecdeb9c82fea29e legacy-trunk
+43705 8c78288d0dbbb14b81f108844f36efb68c8e96c6 release24-maint
+43707 b43db87a9752397eb15f5b85505471a71aff8a39 legacy-trunk
+43708 0ae1faf411fff22415ac8ee4d961b332e12c5631 legacy-trunk
+43709 0a45cb30b64e0bec093a6d7891f9f58affc23f9b legacy-trunk
+43714 a9df9b0ba4165e4c8a5e0ef195b3c9d1b85f0eb6 legacy-trunk
+43715 3c7ea50518be2215cc3b12196fbf9d88f1d07b8d legacy-trunk
+43716 d22cb14da67143e7808a8226123b600585a51c87 legacy-trunk
+43717 1583d3fdddcd76a8029b8ec3c8dbbd66f9f82bd1 legacy-trunk
+43718 a9470eb637f194880771c80154c13eacc9d9cca4 legacy-trunk
+43719 869f3c9d7401400ee10c4a95bf5cbf3d48ba0c95 legacy-trunk
+43720 f8c4aa5413dba0f6d8c237abb5019d5aab0d7a02 legacy-trunk
+43721 9bed30df7a4aea94836e96ec55cd993002499cf2 legacy-trunk
+43722 5bc2b4e3ffc1645f2be3ca1dcfadcac64a91adaa legacy-trunk
+43729 9006f9223d80b5c46d6e54ace46f1712cc4c252f legacy-trunk
+43730 149fe684e4016096bd6a52d1f77be83b5fdc1eec release24-maint
+43731 b3666c5ddd8a0a8bc8cb2ee58b3e443b68a146a2 legacy-trunk
+43732 70731252da34693065463cc4c0df87ae06097f85 release24-maint
+43734 c17c52193169ee44c75221f392f7030e043110a9 legacy-trunk
+43735 a7d688ebe3e1a20328f944ea85e6ceacca523e60 release24-maint
+43736 431613bc935e95a368fe12ee0e7cba232721c056 release24-maint
+43737 70926626c6a0a34000e44f2ae6cdc328ff79e9c1 stdlib-cleanup
+43738 ba8f2764aa4ac09001fe899318bf404176fb8564 stdlib-cleanup
+43739 a8d4928292d8b2b228ab0e5a2a958b2a8d2008fb legacy-trunk
+43740 edc6a0cc8466be61ef4e1881115e1da28e042919 legacy-trunk
+43741 48311401a20ea366a5e15fba753b0d90ada77e77 legacy-trunk
+43742 f1c4406bf481ead23459a2a7eb3a258fab16d0b0 legacy-trunk
+43743 b0528e8c6b7844d95367e27bd7163ef423e9b989 legacy-trunk
+43744 0342c5f0f4ff65c36f2f85db0df67257091b3965 legacy-trunk
+43746 046e6e3483817695427b24d8390d7f80b86f6d3c legacy-trunk
+43747 2cdf527b58f6a29abbf61632193dffc14bbc4610 release24-maint
+43748 3959810bc549132692c3f43a2d4a3cd47c13f1b6 legacy-trunk
+45221 36bcb83ecbad53eb63e23da43404994c8f096014 legacy-trunk
+45223 231e42d0362ed267d3b3532584a6f7495989ab4a legacy-trunk
+45224 9bda5ba41677cf6b31403d5eb4f9589db580f8e8 legacy-trunk
+45225 6ae4adefc573b8eb06c9daa558e49ed89b76d834 legacy-trunk
+45226 286c81689826cabb15772f2a1921a86508441a46 legacy-trunk
+45227 a78bc0bb345962e69029ce3c0990888b14adca79 legacy-trunk
+45229 eb0b9927fffd025276a96ddc240aae2848a8c48e legacy-trunk
+45232 bd375777932d91a3fb009492b208fddaf97ea709 legacy-trunk
+45233 0f2e86d08d8aff22f0929c7d9917b6d90d215e9a legacy-trunk
+45234 42023f5b7d6d1dd73b1e491e7f97321d8a28dfb7 legacy-trunk
+45235 c782cf6b516e42e87714a9d7c5ff6547bf3a07d8 legacy-trunk
+45236 8094cc0c98d7a642ca39aa709d0cb884597a4d34 legacy-trunk
+45237 33423b845554096b2021a3e1ff8a84c08c400d7c legacy-trunk
+45238 3d60151392c2257d6b6a579da299f7016f3cffda legacy-trunk
+45239 213c4198fe23d9bd58585e61f38c472771a64ccc legacy-trunk
+45240 b7440ab5cd706f490fac87047b3f27bb999aaa86 legacy-trunk
+45241 5b351dd7d0815de0e218b67f8e5d0c9befef38e0 legacy-trunk
+45242 0bc3f74a4a4718419eb2ce960fad2ee7cdbb1a20 legacy-trunk
+45243 2e234f4fd763990736de6d49d436209807f4a76c legacy-trunk
+45245 f6a1f55d3e5ce6bb93dc88e588b17e843626eca7 legacy-trunk
+45246 dd085c13c49a75e84bf756abe4db0e6da2c6614e legacy-trunk
+45247 dc9a36c8b4730abc8f935feda6a63134b4d41d3c legacy-trunk
+45248 d11366f7e1e7a586921260a0a5fcab9d391c58c0 legacy-trunk
+45249 7cb6a304460fc00ab0b948d6986e2b7c75a7b448 legacy-trunk
+45250 e29cdf8678fe98e2df0de170e37b9c5bcc22986f legacy-trunk
+45251 00bf8f00ec632757186c5920aa593dcbe8e15362 legacy-trunk
+45252 072050615fc0c166cb7d50d764ce793fe7c56bbc legacy-trunk
+45253 b112d8c7988c317c0dfa9b6962500eb1bda38186 legacy-trunk
+45254 0af7f18087a1fffaf4278ac36b50ce1177340256 legacy-trunk
+45255 1a3e799d06341b4139512a010695c6ab133470aa legacy-trunk
+45256 3b4fdc75be12ce71aa4e1195bc6807c9d6526ff1 legacy-trunk
+45257 292854c43b99b9f3591acf3cef2d7fa8a7a60a2a legacy-trunk
+45258 1ced79f080509c444dd51411547b713131809a27 legacy-trunk
+45259 a8416ad1a5c59c340773e5a78537f1bb06c7d0a8 legacy-trunk
+45260 13dd30974ad6912e9d1869019bbed7c3d60bf22d release24-maint
+45261 aeee85b6a5dd88ad1ec81523dfea2daadb94e160 legacy-trunk
+45262 f77dbc0f98e343521fbd84633ed0fdc7d78d9660 legacy-trunk
+45263 adde9de10287ad45d972b586cd7c643c7e96d5ec release24-maint
+45264 924504b0019649041fd53ef27429c80d7d9de0fe legacy-trunk
+45265 aed1c3c35b8363e83587e910132a1c1df31a5cc6 legacy-trunk
+45266 6dd0d8b4bac574ce4d068529da9db14a922e0778 legacy-trunk
+45267 0591d0322f04c24da5fb8b7318c27edcdfb815a0 legacy-trunk
+45269 1b078493d5382b83f533367fc2ac5bed9a7e4cf7 legacy-trunk
+45270 2b2e9c388fbbe22556c98ef9707d0316fbe69a41 legacy-trunk
+45271 56e00c9b501173464920b4cf5e7bff4c1b626f60 legacy-trunk
+45272 44fb03a6a52497087e0ed2b66cb873096c026fb9 legacy-trunk
+45273 c4c5eeb07739ab41055376eae57e374671f3405a legacy-trunk
+45274 f76b5d987314d7447580f55e7ae9eaeae0e8595b legacy-trunk
+45275 ca95ad5b0fbc61f9ed115ee60086da2727e7a387 legacy-trunk
+45276 38acb91824fcc57354f3c7bfb5dc8f85d3663f16 legacy-trunk
+45277 c732f66c913fd362baba1c5b1a4c05d826428126 legacy-trunk
+45278 e070c316eb4559a8fe89934e03c6b75606b75d24 legacy-trunk
+45279 f448d0075691f952d7cd4bf8b090acfe4cc09dd0 legacy-trunk
+45280 480a5625e2869201744702145d265e49998b0af6 legacy-trunk
+45281 b74d3adbf8885efbda24fe928d31c16cd997ebb9 legacy-trunk
+45282 e60b31647a6b31d07a1751596579e3adf6d85642 legacy-trunk
+45283 7ed0f003ba63136a1588203187bd61e31e8ccb04 legacy-trunk
+45284 7afaa752c77208e33f7d0d5f765960a6a8838c8d legacy-trunk
+45285 cd195e073dd465d0f5a00fbe2b88610646ee45ec legacy-trunk
+45286 0ca5112e3e129a3d084508d0e57a77e4dc42cd0f legacy-trunk
+45287 72ceb1b30d4bbc22aeedc55702374373f174b889 legacy-trunk
+45288 19d99b31555cebcf0e8cf460ea3f67d88a4555c0 legacy-trunk
+45289 1e9d7e66c1bcfa6baccfdf258510481ad0cb0ed7 legacy-trunk
+45290 8968b1242f18994b39d3114a5bf51b65ab19c9cb legacy-trunk
+45291 6fbc11a03bcc2a3b68497fc502298d7feea11b5e legacy-trunk
+45292 f19addd69ad939f20a45342b7dcb7efbc2895041 legacy-trunk
+45293 b43a9702647903f524592d83df9ae4f51d28808d legacy-trunk
+45294 157179d2a4c3522e2f477761a59aa38047016bf1 legacy-trunk
+45296 8a188036b713b4acf801a9e86d7c1423e68d4f7c legacy-trunk
+45297 2fd6ad5822032fba8ae6d52d008aa5793999a31b legacy-trunk
+45298 e808e2af91f6349bd3dfcf1bb706ac4753e1ea23 legacy-trunk
+45299 c8a09fd4f10da7ee103bd19b3bbffb196967d9f9 legacy-trunk
+45300 c26f5e206de79d5489c4518d4dddfb096afb960b legacy-trunk
+45301 a5392bb0744029cf15b171746e317321de7b311a release24-maint
+45302 0dd32a6b2964e23421081c3796e23e5fdb46e2ec legacy-trunk
+45303 289116a52bb1e8e67a1d722534181ec4e12b5f1e legacy-trunk
+45304 1e12ec49df9b4db98430448487c0d2b51d706659 release24-maint
+45305 399a9a72095f930a2323a6683e77af8e39fedb1f legacy-trunk
+45306 17f8adcc73ed86b8f58c2d7dba6303085ca2d59a legacy-trunk
+45307 af056b63ce5360430c101f81f587e5c06617fb05 legacy-trunk
+45308 8831fd822b605ddabeb8c8443b0421fb3be82710 legacy-trunk
+45309 769c6261355e939a2be06c30a2967b64a5460451 legacy-trunk
+45310 2e8ab797ceaf9d748d85ced2aa5dcb7d464a44bc legacy-trunk
+45311 9a6a0375ef2295eaf91d20346aac228ad2757edc release24-maint
+45312 65ecb83ea7ddfd232ee80e1b49449c3ec4a755ca legacy-trunk
+45313 bc4fbbb2db3009f0ab7c0fa089f6709d5250dabb release24-maint
+45314 fed297c2062d928a00465099b71de5633b91236c legacy-trunk
+45315 36e1762ead86b80b0acf96d7b285642226988db8 legacy-trunk
+45316 22f2c92a1da7f965fafccef662cb666b0e9cdca8 legacy-trunk
+45317 ad486e4875c6e183b50f31d774bd186f14f3e6f6 legacy-trunk
+45318 c6e11f804d00f763f4015f882a35e359acc7593b legacy-trunk
+45319 2c06588ae69e6282effde5c6630ea699e4f6cc6f legacy-trunk
+45320 422cdd24af46c474e43974e267764143d129628c release24-maint
+45321 10e47f27ea39fa07686b0d60b65a09cd184277ec legacy-trunk
+45322 4551da847651acc261a33bf2cfee7ea581004a00 release24-maint
+45324 21fcc86e482082bec6bd8d3d19d5315c02540628 legacy-trunk
+45325 8c998c7601910ed4eca53e8a0320ebb8a0a8d1c6 legacy-trunk
+45326 74d04838cd11274fa615380208bc36ba7c887d0a release24-maint
+45327 b5f899c187d4c5ce7a17da169d9a5b30559947f6 legacy-trunk
+45328 12567189ef2571fdfa962df385b2a27146a16f92 legacy-trunk
+45329 dec259e4d8916c65d0005ae240f0378cac5b7e28 legacy-trunk
+45330 2f3f2e32dfd9d76e719863ee15beb011991abcd6 legacy-trunk
+45331 7df0c44f398623698dcf30fb8e737041c79e861d legacy-trunk
+45332 b6319a699daba1d59ee9602b94900a32408d5057 legacy-trunk
+45333 2c084d81c951401dd09e03ead821f2f5bf2dfc39 legacy-trunk
+45334 054acedf3c0d90c14419b9de01480a18d44bb92b legacy-trunk
+45335 f45bc241e2000b2ea2c7e36161ca2154ee715ed9 legacy-trunk
+45336 b1c6a3864b1e8c16908ea730c9dfacd0322e748d legacy-trunk
+45337 0678ce9fb6b2b1110fb6b6693e2396ab15c65f0e legacy-trunk
+45338 a840e9baff96cc97256dac2e5f4d01d2661ff681 legacy-trunk
+45339 d13ded9165ec44141f080a1691954006b2e3b4fa legacy-trunk
+45340 66676a8ecb52ce4c0320d05ce48686bf32addfc2 release24-maint
+45341 5a9fcd676b3fe9ed10871dcebe1f233fe917b1d0 legacy-trunk
+45342 b1724e926e07c4695f4d0e55b4d988f4cc0046ba legacy-trunk
+45343 4342e441b11ccb55028a5b3cf200073c2f3eb637 legacy-trunk
+45344 b93c05960a15fab6c7f86acfffef24582c35b348 legacy-trunk
+45345 36bfe46c5c6a63cba91f633d90c1d33db0c788c3 legacy-trunk
+45346 3f9739de66033353c3845c2781b13b84af418126 legacy-trunk
+45347 0a28f157875e2c1144f89216b613c34ce95290f2 legacy-trunk
+45348 606818c33e50fe67230830dd755b484deffff802 legacy-trunk
+45349 a4231aa3201ae1a394ee643c5a47c7c194f684ca legacy-trunk
+45350 86db6df2417448daac0a42fb5d8b86ea00099b3f legacy-trunk
+45351 3a39ed597b68aaf7603008b3d4862be893aafb1c legacy-trunk
+45352 e795d6c86a5ede9841a0aaa4cf973acc1e879e4b legacy-trunk
+45353 30d6b9eaf02db8e29f3faf63ea9b29cdc235eac1 legacy-trunk
+45354 58640983fd66c69e79be9313725e57e975675ed5 legacy-trunk
+45355 fe88e01ff6de8b4927bd872e991eeddf2a9c1dd0 legacy-trunk
+45356 23edf290b676f20b8d5500788eb9ad2a97707dd6 legacy-trunk
+45357 5a4b9641232f85ffc50899b17094a3e73666b67e release24-maint
+45358 4133e841f0cb91dd18524f4ef7a1a5e39af890eb legacy-trunk
+45359 399b119c058a1b96ce426beb49eab0416234cbb9 legacy-trunk
+45360 5e72b0c74100d750d3a9de9f05895170d53ab244 legacy-trunk
+45361 953eb3dc18e5431f104657239eb9973a7536f569 legacy-trunk
+45362 99751289ea03bad35f599e815eaba068785871a7 legacy-trunk
+45363 b350e9d791e6e2ef730ef277ee47299364b75de9 legacy-trunk
+45364 1b5b16cdbe0e1a0bcbb37426d62fcc5349cd6363 legacy-trunk
+45367 751f7c79b5fd14594258c5c013d663be5559616e legacy-trunk
+45368 eac83feeb11f6c8cb42280ae9805bec2817b0b1b legacy-trunk
+45369 4d7b2237fa07f371f89fe959075f60f63eb1f994 release24-maint
+45370 308e2e8ed67661a22c89b9a1459e2c299c36ecab legacy-trunk
+45371 91aec47462185de437428a32e34cbc91804e90e7 legacy-trunk
+45372 ac79e9037e06cf36d2f93dbb694370de1ae514ac legacy-trunk
+45373 7204748c29215d8cf4d65bbd6785381e755b2da5 legacy-trunk
+45374 7ee4068e2c62a250e2a9eec2bf98bb0923dd6d0a legacy-trunk
+45375 254cccb7ef17699d9c831600bca87e9c7cdba491 legacy-trunk
+45376 e057af2dffcec318e07e1c011370961bf630f728 legacy-trunk
+45377 fbcdf7c0cc74d3135cbe3e485d28cde77154a6c4 legacy-trunk
+45378 0a0d89d710a4df15be62c5fded1189e0501aa133 legacy-trunk
+45379 9b22d8b7bcaac43356180e60f6d9752a26f4998c legacy-trunk
+45380 ee57349744f3711ab3de0e0c6faec2d89639c92c legacy-trunk
+45381 bb3f9076d079c5f443eec1d572c08629e6ccf115 p3yk
+45382 9150e260c4174a75994083ad5e5afa46ed58674f legacy-trunk
+45384 d71f26e64489eb1f7ed394fa87afc5ade023560e legacy-trunk
+45385 786d0356de513a2fb34f1e0248970aedfa71057a legacy-trunk
+45386 230fff6e0618d241b1ec276b68ee7f7230b8ea0f legacy-trunk
+45387 37a8eb74c50465136c5546a99adfc6f93d8e7a81 legacy-trunk
+45388 ccb3af49bcb301c725fa8591a351b2619edd2ebc legacy-trunk
+45389 233b10ecfcef662eeb9f1ca94a52bc2267e571d4 legacy-trunk
+45390 9bef1debcbaa7f77695324a2915e222bb3a99c69 legacy-trunk
+45391 91d16a87cbe8ea76e72825b97f03db8f3dcac13f legacy-trunk
+45392 ec986aabe1fdef27103afa51783a9d9efb76a110 legacy-trunk
+45393 afe56b9b664b241776c54538ebae2f8d1c050907 legacy-trunk
+45394 1d5a4c82061e68da3cd1d8d8291392a8872957b0 legacy-trunk
+45395 d7dc0085dd85c8c464500733ab3c980f922a0e48 legacy-trunk
+45396 af47da5e9ce14db4ace220ab9fda08e048ae3098 legacy-trunk
+45401 cf71c3814b0b3177c9c0290941ac2b9bbea0064a legacy-trunk
+45402 1366bfa084ee7171a4f02781bbe979ba89dde5c5 legacy-trunk
+45406 856bee1500bbcdeac0166a6309e37f3817af07f6 legacy-trunk
+45407 6441f6fa6571a7d2ba2650f3f34e6e91380ec363 legacy-trunk
+45408 b940ac4f95586abc0a784aa35a42c9eeae2d6e9f legacy-trunk
+45409 31929da0b05afa12954617e410e385e66bf48e53 legacy-trunk
+45410 6e9ab87c608cd905537a9fcb07dd521969660266 legacy-trunk
+45411 27a639c4471a4e0073b609d0f6fe91ee65c33136 legacy-trunk
+45412 62c9038a578a8a9227e72c0be112c79a421c42f3 legacy-trunk
+45413 588f97b24bf9e1ff656704ad439d2523ff65d390 legacy-trunk
+45414 c6df5e795423039c3848eabc5791126615b0cba0 legacy-trunk
+45417 5304059e7de3b1b33b2402fd909122dd9cda8df3 legacy-trunk
+45418 9b16e8161df777d10186eb98635885cba2c20052 release24-maint
+45419 bfc48ad81e804cb25d65932946720f5885c72d86 legacy-trunk
+45420 9f82103254fa4ebec5178c40abea0360a1335326 release24-maint
+45421 4c6d4698a115dc7774502ef1a5272594d802bbfa legacy-trunk
+45422 05af39a9075435dfb1fba466a909c0f3c930d50f p3yk
+45423 b0270c68042ed4784acec7ae01f108667b84916a p3yk
+45424 0a13a96585c3d367629062debeda20c7224f7877 p3yk
+45425 4cc34af019d2c263b760fa1e879562b6f4751513 p3yk
+45426 fb2aff1862e46f18d2ccbb02ade55556bc85e6cf p3yk
+45427 8daae7ba078a55453abc4808511b8583533513b1 p3yk
+45428 a67f2158d61b1aeaff9bc378a57a759ee36622b7 p3yk
+45429 c47cccca0bf4386f85e06d8545004c39bfe4aeef p3yk
+45430 7cae622edcc978d41d318c3b9732ba60cd0829d4 p3yk
+45431 a5c977e6f5da148be7836c9d8f5d5c00bdbd841c p3yk
+45432 353fe06dab5b3725c7a504fc5eca3cbdd76c424c legacy-trunk
+45433 636ca80a8cbedc705be6c47fd0158d1893fe29ed legacy-trunk
+45434 a5902e0ec07c8ba869e9b775c794c510d5818129 legacy-trunk
+45435 d1547426ab6106ecad2d3bb0ef360f47f6c744a9 legacy-trunk
+45436 240098935cd5ebd18dda30d1ff49d8e2b8d1eec7 legacy-trunk
+45437 63145c06deeeb483f34bf9281c09c4a1d6a6d0ea legacy-trunk
+45438 1d02374f4c7e1a5a46221c06d1e86751d99f7480 legacy-trunk
+45439 7f72791f0aec32f6904787a72b973a779b7d6627 legacy-trunk
+45440 abf82461e6b4df51f5117f1253631852f16c85a3 legacy-trunk
+45441 9e382f2f439d977523066e6f5ad7a810b7fcd11c legacy-trunk
+45442 b7373bc3b09f3392bba3262d12cef70a5e714446 legacy-trunk
+45443 7b2e436a4a211c2e57bf4a84be21f1a5cacac9b9 legacy-trunk
+45444 e1388aba989623ca016c679f4b4c6a6c75f34f6d legacy-trunk
+45445 9b78dc07b170cc665059496014df103602314df7 legacy-trunk
+45446 353b59651e450e142624094140e4a44332f4242f legacy-trunk
+45447 9eb4dc1cc83e7a63124ab8cc82c8fcb0393723e6 legacy-trunk
+45448 833f384ebd41b6302f2b71dd376d6280f864c591 legacy-trunk
+45449 a39cc84ff1856c7acc5bc781c67862b70c703ffd legacy-trunk
+45450 b7a3972e9915727e973a84684f20ccad5e4da395 legacy-trunk
+45451 96addaa2586970b08098f8dea5d2273e0765f07d legacy-trunk
+45452 0a54c15aa143c4d600208136d01e776b9867a658 legacy-trunk
+45453 f1c9853df0f7d4ae6a4db497c2ebaaf7bbd00f6a legacy-trunk
+45454 7cc31516f8258ff162880107ddbd3ac6ea7471f9 legacy-trunk
+45455 38d17d51ea95d44875041b89c050167f2c75160b legacy-trunk
+45456 01e51f5db881b85ba1e7ac9dd13659138459eac4 legacy-trunk
+45457 31dcc3111133be7018dc04f2d21f7a8ab61bccd7 legacy-trunk
+45458 084d188e7dbef7aed699ab27b0c708fb697965be legacy-trunk
+45459 b90a7c6021bcc42382da688f4f5ad0b442683147 legacy-trunk
+45460 604c9bcb306c6d26bd31b22b96679f208acd0b2b legacy-trunk
+45461 5bb6e54f9408f6176c9059d7f3b9d6edb69d251c legacy-trunk
+45462 d8b23ba4a274ecf4ed76ddc58ef0039142f2ba78 legacy-trunk
+45465 b0044bb4df2aedcfbf311df5991d9cdb5d52bab7 legacy-trunk
+45466 d4ae5a26157882e1d10f79a4266d9f5f919b05d8 release24-maint
+45467 be238cb26d325e35832d7e9e1ae50dcc1853a472 legacy-trunk
+45468 7bbb9b5f7adcfd8e1994465541b78478f8e62c39 legacy-trunk
+45469 b95b5c33cb3a5331bea7c5ac5f7e319300a5dac3 legacy-trunk
+45470 300bf1c4deede7c1d3eaf7c75fe92f3588daf619 legacy-trunk
+45471 ddf8c9145f1363e82f8c43c7b0a09fbdd3a90ae8 legacy-trunk
+45472 b5fcef158133a976f61fabe652f3831b546d3f92 legacy-trunk
+45473 e239d745c6474037600ca1483da2c65f1c8a7d53 legacy-trunk
+45474 2c76f71b223de75a88caf9fce6712e2f2d925336 legacy-trunk
+45475 5c453302d5f6a0ec42149aa66e7c5d4e4218cc0a legacy-trunk
+45476 ec00b798ab569eae847eb6f6ac87f178b0d58eba legacy-trunk
+45477 335223422199ce4332868806f2a82fdd0115b833 legacy-trunk
+45478 dda7cc88c05aabc061b9b95fc819abf4158311dd legacy-trunk
+45479 c04136a8062a1dbd525f83b6aea61bdc70c8b28b legacy-trunk
+45480 384e91202578f91705dd10a9832ec342f4729f6c legacy-trunk
+45481 e819b86a1506a0373513e326b2c292aff91989b3 legacy-trunk
+45482 c94d7705085a545c3f81d76a55e8fb2aca8d8541 legacy-trunk
+45483 19c1bac15bdea148730d49cba3054bc973d5a040 legacy-trunk
+45484 b374140e467d2e9a3fa1b259e785acfaf4194d75 legacy-trunk
+45485 f7991ce431e52ef6707a5e9cb5ab029f50dcf627 p3yk
+45486 6f35f7be36c3d45f7938136ee7742194519d68a0 legacy-trunk
+45487 81bf4d378b9e679d7043b6b37fb8a2ad2ac0d77d legacy-trunk
+45488 702d597f2f689c2cfd4a9bef80717c11f77930bb legacy-trunk
+45489 f117a5fde4e59bdaeca20e4820d4bde47da015d1 legacy-trunk
+45490 4d82093e2e1978367166d2e38873072a8926485a legacy-trunk
+45491 fbbc0beffff778fa9a38a8b906aa98ef94bb408f legacy-trunk
+45492 19d2477c1283168b81351c9e95960db38f525806 legacy-trunk
+45493 6cfe48e672c4e08b84af479f9d053c74b623ab22 legacy-trunk
+45494 efe749225bae2c652f8198c55880bf07ac35df48 legacy-trunk
+45495 df9ecacb0bf67c0a53842ca46fd6ebf8bb7ac2fd legacy-trunk
+45496 5f457f426d916c199dabf1cb522db3679ea1e942 legacy-trunk
+45497 ccc0b5412799ea911a936d7a9364837c062b685c legacy-trunk
+45498 086d8434c7f7dc2488296d0c87041d341daa150a legacy-trunk
+45499 5997d7ced17d7dff378fb3212f8167c8f02dffe1 release24-maint
+45500 6d8e3e65947f2a259bc1e0d96cc6cbd6f53de7f6 p3yk
+45501 9274879f048428b8ce685692b1e131dacc697038 p3yk
+45502 85695de6049e013d04af9de3b11e598f7c1a34a0 legacy-trunk
+45503 8625e4a5ce4d0bda4521789147bac604c174f224 legacy-trunk
+45504 20cb13bdf1f009d5e9cf7d62a7d7081213066442 legacy-trunk
+45505 acb61836f7faad9d136c8d041f16020f3195e871 legacy-trunk
+45506 cc9192505b405bc9c7226fdbd256af5ec2753fb2 legacy-trunk
+45507 2e3276dc231f7605e3db33d143e2ed50c8e459bf legacy-trunk
+45508 61ac1e322da76d97ee307d149e7fb22066500def legacy-trunk
+45509 6eb86a71f5c81673cad27ff295bf985453de4d65 legacy-trunk
+45510 3135648026c4aed521f2ddd4fba3c7ba2f7c7cc2 legacy-trunk
+45511 3ede175ead37a8996d54d2902d4cbe0ee9cfb30a legacy-trunk
+45512 a5e87987cae63ea8c0b413b7cf1903d6de053f42 legacy-trunk
+45513 e254b922c4f34ef0d1b9d40360f3bfe41cc8061c legacy-trunk
+45516 fc5897418f31bd4d66dbda6fe7de82d860dc9d3c legacy-trunk
+45518 f5831ff7cfbd2baf48f64748a07120a02f878eb8 release24-maint
+45520 4577b243b981378dfca324108e480d7fd2e78fec legacy-trunk
+45523 be2a7ec462fe4179f2d43133edbd93c2f574c0f8 legacy-trunk
+45525 f048116aade0578cd2cd87e88acc258e2de3806d legacy-trunk
+45526 e892b544283508aed546d1ae29c5f1b662e54f4a legacy-trunk
+45527 d82dced6f1fa7407a3ea131b63481e8499777561 legacy-trunk
+45528 174062f7c1be0068a9bf578b8a5b32812b2f60fc legacy-trunk
+45529 ee90ab26086aa4353986dbbb77af247fd19b3276 legacy-trunk
+45530 31b0cda11a6d6ec9217a265e0fcc85530c9591f9 legacy-trunk
+45531 d488244df2884b145df3802a8a248bbfe5afeefa legacy-trunk
+45532 638644458fc7529c6b389f7ebc7debef556e2408 legacy-trunk
+45533 17ccca590ae93775e80b00b61ccec79c8b4fe0a6 legacy-trunk
+45534 cc48985c3266c48d1373f55a168ce357e8900033 legacy-trunk
+45535 913d3790fd99e91fa951b32004cf88e824633bb7 legacy-trunk
+45537 e0a6031df7c0eddf351e6d7b26917b0997647f16 legacy-trunk
+45539 0c0122bd0ea31d6c4e69f38f913c11ed13be02a2 legacy-trunk
+45540 240fe495d18670a222bc263bfe5a797cae9f1ad6 release24-maint
+45541 488fbb4ca8e514d6ff0cd8a493ae883c0470a3b7 legacy-trunk
+45542 8725b907acbbfedfdff2d49b3aaf14270beaba3d legacy-trunk
+45543 35f27bbd9ad8a2df5f77372bc592342f11572d97 legacy-trunk
+45545 d64badac6cf31265c9ae6574fb186d5c979f9aaa legacy-trunk
+45546 12ab20cd7c273a1c1c336ecd91e2a33ead4b3274 legacy-trunk
+45547 dd4156c36703facd726dfb741f14e3de1c700be0 legacy-trunk
+45548 41f13b56dc32bce8496f71501705842f93f9e99f legacy-trunk
+45550 ebe59cd1827302dece80c09708ee647f29838126 p3yk
+45551 19045c5f0ba2dac6385845aaa827911c6cdbe8c0 legacy-trunk
+45553 80e00349647d0d3616b1060e734ae1bf4dfce757 legacy-trunk
+45560 29257ef6abeb7e01d138be1b09f235f921367661 legacy-trunk
+45562 b7d471e1204276af28e4ce288160e08b599df7b7 legacy-trunk
+45563 dc8efd70ab5686810f1a66957517f431ba4fdff5 legacy-trunk
+45564 acd8fba619430f81bed0af84a62b4d1e316cc695 legacy-trunk
+45566 a4d5cefc2de40851c80722b8eb30569144094eed legacy-trunk
+45567 74f459a289be9dd0b2f8840c527790d67fff09d6 legacy-trunk
+45568 564ec97365f9d9facdc34f225f7d37eaa7dd5ab0 legacy-trunk
+45573 d4ae9c0325b1a79fd939e26f443c2d710fc01e8d legacy-trunk
+45574 e96d1cad468205a37c7c0bbb3bb2333185936b5f legacy-trunk
+45575 47ac524db8a7c83e8de4a89a141f209f35a7f495 legacy-trunk
+45576 477bf930f3e7f4ed11e5abbb4d00a9df9ddb214b legacy-trunk
+45579 75e706c36c864a147f6e34cab62326ad4d0f32df legacy-trunk
+45580 d3e5c956581ce2ece80674dd6b1176d0d092eb41 legacy-trunk
+45581 b0f37f9fc63ff9b6704f3e8d8c0d890da3b030f1 legacy-trunk
+45582 4c894552b9680f55b9c5a37ed2b7b65ea0920c72 legacy-trunk
+45583 2fb16a62941578db0787f1fda6588509d3060652 p3yk
+45587 ac127cd866a312f2a3bc71a31894c2e2e33364f9 legacy-trunk
+45588 c4341e6c6a03de4b8edcfd39a58bdbe98f932e88 p3yk
+45589 a47117fa3ca88c460b5ef29230b70ca6ee5f775e p3yk
+45590 b0f88143dc5c950335b38ef20536a3f881609754 legacy-trunk
+45591 d35db84ca072cf49ae23f97531494cbd64e819e9 legacy-trunk
+45592 b9aad6a74452dc5b710eb5aebe38c5393538c86a p3yk
+45593 a4c70f3968be7d9f80a63a2b268e375583123545 p3yk
+45594 8df6079633558e42e197410713af020b375f2773 p3yk
+45595 6a45f26ea619e570690370ff8558eadec85f02fd p3yk
+45596 b68d21364916713b53cbf675f21537638880b214 legacy-trunk
+45597 f731859e9b3b91264b312a82c3128d66a42d8ffc p3yk
+45598 96aa5ce86445807be473fe9335059b1ef5bcd0c7 legacy-trunk
+45599 702d85d9418a745603afa8500c043690bf6361ce p3yk
+45600 b2724a12ddce4ffc6f3926596272c22fb4f7fdb2 p3yk
+45601 72245159299e0153afe2bc197d77f11b52c88f3e p3yk
+45602 b49843a3a1df4a4bf52d2257ea00944993ee8e95 legacy-trunk
+45603 9bb6e35c1cc418b825b4579816b8d20c3d161065 release24-maint
+45604 c28f74bed83bf84bda0f6c4c8090c68b5a393a78 legacy-trunk
+45605 301c4ede49dd6e633f29dd7afe5102190e28ed5a legacy-trunk
+45606 5bc915feed140a1fb81caa07cefc3a865f284af5 legacy-trunk
+45607 8102557afdf1766e14fb199c7bca9c3354a6252c release24-maint
+45608 749ad2a3693f22be7d0035b2bcb8ff112de4183a legacy-trunk
+45609 d62c9f6466381e67d9a0c508516241692e06a5dc legacy-trunk
+45610 bd7853394c7aa5fa296a0a122ce9ab4690da624c legacy-trunk
+45611 d18a2c8666095a37eef8dd6f88e31c5428babf8b p3yk
+45612 73d8e89777e330277ea483af40749d73d147d017 legacy-trunk
+45613 91a0981ec4c2c1053e9683c38d2941de42aa545e p3yk
+45614 f9eca133cf8869cc5823d7e75fff8f6ba05000e2 legacy-trunk
+45615 a31202c9485daceb6d3df4142e4fba729203beed p3yk
+45617 78140be5315bc7ffa40fb9ec6f4ae459a3915871 p3yk
+45618 37c28a6ad5011c87e7fe4b8b77cb2c8d08389d6e legacy-trunk
+45619 50e0bd2e458816a20efde659ba8b8e1e5aff2da1 p3yk
+45620 fd6f190e26a8c119e80648c64bad1215192f571f legacy-trunk
+45621 52551221a132d551792b9bda630be9f37c25f922 legacy-trunk
+45622 56089faba056a0c07bee15155acd9402b047fcd1 legacy-trunk
+45623 06dcdedfc98fa7fed4658fa737a4ac936a974a45 p3yk
+45624 c2ae6db30572b384e675037a02619a62384f1ab5 legacy-trunk
+45625 fd29ad0bef708395c4f7996467bcc71c23724958 legacy-trunk
+45630 0e0e315b4202357ce3c54f0dbb30885e92732dce legacy-trunk
+45631 c7ef92b9045c688a37a44c6664447a5d7667a3c0 legacy-trunk
+45632 7204fbac579cc8ac45a2d30bc4d75d339e84df87 release24-maint
+45633 6c634c6d77dd8d3a0018da8a0b3afbca4f585011 release24-maint
+45634 3f1431a9edcb71e9696ebeb39f9144a5517e2cfb legacy-trunk
+45636 628f41a8b1ce038380dd4b0f9f1fba01e718b2a4 legacy-trunk
+45637 54f155369a9c129c31cf973b06a06e0c6e35f370 release24-maint
+45638 fa6b49ba9ae9b518fbf175829313f52501724e2d legacy-trunk
+45639 ce2ec8c835e935e90972905551aa7e5dd481a037 legacy-trunk
+45640 de4a5f55e21de13a6ee481b00e8bb87d0dcc5e24 legacy-trunk
+45641 fb1837e88e72b63b5bf34e4f2fdb7b0e25329e1a legacy-trunk
+45642 10f241fc95939f9c9d7c8b2d1c2adc1e816d4771 legacy-trunk
+45643 ab4e65c809e6ff300e6b49a98cb36a3ae815db9c legacy-trunk
+45644 ce5585afc20f9214d478c20959e4bd06a5c6dc56 legacy-trunk
+45645 5f9ea76e20724444e4d0656ba4f4f9584ee8eb72 legacy-trunk
+45646 f49a2dda8e745686d457435c5f488987beb9762f release24-maint
+45647 834fd9b3ceeec20208c71084a0a7061acbcd63c6 legacy-trunk
+45648 9048d76bf01e6df49d994cb1b01b4b03879293d4 legacy-trunk
+45649 7de28495888360516f02979b8b91dbec5404b65d legacy-trunk
+45650 fd808ee68eb9855ee19b134a60b54e617026814b p3yk
+45652 a7f3765ea46429b4f92dcbc5e8804499d6bf32c5 p3yk
+45653 ae6f50600c46b3bf5774e7e638f9d7f526fde21b p3yk
+45654 88da84776119291db8f4323d4d259b0334f74fcc legacy-trunk
+45656 e1252cea439c65eb85d0efebe1644de241484206 p3yk
+45657 d0e4ced487b367e424e52e6eeef721ed96c7df6f release24-maint
+45658 a0aa911be96a31eac15c497bc9059fafaa9cb621 legacy-trunk
+45659 bcf715a98774b04d87a2193c871c9504db6dffec release24-maint
+45660 ea67628ddae56551f300dfb392522a69f0ccc94f legacy-trunk
+45661 e3a8a8de355e3fb96a9a09c44e70e83a54698d77 legacy-trunk
+45662 79959af0f9e0f31e6829d6eb2c98ddf588b53931 legacy-trunk
+45663 977e7a7e155ad43946c1661c49b7fe8444c6ca96 legacy-trunk
+45664 7da4af95ebada12d7cfd7fbe2eb77cb9fd0a8249 legacy-trunk
+45666 7bbb07113b29fd1bac8a7b5767fee3e913ba69ac legacy-trunk
+45667 222b47d67d432b418837f0678881f1da3a66928a legacy-trunk
+45668 d6b1e2b3087f38403d240555457427f3ef34eece legacy-trunk
+45669 c25dd75e06679eef1a9af28da3d19f4fe0123f44 legacy-trunk
+45670 9910665764347a4561340b5dfda4f31411e5a1c0 legacy-trunk
+45671 509b53171954a82de644e98a879863dee17dd1f6 legacy-trunk
+45672 2fd477b614e3f62eb8f03f79b1f65a5a0364ded5 legacy-trunk
+45673 847710e5d7e1661cfbcf9cd86af33f0cc10a8666 legacy-trunk
+45674 1b192037b62f1fb9569e9b1dd4eb6e0ee94b6dc9 legacy-trunk
+45675 58d10d7d0aa11cec83b7929e7d7dbb66248796b4 legacy-trunk
+45676 b6d10dd3f99795d61097ca0da0e2315062f9b707 legacy-trunk
+45677 6f4edd914c586a161f3f9416535112426e066f40 legacy-trunk
+45678 7167c1c0e0131705fcd85565d78624b4af57263a release24-maint
+45679 9c041c88eb6783785d43376ff34e674f93026438 legacy-trunk
+45681 d60fbc54c0d4dfeb2a82657d017552d6147337dc legacy-trunk
+45682 9acb55528680399e6820ecf1b1a8288b2b2699fd legacy-trunk
+45683 adb10afda55b4eda340b64ffbdecdee4b89cdca9 legacy-trunk
+45685 97e59d2e63df6377531c2818565b8514a55ef2f0 legacy-trunk
+45686 dad9b33e78e53d91bada62834ce4e9e927a4e52c legacy-trunk
+45687 c78d306aaccf9125153bdcf7dbd1756763ae0164 legacy-trunk
+45688 2f4d17bcc9751a9c4fceba29c4d1ef4fe4ef27b8 legacy-trunk
+45689 e0b7e34b5971331ba6551fec4221292ff43d0a4e p3yk
+45690 8b0f0735b246ee1563e8230164cca1342b74479d legacy-trunk
+45691 7e2d5d374e3a2f45ace92604cad6c61c3ec8ebad IDLE-syntax-branch
+45693 92f218a6b20b844d35a30ce6d7a817e45e7ba0fe p3yk
+45697 61228e55791f3ef700706c141a6d3d89182184ce legacy-trunk
+45698 acd5e5559e3c278cd7ebb787182801332d215f91 legacy-trunk
+45699 3015520d67ff1bbabfeeb1eddba5de20e06b346e release24-maint
+45700 895b7daba2d6084ac04548f8fb4201b2d8ba5da8 legacy-trunk
+45701 00dd1dae788b7d1182c2b9c4c9005312e51b59eb legacy-trunk
+45702 f33e4ed550b8a4f7128578ce6442dff1cd70c191 legacy-trunk
+45703 449d4ba3cd44247ab0d7c197b269e10f5ccc7424 legacy-trunk
+45704 14cb2eecc6f8944d2eaa272abdf0a7e9773d6790 legacy-trunk
+45706 af44db2a9523a053ae3e2daae45100cc7325fa6a legacy-trunk
+45707 6c124276a1f0cafcdf4da5a5d5be6b7ceef8202b legacy-trunk
+45708 45f84929b2aeb86524958b991c68ffd3b1ecc3ee legacy-trunk
+45709 8e14148386ec04e960d20276949c57c6434a4f0e release24-maint
+45710 a868c218a2131b6b66fe355fb71cf9a751b87ad5 legacy-trunk
+45711 8863fed6c8d719d9a0f81471e665e4d00393d69e legacy-trunk
+45712 1843710f32e8321367a845561d8515cadc63b49f legacy-trunk
+45713 e5feb051c32fdc3ea64a0357db4bdc1e0011f2b6 legacy-trunk
+45714 704b80529664ba4e9897c941d188de56e47d0558 legacy-trunk
+45715 b535c191a44b0820821a3c7eda85dac2face6867 legacy-trunk
+45716 783cab6933477c41c7441b07aa46007719bbf233 release24-maint
+45717 68a7c015a547478401b98d1d06acd45cf2bed337 legacy-trunk
+45718 269c62c7f66a53335fb1bc77dc35b509619ef0d8 legacy-trunk
+45721 d8d900d0eb8a4684cfe73865ee35655d74fc7579 legacy-trunk
+45722 09c425a5aa3af3cec19dd2a8859af0e5e24b64f9 legacy-trunk
+45723 d5e6e49a38790aeaa17d40dc3f2c15f5abbe7707 legacy-trunk
+45724 06c059b92d0bac77c3d10ad0e3d2a358237e5a83 legacy-trunk
+45725 8839ea93b6d7042947927b5569dcec02a56af6c4 legacy-trunk
+45727 f81cd7e9d001f0809cb5a7a65cbad98cdf0f1a59 legacy-trunk
+45728 55644f0a401bb935f5f9d1b3bbb799185b9b29b7 legacy-trunk
+45729 1649704a221a1a611756a1745dce20f48f94b8e3 legacy-trunk
+45730 8dc2a4d8a22e0066f76490cc42b1d11c22c1aa14 legacy-trunk
+45731 358662e2f273a2dba9060b4b0bf12374e62ecee5 legacy-trunk
+45732 fed6e37ad03d1052e7b8861ba214ea58e408456a legacy-trunk
+45733 9cc12bb0b70a86634b87fb5814ec3e42ae88da71 legacy-trunk
+45734 22bb5c63862ec622a96f1692748f3daaf220aa74 legacy-trunk
+45735 7c222ce51bd7fe0cf255a8d294fcb98442ea674b legacy-trunk
+45737 85c9ca5e035adff82f7f73a4ce3cb0643877560f legacy-trunk
+45738 ac068453a78a81261dcc8cf7ff1689d3f6bcdd85 legacy-trunk
+45739 94d9e0de4e49e320e098422b601a27b51b203203 legacy-trunk
+45740 0e809b7a84f178f849f7e7fbc5c50c84b648fc5a legacy-trunk
+45741 26d0770f2b7ee289a39a3b55dcec1c1ee65849c5 legacy-trunk
+45742 5085678573205e5e40be7fd8080d691864e011ea legacy-trunk
+45749 09927f2f7478e63cdb4ab5808a50e5310b4fba4f legacy-trunk
+45750 9233532ec8b3513582deb221cf82d9f94cb057ea legacy-trunk
+45751 cd9ed273a6879633a2ee8fa602045d6f3cdebc4e legacy-trunk
+45752 1e1b536c68b65605e311c7494a8402d6564779a9 release24-maint
+45753 dfbd57f4a7112f92f74465c99d5f37cff32c7963 legacy-trunk
+45754 a84a621ec5c24b9c7275adda4349dd9ac98f6ec8 legacy-trunk
+45755 0913477bd24ea40b4498f078bf38f2ec3f80f3b9 release24-maint
+45756 77fea06ebc10a0b7294a18a27a9235e8e0e95eda legacy-trunk
+45757 788d8665ff58c544cc963f7f12385d2aad3b5bc7 legacy-trunk
+45758 4da0f7621325c267a07810d5cec42025f0afa3a1 legacy-trunk
+45766 af952bc7feb26159a6eeeda80bbdba51a4a94375 legacy-trunk
+45767 940ce5a76c5ff85abff7843c805396aeb508d01e legacy-trunk
+45768 d5514a7eaa4ccecef82bc78c9619f9f15c94a859 legacy-trunk
+45769 0b8e782b8484b88dd3cee218f4cbf74c2e677c56 p3yk
+45770 b5e7d5b3c442e79db1284abb3599aec2cb16db5a legacy-trunk
+45771 3845f70e0bafda04afa8ca0b83b68bd902b234b4 legacy-trunk
+45773 bb6c5c200a3f03bfc92dcdb6bcca00f08dc3f7a6 legacy-trunk
+45774 b5e7183ad11225f9326141e9d576b9e53e64f5ff legacy-trunk
+45775 3518e94aa66372194e57ce0edaff2497e45f3e79 legacy-trunk
+45776 19ad3d35fac4a84a5f2295cfdf4b0ec42ec80c1e legacy-trunk
+45777 8bc4a7e5fef84f718ba3a5bbd70cf742ba1112ed legacy-trunk
+45778 61c7ec995adf57e1838a3aed3d27adf6df19739e legacy-trunk
+45779 e9a70b1468578d8e460515e0f48d0183a76457b5 release24-maint
+45780 34d696c1eebc68c14aeeba14df6e64efc248f078 legacy-trunk
+45781 8e5b64a7b33f2a1e38a6db0e19c508c7ad8afe57 legacy-trunk
+45782 39eb5b5225239cdec500df19c0a8300498e8abe8 release24-maint
+45783 c1247169f3a166d8b05cfc378ac1af5cc1c4cdff legacy-trunk
+45784 de2ee8dedce899ac22d868a8fc679148eaeaedba release24-maint
+45785 565bffde8bf1830648ff3226f5487270578c119f legacy-trunk
+45786 473f37de13a137f41f7444a8c2a015fa43d89b9a legacy-trunk
+45787 2546c47734a015f8f95c675e7ea509667b7584d2 release24-maint
+45788 8bdbed67adf786e8597fa2fd02c4c0fb64478712 legacy-trunk
+45792 389e922a647c1102f5f1ff26a6d31b131a82864a legacy-trunk
+45793 874d77eefce431c0d809efe39d105114f8961b41 release24-maint
+45796 f2742aca2ad07f4424b4cbe9c7eb336301b3939c legacy-trunk
+45799 f0809483b4d05f1b7f2f0ca2ee4bff57047a3bc2 release24-maint
+45800 36c7a4422e3075945e8160e5d293c1c743796147 legacy-trunk
+45801 57398eb978c254e670a702c98dacddd9fd93e812 legacy-trunk
+45802 8469d3d8d4edb746f995f4f56e1a0dc26e1406d5 legacy-trunk
+45803 8873d30a140f8440b796b7824c811e77935f3dde legacy-trunk
+45808 5c2277a294ea45e3b4c0f21b0e1e8c601328d013 legacy-trunk
+45809 51b6f8e042dfbf9bf59f39dc1ed6fbf9a31653da legacy-trunk
+45810 3f51ffd5d8bf77aa92fbeb048d835b896624e308 legacy-trunk
+45811 f626d52fabf044c3ad8903b07619e2610ad01d9d legacy-trunk
+45812 465f5b3a023484a3358ced4a3d85ed41ef9cc269 p3yk
+45813 acaf27639a411bfbcf0a4f5299736f9653dfc70f p3yk
+45814 614c921707f954a6f24a85d941ffdaa70046afde legacy-trunk
+45815 2a28915616d501baa5c591f38beb0e3707640099 legacy-trunk
+45817 32a187f3d5ba936acc3f01c38952a252d7b490d5 legacy-trunk
+45819 e4e848214d23851bd3eb4ecfbc35874cfc192fbe legacy-trunk
+45820 ab53a378eda8f9b3733adf21dd5607cd7566dec6 release24-maint
+45821 fcc61835c6ac8e6f39858c433887c5548ce78cbb legacy-trunk
+45822 69f0457c17bb180857856bbce4cd01a93f86b31e legacy-trunk
+45824 8f7abc2ba7d0a22d5f302a33766a3e836ce12ef6 legacy-trunk
+45825 9abeab96af57236d3afddb17a37e0a64196ba3ba legacy-trunk
+45826 7cc7c7a13697bcf02bfe252c0eb05c4757dbccec legacy-trunk
+45827 81d91ff8003b9943b1c357a26390c07ec007fa50 legacy-trunk
+45828 f8941044801cbfb3df432517d9fdb908a8345b24 legacy-trunk
+45829 fc7b6181d09eae317d92dc43a00422fd385a537e release24-maint
+45830 f62bd5118c78cf345b6838bc059428473d41b31f legacy-trunk
+45831 0736b25c57c576813cf03e171332d5984b0d7ceb release23-maint
+45832 135b177883c3425bea6eb4a51f155bdb1ef390cb legacy-trunk
+45833 b8507ded4d15cc38a88735ccf688f5863fd18b87 legacy-trunk
+45834 efeebc8770e5e621b1f425d810cc5656b28fa7be release24-maint
+45836 ca6c91531a96787040571d4c45ffe380297ddd73 legacy-trunk
+45837 cf19a123a5d9accc624f170ce5274bef9f5fab82 legacy-trunk
+45838 9b75ad236f000080d6ac3bd08ea3d449928bc70d legacy-trunk
+45839 d76b9aa7229fc69618623ddd4eb100b8f03cce1f legacy-trunk
+45840 ee98ecf05773a707177d33551ffecb8f8e4952fc legacy-trunk
+45841 6351cd0f7c285f9279add1b55da6fd07296711f3 legacy-trunk
+45842 ed335e52d1705494fca70764326861aab09fab1d legacy-trunk
+45843 7b83b68be8a67a45aadf6020d921821d470d4495 legacy-trunk
+45844 128c0061b5bb26b29ebd536063f69f321ae1180f legacy-trunk
+45850 c9202f1c56c274e3017772e2b85112d0c4d0a8e9 legacy-trunk
+45852 b1cbc605bec9cdf9a46f03dde87c223495caf91b legacy-trunk
+45853 728c16f162671f341b79c2ae75194f625de25721 legacy-trunk
+45854 b8ec689cb2fbcc4f6acbd1c0d9e1c75c916dcf79 legacy-trunk
+45855 b7b5f0b34d25ccdd7c1e1a1fc863730ad4a4c71e legacy-trunk
+45856 9a17b82eafc94127a37fac9ff2cb2dcb2edba9c8 legacy-trunk
+45858 bb3e0c8896325a513011a370602312348c4e1a14 legacy-trunk
+45862 a812d0fae74a428a172ee0faa59e98bb9ac80653 legacy-trunk
+45863 fe29398f48c98dfe0b8b76fb39cf18939c3e805e legacy-trunk
+45864 ac72900e1919a1febeca66faca88373d0ba4483e legacy-trunk
+45865 b706b100c8fc0a038513f105f686182ba0112677 legacy-trunk
+45866 8aaf57bccbf8b5683a8adf786b3537a90e7da66e legacy-trunk
+45867 66875b9c89f4545f548da30f3755e2349423ec4d legacy-trunk
+45868 66f1b3ebaee3a219f2913323fe6e6f5f87cc9384 legacy-trunk
+45869 6e0b053c6cf7b176ab5e1b6e2b6517cc1b12c3be legacy-trunk
+45870 0fa3bad489dd477fc8f388a033a94fffac46c880 legacy-trunk
+45871 bc48e6b1e65455c7ee900c80745c0202990a6312 legacy-trunk
+45872 6a1469b39d737853bcd041448e8de5f479b3c7a1 legacy-trunk
+45873 eb03562df4a796847ca3ccf046f9d15b880b5dbf legacy-trunk
+45876 5457ab9f859917b04b1b39cf56fdc1d3d8dc74e2 legacy-trunk
+45877 e5d11dfb2d08ec6c1f953a807bd17f76e8c14ede legacy-trunk
+45879 23d4ac33ac16e74c21ded9d2b995ca50b2dd6c76 legacy-trunk
+45880 c06a62f0589fba4a838647ac25516e905f542162 release24-maint
+45881 4f72a49d70c805c0f97176e7b29bd3be97dc1082 legacy-trunk
+45887 6bc1e83a97a69fb899aa4dea4709f484ec544256 legacy-trunk
+45888 e92a8b8eec73b83cb565be9fa9423627a78c802b legacy-trunk
+45889 a06b69f8c276a8941dbce2ee21e30e649ce2c5b9 legacy-trunk
+45890 88b89f96b97ff07977f4cffc86bb57188131cc57 legacy-trunk
+45891 8c383ef7819849a8c8b0bcfa1faf9c1fbf8452f0 legacy-trunk
+45892 02518cf17a66ea7617a7c13dfd3496cb8ee1362d release24-maint
+45893 29425086e9ab628b31924cf6cb322f5bdf2f63e9 legacy-trunk
+45894 220ad20394df0b31a4de59f10292b829bab0fc4b legacy-trunk
+45895 91a6436f0a584e12d4a6be384ed7bde850005e7f legacy-trunk
+45896 ce2a7fadc2b04e2388e089466fe3018c9e56f7e2 release24-maint
+45897 0e7d34aaea6131ed97a0c1b866b2e6197ea8c971 legacy-trunk
+45898 be49645e398410a66b92ef9b129050a843e5bc03 legacy-trunk
+45899 b58f750d52101fe37779517819c3d8db2f04cb82 legacy-trunk
+45900 79c8a2a988cb394479aa2a06152fb00c2279c709 legacy-trunk
+45905 a6a1359aab84df531d7d037a7842a81cc8aced8b p3yk
+45909 be0cca70ccaadb31152e5525c71bbca0e8a78460 release24-maint
+45910 57bd7c7d91e3abe021ae5b307b6a3611fe8d1fba p3yk
+45913 3618126c6304c71a833813e1ef458b44d4f30046 legacy-trunk
+45914 c01c337ad6188efe025a9162d11848e3ad9fef02 legacy-trunk
+45915 a596ed93cf4264b27dcdf4662033be175dd75cf1 legacy-trunk
+45916 741fb83b4eab47612d908a702199cc1ab9fb89bb legacy-trunk
+45920 c3342d88aefd4cb6797b90d7583f5b3b9cac3dd0 legacy-trunk
+45921 2c5e74c645e28c98dc658b3beccf8e29cc60508f release24-maint
+45924 c3a36d456dea0bf33b4956be4aa5589013f93b4f legacy-trunk
+45925 0d879bff25f66c720d7d8a79591faef77ed95966 legacy-trunk
+45926 90dd57fcd24e12bad31d6306aa3d9456990cada7 legacy-trunk
+45931 4c3918f2303b5a95bf7da8065ed882c78fd4f845 legacy-trunk
+45932 e7035275245bae366f055ecda93d275c9f477821 legacy-trunk
+45934 d0170276c5ded304bd4438f09602cc8f44db4389 legacy-trunk
+45936 ddf0069f61f92d7ed5d8c6b61d64f68b7eec6753 legacy-trunk
+45938 8225aee9190495093ad8586273ecbe97edf6306a legacy-trunk
+45939 6d1e240c918c12f074cc8a433081ec44edff9469 legacy-trunk
+45940 b44859f0b308bc8496132b044f779462e3cce600 legacy-trunk
+45941 eb4879c085aaa87f2b96790f14814aa72ae2cc07 legacy-trunk
+45943 ce0b47d3e5d10c70296aed98519c324809827e6f legacy-trunk
+45944 0606b9c08ac24f1ddb7857e52fc3f6e8f97e3449 legacy-trunk
+45945 f3a5e153c32949b81171682bfee485ad220bcb04 release24-maint
+45946 4c9922d8dcdd107fc18987a86a6ea3c09a98545f release24-maint
+45947 f1e24452dbba7b1aed469bfa05e58ba8d05fd35e legacy-trunk
+45948 8da08d85fcb1e692e1027720007ebf26764fa3f8 legacy-trunk
+45949 97db3d9b14580091c43e581b4b78c57c6743551f legacy-trunk
+45950 8c86ca8f26828801d74496370c32a581467b8460 legacy-trunk
+45951 eea176e67f22884c5569697d810a2eb5b66620ac release24-maint
+45952 1457336d432fe459bea8c054b9d16790336cdb1c legacy-trunk
+45953 42728cb18ea2560c1da65d76fe521433a6742b72 release24-maint
+45954 f61c892cadac9774154a4d49fd61c948b70f819e legacy-trunk
+45955 7fe49dbcbbdab1c9599e4e5d656397b822bb276e legacy-trunk
+45956 f26fc3aeef96cb478eb8febede5a73004ed99cbd legacy-trunk
+45957 6701309efa7686e602722cd3517437ade11f6b40 legacy-trunk
+45958 86a051d2264d2a290582b4ef08a25f585eec1194 release24-maint
+45960 9d4fcc390236e4ab5d81005d52dbeca74a2d32ad legacy-trunk
+45963 9a637bf4df427aba3afca0762c3231e0d0e698d6 legacy-trunk
+45964 e2ef60fec3dad91a6df1e4514b020e57f50a71a2 legacy-trunk
+45965 4082d1a11917c10f2093d82a4788ddbbce34ea19 legacy-trunk
+45966 8f408aa2a7efa47f4a5b07046d5af4e1085e9553 release24-maint
+45967 2a9b45dc31141d9ebb4159f79ed06309ebae4bfb legacy-trunk
+45968 b21be9d2341a9072974853fded95804a3aeaa13d legacy-trunk
+45969 7fc93d9530bf60df85282602d354400426e0a1d3 legacy-trunk
+45970 c4aa56d7a5c1063943675b938de4aa672d663a0c legacy-trunk
+45974 5e3543b78337ba376b21a9cab8a62cb27c9572b7 legacy-trunk
+45975 bf3735206871bd27e9da1c38ace086dc5700b9d5 legacy-trunk
+45976 0795372a84abfe0dc625bc0a7debd39773c1f2e3 legacy-trunk
+45977 7890f6b92c149cf9b1964aa91e0a25ad37c337c9 legacy-trunk
+45978 4de3155e192bc9908f6fddc8c83f6bd172b9eb56 legacy-trunk
+45979 cf78f9c4790ee1299a94cd3d513783f88eedabda release24-maint
+45980 574ffc4d7bf6bc777405bf044af5cdf6bd1d2656 legacy-trunk
+45981 bb6092995409935136a02c9d0e9fb83e817e1dae legacy-trunk
+45982 a797efb4e7f83fef23533bb4c04775e67531b338 legacy-trunk
+45987 85c828878188b35dbde04da574a82960cccc17ec legacy-trunk
+45988 8b6017c937ac27f00893aa1e994a8e7f166b8dad legacy-trunk
+45989 525624e94e78ae76da8e8532aa3971c2b4dbc8f7 release24-maint
+45990 32472ea5f3cdb608f36702dfbb2dedb00e159b2c legacy-trunk
+45992 380dad39559914f9d5476afdfd2f80844909aefe legacy-trunk
+45993 ebd573210e25038ce44c05068e16985ff5d6bb7a legacy-trunk
+45994 4bdf27bd73d22ad5e774b2620a7a3ee83f4a0981 legacy-trunk
+45995 cdf8f53344269e9204d659ad767c14b81a48ed20 legacy-trunk
+45996 676492a93c8a7bf7dec57b1f6a99d235f07b1730 legacy-trunk
+45997 ef82c5d014607fbb58fc0c10a795f955b86457be legacy-trunk
+45998 f252c6ae0c42643626c94625a5e7060754512ced legacy-trunk
+45999 29b736f073a35c3fb8e40402167fab53ffa0f4b4 legacy-trunk
+46000 ab704b99e150cf03759e7ea6efebcdcd68033bff legacy-trunk
+46001 d8355cccff4acfc297c26082f2ccd3f621872ca7 legacy-trunk
+46002 fea5d2fd9b8a483c711968c8b710f05a3984919f release24-maint
+46003 e7d30d75dae7c2bfb4085884082636e74f84103c legacy-trunk
+46005 ad8b76e99261052b1916d30273c673e895152d27 legacy-trunk
+46007 ca10507a6afbf3cc7b6fbc3271a3baee618c5436 legacy-trunk
+46009 0ae4bb74e781a834c3a4d923b261ed0e67bc8ace legacy-trunk
+46010 3379ad66b0e073a45fc751eab559c3d075b1c136 legacy-trunk
+46011 3b5cd7c66da09097875bdd97099c8d307f25142a release24-maint
+46012 d6d879af36d34a5c70a21aaa7656eca5582e61bb legacy-trunk
+46015 f8385d6c8f5ee160451e79ef993ebe91be705dec legacy-trunk
+46016 6cf4662763a1a293c46446adbc701088a200ab99 legacy-trunk
+46017 36563b13ce792a72bb0f80ae0d53a70cff33fa69 legacy-trunk
+46018 f913505008346f43d16dcae2909f2a9cc0e5d0b6 legacy-trunk
+46019 d6ea7d43ebfc0abc7602645e4e28ba29cfeb122a legacy-trunk
+46020 ac506e2df04d5396a4967e4e7830a9f55f4bc888 legacy-trunk
+46021 204ec383b445abf39bf752daed40bb27806dea24 legacy-trunk
+46022 30188c523bc558dad077b35dcd28bc7a95126a25 legacy-trunk
+46023 aae2ff33e27c38540daa74e71b392cdc70ae1158 legacy-trunk
+46024 ab1dc7e23bfe5139e564571e9660b769eaadfd56 legacy-trunk
+46025 7caa6d33a4c6798d4806341a2a770ec1cafac433 legacy-trunk
+46026 bfb76ae82c9121be083a30a8bbe2550b02ac05db legacy-trunk
+46027 c2e3b5c36de452bd0e4e7472ada30417a607f2f1 legacy-trunk
+46028 fa3c4ea99d95ca6eded1a7f8e539c795386783b8 legacy-trunk
+46029 0b4731049b71ce890bbbed339a7976bb92d3f147 legacy-trunk
+46030 07abc6284899dfa1f0a3540f4020f64d34f19412 legacy-trunk
+46032 b73f24e21b0ab64c5bb9d8d8f178abafb08a0bb3 legacy-trunk
+46033 b286ed45439d660be0c9007702b234c7edd295c0 legacy-trunk
+46034 b35cda55d60c6a1970957a8aab78f9689b46db0f legacy-trunk
+46035 73c7ad5e87deba79f86dc804d13619966e13d4be legacy-trunk
+46036 6feaa42eff69f4d51f12eb2e7b289696b0aa0880 legacy-trunk
+46037 42d6bab88079ff60de21b17760bfd438dff8fa57 legacy-trunk
+46038 81e385a641ef8b0703aeeb85f7f9d6f602d6f445 legacy-trunk
+46039 4cb9dc0dc3f9ebd1b586bf60ed995d224a797cbe legacy-trunk
+46040 c64cd271acea9afc456d577a5d14b0d6a7f71a81 legacy-trunk
+46041 c07a5c2304f3fcf96970c71ddaff50adbd3790d7 legacy-trunk
+46044 2195972f7391d4ec416bc8cd5a641e7a17daa5df legacy-trunk
+46045 26fb563881c93d98bb5b40d5d56b28f17c865aca legacy-trunk
+46046 cbf2d562e3229291040caa20ac82c909da7e21fb legacy-trunk
+46047 c4907d990db5d70a8e3db7585223feada9c3b043 legacy-trunk
+46050 28511554dff1ff4ebd529a640298453adbcdcead legacy-trunk
+46052 b0ba4e8229f7751964714d765ab4040aea3b2d2f legacy-trunk
+46054 accdf1124ba2edf3be2632df78019fb1a844a788 legacy-trunk
+46055 109437c4cac4760973888812565feab11597fe84 legacy-trunk
+46056 f9612177d08d1bb33194caa69ecf6e15dfe824be release24-maint
+46057 cc0556adc2b0cbf117c4c5d3d0b455623a572bf3 legacy-trunk
+46058 2d182fcfab6b98040dfaf0f0a8bedd6b4336fdce legacy-trunk
+46059 b4bdbd7b1f5ee762728ca8a10e0381cdef6adc03 legacy-trunk
+46061 ca1f1c2189e74fad0dbab45d16d19810195bb4c4 legacy-trunk
+46062 a69ee5bad9b23c6eb869eb5b643c1ee6318d2677 legacy-trunk
+46063 dae0e4c390e772145bfed5b88862b4e8b4182b6a legacy-trunk
+46064 aa620856e8a3f75ca67ffe9d93bddd0561b516e3 legacy-trunk
+46065 95910bc65f6b991f47c7ecc86729d9d9a734d69b legacy-trunk
+46068 1055d626ed594d638f043312571da9ac1ad97556 rjones-funccall
+46069 882b612a5fe9cb7a35c78fef34106dd314c505b9 rjones-funccall
+46070 27c80058173e8a7af1a2c6f8400d83b2a421be71 legacy-trunk
+46071 fb4f0fd7eba4ebe35758fddeb25e4307bc1e8f82 legacy-trunk
+46072 51241cc95883eded5c8d75d3d899ca4c42721207 sreifschneider-64ints
+46073 7e16fcce34a1353951a95c6eb247b6cc614ce061 legacy-trunk
+46075 d710c2dba3e880c920cfe89d01f9013588c9c309 legacy-trunk
+46076 feb00df9192206c444c42cb2945c65a8f877e278 legacy-trunk
+46077 cced83a915778af7d20a32a1587f2031e88460bb rjones-funccall
+46079 604af867c65fb81252483ef5dae4ad24aa48acea legacy-trunk
+46080 cd34a08830536e3b1447a1539f9ed30a5993d1a2 rjones-funccall
+46081 ec54c6df90402bfef1ba610195536980e2f32ea3 rjones-funccall
+46082 02a0c6928c50a7c1c6921b9d0ed29a4f4ba28a5b steve-notracing
+46084 0373a074004c2ea9a549f2eef1aa62d850d517c6 legacy-trunk
+46085 5eaf8b9587d869941c48abd114d7032fa6bb6055 legacy-trunk
+46086 872042a3b1343c9a522cde2f8e85bf8e16ed5337 rjones-funccall
+46088 fb816dfcd0315430e2bffe74503b0bb8002c1f2e rjones-funccall
+46089 4ceabb5414d5f2a2433f2a387649ac693f54fd2e rjones-funccall
+46090 9a28bfa6f787c46373a8cbbb00ee742951b68441 blais-bytebuf
+46093 00456fca37c4244cdeddb21b84553bf3e7e72ee3 rjones-funccall
+46094 0de9a789de3904e5c698a09adcad6b1e2eae7cf9 legacy-trunk
+46095 0ba711a496e6b0019d034447d2fd9ae4d9d26fa0 legacy-trunk
+46096 a637c78bf1195efc7b5f4a947bf1e0fb189440a2 legacy-trunk
+46098 6a6c5492b9ad2ead9aea8e30237777acf4587045 legacy-trunk
+46101 ee2139935a1d3af52d5009b74719286402216fc2 legacy-trunk
+46103 5b587190f4c68577a3252963c8576c4f43f8c164 legacy-trunk
+46104 3078fdb7cf3df55c73f43afb53279527a99116fd legacy-trunk
+46108 b7aaf21c4756403f01828a79bfcb26b72fa3ab94 legacy-trunk
+46109 76bedf9ed22ff24e3d5437c64bf50b0e97600df8 legacy-trunk
+46110 ca34521bb13c3837d651fca90c1df0c4bce29222 legacy-trunk
+46113 75bdd44f85dcd4ada86ceb09e2f72c4477cf0edb legacy-trunk
+46115 9a90753f6bfbb21a9d7bf213ec97b5f174447125 ../bippolito-newstruct
+46117 667a2cae79e62696516b9120316f0f3fb96d4c76 ../bippolito-newstruct
+46118 58317df4d30bbcb42dab03728955865b44d48ea3 blais-bytebuf
+46123 4b0ff788e9fdae0a7dbb6edcd5255287fd4f325c runar-longslice-branch
+46125 0f0f046a29fba48dc7f7e83aa38b4cce9da889aa rjones-funccall
+46126 ff50ae13db9e68dff60b53d852a17193405da7fd rjones-funccall
+46127 eaae6990e2d18d2a8db47d66ab09b6197e4978a5 rjones-funccall
+46128 4bd299d00e4c6f173cbff35def9380f49394e9e8 legacy-trunk
+46129 bf5fb6e7527c2ffe851a99d520dcebf3571abc88 legacy-trunk
+46130 495a34e54d60a527852d8704a44afad3920fbaf3 legacy-trunk
+46131 9efccf56d4e71f4d473ef02b483bdf1d3f45d9be legacy-trunk
+46132 af46c7ed05eb791b1e4365b7808242ebfbe26844 legacy-trunk
+46133 9fdd434216ef82edb2ef7a5fa7c267f8cf1ebdc2 legacy-trunk
+46134 895da42480f1c3573708ac1288ddf46f8c1e459c legacy-trunk
+46136 c1ce0b831636703d13d8107ee6d40531c0e4facc legacy-trunk
+46141 27882a8e43a9e89b1033b22a37317a04aee9e98d legacy-trunk
+46142 6b79fffbbe1f0433d1bd5ac150e84e6459355ba2 legacy-trunk
+46144 efb7e8724eefa6ce76047aa95af44dccf1fd15f5 legacy-trunk
+46148 33631b6b080147596e6205f53eb9a99a6841a86b legacy-trunk
+46149 7d82cded8ab152eb19548ff9998937661850643e legacy-trunk
+46150 74c82ebc4e44991cb5a5ad70ea9475f353f45f4d legacy-trunk
+46151 cf5a9057ed3a9204eb8756db9c44d235ba70af39 legacy-trunk
+46152 e07dc1348dad9d4c447f2f2201ed4c97f527d2fa legacy-trunk
+46153 b8bef5a07df6ccfb5212de7fb7c1127fec0909e8 legacy-trunk
+46155 1dc5657f17453c70a78be6ca76e263f34dcd855c legacy-trunk
+46156 314d666c7adbd1d7ec2498b3160fd078618c9389 legacy-trunk
+46157 de9f1a1406119372df9ef23a423d8b62a08695e7 legacy-trunk
+46158 9ae69bcab9f72217bbc14ea9f9e538381f376109 legacy-trunk
+46159 0691f3fb39caa1d0d9a48d4eee4ea87c15c68178 blais-bytebuf
+46161 2d55e97900358bb7b4533dd096775d76c97f6ed4 legacy-trunk
+46162 357b5403e81ad3c9f637233769e9ca7a4f61adfa blais-bytebuf
+46164 042ed6f80847cc04bb3a401033a37ffc39d3da9d blais-bytebuf
+46165 a589b74415c022f6e16e7014dc6f63a5a5420813 blais-bytebuf
+46170 89b2ca51230723e2a8ea30d16442ae0a02c13690 rjones-prealloc
+46171 0a954f4e3e36a2acc9767bd0fd2110943ec10544 rjones-prealloc
+46173 43b1474b512bbb4cf008fadb8fc3fa199cd3ce4a legacy-trunk
+46175 6da31c49eb0a686361e1a565cb888f3745ba6c0d rjones-prealloc
+46176 22995c109efd67e5c066eca69cf3ca0d484f3ad1 sreifschneider-newnewexcept
+46177 8ad9e14489fff1f1b558e1b8c446ac89f45ccd2f blais-bytebuf
+46182 b5b256966fe92b415b74b7033d88854b0fbf4632 legacy-trunk
+46184 b825e62273666e6d2b1138d5982e09f7839e0337 legacy-trunk
+46186 c26b9fdb65fb3b576b635d5317b2f9a4157386a3 blais-bytebuf
+46189 260d5a6ce30f4e2569ab8017c368775712d1fabe legacy-trunk
+46190 fef496ad7f6cd2bdc1f25d7ac05b47999bfd3e7e blais-bytebuf
+46192 51d6e271824368eeeaf2bbc68477393ccff0e408 blais-bytebuf
+46193 aace3148f7ebaf022926d3d27878eac1c6a09245 sreifschneider-newnewexcept
+46194 3cfae3a0e69591071d174b14c2baa273189f350c blais-bytebuf
+46195 f7a7742aef83b85423074ebe19ee0cbd111a1ba5 sreifschneider-newnewexcept
+46197 58d20feb6e039bba6f1618937f8e380e0ea79648 sreifschneider-newnewexcept
+46198 6860c36f7db7514f5cad9be355b828ed86728836 legacy-trunk
+46199 91fe1b0adbf2614f9eb0ba974f681b422153d7bf sreifschneider-newnewexcept
+46200 32ba3a0c60409383d8dd33486b19ef7161c0e064 legacy-trunk
+46201 b2491fd0a4dc6c67db4b29aa5ad9af23142b89b9 legacy-trunk
+46202 1c5ee9631c6b8b8966be8579de159e65b09b2365 legacy-trunk
+46203 88cc7e4f01ff4d0f57f3c2a0ad198a96d7ce63db legacy-trunk
+46204 bcea74b35d1fede0f7917c143a3cbda551dcac1e legacy-trunk
+46205 66322fca91b41bbbc3243ec0eb3b37c109f2ada3 legacy-trunk
+46206 043e29a1e3985eccb0101fa653de6d7bacb14adf release24-maint
+46207 45788128a1b15449ea6b2fcabd84b0877c12ce10 sreifschneider-newnewexcept
+46208 698198cabbc5ab77751b5909c139fd28df946bff legacy-trunk
+46209 8c5146c51e2df00e8d278d10f0b4cfd988c4c0bc legacy-trunk
+46210 75e1cd22b56bddc4af0e8003f842a0ac42cfc020 legacy-trunk
+46211 3de7064dfa56414ac45c9808c535045fafbc26ce legacy-trunk
+46212 9bb4c19e56134c6891b90e8ad48ab7e094569b94 blais-bytebuf
+46214 ad1e2438cfaa5bf45e48c99496e8eb0446594577 legacy-trunk
+46215 7b3d4a81e94de5aaaac56dd83c74ea275fbb5033 blais-bytebuf
+46216 e15b14c7fa14d5c440052af1105cb19181aee9cf legacy-trunk
+46217 688f257571043313fa10af808cb1ebe08dfcd19e legacy-trunk
+46219 41768de17ead9092c454adf9910f9d8dbb852ac7 legacy-trunk
+46220 4c0c3ecffcac2b321843b197894f3013323ff22f legacy-trunk
+46221 ba713d31d00c669921b3733cf4c9ed0511208aaa legacy-trunk
+46222 29ccd7710413fefd9ea690820abb4eb0403b32ea legacy-trunk
+46223 986bee16bb4451cb1d8235ab7eb5ec78e350b707 legacy-trunk
+46224 ae6bbf2f2a412b6c41d1544c20e424373ed7d495 legacy-trunk
+46226 41809406a35eba04f93afb4f454acc05ec98410a legacy-trunk
+46227 dccbcbbd67208a078230ecc8a803a8d9490611ea legacy-trunk
+46229 9c08a7bdbc310a7746084599f6dcc58ece3ac0fd legacy-trunk
+46230 17eaa8b57e052f51465cb331fabfc3c5a337e71c legacy-trunk
+46231 05496deeba64be704010bc61f3c8e5de2fd0b5ae legacy-trunk
+46232 6fc1dc086459402597f78301b994d0d9f5ab7141 sreifschneider-newnewexcept
+46233 3e6d77552be302beac2562d4d5279712e04d68f5 legacy-trunk
+46234 c5d61965cad4219a8f7a02ce3ab2e3cacf7d87ea legacy-trunk
+46235 5a63369056a7fe5fc3c0b5ff0de1087b19650718 legacy-trunk
+46236 f279d031f0cea3cf8bc4f1018ad9fa9d25e8d866 blais-bytebuf
+46238 74beb189fd7ee484cfc2d2338aea248abdbf5eb6 legacy-trunk
+46239 2aa9409351d61f9317ce11da7752e0965d72db3b legacy-trunk
+46240 850d4f7717b8dea0f9bdf5900e5023c150ad6ca2 legacy-trunk
+46241 c9dc300eee682ace05f77b488d90353646edfff0 legacy-trunk
+46242 05324aa444bde1c0b6f0d2994ba3ff5185518f82 legacy-trunk
+46243 4a8c9f9b66e68ec9705c23dba5aec0a49fbd70da legacy-trunk
+46244 1fdf29a88f0ee0b13b28921a5fbfb1751b5f0cf3 legacy-trunk
+46245 91c6c94490b1c5644dab68f89e4c41ce4338e567 legacy-trunk
+46246 2f16e27152235b7ff3cb87b1511355f7857c5a27 legacy-trunk
+46247 ecf2bf4182adf4933f12d064c851b86f5a97010d sreifschneider-newnewexcept
+46248 68a348c9868db8b358615bb40471baca25a5021c legacy-trunk
+46249 c006c272116ffaa6a8327a39c4a03fdb4a828c05 legacy-trunk
+46251 c3508a94156836596a03e8a9093264cc1dcd88bc sreifschneider-newnewexcept
+46252 e16b4157686cb9a488852d4480f22752614f093b legacy-trunk
+46253 3d477d158401c71b13843d707ffa6dbdc1ff7779 legacy-trunk
+46254 ea0ad4d4ff8edf0acb98519e2fe5d30e15de2e8a legacy-trunk
+46255 c77da2736fb265d6a4457ab0c2ce885368741764 legacy-trunk
+46256 3587ee313b006102ae610a597e84e4e78296a0c5 legacy-trunk
+46257 04f39ecbc73c76a55ae8cc1ef5b53df5b7efd0c3 legacy-trunk
+46258 d33d8a8b545eeeb150d1b4c578c80e932f44fb47 sreifschneider-newnewexcept
+46259 8a58aa40dcc05d58041a6b4be6f38d1641b30e2f legacy-trunk
+46260 556620cd7b1de3c11865152d759db00cea5453d0 sreifschneider-newnewexcept
+46261 9f884d34a0ecd4b99e7228d598f5b2957da84699 legacy-trunk
+46262 e9eb526b7111580d183d8dfd7fced8b2be56fadb legacy-trunk
+46263 ceebe6cc45704c8c18bfaa4d7a1d98a385de4975 legacy-trunk
+46264 ab02218117717bb61b0a76c4c5b8661ba05332b5 legacy-trunk
+46265 087287009658eec7099572af5b7e23df7d9dbda8 legacy-trunk
+46266 7a6af4a143c62bc5f6e4ff890c99722e5e003464 legacy-trunk
+46267 8a9cd999535d1797460ce6c0560f8b8cc7a243a2 sreifschneider-newnewexcept
+46268 eb237a37ea02deb330e2fe5e1f4372972b089076 legacy-trunk
+46269 ddc200afde1a831b1c2bda73f6a136a52473e91a sreifschneider-newnewexcept
+46270 d6d553b9d46977fbdcced01ae21043e51df07c75 blais-bytebuf
+46271 46d77bb32fb0da8b41a65c1b2501b4fa11ce19bc legacy-trunk
+46272 5a147365527e53845a0f7ac1a3cf6ee698090bab legacy-trunk
+46273 f9332ad4287a7f6d8624d9087cb021901d4735ac legacy-trunk
+46274 82b680846df8897ff728bce7d6e65d803d49b383 legacy-trunk
+46275 81b641da5c7952a7e0405f83b96e9af01a1e4074 release24-maint
+46276 1035a2b31e6df2616c9a4208eeb1aa94e0fadf6d sreifschneider-newnewexcept
+46278 958f91684209d00c33d7fefa68ce46e9d03a9cef legacy-trunk
+46280 1670ff726e8fd7d747828615f1009a274525c475 legacy-trunk
+46281 3091a75eb560c56de77f869fff7ff1819169702b sreifschneider-newnewexcept
+46283 dd41731dee6d4bd2c8d05ab54e4445148d252ac5 sreifschneider-newnewexcept
+46284 2f4fb6414e87208abc1831d35a656b02b57178e5 blais-bytebuf
+46285 8a99cdef0c94acb581f53eb25cc21f14b96f59b8 legacy-trunk
+46286 a654d61d36d5319671b10b0b1e521891b179ce74 legacy-trunk
+46287 5382aaf3a0dac5fcf2e589d1f41fff0b29936e6e legacy-trunk
+46288 c8e4b3b39774305fac8a7a5139776d97d9a3d5ff legacy-trunk
+46289 835ea598a4060ba81b988dc1633de99dc292620f blais-bytebuf
+46290 6610d4be8fbd902505403d92c0bfc3600793603e legacy-trunk
+46291 fe653e22488c9a0b08331d054b8f0e9610a4b061 legacy-trunk
+46292 92b0fc54d2300d058d02be704e2b702fe9e71482 legacy-trunk
+46293 6d8615f9f1cca978385b79638bc812345bfc2276 legacy-trunk
+46294 8d28e63e8f2166483f002e5df6496a85b1ce96fb legacy-trunk
+46295 ad2e4de47d096365daed7e14cfbee4e17c089c83 legacy-trunk
+46296 2f45ad66cd365058b00dfd21f66d6400b748e942 blais-bytebuf
+46297 3bef24086ace51da32a21e655fae5525efddf77f legacy-trunk
+46298 b7b7615ea5f5f2073f4fc12f8210f6e0e73d4cee legacy-trunk
+46299 9f7b1b7adf010e2fbfdc578f8120871141d04f37 legacy-trunk
+46300 36cd4a4ab8f7e8f72ba8020cb57d0a825a8a1857 legacy-trunk
+46301 c07a96f6983962b4b2a5185f1b24a8fdfe09946e sreifschneider-newnewexcept
+46302 957727f2ff09f39373727175d92e318d388ce4c4 legacy-trunk
+46303 9883790144773082b0c5f15f19875a0d33f52b57 sreifschneider-newnewexcept
+46304 378ba677b5797076fd34850dd272dca55b929240 sreifschneider-newnewexcept
+46305 78c60e599afdb7badf61a4843a8c81e565e0b720 legacy-trunk
+46306 31b9c78a07f369fd1dc10ee76882aba02ae1ca32 bippolito-newstruct
+46307 05bbbddfce3f7a27b251539dedd7a97dc647c39f legacy-trunk
+46308 be7415b0a31851a3c93bbbcf04bbab612015a2c7 legacy-trunk
+46309 e3ee3eb18678dc6e837f3bee6b58dfbe0bc8655c legacy-trunk
+46310 d2df4a359e352af77c0e383175ff5bd9d67acc42 sreifschneider-newnewexcept
+46311 a4ee459ff288a42e892edd80a93543f6098519de blais-bytebuf
+46313 88e9d86770066ecd0fbb1ca93f0b019296a1b62f legacy-trunk
+46314 454bde7e416e49ba7bb0e97bb7dcc0b32b73aa2d legacy-trunk
+46315 890f6161c98a5a9157f084315ba200ba29924845 sreifschneider-newnewexcept
+46316 6533d8ae1fd9512ef17b94ea8901b603dc38a92a legacy-trunk
+46317 a043c5d71eaa18b36afea50c777af8ae653f2d4b sreifschneider-newnewexcept
+46318 76b301ac4a5e634186f84deffd4ee1f4b8125403 sreifschneider-newnewexcept
+46319 8a38da8e128f7dbc640893e5442c93d301ed4670 release24-maint
+46320 5213b606519796e900e55b7281f6cc8439347bac legacy-trunk
+46325 1a113050690b741f3276c71de904e1ec6a2b996a legacy-trunk
+46327 c0082705f2f2343a249299b4e4100adf5afe2768 legacy-trunk
+46328 f743e3c6b9bf16a86770aeedb50a10d147486506 legacy-trunk
+46329 2ed4b757c0cf263d89efe2375780743894164706 legacy-trunk
+46330 79c8dcc277a5f263e3bacd89ae919e1b9a96ae3f legacy-trunk
+46331 13e0f71a70d544e4aa9a4712643080f1449ba638 legacy-trunk
+46332 09d2e968d0747293295a673a01de8fd5ec6685b2 sreifschneider-newnewexcept
+46333 fa98b8df0fe2176841548efd27351abddb28f44c legacy-trunk
+46335 a4e433c136da43b018d75ab212f3a52fc28e45a4 legacy-trunk
+46336 31d4215480c69995907bf7c4ccce3b032c997521 sreifschneider-newnewexcept
+46337 d2b38a61de713534e9a028319e293feff6739e48 sreifschneider-newnewexcept
+46340 bef6aab5f9b3a3d018a52a50c28a37e3ff63ff50 sreifschneider-newnewexcept
+46341 c0dbfea8c0fb5b9084677eb30437b5be1a43446d sreifschneider-newnewexcept
+46342 d109b081d44be540689e019afc7b7922a23d4d7f sreifschneider-newnewexcept
+46343 c14e0c89a8b0d07e580be6a4f200aa0955b981c2 legacy-trunk
+46346 2e7a00ebc319260585e91ea438f497fac58e3490 sreifschneider-newnewexcept
+46347 5e4dce78f23da9b330cdc7132e52928b74ab0c6b sreifschneider-newnewexcept
+46348 624b4bb93d9026a2f58d2180d8a7d035f2fcd46a sreifschneider-newnewexcept
+46350 43c86f349d4784c7d6477b58feec15aeed8e8d91 sreifschneider-newnewexcept
+46352 4bfeab230e385d67d414b1d1291942a728c8a384 legacy-trunk
+46354 1ba3e40e86496a2736bfaa938aa5ed93c5503da8 legacy-trunk
+46355 52d1399e1c6d91c7ae1c6f530d0f7aa475dfd3c2 legacy-trunk
+46356 a16948e9915eca56d830489fd5d971d6f4979a4f legacy-trunk
+46357 0b8b28f0f30143b10757bda63528411a727965bf legacy-trunk
+46358 729ff8008c9e5983074ce195bda4ab43b60cde94 legacy-trunk
+46359 d37d5c5521e38646ea59a7ee466b731d8923e9ec legacy-trunk
+46360 2e4a274e3108aeb362326b9ced29d50a7e62fe02 legacy-trunk
+46361 a5f53fecfce66cb19d11b67a4eb7039469789ef0 sreifschneider-newnewexcept
+46362 b32f9bb2e07727fa6d048e7d43ce1be33e332397 legacy-trunk
+46363 f710edcaa675899ea4b7bf8a5d504d8aa4ccfe60 legacy-trunk
+46364 05744917b7c39b2386d3437b3888c4d1911b5e02 legacy-trunk
+46366 96415105c29e01eeae10011e5510724a7dd23226 legacy-trunk
+46367 3890a3c792b90373ee178cf29062ed7d56680b3c legacy-trunk
+46368 35f41731bee94e4baa45a489f83097318d746f1a legacy-trunk
+46370 4d0abb99c9e548d3b9c0d74153cc7aaae71c35bd legacy-trunk
+46371 2f71d1a692bf4a0bb161a021ebf79da63ac1c056 sreifschneider-newnewexcept
+46372 d21896b2dd0ad71ef7b1523831a39e23a2b2404f legacy-trunk
+46373 d85b360aa5f6f81d8a40ae8d2d7659d4bd103d8e legacy-trunk
+46376 1ab32617daddf667b9064b116dbca0e8cae84c38 sreifschneider-newnewexcept
+46377 76807902a2f505e57d0e529b26e1358a494b01a6 legacy-trunk
+46378 23f78e5bd3e3ae5c740f07bf0898dea71e210dde sreifschneider-newnewexcept
+46379 f70653c1e633b68a9d94249221de8282176fc58d sreifschneider-newnewexcept
+46380 78771d673b4b7312625d52690be4947e68f033ba legacy-trunk
+46381 816f8e60097a9da7d7d24d84182e2def49492815 legacy-trunk
+46382 41f839e895325d36280f303fa1f095811ab4682f tim-exc_sanity
+46383 0f61c3c62b8bf81918d3d453ef62338cbb8dc0c0 sreifschneider-newnewexcept
+46384 cfc9a007e8ceb30a85bbf5f2e57875a59837d3c5 tim-exc_sanity
+46387 b20e7cbda40912c834d79b755aab7884df30eb12 legacy-trunk
+46388 d153d2f66884fc30185bc21b3b5895035c43cb1b legacy-trunk
+46391 70c0ffd21bf0a7300e18ba9eb5328d3ab1c97933 legacy-trunk
+46392 df04f192a2a27c4f009bbcdf4024f1b90f590497 legacy-trunk
+46393 ac45eca8c35c246db86861271660a5b7b29099d2 p3yk
+46395 b1896656f22e469063f294137106d730b67e5a4a p3yk
+46397 dbb195c9dd88e2546629adf62e03bcdce98e4998 legacy-trunk
+46398 33c328896f527eb5f0c765cbee48702b9f10b612 legacy-trunk
+46400 adc214fc1e1c13c39806d3818f57f31b68190db4 legacy-trunk
+46401 5ddbd20500fc50491f78b811ea2bf07a90539973 sreifschneider-newnewexcept
+46403 6b03a47eb54df7edacca1e11356410ba90029633 legacy-trunk
+46404 6d99df55606e24d0fce67b76ce6f4c01be3d7e6e legacy-trunk
+46405 e83e1aaab1a3ae04613edeb65608923a461fb332 sreifschneider-newnewexcept
+46406 52f2c9f74f5ad5a76b2b1f8ad962e45ef2a078c1 legacy-trunk
+46407 3128cfada6b4a7cd8afeb23f459c741a43181564 legacy-trunk
+46408 402f3ac4052ffafdd814b8d4a56de4dd9adfd065 sreifschneider-newnewexcept
+46409 8f7c7aeac3a583a3b92fa8eae47bc8898c88666e legacy-trunk
+46410 1db0d73749ed9eda5ede00b766ee9141fc6d385a sreifschneider-newnewexcept
+46411 5607ab6c67dfdb0da6ae9d5a36523bb4f1b5996e legacy-trunk
+46412 fa675b3d75ca8225ed947164854b457041d948f8 release24-maint
+46415 e7af97e278c44a710db419e09707b8c931aad8d8 legacy-trunk
+46416 4697d1958ccb05ba6d9fd314610da15348ea78cb legacy-trunk
+46417 631b6648fdf41be2c4575953257dd89116846fcd legacy-trunk
+46418 2bee150a0f75229a10cb907f9b24e5e30128b329 legacy-trunk
+46419 fea6fb4557113bc6117262c91f3cf39b8ad69f55 sreifschneider-newnewexcept
+46420 4dc61d7db3a29ff86acde5f2ecb095658a401d64 sreifschneider-newnewexcept
+46421 8e2dc3e418011a6e25d7602ddaeecc10d60e77cf legacy-trunk
+46422 0eebd9eeb717ca3133c7e1cd4eddf4c708bcb43d legacy-trunk
+46423 ce638d4b4fc8cdaf0c4b63a164853a2763ef6e56 legacy-trunk
+46424 90edaf0d906218218bb94bfccdde3e001ed1e9fe legacy-trunk
+46425 e0e43e561512bc960410b7c7d126d21eaab6f01a legacy-trunk
+46426 708eaf0896bf4544d4d54353832f330071caa658 legacy-trunk
+46429 38e9af38f381c27ec6070b5c62a539c38f46d329 legacy-trunk
+46430 499cf7c2f7773ef96fea4b424b3c934becc5d56d legacy-trunk
+46431 4209a3d295e347eed6fe541028a89a13c3c43111 legacy-trunk
+46432 dfbd457ca67ac6a8f09df3cdf595bdd0fc574e8d legacy-trunk
+46433 68e1a02a5b291d89381bff8d9504e031350f64eb legacy-trunk
+46434 10a5973e0c9a7374f1c1c9127a47021d7babfcd9 sreifschneider-newnewexcept
+46436 3d81faf47af77dd09afdbed0f49b2c82315e03a9 legacy-trunk
+46438 ca657e0bd09c03778f016c0d0cce47d5ca4d2fc8 legacy-trunk
+46439 9f3375e33db95d08ec4c2d973a63e1254474f752 legacy-trunk
+46440 99d061bc31431d1ffa1c621470fa59d015dde47b legacy-trunk
+46441 8b4d2a9075af5b0c3f3a09aabf350d1dc3745243 sreifschneider-newnewexcept
+46444 549cada4e36cc57a3e5f2ae419968cf1ef48d2b1 legacy-trunk
+46445 3ff3d2f22012246fc18067522cde16a889f42da2 sreifschneider-newnewexcept
+46446 32879d26109d969606d787a551553083aafac157 sreifschneider-newnewexcept
+46448 16a1cad0f949992544bf8bca5c8b692ee9a49ae5 sreifschneider-newnewexcept
+46449 ce3e3c63fe5adde30ed0f7963acd2e3c4ec43afc sreifschneider-newnewexcept
+46450 003433511e4dd84afa4c041b2aa767e72e0bf76c legacy-trunk
+46452 73426e71f67ab5762af30d90ba5a31dce812cc84 sreifschneider-newnewexcept
+46453 a5d5e73b2edbb5fb3eb9979725e100bdd14602c0 sreifschneider-newnewexcept
+46454 795d1cb1df013cdf345a926baf5065bd015a0b15 legacy-trunk
+46456 4c0823f0a0a1574ea82c19de9d4c1e2a1a5609f5 legacy-trunk
+46457 a56aa8ab489b70c45c527306e94df145d693347e legacy-trunk
+46458 ceba8f2ea24eeba50875d443f46dfb971d6d29f6 legacy-trunk
+46460 ccdc0bc11dcf2e28f6c4bc96440dff14fa6499f6 legacy-trunk
+46461 6063e4e6ee20e17d949c217e3796232f67269233 legacy-trunk
+46462 30e4ea42336909abce065dd5c48692c5d4397ad4 legacy-trunk
+46463 781bd94cebad55e28f788dc922543f36fd944f78 legacy-trunk
+46464 05305d3aa04d1db64382e80b8965455dea64f7d3 legacy-trunk
+46465 506ef9130238b5eb9da2a793adcd6ed15e611768 legacy-trunk
+46468 5b0753b9d16ac38768c065ee0d42485c5b7b95fc legacy-trunk
+46469 72327f8f4a796fe56a47b90848b1beeac674cf9a legacy-trunk
+46470 8038e41f46cc0d24341b0bfe8836212d59f5da54 legacy-trunk
+46472 eae6de1b438380a55702fb30f1fbb01d10ed0774 legacy-trunk
+46473 08bf0822c50a0d73f9ff9356dc2e44042542e106 legacy-trunk
+46474 8daeb9af8422cbd47c29241205838b9bd3542798 legacy-trunk
+46475 9a65fd4255a37cea72ed01380511e09e06c7d14a legacy-trunk
+46477 807540cf7714c9894d29ab06def831b281efcb16 legacy-trunk
+46478 e957155ae9bddc21ca6661ea25c011cc40af644a legacy-trunk
+46482 038bb8d0058b2539572f19580d0e8c9aac43c422 release24-maint
+46488 4556c2c930f4b025e79ab1a1eabd04aad1e2210e legacy-trunk
+46489 3ded0908e952f646d400e9e55c6f8c68cb41f45b legacy-trunk
+46490 0f2f7a0d9b7dd2015b4d704e13ee1915a0dec134 p3yk
+46491 29ae5e0fc34828b5e63f184f30384611668dbefd p3yk
+46495 631c207c36923d023f84cd0a92b289b6b70be6d0 legacy-trunk
+46497 1a23706139ca0fc27868948325e2f42151abca48 legacy-trunk
+46498 3fec3ce2041384adebd9dc73eee6329699245c25 p3yk
+46499 551814e4b47117b32f6274c1e3908c464cf82144 legacy-trunk
+46501 236725f64a341ffe90129b097903fe10a59394b1 legacy-trunk
+46502 7fa7cb6d8be81e290aa2a6e8d024e38d74826d3a legacy-trunk
+46503 0203a8af74a75a9abf60dfd69df8aeb327af3918 legacy-trunk
+46504 6ba5678be7f2635446b9858f3d32fc6b81b7aa05 legacy-trunk
+46505 f76d3e68d1ac37b00b1d95bdfbd8bad338407dfe legacy-trunk
+46506 51255cc8a0dc04abe7305e54da3a30f5fc4c124e release24-maint
+46507 e989ee5d404abe776214ab080e27620bedc27f0e legacy-trunk
+46508 3204aa9e2b22596a962489905a735e86fc2cbc33 legacy-trunk
+46509 71861c37809371361edd9ea19d91cae6ee6f7f90 legacy-trunk
+46510 593accdde00ef333d3ebd59b8882acbe8652e56d legacy-trunk
+46511 f17d37920f6a1bdfce0860927e17b857e638bebb legacy-trunk
+46512 95fb2cd1d3bace475cd241584d1d008c826e179a legacy-trunk
+46513 e0cea605417e45c551f276ac4d9ee53d677d77e2 legacy-trunk
+46514 9268c30782c0aff71f4f3309baf350005b551617 legacy-trunk
+46515 938c0fcd5bccb6c73cabc9ad3d6a33933074fd4f legacy-trunk
+46516 d60c7f6c2aa004be3bb942b0da0a3187a83555f9 legacy-trunk
+46517 bf326581c7422262a8a9f7b08745e6618a44c607 legacy-trunk
+46518 9f3284c92eb30f10710c9b6b92c6d0076c7aeaea legacy-trunk
+46519 d3383063491f5983cfc1c59f1638ea0de621e030 legacy-trunk
+46520 aa065f82025246ba17eb23257c0d0186907b3f8c legacy-trunk
+46522 58e99f2a64eca1de2a6aae58757b315c717264b2 legacy-trunk
+46523 5531955993ed416406d5246647da12655e7cc976 legacy-trunk
+46524 9b001ebeaa5e4867775d10dff49031f3b3c47b16 legacy-trunk
+46525 3d1a99b39fca25aeb6141e5785f52b8c73c48270 legacy-trunk
+46526 6743a6a06f156d1dbfe89e7953ad8253d3398e42 legacy-trunk
+46527 fb56a3992604ba85976cdd11716784e0766b2211 legacy-trunk
+46528 f64b13a00f33b28c8efaa558a030ca8077339339 legacy-trunk
+46529 dcf92dd7408a3f0bd2af544949881a395f694528 legacy-trunk
+46530 8ac603e570a0558f9a275714568261894a9171ab legacy-trunk
+46531 5a12c0c5183e88a05fb9035cd8286a3c9b02b815 legacy-trunk
+46532 48a6af87f3e862a8b337708235d1462022d58915 legacy-trunk
+46533 3fe3ccdf015552163c4c91a1e946cb1116b6ab0b legacy-trunk
+46534 a5298f371be7cd2ad919422230355050580f89b1 legacy-trunk
+46535 c3f2c6676b061ca71289bddc7ce05232acd4cfb9 legacy-trunk
+46536 d5bdfd120232708267addc646bee36a0e7fc80d3 legacy-trunk
+46537 7d510e4f3c988505d06bc591c59098e054bb1362 legacy-trunk
+46539 4e4e653a80bf4af64af099b16eb298f858b1a277 legacy-trunk
+46540 1731fbdf029d209e76fa8b85288643feac26f58b legacy-trunk
+46541 6d79acdc812d2010d0d2cedf0ffffaba73431f83 legacy-trunk
+46542 a82fd7b044dc7a7d6d5d691a861a26bc8e2d0204 legacy-trunk
+46543 8dfba087dc077a61f50f3af6a2834cca24dc34e2 legacy-trunk
+46544 494cab563c117a139bda13894996f28cbe56d25b legacy-trunk
+46545 9f862d9f7785dda7510e22abcd3bc89f7d514cdb legacy-trunk
+46546 ec5dc8a49edfb657401db5c211693d7ca94b6eca legacy-trunk
+46547 c4501fefd324fb4363c9456f7fbf72d2c9068413 legacy-trunk
+46548 510682ac5e89dd5b65bd47b8ac8e0efc2c6435b3 legacy-trunk
+46549 441711cbfe34171da67436eff185ca4631109ca2 legacy-trunk
+46550 4f8586946c8f5632a465783e4a8f69eac38ff207 legacy-trunk
+46551 0aba63ff7f73e38683da555fc8b4bcefece81c78 legacy-trunk
+46552 d2008b31fd62a24d6a4fee1565b355ed04e02176 legacy-trunk
+46553 99564e62aea92de140892e17832fe217a63ecab1 legacy-trunk
+46554 e1158e1951da50f6eadf8824c4ee7077b242c96d legacy-trunk
+46555 13fedd0d0f26c664ed5964e4eaa758e3d0459e86 legacy-trunk
+46556 c747ad53e09e0f92944c546358c785404ed757e9 legacy-trunk
+46557 168eb6e15b8c7c951dd121d93f8d71da96ae6474 legacy-trunk
+46559 7f1f36b3c9f9aac3918ed6e86f3e3bf1e8914e8f legacy-trunk
+46560 ecf7173e79ff566f4f958badc189e57b70f2860e legacy-trunk
+46561 bb0d2b955439f32e4812370703f88e61e2246702 legacy-trunk
+46562 2fe3233bd42612f4b1734c1ae93de2610f156588 legacy-trunk
+46568 d2ae580880b4bbdd685ec7d90f4d39fbf9248ca6 legacy-trunk
+46569 f9d1840fad34852540925ef7af9be9f9fad9715c legacy-trunk
+46570 629ebf7d3b5caca59dbf0c13dc9a9f9af68cf55f release24-maint
+46572 1a56da86c11a879fa71950cb42e2effa18c6393e legacy-trunk
+46573 badc1737dc8019cf2b302d520005f035712a0ec7 legacy-trunk
+46574 f0f291fa9b4691841edeee5ee538000ed8e2cedc legacy-trunk
+46575 3fd8027845f802c9a0d8808ac66f74bd67086d9b legacy-trunk
+46576 f50d3a51d646f33beff5b42bbe60586d4c4402e5 legacy-trunk
+46577 d25e279c7ea9b257cdc5a1b12a3f735d49ab630c legacy-trunk
+46578 f831e8bc6bd37899344758a85f6e02775095c500 legacy-trunk
+46579 5f442f7bf419e4fc3c120980307d91b665c3e89f legacy-trunk
+46580 e0997ffa3572468b9ea0ea0cf62b16817ca111f6 legacy-trunk
+46581 a7f2295a78ac13950bffe8784bf8492f0b2cbb17 legacy-trunk
+46582 447a94b039deb80ca1da9333ba3ac813b870c939 legacy-trunk
+46584 428e9cbb43461e0eefff2f7430075a8475267feb legacy-trunk
+46585 db2d8aa9fe3d4208b99287f053bf48d13faeb3f4 legacy-trunk
+46586 3031a7110da9a8759732ff2602fc3992231af941 legacy-trunk
+46587 b1eb4a674998054a6e751a16e3a7eaf3be72ac0d legacy-trunk
+46588 cf677e978852fa6cebeb093a504e5d4b848b930f legacy-trunk
+46589 175cbdf9a5fbd0657f8515860ec51083be40cb83 legacy-trunk
+46590 995ecd231f7c598d5b4151303fd3264c8d072936 legacy-trunk
+46591 c5d50872eff482a737e4914b2c6284167ba4418d legacy-trunk
+46592 b9b036f02207e29b221534866d70d2ef29d4fd6b legacy-trunk
+46594 d7dd528427c0d14aa43b0f8fad52eb555386e9de legacy-trunk
+46599 f37e67bd4393184a1ebaaeec8d11b219d5517999 legacy-trunk
+46600 2632bd55c29f2544bd987416cf2cd79e6358db25 legacy-trunk
+46601 75d681159329d98f1655dbe0f27e5610d3fe8f94 legacy-trunk
+46602 697dd848e1f13636e5543fda5fc61d507a43329d legacy-trunk
+46603 21e8dd3e394577c58166b5150102e10abdfba388 legacy-trunk
+46605 2eb8be0f873129716076d36947ee0aa53958522a legacy-trunk
+46607 f9c301dc5fb74c8c2e18a5daf20dd08f82741d04 legacy-trunk
+46608 383cd94c2a67d37f2ba1b1c172650a9cb6841775 legacy-trunk
+46609 6f9b536e96f66353c1fe9e755238a9023e3e9c59 release24-maint
+46610 966e7470fe237333b4e0ef1d54c795280409f7f8 legacy-trunk
+46612 2b5a9dc4905c939bd4d3d642e0a77123f1bc75f4 legacy-trunk
+46613 64b9379fa80db08841359d1ea4388c62e236a4db release24-maint
+46614 464265c1d08b1ca67d456f88ec574c03c728781e legacy-trunk
+46615 3473fcf0bcee8461f6f66fd66605fdbed87d6776 release24-maint
+46616 aabc13602440af3e6f8b50cced2c4b5e9de03073 legacy-trunk
+46617 855993b09fd92082b42a7d6555690f2be940aa3e legacy-trunk
+46618 32f706fd4503e9890e7f11bc84481cf3bd37b53c release24-maint
+46619 970526c1a7e2ff3644ef2c2456332cbfa472a3a8 legacy-trunk
+46620 129ab846a71faff6123c355ed0562c7e32ef28cc release24-maint
+46621 d4140f79f1c70798a301243f64aa06aa2d651e4d legacy-trunk
+46622 f7d423c0bcd86a3b03bc9b596460002d333a4609 legacy-trunk
+46623 f0f5dca299907a4823cb9b9fbc05492f3166337a legacy-trunk
+46624 34714e40d4656df0276866614bdeb06b23084c01 legacy-trunk
+46625 d1faca4f0b8026125b1f1d2291f759929094beac legacy-trunk
+46626 a4654771e5b30144cb818e860d03848b050b6f95 legacy-trunk
+46627 bef0236d7bfa6f136e3f578ef552d5dc0837d8d6 legacy-trunk
+46628 4ec942cf8c92ed76e414aa83c2564a3671549168 legacy-trunk
+46629 806f3e14119d77dc83fd76160a42248594fec5e8 legacy-trunk
+46630 721a7eb23ebf9c09dca8b7c38302aa7118afe3de legacy-trunk
+46631 16318249aa3324637320be345e6142f27d2dd518 legacy-trunk
+46632 248d106f8952efd4fd71bc7b946667f48ffa08ed legacy-trunk
+46633 07acf6fa5aa0edffeeb1e01b6e8b1ddfaf561748 legacy-trunk
+46634 3aadc6dc4b1a642055aae8c04da071d51ff0ac99 legacy-trunk
+46635 6f7404f3fc5765b37d2a51373243c68c7043357b legacy-trunk
+46637 5722f112d5da54bd05b10b5ded4ae0f7e082d6e7 legacy-trunk
+46638 82072a8f52674f0354f63854f5c0ef688e714718 legacy-trunk
+46639 07e503e858efe27d4b083122f83dcc6c0e215f09 legacy-trunk
+46640 0b2b076e5908ea3c1234bb7653538521ba4872ca legacy-trunk
+46641 19430cdff2bd6aa91f29992cec08f146dbc00859 legacy-trunk
+46642 a114003aa3d3eb07133443b1bbabbf971b0f12e6 legacy-trunk
+46643 7239a1a80487900a3bf11d6ad802687f7a4bd5ba legacy-trunk
+46644 4722d37faa14378b94ade3062bd285591a6273bc legacy-trunk
+46645 e00e68dd1ddfa861a79f77525dc4df0bb4118f98 legacy-trunk
+46646 5ec8973dd221391b9ac58ccb7e8097c995085b71 legacy-trunk
+46647 db792977263acee6f04d58d1a4430587140dafc4 legacy-trunk
+46648 9e0b050ce46f05c0e77e36598d750a8490522b85 legacy-trunk
+46649 21969b71c36d0721cae8a362847a97c571818f73 legacy-trunk
+46650 5dfb21a37f19faf90b5e5150cd677aea554eacc9 legacy-trunk
+46651 7d31d031f8e133509aa117fe4ee5b2309c1d3ce8 legacy-trunk
+46652 913e5e84fade76d64b3b998108ff513e414dc426 release24-maint
+46654 f16d44d303cf84009e42904f5f850a0f9ce204b3 legacy-trunk
+46655 c4587a5f5e94ee6c6acc1853beb44e11a9d9b66e legacy-trunk
+46656 d0073c6f6f56e2d815353207f401cd4ac195986e legacy-trunk
+46657 1c23e95a80a2ef894c439d7fbfe6786edeaaf8c3 legacy-trunk
+46658 b00cbb08e0cc11bee0deab457a9fa4e3a4837aae legacy-trunk
+46659 58de61beddfcef3ff2a3e3f19e0ca6edf809acf5 release24-maint
+46660 c05ef08e1ba94d9ca17986930bbe40792b0c0d58 legacy-trunk
+46661 237456062b80f736cb87221331c9352c4a0996fe legacy-trunk
+46662 cb3f5138ecb5780a4fdb5c0aceb48e86f17da54b release24-maint
+46663 c908aaa91eae1787c315347a55e4fd3a581f57db legacy-trunk
+46664 1c9d8077ecfb21f9cfd767487962a159bd0a2667 legacy-trunk
+46665 5adba709606b3a64d22ca9b2b8d3f51ee787f94f legacy-trunk
+46666 990647e2abc4b2452b25e8778d93dcf304f3b33a legacy-trunk
+46667 a4b58ab652023c5812905348c7cca1648ad2bfa9 legacy-trunk
+46668 f3a679985e0d548df307a99a74a45f1b021775b7 legacy-trunk
+46669 30605bf95ef8b8be7ab07c04bd14015c88e65647 release24-maint
+46671 02d475405e3b5f290b604af03331110a5d3ef81b legacy-trunk
+46672 6649b51e245f925dc7741101c097558627a96cc3 legacy-trunk
+46673 2177aecd91fcbab3da8d7730a5a63a3a1976ca61 legacy-trunk
+46674 0855da14a820c0f16a5e7bcb90a68514429aec10 legacy-trunk
+46675 9639cb13b940530d1390a7ed461f710417e00865 legacy-trunk
+46676 687aacd64be966961ad7471180360ae2e2bd779c legacy-trunk
+46677 0dcb9228cb3fd8550240d9ad9447b1d140eb0207 legacy-trunk
+46678 654f0383dbcb2e3ccae981c1382c5551721b4cdb release24-maint
+46679 c4b44222a5994b07acd4e9e768ea3691dfd6ec54 legacy-trunk
+46680 18de50b58fb1d78ffce7612151a87e761d9e300d legacy-trunk
+46681 f00518bb5b4335775c06e269bd54f6c2232e8d2f legacy-trunk
+46682 80a627340c9f23d798047fe38c5e81f3cf0f57bd legacy-trunk
+46683 11f66731554dba780e5050547ac1c5a0cca7d299 release24-maint
+46684 a60adf0cb2fd74fbc7d924d3368c230ef9e557f1 legacy-trunk
+46685 7081e8d53298ef3c449fcd7a92431d6ea420b967 release24-maint
+46686 6ae418e4b36a9a67ccde723bfda2095fdb46e695 legacy-trunk
+46687 1e38ff81c8a952eebf7cbbf367257852a8c03ef2 legacy-trunk
+46688 828c106d5ecc9fd74cd16f8bfd1a9286b16dc20a legacy-trunk
+46689 5fbefb5c8a23e69cd02a6e39935c51c9c23981e1 legacy-trunk
+46690 0dcb62d6d99a28a4807664aab2c3589a569507a7 legacy-trunk
+46691 98e81af40007efd18ea666ec4da5d52ad16f4f67 legacy-trunk
+46692 1c016f9ca5a74ad13736cb7013ddcfd2f1382ed5 aimacintyre-sf1454481
+46693 280b8eaee1c034dda05ac2d872b06a28c7b02adc legacy-trunk
+46694 c989fafff3dc6c52dba2f148b2321121174d99c1 legacy-trunk
+46695 311f751aca7a332d8815b05d140fb946c788c3dc legacy-trunk
+46696 cb3b439c29ccfda9fe081f951976db1d62481fde legacy-trunk
+46697 931ad06bec561969d144e5a903edd88eaf348ab3 legacy-trunk
+46698 625c2d98a1f805d17937c36a839a559ed30730e9 legacy-trunk
+46699 7bfafdeffee260956ec28afdd3bf1536ba7d2803 legacy-trunk
+46700 1e8b59389e2e10b68268e99318f14a7b98a7bd36 legacy-trunk
+46701 1e85657f04740d60b697df22b42cefecfc96e229 legacy-trunk
+46702 3a36d5f5b10fd304e516f8c9888654b20fb2b790 legacy-trunk
+46705 ea9966c8865742d28046a83f41879deb2f2bcf51 legacy-trunk
+46706 0cd2273bc3b1756c88c3f6b6923c18ce96c55447 legacy-trunk
+46708 defb2b993434ff1f661975d62983f7df0f1ca811 legacy-trunk
+46709 a2cf871b7800e8ddc373a940eb6c35701b654edf legacy-trunk
+46710 3fb38351dd39cb73e5d2bb3b467588f136375eab legacy-trunk
+46716 2af5757de7b1e9ad647a992f2e6c73324c8286ee legacy-trunk
+46717 1cb2ece4b9e1de0eabd39d6ae41a20fe493613f8 legacy-trunk
+46718 a3668e94fc6d4d4772b4c34034be5153a2009f44 legacy-trunk
+46719 1b47d030c3fae5c7f5ab3b06bdf76fb33a2e69a1 legacy-trunk
+46720 7704f37541f4231febd602ce313293f562340d09 legacy-trunk
+46723 872e991f9b7015409ef57a79f235b07762c8af62 legacy-trunk
+46727 1100b52c55fdfe3645bf139e5604fcace7e7a470 legacy-trunk
+46728 a0761ceb8633a81a34d84f90fd3c6c6d92ddc6a5 legacy-trunk
+46729 0b4eac4050b80028bf2f55a0ec179041bf3a1018 legacy-trunk
+46730 fc3bcd4e44b964ae7280269d2e912840f956e3c1 legacy-trunk
+46731 0e7bafb1b82f9c1a19d27b8ea7f78c8d26d481cd legacy-trunk
+46732 7d31b6692ab74801deb35c656104207afa021bb2 release24-maint
+46735 e3c08f066eb80d7e81ed1d8990d038d105559f00 legacy-trunk
+46736 fcbf63c9b4f6fceda6252587bc1edfef123bfd59 legacy-trunk
+46737 4b0a3d0d85841b750f7f314b7e7d33d0e9c69b74 legacy-trunk
+46738 1e0704cd9ee81aaa5880f5a8db023fa4c8b0e717 legacy-trunk
+46739 5c58fda95aa5a2bfd421c7a1ed4cbce98c5434d4 legacy-trunk
+46740 f28f9c15e2d0f8e02317e870e66c65d6690135c7 legacy-trunk
+46741 3581d1dc4253372230596ec849a6bf0e6125d173 legacy-trunk
+46742 1d239c7e8d6075a3186018ab6b4fa40dfdad1b32 release24-maint
+46743 72c8f18e031183dbe9a7fce9fe6603111d96099b legacy-trunk
+46744 7619216bbc194c3431f83709aab96f9a9afbabec release24-maint
+46745 d3d961f388be2b03af64b148c73f02f4673cea7f legacy-trunk
+46746 e2ba5ae4b813d9fd2c2d268d8baf6c2684255851 legacy-trunk
+46747 e0d29586212a377edd9227368f4c3c6d70cf3215 release24-maint
+46748 dee73fa8110f3ead4300f91645f65db8c8e3e45e legacy-trunk
+46750 19fd6141940d5b0a7b4fb2c4138912abb0283d98 p3yk
+46751 24930e3b60619aec319cdf33b2cf40bc9311826b legacy-trunk
+46752 365ca04d08564a09d1cebaadae745b08a4776c68 legacy-trunk
+46753 09997b2f63a2c3dab2e6cd7ea9cbfbff1bfa1b2f p3yk
+46754 a19c20c5e5c75662157b1102e36c07d1e2c01ab9 p3yk
+46755 6ba7d46679867bf9d4ab6ee98e155fcd0117cad5 legacy-trunk
+46756 0e319667455c35c62224355b37293ede4e5023b8 release24-maint
+46757 5bc7272b81e547dfccea0b0ffb80352097cf7556 legacy-trunk
+46758 935ac22f0b3f026e53f8dbc7cb1bc9d65137162e release24-maint
+46760 5f195443e00aa909c905fd151c39fce78edd8492 legacy-trunk
+46762 4e798caa082e5cdd12a2d7e1f72fcee1b7bcc059 legacy-trunk
+46763 c20384057a06c27b736255a0b82b84d19da56594 legacy-trunk
+46764 c3c52f159999ae9460afddb4d637cc1221f90fa9 legacy-trunk
+46765 eca4fe132940bd3c52aa6db110e89eb4235612c3 legacy-trunk
+46766 2ea263b628972e45273fd9fdeb8be1ee9665b624 legacy-trunk
+46767 debc8d783f869e5a8c8a7298f7240cac1cf9a277 legacy-trunk
+46769 0a1bad32abfe39d9a0dc0bb26cc4c50f56eb80e1 legacy-trunk
+46773 67f430d92b38e5ca44c22c763a6f4317f9aff834 legacy-trunk
+46776 46599fc486e8fdaaf21f8bb83b9a88b4df204f05 release24-maint
+46777 c57321c84226c916796a8ed5c07ec3b5ed16b26e release24-maint
+46778 77b6589fadb97d85e0c645c815c989f34e5564bf legacy-trunk
+46779 4ef1c685bcbdce4443b328ae07c9777039ff30f5 legacy-trunk
+46783 05a49c8985fb09f475c7a2a9f43b9d183a969976 legacy-trunk
+46784 ac25eee90254175121bcea157635e9edf1f92d76 legacy-trunk
+46785 72e37ada417072fb1a130308ce8e30e3f0b7acac legacy-trunk
+46787 70aac2b93e09a3a48900b25bd3bc8d5bbecec20d legacy-trunk
+46792 6e8d997181700d41c22326fcd349828e6c1cb987 legacy-trunk
+46794 135d1586b35d54bac81d71fa46e2d6a79848239c legacy-trunk
+46795 1cafbcd7f55ccca91c4085b1f5a6ea5af9af2ae5 legacy-trunk
+46798 76ad118ffe3b5f856286759f0edc753d48ef7b48 legacy-trunk
+46799 5a74193429f064e125de9362cc1863644d8ba42a legacy-trunk
+46800 07f24197b87cd70d21168af1a114c5f36cacfc40 legacy-trunk
+46801 26a97e5bdf212151103a7b830a4537ea174691a1 legacy-trunk
+46803 b129a50271adfec79206236cc2ec53944befce54 legacy-trunk
+46804 1828af5dcc9944a2f7855b7fcb16864b78b3ba9d legacy-trunk
+46805 ba6eebf7c719dfb58a5e3954a8ce5b24bfa38909 legacy-trunk
+46806 16c798e8eae327b85a460cbba1cebfb441976390 legacy-trunk
+46807 493fb577932f2d8831a43b5319c4ec97f28a17e9 release24-maint
+46808 42fe6de24602fd40f42e393ed13441cf549a3ee7 legacy-trunk
+46809 ad5d4735bedc846c6aef21c102ecdbcccea5c321 release24-maint
+46812 67450db26f8167e78bbc3e0509708147d557cbe5 legacy-trunk
+46813 e15fafa4107d20d6b0d419dfb7bf3dd9b2de85c3 release24-maint
+46814 08b24c88d519010f5133b8394387c1276e484f5e release24-maint
+46815 e7d084cf65bb9b40840cee933daf1bbc550ba438 release24-maint
+46816 454aa0ec0eb7b3a6cb341cc2103046a3243ab6e1 release24-maint
+46817 82331f11a1560bfe3cef41981bba94a4d5fde0ec legacy-trunk
+46818 e2d2dc506528779bbd25d6950241add133a760a0 legacy-trunk
+46819 42808526511c9bb4920b1e107221f8ead173eff6 legacy-trunk
+46820 b23eeb802780523b65496e4bbf5ea6c8262b3ea6 legacy-trunk
+46821 3125099b34971c30c769783ed3900a6e51cea216 legacy-trunk
+46822 2dd1970146122adecec876926d248b55265aae81 release24-maint
+46824 aa5a1bca28dd88ccc2dec14b59e43a4d81e670f8 legacy-trunk
+46825 cd5f2c5bab653b55736e773eae385ab432c2f8d1 legacy-trunk
+46826 538cf188f8a6cbc2208a52262eb9abdb9f260641 legacy-trunk
+46827 bc091181b841395507a778021f4595f1b1e4b24c legacy-trunk
+46828 0142536b52b64b3a836a6278077f6f05bce4bc19 release24-maint
+46829 c5afd440a4d09d0de0c7737e5371cd2d35e72e7b release24-maint
+46831 92440de868e93fef13b3383be9cc510e97fb4dfc legacy-trunk
+46834 a1dd25ec2f5bc66558c3389dab55b0bf312e7987 legacy-trunk
+46835 73665f6fec315aecf30dcf7e31af468ffa7d9b45 legacy-trunk
+46837 7b318e96f80aa948daa40f1ca071e99e1b3a2ce8 legacy-trunk
+46838 b8f22851c1ff1e59924c5e7b26580b93a9026556 legacy-trunk
+46839 0b3fe2b734a1dff140655f13c30c83db5536e647 legacy-trunk
+46840 bf4e485becf377622b0fc2bae9e2ebee7c2cd30e legacy-trunk
+46841 195a0d3eecd45eb743ab204bf8a2e6307a1e6384 release24-maint
+46844 9d8478f732d5adc91f1c7dc8cb29940eff1b477c legacy-trunk
+46850 9a944676732a7db0e40bb65c8def665c3328289c legacy-trunk
+46851 e80097bf73b60fad8e7f140f30365d13563aeccf legacy-trunk
+46852 e615755ca8725fb0b9f8fcd715ccdd39cb56ebcb legacy-trunk
+46853 0a8a392e1faecf30f81353e8317250d3938b56d7 legacy-trunk
+46854 af1742a8049ec7886e84d5105eef893fc20f4b0d legacy-trunk
+46855 501ee2a05fec4b8fd0df5b6c288eab72b35d8ee9 legacy-trunk
+46856 adf20892d8cfbc0ceffdc97bdb177f1aac993abe legacy-trunk
+46857 49026af9d1d79c41a0a7aa64b2febdbd13453fa4 legacy-trunk
+46858 e8464afef4a41aa9a7b2f615c0cc31b880d70cbe legacy-trunk
+46859 1b3b6b1982aacd0314888effb81bbed5c6516736 legacy-trunk
+46860 ab253cd497d213767302bbeb6a25f88a2c0004a8 legacy-trunk
+46861 fc4afee40c2b3b858a95974bc3417851937375aa legacy-trunk
+46862 a789390d8ea7edde7d0634e7caa8455ab7a894c0 legacy-trunk
+46863 b50ab288ae27ff489570be31b86a3368c3891df7 legacy-trunk
+46864 d67ded7a2914e4cf3f9c15a182470ab431ade0f6 legacy-trunk
+46865 fca1e424d0238f8952b0883f7eb9c774454d990f legacy-trunk
+46866 cbf272f479d107b323eca40639632a099d88962d legacy-trunk
+46867 5a994d26a3cf894ba9a16ea885fa0b7fc05a9965 legacy-trunk
+46868 0acc52d3fbf1f435a3fc3be7b2bee187b79f8c8b legacy-trunk
+46869 e6c800a463b13129d3c71802caa5d437d3161ff8 legacy-trunk
+46870 8ba97ccbf93a83f6e6bfa8062e5dbbebbe856072 legacy-trunk
+46871 66cbcce42278f22d214b68a6eb2efec759893a5e legacy-trunk
+46872 1fa78fd1e93391474fc895317096e85e2e4472d1 legacy-trunk
+46873 60d79a2bc997e8cc0c330408e317312b3b7c9912 legacy-trunk
+46874 1a11a4a49fb85a3f96f4e34f270bfb0fdb07945f legacy-trunk
+46875 3eee7bd9a0d072b43bdc6ed70c7f750e249a6d34 legacy-trunk
+46876 41570f099a4c3e651f6b2d57d79c09b670766c1c legacy-trunk
+46877 92d8cdc4b90c02c4d175fa6a470a737985126404 legacy-trunk
+46878 f14ab70c320e48fd2b52e31fc7a87bc250705e6f legacy-trunk
+46879 69e89c29044e2bdd0fb9b7553b0f9b5f932fa778 legacy-trunk
+46880 47d8d19ccadc7052ba8c2b52469a01ec5307b4c9 legacy-trunk
+46881 79983cf634c025ab4a5e71ee87d7c98f3480e8b0 legacy-trunk
+46882 46f3eb474c842d0b00ae9291cb357f7611e29a4a legacy-trunk
+46883 a91e739ce33325fa4aaf10024fcd8a38873d096e legacy-trunk
+46884 189304c9d07eada4cd4c219172ab5ee590c2f490 legacy-trunk
+46885 2ab0394e6e49b4f353b86b03cef963d5a53e6ed6 legacy-trunk
+46886 618d088d96689cf7ddae783e2c4c8f9384cbbccd legacy-trunk
+46887 1da8456ebd48719a4ebd787e4fbb3565c3030915 legacy-trunk
+46888 d5771a389b8eb7a98578cd805edd3e1260fd53d9 legacy-trunk
+46889 1703efda57742d181be045f20708d65d92db99d1 legacy-trunk
+46890 51732e81c7961467f6832eb6fb8c03a87e3cf38f legacy-trunk
+46891 8fe373fb21d430c4a64eb454d01ecbd2dfb5b946 legacy-trunk
+46892 971abf3aecf41158cc70c1db793d1454f15ade18 legacy-trunk
+46893 97b61d6f6b768162047a9c64861a17c50c533836 legacy-trunk
+46894 4c74ec831a6c3bfee3f84493fc80bb9bb76eb42d legacy-trunk
+46899 381a72ab5fb8394a2d3ea28bd70c100d636c7d1a legacy-trunk
+46901 c8618473cdc6e816b69cb0cae0c8a5492d0d32db legacy-trunk
+46902 51f3342b70d3cfa739ed20fdf7d445e0c22c6432 legacy-trunk
+46903 765fb1ccc3d894dbdb1ada91d3fe94368b626dc7 legacy-trunk
+46905 9b8507cfbe9501059f2770fced295d1c9b7a7bdb legacy-trunk
+46906 a4552f08d53b34273ef4cc44657958e74593f187 legacy-trunk
+46908 9c52efcaff651dee8592137f99c7f3c737454295 legacy-trunk
+46909 70b166ca1c49e237885522e824d80fa9de8d4f4d legacy-trunk
+46910 914da1036eed5db6b068a6c808ea8cfcd32e756c legacy-trunk
+46911 936429e10b8796eb6bec31afd30950e249294bb2 legacy-trunk
+46912 ea3723b2d46bd17804684bbad28811e10be6760b legacy-trunk
+46913 6456092c1235a1701a764a7cedf967bd4421bbfe legacy-trunk
+46914 e1b18479ce9307d3f5fa8124910a53d4d88c3cc9 aimacintyre-sf1454481
+46915 98122d2176f140a1f50277f9327f22625995d7a2 legacy-trunk
+46916 5db1fa6e9681835f52d0cc974f84185e8dd2960f aimacintyre-sf1454481
+46917 992126a29e0fd38d4dfc04dd71410a11fe0a1d51 legacy-trunk
+46918 4e74df959518a4b7383c6ed4eccd666a24df123f aimacintyre-sf1454481
+46919 f7d23bca599febcbd1e4e19c101fe81f1d3b4ec6 legacy-trunk
+46920 a714f2f13e25f22704f17aa182440be5549a274e legacy-trunk
+46921 3e96e5025d9f7aae4b04f365786cc576da5219ae legacy-trunk
+46923 6f2f18f8638743d49ad47d1291e46a5ea2a5bc56 legacy-trunk
+46924 6f30611f283dcbe72ef760906f705f183bef4797 legacy-trunk
+46925 5d622e483fccfa62df57b44c34493e1c32568968 legacy-trunk
+46926 51250766d6f5d2513202086b6fcb94b852c1ae74 aimacintyre-sf1454481
+46927 bb1f02e9711da5f53ead27b7223f5c4aa04baa04 legacy-trunk
+46928 2167105123e4478baac753c149647abd99bb49af legacy-trunk
+46929 6e0c0c7cf0689ad480cc5efe172a5fd20ea9c4b3 legacy-trunk
+46930 70c2efa000078f29c4dced25f269951c52c8f23d legacy-trunk
+46931 a2490f7931d31139eb5d7dfeb20f4ca991b4827d legacy-trunk
+46932 bb684a0c22d9634a0cf0c3761b0f689f96f29476 legacy-trunk
+46933 74bf573bff4c35e7a85e29e85118aac222da1c29 legacy-trunk
+46934 0a5cf25945e2b675cd52dda19c094d3f2a5ab81b release24-maint
+46936 3e5fd2b70e5a70d5e571394ff1521c314f764d9c legacy-trunk
+46937 ece8a6751db7488b7b807f6e31818707967e2ee3 legacy-trunk
+46938 6f7e64b72a5879ea6cdc801526fce7fe128e7d53 legacy-trunk
+46939 4558916b841f1cfa7829919d73c5b2d58bd0b74b legacy-trunk
+46940 62cf6d58bb53fb6bdeaa070a55be54c6e517e5b9 legacy-trunk
+46941 5796acfbb6da16784bd8211650bfc04a5c90fe24 legacy-trunk
+46942 b7a3620d3dbb76705d2972f63a446cf431c9b483 legacy-trunk
+46943 6d8076d380597a669df4c12a21ac7faea5fe30ed legacy-trunk
+46944 d857a32075d4bec0712983c3a3c39cdedbb1c183 legacy-trunk
+46945 549c547700af8725e504ebdc095d1585f7dd195e legacy-trunk
+46946 069ff3a70694104a43f1c61f491fb6dacc24b3ea legacy-trunk
+46947 c959de64a8da187e1ee87e1763800c974652904e release24-maint
+46948 4377b17ddb2cfe503dab82c5e748e3cc269b6e4d legacy-trunk
+46949 069062859298c5242f1c9c6b5968735140559663 legacy-trunk
+46950 c520eece01b039684b5c82b7a7a59c7aec8d4cb3 release24-maint
+46951 d6877835791d7c642a3df092a5c86d94675e6796 legacy-trunk
+46952 b7f4ba601df97af7ce5c3acc35f2200acfd1b048 legacy-trunk
+46953 917beea55595d9bb0650e0ca97584dc69d6abffc release24-maint
+46954 16e05c606275eb88ff5e837d8b9b7c8b7725ae99 legacy-trunk
+46955 d1aec7b4dbb8693f43892ff7a6ab1812e261c5f5 legacy-trunk
+46956 03c05cab5f21277a9e1b19bf7cdb48a5e8dc6a45 release24-maint
+46957 0f76a56d506cc200c942db49aae101aaac01de37 legacy-trunk
+46958 0cf2eb3cc50a73b6e746248367d168d6d0e9d475 legacy-trunk
+46959 8680853e9ee409763fe18d0c31f08b425e8daeec legacy-trunk
+46961 d15df02db1cc13f7ac4418a48a13f94c7a52b0e1 legacy-trunk
+46962 d7bc6470e83835cbde0f2276fdf3d4242812cdfa legacy-trunk
+46963 32adaad59fb37d79ab359954211825f16c097ca2 legacy-trunk
+46964 0a8b851b0375229ebee063d613c1ce6c819fc074 legacy-trunk
+46965 77b01c9333088afa6e4c1d47c4218333825c0807 legacy-trunk
+46966 a9f9b5075bc0cf03cecbec95d391d5fbbcf51d5c legacy-trunk
+46967 fd412a00a07df459c2ac34902421953049ec2383 legacy-trunk
+46968 d4b1f9a31c2969850333d25d5e4fb4625b076115 legacy-trunk
+46969 9937f09d76e3a0de8adfb9465c3accbe25865bde legacy-trunk
+46970 793f026993bb29d6cc9159265329f206ed670bec legacy-trunk
+46971 3b65eefbaf76e3dbd0fc7da8a2b1c27029887e4d legacy-trunk
+46972 34b697041191ae71e2687b465e7534faaeb574d4 legacy-trunk
+46974 c77be5c4063b31e4b87bd7f3b669a8e25f3b55a5 hoxworth-stdlib_logging-soc
+46976 99387774eb1dda118e287f6b0118ee5a5b6a5386 hoxworth-stdlib_logging-soc
+46977 54df35e9c698a7f8d85bb1ecbfa0a3c72c54b95a hoxworth-stdlib_logging-soc
+46978 9e4828000cfa928ba119d0f5df1fda3c167d3e45 hoxworth-stdlib_logging-soc
+46979 7dbbe786fdcd23dfa79b8a5c03805fec454cc69b hoxworth-stdlib_logging-soc
+46980 373043a1bdfbb8501e945cf946610563b044cea4 hoxworth-stdlib_logging-soc
+46981 92eb6ed03c2e1cc8501228485884f0867a7b0e7e legacy-trunk
+46982 cacd47a61e796dfb3674417d4025cb3739f1014a legacy-trunk
+46983 1f947f1341d1947b32abdf092d18ececa486bf09 legacy-trunk
+46984 9a9d5782e4367b9a018dc6f429379e509de5406f legacy-trunk
+46989 9e827fd831d77c848f764aaecbafb00ee0b83af1 hoxworth-stdlib_logging-soc
+46990 b5efa23cc9488d7ad366afdb00f6472def6296cf legacy-trunk
+46991 e76b6f3a44193935024393d051bb3810c7e92ed1 legacy-trunk
+46992 6b4da4ee7146eb9066bb9e8ccdf8b6fdba74c27f legacy-trunk
+46993 e0c3f5a4440fd4341bc7d46e425a0e55d742b3aa legacy-trunk
+46995 557e62126cb1dc22eb85b0e596941a6edd060ee4 legacy-trunk
+46996 b2a4be4737282300c4f0f5557df56e5f5b93da8b legacy-trunk
+46998 8a50d8e9018c84795700aed8d9a7d8c28392f2a3 legacy-trunk
+46999 f6dc55d32f702ce09ce648e4ba28a1b2e24bcfe8 legacy-trunk
+47000 aff6629d1d1c411fff4642ca1d19299b9f4c8328 legacy-trunk
+47003 03cf5dd7c90615bf87ffd8ed96e732a8dd247068 legacy-trunk
+47004 a0b062ff2939c92ebe37cfb5da768d78bce4bc29 release24-maint
+47005 c50267039088e02094d7d2cc3933afc801ecf2fc legacy-trunk
+47006 02650a47ee8be39384268ff383b0ef9951354c10 release24-maint
+47007 96e1b0c8ff9a8da1aa33382c31793534501c48bf legacy-trunk
+47008 1258e93bb1d00594d4d102b7f4c00d7792918f8e legacy-trunk
+47009 484d3d5ba7f9a5ab03301e4e2bd65fe04764ee39 legacy-trunk
+47010 b9d1440c2dd1631d4d087607ca9479ce7d68d1ce legacy-trunk
+47011 6a7f1f12eaaf7d44e8d3c9336e231d1f84446a03 legacy-trunk
+47012 411d0a353a15c84fd7e2b0e5cfa67c66623c6c91 release24-maint
+47013 30d2333852d50f01d3d38c9ee078626b1b68f668 legacy-trunk
+47014 ad5add9e03696d3abdaf16c0331bdf6451157c77 legacy-trunk
+47015 f4b44125646789f545910915d5d5af00885eccf1 legacy-trunk
+47016 93cc3fc25099999eaa5e8f265229bd26038993ec legacy-trunk
+47017 a3c61c648fc8194dc795bc6c179b8d8cb201b39c legacy-trunk
+47018 805f41881e270e3812f91d4719eb9600cd0b34c1 legacy-trunk
+47019 2843bf70a9cfd4f99e26393ff3caaca66776bebe legacy-trunk
+47020 6729c27d01fe8db9f1452cc8d4f170bf4b7fb98b legacy-trunk
+47021 118c650e2c9b3b44edd2c8c6e85106335288c0a2 legacy-trunk
+47022 4a766024043aeee592a6c0937de2db4b15a0a672 legacy-trunk
+47023 0b95a0aaaaef986ab4ece317c167a122f8a2c615 legacy-trunk
+47024 0bf9e3099c57bc730fdb65b16f5b95a57e56d5b8 legacy-trunk
+47025 c63d2b6263b58b7207137b664035b7bfe49b93b4 legacy-trunk
+47026 4830d6147aaf099524d7c4abd0bda659f4112f6e legacy-trunk
+47027 a746205f59759c7328d898e78b8cdbe98341bc30 legacy-trunk
+47029 f0885fe14d42aeea1e79b748061773a5e29a5707 legacy-trunk
+47030 408d2a596f9923456a72c69880360d859c78488a legacy-trunk
+47032 5b987d21231bfb6546623600c365421a6d4fef05 legacy-trunk
+47033 f19e877281e4903711f1577ffe636086c7c79d76 legacy-trunk
+47034 d49b198f545cd82fbf735a22979c332b8a97eecb legacy-trunk
+47038 52375f2032448fe47b06e59a62c29057be8aa0a8 legacy-trunk
+47039 f8716b76a71ef7a07a07fd284585fb1d188c7475 legacy-trunk
+47040 3af332fff5279a7ae564c9fc4ac9338be6b6eccb legacy-trunk
+47041 fdccc6b14fad6eda559baa25396c4acaf874ab81 legacy-trunk
+47042 26e4bf195ae292fd989431f0f32ac6d159c414d2 legacy-trunk
+47043 a3ba1a37b53748bfa84444a0da9cd251f6ee4a06 legacy-trunk
+47044 868126e3bcf6d02a54fb88514721ea8cae7123a0 legacy-trunk
+47047 4fffe677f55296cb79abbc4ec2ba3867e87de686 legacy-trunk
+47049 7023cedcc5ed04a45b99cf7f8e5a3eb17b32823b legacy-trunk
+47053 051cc39a80084327dc0adcbfea6991e2ee457abb legacy-trunk
+47054 53b04c19fe416cca90d8662257080f090378b8f7 legacy-trunk
+47055 9b0f9430cbcbdbb4965ac602723bc41ef2c04282 legacy-trunk
+47056 1491e52c85970d2538c8417f29ec5e0cafb56010 legacy-trunk
+47057 e3ac739d4889555cfd45e8c96fb68d59234f294b legacy-trunk
+47058 a4dd6b209b65a2a6e86aff2aa19bf0b004153e78 legacy-trunk
+47059 69ef23fcf5f83f2a1e40138b8fb76e44fcc31dd2 legacy-trunk
+47060 152ec22c4e695da116f8b8e1ab55694d194943eb legacy-trunk
+47061 506c76847ec71625d6e349cec259817f39d20618 legacy-trunk
+47062 3cdde45a468d59b3b7c94f2c4b369937e0cacd46 release24-maint
+47064 cb7225e848056cc07f3515da0220973e52908b24 legacy-trunk
+47065 aca36f7f3ae87ca0a37838ce04b4e190ae570091 legacy-trunk
+47067 041ad0068570116fceb41d3b04121600d573465d legacy-trunk
+47069 ebee5539308aee77924ad6558d9b103d0a16e990 legacy-trunk
+47070 aed8094432053d174f1da91a5c99b9307b5a3511 legacy-trunk
+47071 2114eb73aeb51727aba41bef99dfbaf950eac17e legacy-trunk
+47072 58034084ef44ae45f2b817ef49e53aa4ea7a4446 legacy-trunk
+47073 65353c4db8c21b93c95aac55b3f097d75866ac8b legacy-trunk
+47074 afc475d0567869540f61ca7d6a38501d64d832d7 legacy-trunk
+47075 afcb582d92d830484735dc9497d06b7c053a7290 legacy-trunk
+47076 78816c5cff0508c4a28b585a67fddfcdcc00a397 legacy-trunk
+47077 bceaa7720cc711cd53eedeb83a5a54f9ebafc234 legacy-trunk
+47078 d84224320f828a0b6d28391d405c347f79f0095a release24-maint
+47079 9b46a4f52d0c0315ff862684747addc4bc780708 legacy-trunk
+47080 323da476f17ee17f28539fe07231f388bb930386 legacy-trunk
+47081 bab0b1e6c6d41cbfe2e46a38ad08679b846a46d4 release24-maint
+47085 64d1f66a239a609c4529faf8ff29c9580551f381 legacy-trunk
+47086 6f042f5bf94de784692b339ade989bad5605094c legacy-trunk
+47091 c7532856fd17592525eaf9d88a0e4bf11f068076 legacy-trunk
+47092 1342dfd527339008eeed4083e80abf6b39ae1495 legacy-trunk
+47093 09d1606e75249cc0120df12585985a03f4a65d8b legacy-trunk
+47094 ad59491527116d3a0227a6ff57d717bd1b5b0e7f legacy-trunk
+47097 b9a64b7a32612db629e98eb8dab8aa1552bca546 legacy-trunk
+47098 b82c40dc08d82cd0140665a3beb252c3d6735c65 legacy-trunk
+47099 8168d05f9b49e60c49e6344cb3c290ea05aeb1d6 legacy-trunk
+47100 f2cc156eb928e3fdfff399740cf56cd83aafe9d9 legacy-trunk
+47101 58f419d8c6461fb917b06ccc9c227297b4e68768 legacy-trunk
+47103 35cf0f87983edeca80596d811db5f3b1f3432670 legacy-trunk
+47106 f26613bd484d7de7d516468df3ff3b269ee57c71 legacy-trunk
+47113 b8b22550acac0145720c53556eb267c4cc77997d legacy-trunk
+47114 741313029d63d9694473b24e0fa5d01e4efa78f2 legacy-trunk
+47115 225479ace9a70d279ad74f232e57de17aeed9892 legacy-trunk
+47116 ceea8a986584477a30c94597c76deba681d43e0d legacy-trunk
+47117 cb839996a386eda0177bc0ba8ebb6986218f8c3f legacy-trunk
+47118 721cec7f01857477f56f36203e0eaef89946eb5e legacy-trunk
+47119 4dea5f46ee9855424980c5a972d43bac8a52e2be release24-maint
+47121 de410252b9fda3b8d58338bb511ee3d765431858 legacy-trunk
+47122 52250eeaf791d6643df0b13732502c04ae8b452d release24-maint
+47123 0602771b8b49b7c3340dd4d0ba436d7bdc29dd08 legacy-trunk
+47125 095546ddb2f16c647347ccfc0f6b368a3a3e763f legacy-trunk
+47128 7c8990cccf9b2ad9bcfd20828e6f01b3361748c6 legacy-trunk
+47131 ac3d4b71bce2b26c9fa79bdd35a3fc431c7d0f92 legacy-trunk
+47133 3cf218e8b4492573b228b3ea3192296a3108bb25 hoxworth-stdlib_logging-soc
+47134 0388c7dce4d42666d1ef532cfadcfb0290573ee6 hoxworth-stdlib_logging-soc
+47135 4b4ed2302d1cf56ef1619305415bb0de2d787124 hoxworth-stdlib_logging-soc
+47136 851f378ab9cdc5b7564c47d2fd743075669a619e hoxworth-stdlib_logging-soc
+47137 d74908e74d30720f5c10c3332b43b07bbd065d6b legacy-trunk
+47139 56bf56f5c821476d5d67cb427790cf1a69095ee2 legacy-trunk
+47140 a4263c4248cb67e7ad3bdc63bf4c717eaacdc79e release24-maint
+47142 5b8079660ec45e4c8b260fcefa66fd8b513103cd legacy-trunk
+47143 58270a690f43c5d19009de2060737ef6943be8a9 legacy-trunk
+47147 f99fbfba89834601d44704c1b94c6609981bb688 legacy-trunk
+47148 2ee5bda920a245ae0802ab6e1841c6f88236cf41 legacy-trunk
+47151 1eab5ae3b1ffbaee72e59ffdb7e5cf8ee4491a9f legacy-trunk
+47153 b3ef741e26171aff11fce11afb9c0e84b3454138 legacy-trunk
+47154 3c9d3a313d81de53916847b3425cc2f0ba1b3e10 legacy-trunk
+47155 17f82bd68878532fb29934181b6f54cdcefbf77c release24-maint
+47156 29e43c5e118f7b0901423ff64e2972bda53a3336 legacy-trunk
+47157 1b2df2ecbc636a2c8b72233e825ac60eb79d7389 release24-maint
+47158 0a83dc3529d15af44934f5b3481c0cb8a033fc8c legacy-trunk
+47159 f49cc2906cd00f604786d2d70ee2baaa83385048 legacy-trunk
+47161 c6d04c9c3c4ae774c5a290016469311cecd692a4 legacy-trunk
+47162 99b15c25b84016938aa695e29ff5d5e631f92db1 legacy-trunk
+47163 15fe9dbc5d39ef128f9d8935e0aa8d4002c82207 legacy-trunk
+47164 da22b905dfbebd9e9acd888c35416b8ffc82947b legacy-trunk
+47166 a21e420a597cc9505171884fa243acf47f4b7cdd legacy-trunk
+47170 d85708769ab1d94bcd2b40468f81a666e9eb9c69 legacy-trunk
+47171 1392561d5dd7ae3de2b4bd5522d407886b22f6fb legacy-trunk
+47175 272f195a284e7e014ca942ffb1858962affb713c legacy-trunk
+47176 485056e53cdb99cf1568873b383e6cdf6693f58f legacy-trunk
+47177 6b0c63a975147a94f69b3a038838c94e75504b76 legacy-trunk
+47181 5d2c982abbb39e784261fc6100e1c22c2a150b21 legacy-trunk
+47188 d4dbfbf3f2b90c5c23990fab7afafec5e3bd691d legacy-trunk
+47189 b664a908bff350ed1b56b560f4f072d2a15b7460 legacy-trunk
+47190 c547f6e91c584b9426205fb86a301ffe77d643ee legacy-trunk
+47191 e076e3d76f7710a0001e1e38cf562dc4257a688c legacy-trunk
+47197 5dd736268ff44023db665c6ba71c44cd6d18b209 legacy-trunk
+47198 6975bd4884ebc2c8004bd968bad7bf430007957a legacy-trunk
+47203 0f3ba3def1ad80aed1fc4b51ff47d583a636eae2 legacy-trunk
+47204 c01230076859c1fe66ceaff3170084fe9889e998 legacy-trunk
+47205 8894eefbb0a49fc5eaf549e557d9c1ab5e23f3df legacy-trunk
+47206 638241ff87bddbbbe0e2206527709ae6b9572790 legacy-trunk
+47207 27973962fc9fb62cf8f6caaf069b238756a50dde legacy-trunk
+47208 b1614f674b3270435b98fd80c3ef33ec11e61493 legacy-trunk
+47209 e61a938fe998d5f79974b376312f0baac02ab83d legacy-trunk
+47210 2537deda351fa8912cefcfdb92bf220a84b1164a legacy-trunk
+47211 b9470d67d96c2e2702e809d41f88d74a8706af10 legacy-trunk
+47212 0e8a94ba21066da65df9d6608e7e48bba639371a legacy-trunk
+47213 e9d39c5fcc274614bc2b6e3eb934e94ea731d02d legacy-trunk
+47214 f116582f6622425e98cca99ebcb709257c3e2dac release24-maint
+47215 093156899f75ab2cb06d090dd79894b7641f3e05 legacy-trunk
+47216 16bf366483233b08dfbce3b9f99265255597df86 release24-maint
+47217 8675a6084240f85571d40e90305c4354a0431344 release24-maint
+47218 c5bebcbe45391a3cbb2f8b911a3ee64806219529 legacy-trunk
+47219 81304c01463a2e9bd8a3e7ef86a153482a46d034 legacy-trunk
+47220 63a319f0733ca0666b6f21a33b400d4fdcd90476 legacy-trunk
+47222 01d4b06850676068109e2cd9ae9196e53761e130 release24-maint
+47223 75bdb1eb0766595da316923bf1cb5b68dd8e39d8 legacy-trunk
+47224 9c922e31b6a5c89104c46b20f070d693f32f3bcb legacy-trunk
+47234 c82375d560b3fe8a28a277f919e6016294da4dce legacy-trunk
+47236 41fc203a3e91f1615c14a6fb38083d018f4748ad legacy-trunk
+47237 18989d09d584e6c3e84d405c66411aae8dfbef13 legacy-trunk
+47241 6d9e22c330e4b7640300469ff39c59f63ad450e5 legacy-trunk
+47242 0c4e5a0c1914f7b22dfb0b0e3cfdf8568573a336 release24-maint
+47244 d9e78319a192938126714e6d7b37d032cb44d04f legacy-trunk
+47245 755044713e97ca243ba6dabed6e7a8f9df5e1723 release24-maint
+47248 b9155bb26b281e8e3311d36c7adf40e4acba1fa1 bcannon-sandboxing
+47249 b0bd0bce9406eda4b10327498d954fbb6b13d32f bcannon-sandboxing
+47251 9e821435a612d1e972b3596e248debea93699b5a legacy-trunk
+47253 500ae952150b7668e30076549eed04049c0c338e legacy-trunk
+47254 87e5b010b3b09d5b5b9c54f74e39088db3f041ce hoxworth-stdlib_logging-soc
+47255 71eadc35f16372611669a8f64f9963d5420add4a hoxworth-stdlib_logging-soc
+47257 41561b0014c8b6815648e5042081fa68d6aee83b legacy-trunk
+47258 40f058673170b8a6a8adf03b6ae5c07cf1aa70ab legacy-trunk
+47259 b851afcc1649656703a72d0efd5c2f9fa669bfca legacy-trunk
+47260 e3cff61b777961af46f42e3c17eff848cce084e1 legacy-trunk
+47261 4dd1a9383e477fc672c9544330125ac748057de1 legacy-trunk
+47262 d8ce9bc405e41b69546a144d717cd5aa090ee5d0 legacy-trunk
+47263 68c9e8a553683b2c2348ccf2799848f8fdb30d66 legacy-trunk
+47264 2073f32cf71fc7ea44856eb5278d709cee04a93b legacy-trunk
+47265 697d05480053d6fdefe645e089fcc146db1ca810 legacy-trunk
+47267 f4e33b12bb57b100b34c2f9269052f432095104a legacy-trunk
+47268 34a66e2f89598025ad1c73a49a4ab83d1ba5d573 legacy-trunk
+47269 f68e51a673df73f2b1f4749e746cf39bc099f262 legacy-trunk
+47271 34cb9a6ce12d87f6ae0316661075c88b09266110 legacy-trunk
+47272 374c229d90e8f366e5955984c45615911e96765f legacy-trunk
+47273 5a4ab382058a5f10f34ff2520a60543a04751460 legacy-trunk
+47274 eebc95f958e48f377dfd995ce63cbaa4a067555e legacy-trunk
+47275 238e0b2037fc248aa7e63de6edae415dc46632a2 legacy-trunk
+47276 344251cd8d764409cc03c5967fb15f78c27d5426 legacy-trunk
+47277 3fa790b0aa6815c1e1dae8f230ac85dabe8199d8 legacy-trunk
+47278 f93dbfcc663b33073c82bedbfc3e585c1d40e7e1 legacy-trunk
+47279 58c88a7c93263c48bbeb1eed3a2203c20500bc6b legacy-trunk
+47280 8fefa99e87c0d3856448fc7673d27de8f8d106fd legacy-trunk
+47284 ed43243c88605efc8e09ad44afc1a27f65664bf4 bcannon-sandboxing
+47285 45247b93a5d9a1019207a1de22290ed65e060c16 bcannon-sandboxing
+47287 b3c0e0759ac0980446092e45e7784d3f3b3adcad legacy-trunk
+47289 da5983614fac22819caec095bfe238f01f637e58 legacy-trunk
+50477 108dc2f1e7da32cf1a1c7e7ebf5ddfc4ea5e1c65 bcannon-sandboxing
+50478 bb305026324422ae7ac45db3fd09e422be9e1955 bcannon-sandboxing
+50479 b8a8efc00b1e25e2f4ad9d7cdc465a13ee681a04 bcannon-sandboxing
+50480 903f9867654a17a39474ceae329316675d414438 bcannon-sandboxing
+50486 35afe7c4677206cd35ba37a208757483e14e2388 bcannon-sandboxing
+50487 b42812c774d0c949b0ba77cf5c3f6180701382ea bcannon-sandboxing
+50489 066aa42ce5f240978c1656f5ecb606695eb82a05 legacy-trunk
+50490 abb2c76a5e050cf8d06c26073cf2265b2f042bc2 legacy-trunk
+50491 1c5bdbc7580ca18ce6992b18b72b462602b77539 legacy-trunk
+50493 9f70f6ba7b69cbe6badd11fd290732493756aaf2 legacy-trunk
+50494 bbc78f021007c0f04218d9ca26c0ba79bf0680b5 tim-current_frames
+50495 64ccd745ea920be1b993891e49637d1f351c4494 legacy-trunk
+50497 95f9e01845556f96128161da4eaef61b3bf56a2b legacy-trunk
+50498 3f5561c5d95955b139cc64ee272fe3f09e395335 tim-current_frames
+50500 ca3d9a67126bf8d914a7661b7da2001116d0d920 legacy-trunk
+50501 8cc9784130a0e83d06277e597af0a64860e796ef legacy-trunk
+50503 c02fa187e0f49cb2dca7a9c448db53618a66e691 legacy-trunk
+50504 c67b23397f30649afe754e57307c8daf7876c562 legacy-trunk
+50506 0fe08aedbd8c4fcbdfb60a3c23524680c12459c1 legacy-trunk
+50509 c547645ab7364c2947566adaeb97b2303db61f77 legacy-trunk
+50510 51428c378cc3e26f1fb2dc73fcac84c325a4cc6c legacy-trunk
+50511 7e43d02ee21a61edf6ce374e45cb94ff714448d2 legacy-trunk
+50512 c1f4bf8ff748c01f6c238573058e9243976473a8 legacy-trunk
+50513 35c4fda47dfbd8f73085f121b39400b59141efbe legacy-trunk
+50514 02598c57ca09cc0e8ea9240a235b3df085f8799a legacy-trunk
+50516 f373646795018255899fbadb77e80665b09c701f legacy-trunk
+50517 ae5645c76d5ea33ecb8ae5813a617e315efb1ffd legacy-trunk
+50526 b978afe7cab66aecffda7c987374ecec0f6724b4 legacy-trunk
+50527 8addc913171e88348c3f49779124bebf46e10a7c hoxworth-stdlib_logging-soc
+50528 f2ac31fc369e62fe77fb5b5c8924710efb42c0b6 legacy-trunk
+50537 3b38ab9c4b03695a3315851c9fbc8fc7250c604e legacy-trunk
+50540 c84997e1ecc76925489bd301dce630d07cec3bec bcannon-sandboxing
+50541 b6fd499e4343fb77790cfe4b73527f1338b2f204 legacy-trunk
+50542 c361915df2913c61af790a0617f2a0e4417ced47 legacy-trunk
+50548 fcbf46211903a4f2a0d76408687ebe1a8e4f8068 bcannon-sandboxing
+50549 e40244f5feb94d0154d3e03b03b879c3bcc110e6 bcannon-sandboxing
+50551 fa6ca3f5f226e580ebbdd69e11aff99b85a0ebc6 bcannon-sandboxing
+50553 1ca015be70ae22f85aed70f8c9ed68f1e27b9ed4 legacy-trunk
+50558 2d57e4b08ce68cf7b18b36d8f516b7a5b8dfd7a5 hoxworth-stdlib_logging-soc
+50559 b286536220938302cce16eb52c0fc60cd07b4b54 bcannon-sandboxing
+50560 e31edee5bc3f54e342662029789bc4e5ac64174d bcannon-sandboxing
+50564 216a97a2ed36f259daeaf2f9115920324f12a747 bcannon-sandboxing
+50565 daee8f8c035f96ae19d0830e72b12a1023a4209c bcannon-sandboxing
+50566 e3f6066ce75f582d94d228079a0b7533771ac37c bcannon-sandboxing
+50567 52a8738f5ab4d1e6800d33de0127cd6f626e4895 legacy-trunk
+50568 03b6fe57cd6df5bb34ca19f4b760b943186cc806 legacy-trunk
+50569 00f975ead344afb2cad14a2ce59519d98b1c6c5c legacy-trunk
+50575 d6463e8ef9c47d3273d3e9055daad116939b0d0e legacy-trunk
+50576 f50b9da5e361953ad40b3c243a0a6f4d7480f98c legacy-trunk
+50579 ae0c328ac5bf91bf8e68c5d94121edd86bc7f335 legacy-trunk
+50582 214b28d7a999334d041ac707f0fde9963a5806e5 legacy-trunk
+50583 655229923d42f9f33b3c382104970ec7fbccd83b legacy-trunk
+50585 c7dd6696ec8cb170a17c7ae2c702d1bae85af5dc bcannon-sandboxing
+50586 6f69afb785d0bf9c5a0007d574cdd8914ae0528f bcannon-sandboxing
+50594 e6f16b7a584f2366d11a78c7f0f7a53064beca29 bcannon-sandboxing
+50595 933be3e0ac6cb056ea64a5012235bcb9f05f62f2 bcannon-sandboxing
+50596 717a7887fd7a76d714b8c12d6ab908dc1b77dbcb bcannon-sandboxing
+50597 7182c2775c1e4542cd7d426205c49d65b3d80bc5 legacy-trunk
+50598 b1bb179a8ab057dbc2d745dc9066806213b069a2 legacy-trunk
+50599 476cd83777f2ba72edc7efeca2556d6b8dd853a0 legacy-trunk
+50600 2c3ec720aa7beb0da4002b847cc5ed7dc782566c legacy-trunk
+50601 b095e8388b2e64525de2835c722ebbbd2c61595f legacy-trunk
+50604 36c5d085b869207403cf41e61b7a22d4b71ec7d9 legacy-trunk
+50607 c48b3a68f6962a695b29bd162b242899f63a8d7a legacy-trunk
+50610 b562fd79500d1d370f697cde52de4097a6b64e8e hoxworth-stdlib_logging-soc
+50611 2f30515cf66b96e91baa1c7b4699fc41434ef138 bcannon-sandboxing
+50617 892b7ac26d3bb59008425cf36ea823876522219c legacy-trunk
+50619 e4b6a4f2ce1437da614b9d21edff0589db5aaae1 legacy-trunk
+50620 cd459c920f990c943f61061e2b2f301348a41d0a legacy-trunk
+50621 a7768fef59b2cd1ebd2bc798b1397d7c64ab148e bcannon-sandboxing
+50622 fc69fa6e54c86dc2e14d840518f31235753b978b legacy-trunk
+50627 18b9796b7ba58c74eaa322e59f893e30321f7aa6 bcannon-sandboxing
+50629 c870ee066c12548c8e97a38118dd7613dec8aef5 legacy-trunk
+50630 f71f2843631fecfb3ba0954312326e3ba085879f legacy-trunk
+50631 2a84b46ad64ca69fa4edcf5fe0e5ae3012b6f554 legacy-trunk
+50632 16f3c02ede02531b1db780d4eefca845bf28cbd5 legacy-trunk
+50633 0de58bce47ef32a30f1ee7c194aec2aaf03a5a90 legacy-trunk
+50636 7dfc776dd81bcef68300376385299f481f24fcb9 legacy-trunk
+50638 9f2c3de74856ddd13bfae6880b0571c04415c684 legacy-trunk
+50640 85ffc0bfcc9829eaf06ffc40bf7d69ab13ddeafc legacy-trunk
+50643 b63256349e7790051ac717744a2bf97a0ebf935e legacy-trunk
+50647 7f40ef8717311146f704937b5eb539d662e725fb legacy-trunk
+50655 6b1ed7b7048e5e8b9180b919978ed58472745ec7 legacy-trunk
+50656 bf474f9d5225e7e7ea60c419e449a817ae1812e0 bcannon-sandboxing
+50657 5ecf22a4e5dfc20445d347da0540d678c4cd5c3c hoxworth-stdlib_logging-soc
+50660 0529a585064c4d74d465bb1dacdb6870a9308adc bcannon-sandboxing
+50661 14671a80abef0907426c98de6cc762db6d0e55f3 bcannon-sandboxing
+50664 2a76ec2f0b79d0d54a19c9ab0366523a4975da2c legacy-trunk
+50665 0631641fdeff4ee450c2ff64f5113c3cabc68053 release24-maint
+50667 00715353f82c5677f7f1302057c01796db68690c legacy-trunk
+50671 c136ff4d426dfbcb7327d4e356096293d078dc52 legacy-trunk
+50672 910a948e0290f1817178a48f887c34aed4bf5aae release24-maint
+50673 756d57acda85bcba28f230e45d7148f8cfcceb99 legacy-trunk
+50674 bda93b45ca413eb3a511d53bceea1dee5ce37b77 legacy-trunk
+50675 3ddb59483f10335f165169c68a282af9c0ac6140 legacy-trunk
+50676 aedb85ee4fec2eea70a992c565d72255892aaba1 legacy-trunk
+50677 50b0b54fb17d7e3fbe5abc02d157daa45b230bf0 legacy-trunk
+50678 775f85b98e65983963934a28d45d9fb02b418510 legacy-trunk
+50679 90d5d1fea4f2c11567839aae7f5f9b72ff23d991 legacy-trunk
+50680 35d50fbe0b889980ffb365de8ea03cf94503acd8 legacy-trunk
+50681 934ba5be8f3f0c27122ad173523c7022a95c0667 legacy-trunk
+50683 a55197bd7200de11323dadb8c95f16848f77b54a legacy-trunk
+50684 6064cb301209c8ec737e7fb51b7e8bd56d6fd7bc legacy-trunk
+50685 aa85791f59913f1a106d7a982a12ac3c27176b3a legacy-trunk
+50686 d2bfcc1aac3d4fae9e2937b8708f27e3696d00cd legacy-trunk
+50687 bb1707265de7e26824bb5c0089e270b845117481 legacy-trunk
+50688 00894152180502dca64c744d5e0531ffa21595f1 legacy-trunk
+50689 654a5b262717e27f29c2494f1d01cec6064aa736 legacy-trunk
+50690 628b8510fefbb9789dd72f08b174600dd71f56ff legacy-trunk
+50692 fda3cbd74c718efce6f7fad465ab117a51e5ae23 legacy-trunk
+50693 ff539707a1ed347bbd97b095427af737ce26c935 legacy-trunk
+50694 e7d0a75e314553f6051f5f12a174fed8058696b5 hoxworth-stdlib_logging-soc
+50695 244fb524ddd41b544bf576bbf83c95e1d238f5cd legacy-trunk
+50696 979e390e2bb4c565d068d3fce8169bf242107ee9 legacy-trunk
+50697 9701633818b4bb2026bf4d72af8b3900b4183d11 legacy-trunk
+50704 95fa8fc8a065c3704e838f6948372854836d4b2a legacy-trunk
+50706 acff1c34cca3c35f710675d3af9b71d6cf23bb61 legacy-trunk
+50708 85b23965ec4c0691b3a251538cf9952387560bd5 legacy-trunk
+50710 08f35abecf980fda54e5cd9c6bac22bd545d0d07 bcannon-sandboxing
+50713 c5759b5a57f0c690929a9970ab45fbf04f4f6feb legacy-trunk
+50715 1d7da8608031bfd2f0c74a2d09b6ec8b9eb58099 legacy-trunk
+50716 5ff5a583b12e9c64d50fbc513e2ffafe94677086 hoxworth-stdlib_logging-soc
+50717 84e9166b7108f10d622452360bafe9a1e06003b2 bcannon-sandboxing
+50718 3c5db2b3f893ada27dfac5d0c5ff04b09a6a2bcb bcannon-sandboxing
+50719 5c903f6507199e3d62eb280f7056050a0a880fb5 legacy-trunk
+50720 8fe6786f51445ba4b46071db61c60b4a13dc8160 legacy-trunk
+50721 5ab76fbf23f3cf217bffde7a5a15c11ed7ae2319 legacy-trunk
+50723 2a1fefb18764ca32d1f68b15c51d0e80de89e944 bcannon-sandboxing
+50725 140531b124f85df57292741e25046bc95885d7ac bcannon-sandboxing
+50730 be1734cc6dc02c574896a16026b590cb48ac2177 bcannon-sandboxing
+50731 a32f20ecc024b7bcb9756c740c5a1ad55bc6ba4f legacy-trunk
+50737 59769b534789e753a54206f05e918f21f712d143 bcannon-sandboxing
+50738 eb440ec74a13ebf553132c7604fdaa7c25c425af bcannon-sandboxing
+50739 06070a12a6b02b570ddf7978f7f5afe4217819a7 legacy-trunk
+50740 3572faa9a29e078c3217f69f1cb840b928a47c1c legacy-trunk
+50741 7f38173251bbc6b005ea0ae5357c0718fb71ba16 legacy-trunk
+50742 af4a3a0d47ccfe6f6b747345c478c089b6f1e705 legacy-trunk
+50743 f2031f15d99d8128adf1cb3a70bab71b97c0dea3 legacy-trunk
+50745 baa54337c3d9e95fbad359615712d4a41bfa5278 legacy-trunk
+50746 7c09b66f04bd1491b0367c9771a9421997fd7d4d legacy-trunk
+50754 417cdede06880f1d549833d6bc478122d119b8e9 legacy-trunk
+50759 d0a95654f80321ce23539c9ad2ba8c27f365cbb6 legacy-trunk
+50771 079e42e0b826a890cf0f0354f4bb01bbe276c7da legacy-trunk
+50772 f1a2777e5c8b3d6854c41c41b86f8a635441e812 bcannon-sandboxing
+50773 12e973bdfeee298f9124b0501dbebfb877f6f1da legacy-trunk
+50774 ee6ab3317581bf7845d84b5a6e977dbf89910508 legacy-trunk
+50775 832fce50da9362ea44443fec9e6e2495e6a227e3 legacy-trunk
+50776 7132f98ef07b32d9944933f2dbe7f8e7480ccc19 legacy-trunk
+50777 75a7106662a3fd62729e3d222388df53262201c9 legacy-trunk
+50778 1805e684dc925729754257f60beb11efd7e8e903 legacy-trunk
+50779 bc5d831f1dda509cbf56bffec5e73670aaa9a827 legacy-trunk
+50780 cdbb44c3de8715a10c0dcda8f08a9bbec69f3e85 legacy-trunk
+50781 0e0a97ced8e91f92e23a8eaeddd2e6e47983a3ed legacy-trunk
+50782 e9773fc27e9b36a595de513f75be3fdadf237870 legacy-trunk
+50783 957bf311924784062285f2fbf9bf46d86ec8fce1 legacy-trunk
+50784 9d18d968a58b331fe7f235e9616c012843963a7d legacy-trunk
+50785 e3da5f87fe641d8b392eae751fca0ac3ff69f5df legacy-trunk
+50786 54bb720632c42fd185ade8999e8c0e28823e6abb legacy-trunk
+50787 0a4ad83fd65492253c287349815d60be8bdb60b0 legacy-trunk
+50788 3ac8509437dfdbc24500968ca8d3d8149cdd7685 release24-maint
+50789 b58f7952e38ae891d2a10354f9610339f4a317a3 legacy-trunk
+50790 78643be3cf40bb3a9f4d4393572ee02232c63e9e release24-maint
+50791 a3fda843234e48d1ca6c82b25e63ca4a44a993ca legacy-trunk
+50792 f8819bd4e43797705dace0117e22c562ab44999b release24-maint
+50793 53418cbad7fd4c362b9e748fc9d565b1348c1c3d release24-maint
+50794 a4c4b7ea79c0a74f36913199b746783b1e1178db legacy-trunk
+50795 832d5a34130fa5364570740de7510690a1bc3a5b legacy-trunk
+50796 a4fc4e752634682527b7f0d1fee25bc328bd5b04 legacy-trunk
+50797 63aea688b5bb26dfccdc40e565728db2aeec738d legacy-trunk
+50798 1b1fd18b1ada5383c25e5624f861bf053d586128 release24-maint
+50800 02fa1015cbcc4c934c840a3f9fd2fe62001e972c legacy-trunk
+50802 caaf37e45d47d47ec4783586b9606e940e8d0188 legacy-trunk
+50803 89e090fef9853021cab6996b7d8464be18db4131 legacy-trunk
+50804 efde5ee88c9f7779f01ce5b3fc6328f17342f937 legacy-trunk
+50805 0c00e2f509e0079347a3da5d3d8c514fbe718734 legacy-trunk
+50806 7ce7ed2ecd9cad34f2677c84317745ccc2e2b48e hoxworth-stdlib_logging-soc
+50807 d71d466974e587bb363957a099cfaceff87871f7 hoxworth-stdlib_logging-soc
+50808 eaedccc0283d7910e49ff2e799afe9338251fb20 legacy-trunk
+50809 07cee01a4fccc387f0fc1d928fa50fa81ee7ce11 legacy-trunk
+50810 a5f8d1d255a979bc70f4f68c07439b6c3ed2d389 legacy-trunk
+50811 99aa84224f1819d552726aa911ea85709454f47d legacy-trunk
+50815 63a44c91a4d5ebce325fc0f822c2e8f82df12e27 legacy-trunk
+50816 62282fdaac5a0a135659502bf3c34b85f74416f8 legacy-trunk
+50817 790a782d983cc74464185402230bc8eb2179db97 legacy-trunk
+50819 6621edfd296ab8de170f160988170c6707f0227a legacy-trunk
+50822 2d4c9accb8fcc13c4286f1809ff207ee1c3e9226 release23-maint
+50825 837f56950cea8b742a463d7469860163492feb2f legacy-trunk
+50826 ff8e7c46e429801f056d11f0e314ac7e66c6f968 legacy-trunk
+50827 95376752e67cf93bb13f54cffb382a9499dc17df bcannon-sandboxing
+50828 903fdc38d5645e4c2e0189200f5f054cd9617a72 legacy-trunk
+50829 f90f328627561c5d671a84ae38d122619d6af324 legacy-trunk
+50830 b9151c8c79e8f53e9d339d05041067536cf02d2d legacy-trunk
+50831 5d1162e6bc37f48d5f28f9baae4aef66e93c323a legacy-trunk
+50832 40e8caef840ef249b5670ce081bb189a4bda6a6f legacy-trunk
+50833 1490529e74ce3bab9283b85533bd33c96cc3a06d legacy-trunk
+50834 b55bf2adfae5e9143abb8c99dc43df833c868ec4 legacy-trunk
+50836 5f3312054cede61e835e484133e3e795544b07a8 release23-maint
+50839 cfbf57572457dc035d08b14a475bc0194a231e08 legacy-trunk
+50840 6b200b8c63d33266c3cb3fbc74eb99e8d09f8da1 legacy-trunk
+50841 6d184fb8c535098d99a153afea66ff297f947b59 legacy-trunk
+50842 7da6f81ad4d53e521a96cf575948964c4b22a736 legacy-trunk
+50843 17d5671fffccc3ca98d8c6ac71a1c0e32f04c406 legacy-trunk
+50844 9c6dc6d09b073623e31f881a35f1ae1c810cfa46 legacy-trunk
+50845 9f3f1edd9c350638d19d03d9bf55453127563e6b legacy-trunk
+50846 267065076f059def042015e85afd49e5f50587ef legacy-trunk
+50847 271b2bb2fc923cf0df033ab5a510a15da6b095c8 legacy-trunk
+50848 f292a2b14baf4812c343a79d8961cbab96524414 legacy-trunk
+50849 acf600471369f43f4b3f72b34e48b4877fe69fc1 release24-maint
+50850 f08c5bbb80421cd34be7b1b80fb20ef6bfcb9c38 legacy-trunk
+50851 b81642e52287f36bf6a1e0f9cab1b1f52c9d49c7 legacy-trunk
+50852 1e00ef07beb271984823b8d2f361804ace5d39c0 legacy-trunk
+50853 185f4283a3b9cd4b670d9b0abdf1f2bbcc4162e1 hoxworth-stdlib_logging-soc
+50854 29c2fee6c9848e8a27789d71a70bbd5348d1e9e2 legacy-trunk
+50855 40b446ed3f1262d962e23e1afc3c19bbb00ee340 legacy-trunk
+50856 5ee6d3da0e6456487d10683bf7569711258004c7 legacy-trunk
+50857 bcefbc5e671afd7a168425caead32d08cfa7ede6 legacy-trunk
+50858 0b0cc7a49682cc0af81ed4e403fe23d6bd1db571 legacy-trunk
+50859 d765775ed79f8563a19955cf8e5b05aa8957ef85 legacy-trunk
+50860 8ca3068ea343a24ae73aab0f41410a5108cf430e legacy-trunk
+50861 025c27b812f68c424a66ebb68b181ddb429870ed legacy-trunk
+50862 b011becf8c822c2bb5654c991d7a76d2001ed218 legacy-trunk
+50863 c18a6694a066c7e95d15c67aac5b4f6669d07ec8 legacy-trunk
+50864 00ace6e408b0371a0f2258815704c60ff924c252 legacy-trunk
+50865 a110a4462189a20002b8d8d4f0742e654af4c70a legacy-trunk
+50866 61c0fe48376a12d8a33c5b6435e1fc5c1954bb28 legacy-trunk
+50867 60522dfe625990b045a40a411007d989ce03058f legacy-trunk
+50868 72a52e6fc6f10e53f50b6f121f20642530448137 legacy-trunk
+50869 879bd7510fea00d212697bae22c3975c86a8bf01 legacy-trunk
+50870 6b3d4a0f2ac591578074d5fd3784eb42e6877944 legacy-trunk
+50871 c4a7546a509f174c388de43456c3ebc06d0e86e2 release24-maint
+50872 ce4dff2a9523800cb6507142eb099cfa64862cd1 legacy-trunk
+50873 eea674211d32bc1d563e02d2efdd993e396274b1 legacy-trunk
+50874 0d0d82e40b927e53dab863ef604db2a5c5515d89 legacy-trunk
+50875 c6d4c0af2a122269a1910d4ab1a533ab0ffbd6d1 legacy-trunk
+50876 ac01b6359b621588cd8fb3c4f731d3ad696a8208 legacy-trunk
+50877 b0cdcbcc5f4578db64e4c7103804a6e4db8511fe p3yk
+50878 a7530036f055cbd842180391966fa16a62f69b09 legacy-trunk
+50879 e19da9b002da31c62f1883ada12d6a453ed96ee3 legacy-trunk
+50880 6eb3757c2c991d3689eb58747b33a6821def93f2 legacy-trunk
+50881 28cdd43e056902cffb7c0c02ec6ce62cc4627ee5 legacy-trunk
+50882 078172eeaae53d61412307408484ba981a2bd2e3 legacy-trunk
+50883 0b3fd04cdfb4885c73695d4671eaaaa26630dc7a legacy-trunk
+50884 112f2188213b24cb2377a0de2e0cafdfe52ccbfe legacy-trunk
+50885 40cebafae56ff603f81cdd9e0e2e252a1f74c6b7 legacy-trunk
+50886 35043fba7aed801cdda53a8d270b728f38032ff5 release24-maint
+50887 cd8f20d400c1c65a330d73e4cf497ba4d60bd2ba legacy-trunk
+50888 ef1e7f3d9f9d82ec9cddb759dd038faad37b2aee legacy-trunk
+50889 61c8b4104aefaea5211f6f9cf0c8541e87ec4ea9 legacy-trunk
+50890 75431b0bfb0e7213b0b34b0960fee093a634177f release24-maint
+50891 b9f353c2c023e5b986332d7868ed6acc320509af bcannon-sandboxing
+50892 697ae362ed024152a108783c63967ea00117d714 bcannon-sandboxing
+50893 4276d0b469afff24f2b7e27101e06e8b5f72bdbc release24-maint
+50894 277d7af55c4945a780ab384d76ef23abe7453f79 release24-maint
+50895 4a6ade9ce780db90557a36a1cd9c05296e54e435 legacy-trunk
+50896 55865d7bc6ea491445acaa5311be199a58f1efc7 legacy-trunk
+50897 bf1984c13e2f798644649dfcc080e81801a0d613 legacy-trunk
+50898 6dacdc1a0054fa9369c73a958f5912a2ebc8669b legacy-trunk
+50899 0e9a269a21890b1005e8b8090dc676f1760a128d legacy-trunk
+50900 d1664a501da5cbde0e00107e8ffc9961e8abda36 legacy-trunk
+50901 0de9d71444f6296eb58400716160a1463a3e5d76 legacy-trunk
+50902 a9b2fd2d4c9617ca54340973e922461a663e4878 legacy-trunk
+50903 c834cb95637acdb17d23dd16d6aac32da6a0d54e legacy-trunk
+50904 c3bb4b23eb9b3fbaca262c9f81ec09fcaf69208e legacy-trunk
+50905 406c1efe7beed3469f691e69b13cc9bc33db7055 legacy-trunk
+50907 04df0a9721b2c74cbf301425c621eb953f4232f7 bcannon-sandboxing
+50908 1b597c80157222c4329108d4c7348ff474044b9f bcannon-sandboxing
+50909 9fdc6841c3eb69c72ea17fb34a01c543f23fa01a bcannon-sandboxing
+50910 308ba643173a004f3fbcb9da4a56bb232837843a bcannon-sandboxing
+50911 ec516baf8a30c5d59c25a21e2d82b644a3965463 release24-maint
+50912 f3d540751ade07dd98cab10863ecd2fdab711715 legacy-trunk
+50913 c4ac6ea497a105ed35443e4e6a24276c69d93b96 legacy-trunk
+50914 87c9e331d5c8d6112c813de81a3df64abd85f267 bcannon-sandboxing
+50915 6b96d8c923bec5b15ea4850b133729b815d4bf84 legacy-trunk
+50916 3f4485b20e799e8cae27a0f7aa82cc27509488a4 legacy-trunk
+50917 5e85eee335828d835d8a8049547953bedd8e0c81 legacy-trunk
+50918 12cfa1bcf843d74bcbe13e8425271e3f4b3fd11f legacy-trunk
+50919 8b9ccd5d931e0f2437b5af34347ee040c6b46198 bcannon-sandboxing
+50920 925ab478299424970973e296fd2695439d9e2b24 bcannon-sandboxing
+50922 a54ae2583b70100ca208fe1135e6b7837e500bea legacy-trunk
+50923 e795e05d6d565c62b932a37c02b67285f289c009 release24-maint
+50924 6c8bc7cd72a6c9fc7f481e03c03fee0a61e9a23d legacy-trunk
+50925 fb6bccffbe310a4b088260fdc32dc470cc7babd9 legacy-trunk
+50926 cdb4787226af3b55310ae805a949cf318a305115 legacy-trunk
+50927 d453440b33c6e51733f1d3fb2bbaa00fa556a943 legacy-trunk
+50928 1fad4f3e36ba4fb04439d469cf1b5418a71e7cec legacy-trunk
+50929 ab3495df4ccecba6e1d628fd7a8c73fa4070e06e release24-maint
+50930 bd26a1953c05be2eafd3a6de56d68380794baf85 legacy-trunk
+50931 a995cff843b340e1f5ab8c977d224fafc0cc8b13 legacy-trunk
+50932 3fed7fb6bc9644939cd7ef3c0172616a4a50e245 legacy-trunk
+50933 5f21543c33dc4eca7ae3ea2531e746fbb091fd96 legacy-trunk
+50934 2f3d871bf6ef22f39a257c666934b873e45cdcc8 legacy-trunk
+50935 6ff72ad93ad2ba617c5151f14e1e184ca5b4cb9c legacy-trunk
+50936 1c94f66237779b56baa971e171ffd5a0ebbd1288 legacy-trunk
+50937 6a8995c2e8bc991d18cacc34060221f243860b1f legacy-trunk
+50938 0691d901d89cbf3bac0d53ba5871faf7d2486d22 legacy-trunk
+50939 0aba6b1f5a01c3bdf5df1da12b43bb5de177b3c0 legacy-trunk
+50940 1a222f110aaaf99dd12182588564e11e11525913 legacy-trunk
+50941 cb1e432b4919f1064406a68c8ef1608358bd6524 legacy-trunk
+50942 4dd52ba52de83ee13c33ee774ea12fd476559a65 legacy-trunk
+50943 3a2d3eda3e16e5d4d96d8fa5d557f4107bcbcf01 legacy-trunk
+50944 34983c0b26bc2926629e212674c88f261f84107d legacy-trunk
+50945 8069d73acbdf8b5e9d3b87c6ae921ab5f8b0b9d7 legacy-trunk
+50947 35583f55c5a8a55a067a1be1cfb40ef1ae4d264f legacy-trunk
+50948 7281429a01d67d4bb70986f2e577195d6bc432f4 legacy-trunk
+50949 34c20d3f251064073dfd6eb3d290329b7814a012 legacy-trunk
+50950 88db602f23a6d1e5d45a8412403c0ae9c5579594 legacy-trunk
+50951 45a354f74d80d65409a0df2a5a2a592b6bdb446d release24-maint
+50952 4db9d9533b163d179c0999c0b4be67b5791f6b53 legacy-trunk
+50953 d8888c8b872b13a7374d463a3668870ddccfaf15 legacy-trunk
+50954 6a5f79a4e68733e136f1256c0c1b911725f8ff56 legacy-trunk
+50955 5ad6e2a72b2ac2a142397f42359c1e5fc9a81190 legacy-trunk
+50957 6d1f673f05907c683b71946f70c1aa0e52474458 legacy-trunk
+50958 805512cf14efca65ed8cbbe0aa0c92fb13f1f9e4 legacy-trunk
+50959 4407e5193a4b0c917285f22fcc0847ec8e06c4c4 legacy-trunk
+50960 4e3ad65f55e8ee27cea0121bbda964ecad2b3c45 legacy-trunk
+50961 efbaec9674dfd1f998d065634322c7f1aae89e1a legacy-trunk
+50962 dd51e56b6cb0a5d29e897bbc25a00e31649d49de legacy-trunk
+50963 1523c38cd505ff21922b6f8b47de1d3d700ff269 legacy-trunk
+50964 388b7d90bb8963e97e4bdceb1e6d1874fb2d883d legacy-trunk
+50965 f69d91a7cf714894edd046ee57e314206ca3a785 legacy-trunk
+50966 77f3653bfc1483f740b120c779a8e3fe3adb61b8 legacy-trunk
+50967 aee9f0d5fd2b1672453adee9de520b63c73b6cc8 legacy-trunk
+50968 b745b3fd66a649a5fa540bdf47971c26af0a959e legacy-trunk
+50969 7dc5f3ede4cdc62bfefb1d70bd0baebcd9758364 legacy-trunk
+50970 041eb6231cdc2416d9b95d065a82ecb1a1475552 legacy-trunk
+50971 1b4e5eb21049fb5e59a3b24468bc8dc897020a99 legacy-trunk
+50973 cebee1f852221911adb0bb0956b19758d4fac62c legacy-trunk
+50974 1eb9215641a8844ea642c14778cd30305d3e32b9 legacy-trunk
+50975 216877b86bc2865f75af1a3953ec988cc5229585 release24-maint
+50977 9377c6604542ce6eabf5d0e62cd4435de6d1ec9e legacy-trunk
+50978 361ef7ceef28d9f63eb3e5c7e557583f0a13543d legacy-trunk
+50979 bde58a78fc712e2a9725d474581c14c9b30a1e37 legacy-trunk
+50980 d93a04340e6bba5747ef0b2ff0998051e6fc91e3 release24-maint
+50981 65e7b4223444f36c867d97012c40e94d4e32f131 release24-maint
+50982 9b95809820355b6f1e487471bce1eb904d74070a legacy-trunk
+50983 c98a2352983a496d14a98d09930e64e1ff7153fb release24-maint
+50984 29c7635d0199ac5be2c979942ee102b09cb246e1 legacy-trunk
+50985 7f44d634f377bd689b39dd4fb2afbfe8dfe092c9 legacy-trunk
+50986 4aed4367add27ceebfbdd7d853f2b0250c06a992 legacy-trunk
+50987 d0e6170704dee85096014b337ed041d32cb31aaf legacy-trunk
+50988 c87a3951dfc50aa0718bfd8e20b09c6691f1d509 legacy-trunk
+50989 4ed5d4c8e65424f4a811a057aa57701f2d9ee0a3 legacy-trunk
+50990 395d15e8374a70a06a46dc4783280d33c0853e2e legacy-trunk
+50991 aec6668c58d1e1f8902fe85d52067221d9c9eb52 release24-maint
+50992 cf046e22d7dd59c4ca32d247343d68bd101a2fbd legacy-trunk
+50993 930bb1eb8dd5d1cac5297415348814bf747d8520 legacy-trunk
+50994 3dd4101cb7e9779fff44523c7ba9ada6cc759b8c legacy-trunk
+50996 f7f10a8b96ee7d6014f76487dd7e0395ce5037f5 legacy-trunk
+50997 7f04793fe135e5e884957a574f45e25a33842991 legacy-trunk
+50998 910151524f5eeb0d315113caf5ca010e68aab35a legacy-trunk
+50999 66281488e9023a822d697af95a79eec2ed702381 legacy-trunk
+51000 b79b68b82a445c3311e25920c875577d8f49d541 legacy-trunk
+51001 86e81defc2856e6020810f58ee77427a0de8bd9f legacy-trunk
+51002 3b78957c77919984b013bb96db8053585138ac1b legacy-trunk
+51003 f3e08915b87b443561b3c33b141a654cd18ca1f3 legacy-trunk
+51004 86c3618a49c3f3a592458f5ee9b8473cd1e9985e legacy-trunk
+51005 4966b17963b41e7e7e6061e4dee6e45d0caa049a legacy-trunk
+51006 3de8a58ae0b9e8e12dee2413ab4b6fdb95ef3d28 legacy-trunk
+51007 3938e6efa793d6b3176e65c03873023e4347c823 legacy-trunk
+51008 315a66d2247a791d3b0cf40a7325442545081833 legacy-trunk
+51009 ff223b95f207e09d33bc508d6e24e4da2fc8803e bcannon-sandboxing
+51010 9d7c45d0d1bf7ec369fe783c147b99a2c2ad0297 bcannon-sandboxing
+51011 ee2d46ac2f6e7b5b9f16e4777759d9f893a36046 bcannon-sandboxing
+51012 1c0c12838e6253edf151188081d312296eb3fef8 bcannon-sandboxing
+51013 82b6757ffff476b5614575e62f2e9b4b742591b6 legacy-trunk
+51018 91ca6eeaeb4acc564e0faac39ea10b2733b4e5b1 legacy-trunk
+51020 d39aee6cdd32cfabd1cbdea2b6177e2f1d6dbb78 legacy-trunk
+51021 53d0552a7a8c5071513bb10675e92096ac46a50f legacy-trunk
+51022 2915c0729f0a8ce6d318b313956c1f52c4bcb00f bcannon-sandboxing
+51023 7e03183eb7a52a1c94b0dc575478fe050d8ad806 legacy-trunk
+51025 1567c01cca73f9f684e3bf660fb9a9b366e4a518 legacy-trunk
+51026 46377b05e18158915b64785e1a0e796cd6a81d7e bcannon-sandboxing
+51027 2f221bdd9f44b8f8c9137c702e6134b59bf4981c legacy-trunk
+51028 232d156beb82fc6ad42e289308e0e76aff595c37 legacy-trunk
+51029 d20b9a2d8ee730204ba2ada7f14d9dffdeaea391 bcannon-sandboxing
+51030 cd82ebfc66afd464f74efe22b83bb2aea85da7a3 bcannon-sandboxing
+51031 bd50a42b7df0d0a6edf1251b27382abee27e36e7 legacy-trunk
+51032 4f15abb120dc51632385b0ed02101c2112e3cfbe legacy-trunk
+51033 7d6b971581805a750bef4f5b459259906db45d00 legacy-trunk
+51034 fa2dac3926ffc159da1396d0a808050e4b0e083b legacy-trunk
+51035 59762e7962812fa7864ed9421fed52a7ba25ec9c legacy-trunk
+51036 12ffed927a3d45d1950adc50b69ffb66045c15d6 legacy-trunk
+51037 344364b4920856886936e1ea5f8f4f903ff1d54e legacy-trunk
+51038 00350cbe0a9e9487cb6f65805af5d89eb56821c1 legacy-trunk
+51039 85fdcdfca85c1cba1b97bec6fe2cff8f25a328c6 legacy-trunk
+51040 5f9fa0b863aee80f9923fef5e08e143e467ba28c legacy-trunk
+51041 8b93174d501a4cb9b4e0dd801c37a400687850c1 legacy-trunk
+51043 1ead41221bd880ec19ad1259b29f3a056a4d7d2b legacy-trunk
+51045 ce10e3cc7aebe89f24b7478a508b708c3601179f legacy-trunk
+51046 82f56207652f69cab2a9c23065567ec4071ec4d8 legacy-trunk
+51049 c0abb18299b442e1160d2f958bce18f66850caa9 legacy-trunk
+51065 cdcf2bcad624ea8bac636563dfb8193004740a7a bcannon-sandboxing
+51066 c3898a73b38607875137f3f37da9d71bbd72888f legacy-trunk
+51079 ec4f35d2a693ce19502f06d6ab4f4c5b5d18fef3 legacy-trunk
+51080 b90a8b0395bd43fd193842451d0c49573b4d7166 legacy-trunk
+51081 8ef3f8cf90e121a0b40a0e3fb7c3086bc0a91440 legacy-trunk
+51082 75bf77367da320b12593989fe91ebecf7ebb24d9 legacy-trunk
+51083 8296fb96cc184f64a007fa45f56f80eb7797180d release24-maint
+51084 55f8301835326e6cbabff2a8f8777339c0a20157 legacy-trunk
+51085 84974c6769031d0f57afce58187f725b7b8440aa legacy-trunk
+51087 77cf18b8b1ce13300dc9d1f874c58f04773eb34c legacy-trunk
+51104 1004a16b0f091bb783f2841951912b0fbefa7ca4 hoxworth-stdlib_logging-soc
+51109 eb23d096d694689519476f6accca8ab6d12023fe legacy-trunk
+51110 a9c742d6c888ee33531badbfee9fd4d73171f12c legacy-trunk
+51111 0238166f07b7035dc66a240f123b675d6d53ad33 legacy-trunk
+51112 40585fb387bbaa8239904a627a3af549de5e86a5 legacy-trunk
+51113 465a078d2ca6b7a36d8913f34480326284f7ff32 legacy-trunk
+51114 aa0cc755074eb89101c36d5a5004a7c046436a7b legacy-trunk
+51115 efa80633309da8745c23dbcc6c76313ba4c49713 legacy-trunk
+51116 6567c32ab881550e0e0c1523b2d0bde59d3426ed legacy-trunk
+51117 999a4914d53cb41f7ddff340be90ef615c6c33ef release24-maint
+51118 ff4b15780396833f5a94de9a4440c74900efe77b legacy-trunk
+51119 9cb4565e60cab43211ac45bb0de54ba02d5af8b0 legacy-trunk
+51123 fe44dcbe13f2c277babb2a4960eda20e806265e1 legacy-trunk
+51126 3bfef3db32b392a4f60b0f1f39cf5b2d5a8b1335 legacy-trunk
+51127 40415df5ba9de5eb674c74df7aa3b26a4e48d84a release24-maint
+51128 b90fe4ae30083462d79fe286eaf4aa9f3bdab8a0 legacy-trunk
+51129 5009de504f924021a4032ed967e8f4fe65e985ba legacy-trunk
+51130 214e4a4384f12b12f42aaba4518d07c9523ae989 release24-maint
+51131 2e630b2d5b4460ed9a662c8a08d310918904fe15 legacy-trunk
+51132 72a3f723efd169720496b7a23534c5ce3f70b397 release24-maint
+51133 fc101cc354a79fb650da5b159b287a93b80b1f9c legacy-trunk
+51134 b7eab1c18e9d37bc7e383fe182b7d13188e69025 legacy-trunk
+51135 5943296a518215d700367b522caff1e0b03e7730 release24-maint
+51136 b50268f46fff9a760f305e9174ed84dcb7d8d202 release24-maint
+51137 3350474f3433c99d2de0bf4012e0f7e0f6804773 legacy-trunk
+51138 f5a7f4dd93e0d875d8a635b42ae765a9d07851de legacy-trunk
+51139 997788de8667330ce9f22a16e9079f1c4f03ea83 legacy-trunk
+51140 2485ef4c5d49d2be09b6332f6bff52777d361060 legacy-trunk
+51141 0bc6cfb6b5fb21ad1568ceb834dfc4c02de4941a release24-maint
+51147 9ed560b3513980d4c643cbe537dd5e09d8928859 legacy-trunk
+51148 290c582a22d0439823616858f7c95eb9d785c725 legacy-trunk
+51149 b67f522d76d78d80029e558c7336e91ff48e9684 legacy-trunk
+51150 14c76948953d5c5f7c64d20e31a4a362c971b613 legacy-trunk
+51151 2f031648e58784497ee25aa21911b03e6dc2d176 legacy-trunk
+51152 d154260f46e8f7d777d9eda4df335245bec0a642 release24-maint
+51153 56c0e2f596e76f1d30f33f01bdc362918c0c0a28 legacy-trunk
+51154 8dc6be3e11e00a7c76e1eb8553822ae960b8b40e release24-maint
+51155 de497c41e9adefc8b6d44cd11ceef05a96361fc7 legacy-trunk
+51156 5691624269a5a60676fba5c5f68400c17f2dfadb legacy-trunk
+51158 9d089aa58e2f4b5ce4cad9c4f51d391c3c2ab65c legacy-trunk
+51159 8022927c17a8464685de52fb64af0b323545b984 release24-maint
+51160 5b9692f6629f407ade94c9b7883eaf0c8f0601ef legacy-trunk
+51168 6f77518b637db3b8ff9fe091b3ef39b579960863 legacy-trunk
+51169 b95b9f4157a82213301218f55d4fdb76350298de legacy-trunk
+51170 5c3d49385816d706f7a22d97a50888afb9acebe7 legacy-trunk
+51171 199388b46c83a00bed2f18ff6b10ffc0b9642bef legacy-trunk
+51172 9a8081cf4a70dab46ba0f106310cc2190cbb9d37 legacy-trunk
+51173 0f3ad5b936a8572bfe7c07d8e37538673f228784 legacy-trunk
+51178 74d23cd0442104ff975b85e1b74f5e4ea23d6e2b legacy-trunk
+51180 7d6b2e04e439540600e98590a2831ad859f28810 legacy-trunk
+51181 feee6582011f1776a6e1de895fb32b3ee90d7ca5 legacy-trunk
+51182 9222d0daab3c6aedeb01a94751472527f861054b legacy-trunk
+51183 156b28f0f2d35ac00e82c63d2a140182c9c7ec76 legacy-trunk
+51184 ddea4d37c83ca451c3079cad855d04e589b831e9 legacy-trunk
+51185 b8e37e0268f2cac042d92d162016a43c138f4861 legacy-trunk
+51186 26a6bedd17e21db1069736de3252566c56de3ccd legacy-trunk
+51187 3c2bf79526be89814cd02171040341878bbd3f58 legacy-trunk
+51189 d8fa810cfd54dfd8f27eea3bc22a1518d03b01c0 legacy-trunk
+51190 9f08516a4d0c9e99d7f4bd4e4792213e22a883a1 legacy-trunk
+51191 ead48a822295c83e1f1e8141c79bbeaaac270c5c legacy-trunk
+51192 e55f6d722404fa92b2a43c72ff21327d7a4714b2 legacy-trunk
+51194 9b3260d83558795d1a1d31db95881b6267eecead legacy-trunk
+51195 de9e1a5dca93661a7010e77601187b769d973b98 legacy-trunk
+51196 8ed62db1905c4d3e38b75af71b5d913953f177fe legacy-trunk
+51197 2aca4f040012ceb08acf05ce9a7dc2b386523739 legacy-trunk
+51198 be107b04c2525b6b8112a21ba65412df30000509 legacy-trunk
+51199 6aaf55f4d7a3b6d35fd9137053d395baa8424951 legacy-trunk
+51202 6ab4c39fd7a383fd9d942fcd8f9b7be88458607d legacy-trunk
+51204 864172515ee76a3b45df148f6682e9c39303b8f4 release24-maint
+51205 48fd388734636da1ad023be884c344aaa613c342 legacy-trunk
+51206 1087df00a6e87b91d66787252cd5a6bde00eac01 legacy-trunk
+51207 e778757d3330720145e74fdc5db03e2a95faa005 release24-maint
+51208 7790cd0cabd04c9d11d7e856fb365e7cc804eb94 release24-maint
+51211 654c380cf8b9f079156e32111d162ad803c89319 p3yk
+51212 f69be3c6a2d463649bc5684692882948a06c9456 legacy-trunk
+51215 b995e2760da472c3b590d3693b8fd656914734e2 legacy-trunk
+51218 e11caad7e029dc90b8a7d3b8694c82d94751d834 legacy-trunk
+51219 9f390882a2c3a51e087d1c9158d92087894c6ae0 legacy-trunk
+51220 71b0ac80a135e3e2baca3612b231b76e69cec796 legacy-trunk
+51221 2179d9f14278173be95dab3de0baec705e7b7b63 legacy-trunk
+51222 842bd6134e9d21a013da7f5913c5b6e558812bfc legacy-trunk
+51223 a80df53306f0dcff79dc18d196abdb886397dec7 legacy-trunk
+51224 6d536d43c1a0654c4664199340eae3b53f01a70d legacy-trunk
+51225 81c6b0ed3188ddcc29d21e07cf636df74f216d08 legacy-trunk
+51226 27f9b4fee14f7b6808c7af26a04fb2bed9cf671a legacy-trunk
+51227 9a1288d8200f8cb3ce220a6f2d79d88aa2d27642 legacy-trunk
+51228 ed65765eb679b5033164f0b4cb142ab9a5206306 legacy-trunk
+51229 6a8f01660a3b2de4f08bb22c53c632b72be34869 legacy-trunk
+51230 8b91ff698f4ff2f3df556be521d1201bd64d8c8c legacy-trunk
+51231 deb748f33c1db52eb084f2bae3ec3d1cdc4b8d7f legacy-trunk
+51232 ce11c6c1939db684f3067ea644b6d47bc91e45da legacy-trunk
+51233 1510866c920eb82e62773b5b08b751c1881c3e53 legacy-trunk
+51234 2dbad53de2b12717c0790bc641b0347bbfef1a51 legacy-trunk
+51235 68bed5348454023ccebb402f5b3705ce82937a1e legacy-trunk
+51236 6cafdc81cfde8698e6b83e682fa24a2698f621f8 legacy-trunk
+51238 48f1dbc57845061faa50a5c232ec53ab1652e364 legacy-trunk
+51240 ece97cfe60837b1786edf9372f9e2d9c7f2ca10c legacy-trunk
+51245 c7ff02c1559fd866cc087aac065849b1cca03fbf legacy-trunk
+51246 3be6627323b9d3a05ea70e13d8f6c1a2a22e1deb legacy-trunk
+51247 57482176e1011663e3fc50923c44b388dd8bf9b8 legacy-trunk
+51248 71baa06767ddc29f7d6911fa9c6e545fea7670b9 legacy-trunk
+51250 daedaacf7e110a3cd1a2366890149b732b1c1ccc legacy-trunk
+51251 531b364bbc0e0d815cfeec22f09e28163c47d18e legacy-trunk
+51252 8158b4e0c7b9b5c3b7d1b990a7349ff87d0d1dfe legacy-trunk
+51253 bc74afb8e4ef61d48bd8f19db566fd629b8e7241 legacy-trunk
+51254 24d2cc33000cb185f51ef35e3ad4d13c7f089620 legacy-trunk
+51255 249a59acb6efcf0204f0969e76f5656d4b3db4c1 legacy-trunk
+51256 71231bc48622e36dee360117fc212795d40943ba legacy-trunk
+51258 0356dd9cc274396186c5853adbb76e176a47f0c4 legacy-trunk
+51259 317605f2cf6f99e1d16d5b09d7fee64ca2254219 legacy-trunk
+51260 d5231ec6dac399d330d39b23a2bd5788b1d61fd5 release24-maint
+51261 e7701b05fd9e23fd240474df9925f70672064bfc legacy-trunk
+51262 df9478be06279a047a1da3a655976e5aad28243f legacy-trunk
+51263 8c16cbef79326357020eaee6cdf1f6111b021117 legacy-trunk
+51264 ab8539c07b1b3c6e9283b5e8e6791ea1fe6e3bc9 legacy-trunk
+51265 c0a58a855ac0e38136a588e75186d9c300134011 legacy-trunk
+51266 421826c94104f13aff74c907d15e8cd55f1f3093 legacy-trunk
+51274 a6a6dff179356e2981fb552f392e444ec5374141 legacy-trunk
+51276 635b09b1f542e291752976e3d97f12ec0bfe66f2 legacy-trunk
+51277 a55369e23f0694a5e7933e2000eaa3fb6ce17d63 legacy-trunk
+51278 4e5b83ba7c2a6af9ca01bcf8353250cb15e645f8 legacy-trunk
+51279 64fb68dca89648b59d016371831ea820320b9636 legacy-trunk
+51280 2312e178b34d97988cfd6e5bdd6584d89c83e1b0 legacy-trunk
+51281 254a186937a9b499e97182e37c7becb47d793cce legacy-trunk
+51282 160b83c71d7a0ac9607b8c9a096366453587ae21 legacy-trunk
+51283 a95090281032121a002e76f41a6ba57adb722baf legacy-trunk
+51284 14ec9cfd97600e2614666411fc3ad6b7f6560679 legacy-trunk
+51285 352ffe77b71dd0e7ca8f667a9e6a2086daa3b060 legacy-trunk
+51286 ea1f8a11a72b9a2a000a2544f87c11f7c6e34015 release24-maint
+51287 9d64bd748320adb40c7e03bab904fc0854aaf09b legacy-trunk
+51288 cd67e111e1b85b7e15eb1be4f59d19473396a1c5 release24-maint
+51289 207e487f425dfe41c619909e6ad8df09e155e937 legacy-trunk
+51290 e8c46cc99df5edd2b53233a883142f98f5d2ee37 legacy-trunk
+51291 799bcf0ccbfd313ff59727b6aa97ce0e6adcbf70 legacy-trunk
+51292 149de7256864cf9200d97232b6f23dc9d5d78d91 legacy-trunk
+51293 84678f0750b844804708e4f0d74fd21d5dd4a9c9 legacy-trunk
+51295 e90e7e768cb3527abf20b4b1187d4861f7741f48 legacy-trunk
+51296 e6fc4f99a61be19aab7a3ebc1d92c1bf318eae9d legacy-trunk
+51298 4f90c1d530d95c9c9068298d09b21c8a68ce5eb7 legacy-trunk
+51300 64b33060ef09d5a470f42670a536713006c9d4cd legacy-trunk
+51301 bf5bae1f00ad485e4320e2955843aa108681bb0b bcannon-objcap
+51302 be90fa7aacda79cc73ddddfc3aba20989e29375f bcannon-objcap
+51303 95f656690a000889cb7444b8ac7c348010f71ae7 legacy-trunk
+51304 207e77c1433064b6cce271ea06a6643839966f1d legacy-trunk
+51305 9097ecfeb3450c03b5a0a485f3b9e7c6a06720f1 legacy-trunk
+51306 6e7b3dd58f987103bc75cf1640097e72e6346a4c legacy-trunk
+51307 9133076c0bf971e96bedc2e4e8958df93cb9266e legacy-trunk
+51308 2dfe1c624397a4da162669452801a1a68991e908 legacy-trunk
+51309 371b9cd3af1560295d03dc57ee44e22c85fa6fa1 legacy-trunk
+51310 798becab3903c4ac9ee42909ba7798647919f87d legacy-trunk
+51311 24cab228b0396b70025cb9739424d76430343d9d legacy-trunk
+51312 b5073b48c925f1a976303623b47e242ef738135a legacy-trunk
+51313 da4be0408b6257296a6874dfe5e12b5ff34a173d legacy-trunk
+51314 a27bd50eb0fd87b0ce3906bfb4e590627d8fdcb1 legacy-trunk
+51315 c8ce39945df5f87579b0b69c233e0dad0d43da6a legacy-trunk
+51316 a5d0f9fbcbf4b82425d0250cd0593ef1f79af544 legacy-trunk
+51317 d23b667f04da2be1e6c1776deaea2154aa564cc2 legacy-trunk
+51318 4bb34eb487367470d4cf26d2e9237aa5e9b9c5ee legacy-trunk
+51319 1358404d6dd9ee9452fcc2948fc1a9b7c3acadf3 legacy-trunk
+51320 ffe7d3ab35a8370d1630032222c4904277b2968a legacy-trunk
+51321 fe80bb102ab6d51e0f94efe05ee45212841a6f8c legacy-trunk
+51322 d822185548971ab7f8083332615387903b77af51 legacy-trunk
+51324 edd83f162453aa30888a657e432ba6f240fa7959 legacy-trunk
+51328 aafe1ad73ed749bffa63fea8bb2c7f5a228f3f47 legacy-trunk
+51329 d9660f51b056b74f754beda2d1754458fa73378c legacy-trunk
+51330 a6afe0eda711d996b726a548c05793ec55b6e8eb legacy-trunk
+51333 2dc64d570e8d7a4498ab850108c85709c276df93 release25-maint
+51334 a358af21a54a9bd39f506d7291df343879d17a80 release25-maint
+51335 8e88ecbd408bfc9cd0bfd3561d76ddefa4f7ff48 p3yk
+51336 8f5b9982beba048b4be56b06b87dbf13df3c6898 p3yk
+51337 e4a6429c1214ede911caa55f0d8060058469c03f p3yk
+51338 841e0c86e00e423f817092e2ff5cdafa4b810141 p3yk
+51339 cb673ed507a794025beb4a37af87def16dd380ac p3yk
+51340 b2fe36bac3a1644e25bd5d86a8d14157d5732bae release25-maint
+51341 1a689be273297324c3fa3dd5d0b8099fa50ce9e6 release25-maint
+51342 edb162100979b87927bdfed158cebb9644e057be legacy-trunk
+51343 9bc0bc0ad1bfe6c9096e7b1cc2f478ca9a22c583 p3yk
+51344 01034018e8b2f80d8fd5c82988d2382aa3dfb30b p3yk
+51345 4abb46dd2b607f9eaa9dad5676eac8937669447d p3yk
+51346 1edde2349f78466fbc009c417238673c28287deb p3yk
+51347 f68269ed461e5d62098a329517f5898e95560d54 p3yk
+51348 67e45704c07ea5a04af0e7b1bda02dd817de1313 p3yk
+51349 3022cd5e010044c3bad1d6b8000a0153c63eb4ef p3yk
+51350 5b6f82101c405b1756dc802ff2215394bea80f16 p3yk
+51351 a8bb1ad7fc6fadc9144f61722c086061018b32d7 p3yk
+51352 0a1f87a855b3e615b7c9822aee0c24710dc660d1 p3yk
+51353 fa275845866c8a7d5e5e9b0fe723474a5055d9e9 release25-maint
+51354 a87320ebd0e668964be8a74539530f86b4017fa6 legacy-trunk
+51355 1ff93ba4045088370ddf04d4f23e3f63c99ab364 legacy-trunk
+51356 31b9a4b42528ecfa51fa2cd6b50eb60aab8f5c70 legacy-trunk
+51357 df87b60567ceb524ab9a2334e690b3dcfe3feb8d legacy-trunk
+51358 045e20ff89ebb7093214127c65d73230840b0909 legacy-trunk
+51359 89b730b71434f9cea4848abc866cc8e83c8cd4fb legacy-trunk
+51360 210c5b5575cb5ca01d1a02c9b694dcbeb6aaac74 legacy-trunk
+51362 b5d4f3a73de04f70e75a53df1784b87e9da2e56b legacy-trunk
+51363 f3dee625fc483a63dfe5f47d5388382202ccabf1 release24-maint
+51364 4c6f77b56452d6a48cf2aecb5903cfd847df6d40 legacy-trunk
+51365 ca77de35db620a17507dd7390c3918aa87627c43 release25-maint
+51366 7fb56aaf52bbcea55c23a5f7193018852d37936e legacy-trunk
+51367 b87fe11fb7e28ae293ef8bda6ef8d7152887e51b legacy-trunk
+51368 0ad7e85c8c04e8a67d71567e67c9e7a34938fb7e legacy-trunk
+51369 79bbfa1dbd1bb0c6a1fbaff07120b59487211297 release24-maint
+51370 1ac14d43ec6441e6cb220b318f2986739808789d release25-maint
+51376 c4e7b4070f07547fdb134d5e6cb953b3269ce8ac release25-maint
+51377 e7a5b287f27c1a9ee901d5211188456a2685e402 release24-maint
+51378 cbb435c5c21c6703f197038e747f514897d9c38a legacy-trunk
+51379 de4ef177278bff857f71163d470e1d7f0581be9d legacy-trunk
+51388 2551eb5671a41d8a46b6813ff14893a941919898 p3yk
+51390 63237fcefd99ee4f675722d5c2710659aa5dd8cb p3yk
+51391 cfb38473ca1199d9832b3aebc2354ad6114aaa08 bcannon-objcap
+51392 8452d5ee7b03bc2ec0649006608bd146c0945774 bcannon-objcap
+51393 4c674a07b23c360ff9b188c81afaffefab5c9eb2 bcannon-objcap
+51394 d23b7cb1700b50edabd45d0adef83aaf43621503 p3yk
+51395 0b5d8eae3eca061b7ebde62ba3a803d6bf387ce7 p3yk
+51396 c557d4474f0f4f07f9b0ec2ae79d582c2d8695e6 p3yk
+51397 3ebf5604f6320e5b1ee2a3644295391d1dcdcb6d release25-maint
+51398 b88b69f97acc0061aacd3a68b2096db36d5d12ef release25-maint
+51399 7cbcb22c8b8b2c8a4b6360a05a2b74934070a5e0 release25-maint
+51400 a745a2bd48af0b94b1fcced045f48f00568abe8c legacy-trunk
+51401 0af4ffaba03c32b4ca4c04fa9c2e324c7d46ae6d legacy-trunk
+51402 87d153ffbb98b5a83b5e68cf220e7bd76f20a523 legacy-trunk
+51403 b0e0a5eb909f1979ba1145018dc953b8d31d86b9 legacy-trunk
+51404 2c402676994549907cf81c5f22d82a49a3b938b6 legacy-trunk
+51405 bbef2ecdee33ebb8190332095f8da947d3c06347 release24-maint
+51406 bdee45888b640c9561ed3b8e4ecdc6b03f8d4f22 p3yk
+51407 d240ce5696f9fe8f8561a55ff8d13dd28162639a p3yk
+51408 12c42ff99437bf72ade6792670bd0b8ebde1872b p3yk
+51409 82717b84888e046aab9ce31093f45f05f34354a5 p3yk
+51410 0f135affabf2c7af416736c1b12487babed4479e p3yk
+51412 599abc31f770ad75a76cf76b977e552cbeaf9f1c p3yk
+51413 963496cbf3d3c0f1cce3f0ffde62f45006103a6c p3yk
+51416 44622eb58a25b6af061880fcc057a1d458519b75 legacy-trunk
+51417 5b2c1b65d35eea98e04a41883fe021b118dfc4ae release25-maint
+51418 c33192e2c25b194fdcb872aa40d1df2b8aba654d p3yk
+51419 154f256fff42995d9da13d7674b331c4ab28f121 p3yk
+51420 22c2e25ed0e40becccd6da1f02918a2a1aece3c0 p3yk
+51428 5e143944770b41cb24ed2c19d9e55e19640a3893 legacy-trunk
+51429 eeda2704130ef50b073d9e8b608441ebed8521f5 legacy-trunk
+51430 73a3291c58dc1eeb4ec6535f62fa40ec6b0232e7 p3yk
+51431 40bbe669b089efa70d6a31d5c154d45939d7ca24 p3yk
+51432 8dd57c53ccf6b293c34ddf81cd3380c05ecc89a8 legacy-trunk
+51433 db42e87c9776f702473aa43b6e8d4484bb907f5f legacy-trunk
+51434 2ffdee1c38844ab012b6f923d45524cecc7bd77a legacy-trunk
+51435 6f10207430774f1386c06d667b554de995e80861 p3yk
+51436 8dd7157d2a22a19102e543bbbd525961b1fa5ab7 release25-maint
+51437 cf42a44c549eda0139bad45e9e22d518184a1023 release25-maint
+51438 3674f20ac781f657c7fbe6ce43445b7fbc4514e6 p3yk
+51439 17f1df1553c9ae425d2abc31594c25132fa80800 legacy-trunk
+51440 511db71b5c1489a385ab61b2d467cd2c29c16de6 p3yk
+51441 53914d540a6780186fc97ac71bb26d2c5a8ecc2f p3yk
+51443 9dee81dcb9b419b9ca771aa44ede2b5b60a9c07c legacy-trunk
+51444 783c5e2803f9580fc8276a0aca73e8847585264f release25-maint
+51445 c40fe86563fc881cea9e221c0eaae1c15ec90713 p3yk
+51446 ed0db0d6ca99381a2887c883534348c3915b2974 p3yk
+51447 e61b22bf7ab4772570c971a8efa3e35335335a2f p3yk
+51448 02bbeec2714f0491b051556d126c5805e640e577 release25-maint
+51449 3982475c5144bbc99e1982b6ccca4de2f3c02005 p3yk
+51450 e8a65bbd6a292c8748eb2045665653367204de72 legacy-trunk
+51451 3cbed13c464d9c1de4c5e447cd3e9679caf8e100 p3yk
+51452 e7b1a3db1fe3cdbc760e9df57bd1ccff03a59798 int_unification
+51454 c6d9fa81f20fdcd02c343aa62024e015d513c620 p3yk
+51455 f18d779c7ceb672ee37e783fd1fea4acedadece8 p3yk
+51456 5fddddd516cb7cc3ca8bde63863ce438fddf2f6a legacy-trunk
+51457 c8ff43802f314c7d6e8d28bd3937f40a37bba082 p3yk
+51459 e86c0b29b4a26a42e4ce6469f2ca3e9bfcc3095a p3yk
+51460 719c5db7bfad45a7fa917d15ba56331fa0553494 release25-maint
+51461 9cc6a548dec4943ec2dc6266b07333bab842550a legacy-trunk
+51466 2f6b42aead94f81ce2e60e3f2acefe8f34a98dbe release24-maint
+51472 8d71f9a6c1c3a2eaf327813badf20e94b06ba5d8 p3yk
+51473 d65e6dcfdcb57ebd010939fbe198a9a4cad301cc legacy-trunk
+51474 9f278009026db3834b5e2f062d470fe7a485f2b6 release25-maint
+51476 5ff696f2a7a5aa257776115d461377297e70328d int_unification
+51477 44da3d2971079bbf7b16914c47ada850db9e5c7a int_unification
+51478 d91585b2cdc1007978dbfbbb0545a1dce33bff63 p3yk
+51482 3ea5275874131e082e12347edb05938f582ce38a p3yk-noslice
+51486 f0f497a0504ccf525f22befd468009619eda67cf p3yk-noslice
+51489 f8a90d1825ce002b811d154b44c7e8f941885e1a legacy-trunk
+51490 53df3eff94e3e6182ee8a7dba8ae893dc464cd5b p3yk-noslice
+51492 184f7b16d2036f6c4e456d4917925193920e17c1 int_unification
+51494 a5f343f7247135fa183e852ca3e292d73c57e3f0 p3yk-noslice
+51495 ce5e45e4c5d069cda0f433d38ed097888e3de928 int_unification
+51497 a59bbfd808d9727086a1a0ada38b8ae26e5a21f1 legacy-trunk
+51499 e6e1b403827e5e57944eed8bdf9380a5f23e32a6 hoxworth-stdlib_logging-soc
+51500 8782cc0fb5e0fec0e8ac7dfd8fbfcaf17a3fe690 int_unification
+51505 ac7f393fd29b342f036190139fcbbb54d3723f04 int_unification
+51506 d1743b0827347144afe3845dd1cdb2bfa2f41947 int_unification
+51507 bcc414378f3207ccd52d248b4329f8c51c3a495c int_unification
+51508 6d435da8b79b3186ac04d617e9dc5ed94d9d6049 int_unification
+51509 f28be5db5005ba92bd83e46ba31f5feff4e65325 int_unification
+51511 050fb9a097cd7cf0ce08108fc464018cfa7816e4 int_unification
+51513 472ca7006f70f2a3cae4a0962bf3459bd1a53ded p3yk
+51515 449ba0efb6bd27911d9a5bbde9753b22825e088b legacy-trunk
+51522 e28031afeff5f2fa8bbc560ae482d1a2952fcf2c int_unification
+51525 d5fa4afd6620e6e67e01c55b4308b98efef6547b legacy-trunk
+51526 5cce028874bc78e1230a94b42777d54b3491b531 legacy-trunk
+51527 f45451819491b465eca7614895f0859f35b08a4a legacy-trunk
+51528 aaa745fc7b767e97101e7e02819bd70a692c797b int_unification
+51530 981181d2a4fe07557d3e87262328e190e513dd8b legacy-trunk
+51531 3dd61ffd049e157e26296446f32e552e1d205e2b p3yk
+51533 13d5e5f0e993ac7a64c37c923d47a44f98f2d789 p3yk
+51535 8b9ec344bed2e570fd6e2a4822ac5cf106a9191d p3yk
+51536 ce23d86732b0b89af2049fdbaeb089864c16a5e8 p3yk
+51537 dceea41f4a6daea21285de8873db1899d235aa2a p3yk
+51538 efe3f2c0da5e8ed52b6258db8bb3b015dda6c6fe p3yk
+51539 7496f94754ff0eb182d66afb84e63a28d60b5440 p3yk
+51540 69f61f90c4fc08a5564880760f9f0a586fe2c2f7 p3yk
+51556 1a0f447e60a8afb3672ec0036d30d85f7444573b int_unification
+51561 1cf5285c8ab947f585a5d3ded2574f33ceff1d82 p3yk
+51562 51cdc398e0b063e865c83053838a2d7760381c2e int_unification
+51563 317dcc590ffd8a26b6789aa928fa47eecca6cb7e int_unification
+51564 e4deea938def082afded7086fa36b2bd5bccb31a p3yk
+51565 a88bc3bad651b3afab68eccd4175bde34cf5057c legacy-trunk
+51566 adbfd8d5851cc62b58b0132ec2344c951ca3be8d release24-maint
+51567 280c6db31c5a3d2032f0a93e6cc5d9d56226fc22 p3yk
+51568 9348ea63b02dfdec0372f9c6f6cda4adb651ed7a p3yk-noslice
+51569 08005ba6ceb930dc737f4fb12a2ef7dba1da200f p3yk
+51570 523e6cce4187150dd9a27b41a5ef7f9b5726afdb p3yk-noslice
+51571 7ed5ce89f26ae7c495afae57e7883618a3da5347 p3yk-noslice
+51572 ebad59c7233e3a805a69ac393d4c81775bfbbb99 p3yk
+51573 7bc4192a5278c58bca95cfed540f3a3777705a60 int_unification
+51574 84335788d9cb21262b757f421f10105dca4fa132 int_unification
+51575 e5ec1adb061f5ab583d261aa76c8e773b1f93b58 p3yk-noslice
+51576 bf42c81db806ef212f25a0a90edeb50c8f74b250 p3yk-noslice
+51577 a5048c8d8f3332ab7d446acda8008b8c51a26194 p3yk
+51578 a243a50da23ae2ef510b6cbd0e395ee7c5ae4f38 p3yk
+51579 f9e7560fe00d218989635f075a56229ab37bc4e0 p3yk-noslice
+51580 76a9a5131aaec96354a927a68ad9308adaf1e93e legacy-trunk
+51581 44af4b37d5ff40a2e7cceedf1a954a2357dc4483 release25-maint
+51582 26d295e79ae87163371884d1ae47fdae621e30c7 p3yk
+51583 e684f97ae3fafb1480a08512dacff5c390af90ff p3yk
+51584 f16a583c5b09045d8a2d3b43477d38969b2f0130 p3yk
+51585 4a38cd1a16061b1f3e205cbe6cba971aa98b8f57 p3yk
+51587 f51edbcd5cc0008b033a13525ee8c4a50cf756a2 p3yk
+51589 92cf3974d32fbcee7619a3a03a5bb61d66b793cd legacy-trunk
+51590 edec7962af287e8c0fae56eac1649ed12c837e9d p3yk
+51591 e076cca4d9d7a0c9cc3cf9b4ef5345168a3f4ab8 p3yk
+51592 dbb5954fddcccb03977537df4b606499b19813c6 p3yk
+51593 f078e7e4b9a150622139acf67921dc112043f187 p3yk
+51594 ff693a861b704fde1750ec9ddf21783ad79145fc p3yk
+51595 f8115f686e4011c68c142a3f773081abaca36e03 p3yk
+51596 6927acbfa01b47faba8442c200f2768508358c4f p3yk
+51597 4e5c94d036493df70cd2f46900bc5efc8769e990 p3yk
+51598 eb2f70fdbf3240b99d260506aee2aafa39df408e p3yk
+51599 78564e269d230b2f53777e33bb7281947e2335d7 p3yk
+51600 f87a3e61853d72b1d133992f991e397b31aac8e8 p3yk
+51604 3bfc8bb4e726f0a736c9c502cb8a8a35a93ec969 legacy-trunk
+51605 ca2b2cc2307e4413fa2bff5b6aab09273907fc79 legacy-trunk
+51606 f497650a14906f27638dfc330db1ab305e6d3fea legacy-trunk
+51608 916ae636a83e4b8002c0724bc68ac74d843862ec legacy-trunk
+51616 bb073805fbaba0115377486927c25d01ca29a6ea hoxworth-stdlib_logging-soc
+51617 9049582168131d989fa5c2ec61e36a7c0b0b757b legacy-trunk
+51618 5542759254c0b280cdbfe6055b5a13829493020e legacy-trunk
+51619 1b735a9d210710de4b8c4aab34020976cae9d477 legacy-trunk
+51620 aca709f33a6a168b1998645dc17b4f88c1fd7884 p3yk
+51621 3d7798feafc598f9ebbd7614b959c2158c74d97a p3yk
+51622 6c184fa55170a2686e193230e7aea74e4d9ab065 hoxworth-stdlib_logging-soc
+51623 ebeb34add4a62cdce6588d0491fc68a7b7438464 p3yk
+51624 d0ed7dbaad56e0a0aea52fab689fd8bd6deacf0b legacy-trunk
+51625 0cb9e57ec406478c7df3b6e05ad7571b23644604 p3yk
+51626 c4d8c054616c009d0ac027953f81e5329ede6a17 p3yk
+51627 c093633bebeccfe04e948325b6160c4cfcb1c1dc p3yk
+51629 540c9592729e74d82ad331f6743ed49518ac2a71 hoxworth-stdlib_logging-soc
+51631 d0b83c4630c0924df661063543f3c5478c8c35ac p3yk
+51632 da3a9f4028860658ab79c6de36b3366b99a1472b p3yk
+51633 4f76f63a32f36baaf17179aa6cbe94f2fb12f33f p3yk
+51634 d14f10a4d9d4660dce13c874b59a621351d15ede p3yk
+51635 05ac9c4928a48f1294cb9edfc98116d71650eae8 bcannon-objcap
+51636 6e198c655eeaacf3559075172db483ff623b9ddb bcannon-objcap
+51636 90a8ee6c3a8676cc5b943b2b1debc3ca0f17baf1 bcannon-sandboxing
+51637 b563b12e4c0036392c4db81528e890ac6d8bba35 bcannon-objcap
+51638 fef02dba9b5f326871e627545bc86f1d2e6cb030 bcannon-objcap
+51639 ec48057a34b6018f57bbf4f49746520355f29734 p3yk
+51640 07eb80264f61511def5728df5c6a757ed68d9bd6 p3yk
+51641 f974890c6cd2a7c52d3007d1d6cb3168d4cf11af p3yk
+51642 218b6e900a8d4425bd9d92a58205ae38833c776f legacy-trunk
+51643 7591228151d702ec533bfbabb8a3835e6b9b09a1 p3yk
+51645 893add5545419670800eb1176b8db4bcffd35007 p3yk
+51646 aa59466ebd9c16161c51c1140047411df41321f9 p3yk
+51647 754a729e97af5ac6485a5fa58ee4a89bdd9d42f0 legacy-trunk
+51648 f0b8f71185f55d6fd8cc55e2ae99917079471a56 p3yk
+51650 416107a351853d8eb33d5fa4fc96153395b78b0e bcannon-objcap
+51651 16d486c7da8245c3560fc43e999d6aeb9b5cf25a bcannon-objcap
+51652 8f7321ab8f40f737762ac032058ee31c58e37213 bcannon-objcap
+51653 4d23e9a127103855d83379b401cc17f61ddf3dff bcannon-objcap
+51655 f10fedbe6c13961b8fb63b0956175480075f07cb bcannon-objcap
+51656 5b02eb5f65f1bff6a45f0886dd44818a7fc51c8d bcannon-objcap
+51657 3554962d8b21d7e565695ab88d32c0d319c2633a bcannon-objcap
+51663 e85d5b20ea60ed418126bb77a0d570f890d5e5b4 legacy-trunk
+51664 a83957c91fdb9bb7717070f9b072b517a7635fa5 legacy-trunk
+51665 1f170570589ea5fb5036036391bb133e9480c022 legacy-trunk
+51667 60c11934709ec742784a3f2ad200ace1afa85a62 bcannon-objcap
+51668 bccc915808d801ffaa8a528bef3ec5ce4705fedf bcannon-objcap
+51669 dd514a177848ae6e515dd674190156cf124ace00 legacy-trunk
+51670 89176e65add2c985b0035d92d6b0da9a5ab7e7da p3yk
+51671 721c394eb0ba33e99d8029579086cca369e04e3a legacy-trunk
+51672 5626b2ee8ce4cbc5c4138a597cf06d148cecf609 bcannon-objcap
+51673 aa641fb17698ed327790390fcd35f91f793b13e3 bcannon-objcap
+51674 82081ba9a5c507c049ab764188b5a0992cc87c05 legacy-trunk
+51675 11f7053051ff9eadfccf5d6699c4067a206f3832 release25-maint
+51676 4a7906d8de86107ca100c06d7322281cde4f9328 legacy-trunk
+51677 71ea2be7d9126a8bcaae3bf69595317bf3ac915b legacy-trunk
+51678 184c1dbf7194e4048a1b2b81158d5cfb1c10a83e release25-maint
+51679 ba837545cc2faf078c3c9847fb7fdb99b5389ebe bcannon-objcap
+51680 a666d75f3dffc3934e6ce5d2534db2acec284464 bcannon-objcap
+51681 d1986d369fefb889b7588ccee93e675bc963c6a8 legacy-trunk
+51682 8418f1b9090e87eeaa9d3efa3155739493ae4efc release25-maint
+51683 e905f78eafca5721a6621ebf83c8ad03f0575c44 legacy-trunk
+51684 1352ad9afcc0b8df3d20aa3b26db9e3157802163 legacy-trunk
+51685 2f086d58ca10f7e11131c7d8c9cd06271d0308f3 legacy-trunk
+51686 8fe168703348b74c9abbe09f568c55f6ff561f2d legacy-trunk
+51688 7693b6993ddaf3f803017f883cba6e886474ff9f legacy-trunk
+51690 314c4e7a36d3ef3c63f996deae281999aebc5a02 legacy-trunk
+51691 1ec7ef0f3b8d04f4cbd1d4149caac39cf954188d legacy-trunk
+51692 21197cbed51dac88f31d457f55ac454da8465ff0 release25-maint
+51693 aa8fedf6bb248eddb3fd1f74cc33572ad6b4239c legacy-trunk
+51694 8832b8c2fc499f47649714779e94913df17c020f legacy-trunk
+51695 4cec45bd6663983ee2f76c4966def917c6e7d407 release25-maint
+51696 06330d0b464af25335d7116d6d93bafadf36e4f4 release25-maint
+51697 cb6642ded4e758132f6d595050768f6e3411405f legacy-trunk
+51698 101e04a4f403aae5c5e7437c71e4214daca7266d hoxworth-stdlib_logging-soc
+51702 c6fef944ad95deafd2af06807e7cc212a7fea927 release25-maint
+51703 589980c780254608ad33ab454f9ae4b71178d9a8 release25-maint
+51704 cfb77fff024021082ad811ad224af718dc12618f legacy-trunk
+51710 abca4e626cb5f6a8b26299606caa3672165877f1 release25-maint
+51711 f5e78ae8ec0cb8eccf1e8c83a64073d1af2e391d release25-maint
+51712 00d2c93b88bfed57aeae1a2617ca13a7bba670d2 release25-maint
+51713 c6d44a9749db486b668278bb370508d339f78e92 release25-maint
+51714 9ca19db17faf79500319f5ab025cb77289ab4762 release25-maint
+51715 244c734f1d8d1db80ce7ae69280aa4941837b98f release24-maint
+51716 e1aa9a29ed151ffbdf16e44706b366bae6db2f97 legacy-trunk
+51717 9957467faf47c3ce16c7a1b3f01789c0c717cd83 legacy-trunk
+51718 d1b497ec190a1ab6ce934e3f41ba832e9988438a release25-maint
+51719 b3514382c32747cc8141e8170dd4a1367d47b3a5 legacy-trunk
+51720 08ca476f8a3424dc263a7e222ea8d8d34e720168 legacy-trunk
+51721 97d3eab8cda2f920b50479a0e5834657b4862c45 legacy-trunk
+51722 9d44792063bbfde9c63fb699a8f861c8228b2e26 release25-maint
+51723 627a21ccf24fc403c8cb79a645354629798c36f7 release25-maint
+51724 300fe506a0aa420b03cb6d22f0d40488d70ced79 legacy-trunk
+51725 82639c055a6fa84753f42be45e531e0629746d25 legacy-trunk
+51727 155cb1557b9750d49111b10e3189e79022885dbd release25-maint
+51728 4c85ce70426e39f4aa190d14519c4b1ea83fcc2a legacy-trunk
+51729 8dcb882ec3e1aac7d336a40aa64ec66561fc3dec legacy-trunk
+51730 3300d7492f1a13ca604bfaa3fe297a4f3338d0f3 release25-maint
+51731 c591d9954fb39330c2136b2266090884fa660a0b legacy-trunk
+51732 3d968b5fcaf9bee78c6c8f0d7063d91bd16e01c9 legacy-trunk
+51734 6a51cb8068f5ceee5a300056d68bf7800dd375c8 release25-maint
+51735 5d6e96a2fe6e86dd5f8f6a1232399a26dd1796c7 release25-maint
+51736 9f0b3f9c70da1c722fb9bd5496d49859f5f4f3d9 release25-maint
+51737 15109781f0168ebd8513e4ec916ae27ddf20cf3a legacy-trunk
+51738 ee0c757c4990abaab2049a937c62d0bd1d126cb2 legacy-trunk
+51740 ded7b690c3063b0c7b39c404739f0cdac3647ee2 legacy-trunk
+51741 ca95bd559e7167ef150ce5b95c2b78acbde9479f release25-maint
+51742 6d7a8b5eb551fc5197136ae822d924e3716de237 legacy-trunk
+51743 8fb597784f18551125d43d9c0dba213d78b323fe release25-maint
+51744 71ac796a018c63199eb6936c34e0510c80f937a8 legacy-trunk
+51745 7c5e29362803b1ff3ab9dfce1fa142dd858e5f4a legacy-trunk
+51746 e8b68df90b84ed5ca5e62a30ae2a292336dc1478 release25-maint
+51748 a52489980b5b493a5d89c99d73c125a25662bece bcannon-objcap
+51751 e466fffdc9a91c53c6d884efa0beee7c4388e599 legacy-trunk
+51755 1c425a890f6cca31579da0aff5554e82b1f058fd bcannon-objcap
+51756 c9cc29be755878cb6ab600288f6b746687cea424 bcannon-objcap
+51757 76b8a75dbe6a3d74e34bbf40298b49570c3b1d62 bcannon-objcap
+51758 467c716e2f818bb4072abffb65c131721b4f9b75 legacy-trunk
+51759 8a20c94d9d99e22b941315589741bb110af5e993 release25-maint
+51760 2a730fb6f34b431a75bc4b87d3501b1a8a5923a2 legacy-trunk
+51761 9deb08ef4ba1df350e5066b4b1f8e790bf84d691 release25-maint
+51762 98cd7b1666fb48cf51f1e2d1f0e62d05d4783508 legacy-trunk
+51763 6dcc64879341381bb13e6752ec0f318055f3a119 release24-maint
+51764 ae5b8a8b911e29d9c0b3351b52c70f3664d3d903 release25-maint
+51765 307a11c085b4610d86ef922d23e37f1b89611041 legacy-trunk
+51766 8394d2e9bfd67af4eb043f82aa96e28c16f99a48 release25-maint
+51767 b8fbd322760a9bb15a0a33f30e1ab41a0e0daa51 legacy-trunk
+51769 d719fab79667876cd14565a427d76960fd28f59c release25-maint
+51770 cb883e7e0b7e172cf7f1451df0489cf57cc9b25c legacy-trunk
+51771 c94f37054f1970f6fc162b1251eef2540858e23c p3yk
+51773 7a0ad110e91e791631df889c12f55f076b98f3be p3yk
+51774 3b75edcc4a6f487dfc7caee11f7bfc5674e4f251 release25-maint
+51785 dce17b5bd387ca3ba778e5d1b97664fd418bd44d legacy-trunk
+51786 81b467fe92ee50964c528fdee0f09d375971e8b6 release24-maint
+51787 4aa984141fefcfb67b98575e82d6b0de197d75be release25-maint
+51788 2527a4835099293b9d902b655857971b91a25938 release25-maint
+51789 cd3b7f25649d4f3794f000b7c0c4fcf1420a2119 legacy-trunk
+51792 56e7d6952985155cbff5f0ded4594bdca285ee85 p3yk
+51793 5e502de0cedacfd5eaaf93e65c710cff084fec99 release25-maint
+51794 6d47c8bc051271b499490e9c7f781d1edc70eac0 release25-maint
+51795 6e6baf1afb12c056026a8dd76fd703642cd6546f bcannon-objcap
+51796 94204549b516093d73d9552d35d0115e4b47054f bcannon-objcap
+51797 363ef804a096f5189bbf2c9caa796c44d1b2eee8 legacy-trunk
+51798 ef0f42bf2a085350c9393b0305f364a234a95829 legacy-trunk
+51799 c643b031d526c83575d1e7323478fc00f1c5ffeb hoxworth-stdlib_logging-soc
+51800 e83722aa78dd47531479dc235d9a35c9f6215f87 release24-maint
+51803 38ba9524783a1eabe8f677c007f6ce5797c4b091 legacy-trunk
+51804 cf9d3b38251f92ad6bb06c347af723d1ce66441f release25-maint
+51805 1eebb647310fb5ecfacc5deb75c6d51ebe173934 legacy-trunk
+51811 405804192a682825df8372eaf3cff7c8a32e7ddd release25-maint
+51813 c3a353a071468b58a721f9837c90151b068cbea7 release24-maint
+51814 41c1e543b9e96976145d5225dc8515e7c22efe9b legacy-trunk
+51815 4e81974f7e1403c74a74ef669c519d4bf9e5570f legacy-trunk
+51816 d9673b62ce35d9d0d3bf30a62bd04ef77cc6518e legacy-trunk
+51818 434afc728f6f74af9050314db12186e6ea038356 bcannon-objcap
+51819 a065b55e1fb1d06f06dd55e7ffe93382dc2d2691 legacy-trunk
+51820 d5c6fea252f0488265e77e82cfa4fe41a388d94f legacy-trunk
+51821 ec6fd9cebda18587b606d65a16bf46d1a0b8f100 bcannon-objcap
+51822 70108c63c6e50e837d69cda6f607470a1c90ddc3 hoxworth-stdlib_logging-soc
+51823 3239f93cf4d23ed69fc8817294c282e0174efca4 hoxworth-stdlib_logging-soc
+51824 2653f83358779387d1dd411ff676059e1daf92c6 hoxworth-stdlib_logging-soc
+51825 891e332cd2d6a269c0ca2b1d490303c2fc1b113f release25-maint
+51826 0298cc6c29cd6ecdacd54ec24e1170061e8c3fa0 release25-maint
+51827 c0314c8936e5116d3bbbb2f7da5e00c666b9c1bf legacy-trunk
+51828 d4e53e70cd78274d053863c8f56baa560a2b5e2d legacy-trunk
+51829 7be30cbfc9b283aa388e074a08dffcb473b2fdd1 legacy-trunk
+51830 527a3d0052c901121b58baab9608ecec381bedb4 legacy-trunk
+51831 6a83b2740fc7ccda03d9610e3cd0b894293391c9 release25-maint
+51832 40735d5f8acdbe77881df9cebd216fa7a859eeac legacy-trunk
+51833 b5275882a3e0d4b0cc43147b333eb387426a9078 legacy-trunk
+51834 a4a214bdf8eac0ea0e9c38d1a2c89474ad5c8b47 release25-maint
+51835 6f6e55fd9b791c2a7dcad88561751e712af3510b legacy-trunk
+51836 0eb3f0f54a2674fef680ab5291ade1b5fb96eab9 release25-maint
+51837 c2fd978df3922425f5fe8791dd49da55d093307f legacy-trunk
+51838 9e7dc6432a4465b635d771e6e82a6e18cc7114d7 release25-maint
+51841 804d171c2cb7155c69322e7a96875228c117c06d int_unification
+51847 0ffe7f92ab2fdefa2f885a2d199b8ee6458b6fad release25-maint
+51848 3986b36b849523340d309c9c085cf065ad6c2bde release25-maint
+51849 5ef0406e6d524c6ccf671b2840928d575539d694 release25-maint
+51850 e4e8f0a4eda4fe28bc751acddae96c153a7d7b15 release25-maint
+51851 54d4fd088385c7fdc1e41f6406cd5574cf21f2b1 release25-maint
+51853 d06b2b42d138816feb892775085929a6ed3551f5 release24-maint
+51854 15ad6ba2e1a542781beaba12403df7cb7401e2a7 legacy-trunk
+51855 66d0357029b55ac6168f9a30183997e7f2578da9 legacy-trunk
+51856 c0a071df4621a5794d45a92e4a59536d7cb3e56d legacy-trunk
+51857 0f7ee9925b7c42962b61564bd0d449a33ca23fbb release25-maint
+51858 0bac40e4d0c643a78c18b46fcb0f48c7871ad1fd legacy-trunk
+51859 c5c9dbeeafa76a1dd4bf26f22601cad6fdd3724c release25-maint
+51860 cc3cb3a8237ea545db917d84c49d8a0a5e175cc1 release25-maint
+51861 7d40d37e4cc35d619194082d9f823914fc22f7b4 release25-maint
+51862 249fdb59dc52f9b53a5292adeb3382d567b909aa release25-maint
+51863 dc50d4ac95d91fc180018704041757e9f29d3568 bcannon-objcap
+51864 95cf31e6933501f2d3f296dbb07d2651130b3f8a bcannon-objcap
+51865 417501ee3e86ffacebdf0e6a8b2d1e974594f5cd legacy-trunk
+51866 e57d8ae45669f4d7e2d4ce3d7f8a61eeaf2e16d9 legacy-trunk
+51867 54b82bd25693e9d7f2df68a38f19ed529d9f8c86 legacy-trunk
+51868 5044d069b53292ee030d163f163f0e82df68fab0 legacy-trunk
+51874 10eb1f6b30809342627ca144e003abfdf24c39a3 bcannon-objcap
+51875 0bc39c1319ddc037ab2ab40449ff3cf8292fcaad bcannon-objcap
+51876 07a44bff967f5826c351081d6cedb7129d13236b release25-maint
+51877 74e424c178f45c239f1959ae456d52ae57975627 legacy-trunk
+51878 2b05ec5df777797d48ed31bb0d056838e5fe4e3d legacy-trunk
+51879 a0235d435ed4e72d49c5a53f2c157ff8275b25d2 bcannon-objcap
+51880 75179c2ecac1c5b0f35c467721429b029a5fdabb bcannon-objcap
+51881 dada34b4d6b6a4e2d7a89f0ac03c00c3c745a224 bcannon-objcap
+51882 34ab052745ec2a70e4a21cb760f5aa0453ae8f26 bcannon-objcap
+51883 0ece28cb5b9e73e8cf0f65e23ea3a26955baf815 legacy-trunk
+51884 899d4dc12c378dbe25b689c451eb545fd68c147e release25-maint
+51885 b6733a36eecdf6556a838c17a43e7ef624d3f122 legacy-trunk
+51886 873759b0b12616a804e01e9faaf473fbee2f6fdf release25-maint
+51888 4f36c41596b18d0dff79ccc1d4f1c591bb4f4ac2 release25-maint
+51889 2e995f244d6b62c940909ec021c77bdbdd9297af legacy-trunk
+51890 2a3498d8741b42c51aa4b379d46a34a4a66ea438 release25-maint
+51891 f9c9f8a05a894bd14062cb041dd502cd990133e1 legacy-trunk
+51892 8d3b764359921acd73012f87c714cb872c513758 bcannon-objcap
+51896 330bda2405ee6c682183dc5eaa5310b889230403 bcannon-objcap
+51897 1660eaa0cc2663330c3138b2fcb2b1edbe228e48 legacy-trunk
+51901 f5f4d2fdb62c29af94403a21b73f4b4c1a7e40be bcannon-objcap
+51902 d43d9422b7ac79f3b6e1cffddbfcb4310753b970 release25-maint
+51903 cedea9e23a955c7559c27ade32ec40fd0007de3c legacy-trunk
+51904 bb9e914ede051fab00b22cf0288ff4cf716675f2 legacy-trunk
+51905 590a98a70bf9d945da6c1f6c4ad53d4308da5c08 release25-maint
+51906 6b01a9c455dbd265ddefb7a758bbe352c3f6c473 release25-maint
+51907 767962f88834609f8e894827e88dfb44211a194a release25-maint
+51908 c10a71cf16e471425e6d7564e3f7a648f14b702e release25-maint
+51909 7f5f46b56611c153aec7b053c00f1d8903fa1eed bcannon-objcap
+51910 20147415e97f9b0cd951c1ee5d68af29a23888d3 bcannon-objcap
+51911 ce24778a649f1ae53f5d0075821445ba24915bf5 bcannon-objcap
+51912 7752378077a537cb3cd2a4c0fa97527bc7106008 bcannon-objcap
+51913 b4470a54993a387c579bf679b23a1c5467ed9d34 legacy-trunk
+51914 783941a00e9e2952291c08c8427e69aecbf17d6b bcannon-objcap
+51915 e70a7b7197b6841d78367080b6ef6301f0af5ad3 bcannon-objcap
+51916 b6ee4d3541c0a5288121d288adfd23a981236680 bcannon-objcap
+51917 094dae49abebb34da38c3b0643ba8076c79cbf28 bcannon-objcap
+51918 e036fc9c68271477c965fa6923bb2eee812b3f8a release25-maint
+51919 bc772fb5139295d158b7274546f8ad6dcfcb07d6 release24-maint
+51920 71b80240ac3ddae4192a2c50a1cbc54db6cddfbb legacy-trunk
+51926 0171108ab51558eb06b7ab4e73d06f51c83383f5 legacy-trunk
+51927 4888d2d4d292ec38d5e3e943191393e07cf32cc7 legacy-trunk
+51928 71e0f3fc57da778f4fe0849b64a65eaa611dd585 legacy-trunk
+51929 b303d2c2c6c564343a0367e0ff8a6ace7ac59738 bcannon-objcap
+51939 ea24a9c8eda258b93aef5913c2883dc4356dd12f bcannon-objcap
+51940 0031fc2e05e286e2baf8937e7b33c72bee97e2ed bcannon-objcap
+51941 0151c07c53e51062732c037e25645be23f0df7a6 bcannon-objcap
+51942 de4924d03903f74c859fc2307ebb2db3bfe4c907 bcannon-objcap
+51943 1f4897f5fb2beba6188f4e234e02f4b0f28e7da1 bcannon-objcap
+51944 43baf6bb0f8b0b4e73d0e02e8ebe0fb3eed405b2 bcannon-objcap
+51945 56f0ec50d7371748c989e61cd9b26b570e5239e3 bcannon-objcap
+51949 936297047c179ed8779fc23b1e6b436f3246a25c legacy-trunk
+51950 69530aa21b8a649ff7470ae14f981c3cad3c2a66 legacy-trunk
+51951 35bf16e7f11cde16c45d6c07f38c5329caa852ae release25-maint
+51952 eff88c6aaac37476dcbd9c9778ca611d852a4690 release25-maint
+51953 de4866d44f13775c5fda32d3fb719cb3bb573154 legacy-trunk
+51954 7f6b4fc67bb6b3f39179eb81b840a0a1599b31d4 release25-maint
+51958 df98d9731390f1476817f94494485f7adc0a0ebc bcannon-objcap
+51959 089ddf1877cc078d61466d142dda12d954a97ae0 bcannon-objcap
+51971 24f9a13084b0174744392fd8c07bb63b788a685d legacy-trunk
+51972 b8cb7201379c67950de11aefd3c03111144341cb legacy-trunk
+51973 aea19c2a45bfc94ae1615793ba60ac9490f34d24 theller_modulefinder
+51974 26618528fa3b764b08d6781b3b83351ba669d531 theller_modulefinder
+51975 94a8cd5888e70b0703b56d64b1a11441343d438d legacy-trunk
+51976 0b63c285934fa050fbfb4ab67b7f2fb122be99e7 theller_modulefinder
+51977 69be015a4b51c03d2490a495743f3d88c9af5df4 theller_modulefinder
+51978 c781c980c9a0dd880b931df1a5c8fec042b2369d theller_modulefinder
+51979 079f9beb1d7fa35922b28680ccdca6751ea00b62 theller_modulefinder
+51980 5872babff6384f46e53e53994d81dfebc2d6278f theller_modulefinder
+51981 e3c5f3b59271f02eaf0c36c908877fdf63e8d24c theller_modulefinder
+51982 e2743222581d28dbe9fa8fb1bf7f042000eb681e theller_modulefinder
+51983 74397b0099141fcafd9ec22caf7ede79f5ec3615 theller_modulefinder
+51984 b94278e1bcb3141a502d73635d43718a29663457 theller_modulefinder
+51986 04c998ff28b7d41cd329764721e8560d4b4bf85f legacy-trunk
+51987 cab056903b3dd26492f06ea9328fe5a33f940f37 legacy-trunk
+51988 c20bd74ac9a67ddeb2275f0441805aba6eaa2765 release25-maint
+51989 479e389cb462f8dcba885cebc9a0265eaa718647 legacy-trunk
+51990 7f6ddf555c120bc935a829e750cdf11dd0fe3319 legacy-trunk
+51991 d99753314453353ddeeb996fb7d07572299dd800 legacy-trunk
+51992 b5292f967877cc349a143592a55bcf153a2f936e release25-maint
+51993 25bcdf3cd19421d43447e4ef6b18489cb068df99 legacy-trunk
+51994 3478c160207b79d6f8c185e4230c62e82502827c release25-maint
+51995 ecaafc32c5000631449a601b8486141abaf6185a legacy-trunk
+51996 ccddb22611dc6f0d5600ceb115cef9f0240a8722 release25-maint
+51997 603cde5ed1ebc57f695919c279aa3834b3264ecb release25-maint
+51998 3c7f1881e82a96ae465bc02af2cee9eb2f44a1a9 release25-maint
+51999 dec7d993b68f24149ad88f19282eec2e1eab56b4 release25-maint
+52000 f8a7dfbf81d08922b105f76de30358f606380047 legacy-trunk
+52005 78c5a039fa3a6423ce080d049ab48a3405228845 bcannon-objcap
+52010 78d4e5e470cf8243a9c67a07c85faeaab6bedbd7 bcannon-objcap
+52011 b072228c95a204050107ea225984d1cd85ab10c6 legacy-trunk
+52014 74dcfd36f7c4a39b2565a8a3f2d269d19b56c25d legacy-trunk
+52015 e6a4e0678993ce86d0da7a8aff309d7aa60e2fb4 release24-maint
+52016 9347c2b451bad9b1da3fba27ba645b2a8ff5130b release24-maint
+52017 6fb46e87d5f94c60e548fc143c584a04da541a1c release24-maint
+52018 3b70da9ee368759302e7dbc547a769e71550200f legacy-trunk
+52019 a52142bc158f65d5e367cb6b7247e7d0075e8280 release24-maint
+52020 68a56a15d7559336c6a5bfe5f310a7fa1464dddd release25-maint
+52021 94dfbb9dac578b037dfbd284d81246d67453cfc2 release24-maint
+52022 c49f02a50cadd6f801cb5e27d8eaa3bdceb65f6a bcannon-objcap
+52028 1696d85ba0435645a2acf475424ed892958c8e16 release24-maint
+52029 af3186c6409207c58ce7d2516191cd8d51fa6584 release24-maint
+52030 884d1cb702215bb7d02d646671b853153196f8c5 release24-maint
+52031 12869aae9f6d9edfbe8b68b422f01b0665fc8f45 bcannon-objcap
+52032 f90ba306c287a48db010359d2cac9d91dbb8d393 legacy-trunk
+52033 3507775f4ed41d56a2a7a878afed2868f7631fed bcannon-objcap
+52035 fb289ee1cd607b379a01eac2608e9693a49e4ae0 release24-maint
+52036 ab79ed0f928175e19075221a68bd19603bcceee5 release24-maint
+52037 cc18fdad108b7d7200797eb05e1c50c379081106 release24-maint
+52040 4f11745c7e5fce8881486cc8ff647fc35fc9b837 release24-maint
+52041 c11cae2b9a75f2a8141d87a01650388017d49a7b release24-maint
+52042 2632c9af64abb2527614b4ca16acb8928f6fc5c7 release24-maint
+52043 15ddabe63d952c67b353ace3d22837830fbe56b5 release24-maint
+52044 1e5f0b0466d8df0dba9c4f001614e5a6503b88b1 release24-maint
+52045 9e0fb954791ec93492eca7ae22ff938ccb15325c release24-maint
+52048 05861749eacd211afb2cf13ad9d0ad3ff807dff1 legacy-trunk
+52049 01c03a711b15cb1ed01fd3f0d314d30053e66f8e release25-maint
+52050 52cdbe4b7644d72aa92ca0fc654878614cc13d6e release25-maint
+52051 0edf3999618ae28cf968a9b00edb0272cf1b13ab legacy-trunk
+52052 1dc22cc20132f2ac059977a5c4c7fa2a8c308482 release24-maint
+52053 de79f1870ae8f1d86d1f58518681d346efe35fea legacy-trunk
+52054 5dffa35cc64302c2c3dda3ae1fcdbac8d6fc829b release24-maint
+52055 d833806c7351a5917262c88900c52fc81dc65a64 release25-maint
+52056 c477a0e2b06799daad89452d981c75dcc49c39d1 legacy-trunk
+52057 2c824a8a1fb8cd56aa8eb6feff9ca56d3531fda6 release25-maint
+52058 49fbddfb121701ddee164ac752b1321280fbcf68 legacy-trunk
+52059 13cf344de8c98984f35f8d3819c18168441514c5 release24-maint
+52060 52460b092b5a66d5a3593a16f2e4c7631b89d8f6 release25-maint
+52061 e1ab4653ebc0932596b6b0642c2f0e89b192c13b legacy-trunk
+52062 3986bfe53101db312922943a6c9313f7e99749cf release25-maint
+52063 e7a58341b2e8f7535d77cd14c227b2a718d335e1 legacy-trunk
+52064 1bf51d2f469d2d2faf783bc68f53cef9bf2846b9 release25-maint
+52065 b9a2ef1302d47ccd5150d593a19c61e5a03b625d legacy-trunk
+52066 99d1c93676794d2d4b583b648627bae6b4fce6b6 release24-maint
+52067 330dbcadb93171f6237eb18d7aa81b9974def46a release25-maint
+52068 ffb901374a382539a90657a54c89ccde08ff2cf5 legacy-trunk
+52069 d91826bac6555cb0a6146b755c66cb45e3c4cf69 legacy-trunk
+52070 95d2473f7770cb10c6f8935c02116cdb77d1436c release24-maint
+52071 9caf5a9da554d0bab3ba1ac84962c46b0754bfc0 release25-maint
+52072 b7ae8977d06e497d6fdadeaa0c86d336aedceacd legacy-trunk
+52073 9be03226a7bf8da99edf1790ae55986232feba32 release24-maint
+52074 cf58fb8450ba305d4fc059d9095a5eaa00297cce release25-maint
+52075 40e2fee03a949225098bb87d4bfb428f7fcdcfba legacy-trunk
+52076 5130b68b54e94a8b09223ad952caa170653f0f10 release24-maint
+52077 dfd809dcf68000fe6a4a680a250c1f9eb98d2ec2 release25-maint
+52078 c89a756c0965a90d35ca621b30b7d4521a26ee54 legacy-trunk
+52079 90728dfc33e85884dccecb836e5b0145eaef8473 release25-maint
+52080 d743381131d6c9f1b893e136a1684eee776189bb legacy-trunk
+52081 bf47de6d9c918e206c3ab7fcdecf451d86fd1b18 release24-maint
+52083 257daf39b08c68e62f4e70d55138d2269a808c21 legacy-trunk
+52084 89e4aebbf31c46093b3cca7c81823c871dcb6ec9 legacy-trunk
+52086 00af6987026a6d5c1e2d3e1645dd1f6a97b390a6 legacy-trunk
+52087 1da04c8ee8ff0030887078a8bda68e245f6ad7ef release25-maint
+52088 9fcaa8ee8c22fdb3ed63c33a3637908576ba5e13 release24-maint
+52089 1697d0d4ef337a8822b59350a7baa015ae0947a7 legacy-trunk
+52090 5c36ec5fd3c236eb6c0440cfbe5fd78e99f89846 release25-maint
+52091 c0e71a4b71c746f0b8bdab5058c1b5a23ebff41f release24-maint
+52092 cdc367ab3bbfcb11fdd4f5cccc2dee8714b16257 pep302_phase2
+52093 b1449a7e15edeead857f53cb80ff5de936ffcfdb pep302_phase2
+52094 b4553b12e25be9acf63bdb11a36c7f91f30f7e30 pep302_phase2
+52095 b22baa1541474f51fa2ccf52bc3229d929c96e2b pep302_phase2
+52096 84afa366eee7a2b06541e9db83a0a3418c712311 release24-maint
+52097 45dbcb0e9fa9fd4f91863970214a90b06e08f4e8 release24-maint
+52098 818118c3a340dfa127a2fea3cfdafe335272c146 release24-maint
+52099 580f6a6951723975c5ec831f546e91f00f5e554b release24-maint
+52100 2c89d616a9ed37c01f2bb567e80070544bea6a0a legacy-trunk
+52101 2e1c49395b961f65554f9a1a6d6792954f7ff936 legacy-trunk
+52102 4da4de954012b49f359b41b9e5457bf77ab896ea legacy-trunk
+52103 f019e4f862877aa7b0b940962bca9db32ed67675 release24-maint
+52104 28a94bf7f67f3c4b1b2c8ff0dde3b0ff72105b4d release24-maint
+52105 de7c0cb5a87295c6a140367af0bb2ea4c4fd912d release24-maint
+52106 b332e1ac66ccd7c6ef7f0fe663a07bcdbedb2cfd release24-maint
+52107 06291eadde2db5a2ecd33a4b271841f35c36f4fb release24-maint
+52108 443b873f9eb90855ee4c2fb5276e9d43ef8bfc0f release24-maint
+52109 5dd6c90d4222cb9e6d76a3b6f8e42c7877a404ee release24-maint
+52110 6b1c4d7d3a26c30545fff03d49e5ae5da395559a release24-maint
+52111 b7e34fbc80ad69bcffcf8e0108ff848a2a62f18a release24-maint
+52112 52e9964ef922d773048fba83f27c75608974ff84 release24-maint
+52113 54d177ede8838802d69b0e981ec628fb64996bc6 release24-maint
+52114 8c83fd79cee5be30646762134155419b0504b141 release24-maint
+52115 ef09e26ef099a43915b08c9ea9a0831a946808f5 release24-maint
+52116 2f238a2cd189dfc37d57b53a700e408bd358f71d release24-maint
+52117 0b6b360e92179513116dd8e4e4eb74aad8194bcf release24-maint
+52118 9e763bcd13cb9febbc3678654ba7dccde2864b4b release24-maint
+52119 0d35b9f94b1516cf2f5ee26e1c1b1a5065e66ca7 release24-maint
+52120 91679287cb96cf986c027243bd8010eade55bcc9 release24-maint
+52121 47ab0c27dd1f922f4f60db37f04b5e57e9d2378c legacy-trunk
+52122 360d0971a6eef1d878f0a0d534a5da355d13864c pep302_phase2
+52123 9e35b62ed4d2df97572591c4d1c5fa859286259d legacy-trunk
+52124 fd14bb5831cdac4ccda5d7a942c0124a7eb9dc5f pep302_phase2
+52125 ada56b54db9a7934caac094321a377dfb0ba4502 pep302_phase2
+52126 660cd072080df3e8b0456d0210edf4a97e0e4317 release25-maint
+52127 79b644bf011647a531d3efd2a63d57e58390d55d release24-maint
+52128 db6ca3ea53e5b67ae41841e50e75cf20838553ba legacy-trunk
+52129 f5d7de5031aa4e227dded227195838f62fe1f7b6 legacy-trunk
+52130 ca887d55c59213d34de87834328aaf913d9202b9 legacy-trunk
+52131 8a2853bf9ecad3b165fdf97ce8acd77456745595 release25-maint
+52132 e039cf6b7d429ce5905a7a1a82c75a2100fd4d54 release24-maint
+52133 1b61e82660ba9c9c012322f49d47281e04588fee release24-maint
+52134 10bb7acbbdc837e29a9b11f1387a6b1b2ca045fb release24-maint
+52135 2add44c0de6c7daa647e7d8d29361eb49e8a6547 legacy-trunk
+52136 a9b1f404e88b59ce481f3bf827632ff103268c1a release24-maint
+52137 0c8e9f9272d5f3e14471f550b0420b087d2674f4 release24-maint
+52137 0c36410c39e8ddbb8951857dc4adf33f29fdc35a legacy-trunk
+52137 4eb286e931a95dddb18d3ecc69ac9732475f4f3e release25-maint
+52138 798935e1295e7fa3241098308e57502f515aeedf release25-maint
+52139 6ba402b600418a568453fab9eee7f3cb8aa140a6 legacy-trunk
+52142 bfac23388a224e798bc211f5a6fb56a79dd01699 release24-maint
+52143 df7a5435ecbb5cffb560bf2093304ae985853520 release24-maint
+52144 42abfb391300a2507657a9f55209ecb75221e2e4 release24-maint
+52145 04ec391410cbe46eb92fd0903353240f77a786b7 release24-maint
+52146 5270b1e36648ef04278aacd386af13668611c586 release24-maint
+52147 4404a3981470641d317b899a5599091935f62615 legacy-trunk
+52148 8aaa3d91eefa7f296cf2c7c3d791bfb7e3626642 legacy-trunk
+52152 b1e7377ecf0446010437c24cbcfd6dd170c1f488 release24-maint
+52153 e88c4267acd1c79174bd0a6a1382383f26c7ef62 release24-maint
+52159 a4bbfca40c7cf76f01b5d824ad6b7003a2ce65ef release24-maint
+52160 f6bbe8d6fa330355e2fa61a7de8322053a54e2ca release24-maint
+52161 1f588a982cc56c75ebb80ae04d58914dd0909a6a release24-maint
+52162 8017b3f21f62e6a04b798d3a622beba42741d33c release24-maint
+52163 c27d8f89aa8915519c10fda7fd5b71a621f2bd1b release24-maint
+52164 9819cdd2fcb1569adba93fc328ed050227b727ca release25-maint
+52165 a9fee1f62f176067666c08f7a6faa88ef4054526 release24-maint
+52166 ab13576374b1a95ff70d9e9a385d0ea22af0e561 release24-maint
+52167 5e244994e42e534275de24bbf1a5b8493d5cab44 release24-maint
+52168 5d93e5ccb31e74c783438ddc77948815578350bf release24-maint
+52170 cd6ce666eff91bfa2126512904b45197c4d85a07 release24-maint
+52171 e65836815791c7bf6ff001231f04081c248bc9e7 release24-maint
+52173 3b57eecdc504a100b5fd34d16b4218a909550a68 release24-maint
+52178 2a46b76beb9ebd9a256242edf06f7317a3522421 release24-maint
+52186 4663ace23499ce67af0b4cb5829dfcaeb996fe3d release24-maint
+52190 7bbff2e9a9c219c5f90ed51b4cbab1312c05fba2 release24-maint
+52192 5bec4a67ff0da88dcd47382754f8087b8679ebb8 release24-maint
+52193 45ac9ce0bb15716dc1cde4414994be19019928a2 release24-maint
+52194 6bb375f559ce4674c1ce7c34303aae966639249e release24-maint
+52196 e81ff9af641db25cbc3ca395cb9a0934ab311fe2 legacy-trunk
+52197 6b1ddf387bd195e58ba3243ceab3d666635b30de pep302_phase2
+52198 5434ed4fe8622671e3abdd954c1594968b009df4 release24-maint
+52199 4713d9900e9e9cb7160ad1a87ada13d8b83595e7 release25-maint
+52200 77674c0f92141069756fd8683cd3f97273f4ffc9 legacy-trunk
+52201 78d7bea3c1220ba25a7a3993e61093b99ff20773 release24-maint
+52202 dd54bd6a6b1eca4c5f30766926dacf3cbcda632c release24-maint
+52203 076c20ca5d7b6f359c3f95619a5c2c4be7fb8ea2 release25-maint
+52204 26c2ff728027ff892e3aef136e56ad2b19861bcf legacy-trunk
+52208 5aea8b1fd262540d84f8eb17d948f1c1bf8f6b24 legacy-trunk
+52209 35714700cf87c54b0431ab8549ecbb25fb5f54e4 release25-maint
+52211 0e9fdb164d20612d65b8628d5b555fd73eb3b523 legacy-trunk
+52212 994ad750b0e3bc058c5893b1bd5ff91d172ac357 legacy-trunk
+52213 5d83994cd8cdf40a4b335a83afadc65e14058a35 legacy-trunk
+52214 d24eaaeda748c416f6726dcb82c84d8481383596 release24-maint
+52215 9118ea781fd52af4da649441520650261d56dddb release24-maint
+52216 2a05ee4a23e071d1ed25f8c80919903ad6026925 release24-maint
+52218 7c34944d4c80be9758c00c6e2c66215dedff0a78 legacy-trunk
+52219 a2f26f944b657179afe36d3e6d6ffe8a282b9344 release25-maint
+52220 ed88d6b7c1f966903bd91d9a9ee7e0391ab2327a release25-maint
+52221 16e2892e1e3c2a26915c2618e705c89abd642c99 legacy-trunk
+52222 9e0431fd674a24f98db1bcab7acb3c61e902f8ba release25-maint
+52223 347794391ce4340bb5c21b1e81c64622ad5eefa8 legacy-trunk
+52224 d3c1947d1666531e1ba1b981f8126b3d5b00aec6 release24-maint
+52225 93e2b3112d79e109ec5b640a0d433535b0f1265f release25-maint
+52226 699cc6a5c86eb8a59ab05691d8095aef51ce5e60 release24-maint
+52227 b9d3301e5f195e60d9937ba7a99e45bcc241b43a legacy-trunk
+52228 deeea4da1f3549ef33adec6196049c74d474a82b release25-maint
+52229 20474d9e75e14bdc204469dad406b8fe39778d69 legacy-trunk
+52230 f805ccce2f564e052e6868c0bb6e27469823c7a4 release25-maint
+52231 693ff5d7341251f96316ed165eb4eefc46d35d84 release24-maint
+52232 0dc261d8c57fa84531f1d283e193a04b411f3b2a release24-maint
+52233 83965977f34a1ae394750020c399d8836d07def4 legacy-trunk
+52234 768894f33f1c347f4404de95dbf3bee3631aece2 release25-maint
+52235 7117f6e5ac8398de71bafcd2563c0b831d60ee68 release25-maint
+52236 91be96646407328aa77fd3c4802cbc88c9800e61 legacy-trunk
+52237 20dd13aee23349122921acb22e7e3442cb841c65 release25-maint
+52238 c339a1a16ec5b64156d260fc6190d3d6df13bf36 legacy-trunk
+52239 475228ed2054c782ce523cda664468c94504303c release25-maint
+52240 0ace3c80611412db8801e7a34078cb3790c692a7 release24-maint
+52242 aeee9f5a0b3ec0e5c5b62bad364f82873b0b33a7 legacy-trunk
+52243 de2b6a1c9b31111551c86e0db8a81a7140fed64e release25-maint
+52244 a60495b36f38cb2ec4b5b10b4e8d58bf0eb612b5 release24-maint
+52245 c3877b6430b5d89e2e09bc1a4e8746211b7f6719 legacy-trunk
+52246 eda931f398c0d5efca0f48ed28b7c24c57e0c0a7 release24-maint
+52247 ede05d34c5183fe316a4ebc00c74880f3da9c3c0 release24-maint
+52249 4eefce8bc2f748a337da7fbc007bb224a19e08d7 release24-maint
+52251 665d7798a1bc8a60b68bdf32eea03942ea4c63ed legacy-trunk
+52252 bf6a02ada449e4a2c982e5363463845e8860a0b7 release25-maint
+52253 38356951c19f98aa64ee44e67c145ec770b30ca5 release24-maint
+52254 1e4e015c07c074de7db4980346d8d112539b4a69 release25-maint
+52255 f46badc8dc2133982e328e460c9c083a226a2a20 legacy-trunk
+52256 d33e4011e2029479aaa57ecb0bc09fde77c97984 release24-maint
+52257 28db611014636eea1c88d0cd3fc2cdb14c88432d legacy-trunk
+52258 8ca9a7b11a7d4261ba0c2b8e6a3ab07d36ea23e7 release25-maint
+52259 52b65f28be17172031c33023855137e8a48eb5c4 release24-maint
+52260 ce515032fce37aa1b0d8768d07762d71b2ee15f0 release24-maint
+52266 30909e1caf79c8d54462d5d5932aa6afebaf9317 release24-maint
+52267 0dac6de0fe78adfbf98fdeea43180ffe8838c6f5 release25-maint
+52268 66b83d1ba2fc5f99f99257aa33f7d8063c7f1e43 legacy-trunk
+52269 b2edd51241ae221a94cb1d14666d1f6f29357d15 release24-maint
+52271 56b911dcc185ac60fae9be834ed563efbbf89d0b release24-maint
+52272 f7fbdc562d7adf6897a3d68a7d1b8b423b181f41 release24-maint
+52273 5bcab4ca66080497ebd7cccc77d92b80f2387575 release24-maint
+52274 985126873740def55773bde540c6d26231cc46ac release24-maint
+52275 a1c381c05ddec467708ef49d9ed2c0da8def597d release24-maint
+52276 baaeea722b1c97ca03179e5a02a4717e7017ba2a release24-maint
+52282 a0454f1f97c6cabb36c4faccc58938c9dbf0945a release24-maint
+52293 ac650ad6c817be2a56687aa0c793d11d93438269 legacy-trunk
+52294 68b4d0dab49ad1eed6b6386c8e620df69728f340 release25-maint
+52295 70140cccd3da73bdd426398cfb5a10038118b038 legacy-trunk
+52296 6670dda4b27d9f2d1220eb494e2bd8f16e84d0c5 release25-maint
+52297 deb1a0b5dbcb8eab7d849bf214d517616bab4ce1 legacy-trunk
+52298 c68fac1eb6cbe478b4c6583916e71c419093dbd5 release25-maint
+52299 c0208195a558507563a8bdfc53702d33440d3749 legacy-trunk
+52300 7640a57822a67ac6ad94192cdf4e7b34e9f67c7f release25-maint
+52301 647598c1a9d9243bc6fdba067be48aa117332462 legacy-trunk
+52302 6e6c220c2fa622ac268dd4f85715238bcb5c1f7b release25-maint
+52303 d27e7632681987ae5699b51d87c2604b2714388d legacy-trunk
+52304 17f417809e23983c03d6662fbce4c496ccb3f762 release25-maint
+52305 4159386f8dbdfc0556d63076aef5e6da431a379d legacy-trunk
+52306 a0bf7281bd20b65a584f4a6299cbece25956d834 release25-maint
+52307 10abfcb66e67bdefa7d7c5709d957067fe24fe27 legacy-trunk
+52308 cd5f7cd2098eb3f74abe8fb84ffa910b2f106eb6 release25-maint
+52309 f4430bec3013e28f911145da5ae6c0d6917081cd legacy-trunk
+52310 1a1a59f50b4ae228f961c9c2ddf3565c9e752102 release25-maint
+52311 a24801da92ee0d52b61030fad7a70e5e6af1b8b6 legacy-trunk
+52312 1e8e900d9f49d27b40b25b643a43cab95b967c9b release25-maint
+52313 7fabbc4a0c4e86b66803e8462d77c498179e61f9 legacy-trunk
+52314 3cfa88fb0f453978c0a6f20b03c266f82843412e release25-maint
+52315 635438b29673fd611f2299bd7c869ef214bedb1f legacy-trunk
+52316 c4c4eec64c1364bc6884ac0b54a6bf70868314e6 legacy-trunk
+52319 c77d9a9fe7043692f3cce2cae12121794c1ad699 theller_modulefinder
+52320 8e685b2389dceeaf3914a514609613485b4c6cdb theller_modulefinder
+52327 39b991ba878f7905c684285453165ddf6fe81bdd legacy-trunk
+52331 109f90c266fbc28736c435a5d99035ef307babca bcannon-objcap
+52332 3985d7e2067db75f170e0891994b0fd70963e40b legacy-trunk
+52333 b61a90e747e7c9290252983c656a4272c79f7f06 legacy-trunk
+52334 84d3b72dc3392a6d10decf9bace0b5bb7ac121f9 release25-maint
+52335 b94bcb7aed3dd3aa7a0c9e7a02dd8889ef8d200e legacy-trunk
+52336 3bc4a9401a11617b565762fbd010ff53028d55ab legacy-trunk
+52337 dae74a8094d90a3b0c5269fe661eaa005b2cfbb8 release25-maint
+52338 bb35c55bc4670bd0deb29576e19c6f85ddf02f8d legacy-trunk
+52339 0f505ec8b97aa21e0faa16d440f4690f73d51e25 legacy-trunk
+52340 45efe4356b61eda030967f1199784a8ff4c09b9c release25-maint
+52341 c006d227948deed49dc81e13b06356a2e0698c18 legacy-trunk
+52342 05c0cd27abca08661340ca7ce80343cf7b9b8602 legacy-trunk
+52343 de88c363d622362863328e26e2ba32ad8c2d2a23 legacy-trunk
+52344 a29d100c78153c10a2a24ae70ba8a95ae89267c1 legacy-trunk
+52345 5615eac8aa7976fce6662d88466c43abfc3c45e2 release25-maint
+52346 2a1a5dc255adc92b71148681575a1abc1f491666 legacy-trunk
+52347 1e555f048e3d4bbe0b630c9432c4365eb6b1e962 release25-maint
+52354 fa96bff93bcad00ad73d692748f86839032e1e50 legacy-trunk
+52356 bf8daf4a6e71a1ea2e5de51fc648df75e5aa8841 legacy-trunk
+52357 469c2d6c8165b25675335aa5ea39e890c3970aae release25-maint
+52358 850508391d46bde4e00172a49491c1ab29600a83 release24-maint
+52359 e1cb32645f77e1f97ef9177cc10111d7180ea60e release24-maint
+52360 7c7eb190b26630fc62e64e895509526db6c3f255 legacy-trunk
+52361 a6511e8297f048c532a874956ceda55ff9586eca release25-maint
+52362 fb5db12f026760219c8ac6344152c46169a45213 release25-maint
+52363 14513db0d62d50ff22a23761e33b935877ff2efa legacy-trunk
+52365 52fe0ecf55c1a18105ff5c2d779a871f7fcaf548 legacy-trunk
+52367 4050f253a6f8a5f0279388cb6ea10799b679d3d7 release25-maint
+52372 34555422dc45f88f5293fb9fba319b559e876aa9 bcannon-objcap
+52377 498cf4b09d8ac03e45f3a0e26a73cb913fe76780 legacy-trunk
+52378 6609f020649f0d0cf653e69e8a1906a86a3ca4d3 legacy-trunk
+52379 a1a6791052886c890a0f119c525c3d2718f27c4c legacy-trunk
+52380 b1d708c33eab4290262e96853cfb4345f9e0730a release24-maint
+52381 fb0c6a67a939e8a2ea2779f79e32c3b7689c37e4 release25-maint
+52382 ee66a15a903021ca2504a32324d3dcbc46ea8a9b release24-maint
+52383 592ac93532efdfa9a40f47b96b1c1231d2eae0e5 release24-maint
+52384 10434d1b42661b700188c82efc35071f824cc1e4 release24-maint
+52387 410c1c78ed51e12dc3de957959f6b7970c37994a legacy-trunk
+52388 e2df1356349f168baebb335e21c158333043d4df legacy-trunk
+52389 0509ab14b2d97ceeefe25e96432f4e373eaab82e legacy-trunk
+52390 18c12d34214382faf8c5fa5cb3c63649053842c6 legacy-trunk
+52391 19de316492e738ceedecb8ec5808475136dc66c0 release25-maint
+52394 3b85333428f986dd6d91d57f07ce50721b0185b5 release25-maint
+52405 86ea88c5205bf50451a3230f6735dcc2f23c963a release25-maint
+52414 826e8674a11d58957fbaeadde8c0964eec07f231 legacy-trunk
+52415 a0d9fcf6f2153f5297a14be2e197db95a171989d legacy-trunk
+52416 384ef87fcc2579ea6d5e9b778502a0c4ff8c5120 legacy-trunk
+52417 c5442b424a869385e033ce7c28fe7aa6027dfa6c release25-maint
+52418 5030fb4a400febb9ac8cd4792b8676b8e598d955 legacy-trunk
+52419 e9c844c4d1a1c9587efd76d9e11b7ad797aaefcb release25-maint
+52420 749d855ee3571ab7e57c2f4918d551021cfa63c1 legacy-trunk
+52421 123c14ed308a15381d40b0839f537d08eefe8cb6 release25-maint
+52423 4ecf1662449844e6e0cdc99b44817cd3d9d91cb0 release23-maint
+52424 8cd0b7113a71a0551e3830cffffa58a01816a04f release23-maint
+52425 b21427ff26475f9c7f4a701da324e951c2b162fe release23-maint
+52426 cdd3476d1b06b3b4ecc89ed35d5b48b6dfb603a6 release23-maint
+52431 e82e696c03dc8ad636a733175332f27c5c7c67b7 legacy-trunk
+52432 050040cba26a45a81998bd795a2a6e2d0334f56a release25-maint
+52446 9186598296cb09e15955a57d189a271f9d7e89ed legacy-trunk
+52447 947366e131fdae2012d8f96b2d29ff961b628ca5 release25-maint
+52448 d78a7a6056193968e8856cc827d83d1139f884e4 release24-maint
+52449 1586fab3c848b944727e1c4fdd97afb3963b67e2 legacy-trunk
+52452 0c1cb92dac97ef39e115f9c59ca334939e8bc8e8 legacy-trunk
+52453 0e83f8c5d70aec34731b0b8e1fc5a70acfc62822 release25-maint
+52454 c0f56f2461f5298fbc13914f79ea3c7146ff8769 legacy-trunk
+52455 5dc47316508fb4e8bf26bd02fda55e0edaa01e46 release25-maint
+52456 015f89a73929e4bb3cd2b47dd0021a22f35844ec legacy-trunk
+52457 34dcbc746243e67c216cc9c9aa48aecbb0069b18 release25-maint
+52458 e5cb4cb56541b97cb027edaa2ebb4dba36a73e64 legacy-trunk
+52459 d3dbb326ffbac79a57c39f6b75ca954e4f64b5b3 legacy-trunk
+52460 ad4c9ba1db57fd1e02c04d669791fb97e6b5f351 legacy-trunk
+52461 5a106b4bcdd28f23ac3bf949fce190e00a97e196 legacy-trunk
+52462 e5782e2a412ba18e32bb696c4ce8b11534cf179c legacy-trunk
+52463 7af94a2723ecb134ffe0b0dbb03aea1ae9235f7a release25-maint
+52464 0d5176e2bfe4b44a91e74b2361d2f393385c32a3 legacy-trunk
+52465 ddb1db56560893c4b7a560e590355a9e5ce6e10b release25-maint
+52466 e867b595079e927e4f2cedf9a0ba42b51179059c legacy-trunk
+52467 b56b562e3a7b7c81f10e1696aface19d2052f2c6 release25-maint
+52468 762dcad720b53eacf14a7c3706f72ee59c15d0bf release24-maint
+52469 e2e80a0169452209a6e4d22bc9ccad2001ed47bb legacy-trunk
+52470 c5a6ace3fc7fd254b238d7bc0b4a2299c412d196 release25-maint
+52471 58db968d14482e7c9455bb2b776ff2d6e0d7925a release24-maint
+52472 6b91c0dcea58a666b7911cf8df0c87c0f786d40c release24-maint
+52473 8f9ad358136f0391429d41b5fbad366b6300c2b4 legacy-trunk
+52474 29c01e62ce6bcae681690c26cd2a52e3cc181cfd release25-maint
+52475 195559c5bacdf06c262f60dfeff4171387d8ae5a release24-maint
+52476 e3b9c6397723482cd1aeb963dd43befbc205efe2 legacy-trunk
+52477 f45b2f0c542fc3c2b8aea75e966e220f5f960ca6 release25-maint
+52478 770c718bc97e02a2b3cb27e4db9cd350ae1dd63a legacy-trunk
+52479 bb0db45f20ea2bc377fb46eab5476de25e2f1f23 release25-maint
+52480 fb9a7b288dce2943556e25573d107a2a6b091cc4 legacy-trunk
+52481 9d691d3755d0de4e1eb12749b9c31f7d9af697ad legacy-trunk
+52482 b91166e8d38db0c71c3ed39e6cf9c9a433e7f37a release25-maint
+52483 98e90049904341540cb29004d9d3e49954dcb6fb legacy-trunk
+52484 8624909f5031f40d9255f7e677f8d7091129df13 legacy-trunk
+52485 988d95ff1fdb72ad057c807f8706a7390b6f0a1f legacy-trunk
+52486 18871a10ffc1fa54fcb209f82a59f165f2218218 release25-maint
+52487 43a826467ad3ceabfb4144a74a052013e1bc950e legacy-trunk
+52488 5d5f18443664d15722d2a76fd449012d4a915e59 legacy-trunk
+52489 dc1e43617972822f27d17bbc27771a5f4faf77be release25-maint
+52490 d0bd8a8afb0103c6c13c53c5f5fb8197c4a10914 p3yk
+52491 1cce0526d9b0a53f4ff95713dde153dc70dae2dc p3yk
+52492 21908c70d264bcf932738839c43f4a13d60b3756 legacy-trunk
+52493 13b8ad679defc7434b1ba1c5e33a1fb2349808fc legacy-trunk
+52494 51339d39a596aff02ad15c388467abd71b361056 legacy-trunk
+52495 69728a7d231239cec5150eb7b15dbf6e8c75b512 legacy-trunk
+52496 7d0bdd6e1c468b2b561a635543b8fe2fa7b3101c legacy-trunk
+52497 c381fcf9d1081c655d8c66e952f9ffe297f890dc legacy-trunk
+52498 2d5a5dedd9759681e9eb23b1b975d42879ff801e release25-maint
+52500 4c53b243c3922a454315c3ee576c4f207dedd128 legacy-trunk
+52501 c58d1b9698438e6ac0f8f4bd014be05a6a94e276 legacy-trunk
+52502 796304efa268c05d2e3e97f88c6208dd576fc331 legacy-trunk
+52503 61e4b59ada0c29ef924d11a862f0ef562333b114 legacy-trunk
+52504 3608605a74d58e56ea8a2a9e3b1582b57877caa7 legacy-trunk
+52505 c4e5e53ba73f358b989401cf3473bd416eef0475 legacy-trunk
+52506 321c075f95cfdac7d1e18bb051ae380fdbbf225b legacy-trunk
+52507 a1863833c4e6f70ac89286996598207e79cd1f7b release25-maint
+52508 4c61f400ce30d0cb9f856c0b8f1434e8effad514 release25-maint
+52509 380a35d78c60896b869f270e90cd191d1a0c54a8 release25-maint
+52510 9acc1775d5714bbfe21903b14ef56fe2e33c1a35 release25-maint
+52511 6a6469e294e72fcabc9a40a358eaca087f15ada4 release25-maint
+52512 d020e2f708be829f3597c41e8862c294c1903f8c release25-maint
+52513 de261f763b4cc04959047fcae4b9f602f5631fbb legacy-trunk
+52514 481bba41f9f450e265f1a9172a0b46b6d449c236 legacy-trunk
+52515 d21dd8cbc716167a0416c873694b3652ccc9dfe2 release25-maint
+52517 7c4058681224955de6aea2faba4a1aaf233c19e4 legacy-trunk
+52518 d245efc7ec890048aec71bec9ccf14214d83ea5e release25-maint
+52519 6a860c81ab7d08398278c7ca6d6963be436d1ec9 legacy-trunk
+52520 4d833fca36702cbeac473616023488d907d1e864 legacy-trunk
+52521 2a1eae6c0eb862a5a84dbe500b20bdc52a84c17d legacy-trunk
+52522 a72d970c384bd13594c56315b8a5e2ab3eaea479 legacy-trunk
+52523 3d3f127d3e0c79be83fb50b2cff350f730fe0f7c release25-maint
+52524 fd8a5f925d4d5139ce262372113bfdf13225a693 legacy-trunk
+52525 ed22ca8f78ff03a530b0bfd50633fda4da90edcd release25-maint
+52526 c7d778da162c920faaec2b3e13fb89ea3551311b legacy-trunk
+52527 9663100c95ca2d261217154f74364a0e7c701aea legacy-trunk
+52528 7c44144714f68f92a7ab74233d4451f699c4b8d5 release25-maint
+52529 e16800ac1eea141f0d23e43c3203d53040ad809c legacy-trunk
+52530 82695e736823f02846ecec0507ca18411892c7b6 release25-maint
+52531 f49cb609042873b65df8eb35721c7c324af8a9f6 release25-maint
+52532 da79c4e9a5bbfb574a2cf02dc7101dba38903311 legacy-trunk
+52533 93667a785b834660f3e5ee2d50be3b125b5bf876 release25-maint
+52534 c6774eb3a067365fc98964247cc98b8c2f992696 legacy-trunk
+52535 9ab7a7736ca05d352ba998d25eb349bc0fae5b7f legacy-trunk
+52536 bf78be63f20d56be4e803b72c841004fc32ad7e5 release25-maint
+52537 d9a8d4f1d6514c7fe947376531b076ac422badee legacy-trunk
+52538 f56b25168142c9454dd089e97759c8d08177a434 legacy-trunk
+52539 7ce872bf00a3f9da14c05d546a155782fc8124cb legacy-trunk
+52540 414ec262d608e4daa1cd38d540cdf101171a9f1c legacy-trunk
+52541 8d6d315b2af3b95faa65d026573e3d6c3caba5bb legacy-trunk
+52542 ca3d1d3c4d8c2cf32f4a77781133742b86f3cded legacy-trunk
+52543 c3707da80aef39e947b8fdb1fd9b2f03305a631a legacy-trunk
+52544 1007328f9db514eecd1b91ef6b8aafae3c41cddf legacy-trunk
+52545 75506810cbbf4cc05acec78fbfe61b1b9b585ed8 legacy-trunk
+52546 ffcc696e1da3c2428c6de1600143fedc84340619 legacy-trunk
+52547 0d0ae84dd1b7aeaeb810f60dcf9314f1190f0c02 legacy-trunk
+52548 1715e6a0aee9ad0fd79ff01343bf81689184d936 legacy-trunk
+52549 c5a2f431c698ef30f48fc1fe649ce7b4bf6b9598 legacy-trunk
+52550 a8a6e2b84bbaf68d47b9056bb94b9ad751eeeb22 legacy-trunk
+52551 b8850aec0466ffed382c5febff61bad4233cc172 release25-maint
+52552 bc8ffc3e3cdb4e9cf59bbd6dfca5301312239e86 legacy-trunk
+52555 b820406852a0a9cd0be4d92b3dbf63e4e434c862 legacy-trunk
+52556 33840c4072b747421fd749078f3ef79095eb733c legacy-trunk
+52572 1abcfefea3eea6973182f31d36a8b95fc7be48f5 release23-maint
+52573 3b6fb5439c1061a941401245076c315beafcc787 release23-maint
+52574 b67553c14fbcae1e204b756dc4cc92e1d4adc7c4 release23-maint
+52588 a3be40c072503037b6efff5a31ee8f10b36de424 legacy-trunk
+52589 871b05d252be0aa11dafe18754ad18bcb26b0d67 release25-maint
+52592 ae411fe1eec01b2a252712b241091d318b749ba9 legacy-trunk
+52593 3e4e0be40f520938576e7676ff0457830b66b352 release25-maint
+52598 ff678669aa6e131ecd2ae87f0231148ed0e5a475 legacy-trunk
+52619 530d7eb0c6c48f1d50ad5440e5da0e35e80840ac legacy-trunk
+52620 6df4a9143ddf8804ee958e367d5357d417b97d27 release25-maint
+52621 ebaf347d42fb14d73b89bb9d2aa07191fc72dc26 legacy-trunk
+52622 003d83da993262502b1887c0b73eb368f84eda5d release25-maint
+52630 1f055fcb6ca660bd7a3d0d987bc1058115c7da5e legacy-trunk
+52631 d785c29f534035be302b0bd256235f49096e306b legacy-trunk
+52632 1a0f46883ea5f0f121213f323c558f6b37b59b65 release25-maint
+52644 cbe133d72e3972d71d23ff0a5e7b4857a0c55f3c legacy-trunk
+52645 5531f46232b7af4ba455d8a7af6402f5e9e64060 release25-maint
+52646 24498d43126cb89d72ef7d3267255c95dd776dbe release24-maint
+52647 ed2ac8084e04850d5c017be26e7218f6a6cef699 legacy-trunk
+52651 1de5e739f9ff593de90a23e651393e881dd941e5 legacy-trunk
+52653 3cc2eaf0e581499dbffb03947b9bbe06ee77bbde legacy-trunk
+52654 f8862998270fbfba0806e88196e8433d7ce93dff release25-maint
+52657 9633f538c98da6ef5dc348f33f0cc06e183666fa legacy-trunk
+52658 8d68b224a8f058e31364ebd12ef9fd57a9e29169 release25-maint
+52662 61cd8c87cfe2c37e4d3577caef57c1b0f2924ec8 legacy-trunk
+52663 78c75b3d3d0bb142016f4a4649685cca78a9ca7f release25-maint
+52664 fa9029a41ce8ab09c83988cddf90fa8dd21f6ab2 legacy-trunk
+52665 bd1623d04bfc44e1791820f1ed5524f0d4b186d4 legacy-trunk
+52666 4f8ebacec5f053628c8f24d1827227773c08f9e1 legacy-trunk
+52667 02c366b2aac2cac65f307fdef8cea68af3531f13 release25-maint
+52668 0dea37bcbeff4c00d21c7cc0033d573230079933 legacy-trunk
+52669 7b851206d24ce34c3499ede3c2f35ee2831e138c release25-maint
+52671 70c756aa9273c2086371c956f784a709730ea1c6 legacy-trunk
+52672 357c99537e852dd339a2db0619f19d15584f9dee legacy-trunk
+52673 57674212c37cf2c9560e6f24ed5b5818ba683032 legacy-trunk
+52674 24a5dc7779316646e0d20bf312656a7b92b195a4 legacy-trunk
+52686 526c9584f25278672676d0787575766f62e5e2cf legacy-trunk
+52687 025b24a261314d10ea1deebe656ba0b7ab3c33a0 release25-maint
+52688 07b29bcfc0135236911d315704bb5be218730528 legacy-trunk
+52690 6d99762cd81881d7dcb43ee87eebe229f076e736 legacy-trunk
+52691 6c0677273c5abb3b58bec6d50199238c8e58a9a4 release25-maint
+52692 ad796fe472caefe4718fdee5a1fccce820618715 legacy-trunk
+52695 7059df7c15df82316c189d9a356796940e60b7ef legacy-trunk
+52696 c30c584cc6aa496b1a995e1186dc2e8bc5de44e7 release25-maint
+52712 561ffa757dfb5a4c2261ab653ea0006ddcb3a439 legacy-trunk
+52716 54f622dd3b26664a52a9e126122bbdab45c9176c legacy-trunk
+52718 732425e3b9274b73f5f77e1fe65e043dcc30376d release25-maint
+52719 d75cbe2b96019c92091bbc37851bf7ce837e16fc legacy-trunk
+52720 0e5f2d0548eb6c966a72168ef089e12e38e44897 release25-maint
+52725 6f2970922c44cd84fcc60c874e3b88d666244e67 legacy-trunk
+52726 616a208f4b8051401c8ac4cb706cb17232fb1b73 release25-maint
+52727 10a9774bb3e347e0ee7d0dda693deccc97b68b79 release25-maint
+52731 4460ec24dac90f9c9ab69d0d2d0cf2e0e705c09c legacy-trunk
+52732 35cf133ac7f8f013aa81a79aa723ea87ed4496f8 release25-maint
+52733 2cf18f127663c781602e4948fb53b06445d5424d legacy-trunk
+52734 633812e8ca1b6a9a5ad2f5ec046b419109343f8f release25-maint
+52736 90d355829bbb786885893e1c0ea065cc398bf70e legacy-trunk
+52737 9f7fc68a20aeddcee6b9ce95ee0676e6d44ccb78 legacy-trunk
+52738 bf4d20476a8614e9a1bdb38e35a1ecc2a599d468 legacy-trunk
+52739 ecbe91b5e46a535a85351981dd1cd7e40bdba94e legacy-trunk
+52740 591daa5362b2d48a272135ddeea151f5593fa949 release25-maint
+52741 d49e0de4019d1f55e01cc207c8e18ef69b908590 legacy-trunk
+52742 eff11e435f4103a6e751713fce64bf3b665637a6 release25-maint
+52753 7e0cf6e3650c8e93c415ce3afa886be34bed42cc legacy-trunk
+52754 f91b6d85cab5622ca4eb102de0eab6e6f86ef411 legacy-trunk
+52755 a1c0b514cb539a0783695389669fc8d25a3568e6 release25-maint
+52762 b80a368853c75a760a6619f8f4e07bc5f6411cf5 legacy-trunk
+52763 8a365fdcdc48dcee59689db20de5cb1599716129 release25-maint
+52764 ba563ab7a57ae2d87f6edad97f07dad1ea53bb5b legacy-trunk
+52765 2515ec4b5b3365651c58bf618891615a78ce954a legacy-trunk
+52766 e26c5178073751cbc4c1b26d0e7cd41e358ffb17 release25-maint
+52776 7cee9434981a2aa8fbe7d524b0e44fe63a57b56d legacy-trunk
+52778 4c62c8290d4f582f4a4d321c03d55df5b54e5b8f release25-maint
+52780 89f2e8da0f0f9edd61c8f5379b34c723a8fc76e6 legacy-trunk
+52781 c1ac8bde5e176d34a8e2bdf9a3be99fabaac07d6 release25-maint
+52782 5c08dcb7d2809f44cd43b4bce30b1135b22e6c7a legacy-trunk
+52783 78c0e72f16d3d077f922e80133a488c0e2431dcb release25-maint
+52784 320dfdee896897c5c72c47c38d0b16044e1f2ada legacy-trunk
+52785 a0406e933a81737db5ad6f8f862fc44e08228167 release25-maint
+52786 5fa5ef559a2f13b8f3a366ff48822fcb11312a53 legacy-trunk
+52787 b871e7bd8355b2922dc9b723800e8631ec1a541c legacy-trunk
+52788 0fdc2b8211f92e56619e6ebe17e389ef5a819345 legacy-trunk
+52789 be2f5b2d53b3bd261c691732d28d07e9aba0c80d legacy-trunk
+52790 40166e5011f8190a8b900718aefdb518c946eea0 legacy-trunk
+52791 9fd1354da6db6b2be86b47a1959a52886c5bc5b9 release22-maint
+52792 271133981e63e1bc78f89e77013d100a7c79912c legacy-trunk
+52794 64e0ac8396a3d6ee23e0f354e0452885902ec27d legacy-trunk
+52795 606e1f0e87bdad6cd243595e1bcb1408436fa380 legacy-trunk
+52796 42eaed8d2b4542affcef01035b7a039529981672 release25-maint
+52797 f3a63185754475cd55b08569b18ad56e3fffe21d release24-maint
+52798 d7ac3b8f2139219ef8d266777dab5f18bd465c33 release23-maint
+52799 8fda5c86cc16cea893114c5cf057af856ab1897d release22-maint
+52800 cf0e68562604d9a2a3663bd30f2d3ca27337e978 legacy-trunk
+52801 ce4ccf87f56e46394ebf0f3329ce65e147237154 release25-maint
+52802 c7a8cb095c4851f8190ddc1747b05dc1f97ced92 release24-maint
+52803 95ae741e287baf7b7091ba5e61c2bf00b2a659e7 release23-maint
+52811 99cb38351ffc40bbc301f7c3cf13c55dbebd326b legacy-trunk
+52812 ab1885f3443a7dab3a8e494dfb4f817abbe9d6a7 release25-maint
+52813 a27ede2ca6068a5168b562dc4f9b65c07f1cb2e2 release25-maint
+52814 61b069b84d0afcc510d25762ce632dc43188317c legacy-trunk
+52815 b0c08ef1c3030907a66d87b7cdbe2e3c0230cbcf legacy-trunk
+52816 6e1b9007bbdc6048b824e6dc9b2177efeb584a1e release25-maint
+52817 d183d8124803d0272e5cdde43ea8afa9d0f0a890 legacy-trunk
+52818 a037fa8f8458e31f31f2a71790e37b877c8edad1 release25-maint
+52819 259d269008617cbc17d910f004f0491ab73f00a9 p3yk
+52820 d75b0caa67db9de61210978bdbaf1e6aa4ebe4c1 p3yk
+52821 93dbfc654b6a222fbd52ab8ff43beb7911fbf603 legacy-trunk
+52823 7f33f24a7c4167c8279d68edca42ea9b6e3d3940 p3yk
+52824 25cc6161472063bacc6a3fedd59eae02e6b36d01 release23-maint
+52826 a3e0f1e11082888e93d0c8285eaff25968d85dee legacy-trunk
+52827 b6b02593145133377de2831ead9a0b0e8cf98b80 release25-maint
+52833 291e6336867b674f0f84fd4cc0f463621dcc6715 legacy-trunk
+52834 cd3d6b98caead266b9002c8cd77195c6d8ebfde0 release25-maint
+52835 00462ca48845480e9ca8423a4bf75b7047b22fc4 legacy-trunk
+52839 e7070d67db8c7c9fe33f0c78b9fd564204f35f05 legacy-trunk
+52840 193146e4d276c044ef7aa21b3f5ec4d3b78eec48 legacy-trunk
+52841 96be9d74ad3675040d6021c3e79691d5e5e26446 legacy-trunk
+52842 586dd8eedb75fef879a6cfb4fb50026d91447c3e release25-maint
+52843 250835dc544aa6003d20366076a252e3d6532ec3 legacy-trunk
+52844 20be431e75401afd9b76ff40a1f8cacd5bfa7384 release25-maint
+52845 454eff2706d3b8bb271dcce147f5e79a8149f02a legacy-trunk
+52846 a55d465d40cfd24de5d52c109cc267f1a6fe865d release25-maint
+52850 ef15470167033c74ae505d7d42a0dfb6d3dd9eab legacy-trunk
+52851 a1015302d7e4d42a0af1695c086d2efa827d08ef release25-maint
+52853 88133417dfd05b4e156a6bce714d2af019c5cab8 p3yk
+52855 78fb7990c5aa595bfbc4f17ca81d8fdc28a634b9 legacy-trunk
+52856 a1fd93b5891210878ac3b4ac7e4f9066433e493f release25-maint
+52857 02d513e871fe9572d22f16202649896e68e31891 p3yk
+52862 4e368e82c70d6a1e3120842fbe241ab32965c2fc legacy-trunk
+52863 39ad99dd67e4de5cfa9b315829432d112514546b release24-maint
+52863 98a1eca3a93083ccf01f45d09a26096bde4106f9 release25-maint
+52872 fef5b774818bdc4e6262a23004ea2fdd3b90455b legacy-trunk
+52875 1e3f5020bb5558f027779a3e21a86bd35271f14d p3yk
+52877 2e5011acb414d4b26788c0357a05b1aa54b70f72 p3yk
+52878 b3ed053cc6a1f2b1f2acc01cae9534ef7919bd42 p3yk
+52890 d800d673755641444a2fa6cc78bd862533929a1f legacy-trunk
+52899 0e2a073cbbbfa7cf7dfaaf5d4fd1673caea4b476 release25-maint
+52900 c7e7e7196a4ccf355fae912f1d9e924266642d2e legacy-trunk
+52905 3ab12d1a17d2ee348fd8abf0edf5506a77fcb01f legacy-trunk
+52906 c43787e6d7061d57fd708164d0ef02fc00d9a562 legacy-trunk
+52907 26b713a19534f28e7de2aab9aedc69fe17c5cfb3 release25-maint
+52908 3ee9d1a36d464309cf4cbc1528d65170f9a758e0 legacy-trunk
+52909 a014692cfa668ded1c0bcba42be933c7ad119a59 release25-maint
+52910 73f0fc2f8f27dc097af1a224a1804f5e22630a40 legacy-trunk
+52915 c1a6d94b8027768f2363a01d86a1da43d3f3c696 legacy-trunk
+52917 0cac3e531c5a15b1a293940e2df919450d728977 legacy-trunk
+52918 f1a6ab3574efdbdd691e6f13ccd49e50c009a063 release25-maint
+52938 eb30d30f22a18579efd1f05aa751322f7e37c677 legacy-trunk
+52939 9ff2b7458c70d0abc7972423c3555df373e07454 release25-maint
+52945 9fe5855b05dda8f7defd2069397c4dc5bfbe4eab legacy-trunk
+52951 d55769712f73df5885c82a178a6c565885d2b112 legacy-trunk
+52952 eef725a40a6678115b2e59ab050c3a2aebe7bb3c release25-maint
+52962 e5ce5a053411696bd066a8061a22873c3d28435d legacy-trunk
+52963 6e91fc88bf99cf850e1fe8fa1c204afb4f2088e1 legacy-trunk
+52964 6b02fe1b382fdfc96e4a4ea79502a4dcb4a17b0a legacy-trunk
+52966 a15bd81efdb636996d3174ad6522c4a7283f267a legacy-trunk
+52967 fa280d7c7d5ed2b7118a221a5a794f149facba30 release25-maint
+52969 ae92c8d0f08d594b5094e69e5867fcf55625eb34 release25-maint
+52970 cf87c8f33f9f72f7f4f24e27d4cb3c0be1ac4703 legacy-trunk
+52971 b87c5639bc3b80a490c2bd11904a1c937e57b7f4 release25-maint
+52972 9d472555b90d7fa45544a7d9e76e355abb929a38 legacy-trunk
+52973 68ef07d9c81e1c1551a0392df86770e558a7cd0e release25-maint
+52974 d9b4efc4ebefffc8f857627396f990b544ad1b63 release25-maint
+52975 d4eb67d1d9318e786eed4f240ec6e2f5b0f09779 legacy-trunk
+52979 447ef0e74629971138931ccd5ed5e406744361aa release22-maint
+52994 0c51b005c2144a4496797024a3c118ef9c34c511 legacy-trunk
+52996 3d5b30772892aca6afa84a5e3ee23562ee20cd04 legacy-trunk
+52997 04fdf9ffb1882e9bcfa08ebcfc500f4841ca6c8c release25-maint
+52998 613072b8f8d09c3d6aec729c9bdf800cebc5861e legacy-trunk
+52999 a311a10ba0bfd6f06f67e2de34d5bfa2cc5d163f release24-maint
+53000 315c5a633b05bf254f3fc66a462fb8ecc93768d8 legacy-trunk
+53001 b3332ec293f26d9b0cbb2a912144d482d8799e01 release24-maint
+53012 810081812996d8fe7e25dbd35dab98033c2e3ca2 legacy-trunk
+53017 cc992d75d5b3c992a9ed091e11892a113c1345e9 p3yk
+53018 6482261b1092160a1ff498ec6dea02f478150d37 p3yk
+53019 50ce56b24cbe313731b97df8deef46ac011cf6db p3yk
+53023 1cb7b3ae414d05c2018a2a46ffa8fd07ba1b5fc1 legacy-trunk
+53025 56e88bbad9a0e8db115f7c4f17e1cd5d89399e7e legacy-trunk
+53026 480789b3294dc5bbcfb405ecaee2c84a1eb5aad6 legacy-trunk
+53029 e4f2b92c757c95d64da4ac83075a684660128737 legacy-trunk
+53030 ceeed02872168232fb00a4a6ed1ad61badbb2d11 release25-maint
+53031 a910abe781590a554b7f1983039e073a165cba71 legacy-trunk
+53032 9e39698afba56ca69f414696beba3c6284da3572 legacy-trunk
+53033 ee5e41dea9492eb5996d0f49fe28262cdaa4838f release25-maint
+53038 0ddd0593d40bee9240fb8d357900c0009f32577c p3yk-noslice
+53039 fa9934626410442c1b28101a575b05cf2021259e p3yk-noslice
+53040 467b38118b29a2b6ae8e3919f0b401e288e951f2 p3yk-noslice
+53041 83384a6925a4c92cb183e559a8151ed1839d381c p3yk-noslice
+53042 597fe895a958362f6efcaa0612bbddeb857b70bb legacy-trunk
+53044 4f7f72bc340a7e5d301893895d4f47a900bb651c p3yk-noslice
+53045 74573fde4f0ce771a0fe106638e074805f36ffd4 p3yk-noslice
+53048 0d64f29ef273d2c2334b78f816f9b20678f618c9 legacy-trunk
+53049 7d79fd1816a845d9708fcda11c937f7970aab0f7 release25-maint
+53050 81ccfedc1c99e7d8d0f105bfff9b4c56afefbe2b legacy-trunk
+53051 8e3f2b022f72771c70c5b06d6460d4709d343da4 legacy-trunk
+53052 38aa1a010219eeac486e3452d9aacdee2368f7ba legacy-trunk
+53053 56dc72c1a1f43deeac4261e4f4e3861a254f7a1d legacy-trunk
+53054 cdf63513a8cdffc34382b2d5a851b7644d40a2e7 release25-maint
+53056 add03a9d778b82819a1b299a2fff828cb539b699 release25-maint
+53057 fe2a3c966c8eaf1a7684158a915f7636f46b6646 legacy-trunk
+53063 eb3b239a4d07806166f2892d137f556e2b22f05c legacy-trunk
+53064 9548ca0e6560ecd444ebda8498ed37a95839be16 p3yk
+53065 21480d89b47f12d0cf519acefc1f071c5394f564 legacy-trunk
+53066 b27d5d98a55676c6596415ffb40f64d667334a4a legacy-trunk
+53067 17e74ce2bc35e79b654c21521d5bd9dc85cd8d6f legacy-trunk
+53068 dcc40b93bfbecba3b045d44b7138ce7fd10acb13 legacy-trunk
+53069 0b04cb751c1a22113da366990e3e6781eccf7eb0 release25-maint
+53070 1644ba7dce1f05de06da49d309f9652a191a6c21 release25-maint
+53071 f98340e36c3115ed763e1587c6d48fd0c7458160 legacy-trunk
+53072 30f09776ed55600a0c4863d4734c208125812c8b release25-maint
+53073 fe698d078cf97e7767aa1b2ca049336b11209b96 legacy-trunk
+53074 a8fa26a3a2ca1c9daf3dd892a04f666e6964fc4d legacy-trunk
+53075 6f864a91c612c9ed729f1106f945d75f31e520db release25-maint
+53080 8565e3fea9b62a2bc387f70d6ac952a97010669b p3yk
+53087 d4fcb56563162c275cf488f4919ddbcb9eb9ea7a p3yk
+53089 f1a4ce1fe5b10b5d20867f486188f38241e45314 p3yk
+53090 51395c0b5482f8c40fff07015cb6aa77308e1a81 legacy-trunk
+53099 96d533efbe7dd4c7f07b54b5b97c5e698d6d46cc legacy-trunk
+53100 fe9b5699089448ecf975bcc9b00c4ad10d449b28 release25-maint
+53101 037f3cea265502c96f65e903ef3a17dcb97794ac release24-maint
+53106 1250fe42ce5c7912407798b37addf1f8e3c53a3f legacy-trunk
+53110 8fb33500e0670b858d5a2f8594b03e9dc7558ac8 legacy-trunk
+53112 7909a4ee566b058342b1504fa53b7203be594fe1 legacy-trunk
+53113 2d5ed267a40fa1acfd2999dc1a04839ab99f82f0 legacy-trunk
+53114 83f5e80ce1f29c311a0760b24cf760eec45b9c9b release25-maint
+53115 a8595dead54ad5d7fa9bec73c7b34728f5c46bb5 legacy-trunk
+53116 22a57f4ffbcd3d4ee951a816145d58bd6cfeff28 release25-maint
+53117 35c48f69bacec795827ff4815a6c0e3dc003294c legacy-trunk
+53118 d2fa7daaa59bf3087089d20663df08843fa90f55 release25-maint
+53120 3d6669adece4a64378abe6fec33d440a1f1eef7f legacy-trunk
+53125 e8e23ed6b67f134cad1bfa43b3dd7a538b420f71 legacy-trunk
+53126 fb5e3fc4227be822b3e7faaf898bff90be1d6a22 release25-maint
+53129 94ebf4a2f738f011e59cc1f6624b9c32cda53b12 legacy-trunk
+53131 f94e2b195189edc95673f8541ea0d84257fc64db legacy-trunk
+53132 37e71feaea3d2fc204b92b7a16ba5aa6a5488468 release25-maint
+53137 881625c13c206cb7251dae92cb34e94d329b4a50 legacy-trunk
+53139 663c9f1ce3aabf8d84c3575b653e30a5355aa0f0 legacy-trunk
+53140 2c504c62d4d8dd54180759115b5b755474ede5fd release25-maint
+53141 2f84b6e81902a8417404862916e17f0350898ee1 legacy-trunk
+53142 f926bbc2fd629277e6a3a3d7fc209062ea3e9ebc legacy-trunk
+53145 5c67484c4cf5ee172c5705f9373c6390f7f37ba2 legacy-trunk
+53146 92f3ef8fa4afa0806767dd19ec21e60ea948623e legacy-trunk
+53147 09f4b460baeb7e5fb4c78447b1f98bba4f791f4c legacy-trunk
+53148 ded99db70ca678dd09b3decacf867234ef0a80d9 release25-maint
+53149 e4b0ff449215f25f2ad55dd4cd3d25316abb1dd2 legacy-trunk
+53150 289819fde3af0ecf4964087b0b727a0ddd8c5698 legacy-trunk
+53153 5c7ea9346f12745188e924f619642a9ea8bf29ad legacy-trunk
+53154 ac8a9a4121d17aa71dbaf5aeda73bd6b16f3662e release25-maint
+53155 6763e45c7f7d3483542e42b43b75be9c6ab89265 legacy-trunk
+53156 ef4b8fcd14d72fe38bc002798093baf601a177da release25-maint
+53159 1e1b9c2e2af0e322d3119021109c61cdd9550575 legacy-trunk
+53160 12af6788d911559c9cef4e80c9ee478cc3a54f48 legacy-trunk
+53161 e85ca3fd4bd63f380a0ab31b8eb412846daf85e0 legacy-trunk
+53162 2676d8287a11b0e9a2fd921cff5f799865996dce release25-maint
+53165 6f8c6f830b51ce65e25d8f554cebbd09405f5eee legacy-trunk
+53166 4d77a2c6aa553373a6405ad8623977591e3bac3e release25-maint
+53167 195f689af5aff4bcc065ff5f7488f65eb3b34698 p3yk
+53168 bce7e4a926a91ba5b43b6eaa109bb455c9099f92 p3yk
+53170 54cd47788811c03c5ed514aa0d0103d46a4fe181 p3yk
+53171 7a35d3d1ac5a301ef3dc52f9140844f0422011a5 p3yk
+53187 d63fa90df9ead8447cead3b7fe423c11ac1801b6 release25-maint
+53188 a3222075f5c66a13cbcbd576c26b9e05a2b36504 legacy-trunk
+53189 b19ed543d695a0305fa0281496438e419c864548 p3yk
+53190 b9fca8fb0fb3518f191453bea9669cc5049f6c86 release25-maint
+53197 94375d81487da8180b0bd983e1d76f42572d1695 release25-maint
+53200 c1a4dc71cdd37601205fb664d49c422e2761cb19 legacy-trunk
+53232 be8240ce52ff7f39ba1661fdb7ab965e35e048da legacy-trunk
+53235 2b19b2adc5c1b8a871400e9010c4b02e8a8111c2 legacy-trunk
+53236 7a13839c635dc55cde47e21fe993ed61d87d63f8 release25-maint
+53243 9cc761b9e2ac560f48a4cc58924e691d3eab6f3f release25-maint
+53244 dc7d4e5d8b497e2b01bbd86d2709e339818a56e1 legacy-trunk
+53249 4203f8e6e86ab40bffd2c3b837a2f40eb78d3c0b legacy-trunk
+53250 d9749c3e6326ae1623f9d1d4ae4bf48c971a645b release25-maint
+53252 f9b27820798b7474f36cf341ab1722a186f57321 legacy-trunk
+53253 69fe683ece566c8423077bf142d63527576cf2ae legacy-trunk
+53254 afabffd562e94cbde24e1391d8f68af472e44d32 release25-maint
+53255 45c73152b4ac58314553d105c634e67a84402cfb legacy-trunk
+53256 ca295c270b1c3f2c155a952a9dcde2e371e34a52 release25-maint
+53258 4274edfdce9818e54684cde20e7b817da4a4fa82 legacy-trunk
+53259 30da06b225afac3bb18c08d175d97f3a13ca19da release25-maint
+53260 96d76d09a4e9c2252dfa897fd6ca8f9eac744b79 legacy-trunk
+53262 7f76996c7bf4b8ec74bf46a04d44d0f59651690b legacy-trunk
+53263 90937d3174cbe5686ca91dde90c71f815c99d5ac release25-maint
+53264 9334b0dc3a17d90e27ef457978897004364a5ccd legacy-trunk
+53269 3a8fd3638f260a1c55e1a578baed5a2f3a773f4c release25-maint
+53270 84acea8e072e66e31b40b75cee50cf6f11d798bc release25-maint
+53273 f70279f00dfc80c0dfb9889f6e837961821fe675 release25-maint
+53275 6845e0e62900fc219559b1a78a26cfbb4d27440c release25-maint
+53279 167e7ba7475613c22680cab96bfafedbac057b14 legacy-trunk
+53285 07c4702020dc92ade65b1f1a1fc8eddf2a91b3d9 legacy-trunk
+53286 4105570da30ad2b21089cd015f1c5dab7c24931c legacy-trunk
+53287 1520baaf27bf74e97979d7af075212fe84abff85 release25-maint
+53288 6bd65cb5b952062e30ea2e236dc52159c0b9b0a0 p3yk
+53289 995b7fcc296df5684ac739a21ce64a452b8704b3 p3yk
+53291 cc949c605574da75dc8591b72f9fef5f4b18f91f legacy-trunk
+53293 7a11a3abe64c1f6f7c5c2377bb8ceee5b25ee1eb legacy-trunk
+53294 44c6220b1dc3ffa66dadfdf2990c583ffdd849fb release25-maint
+53295 99093b527c01ca3ff590ea2c3980dfb15f2fec81 legacy-trunk
+53296 03547a4cd30afa10a38ba8c22a685562c85f8a50 release25-maint
+53297 940ff5c77f3a9107eecb1680ad72a3fcb9946de1 release25-maint
+53298 8da6dda679f8b2a8e5ddf6b5eb39b25c04fe7df2 release25-maint
+53299 4dc79e2832094d52a8273c82f8db533d89e55b31 release25-maint
+53300 bd7e41de982f60e9f29808824cc3f5e5e5774665 legacy-trunk
+53301 9afd2c7faede63a71795d31a657e8e84bdc6571f legacy-trunk
+53302 1ed3ed9af348cfba4ce79317686c89ba40d613bf legacy-trunk
+53303 de504024a6e77b459b09ea40687a069d56136838 legacy-trunk
+53304 92dd2bb94ca9c8791407eb27b02034bf117f675f legacy-trunk
+53305 5d431025c999a96e0d275768ac818157a0c09e0e legacy-trunk
+53306 61d634a0bd6a23d90374138ca674cb771e2efdb1 legacy-trunk
+53316 0d92caa2d0f42b2c392cddfc9161a823a4884ad2 legacy-trunk
+53321 6ddb636f95c00944c68630ada2a2b78cea6cf25a release25-maint
+53329 b81f4ee94b04cb96af4d19cafa322932666d51f5 bcannon-objcap
+53331 49dc7fc66bee382a055c280f76ef849b50dba257 bcannon-objcap
+53332 67287ca4e1e853fcda722f3b99396f2d4e889f6d p3yk
+53333 bb1eea9ced70dab7844f33b4581e05bb918fca19 bcannon-objcap
+53334 f31fee262b5145f043c5b38321860941268beb04 bcannon-objcap
+53335 69bc806d9661653a36c2954e3c7738974c5ee992 p3yk
+53336 0b797a7b531304f25090d99538c63fa452c45ba8 p3yk
+53340 667bd027d80098d470b9ce88557d5d6d443179e2 legacy-trunk
+53341 b4ba7249aba568311056d9f0da3b90152ed7af36 legacy-trunk
+53342 6b18a095c2e7ab7c3e33a066c8a745925bef44ad p3yk
+53349 4bab65fcca8e63699b0226242dfe08202459d988 p3yk
+53357 ff71b82f6c956083b0cd28cb22c4868fed369d15 release25-maint
+53358 13fc194204c4e74c6e43c66b5e417e3cd80f9e1f legacy-trunk
+53360 468ae3e392a2a2b6480f4adf6b4788dadb1b1c0c release25-maint
+53361 90946d5434aa32a7767be7c9959451349d3e0a2e legacy-trunk
+53362 5f130271f38695ef499672d6cc638ea1c4f4b33d legacy-trunk
+53363 7e2500226c436c65a1dd793368f8c85bef131a99 p3yk-noslice
+53364 8c369346a4cc508c9dcd377c6127bf054e2cb5c8 p3yk-noslice
+53369 e1e4493f6e8f247af259ae24164cc91aca1c83e4 release25-maint
+53370 46fc75615da522bc808c534b56a04ec25a433bf2 legacy-trunk
+53371 b60b42097b78b6aca4dbecbd1f37aa56e58d4963 release24-maint
+53373 813dcc83e42c27dc06a3e0d43b841074b5958c2d release24-maint
+53374 43c75e540e922fb6e8f7860724c8cf3fd17bbb71 release25-maint
+53375 21119db5e096650d43ac55c4e7e15f921c8b9820 legacy-trunk
+53380 26859900fa5de7e5da6b35e91eb12180ecd89094 release25-maint
+53381 7da3dbc8145b84dbaa2e237d419ccb88b5106ee5 legacy-trunk
+53383 be193af22f047eb0af763ccd3b3cd9e4bfe65ad1 release24-maint
+53384 e18af28b49da9a59136af3c2a4651b10158b20a5 release24-maint
+53385 53c0b09c48c11f4cc04a1f3fab077c40a197a6e0 bcannon-objcap
+53387 1c4bbe63fdfc4877243aaa7aafee753271de5d33 bcannon-objcap
+53388 7d8868cfba7c5e9df40f6cb4339c356fbbc5171a legacy-trunk
+53389 a2e17b7515d3a363e2527020dd3d6bb6d27efd51 bcannon-objcap
+53390 6899b740e8eae6ddd7dcdd8998bed254cb28a048 legacy-trunk
+53391 78cd384d3fcf909ac852de3876a452e944d0fbdc bcannon-objcap
+53393 c7bd892c0567d72d207c3e265c73109aed07daa8 legacy-trunk
+53394 6d16ebc715695c090919f09853c3e99556dc505e release25-maint
+53395 1802cf93254bf664545f0fd14b5d04d056fe8c9d release25-maint
+53396 8bf68ecc7676af1fbd34b8ed3b0bc6af7cb56390 release25-maint
+53397 2c571f6ce23ab27668c2ae12d4db642877b4ed6e legacy-trunk
+53401 e8ade8a6e5cb9ca4a2135a1feb67af9bdd59c385 legacy-trunk
+53402 cf8af6b7598bc535589d75d695b1dcb7330021fb legacy-trunk
+53403 ca537e9ba7a7f1a61068f505c5f33e8561ae9081 legacy-trunk
+53406 b303fb383fa469483752e3f3aa67f7beead80c91 legacy-trunk
+53407 f27b8899b6135232a7a2ae9d63e314411ca6d829 legacy-trunk
+53409 ed7acf1881a940fc65c7d2595c61f35cfd25d445 legacy-trunk
+53410 2a476c94be200405a91e82539e2edafac3d23700 legacy-trunk
+53411 68b41c2d66631aac4b414b2ca6c61fefee347cc6 legacy-trunk
+53412 2df80e716e5c9d9266ffed0a9f23b8dd6f47a518 legacy-trunk
+53413 1409e1f273b508513562c86390ed33e6b0215ba1 release25-maint
+53414 73b93dc5e440ac08892635de0ea19c0c367f19ce legacy-trunk
+53415 f328329471df571396a3bacc9daaf3f0c12fb75f legacy-trunk
+53416 ca1b40cc6b74c3599a246cae9544575aafa8343e legacy-trunk
+53417 426f1d373cdd65780f87798132cb49b9c13cb0a9 p3yk
+53418 4ebf0b805ce84f7a79f00cb9d0163e2d4e86a57e int_unification
+53420 b9d4ced2350621f668cff942fc4350230ebd9a82 legacy-trunk
+53421 4aee3f672f77e0feaf02ccdabd01eed8b63236de p3yk
+53422 dbfd86c3c7913aa1cd2427faf1946aebf5116a8e p3yk
+53423 90c38271686b121314435b389fc2b17ec898b35f legacy-trunk
+53424 a004c3b019ca1532250c52c5afaceb900ae4498f p3yk
+53425 3d79bc6ed6ece72289a16bc8fa381ac0994e02c6 legacy-trunk
+53433 98d5f90cb905afebcfcfd1cd37bc1e27381fe13e p3yk
+53434 6efe3a4b10ac98ad2e257892822fa9541229fcf0 legacy-trunk
+53438 db8c175d1283d7fb766203002ad60f170964407a p3yk
+53439 8e2ca54449001ecb23ae5aa518774e10effe71fd p3yk
+53440 cf98345b9d6b020af00e67770b0f3a7123bde69d legacy-trunk
+53441 f37696e646fac5d53563d398798f4d8020e333a3 legacy-trunk
+53442 cc5c071c842311e83f6cea0883f449b8877f5ef5 legacy-trunk
+53443 86ce1df6a88e70c1a390a33a08db7de4288c0626 p3yk
+53444 82b9b5b12256e45e0ca491d24bd6ec5da9c93e1d p3yk
+53445 6f5b33947274e8b4d3fc51ec9453a2e21f2647e4 p3yk
+53446 342532f4536e618489ac5280093f3973b5562d2b p3yk
+53448 d02d29c5232a1cabcb2700347d84da98651d1e8a p3yk
+53451 47f9efdc0855a8d1761a0a4247935762f42c35c3 p3yk
+53452 1c26505c1de6eb50ea864a977028bdf69578a97c p3yk
+53453 3f78274f2a349435b7452e2d242fb60a54736682 p3yk
+53454 4a4bc5c76e4590bdc8e5e7ada2bc34f4ecc064cb legacy-trunk
+53458 9be62c45f3a87940f1b0cde3b3b76dcddd8a9365 legacy-trunk
+53459 e5b641e700f23545a394c0a8380fc0175200cfa8 legacy-trunk
+53460 a4cdb9c8af25bd67a39b1492c38c1c3c1b25aef6 legacy-trunk
+53462 379af418fc36752de95f4aa2bb7bdd5958be8111 bcannon-objcap
+53464 48d38d7770249629eb5153b39060f1515d295f25 legacy-trunk
+53465 03a5f2b068253fae05344a4bd2bc4a36dbde5ca1 legacy-trunk
+53466 66782e5b992f57f4b721b1c9564a99c5448efa17 legacy-trunk
+53467 4a97f3bfb55ce1e5bdccd93cf59f707f5a906819 release25-maint
+53471 b7338f3b1b02245ea4cfc8690dc3461e0588b3f5 release25-maint
+53472 091df436038d745ea9d627f88202b30840f4d5cb legacy-trunk
+53473 191eaae5a29d2ec3f4a5f6329efb66c7d11fe552 release25-maint
+53474 4d857da7e6c4f413287543f966e95f3a3db91104 release25-maint
+53475 77329b127d4374e4168618f2d4f0b26fefe0f732 legacy-trunk
+53476 94ca06d959306f82c5eb13381c4e30e6c2bcb47b release25-maint
+53477 90160490c6d4052d3b47519d733537ec59b21184 legacy-trunk
+53478 223ff35dcffc1b06ad40bf074545641de926236a release25-maint
+53479 ee87eef957f359136327703407e3a139d14300e5 bcannon-objcap
+53481 ca607d748f64e6604c8a5ae0602bfba45ecdc9f6 legacy-trunk
+53482 9bdf34b3f72eb0fee3c2b19b39f2d889d5d367fb legacy-trunk
+53483 3f1dfaf293fa1da0ef9b949079f688ff9f05504a legacy-trunk
+53484 0bc42c156e9f5efee789c952a4d0e886f6e44ea0 release25-maint
+53487 9fe92f18bb6a42a74693d6ae98083c61a7bd48e0 release25-maint
+53488 b8acec4a4c89ca6bd3af859b7f67b42417c9eb4b legacy-trunk
+53489 b051d197f7a4937fccefc67aaeb80c216a455275 legacy-trunk
+53490 05a8986d9526737c924232c57dc532cb8074acf7 release25-maint
+53496 680d17a6b15f0a0424a03d604d0d45231ee16d22 release25-maint
+53497 39b3a5a3c645b89b80f5f3b5c0d4a34d1ae4d4db legacy-trunk
+53498 60d31a12b150d509cfd70bf198d06bcaf65feba8 release25-maint
+53499 2f80af674074afc2526ae001aad8c4b5e6384bbb legacy-trunk
+53501 5bf4f05903b20c60f78ebc450660d2746ca7aea0 release25-maint
+53502 59cf89e5f237edaa5160843131321f8f84ac8c42 release25-maint
+53503 7b38f9955c64659401477571b71af9b993c58faf legacy-trunk
+53504 10bffd19b535a448e482e29effeafc859d2b3f12 legacy-trunk
+53505 3ae4f930bf27b4cdc0c77fe16bdf50416a879652 legacy-trunk
+53506 ac4c2f5c3fc0e9934336468b3c9099279f989c92 legacy-trunk
+53507 5f8a54c804ff6f0dd32b2c258192da93a9a6ed64 legacy-trunk
+53508 0bffca64ccc4ba04e413088d0740ec82f4848119 legacy-trunk
+53509 77e0f4718a7ca617787e70fb3a8f6fbde7ba05c6 legacy-trunk
+53510 c86df311e62cece21006be6bc36209faef2b4b8c release25-maint
+53511 2fa6e82b1f17b7aef876137972a73b7c2ffde777 legacy-trunk
+53512 573a461761753952a0b052c2150423054d07540c release25-maint
+53513 666faf8912e05f37fe3ab4d813da2492145bcdae release25-maint
+53515 1679a4ada1712b0d8899a58fdac9ad0fcf9047df release25-maint
+53516 3b6ac4f4b437240bdfa0f85340aecdc56bbb1839 release25-maint
+53517 b23711be2b3e0342138f474ff31664848870fd4f legacy-trunk
+53518 bb4c0bbba272f8d78f7526fd24c62082814008b8 legacy-trunk
+53519 b16b4f976e70ad87f663972c2cafa40793f478c1 legacy-trunk
+53520 ece2af764621d057e42564a4b44d341b96eca545 release25-maint
+53521 de2bbdece83edafd2ae1da48918a43273586f205 release25-maint
+53522 d7be03ebf466731cb7be61c474c651e951ff444f legacy-trunk
+53523 9f2393e9eacabf438063fdaf28f2f4f17879e832 release25-maint
+53524 081ca6080ff145304e4d34f118919964352cf515 legacy-trunk
+53525 29b8b65bae3fab5e0f4b970bd96bfa3be030e210 release25-maint
+53526 7f4065efa44ee23965111515f4c3072e25e2a33a legacy-trunk
+53527 86ab2f20a33338dc0a2f010af0c929314eb6883b legacy-trunk
+53528 d2e2edd07082c4fbede48b27b2feb3be765e38a4 legacy-trunk
+53529 da30a26dfeb39cb501b5b0c285adedc5dde7bfa5 release25-maint
+53530 6860ba88d67ea9d30f79ee81a293863f12732cd8 release24-maint
+53531 df294bc5ce6e826987652167c12f389542bcf57f legacy-trunk
+53532 0e95c77512f54a10c29c07380b02a71f05464916 release25-maint
+53533 293311e63a732e21da7ef6630fff25d98008047f release25-maint
+53534 03144c486782c1b13e1ba60878b59f48e0ff1601 release25-maint
+53535 dbbdfc038dc947cd9240bc2975f82825e7f27cae legacy-trunk
+53536 38d944efe600c6c4ef697efe3958f453f90b626c legacy-trunk
+53543 4807a6abf90624c98b79c553b13bc0502e39b6ca bcannon-objcap
+53545 0d096b146b4868b328b58003a756ec03db2c115f legacy-trunk
+53546 4158ba7f46a035aa41cf2291dbfb76f4f77120e0 release25-maint
+53556 a5b269ce079dedc6b0ff4c8b43194e05e090099d legacy-trunk
+53558 656dd0095f52edc18dee95d23d69bacb19aabdc2 release25-maint
+53563 e43816ddc4f05d318d5409e72aca9dc73dc7a9a8 legacy-trunk
+53564 15deca39e0e6bbc79cc4816063dbce2200b23f2d legacy-trunk
+53569 4fa9c80fb17ab86c19d4884a354fc5259239b3eb release25-maint
+53570 1163f55dad95f80cf7f05ef18bb86de57f2e7c5d legacy-trunk
+53572 2bbf17c1c69cb9d1bdcca14dc38447101d508169 release25-maint
+53573 12855000e13bdeab4887c744c3e16599556759ac legacy-trunk
+53575 2343c68ca1c87a3aff5023ab27d81b0e8cab5507 legacy-trunk
+53576 1751ca3feffe96b448f6e362b4d162cc9fb7f295 release25-maint
+53578 c9d7b86f9377cb18bbf136fcabf9caceaee10ae3 legacy-trunk
+53579 2431f82a6a1756fa74ad22ce3b72017da4fa1ffb legacy-trunk
+53580 ad936e0b6fcfd1bb2dbf9a7a3990f1ca37983722 release25-maint
+53590 1782b622aac71b9b0e3aad913a8f65c91de06d99 legacy-trunk
+53591 2d8239abfa60fae3c1be75ebc0dbc44c8e2d5b8c legacy-trunk
+53594 5fc819c6c13e2ef9e7bd5d6e7060df6cbf0fa5b8 legacy-trunk
+53596 d60ad914d833ee96cdbeb34cd5acc6b4acd10c62 legacy-trunk
+53597 ab9c865196281afa2a7577cf6649e75778e7c206 legacy-trunk
+53598 ffb9580f967baa6c962285d5d8366ef815e0a794 p3yk
+53599 d5babb326a50d103b0154bec4d6c0b25108308ff p3yk
+53600 a2644222805855c817df1d536c24827ff2c4169c p3yk
+53601 5dae0d7f683ab379692fd4cb45a9191dd92ce20d legacy-trunk
+53603 4b1001da399286a863ac659992215eaaba5d9814 legacy-trunk
+53604 0aca0039cc1b5ed15f10a9df41e265847d037578 release25-maint
+53605 bd3739a872595a0716d8f61777c30fb69fe84ba9 legacy-trunk
+53606 037abca817b6383bdb48a776138446a9255e4086 release25-maint
+53607 c147c6bc579f2818ad13132da0841ecd30aaf31f bcannon-objcap
+53608 67ec4affbd14c0e4d8715d5aaf0db0620c453ffc bcannon-objcap
+53609 0f20c3bc62706a22fc1ea1192d6eabb07a02ca19 bcannon-objcap
+53610 6ebad2a6b990786ab6123bc96b616731517a2ba2 p3yk
+53613 58389dea651cd6931e8a41ca371efe1aaea78ce4 bcannon-objcap
+53616 72c0c6aec1ed185c636ce13f04a5a70635c22012 bcannon-objcap
+53617 53a36db2c38764098be8f610af603b94a09d4d8b release25-maint
+53618 2a8e9efb5d20c3bc5dcc719ee2714e689b03eac9 legacy-trunk
+53624 ad8cdfb6987213ed0cd6d5d3de48f575c2080258 legacy-trunk
+53627 8480968f4f4a14e9291ab5015599d1917f6aa919 p3yk
+53634 f1701ba2452b40ea8db89c23b2c3a2c7c333a381 p3yk
+53635 ccac636b152ce682fb4f252525be45dabdf8d683 legacy-trunk
+53641 6d9ca90d8bf749d95bd980afd117dd02ca6bee58 legacy-trunk
+53644 1af8fee33013c0e762b240a58434ee9e172ba32c legacy-trunk
+53646 d3e88631f92bb6a07ba70e95d9ec23a1d05cbb1f legacy-trunk
+53647 265c51ba391023149c69ad05c50a58c5616d6ee1 release25-maint
+53648 09dcacc8a0bc2a1e30fd847a0367d7cad5854669 legacy-trunk
+53649 0528d6f94eb6ee63f8e48c0d1af2707b39872f10 legacy-trunk
+53650 6c41b0122747af59d51fe794ab0a58d7e1b9d24d legacy-trunk
+53651 d594ec858fe974dc5d92c170136b0f23694d6f49 p3yk
+53652 f83d6aa390f106b92fb8ff2dfe2da4eb8858d8df p3yk
+53653 c7793345a0c544c24827ca5cba367d92deb6afee legacy-trunk
+53654 499bf3040af7bf453bfd31de23e59b3bd5aa1b42 legacy-trunk
+53655 56dbdb7b404a39be7a5c2833a6829d3dd394ed0d release25-maint
+53656 078755498cfe3550bb6012dec0b56a35a27796f3 legacy-trunk
+53657 d50994693c9256fd1e1bcbd70eeceac8951fe483 release25-maint
+53658 487ef0f903e0158417c785b94d1c0398dca68c8c legacy-trunk
+53659 8eb03b1181640f19e5499b22c2d3e24fbe23e4df release25-maint
+53660 2900c7564055d62c2df80a67b27f7485f6266ef7 legacy-trunk
+53661 3022778ee0cc6d36fb5486717387db3d0b13f425 release25-maint
+53662 ffaaae02c6629cc55688ed8e36ee015159407fdd legacy-trunk
+53663 a2d7f4c29e5b08913dfe7fc994398bfed58ee494 release25-maint
+53664 c994c245d9ab5cf9657054844cc1038707d7e15d legacy-trunk
+53665 d8fb0f6aaad43cb2f820388b203cb9b1dacec17b release25-maint
+53666 1ad0568737f6101324a54752fda172b9ed756dbc legacy-trunk
+53667 47bb2803eb1be369df38b9cf681c427aee11a90c release25-maint
+53668 1f71a32f98d23bc03041ad6ea7660fa87901918e legacy-trunk
+53669 a04c781546ed2a97b3f5b6bbc853d0c3b100d84d release25-maint
+53670 9f5eaea3c795409bc3358fafb4f9edc6a911091c legacy-trunk
+53671 e776c83a0c19e273e7208f1cfd2a961b0a44fb90 legacy-trunk
+53672 7156cfdc3667e3bfd052d418bda36f92b5991c7b release25-maint
+53679 f7e9071c3a1f00ed7124f1de0de0a28e1de6c8f7 legacy-trunk
+53685 793e0323d4d65bfc89b40d78162cd771c575a18e p3yk
+53686 4cdf21a0dbbce891e75a920d4faf4c0ecbdd8332 p3yk
+53688 1d543a320346107305c4913d827d149f20a43487 p3yk
+53689 f6f391d1d050fe36d0028fec2dce122bf30c44e9 legacy-trunk
+53690 83efff4d5ae94258ec692cebfb182bfceef70c5b release25-maint
+53691 4d91564646736df7107818a299adcab56c43983d legacy-trunk
+53692 b7042bdf90a9bae414f414158a613781de68dff5 release25-maint
+53693 984041e7446d31c6a3ba04b5c59a008c6eaad573 legacy-trunk
+53694 d2fe893a48437257059703d0618e68b6fa337fee release25-maint
+53697 266c1b0f9e16c6886646ab2937e0440b66e6c416 legacy-trunk
+53698 be295878256aabcf3ee063dc0edb6be53da29577 release25-maint
+53701 22760d53d4da5d2877f814fa19dd61bf7006aba6 p3yk
+53702 0ce14c4ca1337d10683a469a77ac43ac88be4bda p3yk
+53703 6917c676c92fbb49cd1b12522d93a73a38fd4e9a p3yk
+53704 e9a6234b26afd1e025396325523acba3d1a3faf1 p3yk
+53705 e8b2913f9297f47f942c15d3a93f1db00641229a p3yk
+53706 8d9a0ec4d97600776398e996ddd2d28d0e0916bd p3yk
+53707 9fd964088e0705f52e85057ea02eeb1753967d86 p3yk
+53708 81e4034ad8837612026ff1eddf81ee355f19e462 p3yk
+53709 c15cff2dd18f5ced959b45f117d3b1409231308a p3yk
+53710 b7f89db9a1d05aa8645a578bb68a7a43cacee86c p3yk
+53711 43e369cc02c55f473f6d4a756f5ffc8d4189372e p3yk
+53712 c4be493dcb6f94b56bb6c5cdbfd71326e1765785 p3yk
+53713 ffdc8d398e4911b7c41c8eccc772a7f9d5e6bcce p3yk
+53714 72277e1967b2b6dfce2243cd7ee912f4be11b7d3 p3yk
+53715 04f5cbc744241dbd464e493eeb0a85edaa0e93ca p3yk
+53716 67525efc99c57f7a974b8e340f8251a58dfbf333 p3yk
+53717 ae8ee9e5e815038fcf608c049d940519f930fef4 p3yk
+53718 5622a13ad8ab11d7013e116baa3e6ff215b2a1f5 p3yk
+53719 e2800e8dd9c484c4a9895fcba6958ad2f7bb8d4b p3yk
+53721 435ed641a333f8339633ae7111129fbe1f3f82cb p3yk
+53723 eaedf84eabcdf6838ddd849aa416c7b87bf7299f p3yk
+53724 7da2ae1a4f709d0f14d3a9e58ad6fd8b2e71a9ea p3yk
+53727 f229645d607dde3e90f133d348e0209d6cd99818 p3yk
+53731 353c009f6c53852540facba0d31c653eca76dc98 legacy-trunk
+53732 f340cb045bf92d0e7772385a7197e9b0af37f0a8 p3yk
+53734 4a01f6e0201688641df5af9694d2981046edc5c1 p3yk
+53735 5dbce2ea133c3c01e76b0c6d3a4941695abba91b legacy-trunk
+53736 90536be093f7da5f9de6638b1d6511db03b77ccb release24-maint
+53737 fcf6902f210ed3b06b95bc520451e749bebcffd8 release25-maint
+53738 cb8123ab2a065d8a090d1423cfaa1213ccce3e42 p3yk
+53739 5de7547a5a2371111386612a9a9a2fa623c064ed p3yk
+53740 3d18d8f366b1184d619ba74950a3d7158d64d259 p3yk
+53741 29d65741f6c896f2e1c193e020cf7ddb412729b1 legacy-trunk
+53742 a84460e5316093d0030feb8c760ac1c3a9885724 p3yk
+53743 5ef70c49d85a24335b43af43c3f09b6df63192a3 p3yk
+53746 e6685c840ee3c11a91e0a33721a57b17cf51f837 p3yk
+53747 429a4bc31c8e3670e7000fa5409c7e2b80f54750 p3yk
+53748 dca9bc8830409658fb772a6d0b3053c6dd4345d5 p3yk
+53749 50330d18d1cd7141bafc2c8a9980a8b8ca883d76 p3yk
+53751 180d4e8996839069fca8819cf9f3ccc5ea2ea3e1 legacy-trunk
+53752 ec1ebdf54eafd9abb142418dc65cba4a62dd300a legacy-trunk
+53753 bbe6de3a9745006f4125aac3272cebc433f3e3ec release25-maint
+53754 724e0b63a79b5d4b0cb167ab8f960ec51e6b3928 legacy-trunk
+53755 7ad29e99eec8572620fcf098703aa55d604b9765 release25-maint
+53757 32d46abaa8aba4c5e7a9ca82952523cdcd81d968 legacy-trunk
+53759 9d253cd38b5b65a3d6c64c48f8caf345e55e426b p3yk
+53760 28c4d9b7740ed01038573efac701fe70178cb045 bcannon-sandboxing
+53761 35c0d38acdce0802f3bbd047d6c003ecc00c1489 bcannon-objcap
+53762 d4a6a67a00a0ba35bc21b9ac3203e9b08580b0b4 pep302_phase2
+53763 81d68dd84aa05cf8d58df55af1746d81a999fb14 legacy-trunk
+53764 1dba61c077034e1687a1ff615ac2db7baf0872ea release25-maint
+53765 daf063527b97214c95e27327ddd992ec07e4d02e legacy-trunk
+53766 d949933cd6b46c72cf7c40291412d2c6eb7af619 legacy-trunk
+53767 bd24d3826cc83df0c9b58cddf1c7e2c4c73262f4 legacy-trunk
+53768 177a7bee64e9eb2d3772ceff81d19c2c9a9aeda4 release25-maint
+53769 3bbec91c5b8fe66ec34f0f8f1ab0884a14a8930e legacy-trunk
+53770 885a77fd5c01c7dbf83a29d5dcbe99f596a09071 release25-maint
+53771 3983ee0f6f964dbb228f5e1b152dbade98ac559d legacy-trunk
+53772 d4768bff643ea813f66eb6d797215d2b52a5a2e8 legacy-trunk
+53773 abfd95185ab991936941dadc40dadf5ad21f6bb4 p3yk
+53774 90e22fea836344567dc55de8a9a8a0dab7ce83c9 legacy-trunk
+53775 dc56789b29e9a63b4f5704f0d8145103971f189c legacy-trunk
+53776 a6546c27369a6c4f130e6df10ec67a15bbfdf233 legacy-trunk
+53777 0972c2176af9b9a90f8fcb0fc4ea5db41b2adac5 release25-maint
+53778 a62184b03f0f1502d0ab8e7def92c9b666bfa682 legacy-trunk
+53779 73481e077758a94193fb011fe966ac5978eedc91 p3yk
+53780 502de079ab3a205203351a0ff502b8d840969602 p3yk
+53781 1d53ea0fc23f15f5d2c60576e96c305bc0fa7267 p3yk
+53782 48b6d015340ae69788b596934f043f3f1f572227 legacy-trunk
+53783 7e4b635f1d31dba0d7eae1e13ab3e80cc4fa3a29 legacy-trunk
+53784 99b0e04b2eb1ca011f8fa83b32ec47813d5c36b5 release25-maint
+53785 2a2532883d80fb372db2e3eea8e27cee96d777d6 legacy-trunk
+53786 914dd5059f38f322557a82443ce28f61f5cf02a3 release25-maint
+53787 474977cd4d9c8441428a9143d37eaaa37163075b legacy-trunk
+53788 29fb8dbd10b85f4b29f7989d045d96327d3b79af release25-maint
+53800 bc2bd0f01d95b543496ffa16c5bbf6a4254a58e3 legacy-trunk
+53801 b4b327840fb1510e97c5409406146614f5753bf0 legacy-trunk
+53809 f4f695a75664af3bbf2f785d0533e3d6cdce5d4b legacy-trunk
+53811 d795a55e9be41d6d9d520d273bf656dfc0db2669 release25-maint
+53812 736f3d90e4e28486f7075cc0383740698d2ad253 release24-maint
+53816 9e35645af40f682ecc2f91f69e40cd71dd584407 release25-maint
+53817 35ae28257a2805b4a71e9eb13b1780f3ed1f08e0 release25-maint
+53818 b0f8e9b0cc19928ccf973a5528ffa43b7777ffac legacy-trunk
+53819 81b5df5798c27a5a4b0c98e1cef18ecffe5eb899 release25-maint
+53820 36d7b3b6ee596fe8188180e892e6fedff06fd405 legacy-trunk
+53821 d386b460993b73b86ffdacc082c5253eec45052b legacy-trunk
+53822 df0204ca9739f1575ef03a9cbd3d230a9e56c96a legacy-trunk
+53823 0cc450b89838916d1523bb47ce0e4bf85561ef20 legacy-trunk
+53824 c9e413b1d5406a0a8bf7b9446c4f7bdbcb4e356a legacy-trunk
+53825 577bf21b2c86dce05b003144699aa18c2701b2cc legacy-trunk
+53826 53fd144a3f1ab3cb9f258302ab5f98a6be85467f legacy-trunk
+53827 672b9075764713da8d560e798eba0ab037559d8b legacy-trunk
+53828 c34bd6589e1eebcd3975317369cc72d6d9c874cb release25-maint
+53829 d5a15f853db74de76ce926b5b5355f11b5ee68a2 legacy-trunk
+53830 01d54b88bf586e3b8d0b4a6349e22d6746150b9b release25-maint
+53837 6fa0d682e1e550aa01b3d33c1bd7216d2519691f legacy-trunk
+53838 8128619e984de98cd6714054a8d2a6476d9957e6 legacy-trunk
+53841 43797384115e598881e6116a03db077434d79c1f p3yk
+53843 55deb1da4cb8de1635312e4fdd1fc9511ed77838 p3yk
+53844 e68b48c39d8acb53f3f315f879f18ba3e39831c2 p3yk
+53845 60883e614298f31a6ce69df444f88ec67624a451 p3yk
+53852 3fbcd6e2bcb77ddd9cd0824824ac3add993b31a8 p3yk
+53853 3427a97345fcfe748cd4c891a6394bbbe8df12b2 p3yk
+53854 c164b0b7597160ef5224882213cbf44697e7575d p3yk
+53855 12489a5dfb4ab02ef6373fb3dae8a10db515ecec p3yk
+53856 909765eb381bdf5b784bca89cc5769a406795f90 p3yk
+53857 29987244905dffd44ba3e5a07f312fc895acf8d7 p3yk
+53858 c50e263301dabb51f0a76cfe14d6947d8b25d517 p3yk
+53859 20e08a87915a55aa852bf6263561650e037d8f48 p3yk
+53861 f3a59acca51ffe8724087c68d4d1500830386af2 legacy-trunk
+53864 c93f92a7d9202e2a520b8144f0129e3532528f2b legacy-trunk
+53866 32c4897b5d46c00eeecef1baec7dc21d0d1bb5c1 p3yk
+53867 3bac49258a4a580f8d9950594f58cf7f195eee89 p3yk-noslice
+53872 0ea24f4f2467afc493d134f558aa470cbe8047e8 p3yk
+53873 bd1419e94773f08a0bed6114240fa3e239b19c47 p3yk
+53874 b05790d066b4744e52d3c72d929bdf187cc160f4 p3yk
+53875 583fe753e7212979101b4ee32e85e0d3d1531101 p3yk
+53892 b58a4374ac21e45b1a062f0e7ffc00d033d85b99 p3yk
+53897 42e79c59212d22d252a04f855b7f79b32b140369 p3yk
+53898 93047ee486da4a09f4dda2d3c6a3d3d52152a45a p3yk
+53899 2e4dac059cc54b3a40e237cdca598e387a573433 legacy-trunk
+53900 65cd1f280e63c0b66e0e687a005768f9aaf8ebbd legacy-trunk
+53901 882b9c14895c0cce5e8e3801c9f3c9feaa5034c1 legacy-trunk
+53902 191c48ca8bf9c1268195428b8678eb862f353c91 legacy-trunk
+53906 e854271495de1044caf6daaa0959f257313d7ab7 p3yk
+53907 83088ad83a6b0f2da832acbad5d61fa2a8744309 release25-maint
+53910 0c410c78531cf30233aa8175974cfe16efd59337 legacy-trunk
+53911 d01bd37bf5ce526180d0aa31ca392f736978b47d legacy-trunk
+53912 f2f0b41f270dae4c698f2cafa8e4530f1f39899e p3yk
+53913 eaaee785eb86d78f242cf43ce1804fa6d5687b07 p3yk
+53914 97c77b1e34bf243122543e2e41af85c0ce7207a6 p3yk
+53915 a8c3aaab00ea2324a6f01806786d71e78e02616b p3yk
+53916 19afb0302a06eb1e6abc755f24f53de22a7c74de twouters-dictviews-backport
+53919 d842e35f5a310e546ee56a05bd10561e5dbcb70d legacy-trunk
+53920 070b9a0b4c040407f37be29e4c3993fa5b36aaa9 release25-maint
+53921 13f3931b9fc4692942e3ece62dd0fb9b69067097 release24-maint
+53922 f5790f96acf3c39ddcc7d1fc17aeea2ce78961f8 p3yk
+53926 5bd3a22ba496b1c4092c2d42a4050ddf4b14b547 p3yk
+53928 1b972b7e352adf310529151270ed19a9891c95d5 p3yk
+53929 40b17afc4aa7bf71b504c948766ffe40b8289768 p3yk
+53930 0d2dc3611e3b3826ffd931565409e1c18bdeb00b p3yk
+53931 610c7acc99828e62e1fd37fb0f67b86e4512a93f p3yk
+53932 be41da66ce37f641f5b656dfa9e9f52b69b5f5c1 p3yk
+53933 25a84900e2055c14c7660e4ce635b5648745ff11 p3yk
+53934 03883acb650b808c69df461927fdacd350d17dce p3yk
+53935 621443fc01bba1559d08bcbbb4fc562c263bb759 legacy-trunk
+53936 9d1b0c295ebbc0fc178c62c41e9f61b130d35c48 release25-maint
+53937 93f58280373304de219c8a05c66fe3910b4b9886 p3yk
+53938 7bc7f740f69fdc9f92fd5488207a0f3b303fa149 p3yk
+53939 c3451a77bfd164df5dfcd8370d50987d8993fd02 p3yk
+53942 90c807ee8767b1bb65081b6bacbbd264917d56ab p3yk
+53943 ece8a39fa282edc62e14fb769cb1383b6fd748fd legacy-trunk
+53945 55d7e8fa5ea8d4fa8e7170730df556abd7d1d7a2 p3yk
+53946 a2629be1b1d0159927192a3cade515dde521869a p3yk
+53947 89ba93c701c8847396d82f965c675cad5ab5ed99 legacy-trunk
+53949 45affae465e41192918142feff746f204f51ffe3 legacy-trunk
+53951 0376f13a1af91307042dc4a5b2f587a3ed9bb2d3 legacy-trunk
+53952 6aa1be5dd0098b3571f35ba7239972824e27d1df p3yk
+53953 2c03d706835e460bbdc88811c540f9107834b002 twouters-dictviews-backport
+53954 047ee23c0f878e933ec284821abffd973a4d9413 legacy-trunk
+53955 c8c0673026599bcd640efaa9536d4d2936d699e0 legacy-trunk
+53956 1853cf06e36ba312abd123e8c2d169898b477d28 p3yk
+53957 2ca14d6a369b725b13d49b0ae377b33b253426db p3yk
+53958 8647190db96cd1aa8b43b264f31b58bd8bc042e3 twouters-dictviews-backport
+53959 fc23fc8639baf00de51b446517fee96a241d7102 twouters-dictviews-backport
+53960 4b9d0dac79ccc09bc1f7b46212c702f1400435c3 p3yk
+53961 c79e6234fb19ef6a34cea5a259cd0dd6bf6b34a0 p3yk
+53962 bb73d3a0457e977d848960bdeec2e7958cee6627 p3yk
+53963 7f7074d4f82cf70ca1d7098d3cd2386794f96f54 p3yk
+53964 d976c9a631114a8fab1b0f51133bb4ca12082d49 p3yk
+53965 b0826e8e45c78ef5488bf8a48b9cec8773619be8 p3yk
+53966 3093ea9b4024972819dc07742ec003dbc068abe5 p3yk
+53967 e759fd8d95ae7bccc46259e1e04d1a5afd84364b p3yk
+53968 1e4e292486b68889862a8047c8010964010bdb38 twouters-dictviews-backport
+53969 f3f0c697aa5b1632ed2e0c4af3dd90de23e338c9 legacy-trunk
+53970 ee3602c7ae041474a8c75dad04dcbd3dfda0509e legacy-trunk
+53971 430811bdbfef66bc9a85ec94ccb7ab69989aacde release25-maint
+53972 94c4e36c31242b89e0260150b12aeb2c1fd12125 p3yk
+53973 da73b5a0fd90aba32c4cb1d0934dd04a3d728d89 p3yk
+53974 2ce229a7ba3f69ec547e79dc40a5b2d57f58f406 release25-maint
+53975 c83acfb1a632f7946f346e722f70de791f3c2346 legacy-trunk
+53976 fedb03eac6ad6d11045048d2896b1e7eb0af742e legacy-trunk
+53977 aa195a1aa95528b885322dffabb4be30418a3711 twouters-dictviews-backport
+53978 e5e9837da70b78600a80a52e7726fc23924e71ff p3yk
+53979 0ea52558bdfec29af9cd9c98e0c05db2bd25a022 p3yk
+53981 541a8b1b5da75d9af549434704b1ab563b720772 legacy-trunk
+53982 e66ddb6e34e84467765a76de7cce3ceb3349d64c p3yk
+53983 416292c8249ce8c9080c54111fa7884705faec85 p3yk
+53984 c24e95d1175201b57470415abc3b0e2a0cb47aad p3yk
+53985 d5546f09f20e7638b758248e5d54f1b876e2aad2 p3yk
+53986 30e5cb3a55ac3147d9e92ea388f4f7945616e767 p3yk
+53987 140f3524027f0e0b5a70ce2ff1594f31ba246c8d p3yk
+53989 a9e6c73e0fa5b2132c1531c31aaef4cffe4d526b p3yk
+53990 2d9d10702ec44e2fe4cf8149c6c6f25a434edc22 p3yk
+53991 6c0d0be82b47baf29a5811841c58c882729abdef p3yk
+53992 11777c887f7ce00e4bd7ceaec61369ff8b97e455 p3yk
+53993 a2c9eb9ab609674b452f3dbb49991b2675c3616d legacy-trunk
+53994 0b47446cc4084a0380db967718e47f71de4358e3 legacy-trunk
+53995 46f771e267bc815828b6ed06e023cd5c3d4dcaa2 p3yk
+53996 3cabbfa43984093b13d7cc4b3df94898c511e75a legacy-trunk
+53997 d62805a993c50881982ff51ed016e41b69ac56dc legacy-trunk
+53998 5ead32130f646e8b2e6afce0d97b3235d76101ae legacy-trunk
+53999 4a4f6f026f1c58f499aaca8266ecf1172b2ce175 p3yk
+54000 61fee1853ca88f3820bf7a3c63fbf45a72561d2b p3yk
+54001 80e861e7fabe888586ecda27f68c499cc4f6ce38 p3yk
+54002 c3b28ba918f83ebff2e4ce811654da7d4b3f2317 p3yk
+54003 1f790da798409d91ce89cbd0b0d7efef4769a8b4 p3yk
+54004 431b3238593eacbac65a59f14ccb4d99eb81576f p3yk
+54008 762964f99871047bf0239194ca7254d1d32d46a5 p3yk
+54009 c034470e3c0aeb9164741372a570d9eb14c07742 p3yk
+54010 8beb75402e74bf5547d4ff497b7b8da00cf8d839 p3yk
+54011 93031e7165ab0129fbbd8a109f6beab034e8f4d5 p3yk_no_args_on_exc
+54012 ba92e9ade36f1178ad45647568338755b6b313c3 p3yk_no_args_on_exc
+54013 6d91e74fcf55e52086d8ae3ff4b2c18251092bb1 p3yk_no_args_on_exc
+54015 34a7c29e65d162af1a70850108eb74cc065db998 p3yk_no_args_on_exc
+54016 e103b937d747510e4ee3120eafa3cd4de8962313 legacy-trunk
+54017 a1aee810b739686060dff0dee271b2f934a0c4f0 p3yk_no_args_on_exc
+54018 9533eb0e87cffcbf52f2cc6f10c2bfebd34a874d p3yk_no_args_on_exc
+54019 f252468058507ec7d944d98436818305bbed0896 p3yk_no_args_on_exc
+54020 bd3590b8c78ee591e041ec5eb363cdce27230970 p3yk_no_args_on_exc
+54022 9dd86ead51c3776cd6a4aa1bc64b17baf01bd679 legacy-trunk
+54023 165461ad38db8e05e18152bafb905e90e07c15b0 p3yk_no_args_on_exc
+54024 83b8c70efd1e5f1bea58342726ac5c8db724f4bd p3yk_no_args_on_exc
+54025 9eb60a07285a47ed34726b87a3bb6e1e7f374102 p3yk_no_args_on_exc
+54026 a8c79b1e696ae7ed32b18545b3e325007b1be34f legacy-trunk
+54027 165bbed3379d6d3f45be1edf2ae12f584728610f p3yk_no_args_on_exc
+54028 2c6cd98db0b8f3e3e77c36c09d7f2269b637d78a p3yk_no_args_on_exc
+54029 b35cfd8b4910614d2bdd70013ee082bc9e5152fb p3yk_no_args_on_exc
+54030 ac0ebae4587222dca21dd1477eaf4c946a65793b p3yk_no_args_on_exc
+54031 4c56fcefb283b7f6ba45b4e5afe393cb3b039abb p3yk_no_args_on_exc
+54033 4087c0ec733bba54e8013727ed64f173b9a6175f legacy-trunk
+54034 01ddecb778154263834e9b00b1cda2ad64090e5e p3yk_no_args_on_exc
+54035 e476a5a78b2937e7672122f01ab66455db0a93cf p3yk
+54036 56d51f5948653da2a1e9979efc4b11e2f6dad1f8 p3yk_no_args_on_exc
+54037 7d7f322f2cb6787290bf673583f789315c72f459 p3yk_no_args_on_exc
+54038 e2208d4f5a7fc9b86b3556d53bcc87022694f1b0 p3yk_no_args_on_exc
+54039 7472f7b7d903446162b1a6b1ed3d2116ec845fce p3yk_no_args_on_exc
+54040 1dce2502567921b252c93004f3cd285ee5ce1e8b p3yk_no_args_on_exc
+54041 bdb52728b02ef4ab72d8970f48345c5fc73b9dfc p3yk_no_args_on_exc
+54042 4555961c5a2f96aa93e82b97a449b362dcf5948d p3yk_no_args_on_exc
+54043 e16268c273bb2664c6099eec502bfb5a4a5609eb p3yk
+54044 4ae0490e1a0c0f349f6781c0645e229d46b11c75 p3yk_no_args_on_exc
+54045 de2c9f9aea1ee76d59d3e0e52b7ef3bcf3aaa791 p3yk_no_args_on_exc
+54046 69ca657a64e7edbf05eb2c3490cdfa55d24a1877 p3yk_no_args_on_exc
+54047 4c1e2c33facd08ceeb670ec8c435c78b777cd1e3 p3yk_no_args_on_exc
+54048 0c14b66aca702b4d1f9feadfc3a6226705cb64f5 p3yk_no_args_on_exc
+54049 ee46217c87af7a873819aa3dcc733124f9659853 p3yk_no_args_on_exc
+54050 27a2186f45cb4b237163e6e75b28d94ae601d31e p3yk_no_args_on_exc
+54051 9185c70a1585e9a6fc0c2dfdef76581966ead903 p3yk_no_args_on_exc
+54052 d9b1534ec79fe75043c00819651a49527192c8c8 p3yk_no_args_on_exc
+54053 b46c6d27625e3e6c03969c36b649255d0247f286 legacy-trunk
+54054 52e4530773c9701a06c11e11577ede9bb1df260d legacy-trunk
+54060 be44bf2db350e4aa2c4256911f30216355eee10e release25-maint
+54061 88884e7bac6dc2a28fa88b08614ac7e606232423 legacy-trunk
+54062 52e95fb089017dab89f760c5c51a1adc9ce54586 p3yk_no_args_on_exc
+54065 32a4e5ee2d98c14579bd51f52e86aaa035c98236 p3yk_no_args_on_exc
+54080 1c58611c51d0ca6fa5982b5a1288cacfad073067 legacy-trunk
+54085 be68da561dcd67870f965b164c9b27b67c25fe1a release25-maint
+54086 4e3481961fbbc2ece165025cbcc089b216110edc legacy-trunk
+54088 68a487d21c069a75c33ec86c5fc6f3902d5777ab legacy-trunk
+54089 324a71a103ec2dfeccd3a5099e809ec22dde6d94 release25-maint
+54114 2f2b8935a81e262026ba1f52bf1de84d8ea606dd legacy-trunk
+54115 6def82b8cf20aa223ba7a5eaa99c4c899d4ec1d3 release25-maint
+54124 fe9a9d39a3517fef589243e79fae57e970168254 legacy-trunk
+54125 3b1efce358a36012730edc16b8dfbfd48701d10d legacy-trunk
+54136 372070ba6fd31f4e389a90ccb3cb062fd817c7f8 legacy-trunk
+54138 e1b000bed462f38bdd0f07cea175f53726cddad1 legacy-trunk
+54139 6d3454c371dd43ac9f31b4a336f1442d46dbf948 legacy-trunk
+54140 891c28d5356969b04925aaa6f45be61a8562ec6b release25-maint
+54149 081b4e8b6f5b82165c305e27d7db238cc1681c28 legacy-trunk
+54150 60585530f30b8bcda055a70a16e03d601c65167f legacy-trunk
+54151 e422802202be0a205e050b34298410932bb302ec release25-maint
+54152 f1e88c3502d9f1aaf80c45cfe9688fa6b8aba67a legacy-trunk
+54154 48254739159ffaebb682dfbcab18d304c15ee17d legacy-trunk
+54155 33b43debb97ee7677b6636ed5f10d6ad04e75056 release25-maint
+54156 5c196aa6ecf48db9cd9e35dc8fef2b038b4e8134 legacy-trunk
+54157 b6dcb77833857d99a946f5cc3fd7650dd4369719 release25-maint
+54158 1080de49c81e8df564c8a0478bf60491d7541230 release25-maint
+54159 5c08e6460dc554f88219eb14d5cc58d9da29b23f legacy-trunk
+54160 b0f26a7813c9096f49d64deb533d2d89d375961f legacy-trunk
+54161 f83e5822e6726be989067941e07b80f9d7b2d38d release25-maint
+54162 09d08fcb8f7b9d222849fc770c9ed7666d4f622f legacy-trunk
+54163 2ee366a2d2b891f7bfb79f6f3673ca0aab6ce5a9 release25-maint
+54164 4e835df2b4ba88cb9ad185c89c5af9a95b45119c legacy-trunk
+54165 963c0e442832114bafeb7b21b62220264d62e02c legacy-trunk
+54166 06992e6b205a449614e6d8f4b25ce834a8404cc0 legacy-trunk
+54167 3cfdb80bc68e874ce6ac382a458a6bb574e212b1 legacy-trunk
+54168 1ea19f74504cbc60a1249eec4c6363626dcd34c8 release25-maint
+54169 d4577215539ddd374190e9b561150fa754661003 legacy-trunk
+54170 a6a095bf64585d0142f485262b7363a307167f54 legacy-trunk
+54171 67cc0e95e8a578fb0a46ec2b63a65ff95c9faf59 legacy-trunk
+54172 41ed94be6d5caa0fb19b4fcbe5e0c2d531a148d1 release25-maint
+54173 6a599aee7ca40a12610280c2eb253f043d11a32d legacy-trunk
+54174 614bcd37c6f3a4efd2e54514490b38c1ef0924c2 release25-maint
+54175 6cd366e6beecc58fbe382fd381729c4367f67f54 legacy-trunk
+54176 e66cfc725e8db0e10e1b92d169ef2afb024418b3 release25-maint
+54177 6d8dcad12fd9bfb84c0e2e5ed956fbea23544c3c legacy-trunk
+54178 8280b7c4055760228d93b272a27787cdb00a938e release25-maint
+54179 efa0a761918c28c72f560207a8a9a2f6632dc7ca p3yk
+54180 3ac24c0110e96f8a51d24252127be29ca504d554 legacy-trunk
+54181 1c14b23b9c1bcf6971ebd04a8a70e86ee0bcadd1 release25-maint
+54182 757e93a4096c524ba9e388851b5e6e01a9fe0697 legacy-trunk
+54183 16c215e43bad0a3f41e2da0169b6d7bf27db3ba4 release25-maint
+54188 728c60e85efa594fcd3b01544a1924bd6847272d legacy-trunk
+54189 c8ed4aea6c58330d96a76495a0ee40ae0a721800 legacy-trunk
+54190 21233c2e5d093994074dc8ab78ff74a2fe35280f p3yk
+54192 f479b9c74b78199791d65770657650b53737024a legacy-trunk
+54194 129ffff2ce6dc45f35206ef13fe5a2e4d40f0dd0 p3yk
+54195 242de16a6d442c0d56759025f6c370612588daee legacy-trunk
+54196 1a0c907928b401343b6716562afc43f77c62ac28 release25-maint
+54197 850c32db27e6440656f28fa2341dc9e0d07cf330 legacy-trunk
+54198 e1962ab12fce9aba8945fa73e6f973ac4c3d9d9d release25-maint
+54199 7da23bf8949fc4a8eb88915bfbe2a10d664dc0c2 legacy-trunk
+54200 81e486b3007885c05719451e326aa1de13fed0c9 release25-maint
+54201 b092b2c83ab7e85967b33f76a35f5041345ddc54 legacy-trunk
+54202 5102336ca343544cd65cf25e35797f4fdaa2c05c legacy-trunk
+54203 423b364843cdc1cae0025cf889f0c82914aae9a7 release25-maint
+54204 98bbc93bd55ba0a649f4b7c06b81a7778bd31965 legacy-trunk
+54206 3b538acf7694e1318bcaf6419af4a1102c6139bc legacy-trunk
+54207 46cfabb7d54463e69e2da3fab6c7555ab11851c5 legacy-trunk
+54208 e42c63d7c230a880d7a67927dcd489f35417459a release25-maint
+54209 baabef6c00d68e276756ad8c28d504d6de4d9762 legacy-trunk
+54211 bfdbd3ec27d85a5ef434b4466fe4ad1385406ac3 release25-maint
+54213 4a0e228c36e57f7221347ebe3345ca4325c0675e p3yk
+54214 6e1cf4d28af34eb52d5c8b4b4c075c90dd78a8e0 p3yk
+54215 157260ef677cad4cd4ee610c94678ebb8fa4a1f6 p3yk
+54216 63af37c2d0c0ed289ba85ebf20eb68fe3b900a06 p3yk
+54219 918edabaaa84e625b8399058639e0cdd59401d5b legacy-trunk
+54220 c1a97b08213a9db534cf4912eb02b8d36f8ddc55 legacy-trunk
+54221 32af9588a182ef448c0989548df7152a65930e48 release25-maint
+54222 8aa7cb51d3584f8f93b2f9cb148b36adaa5b9d5a legacy-trunk
+54223 2f5d84dcb6557dad35fd7a9a29d507cd137f81ec release25-maint
+54224 d948a2c0fcfddd951208f0c0564381094acb8c66 release25-maint
+54225 55659e64277be6cd40644906d0a8ae4aa902d9bd legacy-trunk
+54226 9b56ead3532cd78e9c662e19ae14978e0dea4058 p3yk
+54227 0bb969f15118a3880ec1be79bc3280b0074660da legacy-trunk
+54228 83400df97379ae2f555738ece0b9ec417663ff1f release25-maint
+54229 a7c8a4d1b9407d29b0580c8490068545efd9d23c release25-maint
+54230 f2ba812f7200760b65bff75b31db003d74b5c8d1 legacy-trunk
+54231 3be2175bbb00074d243c84bf9c9dcf56f69a9b17 p3yk
+54232 ff0c46fb195a356a92f2d2dc6449c321eb70e0c8 legacy-trunk
+54233 be1e2f745669dc095c7554c536ebb7fc114e3a46 legacy-trunk
+54234 9cfc9cba6768b16fd6d52f939a930444c235dc73 legacy-trunk
+54235 1a0f6a12874c2aac33f70645c3d906fdc23bd995 legacy-trunk
+54236 e8310855fcc7a6744d81500057c9725db7fbd161 release25-maint
+54237 f75457d7532ce0ce7b7d57d4703d9ac34571f97c legacy-trunk
+54238 7f6d5390a11ab2dd75a2f836b7ad569a3ca5f0ab release25-maint
+54239 7446ad6cb58bdcbfce818931da0bafc6dcd3b55b legacy-trunk
+54240 09bfc0cdff9fee3be488dbe1b204c90db477c1dd legacy-trunk
+54243 287779843c5d3994a21e5d32b0e3f8fada5e6658 legacy-trunk
+54244 3717b1481d1b957379ab21b0ffbd69209c961541 legacy-trunk
+54245 1fee9f42b1fadd97514a75914d41a024e276c42d legacy-trunk
+54246 b1326aa04b2c3da24568a7f86f8a5da52936f145 release25-maint
+54247 47ac1bfea3047c6ce80bf157924304f15a70b5f8 legacy-trunk
+54248 fedd6ccc5e5b4f8647cb8a42ba050546b53ec582 legacy-trunk
+54249 4aa9187b5159ccde35864104e5f6b3506ccb3185 release25-maint
+54250 1af38af314f27273f849266d22323508e53ab267 legacy-trunk
+54252 be0d49134e4fa2e85f6f06c3fd1572c95ebc1639 legacy-trunk
+54253 1bbd688a6de16f57c99d64838a2e5a9f34326e82 legacy-trunk
+54254 00237f514f06292a04b2179775aba1ea2dfcf6bd legacy-trunk
+54255 01c8f3e3332caa18b92f950f5b875d8fff516090 release25-maint
+54256 71809c089a26395e9e7010de17b758cd673a3b0c legacy-trunk
+54257 d3a35fe13838a21967a76357dfafe77750286c1d legacy-trunk
+54258 5978e07291fe7680d5e008eb8cad9be833bf3b5e release25-maint
+54260 a3f311304ea632ebb1219c54b8f56ad628014bb0 legacy-trunk
+54261 2b51b04b25454ca122830298e02d06f2f4ea18c4 release25-maint
+54262 101a1ab573db4eb247515197cceb14cffa20d820 legacy-trunk
+54265 cf452027073e28cce365bc6596162ced8e74e80e p3yk
+54268 f118aadc11205c754cd6af222f996961bd014ad7 legacy-trunk
+54269 c9b40b0aa303201d75fa8ae00fa4495de95a7346 release25-maint
+54270 a8ae2c29c66ae2d60dda60000d749556f900580a legacy-trunk
+54271 5ab7dc8e731a97aae281c8491b1812b5ef1bf7bc legacy-trunk
+54272 d4ea068c38204d80d15d2c9bc71789aedbd7efcd release25-maint
+54273 d7044465b743bf515a07c46d3c33e60e34168277 release25-maint
+54274 60a35c07d32df341a4eb89f7799295e1fb6aff53 legacy-trunk
+54275 5b6e1c008ca323dc7146af23f4783e7334725d61 release25-maint
+54278 9a0ccdbbc568dce82b0935ae106fe0c1c5e4b2fb legacy-trunk
+54279 72c5b55caa1db2e373d40429a4c9c8576e55e2c1 release25-maint
+54280 d850bf56fdf6ca2fdd84f0f33edcaa448385a35e legacy-trunk
+54281 dce940d9a8e9cdf0d6558d3382de5e6ac516b922 release25-maint
+54282 47ede65e2efd8ffeb1098ce38abaf94c3bd710aa legacy-trunk
+54283 adf612f706e4e9064bbde8e02ec12c792191b82d legacy-trunk
+54284 a7daa0218cf0c063a5ee3d0c0967d50b044ee45b release25-maint
+54285 3ee95fde7cfae4049423ad12346a76db85c1a92f legacy-trunk
+54286 211201e6b045ed2c5115e0021359cbfdc2158f90 p3yk
+54287 717bc2a4eee77b6f2df00d2fedc98fbacd0ae5d2 legacy-trunk
+54288 a87bcc37bf0fea77ad299ca617a9e5a0b95743c9 legacy-trunk
+54290 7100c59182ff316df877a44be51d563fee94ade7 legacy-trunk
+54291 45ce388ec59a5d23be0b38a002b4c11232f817cc legacy-trunk
+54292 2cb5fb7cd357e4b812e291c652f576a72a42d0ba legacy-trunk
+54293 5be3d21773405df67b7b871611d684d25ba4f728 release25-maint
+54294 66f265ac4ec4f90b5eb2680bb4ffa700d342b554 release25-maint
+54295 1e12bed7a2fe5a46b2736cf588c8c75ce8b7a5d7 legacy-trunk
+54296 01355124ce40515bc181c2de13b2a27bbec5bd37 legacy-trunk
+54297 91a80e52d863ed5b2ace52e555a6e27e6e70d7c7 legacy-trunk
+54315 91bd738a42067a13ac3ca53e227396cb581b6c61 legacy-trunk
+54316 84478deb4ad96a9acde98e7d08a5b1d59cf0f0b3 legacy-trunk
+54318 479dcbd79b57f15ef8a2e61a4fcec3b0017f589c legacy-trunk
+54319 f9a26aa3d09c44c26d952ba76140b6b76c6728ba legacy-trunk
+54321 9db3e325dd88d4b1774abf6344c31c35a6bf7a1d legacy-trunk
+54322 7286d832ad2727145af443905b92046875c0ca2b legacy-trunk
+54323 e2ceede20d8c29424c886d6520506cd7b001ea94 legacy-trunk
+54324 16d7dcd7a69c42f75d7f3188f40c7c26680ac9c0 release25-maint
+54325 bed57dff3db86e68f0fc9447e86491ea595b2118 legacy-trunk
+54326 7a331c7f9404fcd001ac381f69b8528c518b46e9 legacy-trunk
+54327 bbaf6c9356636fa537ade052486b6ffc9ddc5a99 legacy-trunk
+54328 8fa4e980b5899fb9bd2153a8efa339a52018ca19 legacy-trunk
+54329 b89437e3bc8ebd7d6b7e8a2a37c5c02b833b3174 legacy-trunk
+54330 ade8d1c810093e5844f68526b52489aae5511b19 release25-maint
+54331 b13e6128efa72a4e2667e0ce2897cba26c2099ac legacy-trunk
+54332 b6c103845054f188d2ab5191b1ffe931bff98a8a release25-maint
+54333 c6f415290f806cb055ff6a9b6bb59285338a5712 legacy-trunk
+54334 7d30d62a901aa81f12409cfd6cac9973aeba6dd4 release25-maint
+54335 5a3a1b02418afd0cb9f3a14cc653329e21f54237 legacy-trunk
+54336 a4e0c79015d82fe2985a9df782c5aa58e7ffb95c legacy-trunk
+54337 81e5c5d199887c95b02570c4e06511f9dc6d6f2c release25-maint
+54338 a3419c6c0cfedf6afb17486dd0d6036bd024b235 legacy-trunk
+54339 53ee2795287b44c6c96addd95a531928080b9e87 legacy-trunk
+54341 1d80d84c77924975bcb393ed2ddd0c63cc82950e legacy-trunk
+54342 b90d8b2e5ed07174c48ef6ac84a98b317def39be release23-maint
+54343 0c122fe827d78a46e222f470eb84a5ef4dd00e8b legacy-trunk
+54344 7b36a64dcb08d02662227b233d9ee47cd4ec80d0 legacy-trunk
+54345 ac71db9fadc86b9ae169fe69d20a057eec61511d legacy-trunk
+54346 28b0403f8c92b71dc3c43470c318e58d00b88ab1 legacy-trunk
+54347 93e67d362a81a29a979f666894445068dadd1c22 legacy-trunk
+54348 d96ebb20d3e1f6105c935c81d924ecd294657491 legacy-trunk
+54352 4a79dd15ba59f65e391844af2d988ea616254730 legacy-trunk
+54357 493cae705f9188c3bb709c7775fd963fe1eb4c98 legacy-trunk
+54358 78686c7a23a7d503e8226c49ba675ffc5039815c legacy-trunk
+54359 922b7708a80afe2096d8089d4cab519c20bb0065 legacy-trunk
+54360 226d9fcf9d59cda477e290d01bd1b1edb3db506c legacy-trunk
+54361 dba5a33a0e799528140229b53ccd64c0e61fcce4 legacy-trunk
+54362 209d688f3ca5eec2e18611a1e7521caa9cb78d9b legacy-trunk
+54363 eafbfa8a2b300c3aba91d5e6a452e3c177e07743 legacy-trunk
+54364 f1f186460250a2f5308ee46400d0611358ac831f legacy-trunk
+54365 ca338d563a7ad16ff8cd1c9be830a00feeb25431 legacy-trunk
+54366 d311013a1638a94cb36ca116056c13036e8a7bd7 release25-maint
+54367 5a1a0aa9a4bbae1976a47cb0158f30e161a15e6a legacy-trunk
+54368 894691ca48353f0c41b8a5bea114132d4ef8d016 legacy-trunk
+54369 1dcdbc25dea7c6598ecfb43d47a9147a387e8564 release25-maint
+54370 52a69a064637a599537e4d352ac09a087724fd4c release25-maint
+54371 de1d05c55b6fdf3cea225ee785194bd883d0377b legacy-trunk
+54372 ff9d81e76a76f7d57e62e9d2dba534a09d7d31ba legacy-trunk
+54373 bc2a5a54b5caf3f4e1f0f6daa63e061843295e23 legacy-trunk
+54374 b500761b4b626dc1fb90c308e08f97aaa586422a release25-maint
+54375 56b2b933baae2c45dfe526fe11c60c537fb87c22 release25-maint
+54376 c301b5bcdfdc510dfb9a8b35452c88020a5fe609 legacy-trunk
+54377 90e57e2c7a0333eb78ddc2c53644b5a78148d65d release25-maint
+54378 2900ec04031d94c3af8d6a88993dfbe62c190a38 legacy-trunk
+54379 fc5e045ceae438d23890d3f6569de260b560ab84 release25-maint
+54383 514aeff63c9ffb551100997db4bba6ef3d0af78b release25-maint
+54386 6280552c129723e37d7b388b4b582661a18bef3c legacy-trunk
+54387 9943aea4f2d1df22c7a60ce33c9ab9dcda5364ff release25-maint
+54389 bbce2d8ff73d54e0f97790a26ce38aae4da44248 legacy-trunk
+54390 4eb4cfb6254ebb7b8f3f0ac249bd13f7a5dd64e8 legacy-trunk
+54391 d155ae63672848eaa16be06dc57013a526c6b7dc legacy-trunk
+54392 0a6c5135d2def498e82958711348c08cebe4179f legacy-trunk
+54393 fc527eb98dce6855ca9397f6814d31053c2f64cd release25-maint
+54394 376b4235dd444481b7864f35d866a2fb6363da5d legacy-trunk
+54395 4acb45c297ed1fb6b8e29d536a0a3509a71cf36c release25-maint
+54396 8d97dee6df6444416e3cc56f446fa0e2bf5a1cfc release25-maint
+54397 4217f3850f0b8a5b6e7360059c60f7e36e46256b legacy-trunk
+54398 52c339c0cb38bc69d6783e5daee6a4968f701b08 release25-maint
+54400 a377f942ee0adc18985f94b9e4ec7b3e36f820a8 p3yk
+54401 a312c276a5e79bcfb370b74999983223bdb37021 p3yk
+54404 b43a52f71696a0653b29526799bc7aa7c0c6def0 legacy-trunk
+54405 d835809f45ec44914f4bcd10819ff6edbc716856 release25-maint
+54406 01951f6b819d13eab23b67e5aa14634d6cf80e34 legacy-trunk
+54407 94205986ad5308a943df1783a62103a7ca7353f4 legacy-trunk
+54408 2690de4beaa13da4acd96f10cf1227716aa94b24 legacy-trunk
+54409 645070b839426bf1f93bc758820b524fd7fd89fb legacy-trunk
+54410 a6979ac9533fae669876ac2ad9d145e10738a14e release25-maint
+54412 c57cd546612dd83e87dec317ac4680996b659a7c legacy-trunk
+54413 06cd60b0bd164c73e22a5d493529e75f47dee698 legacy-trunk
+54414 d1ba8134528e28c0bab3c4e493635f3fb0242231 legacy-trunk
+54415 72da48d96257fc30b032a2b4f5f9145bc211d580 legacy-trunk
+54417 8bb570ae4c45c72e8ec22f99c688e7876eee6463 legacy-trunk
+54418 7549c4b3aa36a01d38ed055fffeec513bf0c7e9a legacy-trunk
+54419 f3d4274d063d30bcc8096020451337d52c818ef0 legacy-trunk
+54421 ebe52dbc3553f7ee6089dc3ccea81a59eb7df259 legacy-trunk
+54422 91268678d57f96d5100c2641515dbe9e7bd6be44 release25-maint
+54423 1373a83083bb213a9fcc36ba1818c0166efc8e06 legacy-trunk
+54424 a2ae24ffa60a903558518cb0ed2441ebd29dcc91 p3yk
+54425 3c73a8a208395fc8f89a51a09f9728cca6d8378d p3yk
+54426 e3ba60de3d842e1d74c2104b2763e66836996f06 legacy-trunk
+54427 343be396bbd7c6129c4612f597e6c268edef15d7 release25-maint
+54428 19f7ff443718f7a9da1aea9edbf00a135f860883 p3yk
+54430 5e24f636ac7576e8b35fdd8d8793bb154a1ed083 p3yk
+54432 071016c729392e553ca3c9f89d248b9380021eb0 legacy-trunk
+54433 1f843890a4e61b4715d2c3a14a5ec2b15ddc01e4 p3yk
+54434 b1a18c7ed5ca679aea88f07451318ec7d66abc58 p3yk
+54435 16fe936f89b19a55112340ec5d4a88d077b78e80 p3yk
+54437 8d799a99cf68f4d68e73a63fd15b9a161c18a184 p3yk
+54438 037fe6a444d2fe98274ebaacee4c71d9059afd7d p3yk
+54439 8d06c1121b331a53f2926030f40060f9e7928531 legacy-trunk
+54440 6c8c33a43a1555b81ecec9110f5edf0d249590bb p3yk
+54441 9f07d410c555469674259e26a78e4521db5507ac legacy-trunk
+54451 c7c2754ff2d6ddb9a90f182770e7a3b9b22efaea p3yk
+54452 f9973a6e1afe01e0fb3bc97d7a40fa01f7d179ef p3yk
+54456 8d2978142593389fea46769a98ccb57960dbf79a legacy-trunk
+54457 236af2161eb678ad44de41bd1c59f39cc0bc9a59 legacy-trunk
+54458 6018194afbbde13e1fa3d24888d7c0478181af69 legacy-trunk
+54459 c997e907c4c67060d8381a76a911535dcee57dba legacy-trunk
+54460 307e5d4164f3a3bb12150b707baf198c6fd622c0 legacy-trunk
+54461 5a771b4a8b78cc43d75620f597d22b7a6792c492 legacy-trunk
+54462 45669c414db4556755246e9710bbec5554f7333d legacy-trunk
+54463 b8b17a2face5aaf3cd7f7390cb7c38bebfdfaf9c legacy-trunk
+54464 b43a2da832a70d7a89c2fb9caa6316cf46f5d072 release25-maint
+54465 ec6fb091039b453c0c0e921fea46ec7f1f10bdcd legacy-trunk
+54466 50a6b33c9d2c5c07131a09c1f8757ca666e9b123 release25-maint
+54468 9d0c054117348314009e5898154021e8494e83ba legacy-trunk
+54469 7f29be1cefba125634081c310bde2a083974e56a p3yk
+54470 e12c504e466b5b6e9f2c860bc70720bbe3bb76ef p3yk
+54472 f29f1a8b78692d1cff1936e0a042020a685538bc p3yk
+54478 8812718669e19792213cea6868f334c44e037ba9 p3yk
+54479 b752a1e0944b43608eb380194ed6fc6486c06e5b legacy-trunk
+54480 9cf22c5eee3d7fa0001022380af7f39cca01863b legacy-trunk
+54481 08d16183a9c150522ae6ae7c0f16a5bcf6547fb8 release25-maint
+54482 1dc4c4ce2db9ff020f2b920399f46878c8ab1204 legacy-trunk
+54483 d16abe5c92debf55516e90ae4f593caf58a0c97f legacy-trunk
+54484 852c9896fe923651aae8fd560047f7fbc10a3603 release25-maint
+54485 459e36b2ea451fcde220fc0fa263b6d5fc85ed61 legacy-trunk
+54486 5b711632cae132ab8fdc3d5e5b52be4bdfa97777 release25-maint
+54487 cb6eb132accf266894f0b1df2abd8e7ceba62cd1 legacy-trunk
+54488 7393c710d4bbbedd9a207e2e692e19427410e4cd release25-maint
+54489 e55bfb1ac1e7ccadea0636ad892976c1d4614cdb legacy-trunk
+54490 5bd9663620bc978a127972a7ce7abc6f1647bbdb legacy-trunk
+54491 b1e8bfdfe4b795a02dee6c785d14d94014fc9ec0 legacy-trunk
+54492 ccc447a6d91648f71162115f45d0ad7799adecb1 legacy-trunk
+54493 d25f7757486631e844b1a4f50e972e014a9b39a0 p3yk
+54495 15a7e0b7e4256b5c90f8c2258aded69fcda57013 legacy-trunk
+54496 f889f65a4861beb5fc01917cc2d5aa95653d54a0 release25-maint
+54497 408dfc7e30184c215a06384a1d59f81c63c4b435 release25-maint
+54502 d428e21d6eaf58064ef4caaf723d6f75c6796f1f p3yk
+54510 bfc4e804610238b8b00c392e3dacb2736313f2b3 p3yk
+54524 acf9a55c885d7912769e69cc682d92312ba8ed2b legacy-trunk
+54525 52e2fcd53ad339663eebdaffcb139bb5803f184c release25-maint
+54532 1757f80b5fdbae479ddf6043b70993975b6bf523 release25-maint
+54533 afb1c6cb2c88422914e68afa01bd0e85ccd9f94f legacy-trunk
+54537 fe1842b48b66ffec8a698648faae72fa1020f40a release25-maint
+54538 42eb5bb7766157af350ba58023a8c4dfe8f26d87 legacy-trunk
+54539 8debce2c4fb1b4e87294b5c6a365924e668ee369 legacy-trunk
+54540 51fbf2a75548b1a6400878076a075fc0154e41e8 legacy-trunk
+54541 8f1c9e8efbbbfd19f8f29bd1d553ddc6b39f4388 legacy-trunk
+54542 d8748673fd9f9a5eaa6b7e791ebc610e5b5b79a1 release25-maint
+54543 02574f485b15c3ebd9fc1d62b0e999bc6f59fbff legacy-trunk
+54544 0ea5595d75dad8a3a3351a120cc95f128e097513 release25-maint
+54545 12c70558074e7cd0eb329735e41b15e72f5d085f legacy-trunk
+54546 a73aa0b821ca5884cb3f0625e248efd2cb8caa39 legacy-trunk
+54547 3b56e7e894702e0ec0dc025e25a54179ce93ee2c legacy-trunk
+54553 74d29b635416b89abc50cacbd0a502ab73a0372a legacy-trunk
+54554 3ff6d3fa81229b90e62b39fdc618c21289a0ecf1 release25-maint
+54555 18995bd8bc8b3aa6b958c8eb3da819ce2661f3bf legacy-trunk
+54556 1c3e0d2c36dc97623f9a8cc1f53fce7ccce06894 legacy-trunk
+54557 ef70cd4dba50b6574ad1a5b711de155ec4a55972 p3yk
+54559 38a3da026d5e5743de67a5ed8b3592343dc05055 legacy-trunk
+54560 e938e9ef434b82e61f8b85ce03223d270ab90484 release25-maint
+54565 32f72e57618cc15b2ef612cd48b86c1f633f288b legacy-trunk
+54566 8fc6396f076a5ecbb21a53c58f9c89576da3fbd3 legacy-trunk
+54567 650ee179f3cec20a7bae6dff2244a38a3a5a231b legacy-trunk
+54568 8258f25d43d79649034e5f36f5d71babdc1390fd legacy-trunk
+54570 3c0913b65e8d6d55e7d614f9d8d399cd96add6ac legacy-trunk
+54572 eb25c8e2b4a1ebe246a2e64abf623b294f2f112c legacy-trunk
+54573 a07f98cffbdfef95136265e1d64edeadb8da9dd9 legacy-trunk
+54580 2be133013b71cab283ef4093d77cad54e881f372 legacy-trunk
+54581 8be744d5c5673892355bccd0f4d846e4fa20fd40 legacy-trunk
+54582 03d5db8325f411a6b783a0a6d99b3de76e2324cb legacy-trunk
+54583 a31b0b18cac62d8fe3735f45c217c074bcaeafab p3yk
+54585 65326a3815f760ae88741999e470a82fd2ffbd34 legacy-trunk
+54586 e4893ee9a88579640056f40214c01aba1ec6f07d legacy-trunk
+54587 5095afee080f1009a5829c8ad7407e73adc26688 p3yk
+54588 834da52eb2a4ebe6f80e059d113acf1b048d328a p3yk
+54592 45a2761c9b16ce3b3e47b3e8d9bf8e92d0a2f29e p3yk
+54594 d144f81574c085de15b8291c0b00bf5bccdab722 legacy-trunk
+54595 d416d97171815ba628e457115aa243d1fd6bb855 amk-mailbox
+54596 3e6d03217a02b0599f67e3a3968c4d4cf4381cb9 amk-mailbox
+54597 46ad2193968efa7a28fcc58d06fc73600433dd87 amk-mailbox
+54598 730545f24086dd981937658f1cd1700f72ea081d amk-mailbox
+54599 2d29665679e674660346524536a3b4ed2051cb3d legacy-trunk
+54600 efdce8d8db990028a412dc7718e84530abf118ab p3yk
+54601 f9dfbb5d35c2f32e620f4d428a7a1cf5ca680c82 p3yk
+54602 b897b77a004f7a58d86720e92523219aef03f453 p3yk
+54603 39e4386d71f6525ab654078373a4567fa2980edf legacy-trunk
+54604 f57e8e325475ec506638b046530e935495ddccdf legacy-trunk
+54605 5a8ca9dd89db347cfe287fe5d93e06f6f721a36e legacy-trunk
+54606 e3349d412681ee6f0f4182b1efecd05bcd972eed legacy-trunk
+54607 fa2181bd27049bd8fa3c9124244f9dbc8c6bec55 release25-maint
+54608 3fd8f06577fff9a510720a98ce2c276065a02331 legacy-trunk
+54609 519e72d630d20873896e6e4d67a1a87170f5095f p3yk
+54610 88c2ac590441c2e53cc606794cf48127042f390d p3yk
+54613 ccdc5b3b9b117ac9dab4eda089df4da3a76cc12c legacy-trunk
+54614 378b2f47e808f71311a06ae14dfcdb4d68f691ca legacy-trunk
+54615 6f9e693d76a184848a4fc2d968442ebe485afaaf legacy-trunk
+54617 8e3c7a5acbcdf00147f23ba20b324ea61b795730 legacy-trunk
+54618 83e1b06117146c6df87b1a0a11f3a8431a9a553c legacy-trunk
+54619 4e60e3a60f504cb3c1bd38b61d08bf50157da71b legacy-trunk
+54620 a5075a5273df78d4b1978447281f2eace40c5d62 legacy-trunk
+54621 cdb25798cf0ba05a4dd5ba8ef209c7fb24ba92c4 amk-mailbox
+54622 58427e1e51bdc60689fd48d7a81b93c8b5debac1 release25-maint
+54623 dc6e9f79cc4afbfc6804a6cc08d8ed79620061be legacy-trunk
+54624 5026323d992883346358991547defba666429da3 legacy-trunk
+54625 55ecc3a4568663872a79537a6fb5d9d77c3ad215 legacy-trunk
+54629 c1f67e1eee58b6193127906153e8fc99f1243ee8 legacy-trunk
+54630 38a861181fdd58c35d9e38431f940a9dc07d23bf legacy-trunk
+54631 41db3f30a3f9f0d1c11c610d2f1aa58c7b4165ec legacy-trunk
+54632 db9eadc0782642361bf463783a96697c5cd05f0f legacy-trunk
+54633 f86557e503f3a7d13eafcadf00663c1f1558c4eb legacy-trunk
+54634 93478744103879a85b431b2393245a66290a6732 legacy-trunk
+54635 c2bf3d646effa2b32900f533a9d79c438adb68a1 release25-maint
+54636 2ce8e80539cf79163bdaa0655a4d5e0dbcb49458 release25-maint
+54637 fc7fbcf2ae5177afdf257cda63ad42822a8ef8d1 legacy-trunk
+54641 f219bb7e74c92172a8a9b340be5e567d1ffe2895 release25-maint
+54644 7dee7f7d29f08c9e8037ba30e270f4be4edb48a2 legacy-trunk
+54645 221194249fa86e3c5d1316b1b6983ee4d34f4a24 release25-maint
+54646 b5b750cf85c20956e6be6fc7253b8a2072ff6f29 legacy-trunk
+54647 696a666dfe614169e657bf48025ea29e98c88021 legacy-trunk
+54649 ea6f2c5d27492f2c55b5977308251a1966bc4af3 legacy-trunk
+54650 e95d2bcfeb4631e632a03f440509decefafe3acc legacy-trunk
+54651 acdb4f3c3d6322a3a97b9010a2d3c575998480c8 legacy-trunk
+54652 1a5da078c435f2f7558005bd03fe2c379822cb86 legacy-trunk
+54653 90c4c3f042056afbedbe4460a9dc90e42c9cfd76 legacy-trunk
+54654 35bdc61ac8eade9f2bf04eb94925362e7a712c01 legacy-trunk
+54655 47d05f1aebddfbdc2e00dc85e52ccd52a701f3b1 legacy-trunk
+54657 81e58f0101db7a1214e91055072f8ac2fd104bf1 release25-maint
+54658 f764a7552162efc30938b7ed88e51acdc31bca7a legacy-trunk
+54660 12ff20948a0225737c524dda7225fac371b35781 amk-mailbox
+54661 6760f38e9ed6761bdf68aa9100488dc0eca96132 amk-mailbox
+54662 6a3dd1c4a7df01415541ad93bca96f73ac26c30e release25-maint
+54663 4a03860ae08b5707def8c168f71ef9aea6961d42 legacy-trunk
+54664 ef5d3e53938472205ceefe40abbc1c404ac35bb7 legacy-trunk
+54665 99bf145558d35b2559c8e772e71b327519114c01 release25-maint
+54666 48d8d5d317aee3aa2cc6648ecde61d40695a7143 legacy-trunk
+54667 343eef3427773be0902320f3db91356eb51f25e8 release25-maint
+54668 e685bfa6b4eab875024d42175bd54083f90a66d1 legacy-trunk
+54669 f71feec7d54789f94a3ee99df9e379fd546f5558 legacy-trunk
+54670 890bb9000ce55533fa6f55733fb60aae2a810b0b release25-maint
+54671 22a167c4678c2a85ef7ba6dd9848c478a7ec3d03 legacy-trunk
+54672 85112dd500595ee233df5336ca6219bba4691d62 legacy-trunk
+54673 cfac64a02a3d83e163444a1dcce27363a09e46ea legacy-trunk
+54674 c7381804447bc3d414b0f933c40a4e46379874c4 legacy-trunk
+54675 ac255a42ec0e1a91432fadc1a9cdd7fd359316cc legacy-trunk
+54676 d41d1ba209c942ae071a6752b3b411c20b830a44 legacy-trunk
+54677 cb6cce4d4232bf428d240dcc5ede7ed1801475ff legacy-trunk
+54678 e1ab25fd5bad81455f4c94c84be13443d46bb7ad legacy-trunk
+54681 dd7c69bd0c52a135b31367435a7392f189c42312 legacy-trunk
+54682 e7f78a37ae50b0b9f291338b1e8c9156ac78e012 legacy-trunk
+54683 b7e378e9d02d55c3e8db2cdf9dbc836aa2bb512b legacy-trunk
+54684 586a7e877500e20eddc26e5a7fd5cf9503dac404 legacy-trunk
+54685 d8cd88f930980de0f86ecb0534a4c02ab9240bd8 legacy-trunk
+54686 b001b65478fabe983610804ad899392517ffff29 release25-maint
+54687 43250018285c2bb2199182cc14a10c6ac8c28cc5 legacy-trunk
+54688 712a15efcf19b736912d3eaf00ea3be64afedc08 legacy-trunk
+54689 512f56afa4a0513e70d406050ca8723bb5c801b6 legacy-trunk
+54690 4c7ebc397d947c7126d76bdba20d7ea3c44f233d release25-maint
+54691 812027f1eea535a3a3191d7e0ecd9afaf27f38c3 release25-maint
+54692 28aec1358f594e14bf7be6d86b0dab52515fc2d6 release25-maint
+54693 4777c4007b5b194423953d41b1e5e6adaaba6c5d release25-maint
+54694 8170d44dd90488de0278e511c037db31b29dc5a6 release25-maint
+54695 80ff75fa2754eb0f8b45c0472e4bf117d61c1c45 legacy-trunk
+54697 9a50e2b6b685747f8f905754c927c1b85b6f9a42 legacy-trunk
+54698 ea6fbf404c34d9631b83074ca416ceead7ba8efa legacy-trunk
+54699 581d127e822b71946e164ec87b1a156691bd35ea legacy-trunk
+54701 9120281241b82cec101eadca5a69b4c47151c576 p3yk
+54702 bad5f832809fc2941913e40fc18d9b02ea00c0ea p3yk
+54703 58d49cae887f2f9a3dfbd761241918dfa51c7d65 p3yk
+54704 3b1396b012393820290fc30508e13e148f49ae16 legacy-trunk
+54705 234869dd2784ed0f6ffbbacb2a5099ae328f95bf legacy-trunk
+54706 9408dcd3ce88fdf02f1bf874417a71b23c976f65 legacy-trunk
+54707 c7b830c86f42bbd381cff62f192c85442700f8b5 legacy-trunk
+54708 020fd6de6525da34c06b01e2ecf17190f2f856fd p3yk
+54709 c5660055b425ddbaad6fa4b7948ed170ec062cf6 p3yk
+54710 d8b14994d870b68e4d0b759df1236c8f83b5caf6 p3yk
+54711 80f5ee21e545587dd50bef3cef0b328584dc3677 legacy-trunk
+54712 cc00bce6c59d37a3784930765e18618360f7312f legacy-trunk
+54714 b9124c0ef17a3218de473c46b78e66cddd98ebac p3yk
+54715 af511d24463693cf440d11c88639bbadfcd9f911 p3yk
+54717 e29fa4a1cbd931b3fea725340ec67782117d9a5d p3yk
+54718 a5707bf4f6d143392efb61c8c49809eac26a499d p3yk
+54719 339015d98b786422577aff4b55553d00e957dd97 p3yk
+54720 522b3f35d0eb7dbb637532da77f85e16bf5c0548 p3yk
+54726 4d50fad957682062f44975140df94b66be0ef9cc legacy-trunk
+54727 6573ec1e5dc0cdff4ab206f7b995862ac3fe1a76 legacy-trunk
+54728 f4391abe5b02345f2156bc4357e593312c0a2f96 p3yk
+54729 854399297f957e852512fa58e5b4b7a8589aa9ea legacy-trunk
+54730 67f900d2f2e6214ec811c2577f06efcfe893ec59 legacy-trunk
+54732 ae4ced28a83902bb21e9f32e52655799507952c8 legacy-trunk
+54733 4f77016254bc84bf51fe2507baff2f65345f7900 p3yk
+54737 c90d75a5e19114bc7aaec2a6caefb44b5843733d p3yk
+54738 d4108aca876427a9aba5eb99d32cc32c45706fb8 p3yk
+54740 ba31e71210d469d3361786f84736d8173300c6df p3yk
+54741 e7d9791014308a87519a939b3b950cb881c5b666 legacy-trunk
+54742 7c6972f37fe35320cc1fbcbc2f583b7fd4520b58 p3yk
+54744 0486deaaade3e40e86aa5e318e63162a04f8aa8b p3yk
+54745 4561f6da3b7d3947868f551fbc7edee98e6c6819 p3yk
+54746 40110d06e82ae23b6793e6cd229c9a99178b4458 legacy-trunk
+54747 15f34ad4681b88545a376a5eee6f376c0e7df87c legacy-trunk
+54748 73c016696a82f84bec7c5d02f2dce6804c01b397 legacy-trunk
+54749 26cbcd79a15310156503e499b281807b3a3c2e78 release25-maint
+54750 28bc7ed265747305a5261247e5a2002f9ff10513 p3yk
+54754 981a31ff1966df3259349d1ed76b05d1fce0b7aa p3yk
+54755 00d9f50bdc31aa94cb15a26702c681c4206da4c6 p3yk
+54756 f390793e75dec3d97a81f01b603201f37d69affa p3yk
+54757 46d0f4057705b097e9a170871fd01a5b6211dd06 legacy-trunk
+54760 0dfa2a5640760e688f547c4a4c0cac5c4ff3b01c legacy-trunk
+54761 3667d1a8c916f1a3dc81a903e0cdbf8326a67aba p3yk
+54762 a01cb3df38ddf34741b2482da73d997edd21084c legacy-trunk
+54763 c4f403f450eda65e9a216c709a392f0940e040a2 legacy-trunk
+54772 cedc8d7d1c7feb52b26febed9ecc79c275556140 legacy-trunk
+54774 86c46dc6a774ae9745a5048e4428f80ae177f131 p3yk
+54777 65cb6b1fa3951f345080d1c82ab737b79a74b7fc p3yk
+54784 c34d705b884e4e9f073379b51fe0aca2e5fea5c9 legacy-trunk
+54785 c0c4407d3531c6baf54cc085944dfeeccf7b9063 legacy-trunk
+54786 8447314f500a97cc55c4fd8469abfac9fd1031b5 legacy-trunk
+54787 953bdefd81ff556ae621d7ff86d11832924d525d p3yk
+54788 3569587bef065eb903ccc8b36227fe28d37a3665 p3yk
+54797 458c8db2e94616a2af33c47703712c9a8629f860 p3yk
+54798 0a389b47f129e8f6d06ebb8d12dcef38186814be p3yk
+54799 d1c3dd184e3882b994427436ebeaa4809ed36fde p3yk
+54800 e2d7a4c39360a8f1c137b08a51a46dd966bbe029 p3yk
+54801 3c339de8001056b6d2a074a2409831a8a678e122 p3yk
+54802 35f9ffc6b510f8f9c66c662cfb228d6ee0352075 p3yk
+54805 b822fbd85afeb3b7ab2477476590dc42b9727124 release25-maint
+54806 5dfd2f4bc834b68333c5f196e010823355519450 p3yk
+54807 534e4c707e91e6bda8cd325853f961025b690feb legacy-trunk
+54808 bab9c38170926b376b1500bcce0335abe693e2d2 p3yk
+54812 0d1e415ec36ccd369e406d1dbbe971440421fb8b legacy-trunk
+54813 82f2791b7c022164af2d823b85bc3f406c2344a7 release25-maint
+54814 ea3ca495f3211d3b1e85f6040db22bfdf830b4f6 legacy-trunk
+54815 ed820239f8787606cfb8408b94b42670413163fa release25-maint
+54816 8423772097c74a6cc0aded87ffe532b46f34f383 legacy-trunk
+54825 5f8a87fb4df332d9f9b3e74be4bb9ce14e9ae51a legacy-trunk
+54835 060c79f6d91967fed3c2795c8da091e44e2f2288 p3yk
+54836 d67b5d953b4523b28bb61cc06a23956b38189ccc release25-maint
+54837 bc75c523b9d817164e7f1d44ec3ae3e61ae078e3 release25-maint
+54838 5623e233e9ccfd47be39678e117793a2720c1f06 release25-maint
+54839 4579a274fd6e2a59ef6fb43c1c9799a6dc0e8a0a release25-maint
+54840 2fe91d201b0522c1c31755ad26deb6d87d5c1d73 release25-maint
+54841 31c92828aefb1b24e90055b1497e06d9edfba29f legacy-trunk
+54842 3e5fdb93c95a7cc2e9d7600c6d4152b3467e756b p3yk
+54844 cc707f1ae0b6eed3d3254274cb5ffc513e7219fe legacy-trunk
+54845 a49859f44c430c654206c7e5cb48d005586511c9 p3yk
+54846 b5a2e753b68231b0d1c3d564d842b95d840d5302 p3yk
+54849 e0116966365e2b7f6d98fa436b535adfc056dff3 legacy-trunk
+54850 c1cfd0af5f57327147c335d27e9e9ba847aba71c p3yk
+54851 090972c20a472e9b2d5b9c1126b718e4527e2efe p3yk
+54852 a30af833d389b828de3345bf41736698edb5fe40 p3yk
+54853 9657395c25e58bcdee61bfd919570f34716c5b67 p3yk
+54854 99027c2b3fd2de49a967ebe008da5422ca448da5 p3yk
+54855 bea0a5592db3fde97f69db2fcc14520d55ddb929 p3yk
+54856 a5e410639e24863558071cbd8bac4b42ad2311c7 p3yk
+54857 61c28d778e37932b38aaa0bd7d3460b418f3309d release25-maint
+54863 490d8c09abcb814950be7bb7a25c3ff2047c7eb5 release25-maint
+54864 4e0e84f9d14e2b5d2864b1b3b1e152d20c12c05e release25-maint
+54873 c32c4b3da93fd4bff6417d664098c4aa00e8aae9 legacy-trunk
+54874 58527b9b242c7d4bd51980dd5a10a11ab6ebe974 legacy-trunk
+54875 5a6d903ab7b5ba4ef0d1d91d2c1b0ed6b1aa489c legacy-trunk
+54876 da403d2b886ab58bf0df1c11dc71ddc3da5897e5 legacy-trunk
+54884 76fd3b98d007f6c48cae919b39bdc13e87cc3e0b legacy-trunk
+54885 17e4363ef2b530f1aa9a0bc128418ee63f7c44e0 release25-maint
+54886 0f675a629770aa1c2fbad0027c255907fb1ac981 decimal-branch
+54889 01e6d84e3892452473236f23eeaef74ee99936ae release25-maint
+54891 18795d49b8d2ac40bdd38890347b7400c4f45489 decimal-branch
+54892 f43664e8a1fa4c9fdc450d05724e72d94ec4181e decimal-branch
+54893 bfb6f1332fb4e33d5c724a6bbeaf546a509664e4 decimal-branch
+54897 f777d1dd4dcdda2577d2faf42d146fbc4a9c9ca2 bcannon-objcap
+54898 6b465cc025b3f75cbfbc6eb7d491653dc88e621a bcannon-objcap
+54899 84b5aced53561388f31173493d8b90d5b0396577 bcannon-objcap
+54900 af726fb681faaaeb8816624ac615ce7d499a25ed bcannon-objcap
+54901 0b70830ed743fccad8eada340479e61ce3bf15d4 bcannon-objcap
+54902 bb60b953983941e92264b27e1b3fa25674bead42 release25-maint
+54903 8cd093274d57810d6d168a33d786a5d3c82d6d66 release25-maint
+54904 1cc6bf2349e4e1e03cd075d6b9b88c952f2f50bf release25-maint
+54905 9a8c3d9f405a8a5fc67d17ffd371fb1a3323c382 release25-maint
+54906 6c6c8a8afb381e8aa445d8bf7700471accc8c569 release25-maint
+54907 5a4619214043d016632ee842e08d5883c679a028 release25-maint
+54908 aa3c7ba53f9d2f4696e0ef220dd323006a77f8e3 release25-maint
+54909 0a6e537b8d96b367a944f641eff296a9c76cc502 release25-maint
+54910 0c5019afc55b5e2aecd8d1d67b692790e0b3afd9 p3yk
+54917 1e28c68b4e43fb2f956d882b0035da43f34bcd56 p3yk
+54918 2804e48861ba627f488de566df13b8f9b8f5fd59 legacy-trunk
+54919 45638b37b82c8138e5d66f5d9c501d361032b05e release25-maint
+54920 3ccb4c143d3b8b253ef014eace1fbe112b76932e legacy-trunk
+54922 3c267092f131e5ab76e57e5f5b91a29dd1abfe0d release25-maint
+54924 f5526d2eb6547b1d8cabcca39ade29fe1592ec8c release25-maint
+54925 55d761acdcbcd412d9ef14acf1979b97530f8a21 p3yk
+54926 26df566f80f0dd78fc450fcceebf3104d59d0561 p3yk
+54927 810d333a73a10dde0f603f5fafb52ac5ada0d00b legacy-trunk
+54929 3c1205ca442b6bc8760cd8dd622d7a859e6a4b4f legacy-trunk
+54930 fd0fbffd6d50f785cfd6099fdd40057a5fd71466 release25-maint
+54931 09ddbade65feda3902cdce7ac6b66fbf2924e16f legacy-trunk
+54932 91f312176eaf378f0785a7f3a993abf067f365b2 legacy-trunk
+54933 f4461938f50e35be38664f8b1e54452f6517db92 release25-maint
+54934 2f876a5ffa0d3d4f2c5fbeb0e6e39d385509e06f legacy-trunk
+54935 d36a361c05fd027d3b78106b8a53c410e631d8d9 release25-maint
+54938 f58c0d11a75c315396d8108e8c80c9d021fb95ce legacy-trunk
+54939 8d5018d7508a2a7b3a6b187a4893efbc65e80818 legacy-trunk
+54940 d05d9864b63c79ec61fa3966fff3b7b5ec4f9f05 release25-maint
+54941 7ea5949714ad15b86e07eb57bfefe999e136d3d2 legacy-trunk
+54942 abfa7055b8f309b2505a72537ed7087b5c15c25d release25-maint
+54943 7e99af869c9176db4681abb354a8e1f0ba8b9df7 release25-maint
+54944 519f2313453b71bd8251ddeaebc8ccdf804f6ef1 legacy-trunk
+54945 b68272449df4b0311bd70c94a27a473536a355b5 legacy-trunk
+54947 708c8c5fc173236acd28c08d9f4575e7a14f76e2 legacy-trunk
+54948 1bb1fa7fd1741b37b1e789a3735841779db5b8d6 legacy-trunk
+54949 47aeb24882bd79d5afb89d7e07649845ad74b1f4 legacy-trunk
+54950 3ee849746c1bf5b5300aa19c922e8215693e5296 release25-maint
+54951 3797b98092cea2da8fda692bd03e835f4b2cc62b legacy-trunk
+54952 ca489804ae201063d42e22cb4f055b4879055e01 release25-maint
+54953 4b9fa8092e827103bcd1b1b2f5f9676ced40a819 legacy-trunk
+54954 7ded787e63116cc9c26b695cacc96e92ca04e2f8 release25-maint
+54956 6c4d7678af5e2d1937fc8fb167f41a21061c6e93 legacy-trunk
+54957 1002f42e10cdf2d2bb5e81fb7ccdc793b1f8382d legacy-trunk
+54958 71b5c1e2c09c221f113337ec81c8c885eef2aedc legacy-trunk
+54959 019904c64717c868738a8dbad7bbe73938872ab2 legacy-trunk
+54960 1f1fb81888ae28e5db5d937b9723e46b23b11967 legacy-trunk
+54961 761ce3946b86eb83631150ee4c0758029107ad5d legacy-trunk
+54962 3f43ebfa92dcf23d564b07afac52d04f3ea66f5d release25-maint
+54969 0f29a1a0972cdfa43ecd245fce494e75f0394622 legacy-trunk
+54973 e616fa130c2fcc3d053cbe07e946d19b9845fea3 decimal-branch
+54974 073d68c29049383b0fc3f5696134b5293f949d2f legacy-trunk
+54979 b6e8adec054c7d7ccd3bea6d299464718d0177b9 legacy-trunk
+54980 00bf147601e48d15fe94210192b5cf9c2961e6d1 p3yk
+54981 f7663c6734bbe4e432aebf4bda8faef6e0057efa release25-maint
+54982 d9a487c2fa96160106da8c594f43731953d736d1 legacy-trunk
+54983 6877b78e810d0245629eeffbde094f56fdd19c8a legacy-trunk
+54984 8905df617613e1c0e8bf18dfecd83f4f175520a4 legacy-trunk
+54985 7cc31032e2063fe061384f8ec5af3f470f0c94c9 legacy-trunk
+54995 938c5ae8dc314be29893dbe0be3ce422323876e5 legacy-trunk
+55001 12649a734be6283e0abadf0c7d97e44a4408999f release25-maint
+55002 cc9afeded23fca16704096180849aa5c546538fb legacy-trunk
+55004 adfabc57361d37c9999fc15e4bcd5fbe3cb5a7cc p3yk
+55005 06145fbc7ab93183404fed6f8c63ae4325f37824 p3yk
+55007 270086994f484e9619530cb994a872b196cbb9a8 py3k-struni
+55008 a6a436aaefdbeeee2858de50b78143ad6cf11ec1 release25-maint
+55011 76e375ab75257406268156bfc0630a3a2fbd3f50 release25-maint
+55013 29ae667f3239411647806c2765a17d2c5a328998 py3k-struni
+55021 ad1d56c07423396f1bb6ed83f442989a0bbf4a27 legacy-trunk
+55022 521160c9b369d04a9cf999456583c6150291499d release25-maint
+55024 4f801a758936d4466442b1512c4f335904cc8646 legacy-trunk
+55025 6a56aedbe2808a3a6b9810a162197873d5b9ef23 legacy-trunk
+55026 873dfb52c334606a09bc27eaec9542f05d48306b release25-maint
+55027 82e79983cb0c2998489d38e67085f449401dbecd legacy-trunk
+55036 b86bd77d3d4040e3d15d463d1a700ff841b11aeb legacy-trunk
+55037 bc7a0379d3b18eb3b4173c41c6a412bf7fbc10b3 release25-maint
+55038 86a232ea8ba45dcebf4e3e1a7b34cb644367e266 legacy-trunk
+55039 00fe4bb029364d7a1ae1eecb61a1bfb9e496f124 release25-maint
+55041 2b2d57d6cc7eb805e58597a36b74b721619232a6 legacy-trunk
+55042 d3df31d454571ba85bb8a6f5866b5617f6f608e1 legacy-trunk
+55070 3769a5196035a3075084c389c773c1505f08a646 legacy-trunk
+55072 e50d82c418a72fe451d7fe8821731eac44822ba7 release25-maint
+55073 a3bf55a03f66f7bb2c433e23862acc264c196cc5 release25-maint
+55074 39e953805184937d4a6ffb96601a8663b989e3d2 release25-maint
+55077 eab295d93c8e6506930c24162016ce7d982bca71 p3yk
+55079 beacf40b59607a62be9b67c98e2ba0952ca686f8 py3k-struni
+55080 980ff0b1b9578554dfb3a41a454f54f6ca43e70a legacy-trunk
+55081 3d72c1091e5a39baeeb8a808830fa83e250c1a91 release25-maint
+55083 bc6a0fe323517ed4825e7e2e2adaf9fe5ecd3b00 legacy-trunk
+55086 d70565457eabb04e82841a5e1870af0cb462306a bcannon-objcap
+55087 7a4f174df8441094d38628cbaef395da9e1970ec legacy-trunk
+55090 a68467cc06d3b4a052fd2ebe13e3d83f98a59f0e legacy-trunk
+55092 e9bef5b42001554da0890d7913c85e420446368e legacy-trunk
+55093 25cc1cee5e69041ad00a27c2b9a3517f21d289e5 legacy-trunk
+55094 7b74a197609b86218607a8f59d4b566c500c4ed2 legacy-trunk
+55095 c1f6f9848b17cc18e78a16484c564ce3a38ca762 release25-maint
+55097 825d966338ea700061b3f5f8bd0b6ef44933792d py3k-struni
+55099 368fed9af7617991157744a2c7308e63b6a74efb py3k-struni
+55100 15b810e21fe9a90b414aa3799a640ca5d113b263 py3k-struni
+55101 9b01dfd03c2949c0c964d36630515c5ccabbd2ac legacy-trunk
+55102 37d82bee7a1615cc5afdcb3254bde41aa3c0459b legacy-trunk
+55103 1c1705bf36b88b7d41b5831313681bcb4a15025b legacy-trunk
+55104 a85d715009ecc1a80e53c5ea35dbef2dde415233 py3k-struni
+55105 1e5a2a2b18eedb89cca7e831ea72676bfaa8642b py3k-struni
+55106 dc5a1567af984d5e6fcc89cbabfbf20a8d225808 py3k-struni
+55107 f6fa4708a4db4711f9c436e420b050471b63c0d7 legacy-trunk
+55108 2c54763c450421d0bf3cab8a2eecf78da8bf8469 py3k-struni
+55109 cfb3e0021b3bf8d32bfaf7617c2d80bbe0f61cde py3k-struni
+55110 cb3c92062ec405e9d81870ebadf9f279dfd90c68 py3k-struni
+55111 ca448c607b1401ce80b78dc5bdbfb268a6e5caed py3k-struni
+55112 a14ff370b63d932b6a580c84de57ffe15888c893 py3k-struni
+55113 ac16bece1e5fb7f5e4f211f700dd00b675fb46d9 py3k-struni
+55114 b39abcbbbbba4b542ab5e5292561c5eed4d587b5 py3k-struni
+55115 1de549471721c38a2287ad3a94aa372a76753431 legacy-trunk
+55116 49686ed56ec7fe8717fbc8e24e3cfc35a168f74f py3k-struni
+55117 5b8ef94bb810fd027d7c50de198ffb2213aa0c70 legacy-trunk
+55118 1162502a09da76b1ed849a1b00a6394f4fba102a py3k-struni
+55119 a3e3001b35bf0a15e2eb51ddaed7614750b2f0c6 py3k-struni
+55120 7f36f96b6c76586f8382044a9d05e28e19d0a7c7 legacy-trunk
+55121 052bf0dee6b854706480180f303f37acd8a0e420 legacy-trunk
+55122 92ead87bf9843c41e71c77693c9e26b032810e3a py3k-struni
+55123 e78e1b616c72fc82ceff61952e97f8dbf49ee204 py3k-struni
+55124 a7323c72b5c71f903acd2e89494a355178275122 decimal-branch
+55125 be9039b574d97cec9eff326bae9895d48da38e99 decimal-branch
+55127 c48fe4dc34a9142306fa8561d0ba3e18f749ac9f py3k-struni
+55129 2131e03721efdc9a7708b3f324ecbc7bde2be9dc legacy-trunk
+55130 52b99a915faa5e797d828832af91d6c55213d338 py3k-struni
+55131 8b743f55596108dc57916ac88d8a5889734247f6 legacy-trunk
+55133 078b4f2fdfc9476a79a39568a3968561913d5a49 decimal-branch
+55134 3b57f0b7eddff915ec84f9a052bf048f0c4d7f54 py3k-struni
+55135 9e1dfc8558905bdb8780bec192b1276da8961cf4 decimal-branch
+55136 e2b1d0222afecf251d91e239d4d1135904bce775 decimal-branch
+55138 df46011c5936256fc4035206f787ac2b973786cc decimal-branch
+55139 8680972ed8f036ebf27b2eec9f8a3ef6bc663512 release25-maint
+55140 615795d52b9fd98a4fa21c647fab44726bd894d6 legacy-trunk
+55142 be7eb3fd3776613071b6d3cac3809faff74ca35f p3yk
+55143 266e12394b97d2fb334d1ee7f50c3dec0dc8c9d2 p3yk
+55144 946fd54b457f5e426ad0e76011cbd193c0f9e007 release25-maint
+55146 61acfb831633c8e72d33438a93b1172f13004a1d py3k-struni
+55147 6b7d1782a5749970abf07e82b027f452d34eff7e py3k-struni
+55148 838cab379376e7bfa01fa6b4b910c34d30539639 py3k-struni
+55149 107aacb9c5958831cb207d1d73eb4a0e94cee140 py3k-struni
+55150 6bc156d3c00ec253cb1c3812a55e14fbe93604aa py3k-struni
+55151 e25dcd874b82799cec3c74be95b5281b02ccbd8e py3k-struni
+55152 46b00c73e32ffb52ffb1d3d6d541c25136cf3e7a py3k-struni
+55153 1440bbb67150a701fca26a28dc09ba95e0844a9b py3k-struni
+55154 ea5ccee6b2854be2a58c83416692bb8029e58bb7 legacy-trunk
+55155 2d377408a987bcc7ed38d64ed5586f26aa5b7574 release25-maint
+55156 554ff27145e14afec6651d34acc1a524b75e95ed py3k-struni
+55158 f3202fe7859819a4ae6b236676bb44f56d2e703b legacy-trunk
+55162 8728cd012bd87e7642bf61cab71d29bd38443292 p3yk
+55163 c791a5e2e09e8fe1d7e98403414cff0206b44e6e py3k-struni
+55164 2dcc05a80905fee46ae56a99cdf8e2ce9a30cc13 p3yk
+55165 0c3a3148208e0b964f565624b939d9d59c09fb71 legacy-trunk
+55166 d4ba663277f8fbc27347eddd82f2f237a8022b3c p3yk
+55167 c1075f06650a761eb529f0c883c20232976a3854 p3yk
+55168 5d0969167f6db76d71f031db7b901b6383dad53b release25-maint
+55169 54179538a3877255dc65a8af5af8ab65e2e954ef legacy-trunk
+55170 443102bf58950547ab87babdea755e09c8c86b9c py3k-struni
+55171 4110273a261109f24667098c07784a39c5325830 p3yk
+55173 be1e708d5d3df15b8f3bff01981cfc5f48e110e5 release25-maint
+55174 a5234f3c75511ed2bc0de42e8cfec2b3639eaa4b release25-maint
+55175 843d0ccb0094df78ce7243b1937a668eaa346f38 release25-maint
+55177 fdfdee191a612b94b33124a6419ec3130746463f release25-maint
+55178 205871c9715db63c117ebcd0cd94afd8dd349ac6 release25-maint
+55179 a153f214fa1b8408d545369ee540f5ded971c687 py3k-struni
+55180 a6eb6acfe04ac2bf3044285aef552c0b7dfe4bea py3k-struni
+55181 c6568550b1c610dc4b5f877e57d48a2beb06b0c1 py3k-struni
+55182 8e7c60b1356b7383fb3cc984984301ad436c4e89 p3yk
+55184 9cc4c3f0b58075a4383e2042ec3f806bbeeb7de5 py3k-struni
+55185 70472c157bb9c005384e78db95db66b5b2ce7c22 py3k-struni
+55186 8f77f96071138805c2fccd0fb31f6209b5fa4954 p3yk
+55187 6a016f3e0051667c3e3245f1ef781d9fa8ac5785 py3k-struni
+55188 c8400096d2d71c8f537bd1c8fdd0eff85c7ff798 py3k-struni
+55189 bc6ad63cd5f1f6e0879b3d2e80ee7a0cd43874aa py3k-struni
+55191 2d9e58c5ad343d441448b47139041d4e66c4f0bf py3k-struni
+55193 23a8b3dfbe953710fdcc67f07e08d11d759a1fec py3k-struni
+55194 44ebae4f61c4a2b000ec53e92498573f483adfaa py3k-struni
+55195 050c98cd41c4f74acd2ce93c1b3a078c3f8e9d6a py3k-struni
+55196 52533370f1ad403c233661f2fab005236459a3c1 py3k-struni
+55197 370b91533c53d8c00859458e3859e9cf4d96ed95 legacy-trunk
+55198 f0da1b7b8e5a2ae49ddb329aec7b81eaf69f03d8 legacy-trunk
+55199 76e63e03335605dc63ad924b8e59ece69516fac2 release25-maint
+55200 5c728534970c1e262a78dc0ec48048409c54bb70 release25-maint
+55201 7fe6afcbd3f2a6a676d90228866cccb18f383180 py3k-struni
+55202 650ff8d7cc380aa145edf68fadffe16ebe61d65f py3k-struni
+55203 3a4f06bc254bb5eddb3886be6dd1515ad397d634 py3k-struni
+55204 02e698988521a9957857ae392f12d58ba867758f p3yk
+55205 9b14c1e589361bca3f7c2ce79469a94ae1e20dec legacy-trunk
+55206 dd2d407dcfd0c47d1e1a0220ae59e85c4318fa4b release25-maint
+55207 475c7c5437fc62b83d0d70e9836850bf5f681b3a py3k-struni
+55208 a363cea32b9baaa02b0fc38b143a2553f925acac py3k-struni
+55209 a3248fefc0dc8b6aee056c855246234e0934d578 py3k-struni
+55210 85d51cb8ae5ed8527d63586e17983943029af180 py3k-struni
+55211 4a9533e9365e0d978167412918350ce774048cdb py3k-struni
+55212 b1bbe8011152893ccc518d676844edc25115bb6e py3k-struni
+55213 d12811decf94d37d99dedee62184906a77935146 py3k-struni
+55214 688e2bc20802638aed58835ebecb817a1490168d py3k-struni
+55215 7a96c86405751bd9ec998d7efef02ccb5d7e0c94 py3k-struni
+55216 dd3ac1cd1c9196f32d126ab0338ea2c1aa10e1b5 py3k-struni
+55217 5f20286b0da9936298b1616b8ed4b554931c2903 py3k-struni
+55218 248dfc1bd44c025bac902bfd73e10e12992518e5 py3k-struni
+55219 297734f8a627acdf6ebad856f0b55a3dd24ecacd py3k-struni
+55220 915d52455ffc4bfefc22b6d31e7e936044987911 py3k-struni
+55221 c4a9993f2ce6ceaa2097f2865daa7d5b921b6044 p3yk
+55222 991446ff6b15c08b0df2fccc4f4a24d73a1ee762 release25-maint
+55223 775d44a54399550bd591e6a11c2a5413513c1205 release25-maint
+55224 98709189d9e1c00ac94e619ae0bf98f5951c06e6 py3k-struni
+55225 1040568f902ca2b1b85aaa36defd798597a51f4f py3k-struni
+55226 1d334912a1040d9fe854fe48108c055ee1436901 py3k-struni
+55227 7594709e631b3337ee4bc6feff6477e24853ac7b legacy-trunk
+55228 8a8bf2c074e04f0bb32444ee488bb250b35e855c p3yk
+55229 c5ebf9c219be4652060c4fa110262f7b7bb02a1a py3k-struni
+55230 fb705f18bf3d7665f668c60b3b867f5e810735eb py3k-struni
+55231 bab8a9c7f49eb620172fbce42758c2785f72063a py3k-struni
+55238 a6e4f2cbefa9bd0b351aef4c6339b13e58327c0c p3yk
+55241 4367b7af75319bd65f7e781b9e99feb4070e267b legacy-trunk
+55242 8edd746291fefdee6fdec2d827756fe0d13da4b9 legacy-trunk
+55243 02d2488fec60ca15cb9a65bf2c45e7c676e52480 release25-maint
+55244 cf9dd7f0f4a20f026a2947e0bd25394078edc11c legacy-trunk
+55245 6c4aa4611c881dc62ce5a9c4d678e58211015011 legacy-trunk
+55246 cba8c6a5ecf0261674697c7f5df5e44f31800036 p3yk
+55247 cf79fee8b71a10a8d699a5e323072d65dc852d9b legacy-trunk
+55248 01127821af75614ea573a779ff060fe71b755d38 p3yk
+55249 d231685e9ea7d54a2dc4f8bfd6c3f84b84e7a932 p3yk
+55250 f223a44db13a68837fe8ff0e10a0d50b766e8460 p3yk
+55251 9b9c53c1aa5c095f09fb9bba386d5a15e53b318d p3yk
+55252 dc39bfc5c74e622bc548b2bd5ef445e1bf8501c0 p3yk
+55253 81d9f5270e8752d47c1dae03c4565042626f1760 legacy-trunk
+55254 3eee06cb15a3ee1bee34431f19a045fb49722c21 p3yk
+55255 7d98c12a344dbb030c481496726c857a8fb02c8f p3yk
+55256 d91cc8d49294e8af42e1348bc1be0e3ab1f13766 py3k-struni
+55257 4548ceb31c94939915ef7cb4f14dccb07ea08e3b release25-maint
+55258 cd2403d370e0f67c41b69fe27a01f37953bb896c legacy-trunk
+55259 b8fa4ac6c5f07c609def73f6c84b3f4847d27655 legacy-trunk
+55260 3fa40b59b9b68e2febbd05be472f2a447dce18fd release25-maint
+55261 51c7412289583ffea14511a329a619c43985e557 p3yk
+55262 bcf57a153b11a570fe0e54553dbe2072ba16a802 p3yk
+55264 d7c7fe9b6e972e9258662a3dd642d7dacd2dbf6d p3yk
+55265 915392d5f0b8646b16d5144bb9de7d376e98cd53 p3yk
+55266 32673b888c244ce18ccf41ece0a59801159d1786 p3yk
+55267 5a2f5920cf750fcd58cddbf25948e80259a32936 p3yk
+55268 7d49038e99c9914812d9ce44568efbf2b6039ab9 py3k-struni
+55269 ee47fd5c0e5d7467feb28eed1610f82500ec23cc p3yk
+55270 e16c8e5c5ca4c111b65f91ae9a384a9d977f0c2c py3k-struni
+55271 2719e17c928d366808b944b0cccde9d1e2309ef0 p3yk
+55272 ddc4be2786fd25835df8e66e32423ba838bd90bb py3k-struni
+55273 20b8b29593c0d98d4c819ff4d8fd2c1fd50eb1d1 legacy-trunk
+55275 e06e196a05cff381bc46ec3660528742b7b4de77 py3k-struni
+55280 9706f3b490670f318970c76ae151d5a87d751c1f p3yk
+55282 7993f23ad46ca54f10fb9ac59501c3cdd765808e py3k-struni
+55283 d237f47f293f29b9aa6050fb180a61a276df6bc5 py3k-struni
+55284 917040dfec5838c7fd113e71d11c9f1b6d806be7 py3k-struni
+55285 2617133c7afa27383488267e18ff317220147644 py3k-struni
+55286 6026b8a26c05ff4d486c4e2325e851808ea0fcab py3k-struni
+55287 482b5990d2fb3df68674543bdfffa5b0b2115fa3 legacy-trunk
+55288 c17d760cb6d06f0960c13bddfa0bf8baa2c8f2af release25-maint
+55290 7bbb97e14ad6ed12e7f1c4fb663010217868e788 legacy-trunk
+55297 a4893c4802648b77ac269e55cf03c5a712b93c43 legacy-trunk
+55298 92eb5ae4c18f151a58956aece273de4da8003eee legacy-trunk
+55299 a160b437ff35fe16824fabbb67e2fcd4f557662e legacy-trunk
+55301 b460084479933391f8198459fad3fe34b0da1561 p3yk
+55303 b7e9136d4c838f8ecfba7aeb4632ed978f390ec8 p3yk
+55305 7d24a68d0a1c6163622cf47460f044617b84375d p3yk
+55306 65666ec83c2c00c713b209127eee8cdd8bd9512f p3yk
+55307 aae549eba7075f546e7c8e211e76dfc0fa6233c8 p3yk
+55320 c4d57dc60b019b5e3e8fb235c3165ca3cfe766cb legacy-trunk
+55322 1523aa8271465e9f2659ceb5d6a8c96d66500424 p3yk
+55325 f60c877d52c8a097a5d8113f9db3cfea3e2cb464 py3k-struni
+55326 c7f54660ea17efaffbcdcc09240ffa6d6c87501b p3yk
+55327 d6e6f982c637b69807d387441ee5617399fc8677 p3yk
+55328 00c02c4488cef911e0e213405b8bae94e7463fba py3k-struni
+55329 f3256c8c72ca8130de31a6c897cf525440fcdee3 p3yk
+55331 bc43cb2316404089232acd6db0bae63201b28519 p3yk
+55332 558518ff9d91ab62426d0ce764abd2e2c4726db7 p3yk
+55333 6deb4bb10059f91cccb8bef1c526f2a01c66c25d p3yk
+55334 1db31941e01391e796d87238edbf7714fdb8d176 p3yk
+55335 b9c724dd72c818f1a1d372ce5f904a01f35ca4ba p3yk
+55336 d813fc36b9701f524b4e7bee024a73b123e1e2bb p3yk
+55337 1c9a299656be371a1a297cf5eb061d8e7aee7165 p3yk
+55343 9ad84070b22d84f175a3b890367cf90692b6418c py3k-struni
+55347 6ca3d5f3d1be131ff6697a79df0e84bca6c493ae py3k-struni
+55348 3e1eb7af4ea0d21e7f1e9305df1750f177d956cf legacy-trunk
+55349 2b7112a63571b2ee0c49478412a3b88887fc318e release25-maint
+55350 26349a64ef7015bc20b993229f350c4fbe1f7d80 release24-maint
+55351 d3cd2920beb687bf2171ef7961380d316bcd20d8 py3k-struni
+55352 c9c52b87c30b5fb33ac3af949fc03d968411d007 py3k-struni
+55353 a8b7a81599d048aaa1424d654514b3c2e0034318 py3k-struni
+55354 d1146d4db54946844f4998af8a0892b9666b8850 py3k-struni
+55355 20286eca474315a963b1f612241945637ae5551d py3k-struni
+55356 430b6ed80148e9b0093e9d0cc97bb92319f92be8 py3k-struni
+55357 6ea93700d77920706fca54f0b2d73ec609c1f6b3 py3k-struni
+55358 2968597118c139c8bb7b37ed73b03e23c884d32a py3k-struni
+55359 2937f537132ea3ffe435fe9534d6603d804fcd3e py3k-struni
+55360 c7b155ad37911904e51c85fef4c82a106781cbd0 p3yk
+55361 3787a3fbc458d8dbb9c97acb2bf279fa91d7d59a p3yk
+55363 78d76435da9ac9ce3f2a00ec5ee79489a6466bc8 py3k-struni
+55364 bbb099d4ec8024bf800e02c0635f28c79d17b185 py3k-struni
+55367 052d55e8af7730a74f25082a7143d174386228fa p3yk
+55369 92f719fa9b16e90cabb955a40c1565d442a67059 p3yk
+55370 4e41b72da0fc6637241f7c3ea344b7d11f30cbf0 p3yk
+55372 0ad6951c18f7c5782bcc627de4b64f9c697f8e33 legacy-trunk
+55373 69e1f7ec0ce916f1f6e251394c6b61f5bc1ff19d release25-maint
+55374 d0c076669732fd2f84f0ac838313d027285b7c42 p3yk
+55377 0424a9fa4b0b4d4cfc368e8b06727fe1d11ebdf3 legacy-trunk
+55379 b01546f36a226304c919583f3cb777c26f8bf13c p3yk
+55380 07f0832297b1e72e5ffe6ae646984ef94e19119c legacy-trunk
+55381 cca9e32ee5501bd8f8dd3dc1ac356f6af021f060 py3k-struni
+55382 dc6b5f355d5a8cbb15f5c23b7a540fa20a68b2a0 py3k-struni
+55383 9b8293bf8fec8bff9d398968317727bdd6373bc6 legacy-trunk
+55384 7581ec16230ef183183aebaaec3da66a7792f986 release25-maint
+55385 61c4c222a3270d83125dca25945006eb33db7ba8 bcannon-objcap
+55386 6f1293ab3ac48e8366ea4fef2045daf1e6354aad legacy-trunk
+55387 693b8d91477170809ae92b354d8cf459a404f8d1 release25-maint
+55388 388e4f21e749e27dc03f8a04475ece642f887974 p3yk
+55389 2ecc296443c32c3c112f36c71120a044c2a26b76 legacy-trunk
+55394 756e1d404cb861b9e1daa0f4300d26894d28fcae legacy-trunk
+55395 e3ea881b14fed2b53b68409a46230cddeac97bbe legacy-trunk
+55396 79dd90787091dfe3d1e0c6465371add832bdfe04 legacy-trunk
+55397 cc6f47f1e13a446dd532728f765121b3ebb9921c legacy-trunk
+55398 6f0dba807734afc6af90f4723a1e0004f8e887da legacy-trunk
+55406 c12a309787d3cc8f394305b2bd5cf5e3d6cf6b23 p3yk
+55407 b085eb66b7f6da6e243723abd11baa3192036c60 py3k-struni
+55409 41a1830eee16518dc326639802cf571f69f7121d py3k-struni
+55410 eda9e60c9745478bc69f15cd185afc64be45e231 py3k-struni
+55411 4d15ad41651e4c0f68eced3fdc58ef9a13462b76 release25-maint
+55412 151189c72a372b9a2348fa87ed4f3be9a0cae212 legacy-trunk
+55413 a6796a24481ce50133b7a30db47e974392e108ad p3yk
+55414 689bae0767e20c1edbf6bf7f506b28f686313bac decimal-branch
+55415 c2411bdb6286cfe1636100c11b07d8179b5228a1 py3k-struni
+55416 60945bdb1b754856a19473c1244f9cdb9e17b2af py3k-struni
+55417 b0b514badf0b0ba9fc9eca5ca76d7c1ee576142a py3k-struni
+55420 13a6c6bef609701a775b2a6635663e5917ffedbe py3k-struni
+55421 0ead1064ead002d7fdef98abc433861b4dc48b32 py3k-struni
+55422 edb4c9028be002a3eae04445ad02235f97cea05a py3k-struni
+55423 1a9cd76364e3d6a23cdff2269af3a54f3730e72d py3k-struni
+55425 5d9dd1b8d908b78cc9bb420872298f5d3cdcf114 release25-maint
+55426 47b159d640a454decf6a3b643cfdcfcc639abd20 release25-maint
+55427 f43e9d1fabaa8b6fbe406566255806c73780047f legacy-trunk
+55428 8fe98f60eb6e3797c354c4b9ced733dc0b604702 py3k-struni
+55429 141e2aeffbaa43eb38ab170dbe38de8d4fd095b9 py3k-struni
+55430 ce60f47b17a2541c9b4bd82c8009a6d2abb6caeb p3yk
+55432 65c3b432f501b7ff3de6913f4234d1e94822357c p3yk
+55433 d6aa7edf217a6520e6271808167c80866eaeefa0 py3k-struni
+55434 47dc71605341d3a97dddd166f936b9eb824e7baa p3yk
+55435 8ad1c88ce1ac6784d747adb8fc1b6921d29320c3 py3k-struni
+55436 b592985a953ff90dd77f2799c121d549bdd699c3 py3k-struni
+55438 b29d71d43c8091f325301f41ee39f28e9a090a21 py3k-struni
+55441 651fa2c9c2abe5f343c1abf7dabefed4d6aa94f8 py3k-struni
+55443 6d8d66050003f1f883eed9c062c37f6061b0b797 py3k-struni
+55445 13641adba6ecc604df807fa18d4f59a1ec2fc7d1 py3k-struni
+55446 f19e631be101b7af8228e472be3a88fd84426fda legacy-trunk
+55448 4a3a63769d34a9340ddb950743887af15f903e88 legacy-trunk
+55449 d4db626c2290766b8862bd50bd1b6957ea7d06ee legacy-trunk
+55450 312c1119dc146a7a3b61affcb7ded7d5516d9d7f legacy-trunk
+55451 299878d62e2f79e6184fda847e55ea7eec567eb0 release25-maint
+55452 0f93b700c4c9f01f105ee53970b2b68c0c6671b2 legacy-trunk
+55453 515e2564eca7fa81a9f7df3ad47b6ecc12c0255d legacy-trunk
+55454 4a67f103833eb8c52ff5d622299d75c5da8c61eb release25-maint
+55455 f14a5b005a1e2c4e38cd5f653bdec9b2cb3a5c4f legacy-trunk
+55456 bee8d01ef42c7b12afa959862827650cc7db8a59 py3k-struni
+55457 1326b0b2afa09153cbc89ef1be64a8800863439d release25-maint
+55458 b7fb942b403e9e91b2adb56abe890f94c522b039 legacy-trunk
+55460 c2d32b5ae90b3a313fd8ec76738edaf6c0472898 p3yk
+55463 d1c38af065bf39c1948480744ec43110851f56d2 py3k-struni
+55464 ecc685925b52d3c0435996faaaadb02df523f27a py3k-struni
+55465 6d246ac631982da59ac2f35248fc9eeb7a1727bb legacy-trunk
+55466 00413f70ce5c3ebc6962444663936a04e2792d26 py3k-struni
+55467 779a210537778d54d0720251e57642ee4556f7d0 release25-maint
+55468 c028b2775a9a4effa5da0663f92c02bfaee9b8b7 legacy-trunk
+55469 5bef2c22bf85706e2b4ab4c20810cd52af43948d p3yk
+55470 31029f6ebca2a87ee32ec778ad8c3922495a65c0 legacy-trunk
+55471 67cb818360f0dc470b4431a4ca972691d916a3aa legacy-trunk
+55472 62cf2cb74e351a6c17faf1c7f913eeee23f573d7 p3yk
+55474 c0e89d0ee0e5ba82bbe9867448ebfb8bb4b0c82e legacy-trunk
+55476 2c00a1910271cb57d42e1e5c7d77e04d1d7ebe63 legacy-trunk
+55477 a58ba67faf1abf3894aa35633625969e383e6531 legacy-trunk
+55479 e35f1ee22ab889318c0728c74d528a6bfe5a8eaa legacy-trunk
+55481 ac8a6deef9740d8d52e4263a06fffab726ade6e5 legacy-trunk
+55482 35e18a0d10f26bcf403480133af8eae07cadb672 legacy-trunk
+55486 d24c9e432d524fb02c91ac8ef8445c3bf5462f7a p3yk
+55487 2671e06baa4c07b3159904d5c4fa3e7be956a741 legacy-trunk
+55488 993f8a9b8ab39974185f35f23105717d522313ee py3k-struni
+55489 9457b9f5bdd10932fb2c12bc2868b6ad637f3efb legacy-trunk
+55490 81b178f0b1ef3778edb5a5efc1b7b63573cd9e62 legacy-trunk
+55491 3d3bf27409e6202bf8b475a00aafbe21d949d2f8 py3k-struni
+55492 1446b9fca01dbd364eb9fc083f20cc5b4e9ff7d6 py3k-struni
+55493 ebb0b6d6dada28021b8aaedbf7b9518625db61b2 py3k-struni
+55494 ee2951444a89646416fc0308ce4c3e90682e8f63 py3k-struni
+55495 a405732a262dc74f2fb50f6d7c31555c6c165f8a legacy-trunk
+55496 d7f6d6f4562ee61e16f07db6cf5c154ada373de6 py3k-struni
+55497 8e062e572ea4d6ae615779fcccf229e8609e7682 py3k-struni
+55498 f9949b63eab3a1262198fa7557d82bbc3a46414c py3k-struni
+55499 d07d34b53db5808c4848986112c8f30a3c050caa py3k-struni
+55500 50dafa22b8a4e7b6b402a8f3774bc2b5eecde58c py3k-struni
+55502 7c9ddd4a08146f6dc3c5cc7d03757c85728d47a1 legacy-trunk
+55503 3d058587691dd49b8ab854e8b9520839ac7a3853 release25-maint
+55504 a9227d7a34fa8e714076a7b72af1a9d7fc0361fb legacy-trunk
+55505 ec83d21065aa36fb1ebb413de9a57f068dc0de15 legacy-trunk
+55506 ea7ae891f93894cae0e3be11df868331e0abcdf4 p3yk
+55507 c897559a89fc9465d4298e2129c2ac99f317730d legacy-trunk
+55508 bfc73d849e28a9deb2006e5e78eb46821a49b870 py3k-struni
+55509 db49a124739defe6334a427e6b4189ff1931ebda py3k-struni
+55510 b5aca0295b792faa7909630fc94378c17ced9bf4 py3k-struni
+55511 ae691227fd3437f9e7b4538fbbf789ef00bfeb4e py3k-struni
+55512 98ef5ffcff2843b45a5848369477daf33efd99dc py3k-struni
+55513 dd80a4c5f47d04d05a62447346407b8a5c766c33 py3k-struni
+55514 24b60622b944d04dfe12fc682917cbe7b9069e37 py3k-struni
+55515 843f7efc058f23c9ff121c3fc3f9dd87d14fa7b1 py3k-struni
+55516 8c3e40b179bf414fab0b7bda28f792a5b31b60f7 py3k-struni
+55517 eb45f85c4c79263be4a629551eb87f4769b0063e py3k-struni
+55518 a7be148f7c5608064091ea12b6c8282fda1e2678 py3k-struni
+55519 f7f2a49c1f2e54e3c5884d4157a57d621d2aabdd py3k-struni
+55520 72d7c0f3bffee8f07f429cf36245ed27a559e0e9 py3k-struni
+55522 ff7befe919b5b166b807987ec475bfba8df37156 legacy-trunk
+55525 a0ee3b2ba361c3ee339481485727968a34fbea10 legacy-trunk
+55526 4cbf949436eb57ad6efadf81bf94eaa02926b362 p3yk
+55527 8c3578934df6da87c2616d103afd6d6a914fd442 legacy-trunk
+55528 9a447514855f1171f461a943a8e9a5893966fbd5 legacy-trunk
+55529 a6c92deeae27f2fffea003e156702abcc6edd5a5 cpy_merge
+55531 814077e7adee3acf720182f29e86cb709386c6b4 py3k-struni
+55532 709f82e2a55cb454c2d6db55a2394a44ab61f2eb py3k-struni
+55533 ab39662e454bce4b0e490b04a65ca9f53c6e8d79 cpy_merge
+55534 e240d20da3ec8fea85539407c3160b3e2483cf9c cpy_merge
+55535 e8f624d48da2ddf1e84e4eb2ffe815f061297563 py3k-struni
+55536 56e900728929530461cb157b7caa970cc814aa80 py3k-struni
+55537 233237707ebc9979ca090d425037cdb681f63ae0 py3k-struni
+55538 bfe953046d05b226fd896c907007ba39ada44bac py3k-struni
+55539 523df1de0a5c2b8ec20660093b7f48f37c309b2e py3k-struni
+55540 eb188d7fea5d98e46672bec3b2133fce55c34475 py3k-struni
+55541 211dc9d63673b5dc7f8fc4fcbe46e5c295038cc2 cpy_merge
+55542 129f9653b0a239f2d7f621a39924b719253b7b60 cpy_merge
+55543 1f7891d84d93fe364ba8b222f1e43b832c67e57d py3k-struni
+55544 4774a94d2e6d665e949f46f8c50cceccd06817cb p3yk
+55545 82e5db4960edfb34b109195d33a4298239a4a7a6 py3k-struni
+55546 9ce8fa0a0899727ba03a3730bad2341e624ab066 py3k-struni
+55547 308e632702bfa4ae8d5c6da458ae97bdf51e601e py3k-struni
+55548 21dc4629b7121458281ad8a07503379427fef4ed py3k-struni
+55549 cf151967eea3cf01540d0d436a9b43d90a3dc323 legacy-trunk
+55550 6f8f82280545dd93d0612161bd34dc1654e661cc legacy-trunk
+55551 3979f9e2d026287f79010cdca98ff51927d3acb7 py3k-struni
+55552 cf0891f1d60aa9db0558ce35c7e71958de9d3858 py3k-struni
+55553 e63101faada68c21ec7890d72a3466583c12cca2 py3k-struni
+55554 86a9d5f4330774423588744f3f4c2b8db0ba2ccc py3k-struni
+55555 10426ad5a6e0b137e5160a61e95736b7194f7e32 legacy-trunk
+55556 057a9c3d067d11346c7df41588bceb1dc17000bb py3k-struni
+55557 41cfcfde08a99a745f7ab3eafbf43c50186ecf31 py3k-struni
+55558 2f48c56c5e8169152d58bbe540a8573cdc980e64 py3k-struni
+55559 98c66efc955333a5b32180e4a949b9e4670d77da py3k-struni
+55560 e4e8b12770e406bb3e1a8de80dc59c4caa15496a py3k-struni
+55561 e6fc67ad9c54bc1dddb21a6c3b25c3ab24d394bd py3k-struni
+55562 969868df1938bc482fcc98ef4b674f7ab6bf817a py3k-struni
+55563 46a94ead3d68de3b31cd7a3f605385511a50b997 legacy-trunk
+55564 2490076795244d052dc1ef8c0469e2b7afd669be legacy-trunk
+55565 99e33068c3347dc29eea2888e8fd77128b1e0779 py3k-struni
+55567 cec2a9c200ba2ca2cb6ae587a25192d013177626 legacy-trunk
+55568 522c4938bdf6818e98fb50f9f3d968c8acf08d4d legacy-trunk
+55569 2c8ba3faaf40c059529368d114956392f5ae5d7a legacy-trunk
+55570 6319271c232617d8aebd5597b7076cbbd63d0a87 legacy-trunk
+55575 f57775c5d0b4236628c290011eca469675d15386 legacy-trunk
+55576 1a385d0ae82ba0ea50b7402be77c50402917df11 legacy-trunk
+55578 0e80fbd73005c6ecf6a914e5f0149b6732fbe4fa release24-maint
+55579 cc0aeee58a4d8729daa30ca92b993749ec72c9a5 release25-maint
+55580 cec6d96c084a1696df0850a8579d2d3c3dcc1f6b release24-maint
+55581 34e8e03e921f7e477af6a0c50da06c38010d145a release24-maint
+55582 2f4d920a56fc0f41e20cdb54ef33af96e31743e2 release25-maint
+55583 dcb43f40390ba792d6e69b666d61683d7bfb708f py3k-struni
+55584 1ec1afa2bdb58c38c409460df550b80967a98b17 py3k-struni
+55585 089f449a20cda01934fd3e720f99bd87f566a371 py3k-struni
+55587 85c935dbbef26bf40478172a551db2ce18ffb4a5 p3yk
+55588 04786ae52dad42127d5b0d725e71b7334742d96d py3k-struni
+55590 bedfbdcaf3557cd00fa4185596d4b59c8d3d5ebb py3k-struni
+55591 9657c333c4ea8fc0d76c8adfa1ad11e555580542 bcannon-objcap
+55592 3877f37c98610bcc6e67c324d48835fdbabfba14 legacy-trunk
+55593 e746a06b3eafe9ba0919c00ca5d7f6f3563d8b8a bcannon-objcap
+55596 00f94d35c61ce7ebb1d317115e9641f9b22c5256 bcannon-objcap
+55597 1ea4b3cf9d9814e7549f19e5af6b88df7df44bdb bcannon-objcap
+55598 5bc7f56f5c33def88af7ea5d7022313d90478b58 p3yk
+55599 adbf681f1bb2eb75168905235671014340c5d759 p3yk
+55600 1056530616ac3b2d833fa13481e08996b1f82823 py3k-struni
+55601 e7162b6ca7a040d8acaf8e47e84e540d78f77dd4 legacy-trunk
+55602 389077a54fce3ec89e7e7fa64781f1c46f4dd26f legacy-trunk
+55603 fbf342bcb78465251ae913bad6ff935f282fc322 legacy-trunk
+55604 ec3b8e94a35571e5955b579fa1f1232b30659a66 legacy-trunk
+55605 f28bed264b02cb3202aa207d74cb5e00eee05c82 bcannon-objcap
+55606 5e43c7367d545a86b2603b6ebacde0bdf6e4b446 legacy-trunk
+55607 c36c8879a8dad9845719eadb6ef6804e6516620a bcannon-objcap
+55608 aa73206c9ce6756ebb6347a25596d9829cadf5aa py3k-struni
+55609 f6a9e034cc62824263eda478758d860ebc283fb5 py3k-struni
+55610 249b525e1ac0e980b42a98cfc6ab4a97b0cae0cb py3k-struni
+55611 b7cfb3fd8db05994df3a3d847958e942789b026f py3k-struni
+55612 c3287e195a1d583eca2eff37085933af2443da74 py3k-struni
+55613 9baec2f54509f68354ddb9a02e577ce5f19bb49d py3k-struni
+55614 4caeeb4131862fea1c9ae7e63aa6efccce6b7863 py3k-struni
+55615 3fda9e6a0b6d1ed3b7989cef7e57be51424d09c1 py3k-struni
+55616 81d5b0071169ac3b143184c58b724089b0bb1271 py3k-struni
+55617 9de87569181cb8f31fd1fa074f90cb80d20956a2 legacy-trunk
+55618 ade7b0693e076c21393d12cb4665e9bf897064f0 legacy-trunk
+55619 a9ebc504f69d8ccb928b22a3a7628b0154609f2b cpy_merge
+55620 758666e27fbefb41645813cf5a07f8d943416a59 cpy_merge
+55621 8b4fb71fff1d366371633008a180c9d2754d41df cpy_merge
+55622 aecd78afa5a26e94387b704a4d2906997c98fa59 cpy_merge
+55623 0e7c70d41a19b06e93d37da6c1c4041bea043dc1 cpy_merge
+55624 489060e97d17fa874ce8a71b88cb8785410843eb cpy_merge
+55625 8d637d816f75417b0991d7c2a7870fbc39bff5b8 cpy_merge
+55626 370052dc8992f34515426cabf32985c826d9c381 cpy_merge
+55627 6dd9767637bb43d7fb079eade786fe8510c4217d bcannon-objcap
+55628 d5ad9149360bb94d61961eb925e9f929a8e10e45 bcannon-objcap
+55629 37ca4dd8abef4693dc2e6f4286fa2ed2e3573fb6 p3yk
+55630 de51aac46b1bc89453e864a0c796c4d621751f49 cpy_merge
+55631 ba7eaee338227918b605a2c5a024620bdf6a51fa py3k-struni
+55632 5ad2d7700d3c5050593a5dfb921c581d677ef72e bcannon-objcap
+55633 5381b4e71a0406c922494f7d294b0877eaf4fa98 bcannon-objcap
+55634 503f5a5646d17a09928b35a12ed174f2f8105c44 legacy-trunk
+55635 e14ece777b8b45b8f992ef727301e73a2b6b23be legacy-trunk
+55636 c7834971317cd49ba2b652e8133e8129d81af618 p3yk
+55637 885d0ef90e0f441ce57b2a1fbb2b1255172799ae legacy-trunk
+55638 06e6d6215c5b78bd13a91b59ee02ae305348c1ab legacy-trunk
+55639 76887e3e8e57a6ad4d8aa2ca4a02e62186f23681 p3yk
+55641 ae805798fa6782c6bd95cf06af79f008643fa227 p3yk
+55642 67ee4696d149ab67b5dc90f7e9ae10fa7d680042 p3yk
+55643 377b5dd6293da996625e9abbd694595b835899be p3yk
+55645 a1ee256fbc8f84598aa25050c9449f7a7f194db5 bcannon-objcap
+55646 2ae9975aca205e6a01b046fe728113bd0e2bd859 bcannon-objcap
+55647 8b1cdf9321fd1360a100551a29b63150e37e0faf bcannon-objcap
+55648 93862aa76f7c2a079625657d75ed991f99cf0d21 py3k-struni
+55649 9b1ffce256b9aae686596b965d5c60c219ca424a py3k-struni
+55650 6c2fa71dc459f38510e5a883c6fdb6998eb6331f py3k-struni
+55651 492687695c66c83562fb643b086c7d506f5cc080 bcannon-objcap
+55652 0982fb08e79b1d814350f6cd627f56342bf040ac bcannon-objcap
+55653 003ce36dd202234908c5a77a20e9cecebc05fb2e bcannon-objcap
+55654 188216b43ef6a74b371eb46f8bad92d15636b2fd py3k-struni
+55655 37a2856d8f0e1d91ceb7316b88ef10868a487dff bcannon-objcap
+55656 75b9ce1a7745f3cf41878c87f7a8731ddd6837e2 bcannon-objcap
+55657 62e394d50aa06113396197338924f498a5429636 py3k-struni
+55658 6796f0cb0bea481008de1145f1ab190829d5e5ad bcannon-objcap
+55659 defe2513b78e1710547bff6d3e4f4d9f3ff01d42 bcannon-objcap
+55660 cebaf7c3ab8c750a8161e9dee3de21d7c4ff7782 bcannon-objcap
+55661 b6f04974d8a77ffd8a362f7a3d440b6b0affc084 bcannon-objcap
+55662 562602c9101d9f1eeafcaaa6fa89a41c5417b37e bcannon-objcap
+55663 36a05696be821809265cddbc3cb53891e90c73c4 py3k-struni
+55664 f40ff2d738ea4264b30eb8794c39ec6829a95988 py3k-struni
+55665 c40bfb37fa15424e904d3ad7318fdce8a26ecf91 p3yk
+55666 418059994e47222cba9d489b26f27176a1eb1e2d p3yk
+55668 aa4b72549a696827e0c434a17b08decfd20a967e p3yk
+55669 d5bbf97570e3626dc18c1120ceb3115e34c61a09 bcannon-objcap
+55670 e71de57513e1bd3b2cb5e5f9a79bc6311b838d62 cpy_merge
+55671 0635a6ca19800220e7dd4649e228fb445d3ec375 legacy-trunk
+55673 7d379c476007421453963779d566524f28e20545 p3yk
+55674 3affce2ef782cbeac45dd3e63fa0f48d66a3ae45 p3yk
+55675 dd3963540cf77094090a2944152bbb214a0e070d p3yk
+55676 ddf0471a6de373b94c4fc6baffdff2e690f1dc5e legacy-trunk
+55677 aaf3b6d82b63f36dd8758cf772bcb5ee466356f0 legacy-trunk
+55678 275d87a47f6414fe69f34938401d5ac0071a3f46 release25-maint
+55679 cdea094cf0451f670f642368fe53b2a2a07728fa p3yk
+55680 394ab5ff1854e416ad3d2673993ff05fa63bc253 cpy_merge
+55681 ba8b5ad8e76ebd7eca5d0ac28a5dd3d0063208aa cpy_merge
+55682 5167857851c109d4b264aad7a09302551c1b202c cpy_merge
+55683 41c7cd16b198c006da3401206c57bfd714132fb7 bcannon-objcap
+55684 acd1e262499dd28cfa3b4df4429a68b7234cc617 bcannon-objcap
+55685 a6042c7d7c55fa2c1b12eac078fb0f15e5cd7639 bcannon-objcap
+55686 5c29411a05a5f59c5ef810c8d67e1e0c5a8476f8 legacy-trunk
+55688 ad6c5b88b5c4b01970e0c1340aea86625570d934 p3yk
+55690 c2dc4d17e98bc404d469476128bf57381587617a legacy-trunk
+55692 17699931179e8f3056b954739da920f8cb182620 p3yk
+55695 1200c0e09553765912db19db22393c5a6800fbff cpy_merge
+55696 0e29bb80e2278ef62e5d23426923aa962be31b05 legacy-trunk
+55698 8e7ecbd8aaab18768601731010168eb5836c865d bcannon-objcap
+55699 0f424de456db460990ee7564d3b13fcb678e2a07 cpy_merge
+55700 bb942b60b0fef2b62f597526322a8bb4264d90e2 cpy_merge
+55701 dfce9a2635e96cf12a5352ba83e30b22b5059b01 cpy_merge
+55702 df3f76ace2d74d73de903f058dcae85b3a86e3b2 cpy_merge
+55703 af0ac83602b4786a2115e5bd136a5407ddeb9157 cpy_merge
+55704 d8a6afa6e8c60ee75d5a0498f556472868997935 bcannon-objcap
+55705 d0b4bbaafaae4c415b55f9b7b0f97f8852704a26 legacy-trunk
+55706 dd4689d0ec85b6c103a5633d400c9669ce1f251f py3k-struni
+55707 f287b88c3c21cfbc54425321eaae245a08ff0786 p3yk
+55708 c4511150ef607120e6c39fe3d9f7c4db44e3dac4 p3yk
+55709 71d861ee9ff0dbdae07ae3c40b32eec18a3066ba py3k-struni
+55710 b8bef9a1cdf01cd81b4d6e751a6806f4b4bd3486 py3k-struni
+55714 dbd2cf40527825fbf114e4a936a06e72fb6595d8 py3k-struni
+55715 127f151f317b77ea61338d6767bd8406d90ea277 py3k-struni
+55716 b380c9c49738aca05a153ed65ca6c7a38e6826ee legacy-trunk
+55718 cef07db1caed1a0827e49bd9171e43b52aed98d9 py3k-struni
+55719 91bb19813ca611fca21081df2c03e0d055d44578 legacy-trunk
+55721 c61caaf561630a1ea70d4a504e8e78676a218e2e legacy-trunk
+55723 667c1a7279c9f7cb487836a5769f7b1edbe23015 bcannon-objcap
+55724 5ca7d170e4312f540b4d602b8ee22e8f23473aa0 p3yk
+55726 ccf20992538369e7f982067c55410d3a8a03602f legacy-trunk
+55727 96861a041f546cf478f769698634fd3797420a29 p3yk
+55729 2934af05f8bfb092bcd1c05dafa74ea12bec8752 p3yk
+55730 9acb394780df93619bdb04e6d23e1c5526aaef9c p3yk
+55731 24efa2e448bce2fae10ab4c77fa1b834bbf67ade legacy-trunk
+55732 90487a887be136fbe9241be77e1eacfe79a156e1 legacy-trunk
+55733 fec1296544ab96c0ef5282bde4b24cd3cfc39c14 release25-maint
+55734 f0121b215d38960313374d7cfb6ab159382be443 cpy_merge
+55735 fbbf851e230a59e5fd639c4448498f8b78fea757 legacy-trunk
+55736 da51f7f908cad8fe7fd91b921dc38f853745e197 release25-maint
+55738 dff624b2a2491042e728b215e4a9225b2afc7fec p3yk
+55739 f9f6000327e27bd2eb8d4ac5b11934bfd499374a legacy-trunk
+55741 328e459eb67029611fdf8a38756033382ff151b1 p3yk
+55742 7b3f64b3e739388ed43fd0b4daeea84c07999698 p3yk
+55744 04f4b557d3c4511b3ce10e31a264dfa9a051f805 p3yk
+55745 04186f52192ddb13e3e2ef3103155b8841d38394 p3yk
+55746 7e0c220b55a64033c83d87b61adc993cc9e9e923 legacy-trunk
+55747 b4f13c7fdfd88d168a15d5222db0a0d938373c6c release25-maint
+55751 e31d2f95f2254d246d3e59f243bbc9e0e35fdd97 legacy-trunk
+55752 e1997283417088dacb679c5af210c1df8c79be32 legacy-trunk
+55753 82b93fa91dcf3413d02b97ff2ecd1909c36e1462 release25-maint
+55754 abde083843cd2ca3219afee85472fedfdf9d8635 p3yk
+55755 b8abdfa1c9afc1002d122950f3b29a55c40df03c p3yk
+55756 f6fab1c707e909ffd05794cfe1f6df582a01ce7f cpy_merge
+55759 5014f8daa57fad5786baa7df43a0d4654ce3ebfa py3k-struni
+55760 e4ab08039c75f80fd8f8ee955f60177d5567dc06 py3k-struni
+55761 73dd2da31d37ebd83efccbb50ca852235e27c50d py3k-struni
+55762 8bcfc46e444b58266bdccb1f1aa60bfbfe139c59 py3k-struni
+55763 53963a2f56529be8c165484e5de6cdfd89a8f417 py3k-struni
+55764 5798a2fbab0304f1367bf158692b89c4dbf1471f py3k-struni
+55765 71604d49a38639eca1472f17d76b8583911a77e5 cpy_merge
+55766 c36ac67eef5b776a12c04753f708a5dc9acfbee0 legacy-trunk
+55767 4b34faaa977de8969b2e2b9458e911569269012a cpy_merge
+55770 b6c1a1a15a6cdb4501a058fe0d39608bc8991baa legacy-trunk
+55771 e3fbdd7cb969ceb8b2c84396bdec88391f6ac027 cpy_merge
+55772 76194e682e21cc6ad53fd4c430e3452c3dc8ed96 release24-maint
+55774 c5cf9a4f4fa979cd17555919b6d2875143948b8d release25-maint
+55775 35accedb5d03b48e01d79f824003f1f6bef90912 release24-maint
+55775 cfbcff66e725ab428e3e9a2b15a2c77963896cae legacy-trunk
+55775 01813841d64bfb4366ce0dd11a6e0f6828d2f60b release25-maint
+55776 39a1a22f96cf63f13429d75aa420e782c0f8842d py3k-struni
+55777 b3f61bae10c38cd8594a0ef3105b1b6fc7281ae2 cpy_merge
+55778 ef37431ebf2c945e1e3ac813bfea42bf961dd7ba py3k-struni
+55779 4c5fbe65b7de79359d4f157564f28d1686064875 py3k-struni
+55780 b30c75d22f34b23970a4e8e38d2886c4fb45992d py3k-struni
+55781 7015cccf29e3bbd75dc274762c209d3b4f23a0eb py3k-struni
+55782 30e61ac1d66c62ccf5409a5546b5645080fad50c cpy_merge
+55783 9af524e351f3250f31f0d64907877b8eb71a2c2b legacy-trunk
+55784 f2277439dcdc9f8ad4a8839a497898c02c83bc81 release25-maint
+55785 588686d4c2cf87eb9684b76dc5dd2919c07726c0 legacy-trunk
+55786 6fd8d524d56b2e68eeb65423880e565142360880 legacy-trunk
+55787 11930dcf9d4fb4dae6c94ef4b7c50e406161c47f py3k-struni
+55788 7e52b5bec5a42699763565359feaca89ba6802a1 py3k-struni
+55789 ce5af9a746cb208c3e2c36c0b2091c911d6290fb py3k-struni
+55790 4596727f6c39bc58f81f17eb8b3d5b33a9ca9318 py3k-struni
+55791 b05c6d42d4f721fb66bd9380932b64e17ab60bee py3k-struni
+55792 f141c5f77860e30dc39686e4595e9454b590c15d legacy-trunk
+55793 05879ab87e5b484c995b5e65e4431b495f668eef legacy-trunk
+55794 7b37a437236163f8b43a966f83abbbce6af64ce4 p3yk
+55795 9d02a4adf57481b60d2f975b6c579f1d6d1ad599 py3k-struni
+55796 b3900a51346b52c4d11de996af0087bd8d794774 py3k-struni
+55797 59b7e9346885cc60cbaed8f06c70adf84dbeef9a p3yk
+55798 c639228cfe23d44a9ca159116b9377866cb25f68 p3yk
+55799 a3261cde3a37e683b227104c5dec73f6660e3672 py3k-struni
+55800 fee71c7af52f4f0e096edba5593c112b79a46bb9 py3k-struni
+55801 942d8302f4d6f15439402406332a4c734f6c5f86 py3k-struni
+55802 c8b0e3b8b456bc8f2ab59d455e679a31e4e474f3 legacy-trunk
+55803 c2ac22c6f98d03fcd28469514b1707ba8a86a11b release25-maint
+55804 1bc901ddb7dc21b3adda7e97f1020b6a8e6d04d0 legacy-trunk
+55805 823c2f7591f502ea84e000c4353e893b1f9ac48d legacy-trunk
+55806 8150d1f010aac566f23d02fa69e955c767e1e7e7 release25-maint
+55807 14745b4fa718a59f5d51da44cf6e988c954972b4 py3k-struni
+55808 827ec7680199534fc9cc4e9bdcfc4cdd2165cda5 py3k-struni
+55809 cd8f165bd7e297a4a1fbbc6aa0ab292cd5011805 p3yk
+55810 c6a0b75dbec228ff90752cf2b5e3d933dd298943 py3k-struni
+55811 ef09cb01195964a3fdd621d7e15f81d2b0c9b2ff py3k-struni
+55813 54ef645d08e4fbb6c39394b0a5dbc70918daecc2 py3k-struni
+55814 c41fd572386096009714bc78f9488fef0a16e8c1 cpy_merge
+55815 e420039368b79be2b192d402553ad02825c1bafc py3k-struni
+55817 ae6ba6188d38d404e30aac7d512c6b0752330ec0 py3k-struni
+55818 6464cc638faa0d148f67e170a6a32b81cef3fa14 py3k-struni
+55819 e66dafa98403d6256446225805a8ed1333b95015 cpy_merge
+55820 14ec9673f8947c73f32deedb7452bb8de7d2cd7a py3k-struni
+55821 2453b937925e893fe86732d7950c799b789043b8 legacy-trunk
+55822 29d1af220c3c7a5b5c4a8fd0e1cc0332f8d784db release25-maint
+55823 e153ba352b513c5f8c78a8db71739ef8802f0aa3 py3k-struni
+55824 f48c197f9c38fde6f64563bca33bb3798c148a41 py3k-struni
+55825 58a13330dfde9967f938229efc5ecd19644eac48 py3k-struni
+55826 0d81a656412a17d41aa8a757a672002752c14476 py3k-struni
+55827 14b65de9b7985490a178b56b224a6cd8165f9475 py3k-struni
+55828 522a4945def80e60c723e7b5f33935e05e4e51c0 legacy-trunk
+55829 1bbcd392417dca573bdc0d2923242248f868aa44 legacy-trunk
+55830 10f8a8a919e2a0d097b7a2c49c2b44d5312c0167 release25-maint
+55831 7b84e8919b000c51324a4ba56eb74e4883caa75e legacy-trunk
+55832 b4f4ee84c30d7aae812dccf86e0310d959f266ee legacy-trunk
+55833 8691cc76d4419250ce52f2c88651abc030a0804c legacy-trunk
+55834 0672dbed5f7a978e15663d2fa64f97a1e3b6ed82 legacy-trunk
+55835 d60d0d0ee4f8c9c83729c3bd67abcb4dcbb10a72 release25-maint
+55836 2bf4dc9d0647bcae5612438d663ab9d92fa3472f release25-maint
+55837 0527ab943a4f222cf861812cb779230b88965d8a p3yk
+55838 79f13bf8dd27a28578da9d6a097df8cc4cf30ef2 p3yk
+55839 e62b606eff0b8366ef00f9af66c52687d954d801 legacy-trunk
+55840 2bd9417dacd5c53abe7854eed64489c049b0df09 release25-maint
+55841 16cee674a410e592625be460cc8cfa05f5716480 legacy-trunk
+55842 e8413971212df945090a48ebedb654d0551e5586 legacy-trunk
+55843 28805a720454002c8b36d7b58a6b0f95957312ab legacy-trunk
+55844 7c9225da5f61159b4368f3482385ba7880778946 release25-maint
+55845 e2c39a30e08dd6dc499f5b5c701d769e6ad20abb legacy-trunk
+55846 731b699423178019f062f60acd610cebb53cfd4c release25-maint
+55847 3dc507ca2e2bebb51034dddf429f9349b07c3f2a p3yk
+55848 59c6f4cbb3268ec2a40783937b7f7ed5489fe216 py3k-struni
+55849 02224da60fd183bfe15aae9dfaf1f56d0d8f83f0 p3yk
+55850 cd125fe83051b4e508789db864471c6c2f2117f8 py3k-struni
+55852 6443853ba314891e7cde7c1eb148915d171ad56b p3yk
+55853 6beb75eee9c52f2b12c9b47cc1d18863e36b623d p3yk
+55854 b1b8ee807bdade219f306c2e2318150bf7c85761 legacy-trunk
+55855 3ddaaf6148044ab79e0677b22d5274b40b91fb5c legacy-trunk
+55856 b239a2bcb24f353c18213774d40545864345884f legacy-trunk
+55860 7eaccf53adbd14c3a8b70a18d1d8e9b1fef59f5e legacy-trunk
+55861 7990bb2759cb3794c71e971c50c638e61b03d26e py3k-struni
+55862 f5b65731bd6c9fb61adb6b56c74c3fd370a475ee py3k-struni
+55864 6a4382ceb71e2c93cfeed2e45880d7edd2887579 p3yk
+55865 0e9b0b8fc3e7cf1d6fbad5c148ae225cdeff78e8 p3yk
+55866 b37a568fd441eb55a2ae9558639bb76ad0eb7c20 p3yk
+55867 2d5e2365c7db05b830e5222d4f2bc44ced78f03d p3yk
+55868 9e857b6c1e563e774f444323cd02ca584786d480 p3yk
+55869 19fa9c7d3c4f09d4c238c44f7f6703dd9eacef52 legacy-trunk
+55870 e1afe56ca6ba3080921322867f236d938c68d202 legacy-trunk
+55871 b7f8ddd072b858fa34da9ac32920b4700c69e2dc p3yk
+55872 59bc8da01c659cf81457f0ff0af019144ab853ab legacy-trunk
+55873 dde7c37f45364d7661f380babd8bae0bdd0bce40 legacy-trunk
+55874 b94f284805be70826e1a598c62717cdfc120cf21 legacy-trunk
+55876 36b8d74deb9e92102c9ba5f8c46fcf1d7278933e py3k-struni
+55877 75efe6bf8a3eced841fbefd6a47b9a60f15df31c release25-maint
+55878 71f3192915e131e2f91a9d287fe1368e8bd0a477 release25-maint
+55879 43322ff5e312c4a549045ce656d12644f19c1071 legacy-trunk
+55880 c9e3c82838c33833cd40f75d863433c52ba02c2e p3yk
+55881 73b6cebc6f727a1c9c4ac04efd7773e104b02bf4 legacy-trunk
+55882 b356f8720941b2592a2b7d2c7e4526ad2153da03 legacy-trunk
+55883 82178a6082eafbd15214ff46854f75937fa7f904 release25-maint
+55884 6f3c335ef716ffe04d8d1cab2620496fdccc3d6a p3yk
+55885 9b6c46946e02dd5cff2ad09c8201756e0501d6a1 legacy-trunk
+55886 6449850c5759a50ac26e1362c823e12e9c9b5411 p3yk
+55887 d1d79c71ff62caad88a4e3acc70a01cc109e0ac6 legacy-trunk
+55888 9d405e133d0b24776ccf037d61e6c9c0f87845eb release25-maint
+55889 9bbfd84567d50a409dbcf320cfa9c02ca5d99825 legacy-trunk
+55890 d0e4a32f6b789512eb9446b5a94b5a81a812df36 decimal-branch
+55891 160b7318a3cab6e2e2114b3db650f2f090213243 py3k-struni
+55892 180846b8755f984fb19efaa4831c2a29ae46915a py3k-struni
+55893 056627cb0e40a0fcfe51a4cc55460ee251e7c255 py3k-struni
+55894 f83cc9b31a977bde9735ac2d36734b323bb1f764 py3k-struni
+55895 96eefc7a67a0fc57e1bda45ed8ad0b9f1eef2a13 py3k-struni
+55896 3e64d0eac7748ec8f5ee52592707419f621ce4ce legacy-trunk
+55897 e0f927414dfa39a1626813eabb51234965546de7 py3k-struni
+55898 61fd5444d95f80be14481f88d5c606a370fe1ce2 py3k-struni
+55899 faa626d6e675172dab56d1bb47bf6e64a63c5e6b py3k-struni
+55900 171f0e07367126accfbc27fd8d7a5db62ec7d660 py3k-struni
+55901 95be6c3ade6e9c95e3e5018df5442fdf923ce8bf legacy-trunk
+55902 d678ba0177dafa1d211ca5c26f171af63e0feaf4 py3k-struni
+55903 3910533b66c7ad48387f386ec5ce1e514d6f8d7d py3k-struni
+55904 3c3f615edcfff7a05b95ee08862e8b657d2d89cd py3k-struni
+55905 c630e3a68883dc3490454ea7c2e38ccfb540f6a5 p3yk
+55906 57c344149727f2e4f91ceebe92e6292121a4e707 p3yk
+55907 02d3ed2cc347590022c08a7283f7557f276af590 p3yk
+55908 190e2f069b181802a6310c1bcedd00720de67c14 p3yk
+55910 5e14696868f97139f6294b10419e83b16feacc69 p3yk
+55911 6f72208c643b5e4901ab124e57e80c5cbc6ca8e4 p3yk
+55912 5c26fe07dedf5d8685bc1381350e064992a2de0b p3yk
+55913 7bf8360980f1f3c1812438e571d18d0a98e15c90 p3yk
+55914 8db0696762b4f17d73cc6aeb4a963cbd9c93c9c5 p3yk
+55915 ca693f4fd05d0e29b080833d0c63a453e88e8512 py3k-struni
+55916 8812162f0f82a698c11651764e7006126a5718ee py3k-struni
+55917 881ab1d417ebe3fedb47b8f3b8ce4c20a5f99195 py3k-struni
+55918 802c84f99aad15b660b4ef509332a942d2e803ca py3k-struni
+55919 063530fcc32e9e145cef2ca33c3466f93fc50ea0 py3k-struni
+55920 6d64721ecd268ce15e1e7fc68747c96701b8cab6 py3k-struni
+55921 3faa8c8097026be5f1c0d6040e95a02777fab813 py3k-struni
+55923 a99a96b5b3f5cc16277cdc4f50d9164c0971c0b7 p3yk
+55924 172dce5faba1dbaa5472f801d5ee43ed7650beb9 p3yk
+55925 3473a685e5e7f8e44e9b536aff2899c38fb17042 py3k-struni
+55926 af2608004021d6edb207e4f5d1952d18f9cffccf legacy-trunk
+55927 0459b88e14b4148372443062dc03dba00398962d legacy-trunk
+55928 ba5d1a3977e93d10de2979e8bbd05afc389ae449 py3k-struni
+55929 0bd75916ec581912ca0d3e3db76ac909b52ba58f legacy-trunk
+55930 d0cfff8930e55aee70ea138e5bf8a07bf59d1090 legacy-trunk
+55931 dc7a82c7ce9ecb585c28c0d58b8df2f1dec51486 legacy-trunk
+55932 bc90fc9b70b762397a1f84a45464bcaafb808c8b py3k-struni
+55933 4877008074a91b8044904ce54356e45b5d1fcba9 py3k-struni
+55934 657fe79a6dfebb3a5076feb9d733fdf10b8237e6 legacy-trunk
+55935 e8b2060ccb59c7ab509a08f5bfb9aab337881bd8 py3k-struni
+55936 45bb97a4e8b671178b653d01150bbbfa6a8fee1c py3k-struni
+55937 4fb85e6f82e5e2f0322c65b2275f6b34605d1acf legacy-trunk
+55938 e9fb06b4446e0e9e94e964c5cbc6f24a1a8e6907 legacy-trunk
+55939 5605719beee3caf5383cc5f58b08b175cd047c6c p3yk
+55943 825041fc8e2c1ed4a3bff1764058b853efdf8419 py3k-struni
+55944 ce63a5dcb0af13415f9bfa47551ca48789cb025f py3k-struni
+55945 f833b43c275689eb244e6bd1d40852561f0e8ce8 py3k-struni
+55946 fbabdb0d7dd22c4a616751e87e9170d370cfaa01 py3k-struni
+55947 8ca1d3a7f4f0f9df7e842912ae778855f9363a90 py3k-struni
+55948 de880381654af6f720efd433310ba1539e785f63 legacy-trunk
+55949 0318a0f54520e4271a98c1b79016d1727a9bd02e release25-maint
+55954 60be2761057bfdd3e4318ca503ae94dc896d960d p3yk
+55956 b5391214df35dee7e65f69f9a4c48a60e1513812 legacy-trunk
+55957 3d9e0efca5d3529643dbac9dd770f32a54483f8a legacy-trunk
+55958 50bebedc614ed54d54439c5bf62e083cd5a1e216 legacy-trunk
+55959 9e114b1fd94e83808ff50820cf4a89dad37126c2 p3yk
+55960 05f1fd31344dd8be6808a4d0ee29effe12e92384 py3k-struni
+55961 ffb1ae7233a22998f1991a50a38ce4b85f7da941 py3k-struni
+55962 37189e375ec796ab1607c5d3f981933ca76e009d legacy-trunk
+55963 229c28cb9afb2329c0f557badbd5af08b3462d73 py3k-struni
+55964 53698f9a4eb76e548b2a0b676caa77853d6d0b0e py3k-struni
+55965 5675f6c3ff83d1f307f129f02fd0cad0f8a8af7d py3k-struni
+55966 973992a7440a1cc5821085258cc6636ed292ac37 py3k-struni
+55967 b7e549857321597ba9d47d352e37cc4bda946559 py3k-struni
+55968 0e010db122c71a2e23c62e050ae2defcda5c99b0 py3k-struni
+55969 86937b0cd56a6c0aab9903436f175795485d6a2d py3k-struni
+55970 72fc7d029d3d2b3c1d6f1083f6942bfa6f740640 py3k-struni
+55971 d17a2724798630265ad0354d96464760bd9762a6 py3k-struni
+55972 36567fe02ea5d1114d13aae537f95d470a11732f cpy_merge
+55973 497fade1f87348246aa406d7c4e834c9c726fb77 cpy_merge
+55974 2cf7ce41ec60359b29c0a97ae7d0efe310550884 cpy_merge
+55975 fd8dd74470f959047ef934a99d5f034542599578 legacy-trunk
+55976 44b44b0a9fe257c748f93751d57400ccb4eaec0b release25-maint
+55977 271f686f621811dcc6328234935b41068ce989a4 cpy_merge
+55978 f65672b8e7d1fee947e6fb91a85c923323c249fd py3k-struni
+55984 85c446f4b19622cc88c8a7afb48e89143255585a legacy-trunk
+55985 4f6ce98b060d1fc6c9456cbd6f54f1a65eb4a1d8 p3yk
+55986 246324b39896b130bd72ed188c59a49a9f7f4f0c py3k-struni
+55987 5838bec7c1158ae3005765e607e987d3b04e49c4 py3k-struni
+55991 6727cc9ed09ff1f5b05db316b704949d9fc8bc36 py3k-struni
+55995 487747d910c762c02ea3de7afd6d38fe1942926b release25-maint
+55996 d6d1e86ad46c1e90d7e8e31470fa4e825a054c9e cpy_merge
+56001 ed6c82da1a6ceeb1d95d1879cd0413d1fb6258b3 legacy-trunk
+56002 9ba992f64e957f0786c05844605d2a3ab5f3bca6 cpy_merge
+56003 e4e6a4d7c16e958ce4914025391c91b8ce22b955 p3yk
+56004 7d7c480563e21ccfdc05b8a7ef183540ea3c58bf p3yk
+56005 8e8609432e56c891fa3a81b57534b48b57a8508f legacy-trunk
+56006 ced8db618e5b6bea9599681486474f124c90aded legacy-trunk
+56007 41d45c22f147861d28995ec75fcc80d0e28a9a95 release25-maint
+56009 853b8409315146f413243f0ece964a0346452157 legacy-trunk
+56010 56ec347da8e42f4d648f759a2e5a0b22680653ad release25-maint
+56011 a9aecbf5b13f023c7dc9872233388b4659202040 legacy-trunk
+56012 02da63058d6b14e9a1064429896ebba46fdb5d98 legacy-trunk
+56013 59497ec28caabe1342a645132a37015be41d23ca p3yk
+56014 0805157734f8d9dc20f8c73d94954fb351304253 p3yk
+56015 259de3874420602224679042e486928c3a7c9c00 p3yk
+56016 82823e13b66cd9e60b0a6ab2ca498aa6d8308e14 p3yk
+56017 0e204362329ede72954e03e9730646852ef92eae p3yk
+56018 b4565e096131f1d1df04179857f7038c256b499b p3yk
+56019 b2e7336feb826a76dbad96a816fae4bdbd636a36 legacy-trunk
+56020 e4f649c4f45725edf6d9bbdc6e6618fbc7039666 py3k-struni
+56021 32fe2b9e9f111433c7788211189e009c6c119383 py3k-struni
+56022 ebc87b94e6eab5d103803099583bbbc322383fe6 py3k-struni
+56023 a4ae62653a5cb169cde0f5aefd50ba14be0ac711 legacy-trunk
+56037 7c892e73e8e49f50558a26091f2169aaf9b4c6e5 p3yk
+56038 aab9080ac4c7ea369e2d78a0d164aa0ef95536d0 legacy-trunk
+56039 66c8347a64ddaed05c1dd8586806b7e86689581c release25-maint
+56040 04a4185bd4d3cc16535d06c91d965f5a6e34b57d legacy-trunk
+56041 67f7097c34f3499828051fac6ed324493d0517e6 release25-maint
+56043 70a0831feda690e44a529810f28bf298cbceb308 py3k-struni
+56044 4db0a0cc57abee95411ce0d199374cef2f28d42d py3k-struni
+56045 04139e30e64da951ef7fd588f3fa27b770c0669d decimal-branch
+56046 842533477cea54449eb1777c6256211f55142526 py3k-struni
+56047 1f06d5ee40bd7f2c1ac87a301f6b89523a05e299 py3k-struni
+56048 6710f453cf4a8a2e95759b7bf3fe86277d20ff85 py3k-struni
+56049 383c8907bea0448031dfb84f7ce5143ef8e427c6 py3k-struni
+56058 6b325b065aedaef31dace5ba96e77cd3c1a190fe bcannon-objcap
+56060 39eaa9c0246e4a2b20838d44c6ef2fb890c9b6bb p3yk
+56069 e13d5b1053ef8319fe6f1e208763d842e2366d09 p3yk
+56070 be9de05bb889cc2b9d11ed0578958346eaf88b80 p3yk
+56071 95927684476be16bdb3fa07ef52e4a71db839b50 p3yk
+56072 f97b66e9aa8f0d7b66f6ad2c0fb4a6f2ed9396b7 decimal-branch
+56073 4590129e4c2b5df8d4d267da89e2dc6d031754f6 py3k-struni
+56074 79c2656056f675eaa850a25b4e017ce52df7d493 py3k-struni
+56075 8fc93215c0ccfbb0408814ca73ffef303fb86db7 py3k-struni
+56078 c291d2f6d017f2515fcd7194cdc75e90cbf424a7 cpy_merge
+56079 b9bf7c760a1025bbaec7c29144328ad0ddfe729d cpy_merge
+56080 9b56c916253474aa76b14b7f68a3b994e0e7e0ef cpy_merge
+56083 e876f6439dc7bc5c2b665edf868de44b57cea648 cpy_merge
+56084 41e8ad2c9ba991c95a021394c9dc5bf284369d32 legacy-trunk
+56085 d837b5846d414fcd80f69f5138fc0f638b01163e release25-maint
+56089 9a6ac9a7e3a4ff9fc6913a292431322da68b681d p3yk
+56090 db3208704ac0af9d493744a0dd26045cb15cc157 bcannon-objcap
+56091 705bc73ee4331c8c30c8cc23f2081f0c3969bd65 legacy-trunk
+56092 b0074fd92621c673c172be6392a0027bd3da8c47 release25-maint
+56095 bf6eb8847a4244029db0fda53b68a5850955a881 bcannon-objcap
+56096 159031db8e9f28573075e5ea5a6b2c75f319f89a bcannon-objcap
+56097 633b04947ac4605c064b9bf89c2c0d76f9581cf1 cpy_merge
+56098 bb09ead0484053ada95587072d813f2cbf0aff59 cpy_merge
+56100 a200240dea8ab7639e5bcae45628d89fe001e85b bcannon-objcap
+56101 3f589c564426d87c1d0572d302de60952351beb5 bcannon-objcap
+56111 7a118ac149a0667003a5eff3dc26f39ae86ef3d6 bcannon-objcap
+56112 50d32647b035652ab2752b7320086d27ec2c5eff bcannon-objcap
+56123 5f148f6e0a46798eaeb255dbd28d1007a1a14129 cpy_merge
+56124 314adc3b7bb47998b9de693d126a436afcf416ec p3yk
+56125 7ff35ad466ec55e8db3bf33c70c9c7f61a86037c py3k-struni
+56126 863ed7cd45dc8ed5661d3971cf0da762d070a0db py3k-struni
+56127 4167680b3ae24f3f62c109bc4df6f2eb32b614c4 p3yk
+56128 a8582e25748b72957fcd47d29da143bf42e6b631 py3k-struni
+56129 da4cc67673a851b6896117c29a0400292eaa334d legacy-trunk
+56130 c76a94322ccc88cfc44197afbdf52678eb8e18a0 release25-maint
+56134 78bc078c7350e2f9ff621af43360e160f31ad886 py3k-struni
+56135 83753599420dc938b2cb5e0514740d1510ad9dcf p3yk
+56136 2899cf8ca5725f0a04199d28ae6b3d9be32c500a p3yk
+56137 dccf14fe00ecd3cc1e647ae12310d729320f6ac0 legacy-trunk
+56138 908580b9c8e10bf2b433cbe9fc4cc10ec7f70c81 release25-maint
+56139 f5357124cefe54212d2042dd573adbc7cb2d5857 p3yk
+56140 1f7b66a9ffb0d272b17b0d9d6090ab7d86a81380 py3k-struni
+56141 e3bcb984b24c8e9d919a4ea669b7f215591be38f bcannon-objcap
+56142 d4c4f89c777d4539adeeeb3cbc0080128971c2d6 p3yk
+56143 407d174db6dec7ff77a4a7b0693463b747a2d01b legacy-trunk
+56144 c3ea2779c6358a52535a2ce6462767bf8c06a3fc release25-maint
+56147 604bfa63c11389fda93bab7df144fe998e01be57 p3yk
+56148 21374369375c16598f7115bfc3c20be8bd44c87d cpy_merge
+56149 ab74bdbf6daafdb7e1cf8f751067f7d38aec73ab cpy_merge
+56150 eb2d525860175879fad59565f42fcc801369f7e7 cpy_merge
+56151 feb276c089171c8df283a1d1d8bea6bb5be7c7e5 cpy_merge
+56152 c2cc1203bd69c96ed9823b3abbe392c6a9f04d88 cpy_merge
+56153 817cbff9fbeb4db445ea424524894bf6254030f4 cpy_merge
+56154 8a17e4c42a35fb969b9a7e464f5b0489ec0ff574 cpy_merge
+56155 5b1e74fc42b81fb506c154537909a1cd40f9c0a2 p3yk
+56157 a53e48be6df9552c62fd613047c1c67c971d4590 py3k-struni
+56158 0dc62647aff0ccdc79541bb49a6971d8290b6e94 py3k-struni
+56159 ae870228d5f334e391727563dac98ecdc068ab13 py3k-struni
+56160 31f477b088c9f623bbfa1e31c2e03c3303f51c30 cpy_merge
+56161 8eeaa9923901f38845220977fdeb711735e9f359 py3k-struni
+56162 0102f5e537039f626864677f8ee20e97ce43f772 py3k-struni
+56164 5187ed68abe0b8d3e3e71a1add44e368275abd67 py3k-struni
+56165 8a94ce502209b0955a41eb6275185d2411faccc2 py3k-struni
+56166 e476997048a0ab513d57f221eea012ac0e80ac32 py3k-struni
+56167 e6c5ffa6dc673814efc948d8298d9ea4019ce6a4 py3k-struni
+56168 40a6b93f9e0be8a116dc6f6a8c9b1c14f6e1270c py3k-struni
+56169 3f782781020be22f951b32cf42d6a0821476fce6 cpy_merge
+56170 b0eaba8b9f029356233ae1b772bd8fa9a7b42070 legacy-trunk
+56173 796c7962393836751c9620cd124c2a58cc4601c0 cpy_merge
+56174 8b2febfda5f99a39ee763adf31e0fe896b418a9e cpy_merge
+56175 c4044e47fc1afed0e74f59fbd4a8d25b730d2d45 cpy_merge
+56176 9e5a39609a208dd1ed0a49edf4de702d202b9ada legacy-trunk
+56177 d6362ed548b0b170dc523b9fb030e95b00ebc23d legacy-trunk
+56181 7224e42081bd381bb988ac60b594699015b7140a cpy_merge
+56182 dd89605126e585cdfd1d7d0688d4b8fc49498150 cpy_merge
+56183 dbc753c02007362de7058c82aa2cd41dd3d71275 cpy_merge
+56184 9c08d9169c1cd449214113131131c1783e75f1b9 cpy_merge
+56185 37413f621120a28b0475b960897d4d6d438ff42d cpy_merge
+56186 04e24b79218af2891d828d7d94d46fee9964610e cpy_merge
+56193 e62e2b81136a22d967fa472cd428b2df5fc29326 cpy_merge
+56194 b2ffc028585fb2d0fa84941ef9c49a02e12b32f1 cpy_merge
+56195 4fa68387b6b359e9c050e62d7e15875209363bd2 cpy_merge
+56196 aa30b2b0598e4807cbb495dcd5b7b829c5710299 cpy_merge
+56202 537fe8db8334989d03117974fb62f2cc02979b1a p3yk
+56203 74d11d4428985ca864d09ce8a431860afe0bb034 release25-maint
+56204 782f4b3e4db08e360d2a0c2f9e5a361771014e51 legacy-trunk
+56205 2638b974937147b8819c6a4cf9ff4b2bbf009031 release25-maint
+56206 ec4b73cb2443947671b173d48b8771c229601250 release25-maint
+56207 d89d900c5d782d6f041a220082b1f2fbf22518ea legacy-trunk
+56208 bf222ebff0e54743c5c4b7c66acfa8fddb8575f0 py3k-struni
+56209 0eb840f2dafa9d9a219e8c5a0dba2054859d0eda py3k-struni
+56210 a62eccb53f301bb31b4fbf96d93f85882baf2ab0 py3k-struni
+56211 bff9ebabfc155939c4527ead8621a35be67e892c py3k-struni
+56213 16e83bf81de9889eb8cd02b191ec9da12398b2df py3k-struni
+56215 dfb8858c06640dde46ff2aef7f2fe234619b0fc4 py3k-struni
+56216 78203298b42b7944b5bacf9eebaca6ba1f318fe1 py3k-struni
+56217 29ba6c3990901de6904dc570c6726210f58d0cf4 py3k-struni
+56218 6b30bd130dc17d8c0e7d34440d59fddbf1f9a385 cpy_merge
+56219 f4b99195662fdeb5f89917a23fb724bb50efa16b cpy_merge
+56220 33506d13dd790ddb8c98745b03b94caa176b7919 cpy_merge
+56221 d9d482d038d5db21d9857fc45d1e61b6b5b61dbb cpy_merge
+56222 402a06ecc613106f2917483d4b5a897018b905ff cpy_merge
+56225 f0979a86670f47c78d3de411b43099288623d52c py3k-struni
+56226 e380475503834b68c2b41b305d1a2c20711145d9 py3k-struni
+56230 acd1f642706f2c77789a44901f9a9364861f554e py3k-struni
+56231 9d0d8cae1cc73afb225988f7bfd983f2eabb63cc py3k-struni
+56232 3db0083f66837d012d860d6127c8458b061e8b8b py3k-struni
+56233 91ade67ab230dc50cff8a9ee96d5dfff74f73140 py3k-struni
+56234 f0a9613fcd933bacc459750aa8a12ce908077c3e py3k-struni
+56235 8cfdad20467637971f8cd577bd6658027277ca02 py3k-struni
+56236 ddb919dcb4820ff0522bfd205e1559b953087844 py3k-struni
+56237 8d4b69e31581bd4d81226d717f14a862e684e4ae py3k-struni
+56238 b2dc31718b03f26407dfd57df7026f92256114f1 py3k-struni
+56239 f4a1b76a5a63d3aa4d6a433a7c37852191b1c13e py3k-struni
+56240 56215071c742e7b509cc7b46d1662bc969c414e9 cpy_merge
+56243 9f99ea4f81e92fc90596b4197a71ccb83c5025ba py3k-struni
+56244 3641a20630f3c8c938f365139ca2a00dd81809cc py3k-struni
+56245 0e4460803b4a8093547f29d7351f00679f49794b py3k-struni
+56250 8b31607caa0cb1888f77fdecb873dee7a3bf046e py3k-struni
+56251 9b38660421ee9b9fd451307650f5353b097f19ca p3yk
+56252 bf5d04e0da4c75224d2c32a6c2e40b9fb774557a py3k-struni
+56253 6228062909f347db0772a2e40019b40e5f76efcb py3k-struni
+56254 747b1519a36cdfe06fef7cd397139fd13f689cd0 py3k-struni
+56255 1dcf1f10862c02205bd5cf45169c05122f3764ed p3yk
+56256 e9bfb24f96e063d504a578aed3a4d25403f0c49e p3yk
+56257 90fcd082da0dcace87c5fcd3d4276c57a39d9247 py3k-struni
+56258 81930eaae7158fa308b3b3a9174a1828a21e42ee py3k-struni
+56259 e840a4cfb41f6e876130171cb37b995fac28a742 py3k-struni
+56260 963f50ed2b4f8bc71b78b46706b6eecd8341604b py3k-struni
+56261 c6a8a7df37ef65cd39009908c40d7bf0764e516d py3k-struni
+56263 79082cc14bf144b24a0997a6e7bfd1fd540e3f48 p3yk
+56264 1ac2c1b80324054a08f42631a73cbec72a2f2b85 py3k-struni
+56266 090588a1749033bd2f531d5c82cb787d5504aa5f py3k-struni
+56267 75d3caa46a936b10f5309f108b06ea09807c788e p3yk-noslice
+56268 df47950c83708e9bc8c17c86b5c1d985029ccad0 py3k-struni
+56269 bd4e372f47985404674d5e889e45e6e14bfdb8f9 py3k-struni
+56270 a355359e47b45871a66ca156d2a1c6dc9c83f5da py3k-struni
+56271 5b3931ae262fc7de074dd20f7149f45f41152b86 p3yk-noslice
+56272 a838b8c6410363c8fb5440721f623c39362a8152 py3k-struni
+56273 516dc723c89ebb696c7d785170b4950d3a3ab00a py3k-struni
+56274 3befb5adb34ebe6caebb6966d742881a892e9361 p3yk
+56279 c1a60b4b83d39b28d35e472273002e67557a5cad py3k-struni
+56280 09bf35793bcdd59369369cfb7f39ac52decba9d4 legacy-trunk
+56281 7a24fe70c16dbb4df6301a67046cb0c49002bf9f release25-maint
+56282 854cc4d5a33d8afdc7cdb3afde26e6c7612ebd53 py3k-struni
+56283 bbc094c328efd91d8e68414f880eed6b8c8c0b35 py3k-struni
+56284 e5ccfeb11cd671199140b403189c3c3d3c551e28 py3k-struni
+56285 9b72f06369864a03ba9bf2cd0af0d9ec005f7b6c py3k-struni
+56286 d1c7c2543903b8d725f8af487593b7a4a1871ab8 py3k-struni
+56287 7c6a795b525acf48f0c3be8c18fc4009cc693901 py3k-struni
+56288 ca3cfb34e3c2635975d51ce1886a8e372712e5af py3k-struni
+56289 23f1d2c36d12cf3852e38b548970b9f97affd2c4 p3yk-noslice
+56290 a5c23422af6c68ba5ff4e6ca44350e837ab05a90 py3k-struni
+56291 ca065b51a6166d573fa0187ceb760f10471c668a p3yk-noslice
+56292 d5cf191699046273b7027b117ec3f58896c1559a py3k-struni
+56293 255bd43ca78f79379f62a4804e5e36a344de77e7 legacy-trunk
+56294 23ac8d140a8a2e95c4879ddddd326d7e6fa8f146 release25-maint
+56295 196e5c6323a36b8feb29960523e3a9f79da59277 py3k-struni
+56296 6319adb0041d6eefec20bcc62f3d0e46fba0fac7 legacy-trunk
+56297 8b81580ad0c106074ea67d5b3d783865282193e1 release25-maint
+56298 86d1dbfc58331b620533bd42df2056fb94f53250 legacy-trunk
+56299 b43e5f3348aea952ac4c924bf5fb7bb5f7ae5b57 release25-maint
+56300 293b83f9da9fdde676de94aa65dd4364f9493e74 p3yk-noslice
+56301 7c3784bbfc09ae8bb0713b8c223b9d34842b1914 py3k-struni
+56302 248a206990ae09b9bed1d9d8f3748323b2f510fe legacy-trunk
+56303 10e9c90eaf03e6dfc9378c7b2cb78ef186a4690f release25-maint
+56304 2c33df09c1c71f58d2136b721862404a25d764ba legacy-trunk
+56305 c255c10dac6a691eb654c24df25fe2116602f1b6 py3k-struni
+56306 4c49cd65b5f17052cca9324ec50972504867432d legacy-trunk
+56307 2af3f067a43102dcb3a550706b67d61f16e03e29 release25-maint
+56308 343b60b604bd93d0e66180aefe7e09758cbf313b legacy-trunk
+56309 72c58338b22b639b8996ff4c590d9679559ab19a py3k-struni
+56310 ec74084a8cba0a07a101a76e6784f7ff8507d403 py3k-struni
+56311 6cb9efb5cbe5be876872355f2a9e80934f31995d py3k-struni
+56312 3e06f2b901026412dfff8708a6f4ff78e0919ac1 py3k-struni
+56313 3fd3553e258854ea38379a7bc1d064acfde87f42 py3k-struni
+56314 58661a82338e82cf102e316e0178eb7cb22b3093 py3k-struni
+56315 e715e20816371a147ee5fdb0bca1712c8b00ba87 py3k-struni
+56316 0b8977411b07b4e6882587601826960b9528729c py3k-struni
+56317 84a217579ae59d53848cdbe19d1e0fb5a7a489ee py3k-struni
+56318 84229a9066e2f86600b52a4ccba2dcd0466d9287 py3k-struni
+56319 0681233344d93fd0de9e5e3461c816054e117b67 py3k-struni
+56322 b45c0f4448131dccb23d5817fe1f4e9d195e62e2 p3yk
+56323 2acc6359d05d4055d62e6d083ef9d35b26dc1841 p3yk
+56324 48c5a849a0c2fcefa5a7de310a6682716977b987 py3k-struni
+56325 73846f9629c567ebafa0eb00ab1cbd0c97b98020 py3k-struni
+56326 484a0096bae90f6619afc6916b3ff9ff062fb5e2 py3k-struni
+56327 0494ae7350582b5818d0961a5fc054e8a87882ba p3yk
+56328 fbae012ff295dcaf7bb4004c5d7535c34ab839da py3k-struni
+56329 769e7078a2aa7f24d9e98f44403dd3f9a00ebdce py3k-struni
+56330 7cc8496f23480c06bdf3a8cb24001871d6a8066f py3k-struni
+56331 2fd1469723a0702eb09ed6561f67003bb9b9a83f py3k-struni
+56332 afe871547b1a390f22b2a7fc11324822a8ee219c py3k-struni
+56333 10de6a91da4da190cabf57483c5c03612d65586e py3k-struni
+56334 6a097772ea86b5a401758781815fe2abf3cb72bc py3k-struni
+56335 6e65f08f127628621ce16b689daeb89beafd4be5 py3k-struni
+56336 1c3790c831fc16556af10e7baca78dc364b7570b py3k-struni
+56337 8eaf03fc3f1295d6142c8a024f10b815e5941289 py3k-struni
+56338 22d6584b87126c8fb8993838350b90b0c99ebbd2 py3k-struni
+56339 5d16f478465a53558f26dd026ff9d4670cbabdd0 p3yk
+56340 0c0d750ee75e4c2521f6a8d356663e874ea14ae5 legacy-trunk
+56341 7bc4723f562face11dc9707be9847f72249db232 py3k-struni
+56342 0980034adaa722b4648533d683ed83cf13f4f7ce py3k-struni
+56343 693be27f626fbba96ca182f5536d6e33b46136f5 py3k-struni
+56344 17bb3980483ecfbd2061cafd163d140afa3754d5 py3k-struni
+56345 1089a4f57d2095b9fbd5ca3da1152ca708871424 legacy-trunk
+56346 c280647c330cf2aad9247637465d4f4c6afa65d8 py3k-struni
+56347 7c1c902d7000312d1d8904249c3de55f76e48278 py3k-struni
+56348 76021bbb89c738376cb39aa7d79c47a31c8986e8 legacy-trunk
+56349 cb865e399e84c65a9812e348b67fabdb3810cb38 legacy-trunk
+56350 aead136ca49e299578971b9f2270b47136fd941a legacy-trunk
+56351 0d62cdd3557d5adf86f7415986105ff0d8aecaed release25-maint
+56352 b6eaa6916884cdcf1f82f43f8e3c4b7b49d3755a legacy-trunk
+56353 f33658da06375462b70b67f0e95d7f5ed9e86063 release25-maint
+56354 3f879d726d189814c014824c2aa4c8cf6433a784 release25-maint
+56355 f8c75e849956094650667d180388891c8e189d76 legacy-trunk
+56356 f01aa3d18c9d3ac006d13eb6a12fdfb1bd01e711 py3k-struni
+56357 4cf045941085450d218866029fe374dacf10cd7b legacy-trunk
+56358 599ea9e5c6c5d8e9a36586dca9fda1998d211a1b release25-maint
+56359 d8bf4267233056d5a37f5828c3a9d1269acac85f release25-maint
+56360 c29b0dbda3f6adf8a224c28b57e4b2da094f2df1 legacy-trunk
+56361 0bff4b6b92be2b73ffa39cdd677395141474664c p3yk
+56362 61412e25e61e30d1cada473c42f63f2d020e3e84 p3yk
+56363 202c37835628b915ad4eadbe1436111b0e80e73d release25-maint
+56364 8cc6507b0626bb4e10d389b892b7955710f2e3c9 legacy-trunk
+56365 da2f8948cc18d208aa814d9dcf757662b172b801 release25-maint
+56366 697c0a78d8c9005d9df01d5ebd1ce8a80abe311f legacy-trunk
+56367 85d4a02d0abb0c67417a43efa31553c2979b2c69 release25-maint
+56375 cf890e41ac1351f543a4b490af406aafdcea2412 py3k-struni
+56376 5066b0025bf086501c9ac14fa9cdb14ab784d35e p3yk
+56377 a5a3df49acf3029e42bf3fe5d40b606354d31ee7 p3yk
+56378 2d225042830573895618ef78148f2a825400e941 cpy_merge
+56379 09cd3e503235e65c6ea1f93e887b86cc72de8486 cpy_merge
+56380 a5e8dd59960ddd99d15e1d08b41563256fc5c16f legacy-trunk
+56381 45c7d4735da36c23ff149bda996f19845d76d4e9 release25-maint
+56382 8af07e11f197e26134da1add3db5eb6a6ac285e3 legacy-trunk
+56383 daae27fbb8166ede1d8f57d1edb88d88bc47818d release25-maint
+56392 c23d8c27dc9222385070b7105353cf53f63586ae legacy-trunk
+56395 18e5ae91bd2979e02d2619d2328babe1c2bb8771 py3k-struni
+56396 ebe960d1d627eed6cfcb93287be130aba9c1bc82 py3k-struni
+56397 f715bacdfd00f33bacd5d1f64ec332e26af77261 py3k-struni
+56398 191999be6cf58efa6822dd09cbf03b3652cfe539 py3k-struni
+56399 5ae774cc26ebdd70769700c9f967379f75b6b054 legacy-trunk
+56400 d062f67c32604d420e4d3bf3563ec63e19e64d82 py3k-struni
+56401 f5b5dacb9ae29bb12b4719622c69d90b425985bb py3k-struni
+56402 3f24209f251e3ad113c46416807aa670fd4915a3 py3k-struni
+56403 3772103200ec89bc88bb3b2f1b667fce50eb6993 py3k-struni
+56404 8477fc388eeaee3e8f25a511daba883e4bf15be3 py3k-struni
+56405 a8d43085a8570b0ce331a609578f25db02c0892c py3k-struni
+56406 44bc49a07e524958e82a8b99478c419bf63698ee py3k-struni
+56407 5337c3a4a273d9077d8be537065fea9bc47023d8 py3k-struni
+56408 f51d3be435df68e3d1d525b14672c0585f5a66eb py3k-struni
+56409 058abf878ad4df98fbc3306f7eecb9227d6bb404 py3k-struni
+56410 3bea8fac3a7cf6d43d6f44dbab9d090e38d77af8 py3k-struni
+56411 c4ab3ef6194f737214776e9b1b4ad3511329664d py3k-struni
+56412 f6592146c7fa68f7a1594177f43bb2a4935b4bed legacy-trunk
+56413 550141fd67c23de89535b5d292240d41a552999f p3yk
+56414 c8e624579a4d63e6bd6eed35e9e24f8880ff8fad cpy_merge
+56415 f940e470e55026e12d34d7143400ff2077b435f4 py3k-struni
+56416 67b01b05a81b623487fa2f49fa05d62e9bbc77f8 py3k-struni
+56417 a309cdb7cb330d10af1f8b93df8b9043b198d02d py3k-struni
+56418 7d16b42fcdbde2cc513fcdb427756bc9f0cad351 py3k-struni
+56438 d0719406b2c659e7db438962b6b5bc54c60bae6b py3k-struni
+56439 7ced3e8519f1418891d303777f5d85f148f716ae legacy-trunk
+56440 35eb72215630af1afe4fc1a0ac398375504fa4de py3k-struni
+56441 6775ee6d89d3f9fdb2997face1c9f2f42552d4f1 legacy-trunk
+56442 149815ba284ccdfd3d8bb1ccf5c416dae9b82bb1 p3yk
+56443 bd6acfdb47d25a6cfec1fab0a3d90c1882853350 py3k-struni
+56444 4c658377b9084754916e0af1893c4183982d4373 legacy-trunk
+56445 c1e9eeeda34f9bf283a8fb5a0a600a06347402b7 cpy_merge
+56446 1ae5f102fd3d6e2515fef858defea0d2887ed676 py3k-struni
+56447 007ed6cdd1f7bc74be8d9311d219502ddf2669ea py3k-struni
+56448 08642bd1be184ae12c2e37fd6786fccaa83a5597 py3k-struni
+56449 dfacb51d138616121795c1312838209f56c77af9 py3k-struni
+56450 bdc67dc1a95e2e40347e9c85dc059b19ac9468b1 cpy_merge
+56451 d01ae698cb5838f75cb5078b6cbd64ae356c8339 legacy-trunk
+56452 28af961038de826a507d685af8a6cd21371b8473 release25-maint
+56454 37902ea41a17b432adb603b0a24ebad57f51f09f p3yk
+56455 7f760db4e746baef18b354df09853e650f9c5787 p3yk
+56456 c02a33788a8f5ebd322f96e5ac5b339634f9885f legacy-trunk
+56457 3fb59666b2810a41d02e166466984813cd64dc3c p3yk
+56460 4999a09473434acd43e440d96b2c886b1ad915f7 py3k-struni
+56461 ac36f06a612b80e0b1145a3792e9b4efe576a82f py3k-struni
+56462 63955e3cf993b61953210c840a1e1137c269c949 py3k-struni
+56463 8c4a33079ca600d872b646279cf7904c896eaa3b legacy-trunk
+56464 3e33215c66ede8ff2c5674b7a7b1acd1061f363d py3k-struni
+56465 116251ada9058fe607e8c8225357af338013b784 py3k-struni
+56466 60b718b6fc9b1633cc24a9ddf7f256363b7e78c8 p3yk
+56467 4bbbe0c55fa2158fe216537c8fcdfb3ebad742b9 py3k-struni
+56468 c46f0afb403c407eb99ee842de22057ea35bc52f py3k-struni
+56469 964c4bf86d9a696757ee0d2344bb6394c8208a13 py3k-struni
+56470 a2c5cebd0dc51f15b7b995abe90f5fdebbfd1598 py3k-struni
+56471 57c62bd36b19bb81bdc941727a1e9a3518b60958 py3k-struni
+56472 5a9e3d37f661f13efde171cbaea7184027e2831c py3k-struni
+56473 333ff0584938c56339de7565b335cb679682bb49 py3k-struni
+56474 7a0d1baa4a53ded42451b18092d6ab549591062d py3k-struni
+56475 2be251dd2cbdf16133c4b549102211a2b79b8daf py3k-struni
+56476 6620a510e9a95110db13912d665518ade7dd7d9d legacy-trunk
+56477 e37171a4b147959f6f23ec2a08f22d4db67327d9 p3yk
+56478 fd3458a92a8940dbd7a67511a23ffad98e77a974 p3yk
+56479 4e89872f082e06b8fe892605a7e620c361289c8f p3yk
+56480 531e181f5b530f9e45286054049b2644de737e22 p3yk
+56482 12df906003ea9226f22ce318dfb1d90f3b9904c3 p3yk
+56483 e70cdce0e8b2955c44008a448f0935b9de7d185e py3k-struni
+56484 c8b850b5a066691fa88cfe52ed35e8b82a399ee8 py3k-struni
+56485 03ab8c8bb0ae184ce8c82f06e581dec41fddc9b3 legacy-trunk
+56486 23bfdb7571a7dad1ce85aa65eeb1645ac8be8236 p3yk
+56487 88ee0a5562ee22190df71f0018cfe589d37e1922 p3yk
+56488 38d1beb650bacfe2bdec32698a0ab8d259b24bfa legacy-trunk
+56489 811c9aa6ed882e405751dc6f4e95b7194f5b103f p3yk
+56490 278638cdc647aa284ea0faf3cfbdbbb0cf5cc6e2 p3yk
+56491 61859a39a87e726451b71854a7e01c67f3845ffa p3yk
+56492 7bfe9a107b29777203d64220667706e767dbaa64 py3k-struni
+56493 c152c7fa17c4d02873c7f0664fc65442c15b7d4c py3k-struni
+56494 f4af6f4b51cc3618ffb338d12e95706ef198fb71 py3k-struni
+56495 14574101684882c7bddf50158f21d31d8acb760d py3k-struni
+56496 60c76718e04a005fc776f077c1cec4c8dfba7c49 py3k-struni
+56497 f32fbf9fa60b1c89408dc5db0810f6643669804a p3yk
+56498 40998f18c5dccbc3017e0ba2553ac5cf89d81c39 py3k-struni
+56499 83670c2f1ea84c711b1d790083e2c4ae4873b673 py3k-struni
+56500 9ce54cf0dbe2a69ddaffdff0b8ed744b3823d340 py3k-struni
+56501 36b67030ca472da34ba364fce93ae415a426b4d7 p3yk
+56502 b590f4a06bf8647ca627d84177506685dbfd3817 py3k-struni
+56503 5e66bb69c1e3e486e7bf745dc746dd0aa752cbd6 py3k-struni
+56504 bfe041afafe690c0eb6850546a28dce43b3e8b7d py3k-struni
+56509 3fe643d62ecc45eb04c04683ea03a826539c4b57 legacy-trunk
+56510 fd670539c085d560226b9e3cfcde95ea8ecfb73c py3k-struni
+56512 e50e33b7e0e0ccb7114052868b0cea3d5444bc5c py3k-struni
+56513 640952df44314b4ba0dab59ed752e68dc7c2da19 py3k-struni
+56514 959e52ae2627a089ad58b0ee8c5b53d1d2450db7 py3k-struni
+56515 36fbcda80b1c457fb4ed9a2063da989cbedc13b8 py3k-struni
+56516 5b9c8dce4edd7e8cd6be1c35aaf9e2e7787f7e93 py3k-struni
+56519 d94d5b416a947af4f85e823f1d2fc6d929133401 legacy-trunk
+56520 bc8e5e1571accf0eee78de4decacaf36d372d46c legacy-trunk
+56523 30e112350e203a369f4cd5841e480e8e07f99605 legacy-trunk
+56529 746a5021e1aa8711e5b489824a5767840bd21f57 py3k-struni
+56533 0e2fa4c6a42835537220b7f9d5318ac15bda8a82 legacy-trunk
+56536 1137724930a72b388d4e9474bf5d04873114a465 p3yk
+56537 da62836dd99f773d64a1f81aa9004485ee735c5b p3yk
+56538 2fda553ac6e163db14f288d338ba57ec743c6be6 legacy-trunk
+56539 e9891d787edd82692d18b843f23b1a0ccb27faff legacy-trunk
+56542 1205d303461c323b981454eaf63f8e29b398caf3 release25-maint
+56543 27864a181f01b2392cc9f889af114f3a498287c3 legacy-trunk
+56546 795a5dcdc98203032e522277b119a1d805ca2fcf py3k-struni
+56547 d48acb284664c744b18f0f75972ede690594b1b2 py3k-buffer
+56548 5f3f54c0c6c8eb20d6b813bfaf562abc714912c5 py3k-struni
+56549 8ff89964156352f77aafe4d920bd6041d7a733e1 py3k-struni
+56551 6fa7d8fb077318f8cfaebfc89db2845f4ebf5f4f legacy-trunk
+56552 434ae66b7de04e9bccaf977817c8cf326f0e9f49 release25-maint
+56553 64903ff76ede1a0969e8b166d81a54a16e454e07 legacy-trunk
+56554 57facf34a718610c5693b4e9fe385a4390fb15df py3k-struni
+56555 a5434fada9ff49c407e01e27277f60b78b4ef411 py3k-struni
+56556 2acc8902768c447f033663889c865a95bba680a3 cpy_merge
+56557 07a577b620ec69182c4853710096dbb69fa63838 release24-maint
+56558 deec4126ffaceb06e26fade6a0a8fb8e27eb8ebb release25-maint
+56559 b00bd08a09494912279b84979d52bdb34a1d80ca py3k-struni
+56560 278c52134140f617dcff1caa07dcde8408ac8489 py3k-struni
+56561 1071f7076e8e38c734fb58cfc34bfb9c10ee9fcb legacy-trunk
+56562 20bd5be24ab56b9b985bc8abf1bd569006805bba legacy-trunk
+56563 86285b397b4d104d497ea0dc4d4a20174359eca7 py3k-struni
+56566 0546c115a9cf3c72b36051b8bebd03edff240953 legacy-trunk
+56584 9e84b4868984681e8e1fcc1e7b83bcac30b0af77 py3k-struni
+56585 90e42a0b2202cf856dc5a138093f5f22fbac7b4e py3k-struni
+56586 f672071d82fb838dc8b65d665138704b8175c050 py3k-struni
+56587 357cb8967e85ee0f78ccd9201c5637ce6179f058 py3k-struni
+56588 e9916a4e06a4dd3a51c1b5e5a7e420c4ada2048c legacy-trunk
+56600 7e7dce3089e37a9c10fbe21ab6326cf608c25dd3 release25-maint
+56601 85b7f40e1c1cf0a5b55f663792a1671e61b6f432 legacy-trunk
+56603 d3471ef6fe38a9c88ca516f2147df374a9f7a76e py3k-struni
+56604 e31c48218b0cb91a0c8cd26a497b1a507f6c0094 legacy-trunk
+56605 785de224995d5115af75d31f978ec9ecb385eeea py3k-struni
+56606 e1dae8626c11a6de09f7c6f5f46ad6b01614f94f py3k-struni
+56607 86c13ce60aade5d97873d3971bbee6969d68d5ff py3k-struni
+56608 d52bef552aa407f1a622d2f92a32e9ba9a077531 py3k-struni
+56609 3105b7cf35bea7077fba976e84adcacf6eccf336 py3k-struni
+56610 b9adad5695a39ad1089a9480df1fd300bf47796d py3k-struni
+56611 e94d5060b0c1c4a24f60725b10025e4c3acd26b6 legacy-trunk
+56612 f1f1f5e1395c8b49eced073c25417723018f9506 release25-maint
+56614 5cd5f32b4a2886488062e0163d5411ab79b18b46 legacy-trunk
+56615 365e991a631b4c565d6550d7faa225a8929150b9 release25-maint
+56617 8ad8a334be0f355fd047900f163733c550519051 legacy-trunk
+56619 e598173f95e88041f950f15248b2f61b3a7fc236 release25-maint
+56620 251033a1c2e3285da274d86cf6f45d32b5b7aca9 legacy-trunk
+56621 7e8469617b1c3d256e7e9385f6132dc8523b906b py3k-struni
+56623 0c300b29200c2289b5f95519f67a23537aa23ed3 py3k-struni
+56624 ce7fc08d5f47853141640066362d831ae17af2a9 legacy-trunk
+56625 48cfaaa828730de1a1a159ca545d21ccc21693fa py3k-struni
+56626 468621569be8e95ecd933fc9c86ec6ba2163354f py3k-struni
+56627 bd8456c9569ac253144aed781d0256ff8cc5387a p3yk
+56628 8e69ac1bd042ccadfdb84c60fdb482ecebd4a5cb p3yk
+56629 504084c04ac000cdd3cbcdd7fba92bb0b76fa4ea py3k-struni
+56632 3a015355b07aa03504122834094e0ac2093ade24 legacy-trunk
+56633 b6068dd6ae00c3e15789088d899216a75110ae93 legacy-trunk
+56635 ef2dc62d27eb7d8f319925b31e30f28be33af766 release25-maint
+56636 e1c0aa94c092f9c20e3d3d2adb4130f67fdaa8f4 legacy-trunk
+56638 3f78acc01039815b6fbd9520251021e188612acb p3yk
+56639 8b56a069614ef4a2150d2f08102369b279fa3400 py3k-buffer
+56648 392f98221d13eeac48eee03924547693d271dba8 py3k-struni
+56649 8c165d20709f63fc63b5f2dd0db8c8d383d49f57 py3k-struni
+56650 a6d26a4d672dea3bd83f244a83ee46785d167da6 py3k-struni
+56651 9898a66965bcd9878594ca62afba51df0015e396 py3k-struni
+56652 d3a5c796c8ba00ff5f0131a2bbb12fddb8790ce1 py3k-struni
+56653 67059b78bce475d3afa54f5d5aae026d5bd0d3c6 legacy-trunk
+56654 801ad2f0d0b580597dc2c81f9045be06d094b787 decimal-branch
+56655 07c2f81c267d619bc763daec9cc45151a2d48e8d decimal-branch
+56656 cf459652c35234b783df439ebe67a598866c71bb decimal-branch
+56659 6f2330e0909bec4b7b04b6d4bacbd3d04337e12d py3k-struni
+56672 02c27177df7934bcca1d6cead3a7db6d5418afb8 py3k-struni
+56679 0cbba4426cd3c4d2aa9eb80ac1f346dc0a00f7c4 release25-maint
+56681 e21d64746bd3cc4f506ae95c216cb3a14a4cc305 legacy-trunk
+56682 755e31dea47e596f30a6470a7420ea291a27b246 decimal-branch
+56683 c33c37ba9cb3b59e07b1e999041ce1c84c77455a decimal-branch
+56684 b1ff54f8f9d8313a51b94479c8844ed15561d949 release24-maint
+56685 3adb0335de506cded219e076d9fd19adf9e475ac p3yk
+56686 168d055160dc19f911174c93c02bdf0eb7032d87 p3yk
+56689 723cb9e3fa500e750e0cf0deb2d458e62590d205 legacy-trunk
+56703 7794da1334a01f7849e707a43c737efed91840a7 py3k-struni
+56704 ae72bf5ae46518ca61d5b509b4f3c5d4a123eea4 py3k-struni
+56706 46625e6122e99bfe0ca41f69f29fc62916db025c py3k-struni
+56707 81ade0144247d7875d33d852d3241410c3b5021d py3k-struni
+56708 b1bf1bab977966031510df5411013ac5bba0150f py3k-struni
+56709 6c3fa43f1d1d251196cb1f942cf03965f4694f08 py3k-struni
+56711 7401ff78eb29c03bca8d31137b81e0c79b23489b py3k-struni
+56712 535dae04d6cd67464583c2e01cb583fffae78d23 py3k-struni
+56713 e319d2d285ba3d675af6f017712f3560bf6a3956 py3k-struni
+56714 c35140559f87e8da8ce618d697bbaae53e9ba441 py3k-struni
+56715 f6cc76e4ca251bdac7f907f171de40dc4f9b9f0f py3k-struni
+56716 3ed020e95b444e30e391e95f67035208aa139b60 py3k-struni
+56717 3be2972a29cac5c70e9078187216f9d7faab0157 py3k-struni
+56718 ade5d1ac1a2c8a5039ade06b50f4adc2376c200d py3k-struni
+56719 71304efbc316a6d2f42d35b64a5ca1170d4bd828 py3k-struni
+56720 05728e52b28320d180182f685dd287956d617e45 py3k-struni
+56721 b6bdbb6326d2f0b9e197f4061b5fe35029b706ba py3k-struni
+56722 0fa84ffba7698adeb285ceeea229eed1475e627a py3k-struni
+56723 c6194480b1d5961d4edf34a8e12931f049ec9782 py3k-struni
+56724 12dbaecfb44b9147e833986473f99557248a191e py3k-struni
+56725 13335039872210a91dfd948ebd09e1a61b91f72f py3k-struni
+56726 8d69a084e3655ca5530b59eae654d46005ba4937 py3k-struni
+56727 3fe57daaa6081349678aac580e22b6bfd5db7da2 legacy-trunk
+56728 ba64fcab52142a5fb87c9ea0d04ff3c55ef60301 release25-maint
+56735 aa5ee65328fb6948a6381965a4c368abae818070 decimal-branch
+56737 ed37542f473eae2865d72e0f416c1e786aba099d py3k-struni
+56739 528a8d9ef202e54d637e6eb937aa74474210870c py3k-struni
+56740 a40aeddc0c81bd8e47a9c28e58260862254c56fc py3k-struni
+56742 f4409c5d7994d3a0fecfdcb6a18b726b95f54291 py3k-struni
+56743 d2235aee2d25502cac1962db69cd0de430a3c8cf py3k-struni
+56748 a84eadf6372e38b236cbfeb087d3fc4291b4a93c p3yk
+56750 fdbed73e5da7f5cb110938a4a880fb87f8ab03e5 p3yk
+56751 648577cc688af6ceb079729a57bfaf1e86641e4b legacy-trunk
+56753 dd74e020a132386d41698fa872eced0ada21407f py3k-struni
+56754 629185992aa2150b028d989caa45c24babf64441 py3k-struni
+56755 080f2aa180158e72e9288b892fcea07b8fd41a9d py3k-struni
+56757 49d51c1fc1778c12ef651586a9a69aaffa738d0a py3k-struni
+56758 1780035d58123c77fce8b054a74667dc65efe5a8 decimal-branch
+56759 88d7a3df5f79e5298ae6240aad4bb5f9c3e60caa decimal-branch
+56760 b45005641bca6289d9145bf4ef670cee2aff6496 p3yk
+56762 dbfc3cf1522d07a4e696c7ac2336ed19f75b63f3 legacy-trunk
+56763 9b26ee6e6d0a45dfc9ab292d8380e1949abeee07 legacy-trunk
+56764 258e2b7a78e4fe17478403eba9fcf214ea29a6fa legacy-trunk
+56775 0adb7207e4beb7b4d3f0976e35bcff31bcf2618d decimal-branch
+56777 8b45f2297dbd149b2921c2d6ec8ef473140f38a9 py3k-struni
+56779 b10ba38e6b8081236a5903a2a19d6db91fe484a2 py3k-struni
+56780 229361198e8d5ed83c659a4d08066db6d6d7845d py3k-struni
+56781 440176f061479424061a87c26b2cb52d1610c6f8 py3k-struni
+56782 3fc3cedc49ca3c6a85b18580714ed914a86f25b8 py3k-struni
+56783 81a3803f43cf989ebd84fc37fecc7f3c51f9e433 py3k-struni
+56784 f4c99cad8d2f64b27f936d53e398d59ecf017390 py3k-struni
+56785 f8281dc2e68ded7f3b6ff77e1c64b7b887ba75ea py3k-buffer
+56790 2ab18ffb401cf1b7ad0943f74da91849fe26ba8e py3k-struni
+56791 2a113a8264b162106994c6974ed5a4d3332662e4 py3k-struni
+56792 f3248c320dd03a1dc2c6e78fa67c22885ad55c4b py3k-buffer
+56797 fe5a0621f918806dbfa12e2ba8873f6b98f1aff5 legacy-trunk
+56798 7d078fa34bbf63bf2a2bae9d5504c6d084b772b9 release25-maint
+56799 b22d9fd4a785adfaa32a57f49e80e6f2e1c7da18 py3k-struni
+56800 6ba2e67580fc98b802d5034b9a99fdf95d18c52d py3k-struni
+56801 345c812f33665edf32eec0faabcafc2fe28e7244 decimal-branch
+56802 29735899ca15a0696a8593a12bfce2530d0426c8 py3k-struni
+56803 6fdd1af63fa6a5ffb7a74544bde952b102e1cb0c py3k-struni
+56804 e7fd327e0c19a288f0955d7578ca708958f31b7c py3k-struni
+56805 49d4c4cdf0c86283c1bcebc5b796d701419f1d1c py3k-struni
+56806 9f1848f596e0cc64d5c648d68d1a345adfdacd93 py3k-struni
+56808 e1150aae0f64d6db964da39ba2e57e842841426f p3yk
+56809 13dc836d4a99a85e07924813d7be0a0adfd7ed11 py3k-struni
+56810 b20cc1c0cf10e4461e7641f13f66fd1fafa8f3b6 py3k-struni
+56811 4dea3b68b013b0e8dd2c8071d938b3e99f1e0930 py3k-struni
+56812 04a14df4073a4ef8e01facdcfc88f1da1c91b0a0 py3k-struni
+56813 c1ed490bd26674dcd947747b783163c1060c1aaa py3k-struni
+56814 b65f6ac52968c663474e5baf9e8d350fe5767a61 py3k-struni
+56815 3f1fcd080ec4b5010b03797aaf73139800d4a739 py3k-struni
+56816 c8a091b842d6edcf301b7ff7c3d5d1b8b3892a97 py3k-struni
+56818 c96b4c38652c39e248333bd6fce03b9308cd8f36 py3k-struni
+56819 668a5adcc87cf2cf97e5890ef3777ab8f2e94e2e py3k-struni
+56820 b56a8d822f21b65a1e6573e7fc44320b857db2bd py3k-struni
+56824 a8f13a43eaa1e53dc2f1d66ed552f9789f064c18 py3k-struni
+56830 86fd39c2c6768dcf2aa93abe14240336ec5c5f85 legacy-trunk
+56831 89c81fd7038e63173f41741cad6b48d15e4cd0d7 release25-maint
+56833 3f6be12b953423fdbc15e67f0efd0233e7fa8446 legacy-trunk
+56834 57cd070ad3042f12ed42033a8073e0fae62e79f6 release25-maint
+56835 5f60c9e414403ae5a4f4a101f895348c085e67b9 p3yk
+56836 f4e366c392be706ec3c91f7922e468fe2fcafe97 py3k-struni
+56837 17cdbedbb15d454a3da75d7da34114b6f107bc53 py3k-struni
+56838 95d3a65cb74c70f8bfa16c41dba8327c61a1b8ed py3k-struni
+56839 96098abc8f8f6766c5cecf66fa670b004cae0429 py3k-struni
+56840 c321c2b598f174809017aa9e5672e1ef90366fe8 py3k-struni
+56841 f6069f9dd52dfa9c9b6f123bff6bab61e0479773 py3k-struni
+56847 9edf30bfc2ebe0ad81308a67813aaef59a7cc3f7 p3yk
+56848 9918989b733b5ec7f551737b78f3b39b590cbf38 py3k-struni
+56849 23d963a756962ea10b40314b4a7dcd6a42e8abb2 py3k
+56850 5fbd15c61b1250517ce1c6776fd990b9d3b446a0 p3yk
+56851 3e1a15185f8cf9eec09c664b399b6fc8820a650f py3k
+56852 26ca3d6f473ad6de567f0a1c7e097684219c9d6e py3k
+56853 db259d141e7aec02f6ab7e8b8bc75dfc4832de3f py3k-struni
+56854 4aaea35dcccf8d214ea8cd5083b3b51a91e62a14 p3yk
+56860 0c89409bda7abc60f39dbdccfa2843067d106313 py3k
+56862 df4cd92970981947a29f5d0fb1b0de651ecaf020 py3k
+56871 4865b510cf54e8da1df3b63e6fe791d8102fc8fd py3k-struni
+56872 3da0a4db21024de5b6750c33225a04de03b0da71 py3k-struni
+56873 522a3e3a03a96ce19bb86a8c19e4f6272f6eb174 py3k
+56874 043a102a170ee2ef3ba32eae45d0be6ee061a863 py3k
+56875 dcf27385f12519020678a887d5e18bcc4c10308f py3k
+56876 166c740536b5f73ab476e498cc835e66806b0855 legacy-trunk
+56877 82a5c30c1786206adc5d1d244a4a1d7624ac46ab p3yk_no_args_on_exc
+56878 be3fecd2d339429c385042f9f8a5aa881b917d73 py3k
+56879 a24e27f05e4829cb87238fd968bda9d6ed29d4b5 py3k
+56880 c0dbf45cc207298f4c070183dd05d59991be99e2 py3k
+56882 0870e8e9e99f58f6adef646f7ab38dc1fee4f3a9 py3k
+56883 f0cfed38b9d9e1f5485d606301828f16e2b76b4c py3k
+56885 0e5aeba3c67db2a5c486b38bf72704ae0fb189b9 py3k
+56886 507f5671e388628f5de816340375f79ed277d292 legacy-trunk
+56890 0ab3421a090677c909b9d7f48f235bc1d53c7c7b py3k
+56892 9d4e220224fb5dd7fc52730c52a354ee8601e001 py3k
+56893 cc25d160f0f7ee10b0a372c0cbd9068957724e21 py3k-buffer
+56894 eeb37c9793ea534368d049982197a47cee242cf0 py3k
+56896 f37016d42729fbef9857edc929771df8202de7b3 py3k
+56899 7703187c7c6f117cc9b015ee8974fffecc218c73 decimal-branch
+56900 930736ee93d9490a93d28fa1cb362dc726ab6181 release25-maint
+56901 346d0b84030b9df958faf8541afcd5392ecbdf74 py3k
+56902 e64286053b25228515ff883cb054c99f9176e09f py3k
+56903 d95b15a55f2c0630e0ce56060294f552775c9ee4 py3k
+56904 3ec20c4c1a4fbc5133692ef06f62145fada7c1bd py3k
+56905 affb1e87881a5f1af63f2fc3391775dbc80ff4f5 py3k
+56906 81bd3e94cf0c31d8342b66a0c2b2fb03c61c2aab py3k
+56907 3858d0b8b0ef76fbd0dabe1536d410ad9fbdae3b py3k
+56908 3a1572d1ff1ad54fecdaea06cb15e8c884d30087 py3k
+56910 f828f35014ae39bae5084d9181fe9f607af87849 py3k
+56911 6a09423164fe624f567ca14b102a75541522770d py3k
+56912 5f9e79d1e1584b59fe81ee9c91f76274096500de py3k
+56913 8d6867cb8a8db7189518ed05c5b825fd730f7044 py3k
+56914 6cddce4096a227e20ca95140483d48dbc703e3bc py3k
+56915 74a3c6826683e4f749a218e3762779dc333462e6 py3k
+56916 9c3e6440f54c323c6815216e4cb15922038dd782 py3k
+56922 43e32b2b400481ca37b8638c3ac6cc6cb7ae91c1 py3k
+56923 68ff9098b2dc836d5b0d0b4bd62311917547d696 decimal-branch
+56924 aab687936ecd8274be48802893fc0d9abf0a7fb4 py3k
+56925 0c9ad0b2fac54ab90a27fb343b2cebc02d998265 decimal-branch
+56926 d1855d0e4e03c393761076728941fcb0bc08bc4b py3k
+56927 cfadd7cc9c4577a56c91b7d524aee087257c9369 py3k
+56928 a44c564026b831486055fb14ebc8c7d455f31264 py3k
+56929 077c68186e2377d45aa27b2a6b5a6b860a98d531 py3k
+56930 cf91377e2444e414a5ae4227be6e7b253f3abf15 decimal-branch
+56931 421f9f358e4fbb4b957836a641a5eb9471082d86 decimal-branch
+56932 0c0e355cf7407cd3ec4652f7a039dc91a1bbb8b9 py3k
+56933 8447ecd1bf4581b89a53ff7f9f475516ab6d7ff9 py3k
+56934 a8c7424253562cd4f4c318d411f6e1f198704d29 py3k
+56935 e0f62286a9a454bd3f93efbae720e86961a63182 py3k
+56936 65f1d419f63109fe771eb8adb7c84f86862f0c59 py3k
+56937 276330f42e7936b46f0aac4dff7ac1fc49c80586 py3k
+56938 b6625d2b378af12df3258bf198961e8e7fef9922 py3k
+56940 ac192f89c1093ca201b21f132d5a6cf37d405704 py3k
+56943 c69d122643d50d3d3b54b1f49a9d4ccb101f1078 py3k
+56944 7abacc9e39958f08543bf63e0fc4ff1a5fab8c99 py3k
+56945 3e682ae9d298ef118a592fec5770a61cc97c4ebb py3k
+56946 b7b3f4e32533eb3ff0266a9455a3ceaef0ba2832 py3k
+56947 fee5c6bbe144dab834eaef49b467b1d73dd4f3dd py3k-buffer
+56948 4b4995c8e3fd676e1aac598732c0a6ed11b9cb7d py3k-buffer
+56950 c3b34b0f8216ae39e3160f227fc1d1fa9645ce2b py3k
+56951 346afa658e446038506539fab083c5a2e68b71d3 py3k
+56952 e781085ac989e4c0c1a3f254fee2cc9d11443fd9 py3k
+56954 7f949c17cc367bbcb34c5525f740909bed4fec8d py3k-buffer
+56955 0fcc18aba385de4c9601db83d8f0f07bbaf0af08 py3k
+56957 d020b9b1d98b6ad57a96096a60ef6776e1c7c6d7 py3k
+56958 ae9cf48ed6f728fd7b03257a1f1848280caf8e4f py3k
+56959 0d9953d7b82757cfc4932c9ec176aba5c12fe547 py3k
+56960 15019eae39e827f4140a3a2eea3e03d5c9ef92c9 legacy-trunk
+56961 1381046fe8945bd7c35803f443355c2ae97af710 py3k
+56962 b90c220416351a5e6c5832ea70c041c6bc98b961 py3k
+56971 eb2c0676c73f1b16df2a7875c58c1823e01a50da py3k
+56973 d4ee54a884850bce6c862cfe23526e9669391fd6 py3k
+56974 53b73c2711b6c682a4e12a9564268a9ae3562980 py3k
+56975 54261634ad46d5e96f028d239843ef94cbe77489 py3k
+56976 7a45e8b78d63ff44ee9d01accd9b90015b51f9f2 py3k
+56978 a724279fc931a5f1a0fee6015ca56d0061f5497b py3k
+56982 fb069eafaf89f531b2ca1f69ee1e17bf1974abe0 py3k
+56983 4bce94d9ec31e4538c306ffe4c1789ce2d9bf5eb py3k
+56984 6af6bb4824d5be61c0cf07cff77012d27bcbacce py3k
+56985 47aaf3f4a038ce94ab84fb729db47e8247f6e255 py3k
+56986 0ed3d182920b8f8d64bdf348a2b72730a333f4b2 py3k
+56987 cf9b3b487fda1f65bd40a4631bc915ce5e6b2db0 py3k
+56988 377b48381a49c0334ca2a57041ac429d26cb942e py3k
+56989 5aeb261de0bdacc8f7b9ea6d45f5ea375a56ffeb py3k
+56990 1e4936964776f57ff60921debcdaff707bc5d747 alex-py3k
+56991 bbcef6de4674056db6aecc255bc6d6d5cbc20f56 alex-py3k
+56995 d68a71c965ec1505b71f5e135cb9e80a2652ded2 py3k-buffer
+56999 bfe202bffdf42fb444fe043fd3c0df1677e96ad7 legacy-trunk
+57000 bdc40293d75efb8eb0f1fe34970b8e6c3445207e legacy-trunk
+57004 9ccf9d67bb348c95c01d0e57792bc1791cd23ea8 py3k-buffer
+57005 d3371fd4910245ec2a8a478ca09efbd1c2829fc8 legacy-trunk
+57006 229d6345a73a1124530777dfe26f897cf3ae0d11 py3k-buffer
+57007 67937fee75af6a270881a6d3e134ae7b1891cae6 legacy-trunk
+57009 b623777f22b0da403c17b99ea9abffc90eb2e1e3 py3k
+57010 3c1a20365a05bc1a04b1bddcacb357b0b750a9d7 py3k
+57017 219fe39ede99f7e42318d4fb6983e865ffbebbe6 legacy-trunk
+57019 274f3ae4dcc7803407585c36628ca5f2cdda0ab7 alex-py3k
+57020 b7bd4a2689c16ce5d113c62b62db0a29d8ba6786 py3k
+57021 86faf2113d36f58da7b205cba0619919ea7de24a decimal-branch
+57024 a528f7f8f97a29c04f2dd3ce9d16e4f8948c2a7a py3k
+57025 1b91faa0de2d1e36e8e1dabde8297aa93a74cc3f py3k
+57026 9b02128521e2704aeed0b3b674b1cffec3e2daaf py3k
+57027 30c0d59db0c648527fcdfc898d737a366cc6df16 legacy-trunk
+57028 5391b5f8cd7a0e36af5a86afb8945ffbe31948dc py3k
+57032 13b23addef41d820619637175852a3236c4ac117 decimal-branch
+57038 3beef16d816713c1d7933f29acde9b4cc6b48319 decimal-branch
+57039 7c66f1119e554e02093764d7f4b631c2699e7ae4 decimal-branch
+57040 4ebea6afdc8711028c61cc91191903977f31ebdc alex-py3k
+57041 ed989dd995d244212bc6465d826db89e4909284f alex-py3k
+57042 ac5ce7c43ee759de495670816f1bba7ea0c4527e py3k
+57043 f6af0b2598ca12c1dc534f638afee60d430a6ea9 py3k
+57045 980308fbda29f9c890646b139b2344a8aa092695 py3k
+57049 20477cbfd996780854a96d070ec3b562386bca0b py3k
+57054 f68b6bf463661e2bde22dac0ae055e9616cb3ca7 py3k
+57056 f828a95a9da6ba908c9ba0c2663dd22a3ba8d4c9 decimal-branch
+57060 4620661e06afaf45193858603c4c1aef806cb61a legacy-trunk
+57061 17be8fbec158c45b3720e51114e73f250e9edd30 py3k
+57063 24497019c4073564d649ae1b2bdfcfd573a1b314 legacy-trunk
+57064 717ffb16b5d1254f2793e35c64acdf0999424034 py3k
+57065 c62f6669ae22b87795ba36494751631401aa5afc legacy-trunk
+57066 9e1529bf044228b7f7b8a16c537db917856480ed py3k
+57067 7261a91be0036830835f7e4acc2a976a8e9237ef decimal-branch
+57068 b1abf846ce8152c3803031269a6da5a5ca7f4e25 legacy-trunk
+57069 a3e76431705b263c8664b151bec05370184227dc legacy-trunk
+57070 eab75ae3212bdb2d4cbf88efbebf98e43c954859 legacy-trunk
+57071 3cc2cc795765fa984cadd83f743d7eab4d0b6f9c legacy-trunk
+57073 d3362c4952960b4c23f0eec652b32abf89ebe710 legacy-trunk
+57074 7926a8ca929042ea79178a7786278a6ce8119d35 legacy-trunk
+57076 121213bbf358f86a91ddd17a9c9b7beea1ea71dd legacy-trunk
+57082 4a487191fc54c0a1709ee0dc722894d7b476ef87 py3k-buffer
+57083 66a58c1c283b3e59e765e98ae9c7a98073524251 legacy-trunk
+57084 bbb4f4663cd3212c8d100c1adabab481b69b31f2 py3k
+57085 7a562a00973ed4d3528d8274e1ae9b57a6164a69 legacy-trunk
+57086 ced27b8f089ba5b0763d936b051393a8ae1f576a py3k
+57087 cb8c1dd7ee32b027a6ec37c988521ed81b78ca5a py3k
+57092 603dc53c471620e959a896bad7cc733f0e068a86 legacy-trunk
+57093 135b3cd5e7232eeff2191fe0e45ea50779873a9e release24-maint
+57094 d264107c7da6f6a1bd6345c94f055fd15be4b484 release24-maint
+57095 a1768bbd76819edb4987e198d66950c4ac167950 release25-maint
+57096 d97fd44777b2c12c88fe60c598132edeade96c58 legacy-trunk
+57097 4d2aa4bfb2d6014be61a243e686e26cd45e86de3 py3k
+57098 af180d546ec22028e3e14f31a6223f21b20284ea py3k
+57099 8dbc981f040b8c4d6f5758088c6c56b8371d3d82 py3k
+57100 124bd282493d556d33aaa5c91f8d540609571430 alex-py3k
+57101 d3a89d9d2f5e06af17c5d9094a9979ddf7c9b62c alex-py3k
+57102 45183d0b20a797d81fa3d4a2f2c9b91455841bcb py3k
+57104 89a3cba1cd5242307f463d0fde724b21ed639af3 alex-py3k
+57105 f1a2d51f1cab284f1678ffc752c0f4f751e13a37 py3k
+57106 18104dba85e3373e8140bcd72024fb95adb517eb alex-py3k
+57109 ecb7b2dd3af5803e8c0c338100e8132a9940294f alex-py3k
+57110 34124613bc4ddabfa711209adbb3f2f3506b63b8 alex-py3k
+57111 46f480e1166c84a7bfee3b13f93cda269d9fb37a py3k
+57112 0debf9455cdc1775848d78904729a2ed33921d49 py3k
+57113 a6c48925de53b0860daf878b53b401217ae0648a py3k
+57114 20aec9f34598d353911d5d65c7f76b47a91955e1 py3k
+57115 a2859ae89da91a1beb8ac77a606b3ea50ce23c7f py3k
+57116 48a31b0bf5018b360f1c8f912575dc8ca8900527 py3k
+57120 b7a5bc69d2ee5bb94371f9ff6f485e8d386cafdf py3k
+57123 7b391a4ef89ce2d13c29d121296e53199a85f28f legacy-trunk
+57124 12dd6377ff85bed79af1aa37475471f36fd3ad70 legacy-trunk
+57125 281b518e4bcc28ca43e7ed64f08b8551e4296c9e py3k
+57126 ff5adb3374adcdecc5575191668c288816c7fcdc py3k
+57127 2056d8353a689b514fac021a4598645e835fa510 legacy-trunk
+57128 2606aeaa86d4065d4b5ecd867c3dd0f2ba8d2026 py3k
+57129 fcf6dc51af5431f42405eb1c003372d5e9409af3 py3k
+57131 4c5ecc2ccabdd52c5ef39f47f34082bf90e83ebb legacy-trunk
+57132 9fc21c8babb96c763dd914ce0bd9b2bcddae7c38 py3k
+57133 6f492280341166a2a47acb303240fa7c03233ead legacy-trunk
+57136 8610a1ca650b342aef801a43198e60d5c0cbab06 legacy-trunk
+57142 a5e984eda45a20ce700388a5327532f672f86836 py3k
+57143 e39449095cc5ab6af616ae091daad2748ebbdbd3 py3k
+57144 cc7b5bc297c4ed52a7520ce7944bc49d2440b76e py3k
+57145 a8ca14cec11cd68c6010d24bb6f04fbc31245f4e py3k
+57146 c916731321c0b01e8399bd9632b35c660f0f42f7 legacy-trunk
+57147 f2f0e95a797bc77fe2b0396cf6a742996665c75f legacy-trunk
+57148 56d8c871dc86b39dbdeeec952f9685e0613e342e legacy-trunk
+57150 9c4f5b1d6b9db5fadd28f1e716e94e56a053b0f3 legacy-trunk
+57151 986776456791365e07b325fcb28eac5b806ada4e py3k
+57152 74446509f0f276f02a65c00186def0a843e2d1e6 py3k
+57153 92515b649b9227e144762765d67059499ff18e45 py3k
+57154 1b4c95974a7da72df879c7da3258651ded9d4fc9 py3k-buffer
+57155 1721ff5e2864d5c07b2113a1bc587882be5c5d7d legacy-trunk
+57156 6876ae917fb1bac71bc29601b6eb80b468502e98 legacy-trunk
+57157 ad06327e1f39a73ccdc939be0089afabade72a03 py3k-buffer
+57158 bc31dfcf7dfa0d414c4d5a4fdd750fbbf22043de legacy-trunk
+57159 37d70854d2552ce7fa9551128b0ace36a9a58e1c py3k-buffer
+57160 38dfedf1d2aa8a56bf27e89ae361dd7b084d2656 legacy-trunk
+57161 b80541251e0ed1efe392bb8bf2cdd96233ea23b3 alex-py3k
+57162 d88592dd3a61092ac51e5843d0c2c141c0804e64 alex-py3k
+57163 c59f9942682bb1dcece729c136e34c9cf3a2e42b alex-py3k
+57165 dffbfe607774f073ffc89c7e86ccc76336a150e8 py3k
+57169 e0cc833fdd3ebde97240be42026f046108f88cc6 py3k
+57170 a54d866dc7b4efd2eb7a77908d4cc8f6ae310813 py3k
+57171 af12a46df737ad16a6bc934ace191b6e3aacb9d5 py3k
+57175 a931c6015b917a7fc67b03e2432b08742a550bf9 legacy-trunk
+57178 69750b098ea247ed937646b73a7e2bfe71ed719c py3k-buffer
+57179 06950bd04e69692c28d4f31936233617f4d43492 py3k-buffer
+57180 ad4788df504e09641e395631b82a5ea898ed52a0 py3k-buffer
+57181 85c22b4d44559b3c5f4269874eca6d73c75b8c56 py3k
+57182 b3ca7f5b537c5d72bfa0f9fcf631cd93135d6974 legacy-trunk
+57186 81b45c0da2c8b8a65b313f21271e3f25460d2729 py3k
+57187 76e04973b15dfd0cf8206afdfa8c1003b312aa48 py3k
+57189 ed97a9d1c34734412a244d274c9c05a757da78d5 alex-py3k
+57190 0bc9cf1cf9591898295dbd6a0d52d7d3c5fcd61f alex-py3k
+57191 8dce6e2870e8093e563fbf510c87ba5b8c1089a5 alex-py3k
+57192 f78bf584279e6dd73772c5447ddfec6356363969 alex-py3k
+57193 2c51be9904de1cce4682b702e9e5b380f45413f5 py3k
+57194 7e5eff87d664a009f983e0afff58957d41993c67 py3k
+57198 fca354160458518dc97822b657beb8f0f31aeb17 py3k
+57199 6b530e029b3c3d83fb75faadd7f70c104dd2156a legacy-trunk
+57200 95b37cae47c4f7ec1663398b4c527d223a9a6954 alex-py3k
+57201 739d3105097fe022eb34a61493196d0d29573e4a alex-py3k
+57202 692f57a5dc76a19a3f96bb187e394cdb8b6fe1d8 py3k
+57203 d03eb774576a3e6e49192f38a39f690baaf97c97 alex-py3k
+57211 7054615f37fe603a66c4f6f0082d347dffed6b4e legacy-trunk
+57212 cd4591b754e011d36a8a259b7aaeecd8f3fcc93e py3k
+57214 585d8bece8267d059986fcf7b0abb25d23efed3f py3k
+57215 9a2f37941b2b05cb54101a5fc0792d71a5d8255c alex-py3k
+57216 0f50e091a36fec6b7f564de20314c409d6d20b53 legacy-trunk
+57217 15047b2acd3d554092983b9bde2fbe2187d77394 alex-py3k
+57218 04993d96e7381630cb90fecddc4bf081842c63ca alex-py3k
+57219 c23dcd94dcce01b604e2ad9c3ef326101a928b5f alex-py3k
+57220 3645f0b94908bbadba73653b76390c1259fef3ae alex-py3k
+57221 af6a7190cabcb3acf9c31b72ff7e8e01ab6b6302 py3k
+57222 e71c3223810f245be0dd53ee6dd7a322c9dda81d py3k
+57223 2f4679301132e85e48b6ee5d857294d48ffe7de4 py3k
+57224 5aba96464b8797ea1203ef5887ae5c043f35783d py3k
+57225 5c08472cfc345c8f6b50f83d22a289f0c692f254 alex-py3k
+57226 9542e2e6ef02b2f8a7c73cf7d78571c4b3fa0d44 alex-py3k
+57227 43b354a8f773cf527b2472c413947e97e9a48fbd legacy-trunk
+57228 d0f3d29b708d308ba0e6432ac0e60abe83b384f1 alex-py3k
+57229 ddff521ac7f1a911605583b5766c0f747b82ade2 legacy-trunk
+57230 8d7fa8a5a7e38fe5b62c20cd537e5f991030d683 legacy-trunk
+57232 2b4fee1d4861ac3cb81f8f3078814fadd64b897d alex-py3k
+57237 4474ff10bb0a22b95abeec8ed54cbeef4e50d48b py3k
+57244 ab7a6e74bbf23814699ecf43348cd4a036a57896 release25-maint
+57245 4f11255958be9f24769c5d65b381b3bcba2762e1 alex-py3k
+57251 c040dbb69df71c910b27142372a7641b5867ea50 alex-py3k
+57253 ee9ebbf5f3dc8b02d25b9b47f474f09e6db6bc8b legacy-trunk
+57254 62eee79de923ac7d4c116e4e9c35376c0f1e613d legacy-trunk
+57255 1efe9b10c4a6f32aba6c54edce608c2b966dd558 legacy-trunk
+57256 facdd74a0bdd1b74d3320c8220fb95ef68a7c241 legacy-trunk
+57258 5bf68fc73923a96987b720fb4251d503f46ee718 py3k
+57259 f3181e9fde4d7a0e5b4663e332b583e5ee50d391 legacy-trunk
+57260 de6f30c627305437072d2a925de4dafc03b69641 alex-py3k
+57261 d9e37d26f78e959235c83e2688bef17e3ac3a133 alex-py3k
+57262 6d252838d2306397d1b07adc0e8912355a60c3a9 alex-py3k
+57263 b93792ced9e80f166bad1d8ef02b67e02d24adce alex-py3k
+57264 aecff9e0eeae4d9f8470367159f95ac0ab4b2243 alex-py3k
+57265 6054d7d2349f046246a1f54141394fe214e6c199 alex-py3k
+57266 2081116125cea9f5682dc0fec4b6f555f22b9a7f py3k
+57269 e7696fce337610ba3de1a949a3fc327e264e6e09 py3k
+57273 a03f378c3bf7bf2c81ce5d6a8930a556e418b747 alex-py3k
+57275 c947a04768e45a2311dc0daa1d26146525ec9d6a py3k
+57276 e31b387e6d775c105ab0dde901b3c9e48684e610 py3k
+57277 0081dbacb7aa6122cc3e3568de60dbb1b6d533f6 py3k
+57278 d800a9cdab7646413880d626f1d4f430970bc05e py3k
+57279 3b4e39e83193212c3e5663a17d3908869c10acc0 legacy-trunk
+57280 84c5c0524d3cef7dcd8261fb9cbdab32538c44f2 legacy-trunk
+57281 2673cded88554510c00fbd153e97d7cf2b6a4ed8 py3k
+57282 782370c935758e64334c4b3e209e1d080534b411 py3k
+57283 8bad8722f0e6428d2ab7a09ce1c4a77964c12154 py3k
+57284 092f02cf018f9d93790030228c428e6d2dec7a84 legacy-trunk
+57285 1bf17855e8e85f1f3762e1b125bac556fadf8c8c py3k
+57286 8b6400f9716fee3dbf94b822eb0156c040e1a7ea legacy-trunk
+57287 5a20ee80581958b015c293fc9313d7577c366904 py3k
+57289 0b06069660c22bec2e7d748595b89e49607b3e25 py3k
+57290 9e81b22689d2d17dc3d215a4814bb68c67e26db0 py3k
+57292 688cd4398f44685606a3426282fb81ab4b3fe616 py3k
+57293 5098c68790916f4dc27ccb209613264ddb8a71eb py3k
+57294 58917514e423ecf21f1ad6db7c622c7b34160e77 py3k
+57296 aad17b1ab0c92db3ba81fbe7045fdeb353bfb18a py3k
+57298 2ec16b6b4d044236b5898a47f83790450dfa2eb3 py3k
+57299 e4ade16a694ff546e0a53ea58872e6ab3f74be1b py3k
+57300 26b29f7b8ffd8ef9faac3a808f8513fbb27e70a9 py3k
+57301 199504fb91c580e6c6afadf3ddc39fff5da4e6ab legacy-trunk
+57302 7fe2848fd41d746cb89484f00b16b969d071e968 py3k
+57303 ae83efb73506d257ec313aa700fe044835754442 py3k
+57304 eae10d9c9c4eedb519812186b743ddb9ef51f2dd py3k
+57305 506b917d2363a870fc601651ec789a09c0b56815 py3k
+57308 3284307a73519a9d5bf45723b22835ed2f7462e8 py3k
+57310 f3476e9bbe6ab3610603f39090262854dc6480d0 py3k
+57311 7f4d93e0295cac5b5fd0ebce79cb0556f32b6336 release25-maint
+57312 fa9a40ef0780dd77fccac7d7b8f818b5f5db9204 py3k
+57313 06de62f33c377d633a1bfc406cc825daadba5065 py3k
+57314 a9a4cf91cb7e7b5cfeab15dabb30afed313e2fe9 py3k
+57315 80bc68850a0860db1c7efdc17a115e0df679d838 py3k
+57320 2480b864be0397a605a9681295263a74c46a3304 legacy-trunk
+57322 de1bace81e6ed2a4e53b88a3b6ce89618bf4899d decimal-branch
+57324 8e87d9d6e81275c124f5a7b1608d2b512ae0b821 legacy-trunk
+57325 7a75cd28b125d3b6eb993ac62f0969186f288046 py3k
+57326 b348550a2bfc688d6abe7a47d36a209a8ec96ae8 legacy-trunk
+57327 bcbdc95dfba9aa543f0413ee39735a96f6b0a296 release25-maint
+57328 9087337f3a3f8991dfe12f714d8e3aabfce0378a legacy-trunk
+57329 a911cd9d19893be8f4df8948d39cbc07da70c937 py3k
+57330 ddefbdbdbcb51ce0ab187a5255f33914dcdce148 release25-maint
+57331 adb83f4ac4cbe5e25c0a2acefac5c621c12d557b legacy-trunk
+57332 729fe99b40a572dec9efacaf16c3c45a6a9f3efc decimal-branch
+57334 4edfc59b72b2b4f1dc9c3c8e8d04fce724cfd003 decimal-branch
+57335 af8fc46d4b56178eff3620330045462261c78a2e decimal-branch
+57337 71c68de3b1c574d8aaaa6c7b01cf4605877e6822 py3k
+57339 f53f1a1ac01640f8b3c3bb807c1d7e1d6f040cbd decimal-branch
+57341 a2cc018f3700dd419fe3ab4f63c47c09eb03837a py3k
+57343 9080cc76da98f0e108f1ee9ac8ff4e1a44f14563 legacy-trunk
+57345 e1cdd6ee910e7db23f6b7a38f870169e6f537bc0 legacy-trunk
+57346 00f8b2482764cf6cfcb8e22cb427677815a8dbfe decimal-branch
+57347 0318abcfaf36a6fd684fb810af17614ecebe40cc legacy-trunk
+57348 9520579cc30bfdca9a77397ec83721dee96a013f legacy-trunk
+57349 81886e05fd4016abc4ebc0ea81dae4207578394e legacy-trunk
+57350 a1565404599e5ed86f6809dee88ec0664b709469 decimal-branch
+57351 26500ba09f70c6205784bc8a1c20c41c0dbfa4ac legacy-trunk
+57352 e2042ec330a4555229a0f1a24eebc28ef125a9f2 legacy-trunk
+57353 9a347ba17cab0e8f8adb2e009a1d2e858a51bd3b legacy-trunk
+57354 3ed7814cca366d09f7e1e6b54ec46dcb831af077 legacy-trunk
+57355 77cf2808eea637511e616f05026a9568560b41ea legacy-trunk
+57356 ce52cd71a8d9a27c10c5a909e131d876be30e4a0 py3k
+57357 2073ea3005a7879eb597049d47e7ddf6bb63ce52 legacy-trunk
+57358 7923bff19212b039c35a78163ed156b445f17f8a py3k
+57359 077fe7860cc9b186855f543f1a26e445dd7a7c30 py3k
+57361 1c98b445d847099c2652a757d43514f70d8251f0 py3k
+57363 42b39cb536d9e4b59f4959f69fed029eeb80d7ef py3k
+57364 0b62539acfb8ded67251c7548c66ac8c6db34bb8 py3k
+57365 e744a20ed8a6adbf04632b7b262cae509e26535f py3k
+57366 f94c68fcf79dc5262ce5c4a3a008ee76e418d2c6 py3k
+57367 273ace359e55e6cbb56708a4bb36d85499200ccf py3k
+57368 e3e06b389406a90a34e59d7474fa56ea1bdd6779 py3k
+57369 567c923cb1c61d92e5b748b9429854c76b55a96a py3k
+57372 83c8448c6de4115ad921ed0dc828e556039ed4a7 py3k
+57373 66f73ce97b32d714a098979899b6ad6ece766f61 py3k
+57374 b626b84b507045101e2c21bf200cecc2af4dbe9b py3k
+57375 19da41fc117a03ad7869ece97b1f7e3482a23103 py3k
+57377 b197c1c04ba158692124452d9f8b0e6d18c4032d py3k
+57378 05fe027e2d8098284dd8978b329a999511313740 legacy-trunk
+57379 3141515f6c45a28ecd1c62e7a76c39619c19765e release25-maint
+57380 2b9b2140265040d01b65445101e9d4811409c968 py3k
+57381 d3baab20962649e2ef4239ad477ebf4989bd330f release25-maint
+57382 7323331876dd4398dc2e1cda1c5553d05a3f7dfa legacy-trunk
+57389 8901a7ce6c0745b2ecc8253af6c7275d1e9eddd5 legacy-trunk
+57390 3fba14ec9aaeb483ca9a10b4dcb56aac2462bb8e release25-maint
+57391 2c422a4972f1c95606ddfe6fcef00d13fbc3688c legacy-trunk
+57392 d7517c30679145aa0ccf86f16e6d812d09a7443a py3k
+57393 c3b53e074ed11b3b8add2e6da8e7ebfc01c3b815 py3k
+57394 942860f8cd97e9c583a8eb91fba8f43d51e6bbd3 release25-maint
+57395 58f35df0f6f4886d489a7104c88674bf581e7754 legacy-trunk
+57396 4b7036dc76d55921978d6d062c311f7bf8b1794b py3k
+57397 e2578f3042b2d527564cb755e85dc6a3c0d286dc legacy-trunk
+57398 8b1b327254c0d35199dfd21b0b38ffb187f91be9 legacy-trunk
+57399 256a4d3c581f72d64ed334e4d4e23a1eb956d422 legacy-trunk
+57400 f798c366270c0fbce36d03b148c74831bb3183e9 legacy-trunk
+57401 8c56956971ade3ed6568972e7c1283784f76681c legacy-trunk
+57402 3025e676e66918381393e354e31a6a640313bf4b legacy-trunk
+57403 066d39fad408e1d1d579e2bf38e534a082423c0b legacy-trunk
+57404 48d91f1558a009d95e5a636f39f6965c01a1056c legacy-trunk
+57405 c6d6321dc7f942c18ff64886f1145439bda471b7 py3k
+57406 721c3ea13d84a3c059a1393a9e2a3a4443112eed legacy-trunk
+57407 6124b2ef651201619e40d67ab39565514c60f6c0 py3k
+57408 a6e5b3868f3d82424230c4a72ca3f5df07f07caf legacy-trunk
+57409 e42e7d03173b3143b75e5d03387e25707ab408cd legacy-trunk
+57411 61fb597917d1cf976beab00e07b9eacea7293ca0 py3k
+57412 84618b2064c16ac363e58925a42b7c10113c820d py3k
+57414 6cf6b831ab36ce06e0c54ffb18b1735c2ad36789 decimal-branch
+57415 cf2b37b90c66f54947c6bf1114be7d0099820201 legacy-trunk
+57416 e1a36559d8b68978ad66c2803b546ebd97ccc730 py3k
+57417 8e97711fadc1470072054160c3c0bb799ac581ae decimal-branch
+57419 383620e62ee64c4e4a07cc2ba5200779bc17c782 py3k
+57421 b0a71bffa0a1f7136f3ec870d0983681bcfa9c76 py3k
+57422 d02610b0a9f3acdc5e62972278948e9d38332e65 py3k
+57424 8e61727db529b5b168d73ea11608124a4b3809b0 py3k
+57425 41da49c97a59ec6f827161da6fcb7e55eaf54c6a py3k
+57426 01ee6311ba4694c2c57cd38ee12b8f4345ae0755 py3k
+57427 0994958ffd4fd4d728c11f5fb52bfbbc9f992cd3 py3k
+57428 69b8e29765565a7431ddb9b7865c2e94d8bf2af9 py3k
+57432 3cd60f744f8e93b600d47983338d005543605428 py3k
+57433 3cb5def1865da6580ee2bb8777cd2a588e160144 py3k
+57434 78f7ed7d80649c114ae07607b079d34fec5a0ed3 py3k
+57435 599514289226e1a4990aa8c6e5eacb0a02b6d35d py3k
+57436 00e128b5272f55eaf67238d24c079847716a5367 py3k
+57437 776b8bd68b301a066b503bfe9d24840563308275 py3k
+57438 2c2e905894a380c656889a662d5221a02c46c3c2 py3k
+57439 a99ec4befda8adff526eac040c7dd9fbde6a629e py3k
+57440 74b993a8ad6fef731943659a19c10b8151047997 py3k
+57441 3d5d09b451b66a2f85e4c72dc71a1fdbbadfb860 py3k
+57442 f81d94c05a0ecda41de0d98ac4e79a26b9f9837c py3k
+57443 872c7c3f0af35400efc506fb42f02ca03aad080f py3k
+57444 5355337709e10950bc6e256f85c43c88214ab87e py3k
+57446 fb58fb3bddc19b9dd69271e8597365580db3bbbb py3k
+57455 1b420e6e00eb164a5fd0047ad30320950e3232fe legacy-trunk
+57456 22bbafa6933bd9fcd00279e7850f31164fc9a6cd legacy-trunk
+57457 bb288e04b8e58846c9c3b13af78c5699c7469b53 py3k
+57458 302aeee32da83a49fc748ed1206a67d7245215be py3k
+57459 bd93ac30c77952bf9d237671608eb8ca78cf7a81 py3k
+57460 184f800fdbf6785fcdd465fd7ff5a0f2ad7850c3 py3k
+57461 543f2ba97fab9d7d1e64fe163e6602b25ef9095a legacy-trunk
+57462 78340ccea14be42e70f37320a12fc07f99b56c5f py3k
+57463 6d13e18f706ae3969dfe9695c0a0985c61ba5cbe py3k
+57464 08b6278aa1f409fcab0cbcccdf3f183959127fac legacy-trunk
+57465 24105373973332463ad134daefbde3c4b8462171 legacy-trunk
+57466 bb336a68a47f253446bd73789b6d0d128b281965 legacy-trunk
+57467 4cd11e825644809e1b6618fee0b574a3094e3356 legacy-trunk
+57468 cafe1f653db36b631d46673f32773f6000e84b97 py3k
+57469 6a181abfc8a4070cf3f3140995256f02d3eb4ad8 py3k
+57470 20e1cc74e8ca51f25886c9f4653e6992ff5ea044 py3k
+57471 5a9b7c2f3589d9510538765f05f90175730703cf py3k
+57472 78cf2bda88571882fc5ec0a5c1b87612f2e0e16c py3k
+57473 effeea7cf8984851b5282588462b4b6d5d2bc7a6 legacy-trunk
+57474 d8a63b6327412f8dcff409abaff1fba2f9354b0d py3k
+57475 c31c207b8c86d5577c679035d76170a9daa175eb py3k
+57477 0548df7810a0cb833c12ae5e842846b627fe5707 py3k
+57480 3a689f88c8385e11d30e894a1aad8555cd80271b cpy_merge
+57481 a9b3ce0665c3a35d32f91c530238bdb8c4f80dcc cpy_merge
+57482 673cbc85d8c40bc20fe0147b191e8009eb4b202a legacy-trunk
+57483 eb19f2faeea12b22d753463c9ebedc3b65c833c0 legacy-trunk
+57484 34e6fa78b64328852a19295a3c0558bb434be2d1 legacy-trunk
+57485 6e73591067181a33253916372829fc0ad911fb7a py3k
+57486 3152df70517a6f12147a61c4797cedccebf8f1ab py3k
+57487 b55e7c53253c0d11493c91e6957a2d6b07d7e982 py3k
+57488 7ffaddd1de3050c4dfc547434ee433de9ea472e7 py3k
+57489 ed1d35118ed8f0f418e64183cb69b0956fc63dd3 py3k
+57490 bbc44326b53d699e0cc8b478cc2b7aec1bc77c32 py3k
+57492 027c7d044cfd7cd8d43467f2882487bd12e42408 py3k
+57493 6380f88e3deedb32d3aca96745d5f7bb31f31bb6 py3k
+57494 fed4f72b04cb9d98269785132afd5630f3a7194b py3k
+57495 1390c11e640b1a6ccdd486e770c0c88bca3793f9 py3k
+57496 824b9d52e006bcac9be5ead272c0c7d9c83c47df py3k
+57497 d5b52d56bebafbded46f6fd063e719fbd1b1c373 py3k
+57498 f3b3ffd139549eaa1936ca5bf9949cf09f985d22 py3k
+57499 ef56281f03b45d458b1effd195930d7e5dfd26d5 py3k
+57500 1547de16fec951a6bc23cf9cff3ed8e444927382 py3k
+57501 036598de4660d624f9dc98759ccb9c4496804433 py3k
+57502 bf1a53cc6e651f7d50e63aa1b7ba9fda4d4452cd py3k
+57503 78e00a0f6015e5a1b0743186a634eef20fe0e114 legacy-trunk
+57504 ed1594a16bdb7cc3078844a23a947f8e90a2feb9 py3k
+57505 84fa947ff696602ad9891fc9890dbf1fd2a75a45 py3k
+57506 1b1f7ca3fd49305de2952d7adf2a70f478fb7df3 py3k
+57508 a09728b89530232d02870299a35b6091aaa85102 alex-py3k
+57509 3eb5ddadfbf78beb91073175d980986ca483acc3 py3k
+57510 d6d493b617e3e51bcaa73bdd0e335fb3d3510441 legacy-trunk
+57511 403ebd1458affb5dfafc8e6714ef7dffee147e04 alex-py3k
+57512 6dedb33d2da3849baaf9d098e99f89f9e5301ded py3k
+57513 bab75e4c647f6f41fd84ee697fcb0fefe5383bd2 legacy-trunk
+57515 3895c129e4862237114da8106682811f14e02d80 py3k
+57518 c2c76a0446fab268536baf51c13572893d55ebe4 legacy-trunk
+57519 a13485a3b40783f4c86b3d882482b17272e16134 py3k
+57522 ff3c0be71dc2b37c142197a206e4655d15f84713 legacy-trunk
+57523 d8ad29c68763eab42a3642675419c5a11afec819 py3k
+57524 85eaecf9d678341c63cc2f4ce542a80381bc282c legacy-trunk
+57526 5fd65e25084355eb5ca3e2c3603f4c8a0d3bf0d6 py3k
+57527 56bbd17670575f30a332aa5538647b7c74fdfa13 py3k
+57528 a40dfb51df9154b09874405c2cf5dc0f2c364f4a py3k
+57529 426adbff491dd56b281e9f435836aae174abaf71 py3k
+57530 d9115a450f1c69c5b54ab8223401b9c041ec85d9 py3k
+57531 80365dd455fa688994fddb980e1e9ee115c6d2e5 py3k
+57532 4c78c048c3ba04dba45d0743c74dee39884b0311 py3k
+57534 2519751532af76b67a4036fc4357dae2ca54cae3 py3k
+57536 19dc2eeacbc11a37e69d63705eda4c01bba1f4b3 legacy-trunk
+57537 8e12d56dd603eacafd43b9894407a407ffaecdc2 legacy-trunk
+57538 bb62492b584eb6f556f2a3e2978c0ab4fb3e8c4e legacy-trunk
+57539 e648485cf3afe26757326e397405cf06ad98e024 legacy-trunk
+57540 d5fbb843b0a9dd029a6d974ebb88f6faccd66e52 py3k
+57541 e946100bb9fd9cf3b3ebb6430efde8b5d27f2b53 py3k
+57546 dd0670c601d9abab465b5a3daf09e99be8b1b76a py3k
+57547 904697be68ccb5857370c1375ac59478e55e5fb6 release25-maint
+57548 252a84280b732aea8ef48a180acd1f7695b57a67 py3k
+57549 9b294846d20d0baf97acf01eb5cec7a385044ebd py3k
+57552 2c02ba72714b944e6de054366d3ca3bf3744160c py3k
+57554 6b4781dc81fffcccc9a42753deda3e4b5fabcf90 py3k
+57555 594f89ec060779e2790126ee49e7edc50ec8c49f py3k
+57556 7bf8f2339ec69bfc2df68961b791c7937594f899 py3k
+57557 e2ffa0cd97b97bfc755cae2b545e82bb6f988d57 py3k
+57558 0020bc784c769f8b0ebda033b46745535b560b7b py3k
+57559 a49665f8d2f4d07232cc59caa2667e221a5ca0c1 py3k
+57560 19196cce143130b213fe890ba31f08419c7f9cfc py3k
+57561 c09c3264a900950c7ecf58bad4116d9b7ea22e1c legacy-trunk
+57562 62874b34d95d99c72d3ba1484f02709da459b357 py3k
+57563 fb326fd9d1842d3cd871afe81609c5d01e29ca66 py3k
+57564 cd235027e64c37bf2e4e60ff015c4f6577dc3b39 py3k
+57565 7ea8a6ccdc42dd14e61e44b076faee421f372458 py3k
+57566 b97fa40553438dd64347daa240cf202bbd8913bb py3k
+57567 0170418dadeabb3eec7fe24185033a854a9870ed py3k
+57568 5805fe17cb2dc6041edabd33ffd4acc7dd7a8a39 legacy-trunk
+57569 7a62c2469dea2e4e9c3f69465f392fe667ee02cc py3k
+57570 24a05325678b13ae3d1ac1f5b4b9d086819c3d0b legacy-trunk
+57572 cb28e14ee8080d528e01a943a62b19cd3479dc9d py3k
+57573 044b6285815f18b231d1353a798e6cb8a8b1568b py3k
+57574 79731040217b5f65ef5be4543ae15025f9c12836 legacy-trunk
+57575 e20d5b64189c943ff0d1941da3960978d9d7476c legacy-trunk
+57576 3f0f1c775d9d42fa180c3d5ba1d292917e00e2ee py3k
+57577 9fb8331cec2cfe73de7534f57d75f9690a6911cd py3k
+57578 8e01f26262cf9e4d00a8bb7d431edc673c791c0b py3k
+57580 9220931e4741bf04f9675aaf48be0b422363712d py3k
+57581 c72a3cc21ef73e132352c29f323c9e21a42b5704 py3k
+57582 aecbf56787045c09683181d485953472fa4062f7 py3k
+57583 8717b4f8e1e5ed8330441bbdb2559c017be6b01e py3k
+57584 b110bac9df409023b74b20b6f64c5bb8b2c5335b py3k
+57585 384f9d9c75a02ffe867a0142b12426a6bcbe919f py3k
+57586 b4b14c4beb82cab87e3a365b53ac9d0bc397e531 py3k
+57587 00cbb33cb8640f8fdd796833fece0cd8370dbdca py3k
+57588 fd1fcba5e16b05632e0052c62c1c650bec0a6a75 py3k
+57589 f3b0ac4e684f9ddca9458df0b5b34b74f306c3c4 py3k
+57590 7be0e00b0366d9ddcac7ed838fa59760b455fd3b py3k
+57592 11ec4097fafe7154a1d3bbf242bb45af5afa2cd2 py3k
+57593 cbd50ece3b612c08a669d20cfe3d835a255b3973 py3k
+57594 aee21e0c9a70f390603ddecb5fcf1ffea87a674b py3k
+57595 aa3950f111d9f12a4ad0c0b374c154eb96935ee9 py3k
+57596 b8465f02fcb1ee6fc246552ed002055491fc7e6d py3k
+57601 fdef32bbbcb84079afc93bf76e30385062799e8c py3k
+57602 49dce3da0e803cf3a2ec3966bb8f2c959e275e91 py3k
+57603 e0b6b6287c6b23f7b3964f14862a5158c9f5c43e py3k
+57604 bc98af972678d88eb738bb3daf9c45c677c43a95 py3k
+57605 e836c12c54c2f4460f93f2b9257ae81b52fa97c2 py3k
+57606 83c131dfdd84c18894ccc831ddb268ac8f885140 py3k
+57607 1dfe685b8576bfea184a5de5ebf58472b4e1e165 py3k
+57608 171b9f15c223a4bd9e88ed1a17b095d5aedc8428 py3k
+57609 324320d946102f10b9b1f9cac794557a3b7084ca py3k
+57610 72afaf9ab30ba79be541725a8009eb7ceeb1897e py3k
+57611 8b06f51474458619f3aabd43a11e841b4cc620dd legacy-trunk
+57612 68fe3509075928188124f647871af4ba20da12e2 legacy-trunk
+57613 9a13e8fb1a3b6cc9c78d6496db8fce1004e2f87e py3k
+57614 96da1b9dee8db2c19669739cb2d0c7042ef13cde legacy-trunk
+57615 4ecbae07481f214a11dd53994712087edf43bbd2 py3k
+57616 3bf2cad8f22a9ce101772eda7f59e0b021a1922d legacy-trunk
+57617 66e36ce5a56c6f262aa210d104e310f2d432d1a4 release25-maint
+57619 9620134010a5ad2e57f9ae1bd76fc3ce2b7a2f47 legacy-trunk
+57620 d1789d4ff00c6ec66e0cf39ef3a4fbe78bd5e7ac legacy-trunk
+57621 caad35e8213b8a7efd74f19b55b6251131cc53d5 alex-py3k
+57622 1edc6e17ae185d420d72c672d181a571f836c4c9 legacy-trunk
+57623 25a893d67c64184305969cd1607c5fec559aadd6 decimal-branch
+57624 27f0289b68351ce8c42fbb2170e1aa1b078c246b py3k
+57625 30511068d3d482e914e6d65543926b72834a8b5e py3k
+57626 e6a9fcd1b44e8154fb25ad9ea7a84096b8fdd99c legacy-trunk
+57627 533fb5321d6bc1d4c08ec0c0c363614767f21f61 release25-maint
+57628 8bb1fe1a72a4a32b5e80bfe4e4a674cac1b67920 legacy-trunk
+57629 89c4ff97fd893eca075acaca124559f111e687eb alex-py3k
+57630 d69d80600cf17217665dd42430460c6aa4982cf3 alex-py3k
+57631 fb2cf6e8cd8611539739c867923516fdcab94fac legacy-trunk
+57632 dec2ec826874117ab0934199f64ac8b097d0ce48 py3k
+57633 1a230cb77f05cbec6d550da767ffe8030d2afb79 legacy-trunk
+57634 b92fb24c5d4b5061b629d8c15d03e9b58009bfda release25-maint
+57635 b2df44b9c251348d7f18e84a8bfd5eab3e8a127a py3k
+57636 a7951abb8534b3102b96057b8aac636ff10a0b72 py3k
+57637 d1a17cd26a4b02cfef05cdd07534b31f4faed811 py3k
+57638 37beae09fcb0fd5fea9b3dc78a1374fc935ef7ff py3k
+57639 50b787cba8f1cd6d75a6f697aca855e3af65debe py3k
+57640 713fba34d66b88b411dfe679de190711689cfac6 py3k
+57641 0e510aff5e9ae1542b83d0ff3cb52da08339a395 py3k
+57642 cb5ae020a060eba76b890ee29705b4487aa460d0 py3k
+57643 9f74b699056a4656d77dc23e75c0d28b77883757 py3k
+57644 05c4738f8a43c7330d729836121be998aecc84fb py3k
+57645 1ce89f2578cf81dfbc6013761d0115a72a5455d5 py3k
+57646 0e906510262d1a98e498b185d6910b898f8a8d18 py3k
+57647 71cd5598b74d6d0b800a812b49e0be088e7bc6b9 py3k
+57648 6b3e8aa54dd9d918799d41f7ab17cb5cebe39333 py3k
+57649 542b9b111915ced640b596f02cecef60b089dc07 py3k
+57650 df8ef9c8371a4550290849e2a547039d1bc8db7c legacy-trunk
+57651 82602315eaeb9e710eee1150a2f9e9f47bacdfce legacy-trunk
+57652 9df911d654afcbc4b295c8a3ef748d0be1e00c6e py3k
+57653 0f82fc42fd681af92494b1c1d1ff8eef557f29e3 py3k
+57654 7fde6edf2b920128265a8d5bdf1cbcc38c05519b py3k
+57655 79191bdfa23b52c29aad68199895414a02120661 py3k
+57656 3a56e73ae91957459a1339b4595830c58dc4ce77 py3k
+57657 f4851dc0df04174576f1201d61b0eea5ac14c0f6 py3k
+57658 7073f48147bdafc0b0b48f8e41e7b32996a686e0 py3k
+57659 4bebb22817cfeedb3f250669cf5d4aa2bbf93d28 py3k
+57660 0d28a520c9b18ea196c170b3a7d29b2201a49459 py3k
+57661 172245925ae603d1612daeedba09416c1d56fcdd py3k
+57662 a03532607d1ca7a83d15a0ce78f19c97a53b6bbb py3k
+57663 33e87f970a22c0323952d8f89d1fa452f2a3e6e9 py3k
+57664 ecda33051739d96e9aefda6a233b3ead6603461b py3k
+57665 98854c7629c8e033f3f8c34592f58da063924afc py3k
+57666 abea565304049965c8a8822df0943c807e9866e1 py3k
+57667 250a9d07c2cc2b6f383335f2e27a90d8d685fe27 py3k
+57668 4d6c1344340c2c72a0bf3420af861a588862b635 py3k
+57669 b9226cad9dfdb08bdbc7b41d9e30c8b53095597c py3k
+57670 dcd285c078135c59938580d3820d312745f3bb23 py3k
+57671 dc0f0ffd425728e7207864193b6cf45365cff615 py3k
+57672 96bde0882e5f4a4784806b5c72593f3010430ef5 py3k
+57673 eafc8b23589d13a00850b813ee5e2bb644104925 py3k
+57674 e142cd4b57101c5c234fd2963656eee9a5497b9d py3k
+57675 cd80eb9897283f3583a6d2b766ec8e0ab10037e5 py3k
+57676 aa57cee116313f6afe1195526f7293b03227c062 py3k
+57677 b754c0908897ebb26392d41e833b8bda50190058 py3k
+57678 ac8b389f0025d737b44cd4287907679d9f248b1b py3k
+57679 5fde5d6964d7cd71945ef367e568b7530b71a959 py3k
+57680 4771639fc0499639fcf971198f084e7de5160ab9 legacy-trunk
+57681 07d67a9725a78e1b1676039ee8041275f1c19dfc py3k
+57682 ab89e130d64a84fadf31d61999277979cf7d8055 py3k
+57683 6e35c7c17604e6af28f0e27d96b5c53154b8b2bd py3k
+57684 0dcd7f08739ac807274524ffd8b31d06a7c57b62 py3k
+57685 88bb459fdbf57c72861f9000130bd60da0167b18 py3k
+57686 9834301a2fd3e017872ff13fa9fc12b587e43884 py3k
+57687 0cd401bf2aa7ddaa74bf01e32513ee02bcaae4e9 py3k
+57688 950848117397d724d440ca1a9aa76dbb500e7cd4 py3k
+57689 0104d799dd44542b258122cb014fdd5c2bfaae28 py3k
+57690 165934bc4429610460742493f9a3b60fea9d8a47 py3k
+57691 d5f3c2f416f2a88b3e4c668cc11702e89aa8012f py3k
+57692 907a45df12953a58aca8b44de607b075f3bdaa61 py3k
+57693 a34644a657f5a26ff6d52c654fed429e9f254c30 py3k
+57695 3918a8a51bd197e8cfc531db4ad0605ef2c44774 py3k
+57696 952bf6a44c277f7039ef8e0f4a630651462e3a91 py3k
+57697 1321ba0b670f10102074e7e05764dc78bbe07dab py3k
+57698 b96ca350891d1da2f2ef3b9d930a57bffc643f75 py3k
+57699 a6d3930b561380aa6db3c18cbd265044ea95c5bc py3k
+57700 9075712dee8fd486e0757b157c00f882c7da186c py3k
+57701 8077ee49fadfdcd36b1e03fd339588b92e49266c py3k
+57702 708033ed9515948d013eb96cec5d183c44382495 py3k
+57703 cc0fe056babdf5a96f41a38e291a29fd68911a24 py3k
+57704 ac2d5d346252a24474970eff542bfbd1729de7e4 py3k
+57705 b5d9c195a0c53a97b25dd53338be27d6ed33c267 py3k
+57706 e093ca559c23cebfee7653adfb87edc37d78d122 py3k
+57707 8ccf6f4c7f125685704e7f54ab5d0508449ff338 py3k
+57708 42754208a6544ca19364f447ccda8c94f3f9a454 py3k
+57709 e82c80a0448d5b565c6fc35a06515c02877a949a py3k
+57710 cc7e914a22d9cc740f6c299f838ddd4639ae0584 py3k
+57711 6e1013b923e3c1c82ac05eb1c1b966d1c589fedf py3k
+57713 ffa4233de866227ada0d274da4d454a9981abe96 py3k
+57714 9624832f3156f36f777c1cdf7c810dc4dad95b1b legacy-trunk
+57715 a11367317ca0fccfae94d219d26463b94eb981a3 py3k
+57716 8b0b1146d90805de54b89d1fd6f1bd69a1acf9f8 legacy-trunk
+57717 113220dace646bb310b753cba37de407de82a80e legacy-trunk
+57718 39d9e5000e7cf4c2ca45b0d03da05ec581058dd2 py3k
+57719 df53c576c531ece1d47bc051d94766763893c007 py3k
+57720 b6e33b5eac40fae052e1ac070df9c73aa896d0ac py3k
+57721 08f7a6b25c8f2bd4660572ed5a78ff5e7290d785 py3k
+57722 6500c8bd7feab7050187f597528792f51c7bfd17 py3k
+57723 3a7bdb0a59482ba0131aa58e63343812374a8e27 legacy-trunk
+57724 56afdd6d6cf78e91a266c02acfb08f6254bedcd4 py3k
+57725 227ccdd0f8db7af28bff3f7ca76590c71c9e2562 py3k
+57726 973da2ebc2d0f37d0ad05789eb226df3809cf249 legacy-trunk
+57727 6fcb873f396c6889dec59a7aa4a79081d7471720 legacy-trunk
+57728 d83c2b21ac26ec2ecf42e8cc45c7a263bcd9cfdb py3k
+57729 7ea6888562d1d3847033c1166c315e0c84f697be py3k
+57730 3bf1b8b3408032d907caf9f54c6522b9fa204de6 legacy-trunk
+57731 7dfed1cfe762c54e6445a0d1641feffd66b21059 py3k
+57732 5b7aafadf2230194de4e57eeb244858bcd50c391 py3k
+57733 0a38c129717a3155e76a9bc426cded0c38c0216f py3k
+57734 d60367a1316f4390d77825282e3a4d6e0438c96b py3k
+57735 783ea6821e0471a3577c8a94a9a7f9d85f605b74 py3k
+57736 1a901b1c7cd3186152725a61cb17d3a54c5ee3d5 py3k
+57738 e7a390a36ec8f73bc04811c8d4e2795067654169 py3k
+57739 02d1b5e7bef568fca2baf530066ff9bf8bb71959 py3k
+57742 093fd84fa77c45493da17c29385a7e13b6458f3d py3k
+57743 6c203b7b1e0a1197cfd1a7673ef1eec63de61bf4 legacy-trunk
+57744 6bbecc028bce266a0723c7977705e66ba7ea12e3 py3k
+57745 a55324c9602d621fae3d111b55c7fe612b61df18 py3k
+57747 beaf6630814884fce7387a7a618d6391d716efad legacy-trunk
+57748 66a5c4ba938eacadf4455fe1b2e671e340c775b8 legacy-trunk
+57749 c4a96de5e44e59f8b789619685fdd78bf52c9afb py3k
+57750 ff918fcc57d2aa3931033da86d5e15056e5ff641 legacy-trunk
+57751 23364496df31374c25111362dd6570e172cd6d02 py3k
+57752 db9a176190d360d78951d2decfb0fa2b0b2de36d py3k
+57753 504c15f05df3544a39f6e8331c2c73a35247aabc py3k
+57754 0fd1b4e2f4ee58aeddddc7ca06319a24a34d85b4 release25-maint
+57755 dcedd32f06de3711d0d51d4e429178dd31bec433 py3k
+57756 3e3bc84122d7bf7cf4d1eebdcbe83a62951239ad py3k
+57757 bf11ed40b1058db4a025d744473e0f7dde8ded07 py3k
+57758 87a0fdcaa84a6449df2df180282f951be8b577fe py3k
+57759 ae90420d26355e27181e914d72b706d3ee48c56b release25-maint
+57760 68f8b239324377e2fbd510113023c14d1e9abc71 legacy-trunk
+57761 afbf6fd7798079de26dc216f1fbaafbe1649e991 py3k
+57762 20d8d11c9b21381f5c869a55a8fb2ebe19a4cd70 legacy-trunk
+57763 cb250b0473fcb6f76992cc6b06f0b32fbadb6ff9 py3k
+57764 5d314c3e98ede5685f046d00a8996466e4652ccd legacy-trunk
+57765 8dfd18083540d90bea8f98e43c5c97bf1686ebe2 release25-maint
+57766 1bcdea1dc8c750f7dc73d0aeeafd40b88df5df77 py3k
+57767 2e3c02c625deac3705a3b7126f0c2b080847595a py3k
+57768 8c89b8c48b6cb90fe1d58df1085a21a8e96691a9 py3k
+57769 a6bd3dab3eb8c4ec4a0b6c965f92af0386c22bac legacy-trunk
+57770 92e47d33884e47e89f3a6b1367805f384110009b py3k
+57771 1d57fb7efb15b0dba4b6740c173560f895176159 legacy-trunk
+57772 dd0688740d243db8639fc8b7dc808407a8197d2c py3k
+57773 4a07a288f5c49af4e3ae8a1824bb7b2f041da1e1 py3k
+57774 698906c2f469130abb09faede7dfa818cf4512cf py3k
+57775 a9acc06da57ab444096c75e3a07caddbd0906f5c py3k
+57776 54def18eb31fdfd16a5711d753635f68e6b25245 legacy-trunk
+57778 4441c387650d9c863203583f8d9958a5d152d9ca py3k
+57779 4e6b4ba60c3b28420ba4e2c5bf16fe238e124350 py3k
+57780 3c4329431bbc4882bf9ee3c381f14309d7bf0c8c py3k
+57781 32f6dd95d1ba7ca7f2b26201d00a27504e80dadf decimal-branch
+57782 e91d2bf71fded87ac3d131cbc4b5a0a9b24f0f5d decimal-branch
+57783 981ecc52670303d7d231ff7aa955def2718d5578 py3k
+57784 d2e9dadedcc6d9ac8a27e53e30d76d3bbbb4fe23 decimal-branch
+57788 dee4c78ea910c84bd18ab16d9693114bdd43e2b9 py3k
+57789 691b5ccef0c811bbfb1d45967569564a7ea7707d decimal-branch
+57790 dd6cf00c179494a7eccc7928ae231586bfb9bdfb py3k
+57791 9fb0327b3110093c9a42353d2584a177ebc539ad py3k
+57792 eed15ec6b75995bce5065eb55cf961dd45b7dfbf py3k
+57793 a89d469e1ff77716914ce1a4244fa529a71ce68a py3k
+57794 57e3f6f0a588c02f2612ee3099245a9228d5b8db py3k
+57795 0135f0e676bd01b4113aaa46c3cedfde5a57dd52 decimal-branch
+57796 eee5bdd37158784092e4c2e7f2f380963462b017 py3k
+57797 cdb7b9f82cc456087f81c594a8046beca6618922 py3k
+57798 7b0237cbd0ed1194640f8e0f81539407a5a6afec py3k
+57799 90c715bc7d305da3d17373a67f954f7a7fe9971f py3k
+57800 7ec04cb262d21e24de43be84dca4d202d80081b3 py3k
+57801 8454a2bfae04456f0f450b9e0ae3320716f69201 py3k
+57802 95d6fe2e8e0e91f1c936a3dbf309a8463a9ef269 py3k
+57803 0cf7004641776d7237df4141b146d64f8fcaa1de py3k
+57804 7ea1367ba27588b42bdece07c4e7fd6070f6b63d py3k
+57805 88aaa380f0917c270074d0ab8e2e79b87e50967b py3k
+57806 14ee670557cf000801550c176af440f1f50ae99c py3k
+57807 fec2c0299a8cbad21b2def93fa861b879fe7f491 py3k
+57808 8834e65683e7b41287d6d784fbbcb8b442ebc043 py3k
+57809 3424803337a370d699cf216bfcbcdb139e2ca512 py3k
+57810 85a6785799831418b6bfbb73781091edf6fea820 py3k
+57811 727539865f0465ccb9855809818b66d7aab4916d py3k
+57812 ea8b8e3d8c93287e1052eb94b6434802b4143ae4 py3k
+57813 34491dc143e7cd846cb3d7d03e8caa5e1600edc0 py3k
+57814 e14055e82db991eb75769adb50091efcfdadb486 py3k
+57815 221ffadc1a4c269500896a16ea32b7d33b1adb86 py3k
+57816 c92d426eee751b41dd1d18b59fa799f2c11d4c18 py3k
+57817 47290caf7e8e83d187b14a5a7a4ad56098a1f7c7 py3k
+57818 d15d9c6beda7a104a46eaee19b390c52e25a25fa py3k
+57820 5fa5b2133febd8a4758dee4dda10b8508f04364c legacy-trunk
+57822 bc18acf8b6182da198992de3c694493961301266 py3k
+57823 43077c279d17c866e3d9e65a9244abe924c3c4dd py3k
+57824 d67b94f49dfcccf03a588a31bb6105c37d1a4d3c py3k
+57827 998d757f3fb0ae8b5217cccb32004d1e5332fd4d legacy-trunk
+57828 958c4cc5993e1e6a104d17f8020c8f627b69f55a py3k
+57829 a12a02b9f649dacc796a3471899ce4b47247f60b py3k
+57830 1126e7e85f18045886a159c08d0c3ed5bceb096f py3k
+57831 b5f06e57a24f4985bead226872693c21e3a6b13f py3k
+57832 f7f944374438c03c37683fd62c73bfb1cc9a13d4 release25-maint
+57833 711252402b2f5673a6f37aa905f75e26c6e2b2fe legacy-trunk
+57834 77000f2641ee91697a2215cd36bc2cf075c9cafd py3k
+57835 5c30f15a6b87997bb9354295d67ea975c9019e84 py3k
+57836 2361aaeafcbcc859e6ce5d2144942d35b347b4cf py3k
+57837 082cef3be29b339f3a55dab71bdbda6951f06bb1 py3k
+57838 06dc4321a56a0b399e130727998b9b264c6bd406 py3k
+57839 a7d5440353c35d439f8c3c082d25f7bbed9df99b py3k
+57840 ffb100be0310da584f68f763d4020afafe0c9e81 py3k
+57841 1bb63a32a6c8d91af966ea2c9359de5b5d5ae176 py3k
+57842 42314d7d6083d4feaf3031b9b831a286016ca5aa py3k
+57843 a6f3bc216c370bc68ae830f84c00c18c21f3fef0 py3k
+57844 b5e0f7721014a6c4e19d4b12fe29e65b9889416d py3k
+57844 cd3f783cd08a16781e236c0b9cb5717d1d995fa9 py3k
+57846 335ef86a8c5cac98c8819522ebe12e0643e1461e py3k
+57847 9ff1126f096c2a758279e3fe6abf61e5b4c30d89 py3k
+57850 8c1c2d5bed3226f5d035ad7c2b633f1bb7511327 py3k
+57851 1d0f4b3eefab3772c400362a677dbea1199bd9dc py3k
+57852 20abdb916ce323e1953dbeacae90cc9afcd7495c py3k
+57853 275f894dbf121c404960a3083f34b9dd5f509edf py3k
+57854 9cfad9a5c83b380e2dce84ee4e7eb4e25e6c6721 legacy-trunk
+57855 9af9c8a71bfe83d2fa88951d3b47a110ba4d4030 legacy-trunk
+57856 47c880e48bf6b2e92ced4c798dc8d853aef04a76 legacy-trunk
+57857 e9b6736c1632085b6d66d138276f436edcc53246 py3k
+57858 66c751e81c90e6d44965a30a96fd574ffe722b1b py3k
+57859 51afc1d565f832bfd1d3ed8f32bf8d65ea366206 legacy-trunk
+57860 bd99feaff9958cb60b10afa5bd17004e47abfa93 release25-maint
+57861 620dca675137a164d0d4a625f4a20f9d765a97a8 py3k
+57862 ee1b3eb7a0136dcc126933b5d4e3ca722b92c376 py3k
+57863 0a0b822657062282b38e73fc6b1165f387fd2615 py3k
+57865 bed0f50ec70b7f9ef45ae68f6811f9ac9cbe13d8 legacy-trunk
+57866 d842457e4b0e39fb2b132e14f22cdedca45fe406 py3k
+57867 bf3c94213d5d1e2435937e2c85ef8a8d14885773 py3k
+57868 583e41d1294b4a53a020f7bc7a01cd766cc42095 py3k
+57869 da285d3b065ac2ad0ab097f4ed5b8276f66a82ce py3k
+57870 808f32a0d99c2e02c4ccb738aefe3833b81fae6b py3k
+57871 b7bfa780a8828ec665d208394d7f95448e63ec63 py3k
+57872 f4d2ed50de859d91d9404c722fa35b32acbc95fd py3k
+57873 c4f63bb4d38a2c43f665969f7ea7966891b4b40d py3k
+57875 acace8eb0bd826d030c90b572e20491373d96b6d py3k
+57876 9eba689ecf287dc773e3f95b955db12947ec04f1 legacy-trunk
+57877 320c6bef8d30c29a969de4990fb74c21c5d86659 py3k
+57878 caf0d7e3b29a5f6f8dc7bee150c16e88f51f8f74 legacy-trunk
+57879 ad3d5acacf03de70bf538ce4c87b96ee74af4529 legacy-trunk
+57880 9b1833fc5c7b207b2cc61045ece6ad66c484fc1f legacy-trunk
+57881 ce3a071351fccd50da77ece9653a89c7ac208443 py3k
+57882 14e9b87b753b279b372259bfb2879a557c17128e py3k
+57886 386c22d93ab65b63b05cad8939400059f67987eb py3k
+57887 d442984f290b9c25e0de287cd13e893f514d0f56 py3k
+57888 3ac237bca5ee5379c35febf81a54ec4db4ed5db5 py3k
+57889 d86672bde6406565adeec530e180e5f4ad637c5b legacy-trunk
+57890 ea184513660b5d2816a7fa782d5d2c1b43fa661e py3k
+57891 279b956a3a9635df1b641b8986d8919418fff8db py3k
+57892 1478688f456587a50edf59918473d1548e235be8 legacy-trunk
+57895 36f56a3ef36f80901c0650bb39883af526b7752b legacy-trunk
+57896 b7516a346f0f39884314c3b60d114d0264d27f0d legacy-trunk
+57903 1b0d15444ca5d426df8a101ca4b910a603fcffcd py3k
+57904 ce0cb2d869199df8b72b5d8935f8f5cf2b7ae0bd legacy-trunk
+57905 1b5b0546a7dd2d9cd5b1b28c4c6a0f9fe563c959 release25-maint
+57906 463b341a9d631ec4df23848723f6f8d15a1ca2e8 py3k
+57923 4902671dd67852789a0e61fd2740ffded1e529c4 py3k
+57925 7c6e7d19ff53bc4ed8268661abbc61062c22e37a legacy-trunk
+57926 b5f535cf135fc9dc420ec9134ff918a9219b6ce0 py3k
+57927 b51ac2d2d538bda0f6f57dd1eea03c88ce701022 py3k
+57928 564ae56bd2da61c8f245e3999a0fbc591748bd27 py3k
+57929 f4fb74f638067f3d0c49137c3f64d3244144463d py3k
+57931 dd0c653ba29f2308f262c68f6358f979f8432333 py3k
+57932 578b17461f6b6b9aba17b03dc921854ffcc1b37e py3k
+57933 11993bcb0ba3d1d9a46ba9393496a0339fbde381 py3k
+57934 43597778ef2cbc51334da1b9b2f57dbd980ca188 decimal-branch
+57935 7eb954351a4fd7dd477f0b506fc4ccf26ee9fe3e release25-maint
+57936 c48cd6e06aca539d05290767604538bc0fca0f7b legacy-trunk
+57938 a9fb65c8eacb381ee248c1553b93c50ef7bdebf4 py3k
+57939 48ee639a75dd72fedad194ab43ee5806ad70d5fb py3k
+57940 e253b204525069feec4fc3b21ba06642f6ff7b79 py3k
+57941 3cbb4f9220f41925b108ffb7aaa324cd7a6a5e7a py3k
+57947 a311ab2fc1a7005150a4bff451acd007c81ce3cd py3k
+57948 3436daf45516ae78c8b22ff35050d7ab45e2799e py3k
+57949 428d921804fa43cd8e61c4c418b8f3266e8814d6 py3k
+57950 655071bf6c45c6d865b443d4a5c9d113562a1c2d py3k
+57951 a1cc9b589e222ef299c15f763186059954f2a559 py3k
+57952 bbd4d296f74ace8f28e2b694f4ad8fbf86214586 py3k
+57953 978c42b538d1c9b4e9287c7e1c71ecb12b8d79ad py3k
+57954 2052f54ced49660b289f4c29188fe8e42e764b25 legacy-trunk
+57956 0294bb2e95de329bf59079d626b2bebf63ea63dd py3k
+57957 38f3f9ef193d2aa4493c281cc4c1cb24373b5326 py3k
+57958 47d92db7cd10222cd7fb126778be912b37773d77 legacy-trunk
+57959 c9ac5b8e4a81695edfc1ac8e4208351829293238 py3k
+57960 1a0c73580665ef6d415ba366c9b52c53ceb690eb legacy-trunk
+57961 6a048ff30488878a2fd238d2d92e24e062ed05a6 legacy-trunk
+57962 425127c1d113c4faaaf3ab3bef009e12b8794992 release25-maint
+57963 8e70fd6a7dcb09523ef04ef4f1e565d965cd397e py3k
+57966 081e362325da68e3b37713ce2540f88cc242d413 py3k
+57968 34bc638ac7076ec15ba173fff5e5e9578629e001 py3k
+57969 49d6fa98dc7817f5105c079eee44d56e7fdac381 py3k
+57970 7904fbafab3de508654ff911cb039477e39a2a21 py3k
+57971 3484350a4f69df37642264d2b2cb18dbbddf5a45 py3k
+57972 80ffcc161b30c8f68b28998f5bf5c9bac98cdb56 legacy-trunk
+57973 53b8fc079077f48beab1b8c2cfcc0f3593598fb4 legacy-trunk
+57974 c6b1123e0e6ca4be1d0520f02620b194f04e61b7 py3k
+57975 294e35452d25798528e4b4ba5662c9158c3be7c6 legacy-trunk
+57976 e946073dee38b065d6ade7060c106324288cb71f py3k
+57977 e6de9add7c075bc970fc5a2df42ab6f443fdfc1d release25-maint
+57980 e2b4fc960830fc22be1f7a845739ddc04294e389 legacy-trunk
+57982 79080c4889bc27e95d8cc9b21a76abdbe8f283e5 py3k
+57983 cc44427545105e323a11732a85ea97b887dfe288 py3k
+57984 d31047a1ce197684f2f55296c89715ee2bf202be release25-maint
+57985 4531220e50ba8c14fb17aa0333bb96bf2e71194c legacy-trunk
+57986 5fd0451e740609fc6a9fba970e57c591e4ab2bbe release25-maint
+57987 7fb9cd91e64861d3de8935e6a3dd4688b2cc783e legacy-trunk
+57988 71c3e5b69e14e71de3345d555037897388a34f3e py3k
+57990 3c2a4f6accd56add439fe6ac5645d4dedb0bdc9b release25-maint
+57991 58af6675019862dab449ab6459f8f5a89cbe9d97 legacy-trunk
+57992 08e10554e4303807036a91849359859e0f37ba37 py3k
+57993 91c99011d06944a6170183eabc8fdaf2d0468ca8 legacy-trunk
+57995 72a96e6a7c2fbc5bb8de184adeeab0c601da3bc8 py3k
+57997 885813ccbf454cc0d93f5966e04f215b07d6dc2a py3k
+57998 a4bd8a4805a80247716f181bf8ef7a5eabb0c2f0 py3k
+58004 0a31d1c45a892ba9d0dd3d531efd717c749f13ab legacy-trunk
+58005 887e1feabdbde6ac9a16a502817068eb0e120e8f release25-maint
+58006 fdc675cb5e8aec0378778ad944fa3960fdf7ee61 legacy-trunk
+58007 be8f7d3cd7cc13b2f6df6d19ddf78cff750cc2fa py3k
+58008 fcb02cb96ca201c172557311b7355038ec8a027e py3k
+58011 b4a2f10b39d20f1222557b7181c0fc6155297084 py3k
+58012 79dda568f425a390984ac29e2f140e3a60683ed7 py3k
+58013 ac3fc2ae4abcff0de1d2207bbe0c77cee70f48f4 legacy-trunk
+58016 c76aca4e100de1162f427fd71c16549c74ece646 py3k
+58017 7c2f5c62f8ca0d93733f650278379749e05dc801 py3k
+58018 edfbcf1ff73407510e6fd637d5026b9fac9764a7 bcannon-objcap
+58019 c9c6165f7c0d1e04cc6b748d5c2c435858ce86a7 bcannon-objcap
+58020 e7fd1fd91c53fab6da854d28de6c805439146fdb release25-maint
+58021 2dba5ac8ce159f1e07ba2a43681a05e534fa1003 legacy-trunk
+58022 ba08f7f36e8ed4c07f7434bc10eb79625c576419 legacy-trunk
+58023 556569ab3f9dd85550d8f71631abc1a924f119e0 legacy-trunk
+58024 16cb85fefc5d025e304e51c2d44bd5c528507079 release25-maint
+58025 1bc4a8d57b312985f4f29cd557ed7e2047bc1f28 py3k
+58026 7052593574bf47b443367759002fb503ae6207f2 py3k
+58031 57eabb051cfdcacec8f77a8a59f11558906a33b7 legacy-trunk
+58032 3bc3f12cae28f02b3572aa2be7fcb25025ef07e5 legacy-trunk
+58033 80d2daec61cc8cac5aacd9dd0f56825e49b25477 py3k
+58034 28716dd14bc5fa27142ca579ecae7b78f29ae699 legacy-trunk
+58035 7dadd21fa87c12b029a956d6903ebf3aade4cc06 legacy-trunk
+58036 f62857533cbeaa2b94aaabb8031b865da80d9fbc legacy-trunk
+58037 4b2134e4730c22d5d17212e3a85c44ee70352406 legacy-trunk
+58038 06f6682b2166e307c2aa1f2a7b198de64b8e8b91 py3k
+58039 fc470bbe8d242b87b280e583621da8ba36dc1253 py3k
+58040 1f9eee08ab35e957ff565ffa52bb026f52129b86 py3k
+58041 755fa5187d1bc12e9d40b95309c36cc60c415774 py3k
+58042 885fb17c5e3196825ffe476fabc93f86d62a3afa py3k
+58043 fa55d42c8d9c8d2e57a67266fc7b89557809a2c0 legacy-trunk
+58044 b8a8206c08492505f3dd835817d454179854a6fd release25-maint
+58045 b367d6e422315a904be45d86f677b25ead0f0743 decimal-branch
+58046 1f6227365c36dababaa1818a63c6af070e7af4c4 decimal-branch
+58047 e85faa02191c47c950c1972b337e17f872e31ab0 py3k
+58048 0881abab9373841e8d647f00aaaff0af90f9922f decimal-branch
+58049 ffa0747a7cb7a206147083248fdb328095eddff6 legacy-trunk
+58053 2ae6db0bc7ebcbbbc7312db6e03aa0f5576425d7 py3k
+58054 876b7ef4775d8fbb9e4a5da3f44f09a831879c6b py3k
+58058 baeb66ce7b51ddb3672c4556c7304fbda34dd4cb py3k
+58059 78f1c329c983713a41f31a85a40e8836fc4c1f23 py3k
+58061 a09ea2cfe76a305b037129c1cd81495d1f6372e6 legacy-trunk
+58062 75cd548632509a2eaca7f0c30f7387a6b5b3dec7 py3k
+58063 76c1cc670c633efed9817aa03092bb60ee0f773c py3k
+58064 a11b4885b445f2780cb8063502e65b24c1e1579e legacy-trunk
+58067 e8aa724da90584d342bc873bfce50520fa84e27e legacy-trunk
+58068 b355d2dba9b6e25a39a7e2f9f952b2ec7a57686d py3k
+58069 807adc0306535151fc81f0361e9685f887f2faac py3k
+58070 3d1496489f5851c60f5e5709e557ea756d87b729 py3k
+58071 9176a53b4b6250eac8536d0cf0b18a1adf8e0c40 py3k
+58072 f8a5fba35eb36af34a9b02ff38cb2929c8d3b990 py3k
+58073 75b265c08c910be5a85bc443085a21338f446130 py3k
+58074 9f7f3147031c2686da26cd40a1209ac076623f06 py3k
+58075 875052c2b7b346fcdfb3c643fd0daf7a51dd3287 py3k
+58076 b27d349162bdeeed16ddc36e0833cff5ec552dd9 py3k
+58077 09287f2055ab5d8df164ec794cb83abbdc388018 py3k
+58078 87d411ebbae0e2427a9aecabb57ddb828f4a766c py3k
+58079 099ab823b84c4a1ea4ae10a75e3158bd6771e8b0 py3k
+58080 fa02cd2cc33b8b39358bfe7c0536d5053f606d03 alex-py3k
+58081 a7db9ebed28ad129e0d7b0d2a5f9d6996604d277 alex-py3k
+58082 d9fc928db1faf5644b58f09d57d46564bf381963 alex-py3k
+58083 a66897419a34efa978acaa1c3be3ad2cf8d1a60d alex-py3k
+58084 5a51d1b6562995da1e2a19a81f9ceabecbeb8179 legacy-trunk
+58085 d1552c150e914d7bcac20b6dab42ff27a8bfc0bc py3k
+58086 60fb98612a9e7dacd62b45c461c9587649cf9d00 legacy-trunk
+58087 cea6a80bffb29b0f83f28bf5d46c5b3f7220d6ca legacy-trunk
+58088 34b50001dd2c357726b9d4d3f0593672489ba2f8 legacy-trunk
+58089 862ae43cfb2b2e216ce80c6adc96e21dd9000b14 legacy-trunk
+58090 78a7b99d9f42a0fc313bf4afab6182f34ab65920 legacy-trunk
+58091 ced24ccc49dd6bb37e6c80ed4599e6f293ec7c47 legacy-trunk
+58092 ac198fbd37004fca8194c55e0068e63764618e70 py3k
+58093 282e2d0c29371c113413aa717fc0ac9501f71fd8 py3k
+58094 5bffb6c79c0611240cc6ce39fba2611528fb27f9 py3k
+58095 26ae210969c05e7bf54a14337a1924749afb673d py3k
+58096 4a6c788226f5c2fd8111a03307e35cd67db48f72 legacy-trunk
+58097 193020bf52dc356c9f68be4be5673e9b7c2e0668 legacy-trunk
+58098 1dad58e00c3a50ad7f9673e071614bbd4f023b40 legacy-trunk
+58099 33817da53fd743a94e96a76549fce8a6d81b4db5 legacy-trunk
+58100 20a80b83a6c52696ffda3fac393904ed047d6d23 legacy-trunk
+58101 b3a4a14d8ac3123195b90937177eca0b1b67acb3 legacy-trunk
+58102 ebdf2c09c189908742fa944662d77344a0ea590a legacy-trunk
+58103 bfe18b907d8735e51a97639c89e40b3994a96ddd legacy-trunk
+58105 18d5aa5135ca3a533ddab0338fd43bfcf638db7f py3k
+58106 3ff2498cf548a77172a9ccc49f91cde0ae04d486 legacy-trunk
+58107 e82876a621b5f4382240eb72703ecaa878687301 py3k
+58108 c5b6ae9440b5dff41d5e2ea1774e8709081354a2 legacy-trunk
+58109 ead7c3c6be1b9a8d909abbb9077b709919e9a411 release25-maint
+58110 274fe4bbe3e070d8c42627476156703e29fb2704 decimal-branch
+58112 25ea4e66f9a00480c51b5347ad70f88180a04a55 legacy-trunk
+58113 637bfb0c5dae85cfb704df1efa6740d4194ae4e8 py3k
+58114 ca06c4a3091ee74b5ca22862ac93f3de94419d5a legacy-trunk
+58115 5553f8b4dec0de080784cc027d28c24442a149e0 legacy-trunk
+58116 b5795da7dd263a51512423d6daff0871a475b5aa release25-maint
+58117 08588876e4a74cf5811564e5af6c44f025b72daa legacy-trunk
+58118 20398b55266c96b5f1fb167fa37a7e907ae9c808 release25-maint
+58119 840ff58d1e9efa48f03387f469743789a2518ef5 legacy-trunk
+58120 756a7b7cdc4e5ad9960bfc14d504bccf9e378ea3 release25-maint
+58121 9007154a7c491576f3a8ad8fb4ef6e239cca025e legacy-trunk
+58122 06efe835804a2d2a6a54650d5b9b5c406b87892a legacy-trunk
+58123 c38e353e8761e840046b647c676edcff5aa7a3c5 release25-maint
+58124 1e3f57e73e04c3af36e6b6ed06c42eaa99878df9 py3k
+58125 a0d2012ff4c15b5ecc9cc15b0b94be6374534797 legacy-trunk
+58126 84dc86f211964b7374e11c7815cfae051e19e07a py3k
+58127 5ab5a5c73668fdb9be5d2ced42b8728f86cd52a4 py3k
+58131 942fa1c4a9d0ef01266d5f763aa84df5a5092582 py3k
+58132 bf2d8b79493aa20172c2a40f6883535eccbad26b py3k
+58133 7107f39c2f66c20e430ba7a55894b4da4b00a5c9 legacy-trunk
+58134 39ebcf0a98b4d1347e77f6be289bc6d920034abd legacy-trunk
+58135 e100371a3f62de53ae2f0a5c8255b0d61a7a5092 legacy-trunk
+58136 949a35b27d2042dfbdc9e0d5034be0b2b46aef6e py3k
+58137 b2dcd757a6a375ecfee2a65ef669cf0ac0d729ca decimal-branch
+58138 527c44ef26ccd2e383b21ed3969c76176fd920cd decimal-branch
+58139 c79a2f0a70342d44c2f877cb7edd0d8ef52eb405 legacy-trunk
+58140 c67851130fc4c6e9acfc85da27cbe349fb8b2b9b decimal-branch
+58141 f14fb7b03dca1eb7696561213b50fbd0860751b7 decimal-branch
+58142 98ba5c2211986cc2ab9ff49f3067dd37fc482bbf decimal-branch
+58143 63f3154c731d022cbb0989938ec667d1c6c8d371 legacy-trunk
+58144 63c95763a43be4e91944daf19ea0f038e775cb65 release25-maint
+58145 c8c7a947a64197b86efe9445dd3f887093eeb9f4 legacy-trunk
+58147 2f8b3ea62a2e1eacab4ed90239874089b1294944 legacy-trunk
+58148 df8d32d5e44410d66a12e243f86e169bfba0459b legacy-trunk
+58149 62c3c104ca012039b69f7d9425b59f16a9c79a0d legacy-trunk
+58150 eb98f223d6eaead45fb187537bbcc73c44c6ab3b legacy-trunk
+58151 8b6dc66e0eb54ec7af6fea146b31eb355d3105ec release25-maint
+58152 e0f5af14c9883ca4005fbcc013072068ede6c0a4 release25-maint
+58153 e51edde2807f1ea11e1b73690aa7a47afc47ec70 py3k
+58154 05d7c3d0b77a228aee4b81e3e620d2cdf85493c3 legacy-trunk
+58155 fdff48f87f35e907578df0ae74a9f35d277d552a legacy-trunk
+58158 13391f9d20ea499262fccf457ae691fdb96b560a release25-maint
+58159 e0023395e539328b98190d177bbebbdef7e7d871 legacy-trunk
+58160 73f2c9d16cf4d75c4cea4d7f662c1cb95e58811c legacy-trunk
+58164 9041965a92f2ef66f05ed0518746b54e25aa1244 legacy-trunk
+58173 1b66e2a5796f18c9475a6fc6c4800d82e1ec5a1c legacy-trunk
+58175 2e7dd201ea1d2c7ea9e8628a7be51a475ceade35 legacy-trunk
+58176 7630248b593cdfd203072072c70e5595c554e671 legacy-trunk
+58177 ae982293c1ae089cb7f163d933f1c8ad6b9168d6 legacy-trunk
+58178 e313795ea1742ddfae1c56bc6bf803178a2e5350 release25-maint
+58179 9cc132c8461ec64571f4226777900684a499ab09 release25-maint
+58180 e01dd2bf099a5ada0a572313c8315d377118ef46 legacy-trunk
+58181 8890be9386b7ac47a60879dcbf5ee65d79a98ef3 legacy-trunk
+58182 4e57c36f6d2e36622832e43ff98821869557726b py3k
+58183 5d3428ff7ffa1823daf222510d9fc22f9cf0a577 legacy-trunk
+58184 363203d75d69f3df873696be04b3405da80580aa release25-maint
+58185 c5490a9eaae2f7efc3ec3b03405753d3e59695b0 legacy-trunk
+58186 2fdff0b5beb6ab7c6f1c78c517c6e45b58ad7122 legacy-trunk
+58187 4e543fae0ded89f8a210c874db9be7575bf9fa45 py3k
+58188 5335f89df081bae487ad4218a6a060e9caeffe35 py3k-importlib
+58189 e395a636ee4a7cee63ee78f91c1496cb721b3bef py3k-importlib
+58190 641d4cac9756d8a7173cad97ced507ea91fc9c1a py3k-importlib
+58191 c1bcb633935774a098fce5ac55ae70e22111204e py3k-importlib
+58192 5975a7316c065322e89e5c1c1c7473c388c8fec8 legacy-trunk
+58193 b9236a75a6e5aed4a997c0c17bcb2ca67f5e0920 legacy-trunk
+58194 ef223546b4bd6de3388cdce6138a4a68c8525fd8 py3k
+58195 6a0ea065a99a2f98e8120e41caa296b00ce67e71 py3k
+58196 f192442f44d81d8a4c2f16719bebe63e34e33e2e py3k
+58197 b29582bdc93cd6ccbaeaf146ddddc67281d977fc legacy-trunk
+58198 7ddd40503e1a1d00269296a4e5c0ffcc23e57ca1 legacy-trunk
+58199 75e6bfa2d4d220e7c1abe6bcecb25a98bd6a328b legacy-trunk
+58200 3ed2f77163fc30f8f927bef4fcee9f70a1e073bb release25-maint
+58201 f2ef8ae0bc18752955472e80fffd863fb800bd13 py3k
+58202 1bac386c17cc69b99d3315b9faa150526c9ff617 py3k
+58203 eb396de82c030fc70afbe1c476621b0e7e41a80d py3k
+58204 8e13d3eacaccb4be7cbaf6eac77a31095beced36 legacy-trunk
+58205 692493771ae322c5d6880658755652b1183c48b4 release25-maint
+58206 d1fa820b2dca0d1ead775713dc3d029da4a57443 legacy-trunk
+58207 c19ec9515a3367625ba463807afb20c5a9e482f8 legacy-trunk
+58208 357f54015a2d3ba10cdf131c83436ca3b4e22f5c legacy-trunk
+58209 44aa4ffdc1ac96f881b6273d2348b0f6c6739331 legacy-trunk
+58210 81478465fef3b14738459fb7f85331e5edafcb45 legacy-trunk
+58211 357cf07a23fe366bf6ab6debb5613b970488fd3b legacy-trunk
+58213 b06b191b7cfa0b87aeefe8cfd432e3c75e52a37a py3k
+58214 a5d37cdcd316173a135d3c7b8ec7322dfe16b52e py3k
+58215 521bf87cebbd9e08afdcc17c4efe0385b908cece py3k-importlib
+58216 ef17218361782a081874fd2992599614360e7f69 legacy-trunk
+58217 409091b28c7e9d68346b42cd1885a4fe9b5c0886 legacy-trunk
+58218 7d14a31888501dc1d901879356640ea85e32ef6f legacy-trunk
+58219 e1c09fa6fc0f5d26fe32b299089b99d76e5375da legacy-trunk
+58220 dc39dddea330045e94546631c91b67d7bfb7698e legacy-trunk
+58221 46c467dee65938e73e9b43a2d7374a195f2f0d33 legacy-trunk
+58222 0c8fec76111c7faec621ca89c4ee99608e424707 py3k
+58223 da9519797c61058a19aa0ec29e48799751e6bbda py3k-importlib
+58224 1837cae90e52e550fbac4e556471eaef21fc7496 py3k-importlib
+58225 ec846ebab2efa0c575161c10daf4c8d7f089b87b legacy-trunk
+58226 0ff41b163f5ba1f5d289992d6aa144cea5f5b6ce py3k
+58227 f31d415554cdbfc5b549dd376e2afdda1906bced py3k
+58228 f6cbab75928f68649c456c09d162eb97f0d5be43 py3k-importlib
+58230 73d26cd8e0b564f10832b7befb5992ad30268422 py3k-importlib
+58232 fc0336f447aeaf0b5ff3ed644eaba42f150ea328 legacy-trunk
+58233 37ffbb7a1962930f72a5d4b0f95e20ef22da6cb5 py3k-importlib
+58236 0476a2cc56587443cf46fdebcf885110611c88ff py3k
+58238 cef2ed8292b6cfdbb854612985a2a6e957304530 py3k
+58239 5f7338a4d1dddd26181f60adaaad496c701bf874 py3k
+58240 55a66316c89ed2cb1614c27a5560fbd45bdf1466 py3k
+58241 a4de3122157847f308dbd62b3a1b01f3514fc50a py3k
+58242 b4e688fd6602a56901503e2646a97ed72ad98167 legacy-trunk
+58243 98ff9b2ff757651d5d2a6fb3638e1055b0672c97 release25-maint
+58244 b93ed043f2721b5bcfce0e002fa848f81ca36eee release25-maint
+58245 e98e11d7768c65b68218272ddae3a3d5101eca42 legacy-trunk
+58246 b70edb5a7688491c73f558515bc5a7227fff83cf py3k
+58247 773e976bab3afb5149d24a3e1d14cf131cc5ef4e legacy-trunk
+58249 0b614fd2dc2ae056b6e0901a697081f649c00ce2 legacy-trunk
+58250 9463dda1916013af8dc75aa28d44ef6ccfd8019a legacy-trunk
+58251 53f7c92b4024755f620d93712019207487ca8783 legacy-trunk
+58253 2dc0e6e3ad200e6aaec3ca98fca407447a7867d9 py3k
+58254 f81e39c4373da583dc45338c53a51b9b888ba81d py3k
+58255 79b0db0356d31c9a64a5d88caa4ab53c439cf58e py3k
+58256 8d7e93b47cabd53f73c3778d8a6f8f6848d57527 py3k
+58260 1a79a45003f5db94268090ace63da0adc15b8870 py3k-importlib
+58268 b90286ab8629af0241381c040b37e8417be9c155 legacy-trunk
+58269 856f8ea922df512942dbfd43bd293a221afb9c23 legacy-trunk
+58270 f5300598b11cad1311e308b2c0511c71bbab5507 legacy-trunk
+58271 1944f79db8ad344fe5ed1ee95779d5ee85e9475c legacy-trunk
+58272 13baada2a60171e422a487bca9d1f26784ae0059 legacy-trunk
+58276 a7c48ab809ec4881c91bcb834d78e87f935cd5e4 py3k
+58278 0ff46ef946b13dc523353226677b23c10fd78d55 py3k
+58279 9bc985582cb285670c198c47aeb4cf07b74ff968 py3k
+58281 7fcd9945d1bfe38477637dbea8228509db3dbd29 py3k
+58282 e88f83c3b25e8c9e523aa2d50adb6ecaa9e8b20f py3k
+58285 866717269ca382351344c8b89399d5d308f91d47 py3k-importlib
+58287 880b0b22c15a9f71bcf2de682c02a0212d7c44f1 py3k-importlib
+58288 381ed41003e767af2984cea57748a277563621dd legacy-trunk
+58289 106a71c5147751bbfe056bb12794ee20fbb83dcc legacy-trunk
+58293 a1ca4ea41e7e9fd5809792bc32461513811cb789 py3k
+58294 9d6d9ac95ae1760d0103af8b4f7bf61b3001f58d legacy-trunk
+58295 7943262e5fc43767d0495bdc5951d2dc02eaec98 legacy-trunk
+58299 c9bf6e70308e7641acbb73da1acdc8d3757c76a5 legacy-trunk
+58304 b12cf467b05cc2d3772f04269aa8359812c2275a legacy-trunk
+58305 333b052e9da9a0a20cdcb3bf5f46f09237b4be7e legacy-trunk
+58306 cd281c12836dc4f087c54c0674571873ee08359c legacy-trunk
+58307 732ca27a678cfec1ef44e5cebd2b329614f7edd7 legacy-trunk
+58308 1b1a5652fed8f776f8e41b70e3c8e47fbd4ba755 legacy-trunk
+58309 9ae4e8a5348662deca02d6dfab59a8fd3b741a8f legacy-trunk
+58310 176b6131b0baf4103dff41286cedb23c67e0f3b6 legacy-trunk
+58311 65b3654c67f631c67e4360a0f6faf98ea5065aba legacy-trunk
+58325 5b5249dd16b45079b18c0cf4eb077b6cc0062434 legacy-trunk
+58326 73f49656420bca771572fa2214fa639b2e12588b legacy-trunk
+58327 e8694ab53a5eca3f21fa63d80d1defc89fcada79 legacy-trunk
+58328 c0abdd579eb26aff4871fcc52d52f75b8ebdb42b release25-maint
+58329 f2c9f24a0f5a89d4d8de3ba22a39250a6387a112 legacy-trunk
+58330 995677219a65582a8486dc27f46423a130b03ee6 legacy-trunk
+58331 275115999b58121fd31d6ad98e813728259d5e2e release25-maint
+58332 1bea6fafcc5057109653f1e5eb262da4e8797965 legacy-trunk
+58333 a543006308bb9bd940eb5b18bb9fb949f79b95fd release25-maint
+58334 e841197c1d17f55f0b27e9b393f39b0b655c59ed legacy-trunk
+58338 17b07370a782901adf18268885c066b14a0c4a04 legacy-trunk
+58343 68fc107ddb50b98afd136816e9b6a5b6033a6f4d legacy-trunk
+58344 f7353595b7fa819f96eccec6331dad2309fc9b4c legacy-trunk
+58345 acdac41f710972a922515e628a5e93cacd1a0d1b release25-maint
+58346 ed499e348a119d277ddfe2189361779f84b30043 py3k
+58347 ae2a99fc73da6d2beb1a2bb09d1e2da237859b78 py3k
+58348 f36d0f7077fcbf5f9763e274386174b7402403d9 legacy-trunk
+58349 ad366e316e3064f3b467ff3a3317b2fd37528bee release25-maint
+58350 39f4c506cd718b0437f80fb001caf54e77919a27 release25-maint
+58351 3cd1463c938d6f7c83280f796e3124f6889848d8 legacy-trunk
+58352 074130a073b6682aed8e81edeabe342ed99254cd py3k
+58353 23192b1b71e27554de6df30643dec1cff9ef81f2 py3k
+58355 14addda833443375e291edc5aa671524b3042583 py3k-importlib
+58356 f5c79f43bbf69586e2faacc06b9f085b9ab3c934 alex-py3k
+58357 a3bad694c2839da3ef7df5e5558eefc778be3367 alex-py3k
+58358 94e536c364493fc8ac62625c5da7a69c3baf2bc2 alex-py3k
+58359 304d2cea137835b74d129531042cc1f9b57f5793 alex-py3k
+58360 8c10aac37037925dccb7bbdfb4b714b61bfb3ffb py3k
+58362 8ba5300cb4b3b5d6b38071c7561965dd45aee316 py3k
+58363 767e0c310a6aafa7f09bcdd7b57bdec44bcc5491 py3k
+58364 f6143c41171356501e46aecaa7daf04e97f85d8e alex-py3k
+58365 f6061c71a4d236b6e8d53b8cc37f7ebd61902683 alex-py3k
+58366 fab4089dab9f9f0d175ede9b9404c728dc363440 py3k
+58367 de41e979aebeb898cb66a9a2de6a25ed51f5158c py3k
+58368 045952ff08f743b23163529c7ee2a3cbd5901467 legacy-trunk
+58369 9e6020bb23522b31c8e972d00a4c354592998f4d legacy-trunk
+58370 4db5dab7f23589dac78443dab4ecb40e0ab7cf23 legacy-trunk
+58371 ff4bbe6823fc9b930a2a9e1d199371683ffe0d15 legacy-trunk
+58372 91904f3e7be1ba4e78e31197e5aa32cef25156cb legacy-trunk
+58375 6614d42d7f0a335d9b1d41ea051cad39555ea0d3 py3k
+58376 0ba38100cda9032515a77b8b19cc0fa7262331f2 legacy-trunk
+58377 8bd910036c97f740b70b49c11a8c997bac9c8f88 alex-py3k
+58378 5713b176ddb698487ee8db064a5e1351893e91aa py3k
+58379 27af45249a803d15c601f772445aa8b1a8df9133 alex-py3k
+58380 65987b38df2e358cd332cee2d84ef7203518f8de legacy-trunk
+58381 965e7154177c695059381085612bce955f8a53c5 legacy-trunk
+58382 ebf2a5cf13fbde1e45df0e26f087f5182ee5a9ac legacy-trunk
+58383 98f6180b9b3330b101f4c1063621de6083fe0d8b py3k
+58384 33021e403f3c659da33c7061ab4a66d27138b73b legacy-trunk
+58385 9c3015fc5bf4599702da7acf0a93ef39a53c3664 legacy-trunk
+58386 c48f9381ddf130f6747c2b4ff85ecfa01cab6cd2 legacy-trunk
+58387 dc6e2adf8dd2a306e986b7f6ff353160fb226800 release25-maint
+58388 a1b76757d62ee0fb061756b33f412af510c7d6c1 ../ctypes-branch
+58389 24d111809480094b3713b09e4b771717245a4d32 ../ctypes-branch
+58390 47c02791ec6b2c6bf160ccb7767b7d38cd41804a py3k
+58392 4a72fc5dfb79b3d20a77f5acc10e32ceb425fe36 py3k
+58393 c94da84765ee30252ab86f8a088033927e9b61a2 ctypes-branch
+58394 fa93dd4e34bc230467b1900cbc69632fef891eb0 legacy-trunk
+58395 bc25bafa33b1fc46f8d81a370e8a2be2f9877d18 py3k
+58396 37d8270ac8d961b483b859f8a001d8814493a5fc legacy-trunk
+58397 340e6fd5d75f0555528846c468df708c0935cad3 py3k
+58398 415b1bacfed7af00cd35565c0e33d00f6063bcdb py3k
+58399 8c5e60ddaa827b5f0173515a3b1118fdd1ddaf22 legacy-trunk
+58400 8d40c5348ca9d93d02d880ab7681d41c62fe4d56 py3k
+58401 da52b4c776a454fa1a0d90a5630a3bdc7512b246 legacy-trunk
+58402 06ba42c2c0d0746a56d5f6c3fd1933615f2adf95 py3k
+58403 e5d6893dbb36ef44e9028bb6fc335b61e3a1d39e legacy-trunk
+58404 1d52e783842da1a80671081a9e837c959d01a8b4 legacy-trunk
+58405 9f7de18431fe950d5391e5774eed1cd045810999 ctypes-branch
+58406 ffec49d3d215471fbdfead7b11de6a2ccf8fbbc5 ctypes-branch
+58407 4f9ecea8177cbed97b9a6c18f5212fad8bda0c86 py3k
+58408 b4d8f71459e949bcd057253213acd4097a6dfe6a py3k
+58409 4c189c7144b794b467b34aac8ce45e6d318f0732 py3k
+58410 2f30bfb7c7385f38d0477dbd8e85cdfa459a0831 py3k
+58411 b9d19d51de36975a5e7c45705d965560d4311c13 py3k
+58412 6e60f65ff3647c9f1708c5b54af66ce167635902 py3k
+58413 2b746f28b399a710697d8a310ac20caad6e92d8d py3k
+58414 99371bd2ca8f87d9b5bbc4ce40eec5c8317b8765 py3k
+58415 02710b89701e0837531715c64d9015288f7e9f66 legacy-trunk
+58416 39c9b5612451a272738463a810ad0c256cc0e495 py3k-importlib
+58417 39cb5d96ce77004e97274a41ef0906a6b2fbebe0 py3k-importlib
+58418 8c5a433a9d90e7da351ec554132cf4761ce4883d py3k
+58419 bf1014448c417d94856eb3c137dcc2c3cd49e4ba legacy-trunk
+58420 b6378fa6e16490a72a4f6fd56fdcc4c0db70137a legacy-trunk
+58421 ca9b08e7dc23da010b0f1d1a7effa24d5ad1488a legacy-trunk
+58422 e49ae998080822e3471a9d4acab7b950f866a6d3 legacy-trunk
+58423 16d4b904851fe0a1b1746246e7f236e667e4e61a legacy-trunk
+58424 cda0b625275a61b1a6b1dce24a4e8c26faec2651 legacy-trunk
+58425 9b6a473cfa228b2d72e64fd6c9bc0eb06313fa09 legacy-trunk
+58426 a44e4cc33f5e03dcee59cd24c31cacdd5e9261fe release25-maint
+58427 a262178c1c0af452cc719ff3f8ef25092ed3e2e8 release25-maint
+58429 a3fd6e59ba836ecf4713808066c2e78c69857c79 py3k-importlib
+58430 81f598a76f59fa34280e66a0496c108c85d758a1 legacy-trunk
+58431 fc048b72bf3d08aba4684965bbd732ee479d9f97 release25-maint
+58432 d0ba39de7ab7e50c810030af68db20db4df3129d release25-maint
+58433 fb310b8620ece1d165c5760550a9acd26e25d0ed legacy-trunk
+58434 9603221bba902ab032d0eb460c22c67f2000dbfb legacy-trunk
+58435 104d2f29f886b8c92eb7553224ea5f51f32ebbf5 release25-maint
+58438 6a97f7260cad0985f38f0de4b2be1cfdb76feb7f py3k
+58439 833b0e781506dad0a29245cc3aa671bed1fdc385 py3k
+58441 fb9d5306f4c72240bcfd4d243c423326ceca17e9 py3k
+58442 993e24c724b8c7d32bcb93d15eacb18fe554414b py3k
+58443 4ea945cbbb6d49d1e41351328cbe949ce8f0e059 py3k
+58444 483cb41a5691bb556af5229d77dc5957dd2df603 release25-maint
+58445 3586631d8d21c59367583d7f278a6aaa45877890 legacy-trunk
+58446 9f0366260cfbb4873708ef1a05e24334d031fb12 py3k
+58447 644e28ea9b22a460ffc0c572cb4673b39ba38f69 py3k
+58448 8e72dacf7f3a527b125a689895aa07ecab861b0e py3k
+58450 02a33dca4001a58fc9d5aef2780d46bff71cf866 legacy-trunk
+58451 c3a25820f51235cd4be7d4261d9a5bace737f91d release25-maint
+58452 9925ce1fd7be7dfb467984713023e1afa13f6482 py3k
+58453 306d5395dfa2998099e4953d5a1f5d8cf67e9f9d legacy-trunk
+58455 ac62eb267206e15d39944b663a77b609e98d602a py3k
+58456 0015572d11bcf9863f1106268d21a2eabac78206 py3k
+58457 9fbf733a0639bea77d9105bec1a87ddb97aec2ec py3k
+58459 4e05c24e26f8a534b64b69fea1a34da3007e8ca3 legacy-trunk
+58460 7e27d50c86721e61ffffe9704bd663ae8367b7cc legacy-trunk
+58461 b4035d3665bb830220b1c35d57dffd56cbef62f7 py3k
+58463 126d2fb735b5a264c06a5f81536a633123d20ae8 py3k
+58464 5ad578ae9873e6174678083d3ea303373b227e10 py3k
+58465 90294d80a3c5bcfde6a239904522152c2cb986ea py3k
+58466 19319e70fc3edbb45b2d007161c1b3a1de094181 py3k
+58468 a5a4b786bb215b6b0a8ba940b846c11e14cf4d67 legacy-trunk
+58470 2195d1f179583af6f0c3ee85ff597ce6fbdedd67 py3k
+58471 697400fce7c5c04b5b17de8ec70de7dc228c35ea legacy-trunk
+58472 50599bbb0c6723992ce74247aff6fbe890988494 py3k
+58481 16e237ece27d39d478154ec8ea0b05602144cded py3k-importlib
+58485 c9e61d66ff6518281ec640d3e3370d6ddfac5c54 py3k-importlib
+58486 6cb6397d221af2a8a373d7f6eb3a03c192932b3c py3k
+58488 d71384cb56044da1991afeff3b7e76a16c47eb4c py3k-importlib
+58491 e72ad4d256e840bb7d9845055073f0b3800c977c py3k
+58493 697cc31a83f65e920d2f223ecdcddb92688ed27d py3k
+58495 ace45b361e873e0e17d822096bba33465914a51b py3k
+58500 4060047b3f1d3b20cf014872da111b41c6f39545 legacy-trunk
+58506 046edaa1566a7b885d68b584aceccdc81c62c20a legacy-trunk
+58507 7ca0bc0ad96035bccd051ab24b2447e932cf8541 legacy-trunk
+58508 016da8e2f94b8cc383c0d94461617f15f92bc743 legacy-trunk
+58509 c8ee260730503e991f21aaf4e00cfea1796b727c legacy-trunk
+58522 6157e0d27eef61394afdd6c83ad4ed1c890f104d legacy-trunk
+58530 da44334ebea2452cb2302b838eaf8ce0616e17dd legacy-trunk
+58531 f1f701c224c1c0b9e4bdd69e4b5eb60021fb0b72 legacy-trunk
+58532 27a4d224ea1b909aacb8acf8980a9c996eba79ab legacy-trunk
+58533 b83346f3bfafda4c3f17192a31f7e116b3ffede1 legacy-trunk
+58534 143acbbfafd7c706eccf879c99604a2826865ea1 legacy-trunk
+58535 6db7bbe8f27ce67242e96f02b67a0ebb54aaec13 py3k
+58536 d2165dc1b08dfc065196df4f8d0d276db2ab29f8 release25-maint
+58537 cc15836b6808b998fbed94196f6790eb287a1c0a legacy-trunk
+58538 e9af70638888dfd0fd09c1bf1e751838f38b7d3a legacy-trunk
+58539 f2677843047004de6360342be6dd9b677f82b142 legacy-trunk
+58540 44507c4dec2b5f284487ced30614815f83470bf5 py3k
+58541 d37c0051406e66e483f952bac82a9c644eb3f094 release25-maint
+58542 548d06e98f5645cf7064505425ef5049ad242c8b legacy-trunk
+58543 bb5cb89efe18ae8c0e4554dbe7d31061fb60296e release25-maint
+58544 96af41e50e56117cd6eac7e7e269973fc163f4b0 legacy-trunk
+58545 bdd92425180f4bdf33bac2a420f2e75905da55a2 legacy-trunk
+58546 2320cd4f68b58ba7feb126897113ca19ba2f8674 release25-maint
+58548 8a0167416223205925df5c5460bb42e915366636 legacy-trunk
+58550 80744c8d34d8b14cc52cf21940620fe1543f786d legacy-trunk
+58551 dd03aa741f56889c512628f626f51f12ffbeca3d py3k
+58552 b18f6092f6e0177ed27ed8ef6cf2368bd935e88f py3k
+58553 a2bb76d11d66b313e4a958fde5028197cfc78149 py3k
+58554 57f3f126f3f7012cb2cee142785e4c5734b5373a py3k
+58555 7593436058dd5310142ff452c0e4bb9bffa34ed2 py3k
+58556 f0bcc11ca965659d431c928c2a7beab78881fb25 py3k
+58557 d378acdc30eed22ce8d68b5bf78fa5f3976d4bef py3k
+58559 65fe195518cb2fd0bffa4819377572fbba3218f2 legacy-trunk
+58561 cb94ebd9afa7a1acf6f955d4fffaae07ec00ff61 legacy-trunk
+58562 a2140eb5fc6acef14e8ddc9797741af14a7757b0 legacy-trunk
+58564 3cb678628af38e856cee3d36b806c83dd10be4c7 legacy-trunk
+58567 252b9d22ca555c70c2b8f20c044bbd69d740e046 legacy-trunk
+58568 d7279c321bb7cc8e24dc3ca5ffa50b79307add51 legacy-trunk
+58569 201dd09499990ef129aa0ee5b48c66d5a8cb2267 legacy-trunk
+58570 c4cc3c2489a0482950b981d1f17898c72dc8aa5a legacy-trunk
+58571 88997f0821749ad0fe156c7151b20f37ad77065d legacy-trunk
+58572 5e42117f9cbcc0105350b14b299347d0eb50494d legacy-trunk
+58573 25296ec02b19c51fd2d1f46ee4c5760ab1f24e08 legacy-trunk
+58574 5cba14a564fddfaed80016d7561ebd301d4e23b1 legacy-trunk
+58575 8fe226931ee721ae3dca115ad4c87a6f26c7d6f8 py3k
+58576 7c35a5931755fd65d00f809094c613b125a90a51 legacy-trunk
+58577 1bf476239f3959e20bc0d0595d53733934262569 legacy-trunk
+58578 a57635100dc3946b166d2ae7d80ceb58ad4fb6ef legacy-trunk
+58579 48220d644c8e109a2c013a402f9e773fc1b94708 legacy-trunk
+58580 faf5de69e9771e6766a0840af52310678aa92092 legacy-trunk
+58581 c5c97d7ae90ce8f4f5e7e48e7e671a25fcf8b396 legacy-trunk
+58582 4f662ba09f1fbe3861fcd5ae85c0c3526de1be33 legacy-trunk
+58583 6df985744d9678fa8b08f29a9dc9f86a472a6989 legacy-trunk
+58584 03056365a1b662caf2876c43ad3fe5e8be738b22 legacy-trunk
+58587 0067a6ab4854e71657a5bb92b72ae2717f26a26d py3k
+58588 902125b594cc899f88e7057979ee9d94505a555d legacy-trunk
+58590 1782583f1158bf35903597f94bfe28dbeede2501 py3k
+58592 a58f31937daf9cdcda7dc93efeb41a72eaff6cd1 py3k
+58593 e82d9a88ed9e42852c5adef1d4c35ae7a78a0a37 py3k
+58594 b6a29a0ea307d3939de784e09eb20b957ba8b9f2 legacy-trunk
+58596 b10544827af70b35703c2a4ff3fb4393a3ba8776 py3k
+58597 a32e7ec93394e1525deccfab21e969fb1c9c227e py3k
+58598 04088abf4e4fd03e7885456fe38d17fc3f844b6c legacy-trunk
+58599 53ee8943d1658daac3a80ff81971750288baf4fb release25-maint
+58600 dc81bcfc351ae01ba37e3f3b677744087fa77c69 release25-maint
+58601 eb908a19c05a24e0803066b865c7538c8b3da150 legacy-trunk
+58602 95d8c913e8bf36112ec77ba636c711bb1dd1413d py3k
+58603 99526c40147b145b4bc20a0179dabddbb6cabaa0 py3k
+58607 cd5b383a397e6e212df6ffb5d326bdd2a2cacb26 py3k
+58609 441d609d096b5df6603e14f748cba4796286249d legacy-trunk
+58610 634c3d4048e7d7d70e651963b1c5d8aede81c9c9 py3k
+58611 f9b7954d788d60cd04d524ef226f6fdada874b1b ctypes-branch
+58612 da8230faf2aebbfa3180b488aac5389bb2f2ae63 py3k
+58613 c9f28697e1995b9300d2066db55eabe74e3394b7 py3k
+58614 79904e841df380c60dbac70f8986b4c1ba3e4f00 ctypes-branch
+58615 34792b9e4b428deb14d6699afc1b7a4fd8454f37 ctypes-branch
+58617 003d35215ef2ac6267efd1ca4c5ca5d71ff9d3ee py3k
+58618 0ca1d29b83c2b6da9daae9d2b170b8da98defcfa legacy-trunk
+58619 0c76e53c1d652e137883d19a75f51c7968dbd48e py3k
+58620 a0983f55c9575cecffe0d04f956aeee41c32beb3 legacy-trunk
+58621 a760c1a07d26f0a8f11565f7ba3e7ce82c173b7c legacy-trunk
+58622 36b2aaf457b4ae2b842cdf1eed184783ab562ac3 legacy-trunk
+58623 08ee256a9bd119164230326fc256a99f77fabfe7 legacy-trunk
+58624 7408e1ae98c4a075bca8abeca7a786a175b4a03b legacy-trunk
+58625 974e64cc083dca926cd431c3505464952690e1fb release25-maint
+58628 3a14c904da2327c0410dd20a47bfa39b422a312b legacy-trunk
+58629 732275c4026b520ba4e164e6cdc90cd52302e800 release25-maint
+58630 e53d95c3c0c4db14e99eba3acc1699f2b6564e3e release24-maint
+58639 3df5c7461603cfa9a55bec79dd0f157cb74e5817 py3k
+58640 33efbfc28d2b379b53c52d277cc2e6b47cefee9d py3k
+58641 590a1beeef89d1dac1dcb124bef33cac7d6a37c8 legacy-trunk
+58642 7c7b42f64f41d418d83584d87e64b2bc7ac952c6 py3k
+58643 bac343adffd9d2732f7ba41ec6df12f3bc324307 legacy-trunk
+58645 3e6348bc9a2837491049ebc69a7bb18d85292119 legacy-trunk
+58646 8dea59979ba2e988baed52ee5a23fdb749a943ea py3k
+58647 57c0d08843064859ee1dfcb6a7e1ccedba87bb2b release25-maint
+58648 51ba12e0a1d50e273311e746e12e62e1e8d850e1 py3k
+58649 8fe24e5eeeffb99d3bacc495b9b0607c978e3c3e py3k
+58650 d66018ed3ded590ba1f6c66705ec3ab004037dec py3k
+58651 900ef0eb3f94b5012501f4028f9aedf115960095 legacy-trunk
+58652 35da915adedcacc1a032a8a84b5c17e7587ef15f legacy-trunk
+58653 823772f1d2be908b5c5492e0b74b38bbdb992b9e legacy-trunk
+58654 fed64314d944983fb3ffb833809499b7ba722b85 release25-maint
+58655 530573cd4f7a778168bd061dfaca8a200fe9827d legacy-trunk
+58656 509a736ebdb97062066a1da5720b4fe9b2930f65 legacy-trunk
+58657 a8818ffe24d11f10145c351e4c68a95c75808924 py3k
+58658 7075d464d938453fb38642946765faf51dbe3c9e py3k
+58659 06bdb8439e2984c276476082950039e9c8e317ab py3k
+58660 d3bf009fbba98d3b7c322dcf1eceade63b868f7f legacy-trunk
+58662 4bb6a0c353ab686e765712f25b164ed8ae1d19df py3k
+58663 5b12b0bd81880e98f00e9c97362afdb57e35d4a1 py3k
+58664 1998ee0eff2c1266a9075f80c2fd2141a3577c48 py3k
+58665 6ab64f6b4c0317e710aba79e05c1c8a6fa3ee370 py3k
+58673 06531848a3946eae8993a4c4edac089110bd0a90 py3k
+58674 64ce3bf3a6a9d38dc850c61a1d267e3c24bee63e py3k
+58675 fc6ba088bd77cab18d0928a729872d929192d4ee legacy-trunk
+58676 5a4e8bdadb8504cb7a17ad1172ae0bced1564979 py3k
+58677 50a3475db466b7d9d3ba1ddca7271a60365d8e30 py3k
+58678 0502a8c64ef20eff8bb89c55579ccd6a7494126b py3k
+58679 7fb868023d75aef85fb21e1e3420ae82aeec2476 py3k-pep3137
+58680 1726a4c916f013143db0c809ec6bedf8c97aa9cd py3k-pep3137
+58681 fa7cd8eab2d2c3e07ebaad03d3aa29c7fe6a1ba0 py3k-pep3137
+58682 b102b8361d5e93cef541f799eae33da3c9fd110a py3k
+58683 040f522fee11238f206c8a061b0dea7af6d0f54f py3k
+58684 23e6ec1b5f350d6f5654ca796debf33e147c1b0d py3k
+58685 ffaa6ce4bfb4789becfb9f6f7967fa6b335d0926 py3k
+58686 d46a31f5c5df26b0913d62e3ad8e33e6b06b2930 py3k
+58687 fd4d10e993b79c438eb1b2c670ea7d585a657b69 py3k
+58688 97e2e89c65912f2d622a5590339cd33aa450ea79 py3k-pep3137
+58689 e189d32b3719068baf6bf27edb6470266d4a027c py3k-pep3137
+58690 61bc82df35ff906a734dd2b3f7a5c835ca084502 py3k-pep3137
+58691 5d0be97f17040cf3e4bdc70d1407b548972448c8 py3k-pep3137
+58692 2e9edcdddd443a53cd8fd5a75365da65f39fc03c py3k-pep3137
+58693 dacc730c7298d5902619183c127ab66b7ddb881d py3k-pep3137
+58694 8fd3db653318ebedd80687bf0dc644af4af26d39 py3k
+58695 dc98162ef844f0a6f1d2de069012265155a00890 py3k-pep3137
+58696 f5bc9481f883fca64b95e3af27df6813e23ed710 legacy-trunk
+58697 608ee4b820afa720cda3813bee8fcba021da4723 legacy-trunk
+58698 365913d7af7d65d48bdf48f67e1312685fab7b07 legacy-trunk
+58699 91fd65045eee68adbf84eff3d6606d641977c00a py3k-pep3137
+58700 7360c12bd81d49ed8bac51d0f77593c224608e41 legacy-trunk
+58701 51a7374105ac4c3f5cb53187028fbb0f69bcee17 py3k
+58702 3f467accecd2e462b0d7b5bdf8ea5b6dfca89542 py3k
+58703 12d20fdfea62f51974c505c99b2253b2966c5ff5 py3k-pep3137
+58704 d8f7442b8cae866fa8fa512f97300881948f517f py3k
+58705 c34720777cb66ff34aa4bde8edb07adc746970db py3k
+58706 40e3a2db5d9e303dd7a9ee054180c1809c23354e legacy-trunk
+58707 32354870dfb2bb8ff6126a6cc1e35a5df4373e73 py3k-pep3137
+58708 76a55f7b50600752a1a27a51fbd8753a67316f2b py3k-pep3137
+58709 124cbf1a0e3ea4805192e9e87c5ce8be7c5b447e legacy-trunk
+58710 a5dd278b0c1fba40dd79f4cc478e46048954ebaa legacy-trunk
+58711 00b136b7da844d32de88d2eaa5d921a2fa93da8d py3k
+58712 47c553eb75d91d26ba26275463da991f024b424f ctypes-branch
+58713 8f7f6c850dbd262b69c2b53c84f209ce2e9c6d65 py3k-pep3137
+58714 26fe7089f14af1ebd237dbfe71ddbd35d023cdd8 py3k
+58715 33480765f669301fb421fb50a1d7d30c033fd118 legacy-trunk
+58716 e2fe58604cb1cebf78eb464a00b791f42512bf8d legacy-trunk
+58717 8edeb5168bf5166414673fd8b7ab7893c5d5b10e py3k
+58718 c1214bd6ed16052e99ee1ece015469854388d2fa py3k
+58719 e510b716bd80b7a769cfd5b9bc13466aa6a88924 py3k
+58720 04682687817eb944af09948b57b1cf1dca8765f5 py3k
+58721 e91506b4b85f8abd03ef8f753ba44bce80304e65 py3k-pep3137
+58728 78a8aea6cb0ae51e32d5fc262a09d63f5054d2f4 legacy-trunk
+58729 e234d976b5d47b70017c9b43f72f77d5963e64b9 ctypes-branch
+58730 e3a01f493e94f3583808a9cdb5b460c0472ce582 py3k-pep3137
+58731 431c5a1a6290110d10ee9a30cdbd000b54d1adb2 legacy-trunk
+58732 bcf629e43082783b252ee0b35011ab8fe1318d68 py3k
+58733 52531b4f535d3b94969ec074f909e092a39a1126 py3k
+58734 eeb372818959557f3ffd4ce8830001d836f7f4ae py3k
+58735 fe570cd5b18f1f2d6670d57b95c8ad453b12062c py3k-pep3137
+58736 d47a04a2e0bb45e5e9167915a545b6d2a9c6bb52 py3k
+58737 ea65011342868c422b9e728e99599651b704c410 legacy-trunk
+58738 60d96120460b1c472ea9df4328f00e5ae77489c0 release25-maint
+58739 e420aa7f50cb50db354548c92f900e950d8b8f43 legacy-trunk
+58740 3e738e52a3ceb11bbea4573425f577702a6606fb release25-maint
+58741 bef88da821a4c2c72669a0e4cd536fd5f3f6e3e7 py3k-pep3137
+58742 a2f9e6cef02f78a7a6e4870ff5855b323dbde9b2 py3k-pep3137
+58744 fbc6fc6dc4ffe1b2c2747c7250ab55817a7598a8 py3k-pep3137
+58745 431bc909401955a2103cd0cd6dae3a6a393b1906 legacy-trunk
+58746 021cee189f9e1abe5b7c200072219c05003c0fa5 release25-maint
+58747 fd685d7e859aa10dbd4d6e3945c848b77922a969 py3k
+58748 f87dc6a04ceaba307c208bf2c1b02cba0858889e py3k
+58749 3e5edf19d5f05d2ffa1d021da781615fd2d85f04 py3k
+58750 bd2f8bb11bcc36251b1f0c440b55688617996717 legacy-trunk
+58751 e8d003b3870f03e16d529f8e3e0fff86d425f982 legacy-trunk
+58752 3d866579117da708978dd79a7d2bea59e0a98361 py3k
+58753 79f5ca9ee1549c15f5588ca3e7d3a0113b4cd9f6 legacy-trunk
+58754 0f741c89d803aa38e277aafd54d9a36adbd3c3d9 py3k
+58755 c00dc75867143e798903db92f5c615d75d89d62b py3k
+58756 2b7aadbcea34f65e48353ae69e9d8c86291febf0 py3k
+58757 157bb02892bc94f709b46aee0d8e3e773deaa48f legacy-trunk
+58758 5a1cd3ca0b391cb7e45e41d6f559a55b51f22a21 legacy-trunk
+58759 c19b6849411c0324087639e4c08795b5bb9f5437 legacy-trunk
+58760 ed3c2aaa002a2a7b09b141f0db7561bf3829e2ba release25-maint
+58761 99ff9dcf3760e128d989f97d3b4b99fe28074264 py3k
+58762 e5eb93a0a20e05231e828a5a52a5594f80f5b992 py3k
+58763 32767b4b7921a9c9e9c6c2b9c432c5af63e3bdc2 py3k-pep3137
+58764 8ac284b65e37e068b982a722e2c445250de01cae py3k-pep3137
+58765 8a40b831ab6899c504939447597f5796b8ec2799 legacy-trunk
+58766 c4624dc0d41b107bbaae08d9380408bdb7b035f9 legacy-trunk
+58767 5890d510aa6f74651891e46d95ef110e9f8acfb1 py3k-pep3137
+58768 8948f881e403fb2d51e5a8cb407d29d567137ce2 py3k-pep3137
+58769 27486a02ae64fd5a89537502e8129a7c0965c4fb py3k-pep3137
+58770 870f70560c8f2891b340e918ed079484dfac3ef1 py3k-pep3137
+58771 b6c8a669c79ca36608f081f40fea2838354cbdc7 py3k-pep3137
+58772 04be89fa7497c29e2a3b051cff6812b263091042 py3k-pep3137
+58773 d7ab5af3c98ea965e56f0ef01489240bd89961d0 py3k-pep3137
+58774 b4e8e523b882ee26d6e174f045c3a65e2cf18827 py3k
+58775 5b3be4ab2fe1d11e33adc1e5034d1e409d1cd195 py3k-pep3137
+58777 ee1bc834d8c6fcd6505356c8f80f6f6d0783edf7 ctypes-branch
+58778 c50e6f92419f3a02f0d1769c104ed0772e6f67e8 ctypes-branch
+58779 11c2fde78d5771b73c2ad93faca4789ed0d779aa py3k-pep3137
+58780 8904a0bcbf4ff9226ac9c681e3e4976334b230fc py3k-pep3137
+58781 2a9394fb50ac16c7967b609c51d451ad8e8c990e py3k-pep3137
+58783 8c7daac0d4b0b3f446bc72d6a83db25b33d9168b py3k-pep3137
+58784 5fcb6602c49a9c5dc114dc8f2eb67a01a644c505 legacy-trunk
+58785 a7f95e2b935824cb1bbcfb27c4c29ee220bdd74f legacy-trunk
+58786 b61083774c08c4054cc3cc8a64dab2678c2c0860 py3k-pep3137
+58787 06046d1790b930b94d5299e9a9b287d6d4389192 py3k-pep3137
+58788 90d5d84ca27d81f4bba89ffd4937afb306da0cc2 py3k-pep3137
+58789 a98234451669e852321e0df3178f6a2fdf9f44b5 py3k-pep3137
+58790 6da90a5ae9faa038baf195263ef0e092c55af3ff py3k-pep3137
+58791 4264a07a39d13f694659db268385a5227eb082d6 py3k-pep3137
+58794 a030ecea4c24b75caaf8edc318e9a17e524b4adb py3k-pep3137
+58795 2803e96cc64af8c4170cd3d00f04a760bffa4a0e py3k-pep3137
+58796 4b3623568e6cf84c89b53685d2095a7553b5a26b legacy-trunk
+58800 844ac2cdf7a8e05911dc4a69d2d8915ec382a32b py3k-pep3137
+58801 7c43f4dcc7c7c0b8609e42ab4ca87b99d52b7ea7 py3k-pep3137
+58802 6d46feb164b6bdf67cb835cf0b0c1d40c5334302 py3k-pep3137
+58803 00c98466615b23af5683e6f09b319ef333b92432 py3k-pep3137
+58804 8bb3e7768ca68ff238ffdfdf36fe733932501db0 py3k-pep3137
+58805 ad8c3f9ec1b297862a643f9029f794531a7cbd54 py3k-pep3137
+58806 7edbf258cad0011932395826c0ca52f6f1d68955 py3k-pep3137
+58807 119f841bb8164adfb7c0dec9979e413358e73093 py3k-pep3137
+58808 01135ddd726dca9e19ffb64cab1bd5921388d849 py3k-pep3137
+58809 35752848574353282cef2fb1d1b3bb6638a4db72 py3k-pep3137
+58810 b49b3107e42030cbdf7bfeb8094a5978c1adba32 py3k-pep3137
+58811 a8e7cb9e37c945d12f03804e4d9a174de00e4fee py3k-pep3137
+58812 142f26947aba7d842119b07c4661d5b7c1a65db7 py3k-pep3137
+58813 d249545ba79224a4cb268fd72de4f59498b170d5 py3k-pep3137
+58814 cfcfad87eb7d0f4e1276b1db7b8044d13ee7cf7a release25-maint
+58815 704e6711e50dce5e61a27500dd72435ea7804ee8 py3k
+58816 d2ba2bf4e76bada584a5f518695393027016439a py3k-pep3137
+58817 317ba53cd45c8e6eb0ba5f742409e682790f73d5 py3k
+58818 522bbb9005a417dcd17eda9c6274df15e6134f47 py3k-pep3137
+58819 2ff0e81e68fca2306e50b7a3c757a10317f53852 py3k
+58820 a4140a28c3e761cb23f7ec15d1ee5b9466be9e3d py3k-pep3137
+58821 87d38f42d163440ca42c46bf68d5cf0f5d3a5c5f py3k-pep3137
+58822 6e491d12765c5f7b4cf251b21b534f49ad63f9fc legacy-trunk
+58823 4490f335bbcd38bb720f6982849b754e2c8a3a07 py3k-pep3137
+58824 6adc99a6888fded0d27c3550c9fdafdf8fdea906 py3k
+58825 8fd694d0f902b8647b4cc0e034d529b3b4448e13 py3k-pep3137
+58826 0c517179cb8c405c56801c6b8abbfafc3ecac2a8 py3k-pep3137
+58827 921af7f27600f7c49439ce6a052e748d1c76a259 py3k-pep3137
+58828 9de07275b0087a66ee6623a91f9c778e76b8a47b py3k-pep3137
+58829 fd1c10d21c9ee433d51e8258597097536599d1c1 py3k-pep3137
+58830 3cbc78c3a4035495e4b2f047387db8d77d49431a py3k-pep3137
+58831 f61a0ee7476fac61234bea0730cc86b4b67674db py3k-pep3137
+58832 48e77922411d9c5a58ccdc5a3433cb9a460e4266 py3k-pep3137
+58833 b3f86c41d0a3a0725c88c24318357d36aeb1c04f py3k-pep3137
+58834 f7b4529d09842a3d6da918337df401abc5a1637e py3k-pep3137
+58835 14dfe2f135823299e7890a3562c8cadb06243138 py3k-pep3137
+58836 e90065e17212020786b251d36c4ae410bf4b2d76 py3k
+58837 658cd34a8c5dbe1968cc8e7acabfc92057d62387 py3k
+58838 de3b63f8b17b6cde64a1f1017415eb192a9cec9c py3k
+58839 03c3a54072d91ef431bbc5781264032549e28a7f py3k-pep3137
+58840 1891257dfd113da68224173bf37b6719581e3a57 legacy-trunk
+58841 09f922c4f88725e6ad7e95914f8f6aaa4de7b6b8 release25-maint
+58842 ef1d3e87296f36589105977cef24e7de9df87150 py3k-pep3137
+58843 f1fdd6b7015f005c52af11f22ce89322f280a2e8 py3k-pep3137
+58844 585ad7713efefee420a26521795704891b870b90 legacy-trunk
+58845 447d2a4501cb72a65c1e78f4768bdb689c6c1ad3 py3k-pep3137
+58846 50423f44e6dcffc5d21b17067b784d6d9b22d03d py3k-pep3137
+58847 71f8435751baa5c71fe083ecd33d9587b29859b0 py3k-pep3137
+58848 153c0c7441aaf6fe114081b966a88c06cd4df942 py3k-pep3137
+58849 5acd9df271085283f7c287905354d9e65689bd07 py3k-pep3137
+58850 51a0de9bab3746af1a5d7f9631cb6ee8a5d68276 legacy-trunk
+58851 8d4e9c4f0350a1e0b4ca1c367803431e86e9de4a legacy-trunk
+58852 37423c76e2085868a96dd8ab005ac3f6c3614a6e legacy-trunk
+58853 0fd1caa85225faca259fe388016e36d6e06004df legacy-trunk
+58854 37156945ca3516e5b7b8a6559c738edd09a6d878 legacy-trunk
+58855 01e6333f3b6cef23878bfcd01008483f3c87b84f py3k-pep3137
+58856 1987dbe7eb6e7d717c7084a4b0105c95c092e96f py3k-pep3137
+58857 08ee3c73b6becac1625505d6b86f88f16dc99733 legacy-trunk
+58858 70ef0b6a8345f122a959850b169e2570f6c50de2 py3k-pep3137
+58859 fe9c2233cd04f8328f91946f7b78296cfe04ddc8 py3k-pep3137
+58860 30788146f0a6c07ab13826da04417829077a2f1d py3k-pep3137
+58861 778823c0ffb6399b3ac78aeb06c50e21d92823fa py3k-pep3137
+58862 f3c337e9d1e597c3ad4a393a1b3ec7eb114a86ab py3k
+58863 f9d401f1e1ef0b0c7bfc59ad93ab18bd12e2e7fe py3k-pep3137
+58864 c490ae08d608b0160838bb6339760e81771a1dd5 py3k-pep3137
+58865 c155f1deda65d847aadfc22f5b8e9ca00fcd589f py3k-pep3137
+58866 79fe7d06206c18f440c4e581adae1bedd2d3741e py3k-pep3137
+58867 53af046cc2c52e2e83e7492a75d27d5ff75b4560 py3k-pep3137
+58868 d7db467cd9407aa0964047a4b2d5b3dea64e9d39 legacy-trunk
+58869 a494a91512ec9ee4582ea6c6a5fdf186fed70e7d py3k-pep3137
+58870 8d31a36f0caae5089de0cf9348c14ead4aa5cbe4 release25-maint
+58871 d24852b86d70bc264e91c9740b6a772da112634e py3k-pep3137
+58872 29a598e6938260f8670917b9c21c120a53301514 py3k-pep3137
+58873 87178f35d7007495796a8c5b151b2d9369c5e9af py3k-pep3137
+58874 5531384809185365f61af8b6af90eabaeaa72063 py3k-pep3137
+58875 cc65b640198946e4bfba3275a0012916fe808eed py3k
+58876 0b206790feb643ece3cf8e10db53afed92670306 py3k-pep3137
+58877 d824c315fcac28e45daf4bb36a6575659ab8c119 py3k-pep3137
+58878 de973926a35cfd2532388f8ed94d2d555a3418ee py3k-pep3137
+58879 c93ad6c417df251bfaa6b23dc29ad9a475df5bd4 py3k-pep3137
+58880 91ba1698a01186c2d6b7c5aa95d2d9a22e820a19 py3k-pep3137
+58881 6db380852f63fe1cef2ba6b2d525cf587bf11bb8 py3k-pep3137
+58882 930c60f8aaffa72898f094201247158acf2186c1 py3k-pep3137
+58883 fc3bec20ec153888b16d6045a0eda48d28cceba3 py3k-pep3137
+58884 02257ec54d7913cf782af41680c64402233c0f6e py3k-pep3137
+58885 cb8ef2551d0d0e34fc93c8ee540ffcc6e2f4b585 py3k-pep3137
+58886 b310fd2b01847a0c91d07a8fab0785c272e1d0ec py3k
+58887 90d0c3766e928a32b60bca63feadf3a3a95b3b95 py3k-pep3137
+58888 0d462d789b18ec6a59ebe2116688d5b6985c215d py3k
+58890 cfe8fced8a1226aff0f144b0f9b94f23f8745028 py3k
+58891 c5f708bc4cb7fc029a7629373011a43d9fd581e4 py3k
+58892 7347f75b9c3442bd633adae532698f24c2a2be07 legacy-trunk
+58893 da58cf9bcb01b5a726bc3665e1ca4035647b89b1 legacy-trunk
+58894 06bb810747e1d36071feea2dbdb1d9d4b8b9ec0e release25-maint
+58895 9f17a9a5b5aeed74b2be1ef0bb6b81d9e8b6a913 legacy-trunk
+58896 8fcc3f46c69de173f28737be5793853ae00c3fe7 legacy-trunk
+58897 fa82ec9c80cd67867ffed22395572a99b5dbf4e6 release25-maint
+58900 de63ef186c1ec50018815f431fe6ff1cd2d43a40 legacy-trunk
+58901 f474de97340478eac71178a9276acbed1ab10991 release25-maint
+58902 7bd72c56f6a40d2d4341bf182c8cc9941f4c08cc py3k
+58903 1247d24b287b8c6dd20e35f389a4daf4d2251c41 py3k
+58904 dba2491cf717625b1ad69fc5d9a09e89b94ca4f8 py3k
+58905 dfb460004cfe2df703986aa13bf8ac3d9083f5d9 legacy-trunk
+58906 2f04abd133944de3137f00d6b6ad40ba1f5b2195 legacy-trunk
+58907 2d8d6855a602419ea9a996e76d83fe2cc7fee58a py3k
+58908 2b3abe3d3ae6ea33d2b39f29834880cb508421ed legacy-trunk
+58909 66d275f29ac550eaf5b7f2a61fcba88ed4823ca3 py3k
+58910 7022affd7bd09cf11553c22f8e0afd437a3edcfc py3k
+58912 6ac61882f9370cfffbdafb4fcf8ce6282bc4483d py3k
+58913 6d347779521b5b252271eea075f9c81c84eb599e py3k
+58914 360df641244d9e811efd89ad0622ad46ba66feff py3k
+58915 b22f27e0701148eb63b21ef2c39154c03fec15b2 legacy-trunk
+58916 2f7c401cb62e049731db36b9e5b012e5c9259ad4 py3k
+58917 3c1f8593a14e4c55e7c006480c36ed41ab784f96 py3k
+58918 ade5663e88868a31c0445cb995f5a70428ddeee3 py3k
+58919 d5c25bf2692eeacfe9cd9b1dbb100ff039a6b7b5 py3k
+58920 83c05d2e10decd063304ee57ee9e7cc485edaca7 legacy-trunk
+58921 81e33bde6ee20ac44a016961aa816e9c90fb8daf legacy-trunk
+58922 ddc7d14be1e9939418b34327839b48169634826f release25-maint
+58923 c1f8831155de0e58b8233bb15f489ef735db6d9f legacy-trunk
+58924 aaeee50a06401671bf5a079336229631a6da5af8 legacy-trunk
+58925 ac12ac88aeea93a106bb68e758fb19bcfc1cec4c legacy-trunk
+58926 20dc6786f9acfe9ff07d3344c2ac8eaeabc1930a py3k
+58927 f82a20dda465ef20d81971c9f1007f175361e1ab legacy-trunk
+58928 1561763cda72dec6cc21936945ac4aa48128fc12 py3k
+58929 197ffb996fb889599b7bf2e5bb3bdf9317020d50 legacy-trunk
+58930 85cf334b32c3ac21ebc41c51561d6e3b7f6cb121 py3k
+58931 487f3737eaefd0213b0e191103be963369049fd2 legacy-trunk
+58932 1adf066f1879a4b937aa89f1e1a4e4628aeecb10 legacy-trunk
+58933 5a169de36de78cbb759f5cedbaf52c68bfdc8c5b py3k
+58934 068655054b0d0d1362aa72b1c0cd7ddc3cfe260b py3k
+58935 d2f9e20120f9e935749eee87915850c3a642ad17 legacy-trunk
+58936 01a5bdc2820a011fa7c6089388c79648b8fe73dd legacy-trunk
+58937 c4e2936d1307523246509c03f1da6ce6d37c1b81 release25-maint
+58938 55cbd0c7aacfc387420bf29357e4621c6af3fd13 legacy-trunk
+58939 4ed16ca4d98008da1007aab73e85f160a44f322a py3k
+58940 29bece14789391df1b3484310fc8ee539d27fa9f legacy-trunk
+58941 ade58eb7c8c75c5becc3b5a129cd83854d68a8d3 legacy-trunk
+58942 af3428fae15fd833908eaa092667eda055d0ed54 legacy-trunk
+58943 00e6165f44829deabf075f3bfee5ef9dc5839c09 release25-maint
+58947 7bc4cc972b0b3c61ee446ac0def00bb4516b4eff py3k
+58948 8ed3a95ca114fb1c2d24020576feaa9c5e4c3e7d py3k
+58949 164a6ac94d3c81f422778faefad0f3cee0477c83 py3k
+58950 5912b66ccc2d5ff75b6adbca7a2094839eaef4da release25-maint
+58951 ce77d91ea1d0bbdffa1bfcd46a430f0c93a66f87 py3k
+58952 d7e9bec1feaa9a5d60753154def0bdedbe864213 legacy-trunk
+58953 a2213060d9ddb048d1da217992cf14c61b2d9de7 py3k
+58954 1d6db9dd3e77a7cc8d89fc8f84ea087c4bafdcfd py3k
+58955 b31f61d7f8b0ee014ebb09ac7eb64b2a8680184d release25-maint
+58956 1e0ea1f03058b5a251df13fd38af17f24c3ab047 legacy-trunk
+58957 0811182a9ce9ac1dd2a09eefa4dd8275938348cc py3k
+58958 73c8e27eb9cef402facf8a9cc31ef931f8fda04e py3k
+58959 ccceaec11442f94a8930333c3a6e998610b0d609 py3k
+58960 241281123fd8351d10e0218d3239a5bf1f10eff3 py3k
+58961 a060b3cc2c62b1296e1c5ce915546ba2a067699b release25-maint
+58962 2c97e24b16cfca93348a8852031b489a5c8ff04c py3k
+58963 76844a0a579f992e2b048ba87cbb3d63f42d0dd5 legacy-trunk
+58964 d5fc6e96091fb6fed237a49243f8230099f3dc63 release25-maint
+58965 0377ba9bc3591752b7713bf48b47a3731e9b90a5 py3k
+58966 e162e881ea5f4e3da5c41d2392cb2dac17a401d2 py3k
+58968 24c84d58cb8010b18e623e793da72fbda187a7fe legacy-trunk
+58969 53fc0f41f68d7f1666c069196ce9365610f94639 py3k
+58970 9a1281391c46e9c53136766abde0360afefea1fb py3k
+58971 8999893a6e22150c89897ae41b386fc5b29f22c0 legacy-trunk
+58972 03ad1db7c80e45d6de6695ea81bd0c6527f88da1 legacy-trunk
+58973 3c29d73c77694e6c73574ce6072c8fb6e225e187 py3k
+58974 ee081609cee8cd3453191242763bd2e341ce8a27 py3k
+58975 98795738b4c2793f0cd8cd8a82195fc1c495da65 legacy-trunk
+58976 0ae9078786b402e3f2bd7f619746c5a0d910d729 legacy-trunk
+58977 019829803848e6f11efe018c3ff834a6a60a969b legacy-trunk
+58978 dd3c4dd3ecfd14cdda87b4f8cdc92aeb244d78b1 legacy-trunk
+58985 1791865a668b9f2db4a0d8c7cf89c1ac651fbc18 py3k
+58986 fa6cdf55de58f36a27420aa69090da9331724adf py3k
+58987 d4f9706cb46b3c2b121e3e438731ca0fce5b11c8 py3k
+58989 516041d52656d481b1575e1e941aa222b6825ba8 py3k
+58990 f4a3b4e155c259374c9dc95d3c095fd4ba4b7fd9 py3k
+58991 9a35e9266379bcaa95b36256db550be0f77655cb release25-maint
+58992 8ed0280c2ab674853ea17e0b2e2aebbbbc311444 py3k
+58993 f444e259341a96e39c54781c6d34e3d3a6d763bc py3k
+58996 de6b126a8d37495b69a2938fb28282876805ea53 py3k
+58997 b59825d9db8f99e660aea1ba57a8bc58d9353ab3 py3k
+58998 c78db4938482c7b6bc0cb863b166a1616255804b legacy-trunk
+58999 590930e17e0c98f87ebd5057cced3d4275a085c5 py3k
+59000 d4193330d1beeaf92b201b26287dbe95386a00ca legacy-trunk
+59001 1739869cbc6e7e3540a645417b78fcbce36c8f9f py3k
+59002 6b012f01a88909329a7f05ffe54397829166a8bc py3k
+59003 e20203d0331cc298f152b1b4db416e9d00b91254 py3k
+59004 17aaf95af909a162e3aab2e4569cef0bc3b57785 legacy-trunk
+59005 1165d261fb05db573f82cecdcffa098a0cd81db4 py3k
+59006 c31594fb1ed44f036aa8d45f983bfbc633329369 py3k
+59007 5590157f4fc6175497fdeb4046661695b18bcdf0 py3k
+59008 4a6a7aea57f4fd8864e826b63536642847e48be8 py3k
+59009 70cfc7b504c286362441022354c1a0f37682d40f py3k
+59010 f6cca4b2260cabfc82a13007b5f774cc939a3e8f py3k
+59011 dc2256e301a92392c9c55fb33084eb86b9abb560 py3k
+59012 71e74562fb6412858eed3b4b056d0e3055f452ba py3k
+59016 a99da893f20c1eadfa02b37e7f33432e28c4b926 py3k
+59020 25a5f6a302925d574921d65321c3288e06467ed1 legacy-trunk
+59021 2df53f05392cc1ae784c8ed53653095853fd28bd legacy-trunk
+59022 1fb353776dfb4e8608bf09667c5ab0dc038d1b98 legacy-trunk
+59024 1494bde510ff94ed96ad50ca2c423f004ddaea39 legacy-trunk
+59033 995d25aac16aaa92bc953b7607f23c9be556b12b legacy-trunk
+59035 38f63419abd6473a44e9c88b7f3a271d84a91753 py3k
+59036 d50c7099d4aa4c0cd44f7badf66f1a6a6ce65014 py3k
+59037 483e958d13c76b664de16b37642b5954eb6aa324 py3k
+59038 1332450bc9521d038e74e36d29caac7ef9a0ec63 py3k
+59039 4cec0c6392c13ad5ba689a06ea057480ba1bd769 legacy-trunk
+59040 520e2ed94bcc530d5dd4d270920fa5535ecaaf9c py3k
+59041 41f7c13ef1611c5bd2011dfec9a65ace5e284322 py3k
+59042 b91fd74f32d8e9c4cc18cfc6aa5d6daa7750a318 py3k
+59043 fcd76339fe1fe6f74f9a92437cabbad5004585d0 py3k
+59044 3a730f4908e3f2db3e8f3e903fa9d6bc4ecde75d legacy-trunk
+59045 70ddbe67d3c460a1c8e45abcb0385b100a31f525 py3k
+59046 19f996553184806b9c796c6c3780680173eab4e9 py3k
+59047 6aa8e135d9f84df401d2219cc796ff2925c3e672 legacy-trunk
+59048 49681d436df9236a634dd60286d10435515615e8 release25-maint
+59049 0e897905ee943d942242ab09c8a248b5c0ed2d60 legacy-trunk
+59050 e5d48fbe16462c40dc22f70f0ebfab4455b1f922 release25-maint
+59051 780c728406e675f2b4fc99ec6ed2ed9ecb32171a legacy-trunk
+59052 da8dcd5cf5a01a3430570819d5a74e3965df3d0b py3k
+59053 1ae9224f4ee7f01a5a407cfda44e8f58060a244e legacy-trunk
+59054 54b973f0f55b5b5d6c056a2ce3328e176f364a0f legacy-trunk
+59055 b6f5781f5c3f0f55cf75215f96ec6c0b8ef615ce legacy-trunk
+59056 4747ef9640ae8b13752170234802c4604cd7620a py3k
+59057 61ef90a1b35e257cb1a074e5e887e14cd34c1099 py3k
+59058 40dfc485b0be37ebaa31c6e891069e8705b5aa50 py3k
+59059 69699cfdd26ed0e53bcf035ef8d41e6f453abe1f release25-maint
+59060 b1bcd599671f05181dc95156240b4a7448d0fa6a py3k
+59061 a915f2b135c095dfe94929f83b6ad320a499339a py3k
+59062 146ba97ffe1ab2c9af436b023c63fb983861feb1 py3k
+59063 8ea7f59dff6bc63ac8fc50b2e670319af76b01bc py3k
+59064 fdf14170337ad78c5ddc43e80b10540de83b17de legacy-trunk
+59065 2a3d73495f184dcb1fd26ec6a68bcd7624b2420d py3k
+59066 32d457a7885bdf3826bebddea499414e94c061cd legacy-trunk
+59067 d3cb16b321d55c3fbfd7a8524fa4f9ad6c68811f py3k
+59068 74f22954f1899db4c49d0cf96ddad25c16899c7a legacy-trunk
+59069 6ca004475aa0fc84378b048284c028bd6cbde628 py3k
+59070 2de7d00fbf192ac3a6ffc1983fa285c85c134e4f py3k
+59071 557614c4ff00f30987b6679003acd40e73684265 py3k
+59072 29b0f4975d9f31e2d106ebb4f3564f1249897958 py3k
+59073 7ab49064d430aa5c93046358a1110ab2d432d8af legacy-trunk
+59074 f54ecf494cb71105026082e839949c8f734083d1 py3k
+59075 8b7d4313ebc0569cac92fe3740d337b5add3215e py3k
+59076 e8ac1ae4503cd7a82807228295d4559e7a0e21a4 legacy-trunk
+59077 9c4bf18e5d30e6334cc344584b0febec38800d04 py3k
+59078 71a17d4d3afa0da41688671e0cc40e1bee819515 legacy-trunk
+59079 2ba5ab3868c90fb1f47d946ed5cf4a29d91ffd6b py3k
+59080 38b1deb4e4ebdf839f7c916f869a4b9762ccc90f release25-maint
+59081 883884fdaae8e1143cfa298c95300aa1692a15f5 legacy-trunk
+59082 8636dcb801ce0603e47a65fbd46f496396c8efa4 legacy-trunk
+59083 25d9ce283b394f1aed69f793ff3c5dd04369247a py3k
+59084 3fb7ed5c23dd690d4440bdd66d79514ec41162ea legacy-trunk
+59085 3b04894116fe222f8214355dfbd6ec6afef5458d release25-maint
+59088 782cb40378f44f87a14c6aba517ad04fa45ce722 legacy-trunk
+59089 2dbcd390b6f1537883c19d3c41dcd4c8a87d2b5f legacy-trunk
+59090 b099d39c3482d95caff72ef2e84cf233a2c1d1de py3k
+59091 2fd7c9111632a2500a10f82667f3df35571bd9e5 legacy-trunk
+59092 6c967c26841a914552bd06e1f5c7e963acf9c6ef py3k
+59094 cbc8b3bd315781e53afb89026e54d01fc06d133b py3k
+59096 8e0c4c710375f2dc918b2436fb2645ecf081e77a py3k
+59097 ea9884f145459885bb514f1ce085d7919b298125 py3k
+59098 2a3ca90008fffec1ecc301cda7a48af6a5928d69 py3k
+59099 32bff7f2975d810a99d69d9b3dab9e15d8da67a1 py3k
+59100 6f149526e864c41046e4ddea3b53f2e57c45a2c0 py3k
+59101 ddbc5e2c689a7a411102d8a59062a91c94301df6 py3k
+59102 092b5306983f720bbe01eb3e1bef9772219588cd py3k
+59103 75364364408b6931d83d89bc505f1d2e52fedb45 py3k
+59104 fe5b2edffae769acca505b28f33a807deab44566 py3k
+59105 23befe540d0d546dd169e7b554bd9bc60680d678 py3k
+59106 103b7f955036ea36f5fec5d3bd6680a56cbec7b2 legacy-trunk
+59107 1209970612dfe1811606014d1ea7384dce4fa95c py3k
+59108 98b4966649d51b093e19197e1c92a6dba4c1232a py3k
+59109 b231bda653a4f9b35f61dcd2653dead8adad68bf py3k
+59110 259e8a2d6f8c27059450e82dd78ef2fab63e8bbf py3k
+59111 14c4bb3c65a7c7eef7ebbf1901e1f8c9299fca70 py3k
+59112 2655d1131232c1cfd25cb209354936932c1c31cf release25-maint
+59113 41b2f26c7b3dbc508861bec4143a195e6b061703 py3k
+59114 d23829a9db21193c6e4f15c4b96c3b14e4aa3a5a py3k
+59115 8d1eef3919f051e79d579b698a660a7727c2f0f0 py3k
+59116 d9bcd94e5935e6b5f91a4b21adac8f1416fba632 release25-maint
+59117 8bcbf322c2b5c2790e7c09fc5f55708e3b7b73e6 py3k
+59118 4a7553b176b6a1a3cd4c301a265d2caf4cf24924 py3k
+59119 72962abd90a16ab856ba69e23ef0f2edbf5c7fc4 py3k
+59120 a8dd8874ff2d51ebb740a343915c00c85f0031e2 legacy-trunk
+59121 f632720d81027ce89f2461a4507253cd6e241a84 py3k
+59123 da478471f1b6b868577fc86d397aaa478bde6bb0 py3k
+59124 6d6b609e457c80752ac5de0571c531ce1f700b78 py3k
+59125 8744e41daf545cd186c125e5cc12c80e5ac3b878 py3k
+59126 3c725a43ac8cd8e67312a464eaca806ee6425646 legacy-trunk
+59127 9350e425e5f3bb7e5b64fff0fbd8a95a4b4205ff release25-maint
+59128 49cefeccf93ebf5ab52feaa1e6d78d067f5d3639 py3k
+59130 6ff68505199ae1851fd6bb67adaa4fe936efceb8 py3k
+59131 62cf08a64bc231404193e7d80b7422347a3415bc legacy-trunk
+59132 5f6a8e2b9e9ca6dd446272e9bb9e1c5261f3618c legacy-trunk
+59133 e725166c8c8184f80ffd6fdecec946750cd41e11 legacy-trunk
+59134 af360380aa16ff37e660ef1f5a422353c9efcb81 legacy-trunk
+59135 2230f16e402b105133d4b8d17a8f6adb5d55b578 legacy-trunk
+59136 ed29b9162ae9e9a738baaf30713e1771ae22e056 legacy-trunk
+59137 b481adb04699ac3d627e5982e4fefb578304c0b5 legacy-trunk
+59138 4d0fe7da4cd5f6f20f4dd1128be7c2bb9e57ba67 release25-maint
+59139 3586a66348bf84ca0dc906b737054aef2ab74546 legacy-trunk
+59140 4e1a19ba3d4a638f5adcd348e06cd6fdf3c124c4 release25-maint
+59142 68caa47f5e153e3557308b337661abf5f4802605 py3k
+59143 11e3e2ae23643d221c601326f49e7901cc0f11ef py3k
+59144 a4a14048669103df2cabeb3b379300611f684633 legacy-trunk
+59146 55fafb46fa455f5bca6e0aac0d467085e731d47e legacy-trunk
+59154 a9cf780f6396a72e9cff807fa95b3f86485e1f7f py3k
+59155 b86e6bf7438f88f339cbc5b7e47a19e88656c33d py3k
+59156 17479a09ec7ccd55190572a84ce7229e82d5dbeb legacy-trunk
+59157 bb1e15bb7b59ec859b94569328da53986f1e916b py3k
+59158 b9b94785b2c72fc5c8bc74a9082f9262b8cb12e0 legacy-trunk
+59159 155e9725da2f934759552fcd1dbb20eadcbd797b legacy-trunk
+59160 cf6038df9d5269c8e1eda774c9e1288369905645 release25-maint
+59161 49a7c7dba8caff4da9f0703b8f492a4598081f7f release25-maint
+59162 0b5357cc416b8f35824bf3341120f2fe12f87f39 legacy-trunk
+59163 2bed841585a9ca65b0b74b7726e474ddbbf9594e py3k
+59164 d3be6e615f8c46daa65af8287fc2658ef6677d95 legacy-trunk
+59165 edb75c098a4b059d84207694857354ed612612c3 legacy-trunk
+59166 6d614b8c512532ecf807110314c73df20fdd0b0a legacy-trunk
+59168 cf2205960cbbaad6e45cd7354a5bfd8ad5628b56 py3k
+59169 2068bf77891d0b4240924cc8c84575d131bde881 legacy-trunk
+59170 2183d72abfaacfcde5ca3ff9f34d85a6e20c53aa legacy-trunk
+59171 4cf9bb9cef91f503fc619dac7023749528016a26 release25-maint
+59172 d5601ebe15a9470d1dd33e85d73527c5634d3a06 legacy-trunk
+59173 14aa3e4e73759b7a667bc7beff163f23ffc57b10 legacy-trunk
+59174 e0465ba0e95d68bf162951ffd42bb6a34a4eae5d release25-maint
+59176 7dd7961e0eff3ff4c7fc22fed63cd19b6049a816 legacy-trunk
+59178 22e09905e4000ae7cff486cbfc67521bec429fd6 py3k
+59179 7b4e94a7b92e9ee01aaf779e45dd87880ec327c8 py3k
+59180 a7c18b924236a07e9a63f5183d1d828ab51c2aec py3k
+59181 7b30111247f672007c26ec7e342994df33089cea py3k
+59182 e6165e389c5022b46873a5f29de827910802aa5e py3k
+59183 ff5df1fc0fcc4a6df338a8cec5f184d0994e709c py3k
+59184 52bbe3365c72c270f75d173c0c698eb4ce601604 release25-maint
+59185 73f83899eb9d9ec00e622cdb00e17d8265b976c8 py3k
+59186 e4b1e05ce26352755c02d33d9119f7a4ef315156 legacy-trunk
+59187 ebc7389297d691c6e159c59999e7e0285f0d566d py3k
+59189 48af6375207e708db41c19b60373bc61df03feb0 py3k
+59190 f48d2ef72e7e39424b04aa2558b9bf60ba09bca2 legacy-trunk
+59191 0476457ffb391fd2f0468c722e7bc5e637541560 py3k
+59192 e7fed7a595768dce293e5d063e60df8c820bca18 py3k
+59193 b4da71a88fc015ed428a7feecda1838f095599cc py3k
+59195 f2e2479afdf0b3308f275ba68ffe768561f43926 legacy-trunk
+59198 8f92b4ee6fc4cf595489bbc5b8b92b2d5d1f2a10 py3k
+59199 ba3056119b283c0d39438d2e59310634f14c3655 legacy-trunk
+59200 5d1049d4c3c658470de03713bdc2e6bc9fdd13de legacy-trunk
+59201 bfe037e3fd55ff2fb87db605fff9e6a83154fbb0 legacy-trunk
+59202 45ced6ab066d5bc613d18efe9701c0fef640e48a py3k
+59203 60e6eaa378d9f91be2b498d662a56d5ecabda197 legacy-trunk
+59204 d44fffda2cd08757ded59b73ac4297b3851716a2 legacy-trunk
+59205 12e728035e2c6cf2bfd1333866ff49d631b0a6a3 py3k
+59206 71f47f864691e844f36c481be3be761b0af7cf3a legacy-trunk
+59208 7e8e8797f9d0a8518b56b13289b1536afefd8d1f legacy-trunk
+59210 918bbee3a5458800f2be1ef1bfb38f6760159b85 py3k
+59211 1f024a95e9d916a39453e3d639fe07ec5505980e py3k
+59212 53b08fd88bf475bb4f679991e114dc04c211c0ab py3k
+59213 530fb9852c5043fec0bd373bb3d2e25ee135dd92 py3k
+59214 4c39029e3fb030a67f755f7c618fc3ce9088214b py3k
+59215 429cadbc5b1093cd807ec88165d58a7c1cd9c15b py3k
+59216 41b7f80265db19b3984857543fb3c1a6cbba6459 py3k
+59217 15649aef2db55e12700941a3ca3f0157e39ee93a py3k
+59218 eccb197044dd495d7d6104f076757f6d68b28e88 legacy-trunk
+59219 c024b894d929ced4cb6ec5390f884b8943a6a7c3 legacy-trunk
+59220 e6ca92b18cf4da42ec5907debd4365ccfe1e75b1 py3k
+59221 f2385d98282aba0d910d0099b79aecab61cb5d06 py3k
+59222 c4a6d3ec42c12492671c78779a9f064c30d75682 release25-maint
+59223 6ed77fda8b91480ab9bf519ac66943011b25d4c6 legacy-trunk
+59224 b6b5b6cdd202a90ed5de3201c79eba6a03ba435a legacy-trunk
+59225 9ef85724f4b1f5237a332a4e3ee1357d41c8ca23 release25-maint
+59226 49ac587e22e91f017eb1d02300a4b38e7fde5ae8 py3k
+59227 295cf05fdd2c328c7501c43c06561e594c7688f9 py3k
+59228 d639458c7e0245cb3c04c10ba30c13dd3e91dfcb legacy-trunk
+59229 0cc552ab76bd39c3f05c332820444cc5019a7ba7 py3k
+59230 894fee279dbcef161bc11e7ea4fee1672984217f legacy-trunk
+59231 4417ab5b351e6cd84cdd03fbe7e0b5cb95298702 legacy-trunk
+59232 00048fedbaa0e22e3ff56b8b9c20a4725b9ffac7 py3k
+59233 3ef6dbc43531a1cbf284a6ecedbf08ce4c74e367 py3k
+59234 28c80283725233d1f45646cec7117c44c72537ab py3k
+59236 3cebde478cc4dfe33775c9413436de145a94b9a2 py3k
+59237 53113106febb5955a4115b99c306696fbad1320f legacy-trunk
+59238 3aa110f680ab3e0a08172984e088ad57f6dfaacd legacy-trunk
+59239 f564405c81041dfb8e6b0558b6f8eba35478d098 py3k
+59240 b44059e0f0759ed12caae5359e1c3af85640cba7 legacy-trunk
+59241 2f47b228ba0654a0a0c15b58a102eb5eb65a3c04 legacy-trunk
+59242 7577b99ec53b592bcbe9bf4591d4b71b7c2c49a9 legacy-trunk
+59243 c5f2c97893135fbf873a06d9294bdb474038fc21 py3k
+59244 f4e7c729b3a24ec2b85beffcb4e578deb6630c93 release25-maint
+59245 165e527c399aee5286504f0e32dee2e229b611f4 legacy-trunk
+59246 51c1eaeb8786a692d53646bc3cbc9857efac7f82 py3k
+59247 664b0bc92b96fde9e75e60879a0b17f9daf9a561 py3k
+59248 dcc4bc58af52b7ec6f050512a46bc43ea3e36599 py3k
+59249 80b42db2eac92be89ed140b69e423f741b10f6ea legacy-trunk
+59250 2baabee40702f8460c1be71efa29d0354089f37d py3k
+59251 4cb95fc4129e0e135841f072f44e5510f60bf396 py3k
+59252 351b7bd786e4aeed33d96ffaa4d60dbeece3e963 py3k
+59253 2b21f158ab9ff31508638e82abbc1883145b3028 legacy-trunk
+59254 c218d1ac916e5fe43bdd3d5a5ad58e3620e2b247 legacy-trunk
+59255 110ff614ec28addef63f1fcbf60dc658d60d0509 py3k
+59256 944ae345e9ffb41a9a18aef218ac92076350ded9 legacy-trunk
+59257 86a735b42a8fced9fbbe0c5bb5f635de73d1959b py3k
+59258 21321dcf0ab5d9f76f061cccfe00ee3f789d7d18 legacy-trunk
+59259 6d7fd95ef14ae97d26317855f1a297ec3f1a1f5e py3k
+59260 e634511b4af5da8cfe687c223e88fc5f2e349c8f legacy-trunk
+59261 b21b1c4f04395b9b2a1a50a0595ce6360cbe359c release25-maint
+59262 4f1b20ed98e5fa75780800d46837900cce8c3b10 legacy-trunk
+59263 6224dcac807d87300c9b7c98a6add796a22a3de7 legacy-trunk
+59264 bfdea65388c31a65babbf3de819f1d0429543971 legacy-trunk
+59265 199dff8530ad9db96b3e007f50ce0d38e74a790c legacy-trunk
+59266 823141adb0801aa43eeabfc23cd191b876c1ea8c legacy-trunk
+59268 0889daf6d0d94b5f967ad6970e2b9d517aaa6a6a py3k
+59270 f324631462a27c6d2a684f3bb5709185ff6b8f2a py3k
+59271 1ac7baaebce77549a6c57b4225fc6e1f7cd77e1d legacy-trunk
+59272 aba3d0949a1d552dd7eefa19ddc4a68da7606ee1 legacy-trunk
+59273 e7bcac8562452c69a4820c2c5e389e73f0ae0ce7 py3k
+59274 1e266015cf5baecfd4307804b0a4dec696f5277e legacy-trunk
+59275 ff1766eb2fceef33e59a645394709bbe0a217a9d py3k
+59276 27fdca3aa7d468d0cad1098c9c0b28f1ef2debe0 py3k
+59277 40fcaadfb1663fd9dfbada8f5c5325d0bc9eb6fa py3k
+59278 4e1d6491367c758d306d227b6e7dfe0777761f3a py3k
+59279 cedb7adc87c5f7c3a37eabf10e275ca94d3e9185 legacy-trunk
+59280 169a8364536717099ad45b41c155a656c1751668 py3k
+59281 5781e1928bca65633bd2ec5c3efac138693ee209 legacy-trunk
+59282 7f0e48536a27b35c029acc93f9d47c3d7a8e4648 py3k
+59283 a1c3bd382771ce49bae8fffc0008593f46cd7d8e py3k
+59284 91d114d1b58513481a834cfb27a29a2e5323900c py3k
+59285 486dc4df378968710b8069896b94e379fff23ac5 py3k
+59286 20ac4777c0ca103e92f4e2977eab8c52852b7ee3 py3k
+59288 803edf9b1dd9143326ecc2e6afac75bcf638b4d6 legacy-trunk
+59290 ead0d47b012b592b7abcd119e023614f83a2cad3 legacy-trunk
+59291 7eab17be8cb49780b8d0367e0471ba5953607443 legacy-trunk
+59292 64582083cb9afa43c0745090013a7c7caba42b0e legacy-trunk
+59293 fe6bedafb46a6460eb00ced08aa2b814d9e78622 legacy-trunk
+59294 30f54977828b33750b35b6cc65d3869a0ed95a03 legacy-trunk
+59295 97210d863d1234c6e4b63d792d7e9c07883543b7 legacy-trunk
+59296 4d16ee39301f9c21e9d92cdf69b8a3b27a644db9 py3k
+59297 9732685eee172aa76659ecbca6ff2e965d1847dd legacy-trunk
+59298 8acd8f5c6081752a2c8a561991ea16e8d9a42b20 py3k
+59299 7e89f5cf6b214f4bbf5772d86720ea70d8c96289 legacy-trunk
+59300 aa6017a2e8f926fd11942d4d701c2537d44cb389 legacy-trunk
+59302 be7a85c34a4c4f87386e8c3de8052e0037a368e0 legacy-trunk
+59304 b637349336fd9d1227af073530f950536c778ea4 py3k
+59305 ead7a053f5b434fb9c36b9632c031a4583bd37e0 py3k
+59306 44d0c71dc3c3b389dfedcf32877fe501b70c0784 legacy-trunk
+59307 aeefb897384fb40da9f0ed6d3f561efcbbf8de30 legacy-trunk
+59310 0bfec609837ec501abc81665857660bab16b4501 release25-maint
+59311 e08b12c3b913643b0ad78c672460c5eceba78eb9 py3k
+59312 d75210bbca97af879e646113874e1d667647d30c legacy-trunk
+59313 2a43507cd9532eb041bf5841710dc4c8b7ab31cb py3k
+59314 825cffd6c0cda7486524812d0326bd7447c06497 py3k
+59315 8e74af197e6c0324d9a95af8345dbbd0c79dfff5 py3k
+59316 842b3d45bfe4c3cf7b26242bfc22e825cf3b3a24 py3k
+59317 04505c988abcf7c3beda26c485647d9ba44e7bee legacy-trunk
+59318 ece65c69b1d314e0a1b456971a6984e1893d2bcf legacy-trunk
+59319 c8b339cfef1fe5b462dbcd97d098a3ac87742026 py3k
+59320 31a3ce38b56c35d9a048c2a28da6a663f2d23c5b legacy-trunk
+59321 c9fc4b1f9bc692f5ed973c03042a8146b63ec1ad py3k
+59322 0ce61221c63f84f275adf2549b9e15f5ef547fa5 legacy-trunk
+59323 60ef9c4e40124dc333c9cab02fbb7da2828bcb52 py3k
+59324 7e5042ee94244fdeedea2a3aa78eb22a97f88664 legacy-trunk
+59325 53320d544bc7ad92b9d28abb9c40d6d2c6d1a59b legacy-trunk
+59326 f0b3319b7266b8f2caae251eee1bab3cb4164982 legacy-trunk
+59327 2ffa4f7994a3e9c845fa7c126441d04ef6feff6f legacy-trunk
+59329 16ba00168c6aeda46de8195fe108c8f44351e188 legacy-trunk
+59330 1e726aeab6a529accc5b48aac3612c76528696d2 py3k
+59331 88f86445be773e85a01bee03da74313b96829b38 py3k
+59332 82991ff75c5a6e4b7ff1d97f65828684704263c8 legacy-trunk
+59333 1a2a6df0fbe0170c81b3e3f137193c6b247c83a9 py3k
+59334 fb84bd9500a40ea6adb496108b4a59323f413fa6 py3k
+59335 565012d1123df2e2a7cbb9ecb06ddb03d91c32dd py3k
+59336 81e0c0e2a8c13844c37970dcb9b5b1591decea7a py3k
+59337 af86b89ce78470a9b9fbdf05b726f3f2b271eb0d py3k
+59338 9d152530910a650d3cad4af307495a02fdc01c0f py3k
+59340 1a7dfb61b4d8e16b7e4652155fc99b9c1e4e5a31 py3k
+59341 ef5399b353c95da70e7e77b2f2f3b328a95f4160 py3k
+59342 5649f7ce30628561cdfa678ca314aba5067d1235 py3k
+59343 334161f74b8e5fdfea10271fd01d3e1156c48161 legacy-trunk
+59344 612d8dea7f6ce3239123584d875f530557ac07fc py3k
+59345 e4c22505f011cf0670f7ee348680c51554e623eb py3k
+59346 63e61c770a932c8487c5a7858c1daba510912445 py3k
+59347 c27878281c8f781b68c1180454ff63495953c130 legacy-trunk
+59348 5d991080d88e5fa1b1474097f48b147bdab82984 legacy-trunk
+59349 26a43786395b4d2b22ce41b3971d5819ed94e309 py3k
+59350 17b43901bb415fba28aee909cce68d6795775cd3 legacy-trunk
+59351 2785e2160fa6b2724218ca6fccc97cc89d4e17a0 release25-maint
+59352 250c4fd4ca542d248c7820934ef21a33e0a1816e legacy-trunk
+59353 86716134ed876f3b9f41228441d11f658d46b1d7 py3k
+59354 1349ea441e41bbca3ff6beccbdfbe6ca5f140f50 legacy-trunk
+59356 40fc840517fc012ba1471c552f0fcd0f609d3335 legacy-trunk
+59357 dad9ed339bc3458d60d95c4c7e5e52ebbe296fcf py3k
+59358 9340698ae42139086e237bfb8280647fd5b8aec4 legacy-trunk
+59359 79afa4c55211dfab58adf4e004ed49ed7d4d6088 legacy-trunk
+59360 6200a447daa16677950150f67c280027e81f3350 py3k
+59365 320f7ec63f0bdfd27e2ddb91c065b26d5540988d py3k
+59366 590a14476019a3c2b62c026d02e6c993ccff9773 legacy-trunk
+59367 d33f8cc707cbfe3b91de3dc4e498089a27ee283d legacy-trunk
+59368 860ce9755d15bd78510713db3423e1f28ad4721b legacy-trunk
+59369 55c05042303b39f054c47213f561b0bf597ec4aa legacy-trunk
+59370 a1bc65954a9cbc1e17eca85b70bbe70778e98aa7 legacy-trunk
+59371 05da49eb12c14f0348a5ec3c333a931418062dcc py3k
+59372 1f722b0854027c5ec2d70c2489ccb4c40b469a61 release25-maint
+59374 538476b6d7e052b50a82fdb1a824bf041e3e86b5 legacy-trunk
+59375 17c17807a61178ad688ae81b411576f29485f5bc legacy-trunk
+59376 d64beb8fad066177f91ee91e7ff76ac0c937b287 py3k
+59377 85e4bff37bbdcb6d56f02edf85323b05a1926c4a legacy-trunk
+59378 44c090c742026023ca0f0b731526b3c575ad1e7c legacy-trunk
+59379 1d98fc265f992e566ccbbf02d3fbfa28a537480e py3k
+59380 9ad4aedf349be92a284d337fd3dd28ba0ae11014 legacy-trunk
+59382 6ef8b5b8e5d6ffe8b04f6768e5bf3d01f0a62893 py3k
+59383 afd2996f202124749620889b62398ffb6f44e176 legacy-trunk
+59386 a53ef778590ebb3d0d66e02f20ff911ff22ff03a legacy-trunk
+59387 bcc173c3ad7092b3b670e20c91a3fbc09bf11ea1 legacy-trunk
+59388 f11dd4d315dd0da67b70dba04fa5a11bdacf9abb py3k
+59389 74bdd50f07e5dc3c48a6f422c99e6fb9bd213957 legacy-trunk
+59390 71ad5e2bedda27d09c519a19d63761f61b0dc034 py3k
+59392 939e812cc09ce7b009b43ab9230cf0711bc59517 py3k
+59393 50b03afa0bbe79337afd128e7013222a6a7da99e py3k
+59394 c232836ce5c943645400518f3afbdd98ce30dc1e py3k
+59395 ce280a04f55e0fe87b5e9ca1ec60d6a11ea65d5b py3k
+59395 65e82140e281bf26f2e22eda05a7f9956c420f8b py3k
+59399 2fce989da0213cad4864513c034edf50728778a7 legacy-trunk
+59400 3356ad62c2a369971eeb75f7f2b1e6858e5422ce legacy-trunk
+59401 582d2a83863cc4390350c163b91283e42f2f0f04 py3k
+59402 80884643a6f9e7d136c9627d1271447e0783cb9e legacy-trunk
+59403 c6fb393b6c8158b2059fc50b218689fd244ec4e6 py3k
+59405 70cc7f740d347260a0be62907b4b66801cfa4dbc py3k
+59406 22e3f5bd140786338af46e4b2e1cbfa8efcf9b68 legacy-trunk
+59407 4de594740a88f996b701063c269a97ca6f9e61b2 legacy-trunk
+59410 a71a71cab60825ac1726e530cc9ee62caa54445f legacy-trunk
+59411 0bb108a3c0c97ce8b4cce5937a5ae9beafa737bb legacy-trunk
+59413 77cb8ff34912acd07d3b19ef51a4c3901c28b611 legacy-trunk
+59414 a9877b7ee85dec8c8cd4e97b9be67f67efb829d8 legacy-trunk
+59415 624f511ce9f248d38ad08a0273c9d24e0d44c803 legacy-trunk
+59416 03945a1d4fb3cf59f8212ffd7b46150246267d38 legacy-trunk
+59417 9a976a6ee936691ef9a43ef0c4aaf9385ba7123e legacy-trunk
+59418 118e6d68b44a1288ab76e84983143117d41f4728 legacy-trunk
+59419 f2f738a437f879c643dd46464d5b9a4c78ace3a0 legacy-trunk
+59420 ad8b80460644f1f8fa6354857c23643f9046c92a legacy-trunk
+59421 aad65a2424e38d8a72a7c0a2656df039d1040388 py3k
+59422 4ee74310ecf988774b34aba5dfb82a58d02b50e9 py3k
+59423 17448e5e9671da4b96196308f513f6022d858d01 py3k
+59424 699fcdf5bbd74b010844fd41a17caa6ea9cfcb73 py3k
+59425 6b517ac10e8ef8e237ad1b6bcaebb163c45487b7 py3k
+59426 91ccce741d1141d96d3a3f303c25411645dd709b py3k
+59427 6d5f08601f4a95b4215fc5c9af47bf1dfac2142a legacy-trunk
+59428 50a50e7521423a2715383934653290a5a870caf0 py3k
+59429 a5c4739121e14fd3da1749a5b0dec62e94efc98b py3k
+59430 61df5f537969e6aaecb482d3654201af946f2589 py3k
+59431 f67ec4eb478a8908c90231aa20f058e6e9c0edcc py3k
+59432 44a24b59b16d0210682ddb02aafbadb1c5ec564c py3k
+59433 be3b6601f989a68e5a019cd83865470fad9d1be4 py3k
+59434 369a4e06fd301162b87fbf80893352bdfc04f8eb py3k
+59435 6ce6e2f3dcb2d687f95ad45162c17d33d1640342 legacy-trunk
+59436 5ac874d0955636d539cdcd19962a0fc8db2f82d2 legacy-trunk
+59437 66dbe12ddf31d76c48a603bd90ef03431fec2616 legacy-trunk
+59438 40bfd6f1cc16903322a16c2b70d2d0920ef95118 py3k
+59441 d77fd1b8c0c54732093f147123a0c48fe3c25a32 py3k
+59442 5abfd07e97d489f25c5de202ef6f34ec044bb2bc legacy-trunk
+59443 aac33ee1a8fc73277de012fdd1b5b731ab0768d4 py3k
+59444 889a6421f135b59ec242d545072a0e8f9b7108cb legacy-trunk
+59445 9cf2bf9461c410d858eacc1d6aeba9ecf542843b legacy-trunk
+59446 33ff40e6e13758956e1fe46fa3eefc4dcc2c68b5 py3k
+59447 59e64fa3ad1d9ca2e77599930be75f3bb2931f42 legacy-trunk
+59448 2028feb94b57552049ae587c474577c7e1aca20f legacy-trunk
+59449 444da08f78a4da79f6c717b17eba207ef60d15ae py3k
+59450 60a740f5a57a3a17e9da62d4766dfbeb8034b34c py3k
+59451 a386ef28b008728836aa9434d8e4defb792d9f95 py3k
+59452 12cf9fff9d0aed36d6a2c6fe7b4467f8987ae5b5 py3k
+59453 6b35df40bcacafd6d2d5caebd93690f06065281b py3k
+59454 76ce597c72ee0e1055e5c7907a8cf5842de7189a py3k
+59455 47895ca6f0cba8fb1a8f75902715e8a503e107f5 legacy-trunk
+59456 1b0ce9ffa9726d5394c48b9b58d9133b35fc0532 py3k
+59457 682d9788a038e72fbabb10034673c1c6fd004233 py3k
+59458 66ce3314c19820a71ab94a86b290d98f2727ec8d py3k
+59459 24749a3804093401de8031407f780ce66ab0dccd legacy-trunk
+59460 eb65e105e4b8cdada200a952bdfa94a48258b57b legacy-trunk
+59461 a4aab72c2cc0bc494319d21105e57a5de8478ef3 release25-maint
+59462 2c6fe2dcc88ea1d81bc5c21896435d6f9c512e3f py3k
+59463 e65e9c649cfdafb38c34a8843a19a8329f2bc4ae legacy-trunk
+59464 f909872917b95d9b3cdd9ffae85450953cbb5752 legacy-trunk
+59465 7ae604b3533b536354da31a3c3e37f8b50967b7e py3k
+59466 b5239ccf94b5ba7398a7c717c461483bd80c02d0 py3k
+59467 727af161ca464abd2713044acdf5f5134a6803a0 legacy-trunk
+59468 2e19c3e511bf5939f63f46eb643de0e7127b0d16 legacy-trunk
+59469 3e0867a077657e4148755044e1bd836248d11a21 py3k
+59470 eb2260dcb365fde6511f41afc4d824a4f29289eb py3k
+59471 a6d1059f22e2cd1404ba0a02cf228d5247b44d9a legacy-trunk
+59472 4ebba9b2688f4072c17f59eb4a94d4030bb558e3 py3k
+59473 66d4796ee92cbfc468df8df76c3f21c73d89e1f8 py3k
+59474 9a09d442bce27b2d7376fd39bb11bb0c8e1f7974 py3k
+59475 9929782f5cb48d07b445106c235db226281bce81 legacy-trunk
+59476 0170714eb0442158c310a24fdb487fdaa1171e29 py3k
+59477 e176b4aea9c50f5a19d2ac5b43d486b6cc14fe5e py3k
+59478 c2e72feb53b36ebc150a9681b418e95570892b30 legacy-trunk
+59479 541052b044f09e31096ddd97e629cbeb8b7c405f py3k
+59480 7a8c8c5685fccb14ffcb6f6f7ca60b897d939f6a legacy-trunk
+59481 6ae94a2ba5dfafa01a0e439d175951da9ab7d640 release25-maint
+59482 226a062ab43ef77797794bac85d1e185f562be5f legacy-trunk
+59483 d8e06543cdd80e345ede16c6e2a27f049e7d5ac5 release25-maint
+59484 589262d81e298feec708632fdc8b789c165b627f legacy-trunk
+59485 f04c0365c9aafbb39e8b61dac6cd62ea514018de legacy-trunk
+59486 3096b012733e19a4b9bca373050198206f00f9a6 legacy-trunk
+59487 66ed6e03ebbda9efa32129ad7762391d12fdedff legacy-trunk
+59488 71623878057b2e4fdbdba2ab4f5880108780c986 py3k
+59489 44c418b2bf7f6609ef7210b0332dc804ff0f55c4 legacy-trunk
+59490 7a62c6d9107df982df1f75bda3555ec32343de91 legacy-trunk
+59491 294b1a79f2019abc02d68b195b2e9b690ff9bb38 legacy-trunk
+59492 635a2328011263d2957caafe63d4b9c562d222af legacy-trunk
+59493 a327f3e2615611bc5483683a0e09b3a4102fbde6 legacy-trunk
+59494 3c8b702e5f2070eecf10471f4cf505a79721635e release25-maint
+59499 961e89cc7911c0a6c039708c3155567314014e81 py3k
+59500 905a96997b7c80eb2da3337bac95b878dcd9bc7a legacy-trunk
+59501 dca95956730fc3f61970a6efa3c7b9d06b1ead58 legacy-trunk
+59502 7da94757ec5bd3f78f86fb69fcd1e18e8f195c08 py3k
+59503 20ed1d415409eac0a91ce70e70d2b486920ca58b legacy-trunk
+59504 1bb9b07a01dda1eb93ce484628c93e1f6aed7bda legacy-trunk
+59505 45c78e50cbd5e0e5e7dadee77822b4bba66d3dcd legacy-trunk
+59506 19f894ae864af1da2a3c24e34b87c112625f9c75 py3k
+59507 14c5d275ddf1403a6e2dec706e5c5c3ee6efe3f8 legacy-trunk
+59510 1157068462b538ec8ba064b397e277243fc5f0cf legacy-trunk
+59511 06d122b4bffd7aed8bae46ece578a58b749d4037 legacy-trunk
+59513 2ce50a260f53d423b9631be4f16c4b2860b90c52 legacy-trunk
+59517 e70acbf26cda880e30c8fa2188d6b66b0cbc893c py3k
+59518 303727c58b51e014a6369df715eb01263e4c2418 py3k
+59519 043ca9b66f79722009359dc79ce9c25e4689f411 legacy-trunk
+59520 618ce281a55f84521f6b2a4d95d9e9e9c3f2b864 legacy-trunk
+59521 4c0eb587482f60ca211dcd82c6e2409044bdc287 release25-maint
+59522 aad90ebbfb504bd58363e76b87b956888aeb190d legacy-trunk
+59523 a649aa52b0799050013ab2041fc6b340d996c99c py3k
+59524 ee11746212b2bd25e5fb885b16f606d7b1ad00dd legacy-trunk
+59525 5a50a5b570b02e6f362bb6e239d064fd7f081d43 legacy-trunk
+59527 9b40ad057d59e207caf517b2029c10087295cdfc legacy-trunk
+59528 211abcfb4928b2c171d5e28bc90195ea26273113 legacy-trunk
+59529 a463742fa411b898b22e8d9d4c7008398c94eab8 legacy-trunk
+59530 7791a5ea15c384ee2e5371f662af25406f39e22f legacy-trunk
+59532 e97f105d1c8340fcabafb2b11aeced35f5daf248 legacy-trunk
+59533 a14489f6db6f92b8763f790167b7c0c38217ac4a legacy-trunk
+59536 a2d0c6a889098010956412a1626d5b68c1d1751b legacy-trunk
+59537 0a544528dc9f5d77765f6cc134067c02789f0de8 legacy-trunk
+59539 05c501a953087511f15baa0e1d9cef7c8cec1452 legacy-trunk
+59540 09f74316d5fb5580a9f6b780a5cd27cce1d08063 legacy-trunk
+59543 75c6bfd3b1f32ec217ca731e5c554f9ff310faba py3k
+59544 4a6c06a77deb16a078c4362efc4ed67994b2ebf9 legacy-trunk
+59545 c0f2cf4389c50288801b7d8c15f2ceb4f236205b legacy-trunk
+59546 11b6f5b68ad1a729e07c9a0839db779f66ddd034 legacy-trunk
+59547 56f342c84e87075ff6c96a67756a9ef87c321d69 legacy-trunk
+59548 07aa19170a673da6b3e8c4c66bfd868b2f90c0e4 legacy-trunk
+59549 b5b3080b360fdeae43aea807dc90a63c5b27d254 legacy-trunk
+59550 eab002b8e17e8e2e8487691d7bf809140736e0bd release25-maint
+59551 b59c328bfa623e0f9664a9627b95065a92af3173 legacy-trunk
+59552 a99128f6c97df3930fc38996b07a29709d0d3a5b release25-maint
+59553 7ac117b3be37eb7ae32970787e631b22aba04994 legacy-trunk
+59554 15fbe7c7928497391771163150fd0e89db63196b legacy-trunk
+59555 958581098151ab761b61ffc9917e626109508283 release25-maint
+59556 dc884b6050d45fb5306b517a4c39153d08098070 release25-maint
+59557 f8d0faffce8876f554bf6e185cd29e703bda61fd legacy-trunk
+59558 1d69aabf6f7f22746b4c7203af5c9b019d22e32e legacy-trunk
+59559 d51b39c2160a3b855f4f265c420c4640d7f574da legacy-trunk
+59560 a28ac9b67bedb56aa1e2473818cfc1298fe1e1d8 legacy-trunk
+59561 616fec0eb514b651060c409a3928d4a9b05f96b2 legacy-trunk
+59562 e2effec9d5ad7cf096fdc40c6bd35aa5cb1efe3f legacy-trunk
+59563 4dc01402d78afe2c9b4a4bd8004eb08e2647335d py3k
+59564 26384b8180c7a55cd6a2ed44107cf4e339025ec6 legacy-trunk
+59565 86a2679dca464a284fd02b81646f2692049a2ce8 py3k
+59568 f7bc79112bcfa89bbeab035d8bcea43e82fe89d9 legacy-trunk
+59572 6314b9f8a7e03f0c57e995438a49d891cfad0d32 release25-maint
+59573 b1347c68d45685ae2c83f52c20928946681ef394 legacy-trunk
+59574 b89b0334372ba83abf4d2fc244ac16be3df97280 legacy-trunk
+59575 51c175c86f36bb3bed133a1b0a148f3e2819e5ce legacy-trunk
+59576 174e0bcb2c3c132a26c9f04d3cd60fd9f7df1cfa legacy-trunk
+59577 0ad12c79af185df838f216f776e7443e1c239172 legacy-trunk
+59578 bb716ebcb082a1e79442e625813fa163bc468d1a legacy-trunk
+59579 8d4d335369950c1202b33fe9a58d56de15dca622 py3k
+59580 bad55a585959b11f9341c96f614eab1a75545ec2 py3k
+59581 55dadc8b68fc1942fce36bd73e4852fb6d89ca08 py3k
+59582 210c507dac996184821781cb13ab8feeb9c932f3 legacy-trunk
+59583 6ea0e15ce5736df76da51b25aecd43fff7c31d64 py3k
+59584 8dead6f81bae01be4cd34bc9b5c94c5bd3c8f04b legacy-trunk
+59585 83ced4177eacc493eb5d56e4e0d0c2471dd8040c py3k
+59586 eaefb93b5ed4438406fc7f80a10ac0352cbf5aef legacy-trunk
+59587 32dd9b7773c3c21d1f516eaea8ff982dc6041b62 py3k
+59588 445410744fd637359713d0d23176d8ab495bbb36 py3k
+59589 bce70a477f1da3da3493beb4cdcd5fc7e39ce0ff py3k
+59590 2b03cacc1b6a4e1ab58129bebf0c4552c918ba24 py3k
+59591 957baa37ce0d4f4b15f27bd0b43041ffee5f08d6 legacy-trunk
+59593 c8d31279fcdcb6a712a9a35606f6f2c5bf31c5f1 alex-py3k
+59595 2750d531fdc023dbdb402db62fb19cc83f4da733 py3k
+59596 863692dc411ef01f0c64202b5b15a4038ad6c838 legacy-trunk
+59597 5f59123e781ff64c581a3feeaedcaa8cec877c96 release25-maint
+59598 1db6243e93f29bd2c015989ecd9ff12a3358084c legacy-trunk
+59599 db675211c2f7531162fd785ce2f9c09f865d19af legacy-trunk
+59600 b9be117b282c37bb35ca920225b95ca83a694581 legacy-trunk
+59602 edb6aa62753bc7907fef3ce4f336612959913be2 py3k
+59603 08468a263a95818f9b0bf7a966ff32db05fc67e3 py3k
+59604 eb695c591e704ba49731ba97167b56ded6f36ceb legacy-trunk
+59605 71bb70f6097b82004cd1687d0d5d455a76523387 py3k
+59606 3625234bf3d2ed36801ca0c64ed4854f053424ae legacy-trunk
+59607 da2b105b0c523f4fa392aacbc383e103a90a65eb py3k
+59609 5670104acd3954951cae2f32a99d1998926a41a2 py3k
+59610 7d2da1cd80a11bb6f548c64f26af6e450d03043a release25-maint
+59611 f2922735fb7ab29e302b4993a9c69b88a5242406 legacy-trunk
+59612 ae0f2ea0409f4400dd05311038a20984a7c94b78 legacy-trunk
+59613 1fcf1e6d8bb1ded95abf57ccf39e0bb85d9eabb7 legacy-trunk
+59614 86358b43c8bb25c1b92a1fa1df85fb963922c8b7 py3k
+59620 95cf3d53cae001be6bcd843365243e50e40df8f6 legacy-trunk
+59621 83a138fdfdfa9818a54bbe22285696f0316fefc7 legacy-trunk
+59622 742d65961b1fa6cc4b3992a71dd3956df7ffd9c0 legacy-trunk
+59623 3715f0374f6ae7dc189e2a1a593b0e3493a88ca8 legacy-trunk
+59624 a6319ab49e0a3fbe428f7aed3cfa79ad2d944ecb legacy-trunk
+59625 6556f3f22c19f1bbee395b550910bd84837fc01a py3k
+59626 f05ac14511ff62f159052a71079d6be670f2e2f1 py3k
+59627 1eb498237ba5b58d1abba13070f224664f9731fa legacy-trunk
+59628 446e8b607bd3a00f3cf96ac31772ba2a915bd887 py3k
+59629 41bfbfc36cf7263a13930133467770174012f0aa py3k
+59630 81b3ac59089c18a41bd905d7ab1e46881fa8bcaf py3k
+59631 acb6a4b2c07f31eb6e0088259e9792899a638789 legacy-trunk
+59632 4251853fa9b9348b2bef972eebbcf46bc419a35b legacy-trunk
+59633 3ee5de176e7852ed6be8742b06154fba950a7289 legacy-trunk
+59634 7a86b20c5b4b1d3c4331517a18959e8e081505eb legacy-trunk
+59635 eb1207513ee7dee9a57c57e5f01ec1bbd1269427 legacy-trunk
+59636 dda29e71281506f1d2218a6eef2477ce2b04f1a0 py3k
+59637 46d54011e1e563c4c3878ec83c1cd1be0797e255 legacy-trunk
+59638 e366c44948a3141c8cb356f44ce857d0be9be680 legacy-trunk
+59639 607e68cb0948d707abc8f936a7b7b7403ec6f226 legacy-trunk
+59640 9380d5da77168e0e97af2620c722847f91d9b920 legacy-trunk
+59641 901f70db3b3404008e82408ad00539225dac5b87 legacy-trunk
+59642 eee1b76a94e0118a06bcce66e0b333723c034deb py3k
+59646 652f7ab5918b2f7d9cadaf0f4c2ce44dfb137dd9 py3k
+59647 3ff778a3541048bfe88090168173277d07d1cfc2 py3k-grandrenaming
+59648 9b2e2551afbe37843ad9d7e6175a2f4b6df083c5 py3k-grandrenaming
+59649 94a29373493bd1004fceff50c40ae97b10af5fe2 py3k-grandrenaming
+59650 f67b2e83b3475dddf9abea2b146a86d58ebf95f4 py3k-grandrenaming
+59651 db0c8b41ddb0d5e4c29d97b00f8e64e0d91cc409 py3k-grandrenaming
+59652 b988e4d35ef3cd0d65caadde5f04ec2e3f53d9bd py3k-grandrenaming
+59653 a1ff2faedc6be8fbed66ca7978ae65d1d4a6bb99 legacy-trunk
+59654 d9a4a5f0121e18b1de8e3fc64410183924abb127 legacy-trunk
+59655 6c0c53b9f37b4f99471e629cc4936b7921e794a3 legacy-trunk
+59656 1a548a654c1a3e69e0e505544160af71de758f25 legacy-trunk
+59657 9ab31fa36fb52fc132c57b9f463070ab42391602 legacy-trunk
+59658 f645e07d870af596af1ce0ef71cbcb770ad09428 legacy-trunk
+59659 f0e9c3d16766d246af850000cfcf54d5b05e8b0c py3k
+59660 da30877f977999420dd8f38ce34112fdc789193d py3k
+59661 099a17e2d2bd49f34bafaf16406cdb9b9acd8d35 legacy-trunk
+59662 66bea91324cd93370fd0c64adc51e942d5b8a95c legacy-trunk
+59663 1e6f27b6973cc5a0672e3be9cd8c595d8b148476 py3k-grandrenaming
+59664 899fead9eae21b6a0f998ef043bda38fe029ac1f py3k
+59665 e907f814d9a30719c8b7b6c7c0ac1dbb6b55ebdc legacy-trunk
+59666 66da377ba810789332c0add2b0c426aaaaa7ec30 legacy-trunk
+59667 6e93d2d6eb2801dbbd1f490be7bb9c271fe532f2 py3k
+59668 e9f480b4c133cf6e9ce5db8b887a2b3fc88ead2f release25-maint
+59669 5cd28f010fc71ba0ac97023c262d92976699703b legacy-trunk
+59670 4ae3007eb0f471604e5e3cc4d616737661a4d4cf py3k
+59671 4f9723d9ca320af67e9f60a2c197da2e6fdfd30e legacy-trunk
+59672 8386eeda21c8e358f9a4e4ab03edebaa6b1d1990 legacy-trunk
+59673 a3f186790ff6e09aa402c8c4eb18a19ae94e7ff7 release25-maint
+59674 18a1bc49a696e05dd4e635b95695125362635150 release25-maint
+59675 4c056c0a0b9f56699a79635367137c5856e92ece legacy-trunk
+59676 968bda81e6c80ba5ffff15dac7788abb86b7b19f legacy-trunk
+59677 27e4e530cf2f6f06957a5e529ccef5c6c7c67662 legacy-trunk
+59678 0cbe94bea2c7ef610dea7b05d1bab9f04af9af44 legacy-trunk
+59679 6208b17d0dbedf0de82d90d0d9d0458417d0dd91 legacy-trunk
+59680 b91ca87e6f3272147f94ab65cea768b249420307 py3k
+59681 fa2f7183b1afc553c17b7e6ae5d33825a8a01fc4 py3k
+59682 c73210ea61c86516eef022aba88c78d1a0fb2976 py3k
+59685 036b00dc9767f75e23005f43a578ed254946091c release25-maint
+59686 53ac3fc69b78b1fde0825ff36b8c4684b71b4dd7 legacy-trunk
+59687 8d69edd3d290287e9fde5b7e9b9a51a406ef1e1f legacy-trunk
+59688 17359c9a4a7d27a18a236ca6453f439ddb339b63 legacy-trunk
+59689 5e0170d3c4da544c9a17f1a6dd3ba6cf27513d51 legacy-trunk
+59690 94629c95965a1184f33c082c81e1e1a3e45e3836 py3k
+59691 cf2667e2ba2f5e2e4177cca01b5ecb5d9e3015d8 legacy-trunk
+59692 5171b5ae688a217b9ec8ccb7a3d05e688da21d57 legacy-trunk
+59693 d1a36ddbaa492e926799c547cbb95980e825c23b py3k
+59694 cba9ff76043048ec2dc7b3204c0f5e144b31ac53 legacy-trunk
+59695 2986bb4322221721abe4ba4869ffe0e70ad8706b legacy-trunk
+59696 de00af03bb4d569554adf9dcbd3330cb58b097eb legacy-trunk
+59698 dcdd1ba096410e97c1094582731bbfc72af42eae legacy-trunk
+59699 742caf5355576fe6edf36391e4467348f01bdd9e legacy-trunk
+59700 ad2bcbe83fdc2fd14b759d15ceacdc7fd6bee611 legacy-trunk
+59701 7643a43f25a1e697f16b23f2acf8f0c6dbfa1772 legacy-trunk
+59702 13aabc23cf2e2c0e2259c9b50668945818897438 py3k
+59703 61c164f25435642c33aa6662f9f693ed415b94c7 py3k
+59704 76a89dd4a51237277be555814405253e3502e553 legacy-trunk
+59705 d2c1ba09929083c825664e0bd8a0d4a169f9d99b py3k
+59706 398b6246759fc2d2e3cb4d03af5e18a19ea29583 legacy-trunk
+59707 77c37e32fe35b5c072543eec9801380f6a2642af legacy-trunk
+59708 127cc2fea9fb9d15ec0666dfbca17324ed31171e py3k
+59709 dce25948918d0d98a0330dd0182b95727f462bf4 legacy-trunk
+59710 81669fbc845f12497c64f67952a43a7b3bbd3ffd release25-maint
+59711 5d7d2af59afe1cab521a66de7adf112bf9d741f1 py3k
+59712 bd0258df330ec5dae9b16d2dfcb82ef8f17205a4 legacy-trunk
+59713 292c5e51a0e59618ef8a8b48e0038b7921c46011 release25-maint
+59714 9019086fd20a4db752f27ba67a33f8f902f9d25f legacy-trunk
+59715 d077b0c893bc65619ab730426666e577e88a2852 release25-maint
+59716 bfed70277ab3b6865379f7a38589357b5ef6f4c3 legacy-trunk
+59717 61341775bc42172315e18eb144f7a74517de6ece legacy-trunk
+59719 83ca735a3995a72155f6a0fefc6062b2abbb149f legacy-trunk
+59720 646cff096039bafa5e9cf00bb7e0bfc83582e92c py3k
+59721 73bc002252bfd583bf6fe5c2dd2e1d24e2032a7c legacy-trunk
+59722 34c91df6053299906418c9c5c9a3e3fad94126e3 legacy-trunk
+59723 57c7d42f6cdeb18a7ae2396dd2b756dd5d9005db legacy-trunk
+59724 2037f4cabb07ccda63de3f21e81c6351d56fba8b release25-maint
+59725 3fcaf6cc306d1e4e6aa9fcf20fae760f17eca4e3 legacy-trunk
+59726 2e2fa291914c53cd4d4dba6be2186a02c9ef91cf legacy-trunk
+59727 dcc7c865c77b1017da92038f13a224ef0df7754e legacy-trunk
+59728 7bb91b3ba0ecc2853502f0e2e8404bc15c8c89e2 legacy-trunk
+59729 5a0cbe36a6037795e3a0d5f1f2bd0aa9dfefc84c py3k
+59730 33a0ae70670f4369234d88985530e6900d24eeb6 legacy-trunk
+59731 94eeaeeb3ce93df8d2b3a711e760765d26f3d088 legacy-trunk
+59736 e48b469d1d866b77e5b67bb200ac4df23d3bea6a legacy-trunk
+59737 777429a2302667f1d5633cd8442e8d2d9f3c84ae py3k
+59738 c0c2369f94267ea150ce2e2e2fec637e74f18d8a legacy-trunk
+59739 9caf8a7b11a6b89c1793bc6f4d4c08cb85c9d4d4 legacy-trunk
+59740 bbc9e8c08cd5eee37c035e911e104c167c4056ac py3k
+59741 fc8186b50145b9d2b7f2d014d5e9d985e086c455 py3k
+59742 0c0aebc6656f94d253344ce4a12a033f38976b37 legacy-trunk
+59743 3c6f7543bdd6b4aad97889063cf4cb7d95618b51 legacy-trunk
+59744 01d5b8e7d121205ec7b21a8af0d73a48ecbc488c legacy-trunk
+59746 1426cd136739fbdee27fd0674ecb94683e14b366 py3k
+59747 31e294d08ce1c9df3f286c52328679fc15b16abf py3k
+59748 bd85879effa69dacdc9951c875eef4465f24763a py3k
+59749 d00de0cf04e274f023a2d241edae38598e69ab66 legacy-trunk
+59750 0f1c8bab898dbd9bcd39c4663221dcd37b85067b legacy-trunk
+59751 9d8b953d4af52ecabd06d404ec6fb29f40d4d4c7 py3k
+59752 edba0a1b7ebe108c6b72152bd489795554d0e6ed legacy-trunk
+59753 244bb31c036bd54d731eebb800281c7e2877a038 legacy-trunk
+59754 115da2268cd9581123b4997a807d0782d4dde7c5 legacy-trunk
+59755 98cc1cc57573cc06c2a7e4d79a50bc38808ceb06 py3k
+59756 08138bc3c060ec6f346b2916fc4189e7298f7da6 py3k
+59757 4e74c27678ba15ce9864de992f307d5b267787d1 legacy-trunk
+59758 65fe6e56d4f8d5c9a2902bee9db853dce864b43b legacy-trunk
+59759 afb1337906ae8a52e8ebdab74b5cf1c64dcf6688 legacy-trunk
+59760 281c9479142a3e4aba06b2600e84b7bb34f77692 release25-maint
+59761 8bf6a9a3a6329be39cd00be80650489dd85f18b0 py3k
+59762 56ba791d8b35923547bf2caa37c39d8ab497f7f1 py3k
+59763 2848ffb9d17a6c3c9b39266aa708226f9da5b70f py3k
+59764 32681ae6c5c148855fb746d42c111c4b815b8643 release25-maint
+59765 7a2065b5be75b3235f592885bd1aae70ee6faa0a legacy-trunk
+59766 bedd8bfd3fd2680479044654eeee2f81930d5062 legacy-trunk
+59767 fab2aa6b80736332dcf1301890aa847c45616e05 legacy-trunk
+59768 e5bf6696e2e36a74cc71a0c84d4110ee87083709 legacy-trunk
+59769 3bc0405de4915d487c45deca3f5bbdf9f5bcbb01 legacy-trunk
+59770 4321a5abd6ce2e2d7d662d15ffff0f3a4bada057 legacy-trunk
+59771 155f5c36ff929561ff2b547922d5b5dafaf8ab60 legacy-trunk
+59772 79a34248a262fba9a427eae864bf2f36bc5836a5 legacy-trunk
+59773 66197f8d0fdf0f87270306315c9b6b4c738c6d40 legacy-trunk
+59774 507e76d7fcdd5c5bf685ba5b45bb5ccf9da83c02 legacy-trunk
+59775 64794ba9e25ad5c1c92ed314adcf685bc7a8ee32 legacy-trunk
+59776 99f6370c6cd0584a7520233c01b0ae7e4dddcd0e legacy-trunk
+59777 d8979e6429e5ff8abccd2d0487e163b9e657a297 legacy-trunk
+59778 6b3aae5c69bf2044e2593f0c22f203190d58a51a legacy-trunk
+59779 ed758f6a97bb10cac539c5ab09d87e794b3282dd legacy-trunk
+59780 090083a233f8e366de8cc9e6d6e2ff29f117a90a legacy-trunk
+59781 b24888cb955333584c8c58940f740860bb89cd59 legacy-trunk
+59782 2acc652e58a19c6c3d60817845bbb926eecaeb27 legacy-trunk
+59783 420fe6d7d5f45e5f9fee4a24fcebffe2a6d426dd py3k
+59784 ac7deb1c1d3ce03ae7107d3f3d34e8bc015fafb4 py3k
+59785 8eb96363f1d59c2b75ec514cd9fb54eceb9d6096 legacy-trunk
+59787 1811eb03ba00c8f9371e05acee3f911d32e470ef py3k
+59789 fa250a58099fc4aaa78a56ee1fbec27af0715a20 py3k
+59790 7cbacaa5f8858f49475bd5324db189eaa445bb94 py3k
+59792 0c4d258a5b25ea0fda59c656fdd2bc2f34c87c38 legacy-trunk
+59793 d0465e782b019103c8a845bb5719f29f300360d0 py3k
+59794 674c9b89d1241401ce2fb5c30c7e3804bccd28db py3k
+59795 b8e34bcdba45483754c4cea304e8440b82e81f74 py3k
+59796 13b7ca04bd70e14642ed6d97b10e85f54c399b0e legacy-trunk
+59797 974f0320d6b3cd9321d2a92b6c604c8c05226b54 legacy-trunk
+59803 42646a872772efada062092cc3cff14145c3a02e legacy-trunk
+59806 05bcb790ef6324be8b7d6f2a00642d6b5cc3c0d0 py3k
+59807 a8697afbf17ef5c72c05e39cdf5ce24fbc4a0b9d legacy-trunk
+59808 45536d5587d477032501a1c536458f9b4e4b3ed2 legacy-trunk
+59809 f9c950e8f2e0ae6fab2937ecc3d722abdaa1ecf6 legacy-trunk
+59810 b6ea52993cae50ae656043fde70501df569105c4 legacy-trunk
+59811 f27074d147f4e198a7b308792b1b5bc8d454bd68 legacy-trunk
+59812 6c4b0cc9f6c900bb25b4921e21fb795bd6f81225 py3k
+59813 7ea231578b02dfa03c78636e83e60e2a8f4f5edc legacy-trunk
+59814 3a944935c610da4fcc02b4b19829cf557c087688 py3k
+59815 864e679a0e850804bbf23ebd34ef068b966c170d legacy-trunk
+59816 4d23f5a7d4c9609c3034fec394c038a1cb740e7e py3k
+59817 19ce9ef34b6233cb383558cbb77b24bc69cd26e4 py3k
+59818 b98977f0aba1c657c400eb1daad559222cb8ef2c legacy-trunk
+59819 ac51cfe5c5c6b98284c367444186f7ccab557390 legacy-trunk
+59820 f3c1f9c8ce9f106eccbf1f4376c2b002045a6a61 legacy-trunk
+59821 76fceb58bcf51d1e7993264e7b1c5afd46ff1b01 legacy-trunk
+59822 06d15da1f1258c44545440302befbf8c15ae1a77 legacy-trunk
+59823 2cdb661675f9c03d9a962d68a7121e3ccd77f449 release25-maint
+59824 599f22a349a24fe3a990ea1cb538757200c15dcb legacy-trunk
+59825 cdc285bd0efb44e7a4906c1db3e111a8922218de py3k
+59826 305d7d2ce04701b41ce094e5083e006e75da5206 py3k
+59827 132d908471c838b91055cf30041414f5026b335b legacy-trunk
+59828 0aae14950e0bc2bd37f0f461a2478dc5716d590d py3k
+59829 3b3ab925b261e734b64e3d1f05881436963ce949 py3k
+59830 db5e01c33eb7633c013a514d279af32479889b57 legacy-trunk
+59831 fd532a9b281063833918864cead795cfe64c6e52 legacy-trunk
+59832 6b715ea804377468fd96e154f8a38b5ba34c7a49 py3k
+59833 cf36e01e83f20e740e9135b9b36bf48d00da0caf legacy-trunk
+59834 addc18596a157535e0aeda80352af5219523e6b7 legacy-trunk
+59835 ca1415c6105f7fd0de7be1cfdf0f5733cd6eb0f7 legacy-trunk
+59836 19e1fa78d330549f42acd24f242ca45d551dc7d7 legacy-trunk
+59837 5e024e91ee067d751a9429082cbe9a6f1367f0d3 legacy-trunk
+59838 e9756266e0b9381403848419b170ee2296f2ac34 legacy-trunk
+59839 6d521603e07de7fb788eda5e8f8c954292d96c4d legacy-trunk
+59840 c75d360ab87b387663a1832c42a054ab7ac3bcbc legacy-trunk
+59841 73e1bf179a01ad7824ff5aa2b29ce068a457cd67 py3k
+59842 236e7526abeaf58f05dfe97ed5cce2f2e9aaa890 legacy-trunk
+59844 42cf59ccce662b7500f774a94a61fdbe3d57c5ef legacy-trunk
+59845 a2938c55200ce4a6dc1cd0d510a89cef241de3eb py3k
+59846 fb5a6330f71b398fceb0e405202a88805ba1cc14 py3k
+59847 cc868fcf505aeb59e413c298191a33ca869ad99a legacy-trunk
+59848 a5b7f2d8761d5a1d2ab26e21f3607a3aef692a79 release25-maint
+59849 60b54801b64632e80da4114154ad9c40474a1128 legacy-trunk
+59850 a1dde680e69420f7bd2b810f29a76881fa735ebb legacy-trunk
+59851 cb22f8748da7cf456b86eb2f70f4bc31e92b458f legacy-trunk
+59852 057de46ea17e21a60c4b69022e31894988239282 legacy-trunk
+59853 88d76b9206e667326a3cf81df28ebc6f25d56111 legacy-trunk
+59854 d1a1ba502579e9e22255a78d7b6f8e30c8367243 legacy-trunk
+59855 76c765a74fb8cb4385f902705fafb664de3efcab release25-maint
+59856 5fb9b2f6bacb7c6be889b0004f9c6d7a11ccabe1 legacy-trunk
+59857 088b5077c900c8d4873ddb5e9799887276dd6026 legacy-trunk
+59858 f45eaedb920e2055ef37e12fb1d3bed4ea4062c0 legacy-trunk
+59859 9a60bd8f00d6afa9042fc2821fe0a28b613d2c01 release25-maint
+59860 76cab8678916e4d4a80b02ae3d18f148f8d4a593 legacy-trunk
+59862 47e78c2d16de0d4300e6a7c2722f536e89ea5326 legacy-trunk
+59863 b7d1b627a7d51e4d2b22e009170eda539d926b9d release25-maint
+59864 94ab572ed6ddf36080060279d9b71f0fd03e27e7 py3k
+59865 33440919961243214396fd2952796c8c09f6935e release25-maint
+59866 bf7bbd8db1a82d78259ff9254c0f4cba2332288b legacy-trunk
+59867 5f640f8f92f48d4dbd2b893302921edd0d193c96 legacy-trunk
+59868 1d74dd8228db0cc95bc70023ec3e92a7cbce9d3c legacy-trunk
+59869 10ebd027c2439425dc125b342f1ac1c154196d3a legacy-trunk
+59870 50869e747e76e9e40a96839504f7db5b8c617168 legacy-trunk
+59871 9f6aa498498d285c1a1acdd77dfe6941a2555035 release25-maint
+59873 a60f92ba0d1ed5631555b2c29aa05707f3b13099 legacy-trunk
+59874 6776d6ef201a103758b4bfc127e939d56cfb9ce7 release25-maint
+59876 dc9d95b717c57e3e61f4db29edf90d9657ee58ee legacy-trunk
+59879 9a97908b4c97ef91b1d2db512364e171f52d79bd legacy-trunk
+59880 c9b6be481657dd96281cd02687a451632706aeb7 legacy-trunk
+59883 a29adc3b0f266b636c962e429c140a0bbb3c1897 py3k
+59884 fae9cedb9146bdf162bb887bc3839d71f755a147 py3k-importhook
+59885 fb287415aca0e6fa5d2a329e28a3604c2f013433 py3k-importhook
+59886 a93e0e80c18a01710801487b31dde9c0c9a59344 py3k-importhook
+59887 76a461de15444410fe1905d6ae7a7a7312b72d1b legacy-trunk
+59888 42676a4840b5a7110accc682c76ec42c63178977 legacy-trunk
+59889 b446cd61388f05b5fdd5e657dd1baa1f27b85d00 py3k
+59890 d8d7a78c6423c1a41622c5b67069b56f0821055e py3k-importhook
+59891 8969d74d0d22f319c7c45e64259ad74775618751 legacy-trunk
+59892 c3113914e66e9e0d66939ac3e1a7fc8acfd22431 legacy-trunk
+59893 af6f345657b4b7941f31fd4ce6393248face6e45 py3k-importhook
+59894 20578db07629a20466f54f67bb8340f8b82bb213 py3k-importhook
+59895 dbafcd827979e097e09ffea176341fb6d52b97d4 legacy-trunk
+59896 e753e31a0c8f179438a19ff74690cee07403eb47 legacy-trunk
+59897 df856e0e1b2a089c941df4c2a31730d75555d852 py3k-importhook
+59898 69f495082412672734891f66e228a629de6e057d legacy-trunk
+59899 60126aa3b8169770d798485b2f75bfe9e1b8e5ed py3k
+59900 7851e75f5438ca4598d305c6c99fb9440fdc0d7a legacy-trunk
+59901 403cfca9863fd2e308b045e2af18c0f6d2afca48 py3k
+59902 5dec4ade8fa95284b060e0c543f30436a10d007b py3k-importhook
+59903 8058e16820ef860e4c90c47e070ab3bf76f89038 legacy-trunk
+59904 354be0dafe54b222af25a93dc985efbc287c9b57 legacy-trunk
+59905 3cd9b877eae09a35b9ccd795de75d839729a487f legacy-trunk
+59906 785237fa5f401444c31d617ddc06e010a39e8fa6 legacy-trunk
+59907 6b0b5edfb1b785c1691c7cf69d5982711c499dec legacy-trunk
+59908 06f9f51ab8c03ddcbb1d29a693d260c81436a204 py3k
+59909 be04ee4c4fd7345869c9803d5d10b81dfa192ba2 legacy-trunk
+59910 2ad3e35c5825c37f28b7882babda3337535c8171 legacy-trunk
+59911 af3a0ca1ab4a02be2a593186a430463dcbf37b91 legacy-trunk
+59912 62f6d780a11de037346375af8f5fcb9662d8bace legacy-trunk
+59913 3cc3a55d12334513fa736a504573e7b6218aedaa legacy-trunk
+59914 94261f3027a593def44a3586d130b8d6148db9fe py3k
+59919 59a82cdfa137e88b8cc36d655035ca7f4e9b7093 legacy-trunk
+59920 aadcda7a4bf7af4ee3a09b5012e4f4a2d5568961 legacy-trunk
+59921 d8e4342c145e6b5a88a1491c54f1f1f19dc6952a py3k
+59922 e7b82101b970f8ec5b10e55e9d9d9182d42e329b py3k-importhook
+59923 79579fa8d752f2bfa9443484f4a67601b77ea650 legacy-trunk
+59924 f0b933f1298267d8e6ca35513628179c70beb4e7 legacy-trunk
+59925 a220211f83313160291bdf5fa76656e230f39052 legacy-trunk
+59926 d5824fdd9a15f0fd7669cc78cb1c2cd119a5be5a release25-maint
+59927 776b4e059f836a1fc1241cad73bdde6b1b836fc5 legacy-trunk
+59928 3af3fd3887ee23e495c222540fb110ecbd8abcb9 legacy-trunk
+59929 7b798548a4ade4d026f5e9d8d9c8b2603bc239f6 legacy-trunk
+59930 7dbc3f4278ebd34fb71f0480e267c9a8f087dc85 legacy-trunk
+59931 273d37bf23d3be2d32ac288ca98b2ecd0b693261 legacy-trunk
+59932 a54cc4772e7373835b96ce686c289fcab402d8a0 legacy-trunk
+59933 5a71dcc71eff76394d359992772a0d9a0d92a794 py3k
+59934 5351105ff808a3170a63c6ef7e7c8d8095abbce3 py3k
+59935 4ca8acc9bed71548927ea8275fe9ca00b4edea58 legacy-trunk
+59936 3f65bcc8966f29d8908e0ecae156ee9dc2588b21 legacy-trunk
+59937 b672c015c2db84ff46796313670528d307d04e68 legacy-trunk
+59938 9468e606361734e15ccfa0ac0ce958e4b9b9354a legacy-trunk
+59939 c73768d977a9f92bb9cdb90478d571cad1990d2b legacy-trunk
+59940 894d2ad450269e7e05d89987f3dd67e1808da097 legacy-trunk
+59941 f2d820b5ae2ae6437060bf384092601a9594fcf1 py3k-importhook
+59942 c25760c21397a1e42390e3364aeec9caab5a55ee py3k
+59943 4293a06afd727f7536015f7df3d2a1c272ec9b90 legacy-trunk
+59944 387d48c3a0b3e7c2741871b19a11b7b27c6fa8a3 legacy-trunk
+59945 91928d99ebb092707b462d6ce8a549af81b653a1 py3k
+59946 426fef8bade2dd7a86c8a68d00b40951668ac7b8 legacy-trunk
+59947 b409941c7a51e1009db1418c1023358273d3dbce legacy-trunk
+59948 7e41e1c46b57b0ea6a28ef2ac96ecc09ae0c0725 legacy-trunk
+59949 9b6d348cec87e4ba4c30e3a7d8fd73d416228c3c legacy-trunk
+59950 d66e5837aa57c322e1dfe601305c1f5e946e6a4d legacy-trunk
+59951 33f6709075e83c8a7e5c2e63a0f012b28bd4ffe8 legacy-trunk
+59952 322c238a64e527385a35967f5fcdc7e9883b2d37 legacy-trunk
+59953 62eace6780f658cde51a65a1e5a0ce9b58d2cd77 legacy-trunk
+59954 1154158a199f7794f25855d9ef721c4771c65be5 py3k
+59958 627f2e2273b94fe98bb91d73e199a74dd930a167 py3k
+59959 005021bf5acec73c323edc47da899e36631be065 legacy-trunk
+59960 827f0451734fd966477af3bbcd5eef55a7a7754e release25-maint
+59961 5dfded9ad8a0cc6dfeba76853ca9e3cd9d77481e legacy-trunk
+59962 6af194c494cc2fdf3f72342c049e5dc5779aacf9 legacy-trunk
+59963 774a9597228e0adb7f8e1b9a5b693b7d649e65a5 legacy-trunk
+59964 cab84129dccb54564063f1639618565ff387e8c0 legacy-trunk
+59965 f034eb5d8cdf49ac511393fc9f96c6d6a4c7bc46 py3k
+59966 357b365560f4b79238e90f8493e44ebc9d79fec6 py3k
+59967 a00d90004a25196ada6cfca2077612e7dd84cfc3 legacy-trunk
+59968 e511ccf2ffbe67a12e2142390a6836cd576b2e05 legacy-trunk
+59969 d0208d65dc22c50108a6739e8a35a979399eae5b legacy-trunk
+59970 8689f46d25d6af55c8cbe4d5f175df8c15ff79c4 legacy-trunk
+59971 14854c7c6a24870adb588d2a615a75572b3ffa69 legacy-trunk
+59972 5c7b7fbea681b15d84e43129980f83ceb599884e legacy-trunk
+59973 0bb6cf77c85af8534d0feeecba444aeaf191a318 legacy-trunk
+59974 46e731bb6a85f1cedc764874c9fab12d64be52fa legacy-trunk
+59978 59f29b0136fb5f618497f09f8a452a5064b40b3a legacy-trunk
+59979 bfa8d2257823223db7c4a3ddce66144441ae1f78 py3k
+59984 28c81c27389e254339a90c310ab57747ae323231 legacy-trunk
+59986 6e5675ca2559c6a737ef1b46b81149f771a7d47a py3k
+59987 c790587f29925c151451040d394372ae687d669a legacy-trunk
+59988 cb90404a46ad18a122bf182ad2417e9cf4fa5a50 legacy-trunk
+59989 f302cf999633eb7c6d2b0e0f2684f4defbc900a5 legacy-trunk
+59990 6f049ca55e06b2c108ec0d8d0e84bb0b823dc385 py3k
+59991 992a611b2e31466c1704ba7ee6c196bb84b4f01c py3k
+59992 2f11f7d9bdc84e0d6bba2efe3ce5a49fc0ce9fa5 legacy-trunk
+59993 71c799eb24b2480adfb77f43dd275ffa4e21a880 legacy-trunk
+59994 7f2f21aa36906a9dd1e7857c89e79e941a818ba8 py3k-importhook
+59995 b23b477d7899a668f6843494a671359458924383 py3k-importhook
+59998 c4383d765ca717837484a3c2ac5d371a80066498 legacy-trunk
+59999 a4a02432e7333e99ef09ec57b39a29eaa0e75b8c legacy-trunk
+60000 41f1b3cb0bb10355b2495f913eeb496f3974314c release25-maint
+60001 2f7f3f5e73d3c5eaa1402c91afe0e4ce18ab2724 legacy-trunk
+60002 3d7042893cc5046ced7a196d58b6d20a1f59e9e7 release25-maint
+60003 caf58c831499cc7d59453591896d0310ed95fd27 legacy-trunk
+60004 a2f3d499ce12ef4ce21b56bcb1e09ba3c562269e legacy-trunk
+60006 27d59675b92c6f7a0d005eba89caa85d5de04bb0 legacy-trunk
+60007 f128e6ebf90f81d0fd2a3058bc7fa3cab66b30f3 legacy-trunk
+60008 2c9bc61d4f73f376e35895ffdd70fd911b310630 legacy-trunk
+60009 c784f20c967e844bedbb2fd3741d29bccae92a8d legacy-trunk
+60010 aa5cf6394641dc1d3a2bf0d6374db6ac4ee805bc legacy-trunk
+60011 99000ea21ff278abb8949daec70a71574ecddd73 legacy-trunk
+60012 b469e90273eb072df7f04deee32c47915929d3b5 py3k
+60013 d0f7963cf8b03348cbcc4530867205865403a084 legacy-trunk
+60014 26b61a5df11b612d311166274a72ae6249d3159f py3k
+60015 cb0dcd6e3b1147f3aca3b2e2705f6b1b90a88466 legacy-trunk
+60016 3b3856b3621b20895dae4f34a3212d58815d84ac py3k-importhook
+60017 df71fcddb75eab17a05fe261e4023302a2ed689d release25-maint
+60018 a3802853c3176266cf7b260d00d2e4909c182d85 legacy-trunk
+60019 170cb2739a390e278322944625ef1b95b8cec22e legacy-trunk
+60020 0766efd2a6d63e63a3b3ddb533ddf2caae87a600 legacy-trunk
+60021 d816bc0c40b67596e2535e047456ab5a16b7c776 legacy-trunk
+60022 717265ed2041b3197c25e61cf5b2e16218825e8c legacy-trunk
+60023 3b4bc4c704c14f690bf42a0addf65dfb85ce746f py3k
+60024 222b918ce0924ced6ee7db19cd3a4be5f0ac2e66 legacy-trunk
+60025 29e4c86d5071a6c8e5ba281201e181b2235907c9 legacy-trunk
+60026 076c8abbd54f7899d82045955652a0c916abedea legacy-trunk
+60028 8b495403ba235bda8e3e83bb0aa7073ca4847ed2 legacy-trunk
+60029 428dd851bb8ae80fd3b13b227838b4d3fc257dd1 legacy-trunk
+60030 bb33b32de3a0b9372154293dbb196c2a4e07b54d legacy-trunk
+60031 85cf220f16d85ee40466819746322b8ed359be83 legacy-trunk
+60033 a0dd092bb6c36e7c6d3b58b46979935447404599 legacy-trunk
+60034 4d61c887624d35bb6cc63021b76b2975e93bf628 legacy-trunk
+60035 26a86c29ad600a688e4a494c9a4aeed48286b4e3 legacy-trunk
+60036 840e87e18306940b80c705b392c34d863ef55e4f legacy-trunk
+60038 b4003b6c6d137ef954c47336dccc5f96e3f53a72 legacy-trunk
+60041 a3bf0e24b91e694ef94c48567f091fb3906bde47 legacy-trunk
+60042 79babb4ccec852fffd93b96131786e7d3410ec9c legacy-trunk
+60043 bbf4845810437d66b61687fe73b78754c89b02b5 legacy-trunk
+60044 14d4104976fcc7d41c8797b0106a7045fd6888a6 py3k
+60048 2946020560e73f9593c4010f4fd9763612881eb4 legacy-trunk
+60049 d9833d2bf4695ffc65a782a9c89e2c7362a27ff6 legacy-trunk
+60050 dbf0856776dd7c3c2bf9f6ed7e4f254de67157d0 legacy-trunk
+60051 97a7c126d04ebf665512a500a3be58d865ba683a legacy-trunk
+60052 8da9ebf7302647ecab53949145723c7f4c362998 legacy-trunk
+60053 4a67673e3481dc104e5e687e5bf3b37cbcf00762 py3k
+60054 55ddb166f1d1aa32b4140eff6180c0ecb01db4d9 legacy-trunk
+60055 3f40ad3c13dd7ec2b4ceb247914f49612ebd9a3f py3k-ctypes-pep3118
+60056 765e57c001b1a11ebbfe30e7638372ea9e908393 release25-maint
+60057 58303ed72ba1a7bf125ef66096428d4370c8d6f3 legacy-trunk
+60058 13f74c8544cc8a921de6b4fc6316404ab3c9902d legacy-trunk
+60059 eb8ef969ed68a5f786fa429ae34070fd3aca32b6 py3k-ctypes-pep3118
+60060 d7a87c7f14d9ee976f456e7f99ee125fc73517a7 release25-maint
+60063 a5072ba35f0a0f3ad156945108f4672cf8bfce7b legacy-trunk
+60064 2179833c9c9a5908f39c10621dd7dd24313e4751 release25-maint
+60067 0b7b62dd4dcbd283f76f11235a201d02f1589555 py3k
+60068 c4709b81abdeb6c7c16ccb60aaa197ec795ed444 legacy-trunk
+60069 febde3caf29126c53b2ccf50477314af9c3caf2a legacy-trunk
+60070 f2797e0709e38ce14df3cb4454d993eff3972465 legacy-trunk
+60071 3d72f5209e67d5498253a18654e2c876b7099607 legacy-trunk
+60072 f9775438369ab61161baa4550bf3f66ef9df6556 py3k-ctypes-pep3118
+60073 ce326afdf0989fcb60d7d18d895a5a9b3665a9f0 legacy-trunk
+60074 cc0a2961195ef381acadb5255af8114aa2919ef9 legacy-trunk
+60075 73b5e939e0580ddbe810501b892a0bc9c5cd25f8 legacy-trunk
+60076 52e821418a799b524ad835811599a657b440bb03 legacy-trunk
+60077 8edbe025aed57128f13875be55458cc1579cc787 legacy-trunk
+60078 c7cb5800606e2f6de03bb92bded7aeba112d0488 legacy-trunk
+60079 a6f9a2ba8962a462943b6a3435d44611ef15b743 py3k
+60080 cde41bd08e5e24cd938d6227558d047f5a0cb99e legacy-trunk
+60081 e3fdbc8099998088bd07abe4d02b12c47644fc4f legacy-trunk
+60082 859bf85a556a98b820b001682d38afe04950c1a0 legacy-trunk
+60083 0fe936b7711423514ace078c5e5bfb4467b07eca legacy-trunk
+60084 afa0ef3791865d18ceb7138d635181f1bce32dbc legacy-trunk
+60085 a265baa79100343ba15b85d0587543e33df2c366 legacy-trunk
+60086 80366621c5022981b723a868ba24a5e33260225f legacy-trunk
+60087 9c0a913adcd4b8a96e6b9f91ce925421a5e822ef legacy-trunk
+60088 e4e6fc9c9775d820243829b1946371e1fbf15f8b legacy-trunk
+60089 8b55321161152bb0fc2fb0284fa237b9db583aae legacy-trunk
+60090 3625eed4f0cd9be8c83b568ff47e3a1a1dfa4058 py3k
+60091 877b4679b9fe69b405be583ed08f6612dc4618aa legacy-trunk
+60092 61a11cc95632e841505f2fae1335c6cf808b1946 legacy-trunk
+60093 17009d6211b836a660146df370b37ebff52cdfd8 legacy-trunk
+60094 ca2683a6794313a3fec175d740587c53739e238c py3k
+60095 4a7afff52ea71f487a21ed19685baaa97cbcd1ee legacy-trunk
+60096 b3102006dd7ec9fcece38228ef127d7c10daa739 release25-maint
+60097 b520d33bee06154f97c5aeef2e07796a75dd98e6 legacy-trunk
+60098 4ac484249bd1e1fdc6211b616b1c6cf91af0aaf5 release25-maint
+60099 4f35118eed3b8f21625c7fb503d6cc5e76452c77 legacy-trunk
+60100 88f8f152a0b332c2d0b9147d02191baf8a5a4554 py3k
+60101 3c9ccc32da9afe644970a77ffb48a3bdbe11bfd3 legacy-trunk
+60102 210323e2a92726d4bcbe53bc6fbe1972d7b14d44 legacy-trunk
+60103 15536865198ab219650c50b987df7861d27709b6 legacy-trunk
+60104 b4d03a92bddf9cbcb7cc05cd7276184340cf165b legacy-trunk
+60105 3d131c838f09b8a3011e4308dc93be2b4cbb1d77 legacy-trunk
+60106 d8c13ecb6e859fee6dc19df8fd4cbf31e0adad91 legacy-trunk
+60107 bda49eb460749f8430795f24ef2fd6c3af386e47 release25-maint
+60108 17f84533277841545afc1749bf89a13ee2369135 py3k-ctypes-pep3118
+60109 13dc65fe8599f08a8d4ae5df45600ece7f07236b legacy-trunk
+60110 ec02dbe6b05101b613aae536e110456b119a544e legacy-trunk
+60111 5e66030f1a67a469548475bb8f0a08f88062142c legacy-trunk
+60112 ac2ea95522930b2c21c6dbdee86e77714172cef3 py3k-ctypes-pep3118
+60113 0ace74767478cf67e6b0742ed1f904a0cc53379c release25-maint
+60114 4796588d9f9acb7513752677336c3cf6ba27ec8b release24-maint
+60115 c23892f5a69f16f81b11df7c80b00c6d6f995636 legacy-trunk
+60116 11483a673a45eed4cb4425525d0dcccdd9f73f1f legacy-trunk
+60117 68f5cc95b70a5e6f9c049c9a816a4c3d19df6a4c release25-maint
+60118 7647152f74245b7ee5299b1d8886cee79a244527 release25-maint
+60119 1e5614567a6ed969cf9427745bedb87b02c9973d legacy-trunk
+60120 816a7bdbf69e8fc18c89f8f97e0e6b1b4846cf4c legacy-trunk
+60121 1120b3d606f28c1c5ad9052d46484a5387954630 legacy-trunk
+60122 6d43fccda90c3a142cb4e021ee3c01cdab00ed66 legacy-trunk
+60123 3e0f4a4b9f55ae61224a7e225bb55e6981ee8d76 legacy-trunk
+60124 fa6cee14dcba48d0abd5d01b4d90791897b800c0 py3k
+60125 55349d4d9f8339e50c5ed689ce835fbfdbc847da py3k
+60126 1e8b9e7c34cec55d0617adb3df012140e3ac8292 py3k
+60128 02a2120e5db23b5fb4d4d46f3f901f95f84368f1 py3k-ctypes-pep3118
+60129 941cf2bf200e4392a3f8bd86f36f65195ba5e0e0 py3k
+60130 b99f9295fd9cf886deebcdc646b2954866a975aa py3k
+60131 942e4b42da14d5685ce2a67dd73b3f5a17d191b5 legacy-trunk
+60132 150cb48edb07e1ba8610dfc3c10022768c6eed16 py3k
+60133 3f34d3b0350d135b9d61fcef504c56a350ae9fc9 legacy-trunk
+60134 e36469e6d8b67809c734babbf181a89c2aec7bb5 legacy-trunk
+60135 abcb7923d898fda3ded2b5c613454377c7267d1c legacy-trunk
+60136 145b3e605378435266e543a00408f8c25d96f569 legacy-trunk
+60137 b28fdef2f0d71b18d68447dfdb27ba9929bd0828 legacy-trunk
+60138 424cccfd2baaa7218a9cb4daf39bd208e658b3c4 legacy-trunk
+60139 eaca2367ecc99278b209665ab61add08941a2453 legacy-trunk
+60140 84f1a658b231923705ce92899b00c507a6275ba6 legacy-trunk
+60141 ef859cd754a76fa77e084a858e34c2e8f52a063b legacy-trunk
+60142 ea389a268b544980727ce38597d34fa98f8b99b4 legacy-trunk
+60143 eab00db80c27959f022f4ad9c6d0f384cdd73b14 legacy-trunk
+60144 ef7d72d98485bf414a862167b0ef2758bf9e132c py3k
+60145 ac970f88318756ce2adbd6bd6ba3c90b6a6b646a legacy-trunk
+60146 0f072edb3343732617945c75bd03e95e96f9ee61 legacy-trunk
+60147 c3bf8f9beaa727129e4e07e763c1679e5b49ced1 legacy-trunk
+60148 eb2eafda29b76dd9b1b2edb62774ff594e81afc3 legacy-trunk
+60149 89b13b69386454065f05b66e65a894668103105f legacy-trunk
+60150 ed33da2e74e70e3e14fa99fcf8802974e2d63541 py3k
+60151 9411b1b9121812b7bef6e7883b935b44ee122950 legacy-trunk
+60152 fabc688a08c68ffbb5d16a5344fd096eb6301fd7 legacy-trunk
+60153 ad6a9db1ff45c542792aa3bd950bc6e5a8b3a463 legacy-trunk
+60154 f6d4a2c4953150e8c63c0e802eb24b49cd7dfda6 legacy-trunk
+60155 8f15f8de42185aac4aa1dfaea92a40df5c184ff3 legacy-trunk
+60156 8abd36f3ab7a3adc829f9457188db4e785239627 legacy-trunk
+60157 0ae59f608b44f9c11e8c03610ecfeb6563d51ec8 legacy-trunk
+60158 1990fa6b9e8287d812a70ad8c19f657406143c1d legacy-trunk
+60159 79f15053751ed876dc264b48f853deb9a6062c63 legacy-trunk
+60160 dfff041753aa18e060594678f045812a4f8c66e1 release25-maint
+60161 27dac16541d9090864242e45d05517c66ce1d09e legacy-trunk
+60162 d9621405406bded5594ffb96a73b2b4df0e3986a legacy-trunk
+60163 a6b190b0cf068e7d24cc73ddb17385e97c9b80b1 legacy-trunk
+60164 432c4ae0fd046fe93f453a11198ac031be893fe8 legacy-trunk
+60165 32412fceb1b34ad6342af7115dfe51bf5f0b46af legacy-trunk
+60166 729495f7b221a45e08ee86d1112644e2beaf27d3 legacy-trunk
+60167 c69a7b55ad6bffa59fdf172d6d5f9a88ef7039f5 legacy-trunk
+60168 8a9b3b0be5739aae962d82d50c203fcfccac00ff legacy-trunk
+60169 1be4bbd834a14cd2fab5a060dc6311b41233d092 release25-maint
+60170 7c54f4a2d4384ecda224fd1e03110e52ddc6e769 legacy-trunk
+60171 0b41a91cd261a3527b8f8e1f5412d5ea06653bcb release25-maint
+60172 df22e6180e67ac93588bf64a815a5437c3f622c5 legacy-trunk
+60173 29643fbe1150706a492a3ca9e86b570050819d7b legacy-trunk
+60175 b76c78cda3abfe1d7275b0bc7ca4e6e2222417e7 legacy-trunk
+60176 feba5d5cac221f0bd913fd96ed3285257965a224 py3k
+60178 c3d9e57e71f2c2340193d62d0b5a5a048583dcce legacy-trunk
+60179 5bea4592cd7a1b70e07d895d8d8c0a23f684e451 legacy-trunk
+60180 101d86a1af8588fdb4aa46881fd137b2c3ed2a63 legacy-trunk
+60181 eb4b50f739f6e1a5d9a4ed42a8f064af6a38bafb legacy-trunk
+60182 3107fdb9081e584ee67b5a5a1f8f9afd9353c50c legacy-trunk
+60183 8103f0198967c965376813db1386a6fc8f16f54d release25-maint
+60186 711ae0e99c027d5e7f85d2d9f38b71f58e3288a7 release25-maint
+60187 ea61e9edd9799b8a563db9deb9896fc89dd7ef53 legacy-trunk
+60188 7f2b525f9df48c7e80753e9221180809b6b1bbce legacy-trunk
+60189 b5e809f926de187ec1fa84999e51cf649e9f8b41 legacy-trunk
+60190 fe7d423474dead9b6d32f795ea68f9b5fcefba73 legacy-trunk
+60191 ffacb44673eab76d93a9b32e8d4ac2864eeb2016 release25-maint
+60193 12b6910115e0ff2874e9d900b7476256affc4e3f legacy-trunk
+60194 9d8c877889c3ad0b5fad38f8e460a616b1d7c6b4 release25-maint
+60195 00a68596e50650d41d8343e072e9f704e2d2fdd1 trunk-math
+60196 e0504a1c5f9d72d7144b2b57f497db7a556ab2db trunk-math
+60197 e43c2ab6a57c7695e88a74b595705171ec1a30b3 trunk-math
+60198 091806381cf8d6c1512bb808a7ad05048fabc626 legacy-trunk
+60199 c3ce56c7ecd11bad155e7c2aa93053f7f411f9ca legacy-trunk
+60201 7ca07fe02958d138b5731037fba79b90b3192960 legacy-trunk
+60202 bb7ee3d89c2f607683904a553e3d9cbd8cbb5f8f legacy-trunk
+60203 56f0fbaeb67fdfc8e4b670a17c14f1b8c014fbba legacy-trunk
+60204 867c0aad79c16a71eeb15722f70ad56a2476a409 legacy-trunk
+60205 c3ed6da7a146846c03cca5f58733495fb81daae5 legacy-trunk
+60206 5298abbdd91ccec68367c66b4afe7bc080480494 py3k
+60207 6bd4849b5458de5500d3052ad4bf9f4f03812266 legacy-trunk
+60208 df80c6b606a486ce50d986f6674a717ba8d882d9 legacy-trunk
+60209 d62c126fe56a2d64317b675309f2d3ace708f2ee release25-maint
+60210 fefaa0e66fdd0e351213fbab0929141ee8b188d7 py3k
+60211 eb5910092f59bbb75db6f38115411cbaf3cb8eb1 trunk-math
+60212 c4b98bc10be7e1160e51b966dc99f8e0e61e26c5 trunk-math
+60213 2e151376941f8b5bb6965bbb8745df968c76e6e6 legacy-trunk
+60214 dfd21793a5b5751169efe86c20dbe9ca8ce216a9 legacy-trunk
+60215 dfb6f367a406bbae9e4e8f6669430606be0b54c4 release25-maint
+60216 9a1211c77e028b3abcb3830a8bd22d5fbd20be85 legacy-trunk
+60217 69582bb1114c36bdfe43432167371fccc6348363 trunk-math
+60218 a40229adfa2ccd8d531597b889d8db160aff7b5f trunk-math
+60219 b2854e974ca9670f60bcda1da0a8f6b6a1d02338 trunk-math
+60220 bccc7682c6d4ba4a52d2d64dfa90dd27ff17bbac py3k
+60221 005921fcff43adbc893bce77775f6cb25dcddd17 legacy-trunk
+60222 148c87a667c201d06f1b79222f061617d59d1a6f release25-maint
+60223 fdd74bdeee15bd47c3779bc8595cd4c9efc576d4 release25-maint
+60224 4c8308ac20cdd9ddc31afb1dd9be2732f60cb8d7 legacy-trunk
+60225 b934d2ee63f639bdc5bcb9e6162e66fe79e9cc0c legacy-trunk
+60226 733335b22f8fd78a30fa24b5378c966dd2307dbc legacy-trunk
+60227 d9a60752558ef7d84d29240e120e991143954677 legacy-trunk
+60228 95a48735174080ae578227a5f7007e46a8a609fd legacy-trunk
+60229 cdc4aecedd4c85cef684e01e281deb3ae04cffd5 legacy-trunk
+60230 cc73a8d1938b42ec4b9fe71dd2dd0a58f9b3220d legacy-trunk
+60231 012f516d4d22f38ebe029e39ee2160518e866d1d legacy-trunk
+60232 fed8c36d87150c37012d3ce3024250ccf9aa9f2c legacy-trunk
+60233 22a9d9757a1697b7923ce379853a180943189259 legacy-trunk
+60234 063ed377fd3d62f4f1357140ac006143ae75dfb6 legacy-trunk
+60235 c0f048356c36c8902e1a2862fd55639cc48d4b40 py3k
+60236 e22a92eec662006775cbcf9ace6920df8548233b py3k
+60237 f3a9ad448ccad19eb3725f0d92a274415f56d356 legacy-trunk
+60238 437172093a23a242106a308ab3aaafd3dd57db85 legacy-trunk
+60239 cba3084b27e7269064943c7ad2c977cc45ee1b8a legacy-trunk
+60240 999a5ee9cd2c3a1f7510159f549fe2cb86e78c1e legacy-trunk
+60241 948bba0e247b895929ac2cda5b3dc3b2a42be53d release25-maint
+60242 d8ab32820b17db5bac16611e64adcc7a5ebb7bd2 release25-maint
+60243 f2da7fcf3a244a2090dfc93498ada34dddcf5d92 legacy-trunk
+60244 7fa3ae9ba031daf689a262a449205e096019b516 trunk-math
+60245 c33f2779a938604c291fccc31024d20b20c5512a py3k
+60246 ebbb7bb0033bc34c87d26c27a85f0bf588f42934 legacy-trunk
+60247 db624b1ba06de9b5c897af562034b5498e5661cd release25-maint
+60248 29ff9066dd0c83ddf450b7b4f0626e0acd74daf1 legacy-trunk
+60249 685e96d20881bad6db344e5a14f0147066cea8e5 legacy-trunk
+60250 8bd5f0db7f5d1070a2d4c004c048bd146077be99 legacy-trunk
+60251 a8b750210b799091e8b328030b6916a6a24d2885 release25-maint
+60252 6ef3be47a44e7e46c1fa1f0cf32c7f0183b272dc legacy-trunk
+60253 d16de6252f7fa438ef4f64af78f3db5f8471f2bb legacy-trunk
+60254 e8efa62eec157d0f25d87fbb56edd1336bcbaaf6 legacy-trunk
+60255 a8c74125376d6519446f594712eda45137017e56 legacy-trunk
+60256 f4a6c323500bee055206da013fda651f2cee1ed8 legacy-trunk
+60261 a6f0e4bfc2dd70feb42b8c8b25f01a0879d59233 py3k-ctypes-pep3118
+60262 7e3afe9064495b2b0feb8aa5e4e5a7cf232f02c1 py3k-ctypes-pep3118
+60263 3f61b6643b7eea1dda57a777537d35a63f1af26f legacy-trunk
+60264 757a7f31e46092c08c46ddd8704268f074e2bedf legacy-trunk
+60265 69c5703d20fb410934a1e30d9cb63febc3da6025 legacy-trunk
+60266 ebdbe8df62b0398534e93551cb58710af67e57ae legacy-trunk
+60267 4268b77f8e567d0c036b335850f4401184646fbf py3k
+60268 742a264cce4fab3782f71138989704db877fde09 release25-maint
+60269 ce159d01ee322a771ac7356fc1310e0bd4744b2c legacy-trunk
+60270 6da0eea36783a930891e3bac78b144efd444b9fe legacy-trunk
+60271 3bd19c8af2b11d1f13cd105053f20dbf6eb4281c legacy-trunk
+60272 fae54591c0356586117566fc26614e72e62ea55e legacy-trunk
+60273 844203209fb06ecbe8534ae59ac2ac1b81540cdd legacy-trunk
+60274 54558e029c2da420c5ca6f2d1cfbcd9cdc0213e2 legacy-trunk
+60275 934a59d5254314d373fdcc3ca289c67b7ef18611 release25-maint
+60276 9972cccf6a33f449a598925d778337b7125a384b legacy-trunk
+60277 12099143724f34cccd9a62af0cf8a215b1dfb1f4 legacy-trunk
+60278 08eb1c41111391dbb1cdf1f63e3bf77f1c8a158a py3k-ctypes-pep3118
+60279 53e7bcfb54a45f5fd1cb16e253af435c27beba32 py3k
+60280 aa838958e54ab1388e4d9cd873996748523cd14a py3k
+60281 6547be11f44385fc80f30f9f317c2c66744e4578 py3k
+60282 8bca8eb36e37f5189d095371be7eafdd9312f1a8 py3k
+60283 bbc719a8b58bf6d9c4b7a1fe33dca0580ce4cc09 legacy-trunk
+60284 05f01dd758a1bdffd9fc307a89c4649eb59b6372 py3k
+60285 3a442a009a83e586868d46a0b9c090e93fc39778 py3k-ctypes-pep3118
+60286 8e435bdd4bc8966aa39aeed19a0674b65e007839 legacy-trunk
+60287 1be93dd179df7a902c49b46c438a91644e584552 legacy-trunk
+60288 dcceaefa67fd8e582e5ce14e96add4105ee05d0e py3k-ctypes-pep3118
+60289 27d227a87a737bbd112f5ef98f1af43c158aa0eb py3k-ctypes-pep3118
+60290 ef42bd7fcbc83e3902d83a1d0d00e4bccec75218 py3k-ctypes-pep3118
+60291 ddb1e499a01f8163de133aef97726b988e0c82ba legacy-trunk
+60292 3c57a51f7394f875328d3970e09349936715e2b8 py3k-ctypes-pep3118
+60293 d8e88358f6c240828b96cc6c3251386166b0f69e py3k-ctypes-pep3118
+60294 42449f682885ba06ef7f5a0fd3ccbd8695d4d827 release25-maint
+60295 5950d8de8134b549ef82aa6911e30f79dc39dd0c py3k-ctypes-pep3118
+60296 b54746e2a880bd358abdd40945f45f749653330f legacy-trunk
+60297 9467ea20046c31d8cd7b7505e141a40a84505091 release25-maint
+60298 1f4b1babb9e07b1c3da5fe7b2266a24af080685e py3k-ctypes-pep3118
+60299 ea1d47c7a46747b15a3c06759caed57b62091fff py3k-ctypes-pep3118
+60300 891050a6a5c90172774fec3e3becebc97c927e74 release25-maint
+60301 fb68e44587ea259d522020aef14fc3693a88b17f legacy-trunk
+60302 96f5dcb480a602f9de53cd9d23ee37f6480e61e9 py3k
+60303 851030162d72834f08aeb930b5ba44a897e2634d legacy-trunk
+60305 666ceb6799a781571e5dd3989692c0dcaf2e4eb9 legacy-trunk
+60306 6ae22030e152576ef68c6a0a2b139b43af985b3a legacy-trunk
+60307 d347c1f9c38ad658b9a7acc7c2c7df8095707cd7 legacy-trunk
+60308 c6e5c604ea61dee2ca2a6eac2b3c7cce72e62cda legacy-trunk
+60309 be44faed542d7fd08f61e48e2e4a435725b3e7b5 legacy-trunk
+60310 0f093e8b2f531b4b14fec9b54c41b8ca9290c4ee legacy-trunk
+60311 307d4109e23ea5fdea0ac2b433ad5894acc6626d legacy-trunk
+60312 3124cc5b973f17c489707f9083991f1d5cb62083 legacy-trunk
+60313 b70485011214538f3e8c1370a84a7c8ed6a42e40 py3k
+60314 37d762975a953de1cc6e58e0e7191a8089a116c0 legacy-trunk
+60315 221dec03e261257bb4767b37336e9211acf8aea1 py3k
+60316 aedb7ac2627ee4251f3fd6abb81506c008489ad7 legacy-trunk
+60317 47bb31d065772d1007a54ab5a1d6ccefdd61f665 legacy-trunk
+60318 64d13f456d06bacf3e903409ee42147daa2227ae py3k
+60319 8431617f20e2a95abd618993f8df245e288cf34c legacy-trunk
+60320 aab5c8e8f38dc0339d2308aeb55abfe0e16869bb legacy-trunk
+60321 aaa5a794f887e21d1cfb64af79a39d52174521de legacy-trunk
+60322 5e0b460f294a5c7cc1e1adc81ad7472e415a2ca0 legacy-trunk
+60323 a750a26b5fada62e6a0ed99a96bbde2043f922e3 release25-maint
+60324 51bb7b1ae76591058836f1687bb03f9fedb0469f legacy-trunk
+60325 df23d5249550d7f78887feb076e6275f0f6dd7a9 legacy-trunk
+60326 699b37170cadc6b0194cfa4c363ff5f59d1600cb legacy-trunk
+60327 cb5839d1322616a0149788378a2d86e4ffcc5927 legacy-trunk
+60328 8cbca91e3154970bb4756d28f25aee8d419a96bd py3k
+60329 fbb9ae9a514feba90cac729bb3cd9927d54d2332 legacy-trunk
+60330 5d782c8d401668cb93d619c4d84697167d45031a legacy-trunk
+60331 dca3f646e8a1fb59ff28ac6678b41942afef04f9 legacy-trunk
+60332 f3b584843f9fbdc9c54ab51456e6fc7e074da0fc py3k
+60333 962c491e17d6ca8c6803b02d0a271d07deab9240 py3k
+60334 5f98446e0f1bb7b75624bc570295e5bf1fa4dc00 legacy-trunk
+60335 50f2d7bdabc9a46c709c1186b11bccb1378356c5 legacy-trunk
+60336 9093908a0cf5d4c2cf67d63f9a26a99a9d858992 release25-maint
+60337 e336258955502617b58329c7fa070b4e779215d0 release25-maint
+60338 5b17b44be1bf878d691eecf9f32c96e8e42bcdb5 legacy-trunk
+60339 635a756360f18c9a115ccbe2564a7636dcc61244 trunk-math
+60340 72a6727bed9c9e14f3e554603ada742290ce88ae trunk-math
+60341 6adbd62b9abfa0e30b597d7ce110d9e1243b6bea trunk-math
+60342 2ca2b0840b35d3845d80bd778635a065d366a649 legacy-trunk
+60343 20bf94285eefe86865c14492fc0dff077c0f351e release25-maint
+60344 4dd0fcf3daf73e26f03c2b8b7ed1188e16911581 legacy-trunk
+60345 ff58b30a8d52871d6cf0542cf7ea1a704d8a14eb legacy-trunk
+60346 6bbf6fdc152b9e42edbf11a605c2162319981e62 legacy-trunk
+60347 467c71f365fdeb4f698ec472134ab84b71984fcd legacy-trunk
+60348 f01813b33ca4bcdfb4ce1355e7d3b1ea0988ea08 legacy-trunk
+60349 62f0ba745357f059bec6ddd3a4257b2828fac7cb legacy-trunk
+60350 7c02182e2979a22ee758ca02f25f882b2b840d48 py3k
+60351 9b74c9c8b92c79fbf904f4676e73cda8dc36f0d7 py3k
+60352 f5e52a53fcd14834f6372b6ce1b6ead98913b208 py3k
+60353 ee243ca65f5f5468bd09639c807042ff3ecdf62e py3k
+60354 f15d3bf4ca56a12d1b06c6261b530ff180457b4c py3k
+60355 e224ad4b8b8cae316fda04a259753aea2e6a0556 legacy-trunk
+60356 707dd9f384f389624b20f210bab9b9b47510687c legacy-trunk
+60357 fcfa13199ecbda29ed9591d52ad7588c8bb3a176 legacy-trunk
+60358 1d71bf475a85f3ac667ef7e3053debae511d85bd legacy-trunk
+60359 2e4dd39bf690563269f515e77406145e24f9a9c0 legacy-trunk
+60360 604aac4337a5c5b134aa95c51c6bbb37347e514a legacy-trunk
+60361 c315b67245f7d54b030a53e24d0504d47ddccf4d legacy-trunk
+60362 a3d5700b1d5a3e0607077b5cfe416522be3f64b2 legacy-trunk
+60363 1ff2bb5187dff92a5423ffc913cb9a2d57592416 legacy-trunk
+60364 85ccc7c15425de8278ad43329f2f2bf409914907 legacy-trunk
+60365 b064e25fb8423419f7799e3ecae35d954f8b60cc legacy-trunk
+60366 561c065e3f2d5fe8efa3c56492e35af1cee57f8e py3k
+60367 0a70f5b30b8ac187a47979465fe42f42ba132e80 legacy-trunk
+60368 22945dbcd0301f8677bf40e128919736b0f116c3 trunk-math
+60369 4725c84b042279b95692d32d1616ceff20f5b9bd py3k
+60370 f7d2360e953de7ce9d739ce826c7fbc34901bff9 legacy-trunk
+60371 afa5993224e5563064eaacc13f02f9b68eb7662f release25-maint
+60372 be3140ec67c8f6308f487a0b3e6cb34f58619a45 legacy-trunk
+60373 79f439d99f8c3b8b1906757edbc313d53ec5d49d release25-maint
+60375 695e5bf3af9c0569214fccd37ae25f6700dfcbef legacy-trunk
+60376 727cc810d690bce8846643721d6c87f111ed5a61 py3k
+60377 f062dda54894f240f98a04854f076034d3264de1 legacy-trunk
+60378 ea3fe302d3920640fc62887506b5a9a63faf1dd4 legacy-trunk
+60379 ebfbaa1051e2d0d78d6cdd219b55901155b78b89 py3k
+60380 5232f07d9c8e3db3892484b27f1fece27e7ab4ab release25-maint
+60381 1c9ac00c475879615bc71c1e3c017c7937876ed2 legacy-trunk
+60382 43caf818cff07291c28537f6d41c7dfeaf497be8 trunk-math
+60383 ef2d3bf8383dcbb256e7a7a86a4727760d24f253 py3k
+60384 f07e6f3297553e7c584a83c7fe7405fd5581395e py3k-ctypes-pep3118
+60385 e614d248bdd10157bff77e4b50dc5cd389565b7e py3k-ctypes-pep3118
+60387 583ace12c5cf131c0e469aaff1f41f37ac9fca95 release25-maint
+60388 15f5b731e00b3815a36a2bbd81ed6df53640edf0 legacy-trunk
+60390 a28d0b14b77deef45c3a7b8a0f54fdfc3db09eb1 py3k
+60391 2c3d497ebfd6dbaafc278064ada3f66cf5b8fb56 trunk-math
+60392 94f18c2deaa5daabe2b221daf5fe276b58b369b1 trunk-math
+60393 0da2ef9fedc032f097bae6af045d06fb8712bcc0 trunk-math
+60394 6ac7d2e9a3bc4025071288b2f672dcbc06063e5e py3k
+60396 ab67260737b1c86e131dae53a6e70d6727e94f3b py3k
+60397 15e8b34254ecfb5f78851c3d6d43d4b7f501ca22 legacy-trunk
+60398 1e583eb71b3fb361979898bc678940b52a1ecf04 legacy-trunk
+60399 77d052ce1f4c7c5d3504c7c199e4befe5d12b2ff legacy-trunk
+60400 756413c0ff1d9aa87e451191ca63c1de83bab5a7 legacy-trunk
+60401 7a6a80e84a8a006e4697f3e2302845681e856196 legacy-trunk
+60402 dc46a67a7b7b70d0117b3f53f2912393b06f4ccd trunk-math
+60403 bd246f33687f7575c49d6e033dd17c220aba8e1c legacy-trunk
+60404 54673f724106eb1fe6e1fd8308451cd2f2091f14 trunk-math
+60405 efea4217a95433ce30cda3dc4a82a155494c6110 legacy-trunk
+60406 418ad159fe843ee47710ce15650534a4d47f922c legacy-trunk
+60407 cc22d3f12b137f7283f9df70c9c5725280a45402 legacy-trunk
+60408 c3b38a85989fc7652322f143ebe3900ac6e37b12 py3k
+60409 86094c467eafb1480cea318fa07fbaf81b25fc6f trunk-math
+60414 e9d3d561dbd1af299ecd50be92de7fe5fc10b2bb trunk-math
+60415 3f9fe271553f16d6116c9e3ba3180e636aa4514b trunk-math
+60416 303cef063c3520ea6d55f4e24ec05c563e1bd92c trunk-math
+60417 b9bdc6a98bea2288b4d3abc03a83377d4422b69c trunk-math
+60418 edd367c22c8fcc4493866128acf841657b7b3056 trunk-math
+60419 3ebaae341c1b123e5d9e543d569f1d4eaa1404a5 trunk-math
+60420 3b4f0c5ecf53fd62c82175bf8936aacd1471618e trunk-math
+60421 29d615dd1d97055f9da52ce4050ed4ee74bc111b trunk-math
+60422 b372c354a28c174752e0614b0ac3282bf5ca40c4 trunk-math
+60423 509cdf6d64795edfd9495044c6d51e263f7d4ed3 trunk-math
+60424 92773d7e653e4c1fe4978838e13b5f4f0113631b trunk-math
+60425 e791bb0adcde8290717b4ad73385930fe756adf2 legacy-trunk
+60427 7ac7e089a06fc9ad4ce1acac12637e58bee078b0 trunk-math
+60428 7166ed498c6d3cbde5d1851cbce9fe32ff22336d py3k-ctypes-pep3118
+60429 cd65ba23a50e7610e40103f3435e5da176bb0cdd trunk-math
+60431 96d0249164fc6526fcfc2b7d300a4ea90aaf6ea6 legacy-trunk
+60432 b7aa8bde7bcf70f48c88dfa04626cea76b55e017 legacy-trunk
+60433 250f29bab61b12c366ab3306f52be49cfdfb3501 legacy-trunk
+60434 90e86ee3684b3c1b58d6e3eec02b00b9b6dc167e py3k
+60437 e9764a6958097a04d893c24f59dfcaf0ee0c1833 py3k
+60438 62909d2e573b974f70d9698aaa6e1a5233f13aaf py3k
+60439 e43238760c387396e079d6e73c0e129f619d0537 py3k
+60440 26278796d4da1319f39383700f547ccd699a8de7 legacy-trunk
+60441 53b90f31efd6e66a280a690e6308d484eeb0896d legacy-trunk
+60442 510a48289d1d688d5181cbfd83d4a9eb8fbd9538 py3k
+60443 c8fca9b5cd3c30dccb5d4dd72ffad41e35f29a5f py3k
+60444 7638d4ae310c21f98008962015e44de048018903 py3k
+60445 bd8d2369f1411b3506b64ec8e252e0e1f8073274 trunk-math
+60446 5ab237c96695df7a0b7be8e677f34f0fe3306460 trunk-math
+60447 afd0cb25c73e2131807b01301d0c65ed37d0ecaf py3k
+60448 9639a73afa477614c0ed36d2a8989c745a539edc legacy-trunk
+60450 c05ee77b39f2dc106dd7aae91b9129e3a820f864 legacy-trunk
+60453 b9ee31a26f385d3cfa94c5bf924fc846e250bf89 py3k
+60463 be06b33957684c44b0955cd4f9d6e7d882c7b45f legacy-trunk
+60464 7d0df5ec3d2f4be7eb364afe3bd952d19012505d legacy-trunk
+60465 e8476aef857c21c10e91543e79990d0a3e625324 release25-maint
+60466 71983603ea999904272451ba3302617c24a6d18c py3k
+60467 3f2496dc91db3f678c78221767785a37cfba9df5 py3k
+60468 8930ff230ee9e463cf4f4d010d65f3dd78ff9f88 py3k
+60469 de7c3097b2c10652e17a86bfda2f804a845d0d73 legacy-trunk
+60470 e77b82aed1a83131ff4353915005f8b512e21952 legacy-trunk
+60471 03e4a36a56bba495e1315cf2fe0a90e76122a008 legacy-trunk
+60476 f380d991390e09f23d1284709ee2b496918b9f7b py3k
+60477 f183f11898248e754efbbe4393121301702b2144 py3k
+60479 d635f29e55f829470f5a2df1a28ce8953c67ef10 trunk-math
+60480 a77c8dcbced910ffd3e2f93d12b82c0a5ac76f48 legacy-trunk
+60481 3aa4b8dfbc4a4cb542ce94f8e4206a8280fe8729 py3k
+60482 8659e52614dadd69e11ba6e3715f57ccc88da73c legacy-trunk
+60483 3f16ac915214ed39e56fe74bfb79ce23dc168643 legacy-trunk
+60484 f0e6bb9b24f68b1ef3dcbb4aaf30e2589c3a5947 legacy-trunk
+60485 a4b84257c7f857f5276d5d501567cbdb926b3cbe py3k
+60486 492b302aded6894872fc3af25adfb966450bd223 legacy-trunk
+60487 678509f9a03f72a1eeb404b55bdb3df789afce39 legacy-trunk
+60488 3164b4ae27c3c1df251aec72c400b721217fa1e3 legacy-trunk
+60489 d7540031b9592173961eeb799736ea6aa529709d py3k
+60491 c66da57b9488980e54055fa961c135d430c61a73 py3k
+60492 38604fa2a48f1fee15b97fe47b6fad2e17bbc078 py3k
+60493 a281e33198c0ae34d1bb1558f3e7e6adb5ccfef0 legacy-trunk
+60495 7cb6e5617da09d89f3e9cf3188a53a789b8b513a py3k
+60497 99ef248fb3153fd0989560a05c8551ce3222974a legacy-trunk
+60498 2b63690d5128597c701cdd39f2b6b3bba5a378a7 py3k
+60500 33bbdc76afb62e145efd62aaece2d925d6bb0cfd legacy-trunk
+60504 3979ae1eea17a7198094b69e0e9f0d2b24da5f96 legacy-trunk
+60507 6492a78e93b4c1ccc1b937f7c776739d89ffacbe legacy-trunk
+60508 faa88ff4cce4d259fab1379279b91b11d68f713a py3k
+60510 bdb70295248bcfc35c7833c0403aef28b845a133 legacy-trunk
+60511 beea73ca2b88e7d68caafd2347bd7c73bc2a6086 legacy-trunk
+60512 5cb8288360e738c3b21a0687c2c94361063af70c legacy-trunk
+60513 d12c97cc746713d47a26732e4ec4b56a3d01128f legacy-trunk
+60514 f4b49efcedc0ee29e4d4fce22651bf4e7e9ac0d8 legacy-trunk
+60515 df5e52e05246fca0e953f4841e9cf15dbe5a0c31 legacy-trunk
+60516 d0b31f24694dbe71b9a73ff423bbdf2295f7bb96 legacy-trunk
+60517 0b4e8afed663124d05b77b0f6d3ad7e404278089 legacy-trunk
+60518 f5e18c9bde701752380ccd692d87c672b570bec3 legacy-trunk
+60519 ce9816f536909b59dea6997b4455162bd001debd legacy-trunk
+60520 4c59a8f79e4281ec255e9949c8d66fdbb1d7f9c3 legacy-trunk
+60521 e2a8b6765ab3fb0c8c5bc6dd14d5d016cca4359b legacy-trunk
+60522 d54d133c6a8db7f76f7809086cf27d6fc4e51ae6 legacy-trunk
+60523 7e2e603f4cbece08528fa6b055970654db2a9e85 py3k
+60524 a3e6f74533d60cd0cbf3b14dca0b54c6022f2df4 py3k
+60525 64091243c07bcec9592d0420deb9d1272c5699fb legacy-trunk
+60526 a81ef63a1009a2994ccbe01d27cbaa409261c2b4 legacy-trunk
+60527 d980f175c88634bdab0009535b781cee67a31a60 legacy-trunk
+60528 6d75be2c3d3e412b353f8669792705503f430c8f legacy-trunk
+60529 660d2989b161cd540ac997cff633dc4d67868882 legacy-trunk
+60530 04653f92664f31d216122cfabd941f92a1de0b6d legacy-trunk
+60531 65b1252c1bc190aaf602c7996f9560dd715c80be legacy-trunk
+60533 f03af601225b1de9e0ac9d2b531e63d6f2b74e5b legacy-trunk
+60534 b2de97eb1f67c7430572ba966fd85eed54612b45 legacy-trunk
+60535 95bbf5613b18f49de52c422b68d6ccae2b0eaa6c legacy-trunk
+60536 aefdcb52406dd71feb7f14559702d47bf8c8481e legacy-trunk
+60537 59d89d61c3a0b30ce90eef3cfb855a7c57411022 legacy-trunk
+60538 c2dcf54e91fd188e61e06e87ec1b966241727cb2 legacy-trunk
+60539 24969405e1aad7f4dd080b569c381958a783a0b6 legacy-trunk
+60540 e5e02898b6c42c117af68c87895c14af6c3d4f6d legacy-trunk
+60541 394091fd1d5335806145bdc7e3afee165b58225d legacy-trunk
+60542 21594c5a061a50e0580522b38a94ebdac277c9f8 legacy-trunk
+60543 f2cded0c1fd77a6b45e9bf6c2fb6415b263130d1 release25-maint
+60544 3ac48cb3402734c629fae775657aed519caecdb8 legacy-trunk
+60545 27ca4700bc6df0ff78b4584b5a62698b217d12b6 release25-maint
+60546 403a7ee5a53eceb6a158decff15149f021399684 legacy-trunk
+60547 6c8c6de44ff75867c02b5822310afee1ff3d8db4 release25-maint
+60548 6e134aa738796952698b0723a112359d9ec74aa4 release25-maint
+60549 b66abf0fd591296e54686857f72e9230790c10a4 legacy-trunk
+60550 5bdc8b599222ba14f7fbadbdce35475be7125485 legacy-trunk
+60551 4ad09565579d7bcf7209ad6bccfae5efe6d5c1ed legacy-trunk
+60552 bdcf40d1b38eb4f4773fc3f3c3486253a2c66232 py3k
+60553 5bc587f90164c5b07acddbc6671c2c88914edda7 legacy-trunk
+60554 eb97e8302fa3106c48436cce045da91de8b5d161 py3k
+60555 4aa6383132980b3e42c1fd01b85a87da383edcc9 legacy-trunk
+60560 4f6f44bc51957e302a324a4f385a739f341ffd22 legacy-trunk
+60563 75039d3118aeead65e37a123d2725fc56f5e2c94 legacy-trunk
+60564 a3fe7485f5c556b3feec5ecbfc8c963dc2f31869 legacy-trunk
+60565 3850d13bf96b7539b5e828aceabddf2ec921d568 legacy-trunk
+60566 f03955faffb474b610da1f55a5bdb7fb4b837a54 legacy-trunk
+60567 8fdd6d62ea55ab74c2be9a67e9c00b57de9c160e legacy-trunk
+60568 cc319a5f503e7406e1dd09859e6d83ea0dc08960 legacy-trunk
+60569 3d7b84daa34a4d4cba59f42f17435f4963a1f24a py3k
+60570 3be4fafd9cc0df377e8ef796a2cf0df725490656 legacy-trunk
+60571 1beb7d293f552c80cb55cd27b4be0a417589d0c1 py3k
+60572 38de0e41d254d746940d8bbdd2395d8b5830dd82 py3k
+60573 f69da3f5721766e1fb1dfa6729668c45aa6bea2a legacy-trunk
+60574 9b67d2595a231b6f892d75949c68e381d201d957 py3k
+60575 643c1397f9540f02ec8bb421e2dbd152e1f5659a legacy-trunk
+60576 9686c4b46243da85c2e53a07f6d7dd6a6c9c6dbc release25-maint
+60577 e61135f7f9bbfab7c5b16602b1c60348166d854c py3k
+60578 cb1e5c37d3d0240e8c5975feb62aa3d0a337c8ef py3k
+60579 86602b603462c816a86622b31b4cdc4a61da3805 release25-maint
+60580 1f87ec991e59deaf45ae6176b75321de48f2005c py3k
+60581 e87bd8ddd01b0a0911e9d60d6afd706551da2f21 release25-maint
+60582 0dfaa92bd5348db48c1ea16b06155a18ba6125fa release25-maint
+60583 e6069b24031eae4a0e7a57fa0da057b52ea09564 py3k
+60584 3f8f86493daae82970b4b998665894b4ce09ffe8 legacy-trunk
+60585 bdf7486893baaa2c71f59647a92bcb60679d53a3 py3k
+60586 646347444faa52cc105da256a5c8a669df014ce4 py3k
+60587 5bda4f76ad92c6751a43a40453b161a59ec4c94f legacy-trunk
+60588 94d980966056fe3ee9059ee4d16e3a6e7f6c8a5b legacy-trunk
+60589 f2f991634781484a43b3b0da706cfcdb9a992b9d release25-maint
+60590 8d89037d5fc1ac20a11756e0d0ce42fae584a852 legacy-trunk
+60591 060f039d2fab545758c0bcbf97d5aa2a4c976cd8 py3k
+60592 cfa280424b650f879ee3087dc075ee72c8ab8ddb legacy-trunk
+60593 b011366102dbab779d7bc5725c7b9ba9f0594ccd legacy-trunk
+60594 4d58c0fa6e343207b5b1890ba50e41b9cae495fb release25-maint
+60595 dac4217e9965a0ea9e23ca8668902cce76003eb6 release25-maint
+60596 d2b49a68e6f7bb0ead26b2ed07119f9988e11c7b legacy-trunk
+60597 5fe557c760a200d6786f0bddc797d2e3bbbe090c py3k
+60598 687437f7b78491692facd710cf00e6e273502935 py3k
+60599 1c2a26686e54401bdf1dc103ecccd3a49fd9cc71 legacy-trunk
+60600 83b5d6b2aa70f3cb35cd9cee3e0a812a76ec92f3 py3k
+60601 01d1a4ffd5b35f9981d47aadcc97d7dc15a9ee98 py3k
+60602 68636ea89153119350f5ff8fbff79fdf1fc737cc legacy-trunk
+60603 8bc1fdc63370d14fb3d2aaf06df392cc9fc927a8 legacy-trunk
+60604 f4c0e53c3561a36b9d6a5b1274bfecb79df109f9 legacy-trunk
+60605 77b371c6958cededd057d3ec64f19cbbfb2adcc7 legacy-trunk
+60607 8fec50a3859f4d1df2a4c7eff2b9785f0853061b py3k
+60608 111cb2ad7af48d651f21457fbe94acebefe7cecb py3k
+60609 3ecd526c35c5671e5d1d1ecdb72ce6c2a7f67d2c py3k
+60610 8ef3c7c00470159af0be07807798d3a3c7828131 py3k
+60611 b65f79e35b08ece4b88bdbe33e8767ea853badc7 py3k
+60612 fdd99291cc45916e9ec23aaf2723a211564a21ea py3k
+60613 1653f5ff3c0014aaf8329164be41437b9c750b99 legacy-trunk
+60614 a4c87c88964831d383f7885dc380a631c6848568 legacy-trunk
+60615 737827b4c5d75f52592b97083fe2bb50c6dec4d6 py3k
+60616 920a7633ae0892251dec12fc8222d1cf4a76ff16 legacy-trunk
+60617 142a11b3057e9af87f263dd072698796f7f4b17a py3k
+60618 b847a9823b2fffaa2544a6036668cd565b5c3388 legacy-trunk
+60619 33b78aafbbb2222c990190eabc894dac26911ea1 release25-maint
+60622 65fb217509425c9e71e7f121b5e10fae91c2a72c legacy-trunk
+60623 0571bc4ab6c2821ba98c26cafa579b29a8f172b3 py3k
+60624 81900a91422bf71218d4df41e94d03655906f461 release25-maint
+60626 0f7c317bbe7f8cdc6fda8ff4e645b08967c34562 legacy-trunk
+60627 0ba31cea6e03b2c923798e7a893b3ab77181b6eb py3k
+60628 dbe3a133b718342abb91af2fd9ff8fdb506341d5 py3k
+60630 f55a4f11914195a3fe807ac42a114505d7b952bc legacy-trunk
+60631 a2126edb207b12840ce04cae3858a14697053292 py3k
+60632 346625ba59032cb744c6522b71f7b0d6527c355c legacy-trunk
+60633 ffe2d0f57efd71cfce6c57149600b9ba31e033de py3k
+60634 d39e1a0e096548235353a08c3528c421083843c8 legacy-trunk
+60635 063d022ac011b85ee86f00d234963d0b24cc1b1b py3k
+60636 3f124975e0995945d4684ae3c0d6c4d0a2b0f1dc legacy-trunk
+60637 3bb3c743f105f710aa8c7333417290a597893108 legacy-trunk
+60638 938ba622aca03cf2de6e48d837863ee778fdedee legacy-trunk
+60639 0958cc46b33f349fcc31f2050f616cd6a23f6bb3 legacy-trunk
+60640 8cbb8aa45ba9a9adb5c695951b8fad287e4e4fb9 legacy-trunk
+60641 feb6dd36d53f33e966302a7fb414f9d502cbf5ab legacy-trunk
+60642 c73a2802b738660d12a39414208ef91f052113c2 legacy-trunk
+60643 e82ab2423aab709c6ac97a648f326b81bb6d112c legacy-trunk
+60644 44e2d9899115d728a4a9a1cf187a182b2b77b1fa legacy-trunk
+60645 7dc9dee099e880da7f1b90118153a0172ed9225d legacy-trunk
+60646 5ac605c0f27ca8d84ba98edd8449f96580f2a12f legacy-trunk
+60648 219f7f2134d48ef9f015b752fdc3d2dcfdda388a legacy-trunk
+60649 deb4873fa0f04c57badeef26622a88309503ff71 legacy-trunk
+60650 7fa4725cce879daeda19110adbcba935b5cdbb67 release25-maint
+60651 2c63f1522bbe4e76ecd3a93f2e51cea807ae8b36 legacy-trunk
+60652 cdd2ea080e2365ddaed66227f0a7098d164f5c40 release25-maint
+60653 4e33fc82e7f3188f59158a5a35914b95ae2f8a4a legacy-trunk
+60654 403f705d58c92f6aa425e94e8c1d1f85b1ad3e95 release25-maint
+60655 381f4a2933b5897014a1e88bb5f92b8c5003e923 legacy-trunk
+60656 5d8feca33315de97b7d3adb199cf3cdc2245e12c py3k
+60657 59a6485bac0231d1cf62ea2519c336e1c369cb0a legacy-trunk
+60660 4e43722fd503e1627c1067427b41b53b22d5822e legacy-trunk
+60661 262263737bce2dcff2baa324d3c688a99bc9013f legacy-trunk
+60662 1c326dea494c2c9eb8700ca8b39c80f97e4bf481 legacy-trunk
+60663 e94af0c7aa12ba2872fb653ef2431ed5fcb93f46 legacy-trunk
+60664 4166945a0cc4ffb76b86b381ac64cdcc3f9b030e release25-maint
+60665 0463f801d7dc50973852d202674e360372ec486c trunk-math
+60667 54dcf806ded63c187d870a392e70005e6a110878 legacy-trunk
+60669 42422cf0208b0aded6caff6d5d786b029822f515 py3k
+60671 eca90b8aa7fdb8e2979dc094f8e6fd7aa4035a9b legacy-trunk
+60672 3fa7fb328d9aa290bf78847cd57959b526d727da trunk-math
+60673 1980d7058627257073d22c48704408500046de4c legacy-trunk
+60674 82d44280c1356ead0540561e1b220e594a29a710 legacy-trunk
+60675 77c5791b7c21017781c7663b4253942f67bf8e3d legacy-trunk
+60676 15bc8e8324207c27e311bfb226647a429ef8a0e5 py3k
+60677 68d31a91fdf3292296355fdeed354376d897102c legacy-trunk
+60678 5950c49f225adea4216035184ad0969c4d2e66c8 py3k
+60679 97b420b2d8d10e0cc522368de7943760fd6d23fe legacy-trunk
+60680 5ba5c4c9a0169661f7d1bd7b4e4a390ec30451e8 py3k
+60681 2a821e001a2b46d3da8104bf8e97293fc1184acc py3k
+60682 8527ed7563d0b4bcf38978c5c69e36ca8596bb94 py3k
+60683 0f3d58f9cd3526dcb6f2b7c8184afdb3a6a0debf py3k
+60684 645938e0eb52b2506bbac759ddeb87498ac5621a legacy-trunk
+60685 24906b792542437ef00f6a317aa9d9d8d0329f47 py3k
+60686 aebd9c4d19edfc1d4910f4c4577ca97dcfd92fb6 py3k
+60687 0159e62b97c55c60497ff136b4a4732981a41ed4 legacy-trunk
+60689 a82157f534a7e299455049cd462aec21546ca2f8 legacy-trunk
+60690 a2bf2a59404a90ef63a4c92b5eafb9329cd9c74d py3k
+60691 4cd1d0474a134e5a8003c5f29393d668d835e537 legacy-trunk
+60695 83821e0f395b4d7c51df541016e51c0d2b9db3d1 legacy-trunk
+60696 329c6b2e11051794bae86cc3b509c29522776634 legacy-trunk
+60698 bc62854ee9c211489c3b8d85e7d3301479b13bd3 py3k
+60699 6260db22ff752f45c48c0b8e7c0cfe4b6a82d23a py3k
+60700 585aea904f0db4dda826a731633a555415d2ca18 trunk-math
+60701 8728f816ca75203e449bea53b9f8b044ce9960b7 legacy-trunk
+60702 8689b67265bfbf36f2651c794541bc36322d25cf legacy-trunk
+60703 61eba8332c145e025ccedc20a6f4d813a0f5e9f3 legacy-trunk
+60704 745280d714255cec470947fc9ba199bf7d57b757 legacy-trunk
+60707 86906a5ceca6348825662c4d39ff00c87458b4c2 legacy-trunk
+60708 2d6f640f708139c810dd440ad8de714beec832b5 py3k
+60709 853c73b029e3e29e76855025caee1033eb5f7415 legacy-trunk
+60710 7f4cef04186f1cbbf5c134062755cffd60dcbca1 legacy-trunk
+60712 4ae0397ef1c5f14d9c427eed57b9f06016dfcc66 legacy-trunk
+60713 6ebe89328b5e73e9621de21c74b7fa9a9e59613d legacy-trunk
+60714 1dc71f08ea7c7c8b9df0805446527d8682da57c2 py3k
+60715 fb551c938a598e93e414242831b41db0281d126d legacy-trunk
+60716 013e66cb36c0fe5b2ab44da72b9c0b90c04634dd legacy-trunk
+60717 fd7789a1bfcda2a65dd34242c29fe30fda4db58e legacy-trunk
+60718 f8ee06a51c0b2f2034dee63604691bf524be4a4b legacy-trunk
+60719 c7f9f9fdcf8271c312112523319473d732ad4edd legacy-trunk
+60720 a8ca9e065d9dee15e95d341a77e99eb8b986de15 py3k
+60721 a50c1fb7d920a81b19aad87e0f02b25d324d3e1e legacy-trunk
+60722 9f1a2c99255ff41c112f4785e638da3cc1a78252 legacy-trunk
+60723 1dc5ca11448cd073087c9f765231b76fafdcee8d legacy-trunk
+60724 dc50dee7f8e52e31ffd03ebdc677016cb6dd6947 trunk-math
+60725 e67050d62adfa46edaeabf60d3b19fc211b05f56 py3k
+60726 3e5a790e0cd65d9e78a58bc08cbf36c9188f2ede trunk-math
+60727 eeef39a6f4dd995af6b330a72449cdf95675f1a4 release25-maint
+60728 4afbcde343edbc3d281a942d385c3317a4433b2c release25-maint
+60729 4565c69420b8cb34a9f139e4e40313b4fcf4a6d2 py3k
+60730 790554ae2b04acb30adc726710b07b91d70dc0fa release25-maint
+60731 c0aa6d8f5cdb420e288e27c669f8791e67d11e57 legacy-trunk
+60732 c2fc318c4fa333d6e80b5c7b4f80749b94a825d2 py3k
+60733 ca0853622f1a1f9b9ac191b8e214d8b791444dbf legacy-trunk
+60734 f85b63f567060418a797b535cdba5c2961dd6dc7 legacy-trunk
+60735 808f84c566f0edad6abb697459e278c3fdd0e2ad legacy-trunk
+60736 85b68d7d6f411eccecab1fe248cbc9f23dafeb0a py3k
+60737 a39fb898beb1ad3da3f61112acff94c7de39fe80 legacy-trunk
+60738 92bd21e6a82c4d2c74f5b2cee512dbad11a68bb3 legacy-trunk
+60739 50762b194a00ad6b15aa1d675da1cee55e670ea5 legacy-trunk
+60740 eeb72cf37aeb4cb48156e4d1cc4fdfb4b11f5fd9 legacy-trunk
+60741 4ca70663a79d09a7f508d0a881b405222ec33340 legacy-trunk
+60742 f0e8b541f11321584f1e4f6219584ed935a7a509 trunk-math
+60743 275ed8593ec61d160ff6aed22d59cbce13c2fe62 legacy-trunk
+60744 ba17b21ab93e6647869f6a8ee705555ace42344d release25-maint
+60745 789aa67dce6d82b21fbf67ed573900ae87072032 legacy-trunk
+60746 5f5b4645d9132b4ba98e68edbd4ab86ca7b60c43 py3k
+60747 8eb8e9a3260d6ee9d0bbd5bc0c626f82936ae594 legacy-trunk
+60748 ae55e714d744d2a02653a0d162a87740f50197c5 release25-maint
+60749 a47f5ffc0823537f725a52897de9e2f290af2b6f legacy-trunk
+60750 27f88597d02b8c1118e505b69015993fbded3d63 py3k
+60751 b1cb6b44b798733376dba89295811e006a6fb604 py3k
+60752 d673d003b6ca81e14d766e678ef6997b3822c5f3 legacy-trunk
+60753 95c000265400907057562414c2ad549ebded29b6 py3k
+60754 d319f40cd000fb84ee4875798cba612b39587819 legacy-trunk
+60755 8f8adec93cf2cbcd6dcd02c595361fb41441f6ae legacy-trunk
+60756 f1205121e848a6233cd8df4548777c36c9fe4c57 py3k
+60758 ceee0981f141d4021cc5532a77188f9772d13811 legacy-trunk
+60761 114dc2158369d876002e3d9edd95b7ebbeb1c460 py3k
+60762 c5205587b2abc067f7f2895b3ee002d4e13f6ddc legacy-trunk
+60763 ae9ecedb4f91c638d516b859a8c52d9e427283d8 py3k
+60764 18c76af4f364885457565c1aa256516633a146c2 release25-maint
+60765 6eb642e0add80cd5f7a87660d3862a575e0aeb19 legacy-trunk
+60766 7edf7225b05f8b2b57617bbebd5136ea9794f156 release25-maint
+60767 beea35b0ed50ad5a1f55960ce50b2d9f8072d7cf legacy-trunk
+60768 b0f380a8b447b4b3ffa4bd5f5d234f7e61343424 legacy-trunk
+60769 f903a643a88b1b51a46837384f949794f11d7c87 py3k
+60770 5f2ea965f853ece1880be0489ff3f8992c850b3d release25-maint
+60771 30b56bebde54adc9d78ca95320babda5aec2d3e8 legacy-trunk
+60772 7372308eb62f9f64d0d5aacf583b00f811e7378a legacy-trunk
+60773 33122ff83405158ebf6b8ec17aca97dfc9da0ecf legacy-trunk
+60774 7d2fbb4e57686a4fe8b737b28ef17b836aa3badd py3k
+60775 608bd1014fbea6fcd3df9f16c41cb1d22b3c05b0 trunk-math
+60776 584fc15d47ac2a70adb6bb895612289612bfdc79 release25-maint
+60777 440e715bb3d2edac60f35c0948a533fc3a5be1ad trunk-math
+60778 d6ef9cb543af5a817ba043cabc59e1324523b072 release25-maint
+60779 685cee1410f8e343f8928dd951003eb95fa9e0d5 release25-maint
+60780 f8fb27106ecc0184f2b6e562aa927d6b5f54d03e release25-maint
+60781 083bf6e0ae5051cb55d6bd742c8d34bfb17804a1 release25-maint
+60782 76b2de9c9b0b7e523da5d3e979b730d34c975909 release25-maint
+60783 1e0ee324c513668434c8822cd92ebd8c1eb0e66b release25-maint
+60784 56786a2deec43b8736ac5feb44d1b71cca38d870 release25-maint
+60785 c7e683d52b3b3e11288d223db62d66d61598e6db legacy-trunk
+60786 4fcb700115d803a9db34c38fe9de08c11a59b15f legacy-trunk
+60787 e70f56cf69722e201692c51047ce6d7a6abbd486 py3k
+60788 68016a0888b968375c0ac9d215306682d1212d72 trunk-math
+60789 095ca9ff0d8eca9c31c95688bb67584ea5fa1e27 trunk-math
+60790 e518e39f4a9e959176d5b0e102c15af7149a6a73 legacy-trunk
+60791 ef7548173e6171e995495cd7b83079358011fde2 legacy-trunk
+60792 0dd05eed63de986779f9522040e96c0f07bb5e5a legacy-trunk
+60793 8cbe0bd93c28b01323a389321b12959120edeca1 release25-maint
+60794 190d55373e5057d3c8a74a64f2ad5923a1e6822b legacy-trunk
+60795 5ad8ae4d784e6acb86bd785c207d733ec46b4263 legacy-trunk
+60796 e22bc8b965473f5817693cd59cb936654dcbabb3 release25-maint
+60797 65ae68c7aca38162ba0488e36f8da098bc1ca21e legacy-trunk
+60798 5c1da7b1b4a6b828dbeb0085e8ce5f19cc6e1e1d legacy-trunk
+60800 0a8aae575cdddbf3d133fcb4eed91080e3fe41f3 release25-maint
+60801 1dc322adbb676402e52f5268d66e34e1075f8e6a release25-maint
+60802 89ec42b298630e88b1b968b53307b9c0546514e4 py3k
+60803 167a9fc8284491cb5cebe125a1d99a2a1cefd436 py3k
+60804 83d2c70443fb72b2d6070eca44445126684ecf7a py3k
+60801 a033617792d19dec4b1dd0a679d754a28152233e release25-maint
+60806 f199de38ad0101377aa40fa827222d00901bec7c py3k
+60801 957020ed3afae9ee4675e3485ba61c7c1bdfda39 release25-maint
+60801 721a5910fbf0d990a4cb235a88629999e3afd0b0 release25-maint
+60809 1ceb2a6c60eeae9d158b5d4b6c4667c73b9d01d3 py3k
+60810 2d9eca0b46fd3f08bbbddeb444afffd820f6c2e3 legacy-trunk
+60811 21836e0b9eb031971d6dadfd01e9afaeb822c1f7 legacy-trunk
+60814 746a8e1a785a5905f803cba725921834a90dcc5f legacy-trunk
+60816 e18cb21f5f5ff074c4c2af4637f60c903b565636 trunk-math
+60819 41dc368688908c3f0d1392370bc659b888179d65 trunk-math
+60822 eec67af4d7dff115b8dde71ef2511868b4faf4a8 legacy-trunk
+60824 10b263a202cad37863f71073718073455a076a46 trunk-math
+60825 cf5a5d732e3ccb2928bf9eb2aab0cec70060c2f4 trunk-math
+60826 f48374b8c1c3d8d3561a39b12f54b2cc94ebc308 trunk-math
+60827 a235673b9f8ea24ba81762604a3d4d20f94faa9e legacy-trunk
+60828 891fb5c3bc182a31745e6cb8fbb1b67f50254fac trunk-math
+60829 b2f3fd9a4c657148d22d6ac0f45f57076b4c1853 trunk-math
+60830 a97689b3e7425e7d38e139e6fc09fde677ac4499 legacy-trunk
+60831 b27de29a2327a6208769fe1f2efcb07ec7559e07 trunk-math
+60832 33221adc0c206e32ff141aa28599e2075d258d00 trunk-math
+60833 4b4321461a9f0287ca7bdc00e54eabc03e335b8f trunk-math
+60834 a573925c91e42ea0ca7b7a1aa6b6182a801dbd99 trunk-math
+60835 3a55c0fd822fb305a9c981937f0b444fcb4dbfae legacy-trunk
+60836 7a355b6b21ac8d64a6c1573c4765f94b6c3ac180 trunk-math
+60837 df51bad867100546ac17023cfb28b152a9b2d42a legacy-trunk
+60838 4504dfcc1924dd5f303e22b5d52ff6095a3f01c6 release25-maint
+60839 3c4d593e153865b7cf6edbf36cc6983dd6bb4628 release25-maint
+60840 915fdacf702da3ab4e1af569b2c91c39d5f68adb legacy-trunk
+60841 557236d752e2d979ee2fe22cd9b8f33bc0f296ca legacy-trunk
+60842 0e2aaa7b9b1fc9bb9e5d9aba5dababca21164328 legacy-trunk
+60843 d8f12bae378ad07e59903518ec81dd7e726c6ca5 legacy-trunk
+60844 166e3ba7de243775ed8951883db5ae0cb15232a5 legacy-trunk
+60845 c44752d90fd2cce40d9b56dd2f4fbe18a25d5475 legacy-trunk
+60850 62df1e339832b6f68f4213d847988c442cac7193 legacy-trunk
+60851 71139b692439bded8182b386edd012d265dbd1c6 legacy-trunk
+60852 9aceb9054b3f9ff2a7099d622210a90f5c15f5c3 trunk-math
+60853 7c4c463421373b52e4e7575ef16f57940028d0b6 py3k
+60854 d37859f29e511a12c47ccc810590308165c77f65 trunk-math
+60855 8c68db86ff87a413bbdad0d5655dfd62dd0b10b5 legacy-trunk
+60856 1a89e91333739507e26e96daaabe0c586338b206 trunk-math
+60857 318ca6bc89a3d5df3c6df5fa7d8fb57889d2895c trunk-math
+60860 f378edd21df26f6229337e10086a4ddc437d31f4 legacy-trunk
+60861 ac095b774e193bf4f879b566b1284ac8b6f5b259 trunk-math
+60871 270fcd2e978268a443286343b4aef6fc411f17eb legacy-trunk
+60872 6550659dbc9db66e0598fcfd2eea827487d3cee6 legacy-trunk
+60873 6212367390e324ac71b719a89749bc8f8c8b43fa legacy-trunk
+60874 1872bd6cf4b45b58ada9e298d39bc3fa8829a526 py3k
+60875 12ff146f59a7071ad8d08575371eb7a1e1b523f4 trunk-math
+60876 93b6157410740c83b6b8214813e40e041e0c5fb9 legacy-trunk
+60877 08cb5abfb5b6a24b18df2f326cec14199bbc35bb legacy-trunk
+60878 cc0232de066c33de6592a5b507382a11776b5c00 legacy-trunk
+60879 b7231bf6bfb7959e2c7add923684341697b80fa1 legacy-trunk
+60880 7af955843929629f6cf39a070cd98dc52be36b37 py3k
+60881 21eb1e6edafaf39e714390a3e2c7cb7e3352732f py3k
+60882 9cc7a86737c9652ff3a53186720ecb0f4b9e7063 legacy-trunk
+60883 3d2ff014657490cb0d1bad75c58b4e758e27aaf4 legacy-trunk
+60884 1bc923a107d956e69e8acb17401a76cd0e1a8c61 legacy-trunk
+60885 0e92ef57c0d4a9ed3f326cce303f1b1541244040 legacy-trunk
+60886 d4b0f127cfcb1e90b5a05f8ab330372c8f33be62 trunk-math
+60887 5087415054f193786ebd9a3d69cd757b34155c5e legacy-trunk
+60891 2efcd7f606f8cd51b2adf3b21ca23abb7a6ae120 legacy-trunk
+60892 bf6b268e77f3c42f0dc85355a937ed457789c4e7 release25-maint
+60893 3fc586307d6693c4d3e28b546ed746cdfeb71fd0 legacy-trunk
+60894 8ece5ca4a785e074df139e975f3dc91e0c758ce0 py3k
+60895 606d4cc5cdb30bbad16cd36157528b318f8ca26b py3k
+60896 27beae21a82c96943d6ad1dd84e7d7ecf73a27fb release25-maint
+60897 bc70e8b89a1c056c6454111ee59ac0e612b028eb py3k
+60898 b0cc7a6da1e032e2bd51c2e13447536e89b5b787 trunk-math
+60899 3ee77959857af3aa1f85afbca949c4d641f6b979 legacy-trunk
+60900 295f37fc621b953c17eb5f6b790194503ba49269 py3k
+60901 f9f479ce50d0ba4df07ed3b987c415ef9754d8d0 legacy-trunk
+60902 15d5776f2703cc08788a5d855fde66105ca1b617 py3k
+60903 9e26c0b23987f5f631c34866965c7edbaef24a9e release25-maint
+60904 c474c927e0360fe22e8eebb52b666f6b90b26d1e trunk-math
+60906 29a66e621dbe3f2d79c353362860269503cd8929 py3k
+60907 2ff51c412e577b545a9bfde32a2a461d1769c3f4 legacy-trunk
+60909 0ea236a71d7773c6f1228192af90ef04c81b303f legacy-trunk
+60910 5d726da21d7543105fbefb47f8bacc5fbc030578 legacy-trunk
+60911 09b167a4018b6da68e20812ebf1a05357e0b6224 release25-maint
+60912 151e7ffc7e89368a060f5ab07d241b9ea7dce2f3 release25-maint
+60913 d12199d602d3ca9ab3df89fd40dbade92810f385 release25-maint
+60914 1d508bbbdb49a2b11629ee186a63928291b08694 release25-maint
+60915 9f428a5e62b31427cc5faf07b774d39d3446d90d release25-maint
+60915 94550165d626822a0bd51d3ed2b603df18aae94d release25-maint
+60918 80ecf67347e9541f1364a2489454abaef39c7c0d legacy-trunk
+60920 1c958fe718e3e0890223a04082947774a122bd51 libffi3-branch
+60921 b5265acbee75cdfe49f2da5787c16cc49442ea78 legacy-trunk
+60922 f6eeea019c1f4ce5d57b9f3cbdbddddca0c13305 libffi3-branch
+60923 8a187f5629594925c15f44715497282564f80ab9 legacy-trunk
+60924 f82bd9ef7d7883c40c7a846264d38e766ff22816 legacy-trunk
+60925 00bdd96ddeda31a323573bb7863ec6b49e444919 legacy-trunk
+60926 9048ce9e37c8effb10bfdb72e5dce029cda148d8 libffi3-branch
+60927 f9e25562b2d1b99e3fa450a637ae17aca703da7f legacy-trunk
+60928 e9bc4fbda19125de73164a2b3954e7e32dc95361 legacy-trunk
+60929 5953f6fc02044951c09c90a2bdcb1af97f1688ec libffi3-branch
+60930 33782ca9f6dcd3331b3947f7db7773a1778dc729 libffi3-branch
+60931 184d1b2275dc876ab5e95e3e520942449ed56bf4 py3k
+60932 7d26230bb76302b26ee1e1cd9e896158ddd4dfff legacy-trunk
+60933 ec0a857e896ddaaa1bb97a8794a5661b99e6e0a3 libffi3-branch
+60934 7be20f48ff670fa86008efa5054567d36c630a87 py3k
+60935 d89d4df967e60c97991886a4a1ececa6f0461ea5 libffi3-branch
+60936 34afe6cb02a158c174e05bd4785209d5c2d71b33 legacy-trunk
+60937 930053c9db1dc3965d806532fcb60d690a8a8641 release25-maint
+60938 c59fd82a56b0333ef60084b864bfabe0e13cf692 legacy-trunk
+60940 e2887dc5bdb5a6ab80daf9cee4c4fdbead44d40a libffi3-branch
+60941 a9e1fdaf413d9ff26b28dfd592345071cc2b98be py3k
+60942 3cc57fd87d0e0e9609d8ec3c7a9236f3be946faa legacy-trunk
+60943 02d4f98a7e132eeee7b3d8dee95a507f22451cfa libffi3-branch
+60944 3bbf96d96639124724c2c8f244d27d4f192853ef libffi3-branch
+60945 6ea6c87a750127eac0a2bc45c5a3a8588fbd8c6c libffi3-branch
+60946 92db69dc8d4b0659742ddd25e1df6a898ee393b8 libffi3-branch
+60947 8eef56e0986cf012152a41b8745972aae167b860 libffi3-branch
+60948 98c3f9a1d366300f5c845bfec8fe72b047ba6434 libffi3-branch
+60949 85c63036ca019125d1b4b8e0828c7e20c253475d libffi3-branch
+60950 f0f8b2001515e05d9359ca380ee6ac7caa6187fb libffi3-branch
+60951 a7f350b3ed249063c36bf80307af1bcd1a2ca60b libffi3-branch
+60952 1b4cfa006be1590910c37e26ef0413a7012283ec libffi3-branch
+60953 37309e33c42c452daf60f42f35fe6ad0bdfbe8fe release25-maint
+60953 45466813def77cb2bbf55485e07624b1c5f78e0f release25-maint
+60955 b887dba2b5e1c1428103d252372323ced0b3333a legacy-trunk
+60956 853af5bbb497b23037165f554959aaed472b6269 legacy-trunk
+60957 bc9fd84afdecceb3c96ace28b67ab62a1744423f legacy-trunk
+60958 ab38d771f56da996adf453e1cf5eaecf4034febb legacy-trunk
+60959 d46627730a2a303eea9f0fdfefac7c68bde4a7f8 py3k
+60960 427b54c7ee252d644625ac28c40fe6e569cb3693 libffi3-branch
+60961 6d6a293fbaf3b5108d5f8dc07f3deda683be27b4 libffi3-branch
+60962 4a9522fd75a6e2ab5765ac6b822dae2c69601593 legacy-trunk
+60963 091b27876a1b864e1f9040480b290f360e3ed240 py3k
+60964 42b3b117391dcb52cb6bd102bbce4dbdb077eafc py3k
+60965 67a9d3385851380e0de93b73185349f2094158c1 legacy-trunk
+60966 7c51e1d14c8c59d9c6056ea0013d182ac5866521 libffi3-branch
+60967 6a6ca5e579f66e3e740031c069975dd4c9024125 libffi3-branch
+60968 079e21f593193ad783de5b150bb323412fa797e3 legacy-trunk
+60969 11a73fbbf86f2df3980578bd642436fb355a430e legacy-trunk
+60970 8eb59833123157085a8b30a2144fddeb77e30c46 legacy-trunk
+60971 1c72a73821336b1d6d33fada4af03ad1bee940b4 py3k
+60972 147b48b3bc234e68069f5b3ec1e47bac3c5bee5e legacy-trunk
+60973 900347f702584bb627351614cce2bfe60b9a6e27 legacy-trunk
+60974 ca5f2f9606174c36519364219d1fad06558e75a1 legacy-trunk
+60975 96a34eef89a3d1dbfe245145188b8080ab9cc77e legacy-trunk
+60976 dda92a097e8c6f6d2260bfede23d5c456201ddc9 legacy-trunk
+60977 5e0772ed20d1d68a956502152c60ab932fdd49da py3k
+60978 393822f2ef901c3655d84b2bf8405e3eab4c85eb legacy-trunk
+60979 f1b50aa5d5af483aa263aa97dca1a93ce713ece8 py3k
+60980 734fc0a19657d5f0f2a84bad915b053166694e2b legacy-trunk
+60981 7a8de2a7b1a56bdf222fe6f1466073a1eb14ee7b py3k
+60982 8f994d697747550d126a5eef2ba87b9c6431d807 legacy-trunk
+60983 3657c27ea2fd2b9a57473fed59273f62cb3796f1 legacy-trunk
+60984 930b2802c037b935549e3a37f0807225f1b679b2 legacy-trunk
+60985 d7e232e9f1a1ee15c2b3f8592f7b7c512496fc27 legacy-trunk
+60987 1b19a57145a5b2f5a66f6c385e4a478a0730f2fe legacy-trunk
+60988 97713956c1b0df3aed788ae214e8e83cc4b01a23 legacy-trunk
+60989 ba359b6c33c3815641ea91b02796d5cd552d7099 legacy-trunk
+60990 9f03788763e09a0901370c725a3b35710f745eb4 legacy-trunk
+60991 1cc47e129ff47f4ea6d4d64f2bd580bfe64c8de8 legacy-trunk
+60992 58c3f34396708adf3417cdf6dbd2f755896b5ed4 py3k
+60993 2c5d916bd11c9a9e11465cb95b7dd0c00c73c832 py3k
+60994 42985ebbfc45309b69404f432e2caad829748987 legacy-trunk
+60995 e84ad2a258a4694942f91471d8cbbfa413dec021 legacy-trunk
+60996 974cff3e0021621ae4ab48cf0ea79e90ecfff6cf release25-maint
+60997 130fbfb16036af4688012d6bf5b898a414f620e1 release25-maint
+60998 748af0b83674cc1c1fe0fc5efc9d95e9d1c6b6d2 release25-maint
+60999 ec7f0873b664df4636ed31b7bede0e031a00648e release25-maint
+61000 1d84bf5f94786a846c08028f99b6c3b827acf463 legacy-trunk
+61001 47a58ca3e10eb7027d0cc994e3b1add657fb94be legacy-trunk
+61002 3915d5f650fa9de07abb71d2612c861c12a6e46f legacy-trunk
+61003 7dd2c1746267d2ece179281535ab0feaa9ad6420 py3k
+61004 6ba5308f7ba4165b8fe20d99ee9bb53e30226230 legacy-trunk
+61006 eec4c1e9e9cc88fed61238ccf4e3feb16aeb5671 legacy-trunk
+61007 6a13fecaf2dfb26c4b10065140ec108b4c077670 release25-maint
+61008 4eb5a667c882b5a4e2741808e7f6c040f6f5ba64 legacy-trunk
+61009 80e0a2930c6d5985e54847f2ac4b732e0e41a362 release25-maint
+61011 241cf81a0508797fcc5d9b5b01accc4788ab353a legacy-trunk
+61013 9f183ae3458bfb8a93173c3f42677f79c4d962f2 legacy-trunk
+61016 40d269d6da9c58307c3aa477a5240896a795ed23 release25-maint
+61017 a01213a5425d1c4051eca2ed789dd644b532833a legacy-trunk
+61018 6693043d27fd3297ca9fd91e9c3fe8b62f7ff361 legacy-trunk
+61019 810bd67738636ec859c6f5029317d679f10b04f9 legacy-trunk
+61020 19d852942dddd22c109fc686f48d2db21ae5eacf legacy-trunk
+61021 8531f88b578e20a42976e3356ae1ebfb070478df legacy-trunk
+61024 30578e04d35cdc0c8615a8777bf614c6bb0c58d2 legacy-trunk
+61025 27bab3989f6353cd72b3d7f3e032c08943469887 legacy-trunk
+61027 813c146858f78e128b1141f81b64580c1623eb1e legacy-trunk
+61028 c126bd9b505bf86b81eabe479cef6cb2107d2bae legacy-trunk
+61029 6a992b6680b1b76455ce0e2113ce4039bd8a74db legacy-trunk
+61030 1b0eb76ef72abd9082a09514e879187fcaa85ca0 release25-maint
+61032 9b115c5e91152b0723ffde95b9b5812b18c02ba5 legacy-trunk
+61033 97a1972b672e7b5b535ab03fef882f1f1f83766d legacy-trunk
+61034 21a5e9a5483a52240b51b62bdf91b56412f35ac0 legacy-trunk
+61035 7efa4d1bced38c30c5799d57126fc4ebf5832ae6 legacy-trunk
+61036 48488fa50729e4f0ba005a5e2b3360037968028c py3k
+61037 002a5ac792b1e6a7f9967ca10234f82d62d9d677 legacy-trunk
+61038 eaa8c1939108e01d14dfe0027ae5bf0d3e3fa790 py3k
+61039 8c7ba0ed8443b51372f9c79be9d3d52edd0da966 legacy-trunk
+61040 18fed14b06b60664fc2fd20fc315abe69b4faa77 legacy-trunk
+61041 c03aff6d07f53b106c62c6295f90ce5b56be1837 legacy-trunk
+61046 d89fe1d2fadd82a0cc836128c1a9034d40c9884b legacy-trunk
+61048 ade7ac88d2d09e20e621b62119d8a71d06d58e51 legacy-trunk
+61049 af928ff0c5c69d1c583a1d69e8314c0b8f7d457b legacy-trunk
+61050 1b6fb569963457840ae97837f033ac41ad1802c7 py3k
+61051 bf8ee593cbad03c724e5e496a0deddf7dc315b77 legacy-trunk
+61052 55eefb43ef6f3ad1a01177edad02c31656f45775 legacy-trunk
+61054 a77e1cf7ed25262a9cf35347fd86c302738cd460 legacy-trunk
+61055 b0fde93661ce8751edfc6bb39ccfc3a4b5fd78f6 py3k
+61056 09c9ceecdd56d04bf237191cd1486d476d68c3ab py3k
+61057 7129372f533f41b3741526af8264995a8c8954e8 legacy-trunk
+61058 dc5b0107294c0dc4f7d68953fe52711101d5ac89 legacy-trunk
+61059 e57ffa2b5d07f0125d6c789f4b514df958fbf6ea legacy-trunk
+61060 b298cb4975d2dfdc010ebdea08c7c3e8f0ec26a4 legacy-trunk
+61061 fce5af5ce16a6d70f01065599ad3cb6ba823451f py3k
+61062 8b52ff41e0e2796330db4e6c3de2ba8790b497ed py3k
+61063 f88bebeeb673e98608480ef19296c771ff435d06 legacy-trunk
+61064 3a6ca89ef76d47425add3d4951d4c9923afa166d legacy-trunk
+61065 17c8ec889ff42b0cf2421b55e5571f59d2a378b3 legacy-trunk
+61066 c5e77e0f2f32ffaf42c75a74ddca1e74f3e01172 py3k
+61067 144e84672ef936d9708015fd725234332aacdfe0 legacy-trunk
+61069 4289c4104279036efb862d22492080c683daf42f legacy-trunk
+61071 f6dc08ad564b1c696e67a3fb4230c39b6b87cc9c legacy-trunk
+61072 4f639af58a190c098b665a37b1de05bb46d890f3 legacy-trunk
+61073 e81e45f8002e8c09a3cf1071276ca0762e0377f4 legacy-trunk
+61074 45fc3ecb3023ed80c9759018b2b92efe7a101d3d legacy-trunk
+61075 9b381ed1db14332e414f9794226b2254b66aa4f0 legacy-trunk
+61076 624ae87f1c961fd91f5a155fba689c3d64efd125 legacy-trunk
+61077 088dfc0f71b4980cb8e2953065a0ea477f8989d0 legacy-trunk
+61078 4ae43314b74628f9f9cbec737a7ef941666b30c4 legacy-trunk
+61079 bf1ab3bf799c86368388c29a8cb12f4b78dd6946 legacy-trunk
+61080 cacd7ba11b7758c18929602ff2e0cfb6bcf3cf37 legacy-trunk
+61081 2b367250b0cd335917b320254ee98853634acbe3 legacy-trunk
+61082 fe7394bc79d63e2352398f12409404421996aafa legacy-trunk
+61083 7afef8f43e4a52e08018d6c9cc01422880371015 py3k
+61084 c57cb2f8c35052c546462880c6a7930e5a229911 legacy-trunk
+61085 d1323fcf3aa17953dc024c652fb20b6e7c0940d4 py3k
+61086 f33f66a2082fbf326ff74e62f4bf244e00173098 legacy-trunk
+61087 ffdd31f1cd2094d26b8b0c0ab4f86b5509e67391 legacy-trunk
+61088 ca45eb71f2d2ba31ecd2afb2b2ff5debbf135e0c legacy-trunk
+61089 e425dda4f630060df6ae82aafe951602d15326c1 legacy-trunk
+61090 f2f33db589200bec3bd3b79692809054c7e1292f legacy-trunk
+61091 7d7347dd94e877d7699d67de7c92e5fd2e6f4fab legacy-trunk
+61093 f7884164f0889beb6120c1e2666fb53a67e4467b libffi3-branch
+61094 2c93183b8a3c269446c534f05abc2994945e902b libffi3-branch
+61095 6c4612255f6052c2aaa49c817d2a786002f7c660 libffi3-branch
+61096 b78c3a4371d51110a375468d704e60d2b51648e0 libffi3-branch
+61097 d17690c507666838c6cb9f7b3a3c6428050a9a20 libffi3-branch
+61098 6592e5a90c2cd84f210fd9f66da2a748f484b51e legacy-trunk
+61099 8aaf1495da3959cd844cb5a6dd16f3e29a363014 legacy-trunk
+61100 3e435a211356968d7e40eb231b9e6b5a5eb133a3 legacy-trunk
+61101 d4434f03b97022b275f0456ba03662af03ae84db legacy-trunk
+61102 96d5a157316e351809277d83e46293fd4e78b58e legacy-trunk
+61103 8c3c5b4eef55571939856b3317a2062511b6819d py3k
+61104 8dd30fe11a4b34d1077be808f2e0f14adb84344b py3k
+61105 1188ede15735b9b869910cc46f87d57c197ec6f5 legacy-trunk
+61106 cc220745e4e593e6c36b6f6df2f74a540cd82e3e legacy-trunk
+61107 504b4357bddd38e73a3ceea626d2990300412e33 legacy-trunk
+61108 2d2b0e155f198fbc6f607f1c8293b8e8a6098567 legacy-trunk
+61109 bf3fa37fe79cd038c2ed3fb642cb56446cc79499 legacy-trunk
+61110 0cb481956452fc5f5c101ee3f2408c99655aaa8d py3k
+61111 24254430e89a0c8e05d75d98f80d6be326ba6e66 trunk-math
+61112 0128ce77354f60526db8dc87ee5076934b3ba4c2 py3k
+61113 710d525b054c81eb2ce7b62eac49a216f4df088f legacy-trunk
+61114 c38dcb7d94a6da9bdfcab8f47f943e53728d25f5 py3k
+61115 e4ffe64995481a97105b9300b89efd7ccec6f5b9 py3k
+61116 59762d6714a313b95d92d5b3df67a635a2b00e1a legacy-trunk
+61117 972fc7d7cb726978c2855026c4428b71e7415101 py3k
+61118 43e084847e53323401e8cf7c2d028c268ccf8028 legacy-trunk
+61119 7da36b49c9e5aae2f8505d3ec06b36b610daada2 legacy-trunk
+61120 c546523667728c95707dd385ce0ab27806b5e313 py3k
+61121 dbf1ddc5f47953794745f6fc9fde2e5429dae0f3 py3k
+61123 bce4c40df7df74efd87fee29209eb1ce336f1943 legacy-trunk
+61124 10962b3f77a9b381b631816acb16a8fc49cd6595 legacy-trunk
+61125 facf01f15b1535559c2ba05c4f5aa72046b88f1c legacy-trunk
+61126 937a3c5af69192b8ed18f4e7aef6c1e59ecd0db8 py3k
+61127 8cd984c17dec85ac0739185d0ecce7d0e49fc58c py3k
+61128 b269c2d03fd2d6a2708ecf6630b7fea21925ba98 legacy-trunk
+61132 0940713b6726ca26f3bd9e6ff45c0e87bf5d0f7e legacy-trunk
+61133 05c396191e43291f760bc20293793f6a94fe3b57 legacy-trunk
+61135 4a9588b1e4b95df13bd5108eba347c061efe2314 legacy-trunk
+61136 89cfb38a4b98623ca05526d6ab922607ed08ee0f legacy-trunk
+61137 207ca0a8afd00230abb5ece2477d68fb730b2a40 py3k
+61138 ca11cf24eb855f5c86cc1c40f047b465cbe7e48a legacy-trunk
+61139 67d4048668462094edf3ece756f4029a62fd5075 legacy-trunk
+61140 02a01e578d6c5a0be34378306660c3fcc4d59c63 py3k
+61141 b7ee9074ca0eb3b77effd2b231b3091679160ea0 legacy-trunk
+61142 fc6f90545cb48e5cef5f6ecbb10fe6eccdcd797c py3k
+61143 0023c04228e6b353305d5cadaa8fe65918318106 legacy-trunk
+61144 8946e27a4563bc2d3db29e460f98c181ade75df2 legacy-trunk
+61145 9b8fc405f9b04fc511a6c238111994e812285c44 py3k
+61146 9ad542ea05ba1da9b0061e2ee92e8c9507f40663 legacy-trunk
+61147 44d10d39092c65ec2febccae726c862ff4b87547 legacy-trunk
+61148 6a04dbb0d14b49d15f30da3f77d39f5f64a09e66 legacy-trunk
+61149 3127956f3b33e7d1dfa2f5e2721558688c955bb2 legacy-trunk
+61150 a8fbd92714a9a9c47227b8f26e876f44ee82607d legacy-trunk
+61151 2d0bd095c420b0711000d9be66848f6cfd972b3b legacy-trunk
+61152 0adfba8ae95713c4e0d72f15d0896dafbfa6b8d4 legacy-trunk
+61153 82c3b0b5aa9258d88e17f97d15f08f072f48e7e3 py3k
+61154 c09db78bd066ccb12d158789dbdf3498a613893a py3k
+61155 cc5543b5610b2d065284446684969ded9ef65f43 py3k
+61156 0e0169b0eacc6ddf8068d5c7cd18473a7c30b9d9 py3k
+61157 5ba06690c184799b05c5db60110e23fa8c70a538 legacy-trunk
+61158 df15827f34881b9af0936350813ced5c123c8230 py3k
+61159 362a46e7c33a2a6af67a797430fd64fb9057666a py3k
+61161 20a42674b11104ab985869a1dbe74d160e5f54d3 py3k
+61163 cd15a5e9c1de59bbefda7f6ff85f46120056d3f4 trunk-math
+61164 c125c61e06a86067320b526d801fa9f7cebcdf55 trunk-math
+61165 70c41bd680b5e7cb01a4256bece9b324ea64d080 legacy-trunk
+61166 3439fa215faec0ae18cb284394f1cc504595dbea legacy-trunk
+61167 5b7078eccee83697f5441742df8e9adc54e7cc82 legacy-trunk
+61168 a62f95a4adfc5e2ad2636e07649bbc77a4075501 legacy-trunk
+61170 4060db126ecf36c505428c24dc6db54f1d57ac59 legacy-trunk
+61171 8bbe531fcd3c8ca71f5b41d126b38de1c7caee4d legacy-trunk
+61172 f72b2de997b9927885a94c739c9ac9781b287fbd legacy-trunk
+61173 96ca8c7cedc4d031ebb208e5ada9318e608ca628 legacy-trunk
+61174 7628cb403c53e1a36ae3d2f948b1715596a66365 legacy-trunk
+61175 bbdf06a86a243298b21074e9ae53caccac084c31 legacy-trunk
+61176 0a8eecac5ad1dc9347de4cab4725b81611f05fea legacy-trunk
+61177 f653c0b8916b8e565b70766d91a3f2250d4e6688 legacy-trunk
+61178 47328d76e8abbd17631ed66805b752e8fc15a3b8 release23-maint
+61179 54f1cb8a81f66025c7ef126e8e7e44eb40356d32 release24-maint
+61180 0565130d7d9f64c0df440e5c215f2a4de83460cc release24-maint
+61181 1f7d628c70a9aefe762c2c32210876faf8d64c78 release24-maint
+61182 7a1fc61d5c3e45f3a2215d42ca856861a180d119 release24-maint
+61183 5ccb6eb202ff21c0180047555eca669bb926ce17 legacy-trunk
+61184 88c1e17ceffcf3593fb1b5b0d61746aec0ae981c release23-maint
+61185 893c7bd4a92bd889a85e691f49188c37b0a72357 release23-maint
+61186 56681d5bee70930bc4cd81c2891fce4c30ea670a release23-maint
+61187 4d71301a6d4b7fa978e0de2cf0ab271a14eae26b py3k
+61188 a31b650515cb9ca41c57c15d4bdb73bc138edcf0 py3k
+61189 cf3a80f1da7d07a034fe4713f048f3798e6a49e1 legacy-trunk
+61190 6068b75ec27a0f19c7202c80e080de7fe3d9f4a2 legacy-trunk
+61191 44ad78fe35fab1317cfcd03187f4768511af1e68 py3k
+61192 b932f035fb3ef436dab00621b53e7f313fd00fe2 legacy-trunk
+61193 24f4230baebe7dfc6cb3769fe979b31da69176a7 py3k
+61194 c6d9a34f024fdba466a92279e3f1156c2917de22 legacy-trunk
+61195 2c73c5833f2005ae9f56dccbc5f9d209a3205f2b legacy-trunk
+61196 7e4b753afec6e1794e37ac8edc643251e435d2a1 py3k
+61198 a55136c78b6041d3ee6f505fe11d5e9ab455bfff legacy-trunk
+61199 a18a424c2bd34e787f92338716d82d7d48e90705 legacy-trunk
+61203 41a707744bc898dca3dfb0d4b5772f5223151ff1 legacy-trunk
+61204 6282dfd5dc494f4091ba3285295b69a3beb4732c legacy-trunk
+61205 882eba1451198d5a0ffd81bf2178ff17adf87b33 py3k
+61206 25406b3ff97a6fd25dd5511dd505e319b28e4a89 py3k
+61207 65ef608dd66cb04320b5c271cf5705cd99b0e43f legacy-trunk
+61208 e99e1d8b807770ee8be6b1ab351645030d270d93 py3k
+61209 c518f39473fd0b9003d83801522365befbc52bac legacy-trunk
+61210 a154f19825928cbaf1f2fc432789bde3f2e7a40e legacy-trunk
+61211 072392ed4ea691391771f4095d39786fd087559e legacy-trunk
+61212 840138e24980c8997463c3d86643140000bd0ac1 legacy-trunk
+61213 2d551d046022e1b74866a65542379be92fbd3bb7 legacy-trunk
+61214 4d361f01641cb611ab3fa903c0ef348cc6fa3944 legacy-trunk
+61217 91d7572e35a1cd010ea014bd38d467a7c0228c79 legacy-trunk
+61218 d7e4c63ebcad07be6b2bc18e03c25ed1c3264a24 legacy-trunk
+61219 5489af686408c1ec072ba0b896bf331b12ed2de1 legacy-trunk
+61220 3fc09ccf014185d2cb4cef1c5ae3509619650f87 legacy-trunk
+61221 0e224aa219a21b7fa225da13b15e71014c094028 legacy-trunk
+61222 f3eb457e96a75c3f977e570b25e31bd812de5f0e legacy-trunk
+61224 e44c745bec0badb79016eacd0ca6b2f3cfe810af legacy-trunk
+61225 4ea36c012a2de522742121d49326529c98c0fb19 legacy-trunk
+61226 dd016a6ddcc5a9028f05ba517add37794794ba9f legacy-trunk
+61230 97bea39236a93b69c44f91bda94267136262ce58 libffi3-branch
+61231 2d4253015f5840a14cb4daadd7707908ba592c30 libffi3-branch
+61232 96aa6d027e2e7691816e49b304d9758281421cb3 libffi3-branch
+61233 5546dc4a426aaa6699b4c77bd21acde67bbc537f legacy-trunk
+61234 d387b01dbc1c9daaf9066b11682e7c95f53333b0 legacy-trunk
+61235 91ca9549906acabc9aa657e41f6c25e025dc47be legacy-trunk
+61236 495700ee33456f764cec1c145295268f13682b54 legacy-trunk
+61237 8a5c75efae4c20be9a7419b8db10ae1ec2566f0f legacy-trunk
+61238 dd318c3f6cb79a74959bf6a2f5351ac2f4f144dd py3k
+61239 00cb0a35fb49b2fc97f6c74cbf3c74ca2516dad5 legacy-trunk
+61240 ff3e9aeaa69235b89259205eea3166e7c1e63138 legacy-trunk
+61241 30fa6777096f2102ed7d4ccc8762addb364ea645 legacy-trunk
+61242 11e9e3667b365cded77e8c176ec29a921cb082c7 legacy-trunk
+61243 beab9e10a18bde978f426f90c8f89a8e09082b62 legacy-trunk
+61244 9960fd2f5ea94085aee699bcad980c50455af9ef legacy-trunk
+61245 1a68ece1547ab47f7297cdfbe863afd6dcdab5a5 legacy-trunk
+61246 234401add2998fbfa5457848c5f49852b323e4fb legacy-trunk
+61247 c9d66bdbcccd44a359c5bb8383b4e2adb5c81de5 legacy-trunk
+61248 43610512544591f78e87e1d070feb7237536af30 legacy-trunk
+61249 f5246911c903f0c3fee1f54fa8e910be135f0b9f legacy-trunk
+61252 0cd4ad1c9153ea8a141658b51527c54813c23bb1 legacy-trunk
+61253 d41a4206405c135ff0d5d291eab6fe4e169467df legacy-trunk
+61254 2216b100b2d2edefd23feadaf56c1eefb8ea6b08 legacy-trunk
+61255 42889b1a7dc255dd8050cf93080db86bdadf1518 legacy-trunk
+61256 c197e18449b404f953a569755c80ad1d0962fa61 legacy-trunk
+61257 eefc604ad935ab84306116d996e58863145d4767 legacy-trunk
+61260 d0be2c36cbf8d799220ef900e58df975ebe11421 legacy-trunk
+61261 7395ed0f0f7f7743969bb97fa6274854998eab67 legacy-trunk
+61262 9b04941673f173f214c7492322576981387d9c2a legacy-trunk
+61263 ef893390487bafd01e88afc8e3dea48cd4ec79f0 legacy-trunk
+61264 61d22701a5e5eb626ad7dd09ff0610a45cffdbe6 legacy-trunk
+61265 b262bece1323cc3e911cd01c19fde41f20a0484e release25-maint
+61266 b8ef71b0144610768a584cd14861430d9be95330 release25-maint
+61267 4c47993afb1b1230dcaf9d30753b6eb16b8ee317 py3k
+61268 0b8b3e663e3a15c7647ec1837b1a76f514bbbd1d release25-maint
+61269 065c4a76ac01f15ca4f3bb343018c03b240b2baa legacy-trunk
+61270 15746bf4a0a63c49909383276a9aa1cf4e946371 legacy-trunk
+61271 a4c265565cb6b67746c6c4dd225316e7749bd641 legacy-trunk
+61272 3980313d9b8b27c0e22370cf21c8b460371522dd legacy-trunk
+61273 36fef99af18d12143d368cda8e1810114a698016 legacy-trunk
+61274 e9be6aeb4df0621fb29218e5344ee68b1cf77bd5 legacy-trunk
+61275 898dc0f8ab635af7e86fa229fcc181331e7bcda0 legacy-trunk
+61276 17b2ea0afa611888281a0f249b0c6eb10135c8e6 release25-maint
+61278 af267e54bf1dde8d8b67df029f0799ead07e8483 legacy-trunk
+61279 bbab8f64f8d62c569c6d3c801f18c933bd40872e legacy-trunk
+61280 9ecb03ef1c624197b52396c76c5f116dc5850335 py3k
+61281 485b21954746097b25052224ce49e1618ee0d155 py3k
+61285 44aa59f8591daa6e774da8c6afbc5286d2ce5b96 legacy-trunk
+61286 0be9b1cf1b1621167bdaa2f78570d8cbae45bd82 legacy-trunk
+61287 7122fa65697b8a73e610db486813a03e96a32ad8 release25-maint
+61288 5f49b569dedf114c5fecbab5cd602f9e2a859a8b legacy-trunk
+61289 a8754c0db53f50313f5dfc4178ee6e27f4947fdf legacy-trunk
+61290 343597c7d682b3552580352deddd0cdb36978a04 legacy-trunk
+61293 9bbe55f9867ee94854e345f9af787fcde91445f7 release25-maint
+61298 391de143226fd7b37796bc978ff3f78f05b08919 legacy-trunk
+61299 f86fa5feaf314dfa97b060b01ba2367423378477 release25-maint
+61303 9cf70729c23f2088bb5030b090939b35bd22deae legacy-trunk
+61304 37aa416b4c47b4ef5f9f093ac8687574230a14ba legacy-trunk
+61305 e5aadc05f6f51ecd5bd06f762afb16e013721f90 legacy-trunk
+61306 45050d376d57fb86f804245fbfc068ef6ff9149c py3k
+61307 c27aabae06fdc75b228f68d3d93f104fd3a232d0 py3k
+61308 9a727c9f9baa257864d53a67e2d3a0021a997bca py3k
+61309 af44cef1cdf5a55c93fd9f1792db0a9ba892e5b7 py3k
+61310 c830616bd2fc931053c417943f14e94f4f2536d9 py3k
+61311 94053b27a352590ac20d66bf5d8e6eed411158c1 py3k
+61312 506547822b8d01022da65500e4b61ca7fe96d52b legacy-trunk
+61313 15842094b089a2c78b5025c6c7ed8d8cd9aab62e legacy-trunk
+61314 8bab418cc8793b8c0086a0027aa818e5a827248a legacy-trunk
+61317 5b4239c1f8f82f609f8880a434c139c1d5962e23 legacy-trunk
+61329 7f23b804e94c04ac4fb75e165729c4df36736efb legacy-trunk
+61330 66070fdbf0b9307730c75d19b7c12b59911e589a legacy-trunk
+61332 6f195755f144e802dc1d8f72516dd0aa1eb8972f legacy-trunk
+61339 456ceec65357c16657b0adbbbcfe2720af07ab05 py3k
+61340 aeaa303147eeb23f4c0b480316ec364e412689a6 py3k
+61344 b9d6f870bfb168c5fc36cdecc70a19583072c559 legacy-trunk
+61345 d8df4aa06261de5e4c0aa051e448697d4791e437 release24-maint
+61346 2022943ad450c41d64708fb5caca2d2672b5b8f8 release23-maint
+61347 5d764d518f65ebb9108569727a7c88b320c27eb8 release23-maint
+61348 e8572d9ac85ef3d3e4c00c4ed8f1ca7a6aed99de release24-maint
+61349 f7c3658c71c3d6c32039825073275f5d783aa403 release25-maint
+61350 162c6952ea34d4e71f5f9997fd80a1b68839a2fd legacy-trunk
+61351 ce5f6fd579132f4b950b0955adcf4eb818407be9 legacy-trunk
+61352 7f4e6021bc9f6094fe2a0d6a750b0a6ea7c0ee04 py3k
+61356 e09bc1c5295bc19845a0f354da2e83066feb8ee6 py3k
+61357 7adaab64eb72e47e57fbb4ccbaf8703d0c2f5812 py3k
+61358 7752a57f9c490d31f0f3af8c612155368e39dbd1 py3k
+61359 e446910c9d437f4d4a030ab0144adbd11afa24ba py3k
+61360 740b5808c57ae7b3d4c793bade511cfaf9f52fed py3k
+61361 42a6aad39e5ce9bd45fbda3f7f69918b7d683536 py3k
+61362 7b95c57b5821bfac27ee6b15e4616ae390c1e3cb py3k
+61363 986338eb0c0de528625d45b9fa51c3efc8b907a3 legacy-trunk
+61364 7431f3faa3568a42e1ed443fa6d35b79a9aa941b legacy-trunk
+61365 9395a22a966a94ca088b5c4a7d591244f4b26d50 legacy-trunk
+61366 011d79af05ea913fcbf733d5e1ef24d6bf2af9ec legacy-trunk
+61367 d5024ee9e88a31b1b6c74448421e13ad6802343b legacy-trunk
+61368 d72d527de71196565af735f2a847f48897547a7d legacy-trunk
+61369 cbb9e2f4b20283aca3354a89cdf846fb271651aa legacy-trunk
+61370 db5b321edcbb2c1f93ea0ec141f8b56763fc6dd7 legacy-trunk
+61371 6a33d4f6f16f7827e6e2f1ef4e70733aab614da9 legacy-trunk
+61372 543e8dde361f8a61c216e774ac4ffe746c751cbc legacy-trunk
+61373 49dc9af90b3d1f29dedb5baec3874d362696ba4c legacy-trunk
+61374 66341bed82b3053ffe66ce81a4f19258e04c0f9a legacy-trunk
+61375 d97bbad9a35eeee20371c241c64cfd8ddfb108aa legacy-trunk
+61376 bc813265e2c6533c550ccefbfe7326f1ef8ea355 legacy-trunk
+61377 e2e542fdacd09deb8ada35f63f77bffa748f807b py3k
+61378 f6b3cf2f33311fce7151b61f7c6d8d1db713e924 legacy-trunk
+61379 7c78ea707219ee4d00e64635ccda1ad2719fb4d8 legacy-trunk
+61380 e7aa9b5f21b50d28d85d0674abc85734c8b0f5ef trunk-math
+61381 5373751ad4b410b8277f514cf24c2f537fcfe2c3 trunk-math
+61382 0e0c1498be1a80f86b99474b5ce2abfd33deb3bd legacy-trunk
+61383 354e377c9590244abe07a9792a8aa02c7c6c1a63 legacy-trunk
+61386 16580dc14294e9223984ea91240c89c15258f8e8 py3k
+61387 0053fc9f5a1f6e70586448c8e92e54df9d0c575f legacy-trunk
+61388 9c8909ee571f4c505f511d5d1a37b6fda553f5b9 legacy-trunk
+61392 b940b1ad9a3aa219a21a948b1217f1dd0e060fae legacy-trunk
+61395 c07c5c7a914ee31f9d70c44ba0eff640142c0a30 legacy-trunk
+61396 823e11ebf66829baf550b916013b534fd745f709 legacy-trunk
+61397 a5c939229ff27fb4646d1eecb1a1eddabb8fed8b py3k
+61402 212e9c8ad087eb16c894e00ec98520184559f2cb legacy-trunk
+61403 59eb5af61cd736851739887a7052b66ee2c99bea legacy-trunk
+61404 531e62416eeb67d5e9297e078813c228fd598de0 legacy-trunk
+61405 0d10f193b9be25a6fec899ac43ff620f111db53f legacy-trunk
+61406 4e358ed7f515617ffc7ba52b01e53ec498318b10 legacy-trunk
+61407 fea7ba8910a960bf70dd92e4e77d7701615cdb91 legacy-trunk
+61408 832c820e9d144cb76c8778ad6fcffe232b1f5c46 py3k
+61409 058fbfb985ae8a0b65d70415a619915e8c5dad40 py3k
+61410 702657efab9be91393d9ceb4c92706360d9594c6 py3k
+61411 ae21a8d703026e1822230c46efb6d1af6f15654f py3k
+61412 d0c677ddd6b89c014d65f9174872057f8b2696bd py3k
+61413 2e0e1402959d3de707c51f9ee1261b042147faa4 legacy-trunk
+61414 39fb2c78841ea25824bb1ab0696a2a97db5b9a01 legacy-trunk
+61426 37973125b2c0cc0af9578fbd3b563b8275425a6d py3k
+61427 d70fab97ebb5ea9731075e397b91831b31450e4f py3k
+61430 1f0e7e2dbe15cbae9e5645c6134fce8262bf3c2d release25-maint
+61431 79dea65332f86f37f9c653de240c18eef96afed4 legacy-trunk
+61433 2ff3e43217b7e544a39e54583e50efd96475a19b legacy-trunk
+61434 4d29127f3fa0d7bca729cdc501d60d220926718c legacy-trunk
+61435 16732db00822ea9dae17e1a4a33ceb934e7f3a1d legacy-trunk
+61436 c4402ec60c3a4a152ee625e7d17c25f6d355c59c legacy-trunk
+61438 4d39d4a6a9dba5a8d89ff1cc5eb5df3f43f87a68 legacy-trunk
+61439 22a4a111d598ae13ba70fb72132b002c523d8ad7 legacy-trunk
+61440 48247a4b38edf0973d17a564544eea0c7c9222b4 py3k
+61442 62ef0ea034f4e969079e164c8058f2516d0977ea legacy-trunk
+61443 bb543a809fe24c8c5251eb258bf2e9d60f850f15 py3k
+61444 f11c00246fb525d17c34f26e6a4fb6cb65c6432e legacy-trunk
+61445 acbf9cf594f8bd85264d6a44f5efc468664aa0d6 py3k
+61446 36f3c6bf2c97bfafed6981af2329cb431a1574a3 py3k
+61447 0db7fa14c7948bf14368f65c0ddff68b3d3e3061 py3k
+61448 cb360fc889122773e3bb23e4768830e226fdf0f7 py3k
+61449 710478a1977acfcc45c39e86633dfbb7207e61a9 legacy-trunk
+61450 8018f5065661baa32a04cd2b8627c39d581f07c6 legacy-trunk
+61453 7e8ceb39447ecbba66c0eed76188c19f118df59a legacy-trunk
+61454 b5cb7a678f3891fc4967eaa7532a887098cc3a37 legacy-trunk
+61455 de6b2834b8af990d11a0d733c577248985765f66 py3k
+61457 431825eac4ae37363e4e9fd04a670d28953fb5b4 py3k
+61458 d33cadb595f65ddaf8b03af9e0e6b7c49343f6a8 legacy-trunk
+61459 6a7fa8421902a954dec779fe9a7f4a4618b1a942 py3k
+61460 2c260be1242d9afd2731847d472e37f5eb488666 py3k
+61461 34f4d47ec43a4f36c1b7d078c4186edab48043bf py3k
+61462 9d9a38b8eb1b11a02825eb04590c9f25e1a8d9f9 py3k
+61463 a200c387e8b265135de16b6d9e97f68ce45b8a30 py3k
+61464 16b44764944eb8a3ea82dc63d908e3699a966f4a py3k
+61465 6c393dcd45c48f070732b1a8d8e8bff8baa49ea9 legacy-trunk
+61467 322693bf10cac6cd3c087e001e6a94c1022e411d py3k
+61468 973a23cf6f0b7a0959ed6ab62ce79b0de27b10e8 legacy-trunk
+61471 7f13d6904e14a494aeec8899dabd78c24ec9d4cd legacy-trunk
+61472 8a3fa86c30a6e2c72d5c7bbfc238a95ebf3f622d legacy-trunk
+61473 3745fdb9932f07c484e9f31557bb28b6afc529b1 legacy-trunk
+61474 8defa1d5f066d93018d8b7c7d9f57de0d4c376e5 legacy-trunk
+61475 ff0ab7b28f4917cd86374074d2ef49a9815b12ec legacy-trunk
+61476 e31d31781a753e0dca41d24669729e38ef913cc4 py3k
+61478 79fdc88ff9ecdde5f9724ab0e9a8c6247fa7b3aa legacy-trunk
+61480 4dabd907187ea7391a54b531da72f4346dd2e195 legacy-trunk
+61481 966ff168b56696c105c3044e662d17aaf37890cc release25-maint
+61482 7c4854ffcdcd88cc572bedd8194ff5d0fc60700e py3k
+61483 c0f165e1dbc05dce5337830fa433e9da0b4583f2 legacy-trunk
+61484 a7bb004e7f06a93cd88573c2c78bf47f60766c99 legacy-trunk
+61485 3deb70e4182a07a2a7929805b216116afcc3fe9c release25-maint
+61486 27e7dc2e62905e9228f9e0ab1b69e4ab252f7b8b legacy-trunk
+61487 aa33fb90eaa52a9b9ba79ec0ae276e190a2f9e47 py3k
+61488 04487ad3d1bef415350fd3cca8cb4df6d749569f legacy-trunk
+61489 3bb0f1a1939d93878b4d649beae8e71ed5919d1d legacy-trunk
+61490 b359480ca886460ecfef851608919af5a0a332b0 py3k
+61491 5c0b5cabeec966d7fec8364299e1ab827296d131 legacy-trunk
+61492 edcb3542176a53d1482efc5d2d849b559ed93b17 legacy-trunk
+61493 13729c70c8d8c294996f0798991a4add9de66b02 py3k
+61494 04050373d799dc0d53930c691585fc282e05748c py3k
+61495 2546313a8b27ad4fac8ac92f2f2b38c9c801ba05 legacy-trunk
+61496 c5241069fffdaa9e7f135fcfa4bc1af680226dd0 legacy-trunk
+61498 52682bd738a75cf4cb712e6b18b43cf3229bacaf legacy-trunk
+61503 e227ed2ca9d15abbb6133141b391a0254ba39f2a legacy-trunk
+61504 d4bbf9b4710f47d8f7c6c0fd0693b0324b942f40 legacy-trunk
+61507 6fc6a806784f95f060feeef44bf535b6b049626c legacy-trunk
+61508 86736401d394447acafe9c456644d402c637e8ee py3k
+61509 97361d917d22d401a36ce86dff6ad09bf2eda234 legacy-trunk
+61510 4634243179550af5582da40c37a3d83edfa72015 legacy-trunk
+61510 117bbd44adae646aeb654ccedbc9c3ae62665cc2 release25-maint
+61515 8f00a0948f00e2e57e792065ab1736adb5ab3541 legacy-trunk
+61516 6c17dac705717cfcd4240a38713a7f8f47ef56ee legacy-trunk
+61517 9638d2ea2f57baa36475a85823d7d730063f5ae9 legacy-trunk
+61518 3b39b7bb2c07c268f9a718848b1e7e635858a2be legacy-trunk
+61519 e148285bd51183890d15956fa30a902c09c19fc3 py3k
+61520 96601f8f3391445d92b2a5772b260165591950af legacy-trunk
+61521 30c4e1ca84212366989df833ae2177025f17477a py3k
+61522 9b8c4b5107f0f55cb73c2075f6a3c12fa12cf22e py3k
+61523 21139ea59b6ba2565fb6b947658803cb825d1e05 legacy-trunk
+61524 78ca8c2561db8e79668d1575df8f1e7f9b08315d legacy-trunk
+61525 6f0eda3e92b361b21877e66405b55f68b0d7d666 legacy-trunk
+61526 581c3e5b349b120d29650add66d148dd0d8eaa99 legacy-trunk
+61527 923380acd1cdd8055c98bc67735d0d4b98688ee4 legacy-trunk
+61528 c424099b4ce4b4de4baaa83f600f12c04dcfad8c legacy-trunk
+61529 50771a3fad2caaa88f940ea39efb00824c60b8a2 legacy-trunk
+61530 f302bef8a004aaef127133b1424c5d558205fd31 py3k
+61531 1cd930b835a63928d17181bfe7318f6b6bc14814 py3k
+61532 ea91914bcb9774f58549bda9035b5f9742cf8b6e legacy-trunk
+61533 a628ef82eb7e0c9e395c5c8b0469fc7ee77d9081 py3k
+61535 e0e8bef0d5eccb2724e14739967f3eee07b8eb6a py3k
+61538 cc758e8ddc9d794052aa0ad086579a21c4779abc legacy-trunk
+61539 94a6082a770fa30fcf85d0bd21bd724995f1386a legacy-trunk
+61540 3a72cbcc1bb806c2b69c6c5af2575fd41689c2b7 legacy-trunk
+61542 eb6d007453bc2c279d0961613e2078dfea35020c release25-maint
+61544 dc4d68ae9d3dbf041597687dbfd16b04433d5972 release25-maint
+61553 0d7659c2b9985274b6631c6a1b07265bf6f56730 py3k
+61556 515633615735af06ab836f9d1ad67845b1471b4b legacy-trunk
+61557 bce69db72e0043c5812b790a75438a5c66e856c9 py3k
+61558 83c55acfb95989ae891b7fc077c03940968de353 py3k
+61559 1bb67e503dffca4364df64b53bfce65a2bfb7cfc legacy-trunk
+61560 005db934ee25ef990bdab5ea56fded5b6cefedfc legacy-trunk
+61561 0e79793ffe8705e1d5e81150dff1e4eb85b86619 py3k
+61562 16c576dee9d3bac184b414936fdcddaea126d150 py3k
+61563 2f640f0f06976b2ead903933f660a20310b21180 legacy-trunk
+61564 ee0dfccf8cee6ece887bd539267878728b659ac2 legacy-trunk
+61565 b0d01969bbc87de45dc17c776f5b18ad66125ff8 legacy-trunk
+61566 f3be12220fd7e01bbb2a8065cbf1ad6f4c6e8060 py3k
+61567 fa70e6ae831ae1dead1b9adbafe0fe5f562a1e61 py3k
+61568 05ac3c19b7a803643256aaac97621acb05fa38d5 py3k
+61570 860e23a61e5510fbc33e38af3d565110dc87b72a legacy-trunk
+61571 2893c0129fe5c3602a6539368f3acda4d73b18ae legacy-trunk
+61572 c8c547c51f9a6f0ae5503f095e0b91d0bdc77a4c py3k
+61573 51e24512e30528556c2bb71a4c6802610879772b py3k
+61575 2385e16acb4279d51fc71ac091f1ba2609afc6bc legacy-trunk
+61576 96bd9722e31d300925a6a631efcdce4ba8776373 legacy-trunk
+61577 727f743cf630b1d19e0e226a18726502df73938f legacy-trunk
+61578 f7a6f33943106740221487fac8b06c8d934ad130 py3k
+61579 f096ef9c4114f757ffe3a702f92e685ceb439ecd py3k
+61580 d87d7fc2c2bf33ad502efe209f7c3ab9284ec2a0 legacy-trunk
+61581 19d4b697fbf9ad53c004562c37b7af8c597cde9f legacy-trunk
+61582 733c3ee19899667d5f68cdd1cb79e91eb1802717 legacy-trunk
+61585 c77e3119e2675e08612b968edef67808886644de legacy-trunk
+61586 1dfb9ae78a3727cf83e450d6bf28bfdd161889ca legacy-trunk
+61587 4ca7119d17005df61511a5a044e16d8a8c464399 legacy-trunk
+61588 b84e0e23cabd890475a5781610e8763cbf14fa41 py3k
+61590 7f7770719e848699c91418462a2a853001660660 legacy-trunk
+61591 d4e1db8797f6dc80cafc13ed8eaf5d3fa2d2e63b legacy-trunk
+61592 819116950099087beafaeb8dc238c803e77895de py3k
+61593 d5cff7f9a142be720624cabe869004314a2461a3 legacy-trunk
+61595 2a01075cd902142727ae65a5f58c98d5085e0930 legacy-trunk
+61596 302625fa6a2a69adc8d792429ed8e88467f80d2e legacy-trunk
+61597 45970b04ce83e2d53437428c6eb042ab64239994 legacy-trunk
+61600 963d67df37237e5dc8a1146f5bbceb6cbcc7fc67 py3k
+61602 a9855db40ffb33f4ab0b4c938638dddb5fbce2e5 legacy-trunk
+61603 1da2499683b43c3e0d176e96102ba7b78e777853 py3k
+61604 3b323ff9304c5f057622bffccabc9e4eb69b8fef py3k
+61605 422b49dfd15b53c3e7550a5bc5e35e4bb54e45b6 legacy-trunk
+61606 e0c9b9ef04660f9fb80ec04568b1c43d3f22d5c4 legacy-trunk
+61607 4284718fb631fadd32226f459fce94964f09f9d4 py3k
+61613 ad1d604bc8ed353014bb2e4d432b8d9c54a705b2 legacy-trunk
+61614 adbc934bf1fd5102755732840b78c76577008534 legacy-trunk
+61615 21477b1ba5817c5c8e2b8a9df735d798662b4bd3 legacy-trunk
+61616 5cc04a204766f2e7e5430a2246410b8bb78bb4ab legacy-trunk
+61618 855c4290dfd7aa34db09e3ffdbbdc782e1d4f035 legacy-trunk
+61621 74ab8bd96c5deb3a2e0f04b2e5ec43ffeda7f269 legacy-trunk
+61622 b0b608e579cd5ae360d70a1cea5243a607260104 legacy-trunk
+61623 ebc130a4a273828f66ad6fbc736704bf1b64157a legacy-trunk
+61624 93f9707b664ce4acd9469b180b6b50c76386cb62 py3k
+61625 330f574c58f7c3dbed5ed4d037cb6f53a6b0a394 legacy-trunk
+61627 8817a8e12a559eca87320cff11201fdc06e4f0ce legacy-trunk
+61631 3bf19c31c956f14124d3acf5bf2dc1abdfcb2b6f legacy-trunk
+61632 dc5be0b3c3be7da42646d4632e69800d7f8a91a7 legacy-trunk
+61633 e665a0b16da0e87b0c3a036b3b54926b834c0e9f legacy-trunk
+61634 24275552c9731714219e135ef2ef859452da6472 legacy-trunk
+61639 440b08a32e0b3d504f5325ecbbe0be522b0bde2c legacy-trunk
+61643 1657f0acca78202105d77360207853df5ca05f20 py3k
+61644 ae3ad06577c7d7a5d0fdce69c8274fa6c7d56b17 legacy-trunk
+61646 2da0bf2e2f5cc1f3ac469874a6cdcc97f3726e03 legacy-trunk
+61647 65f36104fcad72ca89204e6ec43216bb8b1c554f legacy-trunk
+61648 3989fc61e789c8945368d360af5ef821fa8056b4 py3k
+61649 3aa5eb1829131501907f3005dbb6c81c1ac181a0 legacy-trunk
+61650 293c6106fbe3497982c954dc60e253d172220a74 legacy-trunk
+61651 6509ef8bfe9c363dc7fb547667e9ef6643d618af legacy-trunk
+61652 cbad1f5cabb1511dca16045eb7ab5064e353be3b legacy-trunk
+61653 e86282199465197b1a1641171dc4a93b00a0f7d8 py3k
+61655 fc93bf5fece1d642bb8bde58c539de4f1c8fc68e py3k
+61656 8b0b89025d9828b3a80b8221a1b4ddbd71365c0d legacy-trunk
+61657 5bd2bdb39e9cdef5f3490de22ad047bed79a99c6 legacy-trunk
+61658 d00a9f75d223d934e0cecb6cac2f3f9a3efeb2bf legacy-trunk
+61659 0fdb36163841d8b696a9902b0db8c06e9c28be09 py3k
+61660 e0203c658b86501d9f512aa0a689c25a5fdf8fda py3k
+61661 9a47709a28b79f4bc6c153d8824db29e0c232538 py3k
+61662 fc210673eef0154442862b89455748c05783fec0 py3k
+61663 60db9a678551d175070b1df17f8b5e8ff47e10d0 legacy-trunk
+61665 6a3ef3c9095c058f7adbfd0f0b4ebc9013b3866e legacy-trunk
+61666 132cf3a791261f4c2b502ab8f85fd39982649667 py3k
+61667 06e641cb3a20073fa906bb1381cbab74343db5e1 legacy-trunk
+61668 39a4f4393ef1982404369524fc83d4e64e7d535f py3k
+61669 8e5ec69b76a74c50dc12b51217636231ffe8f042 py3k
+61670 36e296e66d216ac97ce8a8c7344a5f238b8a7617 py3k
+61671 133498b91f1c403cf5661fd897f85d95cff11fde py3k
+61672 c95663c684caf9a1e421f945aba59594412c3091 legacy-trunk
+61674 d9ec068b08f30947e895ecfca39febf211306e6f legacy-trunk
+61675 7d2e1ac834b85f78c9957d5630db096b793ffd34 release25-maint
+61676 d14a9e5f80ae8fc2349a5341feff402ca0774ee3 legacy-trunk
+61677 1c7c08d29feee5d71a15851fdd9eb911e2afefa3 legacy-trunk
+61678 d511e321743a911a5b91249b964531fb50fbe85f legacy-trunk
+61680 29131892611c55cd44e15e87686e246772a12700 py3k
+61681 7ca57e22a52078940d88f2715da83f1c9abe54b0 legacy-trunk
+61682 91ac8049e7093422eb81ab7151898b10d6c6ebb9 py3k
+61683 e8360b5d5a10748444a162756992aadcfa394a8c legacy-trunk
+61684 696225b5d55559ab1d7692765807116cb6b804b5 legacy-trunk
+61685 f3d838dab40edbd5969a10ee0ffa860f4e53b4b5 py3k
+61686 28733ada4d031de1898775efe877b0d3fece06bc py3k
+61687 7c6667bb8f853474e5e79019056d77859eccde4c legacy-trunk
+61688 aa9da4a3c97ce056d7b73c847f176dcc769bb8ad legacy-trunk
+61696 c45a45669017b9250efc6f35adb513645190c882 legacy-trunk
+61700 8f8b03c2bbff0172c9659cbcaf86cd54b6da2896 legacy-trunk
+61704 944d87a9bbd0acdd4d1af823d27c6f64ce7abfb1 legacy-trunk
+61705 8ef05aceef2b4a9e74706ea16e84253e400287b6 legacy-trunk
+61707 704a864ecb014c50769b5a677387ba47f9d6dcb5 legacy-trunk
+61708 adb5cab301a6ee55fae85fac941a8a09baf04dc5 legacy-trunk
+61709 544a46df0222dc9269853b930e0545c1895c2ca8 legacy-trunk
+61710 f0e4d9b45e7f363a2aa329cdb8d1bbac82ab23ec py3k
+61711 7f035592d6e1bf50b45fdc27e12f88f4a1a037d9 legacy-trunk
+61712 85fbd1d265a295139b403c1e69f3395e62845c96 legacy-trunk
+61713 441527bfc79cc73d05d1c4b9577f403cbee54cba release25-maint
+61714 99355baa748dcd4e6163b61ae4d157b0d692af05 legacy-trunk
+61715 2275612c16a9fc1738d1c0e44b8178c8423902b3 legacy-trunk
+61716 bf07bad1d72f63fc89053e088f0738c7acd4320b legacy-trunk
+61717 72dc16e801790e23f14b020546d2fd6271d3d0ce py3k
+61718 d6793ece32544de68321623aa2e6a931a138ac43 legacy-trunk
+61719 a0253718499e3b6aa5ad9446af8feb5a7f54cbc0 legacy-trunk
+61720 1f8ba5e8a2fa93bdbe70478f7a06ee11e820254b legacy-trunk
+61721 2e3f86e73fa2761e4f5677a734b69f71f7978b2c legacy-trunk
+61722 728dc13327b2fb94ccb91c3e681bb2a832a17807 legacy-trunk
+61724 e47c3c7bbddc7b7bbf76744f6900fdad9e4a46bd legacy-trunk
+61725 a7376d192a6d78ab20460eee14a398eb538f2758 legacy-trunk
+61726 7aa52eb9074f9d2a9937d3dd72074f927ac3d7a4 py3k
+61727 8c1ff8e54739711a5eeaaf8222c76e7ddfd5acdf py3k
+61728 376b5cb8a0143599fbc362e8e3dc5d444a6f9014 py3k
+61729 7f6bca78c3648578945b068133874672a36c73ff py3k
+61731 cdeba20ccd6a01d4ef3d6bea9c9a469a709927ae legacy-trunk
+61732 7264c051a39cbb440f2580d4d84035acfe25b84e legacy-trunk
+61733 61f5c663b49d8bade47fb40608fc2073d52042e3 legacy-trunk
+61734 a99ca1e575ed97581b475d51b4d82d49ddc3d06f legacy-trunk
+61735 24083305d1c7046615a9c5b5fbab00f91879fb9d legacy-trunk
+61737 11fbc8afe305fe339ebab3cc24a52302bef955cc legacy-trunk
+61739 04c2148564e459cfd9b4843c3f39514ef4df1d70 legacy-trunk
+61741 eeeb6b952d2f89eae46bd3f267c1abd823c2e49d legacy-trunk
+61743 f97785c7de9b6201e0cb2f98f4410233d5ef60ce legacy-trunk
+61744 2267ca14d54baa6940fb3c961189502ca1434dcb legacy-trunk
+61747 b49754ea94db926d157e00a4ec2cf0c423e843d1 py3k
+61748 b0a43bd5c28182bafc26a07553e232cea5422005 trunk-bytearray
+61749 70834c0e491bd8bf14d8b4bcca18418d81d31ba5 trunk-bytearray
+61750 435643b780c719a7021ec8d4f99c7c611574b12f trunk-bytearray
+61752 c632f9e1ea5dbd4a7f918610975536706c8f5469 trunk-bytearray
+61753 d4ba5bd11580a87790b612fb9c634ec1b95a6835 legacy-trunk
+61754 dfa0a011a2435a637144c95fed968b02fa8dcf4b trunk-bytearray
+61756 6667008894e0db26e1ce9281e63ae24f2a3d4ead trunk-bytearray
+61760 248f927ba57eb263c0dd6c8c4991d348738c2822 trunk-bytearray
+61761 751de616e08017fc0b18d1a6cd572635dcf32ad0 legacy-trunk
+61763 0122b46ce4e0bdd4f5a844f33b4520f6641d840a trunk-bytearray
+61765 f2ab50d0fa908ebe79a12eda8ddb1ef2892f14e3 legacy-trunk
+61766 2e5ab35ccaf1addb23ca75903a98040349d6d6a9 legacy-trunk
+61767 d6f0e3e556a4509e37adb07ee2a29aad1185e3f4 legacy-trunk
+61768 e67f421a20b0b1bdbea5d3b61f6c553cfbc2b816 trunk-bytearray
+61769 31cf38bdaac0cb03e74c7e1b1d5efd2a66233f44 legacy-trunk
+61770 10b0d81a2145dbde0c4b24c88c338dc3552e51bb py3k
+61771 957cba755315b465152432c347c27cb95ff01e7b py3k
+61772 fb1d35cfb8d2dda82fb7492da7489ae720c564ac trunk-bytearray
+61773 fa418cdf3bfe9f040eef9bb2bcd3adad6ce8eca9 legacy-trunk
+61774 296f9bc42b963efd1378b572beca8d9c8e0da182 py3k
+61775 3f0e3fb272a621e6d32e15274e8201e74f551f43 trunk-bytearray
+61776 f4c50a51d24f0bf300124aff8e11db3d263dcd0a legacy-trunk
+61777 722bef6835b944ffa3017f180570c2fb524f329a legacy-trunk
+61778 af8fb53a54fd3d44a0862784d5babddad312fef9 legacy-trunk
+61779 a8f54b6a8c1855d45f245a0e4e0827ca6cfdf4b1 legacy-trunk
+61780 c64c7b727c6258e434099eddb93dc00f81410c0a legacy-trunk
+61781 7da5b68971a5a9f0fd78dfd4a3780641778e4a74 legacy-trunk
+61782 9634c17e8fe5620509c1f1c48254c8cde071d016 legacy-trunk
+61783 f1ecb3e978db49d57a5a832ad653fd6d44d5858d legacy-trunk
+61788 7563f4d2f36ea468dbce32728ce206283d5150fc legacy-trunk
+61793 8710ba7fba2bea7d4cfbcdac4de187b7f040564d legacy-trunk
+61796 f1e51785947f5b5f15d32df43e40d6276efd4679 legacy-trunk
+61805 7296ccbb858c2b89ef50f98573260968ea0e4f91 trunk-bytearray
+61807 1d5a11619eca88ce7794592473d8e3e1809e87d1 legacy-trunk
+61809 df5c8b97cb2a1fa1ff645dfec6533a01b9833182 trunk-bytearray
+61810 c1fc6e0a94b9b7c048cf4403e494ecc3898fc418 legacy-trunk
+61811 af1b0f98dadf9d1bdd067fce45e2a5f98bb55318 py3k
+61812 39dc985c6fc60644096f7e78f654ee3bc5860d20 trunk-bytearray
+61813 467c16a50392cc0b5f4e37436337ad6a0489ff02 legacy-trunk
+61818 0a485593ae1ce5d38eb7019b5c18841ef6b08043 py3k
+61819 d0b91a90bacc953d744766a70167f121b5ff8da8 trunk-bytearray
+61820 5e91685d9c06852deb977fc0ae1ae346a76c21dc legacy-trunk
+61821 f5b1fa1214f0a154f801be25515c019c1b4995e6 legacy-trunk
+61822 7caaab04a4d8da3280f095fd026c9b41d6a2702d legacy-trunk
+61823 5ca928402e54365cdde3b0b3f419d0a51a278d28 legacy-trunk
+61825 a39cf335312e77cb592e63cf52d477f953765dc8 legacy-trunk
+61826 bfee873edf3ff6f7b06daa6582c03418c99c24ce py3k
+61827 68051f8c6618edb8fe9f019f6940ec585639e027 py3k
+61829 4a6b093b319bbfc880721026a9bdfb8eec677733 py3k
+61831 3708f0906ef5e6f23c1ad6a0b6affc52c5952f69 py3k
+61832 5f04e02bb40c5d56dc94cbae10314ecc9ffb2599 py3k
+61833 2cce917d79963d8d6bab0a3e8f1d5f255ff08ba6 py3k
+61834 8c2604fe58868a55f8cb120d393ad162c3441c24 legacy-trunk
+61835 df90774f92b069d90d79de4702f441f9d9c5dfb1 py3k
+61836 30ef51128132685373e01b4980bddfff9ee797b1 py3k
+61837 859ff5c7c60a8c0c6d51552eebfec725ac1a6990 py3k
+61841 25431ff6ce69df65cc89a68605b2c7c1056157fd legacy-trunk
+61842 38de0d202338678198b6eef86846815020b43768 legacy-trunk
+61846 2d0e08917a2e360f959e14e00bb8f69154f7c829 legacy-trunk
+61847 461ff43e74d022ab97930f12870cf20fb9567bec legacy-trunk
+61848 41ee9a400ad114026640c0750b5b4482bb0e8e0b py3k
+61849 02ae311256a77a1a94b45d0758db0a5454f37d07 legacy-trunk
+61850 b2f3e46e78a29a94317c6c4e3d5f1ca2b65c2907 py3k
+61851 bfcda552492e65f567b6d2c425b7ec21b8e61cb0 legacy-trunk
+61852 c86e9dd16b8d14d5fb9c2a77d0447a0b3a6940e7 legacy-trunk
+61853 c92300930772d6669fcf978bb52bc2539ec8ca1b legacy-trunk
+61854 42285d63755ac38f0c40b61779a5111f95926c58 release25-maint
+61863 f3e648fee4c19ad5be8d64133f8926d0d71e7ac7 legacy-trunk
+61864 09adff3d669154cf51c8439f84ab4cc192569371 legacy-trunk
+61867 ce45fd3a7a3fbe62dbcbaa98c9699f481741d664 legacy-trunk
+61868 de83edcfeb3d30905cd80b16bff2203c01f50723 py3k
+61869 de54495a414a7b9374c8370f663620909ab5711b legacy-trunk
+61870 2bff5a7290369db55a8e1757642388aae72aecaa legacy-trunk
+61871 958cf0c27da9393671ea0e702b422353e52cf8c5 legacy-trunk
+61872 38a0a737ccd4253286b29dcd1e762467cd0c7bd8 py3k
+61873 147f35f6e6e586af39716cb58f273deb9d977133 py3k
+61874 4f9ca827a7d87e97cde49fc8a7d1e7f198ce92a8 legacy-trunk
+61875 0dd441ca8eb0c39c7e3cf754e61f1608a1663a4a legacy-trunk
+61876 abbd81f2cc68e6b1797d30de42781584512fc0ae py3k
+61877 041e8d7cc6840930cdeb408b2517a1ab612d37d1 py3k
+61878 9b3f0fa5d8ca0760240d02e531bf37cf138684ac legacy-trunk
+61879 84bb7701efbad822a04258240df8d8ea7368dc24 legacy-trunk
+61880 2a1f4801d494fca45d007592e7e271ad21698fef legacy-trunk
+61881 ae659ff0528bc17b61f1adab140b29f515b37c0d legacy-trunk
+61882 47c2ffc38d1d103ceb4e5d7827053d42da4efbe4 legacy-trunk
+61883 1a2c9645f71df3c06b7fce8139f73338dc3957e3 py3k
+61889 2a866ea66509b6378d3a6e81aecee2aa9729037a legacy-trunk
+61891 a7cbfcbaa6b061567a59618b9769e1c0d4196352 py3k
+61892 22bd02293efa5d5d40511b31f2212d1eee68ecea legacy-trunk
+61893 0b63999158b07264c8ed7e992ba2738daf1e5d83 release25-maint
+61894 6bea2f1351b1f5f3a4d7d5c63962932b510bab44 py3k
+61896 256f9394d93db5f322fdff4398624bc3f2fd64f3 py3k
+61900 72cc400d80536d1e15456ef5e35740395e66d153 legacy-trunk
+61904 e81cac73daf2f081499ba8c0e78b97d9d5407934 legacy-trunk
+61905 7d3a6dc471cd91237fd03f1fcbba2cb3a04172a5 py3k
+61906 1899e08fa421164f4cf252f2ce0d455e133f9c88 release25-maint
+61913 5df72b9887fa689e9949d342614736969bd9387c legacy-trunk
+61914 46f89f480bd4c50cd2013d7d00f1cad9f285400a py3k
+61915 622d3b1168aa294d2588928b9b8e02c009ea2e46 legacy-trunk
+61916 f94ac8f9cf96d4efc4401dc0ae5f6d2cec539e01 legacy-trunk
+61917 67909508e0415a40e0580a0e58a4c6b1df622b8f trunk-bytearray
+61918 b51e4b50ed30ec28d5fa69a8167fc917c365efa3 legacy-trunk
+61919 15118566f98727bc2aad01d8b464f12482ab6678 legacy-trunk
+61920 15da098b3cd85c147b777882fbc7b08d0b35b631 trunk-bytearray
+61921 4ea6f12bbe8c69be67c4b39abbacfb267b353d69 py3k
+61922 54b90d7eddb781a0a5ca8dfcc71c8de4359f580d legacy-trunk
+61923 296c218f35cf6c372ad6fe13b675955ae127df8a legacy-trunk
+61924 8f6ccd075a24d83668a4d374e86b8de15b73c011 legacy-trunk
+61925 7da8918102fee154c18e0ecb50da5bffa435f151 legacy-trunk
+61926 cddb297c24653b686cb431486dc73184fab94c2c legacy-trunk
+61927 85acc40811b3d644cf52e2560931929d39bf5de5 py3k
+61928 1ab5cc25341ad1817c8ffaae29df4a38db33f3a1 legacy-trunk
+61929 1dd00016a69ced8eb73d366f8ea5dbdc030a4014 legacy-trunk
+61930 d5784fc19e7ac7069b287f29e8e719fd33ca0912 trunk-bytearray
+61931 6ea41d5239e07e6ef6559e18fb98263584a8698f legacy-trunk
+61933 1c7fa4acecb3ad2567a0d7744408c6f43edb1d9e trunk-bytearray
+61934 9fcccd58d65dbf9367727820711b17ac2b31d0d7 trunk-bytearray
+61935 20fc41c17cc7c607f9e9f374f18621aac02517cc legacy-trunk
+61936 5341b30b18125bf1925c0d44f0c4723898b5128a legacy-trunk
+61937 cc0d1977f820c79820e6d6486e784b1cc478a5e1 legacy-trunk
+61938 2e7ff38e0a183ea88c4e2a5c985e218d3ca8215b legacy-trunk
+61940 cceea98ccf35f774e82e459a4304961fb4a14f30 legacy-trunk
+61941 2bcbd3882eeed6cf7085aa33ad8e232d46556738 py3k
+61942 4d19892040620a47418af07a9b4cf579d7ade156 py3k
+61943 8d6fde16e493cb24c75d152d382d0130f4b4d816 legacy-trunk
+61944 64bd96ff94f1494183134b268d56e279cbbf7b52 py3k
+61948 1b6c0ff134fa4a1d8a7a8f3c007a6f9849745796 py3k
+61951 995c9960f7ff3834a91d6c3ff1754e90b87c4c38 py3k
+61952 dce9d2d92c881472a07c28db05cc1efc368cefd5 legacy-trunk
+61953 c78d3586c474f6640695397bc2d7ca5cf88268ee legacy-trunk
+61954 daa6aceabdfc58490f8a8da226e941942703e60d legacy-trunk
+61955 78504d604b448c8b5cd8de51a2806f15e8e84a76 py3k
+61956 d00ded8b26771d48c08983fb2694e756c3154df6 legacy-trunk
+61957 a935c50cb51aa45eeb1e427b348051aee4d227e1 legacy-trunk
+61958 248676988c548fcccf9b0559f2ab76246cc41437 legacy-trunk
+61959 38fe64e3b13173afc9339eae43bdcf37874af698 legacy-trunk
+61960 36d828d27c3640911e86cd6a6fae20284925f787 py3k
+61961 b06a15efdc6d1f42cf8692a88ef987b55081fdef py3k
+61962 ae2831542558167e843da7267f8a26847a5575ed py3k-importlib
+61963 5c271ef6cb326383af704c50fd94d8e936224afd py3k-importlib
+61964 b45e7b57a0d82aad58de79cb815fa97246b978fb legacy-trunk
+61965 ef40ec32c5e4d7739b2a2505d7024d528bb0c21e legacy-trunk
+61966 84793bf5a4bfc0d2609cc8a0f23c1659fc3e5c2a legacy-trunk
+61967 6192d5b12b6ae17b53a2daf8c6a39a67699c51b6 legacy-trunk
+61968 d740c71f02ff27ab9d9518d8332c680ebce17137 legacy-trunk
+61969 5078b7ee16dc171d697ba315398a4d05c1ec92ad legacy-trunk
+61970 b350960ade6d6696773b71fe0396b6f637775b5c legacy-trunk
+61971 313f381fc0a7170cc1e81a974a77ac06d451ce7d legacy-trunk
+61972 6f131d2c3628209beffd5895cdd52331539cdfaa legacy-trunk
+61973 eac41f90296c69c6d07d29f1feb453a4c0e400d1 legacy-trunk
+61974 62138a0f42326bb0340bee70fd47b1114f2b3194 legacy-trunk
+61975 a0ea3a0efc710934ad66e3907211230ff227d6a1 legacy-trunk
+61976 f1aec7dec05ca21eb8367406dec98eb06cfa6fd8 legacy-trunk
+61977 e39f69bf5610ead3985177445909a7baf94f8a1f legacy-trunk
+61978 56442db60a362bfb62e90463f6da314936b2dd9e legacy-trunk
+61979 31ba3fa1585b09db0c80277de2180eacc16048d3 legacy-trunk
+61980 cb56330d7adc8cd1039be404eecff91b55ba2a7e release25-maint
+61981 6a66d3267d0cd4dca63f561f16b670a659396562 legacy-trunk
+61982 da5597a5c19582a8e37d54058f4175b5fad1872a py3k
+61984 10a39a662e69ca4ddffc2bbfeb7b50801ad49fb5 legacy-trunk
+61985 18e19ac98d34c01933129dc7ba7614b4196220c3 legacy-trunk
+61986 59d082591f568041a0c63f4a4e9c2daf6e2c9428 legacy-trunk
+61987 7fdff02e6f45ea98451a7b9bb307018e8d86357a legacy-trunk
+61988 4bf61fccc4e6882477fcf3a94f5945ab97526bf7 legacy-trunk
+61989 6e7b2808b9a69e77a9b5af1c8edb2c2ab17a035a legacy-trunk
+61990 1d50747e53d368b0d81da9206f0fd239ca6c0889 legacy-trunk
+61991 7232259a0529e696029f345842a46ec1d1b9f087 py3k
+61992 1e10b30f7498c3d72db9de3a3cbe7610966b6d6b legacy-trunk
+61993 3103ea3df49d94c7e71c5a01ba7d6f6dbddc4902 legacy-trunk
+61997 bbfcbafeae843d00a94b1ad3b30bfc94281bf51c legacy-trunk
+61998 64f2eb4170f1960a295680f7fe1e8356b61aba60 legacy-trunk
+61999 69d0090740883eb8d3f2b5ef9882860d6ad2a24b legacy-trunk
+62000 f9a629f41656da720a54fdfafb334f39baf44ddf legacy-trunk
+62002 2365c47fe64ddc34ef0cca63b57cafc04857e0b1 py3k
+62003 848160d1078061ccbb5d67ce72b2245e369e552d py3k
+62004 ca38f7a4b4c95968b84a2741f41ae32ac2403bc6 legacy-trunk
+62005 a43be074324d2f3f1be99f6e4dd52c6df80e3185 legacy-trunk
+62006 09fa8cb2bfe8f4f2aa75001431be5367bba707ec legacy-trunk
+62007 aacf8be51f9030787709bc5cd44aecadfe38a703 legacy-trunk
+62011 a21854e510b47bcccede2defa873d7b024f102d9 legacy-trunk
+62012 654ad74ade1312016d7f5bee575464d9851a3aba legacy-trunk
+62013 1b5b6abb1f2ede9b145aa84627babcff0940cf7c legacy-trunk
+62014 c3e674cbd72e9d9ab4517f90676b00d69788f525 legacy-trunk
+62015 3b994f74b10048213efd28b7e55aa809945e6f72 legacy-trunk
+62016 c77cc23e394f14481612c0914df4e8d250606535 release25-maint
+62018 9734a42cfa15e015ecddb9f3ed3b2b914f25dba1 legacy-trunk
+62019 c4ed664a1da1c0b01b09a96ef3eea6e35c21194c legacy-trunk
+62020 3ea3e51d1ee3fa8f67bc473b254854d2786ae9f2 legacy-trunk
+62021 efef4e3fed17dacf2f3bc7c4027845df7dd5e45b legacy-trunk
+62022 872abed7d0694d89b4fd549729a76f3fd8b2a508 py3k
+62023 7ce1a8fd8a71ca97e6c26d8fceeeee11a0ad115f legacy-trunk
+62024 e06e08e8fdcedec6bada3b1da2876a9f8cc0a072 py3k
+62025 d1e1b740f684389c1eeb2a8633ba2a56d926082f legacy-trunk
+62026 0ea5c055ab54f46b6f3dc29c3925fb84c822f95b legacy-trunk
+62027 09053a7c1cdfd818f092f6a8c4c704784403eac0 py3k
+62028 fe53d1a36ef63b94d1e595fbf4e5fdf35306022e legacy-trunk
+62029 c440a5737149a712db9bd45abd846f5767ec36d3 legacy-trunk
+62030 6b3ac89e0dd49249a108d9dc5f85f855c099384b legacy-trunk
+62031 958cf7eccae24962d7950bab227565b939bb5200 release25-maint
+62032 0a4da397e1db47b086cfdb00ddbf89b3aea43537 py3k
+62033 f1843337a66c15e533c6020e90bb7aee6fe446fd py3k
+62034 46348de63f61a0eba7a1f34c4d3a4a5e8ed9970b py3k
+62035 5110cf0e5f8feaf241cb90dff2ff750005e4dec7 legacy-trunk
+62036 16736eb40150aa7d7884078fbb10675b2abcf7d4 legacy-trunk
+62037 23e42577226a7f85fb8ab2721ffd78348089c5ae legacy-trunk
+62038 6e02ff0bd6f8944b71229ab17108208987f02aef legacy-trunk
+62039 b0bf06d49647dd25d1c3d366c841a462908f8763 legacy-trunk
+62040 4c678e9c7a3050c2412b36174a1005a7c3fd3bb8 legacy-trunk
+62041 51eff2fd95271366ce8781d17f2a0cd60eb0002e py3k
+62042 0c21f9b4a831a4616a86d262aeab67ef61efcc30 legacy-trunk
+62043 01a7e66525c2624cc7c281d336a383290ef0e201 legacy-trunk
+62044 e4486c343f7fa68d9a071b0179d675a51e1d8d9c legacy-trunk
+62045 ed88f4de496f19806b366a70ef29d772bca16cdf py3k
+62047 2ff88ae9850c52e5ce7ad9c5a12ee153a6214c81 legacy-trunk
+62048 e370d9cd149ea2604bb78f51a17155619e545cee legacy-trunk
+62049 42c5d287a852e6f28988cd6b259323dac0077aeb legacy-trunk
+62050 f051e7a80acc76b4029ee58662149581f2b06e19 legacy-trunk
+62051 29ea507fd99822337438741021682f031c8230c3 legacy-trunk
+62052 c112219061711a4501e876e0d06e73e711e9800f legacy-trunk
+62053 07f75d5519b47b4c0b175d3c3f25aafbe1b68992 legacy-trunk
+62054 59d42e6d18853ba0fad98f9bffe5154048d5ac2a legacy-trunk
+62055 ea75b12fe8e76f9bfe8313f68604c8d014f328bc py3k
+62056 98276be64579fc3c0c6131ff2e2f151e5705783d py3k
+62057 1c97232d93ff3e9ae20e4a16185c4ab3a061c485 py3k
+62058 e8998e80eaf2bf8b59901858478ccf7cf6f95bde py3k
+62059 be18df6344058593956050c87877a5f8673a3114 legacy-trunk
+62060 32ea7654ff9c4ef35fd3c98c7a02d8072a416ea6 py3k
+62061 4c7bb409dad6d00d90d6dac43f8349722d5d1056 py3k
+62062 a7fb4d87cbde397da4fef35f6f78e990bd6e29ec py3k
+62063 2bc1d5aa729ee496c6e92ffc80ee44e4c92b4966 py3k
+62064 6042914e828677cb29e6da92f38a5eed88b0b1ba py3k
+62065 c5b149ad300f8c08c1ec38eb32a91b0624747c1c py3k
+62066 57bbac531919829b33fdfd3d3186ce54b8704ad8 py3k
+62067 600f2ff8aa9e9170cc6097b573516e6936f3f1ca legacy-trunk
+62068 ffbe6c790523cd288f1891f9171e2dea0659b371 py3k
+62069 aed698c8647b9914f0157ba7a3a1929112ce8179 py3k
+62070 f0fa605b2a78a608b7f73292edcae3da373b313b py3k
+62071 38f8dfece98e5bd83a73c6bfd075323632919b98 py3k
+62072 864574a9cd26ea6d5f56a97ec8e4b99098097657 py3k
+62073 e9032f5dd539b3a6492616715cb2e94031e07e90 py3k
+62074 b2d93a960b9890f6d831635e88c9fb3aff78b906 py3k
+62075 e3dc867b6182ee128c25b0015ef082faa2a5bc04 legacy-trunk
+62076 07b36d2b7534c5c8bb496a72a91f80cc11fcc372 py3k
+62077 e47481764e57308488a19e1cb392341c1d641943 py3k
+62078 81ee270a6eb54f00372007137bffc482df353327 py3k
+62080 c3ee0f0fbee1cef624b204cb8b3eaeff6e49a2af legacy-trunk
+62081 61c92923cf7fceb3e92f0f5bc773b7b9884ed9a3 py3k
+62082 415156d4cbd20c8c62ea918748916e10ca1673e1 py3k
+62084 c7015e357a2c979c4242b6f2258d0085863748df legacy-trunk
+62085 17881f96ea01e3040f1a6f92b33a4d20096f3aec legacy-trunk
+62086 6decfe38a809199f1258850218848c069c95d0dc py3k
+62087 d86b333c72e741b9c6a2077b0b6f88cff608da9b py3k
+62088 30dd60698671f1b866655d8c7f8018acf2260259 py3k
+62089 5a17d157df001647b62324d8998522c77e40b55d py3k
+62090 7dff5e41fa7ae1bb027457fc01be800ff1a4055f legacy-trunk
+62091 4c5065ddb9bd638833002f238fe645364272f8e8 legacy-trunk
+62093 ab4f8c46c3d9b6dc6966a983509ea5876bcbd886 py3k
+62095 4779e3496ae1afbbfb812eb6e55232deb36124c5 legacy-trunk
+62096 0730f3d50cdca1b16d3dd2afe48cc58ac5e18f70 legacy-trunk
+62097 1c78d8e87653a5dfb2791815a3cb75cf6035671d legacy-trunk
+62098 0b37477254f64180827687e24dcd2d39ebb23891 release25-maint
+62099 5939900d98d2149918a1cf4f9b41ae8776d0d818 legacy-trunk
+62100 d6e1333e6075cf41cf2d1cb7566df9eb6708a7b0 legacy-trunk
+62101 c7c2520485553768e499a83ffdfac426993b075a py3k
+62102 f753918abe652838b1b13f283518fa1c7639812c legacy-trunk
+62103 0b2a4a1245a3c96671676aece87624394d6814ab legacy-trunk
+62104 bb4a547430f85ce035c8814fd0dc0300e948baf6 py3k
+62105 03ed0118e73376038cdacf92099d45971dc7c996 legacy-trunk
+62106 8e6a4cc7dfc04da694b9dc349fdf442466dc8af6 py3k
+62110 8117906b7ba75e6e2b498f0261daaa05856f4a5e legacy-trunk
+62111 a172c2e38ac9e2ea62ed9e8b5eba1b6668e16b60 legacy-trunk
+62112 a94469c74b9eb4bb32d8eb06b84d6c249cb0847a legacy-trunk
+62113 0a5c86350a8927613fa45249a0093cc30a31963c legacy-trunk
+62114 2b0ecc7fd7eea282ddb12f4eb3670c51da44cfab legacy-trunk
+62115 205d7fd50d35a96cab63699ef262fd23afe68952 py3k
+62116 f547ebf02843289b9481d19e8f59628771fad625 py3k
+62117 8791ac9cbccd5bf1f2a25781e6d482cb83b45dae py3k
+62118 975bd21605270a07d9257c946a795b4888c6a911 py3k
+62119 15f773f7300e372c56a21d59fe49ca26955a6477 py3k
+62121 ecab03766caccf3417bf4ff9d75a3d9a775a4954 py3k
+62123 eec144917a189be11ed5efa35c6604d03bc62bcc legacy-trunk
+62124 76a81ef9b3791e94c36a502a9b6205b04765cacb legacy-trunk
+62125 aa9babb9a48ed9cc29b92d8bfbb6ad66142da391 py3k
+62126 1617bb05a78ad8183c2da263872101897b36a16d legacy-trunk
+62127 4d83b8d03299f5aa1fa4e73413af24ee44d006fd legacy-trunk
+62128 2848c657af0ae74f630bf37e1213c98f7953dd3e py3k
+62129 9dcda56b871e1cea0b1e948d7cd4c61bc98c5b33 legacy-trunk
+62130 81422f1de8909da3dd372a4cce3345229abc2011 py3k
+62131 9736c20d26eb6f648ad31f4d263e768304fd9414 legacy-trunk
+62132 ddfe94740edea57e8bbedb0199d175a37b700c58 py3k
+62133 a72e917491a486842438f738f836900eb27ed9ae legacy-trunk
+62134 67f1c465279cbc1d4e1f8b7629624e2fdf3c99b8 py3k
+62135 cc3333b7bd936668c16780d80f03dd3cf6f9e93b py3k
+62136 76f577a9ec033fda08140aad78f6595a058ce5b5 legacy-trunk
+62138 03b26f91bf6d0503a3422bdd579445109992c246 legacy-trunk
+62139 4ba68195a51163263ce9343069a0fc08cf40f13b py3k
+62140 7c081c0b0f5588dbc1b0348ece9dbd1a43b9e90b py3k
+62141 ac5e4d54b23e9d56e2e173487903b336fe16b394 legacy-trunk
+62142 fb3c9bb76b29458fb33875339497109c46181990 legacy-trunk
+62143 d818f6d293847a7f0b1119c520c22d7a4bc4e1a1 legacy-trunk
+62144 ccddc56bd5b070fb8ff68e234a2ccd24d50f63c7 py3k
+62145 b28a2d25fd92dc056fd56e1e5741f3c88806b85a legacy-trunk
+62146 3d0352a541ce5662b69ae4c7426c87474ba159af py3k
+62147 4a113303f316542dc7d33f3a21991f70a5e69bb7 legacy-trunk
+62148 399e74bb12c7dd0f90173f0df6d98766e637e8f0 legacy-trunk
+62149 82731768986d4749a0ae38b71811bcffc70990fd legacy-trunk
+62150 c3a772588db76ebdec5ee86e80fac4d8c36c1105 legacy-trunk
+62152 6abe25b9924bac9f3adcdcc814b6e537a7bb4188 legacy-trunk
+62153 61a0c76ecf876ee5c72d7598e4805ed0a55c319d legacy-trunk
+62154 a19ec4f17277972a3d5eed76f9dfe3635cf819a5 legacy-trunk
+62155 f806fd9941da68c455d6c0bb6cda2b542c0cb6e7 py3k
+62156 0ce7a2352a53ea07800fbea72d133f15f0a79816 legacy-trunk
+62157 e8916c64df4c5fb500fd26c4082096c01d8887fe py3k
+62158 4901e75f775ae1ac0252ad35274f6578237b951f legacy-trunk
+62159 3726de8cb8e1d3c00430ae7a1c8fa115d07cf58a legacy-trunk
+62160 f4bf3e7bcbe80ae24a71d182c12e32ec18047120 legacy-trunk
+62161 de77973d7e1a0c4d2fc594c8e4a4e1008691a63f legacy-trunk
+62162 3442e9e6b2cf18dfa6507b5222773a4ac55cd7cf py3k
+62163 9c926b0a648f4248ddd854c7983907a3b69b299e py3k
+62165 b10292eafb073718275de6d54c933fdfc1faa608 py3k
+62166 c3dcc0c7bfd957e12638d1ce07b491e4ac39a939 py3k
+62167 a1a518be547dd92c9bba7ad6a874bf0ec620bc1d legacy-trunk
+62168 1055f369b1fcee079a2cd98afd9d5ec7355761fc legacy-trunk
+62169 6253a721d8a6a2b3e69b359a2f492bb7eb101cd1 legacy-trunk
+62170 e3f7dcfaa030cbe84f5bda34ffba49afcae7a120 legacy-trunk
+62172 8532d56918509ab8e112c3135cc10b4091c4ae49 py3k
+62173 10d94c8c8414ab672e22780b02bbeddbd7ba4763 legacy-trunk
+62174 f84cdfc221d135e0e2e13e5bd925d1129df1646b legacy-trunk
+62175 bc700ad029623185264e8c5d2d216bef112baf2c py3k
+62176 4352d41affb01b25f0f1628bf3cbae9919e16997 py3k
+62177 864a5671c7a43ca771c46bc676ea526d5299026a legacy-trunk
+62178 22a74eaf6b2253fc125b0791c2e71297b91cd9a2 py3k
+62179 42a758f961a17933cee2ba36c1869f80302ad5d3 legacy-trunk
+62180 012d97bbeeaf6f6c18eefd45410d342ea4ab23e5 legacy-trunk
+62181 e53f2cccdf1d71b27970179c4f6cd6bf21146c34 py3k
+62183 fb5eaa4be70091a6eec45df72f5cee2f61d849ee release25-maint
+62185 f46cd240e10585c9490552f627d780772153c9f5 py3k
+62187 035289e6fe235dd304ae48d6c8b15554a60a6a01 legacy-trunk
+62190 c7da31c2c45ff7bda0ba27c2bec332e228531692 py3k
+62192 9c647542760521432f7789fc5fac8adcf6fa07a4 py3k
+62193 e28ed85cc962dd741c81f921889925f826912b4a legacy-trunk
+62194 27d324360a63e314e22aa2a8100ccba3ff239041 legacy-trunk
+62195 86da9298b908b8c976b81da092113bb9c425be2b legacy-trunk
+62196 df7619539631a268c2e069a020ce8da4eb288ffa py3k
+62197 a93d2919ea59bdd9a0a10d644607cb9bf1b20097 legacy-trunk
+62198 4bdbef7095155abcf8b2f9604af875c39973fd0e legacy-trunk
+62199 4e72489f16d050afb5473475d73e8918ad47f1c1 legacy-trunk
+62200 3ab5474bde457f84ef507c37a8d26441abff1949 py3k
+62201 3d9ad27d930b078e010d180fa735c9ab29eeb303 py3k
+62203 56e49952d1a4f63bc539492a0d7b3bd204bd7ecf py3k
+62204 2d95f7a983d82d80fd8cbab4db1997cd41cb22fb legacy-trunk
+62205 27df3b81351828d374d7c910f16949c0d13f5234 legacy-trunk
+62207 c26670f1e520fef4f18021aba2adc6914c70fcfc legacy-trunk
+62208 23b65f2d76219d299bf0a56a0e10d6639ec4d04f legacy-trunk
+62209 0be400cbd5b8a02c6ca9e3c63466a2041cfe8d3b legacy-trunk
+62210 d76e59fbf06d417c7522e8c59bd91163f6f86508 legacy-trunk
+62211 fd47a900905c2d6ff7bc6cfbfefac314acc35c8b py3k
+62213 60cdb6703df33e8bbb6b83cb6f262bec012807b5 py3k
+62214 09f36d57c9d613a93d40ea40ab4671abf3946f98 legacy-trunk
+62215 f9c61c96a7695b0a851a0a8091c4b048827ed2b6 release25-maint
+62216 cd08184637c58bef24a0c80f9c82dfe37c4f9222 py3k
+62217 89dd162f155bfca9e3d92213d3c8318e35a38404 py3k
+62218 4589d831aa80bbe516b81880a465f212a0916698 py3k
+62219 218f2d55de4881ac1d58ab77f50d706395600379 legacy-trunk
+62220 43483432192489d9c93a2fcc5d5638d37a1e19d7 legacy-trunk
+62221 63a0d33c4cd3549863676436e32a428ea7401243 legacy-trunk
+62222 270d79f900711ebd464b115d72d122f12aa04f17 py3k
+62223 e024b7552795ecb9ed667b392ea9faa851e5ae5a legacy-trunk
+62224 63f9a852609e31886f12ff50cd9a12ddc677e70a py3k
+62225 ae64fa1bc9cbb4b9e42f10c4c2e8f38cb34a9924 py3k
+62227 50f5184eeed8d8af11cf1c8182d626240d091c01 legacy-trunk
+62229 382d5ea17d78a48d2caeaa026337a53ad14b3dd3 legacy-trunk
+62230 8543f8c81da088ad27d2aefbebb23bf11df75136 legacy-trunk
+62231 1f15463af98c394a317a3fa76733d41a16d86ec3 legacy-trunk
+62233 7ebe81b1e4232a5a6fdeeb666ab38c4e222e680f legacy-trunk
+62234 d917da2b1946e12c46f52326a8e67a3f5a519033 legacy-trunk
+62235 27c7139a98ef7e9e6d11c447498be193284478a9 legacy-trunk
+62236 0498ebb6c41b8309826181639acb9be9db37142b release25-maint
+62237 7fd274a58d5c1e0ec5eb87e71c1e9ce2c97ab35b legacy-trunk
+62238 abdc81e1cb5ba655bdbc2d412edbc9e0baea2a5c legacy-trunk
+62239 af4c46bf3d0972b745700ed043f1754a72c43499 legacy-trunk
+62240 60885f8e8575ce6e4f6da609300454e24899f30f py3k
+62241 afc621a1bc4190398fdd44bb08f6e7ea5f06c224 py3k
+62242 2e917b0c8f6e892bc4db8a1fda5e6fbfbcdcf24a py3k
+62246 b3cd0339ca77e9791898cf16c2d879dadbf5398d legacy-trunk
+62247 2c4553f659243516b8710c02d930b3be1007d854 legacy-trunk
+62248 be7b0eb5990c6b61a96428a1784e64c29621cadf release25-maint
+62249 aff3839d03941ad45ad7c1c49ed8e314ba18adaf legacy-trunk
+62251 5a5692e3c9be2295471a66e84b4fca488bd5ebfe py3k
+62252 ff34ef0a809648cdc3e09b5469770e9aa9930553 py3k
+62253 18db8c4d4487ae69a3deee0afc65fc5842127767 py3k
+62254 efa9cc3bd7f3eba68fa78e49dc2b11b6ae0595e8 py3k
+62255 11b18dd15903eb9c3ba673201538f7511982c7ee legacy-trunk
+62258 d8b771be21df4499a24b09e5a6b35d5bbe6cf74c py3k
+62259 3603267672880a41c5a897fa03b9ed2d75437742 legacy-trunk
+62260 ce3187462011f68386cb50eb9994ef7d5d3df27d legacy-trunk
+62261 0b55875c1c9c1d660f731a32959a916e9e35f730 legacy-trunk
+62262 cd4b1f3fd1a97407502643b304f1ea8ff5fa82c7 release25-maint
+62263 842a6c2c9bcd2a730ccc457f21f6b2cf5f4cd45b legacy-trunk
+62264 2287a4ab24d87611988f516b4ac5f25c1fe80f5a py3k
+62265 3ce7c796bca12495bca07b7fccbea60da4bc0aa1 py3k
+62266 8d555850f73d968fd67cb2ba6ca15f927174e7b2 legacy-trunk
+62269 7c99cedc3e54a5efbf8db3a4034495713c8276aa py3k
+62270 5e55d4275a09410d296b771b06fc9466e9fa5f0c py3k
+62271 1aaab32183f227458596ae03f9ad9cbc6ffcc0f7 legacy-trunk
+62272 0410ff818ec78ef1b2240b3a27e0092ecdbd5891 release25-maint
+62273 645c535f822326eb770186763f077dd2c6963821 py3k
+62275 8416cdd11c11721802e9d2756715474184bcade4 py3k
+62276 6196529afd738475f59bf0b77daf51215d7a3291 py3k
+62277 29a7bec610cbf239ce9d85e2044f3b91ac44b756 legacy-trunk
+62278 45fdae4cdb557f2a6c850de895212756f9929798 legacy-trunk
+62279 ddce7c9421d2e96fd55a6e9cdea22550f9ce5a03 legacy-trunk
+62280 afac3ff60c6c5c10881473ca3635c323f619debc py3k
+62281 094a9ce4b9bd4fddf3abf946f3847e45b2b7b04b release25-maint
+62284 97974d9671270b787e9ac2486c156d84abf4561d release25-maint
+62289 bc33770ca1148c6029b274944f804ba8cde76dba legacy-trunk
+62290 a24856ba77fed34cad52598a1393c335f3ae7072 legacy-trunk
+62291 3361b98ff4ff8ce8f79fd72e3b9581f8e241e7ac py3k
+62292 3653fbdd44839bba10860760dfc24439bacbd968 py3k
+62293 c1fa2e758e05b5a4b07bb6645fd26c254b661f44 legacy-trunk
+62294 94782be8f1e77b58bf8c95eda4e5adc6d37e90fc legacy-trunk
+62295 fe2751acad3e13a5cbafc043ff450321b1ae9e49 legacy-trunk
+62296 ca233be645989cadff4466d1256114565e619d94 legacy-trunk
+62297 d46f6eb09ebcfb8664adb89a7096319a0a6c69e2 legacy-trunk
+62298 764aab0e8b9b1e46a34e291b73bbb87001a1d683 legacy-trunk
+62301 8b914fce9d84c084da4996e048498aa2c0953c25 py3k
+62302 2a9858255de10873e898b390873e8403f8be86f1 legacy-trunk
+62303 840064802952b378e81f4627a0175c6f82dcea67 legacy-trunk
+62304 f781ca14395b0657f2aae619e5616f2cadb528f7 legacy-trunk
+62305 39ea2fc4503d1231795a7cca5d74aeb134953b23 legacy-trunk
+62306 83e6975c319984417ab1f2cee1833ab2ca27c3d0 legacy-trunk
+62307 3307a5450c379a691a2e89a6d1eaa99e33468c72 py3k
+62308 36d0a1e0c024ba9d0076b58d1c1b723f925288d4 legacy-trunk
+62309 b544bb61bca9cabd03378f8cc7b5722d5a81bb62 legacy-trunk
+62310 9ad30ccce49c181cde39bc1f5302fa821cee6ed9 legacy-trunk
+62311 02343ecaf0bb008979dfeaa2544a3031fb090773 legacy-trunk
+62312 e0c3acb116a554c10e6297ec2289ee07a68a882d py3k
+62313 8f2b65ec7bbab78b9d40e484a2fdb58b83badc24 legacy-trunk
+62314 29231a973580ea84d3ee1bfdf0ee9288c56ead17 legacy-trunk
+62315 fc33e75b92570dc3f12f413c464c73008b19d72d legacy-trunk
+62319 7a5a580ba6ea23ba980600c471a15d018171de3f legacy-trunk
+62320 0528279007826d7f8842bf67ddf6eee24a515ba8 legacy-trunk
+62321 85f0e1ac0bc9b2b106b0457308a050837b2e569c legacy-trunk
+62322 47d9bbe1089720cd1e3d37074ea53bfcc09e2e13 py3k
+62323 028d8625409b222dad7cdb69a02fd69f7a65fad8 legacy-trunk
+62324 4afdc68ea52ea58c657f5d450e77470a59a9b334 legacy-trunk
+62329 6952e7181ffc88f8bf916d97239f5a8d74241f7c legacy-trunk
+62330 b420eabf98354597430ad87bcd8729d5700c42f0 legacy-trunk
+62331 7c21cc14b94f5a64d286a3dcc5ab74842fe14f11 legacy-trunk
+62332 03d9c664a7bc8705fd5ce6ffa8bfee5a044c32cc legacy-trunk
+62333 40fdd5cd2ef51d6168d0762825f27fecd2b4a0cc py3k
+62334 fb081025b2230bd7d48f1e13394e025c7e4d5b56 legacy-trunk
+62335 46879e7fc4d3354bef1dd6089d40a27c47843603 py3k
+62336 c744235103618071d6088bf3b7d4c52289fba765 py3k
+62337 72a7648699d083899d23692f1b6e459b1476228f py3k
+62338 b3dca8f5535ec221f50f8b13870d87e731d92ecb legacy-trunk
+62339 61487be6f44292dd38d5ceb2334307df99d760ca py3k
+62340 8dd24741b6aaf0b6243bb67c8801322481bee926 legacy-trunk
+62341 6e4ca9f72bba6ddb2d06e8d780a5ac9828efe732 legacy-trunk
+62342 0fede4d1b14ba2a53b127219afcf2feda3dd58fd py3k
+62343 ad170a335967bab217ad03b50985bec0c0ab0d02 py3k
+62344 59753bdce089849ce1cd7ca9bbe78e8d891e0233 py3k
+62345 24205b1f954ef75e6232d7b6862aa79473bfca38 legacy-trunk
+62346 99bfb8de34b1f6d016136aebe088d77e4caf91a0 py3k
+62347 eab15398eef00acb69e80b3ee152dd1c11cdc691 legacy-trunk
+62348 91b099a7f3e22b83ea82034f84f2f6e6a28d640e legacy-trunk
+62349 981df13aab2008c114f4518574efbbc386ff5ddb py3k
+62350 1841f92e30def0a5b3127f5aa1fb0a03d3e72f34 legacy-trunk
+62351 ef06ed804918a1a40321cadfbd339c89dbee9830 legacy-trunk
+62352 ce5597af99c7d95cbf5b19acf5d00734ac29b692 legacy-trunk
+62353 3e095ab75fc89aed02f0c4d5c79cf878a47e0662 legacy-trunk
+62354 19fd463ea728e40e86f6878bcc255f0d06d094d5 legacy-trunk
+62355 38c831b47dc5bb431cc082e495403d73594bcf5d legacy-trunk
+62356 b04f2052e81262961d2b3d7f7e5150199086b06b py3k
+62358 b723106901e0cf0f3c443b1e1bef3aa8e72d5075 legacy-trunk
+62359 9f3ca19162a738a620c602761a61cbf01d2ea2f6 legacy-trunk
+62360 48289645cdef77ffdeb56cbbb3eb0bcbfb6615aa py3k
+62364 1c9ba4011f5dd85bddea3cf785d84c6b31a69caf legacy-trunk
+62365 07d7e5cdc1a010cf91a24170898087515445651e legacy-trunk
+62370 bc96bac586b4c21fc2b12e2bf2bccf016831efd7 legacy-trunk
+62372 1fef26f89bcea186a5432202d9f0f6e74d2197a5 legacy-trunk
+62373 7cd363df7a846cd182504afde80b588832b5821f legacy-trunk
+62374 5024b12a039d1c7de1a0b23e78b147b4818b0409 legacy-trunk
+62375 8918c51de0108acec7113c65819a391c643b0ed7 legacy-trunk
+62378 4f8261b92fc560ded4306eaaee651cca56de81b9 legacy-trunk
+62379 fb8d3e1f61612d44eff13db0601273015b114605 legacy-trunk
+62380 5bc7b20dc04a9d249a823394576415da7fe88a90 legacy-trunk
+62381 5c43159f5ad0b06599b6b7a39becc9ebc00c6bcd legacy-trunk
+62382 779caa1e0ffb2e0c82e1e73ce7f144d29c23c221 legacy-trunk
+62383 a1997399f8724c4aa33545585d0ed7317e093ba3 legacy-trunk
+62384 b69f443ef4807179cb11b6b52eb365339898f282 py3k
+62385 beb7abcd6c01a543dadf6f8258dff5fb7bde2e68 py3k
+62386 e16593da48989c703dae6736a80fed58e2fa00d4 legacy-trunk
+62387 e029d7c7de81144133fe8a8990509ac77db64c87 legacy-trunk
+62389 97c21417af40ad7b27667e54298230be4fa0b705 legacy-trunk
+62390 b1c70c89c3da6c39c1132ee1306d68847b272442 legacy-trunk
+62391 374833de570c241be0634fe14be492f502f62950 legacy-trunk
+62392 10da2798e58d83641cb0322c57e03883e107f2ad legacy-trunk
+62393 4f718061f45a44187c520b2c606b46faf1c4156e legacy-trunk
+62396 82d85a05923bf39846a4516b16020f0d0e5750b7 legacy-trunk
+62397 d0fa45e637a0500190cd3dfb3e87eedbd5488fd4 py3k
+62398 c3659ce893e7e8bbebb927fbafb08727906b8c98 legacy-trunk
+62399 644a67830061ba35b4f8affb8a2b645212fe4f1f py3k
+62400 648b4d01cccf59558155565b3b3c4fb9acdebcca legacy-trunk
+62401 10236d1d0860767a49a8ee14b1ca5294b3c9ebec legacy-trunk
+62402 da4a87d63b0ee300b201da02fe140ae12fc8d58e legacy-trunk
+62405 385e218d0f6c5ae5b3ff7cc73b804317653fa3bd py3k
+62407 ff58cb5aa76da6009ccd8e21e6a2693f0f4396db legacy-trunk
+62409 f641e505fff46e1765a6d10f23502133cad41d74 legacy-trunk
+62410 35bf8012a376e63d15a913e63829e07abf009011 legacy-trunk
+62411 d166251d8014491677772989ecec67e79683fa24 py3k
+62412 31ff59d984bde2c8e7f83ff56720f65437a20101 legacy-trunk
+62413 80b16595e4626cc84b9277f00a70d0fcd92ed8a8 legacy-trunk
+62414 a20def0101de269e1adadd49e1bed0103c4216a2 legacy-trunk
+62418 f3cf12bd1112846d0aa41512d089be30740e107a legacy-trunk
+62419 73732d66d0d5f7b57353256faf97a9e0ba742707 legacy-trunk
+62420 c78cfe2126da184613686c16e5d7204dad591956 legacy-trunk
+62421 60f4456fa3383e0783c141451e2f36b706b31e34 legacy-trunk
+62422 63965327b3ef65f1bc79f19d18417c9207939720 py3k
+62423 6323bdc2d6711fbf2ad5ccd71cfeec94ed1b77ee legacy-trunk
+62424 022296032d8f6964a0fd5c21366e79d1dcdcb20b legacy-trunk
+62425 fdd5a0198769d3075a936e8e83a7212c9cc63fc3 legacy-trunk
+62426 052fd8f1ca371c687338101e659845cab8cae6f4 legacy-trunk
+62427 406eca2ddbbc4f89f6faac3b3447d27ad389c0a9 legacy-trunk
+62428 df13ccaa5ae97c01d867975488519dd8840602ce legacy-trunk
+62429 6077606339bb9fd02209970eadee86a64ce83528 legacy-trunk
+62430 d3af9fd1cfaff676865eb8c6a4557a3ad8d2c8b5 py3k
+62431 d0b8a90ca2709f5fe93b088a98492f2fbd6ddb83 legacy-trunk
+62432 bb0f58adc91ce0720f0936d59cebe3aa1d095c22 py3k
+62433 ec48490b969abdeb38b06e24992d11e65f1d4eac py3k
+62434 38749c09c5563501d05118ffd351bacd732b29c3 legacy-trunk
+62435 ae554e5d6e06db30fa5693abc7bb4d9734301324 legacy-trunk
+62436 f51953cce6ab19c63236074bc4a28393ee5b2a20 legacy-trunk
+62437 98e072f22c4f3d628f11648c0b73e49380c353dd py3k
+62441 1acd00f2a3807cba601d85b789be5fe2cd1b4631 legacy-trunk
+62444 b7df30ac5b5a2608875f143597829cd03414f003 legacy-trunk
+62446 04928470ad8609a98473d212dab89aafadf42846 legacy-trunk
+62447 bae2f4feefcccacaada159d0a29695f1f6e0015e legacy-trunk
+62448 c44b8ca3f4d2958ca86bf23ba727d0b5f9c3ffa0 legacy-trunk
+62449 b12583643128eacf8547487a3533b339d0c3f230 release25-maint
+62450 434bcceca7df0890e42e2c762b11809ab814f10f legacy-trunk
+62451 108fe57b9a68e1e978f8dfa76199ab2c04b80ded legacy-trunk
+62452 2f0065448883abc59f5a2ffe5924477ca988e53d legacy-trunk
+62453 0941d79ea7d6efb63e0dd2577c52acceadf7e837 legacy-trunk
+62454 88a8def5800777ae1d77e0b234a379b467f234cb legacy-trunk
+62455 642d5712093b80b08e4bd208faae8f2b19048456 legacy-trunk
+62456 66b7993068bda31ee723912ccb63f786283d9872 tlee-ast-optimize
+62457 fb3cb04195e0f822b073df755cabcd692d481be6 tlee-ast-optimize
+62458 14403a54258fc4e89595f6c3de1aac18020e9ad1 tlee-ast-optimize
+62459 0c5824b002633ba461580326275e4d3b9c46b8bd tlee-ast-optimize
+62460 d7fefb35e993ffc94742b09d9a7e87631e7b00e1 tlee-ast-optimize
+62462 c0cdacf07f540d92c8ec03db298d99bec2be9a7d py3k
+62463 fed72fa967bf5a4a31d6726a08fa845f334f3df3 legacy-trunk
+62464 a74654352366ef384f811832415404bb58468972 release25-maint
+62465 98dcad9092a889ef47a914f3d59244dfa62ea237 legacy-trunk
+62466 c9de6705bd112975a5a2ab24a9b89e38eed8c311 legacy-trunk
+62467 2e1ea61c94cc7f1728e89e2abf3f17c78bca592e tlee-ast-optimize
+62468 ed267c6989b6ccb46c5588caa7527269729907ec tlee-ast-optimize
+62469 3c6a25e4dbb5f0f963bb1a6988cfa2c522f6b796 legacy-trunk
+62471 07cf28480ad1ec8362ac502d99d0d10e37186a6e py3k
+62472 3e9b4fa93e5c4291c6f285be0bd1e704e116bd4f py3k
+62474 621a2eacc27c48993c62283d0ac63e70fea1d72d legacy-trunk
+62476 5e636c9d61ae575cd6a45e8153444733cd815af4 legacy-trunk
+62477 a0225600bff149688a5b0e2b52f79f543156e53f legacy-trunk
+62478 3e8a03a6497e17141d3d6bbf1646915aee61e892 legacy-trunk
+62480 459083c6be153ebb5fda6a036fcb6ebc45708990 legacy-trunk
+62481 4ff8dfaec3fc6db943c79ce63cb4f4f8ab72fd6a legacy-trunk
+62482 a51b329245b144dabf8ad813da694ac2159fa604 py3k
+62483 85d4671565c8749cd5bfd38b5ced68b7f0b5cbc5 py3k
+62484 90e2146cb8a308a3012e7380157cac118294aa35 py3k
+62485 95947fdf40ae48aed0fefa38d4afa4e0de8252fe legacy-trunk
+62486 d1fb49aec7651044c9e80e6200c440583bb54bfe legacy-trunk
+62487 8864dfa99c7602ce8f2991aa55a50520d581c139 legacy-trunk
+62488 35119b03686d2d49f31c442338b19cd081a97186 py3k
+62489 1cf3b34df6c60ec0d0408187a66812f0d28d893a py3k
+62490 66c8bd1bedf3232df0e4a2d2b9f00e13c84d0653 legacy-trunk
+62491 8b718fc15f3d6b523162ad2e805f421c2a0539db py3k
+62492 5ba6cbbcaee736453c9abe1b9a09cc8bc2d48607 legacy-trunk
+62497 04bd76e92065432fe3f97f3349281e573c91deeb legacy-trunk
+62498 689863552380731ff47ba932bd2826512cb0f237 legacy-trunk
+62499 ce620cc9a6a86949d23d85b2c95082b64f13a6e9 legacy-trunk
+62500 9e05f15f921b010cdf509cd04cf75c9ebb46a716 legacy-trunk
+62504 0c7ca471fb8d778bcb357b91dcb2553df3cbcf78 release25-maint
+62505 c7382806203130ba41134453807923f2a77e5ba7 py3k
+62506 2a31bc28c10fff0ad83633d66ff3b71c5e60bcb7 py3k
+62507 0e1185bfa3134cd2401e5096065f04fd1397807f legacy-trunk
+62508 0cfc845b852d824a1de9e3f0e0f85a1c66ba3be9 tlee-ast-optimize
+62511 5238327f45bd4042c76b5d4b8cdccaf8dff94115 legacy-trunk
+62512 ffeecbebf3ca7ce76b0f88a5d760092fdfcf3b33 py3k
+62513 eb2746e8b98330de1b102f1faf13853b95efdac8 legacy-trunk
+62514 ad3417503636cf7ee571092b3bfbeac448d89369 legacy-trunk
+62515 361d776d380eb94273c4f43ef595ca6b754099be py3k
+62516 47233a17e9707974eaef48834c01d326581bb979 legacy-trunk
+62517 d58ec38e6db1a958b28a53ffcfc32a01e9bb3551 legacy-trunk
+62518 aef3501d8e776e6907842d0420951aa2cb83e13d legacy-trunk
+62519 06e67cb22158086a04b9434e070687ed7a26995d py3k
+62521 dad88cb6ef1fdd5953be96bf817320a5643ddbf5 legacy-trunk
+62523 edb3c3d660067eae592820326bb70b469f788295 tlee-ast-optimize
+62525 c5895b981d8f0f4dbb0cbc7cc24d64cb79d3a98f tlee-ast-optimize
+62531 6b7c91d9dc511bf158b15c984223fb6a73665f02 legacy-trunk
+62535 f365a018af5b694695067258152465f5e2bddc31 legacy-trunk
+62536 7670005da8c568beb3be4614d17a4fb8924ddb14 legacy-trunk
+62537 d7d5672f5d5e050bbc3de6ea0f6f606138a5d3e7 py3k
+62540 06aa802bfcb18c5b019e2f6514391b6548451750 legacy-trunk
+62545 3d9ddce2da85204770cab757f9fa32647236c516 legacy-trunk
+62546 ebc40e5008698a56d17134b84564d23176b53254 legacy-trunk
+62548 18e9a372a7a3a0cc7950f0126795b8a88e4486c8 legacy-trunk
+62549 84df082dd21678358158a1dcd05f9b6deecea1b0 legacy-trunk
+62550 59db575ae37462565f47d6a45a2503355a0a351f legacy-trunk
+62551 c5dc05cd38589bc30a7bdfca6edadcd37b6d173e legacy-trunk
+62553 576fa2440a0c8d8f889d3afa576ff075b7462b04 legacy-trunk
+62554 d2bb5f1318738b006475fa7df13bc83a56ea922c legacy-trunk
+62555 07a4e171026299cf27a8f0a234d9a51c7a8dbd02 legacy-trunk
+62556 a517eccc783b9e0c81a04e980799ddd0edd18da6 legacy-trunk
+62557 1ea4d1b18aed58d4b5b3da8d0705284a43dec03c legacy-trunk
+62558 4e47548edd366d2b116bf3f1bddfa91a04f5234b legacy-trunk
+62559 fef6d6ba78a4017a8d07fe34974c38c360f91d7b legacy-trunk
+62568 c34f0e609fa6ae430dd1c6d3641e3568b4974e76 py3k
+62569 8d3ad8af692b5a34effc813740785a1077b11ecf legacy-trunk
+62574 6fead4cf79111db0fdfcc7bf34f2ac3f7c60b7e8 legacy-trunk
+62577 7f60b337b0492d4fe7e17b89b71f306a62205e73 legacy-trunk
+62580 0154df250ef6b5094a55ef20d5a3f1cc3fcf7de6 py3k
+62583 e42d39778ead9ccb45875bb36f38fd0dac764839 py3k
+62586 37d645b0152316e41b1184029d36ba6ef6b3bb00 legacy-trunk
+62587 7b4081bec783789f867077ca76a89acc7eab97ba py3k
+62589 cba281b16a8245e156fc1f9b3813b7b48982b6d7 py3k-ctypes-pep3118
+62590 ef421a365a1d4c703121e7c51b819e05674356e0 py3k-ctypes-pep3118
+62592 d6c6f366b22062fd3def2b42c1f154717acc1646 py3k
+62593 8f5c759e019c66cbd0a34579e7d68e0072657f4c legacy-trunk
+62595 3d0d3a680896cdce7679161d421cb21fc831d451 legacy-trunk
+62597 948bea96dd201b320b6a8ebb7fb064f08b3d7441 py3k
+62598 af0ef04401bb2e79b64f929599268f5a6ff92b30 py3k
+62599 7a6d7474ce6e08b07cb6a53ad8f73ecb7301507e legacy-trunk
+62600 b101556b98eae6099e96da33aba8ebf9743ad21d py3k
+62602 01be1c8f006bdd56371ab08954d909ae235a1514 legacy-trunk
+62603 01453571966885c3f4f7ed673ba1adca1df45ba5 py3k
+62604 3036e21ac661dda013e67772d9a39d97a0286014 legacy-trunk
+62605 1423834b72d8d8d26e1733b8776c132f2fba6233 legacy-trunk
+62606 68cfc51e4331efe1b77ebb5b5118a92f747611af legacy-trunk
+62608 65acc55f1a690fa406f70d76f736b90223493846 legacy-trunk
+62610 a40d7e605f9e117a66178ff47a97ac2b5c8d6d64 py3k
+62611 3f2117d3271f7c0f60d45d712aa389cf3931cea3 py3k
+62612 e42fe19ba6fdf37e8f26fa98d3344a2bfd3d5309 py3k
+62615 87d3137c31d436102df76d0ca32a3ce9a5231471 py3k
+62616 3315f6b444030b8787bcea43d66506c499825e22 legacy-trunk
+62620 56f81ea9cb7950d4e62d5e7979e6f918b8982838 py3k
+62624 80bd4baa63981920365a7254573374409e49645f py3k
+62626 ea1a9cf735a5694543368d8417c52198a77a8009 legacy-trunk
+62627 54606ea9f4c7b933842ebd70d050dc3e3cda0a4d legacy-trunk
+62636 0ba12c32e2b569590085e2010c9ee2ed0a6046e4 legacy-trunk
+62638 c4d90fa935eaa41305f1941b54ffbb5e04ac78f4 legacy-trunk
+62644 a1c6f2ab597e037962145ab08dd215c6fc0dcb5d legacy-trunk
+62645 20b707866459ada74a063908b8bcad96bddf0d4f legacy-trunk
+62647 1ffec2a687e9596f48abaa38f3034c9ec6731b99 legacy-trunk
+62648 3f84e6ae36dad29e090a4b4746a03bd48cb2667e legacy-trunk
+62649 b55c5567cc76733f41dc1196eb5551f5ee9dbd10 release25-maint
+62650 eb9dab956a6eb8b80e5ad4afdc233863e1d6d9a4 release25-maint
+62651 80635489e8d83144b4c09d7f944d242e471c255a legacy-trunk
+62652 6d9497597c4f3fefb4c18a6c513b772925c2b486 legacy-trunk
+62653 cc66029d2efe5939abc2644941557bc3be8722d7 legacy-trunk
+62654 fd27ac5fcc81808e9afd91e6ad766b3dde681ade py3k
+62655 032a0a0d3fa9606cfe1871d9bff6a212e6adbc54 py3k
+62656 a859f835ef53da8a261f728017172edf85ad0199 legacy-trunk
+62657 0fdef14981a8e3bb0a1c2d0487f52c7b3b75a5e5 py3k
+62658 bd91000c8e73dc776af8b6c674df2c8a9df75f73 py3k
+62659 3d437752170b52dc041781193876ce0e4db1aa6e release25-maint
+62661 bfa82b49333540971e689f4fd279fa23217900b5 legacy-trunk
+62663 0deb4ab0426e287d96e08c023955a48299627444 legacy-trunk
+62666 ec09ad5bed1acca10c2cd61fd4bbbaf91af621f6 legacy-trunk
+62667 ea594306ea8542b98be068637b0712a7832a1721 py3k
+62668 68b1d44b5f74a79f0360257d3dc8761511b6ad44 py3k
+62669 ea30f03b24f41f821537b6f3c2db0a04c00ee50c py3k
+62671 9418dc4a7b985d5cfbbdcb9d15cbb8802065ea70 legacy-trunk
+62679 5bb94065b07999ce2e3479659e7e370616f70ac2 py3k
+62680 83cc09682081dc0493e9223b852712ffc8a6e932 legacy-trunk
+62683 3390eb7591f6128b3fd664886724f71929c80066 py3k
+62684 c97e36abcdd5956f5b3781dc6933ff30d75c05af legacy-trunk
+62685 acb2a9394296a4575144161a335f858eb24a9ab7 py3k
+62686 1872e1dc035fc329b9e8b99f23c3f07eb04fde7d legacy-trunk
+62687 b7c66d3e2e28db02d6cc7a778ebd673cb2cd61e2 legacy-trunk
+62696 a94b9db9223fcd20d0490e575d3f415e37747c43 legacy-trunk
+62698 aaa0ab490126e02f184055cfc28047d073b36c37 tlee-ast-optimize
+62699 de76be02db425b3e6a4f60b71f8619feba9bbc8e legacy-trunk
+62700 6db392ac9f4eb142b4b7de7464f41edf46103280 legacy-trunk
+62701 b93a041cc2213e589d42a4e4a7722da4eaafdb19 legacy-trunk
+62702 28b099ac4cd8f7b8c751e6d434bd4cf382273b36 legacy-trunk
+62703 6c4efe52d594d3ff4fa01fabd2876981dd51af03 legacy-trunk
+62706 c07f19af554a9f630d7ebfc19502d9f64abd1e33 tlee-ast-optimize
+62707 2e463442e570604c95da8cb43f69997049046a0c tlee-ast-optimize
+62711 fe300a972fb8df287504756958d029b5aef8e863 legacy-trunk
+62713 7172e11e9fc8c676dcf63ffd9955f5d202599b5a legacy-trunk
+62715 643415f91a50c92ff93578992fa8a68519d7e90d legacy-trunk
+62716 031dfe455585ccdd07897b8e6d004f79ca42679a py3k
+62717 c7c25cc9963dd3327838a53955ea89f242ed5377 py3k
+62718 05a817e25f20d42cc70aa6be6cd74652d2e375a3 py3k
+62720 d9071fa8244af3433669a7c7090e6a576607aebf legacy-trunk
+62721 8a9b8b3ce2e12225037110c0695da01417c81a5f py3k
+62722 9b10bf64f1243216b630711c5a828c39c085804a legacy-trunk
+62723 4c90be8a4d3827de4a4325a4dfa9f148e2cf173c py3k
+62724 8e33f316ce140da975863ea4e95dcd8a0b5421fe legacy-trunk
+62725 15f1d232eae913857b824e871a1d3e9762dbe2dc py3k
+62726 10e8ef95b11f9db6184e554091fb8ef53971fcc1 legacy-trunk
+62727 86f73838a4bb71501f038e3944c5ea7369b88598 py3k
+62728 55bf8d690e67af460bca8e5e53a46574b289b77a legacy-trunk
+62734 4ded35754cb721f49612208a0eb8851901fadd30 legacy-trunk
+62736 34a5380ee275ae0ca171715a67ffae0fe05ad2ff legacy-trunk
+62737 88a09804bba394315fe8a353b40705ce77f9c83b legacy-trunk
+62738 b74a3f946a5e67812e9b02f492380280d100f97a py3k
+62739 dac21843cf53514c57f84e99ffbb83ddee6f3d72 py3k
+62740 e19f87a9878c288d3e8c9e2d810377c13661c808 legacy-trunk
+62741 91d5f084170006819265b1d12a0e26e63d0d0490 py3k
+62742 f2a4d8d4f0634cdb2c698f5ea74777dcf8ac7087 py3k
+62744 2729e977fdd9ea7e3edac5331b68f3f78261b555 legacy-trunk
+62748 7106ca871bfd1b675cf6ebc21cac000952462b73 legacy-trunk
+62749 2f351fa53a6b3f0eafe8886b94e0dd7368a45e46 legacy-trunk
+62756 5ae8d54d09528f6556181d5ebfaac71177f202ee legacy-trunk
+62757 11ed405d99cb86f3b5a178585e69f32e9445ba70 release25-maint
+62764 1e8b8df4df83153ddab2787699ceb6a96eb0f18c py3k
+62765 c82f63efbc40831b49cbbfbc8321abed16777785 py3k
+62769 b0fb55ece89fc3ecccc54bcce574400f5a281ae9 legacy-trunk
+62774 f8468bfd4357604cf4998b988c4340eb7cf75e4d legacy-trunk
+62775 ddd5f42332b985632576c782ebb52e6e4f3e8f35 legacy-trunk
+62778 cda816c3a1e46be3af2eb7d8ce292de828d1f34d py3k
+62779 02a8142d83db283737f51f7f9952709417951f58 py3k
+62785 9130b48a7130e15a49c4e128426bff1614debd94 legacy-trunk
+62787 4b19b41ef6064c5305cacb77a5cbadf8bc8bf6ab legacy-trunk
+62788 1a2dbc84bdfcf0a8c4c6de0b07db44eb6bf7e31e legacy-trunk
+62790 f4064b5c8c5d2df4a0da6f2f5042b6ef91ac18ff py3k
+62791 911c87f8ed5e573a6e0f854b373793d15bb060ba py3k
+62792 0c2e4b55f80b97b56d71d034d132911d024166c2 legacy-trunk
+62793 ffdb5f4139fe7a872b2d7c0b8d3fcf21e6cb09d9 legacy-trunk
+62794 10b139d8786021c095ab35953fb88a056ca7b486 py3k
+62797 ceea40daa849079b515ef8024f44604080ac16ca legacy-trunk
+62798 7c80bac7d77656cb71d9ca61ce15fb7efc8474d2 py3k
+62799 c8aa220c6ceef958ad5d8d53231ef0e5f72a969a legacy-trunk
+62800 737a18b2ded365f0bbfc910ca18fdc246dc745f1 legacy-trunk
+62801 74b9c85361f88e253b9f7bb49dfae046619b9ad7 py3k
+62802 7486c29f93a3edd1120618c549f6b034c4e3d66d py3k
+62803 0e5a96fc9422b4e13855371a42b3902873dd9fc1 py3k
+62805 77df991ea63798f5c95c391f7e4ad71402388e20 legacy-trunk
+62806 d1965088b85dd7376f0b7868aaecaf8bd4541ec1 py3k
+62807 8b931a79827a9b65e0130b7fc9a054c7d7600a6a py3k
+62808 5fbd97f1bc35e3c96e3afb0c52abf4ddd5cba13a py3k
+62809 38b94c097a5526f5abac014f74b5f90fadfc7e14 py3k
+62810 d7e2029b3ca4bf1130ca391b46daeb8d8726161d py3k
+62811 b635462a5798f03e552f1cc10156aa53e03a042e legacy-trunk
+62812 8154649c55166201e09d0b704b4cad2e7e395175 py3k
+62815 a9acf18a8e57511c7bea8864ca39e187cc035093 tlee-ast-optimize
+62816 4307eed1f73be9c4b7fb9c5d7de329538758038f tlee-ast-optimize
+62818 b9a3abf59a4546f002d66e418280113c569790e0 tlee-ast-optimize
+62819 a64f40b62169630c67faf4cbcabf647e1c693b08 tlee-ast-optimize
+62820 bb956f4e326ec46155f18f5ceb2065d3026fa602 tlee-ast-optimize
+62821 c53815266360f05ff5a1ea0655c53bb81dbab4b6 tlee-ast-optimize
+62822 4b039edfee6bee492681e7d852f5038c22d57e7d tlee-ast-optimize
+62823 9747d1137083ca53b756afd0a210c66969cdbd5c tlee-ast-optimize
+62825 67ba93ad00fdf1b91354dba11832b36c4bf69f17 tlee-ast-optimize
+62826 2c4558dff53d9064a77a12b7200288fb2f6af89c tlee-ast-optimize
+62827 41e8e72aa9edb1b0b96d09b816dd327fa029ff41 tlee-ast-optimize
+62841 ef47df25423c76aaca44254dab09b6bb7c9ae5e4 legacy-trunk
+62842 9570bc12831444a3b83354f7e8d7785cbc0a1fe0 legacy-trunk
+62843 ad7751a958098d713d6ee82cfc14086a1812f302 py3k
+62844 831a30cd23a282052d9b112e97280855e9579511 py3k
+62845 e3459ad013686cbece73661ebf48c64b5bd037a3 py3k
+62846 6ec5608b663c2cf28030a4b70cc402df31302812 py3k
+62847 acd68277c4dd0127a798210358403dff5bbd555e py3k
+62848 2ef1c381138d573cfd94bfee94a5f6b11eef7277 legacy-trunk
+62849 0e76a8f347695a3750fb6811d55d6dbbd778cbd6 legacy-trunk
+62853 b124e31614ed969336f75e1e276aa59360790fb9 legacy-trunk
+62854 c562402c1c08299269bef368756c821b8b1cba1f legacy-trunk
+62855 c67c09554d2302043fb378091cd03253c33b7e93 release25-maint
+62856 e35935475153377d6727d64e6c52f72c3b84015b py3k
+62857 8148069263aa1f0210cdd0d58f1593fbad4e6ef6 py3k
+62859 aed04239a3fc25852052dc46f3916d605bfe3651 py3k
+62860 cef5aa3ed71335490472866187b639fb5a667fa8 py3k
+62861 48e9fb0a721799877f26edaef01ac6e6029b6812 legacy-trunk
+62862 6b7970aa0dda327f25a83151951d8a7b966eabcc legacy-trunk
+62863 9f45979558a9bcd82196f22c7009d15eecc3444e py3k
+62864 d9d4cef421a2dc44ac42ab8dc8b1fa08b4f3de05 py3k
+62865 d4430e9021c223e8fe50602926b7c21b59cfda9d legacy-trunk
+62866 72be1390ae5f47bf789b4a73d15faed37184efda py3k
+62866 e69f84ee4f3a55022e2f252ece2bad9407d2155f py3k
+62871 981caf24dd8a6aad8c3929ff0adaffb3db95db04 py3k
+62872 16dddfe0a8cdc46623e3c7d0597964121f10e653 py3k
+62873 c8b49d8c3967e7aeda4ae7980306163abe194e02 legacy-trunk
+62874 f2d771f370bd8e0ba3589fa16e1dce2a4bb96e57 py3k
+62876 ca4102414a345ceec809bfa6b5290ed63b683d28 py3k
+62877 11407c1f68ca484c28b1d94691db58857af3a1fa py3k
+62878 eaac5619a21ffc0549cdf3e32b267f3b37b81d1d py3k
+62879 2028fa2fc1ddfcc94ae2e13f1cfac67323d6ca7c legacy-trunk
+62880 e95dd25dfb0cbe0805ee93832a650e0f3550d630 py3k
+62883 5c5b363d2f19a81a9eac5f38015046bf9908cba8 py3k
+62884 9fbc2da54e293de9131c50cc5418ea126ab47d39 legacy-trunk
+62885 047da3f6fd7fd94a2ead77150644b8ff89a26c2c py3k
+62887 cac6a1a334e04cb06c877c9be56d45b8698e6307 legacy-trunk
+62888 b7109a0cd0f9f57a51ff5b4925d0cd4a3c05ce7b legacy-trunk
+62889 a7670afb5c092d996133214894160a7e93a97186 py3k
+62892 6ada15d7990f72689977f43a49c14875231e006e legacy-trunk
+62893 b5a677278b5fa858467c0aedf02743795aaf0e79 legacy-trunk
+62894 b8e7a161611c14f32dbbbd837537cd3c0e496f7c legacy-trunk
+62895 1fb246cb29ae411ee8fca82f5d1810d5e5667026 legacy-trunk
+62896 dfb0bb5faa6bc9f634b0412375dbfbb98aa37614 legacy-trunk
+62897 6be64719a509accbf40c5fd73bd9118835c3a3a1 py3k
+62898 2a173a8b3b13f8ae145b7ad488819d727be563f5 py3k
+62900 fb1984fb182d3b96110e2c171f06ea11b84e8719 legacy-trunk
+62901 224cad8235905f01d18fa55fe64b338c640b9b22 py3k
+62903 5e4bd824984624eb299ebbffd22fadee86f2c8ab py3k
+62904 dc573ee0d90417b79e26e581caa032ca991f3ad6 legacy-trunk
+62905 a130cf48ad67caef1b113394ee90836c81052433 py3k
+62906 5d15a8bcc44566257a73ac53be1fe7ed5524f27e py3k
+62909 8bfe2b06527dad034d3882bdda28ce59285f711d py3k
+62912 b93005712e399ff0c2eedafca3eb723c52db242a legacy-trunk
+62913 5b6ea4dba44c9ccfe1ebcb084c05f8b1df3d207b py3k
+62914 4d007a31b46453d73cb75d413c3c407492c356e8 legacy-trunk
+62915 37675f0c338a6605f1e59930934cc621a72144f4 legacy-trunk
+62917 816c21c762c853f96609df782e1b23cb484301c4 legacy-trunk
+62918 ebc9f66fe99029286349a348b4c691e9cf6440ec py3k
+62920 946fbae4baab566b495eec8bf98e381b635793ad legacy-trunk
+62921 4bd9897dce07cfa11b8b45ccf56f45fe2847a658 py3k
+62923 a89be25072e3de7f3e81d53363db27adf1d242ac legacy-trunk
+62924 5fb8a504fa96f1115b75dd5831f4be13f8f0119b py3k
+62927 15c7220286155c1b7b79bb7340f8d64ed4bc7f3c legacy-trunk
+62928 54e622ef3500e27fb7d9c9fcdad795aba138e2cf legacy-trunk
+62929 84af0cfa7b81d9434e74aab9fc22795939a820fa legacy-trunk
+62930 cd6c6deb7f84e4ec443312cf73798dd48f8e1440 legacy-trunk
+62931 c24438e9ab54fba36ea20ecd51c153e0d0de0fca legacy-trunk
+62932 ccc337b45b2e31a00cf4013e98c64587a27c1efe legacy-trunk
+62933 efb979a4947d0038c9df0cf3b0aa0857833abe25 legacy-trunk
+62934 f3f6a895a555df3695cc9edffdfcefceeb000e20 legacy-trunk
+62938 3955c502cfa3722fa0994217f5228440d5f16ee5 py3k
+62939 17cd612b06da1f84f2c1365e1006d8bec08934e7 py3k
+62940 8b67685a8bc3ee67923a1b7881a037c7f1e81ad5 py3k
+62943 8baeba13ae93d43f0e636926be292d691e9e5ef1 legacy-trunk
+62944 51babe73c0ca35f6a348cf120b0406d5aeca8fa7 py3k
+62945 a444985a675ae4eae460d2976bb69982f97eb20c py3k
+62946 b432506efce7fd96ee8af683146d8faa1b22b688 legacy-trunk
+62947 e0ca74b364e49b55618a823d2bd9eeb41564d911 py3k
+62948 fd0b894bc90c52a44f56ef268707647e59f4d1ed legacy-trunk
+62949 bd2954c491698c142baf536ad3d1ac99144385cf legacy-trunk
+62952 44954d65a73a45dd525a31b4dec5ac4496c1cda5 py3k
+62953 87d854bc1e45e71f0974a8682d109e9c0062a3b6 py3k
+62954 dec531c0acf9b62f9f8534960919c47edb73f975 legacy-trunk
+62956 37b27a25a84704a8ab082a5d4f8e907bd1c40611 py3k
+62957 802519f047545d401129721d7403e36bf73d3d41 legacy-trunk
+62958 fe9b97dbd232d2cdadf879ab7f66cafa3a522433 legacy-trunk
+62960 4c5ee1b38045017e8657b33fad5ea1cf6533a564 legacy-trunk
+62961 91ffd9f3ccec901206da279eb1faa40bdd540ff4 py3k
+62962 c56e83d08d0b0583534ab940ea002ab7e9a95b19 legacy-trunk
+62963 07a35c9a5d3fb8cfdcf48ef1b6a3179d0b9c3851 legacy-trunk
+62964 499875cb6ba2c40d26042fbd04c6d95b313e597c py3k
+62967 4392694855699097147076fb7f7a7f98c7f87f34 legacy-trunk
+62968 5679ce66e74b8838d5db77f7c92abaec8d64a017 legacy-trunk
+62970 8de51daa506fd85496ffa920fcb1dc501064275d py3k
+62971 aa9250e6c40934e05805c18f2fc602d329edf23c legacy-trunk
+62972 76ec675e20b8cbfd1536f9a9da3e63de603e57a6 py3k
+62974 23ec33f667360e4a1509e01a080a910c42800ee4 legacy-trunk
+62975 884f8426cccf78910cb93bdc05890a0dfcc032c0 legacy-trunk
+62976 d0f4c24668f237da663c2f458a2585dd2024c02d legacy-trunk
+62977 be8c43a3fd62ff6297477a6a265fcd4f45dc62bf legacy-trunk
+62978 38938b714018240682487bc0f406ecedd727efa6 py3k
+62979 e3d4de9350fb4ddadf89b6ff5ddbbd77d0f9baa1 py3k
+62982 2ecfc7013eb5c336cd10b239cebba7bbff584595 legacy-trunk
+62983 a1f458b0149f09023a7a70f6e4464a22b7cf8b13 legacy-trunk
+62984 ad7d319adf767ac6a57750a5316b30df7ca915a5 py3k
+62985 41a97649de61757a5a7069810cd28444475a44b2 legacy-trunk
+62986 132f82d24028ed7f7865e770769a5ac4155e4041 legacy-trunk
+62987 451674f86d7544ea2350f064656c73c98d83c9b6 py3k
+62988 7654eb5d0a6701d23b422192aa57900925052cd6 py3k
+62992 bc8b226611dd43fbbb8c332822a2fc4fea58de45 legacy-trunk
+62993 b38ed7c1cab1c19e72dc3607da79a2aaa22e10c0 legacy-trunk
+62994 2d1ef9487c3153832e970874b19d886e8608189c legacy-trunk
+62995 be3c9f8866e7b72c93a9a43013b34c7f0dfb7f15 legacy-trunk
+62996 aac7a22bef845e2a5d3348cd2503a96521d5fe1a legacy-trunk
+62998 270f54e82d2081b00abcdb1520d5bbe35b9fcb0f legacy-trunk
+63000 763d72d000257a28574acd6deb943b7798372af6 legacy-trunk
+63001 3418f2ebce87232f30c66eb09b82b00e3dd8f359 py3k
+63002 6b4bff28c7ba2b5bea8450c48f5376466aafaeb5 legacy-trunk
+63003 87de758dbd64655b6b7962690dcff2c392bac5a6 py3k
+63004 33d4e03b23bade815059c583eb32d399377fbcf2 legacy-trunk
+63005 11a0b221f3726430747d83112746964d2f00e615 py3k
+63007 b6b2cea5d306f7b9714ae930287a2424bcacffaa legacy-trunk
+63008 428b66c04d3a911b239488f3353df8aa1e70d43e legacy-trunk
+63009 60b18b39a3a2e839f6d5f2ef32e7a61ba64cc02e py3k
+63011 2d04e56012edc6fdd876d8a01bce0240e8d07ae5 py3k
+63012 6edaaa77af27686e28373b6c1d24e578fe93eba1 py3k
+63013 0c02e15a7c1fcd2054aa04dd7da57fe3de16b433 legacy-trunk
+63014 2ca7a2798161c40c6a8011411f8c3f7a676c32a4 legacy-trunk
+63015 be1ed62d8b80c7d0708d8f7ca49b0ccbaaec9bdc py3k
+63017 c7d530e8b7f53bcd3ec13cbb045544b2bc246e8a py3k
+63018 f2a63ec5055e6c247e800e41ca5f1bc7bf79ca6a legacy-trunk
+63019 91faae49cbebaa5c8299d373c00d3a74ffc92384 py3k
+63021 1e427bc0f81894fc51bd0080dbaf3a1864b711ed legacy-trunk
+63022 c0c57be98eed6c44a3413b0c7c10cfdd3e839d36 py3k
+63025 c15cf01415f92565ea4ab6966ee3c1f62c0a0a01 legacy-trunk
+63026 d8e000ec7796bfc61e615197d3f0f9739f28f668 py3k
+63027 892f9b2959c9d16561c5e80014d4037edcc66a89 legacy-trunk
+63028 384968d4d65586e0ec27acfbabc4d228319f52be legacy-trunk
+63029 aaae489b9d81c1b4842c4143ea526a7699e1f318 py3k
+63030 2cac31fc17c21faaef39fa4b113e203e14bbbd80 legacy-trunk
+63031 d2345119a2dabdb19f056bd1a7b8714910343e12 py3k
+63037 fb14ff057c096766fdd66dde55869dd71c429aa6 legacy-trunk
+63038 16f16fce53025f62c186bf80f97b9e023b9d5e55 legacy-trunk
+63039 f6388dc019cc82f6cbc851c4f58805c5c48f3361 legacy-trunk
+63040 224e07b65861c256bec0f083f31cd0abe9aa7e0a legacy-trunk
+63041 9c18baa760ad0d0dd918eca74be4f83bef92ef23 legacy-trunk
+63042 b40827eb4b80b76ec3a081d5295f44ce5c001d5c legacy-trunk
+63043 fdef71797e83231bcc23949cabed75274803cd55 legacy-trunk
+63044 dd5513b472dc97f909a6da325ad98fbb55d1fe0b py3k
+63045 52566b445fc755703015c9ac856d264276332e57 py3k
+63046 e5aeb3df174e497ef5cf35483e2f9ac311c43953 legacy-trunk
+63049 d88507588790489e5b79dfbbba0b0d4e8825caa3 legacy-trunk
+63050 877783333eaedfe51a301f3ff6bffa548e0c764b legacy-trunk
+63051 6bd666075e14c8d7e68b9947d0e33b0bda8a9f3f legacy-trunk
+63052 5dbbc449f02be225f9068f0d095125859c63908a legacy-trunk
+63053 c7d1a170c94c35cd0165de65fc804adfe25fd012 legacy-trunk
+63054 c2136c14dcd79409d8e102fd8c39b57d6aadad7d py3k
+63055 f4e61dcdb6f85a4d735979acb18c3d35fc5b5b92 legacy-trunk
+63056 b29b46a439d9f0c8e55be403b92106b80f664d17 py3k
+63057 9c765f4ed51234502f461a2b1e5adf1f3dc1be20 legacy-trunk
+63058 afaeedadbdb36b38c1ca65a75b379b4fba07ebe3 legacy-trunk
+63059 4fb6c0c169ff0b5cc242398e7662a0257bab404c legacy-trunk
+63060 0df616193b98806b459dd9c6d97c89a11b81a0c6 legacy-trunk
+63061 a73e87f15ffa749ee287a79032f425658043670a legacy-trunk
+63062 081f2a66263465b5957da22712adb1429a50b634 legacy-trunk
+63063 7f77db950cb44efd76a7daedd45cfe6c7600d726 py3k
+63064 818caebe373311e19481c818875ac554e84587e2 py3k
+63065 07572a82540fdde7170d33f79c16d3e5598aa40c py3k
+63066 be87b77268660b5d858c5e611f0abcc60851e007 legacy-trunk
+63067 dedce7cb7a5dff7ca220eb50d661f54d42630de7 legacy-trunk
+63068 1fdfb29f4fb83609cf6dc92b040dcf6e8c4fea9f legacy-trunk
+63069 5ccd165f30a4512329bae162f483c18a6d1ccc3a legacy-trunk
+63070 b17b29e60e9bbd8dbe50828ac828a8255333c0b5 legacy-trunk
+63071 49ff1fc00c6c534e1f41afcea22b646626238d1d release25-maint
+63072 67e4363ea2e0674e7fd4623e9885c830a772495c py3k
+63073 ab190f71b9176956051a18fec849e0b9e6d7ddcf legacy-trunk
+63074 e3401f316a3b94b86de45d316fdae6486bf984e5 py3k
+63076 21ae2b65bbbb3697e1685a45095343fde3b57447 legacy-trunk
+63077 76681a6306a8070e016523ccd1373aed0889082a legacy-trunk
+63078 206700d749f0f3239d03e2ac386617f47c7d42f3 legacy-trunk
+63079 bd2c95c165ea4c0d3deede32250a93bc02f5c7ed py3k
+63080 a9495a3fe2e0b783dad51ae0a0ff0de87d425785 legacy-trunk
+63082 e03d8d3e67544f77d7390ecacd8c026382947c06 py3k
+63083 b71fcfd9866baeeb0dedf8c289c48e934301c0ab legacy-trunk
+63084 abe3f305f6c9601db2980851889cfc832a7cce81 py3k
+63086 7e469e3cebda6e0983712920dfcc5971dd7e8780 legacy-trunk
+63087 b710d719a082ad5955a65880acfb6faee0e5dc41 py3k
+63088 81131046d1b09290fcbc0c4955f2b29bce439b2c py3k
+63091 6c15db6ce5daf64bc3ccbfe371e8132e18b4e91f py3k
+63092 ed2c1888e1430141f9be30e4df380bb8786c8b89 legacy-trunk
+63093 ef4ec968fdb6680ef338f036c62213b307fd9fbc py3k
+63094 741b2667ac0b714f6afdc1122b37990cd803d706 legacy-trunk
+63095 f3d0ec0b737eb9c2bfae798225364eb7ac910aa8 legacy-trunk
+63096 ccc663aa4a7644c7e1b5e1a1c543a1591aa28507 py3k
+63097 6a19b9bea18e7bd2e18f0beaf04f5f28f894de46 legacy-trunk
+63098 8ea8fb14df7153dc711c0627d9e0eeae7e7116fb legacy-trunk
+63099 e94574455d9dd0773a8ed9d8d53bbc2fef3672de py3k
+63100 c8b77007a1c14433ecffed386b9f9d1f0c17076b legacy-trunk
+63102 22cdb6ec3e5692a25d25afc8b631301a300f8433 py3k
+63104 a4277c1c98a85412f891e0633d301e8ee4a83ae2 legacy-trunk
+63105 d7c207b80c40aa26f6a01a4c158990c81e94f033 legacy-trunk
+63106 90686045fba8d12f5bb0cd74f0b2acfadc6e73e3 py3k
+63108 a9ff7289082b20fc92a071d1d07e0ab6caa3c1a1 legacy-trunk
+63109 0d4957540c96e9f97d18eb33ff414b38b43aabb2 py3k
+63114 c2ab7a06ed24bead4ec636ec5a2495d432ca5804 legacy-trunk
+63115 526d8cf7a9206e3f64422f31ab3e773f7f44f9c1 py3k
+63119 4c8375574aa9e74610a89629845d81ec36c1295d legacy-trunk
+63122 622a25967228d9a081b783c82acf7154728fc92b legacy-trunk
+63124 f0a285fc201d005e503b46d80019236c3826ac22 py3k
+63129 bde38a7b23183992e81289c3dcbe64cf0adb24a8 legacy-trunk
+63132 a375b1346eb37e3246eef596c8d3820f61a06ba8 legacy-trunk
+63134 dafde2eee3d0d8a13e9692a154410bbc8b7c95b5 legacy-trunk
+63136 c9e5faa482e8baf1de9be25e0ec629e7fa6bfc41 py3k
+63137 b305a96a4be2e44aa116ede0d41f315ebdee8de7 py3k
+63140 aca5c1d1c5694a3ec056f1023b1a5998a72172cb py3k
+63144 a9aa342a367a922d239fcebb54949bdb4c1c280d py3k
+63145 2f14518f300b8fc33a9ec6618f6643f4ebafb32e legacy-trunk
+63149 799321e7e7bb4329176ba371d71ab1b5e521c9d2 legacy-trunk
+63150 c1a68f540d5bc3b3c5873e7d20a836e503764fa6 legacy-trunk
+63152 837de24ac1f7a5fbf577da84b792e4baf9fecaba py3k
+63153 4ac9cc1d77984bc9c3ece3310c0051d9e1d97c51 legacy-trunk
+63154 64d19f2851e1bdf2133220d516443b519077b83f legacy-trunk
+63156 1280b8ec9da3851f6bac9d0c28a12b293ce56e24 py3k
+63158 5a7ccd65e59b3d2eaf79c53d8c57f9c112f0278d legacy-trunk
+63159 089c8d0df77444d15964e828a42148525dde1580 legacy-trunk
+63161 ba23fc157618b3997030a176b3ce74fccb893545 py3k
+63162 39f6f7f172ca8e547c2887fbc44b06af6fa4cf8e legacy-trunk
+63163 fd23e6d177e9da6d7b534a5585c8633bdd8a12c7 py3k
+63164 07a53bb82baa05bdb17c8364bfdc57b0d6da8e42 legacy-trunk
+63165 df11aff092cd84e95aa8aaf85f545ac26fcfc9ec py3k
+63166 6a778c0a517e60ebd8376644cce9476cd99f43dd legacy-trunk
+63168 b3eac3a7fdc3c75184958f15f56d60a599e5f65d py3k
+63169 e997390366069a4974f959dae5722f8d64015a4a py3k
+63170 d2810b8aed6d1fc079167307ddbae3a6c54ccf26 legacy-trunk
+63171 ff9b2057722cb506a948fa09ab0b6ed4de320b3b py3k
+63173 9091637e32b1e3b7d2811a6d5741f8e38a3c7ac7 legacy-trunk
+63174 99f50af692d028c10417a094ad568e83293464d9 legacy-trunk
+63175 92d00f5f3c0d040195e7a9b3879439de37017d06 legacy-trunk
+63176 9d46c289d166051adc646dc279d2fa0952a8ae5e py3k
+63177 e64039bbfe26867e95d4cdebe7ea11ee2bf36ea1 legacy-trunk
+63178 1e573c2cd9be61a1803594821f1e0d692298a088 legacy-trunk
+63179 2ebe2727fc92ae407c674835f01c88916095165d legacy-trunk
+63180 8a49f8ef7f894233a8a10edea7cb8be70a923b4a legacy-trunk
+63181 894144b173c9f62e150d0d99259f3bf669b58a56 py3k
+63182 03b1233bf5fe00c86fde91e59d11a5b860d630c8 py3k
+63183 826aff95cf0bd1b2b48c8428548ff093e117f93b py3k
+63184 65b75f7838f3b730ec57ca3b82981d92566290e9 py3k
+63186 51afd566db2bd4263a4887b1a9d7b10c8f16475e legacy-trunk
+63187 6df0394abbf1bda2b0d7e55fd4765e6bfaa2acba legacy-trunk
+63188 28451b5e816fdba02bebb6b6b8537225ed5ad81f py3k
+63189 62658b0aca0822e4c96857c1e3ca2999dc0beb4f legacy-trunk
+63190 eead08b8e1fd063e1d3eb4855326ef8e7d8ee511 py3k
+63191 a5964ee66193a4b02add092a8968950955a288d2 legacy-trunk
+63192 da6ef110c3735242d71426cac1b4eb422dee4604 py3k
+63194 e8f748472730c7bda097951f8d62c692c8f96b57 py3k
+63195 911a7bcdc17e5910cd3fe88804291cf89eff6c89 legacy-trunk
+63197 75568cdda944709fb167469ff755207a4b3b39fc py3k
+63198 384c54fadaa2fbd3d4666d2cef9f9b775346b9ad py3k
+63199 a9594a5cdf7fb862b449bf7868c2c5fdc7426d6a py3k
+63200 55d8c35322a70db3ae99a81dbef255883d6037b3 py3k
+63203 c26c02a4200824bff25eb1d28837016972cd5009 py3k
+63205 ecdeefa8bb6a8416095ac87daf2e4771ba173d16 py3k
+63207 69da7a4f2f8e2d309b4e7ccd616fe4f183f0ef14 legacy-trunk
+63208 47692f6c815eddba484e22a1d7a7dd32416e6bf1 legacy-trunk
+63209 7c8acaa27eae1d455dcaeea1b8fd4955602bcc84 legacy-trunk
+63210 e4e3b3eba226fd89b67302119fc4177ba2c4d1b3 legacy-trunk
+63211 d2c1ed408a1d76a657015f523b52fe8751a34c0e legacy-trunk
+63212 76477b9788509b49a4926a898404908c1b129ad2 legacy-trunk
+63213 f22ed80289d301479679f285e1aa6689f29bafb5 legacy-trunk
+63214 49038ee0e5b5b530037bc4a9ea4fde3c26c85a1e legacy-trunk
+63215 8122a324b7a5519ddaa4b8495d4e5739deb210dd py3k
+63218 603a935eaada985ab52b1f400e82b1adef6c767d legacy-trunk
+63219 a17585a45ee7ea0f0c84939e6789172e8a285483 legacy-trunk
+63220 7b6e222eada70ab62eb802810dcf17e005456e9b legacy-trunk
+63221 5dd6c51aeedea488c3d2870b0da8e9036a15ad58 legacy-trunk
+63222 8b223d351b09592b03ce794035ab24baa23da980 legacy-trunk
+63225 561e5f5026eb0a44b38b50f384ed7ba2a64c9a78 legacy-trunk
+63226 8760912a9e9fe05904547f08223438252afaf327 py3k
+63228 03d6875bde0ebb1917b18044506ec83805515f82 legacy-trunk
+63230 e536c6501402c117d0ea4ff8390fed48c9f1b625 py3k
+63231 8fb9bd5962e46fa2fc5dfe025defcd393b07007e py3k
+63233 f2c4ab74cc65bcffd377bff8c1606e62bf072d48 legacy-trunk
+63235 905b6271ef118ac3d20400b8f7ad8f5a5080dc44 py3k
+63236 71aa903eb7ac2246e9be6c36e0f52093e0ce3bb3 legacy-trunk
+63238 83e950f29d443366e25ebcd076bdfdff25ba6c7d py3k
+63240 a3b4f1e65cbeae564ffd4c9e12c11f31400f0bce legacy-trunk
+63241 42fc922120d96e8c1e81790bfa7b10cabef4f9d9 py3k
+63242 993d0bc07e002a9b959dbe9f25f205bfaf4e361b legacy-trunk
+63243 c546c40fcece0a677c2f017d3da4ba04754d8fd4 py3k
+63244 958286b15de050d9cca2a44867804f34b027e2f1 tlee-ast-optimize
+63246 f28b70641595f2d16fdf8f06e0550f7322c7fa72 tlee-ast-optimize
+63247 17956dbad0e41e1a4edf62591ad4263ffa798ae4 legacy-trunk
+63248 708214f351fe7d8bde4a9d2210544c30fe172d78 legacy-trunk
+63249 7e18d65938243a5075f6c17fa6d889a095b41862 legacy-trunk
+63250 c229e75fc2249e6ade43b065d1def6693e3126d4 py3k
+63251 35a8899256c2ca7b29393db28191d81e233ddc73 py3k
+63255 4eb59d8bac4d64c8b38a9021676207b0d6f61581 legacy-trunk
+63256 0663f2fab93452c7c3914c9748ace2f83bdd4dba legacy-trunk
+63258 41628f38c5a28874fd60a868145f5d209c7e3bc4 py3k
+63259 6f259a9ccc84818853427b346e0fcc1cdbea0ed8 py3k
+63260 f0a47091c8d86dd2f3bedc9a8b61aec1f8235fd2 legacy-trunk
+63261 1df466702de2a8ad2cb3ca77a100b2a4ce5a1c7d py3k
+63262 aab8b8d4b6a50855cf3a91785e4a47ec32afed8e legacy-trunk
+63263 d5eaa7daec2f47305c15b88f8a60dcadac4575de py3k
+63265 054ff4128f744eedc1de2fd18b4850da0a1c323a legacy-trunk
+63267 27d69dc7279321d0d944fd4f2335706456f08b03 py3k
+63268 5e8932991adfd121c3e5532abf573e8afa4addc8 legacy-trunk
+63270 3aba4425626579efe0698e69628a628f4fe6313b py3k
+63271 62d9ec9c9efd102a754266d220e76f4d9928e3cc legacy-trunk
+63273 f513bb7b8d97e55b81f3b145a5b89f3fedd8eabd py3k
+63274 a092dce6e9d4a961028433dde3b84d0fe3a9db6b legacy-trunk
+63276 3cc0bf7f04b6f5510dfc528c528bad667aac11b2 py3k
+63277 876d2f0e92e4e3a15408a5ff9d63da4c04edc428 legacy-trunk
+63279 e4bb6f174b004447cfe365008bc84f79bf72bd2d legacy-trunk
+63280 6dc91b366d9ffe72ba02405b590dc74d3e24f024 py3k
+63282 57cf001aa2a24e86cbf8a347de88472409f2fd2e legacy-trunk
+63284 fcf5dac51394b8bb4ff7e13ce2488d710f11ecb1 py3k
+63285 bada0e871ac1cf19ef39759c0ceeca1054e22e01 legacy-trunk
+63287 5af38b95a17fae299e3a59da65dbb3d6af3326d0 py3k
+63288 96a876af930a4787775b3ff38d4ff6c7c65883f7 legacy-trunk
+63290 8a10a4119fc27573afeacf95726e0b24b6288438 py3k
+63291 1b44ed1a90465ee4adc404afa3115a4162b8bee3 legacy-trunk
+63293 dc4098ca823e2879bef35be72fab20d490e6cf83 py3k
+63294 d4b743bdebb16c5c91ac5e96ba3b79e93c2dada3 legacy-trunk
+63296 cfa8c618ed353709aa20be4033fd7413e47abcf8 py3k
+63297 80435bc7aac4838f88b5bfa540c229a2180b0bc9 legacy-trunk
+63298 1e55b2d1c93ef3587cdc26c71ef13c1d1aeb87b3 py3k
+63300 59bcdfd27501fea4cd13251ef5a026d1a71442f9 legacy-trunk
+63302 5298739f0a4dfc17f4b1db491eda825112db78e2 py3k
+63303 d4aced33d57a5924c3287a95dc897d91ca1e3ffc legacy-trunk
+63305 e116ca26d8f1ca6bbc00c69a08cca2e99d1a47ce py3k
+63306 ed532ca7ae75cfd69ae6ab80e17087ce054690b6 legacy-trunk
+63308 a7c1b3170113832afa6ea0401151dcffb05e4965 legacy-trunk
+63310 5a4608272c506a6c0428da23e16983fce6f65227 py3k
+63311 fda4d41a07738795697880c7f9eca302655b0a7e legacy-trunk
+63313 1d62d32612d6dcfb2d26462b5eeec9a390f9ad02 legacy-trunk
+63315 a8a57ff6f568bc4e9d36d0ea6c0bc1226a5205fc legacy-trunk
+63317 1356a418830b34cc18ff3735fc0ece66b54c8706 py3k
+63318 628dd5ec4dd2e8a784a20a2b3b8aad09314fd5ae py3k
+63320 1573c776df82ec555e8bf7878fcccf92821e74f7 legacy-trunk
+63323 d5929cf868cbbb5231b19143e9b39bc09f63a55a legacy-trunk
+63324 91896227272a692b51d50a0b513c2c90e8c91770 legacy-trunk
+63325 8e0017986f50ee64a17e87f8cca0a4d78ec20fd3 py3k
+63326 391979af662bc48dad67444e4aef26ef9f9cf691 legacy-trunk
+63327 e68e610862beb5f9a5712cddb332a93595e2cef0 legacy-trunk
+63330 87a79352342c6215eace0f6cce43661755566c8f py3k
+63331 081c15806e287c036616a5082cf7a4beb9150697 py3k
+63332 0d54c7056468b32a68a577f392364b3dd96a5ae3 legacy-trunk
+63333 397f29dd82bdc5dc4ef3ff5b706605534aec7317 legacy-trunk
+63334 31cc8e1a8fdf5f237f5e9a96989399ff92c1f6b5 py3k
+63335 960ade856078d65712ad67f4066ec467d0822e76 py3k
+63336 ae16e94bb03ae8edfd703648ee5c4058e6fd3ee4 legacy-trunk
+63337 2b8f744db79b721587ac06dcba55d78b3265284d py3k
+63338 6780f01598a2344f79e73f1d25617d3fb53e28a9 py3k
+63339 8d8e06f4be1ff4bf6e4252dae4570a43bca826da legacy-trunk
+63340 0c7142c56d7ed9ef57558b9832c0a694ccfc5b20 py3k
+63341 a8ae2aa08e7ff5305f875ec92c49460133760a7d py3k
+63342 3c03e9b466984175af8f86708eadedc0e761c9d3 py3k
+63343 593b649904b86636040ebbcdb1b41d161c383a5c legacy-trunk
+63344 3656873985187c8812e3bf69260d7cf294d1bf8b py3k
+63346 2e2c712fe26d697dd66c9cda035a620fbd7c8af8 py3k
+63347 57f61dad7b3b4f3f38b4e68e6aed1d73912c3081 legacy-trunk
+63348 3407bf9dac387a4c4ab7cdf0bafdaa6a881bce9b legacy-trunk
+63349 58a0d5524f9a3ba9506153d1bf02af48dad878dd py3k
+63350 98f68726da02d50a6b59cc48b0121bd5707f8031 py3k
+63352 b630729571e668f4e4e072686a7a2ffa8c0fc9fd py3k
+63354 9ac11043b395363e18ef03dfac96c77b7607ead9 legacy-trunk
+63355 947caee2399ef1f891d142390541eb72fd8de9e1 py3k
+63357 3df090ed48103d622920945fe7f03e746c9c2f4b legacy-trunk
+63358 d6fe502336260f60134182de2bc9d9de61724035 legacy-trunk
+63359 4ea99309e5254c8b56a232d8f650480c15d18be5 py3k
+63360 4f1a079df427cbd9e83aa8feaa901b9b1e3abaa6 py3k
+63361 b0b32732f66eb7be260b7cd144be3f9942354414 legacy-trunk
+63364 ed13040ac2e6e5f784798faff19ddbd1dd53b9ae legacy-trunk
+63365 ff2dc02ba41aa3d111338a374faeef730cfd435c legacy-trunk
+63366 45650c25a02865266f36736f24c544c33a497def legacy-trunk
+63367 54fd0458550c6a75036215dfda550d492836eb23 legacy-trunk
+63368 aa8e13279b5b1ac1cc55e5ff747fd4f0621c9986 legacy-trunk
+63369 a2cef9e89b7c2e6983e23d5d09fa525e7002449b legacy-trunk
+63370 5d1aff46cc0df1e383b3baf1f0a22a15db562e36 legacy-trunk
+63371 b2403d470b69dd7c8bfbf06857e7d916ab618d2e py3k
+63373 dd0bcc216fe35920af446e2857354c79c3e3f41d legacy-trunk
+63374 3b827f3647cb18468ab64068a5982a9f6e37bf3a legacy-trunk
+63375 893a4dc17a91c5eba137353725be666c5ea5e75b py3k
+63376 88bb9df385dc0d750600ef36f84c85b7a33e44a0 legacy-trunk
+63377 0f15735c1831f54ea0fad5c0a1fdb27dc77868b2 py3k
+63378 63741c7521aa0c2233cfa8ac41ae5845894cd6bf py3k
+63379 0e67e21a411320c7722fbaf3c54d7cd5b8132ae4 py3k
+63380 5304046bb358d56015cb697505df32a739fb9616 legacy-trunk
+63381 abe35a87b01da30311b89735ce96edd907414bd7 legacy-trunk
+63382 60b85924ec6d028e6a2fb87c76b5b440ce197cf4 legacy-trunk
+63384 ce7aa88b669ea10dc1cc795ac0b4e0f2204e267c legacy-trunk
+63385 a02bc2a84d19ccd0b802b848d28476d62000f343 py3k
+63386 880fe8877df978b9ece0927d22276ae4b917e6e4 py3k
+63392 ab80bbfa6f0c089254c5e56a9dfb31d61adedfda legacy-trunk
+63393 be581acea4e73996b374877794e1f147d949d594 py3k
+63395 6af64512294ad09d727b1f0db1304d0d55672d26 legacy-trunk
+63396 42b78e0e684807349621504249c65d18b8a302c7 legacy-trunk
+63397 84bb72d90bc72529638153a7fd5a85d6d3fbedf6 legacy-trunk
+63401 0680797ae454629e057ff223e26db31230118ea3 tlee-ast-optimize
+63402 2144c9f365c8faaff313fe5d2a511f9ab42eda1d legacy-trunk
+63403 1ca967566880e8064203bb23a780f87b7285c6d2 legacy-trunk
+63404 6fbd06db70776016d035e2c57583bb3bcb0527a6 release25-maint
+63405 6b7977314c02fd61b7fee2acd74cfbe5628db47b legacy-trunk
+63408 3bbf44d3236122acb9078017a4936bff8e31e7ab legacy-trunk
+63409 f2c03d71597d48b2c4b963b64d0c267faba908ee legacy-trunk
+63410 694d36fb6f4dfa26680c41623ce71d800065d06e legacy-trunk
+63411 a97eb177f3a779cd9a4a90bbf6cf5a52b7b12c0a legacy-trunk
+63412 ac93edc396a64f94b027f64d340392a6b8da25df legacy-trunk
+63413 b66050db841f05bab2823f145f5e51c42f45d176 legacy-trunk
+63414 6836e8f1dedbcd46f03d9f7999d218ff25921d33 legacy-trunk
+63415 7460415da8fec76910286b7e933dbc8d9aa533fc legacy-trunk
+63416 f3dda9d3668fd3323b7998ede17c521e6fdcc662 py3k
+63417 d63344ba187888b6792ba8362a0dd09e06ed2f9a py3k
+63418 ef4cca2d61713d33c2a5025235d4030e3695d02c py3k
+63419 24961888ad956ace80727562e7557c6a2789f781 py3k
+63420 8a74612f3d2bae1dc22bf5604fc8cd412de05674 py3k
+63421 d6e1ea21c948ec28851f87ee11f5229a9e3aefb7 legacy-trunk
+63422 9240a59a25e9ddc422c35848307a13b057baa72f legacy-trunk
+63423 cce1b243c11d1363d8171204fef8ef3ddd17b7b5 py3k
+63425 7118fade575b9ec1ed29810dc3bc3f862af642df legacy-trunk
+63426 64f3873438b1cb2645d187bf4ddda4edfcf581ac legacy-trunk
+63427 5ce904c90e618c75b142e3d0b441f55a6be4b45e py3k
+63428 d953ea58cc8bca35e42a97fdfadfbb6e0871df92 legacy-trunk
+63429 7a1dc3e7c79b524399eba3fd809d3010a70b0515 py3k
+63430 801a09dd0eb8abdf9b2feb7595cda460aec1705a legacy-trunk
+63431 ac59fdd80e459e68200d26da0aa1c46fd729acb9 py3k
+63432 0aa1bde9d194a97d6257f441edb46315aa380d75 legacy-trunk
+63434 33c7fe85e35dff6002d9f9fd2b9c2ee07e96515b legacy-trunk
+63435 12c229d021cc2c60a4669c224eac7812342cfd54 py3k
+63438 f862dfaf9a4be3a305fb5ebd9d74e40718029711 legacy-trunk
+63439 7296a2fb4786dda907b46ecd8619c18cdf74f47e py3k
+63440 3d5cddc6e5e7fc500368b52ca6c6f048d23192de legacy-trunk
+63441 585f7ca38a85af8097135c9372f507247a9cdc71 py3k
+63443 bbd30c492a998c3ed6e17080742eb2b26d5fbca0 py3k
+63444 cdb75af2385a31fda693d1639efb8616459eca4e py3k
+63445 9f354001ea2527115da5f92cbc56548dbd456973 legacy-trunk
+63446 efe22eef26be3e275e7b08e51eec6f44e80ef048 legacy-trunk
+63447 20b1c5c4e30445f2b6a87c68cf12af2c9ef6b7b8 legacy-trunk
+63448 a938529f4d6dd3a21891327280790bd720c28234 py3k
+63449 2e9f572b73227a859a49cd20d415fcd1eac62b94 legacy-trunk
+63450 b86b29e0cf329d10c18632fda489775ad6e21a5f legacy-trunk
+63452 30f632b36868e9d70ead2313d5615b41925a9409 legacy-trunk
+63453 37499287f758a72db2d2a9b3903f0ffab1861cbb py3k
+63454 61a675ba79060259c7a9921d01d94931ba8fbaf7 legacy-trunk
+63455 36c71d3a6ef8c1e88fda210dec384deabcf564a8 py3k
+63457 3071a337d921f3ebaee94224677c77f64ce80bd6 legacy-trunk
+63458 6a6cb9d4bf94502d3988f3ffafd805aa19787ebb legacy-trunk
+63459 796cb93c9707f7bfcf8923b167b98ed5b34bcd5e legacy-trunk
+63460 cd91daf0327c6ed1e252cd6209121c35edbfbb44 legacy-trunk
+63462 12ca1e820282bf49c5d97eefd97727aa1c190523 py3k
+63463 4ecce8fed6e1db643faccdae69083b6742fdc071 legacy-trunk
+63464 95cb009366dcb93095e5852b2923e8b59b40b9b9 legacy-trunk
+63465 8b628ca218f3d6c3629beeca59077c143add9513 legacy-trunk
+63466 a1f70435d8e373f960b9823ee2fc72b63fe94ae6 py3k
+63467 ca8d8c8f296032536eec0898fdff150e8f7f4bf2 legacy-trunk
+63468 85326fb755e2990a1dc0b0a48d321ad63fd1df44 legacy-trunk
+63469 e80850055b93172c140ba212acca3a1e7cb0c9ef legacy-trunk
+63470 b83d7d029e0e175eb4951620448724917122def1 legacy-trunk
+63479 63ddd3ee4a2d1d7828aac90050c47049fc7424f0 py3k
+63480 85ba087c0cc74b2cf75e0da001078fd840d10281 legacy-trunk
+63481 454d38c1f47e91a8024e6afacdc4636c51b553f5 legacy-trunk
+63482 eaaa19e949983c716bb056a07c769ab7e8372839 py3k
+63483 d17fac896a0bc6bffcf09eb174ca90f1cfba501a legacy-trunk
+63484 77557216ba321a161618d7b973389feaa975d701 legacy-trunk
+63485 d5dd8a85297056aecd7afc11e11c5e3c98ff5f8e legacy-trunk
+63486 5cec436d64a2812af752a0b9f25f5615900d89c7 legacy-trunk
+63487 b53604fad54b0e662901a7ba5b411a77a40f1a71 legacy-trunk
+63488 ae19120232b4a8e33905664e1532e3e8b58a83d7 legacy-trunk
+63489 7fc96d7ecf2ed71cc1f176d2b8ffcbe1b850f74d legacy-trunk
+63490 51e324b573b09946b7f12a75bfd5d5b720084e75 legacy-trunk
+63491 a8f1583b78f6fee7176f7ce2d08f30cc0cb08590 legacy-trunk
+63492 4ad4bef91e8e7f4489e971e16829060c24a94bac py3k
+63493 f419b2e96a987c1d36c78b8789a26c38ceabd051 legacy-trunk
+63494 173e5e8b3e59ed2a4a0baa10b990415b096266ce legacy-trunk
+63495 0912511b989762bd499dde0250739c07108ca1af legacy-trunk
+63496 32bd18709dfdf004eac39a0ea0ff0b76538c3934 legacy-trunk
+63497 14eb804b3fc7df1c3236fccfc1953db00e044532 legacy-trunk
+63498 59ab2cf002fa8b5ad68782ca1c587e9c32b68ca2 legacy-trunk
+63499 52a66373437d3237c4f9b2f2eadcc6b2b826f4b4 legacy-trunk
+63500 12c56d2eb4d9799594034057a101615b6ce7fbdb legacy-trunk
+63501 de11bf84491d6ce419521cda6a423f80bb220acd legacy-trunk
+63507 46bd8cfa754c589a365ff813fd712ea18223e3c4 legacy-trunk
+63508 3291ce4928bc44626c6f20cee3a692518d53127c legacy-trunk
+63511 22d2fb761ac1d3492997c33d21eb1335d58d7c73 legacy-trunk
+63512 9c930a32cebb2578ed3148c255d6b7ebd0bf9313 py3k
+63513 538e410c0088317f0ec25ff33f5ec474e01e0e6e legacy-trunk
+63514 55a50d391ba9a83927aef066a13a824ceba0fbe7 py3k
+63516 2d7fa84c878db592ba595ffac87dfd708c2cee56 legacy-trunk
+63517 d290050ed8b22a2c6172092e2aec1e843c29001d tlee-ast-optimize
+63518 7aa9ad658014a43bc460554867881e6c04f99f33 py3k
+63519 9dbca2754b406c3c22e6622faa1029f7f9e90bd5 okkoto-sizeof
+63520 1d22723a5785246d6f274bbefb9087665b6d55a5 okkoto-sizeof
+63521 36077765e1cf458a0c709854662e0148384cd4ac okkoto-sizeof
+63522 7798bc86aba32a15e7682e89207fe366250b2015 legacy-trunk
+63523 8c81faa210c1ddef2200df14d3f6e8d2813967c5 legacy-trunk
+63528 5be2d82ac5acd5957877d8737be5ccd62db03254 legacy-trunk
+63529 cdd0000631cc785ae380811fc47bac88e0a6324f py3k
+63530 2c34f19e3922a6ad14897bfb7328c4ba1f292645 legacy-trunk
+63531 c6dbc4323a22d25e505298de952b25e24ba6cb57 legacy-trunk
+63534 81c3a6f9d85f0a3dc2a63c976ae84f809d6d4b69 legacy-trunk
+63537 4f6ea5c59ab31ba5f05b979db98ce406a5608931 legacy-trunk
+63539 38a97dcc2c9c5a93ee90db40060cfac8c03a2d97 okkoto-sizeof
+63540 7114e1efe3f9674e92ce9d364b74c4f3fa9421ff legacy-trunk
+63541 c534b69ab871d5a12861b4b2afbd4a0e6dc94e81 legacy-trunk
+63542 2fffdedb10f8c482555c5413e2c99f6f2e7579cc legacy-trunk
+63543 e18523f842d7d13950dd998a215be5fa4f09e30b legacy-trunk
+63544 5a29552412fa2bc6ee8a202b6b85b27705816720 legacy-trunk
+63545 bb04332c7f01782bfaf29b32ddb16156b7c9f099 legacy-trunk
+63546 71deee6b941e93b895c1e4cdba6576d9089fe12b legacy-trunk
+63547 9fbc41abdd4bee0b8f4e4416243c95f4f4653b42 legacy-trunk
+63548 342fbdccb7d969ffdf72ea9bc0be72c1d5b994c1 py3k
+63549 99176b9d90b37ff6fd71bd14e035f5fa75953a52 legacy-trunk
+63550 e2bef44f457ddc2374406702fa3b5f38ff646785 py3k
+63553 594828ea03a105ad43ecf6a26a3017a236417b88 legacy-trunk
+63561 a30fede87643d5bb016daec46ca277fb852f06f1 release25-maint
+63562 5ec9528c93deaa56df9825792a3d7b3701c4840b legacy-trunk
+63563 5d19299ee3463ed7d379844ef428e9cb79179d5b legacy-trunk
+63564 c5a85e4f9e8666b3dabfa6c7f36027899da433b0 legacy-trunk
+63565 a218d5cb258b2083132823a09ddf92d9558b0b1d py3k
+63567 46c6b9789ddecc306820f26f0a691e96c555a2b5 legacy-trunk
+63568 034d6c9e2671f9e5d33b38c50b8340d806d30dc4 legacy-trunk
+63569 27c0d7351ea8dfac4ad3267b3bd6d11c5febe47a legacy-trunk
+63570 727fdb9061913e262b837c2471f2ca56346a9c33 legacy-trunk
+63572 5568005d22173225b70641eeed3f2ccfc12f0bf7 py3k
+63575 0d0d9641f9bd977a5579505a705dc85fbce4933d legacy-trunk
+63576 45ff737671f6339da9c55a4dfe47f49bcaf44290 legacy-trunk
+63577 6abc63c615265f91e2a906ca162fb64bafa705b6 okkoto-sizeof
+63578 90912b10ae72f38cac3d129dab0fcf52b75eaabc okkoto-sizeof
+63579 fd1a2f4996ef1690c53fb387f0b25ac269036c2d okkoto-sizeof
+63586 28cf99c193c7d56f20138d44655a7ded5b7f24a1 legacy-trunk
+63587 0f5f32bcdc8fcfdd151150edfb2d2c5f15711561 legacy-trunk
+63588 05aa21d6dbebe6299fbf9654f7f1990ec73d67b4 legacy-trunk
+63589 ba1fa511b72d1fc4b1755502e954f7f4f41f5e95 legacy-trunk
+63593 218a1086728ab6877007c414a4694e32c2aefdcf okkoto-sizeof
+63594 87b1441889a5332f16968cfda93a16133b6c46be okkoto-sizeof
+63595 f5b029020e023ffdfce5a16b6d1c35285a716c5f okkoto-sizeof
+63596 680bb9dd580744d1b7f43ec2d1e895b4918a08b0 okkoto-sizeof
+63597 0fecd386793e620a8d11b5199d068cbf500571d5 legacy-trunk
+63598 339e1718315cd8634d78b5bc5fc19ad657742704 legacy-trunk
+63599 3767a5aa956025b8f9eb0c0eb037218d82d13639 legacy-trunk
+63600 cb1c89a44edb653442bce93a19d366598210043c legacy-trunk
+63601 71fdbcd7baa9a6a77532a4eccfbf68935c100ad2 legacy-trunk
+63602 260b62aafcb497bd980dc3c952cbd9d2623c13a2 py3k
+63603 9acb314b907278f0461ba0e0cae45c534386826e legacy-trunk
+63604 73b24127f7b63df9772839492da582a22514733f legacy-trunk
+63605 caf3acdfe5e438d60c6827525da59163c32d9f24 legacy-trunk
+63606 afe148a4ad27dfc516b95af6acd8836cc596a18d legacy-trunk
+63607 e534ee0a4cd0441a701cc3915635b6093106d455 legacy-trunk
+63609 80659b9a4cd7d3b631d166f2846afa1321777713 py3k
+63610 1546c1fb8f8283466c8b975cc025f81124a1a32f py3k
+63611 d1259ffb103c28ce55b9213e7fd210b88c6f5eca legacy-trunk
+63614 d5591c16b997b1a03fe12e2290690ebc1f37227a legacy-trunk
+63615 60df8f658575acbd1f02488d85441fedd9d375bb okkoto-sizeof
+63616 895708b056b7bd4210df6feb15412c5ab45aa29e okkoto-sizeof
+63617 9670262579611f1f9a66bd3d3d67640b29702628 legacy-trunk
+63618 009119eb4d2d80019e68cd5258d41b7804a4d61e legacy-trunk
+63619 d688f3f7c8dfd2e0e3c1e5b643019cf0ebf9a727 tlee-ast-optimize
+63620 770e4e132775aa0c5daa5751379dc7b29ab1af7f py3k
+63621 49906d432b47bab03e412de88cf65a3debbb5d75 py3k
+63622 560c97398b8e534ef6d2d120eb5c81d760f803b1 py3k
+63624 38b1a017dbf60071cafdfc0485044ea44bb5e0dd py3k
+63625 813e0f8a741d59bd5ca7b65057655eb9dd742517 legacy-trunk
+63626 26b359e237b54d9a6db80532e648344e082a41f7 release25-maint
+63630 46f351ee9d5ed413034f2e9f37534ff41a281dcd legacy-trunk
+63631 7fe3a8648ce242f5b2d6cbf1703bee8c4eb9467b py3k
+63634 6edc80d42021147c52abf7f9257be4231b2bb252 legacy-trunk
+63635 93826b35facce66bdfe1ace4a0b79d1cec026eff py3k
+63636 82725438453ba9ce67a667cfd05f1c48a2b5e9ee py3k
+63638 316611fb12682f70b4d576170047d8a98da6980d legacy-trunk
+63639 5119bc77bd6dde3325846c931e70db4b26000058 py3k
+63640 40a1630ef2cf8461a1d16f4a796cabbde7942d22 py3k
+63641 7df4ba484058fdcf1119a24a0a017e7545261e59 py3k
+63642 1c51abeb925fe6845ac2bb4c106866165b330f8f py3k
+63644 ae01869f62be8bef5e662bd8202ebe4299fea1db legacy-trunk
+63645 d7bf2669fe66088a44f8f22db6af8f78efbf21d7 py3k
+63646 08ce192f24b042352b39cb060417116c6dbb4024 py3k
+63647 f762a9ab69dd18be9402f2830dd35a75a9c8e3f7 py3k
+63648 c9d717b5b7a246c4a26c36030f023e94099000c3 py3k
+63649 65953ae98122793df873121b5665384c656a3c9a legacy-trunk
+63652 8c2f5aacc1bc983c0c7414867414d092cddfb8f5 py3k
+63655 70f9a5db279c20f23e18f51cb6047ccb1b145ac5 legacy-trunk
+63656 f28cbab11acd74cb0174f81bb796d1916131d71b py3k
+63658 e2420261d4a300c55811ca6ad70659ff4fb545c9 okkoto-sizeof
+63659 5411b6a226e5ab195287570ea7aad3959c2d4dfc okkoto-sizeof
+63660 0fd553ad53f64641416f94646ec0f66804f4a431 legacy-trunk
+63662 afbde360dd1a95daffc648c0d6be1e3e39277784 py3k
+63663 6d3e1330a3aa84ad746533eba2432e348898bbf5 py3k
+63665 e725ff18342b13fcac0af86fb7b71a7989470712 legacy-trunk
+63667 346a99df5889aba4dc94d5be433dc9e8b5ac6bde py3k
+63669 0a45508143207dd82ad6297d6dc6add7e808ffcc tlee-ast-optimize
+63670 0b974258e15b832f5a6b09f16cb8b8f07062afad legacy-trunk
+63671 b9eab749ba660075fb335b9921f1cc3b8dcdaebf py3k
+63672 04bd3690fb1fe5a381564f65ffd314786a8fec9b legacy-trunk
+63673 abafccfe7501c231cd86bb3e44b411cb66322565 legacy-trunk
+63674 3264aaf7cf303f05ba722fd23cd22e2b19f51b5e py3k
+63675 4fe192d4896032f35606005cddf1a11c53cd83d8 legacy-trunk
+63676 653d04f30428771d6ada54bba64dd829cc530ae6 py3k
+63677 e9239ad7b8c07027cdab9de5038b4ff609886f77 legacy-trunk
+63678 4d98ebaed27836f772a7cc29c7b076c4ec1a6c87 legacy-trunk
+63679 194bbf04b0154425c153ed9373b294de74e69dbf legacy-trunk
+63680 2ccb34d537db64e650ec1e03a3856625e4b29cb4 py3k
+63681 96b34263e448d4cb37f5faa2ea2293164247d80f py3k
+63682 23ab586c427a37e21f61de276f032a2e2d820586 py3k
+63683 811a80651232e8d0854ef82628c656f0a7062f54 py3k
+63684 8cc3ad8bf7c4e67ad396e7107385ef1e2ab77147 py3k
+63685 e3e0c1a652049fe9fec75ffa75d1703d5c0cb36c legacy-trunk
+63686 708a561279cab4611c00d1c3f49740c307c9d030 legacy-trunk
+63687 9a0d4dc07c8954cabe48793d603b19c5cf4e6537 py3k
+63688 34e41f4e962f14c1da55d494b534616095b375ad legacy-trunk
+63689 4ab3e7ac8bf4aa3660420817dc655442ad86682f py3k
+63690 17b8f445d0431ed0fc916d180265c078df2b0bbf legacy-trunk
+63691 662d15af52df66654eb546eac8dbb8bfb7eb5b83 legacy-trunk
+63692 a946bf76665440865d02f8d414ed257e4762798e py3k
+63693 ce9cdcebaef0247bb8bac8f6a1a608b15e2f08dd py3k
+63694 a6d617708665af67dec90a691512728812ae68bc py3k
+63696 70104a3e1d9d39993242c7ad8bb5d67b3c08795d legacy-trunk
+63697 bda15859f658f2210fa58ce9db5971612ac73447 py3k
+63698 c5604be7acdfe0a3779b2afc504fd9c8e58716e6 legacy-trunk
+63699 ba8015e23487205443c2b564b1b8c6e526e43da6 py3k
+63700 e1fcc3881cb6875b4df71c1310e164c3dfaf5a71 py3k
+63702 e017e1fde3692e29eab009f584ad46da900b4a5e py3k
+63703 3975ec2b0de2af242575a9939409fca386f6f666 py3k
+63704 fcd456ae515ba88186d2169f7280be61a2cd7e0f legacy-trunk
+63705 027c887e9da923687fa67a8479e4684290bb1fb2 py3k
+63706 bc4df51c01d5255171ed62fe94cb548c2e8b1647 py3k
+63707 7c5b5f0eb30d950b8f0e512f9be05f3b77d0629b py3k
+63708 dbd9ad52b4d0e9fcf10719b2b5c4cfd373a33792 py3k
+63709 79c7e848ea17cc91c5265fc5eebd63fe014d60f0 py3k
+63710 6b973d936b0797160cc16b5e471568f56ee8aebf py3k
+63712 c2a0a708462eba27a1b35030ed3f5460eeb78845 py3k
+63713 06193e3df416f5b272c985df553503cef19fe3f7 py3k
+63714 8ff0b925ea648859956d99b61adfcc6964a90a9e legacy-trunk
+63715 0525cd5b258290068f7fdccdbbe34b7bcacc2ccf py3k
+63717 6f1a632cb2e532b83f9cb5b7af978fd2ce12b6c6 py3k
+63718 3c70d68beb30957a9769c7f0a3fefe0c802918fd legacy-trunk
+63719 f61b6c31001cb5fc620e50fa031b30262307ed21 legacy-trunk
+63720 789e0f15c37b6f627aa5858ccbfc39a15ca51443 py3k
+63721 2f9319169fec9c630d8338f194b152e6e6cfc69e legacy-trunk
+63722 597d8fd5693e4396170a552add36c00caab8254a py3k
+63724 273e8de34603dca27dec45526c2322af205fc2c8 legacy-trunk
+63725 c4a458ecd2ed7f002e1dc0adbc2219ceb6207924 legacy-trunk
+63726 f6c88f172bbec68c825698c8af6f0154a5fe3893 legacy-trunk
+63727 c91b37dbba3f18bdc3604763298006f9fb337536 py3k
+63728 a8cc8e6f0c1a6900b49d615ecc171d5f564c2b0f legacy-trunk
+63731 61a5697a762651ffeebd1b64802b7c2400767e6b py3k
+63732 1474f25128c44eca803a3e950bdd261787b811a6 legacy-trunk
+63734 e1a4bf91b2aedc40e4d0bb5430a566a1a4c4dbe0 legacy-trunk
+63735 23379695b4db280c47dcbe531249db6944bc50e2 py3k
+63736 343aaaa802e81042e5ec9d5710a65ecfa8c993c4 legacy-trunk
+63737 dc27b3b46f0dfc20c95fa866241316162ff8e37c py3k
+63738 e4104597c2a3ef762d9621bb59924d575ebd4d90 legacy-trunk
+63739 51c63b7ec1a8bcea843c965a7d43a6bffb155a32 py3k
+63742 502e72f28e9ec7d55240e51dc3a21854e89acb35 legacy-trunk
+63743 f94acab78aa99d7be353df410bf6288423c6672a okkoto-sizeof
+63744 3eaa7236713fa1765ffe362fac0d60d95a4dac32 legacy-trunk
+63745 4a7f3480f454db767de2424f904c7b0e7398f9de legacy-trunk
+63746 4d3e95373d9e240f15d63cb6b5a836b4a469fa5d okkoto-sizeof
+63747 434f1d5acfe4ce85ec3d8fc3c27e0dd40d63c248 okkoto-sizeof
+63748 84946f4553f1399ff5a7bf588032ca65244e3533 okkoto-sizeof
+63749 493b32c7d1212277ccf90d1357d2eeb0c41f7d87 okkoto-sizeof
+63753 4ee29ffd2856865a54a1e54f2e8af13ecd08196d py3k
+63754 77f8ae8fc70b4a09b55bc9c35778d00700f9bdc6 legacy-trunk
+63755 67f4b7767a0ab11aad3a6696965415799c131bb7 legacy-trunk
+63756 b97dd588924699fb3b5e21db548bcd9390f4f519 py3k
+63757 93fe913fae5547a19c213f602c72bf33977a4702 legacy-trunk
+63758 09065b010c9508a779c0c3f10a01e8d3cc1a3f3c legacy-trunk
+63760 7ae79e96fc42f8f3efa09a80dc86ad255d95acfe legacy-trunk
+63761 125247ece56252a681f5d25b12cb3635c039b7bd okkoto-sizeof
+63762 a1cb54309b4d4f4360a8da2b15094d059df9efe8 py3k
+63763 dcd6bfb0db439c9d167a7aa4242d6eb5e180d051 okkoto-sizeof
+63764 23b98f7ef45476787b13210dfa8e8b8dea02c89b okkoto-sizeof
+63765 79f3127f1d7270deb061084ed7cf8d2895a7ae45 okkoto-sizeof
+63766 072bfbb6548485e43ab3fb389a80c038e0134146 okkoto-sizeof
+63767 156746a63a5c8f3327c8becc78ff252537e43cf3 legacy-trunk
+63768 7652936fad39f8b7e0f6bed33ee02e473dfc53a1 py3k
+63775 5e23b0fcc78ee6a43dc7e327ef3da38e918ea6ca legacy-trunk
+63776 29c9536c04ad48769ed9736ba277a4274b606bfc legacy-trunk
+63777 b6cbec49975622d69727bc39e4551a773c55b333 py3k
+63779 b14c4b5bab08d36ffb9252960fad30f0cd45114d py3k
+63781 00154567d5935b284cac25732be8988e0373217a legacy-trunk
+63782 ef51fcda348bf923dd982ea72bb23667c0601223 legacy-trunk
+63783 63b4745561c3436ef5d7203abdd36f9c59ffc863 okkoto-sizeof
+63784 9e6e6b817f3202e30dbcc88495afa665fe31044b legacy-trunk
+63785 fb2d9b0b447032a1f7daf381f5efd929979e0d4c okkoto-sizeof
+63787 e81d02d096974f1305e5241421398209d701a869 legacy-trunk
+63788 e2c5ae30cffeacd48a0efd561d3d2167511e0667 legacy-trunk
+63791 c595da055fd092212faa6cd563811e6ce35e6702 legacy-trunk
+63792 c90cdd8359606e43717ba0d98018f0b1837db393 legacy-trunk
+63793 39869803bfaeedd06043ce47384956f80395091a py3k
+63795 aea3c5543d43f2b9d51c37856783bdcd29b4e950 py3k
+63796 366a435511dd5d4ac4059422d0248ed499a08d35 py3k
+63798 1d29bfa273681b942ad88ec812e5a2f44cf58405 py3k
+63799 922e5a24cc82e9efda48867832966fe7ee7059ea legacy-trunk
+63800 2391da6c42ef08a16c71cd6a6b8dc12c64369d46 legacy-trunk
+63801 263fd6fbacac5845e9462441311db1c02b83bbb7 py3k
+63802 882aa14665e47f1fd8807782d0644918a5039552 legacy-trunk
+63803 019d3b110a6eee9a4a3d665649455231fa9f6e2e py3k
+63804 cf5f2731fc560718c1f391bb3b9f1b23c85bc203 py3k
+63805 1e1df892095a7141541045a46a66e60b65db8ad8 legacy-trunk
+63806 ea273c8e3eaa305440edf1e10ed3604ffb6b0c57 legacy-trunk
+63807 33865bb583962f2530569a7a43bf5da7397ba006 legacy-trunk
+63808 d6639cd9575ff20aeec29d0c8a0dde770635a18b legacy-trunk
+63809 6ce4435f15ad4e8edcf9f28765cf2a0800dc4ac7 py3k
+63810 0e91690dae2f6396caf4218ce2417cc5e9442d19 py3k
+63811 eca882731194cdac41513e76094399c9f08d6a37 py3k
+63814 47ef9a806ce97be769a43115425e8487b1069766 legacy-trunk
+63815 0da27fdf019205748fc66807c7e6b0eb9520802b py3k
+63816 c41c395458eb028c1f844972b08f84149a870924 py3k
+63817 bba29f462bcc6904973bded17c80ecf8d4addb3c legacy-trunk
+63818 105ad61325ac1c22a0c5088142963db98287af9b legacy-trunk
+63819 21510cc0c2e42b7bf0b577f0c28f3d5ccaefcaf9 legacy-trunk
+63823 0b27ce3c6b21c9caf78f74654e1d71b85a957e0d legacy-trunk
+63824 3dcd70004696fdf87330411905d8c0b1b0b690e2 legacy-trunk
+63825 a2e72ecdbe02be87e0887f4707934e98d93bc079 py3k
+63826 c04aa4aabe17ebd95c8c8de371226efa5b191429 py3k
+63827 2e8769d5a786b9544c2fb9486d2d0bd1ea9b5f21 legacy-trunk
+63828 ff6cc9d4ffd35ae51ac1f96a03d43a6df1a56032 legacy-trunk
+63829 03afe6985e5df780206b190588c64446e4e2090c legacy-trunk
+63829 82a47d78d278b97635b513ebb89a8af51fbea348 py3k
+63830 af3685fa9ca914825652a4e5bdfd68dab7577d85 legacy-trunk
+63831 51a8653128e3ad5f39d5663eadd1569a2bf3d594 legacy-trunk
+63837 bee271e76a3e5311b712ae8d17d22cedfe3e22a1 benjaminp-testing
+63838 075c6bd20f07804db6ff9fe8e3ca42d84f94863f release25-maint
+63839 0156c336e6b3d51eabf6ba552663fce759dd5547 legacy-trunk
+63843 1bdf07409403b4b55782871e6da1aaae6d362b62 py3k
+63844 2f5ede00fa9ee17aaf44ca11d4f1542f181bd312 py3k
+63845 c4e2ef09a2f04b297414c8a6cf34216cf60236cd py3k
+63846 1062b7dec95b7a67a0edc989fb1d964ec261c6e1 legacy-trunk
+63847 d2362f99a40368c897b533426d202c9b8880c0e0 py3k
+63848 622cabbaf2bce997f59bdcaf1ae32edb8dc019c1 legacy-trunk
+63849 2a63ab3595a19e2931d3b4d9b82145dfb0ea8f31 legacy-trunk
+63850 ecf2ed095881557e6b28a794b09e03d5437df179 py3k
+63851 b13044d554afdb312081de1c488a0c9e324808db py3k
+63853 83a10002fedbda849416032948d3b55a60875159 tlee-ast-optimize
+63854 653026414376c83a6cd8e8368d10557912e04524 tlee-ast-optimize
+63856 88bd07c0a847d0341174e25e8e6846a0bf24a736 legacy-trunk
+63857 bea3c1f52e05b8874eb020113b37dca9a877c2b8 tlee-ast-optimize
+63858 e8797e6e07a7405ec5053858640f1cfe3edd8eb2 legacy-trunk
+63859 a65f095b27f3cc40856c5176a5415bbf90bbe612 legacy-trunk
+63860 3702729a247073a05288085b5469d99345530f44 legacy-trunk
+63861 fcf9d95ef50d78b331f4c863a141223bfdae7c22 legacy-trunk
+63862 cfb5491001d02ae4b815f3a4abd379ff52ea3cee py3k
+63863 e7f0fd8358f5aef7417983dab305fd1ca9cbc4eb legacy-trunk
+63864 4dedef4c0dfd290925905132d666c0cb515d4173 py3k
+63865 c0fe54a028e36592013affce84d5fdeb53d5a557 legacy-trunk
+63866 31476db99ac31ff2a842c8d05a989fdedc76ad47 py3k
+63867 06d7856ca9f46a8feb94a2ca11972c23844bd223 py3k
+63869 823be4a275e2b99e12e182cfaab2d94892661ed3 py3k
+63871 c0d616f0ad8639d2c609f888f7c6ff09cbc35e0f legacy-trunk
+63872 31d2ff8696bdc8ec20c937f422e18e8c9ffd064b py3k
+63873 0bf08de339a0d2103af2149b0a34617c2896afac legacy-trunk
+63874 f150177ff1ff794d29dd3cc4641102ea5d6d945b py3k
+63876 ebbf895056ea8acf11e57c78c956a74500d36901 py3k
+63879 b6dd49ee035b5d3d6a8f8c040c814e0abd5c5f1d legacy-trunk
+63881 6404446e5aa36b210b78fab49f85f7ce6b222924 release25-maint
+63882 7eaaad09b6cdd4b7d986bfb9ef258d765aef6923 legacy-trunk
+63883 7d66110464049b102a0ee9f9633e4ba809424826 release25-maint
+63887 100e32509b5776536ca6dcabfb2264d04421cf57 legacy-trunk
+63888 0580531c37555ade831ef7126a874e0aa7022bc9 legacy-trunk
+63889 5bc7da6503b05eb776e1614a39d62b98d961c19a py3k
+63890 79373e070d486009efad92d1185c6ce45aa691ad py3k
+63891 bb2c4bdc3c683b48fa9e95bd8283fd94048c24bd py3k
+63892 1f2f1577ae7819cdb04f411b93af26bf58ab5e58 py3k
+63893 b6b534b828b339bbd6ef7ba0225fc8ebb9112c03 py3k
+63894 65a60608ab5a59b028493cf75884e195e45ab9e0 tlee-ast-optimize
+63895 f9ebacace35d3cb57c69eafc5e047cea1b9ad99f py3k
+63896 e0ca0218ff33c024b51c214b5016e2c9c9402960 py3k
+63897 4440247b8a4481dfe6e4f3f00510448f3f1d0e49 legacy-trunk
+63898 77088d41c7901fcd0a01b442595a6f1dca117fa8 legacy-trunk
+63899 ed471a8009a63191f4dca9b357d81bdd343c8619 legacy-trunk
+63910 47ff24bc61165d2f3267819432b1590469198b6c legacy-trunk
+63911 c23e6d5300a0a24c4a5111a2454888aa51312a84 py3k
+63912 399919e61d238c2220c3cff8f00331e2c130d63c tlee-ast-optimize
+63913 f73e6f6d9ba697ca927e3dcb349db8fb2880a737 tlee-ast-optimize
+63914 5353b550c9692ce887d260ada9d00455c9cd5bdc legacy-trunk
+63915 a76e49b219a2ca2c754e55475966295e1de66648 py3k
+63916 86ed979de8987fb0dc318d2e097ee469104ca3ce release25-maint
+63917 3258bbfc456e674c1a4884a0408dcd79a7052f81 py3k
+63918 e4a18643744042b631583cee886a182f4ca77185 py3k
+63929 ef0cccde8c245cb556f421f320f9a68cbbbf42c7 legacy-trunk
+63930 572d81ecf00d60e3d6fd9e5d28f4a1dff90174b0 okkoto-sizeof
+63931 f82116600c0f181bcb539fb85646946e89036d7b okkoto-sizeof
+63932 2a1c6978dc57610e05f76b9f51f4725f5d2c140d legacy-trunk
+63933 21beb0d5e3299524b1a49f2d9687573a96bef9a3 py3k
+63934 d57aa752a40118277f60a1d396527a9b21882e20 py3k
+63935 d0f783ba7669a30c11bae1f135aa80abbece30d8 py3k
+63936 a65619ad59f28738bc5fc6987140a14a0a771ed4 py3k
+63937 8fcc9ec1882463abfe19ac91bdebbb940dc855b1 py3k
+63940 58f4b60773fe607cbec8cfb755be484c7532ad41 py3k
+63942 8ad4ebdbd373aa73934282c52039e46db1106352 legacy-trunk
+63943 10fb2dec3665b4b5873361c4eec50c210f151f54 legacy-trunk
+63945 b0d4799b0db844e7d71a48d6553e8e943f4709dc legacy-trunk
+63947 8480f54fcd6df4c324a2fd4eb1eb0422191edbe1 py3k
+63948 71bed208fe504242df739834a5fc743b77da5666 legacy-trunk
+63950 e95c15bb99502b7c1784e8f6b25bbbf0a2380daf py3k
+63955 c34e34057714a011ab978776078b7f6a1ff5886f legacy-trunk
+63956 454c7b0b68a87bc9781b31a59a074dca28ee5e2a tlee-ast-optimize
+63957 f04b059e6c9821155fdc67589384448a9ea58f2b tlee-ast-optimize
+63961 7352543cba03c431ea7d1652db0bb0252e303e0f legacy-trunk
+63962 bbce18d00d87525acaf7b7423a1058da80022022 legacy-trunk
+63963 1d0a8cac15ef04e756c6e7fb248d333d9238609c legacy-trunk
+63964 8e0bc1fc095e50fc4672f94676e22a289e0850c4 py3k
+63965 ad13cb9e94f1b74f9da0447fbc6fff7e894796fc legacy-trunk
+63966 fd6f306c04e00af2a83c4a1282b7ad19d853ffc9 py3k
+63967 2a496f1eb9f164f858c26bdc5773cb5ddb485243 legacy-trunk
+63968 0d7ccb50007ce2c20f837a4dab9022767256c07f py3k
+63970 b55309ef54c77387fe3df7f9fc52fd5b6016caa8 legacy-trunk
+63971 945da1726cf1a08df2ae4ef8416debff9392ccb3 legacy-trunk
+63972 9e271cb25e59f89f296fd7122cc7b4139cdaa2a2 legacy-trunk
+63973 f7453b0b339e05e670b57a3e14769a6105e96a03 py3k
+63975 b382beb7be36f2526ea4f724e408fd7eb06a34d9 legacy-trunk
+63976 7880a42771582bce5f7511e66f4856ccafce6430 legacy-trunk
+63977 4f5e6aaf5a6a80a65390955ebe4dbb89f11826db legacy-trunk
+63978 7a1d4e8233f8903128384c5712746594d7d966c5 py3k
+63979 3255f1f160adedc1041e9ebae4df43504849622d py3k
+63980 130ce86d61b6792e82a10e32fa47ddfe86ab24c6 py3k
+63981 ebbf011550cd6a944f903c87a92c0e3692cce17b py3k
+63982 af680fd3ffdc7634881ca1ec1348985530e73a2e legacy-trunk
+63983 9ea104f1e5cd263c5610bd29c27c8499cf3f5cc7 py3k
+63985 caa90cf6be9a3d57d49f9f7415d1ada9cdbdd57a py3k
+63986 2284fa89ab08d557710f4715085f81255072f590 py3k
+63988 2210f42e7c898b3da2300e4cb96605a85094d86d legacy-trunk
+63989 24954eb80b9b617b3425b623be5552ca0a229470 legacy-trunk
+63991 f088508f6d99daef2ec271ba07c7ce42ab308c6a legacy-trunk
+63994 a0193b08f0eb8f756fbae77d6c1d8977a752e413 py3k
+63997 c9a5f2eb720cc55b5494a2d0bb92d00cdc978700 legacy-trunk
+63998 c89434cb914d8cc97410047ece0a92fff39ee95e legacy-trunk
+64002 3aebac7f27252e443770edd734f5f38a301fde03 legacy-trunk
+64003 bf143beb08e8e621a52d1adc9ab9bdc88895468b legacy-trunk
+64012 9fda090c045f6e3144a23d33a1cacba3ce8d2dc6 legacy-trunk
+64014 ebf6f639e11785db45fab0cf9d79eb5722e33bed legacy-trunk
+64015 9bece57cdce31b80912dcf64e596de72c8ae9a9d legacy-trunk
+64016 b32d7b83298a98e40b31772fd0b14754ef366598 legacy-trunk
+64018 7201c0193aded83bdfc7cf683d62583e55f3bc32 legacy-trunk
+64019 40f2d5a4fadcc33be209022b081b40a08b2297da legacy-trunk
+64020 677564a2707aac71bb421adbf20e99217473d06f py3k
+64021 5f65c833dc8706a2d5ddaeaee6dabe35698eea01 legacy-trunk
+64022 4f70a9de286519607e2cc15f0f44fb2b3c0edaf8 legacy-trunk
+64023 7d3613dc3f1ccde50cfa66eb838134dd9084ef48 py3k
+64028 78d3d359555ea5baf5731c99d891f0cbe96bc19f legacy-trunk
+64031 f3df51b60dc2623b55656bccdf61e9d8f875dfc5 legacy-trunk
+64032 22cfceb3338e68af849212d1898717b396d017b6 py3k
+64033 a7b1622274b3752df0d6bad4b6c0919c10dd69f4 py3k
+64034 5d2742e36886f01de032a5e35253546fa5fcf30b tlee-ast-optimize
+64035 1ffe6ab84a1b8edc248939fc6d11dcb8ff6e3c43 tlee-ast-optimize
+64036 1c03090b2a0a2fbe614c8e342a68ddaf59d89f09 legacy-trunk
+64037 24df3434ccf7bc2845ee7d2c6ce3253de1159aca legacy-trunk
+64038 c8e2959e8b0f192a4b3218bff9a631b6b7d84ba6 tlee-ast-optimize
+64040 31aee67019a2ad4b58c09b28306436bdb53331be legacy-trunk
+64041 026513be38daa77bd0c8824f9997a5918d2173ca py3k
+64044 d56450db60a23f3434d6bd02074e1bf35bc7064a legacy-trunk
+64045 53253f36014e001f1cf13cac19eab7da5bc02e22 legacy-trunk
+64046 94e3630daca730fc85f48f5714369ec4dd27dbd8 py3k
+64047 246a802637adf7ed8c60b3079aaefc6792b97f4b legacy-trunk
+64048 52294af4b663cada8e1fd98879edc49199546c74 legacy-trunk
+64049 7acb7e7a5f28090504d9600b2aedeeb60f4b5895 py3k
+64050 6428c4f1ae097a425c1bce4efc32ee932d30700e legacy-trunk
+64051 d4cd7223af3bf29c3ca7cd5c769a7319d41f1efa legacy-trunk
+64052 771f7a804874fd7da0b3fcef895c2f02532ab13f legacy-trunk
+64053 02059268c825fa360f1235a2186699398ad107cc tlee-ast-optimize
+64054 6cfa297c65550c9c2f422630583c2cd7c9d95873 legacy-trunk
+64055 10577e25f78f6c2a05a3234c263b7faad7849c52 legacy-trunk
+64056 2d5f1d956ef6bcf42cb7ea5750adf97d9187b60e tlee-ast-optimize
+64057 df9b337ba3112489d25f3fad922b7b405dab1bee legacy-trunk
+64058 3939ff89834cf60c3f2e50328d6e03708046afbb legacy-trunk
+64059 33492c241dab5ca812c90ff4bce6c5c7d5d5c7a3 py3k
+64060 139ecdbf4f196a2e73be60e3a8d79c2b3ac656de py3k
+64061 c1aeb6c94af10fb7a81192485c40d8bb01b32879 py3k
+64062 53c60c7cccd9834ba91c74cb482649bcd444ebda legacy-trunk
+64063 492f8e1305cf62e0612dcd53259b6c558981d2b0 legacy-trunk
+64064 ed572d260fa7172b3164917b013e69680d6275a0 legacy-trunk
+64065 89587ea18ed7e1874f11ba3329ceeb657bb235b4 legacy-trunk
+64066 296ab1038b7f78802eb974119d8c52866cb747a1 legacy-trunk
+64067 f4989516b4d6a286714f0d6d2fcc08eca4532745 legacy-trunk
+64068 dc9f4d6cd3f172683ee191c289374cc4c55bd090 legacy-trunk
+64069 cd5d25dd613112f7bc95c2daacd2e4080d96c6d0 legacy-trunk
+64070 813b87b16dc50902f378b8d17c6bd5ce4c569cbb legacy-trunk
+64071 c00576e202dadcfdf13a449dd339427e695aa637 legacy-trunk
+64072 75212b408d7baba2c2c2f1ddc455e9c4a1ead2fc tlee-ast-optimize
+64073 d5cc3c5cc188ec329e5130c3a24b5b349b1dc33e py3k
+64074 dfc38e5af12d265205f6bfced9ac5da1bd02bdbf tlee-ast-optimize
+64075 4084a84e4d3b74003ad8be963682568102dafab1 py3k
+64076 ee73a6b27c3aa4a6bf35e1a9bfb0e80ac431e33a py3k
+64077 0367a93788dbaa12fcfcc9b8193c1ded1867ed99 py3k
+64078 930d9308b32aa565c8fccf19650fb43bf335a979 tlee-ast-optimize
+64079 09eb8d62626a0263499ecc36c7f1e13c62aa8ad3 py3k
+64080 bbe2077a401bc49b368231b820664e39c7c32177 legacy-trunk
+64081 7d824fd131ad99339baee59733f2821e68e6d668 py3k
+64082 26a7283f7f179c4f147b573dc34247f1b288fc77 py3k
+64083 98827a21e3529eb4576bb82614ac718dd2cf7b08 py3k
+64084 91eb24204e08a6c0ece91bf1ab8f4cb0a5b317a0 py3k
+64085 2925b568aacca608ff9797f6c363d9d498f1f2fc py3k
+64086 acda43252710017ba78f1552774c11f9f2c83eb2 legacy-trunk
+64087 2eae31a3ef89300abb12cdb0a685e08893dfbcbb py3k
+64088 bd584f121c4b50224502fc8e63d954c020962e04 py3k
+64089 ffc6a2ef76e8ad724c15446fd74128908238d237 legacy-trunk
+64090 6dde391be97d88b7c1a3cd3ee582531811da952b legacy-trunk
+64091 f529bf2df4368ca88fc2cc92aa6897072d7b72a5 py3k
+64092 afd3b8eee2fb9883a1cefa79913c1a46df64c075 py3k
+64093 e7a9eab363adaa572b75117179709e1e77e7a631 legacy-trunk
+64094 8248ccfeb53429bd6229bfd67e9716188f20278d py3k
+64095 ec827f6e4cc6b668e8094c7494e43cd09aba61ef legacy-trunk
+64096 0ca2418c770257f5dc7008cd976818c20fdf92f5 py3k
+64097 271845f323be4332fd71f71ab821c3e43b608e61 legacy-trunk
+64098 013be6320b8286e488b031d3c99f2bb691f8f670 legacy-trunk
+64100 1eac8ff01d7b0607edcd23d04e36e5707de303cb legacy-trunk
+64101 7d70b59eeaf2dd90d46dfcbb9ad2ed2394a405f0 legacy-trunk
+64102 da307beeebb920204b4c70348615f46b8b868f0c legacy-trunk
+64103 2a7b6e99cc54ceeb48ce9c7cf37546adb913fead py3k
+64104 4511ecd256343c6b240282c3cb8503bd2adbf9ce legacy-trunk
+64105 acddb00b1de5f04513ddbf6f0fd156dda23d0b39 legacy-trunk
+64106 e81deccb17c6b6672f6709d8bba32e8600d85550 py3k
+64107 94f64f11fdd0098e4ad5a3d6f7a006f2e5db00b9 py3k
+64108 2511431519a221bc1864d80b18419a120bcdfc9f py3k
+64109 88a42db3777c23b947cefbca1234e826dccea801 py3k
+64110 b82e0545d11154a9ec208151126192b4ab6ed627 py3k
+64111 b833a40098c00f799766686e555ae30e24bea58c py3k
+64112 b0ef00187a7ec167b81518a0b0ae3e96ca7f6ecd py3k
+64113 2543c4c795433a6314d0219e2c4ffbfe06aad53f legacy-trunk
+64114 1c964ed35ef9fb279b6cc2dca39ae0eef7cc1255 legacy-trunk
+64115 8fe47b2c8bfe37a407dcd32fc2f2f78c3f067688 legacy-trunk
+64116 cb8494ce1337c83fb43658da08101ffa2ae4df83 legacy-trunk
+64117 0f5564fd040a94a3ee9981e0c184d0a11a234f75 legacy-trunk
+64118 245dca26712f763122625b394210ebcbf9694483 legacy-trunk
+64119 517e1417f7e2cd9e99a0e836102890d9d49982e8 legacy-trunk
+64120 cef9f27a4cc33a1ff85f8721e28e548408038e45 legacy-trunk
+64121 212a1fee6bf93f8b74f81dd3567bf964e627ea20 py3k
+64122 5c6cdfcd6eae49efa5c7a152bf8205f0faa7fc53 py3k
+64123 57c9abab4832c8b624e7cbcc8fcfe766792c4d3a legacy-trunk
+64124 4dd10037088c282d176b48166d8d888b7c17b826 py3k
+64125 c349f9fbc70444a7b385bbe49bc27e09dbce46a1 legacy-trunk
+64126 e2eb70235392fb0dbc143ef4c3aee824cd185f1f py3k
+64127 b772bee3a10ef0c0522f157301a81cd0c81d9b02 py3k
+64128 8dc4312a2f757850a43fe5ff98d99d8784a9de7b legacy-trunk
+64129 9121c5cc4f05410ffd20b825e5f6b22b3083ee72 legacy-trunk
+64130 72b4946c443ae45263dfe9a35be1f3cbbeac0712 legacy-trunk
+64131 e6bea72e943703eeb86159ace710274c82eca531 legacy-trunk
+64132 e93598bd7f4289296d024316bc2c6e2cd2c7d9f1 legacy-trunk
+64133 696344ef8bc048815a0dfd3f2406bd0edc4aeb1a legacy-trunk
+64134 6dd3eb41170a58dab579d1021963362e38cb0977 py3k
+64135 2820109c8d5528f7d37fcbbc46ecb381cd418a6b legacy-trunk
+64136 cc72f41ff0141a47aa6cc8cd374c1880cc1734ee py3k
+64137 177f1aae3bb4491c026e3fdce7f41f866bd8551c py3k
+64138 da47e7e135ae9f31683a4a2b36540bd67fb66491 py3k
+64139 6f3c1357a7fbde7fa2c6c745095334633d9679e9 legacy-trunk
+64142 673532aa378b1f8fea630eaad3ba15adbd6a218d legacy-trunk
+64143 445cd6eba331e9d56be80eee520dae72f2e6f1b5 legacy-trunk
+64144 045f83a1b8641c24f6f44ff6925ab5f2a17d6435 py3k
+64145 d3e2a8e7bf459122f213d31d3e38bf3ba47ae9a1 py3k
+64146 32fef631f78934c06b9da10ca4fd85519a8d1835 legacy-trunk
+64147 7a5bb553da2b172bb3ace0d4e150bf716eaf0674 legacy-trunk
+64148 4c6b8b939718197e24d8fbdebae939802f75ea49 py3k
+64149 6a7eb0b70198099a83c80febf2d184929fb9f00e py3k
+64150 b45a95390620ae670639dad76d37fe8d453cbd33 legacy-trunk
+64151 f751dab713024d94eacbd2e6a6b0c55160224fb8 py3k
+64152 afdd49c47599d8baf56fb8571ac8ad6c315b4483 py3k
+64153 8b0e2c96ce80e05cce77e319b92d027cfb19e395 py3k
+64154 1bfea956d0d7099ad9b593ab9181d5ec820304a7 py3k
+64155 bfb8274e3939a949b4c0a379977c1bf8af5979d0 py3k
+64156 7b3a027ab785b8450a31dfecbabf23d453cdec4a py3k
+64157 d15d8680a00a60cd19db8e45a039e1ec0f41b14a py3k
+64158 f52813f43189d23c084a063d7eb2ab4c9b286ac7 py3k
+64159 a021ff11718b6a95a8e1f17969ac577383ff776b py3k
+64160 38d176ebb2fab963fb3eb5d6ff1035318e599570 py3k
+64161 18eaa1d5f39429818e84ee8feec2fe98e1f260aa py3k
+64162 5af15089a100648b66f1d641b26eab9bfbce251a py3k
+64163 80975e61f8c8cde5b5299ab9a5dddce25c5d58f1 py3k
+64164 f31e32a2013cf40a498b71af4231797fbd5e0760 py3k
+64165 f6aea808b35799933de2f025d5489c37aaba14d3 legacy-trunk
+64166 5258d4d7de77b49865e053d775f1848fb046c01b py3k
+64167 5f4a51f639f1d5fe73a9809dd5169693adc0a76b py3k
+64168 91a88200fdf0dd89348388b35fdb521d1b249652 py3k
+64169 44019e37ac925e55e4899bf2351824574f1353b7 legacy-trunk
+64171 650b3f6845f931e8bc31e4de870b8c1dea3bf897 py3k
+64176 5a9cff7fd08f5b7917f70760ebe0f375d1b98712 py3k
+64177 5870ebe25dd091a5bd58bb51ad7f38eaed14bf16 py3k
+64179 3a3e231b866fbe2afdf3901d07f1678e0415f35e py3k
+64180 0ae50aa7d97c5277e7bf8ef85d9bbc8a5aea9a78 py3k
+64184 b3769b6bae0f0ad7873b606f1ac634bf53fc53ec py3k
+64185 3d6869e2c92ac9969ace8a68d2d398c23db75fdc legacy-trunk
+64189 e86f3858df20ca93d6eac04b033c957ea7511e9e legacy-trunk
+64190 503fb3c5e0814c105f2e598e1a716174c8a10568 py3k
+64191 3017e794bbb9ac35d4a8efce78d19118faed2e1c legacy-trunk
+64194 4141493dd3a0556abb2370bf0ccb6f6c59903fb1 legacy-trunk
+64195 41484d18390cfc3062d91230a0edd2dd58c00d2d legacy-trunk
+64196 f4ff58e346ee493eba42ce360d842584ab2da4ac legacy-trunk
+64197 97cd95367d60ffb5d741688e826c05e9d5064679 legacy-trunk
+64202 e24f26c3cce4648e7671187b838b728c181d115f legacy-trunk
+64203 d407f958c1374ec9d64f6411fbadd24aa30d1b6a py3k
+64204 109e9748c7f4351bf6f2ad3b33ec2ed122d25dfd py3k
+64205 fcdf814c9b1128a2193b947d4cf2ab6fad5c9bcb py3k
+64206 6585fd1d9ad7123d6caa8c744a1eccc4fb6f3404 legacy-trunk
+64207 4b8682ea37c1f4248dd6c69f9fe58856e617b88c py3k
+64208 fd7eb27410121c95d8028e567aed17925d72fd21 py3k
+64209 5726e9157bf02fb5d87dd37f1b4647bc93fc67c7 py3k
+64210 92b79b6d1a3b9bbd0e18a8afe5adad498b3e026a py3k
+64212 db99f87527106cb73be6a7d16b6f141836e26496 legacy-trunk
+64213 71cb7ea4f110367524fb3b1ab8dd3e138f0cfa81 py3k
+64214 fcfe10f3dc146cf505acefbfbc9bdf86e7c83d71 legacy-trunk
+64215 b1f4ea4eb5556399341cd6ffee5d46a473928404 py3k
+64216 9c79ee49a2d952b8eaff9836f02cf9ef1e708615 py3k
+64217 31988b40153579546a5e213e777d958bd0930067 py3k
+64218 13071add8f48ae58ca45bbf38b770d376fbac170 py3k
+64219 e30af3264a0f573ac10289c78ec902e26e15f21f legacy-trunk
+64220 5ebcdeb0cb26c67a851d843135fda16a5662bd38 legacy-trunk
+64221 1464345a19683b74b5afdfaa010e11a609f2aaa3 legacy-trunk
+64222 8f61ae01130f88939da53c40266e271e6e03f6ca py3k
+64223 d5aa25bf93603eb4e1a8282fa558569f677911f2 legacy-trunk
+64224 38d0467f5ec769d4d4ccc8589f737ebf449c541c legacy-trunk
+64225 7a8ee05c697f50f122dc10b1144f5b293de727d5 py3k
+64226 a35da94e05fc5a58eea7e6c28850531344abaeee legacy-trunk
+64227 8c6068f14ee8cef1013e0e0cbc14d5bfb18e0203 py3k
+64228 b5e02775fffcb3fc4b99f5181808f8c7b134ca26 py3k
+64229 6434dd704d60ea60800383aeb640b4e12fe880d7 legacy-trunk
+64230 2dfaa0683be8b663d060384972b02d03dc16f387 legacy-trunk
+64231 4da8b7a8cf2e94bbdc565e90258ffc01c9f2ded2 py3k
+64232 a10688adcdd62536fbd95ec3ace9d91d883560b8 tlee-ast-optimize
+64233 168c9e96772c57972bfa79bfb88cd46e2aaace11 legacy-trunk
+64234 7fd9e9cbd72153ad8d5edf5859beb24984c7a2d3 py3k
+64235 a333c8770e32132739ddb504fc6256c8f7f5c409 legacy-trunk
+64239 faa7ca52427188422ed117ad736871cbc2d0a775 legacy-trunk
+64240 cdbf12912d4b82a448e7f867f7362ba70138216d py3k
+64243 f52549fb74a2651911a6d89b12191dfeba8e82a5 legacy-trunk
+64244 b905cb2793cc9aaf3ad5db453433264fd847b72e legacy-trunk
+64245 bb817a5d68b7c3083d20f74964a70abf689d5bc9 py3k
+64246 a450da2400896d2433f03efccc5884d2b7773036 legacy-trunk
+64247 87147db82eb1e332263f3a94ecf5ccf49241657d py3k
+64248 af8873df03225ec10fcda64f9d88ecec1a261d30 legacy-trunk
+64249 9b8ff73d018859376c90f652b6fd0bfbc667db0d py3k
+64250 d01165fae98e9004e3f8359b93a667d148ac7e0a legacy-trunk
+64251 46e5846150d5e95f8a2a1204bfede98d42bb1fbf py3k
+64252 6d1dc761ab4e088989d7544b4e1d2b79bdf04de9 py3k
+64253 1069578379a012cd1c9f8c24a539f20c947e3c80 legacy-trunk
+64254 446d5c29908aa9852e834b3f9f294a661ee8bfee legacy-trunk
+64255 2f16cea224f5cc4852419223cdf0db674ccde1b4 py3k
+64256 dff762adf9d61122a4eb665c0a3aed4a61eb14d2 py3k
+64257 f36f092dbe97846c226e109836e27c5bc3ec1c5e legacy-trunk
+64258 aba58f28e166b3f7ae7695b855ee3ef428774b19 py3k
+64259 f2e2d5b964de38c1d4a29910857ec8f265d0c73e py3k
+64260 37cf5a1e639e90efccddc3f7b1d6acae295c540b legacy-trunk
+64261 57aa873d96fca8b9204074fc8f44351c2a3a2bec py3k
+64262 095b85d7a0141e3f7efad9156dbff296bd188344 legacy-trunk
+64263 e8df9e4873b478013fe2997d5859ecd5dfd62de3 py3k
+64264 10a8ce8db6bfb4f7c61102c31c5f02c7cc28f55f py3k
+64265 6f0fe066a84bb504e4db471ebf5dd5d9fc5eea2a legacy-trunk
+64266 61e5286d937c8aced691aa1e36f23360640e983a py3k
+64267 aa2503188bf34d8928d711595af441bd765af99c legacy-trunk
+64268 c8f8a578c01b98addca20dc6f16dd39511b7d26c tlee-ast-optimize
+64269 e9c935cd7888aebf90e0579e24781206fb62c02c legacy-trunk
+64270 189867aabafa377883ffb58503f78b2359bf2d41 legacy-trunk
+64271 b5bf16790e3c69d1f55d4adda98d491f12c01373 legacy-trunk
+64272 516c19d8591a9b46035d85255a132c0b3f941023 legacy-trunk
+64273 96bff7e137fbd1230d3d58446f2826d7758587c0 py3k
+64274 4b1e01505d4d37e99f17ea2ec4410c0e671f8b42 py3k
+64278 9ad69127e6aa654a36f77bf48ba6a054af8854a6 legacy-trunk
+64280 9155ff78fd064d680f7308f3dfaa79118cea6305 legacy-trunk
+64281 7ba7901dad7f8c6b5a0a2cc4f40693c06acf26b5 py3k
+64283 25fa3dd021f52abe1a269960c69ed4e36b8c1f4f py3k
+64284 b33e8334f82f79e3377a078755a67e94e24739be py3k
+64285 5cb50e7a98a2858a9137428012198d518d9e80b5 tlee-ast-optimize
+64286 991caad81a2da6f55fc01680e58e87712e547bdb legacy-trunk
+64287 4e304aded7a850b4bf671ff86cc07566d0ac8804 py3k
+64288 613daf7f8e486b471164112a8be7bb0657bf655f tlee-ast-optimize
+64291 14350e75d02a4be2db2ed1fe7cf4810a453aa2ce tlee-ast-optimize
+64292 386a72984af5dcf35d0b04230b9bc9b1e0f36434 tlee-ast-optimize
+64293 f77f8e79971494fbffadaf4d77ca0865ecd45c55 tlee-ast-optimize
+64294 26e9c871d23fa1280d133ea993e6a3f0923f259b tlee-ast-optimize
+64296 40d601de28dc08176675d12366f61a4afe6b1794 tlee-ast-optimize
+64300 6f6fed4f0626b477aedbbf84d80c3dcc773ffe84 release25-maint
+64301 a6d7bfcd745691e0a4ddc01b22a9d0963b5280fe legacy-trunk
+64302 ee2823e1f23b65f8bd40fe78bfc080ddb9c210b8 py3k
+64303 4650eefb5838e9c9604b81bf606797b13bfe1c77 legacy-trunk
+64304 38432860b3b468c8676ef14d35840359d0a691fd release25-maint
+64309 b8e9cc28022c54f47100284eba40620e1e66b037 legacy-trunk
+64310 4ed165940bdd019251db3a88c472526001711e67 release25-maint
+64311 5c85d55c4fb2bda495ec3d704c8521118bef853d py3k
+64312 566c7137aa8daec54b8bee1fb283955097d9fd7f py3k
+64313 2e13ffab199ffbc2c8968bf54920a76dc3774add legacy-trunk
+64314 609b09a9feeb41f7f23352ffe98de81d428aeaa6 py3k
+64316 84590a64f3a2264336840be90d29fbdd7848f85b py3k
+64317 f8a8894da77a4b72765b8fec98c1753c8d94f934 legacy-trunk
+64318 a29bf69fb344647c6ff01736f579f82b2f02a427 py3k
+64319 302a6d7633784065e231ee8da300ff706182a95c py3k
+64320 c07418de3cd3328ec953566fcb1108d7595b586a legacy-trunk
+64326 b8c9a35433813b283589f5ae69680cc0cc409e5e legacy-trunk
+64328 98d012a8e445f08bc20d18bdd8853f4b3dce7b55 legacy-trunk
+64338 8e85c46cf673c267eaff2d31090945a5ef276f95 legacy-trunk
+64339 28abc202c771059712e979d229bd886d9da5377c legacy-trunk
+64340 0b1c01eec788529fdf26034e6896480701d0043a py3k
+64341 03639b09c3760328aa6f11c49014d919de882cf3 py3k
+64342 40a75913f04a64b4ff81d04a26b6f7f3d57d1a39 legacy-trunk
+64343 f64996760984728397e76b385aba6f418e14bca1 py3k
+64344 6f27d52e8d956e323795686afa189fb18b198dd2 py3k
+64345 68d87bc06fa370d25c00e98e500ed5e92bbc2519 py3k-urllib
+64346 87001189995c1ae08ad63a6150913bf4239ba4f8 py3k-urllib
+64348 f6726f32ef70477bf3a38dcc8617bca45419f5b7 py3k
+64349 ca074232b879767a281c76d8a21f3c14f0753050 legacy-trunk
+64351 e39c810a7eb2779180057cafa9dd9868992e8cb0 py3k
+64352 ef883fb4c076dd6f875bc59c8a4ec2ea7134e83b py3k
+64353 70d72a75ccf1e6f06d4201d73d39f87cf5f4a799 py3k
+64354 5f9435317de1705529299b4db31896e897c7d705 py3k
+64355 a0523c7c1c4f7845eb6563e5ec5479dd8560dee0 py3k
+64356 a1741617f06f4d54cf1f0c346a5f23c0dc3bc88a legacy-trunk
+64357 df5bb0a6594bb7b117996ff34584f750c78e166d py3k
+64358 a4b8dbe1b6336f1bcba75073c314ec5612719348 legacy-trunk
+64359 187a81ddaf2bdf8cea25d9a16e16645cb6b599d0 py3k
+64360 03a9a9d3081edab681f51872697a505246e36e03 legacy-trunk
+64361 a408a05d0e251b8b609667d6c9975922e7d7841e legacy-trunk
+64362 d52a73d8d20f032b93d7586f8e0bd0d022ec795d py3k
+64363 66c8f76cac446d1a43f7c4d1780931131d4f2463 py3k-urllib
+64364 ac854cde3135e57ec1f4fc95ae5d744950f3c531 py3k
+64365 564c29a0fab1a04fa942d23acc94e4b2bfdfed85 legacy-trunk
+64366 0b149fc4018686fa2574f2abdea45b0dcec64894 py3k-urllib
+64367 28f567a413f414bcc0e24d0f8e58bbcf741f0ee3 py3k-urllib
+64370 ab12e3ad2e665f2e2c5aae9bb3163df65464d1dc legacy-trunk
+64371 b4d823483421eb404a7065c928090541ff0d4447 legacy-trunk
+64372 a6503ae3e19c1ffcf71e9d5b9283275bfa19c0b0 py3k
+64375 6b7ddc0fda9378295f77f7be083cddd621b5902c legacy-trunk
+64376 5702ede4227a41bfecc3251be56bfdbe67a4c513 py3k
+64377 9540597910b9695c1fc69dff3790dd50c405684a py3k-urllib
+64378 4da771588ba3100688d5ea61681794c242d482c1 legacy-trunk
+64379 1588e2fa3e7e74b2ba2f1234bc0b97c14038de16 py3k
+64384 6afdd6fe5512df4da1504c13b0326b143bb0c379 py3k-urllib
+64385 5a416a6417d389ccbe24687855bf97beecb3d041 py3k
+64386 744f9c809f303f40715bbf2dadb6ae685934fadb legacy-trunk
+64387 0322808c20fee6856307d03f1c28c5c8e1b30bf5 legacy-trunk
+64389 69040092b8f83176c993e93281d9d0e7e7021918 py3k
+64390 2c1068328b5ba476b17289139986ff269e8fa674 py3k
+64391 07f9472601783e12c28c878af8c43084a6de7377 py3k
+64392 ea194c9a6c2f9de443a15bf26922294dae3900c7 legacy-trunk
+64393 2ddd86e3700c20edcadb28526b37eecbede933e1 py3k
+64394 5bd43eb9e520c276279c3f76a81288a91e5a59d0 py3k
+64395 a335c4d643b1cfe14197a9ef195c9b2804f608fc py3k
+64396 b1ed2b005e3dbeaddf5464c505521c3fa5940c32 py3k
+64397 0730224ecf5fee1b07ca83dd8ab0267a1925509d py3k
+64398 2f2f32af8c4ee8f6598f632dc83701a20726d10a legacy-trunk
+64399 2581ee1f26f9e4b8dd36729adbac71fb1ba06fb4 legacy-trunk
+64400 ecff1a1a07b555f85e861876f66f2b5d54e933e1 legacy-trunk
+64405 b34bc638b8a7c78b190e3d9f86a56938072310cc py3k
+64406 be07f379d87adf0dd64e68c6e69f7d07c5c96dfe legacy-trunk
+64407 a4be4b1747711de14e1b9ca547ebdb3cd6be184f legacy-trunk
+64408 e107062aa9cd778687f7aa395c81f5b32ae589c3 legacy-trunk
+64409 9af0d65bc3b2784606033e0ff75ee2b56364cae2 legacy-trunk
+64411 27c78cbfa7c681b8a37b22310d5218ced9e357bd py3k
+64412 0aeeb2b48341c77284dd0e2c58e51e41a1b97833 legacy-trunk
+64413 db62c448a349e2f15c4c2ccee89691af267859da legacy-trunk
+64414 cb871f736be024a75f4ae7935b8a48e64c6c92e9 py3k
+64415 2bf4112cd6815c703e365525e9a8ab43897c8962 py3k
+64416 b418dd39f798bef8471fc19c8cd00dc2715fde3e legacy-trunk
+64417 58f43ace295e5c398197a32d3f0d1c789d12c9bc legacy-trunk
+64418 6b4b292c3a2da8dabd76211c7a9d6141e1d074fe py3k
+64419 25d6b2d0ee42ee8a7f5a85b3c03c599311245d6f tlee-ast-optimize
+64420 07dcf0ea7880f40f91197374fd952d256bd75481 legacy-trunk
+64421 c39263e94c33074d4b6fe5ac4def4e04b61df10c legacy-trunk
+64422 7b96fae400d6189e9e06525065fa1b7589eef5ee legacy-trunk
+64423 1bfd5e712b94ca15edb94367c02a438fcd80860c py3k
+64424 edc701d00b62241202d525de7158995666221c71 legacy-trunk
+64425 717e8aee4a9d07d7cda9f583f3a7388cecf9dcd2 legacy-trunk
+64426 d1a46350b0476c4fcc339c043204d298730f624e legacy-trunk
+64427 bfda398c917e5da250a9c609cc688f2dc896afb9 legacy-trunk
+64428 a7186fee7596b663f5345c4a4b09656e1e697c4d legacy-trunk
+64429 629eedcbb265853528479b490829c1fa09cc98cf legacy-trunk
+64431 d8dc6b37fd789ef4f9f8954819cbe75ad65f63ac legacy-trunk
+64432 5ebeff80425c5499b4c32acb292e65fcef97596c py3k
+64433 4e1cadb7871eece1438a7e66ac091ac276c6e164 py3k
+64434 a107bc2d8f3427d9976b694b0c55b70683c251f3 legacy-trunk
+64435 b32101c19bf84856320cdd38010f36b7312efbae legacy-trunk
+64436 4ffa9bba7c5f00b8cab7d48d1be9a25ca90db84b legacy-trunk
+64437 24520e8241072e7401791a5d659fb226c00048d0 legacy-trunk
+64438 4267adacdd5278ad97ac585ff614d1e63092f873 legacy-trunk
+64439 a067dc0438d532c55236f34a90ecfe5d56fa0047 legacy-trunk
+64440 75b6b2737ea719368b7f6a8a68cefb3a72ccf8b7 legacy-trunk
+64441 ac6eab2473c5b6f1e3022f442c3acc7466599393 legacy-trunk
+64442 16b7c500b753a3c96e6048d3363e89400b486d25 legacy-trunk
+64443 9c67d3dce925d94ff5957c3360f0579706950cd4 legacy-trunk
+64444 aead0c781cbef6126a11f950ed122919c0d6ff3c py3k
+64445 556e4f6ec9a08caceab78d465eae153666a67cc5 legacy-trunk
+64446 016166b7b976e33f0bc640a8a472dc31fd4a67d8 legacy-trunk
+64447 5e8a7f9d95239321f82e972bc16b66a54828e853 legacy-trunk
+64448 96815271963d5cab2ac3c0cb67509dc1151f6152 legacy-trunk
+64449 e17b81a95aed2e8a98582350f13415a12fa48f2b py3k
+64450 70e1a38c9805b6a6c17a492fccce4e2f72ecf944 legacy-trunk
+64451 c57d1e954d93457c3136dabf5f16d4c24f5b3808 py3k
+64452 96adf96d861a44d1b29e919af80ff04195a373c4 legacy-trunk
+64453 7cdbe01a45764b2e3843b518883f26200e046b7a legacy-trunk
+64454 ac158ca686cb519a380122b929a4cafa3e39aae6 tlee-ast-optimize
+64455 8b6c2856dbe51037c2fd6ea35c043cab8f12c515 legacy-trunk
+64456 eb9fae2fa3f96642ebbf5ac71ca5d726b918b3ba legacy-trunk
+64461 65c23663d0bd698132ec79f00b514f234511e888 legacy-trunk
+64462 da6893e2004f4ca7091d99c43ccd74dd6854cd58 legacy-trunk
+64463 68cf3cbb21d258d8e02216d4cce3c7b8d69d8e0d release25-maint
+64464 7b51ea8cc558dbb34b4c40271aff2f02e15db99d legacy-trunk
+64466 b11b09c1efef2beb235783f3d67c451e40ea6d63 legacy-trunk
+64468 88bd8eaa5152edc579724c9e5390635fc5c306a0 legacy-trunk
+64471 a9ad99d0c7224be18ade237ea84cb347345b9cca legacy-trunk
+64472 e0f1e1c566d9d675432a16f55183cc3c12114a7e py3k-urllib
+64473 f84691f489c38c60837ad05f100a8698b4c44bd6 py3k-urllib
+64474 dd907d6a7a85d163c7e121c5ce3d0ff3c7f3dcd2 py3k-urllib
+64475 f0027bfdf9bc445256f4794e7acf2909e77535da legacy-trunk
+64476 1f671c85df047c5b75026c346472201592d8d2f6 py3k
+64477 1dbd7a522a2369f3b5290569e66618a8b48d1d51 py3k
+64478 6c04d14994d088013c4b816bc8fec547da5a61be py3k
+64479 9676884798830d801674aee5c9c6b74c563ee5c1 py3k
+64489 6e06d4a86e3d0328d8d2084003865ba62abbfb7d legacy-trunk
+64490 b015693114f6797ac4b0f1b1e2e1f31c633c8a96 legacy-trunk
+64491 752e1abaf15a56b5b3fae841d70a952bdcb50d9f legacy-trunk
+64492 098173e844d152853c529627af8fa736ad3eb7eb py3k
+64495 5d5f7285f5c59b4f51566624be9578aca671b0ee legacy-trunk
+64496 c83eef078fd9f0eca88ee5873e9065c1459e1666 legacy-trunk
+64497 b1bdcbc97a14c094ab04e82b2169f086c26f1f7e py3k
+64498 68fd3ab8484eeb7d0b5f36337278ff6cfeb4a8b5 legacy-trunk
+64499 12be44c6a702e8b3b7caac9f77f0c411d8e80491 legacy-trunk
+64500 7e747de231b382737f6318f3b2050d3f561f0d63 py3k
+64503 22fbddf18d488a1001832e7475a8c57e92d555db py3k
+64506 270ff6f4d99f3fd0df92ff7227069f25e2b5144b tlee-ast-optimize
+64507 d8afa41c696abbdeb03d2ddcc4771ec6acb0907f py3k
+64508 3b6ffcfe2971e1fd399e02e1cbffab6a46f1ee77 legacy-trunk
+64509 9574fed9368836a5bff7792f2a7f931e26f80b7c py3k
+64511 0af6f0300eaff443d686b2a58f7bbfe4b7de7b8c legacy-trunk
+64515 7788e9893b85bb91c773c71d0a353a45d0ed129d py3k
+64516 3ada46f2321dc244680b472db0e0b0ab0383bf1b legacy-trunk
+64517 3c8d3b98cfd73cd22346baed7f7d5ea12ea1008f legacy-trunk
+64518 380aa2d161d39297238008ce4de81a01c0fb9fd3 legacy-trunk
+64519 0b52bdc4cd8939991b8a4aae9752a630f0193134 legacy-trunk
+64520 64abb61e9d4f7f0473f7b7fa4c8813630fb5c2fc legacy-trunk
+64521 57c82cb0faffce9bfd2cd1d89bafe71694342f0b py3k
+64522 37a21d097d34d35145e68c65f9657ec20c82b5f2 py3k
+64523 e5a51ed9e634270e24e3113a2b3c3164ce6378ab tlee-ast-optimize
+64524 d1e864a5c60c8b4f2e078883f387cd7e05435c07 py3k
+64525 ffbd4e333e2f9bd0e3f08815baaf60193add7518 tlee-ast-optimize
+64526 7de038550523dc2b388f6d45d5427f370dee465d legacy-trunk
+64527 bde2ab943593c3a9ac1837e5c4b90ddf302aecb5 legacy-trunk
+64532 b26116425b1143600651e7f4836533bfe4faf80e tlee-ast-optimize
+64533 7eb3737657d12efc80c002f3aa96eabd266d6359 legacy-trunk
+64535 8821b405e0e6cf9e86a49a56a0457ff35ddf429e legacy-trunk
+64536 064b0b75bad53b5ba7367d1a92e5ef4d6127b63a py3k
+64544 8c929ce0fb41c08651e5abd35e857d8249304a5f legacy-trunk
+64545 723c0ff698b7f56f835e4e51f1054e69117ebf37 legacy-trunk
+64546 7fbc374c959d2d779f5ce664f35ef4fc0806f7e5 legacy-trunk
+64547 58dc367dc1ea00bd3cc8353dc4b2652b1c43999d legacy-trunk
+64548 c4b766afac6f646e871a1314d543f661fdad2a3f py3k
+64549 dc42efd728eeb822d56342e3633be8c7c53261ac legacy-trunk
+64550 edd48b08494da896cbfe58dd30babc84b5366130 legacy-trunk
+64551 bfaf142957949e043bd8cfe6c7cdd8e9fdffdcf5 py3k
+64552 605ab6f928388af5f1dfaa922c895a49fd079191 py3k
+64553 c712bcd3203b4ce9804caefa0178c8f67e0b0c83 py3k
+64554 c56072eaacc2618a1339d8ca27800d93314cc843 legacy-trunk
+64555 a69bd3ab9f997cdbaa196357cb5f27116c5d3246 legacy-trunk
+64556 72434013b030fdc8d05a0e25fa82d51cc0ef255c py3k
+64557 43f6bb0eacb2f4083b968bfd4b7b7186c28afa25 legacy-trunk
+64558 5b4c8709903d07a5253ee114634644b36fe46461 legacy-trunk
+64561 88392021942a6dfdcee86a31864d876eaa2777f8 legacy-trunk
+64562 ed5dc13b899ba2d6b545bf8aa1794a85c1287bd3 py3k
+64565 1c4bd502de629b290dc871d1fb2b21296a759b85 legacy-trunk
+64566 50859ae4aebba4bd62a365c8d9976ff2109f30cf py3k
+64567 841ae1767b4c54838be04bf2507ef969d90a447f legacy-trunk
+64568 248b8adfcc97a38f5f383e0a0b8ba9e15e38f911 legacy-trunk
+64569 903b6e2a304fb0b307cce4c9a5fdf73df69864f6 py3k
+64570 b85770459591b88b682b02622f70c3f3955a3c05 legacy-trunk
+64571 2c8e3cceac4eb4e0401e4a85d1a8afba632dba38 py3k
+64572 afcd68a87eecad2110e1f89858df5799617b4e05 legacy-trunk
+64573 bdbb66bc37dce1b3fcacce29d677a584a102b42e py3k
+64576 afbd50ad4f348405d6bd35b9827d53372dcac915 py3k
+64577 1dd10b04db4741b9fc93d422859b20f4777dfd38 legacy-trunk
+64578 8a281bfc058d7f0d1ea8f52d9b6cd12f2c55e6e8 legacy-trunk
+64580 0fc7861ece5f6cf0e623ab7567f8fae73aa57d83 legacy-trunk
+64581 55ac6c7ceb5983c25f1fa96d6f5c2459f626fae1 py3k
+64582 3c49af2d5bf0afe65d0a811043f17ee53f3e666c legacy-trunk
+64583 ad9beb41aac10500f76595752d161e1bcd0d71d1 legacy-trunk
+64584 e17adfaf4f64c9c4a417ab07a69ecb08594a6b54 py3k
+64585 d94fa4cb52e7349a9d090c372b17290af2d1dcd2 legacy-trunk
+64586 ef92703748444cce918e1c2363716f1d9f9dc4ba py3k
+64587 f5f70f20b678f966f66a41bffd7c009e54217706 py3k
+64588 4d2d0a21d4948da9c2c7b1cf27fb4d47f4d45a63 py3k
+64590 be55b7c2c8e6925cbbe68f58c15e0e794656fcf0 legacy-trunk
+64592 73cbcde75e058c38746eaceffe4092d904459a6f legacy-trunk
+64593 297e1218efe509f937bf8186817943dd63116e0f legacy-trunk
+64595 e14739c584013693475b618433a2f388b3b9a980 legacy-trunk
+64596 25412c6d2776356580f827016578e67f8f22eb45 py3k
+64597 82c4681cd9bd07a3ad7ed5c1e61ed43aa32d6867 legacy-trunk
+64598 7604515a81985ab70727c3e4afcbe75cf08c8b85 legacy-trunk
+64599 a900bb1ded9d9b6e7e96fed5a9055ac9b3aab8ac py3k
+64600 b9d2ff5e3dcfc0ae9eade9551676051c4fd0fc70 py3k
+64601 8ccb35739a96f20b2ad7660bcd2ee03978236cae legacy-trunk
+64602 e29b4ce641f943195f851a814b1b4c6bc6fdab52 py3k
+64604 fd79c4d97745ad1ecdfb798e25b82a04bc4e29e8 py3k-urllib
+64605 8cfb89b61c2e51b792b1ebf39ff60d2976e282e9 py3k-urllib
+64606 b6ad664cae49988272db8fd3a2a974e462b597f1 py3k-urllib
+64607 7b2f218953923c90e411e9b366661361d72ccc04 py3k-urllib
+64608 739cc9fdefe5d4aeb641708b5e90685ddbaf90d1 py3k-urllib
+64609 ad9fb9f1d6d3bdbaf531704451d6eecaaba2efd7 py3k-urllib
+64610 416a56eb24f33aadbfcc38c21fb197f48a354224 py3k-urllib
+64611 446e3dac0c31bd49fb3667981877e6936c63cef3 tlee-ast-optimize
+64612 37c7d17740cca689426357317dceafd83d01f709 tlee-ast-optimize
+64615 e271976ac3724ea0b14337867e2ef8da793f13bd py3k
+64616 5f7468ac14cd87a5a21232c59c9c117ed40ed162 py3k
+64617 913aa274ed77b57d1c31fb097e1e44f73cc8d5ee py3k
+64618 acdffb5b43522113dfdb5dd05bc8fbd96d3c9ef4 py3k
+64619 eed5317ac837e263d30ea90048f3fbbec7c4ea78 py3k
+64620 f92c80095c14c9d91b45c5ddea51349e51419519 py3k
+64621 bb65f9b76c1fa51a02dc583dd0517f538f7e1d9f py3k
+64622 80109d4044cda4fe91e4c4a67b4901dd1494ae7f legacy-trunk
+64623 e10e257cbf615ebb6710edbb60b648ebae32e046 legacy-trunk
+64624 7d1530fac1f668417692cc944712d7186c63a72d py3k
+64625 e68fe90f15ab00e032186f8590ed0ce4ebbbdd9d legacy-trunk
+64626 42309437f1ca25c0161387498d2b3612f241c0db py3k
+64627 7e299ab35d95e1998999790dc6d39d8ebb4a22fa py3k
+64630 ca1353bfd48a3232301ded8179d0f544caa20a31 legacy-trunk
+64631 70357811778627c1a2015153303d6a6ebef073db py3k
+64632 d664049ecacad8be1989982b50e1c4f991c8a322 py3k
+64633 7dbd6b607706a363baa6d8f10878abe5e46e6519 legacy-trunk
+64634 70a4ec4128822accb4754d5750eff72457815c7e py3k
+64635 cda556d2392447b990401698afc8aa5ed13696da legacy-trunk
+64636 2d4877f7500efac38123d4f8bc4ca25353b91835 py3k
+64637 6c3860914292c6be8306aec6366cdc052b2d3786 py3k
+64638 a06a0e1132ee02fbad11f824c77252add9fda982 legacy-trunk
+64639 60fd0886811c75d596070e6682d2d8ea57c99a97 release25-maint
+64640 4a8329535234d75b5d76c4db87820110f3ac66d0 legacy-trunk
+64641 e8bee3097d440e53bbf3f5e8960585eed5a4b643 release25-maint
+64647 6cd3cbe07035e94fdba883dda47af93d05adf29b legacy-trunk
+64649 801754201b11412862b359b0e39b822ab6992fb0 legacy-trunk
+64650 2d036b78dfa40bd6125d2d61f8e061c44b491e8c py3k
+64654 b7f3d970e44f03170f346cc8adb88645bbc72ff0 tlee-ast-optimize
+64655 65af544da121d48515194d2ed8169a4160c95735 legacy-trunk
+64656 5d8f47005b73eb0c85970d6ad0b2ac19f86a039c legacy-trunk
+64658 f927240def1b73c7ed19db8b9002f256e1383fe1 py3k
+64659 b39ceec81c174f81dde12d9c88190e611fa67d9d py3k
+64660 e22deaeb6c1b02f217b7442989811daf8eacc232 py3k
+64661 adf48f2fadfcbbe9574bb306eee6920059d2a44b py3k
+64662 daf9fad7c5519136e2289ca89a371aa480afae76 py3k
+64663 832ae513d344450166a7f605ce4572bf2fcb376b legacy-trunk
+64664 e4bbb1d3dd145c8c86cfac06516a56e24d08d541 legacy-trunk
+64665 309542fd7fe8d3380675bf3cf14a7c11336d1f67 legacy-trunk
+64666 81fd8a8baa9a733cb519ca2e811d9a58eb453750 py3k
+64670 1899be3122c220ec9fd7bc998188767bd3e0e298 py3k
+64671 5f4a8980c1acbf6997c0d7f638ffa40d85c62526 py3k
+64672 7e56016a65659e0d2fe0a0a06899c97c25217839 py3k
+64673 70e1d2bbbc32fad158d9b32a420134bb257dc112 legacy-trunk
+64674 4025f638911fa1961e113db9d08817f19103d6b6 py3k
+64676 bd2334120a30e7c471b47543f1769b4bef4f2f6c py3k
+64677 6901d5ff0f7ab6a9300dc55efc6571acdf10013f legacy-trunk
+64678 fb02fedfe647f2c882f344a677eb7356c7529d3a py3k
+64679 1f8be26d098aca6bee6bd1b37a0edfa98f68f9ae py3k
+64680 98860cfa19fd38bcfbc802dda428b286b576b14f release25-maint
+64681 aa1fbe321acf1f0a2f4e440f9e4994ee0795108c py3k
+64682 350a289b0ed45c44e47e8fb9e9a41481c0b92965 py3k
+64683 ef8d7487a07773c3f83243555b51315cdd7fbbc6 py3k
+64684 a5723a8367e76a18966349d5c98d320a54a0da28 py3k
+64685 4224ff77a1ddcfef250e19f6a8b8a124fae27697 legacy-trunk
+64686 893d90b7731bd015f061cc87833aff2e9f780643 py3k
+64687 7d1e61492c7dfd78b21d41196325f1e192f45630 legacy-trunk
+64688 acfad8640e21ff9bce4feb3e35f4ddee2ab381c2 legacy-trunk
+64689 e502046668b100c8f696f95a0502f46727889799 legacy-trunk
+64690 807d6995bafd3eed2674d9ea008692d333523b98 legacy-trunk
+64691 cdaac79a723768d9283013463fb7447679d287cf py3k
+64692 2d0c3643223f69268508632237a277324608f4fb py3k
+64696 40ecb913399e673134b6674cdfb12f923c40b8ea py3k
+64700 b1b3af82add6fad3b2433806b597f006162baf6f py3k
+64701 4e6859c6d38c8a2caa936a72de1b223806d5f321 py3k
+64702 13c9852de81a3d01a28f92f6223efc8e09a9e269 legacy-trunk
+64709 ea7cc18c9ac86f232ccbfa5a91d28a048ac8227a py3k
+64716 dc9b3f2892b8b0c49e32b4688bed8b2c5c58ea02 py3k
+64717 04817793b9625b24608daa17ab32e913a917e73a py3k
+64718 f27206101ff943c2a02eb4b853a44d67dba22fd5 py3k
+64719 c93596ec1d3de665d3610c2cba3d184ed53c95dd legacy-trunk
+64721 6f132a26b22f77ce44ff1286aff52d35ad6cde86 legacy-trunk
+64722 d7526670ff0adeede82d8d32f327f0f81f3a283a legacy-trunk
+64727 3b00e9f9d69259f2c532f5dac911c12bcb38a136 tlee-ast-optimize
+64728 8f13465022345ddb30fc165499f67ff5ebf80183 py3k
+64729 4bf84035cb5f5841eb70978e6b05b43f1188f2f0 legacy-trunk
+64735 f772476ad90df8e9276404c9e067b79a393516bf legacy-trunk
+64736 2279dd4a2f732b7538789dee4247c14f7893fdd9 legacy-trunk
+64737 4721f27ed6c27e8753d3aac60893a03a4909fd14 legacy-trunk
+64738 fb279242f97102d0da76520033a6bda79ba1a2ac py3k
+64742 4800dd22f455838f2d20b5e60d54da7b7e7f11be legacy-trunk
+64744 d66579f925c46f85b8b1e8da41ceb4a356130b63 legacy-trunk
+64745 2476373f554d15391f8bb2ba483d80fa23d71a67 legacy-trunk
+64746 45b672367b1f7d522c3cdf05f50a1f79b48ad39a legacy-trunk
+64747 4ba3d07b871f873437493ba6e34ae829acaab651 py3k
+64748 4a72be1d5c21811c853f8f0f90d4afed17a23f9d py3k
+64749 6ae71f522b2f0abfe6d00952d6ed15fafee28a3d py3k
+64751 fa34088380f9bf309cd8107265bd620ada480c1d py3k
+64752 a0882bfaf54d8d7da2f9be30129ea01f7642999d py3k
+64753 0738119c1ef8fd95a881322f9c5aea56e2b809cd legacy-trunk
+64754 a312e03a0633251d1fe3d25d7a86f6da6871a3d7 release25-maint
+64756 c3193b7156bb66504134f21a0ff96ff1d1a86330 legacy-trunk
+64757 c3bc05237272edee021862cc774bce46c180d0a9 legacy-trunk
+64758 2b9e130e21bc54629788b975c8ceac232d9477ec legacy-trunk
+64759 6c9af14d7b813476e21982b956c05d21917c97bf legacy-trunk
+64760 71d31ab7350731facb4fc708836c6e5658e93b8d legacy-trunk
+64761 3ae929c0ee7a285ebbe56b97d44fb308f9bae2ff legacy-trunk
+64762 0c62a279e4dafd20a22e5214ac11f66c20fb7c98 legacy-trunk
+64763 3947bfdda76d27ce22acbf5ff4873ab4e97f1cd0 py3k
+64764 640af544a861f704a363aaa33e126881736343dc py3k
+64765 2231a5cee3f56ec831008738a292eff2c45908b3 py3k
+64766 4614ac312ccee98026c2a027befe12f60904f401 py3k
+64767 30fbf8e45549d029694016870733ee9ec56dd0c4 legacy-trunk
+64768 d7fd32ce07aa62af5efe97690be464887a4bcba6 legacy-trunk
+64769 a244d6b145018e80dda632f8764370f5d1e3def8 legacy-trunk
+64770 5b2f03bebe3baf6bb58c19b27e66d5a2f6c5c59a py3k
+64771 08c5c8c114b29a8e82903bc1f73e641976c6c874 legacy-trunk
+64772 26799861d318ce07a463b7a94ab96d4d095d7af8 legacy-trunk
+64774 65f69cbaf4f0d5b3b6f80aa69af7c68b60a586a4 legacy-trunk
+64775 bc943bbfdb1ecb333ee8bacba2ce44838b9af899 legacy-trunk
+64781 83f4b777d94c5e3523e9bd6b5035c9fc9f1ce60f py3k
+64788 f8b743632593aa4137a3dc0a0fae1cf6a098c024 legacy-trunk
+64791 1bc543944daa28dd0dacddd9a06befc42717fb01 legacy-trunk
+64792 4c01d78ec59fff4f01e61355605dd4d21807084a py3k
+64793 36188544c561026f6f83d6efafd9b84af67e8bf6 legacy-trunk
+64835 bed3dfd99281e41e758c147c70383459764d9fec legacy-trunk
+64836 c32e91650c144b927dbc2225797b3191bbabe033 legacy-trunk
+64842 68c7964d25347d27d1baac8d978d0713ca2962b9 legacy-trunk
+64845 8e7383cbe56e49a7edd2527824fc6d4c16576011 legacy-trunk
+64846 bd435e8b2e28006deec64007c247e5a4874b9e56 legacy-trunk
+64849 05fed9bf489d783e1c46664f3f1b7990513fc6b2 legacy-trunk
+64853 7cfc28ac0715201c936d7a84298e9a5e264a8e23 legacy-trunk
+64854 1274211a388f9ad1f866688d9078533b5ef02e92 legacy-trunk
+64855 328f33baffa3827d68193476f7dbb4b0249f099c legacy-trunk
+64856 fd054e73e2f239e335f54fdf46fb4437f92e0124 legacy-trunk
+64858 1d44e004c91f8a2e9855a7b815cb5ac54de3da08 legacy-trunk
+64859 76325c19af84084d3f408c8d0eb7fb3a265e5adf legacy-trunk
+64860 1cd4d62444b6141417253f2bebeef64663e9e89c py3k
+64861 e16384e3ee22a66466efb4998df6e136ac8dde72 legacy-trunk
+64862 545e44236f286d56db2b9e7cbd153fcb3784c6b5 py3k
+64865 c03b223c2b690b5b52008e6a67cf6fe0dada1ca1 legacy-trunk
+64866 381ae2ad810b76327e3d92f932c3fa8c9575bb00 legacy-trunk
+64867 53b51c213b3db018c771077fae3b7f196b69c823 py3k
+64871 e286bd0f4e1bdf6011ea4c49f86d75e172a4bed5 legacy-trunk
+64880 13e525d974b158bf6daa42e8e3d92347a81a3856 legacy-trunk
+64881 4f804ee772eb2fcbcff2d1d0db5b1c89614ce533 legacy-trunk
+64882 faea6e9da639af1d01d2a6b423213eec66e92aa9 legacy-trunk
+64883 c659b538f7bac56a7a7c9505e9edd5ad0a7d4520 py3k
+64884 cd7763b05446f038844dc33f30dacddb4e968a47 py3k
+64885 8da5d38ddca3b8dcd14bea0e6c470d7e2f86bfb0 legacy-trunk
+64887 90b6d19f06c1d9ff28ef68128cf0964cd54bce3d tlee-ast-optimize
+64888 a747cd066f3211f90da0b00fa442b9c526e8749e legacy-trunk
+64896 ad309122784ceff56bc6694e27e0e01178282447 py3k
+64897 38d3a50defec97f4679e791bb4e2e71882143438 legacy-trunk
+64899 d6dffdb30bddd8adbe845fa670d5e2dddd614a1f py3k
+64900 bc27c8967cac1fafab5b90f8352ada2bdb9031b8 legacy-trunk
+64901 2c9d0a7e3bc4d3dd3ff047905d0c491fd752ac4d legacy-trunk
+64903 beb0ff5a2a0f58c56bbd98956645d6abbceb351c legacy-trunk
+64904 5f2431de63d0a5148dd2f3cc463c3f92675e9b65 py3k
+64905 2ea829dd6b5a1de715dd7443322ff437103199b1 release25-maint
+64906 19cdaad788b90f0a30103f23c22816d8f52d3235 py3k
+64907 5ee33b9ddecc6934f87f619b2b6076b3f47fe1b4 tlee-ast-optimize
+64908 a70d905e50418b11942a088a62030778b07413e6 tlee-ast-optimize
+64909 e2296b50063df3e7b9d4fa713987b2c63ee51791 tlee-ast-optimize
+64910 b35c8b1940af52100e9e3ae97933f6a9bf344b24 legacy-trunk
+64911 b5cf0cb0c7ce58b73035d050b9e6aabd28e817e4 py3k
+64912 8686563281539585bdab578bd19a9b024ee5662a py3k
+64913 5aafa23cbffc9969162cb318a459c72cb5fc22db legacy-trunk
+64914 2321040ec90be674b3b82bbc27563d52ec45170c py3k
+64915 b90752c5e8c153c69a8e77f27b01afb12120fae9 legacy-trunk
+64916 8cfcf79327245cc70323f37739b859c36dba401c tlee-ast-optimize
+64917 ab2cfd7c3be87627a6d2969dcaddb87fffcaa6ff tlee-ast-optimize
+64918 e53e4a71f56fd186bde8369da63a43ee90c302da py3k
+64920 d611b0091d5f64eeafec566fa640159c15e1b7ff legacy-trunk
+64921 5d61ad214b9c069c88b1a198f1724a245270e319 py3k
+64922 041550738201fdfe4461e797e753cdd5e08c266d legacy-trunk
+64923 8d0a976816f2f9de78038eafae40b8fac4ddf2a7 py3k
+64924 18bf2aaa87b5f24e7b3143e026db4742f9f39a0a py3k
+64925 c5710f0debae27515a7d8a309d11dce14670e90b py3k
+64926 e5e12d31057ed505bea75025c8c6fdf0f3358600 legacy-trunk
+64927 5ac26b1f25d91eec4baba489b22aed0fc2bbdb34 legacy-trunk
+64928 6c1237cb5aaa66bdce885d09211a7df656ccfa7e legacy-trunk
+64929 8bace214ae54a20c90bacc962ab8fb4956d5fa66 legacy-trunk
+64930 afe8d515bfe2e9c99ab72fab3761c1815ad7ffbc legacy-trunk
+64931 81e34d7e4ba0a7fa631bd3a4180a0739c239ab9c py3k
+64933 6fd8a1d8448bcd166fe370c43c2dc4ccfe64a88b py3k
+64934 be3d3106da6f2451abea6db1fc67e7c993e54083 py3k
+64935 afdd64edf189e5f9679372106292d5d463131bc8 py3k
+64938 92b1cafa3267b6688039a3cd7b826f3a5993d633 legacy-trunk
+64939 7a30b3c5cb57a7bc96eab6bc3b43337840dceccd legacy-trunk
+64940 c3bc438882cb82f4e2e9dc84289c283cdcdf0479 legacy-trunk
+64941 ae34b951b3377626ab4d7eb1752934754f9929ab legacy-trunk
+64944 2ad749d57e62c0505847520f1f61c176f314a82d legacy-trunk
+64945 2cc4e1c475f813c14ca001078687c2ab5b8f2dba legacy-trunk
+64946 c0c06ffaea8310913e034ac84f272eaeb19d485e py3k
+64947 19369c7f57914a5cd42b60083ddec5970b1a7812 py3k
+64953 e7a6a4515ab0b39b55b241adf21685aca5337a89 legacy-trunk
+64954 9986820723e0cfc7272de899d80a1b400d5c9a95 py3k
+64956 3d868254ff7eefd6e3a1fabc3717397a37c91755 py3k
+64958 c2b114d0e1cf4d737d59035874b135eec3f2b10c legacy-trunk
+64959 74195499e9093ca75ec11f1a4b4db53ea921436c py3k
+64960 d4e473291a17cfb3679869cd4d661948e7fca5af py3k
+64961 2fbe28deca2a284cd843115e42d12cb8e576cb3a legacy-trunk
+64962 f9b80a820a2569cabd582fc98a41d9dd94464fd8 legacy-trunk
+64963 7d570df5e90a413be178870279a4ee8fba442b63 py3k
+64965 2ee09afee1260250fd78d0275b77eedea5bff3ab py3k
+64966 ded217043707c2f5d4365bd8d8792794a0e44c04 legacy-trunk
+64967 f4e7ef4329a957e92afb11a4f0efc82dc6ee6fd9 py3k
+64968 1fdba097932af86fa416e833a72d6cbd921518f1 legacy-trunk
+64969 f8723eb105acd5fade0d6e6baf532243213b7f95 py3k
+64970 e26c724d5e23e3748f86ee57540c862e44bacb48 py3k
+64971 916d33ec7b5afecc0b43dd3c5c448384f1258219 legacy-trunk
+64972 432d27808bd1ee6393a69afdb8b96cf54d3c905e py3k
+64973 1f24cec0f2e1d68d267d178186eaf1ccb138ccf4 legacy-trunk
+64974 97ba936e8df84ca47b0c961ff21f5e608b4a5750 legacy-trunk
+64975 d040a3b63df4258867a16ae09bd3cd13d9c86896 py3k
+64976 875beb4ad889150a605820f43d46e415d154fd47 legacy-trunk
+64977 35004d9bfd1560404531aff22db95935443b975f legacy-trunk
+64978 da2d363379f26e4e44bd14dad85c100f2044e4aa py3k
+64979 a4482a1a30c6d93cc32343c8b1286ed8275ee7b6 legacy-trunk
+64980 1e0091708875a78512f4137354382810ea8c9e30 py3k
+64981 9cb28ad5a41c0012690e5971594b25be560c11a1 legacy-trunk
+64982 01fbe3fc883e0aeb1ede314382ba93b436467691 legacy-trunk
+64983 51c0d3a071ad007806fc7d5dfdfca22ac3a8c188 legacy-trunk
+64984 3fa44e5e4e2b1f2cd6d8d42580d45f749e389e0b legacy-trunk
+64985 c662e8cffddf61d5b6e4c5daa6992e944bf0fb75 py3k
+64986 eff9d11c47626abce07267ab22cefe8e57346e4e legacy-trunk
+64987 3a3a5a4921471c3480141fddb457f71ca5b2b411 py3k
+64988 3bb1f8bba33676a35977a9364dc3cfc91962a26a release25-maint
+64989 bbd0c90027bfb77b468ceef315fb1f62b257b7c6 py3k
+64990 bd4841069c684858b272d2248aa55f3e63fc1044 py3k
+64991 d14d0b15e18e70f7e7486953805fe428509b9d73 py3k
+64992 38d719beddbdd863651c90c1d261f1a6438663d3 py3k
+64993 ea23e7c5615456ccc59d3b3d7e01e6f721f2edb8 py3k
+64994 fceff954f3804c62b1ce655e24dc9134c231dcdb py3k
+64995 8e9e65383afb6502e39de74d150750e9b05ea128 py3k
+64996 65e9c0102ef9c4b0947b90ed215838af1b723a95 py3k
+64997 926b2a19608315278508b105f077cee4a0be1e9d py3k
+64998 9ebd3f3855759d58aee4eb8b97cef37bdab8234e py3k
+64999 aca5b2e6a66f324b74546eb80f54f218c735510d py3k
+65000 f58e3a0ea99a17b76c5e086df89588cd53831ce2 py3k
+65004 9aa0781615fb1c7a760adb6dd5d52681da02db84 legacy-trunk
+65005 c0ab2bafb26440b59f984905c641a076474a4655 legacy-trunk
+65006 cea066dedfdfb20882596ea339327671b2ac56e1 py3k
+65007 ca0d620cd63b2a5fbdaed41be8667757fd1fdcaf release25-maint
+65008 2bb866d282bad55dfe65e7139b12933bf82a9bf7 py3k
+65009 177302feab368955eed0325ee9518daf5aa89b47 py3k
+65010 de0bf60f1245ac73e44bb25e2c58eae6e5d082ae py3k
+65011 4f6edea4b5585611c154f5a20fb0d2797cd2775c py3k
+65012 a5191d7ea40540c3161e5acd49702a70134b8c86 legacy-trunk
+65016 5f6dc2f86a8844175b2b9b3adc377f91b7eabe6a legacy-trunk
+65019 ec38fbbb8ccebe1f2670907e689268158f8afbf1 legacy-trunk
+65020 b645aa2bca9cc71219bc23348cb1040b4e6c1a18 legacy-trunk
+65021 2e90fef226ea6c202da701db6a20edad708cf6a4 py3k
+65023 a0963e46f43e5e77e92355b55487f1f476d5e366 legacy-trunk
+65024 654ff5755436ad53a6da1c0d12b14b5574bb2c3c py3k
+65026 655227c988a78d6d2283c14c8f8c1ab762a7989c legacy-trunk
+65027 acaca11d80dbc84d3109ad86bd91034576027666 py3k
+65030 59ac5aef3b2d1ff3c3a6c76c944592de15b2e56c py3k
+65031 b2f3de358af4080324d7af845ab8215ef6b98016 py3k
+65032 09beb96ba20d47c6341727e1fec6fd0c106d4c89 legacy-trunk
+65033 ec85b58ad2ba4a080a601bb11b8476b9698e52ec legacy-trunk
+65034 6c8bac913aabfcc08c5fd47f5ce4e4a4d6dcb8e7 py3k
+65035 ebe932329246997d538120a38aef7a56ee2c3836 legacy-trunk
+65036 604febd204cb2d3e63f29f14b91e7d694f92aa4f py3k
+65037 ec97b7aad231beccf7a2783e4b4028898caa9366 legacy-trunk
+65038 efe706aab32b91ae283aef1aefcb6973426f2dca legacy-trunk
+65039 01806cdeddde3608bf0414940bee8199dc152a1f legacy-trunk
+65040 091df4c08d99a4de5357c9998f84e56909a8bb99 legacy-trunk
+65041 fbf165a7895373cad30cc60f1f365f2b237d5f9b legacy-trunk
+65042 7e030b628294db229b8e072414b55c7157b711d1 legacy-trunk
+65043 b9828b2a51c0ff351f1cb6f3522e75c84fe61336 py3k
+65044 921c4a8099238317d5df8f3e276fbb966ac58c19 legacy-trunk
+65045 d87cd5e7365aa82ac77175343ff897c2e9917b1a py3k
+65046 768bcff4c0daeda647dbd274410d8df7013fecf5 legacy-trunk
+65047 f2c7279258c12dc46696c43c5d9344af311db00d py3k
+65048 d31d61f46498d142173fbb25126baddcf4e3e38b legacy-trunk
+65055 30fdd0c3b6de1b8235e75ab5800906f9c7c443f9 legacy-trunk
+65056 9c56cd97ff4dee309468c35230dbb98585a5f46d py3k
+65057 27bca7fac362d71590dd63be8ea615254f6c9178 legacy-trunk
+65058 c5911a7b5fa00bc275f6cd7fb6d729a8b4e5ed7a py3k
+65059 45233d4c18d23b060aede3bb5f236f3ebaec2fb5 legacy-trunk
+65061 a29c86ce766871113be276c4286b2a1eff421581 legacy-trunk
+65062 1be5b6be43cb698542c839219675248db82ac59f py3k
+65063 79f84bc2b1492085f7fd6c3d7e6ab655e9a4b56a py3k
+65064 dbc2b7ad0c2217c080edc01c479761acde4fbb29 py3k
+65065 eefb98379644d9bf84c5e2feb3a259a15a35b50d py3k
+65066 78a29a05207982d26e73ba006b3e449aafcb7765 py3k
+65067 991cadd47d9732f311211eebde90fa8e9e7d9a34 py3k
+65068 2068710b32c3513c24362b08b515931639464ac5 py3k
+65069 f283e3b5f917ab26b538f4e8a044fb07b7869ada legacy-trunk
+65070 560388cda163d93dd8c84f9b08a22feb45bda2e1 legacy-trunk
+65071 7c6ec7a8016adfa734fb9722ce10dba66c9a81c1 py3k
+65072 ba39b40ebf2d9339cabc7d5f043a0afb07977447 py3k
+65073 83d0d4cb7a661c97cf59848bc66176f988e892a7 py3k
+65074 3d526525b3e81d94aa4f2e4c67081a5683498f5e py3k
+65075 5c33009994b46358d6ef9835374d8ce38d25b3fb legacy-trunk
+65077 6dd520e1bc0db361faa1cd63eae416c94cf3eadf legacy-trunk
+65078 4deadc8f9e0a393ea61aadf8d9fd94e3e6b20186 py3k
+65079 031b5ad547e427b437794b8181f29249062b083f py3k
+65080 16ec4bb14a68ea428acf09ebf0c92981da2646f3 py3k
+65081 a968029b63db121f007a7dc90af88ac582dd47e1 py3k
+65082 81ec8263bd6e25c9a8855cd0ce9ae881732972be legacy-trunk
+65083 58d4bf31728ff8b429611b3f4b0e4921b08a1ac6 legacy-trunk
+65085 19e779d0205353fc8ce19035734e37828d2d43d6 legacy-trunk
+65086 b74e9d09b180693d00cc5b3346c1014d146c1572 py3k
+65090 78ee6ba2099ee7d2c6d8b5b223fb9e119b37d85a tlee-ast-optimize
+65091 644ca4487881e879e010ef53ff99468f9a83405c legacy-trunk
+65092 0eae9b25a2ed0bde05951b9a00e5c98272ad28d6 legacy-trunk
+65093 8ec1830d5719973e7073a81b898b3a11037c1a10 legacy-trunk
+65094 1acfe428e8f19b9790f457d82fcdb4c2e4ec3af6 legacy-trunk
+65095 cec704b79bdf1f5501369f16d9fd75277005957b legacy-trunk
+65096 2925135ca050a64475ddf32ab0c3754e794e6067 py3k
+65097 4ec5a0ec631a0553c5568d348bb83ab9d2ce1b53 legacy-trunk
+65098 e85d5690c296ef6f30f5e9730aa61b0fda7ca02e legacy-trunk
+65099 ac1cd46bf7d57e9b4d74f2cf0b5b31135cde1c6d legacy-trunk
+65102 1b20afa48d58ae5125493fc2339e298f70fc2e4d legacy-trunk
+65103 c432307ec00dd6d6881ab011d414a91e486111d7 py3k
+65104 9576bb71a01b48c0cd40930de6978e68c519e313 legacy-trunk
+65106 e7d64e82903522b336703fdf1a8c1c3ed2a6e2d8 py3k
+65108 9bdb7404efe7889db8be743eb823c3f66e7dd171 py3k
+65109 49726dca16d811c318dc33fa52eca27a5458578e legacy-trunk
+65111 b931a022646656bf19cd5482f20e12d48e654cb0 legacy-trunk
+65112 f9040d107d6647def79dfe34928e4138e0480f67 legacy-trunk
+65113 297951306400521b7d7840b2c1b00750b0e5dfbf py3k
+65115 6e7716a3bdec1060b8eb53ac6a77c392f056f621 py3k
+65118 dece17edbed08ab69c9221f868bd0d4556cf679d py3k
+65120 feffec26c56cb96dbcec32e7d96e5bc910f2129b py3k
+65125 40db45bfc0f2cdbccdefa65fa655938d17b77bce legacy-trunk
+65126 48e83e66935a9a6c338a579a95f012f541a79557 py3k
+65127 a5ffe34c72c4899dc0cae7839d2ffc6cfa238785 legacy-trunk
+65128 caca33832a1a5127c227fabf99d983581f5f9ee1 legacy-trunk
+65129 e6ba6f41469bf30bed4becbbe252faf64ebf90eb py3k
+65130 6c5cddb267fe24d59d5b31eae0d0b2c2d594dda4 py3k
+65131 7ad6e4cd771366d94558377ae086bc00c6e11515 legacy-trunk
+65132 40b0e3318a8bbadd17447a684dc5290840194a0c py3k
+65133 33c6af69ae0f17531d2aea8347688746d0fa5270 legacy-trunk
+65134 e907da8251691929e8fe55f8c2bd3f242919950d legacy-trunk
+65135 49be8812d4330aede500d08a9622a8abb35fc6db legacy-trunk
+65136 96eafab489012edf2d9813bfed100bea46ac4268 legacy-trunk
+65139 7f5422d0409f94447e7e14e6d14bffc833ab6681 legacy-trunk
+65140 dfc37583f204767ecae69e465cee163ec099fb79 py3k
+65141 948e5b3233291be15256cf10689b567f37516f0f legacy-trunk
+65142 407eb004004141ca8ef62ac787b9174372013fbc py3k
+65144 89f5cfec0573c5ea3312b799c500fdf311c8beaa py3k
+65147 7c147a76a0b2724675d490402bb44f9f6f60e5b0 legacy-trunk
+65148 8cdb181aa9afc675808e92cf666af1113f22e3af py3k
+65149 70be69c93e33aa53e8ec25c1d0af028810f8ff78 legacy-trunk
+65150 43c6934514d7cc342e63a242802f92e7c7cb6b0d legacy-trunk
+65151 8989213f386b26be44dbbc8e4cd2b1acacee44fe legacy-trunk
+65152 644fa7a240c8b7961d6e7ab24cc2b0933aa0e1b8 legacy-trunk
+65153 bb2636882503dd26df2ed74f904febbb2a6f0ef3 py3k
+65155 d27e280207092d8506b258374ba67ce38b6b88f4 legacy-trunk
+65156 1d4cb26ec89fa69dac711393138ba5e5fd966357 tlee-ast-optimize
+65157 578a4b0a522d260fd10085534a264392802c9580 tlee-ast-optimize
+65158 1ed694a7ab601473941409c9e063ce3a8ffadbb3 legacy-trunk
+65159 a97fd5a3b090b69c69cce41e2d1afa61568a25bc legacy-trunk
+65160 60535250a62c6a40f6ddc5347ca3f1efd577ef71 py3k
+65161 62823eca881be4a87ec60da0ebe2bb930013f977 py3k
+65162 7ccce2a7394a0282be40abb4e5cdf1098d5e09b3 py3k
+65163 364106796b210472ea29df682452019f47be521f legacy-trunk
+65164 ecc6be380c5bc8a4820cd24334923f01c864a844 py3k
+65168 068c00bf5a24afff3695140b263a02d95e6cae95 legacy-trunk
+65171 0a741c13fc81c6ec28ef9bfbdffe0bfc0b56a593 py3k
+65172 3f6d43d5755cb9baf3408a44308472a2d598321b legacy-trunk
+65173 921b6759cbde709db662fce5c1bd00a93401c39d py3k
+65174 a9dfa0851b0738c413f635ecc2567760fa62e713 legacy-trunk
+65175 975bbdccc55ed582950be0a55640cd4513bf4cc8 py3k
+65176 8331bc4e8278c83bfc19cf8c6ede3d48d2a616c7 legacy-trunk
+65177 b836bf25f176a29f3b61b9b787cb1da6d0342c16 legacy-trunk
+65178 ba2767bd46205299906076d3ce3e0399a03ce241 legacy-trunk
+65179 d8798d5ec4b93a57eada7e6ce60f93bd79b5d880 py3k
+65182 5d3833e6aae30ea1a9f4bba9183bee3c33142486 legacy-trunk
+65183 3b5c2613ed05dc9901e34d944800834cce09c5b7 legacy-trunk
+65184 96a9ebfee2cd2c7645cff9ca9df833a4a4541d01 legacy-trunk
+65185 1a2f8dde81ecc428fe4fc6c462b713eae6846dde py3k
+65186 739bb0728efe5299bb3ba71c800dc804b1769290 py3k
+65187 ea53ee8a833321d8e70fc5bde12779ba00558d6e legacy-trunk
+65188 90fbbbce757af87151a17d77f2ccaddf3b93acf4 legacy-trunk
+65189 9561aaedfb738f09fbac8a2a25779c1c53631f75 legacy-trunk
+65190 dd31490d3eb6de8205d86de006caad005c1f90fc legacy-trunk
+65191 821e73d7bcc54a4b85cb8edd39e73015beaf0b63 py3k
+65192 679e3c272ec262e2dbf1d8397799a31f922ec237 legacy-trunk
+65193 10f41adc0d24e60223c51a1dc9dbdd6b6c29b38e legacy-trunk
+65194 761dcaaaa09e2105990cdf8b8f6d2dcf2ba49fd2 legacy-trunk
+65195 6ca8af64747b508c65c809141539a69b76bfa9b1 py3k
+65196 20b4b83a54aeff120145add5e9d9919c71dc23c8 tlee-ast-optimize
+65197 fcbd9f4f095c4f00e08485aa2cd1e8f170a7a5e4 py3k
+65198 0441d30d672be0657dd2e5f2f84fcd363faf3502 legacy-trunk
+65199 8375b3f6470f60b941d1fb0bc0cd743b7ac4f2d6 legacy-trunk
+65201 0d37ab00f6d6c46d49b406d68e6f8eef0e841428 py3k
+65202 bddc1a17247e3f95766a143157a085cd83dcfcbf py3k
+65203 ab22177eb6dc495663a14d5645a718f6a8a6f938 py3k
+65204 45f88d7bf0576c34dc4a3de648bac8f664abbce9 py3k
+65205 179a7f416240af5f62f7cf9de9cfcd6069f76557 legacy-trunk
+65206 b51cd5d3795cfb518ce5501e6d1b67abcda1eed2 py3k
+65207 3efa20916a9043f9cdb2c4fd28b145fe1c090267 py3k
+65208 887ee6bd9284fb9b6eae41fbc23eab47329ee7ef py3k
+65209 b68704457efef10f277756d0bb7daa69249496bf legacy-trunk
+65210 759a7323591ebd940d378f8127dae7f2545b156e legacy-trunk
+65211 3853856f7c5055d7a43837f02d534e637d75afa0 legacy-trunk
+65212 08ddcad851348eb4f711a449ac20df46a104ce22 legacy-trunk
+65213 1b1e1f872e09831da923a9cbdea788f4f7fd47e7 legacy-trunk
+65214 07b89653145e032a8b4840276a2d0b6574f58c7d legacy-trunk
+65215 4203b7f087c102364ba9831d4d15f4e5226891e7 legacy-trunk
+65216 74fb0df29a4876a37552b29957eb688845db82c7 legacy-trunk
+65217 290078e9b6a202edc523b55b9f481468d5a7eb8a legacy-trunk
+65218 1c78aa7ea3360f392c4f6f687dfdcc757dea483f py3k
+65220 1ce7e5c5a7617e966bb74111c8914e4caf3764af py3k
+65221 d9d49f67389f6399db08841765df12855786694e py3k
+65225 101bb18c10d575dcc30a22441f39435a553ff851 legacy-trunk
+65226 781630e25540a35628c6a66b96f27e836a5f43ce legacy-trunk
+65227 35a462ff9873173ffb742c2f6f2b2a024a92e4a0 legacy-trunk
+65228 a028c0b2acee7896012cd185e3fb1ad901a96213 py3k
+65230 862c0eab1c509b50e0afcd1218db46bb418de1a4 py3k
+65231 8ff25db010782921b2967d222a2e92f453786641 py3k
+65233 182fca025ca04d55cc4acf7f9b183383a60d0185 legacy-trunk
+65234 b71d76bf45066bd869271ba22350ff544565d4f4 release25-maint
+65235 972f489ae356f75fdba0643181d32892087c0829 legacy-trunk
+65236 55640151e0fcc0ed844b57c9843025de670a843e py3k
+65237 be07c3083ceae290b9038aab91af560d6c69768f legacy-trunk
+65238 74eef85b4b2cdde764fad160d424d10ab4bd42a7 py3k
+65239 300df6b1e4b0d77f42344a6c8f74ec034d67562b legacy-trunk
+65240 9a6f8fb175e057b121f826eafa4f727ff426b049 legacy-trunk
+65241 30485bc172680615a1ec97a20224aef24efc4efa legacy-trunk
+65242 497d2240e1f0e96c914e5644e394e6bbd07e0556 legacy-trunk
+65243 d3d586019afff0e75898f802519bf263d66f99ce py3k
+65244 b2117b18049c42a0c678237db0f511fa07bdabd9 legacy-trunk
+65245 613b24014afba1ca7955abcb80ee52f00e4eb4c8 legacy-trunk
+65246 767cc89e3fdec5936c46c9b7092b6353b0696bf0 legacy-trunk
+65247 4a4621a687a787eb3f83b687e6004189f33ad857 legacy-trunk
+65248 2d0e04001e81c36b64e907364ba97d5ffaeab0ea legacy-trunk
+65250 2fb55ff06275e65c70823f595e04f2924e278765 py3k
+65251 7b08448133893be9b324ab10acdd3a68916e04e1 py3k
+65252 71532ad7f3edf608d9a1e14493a86760644d7b1c py3k
+65253 0c12a37d5e5d3d46493ceac91f7227ca3dfff35f legacy-trunk
+65254 b8d4dbb2938a59a1f930c6c142baf3442749946e py3k
+65255 9f9e5fe63ec2cd74592ba7bdd3c6d30588c7ba20 legacy-trunk
+65256 3111b6543dd9e8ae8e40f6bb35d1111cbce8d158 legacy-trunk
+65257 f3bf2e9bb868c6e50cf09b62582ea2aee6074095 legacy-trunk
+65258 b01e20d373042586269fe35a98ace2c315dc6363 legacy-trunk
+65259 e3da869de98eab15e4ef0cd2b76f2aa15d3c1f62 legacy-trunk
+65261 2da42dcbb8cebb04edc502d4226715f63d0eb960 release25-maint
+65262 cc84ee6667b70e587d51e7e4a225ba077367daec release24-maint
+65263 95df118f42c6f21b007aa5e8101baa93b7b76b86 legacy-trunk
+65264 151c1cd94a402bc0e4e3f3e0fa83341517e44abe py3k
+65266 8afc4e2c4c0236dd59ff665f6ed5a4cc03b959eb legacy-trunk
+65267 40a573f01fc4a2d171ffa15bb5a81e8d7e6ab497 py3k
+65284 ccbc8774d82b55c41fc701224a68cc11b66fb714 legacy-trunk
+65285 791a631a2c7c8281927811aff9662e68e7cba097 py3k
+65286 262d2ea8ab50da5bf4b2626253b94deed174c4a7 py3k
+65287 3a267fe7383c48112660728dee31879d89425ee5 py3k
+65289 50228d2b32c14114df2a2aebe9eafd24ced407f3 legacy-trunk
+65292 21eac91382495bbbe0084811743d9992c6ad66e0 legacy-trunk
+65293 0c7fab0b05c036376b3e4c79185cf7d7e18c501f legacy-trunk
+65296 689b5e8ae69d4b1535a1f6a84a8e43d3c9760430 legacy-trunk
+65297 008342519e8656777c32393cf3e81b8c708d89d5 py3k
+65298 fd308f038afba797b9cb50ae4ac90f40d05163be py3k
+65299 b40e13bcb9ea5e86538cf748b5edfbd3fdbd7118 legacy-trunk
+65307 40e949a6834465a41cdf76468ddba99cf646693a legacy-trunk
+65308 8d05dda735f879c9940da7e53ec865d02f85b4df legacy-trunk
+65309 b35ce954a39210ab9644f9ad6109f2f5d2617827 legacy-trunk
+65310 8f3620f5d68aabd5990d09fc9790e6319b1b0a0c legacy-trunk
+65311 90c25b36e0ad69575cac888460cc5bd3e8c2b9e3 py3k
+65312 83c7a8faeb78e69b7d5ef684142b21581ec552b3 legacy-trunk
+65313 12e3c38d316e38dc13c167ff20bc7cf382140c53 py3k
+65314 7f822b5d3670147f9c314fcf8630a1ef126407ef tlee-ast-optimize
+65315 67d177aab8a7c5db03a2ae055e8320c99109b301 legacy-trunk
+65318 8a133663ebde09f69fb53d2f4c380569a028101e legacy-trunk
+65319 9154553f876bc7c256075333010e4086092f77d3 py3k
+65320 0fbddc04aee159a4fce2162bddb215ca66216bd8 legacy-trunk
+65321 5db43284ea7aac26a147c738e5a0809873600023 legacy-trunk
+65322 1ec38b707cd6b149e57987f2cd83c38ba82d4d64 py3k
+65323 6f232fcfb6576c55d4fad754c58f09a87bb706ff legacy-trunk
+65324 be7521af845a0e84c6c5089417e5b036fc529c58 py3k
+65326 347603f794d11b54b09933b3d7e976d36d6c131d legacy-trunk
+65327 1de718a31004e1967e5cd5132cd4ed6bd6564de1 py3k
+65328 4cebb5c84d7cfba86f81f6047684b8e9f6e804cc legacy-trunk
+65329 037818cafc393599606ea0f9c15ef596099f48a5 py3k
+65330 4c11fc3b33a233fb4c26ff323f26c7e5cd91945a py3k
+65331 35b1a20470db079c0457c6a4ab7d973672e69e10 py3k
+65332 b3901c5660f71d0a72c0f1455707b14b0245914b py3k
+65333 187388c115050c9910408175d2f5f224a9160bb3 release24-maint
+65334 0aafd1ae51208a1b6cc3120beaab3addf57c423b release25-maint
+65335 c4d24fc8ba8a2ec65b2a43d88a3b52d500dc4223 legacy-trunk
+65337 13b2e11f3cf5bd7406dafa48df1fcbc37d0d0d22 py3k
+65338 fec985cbf53fab05837995370012464d97069847 py3k
+65339 4550144b156066fffc8fa6de88480c3155496f00 legacy-trunk
+65340 5428f7fa171cf1ba962c8d9b64d224f3ab936197 legacy-trunk
+65341 de75e7280b7aa618cca5dbf71bec2e2f9805f7bf py3k
+65342 a94f136b528382c394283851323c8578c300290d legacy-trunk
+65343 631cd9ae5c8e22e23b7ae2ff6ee52fae54d2f196 py3k
+65344 4fecc9b99d98522df2df563987f7715c92afc9c5 py3k
+65345 a476ef5eebadbe42976e33ed88d5a558e06d9ca3 py3k
+65346 c59e90d8d1c70821ce1224e5f25a75ac24db49b6 legacy-trunk
+65347 3c155d7813cc175cb9179a1b2f4bd14379ed2d84 py3k
+65349 c2b5a0ab30706386b9f3c93a83de9474ee4626b6 legacy-trunk
+65350 70d40f9ad1d7acd2784e36756c4b869db7cc3381 py3k
+65351 0d2d26ffe20eb248ac36e0280149b49310f7f79c legacy-trunk
+65352 148020b5c5312e39803a01fba167c4548df4d30c py3k
+65353 1140774f69a572c95a4201b1ca9438fb9dc45f8c legacy-trunk
+65354 f1fc7d93509d3fed219011af549a84a0fe5c3b5b py3k
+65355 5d2cd96a196bfd22a4383c0568cac2c31b771853 legacy-trunk
+65365 f121a963ab694dbbf3758cbdaff46ab2ec310498 py3k
+65366 eff4c94c02cd1e12f88b051b45d7380d06839f2f legacy-trunk
+65367 c0df1c6477bb9277af349298826a2925a6a40995 py3k
+65368 95bc0cf31203cf8772b737d201ecf8d18411b393 legacy-trunk
+65369 cc371570e141323fa047d38e72e276504216c6e1 py3k
+65370 13817742a7810ba1436d9c803c7643e68c859a11 py3k
+65371 19b6c635f5c1d3300e69138357a98fab36af8f40 py3k
+65376 1522f3d5be6e7a94697343a512ef8b3c74013dcb legacy-trunk
+65378 b8a8d113076fb94584f919a951c5d33e748ba106 legacy-trunk
+65379 4b72c7f6307745f7886bcf3efca99d8877322298 legacy-trunk
+65381 13ebb4b5d89aa89a066186cbd14c77dd5517d92f py3k
+65382 45bcd96e56d1d421fae76c6c4a327c7d868e402c legacy-trunk
+65383 0aff3bf0a3426f124419b8407cac8864fba1b534 legacy-trunk
+65384 6922f84a7158f9fc9158c4d74d2f4b2a7df7133d py3k
+65385 6b7c61027eb04fa3718e87db679cae59fded1378 legacy-trunk
+65386 5279d79610937a5b4c47501197813be943f7d3bb legacy-trunk
+65387 4b1ba50d3bdf7ade255bc4df792552792911a234 legacy-trunk
+65388 1660b335382102dc6cb3905172150aa4e5727803 py3k
+65389 f8d2a3185d9aaff3c2fa12b8797db24c729bb4c7 py3k
+65390 4f46f3f7231bff89c39829d8d7cd59343996e2d7 py3k
+65391 d21c0a2b6b11a4e9f69b432d8c5bbefd98313ee4 legacy-trunk
+65392 0018b18f5f4640a728755e7577553e9fe1400eeb py3k
+65393 f0bd37ea69405cb435ee1ca1bbeee33dca164eeb legacy-trunk
+65394 b8945d8f00ea25303f87adab4dbf3cf464ae7013 py3k
+65395 a7bf503c857e9c7ef23afd8b71c51d17dc627c45 legacy-trunk
+65396 e8796b55f81b08d05f2f72c614f81ba25f48c037 py3k
+65399 ba84c1e3dd60cefb3ca761f2b1b1c8770d6782a8 legacy-trunk
+65400 4a4c20a2167bb183e57a84e61c591c509c99b86d release25-maint
+65401 d587aa5e824d6519bcda5b3acc4f09fdb0b5aef3 py3k
+65402 feddaf21c2a49f7df94775e6fecedcf37d0a77d3 legacy-trunk
+65403 7475b0fcc5ff2bc3de30e5377c725f0bab54e273 py3k
+65404 65442546173ea428202417e84dc669b1e42cdcd0 py3k
+65412 763ff1ba91c7f2d3e59b3319dd8b07c9717c728f py3k
+65420 bf50085fbcd32d1c42d43e6ec37690631e040ac3 py3k
+65422 97607fcb7b261961eb679361cc5719955ecf0a4a legacy-trunk
+65423 cc43b998f5b5183cb1b12284b5c8ada5c134571d legacy-trunk
+65424 437ddbbcdd294b735e690a4502f43cca20f490c8 py3k
+65425 4e6a0ae1a8e7aae9684744f6a2b24100903aacd0 legacy-trunk
+65426 74cc932ad8db686b7b0d08a7a3eb9b1e634d227a py3k
+65430 8f32b13269b4b1ae947dfe8056e9fbe02d8d8f9d legacy-trunk
+65431 bd51cf7176245b0eebf6ddd6818f6f53bb03d947 py3k
+65432 e007af79f67c6a5170a5b26f991686d9f5ce39be py3k
+65433 1db48394810678936381cacaf32a338e16d435a2 py3k
+65437 3e44debc2bc90a76b1f6183dfe9241fc19518b2d legacy-trunk
+65438 df5b394d1e2439295a62090e69236594f56e1201 legacy-trunk
+65439 e934956ddce372c1e21d757cc40dd060b0183d18 py3k
+65440 4e45d0cfaf71b52bd1391c6290de13cfffbab326 legacy-trunk
+65441 8c49a3e90f40a84fb83493dc35d1986e29b6a268 py3k
+65442 1803de5ae0dc370df2372276d5b8ffc46a077e46 legacy-trunk
+65443 33daae6339ee3a270a292db67c516723c033a1ef py3k
+65444 986cbdaf154fc273b372be986c491a467f413641 legacy-trunk
+65445 5f3ef6400a96762e60c27ed51a055e6d7911dc7f py3k
+65446 251282580041a280687287d84a99bffc3f23fb34 legacy-trunk
+65447 0c6b6bd85acad37371b99faa3c81fced9784875f py3k
+65449 1f22de93daf8e33cfd00c7ae0e533057af78e8f8 legacy-trunk
+65450 82d4d6dee03475e3e6afaa4b0387b835cdf61ede py3k
+65451 d4db5ded76ce1fc18c4dcc1466164d8a449031f5 legacy-trunk
+65452 d7bae7bd39d6f230621500d72d4e86a79b348045 py3k
+65453 2e8cdee34d977eeab8a39a3a829b50a2f0d28be3 legacy-trunk
+65454 e3620b73a7d14f733ac52c46198b752283d5ef4a py3k
+65455 35e7dc977a63c364473f2c41a867f80ce21dd786 legacy-trunk
+65456 8972ce5624b4d91607cafeb20235279df09697c7 py3k
+65457 c77ac8bdd3feb4c7cda946e49136357c0a41f241 legacy-trunk
+65458 4322af1b6d3d6bd5eeb0166e6bd583dd17fce604 py3k
+65459 288ca1c72888094b5932bfb27737484975bf15a9 legacy-trunk
+65460 dc850da04bd547216e31473f68501fae212c62ef release25-maint
+65461 1508cea2c6b56e580222f829fb56430834214036 release25-maint
+65462 56b3b2ccfd688d8a54e51298d0acba5f602ea54a legacy-trunk
+65463 55e3258094f032d3a600b5b4cb70db0203b898e7 py3k
+65464 fdf3b6f499dae1ea94019949019e361a7082a02b legacy-trunk
+65465 dada94a5329f2f828d3e796c389c1cb552564c24 py3k
+65466 1c24a09acb97c9408f9766c708e85fc2f118428d release25-maint
+65467 21f146387a63cfb5c9288d7bb5c8b322bdbe0cec legacy-trunk
+65468 9dcb1d28efbb8f39f3a54d24611028a75f69207c py3k
+65469 8bd5650193c6084e3368500af441c87832379a7c legacy-trunk
+65472 40be37e69158f6fcf6f928bf8843e5d27ad3d957 legacy-trunk
+65475 641edee4fcb14f1d63ce3be3cdbf21f16c112ad7 release25-maint
+65476 c235ba70e594b140678b55d4938fb418ac43589a legacy-trunk
+65477 df0ac06cddcc3e8b5c10a6ddc0af9ac2121b28fd legacy-trunk
+65478 513406a37e38536feff5de43966464f47c1f3417 py3k
+65479 bcf40c81891e10f9d0e38156aa7c7f82fedfbe6c py3k
+65480 ab4c9c384d318802374f0901da2145ca47cfcdad legacy-trunk
+65481 a8a8232cb5419a2bbdd585304a37031fbb67189b legacy-trunk
+65482 59f4f994730fa79a819b8720855fd3c74ac0bae1 py3k
+65487 49411d7dc257473b08dd604375e888cdf42011b5 legacy-trunk
+65488 ea83fee5742230b96640acf0bb0b8ea17dfe7ad3 legacy-trunk
+65490 6c88de3c4d4dd852a6c4a5720608942de0e5357d py3k
+65502 21745563e680e0d4cff1da3c9f5c3356199b9273 legacy-trunk
+65506 6bc3cfe098ce4578fb0e722d249de9be763b0662 legacy-trunk
+65507 51f5c8e885ca8c4983f13b0459c38ae814364290 py3k
+65508 93bcc9201ee07f73724d570bd1c363689f2d1895 legacy-trunk
+65509 facd81972523b9638e9c3893c2df077863275c7c py3k
+65510 4d8427d25f84e1cc97d6030e4b65ba9b46ee6671 legacy-trunk
+65511 cff82b990a2298a292ce5010783e642874834247 py3k
+65512 47cd4516863eea7bbdd64afffd6e42c7acd7823e legacy-trunk
+65513 e9b6e4488871e9d2d1cc54ac042e5fd069b42ea8 py3k
+65514 979f0a89903f293582b3ecee8c63f2722b1b71f8 legacy-trunk
+65515 57b8c778da0734c3190dabf83220914303787e4d py3k
+65516 f7846a71e38a21108628636143028b8f263c24a3 legacy-trunk
+65517 3d083e69265ef0cc2750a2f777129acdc65e3171 py3k
+65518 6c6a030567dd06312abe46dcfcce1d33c947c927 legacy-trunk
+65519 cf331fef3293c7200e97afa685096afe90add0a5 legacy-trunk
+65520 594c99c0f0784a2f604002ef1ea3216e0fa31490 py3k
+65522 df277e642e5800b394e2688cd6f7d2db89e31929 legacy-trunk
+65523 0da302f7fe9432c733d91fb08a04a3937f5fde09 py3k
+65524 381a71df060e4f59319356ea7c6d7f6817a77e20 legacy-trunk
+65525 ffc1d8f8c5ad025b6e29d0db8fd86cc20f2c026e py3k
+65528 9faa8790211434f454654c0bb66c910e0766e2c3 legacy-trunk
+65536 68df842d633084fdd5c9e6bfce55c2f2173e584b legacy-trunk
+65539 5b774fe04c7e177e3d8b3b2315e0c820cd280bb1 legacy-trunk
+65543 b654d14cb9d9ee0d47cf23e6c164c8f0ceae9872 legacy-trunk
+65544 e5fc3e198ddac1c7c79c57ae99a07eac8c3cb2bd legacy-trunk
+65545 1635891b18e81ad6fc917c6a440e0b6aedc7d248 py3k
+65558 236637390457e6b3181ea6b62b765f48aa92c83a legacy-trunk
+65559 79ea340d1a59dafe0c5d6419dae0de1de95b81e7 py3k
+65560 83a7219364b13671883d3ef94a02c7a0a5e11806 py3k
+65561 549108e9a0a322317b52892d3429a00cf5a05485 legacy-trunk
+65562 9ccc1682e19b8789f402d77ab1feb60805e3d482 legacy-trunk
+65563 53ade9e68b562e33b4e58e37532daddb4d7a16dd legacy-trunk
+65564 12373fa6804e4b9f61e0c3565e97fa1c8eb24318 py3k
+65565 03dae037b2b727555d28dc0d6f76cfa96933c310 legacy-trunk
+65578 f1fc947722f29a43cb297d4918613c2fe7e6d92b legacy-trunk
+65580 042d16a05016911bf09bcc8817c8b2ace91cfa7b py3k
+65581 c8c9e78fc0823801a737bf2cb0c03d520019318f legacy-trunk
+65582 85b67fb5672b99f3129de033f0c601feb6d65fa7 py3k
+65583 cfad3f7f5e638ec1dd847164f1b79507c6307e7f py3k
+65584 0bf6c42ab4e423856b894638eac93178cd3a976c legacy-trunk
+65585 2b3d42effe5be169a79d9159bf6740b145d2a68f py3k
+65586 6416e6044a301676f02a6a5b92efdb89f2698ff2 legacy-trunk
+65587 a6d6c2fad2200ecf9f26843785023897e1220524 py3k
+65588 65901ffffc6abe5a30bdd1cd03108e9a75bc430d legacy-trunk
+65589 487e0d9a381a800006af76742810c19641dee844 py3k
+65591 e6fe83c2e26206f4aae62c2336e59fdd84ce4d96 legacy-trunk
+65592 b2c505d4a203d82d802e5d8474ed62e333d93443 py3k
+65593 fd7b93a01c04b7e4ed1d9735de4af1f7768a1969 py3k
+65594 949b9a2b986761096270e10f5e6aa02d435b3786 py3k
+65595 e2c706f9906c385b97936ea0596c852692fa28fe py3k
+65601 7224fff98823bc98300799b3cf9c766e76d6565d legacy-trunk
+65605 47967690b5855ec9ca331aeb231ece418a75a13e legacy-trunk
+65606 aad5809fc41955b1411da7770d8f6780b65f85e7 legacy-trunk
+65607 ee0a52c982e5f6aa45def08a3cce8bb60f0fe2ff py3k
+65608 63aea99c971a67d8ec0bd9cf9d9df67c7102bdfc legacy-trunk
+65609 d615aa9fdf361048de2db14ff303297b0d2d7a7c legacy-trunk
+65610 6d8d920cd93240a47cd0b226db8214773dbc8e6a legacy-trunk
+65611 1a11717a154b4df2305dc3b4f9bbeb44ef3a8b52 py3k
+65612 d3529644c6823ec4fac7d1b8a17490e28878660e py3k
+65613 388a4be7d679a15f1f2586d801cf831652a9f1ed legacy-trunk
+65614 99f9bea909b559a72f44ce491174dbd85f1406ae py3k
+65615 b3abff17e2dd174d47f509a3855c58105dac0111 legacy-trunk
+65616 acb98dbb1b04fee3508d31bd0c65bc321106dcbe py3k
+65617 bc6a3572bc896d3b17fe4c9eeb64767149676973 legacy-trunk
+65618 9f843396df898daeb36012b2298a9eeee24d0b74 py3k
+65619 30135b6e38fdaf732222e0924b2398a04b5b7e56 legacy-trunk
+65620 33cd6c5d1a04b1f8d381912d4a1cde86d903aad9 py3k
+65622 5a15a7044e7d8d6ba8c2a9c303a071628caf4f1f legacy-trunk
+65624 ac8103341b80e90205cdfb4b06cdd1ab9577841c release25-maint
+65626 054dc111b1d9c11a70d73be63d763d6f37a81acf py3k
+65627 6e4f47a69efa7542274eeab642acbc97aea4a008 py3k
+65637 694814d7b1043c1350eb48e3ca3eeb171b601bf7 legacy-trunk
+65638 0b671bce694e4897829641aeed60e48fee4e70dd release25-maint
+65639 ce59dac3fca24cb6a3debc883d2a7a4c5bd350a5 legacy-trunk
+65641 cf6985cb6d156ddbacb018d9a07eb78e1d4c0281 legacy-trunk
+65642 7527da2b05e8a98836d39b70299178742e8963cc legacy-trunk
+65643 d21d8cbe6bd4dd740ae3692cb75abc5c56b6f315 py3k
+65644 0aae72f8dda904993d7e8bfcc164163e2eb48bbe legacy-trunk
+65645 29d936a4f885886fd075e0466a6939013aded783 legacy-trunk
+65647 ebeaa6536d328a31883e433795cf377dea675fc4 py3k
+65648 7779af388aec1a3e0023225237d9e0d1cf55beb4 py3k
+65649 ef41dae30f35d36ed47e92dfde893f31143043cf release25-maint
+65650 eefe4450f773f2cfa1f45d494394172272a76af6 release25-maint
+65651 dd7e2d68b6dddf160899674298ae807cb9a243b1 release25-maint
+65652 a3393e581b15b84f919ce28ef1ab18b7758740b7 legacy-trunk
+65653 b219d55404e76aa664e2b98737058131f0cc80fe legacy-trunk
+65654 b8c4bf393794e9b1e773788b07b943a947a9675f legacy-trunk
+65655 79fa3e0c09889aacbaa0082b62d7644f79c2de81 legacy-trunk
+65656 3c8ef346692371238d1002556ab5209fbb4bcf63 py3k
+65657 701516555393736f9c699ec3e6ce8238eda9e7ae py3k
+65658 f0472533bfc9890635f892844777d73b872b52f3 legacy-trunk
+65659 79c2916fe58e41e71c29785685c6a9d8a5cd1f32 legacy-trunk
+65661 cd3b0b7fd8e1b7e2e3cb3ef1cfec702a4df2d6f4 py3k
+65662 131f85bb69300c48e6d9f6da2757c2214f8a0c95 release25-maint
+65663 eccd9429702e4f573bdf442b6fbbba8e9c4e94a5 legacy-trunk
+65664 d78e24b12f6336b87a516b52db03dd042bd0fee8 py3k
+65665 50fffc8008457a9be0ecef867aae12143f41e519 legacy-trunk
+65666 9d78fd60bf2a5eacd745ae34afc846168ca8ca62 py3k
+65667 0600fce678352288cdb778764372846e4de72515 legacy-trunk
+65668 4f1fe8f16ef93d63f8f3817a2e69ce5fa05afba3 legacy-trunk
+65669 04556e2a7984f9418169da156c4981d4b6f957f8 py3k
+65670 f6026a3798d44013cc074fbd4b11e0231db7ed35 py3k
+65671 6b1908ea6b53544f63d9ea1d5ea0c8dbc52a4a9e py3k
+65672 70f2795d6902826152e90b8fb59eae529773ac9a legacy-trunk
+65673 61d50da5816a38720ab4492e02702cea4149acf0 py3k
+65674 f1260f4311ee78c8513293c2cad431c2c3854665 py3k
+65676 ade33e13ec693066c6dd67f91a52d51ee978f4ca py3k
+65677 e8509ac501f324d85775e404f01bd2cf4231aeb7 legacy-trunk
+65678 b75621a420ecb28e923900a4071e04d1996bf790 legacy-trunk
+65679 af7388ad3164eb74dddd98510c300e051d445ec8 legacy-trunk
+65680 293df8153f61858eacbcb9a2c8c805053ed8c683 py3k
+65681 f8a346fcd04196321ac6b3737cc9fb7877189a5e legacy-trunk
+65682 633fb0260ab3225443fdee2ecacf6f8089a114e3 legacy-trunk
+65683 3650b1ce4bd846410da68bf4cd42ba17c4c3f1f0 legacy-trunk
+65684 60e0e09763ab60d4406c0ba95ecc5736cb616a68 legacy-trunk
+65685 136f61b74e8fe9d1b62ff2f5a4794631c890c2b0 py3k
+65686 67938575afc6cc6ce6857fc5d585621d75bc7910 legacy-trunk
+65687 54a2db8fdc626de94e34ace4c40c7850ce0c1abe py3k
+65688 0a43376baa6bf2a907f02d697cfe5c80a95d1674 py3k
+65689 e961cc014619141d296238eb50ab54a4ba84037e py3k
+65690 c6f0de5f2c68523d6b222db68cf1c74f5bcd7c68 py3k
+65691 9233286c7ed0dc5e72b838cbce64040bfaffbcdf tlee-ast-optimize
+65692 1d8171d64463ed024ebc3b61d4df88a6d7469d9f py3k
+65693 cdd898433d588e30df5b986aa34527f645ba2833 legacy-trunk
+65694 c057989e87eb9ddea181519ff993a8893887c250 py3k
+65700 180062e33956980d55b60f43bcbd09f192314390 legacy-trunk
+65702 8163daee785d40a3d7fb55ad0d9fdb140f12a77e legacy-trunk
+65703 f627f80201d39fe15ef9b2ef6df13dbbb09ea64f legacy-trunk
+65704 e61deb690e708402d452ea6cfe57e14cc11ee141 py3k
+65705 a3f950d15c083f56add1af3da02dc1429f08e886 py3k
+65706 c37f4b03637f226583934932d89402e04809d6d4 legacy-trunk
+65707 71014685e0e5f5b99e3c71d78829fa94616dc03c legacy-trunk
+65709 780e1703890299abaae10436ab209d520eeb05e3 py3k
+65710 1702873f2492f230525a7f9061daab04ffba8901 legacy-trunk
+65711 c6d78f869405d7514d4ca72b13987994d5dc9c40 py3k
+65712 1ed86ce0beb266a27d9fcce2f52156ab959e84de py3k
+65713 ead358ce4d8ab09ff2738bfa8fac2026e85cf6bd legacy-trunk
+65714 878861515b160c9abb67ffb36b794042a49ac8ec py3k
+65715 9fb10f3d0f87309e9548ce1446eda9fa557f9a89 legacy-trunk
+65716 894b4acfffe40d0bb5ced674fa0a58c844f5cb91 legacy-trunk
+65717 8c0f85196e37c2e11ddfc367925dbef4f39c036d py3k
+65719 918a918a9996c609070ed09d43a92a7fee13afd1 legacy-trunk
+65720 b973fccd02a5b90781ec273448be609b330a7642 py3k
+65721 ca4c51358629788c17da150a882cf20c94297d82 legacy-trunk
+65722 1d65c8f5c08e138357dda1c249f0aa0a3264ac07 py3k
+65723 5df56cd5519a56947d04cf8ebd275702ac902a85 py3k
+65724 2d76af7f770268a92db444078a82b9f61ec3a393 legacy-trunk
+65726 b60e0928db3ec7a1052403bb28205dfb4b51afe5 legacy-trunk
+65731 e0c65922b8787df8a429e5070e90d60b779c949f py3k
+65732 9de68ad86078c361ab30a18b2c7676c9d57cbab3 legacy-trunk
+65733 aefb8e9d3844f1e5ea8ad36cdc9c16d3300e73e7 legacy-trunk
+65734 31c39a62d3f9655a72f80800471bc5f57053c093 py3k
+65735 eba7457f4bb693b90c1126a705b77661255ce461 py3k
+65736 153e9e6786464a184373e9ec9a0fe007d9a40fbf legacy-trunk
+65737 ff85653545f5ca70f4f0ef2b2d347e7cd5ac7ba1 legacy-trunk
+65738 eb1e64e535e6a17126efdb4e9028c0957de776c5 legacy-trunk
+65739 5a35c963e77122ea6c349ac9e586d656199153d4 legacy-trunk
+65740 d99fe56f9ff8d641c1603e761a68bd0d9fd8dfd1 py3k
+65741 af4e40f893bd950d047131fcf2503ef9013a20ae legacy-trunk
+65742 2be17d368a9c5b8fe608bff85e764bb75bb62677 legacy-trunk
+65743 f24f26a1218675ee07421f8c337e6c59ca818d00 py3k
+65744 48dddfd2fbf3bc003471a2bdab3e8acb50c272be py3k
+65745 aaef08aa2a7effbac29b1387ef38953aa66c6720 legacy-trunk
+65746 612b0c0e5a0f33d8b92d4af1f542211aa0565121 py3k
+65747 d9d518cd493c32efafc8a3bc5251248221f84c72 release25-maint
+65748 c7481c73c163a197a7f982a3eb186b6bedb10bd1 legacy-trunk
+65749 435d64fd13a9cd9d4d306e43614fa4ff5d9d9358 release25-maint
+65750 f4c2eaad09f845e13830c49ea87bfa35a4f9c407 py3k
+65751 45569895f7b5614aad53fcec83b8db3a4d21b132 py3k
+65752 ddc65cd2f0bbbac35f1df4c01a5639692452a695 tlee-ast-optimize
+65753 90d049983f5b3dfe6c773699027db1f8d99d4584 tlee-ast-optimize
+65754 07409e985c39c9aa171cfeb8df17615478321613 tlee-ast-optimize
+65755 9c498907218fd7e80b2f321912568f32d49d59d6 tlee-ast-optimize
+65756 fc1a0acfcef808bf3cf43818a55486319ee1815c tlee-ast-optimize
+65757 da58333ec7da761c5112f778e55abff06c101fba tlee-ast-optimize
+65758 50493f9dd8c71a4a471bcefcb59b4cf8b11499d0 tlee-ast-optimize
+65759 16b9ee1eee31fa25942885a1842eb0280935d775 tlee-ast-optimize
+65760 93ab9fda80ab0c4a0d53629f776da09e4858c10f py3k
+65761 f482875e2a031aab6c346985fa032f392bae9600 legacy-trunk
+65762 f4c226c61b71c8f6b3e8c64ab73ae4cbeb2ba115 legacy-trunk
+65763 2f7e57fc1f3a666b572cea38fb314d3184086e1c tlee-ast-optimize
+65764 a8f3e63b47e4242d392783e9b0147c5ab5203978 tlee-ast-optimize
+65765 3de69e6b2cb2521d8fb6b5b56d9a8b0b74b04349 tlee-ast-optimize
+65766 c5059b12ddc6d1846b3050053858de3b73ee6358 tlee-ast-optimize
+65767 9b98567d5dde50704ae8a56d3abe09a194e8ce1f tlee-ast-optimize
+65768 7a038020c8dd63e6dbad26c631c84d4a1f74d8e7 legacy-trunk
+65769 cabf97b82330861e5b6510b4f2614bbced2b6e8f py3k
+65770 b377c147323ebf9e08672b214d6401fe0e35ffb4 py3k
+65771 e4c98d6157c70197bb4ac6a4b42cf5ddcbdac9c5 py3k
+65772 71b53d6ea7a45fdb5e0db65aea15322c49481209 tlee-ast-optimize
+65773 d7d7139d58406b655ca9bc182bc4931f72e113f5 legacy-trunk
+65774 1d88ad5f4def3363f248517ed395081a0ddb831b py3k
+65775 c36ccf2a71e16e6195fb7734d6c321dfcae92eed legacy-trunk
+65776 b29df3642b97d3b6fc5be15000077dc7d814e0b7 py3k
+65777 40c07a61e1c26c1ffa04dd1952b94557217f4488 py3k
+65778 12c3a03389e7f3e20a7ec82b5c6522aedfe2a9c4 py3k
+65779 49213d429c681a01dae0b37da9ae98b99f17f912 py3k
+65780 2bebc0a6d04280d0c73267f5ddbf4792470e796c legacy-trunk
+65781 06891aec41de6e69b71c555ebbc32e8231d5120a py3k
+65782 195da6d0c77c1068e28ad298893d98c9d32e9749 legacy-trunk
+65783 80a9ff59eb0202b2c2c7e3b52516967a48cc1866 py3k
+65785 530b4cb194425a23a46ac28c214bf51ddf9c2961 legacy-trunk
+65787 75658543b919bf53542833c0b21b97b87410e138 legacy-trunk
+65788 22ad88e5c003a46d3481ef1e4d63303e23c42a4d py3k
+65789 43fa50b9eb128fd5f702c527408793d179ca661e release25-maint
+65790 552953306d342c58e681c76d8750787057e8c538 release25-maint
+65791 8d99d03a06e44a7747c1d1c0f5259f8a598114a0 legacy-trunk
+65792 b0c4ab8233fa9b5cfbfcbd805809e97f4e2bd989 py3k
+65793 d7fbe73fe7f74478ee7275315e51a64b5cba3226 legacy-trunk
+65794 dd992b6403f4cfdb8035a48afdd3356834844c8a py3k
+65795 62c69d88e985d7c97a70c7ba93feeb1e56d0a0ab legacy-trunk
+65796 edb5a8593749e6cec9af826b20c089b0c4302fc4 py3k
+65797 89538d5fb81adb2fb204036abd37ba2c1447f321 py3k
+65798 99a2ee4e3a0573c0f4c52e4a705ca87bbf51275a legacy-trunk
+65799 95f1c7db8923f48bf44c4796a9a78cf97a567e34 py3k
+65800 351ad68407e7ff1f4515da3938060f5167cb18e8 py3k
+65801 f287beb352fe1639390fec9aa30476415fbdf57a py3k
+65802 5508862a1de505c80d3b36f2f03f92f734acab46 legacy-trunk
+65803 5a87b0d1ce91e18a30578dff769dceb47414911a legacy-trunk
+65804 60194ab2b75625b4d329ae771fb01c00f1e183ee py3k
+65805 3195bd6b6dd7cdaefbe8df1454d8d864c169f334 py3k
+65806 fc90b581516ebd8a1923180d4de47ed9e4775200 legacy-trunk
+65808 1a41d456d802bfe414754e62f70a1f42b1629d85 py3k
+65809 211927147c606e2d7d8507274947739a4e3c693c legacy-trunk
+65810 2254aa824d4da3bfe3e0951c461f93beb3e5bc26 legacy-trunk
+65811 7517bdcc769a1e17500aea7b2c127853369bc8f7 py3k
+65812 4207219acc7a8039c3de459c5f7332cae19f221e legacy-trunk
+65814 4b4564beb6da2e0b134f93af01b4f113bd5784b6 legacy-trunk
+65817 17f010517b33506052e6acc2857936767a72fe85 py3k
+65818 1d29e53ce2af667f610a55deb6eaaeb779bd1750 legacy-trunk
+65819 76620010d78298637fbd63d2ddb445cbada53322 py3k
+65820 5c0e5f2cbc7d89c0cb0f002e70877bed6d6f7de7 py3k
+65821 2614d501de9aefc17ee7850cf3c4855288ae4ee0 py3k
+65822 e143a8f352417cf049cc90ad1520d21f6eb8bbfb legacy-trunk
+65823 471a4a88f51c64c032310a79f1182a8b93745f33 py3k
+65824 024b2b98486676cc41b4e7c76327873a87e7c53c legacy-trunk
+65825 1fdfa382ae132e103b8499c7d865a762944ed087 py3k
+65826 9d1856aba9f2493da81975c9639d7870653d1f3a legacy-trunk
+65827 d6537a3e1b73c039bc3dfcc36101e4408f5c0e32 py3k
+65828 28d93c9c3a03035cb1d3b5106c6ada6a15229dce legacy-trunk
+65829 db589241e6f74c8955f56066f68f8063ccf12c93 legacy-trunk
+65830 6dda01643106cfb2d270b0b5899ac87f6944ffc1 py3k
+65831 59d97a3ee219e4615c60a399ce7d13159f7beed8 py3k
+65832 92f4bb36637c34e829936dabc95f2c50d014d1c2 py3k
+65833 8d88350553c3f5a6749529213a45da3be2475e4c py3k
+65834 8a7a25459c6f0219a239ed122059a0e77ca51098 legacy-trunk
+65835 e10713b2d54338d9879134a89fdf939139d238a0 release25-maint
+65836 329149048b90cc95658e1321cf02f3b7f3e1327f py3k
+65837 2bac0d421929e4569e9abae3527569d1503a43cd py3k
+65838 428d384ed62634996de5bd744941022fc3ae9f72 py3k
+65839 5c105f9a78e8e1f999cee112d32dbbc3a5778f2b legacy-trunk
+65840 9a89fb58098b6ba5cfe2d2f3c518b59f6dcd4a2e py3k
+65841 54138ee20e57c2e9ad2dfbc4186551c752db1872 py3k
+65842 0275d81e31d09cbe37ac9b2f519f5dbbc786d5fa legacy-trunk
+65843 291a6f22036070c5a03041e1992112c90c39407c py3k
+65844 83f7798524f1c7019ac109913124f5b0879a616c py3k
+65845 b0e3ac86cdd802a31f5e6f253a0711d30026a7f1 py3k
+65846 7d64806feb15608d6af2eea9800781770d5b46bf legacy-trunk
+65847 5e3faae6efc6719d44bc0edb3b27bc32138df55c py3k
+65848 14f2a4cb57de043576b878b26fd50a186e2e844a py3k
+65849 7c81d5aa5f417d085776852c22fcd3bd79624c6b py3k
+65850 18aa919df245ab9fef118629e81fc2ff4fca2ee4 py3k
+65851 94a7fb33afea52900887f7108570486e485ad50b py3k
+65852 43a885844ad8d4e1516f0db2aadea10d4f44f8c1 py3k
+65855 4df122ada76faf46da30a182de2b7eefa6b5e58f legacy-trunk
+65856 83eb2aaa5faaa4459ca68307a263d36cd70d9315 py3k
+65857 14e819beeeab8c04ac64ce615c7da3dd26e1251a py3k
+65858 209a4581bd919a03546bfc9d037ff0dff8606ce1 release25-maint
+65859 7f038a4700b1c0804ec3996eabc5cbfb41999c59 legacy-trunk
+65860 83b2d07b475b50307b48f6af5739e16bab6858bf py3k
+65861 2480622965e6008b78d5074c0872dd95efef9957 legacy-trunk
+65862 7511f3e672a29f37295de53d81ed50cfd413623c py3k
+65863 ea3d13cd7c1e6b6f5e4de6737f672c34e6059c1d py3k
+65864 7ea805d879e1ab57cb2862188a24d11891de3458 legacy-trunk
+65865 1a059aafe49f0e4b994ec1844748ede4e3944d58 legacy-trunk
+65866 aa613209332d51ab6ec629b82aef0d71bcac92e8 py3k
+65867 25f06a703f89a9e896f550874dad1cd3e7432dc8 py3k
+65868 bd37a186638f283d43dcc5d43fac374d59e60cc0 legacy-trunk
+65869 f04b703f2ddda1b117a19556b029de4f76941ff7 legacy-trunk
+65870 97a24c609c2ee88040098a4c8f3b9caba02aa5f9 legacy-trunk
+65871 6d22ee8c73ca348c114a6fb79322ffb4d6bccee1 py3k
+65872 49f52e285a6402bcd5f9d0e558009dd45b7af2ea legacy-trunk
+65873 2b829ffa481b5741d0e0481f304c0595c3f8161a py3k
+65874 96a4cda65c552ffad83c3c8b5cb493c8d19ff45d legacy-trunk
+65875 510919073119f919e26238def1592989f07aecd0 py3k
+65877 6abada05c31313591246b2af78a0be47ec65d32f py3k
+65878 f49d9314d439111a1fc0b275c3748bd2e60beee7 release25-maint
+65879 ef19558455094fc1aab83c0bff04b8d1ae3c93e1 py3k
+65880 4b880645607871c005f909aafe210eac8d0fdb67 legacy-trunk
+65881 c7823b351fbcb75640290b99eb900fa2ae9e1b62 py3k
+65882 82c696f0424a47e46a8a3a8b40c885158e0d851e legacy-trunk
+65883 99e783ec77815871c67acb2167c67d9d641c22c2 py3k
+65884 c1a7fdb24628f243e1cf32eb01741889c32f3154 py3k
+65885 504e6d030e84c7dfc459f4eb626abba6b4ef2e53 legacy-trunk
+65886 501256c54c84a64851e8f67e6c9011c3e5d85256 py3k
+65888 f7a6396b496f022ac995686ac5d19b573db3ef2f py3k
+65890 e78024af0cf03a47fd97585f914436f8f2229f30 py3k
+65891 a8f98a7273712122ab9e74cc7386e5bc73b07787 legacy-trunk
+65892 bee400336fd5c7a043407d795402dde8ad8aa224 legacy-trunk
+65893 abde4db307a59c561183de7fefcd03649c24933a legacy-trunk
+65894 1af21123690430de07012dbd0815f29a95ac723b legacy-trunk
+65895 8f2156b15bb8e690cb436206791e1f6f639156e6 py3k
+65896 6cd7b18bb742a36a2c54fce15e85f77c701146f9 py3k
+65897 3a11e79b94715ddd710365a398ef61275208fc7e py3k
+65898 0fe6cb0c310d729dad50b365cb41ad61e8e18da0 legacy-trunk
+65899 6d6d3e0375503cd25be72736c5c6e585f00ab91d py3k
+65900 d42629185382eb3d7cfda1a70af38ab34a662e59 legacy-trunk
+65901 c125e75d21a048774f65c5a7c84e639173636ac0 py3k
+65902 a36b6c1cec56782269671846df6470cf7434080a release25-maint
+65903 e894204adfbdaaa27d0539ead159368bbc250564 py3k
+65904 ae5b73c52097e6a3466fd5e0efe48b190e7ad715 py3k
+65905 51f2f8fee5c450d21ff6ac88015e75768382f011 py3k
+65906 6cc89c60f74d6b9765f76e954a753330777c97cb py3k
+65907 4f50228231990ea1deb9b89376c0a08560f24ba0 py3k
+65908 67cb33880377bc3ade1a58c8962d6ae23efe5056 legacy-trunk
+65909 11e72ebf906aefeba6d813f527668ecd9f7cb333 py3k
+65910 1be7890cd75978016efd7589ec64cedfc13c08d4 legacy-trunk
+65911 c03024db801f96ad6594017080828d3b740c4054 release25-maint
+65912 040d9580500cdb67239969860a38a9e701d14d82 legacy-trunk
+65913 e99614ca0204b7e6031bfc227f88264d70aeebbc py3k
+65914 1cb908a043b3f0f9383977e597cf4a6eeb5c0141 legacy-trunk
+65915 7608afe11fb96049e7e416fc0cbff4bad7211b1c py3k
+65916 8133fbb7458754a725e672503603bb2ed48181e8 release25-maint
+65917 b199f3419e65802b9dd672bdfd798f16b60daf70 legacy-trunk
+65918 a19d67d77b22f787be165c520978e2b6b99da629 py3k
+65919 88ca517546fd02357cf7233dc947be0cf3b45157 py3k
+65920 033d63bf708ea2ad41c52d4b84146da231fa9c68 py3k
+65921 013d4d8407cb9f68e7656d11f62b7918a9521e45 py3k
+65922 c62862d73f9ec64d655494cf1f61443446f2dea2 legacy-trunk
+65923 73164565b920e20596d33a993b99ed7a7937e765 legacy-trunk
+65926 27d19b66503579d8b3a41e52acab90799f2bb3df legacy-trunk
+65927 509e30a7968e01be329ec121540b3e755fc4e566 py3k
+65928 c411cf6942896cc216089a6950646844322f2ea4 py3k
+65929 01b9e18d69ac449ee959ab58a1a1a9fdcf8b1b49 py3k
+65932 a0abaff97e001a4b90e46df367d7f12ac50db9ee py3k
+65933 959d1aa8b58aebe32630ef02bd42aeafef19633b py3k
+65958 57a8735647cf8745d0b632650ab4844300ce6483 legacy-trunk
+65959 a77022dc3f61d221d158fa9817f40f2527acfe30 py3k
+65964 e39d44adb61806c9692c3c0e0a23245687a7534d legacy-trunk
+65965 a8d69c1a3f4efd38768a3793863bdee3ecd7266a py3k
+65969 4faabb18562c63d726d56a7c0e0cd545d9f09607 py3k
+65971 4b1f262cebdf40032719f2537f9e8b0f10eff734 legacy-trunk
+65972 2dc6469fc4c4d4b3c6c738f894751c34c83f12cc release25-maint
+65973 1944d31040e30661b3bc6dcc9bc038b04cc33a5f py3k
+65975 afbfd8f214dd1337d6d175c8cffafad2e7a501f1 legacy-trunk
+65976 2aa79ad4eb852dddd6a7aa5a05277e89f07a7908 py3k
+65977 bce03f87f65db1a1044a14c987ac8a0c090f5316 legacy-trunk
+65978 46c1bcc4c1d303740553ab6864bc0af52d86315e legacy-trunk
+65979 d952e753c611f75aacdf5752c5c34e565034923f py3k
+65980 74899e6c87a5c5da6aeb9c3e5e8182597abd04f3 legacy-trunk
+65982 f970a4f7560ffa20e94b55a58967ddd4faa89f68 legacy-trunk
+65983 e3e507350ed4d4de88f1da143da01624386fb1f3 py3k
+65984 204431d44cdc49284c1c3cdd815be7edcf4f5996 legacy-trunk
+65985 cfd79a4c160433dd54856c428efd341d975cd118 py3k
+65986 75f64fd1f113788bec4fe7ecea7dfdb8ebaadf1b legacy-trunk
+65988 65b2dd46e1711897b9313cbc8841e973125d8e2a py3k
+65994 b521383b81a715715eaf789573d99a753eea6b8c py3k
+65995 969edc3b707f3bfa843b157962eb2c49948afc6b legacy-trunk
+65996 e7b85890e9b1073504d15dc130b25199e7bf6dc7 py3k
+65998 587cd4f66c2dcd95fbc95141cfc65f71f5b852ab py3k
+65999 dfe546b66eefd7583ad516cd672a0714dbec61c6 py3k
+66000 76e71cecc4d313cbc0a6f3e2533288159e876013 legacy-trunk
+66001 07ec72cf19c7d61c8a2d2680ef029599dddbbeb7 py3k
+66002 7bb1c60eaf64f59e5bcec85f6266f42f6f7276af py3k
+66003 85c08cf08b2b5eef753d4edec3bf1978d407de2b release25-maint
+66004 e14552b7317bcc955943babdf3592306e4b2e018 legacy-trunk
+66005 682e9a42c15d53b40f02bf34b2bcc779963e9144 py3k
+66006 b1682c693b9a15d879d675521f61d5dd3d97a743 legacy-trunk
+66007 5c75a33ef5b2763637d8883c5d1ca6c5927ce4e2 py3k
+66008 d2ba36a7a712745cb8c5701374efa26f7ea8a961 py3k
+66009 afb9808b0f30fa25b3668c7485dcb21b010e0441 py3k
+66010 a2720353f0d349d741e9b58ac23d2c1c2ae9c5f4 py3k
+66011 984e1c6029792c9f294574aa6d3c566823a161fe legacy-trunk
+66012 2a6ae7e8c7c36e033f20baf3596a6f6b6b312d2a legacy-trunk
+66013 6ea1a720b057ee1bc8ef169e0543bc2761b338d2 legacy-trunk
+66014 70edac890f2b6df62dc9308f7e0514a8db3cb87a legacy-trunk
+66015 c0019d45551dc750c7666f2309837b1d5c78be51 py3k
+66016 c95f387ed1f426ce6521c08b659f6b18af323d7d py3k
+66017 58d295e7800f7a4f2fb7a2f21f5ca1f98e30a25f legacy-trunk
+66018 de954dd6797b6e67945dae7199c7b121574afff9 legacy-trunk
+66019 8811983dfcaf8b226f43673d3d86450561dadc65 py3k
+66020 1a4922fa516065921acd07487fcea22fc753b9b2 legacy-trunk
+66021 678a0f0e61bc5d6bc5261ec73b7a551426bca468 py3k
+66022 2a47b3bb11fd8bd9ea98f2e6715703d92029fb6b py3k
+66023 df624df6efa3cda041ea4c4a30bfb95fb4d8a54b legacy-trunk
+66024 3dc4dfa3eba168cfba4016f9bf7e039d8c342367 py3k
+66026 6fac636133f0106ee4a29e148625a25a059b6185 legacy-trunk
+66027 4fb7e7b2c962ac0869b9ad4dd25baf0bc58668d1 py3k
+66028 9eb0cd30326d8b6544bdb0bbfbb95acbdb85ffd2 legacy-trunk
+66029 dd177f576be8a95e6e1c8a8a1ee9a9da03b0527b py3k
+66030 5a20593a818fc232abcf62353122f8684f4109e7 tlee-ast-optimize
+66034 82f73b0b5a308e982c50322f9fcda3973b9f2842 py3k
+66038 548dccc4008ed934bafad5f7b710ca42dbbb21ab py3k
+66039 edd2ca894a67dc6b4f9cc92d68fa45a775950336 legacy-trunk
+66040 03c23c50654e5e3a62a8fec6f4a7fb4d1b21cf6c py3k
+66041 4db1f5098175abcc56ead6f05d8921b5c3e4bb2c py3k
+66042 d6e86a96f9b35089cb2a9746073d05c8c0ac6e05 py3k
+66043 d01c1d7688415340e32b6b7317fc1f96a78805dd legacy-trunk
+66044 12d2762076baa611f769bbe806fedd2587605fee py3k
+66045 c42bf98b260f35204684387256247445e0253605 legacy-trunk
+66046 d9fe29e95d6015b783754c42dab773711a8653b7 py3k
+66047 de6fb9f34513275d636f5012847c36a36c5ca19d py3k
+66048 47a801c29f13d48e6c0fce74ff99d2347bdbe24a legacy-trunk
+66049 aa3c90ce1932bae77ca9a648d811c8131f973fc0 legacy-trunk
+66050 fdd1ee20ab86b09807d19a447810dda6f0639f6e tlee-ast-optimize
+66051 f27ccfdea834012038cba0827b36d747b5994f7f py3k
+66053 efc49863cd8ff9bb39d136aeb5e8bd239d01e27a legacy-trunk
+66054 47192d0b731f10496f3e6232d99b65a50cd6c937 py3k
+66055 6ceb7c89e776ba924499769c6969b5e3b067a019 py3k
+66056 c562c8dae49a605870e6e8aa6fa7b8e2ee917cae py3k
+66057 27e142d99a7173936a658fdb03cef88c1267db86 py3k
+66058 bbffe0914c56e610f118e13beaa079b1918be192 legacy-trunk
+66059 0c65c802752a2b820d3eb3bdbf0cc65766621bce py3k
+66060 a8c53580c5ec47225c18f4c51bafe1c3db4ab13a legacy-trunk
+66062 30834b9aa1937f1ff82d487741313da85052a0a8 legacy-trunk
+66063 013138cdb873b2ecc17fa6b414cf34f4a734ef8c legacy-trunk
+66064 03e216dc8feccb91a4127426038ddc740b170588 py3k
+66065 56ed445fa61e6034d43b29cd72519546f18b3bf4 legacy-trunk
+66067 96bc5896a240551cdb76436bfcf7b49741b451a0 legacy-trunk
+66071 a2f2028b73ed3abe568ab690b46a0c4be9a48e0f legacy-trunk
+66072 84bdd53e3906486deb1c16ff1fe3857324ef17c3 legacy-trunk
+66073 960589d2a12d9ad4378e577c71fad8cbd6de8b09 legacy-trunk
+66074 fa7b61d2bb3d7cc7cb781e60fba9172d42e4d4f5 legacy-trunk
+66076 11d8fa3c88d8e83681dc3aec41bc61fdf81ba07f legacy-trunk
+66077 48c5eb513370d8fa8d4e2e49d9c57a5a447660b7 py3k
+66078 b515690b379d7ddeab5283ea3e0571c3300a2da3 py3k
+66080 f67963cd43953cc1d9ee050a1b15ac8c4278ef9c legacy-trunk
+66082 a1d9e83bc76da3aee27da4f97dde2da90f8690a4 legacy-trunk
+66083 eb134eee32322600373f548f686b35bf90dc0784 legacy-trunk
+66084 36ad5e7e39b4fbd96cc19814edc7e706a225aa13 py3k
+66085 9c175f8860e23df36e18a0d3182da0eea48d08fe legacy-trunk
+66086 221de139468113cf589111d8473264c2bb13f843 py3k
+66088 81a1a15451722b8195f5774a6dc94dc553adfc31 legacy-trunk
+66089 5da6f21cf8059421d1d246484cedcc4f8dd55bfd py3k
+66090 fc11a904f6cd1790af920e846123981345e3b9d7 legacy-trunk
+66091 bee6eb7677427f83da9566ab64a4ca70ec80e3a1 legacy-trunk
+66092 624b44b7cdf292184ff7401b80d67554bdd915ed legacy-trunk
+66093 be63ec748ee064a206f3accc02abb1c147a2fbc0 legacy-trunk
+66094 7e194b9cc0a2b4d1f24d0f49cedff5cfb09fbbae py3k
+66095 b4c14b70fe0f8199ac4bfd12969fbd663c04b3e1 release25-maint
+66097 7b39501b0a76247c09206d70eb393e9b083feba7 legacy-trunk
+66098 13fdf98ea290013072e76a1e0972883c420c86aa legacy-trunk
+66099 176c409fd747e812a0672ddaa8dac0001af056e7 legacy-trunk
+66100 8cda615ef22bb748e0ee35944814ed9af983af3d legacy-trunk
+66102 5fa0d31a671b7812b0cef4e393762a63fbf1ce60 py3k
+66103 576441527d4f7cc3db70692d3446a19a22b11891 legacy-trunk
+66104 ed59f3b67b3ae3c11874b875eb4c2e39e6843f7b legacy-trunk
+66105 9db3fe780bfc6a1020e846ceaf5a80c0288d2ef0 legacy-trunk
+66106 925153225570c3b8e22ce5891dcc9b71f44693b8 py3k
+66110 519e0475991f76b81d53015847563103959a6f95 legacy-trunk
+66111 696f5d8419f209395b3f621723479ed6509c4eb0 py3k
+66113 7ecec1b30c3f405317105fd835d58f0142c4b3e2 py3k
+66114 988661ffd1029cb037f624fe2448c108cf85b9ba legacy-trunk
+66115 51f795c9530ec0bcb4416e9a9c6c0abd3055a1ca legacy-trunk
+66116 a5a071c80f2d25294e1b4723419502c981b57429 py3k
+66117 12fb3626ee59f18def827e05294d121634b184f3 legacy-trunk
+66118 37a9f690a94a9acb392327516e4323059638545a legacy-trunk
+66119 b5365f34640f2c664c192294eb60355291fce7ac legacy-trunk
+66120 66e1afd3345fdb0bb4c1f97a9d14d0c1c0c818d4 py3k
+66121 16c03f7cbc221f9405c1359bb2a73ffd44f22892 release25-maint
+66122 32ce402a7e3df20c0f5ce50e9354874b240dbceb py3k
+66123 e6021aad2de2d5ec994f6766102d1e5b128ee5e0 legacy-trunk
+66124 680b076d0c13a03f334a6749fa4463a5e3b11519 py3k
+66126 4fc480be1e4d2c678a392d43a39a48762f19f934 py3k
+66127 bc585b4d4606b52c3c7e51d962e5ff178f8c8b6b legacy-trunk
+66129 9ed3287beef18a4b7baba04101dbc22dc3afdf8f py3k
+66130 aba8598c785ca53e33621d0a8aa4ba364149cf20 py3k
+66131 236fcf2939c7d5238934c6e0d83005bd2d1f5d14 py3k
+66132 3b9608118f8d87b8811b37a46a07490952491ff8 py3k
+66134 8a108d54ef03caa1b8d7ba820762df0aeb354b05 legacy-trunk
+66135 d563621d76db4f94e745ebc62b92178ea33db2cb legacy-trunk
+66136 cd186306f385ac8cfbe61879f484cb11bff09d54 legacy-trunk
+66137 8c4f750661ec3944049f0be50520f4d0718981f9 legacy-trunk
+66138 4c1770a55a85e5da333e7e4ede0ae1304cb588cc py3k
+66139 caa41e161b0411f406c73e18e88cd87f17593b49 py3k
+66140 3bdc46faef4da8b06d07295ccfad8c072c6c127c py3k
+66141 4b28bf5ee393b43ba49bb8e855c9d16090d657d5 legacy-trunk
+66142 99ee3b77bc0db2f2ae2a3a87b105843f00501590 legacy-trunk
+66143 1897743b315de2af54bbca708c2ba2175010eec2 legacy-trunk
+66144 4da4f96796725744fc2d487d2f525ec34344bfae legacy-trunk
+66145 3779fc9dfe5f73890aaa46e3c7ef12e4e06fd900 legacy-trunk
+66146 38889cb45188105d71f839c536b56cf431af567a py3k
+66147 7a6e6a04e28d1492ba11c0793cd88e49d598a9b7 py3k
+66149 d83ce4b581e6156d3a7baea0161db4a9b4fe9828 py3k
+66150 d0d53de9d82e2f1e978c0551c4765e372726f584 legacy-trunk
+66154 3817c96fd5408a0b3f416e7d632eff68a6d6879e legacy-trunk
+66155 1c14ce0854151ea04e1631b66c194aaa6af35f00 legacy-trunk
+66160 ba5c4ce12bbdf16d594e02684b2fac191cc6128e py3k
+66161 750da2d180892ea98b2e0daffe0e3aaeb3767a2c py3k
+66162 c7fd0e881c45303ad9a412903ca611082aef4163 legacy-trunk
+66163 88c93a9b41373ad1ce2a68911e83f6471a72bc3e py3k
+66166 3b74d1462e3a0f7d4d632a50922a08386526323d legacy-trunk
+66167 f1ae69cdd4ffdbfab67ac608c33ccfa4907faa6d legacy-trunk
+66169 d826a75571bc979f9d05979871887d2222e5d999 py3k
+66170 784d24a5ce7baccf97c438b394e619ee0bd1c916 py3k
+66171 2d80d00b1ef360330a7ce348478e0626f839a37c legacy-trunk
+66172 3bd9002e741ffc30662b3e80b94f9a7117cc2193 py3k
+66174 e2edc1c11e507744295252f02857a32ced64a28f legacy-trunk
+66175 6356a5414d019cfa99c443d4c347bb984fd23018 legacy-trunk
+66177 bf043d0db7dfc9fa97aabb55d2498223d78ffd65 legacy-trunk
+66178 75c5a2c9376e9b45d641c77113872570e0df4846 py3k
+66179 2a60f7b42328db14a2e97b48950cecb8c5d4fa53 legacy-trunk
+66180 5fd39b84fc292c9e506fbf0f40091244f2436313 legacy-trunk
+66181 4c683ec4415b3c4bfbc7fe7a836b949cb7beea03 legacy-trunk
+66182 b9ed14eb9e87bfc6af7d3619a5b5674084c0a92f legacy-trunk
+66183 0f6930a433628c7b55e1a34d8336defef4d7a70e py3k
+66184 338308c9cccbcaf70b2c305fa0ebfad0ab6c10c0 legacy-trunk
+66185 06f54e11a08b4ab501a1097db7d6177465834a19 py3k
+66186 22ab106e3186b5849460d1ff3f969b24f7033e14 py3k
+66187 f83dccf417f0da6d3d0675a25df7c94247735518 py3k
+66188 92a01fe24ae0641afed1a9e42ef83fd1e8113dc0 py3k
+66189 6154516be49cdc94fb3ba9331a282770a0131f8e py3k
+66190 14fc16926c03fc8589209766be62edbe9817ceb1 legacy-trunk
+66192 01f2dce06f7d102fb9d432633a735a95e6317afa legacy-trunk
+66193 e6c7b6fa0771e40b87b073c27f9e2b3e672917e5 py3k
+66194 a5386101865b97e0e3873986bb469bfe6316f1be py3k
+66195 177e8a61af45c5140de06b762335b6018b5cede4 py3k
+66196 2b855a947f0f5f60448c16bc495bb874f711e9b1 legacy-trunk
+66197 e0ab5b28612456ce78f93a6d4d49a83e865646e3 legacy-trunk
+66198 e7bcfd720898aba42579d2ad9572148464e70994 py3k
+66199 65e23683c010c3da4719c159035b2e68d2117cbc py3k
+66200 e3847e7c24e032e4a14777a8c8fefde1736c9d55 py3k
+66201 9957a36fc167eccd373cc6d9091caabece6c9256 py3k
+66202 5b7845ef4efd0d9abc4aca5ff9f7fb5335694053 py3k
+66203 c53234ff61b00f4dfea09aaec003e5944839e570 py3k
+66204 812ea105b1b0ed0b9f1130582ac6d970d2ebd9e6 py3k
+66205 f71a8928c1b7b963a768b431094ab7e8de6875cb py3k
+66207 14249bcb93d0ca65d9a8a4b6dcb10943b417a61c py3k
+66208 c5be9484b14bd07af4e8d463ab8a7ba38010e98b py3k
+66209 45c43808979e957636ed3d90f1421a9092020ea7 py3k
+66210 dc774ce01c1fa2b5932265ecebef9b09d47d91f3 py3k
+66211 833d3ecfbbf09109437b036b4684820558624550 legacy-trunk
+66212 b26658476d5559f031b943b82bc09f9b960d6b5f py3k
+66213 3169236773f1b75b31dfcec285076e4e911a05d3 legacy-trunk
+66214 2c2bef8ffca138fdd3b1b1f31790b0152fae05ab release25-maint
+66215 5c10af8d33f5cd2de32dc150c02e1d15099c5e08 py3k
+66216 94cc11ec7ec202e3364795e728aadb6953cc0f1e py3k
+66217 5b76a3e45ab3e01b79aceff4c0d0c3a12c7626cf legacy-trunk
+66218 ae2c1b275feb3aadb2e24457237b35e8df792a22 py3k
+66219 4452ff1fbc9d51342c2d5cf3e51d1999c8f6ffd3 legacy-trunk
+66220 b7573ef24c719ec15bfa3512322d4302946d1aa0 release25-maint
+66223 7f8ef98294bc11c375ce62bcfe34beb96f8ccf89 py3k
+66224 3fa066d2a397dc70854aa32d81723e57a60c224d py3k
+66225 6b04bc42baa5ba7a8d76e3e25adf979f51039dce py3k
+66226 c6183a89880e62813b4d4cdb6bf7e7c5d7397421 legacy-trunk
+66227 fdd93bfa6c1ba5e75b890f98fe077c9bb41a0e94 py3k
+66228 a6620343e3db47f8be6f26240f185df28d04edd0 py3k
+66229 8afa7723afa76ad07a3814868f48dee7e0f7b563 legacy-trunk
+66230 b486649ca8bce2017a2a32849ebaa7b3fbe05240 py3k
+66231 89a9bc18586a1732f1ad2148de507642d16ea249 legacy-trunk
+66232 b45868fe489cb2393fda0e14530a0c8164986640 legacy-trunk
+66233 e7e70e881160bab33948ceee0d7ae9a41369cfd5 py3k
+66234 a677d68e8105c9afdd8a42e3d222bf3329fcbb1e py3k
+66235 433220a60a8d0350f406e1b15f0712d9b7b6c151 legacy-trunk
+66236 97b9f0be9385249f32b6662bfeff35af4daa264e py3k
+66237 e740969738ef1f8af5fbf8ec85409149425255d0 legacy-trunk
+66238 ecd7f590e142479c16eeaaed7b5f75c8c239937e py3k
+66239 dab7abb77e8f85532b27b6c4cf367be7c767ed0e py3k
+66240 f32517f876b67c1c5f1c8f21418d9a44cf1ebab4 legacy-trunk
+66241 26bdd94a4293776a077db1410580895d8041ac1e py3k
+66242 c3b811214ce8faad01868333f2cb4b0a9bca6a90 py3k
+66243 238a089d42bd62e0876e9c3b05dd03ad294aa112 py3k
+66244 dc0709a2b42f577234a86280f57f5c4e249016ef legacy-trunk
+66246 4882e4c41ce3efeb5bc2f353aa8e7d5934073624 legacy-trunk
+66248 19338247925fc4cf9ce3153c267261d3e2eadd40 py3k
+66249 751f1b5699bade4e80657a8118a8d1e8a0916b94 legacy-trunk
+66250 12ef7a92e59bbb245d8c9337500218d4460de725 legacy-trunk
+66255 662336d567a9ece6e1b38af4155c7c13a624be07 py3k
+66260 6e71b398b6ccdff683ac12001024f00efbe64a96 py3k
+66261 f8368142f8d3b429f11c84ac99392d103c338eae py3k
+66262 15df29705e182a127629f646cece2f4d02c9c860 legacy-trunk
+66263 4dd59891438347c584436f858da45e4101b48f12 py3k
+66264 67028f5b3321cc3e9523d1570e3c17f5e9a7c020 legacy-trunk
+66266 c1a8f6b648ea51f1ca9a2e57d6251af3ae9fb930 py3k
+66268 bb0f7428a1507deba722f1aca99ec2b2090ce3f0 legacy-trunk
+66269 6746c6bee286093c31edb890fdbf23595555930c py3k
+66270 e27cf7ee2968b3fae90a3ed1dadf4ecfce2a5914 legacy-trunk
+66271 ca1a8ac47d0461d132a734c3125fbfbb0b691d45 py3k
+66272 445ce6575162ebd3f994af7b16007e02c8fa29c5 legacy-trunk
+66273 8ffec372040e47a9b2607021917745ee74ba68d7 py3k
+66274 179f8d89ad19a6ba4f44a6edc9fb5fe1e87faa44 py3k
+66275 fda689970b3f828a6da2253a4bcbac2b63600647 legacy-trunk
+66276 02627b925a43c7194b5824b1b10adf9be1c8c881 py3k
+66277 fdc0948c95cf1979b05026b9096ac48219ba69ff legacy-trunk
+66278 13955bcd08be1a5aac2575820baf986a2fe0bf61 py3k
+66279 77e1b95f1418b131d43b1bf3b6e3beb5dacb1faf release25-maint
+66281 c6b02f79b2bc3a35609cbaf8b206134ca2bb840a legacy-trunk
+66282 2ecb56e6e0a6cd132aa91140a42752d756597e77 legacy-trunk
+66283 7510d873b88c3030e149929ce28f3d69ded61158 legacy-trunk
+66284 3f2c4ce32ba47a2d38a4122f9c860ec789712bab legacy-trunk
+66285 90cfc6b926c6f544b4dd6429f67a02bfa6dffb0a py3k
+66286 4733d84f3488b4de11fe50b914d33b20655e6539 py3k
+66287 73536a58ab4261d2b5b776cff28fbf590695794f py3k
+66288 8cfbb2e275d9c9154aa0ec2b1d525458e58347c8 release25-maint
+66289 987db7af07002a12c03ebef9b2a01d4e9be2c618 release25-maint
+66293 523d6d7e5825c27ac063a7393b9e1141d34762a7 tlee-ast-optimize
+66294 3af6a702070b43a4ea4d455bcf6e53b64d43de34 legacy-trunk
+66295 a1cae9555f5df82859c7ddb65cd733b43419d226 legacy-trunk
+66296 2ab0529237cb1a50008a8c0458056b84b92d396f legacy-trunk
+66297 2611e8ae238fd6f1ce63458bcba13a5d0252b3a6 py3k
+66298 d794238150d22fc4aaf103fe6724b579dc4c94d0 py3k
+66299 05e25d7a07e1987f55c1476d8d0855a1d3895224 release25-maint
+66300 a9347cb8ac380672dab260488c6c184ea848a7d5 release25-maint
+66301 7b1f8ede9b5343e8cf469b6fbd609512f8c26f0d legacy-trunk
+66302 f085f39a6f4d12231e6d669fb872cde0f496c155 py3k
+66303 271dce0917c105754c02610b359c30025beb8119 py3k
+66304 aa0ef5de345a788f7ccafd240e3bbf14618ac717 legacy-trunk
+66305 568ab5837194d899e11fed01c2705cbc1a988a5b legacy-trunk
+66306 fe5362d9354258e1919c90d0668e04350e685825 legacy-trunk
+66307 d61b956b0bf644c309f0df285678acce2999d4aa legacy-trunk
+66308 de6eef31aa5f7298e1aa7c83db6619edaaaee2bd py3k
+66309 50941beff0328b4f6b265a031dac7e787265c6d6 py3k
+66310 37b70cd4a0f0d10ff988a07f052dab5b4b08afe6 legacy-trunk
+66311 ac3b67043361ea629213ecf2853664bae7f4bf45 py3k
+66313 bf4bc973e2aafb338ff707a2cb9ee0d6182b05b9 py3k
+66314 44702e2737506c527bdc3b1c50a29893f0da503f py3k
+66315 c8713fb05f9e4e834318e54a5d0d65914bc37107 py3k
+66316 973bdb2db6ac96e270fc532c76198d3dbd7bf3a9 legacy-trunk
+66317 4d148bb84a077b2a9fa3734ff4d3e36af2e66580 py3k
+66318 86a42e9f73dc219301692a27de5ffc37da288d2f release25-maint
+66319 23b452ac1a50a49fc49c7201fe75f9c03cee8f2c legacy-trunk
+66320 964db879f190e9dccb1d6f5dce7107c5d1544162 py3k
+66321 ff96a313cd1c839ba31b354231ecedadf42075a8 legacy-trunk
+66322 3e6e565ee30adcb5ec03a580e7fa198a24da97e2 py3k
+66326 c46bcccf2af2e477257495d9ad5a6b379709143c py3k
+66330 b528cbea60e1c515f080269d4a393e408a68714d py3k
+66331 f7123d45d0c43e9ae0e816a6078d2d0d153b351f py3k
+66332 974040c8f3696110749f903496672e3957190ad6 legacy-trunk
+66333 f6650f247598e2d986f8620fbd43a17c4c36e31f py3k
+66334 7087ea828dda2fb5927042c54919662afd5064f2 py3k
+66335 0f4457cf25b2ceba098f54bb8c739a36ad2e9878 py3k
+66336 756637a3ac4ba2610140a1e43df043083ee373b0 py3k
+66337 36b2d674fc8c53fd4303c3c4f4a7a155c5dc5b57 legacy-trunk
+66338 cd61d54fc8c064d73671816a961473c6a29b62d2 py3k
+66339 29094842b3776a9f8be9c98663bb4d60d60d69f9 py3k
+66340 a90b285458ab017e1fe274f3449b6933307dcb1e py3k
+66342 139f6baef6c2308313a142f75a63a1d24c83e6ce py3k
+66344 4249e58397ef01c1f2e2a7c280d2a1fec6e19aa0 py3k
+66347 6f08278bf8b1f5ea987ae5591a98bbdc2eaf69a4 legacy-trunk
+66348 dc0cae1e6adb1561940dd0b68796839133a5d02c py3k
+66349 49a93c02a6d21317fa5261f5d345b79d67e284fd py3k
+66350 753a76b3eea91dd19ca89b621cbbe6dc46951da1 legacy-trunk
+66351 5c03881c20755152552f6a28ba552fded3524bc3 py3k
+66352 73cc7b6355b8176a95b55918589be4efd6be3fc1 legacy-trunk
+66357 dc19a1b7c5a6344805357c768bf5d5baffc397a1 py3k
+66358 2c2e3a56c7bcc86723c14da8a9418ad3e46bf4c1 legacy-trunk
+66359 e90a3f0a9928ad3eb4ee7eac9620e5677d7794ca py3k
+66362 c37c7dbd7880db0345ca7e97a226b11cbf4c85cd legacy-trunk
+66363 dc60293b29d5119bf6772996ae754d10db2c9a9e py3k
+66364 95ac698358abb34d8034e4df7bec4f07e4b5d892 legacy-trunk
+66365 77565be1b95770d1f2644777e88da4b3869af4df py3k
+66366 513266a75ec31e11e3375de3637c28fe50736275 py3k
+66367 f100efca14871bb821a31aec8dd9d1b025bddffd legacy-trunk
+66368 25f14128a97c18e44bfdf4184bd9718a857962cb py3k
+66369 2ab85c392a8dae00a5e171d8c6ba0969e247a50a legacy-trunk
+66370 dd96144e6e81fa4e6cc58aae07035a894ccb1d34 py3k
+66371 f97779262bac1b35eda300b6e7fe270ac072e16f py3k
+66372 af40238a68b95ca083a7bbc57d478904621f97fe py3k
+66373 589073cee0ae47a66a10b9c5ad011e21e7a203fb py3k
+66374 348a33048ebf48fb5072563f86be7442f63c7427 py3k
+66376 17475eb55067ac1d1956081df2cedf61501441ff py3k
+66377 145449109a31ca16b34b79e298508babb4361e0b legacy-trunk
+66378 6ae2d4b507a252f61d4324082dcc209ddb6cd269 py3k
+66379 a4df4903b355564f2a47e5219c4587e3d7545887 legacy-trunk
+66380 d27df083d4e674d972e954c44d78f63d76ce25b5 py3k
+66381 51ff934562c23eca6dcf21eceafb97b5bb3db819 py3k
+66382 87531301ba48c87e28cdbdeb105bbf1fee47dc93 py3k
+66383 3dc31809631fe17915c566b41226e82dc6bc3c9b legacy-trunk
+66384 96d6276d80e23246ba012431d07030605482b5ad py3k
+66386 f28b999a69f83b650371f57ce4319fb374ee778a legacy-trunk
+66387 89c2a697f772f0fb65fefec4031c1de03a4b6ee6 py3k
+66390 0ef7cb35b21672467664fcbc3234ea1de2de466a legacy-trunk
+66391 4cd97f8de69e20a9e645fce8b36e4299a3dc927c py3k
+66392 c05f5abef78ad5252e2beda8e0d13e97ed90b7e8 py3k
+66393 280347d2f76501e239445de6f15ccbab57fb443e py3k
+66394 0fcd4db23dffeb39c54c6a2c1652173797cb201a legacy-trunk
+66404 ff15e62a349b78bd789eae5b17be5977014c59ab legacy-trunk
+66412 4c77d1016f60af4526c33cbdd393aed7eade543d legacy-trunk
+66414 76bc75772736f32e9d3418a5f1f31575da80f3aa legacy-trunk
+66415 381ecf46dfae44b83e3b8db4f10cdb4a0fff41fa legacy-trunk
+66416 1ebb2a8cc06c94471d72b5476c2050c4d115a1aa legacy-trunk
+66419 4f7de1ca92ff80671ea22a583b0b9a9ce2614835 legacy-trunk
+66422 738ba8319f49204e49619cb5ec9a573f7b615f51 legacy-trunk
+66424 c8d446ea96dabd3bb4dd76657e6d92ae1029ceb6 legacy-trunk
+66425 0932b9baa7a458f35cd71ff7ef70af9cf981c173 legacy-trunk
+66426 bb3d1bd1e2933e7e11ebddb9c9b1fbb203f970a4 legacy-trunk
+66427 e7c2800b23bf82b56939c3cbdd9f73a10ae21304 legacy-trunk
+66428 41524f9e2a2f9fb859c97a3c1dd13a559280f6d2 legacy-trunk
+66429 5ce01438baaa595cf9152192beddd605570f06a0 legacy-trunk
+66430 596a1ad8feb61b25237c9f7d226b7861ca2e903a legacy-trunk
+66431 742671c5d7c95c65abd3a0e3cd22b7a7cc4e208d legacy-trunk
+66432 c0da7f2361ecdc385f9fb2d21d959537d477170d legacy-trunk
+66433 05136293f0c8bfd5cd28354629de5c2cf7ea221c legacy-trunk
+66434 c3f0f97839e38277ef5c9512bb9fcb0f1ad56b09 legacy-trunk
+66435 52ef95bdd801e44be4ffba2b5507aaec7ea47c25 legacy-trunk
+66436 06f323aa72c4950780be164cc8dc85c9eb508a44 legacy-trunk
+66437 6709ff8287d98784aa41bd9666bbbf1d85e01680 py3k
+66439 6665ebff64f1f2c206612c08861f57df2dc87b38 legacy-trunk
+66440 1eaddd2388cc27471fb4023db07f18c37403cf39 py3k
+66441 1af16970dac3fd4565defa2328911c82b76a54bc legacy-trunk
+66442 d406983ed9279ccc659c86fb2ca1d0b0f478660a py3k
+66446 8f886acaa142ccaa9d9b62288620cb1fbb459d87 py3k
+66447 feb7bde1a4d930117086a2856bfc0fa9662df7f9 legacy-trunk
+66448 c87b84db244cf630e303709736cd8dff17a2a521 py3k
+66449 095de5b929ddbb564df9554975e102f99ba0e9c6 py3k
+66450 75b0dcbc3cc718158890332eae4ce73454def217 legacy-trunk
+66451 3b048e31dd9e77abdf6bd59892dd1187d25c6751 py3k
+66452 59db4b3a06b01b52f78c4e749bf8237ac47ded4d legacy-trunk
+66453 56d5c03b92b6cef159eaf7fe3e4082ea492aa68f legacy-trunk
+66454 47db62bf6aa70d8e8f5abf9e0da5aa9d6e9997bc py3k
+66456 62700bb7f7b5909ea78cb0729f59664a29255221 py3k
+66457 2c5bb4634d2d9ec6a7776526e1d5f59a40b50cc2 legacy-trunk
+66458 f99800166c2b73e33b722bfd35afd785e003351d legacy-trunk
+66459 cddf5d6476cf127b896f423654668abfa93e0781 legacy-trunk
+66460 e969232054a2c38b725ffcbab2b48fc042fcee93 legacy-trunk
+66461 6929b74272c40ef5323cb568130e2bfec23caa0e legacy-trunk
+66462 62e5f73d05b49f427d6bbf5a8518bfa456932d04 py3k
+66463 64be9f90864e14b335b64fd1e0d5c53395144391 legacy-trunk
+66464 2605465bba3c18a1ab30e6bba6afefc3e3147076 py3k
+66465 a3f0d667e2ce557b783e0780817db976fa05b131 legacy-trunk
+66466 3a82e502474328005a4db664eca98ea1f11ad5a6 legacy-trunk
+66467 aaebdc4c46903b30f2585786f379c6806d30fc45 legacy-trunk
+66468 02a6cc5d7a2276e19239005282c4bd869e196d5b legacy-trunk
+66469 bdb660dca74d6af4c26f62797f3425d2d602213a py3k
+66472 f974e0fa54caa77d36129e5a4fba7ba92e1d8d38 py3k
+66473 1167ae645e8c027543aa19b4dd86695f5e6b64b0 legacy-trunk
+66474 20df06e1b2669f5928ed6f5b70e28f88a1550896 py3k
+66475 67043fb8aea5c0e810505facf233ab4f6c9e8548 py3k
+66476 3302045bae9789611be045a0777bf681457d69b8 py3k
+66480 bb2a0a37faa97bdbecbdef92122cd14c5029a16b py3k
+66483 d17cc4d1766ca13af54e2a6843c48f0aa5f4270d legacy-trunk
+66484 4453e2c6aa7fd2e54a966d8b8587821c19d23b53 legacy-trunk
+66485 97f28dfa1549b3c1d096a3e00603e2f8bc672ebd legacy-trunk
+66487 a1c19f263f7955ff1f7a0de218ded5652b44e92d legacy-trunk
+66488 5d2f161194594b1aa8573103e4153766fbe98b57 legacy-trunk
+66489 2f9b06f95c9a6a7d1fe09569574030d96da17105 legacy-trunk
+66490 7b168602f44db2afc4bdcb8d12bd6ee0edefcbbd legacy-trunk
+66491 e2429e232576a666fd2f543d956fdd2999c09673 legacy-trunk
+66493 30ef22a80267c3d6982530ab6fe8821cc1204c5b py3k
+66494 af4c4cf3e01e0932e6440a295fcd0e5a9c7a3bcc py3k
+66496 2606d9a00c7b62200f44065aed409cc0a2b76f3f legacy-trunk
+66497 58818846363bb5e0c81ad62d6af469e55dac5a31 release25-maint
+66498 fe355bd05c474382546cf847ab57868ec5e9c7ba legacy-trunk
+66499 507ede9c7f7f475dfafbd4a52c22d767d10a2bc0 py3k
+66500 5d61c654849795017dca4c0965cf9087a6894c10 py3k
+66501 428b053bb098393933018b72159413d0fb0ae38c py3k
+66502 c6703f4989b3730f4395fa80b72510047e0aac38 legacy-trunk
+66503 0ad8cea60bfa0b6043825a6be33976f4f854cdaa py3k
+66504 525792097c6308a78a76b7b5f56bbd8a24c26acf legacy-trunk
+66505 5549b5df8bcbdea721ed1e9ce71954c2603f66cc legacy-trunk
+66506 0eec347550414eefa3b5f52a0e1b537df9fc3749 legacy-trunk
+66503 49b9b9965f312ba15fa7a92bd4df5c2c7c38387d py3k
+66508 763e4b84881cc1b92078bb8022b82ea1c650d731 legacy-trunk
+66509 6700fd8125ba5e0d1c968141b512ba5d4ebbb550 py3k
+66510 9fe467ff0c08634b3cdf21c9a96624ca9476ea25 legacy-trunk
+66512 5a71a6068e303584627b765cafe2e42bacbfbcd7 legacy-trunk
+66513 c45a6965bc46777e4017b97522cde7cdb14e9b3c legacy-trunk
+66514 62603259771203101250feabe3abb9f5ba813cfa legacy-trunk
+66515 15ac49602a0648b1b56f91221c5f26dec7acf72a py3k
+66516 578ad491d4a486bd0017d586d1f05c386509922e legacy-trunk
+66517 c1372932ae87cc955570e2497082cf66c11a06b6 py3k
+66518 f3e5a853420629363099e736b5cb210534c757cc py3k
+66520 b6a803188454d7632ec23a24b7f703eba842aa5b py3k
+66521 cc9d9d966b1a4ff502ef4f68ae0f80dfee501352 tlee-ast-optimize
+66522 d6b8d46a3431bac4ba460c34b8dfd76a6fb19694 py3k
+66523 50b1e55756a507c51ade0e8abb36af787de670ed legacy-trunk
+66524 4f9a97140f0efb9aec8a343f97b5eb4476a50086 legacy-trunk
+66525 61c68e2c571b07dce5a6604365b73d3ff08b3e87 legacy-trunk
+66526 85b480ef2635c67a924240972365e11520ad6a28 legacy-trunk
+66527 8b17f92bbc4db66435624cd0d5ced51c7f75a4f6 py3k
+66528 6b9f2ce5fe922e86c020646a5684d318ff1bed85 py3k
+66529 701db5e967b5db12f20833462b32dedf333ad66d legacy-trunk
+66530 b841552a9a73b941e41a00f312a40a2c3907f8fa legacy-trunk
+66531 f71f64ae651966e504e2bf5d03687a78bf23f5a6 py3k
+66532 e52a3595dfdbc506e7bda3748d3e7022af02a0e9 legacy-trunk
+66533 17776df6fda2cc30416233f3d3fe393ba7b31294 py3k
+66534 c2e2e9262b99b208cfb6e9c9b5427a1f6147ef59 py3k
+66535 923fb458bd0c69ef9b117869ad6e4eb52e05a0a0 legacy-trunk
+66538 386a03ec1ff014df7b3edcccfed34f48ff3b3882 legacy-trunk
+66539 55cb3e11bdf74e6627fc8ecb89b976a98276ce51 legacy-trunk
+66540 c2005c1cf6cde8a55f56a14be9d252f54bfacd8f py3k
+66541 4992fd49a985d678cc4e0b81a99053eefc689844 py3k
+66542 25f809123df6063f665c561bbc6654c5250bae9f legacy-trunk
+66543 d1ab83ad5e2b934f340454477ed875e6c26e19d2 py3k
+66544 6b679ca24369fa1d234d21a12c7619972c12cb3a legacy-trunk
+66545 f0c25e6bbad580b7caf605e939c79e088b5a7ecf py3k
+66546 39a947195454dc208bc12a932e824a7fe43b5c77 legacy-trunk
+66547 c17770074a4be9549179aec2630e8c1b4f4d4e09 release25-maint
+66550 54613ba1dcadf5037a76347ec03403a3890ef70b py3k
+66551 6ae28a503c9d16a7db2dcb99ee430f7e44fc24fb py3k
+66552 f3da56e3fce4b142f2361a8afb97b1c4bbc2d30e legacy-trunk
+66553 922b9e03b260ec592f164f90076ff7386df1a401 legacy-trunk
+66554 fe660e8c63ba690cd58b915371d3035ba3de8e22 legacy-trunk
+66555 06cf35e6e308eabfaea83ca1305e4a27c932a6e5 py3k
+66556 e86ed113535cef0a8b88b487bcb11a0743680def py3k
+66557 ef75eb3dc48e8202de939236c5be5f2123fb877b legacy-trunk
+66558 27c1ba7186d8f729c47fc6a6c04c8aac7234120e py3k
+66559 de90a72e3e23438a9aee3b66df1fe4789f6be623 py3k
+66560 1d5c3bcf35ad3986c08bbcf5bf9cdeb14ee1d46f py3k
+66561 018bcd64c33e4f68c702c4b579cd7eeffee97a5a legacy-trunk
+66562 0de5a388a261804e77fa067d58fa3ad9318f279f py3k
+66563 64616e5d80b4b264b9a9cf90835d28f18b2995da py3k
+66564 f6df567ccd6289a4d605ec92dfa13c84e27ff7dd legacy-trunk
+66565 be89d2a34b2f89a317bafce04f6b484538076b1f py3k
+66566 a5f26b3a26fd9ee8e54cac153b3728a50513d0ab legacy-trunk
+66567 edf8a6c69028b775895a1aea8e7a77fa3d889a67 py3k
+66568 f3eb000487b9362c2fcf543e399967d47a85c483 legacy-trunk
+66569 f8430b6876fb36cfa90cae6babc424767efe2e2d legacy-trunk
+66570 bbe2e35852cd4d8a02c7ca722ff5bd938527eee3 py3k
+66577 b3c29da934f5edf88f6de0adfd390f66373a10b5 py3k
+66580 25da07fe3630c01b89918f10c73793e890a79840 legacy-trunk
+66610 db999eb2bbdc759d2b49727cb751b0324385199f legacy-trunk
+66611 606ab25ddef1b0be2fdee31d58c690e3ec298fda legacy-trunk
+66612 01fc083e1ddd35101c2e236056346db6ea27f5e5 release25-maint
+66613 a870c3c6a9ad24135892c77e9fa58073ef6c7594 py3k
+66614 120b4bcf09ff720e632f4ede5d791e94f9ee58bc legacy-trunk
+66615 a00626f2d70579235ad01042f1381091492b138a py3k
+66616 9d1c531168cad7a1e895f670b882a921c8c62684 legacy-trunk
+66617 091a6c5227a9475ba3ae6a3f21133d48f06b3f59 py3k
+66618 a91e78ab4d7d203136f86e8f0c9aec33f8e00d0b legacy-trunk
+66619 3febcbfd3601c423a31b270745afe2ae2dcb6199 release25-maint
+66620 5e5b15b692e1417f6a98cfb2900c1ef850f61394 legacy-trunk
+66621 acc44b7fade09a6fe72c09414f581e44107a08bd py3k
+66622 dbaec249d56f12b5f8969a4e34bcb5f83db1fd53 py3k
+66623 78a21b278e1b9b74a82def41bf5a53c4406dc2e0 py3k
+66624 f323fa4e48d79a28714126ff7438d2878802e900 legacy-trunk
+66625 b550de42851a85c1066c0dc7f7ffa415a242345e legacy-trunk
+66626 b232e2e9e7937e3457322936f919e1d0fa63dc62 release25-maint
+66627 06ebf12bfa62ca5b9eca2e7ad70d65828a9c3e2d release25-maint
+66628 4eede5e48ae685ac7bd95912d27b67a4a130a5cf legacy-trunk
+66629 e13c03e0ce0bb4c923d26fd73f56672500fd21b7 legacy-trunk
+66630 bbadb960fd5c1a9768f09d9bb71e7027b16c2550 py3k
+66631 304bea8731d21a4e08ebdccf605aeffcbb52311c legacy-trunk
+66632 e0c06caefbff33fa4706cce55e380f1502af6c0a release25-maint
+66633 6403f1edecc19d24c4ebaeb6175c49e121a92d3e py3k
+66634 eb35fcba658ee25b310ba4ad92443ec6690b37b9 legacy-trunk
+66643 075042c7724c74a49b6b3e04fd1445ac874ddfc3 legacy-trunk
+66645 de75fb4e800cef93b92345336e0068aef51d0c1c legacy-trunk
+66653 cdc7f636778b6923d0ff71e95f326006efe1d6b5 legacy-trunk
+66654 8a1dbe5c2b745c1855ba401638d8dbfb5f24f914 legacy-trunk
+66655 5284768c264c59d55034ac511a6d0bc8673d7f7a py3k
+66656 d70bcf3b628d7a2ed619bf93f4eb93905c0bb01e py3k
+66657 0699a712a3dbdd8c52f18dad306912613212a00f legacy-trunk
+66658 7651b9413c854cb60d0c103e31d734a9121a1bc2 py3k
+66659 7a3f752adf1cf89452b8839c6431dd92517b0abc py3k
+66660 530c81418c2838cc822a990a2a3e3eabc33f9c73 legacy-trunk
+66661 2ca4159bbe654066173a92501f9e25d46c93b740 legacy-trunk
+66662 ce2fca48ace43266818546313c9a1d53fa86f341 legacy-trunk
+66663 755f34ab438b19167c3710d5b248a6e34c2559c2 legacy-trunk
+66664 231f3a25ccf5b2de88eda90f24e609db904302db legacy-trunk
+66665 da073484f5ac306c58bcc8195d4d067ff4b47e3a legacy-trunk
+66666 4844cac086525d2a985f96902a7b82a6ae98f7c1 py3k
+66667 6cc5ace9f513e00800e101a78256e7de925b01ec legacy-trunk
+66668 ec42f798f59736440a031fe62f2d3372d582be67 py3k
+66669 56a3fa449c6c6c13569f8c4ad3b99d3067d017a7 py3k
+66670 53ace397b9c5bb5bf523c28d92b310ead786d930 legacy-trunk
+66671 dbc6edba70a7b764aa7469c22236c856daddb1ed fix-test-ftplib
+66672 cc69b931a6082d9d24274929bee24190001a9736 fix-test-ftplib
+66673 5a9a83cae8f1b2ab9ff73524c5767cea1c6a946e legacy-trunk
+66675 c5f5d6a313e9973dd4f094cfce91470903dce774 py3k
+66676 64ba5240af31a92bd80a941f032cf7960bd4ecbd legacy-trunk
+66677 74e7f97dad7dedd105a17a2fc8ab0d803ca0a370 legacy-trunk
+66678 a95030f939ed08deb93437d06b262da85ee1370d release25-maint
+66679 02417b56e4b21a98cd9d86fad6c19380c95dd4e5 py3k
+66680 d586185a7a5167aee2bde8db9975c897c902f45a py3k
+66681 cad1d2a8a9d3b9b0e066d848a86ca361ca9244e8 legacy-trunk
+66682 40536ddc26a19b8fee250f437305cf25663837a4 legacy-trunk
+66683 5b35294854218a8caf1616b1f7ebd2fa61d8bf42 legacy-trunk
+66684 69e184b990dc77b2e58c22fff3ae8bf3f047d77e py3k
+66685 edb5eecf3bb8bdeb685896f7298792c858b50871 release25-maint
+66686 d88f1f2f02135f6e457f47b38906197939320b33 legacy-trunk
+66687 ab34a647e22fceb504514ffbbe1f05ea3e92b8f8 py3k
+66688 b4964df643840e43b1bad36b43b6a11008a8a5b8 legacy-trunk
+66689 f4aeb113c9efadce695b6dd7d18683c62fa4fa03 legacy-trunk
+66690 4156555f391181bc0d8fcace7353e706273fac86 release25-maint
+66691 376327cb68213c4d1402141d52e0056e4a00dd0b py3k
+66692 7c56624548fd482f5baffdcd07e6a519f54ac6be py3k
+66693 6a73134f96032ef1162e5ff2759b02ecec8d8656 legacy-trunk
+66694 b2801aca9d6b5fbe1a1a0e8e84d34321bb2bc133 py3k
+66695 598d19936186a380448ee391fe40e585a3fe586b py3k
+66696 af6fe9adb39c3f3ad538b963286749a57978b8a9 legacy-trunk
+66697 6ceacd015d678a53c31eacae9c68e43e3c9d9151 legacy-trunk
+66698 a4ed54d5764c90631c0b7b55035f1c0b4a1f2637 legacy-trunk
+66699 6765946e1ac49ffb354baba85ffc3820bf309101 legacy-trunk
+66700 7f1f9e18cdfa325ae956525470e220575956d077 legacy-trunk
+66701 86045e1ee5950c4a000631fd6ae64d6aa274fb1d release25-maint
+66702 1f4ea0229ec668cc0590bb95e621962fa09a2921 py3k
+66703 eed4d533332f0fd901ab30d292d5faf6aae8b936 legacy-trunk
+66706 d318234a00d7586b95fdd369344d1f6a202715a4 tlee-ast-optimize
+66708 ea53163b06de32a6fbb390cbbb149013011ab17c legacy-trunk
+66710 b5fb9b002ec3173ca9a23d560f246bac8094aa8f legacy-trunk
+66711 ada6d7f71b5df076d9e0b36ef7f0ed23f678866d py3k
+66714 58a9884d2bc3d33f9df8552857709dfe99d18384 legacy-trunk
+66715 95fff5a6a276520b2e7e0f75fe303f49376567a5 legacy-trunk
+66716 bc4ca80bb5fd4c91a8b7e7073e7c4d1cc1b4770d legacy-trunk
+66717 54cd1cc70a478d853ef8c364a2e027b6fa602482 release26-maint
+66718 7292893fc2c5f8b850827cf24823296019dbfe5f release26-maint
+66721 748ec9b2aef1027bd933de6f789bab8bca880e61 legacy-trunk
+66722 9d2f2818283d5e89c412dd6f929d56dc0dea0515 legacy-trunk
+66723 a5f30d06493cbd4c95d9a8d6e46d821536d66fae py3k
+66724 88e6183cdb38c6bcafcc6481e7507b6893d905dd release26-maint
+66725 033bb5cacd0a3417be6f4d45c22760bd1f315204 empty
+66728 6dd87de8503d56526ccf8e15d7bf319d62162f2f empty
+66736 56d17887482133d9b7e5dd287ab22fd1ceaa4fb8 release26-maint
+66737 eeb5fa3ef889a22190c6558c2adce8fc340089d6 py3k
+66739 9c971d52a3c35fab2aa67e3397a53e671460ebd4 legacy-trunk
+66740 873d1e36979dae67d94e455b59e28254e2817b52 release26-maint
+66741 f9f01484e48b02c1d1c8861c94fac88ba2c7c04e py3k
+66742 068d9b614e7bffab68dd28112bb0ff138e8f4203 release26-maint
+66743 8a7c930abab6a2c26eab69891f49d8be49afe5de py3k
+66744 b9afa7c9cc35e15fb68a9d401a6c12f3f6101d1c legacy-trunk
+66745 7426d8d7ce1b4a5dadf59df7a66ccf8ed5479fba legacy-trunk
+66746 281b21ca03f636304f97e938f6bd6381703db78b py3k
+66747 01389526ba25579e38556a2c280104c1ee27e065 release26-maint
+66748 27d7efa3e1ac0055192a8bd7410d42ad33689cf6 legacy-trunk
+66749 642f20b2257795628e638a724bb0f11fc5119740 release26-maint
+66751 86893a397dd051d4b15235a98ece2d8b28a34c16 py3k
+66752 f812bc2b6a7bfdf872be178542e4b218d032fc9b legacy-trunk
+66753 981306f4b405011e2ec205afdc0e0c5b2611e1fa py3k
+66754 3aeac4a6a2cfcb5ae77bba7520b9829c891be1f5 py3k
+66755 419e721b3ca9e203052692384ae69be9c1d0a6b3 py3k
+66756 200dd1d820fcf48593fe83b4b266096930e0bdb2 legacy-trunk
+66757 57b2d9a22594a15d57902ebcbc9f81d88c91d211 py3k
+66758 4f772004a85dcac5263fe9edbc542667e5693677 py3k
+66761 55f914ae90ed64ca03052ec482acd0d4e15eff9c release26-maint
+66762 03910b8926791cd66dce45ff295d10e70e210b53 release26-maint
+66763 222365682c1be206233a18972cac4ed7a58f38f9 legacy-trunk
+66764 1091008f2cbd07d4a674834548317f0334ec3fb4 legacy-trunk
+66765 283e54264c0d67fe4dfbad261808f000b4f7289e legacy-trunk
+66766 fa040d30cfcaa8a63276598eeeab7e2fb2ff07f7 legacy-trunk
+66767 e8e196397f4571b4b1d61f1afd61612b1999f270 legacy-trunk
+66768 74981dc839fd22fffa6906e8f87a9f9830664ebe legacy-trunk
+66769 e822992cf6cecccfdf8a24b81225002819a2fc4c py3k
+66770 8ec8497604c77e7f5541d98f46fd179f209ad20d py3k
+66771 a8f9595b9f5536dd978a0997d5682b7d89ed538d legacy-trunk
+66772 08c48ea05045bb03fad065e4590634b6aef6e11e legacy-trunk
+66773 bf81cb8892f51ce7363e9893427473d02e9ab568 py3k
+66774 b5f39c8a44239e4cc0fc3744d7e5c043d81baa49 legacy-trunk
+66776 f5b9c6f4c59c7905d005c10fc1775159da9bff0c legacy-trunk
+66777 ef4bb4d5dfde97a65ca8c472fad88267652cfa54 py3k
+66778 0b1db242d232e47f7e95ec5194c69986610c38a0 py3k
+66779 84ccf91a06cc5452a5f8c7374ca591f94c5c2028 py3k
+66780 8a892cf25e7aa6b35f5a32521cc2b30ec8e7a941 py3k
+66781 16a194da77de96e577c27f7146ce1e10cbe76933 py3k
+66783 8442f13720a4dc0e6965bd14e4e70740b662ce23 legacy-trunk
+66784 be2f85be566e516323fb4c7e2613d2e5660d7263 legacy-trunk
+66785 c56fbb7c1689ca8b0d9a47fdaab7bce288a6fd65 legacy-trunk
+66786 885fdf5970cc563a5c0aaa68439db80c52c1172a legacy-trunk
+66787 b21de0421395d508324726f9029dc87ae8952b15 legacy-trunk
+66788 5808a7ae03acd907f0900bdd2215b58acb0bec8d release26-maint
+66789 356e88d4af3023c7beb16b97f4c246cd672250f9 release26-maint
+66790 e591e75e83a2f1f02702c6ab369bae29bf653a3c legacy-trunk
+66791 f21a3d8585c655449fddcca212d1ae4445938b95 legacy-trunk
+66792 af7a399fc27222c20673a162b072cdc527f630ae legacy-trunk
+66793 984a8bc6d956f35514460792d835b273c467b97f legacy-trunk
+66794 f731f09ea8394c4e48c359a6d991bd98b278f2d1 py3k
+66795 ac316f25229c9204e267cfa22b96f8daff87679d py3k
+66797 73ce3a11046fbdc008bcb34ee81c49388dd2c571 legacy-trunk
+66798 ff5c3dd68d07c388aad2f09bad0bc66532fe2453 py3k
+66799 05604555b8d400dbbb172f84f0f2c58494bff71f release26-maint
+66800 2e794757bdc84ab78ad36467f6910f23271955bd release26-maint
+66801 e096c52cd5ca9a13e5194fcd1e2cfd25d7e20041 legacy-trunk
+66802 8f5a8ea5ba76eaa3f5fb6921f378c28b11b20496 py3k
+66803 da955c33965b49203250df3a5d6ba33ba53bbcf1 legacy-trunk
+66804 356a1f6ef34fd2877aed8c7af782c985e9cad9c4 legacy-trunk
+66806 c5b27df79d7d6d9bf6b25762010bba430e6c2cca py3k
+66807 c0478651460fcafd7a8e19b3e401e26a58ac37e2 py3k
+66808 9e41c5e7e36019969b0b2ed23d4d5a66b94b929f py3k
+66809 524ac744ae04396664009309f10afa268bc0e454 legacy-trunk
+66810 dc95e46f1f3e89a9bd620d3427e6285033209254 legacy-trunk
+66811 c2d0196ea58bd46bee3908472cf298e6a199d750 py3k
+66812 02dd5db6290f45be2eea1ebd573ae9fcb891e455 py3k
+66813 c933c8467bddaaeebf4afc2f23b9fa648e5723ed legacy-trunk
+66814 c9c78e00df673e643573e5bc5b034fb4523f3826 legacy-trunk
+66815 c5ae932f63c9da348b6ad529f9596c9cf98612da release26-maint
+66816 f5115c132d4aa6b4d917050d80524c3c6e547f78 py3k
+66817 dfe310a402458d1166b6b0b14f8bbf91c9414a1e py3k
+66818 7aec00015a9e15894dbde49cfd22a83b56e37792 py3k
+66819 d8b4a61abf25f715ae3a66960314856ea1d6146e legacy-trunk
+66820 dbd2b1817a75d428f0421f68fd3c6223932b6bf1 release26-maint
+66821 125984b71a768e200555e84a235de6bdb23b7f9e py3k
+66822 e991538b9a876c774e60908871bdc808686a8099 legacy-trunk
+66823 9c7ed70aa2c3fe4f8cf4b940be014122632378da legacy-trunk
+66824 7efddae50d2550391521ec363299032ab0e8e546 release26-maint
+66825 6679c3252f9b0eb25dd832cb38d106574f1679bb release26-maint
+66826 dd97dc79ae0a05f14b7ddc18380e4c59de4edde0 py3k
+66827 91587818adb83804a0deadad8c657b183430fb0e py3k
+66828 d2140de764794e7e4f2ab04588825a394f2268a7 py3k
+66829 1c980554b54b2c10d4bb7ea805bd4f95892d3fb4 py3k
+66830 0b2f765ba4f775cf59cd5e48a5c57e92c3c86453 py3k
+66831 82091df651be7a917677719319371fc5ff1311f8 py3k
+66832 cb788e0844e7f9d082854a23fd5433307343fa04 legacy-trunk
+66833 ce7b8c317da20f8a745a52f9364150277edce70e release26-maint
+66835 deef284822f75d07a928c1a525e8637656168b14 legacy-trunk
+66836 21060a56defc881e677a11d11393a1d08b42175d legacy-trunk
+66837 6e7b853e86160933427278db273a55fd0fe08d7f release26-maint
+66838 1e5b2050ec6acd482f8993a61524dc44f2ef68f7 py3k
+66839 59daa7cf8ca097952d09db8533a8bd837b3058bf py3k
+66843 69ea12db9b28b598322d1c657af665b9f273de62 release25-maint
+66844 860f62848af02fbd838557d2805e2c36ef321197 tlee-ast-optimize
+66851 0205cf0b1adb9fbe3cb7defade328de5e121be64 release26-maint
+66852 94d17cf3d8bbbe0242d22e484930250e9fbef83f legacy-trunk
+66853 b4fcb2f47101cbbde133cf50ab14b7b686d24c84 py3k
+66854 4845810f588ea28f04703033d084c9ee3a75b392 legacy-trunk
+66855 575f65f00c6c0923c0b26ea93f0c31c148e4af0a legacy-trunk
+66856 d4b613da38dccf689b5185602475aa19bbbf16b4 legacy-trunk
+66857 2bf1c1bd8d96eb0eaf28c65fb68cc11eb993cece legacy-trunk
+66858 9c0ed4aecfbd91d3bc828f4abbae4e619a1fc31f release26-maint
+66859 51876a403c0df9bc569705c7b9b2ee7c867ac70e release26-maint
+66861 ce64cba51c2b7d9e3c06c5592b5f04da5c188faf legacy-trunk
+66862 0da3c30fe9b523aaf17c430b18b60eb709a978a7 legacy-trunk
+66863 550d75160cc4f7381b9b51f25dfe0556bd431430 legacy-trunk
+66865 a0258baed0057c0653544171f9b7e615119d0d77 release26-maint
+66866 0e359afc064681253d01d04ca4f0d67321807365 legacy-trunk
+66867 0b7e023803fb372e045251d3bf1856c0445ae607 py3k
+66868 2a2cdb285656de2f3f6933f598363b25edc18a95 legacy-trunk
+66869 665fa05632f7ab683cc4fc547bd6797aaa87388f release26-maint
+66870 08d6dd684a6b310f3d4e1b83979fcb3a766dcd71 legacy-trunk
+66871 3dd1651af35dd4bcb258ef28bdd34ffc0406b5dd legacy-trunk
+66872 342f70189ea9e5b58fc978509fe3195bc2ab3e3b legacy-trunk
+66873 c0ac47984b1104ddbc0a0740fed47272bc69ff47 py3k
+66874 796b1bb9554cb7ea625256110bd4c5a1fdc589e9 legacy-trunk
+66875 5a092101f06963e250e5bf14b889d9565ae79acb py3k
+66876 bdf4da5d04ad9be5358c0f4a2ad55edbc7b1c419 py3k
+66877 d3de082ca0314a9ea4b19c94dbea233fecbdd4e6 py3k
+66878 e6702c1a07d752b3ee5947b81f307064336f6835 legacy-trunk
+66879 187004df579cb0210d77188a3f05f29f0e56eee2 tlee-ast-optimize
+66880 99c78d60be125e3e38e040859585613220c25c3f py3k
+66881 2f0d7384cc1c0a833d1be1e8af7a2c62fdb7fcfb legacy-trunk
+66882 08a3e68f1fcbb11cb5a0468941cd6c2cb0b06dcd release26-maint
+66883 71fa7d3cc4c59dbef76734e986b16861e94ba2fa py3k
+66887 9fdf8d8de2875a7d556c9540fcb37b2996c3fa2d legacy-trunk
+66891 62c24d4a1f8f6209a02cbddaf1a00057c73378e6 legacy-trunk
+66892 e1a88e8b9649bfae7efbf790faff9676a0ac5625 release26-maint
+66894 b09e7053b472c395e05a4ab9b4ef5c9c8399aaed legacy-trunk
+66895 5e6663286abc57c9b8ca25550b12c560ca546929 py3k
+66896 ac86e953558f446cd4ff66b41282f33fbc6389e6 tlee-ast-optimize
+66897 0f0c2283583eeb87102c1701cb67e321279e217f py3k
+66898 232a22cfdea8fa993fba457f8861bed619205e49 tlee-ast-optimize
+66899 84f017420b9b8e1b6a914190109f75df916557b0 tlee-ast-optimize
+66900 bb51159e71dfc3152e03a2b00262a6103e84a2ca tlee-ast-optimize
+66901 d17cfee4f23defbea536e6050af04943970cee83 py3k
+66902 fdcc8a313537448f460c24bec59cabd937b89cf9 legacy-trunk
+66903 409dab8b1d34496991f592aea08f2d02c283bb45 legacy-trunk
+66904 48194d7af32f02681a776f0ece76727d57b2e787 py3k
+66905 0adf6bdb170f973ca57ae807fdc391866d6818f4 legacy-trunk
+66906 4737e5df50f4d7fe9ea82b63070f1cae7639d611 legacy-trunk
+66908 2a1096b4817a2f6fe2c4d0f03e7e71ddf6d5743f release26-maint
+66909 5afc9ffa80bb79ef6b2bc13c0b042c638a2d8da6 py3k
+66911 01111c40616f590b91f29b29ba02cad88e7dd313 legacy-trunk
+66912 92d0890335c24948ca30ce1cb35ae6bf1ea85fbf legacy-trunk
+66913 b8fc790a27aec8b68b38b8020ab4fbfb437b3b6a legacy-trunk
+66914 8d2a69711a97ced5bb043abe499c17c93c31b85d release25-maint
+66920 d0619e210ac42fe097cc0250c8bccd0b4eea3c37 py3k
+66922 6938219dc5a646487bfec829609f3b1757ecf0c4 legacy-trunk
+66924 d7a728420b03a7b37e815b3d8e45d77a31cc6908 release26-maint
+66927 19928e45d18b217bead9435a54709defe714acb3 legacy-trunk
+66928 9dedfb8e565c445d534e172c0a948fa2c82b5dac legacy-trunk
+66932 3c3abd5fc83392372472d3d2dca035bacf082751 legacy-trunk
+66934 00e467db61825436bd0c05859999a0ba92312048 py3k
+66936 a578147bb5c1305594f2ecb0f4c985fd54973050 legacy-trunk
+66938 46225211e503a1954bc8061bac12ef4317271469 legacy-trunk
+66939 241e03371c7e42632e27ef32221ce57d187b02db legacy-trunk
+66940 6024e0caba64802ad932bfccf1e957fa0f4fe965 legacy-trunk
+66941 4e2e6884fd2887622aaebf959b612f247dcd5a22 release26-maint
+66942 8a89132b859f1eb4c25d2d847b5e32b123216c88 legacy-trunk
+66943 a53bb8330a64c51bcc0a48d68a246cde406353ea py3k
+66944 50c886daedf0d815d649958265fc2fab269d23dc py3k
+66945 ca72271c624c2dfbebc0b6032f01b92413c14c04 py3k
+66946 2a3910a8dc377afadc21b1ec41bac5f1628fe93c py3k
+66947 491ed80a8cc1510310fc312e26b32fe83f78946c py3k
+66948 cbc3afc1e40a209d8d4702ffd4fed0a2447d057e py3k
+66949 2c3a6c9dff62d5c9600679274c967880a15bb37e py3k
+66950 645fe56c117aa63f91f0c3491977a05d81d93070 py3k
+66951 481ad3d9ffd1b68df8da8578e2579819623b6f0e py3k
+66957 f67de61c2cfa923883ec42e173cd17f7718dcc3e py3k
+66958 b555d4d9575c458e97c05e95b8cc36a2763f8587 legacy-trunk
+66959 66c545f79626932c1aba3bbfce2ba3f811113606 release26-maint
+66960 dfce62ab07ba0a1f6ce4729d06207caad0ed344d py3k
+66961 83d0945eea422840926775b85eddf33e614e7628 py3k
+66962 0121df3cf5a012c2b8060deeac7f8334fce15eea legacy-trunk
+66963 bc1f43252c9220f92a602ee5d7136509401fc236 py3k
+66964 96e7854d7c6e1a12b2aec5eb48d3c6ce370c7490 legacy-trunk
+66970 684bf7990094bcff1d3854d23d5fe408daccc896 py3k
+66971 e8841c3466519470d450a3f48acd00ded3644ab6 py3k
+66972 57e2b5c45795a8050e745033530407c1d39a4093 release25-maint
+66973 dbd54bac0b6f7ceb5a9a1e14d39fdf32a715faab legacy-trunk
+66974 2e38ca709b1d296c7ffa821fb02ebe73226a69cc legacy-trunk
+66975 3ff7bb830519c27de15f0d7aa18518012f9ecfab py3k
+66976 26bc0cd0108b45b6def094c913693d5df946452d py3k
+66977 6cde2a051b279d210c5660bbe0cd26a83b88be76 legacy-trunk
+66978 89ba01b614eed31806980bd22901be7a407f26b2 py3k
+66983 87ef8960823a184816cef65e5152552ba5635962 py3k
+66984 8496f5403a8225107066b17d25976c1786679316 legacy-trunk
+66986 415137d0e20a527fe31bcfb4ccc23bfb7c213ded release26-maint
+66989 c208f5c1e4fe7b732b2456e029eb837e7ab32e6c legacy-trunk
+66990 c1dcff75976e0546bf764d81193305da594bc1e0 release26-maint
+66991 1eb17122b4ccb7dfc5b16dc1f2c648f0b39ec2b1 release26-maint
+66992 80d2d467f23886d7d4f75fee840e37978908468d legacy-trunk
+66993 ddd0f8cce55cd2082a55b9b62bac78f038787160 py3k
+66994 0afa73d4bf9947813391d1537a2376c642add97c legacy-trunk
+66995 1249840a42b2daea2a5d769057d76e1b74bf29b5 legacy-trunk
+66996 19687830338fbb0da697e167d6157570f9f94ca0 legacy-trunk
+66997 df74224606606891b612b16c19b0d173d85f681b release26-maint
+66998 5479a877ba2826a0d00b95c01a9fb9e0dc2db0ce legacy-trunk
+66999 d847c4fb7b3993b6bc496b669eb43aa3e03ca356 legacy-trunk
+67000 71284e9157063ba7e941c9dc077b3f08a8ec0163 legacy-trunk
+67001 c6c32842e71dc479425b48367e345b427feb51f0 release26-maint
+67002 714d3c1443a746d8fae31841be2dc67948a0800e legacy-trunk
+67003 bbab11cdb175610069d1f31098de22c3c9708905 py3k
+67004 05715f0cd7e779434c37e42fd926438d48527d8f py3k
+67005 89ae9d7d18d7bcdef62a9f188cfaad126033e773 legacy-trunk
+67006 2a85e5c9e1e2a77f78b73e7cfcfb4bf74f65d0b1 py3k
+67007 63f3f045fe48a0c64a12829aec7b4e17c2f7e778 legacy-trunk
+67008 0bc2cd2d95982b3259ab1704e8b340e32de9f60a py3k
+67009 8b65d13c177c6bda8c04ce46a24edb3893c16d44 release26-maint
+67010 31a69ed09fbb40e14f12a53f118d9d1d095e5b46 py3k
+67011 8420af6c33edd933daa99caff9b8adc5c04ab982 py3k
+67012 2a38771cecdd5ad374215d686e0b1d47ac648ea6 py3k
+67013 6634530a04e034521a2fd0010659b695783ab7dd legacy-trunk
+67014 1a487ab0d65b7429f5f170117991dc20593a9b30 py3k
+67015 bbe3732212d64e6f3b00065c411c04c22733b7d2 legacy-trunk
+67018 f66688e69f66bf5eb25dc36a3a7332ca398e55ac py3k
+67026 4a74590f38da5b20d4d57bb0119b3c2863ec05f1 py3k
+67027 df2bbde968802d9cbab63f137ae8a5adc47c33ac py3k
+67028 195cd7ebf62cdbc1556f9ea8f57e0cd166a90f92 legacy-trunk
+67029 860737c96e9782a21dc40dc935014d7f5a0ab394 py3k
+67030 a5768bd62938b9df9c85a2a0b0f23cb467f1e4a7 legacy-trunk
+67031 0a188a2d504882aa29bde049c34b2578a47ea344 legacy-trunk
+67032 30c0b266af062c17c68106727265bc35ffe6d91b py3k
+67033 e80d9e6e26bbd1f6171a7e17efea67f35776d97a release26-maint
+67040 40fd6ef0eaa8f33bcece32032d2090ccc626359b legacy-trunk
+67041 8bde8f51ade14de49caca32b908ec9d26dd62836 legacy-trunk
+67042 40d8fb129306ad4f38c81b3ba714393cb359ef3a py3k
+67043 4b726500a9699cfd1953936d1f3f1b225083be95 py3k
+67044 804e6365817c4b12cc1af4bf77daa06e98e3006e legacy-trunk
+67045 2aa69b9d12738df20f08bc40ddd069fe10c80325 py3k
+67046 021bc9f8810349dc8bfe66a842f8f232903ce651 legacy-trunk
+67047 3485d95957c1d2c581e01f13b2d49bbe652a2f4a release26-maint
+67048 711390d4ac21390b0c6d1de298372ef034349d26 py3k
+67049 24f65e3090e80a22afde6a89174919841e35b912 legacy-trunk
+67050 bb109c4bed276a33eaacc6c094016caef1fe9ac2 py3k
+67051 c0afc4eeba7d6a843357579c52b75941225c8e9b py3k
+67052 6a20e8c1745a9888ff8a800720b1ee1d978af01d legacy-trunk
+67053 b3df58f76e49d87e0cf3d97347c8d27672a98db6 release26-maint
+67054 d2ec6d5b2db9701ba06295325e865939a69d070b py3k
+67055 9fc573fbaf5e34bdacdf24e4309af8aa2fc75fca py3k
+67056 e8c0a5a646ca6ccda031ebfad091513a28bee9e1 release25-maint
+67057 efef5fc45a9a477250befcd7defeb4ee052bf8f6 py3k
+67058 c323102737bc23cb8ffe491fa9ae3a7967eea24e release26-maint
+67059 a5ca8951bef1729b7f5d4db76322ffaa9e400aa2 py3k
+67060 b0cccb55941c4170e195c2d08f65240a3cbd5faa legacy-trunk
+67061 8045d5596b1c8b9334057074e19c824690fc7355 legacy-trunk
+67062 9c97bc86122a0f7c78322584aa7a6be8e518dc5b py3k
+67063 06cf2cea387b7e4503fabc96d5df8d5160b84601 release26-maint
+67064 3e2de484ce34217c6da47ebac148cb10dad2e003 py3k
+67065 96418f812f06800e07796c79336e6b2a395d4419 legacy-trunk
+67066 7e40263dbfd345499285fbc92f824f2f64b6f1c0 legacy-trunk
+67067 6cac2e3077a34d72a3e1819fb4bbab5042cf68f1 release26-maint
+67068 f3234e43e1fe80a294a8515881ba698018cf4293 py3k
+67069 9906f696b94195afaf0568d1a8df9b956029f545 py3k
+67070 0dfdb52abdf9f9587b107fa238fa988a72629ddb legacy-trunk
+67076 578aa43dc40043075018e77f92b6c321bcfb313e tlee-ast-optimize
+67077 91ab4354440efc8144c524a32cd6c2330d4d0c35 legacy-trunk
+67078 2ed3f8926bb891c99a84d1c10c9074b0b11d15d3 release26-maint
+67079 45ac5196fa679dfae1994e087d169f15735a25a8 release25-maint
+67082 1184abc5f96c96d612f3e96d1041acf25056d978 legacy-trunk
+67083 00e71cd891284a57cef0a965857d2e6394795ddc release26-maint
+67084 45046f07227ad3af271d517af28abe5b19668c48 release25-maint
+67088 bd0e9a9cd283a5540aecf9f1a0b875b86119e56d py3k
+67089 0dec54aa53ee75e37af6a182b59be0212a9f6da6 legacy-trunk
+67090 f849c59bbfd764f0253f4959cd136a0894d1ed12 py3k
+67091 0c8faf6c8eb2960d4ab73801bb1a832d678dc3bf legacy-trunk
+67092 5f801add20fbbc32c699e45f9ef4a11b68c1344b py3k
+67093 f2bb133ef517d450d02fa6cffbbf5eeaa3feedc1 py3k
+67095 f67b2c8fa93ad2322dd269e7c1a9d46a633fe7f8 py3k
+67098 e68e42b17e5e34144903e93a4c5905a46bdd05eb legacy-trunk
+67099 a529e3dc695a8b6edde48bc1df88fa02129343b8 release26-maint
+67100 c089eb64ee576e57bdaf32ec30e8b6e3020d9045 py3k
+67101 972b40546d79554f3a8971f0f16ef2938007fc26 legacy-trunk
+67102 50e7822c9585fef56ed66611fac4b8542ade3e93 release26-maint
+67106 23d9cb777d9a816a2562de8b77faec45c3d48105 py3k
+67107 98f3175646203ef4ea390d43454bbde7eabf36fc py3k
+67108 400fbc8052adecc17692685db35338b3cb91519a py3k
+67109 1bc3d1b39a4b795e26653f7c669ed02ac6183b2f py3k
+67110 e2a472f3b77f6c10ea45517f3918c8ec191908fd py3k
+67111 5b4cb8cd5051f7a013979b4647ab1a8b48c02f5d py3k
+67112 aa6e649599ad090df912da6714d688dc32bcc747 py3k
+67113 3a94768a2a8be5d092806dc68a5ab1aecb172a0d py3k
+67114 d7196fb94f25fc8da5c993480d5e055141473be4 py3k
+67115 6e0a361078e52168aa5ec92a77c389b64b21ca93 py3k
+67117 1c23e700150674044a06ec707c2ad1f291cf6264 legacy-trunk
+67118 79c9ab6498fdfb9dffa332464fe4875a7414dfab legacy-trunk
+67119 9a3e9243c5189be64560293fb302763e555cf17e legacy-trunk
+67120 26f01eeaf54e80e9cdbbec0b89c8f3eab8aa873f legacy-trunk
+67121 f3f650c7d3aac63cbbf66bf05f56adee7d72283e release26-maint
+67122 f7867b77dc5578181d196b2ff4da3fb5f02e65d7 py3k
+67123 8370e9ef7f0fdc967d99a6b92b6b7a2e371e0f6e legacy-trunk
+67124 7e63feb30ea5ddc6905993019bed095bd333f06e legacy-trunk
+67125 210c585f95bee6f459d113464cfbb2c876489f5d legacy-trunk
+67126 104537a5419650d3798f5afd9077e8ae883b3c29 release26-maint
+67127 3256187925d1e91ef1e318b19d2b3edef9fed78e py3k
+67132 14d4412d2bf848130eb9d6b51ae02aa8d90e0cea py3k
+67133 8280948592bb2cddd8a0545589696d90cfc09443 py3k
+67134 974caf167ff0452962c0b532a60bcdda855777f6 py3k
+67136 534be8066c36a6afc261b5bfc7c76200d54da1b8 py3k
+67137 8fae465a39627b590385462e6095eb63af45240a py3k
+67138 ac42dc9a0203efb37e65f77737fd1944a9180309 py3k
+67139 92ba12f93282384a238c0fb0569e7cf491f032de py3k
+67141 d2f7323fb70965be622afd4cc7a5421850579c4c py3k
+67143 c983fa68d6ff255cfc7b2a5905189c3a5573c3e5 legacy-trunk
+67144 6238b6cf77f1057ceac51a4d6617f59b4180dfbd release26-maint
+67145 ea87e8814359b38e7718bb008c5099ce1a88cd7c release26-maint
+67146 82ccc7e77ec5573d568d2f5156d5fd5c90d3ff10 release26-maint
+67147 479dad9dc96c1e8dcf6046dcc5cbe9e17828f64b release26-maint
+67148 1f7f41f20ac59666d877dfdc926bc2d15130b10e py3k
+67149 9da529a3fd5ae742d28aee5ef3f8171828799cb3 legacy-trunk
+67150 faccb98d9474e3c3504083f347c91a072cb82d67 release26-maint
+67151 acb78ece56a9e102fc9e67625b2e74d9cac551ce py3k
+67154 3173717a89f317ca71388291112382828d0226e0 legacy-trunk
+67157 571938054721db3fff3e9b093a9e53b1a970d4aa legacy-trunk
+67158 008acb0cbbfc29ee8c94e2d00ec5ec2d0089b28e legacy-trunk
+67159 58235b9dc3ae24c897db1f7df979a48556e032ee legacy-trunk
+67160 6f06571a8aefafe96709257b7f179a41bf8bff69 py3k
+67161 d0aa10ff28c657006570b35c8295d5a540ea58fb py3k
+67162 20a40894539a48a1a7a1fe6ab42c5edb5f074dec legacy-trunk
+67163 d34ccb0341ea53aa86bc370dad1644d0f10960ed legacy-trunk
+67164 ef880e2cc568cccf98b8c94532e036c57e2cb76c py3k
+67165 71f53d3d155121cf03a8eb770890c3f21c059224 py3k
+67166 bc4f742e2c1d5384451cc5dced5b2952fce2511d legacy-trunk
+67167 f07b82a321fe19055379847d557e7b8e5da99930 py3k
+67168 76832c09d2fdc1b069ebf0f61a26c75a45fd236e py3k
+67171 2e0857b0fc6757844a9e0ddb567ba45cdf709e26 legacy-trunk
+67172 cddd9180b8c880622706ad7b4889abead55d8591 py3k
+67174 211151fdc924442ccc3cace5ec0fca8bd41a30e7 py3k
+67175 2bb12ca2ff44e11b8c3dcba8424657af9eb3967c legacy-trunk
+67176 c2a75ba46f14d9fc26d4aec7e6c94e557bd6c048 legacy-trunk
+67180 ae83d4aa3e0ed9743cc03fb3ac8a9645ba8606b8 legacy-trunk
+67181 2b3340b5ca386b52467a5beeb3faf57900cb909f release26-maint
+67182 b2481a15376348ff81bcf1cd00517f39f47be9dd py3k
+67184 acf69e079b846b5c3d84e40e79a94ec1ba8fae39 tlee-ast-optimize
+67185 54cb501f6215abdccf9e411552a0afe3364ba273 py3k
+67187 218a98981183d2a3c7f3d15879e0fa11c0928488 py3k
+67188 63ea22b58d5425921966df059cf22b3eff8c19e4 py3k
+67189 7440a30a2f13403a427e120cc6f1f7880bae2d5d legacy-trunk
+67190 fb725366f9ac8bed4e32d66d7eb923a555c6828a py3k
+67192 b0713fbc5061baa252a440b2886574e92ce0987c py3k
+67193 81190cb1cae29306a2282d2e16ac450d65ad62e4 py3k
+67194 f2b43d28251dcdc020b8fef6383ed2ca9c6d866c py3k
+67195 03e74dd9cc83f590f85d9025a2969366d6c57737 release24-maint
+67196 8d6e2499726a52813a13019a06b27898971a50c9 release24-maint
+67197 61a33050443d20f0d24af92279128056f9e9a8b6 release24-maint
+67198 9781eef3192c6ab2ccb25cf8bf11856e09e0fe23 release24-maint
+67199 200c8aab19176fbf71860d47026bdbda64a78612 release24-maint
+67200 ce7224cf87ba20f48c0fe0c8f98731a95ec965fc release24-maint
+67201 23285ff10c04d791b4e701a4da721158d2d0d4d4 py3k
+67202 9a13e966889cb44c87f6f8148f6d1e21700a1961 py3k
+67203 cd08b00acd6a1ca539b02700c145675889b90c86 py3k
+67204 98628dc730dae770f418104f87b4b31c9a40d70f py3k
+67216 494bb96713917905ecced4d4396bd9bb13446fc7 release25-maint
+67217 059f116a28194f8836bd19d9cb77cc224e6bd2a7 release25-maint
+67224 c2772cbfe181e1f3a9b62abbe4a7c327244746b5 legacy-trunk
+67225 16600cace315dc2c1d72f340b87491b10e0634f4 legacy-trunk
+67226 0ad07078433a3879c5006306a25ed76596abbfc7 legacy-trunk
+67227 4c46323afab6f99cbe9f39286d8c95a9365707bd legacy-trunk
+67228 dbe4b16f804ba7bd11153a91a4b56eb07155159c release25-maint
+67229 420a5e83e02e7b4c175ea7668d623d49face9e43 release26-maint
+67232 c707da3435578cdba5026b5301cd35ca4a3e88b8 py3k
+67234 e74dd5418a33fb000b9338a9a35c4dd6e002db34 legacy-trunk
+67235 b428e8f6b1434623f6e1dffe843444ad402250e1 release26-maint
+67236 7de1b2ad380485d0e97298c6cb49c22ca82a478d release25-maint
+67237 b0fcb17f7efa81526d68700d4a74dcaa89ed941d py3k
+67241 1e44ea516e0e70c5ca52d3c3b518c5028fb6f83e py3k
+67242 620a34dc10f906637cec506cfca90b85d5ff15ca py3k
+67243 7559a32cc30ef96054e0acdd89822b069d795277 legacy-trunk
+67244 674ef4a7cd730175f583b7c370486c11e0efed2d py3k
+67245 4b32199a8afec5785dd6c9eb7b960d2c380de7e3 legacy-trunk
+67246 08135a1f3f5d8850dc55d83e36f7979dccb2da66 legacy-trunk
+67247 73b9fe1c53973d3eff37a688db921a4045460d98 release26-maint
+67248 356c3e18da5e848a9f9922b6707d73df7d63dd4b py3k
+67249 a5e41a7949544379afe7b132e519c9b18ce9c617 py3k
+67250 fc46abf170fdd8d75cd9c6b996341b1bd5f3b0de release24-maint
+67251 936a6e60f3eb7a3be47fbac2695ba46fc0d50e51 release25-maint
+67252 f39acebce628be1f98c9108b362a7e16f1374ce9 release24-maint
+67253 ed0dac26b396da3fb776449a0e56eccc43e49871 py3k
+67256 e2d2a7a6e8315dc8267b36c48ef71c0de42eba5f py3k
+67266 ea6ee2820753bcefee52db790601f08e6f395cbb legacy-trunk
+67267 d6e67989ff51497362fe3fdb7de8daf9b0f7bb0c release26-maint
+67268 c6d16b2a8efa4d5626adae8e16149162e792ea0f release25-maint
+67269 ce6923545e5ec3a6390d6624add84a6040a97af6 py3k
+67270 6d6e38cff2440e2f9ffd46e1ee25501d60928602 release24-maint
+67271 0c0bb104ec4b7a7f6bdb9992c57863bbe8d6a0fe py3k
+67277 2d9b173dc3a2eb7a806e51b33c9ca95cfae837b2 legacy-trunk
+67278 153fed7c7b60b90d5e94663892c9efefcc810410 legacy-trunk
+67279 71a50e675fa1e448aef8b6df2e5b43540a1e79c0 legacy-trunk
+67280 7bb204612fc676bbc7efe0ea634aa49859ab05a6 release26-maint
+67281 8b9bda5b8d4a9d1ba3a7a29ba3eff7bbd5048deb py3k
+67282 7238950d5c6040077da715d81d5b741c63c2c738 release26-maint
+67283 bf6a5be827b4c2e6d0ca9cb6709e7080582e486a legacy-trunk
+67284 1f7b6c40c99089a665b19f17936d37bccb0998c2 release26-maint
+67285 a9376adc284ce790c10328b36a704ed6cac96922 py3k
+67286 0722d71afa2f286ee451f4291379d210393d2a94 py3k
+67287 a44ce5556a7fc6302793491aa1adffae933b4ea6 legacy-trunk
+67288 f04df10e205011e8bcb4cb6125ea8d4562908073 release26-maint
+67289 ffae5837851cb4aab2bc4c7d28d0429301dfe24d legacy-trunk
+67290 1e7d322274c83ec77c9f43816ee2d08ce1f58541 py3k
+67291 7b18799e9519458294b97a4eb16cf81de58b72d9 legacy-trunk
+67292 fdc9339519646f5cb3aab900aab327d843fabe31 py3k
+67293 cacc018fa341ab5c5796d5eff62bfdd92ad00b6f release26-maint
+67294 088fdadf9609d193eb10f8a40f09b50df901ff9c py3k
+67295 a290a51ff8e27d72b8d1f1fb30b9aec762639b2f legacy-trunk
+67298 2da3fcd4935f154f94186b35c1e918023e13bfe0 py3k
+67299 2ca964d724d5ff9a1674674519b3436d3801c1fb py3k
+67300 841369f37334861e903fff37ace9f1bc17b8159f py3k
+67301 cb8039d82af3f140f96ca13219c0a6f1cf2ab8fa legacy-trunk
+67302 24645870779ab8cca37eab968ad411245e72c3eb legacy-trunk
+67303 f41cb206d061ed1358678e400c198fc699f20fd1 legacy-trunk
+67304 88ff45e58e94b6ba6552d88df2761cc66e24eaf7 py3k
+67305 dc1db46d0a44b9b9a3f68b4600dc01f7cab5379f py3k
+67306 5ffd67df8c9f0819860ca0b5f238efd5e690db46 py3k
+67307 eade47dfc1e47047865d5cae1c4b5f8843771d70 legacy-trunk
+67308 f95ff96fd792f2f1de31e8b49d771865c807a866 py3k
+67309 bac040b5ef22a42445e648d8e96614cdf2ae3602 py3k
+67310 54e5d853b0dec7e74ef312683afc1f0507564f6b py3k
+67311 159a11b1d24450a4a51a41e8789364692655d237 py3k
+67312 e83a60c69d53f5551a306e77a6d38e9b11485496 py3k
+67313 34fb666ff52f4134f32eea68595ae6d6bc38b00c py3k
+67314 7aaa3affecc1532e1104bc17f1d859b951573abb py3k
+67316 34bc2279dc56dfdab1da3276a53c261f98a5a204 py3k
+67317 eda467d65b65efb211c3e447538c118261b1e596 py3k
+67318 2327dd68421ccffc00538b7df7f07d87dc76f882 legacy-trunk
+67319 3250fb71a9e08c06a86eabf2b150aab9d3bda529 release26-maint
+67320 b64d053afd84da9140293ca85679d01c826d8ac4 legacy-trunk
+67321 0bcafa64eccb44357dacab357e554aac7a9b78d0 release26-maint
+67322 f403d94157b210dcd938d2c633ea44c11df6b606 py3k
+67323 7846fe495212900d6134a87ea44bb8c1d1fd617c py3k
+67324 0eb5add3160a249090137ecb21caccd8af130ac1 py3k
+67325 6aef28ebbd6c1174b86fd850a7e2d62b77c69fd9 py3k
+67326 dc4acf7532962d3c9b89ec409eedf9c2267f63f9 legacy-trunk
+67327 b180b271a7b2b44fd76f42dc0ee1a64edfa1fb50 py3k
+67328 31d88fffb98a104a48349823639bc1c3bf28312f py3k
+67329 8f0a175f04beaad5d40990266753fd639cf07055 py3k
+67330 3f2ddb3dd147a5b327266609f8a8a2c844fd08dd legacy-trunk
+67331 2d8c1ea7f8b7ec45d8b928122cb10a3081e01ade py3k
+67332 5e2007fa3cf82c6c4c4d0d494fa2b2263f9d0b32 legacy-trunk
+67333 a0f4d45fd44cf6f1879c9522188b92587a2d3841 py3k
+67334 a4220c92f7ccf4330166ce6ae0537ec008320197 py3k
+67335 2d97069012417175a30815b51ef007c779fb68db py3k
+67336 789a3ab0ae9ea7f9794ad810e78415335392f4f4 legacy-trunk
+67337 c009f00a450fda774b1982b5d276d10335d62391 py3k
+67338 b6a82459920cef0a202927c315d5e2ecc6a659e6 py3k
+67340 13321cb2d7520312f8d522381e097a70a1208269 py3k
+67341 030a15369eac77cb3bc268c8bae1ad3c0e63766d py3k
+67342 5f70706a8e6718f1c222e0b24d10972f39b6322b legacy-trunk
+67343 5fecd1e953249790d3bc9632e68f012f726589e1 legacy-trunk
+67344 5d9be65e7891f7204539d450666a53bcb5663d0a release26-maint
+67345 630c174b465e98169c428e9fe359e6587b7054e4 py3k
+67346 7c2b1b52f13428f9561cd1e1566106adafdafbd7 py3k
+67347 93d2dd641b7019434c9cb1f2c108e4abcb79a4a0 py3k
+67348 8a3eac7f9cd6497eb35de77b34f694ba160d5fe6 legacy-trunk
+67349 53a127aea56e93597316eddacf76fa833c5e3133 legacy-trunk
+67350 c9d0d4da9ac97dc697ecd5f03ffb8231cef26cd0 py3k
+67351 7bbca27d3559e27ed86d580eb859a5d04f2fcf77 release26-maint
+67352 75e9920351f25e13d1a2568026c7e5d963e2112f release26-maint
+67353 e704eedd77dcde7a3314c5df5ebfbca8fdcb249f legacy-trunk
+67354 d7303abcf069282bf24eef7417c4279b360ef286 py3k
+67355 ca673bbde1a3d81a5b44a2d0f97e05c3cec1ec4c legacy-trunk
+67359 2416503a3078b5df1cfe81602ea7085a16516e19 legacy-trunk
+67361 f1bb241bad24bbf062628786f52addadb36727f2 py3k
+67362 4eab340160e0a22cffaf391254bdeaab8c27859d legacy-trunk
+67363 1e919d34c9825161b849102b473d8c0076ec2440 release26-maint
+67364 9feaa6a1bf2c22bae31a74ef86f62d3168da4ec1 legacy-trunk
+67365 751a8efc5d4662aa92f73318296136d437da907a legacy-trunk
+67366 99598a61cc35fd7af22e82415e9dae5f4fb867e6 release26-maint
+67367 c3f49adac2fe67e16b0cfe6f4192ae004f39fab3 legacy-trunk
+67368 06fb643f6553c4f4b36f38d8f37311d4856ed8cc legacy-trunk
+67369 e49760909d2ba506bd930b740619777aed79ac69 py3k
+67370 b71cc003ef9f8a5150be86b8cc3b86d367d1b7f9 legacy-trunk
+67372 d66686eb11f631a7f4d4516e2db85442512ef1e6 py3k
+67373 ffad6c0f252eb2080b2af66141a804851d18301c legacy-trunk
+67374 96f38e357194ec687fa44f0c2e8510601d9dd301 release26-maint
+67375 40b7277e665f01452e9bce969676c4072d4ed68e py3k
+67376 0d10d5ab28440a94b418d523790ecf7a1de3d008 legacy-trunk
+67377 f37bf55db416ca3cc0de8139d96bde2f8c174914 py3k
+67378 6c0871f0c7a69d542ff51102dd191cef5cc7625a py3k
+67380 dfeda0d3d636d40173a71cda3c02330558460067 py3k
+67381 4cf03e14200c89d054d285bce958feaf26855a13 py3k
+67382 efb49df0d899df9d2a29f66051cabc7ce506c839 py3k
+67383 3528b5c16938799b895c337b236da87be858bcf2 py3k
+67385 30d01a5f517ed7be5129377c22e639ef8e0fe99d py3k
+67388 2d3f1d0c2a10ecd57aa883813e57e243941c3bb9 release25-maint
+67391 d37b4fe513287541de5b8975ca89767a94185e9f py3k
+67393 9fd9cd852631ad6f3137773ac127a669fb2d5d29 py3k
+67394 68f3beb7eeadf1b0019591f421e84e3d31f78ea7 py3k
+67395 73895eada8bd1b22326f7a920753e94db6c010c7 py3k
+67396 a0cbe40dac8f3f475cb7cea90f6944238a327395 legacy-trunk
+67397 5684ce96e639f7ee098f33c0ed4ffef46bdc2da9 release26-maint
+67398 85b1de855a13fa4aff20562ad8601995aca69421 legacy-trunk
+67401 deb30669c355c28a1a5b8aa5667be7889b824a3e py3k
+67402 797bd333ef6ba22e9f3ae8f09efcb1e8321694d8 py3k
+67406 a3a5f6404ad5ba3ce13cf6f3dcfa524944d94869 py3k
+67407 5cbc3dd4491610853d3189193c269365b5759a55 legacy-trunk
+67408 0a994b32de9fe51620b471ad47fd8657bbac4f1f release26-maint
+67409 f8044b8ff6eeebbafbced05795898f5561c11abe py3k
+67410 8b14fc5e5f3f5d39c3472fd1b2a9b488a36c2f9f py3k
+67411 397fbd6c3471a31002ce102208a1a786c30d49d9 legacy-trunk
+67412 c546497b421a1a2c5634e115ff86fbd8ebe53007 release26-maint
+67413 b58a435002c111d9381e848fb2bd0418f5f6bdc3 release26-maint
+67414 fcae14bcea7323785bec310760b034b1c9ff8750 legacy-trunk
+67415 381c62819f2ec82978acc912b035690786f61b7d release26-maint
+67416 c51262ad5603de972add79d5beb935e1a0145994 py3k
+67417 3803b6c4ff8f320105067d254f8938f093497b20 py3k
+67418 06e6c39ad8024f87f9a8a6442bf8d632c33dd0d5 py3k
+67419 cc9efb9f8e57d84d0709eb541938c83af0c41c63 legacy-trunk
+67420 bf2d19293db77ca3a0aaa0fc2c117a5b0d7e267b release26-maint
+67421 a90352e59ce61d32f432d4e9c844832c46f35f94 py3k
+67422 18aa728e952d511f92b1167a979ed22300e4a405 py3k
+67423 0b3b44b8c7826257a2781fbb9568edbdbe8f73c5 legacy-trunk
+67424 46b5cf3cade4af75c65ecfe121c07e4eb7d8a873 legacy-trunk
+67425 0fcfe18ff8f6d57068aa4b73ed89bbe1e1719b88 py3k
+67428 c8aed9a36ecb7f98c480789d38f375e3adde4b00 legacy-trunk
+67429 8d329d2a364ab525cb9cf2c91120c601422960d9 py3k
+67430 0607c97a8124b4e3851f8f4a4912164d77262cc4 release26-maint
+67432 23b4348fdf52ff6ece059ec7d1b0d0f58cddb583 legacy-trunk
+67436 560b2f52952c87c4c82d7c192fc2bf358386222b py3k
+67440 05c12f6d140409c109981d77d98de882ded5dcc0 legacy-trunk
+67441 cc294fc90f6c4dced919bda4dcbe2264b57381dd legacy-trunk
+67442 ef0c5ca454412344c96a6c2028b075b2c3e50012 legacy-trunk
+67443 8037fa7ace9eec3c90b828c1506dd1e858da6eb4 py3k
+67444 e29f66fdb42c20f9a7e3d326461e68a3bd52995a legacy-trunk
+67445 f9aa87eb334c1edc463a9ecb7a153123a8b770d8 legacy-trunk
+67446 3569f7b090256e0aa0ecf7e3a14899674d18a29a py3k
+67447 277a8f2944b4235aeecd4d715fc324b9a0809ac9 tlee-ast-optimize
+67448 bef3c85a908d4cddd0b1afd6106556b822685b77 py3k
+67449 a1de91ad92882ddb7b29de4bc8eb3da9fda4ecde legacy-trunk
+67450 7fdf936b30bf6f2cadcbe3c5f42158226d3122e9 release26-maint
+67451 3bf18be7ce5a5b48427ae64e1b98e944282d241c py3k
+67452 f1ebbc186c112763deea16127df7ced709924e9e release25-maint
+67453 942b4a2c2c13be9af59669f88f7ba45ef41401fd release24-maint
+67454 39a56d355376aaff492e5f19ff635cf41565c70a legacy-trunk
+67455 3712d1f6bfd55b5a5998bc049ee60d32270b7ba8 legacy-trunk
+67456 b962d04bb7f0334aed1df8a6cce1cb6c4b74e9fd release26-maint
+67457 7ed38aa10de6a52e6864681b334eda33b704f6c9 legacy-trunk
+67458 189def06253c6a7a97285bd47e95747b5a74ad2d legacy-trunk
+67459 01f6ea7f7a7581f4a494fc9f6ae88da8452b03fc release26-maint
+67460 75a8caa241865959e5b65ff37e2d5a96f391ea28 py3k
+67461 ed8adfef26c65b3a886c83b0bd34a62678881f67 py3k
+67462 6e891353ce9658ebebd3f67e790c29ac432fab0f py3k
+67463 681733b49fa2398af8fb81f98cb3e161eb6b54c1 legacy-trunk
+67464 60e775eaaaeee8a8eec6f1c5c697231cbe0f912b py3k
+67465 3e5995f6ab8f6a6c44ee8eb4ba87290116669df3 py3k
+67466 ab12d716a7a81ed4a04ba67030393c7737400c5b release26-maint
+67467 7f8f71dc86c74095c6a91a41e3f7623f3f18e877 legacy-trunk
+67468 0732d13ed0678ad8565b8e904002942db80341b8 py3k
+67469 0f7725e19bc3b93f3281864250fbf56280810190 py3k
+67470 4461f18f2643c8fc99f102b41e1790718d95118e py3k
+67471 b1d2af52d801534a8bd82be9744bddae344fdffd py3k
+67472 ed8476d7f64a5d61651810642d7a4b344eca36cd py3k
+67473 09c2d15e4d1db62c99fa13551fd57e70bc417ffa release26-maint
+67474 c182e3b9e9fc3abdfd50da5b6fc5ba7f7ddcd68a py3k
+67475 40ec6d289552e7f339cdf077f597335e7270d706 py3k
+67476 6a121f04bc7df6a249fa99936038b1e7bf0a512f py3k
+67477 d172dd8d9e09ebd88f51481ec7d85903ab779ef7 py3k
+67478 86ee2e0d4d41549550703fb4c7f02ab67e411e53 py3k
+67479 78b0c8de3a98838213381e06546b04ca149c3884 py3k
+67480 9c81c3b7111952f14ea28eb321061e2a424d99f5 py3k
+67481 cdda2093f6f5308b62bd2963495d12b699153524 py3k
+67482 cc5a95f0f56a534f5fb430e9080b727fd73425d5 py3k
+67483 c826e462fa51f53f215dfbf6615a2eeb7db80a3f release26-maint
+67484 5d4dfeedd512b31944308dcc69fff414123005e1 legacy-trunk
+67485 04526a222caf243b354a550d13d108f698e53899 py3k
+67487 cf47f7c7ddb326e068a9468bc4a7187a06cfb857 py3k
+67488 d1de302e6efc5386168116721f5ecb3d1ecda298 py3k
+67489 81ca7bb8804f02c58cb99e3c6192143c39aa08fc py3k
+67490 137b50ee96d5c1ad180ae640697a9cd4a3d4bafb py3k
+67491 54feac3d116906497436c57c7b88782345667e98 py3k
+67492 f447a1de2fae9b0332f9703554d2db304732942e py3k
+67493 845305a3da363ebbd8ffc33a22497cea16e6a31f py3k
+67494 3344804f327d6e5b5e1e2efa3ee07961a8a06b6b legacy-trunk
+67495 6a4cc6ba1c16aecbb2e9fee13fd1f8a3a8941fc2 py3k
+67496 a3d0299b4b1dafbaa89f758fcd34c5485eb47e5f py3k
+67497 c6a4a2cc56126a39745ee7df8072ae09127f4a4f py3k
+67498 588a95ef797176a5578cc341329dabd7ab41ce4e legacy-trunk
+67499 107d453179be2ede7e78f7aa8678c22c6205bd43 release30-maint
+67500 5235dcda9076f25a9cdcc726a9b3ac394791abdb py3k
+67501 2a5ec060bb99819b6d5d5e51b60d8dba97b4a61c release30-maint
+67502 59adfe43698dc848d8311527c0de3444be6fda90 release30-maint
+67503 a653214602707bde0e51064d7c7789ce295e4432 release30-maint
+67504 9807b79a162e6ffb0ba42e2c69584847a6a7e3c2 release30-maint
+67505 589c88b20b5b7e00779101c17d1491a33a8fb9c5 release30-maint
+67506 68a6e3ac41c18c8a190ada3aa17644b610de2c57 release30-maint
+67507 9a2b063870a3091f23019f7bccc9d45a6413db46 py3k
+67508 75b8ee062b0d4fc917b137393a289a0f548c1cd6 py3k
+67511 878d40468c4e7d2d1293fab6a6965af21b14f929 legacy-trunk
+67512 e07a322ef5934ce35b49699e3938e21fd3126313 release30-maint
+67515 cabf303e787aa5cd7209b40e3b2caba3ee75c5a5 release26-maint
+67516 c9da85c19719b9546da7bf6e63caf1c05cd6491e release26-maint
+67517 531457cfa3e243e1fd30854956e5564a581556bb py3k
+67518 71aca853b24421066fd4947037a0bf35180ca3af release30-maint
+67519 e793fc3c8abe95e3198f8491c549cbebfe514ec9 py3k
+67521 f3c485e2b4513665783db919b994b18ea3c0bd3d legacy-trunk
+67522 48f29d894b3cc7afbaeb4af5113081a764be2329 py3k
+67523 42560374ab251abad3473e3d0d2852183e377348 py3k
+67524 07efce107aaef2e9d4ecb91ed2206c186948b58c release30-maint
+67525 856fc3ea2ddb87397bcc4a3886fc20138c859f03 py3k
+67526 75207a0a9e158450e059975b012bb7fd2f631b1f py3k
+67527 458d7bc1295091979adb68284ea11af615859e1b py3k
+67528 e8ab27582b1843f182a047a456e2e1c99cf643c1 legacy-trunk
+67529 3e650032a5d1cbb1221442b9cfd12a728d49c0ac py3k
+67530 c115ad58eadfe9a0fbd8b69638c2e132c90102fe py3k
+67531 f6e53c30ae96c5bc1d34a09405f04fc90a396260 legacy-trunk
+67532 231680244c17b3230c5c0a938cd7e7c63eba3e12 legacy-trunk
+67533 74bfeb364a23b37fdb39d610b1a065ac9986fa02 release26-maint
+67534 103c68cc29e5e2f64bb29f55499a87cacbe441ad py3k
+67535 89e738c792c0bc8dc161efdcc96d8cb653df16ac release30-maint
+67536 4790b31d925777f2f1c6683f564b3b1a9541b762 legacy-trunk
+67537 9f8e51fdcea0fbc66bcb8d81dbd1851b0d982765 legacy-trunk
+67538 cd5f56a81cce1d165e3dfbc5b8a60c8090d0a964 legacy-trunk
+67539 3eca5a73651610aa931e3ade8b7a73df77eb0b25 py3k
+67540 27ba0995775143eba9145ad8577b2f19142e0fc7 release30-maint
+67541 6929563dad003d651f60e3ea1c968274c4d6ca3f py3k
+67542 678607ce122fa8777c04cd25f087785e391072bd release30-maint
+67543 589cde614b5bfe4bc61d6b055c6c5214c7ebc661 legacy-trunk
+67544 ded99e4f6b3dbc10525e860317bf8e004c0d2580 py3k
+67545 a9d0067cbea46375cf232fbb6bc60eef99ceb431 py3k
+67547 54c19a1bbabd9e5ec995e083707d2c5d3ca92941 release26-maint
+67548 4e13b37b3723b92173d8088c48338e771cd7a732 py3k
+67549 9bb86f7fb944795af9f93fc1105b8b8b8ec7977b py3k
+67550 8dd356b14b0d7d56e128337717401379bc9b9d99 py3k
+67551 729db9464ef688aa33ba2c79cd6b1928ea5728ca py3k
+67552 bdb02ead759b9783c6af2dbce0e652889fc66fe4 py3k
+67553 85190ff224e0c471a6a162badc93c7561d00dbad legacy-trunk
+67554 c319d2474f57e0fcc8fe58baf0212f43e3c31170 legacy-trunk
+67555 27946f1eb8fa577ebe28f476d4cbe01946fa5b60 py3k
+67556 a0cea01ece53ce6eaff63a917355e0562e4048b9 legacy-trunk
+67557 7659841d2714ded0dcfff92a539267e4c4724022 legacy-trunk
+67559 86d8a522f44073d121136422a464e8d64e8ddd3e py3k
+67560 b47b7d9c593606a7a0a1ce60850737e7161c0f12 release30-maint
+67561 89bc31e064890bf8a5c9ea585b2855c6c1b4f042 release26-maint
+67562 01371897cb190035d56bbf4e63d21b7bce50c74c release26-maint
+67563 5ef8b5a74efa21cdb9da587a5a04750ca12e943d release26-maint
+67564 859f550b4003aca1d26fd4e7b87ba408c0de4fc6 release26-maint
+67565 3c7eef187bea34daad1ffa33d1ec38b41582ba1a release26-maint
+67566 f08d1448b90ff5d6c08530fe90e98c8fb63ea86f release26-maint
+67567 6e51fe1b7ed9ea542fa2ce6ae6b39104bc3886ec release26-maint
+67568 a172eaa4d5ec104953d0c1d3dba0adce3762251a release26-maint
+67569 11bf59fe10b924107b7da52ecf5262830a43e199 release26-maint
+67570 2e26e8219aa420c54eb5b040f1103af5d7d76fc3 release26-maint
+67571 3636fe95732c137a314b97fff1a6e2fbc99e2059 legacy-trunk
+67572 20ab2260dc93bc072db47daa942697051391ae32 legacy-trunk
+67573 c434b771477bfa1b6478f1b394cc4538b54134f3 release26-maint
+67574 b38eab8c9904da7f2bdf716bcb014b52f784cf7f legacy-trunk
+67575 20cd8cf61373d9357d3eef9d364d8e773f50ec84 legacy-trunk
+67576 c49d6d7c181e1f2f4b9cd6eebb9d4d7f73b5589c legacy-trunk
+67578 100e4160adfba29f3bc0292b4060fce01cbcd7d9 py3k
+67579 94b4f88e5f6be4445b5e4cdd08410c766504c1e4 legacy-trunk
+67580 007964809803ff3cd7ef0fa5e928d167b03219f1 legacy-trunk
+67581 92cb6e5eb43ce61f258a0e03c98267079dfc3de0 legacy-trunk
+67583 a3ab95345b52b24c2a975edd30b582461568729b legacy-trunk
+67584 05504582ced67ed3f28024d9b66c69bbf254cfcf legacy-trunk
+67585 c06183b2d06f490434deedd972517ae4ba33c6f6 py3k
+67586 098dbd9731477c5c646b1f92e5c6d7b83e70d905 py3k
+67587 ff2263de0d6f4ab5bbc956acaa81d6ae6a51e308 legacy-trunk
+67588 7a92a164fc12f3c4dd0007774252b6eac6f4259d py3k
+67589 de3094bb1421d7d67b7f1e04cbc0f497ff80e044 release30-maint
+67590 57b5c4639a5d23f4ecf5ec143f47db86ec7f61ad legacy-trunk
+67591 c0301b5430d524b33c3444328f75f830e6331ae3 legacy-trunk
+67592 20a1ccaddcaeee77608af6ba50f028ac7fcd114f release26-maint
+67593 bbb101a5f8ccde5dec57d53902b9bfc849e19bd9 py3k
+67594 651dfb3405d218f4bc16040b2d06d9f13dca0ff5 py3k
+67595 624b9eaedb80f09aacbbfaa873890642d156bd9f py3k
+67596 25f222befec4bdaeeb3a5bc95f50a89fc4abcd58 py3k
+67597 7f0820d7329937a5043973163d5aee7622498fe8 legacy-trunk
+67600 4c9844cf2a3f784e03ba21a5621523dec33c5739 release30-maint
+67601 1f2a3b13e86d7c4ba87073e018e60cfd4753fb2e legacy-trunk
+67602 aba2ce163b718d11aa3cc78b0762c08653542c92 release30-maint
+67603 b01da26c4bf9400d7e110144ef178bf968fa6658 py3k
+67605 8323f2df56174746da4a54cc6ac6533bbe318a77 py3k
+67606 2c78f815e192abff6e142357f0433a87b1606a4c py3k
+67607 ac42a8f75f925b76b97f9be0b5ab774bbbf80e72 py3k
+67608 a9068203afd5c003a40e55481862c8028086f07e legacy-trunk
+67609 7c3af3200e34b725771bac75053463544b6594c3 py3k
+67610 67ce745a747a88441644d663ca96f88889e3e44c py3k
+67611 ba8fe3a40a5bf73d45324642bd3f556c68af7100 py3k
+67612 61963541cbf5bd9fbf752a2661895f81fc4170b1 py3k
+67613 e0073b7650cc3cae9b711cca1c055a3f4cc56eed release26-maint
+67614 dd5e1a042dba4fba3c940f755aa2f7af9366ba96 legacy-trunk
+67615 0be10391347b9cdd0efec572adaf66d94196c6d2 release30-maint
+67616 b12d6f606618abfefda457bcccdf9ef7c69b9459 py3k
+67617 ce36388727a78b744e23dc7355e313e7ee9c3ddc py3k
+67618 52ad8a72472e8466cc36e57175cb15edd7d6d426 py3k
+67619 1348dc244ca34b7b651b7912fd66da3251086358 legacy-trunk
+67620 3de720cd1766a52e3accb0baefa2db31c00b6af0 py3k
+67622 6dab258752c18b04a87c62b5b88c9ed9ff1718bc release26-maint
+67623 1693fd94d829d1f107771c34d893b111f8b85f61 release30-maint
+67624 4b9ad3e7483e35d018b6c351ab3c3475735af250 release30-maint
+67625 eff4aab9584795a110b22d9220c877424bcd77b7 release30-maint
+67626 e9f93e2f8fbca8ff9854f20677cc179473cb78fd release30-maint
+67627 b14f587f510e698201ad0001532239bc832edabe release30-maint
+67628 0fe49aec257cba4eb54bd036178fa205910c256f legacy-trunk
+67629 6aa0985abba8c684ec60951139c85983cb34da12 release26-maint
+67631 7874377142f64c1ad3b4f075449027cb5940baee legacy-trunk
+67632 5d0e93f0398a3cf4c0fad4f932dd327ed49f4bcd py3k
+67633 ae98681058b247ca30b5b4a45d543ff68e1756ff release26-maint
+67634 eec9252b3d4548018babd1927320a669542b0db4 release26-maint
+67635 dabed69d8a2ab2cd28a728a8dad4176aaabf95fe py3k
+67636 170a9768e7aeef94fe838dba5db89b8ed52729ad py3k
+67637 15807e262ebf0fa58d39a100147e66cea27f0cfe py3k
+67638 b8be9d1f0d455d38a68b72f69d95f5828e1c18f7 py3k
+67639 21a7e8c11707262d112c85fcb08b1f6184fdec1a py3k
+67640 0d3debcb8d44914704d33cdd4e7a8ee2ff0d8a03 py3k
+67641 60ee901b735298e82aab832d3d280dd16e029b4d py3k
+67642 024a9897c6510acd66f03bea83d5ab6e6907fb23 py3k
+67643 92c73483c1f7a5c208f62c3b5b4b5f0b3deb3237 release30-maint
+67644 c7abfab4dcdb989ec525ecd3ca8fe2febda6b908 release30-maint
+67645 91700d2121c82d3a855210d73ebe94db791c5826 release30-maint
+67646 63ee6a0f73589954c70ec91b06ebf9a435f8b7c4 release30-maint
+67647 a86cdf49b82144623d3c4edc05298fd785ff3949 release30-maint
+67648 009b466cc6ca9452a8e4f6f72514db70799a7d5f release30-maint
+67649 e07bc379898125ef0a523baae04a46405edcc2a0 release30-maint
+67650 820c112cc2a865f7fbcc69359b2c11f8c0f47cde py3k
+67651 725192c64c284929708a488e5927a1be51dc485f release30-maint
+67653 c8aa3154db0e362c843eb8e628a54c16f34bee00 py3k
+67654 a9e30250ed2067ffe9a2b7364e2358ee357ac859 legacy-trunk
+67655 9e11c92da476ced5c8739f3a2108c3ac315a793b py3k
+67658 f4b16c02d1f59e63de586ce0fe8b993a0a98e8dc legacy-trunk
+67659 dca57cb0c2001b0e3e9305cfe178debffaba0e49 legacy-trunk
+67660 99dd0d00725a595f9dde5d2c9631f6fc74cf9876 release26-maint
+67661 dcac885d00f1da9af82b0c7b6890653caa6b8d38 py3k
+67662 463bfa07308100a1986611df943409e42690fb4f py3k
+67663 8b9d08dc850048b3167452ed5d82f4a03040c4f5 py3k-issue1717
+67664 26a09d38664a01cf5765aed2cf402958892b5201 py3k-issue1717
+67665 d040c435ade8c98ddf4c5f42dc2d8e98094f5b31 py3k-issue1717
+67666 dc696deb2cf26da24098d9640ec7e9cd79dafc57 legacy-trunk
+67667 83d642a3439b3e99d7fd2892534f70328591f40d release30-maint
+67668 3dac9928194b7ab42d131f1545b23456b5ffde6a py3k-issue1717
+67669 093e4fa50d84b64d72b28bd761e498087bcbaebd py3k-issue1717
+67670 05caf440ce8f00b197f903acac09da28f87c1d65 py3k-issue1717
+67671 38e61168454b256afae8fff1f97af97ee32d0367 py3k-issue1717
+67672 b79d1d76f195a71dbf363a364dd587b218b5572d py3k-issue1717
+67676 61cb6c4ab20db746d371471d4893eb2bfde881bd legacy-trunk
+67677 ad647716696c488de4b9f21a3547e491865459e6 legacy-trunk
+67680 d470b9a7e9e1896dc19d46bf0c10d4e32a7a8d70 py3k-issue1717
+67681 9fa0a65ece23a291ece090197f5065afe32098f4 legacy-trunk
+67682 40f75661554db8074065e91c9c4edc1acbd6ba14 py3k
+67683 d9e828e83d125def76235c3d98d5f73abef8df66 py3k
+67684 694d04ed2b43dac657abf5cce817ff35f0387a9f release25-maint
+67685 62c89cbfb511b8725169b35e41f4ac0cfd9b375e legacy-trunk
+67686 98abe9cde7ce7771b56f195a2e4d79d1de8a61f5 release25-maint
+67687 a6ddd94983ea3d38a1c1643bb129d07a5967dbd2 release25-maint
+67688 9a10d4404bd002cf534aa1f94cb729795ef2edb1 legacy-trunk
+67689 48239f6209b064dbe9e00bfb990b30bd75807558 py3k
+67690 26518d41a1868c495c473ba5111d456036d498dd release30-maint
+67691 59670b7b77a6b530775ddc7d430c8e9a6c4b460a release26-maint
+67692 4af5e2a609ab358fc900885be21494cc90a05d5e legacy-trunk
+67693 b089a5777d806e7173928d25a3ec281eafd5fba3 release25-maint
+67694 ae81975103b089c2a01ec8060f8d4d2adb6dca6b legacy-trunk
+67695 22aa7dd0ea81b918a6df67e74d6bf0e55c8a0fd8 py3k
+67696 2f8c317dff17e7f6a92a8132beb41705aefc617a release26-maint
+67697 abf815b80b5d557a053360b032e43dd10affb4e7 py3k
+67698 fb2456a36a83a8853e2e274a8f5d73ebbe6809e2 release30-maint
+67699 e35468bc4df411ddd3b8d7f2e375ba8f30b2f9e1 release25-maint
+67700 21de7a9146f74a0c78a33ece0a8cc9c050b4d10a release30-maint
+67701 01c023d9218ebd9936dc26a49b574d45fd0b51e1 release26-maint
+67702 71679756469e9019d2ea516d6724fd9a29913840 py3k
+67703 9c31a98744788bf6fea3a635817d8787f2151387 py3k
+67704 e4e0ff7ddc85ec1e1561976b9788eb5c15a1ffea release30-maint
+67707 0df0fdfc8e1b2c03b10e0e1c83fb99c60fbc9082 legacy-trunk
+67708 a2525154e44f240e90356ab2a313fb6bfa1d1685 py3k
+67709 776a6cafc21a348195931318e577ccc26f951942 release26-maint
+67710 20a84e06305257232ff786ef924bb03e01fae308 release30-maint
+67711 d91e6286276451bd7b2bc4c9baffb8e6a5637134 py3k
+67712 26e78942165e10fa66629003ab7cd0eaa0b8bde9 release30-maint
+67713 3e1c449d11e0eae002a2e1ea4cb30a3b18917f0f py3k
+67714 df6649951410ec83d8ecd26990ac18a2e433f439 release30-maint
+67715 300b95fa7b4d3f9b1d471740b473e18c614af8c1 py3k
+67717 b4552e2ffd5a418452d2c10c2588d8667df4f14f legacy-trunk
+67718 f9b95294ac8577a8461a9de1a62561eede5829b4 release26-maint
+67719 5855e3e0e85b149c6a811ff5a3f6989cdcdb808f py3k
+67720 fdec576611bdfa6375c252c23e07d9799dbb13f4 release30-maint
+67721 33a1e1008e540fbe66598089eb9818ce77182d2e release30-maint
+67722 eeef71dd3cce02f8c669589f1fd49903f346f9a7 release26-maint
+67724 4646c33531db303f9bba11390acde6464bf0f6c7 py3k
+67725 245e787b90fc10ea8fed80e389529306df31ec0f legacy-trunk
+67726 61d06409a660693b478a65163488aae0c2b11804 release24-maint
+67727 33cd0649185853eef7c0aaf1ec187e8da98c005b release24-maint
+67728 a6c3c715e2b70740c4b6b4f7dc6f47b16a7e5905 release24-maint
+67729 fb5f8aff23fd1ccc1e612ffa6318a584dc336fb6 release24-maint
+67731 0b7dcdb5ca3aac89e053b6792a41ba952639d60b release25-maint
+67732 2e21cea4367071c264925037c6a13792f8bb5b8b release25-maint
+67733 4d2422989981aebcfc6015a67121c03a76365435 release25-maint
+67734 9caa1e5dd82bdd02e5956ce2e35095d18c21443a release25-maint
+67735 1f1a117767740331e8b180e53031e43e8e33e6b4 release25-maint
+67736 8d902c513ba0f859f5742a2ee4aaedbceb320ec8 release25-maint
+67737 76f189ea5509f1b2497a5d5d86771e850e01175d release25-maint
+67738 3a332bf06da069efa787de47ba8cefadd025fa04 release25-maint
+67739 e6dbadab01d8a8501f85b032caf363d30b42c34f release25-maint
+67740 5f4f6b7da8cbca574febad93d4358fddba1ecab3 release25-maint
+67741 12dd2cf5e0c80026505a83d81673015574147340 release25-maint
+67742 9530d334d2624219e7ee1aecaf33532e910266bc release25-maint
+67743 58468fcde06e9bf53ba58d5c4f42e89e79b9a351 release25-maint
+67744 88c08a63cb741570cc25096cee91441f9ab63f03 release24-maint
+67745 6e80ec4130973de55f508738a09ac9fcb30d004c release25-maint
+67746 bb1d9ae802c3152d0e30b0df3f830950758f1f0c legacy-trunk
+67747 740ce9a523ffc4acc9112002bc99234d86cd43e3 py3k
+67748 a090aab575c6ef6c322d49476704e28dd45ef8eb legacy-trunk
+67749 9c428dc3d6fb7782e180574abb3b3657f2283ac4 py3k
+67750 b5efca304d2af91e1cd0e6e6fa9e110b0e07000d legacy-trunk
+67751 f20eb809535e91c0b14416cc5447357cfcbbe95c legacy-trunk
+67752 4264cf00a75c0fe2062ed84627f04e46f387818f release26-maint
+67753 dd1b8da01d02d18bd3df7c3cee227562887c883b py3k
+67754 252927a2f32d6fe0fd0ccf39c5c7392a7817b523 release30-maint
+67755 cc727239e51b164720fee6243d31656f6dbf1ee4 py3k
+67759 eb07009c86605811e6935abbfe981890860a74d3 py3k
+67760 18f96f6883af5d50927e6b97d463327ef002858a release30-maint
+67761 7033b28685a13bf455445a418c9b0c5b964005ac legacy-trunk
+67762 b095178c04928a346c02b8a47404704b782bb671 legacy-trunk
+67763 18bce2f2a7c56bad4cb364f6f1b0dc67cc761da9 py3k
+67764 d15746abf6c783c622afe4bd2399002dc5387c24 release26-maint
+67777 575f973ff24433e152e88a434c4c8a674524d250 legacy-trunk
+67779 72a7ac218ea3283cd1d4b13b8efd32f9bafab2d7 legacy-trunk
+67780 96ab08ed95a402ad7f9fbd6ada1c4217b098161d py3k
+67781 4db66c20ca68e5a18a2666d5dfa6d69d8750ba6b py3k
+67782 ea9c6026ae7ea2462cf3afceebb55857691b8001 py3k
+67783 ad982c26c3dd5f4d779a6591a9e746b7c5ce8647 py3k
+67784 e36be1ec72965c00e6b0a6fa07d308c7aa3ffe4f legacy-trunk
+67785 9e9fca94d2862168f140698fa7cb724107d676ad legacy-trunk
+67786 3336e4b77a0412eae87aa32fa3f0fc420feaf58a py3k
+67787 dc6f974fb7d4f832435d0619c35774f87f2755e0 legacy-trunk
+67788 1af2b8b0ad88cb9479cb47dabcadb5f526c728b6 legacy-trunk
+67789 dacaa1f4419d703c686586c2ad9e767e8e2e7653 py3k
+67790 ab51c1509bc04a46bf9a54329ca1cbdaa298bcf1 legacy-trunk
+67791 edd72437cec3f357b20eba0f40013f7e7e916d2b release26-maint
+67792 7dab88070bc7dfad08950704e292d7d215a7585b py3k
+67793 eb2876ae0476960fe47654e2e90f32b23217b593 release30-maint
+67794 20f15c0f21f88a9af885b7c05c2f080be73094b7 py3k
+67795 4805745d5599377bf8b9c35b6345c0cbcc54a8bc release30-maint
+67796 29968395f92053689580dba69bddaecabfd75c7a release26-maint
+67797 14cd588544fa1b1c9a3595b32b81a18e3faa61de legacy-trunk
+67798 d50dad2b275042adeaf309a956b3ae8b24700124 py3k
+67801 9541a2ecc4fbbcee4fc8e62867e4f8e80afad06f release26-maint
+67802 b7d9adc4c343796bae3c8780aab828ec8374b1e7 legacy-trunk
+67803 22ff9a46298755de587b596a9a4c7ce3341ba996 py3k
+67804 a175b19b4bf2ce98410e61f2799f2deaa7f47f69 release30-maint
+67806 8c424f116fb8d0ed75d7a9b2e4c26eb7fbc78c89 legacy-trunk
+67807 21d3357dcbec41fc6fe00c04985118ac890fb136 release26-maint
+67810 a43a6df18ba4bc689c2218dd04600171a2c8c76c py3k
+67811 aef0730df9ba327a8e15d372ae737dfb6ec42e6f release30-maint
+67813 68987e931193faf69d2babd10405706875428b3f release24-maint
+67814 07407de18394883e4fdd46cc9cf4d9d16dcaf451 py3k
+67815 d06b04c57b53618018f71bbead9509cbe0c35508 release30-maint
+67818 94e79d78dff0dfb5c53f49842c7df65ad5b79e66 legacy-trunk
+67822 f0db06f49a4e30e49666251f648ce95e709e1569 legacy-trunk
+67823 3366864814466000f78ad975b8c7debb8a238e67 py3k
+67824 92e21652f2f4d32dbbcf6c5ab39dd4bc0126dc27 py3k
+67825 cbbe258866487a4060edfa52c8d3960a1ac6542d release25-maint
+67832 fc9729c80b791a7cbce7a6b9c469aaca5228a884 legacy-trunk
+67834 189b462ee9d4f25bfc2d030b69184a0908d77224 py3k
+67839 2ee4653927f72f9bb3ff14b3083d4a203d684dfc py3k
+67840 daf6d3af40c4b939dd1dcf15a77795fcf6736f7c py3k
+67841 001a2515d57b0188a4ac45be9a8c6f4c7eaf24fe py3k
+67842 aebf7124dd322a8fb5594d46e9a651dbe5b6a91f release30-maint
+67843 82e6fe3707829f66f4d4fd0c8a35a03dc530dcba py3k
+67844 24b80b7978ec2194c4fc7e1100aa40b1afe11f73 legacy-trunk
+67845 56b7ebf12ea3adfd90324606e0db17ccf6948358 release26-maint
+67846 47ecbe2d3eefbc53c75bbc1a6ede73dce3494d96 py3k
+67847 bf20c384be5639aea050e802ace8413c0c8cbb3e release30-maint
+67848 6fa5f969efe647a23f8f2a1b4622fd55c32eb8fc legacy-trunk
+67849 5e83929f7eeb61d6e009bb1f467962381eed5efa legacy-trunk
+67850 9a1890982489e5469972400c6379f4b2919919f4 legacy-trunk
+67851 0db907a70723609ab1a8705da7f0b739f616de07 py3k
+67852 f3f1f1462c82536bb23796e70c85522144ee24db release24-maint
+67853 48f2737337956ee15e3910d783f2ef74249b0639 release24-maint
+67854 608856a7e568b86e5163ea6a87eb0167288bc668 release25-maint
+67855 3cc056d21c2f4435a534d23345bad9c0a9d9b3cb release25-maint
+67856 b56231224728abf2cb3eaa3b47afd7809f85db93 release25-maint
+67857 496dff47bc7ef6fc1a6e1742247599f2c9d8dbb3 legacy-trunk
+67858 9bdeb0be1dad4dc8b0f19d61c66df899e63e9dfd py3k
+67859 1c94e798c85b1a613948827a009c6abbc30cf4f8 legacy-trunk
+67860 428f6c4e8446210dc1395a6f01acce5d8b6568e7 py3k
+67861 d0282a292b0aa8c25251cce40c9d787d28f60cb3 release30-maint
+67862 9fb2a23eac435a2bd0d6f294a5bf05b9d48a63d7 legacy-trunk
+67863 0647948be840efd3be89ae088daa25a55e49a1bb legacy-trunk
+67864 670204cf23e2256d2bdcd42221f7a0ac4fcb56bf legacy-trunk
+67865 a765618c7e944f3e070a6524dffac8ee6a43a2e3 py3k
+67866 46279cebea9cf143ccb90c49373365ceae0a771f release24-maint
+67867 773af18608e3a62a409e933db4808f03bae0d1ee release25-maint
+67868 edb2eefb6856f6fb0f3119d58bd924489e011414 release26-maint
+67869 78fc096e5085298fd011a531d652de497b9f2325 py3k-issue1717
+67870 7fe72ae19ab290a34c48313db0e10eafa1ee6386 py3k-issue1717
+67871 45bea584694e350cf2b912415bdc681a5ad22162 py3k
+67872 ee9c9cc028ce1591957e7c8d71016e3d2bffeef5 py3k-issue1717
+67873 ad246cb4f662e211c4701fe3b9fdcb639c994080 release30-maint
+67874 6e3e582fe3f388ed8b027cab5e6ccb4d6e572aa7 py3k-issue1717
+67875 0c0b9abb58426dd8a67d80d46c597fbd4ff71bc8 py3k-issue1717
+67876 8bb9a854639b6905e039def83a3ba5a72dad111b py3k-issue1717
+67877 fb993f093cbf43bdd1c2bbc4d61753438abcfbc7 py3k-issue1717
+67878 a654f1e1be231fd33b890915ea536885bd7c7ca0 py3k-issue1717
+67879 0dca2b457775d4725dd48202f5f5f67da88f709d py3k-issue1717
+67880 589edf615adb7262df9ca3ba73fae5d317318a66 legacy-trunk
+67881 a7b357f9e8a48ead62ed61af9a8c58c6cf9e7297 py3k
+67882 c4fffa0972e368e0d73995bfc8698cf6a9cb33d8 legacy-trunk
+67884 1d961fe54a6f9d3c1941067a132726bff55e1dc3 py3k
+67885 f33dcf7e6e1c3ed945ebb9b9bb2c83f8177268a2 legacy-trunk
+67886 01b807537915651bc143bd10323715401c08a8e8 py3k
+67887 e87a2561188b5335231fd6ebabc7b32a1bff9b10 py3k
+67888 1adfabcbe07317fad5dffdadeeb560b0ad6bb814 release30-maint
+67889 3ab102d9cf5606a74968336c193b111b267ab0c3 legacy-trunk
+67890 af56e3f14eb74b30d3973d5bdce12207eb1487a1 legacy-trunk
+67891 5294b214e1be98e7979bbdf981353460c6f69bdf legacy-trunk
+67892 4fda4f545f790690133251356ad92d82b8534bbc legacy-trunk
+67893 11667610e9f56a73e8b687f099dee167a671f998 release26-maint
+67894 502f61d1fbaf4b51ec03deeb7985c5f8f153e928 py3k-issue1717
+67895 1bf727e2b08fde4e0cab86538016634819b20bf3 legacy-trunk
+67896 e4675113d10efa739c5d8ac32e32b4edba53e03f release26-maint
+67898 de7bbc4d0b1d1725f2292120e43797e44e693260 legacy-trunk
+67902 d79fdd8420f36ec85dbf642fab70d9aa0d239ca1 legacy-trunk
+67903 c3b97599d7a1974d1f2885e97d614815da037b18 py3k
+67904 03799bb44772283d810e621e39eeeeb9e38c07a2 legacy-trunk
+67905 bd3c5de4cc541bf09db5139a67e47757b50e2c2b legacy-trunk
+67906 241027b24b45d9430ac1e8191413154443b9d9f5 legacy-trunk
+67907 94c05466306e21f320623b01d0bf29f23ae95ae7 legacy-trunk
+67908 4bdecaa4ecab2b6c4561dc4e6656365976d743c1 legacy-trunk
+67909 3a259a1e1d9c5e091987a1ef9463e9d6ce50583f release26-maint
+67910 ac88b34320660b0d95e08827707a72801e5915fe py3k
+67911 3965314bb922c2765c57bc51010009de97a2b63d release30-maint
+67912 3132ed12ec1006c37bbc23edcf52bbf784c5c5e3 legacy-trunk
+67913 05e010515c4bc5710230dc46427595483a6cb52e release25-maint
+67914 0f9a7edb8e58c881e3d5650224503994e68d291c release25-maint
+67915 aa45a1773f6e0ce4a4787df5e2e5f846fdb144ee release25-maint
+67916 a0a6d9909312ad9c1d844af66e9c91931b93852a release25-maint
+67917 c74fd75187d904891e2047f77b54329ececf351a release25-maint
+67918 79295641fcf0be5d7c526f2fffc238f6afd1e45d legacy-trunk
+67920 8751288ddd961c6388abfb14519e3bbb4c4c7749 legacy-trunk
+67921 10097bd65564f0dbdcd0fd168e6deee2d69733e3 legacy-trunk
+67923 069d95deea9154e2a320510e94bb7f714c662468 legacy-trunk
+67924 efd4003ee8ea5aa34502760a7ea2960471029498 legacy-trunk
+67925 50279263801b5cfd24de8b9ea8429470e38aef58 py3k
+67926 f6cd1a7a31bb864775ba483e964dfd4c37e08740 legacy-trunk
+67927 112ba3df851d2ff6390ea2e4a81c181588eea4e2 legacy-trunk
+67929 0c852c116e235df05e1bdcbdae2505b5848bc24e py3k
+67930 92bc14e8b37e6ac3d45e08a4b0c9a56bb47edabd legacy-trunk
+67931 c3b43cb6703c62f6670cfbe56e8c1697494cf1dd py3k
+67932 f859d824369ea9fb05efedb28792c22308a78f1a legacy-trunk
+67933 adb9b547c7fe83a58f576ae45732184608c89e7f py3k
+67934 f6ae7cc9e2e85d776a14475eb10a8b75a44d9072 legacy-trunk
+67935 699fdd8217f3ba82d292ada021db21dded628dd0 legacy-trunk
+67936 d27024755593b8f79210c3b9bc3165ea86ef6f95 release26-maint
+67937 303ad45a967fc51ee7651409ed4a1676bdd6e372 py3k
+67938 665c4ac47073e73f89dd83201fd9d68bbac3c3c8 py3k
+67939 db50dc0061edeb3b5c062d01ce1739c74a9e2c2f py3k
+67940 2e53262c55ea67ecaea2de3abd27a6738d7e75f8 py3k
+67941 113751a8990c94872d9b7da75b1fa478f1499cc4 py3k
+67942 408a9ff4f8b2c81e36b6e3933512bd8fd7c9ec48 py3k
+67943 7b1d0cea98706482507dd0307a6b82e195ef3bee legacy-trunk
+67944 fb150fcf165d0fa63a2f34e17fc61f8a4b6b65a8 release26-maint
+67945 4bdf9e342291a64e5df9e78f3d3939405ac625ca py3k
+67946 94f996bc64b3bf8486f2b56713a249f87bab0efc legacy-trunk
+67947 fec72c9b271d89645254cb6b05e52910de941a79 py3k
+67948 ad7447a165bbfab5c0262fafd13b7950659230a0 py3k
+67949 1e1214410375aadee1ce630d4a9b96cff5e09cb3 py3k
+67950 d281ebf8ea30f46954c12a8c8bc6a4ea77797670 py3k
+67951 e673632e1885653c0fe6a4e11ce561ecd37e8e9d release26-maint
+67952 41d7d8f0852b28479cd5bea4dddd148898e87f2c legacy-trunk
+67953 e2bbbc06d92c8261ff3ac7ba5a9f550ae66247bc legacy-trunk
+67954 93da9f14e5b58bda5f2293333274340c5de65cab legacy-trunk
+67955 aff6e9dddd9f829d65e4ebf3bac963d1021e71ba legacy-trunk
+67956 3991f37ebca31ccc7713d6206eb8ed1c098584e1 py3k
+67957 75b4e32340a8ab10b1bcb605f5547c492fdece0e legacy-trunk
+67958 1b88932defdb28b4d799b2e78b7c9f1e4d31ebf1 legacy-trunk
+67959 bcdfdc369570850a23a7fb114fa5c41c786455f3 py3k
+67960 a28f9e750b64833efc93ebf699df62e1628d35fa legacy-trunk
+67961 e9a0de48b74784d0503714811586610d909cb935 legacy-trunk
+67962 02430e44d50ecdeebd1fae09daaed901591987fb py3k
+67963 fbfa1d6724de8c21a0200d6e0cf36b809ecf35a6 legacy-trunk
+67964 1efa1304dfb325095af251454dae3b3b63e734b6 py3k
+67965 a9e5ac4f091cd5dc3f67a8ae0a04d2cd905b1807 legacy-trunk
+67966 a649884c79a81468a6bb3bcc542430a0aba2406f py3k
+67967 cb3524b6407f6e38cef5957258dad70b8e792c42 legacy-trunk
+67968 ea87cc068c56f48a095959cf845df5b9b14dc521 py3k
+67969 8bfb466414ac9b574677401ec5f28114123a9803 py3k
+67970 027a6f3ac87477c5ec94366421419741cdf063af legacy-trunk
+67971 5ec3e3d54aa65af263804fe521557827549508a2 legacy-trunk
+67972 a4a89d3e41af59c4b54cea187a78b296cc72e039 py3k
+67973 db0ddce28d0f82734fa6d68940fdeb7fed359ac3 legacy-trunk
+67974 7a011680e151ba2e23e217f1c03128947e2a13d5 py3k
+67975 442078f079aa02511a7c24a88ce16e9c5b3dfba1 release30-maint
+67976 9db3d3d39cc3e7575a92bac1415de95882024d50 legacy-trunk
+67977 1e0d205fe8d70e5f9f1d6130ec630abafa795271 release26-maint
+67978 6a0566a512184bd5579fc43ce0dfd01870bbd391 legacy-trunk
+67979 341bf76eb6eb72b52865d434afcc6f2025e2d26b legacy-trunk
+67980 0ea4bd59a40d66c7135169b4e0b0668ff7771c5c legacy-trunk
+67981 e7720612a7969859092f335c5c4747f45833368b py3k
+67982 641d27903bc5749ae0f7b271fb957bff949f49e8 legacy-trunk
+67983 bded5bd60e954da6535cb2a26544c95b14e62598 py3k
+67985 7c7624a33f8b323344b9104aaba939278a406e28 legacy-trunk
+67986 375543b982446029ed3c74d9df99a3f25660f305 py3k-issue1717
+67987 73dcb8b421f80d195c6a2783300ace9cd51ece43 release26-maint
+67988 2f15d59dfb80488018abe9b3de31237ccd708092 legacy-trunk
+67989 457ec884af045c35e9d69e91c4076efc8973098b release26-maint
+67990 e2ebac062432213ce42f8512cb75c9b37f412fe5 legacy-trunk
+67995 6fb7d8f4273f2b0750211a27db2a0fc54bbc0c7f legacy-trunk
+68006 2ad68dd0ac90f7a42974b6d245e981cd5bbd51da legacy-trunk
+68007 87f5432b9edc8d9a51e7200ee6a7ddf1a391cc6d release26-maint
+68008 b95dde95996a9b3a147dbbdcac24b45eefcb0b54 py3k
+68009 87f86cce43b1535bfbadaa192bcceb325386dff5 release30-maint
+68010 38357e1d21e6ab9829ea1141e581c8cda2c1622f legacy-trunk
+68011 b9efdd8f8b3091efc874237d4ec573368bc7842f release26-maint
+68012 9f8363088536a7278156f059798281036712f338 py3k
+68013 a1abfe027074c994e6e4c662138f6c78f2863200 release30-maint
+68014 89a3f5c9b503224cea710508cc2e915455fd9151 legacy-trunk
+68015 71e732c9323445a20d33334cf061b4aa7cc86b11 py3k
+68016 70de2e091e5826c0df9b1b6bbbd2c85e94862fce legacy-trunk
+68017 18d817a7a39fa9f8ade3d40249e23117d30d55f0 py3k
+68018 34c73a463b355a8b12161cabea3472cc4a020c01 legacy-trunk
+68019 2932b37f1f044205cedacf3f4f7a998b721bdda9 release26-maint
+68020 44ea9eac8c5b52522c4b0de8044a7cf7e6012a2b py3k
+68021 7f5aa7e54ad5a124273afca860767259cbc2d649 release30-maint
+68022 f7a3f14161e17577cfe52167da91471a31f9fc5e py3k
+68023 ae1e114237295d9ff1c1527b40f25c76e2a0ecd4 release30-maint
+68027 1aea83e0ae9f02ebc9375efa0d7690dabd2b841c py3k
+68030 bc1b374395f40001a92d8aad4148613bb94041fa legacy-trunk
+68031 3d447b7b13634ff34c0b9c7de341ca9e85ae3cdb release30-maint
+68033 f1462d924a9c21ee9804da6b0a29781c03648540 legacy-trunk
+68035 ad20b69b18b70b18271566a8ebb53451339c839b release26-maint
+68036 9c06fb7d12602ec7d6cdeb6801a660bb4e8de6f7 py3k
+68037 8fa611bbb077ff71092759bd58c63f18199814ad release30-maint
+68051 7aaef4d5f880e7863fd6062e2e31fedcd4e1e4f4 legacy-trunk
+68052 e782f97116dc1cf1282145eabdbe2eb5d45944f1 release26-maint
+68057 f73fc441744f0657d807338db11e9ee863b468da legacy-trunk
+68058 618d3397f888ce543251f828cf2b64be4a641ce5 py3k
+68059 28aecbf1e832b05f6794dac7e1c5e9a6c43fa2e1 py3k
+68060 43aacbe647cb3f49a57e0521ef647abd17610a17 release30-maint
+68061 729999929ef4b5bd6ab1d15304ca14f35573be27 legacy-trunk
+68062 1154d0245b66138b4d3d375d51fcda7df249e573 py3k
+68064 afab319252e7923df418d0b9f3aca1adac40caca py3k
+68074 fa6fc5526f71f1234164696063dc3458cd5902ac py3k
+68075 2c844cfc375a31c2286e38229e9ab3ad68cbcf25 py3k
+68076 c338bee2117397056706e0eb78c9db4c56a0412f release30-maint
+68080 7431638e7dd8facc45f9b3cdcfb5cd566c68a124 release30-maint
+68081 8a483439cb55feb3fe93cf3f0572593c52c9b125 legacy-trunk
+68082 d8975f24af8b58df9cedef7df43f6bb89cdc79a5 release26-maint
+68083 7d550cb5369e05ae6c7a17467b8a0d8e28c8e1e2 py3k
+68084 3e18b459d4c8841de79038975119047de6c0865c release30-maint
+68089 b75d769151baa8f0a1149daa8c431c74763d2ee2 legacy-trunk
+68090 02fcd9c5fefbf980fc0168bbea6c6814ab1457be py3k
+68091 ef649ce9b7839a0747c410877639e57ca9267055 py3k
+68092 06f4c37d65f9689aa5c2380f90e2fe654cc2bebd legacy-trunk
+68093 15a6626085f4a513ee424c78e5c82aea3c512cb3 py3k
+68094 6d163c2aef56b8daaa24ed48daeb6f7ba5f03d59 py3k
+68095 3853c15532c4ede33dd69a757f21c5f20c8cd307 release26-maint
+68096 022d999c4d1a94b17b4ac81f0edf77b96ee30f4b release30-maint
+68097 9c2ac78666d45783250ff63bcfc000cbc7857368 legacy-trunk
+68098 dcbe99b0ce832277136ca5252468902804318add release26-maint
+68099 1c5d942128b688057ff95f534f8ae798bd730651 legacy-trunk
+68100 c43226875bd41079b25980b64d6a3cf3cfa3a1b6 release26-maint
+68101 7e1a95b26a5ca6cbd4297b65fa499023d649cb84 py3k
+68102 5cc073d661f7b6d33b2c3ec5406d688a251fdfea release30-maint
+68103 5074830e9b994641f155fa895bef9accab1d1c3e py3k
+68104 7239fbcdcd4fba65b1ca34ca39e697311d2ee5ce release30-maint
+68112 13daf99db035770a429871c433670f94dfec266d legacy-trunk
+68113 bf6f2dfc310ba14d99356a10ac7194b22851c81f py3k
+68114 d32a669f96da993e093e588d2de3ba0e5500e162 release30-maint
+68115 92ad965442525804a7dc6777c50056d111e87974 legacy-trunk
+68116 59f3bf2a328d44842c6c2993f068971e751c63e9 legacy-trunk
+68117 927f5d9087f5a15e5a494ac9daf386cfc695fe9e legacy-trunk
+68118 394e389e89f09a6ef38a0b4a58623064cb42a115 legacy-trunk
+68119 20edb7e5159f4dc2f9351dafd0c0bd90d7330191 legacy-trunk
+68120 d1e536c6fa2cb205f4ade3a70801a31ff2f35601 legacy-trunk
+68121 683b3f8b12b44a23789f2c4b71849bb9547b88c5 legacy-trunk
+68123 f35403a011b94c58a9cb658c01a3e676da18e741 legacy-trunk
+68124 1c4e678a1d3b1edfb1372b1cca9d1ec95cca81a1 legacy-trunk
+68125 1b82f2b82fd9211ad526f3f8e8fa937544b289c2 legacy-trunk
+68126 e5dbf38b1dac1a71c89edfa411d4a41c944702ad legacy-trunk
+68127 36e9793ebb5d483c480e233c958d978899a3d991 legacy-trunk
+68128 099b48fe922a0df267d398448fc8cf4c6fcdc6fb legacy-trunk
+68129 cab8501f8ae6b33b295d2fc0b9d4e0ce9165c697 py3k
+68130 8463ff861a26d84d7299cfda06022c3e53491b82 release30-maint
+68131 436e6317c7b4b9134033d1c2505093f7098240fc release26-maint
+68132 4fbf52c99b6ed434db240c7a09548057c2398435 py3k
+68133 c7a45cba0785d6ca56b332123690af316ea2660a legacy-trunk
+68134 0e5b24ade4a2176ce0c515c4bec58604362fc3de legacy-trunk
+68135 df3923c36ec59f7d238f7ac884e08e9d2ba08fe0 release26-maint
+68136 06e1f7d9da83de542ad94a466bdd868732778ac8 py3k
+68137 9dd2e257ac7c22e5f4b47327838b2e00958f008a py3k
+68138 bb31223abfaa8c5ad62d29584ba8ae9d0f92d7ce py3k
+68139 9f604d33a42f70be8e04a416e42e09cb4a47115a py3k
+68140 2b13d202a47d7386aca4402444388c70069e2e13 py3k
+68141 ad4e52d154f4a298836d757ef4200f7167ad2b87 legacy-trunk
+68142 5c6fed73b6a9182a9858a1a897cbd7d5a1814e90 legacy-trunk
+68143 2debbe6445e0fd91bca22fe4630e83741f190472 py3k
+68144 4801969dadee3cfd7f2de64ace31adde1c55c987 release30-maint
+68145 6097f97b0d22073ba0e3209e683c8d504a41b723 legacy-trunk
+68146 40fa868981ccd8f7e6f0be3987e1355c6b2d1058 legacy-trunk
+68147 cb3479ca81accaea848f4ddf73fbb195b56b63b6 release26-maint
+68148 bf1734c6b6ed223cf1d1c9212fd5d3e3ae149322 legacy-trunk
+68149 84cb01c5648b174d07db356b5bd004d832982013 legacy-trunk
+68150 253e1c73fde69caeb78420a21978d42550c4da2a legacy-trunk
+68151 5c4f639c920089862c2f1f0c65520b8af471550a release26-maint
+68152 08dba7f9703019a8902e7eca18fd515ed1fbd712 py3k
+68153 2f01f995f70412b7023d5b1913d0b28859388389 legacy-trunk
+68154 34d51c30a4f4bf1c9234deeac2fc4f7503f38262 release26-maint
+68155 94cfbf93d71b4c6125a618f68b13def124bfef98 py3k
+68156 1dcb19216b64d620a80ac4ec0b3b805e2729d4e1 legacy-trunk
+68157 e7aee7c99d3b77c0a7b18e4c7a811ed7220f0085 py3k-issue1717
+68158 753954d16ed216012c49d307b3a9c0f766a12388 legacy-trunk
+68159 2696a39bcf0b05798c2d265f57217a55af4ff9e7 legacy-trunk
+68160 c50b118eaf347794b4f24f9e94205d5d60522346 legacy-trunk
+68161 355bc122c14565ce20cdc9895dd040362666d0b1 legacy-trunk
+68162 de7d167b9ff10daf2bef30a77456f7f73a98e647 legacy-trunk
+68163 69a240e5f01dcff6f384b53db2c0c99a25b8efaf legacy-trunk
+68164 e0c66bbb48da83ec7514781bfc2b1fdd6a7c1b1d release30-maint
+68165 400cfcaa8d46ee85c11cb61b08a5ceb066c98e4f py3k
+68166 ca86abe1592639a76e0ba5e9b473d5e2ac8061c6 legacy-trunk
+68167 ff106453254a1dd9fe905b58540b36af232e02d7 legacy-trunk
+68168 a549c927077673eade954e79182edb7a7c9f2a6c py3k
+68169 abbce48b9ae40a69acc6e4241bc94d0a2244363f py3k
+68170 bcf46f33bd90516d73aa7a49b0014d82e8d50763 py3k
+68171 8eddd665e9b9fb6afeddc4bb11be6a83b2cf8920 legacy-trunk
+68172 636a0ac9607b7a3a40ca0fcbf30441bc10e60280 legacy-trunk
+68173 1297bb71dc64b16c2082e6b7cae00a3a9da917ba legacy-trunk
+68174 68c9f8b6584d4b1ee1e2ff01a0f8a7e14c20ffa5 legacy-trunk
+68175 20384ebfc716f2e0a9f4a90b6c7fefd33dce44fc py3k
+68176 0588a98793cd0875f0e45d1f8e30af86bea3ae64 legacy-trunk
+68177 eb358dae0ccad8a5a57ec7de36c8bf13e94d8dcf release26-maint
+68178 0c9728372d098af4ce4f89918b1392296693c3b5 py3k
+68179 0052d23d39f615c763e735c4e62a82834567dfb5 legacy-trunk
+68180 0e38c70b9776ea7ac1dbadc569558314f77b565e release30-maint
+68181 930133979d7a291ad01c523e48fe413ee00065d4 py3k
+68182 ad92104d50607e7a733c95cfe564ede22c0194cf legacy-trunk
+68183 94ff3de1e1a45bebffb5c578dd70ed5814492e08 release26-maint
+68184 5e164988bd51aeaeed38017a7506912a453fc31a py3k
+68185 d367be543f6ce8af40764b19de756bc87a61cd04 release30-maint
+68186 440add516cf1e1b713fe80698bfede287dccc151 release26-maint
+68187 36d0270378123332788fbb223d6d58ac3ae90465 release26-maint
+68188 c45fed03f7475c2d2bac5ce466a1eb318fdcd423 release26-maint
+68189 fc94c9c42c6c8000635a55fc46aa720d8a45a1fb release30-maint
+68190 fa55fa4556f09914cda41ec46737b0ded1b13f29 release26-maint
+68191 c272fcac24a4a25b5ca754d8ff74272015b075b6 legacy-trunk
+68192 f2a5d7828b83e7200b646822a46368e96a590f75 release26-maint
+68193 7388660926aa149ebab1bae2c7c9cbf4c570ce68 py3k
+68194 134d173b9350b2fe453d183baf2f75f4f6740b68 release30-maint
+68195 427d8b765a6a00b006767780907957a4c22d51db legacy-trunk
+68196 a788d4f10b9783ce93bafb2f5ea39ba462afe816 legacy-trunk
+68197 b991fe5f637a85feab8aa007e419e08d5099ec03 legacy-trunk
+68198 8e7728676f7e85aaebb1d84823a045bdb8824a02 py3k
+68199 a92f71d46dc4c1c32906c3b104929e4f91b602fd release26-maint
+68200 29f64077c42f88d1b0d545da94959789ac1978a4 py3k
+68201 7934723f7dc4fbda1525538bf968689b8e86a16e release30-maint
+68202 26045ed0c26e2cce1d6f5b1c5fdb292708f691ce release30-maint
+68203 ecf1bb7baeb1ec76f898805505648fc0338845a1 legacy-trunk
+68204 4d1a68bd8076c0c6e3465f627e329f1f969ee8d1 py3k
+68205 253f9e6e9e07997544a954150a02dad4cce07483 py3k
+68206 10cc53e71b2123d5479d8f0cd36fc764ce0bee5b py3k
+68207 9a425eb0f7ea54ab4e480cdd3c237f93b0614f5f release30-maint
+68208 7a6e3bc60ba6de127bcee944b13163f839406638 legacy-trunk
+68209 e78dcd87d733f6f7b24ab1a659e650944ebcefdf legacy-trunk
+68210 aa46787b93cc651a8df23727ab10c4e1c7a34c4f legacy-trunk
+68211 104005d07ea5190e3d2206e2676e0d752aa2e751 py3k
+68212 845fa7d36642090c24190d442eb87e92a1ed3085 py3k
+68213 de2771070d852b2c83c36fd8e79d6df53f0a8665 release30-maint
+68214 6e4d6d3905a79df1ae73f72dbd52135b10ffbd9f legacy-trunk
+68215 60854bdbcf1e5af790c88a31b36c95359f13f555 legacy-trunk
+68216 b066fbb6a8bc29fabd1ef8b7669f775cdf9598cb py3k
+68217 c75720c3e16ee0283eb1d582a431d2230acc62a0 legacy-trunk
+68218 6efc1de345f5c9177e405dac7f675b1eb79e1d23 legacy-trunk
+68219 fb0982c3217e45804772ac6bdf33faf05f83fb3d legacy-trunk
+68220 c52177f368527640e7f2299bccd598410df2619c legacy-trunk
+68221 7fb431fa49460185b947b5d85ffc0074767070c2 legacy-trunk
+68222 989314d7cc5efb2dfcefb56c2cec24bb94cab539 legacy-trunk
+68223 c9184f50734fbb974be382f12c92adb814581ce1 py3k
+68224 5ab3063caf4c0887884476f87adce2f423311926 py3k
+68225 5f2475fe52399533ce0de4bc239f3eee6c223446 py3k
+68226 c3d3b760d8bfb0ef531a364acd6717dd288b3e1b py3k
+68227 0e05b6ca6afd3ba7c591fa44480f84456717fdcd py3k
+68228 e479b86da11de64aed8ec894d1fd8903632ef338 py3k
+68229 83efc2467faf347b766b393c1f14892632ebe98a py3k
+68230 072dedee77fa6dd48456967af570f69aa98c9b29 release30-maint
+68231 cdd5fa05c14d00953670efd8b624e40bde8999af legacy-trunk
+68232 24a0937d762434bb3cedb0841bf191b0d3b89577 legacy-trunk
+68233 aee55ca04c8fa301f82e5cfa5f2414297ea95acf py3k
+68234 ee9ced92843a7a599227dd8e6b013a30ac3a1169 release26-maint
+68235 713a3a38f975ca1c439d72a95b51865edb0270b5 release26-maint
+68236 f885c76f1e9551226d82ed923549769b772dc2d5 release26-maint
+68237 ddb73a4dfc204d539b40dd8b6b9dcd191f59c8ff py3k
+68238 6df3d08b89e450dad14a9a208997beefbfffcb61 legacy-trunk
+68239 21d7e9e87591c729535fb715d20696fadf1d178f release30-maint
+68240 b5639d245ad535479d715a233bb03d60a9e044ef legacy-trunk
+68241 73ded94fb8beab3988187dd81a3136c67cc9c754 py3k
+68242 91cf9ed46b7232e355e0cd995b8e394705cf8789 py3k
+68243 d3c7e9d9ada7c0723b3b00c826535667e432d1d7 legacy-trunk
+68244 6c8ed667432892f273c78e8655e3f67ab1af813d release30-maint
+68245 af20dd19cc0d99807f3baf0eb345f9aeb952aa0e py3k
+68246 91a923397347838e9f2a00d1b90ce7158a8a0f6f py3k
+68247 d0914300e12ebc5a8ee0f4dd4a75cdbc5a6af2f9 py3k
+68248 8aa19530f9f228f9e83db2563392dbcca28d8274 py3k
+68249 450ecbb56c7b50eb92a8ce6f9c6251e727b68304 py3k
+68250 28321dbdfdc0c06bd38e3a1b38a0d644602340f9 release30-maint
+68251 96188031b1b5976bb7ea0e689e64c03f94bf72f1 release30-maint
+68252 4229a4b14f1d893c34b7a1d19674244c628c3908 release30-maint
+68253 782578c92e1d3abc1210cf6e7df03e095f66a392 release30-maint
+68254 5ebf82689d36b4e5e93489e8a6657183f69bc97c release30-maint
+68255 fd4da855d603f5f7f585433e1d5431a292e852f0 release30-maint
+68256 c9e5c1fa285e83ad5c95de6b0cbb65828734f406 release30-maint
+68257 e80c806ce02b46440fb32cc013294839b185e033 release30-maint
+68258 44387f1a28a20b4669e05f20ff3788edd74b75cc release30-maint
+68259 91f2fba02a5022289f7de96b2a62e1d228480fd1 release30-maint
+68260 81c49ba7bccf77796622d193597422cee22c4e54 release30-maint
+68261 fadf78f5f8ad36ede635e6ba54fc489e9135e289 release30-maint
+68262 db464426a365372179fbd78bd0cc9ecd7b8d26e3 release30-maint
+68263 24b18e87d66489190852415a177303a25145618d release30-maint
+68264 1548361bfd2f3bb6f85eef5c76437fd1d8cf053e release30-maint
+68265 badb471dbaebe01a85cc400d7c3d404924e1df30 release30-maint
+68266 279a5100688500edb72deb97e27288617173159c release30-maint
+68267 047df0a5f1743604c665f24a2519360a5afcba97 release30-maint
+68268 5a5b0b2d01b93ec9fba551e0f075bc1521966646 release30-maint
+68269 bd0e361bd642151b7b2122a5ccc338395d976a32 release30-maint
+68270 fbf7f53f4888d292f8b1ee41112cb7cec71aa851 release30-maint
+68271 6f30b97148b659c06de341a4604e8d1772413e3e release30-maint
+68272 851c2f04f95d5aeba490f70dca39c0c7affabafa release30-maint
+68273 b96d61688b87cf03e404f03ea5412eb5e8d7daf5 release30-maint
+68274 a6ee2ff4de4d873ff25f81571a26c2df708bf0ef release30-maint
+68275 93cf3a6ead6398ceacd4553d97526974ee2ae1d5 release30-maint
+68276 05bf7002ec9426512073a58341ac8e716eb25ef9 legacy-trunk
+68277 afac0cabc3ad20723506b1bc1616f9b581d93fb3 release30-maint
+68278 ea7e307ddd51af354f1853cbb2a418c710dd33d2 release30-maint
+68279 7ac1f6be8ad5552b3577635e68a5789d1a5e36d7 release26-maint
+68280 fb905890d049aa33a45eedcc4669334583df27ed release30-maint
+68281 8b2c1a0a9a2b8138e405e16de59a5baf8877f975 release30-maint
+68282 22b11c22cef8459799dd2b66a11f053f3c747ddd release30-maint
+68283 3b08674b9b483f77c2706924e6ff7f9e299de4f8 release30-maint
+68284 1ea5013d9dae0f12154392c537ed81c7033a7141 release30-maint
+68285 9ec99fdf804f18347815bdcd806b024cf6df4697 py3k
+68286 9403defb69fb19bf9bdb4251f55f11e3aff4ffcd release30-maint
+68287 1ca8c6859a07854835d9ab7cce46cb15745a541a release30-maint
+68288 baedb069e4256bab34963b9d7d474642ed0b4aec legacy-trunk
+68289 536798598af088d3a40903049fe9f25e1edc8d9d legacy-trunk
+68290 d41a86875332a76a40a3ce0b50fd7b620cd8c757 legacy-trunk
+68291 54a5affb6af018586845eb763e5ef354ea3cc58b legacy-trunk
+68292 f4ee0006ee392f4ee650cce38d3b2757573f74f0 legacy-trunk
+68293 da34f02664edc9d521820c7f85d77609ac0e92a5 legacy-trunk
+68294 057cb46ddaad7a9e7239689495935b74d76890f4 release26-maint
+68296 f854373a66e55bfd3a225a34907ea77429762e9b legacy-trunk
+68299 3a540ed795d3b068f8462f0570a90ca925c4e109 legacy-trunk
+68300 fac9350b437dc9dd1c8fe759e13c3f46eeee1a86 py3k
+68301 1146b7b0d518b3c79e5631cc6f15f2cbe2f6eaa0 py3k
+68302 584b263b98da64a4b77bb963d56869f54d483a43 legacy-trunk
+68303 9d5063b411e87956b43f73e630138d0e9e50ccfc py3k
+68304 e18f322b931e790642151bb44e4ac30968c1f93c legacy-trunk
+68305 6e4dde2e95f7d3c40d197f9e0eff141ec8b4efe3 py3k
+68309 13f1857dd9bf5da8e4efefba8a1fc4f83528da54 py3k
+68310 c25e5b620a4cf2481773f8e2765a1071a58f4f9b release30-maint
+68311 92cd3551fa131b799c7a1f4f856237c457cb3b0d legacy-trunk
+68312 bc9f80ddbbe25f52f8a78cd0fa7075b779e45e13 legacy-trunk
+68314 2cafe989117a33de792d936206c18714e8626b5d legacy-trunk
+68315 474745b7a12a6ca9ee652e79a020c3fcee28f388 py3k
+68316 40ba2a1253fa4bd4e146b050dfa4fd0031c0de93 py3k
+68317 09a498eb182055dec6b4f86f43ebba5db5b35b97 legacy-trunk
+68318 fd0bb68ad5c8bc1cf852388f33c3884917bc3d98 legacy-trunk
+68319 9de21e615577e8fc4b0fb8b0642c8af5339148d3 legacy-trunk
+68320 2be490abf3333c2013953e434e45671a57e547bf release26-maint
+68321 5436e534da6e4a378f9c8a73adfd239d62120d73 py3k
+68322 ddaec47e6dd99a6e1b5fe342a04ef5f10c8e99ce release30-maint
+68323 6a6f138d4162cf00bd472e52205938fd776babf5 py3k
+68325 15c4c9e330e920fb6b25013004a8093d37cc9ee9 legacy-trunk
+68326 8685e5855a47973988660357090215c7997df787 legacy-trunk
+68327 e171cd53ac4b6ed7578777d46e1b99bde0e3c711 py3k
+68338 758d8fb7bd990897528943591f953cc2c6fa3f10 legacy-trunk
+68339 9174895972cb091c1308de545abdf86c016522f4 release26-maint
+68341 6d9b0331d073a3eef56eb515b196c08462000de9 py3k
+68342 255e64a137551db5ab68606eafb5a32b4a5d6e5d py3k
+68343 64f91ff24fe6c24801c91df135f9fb69ccd0c140 release26-maint
+68344 727ee1665219ddc7df26fe3da991a04a12c8fffd legacy-trunk
+68345 e4acf079b508dc01251f4dc449d9b8fc266aecab release30-maint
+68359 45aef53f5c71ac4b3cb890d41c1b97470ca89280 py3k
+68360 fc0000682bfe7c0ed4dfc3037e800b20c1e5b02a legacy-trunk
+68361 be9b15bf682831cafc395ab3826bb6d41091c6f7 legacy-trunk
+68362 617199769bd384b5184bc46a2864e718f98a23f6 release26-maint
+68363 2ff9910f1526c89347204dbd97239bae0e61cd2d py3k
+68364 e987e0df8f48f4100592a667a42322eeb6fe6455 release30-maint
+68373 8933debb9308eb7048d7575cf4c340602bce8d6d legacy-trunk
+68374 a4af5e6f6b17c39246a79e6d4fe40ee13e78fe69 release26-maint
+68375 81d23684f694de11143acf2afb912278139fee54 py3k
+68376 0276b8fddda7d5d594fb20c67ac83cda5a490b86 release30-maint
+68378 8a5a9591100de7174faa78f343716e5785cf425c legacy-trunk
+68379 fed2ae1e50c2fd55f9733149f5f919baa6815942 py3k
+68381 f0e0c3536e227252a043e919d933d2f56702311a legacy-trunk
+68388 44f14fd4d9c2731392fb8d2e52cace2b56e80d48 legacy-trunk
+68393 5ac8f0b5a59bfcc57de9d3ea946ac97e3af0cae0 legacy-trunk
+68394 0b8d2cf3f55b42b3b8866498ed49b3948cd2fadf release26-maint
+68395 76fa1de2742a98a127f12638fa73f1926ac9ba86 legacy-trunk
+68401 a229ca3a12ae2c46da8dad1794eb7e5c831bef93 py3k
+68402 e6a29790d75ae0ba7cefe37de36784af3a5dddc2 release30-maint
+68409 adc430c16b57b6a76b7dccc977519dd5f96a5aad py3k
+68410 fffd10c12a1b77239fb6be2e76e2fd71d1dc2e13 release30-maint
+68411 f9f5d9047a0541fa16ffb5ec36405f0ada578ac7 py3k
+68415 a3f329f23b236e331531864d591ad326bfc79864 legacy-trunk
+68416 ea431943a8de52617bc5a55a5762ed7a09f83d45 release26-maint
+68417 589f6844d8e0ec3aaef19d2c9b6269d22b126443 py3k
+68418 368df0060740c7260172328cb3226008cc26f99d release30-maint
+68423 ed3fdbf1077556f2d02edffc5fa5515f14cad807 legacy-trunk
+68424 edeb9038c405b114704c35a48114993d16ff341b legacy-trunk
+68425 d97aa943bebb55d358cb2ac0629ae9c92832f2e3 legacy-trunk
+68426 d8b64c676bcb1de5f6254fd3c1a36538bc702edb legacy-trunk
+68427 5f292debd24c354d25b863e8797a1171014595db py3k
+68428 e496fdb927fa62d0483a3395de1ee578f7c075b5 release26-maint
+68429 5c6244d217ff11b973dc8d5b4d0bb08e7d9ced48 legacy-trunk
+68430 69a2a4dbd9b4f4da4f406d5aadc4666dbc22afde legacy-trunk
+68431 72fe51d6f800bce77cc6c44c891f37010bb3c1ba release30-maint
+68432 ef3a1ecd4663fe654e292ea031e1f76f8a588eac legacy-trunk
+68433 e3c212799706e66fac73c79ba0f4a3ed30160cf9 py3k
+68434 480fcdd82016209dd7299af530e4c3dfeb4faac3 py3k
+68435 36686d4d7e7275bc2461f1019f56212062ab3d32 legacy-trunk
+68436 3b933585547196aec040106610a8d58166c1302f py3k
+68437 0a66e1dc30f223569837a7d1ee9a28a742fd5268 release26-maint
+68438 c7c344b63eccebf63273fc8e2aa7b5a81d91eed9 py3k
+68439 7b86d6cac2b185e1c5601e77dae1e0816b07414a legacy-trunk
+68440 f127bcb0aa71225ffb4c5abd76a83ff8cdf245f7 py3k
+68441 9f041ba3e4c91fc33f3ca392f7f1272a088dc562 release26-maint
+68442 9d093ef89c56075bef0dc0bd52f0c6b887e8d35b release30-maint
+68443 ce3733139fac803efa84a44dbeb33b233b614a9c py3k
+68444 c94f0279fede977b2479563dcd709667715451a4 release30-maint
+68445 ccd95b1aade9d4c98dac905c733a58f2e4ebac09 py3k
+68450 b73bd5a74a278837bc2a02297cf8423ef1343a39 legacy-trunk
+68451 bc30e395aa14adef0023d10203e1536d320cecde py3k
+68452 b98fe8dc8acd6a10450bd9d3af8641d3eacf0421 release30-maint
+68453 3886e4c88fa596d90e2480b3e1285e32a005bee0 py3k
+68454 8c49ff0ce17af36ee8d0b894a0222d2848243f11 py3k
+68455 fdcca8793eb9f7e2511810fb2e100cee60417985 legacy-trunk
+68456 9b276ce35697b256a9cbe3af9f9150a8a4ec51a6 release30-maint
+68457 ca098fc18ec6098034be2e4f14e4f27878d9be6a legacy-trunk
+68458 07bbc2e20aa4b502fa1d76645a2ee3fe2d8932a5 legacy-trunk
+68459 f1ca5dd59aca8264eb8bc6b95e20997181c39b60 legacy-trunk
+68460 c8f793e159bbbbe975e7d0da46d9b888a0049be4 legacy-trunk
+68461 e6f55c9ec3d014afe94c08b7778163d6df24ed7e legacy-trunk
+68462 79276316b94b38f3deeaa8b037013b93cb60a5eb legacy-trunk
+68463 62ca2cccdb6fc20ea333af5874dbffc8c850690e py3k
+68464 9c2bd647b6464eb665ddc0228e570111a6557b58 release30-maint
+68465 5d0eac01a285d98ea382da97025b665aaf3c303d py3k
+68466 bc670a8df44bb2a38a241a423e9f2b17236dd96b release30-maint
+68467 91e3851c8cc7ca2243a945851dc5e56ab366a0a1 py3k
+68468 e00b324749b04e29635cbb1caf6f0249122f0c44 legacy-trunk
+68469 8af51cfdd5e90c1051131c50a12dd557c7df2a45 legacy-trunk
+68470 1e070b83cfa94b70a53e4c2b01b97906791d9e59 legacy-trunk
+68471 937f500e0f06d0807fe4e05e1d0b7e3f2a7cdabe release26-maint
+68472 d4483fecd6873c0ecc4074d430df36ed8f4affab release26-maint
+68473 c34d721c2dc724629b2ab51bf1055233d6502456 release26-maint
+68474 638e309ecc98ae81a0adb7d57650bd0390e85c6e py3k
+68475 a0ff9007c2aa3e788bc93402d55488eee06bfc59 py3k
+68476 5302f806537a7bbc1f6dfbbd151c16f3007743e1 legacy-trunk
+68477 d326a673cb6605df4eafc1d1f488ec34afead0a1 py3k
+68478 5c6cbb7a62b076beb51fd525832f15a97b9bb9da release30-maint
+68479 fa922985af73217eb8ad81fdd9064a2af37e13cf py3k
+68480 dbe39ebd30254fef35122d38f90b4c6aae52e8de legacy-trunk
+68481 cdc2fe1be8a5e20d893d6ee066fe235fb2b13186 legacy-trunk
+68482 2d471fd88affb2948928dddaa21d17a0a5174379 py3k
+68483 8e623b78acbf6c0d661e4630a5fb870250cb128c py3k
+68484 5d5d9074f4cad45702f4a6fbd50baec45bce6288 legacy-trunk
+68485 99c441640f70c7104f78440f79ef2f94424fd8d5 legacy-trunk
+68486 15a056e0f89fef264ab209aa1b0e7e5bb0c2d501 py3k
+68487 7444f564e27d1e9f659b3f8a44f057c7f46617c2 legacy-trunk
+68488 8dcab24397a8d2f00707e0f4cee772efeb862ed2 py3k
+68489 293ac44d7ff0df66e4a401d116370b20900c20a8 py3k
+68490 3b5be0ee32eac97991b67ac56879b45bafeb498f release26-maint
+68491 e95c3aeb4c85838da2aa209f6dc70251843a5c1f py3k
+68492 ef4bd7708ad7b3dc289c733e23a5fa63e6671480 release30-maint
+68493 40ca8b2122081de53f5235b6f512145cfb36ed0b legacy-trunk
+68495 128e20da89eb41fcf4b6e612c908924beec0ebe5 legacy-trunk
+68496 5861f6e10860753d0e799a245777f8138e0f2200 legacy-trunk
+68497 95576d8af7989e3435bf950307d82cb89f294303 py3k
+68498 02448ccf41e01a5903860d04ba5e778897531146 legacy-trunk
+68499 8e03daaafc741db89886b819410474a846d37ba2 legacy-trunk
+68500 d87cbfc6c5c67714315dc970d3f78ed93f07043f py3k
+68501 bbf464210984045ba1519a22ae6e0758cb965df0 legacy-trunk
+68502 eaf7ceb8ab454a3f03bf51367e8da4e43cd0982e py3k
+68508 9e181eedc95ca2bb9a5044a1576860077220e213 py3k
+68509 0496963fcfe9fb64c9458c21d356359322361d11 release30-maint
+68511 4d350f2b1f2e8380cc5e85dd7ab6725f4a3ad038 py3k
+68512 19dffdec5547ab942d4ccdcc09d15b6aed6d684d legacy-trunk
+68513 0f1e4ab95655171ff610afb3c86d2ef5ecfc3418 release30-maint
+68514 44e0c69a530481d7c782c6a0f257813d5284d00f legacy-trunk
+68515 43edc6581e44dfc482cab418e3addce4ae9f98c1 legacy-trunk
+68516 93b2a913d8acfd073be6a5f8d6940177d26c22bd py3k
+68521 ab086afdcf0cf7e0f445f6f2488db8d3f8644fbb legacy-trunk
+68522 2d89772cc25688a6ffcd42258a16bb06b2114965 release26-maint
+68523 2935cede594e377fec1bfadf6871428057f86918 legacy-trunk
+68524 75661bf8cb2c673c36713970c882b9f01d8d1762 release26-maint
+68525 95a4f5308be24cdeaa18b96834d73a6f42779eb8 py3k
+68526 dc42adf887b575f0422e3e0e5c1fffea21ef74a4 release30-maint
+68527 d841ff67cc61b8a2558fa75a3e0ce042841b3683 legacy-trunk
+68528 70443ae76b105c819c0574a85d9fe839555101eb py3k
+68529 92bd0141590697b59321c37b6b41057f28405664 py3k
+68530 2ffdf8dd3e8b5064a295e4259f25948d224f01de release30-maint
+68532 d09d6fe31b619987f79fa94243c90334ef2d1e5e legacy-trunk
+68533 27db82a5cda919dcca21f4cfc6d4796a9a5e6287 py3k
+68534 b7fbe37eb8904df9cbf9985a5dcdb3e2b2824ebe legacy-trunk
+68535 491ec411e5c8ff36fd18140b2e3fa0df4630812f legacy-trunk
+68536 7543f1282073694a4644d1574bbf90549c381007 legacy-trunk
+68537 0f1b3f311ae0102d2f9486bb52d9de32859feb86 py3k
+68538 6eea80bdcbf5e8f6168804f2b0d2f0ab2b0b1707 py3k
+68539 5f4c2de95091b52c06ccefd925dd138bc3cba335 py3k
+68540 ad9691350c931df614795e01205e849b2f78492e legacy-trunk
+68541 e8154bd322cb56612c241f82c647e5199eb7bddc py3k
+68542 8540268040ff043f0082f472a6b2ee0fe3c0b324 legacy-trunk
+68543 2b2707ff8bb7a9f25c5cc0ff8405c6e9d5538fc8 py3k
+68544 e40ce8ffe632d16c6f63b74ba62528c2775aee34 legacy-trunk
+68545 38e18a884f3fee65d1209cc7b0fe98657d9e29f6 legacy-trunk
+68546 87adcce48defe64f54f8eb40e1a4ce01867f56b9 legacy-trunk
+68547 bbcd4634ae733b2d841d17aa8ef47422d7012715 legacy-trunk
+68552 bc92bb20819fc9cb556cabb757f7ebaf088c8003 legacy-trunk
+68553 f55b855323927bd5e5029ef96da20f76ae60609e py3k
+68556 871a1ff46fa69c3dd6ea54833215283ea4467d8b release30-maint
+68559 5934612d50705b049a8b9b379701a63758f5eafa legacy-trunk
+68560 e9748db476357cc6142fb9c1d02631be283d9afd legacy-trunk
+68561 c99ce0164699c3d4f6b58dd0aa2a7a551c182dd9 py3k
+68562 f45997d9ac555618add1c0c66ca9e79191a7c349 legacy-trunk
+68563 12a787b44db5449f00f013551c63376f8b7c333e legacy-trunk
+68564 2c03c7580aa38bd36f326c048080ad6b473f8c69 py3k
+68565 ba1521f2474904346255c5382ce6fcbe21115448 legacy-trunk
+68566 e301141e91b10467ed1e07dc4b34306214d1e627 legacy-trunk
+68567 e5f996cda3216e4b011db5e023d2ec1a7bb18332 legacy-trunk
+68568 a19d596d3500cfa605534c41ab1acc5634e93485 legacy-trunk
+68569 2a82bd29ec188858d9e8f6aa95ed2baca4d524db legacy-trunk
+68570 454b696c1d730e2c66e257dcc7d4fb20c11ee41e legacy-trunk
+68571 c776b6d814c23e8babc7a2ef261212e91bdec14b legacy-trunk
+68572 59b1212a4dbf3fe01322f2ec869acf07afd2f603 legacy-trunk
+68575 be8e958dee94ced4ae6c54700694e49f4767e8d6 legacy-trunk
+68579 08ac440408c9d32a6ef43d3b0af02d2caccdaa06 legacy-trunk
+68580 9a5d145f19a512b6b583edec8960e42cc05f5894 legacy-trunk
+68581 4399e3f10b19b0a170a8cb2c13ac4c652ca26b36 py3k
+68582 6e33aeaee77dd3968057a88850807993c5ddd64f legacy-trunk
+68583 f571844bef5c9a8e80770db34aa66266d485393b release30-maint
+68584 a3494a5b0495646cec97b51695cedc1e3cf2c4ab legacy-trunk
+68585 02ab161423a586d24d0f0d636db38ffcc12cd902 py3k
+68586 413cca3ebe82e0217eb295b8bfbcd53735627db0 py3k
+68587 0229055c8be06f101d3dda73a08e7bdb0f9abe65 py3k
+68588 0943344a5261bc760837bfb86e2ba6ebf158f5a3 release30-maint
+68589 08f3fe69151ac6d044936812c7b570d48de99e4e legacy-trunk
+68590 fab501277bc2c3c329c0c64f32c875b06a25848f py3k
+68591 dda3107f6bc7a7bb6000146380b20a142d3b2343 py3k
+68592 a858b61db324d7ed3c6ef49b718d7dc37928da80 legacy-trunk
+68593 e46a06a264b32ddb4a6eb1268922521ec2c340a3 py3k
+68594 0fdce399dcde0a23c81791ce67a381da1b334a02 release26-maint
+68596 65c1938fb9fff278acc4ce652a1d548ab516f998 legacy-trunk
+68597 bcf6663c5c048ba9a17ac4eb7b3ed2671f100c47 legacy-trunk
+68599 2d453b221becd7e4eaad0ee3c2fbb1787587781a release26-maint
+68600 0ef1e664a4a45a290daa29fb8d8ec6172592b9a9 release26-maint
+68601 e11c99e1e6e7ec80162cc8810fd7803fe738fc51 release26-maint
+68602 2d5a9c7e9b4e30b9db191a634c979bbdf65de1a7 release26-maint
+68603 4832a0b1287b7c6b79c4663905b1637515a997c3 legacy-trunk
+68604 d2cc26bda6a935e88a731f24649f296d9ff043ec legacy-trunk
+68605 04131c702d1726066d4611c2f47b7b7a5a32fd66 legacy-trunk
+68606 0e05e078bced3326aca977088dd939adb0b1278e py3k
+68607 8df81941de05cd59b96873901ef8dfa2b0b1130a legacy-trunk
+68609 cff4fc52c708fd3c0130258f6a45e113bf41dad1 tlee-ast-optimize
+68610 66b81acacbc05283f2fe6121c0ee4f8e268b70b8 legacy-trunk
+68611 3378eafd27df59a570faa5eaf32c14f201c642ee legacy-trunk
+68612 ae5ed15774b4f57ad9a72a2a1f1bc74ac7306058 legacy-trunk
+68613 ebfe917d0eea2d75fbd6d4385e3c12cb93803599 legacy-trunk
+68614 d0086c176e824e1d3eb398abb869ed801224fc6a release26-maint
+68615 b17ec4c4a7c38500aebda9307bd696c0b1f23893 py3k
+68616 bb86f2ed18aab0e2c240b315b54f382866a42329 release30-maint
+68618 be59a23b7c0415aec1d84034f6efd242b15651b8 legacy-trunk
+68619 e83ab95e9c87bdb938828e2599f7823f17857e0d py3k
+68620 427e43d0e031cf5c0bcc5e6439e44d0058351fe2 release30-maint
+68621 6dde0df3bb4ecb7cc2ac95c50ad2eeedf126e81d legacy-trunk
+68622 65bebe4a1aa3f91f513ec7c5fbb9d66f2471bdbd legacy-trunk
+68623 884cd3f19b20ec6f953f52936244c17106ffda4d legacy-trunk
+68624 2680a4beaea1869a04697ea201b50bc2c237f091 legacy-trunk
+68628 adb2369eb7bbd062f419e9321c05db1704e595a9 legacy-trunk
+68629 12a5b67d567d221e9d4513835f9fa68f7bbc90e1 py3k
+68630 c6995dae98a69c83f3f481f49606fba173cd2a85 py3k
+68631 a04b1c7167badddfa82e9276f21eb72733fcf644 release30-maint
+68633 8be159d6fd4043cc6f61cadfc6a34d1db11bc9eb legacy-trunk
+68638 2cc42efdd3fede51cbdf7196147b327d4bf76538 py3k
+68639 c10f6f116af0c1a8fd136646ab0503b058d524ae release30-maint
+68643 749a6b853376b695d66daf2519a231149517e6d6 py3k
+68647 0b1a8f56117ac79f8119d12082ed4ffd02e102f3 py3k
+68648 cb290482a1a7f989d4d9e3d22f984d4ecdf07c6b legacy-trunk
+68649 1e2d7f075326a8abf3370dbef947676506560762 legacy-trunk
+68650 1b81772cd59d789973314230e8ffe0d5cc153179 py3k
+68651 df3fa40fdbeda3a979ef002eecc3c7150bec1959 py3k
+68652 7bc8e2eed690bc0471da18e06b0769e3c204f869 py3k
+68653 57edf835dea3661336b4b479d97d48fef2dacc86 py3k
+68661 dc31be50c40534c48a0277f323d8c9722db917d5 legacy-trunk
+68662 1aad7d2e894594858395eb96f9f7127ce59ed1ec py3k
+68663 486e2579c978b9d28094b67799ebf33cf148bb76 release26-maint
+68664 8dfe3c4abd5b11660e056f90b67c27fcba285d73 release30-maint
+68665 27ba803bdea90571bef1b7b3a0b8c472df8cdbc7 legacy-trunk
+68666 af02b6e42142b346a20696211c91b5e862ce687e release30-maint
+68667 e158c70511feadb9fe5537a7fdf7a433e20975f3 legacy-trunk
+68669 e56c5f3b6e18fa69618b3112273a8ec2423ed89f py3k
+68672 43e0b1ee1c1b927dffd70278874f912faee97bcc release30-maint
+68675 a60b86a73e20426bd280ffbdae72b097ab57067e py3k
+68676 35bf8f7a8edcc2d491ceee58db81bed4820dad9d legacy-trunk
+68677 db21d121ba53f5d332b8635c36607780d6da7161 py3k
+68678 bb9c6524fdca4591915b1d97ca83f6c45810c096 legacy-trunk
+68679 562052a03476f977b27608554849dd42ae593c62 io-c
+68680 a029c5790e41fc2c7c0b110472eac57d3a469d0d io-c
+68681 d7220feb7d0b880b541b44ecf8ac6249f59cd5da release30-maint
+68682 f3969f4f49e367a74fbe2d86f103f52316079c65 io-c
+68683 b3c19b676f58683bf44228dbaa80e9428f5ee59d io-c
+68684 6268248720d664ca1d644789df6ff4d45d19159e io-c
+68685 3c5551a94c7c9988a92b534c857675bad73ee7fe io-c
+68686 d96f53f677dbed0c7e0fa14e9dd6749fa5ad1039 py3k
+68687 8ab70ec2af5bc308ad76dcf9b5ad04a3e3e813aa io-c
+68688 0ddc21df9799b9c63aad3d4c5e47da5a8dd3bf5f io-c
+68689 aed0c79809e49f0fbc7efd9cf31a0d3e895a82b6 io-c
+68690 75009d4863c9d34345c717419217651ccfaa1a08 py3k
+68691 29edf26b9c23efddf0d3f0a7ae10fb43d729e5ac py3k
+68692 99f3c34d7328e2c1aa2d3e4e2c7ec8db9ddea02c release30-maint
+68693 8ea17f27da67d241c0da4fb2dad4da08a57103e1 io-c
+68695 507874f655acba427f14ac91c205ac081f2a85b0 py3k
+68696 33c4f423aebf21277c737a612d2be08c379f2b27 py3k
+68697 fa651a1c34cc68a86186f912b482d753ccfbe541 release30-maint
+68698 aac51b70c74cb2b0f08d548f411b12366e748df7 py3k
+68699 e3504335f480a71c3b8ac3ec552d71a4e30a1868 release30-maint
+68700 4288546a4238c2e48ddbdb4df35ef332bb6e11be py3k
+68701 6e97d71d61c25cb1b398e5bbf55cd3b1a748244d py3k
+68702 1ce1bfbe7051de17cdcc72620092c6b556fea557 py3k
+68703 9c7f198f9b2520f90544efbff24b6636b7ac5dc3 release30-maint
+68704 20bd1178fc642d69560b457ac0296b7ce6b71a1f io-c
+68705 b9cb36465dd2a07d1f097d7c37734bf27a3b6181 legacy-trunk
+68706 10c38bc6737deb4e2db844c93f889165fd07d6d3 legacy-trunk
+68707 e554b8bbdeeaa922d004d34115cf3ed7bef57a88 py3k
+68708 b4baa725284a6d28b9e4c00e0d207a5b0f4bded9 legacy-trunk
+68709 0996271e21d8c4c93e20840389c38b1eef763c4d py3k
+68710 9e2ad440196bf2440a047cd3deaf91b8b92448cf release30-maint
+68711 e91f64f5d955821a8f195f1a50c54701ede7ecd5 release26-maint
+68712 c86347ac66635221bc5826f1bce2896d52317199 py3k
+68716 408c8dcf0248a16917ed85bf66105c820b7c1602 py3k
+68717 44424957eadf67053742bdcdf682f7d7a13ff5d9 py3k
+68718 189d5083029705525bb4f9b8efec230730308a1f legacy-trunk
+68719 8f32ba52b20d893598bbdcb84090e8cd087c836c py3k
+68720 d2dc6d043c21da9708a0977ecb3ce73801e4bc8f legacy-trunk
+68721 bbda31dd97975bdd35c314c81cb438a237cbff03 legacy-trunk
+68722 9bbb9ac061c0d48fd489a13b3c78ca6665a371f5 legacy-trunk
+68723 8325eb0419210c2b677e07c6d99d5f1dc9d7333e release30-maint
+68724 f6aefbbd7045e9dcbb8544692dbfa147885255ef legacy-trunk
+68725 11cbf39c316f7f745b26a00b6ec9300f63dbac5e legacy-trunk
+68726 d71583860634670b83c33338f652e2caca0c70ad legacy-trunk
+68727 e7d6e5f519ef25811b9a086e2c1a7c11157848ce legacy-trunk
+68728 8dc479b63e03673b284265d06c27733345a7159a py3k
+68729 a819927c2a1398c8df10037f935de697d61a9529 py3k
+68730 f3ba5f99da50d0b363d79a0b7fe251af984f70d5 py3k
+68731 b92e695d561e5a8107838a1fccf22b9813910273 release30-maint
+68732 7587799cae1cb0d318510a988e9399e71a9b763b py3k
+68733 7e5cfba54e34801cfff1fcd667becdf62c804d02 release30-maint
+68734 6a76abd616dedb16419900e96cc51ce969434567 release26-maint
+68735 ae3a106306a808b384ebc6262398220c970f613c release30-maint
+68736 50f5c29fce26d31cb84d6b47aaa6a4f5cf4a17b3 py3k
+68737 c1c44a0ab438e6ab2787794e78ba4f1e998c979a legacy-trunk
+68738 c513c69118dca614421f193bcca11a79a808f809 release30-maint
+68739 5b48d60009167626816e9594d4c56315db517fcd legacy-trunk
+68740 9ecbd9a101d837d15731426fc8b11d8897db9c08 py3k
+68741 49d9708d7ea39aea166770e6dc33da1e3aeba843 io-c
+68742 c9e5c2ca62c3e2c3e9cf841054a4043482477cb9 io-c
+68743 9f6274fd7a9df7c37a820bbf26b4e250aed152b3 io-c
+68744 e14ec6d18ab81f523eaf3d35aff98e628c032abc py3k
+68745 1ec35beed2d014dcf611acc0062c7485e587a14c io-c
+68746 9f45fa27b838ae0b69f70258242525aa7494d92f py3k
+68747 bad36f492081e7dd1b393ddebbe3c6adb073fcdb io-c
+68748 581d8602f3f742f4031283605870ae822be973a2 release30-maint
+68749 1b229e7d818bd52747940157cf071c36de8b9871 py3k
+68750 0788d45bf7a47e9470d27ba1c503ebc9ebb760d5 legacy-trunk
+68751 fb7f231ccd3ec7771cef11edddcdd3d4f2a4c49a py3k
+68752 59de06547232a4928c3bdbf5681570d0b171e077 io-c
+68753 59ef315bf00efcfa524d425e08b00f3d7048af41 io-c
+68754 65818cfd48265fd2213d11ec97737742bed41dce io-c
+68755 a991be6a111d8684ffecd9bc4f5267b088c1fd37 legacy-trunk
+68756 1c16eda3109e5454f43c044b4e3953f183b53c0f io-c
+68757 1faed7ced242458e7f6d5aab77b7c1d9be39673c io-c
+68758 65ef462921f73926db739ffcfe1ed50e4379f55b io-c
+68759 e108c9806cc3f2102ef388a5f4e6bf58f38bca89 release30-maint
+68760 a6611615c76baff5c910abb0ebc7ad3619d5822b legacy-trunk
+68761 611461a8c7851bd0550b288ce9ab0835f748395d py3k
+68762 1c17d5cb15dd598ac6ca49a9c4d3fcaaf31e01aa py3k
+68763 39187b3e12e05129b378f512b42240e85442b41d legacy-trunk
+68764 061c51295d326dda45ed907b24cade06ce5cb043 legacy-trunk
+68765 18441b8f7000c051d93c039f24c75da721107171 release26-maint
+68766 e7c100af81ec28befa53244780bacddb77e76175 legacy-trunk
+68767 352f29db5ebf60b878068d6d891bfcc23b8b1ad6 py3k
+68768 95e8d85594bc92d0f486cad602d0412c7b14547e legacy-trunk
+68769 fae96bc919684795e9a10c1ecb05a7953d871120 py3k
+68770 ba34dea5d18c3f3a0ce629c7fdbbded1d5b588d0 py3k
+68771 488e8e6f1cdc633d211baf0cbb391f6707085565 release30-maint
+68772 6edd29a343548f22d16f928bd7d0695a2338dafd legacy-trunk
+68773 7cfb59e39782609042a52857747b7c68910e042c legacy-trunk
+68774 aeb2bde203aacd9f039ecb73f3384afa2f1f7637 release26-maint
+68776 aaf96efc61e542db326a2f66bd6bdc820fcdb9bd legacy-trunk
+68777 015ea7b21950a383c9a3607a18e1513471506fdc legacy-trunk
+68778 a2f58204e680b87ae34f928b1a40e30302049a5c py3k
+68779 fa12c8e5ae8acba866ee7658d12bf7e65f0948f4 legacy-trunk
+68780 75bcec011eef6d2da5a66b695424bb3b27c419c2 py3k
+68781 611d9570b4cab24f6e1d995b2e6005322cb0a3b2 release30-maint
+68782 19fa6f9ab5b50073ab32df6f352b6ad612aa6d15 py3k
+68783 caa79d2389172aeaf489034bf0764812a0d40c15 release26-maint
+68784 af36ba123c1d2acfa24748b5199467bbc06e4d8a release30-maint
+68785 c3a0ee51d8678130c509064cdfee7c3010c83f10 legacy-trunk
+68786 2f54eefd0073a17a36d9c4781713340f58dd7941 py3k
+68787 6067a1e6289a1357c7f9913bdebca1e3f8edcfde legacy-trunk
+68788 537e8d7284246949c59d8a01748e76559080fc03 py3k
+68789 191b7b3ddf4fa4cdba5a331b7cd3a51a6008dcc0 legacy-trunk
+68790 38021b8e14aab1276f072c10ed9c22707ac91b89 py3k
+68791 a63f7cf3793abfe0ac67a330b75f60b389707cd7 py3k
+68792 390668e20628e40c832d4c25fafb3606a4592aa6 legacy-trunk
+68793 8d66b82a10a3088c60adf846409fa7af63565eee legacy-trunk
+68794 6a6b590912fe6f32276739a15824c170cb205bc6 py3k
+68795 5dd879867cde20260f390bbe9832e31dc6238bff py3k
+68796 5c3bf31d04fd6a8d719693f1f82ff75b265ba6bc release30-maint
+68797 fe2871aab9d98848d3e2069994d31ab0a821d2a6 legacy-trunk
+68798 2344cef7ff4447454d961a8548bc17b685dcae02 py3k
+68799 5a041d9a51cd66fbec5234535bc9451dd1aad828 py3k
+68800 cc9de197df7e1191d16f61d39a988091664c5b22 release30-maint
+68801 cc078a575eed307cd89033c73119b6d732bc1d3c legacy-trunk
+68802 1a64d2f56b798ff60396a6123daa280285229350 py3k
+68803 a83267ad2fd272054c1afd4f9f0c2cfdbce10ac3 legacy-trunk
+68804 fb71c15620ee6f999d95b32c08d6834986568093 py3k
+68805 dbc14acdde37f18897ab132b871c9c64e84c0e4f legacy-trunk
+68806 1f14842488f08fab8fcb845a24dd7a1f1677c49d py3k
+68807 61f1cb16e7b42e796efa30cc309667c24bc56cd8 legacy-trunk
+68808 36e266b2e46098ebc31d0c84928b60611d60ffd8 py3k
+68809 c7bb33207495a8cb1c72bfc7bbab100405a3ccd6 py3k
+68810 dd5624439be508fd442ea44564e76e8c0c14cf6e py3k
+68811 733388acf0b65cb79bfca642c93ac26b72dc7cb2 legacy-trunk
+68812 f13527484ba3ab44f6a1c34520e26f1dc1e383c3 io-c
+68813 424a509bebfea2030f8e56b0c392d60892a35d12 legacy-trunk
+68814 d1de077447aa4f34a31cdcf0019341769293ba2f py3k
+68815 32a22fa13b99c796030e58210efa143d443069ed py3k
+68816 b20e218d6f00f788bca4d5a854b6f439df650602 io-c
+68817 5a880bda6a6b785f45524da7b067f341a5f82d1c io-c
+68818 a57d10d6bc8931f000206176d505aa0f2ca19ea5 release30-maint
+68819 ab0b385aefc3e9b604122c3c5d9818683c1bbf05 py3k
+68820 9f294eb38190e6434d5535512944ec4ad2d65036 io-c
+68821 c775207cedad794056095649a6f0b72004c1c4e6 io-c
+68822 53901e6691c38248f11d4cb5ce992a5dd4e32ead io-c
+68823 0e79d5a37233820363f6ab933f7741c7e8c4e153 io-c
+68824 c94f98c5753f970b5f1126e863c88b240364e1cc io-c
+68825 7ed9beed87155331925ca09af76f335ac092ec37 io-c
+68826 766de496a42d7f0d1a742a8b884609f7e4a14d4d legacy-trunk
+68827 7c30ab0134a1fe6346fabfa1c70f7cd3783f1bad release26-maint
+68828 2b3ecde176fe501793c550502805ad7436958eea io-c
+68829 252f824bb80b3ac21709fc9d75e959fdb0cd6511 legacy-trunk
+68830 cc5b460ff1ab124f22c3e2d8ae68b315142e49f2 release26-maint
+68831 12e9c5f72659049ebf032602e3048c99a22b1d15 legacy-trunk
+68832 35fb4a260a253d8f7508fa606b3382b7d393b525 py3k
+68833 66928dad81ca149b510f13f4ccc5860b2f01d5ef py3k
+68834 7106ff56e9d8bdf696d6a18dd888cf81738c136d release30-maint
+68835 b88cc7e2bfb4c313d50bbabe2940a08b74e6087d legacy-trunk
+68836 0ad8c56a7a70d0cb091405fbd2f3586aa4a7ab24 py3k
+68837 762f9f189e2e86278845b512f2a3ea2d4c18205c release26-maint
+68838 f0c955378ca3c51effcaae531077552983d37223 release30-maint
+68839 d274062816ff658c8d2a347630df2c4e73ef4f18 legacy-trunk
+68840 0ec354703d01caa4bfd812fcf44831444af1dac7 legacy-trunk
+68841 a99decedf72d220a560f2d82741be055caaae47a py3k
+68842 8763cf2f7e0c55ffd8015322f8c22215326546c0 legacy-trunk
+68843 8bf204af96910e64b87e9e18cfe656bd8111fe9d legacy-trunk
+68844 7300d6fbd914dbd74dadd580e66f30164173dc43 py3k
+68845 cbe54651e3b9853784e9ea34f4cd46402fe0e58e legacy-trunk
+68846 3f61f80e9130d17538a6f2a7ca230b668acc481d py3k
+68847 4092a402ed3e755a2049972cb472e4f898c6c18e py3k
+68848 ec70b393e173f84dd0e9e14867beb7d79b6323e4 py3k
+68850 3c5a8a3479907f0d3830047a8fffe23a0598ea1f legacy-trunk
+68851 053f3e8266016ec9a0f42f732ea2d2bb99675c77 py3k
+68853 3f13c65aec056b3fe54661040d443641350dec7b legacy-trunk
+68854 f5d7d060911ae19383342c658be7504952d7e28e py3k
+68855 b40e4b529f69bad899dfbf49010a7bb59528229e py3k
+68856 ec6f29608bf09fd449de6ebe1447338b1d01a85f release30-maint
+68857 8aed788bfcc83c751dbafcd642710e8ab36f3bac py3k
+68858 1f0a3ac8bf85de4404ff4dbb807821808cc63f71 release30-maint
+68859 de2dc09e1f7e6611df42a863fe5849c342adca6c legacy-trunk
+68860 2735fac6b0d4d3ff2e00f2e2fce217a2f19afdbd py3k
+68861 e4c86dc181e9a2044e0450f624073e836938e943 py3k
+68862 b0b621f2af5ddfc52fad39eb00b8b42097cea7b9 legacy-trunk
+68863 72bcf0a0cb31d41a37b3a974e40ee3f8d504dd89 py3k
+68864 0940a4f2506e778246060cb83dfbc94047ad49f9 py3k
+68865 dd638b7e747e3fa55e6a5a6bea5a7ae88e4ae716 py3k
+68866 09c17127a4c99201fc57bbfdecfba4836c78f159 py3k
+68867 c954450f7abfcc251cd902b2a4f4443c239af8c0 py3k
+68868 04c95fc3765fed7c58a8f432975559673ccb17c6 py3k
+68869 ace75b06a6f74dc596ca8f4ae463a2de939fc0fc py3k
+68870 aeaa237ebad7f795b72cb0c889ff9f7e92fa50a9 py3k
+68872 3bf77ea1db3e23deb943030714c694ec591f56dc py3k
+68873 a823c9f3a452bc219184fd6b9b50ab3f4e52bf8d py3k
+68874 b0d593d412120c7af158955bfe20dbb72f00e6c5 legacy-trunk
+68875 857d66341ff94082938f1d98bf2d83fd32c1f307 py3k
+68876 08e9bed6a1f85f9e56465dd866a3b162f237096b io-c
+68877 1af4fa18bcc2065ae41c8f3d705c721586dc71ca io-c
+68878 52ff0579a41f19af48aa442b37ff40b97ff663af py3k
+68881 a4f25c380f96b7f3ff2069528dd8e84fe2cc18d6 legacy-trunk
+68882 5c7312ce5dbd062e882062525124aa0398272144 py3k
+68883 048eb5a8343be09ca743abfc4fc257bc97d5492f py3k
+68884 bd74e866f9caf817c7eda0999aa6c4114c20c3c8 legacy-trunk
+68885 fc38f2ecd2ac2773df8f66ea07303431f47857a7 legacy-trunk
+68886 6f761e5714e0919d4a2767ad906c59142b416ea6 release26-maint
+68887 cef0fcc91559ebb5d160ec9191dcb9e9026c1b5d py3k
+68888 c9b9a5041ef521f56b1dd4d7c38973a46fe64e1b release30-maint
+68889 540611ae61b86fadaa33944bfa82d771330c8feb py3k
+68890 4eac9941538c5bdec8d298856820df14be23fc2a legacy-trunk
+68891 db0ffeee6e507036985c62bfd08923f28ca9249d release26-maint
+68892 25034c8328c7cf7ad51a4e812511620acba417ef legacy-trunk
+68893 f1af40804ade93b9b3b5a2d15c00b3710d02883f legacy-trunk
+68894 5132a13f169a3414bef75cf450aea33b29272b24 release26-maint
+68895 27d2fa19084a582e46863e67f0e271dca2c3e52a py3k
+68896 7ee6fa0602be92712b04de2df3f2ac32ddc3ed7d release30-maint
+68897 a1a52873f9fcf065cb838b4ec18f22d56f915cd3 legacy-trunk
+68898 feb4a092b871c67ecdf4c3fd068820d599f1c6a3 py3k
+68899 a6a6369cfbccdadf8a6e594f5e3d5aa874ffd76d release26-maint
+68900 99f0b0265516b24396d33646fd95a211b3f4036d py3k
+68901 59d5e70f3494230dbd0171c75a360839e6977953 release30-maint
+68902 578dd78fb557352da89842824cf9aa16f3245aa4 release30-maint
+68903 6d5517975fd245734ae5f2ff995e39739ea3998a legacy-trunk
+68904 843c17868b52b4f48eafe4856b8a3a7e0425fae7 release30-maint
+68906 863ce6c036179f4c74fa9f70bcb8e718565b90a2 legacy-trunk
+68907 0139648526d9a8fcf7c138308c7b0e24300bef45 release26-maint
+68908 9a45e2cad6a1f3f1b4fe320bd589dbb3a8f2e377 py3k
+68909 f7f3d841da2c6c1fa6e0017d59257206cbf50964 release30-maint
+68915 f5be6caead03d890cb51bddf9d22aac243e6de0d legacy-trunk
+68916 4e8f28b3ea0a8efa03573073e074dc585a538106 py3k
+68918 ea5767ebd9032ad8a8bb48ae9158d980057eeb06 py3k
+68919 c26f1af26bfc22af9a09533b9e91cb933efdf71f py3k
+68920 c4c4e4b1dc1ae631ef98591a8f2152c0550b5cf0 legacy-trunk
+68921 99c10d647f326f63618b2d8c91e19cfba7c91160 release26-maint
+68922 fd8af46d361543c74f56758ef6d012dea32c6453 py3k
+68923 2c7d3569882de35ceea35daa96eb084a9a325a12 release30-maint
+68924 d86e23318b415dfadd3b213cc89695287789aee8 py3k
+68925 551257c8058af03a746b0c051f749b31835536b3 legacy-trunk
+68926 e3ceeb7eb9010ee7fdde4a13594abe9d2ee89001 py3k
+68927 21cf96cc22163a956938c6106cb85ebbd4363a63 legacy-trunk
+68928 2819a4706c8112f4ba6c62a7e373131fa92daa8b py3k
+68929 7d5fa52341e232300cb7b930857b09972e25f90a legacy-trunk
+68930 75d0f618e1dec5af8dd882d97fab7793a2aa848c release26-maint
+68931 50f40f2c37dda57f4c384a1b8bde096a9abe08d5 py3k
+68932 cc8130afb039122b941351134d44c87d61a325f3 release30-maint
+68933 7a5759e856394fd473bdf9c5a840f5c731822838 legacy-trunk
+68934 471be2c6457eea35252808b9128561a1d2dc4619 release26-maint
+68935 01132195f5625158e78f26a1c77afb91db1b38bf py3k
+68936 3369a5acaf798365af4c781185761a455195efa2 release30-maint
+68937 c9fea35b873ea1a783623c1ec639ca8a1db6030e py3k
+68938 10f4a160438891cfd0e53fd5cae36597771829ce py3k-issue1717
+68940 e0d9c659f7a6c0e27891364b9d0f3714e93d2b55 py3k-issue1717
+68941 14ace205447bbe238ead6458a33018afef84ecb2 legacy-trunk
+68942 e4705ff626f08b494dd82c0f714ef8858b5ca804 legacy-trunk
+68943 a5229237eb50cbf368f90062f907f67e58ecff4d legacy-trunk
+68945 4e82fb1aeb0222a0f8c480c52f88898792274813 legacy-trunk
+68946 6a91b3adcad6e6072a417aa00e72c947784607b2 release26-maint
+68947 c851ed0cf65fbc6eb38eda2095dc8cf8739c041e legacy-trunk
+68948 096b488438e924ec89e7c28475c45e30202ffe5d release26-maint
+68949 c155cb38f76d0e680558f8cd0108cf7f588d65bb py3k
+68950 45a5276e5dcc65ebe2d7d6d348cc2ef899ef4560 release30-maint
+68951 21fb1014294cc67e2673cadadc6b6cbf6b092385 legacy-trunk
+68953 b4ace2b6c28f0f4215128c76f5ab97145ca10d3b legacy-trunk
+68954 fb9d2d2a435956720b6780dd4a9de2731c37ca92 py3k
+68955 dfacec8ba6db4e9612248ed8efef787695dcae65 release26-maint
+68956 b94e9ed3559c2734133dd8c0f148d235abc16ac2 py3k
+68957 c4d31f97990e95c29008d558b65b0e5460479c09 py3k
+68958 04a33c47abb5f11773b0b90e93822eb15e76922f release26-maint
+68959 5203794c7ea21472df6cdf116d9118d55b5804ae release30-maint
+68960 35c6937c01275c1e0226af6f8ac6ceff0b7c41fa py3k
+68961 ad1db0ae98c6a879a9eb8aa3aeb506837131a17a py3k
+68962 1c50a17c0f21c9627915b16593d22472a99db1a6 release30-maint
+68963 6960523fadc1e4bfb44a6677ad3d0ebaa1a8f13e py3k
+68964 d513024f51775baa5e802878a93c0365088f287d legacy-trunk
+68965 b8850606d921a0ae8389dd761a0aef6338030721 py3k
+68966 02e1c5ce6a69f96ec1813df02cb0cd512ada5cca release30-maint
+68967 36fbaf7538cec25bda80c38e0716a382f26fa002 release26-maint
+68968 d42374d0aa584ba9fa94068c54efd4222738cb8e release26-maint
+68969 d362da98d0de856a64a06bfcc1bf70af6c172ac0 py3k
+68970 b04896caa29be9bbeeb87403a20096cc919354e1 release30-maint
+68973 c94a237bf497000c79f31c8901af13447900097d legacy-trunk
+68974 200829255a6a7fa7ab52d037e24718b6dcdc71ab legacy-trunk
+68975 2ea75f60d9e5d1da4ea97c0757ad24ebd1c2cd26 legacy-trunk
+68976 ca8ea52b45c338afe789de0522891411e87b4364 release26-maint
+68977 98f223ece8f272970f599af558b16368a9e5a59d py3k
+68978 0687d447de61ff8dac96b965f6b4c6c71fb340f4 legacy-trunk
+68979 e198807c55867b2744dcb6ce31a8f63fd34a8a31 release26-maint
+68980 857df6c09e12f9cc1558a8f37b3bcd69420e6a30 py3k
+68981 94c2dc5f446d676acee54f9f318ed7bdd6bf5a9c py3k
+68982 14c3ab9bd7061f610c20bb8d4dc1293057a1d182 release30-maint
+68983 c23e40d1abbc8d91ec46a1a4b8f9c47f2969834f release30-maint
+68984 8025066456664ddc499c8d68dba9d2f4310eabc7 release26-maint
+68985 2cb0c52d779fc23be0fc2badf429c67fd53c9a09 legacy-trunk
+68986 f572917183fa2ecc2af4e777a26e91cfe595fc2a py3k
+68987 f138fbe2945e5589b0a2d42df82507515fde2321 release30-maint
+68991 f085aaa46d8748fd58deed076cbd930705e1e163 py3k
+68992 ffe732dadb0d8d9841d897b9c72a1e07a3e259bb py3k
+68993 259fa8f64a97e62447d6e81834e9f51cac2b309e py3k
+68995 44512311f2bc820070b805d62d44b809e12d8a7a py3k
+68996 96d296c78fba866aa9f68e777ef68d2d78a6b37d py3k
+68997 5679bb9b5190c91ac1ab1281d1b5440c19116fe6 py3k
+68998 6c0bb548a946c7b7e95ebb78c1d5a826f750b447 legacy-trunk
+68999 7720e363c1c8ced778f03f6d3620f73c361f0394 py3k
+69000 84d648cddc33460ad7e2b622032917ac0b4cd201 py3k
+69001 b7ce675febb903caaa0a0578d99e24317d1caf43 legacy-trunk
+69002 f11a41095726f9935ade4779c9a9407ffe8e0b6e py3k
+69003 33291e1e87ec743f85bb7a1f56ae1424f18f269d legacy-trunk
+69004 4005011d3a09eca99e11285191122ecc55f125ab py3k
+69005 7e833cdeb24174586a51d09d17300d8648a24a82 py3k
+69006 4b87f31978b7e2176c68db68d95ec05ce47a0929 release30-maint
+69007 48b7037ff20e85b688e0bb745a7e0b90ddd4e429 py3k
+69008 7f0e4e427ea3d70ae8dad4cfd78655f7cb523510 release30-maint
+69009 98a855c97ff214faaba0ccc30289486a3842707b release26-maint
+69010 d170fdf4bdfb4522a64433d38f99e484654b12e2 legacy-trunk
+69011 14631c627e03742d8e9d81e6217608bef17822c8 py3k
+69012 3e4c872d02467a5716a5fb4d2bd9b976dbe9011e legacy-trunk
+69013 34027e8d044f03c889acd98d9359c88f24d33a77 py3k
+69014 a28765fd32f00a587f82a6bbc5dba50ab0a79795 legacy-trunk
+69015 7ed9ccc0b5197e731b89830d54e200a7322ad135 py3k
+69016 8cd3ced1ed2999de60c9c9673a8d1d09c7c27754 release30-maint
+69017 e718d29874d75c7f657a686c9f7f92c9378beabe release26-maint
+69018 2254cd3200f0602da1f676aa46d4989cbc3c9b3e legacy-trunk
+69019 53244c4eef223e1ee912d50fcb6f436919d38c81 py3k
+69020 547b7a17c3799e77205e1139c20c402d0652787d py3k
+69021 a6b02523b9035f5cc14906dcf5d4ed44ba159a0c release30-maint
+69022 1b320ffc0db8cae83088b9954f3f76462b9c7865 py3k
+69023 9a4fdbcf2d9f2ac75bba8d4d99307d3d3f38869d legacy-trunk
+69024 fc51026abde6c6d65aec05a7f8da8e79e076cd35 py3k
+69025 74aa43dd875dd9e5d798c460d4b4a48c0f551195 py3k
+69026 adbd77a90bdeb5ac1dca3d007c8dfd5486e97697 release30-maint
+69031 c5a52aec2ddf91e13e0e7f309102f29e1d0b30f5 py3k-issue1717
+69032 b6de6912fe146ba6bed2058df56ec558f90eac6a py3k
+69033 d2c067f9f98b95d219cf4480fce533a705cc50ad release30-maint
+69034 5feb976b18aac8ce91f6ebaa90143964f940190c py3k-issue1717
+69035 bea6b7a0b9a22f895194d26384a4676cd29f9489 py3k
+69036 2a6e0bc4bc0319afa4e6871a5194bdcbe53df37f io-c
+69037 231c4e490b1f59f74da5e9384a8c0af4e1e4b26b io-c
+69038 62ca81dd2ae887296dec5713ad3e0c501f37b455 legacy-trunk
+69039 b674706f3b10ede2c6e542d44292ad8ced9880a5 legacy-trunk
+69040 1434d1bc667f728296d66375a2e1756f1041b57f release26-maint
+69041 ab1146551255231aaa876c846aadfefe382b2ec6 py3k
+69043 0522cfee879a11d33d4c1d9f0f03b27148492eed release30-maint
+69044 840028226ed53eb6f3b54e4fd1b50d8090b75c5e io-c
+69045 04ca57bb71083939394d330d338c651b0f2fb058 py3k-issue1717
+69046 4ab508a5cd7ed0a3521835696ff2b596305b6b00 py3k-issue1717
+69050 c101f78aed8b51b38524a88f749c3e88237abb3d legacy-trunk
+69051 c9093d41590eea2243c9b0ec943258bdf4889f48 py3k
+69053 f06d900272994864b25fa577b376873dcdc12243 legacy-trunk
+69055 d690129d7dac25562e9cdef9d5fa90816ea35f1b py3k
+69056 fd4bebf9dddee7ac97777eae781f80dad9bccd88 release26-maint
+69057 3975725a85b5184ab7255fef7b3d1cfa82e7db3a release30-maint
+69058 8d603e493846f87b0ac02661c722ef4ab7ca8ea2 py3k-issue1717
+69059 bff99a81824a70964d2d1ed274a925abdd81caed py3k-issue1717
+69060 ca4dbe4ae629f4314259ce88c418c09a851d72b3 legacy-trunk
+69061 946340fb114b530f34e1e4df841a1298a8338211 legacy-trunk
+69062 1884d088e0accecf8b13ba38375b991e6f4479d2 legacy-trunk
+69063 0a8a7c457f1bbf9bec96b9988dccb10cd8050c24 legacy-trunk
+69064 5fc607b6e42d7b79a76f37e179c61f4096227907 py3k
+69065 73ba0f4db0d5910dcf22861dfa011b77ccb4c6ce release30-maint
+69066 d8c522d600e4e3e49606a61462a895290537b1ce release26-maint
+69067 4447bc1f5a51214f60f68963a9e9f89ce8ac7e5a release30-maint
+69068 9742e8a4dca1f0cc39b65083039d15a4215a390b py3k
+69069 9c1f06b273f72c5623e91f09417f1e2ce0d9bd53 release30-maint
+69070 9440468083593c522db984e99ad2ff109484c0f1 legacy-trunk
+69071 9c5aef9f1fa727e79a2bb22544a64cd000c47626 release26-maint
+69072 f0a1bf2490105edd8865ab3aed145588037e9a7b py3k
+69073 01b9c5d99ebe234421d6da00681dfbf06e01b484 release30-maint
+69074 519b21f891ebd5aa8b99bd26b01d16768338dc89 legacy-trunk
+69075 bb639158296e765626a281c5eb379066423375e7 py3k
+69076 d877dbfd4bf939e12956efcc80042920c4d5ed7a release26-maint
+69077 bedc6846844dbf0f5914a44285c9bfa7e65463cc release30-maint
+69078 2384c04edbb60bb6cdd29e737431ac9f326bb0e9 legacy-trunk
+69079 a3304190d8aaaa915087cc5b4fca691a25726e68 legacy-trunk
+69080 9a9d26e842b3315a67b1773612b60d39c144904b legacy-trunk
+69081 3228929ecb6d8483379d29f6d0d2269e47c7c027 py3k
+69082 d66e1abb3a98cfd6c7bb8605946597fb23a7bd8b py3k
+69083 7ad996ee33341df0681f349903ec0133e6abb05a legacy-trunk
+69084 725b208730a5934914f97ad7397000d436416348 release26-maint
+69085 07ff281be02c5576aac40d60441f025da7f8123d legacy-trunk
+69086 4f607c3ae8e2d173f2aa83ab08396006401ab8a4 py3k
+69087 7cb351c9cf40247e269372e7aa8941054f501d90 legacy-trunk
+69088 4b8976ea69660a8b24445e7750d540e7967f8086 py3k
+69089 9eb84fc436fc1b3a5a4c6abbb43e0f6cf034f8bd py3k
+69090 4abcf9d1b9380fba016e88a49048d8a764e6cd0d release26-maint
+69091 14e5b6e836800f82a9977e411eb1f058d7ce0aa4 release30-maint
+69092 0b667e393eb348701fbc1aaf610755725f4b96ca py3k
+69093 969346dbf31e204c616df6cf0760df620b68b5a4 release30-maint
+69094 daae8c324be1b91913f54cfdcae697c453eee272 legacy-trunk
+69095 d1629a959cb850469f6bcd1cdc3c9ba33a65a66e release26-maint
+69096 463f6c12f1d4c25113f60e3b709c9df381835274 py3k
+69097 d85714574c8a5035b0d940b4ec65894ae775db2b release30-maint
+69098 bcb6ad1cb55dfa32a4242d6e38c9ac5cdec2f1ec py3k
+69099 af94ef38b5c0f27bce95d0910454858066038f5d release30-maint
+69100 3c290bc21d2c3dab95fca6a99ce79dcd2f043478 legacy-trunk
+69101 e48c5914da818fc911767ae7ba64db81a96a3416 py3k
+69102 e2dcad56e40e031749e7d38008d7bc7cc5296a01 release26-maint
+69103 5d0eaeb4134d7ec9d3787bba3e927d3d88ec66c3 release30-maint
+69104 4a4a7437c5e1cf66ad4ff2566ee858713f7c3394 io-c
+69105 91ed3ece0c76a2b245b074cf61fbc65d586a78b9 py3k
+69106 fc586b3819873e63f975f3a622b543dd42bf3197 legacy-trunk
+69107 c2628bfe6a6848f287e1c92c642a686713ff1a6d release26-maint
+69108 c378c4f4a7969e1fd055977af9cc3b787a417d4b py3k
+69109 20f4afcd3b27ee6300c8ff91920c0de2b60f1b2c release30-maint
+69110 b88d377011f50da9d34b987cf436fd7499b5bd4d py3k
+69111 b48b5ddada8948e8c9532596c87e0bfcb5ba8c20 py3k
+69112 6a2896d923e3a2c26b926e93c826065663f9e92c legacy-trunk
+69113 4ab381aea658020bf2d46c454f2a7b8536677ede legacy-trunk
+69114 e227054d496dfe84ec743b1be9e2ab8996a0270d py3k
+69115 a038e8fb67c210ece18caba6723b787b3140f28c io-c
+69116 7b79688626e4ef0dbc91d62cae426da65d58cfa6 py3k
+69117 9867c849530bbbf267bc809feb3163b058c011e7 py3k
+69118 8c2c72cf2a0cfb62fb303ca63f5eefa5c6ff971f py3k
+69119 61787533395c0daadaaad557beb4f2078fe8aa61 release30-maint
+69120 e67dc4db964c89a6764d483baa474f5ed443331f py3k
+69121 3c2b35a10593bd68cf8ff79dd6f31f5a72a43f1e release30-maint
+69124 359394b63a2388ac27c098ceef2f48bea2061532 release30-maint
+69125 7fc0ad11b0af074b054a11c06c36cda1aac2c988 py3k-issue1717
+69126 378bc18d23509bbf19c8f7a5b5ae81c8525ae3a8 py3k-issue1717
+69127 23944f1d53fdfb9cd000dba8ab726c3ac42ff892 py3k-issue1717
+69129 4c9ea647eaf421de57692d0ef3617d3ee2092d68 legacy-trunk
+69130 c5e28285b74d012321b56c7b7a3f9efbd3c6ec7b legacy-trunk
+69131 7540314ff267b4d5ee03cd539f2a02ebddc067a5 legacy-trunk
+69132 02a90dc0c29a8af65b0b2b9116e6c40b4ba6465a py3k
+69133 df090597afaaf0f778b5c3b61a751fd2f7951fc7 py3k
+69134 be57354ddb11446230acbb4b19afe571291ae415 legacy-trunk
+69135 dcfd436567cef9487dd90a547a7eba3f1fda469d release26-maint
+69136 43171f557af80fea0c8e0a2a369d1d7d0bd85137 py3k
+69137 c06faa8196b3a07e66a70f7d8e2be107181b14ed release30-maint
+69138 1c0a5a9827fa97f6e1b951f6060759f9c4aab964 py3k
+69139 5f6d225e3c1dac09abb73ef588e6348a8f414226 legacy-trunk
+69140 9426eeb7f4e6a51ccdc0d0d360f2828eb78d9652 legacy-trunk
+69141 9d3c2ce86f428e21fc4eb183aa238bee26709376 legacy-trunk
+69143 0caa002f5f3d258e4d5d42a1d8b71843f9e470ce legacy-trunk
+69146 10daee3a360978b939360c81315e4b8cd765f662 legacy-trunk
+69149 cd5db43dbb65b917021201b3694b1a7fcf746243 legacy-trunk
+69150 17d401ad6a2159ff8c0a74b8f68ad679fdb5e27d py3k
+69151 bc2d94fd910c0c83508931f7e84ea65d12db69a6 py3k
+69152 1f2922ba5a2a101895f295a933944e52798733ee release26-maint
+69153 4c20583508338cf90a495d4ec91e3782f434a896 release30-maint
+69154 aa07a123194a0b789c63cb47f78866bfc2aa17e3 legacy-trunk
+69155 73981bcda5a2bbcaa58af4b4db700ef5dc856531 legacy-trunk
+69156 eb2607a6516e67bca4508a2daed6381f7b67125d legacy-trunk
+69157 bc92d83e55082877dffe520238642a2de45b2bb0 legacy-trunk
+69158 8672b0f6575d3b1cc6aecf1038b8999c73e66416 legacy-trunk
+69159 9a244afa1a9a182f4a87d957b4083fdd72795179 legacy-trunk
+69160 b477958df978ed1accd41ec213b62d61195e7a43 release26-maint
+69161 feb9934307b9b7895ebf41a427f0645dbf2f784d legacy-trunk
+69162 14842172b1522f9ba0bfd4da51a290ba377537ee release26-maint
+69163 b8ce979cddce206c71c0687f47ed772ac2571035 release30-maint
+69164 3954c9b90b527a1102ede7e6e83c5fac5e625823 py3k
+69165 06bbcb792f04e0a34d72541ba527b02222c3fed7 py3k
+69166 8d3f7dd9b6cce053dbea006dca08443f711124a7 py3k
+69167 50bd2c18eff065295c09b8d4499dc55eda6878a4 py3k
+69168 815589d62a9ae201a90454dc68b129154683029f py3k
+69169 d26d978d00664868c0ccb8fe96ec054381c046d4 legacy-trunk
+69170 4b3246c83e3f2ccac741561cba5a47df22d9df60 py3k
+69171 427f4a74f538abf46731cd85e8add9fefd4d274b py3k
+69172 d85ef26efd10376bb2135e1e18a7cf06bdf0f72d py3k
+69173 134fbce111e9b9c2d81ee048d88a319f82859a0d py3k
+69174 deedddc7e0b4d91e3e9d61158be290948452e830 py3k
+69176 386eb4b5cbb3ac61fb5e8b707c3defe61df75ec3 py3k
+69177 fbb17cab5716e3937d350fd472b67421b930c4af py3k
+69178 6bcf84d6379752be86d1f9b349938e7d7f5c0d15 py3k
+69179 766405c04bdc2944533c4da682086b1f60f6cdaf py3k
+69181 7c91f479bd0d910bf9d4c34493d0a41e08b88fc6 py3k
+69182 e9675d72e3e3b9403de40c2d1113f1510dd216fc release30-maint
+69183 e663075fd1ae4a99800e675078caf2ba6f790376 py3k-issue1717
+69184 9ca34c18e1bd3a1ef1a3185463599b817ec28e79 py3k
+69185 0162cd4f55be31d1bed2aff5a7dc693dd9f9a088 release30-maint
+69186 f0089413c12fd43e82c55e9a9512c16abc39b9ef py3k-issue1717
+69188 ba94d7c095e80f89be29b2233dbf33ac85b97878 py3k
+69189 410dfd423ef12b3c347f4de9ce73a5f58a6f820e release30-maint
+69190 e2db15196a54b53902946280631d99f5f3a5660e py3k
+69191 2358299564ea8049f8bca1aa156f1e0d46aa5f63 release30-maint
+69192 e945782477740c8fc19a9dfd0085ce33cb1d90b8 py3k
+69193 fdae4e749d2b3809f0579841fa59703617abc7d7 release30-maint
+69194 57d7d6c2b11bcc5495f7e89c9dc54fa3e2dcfb09 io-c
+69195 47d747124a3e0c4bc7089bd706eb2e51d47be2ed legacy-trunk
+69196 aef29a9ed4918472cf2b473e0f93d18f206baa87 release26-maint
+69197 8c4410d067ee7a19c7b6c67f88b38ae1ab3293c3 py3k
+69198 ae026d259d411138e50f07147719ccb19a96ae3f py3k
+69200 9236351b529a4cbdba8b856b7a6d528d1fab5aef legacy-trunk
+69201 c083c274f9afeccad82b8b47b3067302b97bbc52 release26-maint
+69202 2c19272d8e56586e197a2b144e70a99a8b915911 py3k
+69203 6e5ca98a30ac3853105dd1eb7055b3962668c660 release30-maint
+69205 01b3acd109dbb56248274f7514fc200abae703f0 legacy-trunk
+69206 2adf9ed6ba7e8974e7728ea199a829b914157cae release26-maint
+69207 ff683a928419340d5a03183e5671b7c535140b66 py3k
+69208 87a985a1b5c9d0dc26a17fd2ddbf98e6bfe10a84 release30-maint
+69209 05074c88373847a3bec4f3de08e23ce07ac35165 py3k
+69210 63386ae77f793f81f70a75898ebd76a126771325 py3k
+69211 fa79f122a1b25f3e432137cce1bf42e8b1788419 legacy-trunk
+69212 7b7a639b960f5c2d3cb837021985f5664c8d66eb legacy-trunk
+69213 0c320f8e7e2034587322f8c9bff6e3d335ddae02 py3k
+69214 debd14c489b9219a548fc32002f4a4ee83d2a41d py3k
+69215 87fbbf22adf37ba78cf8ceb124372727eb2f114e release30-maint
+69216 5c702a7d4c409afcc231d93ade49fde75216208a py3k-issue1717
+69217 40ff83e0239531ec38f6ebd194d8d7f625d6e9f4 legacy-trunk
+69218 90821c7ad874f8933479d99296c4845414fd6811 py3k
+69219 9913c471526106742650c68b99f4daaf4abb0f42 legacy-trunk
+69220 fae1758a2346518702e1f966c8d5368a6a5069d4 release26-maint
+69221 630a43451d04aa0a4da145a7ebc8142ce626130a release30-maint
+69222 a9534391fff9f1cbe015bbeddd97894b0363c84c py3k
+69223 362d96dbe92c54102f12f06d29d3e1a2a6bce1c5 release30-maint
+69224 786c1278572cc6f378b58ee10db012bfd958f010 py3k
+69225 c21d8cdccae10e72c61e1e7e59299af03abe32f3 release30-maint
+69226 1479db2ef9cd53b5ef190144c4e472e15d9aab5b py3k-issue1717
+69227 6c8eddf24035d34cc9c2d6c9f2b17e14fb28928b legacy-trunk
+69228 ca71a44d5432229b8703fe2c82c21301756d25cf release26-maint
+69229 6251b9d321af8d95fb422a7f7d745e65a72b0957 py3k
+69230 74438fc11d05dcda97a09c12f60a2d959f836937 release30-maint
+69233 f5d1434f4d3f97e3c3682a5c5712fd15a1e66cf6 py3k
+69234 98f4c90687750710fb4e1a6c962c0425a71410bd py3k
+69236 c820725265ab19090bcad1617a9be8ab68c2ecdf release30-maint
+69237 d3e6f2602300caea765d4a0513378f62d2d3b6aa legacy-trunk
+69238 3880a1592137e68b891c848176a19e1664f2e2a6 release26-maint
+69239 67654106ee79574a6f4a88d8c5b4e6afe3bcd8cb py3k
+69240 7354f1afaecb45b141a0409298e796ff26db110a legacy-trunk
+69241 7ba41c0917ff7b10406ef4bc98a64b0960e81b95 release26-maint
+69242 5c254795aa07a72718cc06c86f61168fb16d5137 legacy-trunk
+69243 aea90f5f398bdec0c3ca36e1760123c2bba42b9d release26-maint
+69244 a1a71d515dd2fd9f9b50d9a2dfcf4305c82dc99c release26-maint
+69245 0f3aabae4cc646599229cda9b5fdd6184f3b0277 release30-maint
+69246 5b713045ea906e0fe21bbf1a164e318939a0721f py3k
+69247 f377277482ab5860802723504c9641c8cc66bba5 py3k
+69248 f351fb7ea1796ac094aaeab46b0c87a056f091dc release30-maint
+69249 857a3f9da9153159e5216ffeba53fd7b1bf1d127 py3k
+69251 c513e728e24cbf5668d8d8ba0161adc03e82c17e py3k
+69252 e20f5a684aefa588b450b330a4b6a1a2cb65ebb9 legacy-trunk
+69253 ec69db24de190a7e92243d076d018035b8cf2ba4 legacy-trunk
+69254 8b0882c67b6cfe1f0852c62e0a1c2dba4fa418c0 py3k
+69255 e5abafae36045c5ebbcf42717e3a7a016240a1e9 release26-maint
+69257 75521c123613acabb7edf2cc4c4f62936525fbbf legacy-trunk
+69259 5f3354c52e8b8aaae4a1744442ebb3059ea24707 py3k
+69260 e9707cc3689d38dbaad00e4947e31cb592d3eaae legacy-trunk
+69261 8c0198774ed6dabef3fe5acac329a9d5a459398e py3k
+69262 1e7a06a7f5e78b0751cd94563935d5d7568b7963 legacy-trunk
+69268 b586ca3a3062252aa98a624571fb70ea8890f068 legacy-trunk
+69271 4845abf572f146b84fba6213a1411cedf9765313 legacy-trunk
+69272 ec634e57bc5862367c0f8be892104b7927490b57 legacy-trunk
+69273 f74528776c115f43ea13ef02df3a4eb236c2de16 legacy-trunk
+69274 24566e4997ae2f675e6bc8fa50041268aa81d7e6 py3k
+69275 ce04e36f2a5599296b474cdba712b9f26d2d8985 release26-maint
+69276 2b603f7232605df357ff0055a7e53035540a529a legacy-trunk
+69277 473eb370de2cfd66abfbff61ff577cf0fccc7616 release26-maint
+69278 c91b76d8ec0a97165e58c960d6a79b91ee933cfb release30-maint
+69279 aa2eb0f242ffd9588bcc47128263208c7ede643f py3k
+69280 8e15df3726e1209a01b13f12efe8bb3957e7be9d py3k
+69281 53d6445c6c5a8d98603e7c3d333889e9aaf54a91 py3k
+69282 b46185d7e95a7a0c331f276834ff5cb56c020650 py3k
+69283 378abb281e315cd08400dbf24f5f296c512e4d7b py3k
+69284 8b18b3890e316094cdd01bac720219542745a4c9 py3k
+69285 e214bdd552fc26f4f6b2c0cac634f882b688d610 legacy-trunk
+69286 5a9424893b5fd1d6ec58943dd21f5ac468b4d8d3 release26-maint
+69287 2333a57feb98502de0b0abf20bbd13e3e01d9035 py3k
+69288 1b233c83f2a9b81acf0ef2fd4829f643f5e839e9 legacy-trunk
+69289 ca423008fa4ae650fc2dd0b3a355e87c76ba364a legacy-trunk
+69290 9217b3a475286280f061a7af19f467d749a20d46 py3k
+69291 4452eb057cc4cdaed4f9e8156b741b172f580fb7 py3k
+69292 3f277b565f76ec68d27fcde8a7867d68f8d340de py3k
+69293 8aa71c19dcb808ca81c6c2c3d1b4a17548fd9bf5 legacy-trunk
+69294 18d3729e2bac012c27fb7b31ea75701ca96e8203 py3k
+69295 b126ce707a346e803f737dcbcb848747859b9dee legacy-trunk
+69296 52f78bb26bf50f34e6c2bbf005eb345bde0e7469 py3k
+69297 eeaa259069a33bf9205bcb0e23cd09aa9e18cfb5 legacy-trunk
+69298 8f8910f3b651c283eda479faefa396fdba163cf5 legacy-trunk
+69299 8c880bbbe685c220163d16bd1d20df3b82489298 legacy-trunk
+69300 0c9d599834b8b4cc4ceea1c054efad191686af87 legacy-trunk
+69301 457957a7d6ba9baf9acb208caa0e22674a3da51c legacy-trunk
+69302 f4012e78260c5d9044f01879c875896d71ed8bb0 legacy-trunk
+69303 bf3b8e30213f6afee4007599b600a884df5f9a58 legacy-trunk
+69304 f0e5f8589a0c3d4663cf2519b50bade4ce8f7f75 legacy-trunk
+69305 90a4c666f77a857329153e0783abe115ebd74b80 legacy-trunk
+69306 41c71ad47f893d32df00f206b8d2b15410485f0a py3k
+69307 321f27a414e854adef50f4ed8fc044ccd60bf512 py3k
+69308 76239798a60849d9ec37bb5e3ee56215a3ab0bfe py3k
+69313 3fc25ae189e968a5076fb9af121c8356f5fc683a py3k
+69315 e05c6be6af100a897b93b74a373f070ce5b677dc legacy-trunk
+69316 466eb9784e8ba908aa4b62e9d50401973859f97a legacy-trunk
+69317 ef3c6d9b4feca677b946d45383df334eccfa307d release26-maint
+69318 997b2632c9b75a1cb6820de2a8d126c19b8a3c5d py3k
+69319 fde03e75bc100addba3d8e89255115b6e44c5604 release30-maint
+69320 dc85ca412079f783adab2335d81d3d480eba7260 py3k
+69321 e5425af60f3041615072033a92d3530ff201b702 py3k
+69322 a1893c6918794d0f4b271ed9e2bffc7961609fad legacy-trunk
+69323 e6a14688580ef4dd627ecba6b4076524194d6a35 py3k
+69324 50d89436aeab73deeb0ba37fddf600b4c64bb863 legacy-trunk
+69325 1671004839f8bffe29eb07eb8e1f11ce21eb98e6 release26-maint
+69326 7e1a385847a98db8f535def28606489be565e616 py3k
+69328 37431cd12bf274adc698baee3fe701cba9eb4c74 release30-maint
+69330 21c3e35315046361a00c7ce3fd53292fba0fa501 legacy-trunk
+69331 e239e977bb32a2d3a61620f605245bd5d27b99c1 legacy-trunk
+69332 a3ea65bfe3706a46e8589b351ba0439e91ce5a0f legacy-trunk
+69333 f78d7ebb96da84c62851c5cb28c10fa31d6267be release26-maint
+69334 c5022b1064ea66ee3507ee0a6ab1a3095fc9d867 release26-maint
+69335 e439f9722a7349dffe5cfb07282b18cac488e229 py3k
+69336 540fbe5c8163f498f680942ea6d6fea6e2cd087b py3k
+69337 7b8fa26528669107d1bf34313cc6ab85986d9384 release26-maint
+69338 db8efc94016f4ddcc3c209672e20ee591ec6ada3 release30-maint
+69339 d18550298af877300f345113fd6fa2a34ce74988 release30-maint
+69342 fdecb91826040dfa7697cc62efda71e668e00c2f legacy-trunk
+69343 13f1352a3f8743e39c62a0bdb6d150d508d4d087 release26-maint
+69344 20709769197274ab022da580719767e69cdd14b5 py3k
+69345 9c46d109007e6c8f2d9979621d89dd65137952a6 release30-maint
+69346 4cc49d978ec23aa55fbaa30aaff83eeef34d7440 py3k
+69347 bbc1c68153abdeb2e974cc0df2783d0a9058dab3 release30-maint
+69348 0f751153307f469e3dc0a8209f6fa4cb5c2f308f legacy-trunk
+69349 c4c612d95a9b6d9636049267ed15fc6c96ace7f2 py3k
+69350 7e28a2b0c1b1f19b53e834f8c723b138c1be66ed py3k
+69352 a00e5dcea16c8e048845f91c3929792037cc0718 py3k
+69353 7a05256136447e0e5ec1258143d69231bdbdc25d release30-maint
+69354 f981e0557c3507cb46f5c999a8668f3dff0c9a62 py3k
+69355 05d1cb053d47e4fcad810254711e99ef1f8132ed release30-maint
+69356 cc825311627580b1014a30bdb85f7ce9ec6f7f14 legacy-trunk
+69357 f387834ce5dcd34e7131626d63e25ab4a8695bfd release26-maint
+69358 54e409c2f48d6a1260b1485add90ea87095e8503 py3k
+69359 fb45111f244eb5e9ac6238e20464d83e8b7a6d75 release30-maint
+69360 183a6c29bf9c18df59bb812e8766bae9b28e600e legacy-trunk
+69361 6f40768d0909d69a462e54e461e3aa8e49d7d552 release26-maint
+69362 b4820fceda241b25d7f9160f29dfdf2550f08133 py3k
+69363 db46f82d0a1d1de436d2f1b04f2f0b6ce45d9e7b release30-maint
+69364 4327dfa68118f99b1b97803720cd9492a5047bc0 legacy-trunk
+69365 18210afd005a710845bb4650382285be76027723 legacy-trunk
+69366 c9affba069eae5954365ee4196545fd809bd9d6f legacy-trunk
+69367 28e430f14c0dcf4337621bac7a28fd3e412f1b71 release26-maint
+69368 19db379bacf83377282b2147b27d8237367e4b25 py3k
+69369 f2df10ba605485f3d0628d2544402fc34a17b19a release30-maint
+69370 96fe45de7f26fefa65d58edc1282db3c5a4ef579 py3k
+69371 1ce036b880936401ea159baedfc2923be5167638 release30-maint
+69372 d1e5407d5509bad8cf176573f9598138c0999cd4 py3k
+69373 42faa8054c3dcba2b1698d1aa8a65ab7030e6825 legacy-trunk
+69374 baa88e9e9766ca8d92465a13080d45d5c5dbcb78 legacy-trunk
+69375 2a40d981c652a2c3cefa7b84a8be37c90fad99c0 py3k
+69376 d4613e970498a4ab5e6ca6a48b6561535ab5b069 legacy-trunk
+69377 9856c4faac0481bd704fe32610dad9807324f3ea legacy-trunk
+69378 b4e154c8a38a55b7c922778685d2f0d4b57758cf release26-maint
+69379 d2de5da0f5634fb83fd868085b8c533932357da0 py3k
+69380 58b7dc9c9557b7bd92d497df1016585af81ed39b py3k
+69381 c02895a3ed6d57f3f86b44c06be70be27c6f4826 release30-maint
+69382 e17b37c35c7bb24051dc95b5b49cc2c6630c9db0 release30-maint
+69383 03addd14e6f2c31ce7f95c83238b2e44d5da7494 release30-maint
+69384 8197166aa19b7dc33e47c90c380e662c964f4bee release26-maint
+69385 a7132db6909218f021e03f014592b6b6753e1a35 legacy-trunk
+69386 7ad1ab9906ee5aad8dff848efe9be172227aed94 release26-maint
+69387 b091bf834226a39a0292dd0d4ecc5ae92b43f944 py3k
+69388 6e93dd578cb8660ffe0a18bc13b088da79f0ee70 release30-maint
+69389 0151c514df569ef1b1852d4fda7e13c73cb485ad legacy-trunk
+69390 207d0ea953df18550cfd70da008ba551e48829fc release26-maint
+69391 0b381b423cdf7239cc1b1877134543b3fdc31af5 release30-maint
+69392 66eca13ede183c2e280dd8aa6bbed3882636f92a py3k
+69393 811546770d20f60cd44f82791b453982560a3400 release30-maint
+69394 4809afa85a9b6be9ba6302924de05b9e7adfefbd legacy-trunk
+69395 7a1356d2aeef33b861bfb6702cc11a882e5d0c62 py3k
+69396 ab60bdc707106b98e1b56b7558d9e37b3d8db15e py3k
+69397 66da5283334f061b1d3805a6dd7a2223394ed23b py3k
+69398 3896133c95cba8fcd00b4812d947583387ea43a6 py3k
+69399 5cdc5f0c134c8e6457f44801906c4271cb9650a8 py3k
+69400 3295790a65be7fca79a898dbbd9690053c81158a py3k
+69401 bc58a61f817bf928fb867ada1276a19c33658ab5 py3k
+69402 43d3a95ed6621972001fdb03c5f7e964b82bb1a5 py3k
+69403 eef39b4396ffe461f656e34a1781f81d9529c41f py3k
+69404 2f1efff066b3882d7031c07e16c96564c9bf821e legacy-trunk
+69405 025078827b54086c714e8b72db3bcdf32dbe8e35 release26-maint
+69406 8cd8e236882211e4ba8639698b11790ed114b4a9 py3k
+69407 92fa39b9af13c8361d52479be269f946fbeb574d py3k
+69408 87317a889db044a64166f8f64fa239fb66ac1877 release30-maint
+69409 69b26e990eb8610fd0aef905b4a86518a0ba6d9c legacy-trunk
+69410 99e264fe23830b3c6a235ecad6b5c486b8dfe873 legacy-trunk
+69411 c21fb5efc638da25ef4186ea1dbe455aa2a94130 py3k
+69412 901cb207b1d317e68e18185277c3e8333e8a5175 release30-maint
+69413 494da2c71902d3b6a292f4e9953807fdf5d52870 legacy-trunk
+69414 9899afe0ff8c18cfd93ecddfc120a86f809e15d0 legacy-trunk
+69415 0ab36796dd795890c8bc64067382fb53f43cd839 legacy-trunk
+69416 320cd71e2c562cad73a7d9cc0dbfefe0454eb531 py3k
+69417 100ae6a8bc2db3967ce68c53dc9e9f18804d0cb3 legacy-trunk
+69418 ccc7188fdd28fc3d22077ce0b04a675d9d9461cb py3k
+69419 5cce99aa1f58ac7b9213e3f52252ed6b848ddf42 legacy-trunk
+69420 5708a1e0164590e60941c403bab213612ce7b26c legacy-trunk
+69421 2d354f4d77bcbc6c75a740d8fb50f8c87e74b6f4 py3k
+69422 1758ded44b4e0fbb471e613f7690a2ec6f318e75 release26-maint
+69423 f85ecd7564114a202014a9f45aa482824267ea3a release30-maint
+69425 117e152e513a650cdb1842495ed3bd7c2ba627a8 legacy-trunk
+69426 74d196c542f78ab8a949ce6f8762c0182fa375cc py3k
+69427 1cc61c79b9ceafaf2b0e3e739c4d671f32f3d8a2 release26-maint
+69428 e8fa10c66d183e0e9b7b7b63db6b94c626451252 release30-maint
+69429 501b1f035f2990b82c6fb6f85f62a8790e2acf02 py3k
+69431 0ed22f1aed046394080e9eaaeb56ed8e1ea3168d py3k
+69432 7bfa64492d00160a4e0f7722726675bbc11cec84 release30-maint
+69433 c5935c7497fb631f41d6566d03dd80f9b2dae670 legacy-trunk
+69434 4c7ed40db81eabafa930d46d63df771c485862d4 py3k
+69435 0eb405d01e083d3e066e881efe331e9cc0875f93 legacy-trunk
+69436 bbb8350ddbd259d16fc7eba069a7e4850aa0da07 legacy-trunk
+69437 5849a4f904a2a03258fd8cbfc2ed4b4bd434b81c release26-maint
+69438 945cb95b35bf55cab5ebb04a8fe9f6a23458ee04 py3k
+69439 4313b4d4bdc73d16bfe599283f214b4b7f32d964 release30-maint
+69440 224d0efcbf6c948d2712c9c940f2eb6a3404bb25 py3k
+69441 fd74b0c06927c9049232221b7e7979ac640d3d67 release30-maint
+69442 c332f7b4564723ca031c8c4e34a0e7fcbb506707 legacy-trunk
+69443 994fe4df4af70f57a208c1818502327544284598 legacy-trunk
+69444 6550db492f288a772ca6b25946e3217abbdcfc21 py3k
+69447 e49013f1d83143b1a2b2141af46ed17eaf59e736 legacy-trunk
+69448 c17f9281a856b1da9951e4ab485fa82812495426 release26-maint
+69449 4ea1229739143e85261dc71520721ad9112db178 release26-maint
+69450 36bc8d0e01bf735114664231597f86c467d738c6 io-c
+69451 8cfa108e7bdc3b9c540ac4690f9cba0f2808645d py3k
+69452 da0070cf46544f2d8fdecc6c7409f166092d4a41 release30-maint
+69459 e423d07f08af0a7c53a1a972b8a6e443d064afe0 legacy-trunk
+69460 dcffc72381e734f3da7e4f139ec79e289d7222c2 legacy-trunk
+69461 7bbdce5c92505261536f11cc79101be2ee1632dc legacy-trunk
+69462 e45525195317d3994eb2b6613cd86dcdaddcb84a release26-maint
+69463 47245ae3211ba69ed4dfdc9e7c170fc2777d5a2b py3k
+69464 663ce74d51757d4635b148e649ec47a71d4ad728 release30-maint
+69465 f9f2ed79b00fc2bf158302f6cc24950850452101 py3k
+69466 154e7c474aad047c9bdc5acaf9e55ddfe75d41cb legacy-trunk
+69467 6745bdaa9b49b5936ddd8430108aa2dd70128ef4 legacy-trunk
+69469 ac62432fb341d7ecfd097d2afe9eb1d6db04848d release26-maint
+69470 bdde44af974406f34e6b150d2d1108a6413a72da legacy-trunk
+69471 1a7dd9d2e7ec3e109d15453d3a54d6424d8ea8c7 py3k
+69472 62a1ed6e636ac1e56a053cf028cf09e55bf63788 release30-maint
+69473 fbbbc259b5ce88da29230c0eec950369597c7e80 legacy-trunk
+69474 d7c4d071dafaf19ac5c2b31f5a63349b69d63663 legacy-trunk
+69475 298806f64dfa3646d931056be05d27a27748893a py3k
+69476 4e7ba67cfa053739f7c6e02c916e65e08ab36739 py3k
+69477 8721c213b6f44d0e497370e7d4f72e22425cb42b py3k
+69478 87820fc65d7c989907dd5dbd3e43f96d0f977627 release30-maint
+69479 a90c9298dbb488c9cc0aa32dcde884ba05387bfb release26-maint
+69480 beef8818a66c21be581278ac613af1214f81ee2b legacy-trunk
+69481 584c47d8c93f1a754facd276b39a108071d2e04a legacy-trunk
+69482 5e7d7fd1da5a7faeb5e4beac2abaef164f26a008 py3k
+69483 ac9ef7431c8f134c2072bd5ffe745c9178ed0225 py3k
+69484 e759da93df647f252fc45c2114265497da602fc9 py3k
+69485 c61f24ff055e40d1333cc938b8c0ac7b04de4d20 legacy-trunk
+69486 1307a66a38f8d487f164c2aa77ff26b9ad59022a release26-maint
+69487 8a28d99f784d77ac41fc71e3b8a2a4b9e354c6a1 py3k
+69488 3423f647b54a65c2cc1cdc878029543e6aab7e63 release30-maint
+69489 dab80635036e8822827755b7a2c1fd632e308f36 legacy-trunk
+69490 2ae770ee628417018c4708ccac8cca6462d2367d legacy-trunk
+69491 38642385b1e0af1430a801cec10f735ea83a4c9a py3k
+69492 6316f376b814bb1de3e122e0e1ead41c1103bcd6 release30-maint
+69493 bdb1ca9abce362d88f89bb154f84bf29abde9e1d release26-maint
+69494 1fec0bb509a2b5e482bd8714182eb65af81e81bb legacy-trunk
+69495 0415417cfd483b99fdd40bf169644b65f383b6d5 legacy-trunk
+69496 f0c7402cc000693a7cd23496393bf5f2ef4a98ae release26-maint
+69497 08e0f03ba81728c1e8c5e3da2e3d244cce624e95 py3k
+69498 20609fc13a135754bbc811497d4a3f37defb2646 legacy-trunk
+69499 a00745480120df90777001b475d8dd4a6d0c0dd2 py3k
+69500 058dca73ee302951fe0fd2a1889bafd8406c2950 legacy-trunk
+69501 94d9d525401c163efde089c65ec4cf7285823190 py3k
+69502 7d6cdf335a570290ab08c320c24f18958874b8c3 release26-maint
+69503 ffb9cf94c9f1399fb682a22c3ed7ff09069c8fe1 release30-maint
+69504 f358ba3d1e5363727dcf5e25761208f62e1e3987 release30-maint
+69505 95bb7739e386cbb89255b3c14a9ffc39681f87f2 legacy-trunk
+69506 d3e88f778cdc165ade77dac06195d5c6be878d2a release26-maint
+69507 6dbe3f9a040cb8e4e4d6035079a3df5de0ba1931 py3k
+69508 972e8617dfda6d85a82727a7641f0132d1ecec2a release30-maint
+69509 83515bd28626d4295fca33ff24030e088de47834 legacy-trunk
+69510 72ee42cc9530f3f6f6fddcc0c1e4e03eeaaef161 release26-maint
+69511 5196eafcbd72c62efb213b4bfb3f161cff488ec7 release30-maint
+69512 28bf457fb34d0b9c2725dd31fccde83d27dfc407 py3k
+69513 af469dc15fa7bbd94dc15f77c86eac3a55937d16 py3k
+69514 7bb3d515b677eaf2dfd2bf6217500ce2af0de5d8 release30-maint
+69515 9c0a4fbb56b90ad3743741040ad00cd8510408ff py3k
+69516 dbdd94cd07fb46ac05252b651abc19dbe3322f44 legacy-trunk
+69517 7d897064a6efb6d6723f9e95b2450b63fce51b5b py3k
+69518 4d9b52fcb5df9d99d142d4451c999c2940ef6940 release30-maint
+69519 edcf996f07e98ffa18646bc9102dd343ee713e28 legacy-trunk
+69520 29a9e85f30bf7f871859cd853de7b603481399db legacy-trunk
+69521 d69769b4fd20a45822497723544e9b896e271bb3 legacy-trunk
+69522 cbd53ff495570b8a65a38a57586d0e83227d4d98 legacy-trunk
+69523 b0db109089c968edb687b46b83e445a9dab8aa74 py3k
+69524 2ac02daef2ee38e98f1a8098298bf8374047d395 py3k
+69525 43585dbf61d57a189e8730cc4d1b5ed1ca6f0c53 legacy-trunk
+69526 cb8190a1bfab9c539f8efc93238f2960d0aa6c28 py3k
+69527 2bf5ed671d02c1162b68d6fdbc59ca73bd18459f release26-maint
+69528 df69bccdd363bf2742041eb594e07a6546f27b90 legacy-trunk
+69529 7d29c6e8ba0558075139df8a8df2db05acd5d29d py3k
+69530 099e960676b9f064d19f0461a84153b39f0d2bc3 legacy-trunk
+69531 1ae34a48b7392008c77deec489d83312e01a9606 py3k
+69532 9677dd0b09e6b627f7a4678002f7967ca3e560ec py3k
+69533 7fa8b7a2f50a215e47616f2dd85cd7a4168c2d5e release30-maint
+69534 217425ea2769c28155c08f5ef300c02ab43f77bf py3k
+69535 92ddba5779f94948ab3444b14b82185616c57b80 release30-maint
+69536 861008deed97a3fd878c13ebb971b705e46dd5dc py3k
+69537 5b501196fc383fc323af40ff8086ed9c572f9bf6 release30-maint
+69538 659d88904f5fb33e7063e81e17f983770fba505c py3k
+69539 08cc574af4f609ec22749c9d2cb296275e252192 release30-maint
+69540 189696c46c0e7f4fa25101f4671e47cd23743010 py3k
+69541 cab4e2e484a2be608ae2a36c7b9a1d3bbeaa83ee release30-maint
+69542 83bd2d174cc8d02e725f0716fb5341f13fa23f18 py3k
+69543 27c589f09a2174ff92c6ac5657cac7426388e2a6 release30-maint
+69544 971bb47ff70b6112192310fa5b8eee3af9443e7a py3k
+69545 acdb32341d87a317979fc693829807e69a3c607e release30-maint
+69546 a0d8c616f3405cb9412a92f977c2382e1f6735ab legacy-trunk
+69547 c09b501516bd0cc7620afc20ccf648e57107d5d9 py3k
+69548 5d28405080edff392c75423a5fbd63e186d48434 release30-maint
+69549 31645ead4c35bb43bee2c1ad0ba96ce30701294c release26-maint
+69550 9a932f92f394997ab35d8bf92ffc9004d6f57f34 release30-maint
+69551 6641d828d762d651c5f9ca2bba1728fddce5d56f legacy-trunk
+69552 13328f11ad295661b89496f5adcd51bee3578dca release26-maint
+69553 3ef5a0c5e6b57fd9593cc58b3b6a50ac0abc04fa py3k
+69554 e375071f950ec757ec999df7dc955c1dc26934a5 release30-maint
+69555 ce29faed7f69e20d3bc1e2a98417e767075ebca7 release30-maint
+69556 e502e2bf35e86dbfa3b588ef2888ebeaa0037e70 release30-maint
+69557 cd42e85cafe7ed6c5c2db6582676c15a68e9c7bf release30-maint
+69558 07f9e0048b0bddf1286a8f1ac88c2b932cf6c50d release30-maint
+69559 e2ea0f83f03942bd8d13f8d4a29b357c84f5c4c5 py3k
+69560 648e07dd08258f60f0a5935566fc1c4bde491506 py3k
+69561 1e7ac14e49387eb644211c05773f1b73088b03ca legacy-trunk
+69562 e6a8a164233a43b59d4559537b1b9e80814f83d8 legacy-trunk
+69563 8d36ab093d456c24d18eda3bcd032ec53f2e9a3e release26-maint
+69564 47a79d7eeedc906dff30a40708bc4d9cff1a1efc release26-maint
+69565 3bd4ae26b36497ef8a9ba043bcc919cb71e36332 py3k
+69566 bd2b779f5f312342776c08f01910507b84345e41 legacy-trunk
+69567 2102774e7a2d93a03b781558dabc4851604703e8 release26-maint
+69568 b8f10c6fad52854148f2af75cf4becc4a2656c6c py3k
+69569 72f6f1701ee1aa4b039fcc13d167d8199ff83163 release30-maint
+69570 7f4a115aae6d954da0b458d74cbb7453e5be35f0 legacy-trunk
+69571 a41e8ff6518c20359dbda2f4122d79ff09951013 py3k
+69572 52851b9d9759011def85995e468469a149008177 py3k
+69573 0946cfd6857999987a6b38a75f0f654a26c63acc legacy-trunk
+69574 68b8af494be280fe0cb45760ed788d06268ca5ca py3k
+69575 ca1d99d9d691eddb34f6dee571ea90656aecd794 py3k
+69576 c014a3b1ad3155b12e3a1ddf6eb5ab751719bcdc legacy-trunk
+69577 a83f10edb6ff15928aff63fc93cd7a52d5c49dc4 py3k
+69578 bf419cfd7b0ab94b0898f1d897b3eb91b3642f70 legacy-trunk
+69579 512c5a5de00b80b289600041264623deb5c894bf legacy-trunk
+69580 69fdf888f113a76ccb34d672b59fde5531f9db63 legacy-trunk
+69581 ec30b1fcc1b3dff87bc7337cd57f94ed8389b6f1 py3k
+69582 5a72eed1eb1a795f99d39fe96d399d41a6cc1534 legacy-trunk
+69583 08df4f5583ff52c284a7bcda1d1862a13b1fabb9 legacy-trunk
+69584 ff096d6a9222bcb923d0bddd0bc4f19aafb213ce py3k
+69585 c6ff47b3eb99fbd2b242b06cbeb674bcb36cc982 legacy-trunk
+69586 a93b19a2f8d934918a9d6580fcf740a63babd46d release26-maint
+69587 42838b4d6aa1b7642a50324c95e52983c07a05a8 py3k
+69588 ae16e2b86feb5223ca708ad3fca572518ffdf920 release30-maint
+69589 02c3eb1ca0d5f0d4ecf072d17b2f357f4c2ba971 legacy-trunk
+69591 0590c0b76e6461e5bca66368c2bf73af71a77bcc legacy-trunk
+69592 87ab6bc21345bad085660a8d0cca18c4be294546 py3k
+69593 dfcf690a67c8e9099575b5997609a778b06f2b85 legacy-trunk
+69594 d3663f09d7645a3c360edadf7081771263a77fa1 legacy-trunk
+69595 512070da7433dd378be22fdcbf8cfcd2e989ef49 release26-maint
+69596 6135ff7243dd796e23cc355a5bca881251b14317 py3k
+69597 8cb8eccd66339c963ea646ce6ef1e81658104afd release30-maint
+69598 8dc28a126b2c801eea00cf38c7c01f836fe7be2e legacy-trunk
+69599 9c75806bec64af91e6e8ab962d376bed4d796dfc release26-maint
+69600 40ed5783e24a2da5f54a05481f2d68100240f2a2 py3k
+69601 616138eef224bcd06c83348a29b5b680ceaa22a2 release30-maint
+69602 e5ca0bdb390fd781532f217e4c207bc51ad43a52 legacy-trunk
+69603 e91b04db6d19680b2ebe685e410a6fe4bd2c2921 py3k
+69604 c5607cf76801275d54b046843d04c7e46cc9f46e legacy-trunk
+69606 9cc76758ee09c075133cb4cb49864bb263538400 release30-maint
+69607 2a263d66d659780015f1e353bd160137d9772ee8 py3k
+69608 f43f867d5eb60a4d323e3c2eacd0ff07ac2b6f4b release30-maint
+69609 e5522875b98c26a625f755390c6f723d63f3001f legacy-trunk
+69610 9498e7d5b26599fe6af6e2ed7071e49290ae2b04 legacy-trunk
+69611 6a7a0e1e27bc0448de389a18e1a7731108dda2eb release26-maint
+69612 71a68dcca044e32efede0c2a0a18cfdfef5d4af0 release26-maint
+69613 e13ed484422e8155fb265b9cc8fb0f9d7cf0f76f py3k
+69614 bb99eda38c1b82eebc7a2cc246a9f900d2592fbf py3k
+69615 3cea4051dcdb6c0e6cb4e3ee7bdf1a7c8a88f511 release30-maint
+69617 d40838c5a4206fe9b3d578b8bdbc46a1b535647e legacy-trunk
+69618 969378ea4c7771c7f51131dca28ffb0513b38181 py3k
+69619 9d7a131dcb7895a02f0c37697459fdabc7c43a29 legacy-trunk
+69620 556990bb4f0acac7dc99efc98794feac033ef253 legacy-trunk
+69621 15d8b2db2be457a466d719d615a7aa26728f0e46 release26-maint
+69625 f67b48a1513ebbaaf6b7c6a1566609dd04974ad6 io-c
+69626 8ae5b0c5c24d2ae7e2aa5b8353c08557c646e41e io-c
+69627 c17cd9bec3d850e407939c3286d02a49e8622719 io-c
+69628 ade45511b565b1ebc95363f3c9609d46ec96a004 io-c
+69629 77306ad930a334ebc3e7ee4e784c77c146399a5d io-c
+69630 5fd3ad549917cb43926d97a1a76317253284b123 py3k
+69631 ef2cba80c975bb5d9911c9b9bbd581986d61417c py3k
+69633 3f7e073dad7b5f47d13a5ce01eb0a86cbb74a6d4 legacy-trunk
+69634 b55a3b5d70088299da09c9ccef42df1baf798d1e legacy-trunk
+69635 b8c4664a653916e216497bcca6ad490a41e7f131 py3k
+69636 5f2257b77ab0991dd807b29a67feb974baa44f0e io-c
+69637 79c2311f33cc1e2fa1ded49ecc208e97a3d5723d py3k
+69638 3f475745a3c3058989edbf6a5ca25269bc18fab4 io-c
+69639 af7d780f7a0be4ba04bc7f55384ad656590a62a4 legacy-trunk
+69640 65e0755e9bbc9d7fd4000940fca4f0eeb1a6fb09 py3k
+69641 aadef2188ceb6fb6ba04eb9574ad77fd088f72d3 io-c
+69642 2c4a331cd32a8d77b3d6a2c642f14c14db30d049 io-c
+69643 948794ac5a52be270fcad48ad4bbeb068d242b2d py3k
+69644 8c6d688e4f16109bc5cba6997c50999001526136 io-c
+69645 95d775d9ab47c77eddb8b109139b756e411ab177 io-c
+69646 4fe2885d065493b51c50eb5ee05b03dd17617cd5 io-c
+69647 40c9541e61fc8965ff1902fcbcfc17888db3d62d io-c
+69648 98dd2057e088bb4f220eb4cdde358cd02a10cc9d io-c
+69649 91a3cce68e9b4610eec09b57fcda0bd62b4fd6e2 io-c
+69650 d9c1d9b13374830da9b179181b60ddae03b81303 io-c
+69651 db3cae128d91eae5e4f18c1ceb1a3fb5a56aee3e io-c
+69652 1920148779d446bb8e96ac4896273feab83c26e0 io-c
+69653 9f539d8cd9042a3c39996aca53a0b736da99ef04 io-c
+69654 28ca1df545e236673e5fa5637e6a375fcce1ea3b io-c
+69656 2406c7dd98841086582d94b1965c6c0b1e0051b4 io-c
+69657 a26db3144ae713045238184433a6edd5bf39c48d io-c
+69658 4b121bbcc92afa018ed084de7ab14d21b9ae11dc io-c
+69659 f3af4992b80b83d9a0d94f1dc63e44b5de1720c5 io-c
+69660 6da30e3abc0dd00d9cead9236c15eefa9ef3b9ef io-c
+69661 2c71902b37747d6975830d93decbccc36ff378c0 io-c
+69662 f4c49cf601a2cdc6e143cd50e70f3419cd8a2b3f py3k
+69664 a450c86fc2bc046855b862a89d4651ce36f69027 py3k
+69665 c57254a9c1a32302351c5414d90e9dcc097b56af release30-maint
+69666 076c479131349d475ad7f954fe051cb5cad3c178 legacy-trunk
+69667 98575f9a4ed3858206f861a7ad5c04940296049b py3k
+69668 a5c6215a45af09e178826f19ca1ba5f347302e5f release26-maint
+69669 0e55acd1a42669d2daa20fcb6cb74b830df90908 release30-maint
+69671 e873f808464a3363769c713a5f600fd90a686992 io-c
+69672 6a118cc4f3b78e1993058a661b1624f5064220b6 legacy-trunk
+69674 51db18084ecbaad50847a69b6b7bef8c3a559699 py3k
+69675 b39d54058a2bbf79517b98640c4cfaf3faf44652 py3k
+69676 627db59031beb01262e7125b966efd79fa8228a6 py3k
+69677 4d61fbbb45d74174ae6b4e1cdda200bff9f008d9 io-c
+69682 df7c6bd1b6092b8566b1ec1d11003b1fef893b24 py3k
+69683 5dcaa2e1bc869a6d678b6e823cec86b7359e4d9e release30-maint
+69685 0ebbcf5988dbc183ebea7c0cd323db37461a3eb9 legacy-trunk
+69686 003e00797e9100b150daa6084d4bd26344c0c94f py3k
+69687 86b60d05062ba8dbe3041dd07719fee68e31abd2 py3k
+69688 27d43d66bd09ceec1ecbb31c56648ebea4ea16ef legacy-trunk
+69689 154948e2fd1c57f1942675f4a2bb9eac2f94eebe legacy-trunk
+69690 09235889c54d14e6a668c69a7e655fb1144cf943 legacy-trunk
+69691 f308953c701fc4f61899cfee98527dadcd0e186a py3k
+69692 982f9e2925a45c540648dd1b89b5eb92468994db legacy-trunk
+69693 ab4da2edb288dea580dbe799c13a28ad9fd6b9ce legacy-trunk
+69694 e78ba8800e2ce01eac4084e9aed46545f1a29fc8 release26-maint
+69695 5227f8c4183ef51eb4fc4d54d1a0161f4a1298d0 release26-maint
+69696 54cf68fc73127ee137f01bdf219bcc4033f25ab9 py3k
+69697 29b149bc31301629e86916aa96702795cf2f1ab2 py3k
+69698 273268522e5ee928708159b6110340508c9ee1d2 release30-maint
+69699 0c874799a190d504d1d033fc68962bd4716bfce3 release30-maint
+69700 7101772eae805fef911209cb7e2900045c74a4a4 legacy-trunk
+69701 f505eba726c8653c7f75476dc776ab5c19af97fa release26-maint
+69702 dba2faf099064955dd7e5a8eac3f9617c6e7b938 py3k
+69703 01d3b6863387dbb596eaf0fae4fa547f8571cb9b legacy-trunk
+69704 07fad301025f019ee3261745dfcbd569087ceef3 legacy-trunk
+69706 dd2210b2dc22cbed4a032f0eeb4ce5f282b6b6e1 py3k
+69707 147fcebacb5bb0d1890b619fda1ef7e3a7e1c309 py3k
+69708 19e7685d9b946f25847b08a8ca9147aa6b28c0c9 py3k
+69709 44fd2cc9e9cc74679b2c65b3142643284ff66554 legacy-trunk
+69710 27268ef04708d8e3c30a4d66fc71a61e5bf024e5 legacy-trunk
+69711 d7726782536d95016a6a75b6e15b8004c0c3f8f8 release26-maint
+69712 257c98fa55d76cea9baab3148b1956dbc24d2f88 py3k
+69713 e548df36188ef7352848c1dccaf8af2643b86fc7 release30-maint
+69714 0c6c0572c2473c0d267cfb3d49bf56dc05a853bf legacy-trunk
+69715 d982b95be3e2180d555fa8f9bfbbf6a16af908bf legacy-trunk
+69716 798a16abf546088610fe50b9d4d30a21e903addc legacy-trunk
+69717 d6740a96a70adac16a763e07a6756b4e89b6eda8 legacy-trunk
+69718 9ad662a43eb350e47a7ca6efa675ab79007de937 legacy-trunk
+69721 85407d04778209826305adf5266e9d862d9dbf3b release26-maint
+69722 09e63214f0bf86506f9cbf527cb636486008a41a py3k
+69723 fb8606e086ea8445f69fd66207d83de8ba9680b1 py3k
+69724 92e42b1b0a6eec0f1177689b3c016ae08bd03d0a legacy-trunk
+69725 d7860bb0b15a0bfd1352ab66c9ea3d8ec209ebfd release26-maint
+69726 605ffc052b4195e334019c60fa5d585ae2304291 py3k
+69727 205a2b4c1fa546558441a183837008de774a2bcd release30-maint
+69728 1ff4b41a57c126d0f9466c00443ac48e2c9b65eb legacy-trunk
+69729 e7e544cd2c2b9462a924d1aa21d8e7d48dcf37bb legacy-trunk
+69730 6ea7d3714bdf78f2845439d5fd5dae52974328e3 legacy-trunk
+69731 5519b9dcc9b6b6447af0203daf023f496d00c83a legacy-trunk
+69734 39f09c9ed5a5b3ed6c3f119553f898b273acb6df release26-maint
+69736 2878bf815da1e8bac8bcd7474e53845c5569763d py3k
+69737 cb0ade335551560c15689e28028c8811cd15039e release30-maint
+69739 72d13ecf4fca75fb256ab723d23d26470f933958 legacy-trunk
+69740 76d77ae97b38ff6073eeceeaadda3ec9ab63ebb4 py3k
+69741 7559a03cbd30ab751b74fdc7ed4988ff751196e9 release26-maint
+69743 9bff130d792dea471f2ea9cf1e60ad729ec1e395 legacy-trunk
+69744 ee7011863943267dfc50ed555af6bf2ef0b4a9c4 release26-maint
+69745 8a292543e8719974106b41b7907245a6ffaa7560 py3k
+69746 b2ff21bbb9c54044766b3f8c384f84f2f0d918c7 release26-maint
+69747 7c7b805d0d0a8daf7ff4f658de0c7a215f9fdabb py3k
+69748 748dfe9bb857fc1efa70215a085943287e2b65c0 legacy-trunk
+69749 85fe887614ce4420e901cf116f689d816316cc32 py3k
+69750 e260d6daf7848d8400d7d395ed6f0519150f17e4 py3k
+69751 d25fc02092955036a7036fb157c9ec8c6196e596 legacy-trunk
+69752 3dbdbc5e6d85ad5ea13a5104ee5aa2aca0447bb3 py3k
+69753 03f07d8f06e46c03abf2db98cd8758eb35cfd06e py3k
+69754 33d5d7daa8c7469f13cc92ee0fdc5d27c86894a6 py3k
+69755 497eab79b1be8e91725a3e31cd47a590184f4b9c py3k
+69756 a9774b61e52d3d8d6ac53921855e717d1a9405bd release30-maint
+69757 302263e3c8f1d2c55c7d1a21e4c68afe49d57312 legacy-trunk
+69758 d47c258a1e1cefbeb5d5c399fd96867bd2a7e4ce release26-maint
+69759 ab40c76139ab4d77c920ef99e516b0e7be67e0d0 py3k
+69760 2f5257494a2e0feb26a2242a5b571e33af8a9dc1 release30-maint
+69761 559e4fc31c8a73b5f64f32d083f5cdf9a9a35e50 legacy-trunk
+69762 ea47cef67837b0eed5c59b479b3d96a9c601c9fb release26-maint
+69763 9001d9c8f71e0517a3ee3c3211234ed8fd97a393 py3k
+69764 d673da915914d7c591344c9338ad9bbdd472a22f release30-maint
+69765 9800ab236c09d455cd62acb71a038204e3add7e5 legacy-trunk
+69766 f0eac452a6cafd18fa08912b27c81f2d586539b4 release26-maint
+69767 bd4671792d5016e5e814768afb57356a6df70436 release30-maint
+69768 4342c0a2f2dc9cad448b16d5d9285fab0e173222 py3k
+69769 8468b52f5ee2c377cdbe27315b1f09511b6aa756 legacy-trunk
+69770 00f7be02ae1f1c2d0093bd3cf33cbb0e49b543f5 legacy-trunk
+69771 78e311f277a7027e1db502f92166f4f5d4ae2122 py3k
+69772 8c13f430e1606a0854e6c3ef4a1c5d030bdcab54 legacy-trunk
+69773 833ddfec0bc456be0488a5e9fc1c6805586a0f95 py3k
+69776 c02c2a908cb098f1f8fdd3fc8033f5b80a721fbe legacy-trunk
+69777 438592890e2b7ef5929a01eea090d91ec3ecc46d legacy-trunk
+69793 27933753a387f91a82c94ecffb3485a9129e48fc py3k
+69794 67eed81ba74fa6a30a806e4456d7f75b2c0fef6e py3k
+69795 9815da43a1cefa46d0a1d8117097bb8398966faf legacy-trunk
+69796 c1bf037feefe06b1ece9009811c5c405c9a2c31e release30-maint
+69797 624b55d0d6b72db113f40506c7627d235dd067a2 py3k
+69798 2f3afacf9f0b72ccd6087b82898b1f5e7a42892a py3k
+69799 1408feec00849aee0586f9afd2b10dd291664164 release30-maint
+69800 db8db31fdb4c47c01fe0f4dd75b6a094adff38c5 py3k
+69801 0b98e3791b9ec8720ca782bd5acc455050c5216d release30-maint
+69803 5a17888c51513e95da8116a07e2cfbd71d70b7d1 legacy-trunk
+69804 ef19ca013e16ee151d839a92f4b831f129f45774 legacy-trunk
+69805 082409314b007a88b3e07a6dd176492b8ec3f474 legacy-trunk
+69806 65a3f555fab73da4e74eb45bf612b0a7c645be25 legacy-trunk
+69807 164ba7ffa0eee544b4c3e134768bc28101c86fc3 release26-maint
+69808 9250c8c61a91095a95ef56d3cc2168f5de6e4a9d py3k
+69809 4d3baac2e1a20db52b1779ba5f1cf38d5608ac6d release30-maint
+69811 0848ebb8f9c88c9270de672fa156a46b4e6cddd8 legacy-trunk
+69812 c6ed5bfe3969a38b4c07f7183caf30abdff7fb56 io-c
+69813 e08e4098a4e79b417c55ee3d1373cdcbbb751351 io-c
+69814 4082eda8b4663b14516ce6960c052392c6a979e7 io-c
+69815 7f83aff68c166cd84e32eec16f62de95b7be5177 io-c
+69816 1aac7520437a6fd4a75749907e67f77f6b629916 legacy-trunk
+69817 c05c30fc118be1009eefabbf4454278466b2a62a io-c
+69818 6ce96ce4d9afe4156d610204183d2183d2bfd6d6 release26-maint
+69819 5f595ac8aefc3962f9ec025f304e908db3b7128e py3k
+69820 e0815fee24f6e380b2623ef651f1d475faa78e20 release30-maint
+69821 67bcff293a21ad5feb5751c387a07857442a9dfe py3k
+69822 37e4df9fdaa6d400057beefe02aa30bb3f280ea4 release30-maint
+69827 adb1133d892ab6fc2f42c7c9f6c098fa47ea64cd io-c
+69828 c6182cc7e6d70e0331c41115a2b01f3cedcb54cf io-c
+69829 702c3b9803e8c753d71fb72c70c8049219e00c4b io-c
+69830 6fd890b20d63fc7ad8b0d5c903715efc34c5970a io-c
+69831 dcc161e1af7ece27ad533cc4cef62f94e96d240f py3k
+69832 41e38a61bc4b49167f2d59bf1a567ead8dfb6004 py3k
+69833 a1faff74ff89e2daac048890154f18dbbaaec989 py3k
+69834 7149b7eef153d7b37e2e45ad5301102e52e0f216 py3k
+69835 74a2ff40518ae6653b1886cb73a4719aadb61779 py3k
+69836 ee7029710c050db226d3bf84420a9c39c96934d6 py3k
+69837 3e27d606d625f8e917fc5e1f5659b0bdece7ee7b legacy-trunk
+69838 326f6facc1aa4f436b73d8cc0d31bc6880da2180 legacy-trunk
+69839 a5ba9c17f8b9d50e09c0f14ad0660adfc4a5f6e1 io-c
+69840 9e6fba5acce46bf84711bfdfaefbb77a1a5d4e43 legacy-trunk
+69841 c272e315dd87206a9d976c104bf161d76c17f22c io-c
+69842 95576bf3ad735896938499a5f6aa06b2c6060407 io-c
+69843 376d808e1c05faaad9e5002ee5af029e43fba95c io-c
+69844 51445b040986176264d50ffb6782ff7ae343040a io-c
+69845 3f023fb83f2b9b9a1b4a8489e5d6ce0704e1e420 io-c
+69846 af9b6c43804e1e9c49332ca6634363d08ae2f2ac legacy-trunk
+69847 d06a3ebf306fa945e43f59df063705a3f4c3dccd py3k
+69848 6ba5588ef64587f22a4e41c8e63d8c190b0486ad io-c
+69849 ec490932d91cb52db12ce3633d73471898732126 py3k
+69850 c2952c2b5a4ae68e733279c6afb84fc42cae9794 io-c
+69851 aa29d096710589e676ea821e10cabf2d6d797609 py3k
+69852 9988e9f00408f6592279ae6d674218831c428bd9 io-c
+69853 8a825a17cb273582bfff94c05cdc5ee93887de60 py3k
+69854 7ae8a8728421fe5f32480c11e84ccec8b6051879 io-c
+69855 96abb439e2d07d0cbaa87ad7b5b6b15acc037c67 legacy-trunk
+69856 6a5bee1893ad836c1120408a29ea5e741b02dd91 py3k
+69857 918264ff02e1c09eac49447c34c75efa1df62b4c py3k
+69858 5be24a56f0918addc6fe5222285829fef7289332 py3k
+69859 76571986a2f4208266376bf0eb24a291cafec045 release30-maint
+69860 8e7a4a774138426dd7d04d32d87a151badf286a5 io-c
+69861 ecd8ef4e79e6b71b11bcb234a3a366ece7cad60b legacy-trunk
+69862 c3304a4b64ea1a7e558c22ed31dcefe5c5ec9379 release26-maint
+69863 8460e5ee06c3915de782581231afe76534581c7b py3k
+69864 3ca1fb622f5a4b8a757f089153c098d194a64643 release30-maint
+69865 002daca66f9f6bdfb9d1972fca7ed98c4bc7cd6f io-c
+69866 ed5cd904f2007c5cee5699366435b15b52135ef1 io-c
+69868 5ffd93280a71b407ac8549e17377744f1d2d41cc io-c
+69869 a0eda1e228b8f8f354a40dff777822519774a5ca py3k
+69870 0ab8bef671a3df598a0089584ceca1148ce788ab legacy-trunk
+69871 c201c8cf3cb40c266b8cd664b4715ba4f8f0bbac legacy-trunk
+69872 5b5dccc50e12c464b1904c294436ed9d0440e81f io-c
+69873 49914b3e3aa8100f5105a75600421fc4d1cba6e6 io-c
+69874 b3515ed2813504160c6a733d05861085148a7c96 legacy-trunk
+69875 d36296673974a022da796177372986a22464d186 release26-maint
+69876 e89c7ed1cfff480fe5d434121d9d53dec7d66047 py3k
+69877 aa3021699c59ab80a9a9dcd05726590c8bc067bd release30-maint
+69878 cd2ee8190957c94700f9357fe8aeb9e65aba161d legacy-trunk
+69879 339f5c1ef0edf4332aad9db11beff635843ff781 release26-maint
+69880 0a5c26d0be540dcc02d396e874518cc3ba118587 py3k
+69881 620e742cdf68a745b0601875beeaf7f6eb120291 legacy-trunk
+69882 0effda54819e2c467bd9b26bcd690aa1dbd5ece8 release26-maint
+69883 e5e5ca0491b840825a02fd6efcd308036b9db360 py3k
+69884 13a1cbf11a21ead17ff24ea8b1e6a349009f59aa release30-maint
+69885 d22d6e9f791c2cf736687c509a38b10791b5f576 io-c
+69888 ce0a95af6b1d41bbc2907d3a48d179105f71bc15 io-c
+69889 272ac654fd1af20074e8c7e8074e809c685e45af legacy-trunk
+69890 fb7be45a94418ef61ca70368dc5d0977a2d44cec py3k
+69891 3df8be0363243e0a8eeee8fd9a01b30d54c69b98 io-c
+69892 9f6cb0437be82343efcbf98685c4a7a5f3389272 io-c
+69893 44496cd0bc7803e48518c356c99aa1e78d55d635 io-c
+69894 db14eca0163506dcfafab31bda875204dbc09b6c py3k
+69895 b61f33af374bca72b8b4feef0c51181e5d5bdf6b py3k
+69896 8a4dc0088e8626b56cdf9fd75da023a6efc8416c legacy-trunk
+69897 3219b34a3320612894faa4c9f295c16772678651 py3k
+69898 a366688a8f0d3c9e2de4716b0080f322471b726d release26-maint
+69899 c8d06dfd4c39f5c96e0da7899168909be623895c release30-maint
+69900 5bdb9c642cccd162e8f3971de42f87ba6fec1646 release26-maint
+69901 3e7733cf279e34da5fac930b4a8c001e2a434edd legacy-trunk
+69902 2bf1337c3a605dca040f916ee3f43e65872e2e14 legacy-trunk
+69903 1f1e22ef55609ae15879976588665f7d28018b10 release26-maint
+69904 5c859aea46b9c7dca55d41ca14ee001757a58719 py3k
+69905 0a598dbed679266f63f196d930bb991f30b166f9 legacy-trunk
+69906 0174b93669cd4889e577c1c0af8b923460dcb098 release26-maint
+69907 16cca30cf3eb83b1e2605f3294d16f2e7726038d legacy-trunk
+69908 a0fecbe73616f6283e3de0f69992bb78c3cb43c6 legacy-trunk
+69909 0504087a27236b378502090257c663a6d022b786 py3k
+69910 c1f026e0875e049b08c275de955df666f67a8ecb release30-maint
+69911 9fe53156543cf52f82b16fd379a2707594f5f373 io-c
+69912 f9ead2e1a03cfd8c23c88eac4cc5e413bc586403 release26-maint
+69913 bc3b073ad146d59159cd47734f641b68f6236957 io-c
+69914 a52e145455614e7fcb67318189689fa93ee4cebf io-c
+69915 66ce80e8e53798e8199660263c9c6c48e0f78dce io-c
+69916 ef3a6c168374c48dc013a8c410dcffe48d63fa12 io-c
+69917 83664e7f708ab397cddbb96d75feae1e06e9936f release30-maint
+69918 94941b059800e346b1571bcc149a48ecedd131dd release26-maint
+69924 fa747660d4d4168cd5b23bbc7098b053edb5b18e legacy-trunk
+69926 04f3cf32aa77f8360906e12156db7f4f0d6d8183 py3k
+69927 5c74e40d1926e5a6e84837908339e93a8340c681 legacy-trunk
+69929 b1e60b47e16017a6a1fc2b0f786d13709691feb6 release30-maint
+69930 5617471037bc7af5ccba6b698b6f70470becc704 py3k
+69931 83fa27483fdc9391bc40c7d3c6f5e6479df241fa release30-maint
+69932 5952d41189ad1af11113fc8800ae762d925623bc release26-maint
+69933 90412dfdaba306a2494dba044c63e1bf74feda84 release30-maint
+69934 12c69ef43dde832ac0d7f22bc31368878880badb py3k
+69935 c0b9bc25cebbe3997ab3b8545c59e001129e26fa py3k
+69936 bc70ec97e39faf57669fd01cf7c93c71b758eaf7 release30-maint
+69937 9c25a0790022c06175ba6f5bdb807eca46be29d6 legacy-trunk
+69938 faf968212f31d6a07abff7fd74d3e700cc317981 release26-maint
+69939 574fef53a7e3de49e291895771258d17108ecade release30-maint
+69946 45b44bd32f4165d169c31be9626bc69ba8c4f473 legacy-trunk
+69947 a8bb82f5fd647ad70c3b028650f9b6c88c88e0ad legacy-trunk
+69948 2f6b34f67ef0201659efdad57f791bf13b300280 py3k
+69949 2e25771d7202161f2540f931bf058108fe856521 py3k
+69951 60d09a71655680bd76c2151c8aa1c380c650a326 py3k
+69952 1d24739511c9c929fefbcf026a9bab88cc657a82 legacy-trunk
+69953 b8c4a3793d0f512a7f0d9a28cc012fecbaedb919 legacy-trunk
+69954 a7fdf69cae135c0ac49cfbca107007dfc0ad185b release26-maint
+69955 46cbe67b9661f7119dc689b0b4a31b27d309b1ae legacy-trunk
+69956 dc315df7e808632795c8182edc49b289d4803314 release26-maint
+69957 65762a06b88f3cf3031358ab1e03d6d13cc78b62 py3k
+69958 337bd509455a1971870375a595e50321645abf6d release30-maint
+69959 177ba122bb1b02c3a332b315d9b59be55561d79e legacy-trunk
+69960 29b12a89b2a06c805b157255808083978f149007 release26-maint
+69961 643d8d4fc8ebcc69155d3416357aadca9c053388 py3k
+69962 08a296a88c3e0b34b161e9b95086a181795aeffb io-c
+69963 8e0ceb9f5c2a73f34fd259637a2f87eb82c9264a io-c
+69974 421a0369f2394a4a4763ac25b524f7ba0ebe865c legacy-trunk
+69975 ac26765fb1bb8b0461ef5b58a8e440dc8d52121a py3k
+69976 702f1899161e1941d35045a0c7f41ad3befdd07d legacy-trunk
+69977 692c8a9880264b2e6fcf1022a7edae2220e04704 py3k
+69978 02eecdb17358079ce0736f2eede734c2dafeaa5a release30-maint
+69979 f7b03010162c4117d7d7ccaeeff4e5d31fc4fca0 release26-maint
+69981 0ee3b9a7f2097e9da7767f9d75e4bee377aa7446 legacy-trunk
+69982 d78b28a3524c5aae6aa5be3d5be8a8813390b174 py3k
+69983 c07d7fd2746990e02779bdbe486e4c0996568fe7 legacy-trunk
+69984 8873854bb5f9072e5b73b63787448d40ce6729da release26-maint
+69985 c80048215de5800b06d34fbff236a9d9d0900079 release30-maint
+69986 052fb51f8dcf3b792589f9d80c6756b9c61d705d py3k
+69987 3ecd484756b023b3fa80247840c7b385330a64ab legacy-trunk
+69989 e872f587f1901a7428e9eaeb9bf92557d8e6e33e py3k
+69990 e99b56da432af6d1d56b3217784e90b7d2a8afae py3k
+69991 323a5a8d10fc86002b9311f5ae78e3891e0e34a5 release30-maint
+69994 698175fe8b3de990d3b6b72ccc5ea024926664cd legacy-trunk
+69995 3f73b7af131c15d297bd2631d046e57293633fca py3k
+69996 3722ce458318947a9f25bd8899beb206cdde656b py3k
+69997 a1b3d0216820a9d62818705046c782a81bfbf688 release30-maint
+69998 632666691d3d48083053c6d8c07a9151e482eb91 legacy-trunk
+69999 58bbeb33f583331c6608affa632a731d1a9bf088 legacy-trunk
+70000 712aa5bb7b48d5d7cec3a0c9407fe27ed3feffec legacy-trunk
+70001 86228947b65d1f906f88d233f3f0b58da2f7e84a py3k
+70002 149dc4bc8eca03123087601ce0bfca858dd9521e legacy-trunk
+70003 8b4da1f493845ca078231022a91cbc91f5ca9c90 legacy-trunk
+70004 f170729e30382d9c0259efb7117e51bfc6ef737f release26-maint
+70005 f2e6a5ea10fe0a0968abb08825897b4752cdc5e3 py3k
+70006 3695cafef58d9344ea29ca5697daee0c09075da1 release30-maint
+70007 b7b23887fbde68150e754d87a6264c954e6ca20e legacy-trunk
+70008 ec1f8eb4da594f5ed940794b48167ed36052cfa6 release26-maint
+70009 e9d03f6b0d59056fa9546a1e2755a212257ffaca py3k
+70010 228f89ae55b100827bc09059bfd36660654124ea release30-maint
+70011 2b60b46513d263f9205fbf4cf988567d7e8e82c1 legacy-trunk
+70015 c4f27e546cf5175e52dc3657bfdc5ff2f713920c py3k
+70016 105a5317e68e129099ff9e941e20de2ff392f6de legacy-trunk
+70017 8b68968879c70df10a02e02e3ba6693ccd3386d2 legacy-trunk
+70018 1673d957311a0bb4a933d6ba4acfbb1b990edfa2 release26-maint
+70019 4fd80e66b10722f3d40f377453a2f164d761ac4e py3k
+70020 db1dbf057147a4a996499c7b1b073f91831ff9d8 release30-maint
+70022 866f747c196f1374d9dff055ed8dfdb31e293d1a legacy-trunk
+70023 8003a2fb625ba10387dc911e59a0f63a29767fcc legacy-trunk
+70024 5dac081e730d0805ca548d95d808849f63c5d080 py3k
+70025 eb03e5ae7109a6974cc218add7fb57a2a2d7fa88 legacy-trunk
+70026 839983595338292a340d46036b4589ee0f79deec legacy-trunk
+70027 1f84706e816c2e70ecf6026b86d754b16d829327 py3k
+70028 1f0de494bc131076d454e31e3cf47eb263b72228 py3k
+70029 9b62cb6538922765a824c9cb45c719afe597bf45 py3k
+70030 a5f0371850ff54f45f2a279e6205d3db5e25cf18 release30-maint
+70033 b306c72ffd7010ed1a6c767f9f4d1e8b44c74e00 io-c
+70035 d1556b8195f28ad457236e999305b80237f7d20d io-c
+70037 e0942c6753728b74bf6ccaa9f1fed0e90c321951 py3k
+70038 b71df44d5bbf0a6abca1208cbcabfceb38801a05 io-c
+70041 fc83ca1ac1108813e1afec4db02dc23129c6f983 io-c
+70042 35c1d52607c84f9f721669e6311fa4c88e6c8f12 io-c
+70043 d24533fb3f47a19fd04dcab36f6b219f02e0073a io-c
+70044 f75fb9f471d09b25cddb0c585d65e2ef3ef0ca76 io-c
+70045 3147b3b78dcf7eb305626849fd3b2559f58559e8 io-c
+70046 a265f59961f66a3debc433d14e5329ab1053bed9 io-c
+70047 c84dcac7e69a1850e85fdc6f7dfc0139d760bc00 io-c
+70048 f339da83858d99104444c007ac9cf37fe7cd11df io-c
+70049 789ff8bd190a5b8015d5172259b86e0a113d9bde legacy-trunk
+70050 be5a9c84f6bcca7ec49ad6d3280ea251d05198c2 release26-maint
+70051 206038121adec9755357b350fbf8023ab3cc8c97 py3k
+70052 9de5d62ad40228ef62e27ecae8ae74a42d431c6e legacy-trunk
+70053 ba6c306cf2cee771fcc1429541ecfb507646c8ac py3k
+70054 90037f97d8707bcfddf8083ee512c50eced06a85 release26-maint
+70055 759dbace51d2ed1bedb64054afe2cba6a1ccc024 release30-maint
+70056 29d652e3f2d32ab9cf83bbe44e6abfb99f20286a legacy-trunk
+70057 0e6faf27b531f273e17226c78e84036babb529f8 py3k
+70058 c64d4a8ae2b2ecb809ac6d85f4e5c386a17ea312 release30-maint
+70059 2a0f84ac49f0903c31dd559aae045f843c62ef3a release26-maint
+70061 672425be388a6921dc8a76abf83d4192ca1f65d8 legacy-trunk
+70062 4e1556012584583a18689bc5b78706b2667c3fce legacy-trunk
+70063 79e66c11dc80ca2a0ad80b05ea75493e1926dde2 py3k
+70064 ae22631a787c49b9f49e152d89eafbf5aee08e71 release30-maint
+70065 676567e2a71192126f0342dca5fca7bb87060666 release26-maint
+70067 d1a314e0eff720035fbd45220cdf9a8e7da357aa io-c
+70068 6011c092e21346ee7b35b664fc5337b61976f851 io-c
+70069 7faca6958dac02dab90383cc70d4769af77d4360 io-c
+70070 0ad3de216e83e43ffea5fa7e630fc6cc72465ac8 io-c
+70071 ef8fe90886968b1eb468cb91ebae103f773fa17f legacy-trunk
+70072 75ff669bf996dea9f0e3bcb86a54436dbcf3f2df py3k
+70073 b421441ee679c5e8c3b1274e5f1211c68c651456 release30-maint
+70074 e4287d8c97417ae5260bcc925baaa4703bd7a55b io-c
+70075 9f30036124f678a036e0a01c038a7d18dbd7defc io-c
+70076 e1ce666d7405a637e4085a1174db12f77160cf1c py3k
+70077 fc2a6f6d36aca51e5c2625ace529386f41e9988c py3k
+70078 d70773c9adad2d1a790a2b44304d155cb5640770 legacy-trunk
+70079 5df66dfa6f64ac66b23a97b2d12fce9ef7b1ab17 py3k
+70080 2a458106afbfe35b96f380a1302d00de0051a072 release26-maint
+70081 2c5903a02b363a38e3c80498e6b98c2029ba1579 legacy-trunk
+70082 612fc6ee68f745185999ef7ac037343e8ade5e2d release26-maint
+70083 b7632df1121fb7235ffb33d4e0a186d1a6547c6b release30-maint
+70084 6fd231917ef7c231e38b4b34ae64fc4e4be3edda py3k
+70086 a6c24aace8cbd74132e6dc5358ef65728f2fbec6 legacy-trunk
+70087 2ceb2a76880d5ff3140b95fc1120ca6986577486 release26-maint
+70088 adc9bb44ec47101df198daac7e0b32d144abce97 legacy-trunk
+70089 9919c1f4795ef8519cb74ba98e57d63a0218f717 py3k
+70090 8f5d8f27c6fcdc9db5050927777016cf5d4ea12c legacy-trunk
+70091 dcd3bc2e23773c00d8dcdb47fc65b98833e5bac5 py3k
+70092 60fcfd137a7292cf2febdb6665fa5d437e5c382f release26-maint
+70093 08a4a3f9c50e9c0155d986b4f5f0d7f9c4a34b87 release30-maint
+70094 0b97ffb811a01212a7548440be9c32594841b095 legacy-trunk
+70095 19c1a1ceb129559ec364a4f58688920d9efa9f38 release26-maint
+70096 c2a8a52b811dc8c5d988b7ac676d91bbc42251c4 py3k
+70097 de113b6d26d327401c38782cccc8a53f8ec8f41b release30-maint
+70098 d5f134a3a816c70931f156c27079b70a32fab96f py3k
+70099 8e03bfe7ef331a9a394428c7f3b8428303a3075b py3k
+70101 c910f6e3bb2871981cba38b42590294671d80c23 py3k
+70102 ca87c4707bfddd87390ea180ec3bd20760bc9aa5 py3k
+70104 85aca43dabc493032cc942455624cd4b8b7f2a39 py3k
+70105 d513ce291fbd22fa86bb1a8b1e869135e5278bc8 py3k
+70106 db29a3fbcba0fdffd95aea984facb024961ee62c py3k
+70107 87115c727102b420562cdbe8a874adc04c6155bf legacy-trunk
+70108 2d69d0d3a9ca5e3f06491586504bb1807298211a release26-maint
+70109 9c56eb17f334fcf958f46f0ad6c496e13e33e8a1 py3k
+70110 4da5f0ded3622e12e16b9ab8fa64ac9800cc69c5 release30-maint
+70111 116d90ef3164949499425bb8c35607145e2f72a5 py3k
+70112 374a9ae5dd0f42a4c446ccf5d299b88832bf6936 io-c
+70113 8fe2988cf55092c832a80debbfceed80c9f38a65 py3k
+70114 7b1741d6809e8963b5a8888a728ca1bfef699c34 py3k
+70115 0458730eb038b97ff628cc65dc641a5c726b0504 io-c
+70116 17ea18dfcaa55d2fa6ce45800976ab133311d097 py3k
+70117 d342a725b2d5898be35b75548efc9101b7c5efff py3k
+70118 03832356c0967448e1898162898268e1095f8753 py3k
+70119 6c08bfe78fffeb2b6547af48592a3c03e8cacaf0 legacy-trunk
+70120 4a4da968de2a98c8756f9ea2a949fd35f033f7ff legacy-trunk
+70121 0c635574b139e0ccda283293892907f51afb8164 legacy-trunk
+70122 6b1b2e7a06e97d59f4ce3eb6ee26d4faa2885fd8 legacy-trunk
+70123 b373b9962c35ac2d40451b3884ac2a2a7c3a4a97 legacy-trunk
+70124 4d078d522f259752d7a61727ac8ccc80b9d872dd py3k
+70125 fd08e9449a43883d4d4d0c650073bc66babd458f py3k
+70126 8f7be4877a606f00a95a5fd539159f31c2397d36 legacy-trunk
+70127 e8af4e24f08f8d4d6f5fcafa227cbe77eb53d558 py3k
+70128 2596dddbd057b7df02f5f0739285e02674881110 py3k
+70129 5ad88b919318a5453538f7bf9bb7e2df8623da59 py3k
+70130 0a609ba54f5c65945c4f99f864e7bfe911193a1c py3k
+70131 982502826f7898766e29dde605ce341b39105b95 legacy-trunk
+70132 ae71df9394dac8bcd0215e0604e660a7fa54ed36 legacy-trunk
+70133 11772586bc4397ed685ef4ceaeabce8e6f2218d0 io-c
+70134 738fad38a4bfe5b62cac81879139c0af89a399b6 py3k
+70135 5b4e8f4e9cbd62e98d5cdd4dcfd6f8194d571f1e io-c
+70136 61d20e919a9e66f953352b4af2eb6f22e6c255c2 legacy-trunk
+70137 80233df24f8cad5ab2eebed424a21de59464aae2 legacy-trunk
+70138 920a41d581b59eef34376d0ba75a7edbdbf58f5b py3k
+70139 e673f9392402d75547767be42bb6b754e597d4b6 py3k
+70140 c96e1ab4dab3aa05387c5b99877efc79db853932 io-c
+70141 38aa6f36ce4fc101c1c09c786bfcee2038640e36 py3k
+70142 d77172eb6fe789d33b915c3ea2dfde38810a9b8e py3k
+70143 3b885b92af6cdcd41824f96592a0579d89fbf398 py3k
+70144 77efbb3c3110c029774f7fd7cecef3cf98d7a27d py3k
+70145 01f83bb4a1c4d2bf976ce1264e5f8e3c55d56da5 legacy-trunk
+70146 f632a4e6ee3142cfdab720ab58e362caf43d4c5d release30-maint
+70147 7111845c2f5e3a22e5190d284f608fbce5d523b7 release26-maint
+70148 7d69070a3d783deb0f12401e0e58cb602eaf8e1f py3k
+70149 778599ce81a14c68a6c7dbd95bb0e78f6a38c789 legacy-trunk
+70150 8a3dadccd20753aaa4857def2363383f22ddf910 py3k
+70151 71dae22e181d983e294cacf8b28c79bb60db9043 py3k
+70152 3049ac17e256bb30b79f1134a37b657e30d3b78b py3k
+70153 58db4deb7ab16d77da09b2054425b1eeb841dda9 legacy-trunk
+70154 ebe10810ebedecbffec7968ceef91edfc9668531 py3k
+70155 0159ac2bc787c499835dd78430d3762600772bc5 py3k
+70156 e37bb30255f3117360399cc40babca7f72a7e3ec py3k
+70157 4563e6120544c0781f8ef49b6f0148c25b568523 py3k
+70158 194fd401922e607db91178c769636970b9d26fa3 release30-maint
+70159 f8670a7da2296b00be9a5d7a7968591212cda8be py3k
+70160 768aeea2bc0fdba373d051e3f49693e20cfbdcf1 py3k
+70161 55f3b881ced26371c695fe0c55976be2db03bed8 py3k
+70162 0a533dc1deb2277249e1acb4bc4134aa7f5b8484 py3k
+70163 76a579b6bade95d1ea194d4f58a828207ffbde95 py3k
+70166 0c028685b44c3bb4a10b1612ec0b0890605fbc9c legacy-trunk
+70167 240231ac79cfd0171d0875826f06c272f7c1c0dd legacy-trunk
+70168 eb2c35dd225ab3443982d9267ec806b94857eba0 release26-maint
+70169 fa9cc4d4185f7fd2c9d1249df07f3debaa35c1bd legacy-trunk
+70170 ce2b759dc7f35f16fb6d24e8347a1a9afbbc276a release26-maint
+70171 4d0d615d3784c2d1847c435d422178c73a04c96a legacy-trunk
+70172 2629c47fa6bce4f487cc387807afaaa128b0b1d9 legacy-trunk
+70173 c8a8ec87ff1f2f3e32722c100e43573da43ba731 release26-maint
+70174 41e4072866105d794990fb853963e44511918c27 py3k
+70175 30eeadc46520fbe466af64ff37c15623b3bf5cb1 release30-maint
+70176 39e9a20b7d7f5054ebed9cb2449a61f5abf6deee legacy-trunk
+70177 dc3d24824b6027a7cf3757a2f6b899f2e4b4bf33 release26-maint
+70178 276244ffcaeee1cfa462aa50fefddff5f66be88f legacy-trunk
+70179 5f245c700bbb150a5aab52ca4bfdbe16b5cd6ace py3k
+70180 4b5431fb2e92021db8d42864e2109b0629a31794 release30-maint
+70181 fbc7759763b2c8c0bd6737a1d34ca1b10970ec1e py3k
+70182 eeaa87fc3bfd0cb75c77e9fe3261504fb126f900 release30-maint
+70183 75792928fce89bca1e8c501dca77370a4ef9a1f1 legacy-trunk
+70184 33e9a145fd38357ed42a52ebf50cb2e99a63d860 py3k
+70185 99b68d7d7a892f299a20641bdc7347b028738498 py3k
+70186 fddee5456013ac01e5ff59fb6ef5ef9091eae998 py3k
+70187 1fc1c41d136f4bcd896fa0cac5b233775eec6d5d py3k
+70188 f48af77ee84e20828bd53b66a2ab0f57cf4d1ff3 legacy-trunk
+70189 79ea0667604b3722f2d2cd16a0f09961ff7802d8 legacy-trunk
+70190 cdd3f60d9974f44769cf79dc5974a98bad316dac release26-maint
+70191 275bbee146ab05bf487f09b4acb3419c6af33791 py3k
+70192 a8b9aa028899be9590ba0b0f837e214fbc4a9061 release30-maint
+70193 9cd355a798456f80837bd84b4332884fe3fd5f82 legacy-trunk
+70194 d01dc847b58621c2e545d9cc7443219f98d16863 release26-maint
+70195 7b279678a6a1db44a078a83b445f9df317204754 py3k
+70196 26984450c7e9a8189a8bef0710e97954d00c09c4 release30-maint
+70197 afefb77164ad3bf2dc174e07f6d0a9e194b70782 legacy-trunk
+70198 775829cf00d2abec4b4cdb561952314720dc4ca8 py3k
+70199 8dbd1b96fa6b690fd7dc3915d10be2b5f79175d9 release25-maint
+70200 c7723626e4e10680837a63ce24c080df2e3f44c5 release25-maint
+70201 1f9de53983c15513180e13467572e465a1e3bd68 py3k
+70202 bebc4eef9e893c40192c8aea2edc8966a179d1d5 py3k
+70203 9fa7949641d3009bb61985abecfe92b3ab47f067 py3k
+70204 4a3b44c21b4f3da7c82d5b5321fa56a3186fa8df release30-maint
+70205 3b9f5fa8bccd91d2d3d21a4c7e163bc03ca58049 py3k
+70207 cabb0ddcb88e4a7e310efa46e47dd1223532ad67 release30-maint
+70208 0f6f787f103b28b4323586d17344614362831136 py3k
+70209 aef5cfe73358d48ffdad922b31b00c0af87286e7 py3k
+70210 f5b81be5915946e3f9224d6d9bb6abac95edf7ae py3k
+70211 90a66915ca919700a24995a660c6609ef76f2fec py3k
+70212 4650ecdfcfb64237d29c229243832d4be8129dd3 legacy-trunk
+70213 2b2b51f304079977fa1895e7230c8b7dc0b02136 release26-maint
+70214 fcc6211e0d7105e3f7bb93ca7a16f1977ab415a8 py3k
+70215 6f0d2113dd222600ef90fe4458edc2fdf8c01f95 release30-maint
+70216 a99fa76713fc6689cec0654569232cd5c299db3f py3k
+70217 bbbc9746c70dc406b9e08ee3a70552f8ccd1d8c2 release30-maint
+70218 433e116c335dbb2ecc86305059a968c8926204d1 legacy-trunk
+70219 114850f73e3a5ebe715e25ff2e1a157a9565db5f legacy-trunk
+70220 4e7449348c1a4d5de1136d84bd18b5c527ee929d release26-maint
+70221 03c80e0742c34408b01f5195c34e9267978b4be3 py3k
+70222 1066776e28203624cc192d13729979b8be265ca4 release30-maint
+70223 c79ec63e6c08ed3e946a342dbe126948d5030364 legacy-trunk
+70224 b9cd693926667d1864d9e2e77bcbd10397ed6c2a release26-maint
+70225 6dbb2c1c09009d66220ee6d203920ac630d7db0e py3k
+70226 f5145abd4ba26b10a98cd6213868f4d3ee3fa526 release30-maint
+70227 e9e46ade61c7868497d3ff287f504cae376f01d2 py3k
+70228 a5e32c06e14b1287c8ec69246a597d5a6faafacf release30-maint
+70229 a89fdbb23a4a7856c7c6d223f88bff0af9a1a3d0 py3k
+70230 bc1ce368986e45b1faf96f93995df46bcd75e7b8 py3k
+70231 36d7faa5ff9614e627df0bdd5c67c8dbf1758045 py3k
+70232 aba4404f5d9ff519eed9bf30a0e716f1610952b5 py3k
+70233 bfc2fa4c84449b61d9db1a37fb6b7743ba587304 py3k
+70234 f7b06a9659b85305a81ab3058bddfbedd54d8fc9 py3k
+70235 437044e62d3d3bd494652430a50f6997ac089a1c legacy-trunk
+70244 9f2f86df5b2648ca69a1b759afd78f9c9d628862 legacy-trunk
+70245 56983cfdf5d4e2e8d98dae2a08ca15dc36873dd6 py3k
+70246 dce28c6b9e85a28d8da2c9e0a8d6a9700b091039 py3k
+70247 2033d45a5b99681e140dfa3c414a4941042aca8e py3k
+70248 895f68ecb055c3f15665600a531945c07c54cefd py3k
+70249 836e4dadf6d2cc65b8d0f456e942b11513492fb1 py3k
+70251 1045fd63fa7335ff915c56db8545a6c8e43eb21d py3k
+70252 cf093a7630533cfbda478cfee752b1ee5361e26b py3k
+70253 65371df41aca6241ee8813054b0b7e6c459871fc py3k
+70254 5540749a29bb87306ac5f93f88c964aae321502e py3k
+70255 70decb580dd91f0ca73df12a6e04696ec4a4265f py3k
+70256 c06f02a5e9627b19085f663e5189884f50575246 py3k
+70259 bc02de27874903abd930a4416cef006e2c39b11a py3k
+70260 b9bd2e3f79ba8a6585299662a547d056feea6b0f py3k
+70261 598253db1f5d112c3823e84e0bdd325baa5abd62 legacy-trunk
+70262 4d7f63ac9d2465888aedec4609e66907fa5e21b2 py3k
+70263 b1ecff5e27040422c36a6998225704692e91badf release26-maint
+70264 503976ce3373e589bc10bca038260e7c491d1421 release30-maint
+70265 f467d47f6de52adf63fd4d1d215ab2aabf6ec64f py3k
+70266 7fcb785ec0f527d48b20dcb18da5ea91d2cef50f release30-maint
+70267 97ac83e4527061b91ca0c7dfda7656048d372a30 legacy-trunk
+70268 5457e46d9dfd4629a681557d069c3aaa3671d185 release26-maint
+70269 c15423f9fac350f3928a169b8f005e7350c41920 py3k
+70270 3e676bf283103ee016f7c981837e69b6dae42357 release30-maint
+70271 63456d2bf5a08917c911c3961a46156e729b610d legacy-trunk
+70272 5c91a6e18564f04f334d6b16e70daf7f39626328 release26-maint
+70273 bcfb7d67916159bcfa45752a44f6ebca3c107f15 legacy-trunk
+70274 7f7074928c68142d80526745b9a55f7b5790ed83 py3k
+70275 1a8391cc4b44cd66ea984255a1b0ba1a531d93a8 legacy-trunk
+70280 79fe07e13388ec7a848ca22e43f55e5279e6b3ad py3k
+70281 42553e35f8e4b49665b9b04e1ee8684ee9073e0e legacy-trunk
+70282 3b43577e1971c8c1380af0cb2a17b39adf9c7a42 py3k
+70283 7cbd44c203cf95caa7604bffc545c2eeb9b7107a py3k
+70284 8ed3cbac16bf5653fa42c3228b79aa9c4d7da9fc release30-maint
+70285 dab45971c568841d23850876af41f410e8820c0e release30-maint
+70286 f804b8a25115e7b21ea31403f3fa03690af7a43b legacy-trunk
+70287 ae3006c7d5b0199c56f80e64e46e71ab7d5dcbfd py3k
+70288 89d8af259353274e7701019bda95106cf1961038 release30-maint
+70289 563b4f883ed88b1662787cb9105d0c4237aedc9d release26-maint
+70290 54cfacac6d0a155d18ed8fc63ae847c43d77413f legacy-trunk
+70291 03080fa08dfe7ccdf15bce15b4c70bdc146dfc30 py3k
+70292 5bc9f6cc561e0417a433849f450aea3d878579c3 legacy-trunk
+70293 4fddcd4e8eb519863ca0a64a334d35112b2eb567 legacy-trunk
+70294 afd7118c8ccfb40ca56e7d3f115b0b4cadbc461e py3k
+70295 dcbffe918a6f8ec6ed7fa158ad9cbc24ab5ae0f2 legacy-trunk
+70296 ab7a7215e4636950f0acd8999a3c75953fb181fe legacy-trunk
+70297 c5e23b9cedcc997403768043f4db6f5490a41756 py3k
+70298 b0911b5a002ed841b6cf25cd804e9e842a058c0e legacy-trunk
+70299 21850d6d5b4d40a96ec2888604acd39981b8fee8 py3k
+70300 0382901c6ebd2794611736afecf8a7a138cf591d legacy-trunk
+70301 3c04d34c049717ce8bcde9c3b67d93555dc43439 release26-maint
+70302 4322e6dd2a6c9ed6482e199c4ac33680e3d83706 release26-maint
+70303 0c7dac7e2fb08112c370175d1f7930a5e282dd62 py3k
+70305 a60facc9f7cf555b254c0cf7582fc5089d30573f legacy-trunk
+70306 f51a28b10426514510e33e5bdfc502ab0bef369d py3k
+70307 cbcb2141aee59e84b97df9fa8edaf98351c703d1 py3k
+70308 3ecf6c3cc81e0eb7fdf45f456597a3dfc3d3b37e legacy-trunk
+70309 8b0b9ee58f67b81aabedcae312df6589169885a2 release26-maint
+70310 48fe623171a40d53c6f261645d151f7f547935e2 py3k
+70311 875881ff69a4d548acc96cce71ddab3c850f2fe8 release30-maint
+70315 beb788291c7a16a6f379ed8ea2000c08ee862eb5 legacy-trunk
+70316 5dfc45bda96d0950ce24d9e6ca9862155112aedd py3k
+70317 3400cb10d9cf7d461eef3d1a8af08fabf67e7de3 py3k
+70318 1eb57bddfb38be9d6998fee0c995e4720dbf983c release30-maint
+70319 1d8e4bcecf2aaa9413a630ad571093a0bb384eb4 legacy-trunk
+70320 bf67e5a893f8ec0b546da2711510a8603255fa6c release26-maint
+70331 6b024ff5b58f6b2d2f470e1bdb2f755ba0a4cfd7 py3k
+70332 2e8e897a12447f1c2af43bfe46a92c007e18e6a9 py3k
+70333 1a8bbc5fb3efc25ccbea784072914fa36aea8d2c py3k
+70335 f188dd68620e6a4adb185ad71ae1a032a68ce298 py3k
+70336 04a5b64385264e9638c3e3b443e9c0c8fb70a945 py3k
+70342 0e88582aa3ce704a207d263238a7ee67c679f938 legacy-trunk
+70343 e5e64a0c4aa2c31e537fd139f9efdafbaeaae8c8 py3k
+70344 b363e29756ff25863c98971d9bbf5a0be962899e py3k
+70346 480483c3d93e3138f71e07a5acea78b9df844e23 release26-maint
+70347 22747e874f46b90506c6dbd63f7dc56def63131f release30-maint
+70348 632aa568474c984f126f90c93de039ace4dd88a9 release26-maint
+70349 8b128e05ec74559d82150a685dae7a58b1480851 py3k
+70350 790cb98f8b4fbf05d882f534df2002c49ed6e629 release30-maint
+70352 a599475b69c300801bb9a182e1f4cebdbdc8c817 py3k
+70353 1f8d11cd46842019a92b4ee19429fa82ca68b1c8 release30-maint
+70356 861cd46eeaee7f536a427639bdad207dfd852afc legacy-trunk
+70357 a4c9b0b0a8e4bd747288ffa1666c8a7eca62afa6 py3k
+70358 31659f937613cf663eafc07210a268b0465d83c3 release26-maint
+70359 f27caacb742679e50dd90679ba7f77f69dc1f060 release30-maint
+70364 3f18d609ac1bd87219defa48febbf8af1585d726 legacy-trunk
+70365 c5feb058ffc4a61d597b8ee08f3599ba224114d7 release26-maint
+70366 1c0a0f7b4f76f9d58d16745f24aeff6b092d3b54 py3k
+70367 7377a4d95a44ca1380c375e4b9cfd47516cf51c5 release30-maint
+70368 1f96d733a74390e6162c3d3dbcaa0bbf197320b5 legacy-trunk
+70369 4e1a1576f1e5cf568c0a3062a948229d4e9a41c5 release26-maint
+70370 c1dc87bd883c9e7eb976e02a6f82741f1951e7e9 py3k
+70372 0b19ba318071b1de1d5a2aafbe74f6867263f222 py3k
+70373 62f9dad628defc19324b2070b36d532dcd83f38e py3k
+70375 69cd615b76fbd466d6774fdf6607f4a8cea3ec80 py3k
+70376 e8fd79763bccceb8c2f67d67c17dfc5f20771f76 py3k
+70377 70f5f9113ae11ec80dc33d889347cc9770a063c8 py3k
+70378 beaf00c98b71e6313c6c5cd0311f4bde58e04638 legacy-trunk
+70379 37d76b5a827ba3a25cb62735416435e634ea4351 release26-maint
+70380 4e927faf30eaeec1a4bc2aab0d0648d3d5420f3f py3k
+70381 ef7e47eb2b6975d5b5c2fab7c7c023695fc73b38 release30-maint
+70385 442bdfe93b2921a9ca9ba51cb49be965c2c0a7aa legacy-trunk
+70386 23a39697fd67e85841772dadb16c2eb2222f387f legacy-trunk
+70387 1be09c5c68e98b4f7c8f89c8992e9e4a00540b64 legacy-trunk
+70389 de7e4716d9cba97ebaa5627ee7cc4aa336b76827 legacy-trunk
+70390 68551b2a5faa2803e43fc3cdcb19d6d26fd4edcb legacy-trunk
+70392 2fe5baf89569581d85d23a0568bbb4ea6a56e14c legacy-trunk
+70393 0d19e11683ffeb75e4ed95a394d08388cd29cf91 legacy-trunk
+70395 4e94eab6c7a2d0ded10601fca66653388aba2c41 legacy-trunk
+70397 12ebda8fb6b300af27a6b4e8e712cd73c8d2819e legacy-trunk
+70398 0be1c1f127e040779cf3be48ae9d776cea7bde47 py3k
+70400 6bf0f3ab0279ac1371e00d670d990ff7157bd08a legacy-trunk
+70405 e4d9844aba2501a9b78ee444c14f00c6004829a8 legacy-trunk
+70406 cba6093830781cb9abd1ec60ae2d383bfd3d4efa legacy-trunk
+70418 ccedef28fe04202372e946569dbb1ab46c88bafa legacy-trunk
+70424 a3193c041496decdfb6d92297b32750f884d0867 py3k
+70430 6b738b6f7fc678b54127c8c0b2aeedacdd5b54bf legacy-trunk
+70431 fd4c839280809acaa5d9b9f9ce42810e256be9a4 release26-maint
+70432 39f4fa51acfb807b89e3442ec1ba988db3276787 py3k
+70433 c357d79264f8cbf4f5d702b09ed93b4483aac997 release30-maint
+70434 7c3fe1a4a2ce3488bedaf50a00e2563842b57d9f py3k
+70435 157247eb793dbbe6756af03ab3b90756179fe2fa release30-maint
+70438 171ed6ffc86c64c9696e7acf8091e93667900116 legacy-trunk
+70439 5dee93a97558e181e7e28a6fba9cfaef28277fd0 legacy-trunk
+70440 12e14e6f1f2db1ed75c5e3484fb1f62c980b2d32 py3k
+70441 ad4a72b08d3e410e7e53bbd5eabffb15347cb918 release30-maint
+70442 cac207373a34f74c6dd16e808e1fb02565628302 release26-maint
+70443 d95e5add3ca4cce32908fb701fd8ddc0ca3c87c6 legacy-trunk
+70444 2d94c8fed376f76b8fe96e287486f011088380bb legacy-trunk
+70445 fcdffd85a8bd3ebe0ea8b9bc08140d5334de34e8 py3k
+70446 207a4c27a916ad9d0a2b4a2428defaf6cbed8d9d release26-maint
+70447 a527405a9c10610832492f6a9eb89c7382036012 release30-maint
+70448 c340e3f49bf3649e77aca62bf6bfea021f201d10 legacy-trunk
+70449 58b286e15ebce4cdf99cd402dc571088bc798527 release26-maint
+70450 59380b390c406249a048649cb2c6f0b4e401b138 py3k
+70451 6fe6401da51f9cacbaf066fb258af66a3b5448e8 release30-maint
+70452 79642b5881e0a6b222d796d16042ef4b8d94492d py3k
+70453 da4840b2ba0612f74c02e3d2526c4c7341a4c29e release30-maint
+70454 c73dd25c01c12041070e1102bd730e979041c7bb legacy-trunk
+70455 6ba5ee5a220943a30723776b062e6f7d62e69868 release26-maint
+70456 7d8fd7955d1557407b14f46ef1245331f582f7c4 py3k
+70457 3ee259469ba8280468d736779662a744ad8016ce legacy-trunk
+70458 7b5360fa3e19f2906bf4ed035fc2a8b360dbad15 release26-maint
+70459 bb5de24a343f69715b24f9941a80eed9e842e88c py3k
+70460 9f4628b4655b0be982015d6fefdbc07d09a60b7b release30-maint
+70461 ffe4b9a1035cd3689146a4910c3c2ca2c25e772f py3k
+70462 370317fb9515561838de5d650d94777432f7335f release30-maint
+70463 d2b7887f8c9aec101cb9fac176cbf6b7dd664c69 legacy-trunk
+70464 92fefcddbfe840151a9de1a5292d80f506380a51 legacy-trunk
+70465 fb80b281e05aa0aafeb4f0f8445ad7023f11da63 release26-maint
+70466 7cfbbf2d294e512a37ca1751944f9deca3afa57f legacy-trunk
+70468 e2c1cbda2a95725a112caa439b49680f1a538b8c legacy-trunk
+70470 1f73e0984d559e7da7295dc30c27763bec88c1c4 legacy-trunk
+70471 a11a676fe6c05aabe29542c00219bbbeeead90fc legacy-trunk
+70472 ead3de48aadd796fcb5d3ff6b703395d3032c1e1 legacy-trunk
+70473 8fd1721c32c475c34b196b2c02819cdc81d6d255 legacy-trunk
+70474 1100a506edcf051069268fba738e0c682d2efd35 py3k
+70475 290c7513e125375ae3968f8946eacbb1e2f25b1d legacy-trunk
+70476 422e2e6763e9a17ef6a0c23863f49888f88c860c py3k
+70477 4fdb10dbc73676c60bb8d2a0214131cf8ad54d56 legacy-trunk
+70478 66469b65d548444cbf8c19e5e4cd426a636a495b py3k
+70479 9b358eae532a621f5245568e2bc9cfbfa620317e legacy-trunk
+70480 d1c0f55040bad524b16f61680a2e06a577e06aa0 py3k
+70481 e7cf469d0e1283b72bfc3f7666f7a53502ca5940 release26-maint
+70482 5a02f0cf3c381ed5ccd18a8dd8ced6b8c8f80b88 py3k
+70483 3959d504b54c35388de8ef252a96f8e5d8aa0ca8 release30-maint
+70485 787f25b127ee61d0a7a7f5ddfa9fee8ec1c0eee5 legacy-trunk
+70486 73fdc07681e37f0b9498aa75093ebb2bd34becf3 release26-maint
+70487 50577ae2c0c0c539331cd57e3d0a1acd20c55aeb release30-maint
+70488 22737e95f6f755442a501965a3327a8c0707f7aa py3k
+70489 6c0c15a2ed2d3fe948a466df1406880685c94357 legacy-trunk
+70490 a470d0a0256e742f2c9f7a7529590127ddecffa0 release26-maint
+70491 d92a6dec8bfed75219e65eee63c7f19e39804c0f py3k
+70492 bc681e53f94e06add02da0f426a2863e6a9da54a release30-maint
+70493 c5b7958f429206e095ee8c16038df9b797a8a68e release26-maint
+70494 2a3af211f0e11fa74375f2491d6d9a70438e1172 py3k
+70495 c7b2cc8358f6656e2c7eb5028c84445c3ab3291f py3k
+70497 5cace75bcb056cc62726f01f4676bee41d751006 py3k
+70498 5aa63ddd1513454a77f41461eee001487d2f8cf9 release30-maint
+70499 b846d709cb7632701b0152d58c1a4b868ea14663 legacy-trunk
+70500 02928121338d931e40215973adcd6368bebfe6e6 py3k
+70501 5c5823667ddd5ceede9435f209981b951622f092 release30-maint
+70502 b8934dd9267de03bd76f99186b8d75a1d6f63897 release26-maint
+70503 2d6ff5cd26001246a18f5675bea60fe6e7f2e6ad py3k
+70504 f2777ea954ca25bef1c2e914f8fb13bb9ad47c61 release30-maint
+70506 5b1f02dc69a391905e70b03777b85b3f88585242 py3k
+70507 3ab2e52d8d1969c143af00f16b1c0c2bc04dd616 py3k
+70508 e41f5a89f5c06e99bf646f62767bea0016d46278 py3k
+70509 c6688e9156b5917eed86553167fabd0d202be55d release30-maint
+70510 18d65651235e489132d1b84862e5fd15175bab09 py3k
+70518 fb21eaba94f689eed27c99cdaa91b93007a91997 legacy-trunk
+70519 d1b0bd48ba156381b79f9f1e44cd386cd47baa80 release26-maint
+70520 c87e58262d5bcb3ed235429e1372a0605135cf31 py3k
+70521 efd17cb5823a98fea601691265d97a43c1414851 legacy-trunk
+70522 752f2e3e47577fb0303ef00896f5847f1e22f8a4 release26-maint
+70523 445d404270eaabf18bf630f9b10d32117516537d legacy-trunk
+70524 856ed418768c19068aa71a2040009d12a8f3541d release26-maint
+70525 095d874a30549fabfedfea2ed1269b45546fcd3f py3k
+70526 435b8ba1a902344a51e4c0e38bd3365aec9badd5 release30-maint
+70527 dd9fddb0720daf9b2cb95792bd7d7d6458d8317f release25-maint
+70528 6cb843075e6911f2dcba86f1012e83106381fa50 release26-maint
+70529 5f8c8c918f9b029b4e97c72ace6334422c2dbbf3 release30-maint
+70530 ab389877f152f4c89be205b8d41fa7d254ddaa08 release25-maint
+70531 1f72ac909408dc41420617e14d1e9e2a1717f697 legacy-trunk
+70532 4426e492264f07ada516e57387070daff0e61c13 py3k
+70533 119e3fc6cdf3581d895f3b8b25f463a5b8616b53 legacy-trunk
+70534 b1627e7e678d7d9596d5cdb54a5a99d9a7a36312 py3k
+70535 88974ca5003ff9dacf610baf9b43078f282cb56d py3k
+70536 05ae9ccff5144c758505c08363f1046621491ac4 py3k
+70537 87cb950591bee1b8acc4f2d6d26e8c8d15c55908 release30-maint
+70538 687e751c288e6fa54f8cd033a87201ccdb75ed70 legacy-trunk
+70539 13f887e5fa0d750255fefa6c51f5ab2f3a73b488 py3k
+70542 a54ef18ab0d89dcd1f8734f54be4496bd1e2edfa legacy-trunk
+70543 edd4302cceafeee8b3c0e1a123ac0cbd14fc7300 release26-maint
+70544 a1ddb4de85a53681958b70722c2d3a926b01a3dc legacy-trunk
+70545 60d06c98a605b110259d055624dc2b62d3ee8612 py3k
+70546 0e498a9fde3c2293f88b9e1ce973d6b7fa7fa3df legacy-trunk
+70547 a1d16d98aa40daf0eac449ed139d59e0f6038cd2 py3k
+70548 c70910ac492d798462b683ab9665779b68df110d release30-maint
+70549 94bd0666ffa7933f51f9c20de1b86a834527154a py3k
+70550 b3791309e6904c73b90c5042430825164c17272b legacy-trunk
+70551 67fb9032d43a47bdaf99c638e9162600d828cd35 py3k
+70552 f6edc686bde7533a9003183e27e491a42f8aa5ac legacy-trunk
+70553 7edd143cd4e42f398513fbe9d274bed70b5f1616 legacy-trunk
+70554 dca3d672758e3cdc53d4eebb1c916a65871dfacd legacy-trunk
+70555 e4aa530e5760b8acfb840c72f897383ef6818ba8 legacy-trunk
+70556 10845e15ed9b1b601811fbbc6b67f71a8b30263d py3k
+70557 d747612f8a2fee98a355426872d012a2810a36f0 py3k
+70558 68ac2552f44e19f5f586050fe09099ccfb40904d legacy-trunk
+70559 6d5c8a5069b0fffc9f2c091e8647cf95c9068488 py3k
+70560 aeda92f1ab9b5703bbc276e974e3498b4b0740cd release30-maint
+70561 55f1509c45b67f0cc5c858dc565ec133a0216ded legacy-trunk
+70562 58694c76d76d815f8a4b6f8a6b208853f01da958 legacy-trunk
+70563 0027c083a0d4b404cec758ec8cfbf423c0b18dae legacy-trunk
+70564 ec3e29f160dfd10126ea18bd4e99e74d523dbae0 legacy-trunk
+70565 701f68f8b7cf753f946014123b1753960e45c75e release26-maint
+70566 a2f6b2b382b4c11cd1af08a2f8b8a81fce1a5637 py3k
+70567 986acce266410bdab7bae367af9e52ea4a50ce96 release30-maint
+70568 f0a507414e8cc786777b6baca4fc0ea2dfcb6ec6 legacy-trunk
+70569 23c12ac7f31736c6674d21b84c1d338f143af690 legacy-trunk
+70570 6edb7421638c0b21cb0aad5c50392c67404dc1e6 legacy-trunk
+70571 12adb81976479c403164753290eaa1a8e3c57b21 legacy-trunk
+70572 a8a8cf9b28183d44d703728c8ad43740649686d3 py3k
+70573 9b599b6012fa54df72a8f1834dd5b5a207591ca8 py3k
+70574 d2134133bf0c9952483699d0d277a11f949ccf35 legacy-trunk
+70575 820f3475b08d7f2c741226369ef798218a4197ef py3k
+70576 11d54c7e089b885108aa2b9eb9c95935980283b8 release30-maint
+70577 a8da8acda12867d474ae9432940d53448e06c65e py3k
+70578 a9515f29b38c8732fd3b5669eaf166d9ced3e194 legacy-trunk
+70579 2494ffd60eae99d0e56b6109782c6b27017c6b50 py3k
+70580 60b97fc8f06da36a491674ca48b38795223242c3 py3k
+70581 006c81f9b0e80ed60e1d0927ae5f841f3e7994a7 py3k
+70582 2cc900bd6bb0162cd0f2b93670d67fc5b0bb9363 py3k
+70583 ba424016db7469603d57fe135c97c70b88b91fb7 multiprocessing-autoconf
+70584 792a7f939fddeac1a1cedc16eaf815a300ba3267 multiprocessing-autoconf
+70585 3adb3974e777c09072449d1f36f09ea264db0af6 multiprocessing-autoconf
+70586 8ad251da474274f17ab093bdf558a2a93334176c multiprocessing-autoconf
+70587 fdc806c77cd6e4215f5f6d10bf5ff5d3bdb9f11a py3k
+70588 3df7f118e50422f6a38d481edcb254cabf02e11e legacy-trunk
+70589 efffc7eaad6d33e74e573dc7715a618426add942 legacy-trunk
+70590 5d6c0fc87a718eb3643fff173bde73b2decf663b legacy-trunk
+70591 060ea975d59712976140b472eb07516375a4d736 py3k
+70592 41e344e571a16023613af10339a4ac272b045371 multiprocessing-autoconf
+70593 73f4e8adfebfd8d25da01dd7df3cb441444100ea multiprocessing-autoconf
+70594 7d0e3a8c2e9e1b16cd03b6880a36b51c59c9b82f legacy-trunk
+70595 9f8976565f826ee0e9a7e24d8d95f6814d7b41e6 legacy-trunk
+70596 8cd617c3e74b028ed3721721e918e230b78508d1 release26-maint
+70598 ee0f751b802003c53ad57a0ad567b95d8e2cf9a1 legacy-trunk
+70599 1fbec29f89e8d02c515fc45f27e903d80fc83417 legacy-trunk
+70600 a676d36c07dd5399db0a1bcadea17897056f088f py3k
+70601 f5d670fcdbe96bc7f421b8b428a29e7f97c2cb3a legacy-trunk
+70602 f27704f45d4af3313433c2fd8d3c1be94deda1a0 py3k
+70603 8b5a80f53317f899e79912dd10d4371a6a0f9729 py3k
+70604 b6f861321b45cf0fdaa4da5ea0d0d74014f7f90b py3k
+70605 3fdc4aa36d767078ad8d2b36ec01ceb360a63036 legacy-trunk
+70606 61ef659ab799df6237de27098c5ffdcce68f3869 py3k
+70607 33829c791bf62270c6e82bf23e4dc3d4fc9281d5 py3k
+70608 a10d99513f9e9ee3a057ef28cf4f88b1dd247844 py3k
+70609 cc13cc224ff568be11b6cf6a6b3db1aa56e0eba7 py3k
+70610 07b6fcdf7f94994e9eae6b4ac8b85f7d05660936 py3k
+70611 1e2335962bad8546a1e11ff9dd8fa0c06114d4c1 legacy-trunk
+70612 78fedc342a6b107dbc1b722082cf79fad70f2e89 legacy-trunk
+70613 0a052a2873b2419df69d887284690486f187d96a legacy-trunk
+70614 007e9c86fb55b5e0884b6ca5a183d275856c1a5e legacy-trunk
+70615 4fe76249a909070edd1e9f5d2382e5081ac20156 legacy-trunk
+70616 557290ffa784768e7a943e795a84a5bc6d521acb legacy-trunk
+70617 9ccf82e653328f1d839443f8cfcff8f9db002d0c legacy-trunk
+70618 e6009b9cd9084ffcafe0b2538b6930e3699feaa6 legacy-trunk
+70619 14cc92ae94c904d0ace313a9dc93b800375e0559 legacy-trunk
+70620 228cfb6e2900c1446ca062f5882f10e0cf4aec01 legacy-trunk
+70621 76bf341ac20237b2489ed62fbf717add53bd7ad8 legacy-trunk
+70622 50238494f0f05ded532b53592cdd86de8f9137d3 py3k
+70623 705545ec3243d427254cfe17caa7228fc6f68fcf legacy-trunk
+70624 f26c1cd6c985005fed159d7e1461eb13e0ac0889 legacy-trunk
+70625 edf627261c7b558b0f9c1f1dc556d9d082f5c66b py3k
+70626 dadbe014bda4e2750e2edf25db10241db85a4ee4 legacy-trunk
+70627 d227584c1c7d8e70647b9688bd4307e72f41e8b8 legacy-trunk
+70628 daf661d05442a7add88a336ec5b6af70d8090701 py3k
+70629 ca02bd8c96f298bf9a2a70c8532bd468d0375a8b release30-maint
+70630 475808698eafaab60d7590e2808b7e037f893cca release30-maint
+70631 75e3fe3c072670d06b8a1b8468417d8202fa6f8d py3k
+70633 ee4a006d0171ec144ae8a69410ea884b8d8806f5 py3k
+70634 10a84c638eda129568e626cbc5fe0bfe17b7d868 py3k
+70635 8d6918af232baf7e8e8d202186ab3fbc75eb8256 py3k
+70638 8b691690babd7080764e4af36d6c6a91936f9826 py3k
+70639 9ab7541104315faeac995d348543e47195317d02 py3k
+70640 4265d6c7c0743cd2993fb7a961da5f3879400709 py3k
+70641 fbad42c45c9cb6c41f90d5e5b5be39d7dc6f5788 legacy-trunk
+70642 7aff8a766e2506da76aa36745fef9af0c4cb8187 legacy-trunk
+70643 a726f79285618542dba6d7d460a9a2fa1be1899b py3k
+70647 9df5d0694921a62d80b1835b1131cd515b03f4c6 legacy-trunk
+70648 b73cdac6a0c38c85a86464a2abe90f700827b9df legacy-trunk
+70649 bb90ec67f314857267fe54691202db005c4105ec py3k
+70650 da456f42ebe7e7a8ea91124e795e8af5eb9ceb00 legacy-trunk
+70651 3add400e419ff0321ee985f8334afbd91c4d4d3a legacy-trunk
+70652 1f5db9437db88c5ecd7fffc2d7d762dcbbe57a03 legacy-trunk
+70653 4983fd1950366bca9ec9365bcfc62f4b5ae1b357 py3k
+70654 bdfc4b3a93471951c811328053288edb83634d7e release26-maint
+70655 391871f6c1642bd68ad481d7f38d42af0ad4ddcc py3k
+70656 5ef1c1d74c51227ad760b93f16ca5a6fb2379878 legacy-trunk
+70658 976b079995899b79b055be4d18688a0ae4c6448e py3k
+70660 3749b88dbb61275f5b4eb3885d44c2d83ffbd53a legacy-trunk
+70661 55d5423ba987cece642646538511fd2eb60946e8 legacy-trunk
+70662 d4e7470bd66042c2ab94cc15ea394ef3f4630b02 py3k
+70663 150f568d1ba2d00b446bb2c4a3cc79b87e2e106c py3k
+70664 3a6d27d8082295e2e501867c312e336af0c13112 py3k
+70665 1b7273aed36ced0bf7a6b078c9116778af6c5d53 release30-maint
+70666 d05939263a0e515a002ee3dd94fdb9f13240759c py3k
+70667 b794319c125eb45cad030deabc29a97654af603d release30-maint
+70668 d55e05b06e4a2b0e7fd0fe63b789eaf4b26649bd legacy-trunk
+70669 7add423af971098f396e3a9b83463cf2ac020ce4 legacy-trunk
+70671 36b3592f3023b874215c10d56fd3fe1ca448ab83 legacy-trunk
+70672 9134a2091013c5fa399635a466bc370694a77c59 legacy-trunk
+70673 e314b96fb5ad36292fcad9c6a5767ca00733c26a py3k
+70674 e9891598a433464c27492bcc700a46130b6c6927 legacy-trunk
+70675 ef612be771edcefb5ef49da848cea21e04e70c8f py3k
+70676 001288a68e8b07484bb4f5e1a37ae301f46f16c3 py3k
+70677 46a45eccc9f701facab630e377662ee4d61efdc7 release30-maint
+70678 019815bc37eaf12d9d8a4782c461577b320d0512 legacy-trunk
+70679 423c9477d6efe6ec8078c9523fa1b9905f0350d7 release26-maint
+70680 02f294a28206fb0cf79e717afd52d2fe006a2131 py3k
+70681 f49a97a979eb0908e03a823798c11e63f7e02169 release30-maint
+70682 1afb365f24482227e9b3fc853065821cc525c01a legacy-trunk
+70683 6e591d4dc6c96fb4f0540c998c7839966f38587a release26-maint
+70684 f05b6d9adbe64775764ab8649888ffd1ff5469da legacy-trunk
+70685 bafad61cf30262d772dd6510350418519cbf2a9d release26-maint
+70686 e5084d514809ef01c62d429f747c38213cc9bd40 py3k
+70687 b0c5df8c84a34404d51346d94b553be1891aa715 release30-maint
+70688 f171bac9f961d1d7137fd4e0ffca4d31ab6c00c6 py3k
+70689 9807c26cbc99fa1e0155df958207f8693ed42389 release30-maint
+70690 a3b8d191ec6812eeb5bd2f69692cf582efa316d9 py3k
+70691 0507aab5fb119f590e2900a3463f27648c01eae5 legacy-trunk
+70692 baee90521110da255b8ace02e8f37f9d3f539040 py3k
+70693 bef00ca43efae6d9bdc2bc8e3f245fb47309f3c3 release30-maint
+70694 92bc1ddbc5724f4e1fedab0fca1c96e4ea09f114 py3k
+70695 975b20399c8d029cbedbbe17b2ebd95bf2e4f955 py3k
+70696 7b5fbbe7b009c4f2bddfc8b0d846a36aa67ddad2 py3k
+70697 6e1c4a2963e4c41d632f2649370ea2a67b5267f1 legacy-trunk
+70698 9c23c54e6b1596746ba38a56e57f74e5297189f8 legacy-trunk
+70700 6ad9b01f95f9991a6e40411bf984e5597769ce29 legacy-trunk
+70701 71b69a873d213167082c13d45e2df9a6ef5c4c45 legacy-trunk
+70702 685f1791fbc59a974159789b3ee9e28c39f10a05 legacy-trunk
+70703 a7ae73a3780594f337a152198d49c0fbf9dbf1c1 legacy-trunk
+70704 2d83649a94b75ac6454f521f405b1e0d94b0d604 legacy-trunk
+70706 fce8f238452e1cad9f580c4e97dc151198a01b61 legacy-trunk
+70707 11c335a96f60f1d9cdc2ab8f2601d0b413af8934 py3k
+70708 9e4bb941a1ea55c50a0fdb7f949c8187099addfb release30-maint
+70709 005713941a193a06928916a046f75d155d79f605 py3k
+70710 cc02c9c290a9484bb9269aefa971429e51244a8b release26-maint
+70711 b9d6fdf0fbb361f98a93a207499189521e7f8315 legacy-trunk
+70712 84e99efc67b2b1a0facbfccbbb3f9d03862cf077 legacy-trunk
+70713 f5c2bcb0947b8aa56f96396f6e1c8bf0a40cb3b4 legacy-trunk
+70714 14cae116069d3cf5dc787b9b0f2d6a52e7899d2e legacy-trunk
+70715 1b7ccca34f2fa68fc9c5ec835ff52f90b5409f13 release26-maint
+70716 aaaf32694876a769b09081e8b45790370d71a127 legacy-trunk
+70717 965230b3379f1b825c2f009a607814078bdc863a legacy-trunk
+70718 b9c499e9f74da95b9d831e491d8a809a5ba3a2cf py3k
+70719 b4a4f4b608abb1d0df05aa7870f437258c029940 legacy-trunk
+70720 ac164b54c8a8a3c16c43552755506a44deb35804 release26-maint
+70721 b4ad5948e197b26b4964a8c151efeedc52e2b4ab release26-maint
+70722 1014f0abdb572103cf797e2316e6bd05fcb87e70 release26-maint
+70723 42e87ff9f65dbd2674e9f729b00beb1593b6411e legacy-trunk
+70724 eb552a5909fb8d2176dc59db2eb4eb67e5a6e3a9 py3k
+70725 39b62b2cb2c76023e0d3900bae5ef564f37250b0 py3k
+70727 8df4e0c06e940263a284ef9f88e4bfd2bd95b85d legacy-trunk
+70728 2d38de002bbebbf097b965bac3af6989ce5d1c1a release26-maint
+70729 08bf31848a422ac1916c60e412649b57b16313d7 py3k
+70730 2bff9121be0f64c9e478c63be848ff535efc1bd5 legacy-trunk
+70731 175ba76e9c2b74b28cd0c29068a238e93c33cce1 release26-maint
+70732 986559da54de14104a4ae0d1c0784374c3812efd py3k
+70733 81aa40ab346d9616b028358f2fde789406efea4d py3k-short-float-repr
+70734 f2c90fd05d66dc9c78d11c06094d2a7d7ccc9e6e legacy-trunk
+70735 14e2750e2506e566b5322937c7ee57c2db2dcba3 legacy-trunk
+70736 39523461ef7e247035e8f3eb0388e04c8b4f5103 py3k
+70737 974c2bef2800f0ade4a58d2ecba9056b68ef08d5 legacy-trunk
+70738 573085015aa89346749d2456f3981be9e32358bd release26-maint
+70739 857be5d951208cae0a107d9ad1b0c06828934e44 py3k
+70740 376b821db428b8f75d5e2c41ae9da9706f095673 py3k
+70741 dd97d3c3fc6618f43fbaa7925074a9f539398bdf legacy-trunk
+70742 3b5bcb93bd119db86d37f1fd4f20de92c215b820 py3k
+70743 0e38b941d9e490beb6a302f2d672fde2c58a2d3d release26-maint
+70744 54a1076383895583b9d1d190295da1cfc4e74629 py3k-short-float-repr
+70745 2e5e001d7d36ad3b45214c9554f3da4566137116 py3k
+70746 99829c90805812783ed3b8188de7b42010e40a08 legacy-trunk
+70747 10a63b930cbae14f0034494b0d1d3231e2283a52 legacy-trunk
+70748 268b8eb31f4936e2efadc48710fe92e0cc82b19c release26-maint
+70749 52c36e450a48ac5ca65b6387d5d925caaf17bf6d py3k
+70750 7571aac3e0c20a373a25fbf56c54f5754166e8f1 py3k
+70751 b8e87edf2f662872fb56e306a24185ab5e079590 py3k
+70752 eca939022b832e37b7d68f0d6361431900487b7d py3k-short-float-repr
+70753 c371c0924f353c9a9166442feb390f888657d7c9 py3k
+70754 de63cbc561b68e6ac8ba6fa95643aaf30d0b3b64 py3k-short-float-repr
+70755 45a717450961c68c98da8157a399cf8d0ed15ee5 py3k
+70756 780d6401eed6d5ffaa5090acaffed8f614336801 release30-maint
+70757 2ff89f0f1d1902b8171265bd60e4b0a6c52007ce legacy-trunk
+70758 fcfc2c994a4aa0e74d940d8aa00e55854cde5e16 legacy-trunk
+70759 834a3a96d3ab483baaab1a95d0e2c9efe862c96f py3k-short-float-repr
+70760 e9ff0efcffa908ad8cf07cb35d7b598993dac0a0 py3k
+70761 1e78b3dcca42af3cfd7fe1de3d25a1278a62b1c5 release26-maint
+70762 80271ce09a66fbd99b833f758b01a6bd4c5737d9 py3k
+70763 94ba2fad9378a643a4ac63e0107b3a461263ffe0 release30-maint
+70764 80ec50d13857f289426e37c6c9548bf28c2d0c7e legacy-trunk
+70765 4239fa562735ab1154b88bef77e908786f230f51 legacy-trunk
+70766 56a09dd0e0f330147e3f19a34cc6f558c8d13b89 py3k-short-float-repr
+70767 f6b0505a22b39d964722d361f8fe7c46f610654e py3k-short-float-repr
+70768 43eba789158fdca39b11f322ed177d8e835c56a1 legacy-trunk
+70769 2f22271cf92498b82bdfe52f9c23163b3e19d4b7 legacy-trunk
+70770 a2887109f34068ed0fc06a54d5e80e9d1fb5f3dc legacy-trunk
+70771 0afb5d89466164fdd8e9ab60735f6e09889b844a legacy-trunk
+70772 5deb27042e5a79e247e3adc91cc60b6b34eb0076 legacy-trunk
+70773 3f81d9945e82a0e981bba139bbfbf23ce3dc92b2 legacy-trunk
+70774 9d178cb5466a0d742ca8a66175eff18b2c3cd5a4 py3k
+70775 f4c5e3a64be23a4ecafdbcd8f6c78a07369233f8 legacy-trunk
+70776 5ece0785df813d55ccaaada478845b5f15d4fa92 legacy-trunk
+70777 e0124f540ee5648ea90323cc7144aca911f185ae legacy-trunk
+70778 8976ec2cdfe5db7e85b46e20a76fe862106f9b96 legacy-trunk
+70779 e4efcb2990e25eb5ec0e39717dcb5e46aed518f5 legacy-trunk
+70780 970496db14bcdb917bc29631880e264511aa962a py3k
+70781 dcac0459230284843daf23bbe5adb589a5e50fc6 py3k-short-float-repr
+70782 0d62cc5b48d5cece49746f617a9288e6f5fd471d py3k
+70783 ea4c5c3bc7abb8c30c5249e8fc014b4d712f5539 legacy-trunk
+70784 11a456477e8258733f32589f7a2b4fedc6cfb8cf release26-maint
+70785 803d0273cbf7c0905690e65b12653cdc5f4db2f2 py3k-short-float-repr
+70786 75ec12b24448e2b4dc1cd55df4bb06115620263f py3k
+70787 89dea3df4cb5750baf7efa51d3df7768ac0bef16 py3k
+70788 c699547053a98c197b9a3160d113b0c15ec310cf legacy-trunk
+70789 104ccd06461a889a36e4b4309aa8c3466055e0d7 legacy-trunk
+70790 f28e6f7821b31b746e2f6cb3fd97cd282f424de8 py3k-short-float-repr
+70791 c1a3cec0acd427f318a1fd302523c510b6c928de py3k
+70792 72bbb0f8b09a7214bfd0119b1c39e42f5bd42c80 legacy-trunk
+70793 26b1ad09d1a7237f2a0db52b2afb9fc8b3594f72 release26-maint
+70794 ee222c4d129a2f685b8b9264f2a4fa29d3060eab py3k
+70795 52195fcab193d6947e3bced219f3ffe913440e39 py3k-short-float-repr
+70796 38093cbed6a6dc6378d4c6d6681d54e27002593c py3k
+70797 d12b02abe6dcb47ab2a194c167ed2165a8ebccab py3k
+70798 231d61c43e9cdfdd7645ea43fe55e02ebae622e2 py3k-short-float-repr
+70799 3da9dc0c65c6b1f0ad42f06eb8267701ae462347 py3k-short-float-repr
+70800 a91cf0defbd67668e4c37f6ec184bf01bbe264d9 legacy-trunk
+70801 d4f866739bb24c3412ed74d351ae2a6ab1c14030 legacy-trunk
+70802 962eba62299fb88887ed08fa74a146894e00e95d legacy-trunk
+70803 2356226174971eb81f7ae0632e8a9022fefbe62e release26-maint
+70804 ecf8424d74220b40069fb95bcf997bab7bd7d1d3 release26-maint
+70805 d2475d8069acdc6f8727ce3f8560a6cb7b80dbf8 py3k-short-float-repr
+70806 e4778ea8e4b28d546c937ce0211622952cbd472d py3k
+70807 6f460b7acf8f4bca710a908587ac37e20846c265 legacy-trunk
+70808 c98a71e99162acc86a2e40a2b038c814bebbcd40 py3k
+70809 07d65171a8006911c797345a3521d157539ee49b legacy-trunk
+70810 4adab724333995ba17b357bd65ffad874c8e2100 py3k-short-float-repr
+70811 eed4c7fa3e058742db181c9c161d0316338fad37 release30-maint
+70812 899aa2d189847b7f5c958a8ae1c97b2dd4b233a3 py3k-short-float-repr
+70813 6910792fcd4b6459e3fc24ef133c6d338e9e619f release26-maint
+70814 4eeb14a9c5d2d71c512d3c7fd2af0d81db93d204 release26-maint
+70815 9eceb618274a521fc55c0b5d1fc8e111b91bf6d6 py3k
+70816 932a1e514c16234fccb423df7ab3c2f1a0308d04 py3k
+70817 21c1594ac369fa09ab7ef9d38cf32f8792a80f95 py3k
+70818 c2b014b55bac241e1f829262462eb04d1d0b5719 py3k
+70819 2242c2e6c73ac6d691046ccce7e03b0e68ffc631 py3k-short-float-repr
+70820 05f90cecb2a29e0de054cd9c6844d6f6ce6814ce release26-maint
+70821 6694f3a1b6e7279ee8bc6744fc03a91d724d897a legacy-trunk
+70822 23451b09f15b923a81dab8d08a8d6a6ab9bb1ef9 py3k-short-float-repr
+70823 2b436310fc8bb05899c6f44a4fcd9c2cf092154d py3k
+70824 4436391d2a9f24be82107e72122d02b8c8431468 legacy-trunk
+70825 aa7cf3283d6e0626d0e9f08deaf396de09c82ebf legacy-trunk
+70826 4857cca45aa54308080746e17c0360f6d7f990ce py3k
+70827 398ec940277f6476cdbc2e2a3e660c784430d760 py3k
+70828 e129446dfbf9a1c2d3ac9225778190a820df3ab7 legacy-trunk
+70829 51429a196c75ae23a32883bdeb13c96ac7919ea2 py3k
+70830 ae60e4c20ae33f846462ed52bb3c49ef3e84c020 legacy-trunk
+70831 d8ceb26c66c48c2dfdd5183f029f3e695ff7217c release30-maint
+70832 dafd982dfcf4a0e23ad5736f3b600bf5971b288c legacy-trunk
+70833 534faf9187e8400a0aa53e0ac6ba3f1080a4ea17 py3k
+70834 375287327ce9efc703313a06eecc9f4701055148 py3k-short-float-repr
+70835 d186d353cc8170fae1ae7023615dcb95365ddb73 py3k-short-float-repr
+70836 b98523be0a15709fab931070f5bc0ed64165ef4b legacy-trunk
+70837 11d6e538a279b4a28784da8ed2acd5e0aec625bc legacy-trunk
+70838 a3b2a9706fc36e22c18542a1820fdb5bcdbfc0e3 legacy-trunk
+70839 6a6dd8ab3f2287ed67019b62bcba0f3b125207e5 py3k
+70840 a398a2f75d444ff5d134dcaa2b68f8e49b29d5df py3k
+70841 1d1eb149b32371b112ecc8d2d297dec34e05b404 py3k-short-float-repr
+70842 70729e7353db035484f1fe9d5b507dc8275e625c legacy-trunk
+70843 2d80c27975012df2990bdbf179a506ebb657df29 py3k
+70844 db50187b4c0cb915b6e53fb0430f5ab066664a6f legacy-trunk
+70845 6259f80dc24d60844b672a98e5d1208e6c02e496 py3k
+70846 840032d9efd62cab7f8f2559a57ec9429827f6b5 py3k
+70849 87171283d02f8ddf316744f0de93e27e5f8619d0 legacy-trunk
+70850 6ddbdfdb7a86d9ad80e8fe5f85890180781a5551 release26-maint
+70851 d495a11c76e9885eab4d8b387617c59e143ee027 legacy-trunk
+70852 7663c49c9bf6dcc7af39979838e3914bba0bd46b legacy-trunk
+70853 08c86f45ac9155c5ced77ecce7a6690334ecb631 py3k
+70854 fea74d9b2a5f32617f99072a0745152cd208f6c4 py3k-short-float-repr
+70855 61548b3e4ca83ef17c83ba2a23a8cf4d54a01b40 legacy-trunk
+70856 7641a3f0b2ec35ecb870bbda65def22d9f83295c legacy-trunk
+70857 e5d8f0c0d634061325d154aaf8e17ef0f2d3c9ea legacy-trunk
+70858 a020e69838ba72ae885713d32c0527364a543b5a legacy-trunk
+70859 d0275574c7cfe3ae7ddf954bc43d0dfcaca7b79b release26-maint
+70860 3d598175068cbb2c8a403eb04a616367683b06cc py3k
+70861 ef2816c56ac2ee6729112fd9b5d7751bdbc95797 py3k
+70862 8f51dd09f3f23c7fade98d26dd2d9aa69db00c95 py3k
+70863 1516fa223fc14b4292f061d82484fb7e59eb1656 py3k
+70864 510ed057b95fa86c605f48a858b66af835189df2 legacy-trunk
+70865 546c5021f0278e330dd563c486e5ea73b10b2096 py3k
+70866 e1607f6d9be875798a257a02ad1413ac450406da legacy-trunk
+70867 e70a6c46b3ab40f33bee39ea708be62a0c6ecd7b legacy-trunk
+70868 f4b90015ef00992268a69e4c9c146b1f0bc38eb5 legacy-trunk
+70869 d3e31bd5430ab69aaed654386c1d41ef4d54be47 legacy-trunk
+70870 02db2d3401334b35ceb97248c1c1dbacfa1978fc legacy-trunk
+70871 53c1b5f669652ffd15280d95f022f70ca00b7216 legacy-trunk
+70872 e6b3e696dbce8d44c3f58f91a9255bbb42101687 legacy-trunk
+70873 6096ea81de0b7a938f4260a219ae0b42b9198e69 legacy-trunk
+70874 68b7e8217c7e5046193a11e74651de8652b8c356 legacy-trunk
+70875 45ba475d4e98c7256670f01c57e46b93edd77d37 py3k-short-float-repr
+70876 b2adb7ebdb54f2790b0d072414b186c989320128 legacy-trunk
+70877 112669dff04abaf351f25225b0f2c51763f0419f legacy-trunk
+70878 ab9b7d5db9358fb3ddb7a6dfb2a6d4d0acf35582 legacy-trunk
+70879 3aea75a343373fd96902ee76734ae326de0e6348 legacy-trunk
+70880 0c17f7bee2a0690de65d89d9949ea5acdac62b2b py3k-short-float-repr
+70881 d9c8d1a5ddee2355895759e7212a0eb175e3dd80 release26-maint
+70882 9f8d6de8903521ab692d14fad0410b57dddf318e py3k-short-float-repr
+70883 b5aa8aa78c0f1c1143064706428c1beb50d5d59d legacy-trunk
+70884 a5301edaa704cb30cb662366d6be375ead09a887 py3k
+70885 1d7a772b3b1837be90bd073d111bc2013c8f06d5 legacy-trunk
+70886 2b9c916687774f6a33e76eb2eafcc1165fca9519 legacy-trunk
+70887 09b70d5888bfb4a2150e36c8be4de90545ae11ff release30-maint
+70888 efaa67bb3f06fa8e416a63cf5577b29a83c270b3 legacy-trunk
+70889 cb0969071f2ad94c9f5847c700907caff2756d70 legacy-trunk
+70890 9609ed7deaf890530718a0ea7abdc016fb6711fe legacy-trunk
+70891 07c5c0d9e7000acd1fe419884cbe241c6a3da372 legacy-trunk
+70892 21b27e115dd2500b636c4c8ce42621c95b6d7f89 legacy-trunk
+70893 fbd40548130de7cb60c2620293e1a1f91e4b07d4 legacy-trunk
+70894 5744468e609bdbf58df16662f14b94606230d2b6 legacy-trunk
+70895 80ff85d87f675bdca6cb895e311216a5125891ce release26-maint
+70896 f6d9c2089170741722acc9b367e9371cc4e274bc legacy-trunk
+70897 587fcfbe08b638987a9a0faf8e40709f1d00352c legacy-trunk
+70898 6640996f04e7471bf4d67f8e9c7f2db06cd5e1d3 py3k
+70899 3bf9ae437606c4a2c6b32ca6e993f37047eeb663 release30-maint
+70900 21ba0b3fe819fd6c37e782126980a443c8e33a0a release26-maint
+70901 0d083fb0665df97b03211c448a6996b947da15fa legacy-trunk
+70902 fa9243bf525686622b3d6296121bebbf1c502cb2 legacy-trunk
+70903 e5286be24ed5106acc84a35f66ed69e64d8806dd legacy-trunk
+70904 7df244110dd5fa1795e8b3aa687a12d7a255cfcf legacy-trunk
+70905 b657978d56ad6e213c78c47384c99ec41e02fd1d legacy-trunk
+70906 5f3fe1f26b36d09d8f0d38361f76ce896d2444d3 legacy-trunk
+70907 1839b8553a2dbdcae9eaeb809c14e08e9a506ac2 legacy-trunk
+70908 5cf74137c0f8608cda9884b31424990ab0274544 legacy-trunk
+70909 e2818b9f964be82a8e65766ece3580e357045a6f release26-maint
+70910 5856fae009e86d563ca3510bf45aee61e94210e4 legacy-trunk
+70911 1e0534319a3ee7e67514f4db8d753850c01c778a release26-maint
+70912 9b96bd090908a67938b1757ab2ef59aeabe34efb legacy-trunk
+70913 111352112afa8ef2b8b822ca763c1c60088c6fcb py3k
+70914 f7b11bf01a1264d2223672189bbda51b69302fe1 py3k
+70915 69646f9cd70b51185f752f73ca5cbad84fee6298 legacy-trunk
+70916 fa3b2ed20d85728f23cd071cc1c2bf89f7fedc6e release30-maint
+70917 914a5ded1be3c9f6f60efb687efb0cc05efebd27 py3k
+70918 ffa13aff29db1dc00763d8c602789a4d2925f9da legacy-trunk
+70919 8843a8427a8c82af11869b75ea5f7cf816003749 release30-maint
+70920 82adedfd2324f4b390d953b2e9744f9a8f4efdd5 legacy-trunk
+70921 f758dd2a89689bc20064acba677c3a060a3d01e3 py3k
+70922 981a9b3d97f3afe2d72af689a90a63ee6c5c7e29 legacy-trunk
+70923 d3f5a9f041d840cff14814d5e521e3c959d5c1d7 release26-maint
+70924 30d874b1c4a72343ef6478eba116fc14d09248d3 py3k
+70925 002fa9205aae1abd8435d13f2a473fb7a8282119 py3k
+70926 7a77e4beae665d80733bba723dde55b85a7aba42 release30-maint
+70927 7655142f522414ab929e91d39c2506dfd815d74c legacy-trunk
+70928 b4026ac781146535752aa8f7973c40b147d9a26a py3k
+70929 f84340886936cb2e85ccf9f4fe6b2d5a880eee70 py3k
+70930 57044a3652d8b42e082ea9a0bf51430ea259c2ae legacy-trunk
+70931 184ca6293218f96f42a6729149670314ba018a92 legacy-trunk
+70932 04d4188fb411605e95ba40efea11ccd8454dd635 py3k
+70933 1ac1193a61d2f5f7d284ae9c009981c483d7506e legacy-trunk
+70934 e555fd8c4b6ee79ef0342a1665557ce0437bd4cb legacy-trunk
+70935 d85090a480ba4ab0ba4afa45cc5dfbbc3e0c7bde py3k
+70936 513d96bf0d703526d21c5261b4f2420055ac2623 legacy-trunk
+70937 1ba65a91e56be9cbfb164f46c73931fa7cd8d31b py3k
+70938 79a4206176413cdaf8dc1a31f255ff7cffc9bdc3 py3k
+70939 cc2c7133da4f5f4762b82b565ab38bd7c286fd44 legacy-trunk
+70940 76235580aa3d47c044b7c9c23fe7f475838748e1 legacy-trunk
+70941 ffa81bd2ec72d67dc63139557d5cc590573cc806 py3k
+70942 acfc18cdcdfb772be46fd7c767aec72b8942a4fe py3k
+70943 082b250d5ee50fdb914e99194d717d31b0e9951e py3k
+70944 fa7c3765d10ff4c3efca91ab21f7b8d0a0fe945a legacy-trunk
+70945 0530aadff696d1b66c667cbd19b10d2cc2590ec5 py3k
+70948 7347d916f13ae4ce19234641cf1cc4d533d5142b py3k
+70950 da7448ebce8b1186577828b21459facf44e59a25 release26-maint
+70951 dc53f370ca9d74753a9500557e8dc3be02f5ebc5 legacy-trunk
+70952 19190e058d594305f091440dcf47b13e59c1fde6 py3k
+70953 97fd0d76ae9ce7b1f54ebc8ec486f7767e8c2513 legacy-trunk
+70954 027a3adc0d8f562000f246a074bcc18d6c138b3e legacy-trunk
+70955 abf6dad7d64fe2838527a0f4628f874fe9e827ad py3k
+70956 76d61c12623cf91e7855d6c07acce1cd1c278307 legacy-trunk
+70957 46f1ce76199eb45199fde134891265025cacb762 py3k
+70958 df5cb3836b282aeb2e2ae36111dbf8e4cde9db73 legacy-trunk
+70959 ce0e28dccbc228abb9e8a17462606f3a77be6217 py3k
+70960 8b51d96360b03c5c6521b50be0dc9ca494a7d5a8 legacy-trunk
+70961 c3f07b677afa674936d1ea348a69111b1c06dd18 release26-maint
+70962 e9fc522aae9a739c53731c22bb9bddd3e03bb3fb legacy-trunk
+70963 3456671a72bc166b5118233e7006416e8a0a93c0 legacy-trunk
+70964 18bd3cf5287ff0089ddc76a98cd42857a2e05481 legacy-trunk
+70965 b5d23fa9b8a4847f239b7ab49ce16349e74107fa legacy-trunk
+70966 287df3a09f3530e355b7c6e72d54513ad7d7de31 py3k
+70968 e8ef13c9859709c5d5b63273be8269c3a0d7c3a1 legacy-trunk
+70969 2e4dbb395417cb6d403d45eb7ee48042fa7b1b73 legacy-trunk
+70970 c337f2028d8c77e076ee70f5259a41a03ecc445a release26-maint
+70971 16c1442623746222b030fa8ba06adcd6a3b6e1d4 release26-maint
+70973 ce3b5caf4522c8a19802af1e1df516be78d689b0 release30-maint
+70974 8dff406403be2ff7e40bc62ce7cb2e556d745f12 py3k
+70975 b814b0c353471cfb4b74720832a45fe56af30b9c legacy-trunk
+70976 2d95c0141214f84e485b02c8ecfc4ef9a6f790b0 py3k
+70978 cef8b8259ac98eb979ff0cba2161564cd4910166 py3k
+70979 7e2bbb4dbf8759e1541d75c3b40388a825138363 legacy-trunk
+70980 a73373ccccc21e0df253aeedc35413d287359d1b legacy-trunk
+70981 42da7154b270bbd97929b31daa974374dd3b7e0d legacy-trunk
+70982 675415c5b91257938dae0ee2cac69c78b3a4a20f py3k
+70983 6b6ac6ac5566a84574c58276350d92c5adf1b476 py3k
+70984 d7f478c681b9e305e8ffa328df68a84d6ac0c094 py3k
+70985 f8aa8d3d66078e9ba000b93a3aebba8975937f3f release26-maint
+70986 e9e87d1a389c53d0bb7518ac974237c8a09df0de legacy-trunk
+70987 f15e7a931334d500e57cd53482d1e01b105702f7 py3k
+70988 affcf0705439a5b6d6bbb324979fa77638afbca1 py3k
+70989 f942893fa4d8d92b64b6e1fa8767156c44b3d39e release26-maint
+70990 da2c6dd26e88dad02245cab6217094d975ee4d4b release30-maint
+70992 9e579bab76f1c572a52061aae70e2046a752cda2 legacy-trunk
+70993 5102bbf4ab7495c5918b273f1cfa01da4b66ebf0 legacy-trunk
+70994 9856b5be26c4cabd91c3a17efe3ebc280c0a6754 legacy-trunk
+70995 3b34c93749552b0323310f5e1da3a775f4e9ae2a legacy-trunk
+70996 9ed9d204130665441c8fee3a7f4e0aaa0a402595 py3k
+70997 83f9e3d10edc488fc78e11ed612235ef81e9e77c legacy-trunk
+70998 e3a1969fdbe5e0afe990ba84140ac4f64a370386 legacy-trunk
+71000 1e1dadbbdd01b9793924637c4d2bb38fa969e53a py3k
+71001 cf73fb5cc3ac9d83becda4cfe39b2d37eb2e732d legacy-trunk
+71002 b43f14c103bbc3aad1833335d1aaa27476c4a1e3 py3k
+71004 2dfc337174938f855b5b308545c3761f3aca771b legacy-trunk
+71005 755bb1f9b0e586fff1475810f13af754fd498794 py3k
+71006 1b8d68dae57212553339d5f978e3d4d38bd92c41 legacy-trunk
+71007 eb62217bbb53737be74c70ab7313b23c18d0a7d7 py3k
+71008 8503a3d0254d8f6470bea372040bffc89de98dee legacy-trunk
+71009 d343e802b2760aa700cf2ff7f17cac36ce540477 legacy-trunk
+71010 080fdfc43f941868647d39270d0109650d4bba48 legacy-trunk
+71011 36f25bfb3a1bccdd443d728f32a5757fa77bf0e2 legacy-trunk
+71012 c5a7ebec59847afd56d469b4672fe46754635d9e py3k
+71013 a73d7326311dd8c95071566baa13560588084e03 py3k
+71014 f390464639fbe858011b0c660b3b607540d13966 legacy-trunk
+71015 475ba43cccb1e522d3b95568f141590737c9b4df py3k
+71016 c0138b2d4eedc990500bbbfe1cfe4d54dca851e8 py3k
+71017 926fd217e2dca1253104a016e05189b596b4eb59 py3k
+71018 33eb1697c382de8583a9beff610d3cb551b8a9f1 py3k
+71019 35c3e1d7cfdf6147173118c440af5b82dc6a9e2c legacy-trunk
+71020 bc15b483d3846da0d9ea306b74b7bc1d8d8e897d py3k
+71021 a0e211b04b2e0c84d02546c1d59451cc1f2da4aa py3k
+71022 1086d7ee8b0b3fefd7078e25d35f9baa214c9d78 legacy-trunk
+71023 b984456196af269d13f5a947e3828b4f02875ff2 legacy-trunk
+71024 7e86fa255fc225cd720b16f8ab62ed24b2202bc2 legacy-trunk
+71025 90690eb85380bd3b8c21304f80bc36249355de29 release30-maint
+71026 f634c5455b4f3ab5051b263d56322ec0e32e209a legacy-trunk
+71027 3e1a80525f18a0111ea8164c563d4572ac376cfc py3k
+71028 953553ae8b84ff0ef983d8c20fbd02ac891e8a6c release26-maint
+71029 c33959392953b01afe621933cb99af1ee04f9d0d legacy-trunk
+71030 37ffeac3a1a68d6ff57b76d0315aa80a78c76598 py3k
+71031 1ef3da6c434cfb2297b2d2aa2730a5968dfe7938 legacy-trunk
+71032 1b50f78cddcbb871a43282993b43e6b32bfa49da legacy-trunk
+71033 fd5ee3d0f5528f656d686a6965148af89be9722a legacy-trunk
+71034 54e093bd887ea74d303a5b712656ceb6ee87e6d4 py3k
+71036 23a2e1584c02af2ef4f9233e97b45397a152008f legacy-trunk
+71037 8d84f220ff27708e0757c95d9e95240407774834 legacy-trunk
+71038 5f179f6f07e0ff8348548087aaa1b0fe5505ff75 py3k
+71039 fcbe1ad24d410ed7d831de48dd9bf20dec5f8f27 release26-maint
+71040 0bc62d7dbf5492f4204d662e60c0d0c66a4d6246 release30-maint
+71041 71f6129ddad466f963da8c0d429e30860ae26a42 legacy-trunk
+71042 53916aaccf2cc23c865749201b2b091365a85cbe py3k
+71043 1abf9e30c19f9f22ee28fe21eb535c53a4c23c4e legacy-trunk
+71045 acdd11e39f0b0225741ae02fd241a4d9b9d6f049 py3k
+71046 c589483a72aca554cdae9cf25499cc202b4e50cd legacy-trunk
+71047 3580d3c072ae5032b13ada384e69a9dbaff35230 py3k-short-float-repr
+71048 a33bc8183e4c1768269b54a25e5e66391496cf29 release26-maint
+71049 2e223868832a81fff9f73b0d31e43e1e80e26e7f release26-maint
+71053 759f43c978878af9150756b86e24d3aab3f88b88 py3k
+71054 9489a9e7afd43832644b651140568ab03636063b py3k
+71056 c801a67ce292e6cbb84b8688a8ace6a9ddd2c33d legacy-trunk
+71057 f81424972ad11877cd12c747150d53782dde83ca py3k
+71058 54b2cd21ab46ce4edb1b679a52fbaf2b334fbb43 legacy-trunk
+71059 7fa0f81d607e71ae6ff2b990f802e6d7a35cff0f legacy-trunk
+71060 cdd5471475667fc0985ce3529c10c58a74ca0a63 release26-maint
+71061 d1c5367d57d655618c0101e2cded50e9b32c57b4 py3k
+71062 e02c5b4e4e92edc90a0361f92840b41be26631a6 release30-maint
+71063 98c3449da3693bd2fbe22cbadecaea9a4a7296a7 py3k
+71064 1b483911b2e668e040c33414cf9c13e84a32a9a3 py3k
+71065 bed524ec0850ceb6d477fc81b27f71237bf18dc8 py3k-short-float-repr
+71066 66464db382b14d5bc046d10f8e347d44e7f72fa1 py3k
+71067 9b535ce99d2daa7bd21a3a9b53012db4d3117c8d py3k
+71068 d28ea2ee7070d36050505801318c999d8ec1912b release30-maint
+71069 672fd7a41d35f2bd8a8f1a182bbec8e06b43fa10 release30-maint
+71070 75efd757434b85f85c5e7f225fe0cf1ac37abf63 legacy-trunk
+71071 b3d5f685d27acca5ea669842299217679a460611 py3k
+71072 cbe19130b2eb63113666e87b6546559e14381de5 py3k-short-float-repr
+71073 20e7aa42d6fe4d98173c19735c225499ad6cd5b2 legacy-trunk
+71074 f13ee8ac6d54527751d281b398a1b5985dc417e8 py3k
+71075 f3c4ff214b11ec6f1239cfb6d015540bc09df8cc legacy-trunk
+71076 5c37ab07a7dc34198826ecff35a74ae93840df23 py3k
+71077 9be2e16a71df5b65584344fb11a12c5c1868dd25 py3k-short-float-repr
+71078 39be9ac89be98ffcc29f8e2bebc1d4a5154d6ce6 legacy-trunk
+71079 f6202b3ef8ea98e4e0be2bbafebf143d83904d5d py3k
+71080 183d6072e1e5df93f8cff390b1f847b3d69a08a6 release26-maint
+71081 1bf671217abf3cf79f7eeba2c162be4ec58c8365 release30-maint
+71082 dcb368fb6adbfae5ae8c9c3318a26de5e5cf29bd legacy-trunk
+71083 98686f307de426c609fcde0d918f333152db36d2 release26-maint
+71084 cbfbff233ef5c17cf6dea9e48b14bdcc69f45580 py3k
+71085 2a27f9ada8e33e4794811f1c72743966a2824088 release26-maint
+71086 cac209cf5e4cc73902339e870317c59f95582095 release30-maint
+71087 ae482e52a16bc089e915eec0b0b3194d5fb3c4cf py3k
+71088 4e5fe8b6d101c8f361d64b7018d15d6d07f71d1a py3k
+71089 b41c29debdf69a790926cd299c307563fa5233dd py3k
+71090 69662bc3a9f6b6d320871be9c906ff643e2bf5b8 py3k
+71091 643f44ad387fb46430b065afa8665e6960ee2601 py3k
+71092 8a26f9620b2118d7bb242e00e108755779bfc7ab py3k
+71093 4757ddaa897dec93f2f5a3d1b899dd17c205410f py3k
+71094 689434454cb8e531288c52e8838ae4d4beabee65 legacy-trunk
+71095 a98091066e01b206388147fc5fce06e45cb9a02e py3k
+71096 28096ed73153ed696870badecb0d829e0dd74c86 py3k
+71097 c2f9e13542ab2ac2f95d0f0da69b3501ffb87f33 release30-maint
+71101 15c8e9dd19967fd0111717fccc68fa22355d3717 legacy-trunk
+71102 5f5587f3c4d55abc23d1edc6a2e4f9d02eea0e99 legacy-trunk
+71103 44954e6a135323b4401701f4caf4adcaa92a1546 legacy-trunk
+71104 faa3473e4534484bc23fdbe021619939b17ca5a7 release26-maint
+71105 c3c6b7374bda2ed8d71ca9cf332b884e79dad5b2 release26-maint
+71106 d19d890138f1ecb1f8492cf369c05a5a7f138729 legacy-trunk
+71107 2df1517d868c9af070a8555292e824655190bb69 py3k
+71108 7bf60d7b09e9a2062d25560879adb75b5c88cb3e py3k
+71109 b4f157f8e4a7b98b50295df50bfb699a27a0bee4 py3k
+71110 1fdb5659ee089682c1dd5ffd384cb3d2aac4c662 py3k
+71112 055b3027d568b9639413216c72661804d7db6b24 py3k
+71113 6cf16ea8a16de6b7347e3eb5d7b641dee5d3f080 py3k
+71114 b4defdd7f431b5169c066d35975db350ced13afe py3k
+71115 fa2aac434d063656c77e9a53a165729607720af9 py3k
+71116 fb7b7727a731ac609d834bfd422f5155f2d7ba0a py3k
+71117 5174ccfb01b82139529487b06a0684900dc19c6e release30-maint
+71118 4925196a2fd8bd522c0d095b411e57e039065c4f py3k
+71119 f121bd956ae05109f35f7be33a38fc29666f65f9 legacy-trunk
+71120 90419e1b4656b58fbd69cd247f958057fe0cca05 release30-maint
+71121 8b53b969b6281d8017c408d3c63960eab16d6082 release26-maint
+71122 547a238a2ac492581d3957036f323dff97990c26 py3k
+71123 146a8fddbba277877940f5a393d186766ddabc48 legacy-trunk
+71124 b387ca7d0fe62cfedba548c3439518b0ef579b21 release26-maint
+71125 a1beb16cf23694d8e2d0f4c3d0def48cf7f0127b py3k
+71126 bc084a97318b9334371f3fcc8886958e5ae9e06f legacy-trunk
+71127 5f66dead1175a08d84bcdcc76ac4c13f7e9d2562 legacy-trunk
+71128 c4cacbc9b3fd24423fe9c669973b4c218e759c49 py3k
+71129 a80e2ea389e30b3f077332b2bc4d07bcd1d4e019 py3k-short-float-repr
+71130 5447e1f7dbff4cb68659d0f8e29f20a434e67891 py3k-short-float-repr
+71131 2474fa9c3855932162caf32f43e3df1dc141c0e3 py3k-short-float-repr
+71132 7d87e7c06b59d04409acaa2087af9e4021dadf01 py3k-short-float-repr
+71133 48a02d5f5d428d2db9dbe085cf1da12f3f45196d py3k-short-float-repr
+71134 24f1a9892d49cbe95917e75c1549a1753592e758 py3k-short-float-repr
+71135 422248e6b73b90d3f75db66384d29f29e76be11b py3k-short-float-repr
+71136 8175bc03134e32b8ab03df84745f589a4ed2ac51 py3k-short-float-repr
+71137 661bd558363210c1df38ed0b0331acafd91e8dbd py3k
+71138 e2542a7d4acfcf76fd6d5a9464e8dca0394596be py3k
+71139 c9e48e008bb536a46a7f96461600ff250132262c py3k
+71140 68300da12dfe0dc8bda19b0ddb0566ae7cd9d290 py3k
+71141 94150175196912da7814dfaa061546e01953dece py3k
+71142 6019fb1da9e11350b5b8f68b65c6ebc874a9a10c py3k
+71143 ca8ceba737147fcdf30b0265675c99ee43a14e1b py3k
+71144 d638ecde35725944bde5792397bb8214891f6778 py3k
+71145 74cf20a61becb67260c3a39fa0ae37ea5dc210c6 release26-maint
+71146 716accd4b603e92648330c6f9c41e034ff2ae4ef py3k
+71147 93e92409cb468e96d39e88c5abdb5019bf7a1b0b py3k
+71148 d36afd058d8bb6ce50d4257fc8efb1739763aa56 py3k
+71149 f65f0118331c291805577106352e3f53d78176cf legacy-trunk
+71150 e745cef8f4075bc9372377fc1f1ac9febbe2d24a legacy-trunk
+71151 61b511d05ee9472247c6234755f9298f3f6f16ac py3k
+71152 634502be8dccbde54a457e8c926e66e344187f03 legacy-trunk
+71153 cb58c973985c9c2ed1b9a504da61f9f4d09cc55c release26-maint
+71154 73a7e6aba7b212f0e91035cf1deb3b54f37ff96d py3k
+71155 37346df2b884fdef377744fe85644c0e7acbe683 py3k-short-float-repr
+71156 8c7c5a358db95e41ee1f0ba66bb159b3ecc9e3ce py3k
+71157 17784185ad935251fef63dc6286d0527f45a4067 py3k
+71158 e6568b3c2ae75b6744552108f27c414800528049 py3k-short-float-repr
+71159 2f52a3d185a30d7ff9cf2aae1ec5f40b2b47fdc7 legacy-trunk
+71160 3ef9756ffdacda2154cf40e15660296d6251493b release26-maint
+71161 bd74c4ed03a46ee136f45a4e59ae4b59243f6a02 py3k-short-float-repr
+71162 1df37f09747c4a9c777e13997bed3d35b7e1cebf py3k
+71163 71355ddf373ed9d7c9f332af338e883f54e3f590 legacy-trunk
+71164 a8f17cd82d89f021249936f816990b224fe2d62e release26-maint
+71165 aa8930672aa4d823a25ff7832711838588420196 py3k-short-float-repr
+71166 1f8079ecd3700c865ab201e4721b3dbb2c3d3061 py3k-short-float-repr
+71167 73b016ec5b8fa78ac5861392ba03db216ababebc py3k-short-float-repr
+71168 3476ad7590b780c8c5c16144475c081436a800ba py3k-short-float-repr
+71169 c50c079b09eb67166193521d9920c49108cdce05 py3k
+71170 28e30a5c639d7f0dce6160a2f7dafa5cce4a638b py3k
+71171 adbde5c3b5fe4df40c7f9ff63d17f11383b3ef66 py3k
+71172 458ebe4f5a588f6861d2428fc2db93d680ad8af4 py3k
+71173 7ee1cefa6d62b929a1c5e4ab36df99d5eb913cd2 py3k
+71174 58a7c5094523097f62707c2dd87770ecddc0a904 py3k
+71175 a3bbdd93b389a665240c52c0f83c74fd8f09359d legacy-trunk
+71176 d7c9755b6177330040a26513b0ffb34b8837ab1a py3k
+71177 cb478152470496debcb953dfd7881f538e77c858 py3k
+71178 2aadc1afc9a194d0a0cf7115d10d11b7d3dabc97 py3k
+71179 5347740d4d5dd4eb3198fff27627d266fc31eaf8 legacy-trunk
+71180 d2e15629fc297a00717fbf84c273be211b08ff1b py3k
+71181 7c2a04e218f21b93d0c7d576ce6e26fe75ba64b3 release26-maint
+71182 46b6b8415dee76cfaac1536b33db7b9e5c7da9b6 release30-maint
+71183 b14e9ec9d99f5ecc1b61a32cc7bcc9eb6449d548 py3k
+71184 9a912a57164f65bb513abe9e238a534454e8ee06 py3k
+71185 68a9e6e38afa8dd92aa51bc4c70cecc57010dd7e py3k
+71186 c17ef14bdf41caa3ead46c96296b0077a279c75d py3k
+71187 35630c3edd33c8090b5477a79c2883b99e273fa4 py3k
+71188 ff7933f44c4162f5944a08de7ae792c519fea83a py3k
+71189 aacf5094a1b580fecece4a614e7435c061cd3897 py3k
+71190 1d793ee15b6f6e8d8d13924e91a87ae38515edec py3k-short-float-repr
+71191 49aef4141b93f28753f7caa55e8b4ef8729d5570 py3k-short-float-repr
+71192 5bc8cf3d90b35531283357ab062adab7fab0de5a py3k
+71193 a014dc47b552eb7e372b741fe8debeed551a5c9b py3k
+71194 ee430e5075db2adf8124e6b94916a89ca41d3171 py3k
+71195 9ef7bf4d85908639928bb15f887a4b1238aa3971 py3k-short-float-repr
+71196 6de8636cd81731e94350938df6a669c017403cf8 py3k-short-float-repr
+71197 b4ef502fcca0287ecc7945d22954ccdc1226606f py3k
+71199 bdc574782919d78c11520d4377442561b03b5783 py3k-short-float-repr
+71200 e02bdd6085ffbeb5b6d29906cfa466786b926bcf py3k-short-float-repr
+71201 761048a0a8d99b9670debd5863b4cff3e2d17d36 py3k-short-float-repr
+71202 327263fd2e6663a11cf6b34ee46c1aabc7d4f4b6 py3k
+71203 19b0db1354f70e76b9a57c90bc06e7719ae47050 legacy-trunk
+71204 d900246205687e91d1415317bcd9d2d23d046048 release26-maint
+71205 fdcfca715bf3dad0de8bb4644639909459f728fb py3k
+71206 e6e5a0e4354346b53d97b7fa883857428d5ae56f legacy-trunk
+71207 0fe38bbd973cdf1b3ca5b3d0d35b7336329f9044 py3k
+71208 de5f18639a6ce1fc39f366b0fb7565567bab4707 legacy-trunk
+71209 78f310b961c02fcbc723b0db06638f1d52a2f59e py3k
+71210 9384b43d426fee5fa4d55de56e525d38fd8a9470 legacy-trunk
+71211 addd753ba4d96b7366bd38ba5975dfbb937fdbfa py3k-short-float-repr
+71212 18f1c56ca6fdbf0d30e8a4b48ac344d9cc203a51 legacy-trunk
+71213 0f7708b0128c07aea445577943d23c37a3525dfd py3k-short-float-repr
+71214 1ef02ef48c424bfc89f354cc8f89592292fe00a5 legacy-trunk
+71215 5e8de6c3e0027526232665d3b4b10d1e2d4115d4 legacy-trunk
+71216 e421a92b252078da7fa60af50d6983cfaade9183 legacy-trunk
+71217 0006b2adc7e407839b866dcd82caff8613487e95 legacy-trunk
+71218 587a2aed39f2ed3da41046bdf33865b7db736e92 release26-maint
+71219 eb84530577a53a299cee6a74a509c6326ecffacd py3k-short-float-repr
+71220 f5cb3b33b7941a704a29f1fc6255317f1f152322 py3k-short-float-repr
+71221 f550e2463062993ae9cbabd5e8f56c56cc283d2b legacy-trunk
+71222 2bbb60c00eb725782240c380dd2f697c15b3321a legacy-trunk
+71223 01f4e8803ecde006140f4768076746d2da81a043 py3k
+71224 98f42392835b69aed5fbf803f7b9f35328322902 py3k
+71225 a7c74e09de3df0ae0016c5d2fcb7c2616e070d07 legacy-trunk
+71226 152e08dfc1af5e57a4e322c48a4948c4e7051989 py3k-short-float-repr
+71227 58d171780fd8954539cb561f420cb191a785ce9a py3k-short-float-repr
+71228 5cbdb5157fa76c5007b4f6e735ac7cf6a406e06c py3k-short-float-repr
+71229 bffa77696926dcf591c1fe372e009fbf2891dbb2 legacy-trunk
+71230 eb32a1537dd7f8b9efd37d63dece342ff9412926 py3k-short-float-repr
+71231 f1cec37698fe8d0419455ab1d4100c1004188529 py3k-short-float-repr
+71232 66354bdddcf76dd4f3188b24e10404f8e72b6506 py3k-short-float-repr
+71233 1cbeabf888a14642c1c10d6828a31c79983765d6 py3k-short-float-repr
+71234 eb94517dfbd6d7afb0ebb982bfc13448ad17d08c legacy-trunk
+71235 85c5ce6d7f9c7cb09b6214f4048d96736aff1274 py3k-short-float-repr
+71236 ed7833d482c81f2e77ff8c4e9d5d92ebb0242d99 release30-maint
+71237 976b305aadd29e0e2ff902f9e37ed54804517c4a legacy-trunk
+71238 6eaf97721d3d8ad1f110cf9c5c1ed11802b87f5b legacy-trunk
+71239 37d6af6f85aac4dd8d447d9ee1e142e87a0ed93f py3k
+71240 8c61e7caa06cf780a458752678299ed37fda53ba legacy-trunk
+71241 da1e5483aca0136a5b5d8ddeb90917ae4f8f941e legacy-trunk
+71242 3bbc68449f94e7ebc2a11bc08f46a34012701a8c py3k
+71243 13ef1190eda9d64e15bde81b297f3751279cb7d7 legacy-trunk
+71244 24ed5d851720cee0e02ad5a2ad767a314eca7ba1 py3k-short-float-repr
+71245 8ce9edc88969b8d8e1fd31836775547351b9b7d2 release30-maint
+71246 b9087b645cefbc43bc39c7c20a037866acfb5aa0 release30-maint
+71247 7612aa89bf060ecd2cb5c7cc64aa7d27c8bf66a0 py3k-short-float-repr
+71248 a7e5b9d90b125fce6ed7d0c0b3b3dced4c7e08c1 py3k-short-float-repr
+71249 8d22873e9b26d1d59cf0d37581fb5b15b6820ee1 legacy-trunk
+71250 43c889feda40b117623997711d63a1f2feca8bc4 py3k-short-float-repr
+71251 bd1336a3a6863ae2751ca26477ca3adf63dd2828 legacy-trunk
+71253 b2c68df944639dd434ad3b38c344cab8118c9256 legacy-trunk
+71254 e74083301a36e08755c49aec8af16fbe055b87e5 py3k
+71255 a16a0456978f7ef7e98b32ca7672f697e28c5a1b legacy-trunk
+71256 cfd7136941a099923f890c2b185fef3da98807d5 release26-maint
+71257 ecb2103ba0279ff57cf42ad34247f27618205e93 release30-maint
+71259 7b4ef0b87ddcff93135cc103441475098d55e100 py3k
+71261 792bb885029fbfb285fc9d39659f3d2e9ba89729 py3k
+71262 4d97611d1cca48a14ffa1b69389566432c839f9e py3k
+71263 672b0c041ba6384ad84b3bc3c669bd389a2de4e2 legacy-trunk
+71264 c9ecd45a5ea2f103a34e48cdea0918c1e9bab887 py3k-short-float-repr
+71265 14e00f0f78b74cf4104f75c9fa0c201ff795d6b1 py3k-short-float-repr
+71266 2d00ff3d2f5a3c5cca8358fd51bb3b501efe8fdd legacy-trunk
+71267 a14deb9480f4d320dad2c6233acfd44784dec64e py3k
+71268 f8c576faa9ad13e9aa66063b8b8df90ce5b8539c legacy-trunk
+71269 54d5f2986af42cdd78bb726af0fc079781769adf py3k-short-float-repr
+71270 fb2ea8bb3a33dc76fd854142df8817406b463e42 release26-maint
+71271 b0429c7fa71aaed5cc932696e093d5a5246c1281 legacy-trunk
+71272 4acbbb3e65e2b05821d43689ee3af5ba57304341 release26-maint
+71273 251bfd2d996a2dff8cc13264aa85bfae58b18462 release26-maint
+71274 d3887dfe661f9362c3e2cfc13432422e60e14597 py3k
+71275 3889d9528601e3be18a62b848636a60b2d450c58 release26-maint
+71276 969ad10a8a72570b81c584a5a4a13bbc4a90e22e release26-maint
+71277 d088436ac36b10a9f33cee918f818d17d0cc49b1 py3k-short-float-repr
+71278 8237de632d6f6815a36882f96453e4a9be2d81a0 release26-maint
+71279 8b53150134f5db14d223de0a23b9fdf05a75652f release26-maint
+71280 9a4b19330aa931abd35861fcfee624ff4e0c4412 legacy-trunk
+71281 7e7813ada2d181c47249b79a93fdef33f8fa0d0b release26-maint
+71282 f3b26a729e82f8fffb174d493c69c6e99ab89058 release26-maint
+71283 f67a4f1f230d740fdecba53b3594f8fdf932409f release26-maint
+71284 934d9c3cba4184b74026938e67f4e7897c6627bc py3k
+71285 b69349d4b9e88316b75dc828647564d49f46b705 release30-maint
+71286 d6de6844fd7141b36c646d060b897755668cf2f7 legacy-trunk
+71287 24fa7ddd4dcce48b1dedf10d67ead30c5d9c3fce py3k-short-float-repr
+71288 1d8cb76e719b7e05084291b2c8d2cc215c91be49 release26-maint
+71289 b36b00ae29ffbf6e553bc644270e3a72f6c85cea py3k
+71290 b33bdd2414023589c6efcada5ee2254053c1f51b release26-maint
+71291 433de3d596078d1ae55ad25974f087ab082b5a90 legacy-trunk
+71292 0c6b16a2f91b75ef2170a36bd59f2a7f8625e6de release26-maint
+71293 548ca34357cdae5c7f19552b1a6cf2bc7c9addd7 py3k
+71294 da0c1f74ca200bc8a1fbaf01a2ed4b260dbc2998 release30-maint
+71295 4b881b4a90e95eed7fd4526c99afb1fb21510e93 legacy-trunk
+71296 364bd002b7f8679fec13bb51f128302dc0b0b1f5 release26-maint
+71297 5a7a33c94d001c8bdc7c8866fbd2a5359644672f py3k
+71298 ec2e4b5a0e90dc4d60dc0241f0912eed23118453 release30-maint
+71299 d36a4f9203783fa99adf8ec3973a5b6d0baa4bb2 legacy-trunk
+71300 414a31181e9dc3801cb73fa70e1776ddc1002f13 legacy-trunk
+71301 73600515999bca0f1de04964392506d659a53ba7 release26-maint
+71302 e363958fcd70a43ad07b39df999552d0fa1cefc1 legacy-trunk
+71303 c6c4398293bd682b355f1050bb16bb3e18c8b40f legacy-trunk
+71304 986201aca68b4344bfba39df8cf94147448fe3e7 release26-maint
+71305 2079edd52858742cad91b19319ccf21d6b877495 py3k-short-float-repr
+71306 efc7e13a7542325bb3f7309fbebb24ec5487d757 py3k-short-float-repr
+71307 b4881f8ec706f81213bfbcec1d8fd71b3b04405c py3k-short-float-repr
+71308 8592677eb352cf85c6055b9dbfd9057e7eb67fb0 py3k-short-float-repr
+71309 066fa0ba82900fbc249872f2ae74a19ddb97ffd4 py3k-short-float-repr
+71310 7c0ff0de62956f1777ec731665628d43618427f1 py3k-short-float-repr
+71311 99687d51be0a14271fa62a9cf72dd75f2911fdb8 py3k-short-float-repr
+71312 e012986be4f4e52f9ac168dafef5d84549aeda41 py3k-short-float-repr
+71313 526db28f100d2125bb8355534e58b26abea7325f py3k-short-float-repr
+71314 30b50cbe5c5e5fc8f9e9f0ed0a2a1106cc1d0263 py3k-short-float-repr
+71315 f7f70139ef570dfb3c6497b6136a1f9eb95d9b04 py3k-short-float-repr
+71316 cee1a86c69c15e649c1d7559b9340259f642f9bc py3k
+71317 02635460261e9af1a937c9f60cf0d5bae8bb1eba py3k-short-float-repr
+71318 986452b526a1df6ce0a833f40315cb01e0d6c303 py3k-short-float-repr
+71319 06fa87f3ec36271fd04740f3189a009efda9c85a py3k-short-float-repr
+71320 5560a068c05795fa05005217bfb3895fe71a8fc3 py3k-short-float-repr
+71321 e4eeb0daf62546cfd3767377eb62ac71d0eef306 py3k-short-float-repr
+71322 45fd2270ae1b8c1d089499a2ad9211c567f2881c py3k-short-float-repr
+71323 c5e0c6f656e63685e1a9860c6bee1e6c0926392f py3k-short-float-repr
+71324 076c72211561119659640a0267e6619de3f6ec01 release30-maint
+71325 b9849efb27545c683d424dbd8646e042feb8cb87 py3k-short-float-repr
+71326 8d69763a2317b540618fcfb0aa0cb7cb5fdef468 py3k
+71327 d3470bc6d1918da978576f9f5d8ee187d479e952 release30-maint
+71328 4a67d691472585150734580b9b865e5d0a717e7c py3k-short-float-repr
+71329 d81985182a36d60860ad4ee6432d4c763b404830 legacy-trunk
+71330 920b079096003d4f74d6e731ed8e9d3e7ae91faf py3k-short-float-repr
+71331 5b01fe513f92864ff5bd6917e8f0806388027f4e release26-maint
+71332 5549e8ff28d2cec7a3b27be165523acd3e71cd04 py3k
+71333 f66406f260441f30f86ac6a3f2d24dc2f00dbadf py3k
+71334 a0edd91e9c6f31262bb3fa12424a0588634d1875 py3k-short-float-repr
+71335 f824dc60106f108f2c659b2d0eddca085edc9095 legacy-trunk
+71336 6093fdc5ee962de0cee9fbb266b2d865f9bab8a9 py3k
+71337 7a39f7e42bd97cff26bc91335359a5470ae4e720 py3k
+71339 f391df93c9abd49f7d020dd52d41735cb52245ed py3k-short-float-repr
+71341 3744efa456681ea847d83c3e75665c87dc999c53 py3k
+71342 9768da86cf8e32af61795f2b74823d50f197aa56 py3k-short-float-repr
+71343 28bae5ca5218d04b2ac4852f8b38664c331083c0 py3k-short-float-repr
+71345 69114a356cf0da72ebf43d455c1581d249b8b6fc release26-maint
+71346 8fbb9936d4da2b17829397800866b7df9eacfbf9 release26-maint
+71347 6fcd10ea998a926d537c064560eb0d44f6e79397 py3k
+71348 da73c43e691edf875d1a7223f91aad7e81cb4e29 py3k
+71349 716f5958b5f0da0a61fd27180032ffceeb698580 py3k
+71350 6f4a088d359d6ce6f97989f84360719601c0ec7c py3k
+71351 c37bb1b7a47a843e20d80fce6e8677a34adee308 py3k-short-float-repr
+71352 49b24922eb2ddf57f93321fa57144980a325da72 py3k-short-float-repr
+71353 674b2000224cc89e7cbc1ae4d10ed5892632b329 py3k-short-float-repr
+71354 31582485fbfcd153471f0d892d9ffad2c3550373 py3k
+71355 153917c001befafd26ad37ec25119a707e1198b0 py3k
+71356 f92533925ea662705aba0b07bd6532c0817f430a py3k
+71357 94832455e37d590ccad784019dbe81a6c2444b38 py3k
+71358 75def7ed9d5fc63f905abb2dd8039a7abc4b5787 release26-maint
+71359 c39c1c2978f94f5b4f842c96aa4538e1142359ee release30-maint
+71360 2b083146acf5c2668846d56f7a4abff32f039b17 release30-maint
+71361 b50f11b8cad7f41eaecde1349144a04d42489489 legacy-trunk
+71362 90d32381a340fbe425ce0d719bfc4d2922eb9be4 release26-maint
+71363 01f1ae83631ae82bd8598a11c17e3f9b3f56c38a release26-maint
+71364 275c0ba748589e8a67f1d6a1a2b275a36ba33e3f release26-maint
+71365 5e8c3e7451ffb79ce118fc297d86ec3dc010cf99 legacy-trunk
+71366 9ab524170f682f332ba0bba81565a82a1e801ad8 release26-maint
+71367 fce3ad4b23d60c35effd5babe9fc2d4a7fce7590 legacy-trunk
+71368 5ce23cfb98c7f5fbdf6207076ede6b1c13de67d1 py3k
+71369 c842011893873eaf0b877782d4485191f7425156 release30-maint
+71370 e23252a8ff5926fcfc1def87949dcde6ea4158e4 legacy-trunk
+71371 5a494623cf3a814b9e2e0bb766835b4aeb3d8425 release26-maint
+71372 6c46d6db2fd6a9fb1b5780d347327ce41fc17cba py3k
+71373 d16cada96370190738051fc5732bf93caa21bbef release26-maint
+71374 ba3a9ebce81e7c2caaf2abfe611b7c99f0d45c32 py3k
+71375 379970309475564f9a6d8931aee7f90e6b515705 release30-maint
+71376 bc79bef55aa806e83154d649a22df81d00b0e980 py3k
+71377 41e7202e9f93046dfd53fb3cbda757da6bd697dc legacy-trunk
+71378 248adfcbb71544c6a57350fe78a6cc1fea57d0c6 py3k
+71379 db18e78b92d86a031f0bb0cf190b88f986ac812e py3k
+71380 0a1cda1e7c1c7968731ccfbd2189f03d1ef288e2 legacy-trunk
+71381 d04490bee2ed48d2b9db6799c84258d02c01e1fa py3k-short-float-repr
+71382 091706e1405607a7633c87170f88019e94fe4f57 py3k-short-float-repr
+71383 ae5f5156b88266ade4aa83884d4904bd2fc0d516 py3k
+71384 f710555053bf2f8f62e03605cbe0820aa8119fc6 py3k
+71385 1099410157033074b7ebab9e5a840023a77779d7 legacy-trunk
+71386 251ef99dfb4c401a84e890c990cd201bfdc3a489 py3k
+71387 74d9f75d9dc1fcfd0f44fdddc75846074b6aa2da py3k
+71388 19f7d3abe7cde27ffa1462b98522977ab240884d py3k
+71389 df0ed9eb79c36545f1cf132b12c01dd256bce475 legacy-trunk
+71390 fd180bf47227fd6a6e345b4faacba45e12d7c24e py3k
+71391 a98c509084eb3562cc66cfbd63fe825aea485a7c py3k
+71392 7b8962f65918b3e49597c2376b4cbf316228f274 legacy-trunk
+71393 61e37effae3aeaf30e87846154d18c5b5fd1c996 py3k
+71394 fd16e579096e3a390fdffa01d607618537c300b2 py3k
+71395 0bc0524d17cebc221a909c5f3674007bfdfbd02f legacy-trunk
+71396 02224cb21d7cb95eb451c3325cdeb63c8fda64f6 legacy-trunk
+71397 b1404a868d8f48ed57ebc59782aa5a41bd5f9774 legacy-trunk
+71398 5a8ebaba1a09efdfe6432ddc8fc72517d9081abc legacy-trunk
+71399 aff2b15ccc6849ad1c636da013ffb8855183e29d py3k
+71400 67d9d6160c134cdd8fd8ed72c1cffbee849d9e10 py3k
+71401 d35c6486ad94a6859603776fe6fc358c42112cee py3k
+71402 63b57513b1bdd40120a3349af37ebb5f9a2bc710 py3k
+71403 d9088efd558bd0b358db17cf59ead975e477b749 py3k
+71404 18053cf6115a52a77004b5158d51108d892f3c69 py3k
+71405 c2336957c5354dc0b23860fe51c35b8240b31d10 legacy-trunk
+71406 3086427b070922dc4aff9aea0687dc5dcbd637f2 legacy-trunk
+71407 1cc94997cfa7edc5fa991458f81a48100b279af1 py3k-short-float-repr
+71408 9a7317ce6db994aae20abea8e6ca85a93eb72751 legacy-trunk
+71409 536761c2b6a4a20d54793ae150326c0f2a7a2a53 legacy-trunk
+71413 40eff3b182e4d2ff91bc30fbd4195c88602625e0 legacy-trunk
+71414 dfa91dfed0b05496c216d3820c0e2ae30b446f81 legacy-trunk
+71415 a788facee6ef4d7837d02d0bad77f5daae6693e2 py3k
+71416 5ad204312bcc306b4812da9f587e37681d22b084 py3k
+71417 2ba33c34dc1a79646a726d63b11386021252e163 release30-maint
+71418 07c3ac30da8704419bd56a0fa305e58dd7256ade release26-maint
+71419 ade5c27198dbef0c96292a7057f6fab94758a7a7 legacy-trunk
+71420 bc94b8323b39b29bd375365eb25b789b864da4cb py3k
+71421 f70b3b5f5380ce545849de5afb047e1224c4bd36 py3k
+71422 79e57c866b5f4e2fc1de80c45a7faa0cfc98f2d7 release26-maint
+71423 b4b2511e03c7530a9a34d50556650dfe723fe41e release30-maint
+71424 d3610e3392cf49a35b2417e7f78bf0f50fc2eab6 legacy-trunk
+71425 09503ce66ff123acf02e732934770f7bf5db4f94 legacy-trunk
+71428 8a4563d3b5e8895b98cb1d784dceb2f5eea4505e legacy-trunk
+71429 a21c848ad61ec4486948765fe8776e09ea6aefc6 legacy-trunk
+71430 40eb99e8935c64de4f7d59079f57c840510a66ad legacy-trunk
+71431 a6ff17a42ad31c7a97f57f004f3c25b829cc2208 py3k
+71432 1063481a36f8a2a2a2a45d14a9415122b8f50f25 release26-maint
+71433 a4bc80f5d6a0f6bcc519bf2be0df0811c5acea28 release30-maint
+71434 cbaa1bc350ba20598bed3c9adc391ba2e0c22d2a py3k
+71435 5f35c53a3ad7b8e10ef1d3a81e7c389a47b38cf2 legacy-trunk
+71436 f9689d150bb9fd82c33216b63b84665c2982d0f7 py3k
+71437 0b9e68971a1e2f920a095788b84dc582a62add8e py3k
+71438 9ea9574daa5bf694ca57714657abfc469d114582 release30-maint
+71439 4a7db412fdd2af8e2f019af50a6c3cb19ffe9019 release26-maint
+71440 aa9b0a6d7addd6a110579e54fadf99b75c06b773 release26-maint
+71441 089c72107d7b1c61252a83012c3094b0f0a811de legacy-trunk
+71442 916943cf52436f7743ce390048bcb0a24dc15e3c py3k
+71443 dbb9b7176eef0c6e06555aafeafba30fbdea174d legacy-trunk
+71444 9d92eebb7c30503dc006b7984eba23b08676e4d8 py3k
+71445 b614a51f44236a6f8adff09706fd5101f316e23a py3k
+71446 6bf426e551d572e0c2ce51fa9cf2ab99419ff084 py3k
+71447 0327504a4f6a1ae47410318c48619ba4c784507d release26-maint
+71448 4cddef144428244cf0f8e0e2ce4cf46fc68709b4 legacy-trunk
+71449 32366b3e0ca9907252679da76975194c3f8f2bb8 release26-maint
+71450 0c11c3418d89d486d3ed198c80e29067606433b4 release26-maint
+71451 9a8999977363994e3a9868d34ab132861edeaa53 py3k
+71452 b912515fe9ce22ea7ab90cf9d87b5f90d672e760 release30-maint
+71453 2797e5e6008f0fe4bac23ade7b6c4fe6ee8140d2 release30-maint
+71454 15d6075c085b1e03b283f077d8756d853233bb80 py3k
+71455 c95026c2f2ba0c3e1e0d656db07ca22d607592b4 release30-maint
+71456 f0f60892cba1c93802c71505f104b0e4255488c3 release26-maint
+71457 06b64178a30d0fcb0864cae4dddf5fa623497f72 py3k
+71458 0be63c75041adf7c46475419f58301bd1f62603f release30-maint
+71459 1a8bde18d35353993df7a2a5cb5cefd34d8dec75 release26-maint
+71460 78a9739dafa413fc23cb8e3df542b64ee39adc7f py3k-short-float-repr
+71461 f724974b8d89b335a94b46c87fce823db0323fd7 py3k-short-float-repr
+71462 7e229ca0b92a5e862b46707265bb1aa21ae577cc legacy-trunk
+71463 d93920a25da4c8c6c2e575cc981f9f35036b1ab5 py3k-short-float-repr
+71464 8f13a414d8432958e5d716b312924b7abb75b889 py3k-short-float-repr
+71465 fb41fe67e061a29c44809eee7e687cce6df89dfe legacy-trunk
+71466 1c52b1454f1e202faa1cfdca81ec2fe7e3ff53c6 release26-maint
+71467 4411224cb80688b41bef7f0525c8b63f3f65d65b legacy-trunk
+71468 2a03cd04d8f40861b20c6cc72fab7289cd429160 py3k-short-float-repr
+71469 f652fe1649ed8f385bb46677520c6cb832956ef2 py3k
+71470 f39d33752582155c6ca71ae23b1e14429dccf3fd release26-maint
+71471 8b2cdfd5aab6fc33e0a0a4682215ed31d3652347 py3k
+71472 ef3592e9e01e5d59fee60e2c3d9859963ae2ce99 release30-maint
+71473 ec239cfa3e61785804ee46458593bf1fe0f84541 legacy-trunk
+71474 bf2eed865a8a4c35920b6676028459e092823c11 release26-maint
+71475 4a35c8a5be46fe9cca562f20174fdfb9610cd5bb py3k
+71476 0003b5b4f0c0349c455505feb90fd98225b136af release30-maint
+71477 63289b82c84903010a8309517fd787ead67a04ee release30-maint
+71478 903569b132c2478805af0411635bccbb25dee9d8 legacy-trunk
+71479 2e38c617fd3eccebc1eb34725c7fbac9288a7de7 release26-maint
+71480 3455fd78467e65837b73a8d8a50061bdb01718dc py3k
+71481 37327d1912a8146863180b484499790473f06337 release30-maint
+71482 5282c66d89725bd4765b35fbaff2d1b0934abd22 py3k-short-float-repr
+71483 2f9c7b90a79580a8e4b14e7c1a9fd6094aaaec56 py3k
+71484 f376a3ca17d37f9a32a5a68cb2ffef47fd08fb95 py3k-short-float-repr
+71485 2d37209885e27eb9d497ed3e9c34eccdee3a797f legacy-trunk
+71486 8861298586c10f1c5be594609bbe7a9109977f98 legacy-trunk
+71487 d0b744303b84e3254bb059e489b072337459fe34 py3k-short-float-repr
+71488 c949ddc494eb866aed6826c7485ddef81d308be9 py3k-short-float-repr
+71489 297050ab7aca4769695a2f3ef2cd46e7b35e6574 py3k-short-float-repr
+71490 f34281db47e61abba9da339c6db152e706d7d338 legacy-trunk
+71491 362998286635d04fa7f3ff5a91097ae5b6bd43bb py3k
+71492 4af31140de29daafa4e911a9d480ce3bfadfcb09 legacy-trunk
+71493 1989349379b5ac5d7c359f6907d85d0bc16a8fab py3k
+71494 d5ddd3421c9ae68c4b231493cf17f34222e2d031 legacy-trunk
+71495 7e978ca42930a906b0ccbf3c237d78d6e63814ee py3k
+71496 3b1b6142690aa3b33d5b0e22f54569b3c7f14e41 py3k
+71497 037f5f7e7ab1e6da06f33be2f8209afc3265e27f py3k
+71498 fe5d07beb5d37f877d74bb1e47d207339933c5fb legacy-trunk
+71499 bb8164db1bda67f6c4c4bc37c21e3f88a89ea2e6 release26-maint
+71500 48485604ed487b1dd43ad03082576ce5a352a97e py3k
+71501 cadf955bc18bd15e28597caf79c60642dcc7c692 py3k
+71502 f221fce3d6ba38cfd8c88f04268e8a46bae1d7cb py3k
+71503 021d8c82f28447fe478d4210851f303b986fe1b2 legacy-trunk
+71504 93d4f982615f264e0df96314e554b1511f60f31a py3k-short-float-repr
+71505 d23e84e418ce8d73a11a183edbf9d10ccfcfb321 py3k
+71506 4e08b18e38fbe14fd34b1df8e5801cf4db579277 py3k
+71507 ad3f3d304963cdfb228d1dfc721a5a0fd4066bc6 legacy-trunk
+71508 21ef4758cacd430fae8a20e545e962f1cfbfec6d py3k-short-float-repr
+71509 a824431252e0f261d52391a48021b0075a33510b legacy-trunk
+71510 293dc5f08e990e3d365b9e25168ea3f7d88a0495 release26-maint
+71511 e0723ccee74df11db7967c8ea5bd2e651a8921a8 py3k
+71512 a48fceb0f0b3ffd0bfb9eda8d5f377f57c2101a8 release30-maint
+71513 754a3f73ff07fa56def30e95eebdd97b9cfbd2a9 legacy-trunk
+71514 3b25911c6a4ea6a8e06ae6af36e907dca0022cef release26-maint
+71515 168482eafb561db879745ee9b4e99755c2ebcf60 py3k
+71516 e2b9b2bc70b0ecff0b269db290eb3a4cd8059939 release30-maint
+71517 713ef68e7ffd00a526ee70fb040de626e6818aee py3k-short-float-repr
+71518 4ca1471bd1cd3686099532d511c7f25b16e5d463 py3k
+71519 f4d553ec9ddc97e72339827bd18726f7c4d8e880 py3k-short-float-repr
+71520 d7c57e16b73c5f3dfff63ea88749c1d8da172ba2 py3k
+71521 4407e4d0708421de83a6f0b46a50c87c271b56ce py3k
+71522 1cb3bcce83167cdd2ea0bd11b685170c2e71eb0c release30-maint
+71523 26069d3b68919add9511943dc63a7c4cbce7b26e legacy-trunk
+71524 46167ad3ab93fa8470505adf11c32b32b6ba1282 release26-maint
+71525 c916f854faeb2b85e3bff8db911fc3e3fba98c7d py3k
+71526 8867a5b60a913346a9ab90aa144e29585592c0c1 py3k-short-float-repr
+71527 6506cc33ebadc194ba87f9cde4ffc4ee3a11ea14 py3k-short-float-repr
+71528 536f180f66a7761c55fe8572954b909718d4a10a legacy-trunk
+71529 140928c6cf51f013f80a86b696ff70abb8420c6d release26-maint
+71530 8c82b7c51bdde30a5af4c4d005e1db92fca0091b py3k
+71531 42729eddbb6c0b032e9fbdeb162aac6f73b658ae release30-maint
+71532 d0a73cf46180d412a754576c0bb1fcd1c0389db1 release30-maint
+71533 098885c6b101d08578afeeaf24308abc2c837b5e legacy-trunk
+71534 bbb63c71a983191434160556ee72ff81f3953d80 release26-maint
+71535 93a2d80cd34d038014d2a7bfe30fad38488ac30d py3k
+71536 66da514e3fa3952900a9fb896d64ad6faa644185 release30-maint
+71537 a2492b4e505df3fc337ad25ff68c928783276c5c legacy-trunk
+71538 83228bbe590678814e4e44ff241354f96028787f release26-maint
+71539 7e319eefab8c8ef84e54d24e90786bca1e0a11f9 legacy-trunk
+71540 480f7ec3b869608ffdb8822cdccee5a2b5ca395d legacy-trunk
+71541 2eec57abc5238f397b2e7f73fae38e38d39d17a8 py3k
+71542 e9e2ae3bfbc1404330c1c45329866bff159347f8 py3k-short-float-repr
+71543 8bc4bc87c8859e58917d3798b0469558678adf0c py3k-short-float-repr
+71544 ae74142089d2bbff2693e4b0be5dd0b215365785 legacy-trunk
+71545 da0f7fc787d826d8cdf7fc23f762d47aed567e4b py3k-short-float-repr
+71546 bc5c5d7a2a1479a0576d379889926cfaf4cac101 legacy-trunk
+71547 7d4499711a7d5adb2c3967e053fb2c2923fcbbb0 py3k-short-float-repr
+71548 622abf6ac97fab390d32a318991a2b19eb45383d legacy-trunk
+71549 12a8d1947167914ad039b4e1f408e10a25dc615b release26-maint
+71550 5472789651e16110228ee61dccd9cd0e940d1a5a py3k
+71551 c740fefae1bab0e91d1f0bbe5723244c67ccdd7a py3k-short-float-repr
+71552 4607f54e76936b87dac788b4c7bef8b190932b6d release30-maint
+71553 ab75da266e57c55e777024fbb84a6a3008dc4835 legacy-trunk
+71554 3770652eb0e5098bf1c4260411910c4c93eb5321 legacy-trunk
+71555 9e3c976da5f40527d39e714d21cecb7ece2c2da1 legacy-trunk
+71556 5ef18f0f431091d05c2b4b261e09a18059d85fe0 py3k
+71557 6f8fc6b167ea8b0108148594338b67649b094af2 release30-maint
+71558 e49cd4f47f7620b027e96bc2802a668b06757fb2 release26-maint
+71559 95132cc22ee5ab7b8daec6162eb32d82632d3087 py3k
+71560 fbc37fbd9415ff5d44e72c5f11f58c14d8ed5413 legacy-trunk
+71562 0e469da67d63a5f48b5fe1f4c0c96a654c1fe6ae release26-maint
+71563 990f2579eafec9505eb033ab31b9f8b34312ce38 legacy-trunk
+71564 1dc53e0a147a70436bd9636f61ace8e864c628fd legacy-trunk
+71565 53098f270bbda03f72eba08e6567ee3f51779f6f py3k
+71566 93d2befca0a54fee76a99077351690ae7d1857ce release26-maint
+71567 aac70a3ba250f3a46a2c912d908cff9cc4e3ec64 release30-maint
+71568 74a4a27ea291cb1fe69ceaea0063b6b7304aeff7 py3k
+71569 8a173057d9031c52f8e16d8255f78b6252cf7a8b legacy-trunk
+71570 3ba65ee41fe7ea8dfdd393853cd93924981c2720 release26-maint
+71571 8eee94c74e9c987c92e278c0f2b0eedaf6e0a4e9 py3k
+71572 56ac3d50952c877d01a05f37441cafcf95209b80 legacy-trunk
+71573 774f7bcad22c69f67d31e5305195331119b1a29e py3k-short-float-repr
+71575 9fd66a21abd1967d3f08414d199a685c9aa0404d py3k-short-float-repr
+71576 28ea54a6bb646259ea63dface35f9121ecdef858 py3k-short-float-repr
+71577 c66d4e306fb6852124297152a2cda7e33fbb04f2 py3k-short-float-repr
+71578 a4cc46cab6a74312baca7208d7f48dcb65498526 py3k-short-float-repr
+71579 c8fb398eca23733647ddfce40e6af4884ac2bc8b legacy-trunk
+71580 57b8dc4a8888ff91336a3376ae9adcc93a195c8d py3k
+71581 ccf0e6409536d8c2c86b6d05108331c50692a97c py3k
+71582 58b74967a5425cb71d11e466218d1b410d9bc868 release30-maint
+71583 c97e45e90599e65a85e08fb348499d8448362380 release30-maint
+71584 177e1073052c859bee17ed25d445630707119839 py3k-short-float-repr
+71585 4703965da2cea9ff843c20f1751e33dc7fbc4ade legacy-trunk
+71586 e09a671a590b7ba5e276464079f2bfba3f419c46 release26-maint
+71587 e03ba5f6f4940603e0759af36fe12d198a4f3352 py3k
+71588 85bc2537e83e3d96245f96dbe6bd71a7d77d3e43 release30-maint
+71589 7baa68d66c8fc799843350fd0084b533eed36400 legacy-trunk
+71590 71f48adad8923e7d9e791d6b36df1c35d6b37e3e py3k
+71591 60513808577f32394f297e8cc2ea3c7cc6d3590a py3k-short-float-repr
+71595 096767b1845018658f4a3fdd3ef3462657752391 py3k-short-float-repr
+71596 e7dbfd023ff521eef93cd33e6134db69f0636146 release30-maint
+71597 794525ed64fd423bc5ca131e70ba14ca910aba85 py3k-short-float-repr
+71598 dad3d2b9a8753f45f196b700644cf9efc26bcd8e py3k
+71599 c17c5ba9bb6cc7bf76a253340cdaedfda4db033a py3k
+71600 4feba09a826ba99e5b482707b3d9643eba34156f release26-maint
+71601 698fa024e7d239f3adb7a03f77e35787e6f04993 release26-maint
+71602 6d95d9793fcf50002073945e4aeb0d3ef150fa5e py3k-short-float-repr
+71603 2fd08830a93f1328190505dd8c19673532d50b7a py3k-short-float-repr
+71604 54283b4a1657fcfb6fd47ad43ed73d05fd3d7db9 py3k-short-float-repr
+71605 ad3accde0ee7a7bc5e089277dde9718d811e6854 py3k-short-float-repr
+71606 0b7e414183433266be7e69bd364729f4532af8af py3k
+71607 fd7f36ead0c8170bfea63d9f5701efbc1ff2ed10 legacy-trunk
+71608 9df5ddc198a800bea24a206a96f741ea04d2006e py3k
+71611 16704b15df3ebe7d53d5da062ed1b43ee0021a01 py3k-short-float-repr
+71612 c243b10ab7305525e50f8531a2c9a8d1fb1afa92 py3k-short-float-repr
+71613 29729b908a820dcac30f8c0f06442995fc5530cf py3k-short-float-repr
+71614 b8f41db8f6ada08a57e1f37722df882acd013e98 py3k-short-float-repr
+71615 abefca2fd92e21d3c3765a6d7a2aa8b9699b15ec py3k-short-float-repr
+71616 a74e10191854d21a06158f3466414f361c2df20b py3k-short-float-repr
+71618 408761ca3d9663b6ead58d77b94f97cd00deb999 py3k-short-float-repr
+71619 619dcac8d3890965b44772dcf77a7c523cb4d18e py3k-short-float-repr
+71620 2ca209f3aaa294151bb37ce7ffc850780f5c9994 py3k-short-float-repr
+71621 12bdb3972e2a7aa5cfc2cad3627c268bb7472652 py3k-short-float-repr
+71622 d881b06dca388afbeed91817f9a1555388af8cb4 py3k-short-float-repr
+71623 67340fd6ac8a3ba88841ef39eed0935140753662 py3k-short-float-repr
+71624 2d6116eef2b367b3f92b87889189d78b6ea8b75f py3k-short-float-repr
+71625 ce67e783a6ed23d86362f58d4679463335e44d93 release26-maint
+71626 07d239eeaa62ef91b594ba54ca9af4f790c85ce3 py3k
+71627 5b108ebbfc083e7fd31f7316359427819d8d8bd9 legacy-trunk
+71628 4419e06219cab892cd56910343c0f2e69240c354 py3k
+71629 df2638b9bee2edc0f636f4e31e0536900192434a release30-maint
+71630 6bcdc131f53cbe310876108f9986c5654d918e0a release26-maint
+71631 4628217b013c404fff0f6fb24debbc01d96eec42 legacy-trunk
+71632 7a69ffc4f4ae366c5e2530669adef62f357a822d release26-maint
+71633 20cf7f8a54052fa02a2c7ea9bcdbe1041a22713d py3k
+71634 f325edfe0c3acbc0bb9fd340aa500c0bd1b07ffb release30-maint
+71635 c54b784a56d55addb94ec2dff502d57194a211e4 release26-maint
+71636 5ff90332f910e3b7d6b28069610820e7b1714c7e py3k-short-float-repr
+71637 eebe5f7daf1e78b049f36acac70e52304326ceb1 release26-maint
+71638 43ef74bfc569619a92e81c00e91a3dbab457f12d py3k
+71639 ac93c3d8e19205b87d8c77a686e2246790daafdc release26-maint
+71640 48b5fad9ce1b284ba75f2e1d65b80dc73064fe23 legacy-trunk
+71641 77f909ac3e1022968d6051adfa74a3d8ad3902f4 legacy-trunk
+71642 d3f020400ff27efa33aec682a9976f7dd057ab25 py3k-short-float-repr
+71643 c524bfee703ae52c8a743205e2b674fde627dc25 py3k-short-float-repr
+71644 3a11a2ad8f7b808e60c868a3c6d6bb2e2be5f44c py3k-short-float-repr
+71645 a6790a3b80c3a240b3ca9cae32dbba506edd1e4d py3k-short-float-repr
+71646 ce4f7f489bd361ac89664e9f59971a8b67c4ade2 py3k-short-float-repr
+71647 4500adc31be3b8aec05d3a1050c1c19176e14eb6 py3k-short-float-repr
+71648 edebc893b02ce0fb27143b101db4c1e4ffd7e783 py3k-short-float-repr
+71649 db7304bfbf7dc3cf7062d65d2265f299199b1ed7 py3k-short-float-repr
+71650 a28af55c6e58f02a8dd1dfdfc73162eafb53caca py3k-short-float-repr
+71651 5d4729c4703358d4fda7681b4422ff2198b482bf legacy-trunk
+71652 73bb494518dd6d3905c83568ba1b9bf3fa877194 py3k
+71653 1f5f992801f9f69c2af906a9c2b92ba3f66c1754 legacy-trunk
+71654 8f653567291f0bbba3fb37e24a4dfe0acc9cbe97 release30-maint
+71655 f0a16e1deea13d88bbae18aff4837cc1ce7cf1f9 release26-maint
+71656 975be1eb3ebf37db5c1c0aa43d1910a282664f86 py3k
+71657 73bfcb3988862ab83bf507d15f752f8929fa7d0e legacy-trunk
+71658 cf190ff2a72c4c4762ff783606b174b85e9b07d1 release26-maint
+71659 a63b46ade2b7b61c7d06151c737d4e87ca1f491a release30-maint
+71660 92f7a460ff828ddabee780339d416ad93c7a4467 release26-maint
+71661 f02228d1f9080c2bef9fcd5a7bde74e142d443ae release26-maint
+71662 89deb6bc82e4bf8504a9bc13f9e6d76517bff7c2 legacy-trunk
+71663 97ae7a709c1d411a51276fc78a7f19f2ae992e4f py3k
+71664 866a8beec065509e166b4b0cd614c4d0233069a6 release30-maint
+71665 b653eab13b73286e975dad92a9be768b1a43ea75 py3k
+71666 07c6b088968b2059dc2dc8d6e83cc8b63edcf71f release30-maint
+71667 07c1114695e99f2f5b1b1ee59246763f1927424c py3k
+71668 d84ad973cde25f665c3f26b6a66f7c552d22edf7 py3k
+71669 cc5565415ada417dca3772472a4c962049f0dd3e py3k
+71670 973f4d7aa87cffdaa68a28ccf6c1106f7523df73 py3k
+71671 0cf7799fa1902a7c020165b96122619e5ab80a5a py3k
+71672 00e057136fc677d543fec06991634f228c9aab1f py3k
+71673 0ef5ceddb1c3dba41bd32b564d80cef2eb62cfff py3k
+71674 c60c1d39a951651c0ba0c2a50e42ea678f5e5f28 legacy-trunk
+71675 98a50a49dc8650bc957df22028790cc3227cd7b9 release26-maint
+71676 212495b0410c33efe4e10362a70a369d9129f6ec release26-maint
+71677 9eab0573d8454817b6e32262af3e6ac127ed5819 py3k
+71678 8e51fae9bb75429d4d432562b597d2e392a0cb0d release30-maint
+71679 82a2ef5963e0f095cfcc3b69803831d186a68a42 release30-maint
+71680 db292eba7ec1aab16f54c45f100f7452acf6af2a py3k-short-float-repr
+71681 c742920c45f771c4b76a2c7e349a926049f483ee py3k-short-float-repr
+71682 6874d70546043257bbcf132658163a927d7edae4 py3k-short-float-repr
+71683 908c63980eece06cb3b64319e4961814ef1dce0b release30-maint
+71684 ab06a38b590cc4978d7d123971c41546281dd19a py3k
+71685 a709bb5dfaf51165500eeef6b15bcc7122508012 release30-maint
+71687 9862d5272d857aa7844012b288e1dfd29a0f023f py3k
+71688 66fdcfa9400b01ecdd4373fd967e3ed30358c4cf py3k
+71689 fe99a562b7085b28436b859ac919b54e20a42d41 py3k
+71690 26951e5958931b8d2932e08e6d75e9982b2aa91e py3k
+71691 8d8f2f98a752a765ddb05a57e4438e47cd4af949 py3k
+71692 13916bb2eff07cc437e7dc70540510f8d9befcd0 py3k
+71693 3e318c4af961c3a09693d7d977fc31647cb93491 py3k
+71694 249d500a779a87c88a3cf792d7dc65305b989755 release30-maint
+71696 02cb420d862e69ae20d860d32fd69a32356ba980 legacy-trunk
+71697 858b9d08e34b4edee4a8e369f2806630fc89a05c py3k
+71698 c84c75525bb35aef2f0def2e8b79d0c0276e090e py3k
+71699 d895a42dfc9892da6b048f0cf248d26b8b3d216e release30-maint
+71700 d6da646354d21e71dd65a49e0fbce7608ad0deab release30-maint
+71701 d43d64252d3611d967ba79c7083bf06442947eaf py3k
+71702 2ed0d7e1d17735788b446ca195e718c583f8674a release30-maint
+71703 fe15526ebe8bf687985deb320f3b29f9acd50a82 py3k
+71704 c5c8680ee0b1c1fa4cfe74a5ea4d01ece1f81486 py3k
+71705 ad5c7eaccea11252ef842e79075fd485d1140f25 legacy-trunk
+71706 8209b6c32e612bc457dd62ff55b18b262e60bbab py3k
+71707 8a8dc7f8543e87cf661f8705828bfdcbf6026338 release26-maint
+71708 3412156fb8ef6a71fc43a82af1c0e1d656ef40cb release30-maint
+71709 79a6c63ac5b0d20ece9ab9ec08d9bcbf77c2f4a2 release30-maint
+71710 96d82facd890e9f6d8e822973a9e337dcfac874f legacy-trunk
+71711 6a7fa04d8111e4813b3475b91714e8b0f5c58771 py3k
+71712 56887a2a90aef6393015fa332cd81d49add37b08 release26-maint
+71713 fb08f60ab51117c8d46b9cb7a92bec244a4e28a6 py3k
+71714 4fa47686c0d70fdec30127409448589816e52bdb py3k
+71715 93223603c992206b8fd98257a2755f0affd35fa9 legacy-trunk
+71716 4d998207cfc3e9cc3281e0a1ef992eb49962ba04 release26-maint
+71717 72a7000a860942c5096cfa8e5ddd1f3d07c0ce05 py3k
+71718 a4f117e920fda60e0fec6f8b3723df68b0fe0a0f py3k
+71719 c4e9a875c9a54fb72ccb9a630fe37c145ca677e7 legacy-trunk
+71720 dda14afa12b85b0d7a0c56d09c944ee283b2f60e py3k
+71721 9755d8dd3366accd24621f49473d7a361a0bbfa7 legacy-trunk
+71722 7790b85e7009be7ad21a15cf9f8e47e485fc7c8c legacy-trunk
+71723 28645a9610042406a65e959c9f500914ee8f6e77 py3k
+71724 c277cf4193d11c769994fd2fd685acee08dd60e5 py3k
+71725 3e8dc59d64de44403645c2edc44d66e796296ff6 legacy-trunk
+71726 329cb02f18e6f22e4e7ed503fcf84c7bb460742b release26-maint
+71727 6ec3df375f5a8266763f47962a83001333d1b73e py3k
+71728 cf21e9d29062f16a7582f011a974f2fe5bb3ba32 release30-maint
+71729 72ff44c05295b955c463cea2e2a4e2a583dcb38c legacy-trunk
+71730 a6d324136e0145b2958f9aace2155867ba2d177f release30-maint
+71731 a82b53dbc65655daae15d52c4deb7c5c90678290 py3k
+71732 1bcd55db35ded6189feb8c5a587b9a99079f1b5f release30-maint
+71733 cf6222ca0bcc06d63c5569fcf2231ae043bd7794 py3k
+71734 58915fc576aace3eca3f031aec859841626f8f0a legacy-trunk
+71735 adc77a5d6a9626e694290e7f8a0fe405a85e7213 release26-maint
+71736 d74b9a8e66f6036c16b44d3cf3736d9a43c02fb5 py3k
+71737 d99503b6f238aec2628396efae5c496a334f43cf py3k
+71738 7557716b6b1cb94be9749b0aac7a4e0e203e1b9e legacy-trunk
+71739 48bf42c2ff7a8038ab9034d4f1de3bd35b8b0b17 legacy-trunk
+71740 7d2c822269c74cf4484e01b661193f15aa8a7cfe legacy-trunk
+71741 41a75dd9df78f457dea8ffd42021fac77e110600 py3k
+71742 b7b8fbd010ca9b02506e652183f678b3be3836e4 py3k
+71743 d50d4f09cdf7d752d74f0b86ffa1b32abd575f32 legacy-trunk
+71744 b7c412d1a5cc46b8e6937e17e3a2f05c19490a9e release26-maint
+71745 60729ee84822584627edcf3ef8b1a647c0022ef1 py3k
+71746 e2c785ff0a50ff055af2eded081e29779c7168d8 release30-maint
+71747 44ef8a73a8b7bccc2928227ce23cc652d62a37ff py3k
+71748 1737aa15131086783f7834eb9fb0eb2d10ea77c0 release30-maint
+71749 3f2920aa910cb39430e83fee461e2ad531340d65 release30-maint
+71750 13807703afd0f58349e38238c8242f084b7cd3ad legacy-trunk
+71751 03976a10870083dc95c979e7c615aabda4462b2f release26-maint
+71752 0b3b8ed3622464095e5cc47e225511c76d345dd7 py3k
+71753 2b17c9968981b21cfdf6104e4552d140d5f7e488 release30-maint
+71754 4527c152daa939c2ee5e4a6b1e505d500fcf975b py3k
+71755 227967fe44a426c944421558c91b07df3585d3e4 release30-maint
+71756 42bf56e3482596ba5072b1e5b656c088977ba6f6 release26-maint
+71757 8533cfc2420adc1366a940420c17fdda77473631 py3k
+71758 04ffe6b6170910672f05fda2c13efda5d624c0e0 legacy-trunk
+71759 cdb601441d045521d8ed0a2296b72713f795addb legacy-trunk
+71760 a2d42310142be8138ea622ddaff34e80d25f95be release26-maint
+71761 e42020a5220ae99b4affe0eeb56f63559c110a7a py3k
+71762 05375c2e07424006a55f19c53faa0de0f5a7b186 py3k
+71763 8091e0566fe320f2c5f8134165c20c58cdc83bab release30-maint
+71764 37093e94afc778c90b4ba7503b8b0ca7effca6f6 release30-maint
+71765 96eed7387cea3890eb59b6c511cd176d6587e34e release26-maint
+71766 87fb72132d6bdfa11571967abb4b7289d36003e1 legacy-trunk
+71767 13781b0f745a61890e4d09e6b24ea2f97b87d57d release26-maint
+71768 aa544a54753ba8f6820e7721348a666d7d391583 py3k
+71769 bd188ff342a4c6891e2c0e7297e2e3f4721ed382 release30-maint
+71770 73aa3756c0b26b011392658244b74f5c1341fe8e release26-maint
+71771 455f40d1738e8c06926a9b7ae49762ca5005f93c legacy-trunk
+71772 8f28ce7b8e69a1415195b4c05bef39f4cf8d5f09 legacy-trunk
+71773 41293fa6f0dd43a68f8986569daa45fcd93e15af py3k
+71774 d0b13363aa21456ae00a7780de35bd4fddaa1fa5 release26-maint
+71775 27ac8c8741cd592b90defeb8a09710ce6fd4a857 release30-maint
+71776 cee1fc0763443b4e87bf1a73a348a82c76bf83f6 legacy-trunk
+71777 9ceae28ab2704011a1e90b83865467c9bb617571 release26-maint
+71778 ded46735255379ad8a44fa4c8cbff9e3ef0d0194 py3k
+71779 93c929a2fac7d7229efc2ae747ad0b7517192e8b py3k
+71780 c8a75710ab2501730dca303e7a24f4f8830dff71 legacy-trunk
+71781 72c98b4bf0b568192c37b50f5f49d82b773c9766 py3k
+71782 696dd2281841561eff4ec072d7a17fccd3cf6cd7 py3k
+71783 ed3f51f2abfbb729cac6112b4ac053b1006dacac py3k
+71784 a68e2dc5f5144d22d889dab73b40963854f96a9d release30-maint
+71785 de63b7e8500dc2f90854cd35933468015c81b9f1 legacy-trunk
+71786 f44d42a11b9b43a3cd8904c2972d991b02a8aff7 legacy-trunk
+71787 77336d82ab950b68b9e5c2a8f859c1100746af22 legacy-trunk
+71788 c30681c66b3fef2654b524dc27663f425398c80a legacy-trunk
+71789 c2e4a7ad05f2b4759685d7bffff06f42e42e7a56 release26-maint
+71790 414ba8efc8046ae4aeee516067ba87988f524422 py3k
+71791 2b057d2b98eb074f2c11f2c1e37e86d950d50c5a release30-maint
+71792 b0fea3ae3b6ef5620d9683247980fc4e9b36cd4d py3k
+71794 f9f23f36c36ca8f41d0ec5e77a9d9d45fb1ca6e5 legacy-trunk
+71795 78bfd448176331c8b23f3f7f99fa01d29512c263 release26-maint
+71796 c5e0d9beebf9230853067015ac91715721c819a9 legacy-trunk
+71797 618d2e3aca62ebda1fe826c39245c9f6fc1488e6 release26-maint
+71798 611518d680dec24abd2bdfed6af40472bb427af9 py3k
+71799 e9595cb5c7860baeba03b5520dbb68197081165e legacy-trunk
+71800 330db954e5934e09b2bb649276d6577fa5e56d20 release26-maint
+71801 b5df094d8941d2da4896ec9e8086f4a99b6034a9 py3k
+71802 44a8a525eceb8067f84211ec08f4e73486598eab legacy-trunk
+71803 6f42de72c2dce88ca10d63a58406966bdd1ecc2c release30-maint
+71804 513dc6fa61c0b70a6b5df1fc650ac5e8723fae22 py3k
+71805 c6e8c657158876f7f21398b2cb453a57d251de04 release30-maint
+71806 9bf4b3eb0447269913538e67d4ce13103fd43d68 py3k
+71807 24d81fcb0e3335f2e2a4e2ea42d58940e1d51761 release30-maint
+71808 85597e55668cd0c938b2e6bf491a313143e8c895 legacy-trunk
+71809 1f1eca681675a39e5a13220bef3fc035c23c7094 release26-maint
+71810 1a1291384928932df53b722de06a0b0543236bd2 py3k
+71812 2d09bcf7039555845e442a5c58815c3bbb7f2da3 legacy-trunk
+71814 170055d7b4942b23b69bb2f836a7e96f293f5ed6 legacy-trunk
+71815 ff9edcb36878ee861e93cad7bace9ff6ae2ca53e legacy-trunk
+71816 6292bd2632e2bdd7d58def07af9b7c24e15619a0 legacy-trunk
+71817 41bc33ee17304fa6b1ebb63a42b15c8c651f7dee legacy-trunk
+71818 33011513741475cdd7206dd3b5bf899dec196472 py3k
+71819 d295254d84b7f65fe7f61a7a7d5bba5e107a9d5f release30-maint
+71820 5bbd2e6d612620e4feee3120e1d07e5905c63739 py3k
+71821 a7c4a37c9df077168d73eacae68dcb1a850b5041 release30-maint
+71822 8295b7b294bd62dbbedd3fc1d2da3339dcfce389 py3k
+71823 8300b274fdd3ccf8d2181157c2a88079ac149ed9 py3k
+71824 33312b910773401dd5354bd9cde768b5278208b5 legacy-trunk
+71825 fde015a2c8b3ebe2496b456a1dbf198cf5e05908 release26-maint
+71826 32b247300ff9d3239191c18c3e5490d9d1ba46f7 py3k
+71827 0761ee28b6ed62402af0ebf56b5f566b31b5a50f legacy-trunk
+71828 d557320de856cbb21394d7eca513bace5f326dd5 release26-maint
+71829 06db1d9d255ff7c7d45d463a5b636f07bb8a6a22 py3k
+71830 1fc9b650872322925364403d92c648f092aee0a6 py3k
+71831 ec842cc610e6f14f3e12a25d2f0d493cec4f7e28 release30-maint
+71832 114059c26794f1ad7c42e1c15966e98597a466f8 legacy-trunk
+71833 a1a6f5d2b3dcb5e5239a8e44ea4ca1b7342d0632 release26-maint
+71834 59a1fb9395774ceb3b78a3f0aa5e5969e837973b py3k
+71835 46a32d4463c83a6fbd027eb5432eb2cebf744858 release30-maint
+71837 133c66027f33e4c2f63113895dcb89f1d9f380dd legacy-trunk
+71838 32226776f86613468289228cd02012f11c5011eb legacy-trunk
+71839 54b4489f1c284d6127570cd7c6c2777293d9cbd4 py3k
+71840 fa4f18ede260ba79239ffdfcf35db0438d7da86a release26-maint
+71841 a65e3c07260e9eb0781d55addd1487028c9cb119 release30-maint
+71842 116787f9b9fcdbf81217398c11a54a582506e2a7 legacy-trunk
+71843 63cb5c91ce2148c5d05fcda2a72768ae3db86a90 py3k
+71844 ff7b4e582c49083f71b42b9d7146dba2252cb011 py3k
+71845 d8802b0554743029e1548661accc392d0a372dd9 release30-maint
+71846 43e46e4e02f0360b33d73f0a8601904e38a55aeb py3k
+71847 fbb1df2541c36a09ce9be577cab609342ad336f0 legacy-trunk
+71848 9691e7345964da19df52fa8892762f0fc3aca3d6 py3k
+71849 09689212b3eb28194aa811869c786000bf2045fc release30-maint
+71850 2ef54e8a44dd4899ed91da5ee6dbe3d0943e0975 py3k
+71851 00a927815dcd62d46948bc48c3fda23f5a0a4198 release26-maint
+71853 d51e4f62bc8c04558d208af9cd43045193e28dba legacy-trunk
+71854 02f3f85e3936b8c0008eade3336c710bc4e616ef py3k
+71855 c62cc2a5764b63422eb5d26b345ef910196e1d34 py3k
+71856 b5e2bcbbfa7402c269484de7867d909c1dd9ac73 release30-maint
+71857 0f55e09c16b568060ac1b2ba0365cfe55ffcefd3 py3k
+71858 298f28aff18d23940b99cfb80826a231d24017dc py3k
+71859 b2fcb3f224de2fe3af07b2c47a596ad03bcefb34 release30-maint
+71860 318951890abb57c395304629bd51b2151626bbfe legacy-trunk
+71861 642910a01d7f3900f00d4c3d4c22fb3ffffe7149 release26-maint
+71862 2e37190f8ea7d49cacb896a87d277eb7a7c3be8b py3k
+71863 fdb2be471a3fdbd0368d0c0064e24dc3895aa50a release30-maint
+71869 5fd0da2a9778e168ff5c74cb49f5e57ceea94c67 legacy-trunk
+71870 a34d945c07edb3ecbe8f7f0050c8a4e3de4037bd py3k
+71871 80da52466fe87de5b6333595150c45059f338c2c release26-maint
+71872 a5ec57e85f65c18cc30365be230f64356232a4a1 release30-maint
+71873 9f9412192402d9f591773d6847a5f599083ddc0d legacy-trunk
+71874 9556e93f2abb499b6f3839efefaf1ee87386caa6 legacy-trunk
+71875 5a46a82206e7bbf39845af529ee35c0de19680c7 legacy-trunk
+71876 b366a496d499eb191770bbed6ccd0193785b0b7a release26-maint
+71878 88a7887d7fd4af96c388b323173adc938b97a800 legacy-trunk
+71879 ce47dee1b54423caca2b84505900002fa7399aec py3k
+71880 c57108def3e3be997b464d55074e2c2b64c8c112 release26-maint
+71881 d35337f65015999ccc33190b39bb55f6455e182e py3k
+71882 ad0c26972b2221759d27c1523d309ddbb069e6fe legacy-trunk
+71884 ad03bb5d0f7dbbc5cfc55483a107b247b526f6ba legacy-trunk
+71885 6dc9805cb0fa9779ada9bf6ffe55afe0d0dfc083 release30-maint
+71886 3cc5fc3332f6abccb99311b5197335fe8e73fd2f py3k
+71887 806bc4651b9de35ee60fe66c4341ba3bd1f66bcb release26-maint
+71888 cadb69e1dc9a62fcb474c3156f38fa871475392a release30-maint
+71889 1837e8e229277711153c4ae02e0ad4d337abb082 release30-maint
+71890 05de864077ba9b83e89cf95873ede751754967e0 legacy-trunk
+71891 587c8e3917c6a825f2908f59f85865307672a2af release26-maint
+71892 d3fe6e96484c97cd4e00741a377f25c42b6d556c release30-maint
+71893 eabe6cf9734c832b296af8d33a962e7da7b46166 legacy-trunk
+71894 a2ef4dd55cf256194bf8cdf4cf599aae3462fd6f legacy-trunk
+71895 f08f776082eccb3a7e3c138d0dfa01fc5bfc3627 release26-maint
+71896 ff29e966abb65a92062b89e268f4756864082f0c py3k
+71897 2f8e535f9a9bfa441a731b38ca604533c59270da release30-maint
+71898 bb876a133bdf3a7a9dd58c27f8d772603881faa4 legacy-trunk
+71899 676daa1ef2237129e3680e042622baffe20d2c31 legacy-trunk
+71900 305ffadf8315b3b58d33601a58cd3ba7d36a7e4e legacy-trunk
+71901 ddcc2a6fde3ae3b97361344e250b99e5e8afbe04 legacy-trunk
+71902 c756f30bc42a7e64c04c56f87b78051de4709e4d legacy-trunk
+71903 85246e4e14283e6e19f342c05d08ace082ba3037 legacy-trunk
+71904 1467cbc223e60079924e721aced86379a2eb92b2 legacy-trunk
+71906 2480ea75068fa21e4d11a3b3b1ef9c6e16b24db6 legacy-trunk
+71907 71b7b49215121f58d091cee6e570fe01505a64ae py3k
+71908 4af06b2bc3cc25ea6d3fbb2f7aebdb05a0bdd8c3 release26-maint
+71909 c6bf52e153b4a3d23a12e516092627520f4d6c81 release26-maint
+71910 85cc9512b60c5378169a1323dd591d9518358461 legacy-trunk
+71911 7cd23b2eaa93bede258e64abe77c88f226819f9a release26-maint
+71912 083cea0f27a2c213a74513e39dc21f9e35ae48af py3k
+71913 006a40b5e0c3b5f9ef2eaf4db98173c14013b0a4 release30-maint
+71914 179f4593bd3ed081fb3e770c3327a41b438ecb25 legacy-trunk
+71915 3d07c9b2395142b02a5424791390fcc4808dc2f5 legacy-trunk
+71916 f88306c8265e3ddc0b298eba25a554815376dada legacy-trunk
+71917 62b3185359e365a378cfbd69a8c67e8ceae1a4d5 legacy-trunk
+71918 3b49d30ca5413bc09c738aa7cf6843013f6dc077 legacy-trunk
+71919 2e297b1ec93560f1320acdde97fa20b837dbfb21 legacy-trunk
+71920 694daf8cdf9938bf2bea8c0b37876d2ac23211bf legacy-trunk
+71921 6255a72a4c1e9eabb9b0e4ea30b979d0554aab75 legacy-trunk
+71922 8fba2584f38bea2335fda08ddf1462c22e2bffb6 legacy-trunk
+71923 63286242dd9db1445e4f92305299ab47021e66eb legacy-trunk
+71924 ca2f1e34f562d1b2916ca5b0baa7c1bfaa594f24 py3k
+71925 7bb1a4cd5ee5b86c6cfd2fde15c977b6c4b38991 legacy-trunk
+71926 edd8f0d52b38e2e50cd6023019a1d5d5c67fb6be legacy-trunk
+71927 456b2a06d01700f7065dba1855049d8f6c0c6e2a legacy-trunk
+71928 c7ea826fad77347ee852ee94f32a708edcc826f5 legacy-trunk
+71929 25c20a77f3733d9400d91b35c078d0f0988ba37a legacy-trunk
+71930 0ad415094a050618d858379d263edd6d3835761d py3k
+71931 12791812788dfe9ea5c53f4b0218352c48a2372c legacy-trunk
+71932 ecaca7177f66961c69412e50fa9308ae6bb4ce42 legacy-trunk
+71933 4e5ad566bfbb5a939b24eb3240bc400da32397f6 legacy-trunk
+71934 a07a9b759f27c256ff3c35c5c3b08bc94f4cdd39 legacy-trunk
+71935 9c98605072650483e824bfc680f385324ccefc96 py3k
+71936 f1142de43e7dea8fdf372efbc0eb17903177aeb3 py3k
+71937 81aeb8bc659d570f63617d1b80aa27ee29aee208 legacy-trunk
+71938 6947bc3dd43321642fc28a55cce71d4f8e632c96 legacy-trunk
+71939 30b03e1dea8bb71208781c20c2ae461a1f452274 release26-maint
+71940 2cddaf8d3c3e0c993107e3945670ab93e554fc01 py3k
+71941 a3d48b2e957de971c0955f9eb3118425251f80b1 release30-maint
+71942 ef0ac42699340b5d88715bef69156e45f344aac1 release30-maint
+71943 933297ebac7bac20f9aa62f9a23cbc020b8b7093 py3k
+71944 75010cae04790076882af279b8b445fb93c33780 release30-maint
+71947 72bd450d539f157e67eb6e1b7dde1ef63e3b48a8 legacy-trunk
+71948 c92e93a54298a8304f1ece154f4d159a6ac2c5ca release26-maint
+71949 8fdcdf0b5080ea92e5aed95d83fba1d209dbc3f2 py3k
+71950 912438655f9304048bf8cb8ced933af5d23c76ca release30-maint
+71952 a3a246da144b7d36bb2bb7ecfcaa64202e813038 py3k
+71953 9da1cfcd2acf7f67d291029467d818553e2b2288 release30-maint
+71954 133819ae80fa8ace181563a9a2fc13b78c12bac4 py3k
+71955 1c2d11a7eb23f41234ef14232a75d50bef34ab72 legacy-trunk
+71956 172913e17019ed296015784fb67ffcd7863cd427 legacy-trunk
+71957 73b502f5769059c0945de38e0204882b228d3ed8 legacy-trunk
+71958 00694e0c2e6b2eb31cbfb15ceb45741d22e34e53 legacy-trunk
+71959 59c4114379b34a7b9cecfacd608938aa8267e70d legacy-trunk
+71960 64110c0ad5305e7b725fb9b7af302f9daeda7ef7 legacy-trunk
+71961 db03016bf6539f46dd04654b67f6e9d4a3181330 legacy-trunk
+71962 a15c28bfbb38c86bbb67af33de63e65656421a87 legacy-trunk
+71963 75963372b7149d96614aef094669ffa40cac6ca1 legacy-trunk
+71964 59a1b02de9067120f2d4404ab91416f9aad108e7 release26-maint
+71965 7835ada3cda2c6abd6b8f50beb5d114f03587d38 py3k
+71966 1a5d1d1c9478a94d39887489d7c8cbe21b8a75ce release30-maint
+71967 f76572108dd7a452806ec51bfb177ce4cbc693bb py3k
+71968 b45a32355d378ccc88414ef763bc0ef1afdea59d release30-maint
+71969 01c3363a357f9ff7168b1dc623dcc276d9b14e0e legacy-trunk
+71970 4633f8537bb77c7f51c4e3dd645d21867b2fbfed release26-maint
+71971 39120cc7e321ee808609d5184257ffe6dd08ba17 py3k
+71972 fb4bb0a3856e1b0492206ad91409924487d12fba legacy-trunk
+71973 355beb0bd02bea387dcb3972a0786ded56a4756a release26-maint
+71974 7237730425fb373fd2bdeac54791acf0cd3a1155 py3k
+71975 951a62b86de8b99ce46defb6790771a45ca14a2b release30-maint
+71976 bfb47bc1d05114418ad7ad8a606aeab78df3a8f1 legacy-trunk
+71977 f7eccf769c1ae2df9f58f0eee28832ac683a9561 release26-maint
+71978 785ea299fe236db6133f498735cc382488d2fbe4 py3k
+71979 3162eb09c2c3dda7de2e2416f029cf32f1c63e17 py3k
+71980 021c39a37edf7615dacf4da402241a3e42a85dcf release30-maint
+71981 54ee6fd181f2ca73355523a5fe6548fafac8c451 py3k
+71983 9f60edba5aeabffb7035f91e28e3aab2421b48db py3k
+71984 abdc1764d8e5a1ad01c7ec832e7da8034525bc0c legacy-trunk
+71985 0688e8b246326a068061e21635a6d96d2f90ed53 release26-maint
+71986 0b1674f27b70fa04c8513c682ae47476cd869b18 py3k
+71987 5d4fc166a3d4614068300bea14a44ee7029b18c7 py3k
+71988 456e5843020206c7d7f53a768722583cc275fbdd release30-maint
+71989 de1d0f71e209b52b0d26524ea8f27b84419f458d py3k
+71990 ecc3eb1564888c84a6e2514867dae455f6456242 release30-maint
+71991 383e32ab607c4ac1be376f9cc3034bb5388a3e79 py3k
+71992 e0d45d32fb82442688f7389f467f40ba34af72a0 py3k
+71993 35d73a988039fd1336ef0796efdd8b877adeec10 release30-maint
+71994 caf2b91ef06a59cf844a9df25fa4e10cd33ce6b6 py3k
+71995 d2cfd3d3bc548f4f95af79ed312916f90cff7401 legacy-trunk
+71996 c42b7dd15505ce98161c9ed3dfcbdf05d0a9a8c8 py3k
+71998 d31be8c9c8a29bf91ce743b6321a52447d8e26fd py3k
+71999 1fca1c93269625173ef39626fcb18c52b58cf0a8 py3k
+72000 fb89983353ad3c3cf8fda1ac204b4c9ef9f744de py3k
+72001 d0594e7a45d6369372d9e5bb8a5bb3a94a7a73c0 py3k
+72002 98aa631dac2bcd01dc6d22ffce07e136e7a7c75b py3k
+72003 553caf6bae47e10ada945f548578dcc0822fef00 py3k
+72004 973d24f44b07f608861fa6545335de443a107728 legacy-trunk
+72005 293ada1dbfdade2453daaf20617be71f5a07b46a release26-maint
+72006 17540a164797995658605d0e04401bddebbcd602 py3k
+72007 d05134a4f02ce59288e9661b438d766ee18a27d4 legacy-trunk
+72008 f52159f87332bbbf218f1a4c7fb01f07489e3294 legacy-trunk
+72009 57812944c961b789445a6def52f32a839b74bd45 legacy-trunk
+72010 cc0dff2bf1c2e6d53fc46e6016ff21349d81a508 legacy-trunk
+72011 bf7f34073418beda36f7cf5b12627daba3eed83b py3k
+72012 11a5452e3305e6074c5df2bcc2fc72830ebac8d1 py3k
+72013 9b451fa58503a5340b97a9481b5eb82b59e31e32 py3k
+72014 d37a4c5d6d2b538b1f1346d6818f724c652c3ada py3k
+72015 362b4ae2129a4f22b0c19a7cbeb68e4d773297b9 py3k
+72016 8068ab51632d6131e633de5bfc4b6e7c432b69b9 py3k
+72017 743211b60c9467f18a44bd0c95ba19567fad375a py3k
+72018 ce7c353a1e96bda08c0a91413a6f0b78f62da117 py3k
+72019 7faa8a7f863e1cfde1b90e71173fe27d31bbfeb5 py3k
+72020 98889ef15795884f42d68b4b0fa0b5b4ca7bbf40 py3k
+72021 e48f860a5cac20b58e9818a4fc8a5f28c1bd915d py3k
+72022 6bbda1851732e1550ce62d71a17102ffb1518649 py3k
+72023 2180008d02eea2c3a745f0ef40acba49961826cf py3k
+72024 ea4e192d94147b48a517f54630ead851a8007396 py3k
+72025 4abc4ca4461fdbed01411a9ccfe6cfecf7187e72 py3k
+72026 d580175997cd509ca82018d9ca1dd0f89ff10357 py3k
+72027 f943d824c8c35dd762dc3a3090b12ec6730faa4b py3k
+72028 f2d710e479e2eda721f316874b30ff6073ad8089 py3k
+72029 71a2aad5bad655fe4e16bbf97365367c88531cff py3k
+72030 29354c4950e494683c7a84778356700a82f42d83 py3k
+72031 01d0bd950ccd134453de1d18acff9ca6488f5528 py3k
+72032 41fa1a106373adb25d388d819e5b18bc8a90a168 py3k
+72033 c25e5a9554f5309066aafebb5ef48fe27c3eb362 py3k
+72034 97506672afe3fb5242c5883a88466106bb4dba92 py3k
+72035 2ce26c4679cb97583b23fe32c2b292e6ed860ca3 py3k
+72036 c6c4c063d8740ef25201fa93a8522e823ce99141 legacy-trunk
+72037 9e09783ce2288defad102fd42222acd3f88d5cfb legacy-trunk
+72038 5d75203c871392cefb6a33fa005226919ca1ff83 legacy-trunk
+72039 b4ebb300e6119c0fbfc71cc667b1ede387f658b0 py3k
+72040 4bdd847b57c27a25a2edd67df4da64c42e4b0dda legacy-trunk
+72041 1f95ba4d1ecb185986215c18fbffd8cac18d5ce6 release26-maint
+72042 1a451ff6583c548f8b066471352e4451667b45de py3k
+72043 78dfbaf63b17c9398a1422c21c298d3a84245e0c release30-maint
+72044 4b4b59f278bf338cb253226dd4bd80e2ed4b2b72 py3k
+72045 b0ccf2acfa1e6908089efdb9cb06216b29547a5f legacy-trunk
+72046 54279163389d45f47ec5b927aa69ec78963c4d8a py3k
+72047 84537def45505019611df93d5a597e8ffb4c671b release30-maint
+72048 7c39574ad0375416a2aaaaa4264ae50d84e0aef0 release26-maint
+72049 78fd15e052584070ca2ce2d2d1b9e09940f579f1 py3k
+72050 e56fdba61e975f1184931680b78f22ca9d716cff py3k
+72051 38522ea2add0a87626e317d9cc2cd3684da5bb7a release30-maint
+72052 1c060d5c47cf0aedac7c7e4f2aa50d7dea4588a5 legacy-trunk
+72053 2b3945d755a7fe61b78f5de2e093b629e7ed053c legacy-trunk
+72054 019244f4b0d0d0e5d932f6e5401b11e4dc813c6d legacy-trunk
+72055 423f8f9b07b14a8544c5ff3309a6d289dcda284a py3k
+72056 d9b9422b409c898401f980fdc8f34bc918b1a8f8 legacy-trunk
+72057 97cff593a257e9d5ba581f59de4a16fd7b2fa939 release26-maint
+72058 6f1588fb7595e1b20fe6d6f5c7856e54810b3852 py3k
+72059 b0ae9ffc7779fd7503dc4fbd42115e8c30693f5e release30-maint
+72060 32460b04e7b6e0d5077292a765cea5b89513ad1d legacy-trunk
+72062 7b206e2c0092c4b2bb81ff398413d448909b8fd3 py3k
+72063 4af2bdc9b1b7355795f69772da4cb830cfbde22c release26-maint
+72064 cabcef7e6f256cd18258a51b5506f2499a861968 release30-maint
+72065 1ec4bf3ddda6f5ed293a9b9bddd93f5769cf4eed release26-maint
+72066 dcbc2203bdf36276b2c8d07169529deefd707823 release26-maint
+72067 d65db169e3ad71516e04a8eec7bbfe3ce6bb7f2f release26-maint
+72068 3f15a06d00473ac94632a38f1244eb4bf9fb4dfd release26-maint
+72069 bf05222c07400e21b62de910ec6aa8adeb6cfde8 release26-maint
+72070 f7a39e619e0a1f62f8550c530446f26bb5565022 release26-maint
+72071 02d6f3a6977f78b5885e1e2d44981101c075ffcd release26-maint
+72072 f24671528980e7c3432708e15281c23b93bdfc7e release26-maint
+72073 714f95ea6b8f6c8c78ee4b897bd90e20e0b63f7b release26-maint
+72074 36eb537abb179362f4afe3b4e168ceab70c57783 release26-maint
+72075 503f0f41f35f91af4254a0a4a8898bdea0ebdbfc release26-maint
+72076 b28ddebbd835575989ce4535321f411b202c4ba1 release26-maint
+72077 6f10d525e3b84b5302a47b5aab74069673c7bcb8 release26-maint
+72078 3166ded6bc4a26c2d19a0894689111c2753a8836 release26-maint
+72079 9dc34ef227353827a437ab144a9cae997aae92d5 legacy-trunk
+72080 9000f966ccbbbf03585fbd4e432bc9cdb000326b release26-maint
+72081 e2843b64175ecd694f0de78f1e18d243e1caef85 legacy-trunk
+72082 c8f94007b1c46e0e19e3e03a2375ccda156fe34f py3k
+72083 232d2250d70355dfd3031de508d18c87fb71902b release26-maint
+72084 025ba12c7da5418808f04f7ff7d4cb7430b0c31d release30-maint
+72085 7459023ff861ae5facfa5621c690d5d40a1801f0 legacy-trunk
+72086 7fda5af2af7d10c66dd664d869a6ba32af32f2d6 py3k
+72087 a38d6cd9aa6369cffe32f0f32c2677a1d5aa6151 py3k
+72089 1469fb1aea924ddcfc8f6d729b043a3ccfff6bc9 py3k
+72091 3b4cea43f9e63992c21dd91ff8a92001b362a76a release30-maint
+72093 817d8b28cd6b3e263366d6f52cc6ab44a6193263 release26-maint
+72094 9c2ac1ef3a6fe4d7f37a32516c6ff2e80a9fa175 legacy-trunk
+72095 b408942fb435398e9a21b2682d1334740a90dd50 release26-maint
+72096 69bea26ec87b9937e56587f4516daa5d511810b1 py3k
+72097 cea641ff4534c390dba432902bca3b4c46fc2d6e release30-maint
+72098 3dfbac799cf51c91ba09d62a0b87374e48121b7b py3k
+72099 02068877c190b3d779aac6f3b4d0520d66453e25 release30-maint
+72100 4ef7f93d61a1a8d705f6e88bb5ee5dc3cda07195 legacy-trunk
+72101 8617e81016b6b0c1c89dc943cbc7f046738876b1 legacy-trunk
+72102 5f81c45bdf6d10180806a43b61c953846658f254 py3k
+72103 ba638d3a49d15f5df698a5dcfe4a8111ab167336 release26-maint
+72104 e95c878ac79ae7d79996357d47e17a04fea85cca py3k
+72105 73702abe1cb9718483b5033c4a37ff5af1d87f16 release30-maint
+72106 b8633c7893fef402ed4669be357c48432b013d85 release30-maint
+72107 2ef2cb5773fe2e4eaeadcdb418bedd865699e520 legacy-trunk
+72109 3759839b9fa548bce0d400bcea2ef91fab8100de py3k
+72110 21803075b411157806d757ff49ed938c0d1b8324 release30-maint
+72111 ae7f82bbf16c8e6df3ad3032f8047ebd18dba506 legacy-trunk
+72114 a3814dc99b80d1c23d9cdec8cd5f097c61f38489 legacy-trunk
+72115 3d6bc42646b51e0c2f3bd322008f068055cc24e7 legacy-trunk
+72116 c855df7c6bb591050bc8a023183e575a535ad459 release26-maint
+72117 ccf7853b0793244bffc542f8d4ea2766c3532cc3 legacy-trunk
+72118 647a040df4d11cd47199990d3a2b2c2a31cf6d6f py3k
+72119 a3fcccee8957a0e6a1a4d57bbab3774c5391327d legacy-trunk
+72120 42ef76f544fbf21b6e63403059e63200543f3df9 release26-maint
+72121 fe062187624cbe73c3177d6d031d6827e00fe298 py3k
+72122 7617fa7164de6dc7140ab9e9ad8b0c186c1631b0 release30-maint
+72123 ccebbad5f8dffe9fd8dbf1c6959e228ac6afcc31 py3k
+72124 93fe611cbd3aa12f1fdfe0e213c5253282cf5041 release30-maint
+72125 b39cb292194573d1bb40a38f1cff672f1d4f8156 py3k
+72126 4762394fc26c52c19b9300f80488d236b15efeaa legacy-trunk
+72127 5d9771d7cc46c7f28b460c16ced01ec482dbd7b1 legacy-trunk
+72128 8a859ac7e5b81e19beccae06dd4fc95f34559d22 release26-maint
+72129 e27449de61db648c54770a6c880c03264ac0ac72 py3k
+72130 e894433c64640f19787c06dca5a7a9616401d22d py3k
+72131 27c6b63d1db355f6877175d3dc176c90a7df401f legacy-trunk
+72132 411374c5aa42278d30f16a07211badaeb5f5f225 legacy-trunk
+72133 94cdfd07d4f48d7285248c7c03be0e48d5f4ba73 legacy-trunk
+72134 79dc8d588eb3066c298bf479e907a857aaec5966 legacy-trunk
+72135 d682c934684808832825842463644c2c92b6f0a2 legacy-trunk
+72136 0f2b335668eebc8fda9a3b120860ba03158e8832 py3k
+72137 34e7c1b1449501a183e1d8b1a18dde85bb98f859 legacy-trunk
+72138 a1efaf01510017470bfcdaea8141cc14cef58fba release26-maint
+72139 40d3431db240855c43fb5abda8e1f28776b11bb4 py3k
+72140 2cde0d003ffc03e8010a1a6da1fefd7140cfd8de py3k
+72141 d6688ed040cf36b4cc216f64c3581775acbc688a release30-maint
+72144 c4a1c4884056d49b8d81eaaea85def7984d3ae2f py3k
+72149 abc80f8b0dfdc1ffdd5c8d1ff00d274fd375ab41 legacy-trunk
+72153 ed8c1395d0330cdf746a2b5eef261c47a5b7c0f4 pep-0383
+72155 29656a03cce2fa4c104d80829f1dcbda84f02944 legacy-trunk
+72156 bc60de2322031ced5b478991f7b2a05733e273e3 py3k
+72157 4b86e53f9006f6172a9b9cd26d2446c793481cf6 pep-0383
+72158 bdab7ccdc7b486411cd48468b2feaeb9a19f1388 pep-0383
+72159 e7a9e2fd713f024170a84516d36a95525cdd6d64 legacy-trunk
+72160 0935e24c81c08d5ddb76273403332d9061b3d260 py3k
+72161 e08e80e768c11f094f1b407073953421bf6a1873 py3k
+72162 a80b3bb4d1b0db2656876b1e3f034ce1103421f3 release30-maint
+72164 54c7ba3ddfc656ef1dd39befa473bb3478161de6 pep-0383
+72165 60d0f373a8946a20a0d028b804dbce4d5d25bff9 py3k
+72166 aeb914193b45a60a1d7dd4f1aa317d1828942e59 release30-maint
+72167 85542715a2490bd61b4e5d60318c4f61445e46c7 legacy-trunk
+72168 63480b92a5e125f8d9bf03167d93a5a288c106b2 release26-maint
+72170 96c04e6a6d882d36c520754a17afd1bdf89b4c16 pep-0383
+72171 cc69d3dff87a222aa75ea449f4cdc2e4bed5386a pep-0383
+72172 5c55b9c80846a4d1fa3146eed26e912b24d2ad51 py3k
+72173 963f0f51970955ec7442301f9a0c99c079989267 legacy-trunk
+72174 98651e4f65fe59aa0759cd59a0806b547966965b release30-maint
+72175 bc04cebca7e6b42983ce7f8d01e8876d92acb11b py3k
+72176 89d5ef82c006770cf3bf68af24cdd452fef178ab py3k
+72177 01aed48196b028eb91a8d78788050e8caaba27df py3k
+72178 409448d455e3e4260eafc9c7111c6ce5c1ee8466 legacy-trunk
+72179 960ef00d52141779d8249dfadbb367e2f98aca9d py3k
+72180 b18bd1a494c71f0559625441d69b04639e821ba5 legacy-trunk
+72181 2280365eaa72c10746d743bf71d0b8464e156e85 py3k
+72182 95061da06cb845b7903f4bb594c6add8f005fb43 release26-maint
+72183 8963cd858ad6106a63c5307fee039ea43b13d9d9 legacy-trunk
+72184 8fb19ca62e70dfc5f9679eec7b753ed6917919ab legacy-trunk
+72185 1355dac238fecaeb82731c16f271a2a03130368e py3k
+72186 0d817e8ed3ebf9df7abaffa092abab554214bf87 py3k
+72187 42d28e5dc7cb14c9450c2f62a1db6b5f4110775c py3k
+72188 eb8115abff5e552154fdf0fa10661b8535051fce pep-0383
+72189 23bc4b391c10229b69418a140c6f43f1894156f6 legacy-trunk
+72190 0c8bfddbfca266675f3be1cd437c01c2bbeadf19 release26-maint
+72191 9d840a58a0d5d1b6abc8fe2c5a620b87b3c31fc6 legacy-trunk
+72192 511a37ef1a410ff4d25f748194ddb3bc623ebe0d py3k
+72193 051019f0dd9fe39a5ad8c341f8f13348ad181045 release30-maint
+72194 f686aced02a3e4d43c348c63ad6d27832cbc5df7 py3k
+72195 e19cc3ebb58a0be6244a437ad4084ccdfc2461d6 py3k
+72196 206ccf9aa025f01645fc1bf91d7acb72ec7770c8 py3k
+72197 e62bc57a62eaba0aabe8642c73a8efbd02d595d6 legacy-trunk
+72198 02b615389d3ef506acd5039e0b77286aeab07957 legacy-trunk
+72199 d7b51ebf6de424369ff5d5636a15b49ce91660aa legacy-trunk
+72200 1b71a570f54eacfd8602b416941db49d01676262 legacy-trunk
+72201 1a849ee5f08cc86416821b8cba172930ae584b88 py3k
+72202 5aaf24ec43dc10afa4ae756c569906a057c5d21e legacy-trunk
+72203 903e80f3e8118ef27c81acb4e8956b0614484a89 py3k
+72204 11b1fc9921bd0e03d1147f6ee8bdc70b3e28460e py3k
+72205 f277a84071f14ee2857b4fa1a41f8f4e1ac12198 release26-maint
+72206 21bda611f0e400d750e59fd86f6d32a0bb34887a release30-maint
+72207 ec3fc64631d99eefa1ef0194def18e854694c746 py3k
+72208 52a77ef069cdba3a12fe7763e379407e38e9db33 py3k
+72209 66200a76de2662b471565c835f96961cee387c30 release30-maint
+72210 9b55e9b99a436bda357dcc922f985b4d46c5ac6f legacy-trunk
+72211 5fe904ffc6b823c4f9b216b8a8f07537e3115950 py3k
+72212 be3c07adde95da435efbd6b4127b48b499365a45 py3k
+72213 e0cede7f521b439fe981085b6bc208203c88178c legacy-trunk
+72214 a893194155a22523fb74c86984b265f6aec16ad1 pep-0383
+72215 4f65ee1f4848f69bf4e7c926464c3d3131349388 pep-0383
+72216 58705082e7c85cb75f64d6aec1ea92f98ddd410e pep-0383
+72217 52a89d723b6bc12d8373ff17f25ce529b1e6351f py3k
+72218 0ecc5b90647795235d6df9e74f38a903cd13e215 py3k
+72219 7bce052f0e7b71e4ef63c2bd48ade766331e7f64 legacy-trunk
+72220 c5f14dbea43fbcccfab7cdb791994d1204220511 py3k
+72221 b06f11f3b65b0d8859ede8ceca04ff26dcefa012 legacy-trunk
+72222 ba45e126574da1d6bf61d4be7109c9af43937b8c py3k
+72223 e54141d63e01874ba2b890025d820dabe0b7f271 legacy-trunk
+72224 64d9a9e7f68ecd420a294a92f9ffe251a6da14ff py3k
+72225 303b7ee8e7fef2baf3eac1bfc4c82b24745411ee legacy-trunk
+72226 001ac59c1e672ce3da64bc1c84e3cad34bbe2fca legacy-trunk
+72227 9fef1f1657c8a75514c3d28cd361af405ed41f86 legacy-trunk
+72228 358ab1ffaa8084ea773b1aa91c3a8d73890e7869 py3k
+72229 aee2b10dbab938ec2aa54d18071bdc6ad08dbe46 py3k
+72230 7ffd9625c91cfd79843651d5a2b099340eeaf375 pep-0383
+72231 00063adf055845658b7db201e46bae3229c2c9e2 pep-0383
+72232 0709c6d369de6707cc69a87b53dd399aac4f3951 pep-0383
+72235 764eae5208808f5f04a326ae0b0761020b3bfef4 pep-0383
+72236 9b107a797df89e0863d7d3f77dd19d60f6de6503 pep-0383
+72237 d6b3b74bda0e5aecbf3f6458e4958c23a32f3f08 legacy-trunk
+72238 526b0dc0913821cd707814d0e764c9fe6f30a039 py3k
+72239 f7801699815c1243ff99ea817d63ea426d5c06ac py3k
+72240 6877a1f4a0927fec65e1ba3ed8e6315865b86b62 pep-0383
+72241 ae24de48adc41d1196e8ba1b4b242f31e2eaf216 legacy-trunk
+72242 bd6d257a9130f786cc5c6f2f72b5a272852d97a5 py3k
+72243 87fc1162d9f4b69409c9b2c95147683a386f9c3a pep-0383
+72244 abf574e9f1d3d59d7975e1ef5f5f4b946af34003 pep-0383
+72245 394462eab65db05274a6f66445ac818286af9a99 release30-maint
+72246 a67783d812f6e6cd3774fb14bc1b1f6e70e447c6 legacy-trunk
+72247 33270ad6adef82f6053bc3bc8e899f595f675fda pep-0383
+72248 13a82a710f19b439800a8c9e499f941a7fdf58bc py3k
+72249 f70e91f5fc9cff248b6c2e16abf9b94e44f7fc18 release30-maint
+72250 63ddce9faf4a987eb4a8f89281e2d0e7f95b71c7 legacy-trunk
+72251 4a76d6d297cebe5e3b09a129a5a39879f084d722 release26-maint
+72252 fb521f996de13bda751dd8a9e712c76b5c264142 py3k
+72253 1f00bc1d115a0bf40fa02d9b5060883007311a65 legacy-trunk
+72254 5b28deba1cd6b7a013b65eaaa8a3b9ed73c75e41 release26-maint
+72255 e2b553d7205f39beb105ddfd87f0d2d3f84b3c14 py3k
+72256 a8b5a5b9a49aad218391ba2ac38baac1fa31480e release30-maint
+72257 4f867f1494d55e9c1f00918035074d7a567b4c2a legacy-trunk
+72258 c6f99d4c8122e12cb4cb7c86e66eef895d4fba64 release26-maint
+72259 0b7eefe7b6d17d8f4ca2a81e1f2f098daacc7d51 py3k
+72260 1c27ecbed8c41a7129eb4a3a8829573948586f7c legacy-trunk
+72261 ce947200b7688a9384d3fe9c47154a0e7c2404b8 release30-maint
+72262 18a5ae96ae5c9a3fde1dfbf680b3b51933182179 release26-maint
+72263 e4af971b91845609812f91163f8d40bf07a2ab49 legacy-trunk
+72264 5ade0de74b5a913a0a718d4b1b2b4526bb9ae758 release26-maint
+72265 d7bbde936d62905ada72956a9d96e700ac4f5bf5 py3k
+72266 8346d3c7c4e23b89e8ca78320b5c4ac1beaa8b1b release30-maint
+72267 e4ff4273493bd048be0dc9f79b896383b8d8a856 legacy-trunk
+72268 4cd437dface89832be8a212be8653cd100e2ce5b py3k
+72269 66f75008c3a87250293682d8eb22f9d1e9e92e55 legacy-trunk
+72270 d8d67aa75525201d8c89ac9600fba5b84353f628 py3k
+72271 e68685cf3651d998766cc41a1ff06ebf57a216fa pep-0383
+72272 db28390ca617260651f96d8342a27b0d039c32eb pep-0383
+72273 d6cbaea975698ebf79584e6d6a8b59e0ab5816ad legacy-trunk
+72274 2cd9aee6f6246032885f554612374b69f022668f py3k
+72275 bc1d196836a4fba8bc116ede3e10a91274866bf7 release26-maint
+72276 3cb5b7d5630981cf246791b31fd05f4e68fb0309 release30-maint
+72277 69231cefd80d3fafeb2d54b852fd23b97c6ae66a release30-maint
+72278 ad12d8f414c7361a985e2f180401ce9f1eb5476d legacy-trunk
+72279 3088d2ebf7be5ea3d130d8af812347d6e4376c5b release26-maint
+72280 fe54f394599c253588190d961861073ccab5d862 py3k
+72281 73af90206cbe324b9963ae56888ccdfda291b780 release30-maint
+72282 5cb85eff8c035aeaa0409f3c59137782fe2fb8d0 py3k
+72283 12d8fd499722c2dce4bbb1b794699c01c1707517 legacy-trunk
+72284 538a7d5830645d0a7614b4f0c6d4c709f6948532 legacy-trunk
+72285 9b9590007e824981b5da48a90c5887265bef4b1d py3k
+72286 100381c5e73abb7f0cb8769ac42d71a3d0c81aff py3k
+72287 4791216bfc1ebdb9e86953c9715475ea4c5f2d37 py3k
+72288 75d41f46085210917bc3a4ef088bb3a3662c5409 legacy-trunk
+72289 82ffdfbc42e569649dcd4ca9c872bf72651b8cd7 py3k
+72290 f722892b60ae3beafdc7f6104a82ee4eb7dc0b87 legacy-trunk
+72291 bd491b5a8808698b6585ef1f27540a7a616ddc13 py3k
+72292 5ccec4b36646d117afb7be6e3897528264582383 legacy-trunk
+72293 310daa99d6073d33fcf07b14cd21771e98bc3272 py3k
+72294 c2d107e078397452ce86e5e14014e42f839eac31 py3k
+72295 5399be7a39ba3717bd801d5c6a49782d58c9795a legacy-trunk
+72296 75743aaee5040c0b3bbd216ebfe8778c25824330 py3k
+72297 d3747b0a2f361aa4d70c40f8db818b0afe56ac6e release26-maint
+72298 3b09f332f1fa3b421b1f3e217bc783e1e6c45a2c py3k
+72299 b3319c084d2571c3038310175ed39cc5cce975aa legacy-trunk
+72300 dd938a2cc2f0c74a707bff593efbbab33c35b3a2 py3k
+72301 5becc86548122082c1c9193e2a86ef8502fc503b py3k
+72302 bba7ee9daee064589c9731568377c41adc7abd56 release26-maint
+72303 639a79fa6a238a652c948f14006732907911714c legacy-trunk
+72304 aeb4050cd43185262fc89eb7ccf69e2ab961aa9c release30-maint
+72305 4fcfc53fcc74bd6ce995fcdec53905d08186c2ef release26-maint
+72306 2416f166de4b00e2ab7b00bbef6511497f6e934f legacy-trunk
+72307 b1ea5f7313fde54d31f5385f1ea671d11efb9908 py3k
+72308 0bf5bb2f3c08986dc060d0aa4fb70833b1bea961 release30-maint
+72309 66682fc172e90e98e8a1474ae15f0f1edfee755a py3k
+72310 7321d4510b41babce3f9c2a4748868bd2be4d402 pep-0383
+72311 4dd5a6a93e7088c03b2ac1607db9b356bb945167 pep-0383
+72312 6e10b70a41103760294d1300c9ebbe28106856d4 pep-0383
+72313 ac209f132b17b284014d4a10cf97ba77de8b7cb7 py3k
+72314 4e5834b322c10a2cf010f3d44e4bed86c4e590b3 legacy-trunk
+72315 2e044c9f4b405f7962808be09331155ebce79e20 py3k
+72316 b00ce6f0fa3a9cfb937c6ada1dba68e2b46ff17a py3k
+72317 1e82bef68f4dfe87d6ed2890c7e112da5ec05aa6 py3k
+72318 5dfd229063411ff61c371d66a3cdb8bf3eff1b64 py3k
+72319 dd489f4757be8269be96ebaca36eb03145fb7e0e legacy-trunk
+72320 af8f843257973f18b988044215e4746fed1f7daf legacy-trunk
+72321 b12a44eef40b6c592706ec3f5b6637092e76c935 py3k
+72322 c49bc330327cf29ece5a10deaac252bfc16c5616 legacy-trunk
+72323 58574288a5bfea9deac6107e33b27d72a662dccc py3k
+72324 4c63670639ec70b5aa6b64e5dbbfbe9baecf43a3 legacy-trunk
+72325 58aa0ad77253d7754c68e9a96100f3b77b1fee5e py3k
+72326 5878ca784a8496e4d5f4cd5bffc08828a08f854c legacy-trunk
+72327 33bbdd3eea43d9fcece5ef4c7df7e39cf7e904ec py3k
+72328 9f8532a0f1abcc461b60009fb1551fd7d282ef81 legacy-trunk
+72329 ec5f03d1e81989313f0ac177c2fbcad1244fb5b8 py3k
+72330 f6bffb9e834f99e6080668d19e701598e0491a2d py3k
+72331 167cd378b5bd8b37e6766b3da5dc0d829ac3863a py3k
+72332 2cc11693a180ed741784309ddea764a4944c9e35 release30-maint
+72333 c6376d3fa9687817b2a41bf569edc0549ce6ba92 py3k
+72334 d17cc72ffe807671d4960d51bae0521fcda0c8d3 release30-maint
+72335 9f6b8ce2023f0c244fb1a121fdd5743f7a10c4f8 legacy-trunk
+72336 215b7b66e62df285e15d917ab2df298c4bd377d6 py3k
+72337 4f3edb6af8c1bbd3b385525c6d00cd538475d4ca release26-maint
+72338 9760353660657aaa21d2cd37cc9b1f0500a1b682 release30-maint
+72339 ca450b2827ef3809b3497feac18c02fad48bf43e py3k
+72340 d8601e8b3abe91eba07d325f17347747cd299d95 py3k
+72341 a7c99e34e239e2172a67c80752771fbd70c96fea py3k
+72342 8e8b9590917ad94c5b82c6395738a14707a132ef release30-maint
+72343 7ea7870dd966d2216d5144d73bad515dc03f409b legacy-trunk
+72344 ea2a90082c8375283925110dd9b9fcf14563ff51 legacy-trunk
+72345 6d64cd69f3844a55edb734b3bac5bee0cfaccf7f release26-maint
+72346 987421d3f8ae40b6d905fccb2f77fc5fe55d9674 py3k
+72347 b0375567fae80a46cac8c125fd5896c342287f45 release30-maint
+72348 1d8f24d40c2c68fb9b3ec441cb175046c9c8021a legacy-trunk
+72349 4d5f066575ed50d901961a3313a38b0f9d7ab009 release26-maint
+72350 b977af19c6f0137fe47a7561a3bc211cac8f8de7 py3k
+72351 bbe2aa431692323605fde1abe4c234975ed3cce7 py3k
+72352 581b564d8fc3b2fe67ccd3ae0c2552204081ec80 legacy-trunk
+72353 a85e6756ded2cfe7e2b18cddcd498c9c16d6ee68 release26-maint
+72354 e0179f08d34f2203143e9429e6fbac52c66b678d py3k
+72355 d3ffb3702c3af63fa50ea06fa5326422a3ec6bcd release30-maint
+72357 8f7cf5cb21bb583ab4e5aedb2f42304b0eb4fc42 legacy-trunk
+72358 026d390eecc196ad0514cc18710f58752d02e9b9 py3k
+72359 15d3bde70d87b000ecce9497c3589d4ece737e47 py3k
+72360 f0fb4ddff1abdaaa3356fd6d33aca390073e9dea release30-maint
+72361 ae6850869d52f4f6ec782ab34cc808f5e68226ea legacy-trunk
+72362 2592c6a9ddd6c44ecd959efd6c27952eee93d656 py3k
+72363 911df82bc25dfb62faef6ea1b9d0cf70417bb97c py3k
+72364 5b9021c19512bb2e3a3bd013252d28f928f83533 py3k
+72365 54dc5777bdfbfe6369d83f7278b2846c38a886b9 py3k
+72366 7baf4cc13bcff68bb5b4fb9882d2dfbedf75dd79 py3k
+72367 3b5c400c9dcd451035d87c4230686bbbfde5dd65 legacy-trunk
+72368 fb10b88afd401e81212a5cace4b168e186713b73 legacy-trunk
+72369 5b4b09e8f32ba9cbe5e1ab77b774581867627444 py3k
+72370 a2303a74a7610c8e2c6a63dd219eebb86bf2a2fd py3k
+72371 b666e72f602fa8528d8300adb4a0815967d39afd py3k
+72372 9895483e96013a52cff2d8197fc54e88697a9ad8 py3k
+72373 9c4d929f40599417191c3f45c5c33bbbe6c8d7e0 py3k
+72374 4b1a9affe34cd4f9212de7b523ad7a0a938822be py3k
+72375 eb3afbd6aaa96ef67602bbc00e9616eede480008 legacy-trunk
+72376 4f17384ae8cbfe468c0112ed7e824a9f6f89ac51 py3k
+72377 0f6a785cf286e3d1d83a5e7c424f279afb1e6882 legacy-trunk
+72378 556d11314ad5cf91382c4ff92ab1dbd5cdba600f release26-maint
+72379 57e9b1b0838e52de940cd047134ea84470c5bd2d py3k
+72380 a815accd89e40b341a5d60f5d020193aa81b4c84 release30-maint
+72381 85775d100a32c59f2cbd2a12cef36c0b410e4fe7 release26-maint
+72382 e620701a3ec8640afc6a43230a5581eb13c24437 legacy-trunk
+72383 aec62e9cc6e8eefa6a1e1bccdb3346c7fa5ac0d2 release26-maint
+72385 bcbb94d692efd712962d4ea9bc2245a2ed2cc708 py3k
+72387 29025b53004668500d089bda59f8892c64446b08 py3k
+72388 cac2a5f4b9fae1284b99cfde409ea87cd79ff3df legacy-trunk
+72389 c6efe58eef6657ee4b9f289949efe1c66cbd8bd8 release26-maint
+72390 f1a3de9df425db4c3f1b67913104847ca9b8d7c3 py3k
+72391 fb7d12196c35c2b5f5daabccd429ceece951c672 release30-maint
+72392 35597d3dbd08202cc8871d1ec13d18047bae4580 legacy-trunk
+72393 0388a4272598e3864e9559e911b6aaf0070301da release26-maint
+72394 0c526d1895272b9a5257f82a1c14b8737211f53c py3k
+72395 adc8ec7f7d23019f029a775f21426b53be0eeebd release30-maint
+72396 df3f5db528f00b371f7161a5bdc0d6fac8193f8d py3k
+72397 7cb6df00699f4b34d719bf6c8fcb423fd7884429 py3k
+72398 04bdc944718af9eeff1798bdd5d1674ecc9a143c py3k
+72399 9c654040400defa4c29bbe63e0470f537ce1dc4c legacy-trunk
+72400 0b9d7cced9371d7fb4c853f5da332f64b8110a25 py3k
+72401 034e0fcd694e881a58ae4f1cac99edfa74011b68 release26-maint
+72402 ece7e7a80043c15825114b43a883643f7c0fa714 release30-maint
+72403 c52e555c918d9bbc4fa602af95737a30b1960976 release30-maint
+72404 7dca250343ea41c96398eb68aee4fcbd5ad8f7f6 legacy-trunk
+72405 4a84700664d92621afe8b41d8a31ff8e056a2f39 release26-maint
+72406 46342ffa296353f3507ee79401f7c10789264e2f legacy-trunk
+72407 c0ad23ae2a3e1cce4592006d9a0b66a86c9ae377 release26-maint
+72408 63b23bd3904de7169c62cf0eba37793575e88f69 py3k
+72409 ca557f850eee64cd3f2fb110a08b584c864a28fc release30-maint
+72410 7a67b647b9e77779eceb20a3481922e9e0983adc py3k
+72412 b63020797f9678adaf4d2c3e26574a9eef2ef028 py3k
+72414 a6299241fbd9bcc60597d546c06d443fc66272e6 py3k
+72415 3aaabb3102e8e759a899719813eda59936981695 legacy-trunk
+72416 376fe15862760007b074cd4ec3cf6e7e55d1438d release26-maint
+72417 2058690a53e12ce2e2c710305c3bb40eaabb3189 py3k
+72418 65d8db5beb2012219cbff1739e44717dec9144b6 legacy-trunk
+72419 2a0faca3deee5983a50de141126fd333c19bae12 legacy-trunk
+72421 77142985c6410a53504df77421b65cad1f6011e0 py3k
+72422 a7caf29d140633c453ca782782cf983072a545ff legacy-trunk
+72423 fac51a022bf50930403ef9a6f1facb2c984b0840 py3k
+72425 85b9df525e1070f638ae540d89c815e05d2a0e97 legacy-trunk
+72426 238cafcc2515f5db03d0a5168ebe0e76faf41a67 legacy-trunk
+72427 62be5ac989f4f86c04b2489fb94a79bfc653f856 py3k
+72428 a8190e881fdff2af63ce23cc9095040127560554 release30-maint
+72429 7a3bd179b180dcc1895d2897e2ae13b9f1445241 release26-maint
+72434 6c8b380db727fc221c22687e3bbd1df348a764cc legacy-trunk
+72435 e7fe217ce0157dd8144eaaf7f6332ed070251575 py3k
+72436 f8758353c6c202b6c56b6ee7c04d35d823a40fab release26-maint
+72437 570d3e58eea958b21a03f3884c27e742a0aaa029 release30-maint
+72438 0ef242f27d769977a26cf127f891f13e81eb246d py3k
+72439 d78037c1622500728f14c4c9f4644bc1068b9389 legacy-trunk
+72440 5502ff2fbdd63d27fea692adb002d126ed95ff3f release26-maint
+72441 c693003b15e21d0450f76e331330ee2c047da61f py3k
+72442 aac4055d066a03e394fd315274fc22b178d48ff4 release30-maint
+72443 4c3a84e54d0826816a903eb337cb300793d1d8d8 legacy-trunk
+72444 0d5e2a9286a2a4b853ece35133b2c33b374515a6 py3k
+72445 9143d20d8b2639d386c1ff68868a126635905624 legacy-trunk
+72446 198b68ae2c2df5373a077df2ea06aa701b238b6d py3k
+72447 f5f507b55d46579515e4e505ccdcc5322afd673d release30-maint
+72448 8f3da7134ca5f07a365cb02e65f8733b616dbd9b release26-maint
+72449 e56712e186f9df8c5b61edb04c6c047a1adfc188 release26-maint
+72450 2df2d1f09d585d72f42dcfb16da83859fa15f3c3 py3k
+72451 6a715727f19f755c3b4538860088c9ac7fab0c0e legacy-trunk
+72452 47b3feea4e1a51c2019d96f9a2b25521071ad527 release26-maint
+72453 c142e4538941e63dd0b247bc8fc37aa60f978f79 release30-maint
+72454 11ad6545809ac7bfc5191afc7c954517ad44ef66 legacy-trunk
+72455 b3b155583e055d39817ddb88fd795305258847df py3k
+72456 17f7774f74ddeb6b440be143995b05bce0dc89bf release26-maint
+72457 1cd1b21452d395266859f6c5edec7d66a8d2261b release30-maint
+72458 a015a298543ddeb18c27e87356d437bf0a2ee6b0 legacy-trunk
+72459 046bd2a41322faeada7d8fc7cc9dfdd3bfbb38d3 py3k
+72460 a36fa2ce61b1f3cb6846f572f5479e3f5a9f0940 release26-maint
+72461 1ecdca11eb9ec2864036344c85a9b566fb8fec39 legacy-trunk
+72462 2993f049e2c95333e6d72922246360e7427207f2 py3k
+72463 5420dae355f73c63501cf9a7265cea76db81d1be py3k
+72464 37497a7793b2ff73b081ac606c9fdb1352091df6 legacy-trunk
+72465 f1ff87b9b4373b2b4c8cd40a8220f3d274febbb7 py3k
+72466 238502460795bc60fe79734c01a513328d0a269d py3k
+72467 66ecc896b7e73a054b1663a8af192ad6f302c9e4 legacy-trunk
+72468 9c7bcb7e748c16247de494e721ba42e1e793e72f legacy-trunk
+72469 a6e6a57cccc29a4e55e93924dff844380e9ac2c9 legacy-trunk
+72470 5280f755b48a14b41a284a673a1b7fd7086ce36b py3k
+72471 694ee20c8c743beb69aa1714e5bf631d8df8bdc1 py3k
+72472 ba4e6a3af564ed70febe87c9f7653b5ec916cccd release30-maint
+72473 5ea546357226ddadf415de35acd27fd63c45e92a release30-maint
+72474 1712523f936c50ce50ca7bd7278ec3c7bd65afb0 legacy-trunk
+72475 5f21574797495d5606ba5890f3032d2372d405bd py3k
+72476 d4efc7338706bc4bae975467c5db229641072303 legacy-trunk
+72477 7a9e081ece4c3da1c460a4788f2ce89968d87ad9 py3k
+72478 cb7be63b91d85ea8aefee165e97fdfe4e873c6a8 py3k
+72479 0dae7fefed4405c842e4d1d32edf42c153b74625 legacy-trunk
+72480 8b9897d15cfc80cee6e80160fd54a2d3eda587a1 py3k
+72481 20869d978b8b4309a92b27ba79b673f8d86b11e4 release26-maint
+72482 b867ce375e98cd0d233d6745d681ff292dadd5f8 py3k
+72483 f4950096e7d7b477889640bbfabb0d44bc9e063d release30-maint
+72484 067a639d5f765922b3c4af8d4278f1f30021e7a0 py3k
+72485 0722f204d26e045beefedb960de0b9e557745f5f py3k
+72486 f917aae741d5e61fffde1e96db229aa4ab1b927d release30-maint
+72487 a171048daf76f425777080a3b69e22ffd0b06565 legacy-trunk
+72488 9ef683d41c9b22297bcc4b05c965d6fabc3e732b legacy-trunk
+72489 510ffc5db232589c7693a4eac8821d35fcfdbccf legacy-trunk
+72490 446a15a1bee8fd0694408cfc446c10a67d50d01f py3k
+72494 119e4323400d01c822eb1e0c75fa5ef0e6bcb615 legacy-trunk
+72495 73986a9ca1d63dfb5954f6989e8fce66c5b0e38f legacy-trunk
+72496 1d7948cb543000af3d1ff1460637aa636b543a88 py3k
+72497 ccfda14d155481f4e4870eeb2ae75ff4766230d8 legacy-trunk
+72498 d66603dd3b2d718abe1f7667737ce0b65b86a321 release26-maint
+72500 f9d9eec6be67017847fd7d7c277fc4d38baf720d legacy-trunk
+72501 9f713f605f60efd5f44b5bc5f1d37098c62096ce release26-maint
+72502 36fc0798417f14e6d6c3c43545717a985d49935b py3k
+72503 99dd29e24bde3d4ee5d069f0dc9664cac747c3c5 release30-maint
+72504 962b4ff76cca213457533c8ad76154bbac056b4d py3k
+72505 9207d429203a1c5a9652d839989a5440fb6e8c6e release30-maint
+72506 072a8a7ce973cdde464e8950f414db53205d8253 legacy-trunk
+72507 eb6eb49dbae9ec7dcf221e46b7e827e0d6d8c2c5 release26-maint
+72508 f90b3eec7c3278c5f90daaf388632c152b0bc1c6 legacy-trunk
+72509 5dd3b38a09778a6673cbfc6e08f7b86e514b2c1b legacy-trunk
+72510 b7920e1834228f5ef784bbb2a6fcd3242a2e1b95 legacy-trunk
+72511 afd62eb1692ef1acbabeb1c9a059f1cd630c918a py3k
+72512 30edd7f6101bd9a7f6da93f2bad0872398f3a797 legacy-trunk
+72513 327e23a6a61020ae0e1af685ce877357bbd7c641 py3k
+72514 261f594014c6225a3e95c651570c66eb68fa164a py3k
+72515 1b15a57e1f02f4bbe0135a25a8bde2115fa91e22 py3k
+72516 d2b176161abf0b366cefc6e376f5f42242d88c4a legacy-trunk
+72517 72a50394c2dde839b736cc094f0ded5241fbc96a legacy-trunk
+72518 aa41c8c96055006f073fbfb79519ae9809ead4a4 legacy-trunk
+72519 2b406538866d909176df2e99606aff4980d081e3 py3k
+72520 29b518f296de03e8e47278c9464254229f84a1a8 py3k
+72521 056aa769da891a10f2e7645dfd300266927b6630 py3k
+72522 5702d2dad0f9ec8ee0e75be0d2474a2384d6ab0b py3k
+72524 13117728d086da4259d45f39164d983546acdbcd py3k
+72525 a7c53fad13bc36d2202cb6112c00bf3cb8938cec legacy-trunk
+72526 3e84d60126b7e029c082d091d8cc49774c8d7997 legacy-trunk
+72528 fbcdae3e0ca1bec10f4dedd99b352c4b3bcbeff8 py3k
+72529 7c29bfbfd35244d04c4394585151c019783748c1 py3k
+72530 41c09e142bd006e209fff14490b513a177eff90b py3k
+72531 e91a77a482ebe4e1da95e5dd54d9de984c7920ad legacy-trunk
+72532 35e9803a2f4e45e44de98a5f39702b7eceb34022 release26-maint
+72533 050742bb60d5b17374a19d5aadd2cac012d31a07 py3k
+72534 9e67c2f999c9ccc63d7714e6720fb5be7153b37c release30-maint
+72535 c60cda3418b54f6508caf217cba36a5855566e8e legacy-trunk
+72536 8a04777b59cbd0ae853b1f6d062cf369bbd7e20c release26-maint
+72537 5224a258d5bb04e2079b3303b1d52d4fc3eef463 py3k
+72538 9a6f5e0531a63186304d2a2fc691b375f33e9fb7 release30-maint
+72539 1bec64b8dd176aa9536fcf51ca3fa655bf2aa9ea legacy-trunk
+72540 ac4894693411d417eea2e536dccb6c7851bc0f31 release26-maint
+72541 888daa003fc3ce358bff7d2f6e8e561778555954 py3k
+72542 86a3c9a9c6de41aab7b81ddaf846d69d34870798 release30-maint
+72543 17c53fa3789016710dca1dc22372cd2ce00890c2 legacy-trunk
+72544 8803ae0df3f3a556e4297f5166c1a676d7424842 release26-maint
+72545 241daa259af96c3e9217766d12f7d28d57b2b35e py3k
+72546 281d2e23bdb2d3fc25971ff907548f04f7c4eadf release30-maint
+72547 1927e8d791477957d19979a520e549e12e316904 legacy-trunk
+72548 4ae01a241650d5648f83de8f1470e3f75dbb9c70 release26-maint
+72549 f982289f93cfb8e3480b752ae2699baeb98de79e py3k
+72550 bdcd05a81acba0ee388be80e3526a7d4772d9e9c release30-maint
+72551 630e681100e08e492a85029cca87adcbb0d9a6c2 legacy-trunk
+72552 d65d7189de32cd3ea563e46355be14b2875d1eef legacy-trunk
+72553 c7471c911ad24ee3daf1e699a3274296ad21b447 py3k
+72554 ea2e425d1f600cb1bfa7eb5366403184361072a9 release26-maint
+72555 d02b0e707377d3ec661a693743cc4a4d82cd09f5 release30-maint
+72556 6e7c7f424436b67882b74b939c8cb0fe9edf2143 py3k
+72557 3416721480b21c5f962a36bc992211a72edb1b6f py3k
+72558 4ebcd014f3d06a071df614448e7759fbfa453164 legacy-trunk
+72559 0495bc47cd086a97bcdc88435e636062982ee68e py3k
+72560 4b41743f6527cbc8f3144fb8553a38329393b549 legacy-trunk
+72561 61c5bdb294f95185a9defce5a5d0f3b688566298 release26-maint
+72562 f20093719c0eff1056c8652bc2069e57bf4eed97 py3k
+72564 119f4232af46180a6486973c69bcab6ed432d140 legacy-trunk
+72565 9414c2b1923edea8d35cc7950c435e4df4632ae6 py3k
+72566 35c6d407d3c9ed40b023de0a43a8b8f3e5b52a3a release26-maint
+72567 e9edcaf425473d9f1aa63d843f55d8271d085e20 release30-maint
+72568 c2e2b47a87c147b44bb7c5ccc025d96b2755b787 py3k
+72569 8a7e84ae46c5dd856f3919a7e471fdc63ac8261b release30-maint
+72570 ccfca25878853e917cf3173d5d3c1a050496f2a1 legacy-trunk
+72571 22277dffc571cae7fbd81a5358543b41c0dcb941 legacy-trunk
+72572 8930548af734e026f26bd4c0a128a4dbf8f868c6 legacy-trunk
+72573 84616ebf2b4fc087b8876d08f54fd8da84a183a4 release26-maint
+72574 5d0f5c57135797e9785babdd40b1fc83ecd5f423 py3k
+72575 a26af85ab8950b5f2c71084e6fce1ced412c9d0a release30-maint
+72576 59cb9c074e097ac7c2b7eb44c22f271e3b2a8546 py3k
+72577 942f2d6d5c5cc3c6d2d2ec5c071b5b1849cc3393 legacy-trunk
+72578 bd80fb836b9e9fd858ad5bbd50a4ee7399b5d4bb release26-maint
+72579 54604688b3e97bd30f306e7d3a729cb0949425e1 py3k
+72580 1357303411487c59dc465badedb6ad7bfc5c1b7a release30-maint
+72581 258219646e3adb9dec200b4a783d37c278a8fd81 release30-maint
+72582 dfe5865e5f9809cc5e4baf7137505e641a96395c legacy-trunk
+72583 beac0b41cfb14fec10264813bdfea4a60a5d2992 legacy-trunk
+72584 efe12aa8ef19cd151a600d1b43b6143eb5309419 py3k
+72585 e8209ab496914e2838045246b009b49fc0d79bb2 legacy-trunk
+72586 15a8f4f2bc84845e239e30e5f11b6ae7842df7e1 release26-maint
+72587 924dbb7fc6c57fb061b8aa647521b559557da2a8 py3k
+72588 b6385703703e1cc781d35cdee48978c1e4ab09bf release30-maint
+72589 5fce14e1d7032c2cee3303e95b18b799c0e9d2e9 py3k
+72590 78fb7f8cd34922df1571e2ae905c64aa7ab65e2e py3k
+72591 c2c8d0ddf1877a9bae4e725b1e755f2c39e59caf release30-maint
+72592 d85bd499f3f4ece7a0d2c0703cb9a6da75889ef5 py3k
+72593 d22124c644ffa4b84503c866ac0444fe7cae80ba legacy-trunk
+72594 735ed178dfae525bec1949218ed284a8de712fc8 release26-maint
+72595 2c1d8f2d38398ff295a682b7ffd6598d6c508fdf py3k
+72596 0546805b3022a065f825170e3387ff9729ee46e8 release30-maint
+72597 6419828ef65ac4813cc105907972ed8407ac4380 legacy-trunk
+72598 4ebe6b260c55bbc03424f674df3afb35d61ac49e release26-maint
+72599 19e959626109f324583a7b2fc57a985baed247d8 py3k
+72600 2d6ff4a94953cf9435cccdd66d57de8198d0cbe0 release30-maint
+72601 bbb911f7c0c29f3cac27fb23f30dd2dd507945b2 legacy-trunk
+72602 f50edd4bb48f83b8828f8ede7c860a888a4ae9b3 release26-maint
+72603 688d94e86ca288dd45bad3496455f287db8d8361 py3k
+72604 35ba65f1cc8179635df060057e245342e7c200b3 release30-maint
+72605 347e59ea1a71da681dbfe6b4389e2175467236f5 legacy-trunk
+72606 31952452485bfa2b460a45cdd27a4e9bb6dc3218 release26-maint
+72607 e9a7aee8e80041e10d24613850df0d61fc8aed68 py3k
+72608 bd2f7e13fd73edfd04ed7f5cf5e30623104a5352 release30-maint
+72609 0231876f31043d188613802ab656ffefb42ba521 py3k
+72610 c51808269214d223080db64d5beadea61e45a119 legacy-trunk
+72611 91377da54ede9584aec04c19559bf6dcb132bac1 release26-maint
+72612 882d979545260ab56084f7a077aa5bbdeffdbf07 legacy-trunk
+72613 8f6e91237027422803adb7d5d9db890ff59394d7 release26-maint
+72614 323e1d848b5fffaf7217c755506818cac5d08cbb py3k
+72615 8c7cc16dc79c48ed75cb7fbf24a39fe0c583b317 release30-maint
+72616 a6c4cdfda9d6d507956d72c125ef0d27d46cb1ba legacy-trunk
+72618 bf699026458e49024a98a06f20c8620ce55ab390 legacy-trunk
+72619 ddee4d05fa17ea1da71cc1686ca361a6c491c7ec release26-maint
+72620 7814be6967b8ba088581fdca09e8e8a1c0966351 py3k
+72621 beca6d7ccc90771ecde99617575c8830663a888b release30-maint
+72622 3a5f6b6334993494696027b774ee98a83600be3a py3k
+72623 a69e7cc049bb5ec99e784e93996def14e28319f4 release30-maint
+72624 67baf2c17369f84f6e6c3859d9439102782928ed legacy-trunk
+72625 b05d479d1cb0adfaba89e85118afe1630aea9569 release26-maint
+72626 391db80d1af4cf26cbbb3a9c8b430601b75f5800 py3k
+72627 37f90f2f40349a8cf0effb6ae80d124ca2fd84b1 release30-maint
+72628 1d048c9f43dc66a02b62c87c722c98d850b8f952 py3k
+72629 aa77fd8626ba977710c7236686725df945776552 py3k
+72630 e962129665d804475b2bf116569a39e53f3f8d3b legacy-trunk
+72631 90a8102d7efbd6900dd13ab806f696b5cc7fae07 py3k
+72632 c72d4fce3000597dc125912305dfaa613801ddf2 release26-maint
+72633 6d6914177f60266b5da04473398d6c0754adb9ca py3k
+72634 91030927637674df5b132197c86ec0aa6f4ff4ea release30-maint
+72635 07b5f20d025a87f793b6a312f94707dfad71a8ab py3k
+72636 38e354609cf2d5662ffc88c05925cbb7512d2046 legacy-trunk
+72637 2a7ce13cea25083f9962eae1ba7509dfd750beee release26-maint
+72638 e69120be65c4527909d9a1f02910497f1d1407c2 py3k
+72639 0fcf2acde4736d2ade08f67f2de343f69aa9a728 release30-maint
+72640 e4d937f789a11314fe1bd2e8b0eadfc314b03b7d legacy-trunk
+72641 73d9b97354248a90a882f541ff721165c0811a44 release26-maint
+72642 3c4b1b4501c1b4d87232b4b4a87b45a51175d51b release26-maint
+72643 6be5854e5df7aabad62485a7317a791090c29147 py3k
+72644 7e3d7b5224b1eab6aead223e024198923a3c4e95 py3k
+72645 91ea8fcd457e5c14234b9688d896c441dc11010f legacy-trunk
+72646 ab30b237b60009b727f8cabc8cb23b54f92f08cc release30-maint
+72648 17d1946540d478719602ea54bb688faf0154c28e py3k
+72649 ee215649fae0608cc4e925f33a4928fdef1c2b40 py3k
+72654 fb01971949a55455020d4ea0370f24609d78df13 legacy-trunk
+72655 e45186edac919adbaa7649987cf33ea011cb31a8 legacy-trunk
+72656 f76f23af2295ae536858fcb5a435f45067323196 py3k
+72657 9d503707444e41878b5f6b833ce636427857576c py3k
+72658 b600e5103c63e23ebd6b869b698558f4e05b03e4 legacy-trunk
+72659 b33b4249b185852208cd85a11f9615885f8d6e63 py3k
+72660 e3dfcd1fe210d655e696ec81f3a48d46e0cfa559 py3k
+72661 a7c34f728f0e8ad139aaf535a526d9f01f0fc067 legacy-trunk
+72662 93ed68b999e757cee9828255336ae4d5dd2ceef1 legacy-trunk
+72663 88d965be861725dff215362b0b0028a0bdae990c release26-maint
+72664 d902f3494499608c2ec04346dc466f7210e461ec py3k
+72665 dd9158fb086783f48f91dc9169b42ac819e5743d py3k
+72666 9bb2a1371ddc400518f20da671e578677523431b py3k
+72667 e5f28876ae6c93bae9e870eb4d6813b447b5ae8d py3k
+72668 0d8db81a786c68acf1afe37a1ed8da77cd877773 py3k
+72669 c40f187af6ddbcf798a174a2c38cb64dc60718fe legacy-trunk
+72670 85fb4c229a9cec21c813546e2986662d6990e4e2 py3k
+72671 b4261da4ea50c376f40846fe5ee9626108b98f0a legacy-trunk
+72672 cd4a7827edb68a569d0dc6a5e62634ff6ae85f5b py3k
+72673 18b2f2cd0741f4a23d3d0e923afd9a466354b63b py3k
+72674 961094705370290cc5fd78389f8256010d9a1c31 py3k
+72675 90e2bfe4f60e7a25242d2b5b2817a88b92759865 legacy-trunk
+72676 34b60b736ad33d5483665e9d039d7b156c212283 legacy-trunk
+72677 2ca118caae716a7c76d9f0b8daef8a65e0173fda legacy-trunk
+72678 790992bedd61d1e7afc12fdcec85b64bfe0d5b9d legacy-trunk
+72679 8e8e87c1ecb7ec57de1503c1d4e0811997d72fc6 legacy-trunk
+72681 d514a8b7ae78ae2abac50d7e2337ef7fa6a2d2dd legacy-trunk
+72682 43fc45d3cb216b5e54865813e995eaaa19c17a9b release26-maint
+72683 ac660ea35f525da362c1bb60ff2c50c551a9c4d2 py3k
+72684 c3d4d93c89e257ee6ca0396ab17e8df3985d8a49 release30-maint
+72686 f1bf538786b7c9ebb5c21a517e0dcdebc89cd9fb legacy-trunk
+72687 988ca98d91962bfb02feba64aa61b043cb91c788 release26-maint
+72688 ca7847d3c45194f0b894cf4454b3ff3ebc4b599f py3k
+72689 1f8accd1f42ad004efbc2d25ca85f48e782ba70f legacy-trunk
+72690 ae006386ec393b2634f3a66ff634e02db769c532 legacy-trunk
+72691 f9f997c1fd813c7530a556af660c1677f7e7dff7 py3k
+72692 69567a05d5e65736dc304bb7957d99384dca39fb legacy-trunk
+72693 3aa6a863ff0691e58cdb2592b2c40522e99deb87 legacy-trunk
+72694 1cb804a2e03879697a2d4aa8992b0df42edbde68 legacy-trunk
+72695 a198e8d36ec3b57801cf29322e3635047d5e5ff9 py3k
+72696 a535960944441386e4447d80e87e1e64924e0321 legacy-trunk
+72697 83dd2b252a27646c8aa156c948b116b94f328296 py3k
+72698 d64d47ee54a18168fd92f2eb41338ec2c00be6ac legacy-trunk
+72699 dcda448ca66e8726b668f6ee406cb4e7ccf21bd3 legacy-trunk
+72700 0e3ace9f7516db4ff5df93b903f61dd28311f58c release26-maint
+72701 77cfef596d3350b59702df1d4532e3bd7102c593 py3k
+72702 901b4fffea1f80decab724e3432689fc75267f10 release30-maint
+72703 9b92d2b86baaef2114e08f880e5de947a9278021 legacy-trunk
+72704 d2732ea99ba08883f58cc2b4ccb5b69ac763c520 py3k
+72705 e8f1a007771aa90b8f092c9512032c4ef0215050 py3k
+72706 b22b2daaeb44f39e9b3274ccf09a11e9de3db004 py3k
+72707 d841f97243b574ad8533e69408790988e2b6afc0 py3k
+72708 b52b92f31fa889c1a548aeee1bcf0c76ad8aea3d legacy-trunk
+72709 f43fc1193c2ab38847569dea59d670090e914d59 py3k
+72710 e9c08ffa9895135a8e1d9321037a6153a69502e1 legacy-trunk
+72711 10ca11e598e693cf3726824cc70823cb0b0682c6 py3k
+72712 c5b982af209d7bc38b36c902d78ab3cc90b22b0e legacy-trunk
+72713 fe8d3fd66d264ec20923af9dbd88cf6fd9bac708 legacy-trunk
+72714 b6b454b06a7b35ca11a0a26516786b6b539df71e release26-maint
+72715 fc7935de8e8ada8c6c94d353968e5a75abd61515 py3k
+72716 d40729755edfcc272eecad3f0190023488fa38d8 release30-maint
+72717 35bce80a25f89986aebca14782f24f355b954757 release30-maint
+72718 99b400861543ea442167cf96f92e2c8fc2ea9a42 legacy-trunk
+72719 adbc662ff4c1d28abbd0521db572a0fc1ba17f5e py3k
+72720 0e8c8b0d8669e49d581b58420b3e28cabcd703c4 release30-maint
+72721 f2538183d2621fa009ae2cdd72d2811b333e91d5 legacy-trunk
+72722 9d81e2c438db971b5cb09a905eeb1af3a16a8fe8 release26-maint
+72723 e2217361eb37a7bc84f17126edc8f6efad82c0ed py3k
+72724 108e90b8923ea2ea95ce0cb1888cbec9d1326e5e release26-maint
+72725 806ef3a1f858d1426bdc30b493d249dd9a6b4c29 py3k
+72726 3678b2d360c6985489d50611969b3bc815611088 release30-maint
+72727 df3826472e3bf91cded7b940ed2c5b8e86db29ab legacy-trunk
+72728 f0b09d0539c099574f8542595bd19190cdaeb09a release26-maint
+72729 56adf864f3808dd228bca84a9a989df96e61df61 py3k
+72730 8ffeaf6499708ed6f76cb034cda38c223f402955 legacy-trunk
+72731 c009b2b3481f9cfc5ed62199a59e00444bc3cf2d release26-maint
+72732 87830461ab42972c81f36e26e90adb6adee92d4e py3k
+72733 76a9f9cb438f5093f3eb061ad6bcd3bdcaf09c63 release30-maint
+72734 7116de3dbe983a6df39527c0eb22b501c64c30e7 release30-maint
+72735 f65de36f185c5cd503fd6024d31475cfa8779f28 py3k
+72736 178f70fc478d796b6a9a9ee27c8ccca332131ce9 legacy-trunk
+72737 3bfdb8d72560fcfb2dc7a0a23959344a0416e8a9 release26-maint
+72738 fb59a5264ae25c95088b55b347688afebba387d0 py3k
+72739 81c57900a1825a803a8fd8ba053f06b8ee38bd28 release30-maint
+72740 fbb33390b2549b2f4e05095c66e8b1e887f17bfc py3k
+72741 904a1bd35e00892b54c870f44ee22a9e5ff02540 py3k
+72742 d143eb624cf5e2fbfb9c2d3fbe2ff0214ca31c14 py3k
+72743 74b6748b63f5fcab1f30db77fc6fd04563a9fb22 py3k
+72744 d0994a42b5975b260e75b80130487a8a7c1a6510 py3k
+72745 41a692627eeb3c5338047f147a19cf7697aafdef legacy-trunk
+72746 7cb0a4547f0a0f832bf66e736c3e8eb6a32c7e3e legacy-trunk
+72747 0ffc95587d7c45603405abbc8970451c9f15bc48 release26-maint
+72748 17d078c5d65b52299f11bcc86f5406a954a4eb95 py3k
+72750 58d3c454bc372438b7a281656b7367fbaa168d63 legacy-trunk
+72751 f935b95980398d0d1af425f121febe11fcdbaaea py3k
+72755 a7ad1696866b4dd9692f1d4511b8d0679cbcc07f release30-maint
+72757 2b7cb42dde1167f05775705884598c4f0696bf0f py3k
+72758 e3bb6b62bd0f5075d57c9e31c14e2bf4bf61b635 legacy-trunk
+72759 d473fba4ec6757b085403824af1d0c6f90476173 release26-maint
+72760 94d283d3d00bf74b71750740a29d5fc344610912 py3k
+72761 6a359fd246693f49af640b0c3a23d6651ac7515e release26-maint
+72762 170ddf960fddd8d9392057941899795f56874729 release30-maint
+72763 71ec4fc683af92634bc309708390ba918cd60938 release30-maint
+72764 143aecc80b6b6d5b034356c9d7ad6f00f25fc23d legacy-trunk
+72765 2d06a32a12e3706fe0b5d31c065ca1412490e338 release26-maint
+72766 737b3d4acbb9fb7017ae42fe8c063f7a2dfd9ef4 py3k
+72767 68dce65506d9faab026d3d4d6df95588b3e892d1 release30-maint
+72768 8d261b76da46bf94b60ef1f30e1230eeaf1318a2 legacy-trunk
+72769 cee80d06f7ce9c4638adfb1aef5b8ce1c096b8df release26-maint
+72770 9a07e9d6093ada42e11d48d027c60969decb71ce py3k
+72771 7ff7bef32911694431c1770b5fb7d65974a5b5f5 release30-maint
+72772 00ebbf1ce9360268029a2af2799f6ba13eee6f2e py3k
+72773 ae20f1ebec21ccea38938a6bf6815e00b0b2ce53 release30-maint
+72774 dacad42836dd600c7894c0f48aa50d02cf257981 legacy-trunk
+72775 c136887db7eff4cb01fc3e1e34dc5e99d865b7c9 release26-maint
+72776 d8350d044cf228cd6f9f7cdb767231d312331411 legacy-trunk
+72777 6395347c027626ad3fd7b5d350779e95872512e8 legacy-trunk
+72778 945c657447d21e6678d845650c09e1cefdd1c224 py3k
+72779 8f17363b93e6ed1c4a7cb26f1b663d22da291f9f py3k
+72781 883ace7ea4466640ea1e7f6e6341eb6adee95632 legacy-trunk
+72782 2901b13fbd7e62e4f6b228bf8ca2a2b83842c5d9 release26-maint
+72783 9394a82d8de1695f2e198b4ca033623097d8c4f5 py3k
+72784 69e9434e450adebdca2a79162ef4351322974725 release30-maint
+72785 f7650a0e90adb5f6c84ff42a10c4a21dbc4a18b7 py3k
+72786 74bdb0e5212bdf2216d514a377eb64685911ef9a legacy-trunk
+72787 76c4414d10a6c1c162e4545a3c0e5c4c52181163 legacy-trunk
+72788 6fd009ec224a739f8fd1ddcc1559ac10faf50c41 py3k
+72789 ab23ff2047aa0d8a9a95d64744d686e201db117a legacy-trunk
+72790 c7fd741c72ebebdf4c2a47c9c7ed1f0a362e5579 py3k
+72791 056283a5c5da002edda1fb6ff6db0e06ac73e5fe legacy-trunk
+72792 f275d6a0a1d177973e4140aba03119406c8f11e9 legacy-trunk
+72793 6fab8bd15d710d85177ff7f1be2a83f5bc028cf3 py3k
+72794 a52cecabffd4c328001043e594b831c34ba444ce legacy-trunk
+72795 bddf11e6220002a92f6560070b97857dedb6834c py3k
+72796 4ceeefb8555e639aa9f887e41c14ec0f21c2c6bf legacy-trunk
+72797 ad77226111b2630adb3655b3d5e163140b17262b release26-maint
+72798 083ba24905ad9197828f24a561fddf631ccd0fb5 release30-maint
+72799 4fa4ca4503c8df61e79be04d350bad3969286f6f legacy-trunk
+72800 7e2a6c1dc9d22363f91b92caea4f3dd58bdce960 py3k
+72801 6e40add3ee02a7aecc30761ea857649ee97837d0 legacy-trunk
+72802 023a3428f1aef68d47fac721d2a98540b9879e82 legacy-trunk
+72803 670fa0c0ff9af2e6711ffdf7de3c807261ade844 py3k
+72804 8921304b5f922a415bdb7a0dd24b0b9702a86dc1 release30-maint
+72805 d2ccd89e8e6b9513d2e8c649ed66e92a8b80269b legacy-trunk
+72806 379e63bcbd0448f6a20671ec69e3824dd4ef8aeb py3k
+72807 93f4a9ad26f68d33bf81b82a0934f64118fc14bf release26-maint
+72808 b3326fe632e5a793e196d914ed380c2a6b546060 release26-maint
+72809 2d6fff9fe8ab736ff21a58aaf9e6fe59be0a8d4c py3k
+72810 4501b638fc3f2940d32beb6af6615fb1b7778fa7 py3k
+72811 9d6457f3a3edf45a0e2c949efb0fd48df5365edc release30-maint
+72812 eb9b1ac3d9d87046fefce5668cf30a19ae23e1d8 legacy-trunk
+72813 cc0557356014bd5ebd7f2a751d73e9f69c1254eb legacy-trunk
+72814 d61ab044fdf4d180b54e418d749971b841e010ea py3k
+72815 604444502ea0277f38803584205e5d98f527dc1d release30-maint
+72816 2c35b816ac0daadab9c0c0820aeb61da41d95075 release26-maint
+72817 1b62bffd2ef2e0d5fe2bfa428cce8bd68683e9c2 legacy-trunk
+72818 42dbbee66c322ac64590f51c24d6cf8d99b2c446 release26-maint
+72819 4fbce6d3fe861de7cd5a760c95074b19c8b7bbfc py3k
+72820 fae3a77d203219197c0c6e92c95964ec8b4fd0ad legacy-trunk
+72821 b66dafb406494335e8b33ee5b124c520069b3fde py3k
+72822 6074fb4116216d123e7aee96786866853c0b1e68 legacy-trunk
+72823 c83a172ee931e579c372c8b9690a2f0f707f2a22 legacy-trunk
+72824 dfe88d202180edd9ff59b453f5bfee13df6247fe legacy-trunk
+72825 aab117e6bb16c27a2b101a58a0f2ee71b3c27aa0 release26-maint
+72826 c40807473a379d41b3b35fb3a99069648660abbf legacy-trunk
+72827 840a09de68c3d1458ddfe5492416fe5e5b15a732 legacy-trunk
+72828 f227ff34e33d48f2341e53dd15399b9c77ca992e legacy-trunk
+72829 354045bb73261589bde353d173f02cb94348260e py3k
+72830 73dc72849853d14a15607a4bbdc3f19cacd48b6d legacy-trunk
+72831 dc47f7c65d308ad94a078e8566f31b1349008052 py3k
+72832 6364e911e4cb361fed5449ba429ccab8bf735865 py3k
+72833 259c8655c592303a54e027b0128d65b3561d7797 legacy-trunk
+72835 987bb734e376c187d81b510f4972c5633d995abc legacy-trunk
+72836 e5dd2429acb33eaa0dbf6c19aabf3ab684785f3e py3k
+72837 8bed6e6bb9842b1d362d4efaf026b21475e8ee9b release26-maint
+72838 d0ea78e924a691aa488d185eff47083f2101840f legacy-trunk
+72839 04a4b7df2d4d30f6916e3f0f6f30831c31d52ddb legacy-trunk
+72840 c8e1d7f2252c4f0c4884a2457099d5926f3c40d2 release26-maint
+72841 f2454d71298acd59f3ca249b054efc6e5d0aae84 py3k
+72842 ab1b5ac344d798c814236b440699e3095b75428c release30-maint
+72843 eb20c95006c763c3fa2ec9c77a5ca9f2277dfa7f release30-maint
+72844 253ecae6478a4c5795abde5f8b952191a3ad8717 py3k
+72845 435bca0781e3dbb80656433669af9843c154fc4a release30-maint
+72848 73f62731b1e6e4e9d45cc7373b0bc64da87abfd1 legacy-trunk
+72849 d2d028f65c7c6214f4b3ed5fdae27c40230171cb release26-maint
+72850 2bcac08cfc6dbd966d6699c744e028fd5eb8948f py3k
+72851 e96573e7c5187de8a7f8341d0695f32c0a5b4f51 release30-maint
+72852 c08bbb84062e0155d452c8d70bf337755791c8cc legacy-trunk
+72853 3e7bc74934a1c707666248772834d81e3b6828a6 release26-maint
+72854 d5c582f46bc94c8c47025012a0e139fe16b09060 py3k
+72855 7cc0fb0768471a84c6958455f7a08f56c34e487c legacy-trunk
+72856 1b689d57888d55e5114bf4b463026f01db63f1cb py3k
+72857 e06454c2cc0bffaecb421e832fc1ba8835b0507b py3k
+72858 b1e351cc59b7475a26d0a9e11719ea44d009dc9c release26-maint
+72859 54bbfd41be668dfc23c083510211accda7e54133 legacy-trunk
+72860 9fd1d54f617cf0f7dc045083696b37b511c92057 release26-maint
+72861 ddc9a16fbea8db9afda52d85f57af0afd353de4e py3k
+72862 e78e0bdbbac481768da0258acc18e734bc4d2a1e py3k
+72863 0a78effb5e0b52043f2b478b52cb958e93841008 py3k
+72864 bf284308856717db04d9de5dfa442c1fb40f9dbe py3k
+72865 f9d2608e24e8a37b4b7fcfb7e682e460df1e67bc py3k
+72866 997ef68bfa151790d7e183fbce7f41a9190296d4 py3k
+72868 33a7cb20f558ca53c50810f5410ab9cd99fc45ca py3k
+72869 252d81a4f69d2ecb64aaf9e2cca32f816157d226 py3k
+72870 846277a422491045583d175c4efd890e4e52b471 py3k
+72871 150986ab3db284cfd38d67a1ace2f04c2780bae4 legacy-trunk
+72872 b278b4bdff1e22395c50eda4f3e4786755950769 legacy-trunk
+72873 e17c18a6caec475dc638e9146538e1c74ee804f2 release26-maint
+72874 89631f627810e8d6221e77bfccd5350556eefd99 py3k
+72875 bd2fb1be130ef4fbf36b87e8b4906f84e0516031 release30-maint
+72876 dba767bc3155fd2ba43687ffcd746e9e96dbbcfc legacy-trunk
+72877 f99f3d8c51d58fbf0f4c0d3118e356daeeb3e1eb release30-maint
+72878 d9ce3e74067655698ba067795e6aa79bcd7a6551 legacy-trunk
+72879 dddf424bd66968c0595d42ef444fc5f64d5be13d legacy-trunk
+72880 e7b4a443f764aefbde1f1abf34afaddefc62cdf3 legacy-trunk
+72881 61bbe5c9051bfef2c39ac8239b74150125e2770c py3k
+72882 a580a2ee312843867e46d24904d3f2fdb9909318 legacy-trunk
+72883 625a006a253b8f1641de880671456d926a8431f7 release26-maint
+72884 98978e4fd60fa1cc762149588127c39fa6f944e8 py3k
+72885 833e46c1499bd7812a13a366366d59c1e749c811 py3k
+72886 48b75eb02434ca631468e1137fbaadc4916d190c release26-maint
+72887 3428acd31e456425706ced8cbdedc7a148109584 legacy-trunk
+72888 1e2c3e7fe63cf47b42da8d94c73291c8327af714 release26-maint
+72889 3d305dece5674dc6dd3429518d3b5930dc219ee0 py3k
+72890 5dc33f467ff46f2f6307da5e3a2610c4ccb7fb76 legacy-trunk
+72891 9c744dfcf4de765e7723b755bf92b537b0d0d1e7 legacy-trunk
+72892 b5e000d03b2c4f926fc82bbd1a04efc9ae403adb py3k
+72893 3be37ec43c1bb385fa5bfd60287514cec6171b43 legacy-trunk
+72894 e67b1d071ed61f5fdfb8036cf70a3ba349d0e2a0 release26-maint
+72895 538f4e774c18e27f65ec2211a4662d3ce14f4d9d py3k
+72896 1f4375619c9c3d9c2247547327c5c74797881b17 release30-maint
+72897 b05f84ad8ecb0c3e0d9eff1e3b07a10593068e1c release26-maint
+72898 f8cadfb4a1a237383e2641c6561882aa3e70bdb1 legacy-trunk
+72899 8024175e3cc6999b1ab6aa9fa2b062312fc0d92f py3k
+72900 bfe4028593e1118e15d7ace5cc30f8ba1567ae00 legacy-trunk
+72901 04688aa564c85ef2bb650ecb45d92e7a6607503e py3k
+72902 565413ee9c1b36d67ff63b6ff6d8f115f6fe48ba py3k
+72903 d75079de2e46e400b228ee998fe39b8f3cca13ea legacy-trunk
+72904 7391d88b3d82cd1827a8454811650435c726591b py3k
+72905 b9c78fb6d71dbd1662b12dc15e4612d1d06eefa0 legacy-trunk
+72906 eb0cd83c84abff347447b6adcbf153530e961121 py3k
+72907 0c617b7a727ae0aaaac9ede6b292b61f1ea53545 legacy-trunk
+72908 db212869d8146cdab90acea00e9feb48ec20316e py3k
+72909 c74967feb021aa7a98f92aa6faf24f0d3b531d21 legacy-trunk
+72910 5ab2f6ca65aafa008b765ec146f7e45bb7d28d09 py3k
+72912 145376df3ad728f7052fdd8b6eba600a8317fece legacy-trunk
+72913 f29be710c174d1c3437771d16986519187029cce py3k
+72918 39d3a75fa82184102f34685d5b639c8df7a14e1e py3k
+72919 5aea603b230893e2ca8787163d4357d1093bc2ac py3k
+72920 0d7461c063e79edbbbbc381abb2dc71864877f28 legacy-trunk
+72921 1480fa3fcab4011451e599ed62f71253656b200d legacy-trunk
+72922 5dd1f6b149391fa7fc3a1fafd33be092ff62e54c py3k
+72923 dadd8970b303756bc7376f635163cb4449476e75 legacy-trunk
+72924 16759f62eb226cd701e01ca1d75a50f46b57b7b7 legacy-trunk
+72925 287ce30d08b5440846e613690eea5fed94295d4c py3k
+72926 699da6c467dc38c77b325ac120dbdf0543f2d2d6 py3k
+72927 355404ea1143fea793cf5298bda569fd41cb1b4f py3k
+72928 4d67452922f93fe7be4dea91190b85e8b7b65282 py3k
+72929 84a60e710553083cb44a6d8911114d1590a94e99 py3k
+72930 aac26de8b5d0e4d6e1f2a6154fc2e9871900dbd2 legacy-trunk
+72931 d3daad0e7f6f5787cf7fec84a6cd0260b1e239c3 release26-maint
+72932 cdfd017cee908c8fc35391fdfae686167d98fee1 legacy-trunk
+72933 3b612569d5361f717c18391e80f2e6a0e979bbf7 release26-maint
+72934 983d25691b68d80f885c917a4deaae9aa4247d26 py3k
+72935 a27a739cef7f879abe8ad1263f992b83a5ac9d96 release26-maint
+72936 0258351dfa604492f45a1778572f47db0a43c26d release26-maint
+72937 acc07866b23303fdee65e8df0cb4dea3754571ce release26-maint
+72938 34257a773ec0dcd369dbb33a2d6f1367e433721d release26-maint
+72939 65646382e4e03de9ef15be8c8a05758633b7a90d release26-maint
+72940 ba305fe8e83120347449fb3594445102ebebe925 legacy-trunk
+72941 1ccb6d6257173053c31f861b83fbb23829bc2670 py3k
+72942 9012ff7d75a2165d1be81f1621fe96a2c1fb86fc py3k
+72943 2721be7be3657a427e18faf8b8050f76519c7253 py3k
+72945 29e5c0165e13516aa29733caf9063ad005cf2048 py3k
+72946 88305d739ae526e3c79a85b28ba2a9edceb260ae legacy-trunk
+72947 d71fa6c468cc8b1d87c126c4b4c6da114c4009ee py3k
+72948 fdf3eb7822e456bd52145d95effc356397698a10 py3k
+72949 a4dd9217ea131cf1f3765b40e443ba8d63c5c215 py3k
+72952 47dd290d2d745b4436466d5c9dd4a923b4fc6e8c py3k
+72953 0e76102f478b5775d44df9a650e8a1e96d7c4c37 py3k
+72954 f13bcd922f76029cd5627e87ec731c92f98319fe release30-maint
+72955 3f79ecab5e52974249049e4acc7004f9fd552e3a release26-maint
+72956 23a373c8ec1b388b703761ff492cd4cee761482b legacy-trunk
+72957 ba6376dff6c4f8115b29bc4733da91326cbcba5c legacy-trunk
+72958 7b4b921f3335677364135130d9de50def4f17bdc legacy-trunk
+72959 6ab93470011bb94fdd5ef0e741a56708ee4c0f0b py3k
+72960 4860f7493b91479f643e5a786537bf57978086c8 py3k
+72961 1c078bbca233d76106482b374f0bec2406664c82 py3k
+72962 1d096d1b98fd13e027edb5f9bbb0c6777c21f741 py3k
+72963 22fd967518eec031f3bc7c77b74a4278ec7ec9f4 py3k
+72964 b61e6ad5ae70e9f52c464e79708ce41241960656 py3k
+72965 8cb349873cdae2bd78dba3c79382238cd4b9526c py3k
+72966 154ca377f53c7b50e5c67921c4425c88a6e43339 legacy-trunk
+72967 9b8b60bc0f5b73182f3c6660bfaf92ad373ebd67 release26-maint
+72968 af4fd23654ceb3f419ece6f03a9fb9d56dd04e76 py3k
+72969 4c77f9e1a19dce8196fd8103c2ac0d5b5ebfe9cb py3k
+72970 837adb76a0e1ac0bc2147d207da537dd19d75c27 release30-maint
+72971 13921f52684830a3b814a69f99811b059dc8ca09 legacy-trunk
+72972 e6e3a0e91beac3d127b5ef21f14f004b4be75132 legacy-trunk
+72973 821f7d42bf7422a0fde683be7beabbf7867b2c60 legacy-trunk
+72974 fc4e2443f50964e964626c769cad308c3fe376c4 release26-maint
+72975 603870228dac54e1a96c49de3d5bc075e8209945 py3k
+72976 60d49b3fd3bfd2b76344306a10b719052fc2a058 release26-maint
+72977 1029d9aad491c8f826c9667781d1262ea3cf5f2d py3k
+72978 1d3b1be6a8b26bf2499d2ce6447d246c1d437ede release30-maint
+72979 70fb848870acd414acc57c18f4a85ef49dc37dbe legacy-trunk
+72980 a6b73d80fbe275a9f63a7d7fce7c00770f396ec8 py3k
+72981 11a54dabfb1cd5d3378c43fc7984db5a006dea52 legacy-trunk
+72982 8b299652b1e85f7d12e84ea1f30b829bf0a21593 release26-maint
+72983 9ddfa6e05fb0da119943421a12b9dc2890a85390 py3k
+72984 ac0b85f68297bd30f1e50e29e7abebbd356ad7f6 py3k
+72985 5b2100e46d3b48a02f04c0ddb1af74852d3e24a4 release30-maint
+72986 6056c96c2d32755870a685de9b711f174ac28141 legacy-trunk
+72987 ed0a9d68402269a892c041771236b4ff6c427689 release26-maint
+72988 9967379270a09413a35b8eb2fb9fb24bd1e84873 py3k
+72989 ce99e8e22b1eac096073fd37175952757e6c0539 release30-maint
+72990 b0040494b4a69aac96ca9169d2c0fe75c824b168 py3k
+72991 f55d8ded2d05e5acecbf61ac43d239499aab8783 release30-maint
+72992 b726ffd4952450d22bf98b94f5d5f122c575e578 legacy-trunk
+72993 e90b067d83f25164ab64e9565f92e473a1daeaa4 release26-maint
+72995 3eb522dc3337dea21f274ed3d9fb3f82c3184eaf py3k
+72996 4035383394ecfaa6a7250cfe86d6b2b5d41823cb py3k
+72997 bc2516810cc4113c10d82f2837ca3cc56d715f00 py3k
+72998 a0a25deecdb236e3551a7b9766cccaceaa219043 py3k
+72999 618e46a69f278f0420369dadd8b7c495aa1151c8 py3k
+73000 2d3c2cf1b51e34cc8772d71bd719623078321cc1 py3k
+73001 88bd8760b342ec87b7abf0850483137423965bac legacy-trunk
+73002 260c8ed3f5df97a6535f745fd16e48d6f6a920bf legacy-trunk
+73004 1d8f24bf439963360fcc1368932efb9c179f04e8 legacy-trunk
+73005 f3c871bdea571d6d69cd8d4375c18656fc744fc0 py3k
+73006 d75ab16413da42c147bea8a2475ec4375cb4f5aa legacy-trunk
+73008 1fa137942085dfd1f213caf5dc000983e78b4f6c legacy-trunk
+73009 77b9124f1c8c14d8e76c28b9adba1da7aed7d2c8 release26-maint
+73010 d39c190316e769d9cfd60505f064cd082b56bfe6 py3k
+73011 49c0b0ca5113b9338318613f6812216609ebe4cb release30-maint
+73012 c5d349582e9cae7b03f5416967eb8fe761d3547c release26-maint
+73013 b67abd51b2704c0acbb0f72842e9d95322e6e01a release30-maint
+73014 11de35da281c1755ee9739a1f8aa9c7fd48ec70c py3k
+73015 28d64192ab5a2cf72a9bd6bd9139007518cdc247 py3k
+73016 9c17e3669336aca70ee5b9f895cdc6ae6e26a881 legacy-trunk
+73017 76f1be9d28182bf49b31e2846eda2d1e5216152e release26-maint
+73018 134d12c2e74500e8fa2bdbb4bf5008d560bf5bc1 py3k
+73019 2356e985ece835f1bde3fc87e42d0982c36d6edc release30-maint
+73020 ec5d228a83efca21f57ad755e1f043fdb04d73fa py3k
+73021 a5a89c60d32e4eeff4669068e443aba506da2cbe py3k
+73022 64750065ecd4d1c293be122a2ee15046114854c5 legacy-trunk
+73023 25a3155dac76c5163974c9eaf9c6b761bccd565b release26-maint
+73024 9a4ce1e71ad8165162109fbd1b276899568893b2 py3k
+73025 4ed2ee0b2290a0646ad819fd8cb8e8133cf28e56 release30-maint
+73026 e4745838f655b5f951b354ea13b47090b9f4dba6 legacy-trunk
+73027 7a13471f4e9bd1dce52caf855562fd78db07a6cd legacy-trunk
+73028 146a39b2584585f7b924aaee90fff1da4b7989c9 py3k
+73029 c8fe303ceda45158c71fe79dc4e93a7ade612565 legacy-trunk
+73030 6e2a8bdaa540208cd3906be88dd3b7853244037a release30-maint
+73031 b2ecd2bdf1952b914185d83f8cdb3017add14a3c legacy-trunk
+73032 6d4c47fec449dabd5ff23107bef8e23cac7d62df py3k
+73035 1a521c06a70db516a25d62bfdced277161e16309 py3k
+73042 6d6b4d3781f27584c505226c08bbafa2c22d45e6 legacy-trunk
+73043 69cd80f8e133a2402203ff63d62abd5b1b3a1fa0 py3k
+73044 f5d3ff03dd5bcdd550f1a2f5da7220522d251692 py3k
+73045 5bb5e93435b04e118110800e87df65057765f58c legacy-trunk
+73046 431ca5399a24486c0ff8c8d45698403f4b7d7a7b legacy-trunk
+73047 c62b652251d899c1387d554685e67fd7aba6b81e legacy-trunk
+73048 8d2f39c21e9e52f2c503c4dfd085df1a2b64cb10 legacy-trunk
+73049 b01aeff72b652a7f199871619bd4c03b1565b381 legacy-trunk
+73053 553c8151c9c6e025a672d53fbc41464f0a36cbee tk_and_idle_maintenance
+73054 495cf3c25eb143b022f6f29938952039e999b650 py3k
+73055 23462b38171d69ecfa09cb051ea6553b5d2454fd tk_and_idle_maintenance
+73056 4353fd0843cb31b356adc50f93d220e2e7255ef2 py3k
+73057 3ffba6ad319c2eaef52ea9422040f58067fd1f47 py3k
+73058 ca9be8fc025dc2773cdc43c5fe2458bc2643cc95 py3k
+73060 e475cc71f188a4a59fb410bb5f294aa3908ed334 legacy-trunk
+73061 9162cdf34dfbf4562bcaeb59db3881546671b41f py3k
+73062 b404307922c6e8c508dd07469190b8f5a1501d5f py3k
+73063 49485f98a3083bc1c18246d262ae557474dbb2d4 py3k
+73064 a253fea85af15ca99e033a0054a3d19e69d9249a legacy-trunk
+73065 fa2f917906e73b7d1dd6784dca6ffd95a1b82ff9 legacy-trunk
+73066 4e96d7daf79f4c5b4462ef7bf4d4f6ee72783eab py3k
+73067 114354b1e0e57d8dc64297e700076b7620669180 release26-maint
+73068 756621819f5a51f4146ac7c5f8e004d8fdd3bad8 legacy-trunk
+73069 5dec7247b2496eb85c8ae09bba9992e908f82609 legacy-trunk
+73070 bf0bd6ea1c72e550e8094bb9530d1a2f61e06a87 py3k
+73071 1b43e6f2d328a971f8094db32ce9895b4fbeb741 legacy-trunk
+73072 d74b8edd7a8cf0406047f8fff0a1529341535b89 legacy-trunk
+73073 ef0785cfa6af51b62c476f2b97aab71f53a3a116 legacy-trunk
+73074 bbb0b4f8b5e11af516767a8f90250e742129b13f legacy-trunk
+73075 81baf76d079773d6747ce5083bbdf72e74404aff py3k
+73076 519f80b1f5e3a643d43eec1517efd0b26c05a2e7 legacy-trunk
+73077 070530e9f18f2984224f53742d5448d8b4bd1a90 legacy-trunk
+73078 c3a26556dd14ad2b594817ac49bd69ffe19d2401 release26-maint
+73079 f14b505d39f4ae8a9b550923e01782f2d95670a7 py3k
+73080 f51eaaed6c71a60d613ffbcc7a1f35e10b7a8c99 tk_and_idle_maintenance
+73081 2aff700e0ca918c0d3b4abe676fb188f9cad16eb release30-maint
+73082 a6a74b9a7cd372b0323816a3612577bb40768def tk_and_idle_maintenance
+73083 5db0556ed12235bbfe1dea34fe4fcd146be5188c legacy-trunk
+73084 7b772ed536c769ce9ce021266b55c607926debe6 py3k
+73085 75e12c5e4eafba1a34b24f07e7e03b64d6431c73 tk_and_idle_maintenance
+73086 52d258eb0176faf41df6673bde52659fca2ac5be py3k
+73087 b4dd4283ff820dda23dfd14c77e63e05d3c69382 tk_and_idle_maintenance
+73088 1e2c0371ce5737da46db0b47b1ebff98bac31211 py3k
+73089 f517f2e4fb3bb56cb674997d9cd4ca88e1ead730 legacy-trunk
+73090 50f31308b50aed6514f650df24ad421729aa9d63 tk_and_idle_maintenance
+73094 4211810dc79ce7ad7e194e70a890735bef3d1d85 tk_and_idle_maintenance
+73095 57a2d2713f1953a0ca5428927e1bc47cd266c64c tk_and_idle_maintenance
+73097 528c093ab986d207f84ef690a757c48a5f47034c tk_and_idle_maintenance
+73098 757a7c0f679e3baf395e0695a9856a2e279a508b tk_and_idle_maintenance
+73101 600169ae5681d3a958a9906eb61aaa7ccdfabe2d legacy-trunk
+73102 fb79ee4577542809a07818e42058fbae7bf2fc37 py3k
+73103 7c4440538abb242f95b04436438d90ee8327d25c py3k
+73104 8567df3a43b61230f0e80f8c0f0e0974f795e5c0 release26-maint
+73105 c051ba617f0461990acae22d016b637d207ff4f4 release30-maint
+73106 6846f95f8e077a9ad45875e3aff947812fcba9c0 py3k
+73107 18b3d5b37d83fbe626a15fa323255832c29b550d py3k
+73108 c67854f1cf79315e72488401b1224a5dd8176a78 py3k
+73109 4427859d817a72c332c4e080878864ab7f5d6f49 legacy-trunk
+73110 8c130671c8425327fbebcaf360e0291987b3eb11 py3k
+73111 938cc16e7f8debd9e79349f1ca655e66952fe0c9 py3k
+73112 3522c2b0d51d47de3cf6d65d9a51f60d7094fbca tk_and_idle_maintenance
+73113 bbf8f25eb377b2015212b20328c5a2d9c59733c5 tk_and_idle_maintenance
+73114 c37ae562ef822dd5560aff14331d28b095cbd013 legacy-trunk
+73115 1dfcc53e836a0e6029042b1cd1c14a3e8e965486 py3k
+73116 d0e96079b6aca9a9b5ba59b48cf0fa72feee0437 py3k
+73117 a8d9cc932675617a5405c5d0aaaa9a3455618522 py3k
+73118 52295ebcca31244d01d45f60f27e647767bce0d2 release26-maint
+73119 a563bcf1a62d2f69c48d29b3947f45e555bc5316 release26-maint
+73120 e25fc377670470223d6607dcaab23349bbd7d1c0 release30-maint
+73121 d5071d9f7408bdb88d57bc5ec72d76b2104f3628 legacy-trunk
+73122 5f8dec846f46de9b8147b9913f09f7ad2fb3a6ee release26-maint
+73123 5429527e3a288fd21a5d61ec4ea4e6af5576697b py3k
+73124 4993e110fd7785848b8a36ab451fd1797d06a217 release30-maint
+73125 ced380b40004362a7a9ac5380bf4900cd03aa6c3 py3k
+73126 bf4cfe51b4b521745251f6dee71b77d67e04e02d py3k
+73127 62542bb8873a1b37f7a8b0f48c045711d926156b py3k
+73128 2c00bdaad7a9fffe1a7f9573beadedd3e16c3be5 py3k
+73129 8c8504715b8a3879d54b03d44bf7962b7740418e legacy-trunk
+73130 db88a67e38eea1a31fb3e089ed8ded0e5c0f382c release26-maint
+73131 2990440a20f42a107d04cb32191946c4179dc85f py3k
+73132 7fa832927b91c86414461d894c49fabbb283985e release30-maint
+73133 7d47755680d78433b727187916b6940c05a69b9d tk_and_idle_maintenance
+73134 e13a4f62b6caccdadaba699fdfb63b5f984ab53e tk_and_idle_maintenance
+73135 128147dcbc1d51137953b64583bf7316c816b857 legacy-trunk
+73136 3d12fb9ced926cae75da64acebe3ec95359154c0 py3k
+73137 f8b5a1532bec56044c9ee158db08631bd7fbd35e py3k
+73138 f0f84af15957bc83c6e3e5b812753196b0422ae2 legacy-trunk
+73139 ba8222839938db06942f0419b0fbd674cff1409c release26-maint
+73140 7234a83a8b19fd8f1550ed05a07c1d2084109268 py3k
+73141 0449cbe9ac9d6b595501c3ae7c1b5e931f23d749 release30-maint
+73142 1e72a540c1aa6787365d0adb63ca9f0d916ad54a py3k
+73143 621a59bb34045babb2df2933008327ae5afa70b2 py3k
+73144 885b0a92b506262fc7d98b963c0d8070327bd5a0 release30-maint
+73145 e80e25e6a187b4c5d5c45ae4f033b72eca34a45d legacy-trunk
+73146 90489f267b300da4d95df4b5a71ee94bf92282ec tk_and_idle_maintenance
+73147 4283bc8c930651ca3128018314befef56b362997 legacy-trunk
+73148 b2f962385969a208c2c1cccf0b5f84ed792fff7c release26-maint
+73149 5e4d070565e728c9324e638e29c765c67a0ee1b8 py3k
+73150 f632e02c2642e8a17ffb1b5b9986000a5e0497f8 release30-maint
+73151 b7b7352994c884050eb571761ad3c6dfea26bb2b legacy-trunk
+73152 cfe577aa156acc4ed0496af1132bd08974b11abb release26-maint
+73157 2f7d9abd655bab9d22b4afff1a039aeae460418b tk_and_idle_maintenance
+73159 32a49d10801ed1ecbd50a35317c9653d7d340645 tk_and_idle_maintenance
+73160 cf19cc06b09308dd06f6b3010a4295fee99ae6a8 py3k
+73161 33a8ba925c9209f85c000a60f94154a8185fa6b3 py3k
+73162 51fecbb7fc87265fe0c2c7d7254035939ad63df4 py3k
+73163 4a2771f6b9dd7850463fdd12e5b823ee2645e4c5 legacy-trunk
+73164 2fbc7039382d1c58f28066cf8be6cf33b274162b py3k
+73165 2d500d7b20be686c62bdc8af1ec09b04e72b3c87 py3k
+73166 98d8b8b749f47465e0dc32b1da1ee1b931639240 legacy-trunk
+73167 16e45d8b7957e7ee0033454f30e2d1c58238a737 release26-maint
+73168 fcb2580c1ab3e8b329aa94d6a4c81961ceff96ce py3k
+73169 e1a46602b9d72ab0665258d22363c5b655b01b27 release30-maint
+73170 1a029b7c97705277d789f7ce38b7864ef43922c1 legacy-trunk
+73171 65f561a3e291b80e7ad318184c3270ed0592f403 release26-maint
+73172 ae585cd5ca54b3fb47a856bb1623d319d2ee156b py3k
+73173 62544c946eda2af1d4384a50f427031d4628bfd4 release30-maint
+73174 b8b32fdcc28d41e3834eeb3a2d402b4d73c671b8 legacy-trunk
+73175 9c2e07a8d2302d3f69ee036466ca48907e48f7b6 release26-maint
+73176 7c0e79e71ccdc5b3db7a01ce6c946db320d09728 py3k
+73177 030a3fe4b604521e0ea0101ffd96531c9123cf71 py3k
+73178 b01ccac30473509e0c02ae40a10ba6c74bc92365 py3k
+73182 e86bccebc07586e84f8c9680c3123b09c42d516c legacy-trunk
+73183 bfaaf2f4b2e5bd5b071991c81243f1ef7d71b467 py3k
+73184 bc74b2f611595890c1c4d0282e6bd7c08abf3340 legacy-trunk
+73185 a29842e5e138c3751b7b5cacafd91096281b53d3 py3k
+73186 5a32f3d06158c3e4e0238a76e516cadb3f5893a6 legacy-trunk
+73187 14a4b6fb00feba818998a9a29c3b7c31f6230121 py3k
+73188 abd13acff5dbe2ba94fc03db9a89ab6ae4395445 release30-maint
+73190 4439b22cf6eafde793c13cf988d1b8609f8eb628 legacy-trunk
+73191 287887198e2fa724ff46c8a2b66562c389a52db9 py3k
+73194 0c94c5ca55d57f531725fafd330e1a1ddf648042 py3k
+73195 f48a05214281c083319b00c79efc5247337eb89c py3k
+73196 d04378f9fdb456b71042b6d69f5bc814443e4b46 legacy-trunk
+73197 7df2929a3d06fc4852a5524770ae137111bfced1 legacy-trunk
+73198 b782fd05a8064252e5e608ab07178a8057a22245 release26-maint
+73199 0d8ed9e558f28e32b858dc46e811ea2e1d32b2a1 py3k
+73200 aff97e50a2060a77b4eeb0896638130f53319eef release30-maint
+73201 97a0a8589014d7ed2a6201fb00a957d3898d25b7 legacy-trunk
+73202 00d5772c8686625246c2a39fa463f0f7d9a74834 py3k
+73203 5ecdb829434f9863b9adb3c3986e0e0b14a4cede py3k
+73204 18d823e8b602cede67e2862f43b1fd9dd8d3b1a1 py3k
+73206 d5bf08c861a6425e8f0dabc0261424229f7fe38f legacy-trunk
+73208 3f621140efc4a2e23e9ab50a5f0a0afbd928227f py3k
+73210 8fa4cca9a22ce493063dfb1741071469bc7bcfc0 py3k
+73211 031b963f2bc276d5fe00524df9d448eb87f2438b py3k
+73212 843178cf0899d7c9fe6e84cf988a086028974e73 legacy-trunk
+73213 0e054c657062402d378ab45dd0d9554ef2276b47 legacy-trunk
+73214 e9b0db553d01fa80f3944f836305a556965f0ca1 py3k
+73215 3c41573490cb85c77a2e9d89a691ad8bb325b579 legacy-trunk
+73216 50bea5339f1822c9df9e8a1f3f77ee379049da5b py3k
+73217 74246129bd2233acaade923d91d655fc4a003eee legacy-trunk
+73218 ddb50c3b86f2e3d1bec3d552b24c227d4af4e56e py3k
+73223 0b07531673acd2b45ad5d1a709a4a315e606c190 py3k
+73224 a07ea82a5bb0cc81938ed8584218f2bf850694da legacy-trunk
+73227 39cb01b0fc648f31fae1153bccab642d09459aae release26-maint
+73228 686c15b8674898cce99250f775c20ff9f12bdea1 py3k
+73229 eef5d1ce6f4b70d9bcf23438ffcd9c969f71983b release30-maint
+73230 d45269956effe22dacd5ecdf1d46a05e510dc765 py3k
+73232 ed6ed3c839f5bc93aaad3ec047d0f4bd14d749c3 legacy-trunk
+73233 3a784b2172209f3c924406b1acd941e7c314e23f py3k
+73236 0805ea2111220e40be41d962688a2c2609bf6f82 py3k
+73237 d9922829c20434826c9b023295a5d10045e51317 tk_and_idle_maintenance
+73238 03bead72947ef9b5afdc54f183afb16de1c46ee6 legacy-trunk
+73240 810c25f19cd94b2b90303453ddcfce4fc58cb6c9 legacy-trunk
+73241 ebeb4d67dbae9669707db328fc87e02311b8dc41 py3k
+73242 c2cec56d0b8a115ac23d456882168bf216a39658 release26-maint
+73243 ceef0a78bf879f301744eb5bf2447e3c3594bd41 legacy-trunk
+73245 094fd335a47102045b0d77dca0299f672a20cb76 release26-maint
+73246 ef74312d72155f7180d28eb01336018832dc49ec py3k
+73247 e4a7c48de603bdd0e00c1028307be4d3c20a5c8d legacy-trunk
+73248 ae9b5d4f1229ad6c2e42f07654ef58b0a8d96a71 tk_and_idle_maintenance
+73250 602559fa5297d5191c24627f011cb367801cadf1 legacy-trunk
+73251 da33bed5d8c48629d20e700cc77221d5e2cf34f2 py3k
+73252 112e1bb57e7b2dfa57f01657326413ee1309ffbd legacy-trunk
+73253 9c091544e1df278eea74dee8f14986d64552e214 tk_and_idle_maintenance
+73254 578baf7d311473201b924ccb603261d7378092f6 py3k
+73257 81a5b1ec9105aab7bcc3ca060b6a1105a8121c31 legacy-trunk
+73258 12853db3eea37ced56201b8df0ab6de29a161e72 legacy-trunk
+73259 1f8d98720accc999d019d7a3d70161b499b02ef2 py3k
+73260 8888a6fe9dd7f290d93f6e878a90fb482d4e2880 legacy-trunk
+73261 9547f4bbd5a45f859810c9e901263fc9b3958b92 tk_and_idle_maintenance
+73262 32e34483e6db7233ee4e418374ce44584dc4bdc2 py3k
+73263 ce89592a93a436e2a1a5e87aedf197ff884ce79e tk_and_idle_maintenance
+73264 317a17584058037c8bf563a07cdc6f23cb8f1f76 tk_and_idle_maintenance
+73265 787f27ed72c28d3c7b515884c1f3c4f4550d98d7 tk_and_idle_maintenance
+73266 19d8a3a4e149602e5d9ff6217e14a230adaead17 tk_and_idle_maintenance
+73267 7ee5799a7b5195612e2e63e47d51406f3fefb7bd tk_and_idle_maintenance
+73268 3d8357ccf5831efd9f63594da9d40f8f533aa2b5 py3k
+73269 fafb991bea6b1b0797e583e2aabd5b2b61dfa067 py3k
+73270 783d4044dc2df929a58cd84061e1643152c48cac legacy-trunk
+73271 0ebe889f106fe9dfe07215964344e6e5275a4b90 py3k
+73272 da6871b9d884c4e87a28705b6be47dfaa55e6068 legacy-trunk
+73273 66a5bb3d8a8d82d8f91dc04a0c1f67264e97a319 py3k
+73274 d679b60907f7698b0c0a9c13c389b9daac250ca1 py3k
+73275 3e2b8de4b16cc82daa709c211e44b27eeba03db3 legacy-trunk
+73276 06f5f426b8491186d5e842f81df687565ea28ddd tk_and_idle_maintenance
+73277 889b5fd8da309a55cdad2656af471bfa68c5fd81 tk_and_idle_maintenance
+73278 851636b62ad95ab7ccedbf456418ecf749ca4ab4 legacy-trunk
+73279 d945e6de5227b6bbb2bf7ae47010107b8be64eb6 legacy-trunk
+73280 d79fde1041bdc0af74f908a748681fa910692e82 legacy-trunk
+73281 054ea47d6cc73836d37ee97457d5af071b893569 legacy-trunk
+73282 0abf562b1e6cf6e88efee8da8171cbca341c16a8 legacy-trunk
+73283 f7c9e73420840082d276f37ef6040a8d0305a9b1 py3k
+73284 6bfb5952113647d3653d8d32f201afc0c5019e87 py3k
+73285 f0019ff6b3e5b334bed0d0178b979b26c850e812 py3k
+73286 1ef1421a61225530b427ed5167a1aac5a63d7c78 legacy-trunk
+73287 ef65cc402c923162ab542f7a3081242925b0cee6 py3k
+73288 cf8ffab4900335a77ead529d6af661ede45f15e4 py3k
+73289 98552131f641bc3b3144efc879a47928da84ce67 py3k
+73290 55dd9ed23eeaecf280aab5f95d0ac32bf06f6f80 py3k
+73291 8f928792547caf4e603bb8fa91837256f5f8207f py3k
+73293 27e089cab729a1dff49174e2a897b8e17e29002f py3k
+73294 b504d6d34fcd7080f167d9384e420a2ce97d53ea legacy-trunk
+73295 7ad2f22f13e6a00c48db70f5c7c5959724600926 py3k
+73296 698557cc5dc507f8b2258273bf563f7a3ffcf92a legacy-trunk
+73297 c017d191673141736b5c707b4dcbad617e7d3c6c py3k
+73299 ca51996099fdd247448f63b75a3bc964dd833363 legacy-trunk
+73300 2795d6fb21e262d9c702f432249f92ba0856e6af py3k
+73301 54189d5a6674797445d7cc591720b1c896d2e926 py3k
+73302 255db70bb316ac0e2fead3913cc1400acf1e116e py3k
+73303 ceb262d44d7464146d63b84be444ac2e2659351a legacy-trunk
+73304 71cb6029e8927950e75d4fac070aa880f597f64a py3k
+73305 1c7eb5b6229ddf52912d71cc492a765a26f42aa1 legacy-trunk
+73306 35c5c1e07a44cf3075d362269fb90658057529a0 release26-maint
+73307 fd0ad115e23829ab96c8c2e6f19a56c5997637ba py3k
+73308 86b32e1fd99f0c7f81e955362399f916327400d5 legacy-trunk
+73312 1b8602c38fd0c7aaa78694b78bd1bb9ad9523d8a legacy-trunk
+73313 c4a81ce3c89327020c76b3ad517e8ffafeca9af5 legacy-trunk
+73314 ea30aacb3181637e8f9e009ccad2544e0a4f49d1 legacy-trunk
+73315 87534bfd1be8b7bdd20c90c821facaa6b8907eaf release26-maint
+73316 d2d54dc8e400faa6140bbd0e16563f5a7a4d3bf5 py3k
+73317 5177b6780cb742f0231d50abaf8cc1bf901ea60b legacy-trunk
+73318 b96c9d8d5f985db6e38bb69eacb56af6ffb8b77c legacy-trunk
+73319 760a8866aeffa2410a734f2305966d21cd87ede1 py3k
+73320 ab3a21336a84d6b788d54d51de4b01bb78694b1e py3k
+73321 446030f310a9515c7a16d89f622c2d8b3f76a153 legacy-trunk
+73322 91d4c514e78c02991e5cfeb6de8b539416ae2646 py3k
+73323 f5828742b46fed2478d1bc4c84b0413ea76364c0 release30-maint
+73324 d49d48f335c9009babd0cc6d779c1ee8e1148d03 legacy-trunk
+73325 9145f58f74999a7330b1b059c7cb341066861de6 legacy-trunk
+73326 fa67bf674af363e446455f8da4db42a65ec5bcc2 legacy-trunk
+73327 ec845c4e3d736b6a90dc65cdfd2777a9c4f3dd1e py3k
+73328 b8d160ad1c9256365480f4396a50c581d6ee1eb7 legacy-trunk
+73329 66297a074d8be9c04517792b9def1dc016ffd48e release30-maint
+73330 0480700553ab23fcee85f6379f505b0f0c9d712a py3k
+73331 744e984f1841aa05f5094cff02617826aaea2fb9 legacy-trunk
+73332 4fd3a4aeee473e71073827b4bb4e4a8e34b004c9 py3k
+73333 13a9874d8f476a42db3f55f00b73f27b6e7d9db8 py3k
+73334 b6095dc8f35c070c47e82218b1d3af73d30c2565 legacy-trunk
+73335 4acd936cf6b6f9727260ba5b452b1737df7057aa legacy-trunk
+73336 edf3ddaa346bfd12b0566f8bfb847e0792282be9 legacy-trunk
+73337 03d38a2abc46a98bb2ec346b95fdb99657685de1 release26-maint
+73338 657a8ae0bbc9467884e49065ab471232392c9843 py3k
+73339 f41b285f2b59acfe8c6ea6103cd5026724bfc159 release30-maint
+73340 2719a88c2294f404d1dc2b206f4aa20b1a71820a legacy-trunk
+73341 65793acc0095002fa0f622ac1d922b5ccafd61dd legacy-trunk
+73342 0adf0fa7993bcea40b1c4df5f56600982ffd00af release26-maint
+73343 8b3ae3a38250761487e9d6b91e916bae84e0400e py3k
+73344 f631475a2642b3b38b475ddc5b3155be136fc83b release30-maint
+73345 b4635da31099922889374640a6d51af3f1c8b7a1 legacy-trunk
+73346 80ef3b7a4e0df45a1de20c4865af5f25d6cbaaaa release26-maint
+73347 4755f898b9fe0d49c1d6565cd6f5406fb11af9b5 py3k
+73348 0de66fcef0fa8972e943f1d70ed14e38f1d2919f legacy-trunk
+73349 ec5917f77ac0e688ff2639969ff8a2224580f16c release26-maint
+73350 a2f2376e1d201a288d6519764c926d6504b08a2f legacy-trunk
+73351 60036e50cd18675547d95a8302e772d835fa5630 py3k
+73352 0031ba21390a1b3aef8c99942b8db4bf9903b531 release30-maint
+73353 1128823979dde94325bc32a25cb61b778a3ba860 legacy-trunk
+73354 0d9bd91eb85cb5c4e44a18f29c2f2b65f38f7bad legacy-trunk
+73355 209a539ebff806c29c63279e06bcac08aff017c9 release26-maint
+73356 3244fc4773f57725ef3daef0ddbd790920b64765 py3k
+73357 bb63fd979fcd0a81447a670ef1ed520919e802b0 release26-maint
+73358 5a3985e5dae3b573036e9ea5ea3e3752b2d91123 release30-maint
+73359 140182accd1f5817ea196de942700eb20d1eb927 py3k
+73360 4179a3e661231f93cc550276e51d9e908544a0d8 py3k
+73361 96a0c3f6ef8bea2728955c9e5f0a7b536788f0bc legacy-trunk
+73362 027444810e3f39cb358e61144814c5095f540312 legacy-trunk
+73363 a1e0681acb36f1b7a7873a43408e629c87c7fc96 legacy-trunk
+73364 41e6cf685ed16b29de789a861bdecc8858371c95 py3k
+73366 20170bd0af254ded97a1fd733eace1e052b5d8f2 release30-maint
+73367 72889a0b8f322a738f16def8856c5fdc65cb7df5 legacy-trunk
+73368 9ee9e7aa8abc2442585d9d7a9fa298bd2076e176 release26-maint
+73369 e2041c5c60063f93ded0c177b3019469ba73145c py3k
+73370 7700408f65fc41fff635616180d7542b174a8979 legacy-trunk
+73371 d66cafd6bc21b098d8f720deff4715bd6543855f release30-maint
+73372 5ea8507d9be12a0f65674af6bb0c18822094d6ed legacy-trunk
+73373 60a0af32a663e2ad26587660db428a2577952719 release26-maint
+73374 12bf87cd27430e0adf7368ffb96567295db64ed5 py3k
+73375 4f8a44b51d0c1ead4dc53fe850a8b925109d78ef py3k
+73376 5306b84d4fceec69fa7681803e5300dbde88f750 legacy-trunk
+73377 6370d71e3ca3271862a59263087fcdceabcc7be5 py3k
+73378 55d22b024464db25a5cc50d64d115fd268c75c16 py3k
+73380 0e1b3c24d3e27a66f2e8d78ee754515c35f1345c py3k
+73381 9f3a25743f03fb50a9f10b4df6f2e172feae2326 release30-maint
+73382 ba102540ea37388ac0955e9d8a52d8fee08ffa7f legacy-trunk
+73383 7cf89ed90f9d064ae4a1d2c8984d20980d4f83a9 release26-maint
+73384 dae9be6379b3e584187da86dee267903ba5c4e13 py3k
+73385 fcbcd931338b8939e925d61f2dee59f8bd0a1d49 py3k
+73387 c9494c88788f5b852bd2ef9f718ecac6aac282f5 py3k
+73389 f57680748ecbd6955c769510d7d748ae7b843d6b py3k
+73390 652551ae476702f36af25d69f3df68af162604a6 legacy-trunk
+73391 07e2ee2fd36d32fbc4f5dbef40c373cd5ec2943c py3k
+73392 6492b6ece5987abe4c1f4066fba774d6a302bf81 py3k
+73393 f34754a745ae2a2a8457893075736e0e1796b4e5 legacy-trunk
+73394 760a710eb6c15654a99a5282ca98ab9a73bc7ba9 legacy-trunk
+73395 017b4b644faf245313a4a5778c854e1a7f2b89a6 legacy-trunk
+73396 cdf252c874336b05c1aa459f48795b246e8d45e3 legacy-trunk
+73397 24c8d1aabade319935bd3b7f05d645cb890fe801 legacy-trunk
+73398 921e569d121577f5b037467c92444f485ff96ca4 legacy-trunk
+73399 d8338a9a1e3a88100de43336f8fc6d4593a261d2 release26-maint
+73400 eb61cca5f54de3aaadc48265ff2d49988c66b615 legacy-trunk
+73401 bee46ff0e57835af348f131f6269f6bb2301d9b5 legacy-trunk
+73402 453fe48842d0b10845acb35fe5903ed75c958e14 legacy-trunk
+73403 75c4d3bc6cc8840377f98d130c61f0d48f851aad release30-maint
+73404 0c357e3fc3d017c66a94017cda75de3686cc439c legacy-trunk
+73405 788e1397ce777458fb0dc8f3a0e96b58be4a8cf0 legacy-trunk
+73406 b43398ea549de440e62853c58e0b883e63ed93bd release26-maint
+73407 47e3365e2177e88a0a99de12a32f44595abc5c3c release30-maint
+73408 032c2e5e0614f370e80f96a5304469b465d1492e py3k
+73409 04ccec0441b2a6394ab94d6a640524d0141ec96b legacy-trunk
+73410 03a848d1cb68276a88a06fb7673bc1add4a53b09 py3k
+73411 25edc5f72a72ea3c93d663cef75fb985044efe9c py3k
+73412 0b87e438e1b53e3f812cad963a7fdb65d198ba2f py3k
+73413 19e5dfce0fbb0295bd905dc5744bcac50f6eed84 py3k
+73415 26f8ae6f037d6b5e23c20e45eb766a91add1fe86 legacy-trunk
+73416 a764db6402842bc76184a1feca3278268af052d9 py3k
+73417 91242313548381606ecbd77c6eb8d5416f580cf4 legacy-trunk
+73418 2212740f454469be811875b952715eda2f284381 legacy-trunk
+73419 cb66473cbbf88d9f018571abaeb17ba9e6480ea0 legacy-trunk
+73420 3eb8510808c9d0e4330b44e47aa9b1b534f78ea0 legacy-trunk
+73421 40c8c35492f14a2897654fead7414d3cc1738935 legacy-trunk
+73422 247f8d268d58c41a24462b3dd773a664248cb5c5 legacy-trunk
+73423 f118aab650dd3e9c24fafcc32323200e7e15b065 legacy-trunk
+73424 0be377e60801b6afeb329f2f47009bef0a63d0cb py3k
+73425 0151029de1d91740c4e15fe71747da2c0ffd303f legacy-trunk
+73426 3c8f4f7e4a62eb1d0e0a3a918161181ebcc09098 release26-maint
+73427 e4119c90bf29538d002baf9de9fdad573d81d47b py3k
+73428 903efbf511b4fee17949ab24fdf4eb981e98ffd2 release30-maint
+73429 9000a081159941bfe7afef25f2a4eda5fe12ac01 py3k
+73430 4658fcaafc732883fa9737082410528f79fcef5d py3k
+73431 b634d0ec8d35158307e80b713e75ed0bdd89f2bf py3k
+73432 311107443cc136b0c3b50e57fb17e152c6d25be3 legacy-trunk
+73433 d8aa485485a6cf8aa0c473d51000b6fe5cc6a73b legacy-trunk
+73434 e18318f985ed2e1ced66f0a620e79f7d23034d0f py3k
+73435 1b3a19037f764135d14b821cae178f0a4543be72 legacy-trunk
+73436 4373f0e4eb2132b91de979a5d01c7961dd69594b legacy-trunk
+73437 c7ac70a944b501d91f07f7d4892df023d0cd3217 release26-maint
+73439 4a50f0bdc8063a7a6996a5062b941c4f61412ea0 legacy-trunk
+73441 20343aa2a3eb793d14fd14b8f800b9cf3c80cfb7 legacy-trunk
+73442 cb5ae4401ebfdc6932921c79a777bb9e32a38889 release26-maint
+73443 9814d7f659a00edfa771b927b9b9b1c662154da0 py3k
+73444 277fd064b5301a60a6e08bc24b5753787057744a release30-maint
+73445 076db4de037ab101ed0e7bf1ff7d28ef1dbcb3c1 legacy-trunk
+73446 ad2a5960126da21ed67d185d46e9d0ea0aebaced release26-maint
+73447 45c05fdd9b32a8f65d88f7e56a086afae323bfa8 legacy-trunk
+73448 33fefde793b0cc4efab2266bbdb736cdc868f195 legacy-trunk
+73449 eea4d237c16d7511139cb12aeed65a75eb1e2a04 py3k
+73450 865506f36e588dde53025520c68ea56f95e35896 py3k
+73451 982f7ba0e14a27f6a0ffcbbaef0cdc09f7edaac1 legacy-trunk
+73452 3902e4f74ee2817a21b6d03e997870e4b73fe55e release26-maint
+73453 f0195daadffbb258f694ad87b3e559d7b6a5af9c py3k
+73454 09e5f88c9bdbed46aec4e94c03fe44dcaceed0fa py3k
+73455 c5682ce2346759b8ca03a3c015dea2c4d2512272 release30-maint
+73456 6b6701ba1211ea5f882f76ce11a1302da08ae0e2 py3k
+73457 4c6cdba1b0bb3ca034c7578030be0ab9d01999f1 legacy-trunk
+73458 c387da837c4a23ffbe77aa5acc12dbd87e579a6f py3k
+73459 c1986bb4300b722bfabaabf80b535d9f1e04896e legacy-trunk
+73460 6f3054afa1a0d8ab10f9b60e4c1b697612e61288 legacy-trunk
+73461 a5f31b30c7c3ccd29cbeb5000cd89d2d28094bdc legacy-trunk
+73462 b0cb3cbdfc47ab9b4aa82086b63c1bf4e4e637d7 legacy-trunk
+73463 22c79341e580ca2c3c5b0c46ed276bd1e98007e6 legacy-trunk
+73464 d11dbcf843df8c04cdde84c2e98a45dc148de7da py3k
+73465 33489117da9c5609c6d8506805699972c6286796 legacy-trunk
+73466 d4c66ff129c2c833058725b0abb6262b5434839e py3k
+73467 ad6f6c26187f944a893ae00ebf1d08b151e6c195 release26-maint
+73468 7edc37883e8a1d6d3e15c96c69358ac51669575f release30-maint
+73469 315d7ae42ea70253527562c19ad233ecc512f4a1 py3k
+73470 a75e18d8166ac2affa11f3d56d14340aa4e28251 py3k
+73471 a230f8d9b41928c52cf8b23ef6e0bba2478654ea legacy-trunk
+73472 37223ef4d470d4717d0440f9471df7c5f3db4636 legacy-trunk
+73473 98a66fa01e0a4d0a86051b520a4e75c8a69d0126 py3k
+73474 b81893d37e7a9e95900c824c9de7bb0b39665b90 py3k
+73480 dcc962b4d8ff930de0a35489d34bcdda4dd624d2 legacy-trunk
+73481 e25a4d27c38b606606f7cff1201d4533442bea0c release26-maint
+73482 5fafcb32f06227cd9f5783ae86e659b2a79d44b7 py3k
+73485 e7d38c4083619b3cde3e0b6b7c1e03953209ff2c legacy-trunk
+73486 6dd507b952cf9045e5e04bfee38744740e4ff259 legacy-trunk
+73487 07249889a773f1844e370dc1287003f8f078da35 tk_and_idle_maintenance
+73488 e1c230f02feb9fdece78c0d90382d07df711b556 legacy-trunk
+73489 913c9bf98d609016a01ec6707ed73d47e8db63c8 legacy-trunk
+73490 7d245a423e96c67c6cb40a99248693845918a8b1 legacy-trunk
+73491 01d10705a71b1a214f32cf7d04a5b2a4681c14f5 release26-maint
+73492 3e4540b7fec9f1ae4f0a5822e751a666166fe81b tk_and_idle_maintenance
+73493 f323c280df586a492dc5375267d63526a47dba15 tk_and_idle_maintenance
+73495 d6622789ad275620fadce0365eb981f5a617edb2 legacy-trunk
+73496 40afb65536da26b17cc9e86f07f1ffd0b2ba47bd legacy-trunk
+73497 a950a4434f8bbfa758055d00be48476e15042ad6 py3k
+73498 d3b44ce543ae44515eb4f1d95ee89f0ee3565127 py3k
+73499 11c16be4d21c213ce22cb562959e3cfd95bbd257 legacy-trunk
+73500 e48ba9ce8836245eb65bd7f691f2e82e3a730a38 py3k
+73501 8700089eccd4d3e2c81174c5753610a6150332e3 legacy-trunk
+73502 917497e2509cd66fbb6da18cbb43874b10c66a6c legacy-trunk
+73503 c4fb0712147fd2e5ad97819c4b2f7dad1a988514 py3k
+73505 acc58b593bbc1bbbebc2980df9746842f932df5d py3k
+73506 bc61d231a6526bc967c5ff3b7e39d52c13003eef py3k
+73509 e33b65627188bfc0b3273411952eedc1157357cf legacy-trunk
+73510 5cb4e51a44085127caabb194c1a444b5c174e486 py3k
+73511 8ad7fc809f684f9b7f1c5454fbe35ea6a8d9d65c legacy-trunk
+73513 386922b629c39054e092de2f157a2f0e1cc48c8e legacy-trunk
+73514 514fc9366f2dbbf242e89f1b5da7681b0785eb9d legacy-trunk
+73515 1732a54a02725882b2eef0d26b2a7db9b58d9985 py3k
+73518 dc3817a8f552eb68f4ad60b26a3a97974a4cf075 legacy-trunk
+73519 80d0f202b9ef2a63f1b44c11476daba2399cb4f0 legacy-trunk
+73520 45506be4451466219f1c82162549290b6fd524c7 py3k
+73524 dfd9b9e71b2eb2b6d841ac823186cc099a3c3343 release26-maint
+73526 dbfe0abcd893a263a127f3e296258043ff88ef82 release30-maint
+73529 c94594e6edb732839f1e52be8792b6702776b5fb legacy-trunk
+73530 e7371353a3020ed17c45d331ed39b1bba13c6032 release26-maint
+73531 b4d0c020e35770fe94107663017e05b8dcfabfb4 py3k
+73532 f65adad3988d4aa7307cb424970f89b10a559729 legacy-trunk
+73533 a6a1a61f72bf83e9e44968ea00eb1cee060eb2f4 py3k
+73534 07f711d87ffdbabc1ebf78092d4f76e0251380e1 legacy-trunk
+73535 d16294697658ecca8a14ca7b87fbebdc7d8bbf0d py3k
+73536 ad607378a4efdd328599c59f4b81b2f2a8ec20f8 legacy-trunk
+73537 95e5791fc3c92d7db754d4ff31357c928957428e legacy-trunk
+73538 7a1315a992f0b6ec0a2ad45ca760798a7ffdc9f7 py3k
+73539 cb3d323438d9225e3738000cca4f7f6245a9268b py3k
+73540 bdc97594e5098a8f6d91b9f5434145ef18f2ed93 legacy-trunk
+73541 b92b892c436037524d939af81dca6fa0df7b3a25 py3k
+73542 6a31c4e0dfc12a9aaa8839d5b575716cc848c7fc py3k
+73544 2aeed4ecad5b87d854e5141e70f91e4567769802 legacy-trunk
+73545 f6cb2932022caf4dcd69d5d20da209e82841e1e9 py3k
+73546 a20a377cc327a82de79300f8c04379d3ba910c5e legacy-trunk
+73547 8a976cd57ca651142c2b537fb9cb5c7ccc9024b1 py3k
+73548 f318adfe2264ae6aa2f6aaf6ef40733978aa1ba0 py3k
+73549 f4d84c4f289bda9dc5ef42d3c6be5b1a1954d072 release30-maint
+73551 79a630da8f00e06599f6a1b1b8c37ccba06622a6 py3k
+73552 55b303d5dd5515e18c92f6fd37fad08bfa0aa7cc py3k
+73554 3fe2d1d37cf1f063423e836d2bde20ff1a49b989 legacy-trunk
+73555 448699156dfea35c967ec839aee404a96ed19521 py3k
+73556 a1a6e6dbdd6a72f066a720e8ff28299dcfaa672c py3k
+73557 2735893c38747443476d3993c942509ef2a7df6a legacy-trunk
+73558 a937f040959281ebaab343758f5ce8b45a6b2bf8 py3k
+73559 52c86873683eae9ce99b4eaab76ec8d1a7deccd8 release26-maint
+73560 e690b736af4781376c99e5e1bc5afb7451aeec93 py3k
+73561 a57992a63caa07e881cc2c7faf71d1b98b665ba8 release26-maint
+73562 cf9ceb6f5a3a7af65bd47a428d4abe57a16c5b30 py3k
+73563 8882f8fe823c64b357448c229a2bf04b92d929f9 legacy-trunk
+73564 a666134e6c0c234b096f29c4ccfc0ff794ccb512 legacy-trunk
+73565 0ff0a396fda837b31a2054aa83042bb01ebe04fb legacy-trunk
+73566 0170c961f29054af53b87e892619f2427a7d3e00 py3k
+73567 253dc7be5d1abb4c1795cec845a16c282781843c release30-maint
+73568 d04877391e807cff668fe9e6f48b4c91108c23ec release26-maint
+73571 150e3febdf1785e48dde410fd67e03a1dbeed3fa py3k
+73572 12e960cc37d61ed6d07714b5fba0cd8fae5335f3 py3k
+73573 a69a031ac1402dede8b1ef80096436bca6d371f3 py3k
+73574 7c9e1c9ec5dff820a3e261cf92c4b95e5687dd24 py3k
+73575 4accc8a3f9afe86fcd466c269d0f2ec105165564 legacy-trunk
+73576 831beee22a9fcaca19e389ad1059736ec39d2216 legacy-trunk
+73577 9d00fd0087ff9165dd9ff9fdd6f9d169a6b7b116 legacy-trunk
+73578 c3d5d3c8e49ba8b2d99347e1efb3d87db1526043 release26-maint
+73579 25d85e4486acf10331d4365dfc4842c93cf51834 release31-maint
+73580 a24f09606b832698e26afb33d64397551fd17693 py3k
+73581 77fb7d3c6dde7a4f57c704bdff2b10a551936ab9 py3k
+73582 9603344358558cc65f7386b8684b0f3af995c8ae py3k
+73583 5f49ea8f5908cfdce48b1b341cf4f8126dd2f576 release31-maint
+73584 b676159456815476e79ba9273b24dec90795a2f6 release31-maint
+73585 4d476f6f1be3b215db1d1d2087438fd8a1268117 py3k
+73586 6dc884b2dea7aac238608425ccc5797055f3a199 release31-maint
+73587 46cf2e5a57d4f7b090b6e87abd4bca7e6c148980 release31-maint
+73588 dc74563978df4954c3a6e695e30be72251807920 release31-maint
+73589 1651e2f36af12aeaedf228e33f3d9da3b26b2771 release31-maint
+73590 070e1e15c5161eb883b6f31dd8bf4fa118851d8e py3k
+73591 2da05f80d365ae9f55f75317eff3ce58d495212f release31-maint
+73592 1d3bddfa85090cc560c4f987a23865a386f1b54e py3k
+73593 58f2b27c91a14cb975c9007213a7c3d5d2e73eaf py3k
+73594 e2522e4d2dc8bf2f82452a85e82f3282be2ca667 py3k
+73595 5b3d0bfc8d2891bc410dd2a169f24dacd9326e91 legacy-trunk
+73596 1f60583b6287cf1cace20da498ee1a57974abb09 legacy-trunk
+73597 3aaf2e065db05401803705ed4bfa3fd2f9030df8 py3k
+73598 f4eea0d2165dadcf1e8a114e32a2a77271c25338 legacy-trunk
+73599 1f4f4d9ec79307ada1aed3f14e0cccfa80db7b86 release26-maint
+73600 c5357836c079d76fef8b8207b5150d4342d1b258 py3k
+73601 ac78eeeb46c295f0b65b9cb8763e8cd4f60b544c release30-maint
+73602 10a229c8beadb976ef1c1b7187e90cf020e9d713 release31-maint
+73603 558ed72d4d33bbc38601659ab630ba53b4beae26 legacy-trunk
+73604 c41fe133d88733052eae69b719b9f6113becf8b6 py3k
+73605 08d05856214a3581cb7ae6e132655e1dfd19ae6a legacy-trunk
+73606 117e85cbf169b4b804b1c04b5d80049d09d18d89 legacy-trunk
+73607 54ed2791bb15b8c72e053199e15e001d08cc0d78 py3k
+73608 ee253eb6f08c04920fb225c6fb92d67b7b23b731 release31-maint
+73609 6e8d63344d3e30d97c810a6ad33ce92b0de196b2 py3k
+73610 4a225de89233627c851e232233b0723777a6e40f release31-maint
+73611 544c5bad16077fadde09fbe5c053a70db65269e1 py3k
+73612 2602b56ad02dc6820729157894825499e0928dc9 py3k
+73613 b55a78b39bd5ed6fbc9e2346c6ae0ff66b741000 py3k
+73614 de866f47d38a857d7842dba0eaab6e1ccbf896fa legacy-trunk
+73615 368478859fe3aaf9c26333df3398e38eabcffb53 legacy-trunk
+73616 aa950f7962fdc6a536fe32d71812b4b3822d18de py3k
+73617 0c319e03d9a10a9eecad2a3c68dc1e03e60ac155 py3k
+73618 c9e65e49365dc38bd6789044e515650a2f5697be py3k
+73619 cb600e03437d640e1e18853d4ff2d76602cbf599 release31-maint
+73620 654407746be0a8f37a78fb0917618ada961f9417 py3k
+73621 9109b422c138fc4bec2220fd33e2fb2fa6a2bbca py3k
+73622 2228916ab4788f9ae9ebbd297506352d1f296d7c py3k
+73623 1e5589a17cf07ed95e943db947d34f3355e6d738 py3k
+73624 7c287d30023c355900a22c7800a3a9694bdda112 py3k
+73625 f94c09aa44443bafdea199603eac20946719309b release31-maint
+73626 0704f15b468271b609ca4a4a001c243757502914 py3k
+73627 411884d01f8b0f96ad4d811189a4fba3aef42adf legacy-trunk
+73628 4db4af0cf82c5b8a06cfb562cff0d0986a739e24 py3k
+73629 5c702a4d75e445d52f6d7cf308f6ccf0628db391 py3k
+73632 676e74c20c6ea3d6586b47b4e1df4d6ca1bd3793 py3k
+73633 0cc21c9751f1475d54e08e7e9160348c605b8412 release31-maint
+73634 db91a0453050c28d154d46dd56e265d1bde26c83 release30-maint
+73635 b32d136f3e2004e79e4d6dabba21ffedd05ec0f3 py3k
+73636 1a98472340fa0d88ae3118c0b1ccab7b2cea94a8 py3k
+73637 e3025a4c0ad78533fa52598cbcddfb634ea7108e release31-maint
+73638 ffd7cf5c7285f89d3a0f2ffddb0a6afcfbb70370 legacy-trunk
+73639 52c48dede5f77f5b605888fd88c345946b24c6f8 py3k
+73640 ab91fa5d0c5cc222559e552b6738ea324b1c8e6e py3k
+73641 d94b3ed5d5365c47431896f837946461e4c9c337 release31-maint
+73642 a511fe5166fd778dab66700209479c4eb9e39d7b py3k
+73643 d7496cc10dfeeea0719d0619e40955c8bf21786c release31-maint
+73644 0f7dc5704c5906594ea6edb8915dcb517abd80e3 release30-maint
+73645 f47ce11e072b6155785fa27881270b09ff78e32a py3k
+73646 66cc50890894c13eb1969e76508f415f4154b540 py3k
+73647 563cc4dcc703290b70a92ad0e4f4840d2c4b17fd py3k
+73648 52840be42530f76307dc428cd9b5b392f679fc80 py3k
+73649 a37bb59d4b53a9286ec7f463ae3c2f0fbd7d1fab py3k
+73650 09c44c933942b4488a609340bda7d13c282b5ebf py3k
+73651 4369822414c3abbc073044ddac4479ab767bb28f py3k
+73652 0080028f5ca00123ef1240219075d32b21c254db release30-maint
+73653 a9252b8847f07d76631d154617a00ab22a222684 legacy-trunk
+73654 dcf7121edb2e85d00de0162894d2cabe5fab3e84 release26-maint
+73655 fdc210a8a328e25cea1413f8d5101425c32e8572 py3k
+73656 3f4668b49f11e39bdca9b37ef5a683ff2ad51db6 py3k
+73657 520f1310ae61390248d3ecfdb601d687f2fa775e py3k
+73658 527bade3043b23a77b7d61053d11fed8352e2905 py3k
+73659 d51017dcba247f8951faba369080d45d48bd277e release31-maint
+73660 f3daffd4cb28c628e2f9f585fc7e1741ab34b6d1 legacy-trunk
+73661 9829b42399e56d9b2ad404c3a7ed54f289bf37ee py3k
+73662 5088064d61706586f68ac51cfc0992d6cc45ad33 release31-maint
+73663 7048948646b087ef03ba451eadae29a8986e39f1 py3k
+73664 c45e331238ae796aeb0af8f370dc6bdb03275c50 py3k
+73665 164d64b39ac06c0187bf96b7c31c90864250a985 legacy-trunk
+73666 7ecc075d171f7a21c5d420635b201649aa6c2169 py3k
+73667 380af9e80c2e8efd8bf6b99b8c6bdafeffa9ab3f release31-maint
+73669 a664a4443a3948450adb4ed4f605613b1962a376 legacy-trunk
+73670 65adba95d7e0e73f2c7ee7f3965de68abcc4956d release26-maint
+73671 0d055a062cce1e021837375ff5d568d18a4263c4 py3k
+73672 297fdeaf58222500930293064081e7cf53dab835 release31-maint
+73673 db6d2ce3830af6d6a45cb6404319f8023966f452 py3k
+73674 9463a102515f3d3992c3dffd90492f64a557315b release31-maint
+73675 4e3556453fbccb68df0989807b9a93196e79472d legacy-trunk
+73676 a79f74d6f5b395086ca3239c6e85152303ee8ea7 py3k
+73677 6e7a16a6442f6c843b6ea99f0448e1c1793e6df8 legacy-trunk
+73678 8f23bd1092fc24f036b9182c2f59b67a5a879689 py3k
+73679 1b8a01dc7f45a4c8d24052e15e084a9b2e957176 legacy-trunk
+73680 629674448d84fbbf2d9c24201501a84c5a2f9a99 py3k
+73681 210a51efdc82670d90de4c685ca6fe8565f65533 legacy-trunk
+73682 a27583c836b228f332d434a46e71e931ce4e183c release26-maint
+73683 e0d27b76a2e8d144e3183ac490475d5433009f65 legacy-trunk
+73684 79c2ed61a0253d3994d18962a607948d71286c7b py3k
+73685 5139e8b0f21c732381d8899aede6cb190bbfffb0 release31-maint
+73686 70eda02c7a98e31bd834c47ed8c457eacb46308e legacy-trunk
+73687 e78b99b048baa87c78ccf2fd628636490541be4e py3k
+73688 3dcc8fc4354efbe9256926bf684b78a8af7268dd legacy-trunk
+73689 3915ded2d60f1fa6f79f158074a86de1fe67437b py3k
+73690 68102e7e1eb7d3367bd8d9d17256177ec6664e43 release26-maint
+73691 487d6f01842a93fdc31bdae70cba9cd1509a4fb4 release30-maint
+73692 514cae62ccda5f0736e454951a90fe87c4630fce release31-maint
+73693 591785cedcc8a5e7cd2fe31ea591b2753127956f legacy-trunk
+73694 3d54cbfd38099ed48fcc6d50b4fc9a38c9d72168 legacy-trunk
+73695 7e392028a09eda02fca8699e543dc9baad4e6467 py3k
+73696 932033c304ef7205497792087ea369c31adbe3a2 release31-maint
+73697 d2b1f5ef2ae3d2dea03ba686295d433c893f6f14 legacy-trunk
+73698 01e125d319d481803d06c7703194486defd14617 py3k
+73699 29fac8848489fd66bbd77d02941b3e4f380cd6a3 release31-maint
+73700 d3d6ccc9abb413784ee4a43e7ddad85ee408ca33 py3k
+73701 c065f33d9c9cf9b6aa070144f1112fc95b6eb686 legacy-trunk
+73702 5b6639075c479ce8fc0c5c4a5bfce2a1fe92b210 py3k
+73703 32f71120ea55044f8321eff0b37852f71a258267 release31-maint
+73704 0ae1202e53620e594c847f69534728c5eab9bb7f legacy-trunk
+73705 43fecc39437b32ce31c2cb4c50e46e927097e583 legacy-trunk
+73706 08b762934488a2585cf1a88a966b193c15e8bd9e legacy-trunk
+73707 848c86f4bed6060beee1abd24b0b72aeef40def4 legacy-trunk
+73708 70adf0f68fbca1ce778f3dc0101d9de3dd63c8d7 legacy-trunk
+73710 2faf2fa2a4235573a5a269af2eed95e905344689 legacy-trunk
+73711 99d52d8ad0266ef6a40ca13053125eca272cf82f py3k
+73712 4f90ddc6c3b64ac818807b3b8bd65380d347d371 legacy-trunk
+73713 383699845c99b1b93717063216fc927f4cd1c9f5 legacy-trunk
+73714 6768b2350c576a66d22d37ba28a9df226fe73a94 legacy-trunk
+73715 adf66b52022dad585a54bd6f41f5c061c0861dc2 py3k
+73716 3e001eeb8381b9361a34560e20cf6454d33514c1 py3k
+73717 e88cd42ff282dbc6ceb2e2a8e153ac52e226ea8a legacy-trunk
+73718 c40d6fed6b6ba55e2cffc9a592b59f9288ed316c py3k
+73719 dd470b71290147356e60a2a93373f892b0654193 py3k
+73720 6d5075ecc14c0a33965f677539461bd1ae53e55d legacy-trunk
+73721 1c7692d2509fa010d5e14d07d3f0bd73ee62f8ff py3k
+73723 f2b65bd67df25da97a2a34c40f20d695a7717a77 py3k
+73724 ed2a336204d6ac3aa17fe906e8bfb8502fa88daf py3k
+73725 5502f255c27cea54133610a9a8f69232600e263d legacy-trunk
+73726 7654fa857b03c2ab67b9d4996c448020248d4bf9 release31-maint
+73727 9230c3a80dcad38e5b2cc65e7f07af67d8530465 py3k
+73728 72ad1197f0ff97a83fc475e6377f6ef01626b3bf release31-maint
+73729 4b627961b4473639f94ffa2b36cb0ae8dffe7f29 py3k
+73730 a07fd47df76b3265eaecc98cb94fb03b0ef7480f py3k
+73731 e3fa2ddbb3a31509010cf3569bca535f8f2a8774 py3k
+73732 7e4283362d277faac3e06ed5ea0999e27df0c507 py3k
+73733 e80859461de8cd0c4ab94effdf6ccf3c18223d39 py3k
+73734 b168dccee602644aa27667088f709eb0f74bd5dd py3k
+73735 c24270f545b8fa6fb6ea70e6184e60a362b3418d py3k
+73736 43f225c7b77ec4735850fa917bdadc2315c68123 py3k
+73737 9cd79dee5bce4befe913ac9f808c5cb18c07c7fe py3k
+73738 e0ed627ea679485463352a0f0698ac6950311719 legacy-trunk
+73739 f0eeaddaf83a4a8fa0ad55b8a47bb8e431891914 py3k
+73740 151b7d536b5c45bb2345fd79ffe78d2ad8775341 py3k
+73742 366c8a4e5a46a0a1c71b2de94f2092439535e1db py3k
+73744 74fc476fe72833d0f1548f9c6adef7e95db82bff legacy-trunk
+73746 f2a526cc3f2af26750741118fe587ee9794a773a py3k
+73747 6518114fb06381f9572b0cc8e7260a24ec0de08e py3k
+73748 0c6fd556149db2f676786d46309810a7654307e0 release31-maint
+73749 cc43e923ef9617dec5a10c7cbd0e31e7fbcb6618 py3k
+73750 6210dedd2cf795493ac2e2289965af6b8dd730e9 legacy-trunk
+73756 9bddba6e764e6d455c1557bc7c3e334b56c934e6 legacy-trunk
+73757 4663163e644942e2b9469fea5083b216a136491f legacy-trunk
+73758 5c89b9273e6112fe7fcfb76c4816fe235142447e release26-maint
+73759 ca53f86fe67db2c8e21d10980eaa37c326379cbd py3k
+73760 6cc185f42bf66ab57cf41bc3876ff679447ac38e release30-maint
+73761 3bde81e7c9f403ce861a0ac1b5451012195792e1 release31-maint
+73762 5d749bdda979cad3a707137907a09fa4fe19f6bc legacy-trunk
+73763 2a8dafc84528c78e70e22539aa7e3f55e8e0c207 release26-maint
+73764 7d514915515e5c6d03ee22c00077654c1c62d224 py3k
+73765 da6980799639908f4ade120da8599774e9ad47de release30-maint
+73766 1d48c701f07c6146ffce71873b9ce6cbd6c93506 release31-maint
+73767 edcfe3b8f736167194537673c227fa44796c93b9 legacy-trunk
+73768 f149f57f77d6fe80078231900f31b250767144a8 py3k
+73769 e5c8290c7949bd600bff62611866bc48a4f87e24 release31-maint
+73770 74c0a78114ae4e230da2e8b4f2a3e1708aacd138 release26-maint
+73773 56c664b91545b81813fbb5c8505a9cd4f98f2733 legacy-trunk
+73774 fea57164bd791ced452e5f3274b05d7110b6d08b legacy-trunk
+73775 7dc0d2c4b5202306b2eb1cabacd928dea8e4510d release26-maint
+73776 0653c1a0cb1e1264d5e38f95c1f0732801368d83 legacy-trunk
+73777 1783883e76d779932aff7f0491cd36e1d4726097 py3k
+73778 ea44a165b9ce546d21a9dcec963ee66b2c797cef legacy-trunk
+73779 f65d62473465b154c570136b468aa3fc12fb6f0e release26-maint
+73780 466a71fc625c1e6d3182e41237b8203c94d7e077 py3k
+73781 fb542ed91e7f55b807fae61e366fefcd1e4b4039 legacy-trunk
+73782 26255f29a7e49d37729d79e1aecc128b66d25d4f py3k
+73783 cc6b91c3d719b69cb77b0f404906cc4cce6ca402 py3k
+73784 ea933c24ad1033d86134730c79c93028a8a7f286 py3k
+73785 65e41bcbc25d4d06c400f343fe1da31302c797f6 release31-maint
+73786 7b758f8083305b33027862b4a0a1173b9f80321b legacy-trunk
+73788 522ad9eed558e78abf0ecc281c4baa0445ac48b4 py3k
+73789 56a276396e15f9c7953a33cca3138f0a5700512f release31-maint
+73790 85677a2c7855d221434d4b0a5301bbce8752ba43 legacy-trunk
+73791 eeeb35f28812ce5e84c0b986b8ba82dedd2dcb44 release26-maint
+73792 89686773a619a770cd8f1e0401867d0df387b0a4 py3k
+73793 d8c83cc0d3fd8c54c7c5727adc82a06287730f65 release31-maint
+73801 a501573c23f2a57866187cb71af61169490c7753 legacy-trunk
+73802 427fb633c4cceaf6663197f45ff1784704e186cb release26-maint
+73803 46a9b18a1a176e113213eac4b141da84196b189f py3k
+73804 87763c97f68ea3f04a0908970a4a46f64c051bd6 release31-maint
+73805 854c0948b08d0418d6e1e6768ed481f50fdf37fa py3k
+73807 59c66ade3c26822aa88f9f02d15dd0fe5809853a py3k
+73808 fc6adfff9a9efd527113aef99a02c654450330b1 release31-maint
+73809 1c529218ba9644400238f963f1a08447cf8abba2 py3k
+73810 3a214622c943ca4a8d00d04738b19295798917f4 release31-maint
+73812 f6fa5fb010bf7fcad69b1624f52a877f25b782b3 legacy-trunk
+73813 0a46e0e3fc074853d82c5e5064a427dab9b44d9a release26-maint
+73814 7b0e797f6b2c86ec30d3e6b617181450f7c86c2d legacy-trunk
+73815 b2c776857dc4c873ff59efc7fc89e53992d2bd53 legacy-trunk
+73816 8842f4e2fb1b74db068df07fe5984f77caf64ecb release26-maint
+73817 dfb985a8de6f65c963ee4c57a1c0e9ff706e8baf py3k
+73818 9c9fe9aafba6d6d08ddffd04e77e7d4ccc9dda36 legacy-trunk
+73819 01af7b52e0db59e352f1c8e0d5d7eedbcd314583 legacy-trunk
+73820 c7da0dc6eb0c6c440b2a21a5d19d25970b743fe2 py3k
+73821 8a7c2066a9b2e614d52339463a4058eee984989e legacy-trunk
+73822 4617883ac1f33fcec40fb7a8db72f5b9e6ce6036 legacy-trunk
+73823 c2f4270be36292d54f7e539d6c95b51c794322db py3k
+73824 0e391bf3eb9df9cab8a866255a9110e4da0bba91 legacy-trunk
+73825 9808e38fde72b6b32bbbe61af46d54057c645b27 legacy-trunk
+73826 540fd46163d1c9be4c5b01bc0473dab5a53be9e1 legacy-trunk
+73827 52aaa77a5dbfc7fca491fabd891e0af9d193dc39 legacy-trunk
+73828 08b58cbece79eedf968b3d0b5300fd1466b5cabc py3k
+73829 0491227e540ece59f6fbce807213078cb57c5918 release31-maint
+73830 83ce332a2834f9bf847dd743e6cc88a4b1e5e8fc release31-maint
+73831 f882696fd134f771774bb33bb3387affd4ab6f99 release26-maint
+73832 06b360a33d5711e310f1926d4a65b150ba4d22c9 py3k
+73833 7b9ad9aaa9024c14f6f5b443459cb11a2721dafc py3k
+73834 d11d899aab1d80e4ab2758fefd5ab9360a8366e5 legacy-trunk
+73835 7dd8dbd27033383ea1b724b180c8944153d4ea71 py3k
+73836 868ff37f5a8012476781e9b504af8dcfe7102b7e release31-maint
+73837 1dea7ed6867d7c7d08502ca209cfe164f4ea2078 release26-maint
+73838 78987bcf1abfb08354c24288abf1c3801a6096f6 py3k
+73839 7ff1405ccb64bb51c4e19c19823725522a841ee4 legacy-trunk
+73841 44fcdbb62038b115f3e971ffe9f64ceee004c12f legacy-trunk
+73843 f742c08752887d388d003054444944be4ef70368 py3k
+73844 4ff4aa8d6583299207683083dd6162d40e82fb4e py3k
+73845 c233615b34aab8e5057a2e88cddcb40017bb5362 py3k
+73846 466ca96be1824009a0d4b7a33a0fada7a8bfd110 legacy-trunk
+73847 77ebeacc107a8060e9f122b52eae9c039a8146ae legacy-trunk
+73850 8e8157445a5565724f27661e1e4ed2b351972dc6 py3k
+73851 ab434f0dcb15d984e9e6333e369998d81fd9353e py3k
+73852 a76b34cfc897c1026f7bf00cf9243b1175a4da30 py3k
+73853 a40a22661e50487d2a7387993540ebac084a60d7 py3k
+73854 c6f13934f4c669b403e482d3c3abc3570a490323 legacy-trunk
+73855 10a6ca2c0ccb2727a2586fa8f471e3ad63791849 py3k
+73856 26f60fd47ad3fa4d424827a23d023fa0a314e6fd py3k
+73857 85db6a543b3e44baf0e6168c23cf16a8e5396f73 py3k
+73858 1fc37fecaf8f33f77730eb88a392220f21f427ab legacy-trunk
+73859 24446dc87f73e7df07e2fdb657a1e13051aa688e release26-maint
+73860 0522e571ce7494fa7f75b0b6d6abb7343364ec9e py3k
+73862 7bb7758e6d64b8f90ff257cb768f73e3c5a572ca py3k
+73863 426394dbbcee22f8711de69bdb3e6d3bd39caefb legacy-trunk
+73864 b46abc2f2a1fbacaec03e92999c6fc106a069c45 legacy-trunk
+73865 d1eda70b383e9eebd39a0e218be0a1424a71da3f release26-maint
+73866 c23a8f1cfab8faca1bc1063e8b481019ac0a9006 py3k
+73867 49ff23420919b41ec0b87940246fb09e83984225 release31-maint
+73868 749cf06cd07099a60e3fb50028d0cd18c35a04a5 py3k
+73869 59cf5f808c24a999e3750c8dcab689431ab17dbe release31-maint
+73870 e9fc8947c49a55638a9ea4c3e326c9cdd4afd0ec legacy-trunk
+73871 38d6e4e51af08951b0e96f896079e50dcd6bad68 legacy-trunk
+73872 1cef7e7162478b8f86fdfef9acddc4a075fafe71 py3k
+73873 3063714ff9f31c0fab6a1817a2f860da6d08fc00 legacy-trunk
+73874 638ea134aa82d72a2ac20baf218e0f4f9e820bfe py3k
+73875 de58f61386c3b49e55fc3dc9aa4e8b227625053f release26-maint
+73876 4168138c371e5d35104f7b756057524f0d94f0bd release31-maint
+73877 4ea8130ee09e84b44416917da12c1d6c15028595 legacy-trunk
+73878 81002c7600bd5d32019ec86129908b53c81f3987 py3k
+73879 adfd6b73d364741b4d8979a1064f438a3f41debd legacy-trunk
+73880 880b50bca1b1922f7d2b4e1eb45309b86db3b9f4 legacy-trunk
+73881 99e30af41169f05a756152bf930aff8d6cb65e8f release26-maint
+73882 ee156ec5efbf96d00d5460efa97ca0009abf4ee5 py3k
+73883 1f48cbd43226d26ed561f74815b181ab8559bded release31-maint
+73884 7fa21bdc348b4f6a1b7a822f57b5147833a59b94 legacy-trunk
+73885 1fd839b8330a1b6452a07c84f016f3a5061d2aa5 release26-maint
+73886 de6c48d73b716eeaf3bca7cc0a53219a3b7d51f5 py3k
+73887 fa080c4f539a9ea98b9ea4064f799796b9d27d95 release26-maint
+73888 897bded800206a6f5523d2190c5ac1bf000a3d80 legacy-trunk
+73889 8a844a5b16dbbf99323440bc83336be3df14c932 release26-maint
+73890 860a069d126c9baf60aa105f1c595e4fc0ad1f93 py3k
+73891 b3fb5e6b7e82d63fbc67a7e1c289df2c066d346d legacy-trunk
+73892 f02e471218b7791d409d53d71bac30ef54f57c54 release26-maint
+73893 8bef3a267e1ee84f3f7a6e3c7e4b8a6ee2dc7abf py3k
+73894 d9b19b37f81aecb831af0f983154ac49e87859b1 py3k
+73895 27b51626326916e7476a142acf80c07c6a9ad3bb legacy-trunk
+73896 d61c4dcf61898dbb725d912605a01009c7ea9a37 py3k
+73897 d599254c203bc697b6babcb02cede7dc50ede94b release31-maint
+73898 ba0459f2c0cb4005cddb0406d824049dde2e5f9c release26-maint
+73899 be736b490ab2c8bcd592aacb32f2cc27b9de577f legacy-trunk
+73900 468a40adf56f5e3f455071df2cb1e7e3a79aa043 legacy-trunk
+73901 c92b937755690b944e869a162107ab2e6b431f76 legacy-trunk
+73902 9afeae0babf9c4f658fb3e3b722d54f24941b170 release26-maint
+73903 13c5cf489797c45b6bad88b6a4d35052d2c2d85a py3k
+73904 8290519199ec2fb7a09ec7d8a86c18024d10318c release31-maint
+73905 4f1b2a457e83ce134a360ee6cc609282baf8d865 legacy-trunk
+73906 0f065b48acf95129d2777e2d2a7ac1772733409c legacy-trunk
+73907 5f4535225819bee14953379903ef55508e2763f6 legacy-trunk
+73908 5d9b3230181542388f0c60567ee28496bbf2b378 legacy-trunk
+73909 da2c147e929d0a1d0b1b068138018329e26f9c87 py3k
+73910 5a28a95dec19305e7eb0ff614bcd9900d6f77aae release26-maint
+73911 8a77ede4e175a8c64d2f7e05c1e4f81f032e7294 py3k
+73912 4ae1e96e93774c07ee441ea54caa2bf3b799723d release26-maint
+73913 c47ef4e107df908c718e9b514fbd1ada306f6897 py3k
+73914 b53e42e50c41532c8c90430aa8796dd8941b41d7 release26-maint
+73915 3898d520f107ff401d7d0bbde344698364e70333 release31-maint
+73916 5609352fea120e59d218e50f654b4f5a2e3afdb8 legacy-trunk
+73917 e89faaafa3eea2499e2c7d021d3aafe8c4fdf059 py3k
+73918 0b2aba7ac1faf6004d8a95b7dc21b1e93065a403 py3k
+73919 aedc220cc9bf8911229bfead472a1413ccc8d5fe py3k
+73920 01137e3b9ebe8f8d5acd059a2170ec8aaabc362c release31-maint
+73921 877bd7d50d897f4e6ffa82b0f9b83bbba773cff4 legacy-trunk
+73922 6f0e59fab62cff257ea77af5226575315814692d release26-maint
+73923 6264132724649ba4656432688e5d7c22aaabd73e py3k
+73924 d0b3af565eaa5a90ead4b95d4a534feb5686df2c release31-maint
+73925 e53d031e54d475c40670e041787f8a332318c325 legacy-trunk
+73926 03b86606ce0a2a78bc5e591e09e31f3639faeaf2 legacy-trunk
+73927 9b5d2818e2d0e702779c841f845bac5e62aa1082 release26-maint
+73928 139347b00c18f79c016969ed1cf8368fc74ceda2 py3k
+73929 2fd74c502600369111dfe02b1a369fa2dd78ce8d release31-maint
+73930 14cd19feaf20d8590e5d6d7cbe2adda97aa3031d legacy-trunk
+73931 cddd5164db03ca74e0b3ada042c627536ff4a3ab legacy-trunk
+73932 b1c6372a8092c3eb871c795aa26a0e2351774f81 legacy-trunk
+73933 221718e757bafad05bfee52bd39f379d8e609218 legacy-trunk
+73934 feaaa7cc02d122cf00be19b9c94a727e7995a655 py3k
+73935 e536a3b3a8d0e5b0a73125f2af36611c4d12dbe7 release31-maint
+73936 e200ee9ccc4bed6126bf2dd6ce63a3a5db8c592d py3k
+73937 acaa0c87d401f3593c3c7d10399014ac7389caa9 legacy-trunk
+73938 7b246945fc8cb0db56f62d0e6f4f4872c2daf549 legacy-trunk
+73939 b28dadd20d9b7b49ed06c6980d9ac60aa24d2f5b legacy-trunk
+73940 59c34a91c54d9fd0c4987bb513ee346d1e2b5d47 legacy-trunk
+73941 841a1e68b4edcccb2184fbcb21c5f3fc398e0971 py3k
+73942 67f5e01d5a6a71e257876dfe05c5b1685c67ed84 py3k
+73943 80661608d4e2057ccdc4747d1218bd135e501d9c py3k
+73944 4c5e075f5473da563cd9ea4656722af7dbb992e5 legacy-trunk
+73945 f3bf08329f07966b5ce09f42ff205602df6bfa77 legacy-trunk
+73946 822a02b71bbeb2c37b7b9c8b4614085a7fb238d1 legacy-trunk
+73947 c64f9dc3c6a4985b3945d47974023d34a437b474 release26-maint
+73948 57b3591f0cb232a47f2587a970f31715df6edd9e py3k
+73949 56ccef3420e781333609b915630f873a8b718e44 release31-maint
+73950 d27fdc70379c26a109ac66eeffeb631f694f0bde py3k
+73951 0b50e6841a81bdbe8e896a5c49ba075d900105c4 legacy-trunk
+73952 86820225a4d5afb762de9afd036299d800850266 legacy-trunk
+73953 a1b79778f22e3e24ca32c559c8f1a02f5a72017a release26-maint
+73954 3dadf3453d05509d68c4e35840626d14da770db8 legacy-trunk
+73955 93b48ab90ead0e5c5f6aa6bc762f31c2fcf8b2ed release26-maint
+73956 1028a991b68ec3e6c6cdaf382097e045f1ba4959 py3k
+73961 0c812870a975ec0b86967f1e9d4de45a91d74c01 py3k
+73962 2630c075b57cb357caa3924c0088e40b621894e9 legacy-trunk
+73963 493c7f950a2b9b5ba815dd595fc35ca392cfe015 legacy-trunk
+73970 848a5ac924b9b5008b005f488c51352bce86abc9 legacy-trunk
+73971 2a398edeb08d953c43624676f90327b0ea15e0ee release26-maint
+73975 d0f225865be6563cb830b0d2a044d4da67250623 py3k
+73976 318763ecc4b3043a61196e1827b7e97ecec73615 release31-maint
+73978 57e9f2d367a81d35bd7b2d0a60a261afae93240f py3k
+73979 acda692a847fce9e9527765b6103abc59d45414c legacy-trunk
+73980 f3b9c50a7aad5c00f0d5b324748b1c045c0992f5 py3k
+73982 88acc10caa6e11fbce9af7f495c145fef8f2ab63 release31-maint
+73983 5be04e2317e8d12a8be282572ee77d20aa0dea0f py3k
+73985 010a48e942237227f0733315e2113167dba5712a legacy-trunk
+73986 d076e65a90d6c19385a95fe79ced85b3e54e892a legacy-trunk
+73987 2b67cb925bb19e8699f496e408facd4128bca51d py3k
+73988 9507e4b9b988588529d75396b920ca60acd3a375 legacy-trunk
+73989 b74e3926281513a2092016dd4ef66a6f36490f90 legacy-trunk
+73990 b1d34dfffe2de01ec80d51435f50583598ed47a9 legacy-trunk
+73991 e172a88650cf9ae5716ddbd1e7feb64fbe5395bb legacy-trunk
+73992 bd74e2c973489a86f1dd87c4374e04220811097d py3k
+73993 4d2b5325ee48e85dc22b928dc45daf83373e719c py3k
+73994 daabcbf2415dd0a38939e12f4c1eb1f8d7e2ec54 legacy-trunk
+73995 32d48662aa5f36305286e34bb5c34d627e8a5503 legacy-trunk
+73996 8ebb90dc3b0450b39bd8a9bd0b285efb0ae0991a py3k
+73997 7bec6b4074f58471e3417eade552cd95943e15a3 release26-maint
+73998 737a6b33750563c02f7506130e2e05a46d13e9af legacy-trunk
+73999 6d9625dd92e7ebc5acf5941492cf51f1c0b857b4 py3k
+74000 41eb11290142e763562f28534c349b19e55c7514 legacy-trunk
+74001 aa22e7f3251782a7ce6f60f454609a8877ff57bf legacy-trunk
+74002 72c5e173aac5a681c95770cff8792302c3bc35c4 legacy-trunk
+74003 ef1b1198338bfad704878f05e9427cfc75e7d31a py3k
+74004 12439a033988a4ee21811b464c7738d1cff90784 py3k
+74005 29e7a4dd417ca255ffd8977740128a0fe583e57a legacy-trunk
+74006 0ed405c05cc304bff57d84fe7a5f42b83fd22f98 legacy-trunk
+74007 98bbb9634672a581dfc990f7ccd12cc07a9ef1c5 legacy-trunk
+74008 2073a989c01926b133ff2226a80def174e42e95f legacy-trunk
+74009 8c6606b32cb1c90f350e65b38103460ad1d5bd84 py3k
+74010 87b3121ce580ef213dcaa2bc2cec941998088fae py3k
+74011 93906b39ffecc4b1506ffc78fed638d0ad5d8776 legacy-trunk
+74012 a50eb596a6d3d1c2e74036fc4cabd58f471b6f64 py3k
+74013 edc714ffe6ccc3a33b894ecfb5dc9454700fcc1b py3k
+74014 3a316243bd6c6f5f635114af091a572ad8d8ddb6 legacy-trunk
+74015 a8922723a92d001f243c46a9cab88de7157630d1 py3k
+74016 73dcd183fae2d6d688a459367152a26b011bbc70 py3k
+74017 d1340a50a1b3076a5d5a9205a6f607cc03befc7b py3k
+74018 bd431a0e682749f42d8e99ae45c0e4689f4200ed py3k
+74019 1fd0f5697b40dbc1bfe2e41165f33b5b43245edd legacy-trunk
+74020 69a04dbd5f0a27d95068d1cd6ecb8273115e5549 legacy-trunk
+74021 dc084f4003bbbf680bc7f84088731a784c136219 legacy-trunk
+74022 98271468ab07a189f678394bd39bb8dff24e4500 legacy-trunk
+74023 3370d608e5aa485638ce9c20b8b81a9dc7588cb9 legacy-trunk
+74024 386452b2d9d5733784649a97836cf041365d3919 legacy-trunk
+74025 07750c55fd55fb8051461387b26be353000ca670 release26-maint
+74026 9b17d5469821b3f8e1e1d32eeb66b8b1dc169cbe py3k
+74027 f978dddb9b71fd88bdcce0de68f9cad67940e8ec release31-maint
+74028 ab63a262a113b954eb19c7ce29259347dd182657 legacy-trunk
+74029 7f1547f66ccf30c1e1bf00e77ea88d4020ddcdd0 legacy-trunk
+74030 fc8fb8eff20ec863808e7c66e6d634320da31fd9 py3k
+74031 e830e83f0f5ae4bb869988c42f8b9cb5e4c103e4 legacy-trunk
+74032 0ca80a2c77ffde88543672289871b3e84074a05f legacy-trunk
+74033 cfa004c1fd95d762a0318b514c4b229367ad4151 legacy-trunk
+74034 b16ae69d6484a70523b619bbbd24e66320f1c60a py3k
+74035 e621e3e3196ea41fdc31b3b20b18cc8a721f7190 py3k
+74036 cb3aa8bcd7b02d8a01e76bd69a5f4d24e1b4b7fa py3k
+74037 dce47c10d3fae1fef2fc2ff5080482755361b580 py3k
+74038 d2079d5adcfaa44a1ef51db5d672fe306d1f6b73 legacy-trunk
+74039 7f6d03b59865c3170b3108ff3b3a4f26d9ce27db legacy-trunk
+74040 2dab8d63eb555683ebd49c180a2cc3afb789b185 legacy-trunk
+74041 9e7529ef44d435d198ddc2627986d53530efd9e4 py3k
+74042 12a13e538a11d994f8fd56dcf2d17bc46fb2f321 legacy-trunk
+74043 130f1911d1465b46044e9b901661bc32dde57ed3 release26-maint
+74044 27e70d81ad575ebe231a764bdbe1d4bf3c89c1f1 legacy-trunk
+74045 b7b826f65e75dbecf5a447c8d962ce5ea138334b py3k
+74046 906ed119cb19b42cad247e45724894a5ec6dd86b py3k
+74047 8511c7c0d3effbcbfeb3f6cd09ceccc8ae69c5fb release31-maint
+74048 01abcd3730145f93df3b2fd18dde1347e489849b legacy-trunk
+74049 107e4fb93605fd89015176fef57f0ce51cbd74f1 py3k
+74050 1ec5c266d390df61fa89201ca41aceea6bc0b6a2 py3k
+74051 a29babb54884b516dae61618ac4c4c5a36d27d58 legacy-trunk
+74052 5d7d8524042632d3d916ab35ee43d61103f9fc2b legacy-trunk
+74053 59392180bf445ece1b8e3abaee74e4bb01d8761e py3k
+74054 b4287ff164e5bc9391499648375a354ebd729342 py3k
+74055 724dfeab3e9b91590aade18ce879b38037d7417e py3k
+74056 2fcdf967797de65469e9abfb8c247db597282b38 py3k
+74057 1c57debf97bc274d16fa22ee9ff983fbd92a0023 py3k
+74058 c075b974c35ca4d12fc918f4bd2fdca40767e800 py3k
+74059 a06169a872b3489cbc4b5daa010e543fe5e3f49b py3k
+74060 1db97ce4a850a0ce1c2dd4573d8dde5ece7e8dda py3k
+74061 20cc0eaa8926467ebabf7dd7e3bd4dfc1552cf77 py3k
+74062 763e512965fa78024acb91c97cc8ba77390d64b0 py3k
+74063 ea8ff8d62928a3cbc446d0e242ffcae8359d9ef5 py3k
+74064 8aa80b715c51c76e74f933f4aa9035b62cb776b9 py3k
+74066 36a7e96e90fb3a265205a537e676d6c05b92f58e py3k
+74067 db5b3d31864933b9ac3c5df233e0c867d83350a3 legacy-trunk
+74068 fe2b026ddf21cd1e5e7d6fa84e2e123aa99f8112 py3k
+74069 e2391d360ac247919c45753b91f39c581378bc4b legacy-trunk
+74070 bcdb7b187faa0543cc4da16e798845df3576faaf py3k
+74071 ab24ff646da88f55c43be5c453ded8d7e78b34a4 py3k
+74072 6e075ee48d4baea22febf1ca274720e2a4c881ad legacy-trunk
+74073 ba738af14dfcd41b32d57c52663dc5267008baa7 py3k
+74074 58b512edfdbb41ad0fabf7eef8c6ea808baa073d legacy-trunk
+74075 259138a988a5270a1d8718dc921f8a5ff4a6e4ce legacy-trunk
+74076 5ee2e965da6ede133c2101155209ec031fc07a29 py3k
+74077 0aa532117a4bb69f07c63ae47c5ea4303ca3b781 legacy-trunk
+74078 b051055b59f1942cca3b6156472d8107d7793232 py3k
+74079 a19eb9637ff7edffa15a6dd6906a8b46d3fffa24 release31-maint
+74080 9dc5aa62be72ff87bf8f999356e22e5e1b9190f0 legacy-trunk
+74081 66babe631037f7467771ae94fb47b140622f760b release26-maint
+74082 de1d52069d2dfcb726c9852da774aa65710ddc69 py3k
+74083 375563c6d3244a19d789cc06b95e538ced275b7c legacy-trunk
+74084 54b1f8024bc83c3634804ddf5a890d9256e592dd py3k
+74085 f20705875e806509752a6e532c4d71a475c42da5 release26-maint
+74086 c7042127196a515faef29e2e04cced27529dc6c8 release31-maint
+74087 4f178e59581312e78de17e47610f284c9f2f6bb6 py3k
+74088 ee0b9a931c94a496447a7e378b09da8ebf9d4a08 release31-maint
+74089 c336b3038d054642ae477a263713e41e333b8cb0 legacy-trunk
+74090 4612a2acdf2f607d7432b3deec2937db5500df73 py3k
+74091 6236adb366181d625ba3dc6b656f490a30919841 release26-maint
+74092 d60b559eead9f2974879df594dc189c7b58d6cc6 release31-maint
+74093 36636fa54f33339acb765ba680e635b01d64bd66 release26-maint
+74094 6ad25612408043a0dabe9cfd7c9680e73b7d0d39 py3k
+74095 f311395487c970f2ea852aa9ae7051ba00860392 legacy-trunk
+74096 ec1f32b72abe813267948530347bf7729137efba py3k
+74097 af977e94e2fdd4e3c74ee53f2ede64c2996faed7 py3k
+74098 3a613e00f66d348bc3cae22ab2b6581b19f84928 legacy-trunk
+74099 e62957a0ee14237d039fca6228011674cfce265b py3k
+74100 eead7807df7cc078fcea99c5fbe9c1e6a184ecef legacy-trunk
+74101 c0acae19b487676a761770880b7a396bdcddac3f py3k
+74102 eaf4a00484bdbd83ed0212d0e4a47cffe7a4afa2 py3k
+74103 ae2c056c46d344703e2d9bd53bef250a1d8b84e5 py3k
+74104 81c8b304163e3adad8f5cd28e8ad6287d8dbada4 release31-maint
+74105 0af9407c88d2e6ef1b411507cf32477ed89f8bd3 release31-maint
+74106 5cf68d3b65324899f5fc40d0ff493a4920dd547b py3k
+74107 a640bb3b9c2bb6bd2b70add768ed3de2f21c3313 py3k
+74108 f50290797fb50a530d87bcddd727968ef671047e release31-maint
+74109 fe7988a570dff213e007d52683431dbd59991ada release31-maint
+74110 dfaf6de2c8ce7a344ea87f88ef71a2db90cee65e py3k
+74111 d826a0cc2c0e0e61f79ab32e1661e123dfbcf2ea legacy-trunk
+74112 d1d8254c4ed5c6f889ccd494efe554c2a730ac24 release26-maint
+74114 732f72cbaf7d84cccf613d5ae908eeb11dcef333 legacy-trunk
+74115 0acf249015ca4cb3d0958133f92cbd59d7c950dd py3k
+74117 01b763ceb40873e8934f77d839df5e39e65414bc legacy-trunk
+74118 aacdc735f19b185c2fd211701c1a463d67e7cfb1 py3k
+74119 7bf8fc20037a1cb21b03d1df0886352a89eb21b9 legacy-trunk
+74120 860e712e32e0dff8bf30dfed2da3fabb669abb94 py3k
+74123 01e2e9add070fb42235ba8ffbafd28142e51ca5d legacy-trunk
+74124 3832cf03687bb3950a5c25af91e3a90630e82e47 py3k
+74125 cc9fefcdd533c4b73a7f342a80bae623f5f45f2d py3k
+74126 cfab11dd3e73e586f0143934b22043499e7f42fe py3k
+74128 63fd17ba98753062978ba11c59aee9c122b70695 py3k
+74129 2cf9d18d3df54c9fc7b188728dbd1d318c89541f py3k
+74130 0b1f1d7b2e6dfd0596ce4429a81f762c6c7e2569 py3k
+74131 3c4490ad01cf076da04962f292681cb443cb0f83 py3k
+74132 79718ee0398629ac41c032d7c09d803d78e164e1 py3k
+74133 ebc9856a9bdb2601f431d63aa988e2c697bcc1b7 py3k
+74134 561364a34b0c46d1344fe29f80ad2bcefbf06b02 legacy-trunk
+74135 0a20edf3f7db89eb8def6768fa95338866201b16 py3k
+74136 6f8736737994dc119a98345e96d6e2ef0aebe040 release31-maint
+74137 9ff5bd16016b407c67974ba26ea00e085d390ae0 release31-maint
+74138 21e5831cbae8abbc339ae28d156baa9cb44cc7ef release31-maint
+74139 3815abed9279b8d811c84bc4f5e8ab199a6b65e4 legacy-trunk
+74140 c28e61c5bdf829fc0fd47a4cdba8ee97b6986ea7 py3k
+74141 9499c232edb73fb70269f9572106b44b9f45f587 release31-maint
+74142 4df70500dbe34d578b80cc156084f31145ff5ddb release26-maint
+74143 03f5c67df18e2b6c54d82521b8fc65f62fc3c306 release31-maint
+74144 8d6ead2acca004f57057a01520671712558a631e release26-maint
+74145 fda9062ebfa4c871e9ca7c78f50c015e4221e9df release26-maint
+74146 cdc749d9c021b97ec67ec74190fd1e0f5ee7628d release26-maint
+74147 7dce404fc8eb5b33c306b5859731ac9564cf2853 legacy-trunk
+74148 3612a4eca5d51ccab1efc78f2f6b0b3782dffeba legacy-trunk
+74149 b40eeb8f69ca7bb64592c69faffdeb12be07c6c0 py3k
+74150 c30fa8c5e3246f96c09ac9e80ed3e3a11127726b legacy-trunk
+74151 e40506edcb3e157a09ee720d027471531074837e py3k
+74152 6bb01887f4756767611f28139e5f68244e93371e legacy-trunk
+74153 24a2acf1291c9413722f31a3a56517db001f7bd3 py3k
+74154 abfd5f78f466ae170300858d6d37d9b6ad9d05c9 py3k
+74155 d747d52f9a66906e52c17ce334951d18ee16195c py3k
+74156 f79043369625ff9f6f28b24d31605bbfa48d4e1d py3k
+74157 d682ca888e2794b17a56f19aea2ef3ce40769c46 py3k
+74158 538850b3893109071c51480a8488c522901c27b4 py3k
+74159 b7aabba84ee1a0a99adb0283dd6c79e021b7f4e9 py3k
+74160 59e5f299daa020c5cbeee2458427ec463a92dc00 py3k
+74161 ec85a51de9cf48e9028e952179e4e80396528944 py3k
+74162 df5a708607810bf096385371998cb94f85ee92dc py3k
+74163 cc9a1a3e3fb81e43286c4c3cb80bc8fd93d65acc legacy-trunk
+74164 1ecb07e11a2dcc61fe3e5231c4233cfc9f82caa1 py3k
+74165 9c2111cfd97436db2a224ff31db800a3bb9c6e64 release31-maint
+74166 0763460b0b381dfed61df2c0780d5868e7f41e40 release26-maint
+74167 1480fae3b703fcd7d004d6e982bac3b080d01007 legacy-trunk
+74168 74aaeb9c35fbd114ea21b3abdbe99afcf361aa6c release26-maint
+74169 cb46a0d789c670f54a8d90f401c281a414863be1 py3k
+74170 25cf775a71519fff6060b957e59b21bd5988a5a6 release31-maint
+74171 03cf4cb4a1501d5a369bcfb2dc44928de44ff1ea py3k
+74172 908b39764c738d715c9abcfaf0bf68e43f8b7f89 release31-maint
+74173 1327af56ea49ab85b1b2352950a86318c5efcfc1 legacy-trunk
+74174 e650a9d64ab5c6e28bdf8e469b8efe4e0a009ff2 py3k
+74175 94fc433c437346ab6280421fdfb3ec8b5ea504f2 legacy-trunk
+74176 a0eacb5f9d8aa352a6e62eba2678eee42b8340e2 release26-maint
+74177 df1744319466c8cbf874e8ec9bd7be3c653d501c py3k
+74178 260fb421ac07a140895080e3620b5df8c8fff3d6 release31-maint
+74179 9dda02afa8ed007c7a13872640f42877c5c4f811 legacy-trunk
+74180 025a6428a764f5e4509192b7827c2e1b8523912b py3k
+74181 b964065512b1557addafa2b5f4b999bbe88f7d0d py3k
+74182 b11a7524e558f1ca3f22d80df9a3c54fde53f443 py3k
+74183 207541c987442d6bbbf9f6df4f8d0564981f03a5 py3k
+74184 7422d789fdca9b2e91bc0c589fcbca81ab8c0404 legacy-trunk
+74185 977602b3e140dcbda3919196b7ca1e1e1653e37b legacy-trunk
+74186 eca0207bb77f091a9945846c896ab42627b4b6a5 py3k
+74187 2e947245958b01c9e32bbe2bf4c9f119c6998290 legacy-trunk
+74188 60523418f8c8e9551792f3ee1c47456ee14a34f0 legacy-trunk
+74189 2fb10577c621e29ffb95e452bc5b2582142e9752 legacy-trunk
+74190 868b4e639b5ab1b8e71a6ad82c32c0f5c6a879e5 release26-maint
+74191 b77bb5321108891ef264774831c8846b216c2458 py3k
+74192 c00b08842d7fd4bd3138b497e692012d97852242 legacy-trunk
+74193 e99013a9d2f9ca4e0c363dc0adf406ae56ac42b1 legacy-trunk
+74194 d98b8a6ec2b84c5b78011734604ea56c4dd4f168 legacy-trunk
+74195 61a065b3001d87d56b39bc07aedc2d179bc19b39 py3k
+74196 759622d0ae284756a4adfe8a23c49efb8ea0503e py3k
+74197 cffb1e963dd8a0772211c0754dbadf77201f6f2e legacy-trunk
+74198 d1ec95ae0ac2846bd8c96e2c58c6cf3c5858de95 py3k
+74199 a14c08f8e77b5f8d9fd13ed8ae65e7434bd38904 py3k
+74200 7d4608006cfac37cc90849a12ae5e849fe24b61e legacy-trunk
+74201 6c7b4b47082775ab7bd76e49c1413f4c70c39857 legacy-trunk
+74202 4b1216f4fcb5b0c2211060788bae9e1a94d701a1 py3k
+74203 0f57b30a152f46191da6c28f9eb6631def77f80d release26-maint
+74204 5112a56df977a1c1f9f98440b325958dbcb4dcc3 release31-maint
+74205 724a1011e897a7b9f32ae27d4101a8978e5d3162 legacy-trunk
+74206 0b893c6ead4c736fe9d8c2872bc639bf012cdb03 release31-maint
+74207 1bde8455222c3489a6f3b28a4ad97fa8cf035f42 legacy-trunk
+74208 a55634ce811838de80cef411ac0868be94e81302 release30-maint
+74209 bbd1d90d158abddd551903ae7478a57c9f7a84b2 legacy-trunk
+74210 42db1cf39afdbac50c2851c5253ba227c23d2347 legacy-trunk
+74211 6789d840621f4d0dcc6e554d996cee9d1d758bd9 py3k
+74212 2f8a362e373d950cc9b80ef045f50adc1e1f1f50 py3k
+74213 15b61f327d5095dba8b5cb2dbe0c15cf92f3e48d py3k
+74214 9bf206857d7e79ce2d9f50b1210d235527812430 py3k
+74215 c10773bbafa03593e6b602d55e1b51ec4cc06909 release26-maint
+74216 b71eeb9070937b562f27233eed53e8065624899e legacy-trunk
+74217 0f0163f8c5b56cfd2fff5a9f9bc8374e2e365b99 py3k
+74218 89ebe43244aebf6bc3cbf1e77315752afc0b7afb release26-maint
+74219 0d203ca3ac78edf0459ecb4cb552290bfb789599 legacy-trunk
+74220 a9b507ecda4c9d272b3338718cf3621dce4fa4d0 release26-maint
+74221 8c21fffb06c4614acabb7911e7a60d4d979ead79 py3k
+74222 fc469af6eb7026be8dac8c7a2cc1925436ccfc22 py3k
+74223 06b86a6e28f1a14357ed4758a71cde41ad3be909 release31-maint
+74224 74dc7bb4f4643b3d6fe80227a59af2f69b22dcbc py3k
+74225 607cd119fe4b978a3d9f51f5287e32014528bca7 legacy-trunk
+74226 1326ef86f3e40d326f6ccf5e2f277cc5afd9b4f9 py3k
+74227 b34cae786cb03e467242bf548cebfdc460eb75c1 release31-maint
+74228 c853a3d2a19d3592df2291023c9919fcaa8fe80c legacy-trunk
+74229 7212e3e0cd17507075224ff005b69273b35fb9ba release26-maint
+74230 0f8b56ef0f7f4de1970eb4d08788a1a23ddda8f1 legacy-trunk
+74231 7fd9adc812800c135df0d26b4533ca887a475136 release26-maint
+74232 44318210b03c70abed2ed76511678f3894b6525a py3k
+74233 01f848ea110ae3d590c4b2f30faffd31f935e0eb release31-maint
+74234 da98cbebdacba29d06648e9b3a7af43f5b5b5185 legacy-trunk
+74235 bb0b7d0e550d80a8798276ddcdf09e1b4155e3ae release26-maint
+74236 07dbdf03e8f50307298a2f1510ca2c771dec0b9e py3k
+74237 3d45367cc62aa7ffb9922a4690b52ada3668aa13 py3k
+74238 adf484df67948e48b16256be1ed7e7d418f0ae57 release31-maint
+74239 aa9ff47bd1c8ee56549b15e7aeb8f50a9fb9fd12 legacy-trunk
+74240 56b2da93ad9c8232de5aa0b95eb32f271e390585 legacy-trunk
+74241 89ad20a32a26031078635eb67df0a473d1f43d45 release26-maint
+74242 bcd39effd31e3786fdb6b36587ea21fa202b96c1 py3k
+74243 8898f28e6d2c1a954a65a6b0f0444a76a1c955f4 legacy-trunk
+74244 572c187df612e276a273f67c95f8803fda30d29b py3k
+74245 1dfd6f407336ca02733ae4529228b93adafb0c8d legacy-trunk
+74246 5e05889096cd080e71220236ff357088a1c0cae5 py3k
+74247 8a017d3cb928ae72ea010b93a642908a419f37e0 py3k
+74248 9fffd3edb6689fdad255442792bfb0c8fbd25014 release26-maint
+74249 a5d025ad21c8ea14fad380ad02b932e3229ae8e4 py3k
+74250 f357e2603d93beb15facc57a3f7fcbfb444d3cb8 release31-maint
+74251 60b31f0db0163846ae2a2a6f679e56ab292ee4b6 release31-maint
+74252 ee25459e9b91facac476d47d1b6cb265c12d42bf legacy-trunk
+74253 3ed1593dd174720276ba71258c103bcc55d6d12f legacy-trunk
+74254 15683c0eaf28632d627ea0a520bff61ea8b7828a py3k
+74255 64af4160cf1eb9f93ddac87673ca0045eebe8116 release30-maint
+74256 fa14f81322ce071878f3d6cd25b600433f0c7e56 legacy-trunk
+74257 1df281c9e1821fc9c50dec87f8f1c739a7785edf py3k
+74258 137599acb8baa31800762c7fd51fc7c40bcc43f3 legacy-trunk
+74259 93883f3787b579b97811421820b839bc928b5feb legacy-trunk
+74260 4fe5801bf71217ba47688416e21f888dcb71a3a3 legacy-trunk
+74261 5be4c09e4a66628e498ca3a538dd6ea177a69053 legacy-trunk
+74262 7aa0d6fa6359f178a34f613f7d342557f7a776d3 py3k
+74263 d29d1d8e2cd6369f1214cb606f1f62ff3daa619e py3k
+74264 3e0ce94c2e1e0f10417940dfe3c8a123d5b75837 py3k
+74265 bd03d6d2efb0950dc37779ac376a9dd3431a7717 legacy-trunk
+74266 4d44f2a38e51ef20821487ff817971456fc7d9dc release26-maint
+74267 0535741b57bb20b6d6475b3ddd5ce28ffa388ddb py3k
+74268 65050e826a96db5605ed7db32b340607b18c2f5e release31-maint
+74269 16fa570629e3f44cccb790d2f073cbdcc4ea498a legacy-trunk
+74270 19611a29c8de7e8112102744c14f37bdb1ca632d release26-maint
+74271 55e02fa7a11c0ea99a04dd603a3746156721dedb py3k
+74272 04121615955a28c0536de8cd470b2e7ed7e941be release31-maint
+74273 2c7e076b4ca9d828e3a3157e5afcc5fa3d164c49 release26-maint
+74277 3af3fb1686383af1eaf14b4f1601f096de68a160 legacy-trunk
+74278 83b46a5988b0eb510de4238897d498e771e16813 py3k
+74279 746a818bdd352b6a94859332575a10e2b416b4a1 py3k
+74280 88255cb4534dad5e4e65be2989808de04019f472 release31-maint
+74281 7c23f0bcca85cec5830161429fdfbc5a35bad3c5 legacy-trunk
+74282 8b48b282eba93960c04cbc4a5edf6024ea1e79a6 release26-maint
+74283 4ae04e0f685038e4d69dd96c2f61973891ae31fc py3k
+74284 79789e89ff78485a3fd7c5f8a60ac663fa19def8 release31-maint
+74285 d25373266729763768c252da9917c3af2d905637 legacy-trunk
+74286 f42e07ab326ec5ad8969bf547c987954f7f95be5 release26-maint
+74287 46f9be250912f6135d0e0748b09987e30f613181 py3k
+74288 cfbefdcc26db2f52f29870d06c9a300f2df0a2c6 release31-maint
+74289 e1ac54bb08ed29c293351ee565de0fe3e09841d7 py3k
+74290 08eca6e8b0befbb1c8dd390034c40fbdf2563c45 release31-maint
+74291 46e46a0e622e602f0e294ce5f56a55b42ba4c7b1 legacy-trunk
+74292 002946b52fc3e7e76324066d6550fdeb404bd2f1 release26-maint
+74293 d99cadf0e5f0c96147291203f90ea447c86b3bd7 py3k
+74294 cfa7e943ffc3ff0194f479de30e0a71617dada63 release31-maint
+74297 502ce28febaab74cd26455a9da255c6e1b442502 py3k
+74298 fa6fd1ed737883a97c2b86e5f4c0ae34661b5a39 release31-maint
+74299 dd4da75ebc9715db933923cf58794fce5efbee90 release26-maint
+74300 271d382dcabdffc2eef24c3b5fc9fe5a980a55d7 legacy-trunk
+74301 658de84381d7f37c4f2e7da56e1cd02c43c7fd6d release31-maint
+74302 5345e3bc9e4162bff5dd8a52085d3ce11a407fa6 py3k
+74303 a0e1d627b71835550db4228539f9620c0182f0e9 legacy-trunk
+74304 34277da38e388b79d88417b1b897c1f5fbddf591 release26-maint
+74305 cd9fa81ea48013899180c9ddab1cb6c8aaa4c326 py3k
+74306 8848c49ed5f57747489a40e43f3e01247e4c2e26 release31-maint
+74307 2fae809450cd11f710a6f7a5e1dd962a5ef25d4a legacy-trunk
+74308 6a05ec493ce9e3f18c69edc2304c73525b965b5a release26-maint
+74309 e8025b85ab1827c65034c9fcf58a4b74fbf698e5 py3k
+74310 3ff1725f837eae166e0d9c47c3425a26dbe33058 release31-maint
+74311 5de19c5011ca93674109366589f78ba79ead2410 py3k
+74312 5d875fadf63f5358c73c69a9c53d6eb89263131d legacy-trunk
+74313 b1775187aa30e7372e18374679ca40b8a916cad3 py3k
+74314 08386c79e34f0fcdc27439cbe319d0c338b4c784 release26-maint
+74315 eb22442194199925ee7f606e3994c83de98b56a1 release31-maint
+74316 9a43fac8760c2f93f972c034c4e10d94186e2da3 py3k
+74317 c8f4c132d6db04e9a43e8174c95c377de8919f57 tk_and_idle_maintenance
+74318 642485dbffbaa1030f3b1998bc8c60f7c0671fbf tk_and_idle_maintenance
+74319 bd1bccd8e344b9fdd43ce1366a562d08263bda73 tk_and_idle_maintenance
+74320 ba802c0b538a796923766b3eaa893a6dc128864c tk_and_idle_maintenance
+74321 fcea7ba4b034dcb2440814efb9b8d0bf8cb81be3 legacy-trunk
+74322 75942bc74f71231332fce6b6f232e5244ef57000 tk_and_idle_maintenance
+74323 0c4ee62df0e190be6e0f28ec18530a91d937159f legacy-trunk
+74324 192e3444b888fa4531f4f089e931a1843e7cd99a tk_and_idle_maintenance
+74325 e5733d58fdb15a7804ac69a4e119a9a1e43756a9 tk_and_idle_maintenance
+74326 5a130b7585b1ce5c515251d386befe50701475bc legacy-trunk
+74327 65d1682dcd5e0e58b0dab2c151f39a4ba4d343d7 release26-maint
+74328 1be3d427aca24466a0bb10abcf52c59edac2ed45 legacy-trunk
+74329 06ce9d8468c2f0669e9e6b0b184f851ac65de35c release26-maint
+74330 7f3f6b55e47a28c7fce4df159f9856cb20e4a8a2 py3k
+74331 9fdf182f19a913d139358b7b2bfcbf174e9bb6db release31-maint
+74332 93a96d6dffb5e932dae0c5506b09d887093c564f legacy-trunk
+74333 7b66cd02d60ba801a509878bfdc24b657e46164e legacy-trunk
+74334 3159726d0e659cc685bcf8feaf92df4eb2b928f3 py3k
+74335 4f204eb76e07a26a667f9302cd43f4be033040a5 py3k
+74336 2f641e337c9f96a929d43b8559442fef1d4e8a23 legacy-trunk
+74337 00fd6297ebe7b0df8e1a08b6fb908b672f52fc90 release26-maint
+74338 f13602a84daaafd6f2c2180640758e3d51e555b4 py3k
+74339 308879ec90234de35c5cbf01084a008498585101 release31-maint
+74340 19e7c996e67aebe483fc4216e54598fa94a47237 py3k
+74341 efa8811b250a3c659f5aa560d93c4a573a2f4820 release31-maint
+74348 85c0d8d83cbffb62ab8386252029b6e9903452f9 tk_and_idle_maintenance
+74349 b002e92a36f77468f8f668be10cf03e54a00eee8 tk_and_idle_maintenance
+74350 412a85ce5844ad8d6e902b7c0a22b16180e6c50e tk_and_idle_maintenance
+74351 94d8c341fb42f2240ec91260cea85a873a98d462 tk_and_idle_maintenance
+74352 cd20a9ed84e5a3bf10dfb4682212c43087535fe7 tk_and_idle_maintenance
+74353 11286b453fcffb3955734213ca418a6b3d9b0217 tk_and_idle_maintenance
+74354 e4a6744ce4a9d7af957366070571851058060b27 tk_and_idle_maintenance
+74355 ca6e90470d96fd3acc26f25ed185d0ac1334d1aa legacy-trunk
+74356 361a03ad3c373bc5c757f6fec21f92f1ea5d2555 py3k
+74357 bbea98148e126610451e13b544a64bb9443f43b3 py3k
+74358 5c8b2238a2f524c8d74471515e1e2db38c0067d3 release31-maint
+74360 e5aebd038f0c2ad25e5d6d1590d6da83860c332b tk_and_idle_maintenance
+74361 2c64e9bfb1b6665e6bebf4ab426f41845e25cdd2 tk_and_idle_maintenance
+74362 b013b3c8c9c7f5d9ee30f5b7ad1fb72f18adf73b tk_and_idle_maintenance
+74363 c19e790d942f7909d66acba8e296067c32ce0090 tk_and_idle_maintenance
+74364 0025e072fe97ad792b7e5dc1d71ca6e3d0bf7d01 tk_and_idle_maintenance
+74365 123c95fe04b6083053d6186b4a3589b3e54e70ba legacy-trunk
+74366 ef56535f53561808e53181e43d79c700de192fc2 py3k
+74367 4a1ab2d703859a4b8c980825d45122390a5bd091 release31-maint
+74368 984985ea24c4dce29496d4493880185e868ab592 py3k
+74369 4a9b8591649fbd6e4441eedcb0b68c2b4ac46175 release31-maint
+74370 e00b50a3d499d5e1d4a04d03b0c5239083dffa2f release31-maint
+74371 7b495c8f2a240ea807504c58dcde1728834181e5 release31-maint
+74372 1acd0277d22530e5c12b99925efd09a4cd7f28b6 release31-maint
+74373 a492b2bc951b434e5759918931e8ec6787258080 release31-maint
+74374 5095a5276d8c26670cb10e3657a84efe2024aa37 release31-maint
+74375 5fbac09c0e91db2fab644c9e0eb857aadb83f5c3 release31-maint
+74376 58c10cf046167e1001aa5e8e03cd08197d932ebc release31-maint
+74377 dad0a54f5a583eb93d934a3d863ce0fd9cb4e40f release31-maint
+74378 59b6b8557a3329f0c6220b5fe9e2ffc2be30adf1 release31-maint
+74379 17e71485287f71f16b0e5245a65019aeacd445f9 release31-maint
+74380 546aa134d7737a3071ec4aab56fb5139b26b523d release31-maint
+74381 770a93c7abff77a7740473d8bb42e50feb3bbd30 release31-maint
+74382 c4d6b77c3468154f6cf146901598cf37f173c282 release31-maint
+74383 10940bcedc99e47855f3cb3e593e6941d9eb5a6a release31-maint
+74384 0bb232078b8cb815f098390c1c117459d7826761 release31-maint
+74385 d7f3cdf2b07f789a1aca67db653ba9ccf8546c00 release31-maint
+74386 0f7a6eb18223174d646643b56b8b166829d91952 release31-maint
+74387 7ee7fdcea0d716fa9abf3d18955c51ca814be015 release31-maint
+74388 efe808a5f59e8897b55639b885edae89f99833ae release31-maint
+74389 743fa282d74813849900448faf06ce7d3f7a245b release31-maint
+74390 ce6642218ffec1a8cc6914c303e67d4749a79635 release31-maint
+74391 34ea588ac3c5883ca613f463ff95ebf1fe88cf1a release31-maint
+74392 94c28ba656be07d43e3a06d3c438e5038d5b6a74 release31-maint
+74393 680ad8eed33b27d90a163422ec74330658d62138 release31-maint
+74394 12fec73cb8e53d96091a3c34bdfb121afb48f171 release31-maint
+74395 6e2ba2376833b6bf1c85bfa6d47cbaedd4384832 release31-maint
+74396 7e51417046ab8710b800f2c1b7c9f3206ed93ff5 release31-maint
+74397 ff6eea017a7f4641842b1ff289e5ee9326655ac0 release31-maint
+74398 5414ff7389ee981ed72e80483165bb4e0c3fd5cc py3k
+74399 87fdf2795a7cd4436843ae1dd4073264c03ab251 release31-maint
+74400 9d40586a6afcde01efcfb6fa95634cc00daccef5 release31-maint
+74401 f7243199d0b1ccb12deaf658d5de1b15cf379222 release31-maint
+74402 4d38e51e7cdc9a97943f67853fc29e110d193b7d release31-maint
+74403 0050b5711faa6b7b8ebaeeec7d761df5d3ca482d py3k
+74404 e05322efca857a9f51c0a4c581e6a0c28fdb6338 legacy-trunk
+74405 be34531c6d0b749f8599f85ed034de8ecd0a3294 py3k
+74406 56e8c22df71f31669765d22c4392d0edec68e666 release31-maint
+74407 91e40eb41956a045d1021271fe5cf24f5217d17f release31-maint
+74408 a267c604465f374d63894b9578519364b422c58e release31-maint
+74409 0148417e1301d893d8d4513e5170c2e3294d9dbd release31-maint
+74410 be343af490999535522506ec3d43e42f9bde9613 release31-maint
+74411 af110a48d1547faa6e4de250e5a6819da68704be legacy-trunk
+74412 785ec34476bafa58566e776743e8a99ff14787ac py3k
+74413 e3d51319b9d0ec837cc1376dc571980fcd74a680 release31-maint
+74414 1224aa3fb6a0d467681acb0ab7dd70df73cd23b6 tk_and_idle_maintenance
+74415 7c8f481160c22e0712b5eca31fe8f1980dc5b55d tk_and_idle_maintenance
+74417 f2a12f5259e7edd223c750e05ef56162d6a5345e release31-maint
+74418 f8db493dd84fb830d9acb40cb344ae60ff29e3b9 release31-maint
+74420 faf8a100990d66cd5101d487bbf9ae807d02e23b tk_and_idle_maintenance
+74421 3a35e33b071bd4ed276a1a0d9d005602f3a2b41d tk_and_idle_maintenance
+74422 9bc9588eb64c19106823afa5f7f2669abcac5b8b tk_and_idle_maintenance
+74423 381c6f9b74aeae6cc3fa5dfaa9b68c093cee45f0 release31-maint
+74424 49629103758209662eb3963784c1cc0455ef8184 tk_and_idle_maintenance
+74425 fb5857f903fe9375abda33ac054779d1ca83ee4c release31-maint
+74426 fbf8b791ce811b4903c420b55f88cd5094262f82 legacy-trunk
+74427 35efb1054ec6ceca72017a587263cb6a9257340b release31-maint
+74428 a1ad192f8df56437390c2ad88cd132d960b0620d release31-maint
+74429 97522e27b05d0c8238dd74f557f94c35a6b26cd5 legacy-trunk
+74430 9a6beb1a9397573ddf9d8d98bd164ac5cc248861 tk_and_idle_maintenance
+74431 eeafd8716410a6c4dc3b798a33e3d574a367e045 tk_and_idle_maintenance
+74432 6ac1478d9b0e66198f9fc6797520b9af95592fdb release26-maint
+74433 5152b536612e4878fd00d5767a5a721a4778c317 tk_and_idle_maintenance
+74434 01db410f2f207ff005e59a7b93d3bb10238d1a7f tk_and_idle_maintenance
+74435 89927f5e83d6f79451269256a35c5d19c2978ca9 py3k
+74436 d5a62dd90789887803b950170cdd367846865c2f release31-maint
+74437 a5e6f3ff2e2f64799f8c06c0db8f17e27fb49d00 tk_and_idle_maintenance
+74438 49a428669788d678d526c667f6ff39a66616b662 tk_and_idle_maintenance
+74439 42759a6ee98ac5d36ac206d108c5103293d38af7 tk_and_idle_maintenance
+74440 1fc89014bd83db08b5e5a9be8d7085cbb1b001c9 tk_and_idle_maintenance
+74441 fe28645a61226f805521837f5824b8cf2d746e67 tk_and_idle_maintenance
+74442 beb12bb7791bf77933a277f274de747893d96e59 release26-maint
+74443 1fb7e2f7f0bb4e24cbea8a3d6375307be96685ad py3k
+74444 5ea3d467564a52a1e9183b6ecdb28b6c502bd006 release31-maint
+74445 51e5a414b3c247f2f75a5380da1fbc8902a15cc5 legacy-trunk
+74446 a0f80dc09dfe2289f8c452163d67af28a2d7917e legacy-trunk
+74447 c6d32766e94c80b46a2c683d66f2664df7f16c89 legacy-trunk
+74448 b7a571d4aaa7e1f4a4bb6f7a507828dafa7993f1 legacy-trunk
+74449 ae817fa4e60566eacb42867f942f9bbce2713a1e legacy-trunk
+74450 e4a83e91521a369dc8d82763b35b4888c1380017 py3k
+74451 d724ca8c582347b3a10407fd46c52ef2b7ddb314 tk_and_idle_maintenance
+74452 41b01bb906e3969cdfaac6520ea58a4aed4bdef8 tk_and_idle_maintenance
+74453 d7140bbc6473be49b7b629816e6f99a67823a549 tk_and_idle_maintenance
+74454 d44e3aa42a5bc78172637fac68560b46830895e0 tk_and_idle_maintenance
+74455 002087187b2ff670fc07136760ab0d937a4d4834 tk_and_idle_maintenance
+74456 f91c1d288343489566daa7d7ade5d2d26cee682b release26-maint
+74457 113c0b86fd749a7fcbf86ac99c60618c64fe9f4e legacy-trunk
+74458 bc1c403054e1c77fa720ea7896cd97a3784572f9 release26-maint
+74459 30963cfb69fd820bb80d6d3e5f8b444d27852ee9 py3k
+74460 4c51c4bffb21a70f91e7f910e319db0b7368afa0 release31-maint
+74461 643c6c7684b165c8f26898a0b22411da38dc1326 py3k
+74462 2277ebceda43a6c185a3eda981017fb8fe705449 release26-maint
+74463 1377a8c267922576411e3eb9ea33d9693d49511e legacy-trunk
+74464 1e2877026435ebdb3aec2dcbafcfd9c7f6ef0243 legacy-trunk
+74465 00530287bdb51131e9566e6e60d9deaca2b5bd78 legacy-trunk
+74466 384334d8b9875be6281290c94b25fd3b019e10f2 py3k
+74467 0fcf40a140e5edbc0976556d320b84f6c59726bc legacy-trunk
+74468 19fc0d05fa7a49bd5d3dee987c40fc2ada7ae2df py3k
+74469 fb7d5ee908a502a9650bbfd7e4efcedd9316d336 py3k
+74470 6ac2a64e826be4544862f2391bf3194dec6ee0a0 release31-maint
+74471 1227e7cc1d9b18cde8822b4255fe25781fc45a08 legacy-trunk
+74472 c630bf05ce38dfe2e72090564a4b65334428c69c legacy-trunk
+74473 bec3405e073f342f98812bf0763d80517e7dfca5 py3k
+74474 6afa5bbdc3754b6465f84827e8f39f4d018b5cd4 py3k
+74475 d7e1d3978dd60053be8f07532506950bfef29d9e legacy-trunk
+74476 e52009e22017d51a40cde8eb80185607c37a7838 py3k
+74477 6da6edfa6296c2bd0a9fce2375f2044abf5ecbf9 legacy-trunk
+74478 495eeff3b9ff0dbbf9c4f409c18a539cc3f187f9 py3k
+74479 746f10e0624e9f3e47929891ebd8659c4834853e legacy-trunk
+74480 8b9c0f573ab29c41c6c5fdcca82a1fe0ff5355af release31-maint
+74481 5ef6bc00520ab018d87aa97b3e703701342bf819 release31-maint
+74482 da21b480ff0523556bc78e99ef792131de575161 py3k
+74483 deffe6aa43d114e8bf5ee1390f8d8e921d34c822 tk_and_idle_maintenance
+74484 34c6f6d26976d3a69fe46fba9ce1e74d34045cd3 tk_and_idle_maintenance
+74485 428632a590adace3b87a470aeb5e3361b86cea6b tk_and_idle_maintenance
+74486 7875deac410c9c3bf4041de7d9dfcbaf87ed04a6 tk_and_idle_maintenance
+74487 f6e17aeb92abc88e0d54bce38d16c8650b9d9305 tk_and_idle_maintenance
+74488 42b256794e6c51219bffdf1f104b20ddadbce59d legacy-trunk
+74489 4d08818b6c4a1d8873b0d83ad6bcb3f24a151e59 py3k
+74490 217bcb8603aad15c937548f5f78d41cb615e271b legacy-trunk
+74491 0b07c03a5f3c36844015075041f0a0b4d10a1adc tk_and_idle_maintenance
+74492 4eac132fac94b84f2bb41337aba2fb9bef47b4e5 legacy-trunk
+74493 384f965e12cdf1d889aaf0e9824207b509a338a8 legacy-trunk
+74494 6b088dcf25f8c89baa88d9016b8de8efd5195439 py3k
+74495 2aaf7d141bd0fed96f9a27bd9784b69870864631 legacy-trunk
+74496 2821e5e76e8291c278fa8d9d05f9cd6de18fae90 py3k
+74497 b563ab0171d9238b1dc8e5bd9538aa0325bcc92e release26-maint
+74498 e3a0d4b0d7aa02092c37c29443754edb999a75e7 release26-maint
+74499 c87aaccc70b61800027f29faef3ab8b905433902 release31-maint
+74500 d428bc184e1fbdc09ac848ac0279c0fd7742e014 release31-maint
+74501 eb10099366ea5226040a640ad9a4aecbab4ee226 legacy-trunk
+74502 24c953f3f8daf2c95947bb8037dbbb044ac30c23 release26-maint
+74503 ae2f75aa3faa94441af92a68f9c362c6adc06cd8 legacy-trunk
+74504 951663c030b48c8cabe275cbff0919b6358a1831 py3k
+74505 3bf03ad4a6a06f85f466752396d70fdc6a1aee9a release26-maint
+74506 d8740646a031cccdac6b34dc37903362f8207226 release31-maint
+74507 73f432cd82de8c70e8e9783643a387342a1cd7d6 legacy-trunk
+74508 ad930067c124fbcccc92f43c455ac13cfe8ab760 legacy-trunk
+74509 37f2f367ad8bbc575c556670fb271d328e434e80 legacy-trunk
+74510 cd181a6f4dd737511a2808196dcacf4ae4361b09 legacy-trunk
+74511 f8012fdda6d3de0e5113299cd9afddf24deccd69 legacy-trunk
+74512 f7466ac1dd725f7f85b3fb483be3c110a194376b py3k
+74513 2cfbde8cbf88618735071a547ed6bfc5bd04ce1e legacy-trunk
+74514 031e43164b768d19e75684f4e28ce9bc9cb358fa release26-maint
+74515 e01a1990717111875c46319036077903318fbd48 release30-maint
+74516 f5e7011fbff1205f9b45eb87556871713e81e650 release31-maint
+74517 650df0ec0c12f6f18b5a20b9f3a9b96b1c98749e legacy-trunk
+74518 3abbd7209be85005dbc3cea472125ce804d5ee9e py3k
+74519 cd0c8ac9cb494317f620bc17ec6a4e9d3ff0d6c9 legacy-trunk
+74521 fefd9eb7a822dcfe28bc6165dbb9a0a8eef48ebe py3k
+74522 c7cd27f665d1ddc772dc0d43b18aceb8f0a18417 legacy-trunk
+74523 e471d6d32724aa6e23051ff9561630cb28ca4aa4 legacy-trunk
+74524 e21c4c527e661ea1a94b030ee83b2f056c7095de legacy-trunk
+74526 974553fb59dcb33cb5280f64fc8af6220f569298 legacy-trunk
+74527 02d4089f31ddccc77e1b9e25040be4482bb6da80 release26-maint
+74528 38b97c3e98bdaa56aa87bd50d175ecc8f4512605 py3k
+74529 86ef74c4ad977b330522673fbb3a894b5e4146df py3k
+74530 0e55fccb19ec55d303df42df4f46fbb01ab86336 release31-maint
+74531 4871f81d7132004c3f8d338a1ca0be3d0c858156 legacy-trunk
+74532 594e197ed63d52efc99ad67ccbc8a8de6c4e7b8d py3k
+74533 f3408760d46e5c5aa692e8cfd93ea0f946373c1d legacy-trunk
+74534 bc167092c98cb8ec115988ec0aab7b08b12f3f6c release26-maint
+74535 13f19fb93f8ecd7abce2260c01fa56537bd2830d py3k
+74536 a88941e2bf273d29cf844a0d2962cdabf1f9b8c6 release31-maint
+74537 1545cf7372af9681753920d1ac52dfe78f79fdfc legacy-trunk
+74538 5d7f60bffe8fc5c647b04ee54ebdcfed4ad3902b release26-maint
+74539 c4d581e709ca54af35126ba0a3e7ea11d9334d79 release26-maint
+74540 cfa7ae717a90b6c9f1f5eaa9b2b567ce35c3675e tk_and_idle_maintenance
+74541 c403b66d92b0fa23ba92939c64199a7724cbb822 tk_and_idle_maintenance
+74542 9a0969b6f8e5e6326d2b5dd343cb65d5dc6d273a legacy-trunk
+74543 c4d8cbafd8c89061fb924cf8cac799e1a507dbe6 legacy-trunk
+74544 675a3c1824f4059108a104e95ffc601e2d16d6cd legacy-trunk
+74545 0918312a2d7b9ab182a1b445b9953e8c493052b8 legacy-trunk
+74546 ffcfc990e4ca19ca787d4e46442ab6dc53bc6f9c legacy-trunk
+74547 92e3858cca70ae6ca4a657a042eacc5a4e65b4d2 legacy-trunk
+74548 ec8d25e0500a88c782d6e004a20ff61d05a8d5a0 legacy-trunk
+74549 db86d3cc1e6b915f28d7a151906162b49d91f0c3 legacy-trunk
+74550 b60134ee5eb45c3fbe65123a42a2d6e0f3ed0200 legacy-trunk
+74551 f75f279bcd34049d42c511432251ad934485180c py3k
+74552 d91aff206dfde030be96a5cad7475fd15d05921d release31-maint
+74553 d03e528ef946aa7c4e9347a2fa36cd09cb1c1c45 legacy-trunk
+74554 48df407b606827705db2c86e170a072014b69f62 legacy-trunk
+74555 14c5fab3ecbf466c4e64c1d8e96c303f2d90e205 legacy-trunk
+74556 80058dfe469d9c77ebb2a03aa55e5d0d167c2b42 legacy-trunk
+74558 ae00a3a804739338869521ccb14e9c94a0d7d98c legacy-trunk
+74559 0d9b556a4378069b824c4fd84a45b01d7336eb24 py3k
+74560 735322aa71d1ae6e251a09acbc6192138b0ab6d6 py3k
+74561 b65ebed06eb0459da174d572f310d74baeada711 py3k
+74562 b89f582ee78a8b80a4565d52f23efa167c991baf py3k
+74563 e21303cac1205c4593d269e82052995ff7dd48b0 py3k
+74564 f29b59a492461e31e1c73402f68514312321aa30 legacy-trunk
+74565 1f1b4c03e892aa04588db5ab905f3b92b675246e release26-maint
+74566 d21077e639fdd1bd4eaf05ba03a5399a718ccba2 py3k
+74567 094a6f15864174201aaa737844c19bb8faf297d2 release31-maint
+74569 b6bf2a5f49dddd0b77ef9d3d031026d23cfe7a5a legacy-trunk
+74570 02950d580808ba1eec556e503410269d4d0931e4 legacy-trunk
+74571 5f9e13066d36674a2362628618b30130772961df legacy-trunk
+74572 33ce4c5bc2e560ccba446e2f5a1ae84af2573121 release26-maint
+74573 9a78e3d906171c7218a1a16df972a30536b83fb3 py3k
+74574 474a8e06e9661a02a52d9b7804844c710dc0e347 release31-maint
+74575 606e97caeb7736f5baaedcf5df1face12732d985 legacy-trunk
+74576 bfb2337451e9ac5bed1d76bb678f963611a52945 release26-maint
+74577 6deca73bd512dfcc38c145b461a639cdb3a9316e py3k
+74578 048a91381bd80ae1c0c9a1dffd1323991ce7232f legacy-trunk
+74579 7de207dd473992649146257746811b17c7227f81 release26-maint
+74580 a4ebab845f7241ef423c7434526455721a09a5e8 py3k
+74581 d4037fb856d2108aae89f9f402f861e43dca8fed legacy-trunk
+74582 1b91278717232058950a7faaa1b18670410d78f8 py3k
+74583 e9baa2de8bb4ecdbb0055c3e503d9d1b8be217fe release31-maint
+74584 e4c2cbd3bf93833cf07cbe119ec226d3df6d7493 py3k
+74585 68c92ed8d9604d30a532071caf178f2f86de37c9 py3k
+74586 d8280364c5814f8415e5a34a5dac7bb70e0e738e release31-maint
+74587 1f772f8fec922bf547c6b9df5f9e3649d3090756 py3k
+74588 6fa8a8118df0c3fdbcdd7f4b6b1c0200919e597f legacy-trunk
+74589 aedc4ec2fe240077771b11a1fca7a320ccbcffb0 py3k
+74590 b4fc8cbfe1ee91f0c4ef885726b7a1b864990dae legacy-trunk
+74591 08090b5e96c2fce7720e763de62438a5abb1e1d6 py3k
+74592 69616e228728e3d9ca5ea72867cb5731eff6cf38 py3k
+74593 58e63197d4eab3118dfb89d3d5168cb502784229 py3k
+74594 368bfc18a7a139ab95d66ae2fd05c5fba554ae8c py3k
+74595 bf500d8857966aaf587b3a2c53d67bcca7846be9 py3k
+74596 560008d098ddc719e20331c4ed63a2941421b727 py3k
+74597 86fa43c6d57c661fb8c40ea5649fcab67c437781 py3k
+74598 801aa52b12170598f788fc4ec300824fab511cb3 py3k
+74599 99dc22ef1df04880b8bff3aa56914057b7f3065b py3k
+74600 39bcbf316dba67b79007f3d4271da147c68f3a74 release26-maint
+74601 94249d1425a3fdb674ca1dc3edc256370f9c2224 py3k
+74602 027007b43f16560df2b84311da793b0c77459a45 py3k
+74603 78b86f8bf5c459c175deaf85fc4e63d3ffa2a900 legacy-trunk
+74604 43a666768f474b561fc64bfaf72ebcef336859b0 legacy-trunk
+74605 35a1623c10239088b026c9516199a04bd2026305 py3k
+74606 e81453bb07893f7e64a64964f1852503bf3a09f3 release31-maint
+74607 05ad9ec6308774936399688dfa1223d161875d63 release26-maint
+74608 acf215bbe702e05570d4cc2cc3d4878de3f77209 legacy-trunk
+74609 11b45535a1b3e619ce6db7faaf2698d9f23b85d2 py3k
+74611 849928d75d6e3988e1c85c9ab6b467749ce4dd36 py3k
+74613 07c23806ccc6c2edbe06cb4293f7f1e9556c87ae py3k
+74614 ba5b2683c0640c60132b589f4e150dd87409ac3f legacy-trunk
+74615 e5b463a61ee269ea8cf0943647220d936a97610f py3k
+74616 ed7dbc922d05c9f45e17f709787831a673837b79 legacy-trunk
+74617 e157ceb54a438b116598e94fda414acbcd28a43b legacy-trunk
+74618 b74a7a3e41c572df398072f5ff49e581c6127811 legacy-trunk
+74619 d512cbb85ae001d396c8d9dd4651bac7663728ec py3k
+74620 818ba89852810435e168359241d21fbce331e025 py3k
+74621 66f48bc948148751baa78355fa7620038e2a1838 legacy-trunk
+74622 ac755c566136d513076132fcb308ade5a698c56b py3k
+74623 0088844d0109a4f7b73f7e729bac94b7bdefccca py3k
+74624 afbb2b2ff6f7810d95ea7448adf12d78a599158a release31-maint
+74625 5d2b66e01968a3faae3f1a245b7437f20fc18c7a legacy-trunk
+74627 fd8a589008ac20e451875e158e998873358464d5 py3k
+74628 a47aa110fcacf84aed44d289ff2265a37996c437 py3k
+74629 6b82ba304a7ede876a0b77ea7fec3e20da1b3ac5 py3k
+74630 106ee4eb59705dceff3fb4bc4e22e95abeaa8992 py3k
+74631 9ffa8f8877509487ee258a2dccde2ef94bf4d97a legacy-trunk
+74632 e0cef02330203e46b21819605fd61b463abdb0f2 legacy-trunk
+74633 bb90051b434c03ee733bfbbb96df08f685a5a9ea legacy-trunk
+74634 6371e2d0dea00916f8af85da1d674eb829f208ce py3k
+74635 d55c9a063258ae793b64678371d24445ee2a31df legacy-trunk
+74636 eb673a401b9d550861b502af42a91c60456ffb52 legacy-trunk
+74637 95e5738cb30981818a5bc83fbde7c548a8c047d6 legacy-trunk
+74638 76aebc5ea45cbad3615df5fd00a1fdd443eac7f3 py3k
+74639 3b9e75311e430a366f99b80f7b9f9bd2d96bd438 py3k
+74640 ce7e0038996f4b4f839d9c5b49080f6b9d855cbf legacy-trunk
+74641 1f03f2920c6171e875589155e4c11a2ae9b79a4f py3k
+74642 77ab93ca065e367af1f149195e7c96806941da8f release31-maint
+74643 7d39e213b756367f8a1c82ad2770c370f7e563b3 legacy-trunk
+74644 61dbc1d1b804d6284f6fb423e11c257f03170d05 legacy-trunk
+74645 a07f30d7d0f1cef085513aa4c21862d9f387d022 py3k
+74646 25b13f782ffe848a1d3e0213594f397c12237499 py3k
+74647 c51721d64451a492b2fb8cd894d6571ffb8abd1a legacy-trunk
+74648 63b6a91ad9d97dc888ed90dae64f650a3949d5d5 py3k
+74649 17e83f0169e81ff1dae3089ac1ceeef9b09adc31 py3k
+74650 6758bf2002dab7c167b4a7792b8b0d9917cc390d legacy-trunk
+74651 8a8e3c1668a0997441e31adc71cc7fd38873d981 py3k
+74652 1501a1360ce4e48575be47c4f05f7fadfe1be008 legacy-trunk
+74653 20bfc1d35989c0450975669d6f18c300f1946c17 legacy-trunk
+74654 c2165be00171a683943b5a4eafff5307c1e8af68 py3k
+74655 77db25c7526a129e4c2ce04970d9e6ae6bc558a8 legacy-trunk
+74656 e8441850790f86dd812f4a320d74ca61db9c5b8d legacy-trunk
+74657 75837cfe9ffbf9afadce6965394043f6e31527ea release26-maint
+74658 d567d963cb3704a8c38d789f15303365d77a02a0 py3k
+74659 0f6dc2e6f091e412271d594052e2706420ed32b5 py3k
+74660 3b0b37014aaeb179c71b6e7bcbfe1b135686b33c release26-maint
+74661 4ddc0598df79f6305a725a303a98a42e4f3c4d79 py3k
+74662 266d7dc3d655103ca4a6b6f04075ba8ad9416fe1 release31-maint
+74663 ffbb8fff3520ef8a0b1f13813e450b1327ca7161 release31-maint
+74664 6f7e7192febb0fd19a81621e38d4e017ae8c8c4a py3k
+74665 783705b042580e3100588df5e3bebb196d1a3c69 release31-maint
+74666 d1911449228600ba6f9dc38b0c2825aaa117b502 legacy-trunk
+74667 1d43812aadb61887170120c0eb6859c8f6c2b4de legacy-trunk
+74668 3c7c9b81e36144451dae4742cf7a7b7d4bb1737c release26-maint
+74669 623147a2b5b1ab4377cc17ce3b184dcbc1d2c0b7 py3k
+74670 dc62dd3326ed0be23f206790a64cdc323f9d5297 release31-maint
+74671 906490ab6affb4eeddc39c952d533f73f7d884ee legacy-trunk
+74672 34496bed9365f5dd5bb9799ecd09072d93355eb5 legacy-trunk
+74673 5d9761e4455587f5a731811a26f88a8fd37e81b6 legacy-trunk
+74674 d627b0ff1d17e5ee4b867aa66734b92996e53962 release26-maint
+74675 197c2ae51cc612a956d3a4ced7fed5450cc22768 py3k
+74676 1f4f342bfe2e81de78a939d3347f980ee478ab2c release31-maint
+74677 20b9af1f00c8753ca88ebb72b032b4c28ce9dad1 legacy-trunk
+74678 95900dbd5dd33f521261a55da6ec5c7da19721b7 release26-maint
+74679 a152ccca538962eee48255f577bbc2f49136af14 py3k
+74680 4f09880bebbba6cb3d2312a371e8ac5188ae8d1d release31-maint
+74681 899bbcbaf9a6ea8515c8bfb12a01d6089cdf9930 release26-maint
+74682 db15c7af014fa08725563639fff2a1814f7ab11e py3k
+74683 0c494e5787df6bd0d0971535d6b2f4dfccec5cd1 release31-maint
+74684 34a7a91583723b58f9392230ad6fc169574beb46 legacy-trunk
+74685 7e769fdde439ffc805d413cecba59e8bebdf2ce6 release26-maint
+74686 9e7b7832fd451278a7efc972288b1ec5121ab302 release26-maint
+74687 92f16c87889da0f42de3eaba66fbf3d0fe21cc79 py3k
+74688 6572d2efc8b29aaaf280d84cd35ac27de440a604 release31-maint
+74689 c66455a416ec7bfd9340102c8171ff17ffbbe8fd legacy-trunk
+74690 53c4efd170c0517f161a5b078386f79303126bef release26-maint
+74691 7500096bf1a07eb064c588d87c24cfb0ff569844 py3k
+74692 86901cae6b6483f9a2d56ea3ee3406a75b327945 release31-maint
+74693 d30a3d577164ebcda82ad2baf8693050088a5f6d legacy-trunk
+74694 a70e72efc2ad69cdb98a36fdce2338037101136a release26-maint
+74695 5e1108545e7874a49c17743de3da474bd2c5f88c tk_and_idle_maintenance
+74696 ed2c5e007411d096d93834a1eaedc6116bb2ae25 py3k
+74697 4803e76f20c56fe9e99c9b5bb42988ae55270bff release31-maint
+74698 790c019f640388730309082bff55dc7735d2af49 tk_and_idle_maintenance
+74699 dc7217cb73b7b3bf270cff3a80cc44bff7f7b7ba legacy-trunk
+74701 f64570d0f71d9dbd7005064a3464478564e0c65f legacy-trunk
+74702 37f5d1785bb3fe8c273965efb303c8b7626bcfc9 legacy-trunk
+74703 300da3ccf9fc3f714f1d59815afb641b1864329a py3k
+74704 0f7333aca45532310c6f57834230d043eda2ced7 legacy-trunk
+74705 e895ef82c086ccb83bd165434bdce4c906025080 release26-maint
+74706 8a8d467c89ccea04b17d827ed88da268d938b4f1 py3k
+74707 0dd0b0de5e31f01b647c97242a99299bf3f2e17a release31-maint
+74708 d41024593931f69aa767348cbb54e9ac5e45b7ac legacy-trunk
+74709 5f5ea747e31a1afd9deeb5f3d4a6bcda6c24f6dd py3k
+74710 ceb75819537716c5aa7e53ec97a48d04d7ef3ac3 release31-maint
+74711 66a2de0d428e65db4e6578d0844f0149aa4b8e8f release26-maint
+74712 6fe9dfb139c31c754280a130110fc4fc63c13fd5 release26-maint
+74713 1d1d2db456d86e267c0540e2dd8f6d52aa08aa2b py3k
+74714 de627cfeed1466c7c921eb24c2647d978c96a9e3 release31-maint
+74715 fd34ffc8f8042f3e76b8d291804308dff52b827c legacy-trunk
+74717 91dc6322722df8b2ac8cc2d54815c90f9d8a799e release26-maint
+74718 fc9a00799795c4d043bafdd8300351281fb30d46 release26-maint
+74719 e2fa060508da053c5743e2d51772c39fa5690227 release31-maint
+74720 dd6a9bc399463f062edc807119ef004dd4de3441 release31-maint
+74721 e0409f03822fb30f7dfa859834994a1928107db0 legacy-trunk
+74723 40fd8fd96d96cda1ce7c8265d07596ff30886465 legacy-trunk
+74724 32e85d50c52dbcb43a971bfdd87ba3cf5935536b release26-maint
+74725 0bc759f6ded5c8fbeaa4e9009a1eb213ffb8d8b5 py3k
+74726 e0178b8aeaf0798fb6c4364babf5f33c34b8aa16 release31-maint
+74727 931af6611ae9ce454e71c5fe2bf5ac6d3015e410 legacy-trunk
+74728 67de42ca0a26a7041bf426fada766d6719fb9df9 legacy-trunk
+74729 4b639f5b7d3ebee0a0aee41ac82ddf45c0d6074a release26-maint
+74730 6fa946d075f4ac3470987bd0118b27bc6a30282c py3k
+74731 d5fc51891997daef98c3050ad65e5f33512b5ed2 release31-maint
+74732 e1efca61ee4ed9f935692156dae34d3bd57af746 release26-maint
+74733 5dec8a12e455ae98e702a1d9139d372f7a13266f legacy-trunk
+74734 8f6cf39c96dd623603010d385dc363568847d138 legacy-trunk
+74735 00d6cb625667f3714b4adb74aa8bfe2b912c0858 release26-maint
+74737 ab7fd4bc3828f8ce076958713982aaec8b66d7e5 legacy-trunk
+74738 25a617ca83e2392547407494363914b164d8420e py3k
+74739 5d15296a2a4e1c75bd5ec7c9cfd5468ac06b1e8c legacy-trunk
+74740 835fc8577dc790e2ee45ec5298a33f2e8c194eb2 py3k
+74741 7f2a8794399a1e60c409f3745e45c5bc2f3a3994 py3k
+74742 0f6db002b3a1fec998932d06eda576f14e6c7d2d release31-maint
+74743 9580bbbb552e13a0110d2c8b6d1b52e51db61fa7 py3k
+74744 6affd6dda229d146c8623871ad4f498cc92d4569 py3k
+74745 7e6f614a6ad18c2cf2aca1bd95a74ca16772e6b3 py3k
+74746 d4e3af343e320a929999f136dfee3698191ab959 py3k
+74747 3fb1c1fbe26caef4d4d544d423ac9633703aad54 release31-maint
+74748 6225021bdc36b1809c4a8e42f0513d373a921787 py3k
+74749 92daa9c41d561dd01dde6466c025dcfda85db8aa py3k
+74750 ecd22850d201ca4bf277412d67d1159cc92a0117 legacy-trunk
+74751 51baad28fe7a141ed4d8014fab12a391d9cccd35 py3k
+74752 6bf2539d3baa421e19b68401e6dc662b470d2d42 release26-maint
+74753 d9a66905f03e95c20882b7ec4f8a211554d4ea10 release31-maint
+74754 39be3ef82d2336e3273f0d52d063c30f1d775847 legacy-trunk
+74755 5111d329974160c9dc35db5adba2de06b4419879 py3k
+74756 3df9914efc84e3938c284c1aaac8dc935082ac56 release31-maint
+74757 2c9ec4e7d8c210b77276a58a6a8fb83634f0c2ea legacy-trunk
+74758 fad0251324d7aa147308de4f481385dc05e33e4c release26-maint
+74759 fff59b0add98a561574e7640f33107d81ef331dd py3k
+74760 0781acfdc945d91ebcd3a0927d7c84836364954f py3k
+74761 8bc4c8cac7d722fbb6dd1d99ee5c339e42354974 release31-maint
+74762 7d9cc4bcd7760e541fe4bcc8409b91fa682ad91f py3k
+74763 d0bdb1930d49e4e2a938395093ea804f80b02c72 py3k
+74764 dd02791666e05b804d47fca417a068d148568e88 py3k
+74765 22930af4ddf734fc9ba5bef813a6457acb5aecd1 py3k
+74766 9119467aa84e828e34976baa71cdde5547390f4f release31-maint
+74767 f3a30083fd964fc2527ad4c0ed51593c2cca5c6f release31-maint
+74768 3c57d26b40c467ba66dae6207011920ace2b784b release31-maint
+74769 6594066e504169418375dd9082117c459d6c8472 legacy-trunk
+74770 f44f46fe8da52e380cb109a83fc5cdecc57a7081 release26-maint
+74771 d7ae8b0739e47ae64d875217338b1d8d3aa0aef5 py3k
+74772 316921cc904a5db2e559a7364d7d30d543668329 release31-maint
+74773 0c0a6cfd4be220c8508ad19c9ec4cb6ec8db0b83 legacy-trunk
+74774 aaa6b724a4fce4612ec828b3d4d0599e627ee23b release26-maint
+74775 43da53e502e15dc44ada3e3df87b864a3d4353c8 py3k
+74776 8393a90216b386c43df42210ce5b71cdad9094d7 release31-maint
+74777 bb5fc15b034ce3a941ba9c8f65d72868a207ad03 release31-maint
+74778 1a39a4dd277c49747b0004cdb4102fdf50dde713 release26-maint
+74779 9ace86299bb8bf4be15972b45f41d93eabaf9239 legacy-trunk
+74780 e8d681c448d72dda64a2f798d22efe4d81a4beaf legacy-trunk
+74781 aeff3319c418b407bd6c974d2a306aafc941271e legacy-trunk
+74782 715e697253f24ac5bb6e589b8cef6486e76275ed legacy-trunk
+74783 9f1d6d1dbb0080c6e55c734d8a840cbef9cdcccb legacy-trunk
+74784 1a1af9fbd831799b16367ae0e4e0b16772041af6 legacy-trunk
+74785 2513aff445c2c9ec1563480fd1db71a4818e6aa4 legacy-trunk
+74786 7643e273043764e6e0645043a1fa6de9659c977d legacy-trunk
+74787 9584b8e22f76fba82cf1ef831040a6254c65cce7 legacy-trunk
+74788 6d45fbc85bdf3fdb420de55a013d58ba75c040fb py3k
+74789 9b2a42fbd04b42daea5abdbc09fa04d28a5b625e release31-maint
+74790 c04a7c3655fc0db7ce489a6bc7a32751690bad8c release26-maint
+74791 6855951aff199e28d85005a6bb80ff072749f3ab legacy-trunk
+74792 cf4e0815846c584c909a64ffff07f46f745ca37a py3k
+74793 3aff597910c41b9f2af0bea5820f01a84e416059 legacy-trunk
+74794 8c7771dce0474a87f2e6b7a452152ca522c2d578 py3k
+74795 d9b5b7dd82a2224bdb52caaa4c38a9170c910569 legacy-trunk
+74796 1f1f6bfd4dfb04447bfa9e4c5512d344ddbb7b2e release31-maint
+74797 4ab3b5eae897982284eeb8f2764aa9bfd73710e7 release26-maint
+74798 9ad6d72bcda5b547bfb52b5fe11c875acf1e8e4e legacy-trunk
+74799 21e907a3836f3c9e374e1c3ab14f2aafa755221a legacy-trunk
+74800 7847b409b79c1cb745c2bc37a484426e7cc86b12 release26-maint
+74801 4cccf3ce15a09c627da6d43a50791b5ef492d390 release26-maint
+74802 da853e983f0824f3fb5c7c96f1e3b013a3b9923e py3k
+74803 2d575f16bcecd9f6e083784b337bc23ad2de3715 release31-maint
+74804 850dafd4a2453d524610183177e96bfbd7eb43bb py3k
+74805 4e7f6bc810b360d9e857483e843cc2da34bc8e87 release31-maint
+74806 bd420388e6b1da18985a87436068f38b2dda6b70 legacy-trunk
+74807 a6df074d2e093fbb0b2a5b23b8b56cfa26bbee85 release26-maint
+74808 9462404df4e10cfda1ebfdfc6afac6804e437779 py3k
+74809 ab4a87fef1ae6e4a84e7d804ccf91d2ccc3dcba9 release31-maint
+74810 a33f96b43f24acb2163c6c5cf635a5b74295d427 py3k
+74811 4102b5f2a2f1e3ce64fd0bc657f807bbfbc0abfe legacy-trunk
+74812 8519e28b284f794ab6f6206db7aac11d7d36c410 legacy-trunk
+74813 a2bab2d23746b552c9f8f8bc2ce7508a2572a151 py3k
+74814 560c054a01aa2ffe12ffcfbb7a33dd073f474813 release31-maint
+74815 7d4c3c083f36197f2f38de3461eda58baeca0062 py3k
+74816 885da146fea5a3dfa35d9b852eb4697695fb7c30 release31-maint
+74817 507ba97a2eeef339455cbec697c806b96b7b8e72 legacy-trunk
+74818 bb6ade51a0b6238d135c4a60bb62bb24b1512ad5 legacy-trunk
+74819 2ebe8c81aff06928c7bea3847a3a74d3c0f992ee legacy-trunk
+74820 c2de32866d0e3d640abe92b347ca85411391d47c legacy-trunk
+74821 c017a450f4a5768fb50631a51941033c2442f15d py3k
+74822 d4c27da46dca0f799ba45e4c0e8fb4f5616cff1c legacy-trunk
+74823 742ce58a3171bc12ee4603506ae9edc16e9d4739 legacy-trunk
+74824 3e193d0b1aba89d4bdaad4c3620f872456f87973 legacy-trunk
+74825 3385e6182112949a72d4b495abb07b70fba4d04e legacy-trunk
+74826 4e61d7bd1b3646ba3fa2909e4c162e19339ddc6f py3k
+74827 96b645752c33475b3966dc52512bedf832b6a60e release26-maint
+74828 26df0b856bcbc4803f6a057d318d24af450737c6 py3k
+74829 4cbdab601b87ff38b4efd2bc38e602440d4ed843 py3k
+74830 4b64db36f09b8fddc26266f07a7548976749c8c0 py3k
+74831 31c236c53b02457e4f9ca17fb8dedd4d5bb39b75 py3k
+74832 f1391442bd0b5d88337a0d5fd01650b2fd07bdb0 legacy-trunk
+74833 9b003bbca5dbf5c82c555ad5b2e99c206f52c91a py3k
+74834 d8072206fdc61ea6929b6530f991e35e301ebe06 py3k
+74835 b6e39eea1bbf6ef3fb3155cf0a4d513cd7c7e9a0 py3k
+74836 fa91270b6087b0fdf393cc085be8dc8e6099b70f release31-maint
+74837 be4d42009f7e5bcb7beeeb34023e66c033054880 release31-maint
+74838 32448f8a6c636f39a617985d137a56adb9ac3478 legacy-trunk
+74839 7a3ed1b434109753a57de82d7a9c33b27e694d78 legacy-trunk
+74840 334c60f512594c8376fc30f529e0397a1880e6d2 py3k
+74841 b0d03fa073ec5d167a01647fff36253962d1784f legacy-trunk
+74842 1ad9f2bda20a26c743261e3aa02eeeab07583b75 release26-maint
+74843 3acd31eadbb8807045cda096b7f414164c6a3d11 legacy-trunk
+74844 661c8a93892ff7c10dde01f0d8a5eb61eccfec40 release26-maint
+74845 0f09d38f852e847a86a57bd1c2ebf84299842633 legacy-trunk
+74846 78ff9a74cb4e9b7daa16116ed0660661bc308ac0 py3k
+74847 1b18967fbd40810691ea5828c8e017d19442ba04 release31-maint
+74848 8ab304034021a5770f730f117e8f6e8575fa0ff5 release26-maint
+74849 fab99e8d28c3275bed25300d6bbf9d3d8b4dc38d legacy-trunk
+74850 ae1b1cf47c0ca1f335ec7ac3863ed0f09812ff69 release26-maint
+74851 1e09dc68c8f3638bf6cbd831565ff20bad4d4ebc py3k
+74852 2e9858c0d364d1ce4bdf0028ba4ea6861dc94fe1 release31-maint
+74853 a2cbb9421a1143ac5af03278525d7d163a87cd52 legacy-trunk
+74854 9069e52c0bedc25332f0229953c85c50ad363d12 release26-maint
+74855 c8cb9ef0cd0a04d9bd00d010c6a94bf896281517 py3k
+74856 46625bca0cfb56f49efecbdb89e9361a4413c85f py3k
+74857 76e08b91d98e0adb74087c6f7e5da90e2fff18b4 release31-maint
+74858 cdaeb251d488be3645143d476fe930a0033691e0 py3k
+74859 173bed0e04c489652e572fa9e03ecdbed4b82647 release31-maint
+74860 77b96a5424a2c652f75dfa3e37b67473b882d318 legacy-trunk
+74861 7c4d52860131b6da9cbe49e1b1db98ff71ac0bce legacy-trunk
+74862 9a10971403a5ad0d49c17fc7113f2495fc8c7cf8 legacy-trunk
+74863 7f726115ba29a0e60461483028a255f12a068e08 legacy-trunk
+74864 172b2d36da77cd28313682e6f2fd9d1ce84dfcda py3k
+74865 42f88083ddbdf3e18f51b304f01be9368f388f69 legacy-trunk
+74868 5fed5e8ea9cc333267fc7d6882bb475ed949f2a8 legacy-trunk
+74869 38a52b67242926030d0bd4914387904d750755c2 legacy-trunk
+74870 0ff37e200292c936bf6944a4ac9bcd05d94f3d58 release26-maint
+74871 12f145d75513eb986aa78f04936137be7669d837 py3k
+74872 a9809f3b164ffa6f0d8ef30fca618d20283c25b1 release31-maint
+74873 8c3b2dda470360e52251d365fe174b630e8b9bf4 legacy-trunk
+74874 dc922a89ccf10c38fd6da5a0dbad7b400294eb3e release26-maint
+74875 0a580dc7af1376404553ff753f160a5a7765155e py3k
+74876 6f4b852b82f17507c59aeaadd2997b56ce479f85 legacy-trunk
+74877 9acb8eb72a92fa5f53187b62f9a3299adeb1e0b2 legacy-trunk
+74878 ca920c16b2057e8e455211102396b293ddad22e0 legacy-trunk
+74879 e0d5c0c3808ce18d0f912da13ed07f7214fde730 py3k
+74880 a27abd353ed1ca134c8973cc6e4d4ac0da95b0ce release31-maint
+74881 b1b615a911f031f0ba4d3cd9998b368ff618bd56 py3k
+74882 e4974e95fa649eef685fe28025cdafe78f9183a7 py3k
+74883 b398afefd36967a2bfb1f8ce91b9be801d667c7d py3k
+74884 ba228e5c3daf796c8678809d61fbe1c366e6f6be py3k
+74885 9ceeb602dda3b9b6e2646996ad6c7121dea01a12 py3k
+74886 0e44dcc0b20d39d7193c653af208415ce137df6c legacy-trunk
+74887 2ea1fc26854252c7cd223a97a38a31d6640a9eed release26-maint
+74888 d3ee738fdcdb17cfc36d4b294ec9cbd1085f80db py3k
+74889 072e3e30b50cc21db22cf359277e73f182729e25 py3k
+74890 547d41b1de97381be5312ff2cc62b6aebfdc9c92 release31-maint
+74891 1c546cf3eb10d6d6ecc43213d6a4d8246a721223 py3k
+74892 d601fe37fc54ce018f376b43bc87a2f60b408f2c py3k
+74893 fd2f4ae93d0127edfc59369988017f1dd757321f py3k
+74894 b63c7180618e348a427cdc522ea99a946ae73ecd py3k
+74895 993ee39e8bcfefa9da5e095c7dbdc6b584ad24ea py3k
+74896 bae9f4823b8e11b546484772e75ebe3df53c9ef9 legacy-trunk
+74897 5a1e879832fe33c771656ab61029fb00fe00430f py3k
+74898 9817915ebdebc51a819c94b5700dc415742b96ca release31-maint
+74899 de3357c260b607cacf36e7955e51f035aaeb4d4f release31-maint
+74900 da04b152a6fe3f66fb94538cf8f544ab9b7cbf6f py3k
+74901 b326e7d664134a83edfae0d7c6d44e4022de5a58 legacy-trunk
+74902 7a5c119b866902f62062cfa32306f6c9ffde27d7 release26-maint
+74903 84f1c95b4e9748f9a54993ca669ef2ee57d88a23 legacy-trunk
+74904 6fca35352f7b78164bf2b338c2161d5f56c8e69c release26-maint
+74905 4f15a131ab07195cccc8353873cd697c62c0a000 py3k
+74906 c76f843838a5fa0575ddfb48179c8b42d3b3a628 py3k
+74907 3289ffc05cc784494513e2ee7e60afa0521593a3 py3k
+74908 b35dd1b6248e39396859b9040994ab2d254ebb0a legacy-trunk
+74909 a442c2504a57e1b5b717b788561f0b269f39efaa release31-maint
+74910 37e96246bda1c64926921be232522506f2b6c487 py3k
+74911 da81861684e893a644f73c715092d808078f92c3 release31-maint
+74912 1d2e6c441a53f015f86912b3d204d4960ba8f5a1 legacy-trunk
+74913 77e07af6f87a3c8455814284004b55cb2bc387f5 legacy-trunk
+74914 d4e036c6c60d4a400df6862be0b1ffe2e4e331c6 py3k
+74915 85ef1c04d8ddf5cea8aa96f770c120d53f7ed75c release26-maint
+74916 51748dfcb444c70044e54b910f9cb3158b4726d3 release31-maint
+74917 9931e177da8138eb09b828bb9b4da8da501be584 legacy-trunk
+74918 37538b550f685af381c34ae3695f0abb0a6c4064 py3k
+74919 fd18774530606252737d394bc57b250fba1dc16c release26-maint
+74920 d1d3a07a0ed7f49f0f6113e02e6ff3d08c420811 release31-maint
+74921 3c83a3cacd77985be8355d3cbeeafdddc00015ae legacy-trunk
+74922 043fdda706a376fcfc325385928329209d8d4222 py3k
+74923 822a29f7660b517fed67dc04b5a0d87be684367d release31-maint
+74924 b4ca594849143d6563ec715b3d99c54b164feca5 release26-maint
+74925 f2555ad5fe09ea000c60aac29db5b4322c6aae2e legacy-trunk
+74926 2211ad3e7bbed4b93868b85d7bafaf8457e7d72c release26-maint
+74927 b0e5105ff97bb9cc4f2ab9a29f6ff5144eaa9d86 py3k
+74928 7b2bd39b21cd1c6bad59d204b169fbdb2a92b64a release31-maint
+74929 f64c0eb8cc6209f4c24bff5c33fbad20d7836942 legacy-trunk
+74930 fda292f31632422c65ddc1ee72542334f643bf43 legacy-trunk
+74931 f12ce7adbd300090d42b8a3213fc64ef048567ab py3k
+74932 616a669c9023fe7473a75b09793c2759e6a9d4b9 py3k
+74933 b4bb4bb86892899653c9c162750221d8c987a9f8 legacy-trunk
+74934 de65908973d024391ed9c1edceff9d43732b6b71 py3k
+74935 1b7bdae02179470eeb22b18741ef6537f2ad337d py3k
+74936 cc329bb19da5f1a9fc3853628cfca1e463eaea15 legacy-trunk
+74937 243faf0f5f5e431035eb4324d4eb6d20bc82cc65 legacy-trunk
+74938 a2b2cc0fa7ad4d0f494a400efd1f1be68744a204 py3k
+74939 cf75c0d2e3c76b12d893c694f9bf1a1509abacd1 py3k
+74940 c5b1500172f89cf755a2133a223806400513f01c py3k
+74941 831525f15c57029122a12aa3cd64cb1d24bfd95a py3k
+74942 0752139f3da1d3ace727f10c919df4f1d700402b py3k
+74943 6a278e4d9f618db2d2bb5748ed56513327041caf legacy-trunk
+74944 30cc4f073292eea26d1f1315fb11436141edb5bc py3k
+74945 58ba85c0d4b0b0fe9a0f82a80c9f586dc7bb9b50 release26-maint
+74946 45145aeb63310b23223f3dc2244e5bceab5ef629 legacy-trunk
+74947 0007024e9e2348e78357f9f8e5678e46e56c1a3e release26-maint
+74948 4c7349b9d159a7ada3501ebc191a881d6dc4a3ee legacy-trunk
+74949 1eb424257345cdb76bebc14936d34177d1d95f6c py3k
+74950 1b1836cfcf262a908189ad4c529ea6a46717bc96 release26-maint
+74951 80a38f893b7f3f08e64927398df5e2ded49a7fbb release31-maint
+74952 a09da56e47969efae13bade983ed059841bf4e39 legacy-trunk
+74953 39b4630797face7f4c04aaa78d70dbac23caafb5 legacy-trunk
+74954 6791c2b1a7dc988df160a0826f8cb3c6046d43d3 legacy-trunk
+74955 416b645507d0a843989dfa652bbad8dba1dd1627 legacy-trunk
+74956 8ccc23afea3d1896998f2c23d92a58062d1b4d0a py3k
+74957 ea697cde688234f7b2bc5e0fd520d702a72ee03d release31-maint
+74958 f54d31e5fd4d6f00bd959c1a4dcb7bf64ef24264 legacy-trunk
+74959 2c5a7750b71d821d09014e39cff22aec0611e7ff release26-maint
+74960 bd84f42c3633958b9d52ca13a32f53ceaf8a15ee py3k
+74961 522be36b29cd21481b8db2565c604c9f5b945de3 release31-maint
+74962 2ddddc641a9873f02fa9f83f1e6fa22f7ed2e0cb legacy-trunk
+74963 2717d85aba2e6bc3e7309156ea33310c6a0d1583 release26-maint
+74964 e561f10c7b311928be76091bae26e03cbce5c257 legacy-trunk
+74965 d131956533bf1cd9ca8837e16f1fe541b4e132e5 release26-maint
+74966 69ee1501b10269c3f7ed31a0392cb1839a7aff85 legacy-trunk
+74967 436ca775f26caa8849e4f9bdf7b92033a71afd8b release26-maint
+74968 22548c7eaf375bd76e3c705f10a0d3e14c9ed980 py3k
+74969 b3d25e6f66f12de56497456c5ca23bad4319c9bf release31-maint
+74970 b0a2fba00458611908a8dbbc6a82d31f0db7212a legacy-trunk
+74971 1c50dc213312dc6457337935d2795d9fdf3b6adc py3k
+74972 d8c248a5931050a1f975c3ff9b764982f743089d legacy-trunk
+74973 98104ab859fa967b5ab4b5ac9de4d90b81a98b5d release26-maint
+74974 806c636385fccdbabb5868814d1ad2284bc3e174 py3k
+74975 7e3985faf9a8acfe027b0d8b893eaa780a391b7f release31-maint
+74976 7a3fdd93b5664da2514ffb3a495c5d101d9d22b3 release26-maint
+74977 1db6ee9d7be7a1d6c533aa07ba25b0985c6e7f5c release26-maint
+74978 db97c042cc1ed5b95da8844a39507e4cce1328db legacy-trunk
+74979 cb3428b1f4af29b25b48d297655ae2ea840bcb7a py3k
+74980 3393ffc0de44e6a3cbcbbd2ca73d794b5fa3f5c6 release31-maint
+74981 9234305d3740387a7326d349a47e356108907229 legacy-trunk
+74982 6d8b54b21b877effccb2b155429484b1c392d7e5 release26-maint
+74983 273c234800c1841d30bbe7b64851b7d0b7b8c10a release26-maint
+74984 cc3d8aff459560ca44f885531e3e75a237de0a63 legacy-trunk
+74985 c5949e12c6929ed8db61b4f50aedd6ec47e2c8d4 release26-maint
+74986 9c9165bd293ae2498661bc70569fca0a2561997d py3k
+74987 c63f8923e24f68b6ef3bea2d5e5802117f4bf992 release31-maint
+74988 2df8bedec6d3338c37df7630c55b987fe3ef3d9c legacy-trunk
+74989 a9ce1589d694d2986559b5bdde97575089cf6b4b release26-maint
+74990 7c434687b429396e17aa5e211dc2bb9376d162b3 py3k
+74991 4008a0137de7b0d68021aae88467be81e725ea09 release31-maint
+74992 d627c5892fd548ef463bf51031a3c75e12530caf legacy-trunk
+74993 5c8700cc9d16ed26b94c4fae5bf13d9700e462a4 release26-maint
+74994 7a7642ab11b3927cd22a47ef9e322f93acc9f74a legacy-trunk
+74995 627b349df0e8e27917ec4fe7e1345097c06241f3 release26-maint
+74996 018f2eae2526fe24ddd49d3d40f1b6f87b61eb14 py3k
+74997 f8e696e4cff1d804b4ce6a0652797cc30dedbb75 legacy-trunk
+74998 af7a1200fb3f35f01d420faf75b3f5b36e50213d release26-maint
+74999 4b83ea6fc5bde2162733e159757d044ccda72e1b py3k
+75000 3a3e145d552c5c9b0293a2a7f1ea38307ddf3055 release31-maint
+75001 1ffe6fb19a18dd0989baca85575a259c545afc30 release31-maint
+75002 7435d591a32583ae1261ab9dede1a44d523f81f2 release31-maint
+75003 b777e0f0b57ca211908d34363082e7e4531d5824 legacy-trunk
+75004 5f63b514272520fb9700c62fe5b286198fc2506e release26-maint
+75005 b734d6b5185294c5c8430e2be29ade3b5d5d9953 py3k
+75006 357c75d59ce994bd664480f03147c66558211766 release31-maint
+75007 f73cdae197c4d1e2a08a4b3335baceaa644236b3 legacy-trunk
+75008 78e00eb45dbb40d8af4ea8eed90d336dd835e9d9 release26-maint
+75009 1f5f78818c51e834d28be0487c9aaf30f0241163 py3k
+75010 82d797ff9aa3c38bf7f2968a39b61cf5a12f0ab5 release31-maint
+75011 4ce4da847d93f0503d2904d2376955d17f436a7d legacy-trunk
+75012 c2392a79715d61d6a210ac62a94cdf9c91ac30e7 py3k
+75013 574a532fb40b186e8e7ba3fa5766fbf59b81b2bb py3k
+75014 afda087763af1eded9e127840c17445829485210 release31-maint
+75015 77191f3a1d27ddc7014959b7c2c177c0a717ba5d legacy-trunk
+75016 5b8b18b00d4cff05ecf3e08421c4f338506a5fc8 py3k
+75017 5557bc8cbf65f994ce615238c90d54ac7e6f36c5 legacy-trunk
+75018 06ce27a82e99e7fe3ed84c4561312d4e6c51b193 release26-maint
+75019 cadbfc73a3b0d662f1a640dd129c823abbcb2376 legacy-trunk
+75020 9c6a983cf6a93e5ce7ffe9a53ff1e45a8ec32cfb legacy-trunk
+75021 2ae93eac420e2ab9a9c6cf94cc9c6b5fc8c67be2 py3k
+75022 4ca115f33b6b8f96833adc399a14b9e0cd432272 legacy-trunk
+75023 4aa7de66137fcc3f36db1d05e877fe4850ff02fa release26-maint
+75024 3228bafbe6c938658b9e84b3544600adde72aa39 legacy-trunk
+75025 2d34a74f0017206fe8d70ca707e3f351232e8a33 release26-maint
+75026 cae053c9f9cace4bfea8ec52d92dc88c42715621 py3k
+75027 b19a8add112f882d5cf0932933dd15f03f457ae0 release31-maint
+75028 d599a3f2e72d6e0c43e57a3a8dbd36277ab17086 py3k
+75029 1d0d6f74378c6b52c7ba74537782011fd66d322e release31-maint
+75030 600ed2dd7672891977dd84b994205a1ae451487a py3k
+75031 9cac8ba6f4a9dc59ece8f2ae2bf1f303e22f74f2 release31-maint
+75032 c24f000182f4555cd59eb86a80159f6fffcf43d4 legacy-trunk
+75033 68899dc117eb35fd396bfb4b0d07b3db6e60b663 release26-maint
+75038 584db03e524807a4e79e503b9b33ef36ac960b39 release26-maint
+75039 b4ab49e28305103c9251df43c3266969a3d125a3 legacy-trunk
+75040 9daf8840a473e08e5470452a7804ada75a43ba0d release26-maint
+75041 53a6b39ee4b66d943c375dc25822db7513264a57 py3k
+75042 3fd7f122556a961a5a9df5c7e171bcbb679f82ac release31-maint
+75043 7f7cfaa3832e3e25a3dafd8e06c07dcc657978bd release31-maint
+75045 1d0f416d4ba642f35e8b01207126b40fcbe82411 py3k
+75046 896670d41c9f74b31a8227421930711bd49ee10f release31-maint
+75047 f9a70f2256250e71aa30ba333df76f8c3010c19b legacy-trunk
+75048 785eccc025ac6e9fdd0737d1370f3c2a06f70476 release26-maint
+75049 656d1d40fecbfc559c5f7da810d8d8e34d091271 py3k
+75050 592bb8259c54278045a3ac158e72d59b57bd93ea release31-maint
+75051 0f4e95ff859d2cac60084d355d730d6b1b6e6579 py3k
+75052 28e2ce00f545bf4e57a7aeaac44d3cdc8959b4fc release31-maint
+75054 3def952b515c2b458d94d204ff8aecf5182e6057 legacy-trunk
+75055 3567e87157d83631a163a91ab3483c774f83a1a1 legacy-trunk
+75056 e073fc88dc8947f21016ed0d5819c611507cec38 release26-maint
+75057 8ea921c7d10fa12370f59971754f52c9a82236bd py3k
+75058 a07568c7a82aca527af0ab963aa169d011b38e2a release31-maint
+75059 50b18ae8cec44927e4aea993ddd64b0a110c6127 py3k
+75060 149bed21735e074ae31cfacf7eda9fbc34159dfa release31-maint
+75061 1b9f14e5e9e507d78e6b5d808b5e5a1460563f30 py3k
+75062 8cc82dc6bbb023f1ec784b2c014722aef5afa898 py3k
+75063 2644f54e36763e38665d194a23f7c31cd906433b release31-maint
+75064 ba841ba00d06222d09bedeca176c8c339e26df84 py3k
+75065 781ef95cb781876cfe14bed5f7a95656fbba7ca0 release31-maint
+75066 2bfaddb19c3a1c65bbafdd60dee1ff7ca52986ab legacy-trunk
+75067 00a5cf37431462401a1d7627db4c3e6e5cb314ef py3k
+75068 85e1ddde569e263ac485c01bcb7fd2e95855cb4f legacy-trunk
+75069 e99024eddfb45c633b9b9a9578eea3f9f79f2a07 release26-maint
+75070 89fa2641715d349a94295c26ba1a797046b2bb41 legacy-trunk
+75071 acbfc69b55f3e0d64807ced9c66dfb490d396ddd release26-maint
+75072 076b233352637e22c951a8abe0ce20b767741d3c py3k
+75073 bf9bef70f7e8ac6291d685b107006b50a46cb045 release31-maint
+75074 2006a2f4812d767f69ef7cfc0f968590ec1319ca py3k
+75075 f3c595214abc40061d827c12d63db5ef89b97aeb release31-maint
+75076 7391436d8a7489d461b278ac95eefd4395c7227c legacy-trunk
+75078 dd456496909cd4ccaef3d7f6663c03e595725ad1 py3k
+75079 b050ea7baf40debc94ac1d6333bbac1141a188e0 py3k
+75080 7ee140b7ef93bafdaca8dfb53426665141611ac9 py3k
+75082 0453d18c63a4e858176e933923dd4f528c4adb42 py3k
+75083 d6889da0652c7f86bb3837ae4343945576c454ab release26-maint
+75084 546101a6677c84e3397fb6ba42af5ec584acf010 legacy-trunk
+75085 b0e9619b31d8d0a1d8727261b4d536a3d908d43a release26-maint
+75086 fcb31be2136d64d046a5489173b92f7bac61aee7 py3k
+75087 c0d95625f17de78fdd74658cc62d9a03a48b5eab release26-maint
+75089 1a65ddd7d9e151df13e7f27b7d114c934e59316f release26-maint
+75090 f3fa3967f44641f589a0db619cd389744ee0950a py3k
+75091 3dec3b77b7875bc371aeaf4d0109df8f99eac825 legacy-trunk
+75092 a041084c1fdd66270d860be1e323843c50c33858 release26-maint
+75093 910da545e17bc5f1a4410bc29ea7892fc3aa79f7 py3k
+75094 7d026f706450d9803d4fbadc010df58162b2ab0c release31-maint
+75095 bb8b770ce890e91bdff3e56287278edaaf6d5bea legacy-trunk
+75098 f04a1f2023ecb6881bf15d6913670b6eda1870a2 legacy-trunk
+75100 debb245ebb4018d18b83cd071024b444da04998c py3k
+75102 c76674c2d74d039f916fd57b703ddebd45f2d8a2 legacy-trunk
+75103 e95218605300ed064dc8e59d74ddbbc1d3f8da96 legacy-trunk
+75104 ab49e0ac8c8f131e2c3d5cb7ad7d59db407261bb legacy-trunk
+75105 b6aff7a59803009d8ffc9fb0acb56d986daf9e17 py3k
+75106 94572949c1ca4bde1338178a89b785c2c8e15a9e legacy-trunk
+75107 d108fe77c06c256ceeae892cad32f22f19ef60fe py3k
+75108 7013e36511a8cedefb81eb9e5b217810edda1858 py3k
+75109 8927718c198ff7b7a9f65ca6769517546ea73947 py3k
+75110 3ab464fd5e01a5ddda6eba687b88db52a8958610 legacy-trunk
+75111 5231ec512c7afd04a1e5668883189e3619919da8 legacy-trunk
+75112 cf90aa57b20bc3675216958a11ad3e4b4d941283 release26-maint
+75113 99e36f47ca0f766f41101b3c0bb2bbacf6632ab2 py3k
+75114 4ec915a5bb4e0cfc808fffcafea01d15f7365a1c release31-maint
+75115 7f695dd64f901d32f2ed5e565b81229aeb01f943 legacy-trunk
+75116 56b530029bacf6ab28e85a00d2004cfc36a42ba9 release26-maint
+75117 b50dd17dfe262a4725f4ae3e6e470a1fd400d35e legacy-trunk
+75118 50c30a8284fbb4ce4cab20b9442421387ea2177e py3k
+75119 47b82fbdc2bb1e00f036967e5124b0a4bdd794d9 py3k
+75120 20124eb8811bbfc856c2a8ca62f2a93e6f233787 release26-maint
+75121 b985bcdb8b914b3cad4e74fb40095309d0abebb8 release31-maint
+75122 82502182546390eaaabce9267f3a072c7a394163 release26-maint
+75123 eebf3d51d3a46f3582ed47b32af5d0ecdbcd0751 legacy-trunk
+75124 ee9a551a875ed4fe6d5ce4bb9b4cbdf5b4f64ba4 release26-maint
+75125 c63e06387b8fcdf6a1e28eb64264a6c66e386f4c py3k
+75126 74b18a267cd752ada3b3db4efdfe2d52ce7e51e6 release31-maint
+75127 edd9a5e3cafb6f096e1a26603bf7270ba274867f release25-maint
+75128 3577af512df573033f5b8e18fe8347ad2636df19 py3k
+75129 f26b802c003e5c003540746e841b7fb27d088d78 legacy-trunk
+75130 a8d0e764e34b1ca2edcb45fe1c7aaac34c7730f5 release26-maint
+75131 e5b81212fdfd71769f412fafd54baa883b38be84 legacy-trunk
+75132 986709c245318940701d1bfa176318f5fd98b6bd release26-maint
+75133 4d74734495cfd6687d11935b91236d89e759b281 py3k
+75134 e0f234116ab14983569294efcaf3d13a0db25281 legacy-trunk
+75135 2e2c142bbeaa99ac173c8d84cd61bb51fb1dd6c6 release26-maint
+75136 1843886b2b1d860b08cf96bf8e3462b886561da6 release26-maint
+75137 1f7361c74234c5ccc244bb015267296001cec9b1 py3k
+75138 e72a73ad7e294cbeffa1f5c5b90a88679eef62d3 release26-maint
+75139 8e9bdc6a100fa086bd466fba6f2ac62c30bb292d legacy-trunk
+75140 19a4a623d8b7044c2b1b9e251b2c8b08a42424fc release31-maint
+75141 91f9df5367c1a5f1c6146cf84e96db39171f5a70 legacy-trunk
+75142 a17cd9fcdd469ed1f385092cd808146bf1f2060b release31-maint
+75143 1ea03f86e0813dd80e59f0a67552b2f5a8d11557 legacy-trunk
+75144 7e1856167c4a82ec17540298cc82583e58e74002 release26-maint
+75145 ba19662eb221b83e63818ee4b13a142f3314d283 py3k
+75146 08e59076d86b2cae0dfe27cf5590fb93e8160a50 release31-maint
+75147 f99bca6ab0dcc85e78a4fc09593c7cb32411b3af legacy-trunk
+75148 dad7453d0d0862bb7302553788f85b4e1c313637 release26-maint
+75149 df58ff2de09ba2185c2119f264b638e979c7d253 legacy-trunk
+75150 6716c5f8c60d5ce546034a54a834328535853905 release26-maint
+75151 1873542c00000c4b7ce2c7992d1f2d87f866232a release26-maint
+75152 0effdb39c47b7a07b1997a5dbb5bee6676613e3f release26-maint
+75154 7bcaf064e2405674d8b56e0b4ecbf18650225999 release26-maint
+75155 5acae46af843fa8c3ad91271a41b0d0bde32ddc7 release26-maint
+75156 d91209d8251de60530c066a56f4497412eb454f8 release26-maint
+75157 5f245da72aebb4d277fea44b3be0bc4355e05263 legacy-trunk
+75158 1c016f0e94bac1f64290f9b2cd8691ddf1e2eef4 py3k
+75160 16c985daaeb09d653b64cfeb76d484f89947cf52 release31-maint
+75161 e7e452449a5eac9a8accbbfca7550183d1b3393f py3k
+75162 703de55e00b85d67ee04d738ad1439531904f212 release31-maint
+75163 084580a349b7113786576215fbff4b5cb91d7685 py3k
+75164 339b82321f8ef639a1cb48f403b650cb21e5cefd legacy-trunk
+75165 3e28816aa0a2325a727ef61bba15cb589b5382cc legacy-trunk
+75166 807b0d597314b2f44b55f7109f204bee00d74517 legacy-trunk
+75167 9217bd0cc3fcd50380342c3313a221034e9a8a85 py3k
+75168 1064555237e218cfd39f096e031813c017cbd527 py3k
+75169 e1d6951bf39d7dfcda60aafcfffeaeeb8b0569fb release31-maint
+75170 5ec15da1fc42205a1e13e19c0f37b45b90e307a2 release31-maint
+75171 117b308be321436b6ba919a9011c8338c8477450 legacy-trunk
+75172 ce214ee41164928a30b66ddefb4e1a08a9e8bb4a release26-maint
+75173 1700a78973cd8146b0b82ece191fd1f356fd3941 py3k
+75174 2c7b1d5c8b65b1cec1e29ebc325794c33342570f py3k
+75175 dc3500d39ef14899181b300f6fb5e460b72ba836 legacy-trunk
+75176 fe8b9b73d9af0d4d6f4cd2963d389cde0c6a7741 release31-maint
+75177 e304d9f34d152870530b2d810984b738ba70ac8d py3k
+75178 fe964b3c9662c772ee40c37874ec6d565d26561c release31-maint
+75179 9f198b0f367fba04dac361ba0a3a5e4bc31c26c3 release31-maint
+75180 e6a5ebe5aedd8ee302bd423cd4cdb2a926e86f34 legacy-trunk
+75181 783e6cc2ab6235196b927050b6aa9b5cc9212dc9 legacy-trunk
+75183 00c3396d7a8c4ab4c2c841d61013a073ae921d0f release26-maint
+75184 8e7a692787981588732f650ac2fcaa50372a0c2a release26-maint
+75187 c850ce977bb982d7251d3f7fa4730be4cfb5f6a2 release26-maint
+75191 4c59983bb057966570616c2c3fd20954c26f9c6b release26-maint
+75192 c2c90d1f3c33ec69724e69f832d4c34a5cf6f105 legacy-trunk
+75193 7290140cd33027044440a63b1d56b820a9d06009 release26-maint
+75194 c4119286faa75d7de9e21d1077c6c3a7ec6bdbe5 py3k
+75195 9b1eb5e75e159e7e7ed3e3f98536699483f068d4 release31-maint
+75196 7d7f9783c86db1493f356043895d88da983c7e2f legacy-trunk
+75197 67409bc99fa2bcf000140ca03fa9f5d4eaa52133 release26-maint
+75198 77ee220686cc502bb02959b9146ca0c839578b30 py3k
+75199 275d60f93d3c5f61908e8d7d35fea920127431a0 release26-maint
+75202 431350f21d87e9d8ec70c6f5ac65c323fbae70af release26-maint
+75203 9130fe9c58bf97df8d43fd23364af056bf2a70b1 release26-maint
+75204 fc74d51a679741a9d536c0aa5d488e7a34ff947a release26-maint
+75205 d4136090ac34f91eda11e7e34d933cf604af5704 legacy-trunk
+75206 25cfb70bcd5e9dd08cf0e590df457655f13f934a release26-maint
+75207 3ee04ea9cc6e2f731f7513f2a5de727888a0be92 py3k
+75208 946cecaf64c1f1d077f66c020f6537f873c79933 release31-maint
+75209 5384c8ee4a26ce01e7704af39db8af3fe7f2fbd7 legacy-trunk
+75210 39b9994e86693b351d2c3ef9ac2af5f2bc6fca03 py3k
+75211 28fbcc79c20a93c6a652990c1fe3440db392e358 release26-maint
+75212 6d0dfe3a13ca18ab34b53dd63f42d52902da90a3 py3k
+75214 849fb27c559466244be2c383fa8aed16d65cf44a py3k
+75215 5227eabdbb64758608b51b8e418e05938d31cf45 release31-maint
+75216 53f17cc7bff67c6c0c8ee3609b1d3807116b9346 py3k
+75217 d549366dd218b3240c3abaf3d8ed4976c191ad2c release31-maint
+75218 150cdaea58ec6916ac519d09337b3d3e6dbcb247 release31-maint
+75220 6cff682a30981fe203353816446d06798a8b5e18 py3k
+75221 5c0a7800215a6743bf17bfcc4b792e196073debe release31-maint
+75223 cceb62eb1cf1832b2762bdfeaf7c9f1ec5ac8624 legacy-trunk
+75224 45fce310d4792cc3f9ad336118652e86650f4167 py3k
+75226 4f49bd2e7c58d29849d237fae680fd864d043bca release31-maint
+75228 218cdd6c684285d82b8b083a48028574aba13816 release26-maint
+75229 d5d8cb98eb2aeea09d98530aacd5954850652fce release26-maint
+75230 f4056f8feec26bd292536df618efaad8095352ee legacy-trunk
+75231 41bb5e2dc947ac3f7c4af946c01a14e0b0ad067b py3k
+75232 c9bd62efe6ce5524e174d1063d165b8c9be0b363 release31-maint
+75233 bec2e445e224b65a0df121d61f999e80d4b3120c py3k
+75234 5bce3a59bfd2c5efc7ba8fc71bf79ecefd14c9ab release31-maint
+75236 bb2a123cdd7bb2af5801921d83533b0c48b1e049 legacy-trunk
+75237 321c2207d5f8fa945b52917d4a8459bbe107742d release26-maint
+75238 919a27ddb4a321186b13345a35892232e9b1b6c1 py3k
+75239 05389014bf4449cda0625ce2a4b264eb0a970eff release31-maint
+75240 a2cabb36257f3bc01305f95d8c032d353b63c601 release26-maint
+75241 c219f7261d9863563116d5447dc6776f3fe8aace py3k
+75242 922c1122c925b6ae562f18fe720a9907a1dd4c84 py3k
+75243 8dbb0fc3998ad089042415524b7ecec29f5f0d83 py3k
+75244 c827710bcdfdb2f61c418ec744bc3bc9ecbb5486 py3k
+75245 138c7fc19b5d6eec4fc340cb64df968f000c9e37 py3k
+75246 2b7e0eaac64edd4000a3f6c44d39a6455d98ec7a py3k
+75247 2e4d7a40c2dd7e133b71a9879747996a7b9de23d release31-maint
+75248 b0b9e5928da99ddda2b75c74c4c66cde82d20967 py3k
+75249 6b23b0eba405165a0b1a2dc9b67dd78f6c5d031c release31-maint
+75250 7aa4a421152f924e11f10721ca3101bb28e5f486 release26-maint
+75251 38be26390355004b61a5c020d6734390638924a7 release26-maint
+75252 490190cb4a577228673346dd65e1975e69689591 release26-maint
+75253 278cf5c8f1fa97c2668c93912f33684edc8440de release26-maint
+75254 d5250da005ca739f2ea868f3cd28900396fb04b0 release26-maint
+75255 974c03c98884806cfd384c26db607fe5ba2bcdb1 legacy-trunk
+75256 29c0196b1bdd7b51760c126fb3a70870a7258c28 release26-maint
+75257 a01f413ea08b6d917b57f7a0c0f02d478dcc2b96 pep370
+75258 b4d1be7102b31b01137cf1727b858b42616cbfac legacy-trunk
+75259 f7eea62b08b05a3b92a9df7aecd1dad7f2487a87 py3k
+75260 ee902016243a29e77dd2e6daad51fd3bc12a2f58 legacy-trunk
+75261 987e596cf57373e9fc3116af134a72a71d8cfba3 legacy-trunk
+75262 1c7f2b9a16782c06c51054d757b8a75006838332 legacy-trunk
+75263 2fa9ffe6d1451d7fededfd38b1240b5d1f00f9ee legacy-trunk
+75264 d2f9591154286e54f21243cd32b7c03d9fe46c83 legacy-trunk
+75265 a12e701d97cac787f15e5f4933b1a8f56d4b9fd7 legacy-trunk
+75266 a45950726bdfbadbee155edb805d733e203cfb1f legacy-trunk
+75267 a6e7ed52df9b317e6ac880a2b6a1b6f19ad36246 legacy-trunk
+75268 c9d9b7d09422f7a6a92021081f8003a9bfece28c legacy-trunk
+75269 a4a324c2a00c78084eaddd003b656e366c680467 release26-maint
+75270 25aa90a6865b63133962dd64626c53c7b6fd47d5 release26-maint
+75271 433f727e5e823f00d1023b43902ebb38fc2f922d release26-maint
+75272 a9864417286b93d5cb569471a298161517d5d41c legacy-trunk
+75273 5e3f6e8d6ae595597c64d5caea0794254fc4b35b legacy-trunk
+75274 6c91d18031826816a99119a39fcc4f4f4e69e7da py3k
+75275 c5a3d43146769da367708c11bc4c4738c99e1dc9 legacy-trunk
+75276 3296935299ce627d79210c61f5696be6e0689977 py3k
+75277 dc047d9abf7b6cf90fdc12bde8617b9a00be8f0b release31-maint
+75279 6155b959ff72bdf5ef3ca0f0f19ce46662a9994a py3k
+75280 f99b3fc01fc06896c39292b495b0bbdfba06101b release31-maint
+75281 c45ce285f552b963e42861525fd12bc0ccf0a9d8 legacy-trunk
+75282 b78521ae7a6245e48bd5c882dbe59f37f558b087 release26-maint
+75283 e759ca25701d9a667ddb872bba5b5777e766ef7d legacy-trunk
+75284 249b0be797a82e2edf63c7830e5fa3670bc572fb py3k
+75285 dd94f1d8c9a5ca44696349067017fbbf23b1d837 release31-maint
+75286 48ab2e62de8bc6bd365ac1a0143119a65ab06178 legacy-trunk
+75287 ef7346448b600dfceeb54af1003d0f7e0254d1f8 py3k
+75288 3072f940f35a36b6d49f5e24ef1fdd55b889a1bb release31-maint
+75289 96aff2c2a9a1d5b72e0f4f1d0c1ed7958d078c5f legacy-trunk
+75290 cb49f2eb04579f87afbeca709d06e76bcf2a0635 py3k
+75291 9f631a3bb5493fad99817929d899813f80b0ebd0 release31-maint
+75292 d790202c151db0c6fb4352988fd817cfeff54ba8 legacy-trunk
+75293 abbc797575c42370a9ece1bcdb45061c8ed155d2 legacy-trunk
+75294 eb0c39f62de19cc7c247d6449098cc9fe0b54850 release31-maint
+75296 5458c20aa0cf8395bf4db49b1c196857dfe35097 py3k
+75297 946e3af00b0b8f13b68f97d87af5b2e3eb76d51d py3k
+75298 2c60e946062ec0afaa21d3bea7b7243f63596bbb py3k
+75299 25e51c5b0696e85c4901b696ed7a245dc66aa96b py3k
+75300 896a4fb13f35c91dffb054df85eea82de3e9de75 legacy-trunk
+75301 1ec8c7fb8807b5afcf6c536540a68a581558898b legacy-trunk
+75302 12cd94d39874648eb0f3cfb537cedfc0dd00f231 release31-maint
+75304 57ee0793e4627b80ce12b6ff4034fea7adc45d75 legacy-trunk
+75305 684960fb1cbf64e857979cc2a9685f06716bc119 legacy-trunk
+75306 ab42033fdfdbe5ab4e126ee5e1a8081ec1ce0231 py3k
+75307 91aa044101390ced398aad61e71001a0670d159a py3k
+75308 2836939e7c547ffed40646e122ff3abd0eb2362b release31-maint
+75309 29908f2bc93fd8cdec3574ce470a5ad01ef057bb py3k
+75310 6d092a51e187e4522d6bde835849cc26150f6f0e legacy-trunk
+75310 4f91312d6ec2ab35e7ab822a83da009230f124aa py3k
+75311 b5ea4773aff1021a35611bea21d0e4ba9674e355 py3k
+75312 a2f02a125feb0b969d83864a0e947f79a98143a8 legacy-trunk
+75313 32c35f9b245c87c0c079f841b9d7c5d5c6fca8c3 legacy-trunk
+75314 d73f2215efc19f9237268f8b47338d58a39c80e0 py3k
+75315 33b0413500342af70c28b9cd35490c1a54bd57c3 legacy-trunk
+75316 ef31b04de50562ffc450a6a1d40e0aeef88d76aa py3k
+75317 3931c78af1175b3c7424f3313df00cb9f05edced py3k
+75318 ff8c86a24b158fbae1cf454855ff58c86f03414a legacy-trunk
+75319 35619cfcd0b5bf5a43001f6213fb2d2f338d8458 py3k
+75320 220f7deffbafb57602ba735f433b2ed070133fbd py3k
+75321 42a6a2249474ca6b20c1104aae86ba078d5f257f legacy-trunk
+75322 34999a1aea9b2617613fc0ebc159bf211d60f7fb legacy-trunk
+75323 bfa60df769290a123e36bcee42d0bf05a354141d py3k
+75324 443149fb35748f5cdcfba899a9726df291df5d0e py3k
+75325 6587ea6d3e7845def9a23c52a2125b482ab7508f legacy-trunk
+75326 f32feda65c856ae4ad2584dd8c07774fdee082cd py3k
+75327 458153d5d82d6f71c7fe8db4216ea8e48f69eb26 legacy-trunk
+75328 2168b9d49e3b1908b2c12fada85dd546facc3c26 py3k
+75329 5597ba70a336c865f06a8a1902d321697379d804 legacy-trunk
+75330 f76e2e637730189a4cf1608ef4f47f1a25f97d77 py3k
+75333 24e92cef26646359fe02613c6031cb9c1ac57cbd legacy-trunk
+75334 b942c706e3381228c2af79cdb9a8b25500125f44 py3k
+75335 696aceb7635b99965578ca57a98ff4f3b8d3ff8c release26-maint
+75336 867633330a938e7463997f95428037e30d7ba3c6 release31-maint
+75337 6194fd75432398f8e5ebe8921a026b902ebaf2f2 legacy-trunk
+75338 86b684c969424b2eae6f9d651a4d0a3517fc3e8e py3k
+75339 3130b7e812b04eaf39884063d5cf5f53e3c18335 legacy-trunk
+75340 89b4bb0aa5acf838629e61093f3e3634b3ca1ead py3k
+75341 4dd090100ecafb5b6928941d0c16ee3b16ff000c py3k
+75342 3ed65716d7ad242c9996cb6a01f4860b7027bef2 legacy-trunk
+75343 5c365aab10d1ce30fe7450670ebd56ae980eb4dc py3k
+75344 c105b98e649de9a45843e836335e20693301d88c legacy-trunk
+75345 0ad7f9c952b08ca12890b4ad4b03438aa8719db7 py3k
+75346 4ba27d18dd92daafb73b17f9ff595547856447cb legacy-trunk
+75347 bde8a396228c2aac21e439cb2cb10798e8a42f59 py3k
+75348 a15c7d50b3cb64e016ed23e38b7f132facd93495 legacy-trunk
+75349 397e02e0be9314b542103fd56d498a2a04e36b13 py3k
+75350 ca018e2bb8654b9b594f6a7a4a471a2042f633bb legacy-trunk
+75351 52d6973cbd94eb3344b0373c2d6ba313eb1bdaeb legacy-trunk
+75352 53c83a132e1ea21bb6c66ae94bf4427479802a33 py3k
+75353 698e0e69c7657b269c0e4f128607deabc94358a5 py3k
+75354 6a5e0c913c7cebaac8fa417f35687403859e8064 legacy-trunk
+75355 920408e6030321337b913a1c39fb1becda32fd70 py3k
+75356 e4619cf9e62cbe128f9eaab2c1cd4c9925f6c5d3 legacy-trunk
+75357 8ee45179c503987b03b07f1a51b7cf970a9c57d7 py3k
+75358 a5d7b527795193cc6aac6c1d91eb708efbf643c4 legacy-trunk
+75359 1521a657a85ad9b56018977c559b0048ac4125a7 py3k
+75362 205b96efb7900a128e730c3c6c892fe9cb178426 py3k
+75363 32008d23f6cb48a1eda0b27f1b1af688b0ea77fd legacy-trunk
+75365 9f765118d9b97139d6e683f8bf66357b8589da2d legacy-trunk
+75367 22008d934e637592c4727cba92f166a1932d87a1 legacy-trunk
+75369 43ad554615b6d200c62fed7564ef6835147973e0 py3k
+75370 050748ce5ad9eae24282eaab67c68bdad83dde36 legacy-trunk
+75371 4b5d398eb8666433defdf8d7a237c26c82f8e834 legacy-trunk
+75372 9a2c37c32b7e7180a7315daa8cc48bf593720d2f legacy-trunk
+75373 cddb620f0cda0ae14b311b83478dfd555f50bea0 py3k
+75374 16884795532494bd6ee017816ad6d48c6e7f4989 py3k
+75376 3922e734c9bb732f9f4e4df98ce79bc52f180b89 legacy-trunk
+75390 f59da9c93425a9f9cf617c87cac04858aa5aee9e release26-maint
+75391 95a69640ebd3bd1797fa8ba2aa2f701a727517d1 legacy-trunk
+75392 9d17bb4f1170fab210f78788233b2218f56842da legacy-trunk
+75393 209e38254ae8b878d345354fef0de29e9e212578 py3k
+75394 9bd6a7aee13ca80e856979ee3979fad23c5e6160 legacy-trunk
+75395 2a7583718d253fd5a0da26cf980580f36589d2ef release26-maint
+75396 7fe8a8313a5b2e7e23422efacf9676fb35ebd64d legacy-trunk
+75397 e8e103488fb37e30b9dff8f4a81f6076c1246ca4 py3k
+75400 bdbda7a94c333e0365df6192c3940a73907d84ce legacy-trunk
+75401 77561cd39fd397bd3face32eee5a96cbb9436e66 release31-maint
+75402 03854732a6c28e739d5546f24b9aa72e1e005bde legacy-trunk
+75403 183474bb02138da88c3b496c52a7b1b0a05da4ca legacy-trunk
+75404 63508ec76840aa64820987571a7895eadd10cf0b py3k
+75405 dc75d17dd304a506bd157e5c2a4eaeff317cace0 legacy-trunk
+75406 67bb17c2e8685219fab3c7bfb200c06e4dd850c2 release31-maint
+75407 247d5a5eafa5343975b99f3ee98fa4c1d9458168 legacy-trunk
+75408 58e57631be8cb638ed31e4b4229a036e477a928d legacy-trunk
+75409 386a4d7c3c99cfa49243c38c85fa4449bff78d68 legacy-trunk
+75410 cdcd805eee85d650573021122e0625fb6ff722a2 legacy-trunk
+75411 e8532cc8a14e4974f8a3f274c2c3ec7c3b04b989 legacy-trunk
+75412 9e718d8f71e8f014a6776ba2c1cab576d8e70b66 legacy-trunk
+75413 4ee343c4bc49d07e3ee665b12c60235997c5f602 legacy-trunk
+75415 6d50c4c1a8b346fe0364f237fc280cab1aaa278d legacy-trunk
+75416 5dfc58f39b9f542190e69d70ca227cdfecc38b45 py3k
+75417 bf8c9bf7115c93a230f9fb9f338f499b2a5dcc1c legacy-trunk
+75418 d24298df2a66206bd03858d93e734c06a51505ab legacy-trunk
+75419 93350acb5425ba4f00b5cd808c7c604ee7a50281 legacy-trunk
+75420 64e19a68988617ef545fd45180d0f8872eae14e1 legacy-trunk
+75421 fe38d3c17888c8c0ebea13b8aae1f1fcde2d207b legacy-trunk
+75422 16db2a9322489c39ebf2b05d7b606f394fb0aa67 py3k
+75423 50b7f56814f9e3ea3c610b1feb26a57ed103d91b legacy-trunk
+75424 d0f005e6fadd064d75030a9adbafb12e7a26ca7d legacy-trunk
+75425 9044f64b10ae06b8c01af3cd4786f2ee27414648 release26-maint
+75429 fa6188c47b63fc525d839c8795b25d2f3576ad00 legacy-trunk
+75430 45b62725377a6128597dbcfdc6d9ff5e74cde161 legacy-trunk
+75431 a4b1922a307492184aa44694d928cb51c124d90e legacy-trunk
+75432 e00c78869b3cd3568d177ead27109bf11852d6ce legacy-trunk
+75433 983eefbf6649340e77db25200ec19723436b739c legacy-trunk
+75434 e4a0b8739e5b8ab7bf9e4fa6ebfffda73f467a3c legacy-trunk
+75435 3b37b8dd76d75025f141247ef4d953fcb6219fb1 py3k
+75436 ec508c89ad3682078ce43c07dd65dd2dddd4c472 legacy-trunk
+75437 20d09549b82c0b99b770c114802d7d8b89d25a93 legacy-trunk
+75438 1617c11556afa28c1bcab5482490a5f3f1dfb0db legacy-trunk
+75439 7e58494204c8f6e43ddeb09a96748aec47843c36 py3k
+75440 2754d64180d1dc557dab2979a79258a870d4d602 legacy-trunk
+75441 3bc6fb3c0ccd09a05074fba2fa4e7b33421fd879 py3k
+75445 d9e48ab62562c14f03b252bb119cf3b8d826af35 legacy-trunk
+75445 d9630517c70c1950422ac7e122fe1389ff1c1f15 py3k
+75446 7fa14be8ad73cb35757665d81381e1730d4d1c56 legacy-trunk
+75447 8dfa843c83501a0e5db9daf3c7412bf68e08f4eb release26-maint
+75448 24d321fd3d1a20b1474648eb1b3d4bdf2245a25d py3k
+75450 9e42cc192a44659f482b8770aabf3d2d7ef48b87 legacy-trunk
+75451 7600436db2a9b869b9f030f4b68e0f7c8e91d4fc py3k
+75452 26b11e6fe5e31c67ebff88cfe69c4de0ae83c8ce release31-maint
+75453 3658c0a958922af926f3997674fb1fc7c757d81d legacy-trunk
+75454 624f81b5ec24f773bb01f079465d8dc7abe5bcd7 legacy-trunk
+75455 7d71c51fc308c1b2653b9f23d37c41e459a17544 py3k
+75456 5ea6cd2839cc7c10276e9a275c16f502d99a7534 legacy-trunk
+75457 9c06c730976566c4ed9a9111b9eadfb7a908b0f1 legacy-trunk
+75458 5299579f579a854afb8e0717332304dca7e26c69 legacy-trunk
+75459 4c1ff7b2482ee18a4e98f003bcf59e8692574896 legacy-trunk
+75461 a1088bb4fcf8a6d213467ef818408db0bd81978f legacy-trunk
+75462 2048d04deab42c555b835ba7b419d4a28d9c192c legacy-trunk
+75463 81433a676a8bafe1fe365f9dc380b22afd5b9b0c legacy-trunk
+75465 b818a7a70a477811a1f10a43bbcffe44ed55c74b legacy-trunk
+75466 9f053e550c97768b0fadf8295b0246d3d4316626 legacy-trunk
+75467 993207dce3955b408f6a6a25158519d6098945bb legacy-trunk
+75468 007505cc1e2c7356f64ad5eff4dae6b54d9d2895 legacy-trunk
+75470 ac3c632e1c13c31c660b79223ff73e993c50f083 legacy-trunk
+75471 e6deb15c5ae6a06fc1d46a91b32747f7df661bef py3k
+75472 354fa561aadf6cda10568ca598e3a4107ce3cb72 py3k
+75473 49e3d4ac69c6f980c35355b005c81748f239deec release31-maint
+75474 8a6b61484a984b8a8fd189707aabfab57d69d04e legacy-trunk
+75475 c37ca9acd1f9aacb9eeb380f1792c463dfa96a31 release26-maint
+75476 30bb4c35559d61651e751e71825744cfccb75d51 py3k
+75477 d079877da335e63828f97794653e8113acb5392b release31-maint
+75478 84c16808ba2c81da2eebcc0bcdae27dc580370d8 legacy-trunk
+75479 d944400114e500d5c629a5feeef33bb582c58579 release26-maint
+75480 aa53a2d4ef2fcbe9b38a051b6b78ae7a67894f61 release26-maint
+75481 5e7c5c94c5721a16b97c23ccda30147820f01855 legacy-trunk
+75482 349c0337896a272f606f90ee66e06a860261777f legacy-trunk
+75483 ed7dec136430fe55b65b9bfb738b73f7a184712e release26-maint
+75484 777bd5dd1d9ac541a2a3a937fba9268c9bf2e3a5 legacy-trunk
+75485 e67eb966004179febdbf98741aaf3e8df2102aac legacy-trunk
+75486 77ecc5e4f664c71424e4d51aa5f1363a16092cb1 legacy-trunk
+75487 2928f1e8b385815423ad2e89b5d8c90171052060 py3k
+75488 cb53b1fa7206f2f520505279d5d85544eb6bfc3d py3k
+75489 3dbc6207cbf6de4ffa51ca0b9c97db12de038635 legacy-trunk
+75490 893c2a4c9544455f798718801e9f87a21def0496 release26-maint
+75491 de2d99aa46eaff483a9f5cab290271a1de4e5666 py3k
+75492 2b6359709188b11b69f317eb0edd3cdd4b01e962 release31-maint
+75493 098ba3a63730ca6d764bbadf59f0cfa74bc61001 py3k
+75494 5397002f7e5e8fb918121d0d0f60374725cf7c8f release31-maint
+75495 0f9e8d3ecac38c576070f555529a79f6922c1d58 py3k
+75496 2c60ac4ed65f6900b84abaacc9a9243be434bae2 py3k
+75497 ea1fdafbe4fe2458ac17287e0d6c709ed00fce5c release26-maint
+75498 bfe756eb09faad05e7ad0a9a5a08dc67be13fbaf release26-maint
+75499 a0e41dfb972b51878339cfab1f1749d905bf5ed7 legacy-trunk
+75500 386414b846ebccdcc784ed5d770130cce6523dde py3k
+75501 25ef6f4818a057894bd9d770ff974897c0856417 legacy-trunk
+75503 06999253987bb5385e71972e50ada6510343f915 legacy-trunk
+75504 2a6853a13a2f797d9b842fc26098172de708a44c py3k
+75505 3ccd1d6f05a6b5c70c5a5d98f4f3c4a118660b14 release31-maint
+75506 d1666cc7bc74f3ad9fe4fcf1f0b8e491e9dba52a legacy-trunk
+75507 d89e4a4e0b207fdb40c6f9927583cadb95406f11 release26-maint
+75508 ed99026e07fcdde886c7a1c407afa99e3085d7d7 py3k
+75510 79cb07fa36ec10e003c6a0563a91ceedcc18ac2f legacy-trunk
+75511 6749c8adc49857cddc21eed6c7def06eb8c6a762 release26-maint
+75512 e644ee4e76c7bcf7ac1f4e5557c1654fc003e3da py3k
+75513 f4263a9bd8adda73ad4a545b21ad56b31938c00a py3k
+75514 9825ec228efb12cb2bf67813b6978cf2614b51ef release31-maint
+75515 371937ba6fa62cb0bc8f5776ce69d86c14f6878b release26-maint
+75516 d8a7b314fc505012539fbde5d1d5ca38d528ce29 release26-maint
+75517 71880029fe7562a4380e20ca9de1ba32389f1d19 release26-maint
+75518 f30667cd4043c43b89e034890e8b04668ce40f78 legacy-trunk
+75519 160f16a91ee7385a50b36a13f1abd2583b3825c6 py3k
+75520 bd6dee6a78c395ec617eb41f26bbad10a6e87fad release26-maint
+75521 42303c8cab315ebe70a9bc4c8b111c71e4726bfd release31-maint
+75522 4a9542accd13345e75e0bffd97df55cfe185a650 py3k
+75523 670e222afd4817d38ae1bb8e96496d74d2494564 release31-maint
+75524 3daacd98925d7867778095217dfa7a71756da3b5 legacy-trunk
+75525 73272bd94d7b03a19978ade84fbf008971bc6819 py3k
+75526 34182f98589b8c9a2390b906a36f736b7004a793 py3k
+75527 f74030ba661088f6e292079a0798ca9d96b24b2a release31-maint
+75528 90c10dcb29133922218a7e1d6d29e24896187076 legacy-trunk
+75529 43d0b47106df8b8eeded8579f1f647cd8d103f97 legacy-trunk
+75530 5541e42e1c811d1dbe46e393e3723a0a64c4d9fa py3k
+75531 85685e7d72c7184bc6b739a582d0ea8cfe1b1be9 legacy-trunk
+75532 54031ece43a33aca16dc09f32a12477e3ea6b56b legacy-trunk
+75533 caf3c93d01936a4b2e47ae62e85e78cf59aa55f2 py3k
+75534 e6c4dbb5db02e508a49e797faf9346360503190c release31-maint
+75535 7ad6e78a9c7dcdb156deda2cc455a268c825f6e3 py3k
+75536 cec7f4c5854414290f756e560437799af776b90f release31-maint
+75537 edf22637bd908d37c974085916d6b79664e71e1f py3k
+75538 2f14b0f4551af2a2900737ec1b49ed164a5dbd48 py3k
+75539 91ee81f1a5242b66e5bc9f5e526000f623bef9c6 py3k
+75541 7ae6d5e4f79835e7b407f8a72d08af327c23d268 release31-maint
+75542 95bd70d5d715cf08db531d5e7c720a95cdfd7dd9 py3k
+75551 bdc390721f975c8d9f610e3af854094069b7eabc legacy-trunk
+75556 a21998893b1de4663dbef1b8d9d07e2957e48030 py3k
+75557 941f1be423aa18871ebd9f51ada1e36ef1dd0092 release31-maint
+75561 1b602a2d81ef518b7e287242a1672b56e1dc80cf legacy-trunk
+75562 6e4a490e714713ec04a7e45813c50c0685d8df4d py3k
+75563 26007395607e89dc3f9961109848c0c30b3df1aa release31-maint
+75570 12079c3d4b779cccfbf2e3ad305b193ce37eea95 legacy-trunk
+75571 bf7624120ec7fe1aae086bda0be238960ee3ed8a py3k
+75572 0299951391e36ad2315dd40f5f4f5843af73f419 legacy-trunk
+75573 b3befe0f2b8ddc2de47bf33fa3958dd6cc390f2d py3k
+75574 3cfd20cd6459f5cc42fcba1f062c84b7f32076e5 legacy-trunk
+75576 17ce94aee7046ab90f2814bf36749c47a9cc3d12 py3k
+75577 1e7035fa6154c6f65f060f6d9a52c3b1294588e9 py3k
+75578 29b3e126c0c24672f7f438a148ec5c38681330eb release31-maint
+75580 1b944497e81e1dbfdf25820d5e5c70891995055f legacy-trunk
+75581 8c1b61e7463a41f7f1d7e6c689040bac275c2550 py3k
+75584 5d8b2d6dcd6229dea2c4b57f18dc4b9527607375 release26-maint
+75586 716ec3ed3fcf8faf5e3db8ba5af193912014ac13 legacy-trunk
+75586 414e03c148159f49bd6debfe5ca8bbcd8fde0797 py3k
+75589 ebe19c4c71f5706c97e2ba7b83aa83e7872e6a96 legacy-trunk
+75590 a9ba637d4dcd375654c4bc2014c3904e2219da69 legacy-trunk
+75591 978349c074ce0828bf55c01a2aa1e60433602057 legacy-trunk
+75592 fe85ef27dc4791e66df54c9d17095457564b6bb0 legacy-trunk
+75593 5de1ac242bfb563f445f736b5648d75f8aa17cec legacy-trunk
+75594 58bda1205acd9d891c34e389857c4fb2bac7007a legacy-trunk
+75595 0ba9b217181ed8c560583c98f90e9c6ae2ed2d43 legacy-trunk
+75596 3c26c6b4db500b7ccaf40f11be50f8fb4d83b378 legacy-trunk
+75600 07ef59766b026e0321498e6324a018154f2bafe1 legacy-trunk
+75601 27eaac07c5d6a89a1a61a07676543ee80dda6edd py3k
+75602 f55568b399256c27318378a1decd7294f72358b0 legacy-trunk
+75603 0653486935b64168de344d0a520686a01bd809cb legacy-trunk
+75604 bacd4d42256b6678f858109d4fb711bc43300e7f legacy-trunk
+75605 72a5fc790d01fc232286bec7786c7fda876ddd74 legacy-trunk
+75606 8a58a7ec92dc56d69fd89b5a5a4a278db535213f legacy-trunk
+75607 4cfaf6aec5ebc559905f29c64e8f7b53fb3d3a15 legacy-trunk
+75609 c4388e7e77e9f66f64120601cf60e77841cb2a42 py3k
+75610 569a0d170fac72034522db68e4954ae9d5c84d73 legacy-trunk
+75611 1b888343013911fdfb6e35579f0a12c49e7c7ad1 legacy-trunk
+75612 a17b58a486f40b5851c6496e30252cf93c5315cd legacy-trunk
+75613 9ffa1513098465315e7c9755f661fc5d7ffe95fe legacy-trunk
+75615 68279c133fd9922d461760661ff029d292797068 py3k
+75616 321e635c9ab826a8afa5f3f468d056456539225c legacy-trunk
+75617 f3b7bd6e7add9fa717f111c8e3692491f2ada4e4 legacy-trunk
+75620 db21c3c009db393ce27d9737a1181a26089b6d29 legacy-trunk
+75621 3c0664480f7a160be3a403d7ca1744f4419ae527 release26-maint
+75622 881958da219a7a34d8017df1131c42d2c165dd17 py3k
+75623 6d272fd1cdd1e7b45cdbd28478d19f9de5e070e2 legacy-trunk
+75624 92dde282153def54b4649d0d478239bc74f89123 legacy-trunk
+75625 9eb79e94204d265c89f47938f91fe5837404afb8 py3k
+75626 620085ab495b4164841a31e3791beff1205d837b release31-maint
+75627 b11f02cb11244f7d2f55eea15cda5a6f63e699bc legacy-trunk
+75633 9df33937171f6516cb50711c3453bb947fe3cbef legacy-trunk
+75634 f091444deea01040ff2f83b8e0bf016ebd956b2e py3k
+75635 96d6c146cfa91761a85bf3642356cd31b1a865b1 release31-maint
+75640 f38dabf240cbaec4153f4c47da5e89bfe2297c6e legacy-trunk
+75641 35bb433867344fe327be713fad80fa704d0be39a py3k
+75642 161d332afc884d7a74724bcb4d90440b13673189 release31-maint
+75647 80f2293fd66ac851b6a485e7801487a6ddbc667d legacy-trunk
+75648 10e72939d2cf9166db5d8a307af98f1d2c3dd5b9 legacy-trunk
+75649 9a91d452a0f88f7e865fa62a27abed2ea64745ef py3k
+75650 2f307c7adb8fc5b107752721ffec42214158f003 legacy-trunk
+75651 2146bbdf4ed7da38b9d2d0e02b615d06ac133aa4 legacy-trunk
+75652 0c9cfc7f1e95b77f5c8c875cbbf36aceb844895d py3k
+75653 eb925adba8f9014c4c21e3b4f4c592c90d5f8d4b legacy-trunk
+75654 264609fbda4815637b58ac45b9b44ed401c14e74 legacy-trunk
+75655 ae02b168162ce8f4ddea2140a162498c23b10d44 legacy-trunk
+75656 c704750e6f3e5b0506e174cd2fa4a6c9fb497a24 py3k
+75657 6d29ce9dca902da3f21ecb0751f214616d5fbb1c legacy-trunk
+75658 2ab08c91964824cf05ac95c85badd39cae7fcc72 legacy-trunk
+75659 24d43a9142d25af0eb2023d40029f91b93f57de4 legacy-trunk
+75660 dabe1f92ca27437779a1837837cf3eb740cde2b4 legacy-trunk
+75661 72066e5b94217e1386a985658f3784e90ac41c2e py3k
+75662 cbe393fa44f9628877b330e72e7c24938c124ea9 py3k
+75663 567b0f34b1eb13e3232f713eaa2e96e8ffbf7cb2 release31-maint
+75664 06e6636618d721b83d441dcfa69cfd7c2951527e legacy-trunk
+75665 cc88a703428d011f2ba84fe3e39c56fa5cfc0957 py3k
+75666 aacee9749d15435a971c7946bfd0c07e83be502b legacy-trunk
+75667 92f0a1ca4e986843d3cb1672f6b5512213689917 py3k
+75668 0c38408ad819e0e4b2471b33dac6e6266ec044f3 py3k
+75669 b2c8b984250aaf9179c31119622fdbc7bd397dde legacy-trunk
+75670 4d65f122b2b3b7f4fadae4e0e51833b01181933a legacy-trunk
+75671 dad22a1ed28b2f6f5b571c87d6d79fcc7aebb4a4 legacy-trunk
+75672 5cf3243315b5bb8a8b7e03a74e3985bdc20816a5 legacy-trunk
+75673 f021991ecf8d6b31e0ffd9f06529e173a32226bd py3k
+75675 edf35c3a48ab8b24a2b5760a16c77ea04ed72b98 legacy-trunk
+75676 43d47cb6688cfde0995096c96d433e4c832f5c93 py3k
+75677 cb721c3195fc74df732d292c4957bbdc7dacb29c release26-maint
+75678 14b55a4e8725ac8c33443e66620bd3da824a6964 py3k
+75680 b54da5caab3650501166a1396d7701bf2f8b6675 py3k
+75682 0c1238cabe9215ebcdda5e1e97e25aa00686f090 py3k
+75684 f5c563a7de75d392cb24e92b151763849ee603f0 py3k
+75686 6ca642d4f42fd5f87054668e1c10c7ab0805a347 py3k
+75687 c71ba5d1f17d22f16875cfef1927b3e6fae3dd8e py3k
+75696 d3f6fbebeac903d5397e091194374eb11b112119 legacy-trunk
+75697 fbe6b265bd1a0953b687f2729e84d141351b8103 legacy-trunk
+75698 4834a4285411b9123977472fd604fb5051eefa67 py3k
+75699 a353e108c7e4239d4a39648f5d827511dc542964 release26-maint
+75700 97736c7890a6b536acba4802ed690270a58c4c9f release31-maint
+75701 dd466ac192be9defd90ebf36e8f1b1b4a869e5e4 release31-maint
+75702 8ac907015605955e3c90642188378e3931e68441 release31-maint
+75703 f8e65ca3fd39cd0b3e19d9610f495e5f5627ad28 py3k
+75704 cb9c57e2ebd347930f0209f4c29b430121128164 py3k
+75705 a3cb812d80f9076c5b3a034a288f931aa036fa0f release31-maint
+75706 8803c3d61da275c71cabe9e9d0274dac9902e2c0 release26-maint
+75707 ec4a1b4ecb31408844af84c67224fd501b53b481 release26-maint
+75708 b519608a9701f0108e7a16183cddd5ef31d35bce release31-maint
+75709 7b603680bf295a200244d0a4d63e584e72f321e0 py3k
+75710 d3cf8eb87274a6c64f162c794f4d5be1acdf15c6 py3k
+75711 76c66690d1eea5376e928891903fb5acfa268b7b legacy-trunk
+75712 8eff759d080f9db1d7bd7bf38a68a5aa883f6315 py3k
+75713 971393f60bd874dc48165bbd7ad486247005020d release31-maint
+75714 6e4d8968e24696bda928f945f304d55ce1a50eee legacy-trunk
+75715 7dc57b991d83bddd2c5f52ad6d608e75fac8f5ca py3k
+75716 f598843f3695bccc1f8c309c9ecd631efa088aa3 py3k
+75717 095af99e6b640f527784587ab6b9de2a9f981ed0 legacy-trunk
+75718 38a5754b303771d815d43f50b3e278a87520f506 legacy-trunk
+75719 f4c7fd85f23240964a41342e9c6815f90106c077 py3k
+75720 38fda3a42c0b3f58f6a76cc1214b7ef90e509ec9 legacy-trunk
+75721 da96b3feaf525b761fca64f29f1da49d4abc3efb py3k
+75722 74472da09f6cddeb8519f76e67cd8a5b4115737e legacy-trunk
+75723 b55c2eee348b563661d610c9cbdb764f2d6474fe py3k
+75725 f3bf92cd119174c39c0a687e7fcf5421fac28ad0 legacy-trunk
+75726 450105dd9ca7453dc3c0a7d220692b878c27ac36 py3k
+75727 6da0ae680fb602dcfa69c4b603679ae692ff6ba8 release31-maint
+75728 03e1dbe2f4d59c8389ea452485dcf80a6aebe543 legacy-trunk
+75729 b5041756fd9143c805bd5bb5e95d1aaa32454558 py3k
+75730 41be2c69619b2c6c67102ec7ba8affe583b18f1d legacy-trunk
+75731 c56419cbdd48643719cd339910b7e08c8d24eab1 legacy-trunk
+75732 6d2396ea7b03b44b747fb1c425fd9031989ca2e3 py3k
+75733 e55ffb87cb702cc5f3569b088756c6060a0650a8 py3k
+75737 4cbea9e78356818131afa874bc2acf96000c1d08 py3k
+75738 5a8e81594f0f161e383b8372029a18b953b13643 py3k
+75739 0b1a088012c74a217c6d9726edc35e0b296978c3 legacy-trunk
+75740 8755006edf973dcab56a24e8a8e3b20bf22f1260 py3k
+75741 896f94541f72ef35bae151d301f175ff7c33ffd8 py3k
+75742 42252d6d1030a2c2f24b7e87545d67cb43a08081 legacy-trunk
+75743 a778171c93de5ec69b1c38f580d87208f834f50f legacy-trunk
+75744 be54b404879e65ae9516f9bc8068077e3330764a py3k
+75745 91a0c3c602094e51aafb939201423779caebcb5e legacy-trunk
+75746 55d8a9117de780ff9b9aec2b9f8ebbe773a1cff0 py3k
+75747 19a832b8464a2ef9013f8907cc3416bdbba0c403 release26-maint
+75748 4169d3cecb9dcd272969c475025292ba46091008 release26-maint
+75749 2abc3b4bce7cf56a5ea4eb9ff8d42327ca693183 release26-maint
+75750 17acdd659ee9e50f0dc9a28ff94a19a0d780ce29 release26-maint
+75751 a0ef4ef5fc8875abf75344267c26367c3825cb39 release26-maint
+75752 f9cfea2015b20a61497fef0f50cb94b921e2c768 release31-maint
+75753 81781d1e2fb9cd2814e9f881e1aed6b0845a05a2 release26-maint
+75754 c1c0a0c7f7bc3024f5895fc8636d8386d3237d65 release26-maint
+75755 524526745f2e9947e50c5e432d2d4ecccd64bd8b release26-maint
+75756 fac4e3fd747acf2c91708bac9a2d0b47af7301ba release26-maint
+75757 250bc8242e7eabfe45fdd80b632767d82391d730 release26-maint
+75758 3d540469585be83b8c01b046a478e1a3750b8996 release26-maint
+75759 8309ad6ae4c0e788a243cc4429144be6953fea75 release26-maint
+75760 c7dcc223f925d39461b1e879cd7647386a49c097 release26-maint
+75761 3553954387fa5b2665dc1f87ad46b932c80ca950 release26-maint
+75762 26ec8dbd6f697eef3dd87f1873854386a922dc38 release26-maint
+75763 b718f3188c76fdc39b239f224c4daa59a4045839 release26-maint
+75764 47e2c14b15033503d137898208dd825a3b6dcaea release26-maint
+75765 ccbf7ebef4751272fc1bdcf540b7f3756337c44f release26-maint
+75766 c7637b66b34bbe37a2fde76e46c7954d92732b96 release26-maint
+75767 0dd5d3672134d8e5a2b11617e5efbb4a57b62128 release26-maint
+75768 f00ccf8e135e10a3a25cbd8b7665751fd7c76faf release26-maint
+75769 e3e53b89c17842953311e9f27a64bf4a2436a51c release26-maint
+75770 6d42f1eef45d9dbe765156310b792641f8d1a802 release26-maint
+75771 bb8188736a29b4a64140f115743fa7275cd3f5b1 release26-maint
+75772 786ababa462d1e74d683b5f36f8126db63f4b60b release26-maint
+75773 c8630f73090718eb26d1e67a8a207a1374daa246 release26-maint
+75774 1314727c09ae7a69354c975a94e9670f308c7f7c release26-maint
+75775 096b42ccb258f5c63d0dfff096559c5d92aee007 release26-maint
+75776 8adf8ef7a4dbaac8a0c80be3c05b4e1c534b692d release26-maint
+75777 07e3c0b41d5003cc5a856a792743b09fc0668bdd release26-maint
+75778 68f7288d155ce3c17fe23ff7fa01bcf80965adfa release26-maint
+75779 0d51a5d56b5a22159dc6d0bfb5f9d8329ff7f934 release26-maint
+75780 a1b0936b027cf3f06a9e4e590689c4da6cc692ca release26-maint
+75781 5d93c754057cf26675c0f4c64312243f800816b8 release26-maint
+75782 127d623396ab93ac97a05b1de41090c93cc60d2c release26-maint
+75783 fab660c2ef8887bcc8b39fb080def48afc5d2212 release26-maint
+75784 66de7111230ab45d4936fb32854b99d54cf93681 release26-maint
+75785 6b05d48cca287206320336912bf6446855106796 release26-maint
+75786 3e15a07a32faf9d404cf22e6c4680e163588dab0 release26-maint
+75787 9b24d010133f0a612f29c3c36214dffda52f16ba release26-maint
+75788 85aa706f7126d21140699910f877f09391712511 release26-maint
+75789 48521233bd6e8d4d9e247066e1ffb4d28c5f984d release26-maint
+75790 c4c429b08a5759922b12c587984eee4cbc30dd0f release26-maint
+75791 ef319474937700038f4a14f868114640de170b8d release26-maint
+75792 b7b8970cd5a576404d4e8203040605578a398f50 release26-maint
+75793 2885250ba5f49f55dfae7c9098974a980f1acbba release26-maint
+75794 402dadc7b4a862423eee11b459b261e7393514b7 release26-maint
+75795 1d68b1dc410936fb8721e88e8467136d72533200 legacy-trunk
+75796 8d9ef5a79bc7a59318d52afa44b57a9e538d6d95 release26-maint
+75797 30359c33b6f677f0c4c548657327398774343c5e py3k
+75798 97d7cd365dd5344f51a590d9f25229fb1d692a5d release26-maint
+75799 598b9bee74ec882c2fb21025deb723ce018eb701 release26-maint
+75800 7284507badb2a0975f18d78a1f84f8d82cedc539 release26-maint
+75801 81b63ab6d45fb4b3f07d63058d66b06d3c07fbc8 release26-maint
+75802 5b295330830a096864f97dacf1d53db48484523d release26-maint
+75803 e9408cb3e274e1502530ec35b770456c1af5faad release26-maint
+75804 bd776e01993acb91a0089dfa84dd0701aa6cd944 release26-maint
+75805 9ed8991a9141c64090dc25c9619b78050339b762 release26-maint
+75806 670caa9775f60ab3de56622fffce909f5d2299d2 release26-maint
+75807 764ae2ec4a70631b234060aeb543c0cc1e5b86e9 release31-maint
+75808 a05e1a57363d75a117e2e0658c50b7ba5a07166f release31-maint
+75809 be5348b054b4f5c0a1d826c07eec597e7586d3a8 release26-maint
+75810 00e45d21f25bf85a47bbc4b2210fcd7db61cc679 release26-maint
+75811 1c32b95fe578e70bf5452b071dcb9baa6a24e27c release26-maint
+75812 b97e8cebe8eda5d1bc24c28edac1ec4b2401e415 release31-maint
+75813 e50ba2a819736729127ff97c63836e6a450d10f8 release26-maint
+75814 e4bcfe2e6d576c0e7b210ef6d3e93e932b22cf36 release31-maint
+75815 097c360b4ba59a1c9c14087a1b68ebc8ea8e6196 release26-maint
+75816 604db9a83d1877e3c6aaa01964fa5ba992c75338 release31-maint
+75817 ef08253f290babf11b14c80a8183eb1a98d337b5 release31-maint
+75818 3a992292ccd85f16f4c679067978a6fdc6e47309 legacy-trunk
+75819 25bc3d69e8afe30156dc5dda34693bbe3cbf7af1 release26-maint
+75820 19f76faba9654ddfdd3c56285a9b7e7ac20ce35c py3k
+75821 86531de75894f1fa224e734ba0e954de6e29c741 release31-maint
+75822 59505e7e70732a1eb29cd179bbb72b3520255b84 release26-maint
+75823 e4731fd27d916805148232ce5689cd91d4b962e9 release26-maint
+75824 e99adfc92dc2ef57311523e44c87b6b12519bcd9 legacy-trunk
+75825 35962b5415957edd306f86fc909fc8d75c642a35 release31-maint
+75826 42fd7855347e8591a41da3f491e0b00a034de386 legacy-trunk
+75827 632ddb275321de25af7bfac0b738a9de099d9cb2 release31-maint
+75828 f8fa3680c5d35582252dec1926968c88bf0f6b0b release26-maint
+75829 629d45ba46d79cf30f40561b48fca4a47bc55301 release26-maint
+75830 e1bbc6232f29d0a389123951553161d3fe785fed release31-maint
+75831 f8ed8440cdb45fa1b3f4d3fbe6b5069703ab6a32 release31-maint
+75832 1075179451b563b759111fd8d24336cb5c37ae5e release26-maint
+75833 ae94f68553100c086c772b44b032a4af0847779d release31-maint
+75834 b40fa826e1cf0d8c3a7e7e7bbc5f3470bd1de858 py3k
+75835 580ac15116523c1ddab125d92e9b7ff40d703413 release31-maint
+75836 8a774afe990090b99a915145bb3f479cf8640644 py3k
+75837 c7ff2fcd2b6bf0e7e96f65b7746120510efce893 release26-maint
+75838 269f1d9c86cd226a288fd2791a4be651a0e8beb6 legacy-trunk
+75839 8fb8fd3b67cf64388716d76d3f2b8a70e361bd43 py3k
+75840 936aaa12492c706b31f0ca114703d5c6dcb95fc9 release26-maint
+75842 b31fcbab0520c483c50a56d15e55eb639f5cb72b legacy-trunk
+75843 955d8fa12ad54b5acb8600af302238a489e78a9e py3k
+75844 5c5414a8c7c247169bbe5674c025b6768b6d9e22 legacy-trunk
+75845 e1d412489107b530a6757a64b572b558b03916c9 py3k
+75846 140d88d1b1798fb2f7c85c24fa380868ca31661b legacy-trunk
+75847 e259b34a0b88144279377740601e6aec987c4413 py3k
+75848 11fc160d53c4dca51f5b7a552cc91edf1e925865 release26-maint
+75849 43bff6903aa5a354bc0785b82c752e651275cc6a legacy-trunk
+75850 d7cc0eb3f234f840c6f09f904ca809dde48264f6 py3k
+75851 5f61bd3aa427b22dc890736e537029226009ae4f legacy-trunk
+75852 e4bfbe9b74c89292e489ed342ee0521ee2c51257 py3k
+75853 d9d69060f5e4bdc3c11defc0a66dde6ca0dd83ed release31-maint
+75854 1bda4602f939a2f3d1217c967c79d6b10446e2e7 release26-maint
+75855 5c88779473b9296384d49d1ec3209cafd0ea3518 legacy-trunk
+75856 af78fda57af864f9e8e5d16d02598930379f372e py3k
+75857 021d3a38bd36a4a07842a7aa804bd07c28772b16 release31-maint
+75858 029d69659b5f99548ff4e8c72e09ba258bc9b77a release31-maint
+75859 cef5cb270fdf7c966c62a512852f734f07976a4d release31-maint
+75860 0df47b1b30b8a07981995cbb3d6cb4d7c7ecb6fc legacy-trunk
+75861 8141ec81ad2d3888f2399bbc6e8c07bccc8b5a70 py3k
+75862 70eb6a13abcd6856605cfbcb264a6facb3405e6c release31-maint
+75863 b085fd0611de0e81f1e7de11cc744f534b4deaba release31-maint
+75864 2f1c52d9feecada24b725f32ab43f184b5836b37 release31-maint
+75866 9899eca9c857d91d52eb703d47d2b5c4886e5b2d legacy-trunk
+75867 185204d541fe56e3168e51c12aac086aa0695983 legacy-trunk
+75868 411b6acbcf12e762728953a04d5aa3517901cac6 legacy-trunk
+75869 b4baec1e6a0c338afe1da4c90334fc238746670e py3k
+75870 f5c72aca6b60a3b056d211a20ce1869f29b8c59f py3k
+75871 3ae4d3667920fc34aaf3956a112ede3969e6794e legacy-trunk
+75872 fb1bfa9cabf33bc6e484cd653c1a07edf4391a80 release26-maint
+75873 45a27f961aa1df4e97e76c3bc60041f40d247895 py3k
+75874 204f33d42762b241358b216e69f3da54dfdba833 legacy-trunk
+75875 3959fa109718ec37f0f10343e3a81f73fd8f31e4 release31-maint
+75876 c9268fea81049127ec536143d9f16760af6b3b38 py3k
+75877 bec266f6d5081e2595ccaef9a0a5ceab9b636bb5 py3k
+75878 b6cc0134af3140e116db150436c3b3c2303f5357 release31-maint
+75879 21a3f83d99abf7d7a9ea61e127e0bddcedd02a5a legacy-trunk
+75880 128daf6699cca28d3337efb4d85c56e36496485e release26-maint
+75881 3927e0e13824126e731243edf77dcc3ec3aff7ba py3k
+75882 158b211e6fa8c1c88b6f126426481c82f1fe9407 release31-maint
+75883 f10104051339b8ab67715c4f51bff864103fa9a8 legacy-trunk
+75884 44f64472e9221b7ec396a399be6f5158ce0a1204 release26-maint
+75885 124389f4ebadc39c58c401e28e5618c4c0e2684d py3k
+75886 690c565c15a9e1ff22cf1f872a279ed9a2e67e40 release31-maint
+75887 6949ce78c065581e83cc0a72569a9d62ea7e5d4b legacy-trunk
+75888 7e66ffdbcbeffbf6a42fe899a5ddfbf69589a6b0 release26-maint
+75889 d0d7e15b49535a0090cdfde666a3060aeefd2c6d py3k
+75890 5e4d1b4f62fa1d08785fbb8d1b58084de79ff979 py3k
+75891 ad61129c442225692dc250b4dba66d9df6303ad1 release31-maint
+75892 e1dca972fa35d31a546cb708f667a8daf7a6c23c release31-maint
+75893 fc5a7718433a8544f1ee533069350845ad79c52d legacy-trunk
+75894 64ad3650794466e84ccc522b3dc901682bde3eec release26-maint
+75895 17779a94e825086b6631cfeb7f303dfa97cff6a3 py3k
+75896 0f29aa2d4844f717479fb982b041e9b5b52c2346 release31-maint
+75897 71574fe495767b1187417f706c66c7f271149d22 release26-maint
+75898 03d76bdf9362aa542f39d00586bda13d70778163 release26-maint
+75899 9e24fd6a55f08ea57271b3a05b646eb5b83444ce release26-maint
+75900 044a68bc0d2efb9623e26b360b7cfedc12e9e18c release26-maint
+75901 c18224988bb1c86f8445f7c07b286c2fddf156f5 legacy-trunk
+75902 cd9f72fba53b0315035742790681fabfa632fe8d release26-maint
+75903 ef6ab5d0a006a9bc1dcd0324fa799e738c8a0dfb py3k
+75904 52b27c0816868a8055f6252df35d163565d759d3 release31-maint
+75905 aafa66c57444e3b25cafed01bb0f7aa9c9b83b7e legacy-trunk
+75906 1e9eec73447f28a0d0eb6e1a3140643fe4b12a8a release26-maint
+75907 90c7146ddf4219f943343d1120120c81f1ae20e7 py3k
+75908 76d0421438ac36f4a5c39afd2e68d3ca9215af7d release31-maint
+75909 e7ce251b3bfb6d4d165b260ea16dc0fe3201a4d5 legacy-trunk
+75910 e750b90bd982b3352ac887c748720d96ac731abd release26-maint
+75911 44de3a4024014598e4f4a0bd5bb9264a172da423 py3k
+75912 a1dec57bea5dc260517f63b7e9b5d77f2c60a7b9 release31-maint
+75913 2a961d7f2028bb35183fd66b4524a2d445b5b7d1 legacy-trunk
+75914 84b8a2b8e9ae51e00962ecfcd3295c35a00505ab py3k
+75915 b6be3002d3ca2ec7d4f216476fb7f752df5a12ac release26-maint
+75920 2147c2ebced8593d66be8ddcd57cbcdc9da996be legacy-trunk
+75921 20e21c155c0562f64fa73ad3237370b97f0c0d21 release26-maint
+75922 066685f6983ad40edb2aaa51e336d34164dbb970 py3k
+75923 a795529b09c966a27efa41f276182a49d341e33f release31-maint
+75927 9e82f17b2c8da2303f9dcc14d35df3b6c5e7adbe release31-maint
+75928 db4dfdc74029ad984652c1352061f1d020e7ded6 py3k
+75929 8402e477eb487dd4d029139c9922c6f1e0e21b40 legacy-trunk
+75929 e358af2569b98c13a4788660dcbe7af57b2a5186 release26-maint
+75929 448909a940c04da03b39f58d3eaf7492336fcb83 py3k
+75930 f32dc84a876cc5991b67f9b8e78df6ca9401911f release31-maint
+75931 844180b7e6ff0e0fa87252b43f24337f8940fdc2 legacy-trunk
+75932 c715f82555a4c93496ea82b94c1b7fc81db17e88 py3k
+75933 e809982629c4d83df7207b66ca66990c78c275c5 release26-maint
+75934 032d9749047d7e13de6352ac60944e6cb5deec89 release26-maint
+75935 b571c6685229f3c0818349aefb648ca080642ded legacy-trunk
+75936 3cfecbc7ae95a7f6298092cd2870d27ff24991cc release26-maint
+75937 8cff949323c9e66bc18dce924e49c4bda771f993 py3k
+75938 b009a387699b32d1c44aca2cb92defaa1de4c84d release31-maint
+75939 55e508e2535c9a334828f204546afe93f17530b2 legacy-trunk
+75940 ffc7d9ea24d9022ff6e76dbacc70c22637d72ee4 release26-maint
+75941 aaa2b07c2c4258b41470d53fc8685344ecb96d1e py3k
+75942 05fd48dc2ada9bf0bf19516393e1241f960ab002 release31-maint
+75943 15f1872407be2646a101fdb4d4c14b9746f62c42 legacy-trunk
+75944 63eb2883926b2d5b8024b5204612da3f0dfc56ea legacy-trunk
+75945 d5a34ef2fca7c321174cc0a34b94d6928c601b2f legacy-trunk
+75946 53e38005d507c4ba7eb6ccff39fbdfd1148ba2e3 release26-maint
+75947 ebddced2c9c4d4845d09006165ebdeb8596d6693 py3k
+75948 0ed4bf430d4e5ee0a7b8abb1bc518eff81b0b9d7 release31-maint
+75952 c6d62340aebf0c3190f596323d4d0233e2defbb5 legacy-trunk
+75953 e665d2170e852b19d609b22fea94302e63fda62a legacy-trunk
+75954 5f5e3c7da8cb45fe74a1cc137d4d179f476b437f legacy-trunk
+75955 7e02371aa50602f098154ca59835c0679b986595 legacy-trunk
+75956 411f252a294a4fe2186616c7b247f7c33c8003b4 legacy-trunk
+75957 9ddbd69815ca7a096c741f865dc74449fd71c281 legacy-trunk
+75958 29fe5e7bd6ee1900a853101bfc2a2e10e51f233d legacy-trunk
+75959 6cf84e5a6dd7e55588f53d7c6728a4c516e3243d py3k
+75960 e11d2467d126797b9f3dea78e24180fb92010a54 legacy-trunk
+75961 713e21a5471ed763642c8560fbda398d50cc40d6 py3k
+75962 acafa5142bf918f460f71a77b869ad02dea1bec0 legacy-trunk
+75963 c146925234f03ac09c4f0eb51335bf6a07b40148 legacy-trunk
+75964 a183c82b628947cfe3987fdc59459e6c0300468e py3k
+75965 e87a6698a305a64501276709a6cf9e424d2a8a06 py3k
+75966 fd218ab0e22efe53b8314dcba9a8c3a2bf9dd7c7 py3k
+75967 33861ca1fb2b11816023cd3d73a99a3e537f5a43 legacy-trunk
+75968 056470468fe29e18ef1e2a473f4a2249e0be95f3 py3k
+75969 d56b103490a55b003bcad662f487d7940178bd99 legacy-trunk
+75970 bf93e4df7bfb1e63249258364fa280ae71abeede py3k
+75971 8d36deb356f19f4b8c803ef903a9e971e9e42d1d legacy-trunk
+75974 7c86993b13c9fd74d421a74cb833483ff256188d legacy-trunk
+75975 b4e9339b499d5525ac5ed54099fff9e2407add87 release26-maint
+75976 fcf8a486792063de65b02a147c39c5065ddeb3f3 py3k
+75977 6cb53248e5be4b06b35bfd1d33dea9f542924dab py3k
+75978 6a6f32b0fabd0d8ed33fcc1537f65f4a0c46c25c release31-maint
+75979 bab3e3cd76f1d5245116e27cc0791e75f2dc921d legacy-trunk
+75980 17dc0b53b48edb1ae1c0898e51ddb41baa1aaa6d release26-maint
+75981 182fe0af604e35af6b1b6233d7763bfad60af13f py3k
+75982 f594313b93645ab24f812f07797e94da3b9ea933 legacy-trunk
+75983 fb498a0de0b95ab61af3dc12190c14f7f9c60a34 release26-maint
+75984 5a99003c9b83d842f1b9959f33268bfc6ea80a68 py3k
+75985 264a735a8af776797dcbd1b07fa724cfd559c98a release31-maint
+75986 e9b87756ad3b3c29e89b2c9293d296b4c06d4f30 legacy-trunk
+75987 7ecd3e3c95642710d901f2586e708d311ea591af release26-maint
+75988 8d67725cbb4e35d8d850a34a4558b95c859645c1 py3k
+75989 7049b2c86f0610d1149ae339b2165c9b7d65ef96 release31-maint
+75991 4cbc3fe93671d915b0699c5de731b74f72109179 legacy-trunk
+75992 89e9d05848903e56b3c15391960c58900ec2ef25 py3k
+75993 ab38690fe01cf935bafbd21318d4b4f4af22bf8e release26-maint
+75995 71b3aa8a7320fe40cc20d8b74070a3eaced2bb84 legacy-trunk
+75996 37246b4c3cce39ee5821daf701ae4ff2b65dc090 release26-maint
+75997 182cd04e29db1187d9667992a58d778106c53edb py3k
+75998 4717804bb57dc750bd570ce361c55f29dd097d8e release31-maint
+75999 9f3f83df6975be6f0ccb09a754cb90802dca9ac8 legacy-trunk
+76000 846f26ad5800023b6dea766bc7bcaefc8b6be34f legacy-trunk
+76001 2913864ddbe9589ea296cd3a0d9a243e3187e17a legacy-trunk
+76002 42bb3e3613f6c90a1b5765caeeb0c1d9f62becbb py3k
+76003 f83b4896273993ab7f114af08fce7eed509ce1da legacy-trunk
+76004 02f5c6008327afe5556568301a9b58e7f9d858bd release26-maint
+76007 211e7b5b999c1a3d91d639a057b5bc398767eb6e legacy-trunk
+76008 70002f27d281ef6bede81d6b045f67de8f8ce462 py3k
+76010 402696ac4f982cfb27ebb8ffd45f50293aa67e60 py3k
+76011 b0e4efb83d60c77f29984018b863a7fae22c789e release31-maint
+76012 ff8e359e280843258d3b2eacaad2946bed4c7783 legacy-trunk
+76013 6b4c7320ba3a17f2422bddc43662409ee390f650 py3k
+76014 b69017762208aaa6f2e893ccd895018165e95109 release26-maint
+76015 5925900edf16f0c94b5bc189ad1aac8c3e708c81 release26-maint
+76016 757b97c61691e29230965f57b9ca2c38a9ff4999 legacy-trunk
+76017 5b95e4eac7a8b98a9a68b13afe96ecce69d98c50 py3k
+76018 ed166ff7d952381c45df21d0c35191c330b385eb release26-maint
+76019 10fe20fd6fb3d8c8ada7fff62f20669b80df23c2 release31-maint
+76020 4db84045a7f0071a0a82a0f1f4808394734b5cdf py3k
+76021 da6ad98d5daef308a3e40aecb5d954ae19e18725 release26-maint
+76022 c78a00a1d6db1830a18574cf187b1f8b828b515c release26-maint
+76023 93c7f650937f7e9578a614c7aacf7ca54b58a5ff release26-maint
+76024 901259bc0b62ea019ffa6a5090b646d07bcdb33e release31-maint
+76025 b7e76277f545267af80db0d9f57d9ab3ae3ba217 legacy-trunk
+76026 1aa6b68e85230417c3a79c2f03a44cdf1539049d py3k
+76027 658eb58d2e68b7540835432f66346689d91e50ad release31-maint
+76028 c785afa6f95c5649d0f653a5d8e478bcd582d9f9 legacy-trunk
+76029 3039a4ad7e39a11acb76df8ca15ffa083489fd6d legacy-trunk
+76030 ddc141d9ef1b1bf31b8521ebcc2fe43d90f07b73 py3k
+76031 38719b8e0c9f70e2f2912efe4cf7422a87ef20d6 py3k
+76032 38eb6a8adc242b0244b0a21ffba94a4ff2877344 py3k
+76033 8ca4d77680c6d2421469957ffc219d4c01b1564c legacy-trunk
+76034 51b9973f761ec400c746dea33f6f5b92e5378d37 legacy-trunk
+76035 57542b502d3223a6b51e283931a389cbf731a69e release26-maint
+76036 3bf761df802aaddab90b2eb0170cd308ee22b1bf py3k
+76037 a01e6cef1256c9139c963176f012a08e23873e83 legacy-trunk
+76038 344c47df363f8b9c28a0602925596332a36bd64d release26-maint
+76039 4580fe0719e702d21613e416f4d6a5b50517b4f1 release31-maint
+76040 fd0542716a80551fa2d8905f34239b29bfcf0e98 py3k
+76041 b591fc8721f2fdc5058661c99f366e5394532593 release31-maint
+76042 6dc4faa45cbd089010df5a9cc30c916b07f83d65 legacy-trunk
+76043 28fef72644b7c6444ce5b29db8a0b35c0efcdb66 py3k
+76044 4a8459e32919232beecf5303bf2c3625ac7d7240 release26-maint
+76045 6e489d3d73b880491537aeaf4aefaefa62e81603 release31-maint
+76046 1e1be1a39a792ef760d6924bc01e63c7ccb09cf1 release26-maint
+76047 f01302e6acd5446135569b7534295cd348417d98 legacy-trunk
+76048 5d6ed0883bf579c3f853f124a64148bf33e63873 py3k
+76049 a5e473e95bcead5c5db3d76ffde1c52a24544bba release26-maint
+76050 453f5478a691dd1df9d5b4f0f0eae189de6e3113 legacy-trunk
+76051 b919370f1820fdba1558b9a739ecccb76c2eb6ea legacy-trunk
+76052 698de501799d9935ac2d686b63080977c86d0c0b legacy-trunk
+76053 d2d8cabb9e3a923ab1037b0de8ccf6b9ed47c630 legacy-trunk
+76054 96a853fae83b2374c80b9e0442ae315923f709de legacy-trunk
+76055 1402c75275655fda3a18f9626634e642edc5eb0c py3k
+76056 8a0d3c69ae21adbda4c086bc8545662b954c5589 release31-maint
+76057 88a3646ef32c2a782bb419bc1fc46a8f8684785c legacy-trunk
+76058 e608f58d5d18b61d42d4055426b6e3163b27b695 legacy-trunk
+76062 94e1b14ec804b8ac9290b20528658374dffcc530 legacy-trunk
+76063 959c68d1d28a0a0c72efa0edbd775bbea02f76e2 py3k
+76064 3cfd69564e8f076fd6bd8594a7b1ed0802b2b945 legacy-trunk
+76066 f2960f116e77a2ebad51037e22a09b7a7a30c2a0 legacy-trunk
+76067 bee8994b13dedb8170399bcb24a068600549b868 legacy-trunk
+76068 a3f21cee64d1f128a635bd1c2c4d627b30e501e8 py3k
+76069 a8086b314cd07e6c3eb9209b2d35f1f3c4e4783f release31-maint
+76071 201a419e9e0660be448bf1267c9bc8d1e17a7510 legacy-trunk
+76072 65b1121a2473fd21e62e9b4bc9b13c16264cca0a py3k
+76073 6c13bf35d1661174abeee8ef0cab015b186920c9 release26-maint
+76074 3201fab35220f785299dd828e561488b46729cc7 release26-maint
+76075 c9008a3e7f7fd2348b95a48a42a65c95b0bf7531 legacy-trunk
+76076 685a24a6f986847f2420ca15662240f272334b31 py3k
+76077 32c7d98103baec1a371cfce21986f747b403abd8 release26-maint
+76078 b411ce584b7ff041a9a3dfa6e359181530e16fc1 release31-maint
+76080 62dcd9fdd7b34ee672a721864bc606e24693903c release26-maint
+76081 bb37c7c26fa486515270fc04ad5dc05cf3303e6a release26-maint
+76082 19a573c44ae11c2bc2da513b304c27b81d9c3cb7 legacy-trunk
+76083 92cc7ed83e9c01a183e84bf353aa65b2760b9c72 release26-maint
+76084 7fd90e5a0ad5f9b332045d30db51bfeca6eb41f9 py3k
+76085 fe808d66483d7b5e9ddcb066e8c1ead83f49085e release31-maint
+76086 8c807b3a905232270572c5b1f9be339edfa9d12d legacy-trunk
+76087 59e9adca771b34aaf44793a407b9ebccbcea211c release26-maint
+76088 1df90e22bb7061e4e7726adef9ae8c13c68e55f0 py3k
+76089 9af2e94439d1b446f106578c7a5ff3221271f7d8 release31-maint
+76090 1e8a33f618fb063f74ca6b6c7a94cca764b1172b py3k
+76091 ffaf665d2d3e5d56aede0bc99307e0dfc1790625 release31-maint
+76093 42fa3e09b6e79d31f8fe1f3947e92b7d133b6df1 release26-maint
+76094 3364acbaa153cecfe3cbb31f61cfe4d7149ae706 py3k
+76095 eda979c98a7fbe03d67d0c6ddb72e3024342fec4 legacy-trunk
+76096 c94e3bf8392ba0353ba51e99befaf61962604448 release26-maint
+76097 1f1758848c6cb380dc41c420a37df326088fea4f py3k
+76100 f95b5faa13cf5f4f6f994f7a7d4b559958e8d8c7 release26-maint
+76101 51869814ba9a8f9ddb743d70e69142eb2fb270e6 legacy-trunk
+76102 ea738ff1801663ba32e33450b9241022aab41b7d release26-maint
+76103 605d2f4c753949d2b9a38fd5740e69d33f9a0882 py3k
+76104 c8bfc4daff3d8f48f34c6148cae69ac0593ca921 release31-maint
+76105 f5d68604c6b952a8e16c0b9aa229dc90bd792527 legacy-trunk
+76106 d16144269d558d671f25ace714b9048fe944a22c tarek_sysconfig
+76107 298f6b34125d358e3d856e2a157fbccdcb096561 tarek_sysconfig
+76108 068f9430cc240b095e25293e22e219ca70779a2c legacy-trunk
+76111 f89a93a778a81d068dc89261d4e7fa22c9bd5811 py3k
+76113 d3a81051663b6b56b8cdc74ec422020b02d9b4dd py3k
+76114 444989ce5f77148cbea428b3498ef1da6c608fcb py3k
+76115 93c752875033cc5ddeb31fa52169a804f5edf4d0 release31-maint
+76116 63c9e63e0de3f02ab6f1d0326b4d89d0626cd09d legacy-trunk
+76117 fd782805186551a98e105128c515eafdf0d6f528 legacy-trunk
+76118 2ebad3dfcde37627ee129552dbcb5a43f28c0cf8 release26-maint
+76119 0cb943900e531e4fa2e224f401d54c0be4be0abb py3k
+76120 4ea0a80ed76a6392c1c55fe2f9034f62a51b29c6 release31-maint
+76121 a1c94f0761d413bad6f108e065d7bc829f229422 release26-maint
+76124 35ddfb447168d06f4462a39daa995c97dc840dad py3k
+76126 d3a7636392af554d1eef625e46bffc61e9e33791 legacy-trunk
+76129 e3ff3976bbacef7523a5833b129481b5c967bdf2 legacy-trunk
+76132 8552a26772e6fc1bd81b6606fc6286424001946d legacy-trunk
+76133 6db220af8ca3fec904679ce75e9c1f204b71b8ec py3k
+76136 d346ffb8cfd743319cda85fcce3567b077b951cb release31-maint
+76137 cd360ac58cd2ea06c6a90b233a6177c2f6e1993c legacy-trunk
+76138 e0ddeda0d9c33f84251024a05697d82b8eaf0813 py3k
+76139 9309daaf32d1807026ec366e5c0dd3277be34698 legacy-trunk
+76140 818b0b287aa4244b7ca7c7f5b683bb987326b0d8 legacy-trunk
+76141 42d4cf827b9e89c83fcae3ab4e761be2c03eda45 legacy-trunk
+76142 92bdc3c7d5a43ef3d9af8c128b2c5f696783ffe2 py3k
+76143 1a30860bca037f841094b229c325fc9e32cb8da2 legacy-trunk
+76146 27e120f9208b3aa8c0c891a5da3f1f9dfa284589 py3k
+76147 e25288bb6faf17ae8240e5b94d85ba1d6824e093 release31-maint
+76148 6f5f481d619c2cdbbebc35e9b9d8aa3a81fd3481 legacy-trunk
+76149 04cf95cf9496fff50b1f2ef3668ca7922fa8255d py3k
+76150 3a0e6900121543a4bf51648d7bd3bd15fc91d7fc release26-maint
+76151 381a62f1e635f2c02144dd91d4f93a49905d4292 release31-maint
+76154 63770a5a0c79df2b4d23f74d907bded855679286 legacy-trunk
+76155 2e4e477219c573f5cab0f349d9ae7d33aee4e6e4 py3k
+76156 dcd6887b8a27747da8b42736e3ca1ad5f4a741e4 py3k
+76157 979eb1bbf6e6e46da270956e9431e2879816de3f release31-maint
+76158 d61b24c876744756954ffd009e19b2c42c31dbde py3k
+76159 48989ecff8047bbe440e7a147311b4391719bee8 release31-maint
+76162 69d61af5a95893646ed25662f74af0a11f0b30e5 legacy-trunk
+76163 d97059e9e852eac2b8563acdd3bfa184ee8ccb97 legacy-trunk
+76164 f190315f185ea7abe4fc3c15eb24e17e0604eb76 release26-maint
+76165 ed11b315d36a3887f16400507237da3e20c163e8 py3k
+76166 1447d75def8b257810f208a608525a452ead2673 release31-maint
+76168 c76d5fbeb6919339cd2bd59a223e297dde1f0d78 legacy-trunk
+76169 267a418ebbc9b64a0b35f87baec98e715a9742d5 release26-maint
+76170 a7ac4dbde5db620ba200fdc8ccdcdb75fd924992 py3k
+76171 667d9779cad6aff660479a3f1257008d25a22f0a release31-maint
+76172 fbf41b1124d8ecaf1e7d8d7ed05cb443cefd28db legacy-trunk
+76173 ed8b2969119e26ae68269646dbb41c93fb64a9cd py3k
+76174 0eb56a8e6262f3b9d20ae395035352457d22c7a4 release26-maint
+76175 fe33562d1f95a0fdcb980102b9849858d24cb547 release31-maint
+76176 2d394d2d2d37d7daa1c6b8136339bcd04413b775 legacy-trunk
+76177 050a65a3df538b2879a3e8f8c0d1e2dda0186a58 py3k
+76178 bfcab1ba0f51cb3ce518985b3151548c0d33e97d release31-maint
+76179 bca027b6df533d6dc3ab313a6acef4f090b519bd release26-maint
+76182 fbfcce1124ae270a46c4a8b3bba53f205f891235 legacy-trunk
+76183 52140738d6c3b5eed6a42d61a03e4434577f5e1f release26-maint
+76184 8bfb32b5fe6d4d2f964dd9dffe72f5f642f7734f release26-maint
+76185 dd9f85a5f1347cfb1622684f0ea62463ec89c149 py3k
+76186 9219a962ad1c307ae1c78efe92cd37db06d26149 release31-maint
+76187 fff558286aae3fe36ad2c693747ff3c2b843d949 release31-maint
+76188 23cc759cfae3582527f3b52ed82f25cc1656afdb py3k
+76189 6d91aaadddd081de73e4f29b6e73437ac4db7bb3 py3k
+76190 867d2f2735b890557601b942578465d83663dead legacy-trunk
+76194 ca0217c52a8bf384b343dab2f3830c5dc7980a59 legacy-trunk
+76195 fdd6484f1210d60c168e23766bd342de8a66f217 py3k
+76196 cb5905806de8dc8772882f924c5ec911b63e26af legacy-trunk
+76197 97c318714070f6f17df7e685e6f7eab6cb2a43e3 py3k
+76198 fe6b9babe4be916f484905e53f1f25a05cac0fde py3k
+76199 976cc504d99f28385b5d2afd81bb3d2855c9375e legacy-trunk
+76200 10764ffe7543ce9bc12f63ac41d45e96613929ea py3k
+76201 b1a775aa0710d4961eaed138504e74b0e87c7b0d py3k
+76202 4ebdd2e0aaade753dc34e0e71276567ccaf58951 py3k
+76208 54b8d780c9b99e0bb572d49c6f7dad7f6f106500 legacy-trunk
+76209 2950d97713959e70cf5e95c89601b0b6ce8f1879 release26-maint
+76210 12e0c9ea304eeeb5681b785487929f564cee1a5e py3k
+76211 c85eb5946614565bd3f9f28ffe0e5e3fa3f949c7 release31-maint
+76212 795ef46349e501cbc934f9150469f1f61ba1c0bf legacy-trunk
+76213 2148851f082a1900a60c73fb572c2c172eed8c17 release26-maint
+76214 257cb61bf41b567bc2930010b393ca084aa51357 legacy-trunk
+76215 ce9f55ad546e14a5478d320b5678e4b72b16d8a4 release26-maint
+76216 c717fe993085cdaa1fbc94eca9a6ceb822ebed00 py3k
+76217 33be82fa277ac9a1ea500e9cc5b3a6a1469d3849 legacy-trunk
+76218 43f32db1bf46fb6e04c6dad3e5d04061c590a5b8 release26-maint
+76219 81166d7b414c8af278d79a10bf288f39c0814aea py3k
+76220 138c1f74804d68c6f561aa12b0cd9de45c693a42 release31-maint
+76221 1c27888a955fe9c6d91e111e5f48a24fc7e8fbfe py3k
+76223 d44fea23fd57fd5b72f2254a1322c4a2344dfeac legacy-trunk
+76224 94cd185f53b476136e142350d77c0cede6ec0e9b legacy-trunk
+76225 57077df02f9acbc7930f3c21d6f3d936bc263027 release26-maint
+76226 5c0d4b3ecd65d18f21a8020a90745edc53c37a70 py3k
+76227 4f1c7b7bfcbda403aadc3714cf216871f784257d release31-maint
+76228 cd0436c34ef46de0f44f0593db40b18ae15f9e39 release31-maint
+76229 f9a50cede6a922b067d6d6ce9680262f4252a1d8 py3k
+76230 89f42938d5ccb733c336a4d514163f41ffe428c2 legacy-trunk
+76231 128dd6de134ca89c2c798cfbd31cf2d4b6a69ef2 legacy-trunk
+76232 b2d90c1c637dc57f97582188d4f2d55ea72d86ce py3k
+76233 763d2ff78ae7e8c4529a61f3e4cb655c11b45145 py3k
+76234 7ceb5eb462c503f96f0fb9e11212cace236593c4 py3k
+76235 b354c1b6b4767c37b4c3836255b7afc02da7f534 py3k
+76236 a0951f11be3d76e6da9995435afce5495f101531 release31-maint
+76237 b7f73b02d6d248ced82b6e117b5a701462211b21 py3k
+76238 b218836573face87f4f7c7436c9d6e5726f4786d py3k
+76239 98579e952b54af97d0a8c6d33108008b51239541 py3k
+76240 685527ae437df92a8f4ca430e1ec3187823b6819 py3k
+76241 357e39700489783e7a0dcf4687ad15a149b869ad release31-maint
+76242 8e6b478a7053eeb3fffb343338e0828ea36bef73 py3k
+76243 65e23085e3cadddbcd05c04256e0144f2a5341c5 legacy-trunk
+76244 32335ba3aa0bb16261c0175ed6d307afaaab9ea8 py3k
+76245 196f2ab97718cbdb6b9e1eb365af1fffeba7c614 legacy-trunk
+76246 b8145d6db7d43d701d55106fcef84ce09dbb8e7f release26-maint
+76247 c613c724e3159af861193cf43cbdc172d9b9e788 py3k
+76248 90f1f57321859d0c65fad465790642a1395c84e0 release31-maint
+76249 5c9050481309d8b68134ec2ab4ab7be5af2082dc legacy-trunk
+76251 277b89d5b320974802052fa1dccdaa70c1e86aff py3k
+76253 a1df524fcbc622b079cf9a8f219b38ac2cbef0e0 py3k
+76255 f0013ade9c1ad36fc104d099c348548b3d7d535a legacy-trunk
+76256 aa64a50ad4905e793cf5b67f58bdefb61f21a175 py3k
+76257 a2cb7d2721a3e4e4e8a2dd9da5ad2a3f067e1a9d release26-maint
+76258 207a462613f3f3e275168610ae4dc697b9c7cd99 release31-maint
+76259 3f2a76fa2496b2a15c2de61134a2659d69099bfd legacy-trunk
+76260 c1c1f28acb053279199be3b59b63d030dd3e0f90 legacy-trunk
+76261 b2ab08c93a02829f64db8c4cf52d6e70e36b13c1 py3k
+76262 92f91704391999fd3072d7d7217d59a56b348ae3 release26-maint
+76263 bec589b44aae7a6c318d64f6395febd79ebb9132 release31-maint
+76264 555045541794e83fe5760c5c478bba182663927f py3k
+76265 3db1fc3cefd0f863f7be55966e9d13d1c36c3c3c legacy-trunk
+76266 94f2705def5cf656683eb386c1035eec569e58c2 py3k
+76267 7d4ab8cd002395543286284e045f56761bd5d4e7 release26-maint
+76268 56e701f8245e5636a0fff9d9df9dac8e54f7e72d py3k
+76269 fa60270ab79ae5c8dddc852a93486de9f4d188e4 release26-maint
+76270 1257a597c8fada057d6146db2691aecccbf16091 py3k
+76271 3d902d67af9ca092b2d743c7aad35a5831b66d5b release31-maint
+76272 79ea4b1ef04f27de57a75495bb219939aab34147 py3k
+76273 7d6bad5c2d64e06b2e27ee87ddeb6c3005045ee6 release31-maint
+76276 1a3d396d1b6fcbf542be592744e48a389c8a81be legacy-trunk
+76277 53ee8ecc18a522a8223cacdf515b8cabe9d28b32 legacy-trunk
+76278 bb4fda22e657808be04ff659418f4e2feb567ce5 release26-maint
+76279 c777e4b455004e2826d029e02bbcbb0b8307ea8d py3k
+76280 87688ff6accc4dd6ce450d72d62d5bf6e11466f7 py3k
+76281 05a89c8663cc72e845fecd468dacbb910d2a8f49 release31-maint
+76282 05c4eb0089c5f1e512bc0041a844b1e5535f60e9 legacy-trunk
+76283 3b0b19b53d32bf55985576b7e7f6f624ff9385ee release26-maint
+76284 595ec1d90b2fefc64100c817349fbb388f0fa175 py3k
+76285 fb7fc8302721d008d075add735fc0afc8c13243b release31-maint
+76286 40881db316893392dc2e7ed18a4a1c51059b32e8 legacy-trunk
+76287 6a7fc2e8565f73a7f46c9362c38efa339a786fdf release26-maint
+76288 5904abb7eef7b3c8ecc92b69d5b0a233ea8ac772 legacy-trunk
+76289 49a5f1cb1b25470ad1a924ebc2761ad5cad51420 release26-maint
+76290 f640f55e887385789f49d2e276df01f3b6724a6b py3k
+76291 5b05b5e9a8e9b742a8cc8dd6fc05a2a96cdd4943 release31-maint
+76292 370d218a01bc32d9fb79649962d273f7a6a91434 py3k
+76293 2aa62fce0bf865361eaa8edf1dc1299b1f31835c py3k
+76294 b2a390c5de5f8931d1c8e3da4f3dc50362f6389c release31-maint
+76295 62b8de983b2642b879429dee9e248a32166cd60d legacy-trunk
+76296 c217e0331d4b2e3a8d54f2637facd0d100f69c99 release26-maint
+76297 c458f813a7094bff0580c38ab9ae9a0bbb8d72d6 py3k
+76298 3ebf907db028e12ba7c173fe227bf9ab9e60610d py3k
+76299 9505afe8823f94c0791b4e7a23086baad0574109 release31-maint
+76300 069b66cfad3fd9f65de708427fd21876f5eac0cd legacy-trunk
+76301 785231c1c55a9191567bb73384d0afefa59a402b py3k
+76302 2ecc5936b1f2333f83d332def831729d211f3430 release26-maint
+76303 f135fdb73d885437b7cb59d4c8575c3f87b3791d release31-maint
+76304 c5099818e0d4e590cde37a67fc9532d12ad6e0e1 py3k
+76305 abaf3724be711786e2160bafac688b457edca9dd release31-maint
+76306 afb3348b37156232f20159b9b746fe8f014b77ec legacy-trunk
+76307 150610cae804929dc8d530d479c02ddb90e01d83 py3k
+76308 51028709abc327cf7756ffc40af0e44360250049 legacy-trunk
+76309 836642240464abd4a8e01fb0ecc36df1544b10f6 legacy-trunk
+76310 23c138c4ec05ec122f8a51cb0a62655e66bb6d6c py3k
+76311 154fb270a820f3cd0029ebc41a6a643a6518b9f1 release31-maint
+76312 eb1c03a37a0295d5aa6de3e196f45baa5025dae6 legacy-trunk
+76313 c08423d70b9f21a71163973b09d5450b91ae7a3b release26-maint
+76314 df5364fc0e5c9d4900b760e7a4b0cecdc0c5cd81 py3k
+76315 25b640d234f9555c3bd151e28e497b4b82aa0da6 release31-maint
+76316 250e1f475568aa2e6ce266124af8aa2e5164e5fe tarek_sysconfig
+76317 664f6301940f832e63f5af623b137066745d6598 tarek_sysconfig
+76318 61545290cb514496576b2f55f1782401fc37ba2a py3k
+76319 eb235eb45d329bd36340dc2c477454a6f3d5b695 py3k
+76320 f1112c2700b1e65112a9fc5b58929f73b239bc95 release31-maint
+76321 401d223705b7781fc89d816f37772d12747d11bd legacy-trunk
+76322 1e03fe5a11b42f2d0c5b687a896e8345654ce9fa legacy-trunk
+76323 9670fe6e6d14dcaaa3f00974582e828f29739348 release26-maint
+76324 fd417cd6434185ab60d7095491439a0dd263ca2e py3k
+76325 f62930d0fa72d2554045d756a8367280f6fd971e release31-maint
+76326 c847c684c2c5ea092b6602c06f56b7db1dbbad43 legacy-trunk
+76327 d3b3a8a8090fa19dab85355f5cf57cecc112ab1c release26-maint
+76328 ac768c8e13aca88ad6b577e8a2f08fd114674f3f py3k
+76329 2d3cda6b8c952213f37f0cf9a5987d79c7d70783 release31-maint
+76330 f680c1fb7804f83225fdd0bb65742abf2ea9cd4f legacy-trunk
+76331 d127679ecfaa6de495458cf3e86338d2aad1d19f release26-maint
+76332 9d9342cbf9353e4e5921963b4fe0ce6cb8004002 py3k
+76333 ceb3b36dd681ecc0824eb680173db0538c7c58fd legacy-trunk
+76334 c5a122cb1288a6c47a966fe1dadf39a3dcc85a41 release26-maint
+76335 4391a22ab1f04a93868cec5d726c10f58aef543f py3k
+76337 4aa4c19dfaedecf7d41b3c4d00e9ca651d0867c7 legacy-trunk
+76338 adf9274d3edc413fc26df07d3ef28a536ff349ea py3k
+76341 f93b2a68dfb42074ff6d379e6f638d48a1a801fc py3k
+76350 349b97ff4c2b78324faf3d4738e6eaffb37e0966 legacy-trunk
+76351 7183d6b930ba9124acf8b410ce10d2d1c8c4e0b0 py3k
+76353 2628216bc66d476f77693d82c7214600f20a9882 release26-maint
+76358 a77a2d7ced7dd7c2e3cec80077eea10286d1b90f legacy-trunk
+76359 184eb90b2e3d75fb91c40f9214ee6703729a19f8 release26-maint
+76360 d6c2106779b90ce2cb094676d2b125c92c71ce4b py3k
+76361 3c62031b2506decd57e75c351ece972265b09123 release31-maint
+76362 3d2b06aa7b36fa0c64b63c74c3d9d000623cb328 legacy-trunk
+76363 f0148d92db7ff50633373c380f0b016b6a1f87b1 release26-maint
+76364 eda56d0775bacd7db2fc6619599276ac6ac0602f py3k
+76365 24ab91fb25abf07edaaa4351d99d500f47bd64e2 release31-maint
+76366 3d18cd1d04a4468f181f20876f4b754686ab30ff legacy-trunk
+76367 4ed132d6bb7001238f2c13071592bac371007e2b legacy-trunk
+76368 6e3cc3adf1dc440a3b2dc18b26363bac7530b841 py3k
+76369 a7f6194b78cc92d28088c7a4c19b3b0e76ca170c py3k
+76370 ed54a1a914b4c6605300e2be0a26c55df5af7df1 release26-maint
+76371 5ef34b29766cf1a276317f89cbd24d22ba7bdeef release26-maint
+76372 2c5c6687f1c8eb540f0f0a796e3cfcdf00f1aa7f release30-maint
+76373 92e06cdbeab9b68425ec2f9c522577a604ed74d1 legacy-trunk
+76374 50d355324c506327ddadc7362ec011efcc20ec07 release26-maint
+76375 b96f78ce8383393bc1dbf4410c4ad4be8f0780e1 py3k
+76376 333dda31bd7331ee6117c21924f7acf6b7e0de31 legacy-trunk
+76377 41d29c17fd405d6ae132d0be3b9e2bb4194fb32d legacy-trunk
+76378 4633ed237970d746f84b91fc00de25647a9d366e release26-maint
+76379 1e534d7950f80e893371687ea5ebaac01c17bb31 legacy-trunk
+76380 9ed02df72bd62f3e712fdeb4370f7beede364166 legacy-trunk
+76381 d8bcc9de16054c79e840f3f68eb7aab3671b580a legacy-trunk
+76382 0bcc12c46015a4888557cdac9e1d20e245f7c4aa legacy-trunk
+76383 05af04900b6b91e2ed00dc4359f50facda037a9d py3k
+76384 715c0baa8b2c8c78acd5adbb27f3253c174c8c4e release26-maint
+76385 5e5c97b9c8279f62c83808362b7dd311d954e22c py3k
+76386 a345bb50ec0f88c5da8d31b012829478fc9ff299 release26-maint
+76387 d8019d1d56f334f52e96b781bbc4abc47214b197 release31-maint
+76388 ed59077838ade9927af6d4920753c106d90bf085 release31-maint
+76389 b31a33c36f0874ca17168a14ea67d5e74aa6d04a release31-maint
+76390 b8a0b333e469e1a898f3143a078e171a8907ff31 py3k
+76391 8d06e450bc98cb6a4f73ba9cfaf2da978c6f73c3 py3k
+76392 f152667200ae90424cf2fdcb5da0b86604c8c551 legacy-trunk
+76393 a790f84fbafa2818ee6d98a16a1c50650b6e82c0 release31-maint
+76394 f73d137cfbd046f7a4ada610ec585224b7493bb7 release26-maint
+76395 8793ff8f48261d9146d4880cc4f5ed761d1bf233 legacy-trunk
+76396 166f7a3b73fc60c636d662aaba02ef9f3da74b3a py3k
+76397 42aaedaefbcb65e0b9569e775f6c52bdc0f60e05 release31-maint
+76398 d5779e159ddb1a8da21c7cb76c7a58ffdd6c0bbc release26-maint
+76399 c0dfa9bd5c7f8233b8265d92e48d34b1cf16ccae legacy-trunk
+76400 4b6b4943d69a40b0b49a92c3edb3dae141173e2a release26-maint
+76401 f57f0c6aae9d82d83bccfd914c540663d41fa417 py3k
+76402 ab5b7e0a9131adbc3faaffb8db7d88b0025e05af release31-maint
+76403 c079fcbfc7617b6b981ec6cfedff49e8ce6ebe33 legacy-trunk
+76404 5b54325ef6f5763138aceda95112f1b32fd42e06 release26-maint
+76405 39989c66db178a218b5913f857338ec279fe2975 py3k
+76406 a92ef136d9d0cff916b83aa51cde25938428bc77 release31-maint
+76407 4fae8168c43b13188e30c41108d0537b284a7ebe legacy-trunk
+76408 b96ae3d8adfd108ab37e8b02127083d860e1b935 release26-maint
+76409 2dd7942dcfd5390a66f931548af8b70355b24c3a py3k
+76410 24d1e06c629c1a860f9dc5f5e223b18b1df8f833 release31-maint
+76411 67c0f92ce55c77ba2e6cf7eada44fab5f58bdfeb legacy-trunk
+76412 a4d9a3dbc533fb2ef2e1fd70c5a2e6436f324a08 release26-maint
+76413 98ab3adb045ce26ea6df69d416f95b044000c893 py3k
+76414 2254c7da97788046330ed91d44c90daee87b3f97 py3k
+76415 82380816e7db3b26471c0680651baa9c83986d54 release31-maint
+76416 ed30bcffa14672f0e3349fc077ce59de77b0960a legacy-trunk
+76417 6aa528c501284c5f7c2d15b2a396421217b7347e legacy-trunk
+76418 475bf8b584a923b048f23872f3ce9dbb6dcf2184 py3k
+76419 f9f3950b5ec75652071e5179923480bc1d1c9100 release26-maint
+76420 1c352750ebf23f951668636f815378de383da467 legacy-trunk
+76421 f2da488b4b7b39356e34067bd2efdb54757e2a47 py3k
+76422 cd5b15c29a396ee99cd0bbf844ba3534b33feb85 release26-maint
+76423 6e370013f3a0a59a79948b633b2ee5bf28cae3b5 legacy-trunk
+76424 137115e395d8ddfb57efd4204af4e116adbd6f80 legacy-trunk
+76425 18af0ce0a58bd8b6bbc72a280a1cdcb989ea0f0c py3k
+76426 eaebe2460377c55bac207895ae59bd26aa005664 release26-maint
+76427 fd6e2abae14e42f52ff685fb2d6504435c124f31 release31-maint
+76428 e2b2ceefa82acfdb5a98b940a3d0400309cbafeb legacy-trunk
+76429 e83e3db62fc78d4e3fdaa8f365de7c3327c4d72e legacy-trunk
+76430 e3c994c29a22927a29869cb405baa65c02c5a1fb legacy-trunk
+76431 b81d60110f86f7781229e5d03bd010231a06be26 legacy-trunk
+76432 2e3ec3bb4be7cbfd2a6debe1026af2fa5327356e legacy-trunk
+76433 1d923ebb47600f8a31c688b1efb63fdea3c2fe3e legacy-trunk
+76434 7a5cb4decf6f28e8a5f09d914acbe1d287a5cca8 legacy-trunk
+76435 b8bd5360841baa5de5b9fc118dcd3230c5f8e665 py3k
+76436 5aeeee0eae5fcf536be33d8670fab246c9828165 release26-maint
+76437 639ba036c20948c488eb7f9437a23f6c7f12bcc4 release31-maint
+76438 af88b1d25bf28ebc9551e9518019c6ae100de460 legacy-trunk
+76439 513c4b1575f26702bc31fefe7041ff45ad918611 py3k
+76440 4c8708a791e6032e028cd954b4404947f6896c41 py3k
+76441 4d556c27926a61c732767aef20232b2e29af1703 release31-maint
+76442 dcbcc8c14179350077754d732e06ced4c1642f5a tarek_sysconfig
+76443 4e270eab452df308140a9b5d76c05693f501674a legacy-trunk
+76444 d6f8552fce79fafd4aa1e3c86e856ccd02b301f1 py3k
+76445 bc7643a7a5e7b287ff3c9876372cb6db806d28b6 release26-maint
+76446 0eeb3a3e79ef888f72a8ba7a310c897d7e2def11 release31-maint
+76448 ec52c419b824e1c5e08f3a9bd4782ce06939ed2b py3k
+76449 373d42f26e966a7da8049196e34d35a362868c91 release31-maint
+76452 de07880a53ffa7904b33e33da065f35ef2101b27 legacy-trunk
+76453 d6ce18ad8467169e182ea7e215d909b40e8f362d py3k
+76454 56f19081d7bce97ecd2ac0a5f82e3174fef4957e release26-maint
+76455 e1d732527c7e34457b79df070604cb8ca79e4e3a release31-maint
+76456 248c4fa5fe0c98795a8361cbb3853faf2cdc8f44 legacy-trunk
+76457 0869e1ab572e37c33549a2bd77213f647bb433f8 release26-maint
+76458 c48fd63c2f61a08b022d27a33fd1284061c50faf py3k
+76459 0984099a94313b2efebd510aba510a16b5064276 release31-maint
+76460 704214b9cb76c773d1095e7501c96f56619748d5 legacy-trunk
+76461 2639ea7b92ed04c696e4d750d2131fe9b91daefe release26-maint
+76462 ada5f6eee1cb121d4372ba2d39bdcb7c8b4a1e63 py3k
+76463 c2ecca5ff6593cdb09b40c415245927b14e9525f release31-maint
+76464 f554dfff745057656f5ca7320d87f6de36b5255b legacy-trunk
+76465 808f9c0d4ac400cbf5b2039c037b1ca4ca4f5fcd legacy-trunk
+76466 5cd95e57772c80c7fbb75eae5bef78bc74618dc0 release26-maint
+76467 c8d69a06b33bbf61649a90d367721b5ce7462cfd py3k
+76468 818cd40df865f26783130d503a2b650552157679 release26-maint
+76469 aa9627c41222caa2a4a2fb6c1d0880721e63337f py3k
+76470 3a2b149ae66e815f083f236c032cb99435019089 release31-maint
+76471 f017a34864e2ba537029869d7a89f47d6b4aa9a8 legacy-trunk
+76472 a7eb1ae4e91904bbe49fc3c4eaf4e1e0ff5526d5 legacy-trunk
+76473 3017d82f075acdb114a6c9eb0e516382ae245567 release26-maint
+76474 08a0c9588f13f0f585c79d11f2066e165ba42f9f py3k
+76483 b9b683eedee116790c01d75b5561bff0102e80c6 legacy-trunk
+76484 5116ef779a801f1cdb12ab2e78ef6e2749950e13 release26-maint
+76485 357ad90b8114cf40f72bc888ceec7a64fa867ceb py3k
+76486 b7fbef077eae13cb50bfae88abc946fcaf9947f4 release31-maint
+76487 3948b4c729d7ae94ad75f641fc43fc74b669ebe0 legacy-trunk
+76488 516c622a4f9e1382c26d3767b1709f8ef38301e1 py3k
+76489 337ebb829b8ca2e3772141a84a3e784c925f3b68 legacy-trunk
+76490 9dca384748549c86d846d1e5ed330a609ae56ee8 release26-maint
+76491 535e08ce43f579cc6e964e7bee80ba4ff71d54d7 py3k
+76492 58b1191e451fa003fe339ae3945523c0edabed26 release31-maint
+76493 6f048b1e528062323f9e51b90f68f6497927a0b8 release31-maint
+76494 765909fc7dec96e3ee4e118399816605f7857a98 release31-maint
+76495 fbef5fccb0c88f9cfbd075765105e2435935c02b legacy-trunk
+76496 83d94e72f01cffa0b261dd55cf9aa444ed8fa81a release26-maint
+76497 fb7994b2910173a4c7ae14211b07b09adcaa9bf2 py3k
+76498 17e590be4c5aa2a668ee491a37ab1984f4aecce4 legacy-trunk
+76499 cb3eac421cf96ef8e18374a1e22f218ca2a229fc legacy-trunk
+76500 b51fda754f5a5e31704b3fe313c9afa77f822fdc release26-maint
+76501 9e79a6afa3f53100b6aa41a8ad681e3ff01cc369 py3k
+76502 2cd1fb104233481a10e570f7697cab84389879f4 legacy-trunk
+76503 90282804cd50167ea0c28b49bfbc9140693d8c99 py3k
+76504 ad5169e05dc3b38a698fd6394eacafc0150774fc release26-maint
+76505 018b20b039a854b5a16ecf80fb735c7f189fbc1b release31-maint
+76507 5ea226d32f6d77e58197e56b3e3a5d6c6d98c9de legacy-trunk
+76508 1d157e2ce9493f483486fad29131e678948f0cba legacy-trunk
+76509 85cd935255687d3b803f49865844345362c57234 legacy-trunk
+76513 c7732f889c4548ae70cf9bd188e33abb8fdd3b78 py3k
+76514 022cd0f3c558edde169f6ba562c7d1415356cb43 py3k
+76515 0db67153d25f14c3e97c7d8bf1096b891be06897 py3k
+76516 1386d0e9e0fc7a4d617d80b0bdab1b40de63d476 py3k
+76517 41bd3123864d89d3511bbb775e5fe42ffa3eee6e legacy-trunk
+76518 e5bc382ccf75b1ed8a30ca7fb5d2488d23163361 py3k
+76519 508654cee137a8ed15815ae730edf80a18ca0410 release31-maint
+76520 e6133d154f9819c649d8eadbcbfe42e48cf21e05 py3k
+76521 fea53258ab7ebeed108dc971ea9362aae4ffaee8 release26-maint
+76522 df86c420e97a0cc157c687e8f3b82ac2c05ed7de legacy-trunk
+76523 85e1e13b498a72c032d80d92f6a9fe54ec68f8ba release31-maint
+76524 2d388d1a83f42e2446aef8e8cc1fe4f24469ad97 py3k
+76525 a1d166ab18c44ba6363accb9ef2ffa4f044f38c0 py3k
+76529 a6981f4a74a1d866c09b59ee7ca0603c94ec0aff legacy-trunk
+76530 a85471c475148df0677a91219f166c8b8d215d77 py3k
+76531 61e6ce71850089c0d482968d1aa17b28824a2123 legacy-trunk
+76532 3f71ebe91f905505c9e50e656b6905885f08a3c6 py3k
+76534 c5458ba389d7659f8e912145f8c44ce07f5655ca legacy-trunk
+76535 7b74abb803568dbe7f5308f933ab2c9439d5d5a7 legacy-trunk
+76536 74230e5ab37390559c9a42f22e3157ff72f88fb3 py3k
+76538 4521f5998e7c62e941360399839fe83e9fccad12 legacy-trunk
+76546 a8ab63fd309897c0035d2c373c36f0187b108338 legacy-trunk
+76547 c9369092fefcd445b9c563deffa2c1df0a60e427 py3k
+76548 13748f3ddc7b549b4eb6d66a6599521d6644f19b legacy-trunk
+76549 c7d7d5ca84464f2acd7c04dad1ff5489a5ff9135 py3k
+76550 988db0bbee3a3e0a94666ecd90410d5c9496c77e legacy-trunk
+76551 6721d33f3cd1f3ac6dd16bf248cbae727fb77bd1 legacy-trunk
+76551 53669cbf0ed2a9b249733ef069de14b37b715eb8 release26-maint
+76551 726d12dba1f60e3db14ff24404f316cb80a58d7f py3k
+76552 4ef7b3e2d6a8b0b0a9b7c8c2e98f3449e6e03d2f py3k
+76554 527b7c075849fbf64587a546c34272d99b6e4c06 release25-maint
+76555 574dd8aca914e443b6675ee7b5b6de90885f1934 release24-maint
+76556 6e7403ad5335ea4d12d26e1aec02753abe65bce1 legacy-trunk
+76557 fde5130bf6cdbd32c9f4aa8f53e20abbab20f383 py3k
+76558 33986648630bc4c09f01fda174d1bc02461d682b legacy-trunk
+76559 18024d29869cb1f5d5e0901ec20abbb47bed6f8d legacy-trunk
+76560 c4c3fd593b0ac296d3852aa6c4e0a5d287fa4bd5 py3k
+76561 297df77ba396470696fa5eb27f7fab183c187791 legacy-trunk
+76562 696d9615a2383b953baa676d224114dba8b37ef5 release26-maint
+76563 5b607cd8c71bb58da3fc8796e77b103c20cfb83d py3k
+76564 3d115782fe1bb04f11a83e34d0ae47343e27a7d0 release31-maint
+76565 0c19be450e67a01ec4a2d6f123f7a4c7b0e58ef9 release26-maint
+76566 cb836301db6057eddce429b320a0d44470c973ba py3k
+76567 3d77d7c16c909796c7f2af37eb1efbdf88697520 release31-maint
+76568 14ee75b86a5f041d531bcb41e62947bdeecfc7d1 legacy-trunk
+76569 936b6f0655938bec0427c39a2f286739633d8807 release26-maint
+76570 9fd8e95b4fce17db355effc119d2718cc218043b py3k
+76571 83c702c17e0218df96592eb27a97a8ba63c747e0 legacy-trunk
+76572 916a3d350741c7f6cfe8860882b40929bdad1b0a py3k
+76573 149c1a7e72c15472f29b9280dcf78fc955324ba1 py3k
+76574 4bed796ee0d7869ad2ff00117eed1cd98b3a17de release31-maint
+76575 e06c3f62fcc98c0126a22a0fdf1bb66e2a15d95c legacy-trunk
+76576 83352ed9229a3f630a23812307c8a947e5fda9f5 release26-maint
+76577 b0fc54c5d234f7a490f955049af87505e27b2927 py3k
+76578 f2e1ac750f118534ed0285913ef35d0c15589648 release31-maint
+76583 930aeded900dc9d7a7399a3dd6f21387fc9aaf52 legacy-trunk
+76584 9fb6d5414dd882e8399654ee0e003d7a11acc968 release26-maint
+76585 0eaf5c9edd728f27c988239cbc22c9239923d8ab py3k
+76586 915a044be834cad2dd4c45b12fcdc85a538d7d17 py3k
+76587 e8d550a89f0ba11a6535db71a8f334dcdb45a0df release31-maint
+76588 a949255d450fba166dd0eacaa4a8e05e9dc76e47 legacy-trunk
+76589 6cd45f5cab58a73c9436b16729481c4d5509f1b3 release26-maint
+76590 e96069a1327f936b5e781f49421f40f1594f6619 py3k
+76591 218a7eb40d26e3834a0259a819c18a8e263c8fd3 legacy-trunk
+76592 d51012fe09b3426206d023ae38754c54a657551e release31-maint
+76593 6bdede18fc80df6d6b6f8b7a90e75e065b29cddb py3k
+76594 9e51a14998a2a601bbca35359287829517a62994 release31-maint
+76595 f37f6b9b224b07905ed8e28e5dbf4cf6802219e2 py3k
+76596 74ac8c127a6ff16ea01ae11eea089d7f8356ad07 release31-maint
+76599 1ff2c3edc13ce872fb1bcf6f60d5d23716e568f0 release26-maint
+76600 2816650d7688c30384f73e98153e8796f8804caa legacy-trunk
+76601 84e3d36da4c270c6ef36d398d28489c47c85d82a tarek_sysconfig
+76602 0cf99158fa636001727ff85dbc03fda1c03529b3 legacy-trunk
+76603 315e6ae64bef7acd8539e084e7f685e4dcc6b500 legacy-trunk
+76604 ff2aefc97881f2584435fa115fb8c635846c1c38 release26-maint
+76605 e320f88a65c9acb389f6b84db9990938e1ced05c legacy-trunk
+76606 ddab3da9473db5876253c0b17f82d5602c5db067 release26-maint
+76607 8896c4847423d58bdc1bdd33c1b42e1bdec6faa6 py3k
+76608 0a6137944e61a0767dc6a5dfdfcbec74fca8a7a4 release31-maint
+76609 6536a1cd47cd3ee81f575e3974f786835a63cf7c py3k
+76623 d99ef464ef33fef630ca872ff7f87f453972e82e legacy-trunk
+76624 4d7cdf7a6c75db5f77af8befa014e2fb54ef0e78 py3k
+76625 1b2afcc3ccf38a83b7153aba8aee3cff00cf91bd legacy-trunk
+76626 5d2c9d8877ddb9a3aeb1513de6a51dd4f685a05b py3k
+76627 280369677602c6be6936f08c444f12587e6bc84e release31-maint
+76628 cf9c649dcc4f4f21914aa5040942b88d80dd519b legacy-trunk
+76629 8f6eee42f810dcd630cc4ccbf6391b4dc5fcc5c0 legacy-trunk
+76630 cbb6e92c1a0dd25419b43539f08131ad03ef6e73 release26-maint
+76631 d9398bdd413a032532a5f434babf57990883a9d8 py3k
+76632 0ff47034c691cab3c27b8b65598fe2843da4ba95 legacy-trunk
+76633 d68a60052c665065d75602e7c1171db3aeb42536 release26-maint
+76634 b40512cec2d6c9f037d37ecbeb767e3aeb33fb3b py3k
+76635 acfd5615b52c14c82ca148c8e106dc248f9e58d5 release31-maint
+76636 a54c19802acccafa98d1f5684a853bd8c6fd24ae legacy-trunk
+76637 e9dac3eff31743b5152d874e09e854aadca7a1e7 py3k
+76640 d7cc9017ac4c660195e15433227bda141ee0016d legacy-trunk
+76641 0af8181da5ce5151618ca9f58371b230ddcb9eb6 py3k
+76642 262a2ceaf05f1cdd6ee876d52e88ba2b505e2a7e legacy-trunk
+76643 15ac3191f9be05a45bfe07e7bd625ca0c6fe4283 py3k
+76644 8180925c75ba519cb455195cd499f79b9404b42d legacy-trunk
+76645 b79d0420c2040d82d7e8667a976582371654ebf5 py3k
+76646 5c681ecc9967c41df9e77ecc5449752057f7d1c5 py3k
+76647 b60f2b2b9c0454d341eabe351632be4aae40a7d0 release31-maint
+76648 75e1b8c05f43d4ae42d4ae0f491f6545caca1c43 legacy-trunk
+76649 917058eea4402499cff264817d53da7fe2120e42 release26-maint
+76650 fdf7d0ec9d041b451c5b1601d08cb0ea2f057ede py3k
+76651 b5cd3d2ec0276d249038265b0b4d681690d65641 legacy-trunk
+76652 96954e7dd9b6e21c68e55508f83ad03f9664b266 release26-maint
+76653 11434b62d8cd8062feda158cff3480b84b93ec89 py3k
+76647 ef9f432e4d39dcd9422caab3919a6efc413de2ab release31-maint
+76655 1fa1854031aa2a4629666381594647586b8789cd legacy-trunk
+76656 f042db434638392c93976544da8b7f35ec7dea6e py3k
+76647 d00ec260d62aa9c9b1c4041b03e376c5c0243680 release31-maint
+76658 b8e292369ea8b82cf19e5c2652e389ec64acbdba release31-maint
+76659 d31b3350aadbe630e0a2627c12b3c0ebd36f5b7e legacy-trunk
+76660 1ee1fa7becf2ad23ee29b21b41573bc483f07243 release26-maint
+76661 598de8e6c48b346c2e6fe83565fb4472033fd305 py3k
+76662 9df4d5b52609cfe4db5a0cd74ba23eeb4783034b release31-maint
+76663 7331388581574e7ebb350b4cb26f5713121d749e py3k
+76664 3ec6b51cdbddbb7163f3a9d6fe36418269a3e851 release31-maint
+76665 040c38ed22515f973428715a5f1443d75a876cfc legacy-trunk
+76666 d587a4e5ba5a59491e25009fb391ec2a9630737c release26-maint
+76667 73a9125703c32ac24613fc8f8d618bb1ac0c7da4 py3k
+76668 55c832bd32333a1af001796e9c454081ddd0b3ff legacy-trunk
+76669 d308029e9ad22b5b8fa4891144647310047763bc release26-maint
+76670 0fe89875edef3476dc24afe29eb53b060fb10013 py3k
+76671 0148f76d6fcdfd9f25196aaa0314aa8a73d1dfa5 release31-maint
+76672 6bb63be7299cb63cbe420d309cb4cfbe31b44223 legacy-trunk
+76673 4d7445ca30514eff95ca9264bcc6c35f7ece59af legacy-trunk
+76674 b4107eb00b4271fb73a9e1b736d4f23460950778 legacy-trunk
+76675 b9e9d540c90d31296b45b2bfd1b57914680ab6b6 legacy-trunk
+76676 36a0dd21c5b43d9ae869cc3a56d4077a02da9b8e legacy-trunk
+76677 e19de9433a4bfe8cfa386c1bb85e074eb9d04c53 py3k
+76679 25532c9932dffa7d92e4377b51d75b6f9b7fe532 legacy-trunk
+76680 eab123dc107f64dc2fe11f273def78b18444d454 py3k
+76681 1c92fbb3baf26ac5fbea5f47543ab8759a2dd225 py3k
+76682 ad145558226b87aec702f0948ae6118a32ffd436 release31-maint
+76683 68565817c17f95be441ac7c9062fc55b1228120c release31-maint
+76684 6a48a091c0d386c946aa94f06d6bddd8b9d7f6ab legacy-trunk
+76685 1c2ecd59d65af99d7504536e6bf81597cea12e36 release26-maint
+76686 9e751601f53827e0ea7e31303f5f6afc63940f0c py3k
+76687 568618b5f6fd5d455cd08df4a2b4dda07f27ddf6 release31-maint
+76688 a6b1e6959382e35f40c191597ed3dbc8281406aa py3k
+76689 eea803d235d341cc5baab0a87dfc7f701388e5d3 legacy-trunk
+76690 be1cbc15d9f51cccfaccfa7016426a7766ac1e88 legacy-trunk
+76690 f9bdbcc8d1e8e6ec8c45809f2bd4038dba462ba2 py3k
+76691 607f518bd3cfb80b0fd6ac7476be5a15839d0695 legacy-trunk
+76691 bac8ea2b6da35884eae9afc129b7ea2c196ebdf9 py3k
+76692 89f6a75462b27edb15120a880fb6a009530f7cc2 legacy-trunk
+76693 6ef4bcc4a4502166b6c834b2b6b29a1ee3115c76 py3k
+76694 56fce188c6be07eff948ba565c1336f5cb03eeb0 pep-0383
+76695 c0f8e4a23ddf4b949524a855d3ba322b8b3620da pep-0383
+76696 685522c6f30fbe1b1653fa3c42d7cdbd5d18ea25 pep-0384
+76697 9c597b0a6a9b71f8803f64e378bdaf4d4770fcaf legacy-trunk
+76698 35f3a19c4265a76c82a9bfff0c9fe7fba5b48266 py3k
+76699 f5a447b3f26ebf495bd571cf7e8f59a799059681 release31-maint
+76701 45081861ef74aff868f01e69ba6a8bafc7457a1e legacy-trunk
+76702 25aede62fc172a6698ec03662d428c82c81f2dd2 legacy-trunk
+76703 2750973e3893c43ba8b1cb4a05de0e3bc3e04b3d release26-maint
+76704 98879c8d53f165dc8c800d8d84cdfe1603f9db5f legacy-trunk
+76705 51c5c912ec3eb42e169b058fd542afc81f858356 release26-maint
+76706 d9b4f6ea3e3975b3b49d85efe6468cbf4fa68d18 py3k
+76707 7647b14efe71fa9365fb42e091ceaea9a8342a47 release31-maint
+76708 db28aeb2fb7a7bba22c6b6c6e189293062293ec5 legacy-trunk
+76709 40746956b3792b357853c2348222f2b712fad9a9 release26-maint
+76710 683d5c97e476de499fecf86f904b4865c492faeb py3k
+76711 6efb46c2b3c3addae2a5b34b908bbbebad8b88fe release31-maint
+76712 24ffb0a3ae4ba934687dfcc70e00347441cf77be legacy-trunk
+76713 40c362a58e7f0aa10475ad16fbe38ecf6525e01e py3k
+76714 cf0c69be011a587cc1ca77dc54077039273bf1ee release31-maint
+76715 83a76193997533a274d3b930b758680f31277d82 release26-maint
+76716 83c2bf3191d85a48a01a84e8618429ea6f7ce24c legacy-trunk
+76717 5b8683a95eaec65f039e78cd16532de9d053d63d py3k
+76718 e728ae89ae69d88c85d309694bd056fc2bd3f66a legacy-trunk
+76719 5e8b7449f9615c307d5fb21cb6f1f12d60b2afb4 py3k
+76720 6c64255639182828b660faa13eb0217c40fd8716 legacy-trunk
+76721 2c52d4d3e54aed5c476ba19fe4702b9bab93689d py3k
+76723 e6347038df976fcc43a08d70e7a8acf2ef5e3ea0 py3k
+76724 ccc5406cb381dfb955f6bfde2b7bf0805f65652c release31-maint
+76725 738b39b12dc8f05055dbac43c9e7045233eb9a65 py3k
+76726 efeabee6e061ac4993a41cb77a05ae6536d37f02 legacy-trunk
+76727 750e75d930215550ddfca7a2651c588973afde0e legacy-trunk
+76728 0a76ab3a673c6fd6e20c9345b13100a77c083340 py3k
+76729 816303a07762778fd12e5d090fddf9b461d658c1 py3k
+76730 273ef09fe8048e0d429912c1d0d1730a33217f2b py3k
+76731 8b8aee21d85e6a92de1f0d33ecfe19d19f28a85e py3k
+76732 8974ab685bae0640e0cd561fdebcfc5403d5e624 py3k
+76733 16691bc8b1894c484d72b8fa480cc86d7b189e58 legacy-trunk
+76734 bc716d8f4345d6a439f266f683c5a2484e983961 release31-maint
+76735 b5a4acbeaaa161aef2502507e6e9b533ec6d31c4 release26-maint
+76736 57ae5d44e731fbc244a4d5e85cfd0db083a9ae82 legacy-trunk
+76737 8276d00d3100f5af6615c521c19d26f16c67c318 legacy-trunk
+76738 8b6689c0e5a6e6c58b9ff53dd83ea6ed15cdbd10 legacy-trunk
+76739 b27d946389e767e64671e5a506ee02bd30af3588 release26-maint
+76740 63169cb9e49a01f11c64a8536585ff6a9608415a legacy-trunk
+76741 92f7c4ee6aadfc8cf1304710612c770b4e26a4a0 py3k
+76742 752e8608e131b71da2fd1fab9f74dcc2fd60e1e5 release26-maint
+76743 a4409cf6b5564a6be3db4f49e0fd22a41ac27be2 release31-maint
+76746 9211a5d7d0b42468615e72724e3478d9f64dec44 legacy-trunk
+76747 374d4e9aab052b5ff9c578600f96cf4de688c9cd release26-maint
+76748 6f9ad0418f70f196799aa0320b4915e352c5de67 py3k
+76749 4ee226890b59909d78c09709dc292719c1b73e28 release31-maint
+76750 d28fbac37e202f57fc18274de6c38174789ad021 legacy-trunk
+76751 e29a45331dea8b548b3ed362ee78ea187030a12c release26-maint
+76752 66fb1e2762d3423d7f3a96a7bb8d51a7868d6be5 py3k
+76753 7562e376d9b551e7a3d50f8370679e700deedc16 release31-maint
+76754 ae93962608359edbc2931d8cb1dc477998fc48e8 legacy-trunk
+76754 a6bf07fff6fcbfe8d490518676d8bbf72abb22f6 release24-maint
+76754 0cd7ac8c6bb3bbcde02dd70ba9e2c959ded6e729 release26-maint
+76754 19b4e1f6443e1999330bba30bffe0594ecdb135b release25-maint
+76754 9b6b1c1c1b330f1219144bc54b9c3c673828fe40 py3k
+76755 cb22eaee86c90c0fa3229fddbe0b5160d4de9285 legacy-trunk
+76756 9b83bfefc5e7f6faee4853af9cf4a29fae316de6 release24-maint
+76756 bbab602da1149a6972b75667f9150c413935c3c0 release26-maint
+76756 e7004da29f512ddb463bd471e7dae1787a7d9541 release25-maint
+76756 378bb705be904bb2dd8dca4b7f424fdf52ea6591 py3k
+76757 7cb73e7c176d30cd7b739d9ca9be2e4659c0100d py3k
+76758 16cd21ba268a4969dfacc672042a4e91692d4f71 release31-maint
+76759 aee8eb7f5f021e628a20b57cc51fc7d7be4ecd95 release26-maint
+76761 256e9f00d061ef8d5464e70ca91e8e64c3d83eec release26-maint
+76762 4d51aa572e8c9abe9f9e6b965fb6f432a97ec246 release31-maint
+76763 2ffd19a224d41fa4630e443eadb54a84af7ebeab legacy-trunk
+76764 d9785909c3a72b756def2696d81f160d4bc13c08 py3k
+76765 79e0dbb6c4b88c86417fe699ddffcb77d7a8d7a2 release31-maint
+76766 8690a7eff82a1e3d8ad57d0d0d7c1b85b8639d80 release26-maint
+76770 ad917b8fd64cf60147213cd878ee5ee3e188b8df py3k
+76771 b7ec4afcfc3f0bdf880b35b1bf353e9d2284f637 py3k
+76772 73a6b9b0543f4c801315252f0e20917e013143eb release31-maint
+76773 8048569eb53f5f71e125e827a8ccb1445413c8af py3k
+76774 20b7deb53d4e58b294d68f9e6d8e5f5e6eae9c30 legacy-trunk
+76775 2b934d466993dd1b71c8caa309412f8793daee75 release26-maint
+76776 087fe5fa113c1fd10d9b54779bb3aa8aa90c6473 py3k
+76777 d8c5e38515b6cdc5230955cb190029205cfbca15 py3k
+76778 1558dc69aacf26d860eb7efc6cf63366c9e57b58 release31-maint
+76779 a769a9b34fbc2c5aca2ac79dc6cefc00c5dc2d8a py3k
+76780 493780ea35cf821aa7a834d25061c115bd8d5a64 legacy-trunk
+76781 ed2b6883fc96734b1bc1537f332ecf0ccf1c6399 release26-maint
+76782 46c229742c64213ff0d8b4d74d0a294fd9d47a58 py3k
+76783 8c47d7d2a023b51912ce9f2ddd4c83cac73dd982 release31-maint
+76785 11423719babb4045e8e0ce4adcf462cca3accd5c legacy-trunk
+76786 464851bf22fdeb50077e14a0ae28f3fec352dd10 release26-maint
+76787 2fdcd73c32aabb926e509ff3212083ac07eef7ca py3k
+76788 548335cb007b1fe874feee0f24dc314f169e8688 py3k
+76789 4a9e43a3b98533aa7050c124d39870b0a81acd5a py3k
+76790 c915ff591a2f3341d8c82baabbda0ce6cd424cdc release31-maint
+76791 16cedde9af00904c450e2d0b9abb3b1aa82b1503 legacy-trunk
+76792 c7087ea1c21ddd3a3ed611e1b945c893290af709 release26-maint
+76793 e7c94cb72678991bab7ba525c0b8dbb035913659 py3k
+76794 cb26299e0e527b88d5d3d49695ec43886b650eba legacy-trunk
+76795 c2e94ef0d7e585772feb6f85db32cd6a39c71404 py3k
+76796 0dbeccd7e0e6faedd1fd2b667e71eee0db62c3b0 release26-maint
+76797 42e311a476e80b104bf16514165eae5032f027cc py3k
+76798 215ddff199c1b67ce782ec746e191646f89d154d legacy-trunk
+76799 27c63d6526209a7b82b80350e3df95ab84ec6736 legacy-trunk
+76800 1392e36af1b26a23b07e0c1cd9afb62cb7b2e6dc py3k
+76801 6052751a04c823272aea3ef19bdaa83a6d1dc012 release26-maint
+76802 a74e04fc93eb9dcfcd330259930d0cc6857c4575 release31-maint
+76803 654c68536975146524aba4c5eae95d1b42dc6ce1 release26-maint
+76804 7ccd228b895cc9f08db55c2e0dc4b9f78ab750b1 legacy-trunk
+76805 54f84558ad2b2f671107746431fed2cf0a0d6d09 legacy-trunk
+76806 24a8a29c8a4a046e644f3fa3fb06c3a22c14d9a5 py3k
+76807 3a7d54043aba8ef980469df2931481b49e66e91f legacy-trunk
+76808 12063a7b6a2a29edbbd88e6831500369c6b48d1f py3k
+76809 35df677989cb955104a2b10bbf188e39695b2888 release31-maint
+76810 fc70c8d743db72e6a9d2b8f485ffe81cc8032db5 py3k
+76811 62106b6f5596c893c76a4877c9c4ae4e9a24b728 release31-maint
+76812 7c421244e6ea8f0d323bd0355f4f5d9592ad5d5a py3k
+76813 536e46ed10acf4362007af0cf208f6f1dbf83c66 legacy-trunk
+76814 b3a364192c0ad97c8c30064288ec01e3077e6aa4 release31-maint
+76815 bc934098caa101e1819995e371e257a32a73ca2b py3k
+76816 056ffb8e17b3f54f09606a3ff03762a73c5d2261 release26-maint
+76817 dd5391d4bb680d4f8449c80d2cd9da998026fe61 release31-maint
+76818 6b28522197db10e44d8ce963d98e38087c197308 release31-maint
+76819 9f357c96f246e8840542786dcf0e4fca0a65e41f legacy-trunk
+76820 72ef3db5c6b37b28147c160d04d5814a376fda6a py3k
+76821 e5f2013b29a197e1cf8b3adf3f1069eb235a5f28 release31-maint
+76822 6e131e0713105d09bad344b8c15feca7090468da legacy-trunk
+76823 da1fce540885e1d75ad6acca4756224e24dd18fc py3k
+76824 40f3b8b83cc6a3e9cba5eb4dd36bb58273e40675 legacy-trunk
+76825 7705ac218c870b515f3a40cab94878ca5ef3d38b py3k
+76826 c0c861d38c4fdaef6bad8ec4a104845945211d41 legacy-trunk
+76827 3546779b21c7083e5284d497aa5d99f3acdeb6b2 release26-maint
+76828 68249ed8809e8133c83a46cbe97dda12ab4a4a70 py3k
+76829 bc55f5d50dec870a946570d823c66a013c659403 release31-maint
+76830 5103f68cca69095e70cd73642b02d8d41b731dc2 legacy-trunk
+76831 2b8f485b0d0397e12502a3c930632370ba7cff66 legacy-trunk
+76832 76bd5bdceccdfd966ec2b8b0c3676f1b105bf61a py3k
+76833 d2e14653a43c995c7f622c41585deefec8293ee2 release26-maint
+76834 d899f28dbb8e97c210962f800f939640625c3592 py3k
+76835 0eeea7656c22f030ed01d5f03cdea9620f28d65e release31-maint
+76836 49c68a2b05852c54915cabc927ea83c474dea3df py3k
+76837 bc0a6e4ce1b0bbf1e38d66d3902a15b7bcb2aeba release26-maint
+76838 919e2142726efe2ba0bd15544047880d2a7b7a00 release31-maint
+76840 fa4f23b182de6791abff87a563437b3660026e2f legacy-trunk
+76842 1592e8951b2bd354444b9880e236c7204bdec8f2 release26-maint
+76843 329ef294cc2db56d42d82d8209c716b20664f78b py3k
+76844 e9cebbe9de5c31af930c0c1f8cb68da62a4d1971 release31-maint
+76845 960e9e84ca59755c6b5ddad2e69de370214674c1 py3k
+76846 7c3c00e76c2488b66e9dc2153de74812aa736d3e release31-maint
+76847 66640fc607ca0635588d6052f9bca6509cbb7212 legacy-trunk
+76848 d862000f1b01553f97e2676dc60430838e0aaf70 release26-maint
+76849 24b685318633b3a3e2934eb10ed2a8a38da3ab98 legacy-trunk
+76850 e50e49d61fea5f34390b2b997f849bfaccb22c9b py3k
+76851 a9b6f27d1e290ec97cc15d59e1f54bc6cecac3d1 legacy-trunk
+76852 c2e4cfbb398cb85f11b33fcef485c853b185816b legacy-trunk
+76853 942823ddd818fc3892b1880ca373a0e436fd90d2 release26-maint
+76854 97abd7aabadc28e28834db63ef48e31fa5ab0a2f release26-maint
+76855 7eb050c0e65467c0d1efa09139938edf9b00ab49 py3k
+76856 2bd0f391593840c761abab99f960198f7f4dd266 legacy-trunk
+76857 9fe15c1f99cc9b0c9f2ecab0f172360c697d3a88 py3k
+76858 4fcbe0ea9b31781385c5765474879d5b2f31a583 release26-maint
+76859 bf69c3f2b778e403c45e5483af6b4b9fd56ae83f release31-maint
+76861 b206ad8cf5bf2e4475e56f1fc89f773e6ba4999c legacy-trunk
+76862 22a1ea90faa6177376699a444638dfdc76b188c7 release26-maint
+76863 b45ca11b9a3ec748ea4dc0b754fb5f9240944d21 py3k
+76864 54a502db3b8ce0d93dcfa6f36897bc1b4767928a release31-maint
+76865 b356ed9564e68c2c220d8e20aa7d1c64b6a7152d legacy-trunk
+76866 0a1c39c5f1b9c9e43100be2cebb246ac2f30a273 release26-maint
+76867 b1896620c296d2bf2caf8c7734eea7fa4bf4e2a5 py3k
+76868 b13f71539aac00a6dca4b81d9c6dbea2c17ec3cd release31-maint
+76869 62afcfa3fe188b7b7a48f35856caf61d755c0858 legacy-trunk
+76870 bb664d21939b688dfafd40b4996c56a2ba0ac349 tarek_sysconfig
+76874 e26ee8ddd29d13c709a17bade90c96945854d468 release26-maint
+76875 51d37ef43e1e9de5813c4f38b624d350f0aa0a59 py3k
+76876 0d39dab05622e7b1e31acf3b5b7089fa47dae0c2 release31-maint
+76877 019491b26b36cfe7018bf4d213a521d90cca8586 release26-maint
+76878 d350afc337dc64c47cfac78945fd8928cae29ca6 legacy-trunk
+76879 1e8164b5f36dbaf2a59e9c0f2b1cc1af8ab37220 py3k
+76880 e5df9a1dab6a083b55e60ab16831c4db818d24eb release26-maint
+76881 64f5f375d073ec629a83e3d9a488e4a2db02faf4 release31-maint
+76882 76523346e20d76d5a9f34404cb79e36e7eb1086d legacy-trunk
+76883 d106ba6126a18ec0b910db3ff0e53066f5c499c0 legacy-trunk
+76884 723460b90add14ac004b45543eeb52191037fd62 py3k
+76885 0eec633ef0e320e27793d8cb464d83dc65f1bc9b py3k
+76886 9613ec41aeaaa056622fd95afb161ef7419e297e legacy-trunk
+76887 a349dbeabaee5a2fd61fd60ab8667f4497d12393 py3k
+76888 5b3758ee43566f993bb8eb074b7e05fbc2fc2267 py3k
+76889 36218b681d9edb167e3187f27a1184c911c1825c py3k
+76890 ddd1db5d2fe00e689bc156fc73b0cd878a51bda6 py3k
+76891 262130d70306cbcbc128a404242bf8a0d9c693b6 legacy-trunk
+76892 b8ca61d6e2623a5cf02e0835b219f97971c834f2 legacy-trunk
+76893 2d75da65d290e5de5d94069b5018f18ec7473e7f py3k
+76894 aeef2f27f9f0cf6c9a541ee297c0ba4247eb1747 release31-maint
+76895 7baa55b6e8c9188d028943b9861ffc8f2c5b4d8a py3k
+76896 1013208990417f4ee0ba0a17ef12b705a352b2c7 legacy-trunk
+76897 6d47b24947137d1e1ba186927e041b7ae3fab305 release26-maint
+76898 77e2313135dd9ba018ba69e68abda93c603bef67 legacy-trunk
+76899 9b847098cbf9306f34cb0bfef0e91debdc635409 release26-maint
+76900 18eb00914aee5baca98cd2845eecb5581d86881e py3k
+76901 6f9c0746f1e205068a836a94ab03b2e56199f5fb release31-maint
+76902 a08840ce88d34c1f0379dfa9a2f85913a9a08a9d py3k
+76903 ed4d5cd47ee9610207c4c0d5e916734214ab5464 release31-maint
+76904 f7f5e1d27e06302e5532fe1dbc1b9ac1a48f04ce legacy-trunk
+76905 89996755cf39e70bc46e74c8538963eb970c33f8 release26-maint
+76906 a46dd8da3c30827c11018fe0a610d98681b09bf0 py3k
+76907 e23f5ec93315857d7229b7bd2d6b1b49702865f2 release31-maint
+76908 10970f64ba331b189bd8e9542f9591323dd06cf3 legacy-trunk
+76909 70cc288f919e17ea6023639a95322e74663bad6d release26-maint
+76910 724a0da85c42cae79086bd7849d6e89ffd918022 py3k
+76911 dc1aadf9fa4a3c6ce24600e7dd6bdd627539b4b9 release31-maint
+76912 9c95752ede1253a9320fdcdc77e14eed3eaf9575 legacy-trunk
+76913 531b11a6a1255cdeaf4da04b4c6eaddb9755fcd2 py3k
+76914 ebeb2e7763f5a3a583be5e78b50b08c175e4ce23 py3k
+76915 ed1312cdb9b20a99f04317e5c1d910f771679819 release31-maint
+76916 5ccc5d4068c1aee2628664a43484794e204ee48b legacy-trunk
+76917 53f21f08af0d44c774d4cf821ce2163e02e8d3a5 py3k
+76918 d5150b2934fa60d3741bf5361ca5292068727a18 release26-maint
+76919 6f600e92a0f527da6e5f7b2a7978b3ad8d12fe43 release31-maint
+76920 896bf49628abfd3b0fd885c47b81d60295bfd8cd legacy-trunk
+76921 cca097ea27b9c1d8683fe42bb7a23b52d14e29c9 py3k
+76922 e9da812f4fff43144229e144fed819dee66567ba py3k
+76923 2089d9c1ae13e1b3ba0d74836c9fee9395a69797 py3k
+76924 9e4c901f0093cff04c7c68edff3f15f525db21e5 legacy-trunk
+76925 d890c8ffad02f7c03f22808e598fb1fdbfc57465 legacy-trunk
+76926 c9a5b3a460ff63fd750e264c5968cdb67edf2b06 py3k
+76927 650b326403cd26bf5f2e795308919f0808f66c99 legacy-trunk
+76928 1f8b36320218b84452e443000d87a72298cc58be py3k
+76929 784bdc7b19aaf3a1ccfebe93c2d70775a3c2c603 release26-maint
+76930 7941a9f865c2283c3c3c12e730213091aecc7dc1 legacy-trunk
+76931 6d7464dbb714b14ea7c2e13bc28a57a38dab80d2 py3k
+76932 39149d225ec7a1523ce2a8550290c380e9fe57ee release26-maint
+76933 02054afa362f1b364a8956fd1b56ab1c5766aa08 release31-maint
+76934 04588eff25a190958a357314a873a60bd5ce1489 legacy-trunk
+76935 1c2b3f795d1b23e219b04da4ac82f78b3add8bea legacy-trunk
+76936 1daac2ceedbf25c26ca8d06739c335f689958044 release26-maint
+76937 cb05ccd75996bcc0165e00e84221b2ee9b1d37ed py3k
+76938 58133714189caa85843bfee54e3008487cd517fe release31-maint
+76939 6630e36af9c39b0624cac154dca23a56f9ce32be legacy-trunk
+76940 550053baaffa79d4c45e72787bef5c588a648e18 release26-maint
+76941 4ace08aac37639c3655083f1fe3ffb54bfc87264 legacy-trunk
+76942 d8562002f8e5c1b6bcda61bb93894b3441fb455b release26-maint
+76943 465809416a82f0bf1e908b8e0d0faecf1331eeaa py3k
+76944 4d430e55ad7c58adea49fd3c4fa6f3cac0b0f8ea release31-maint
+76945 6c1b2065d35cb3bcfe1cecd0b12f7a07cc9d19ee legacy-trunk
+76946 bf2eff60eae2baa177d91e7c8afcbd46d5ddddea release26-maint
+76947 99c0ab3cd1f9569807e77a1821173eb1d423156e py3k
+76948 79717b7d379dbffebb67668cb99021899a871110 legacy-trunk
+76949 b1d72d8946217b11318298d554340ead13d20055 release26-maint
+76950 08df1c9ea643b55ccac64104bb84a223bda323be py3k
+76951 d025f49873191a034258a026fa979ee0d7cdb62c release31-maint
+76952 096b1d9978538bb2c8860a437b067ffc78e2b211 legacy-trunk
+76953 1772195405e7ea757e49e0ff56460b3e927e8ef3 release26-maint
+76954 ea5e54bd6274c334869fc51a15ccfde0548f2e2d py3k
+76955 86b5df04634c066e336d1f73e373cb0ebcf0b8d7 release31-maint
+76956 3e2b7965ada997beae402ac0f55de1b423ef9740 legacy-trunk
+76957 0ee2ae75ce8f48b79bbb3f78b9a4493096f4480f release26-maint
+76958 39ab1a36b209866a251d0dec283b8bd1e1969d75 py3k
+76959 09c171fa5935a1e08fd22c12a001daba6d215628 release31-maint
+76963 28de83f17d089e4547da636138e285445b6de6aa legacy-trunk
+76964 a7c4c717a9c7881acb302523e0000593507542f2 release26-maint
+76965 48a99cf818c92def6083c8aab98aab6db1c8cc4f py3k
+76967 7b2eaa34b86b367078f78686e60455ca3d10008a legacy-trunk
+76968 6d09e3fdf840cbd81b889768bddd3f0532c15051 legacy-trunk
+76969 7613def099d0bc0af42b6cdb78806cbc9c7b3d92 release26-maint
+76970 8071959bc306c51e465666c26a2e65c098c02943 py3k
+76971 50f3046d4fa00258ff26d5e4fa232c82a388cc5e py3k
+76972 8c86cd80ae261a0b79b542cc2b66196838791d6d release31-maint
+76973 13e62cf02bc3a1082228c807833d0d58f895b797 legacy-trunk
+76974 09c4f1b9439c9de7e5dd9529a7b8b4cb27d46ab8 release26-maint
+76975 d7610ec95bce28cdf817ac0ca8aff51850169990 py3k
+76976 7559b70f989938d1fb1cc101ec060c44b3a1cca9 release31-maint
+76978 7f5cbc28f4333c9b43a368ecefe5cb575264a429 legacy-trunk
+76979 e73001afc56f06dcf5a651ed0aab1d98a95fc87b release26-maint
+76980 9751ddcc188283ab82f85a959565aa4696398e77 py3k
+76981 37a0598d332f7538b0d3b469935514f1c01e61ab release31-maint
+76982 2e484190ceb5a19948033ab6ff01f1c677f79c29 legacy-trunk
+76983 1a25b420ec00cc4f96dfcbeab611af62cbfd79c9 py3k
+76984 606a45dbd10ce5e3e5c6c7da2ba2ad84f5a2bd93 legacy-trunk
+76985 35249e9563aaf190d30c55fdaa3b3ece65b44c7e release26-maint
+76986 db197b28e045443b5afc69876e04f3893b364fbe py3k
+76987 20fcebd0cb5dd86fe55bad29062314efcda3a839 release31-maint
+76988 aed3218764909ee3a1f7c74e5fa2e3f108cf5c15 release26-maint
+76989 4d3b9b4caff06b35e5e20f173e86d268c89d8ebf legacy-trunk
+76990 442d2b9d81e098f181738800de7d4c6a5db32394 legacy-trunk
+76991 f31150d847c3fe43b4186a47267212a647d229e3 legacy-trunk
+76992 be788660a939338f61014f16c4221411f1364759 release26-maint
+76993 07a28308cebb069413cbef0b0d266d5cf1ffac2c py3k
+76994 65de0bee0ff2ecbae65a86af724b6aba9bb2237f py3k
+76995 b9927eee2a69fa8225c7b9f27e31fd08a789a476 release31-maint
+76996 30bedbc297635232551abf182680c1b0d4bee67f legacy-trunk
+76997 6c8130152e88a201e5065ccbfef48aa9265aa60b release26-maint
+76998 cf74d9af895a694bf0cfec2e885d2f7e407acc3b legacy-trunk
+76999 1520697920201b0289d81dfbbba1c8482c462b7a py3k
+77000 9dc573b6f8f5fa7f4c7c6c66deece34340ddfd3b release26-maint
+77001 53e321259556e5c0a5ce9b7ecfd8bea6ffc91f4a legacy-trunk
+77002 072c3d0f051e9b8bc056f82840c89f276afd14fd py3k
+77003 df261093b31cf4dddc8106a5fe8c9f09762a2e7b py3k
+77004 bd28745c6fe70d7278862ea7df84bb18cc8f9367 release31-maint
+77007 ba74d58774b70f6a6c8766666127cf179b30558d legacy-trunk
+77008 18a8b2bfc9c2ebc8ab4d4bd0216ae88a6bb62f1d release26-maint
+77009 429a3e38e46bf5d78573f7a3c38ee3e667d074e9 py3k
+77012 93d5cdf1c4573e86a4932df7c4eba29d765bf756 py3k
+77013 3a736ad661fb643c383aaf7ba5418bce03d3d94c release26-maint
+77014 251860db3493f38cb807f97ffafee0a831b2e33a legacy-trunk
+77015 24006ca562d5ab95cfed5857684944c2e7649a8b release26-maint
+77016 4aa0d816ee5ba05d35c32d18287d9e3a85cfc138 py3k
+77017 8021b90b56edbb7f48cae42e346703452734bd3d release31-maint
+77018 1c4e89521847e00382239b2afc93c29888cf9ba1 legacy-trunk
+77019 13e2f8a749c46420a9b0a0e59c95885e0957a493 release26-maint
+77020 886275ffafd6b3c65638f6dbe9c06a674b298527 py3k
+77021 e757fa779601f5053e402b9bab32a58960af17af release31-maint
+77022 df2cfcf9a0738e1ea841752e500a47949db681c6 legacy-trunk
+77023 1f86e0e46969fa422313dc53fc1218d98cf7115c release26-maint
+77024 5594253331787e1204209d4cb54263086ebed7c9 py3k
+77025 d1f1a059154ba9f1230814ba7c17ca3f12944d05 release31-maint
+77026 ca24ea1a2ae2ed872625aac44993b44185d6915e legacy-trunk
+77027 1df73bf38c55b857db80211ba41fa8b4e3712746 release26-maint
+77028 35de57f51599573494cf7a2d8e7275b66a76bfd9 py3k
+77029 71e6a0dfafc84716f467e9e332194c75339e9efd release31-maint
+77030 9da0cf2dffcc9ea58c52019714109cade166d59b legacy-trunk
+77031 aaeb65bab3c051fb5bb8d48e3bee2437c9aac65d legacy-trunk
+77032 94e957cfda383af98f8d18852a16cc0f5c0e20c9 py3k
+77033 46371b28fdd11851ce5015014407a534f862a791 legacy-trunk
+77034 bc5ec50c50f9eab333457401cd53f36e61124087 release26-maint
+77035 3c412447efb2030b466585b63b459c56b932e246 py3k
+77036 e7dcc7485d0bd81c58f8107a04fd7cc4d401a11c release31-maint
+77037 085581884e6f6322eacd14b75cb9006f8536b943 legacy-trunk
+77038 870a46c8a6705db28cd9c8fa6075b828b7adcd14 legacy-trunk
+77039 0ef94da75bfda6d73e882779bc135d855873ca2d py3k
+77040 427c2143e2c9ba1f87c96217751479b7f7ec49bd release26-maint
+77041 842634276d011dcb1f42f0ca3b463bf1af195b2d legacy-trunk
+77042 3b86b23c58fe440bb0d88c27e24336328d389657 release26-maint
+77043 726323fd87ca50c60894e857752abf1e6be120e8 py3k
+77044 3434e6b11a9218ee8eaeec7b5ba4d5215b35c3ca release31-maint
+77045 86387b8b9af8b9d5ff63ab38a398f3effd075309 legacy-trunk
+77046 9424b84a2ec952a30b94302fe8c77a492b46dc22 release26-maint
+77047 f560e1a7744efad62b982b969735c871639c5fb5 py3k
+77048 9628eb7e98dfb78010a6703a0946e01dd01b4c13 release31-maint
+77049 db796567109cb4ecefe2964876b2ff26b8495f7b py3k
+77050 6ca1b9b78c3fd79bb71f71f6908a1ca9da619a5b legacy-trunk
+77051 e5c4c9712661af3e2e805282ddd9f655c900deb1 release26-maint
+77052 49df3cf919f7dbceffd25b8c1898742f38213e8e py3k
+77053 2106112f5b07638ecb4b8f9ea5a0ce4dcb5c2891 release31-maint
+77057 5dc5d6c6f641789836ce59d4f53ce7f360b1e4f3 py3k
+77058 646764994120093d006a62eb50d9a83026b07ac0 legacy-trunk
+77059 15129c80b2fed7c500424c60144d5c7a1f7d0691 release26-maint
+77060 68811dfe706ce94d31e41ea054c169cddee48825 py3k
+77061 e372a8056c9d537d6fd4941af51065420187c2e1 release31-maint
+77062 c4e60988834df0fd437ae3422da0cab4acd6fce0 legacy-trunk
+77063 aaa5ab7b942a8e4453f1310dcadd9c5e57b006bf py3k
+77064 560b8766919d5d15c442a12c99979dfb51a2f82a release26-maint
+77065 229078e47010c8c8a7bcd079c8d04f7e8a03916a release31-maint
+77066 eb0bbaba0361b746fba970edb5899572c9b0f7f1 legacy-trunk
+77067 dd6726c978c66698f4d690538d82962d66e2aecb py3k
+77068 957289029c0534e5de24fca9272caf80fc262488 release26-maint
+77069 85e781f599bc8a94f567b1a36404fcdadfb2711a release31-maint
+77070 8e82fb043ae87859e9dcb5fe00a700dc8511d191 legacy-trunk
+77071 ad7e4141a3eb83f86c6c569040de353b175444d5 legacy-trunk
+77072 73365bb26fd650cc0460cf35d71fd0b6b188efc4 py3k
+77073 1e37180eecaea443f148f4b3790bb614bd5cc3fa release26-maint
+77074 5a9371017edf9a1a5013ff8a01d0a9aef3edea0e release31-maint
+77081 525f67beeb89c7fa20cafc9e87186ee0011267aa legacy-trunk
+77082 30741ef6561738df70cbe27598750de404ece0ba py3k
+77083 57433b833b2a8df341145ed0e329d99c63c51ff1 py3k
+77084 cbe1bbe544c9e46bda1578f360b17315acc94306 legacy-trunk
+77085 a11a8e53c495ce8bc7712355dbdf56d8f5cc467c py3k
+77086 fe0459dc9889f9376e6de1a514133c9052938e30 legacy-trunk
+77087 ffd800ef46ea054e92efb4906cd27f143163e8f6 py3k
+77088 cf39c5e462f94bce5815b2d68b0bab53adf5bae2 legacy-trunk
+77089 c1972eef35795ce2d4a131042173f287a11e3e0d py3k
+77090 c14a014af954ebacf040c69c64a7051c163ebeca release31-maint
+77091 5e84abfdfeabd75a515c468a18c3e216881e1b0c release26-maint
+77092 9b4b43a8c913059550fcf86e5c87b8ebd080d4c2 legacy-trunk
+77096 374191e10a45be6d56823aca17689cdb2fafada3 legacy-trunk
+77102 5c8c4d2f8b7120d1dea8b951c9ca0db9084c3761 legacy-trunk
+77103 f764e4126a231ba0b7cc68b5be48d1057aef7ddf py3k
+77104 3b46f2d3b75d02f356c1afbeca3fb5cafd67a7d2 legacy-trunk
+77105 ec8bb1514d671a63bd7c73cb35debdc9600ef3fa py3k
+77106 15eac765cc35d94d1ca9874604212b50e6d85ead py3k
+77107 0498027712bf42c30d72b9c68ed935bedea52f71 release31-maint
+77108 3aea57dc21a9b1d3b86148af50dcdeb87801dce6 legacy-trunk
+77109 38f593a83cfc8423f480d8d6b9a136d8de9fa771 legacy-trunk
+77110 8ad33992202aea3a6a01782e02131352593e30a2 py3k
+77111 abe5008b93e9a4c732ec5314dadd6586234b4127 legacy-trunk
+77112 61a770f7b951b3f9207e7d66c98e4c900cba9e2f release31-maint
+77113 57456f16942d9900e94536606da82debaddc594b py3k
+77114 70d7473afcfef67b9662da2c1cc54c1ca42e7ff0 release26-maint
+77115 7233bc34fd44e288fbe6e15fdd737f9e52921c7f legacy-trunk
+77116 e484fda462a60b700610dab85980b826e7aeeaa8 legacy-trunk
+77117 bd6b03fb71a064669b0a8d22e06856f8b8c372f0 py3k
+77118 259ed5cb93eacdfc4910ba13a241e32af5766126 release26-maint
+77119 eafa053af0570db07ab7455d59f2ae4da77553de release31-maint
+77120 ebd061838fb17455f985fbc56d330e6e58190f33 legacy-trunk
+77121 5e0a9471601f63493bbfdae984bc4775eb55827f py3k
+77122 8c60a955d02c0a2d24986b7cc528d7dd85cf55df legacy-trunk
+77124 e3f5914d9bb3fea7f89c55c5fd31a6da7058d66e py3k
+77125 23f467151756a7c83e8735f113137af12daf0ea6 release26-maint
+77126 c502ec2434588b8bce80996c5bb1c0273e6991e9 legacy-trunk
+77127 790e8fcf51795f32aa58df9e2f5f91769d6aeb55 legacy-trunk
+77128 6fde11f4d842666f319eb8873ed45c0795ecde1f legacy-trunk
+77129 fb671df0f5cc966a817353ef937cab651ce95b26 py3k
+77130 e53e55252ba84bce0e9bf133e0bbed0611d54dfe legacy-trunk
+77131 92a58b80122067334977a590cf81d30ca31bb046 release26-maint
+77132 19f2359944eb435d1b6e527645962585b1502538 py3k
+77133 244b979d544c12484640186e9a7435079140e005 release26-maint
+77134 d4ac3a8000c75188d029d75139c7b520e7e94b3c release31-maint
+77135 a7f6a53daa12d1b5c656fbe37b9d25ddb5193cf0 release31-maint
+77136 4f0988e8fcb156ddebc449ed411a532095e81761 legacy-trunk
+77139 ac5fd8909998fed9f628f5c5cca29ad6cb03317d legacy-trunk
+77140 3857cd4d5b35973b5b933223b9e26ac2e8c47c56 legacy-trunk
+77141 2aa0d9f01d4753b56509cf5e09b0bd596ec739ad release26-maint
+77142 6248b7fdec0dbb59f9d7a443716473705e5b04da py3k
+77145 ad609d0f51509742a142feeaaaae0ae933ae5332 legacy-trunk
+77146 740dbae2e30cffd01204d83b243c7ceb9fc6db97 py3k
+77147 174a28c9fb4070250f1de114a69019d5af460d93 release31-maint
+77148 5ad5a1d612e5d148c7ef5697e1262b443b0637c2 release26-maint
+77149 9cb275db4d6d584c192eedce2615a1e5f88d50f6 py3k
+77150 00fe689f2b78d55c53620f90a5ce2d8685f32928 release31-maint
+77151 8d9c9340b12e16c8c35550aa35c947b8fe3f234a legacy-trunk
+77152 7361ee2ddfdb7a440eb53ac24a53bf614c83e987 legacy-trunk
+77155 db62977c5713f90a7ce7c809cc07dd8071f53a42 legacy-trunk
+77157 ae19c287e9c0f8556a1ea4a2e7241b413b564955 legacy-trunk
+77159 96a2371b114b9dcacec2b114ca374325bd2da7af release26-maint
+77160 81cf24e5ce928e9c903a9e63ab643ac28059ba7f legacy-trunk
+77161 6c19a6a697a611d4ca6d131b502aae09e60dfe03 py3k
+77162 46f4b7b5b4dde47ea9b5abdeb3a609916a44365b release31-maint
+77163 8dc6dfa41fd565ceac761fef1c0b785b5ebdd5e2 py3k
+77164 2528582d68f6bf696642bb5ce7dbcb659f700f32 release31-maint
+77165 36aed9e3642dc4d33678e7af56e2db41206883c3 release26-maint
+77167 efa597633010efe3c8b36a0415cf89189877a49c py3k
+77168 980c79fbd4c5df45cc2f13fc92b215fbe865389b py3k
+77169 8fee2ab53e716acec9fd976f888a6bbb70aa903e legacy-trunk
+77170 228bba2d1f3f75086f712ade71e30843f47912c1 py3k
+77171 e078579984a4e4fc13829a75e36250b50cf02cfd release31-maint
+77172 b3d37eb9632235463263329f54c1d9ea23e97e2e py3k
+77173 4d6d952fe288118334720e118c43940b45267364 py3k
+77174 d52a7179eecee2ed5c86f59e609d4b2d55653d23 py3k
+77176 443f71dd5cf02abd9514734b537237771e1255e8 py3k
+77177 a92f0a0afe567499d8ac2de2abb0ee0a1fc4d5f0 release31-maint
+77178 384a7a3709dc8f9e0ed8a682fe6d1f272e03ef78 legacy-trunk
+77179 bf97acf8ecb1870c1df8c09ddf9f6c298b0d9564 py3k
+77180 7c630931cc831c7e6b74449be0e5d61ba94b6eda legacy-trunk
+77181 236dcf171b746f223d2ed04e4dd87b9179662535 legacy-trunk
+77182 1e92fe593916dc0ce36330eb045b69d5b025704d release26-maint
+77183 dbaa4eeeaeb8d26fa9d1d067230b5aafd68a0dad py3k
+77184 5afa16914295e5f7d6d485af19eb93084396f2a2 py3k
+77185 25aa43e4302bf5db3c392eeaceb72e32af69398c legacy-trunk
+77186 7d6bff7221950fe8d22d0bc22f6a92ab3301b0d1 legacy-trunk
+77187 856a45c0b6c41c65886b70c72e3124fc9dd0695f legacy-trunk
+77188 5b471847f6ea6ec737e3bcb91df200b50283d607 legacy-trunk
+77189 ab40b936bd1c143178648999780daeaa2ee234db legacy-trunk
+77190 e62be08478bcdab6848ec97a0c1fd5e1b1e62924 py3k
+77191 1666ee8daf9b1249301afecf068ab5dd13cb85c6 release26-maint
+77192 53100db351284f7b50eb76d1d0938b53281d6b4e release31-maint
+77193 84b00e6bd69b21fe3f4b4f220163d8bfd746a1f2 legacy-trunk
+77194 6212edc22cbdf8ce9addb254fe6b73b1f07e8012 release26-maint
+77195 babfc061212c1743f3115afda31771aea1c809e8 release26-maint
+77196 d8e64a84473cdd54a9c131d267c0bb32557c312f py3k
+77197 3e22c7e9f307cb1c93f538dae1985bf6fc26897b release31-maint
+77198 e4553b607b43dfc17cb34c3824461207703894af legacy-trunk
+77199 42cfb727ff485a78fb53921ab08dfc9a46a9aaea release26-maint
+77200 e2261b61df06605b2bd5b492fdd5166ed1241721 py3k
+77201 71bb842b79ab2e30a60ec48bb756a73d6fd749ff py3k
+77202 212a722864a1ae8774f52a926fd911c56a1807ac release31-maint
+77203 0be45b5cf0d63dc324bf7549c5b3ae1246a9807e legacy-trunk
+77204 fce6611241d1092ca1b7d6e3354a6f880225db68 legacy-trunk
+77205 1d0fde59ddea8fa4f1d0b6ff3a2f0146f58fa0b9 release26-maint
+77206 68a754abcfb68b3b031ca69ad4b8b882672ea6ab py3k
+77207 c026b910a5e4865ee2f2a8c95720b644472e9a19 py3k
+77208 fc75a998adbfea74753994379196c2b2f82e4a3c release31-maint
+77209 adb921f04b87757403fab8bb29b32dba52c88ef3 legacy-trunk
+77210 ff2abb94c68ebf52e2a59bfe7443ad3ce31183be tarek_sysconfig
+77211 9a55b1173d2006c4684be1926e1ff42d07843f05 tarek_sysconfig
+77212 f02881332342a1a76f0371b001541a22299ea01b legacy-trunk
+77213 baa70d41c9bdb5bed0d74dc099d6103871df2394 legacy-trunk
+77214 9418f4b010451f7b4d1fd02b5eb00fb7f9342c70 legacy-trunk
+77215 c35075f2a8f30e5afdc3beef9effd60aa71eadc9 legacy-trunk
+77216 b0dd6c21dcbf4483b1b05eb5ab04a9a54dc03b21 py3k
+77217 4ffb933892568787af135186966e4dbe3e8d2767 release31-maint
+77218 2de24bb33cc57c50cfa64c0542097a53aee2d71e legacy-trunk
+77219 1394a403dc89e5b42ab442f6276161c9daeec183 release26-maint
+77220 78ca69cfc8978b73999f3c144564a892a1684709 py3k
+77221 f09eb92ed0ab2af551a67b1efb212f1ef1233218 release31-maint
+77222 ac528a8a36cf5c5342c83c7694e6f3b448448dc3 legacy-trunk
+77223 747b01a053006876c3989aa02585bb17f81c302a release26-maint
+77224 a728fa481ad438874ae63e1a6d7caeacb59cbd75 py3k
+77226 b5c1cfdc68b929f449a5e5ea66cb0fc86963e8b3 legacy-trunk
+77227 6c8c040c1443b752a2c6483c52cf0932c6281341 legacy-trunk
+77228 18bd1c67f5e2d4bf8116155e655e87b7a887c023 py3k
+77229 b8e38d0a52d7e12788b092dbb3594841f8c92f56 legacy-trunk
+77230 6d17025c84c14e4a8f31eb43ccad7e1fc3506c07 legacy-trunk
+77231 fc87a2fc47a595eabb56f5d119d58008246fb022 release26-maint
+77232 bd24e1e90f7cc266ff8b339e952cf69209b85ee8 py3k
+77233 adc9cdc02df1009c887346e27dae4415494ae159 release31-maint
+77234 27c946ff76a3a92c9909ba8c394f5b243c68d2e2 legacy-trunk
+77235 58a5bb971e952b7a5e692481577b9acf26db5436 release26-maint
+77236 c2fb07742445cf88ffead1f42494a6066a121e9d py3k
+77237 46d60e5ff103e95c451a14454ee0937bc5a02f43 py3k
+77238 390d674ed4c73247863899c30cf728721d04c1c0 release31-maint
+77241 ddf61cd775e019d4bf3ca973814d2b5f1c5c3a0f legacy-trunk
+77242 6263a6fbf7d9343f85cf254e0ce3e204c9ef35c1 legacy-trunk
+77243 2d5ab4d08c8850b4fa7fbd31a908c160d137af83 py3k
+77244 a32661b334f67683839a3ef37df694834a82ad8a release26-maint
+77245 313265d4e032812efc7803ebb5b376a681a37a59 release31-maint
+77246 a1035cb4a925fc82179e46d417eabe9f90ecc542 py3k
+77247 f5e496a8417f315c4a3be418f6557a7e8c1642aa legacy-trunk
+77248 a6ace30cb91224a95a28185eeffea1323d7df428 py3k
+77249 4acd8faea2d933b497703914c2aabb5d08f08550 legacy-trunk
+77250 cc97a96e4a09082675675f208b46db01bc347d80 py3k
+77251 9261184179792a8801e54b5fc21284f8a4d7bebe legacy-trunk
+77252 ff5bc2fa38d66eec9eddb8021fdcc047887cdf5d legacy-trunk
+77253 be27ea2b3679f04a74c6c0e6b6f7bd46a436c442 py3k
+77254 eb95fd95e65edebb98ab80a0669509bdbe20257e legacy-trunk
+77255 57b996c3d8ffb38dc9b2f79087839ccd051f9cdd py3k
+77256 e9812b816ffdb1795c30fe5b2ea81a854366e99e legacy-trunk
+77257 91a57cc0020e4aac6ff93d32d2162f9a2b082398 legacy-trunk
+77258 2a23995345917ca726d2f16291b1c790bcd3434b py3k
+77259 3856c764e1f52c204ed813572e1bfb7830556ddd py3k
+77260 fe117e5d13a1fcaee6a0b7ea8aa647b9a59fa37f legacy-trunk
+77261 abbdc31ea7907b054d01c67f06a5316d034e8e67 py3k
+77262 fd91744b1caab49d0fb7b4b038d88ee996342854 legacy-trunk
+77263 72e3e85bac8b0dc029c5c5456a6bc246a4bac66b legacy-trunk
+77264 a19ad299095f27db02a5aff488d3dd68a7538a1f legacy-trunk
+77265 b0386fe650c75960fd3969c0836e36a9e518f40a py3k
+77266 8c4a707c0bd8eec699a0e024cbf6d0cda34cf91c legacy-trunk
+77267 c3adcfac07722862b622a1ed93814522a92e5d37 legacy-trunk
+77268 a0fce9665f44ad9f13bcff3f81563d1b169963ed release26-maint
+77269 2402f291e8019baeb9ba908a96db515641c45322 py3k
+77270 e54434d2e2a7d37e24b244579575cb5df3c8fb03 release31-maint
+77271 f6e340014f96969df6fdf597393eb5577858e485 legacy-trunk
+77272 eb924fad92720620d94862a6cbce575944e5e4f8 release26-maint
+77273 03bfe32ef849ca863d68403810df6d66459c9962 py3k
+77274 351fc4250c1b0c7a6599d825ead7ff65a2de497d release31-maint
+77275 0f8a58792563c3354ba1eb38da995653fce9a068 legacy-trunk
+77276 9b9adc42c73a2aebb148ce4fcc4af6f97cb8fd9b py3k
+77277 9c1f306fb0dfa5848b53037dab3f4440d5d956d7 release26-maint
+77278 744e391e42fdf1600e5d507f4554dc119865af3b release31-maint
+77279 51749b6d62d3eb2a400f8c335b667de9f6f2eb96 legacy-trunk
+77280 90f1e92db6f22558e3ec4c3291a21f9cc657cf2d release26-maint
+77281 b55850070a5518e3712a1fca79b685b7bffb2391 py3k
+77282 234beaafd0c6dd2a04f32618d63aabd4137d28a0 release31-maint
+77283 06c968eb4b403c28553250d2412c1d6c4270ffde py3k
+77284 7bce726ec440b16dc1e98e0952ef947e4848c311 legacy-trunk
+77285 3911524afc2d6f1fe8226f4fff02365cd35a6147 py3k
+77286 c72652145b235d7372c88cce30a73a1378b9bc19 legacy-trunk
+77287 ecc8a45894c941fa2af1c6b624a806953fa8f39c py3k
+77288 c857b56699b572d6ab68bd8d5b4260c7d588a54e legacy-trunk
+77289 c5802ab9e34e7154f4cd50b6754bd0a7bf1fcabf py3k
+77290 fc833edba7699fbbccead8fb8455f5534f4cd5ee legacy-trunk
+77291 2cbdab249858970d8423b8b79247f1c5962b311e py3k
+77292 4bc26a80e737ea3d3d556be93664498ff5b6566c legacy-trunk
+77293 f7e09ba0cb55a3f3b96229cbb312cb2fe155cbf5 legacy-trunk
+77294 6049fe4022ffa467c0f054681a7f631ab35cce03 py3k
+77295 d399f6dc9ee4839f3ed3734fd860036f13127edb py3k
+77296 0ff2daa83d0d7d53eb39d7eed2cb7b465edebb97 py3k
+77297 efbac7d3a3685044fb5c2d873999629e2755951f py3k
+77298 0fcef9d3959401b184adc2a912a21b6f96818cb5 legacy-trunk
+77299 59c4714187185f091d808157083667f713c0ecd5 py3k
+77300 2f67625886f6003557eb7f9a8d48196e47967bff py3k
+77301 d57291f5e66811c1b199540612ccff9329866788 release31-maint
+77302 8ca377853321e3ed6a7141cbbf5773d2ef7adbed legacy-trunk
+77303 4fb8eaf14f09cb19f7f79453245faedcf899a596 release26-maint
+77304 e1f1313ce6da18f72f9040e5e6966f2858f41909 py3k
+77305 70f6fa3084e67dd8828867c0664210cbe1474452 release31-maint
+77306 aff5de5cc4410fd8d12efaba67915a26196ba472 legacy-trunk
+77307 0fe25e07b77b3ccad1b379bdbf8d53edd6c13536 release26-maint
+77308 31752ca007cf2f3e40b53c2f07cffc0211b01b00 py3k
+77309 fa2b27fa5419e81f9fc54dd8d40edce9d5f1c22b release31-maint
+77310 442e170b56c3f7f49fdaef30a119adc956a34072 legacy-trunk
+77311 e622b2cfef12d6ff193865da4b9bd3fbd4ecbe02 legacy-trunk
+77312 776647e3fb07dd24c4b8cf9bd393d2913fe443f6 py3k
+77313 b05743ce5e9432ff5675930a3aefc7bb9c26f97c legacy-trunk
+77314 4aab02954de1d9dcdd421410266e27f853a54d77 py3k
+77315 22e0fc20e91133d873ce85d8ead26ff382c23b21 release31-maint
+77316 2cdba5167df1a1558845486552b5db37b81b3bc8 py3k
+77317 a2d6d345470e94a380685ab057ce2ade15908b78 legacy-trunk
+77319 3eceef378065a55a97d6b2d22d5c675cb80a3b10 release26-maint
+77322 f9d2c3426e148c5115a33286ffa3a016a5df733c py3k-cdecimal
+77323 d6ba37e3277637067dd82a58cd571fa41dd52585 py3k-cdecimal
+77324 882c9e711a2d0593f4cbd5fd3c0965084116cef4 legacy-trunk
+77325 86bf440bf9bf357acdcb430763d1dce7ef7bd370 release26-maint
+77326 613b98d0d88be02f7d547e20823de38452ae8014 py3k
+77327 07a749f066a1171f35b364e822fd28c93e44f113 release31-maint
+77328 a1901711b225b4039bca8ef1597ae2bdea87a93c py3k-cdecimal
+77329 307066f02ac52a4233d7b798be5251e017bfa59c py3k-cdecimal
+77331 f560a817bfcb512520462859663708ebac46f43d legacy-trunk
+77332 8e82dd5522f039c78f86c0161dff3393f9f8686b legacy-trunk
+77333 a8fbf294d22e5c5fd984f5d1cc6823a6c4bd6096 legacy-trunk
+77334 99e7c1b8b1e1ee198397b23e4cc01162237166e3 release26-maint
+77335 b3bb8b3e5e4eba5e68aa229cf9e35d23ea76ac42 release31-maint
+77336 0fa9ee4eab88743f58020e392668294d4ce3a80c release26-maint
+77337 6ad53f67056a8420747bc1a9a2f9d2d1c9c45975 legacy-trunk
+77338 25c1e57ca1b3e1897d8fc3a2fb786c7fcba94bc9 legacy-trunk
+77339 6144cd4d421ba326dcaaa84fa6cb25c14c5acf29 legacy-trunk
+77340 c618137f3fd3b7d495b19d99f14211c2b7de8d95 release26-maint
+77341 7b12545736564bc99707563829ac05bf8a089cf1 py3k
+77342 87161069eef23fcee27a5ae3c4f67180de1714c7 py3k-cdecimal
+77344 315b58cb13a637c9df510a67a4b9cf7a9632daa3 py3k-cdecimal
+77345 d88e3f598aa412cf3c3d7b778350db8a72dd09f6 py3k-cdecimal
+77346 de73b858de11d2139cc4f64fddca486ad216fbb4 py3k-cdecimal
+77347 fe5ec98de9da1e7309df5407b71202d5b1f9806d py3k-cdecimal
+77348 b82694107151c28a5e1cc406d8170e084885bcc5 py3k-cdecimal
+77349 2245884c86e61571bd27db7083c0f58c9862099d py3k-cdecimal
+77350 e13d07243c73a0c82c08adb01d4d86f965a59984 py3k-cdecimal
+77351 740a787dc59a0b23f4ccd6f6fcb61ec6c9f71bd3 py3k-cdecimal
+77352 15904d5b98db47600a5b8993defa97d01af24152 legacy-trunk
+77353 22a3292cf6722c7d0edf44eafd5ab834f2e36610 legacy-trunk
+77354 e0b7e81acf6f3325c97196892b9469708b658299 legacy-trunk
+77355 8903ea6a9e64791567455a4faaaf4eab30c91e2f py3k
+77356 d39420a27e64608c6077695f142b1d6a2da05da9 release31-maint
+77357 afe6dde80abb39d61864baa074f5085cd204c7a3 release26-maint
+77358 518acb12f357eba00ddac1e89a61cf84cefef795 py3k-cdecimal
+77359 a64cfef1da07537f36714fe31d0dfb421115a8e4 legacy-trunk
+77360 f21f2c93329eb087888d58efebf4c9d62b9cbfa7 legacy-trunk
+77362 10b6678f5c04b3b605b548febbf68aa667dcfa41 legacy-trunk
+77363 35fe2069ab1d9ea84fda8c7d52053bf6d7936afa py3k
+77364 59e1b0306c0e86b4cdf4c78594eba20a5b598734 release26-maint
+77365 84caac71d79bd3e9ee7e74e5ccbb8a3c8d512db2 py3k
+77366 b0ed35c99dc6d9a03f2d1b2393c02e171e0e2617 release31-maint
+77367 7a67515bf8e308b684f08bef807556c39771353e release26-maint
+77368 7caf54ce529e7d21b3cc4f4eb012fd49bff336cf legacy-trunk
+77369 0dd1aa33265f38c2466dc75f9b2071a2fdfb7d56 legacy-trunk
+77370 9e8d7750e470b8e0297a8096c77e511faee491c8 legacy-trunk
+77371 bb7270300047f44386518ec3a5c163b6eb03dde0 legacy-trunk
+77372 0c7ead034a03a92ed5d5d779b268f532d4ff9ee2 release26-maint
+77373 da3fd7a779acd27807dfb494c5ecf2f828a468ef py3k
+77374 f3fe579e8f147af1593b29604313a0faa2118b7c legacy-trunk
+77375 f5cebf11d5e0895182807f8d8097b8ecd52939e0 py3k
+77376 ac4931ab0369e63dde0bffed2e15ed7301c47792 release26-maint
+77377 61502710fce9f36934e971017c5ca0353e190b9f legacy-trunk
+77378 1bda1f6b85d4ae0ac979d4b0709e53dcfec622dc release26-maint
+77379 d8468208e8824609e4d4880d636a1aca64158224 release26-maint
+77380 a1fb575531b1034b8865225e883b11278785458a py3k
+77381 b77495c77ae407a2e144e629c39f554dd413586b release31-maint
+77382 aee5a1f32b00bf601f5c62be6ca64e7b7c5b4d88 legacy-trunk
+77383 441bfcd55f2d9b7a34b9db77d55e33694eb75d01 py3k
+77384 adc85ebc7271cc22e24e816782bb2b8d7fa3a6b3 legacy-trunk
+77385 b386e53df90692c6a26a9e3b570c42cefa9ef131 legacy-trunk
+77386 e57cfc526656f66d3fc3ea0ba7c92276c4df9bc5 legacy-trunk
+77387 5ab2bc2f6db815ee5144f88884df9f405d5a1ab2 py3k
+77388 af1ed19717ef39c932270b2fbd48340d04256b45 py3k
+77389 89a9dd8c628d4c0541c19881b05d2364284e6a33 py3k
+77390 aadfc31b3f141f389fee4c5eface35ef0a7490f2 release31-maint
+77391 4675f11fb125d69e90bbf8b41485663762fb35b8 legacy-trunk
+77392 b407e8beca4a47e40ba4aa6fa4201bd2dfd6dcd9 release26-maint
+77393 f2d54096dc8c283939081c6aa80dde6fb4f8d83b py3k
+77394 f9c0c411f80ccd16628be40d179cc9e965552856 py3k
+77395 ab88daa4d2ce2c1f3dd64fd0c4097ecef01ca736 py3k
+77396 a7ab1abdeb920a54c73998c776d81d9ef2e626da py3k
+77397 c1bec2db1fcd735e702afcd3f55fbf0b0ef79e1c release31-maint
+77398 7e2af4e57039fbb671b4b6f971420bbc13c4fb44 py3k
+77399 67f7a0e9e2332439c7032ac4f9f475d68ee62cf3 py3k
+77400 c2fdf25329ff30cf8d68c0c0e7cf479d7b203745 legacy-trunk
+77401 2cff3bce4096728378b01a7738924d96d3fea560 legacy-trunk
+77402 1f177818f1d0a734fc61422c3bf2289a24866513 legacy-trunk
+77403 7550b4b905c707cfdbf47fb65d53086a7d04892a legacy-trunk
+77404 3fa6707df98cc04c92462f92962354147cd5f84f release26-maint
+77405 78c3eb5c05fb2863355b98015395fb66941bf06b py3k
+77406 e7fa3959935541a9cb1c52e2bbfaeb3191f4fbbb release31-maint
+77407 3398a8b7433d0626e760f9fea8a1ab77c07ac403 py3k
+77408 405c9b639e055178397f4a2c664cdb5777db3ed1 py3k
+77409 fbf4987e514a27283f192cf756549d60c47ad973 release31-maint
+77410 3e1712221fa6867f5dbe313130d8eb4c09114eee legacy-trunk
+77411 a66667704ab0e6e81fc69c94b024b2ca88e10b2a legacy-trunk
+77412 97a404179e59d48e80d12b911f96367abdcf972a legacy-trunk
+77413 2542557a12bd70cd27cebf2642ed8002b52d5a36 release26-maint
+77414 71f2491d8f2f4a57a830516bfcc4aae82771e18f py3k
+77415 68fa953b5e76b141fd7575ff2fa3e5d5bbe2f0ed release31-maint
+77416 cc32d57e06b041761babc59c920aee33679659b9 release26-maint
+77417 f00109e16eab908300fe8fe903f20c9d438fd3c6 py3k
+77418 dd31b1c033b2b0aab0270ea9cf4e91d865f79cc5 release31-maint
+77420 dce74a8730f57cebc073e445abde223ec0b7ccb7 legacy-trunk
+77421 33e402909cf29ba0ef3d183159397bea16d3f90a legacy-trunk
+77422 edfed0e32cedf3b84c6e999052486a750a3f5bee legacy-trunk
+77423 8a5ac9ff5057f0e66f65685c4ee536275db951c3 legacy-trunk
+77424 2f936b7831b67cfe7cfd704885c3cd5f3b539295 legacy-trunk
+77425 8a320694e53b5fc795665e63260c2c107ccfff28 release26-maint
+77426 05fb71f0253d8da22a53db4bf90706f72f027b16 legacy-trunk
+77427 8f5cd3eb7c734cf66efc5e6f80e0e468670d7e93 py3k
+77428 d9805a96351c0601aadf0338e0026950b42eed19 legacy-trunk
+77429 b4ce0c8b0bcffe89e4e228373ccc366194afce4b py3k
+77430 9c852a31e87ce01f6fc02a9e0ca5e867fe3cc2c5 release31-maint
+77431 3eec2e9d6493f55a0d2f922ad367e22916d86161 legacy-trunk
+77432 235c82643474c897300d348580ae3f249990fac5 release26-maint
+77433 32eab443a96b1351d0f4b19b527a62ad60e2572d py3k
+77434 3eb29ac7b20a64c91cc74527e039bdae5acf894f release31-maint
+77436 f2358d33f109dddd5df833992ae230ec1f25261b release26-maint
+77437 efa5867d8a14d19cb93d7f354169c37cfc1e8de4 py3k
+77438 e30fcb956b5fcf22b1db60cdffcc71670e92e2ae legacy-trunk
+77439 41cea66a2426a5460e151e210759ed0674cae30c release26-maint
+77440 9f90db2760d9b81eba17c2238b8663f27cdb6d91 py3k
+77441 d08d86ead375a22dbb83020116b0d0d04fcacdb6 py3k
+77442 8fd12ea63c6ac6e2d5d6397401a8ce3a77845d78 legacy-trunk
+77443 2f54f7e9c2b19b62b59544c4414e7ba9ff2986fc release26-maint
+77444 7ce2258dee8a589c64628c66a02152716550fdcc py3k
+77445 7d7b5765b46f7c4e1221260d0df499416d354b8a legacy-trunk
+77446 1cca8d8f9ee50e6bc666bf6a40073dee5beff61f release26-maint
+77447 c5dbefbc93212cb75e2e89aa48015f31f6a41be1 py3k
+77448 23f21f482294855eab9abd7c6f0ae11533acad77 legacy-trunk
+77449 b7649733a3545e41ac81bfd7402d5346d6d258a8 py3k
+77450 2a9f66df4dc4679363f5d3359a3595fab807ef14 legacy-trunk
+77451 b4f301cea1156a4cbf9e8c6068e1121b37b54928 legacy-trunk
+77452 c32d3b08fcdc1559876b6bbb300433676650839c py3k
+77453 be32f611183b903f46537d65412da914e9cd54bf release31-maint
+77454 f5fd01ba47be0b7e8822945442d16bdc2672855c release26-maint
+77455 b80d2962978c8cf19d2e5bd6c59feb0f3edab5ba legacy-trunk
+77456 2a9cfe2ce59b40bc999763c0f5fbe0e95fa4ae21 release26-maint
+77457 662dffc1b34d3f60d5f6160797dee0543c18488e py3k
+77458 7b5f5af4f5acb2defca8ee371076b85f3feb0500 release31-maint
+77459 a6bf68e6e824c790186a28645b574a43f00c48bf py3k
+77460 3c0a433b26e1fca1f485d6069a4a74064c8506de release31-maint
+77461 66f1d4a4c7994f93b2b412b57797bd508799caa1 legacy-trunk
+77462 5ca1948a8fd693222e475d0be9dbb45964ee9f3e py3k
+77463 d51358645e6063759931618014f036ff3cd1fce6 legacy-trunk
+77464 8537c3736e99677ec5b2475ff2195e2ad2e4244d py3k
+77465 d1fd0a34bb368290005fe65634e5c897bf2cb66e py3k
+77466 bad1ae3fd06073a29fd2c4fcec7895ee82dfa636 legacy-trunk
+77467 31250c34833a4422faa7a0792f94ba2c371826a2 legacy-trunk
+77468 15b0668f0dc597fe64d1a2e4a90274199900c5a1 py3k
+77469 622f79bba5231a83c6e8c0bf890084b3d21bbf81 legacy-trunk
+77470 9225ea677c4b271379001c497c0179271506d3be legacy-trunk
+77471 e5e55ffe9f738b08d3e8196b22f4cfeab25ba1f9 py3k
+77472 b21efc0cfe8bbe55209782807483a52878194b07 legacy-trunk
+77473 8e27d3b8d2ec45968f0ad6c07b6ca3457da2d17c legacy-trunk
+77474 ab905f74bf117a1a68d07e85b6200b7baa105417 py3k
+77475 c5b6a5b83ab5dc6727073f1a2086780be44cbe96 legacy-trunk
+77476 9fc7f297d132b9a5a12931e1ab7511f2c1e469fc py3k
+77477 57102283ab5ecf55339d0f8a9268dfcb6805cdf7 legacy-trunk
+77478 c5a0a5d6acb07ba9c238604b238acac8f35e40f0 legacy-trunk
+77479 4f4f001c81f559e34faecd01957c9cb88b2dbd02 py3k
+77480 478abc7bcaaadca3363336f38f2bf680748b59d4 release31-maint
+77481 0f974bb238edaa3f1c2d1ebffc4de405a4bdfcad legacy-trunk
+77482 c7f33d5216f9c40c22a0197cdd88995d08752286 legacy-trunk
+77483 b39a0219f727e93b4d691c17283de25fbd4c4a7e legacy-trunk
+77484 10306780e5c0cf5ddf7345cfcb72c316cb8fe488 legacy-trunk
+77485 201b461a12bdfb1c82dc7001044d0df50a265082 py3k
+77486 e8f8461d6d1df51f168f9abad4d228c7d39943e8 legacy-trunk
+77487 c430e664e605bfe0d62e2404dd271fbaaa0e1ce7 legacy-trunk
+77488 03fa61a37e2d52d001be907266b6a8a38269ddee release26-maint
+77490 af1809813de96d6431f1aa9e49ea7fc45ff2355c legacy-trunk
+77491 76fb7dbd73884232e30ae1ca009a16c4b8625be9 legacy-trunk
+77492 92384d7f425a598edff292821a94e51b6a64f5db legacy-trunk
+77493 1682b962e8dee1c8f59eb951dad28de67d7ee41e legacy-trunk
+77494 ce11c1270b6906f9428a65f93c315a7fe08c74bc py3k
+77495 d758eb2c828e86a6218ecb1fc14efc6a91e8bde0 release26-maint
+77496 9bab3d7ab4f51b73e9646651d511054f307a6513 release31-maint
+77497 b3f50d6cb6406ba2bc3296422da48613205f99ca legacy-trunk
+77498 d140f4901a423806e9fabee76fcd0877cb5be1a7 py3k
+77499 9e73be5fa80f86cc5c02996a200210b15a3ccae3 legacy-trunk
+77500 35469e79ff8046fe2a13c82f61991d6cfe804df6 release26-maint
+77501 eb84f7217c65d9278e4cf0c6601fcb8589080e6a py3k
+77502 80413c182a28b6800e73971225b12a57a430cf31 release31-maint
+77503 657f16582943739b906f66f7efad4014492c8b1c release25-maint
+77504 c76d41e744c2319030089536cbbf5e55ba3b1663 release25-maint
+77505 d3bea1669f2d893f28d7517cc4dd2d4575437a10 legacy-trunk
+77506 eef2ebc081dee006f6e371bc98025c077452e3de legacy-trunk
+77507 be0bf0bbd94affec54164f065ce42c3e6ee28e31 release26-maint
+77508 b3048a52e3c85ac83235b7b9d515f1542eb2220a py3k
+77509 3aaef2edfdb355de58bdd2e11e84821fbcb2bbe2 release31-maint
+77510 1f84ddafb6a392c4b00113556fe07d692a772180 legacy-trunk
+77511 78610b48c396c164f35a735f04d567d13fb95f28 legacy-trunk
+77512 ef0d04de4a43f9e0c840d5021c6c6edcbf236abb release26-maint
+77513 082d0eaf8ddadc9c7958d8ef09a775bb32756072 legacy-trunk
+77514 76076659b2249e04417fb8e942ae392fe762a174 release26-maint
+77515 f47d199ee6697f0f60463bbb0bd7ffd2673251a4 legacy-trunk
+77516 2006fd816d225202c046bbfa6284abdafb53b603 py3k
+77517 9006245b19aff9cffc0001a60f9f9a0e2a9dbe4e legacy-trunk
+77518 4288c40c844075b3cde17d84ea70dfbcbc3c3392 release26-maint
+77519 5673dc3b6432e4c90c985b51e4cab384bb0551a5 legacy-trunk
+77520 eafabad5e601eed5551207e97af1ab0fab6053ef py3k
+77521 189a5abb2323e1cf35f98b9154bb268b104bb17a py3k
+77522 32d6a94cd0fa39fe588cbc7ce19e9c99952fda50 release31-maint
+77523 a16b24b25ac31a7bf895ba7bb84bcc96a995577d py3k
+77524 0fab3c2dd314cfaf831b6ec10b9f889f7c841f13 release31-maint
+77525 269c09921bb2fa47baed41f10afd47957ed7e929 legacy-trunk
+77526 0895040adeff5262b4a0e1bb54924f3375805d28 release26-maint
+77527 f22183e6885c994c7c6992bdef9e5769d05f3951 release26-maint
+77528 11ad42a786a213964fa36b9d5125e234d1647456 legacy-trunk
+77529 d1493cd913006d53ad0664e9ff8ebc28ea0e07da py3k
+77530 8e179a0fcb5eb8b54419b0e64bdd5aae3c00fc33 legacy-trunk
+77532 ca00acc9c304eb7a9ffa485f6189e0a878b10c18 release26-maint
+77533 5c32f3b65d216fb34dd794a3b01570c4fa53d48c legacy-trunk
+77534 174bdab024eb835003951417db2015d1f565f358 release31-maint
+77535 6351d3d53ded3780ddbf3eb46ae91e023cb3690f py3k
+77537 d81e48846b4ebf8a2f8f215b2642db5671629420 release31-maint
+77538 29a1410cd7dc82c51007ba5928b1dbf50784392b release26-maint
+77539 1ea7fbd9929454389553cc31418fc017aa6e68f6 py3k
+77542 b5ee47821f4bd87ccc1bd973c7fc8bf2db26f685 py3k
+77543 ed8b0ee1c5311cefadd12b6e357fcce203d41277 py3k
+77544 a6cc4212cd57e30d35a1dee059eb82bda99d1d7a legacy-trunk
+77546 a4a3e688446e4ee251b8ea2fa699963d0f0865d2 release31-maint
+77547 e353f5d79f4cc934f2f6817718efd203d1a04b29 release26-maint
+77548 81b3145061d98cec4c2fff24f84298c1d3758522 legacy-trunk
+77549 fb73aa245014ab965ee169d165c3ee35d8bd4919 py3k
+77550 5366d575e2cd1d24baaf3d9df3bbea8d88a81399 legacy-trunk
+77551 60e069c58a35dc22ce8eb2a53bf946331d3d1990 py3k
+77552 7aecfa4432df3a8deae9651872c03c8aef10a95e release31-maint
+77555 707d8ca5ea0b023b0b3e51eca4993ddfad9499c1 release26-maint
+77557 93fa10bef1e22ff959bf708da798d7d4c613e4e3 release31-maint
+77559 92a62dffa4049cc78401142da13b198cbfa7f6c5 release26-maint
+77561 35f7e23097d830a6dced7a40af2a88a483e1e1f9 legacy-trunk
+77566 930464f32204653afcb44079d0b0b87949fcad93 legacy-trunk
+77567 23f12cbf122c13147a0489f879ec1814ac79b816 release26-maint
+77568 1ae3379c0208f6ec8f4ca24e95f8c3dfdf8139f8 py3k
+77569 a30680bcb7589cbefd6acbaabe26552058ba3052 release31-maint
+77570 4547a9bff7c77e77370dbccbb1a860b6610816fd legacy-trunk
+77571 66e57eb5995108182764ac4d456c934a68050e71 py3k
+77572 a9fb203708c411976049b4610a879c7109824b66 release31-maint
+77573 1ceffb3c8cb2e55c9c84128a0ccabf889c76f029 legacy-trunk
+77574 3bd6df11d1d6c26a24ddae174075d0f0c0d2a7f9 release26-maint
+77575 df020079e2889d40ae22c85584f1849eb30a9dc9 legacy-trunk
+77576 8f7971b820a435b105e1e471f01af0d64fc57f1b py3k
+77577 fb337cb46b9de85ffd52a6bb0dd7ba549912032f release31-maint
+77578 7322c5691294d4dc25765d8aebbc3018f2666f27 legacy-trunk
+77579 b9888c1339df520baecc9b8c8a41bff06620b969 py3k
+77580 6ec14bc6ab0c9b565d498116400379109f78337a release31-maint
+77581 800559c9d504bfea1b496fa4145d4e0ef5a4aa3e legacy-trunk
+77582 d60b7b2c4a1f5174d89fbca86e6ce01b491bd3a5 release26-maint
+77583 a117cb926d207e09ae293111f0c59ea1516723a7 py3k
+77584 8e9677007a1e8c3c34c17ab852a8f7b869e77d8d release31-maint
+77585 0c8cbdbafaadda7ae7ee19bb5ecc54d9b1d4e291 legacy-trunk
+77586 c247526d5a5b0342cdb83bcbbbbc5b8e87920d6b release31-maint
+77587 a485fcdfe85960389ca955a7e56677ca6cc7dfa5 legacy-trunk
+77588 3b49ef6b09ffa0a958a281d362f275ff1e9e5eff legacy-trunk
+77589 5c9c53a721a554bfb025f14b0dd65223cabf4fb2 legacy-trunk
+77590 3e629471850afe8399f7a74a82e5361e9f3a93e2 py3k
+77591 6036d7869bd1f84116dde135cc22344eccee95ab release31-maint
+77592 bb10f3ffae0281d369ac2b748207b296a364682e release26-maint
+77593 3aadce39d3452d9b96ea39f3fd4d5daf8ebc92ea legacy-trunk
+77595 feacaa6e40b84b704818fe612f8e4e88c1b1dfbc legacy-trunk
+77596 a9d518fada599565ecc81d5ffee55e1155af089d release26-maint
+77597 121deed5968ee68e41e8d4f29ee1813e6bb06ba5 py3k
+77598 d59f76d6b79577dc1a3dc1c28f0f8100eba451e1 release31-maint
+77599 ec192643adcba29a6ebdae4dc37b31877b45bd8e legacy-trunk
+77600 86a35e59b6b19585e4c4a2a07f0555f5f0d7b6ed legacy-trunk
+77601 9e59be1d0c3710bb1eaf234a88186856ec43bb21 legacy-trunk
+77602 2def1dfdf1f6398bd0d95f12351711d392f59cd1 py3k
+77603 16cdc15e5d75bb1b306841b8b9ec270c20f804fb legacy-trunk
+77604 f6a626f34840fa0c3f5ebad8b8602880b6bdc770 py3k
+77607 df4d2158fa04861d5f1f43115dccbe84694aa010 legacy-trunk
+77608 75bfa5da1beb52527d74be0c91ce030262667759 legacy-trunk
+77609 f80e6bd4fd4e6a7cc4a615ec163a9a702076a331 legacy-trunk
+77614 bac821dffea804f1ef916f30ddc5f56ddc6e27c0 legacy-trunk
+77615 5dbbc43c591b92d725b7d910161f567038183ad9 legacy-trunk
+77616 886320f1ba82a05a2d7db01f2d9016f07090fb7b legacy-trunk
+77622 73fecd4e7fec34e9388320404161ec6b7d844f69 py3k-cdecimal
+77623 265eb250e4a58175882eba25eb9275224176f63a py3k-cdecimal
+77624 9c563a4f3f9a244b4acfa1a89c6a25895f2e83c4 py3k-cdecimal
+77625 464a23676540982af009e0f81c127ec7d40a06a0 py3k-cdecimal
+77626 87525bd49a9d61543d05b1fbe940a3e0c8abc97f py3k-cdecimal
+77627 d66c6ebbc61740f0db56ebadb30e008c2d43a0e4 py3k-cdecimal
+77628 80b078d0557736619a91ebf53a37bd5e9ad46239 py3k-cdecimal
+77629 d828cc91c09b5080711d2dc5430a426a4df21d1b py3k-cdecimal
+77630 13bb9a97e1c5024b584b0b1431114052f7a637ee py3k-cdecimal
+77631 51712c42c5fb1f76bc1a28978abac3669dae8d33 py3k-cdecimal
+77632 cec140f72d03fbefd2a43add05d534a391df034b py3k-cdecimal
+77633 c1dce9596e771b9b42197fdbb2597aeb40ac9128 py3k-cdecimal
+77634 04dea0060257bfa27e2d1bd2473006b804c78a4c py3k-cdecimal
+77635 40a3be78bc99bd097a9b159336afdbd37c262fbf py3k-cdecimal
+77636 73e3ee463c948770d8e16e39740f4a314aab3ca9 py3k-cdecimal
+77637 002f7ab35e17d06ee59de2847d38c0ddb55172a1 py3k-cdecimal
+77638 3df9b40ff4fce96b81ad221425ce383aa4ed1e83 py3k-cdecimal
+77639 f646aaa91b0e7cd284c868f6957d81c503a9bd65 py3k-cdecimal
+77640 ff3563bbbb8039baeb563578b33f2003efd14c11 py3k-cdecimal
+77641 9cf20bd1516b9c95fde34f3bbd0ac639e191b805 py3k-cdecimal
+77642 eef76c812bcbdcaf89d32343805286d243984d0b py3k-cdecimal
+77643 c14c945312737bcbfc6f7578fbb4c5989785b8fe py3k-cdecimal
+77644 b471e07a2375c6a2872cbce31893561efb117dd1 py3k-cdecimal
+77645 b4af2145678b8e92ce266103f18fbe561a18b894 py3k-cdecimal
+77646 694aff16777f804fbc0af7cd91b81d413f918436 py3k-cdecimal
+77647 7d1996727d084d87b62c1fedb8cf028a76db6798 py3k-cdecimal
+77648 dbc00fe377719d44adf36b02a16ccf6415ba8cde py3k-cdecimal
+77649 1cabdf28938ee4ef0df91c0d1141c713fc8787be py3k-cdecimal
+77650 0bd2b0720832985c8c14481018041cbd930b4e4d py3k-cdecimal
+77651 931ec558927164b075d4811b3865613af36c0bf4 py3k-cdecimal
+77652 0bac3db4d5e28c78ac3c636ed18eae7269e1807e py3k-cdecimal
+77653 63263ccdb081aa2abe6e4007d624dea56d18173f py3k-cdecimal
+77654 6d896e424a3da436e839509f86c620d0bd3afe1d py3k-cdecimal
+77655 b2214ee279879481fc6c3b84cc75829745cb7746 py3k-cdecimal
+77656 0813e89d0193f67993f8657f5bf22d185ec19904 py3k-cdecimal
+77657 4ad03f71d1e13cd530dec9f4e88cde147f0c56e7 py3k-cdecimal
+77658 577c099ada881701977837de590ac6f3ce0f12a4 py3k-cdecimal
+77659 f0408637be77f29979e8771b7c0233801fb41413 py3k-cdecimal
+77660 b198b0e21d62cc68d6eaca8c355e98076fe0f6d0 py3k-cdecimal
+77661 d42a85463f9cf428e24dd45f133080f3d77882e7 py3k-cdecimal
+77662 5eec3b11e41e1937da0908443d9f276003003de3 py3k-cdecimal
+77663 e03b9bdcd405e8d94bc1a37ee09967b52e5b3584 legacy-trunk
+77664 ae6fb05b4c19de6337f87c9486185d232bada660 py3k-cdecimal
+77665 782a40ff3f0dc22cb6654d83ce1b9ad910f47582 release25-maint
+77666 f34f8ae7646e70639ae429a5172c5a6aff9decea release25-maint
+77667 4f95b4352179c82d8397e539e4be0dbad2f833c5 legacy-trunk
+77668 059e1fd7865cfe7b5ea179ef27e94c10fe59ebcc py3k-cdecimal
+77669 fee7a88b06d1fec959d73db3ed8dcfa15b2181f2 release26-maint
+77670 f38c1196d9ff17e4f38d2d15a40fa6bc8174dcd6 py3k
+77671 f1acd01725e018651d0ba82ed75c15eb805ebe01 release31-maint
+77672 fbe6ecb91c4be595984c17464b6948a54e3bb622 legacy-trunk
+77673 22cdec7f44c52f2bc6a8b2b33c322d5da320b944 release26-maint
+77674 caa64dc44d16efc2a8be6113a6c30f641c3103d7 py3k
+77675 f568383acc9f80290d0bc3e0d743b107312fc6d9 legacy-trunk
+77676 a996d66faed0ca2dddb6b6e64076b7457b5ec4f6 release26-maint
+77677 5c236704daf15a9083a5d6db384e0440cb622d9d py3k
+77678 b636cc72d2de73b3f19f19f71ea37899d4050b58 release31-maint
+77679 f8539b497d4aa132a6515a23d08f318a6fcd2670 legacy-trunk
+77680 9e124e6402bc721d7ac0c8acfe450b6b9b9f42db legacy-trunk
+77681 ed4027e666006e73868205aa592915008e271227 release26-maint
+77682 1f715a377ed09d25e5adc7396787afb53cd70e56 py3k
+77683 4cfdc8b7fb3af26f758d58940092bac75785107b release31-maint
+77684 f6fcec28af9e459646de31e5a3ac1e52bce76e06 release26-maint
+77685 fe4884b041b93d82751b8533c32258e0f6aedf5d py3k-cdecimal
+77686 d0d0579dd1d13cf327fdd40fbc07fa2e1fea0f9a py3k-cdecimal
+77687 4e699d7c32ecf8ba024c93bf5d06fe6e4774747a py3k-cdecimal
+77688 2cf41d8f787aa10995908a509ccdde9ef8531417 py3k-cdecimal
+77689 adc98bf153ec04bab7dd0eaca963f8738ff0c8b7 py3k-cdecimal
+77690 01ce7a858dadb23a523848db9303feea5b98d77e py3k-cdecimal
+77691 6b761817b71741aa2f045681e47847b74bf8c576 legacy-trunk
+77692 31cde6e63c03d8b39cc6386da5a8b453a42884c6 py3k-cdecimal
+77693 607e2525c0507d53291761b9a0936959dd2cff2d py3k-cdecimal
+77694 0ec60353656e0413386ef8f105fc7a37d6ca6e0e py3k-cdecimal
+77695 cec2f281118237f51709e9ae333da47b27878eac py3k-cdecimal
+77696 d0e4bd76c6927436e6862b314bc1e58a0528cb80 py3k-cdecimal
+77697 d3b83fdbc81a44187ae7690d2b5a753f59167e88 legacy-trunk
+77698 7a9f36cc6df11aed274cc99ee1037feee3f41b5d legacy-trunk
+77699 a678fe1c9c8be936141d2190185cc7007eb3a2f4 release26-maint
+77700 68006663a85232b96eaf5b9a91af5b3425524e55 py3k
+77701 787c680f1fe88cf856847a5fb55402423c5c376f release31-maint
+77702 f669cf100ebbed3fec85373bb69fcaa4e755cc8c legacy-trunk
+77703 9705ef3fdb227817e5e805ec692a687e9acd9900 legacy-trunk
+77704 fa69e891edf4e7cdfdbd3d3876596555c583635d legacy-trunk
+77705 ac6e960a014d82ae2d69fba0f7c1d49099010313 release26-maint
+77706 2dd64c24854c910d12764c8b6ee0a987613186da legacy-trunk
+77707 bb1c33efff93293fea19c40d1a45a3c61b515fec release26-maint
+77708 301ed69eddc4eaccc1ab821603f7aa8857e48719 py3k
+77709 90223e3458eb339df0236e445642c03caccf92d4 release31-maint
+77710 1ea6cebbd818f7d5712f2e1c35f59b03e593322b py3k-cdecimal
+77711 f0f221e1a7c030f7f7dd95bc79e83e79bd04ed7c py3k
+77712 bad5e03e2445e3e546627601b29a625662149d73 legacy-trunk
+77713 d77c947ff7db5aeef2143ca9aec3596ab65a4087 legacy-trunk
+77714 b40a5a568e76e44b0d665119abb5352cdb30ada2 legacy-trunk
+77715 17891566a478c42494a04d808d64a45148acaf87 legacy-trunk
+77716 5ab3012f90b74c805460d083d0e13017d35a9942 py3k
+77717 807d83f57bc8839d575a4f2f5f15e0c9c13a9b32 legacy-trunk
+77718 5db82a57ddd066be6e45cfb627dbd06e5a75f658 release26-maint
+77719 3947fdca2f40dffc1e03a89d3b84899042cde741 release26-maint
+77720 ffc4a44bfdb98f3f9d70e321fe6ae0d37b9ad529 py3k
+77721 87656e83dc19683216b456c4f5b5d819815fe69b release26-maint
+77722 be12d3621519553e209472e440a262cbc3c709af py3k
+77723 8c3d2a71ed015eec11e88f2d4a1a212abfa1e5cd release31-maint
+77724 2d7239cad7132be5bdb3db2bc68aa758dc5137db release26-maint
+77725 1dc91e9dd5c13a4bc2d3bb7d4b5896ab264f2325 release25-maint
+77726 232533f71abd6f6da99cde312f29f4b80346cdac release25-maint
+77727 6ffcdafa0118994485a174ce41283141b834121b legacy-trunk
+77728 71acd4482e655b7d1a13764371b7e590ea4477c2 py3k
+77729 dab34b60a72e1aa23440d6cc2d423041ba030fd5 legacy-trunk
+77730 e98ee945e26273047983b3660ae0b92271186fd1 release26-maint
+77731 c10ace5b76ce954d0c425beb1a6dc2b2bf26e357 py3k
+77732 ffb94920eff3ab97b2e0eb46487c2255c6ddfce1 release31-maint
+77733 68d1c81fff2ea438263acb1a4422f8c85fd0fc63 legacy-trunk
+77734 eab6cde2a31c845af95a3826ca585f57d08e1485 release26-maint
+77735 5c1d7a3ba29c16eec7875421a0dddb2e7e6b3019 legacy-trunk
+77736 a256791aa19d0f8fe1ae3d4f27eb81a5191c0257 release26-maint
+77737 0cce60b68e465c09144b40d4791e2fa929c959d2 py3k
+77738 6a0570ee2366ed6de651d85117f5dc7170b31a79 release31-maint
+77739 67ff040742703211981fc6e3791e2a1b6bec0b61 legacy-trunk
+77740 fbfe5e42349f6a3e02d69bed8fff95c96f7408f4 legacy-trunk
+77741 2418a0a9a9a925c7db99412fab5cce23ae7cd910 legacy-trunk
+77743 5e8930f370d5457e304999db78913e0ca56ce7b2 legacy-trunk
+77744 ff66324f52a12422d3dfb9b8c49b6b912139e501 release26-maint
+77745 08357d98782b9d3e9aae6d7709262c5b53e22651 py3k
+77746 235933d4da8ede093c3dc7d1884f8a1253325769 release31-maint
+77747 6985c0e85b4bc8acd55266371e2efbc26cf56e09 release26-maint
+77748 78c0ac07aa9eb276e6592cfce55c851d6a6137a6 release31-maint
+77749 8dd49a86adaa54831fa99f165ba5961a0ac62ba4 legacy-trunk
+77750 77238950c6dd405f726b1237efb75e3b941fd5a2 py3k
+77751 1f165c4403064b41ee67e9ab7f3656d73ec87c27 release26-maint
+77752 6208836fedf99a5462846b8358876babf9b93607 legacy-trunk
+77753 3e0fed25c0ae59c7d0706d34c0f7adf02b320260 release26-maint
+77755 22aea131b6afc1919cd77501f5aec7696bae784a legacy-trunk
+77756 2bde6d4a10ededfa5f6e0f7da71f663599e3aa1d legacy-trunk
+77757 741187bfc6102ee512470cbddec4dc195a483bc9 release26-maint
+77759 58266f1a2e7f3e3616e113b076d99276e6f702c7 legacy-trunk
+77760 b25b78ce798dc87ecc7cc018ec9208fcd65db70e release26-maint
+77761 f9fd1795fcf74e13d9092b6a79c0344f6880961f legacy-trunk
+77762 10ad7d8e5d1715a545ce19db35f6198f28910dcf release26-maint
+77763 bc2b88beae45da8d97ed585cfe1e63946a7199d5 legacy-trunk
+77764 907ff13bd4e2e145636306dc06412f26c4800350 release26-maint
+77765 7379cf70fd603af5f8ecc77950d1272c4c4ba47d py3k
+77766 8232b10e34e1388bdaea328ca3c17d44af2492b7 release31-maint
+77767 92e6e8d904a29edec30b09b89d4c95b2c0242cf9 legacy-trunk
+77768 3c0cd7a7db8ee30171cc4bd04f773329c3d958fc release26-maint
+77769 80562051bb70ab57106521189d583c1ef2dd8acb py3k
+77770 d815dd2fb5bf91862734da555d4b551664a715f6 release31-maint
+77771 2746c217dd9e0a84cda57c931e4d3a152ca5fc12 legacy-trunk
+77772 fde9719e2056f43aea56362b1c014227b010dd14 release26-maint
+77773 df3359918517d2162a3b96bd73766187ccccb746 py3k
+77774 0ddf8d9690e5ae7d1d24bdedca86a0f9a6c30ecf release31-maint
+77775 6726aeb867b90020cadbcb908f498418f2605c5c legacy-trunk
+77776 498311fd8822ce79acde498400555a72aae7f3ad release26-maint
+77777 34e2d5162ce93c212321f87bba5c8503c9583b5c py3k
+77778 afd20d3d85dc88f46cbcb47cb242f4a314a1a109 release31-maint
+77779 75d24b2452a59b356f4cdf4dc00326f8e8bae1dc py3k
+77780 120546346f9397946048914cd3abf2513ee21289 release31-maint
+77781 748e282e091ce43f6a2754f7db8dd3098dd1263d py3k
+77782 1dd8232d4ecb981c4546d8ad6cb12550db681807 py3k
+77783 d4e22fd528e2a2e265179a141d67935f6adbdefc release31-maint
+77784 f6f9ee83ecbf3c475fa4579132a80e1c5405f39b legacy-trunk
+77785 dc7147d1b7d94dbf2993a0c8ac2e1a164f5d3f5c release26-maint
+77786 96d5c70314405293518698519f900297738d7d24 py3k
+77787 e20e02fc1447fc732ee577d1a5b3fd52b68aae58 release31-maint
+77788 ad7a61574bd689e6068373eed95187a85c8167e5 legacy-trunk
+77789 9575ce0db2047c1c566aa6e989d96126a2be9b15 legacy-trunk
+77790 a8a4bc69bea12250dff52ffda0d99c16b2bfcbfe release26-maint
+77791 e660cb52bf0060dcc71b0a59f7a880f3ea101eb8 py3k
+77792 2bfeef629936280441b2be633945fede15991b9c py3k
+77793 20070880ea48334b1fce14790602d47993e09596 release31-maint
+77794 debe61673a8b105bebb218b0751b78fcd7bd68c4 legacy-trunk
+77795 7a36ca04742da9b28c64c1f23fe59449a2bf59fb py3k
+77796 f989f4f30245227d9a19415ff50801776e99aa48 legacy-trunk
+77797 4f8b2a173c8dc5c3a4eddd060d454e3a6e78f5b0 py3k
+77798 1a0081b85c04895dae27e2ff79397afe514d22ad legacy-trunk
+77799 011d967c1a04966b0def2d3b7f490058a1c9ab87 release26-maint
+77800 f41d353eb660266dff5ac6ce7745781cb5ff0c90 py3k
+77801 6a4792cbf4c9f369a5e4ac8be5fde87af9c1ef4e release31-maint
+77802 0bd616dfc97785a3116d87a7f58c01548a6f9ecc release26-maint
+77803 7fb7644a0bc68a7589855f59a375ab5c9f5e02a0 py3k
+77804 3f36c9e6a5af7f2445650a97873e527803c33865 release31-maint
+77805 1abc2191beaf494c93a6baff3254d9d1bd13cf22 release24-maint
+77806 a5e68ab7895bd81c67fd0014df75212e7f2355dc legacy-trunk
+77807 6710a43f193f0f8480d831c9de5fe7c684a62b1e release26-maint
+77808 4cf5ae70cb119eb2b4abec2edd28c090027ae455 py3k
+77809 f606474a210d1ce8ac3c91e4b8fdf58fabc9eb60 legacy-trunk
+77810 245f362821136c790f60dac73bcb6c2f9c93c236 py3k
+77811 658eb5ae46158126026ddca9dbae6f1a4508bab5 legacy-trunk
+77812 82ad78711edb529d3ea5b38cbc461648d4accfba legacy-trunk
+77813 321870b5d030ad065c5d20ce19b8dad465f8c514 py3k
+77814 f2f59d7b461460ca05e60b40188abe0c50ca2af7 release26-maint
+77815 54725e2e8add0e9141e6d63190bc46c4f04c0af7 legacy-trunk
+77818 5aa90248a99f8faec79ce19d893549467c8426aa py3k
+77819 38b90fe346237e9a93c0bedd7b46112116766d32 py3k
+77820 0d4b0589fbc723325800e6cc44587327dfe4c4e5 release31-maint
+77821 c57998e3be33af92d1a1b8d2ada3ca94d47e2437 legacy-trunk
+77822 3ce860b9e73237a42f9d852f191dcfeae711d2db release26-maint
+77823 2b08de9a1fa01200f909ce40f3b320c52bafc6cd py3k
+77824 6de64896c6f88181e239317fc4bb234aad592bd8 release31-maint
+77825 2dab47606ab63cda82ef9d3f221acf015e1cc64c py3k
+77826 3b65068087c62f5082f23614efa786d60ed6ff88 release26-maint
+77827 20f0da31fa2cd79b3d0189320eb76a5fbb502e34 release31-maint
+77828 879101a0b57970251e9fd35179dd3c176852e821 legacy-trunk
+77830 275cd9fe04f1bf96d51e887a430ee9ec01735890 release26-maint
+77831 dde20ae67f9f33ab090b9f45b22cb7b78de85386 py3k
+77832 8ef2523c3a5c5721023c28a2c7eaacb281af6201 release31-maint
+77833 a2c917378411e23ea9910bb8dfb6fe436ef69850 release31-maint
+77834 60853c1ac562d259890ddf47258b55fd4dc1bf81 legacy-trunk
+77835 ebf4f226aeef9debfe6bd5488b3ad8f2a2171779 py3k
+77836 d014623ecf720c2df4508ec1ac25c75ee0b81463 legacy-trunk
+77837 f20f8fc6cfae3441d019e8bbf4613b0914721074 release26-maint
+77838 d6fb378d765af915e3fb0f217fe9dbd210b3a920 py3k
+77839 109ec06bbcf1b80511f447178a7ba94af452896f release31-maint
+77840 e0ad1f3c91af22ccae9dd3602a89dddb518ac38d py3k
+77841 bfc13ce62fab0db42d2e598cc87c0f90225a8fa8 legacy-trunk
+77842 6295e16303a7183d6c53ed1bbe637fac7802ef0e legacy-trunk
+77843 5893ef9a9b84bf88b0a1df89496cd31876de40c3 py3k
+77844 efc2030ce6b16d88ec38a1231f0a1b744f887c77 release26-maint
+77845 7450e03a501dbb9bf7c1c28da8a9a72fdf0372e2 release31-maint
+77846 86b8f4cb923ac338d848bee07521ceab536d46c6 legacy-trunk
+77847 c0c76d48cd2b8ec1982fc942f9849090d27f1fec release26-maint
+77848 5c47cd1736c162a0d5ab1c31d20531881af1127b py3k
+77849 d34d3b8f9dee4e17ab39defe5548bee670ddfc8d release31-maint
+77850 39332c0af8565ea94bb3990ccf5c654ae20245c3 legacy-trunk
+77851 824e5ecf90225b59f362d6791d9ec42ae28c5e11 legacy-trunk
+77852 934d4958a4151afe598636a0acb9207a87157dac py3k
+77853 d79aa5b66971c9f1c290ade1430f5015ea39bc8e release26-maint
+77854 019f52ae0fe8ccb9fbcbd4d3a49c8935e085c87f release31-maint
+77857 2bf7357d122c26c13198edb988e1a4f522f534e1 py3k
+77858 d21b05ff920afaf023da652ecfa9d4cd6be01e1b legacy-trunk
+77859 5a7d7eeb88c11325a5dd53c481e77287993ae879 py3k
+77860 090fc39ce5ec35dd5a42f361b07feee60718478a release31-maint
+77861 976ec45d9090af84d90d482faa54175a4eac08af py3k
+77862 6908ba445d2b35c390d817f23e76948cd451c5ec py3k
+77863 f56207b936cc359485b4a8de6aea51c4400d6432 release31-maint
+77864 e956570bc3b9f04d9f9545ba7cd37896fe7cc018 release26-maint
+77865 fc5ec7e041773cfb52f2380b9a4b1595bc27d7da release26-maint
+77866 fe086abb4aebe9e60908a55cf520ea0da72f40c2 legacy-trunk
+77867 68c56c4b8631cbd9c877273449a5f6ee2d61e917 legacy-trunk
+77871 f0bc6d8aa21e0253c2d2ddecf01eb08ac7941fca legacy-trunk
+77872 7098a46f0b75e5aacfaf81d65d72e3613b023532 release25-maint
+77873 38c9cccbbe5a4acd4005157aca1f6ce859421f0e release25-maint
+77874 a204774d9c70bddc2cfb807575ad5c46bb8aa874 release25-maint
+77875 2ddbe62a6820fa5d7b7236558248c46b08e47040 legacy-trunk
+77876 6e6b59413a13899b75dfb1b0c9a97b28ec7620d7 release26-maint
+77877 566d5c957c19759723537a379987011a1f698d47 py3k
+77878 ce0d4dc488d2905dca191fd3ec740d536c217daf release31-maint
+77879 f62842c25bd833fd6617286d0f3cb4ade196fc42 legacy-trunk
+77880 6b33ea94889661811e09f6282f98fcc4cffa3712 release26-maint
+77881 fd5801b8388d15722a047fced48eb7e070e5e91a py3k
+77882 981a39f35914d40c2b64e4c230cc56b72cac1c57 release31-maint
+77883 69bffa3c782e325894ef55fcea68f55ea8058c08 py3k
+77884 1e47bd6bbed54f844ddd2ac2cf9f0c12eea2f539 py3k
+77885 a73b92d1e9fd582e75aa06b5f384f889afc185c5 legacy-trunk
+77886 0508ead18d6f5a092e9d950c72c146705509eef3 legacy-trunk
+77887 56a220827209cbb33d20d44513798bc2983ca0c5 legacy-trunk
+77888 159da9a42fef1c6ab02b92fbcc0635be0254344c py3k
+77889 bcbb9048f480373af9c8b7b34c1e3fde981e6ca4 legacy-trunk
+77890 77130f2fe944e4acd10f035b6794a42d12b1ea91 legacy-trunk
+77891 ef5639c7196435ce0be7e4e311fd153c5bd5b33e release26-maint
+77892 24665a9d881ade25697a74c4d198da7edf478744 legacy-trunk
+77893 75bb2f1691c0ea98b176e632fb90114b3bfa3c4f release26-maint
+77894 38e307fb839856ac970efbc2c70cffa67b84d617 py3k
+77895 311db7a68a82936d134add7477682daf7dd31c72 py3k
+77896 c7e32b4e3874bbbce048388d5ef39adfcb122475 py3k
+77897 d887db501a2211aa34d71e1bf70a1ff3ea93a351 release31-maint
+77898 fd24dedba59ea5f0e013cd09c5e10a470b966d05 legacy-trunk
+77899 b2dbf11e2ac4cef045d03eac44e9ab30569495d8 release26-maint
+77900 8604e9a257cc8fca850ddb62db66635963abc9e2 py3k
+77901 c7dcbd65c213523e3436d56d987df08785ac4c3a release31-maint
+77902 c97957f5cdf9245a2e94884a7fe3630f09e6f20a legacy-trunk
+77910 af498ab2afb4a5d16ad586a8a8c295d3697cf026 legacy-trunk
+77911 652e0b74885ac7781820b075ddbfe28b4d2ac450 legacy-trunk
+77912 d051779c5bbd6dad8f44e9cfe930e8df52ec54ab legacy-trunk
+77913 5badebdb438cef755bc0d444b56a5d3269bf867e legacy-trunk
+77914 4cbff0139f5b8089f8a0a8cd721e53a8d78cf19b legacy-trunk
+77915 525b6c5d5b12ccfa66ef41fde6520ecb3ed825a7 release26-maint
+77916 c37f99b54d7cf453e92f63979ceea44b0a8aca19 legacy-trunk
+77917 c7703b649516b730360bab4c1643d73d5a33c93c release26-maint
+77918 cd00a94186c934977a53afc43a216f93a2867480 py3k
+77919 f3f08ee83c558638add4ac235392485b72120776 legacy-trunk
+77920 df2b9a6d28aef85b9a2e56264a83806a360aa062 release31-maint
+77921 992cae246a0c7fa7dadb31c96969f395fb16de83 legacy-trunk
+77922 7cb14b522f81cbc6b0e997931cf0d7df9605ae4d legacy-trunk
+77923 6fd2b8147f2a37e5aacaa4058df6446560abd124 py3k
+77924 00d7838eaf3ad36e799ef633343a2c21d119da4f release31-maint
+77925 d3127f6de16c087d91ffddacf1e4fb7a71aef3e3 py3k
+77926 7cd182bee630c335032d9c49612805cbd2dad56f py3k
+77927 08cf4b3531c94648e0ed8169f08b36b7b7530012 release31-maint
+77928 380942892dc0e0eba39ef43e93fd259de32a13a7 py3k
+77929 b7fece15ba5fb9874854dff38d7c050a38950916 release31-maint
+77930 b888db7645aa8cff27ee6787013c37090b74b65a legacy-trunk
+77931 eb987c9df378fc46b9873aa3395ced309cd55494 release26-maint
+77932 a87fce03a34dd2044978aaa06d914c70267320d8 py3k
+77933 967bfd3697366973113e0702b0bec658921d2ed3 release31-maint
+77934 9b351cb9ef9833954ed40fd971d7d917796d5f1a py3k
+77935 ef8178477567f7c04a9cb27cf7c6ab04e7b46213 py3k
+77936 ccc6e5d5a3b38790d5277f74a53c4b92cfeff6a7 legacy-trunk
+77937 993f703a61bae08e910ca7a7b86a520188d08d44 py3k
+77938 2b1d665e66284686c05299e02a70ee10279ac984 release31-maint
+77939 dabb77348501aa16d26a6c0b0996ac80419ace6c py3k
+77940 54d025b2f45a9f3e17e036c48666ec0dd3e4de63 py3k
+77941 72ecfffe9f02566ac76b9e0ca466e15afaac9410 py3k
+77942 ff040880d1be98492adebf758af97af97a2d0fa7 legacy-trunk
+77943 4587b062b8d065cb7906dd43d50d881985ddb7a4 legacy-trunk
+77944 ce4b84c02e5a7556c84ff9c6e8f8b5f1a341de5d legacy-trunk
+77945 32344c5cf932ea326882acc11cfbdcde5c1630c1 release26-maint
+77946 7442db547645e20e34a0cacee32f74938dc371c4 py3k
+77947 0d7e5edc452680871923cef7855b691318122970 release31-maint
+77948 8d805c6c2db37be679c5fc12ccb43f277206477f py3k
+77949 39c8b47824c509154689bc639a5da3dbfe5b843a legacy-trunk
+77950 1c7feac0d6d6388bc6b6da2e1ecb7554e901ccf3 py3k
+77951 8a2eb7761230970adaacd1093c2d8a983721cd1b release31-maint
+77952 4ae8b9ca40ffe7aca7209f6ab402d20f4e72b136 legacy-trunk
+77954 d75f887da772f81ecd462ca6d672762f10f1d10f release26-maint
+77955 a64a0134e66ce089c5e14225094d77a0a553d835 release26-maint
+77956 a7a770bce93d25f140ce61e28365dfbebfc9d97e legacy-trunk
+77957 30e4246ee8032850914d312ea2007b07bc3f2285 legacy-trunk
+77958 fba1c78f104e9c39793799d685b4ffbed21a856b py3k
+77959 3c188ed8e521ee37c414e135f0ecfd2d6902c2da legacy-trunk
+77960 703a04e29ce63423e16da1af46fe25fee02bf0e8 legacy-trunk
+77961 c7254e8bc1dbd1fd4178152ac5ae81517fb0bc7c release26-maint
+77962 0c2b0898643e296d1efff623cb56764352deed1a py3k
+77963 514b56efd89a2439d848df2a23df4c2a2a619570 release31-maint
+77965 eeb8a99ca0c5a2f8f193e4770daf36c3e1ceb592 py3k
+77966 2f829396a54e37bedca924bdd001a0eb55bc21b9 release31-maint
+77967 f441422f6f5574c95cc609f3e6d83e5bdcdd8ad6 legacy-trunk
+77968 3c0203499ae535c5e557dcf1c140446059821c94 legacy-trunk
+77969 bb6f83b9ba49e02f20cc9e05bfecb3ddd4163d17 legacy-trunk
+77970 54e975582c654a884656e9e603c21e8a074bbc3d legacy-trunk
+77971 451ed32cfc50624233b8953e8c1e905321e658e3 release26-maint
+77972 37f6264d1aa339891b36d68164b661bb5a343b3c py3k
+77973 4aab14af5e2df7205e0b83ce1850621187814c44 legacy-trunk
+77974 32e0f1aa34bcf73120cea5c41b4d67f65e2273ac release31-maint
+77975 7813c40942e994a94a3bb6560ce5b0ee751ca336 release26-maint
+77976 ee08fb835bf12aa853009a7b78b554bfafd5e71b py3k
+77977 15150cd8fd365349fc4a4a8555757c8fbb726d2d release31-maint
+77979 304ce8fcc32a1f83082fbdf45d65877aee3e6945 legacy-trunk
+77980 de5fa925dfea61513287b069933eba6f527d3684 legacy-trunk
+77981 81f2ecd3b13e8fdf2c817379d07106bf870fe70c py3k
+77982 c1a7c949c1100d8fadde505cdb466ff9edf3950d py3k
+77983 76cf60e2d005796f6002b5807d4b8109c94e9233 legacy-trunk
+77984 cfa87d466c044803e2091b786bf411fa7a6a963d py3k
+77985 b5ad2190dce8c0f6ede9bfff0bc8a6976946b5fa legacy-trunk
+77986 e1bdebd136859eeda1ab938a0ea0aa6cfd07448a legacy-trunk
+77987 426cc5f2ad2420a0bb49631014d1dfe28360a50e py3k
+77988 55505842e9739ea0e3eeb82698f0117ac5f27322 release31-maint
+77989 7c933683010dcb29a8e3f78211b2473ebd7a247b legacy-trunk
+77990 eb550e839460978f0067efd7cb16e24476fcfe02 release26-maint
+77991 513c4a2600a8be07636d8c945c51accb485a9832 py3k
+77992 5e51835f859512ed2c248bc11372f2f10311989f legacy-trunk
+77993 1cf16ce415eae06e4616990a6f6b043ae4cd2897 release26-maint
+77994 b11b8030268ddc3a0ec04709e4da32c3ba6fde11 py3k
+77995 979c3b62508397ac9875e4837ac36478e2217c03 py3k
+77996 11b7c810816bef489287dbf2538c1270efbc7b5e release31-maint
+77997 32a360b13fa3206aeb444fb798923575ce4fd7fa legacy-trunk
+77998 cd31a9d67eb139f53061c4860f0b5fda1221c798 py3k
+77999 27416ce62ac6b1140bfc152f09989a87d9d8d856 legacy-trunk
+78000 c03c93ac8151c33217e1ffe01c5bee4bab0ced1e py3k
+78001 2a70c72b87c7f12f9d09eab8321783bd92661422 legacy-trunk
+78002 edea48b120e339beb5dba2f4aeb9519ff67b2cdd py3k
+78003 3dd921a190b8e1c60f5cb6661bf68914e7d342bc legacy-trunk
+78004 42ac8cb13ed0df803ef37cb3fc7248503a10c7b5 py3k
+78005 a13e8d1d3798c501833fe6a6615bb4e73b6b8299 legacy-trunk
+78006 ff0fcd5154d331667d5a8563d4f95e98772d366a py3k
+78007 e9dbbcd4ad40aa7f868c3f6b115b7625fe78acd6 legacy-trunk
+78008 94d1480bc563041c22d15d5488106bc5a178f212 py3k
+78009 78e7992f28579fa5d325c8ceb77f925c80eb91a4 legacy-trunk
+78010 0d8f20e46c1fa194746a2a33370c4e7ff4548a2a legacy-trunk
+78011 78c88b0778431a70a2c2b69cdc1b3512fa665ecb py3k
+78012 8e59f9f788f5b04e605651eeb71adde152516ffe release26-maint
+78013 fab3806749596f311af9457261f953e2d3659a83 release26-maint
+78014 2b8f458bbcf58e8d71af6fb4ccad4b465ce1217b legacy-trunk
+78015 13f695ab9111cc69df1013112e2baa3d4b200248 release26-maint
+78016 0eb422624db5efa3bf82a883bd58c77403086c8f py3k
+78017 9cee087915aa1db2d8437a368f893f0547286e1c release31-maint
+78018 50bd9cd2ed48143b7b89d44387367264d92c5600 legacy-trunk
+78019 71e089265b2853ccbb3f524099b37be87403639c legacy-trunk
+78020 4180557b7a9bb9dd5341a18af199f843f199e46e legacy-trunk
+78021 fe832c5d3066b16327d3d2d2536853ee5d15da5b legacy-trunk
+78022 5e9ab4c25b914a8b66890809680f89eecf3ee768 legacy-trunk
+78023 82ce3a08571c9527afb589930d087e2a44bab196 py3k
+78024 4002f1c46b869ce37d30dc69ee8c50c98b9f627a legacy-trunk
+78025 63b3a65aff52a8e2eff89d23ea7f93350b6aac3f py3k
+78026 ad683cedfbb3a9c2926a6f26d40d4ff3aa5a2390 release26-maint
+78027 222b6d80e76924001f2f38dfa0370ff98a7c1f9c release26-maint
+78028 dd2230a8c41da117e156aac0958cbd41ca8d8dd8 legacy-trunk
+78029 cacf207fbded43c4b406c420b21a1b9b19455c0c legacy-trunk
+78030 e9cb3fd341e982e5332527bd91998473577d7cfa legacy-trunk
+78031 87d8b95f5675606150ce2e6fec35959a206a1c4e legacy-trunk
+78032 d7d48a30adf3034b8b86786235100366cf07c630 legacy-trunk
+78033 609fa18b24bfcc6ab84b9ee13b50492e4d2ba16d legacy-trunk
+78034 81b2306e6bf31be3df41fdddc05b7ed62b51ea68 py3k
+78035 f2c91bf5b7b9661e660f289233e84cb3c8cbbe69 legacy-trunk
+78036 6ca9d96f140e90429514bace0a9495701b0771fd legacy-trunk
+78037 cc367c0772458d3edc081695052523fe2898d11b legacy-trunk
+78038 ef8f1c2cb51f90b5ba6ad697d667d0d1c54e480a legacy-trunk
+78039 e4ae79d53e237a35e957d2e55d59cbf5def78f83 legacy-trunk
+78040 873875657ad0f3f22be28491416060d026354bb6 legacy-trunk
+78041 2ba7677bfa95148bc46e6d8a44ccfc60b4ad9ad7 legacy-trunk
+78042 734657b4b3e5cf805a6faa4c49bff3bb4129c892 legacy-trunk
+78043 03baf6df32d268e319d0bc1c98ab9c7f4edac434 legacy-trunk
+78044 55144cae02bab1d5137873f897a5e88ebe22f339 release26-maint
+78045 0b42e1aa4a8bbb30f5081484ff92d0bd945409db py3k
+78046 22358700a4d0bbb4770654fb5143ce55bb9e3797 legacy-trunk
+78047 a2ab26c5f08b5a48b7376ea280e7f2aa8a8d12e7 release31-maint
+78048 21a471c344e3a059fadbc9ddf0e1db06c0274446 legacy-trunk
+78049 b7a5df140869e7ad66a64ae72fd832951dce1a21 legacy-trunk
+78050 c58ed2554f5c8736bd0121a1dbe08e514b6036bd legacy-trunk
+78051 ede0f05dc6c0816f3574422dc2d3d88eed48ea0e legacy-trunk
+78052 a66eb8a63d5b6a859cebdee40a06803527b89f1d legacy-trunk
+78053 10101cf89d204a8e7f74387af17c647c03a01690 legacy-trunk
+78054 7c24fefc2cd4b1c35be375d4490b5a5dd6ba0139 legacy-trunk
+78055 6b82a23235012a74a37f08f84b66241e983f840e legacy-trunk
+78056 f4c51ae167c552d5360ce41e8984f45c460e3f02 legacy-trunk
+78057 8214d4fc3234365b76d6d3c6cb578d8383a397c0 release26-maint
+78058 fdec30aeb93f3af37bcecadba421b837e1e08c20 py3k
+78059 52bb4032863e16217da26a32d9777cf975b9038a legacy-trunk
+78060 937eb0fe1f9c1c33e3262a82da20d3402c594ef8 release31-maint
+78061 3d375301115db3c01b11b4651f2ead8aca36fe2b legacy-trunk
+78062 6a6fc0c091cdefc65e97737dd95fc192ed1b5257 release26-maint
+78063 4acbbb5a48fcd01ccc3c838d0a59687d24a376b7 py3k
+78064 b47bcca0015ac60d52249a790f3a0ae76c649934 release31-maint
+78065 de53baa5ac7de8b31b4b6d425149aba648d8b448 release26-maint
+78066 3776c31c0e8208ba7053cd03eda9029da289bff4 py3k
+78067 c96457df40e0d9caba3097fa97578f44ffb7e559 release26-maint
+78068 4e40a2911750931ae033f72735ecf7192a5be2ac release31-maint
+78069 10f19d1c3b7718bf9f58732aaa147a8e3a467c66 release26-maint
+78070 79c022d77213c24a22cd0cde13f3d5c00f1a0137 release26-maint
+78071 ca67c37cd26dc00b88e0fc2aa9f9197e5e6dd485 release26-maint
+78072 197f243ddab53e88890a5bfb41f296d927d8250f release26-maint
+78073 b0c743c7d7eeaf0b4c4b1a05326759c7258f6921 py3k
+78074 7d07da2b7dcab73f0be366486130241af8736bce release31-maint
+78075 b6df75c17e02dc09061bc5b9669784c87f0e3235 legacy-trunk
+78076 5694444fd5d2e9fe7e6cf1e35e74644a9a77bad1 legacy-trunk
+78077 53f83f202a6d684698d14dd3b74c89401f96cde3 legacy-trunk
+78078 9189803f83407863d469a69df03973ab3373895b legacy-trunk
+78079 b116ffbcd1b07119a164167e58c529a6a5fd0d94 legacy-trunk
+78080 d530a72b46fc82b9c88a0624b8f9c23af3a1f3f3 legacy-trunk
+78081 87cd893cb8ba26d25399ae3a2bf93c9804ae70f7 legacy-trunk
+78082 21804dc7aff4b419b0eedeb3fd0065b06b87cfe0 legacy-trunk
+78083 dfd46a5db872bebfdf5c15a6585f46b6333f7067 release26-maint
+78084 0cfe836c4a8d06104b20e3c74dcb9128a9c29abd release26-maint
+78085 6a892cedf3a43af2503e08eb7e21b535086c476b legacy-trunk
+78086 86a84be33e6aa86c3c7de2e16fbeefc3386604d0 legacy-trunk
+78087 1be7114473eb5a9fe718dd4d9ec4d7e011bd29a6 py3k
+78088 bd5ee13fdda1ecd805954c61c4ff73b06db43ea6 legacy-trunk
+78089 57ff7702ec74e7b8fbb305cdf017c4d3b6660a39 release26-maint
+78090 0cf97ad2fd1f61a8df5b5aa26cb9a21a97a990a3 py3k
+78091 64004a9862e4721d586841b60237e038904e1f9f legacy-trunk
+78092 80e021fe34ed7b3b9049f2d4997450c5782a61f7 release31-maint
+78093 70e115c34f9708a421f1c8cf416df260ca2574f4 legacy-trunk
+78094 3d94b1e779c58292b563ff6a11485ffb49cf39b2 legacy-trunk
+78095 b834c8ee8e7c92ddb440aedcbc86d9fdb4219049 py3k
+78096 f108f62758555674747bfb9e215464d684bc86bc release26-maint
+78097 a280844b68f48554cf860c6487d9b055362781c4 legacy-trunk
+78098 faca97c5f038046116463b631b66da0c784106cf py3k
+78099 13fcaa79324bb8514e2c3ba8cb1a12ab55c44d9c legacy-trunk
+78100 3f390f48b11314eda46ecf4f4d46adf809cac621 py3k
+78101 c8c0aa1fd4a6d529e0307756bd7d241468d20bd9 legacy-trunk
+78102 c86d93aecd7a2502d9b756375bd5f07e169b75e5 legacy-trunk
+78103 d84dacdb2d12524980a691e548222c72b8cb3bf6 legacy-trunk
+78104 600ab9cee40350e63fc042ce2cc6d61d5ce72e8b legacy-trunk
+78105 4bcf96829d1a3d897f41e7da5e56e11c4811360e legacy-trunk
+78106 93676ae97c68b53e6a0968c341599a0afe35cffa legacy-trunk
+78107 484da13f125353c7c849e6d0f312c1e8bff4ed45 legacy-trunk
+78108 dbf03eb7c12ed420ce68d47a9c17e17fe4c84cb8 legacy-trunk
+78109 a98b13608d23a45db0626ea2997bbb869833aa55 legacy-trunk
+78110 e7e89b4583418b941d5299cf889d927e1ac1908f py3k
+78111 37e89debef6a3de4970fa4b396df38063fdfdc88 release31-maint
+78112 7589605daed1042af9932514ccd8dfb97c9daa2f legacy-trunk
+78113 a91ffc9644eb9e6f2687214a75a407aa68c99aa0 legacy-trunk
+78114 47fa54dab38ca70bd63a45ad9db0938c735c560f legacy-trunk
+78115 4e0db44564b173d09f8a7a5c0128a441cbcaeb40 legacy-trunk
+78116 f48c471ac8c9e0e98bba168f13a31764f667821b legacy-trunk
+78117 96c26703b490a4b5797c2325348431670fef48a1 legacy-trunk
+78118 8be8d5db96a25cad8e9c264a63decd6f9f3c7d84 py3k
+78119 59e162b9f22543f748b582e1e226f46a9d75bc31 legacy-trunk
+78120 3eef39e7b74f32294c81e61dec8ad17368d81087 py3k
+78121 e5c564659203736b1343889e5c2da0124de03880 py3k
+78123 ea8cc13951b0bba5c4820ccd3abfc13eb9b53dfd py3k
+78124 6a6eddb459967b1000e64709d0d2f2c7ae45aa9e release31-maint
+78125 26528591217cf373e356d580ffb17f41edd01432 legacy-trunk
+78126 bdbe1379f3eaf7f2fdc96c61f108b2f31a5991e4 py3k
+78130 0beb7c8294c7f439c2438d20d58c53319f1cef85 legacy-trunk
+78131 0af699f09ee3e2cd05b48bd8dc3ddef74d7c5e10 legacy-trunk
+78132 61d1701d9c662ecb394428432413f1a918785c96 legacy-trunk
+78133 11659594f98225eee351044f17215961b0da076b py3k
+78134 c529e51f837758dbd5a19fad87365a41e720c004 py3k
+78135 5dcecac1c8d675ec01834f3849f7444b7d4cbc97 py3k
+78136 d1e2f794d0206425fd9f77ac5ee0b24600b22c94 legacy-trunk
+78137 172fdb1d7337adb4bc8c10f479525e8a1d63dd03 legacy-trunk
+78138 c2bdbd935b5e50cb67b0c7bbb2a481b396be515e release26-maint
+78139 a71dea89877d896f66090f7d1fbf8264fe47d31c py3k
+78140 687ca4b374f4c7568b409621922c9e2f6e3d6628 release31-maint
+78141 c45dcbdcab87362dac6b4d7cc260988bda8b4e6a legacy-trunk
+78142 bfd4798b1f77e00db6a79d813c6b76339566c74b legacy-trunk
+78143 14ee3d4c7bd5c854e3b663c4dbb03f41474c6095 release26-maint
+78144 83c8dfb5442120ebe1d98cb8fa128123934ea5d1 py3k
+78145 fb0980e1a4ce42f6c34344ed5c24d19843e3c3b2 py3k
+78146 5effbd5521e3f6ef57a5126d332d7407ed0db566 release31-maint
+78147 236ab48edd0cea49888d3980869b9e425de5bc52 release26-maint
+78148 2b9b21b830d9246035dd8d637484c05ce8ba86e4 legacy-trunk
+78149 47123915ea20d90dffa377fbaf46f0e830ca7d68 py3k
+78150 3bd65b346bfca16778eb618094a313f8928de698 legacy-trunk
+78151 6ae50c2c0ab9f3b814885043e5244dc5278e9b4e release26-maint
+78152 f156b5e73b0d1a133935f15f79ebc914afa60480 py3k
+78153 8cf07a65d6f8558f9cb4751b6c54155d65476311 release31-maint
+78154 82aa968a9504a6b352357f839711db2e42f00b25 legacy-trunk
+78155 33452d95301f1607375ee3e368ac4c71ebbee075 release26-maint
+78156 590294495e5f2d3061608c154705c4b5597edde8 py3k
+78157 3788ab28ccad70e6e488935b8c1436e80a4f6e0c release31-maint
+78158 56fe16698ee8288aa1041e3a175d02df9a3e3902 legacy-trunk
+78159 7b162c6a9344fc02dd96524e65e5e9e9e197ace9 py3k
+78160 6f69b8fc2ba3ef68a70d5b5c2be986e9d12e7468 py3k
+78161 1218a2a2253cca343aa7c012ee0a906519775e44 release31-maint
+78162 694c97a2cddc16db31ee32cc2ecd54cab4d79e5f legacy-trunk
+78163 2296c5e6ad0de66bc6435e774ff1e90be0cb7d1a release26-maint
+78164 8129462caa307a5891c68f70bf24d8aa324de93b py3k
+78165 537b667ad45003c8d667d6f0c80782e2f6a51a8a release31-maint
+78166 b1c9d6bcf3d4c842c06970cb819a0726a5b3b66d legacy-trunk
+78167 6acb9afc75cde4acd8608f3a37c2194efd3d50f9 py3k
+78168 3347b4eeab404e7d93307d398ffcdf8666ce1bef release26-maint
+78169 263a8f90578d06fdf751b73a18fad37c59b2ad42 release31-maint
+78172 d4374024750332bd09a17f14af7a93549248daa2 py3k
+78173 32a4ee248069434e08f85fa3092fdeca0658a8b2 py3k
+78174 415792007ff9eeb37e6830568b7bde4968a41161 release31-maint
+78176 8c4c391caaebf57617344f9cfd25a347b5b3998b legacy-trunk
+78177 a3375a0ffe2e459043ee21516349910972fe8e18 release26-maint
+78178 70f456bf76387d49902d39afff229a0448d04418 py3k
+78179 e0eb9773af81834d3d598a3613425829d1a57426 release31-maint
+78180 a796f28acee2e75db197c024b3030b74c5eb83a2 py3k
+78181 68be44428909ed34c7ff620f92bec84555909011 release31-maint
+78182 dc1304f045a60e5246496070a7f760b552130b91 legacy-trunk
+78183 a0efcf9b6edd542e6e5e67afca1dbd4dfef7854b legacy-trunk
+78184 2022ede8ca0c61f44fdf44c016eb02785f3142fa legacy-trunk
+78185 901fcaae5275cd844ec5b787dcc961017c799197 py3k
+78186 8756c3de6d24b8e229e493e0c16e5e43b2a0a6c5 release26-maint
+78187 d291b83042fb6c98e1a4c40bd2b55d8298cbdb9c release31-maint
+78188 31f58d9c7016ec8f96d06519ff78d7d48f4febbb legacy-trunk
+78189 5e6edb4e76f58370110c600a00391d12f4a58588 legacy-trunk
+78190 6b29b9f9680599cb6561e0f790931134a64ffeeb release26-maint
+78191 ef74764a6320983610431b31614b5a3e6453e8df release26-maint
+78192 3baabd1d68a286f433addb422d5ff30d0a6b0ea7 py3k
+78193 0293182469a7734dd32e48d8abf3e4cb4d859a24 release31-maint
+78194 411b329938dc4cad78141380f2438ac5147b1fb5 legacy-trunk
+78195 1725fbabe73bd405a08520ac778398f679443471 release26-maint
+78196 7ae43c05116d3f936a3c22ef8a443f94f291a0d7 py3k
+78197 6374e1859346417d5250986778ad6e454e2c29a4 release31-maint
+78198 b641c1aa643e1928ca904bd07f31404166a16cf2 legacy-trunk
+78199 465c047ef311c0cc40f0e7d3baa52ea037739c8e release26-maint
+78200 77d859026919ce4abe8e236da3efd88cb98cba8a py3k
+78201 4f6c1b8277eb436ecbbda5080648f7e22609bb8c release31-maint
+78202 7a56f2cae3ecd7da2762fd8896282d5b7a969d60 legacy-trunk
+78203 15b049fac191a4065cb086c8c779577f91955fb6 release26-maint
+78204 d4fbb7e53c9292b94dfa82f5e4d235d9e7a99d31 py3k
+78205 b7326f9b599b70f351e79ac134b021b4f880ab28 release31-maint
+78206 ebfd0eaebe27118f29a4f7abe7888c420e2e4591 legacy-trunk
+78207 bfb3e84f85fff59ef34c895e2bd921825c45a162 legacy-trunk
+78208 eecf1bef052d3da51123d285b83d18b4c41a5e17 release26-maint
+78209 58b30dbcf99c48d6b85e7533be0bd0a06723a744 py3k
+78210 a671ee3bbcb498e749463ef4d8937b77468cd819 release31-maint
+78211 0dbe2930ee3f0dd2590d50b334bd3108a0559f3d legacy-trunk
+78212 a272444f0ef0c9022f37ec86fd457eff5c62dd8b py3k
+78213 2253557d6fa2fe6112e83c235d49095c7902b952 legacy-trunk
+78214 4c0be37b46b0368c03b4d7bebebc8cb676c0ae91 py3k
+78215 dfc67ad4dcee57b66627cb0f8d8dd411a642ddb5 legacy-trunk
+78216 8f02c54ac2ac8a70fe712d90cbe30bfc75470b2a legacy-trunk
+78217 e3d071233befc0ae15362b7537d3c10f9fc8f49c legacy-trunk
+78218 ea1adc6835ccd192fd389ac946e9cb15ac716375 legacy-trunk
+78219 f225d5e6e0e50b0cfcfe20848e5f6aaa05df23ca py3k
+78220 93e3e6c51513757eb815338817ead55c4102078f py3k
+78221 9a581c0210f2ef7777bae28fef3679a210cbe636 release26-maint
+78222 41c5e8efeaa3c58c9259a1db3a79f0e7a692582a release31-maint
+78223 fb8c0388e385e4ed9c8430e32bc09a8ce2bf0571 release31-maint
+78224 992fd0547ff8d57d84f38ea5a640e826ab5e9608 release26-maint
+78225 286af308c1bbaaa88a115e0838944ac6775dd0cf py3k
+78226 8a9ef2cf794fe6e6cb70bfb82a6f746f6eb936fc release31-maint
+78227 597d6d362dde40d80fb717db3387995238505709 legacy-trunk
+78229 5aa9f83dd00d9fe2d4c244d29aeb0e9007901979 legacy-trunk
+78230 72f46cbfa57aad2237b6f28fb8eca5b7d82edf26 py3k
+78231 5e614eaaa5051ab94eb2a131b37d6ea0f9bc8763 py3k
+78232 6e74d3e51d33e9f791a61fdd4e5ef037932f3254 legacy-trunk
+78233 4fc8b6fe4af867a2bafdc4c8740bdfc23b30baf3 py3k
+78234 7da7f9bfdaac01789d7d345a7ea304869d6a00c2 legacy-trunk
+78235 c485e55aaf965f5465969a607dcf0dad1678a31e release26-maint
+78236 8b16f1408249e9ae2f99a651880eb8b1ca64ef24 py3k
+78237 f725cf12334b97c01129bb98f95aee932d63c999 release31-maint
+78238 0906c6f64847449a7a3a5030ff9da07597c17d39 py3k
+78239 474ec5685a2df0eecf73b7098c5a27bce38c72bb py3k
+78240 3c704461eada09cb9e37f8b49b96607ed10577e1 release31-maint
+78241 f9817ec8b54c04b363f4295eecf8d488bd1e0045 py3k
+78242 674c27d87ea9921b5bd0ff53a97ae1253141f2e4 py3k
+78243 1bf043edb8d574faee596b30397f9ad87529cc45 py3k
+78244 52823820dce13e8d1f299cf5081b348357c19301 release31-maint
+78245 e7423bed0ec43e2a44ffac0925161f622dc31545 legacy-trunk
+78246 8d871e0fa70186220b448a1564fa232dfa6c4abe legacy-trunk
+78247 eaf8a93cdbff4ca863e6274cfe2826cbbb4aa302 legacy-trunk
+78248 7ab63884d68b6f57f6735453b0764cbdcef0743c release26-maint
+78249 3a7132f6562313681084b89235a87ba9983920aa legacy-trunk
+78250 acb27b97923a3a7ea4293ff9b9033c81bcf5c57b py3k
+78253 de4ca8814e0d88317f4c7a3f028202380c32df67 py3k-cdecimal
+78254 557e457997a8164ce276170b7f2fd7a1ada877b5 py3k-cdecimal
+78255 ba407c3d820cd856dc3ace76c907f6048bc24495 py3k-cdecimal
+78256 867270d3ca898904c25393ef9d07ad48c24bec46 py3k-cdecimal
+78257 ac5c2cfea42f6d067c011b4e1e80a2b97a55a930 py3k-cdecimal
+78258 9fcc030a8e701b8115af841bab9fe8fe6779b31f py3k-cdecimal
+78259 3e7dd20685d885a8a7a6488a015f8a2f34dc2c15 py3k-cdecimal
+78260 f67bcd4ecbeefd56a5a4131abeae8b80058080cf py3k-cdecimal
+78261 66f9750bc6ff361dced6dc77ca49ac750d2abf73 py3k-cdecimal
+78262 fbc159531be1cc5c06c3ea9f68c290d85a723fa5 py3k-cdecimal
+78263 129bbc6639bd87f0969ccf57853abd0a9c46a3a8 py3k-cdecimal
+78264 badd4e705733abf43549aec36534f9bbf08fc8c9 py3k-cdecimal
+78265 4209c398c9297aa55b9b0eaa90a988f5d0707e9b py3k-cdecimal
+78266 e0e3f634157046f901cb2921e03ad83853fc80af py3k-cdecimal
+78268 3c12bdf6cc6d17f3b087e964402ba8a8ed364a98 legacy-trunk
+78269 ab21a0481d7264e6151499066bb56dd039c682be release26-maint
+78270 d32d03d41947687b0d26f8e57b938f862e5427aa py3k
+78271 b983779f2121b854511a950f27476b2eda49cafe release31-maint
+78272 dcda985c640342808ce7db076acab2be195c6f22 legacy-trunk
+78273 af00f70a1ff1044c27ced1f9e1d0ad4a2f7ca65c release26-maint
+78274 db86bf39ccaa68f3bf3f9e71c17628c2ffc30d23 legacy-trunk
+78275 d3ae041e7b8c26ed95d4a772ef9cc87ce78b6153 release26-maint
+78276 3790f3eda1c56b8ac6fbece47793113219e095da py3k
+78277 390b0e707f54b5dc09ac1714743b6c0d33007b04 release31-maint
+78279 1b242fb33be7123caa6500e3f8cb83e21916d3d4 release26-maint
+78280 c8ea75598fd6d2e40c2349ca0862264475180895 legacy-trunk
+78281 b922e1ebe380226919f414553879573f9d6f06de legacy-trunk
+78282 0ed193769a5f1edbf557190050ee236e01f0d3d8 release26-maint
+78283 0340804ad713e04864bb9ac15dbc2d76800ce6da py3k
+78284 4f304452bbf69aafe06a9b6fb99b2bd4b03a4a04 release31-maint
+78285 80b612cd94a4e7de1de2990a0bf2f14378048a0c release26-maint
+78286 5033a4295c96aeb72a03c3857249305562e02f43 py3k
+78287 e144c63e1fa61124e3771f2f55597830e9b128b3 legacy-trunk
+78288 0d3c971eb2069759bb726799fce8b6f345a20e25 legacy-trunk
+78289 20b857bb10b8085d92cf51932e806d5bed9463a1 py3k
+78290 b749a79a51ccb4cba72d4761e5385f54e13bd8a4 py3k
+78291 0d2d66061303bd5b5d09b62824ec88b65a9c46d0 release31-maint
+78292 1720ee083eeef64fc09ad3edb9709f2351c3fd97 release26-maint
+78293 6d6be65d3881fb621c60840ead4ae5140a7455f9 py3k-cdecimal
+78296 96a4aa1f31c13691034f146c3494b908e5cdf110 legacy-trunk
+78297 ab6fd9e4543620421cd935d88e462befabbaffa7 legacy-trunk
+78299 581e21d7a192857a55e80b4a2c538eb6e4178483 legacy-trunk
+78300 cc0e69c8f0c23729f4438f2e440a82a76b702c9a release26-maint
+78301 f8ddfced2a347a7c789a6c8cc71b48e0a1fd6ba5 py3k
+78302 0369bbaa5d2dfbf9aa1f75de57464f8010092488 release31-maint
+78303 3de9bacad95bc2ba4c2d11a586fa457cd2b45160 legacy-trunk
+78304 8b7455e01a11150d7c71bb6a915f9774e753a5d5 release26-maint
+78305 f8612d410e2c418b28ea18dde7dfa7682cbb4597 py3k
+78306 f0acf2138a966a7e3ee7d96bc025a19fc0832c20 py3k
+78307 20454fb0be6ef7744dbe1da8109868ed8c5cf415 release31-maint
+78308 c254e54ac85646fddf999da8955794eaf3869bf7 legacy-trunk
+78309 c1a4f27ae8fe836688d7aee93079e3071e541442 py3k
+78310 15d8ed948fb5611b4af6ed0d59f1c57192bec1da release31-maint
+78311 9ece3dd1e9010d326fb90728dd41f2238275788e py3k
+78312 50f8bf61706a460abb67c5a40d7dbfbf98b7cb6f legacy-trunk
+78313 c45ec3b11bba9ed824ae7eb8b39ee7cada59470c release26-maint
+78314 5227a55ed7142bd99531cfed6b0d8aa30e82a2d8 py3k
+78315 ae65c7d35f27aa2b8b817006a774ae6225a28cbd release31-maint
+78316 38f73282f03830b02b543cf79e2fa0257860d686 py3k
+78317 5d7741e1e67286e13881d68e8320030cd2e4e461 release31-maint
+78318 23115015e5b96e741a861ba52d8004816a8145db legacy-trunk
+78319 31c7def9bf51e78bcaeb0e353015475874a79251 legacy-trunk
+78320 132d42348216c73edcf6474e1aa91a9afa378f19 py3k
+78321 2eb13658f573a9bb6eed0474014924168de1116e release26-maint
+78322 8f2d10014c08464f906a2d915451729b29c5da13 py3k
+78323 7a0c30e7e4caf0469de5fc56fe4ade2ce5938b98 release31-maint
+78324 d7c3377f8a7b6742f7600e324f84fbc1849d14da release26-maint
+78325 c88b6602f82d75f6f0dc228a4264e4adf9d985ee py3k
+78326 a608fc378d9221d4420a15ded87d3b6025c9e6c6 release31-maint
+78327 4902ea0256307995bc99d54d104cf220251c8bb4 legacy-trunk
+78328 532da86973cd4a1d96d1eef517f1ed393bd7fbd3 legacy-trunk
+78329 ff84e0893cb1ab6f7f6d447355bb28d7ae249a4e legacy-trunk
+78330 979ac17ec823d06f654edcf12adbdc5049591fd2 release26-maint
+78331 40cb2233f726f1c60fc23e12730e0cdf3b85d910 legacy-trunk
+78332 fd9488854088773cc4427e93209437e2141c0705 legacy-trunk
+78333 5c4466b16d6d576e3153f3cd43f4b4048d14020f py3k
+78334 73cd83706bc4542d3788c02e5f58bc5b5ff94b9e release31-maint
+78335 3357b8ebb2595c33524c54f98e90d6cb7869dda3 py3k
+78336 ea02ece323fe0e8444163967f90224e0de08c796 legacy-trunk
+78337 ef732c3db63dc59f846c5d4f65834ab4cd932246 py3k
+78338 bd13eeedc3b03cc035c39653a17eb84a1731fd5d legacy-trunk
+78339 047f19977c428436c2adcee92e88e977c37c7125 legacy-trunk
+78340 b83f9716f135b867f8972454e0716e5241fc996c py3k
+78341 d288e5491bcaabc016cdf5cb4accf16b19861304 release31-maint
+78342 7fb013ff014f195e851db589790d563fa59e5b59 release26-maint
+78343 5fcb0e0be89e9b1012131e7b5d098e3af269b148 legacy-trunk
+78344 87f1b8ffc28d75de16536082ed93eb5b64a647a3 release26-maint
+78345 77d877d0bf06d93ed4353b39299443e055af101f legacy-trunk
+78346 31cb61e0f2bc00866ecd618201740b58979ca970 legacy-trunk
+78347 9b5806a008e714ec2eed63cdcb687f7ffa1c66f4 py3k
+78348 9d55b17a3c647af2516dab875263a54a2cbe2a0f legacy-trunk
+78349 15286d9f1a8e380325c709afbeb52d145f278bfe legacy-trunk
+78350 8c0e4896dbfc524562590a0313cef357c287243f py3k
+78351 a4c45f8e70aae1f3993304038030142bcd62408f legacy-trunk
+78352 8e8c45ab44dcf7f7ea7282fa96216f006e1ba5f7 release31-maint
+78353 5767d9249f58923e33335675851d7df91a873548 release31-maint
+78354 0bd1736e32973d6618066d52d0a0342b767d9f0a legacy-trunk
+78355 fc4b005cbd28f42309f055afaae23e3c7600ad83 release26-maint
+78356 fc286fe46612330cb2a4aafd82d72c64434f34d6 release26-maint
+78357 a5faaab995c42c9a6331463534dd419571ee7ce4 py3k
+78358 b4c6b7694f0c2ec83199fa499a53fea9832ec363 release31-maint
+78359 ac36ec8bae6c650688606b92df4411d72c052295 legacy-trunk
+78360 460ce9e848383e5f4ffe682e2c14b2d1e05ac635 legacy-trunk
+78361 4a1181ec40364ffa54a79676543ef8e9aee58531 release26-maint
+78362 a1d078b882472a42491640ca53bf4d9d6b9ab2ca py3k
+78363 139c1048f31bd500a8861f8348b418cbc222f369 release31-maint
+78364 b52e3ff0a4c8b23eb68cb74e504bac2994e1e58e legacy-trunk
+78365 8c930e4d51bd290e2017c492bad16ff7a99f1586 release26-maint
+78366 df56ba1cb0af28258a8b889a75eda70d8735e33f py3k
+78367 92670cc1a6bc402dd11ad5102acd1828fc186a82 legacy-trunk
+78368 fec55f52775ce7751853e246d21e340495f9b108 release26-maint
+78369 bf8d9f0359c122603eb6793fb5638ad29876ffea py3k
+78370 243cc80d4a067b493491fa9f3127b79929a06332 release31-maint
+78371 76ac7a1d71b75eae6ea7515eb8769125da49a387 release31-maint
+78372 8a56b82c128452911d5bdb03baeee711149ff959 legacy-trunk
+78373 da373dac2415e32bc25fe3c9fc3ef1a2349c257b legacy-trunk
+78374 89bc28f20021fb4602a4dec73450f39a5e0679f9 release26-maint
+78375 8690d08d953f97e558cf17afbe943472a60ce4b0 py3k
+78376 0f54d432734c76658838c85ae02c82351ab8e203 release31-maint
+78377 1dd1eada46c2d70dead4eff234230ac719bd589e legacy-trunk
+78378 bd4c916f0efa5d1ef67d372e82493fb4569ae1fd legacy-trunk
+78379 9e1ca1c119021c4812be418716b77bce2edbc9df legacy-trunk
+78380 b17814be05f1c1f5a67258d1f3f853362d085404 legacy-trunk
+78381 e2a4445b0e7c300d0a7202ea9614b35994a34dfc release26-maint
+78382 9fd803abe141c9468b8fa67ec3b93a84d7825cb6 py3k
+78383 b908a40f0020509132c1d4baf14b2d706b373751 release31-maint
+78384 dda5165a2374e7d86618cd7714488218a9d8ddb6 legacy-trunk
+78385 287450b2d7a78d5d0d332372946940fd96c1bb40 legacy-trunk
+78386 ea68d75529b11cfcdc17e73b0aea8904ff0dac4b legacy-trunk
+78388 77de7b1bcd59da7e6768dd804b49fba34c0ded92 py3k
+78389 ab10793a46a701c2e83b3c034bff985496482548 py3k
+78390 12497072f9dace20ce7b2bb5ccf089473f639a30 release31-maint
+78391 fcf212a93dd42f04f3e0fd7c2c950ad7a64cf5b7 release26-maint
+78392 32b21061ee9fff254c32224cb6f2c59d5dcfe734 legacy-trunk
+78393 df5719c298db2d8fbbb919360ebe7dab274c9dfe legacy-trunk
+78394 7780482a64da69f6166f9bcd7b9487a02ca1171c release26-maint
+78395 44ee4f271d7aebf8af20f0bd89f471967563891b py3k
+78397 798e0d0c7246ddb207c275d2da9a5d3e588a1a3a py3k
+78399 410c1c80d663ab3b9de993fc622f24c2c6c86506 legacy-trunk
+78400 8d3ff2fbbe4b4a49a1b3eed19eb5b540fa703d74 py3k
+78401 696f767e77ff8b99c26265397f871733bcff04da release31-maint
+78402 678256e80fc601d3b36ec63126c21f76c3419cd2 release26-maint
+78403 e85412f544c83e233f2aba909d47d54badd985a9 legacy-trunk
+78404 954b8e2766746321ef74c6b3110e5f356edb66a5 release26-maint
+78405 e80327cb684681d4f5c46600afa38496f8134c7e py3k
+78406 107c4c6ec64951fa8870e5901b0642e8bd11f172 release31-maint
+78408 a5f6dd189282f01da649fd7a9fc92221b4a6daa0 legacy-trunk
+78409 a9a438100f8d4b2cab805e373a443572241d2328 release26-maint
+78410 a9945afcc4ed4d72bcbde6bd9c1eea0d8e64c3cf py3k
+78411 17719d395f1e6de47f0f87a89f1e06a42f743160 release31-maint
+78412 c465d2143874dcaf5fc9e5b728b0c5c077c497c4 legacy-trunk
+78413 0795dd7b2c9d1b24012c9bcd7e3628854384595e release26-maint
+78414 820eaf9388045bcd3239ecf4b9405432b74f7e15 py3k
+78415 4f7503aeea85fc85c053b582af18b48ce8094236 legacy-trunk
+78416 9ebbcb7a398970cc9dda5bd9ce8a099aa0d22b1c legacy-trunk
+78417 45212a247ed4d5d4ac4900063c6825be5e2c4b64 legacy-trunk
+78418 2b82b16a63756c4695ac9c66e87c3e3b2225e0a6 legacy-trunk
+78419 5ac349c322fd3ffc757fc64a4ab68c3cc851989d release26-maint
+78420 59ecea13769b398803b2eb8a17d6cff97804f1e4 py3k
+78421 c8ef906b11b8832017a55a237280a73608a8e299 release31-maint
+78422 56f4d6c5145016e5a5ff2dc9a0f77a97059b8b6c legacy-trunk
+78423 9225b4f8cb1e73c8115ac5ddbcf7b5306fafb3d5 release26-maint
+78424 af587b4b5909194f33e12e6329e28273be79f66d legacy-trunk
+78425 c0fa145370e41f41028495111899db345c71e2b3 release26-maint
+78426 3d4db1f5b3b155d5bf747f1dd2f588041ce845b0 py3k
+78427 e709f6f6f45ca9cd9fde2fb9fe58bb73614d71bc py3k
+78428 5f9939af2f71acfdcefe56c6b420de3a0260feee release31-maint
+78429 af9e6edbb0ff796abfa55628bd87ac071fa72588 release31-maint
+78430 e47a64f9cc77bfeacef0063d61a456f4e6b89740 legacy-trunk
+78431 3181255e28c99f96d8333d5706d6edb6cd77cd18 legacy-trunk
+78432 c950fac7411ba640c93a1d4b0c6b2437db913b54 release26-maint
+78433 28788f72d8c0fe5da5c96557fc95af60e916209f py3k
+78434 94e2b69029696d0a0a02099d882904f605f908a9 release31-maint
+78435 b7de7c5afa04293c7193a503a1e74d2a12b21a82 py3k
+78436 19cf526befa469b59cbfcf9af1a00c1e6131f908 release31-maint
+78437 12221b6cc8cdc7d088acef4fcd85dc13634ecad7 py3k
+78438 f5ea1264b7ae1787f3a0a92010e2a1e0be0f9b5a release31-maint
+78440 383f40975c75c3c31cee9b41c33a86e0cd15c066 legacy-trunk
+78441 bd8357a91d3e639261ba1d11d22b84082a080f08 release26-maint
+78442 85bf84469a32c9de46e49fc9fd384df0b8b3e014 py3k
+78443 2183277cbab18766d7ab1338f2642892ac7d3e18 release31-maint
+78444 accab4bab634cd61c6c308665389ef5d5c0b5c5d legacy-trunk
+78445 ecfe9cfaa334731134a957ae57350702bfdbc178 release26-maint
+78446 89a50a118201912de7e687d792740d1cb9885368 py3k
+78447 5f04e0cd81717903b630263d0667bdd131bc6e5a release31-maint
+78449 6c14c27925b9e583d77e9b441d402a1e145ca884 legacy-trunk
+78450 aacc0d48d44d7e105b6cf88636c2dfb0709c0d17 release26-maint
+78451 8553d42c94b1a9fcaecd75f0a4b3798e1414ab55 py3k
+78454 1a62f489a68a0a9366298dcdd725568a196b0578 legacy-trunk
+78455 4780e0377e10f68d1b38fd5250a4928b2388506d py3k
+78456 e1bc0022b23b2d910a23b85f3f66bca2fd684e10 py3k
+78457 95b3bb6b9faab9c48f77e598d160e435c54b7c3c legacy-trunk
+78458 3ab7409405fa3a3b92bddb7eb1712bb2352baf32 release26-maint
+78459 c12b955350948839e6720ecd099d80edef5a1228 py3k
+78460 083c8e5354adb33b7963bd03946f467c23e6ca78 release31-maint
+78461 7e3c47354da3426e7bcff23f0bdc2afef5d1d2db legacy-trunk
+78462 7d343d5bfb3f1cdfc839673cbf2530105031aef2 py3k
+78463 ad2f5eacd2a036d4e84ab409d2984ca5393e9b9a legacy-trunk
+78464 9ac35215af4a8c97c2be2d97431c78ba921b7118 py3k
+78465 3dcdca007095566e426617637771d82c79c439bd legacy-trunk
+78466 252f1e23e986031684dc826c0b342e36c32e543e release26-maint
+78467 8b2048bca33c1d43e19ab4c7f1637e0de766b766 legacy-trunk
+78468 535e2155af1a82e1034ac81509b0251d4f3b9d14 legacy-trunk
+78469 dc1cd8edfa46572e1e69104cc1816031321fdfa6 py3k
+78470 6043d0bd8bf70a574d827e654ec645ed5db54995 py3k
+78471 62babf456005b67cdded62082de75a71e71475d0 release26-maint
+78472 9486ff402acc388194d2875d4faf0df26e5f3aac release26-maint
+78473 333fe8d793298bc16dcbc16b08f5c14ccbbba401 py3k
+78474 7874d13c9aa767a78810b40da53bff225d64509b release31-maint
+78475 8e64615a4c8635faed4c74c5dbcc4ae7b12e2167 release31-maint
+78476 2f2d22577742806be616f96a6740558ec917e94d py3k
+78477 5e2a584307ba987c8c111242d69c7fc6b54d9736 release31-maint
+78478 231c88ee8885c1030e9606f276188aad2655ad17 py3k
+78479 3270ba1bec76a389b073c3119ef84480ab595ac0 release26-maint
+78480 2b68e3142d17e833f616f151799c53ec95e261d4 py3k
+78481 56f537bedafed9ff7da85a7a93a488d53688b870 py3k
+78482 4070f4cf8c772cd539e2b67e1f6412c422f2765e legacy-trunk
+78483 4066b45d28ab28bd6e25df693c5a3cfa2c918349 release26-maint
+78484 e540323d87a8b2022a3e5dc6e77d818078511f72 py3k
+78485 0d590e5e840c635b2b5fe701fba29d16402faff9 release31-maint
+78486 aba9f6541ad6983b5049c73958f08c5003d120da legacy-trunk
+78487 2a0ac9bde99afd027c3d7c2adc8698c64712512c py3k
+78488 d0c2b9c2babb0ed966897dbc1058dc3c050c2ad5 legacy-trunk
+78489 0b4846489055ace4fb673782a89f2dd4253515be legacy-trunk
+78490 f139ca034c3b7503804ea56a05ce9783faf31cb7 release26-maint
+78491 bf146f103ee673f2c2787a47ba305c6472f4e07f py3k
+78492 0194d8a6b1effc420666477ebe705c45e9ada532 release31-maint
+78493 ae09ab2686ed0494612d48be8b05a82d00adbc26 py3k
+78494 891e79d770d88e67b04b76b5a48c0494114628a9 release26-maint
+78495 815092a5e5c12983a836a67614caa0fb509d4786 release31-maint
+78496 d62bdd84df0a3bda5ee23a99218be5e6051c557a legacy-trunk
+78497 775937a34f9662b388547f17a1367c9d9bdb817f legacy-trunk
+78498 86402fa0c5b88ecf9ec0534832a2f1865a5f7bfb release26-maint
+78499 560f3f4ee9a7d819e7a63cddcf3998ef97a19751 py3k
+78500 56205f547b746059c5787b03549739b302741afc py3k
+78502 88713c0ed01025a804544fae1202e8d9f671b147 release31-maint
+78505 81d6833c6278befd01230f5f8f5242f8151fab43 py3k
+78506 88f147d2637261f633753db08f62ec21c37cdd72 py3k
+78507 a9e1f1d34c9671bbee15ace4c912b03c52258429 release31-maint
+78508 679f52b8aef4c6d2f69d29b0d4a04ffa4a6d9e33 legacy-trunk
+78509 81dcc0c845dfb668eac0188c5c1f69772316021c legacy-trunk
+78510 01c58cef82d48a9a8ab1627ecf72164307e197c8 py3k
+78511 5d9f3afbc4e4bc0c513ee6a1516738f53e4a13b3 legacy-trunk
+78512 13ff9fdb8431b7293f31bda4b817c6b373e6d793 release26-maint
+78513 f37863a7ed677a87132e79b8d0600081d0b134fa py3k
+78514 2080ab880a80ed0bafecf012798b5f016ce51b91 release31-maint
+78515 799bc4964a1d9302d6ca741a5121856c31dd35dc legacy-trunk
+78516 75080275921b8e86b545977651923b69da984a46 legacy-trunk
+78517 eabfa778b076b60e855a206e111dee43456082d9 legacy-trunk
+78518 2cdec848b74c6140126d147aeacdacf2cb0c8a3c release26-maint
+78519 98e9c4ffd343af1cec5046dd0e85dcd17ec89e92 py3k
+78520 9e8113e76adbf01454cdaf0bc3543654ab8b7e93 release31-maint
+78521 8e3d03b8090bcb21dacecd1d9ffb3e52080b43f3 release31-maint
+78522 1c6fc70f49d1abeef91648d429ae48563ea2c0d4 legacy-trunk
+78523 6e664bcc958d60f21e78dcf10f840fd35c731018 legacy-trunk
+78524 55778855cd25a9ae8fb6675e9f8c2927db989f5d py3k
+78525 12469f20656bee0579510e87cfeb9ee4837f693d release26-maint
+78526 1f158238fa764d700ac9fcde748b0ea4a7b34f30 release31-maint
+78527 4afc50d155445d01d2c93d6ca86cefc639b702f3 legacy-trunk
+78528 e1b70c6df9e773dfd70291b8dd5ec1c10ccf431a legacy-trunk
+78529 9b4e0cd7817ada1e2f3133497e7d201d6d8dce1e py3k
+78530 370e1a1c23869df819d31b44aa9f32df22848f98 py3k
+78531 077f2b8b3e57290933dd92bce4b50f0320276247 legacy-trunk
+78532 854b34a06896fd6e47a16e8de3e4c28f0c33449a legacy-trunk
+78533 924ca295b1460002630b0a37d1f02e83a0279bb6 py3k
+78534 d1c62882c73bd0dc4ff2a15641dcd303027d9e88 release31-maint
+78535 f53fe33e03ea1b49bf7696ba24c9e33adbce6b05 release26-maint
+78536 c45805ba323f7faa9aa1702387b0e1e423d812e4 legacy-trunk
+78537 941e1bf04f5532e12f0ffc9027dbf0f3b526e6c7 release26-maint
+78538 f0283bb623614ad952afaa7cecd3c9f6b23a3074 py3k
+78539 783f09b08706ea30e20c5f0e46366a2b2388172f release31-maint
+78540 0265cdc8d5bb0cebb4d91cc493267484e1a744c2 release26-maint
+78541 8d48f9b59689ba469826557a8ddd986bd4cde3f5 py3k
+78542 9b72277d6b30a7c08c9d6d0b6bd2f9c14251380e release31-maint
+78543 d5f50ae4f1f78e199f137391adf48c7ef2bb838b release26-maint
+78544 f5bac4737069a413e892d7a5107895dc1d6b1db2 legacy-trunk
+78545 6fafb64ec32808d239dd5d0c50f56e6d47772391 py3k
+78546 589004b22f54c1347e7fec356a7df310f45aa4ec legacy-trunk
+78547 aff692bdb6db10797833191f36af32f832581cc1 release26-maint
+78548 887de5dfd96015ad44029ca1ebfb444eb05e52a9 py3k
+78549 dc846a211c658aaae0f0908e3c28a7410af01cc7 release31-maint
+78550 46ae164b15ba91dc6491e91a868b2d271c3317c6 legacy-trunk
+78551 4e3043109749f29574668e4465e49bccbb97bf7b release26-maint
+78552 58c35495a934387d064edf59634ad73cb8fe28e4 py3k
+78554 4bc5b041d3aa6bbe0901df2267e58b8888777c95 release26-maint
+78555 40a406eedcac92e11a92359dd674dfcac5792ae9 release31-maint
+78556 d5615eee563e5640537de98d2bbba1c740ae86f0 py3k
+78557 cdf59604a1744d6b53bb729e9946762fec9c9e35 release31-maint
+78558 8b7b5c9e67f4d6703a78714e54498f88ab331f84 legacy-trunk
+78559 9127d70730c5b0d61f037a101f3ac06f7023d882 legacy-trunk
+78560 04590ec6f37ddf65750295089766d929b3175c87 release26-maint
+78561 438680be5472b7ac22e67664788532faa735374f legacy-trunk
+78562 39a503c88002a8f61ec702fce56b653d88f3e595 legacy-trunk
+78563 fbde11d1c1f5b3b79fd53c70b3f96972a7e93840 legacy-trunk
+78564 934239b268adc357bc09545534ef380fafbf846c release26-maint
+78565 c8b26276c5877985b4b2450a8c54a7e28812f5f9 release26-maint
+78566 89f42b681ce5577327f8041032f61468a33c16e5 legacy-trunk
+78567 69a103efae8d4eb694219b8b52a7281420f881fb release26-maint
+78568 f99e7ae712b0b24f3eecd4cc5121fb228e3bdb4c py3k
+78569 8498f0d9f026362e9ae1154516cea728a91eb9fe release31-maint
+78570 aca188970c47d06eb30677261d9b41d10023c91a release26-maint
+78571 2c9bf218ce29878f471845899bec3c7dcf70ca4b release26-maint
+78572 c9f68e42ab796a3bab4f8cf3cc69ce10503cb990 release26-maint
+78573 111013dd5a8aa0ee0e2517cfb62eab9b80874d48 release26-maint
+78574 4f18945fb8b17fdbc44bfc8278764c86ecf59ef3 legacy-trunk
+78576 83ef67526011aff4fd94b1038e0361f47b88280a legacy-trunk
+78577 f923fe55a40c3b75e950ba424cd2a2f725d3a26b py3k
+78578 755d7a3a6bb756e3a623c295ac92732c35575639 release26-maint
+78579 38b02dd2d459bac66108b3b17f80cce4434cf0ac release31-maint
+78580 4728aa2c8a12845a28d378dee98dbaaa9e22157b legacy-trunk
+78581 7a89e1ec4f005ce0e139e23c1d57f22159390996 legacy-trunk
+78582 6d5c31f24a21b2d84f6a8c61db4f72a228674c3c legacy-trunk
+78583 6b968e2f05ddb0d9031ab5db540553bc2a901d77 py3k
+78585 1acb643b2cf445a009cdb7a55ad13fc5295deae9 legacy-trunk
+78586 e64c4b43eb3c2768924225283c3d69243bfe6c01 legacy-trunk
+78587 4ca83c5b8551bfecbb8c070cd4ea759b8c86f85e legacy-trunk
+78588 8401de65e12a218c04b463800516e8499186f391 legacy-trunk
+78589 dabdeec4f9c1d331954678f2fedf659fe4b1ea3b legacy-trunk
+78590 82eda345a5f6e13d9ceb608e82da423d96140b11 legacy-trunk
+78591 4b7b6953cd064970f5067cfccf93c3a48b10061f legacy-trunk
+78592 137a21fcd3850ab9598634c8ef0cc0a5fee614bf legacy-trunk
+78593 83e7ee1851623ccae36c2429ca990db40ba47820 legacy-trunk
+78594 970fb4a8e654ac9bf79d493c0e6edc1b6029c559 legacy-trunk
+78595 12bcb69938b3c012777c2450555dbbbca4b178b5 py3k
+78596 c31a7c0c6399855e9f84a8617a8d99b30bfb7b07 legacy-trunk
+78597 5c67c1ef8ad3f44f6d66a24b71f13d6da11cbe60 release26-maint
+78598 01d6a14aba65176fb0968ff2b338f1c1a7d604f9 py3k
+78599 951c97e2878d71d82425c19c04339d4f8e0d9e2a release31-maint
+78600 8d72147f442cf9d5a2f7746aba9c42b0747b716e legacy-trunk
+78601 eba942e778957a11614a4366e4231df009359790 legacy-trunk
+78602 b30f8ce821677d930f704de511a9d6bc7ba14eeb py3k
+78603 b044405d62e55c1e5502bce31a6faca5f83cfc22 legacy-trunk
+78604 f5411125245ee273f731659ce535d4d5005c14bd legacy-trunk
+78605 2d241765e63174f79934c3a5f1e1d390cf4db66d py3k
+78606 aab5b76aa0597d814997f8fb9fdbb6f5df1b17a4 legacy-trunk
+78607 681597d0c58df1070ead228eee01695d010e47e8 py3k
+78608 d4a188dac22285690f9ec5975296f4ac51fe2074 py3k
+78609 6537761c310183f0439ccec8603690a9efc9b439 release31-maint
+78610 7eec6238e15ac4e7fa223ab1fb4cc0bfacc2da94 legacy-trunk
+78611 086846381e8f3d6fb0e0e19c66782a8e8d47aa34 py3k
+78612 1e4c4b235a89dd754f05341857b7c5e8a9c00c52 release31-maint
+78613 25c0f4d7ae569e43fb4b3a620eb9e8752fda22c9 legacy-trunk
+78614 38cef8deae22ef01733eb71ddfafa6608b95c25a legacy-trunk
+78615 584ec7a7255b240e9f57fc4056f0e73362ceb046 py3k
+78616 bd9c7993ee75e3659d9c63f408b1f43a7796f164 py3k
+78619 bff050450283ec75c6ce0ab0956204bc60a4c60e release26-maint
+78620 b8750c72b9bc47fcb6bae11a0c636ee24e3ef7f3 legacy-trunk
+78621 687d8517a0c38cfa2e66606fcb248e5e56cfdfe2 release26-maint
+78622 29fac4b1a51e763d3f072943921cf0ac3f28e52a py3k
+78623 8ace2ead55237b1e72c6f34d8843f98e06097f08 legacy-trunk
+78624 4b413dfa27f992a7be2321834c69cdee0a1d6993 release31-maint
+78625 c53cc6bd6b6130806071095094467bc36e6c3f2f release26-maint
+78626 c4fca778b573a52662d6a036741c57252514531d py3k
+78627 b99998453d523ae10ebba3dfb1d4a9df7500d46c release26-maint
+78628 de06b59aa43c7f9aa58d1aced8d6d6aced4896b8 release31-maint
+78629 5bb295a94b0f7d04d4a27834bbcae20cb185379c release26-maint
+78630 c359d5acdc4b5b407c80d58d1c2b02d0f24559de release26-maint
+78632 6f1e2ffd7bde89e0abf3f9dbc927d605cd38f9e1 py3k
+78633 dfa7491140d94c6e1e2e340349d52cb0c7092762 release31-maint
+78634 df0270bef9718f4b20436d3d427c846fa6d3f0fd legacy-trunk
+78635 8678534242a0938da17a6da224ddf82e875fa063 legacy-trunk
+78636 bfea6c202ede57677acb53d54ce781b019d95cb3 py3k
+78637 60e7e6d3e45a8907be91a80705ea1ac4992ccc85 release31-maint
+78638 7f500641c06a1d94c7350bb9929d5555937876df legacy-trunk
+78639 dd85273995823aa62b8cda0e8324917a8ab42063 py3k
+78640 d7a62c16505b12ccc2678460d49b6eb7e4708374 release31-maint
+78641 d5fbda03c6033ce1aea045c15ed2060ff39eef3d legacy-trunk
+78642 9944e5104a5597039903f38f8d5493dfc5dab75b py3k
+78643 7595921a147482f21060ac1b5195602958c98322 release31-maint
+78644 461d9cd195b73b306672688f2302ab12ba0af70a legacy-trunk
+78645 77900e7deaa587005df12f2efe484b06af7ee5d0 py3k
+78646 26269dfc22ab47e4114ed7ddf4120a3385f17f38 legacy-trunk
+78647 0b27c3f18cb386f562477f34ffb6f8fe401089f0 py3k
+78648 fd8fdd388963a9621d8db5fd068fd06a5228e1af release31-maint
+78649 302dbc6c48071edd44d7e5fad36a03536da26b49 py3k
+78650 b6cab21d80b95b67a05f309e1c5bdbfeba9d29df release31-maint
+78651 a3c00566c2d59c2df91e7cd477d04d0f45016cb5 release26-maint
+78652 84130c2265dca6f92072c8a6132829dab2fece6e legacy-trunk
+78653 295d59fa6e62e1d2c51918af3d97d78e72793f9a legacy-trunk
+78654 db4da1edf34f5a251f5d0414bc4b049e0d19c019 py3k
+78655 6facbc183a4a1ff7cc6caa5befa514fde259bf07 py3k
+78656 987ba37a54943ad43953830c69b061ac6b913d41 legacy-trunk
+78657 eea15fb0244e2eb5613b9921e144d7ebe498909a py3k
+78658 951fec196edc70a9dadc464b38dde633dce7be96 release31-maint
+78659 f835e2827d1aa6303b704c78fdaa900a9fe94cd1 release26-maint
+78660 02aefc4257de76f63ee0b6c31697ea0d68b02de6 legacy-trunk
+78661 ce8be64b34a8a6d13f44c5eb265214654ffc3254 legacy-trunk
+78662 d8b2fa88788b1f6b3d73decb2b6305ac651dc75a legacy-trunk
+78663 04955e7eb59706fb8623025f6040d15050fd1eae py3k
+78664 319e6215c56cb995ebf8ac5b9999bce2ebd5e928 py3k
+78665 4df33e83f26f10b57b574129fc7b2339ffd09a89 release31-maint
+78666 ad22bc22dddcbef36191696a00429c7a608d501a legacy-trunk
+78667 3574c5fe207c4661337689ce504dd91a9634abbe legacy-trunk
+78668 69b2abb9534877ddd65262faac0fe5f26840f054 release26-maint
+78669 81dc172bfdabdcf34561b88fce25c994ae207607 release26-maint
+78670 755715b3cf23a3e907290cbe70b1791afce103cc py3k
+78671 45c4b6d6e2a534ce7bc62fa5cbdba263b81bf933 legacy-trunk
+78672 021cb4f4559a5faac4bf1a6e9bb4eb8b84d7c42b py3k
+78673 5b819ec4e205fc0fd9d12d46df049c05497ab1ed legacy-trunk
+78674 432f8ba67381812b47bd8a0aff65a06db07cd040 py3k
+78675 fef4e253e88af35c12b7bd24873e603bcfdd7b66 legacy-trunk
+78676 0fca397d50f7fe644746276474a7641d702b93c5 py3k
+78678 7b48ebaadb6000cfb546f6aa728e9445574e8df0 legacy-trunk
+78680 7e96b0bcba27ed79d994633e03959ecf5a0f27dd legacy-trunk
+78682 019759916a9ba7a24c91d0ab703d8466e32b287e legacy-trunk
+78683 e503033e31436b949cade4789d2da36dce1aa2ae legacy-trunk
+78684 824463c4489844058d7bccd1e7f1b611ea659fbf py3k
+78685 7cd7ff6b0adb28912582ce09feeaec2fa8aa8da3 release26-maint
+78686 8b864aa78e92517a3df409f6ed6dde4d4e5fbdf3 release31-maint
+78687 ae7f26d24e1dcf7497fe29b7df8bd571ed29ac7e py3k
+78688 04d3ae52ff7302a3879bbbb3b6f421d94055cc5b legacy-trunk
+78689 32619996a0148c4d796316881c3b990f7f194737 py3k
+78690 c2d9d50f37c59b633b4cb8a95904ab794ce52c62 legacy-trunk
+78691 91fb394c04d63d99fee2acdf8c726ffb2374c5ac py3k
+78692 81477192cf7a99a229f96387b96b7fa0b59eef91 py3k
+78693 ced5f1f414b00c6547d337d2df460b000e126770 release31-maint
+78694 fd155a368f5bd465d65313177205c02f66a1d09d legacy-trunk
+78695 817522e352d66f6d548b8b20e01366aa2809ed85 py3k
+78696 19f30b422ca3fd17ba9448279775b0eb1fce9f86 py3k
+78697 5048083e99ffce43093a7edf2f578b3f62eae0a5 py3k
+78698 3003c1656e2adeeb5faf5bb2020ca652c333bd3b py3k
+78699 bf586b2776f67cc8ecd3f9edc614a589fb05edcf release26-maint
+78700 ecca703bc0df4db45ebc956c8d7321866a853acf release31-maint
+78701 3197ecc0944a17f559430bd3a41ca48c997b7253 legacy-trunk
+78702 d9e6f318568fc9363a346f760a03709705d9b4a5 py3k
+78703 cc70f68e9c1113c97fa4b06721b3c477e30e6cfc legacy-trunk
+78704 454eff840bd422af09f0eb25097c5010b50835e4 legacy-trunk
+78705 8dc40c63761c8fdcb5594e535df41e145487d1fa py3k
+78706 25e9ddbce10abe4fbee389774f3427043ff87e41 legacy-trunk
+78707 2b508aa2a436bc55b2475457e4283f64ef3fe6ae legacy-trunk
+78708 2d5ca2805ea5f1bcd7748e6a9743c46c4b723c71 py3k
+78709 32ac428cd18b342e4d9b6bb9789ecb78adce19cf legacy-trunk
+78710 215638fcf09ba086320d81cc65f750bb7b166c0f legacy-trunk
+78711 5d5bca6ecb15184293f53440f0d95b822a2cb6f2 py3k
+78712 5c3176775e8730cb3d7c304298ea385b6dc3c7f9 legacy-trunk
+78713 4a119d84d0b575743b0177bcf986ea1b085c6c98 legacy-trunk
+78714 b68a9a8c2c1f49f2c018c1611e95b27dd2f88931 release26-maint
+78715 67430875c1a03631aeec1408da970785de0af7f8 py3k
+78716 aa48526451d17056e103f115428a5dd17d0b10a8 release31-maint
+78717 5aa3bfc48cbdebb8ee5be9830bef8f271ba156d5 legacy-trunk
+78718 bb08a3ec154da73765e1146658701ac2157ebafc legacy-trunk
+78719 5b1764374545a3f2df1735f19a18a7b0ed4ce47f legacy-trunk
+78720 966eb1b9e9dbc3dbf8dce0345b398d1df6476842 legacy-trunk
+78721 7444d348d771f0f981c38036acae2d6dc881a675 legacy-trunk
+78722 48a6c26212265c53b6dffb7bac54e094c5ffb062 legacy-trunk
+78723 486c1c9ee006c067aef4fb4d07a8efbef94e7e16 py3k
+78724 efe528ee958a6b21d5d58564741ba3e51cab0ccb py3k
+78725 24c6a583a866ac8d205da3d105cc7bc2912734c7 py3k
+78726 4c5c5b4668b4a6ad48b68b70039e7119b70a645c legacy-trunk
+78727 f362cd4bd2c51c6cc0549252666927e5c21d48cd py3k
+78728 120d6ccf26b04e99468c164a184a08e02f2c6fa4 legacy-trunk
+78729 9258f405a7ac466b48572ada023d8dc9e4db8763 py3k
+78730 97ca9b14a6607bec7bfbc69e0b5798561566b642 release31-maint
+78731 d0bbbf3c55f5e015c39a1051d0bc45ae3cc9ec5b legacy-trunk
+78732 bdf6d768a8cc5f8fad075c8d383d2ed00597dfb4 legacy-trunk
+78733 c2cf6c7170c5152b05282b8b3659cd952693414d py3k
+78734 ebdc2aa730c0bd1c27371c32e74e5ca03882385e legacy-trunk
+78735 a07f70fc82a1102f1bb5dad2e3183fde4633f3b1 legacy-trunk
+78736 e8c118915762e7719f56938abee4fe0ec056f639 legacy-trunk
+78737 5a9631b9dd227617b63b2f76c07003aa2c08a585 release31-maint
+78738 d2e1027edde84a02853fcf9790f311f10f46cf0a legacy-trunk
+78739 dcfbc34b2e3c6ab799e6f6a95d522c8f13f92ba2 py3k
+78740 f9ea917aff13f2aaee325d8387bcb7a5bccbf22d legacy-trunk
+78741 149b8b87514d10416b598884db5f74651f625b38 release31-maint
+78742 212478640b1c263535fd0cbfa6d7d5dfa884f7c5 release31-maint
+78743 16a26d4374e46bfc977eee41e0804eb5f80d60bb legacy-trunk
+78744 4fa96a91380871b68e1b84e7a87578e7a118be73 release31-maint
+78745 ad256a6c65990c8a35387b0d3c92ac0ff9c2108f py3k
+78746 317d0c43ab2b6bc864435b45ff650c5e375df02b legacy-trunk
+78747 f73561127f57e3e23873e9a5e041a2bcdb155d18 py3k
+78748 e6d14158758e18b63af52bd0b591672b25242e24 release26-maint
+78749 0802bc973b324da251bcffc13ad3a9bf50ffa609 legacy-trunk
+78750 ce973b5c779f0304ad3aa20e5e6322345abfe5d1 py3k
+78751 c16b37b1891b00c065791421e1d0357e0a20d660 legacy-trunk
+78752 ee8802815bad2b7ff9f560f90afcec3e5df73a90 py3k
+78753 cde2687e37c16509267f83536971892b14c74fc2 release31-maint
+78754 4f02179493c25d1fcbd1955c0b07a4eb0e7a89f1 release26-maint
+78755 2990bd3ae8838a76eff19df91d0ff7c40cde82dc legacy-trunk
+78756 49a0a950d219b22b9f5f9dca0275f944cfacc733 py3k
+78757 e2d41079d05967e5bb6a6f87cb97305889ba5fa9 legacy-trunk
+78758 e23cba03cc4b33d9e13f58d021bcbcf8018ab2bf legacy-trunk
+78759 27422d1731e9e469648f69661273031128eca736 legacy-trunk
+78760 174b0879b7d0ecacb26b753fb6a9a5f95999d611 legacy-trunk
+78761 71e4ab21346d41e5041128582497a7278cb34ffb legacy-trunk
+78762 cfb442d702cd471a6502a9d2fb66e8aa1ef67645 legacy-trunk
+78763 0a273ca10fa5e4dfe6561849dd8199368792c52a py3k
+78764 4a6be864c6b89b17c6368d983570ac92d411386a legacy-trunk
+78765 85c95fd5d7e3a044a2040cd155851aaaf684fcdd py3k
+78766 edaafca87431c7cdfc159902c84a38cfa1643b6d py3k
+78767 ab7c87ed5cadd04ba93e78e25cc7c12857b01ee3 legacy-trunk
+78768 da19894946e1f612c1ec40456804216d09675e52 release31-maint
+78769 e45ff027482fe48793dd7fe2b157e46d2758866a legacy-trunk
+78770 8f2c360d0214b5045082767f6384a958eba30f13 legacy-trunk
+78771 5b1da32c9d4e2d4b0d87d97737bb040c8e0d2228 legacy-trunk
+78772 c752064fc26272149e2bea07587c5f43b4f10c5e legacy-trunk
+78773 37a84249aa04777b1604aedb147d98eb62e1198c legacy-trunk
+78774 85ea454a13dcda1363dfa616a95ae3dbb1d723f6 legacy-trunk
+78775 131c2108d2b1af987ed87b2ce47a17a29968ac0b legacy-trunk
+78776 4660387b9b35233168b8f7dd08dee671190b032b legacy-trunk
+78777 41aef062d52931f5c6e43389ad0be2c7335d2fec legacy-trunk
+78778 da71464d2cff218e50f601b4720fb9577378252c legacy-trunk
+78779 575b12b198a1644a991ae3be737301d2a57a5fbb legacy-trunk
+78780 0f468e2d93d0ad1d06227bd116aaaf6c7a2077e0 py3k
+78781 c676ff0d8495f57877c4b466ba62d03d488aa581 release26-maint
+78782 c6ed33035d692af0562cad9b05beaf2945a42d44 py3k
+78783 da3c5efe4252dd23300550f09964598183301af2 release31-maint
+78784 b0b80ec2e3a0fe0b75dd490dcf43bb339d136b3d legacy-trunk
+78785 39d7047807d5295a6d48ad9434838f0db37dfd77 release26-maint
+78786 445f801ca2d0b4291c52acd79274c98a8a3625a1 py3k
+78787 55f6a3d5c17795737ad694b64028912703ec1cdd legacy-trunk
+78788 6671932bd8b8bfd2081465ddb67a68ea75f317ee legacy-trunk
+78789 a3f6178354f5dc1c0754368b1b74980fb54c7a89 legacy-trunk
+78790 96e0011ea0a44ca6a974badb4315b07922dc467b legacy-trunk
+78791 2ac4f4f7e391161ca0213766c3ee936f4bc3f1ef legacy-trunk
+78792 a2f1c15cae6c405e21e8415ffb835639362a693d py3k
+78793 733ccc3f3a6805b11bf5d638bdce0d8e21390c8b py3k
+78794 14616df924079d1152daebebf48314d2478b41d6 legacy-trunk
+78795 cdfdefec99abcda14dcdaa7f4151e805f80163c2 py3k
+78796 68e0507632a91f79006bb68c43cf8877ef7449dc py3k
+78797 ac80884ddcc3266948339746ab65ac054c30125a py3k
+78798 024c53a86521f90c004212cf774901701ab66dff py3k
+78799 b3e6673b6ae4d1e0882eadff7256ce6543dcf595 py3k
+78800 d92878bba7bbf70fecb3bae374f72aaa904fcf01 legacy-trunk
+78801 895cfebde1727ba7d5798cceab2eb0fc98b6f1de py3k
+78802 c557a54ad6d1f87faee045e08b9be94efdb34c76 legacy-trunk
+78803 1cda3d7777ae7e3d55aa0f561d422d2d2c458cc3 py3k
+78804 c870396b6ae1a11a95a4579d4c957e7a09177d4a py3k
+78805 59a1573b83ac46b18e184c7cb69683abe5f168a2 release26-maint
+78806 f12682af557b61aa7e0394f1342655b5fb14babb legacy-trunk
+78807 2a4e92eff30a742a7ea459f8841fb5c320b2c48d py3k
+78808 e42155c47494affdc65b7c3019e855e02ba47a03 py3k
+78809 88d265de7dae206d0cdbbb2369ccd6d92cde63a9 release31-maint
+78810 2eef9b0ebd5cdf9584fd71d76cf18c0784fbc623 legacy-trunk
+78811 56679afaf07db2ad860a870065befb3a7ed0e8d6 legacy-trunk
+78812 1f5da55ee7d7f0026683903337aefe3e1423d0f6 legacy-trunk
+78813 e2762f4953935e51a07ec9d65dd5fd287bae4d6d release26-maint
+78814 bbf2edd752b632f0896973973d4055516f5e3347 legacy-trunk
+78815 269a12a50123f3bd94ca4a9e2e23a0030614f8dd legacy-trunk
+78816 3c8e200043d69e89e9ba6eb9eac5242be1352900 release26-maint
+78817 55f4de5e378a89eb9288c7869aaf79c1b6f29714 legacy-trunk
+78818 65334303fdd3fa266cd6b0d79532bea71ef2c6b9 py3k
+78819 6d9be1a97c1722e6a91d6b21502f1ea50f9f5212 legacy-trunk
+78820 dfb239c500892fec9577d43bc8124c53e84c4f48 release26-maint
+78821 9dd1ecb5a24c1b442275339a02d57fbfbcc6a8b2 py3k
+78822 fa4630916699046357a5ac16884f3fc47bd0eaa6 release26-maint
+78823 017aafe8326fac6ea18dc725d38128e9de865789 release26-maint
+78824 530b71cd3b29612e98d6be1081ff683e530c1b1f py3k-jit
+78825 bc0cc6771caa789240296d763eff21053747af4b release31-maint
+78826 4468666d01c4ba51a672901fc9710efcde62f2cc legacy-trunk
+78827 5551fe66670c244d0d450af9f0cfcabd6b6fcaad legacy-trunk
+78828 adbb37d3d0e503d1b07bf663b90f78e92c8fe16d legacy-trunk
+78829 135cd8064d6fb85e849f7ba3c39da5183dea3ba5 py3k
+78830 5b4a66d601c3a44630234edd843d6f19f88788c2 legacy-trunk
+78831 053ef6e83ced7c5d388e40d5b05c6d8632c93092 py3k
+78832 ad8f63d9dcd80348d1be78b6bcfe695a517fa620 legacy-trunk
+78833 6e37e127581b4c1030c9c08748953636ab03578b legacy-trunk
+78834 a111024a0bcb6c72d430136a23107753fca840ac py3k
+78835 8b246e8560db5d01ae81f99fe9dceaa1f36d94d3 legacy-trunk
+78836 e5367d67a7f8abb786f2950e858ada089110e59f legacy-trunk
+78837 b8ede0fee61a139fbff7917a2874b069887dd89e legacy-trunk
+78838 831e30c0fd730685ace2534abb1ea6fcbcbae67f legacy-trunk
+78839 903d3e633a9257c93d831fcd90f26ea44d373cac legacy-trunk
+78841 06ad32c034864b6ad894cde011f9b3229ffaa4b9 legacy-trunk
+78842 9347379bd5fb97d3e63e7e439f3d8d1403f9660d legacy-trunk
+78843 b62f76ad430e28022eb769f75428845337c6c363 py3k
+78844 4dd08a5cca8ad9c4a66546f2122d80a2c1be36be legacy-trunk
+78845 20160b461cd3aeb3046faf99e8fd4aaa355655ec py3k
+78846 ef48e48f066e99915735682b29a5b123b34cfd23 legacy-trunk
+78847 3ed95490ba9d3dc728c0a9bef55f35b7764a3780 legacy-trunk
+78848 6ea0a58ed8376904db991be8586cfea095881017 py3k
+78849 4912cf3b0190b36dae5b4aca77062777065de169 py3k
+78850 fcfe324663a61717a49b582d45e41722e5bc7349 py3k
+78851 5c5de8acb33c1a5116930ea8639df8c027d643c9 py3k
+78852 9c2d919014d07aadbe614b1388728a075f47361e py3k
+78853 a566e53f106d60feabaca904529ae6b7d5d0a789 legacy-trunk
+78855 135aa7edf792b83749afa3945f32a74c87458747 legacy-trunk
+78859 5394d81c4513bab87c2a32d81d4be36ca47b8984 legacy-trunk
+78860 62d7f049703b4830578ba10d7dd504fb53e987fb legacy-trunk
+78861 9027b15f9bb762a574ebf1d8adfa40957e637310 py3k
+78862 9948714532f92115a00540299de9b14ece4e34f1 py3k
+78863 dd48e3f32de554f3ea633354b9d6d6dbdf0eba4a py3k
+78868 236fb0af44049709683abb51df205d960751d1bd py3k
+78869 b056bc767ae1eb18f9285acb2d15ae9610f78d20 py3k
+78870 26b19809d82e8f37a625b194948de5eec2d0f427 legacy-trunk
+78871 69b71c3389925b136588b00912213d29077dc535 py3k
+78872 42261c6ca564301f2defcbf810857edacb3fb4be py3k
+78873 1bcb465472be59a836ca3644c2fb6765e3f6f06c py3k
+78875 f49d24b4456ec9e941a2853c4023f102d3ffc544 py3k
+78876 06fdc5e0c2c243c83c5be9a46fcdcb8922dbaa57 py3k
+78877 c9dd823c146d1b6f22ffc831de8e0d664311b18f release26-maint
+78880 ac754faeb63e88f5e11dd2ed015e04bd5f2bf476 legacy-trunk
+78881 82a23047194bfd0586c3bd660de91a519ecf462f release26-maint
+78882 07adb09440ef89665248e5658a942a9e111f8f8c py3k
+78883 6ae090fd99fe3b13320724b3359d77a56491bd0c release31-maint
+78884 273eb5c1b9b9735ae63f5f8a0b036d8a3aaea10f py3k
+78885 900fcacc64034a174ca94c7126ec45d0c5345943 release31-maint
+78886 1e01ef9758999f6fcfff01447fa0db73a7714bda legacy-trunk
+78887 76f07ccd7db5c75eec2fa6bbc93de55abc561fb1 legacy-trunk
+78888 6726463646fb4088ef323376cfcf44321f9f7523 py3k
+78889 980808de30c91ef359528f5724432bd7ab96f042 release26-maint
+78890 e474386ff96e8859a992e392ca3020edd948a3c0 release31-maint
+78891 f808b16ccfd6ade31ad534cf7a507f8f020cefe9 py3k
+78892 d6f204d40695ebef613ad4fded7f1d34d6aa31e5 release31-maint
+78893 c1fb07a57c8d679a327b87be7142986c27c62dd2 py3k
+78894 c21b3e32ed7b8e2e6a54146eb61345cc1a90a27d py3k
+78895 5dcc3619d6d1da83a08dd403bc5d376494c8be51 legacy-trunk
+78896 67353fb405ec92be108d59b252f7dc4c01107b83 py3k
+78897 22c8770f992396b3cda1beecb41dd9fed846e8f4 release31-maint
+78898 1ee2452ce9426616e52260133250e41b9f7089e2 legacy-trunk
+78899 f40a8085248035b171b3d6c73380e2c37c8bc3c0 py3k
+78900 e10d61ca368edfadfc6db5033f4c7fddda1aaed0 legacy-trunk
+78901 77c5c90beef028d8c98d4309ff02b6c036e1704e py3k
+78902 f65977dcf21acad03e1e64b4546cef428f89e2e4 py3k
+78903 4fbf3e708fc401b715f890e1eb9bbf7c9cb3b7d7 release31-maint
+78904 b3ee5fed8da48104fd79ea0cf984f2fa80b0708a release31-maint
+78905 80283709719176926e842fb12a22d46357971cb5 release26-maint
+78906 90daa07a43bfe947bd5c241735e93c7a845e129f release31-maint
+78907 5a16bf6da9892f85dacb1365b623b8f08b67dc5d release26-maint
+78908 f255a46b315af6295d951747d0572357546c6798 legacy-trunk
+78910 da94f1666da18d17c2a8c57b56e0428597761fad legacy-trunk
+78911 55ecdb79c6602dd6e4fefbfc04bbd9b619adb4e5 py3k
+78912 b1b22c60222b4002ea70e3f7c0cce9528616de5e release31-maint
+78913 460823c675f8938bb1f54ae9e75c3583d517c5a0 release26-maint
+78914 43ca67bd700a698103a652ba2150c3fcded3a380 release26-maint
+78915 ad017d1b8072e0fa88d67b63eada43063ce0f80b py3k
+78916 5a6e897064d6bb19208591d8d5034a3e0e2c61db release31-maint
+78917 6d5abff7fc31398b1dfc6ebdc11cbff17e3ef610 legacy-trunk
+78918 d1edf282400825f1d14b1c8fe72aeedcce3d4b50 py3k
+78919 27aa46d0214abc00644100a398f1f5b71d036ec0 legacy-trunk
+78920 a7b58f1e8af085d8745db87c6d1cb4ca6194da64 py3k
+78921 b878a0ad4d8c6b4cb65da82c65d75a9290c1b6e7 legacy-trunk
+78922 51d26f31bce9552b622ccf5e0deff5822e5c71d6 legacy-trunk
+78923 e1d51cd315d0853416b6a2dcddba5f25ec2497fd release26-maint
+78924 32c5ad29663cde3742cad109bf0e0a2ed347b98e py3k
+78925 19e9660d9aa512fe346ba424f53557f91683ec9d release31-maint
+78926 e808fc548cd665c9a6142e508287b6aac4241729 legacy-trunk
+78927 0026e44362e57d04e5485b4ba3da1c46cfffb725 py3k
+78929 6774e8c6c39f384ce57b8f850ddb65de277116c5 py3k
+78930 859296a7092f0cbb6f1c12be12dcc3efaccad4fe py3k
+78931 e0a1770df5278612edec433b4115eb88ae116481 release26-maint
+78932 728ef0072daf22d89f3c8318ffb8d84bfc2d83cd legacy-trunk
+78933 2909a4cb1ba72f13cd503984374e1a7094102580 py3k
+78934 adc390e66890401d761f1774fc08b5677deab95c legacy-trunk
+78935 cc1321212e73460cbb1e5e9d90700f9f961a3980 release26-maint
+78936 d6e27fa22f42a266c66eeb638d056cc02ea1f81b release26-maint
+78937 5fe5a26e3169e89cda9580bbf89f37ff99ad6758 legacy-trunk
+78938 d3905a9f40f4059d2d5b97b2577d512c7ffebc37 py3k
+78939 0b457f149761db6aaf70c28de2505b0ef24e530f legacy-trunk
+78940 1a810ce13dbd7c43bc7b7323379cc45e1b7523f9 py3k
+78941 9696932ad8275e73fa97c5080a6eab11e6cae3a8 py3k
+78942 7a18c27628861654309adda443aac8b276387be5 py3k
+78943 d30eb422c564bf61a0c3d80d08221f9aa2042160 py3k
+78944 461b89b9555d0ca932c59f4213d1e285398b2239 legacy-trunk
+78945 f097f2ba23293727333a6fb98e5ac5c3cc14e60c py3k
+78946 768722b2ae0a59840790de15025dd577ba233bc7 py3k
+78947 372d1de86de9f8630de6886c9792e6038bc5598c py3k
+78948 3d680949f755d86ba9ae71234b531850240b7aa6 py3k
+78949 f1270e00f587876c3caf1aea5697f0c44304281b legacy-trunk
+78950 df8f81df8595ce5f94d4b53b4d91f68129f64546 py3k
+78951 308cff7df64f174ede869a36abb90e0f24357979 release31-maint
+78952 403d0a27bd56ee55364c7cffc4ab80f0b40939ea legacy-trunk
+78954 e7f11f44d51455f42cf2e878ddc14d8d53969cb4 legacy-trunk
+78955 77c71f258df7ca75f85b4987b53597726384a5ff py3k
+78956 5b754e882857cfd1b3345f4312dd88259a3ca8e2 py3k
+78957 b93cfafcdcad7c33cb953688d0e11156ad30ebb1 py3k
+78958 9cf702c91a9e8aef8493f3a5f50f745b685fb0bc py3k
+78959 e7b5fc8646abfa901e72a33ac398af9ed52ed769 py3k
+78960 c8ccb4e0c6fea7d3d033d2e7bd465988f2e5df46 py3k
+78961 c45f21705ecb79e341bfb4c393f1c57523b536b2 py3k
+78962 8a909e6d2cafa793efe47bb41623550037a3aa67 legacy-trunk
+78963 c16e0755fcd7d078d46514946566b0b942e1c961 py3k
+78964 b570c5b9b2ef35484367e561453019099db4bac3 legacy-trunk
+78965 59e223a05680fa291bfd33e3131c6741975a0213 py3k
+78966 d360f37a4b595fb9a34530575d1fe45e96d76288 legacy-trunk
+78967 8f1993b866f790214801c0cc181d4b30ab7b8c28 py3k
+78968 eefd521f19ce05f39f74b02c7192b6bf2a80cb0c legacy-trunk
+78969 bb06aa9183821d45227b382f97280ae0a96b02d3 legacy-trunk
+78970 08c5473bedcc393efe54f2eca51e11a8ac11198f legacy-trunk
+78971 e1de080c4556d3950004b643458baa4c0989aea1 legacy-trunk
+78972 b74f1bb88e6094f333b82c78c6d5a6bda22b1d43 legacy-trunk
+78973 adb5e928bde20f72e6561e0e0ffe0bcd2fe9755a py3k
+78974 38f2f5262b203ad56f10980d6a75b4ab0850ae64 legacy-trunk
+78975 37ad40a28d3bf40b9c7020be4de94961baaa8e22 py3k
+78976 95f21b2c216c08fdd96b1fb6509b0dcb1d8640ee legacy-trunk
+78977 8e38b7bef700042ff6ce3fa0af958b52e018ec41 py3k
+78978 db379a90b46e40402d450b04fb0dacb6fc690561 py3k
+78979 73e42c0f5c99e521fdbf1e8099c70fc3fcb90218 legacy-trunk
+78980 b8900a1d98353088c510ab161265daf44f574f93 py3k
+78981 a2dba6fe3fbe5a88caa22464af53677c2b310068 release31-maint
+78982 8aa5530e84073d88fbaebd3177e821aecc783972 legacy-trunk
+78983 eeb9bf1525bac8aaddc3500cce447c88a188296a legacy-trunk
+78985 c19b4bfb806aa8c1515d837f1d9c481d1851cc12 legacy-trunk
+78986 c4dd30b5d07eacfb3eaed447e85a9e115c677dcf legacy-trunk
+78987 59931179c5e2c5823d162d2760b7bc2858a7d4a7 py3k
+78988 79845e3d5cac21e5ea366d8dc6a1148bccfd3e2b legacy-trunk
+78989 9ffc8f0515cdec6084fe5ee2a81d375f068da681 py3k
+78990 923c8739ca86174fef9248d650e84017322a7b62 release31-maint
+78991 852799bb3fb13cc1ba75b48151375f71363150b5 py3k
+78992 42572e347108a2d1dd75395a67063628b47f6cd9 py3k
+78993 b4533b580fc9ec1a3da555f5ad838d648f13f71e py3k
+78994 74514000f8375d647999e56d63023ffe28f9ee51 py3k
+78995 661ca0b05a31e755bc31eb0ba2275416924faf53 py3k-jit
+78996 bf4a4acefb2f8708b389267694d79fb41c0f5e3d legacy-trunk
+78997 c966e6fd6178b13dd437e6c58dbeb6c58ec98e44 py3k
+78998 95b269c868dac945b1acddea6b443eee724afd24 py3k-jit
+79009 aa632943b8bddad112ea70a0e5eb496a5694be25 py3k
+79010 97b662b10ff8390e419174ccaabae646e19be78e py3k-jit
+79011 2e16c963401de03b069ec793ce02a21a72667b4b py3k-jit
+79012 bc65b86fae9462e7d8a6be8f93d11bd6edc7f0d5 py3k-jit
+79013 190eadaeabc52ad7dfd2530d7566d1e9a637b52e legacy-trunk
+79014 0f080961ecef131b04f2382f49a68a00bb6b8f72 py3k
+79015 3be3ac019bdb04e4390d196178b788d1ad5d372e py3k-jit
+79016 2064bf62a39f7868b3c3740a94d0523af1295f23 legacy-trunk
+79017 bac72f11a98c56c36078e2ede32b051a58087e53 py3k
+79018 30f283039e0e99a757d080303e0288b1ac45a15c legacy-trunk
+79019 4407ac4c6360be41f0beae7903cb496f2be9510c py3k
+79020 58e3bc21c2dd701eb42a575c7e0ab0561fd3930f py3k
+79021 706559d3ac5908ecaa7d470d8561665de1cd9baf py3k-jit
+79022 69c0d5ea2e1e3c3b470e8e46e3d78f03f823a6c3 py3k
+79023 5b888f590fe24cb234e126fc4cfbdca127cc7bf1 legacy-trunk
+79024 582780edd0e88a3bc6533669e050e57046e32d7c legacy-trunk
+79025 8038af1e20655eb633ce68b4190caac6f4148dce py3k
+79026 8a4693d517fecf1a3c84915707724063690be99d legacy-trunk
+79027 7f162a30949785d8be10193d86384d7d3e6d0d9b legacy-trunk
+79028 346582f85faf8847f5b2f5b1d91a82e5fd68354e py3k-jit
+79029 10b7606a93ed0391a23355ec3403f8edfc3d1dea py3k-jit
+79030 9b4625700251b74006cf245abcdf6d02d88ceb1f legacy-trunk
+79031 7df3e13d3e509e0f2b0998cc7ac99bd67167cca7 legacy-trunk
+79032 7409b5a7c81a6f062fe7367481d0f561830a7dea legacy-trunk
+79033 80dc4d131d85dd33120f9eaaed839f51ab68d283 py3k
+79034 b879209c202fd33388102a4e34986a525df6d4a1 legacy-trunk
+79035 52479e0454e90cfcec93e332a2944b066eb3f198 py3k
+79036 0ac19190a710fa7734cdfc6f4c3d63b4f37fb146 py3k
+79037 e3be1f1ad61ee1152ee23eb9fcf6412f893f3a8a py3k-jit
+79038 531d3023b48b7ced0348fd1063be8202d8920aec legacy-trunk
+79039 435fa215d33f08a68b69d85d301f27102d03f2b6 legacy-trunk
+79040 d62ca1eaccb9dabf7cd154c57d369a76166e8816 py3k
+79041 ea278d9c0b2aa33f34880ac82df1b22bb49c1c6d py3k
+79042 b1ae4f8377fb6e31e50da54af2ec4c19463cd95e py3k-jit
+79043 f7220ca11363c9c7ca3038a586b772145b17db3b py3k-jit
+79044 8555a4cb7c4cb63684f4494dbddd6e8d9b361638 legacy-trunk
+79045 15bdb94c8055cde9a01fb7702a26356a7f64d80e py3k
+79046 bfe9ee02f4c07e1cb716e02d78a3007f2ba5ac49 py3k-jit
+79047 a1b6a54e2b6a51c5357d43021f9cbae3a1bce477 legacy-trunk
+79048 d9ec4c8ce69542c5fa63eed00aa757a9ed38f0fc py3k
+79049 76f9e3b6c584e48c1d8c9f42109aa634ab37554f legacy-trunk
+79050 485fe20dab121cb46914df3afa5a5303b496174b py3k
+79051 429462d4ca0c200c5d223bab1766e2904d97cf79 legacy-trunk
+79052 46183bf4f1436905a95b91a88f0f9b983b38247c py3k
+79053 4656846a89b2675a2753cde71db3140c5867acf8 release31-maint
+79054 2cfa4497188fef4550b4d5ac0cce7ba3e65ac74f release31-maint
+79055 d1dbe5df1791f29186c758178fa70ce3b8cde4d5 legacy-trunk
+79056 87125d7647d685b13af76685b3c7d4acc21e6f1f legacy-trunk
+79057 d7b9e2941e145d7dddba1348bebc70316022062b py3k
+79058 25de7167a0558f9a3600238764039836041f6041 release31-maint
+79059 344cb6a4ef7dad7be471385c5d9f315b31e7301e legacy-trunk
+79060 22f589a8e3ab98e6aaad663f510fe6b04d181e7f legacy-trunk
+79061 3f4c7c4eef62af823b22cb6a3a9ce5cbc0f77451 py3k
+79062 03852eb08db1614688ca6b7150a6158a28e62d8e py3k
+79063 99af4b44e7e490390817a597a542546d749e698e release26-maint
+79064 16aab02ed99c67ec262b97a298f327a222c592f3 release26-maint
+79065 a5db0df323820943d694a60d9235fb19d56d41ee py3k
+79066 72a809d165f436cc908db17d99f9ffa0a36deea0 py3k
+79067 15b87ea1413d6e8020d3cc5d6076d34b2e6b3a51 py3k
+79068 e15a8a476494bb942ad8d42a31f51b1137863043 py3k
+79069 4f09d5b1475ffac3566031f067d787dfca6a2ab8 py3k
+79070 37b1b90de5c155d93b3a0285e23ff1147be9c4c0 legacy-trunk
+79071 eea72b81a23c65ccbf605b86da9ddc02f41ea415 py3k
+79072 96efebda4ea2c96d31eb6685a9decd6a1ba67c31 py3k-jit
+79073 fbc3f1691ad89d5c4838a2653fdca916f6af2fe0 legacy-trunk
+79074 0b1e522807f2c7b1dd171a708ff13ac321109b4f py3k
+79075 9103855b826bd4777244906664073d9899e245af py3k
+79076 b8b49c823fe445be8d8be22a35af1732098ccb5f release31-maint
+79078 a0a67c2fb7ff6e403990e0a9b21a1e4da08875a2 legacy-trunk
+79079 8fa1284ce00e590027a44e5e2f46081da412db75 py3k-jit
+79080 dd12f788a544df66f0919087f71e5d36799d9fe5 py3k
+79081 471d07d2a23f5ef7ed28baa92496e35ff80c3884 py3k-jit
+79082 a241e41588823e711bf1d3979fa2f46bffd5c079 legacy-trunk
+79083 d94411403093bb0bc7d829e69e73754187d246cd py3k
+79084 77f853fe3cf26143dea59823e8fffa505d146ee5 legacy-trunk
+79086 50e06b6ab9565df67a2eeb0f2a735eacd751693a legacy-trunk
+79087 d1c3abc8e0c29c60c76e6749b82d419f96be8574 py3k
+79088 791ba201baa9776bfc28c002423102e57650a538 py3k
+79092 4285ea33a5dfe521fbc01f6aa17147a01100b05a py3k
+79093 b9ffa9fd101b5b9c49c0382c652414bb9e3aa8f2 py3k
+79094 8a28be45c2423cbc105014e1b38ca9c58d62f662 py3k
+79095 5fbd9c6389c753ae2c1303959f092b6ac578b0d9 py3k
+79096 4b356c1b25f66d909bac32c0d1703c81cb9e6e63 legacy-trunk
+79097 00daa8b736cc7fc5b831acfbe8fcae9fe44e6e55 py3k
+79098 b6387f43cddbd9c3cddab8a0fe479b4ccf00149f legacy-trunk
+79099 91431b058478ec185867c75c8806d1e705aac218 py3k
+79100 07c7664f21a1899196514c8513c037c0d625cf77 legacy-trunk
+79101 2512c2ad5de705bb614add2fe6022806056abd42 legacy-trunk
+79102 4587e1f74ed85d128e528e77d31c63a480b5d376 py3k
+79103 2b1b0379718b49d772aad1635c7a64b948b1d70d py3k
+79104 630ce62c946ef47ac442fefcbd0a673f0e5111f6 branch_libffi-3_0_10-win
+79105 83a7689f1bb5d332ada9543bdaf550cfe540268d legacy-trunk
+79106 996a31920d48c090781a572e0e941e0693eb9871 legacy-trunk
+79107 18f94e23ca80a6747e59afd3305e95b6dc462711 py3k
+79108 3f9053598ca0d57b73fe91cfd4034fc38a2101ea py3k
+79109 a8e39779fedf24e7b606148f5908f6f36075372d py3k
+79110 2d683b8e3f502f860d1909f3c64a0b1c93469fcd py3k
+79111 4741f6dd7c69a0b2941103bdc57666a1498b2769 py3k
+79112 224591ba6a184f94dc21deab5ff7455ba21065f3 py3k
+79113 1e0d18e9f8c1bc89b2687c4a9cd822cb9bb77f2c py3k
+79114 0f00da6904a6578151aee202ae9afbdedba7d5ce py3k-jit
+79115 9ab07abe230db98b18d46fe2ae0ae28d7f94b6a4 branch_libffi-3_0_10-win
+79116 e43233d80064f583dcba81f5e976f12124c29f7b py3k
+79117 02e21576da0377390b4ba9d0ec52e81a25d0bd7e release31-maint
+79118 c3c7a3be40b3566e31b1295adb4b3f02f0155ee7 py3k-jit
+79119 acc3e3583fac988a242f985d5545d861a3d2e0bc py3k
+79120 9ff1035f62365ebf0d8ec5647332eff35868db45 release31-maint
+79121 3d38c0032ceaa95fbdfaa939fa83011534cf2d27 release31-maint
+79122 f0efaab043819ab5ff7d01f6fbd403667ec5f8c2 release26-maint
+79123 fe4115692f76c106c89b6a233ca747ecee1f2df3 legacy-trunk
+79124 9acb7c1560758197ef52e8d1fb59ec08fe8d1fd6 py3k
+79125 a5f796fb61a10264dac2fb22de6c6d8dc5094000 legacy-trunk
+79126 706957d6ecdff50a789b30e8b2980a7e0b4ac825 py3k
+79127 13ff85b10db0e57340e77c994eaa99ae7c583fe3 legacy-trunk
+79128 74bb0f62b32e7c72e6b0fca088e532a1fb48677f py3k
+79129 109c4e62ec235772f3dafa4fc2427c2457b6d71c release26-maint
+79130 5a55a32611644da9ccad43aa633819fd50b36252 release26-maint
+79131 0e3c10bcdba41d27b23dfc99a1a996b7b1712a58 release26-maint
+79132 a682b7087acbb3f9fe538ed895b7dafbf86aa668 legacy-trunk
+79136 180374bf2d529df345448fbb906e0d6f9aa000b8 py3k
+79138 37c9ab7d48f1f474fba9bff1e3cd6910e8047f42 legacy-trunk
+79139 6651efb75d9ea2a9b6ff57f3acdc8aebd87e2d9d legacy-trunk
+79140 e076e55834d9f21132aafe696e5175fa3a28c95b py3k
+79141 e523bc1c3034445fc8bf57f9c2950c121d2585bc py3k
+79142 e8672003ae84ff12a5884fb12fcfafe959a71577 release26-maint
+79143 85cbe44b3925f832ada070396a9166f607021198 py3k
+79144 63586592a3a06954e09608e577f7dacb7f918535 py3k
+79145 a612c8b61b4aa84a7f8ef340ba8a53cc58552234 py3k
+79146 f77f8501da7fab9444974a1df519fd68797ba0ac release31-maint
+79147 960efa327c5d9c18df995437b0ac550cb89c9f85 release31-maint
+79148 7c92681469f7bb45531a31d55896dd131cbc7c7b release31-maint
+79149 352d61a69f595ba489e9e7e0b4ea8d6427aa2397 py3k
+79150 edad948b4d66fab31b0234a41812c3944e06b0f9 py3k
+79151 554e0f435d08abb70415fabe75e18268e9a61fdc py3k
+79152 6223c3fd61f09d730fb80b06d356f7e814309f4c py3k
+79153 8a920a8909a08be390c428270589c2aee5264bae py3k
+79154 ae9e137411f1f38f2724554e19f5abb8272627ee py3k
+79155 d8700b4f1b9f5152506c6dae7a35155bf94afbe8 py3k
+79156 4f719be7c87585f5b157803fdb0004d0ef0dec55 legacy-trunk
+79157 e619047a2f36608ea96fe94325ee22e1f82b2cdf py3k
+79158 a9a807b7cd439fc97e44060e2f47f810343112f9 py3k
+79159 0e0632c543e4144f22f31d5b908fcdbae94ecf33 legacy-trunk
+79160 711d51737ee6be9f6ecaf4afb6b0592e5f5c7401 legacy-trunk
+79161 dbc5804e828585c4210343489ebf821f28d1a972 py3k
+79162 6b6ffd526e3be4ed99921ccb94d6e3c08ca87b60 release26-maint
+79163 a7b89f2ac1da6a5e245e793e0acb7ae98a8886b0 legacy-trunk
+79164 dcb9f4270441af7edb0baddf6d7591b08d58f79c legacy-trunk
+79165 c8c8401628049f97d8a6ddff46bd3003f82f806a legacy-trunk
+79166 7ddcf7d2836aac32a533f10631ae81a2f78ce9a9 py3k
+79167 3566366b89cf15994305e9d1767970362b59dd91 release31-maint
+79168 4bd1ac1132cdfd5059f78effd4539d754a82b3ea legacy-trunk
+79169 f0766cff7f5968eab38b898042ee89782b2d9a0f legacy-trunk
+79170 f857d4ed07747593687dc365cd99e8f7e9bba1ce py3k
+79171 10bd1d0f62de2dc88596631acc9c4ff6bf236f69 py3k
+79172 ea4e68928ff56b6f54392cba0e3c4564cafd417c legacy-trunk
+79173 1ae474c9c34e6bc815fb7765aaa36f5c6603f58b legacy-trunk
+79174 2c9e0ab3f0c7efd91fcfc37c209e7943b4340611 release26-maint
+79175 6a1254e20c8967be938e9ea8b938e2b932942a96 py3k
+79176 cb0e3726d91dab05f45d1303276f549b54ac870d legacy-trunk
+79177 31f0d9fcdb45c17e7d0ba69716fc7c71c6888cf0 py3k
+79178 ac962bc41e85fc933bf76ba76167ce920fb5059d legacy-trunk
+79179 bc5e0d2e179d0086eb1c169d24144183f29a6113 legacy-trunk
+79180 455ef7015ba802da08ee79617b56d109a02dd453 py3k
+79181 950c1030f816407f1b4b0314308cd740359181bb legacy-trunk
+79182 575ec773dda40cf883b6f2eff1ac7ee739f10190 py3k
+79183 2886f6aa5ef619a4bd165e7a33857b6948b0782b py3k
+79184 414044dbf34394316a4308f0e0c5554f2dc5e1a8 legacy-trunk
+79185 d4fa2eaab5fa8a56c03b3f02e4cd2175f89e519a legacy-trunk
+79186 c11f1cecbeb35a186e26e6ebbb5a3fce630146d9 py3k
+79187 c3b9c333301c7b7f6f5303c68c9953e20c91eee1 legacy-trunk
+79188 e823e27c225eaa061739a6207b1139cb31998286 legacy-trunk
+79189 dd68e04ee2e86234968667049aa15070df237843 legacy-trunk
+79190 620912f830826e95ec0008bd4868e38a268e9497 release26-maint
+79191 98e41660574c3ded3af60a8d7ebc39a07303cff6 legacy-trunk
+79192 defaad2017b5cc089e74fb8f4b91118ce1a9594b legacy-trunk
+79193 fcef4da31e245bd0305203fc0160ad06ffa397ff py3k
+79194 22c6a2764cab5ff80a279f46ecc68088f9c37388 legacy-trunk
+79195 63f3a94f5e9d50585f409906b442c267f992686a legacy-trunk
+79196 44ffb8092ed6290330c540ec1823107a28ef644c py3k
+79197 b25d1024f39468e439b94c6f788707ee480abbc0 release26-maint
+79198 c6f6be5317ad36196ba0f10d8e22eaf9d67ee55b release26-maint
+79199 8e41f1794d4495b8cb2246e58f803cb0e4ab0eb9 release26-maint
+79200 0fb6d342016dd5c8a26bdf28db87cf543c586ebe release26-maint
+79201 8f1202ca888e95bb25f9df74b15bdc2bbbd572f9 release26-maint
+79202 12e2075dbbe0e1f35c0078ead73f59cc898bc64e release26-maint
+79203 581263af5820fd1d64ab7e2b4517451658370742 release26-maint
+79204 8d8c9bf2a04e27f56c6a3ae69a19e4d44989bc9f release26-maint
+79205 643bf9ff228fe480d80cb22a2920f5ba14a2726a legacy-trunk
+79206 b9e27de85e4bc8682899d08f3b4f213a671d52a7 release26-maint
+79207 e062dd35714192a318e9c5210e3957acc358f2fe legacy-trunk
+79208 09aa872f79fc5f3f9e78b86e2a7a6c0a51ffa7ed legacy-trunk
+79209 ec84fbcdf7cbb519414c43343d0641c15f382923 py3k
+79210 93f720e9518adbdda680fb3e5df9957797614dd9 release26-maint
+79211 edc92bce4d6e2d93abf451bb9456ce9f3beb48ff release26-maint
+79212 cf58b73322f8c4b0bc42651a509069afa07cfad3 legacy-trunk
+79213 38e9b9da01642ebb468bbce023cb24fd8a4f2ce7 release26-maint
+79214 7598517b121807fab050045759e5fe70c0894276 release26-maint
+79215 64a02b133e723a94669840837542e2669253466b release31-maint
+79216 9eabba6ded0962b1a8e1e9532421d436a5bf205e release26-maint
+79217 45d2284cc063de5c93dd433bd5c27592e37187ff release26-maint
+79218 767811385fa6fdf786d6efdfafa75fb2dd764102 legacy-trunk
+79219 db961ba37cfe44469c68e522fffbe951efa6b23c legacy-trunk
+79220 ef1f388f483fb850016a6003dcf10aab7fc9e07c release26-maint
+79221 c694618dab543c2f870c1a260161e1d17020e0a0 py3k
+79222 c92ca8ba1d9750f6597072a8f59d1abe6b7cd672 release31-maint
+79223 d1398ff01a074b4c01947876a66dc098f2843ffe release26-maint
+79224 ac2314b5f962882556926f5e9179d71b16e60514 release26-maint
+79225 53dbd896c6c692f424c16522f0ab998424533427 release26-maint
+79226 1bf48a5ddead536335419ae15fbcd2fd8f16be9f legacy-trunk
+79227 f96c8293dd7f88d87be823f04396e326f3b579af release26-maint
+79228 db94aedeb0e04aa11be4f1d5617d1611f8bfe576 legacy-trunk
+79229 9f618750064eecdaed86a58d9dfe1e3a8aa75d95 release26-maint
+79230 0d1cdd14c9fa19618bea5f6cdad2799aa9798fb3 legacy-trunk
+79231 a0b6f28711e5ee83e4aa3a3a56de5e675594ac6d release26-maint
+79232 0c344827e048f269372fe623b0d45e9bd9651256 legacy-trunk
+79233 c7a6154460fbda9edb7e9a77083c0859f61a29ce legacy-trunk
+79234 92f2561741541a4181b0cd0cba3c4af82a7211b0 release31-maint
+79235 651a8e5c460fa9d20b83dea30e41a8d3eb363111 legacy-trunk
+79236 c073f3c3276ef3df4faab8bc93cfb891ffa9bc02 release31-maint
+79237 dbad1c0668c9f8cfd834c8f391b2b662f2d93949 legacy-trunk
+79238 7e3b490877cecdba6878458b6be4072aad6aede0 release31-maint
+79239 ec6a995ecfbf824b72bf61a1ed1ece944c50615a py3k
+79240 9714f8a77b160fb61ea369dd50f243c7e3d6a7d9 release31-maint
+79241 bac8a04270fcf163aab204c924de84368277c8b7 release31-maint
+79242 48f40a1785caaf2f3aea47e85da547c1fbdb8956 py3k
+79243 41b225067f4d1287653020cdfca3ab5fb2a54a07 py3k
+79244 d0bdd09856374866ade550d8e949485c56c131cf py3k
+79245 3833cf33ca617497125ea9ef2f616c9ca568d208 py3k
+79246 4293c33668df7d626e34f6b08860c38fdcfb501b release31-maint
+79247 c2d2e26bcf7fd25fe91a43f1cb8783425bf0002a release31-maint
+79248 67f3f7e5366bc7e3b9c156b1fa7d39a470140b86 release26-maint
+79249 a366d631a629a4aca607ff43a1a954d6f3accbc2 release31-maint
+79250 e16a27b552a6e344e5c4034d31896bd7bdcee073 release31-maint
+79251 fbacf972fa44e6956a94efa5ca2e232e57f410ba py3k
+79252 7e6d7151fde874ca6d1b3c0312ef89ce50e634f9 py3k
+79253 2d2f23872d90a10030ccbde5fd0ebd0fdcc171bf py3k
+79255 c53f6a3d2d3b0be417c3a55e9e739114aab3c867 py3k
+79256 13a448012a84e7d31e281ade0f950c5cce12f9de py3k
+79257 826d054690cb8da6a583c8bad555eb77a49a7409 py3k
+79258 d9b8f273ab8da6d160c829f8a83a0d0206a12eec py3k
+79259 90217a86642d07bae02659ab3d217abe996c323e py3k
+79260 7f816f6b5d0b0940741710c6a0edbf3e4a189541 py3k
+79261 5c092d4b499cf278cfed3566caf4958ffc5660d5 release31-maint
+79262 81dc02298614ba16d521ebff1b52eef45987ff2e py3k
+79263 2858cae540e411b820174b994898fda15e125790 legacy-trunk
+79264 f90973962eaf1c41c44ec4a77eff4dd5c0552399 py3k
+79265 84cc13a144ffbd5228a5060661d2a1afad9f9855 legacy-trunk
+79266 b4d8fa4d0049c3ad603c7f6148888367a8398f2d legacy-trunk
+79267 657d02a503fa5d563f06a1a864ac91aaf08d7737 py3k
+79268 eb0ff713a5e9c14ec897e0b6dae271c16b437bd7 legacy-trunk
+79269 37c0e28d1ad4efe310004d3e9c3d0abd142d34fb py3k
+79270 0161964649c38a64da607927ef38e300e2ffaa42 legacy-trunk
+79271 229f252bce7736e6647c3865623e5609881634ce py3k
+79272 106bee3f1fe51636e11a6c6093e85f2d2e7fc7fa release31-maint
+79273 8c3b120f25962dec0a6d6e93a1146c16129f1994 py3k
+79274 3dc6882a727d73a66d9e4d62eba6bb8770d2b678 legacy-trunk
+79275 76981ee50b482feb37dc83f969853070221b1531 py3k
+79276 2d6178480cc7126a7ecc4a267b7c62a3e4d3159f py3k
+79277 36e9f38e8a3c2eef2ef26acc3e457b20ce85a80e release31-maint
+79278 52cf7e65dad14bab261c8008393e9e1e4802ddb2 legacy-trunk
+79279 5b3a601ed205b5b403fc35218099a381ddcaf2e0 legacy-trunk
+79280 2b61eed28fae4e91d0b9a7965e618162741b43dd legacy-trunk
+79281 7ad5623f41321db45b5537d502fba242236db68b py3k
+79282 84405c22e4c7ffd989155d8f68fb031eebb53ca3 release31-maint
+79283 6151d09ce039493113dcf9ed1ec0910f97ce8ddb release26-maint
+79284 15de5390707da44694013165794bf93dfaab7542 legacy-trunk
+79285 96a241d4a0ab171261951f40738ef15385ffc08d legacy-trunk
+79286 e2a9693b555ed68512c5745f3fbdd6aef189d27b legacy-trunk
+79287 5f5d4736de74ad6dfe21e6a124650e2d90d82bfb py3k
+79288 224b70d3d1d44e5600a8052e86030e45010620fa legacy-trunk
+79289 c937521ed7092a81f72df2e8efce2b4f44037428 py3k
+79290 9fbe2370dc0217a8d38c09972f69b77e74f98467 release31-maint
+79291 7f435c385da25c4f5cc89c33b1748fb3b5bdefbd release26-maint
+79292 01b57515f19568407ba42ed8212bedc9ea53a269 legacy-trunk
+79293 806a8cafc9977af7f5b6763c5eec328a411c8e38 legacy-trunk
+79294 6df799a2c24e4a246e2f8736ea3d22a45bd81c8c legacy-trunk
+79295 cfc57702af7fd95b9a259c63c74515e13b523af1 legacy-trunk
+79296 767b0831659e027a69c6645a5150b0385bf11b1f legacy-trunk
+79297 f0014554166f93c3bd7697730afd2d589dd686e6 legacy-trunk
+79298 b7872b0e8ab241e379dd49577668fe160318aef6 py3k
+79299 73caa361f9cde14bc2a811538c9666573b3cc424 legacy-trunk
+79300 e3fdfdb1a8ff8fc6ad628f0e9842c889a9669dbc release26-maint
+79301 2e0d58adadbe0eb438a6d5b1bf110f0fd7cf040e py3k
+79302 1dc18412a7ee5f037dd1b0befe554a4ba17ca9de release31-maint
+79303 3c4dfe86ec2b64824aebb15dd724cf73ffa0d20b py3k-jit
+79306 0a123cded2c973b7b1fa9a1ff8f52bad31e6a277 legacy-trunk
+79307 80beec8fb7403f2069b20ca209b634696e4b54d4 legacy-trunk
+79308 5b679c249e3c1cd670ebd550e7711a5869177a81 release26-maint
+79310 477d36e5d91395e13d430b68d83e8547807a0ff1 legacy-trunk
+79311 8f016a801642f9f93e82ccae707e3bbcca635ec6 legacy-trunk
+79312 e00dd07056aaf3972dac7cf2bdf286d02e7e7ec1 release26-maint
+79314 0f42f34c16e82b10c333cddb2e80677985fc6370 legacy-trunk
+79315 65ff526e05ebbd5524fda69ad42ba0276e4b0ccb py3k
+79316 cd9848cf1847adb1ccb98512c56208ff90f843c7 legacy-trunk
+79317 3244efb6d88f88aaf1bdf6d16ee8cb24eed7c911 py3k
+79318 5435880713a783fa5a66a3f12e4ad887e4ebf167 release31-maint
+79319 1781695886dce887aa70d742e74ca194c33a3f5b py3k
+79320 684cd7381535a5a2091a8c4695dd207b2c5bd70b legacy-trunk
+79321 8e99b6000f0dfe33d1d9e5232b8abd9a9f227a26 py3k
+79322 a9db51cf1fbc4dedd36fadf96572dd31d6a88864 release26-maint
+79323 f428f66f7e9bb66d09083ccecb71f07798a99100 release31-maint
+79325 12ee46435d0171fa090b8751f0973a2d2f7d3e3f legacy-trunk
+79326 fb3da56d548f0d2882a307d443f8e147bfd70a1c release26-maint
+79327 92c9324625b6a5a001c0c863e6a829f3782df222 py3k
+79328 8e76e46c19947578906d7f44f67411a7f94d8939 release31-maint
+79329 b01eff4effd7efa42583d4e003e33f82a9efe8e2 legacy-trunk
+79330 fa5e299ce091c676f0cd2aa76a4944aff60e7033 release26-maint
+79331 a702648c8f410493c2af406d01139b2e2dc1bdf8 release26-maint
+79332 3ba237a326c27b9cbecc304dffc54758330ebd61 release31-maint
+79333 56dd5d5070a5a4541c7e59eadd2fa5adb38981ac py3k
+79334 b0eb9f6f2d10b1f3295b68e3441ea6bc32042a7d legacy-trunk
+79335 f20e8b91f6e8da992b1f1a77cf5743e7474e73b9 release31-maint
+79336 102623d6843fc491d1dfee16f27f1991f7e89192 release26-maint
+79337 6e1dad853007a2a34ebbf2ef50e23f876ad1d242 release26-maint
+79338 66595d484ea8d5fc7764061d8283f05a10037fb8 release26-maint
+79339 4986cf0a91b8e9cbcf4fee6b495271cddd03ac5a release26-maint
+79340 e9b958e8391bd2e3484a8acb171a9b6b24501344 release26-maint
+79341 1556e697b2d70b1a3604e262b1381d9b2f9938d4 release26-maint
+79342 f84f83963a78ad6434386b1695bc44b513499999 release26-maint
+79343 27f97244698eda060925394ceee13c55d3da57ae release26-maint
+79344 b214ca8eb6bd0abe5f11e03e5f5f5e154e862b69 legacy-trunk
+79345 52d845831ae864e00d52d2b905ee2537b0ff1728 release26-maint
+79346 289006dc46ee24b4662ba14af9f189e723c00eb7 legacy-trunk
+79347 81b7509240916edc627e7123d1d6f5538102710b release31-maint
+79348 988e0457e313396cd51458a0bc4dfda5b29655e5 release26-maint
+79349 7201181360fdf27d0d15c4354b75524a24cfb76c legacy-trunk
+79350 37da9bc461742fc4e4068d8673acf9cfb629559c legacy-trunk
+79351 cc8e36962bace6c539f225c11085e831965403b6 legacy-trunk
+79352 976284849e9d81410ce064b19ee1fd5bfcbd6e47 py3k
+79353 d60bfb1b9c052e73e84037e1a8bfbd9a181d2363 release26-maint
+79354 e91a086b41783e7374cd5859bb986d9d849bb7a4 release31-maint
+79355 5aacc7680d3f72bff2c6255e7e5c9bd121d869d7 py3k-jit
+79356 44696482ac42abce6b8e8a4945a9e6d870feb844 py3k-jit
+79358 1e741eb30b1704a3536d86718a4c166fd4f466c2 legacy-trunk
+79359 657e7d21305289cc401bde2e9bcd744aecfac32b release26-maint
+79360 505cff125a03c6997a8587208fef9b0075d16f34 py3k
+79361 0316e6a28a5535871b3ab7c5359fc6be7ad30fdb release31-maint
+79362 de84a6d0e6970c0e890ccd579ab6eb1f748f12a2 legacy-trunk
+79363 4bc8f9653e8e2bd73a70d19aaf922e905a40290c release26-maint
+79364 5993da6d24095151a316124fca774d5b5e725651 py3k
+79365 1957c28942925bb8deffbaeba0427656bd6649ef release31-maint
+79366 03eab998b07a15a2678da4d087a8661fe12530ad py3k-jit
+79367 62fb086a397582a206ffe0705a58bdab0c707b26 py3k-jit
+79368 cd0ca56b7880e8c45fa49667051dd6dc79c9558e py3k
+79369 23da56607b33faef902e2a94233c3dbf4b072dfc release31-maint
+79373 d8f855333fb48b986523119bded47b4943c6e716 legacy-trunk
+79374 d2deaa70fadb45cc401749cdf694b132ad21cb6f legacy-trunk
+79375 0abfa2607f54eb8657e32df5329415fd8e2d6fc3 py3k
+79376 934cbe73680372ce2855a298f724e1822478ecee legacy-trunk
+79378 532d71420f4615585244aedbd93bc557b090c5ff legacy-trunk
+79379 229ea8ccc553075c6447fac269ddb366e17064bd legacy-trunk
+79380 83fa4f89956882f5eb07ca65268970df4b8201a6 py3k
+79381 179c647386330b18bd236675a9ed20bfa13976b5 legacy-trunk
+79382 62385d9b7da0438c8266fa25e0904471bc1277f4 legacy-trunk
+79384 7430fa7eea8cb9f900413e95465d01b525fad1d1 legacy-trunk
+79385 4ceb5dc35cc65a64fa94bca1c73e645f4a5958a3 legacy-trunk
+79386 cac661db7795f19c6bf0b7f1fee77e958d6e8c99 py3k
+79387 496d76360763945b6e12c981b9c5404d31f54ae6 legacy-trunk
+79388 2e0813d6738dbf4cae6ab9dc3ea6365d255bb7a3 legacy-trunk
+79389 7251e737a5d8cabd6dbf724a14b9f37a1c73885e py3k
+79390 9caaafd599d65343b14f03eb3fe15b04c13988dd release26-maint
+79391 c3c34f847998a006657760d076fc8be82688e7e7 release31-maint
+79392 4b8decb4572cd702e8b7802582933991812173c4 legacy-trunk
+79393 e8b08d773e785f872d25ccc086d4d1a480cd15d1 py3k
+79394 030962092373e954295e90c19addb7855c0e9678 release31-maint
+79395 248a7ade444fbef54f15b8c45865c6713005b01c legacy-trunk
+79396 ed9a3dbc312e9b0a52b6f82e720cdad53100cf79 release26-maint
+79397 d11fbc796499a338d0402b889a904da954138c39 legacy-trunk
+79398 d6893c70df6a47d181ac57c3b686e5584dd5bc00 py3k
+79399 eb1b6468e97746f63097f2f806a3c9e99be3cd6c release31-maint
+79400 5d54692b6dc3e3e3e9d4c0968cf22f508371163f py3k
+79401 09a7a19e7cb9b0938f02e097ef57c4173507e81b py3k
+79402 3b4e9fa9c1e8dc1a31a44c89e75686cc7237119d legacy-trunk
+79403 5f9a7064d62aa0059360301453d8912358650ab0 legacy-trunk
+79404 4ef65e2396ae9a5eeac44ed74255edb9767da09f release31-maint
+79405 4f841df8c9766f935e99374c3b4b80e7067e16d4 release26-maint
+79406 e5dd9f986440c882fbf4c0e99e717a58ef2d8fcf legacy-trunk
+79407 0dfd62076ded41e209f58341a64076f55e147e29 py3k
+79408 e1a84f221537d3b3675382f97ce1daeb4255c9b2 legacy-trunk
+79409 1aa684672ce6fa66b44399504381f9e32652150f py3k
+79410 e18d38201280577e142f48137023e99d377ef2bc legacy-trunk
+79411 c99c379ced2fc05f29727ba26f8a028fcdfe2a1a py3k
+79412 d6ca9cd1b411e6511011a5d91e7382bb7e1a90c8 legacy-trunk
+79413 7329312fcbd7a524dab03bbabbb56fdb970e78a8 legacy-trunk
+79414 fcc10833a1c9b5a5f0eda93ca99ec7cfd8518614 py3k
+79420 e2770bf32dcf68397d2c5cbfd6a569c179906a6f py3k
+79421 938284cda15bf58122203eedf7d9017d47e24233 release31-maint
+79424 14432724d0fe7faaba09923c7ce22af931e04a0c branch_libffi-3_0_10-win
+79425 e6b9ef49e33f9f3b11f64779d7e68d4893895719 legacy-trunk
+79426 e0b8eca2252935969e2db47ef10cf3910cd9debe legacy-trunk
+79427 38e410050dc7c15d5e04b0ff28df71d543cef263 legacy-trunk
+79428 16a7d32605bb832da0b105248d4e7b3292d4e5b5 legacy-trunk
+79429 1a0e217063b75428c7ad20d0188698db05f14001 py3k
+79430 8701581fb455063737c9b10eaa635c4431477a9a legacy-trunk
+79431 188f860759c1404883960d3c7ff9a3aa11acc49f release26-maint
+79432 d8187ed9432560e373c4ac9252d700ef033a2c61 legacy-trunk
+79433 b90722d3aefa0bebed66fd6b7e5c4dd4bd977280 legacy-trunk
+79434 82637e668ca1ccb6b41c0a02e1d40446f636567d py3k
+79435 030d6bf1d9956f770f981cd2fbc6d7652c761c4b release31-maint
+79436 95a78a2d700d80cb807394368a37a8ed9ad54d2f legacy-trunk
+79437 9421f67b6c2a1460b5aab3a0403e6944d5f2d572 legacy-trunk
+79442 20baf63b094cd0bd6729e41606be3c1ba79be8c5 legacy-trunk
+79443 2ecb8e9960fc3a871b754226608c032f76420329 legacy-trunk
+79448 c8ecabbe801699904b11502776a2414949185bb3 legacy-trunk
+79449 e407eba8e38d449f8183293be2952ad2bdff63fd py3k
+79450 acb1dc668a97bb8e4309f6b19c3f5e91ded06292 legacy-trunk
+79451 4bbafdf4d5c1bebb2a2063c10c13fdc804480e88 release26-maint
+79452 660b9f24edac8e3715949e76469e8d56c370e32e py3k
+79453 526bb082c05525c93fff11b12998ded453b2b0ad release31-maint
+79454 564169151510cfe91fbe0b87db2172d3714197b1 py3k
+79455 e5fe2f625983cc6f3f31bdc98f31bacb162647b4 legacy-trunk
+79456 0f6a0b1db4e2b1ec0b7c9495af1eea1632cfc932 py3k
+79457 b227db9a0029744bbcfb12208eb078670f911100 legacy-trunk
+79458 8c5c5e86fb227a627b68e0c077839ee1169da804 py3k
+79459 0e7ae53b4e79024ccae6a33daac97b269157b795 release26-maint
+79460 e811aa094f1942957e48db689f2718b223a9f976 release31-maint
+79461 9170aa944f293345bd6f8da76c7aa019ca4deb5e py3k
+79462 e1183a137d8ca8f4d7b15a751d5d681a41f4cde4 py3k
+79463 ab307f7defa1ec79d3b6a6d997a56583e203812b py3k
+79464 22946d00eeccef7e46c74deec3e6588aa6429087 legacy-trunk
+79465 f96ad800712ee61f4aa1290c5963812cb6e91dc4 py3k
+79466 86b71f40e8aae2704d08f5e6e7cb72cab0f4d9bc py3k
+79467 71a45ecc4dc911ed03ba276b320f3dd7a3f0e2b1 py3k
+79468 309e2d3e8dcc21ae70d348f5b050fe8f6d9b6ac2 legacy-trunk
+79469 8e6a16157faf1bdf544b4567548e2eda3d9efa9d py3k
+79471 a2aa6ddfe8e2958aca6e62304f58014a3a922f33 legacy-trunk
+79472 db5a3a277c0b580ebf51fc4a319201d06d0c59a1 py3k
+79473 bb2ca1b63321a78b413347ad8f4cabe0e4ce94a0 py3k
+79474 40f787b151ac6c0535a7356e1fd26451e6322636 py3k
+79475 2b6321915e92b61a6c869e797408d56ead9d63a2 release26-maint
+79476 0bc04525af638bd004b110455cfd532d633bd144 release26-maint
+79477 60009632ed119f7bdf39985e672bd5ca59d6ec80 release31-maint
+79478 8ee2bf821f626713f98bb49d7bb5d1044391e8ad release31-maint
+79479 e63d4678fca73f24d42e1472fbb6eaa56918ed97 release31-maint
+79480 bb8bd3358bca02ce5a701bbb6a7b6481ca02e82a legacy-trunk
+79481 bea75ff651146daad002d41d878976756e52bdbc legacy-trunk
+79482 d49352426de51333d37e6651418cdfb30009ea6c release26-maint
+79483 213a0ae2db65b2e25199e0105b42e080819bc761 legacy-trunk
+79484 2a310a448a0a7e20145c2bcd891db8687b30aa2c py3k
+79485 51b2af9c469eb4a9536cd09db0b281d1594aba09 release31-maint
+79486 2d06c6c7e7327debdcf6face1fdd095ceed88fde release30-maint
+79490 bbb340501f29fc0f336604137f1539a3f016d32f release31-maint
+79491 9b9fd299072d8fcc384675d89bf854ba5a2a66a7 branch_libffi-3_0_10-win
+79492 c3c82d8040d6f4ef663bbd90a5e65e88da11efce release26-maint
+79493 04cc075bddf5bb9963ef520542af7797c2fb517c legacy-trunk
+79494 66e757d8ea934ceec1d6b7079594e60f341deda5 legacy-trunk
+79495 7739aeefdbc0144c69db976f92a93e1039a796a2 release26-maint
+79496 c96d278677af3cd08d8bdc0c48d662cfcdc803e3 legacy-trunk
+79497 3329c05e6e319379b88ac49091e405d77c15720c legacy-trunk
+79498 e4e4bbd39a213cce8cbed79a74a9b2e3074acc30 legacy-trunk
+79499 40a2e7ac8a47e22a0156375e9a6b6258b978bec7 py3k
+79500 a14a205ab1fb84901d5be6e1fcd6511a4cd8dc62 legacy-trunk
+79501 bc6814c34d5f20e3e95a490e5da4a6f3cae7d5f5 py3k
+79502 f69769ab0eb8166735e55d636d69189c47f932f2 legacy-trunk
+79503 5e0ff65284fa2089b04e36c61b21a223736c21e9 py3k
+79504 1d0027d34a51e21c992284eb31546b75d91bffc9 legacy-trunk
+79505 1361877585f2c491ebb0e07e6a0540c92c165a63 py3k
+79506 bf3c48f2417c44713d4348098c0ae1a78861a698 py3k
+79507 ddd550951b83fb170b01de7f88f1b733d1a85a62 py3k
+79508 4dd6eb6be82fd52f0be768fd36e78521e84c1a8b py3k
+79509 63269c4185c52e69d657f2cb0ac45cf1c401330f legacy-trunk
+79510 0c02584c4e534fe7f385c181f46300f2d09635cf release31-maint
+79511 a60954eb518b9849a9273244802db21e12335c52 legacy-trunk
+79512 9651c84c520d9e8ba5dc93345e5efea4e6c9e581 release31-maint
+79514 60f9124fdeac051089ded80e1e8184e29ba2ef95 release26-maint
+79515 419ff7024478389e0ff5086ebe4f5a46ac1ec959 legacy-trunk
+79518 34d822196d8bd0d6abd08618b95d21257d206056 legacy-trunk
+79519 ef6ebc06a786dc00a3891f7941fedf078d239256 release26-maint
+79520 ffe7c791b5b94878f4aae3e0d77179b4e17206c9 py3k
+79521 1323212da154004afe72873ca6f046fa5a5ae94c release31-maint
+79522 5e9eadc76e87ef7be6d2aac41eacc56ffc45fc07 legacy-trunk
+79523 cad126428f48d78b97da771fab5d4b762d89c88a release26-maint
+79524 57d8d7f317f501b4155a99452121a328cdea956a release26-maint
+79525 fd5c0ea2870bac4b0d1c9299f02cbe75c4ad07d7 py3k
+79526 e4f969012e683cae2ed89182c6e513b81f4b82b9 release31-maint
+79527 d57cf1aa2dd4d00c3c370ae3dc597a8d006324c5 release31-maint
+79528 99e523132aea43d78a764e104c91c6077941b450 legacy-trunk
+79529 87bc0f10870213910729e51b33094b2aa09b0294 legacy-trunk
+79530 a2e627827bf3509ab4a6781bffb6e3e852730110 release26-maint
+79531 01e8b13fa99a565dc5a9ee259f01238ce6461672 py3k
+79532 ecb9a6609bb1c54509bb8c8f1f77a38622f178f5 release31-maint
+79533 5920f9a5e22d8d33c11244b815fe2228b530f926 legacy-trunk
+79534 832022f63bcbd6755408818d8a61b6fa864b33a2 legacy-trunk
+79535 7b8ba019cd15b520987a38159e3dbeada4ce8c02 legacy-trunk
+79536 4fcaad3f669b23f6be3a70619858ca7e8fbe5cd7 py3k
+79537 570eae1481eb6011fc09fc2bc37ec44ecac2a8a3 legacy-trunk
+79538 c36f23da88c1aa543fd6c46ace6a9629be3e5b2d py3k
+79539 3748bca4d8698ab07c760841241cb17d0d02b78c legacy-trunk
+79540 25a7ce02306cdf1d3c12b9ff287995b96edbea4d legacy-trunk
+79541 d00f2ea25d20a41f246d6680f5f31c7c7d323bef legacy-trunk
+79542 7b67c342917cce691047a7a500bc01cb87bedf42 legacy-trunk
+79543 13a8112eca52fc3cf4c8de6b9c319ce9e81213aa legacy-trunk
+79544 a4dad218c6e345685d75a72a41a97c3b255cb47b release26-maint
+79545 1e2c9fea7cbe010a6ddbebf9c3163df1ce4ac386 py3k
+79546 5cc82cce45215fc7e7f8a31dfc92f3a0d04eab67 release31-maint
+79547 c7965bd5d2004e2c7f3329dc284b6c5480132364 release26-maint
+79548 6de3de3ab71f7536a8a108fd65aa419d07c52be4 legacy-trunk
+79549 882d681d50a004eec446a8274073782411d31a57 legacy-trunk
+79550 54b0a6f75ed579506d6ba0c851c9d806a391a34c py3k-cdecimal
+79551 78e2097792beead1c82c9499e13909ea9251b2fd py3k-cdecimal
+79552 fd8fef6afefd8cdbfd4ac25522c885a700858911 py3k-cdecimal
+79553 e95f8755ff1e3f6634f2be7c2a55c19e3b2e7ad0 py3k
+79554 b4deaeab96e78d3dce2356393d5797eb91b6d5df release31-maint
+79555 6df6c19fbae358c45818f33e830a62eb33213f23 legacy-trunk
+79556 04e775b33e9e2a37ec5b23554a5d314988a7b713 py3k
+79557 96201f488cc3ce284fe00bf9ab2f0d373ded2f51 legacy-trunk
+79558 a404e3702f79f28c02c396ec56ae613fbb8f9f04 legacy-trunk
+79560 c8a601e744cf68830dd6430f6237bcaa6e571d16 release26-maint
+79563 f171712880c8ebd2f4506381653ea9685be62925 py3k-jit
+79564 6d3415c15b8bf9208bc48084e37419c9a0e7af00 release31-maint
+79565 1bea5404e087c0e5fb5380701ba94b9ca8fbdbf1 py3k
+79568 512b80250789b7728c15eb0183ff27ea5b714908 release26-maint
+79569 2478c38feff749f8e6af5836d6a7b47a675f37a4 legacy-trunk
+79570 5bad818d14f2873f3939fa7b36ff68af15d3bd25 release31-maint
+79571 3f4482526f55a268787a01d278b35f4869cdcc7f py3k
+79572 38806df05d09d6def8c647784b8a934938489b14 release31-maint
+79573 4d9d9760c88bef6d7023377e4c24dd0cd674886e py3k
+79574 415c4bb45fe68774f4b08d586e878715f4394df5 release26-maint
+79575 b6473154a70bc3315ee5a73ba76e0e4af42418d2 legacy-trunk
+79576 eab361617f6a7d0419da48c913162cc32201f54b legacy-trunk
+79577 bac4b289f79aad5306c84666813e67623f806277 legacy-trunk
+79578 eb9fda90da6ed84d547cb9c59c631d67e32724b1 legacy-trunk
+79579 f38919bb26cc7119fd5a89dc27c3d65f6898dfcf legacy-trunk
+79580 7a4a0c69e3a5f23ff27bfd723cb78a11bf337187 legacy-trunk
+79581 b57da4a4a3ed95ebd1eaa6686ed4e3a92e332d09 py3k
+79582 e81ca88d478cc5583219e3fa63b29353d3e6b3b5 legacy-trunk
+79583 1306033d8ad2ab719ac839c14c822f6935065ac7 legacy-trunk
+79585 e35feb995bd96c450b2a0d3ccc2c40c54eefb229 legacy-trunk
+79586 c5b20645e93350c742b8875eefddbe0c27faf1ca legacy-trunk
+79587 f77556febec820cf203561cebf3d93a7ed2099d7 legacy-trunk
+79588 ae7cf578de5adde00396f5d5cb3969057aec182c legacy-trunk
+79589 17f08d65cc0d81dd4742d5bf9d6bf7e55fb4d700 legacy-trunk
+79590 57f4c99082df56097163ddfb07a7c0eb9a74805c legacy-trunk
+79591 48fd69c2a2b494f2b10b09d85c3c67b61e031500 py3k
+79592 1df34fa491bda04b022b56c2faca5d626625b153 legacy-trunk
+79593 d77e38460e3ca7d6b2c8deb90e2bd89f9472347d py3k
+79594 4b55cea5506776fad88ced3801530075c3bc12b0 py3k
+79595 5149d484d56ac81db75dd1f358ea5495588fb8e5 py3k-cdecimal
+79596 20497d85e0112ec3e4c81feb154f3b32901fe71e legacy-trunk
+79597 3f1d6ed480dd81b0433b471bd4a70a144fb945a3 py3k-cdecimal
+79598 e8052a60bbb7b6ef32f0b704ea7d42647d5f90b5 release26-maint
+79599 cfba59c383415c292a56410341cb57146deeab1f py3k-cdecimal
+79600 870ff6220a0b99b0420c3ce1b66fe32997d38b30 py3k
+79601 2778583be21d62ceea84f3e0885b5d750d7c21aa release26-maint
+79602 d1101aa984c075bc7dc6ee29dc707aeab921b072 py3k
+79603 4ac05d1f60c18068b648461934ea0139647be892 legacy-trunk
+79604 66db03a707679c69a7e7006cc4235f7bb2d8899d py3k
+79605 6992467bb8b59c6310d4b51889a5ad609038418c py3k
+79606 43a837d2728a1341f046f0191faf78e472d7b584 legacy-trunk
+79607 1ff8dd67be8227a7700f882d1c15bb25a117c565 legacy-trunk
+79608 2f5dc2fa0e56a25101b30afdfcf4c0538368b3da legacy-trunk
+79609 cca4b72f450b6478672a88ded99ea32148b8f6f6 legacy-trunk
+79610 255a401c19b05aae6a62fa5029212923e2e777eb py3k
+79611 efebb7bcae8b164b0251053c929b20d7bb5545aa py3k
+79612 b4796efca7164fffcc2ca2184081375b03b7bd92 release26-maint
+79613 a1dabf4e8866561bb5757f3abc64ff08c886eb56 py3k
+79614 7dc8b88bb15a41e4b66eb8e9e23f386a75b04628 release26-maint
+79615 8d7317c924cef824269eedd21e5683834115809e py3k
+79616 eeea34014c802686d56be1824901b0b84e6d2953 legacy-trunk
+79617 278e7ecc0f77ef0de623a13b333e466d06642642 legacy-trunk
+79618 9d50bcd3f0c9ca85b782e348e4d7c9685eec66f0 legacy-trunk
+79619 7c9238085a5ce0a26e210a3552396b0d51de09ef release26-maint
+79620 377b26d876e0dfe7ae591ec6ed6de3f0efe4acd2 legacy-trunk
+79621 53afcdc9ae0abc6910c35c25102f8bc175ce8f37 py3k
+79622 f76c3dec858b7b9c851037fed87aa1d3bb99f5ae legacy-trunk
+79623 70b7e4a7f7ce20b2e77113363b79e9caa75350f7 legacy-trunk
+79624 aab64283d00a1fe6e443994b2c391047b9f41d92 legacy-trunk
+79625 84ecb35a06bddf6ca186c692a55878e367ae3efb legacy-trunk
+79626 1b5d5e74f738f41a4748dbcd71763a63716f0007 legacy-trunk
+79627 f0bb10ce05c7726670c513ece44015f0a2431897 release26-maint
+79628 aea319ea26a8e90323e3c517832eade613a4f77e py3k
+79629 ffa0aa70c74683f450b8fc69dde4f3b1cb3a1ea9 legacy-trunk
+79630 765943c1115b95bfda3c828d5b0de1d698a0f051 legacy-trunk
+79631 c34ddca36786c1c4d7185ee31b9ec759a9690549 py3k
+79632 5462c5a91f8dcb9dc8f43f51e288b4bd3b1670db legacy-trunk
+79633 0ab89e8bdedc5766de217ca247e8630e200a652a legacy-trunk
+79634 a7e9f8e3553f7ca569731c0a4762cd6a5d0dc1f3 legacy-trunk
+79635 d4799ee64c23b1c584b224279dde1f37d0f77e0d legacy-trunk
+79636 4877c1159153f5efd99dccc5ab8d2f77b3e4a48d legacy-trunk
+79637 4ed04a39c0a91b93d56af6ebf511f34e0d759062 legacy-trunk
+79638 5496503b8b1abd72f03d48658f0622c9d24b6c8a release31-maint
+79639 86f6997660162cbdda0192c3ec097908724a69f1 legacy-trunk
+79640 d3858958dff53e62435221ab19587d530e982e31 legacy-trunk
+79641 b529a142cc49e6f310ab7462fd2ff2261b5b4c40 py3k
+79642 d334a7a5684498ce7ee959a4800b60301981263f legacy-trunk
+79643 ebceb77967de86348a12fae003946de2990c9165 legacy-trunk
+79644 6d4835a81b632ad020f6b0b8d48b61addbfd03ae legacy-trunk
+79645 fa641d60546884fd9c062119fab7daeb74c00d72 py3k
+79646 66b60a6e819846f6be0ea679159fa0bd6c5d76d2 release26-maint
+79647 a88e0f6ab945a1669313a4a20ab85a13c6e995ec release31-maint
+79648 89e87ba8ab4e0b0f53164ddb21b3df1d4d811cfb legacy-trunk
+79649 6fe5dc175c264df2ab1225387abd90efe5a9b892 legacy-trunk
+79650 fdd0137432f853739f415f7850dbcb9c5f8296e9 legacy-trunk
+79651 5ebca62289036b37bcb7fd4e08b4897da1215467 legacy-trunk
+79652 50b2c0fe5e27b39c234c19f2e33f9e2a38702627 legacy-trunk
+79653 154dcfa32b201aecdab76f5fcec3c8d8ea62cb3c release26-maint
+79654 a707ca260341b5f6f280a7254ea6a88418d6fe5c legacy-trunk
+79655 629e7b3c8b2d976dc70f64e3c7ae1b975424251a release26-maint
+79656 ea4c6c06895009d0e03f973a0270626f83bcecae py3k
+79657 658b39e66defed6f6def7c6e3321e22e221cc12d py3k
+79658 d5f2c7425b4a947ee851bfd54c292bf9c8ec6dd2 release31-maint
+79659 44d32a6c9e357a33ac62639a799301793450d045 release31-maint
+79660 da7b0006a7997e77b5d78ff3c83ec8e5668e9bed legacy-trunk
+79661 ad94af9129cca3ddde62688258443397da22e12b legacy-trunk
+79662 7ca6a3431f9e27ca114ff7c43b30c4ec18f3f859 py3k
+79663 e47a6ff5b520f0d1e53d80c4d3eea095e0b7382b release26-maint
+79664 2811be95c8c8448aeec99b6e86cd26fec5078dbc release26-maint
+79665 c54dd3eeed56b3f2cee0eda426f3bddf178711b4 py3k
+79666 8c8bdc11e9b9929c55117cb8891cd5dda1ee18b7 release31-maint
+79667 1d484c4dbf604cdbd71d8d7cf4d0619e7ffb437a release26-maint
+79668 5078220bd1ea6320bc279fe1597e971df3829c90 py3k
+79669 334d4562c875a9021579d4ecae567b39061f6d16 release31-maint
+79670 cf80377184ffaa6864431e3540c9ceb6b1eaa031 py3k
+79671 c2b217fe4ed45481eb692eceba8922bfdde8b506 release31-maint
+79672 c0b6299b93eebe866bddba8774d2bcf8ebefcb72 release26-maint
+79673 b1c00c7d3c855d51726476dfa56f04b2868a6f1d legacy-trunk
+79674 0540a96286988a4daa73412b9d377701687bafd1 legacy-trunk
+79675 cf34fc1e8413e17c97fbe9d303d45b39f348acc3 release26-maint
+79676 b1941cfffa5c85161fa22030b9e012d3df5043af py3k
+79677 d31e269aacdebd08249370585e8bbdcf83eb25e0 release31-maint
+79678 a66545db3b0698a9917754b6a3fa5ffa54001c01 legacy-trunk
+79679 eb049c3c083fc82143643a02bf24122eb7787dd4 legacy-trunk
+79680 27451a9676500d07467f87b9cb2a8a8fd9d87312 release26-maint
+79681 53ee38e638bf90e983e8af9336ca7b6b554f07ee py3k
+79682 3b1d0a3adfffae749dce288a1792ed97eef8cc8e release31-maint
+79683 bd5121bf6996d0c3e9e15b77e1412f7141048305 py3k
+79684 ba482f4887f7d6802c2e816717f19b3504e90f26 release31-maint
+79685 a584f243180d52a6d6c22c103e72dd7733da7679 legacy-trunk
+79686 7d272488b63c9a42f238eb771dd2f92635b7520c release26-maint
+79687 580f2f5ba85f3651816813ec773698b2b5b7bb68 release31-maint
+79688 9b24aa36c06f83e3bb41fd7f553ded6c3f743ab1 py3k
+79689 d15235d2137c148581d29649f2f2792d94d95c07 py3k
+79690 ea10cb61390aea20fbd968c035dc52f1508e4de2 release31-maint
+79691 4a6e2013547068f0770b7bc2682bbd064b80b7c4 release31-maint
+79692 c66995befe42421b56e90af347a4ed4159c749b0 release26-maint
+79693 b62a682117e00f385290a5e4dacb85edfeea4958 legacy-trunk
+79694 3527d6579ec290fd90d9b4fc47e6a72751fe45b2 py3k
+79695 d5abd8dfd4f4baa0abfbc8e62de95314d5af9712 legacy-trunk
+79696 06a46f95194ef14151cecc6561bd9a69493cbcf5 py3k
+79697 8ab960b611a6f1b91bec88ab31b90fff28612432 legacy-trunk
+79698 39efd3fc59efa7f08c089dd204184fb424052bf6 legacy-trunk
+79699 87666376d8b050426aef953543588c7a8f43d4da legacy-trunk
+79700 40bc8b1ca932989f7a1f77b2a2b1f7b576bdaf89 release26-maint
+79701 3a0f525b59b59748c1402f443a108291fc0f0f98 py3k
+79702 86bf38ea31236e3beae09069a875cb8020999c76 release31-maint
+79703 aa121a39a95670e48626a0a77bd86dcaa47a4311 py3k
+79704 da34d1f43cb0005fff9d8ed76a1d17a4f5571603 legacy-trunk
+79705 7eb907c854b42ad9dbbb18256b8f4a4889fb4fd4 py3k
+79706 c21bc80c83f62fdd1619e0117c5cc1b526f6dff3 legacy-trunk
+79707 b2625acc2484e50eb60235bda45fe9a8754da02b legacy-trunk
+79708 2e559c0ad8c3428ff26c2ff2eed72835271a586f py3k
+79709 61990f763485930e793eb9cfc9d987268923d59e release26-maint
+79710 e14613124cc142888407e709f6b23234df01cd7d legacy-trunk
+79711 66158e4fd0227e405e6a2b9fb5d8cfd06940cadc legacy-trunk
+79712 a184227cfb943a0c0d02520aaa09a895bcf7e337 legacy-trunk
+79713 c73a658da6fac344032dc4282b499839c446794c legacy-trunk
+79714 e29a2e03e739e6669edc6aa9dc6951b4d7ecfac1 legacy-trunk
+79715 3f7864c1cf3f61543d4d17a785c258fc3cdde216 py3k
+79716 345b6ab32d654f4664e8026ad064f03888819903 legacy-trunk
+79717 82c2034b8095f84403491f9efca2fbe361b03072 legacy-trunk
+79718 ee3425d1c688cfd815cc55c643f8f603a1fa02e4 legacy-trunk
+79719 4d84e3fa333a21f89df747611ae4138134a9f6e8 legacy-trunk
+79720 9b500a2c859d06fb67143dab12be8f49e2443a51 py3k
+79721 c8f955003b2c1c5a376b3ce7193ece5e3121e605 py3k
+79722 6a24defcc00b2cb9805a82f7d753d158da2ae0c2 legacy-trunk
+79723 965ec6356d5d844420df046b6f65facca17c352b legacy-trunk
+79724 81c2f592e80810a84661bf2b8619f3032622a390 py3k
+79725 3c4c0a716a18a48fd53f0d42a90398eb4938b318 legacy-trunk
+79726 0cfabed46669ce9d0a84a61ad4b1c9791b852760 py3k
+79728 da939ab2bfe2777a80941f306ca7c598c2771ec4 py3k
+79729 399210263e710c07a8f1c018f745a9757b1ee902 py3k
+79730 eb4167672163c8e31e0413d238969e0d9a7e3d90 legacy-trunk
+79731 0d567ce5ece4a431dfd1b5b4fb825ab6a27ce6c8 py3k
+79732 395a27a44a9e4246d8fcbe475554d5418179b155 release31-maint
+79733 d5862d12d92ab4d44ea9c30b60888fbfc1165cbf legacy-trunk
+79734 f9c368fe1acf308e324abd70b7c878124bc77f14 release26-maint
+79735 6777cfab5152e2cdffecbfc69ba92ffe6ddd904a legacy-trunk
+79736 9ee97a4ab15c0c9b7cc951457f54f045f8a3dea7 release26-maint
+79737 2da513b472cbe50de4f648b34361f8192b8320c5 py3k
+79738 a8dde025a6f99f01f0b78a1defad1fe578b24cdd release31-maint
+79739 0def28db77997eec340478e9a89f465ad41c103d py3k
+79740 460f41bd0e34acee645c441bb7b5580beaeaaec7 legacy-trunk
+79741 5715de2a4051051e2ae1872281731ba7b6d8c191 release26-maint
+79742 58dc4f316ff646cdc3186f76bc0845d3304bd996 py3k
+79743 81fe1d45ae77fa42c9310454deed942fe9cd2ea1 release31-maint
+79744 5ca8e41504b6f9279a6d5e64b0d1bf20cd59020e legacy-trunk
+79745 c399e93bf0e45dc2b71ab1f493470a0a358475fc legacy-trunk
+79746 72409b23196733a343f7f66632fb78c308c60b70 py3k
+79747 c1b87e13e9d3ff15c4e1fb522f15017fcb529e29 py3k-cdecimal
+79750 1e6f268016e47394ae1ab5ab17972400664d547b legacy-trunk
+79751 ec1a5412ff90deae3edfeb414fe81f12f1d936c6 legacy-trunk
+79752 7ac3d88e35c210ff2e21ad3d43bd0bd2164d88eb py3k
+79753 8e0641785507453f164d1291d69115d51176fd2a release26-maint
+79754 dc63411a0104eba42bf6f29c4ecce265fea58ecf release31-maint
+79755 5dda3f32a2ce2dd01fb6c3681991165bf0099ee0 legacy-trunk
+79756 8aa296fa6d6c53a074a3b300bde2d50bf6c001a1 legacy-trunk
+79757 45dd9bf361ec0315f1897b735d4f77c5544e648c py3k
+79758 9307deeee412a223f14f583128240ffc538075b2 release26-maint
+79759 f416f2c2c099e847537f5893d8ab72405d0adaa1 release31-maint
+79760 b6c6f42cddde5df4dedaf5bdfc0f60bf25edd4bd legacy-trunk
+79761 0225d29f0bd98e335013e16c14569d3d79ea6f91 legacy-trunk
+79762 acc900dc184ba9b0c62f582f8f7cedca76e22ece legacy-trunk
+79763 0ece98b853d51041d59bf0fa12c3f1cba838aff4 legacy-trunk
+79764 a661c96b8d10ecf7b8b99d5d7c9e68f886d6ff5e py3k
+79765 fb2d64a4d872c32c537e76c568925ec176d343b1 py3k
+79766 b69dcf63502c4df242f99132fe6dde457812e43e release26-maint
+79767 c04a6222cc7dd59df275b2c924b4b97f7f8dfe3e release31-maint
+79768 a903bb35ef4f535750e072b790b9eaf4df8dc699 legacy-trunk
+79769 c54cfe828b84a3cd0a105e1ae079392b46baf4ad legacy-trunk
+79770 8004357d5bcc0372e52186fba2ecc4a29ce32bc6 py3k
+79771 71779f4a2078294b58df27637618ae2e726a496d py3k
+79772 33a02e4ac4c2f1e7e97bde451095a74e2b0a32b6 release26-maint
+79773 893c74d547ee738062b66d5e3bf3237deaaede76 py3k
+79774 1abf37db257d988dbf6036107b17c05134885bbc legacy-trunk
+79775 23dbc8a3b97a99996a7fb0683d87965c8d4f0fc6 release26-maint
+79776 60ca8983dd3b1e25ff343078c36b1b2a9baa3a2b release31-maint
+79777 5352204c8e88c5bd1fe7a9ae0175aa65eabcfd2b legacy-trunk
+79778 e6815e1b7502c6409e4fd7d0eae0237011e747a9 legacy-trunk
+79779 1cc4d2db5cd6bdb3b46cfb4c0841d0021110fda6 legacy-trunk
+79780 cfe5fa34db46664c4fe9830b145dbd311adba724 py3k
+79781 c40fbfff6d7abc88d20a016eb2cb03a1594c8101 legacy-trunk
+79782 7f69181b652c0a9bfb57f6d94f2df63215a68eef release26-maint
+79783 02bd2f60ba5d8d52f3682206fe225c4d74d6ecb2 py3k
+79784 273cda2b0053812baefd2235b2fe86a5fdf38230 release31-maint
+79785 fdcbeb9f374c715e6fff1c83bac4cdab05456969 release31-maint
+79786 97e95c9d26dabf214f8bc4d4783219fef9a5d6fb legacy-trunk
+79787 e4bdc296fc8e427b057263c6a7d9ebb1f3fc98ea release26-maint
+79788 e94d446c6d0ef939c99e2a4c8b39dfa8a43b9a75 legacy-trunk
+79789 72c0e15c03b24a233aaf4f7ad0dad9e15d816a12 release26-maint
+79790 24cb4112b7311309a206ee9cbde5d0fc04993eba py3k
+79791 32a8b520d767d7c9c4741b99dd5bf63fc6fa529e release31-maint
+79792 28b823983fce9d739b0d17dba94f85dea4fd0201 legacy-trunk
+79793 6bee43ea7c00e3aac331c63f19ae605b652910ae legacy-trunk
+79794 f87d2b1ba4290c30382296626c0cfd19c01e99a5 legacy-trunk
+79795 c2b093d680cf323134b49a2dafe15c3060aa1171 legacy-trunk
+79796 2d0ce307809b4d063ccd49a9427153a61c188e57 release26-maint
+79797 11de2c28d1a091065776dcec1efedcada6a46086 legacy-trunk
+79798 7088d18347784f290861f2a9fe1e60eb688edc3d release26-maint
+79799 9ec598b47da4dbc70e9c81b72ff508a661f1c575 py3k
+79800 a7b53ad7ad9726ce2565937ee21f41ada9ca0de8 release31-maint
+79801 0a53c254a1937dc07a2dfb7e650e75be1da31ff8 legacy-trunk
+79802 e77b2ff24ddb14f9586af7b666991e232738dda2 release26-maint
+79803 7f2d7bfb056706cf37812f9918ac24ccf6e912d3 legacy-trunk
+79804 ace711550b597ecafaf271a93e24983c70493530 legacy-trunk
+79805 9de5630fc61ba009c81b51b1fb5a98982c387e15 py3k
+79806 8f45d37c55a142bf63f3e1cb5c22ff4357d96510 release26-maint
+79807 586e1ce9f243c84a5f5b371dc7828b6de1062d82 release31-maint
+79808 3c9f0887ee3f9aea9fb52205bf9f0748e52469c7 legacy-trunk
+79809 5daa74bcf6a159092ada104d60512f9f5a57e52f legacy-trunk
+79810 3ce66c6922abadba3d89ec411586c3ecec0d4eeb py3k
+79811 9fd8852ecdd4c202e911909ec1ee1fcad4e38c92 legacy-trunk
+79812 664173984f2d3a21faa4c9768be063274651e17e legacy-trunk
+79813 9e5e9d8fa8474fd1b5fb9ba001d0616cc0778a8b py3k
+79814 25c2852bfd15b542912e17592eea2020fbfc16f9 py3k
+79815 1adcf4a4685606e5bfb5a26ce38c54d50a6a9b67 py3k-jit
+79816 c5be537b5ba909d995bf401e13541f69e28d539c py3k-jit
+79817 922079f724a620c23a9042f34e7dfd2adf2c32e7 legacy-trunk
+79818 94262d0e064a5ea88f337f50e0cf92ed2fc903d9 legacy-trunk
+79819 eeea78df8a3c72f47367a9406f51c096d6010009 py3k
+79820 9600625c15afa9c0a420b88114721b4ba29a1e9e legacy-trunk
+79821 c10024abd118ffcafcc7ddfe268f177bd182075c release31-maint
+79822 2ffb224c61f6c7d0bb2b86cf4520ff2bb5b110fc legacy-trunk
+79823 26c6de18cd30b5db0c4795628f2b33d073eea901 py3k
+79824 367ac48bf085a5a3b3ba1b3cc16a93b7a3ecae45 release26-maint
+79825 a0c083e1d31fdd2f93d3a46bfa4758e45bf1d396 release31-maint
+79826 95bf97dcc59192602384ff9d9fd32bb9ada55394 legacy-trunk
+79827 727461d66d10224dc790f30391213f6d3499619e release26-maint
+79828 7d89d0dae98e55718ebb4a461130d04a6eec2cc7 legacy-trunk
+79829 a65a94b00902ec22cbef8acc8a2147b5ca0e67e6 py3k
+79830 3775a4fd11c2a73cfa19c06f51a934bb216f6b19 release26-maint
+79831 d48801b863801f70ff55d0a8ded9e07d28e19133 py3k
+79832 2b93e3165961e1a9230dc3add94a1a512c399bf4 release31-maint
+79833 576b0e8736c7fea74a7fcc36bdc316b9339ad9d0 legacy-trunk
+79834 f1ea03e37ff6ecb7f124011d47c8467ff6950ef5 release26-maint
+79835 7c76a7b4116035c96c9cceb3c5de24160f686844 py3k
+79836 6feb5add762ac6e19514a1b4b618aba106bc4409 release31-maint
+79837 b66fc88fa96d1bb7662383a24c9fc664898e8b3c legacy-trunk
+79838 64fdf66f69b0b78b54c2ab2dfdc333b316b70b69 release31-maint
+79839 7774d60a89a928e5c611c97d0f1708cde5f51ca3 py3k
+79840 696cb5496a0b86d2dc902fa7104dad97b83ec6e2 release31-maint
+79841 c67339e371a9b25d1d393b351bdf44f148a05127 py3k
+79843 c8cfb1d07429ca111a293bf522c54defbc94566b legacy-trunk
+79844 b88842f6534de48e16c13ea1cb01669ff81459db legacy-trunk
+79845 b6108f720f69833a34cb689bfabf12c18b0a7ca7 py3k
+79846 f194a3ceefaac00d1d21e7191045b8ea0627ce66 release26-maint
+79847 2f28832dc36c3b01a87ce226a8661636c8f24b41 release31-maint
+79848 a73d60451b490c6a1a72ffb1be74feb2f9aa2a58 legacy-trunk
+79849 20a59badafa1c2214ca6cb9beaaa8ae020db4ed8 py3k
+79850 3ce4aac20935776035f07a322ac5e84d87064808 release26-maint
+79851 d51a2c7cc811a12a8524e314650a4b18d960ccc6 release31-maint
+79852 5b0f1d5bd55a97c006bed13015477decb2590b36 legacy-trunk
+79853 bbcc54acbd8a2d9054a7cb77190cea5c35a1052e py3k
+79854 3327df32c117cac2b1f255514b5f585b03346796 release26-maint
+79855 63af496b14939473fe6670d1a32ddee80465d9ba release31-maint
+79856 f4ec4073bd2e59680d1e55966f0c304a74dd519f legacy-trunk
+79857 ce979b64b23a790ba416e264522aa3965dd20ec8 py3k
+79858 a31f80d5d1a16ebf4d77185421ca033c771e3630 legacy-trunk
+79859 01c1aa3a49a7cd1f55f42c7e60a5f72b6aedc5c1 release26-maint
+79860 569b859ade2077302e6d59bfeb01be8e0cfab466 py3k
+79861 8273f8994a8880af3a871b4f32df37a8fa5b8acd release31-maint
+79862 9c48ab728ce0d4f3157b8da9ad12876af2110e58 legacy-trunk
+79863 2b4fcfc35f1223e0a5634a05221ec08e1f25652f py3k-jit
+79864 712970b019f70cb211c70399dd10f5e0771300a4 py3k
+79865 6c1ade9ea1e4454d6f3a1623ad9479683b8ea684 py3k-jit
+79866 9ba8c6e52fa0ddfb7f43ab2f8003dc2391103f46 legacy-trunk
+79867 be044b8c343a35f593561836593282b8d1a397a9 legacy-trunk
+79868 ba5ec756093337e31144bb21c1acf6c06ef153e1 py3k
+79869 eec2db09a6c12391f3b25e299544a47c5074dc60 release26-maint
+79870 81d90ceee3bdfa7fd5c6d21598b7ee859c31874f release31-maint
+79871 892db18c78154820b41f00db0cd40554669bef46 legacy-trunk
+79872 1a6f3d36bbd961b046496713f7e5690aa888a546 release26-maint
+79873 82af113e020b97af77450d81b9854a6774655771 py3k
+79874 e3cf977e2e6467e59dee217c759e0b79a25a7732 release31-maint
+79875 8d8f7e082ef6a84ce120408707a8c6764e4d089b legacy-trunk
+79876 9ce53161c3a9dddaf2320bf4a5c7ca93da91a895 legacy-trunk
+79877 fb6cd8ad8f69e6b0a01f6e13e75984fa6bb6e47e legacy-trunk
+79878 c0957dada5c27df62f43fbe8a0749d7a7f2ee4d0 legacy-trunk
+79879 d79599b21e8115cf967a32e9361e0fbd6d0cd2ef legacy-trunk
+79880 c9e4e12e9cb6e06d573d9e76e489522a6d068804 legacy-trunk
+79881 f369db0d58456594257c33038012467abe7a0a80 py3k
+79882 10f1e63b2b37483810c541969c91a970f552554c py3k
+79883 b619abce0269776b1a32d06f6ce97b54f076b92b release26-maint
+79884 85ed740be323d71fbc90f1eee8c3132eb796944c py3k
+79885 d0a74b6505d3c7de5099a69525548eb3b0b1718a legacy-trunk
+79886 1c9befde8385e83781d757e235d2a5a52cd3944f py3k
+79887 7e55b21c6658b5e3a0844161a6ec0cba3ec2eec8 release26-maint
+79888 ddb73243967bb2ac48c8f87e2f107f004e58302e legacy-trunk
+79889 e8aa9a7daf03285a2683c9bc96926128c1767def release31-maint
+79890 20dad20058e42978590ab7ae583ce0d50d9ee3ac legacy-trunk
+79891 a8e90cecc69e15827a9c538656cf96d761c06941 release31-maint
+79892 c31c43d6ad792989e1d3c93a3185c03aff77fb65 legacy-trunk
+79894 7b00454bbfe0a6160b96a80ee04294fcbb30d9d0 legacy-trunk
+79895 25c3b3abf3e7c8b53d9580a38c97759b72daf0d7 legacy-trunk
+79896 cb0b8400e7c4f9cc5963dedf67ea6044553bd7f0 legacy-trunk
+79897 38b2424f85e8ac0d83d3091dcfbc69d5dee2e805 release26-maint
+79898 a39bf38f2e0c177586936f2aebb53775bfa86acd legacy-trunk
+79899 2e8d2d7c43c0b58ecfb868dc37435bc7ed25193e legacy-trunk
+79900 73e5e3eadd893e00985ff8cb07918b97f650a716 legacy-trunk
+79901 ac078a8c3e1af09d3eeadcc91f4008ccce344612 py3k
+79902 7660c53d5719fe734ee3f9e3159517b3c151d022 legacy-trunk
+79903 8227b64e8d788e22d8cab18a188f41d4f26d2a9a legacy-trunk
+79904 b8998128de08b54f16c59716b09e4c9776c6281e py3k-cdecimal
+79905 e2444f2879b435b787b3048460e7442f2fe77b4d py3k-cdecimal
+79906 8e5c71c76e8fa12f292eaba8c49bd86dea8ce97f py3k
+79907 6f1959f66d690a3731c1a87bcc8a631401958aac legacy-trunk
+79908 24ce4a0089be329c1cf99f53bb5cd30cac370272 legacy-trunk
+79909 7cbff0b1eb5d187a62b2225db348cb6bd49b7341 py3k-cdecimal
+79910 a1628bd97bb6854f935a42bf82d2f936241fa734 legacy-trunk
+79912 a792b9cb0d7aaba1dde001473de69abc9d1e4279 py3k
+79913 24d7f55400d3a1ab94808ff854fa59e1e9ec9a7a release26-maint
+79914 837f3bb1575fb88fcd198e47a560ee15737da14d release31-maint
+79915 49919b31ff200766cf296a058e878112287867f7 legacy-trunk
+79918 35a9da039663031e0ee257ca11c9f79ad874f2c6 legacy-trunk
+79919 a5ed03773e4deb75cec7ad5d9c77e296e7053c78 release26-maint
+79920 a5b7dcb9af8fa2857d29d77e69aadd236c9dcb8f legacy-trunk
+79921 3ec1931fd2564b59884cb7ef5bb964d1574fc98a release31-maint
+79922 464f669620fad651752834e3ae5ad3b731e42f86 py3k
+79923 5e038fd2c143285fb48f8bdfb7ad859fce06abd1 legacy-trunk
+79924 c00b0718fd533a720e91b60b5176060ebc67ca47 legacy-trunk
+79925 7a4d026b639002434f5bf99556c67d832903a4a6 legacy-trunk
+79926 ed26163070f58c1ee87c4341fc7ba5d7debee08e legacy-trunk
+79927 3ae7078d4278b2e7e5db87cfd490cbda6d881231 legacy-trunk
+79928 61550a1302b07a731436a84b2d86eb2bab3b2fb0 legacy-trunk
+79929 4cc1758dcdf78c272f699d1ee4926eaf52368f6f legacy-trunk
+79930 2baf1cee71f2b67084abce175d66f05d95f9da05 legacy-trunk
+79931 805512329c7534c434fae03a08776da5f4e06838 py3k
+79932 55fd4e987b20e070b2a229df9b02f0581aabebb9 legacy-trunk
+79933 8c6e4b7ad158bea2987727debb9da1ee2b787f69 py3k
+79934 0592e784177774f999fbdaacf1b41f4d68d13c13 legacy-trunk
+79935 97b588ee62f0fb463d65fbedd157ff2d956e7970 legacy-trunk
+79936 f34cb501f8f7e32634c793141fadac4a80a57ac7 legacy-trunk
+79937 570d9ac84d777a994dfe1dfee08cb915d99b677c legacy-trunk
+79938 7301da491d5bb5b46bc8508d9a3acf1afa1a1475 legacy-trunk
+79939 34809cfd86016852eb99ec6783305a17a085ef9f legacy-trunk
+79940 5f8782aa0f8c28a34bc7b0098ad6aeb90324f346 release26-maint
+79941 44168224ac610807aae28836e84cd4befe1fae4e legacy-trunk
+79942 8f89ef909009b51a54685301dda57ca46b013e5b legacy-trunk
+79943 d007f5e5e1f019a2801c15621f36fd097dc67e1a legacy-trunk
+79944 cf7c9ba2de6e9434bd5c694bab47f037273c0144 legacy-trunk
+79945 4fec2e5e3398acbd94487c9c137cd7042fe8d95b legacy-trunk
+79946 e0e355ae99b2626ec6039285fa2ad4fa47b86d0a py3k
+79947 0061e9e329c056a00347ded9bf342c6e87881a57 legacy-trunk
+79948 7912366b48d8b06d17f8c45c493b807c74b665d3 py3k
+79949 9926e12bf485064d1ebac845f9b6737737e54bc3 legacy-trunk
+79950 e1593e1e652eec87b554543a616c3ba7ce55f1e9 release26-maint
+79951 69c37203ffc1d79061758c81cf2bb4018aa52d56 legacy-trunk
+79952 f244fee989a981cebd0addda21c350b17efb976a legacy-trunk
+79953 84aad670460e50779de210974d2863eb64961678 py3k
+79954 9028033e6fcc3d482710c315021a0c17347a6e93 legacy-trunk
+79955 f4705763787b589d0cebf690ab3a35a8f1df6832 py3k
+79956 a65f91bbc2fb295b9af09dee047987dbd49b7b17 py3k
+79957 30c80022874e7c9054e430101f1adb7cbe138362 py3k
+79958 66ad267a73bf62a0c91a4767310958ab5513698d py3k
+79959 d39955216c07a2cfd9ef42ace74ec91385c3ad4a release26-maint
+79960 c2e1de3f11fc1b276abd2257549183533aa7830c py3k
+79961 027d575c689c10209b42faa0bb7a21a2eb252093 release31-maint
+79962 b4a155e4d31292dc0a28ef18da842139dcb5b962 legacy-trunk
+79963 8ed996dc0e5209baa6ce56db1839086d00aea5ee legacy-trunk
+79964 9f9cb1c57f2a7dcd371ba8732b7bd3eadf08c55d py3k
+79965 c41478473eaeae52fd8e9464a7414a2d2dfe4b1d py3k
+79966 a84ddd8de9d1dba02b3b1c9345c772196e498e06 py3k
+79967 dd43e0c93175ca64b1ebb0dad70010692c896e11 py3k
+79968 4ad952a6af9571d147d0adc0e6f31686af586cb5 py3k
+79969 b4f60df31b1412eef36149ee4dc56bf76f8d129b py3k
+79970 e351579137f3e424c0b70a813f5d4ea2d813db3e py3k
+79971 fd3caea92cd9f91ec8dba47a4f7017ac85c92060 py3k
+79972 cb6f2c89f4372cc366d36d7681692e2ae788e767 py3k
+79973 093e2b71564574919177dda8d98f5e1f9a52f911 py3k
+79974 d65437492426197082249845ff8f13910bd88830 py3k
+79975 f5c4fc0d337336dc36a542dfe11477768a1e4e00 py3k
+79976 1a62beed8d15ef8daef459ff8715e126d7db0e22 py3k
+79977 3b688da18f53e3951a1c6dee9e0aeff34486688f legacy-trunk
+79978 75f9209f3fb990f9907992f84bb33e98d44f12e3 py3k
+79979 ac061ef1487e47b697b3ba223943986fd7fc44a7 legacy-trunk
+79980 9de261cf5bc2996c6952d6fa838f62fd68b87bb1 py3k
+79981 afbbc983e0bd0412954a5c5bc3b2906bb191ccd1 py3k
+79982 d03f5acb4b87ef6e5f183df584e61539af62ba7e legacy-trunk
+79983 610b685e0525bd6c41740fd08967fa91b1e4bcec py3k
+79984 a29291ce4fce3c1d842df32d89d01f65322730a5 release26-maint
+79985 edeb07c411af29475c0f4522203eba85fa33f998 release31-maint
+79986 e475b771dd4c0f98d14fc31680e6f6c2f2a7cdda legacy-trunk
+79987 2ae5f60e27c9956daedc601102e444a4e1db6388 legacy-trunk
+79988 5680ba2dc9c26eeceb64703e4cf9a08a820c32f8 legacy-trunk
+79989 bae37903f7975d6778ca3c524eab1fdb64999353 release26-maint
+79990 ad2ff1c36b1ac16ce8f84aa92650fb4ca5b59aa7 py3k
+79991 de515140b5fbe4c4b0cbea9b3086439bb7cd56f8 release31-maint
+79992 fedb1f9322df3c3fa110ad79c3d4e3aa26b26150 py3k
+79993 81d0ea6d2da37a3391e819e6f67bc4a8a8c2af62 release31-maint
+79994 e6972f1c9d6d016715c9c41bf8ce0dfe99f8c451 legacy-trunk
+79995 63144f1454d200f917b110f1ef4d8a0dcbb3cda5 legacy-trunk
+79996 42e6057cf28fd7c93e3188ef084131ddda5da4d8 py3k
+79997 860fceda2d8940b540776188deec4ee79ba3c480 py3k
+79998 4f12dcb9ce6f1177d97fd2d27f2831238b6e7f07 release31-maint
+79999 81059390852777404700d52558334b0366a0875e py3k
+80000 98a15fc38b8bf31e7f78f7d7fa37cea9e97cf0ca legacy-trunk
+80001 1163cd8c3956db3231e9a134e09162e3c49b38a2 release26-maint
+80002 91ebcff5bb24c0c8b4479385df613fc05f9fe2fe py3k
+80003 5576654e4b91a55c9cf903008580d6a9d1bfbb8d release31-maint
+80004 713f1f6bf339bef7ff344d1a1aa6522a77b79a17 legacy-trunk
+80005 9d1039048498a88ebe1557602d0562aa1376f2bf release26-maint
+80006 b81d83a899f3679fdad7855ce16076b0b55d9138 py3k
+80007 57bbfce8b27888f76572849babede962eb9d5879 release31-maint
+80008 a2f5b3b19eb27ee91f60530bb073530c9a63c849 py3k
+80009 195070e85ce15207e76120e853a00df1780642e5 legacy-trunk
+80010 f1c036de19b7d1655318f96a26e170b46e1b2175 py3k
+80011 89752c03f342ce6471db61358ce9b95d178dda4e release26-maint
+80012 77c49e73524979aad40ce0310297415c49b23d42 release31-maint
+80013 d4507f61531dca4a8653d82ebde4db45bfa3fdf7 legacy-trunk
+80014 b536a8a96fa9a2d7721d51c2d5c1de640d588d48 legacy-trunk
+80015 09158894a3b05f2b3eeee30249afc8300a6a3282 legacy-trunk
+80016 d486705892ab6e1b62bc0ecf09235064201b45eb py3k
+80017 0a1ca0d744a4269c536ec86303edf8d36bbbc5f8 legacy-trunk
+80019 1a90fe37b59d736c34c992f949baf23f95d2e9f3 py3k
+80020 60a7e58a10dadbf4e65b97eb4318a784c6599974 py3k
+80021 52377235d0552110cfd3042a1464c602a76615cb release31-maint
+80022 63b58124a554a36f1a7c3c03fd56d4047a51daa8 legacy-trunk
+80023 7a390eb50df1343232b675f0b07b76929d26d0b4 py3k
+80024 651edfd2db38882f85d8890d58cb904de5a7bf9f legacy-trunk
+80026 5e8e6e7eedb214c5121f799a70f0954ab71c0925 legacy-trunk
+80027 a8beb614922f902c9649388ee604466f0eab238f py3k
+80028 251732092601354f2fc9e2aa11447bbd9eb5b797 release31-maint
+80029 015e8f7f5264f4d11142d26d57a062fb2d0ef43f release26-maint
+80030 47a57df69896fcf0f5778d434ecfa8e2ed1ad416 legacy-trunk
+80031 7994269ad3a1fa78da49c60053d577157b8b24e6 py3k
+80032 b8f297cdfadef1fde4e6c8091ecb9dea8f7226dc release31-maint
+80033 df2e9e8d428ecfdb39de3baeafe6603c3432d64f py3k-issue4970
+80034 b92b57ffb31e168ef5217ae19fad2425658ad907 py3k-issue4970
+80035 7698d1a10b01c023cde644f29772cdbe3f306d06 legacy-trunk
+80036 7bcee7170d7bc3720d937942ca037c01dfc80a51 py3k
+80037 6ffe6f8ca09164638429ab3fe2e1440739eaf377 py3k-issue4970
+80038 a5c886ea4f6f319cc383d8d9d706192dbfa5f1b6 release26-maint
+80039 d6dee3ad259b56bedc7e823da003fe296cc216b1 release31-maint
+80040 d4e210323f713740266c865fbec76a37301b7369 py3k
+80041 341a6bdccd2e72a388ce76b5f4d2aecef97cb312 release31-maint
+80042 a9213f91ab169818b7f95d1a893182318c1d4331 py3k-issue4970
+80043 0824f26861babc3f212a9d36b2713061e589f2df py3k-issue4970
+80044 702b6c99e757c710641d4880503e3d21e61c8750 py3k
+80045 7e0ce5f63a3bca49ad311fe8111035ace6c879c7 py3k-issue4970
+80046 b4c653432cb674c669226f735ad094d51c4744a5 release31-maint
+80047 1dd4efdefff158763b576a754c2cbdd3fc7197dd py3k-issue4970
+80048 b95ba0cc1b7e51193e8aee284a5a37ad0db6b674 py3k-issue4970
+80049 5c99fdb7da7375d3060923fb1e4bea015d40dd53 py3k-issue4970
+80050 cb8745fa65884291d20e558ff0d2a73347f17e99 py3k-issue4970
+80051 36b005bc088ff52aaaacfe6c197bc1618e864faa py3k-issue4970
+80052 f1a2f3b6bfc64853f71bbc823ea3fcff08276f33 py3k-issue4970
+80054 5b6fe7d3598bce22ac512c8433f4edcc4bd58d6d py3k-issue4970
+80055 e984f9e15666ce6d32eea13c1103f0e925d521f6 py3k-issue4970
+80056 517cc4d59e12e241858b9196efb6bf42fa556466 py3k-issue4970
+80057 99e9c8d690ab9480713ca75db09d42fd68851c95 py3k-issue4970
+80058 28553564f1c66a46072be7f07e74db5167ee90a5 py3k-issue4970
+80059 fd7a13f0ebbddc40a86b830a8fe4325f63efc463 py3k-issue4970
+80060 8693fc06ac8ec8e1dcfb2856b7c0c5bd62594348 legacy-trunk
+80061 735bed6c8e361d84718f1b6e965baf33261e6787 py3k
+80062 6493ae72791d37bcf17c02a39e4580928353ccda legacy-trunk
+80063 450c69210581e94ced88a1abaf9a2a3e77234cd5 release26-maint
+80064 6bbf07a3e01b5c0825a8d188c326ee9747698fc2 legacy-trunk
+80065 bae79765160d220d61296fe1693977324763721c legacy-trunk
+80066 62d11785204f40856f2c3ecff28a5ee5a7d90e92 py3k
+80067 364f1ac32264ef7d44daa5199e000085d6e23c69 legacy-trunk
+80068 21267bf0720e01661b73e10b817409a6b7e6febe legacy-trunk
+80069 fa9300fcb004087e28e075354c6c057dc4c5f72b legacy-trunk
+80070 6102d8686aaeda79f60d7a064a149ec396603dfd legacy-trunk
+80071 01d1fd775d16b569f2cfbf0b1964b76d5dd65b2d py3k
+80072 22163d8caf3e33cbe5da9cff67dd2bb36d222ad2 py3k-issue4970
+80073 9069ca51e61482836a53678532c613ece1604a39 py3k-issue4970
+80074 d443d85f62c177d65118dd882f4091466dfd2e9d py3k-issue4970
+80075 ca11c830f5cc9dacdfd593a00f1446fa8ff5ae6c py3k
+80076 b1276fcdc3bd75020b024051b8b0f6655cf96ace py3k-issue4970
+80078 cdbca7c3431d26f18568b8d722dd2efb1a17fce5 py3k
+80079 d351e15fee28f09ddd9668106fe9aeabbcd30e7b release31-maint
+80080 b40436bcf4b2b46d5363c1493dd15882ad9dbfe1 legacy-trunk
+80081 c5a4d9d72f98219236e2591e285313e17f127dca legacy-trunk
+80082 7e86f44212d655a54b254d708ee420a60ca1c073 legacy-trunk
+80083 14f310a6e49286c7aef95741b2cd9dc86c572f25 py3k
+80084 485e34ec1a1a8b9636ec8ee4e26d9884434ca844 legacy-trunk
+80085 764946399352df0ccb79ad7c82ff93c024ff3a5e legacy-trunk
+80086 4229662ede872dbec027d5bc25429db9af72b5f3 legacy-trunk
+80088 3a4473beeaf52395edd552c67dd9833202c8920b legacy-trunk
+80089 f4bd3b2cb000eb32579ab0147403c35ade7f256f signalfd-issue8407
+80090 5e851b29ed95b187d241f2a0e8042aff45661230 signalfd-issue8407
+80091 c1d1f000b404e651defdabdb6e6d978c02e9a959 signalfd-issue8407
+80092 73d78fef91d70fa2fe26ec791308672e3d6ab09d py3k
+80093 5fa402a46f5a7f7e36068b5326cff0bf7619966c release31-maint
+80098 3240167186218087f5003fd5077b15eaabd43322 legacy-trunk
+80100 f98bd85aebb0f53718758d51e93cccf72bbe390f py3k-jit
+80101 7b9e328f753321d0b97fe74bcea3e4a767e18992 legacy-trunk
+80102 51b85516d7f93a83d23a4b0844c9208708e5b23d py3k
+80103 35ab5cbd7e790c023e58925903bf5565f5f212b6 release31-maint
+80104 820b7e0a6f38b1b5414ce0b92ef184fd42d74559 release31-maint
+80105 137b424e2f784bd9db845655a72d540501c30120 py3k
+80106 81297975d253e9cf37be4ffbd0db4dcab3d06b55 py3k
+80107 afb25c2d056194cdfced8e4f0e491194effcbacd release31-maint
+80108 005510ac0995b6ffac2080019721402abb70db6e py3k
+80109 87d120b9eff2ae36fb42bf6ea7661412214e766a py3k
+80110 547f30a0d4b1ed6568e25dec963f362ef33fc973 release31-maint
+80111 4cbb0fdebf737cadb40acef92ebb02d767053540 py3k
+80112 95178e17e9610cd8041386ba0cce8028bb7f14bf py3k
+80113 bdaa289d9f199d8e1e6f94e3f63577c82b347fc1 release31-maint
+80114 0442e7a418cebfc3947d7d3f597ce138cd3d1cf2 py3k
+80115 11640c1a46288a86e0e480430d045a658c0f68a3 py3k
+80116 15b09ccfac7cfdeef6c45c4c9c4484a0b34cb75d py3k
+80117 6335cf345afae813b2c5b0f50402056db81ce232 release31-maint
+80118 44a7507f6db5427f57db955eda0a171a2b7625db release31-maint
+80119 cc10a1527521d106b8ea3a979d4fa23972ef0f50 release31-maint
+80120 45aedcae9c479c2066604ada69ce866d83644ae0 legacy-trunk
+80121 8ab5bbae5efe9e849f0885cc14341f3d61b32745 legacy-trunk
+80122 81bbd5670ec39ec72721cef530bbdd6fa5d9e179 py3k
+80123 63b815cc6f4b1fd9b018e2b922aee03bdd55f5d6 legacy-trunk
+80124 3696d17a10b3a45281ed0ad9202c779e661f412f legacy-trunk
+80125 a7491d47d4546fdc2bf8e06ef43bdf0989ca2182 py3k
+80126 ce624cca202ae914f2889f7939bb4cf82daea3cb legacy-trunk
+80127 460a984a9ed5707d2fa347a7bb64d549462787aa release26-maint
+80128 773408ca5ee633ffdac0c9fdf001bb4eb7edaa4e py3k
+80129 784a022664e3a2c19b253679d436219d747bd2b6 legacy-trunk
+80130 0a01a3ea140a97e0482da3f8bf4f83875ffacb83 py3k
+80131 68fd70a9e77afdce7ee9c673206f241a6e4229e7 release26-maint
+80133 5e1dbc3ae76797b7776087051b73c38f5372813f release31-maint
+80134 1a3304ce9a2e7afa6ade3dce0a0d19ab37e024d1 release31-maint
+80135 dc765bca24add84fb5de595011ecf9ce87ca9ac6 py3k
+80136 e5390fedcb6b162c3ddcae219f5c75032164a4c2 release31-maint
+80137 7b69e630d237790b5685f9f208304f8f47974263 py3k
+80138 c532afb0fa892802e13ffcffe9b543d4e48169e1 py3k
+80140 046f97ed56794efde752d8db83a27584ae46b38a py3k
+80141 0e36cc0d6ab0203369921395aa1162e22d6eedfb py3k
+80142 734dd2eda1cc4ca4ba6013af5f6964a75ac83dd7 py3k-jit
+80143 7321c7d642adda99583327c76b0e46f79cd2d1c0 py3k
+80144 25e35e3838c7759fd7f7c68b27cdb1ea4e0e89c5 legacy-trunk
+80146 7b0656929cdb9245250bb4cd30541d8073f21d60 legacy-trunk
+80147 2938bf899863895a4d2a2c89c4bbbd7e7728e771 release26-maint
+80148 4f1220f3e2c7db8a26751a44ba0ab1c40916c132 py3k
+80149 4d0208661b1f7387a4c9d4d5c2e178ff501b58f9 release31-maint
+80150 384dd449a4ee882eb900ace8cded337ec60ab8f9 legacy-trunk
+80151 7462e752f0fa28babdc90995188f98060440a010 legacy-trunk
+80152 33d479a38666ac595f3ddbb1d123c23190190013 legacy-trunk
+80153 f2e2b196db922c278d7501025d2e734dfbb743d1 py3k
+80154 e5f6de18b7156e5c1428c006d520b73898ab6e31 py3k
+80155 cc382f39b398cf9981f18082de3cfded3c7927f2 legacy-trunk
+80156 d7d5c76545fb37f5c05ed40dccb97f4bf5718afa legacy-trunk
+80157 bac99229da2dca94b63cfebabd6fe91e4a92de7f py3k
+80158 9ace55b29f7e9ce0bb6d23b34526a0e5d57b2575 py3k
+80159 eb30e662fd6ac12773ba33eebc29ba10907586ff py3k
+80160 f730712d97b8ddc2b62e6361d8d1ee3f24eaa714 release31-maint
+80161 d419e73733702165bc536feae0317db7b1f6e992 py3k
+80162 316bec3f18ec91510dce37701370dba4c26a33b1 release31-maint
+80163 0f37afb8a9f2c0e9f5506a3dd99ac504d1a7e3ba py3k
+80164 d3eab45973951b8c06ef02b9e82e00e1456bd75b release31-maint
+80166 7c90ac194e4082d603328c1dce96d7aa8008b2b4 legacy-trunk
+80167 e087b5d3d191c210587c730c992505d9994326c1 py3k
+80168 ea42af968d9d055a2c98495e2ce580dfdd2a8fb1 release26-maint
+80169 8efbcce0757df6047c1896fba14437fe53d87d41 release26-maint
+80170 7e270dcf4bd590bb9f50498b2fee20353f648282 py3k
+80171 0c0d819edb9dcf697ccf2308a1bee5bc5a814856 legacy-trunk
+80172 a07f60825e1ab9a1bf102891df8d0d8db70b93d2 legacy-trunk
+80173 a7e69a5f233784610e07879c554b09b5d116f7d6 release26-maint
+80174 6cbe8645717d3e99dd2a56831b4db97ac76c1c7a release26-maint
+80175 654e1cc9b4ff56a8f5e5a49b2b7bec78ac5cfae0 release31-maint
+80176 fa8a03dfc2d1cb6c636eb612fc70255bdac9ac8c py3k
+80177 13d86fc6994081bea9116c0b8396bedf08f60223 release31-maint
+80178 2f54756aeb1166c7f0b185009c4e13cb0a749baa legacy-trunk
+80179 22737a99bf8c444bc4aff3fbb946922a8fd758d6 legacy-trunk
+80180 6cb1c4804f9c8b1ecf72955c545e6e4d8cc61f7e release26-maint
+80181 fe6b6c189bb4153d5caba0d15dc7526bc54d7f89 py3k
+80182 1f3d2e612b44ab77e181b4130192999d380b756e py3k
+80183 fb3e400c2cda408592495b92ad630f27fa2843a8 release31-maint
+80184 4505eb57b4ca7df801940dd0ce972dfdc1ba9164 release26-maint
+80185 bedd6ee03e604e7569c6f80d686c244b26236e61 py3k
+80186 f762c6a54bfcc76c6c52e969a70fec55222ca4b5 release31-maint
+80187 a96fd0e874b498a4e64827e0a1de62e2b057a2b3 legacy-trunk
+80188 bca5743761272dd1eab325861bddc0eadb3b9425 release26-maint
+80189 7267e0ace33c174250a7fc56fc6954ffa5e1aaab legacy-trunk
+80190 043f14304ded04735702c1e49232d9a2368df48a py3k
+80191 2cfb10a6c2b5d70b53fd75d6af041456ce735b39 py3k
+80192 9d35afd8821f0075a8b437f9643b338fdde0da6c release31-maint
+80193 a52cb991f54c1b275cb9822cb6089227e55dea28 release26-maint
+80194 76649ed45c637baf94e49141149d76f87ad59812 legacy-trunk
+80195 0644ca3fe30a04ef66c30bd47752869fe99ab179 py3k
+80196 4774d59eef7b376213c8ef919f141f0fb11e3cbf py3k
+80197 28fc31688b7c1031f256a174da70cf0a127da7e1 release31-maint
+80198 9aac1d3d873d180eb44dd9ae6058e70888292f5d py3k
+80199 485c3f09a09b48f8a3e9992260687ef06a5c27f3 release31-maint
+80200 9386e3dd5700c7081c1c7031a00c264f619ecbb7 py3k
+80201 18a195633b599edc1f10c661dcde7447382d44f2 release31-maint
+80202 8f5c480f6d6f59515f8f80adb6df1bddc2c3d786 legacy-trunk
+80203 cf5756ec6ed7d7f42b4f58cac24910747fba81c5 release26-maint
+80204 aa707f13c4028a274101adfe542c8447e3402a7f release31-maint
+80205 a72779672f159f31c019b22596be002832495caa py3k
+80206 cf80698f2756828aaa4da39c39219eeebf2fd7d5 py3k
+80207 b875021cd993702100d4d9f6e2fa451f41493999 py3k
+80208 2deb78bc5d3859213273fda87aee781ccc451901 release26-maint
+80209 6e2e2b62685ed7a9c070cc6f35295176614ac910 release26-maint
+80210 41e2f054d53901ca8239309e5e61f7e2a330fad6 release26-maint
+80211 7a564d74fd4a8a378919de5b5acfd991c6a40fa6 py3k
+80212 789612cd09705fd271d572aa542479f34e798641 py3k
+80213 83682e7d59a644391e60b834f8922ab4558b7e51 release26-maint
+80214 ce605e95000806ce2754442b203b87905c151f50 release26-maint
+80215 4092e4566db3ff2619c20226742f2e93822ce282 legacy-trunk
+80216 7f92632f912d6c7a3461b651563cc04685a51f4e release26-maint
+80217 b514f8311f2855d5d5e56b8e04c3f9d8edca6c4f py3k
+80218 bcfb6badff8841bc0e4cc00d2a6199bdefe9272c legacy-trunk
+80219 71860cdb488691e60147d397f1069473d551c74e py3k
+80220 1f02b43e09089247cbdabd0365046d226ed1458b release31-maint
+80221 2f311dab06973580b35582e14a275a5bce74a82b legacy-trunk
+80222 98b2cd10ab05f01d2a6cee2a77efe67711038f43 release26-maint
+80223 f77e37afc870a438cdc70327c04104b1a6be5ceb release26-maint
+80224 7ad6ea97d440231586701a05a8110a6455ba973c py3k
+80225 301fbe8bfad1859e175cf01e07ec89f64ac0a015 release31-maint
+80226 32285313896c840102f9e31cee4f131c1d3b59bb legacy-trunk
+80227 7fef8796f777042d7b82b5d83d57eb96c93a1304 release26-maint
+80228 39b561c53e9ad7bbf61c0a8acb08c9a53d36dc6e py3k
+80229 c13f825fdeab76b2490d742450947eb0fa698c6f release31-maint
+80230 be17bda5a658e2ab1b995a36cd2fb0e9c10d1afa py3k
+80231 359954cf0ccda9d0e2fc06085ed80f6659a00e21 release31-maint
+80232 5927fdf5d48c5aeee17a282d0c5cbb231a32d2d2 legacy-trunk
+80233 8c9828c150409f27f11ea3f20b65973cc6571c4b py3k
+80234 bf8d5402abff29f546cd2352f2fd89628199b1e1 release26-maint
+80235 1fb6081420404f5daeb759d6ecdc6ff18ddc5810 release31-maint
+80236 5f5ee94f19263df7e56098bc73c2b53006de3b7c legacy-trunk
+80237 c237bf3d043caad0bbc50091374be945ad28a537 release26-maint
+80238 ef73ac71e29502f6dceff3a369417b94dbe5eaa4 legacy-trunk
+80239 e0fca3e7ceb94bdc57411f67139e759a391ea6b1 release26-maint
+80240 6203f4716585f2ee58cfcf557cb8c6e9398c7167 py3k
+80241 8d08fdc97aa4c533cefa8b084dd68c63d8ec15e5 release31-maint
+80242 dc73ee2a8b9ec6b0bb578a0e068d1be9fd17d323 legacy-trunk
+80243 725be8f9418b83e424e3cc453cfceb980eb5db08 legacy-trunk
+80244 82de0b488f2dd731cd60055902b7e5cad6d6de85 py3k
+80245 b018319a615b35230c6ec504b9e9428429e47236 release31-maint
+80246 f2732ccc12b470d494f2a8ed915747ff26bdb2a1 py3k
+80247 3973898056b60fcb6a80221ce24aff70f45e3a00 release31-maint
+80248 7638223f2e02e9512378af880a66d050459adcc9 py3k
+80249 8de285cadb2403305d2aaacb01aa6381f111421b release31-maint
+80250 ae2781922a6de5715f9524e78bc0fbf02fce76d3 release31-maint
+80251 cea38ef60700ef1b8af7d2bcdb60a9ee3f682075 py3k
+80252 82763b200a793795608f870787915b4d47f81f2f release31-maint
+80253 da87049930016fb52075446630b39897c1380d9f py3k
+80254 bb8fe79dc5cb352fa4aa30a847c3ec52b3b35106 release26-maint
+80255 7d3432b07ea1a62dfa827c3350843499ee0d2f18 release31-maint
+80256 be10f4faaf12ca140b6f1f893b29db3bf8cd4b66 py3k
+80257 c2fdddb2b4a55afff5a235dda122006ecc14b730 release31-maint
+80258 40a3a633c56484fd68f150dc7a0d11c384cfdbd3 release26-maint
+80259 387428fa69fcdb0e52d011eb32f958fa121ecc52 py3k
+80260 e773e24b14e6bfe755f31f5338a3ebfeff5defb0 release31-maint
+80261 7cfa7975ab0e19e02363ce059bf1ba47052efda4 py3k
+80262 7ca1272f43a34ae3aac38296a96aa207388d41c6 release31-maint
+80263 73a6165d002bd4644e69352be742d5fd4d3b3487 py3k
+80264 d071201f2612d67ef307280cc23676d3d248e082 release31-maint
+80265 6eca7fbd539edf10fbb093cf724cb45018cbd51d legacy-trunk
+80266 ae272d212a9dacafd6d914d493fe0f06decd8c30 py3k
+80267 4e5c6b29d9295fe7197f019cbce7c3256135dee9 release26-maint
+80269 1fd2709ed3fdb9e01317427498cf564522c0aff5 release31-maint
+80270 f88ea1b4fdbe7c96998ab2f7879a326105bf68b3 legacy-trunk
+80271 e317e84e8a1aa1a9db98d42341a0a223aa4e3031 release26-maint
+80272 07035de05d4bd4fcb028252c12b20e431b1754c0 py3k
+80273 0f01bd62084efa6a5ee1a8a41550ee6c6739f765 py3k
+80274 6da717bfe425784eef14f6b53f5ce1898a7651d0 legacy-trunk
+80275 506faddc8a9e72f893bf5cdbbcf42e87857d4832 py3k
+80276 57d097950968736b4494fc24ca5ad723c7173b32 py3k
+80277 7c8eb2ba91298b9ef68042939f74da553e49107d legacy-trunk
+80278 d1d209f2c8039d87c06de0e59181011e8762afff py3k
+80279 d7feffa78fa0167495fdb5f480206e6f8f611500 legacy-trunk
+80280 d09f84258e522ddf7c271ec48d53defe4c5392be py3k
+80281 a22f2ae8564525185e48ffde2303b293c46b6009 release26-maint
+80282 4ddca7fd363919008ee56bdf85d69fa2e3827c2e legacy-trunk
+80286 bd45e011099014eaeba6a37bdcc48dc67a6f4f6e py3k
+80287 259efe5b961b1dcffd4341dad1a8bf04fc897cc9 release31-maint
+80288 86d08cb6ba5c1a4df3714135225e2d63c4899aff legacy-trunk
+80289 19a9a457a47ac603159d163a443cc2f034981ef9 py3k
+80290 8b36f71752386b9d675fd51dc288d8f10e2dcb92 py3k
+80291 af27c5a9feb81486ce510c11c2b6ad0805dd9ef8 py3k
+80292 8b3445dfa718ecf17e98638b8c905b01b355f712 release31-maint
+80293 f34fb1510cbc50556bf9c3b99b7c950de19fedd8 py3k
+80294 cce0a5b2015e249e17291bb1bdbe4e5e14bd50a7 release31-maint
+80295 f4047b5a0f54bd53f558dabcf1f80c288adf594a release26-maint
+80296 473a0f6788061262a3c1988a579e1a879224ef18 py3k
+80297 d95ace528d65726e2621e1452584a148d868894c release31-maint
+80298 f5afadb745da1a31d30fc979f49cacc3136287fc legacy-trunk
+80299 1b43ee1ee3d88525d1ab8bbc70b9853a7aa7bd9f py3k
+80300 a2a4d9dc7884f4ef49a966ad0e87d6eacbd41b0e py3k
+80301 7039c6044ab6534fab175fddaf4c96ff989e342c legacy-trunk
+80302 9b92e767113585718bdbd7045be75c053b1a5b6d py3k
+80303 8e2a7884929da2d1f7962567dd917a817201a87b py3k
+80304 95ccafc1447581615c7a7f62fb79f45e69bf5b5d py3k-cdecimal
+80305 8a91cb36e094ccc897a38875ba33407ac78e2dd4 py3k-cdecimal
+80306 2db06fae8c2ead654fb9f66d6e0a1009e0f281a6 legacy-trunk
+80307 94254231aa6af9947f581feaa323033032e51e81 release26-maint
+80308 819d813475228e72c0742dc5fab77900a5dfafba release26-maint
+80309 c2905b0ef1d24d4cd9e7e371c083eb9ac5b74bc9 py3k
+80310 0a7a25bbb34f72b4eb6cb0365744af35dbf4c8b6 release31-maint
+80311 6d836b10e370986e901808f37e57a7273a05860e py3k
+80312 a55827b0ec3bb95345373be636bda4944b4efbf3 py3k
+80314 c91fb506f08df0945cbf98c95aec2991058e1b5c legacy-trunk
+80315 c1d8a0055fda6e40a3f6f723e0d760ebe401555c legacy-trunk
+80316 9d86f0701d9c9887f6678c9ae00a69d724be895d release26-maint
+80317 f36a0ebeb1639157fd79ff76bbb847e95a8a0cf0 py3k
+80318 a0b8af1be560bdad6075ec4ea03ce3f2017916cd release31-maint
+80320 9ba03783ece3cb45dadfc4ec27bb8c378dadd08d legacy-trunk
+80321 8e4247411754242c3641fefa127954e5d7656455 py3k
+80322 8a5b2d06298d7f70eb43be8b822793569bcbe4ac legacy-trunk
+80323 a3ce275bf09573b62154ed116bfecb782e416e57 py3k
+80324 888c75a1be55219bf37038c512e62fad69f7b520 py3k
+80325 768ce10799f2d853c4e4f0161671bc7f780cdf6a legacy-trunk
+80326 92a633a30acb6ca125267c287fce2e3ccd4bd5fe py3k
+80327 67b81c3284f9b085f2f66a22c8d10c8b7b524049 py3k
+80328 1c105b370746053052e024915cb004c1daec9323 py3k
+80329 e091d97d50d58304dbe450249c377d69ec00a98b py3k
+80330 07379fe75c5707fdf06d65ef3e48554662c2ce00 release26-maint
+80331 57aa31012ca51cc3da835cb89ef63d413f71fba0 py3k
+80332 92669965c997194c2cd99d11b5c63cd0e934abb0 release31-maint
+80333 b19c616d5b4ad8ef1083288342ce9b7ce5ba8d92 py3k
+80334 7d49f021c842093b0cd82f1d4596a8e80ca1d77a py3k
+80335 9f4f670b148cba6164cb50ac044032ef6fdaedfa py3k
+80336 2b09d821bce1e897b9f6097673943136083a4723 legacy-trunk
+80337 cad4e09f02a13307db03d899160875b192b8b955 py3k
+80338 4b01e80d6c1ff68ffd61cdd548473c46af4761a9 release26-maint
+80339 b3875d1b38473933e80b02487a835ba8bc683120 release31-maint
+80340 186bc3b80f571229ad53eef099042425b6e7d3f2 release26-maint
+80341 94b64940dac464c7c3c631984e2a1eb4e01b6e84 release31-maint
+80342 54f15020288a46c6fe63086c339047754ff206d4 py3k
+80343 23409595137071cad3e71db33bce8779f07bbec3 py3k
+80344 5c625a048f9a56bb3b296c46c1f5b008f1a799ea py3k-cdecimal
+80346 104e8c801e5d3819c4e1c878dfa2e9aff552bf61 py3k
+80347 c449817f4b54dd494dd3c4a3553fc9ab1ab06e51 release31-maint
+80348 6b7e20000f976677a675b90d336fb118dce6a121 py3k-cdecimal
+80349 3f2773ae8448ad229174e39ad33f3f7c9d59d9ad py3k
+80350 54780042d1e7d743567e77b6bdc28352f0bce76a legacy-trunk
+80351 8c0517f50c4e94920350e8dac8f5a52c6b25df8a release31-maint
+80352 de3945101a6e00b61c519181f4a07a079d43b924 release26-maint
+80353 7fc24b4e5fedc8e4b804632c222b123abee8903f py3k
+80354 8899f408043c47755012cb2a2e6c964caab432e0 release31-maint
+80355 3d737f2ab90140d00839cf4109cea18cb9bcf405 legacy-trunk
+80356 2c3d7bd7163648a0930b8b195648f750a7ed9c47 py3k-cdecimal
+80357 736cf751ff4f5a573e2c113dc2e35d13a8b406d1 legacy-trunk
+80358 0e64ba32292ba57f2b2ae8cef54fe76f3d3209a6 release26-maint
+80359 b3d20d446638982e5f683e10ddf0346f920d8c68 py3k
+80360 db716a74b517fc5d92f25c304f211f90e727f819 release31-maint
+80361 dd18cccb55b08d9e99cb3b0f83d1c78722086e92 py3k
+80362 9dc864ef6425d5ee82f84269b8c79c462d1bac66 legacy-trunk
+80363 917d6a74fd4f3a484b419b29621d5187f36f9d15 release31-maint
+80364 87c98fb778b4fd02cfcdeaa02b1c5f3b98e552f4 py3k
+80365 5b726c601e22161a6a0cb63d7854ec2d538dc92e release26-maint
+80366 3a8a6184f40a54ed7ed98d90a8cc8fa4e3c31897 py3k
+80367 26902d9be033c6c02a89574d077ba471df9c4d7c release31-maint
+80368 c013a71829bf23fc7713eb89af169bcc1ac7ff56 py3k
+80369 4ad904602461ba0cc91447a1e3da71a2087e7b7a py3k
+80370 59ad244fe2942900527905e21e36c96554409171 py3k
+80371 87d988235c518e72fec1fa8aa061c31cbbf6ab03 release31-maint
+80372 31d28f04b8235596bdb274c7cbcb177615ecd54c release31-maint
+80373 88c7dd3d7579b6cb8b8fba62521cc56e3705351b py3k-cdecimal
+80374 66c9a959c07efe1604adf1baa653980beb742217 legacy-trunk
+80375 b66fa7770bbdfcfcdcb173188917b158388898a8 legacy-trunk
+80376 96190b5b3f6db88ee34c41f74a08553752728d09 py3k-cdecimal
+80377 58963a765471d7f18fa3c630b656986d2e9fc66f asyncore-tests-issue8490
+80378 f632a3861d1255b6a4033bb72947bfc75487b076 release26-maint
+80379 b45dda0b538faabe1f554f8b72f6240c53908eac py3k
+80380 4b7f3ae22c8fdf8f93230fe081327d725b2a4d43 release31-maint
+80381 c4b53433735a2f885f7cdb3e81bdf5e256f4ce04 release31-maint
+80382 d2fad4210dd5fb5b42888d4cb7ebc6af890bfafb py3k
+80383 149badf73bcad16328e1167c19e1095ea38d1c00 release31-maint
+80384 2fe4738eeb23619e98ce8f00014e24b9edde27ab py3k
+80385 b05d025bc0df6ac0bc75a2e0bed8113e35dabc62 release31-maint
+80386 ba12f92134ba49195e01e546f9a7ec61be22ab65 asyncore-tests-issue8490
+80388 a8e093a240949249b14d0c1393a3062bf9903bad legacy-trunk
+80389 edc7f33051050e4f376a88b1f1d127bbc71b3754 release26-maint
+80390 473801ae9e8ed7893053aa1d4315e25dbb0584f3 py3k
+80391 54526eec8bc6e6470661e8bcd8b256d892db2f2e release31-maint
+80392 c9a32edd2ba7c89426156ae5826546c1acd24804 legacy-trunk
+80393 8dd1241238010c8506dd71d0292895856f21e4d8 py3k-jit
+80394 1d18d73f29b53d179a6509e9df1691316d305561 py3k
+80395 9228c6ac6cc678e3b86e629737999ac44c90eabe py3k-cdecimal
+80396 5a524c6d4e83523469941598649189efb446a1f9 legacy-trunk
+80397 3dd606353ab43b9603c150feb1eedbffc628ca6d legacy-trunk
+80398 052d48515c762fe77c337d488723713d4255bbfb py3k-cdecimal
+80399 b4ed1727df74cc0cc3c0a1c26588977a90f6f3ce py3k-cdecimal
+80401 562967881dc525debc2a01bfa47d3ce3cf0dbeb3 py3k
+80402 e6564da01718a5b25fd49719efc8f72862bfc203 py3k
+80403 d2c512d0ecb62a348c2e9b236733dccae23ce82f release31-maint
+80404 86fadaebcf66d3a010770269f3d2aa8dabdb1ff6 py3k
+80405 c6b4f4f2b9a8b70406b7e093485c5755f1dee74e release31-maint
+80408 2258250c1fbb3e7c15f2b35579527cfd2aa9832e py3k
+80409 d426bbfd5bd792eb9183f53b7387447da7e63366 py3k
+80410 fff81d72628e3ffa10b5f8402e5b001c2fc3b9b1 release31-maint
+80411 e7606c1541f8b49f20ba0958eec03b7e063244e9 legacy-trunk
+80412 a059ea966b8cfd1578f2e34e110350b813b63b73 legacy-trunk
+80413 8428eaa2d3ad101ca3b24fc5e4ff6b1b220de41f py3k
+80414 81ef1e8452fb059d915ab751ad5053a9ee3393ea release31-maint
+80415 612e86ab05f131b6a0029788a73d695f981050ca asyncore-tests-issue8490
+80416 52cd7e040fef0d162b87707b4afb7be94de7e356 py3k
+80417 610a8efa88db6561b378b721f3d7df9c78d7ef79 release31-maint
+80419 0ec16d831990584fb327e0a8859c8246c037472e release26-maint
+80420 fc97784e5cc21f29e566b61cb130c787cb150e72 release31-maint
+80421 dc8c8d54504e184357380acf15ec587a31ab2cc0 py3k
+80422 67a604829c970c7bb61aa4984212a4165fbdd48b release31-maint
+80423 2c31dac694ff043c8a7c8ce513704511e02f789f legacy-trunk
+80424 e79a6c802934189f69a773fbb435d2cdaf5e253f py3k
+80425 74e49fb5ba12b2e3ac39b8eb4689c4231fdcc57f release26-maint
+80426 81aa00284bd211900cef0c9069f651f725f5b4ba py3k
+80427 54e5ab29b30bff4360f2bf975b91074ff3e560ad release31-maint
+80428 d7c783ef45486feb847890b4767a454a62c84c5b legacy-trunk
+80429 7691899e185f2771360e6f67dbc6e98c7900308b py3k
+80430 95c5e094b38064d54e3cee62449160d7b0b9e10f release31-maint
+80431 068a2e7157acecbd6c3192b208ad4cb0fc17ac9b release26-maint
+80432 ca0cbac7b8981cdf0aa311ac6e988dd5e3b7fd08 legacy-trunk
+80433 587df0d7478533a8d09fd8bcd05533b9daf304a5 legacy-trunk
+80434 672adfc5db4799bbc748365bd8245cf0f1d4360e legacy-trunk
+80435 65d6c7bc5d5a4647b7b6c0c446a3d0628433ac07 release26-maint
+80436 80810d82318fd073a49f2046081a8ff89c064b6e py3k
+80437 d81eff118d818ef61f823d9ac965aca833028809 release31-maint
+80438 5e69519c4e37db2e18b604446766663a95850e55 release26-maint
+80439 3b8341d05216ec88f958a6d6cb87759daf0e5bc7 legacy-trunk
+80440 2a768ea060230e5c84a814e8b196b789ae249700 release26-maint
+80441 64461f68a10e01abfab1f52d733c9275ebbcf861 py3k
+80442 91f9168aadd0e33f482bc953b61b53f391c24aa3 release31-maint
+80443 f4fe53f866275652ec18661a9c3bccd122898aed legacy-trunk
+80444 e9d888c08bf8a16a67cd41f5fc83d0b8e0e67715 py3k
+80445 c39acbb63ec3f51c9dcf3ae019ca1732b7c635d0 legacy-trunk
+80446 24ff8740e4810bc7625ea8f69712a48e01171564 release26-maint
+80447 3a9a22d7b22e8126ec3cbe951428cf0529900519 py3k
+80448 7bd38472ea21225103ef4f1187c20496c2907fce release31-maint
+80449 e4c1ebcb46048e17fcf37a9a6dab8abe2b020250 py3k
+80450 79128efe8a993a1c67a55710742bc0d6ab372832 py3k
+80451 a09d7f414cd15c1627d6112639aea22f3e65e061 legacy-trunk
+80452 76a052eedee67f4195c1bed23f8ae89e789ecec8 legacy-trunk
+80453 ce4916ca06dd037ca12201e58b936fddfd417a72 release26-maint
+80454 a51ad8f09b6f7f16f149134453c436a6856c4cfe py3k
+80455 5ed34f3f6c3551c2525ba912679e3258c6989855 release31-maint
+80456 a9196119d335b2e0c21cf3165a008e0abee60779 py3k
+80457 0ff8adde609cf9e177e8d50abbf021e6a4f1c515 release31-maint
+80458 6aff9b0a288d5f455044206a256821ae92440c46 legacy-trunk
+80459 7e2229877459fe3522583ce28f922fd9d7679529 py3k
+80460 d5ece48e1606dfee62b0698e72f227060048929f legacy-trunk
+80461 920f34106c344c6f92e07e83559d45b577ebf603 legacy-trunk
+80462 46989ccc652959cdfff7c1ce67f93bbccfbf006f release26-maint
+80463 0f87be6333da37008fe112b676aa7ec6681cc2ff py3k
+80464 d053bb3d7842cba1fc452302c93360aad7f399fe release31-maint
+80465 eaf562f5807de191d41173a8a51b753651ae16f3 legacy-trunk
+80466 06322aba84faf577b225e6ec74df361175878744 legacy-trunk
+80467 9808db97985411490a51560066aa5a6c0fd9e619 legacy-trunk
+80468 bebcc224c7c2c3be7297788cf3445fef23f5d80b legacy-trunk
+80469 5e2d61751d9809f3255abd5061a35cfff0a481fa legacy-trunk
+80470 0363c697e0da30808c8091aaea4f31fd32ae1f57 legacy-trunk
+80471 c2ffd20d6cf896e9fc0a64ccc20ce9dd97df894a release26-maint
+80472 ede16a2792b4c859733fe37a94d899f70f2c0de1 py3k
+80473 03f31f7e76276adb9324478a503d5104b4e6c12a release31-maint
+80474 d23f626a737991aa248bb1500ce4be7fc89c88ea py3k
+80475 fe0c47dd5f84f140a677b7af0a9968446e0b15fe py3k
+80476 6fb3847d39ef39a057852fc1cc1a2b52d9fc4910 legacy-trunk
+80477 c36c836ff4651265ce34aebced7c63901bc8e6be py3k
+80478 b9f2102ad5f02685f6ce6f3d4a7f4d448b2f3137 py3k
+80479 edfd0e1b9754d7e5d59217c74e02f65e4458305f py3k
+80480 5ac0aae28f4c022de2a7bbfe9edd5193f178582e legacy-trunk
+80481 96ca50cb2613593afb23d7ea81b1d59a156bf088 py3k
+80482 d804dd95737c3af3e1e8de6bc57af0271e328561 release26-maint
+80483 c1fb7d5ee4373b94a911cd3db084d24fd0ad889c py3k
+80484 5f19622207928809cbb6472773651a03d02a9566 legacy-trunk
+80485 e98266c51a0e08e1aedc11de8d5e84d252b478ef py3k
+80486 ea43f7f6e84cf95f7c9457bcba11e833babda4c4 release26-maint
+80487 f523e40df9c568f7bd741cbfc6d97f1eedf09c64 py3k
+80488 c02144b1c98ca0a1f2576bd4de8efb6678c667c8 release26-maint
+80489 6548c23676a687aa2deca3ff1fede3a2855995e4 py3k
+80490 ef0a8981c37031c0d5f40857a99c2ef95bde5f02 release31-maint
+80491 9165232e6d1ae44c703c6c71c586001e2302cb02 release31-maint
+80492 8c717912580324e7fd1135a9b6273e4360049f4b legacy-trunk
+80493 2a030c1ce972d58703703a96f64d8635baf6cbe1 py3k
+80494 b71826249fbe13c7a34dfc1da4e5f0efaf73bc94 release31-maint
+80495 aa6854a6f6d1d084ae0b5f7f6145b84bdec5a2f4 release31-maint
+80496 d2a4e96b54a6cfe579cd4251360c123a18f894e3 legacy-trunk
+80497 ab8fe947732343d2e477ba5665e4ddf4b3bd25ce py3k
+80501 efd70553a0989232ff1f6b47bdf3b53c00f57c6f py3k
+80502 c03a3c6a456260b6f8c055d9f41d14a95cd8889c py3k
+80503 d63bb35de2f00aa383b0e3a4b4c99c2318498201 legacy-trunk
+80504 048f6a92bde3a6b8d753b0c1a1c845e94a873351 release26-maint
+80505 10daf634e24f482698acf794e746eded3396645c py3k
+80506 cf204a73783d85dbc04db4bc8e59b1eae4567b37 release31-maint
+80507 7fc211df3d5b20504a4dab22df9f1e685e228acb legacy-trunk
+80508 860073505aca329d40bc9fa0ebe11430dab03b9d release26-maint
+80509 3fe8cf787353037484f3d6cd10d6b0a956faa56d py3k
+80510 b877d2d04c14675b120e84fdb4717bbb006d6259 release31-maint
+80512 309035c22dcdccfb6bcdec6b0625ad5f3fb0f481 legacy-trunk
+80515 3b244eb20fa13b18f1513a4a701bcfe3fdf09882 py3k
+80516 d5590a987cb06e0c214134735c958423a644c9fa release31-maint
+80517 dd466494546dde3726ac5d84fc2d6dd4d4dea029 py3k
+80518 11c9adaef96b0bc361ad95ac6c8bd078c63950b4 release31-maint
+80519 1571f09f4a2775dd386a64e0446621ee21df73e7 legacy-trunk
+80520 784cfbaa229f160cdb6a0ffae9936f6fd6435be8 py3k
+80521 83b93036ec3d7c65bda3967c3447c77613515e7a py3k
+80522 18b2dbbbc5b2523725c02a8b1e00dd2e2fdebe7c legacy-trunk
+80523 c07d2e5acf65c1f36aed6804beb5171509e4c028 release26-maint
+80524 22de6c71cdb415216edf7f3f3348b1dc1c16b554 py3k
+80525 46aae406742d9f163fbcb4b4c3dfc27d5108a353 release31-maint
+80526 712301506730d74213f0d4d42d0c85385336ed01 legacy-trunk
+80527 6da9eafb1daadbedbc030d175cce0a6b041461ae release26-maint
+80528 e25c78a82a083b8fb996e1e518ecb2596e25ef3c py3k
+80529 d447c60fb4d886c4cd773e8ac50338f245a15107 legacy-trunk
+80530 1e1b2351cf12fb4582c937ea2c7fe998c4ee9c36 release31-maint
+80531 ffe99f522d863bca9a41bad9762fc2ae5c4041c7 release26-maint
+80532 d62708ae26a5536c0a05777533ed2332ab022fb4 py3k
+80533 c869408d4d3eddc1840964f17a2037bd5bb4cc64 release31-maint
+80534 61ae664de56ba05a17496256076bf9a8e0022738 legacy-trunk
+80535 969ef5eb80c435327370764ba8d902d0580e696a release26-maint
+80536 f10a37878d842d27219aef6f1a15e424211ba6c0 py3k
+80537 71152ce701ea5d42f86775b8fa85a49a2b01ac16 release31-maint
+80538 5c382bfc015a664db98e8fd176762605fd82f45b release26-maint
+80539 6a90dc967fed00c1376b801bd1dbed82d63abb3e release31-maint
+80540 448ef900081ce2c886c386f87c9f93acb8504a7f legacy-trunk
+80541 eef4b954d644390e47fa9b2c25d3cac8db7c4e3a release26-maint
+80542 cafef7454df9ecae69cb1e39f53ac3cf2d6abfcc py3k
+80543 164b3acad9daca13e00f9d09e2b28a7ee3d2d5dc release31-maint
+80544 adc0797ba9212f31edd7172f988cabd3e394577a legacy-trunk
+80545 3691d75b0626384164ed83321268754027b5ce30 py3k
+80546 6ecb3c83fe81bf05621d1ede34449e742d3839c8 legacy-trunk
+80547 17cc2f53256313ab9d5348e002b88b17dd0131fd legacy-trunk
+80548 ccb1d5ef04d6a922cdf3c5879c157463231a7f89 legacy-trunk
+80549 ae6f5865b386041d1d8b0f4a348a7d3b60f4f136 legacy-trunk
+80550 1ab24941c996afe9709ee474cb21d11f8ead68da py3k
+80551 3b6979055f5ae1894753b51957498af3ca8a35f1 py3k
+80552 6d9d8545861eea4b4f93e61238eaba949c2a865a legacy-trunk
+80553 137916543efae78826a53f0d43299217974a5cbb legacy-trunk
+80554 c7a5822bf294873638e2791fd54331861d3101a9 legacy-trunk
+80555 07ce5af317ee2b3be296c81f41364db9fd7118d3 legacy-trunk
+80556 fb10ef0efa23552be7efdb9327960c6e60ee5d77 legacy-trunk
+80557 fd3abf82ac9605ca28acc8a051fd3323fe2d2e83 legacy-trunk
+80558 316b57017d0f2574c200b9fd04718bceaab2fff6 release26-maint
+80559 8c646967ba6b7f394841e6306f67458cff32b97e py3k
+80560 827920c546af5804f657cb2d32cdf9a0d4c8a9c9 release31-maint
+80561 4a69d32a17b9076e726087c72d3916c542d13352 legacy-trunk
+80562 45721b9ca2204144545e79050c6ee0a9e0ad0d13 py3k
+80563 81d7033d95a35e43a8011be87137c624d4a9aa21 release26-maint
+80564 b88aa13ceaf2541a46ad1487498745fe8e3f6336 legacy-trunk
+80565 967f7bc2dcc863541f12d76a3ae3b904bcd72a10 legacy-trunk
+80566 82d4872413067b96044931f54d620e522b7d5040 legacy-trunk
+80567 b0f342ab509518a6c0256ab1d56083eb86c24ee3 release31-maint
+80568 f090bd72acd82a6104119af60ea08f4897073fa0 legacy-trunk
+80569 0dc2115f6bbeadf087222d3b592dc3e7ad2ee9d2 legacy-trunk
+80570 baefd7b425f1781cb519ec39597528b20b68c6ea legacy-trunk
+80571 3a048420003438f576d20878b22096eb22d41651 legacy-trunk
+80574 e84a4cde79c7ca0b613b2b4734688b9f51d0b704 legacy-trunk
+80575 ec7715ea2c7512bedc223455268c02776f2bb4d0 release26-maint
+80576 65be1e678e63e268c7f6d034129078cfb6b57a95 py3k
+80577 d74ed7e21e6291a9ffec9a0ad198a21b08dee408 release31-maint
+80578 51e30b916fc497cfebaecea5d69ea7cd7b819bc8 legacy-trunk
+80579 220d4767fa9781bbd56979ead178323dedda2189 legacy-trunk
+80580 0b5c48c762243e7fac5957a1bead7fbcc574a9b5 legacy-trunk
+80581 c9e40cedc8bc25fefcd96f1bad8bc798771f6735 legacy-trunk
+80582 ff1a593f8d23c1f77882cdda3ceecd44155217f3 py3k
+80583 57548cce1ea05ab61444a67d4e3c48887bf8de46 legacy-trunk
+80584 1e1cc672ebdd2765f3a8fd9f81aae8d790a253ea release26-maint
+80585 04a18e59cc2c404d02d43f03029344d258341f83 py3k
+80586 cd88f5fe2d0652300d9383be86e2884c8dfda463 release31-maint
+80587 fd7ec607e101a5943c2d49a17198ef4a39fc8e70 py3k
+80588 6950eab51ffe617da0134287c3a8c5d0530d931c release31-maint
+80589 a43776553ab530783cb4cdc16779efcd5e8f4bce py3k
+80590 05fe137b7eff0356868c5900c3ad1038483e48fa release31-maint
+80591 721692ed4a7ca99e9d99dde7a11d73976c987be1 legacy-trunk
+80592 97ce6ce6a28948bc6f455c883bb6f6a35711f5f8 legacy-trunk
+80593 0f65fbe66e3a3bf9a68ac489368c6196087ac744 release26-maint
+80594 59b2adb52b16b189323464d20f27d3bfc7534c90 py3k
+80595 e7f05db5f3b03274468c8feafbc66222c23bbb34 release31-maint
+80596 807fcac4f17b53a46a63a1b23c0521a2fdddc895 legacy-trunk
+80597 ea83a61f6430e1a5e3b7a60fe37fe88f5f0238d1 release26-maint
+80598 0f3f8b9eb6ff8db1da9760c88eaf39d227a8c7b9 py3k
+80599 1d2b322c46be345d0ffa7b1b8e2c78480fe936b0 release31-maint
+80600 493bb4585e380f0990a5a0514732e8e849c5b6f5 py3k
+80601 d9afa5d121ea7b689579b326f9cbaa2ba7a5b08f release31-maint
+80602 94e3e989ae23f7dc4b7727a17117b78eb91ddc52 release26-maint
+80603 185de31c8a6c9a946eb298d492b951102ecfd776 py3k
+80604 007319a9c888cfd6500d39715e42efb29ce0ed6a release31-maint
+80605 5f8830935d74449426c8e433a00943ba7bb856cd legacy-trunk
+80606 593a225502757d39f5583a517b7fb0359f71685b legacy-trunk
+80607 2d5c345f34b99cc873ab8d9bd5fb5cd17c406281 legacy-trunk
+80608 01bdd53f74899ed8a4173695a17b398e4e1088f2 legacy-trunk
+80609 8400913fcc555d664a2df17185deda3a723b9c7c legacy-trunk
+80610 3431e133913c9cf84e9c76f07f67fe58b5dd1a0d legacy-trunk
+80611 486fe82bafb84f785ff852bd0c15fe5d621f8064 release26-maint
+80612 778121b2388b3d15fd7982298039ef28bcfac161 py3k
+80613 e918b84ef968cc89055ff22acc01bf7f982c6528 release31-maint
+80614 4b57019150a8b3dcefcea7c26b25544e9ab0293a py3k
+80615 77ddb8d3c43354d5e3a903c06f08c56ee7e12dbb release31-maint
+80616 4d9634b8449bb8d4843a11182420235bdda2ad56 legacy-trunk
+80617 6cda601f4c5856fa6225abc19c7ab79808ea0354 release26-maint
+80618 9e50572015ad5b19155768ca78ef051d468195ce py3k
+80619 405237b11104253841085c753c5a3586655fa46d release31-maint
+80620 ec6e9e0e316d289cd59d240b482f5a7384cab99e legacy-trunk
+80623 47fc6fe5e454fcd18d9637ac3dc78ae887965180 release26-maint
+80624 fc822af11bbc68b681aaaac9d4f0540dd8c44377 py3k
+80625 d66db1b22d10989496a91bc7cb20a01973f0b467 release31-maint
+80626 4ddfb5dd4bb794ba60e856eebc0c84e45c4196cc py3k
+80627 c482b41ae8554fa4c37c11335b3e08d221c6619d legacy-trunk
+80628 06e0110b08208b91cdb4a3eb1220a5e606b924ea release26-maint
+80629 f6270027e499f196b00d5c9836e8bfbdec4b3fc6 py3k
+80630 ace3453778000cc03db565cf254a285340daf3f8 release31-maint
+80631 c90881927bada6d909ac5d4fd25f5aad71786eb2 legacy-trunk
+80632 b6b3e4f777c96e6b35a772294ec58aa143ed9c80 release26-maint
+80633 9cc693f9a5de03d7a6afd4bea631cccd43d86d2a py3k
+80634 f32b8a3ae9d60294e310ebdd28844adf76ff4593 release31-maint
+80640 36a4179810f0b670fe4780c8919d49140f220cfa py3k
+80641 699049b3c7d713f389f8fbd837a9c2f8bd5a2db1 release31-maint
+80642 2d2a858fe3e194cf9d093fc37cb55c1504c97bf9 legacy-trunk
+80643 7e361a6a2ac822e75139618b52f071e37dacd8bb legacy-trunk
+80644 fe5a006af52bde72cf28401df231225ee7ffc1ac legacy-trunk
+80645 9fcece405e29511db48cf4f6d7f4775af40b209e legacy-trunk
+80646 5a48865bbc1e6b03cd69534efe6a94d0e1bc718e legacy-trunk
+80647 c2e0b93f869f41cc5a4556cff1f0a5d9985bcdc6 legacy-trunk
+80648 bfd2541d8ec5a350980229a14968e6984df06a24 py3k
+80649 10206cb23c8021bfb933136ca75969d84f472880 legacy-trunk
+80650 621d2e984d1876d08dde6bb0b188373bd2ce6a69 release26-maint
+80651 2d3aba8cf6a348c67a288ba5b0d155611b223ec7 legacy-trunk
+80652 2bdb8ebfc4a9523d5951cdc1be750575195cdf1b legacy-trunk
+80653 1b894594490fbe39f0f2e6d6fd5f8709ecbb658b legacy-trunk
+80654 7a35e0b8ae08c5b527448c155a036d66bd5536bd release26-maint
+80655 e47aea86f714334efaa1204ed115ea2bf3eedd3c py3k
+80656 091d977c4d3743cd947c21101d7a20b4f2715fea release31-maint
+80657 bc6230c66c141e0abbe211300c70967fd4c2fc2f legacy-trunk
+80658 00ac4688cdcd0f3d33e268f21234cd5047c3c949 release26-maint
+80659 7a9d172a15e909e1d43f4b06c958558eda50b126 py3k
+80660 af810431bdac9f32a5d5c5f5526ad34e5b2609a1 release31-maint
+80661 591de6c9ffe94748f54bf1753fb149fce96b110b py3k
+80662 51cd53d3f600bfc5545409c36714e8cefd85de29 release31-maint
+80663 774230078926ef7f6e43d1191c32518873e9b4ce py3k
+80664 b25e4ba4af616e933a90ef976959147f4b180262 release31-maint
+80665 8fc987cac913f2cdad4824faa46dd198ca5aa438 legacy-trunk
+80666 3e4513947c57bf3bde1713e6762de33dfaf9ab9c py3k
+80669 3c4cd7ddf1d0174664b0e8605837a055557a1733 legacy-trunk
+80670 3eb6ead99a61ad1280e285844452f2a5854151b2 release26-maint
+80671 c9060c1c1f9054268dbc820d2458b22996c18b9d py3k
+80672 8e34d59badf98f7d62fbc9b942a8b5d23aab1eae release31-maint
+80674 ab642379ddc029456a2ac801e0a4ee1f39661df2 legacy-trunk
+80675 abfc7ed355e4e112efbf315a41db9cdc97009545 legacy-trunk
+80676 5b6a7f2a05c6d16d259149ce39b4e300252d6a1c release26-maint
+80677 55e0eccc7f46f347df400f3a48221e6727a4e702 py3k
+80678 52a3ab5e8e8cf659d7009b1ade612c6bc6ef366c release31-maint
+80681 3ebac0e460e039e3984c6940837df57d6fc14bfe legacy-trunk
+80682 245e433d60eb5dc53e11d3f1bf5f8a84f445b15d release26-maint
+80683 19304d823c8747c097a45a10700bc0057b78963d py3k
+80684 82da290ff7223e6bbad163c56982c6edde62182d legacy-trunk
+80685 2db4b300a42085642c55d875fb9be260dc1c8fad legacy-trunk
+80686 58be3af130e26a9eb94e3487bf555a0077e64aa4 legacy-trunk
+80687 f89ba10f97349599e70bb90c2a71ff9ca99c2f9f signalfd-issue8407
+80688 e28fedf36359694d3098764d3079d728981236fa py3k
+80689 21355daaf23a46db976c2914286fb68371a08f19 release31-maint
+80690 7b307a302744758d20e2022102fb03465a273c80 legacy-trunk
+80691 f0e21ac795f475c38968d356e0782c0b48afd157 release26-maint
+80692 fda1ddae049c676ea1446ee5cbd8db88d40f04d9 py3k
+80693 4685709fab3e13770651170aebd1f0eda534ff92 release31-maint
+80694 9f4ca00610e338b10c4cad498ef67b209171a4ae py3k
+80695 fd26eb9fb0f92a4a39a942a1b47b343f8f6641bd legacy-trunk
+80696 94b52e5cbe2943beb4da5613286ce9d0d80b09ad release26-maint
+80697 abf2201dc37cbef1c0418af96071f4fa03e3ee6a py3k
+80698 21369d189d9e479f430f3628953c28ec06303f4e legacy-trunk
+80699 7d98e0ea9db354e3093ce5e77355569978b152f7 py3k
+80700 d95df2622f9f5b77479788f8dabb602359404c78 legacy-trunk
+80701 b1dd771545e2127e3d9fd70418df48ace13c37e4 release26-maint
+80702 431267626a035ce4e92898a6b44c362dc5de1f5f release31-maint
+80703 cf0361c02551d09e2a0fc656bf25a582d73fc91a py3k
+80704 b3c3b12460d4811091ef0cd14a812e8cfc8dbf2a legacy-trunk
+80705 8b75329924642eb99e0560417dbd2217ffbe6dd4 py3k
+80706 c62b1d02551ae286416a63a94a563e7d6f7f633d release26-maint
+80707 a77467bcade0b783a98150ba0615c93ea1916e18 release31-maint
+80708 03c32092d2668281c2bacbdb084025b327f345c0 legacy-trunk
+80709 62b9a7431047f6e99d072964b44ac3b110ba9383 py3k
+80710 d062b8e790521e13f7f93a96f273f7fb765b5c8b legacy-trunk
+80711 b7fcb2af8cb408de67abe851e0008d396696407d release31-maint
+80712 56d831e6f50881addde8524c7bba00262b600999 legacy-trunk
+80713 4767c666b25b08b3bf59b4da1fe76741a573627f release26-maint
+80714 5d4a5655575f2c4c6da4ee6acaf03b92a31f19bb py3k
+80715 3ed28f28466f606a16ad24f8881f659740dfe0c7 release31-maint
+80716 f992ced32c20578a29301cffe2326835cd830eb2 legacy-trunk
+80717 d92ff7081b2039d6cc8559c1b233b0bee15c749d release26-maint
+80718 f0255ef4dbebd1f238ed591bf076dc3a949a7bc3 py3k
+80719 7aaf59d8ef0bfbb4adbd9a4fc34c3325fcc6249b release31-maint
+80720 9b438bb06d4d623e2e2358c56776bb290af62f11 legacy-trunk
+80721 fe3bf399a19c126737eb45824a92457a2af8c9e8 release26-maint
+80722 81cef5b74f1a7ae59837e2b9c78e0e0341579159 py3k
+80723 ca01abd8ad8716fc37162c40a28a8a8b8455dc7e release31-maint
+80724 4fd3ab5fa71d606ae7e2803129298de7beaf32f0 py3k
+80726 6850aa786c18767e7a3d24d3e92d36d9c55b8e93 py3k
+80727 512d61a692e4eb37ed573fb7c09107b1584a4719 py3k
+80728 138bb5c930747faeb64e483e37f205d4a4dc465d py3k
+80729 18cc05e82752271e664b53fbe604516d545bda9c release31-maint
+80730 e9910d1932146e0a5392134df0640b286ec91352 py3k-jit
+80731 181cd1492cb0c75ba97db32019fbb81373138a21 legacy-trunk
+80732 a118905272299fb5e6a2007349a0aaf704664d1d legacy-trunk
+80733 02e187baaf514d7b962c3a04e4ac319a977ecd51 legacy-trunk
+80734 0cf80b70f838a0381a32cf7b55f364845d034dc7 legacy-trunk
+80735 982eec9a8c28853afd5e4d8f9894070e8d58fec7 legacy-trunk
+80736 eb470b85e67afa65fa3bd3002379f141d3dedac6 legacy-trunk
+80737 7ee562ccea802c136987f1b2f90a99d2d994497a legacy-trunk
+80738 636591f4c2162a9100032ff00aff489ddc1c26d8 legacy-trunk
+80739 8142453db80ca001b5178dfd63cd3ced635c1d82 legacy-trunk
+80740 7c62e72d856b292327ebd289a02aefe0f79c70ba py3k
+80741 f6569e34bd281aa1e21eb11793825cd1234e409b legacy-trunk
+80742 7695f6a7e3a3b64262f72f99e5338374f7b6313c legacy-trunk
+80743 66fbca287a011842c101b662f249242a6bdf1540 legacy-trunk
+80744 3c7683d6a3c471364e2983656e2e8552e587b23f legacy-trunk
+80745 85d693e5f2293bb41a152f1241e1525b3325afdf legacy-trunk
+80746 55a593cc32803bc74dbbfaf3c69a4151ad660888 legacy-trunk
+80747 cd33d6cd2101956433952afd32c26d5b7bb3d881 legacy-trunk
+80748 e0ee0951e953f151cf3fc08c7a09f75245d55392 legacy-trunk
+80749 5ec155ec7db270a4e50efba89b05cd81d2c2549d legacy-trunk
+80750 d176aa4732875678f4deed48c8d05a0f57118ebd py3k
+80751 a51537e704a9b444e6ce5984c802cc895bc6ee16 py3k
+80752 b760f6ff89eab27a24cb50e5bfec5e4eb4c99ec9 legacy-trunk
+80753 c0ea07925400284ff49c1ee714e9dc253af56a9e legacy-trunk
+80754 ecc32e2f46566e5dec9f69b4822532f519400b1c release26-maint
+80755 18334f23f686fc258964024d70b9c14667e7e650 py3k
+80756 1143972f04bbd577880f1c3bb202c01441231c6e release31-maint
+80757 1b4b506aa042769f90afa11a1f3466f045436dfa py3k
+80758 f550ed89398f58e51ad95e2e524e792fc7dac4ce legacy-trunk
+80759 6f4668b97d684035439bdf38f59194374bc1e162 legacy-trunk
+80760 c74299de801aba35b36209495207cdd853988613 py3k
+80761 f384e11c1bb5f68a877d8a953d7ed7b3de9fe343 legacy-trunk
+80762 3907d52648a0f2561335e70eb8108e87d80811b2 legacy-trunk
+80763 adc2ebda7636aafbdc7501cb076c776958837a3b release26-maint
+80764 0a4ca892a59e5e92981913f768059e805ae90616 py3k
+80765 9ba6fcec4f149e17a2212754e5c9394b614e072a release31-maint
+80766 d92280517305371c052bf12e4db67cadd7e0d27c legacy-trunk
+80767 8c9b785b1849d06b3d7adddc450188d6d2f6a63b py3k
+80771 d49f1310e23f902ad8ae37e8d575047e4d607c3e py3k
+80772 6e4bfcf2080c716166ace47abb2ddf944dc9956b py3k
+80773 cf48535132e0dc07ed0e3b7b02b252749a7e2c72 py3k
+80774 e0105fd52032917e300595f3605e5afd5d32f696 release31-maint
+80775 d74ac7cca60770a112daa3d2e7865b3306ac678b py3k
+80776 134a63af22a9a58a8656c281e73ea7f91a2a596f release31-maint
+80777 bb51e4bbff8c28b223cde0118e29500a40f2a644 legacy-trunk
+80778 dd60de2fae3cf6d3ada2c6d8512944460ca89817 py3k
+80779 4380e04343ee985a7a99a0697f26860d48a7b584 release26-maint
+80781 b7ae3a6b1d84b2740a72643a7fd6b3a5ab7dc9ee py3k
+80782 f4411a3cdf139bac779e2bedd1d767019f812f78 legacy-trunk
+80783 31a32e4e0256ff9b13b154c8b5aafa4fb01d830c py3k
+80784 dc68520988a7f9b96a250043b7edf689bc0d2cb7 legacy-trunk
+80785 813daee94f7383f1ea134a1fd1ee57fd581e98fb release26-maint
+80786 fbb5cd345b42e91dc23fd39671f38b1eea26b6ca py3k
+80787 7b299404e7810cd6b9669928df2494cfb7d97e5a legacy-trunk
+80788 f05a2989379ec9a6b3353c26e83870d8724b9c87 release31-maint
+80789 6db9ba42e46872380e09bf754a0a5e6861c90b44 legacy-trunk
+80790 35221c0158b5a72fd14f23c6e590a52e994d2211 py3k
+80791 ccade5772674643757788de43dad295a5d5e01dd release26-maint
+80792 50a4ec37361d00de40b188fd7d87bc89b27095fe release31-maint
+80793 b608e2ed9f75891bbfdf4752ad03c8c4e63f6911 legacy-trunk
+80794 4b68d6c8cd52c4e06f7a7d58e5cb574c2e69e7a5 legacy-trunk
+80795 35932a24be8509cd9b627b7ed8e6e0a53d11109a py3k
+80796 d4aa35907808762ded098f8e1e485efbdcdfe159 legacy-trunk
+80797 627f11440b89e6225bb48798e90f2e8930c00b52 release26-maint
+80798 7483ecb621e0f60bd881c7e035184599a49ad7eb py3k
+80799 8ee80c2f992679c7beebd2b201541a1ab4b76aeb release31-maint
+80800 575e938a8ca525b23e80cfd8380bb5dc5584656d legacy-trunk
+80801 189a2de3e0345f044e580402788baf28d3b9a880 release26-maint
+80802 33ac109de0cc2d2004a4b09a4f4b6d6d45b9f365 legacy-trunk
+80803 80d05630263add258ee3a75e2fa3802c5789da17 py3k
+80804 f6785bce54b5332de5e56f791632c569309e786b legacy-trunk
+80805 1f7506f237716fa085a2a4abebc0c4aa3f0459dd py3k
+80806 90f4b62d4759d048a5387642672c551b753c10ef py3k
+80807 6899139301c9e87c390c0eec27303ff0438bcf19 legacy-trunk
+80808 3b58f2441cc87fdd6b6ca6b5f3245e7b244df857 legacy-trunk
+80809 94538b044cbefab0e9467e2bd7193a56a77d93fb legacy-trunk
+80810 f95c259b80b3ce5ad559f9f846e1762bc6538031 legacy-trunk
+80811 7be8129ee0fd21dd1899050a49951895d99ee044 legacy-trunk
+80812 47a2700c00b49d865d1cd294d96c92233f900cf1 legacy-trunk
+80813 5cea27275af12582b078c3396b323e6c8a7dc2c6 legacy-trunk
+80814 2d8fa74f9263e400129db53c41424e09585cae96 legacy-trunk
+80815 fff439f089fe55ab54b8c7394fe21b94059f4632 legacy-trunk
+80816 6fb6fa802221e7f584a3dbf6b9d24cd81858e10b legacy-trunk
+80817 845c6d800302446ca83b84f0b0cb50780e716605 legacy-trunk
+80818 77b78607600e524d2e867dd54d8b64550f4ba12a legacy-trunk
+80819 3fe4c34f78c029f78e8e3339dcf1cc89092523ff legacy-trunk
+80820 95c400b9d74ca37a6fc727c908fa00b32a807cbf legacy-trunk
+80821 0d14827bcc0dfa9ee20d32d88c451d89c89ced93 legacy-trunk
+80822 8e3b5fbc1e41bf1b3f706a439aca66535fb47997 legacy-trunk
+80823 0378f6e346f03259870677506a7edaa2bba49df2 legacy-trunk
+80824 88466ef1f0cde681808bd323764b449bbaa9cead py3k
+80825 8bf34594b66f3153b980e86b84909811800b9d91 release31-maint
+80826 f3309042a0b31bee16c23d99335297b9b6edbceb legacy-trunk
+80827 03ba60d1e492a39845570106e292b3f5cb4e7e54 release26-maint
+80828 944938abb26ce0609f0430d84366e33d93d12cce py3k
+80829 f4ceb4ae0247dba32622811f735bbae7730a1042 release31-maint
+80830 26b81c4e5fba47e4c66803c3a8965955649e4251 legacy-trunk
+80831 f0fa944b15c0cf1f87060daf3f9277b202e58eb6 release26-maint
+80832 9bea37a850884cdd22791c94a040f2fdc3d2dba0 legacy-trunk
+80833 c424299b3884b40c76a90fb7b577f07f6a230cc1 py3k
+80834 8b5dde2c31fb3f66605f3c956c91bf440f6aaba3 py3k
+80835 78e7fc01c51ac5835f4d53b3f1e116c2c29d8240 release31-maint
+80836 5dca0a3fb993c405ee3a5ada2fbf3972d00e2e52 py3k
+80837 e3e466f53f9ef0a1422de6679dda4e2772031371 legacy-trunk
+80838 995eb96cae686bef35778f0e4b95aaf29785a25f release26-maint
+80839 b303c35254de41317d9c8704481cb3877a1a76c2 legacy-trunk
+80840 6558d96ade03ad3386b95f244b2deb8c5dd5da60 py3k
+80841 2f313008a41d45f2a6ecff64ac632bd5e5a2de84 release31-maint
+80842 63d5b9d38b176fa4b1357a011dd63cf96b2401f7 py3k
+80843 8afd6f28aca9d22ae9bee62a529073a6b5b2e298 legacy-trunk
+80844 f11d4d2b44b67d4a1a7240916df392358a0e0635 legacy-trunk
+80845 e1146b25f77322486433c8767dde23abef0a1fe0 legacy-trunk
+80846 1cfb229844a78c54222627f179d6de3143175108 py3k
+80847 e503bb8b3f615b36f37272ad73e09881b3539355 release26-maint
+80848 dc2aac624ff8f9b636beefd3410bc0c2731b3de5 release31-maint
+80849 016dbab351f2e13e6d0c6f632ee22ac793749f10 legacy-trunk
+80850 85cc3edc7d46e42644bce8bb5741da26da356126 release26-maint
+80851 aa7e6b9cab6d492dc6f70f8a1425fe8616bb1a85 py3k
+80852 e21803c4f1eef5f8926bef6e65e49ecf183b6572 legacy-trunk
+80853 d2a4400578a5c73ed6e7e6f3af2232fd60e97a35 release31-maint
+80854 8942e96286dc64177eeb2ecd233ef1755fbcda0c legacy-trunk
+80855 8b64159792bbb1f7168b16ba0edc650cf4d0a354 py3k
+80856 5b55dc9554fcbd77e07d1beb63ffd191e12f6e40 release31-maint
+80857 0ed1ebe5bc2fc93cf0f0213202e1436b1f66362b legacy-trunk
+80858 e4a0ba251c4a4fdd0585ed46ba7f82da8e4d1d06 release26-maint
+80859 b92ef8ebccb9760b4ae496fe597ef8ca0108f5af py3k
+80860 39a2be4127dd44225cae2588d74820ee1b67db1e release31-maint
+80861 3cbcc274597292d1c44c77a4d01328b8286208d3 signalfd-issue8407
+80862 9965ef825c7f7b2d8590dca326d6b49eb2856d0b signalfd-issue8407
+80863 2d8a3bb8fb608a73a270be55b1c8da346f77de70 signalfd-issue8407
+80864 3da67388b96a37d161e5a55a7907b94f6463d2b5 signalfd-issue8407
+80866 6254c028c63d2400efd1a93363af66bab75054d3 legacy-trunk
+80867 ea7001c3f000ff691379434b5ce0054e9caeca0d release26-maint
+80868 2166b63b6fdf86f6b9fd18f83221ac61e07a05f8 release31-maint
+80869 b4b322b2e98b9901694bbed9e62cd655f34e2cbc legacy-trunk
+80870 346c4c2e386e7435c5dadde6122a53a2c65610b1 legacy-trunk
+80871 cebe2857000690ef21b25e42c20a457a02331852 py3k
+80872 4cdcff0e9a36ed8deaa27653dac0c9c0c2e9f136 legacy-trunk
+80873 6b27a95c2c522814a6e91f3a3b2cae40ff273c15 legacy-trunk
+80874 e4e5486eccbe0e6372b48d314098e7ab27f28a34 legacy-trunk
+80875 cc92502de4c951144b2ce7bff4492d969245328d legacy-trunk
+80876 3b490963f92c874863cc1712ffc131187bff181d py3k
+80877 297e23328c6c69580ba818b785b06d01dc7cf83d signalfd-issue8407
+80878 54efaf6d2f892a95a678216e2184b70c44b9e1c8 release26-maint
+80879 0a83969b6f35db16eb2b6c8929e44aaec67dd345 release31-maint
+80880 9af960fbaccc5e4e51a76b8e354e3a0ccc9cdc50 legacy-trunk
+80881 53f9b84882a05695407d5abee4276a9f67e5ecae py3k
+80882 ab0b2855c9e42913a2d5e16bc67ac39e005da568 legacy-trunk
+80883 ade8293ba487a194b46815a4c7daef5707720d70 py3k
+80884 2d3ae12ad09368dc70599bd320c9335ee41282e6 py3k-jit
+80885 7e5bdf59a4871360e5c04db1a160cc7a099799b8 py3k
+80886 693f74c42e5ef9db3a6c297d29e48f430db3121b release31-maint
+80887 9d76af95c166da927cd8b239fa0dfdb906229f5f py3k
+80888 8ad1c74d590973155401a6a146d7f7c721abfd89 py3k
+80889 2aa605168f112e10369961d6cd83dcc70ab1d29a py3k
+80890 f182e0922dc7476f365d7dbd1d5410b53189446c py3k
+80891 f4230765ddbb178df58044242ad7f00b190165ea py3k
+80892 548fa8edb7f0fb7983922005b889bf62b44c2415 py3k
+80893 5ab4b4efcf61f37d52e163b3be22858eedb9d475 py3k
+80894 a1c9a91260d91a3af5d800c667ece032173cb111 legacy-trunk
+80895 a49256b226957a3093f17ebde76973671b315544 asyncore-tests-issue8490
+80896 b0b7ba26be6c191781210a03249e1f483448c524 legacy-trunk
+80897 5fb3977fb341e37bc99474c519ce72df4305f417 py3k
+80898 83c5f27af57c92ce0437d6904d067d98e3fedfdd release26-maint
+80899 ca77ed739827019f22e13d049374c9ac03720f95 release31-maint
+80900 0b0971daf58c0070724905d835399a7f50178fa4 py3k
+80901 d6151488726f8ae764650330aff46fe6e4aebff1 release31-maint
+80902 5260104db99d743406b15565a2ce5bb48e06063c py3k
+80903 069e7efa645b510765ee50b76f773dfb77a4387e release31-maint
+80904 5981b2da131a1273404dad2ea7cdd185901025ff py3k
+80905 427c7500b2b70c9fc9f52465eccce4ba294c5abe py3k
+80906 2459ee6ac7c7aae02e08e60910aecce614c4a935 release31-maint
+80907 16321834156a040e827068a11d286e208a487f58 legacy-trunk
+80908 5c9094792d1accf409eae4876db99a76c8f3c170 legacy-trunk
+80909 490d1c2036e963561e68c55849911b890d1fa466 release26-maint
+80910 fe7e56f986cd450fe24c534fde18d1450412dcf3 py3k
+80911 e3a3ed614c7e09e3326a7b206848fed6c097044b release31-maint
+80912 61c4ca94a366828d2ddb65ac546c81c40289b29a siginterrupt-reset-issue8354
+80913 e046adb104797f43d4657832f5c7e5c967a4db48 siginterrupt-reset-issue8354
+80914 e29942ea2fdf841f14e9a7a173173434f99b944b signalfd-issue8407
+80915 19bee8ea48d8ab57b529734431ab8103dedf6db5 legacy-trunk
+80916 d02b3173c3c5b9210c2c12e8617a88ac461786e8 legacy-trunk
+80917 35328f06921ce9cf59006a347fac53f9d1a23f61 release26-maint
+80918 5a38e7e16bf8cb91884d3e28bcbdef0d32d61152 legacy-trunk
+80919 facc691759a1c31969b5bb4335afdc01bdd2b2ff py3k
+80920 7967bc7b018d4ae6185cba8ae2150cb8a0a235ae legacy-trunk
+80921 9dabfc19d1ac4ff8f4ec9ce14fa9d0eaa28b6287 py3k
+80923 f737d6cbb04561fa3927dd52e97188cc22823a6b py3k
+80924 f50d5ca4690cb6799242acd4242dfebf7f394fc9 release31-maint
+80925 71aa098a082e26239e9fc1d7956a85115ddd340f py3k
+80926 b602676cadcd85b5a98274236c40b6c483a90f12 legacy-trunk
+80927 f189819045079f8ac20f2e86d921ef5e378cce2f release26-maint
+80928 bcb0cf924693bf05bed243a6f58e632c709f28de py3k
+80929 368371fa7f5c367d4458e2a14b67be2af22ad899 release31-maint
+80930 839953580b6dfcc5e229dd9755ff86a4142a9a0c asyncore-tests-issue8490
+80931 65461a7054967d892a54ebc2a0801c988e0ae7ee release31-maint
+80932 26edab989d2f88554fb8624e6b9f6aa6d25813bf legacy-trunk
+80933 f58b9dece25eb8bde99421b4fe3118b5bb2f0989 py3k
+80934 9fe562a2f0e3145d83a2b5042f8e9b44af3bbc95 legacy-trunk
+80935 e92fb95f231782e071b841cd5c4684ddbcfb8db8 release26-maint
+80936 b4faf99c642f751064df1609bbcc4a796d57be08 py3k
+80938 8258937e139c2263d77a8ae91be9a5c98e8c49d7 py3k
+80939 48d7959167def7dbe9a9f5613e30f0a594624d1c legacy-trunk
+80940 23bd61c7dbbcd556986b33a44b4092d99574ab17 py3k
+80941 c7d0678952d3db8c791f672fb6835587e250ed2a siginterrupt-reset-issue8354
+80942 0e3982ae281d82375d72aa238da97faf233815c6 siginterrupt-reset-issue8354
+80943 c867d991e91f0d22451cdd33a26cc65bc39359fa siginterrupt-reset-issue8354
+80944 d6da381977ce516e4b4167d4c6b2c071f8ef174a siginterrupt-reset-issue8354
+80945 a90372249fd35df6664372ad30d007cc5adb3216 siginterrupt-reset-issue8354
+80946 cbdd013daf6d614dc22f49bc43775f3c92f8041e legacy-trunk
+80947 e2bccd372cd63bbc6e4cd394c2b299295935593b py3k
+80948 85ac27fa913fbaae2e7a00061ca0fb2063817244 py3k
+80949 07a47a5145487ab7784ba91387bc9bf92d50406b py3k
+80950 a77437bde31af31c7e4b9b792c4feaeadb380f13 py3k
+80951 1abb3d3e3e8df52f6fdaee8a45d17772c58302e1 legacy-trunk
+80952 cba1d21eab3d2cde82db91664934f054099a4d0c legacy-trunk
+80953 74ae0eb932deadaf3e2e3e5542d60ea74abfe55d legacy-trunk
+80954 53d76230fa186f56bd7a8fcf15f8ae754afbb554 release26-maint
+80955 7e6f1e80b3c6567e70a0d67d8ecd2aae7d69b5c5 py3k
+80956 4644cff2525be0de7e13b39b4029877751d244ae release31-maint
+80957 f851e7b6e0d5c5d0a9196c1f54b9f391f22d707a legacy-trunk
+80958 bede8507f0acd4c8acffaadc420cf0c5f3a5a958 release26-maint
+80959 db1336cc851c2a85db0cf1b6243da97171ee7cee py3k
+80960 324f89886a1cb6da32be2191d1d12bdcded5fed7 release31-maint
+80961 d06ef30a441edb5bad57d2acf90d4ebad2bf4d40 legacy-trunk
+80962 b7a0f021ff7d97358788fd4692a75d32027c7fac py3k
+80963 c1423b0a9329367645348dd9b3853691c817cbf8 legacy-trunk
+80964 4f7e5089fc97ae7af83fee92edf803a5dd99ac23 legacy-trunk
+80965 afe2592354d97bc51ae4d9717143db1534e8124c legacy-trunk
+80966 4a940d99ec84b1b2abbaaa0c924427a32b03df5c legacy-trunk
+80967 930395b2de9036b0e727d824010ef5f5a2f7fe73 legacy-trunk
+80968 3fae7cb492095b1291e6129005184bbffe51a538 py3k
+80969 c5fde4a42cb0a5e157a6c1cfffb75047f5d9286a legacy-trunk
+80970 f614dbec2f4f792d7d27d78cc572fdd931d10e0c legacy-trunk
+80971 227fa7db50ded03a85467b0153db11e23235f611 py3k
+80972 0d9732f6077692934dcd48908055d1c99370316d release31-maint
+80973 b10c3a24d2f9db8fd41d8ccd54434dca33854456 py3k
+80974 63d6f5fedbf314565b29c78b40c8ad323a0b097f legacy-trunk
+80975 17d21e9e6320133fc2e922605830ba48e88bd1cf py3k
+80976 b94c133db451662bad2930e16e53435e174b4271 legacy-trunk
+80977 02701511b7596c0018ed45d716e25b3101d9f4e8 legacy-trunk
+80978 33cb5b992d392eaf043eebc86d960565cf6d9427 siginterrupt-reset-issue8354
+80979 b7f02c670bd7c4f86b279e0513a22cd7a4f3f229 py3k
+80980 703f8b11b250bdf3744cf7f9926503dd20295aaa legacy-trunk
+80981 9f467c62d95408e412c98c2b022ec7c2d2372823 py3k
+80982 285220f24cc8f3a3ee5261d730e440fb3cb98420 legacy-trunk
+80983 478471ccf7fd19ec63a9031f25e6acde59e6ff14 py3k
+80984 be1adf3c8a332c5af2b384a479bfb23d74f3faeb release31-maint
+80985 e263ac2be4fd42068284d0884fb63cd448d5ce8c legacy-trunk
+80986 2f7ab922121a40b71cad6da8c6b54ea26ab3cc48 legacy-trunk
+80987 3293da83df1e3086b82e07ae3505a627ea3e0bf0 legacy-trunk
+80988 e435888b8825e57f26671e4f647fac5540f744a6 release31-maint
+80989 cafb6225ded86e6d21ee398ba896bcf6ff4eb130 py3k
+80990 743355e3ef4ab11bc2d351c06c8105e179060f07 legacy-trunk
+80991 8ff8f0a526dd07b7429cefa5623466f1058d0b35 legacy-trunk
+80992 f2cb3af5562fbd904bb6152b69f141c36801a192 py3k
+80993 dccdfbe577ba572d6646079fc67745e4d6333954 py3k
+80994 24ec725941965a91fe3121d43576eee504536231 release26-maint
+80995 31b9412cad01bd03fc5f2775f1a1023cea213968 release31-maint
+80996 f2194e68881ebf437619ac0bf9509f478fad7a0e legacy-trunk
+80997 d6df749780c54793c75f44371491c6b0bb45fd03 legacy-trunk
+80998 6bb9891d4275bd42a69b3d903d13b687543c915d legacy-trunk
+80999 88cf576f9ceea25f1f79fbb29d80bbfacffd2e6e py3k
+81000 f0f4118c76e990f6faa3a3a6c3dde151657bdb57 legacy-trunk
+81001 f191d5f80eb041bade5542617fe575bd9dcf543b py3k
+81002 bed04492398ded60636f5a21a8689859acffbb2c legacy-trunk
+81003 663b39d4a7ef7d6787b2ebbea800b19df2a1713b py3k
+81004 4da7fba3370fca0e8994189f128c5fb4ee68cde9 legacy-trunk
+81005 fcb21d2ceb73b29339145075ff48ccc41a1b6fce py3k
+81006 ab9ae5676adae7251f5da12db96e4d744e190069 py3k
+81007 435a8355dab6befc47141dc216c10db0f2b1eca6 legacy-trunk
+81008 6fa8e1381b4993b15360f1d8e8d25f9e849604e9 legacy-trunk
+81009 117b4b81b86402ff299d788f632be9fc4a064bb1 py3k
+81010 2e9bc61c1c1ec7188cfde6a81792168ce1c04b21 py3k
+81011 fb719049044fcc8ad7913d2ff34670f58043ed8c release26-maint
+81012 2c9e095d52f00dd63b3a9d7717243e9d48ef4d81 legacy-trunk
+81013 50fa3f4c829b341b6aab002945fa9d4b2c599713 legacy-trunk
+81014 dd1c8ff2e990308174009cc5edcc0ce92c759b8b py3k
+81015 1139b5d996b0041492b0c04f78ff60e8419d6f85 release31-maint
+81016 b966d5835d3b110ae351eeaa9d1b3523f623ed58 py3k
+81017 d315a79f1eccee5452cbb15a4792d2686b258fbc py3k
+81018 677511edf05c783a9ec93e3c1f0fedb8a0413da5 release31-maint
+81019 03753316f81f7b137fd589fb6ca150123269c214 py3k
+81020 6a2d0cc7d6049ca4e01fd5fbfed012adfed03c5f legacy-trunk
+81021 303db226115dd6cdf091b02ba27229e72068483f py3k
+81022 724e875b1941c57f1b21d7469c0f9a5658abd52a legacy-trunk
+81023 2294bcf40e51957d180da1f54d63c6ce2c9e9e64 py3k
+81024 3dc25d024a51c34b5ffc4642094c0a59c1c821ef py3k
+81025 f8c19c5f5dd2483a0145d6912b9ac28e33f3f6be release31-maint
+81026 d698fb056a459c9a2e40cc2644a4417c961a4f78 legacy-trunk
+81027 b6e03ca8a206def331629908d8519992409a98da release26-maint
+81028 19aac84ac1dadebaf8b7d6a110b8b85dae8fa9b7 py3k
+81029 fd25030223b07027002e7d65956e4803cc706b7a legacy-trunk
+81030 84baf6258c3bf38539752bb3c90e1e0ed7dbe151 legacy-trunk
+81031 e38335d4df91de6427c9a21b541fce4f82d9565c release26-maint
+81032 cab14be0ada159da9f7d94c5ee7c56e61e157bc6 py3k
+81033 f197407bdba2f7d644922ef79388d5c8b4ac858a release31-maint
+81035 5ea0f5858b722a12a7e9a915928b153ff481ab67 legacy-trunk
+81036 bc0cea58447847f23d1b42604fdbc503420677fc legacy-trunk
+81037 5cad10b277a4783137e8286bb3143ba990e5dd36 legacy-trunk
+81038 69ce6c937d6ec9ee4f87a868d6850af15d876879 legacy-trunk
+81039 43d0169df943fa0335e7cfff120f75efad5300d9 legacy-trunk
+81040 313f85586ef8eb8354a01d154499e04372711fd2 legacy-trunk
+81041 67dc0a98b8f6fc925dd73e77c0019d1da7575ccb py3k
+81042 fc46e437227d6291d11f89fd5012941d38a53150 legacy-trunk
+81043 5eb0e545161247cfe6fed207bcce1e3d7e43f282 legacy-trunk
+81044 fb19ec578853339c6000a4ef8a62ef8caccdcac2 py3k
+81045 488dbe262f681d4a18e918216bed3765115f2883 legacy-trunk
+81046 7f5a571b1ecb8a288072d8ede7b90ae41a5406be release26-maint
+81047 20ae83821ef0537292df1f0ab9dca0144f90da5f py3k
+81048 8c499cb3723a4b09e53c2f3bda238ad5fd7e66de release31-maint
+81049 736d6ce9b60baa934dd4bad8cd4f4d537ee2054a legacy-trunk
+81053 945738e187263914feb439f22ad005bb4ff97f5a legacy-trunk
+81055 6a8dfff6d241b50012b9075380659db533afd94f legacy-trunk
+81056 e64798b36ea4def06a672af7714ab945a8a2d4a1 py3k
+81057 da6cf8f3d8c2ec86d259828f3b2766952ca87abe py3k
+81058 f025b6b0fe0f6f9bdadb3ffdbae4a75f071ca70d release31-maint
+81059 3148d70528b6067165c70674eae973c37c9af385 legacy-trunk
+81060 e7629efc55d007e5247f69d0473a8eae9a426465 release26-maint
+81061 0f8507f549429e0c2a472c977e25793643202904 py3k
+81062 bbe9f98a0c020cede667fea3d9186fe8f7ced87e py3k-jit
+81063 829a86e11bd7e14e90dbd64b4b7c3184833ffe3a py3k
+81064 f1358aa33a6e234fd175d4c67790a7e9f06ad87d py3k
+81065 cbfd27db8dc27807f6997bccd85ba287f345abef legacy-trunk
+81066 fc9e215969d836a2af30e1961e8a63700b8acce2 legacy-trunk
+81067 5ab0443856cab8a2e5344704665dbff81db4677b legacy-trunk
+81068 d604fab749dd7403bd8d423af323ce6380e74b2b py3k-jit
+81069 c75512a85fd1aec3ba33ee7e6163cab47a226af3 py3k-jit
+81070 b66ebb777568b0e9e20aa579bc1d72ef6f0a3425 legacy-trunk
+81071 ba0fe024e89fd4ca5556e315d9d955de484aa678 py3k
+81072 45408cb4b7232b9f24d9cccb2341041d439b1358 legacy-trunk
+81073 649d6710a81ff756853064dc39acfad8ab33739b legacy-trunk
+81074 f80e93582b7fe6de833ee3c4fbcd4def18756a6e py3k
+81075 00220ebeed0a8f24b4cd7d035635abad4f0abf66 py3k
+81076 8ac0f0db5f5975feca7ee47bce118aa8d3319e9f py3k
+81077 f15d6f1a2fa30ed83d7c235e6d763c374af44cfc legacy-trunk
+81078 1f69f2819d31357d4edebb267ee3efb449ef3942 py3k
+81079 c0dd33a5adbe6c5a2a08264321d39b8082cbf0a9 legacy-trunk
+81080 0ac11db5fc96e470539d2ecc5e2cfed59cec2848 release26-maint
+81081 011940baefb0be91358201206cf4626482f92115 py3k
+81082 fb62e3a9d886ffbaa1c473fb8815029a08853370 release31-maint
+81083 9c321aaeef126086a3827c23e346f5ec30ff2656 py3k
+81084 81a3a3226cf5dd45b4d72b19a8df31aea263d143 py3k
+81085 9dfed8dd1c6d989543a424c408bb996ba7ec8c81 py3k
+81086 353f40eed1bc6d4ecd7ff0e25785ae6fdf149be0 py3k-jit
+81087 4fd7fea59e5b2bcf370a65299c14b6bb42cd97d6 legacy-trunk
+81088 3e6ca4b03c79a4d4f56eaf690adbfa28a1949320 legacy-trunk
+81089 811fc63190a7cd1a72d7ff5e7b816adbd4df820f release26-maint
+81090 dff6fc3888c62e98e9c4ce01e5759907e047e6fb py3k
+81091 86801d1d90386bab06aeea972bdfc8a2d137f5a7 release31-maint
+81092 30f4bbbade0b7117b53791c8505cbb1dd5f230e2 py3k-jit
+81093 4959b6f5bc86cdc507d8da64109863af9bec2c86 py3k-jit
+81094 5e3934a31c8dc02885bbd8a298f4b1bdc18f4cd8 legacy-trunk
+81095 af2f84e662537c39f50b8bab84cfd07bd78a9f5f release26-maint
+81096 54dc10988f154c0defe6aaf66331e69b78ca78e1 py3k
+81097 ef4de053d577f85fe8aff98c73f8c466e38ed00a release31-maint
+81098 3a8ca67ae4311b049d1f998c569008141bee8ce5 legacy-trunk
+81099 2a70c80349b0ed0a02eb00b7756129b101c2bf43 release26-maint
+81100 48d9664c47a3f587313168f1578b4f29b9919f92 py3k
+81101 4b10ef8a024cefa33077e1c3484c2e59a3f05cd2 release31-maint
+81102 21a81c7aa4bc50f78a30078131eba8a8eee13820 legacy-trunk
+81103 b9d4adf8b17e9ff0abbd571d7932525ffd15b8e4 py3k
+81104 4b8963cf80b286d68e518ea6460b7fc42eb36555 legacy-trunk
+81105 b7604ea2f47e7f5e07ae9f17060aa10f7cbf47a4 legacy-trunk
+81106 73f3b885175db37e01a096157472daa2dd606ff6 legacy-trunk
+81107 773714e5eaaec96301d1cd9beb26a1f39d0ca20b py3k
+81108 2ddcd30533f72fd6076784f69aa08a18859fdea0 legacy-trunk
+81109 6f47960b564789dcf8e8183a525626e865aba8cc py3k
+81110 efaf62c2cf7599b48cf3daef28774b364236c87d py3k-jit
+81112 5debecb48282daa0488cb7100eab25783fdac83c py3k-cdecimal
+81114 b6464014caa07676bcf9cc3bc083e12d85bb77b7 legacy-trunk
+81115 e1836a7b6b6e769c9683211356b9af574cf236f8 legacy-trunk
+81116 1b3ebed8b6c652a5e6bad84ecd889e3c25ad2392 py3k
+81117 013d76aa8951c2c4862e7d1a4c4e2f19f5277182 release26-maint
+81118 330273ec602839abeb7824310f4b25d0641a6436 release31-maint
+81122 c1ba8816b187e93565f728cc4586b39ca82f9cab py3k-jit
+81125 9ec7acf0a005870fe8896e03d92b8895d76c0c8e legacy-trunk
+81126 b554eea2610cc8d702e63323744106f4d533177a legacy-trunk
+81127 91f462b904b1fd2868de126d3788ea65b934558a py3k
+81128 34a686fbffeb9e5a65b33a9102e5384f791cb21b release26-maint
+81129 1035a8fd7dfb95711c75458f300d02063fd43dc3 release31-maint
+81130 06c6d3a67c17b1f879bfc16a4e8fade5844e6640 legacy-trunk
+81131 2c29cd5668c772852e63fbad16d251af7bb47cde release26-maint
+81132 e55632aa68e9742ed4eed9fddd25d91f085ef3b6 py3k
+81133 90a9a34e5eb523c3eae2fc60e14d60783f39ff32 release31-maint
+81134 8410f83fd159f6ee50870be9f24241d87d9295c3 py3k
+81135 68bc35775d3134017581231160ec0d1bbe38fc06 legacy-trunk
+81136 c806edf8d7340eff1b2fb675438fdbd1f1baf344 py3k
+81137 eba49478aad965176aa0fa315466381e8b51e590 legacy-trunk
+81138 431a151e102d526ce82ced534fbcb2e8550a81f9 py3k
+81139 5361f6dd1399639c7ffa10b38b5635bfddb6fbff release26-maint
+81140 ee596da862f827e6e99c85f3b9ac4df4222c0ab8 legacy-trunk
+81141 6cbd4bca097a0afd39c8b5d0f784df5d46943c88 legacy-trunk
+81142 1698c55b2af94bce540854b08753e5cb3c31d5cd py3k
+81144 93790847174a747ad4c3fe3e7fed357f8601e219 py3k-jit
+81145 06364dad8ddd15a4f041e7a6e7ece1d0d2f505db legacy-trunk
+81146 e4f269615a25cce3120263053f1066a81e20f16f py3k
+81147 b386eb83475f49f67af3dc7cecd8df42f89133b6 release26-maint
+81148 da3fa881a800390520bffe699db144a3d6ac8e61 py3k-jit
+81149 e096aae535b9b5ba93a7cb731c283cbf1bfb4b5f legacy-trunk
+81150 2fa73b29b30597507b6fd068df32fac28a338b54 legacy-trunk
+81151 cb9e09f3fa8eec3c9a45ba46efbd3d8d72042dd0 legacy-trunk
+81152 31cf1b12530a9d0aee3c25dc83299dc980f742eb legacy-trunk
+81153 ae4bb6701078e0e3bc45784b904a4e06e5644b63 py3k
+81154 ca496bfacd1be5b7e0543a0af8a4ef19f076e71d legacy-trunk
+81155 ccf1ca73c0e9789e5e684839c64f4d158b3d0a53 py3k
+81156 9e5b73ea6a7ce1fa1c764574bd8421ef3e1fb15b py3k
+81157 9f62f5865b441eb80990a7212983a932a43c1f91 release31-maint
+81158 2622796aeca94ea2fb64ef3e118455e0577c88f1 release26-maint
+81159 58a56aba0eb2c2e24b53ea9a51d6ff5e4a3832af release31-maint
+81160 a6a67b734d8b3603bc62559371e8c4e17ff5e2ca release31-maint
+81163 742f19b470204b85bfdb34f8f8c01be03e796412 legacy-trunk
+81164 0cb0fad514f37521c66a3a79a5c7f008578fb57d release26-maint
+81165 3b247af6cee792dccc446ec6c54b5b20e10d99d2 py3k
+81166 252fe5c4cd53f86dd69ab4b2119a517dfeb99a9c legacy-trunk
+81167 eaf81a130ad6c4499ce2d08cd41f31eea0de5656 release26-maint
+81168 9ee228d089edd28f86acefc8c09c550fef11cc30 py3k
+81169 2b0af69aef97d228ecf72c2a8d3177b14f0a58d8 release31-maint
+81170 ab31b009a1ee2934b0b6e8f15cb7b6d8814a5757 py3k
+81171 9c1a2bd51528c3a7d552c00523e35db2c880b803 release31-maint
+81173 309d9cf8480850e4f8eab39ef99a29387fcf58bc release31-maint
+81174 59ff7d812ae342f6514e03d17d451acac4839d30 py3k-jit
+81175 2369d4f189e42c67744155039bf09743905b34f2 release31-maint
+81176 114c4a42fc1d03073a3dfea1e3349aa9c820927c py3k-jit
+81177 a814e7e72900faf48fd88f1071a2da55b4b6ede5 py3k-jit
+81178 fde9b43545fbaf83c116a961e5429a6a6000972d py3k-jit
+81179 e6bfe93b65bbda243f5332d0fd9c2cbf74344658 legacy-trunk
+81180 0d028d3590da03d8957f8a53cbbeb883eee8fbe9 release26-maint
+81181 fa902f8e0db0edf80a66bf37af46a1b78b53834b py3k
+81182 0e37a95cdcfb5c73f776df08d75fe523b3b91ffc release31-maint
+81183 772036a6f7ef02879c3c5ef27fce6d470dc5b415 py3k
+81184 363effb5f727f8864d40d17e9444121c0aafa34c release31-maint
+81185 edef88f6f1ab61127571686ecfd390c007347355 legacy-trunk
+81186 05a2ab271b65f4836d96324c22adf0673d3dc87e release26-maint
+81187 98c161040002c52938baaa8af60f78abe82e8d99 release26-maint
+81188 d972d052ee2217ab38df0851552e0ea36b253db8 py3k
+81189 c4e11b0c7ee5183bddc22c2aca4fa7f776ccc322 release31-maint
+81190 47b4da86b9b9f5d0f288d0c428302e0acf514190 py3k
+81191 ea5685d9940a3b9958b3e04752a08155814fa323 release31-maint
+81192 bb9ae12633a99a84ab0dcceb15e65a5970113638 py3k
+81193 f3ea7cd735ece741622a891273a3c0a9882be83e release31-maint
+81194 b5ba7ea4246b2ce6f12f837b9d15917195953e27 py3k
+81195 e909601e02199d2405876b9e15fc5f80e7a27297 release31-maint
+81196 1e149b50aca618b37cc99b787dde33a40556424a py3k
+81197 9311918c0649dc9869303338517fb37bc9e6725f py3k
+81198 042e6a396a864472e2ec02aa5a98a4c94dc70886 py3k
+81199 dcf47117158f0128199882f534f59c186d5b7d78 py3k
+81200 d2e6754cbbd5e7447677dbaeda480ff5506e3fe9 legacy-trunk
+81201 e4dedf54c41e2412899ba7b0170cdfbf3c395d95 py3k
+81202 9ade3e623710f048de9ebcefd75d069fe58d9a6c release31-maint
+81203 ef0f634ad5fafd7b5689f9fda3d370494bf90833 release26-maint
+81204 99383f1bc17c8f5155a608af14871efa770f610f py3k
+81205 a0a5359f8d1369f2f5ad3d3a3e68858b8d7f00e0 legacy-trunk
+81206 186890d7fe724361aa8a35b802cab01ee97acfe9 release26-maint
+81207 cc9b8280e3f5fd0afd8b389f79192a75238210c3 py3k
+81208 7970c499014427c462cd542d43848a86f3f0047c release31-maint
+81209 5468f3aee4ae1b1120c1cdf4a32099bb198b5cd6 py3k
+81210 f59f3c73734db3656002cd78ee974072f7c2e55d legacy-trunk
+81211 779dbc50f1f88def72933e3bc0951efb2267664f py3k
+81212 92d1c8819071fc2b1a82900e486968b2bcb1777f py3k-cdecimal
+81213 4652fe0c3b8974afd0869015e9cda3200acbf2c5 legacy-trunk
+81214 ec19919e27cfe6904d7c69480cbeda3ad72219f1 py3k
+81215 7f053e25b3352d4a6c8d5f3ee339fcc5db4ca3e1 py3k
+81216 378b1cd8472eefb1dd0a0668a1ae9297631dd141 release26-maint
+81217 9e4385db370ed87bbab280db6d784189386bff22 release31-maint
+81218 6990c6db7c3994c8844d46e6624040f8078eec68 py3k
+81219 4c958e4893ba69f819a6bee72f1316c00aa7fe41 py3k
+81220 1d4dbfa8ed4f2af5bdde0e4a644247c2a537dc6a legacy-trunk
+81221 cf26f011496ed2be3d8bf2b30472a44b0feb144f release26-maint
+81222 8002148c1a1b7da0f90c9c7b57ea4a1328ff053d py3k
+81223 ca9d2f0a8b8acaa11b5c9d46972066c2b4fc2246 release31-maint
+81224 f36e0e2daf432e6fc394a22eab3d80d8e39bb420 legacy-trunk
+81225 f350acbce790f1e4c2c7bad1bbf1afe458aaee78 release26-maint
+81226 f5c6455c143c675473a9a7e75702b4842c15ffc4 py3k
+81227 6886ee9cb72c908dad9bc7b362c0d6d1245b23b6 release31-maint
+81228 d08da4544e312148dc1c31ba83b065b784084355 release31-maint
+81229 ef22dc065e0e11b43b9afef1998b4c333b130d15 legacy-trunk
+81230 e57650a4ca81a6470e3dfae041fdcc3d27bc6892 release26-maint
+81231 967826dd5fc6c13184a86bc22bca38a8dcd62ef1 py3k
+81232 844bd7b8421b73c3abc1b9d610248325faab4ba1 release31-maint
+81233 4bb03cc1d421f6ce588365af979985421ef2fdb8 py3k
+81234 b29ab4e767362eb4dca76172d0a72ba02f883bab py3k
+81235 2ca4626d9c930348e6522e7235462bbbcda1318c py3k
+81236 e20a677af0004819cf084c243a17990206a20ab9 py3k
+81237 08abbdc99be68de742c9dd6502d125cb3a7f4f93 py3k
+81238 b4cfca5c428e52147aeb00645c04c28418bdb5ee release31-maint
+81239 a09eb3d59ff7f61ef0ca641db2f3ea8846d130c7 py3k
+81240 f837612007dc9ab777707918537037a3cdd14eb3 release31-maint
+81241 8a0079d8d1cef4393dccbf70941948c9dd7d7cdd legacy-trunk
+81242 7a7ae476df4fe042505be9d8a65714bab629b306 py3k
+81243 c17783aedcb88abaf9d3a33c11f3f0e7abbcb54c release26-maint
+81244 8b6401ae126278124d60a77211955f29a08fbf24 release31-maint
+81245 3f1a6b0b790c7dc585e43dab62850e19c20b2e0a legacy-trunk
+81246 4d27e880724abd1e18bb46561107d7210b6d533f py3k
+81247 bc00e463a95bf5edda260b5ae5676a713c81c603 py3k
+81248 a33bee14abc51b209327c0a957dfd6b8bd2b0239 release31-maint
+81249 dddd1bc7e839170e267b8bf469623ed13a5448cb py3k
+81250 894c8e42074a93b1ee05c6deff993739abe9982b py3k
+81251 556961f4f16da712c83d3892b0f1fa68ec2ba94c py3k
+81252 f3f95ed82744db02e5a12429e71e7f97782dc2df py3k
+81253 31cee2cf7c376aa33ec12905901886592ebec908 py3k
+81254 ca81646dd29cbe72c62d4b5126a068764698a721 release31-maint
+81255 d293991009738202397075467fe94e08a0f0e826 legacy-trunk
+81256 d12b65a79824f00c8ef5550dac8b61f323dfe04a release26-maint
+81257 c86eeb733316ba34effb80a7d2e315e4e5baebc0 py3k
+81258 93a2516987e00221187a8a19e09946c1eb3c76d1 py3k
+81259 0b04c5ca577d16d4773411b3eec82d56d08c655b legacy-trunk
+81260 76643c286b9f05196db03d8851796fadb7211360 release31-maint
+81261 b5f2c4421a3186beee456107662393b695ccc179 legacy-trunk
+81262 09932653561b9de47dff24bf496392a74305722d release26-maint
+81263 ec595ff257e06401a523b042a7099d20d3976d6c py3k
+81264 ff4a968ca7bbe76e729629e35d90c8a39846dbee release31-maint
+81265 c981f0c8678b49875f96f752a7dfe59927604c9f legacy-trunk
+81266 39eb91a5f9dca836bf2aeba13f9d812ba619ad44 py3k
+81267 d6cb2f10e65ef8734928fc6aca60ea781944b659 py3k
+81268 b9a0f26fa2c96337d1197bd0685e194a731401d4 release31-maint
+81269 7f64fad177dd6c6cb9c14e43aa8b2da26e92c69d py3k
+81270 f01ab1b13d0ae77a32407e18e038a54a224ba600 py3k
+81271 8403f506d9e54a4778beadbd8438bbeea9639fe8 py3k
+81272 de7c8580f9ebe66032096849e726024ad464eb01 py3k
+81273 bf14b9638c73a5e9a8e0232ab417e81dc7f8ac50 py3k
+81274 5dbd2c29b0e96ebe03d6b8e1822da52a5a11b738 release31-maint
+81275 f0fcd69187cd26d0776c9449cbbe2cf22b9c4aec legacy-trunk
+81276 dec88702c9bc736d3345a8a7140a9a634eba4cb7 py3k
+81277 1757bbebf75adb161f0dcab9298cc0c60c93438f release26-maint
+81278 82dbf93f760f4e8801eb65fbad233e0919372952 release31-maint
+81279 e746685445deeb1035b9b558ceec0579f6ad9358 legacy-trunk
+81280 666607ce4ada9dbcb94f5dcd2b71fe035f6c1d5c release26-maint
+81281 455d3fbb14ecb75acc26de04c3880e856a440919 py3k
+81282 871bfa1fda590d12b73c5ff7fc3eb928f70abe55 release31-maint
+81283 f1e37a8fb2d12b899a6a01640b56a15fece9f323 py3k
+81284 1e52bed877c177f645883b06b1f23c09fc1efbcd release31-maint
+81285 8da088d6a95b2f1ed78e3c935eb714560bf612ac legacy-trunk
+81286 6b38926a5fcdc4eb7aa737e0fbef92d9760e4af9 legacy-trunk
+81287 80dc570177c668a62b1262569176315eadfd8f3e release26-maint
+81288 197511c4b75a97a3c04a67b1ae943f77668221c2 py3k
+81289 ed0a69d66c113508b76fff0b5a32489fc5fb99b8 release31-maint
+81290 bec818a76902a2f4ebfec8552e93bcbc93a833af py3k
+81291 cf74ec3e1f82682832cee6f2145f2f1192ff4950 py3k
+81292 613b63f58bebf2984cfee2d491e3d4c318f3a8fc py3k
+81293 859b838ecf3db65efcb7dd91e7767cbe184aa490 py3k-jit
+81294 d7d8046f7a52ff6449c4b8be47561fedcf6cfbef legacy-trunk
+81295 e8edabd5419b3e346b795748aab727d5f67dac5b sslopts-4870
+81296 b75e62fcae81a7273b1d72ee6032b7fd9a95afd9 sslopts-4870
+81297 28590d5b6b8b0867e8586683dca0206338b7b033 sslopts-4870
+81298 f247146f8a959efc7229c70c14eb47c7f75f5ce4 release26-maint
+81299 26d7605203dcc207309c86530cc7946cbfe8ab5f py3k
+81300 15fa59fc149dbcca99e4604cfc5bf9c5255d4579 release31-maint
+81301 5f31350afb6098ad7b5c6b3e7b5f383225405a16 sslopts-4870
+81302 6391055efca0db960ce06c06d8c4bfc542533c0d release26-maint
+81303 1065d1c53309aec4cead56f295fd5cb8f4adae50 release26-maint
+81304 f14f42f32922e3ec99f8736918300688ff06060d release26-maint
+81305 c9ed0c3f6dcdd7b1df64ef659e69d678f28b8ca8 release26-maint
+81306 c99fca03fa378e27ed87474b5909309992bc0bef release26-maint
+81307 18f62a7a7dba8237b6beb5d409ea23842e50c5b0 release26-maint
+81308 f76f81044d4083d53a8f9fac69c824c0800dd461 release26-maint
+81309 ef72f15864a998f527caf47eb97fcbcaa873be06 release26-maint
+81310 05269573d2172f0c4455f677cadb4f5298b06440 release26-maint
+81311 c1c1e8c8dc9cd1ad7472f9f9e7f4f016f13679ee release26-maint
+81312 6841b2a16a51d5a595231d9a00fd35f0122f4041 release26-maint
+81313 ce3809b834736809c5b8fe9bb606a0e8dda20ad2 release26-maint
+81314 7fc48ad16087ef3cc2605815818952cd70861894 py3k
+81315 7f15a60061627df9bc5714c0299cd54934d6344d release26-maint
+81316 aa777d43f22f5e9462b5eb9d3365308eca96e6b5 release26-maint
+81317 c8d166ec54301df3742ee8d38587bb0b60a34748 release26-maint
+81318 75d7396556fde833017a1062aee28feceeb381d3 legacy-trunk
+81319 942b3c168f15daf58b646b489e15180d0ce00c25 py3k
+81320 1504cc5a15a1c4e33f7c3bc0038eb81853cea676 py3k
+81321 846866aa0eb66ff7af9cd86d69b4f5a5bde1e7e9 py3k
+81322 9999974ff50695bd5f03fe85b963cc772214600e py3k
+81323 7ba851d1b46ec4f40d00e1c7c857f7a79c522604 py3k
+81324 89ce2f6d4b24174bfa2cda62359cbc0db3597e16 py3k
+81325 7dcd1a269797bb0da3f0edcf37e3225fa9a088c1 py3k
+81326 81d78dd273b09f0d683788869c66ecb7e29212dd release31-maint
+81327 8b766ec69685d4f6cfa39d93fa75cea26ba297d8 release26-maint
+81328 9a23309dfaa3199415cf6f70d5434f6beeec4ee0 release26-maint
+81329 b6d2a27c3e3b442e482725b8559cf3305cd8fb38 release26-maint
+81330 083f686aaf15a4d9956eb7eefbecd84482c91f7a release26-maint
+81331 f37ecf4a8ff10ae8e03cdfea1bb5da46c9e8924e release26-maint
+81332 77eb1fb59c7807ea8defec0a9dfc70d6730f8c84 release26-maint
+81333 3d0ae8ef0044628ce39fe57a8ebb649faa9d0bee release26-maint
+81334 28bbd31cbcab6d696190223c33d393715974203a release26-maint
+81335 f5aae85b6864e694f5a055cee30cc8c5110b4d5f release26-maint
+81336 7f10aecb06322b33bb25e0f5018d4bf6a8bdfa77 release26-maint
+81337 ae4c931a71f06969577262a8a558fe912a15d566 release26-maint
+81338 1a34de0429728707bfb0e80bec25ec044077f869 release26-maint
+81339 d1f265cea70b7436a9c058cfae0a328e33ede3c8 release26-maint
+81340 a72bc54ec71df861bacc1389500bece0bc73d2c4 release26-maint
+81341 6ae073326e7fb8245f814498de1d0c109f614549 release26-maint
+81342 f490d158198adeee152bf8d29b4ac868a2f98ba5 release26-maint
+81343 bf4e83de4ea5298a8ee818459e6dcce3914f3933 release26-maint
+81344 07410aee7fc0eaf8c5b5979f8567189311dd2410 release26-maint
+81345 34e8bfeb0b9879d11b7f30fe6f111a9d51cea9a7 release26-maint
+81346 5906a0fcc826b51f28dc33ee72fa98ff2eace61e py3k-cdecimal
+81347 8f6e67f693ff5e36c7e84815765166755033d1e5 py3k-cdecimal
+81348 65b561f396793c4d09a116d6171614928a56a677 py3k-cdecimal
+81349 e023ad3e2caccb25279a44c1f931a019c0768e67 py3k-cdecimal
+81350 8c6f981699e825ac0ea5cbda071eedc8dbcb3f58 legacy-trunk
+81351 68525ef36b668c357e05f8f6aa2d081f49e3b6c4 release26-maint
+81352 4bfb00ce12b859e95d1425d46d5e1d0354fae3e6 py3k
+81353 49d7de9d7b1aa01825c2003c269736662285b852 release31-maint
+81354 20a356eeb0f70103deb151b4d33d25a4ab3eb0d7 legacy-trunk
+81355 21bb93e0988c41b81b0358bd077b0c57aba5a72c release26-maint
+81356 5bf4a8633c58b855b0f8c73e37de766e50a47773 py3k
+81357 eaea808b7fb8671a884d1fe2dd17a2cfcff8c42c release31-maint
+81358 b7f71f60437b596c55adad00c28a3a4b2c600981 py3k
+81359 0cafc20e563763465cc06df1a0e4d7e3d62f6e99 py3k
+81360 e68e028d091e83540d1940e9401545be519ea891 py3k
+81361 e5fde7ad1b7cc69402383066b694fc502a86ce0f py3k
+81362 ccdb09f79a038555cae4e19142d761fd08263c17 release31-maint
+81363 ba50888cc03914fd001401285d8dd088c5a17269 release31-maint
+81364 deed5fce82d6069f051ad1735f2c6abd38c732ae py3k
+81365 c1c77674dbc8c29d17dda89d913f5eb1bb8ca277 py3k
+81366 248a915e35ef0161db7e2bc1c8eb3c5d4ec064b6 py3k
+81367 23ee8aa857ee36b997d0afc7caa2a86b4f2add9e py3k
+81368 82a4483d9c4a9427a2f4245d6081df2281a5b43e py3k
+81369 1f3e7812612b8ba126ae2a8ebce1bf7c25417b30 release31-maint
+81370 743c207dc2b42056969b8f5dceba9bc1a1a2447a py3k
+81371 021f5ec5d2d4fe37d10fdf251a3b15a9b10ef373 legacy-trunk
+81372 18dcd903c55e15b2453da84c353d8a066bb80034 py3k
+81373 da941507ed93c44c403c611f080cd6775331995d release31-maint
+81374 b84f8d1a0522c6f9294ff279028f7d8bf217fa07 release26-maint
+81375 503afc62d632e178f86fcb61141404e180cb59bf py3k
+81376 fd72af0060c8540aecd9540c4946f327e76409e7 release31-maint
+81377 5d6b76890f17f880fedee0a004e82c6507c2a3dd legacy-trunk
+81378 129427b5e9141ae8dc628c2d1f5f0231796b9022 py3k
+81379 4d83ba5d0af5b4581808f08105c9cf8b01d6140d release26-maint
+81380 62c0e5f14138f69610f21abe80f594e0da5c4b40 legacy-trunk
+81381 55e2368f72f274e6e930aae524a2b5fcff0c7cb5 release26-maint
+81382 d93bd525473c5f68781bae247bb956c217517a46 release26-maint
+81383 3271af035d0178cdc55f9a9b3d7e9d99d62cc834 release31-maint
+81384 f2d3bf9da9a8154a6bdd2cc9489803e2db7a45da release31-maint
+81385 6fe260bc0987dc2c3cdef5f080be0a71b949a8cb legacy-trunk
+81386 b3b265fbaabdf9eab42c4da604418c107c9a2d85 release26-maint
+81387 1e6b435e8eb6a5281bead760a146659061ca950a py3k
+81388 9dd522f7c0de21cccbd164eed7d026eea931790b release31-maint
+81390 7d4ee0dc87644017efd5307479ea920cd2dd01ff py3k-cdecimal
+81391 4f9db35a40861db7f77553856d1119b7a16ce6bd py3k-cdecimal
+81392 5ee47f0b26b02a07c37db56004500dcc4ce58479 py3k
+81393 2228c25cce3e72feb38668ac28f5c0c32be55cb7 py3k
+81394 37032b2a592db0234af16604b000d16438221069 release31-maint
+81395 38719f11619bcd8915f5d22ad49ae1e0ea4eb2ec release26-maint
+81396 e3daac066b92e78e2bf18ceff94bff8cfbba0af3 release31-maint
+81397 d6016fa58df6b5ce1f37a59f613d95769f437c0e py3k
+81398 c2917ac5d526dc4d3f62bd61d3aa808589439080 legacy-trunk
+81399 3f08d98c8fa5f0716335c16d40bdb3f3294fd2cc release26-maint
+81400 795762b5e0d6e6b37ede8e1ba7fbf923a0f6d415 py3k
+81401 9db8c414921f7026dd34be60988d2e9b38d84885 release31-maint
+81402 e1940ddb3f565a6394fa5d6a7c61a10415e40a00 legacy-trunk
+81403 441491572fce3ad8dc90e2b548ec5888d2c5c55f py3k
+81404 b072b9fb0fd2decbe04f13bb4aacb42ad0b8cb9f legacy-trunk
+81405 f138d1bacfc428806642001499bc716d33db406b release26-maint
+81406 de61a69712dad7c45afca3f272d1dee4fbc2fc99 py3k
+81407 6ca2e6b3bf31779e6e05767066838effdb655343 release31-maint
+81408 73416b1bbcd5bcaaff227b5665416b6fb322786f release31-maint
+81409 3d64d1afe6779a7304b0dbdce52a1bc23824863a release26-maint
+81410 e1f4fc63d2b3d2be4af17df5556bfafb9a617c79 py3k
+81411 506e9be86139384e5edb07b084f6eeaea0d0ffc4 release26-maint
+81412 e9a042a25197138f6e2308f7f4baf6a66c220b40 release31-maint
+81413 946cc5ee295110f345d53ff62f7cf9fecf676d28 release26-maint
+81414 0f096829fc90b8b35d9335877c0f500ad1828143 legacy-trunk
+81415 ff3c676613adb170af80a1a32556311e8c1ad9a0 legacy-trunk
+81416 8542b77a28ea96586c0081d65a3c4c52c80dbe7e release26-maint
+81417 b0250ffa226775defb35edbe390c887a702bfe06 py3k
+81418 fff29d3e7a39215b17db89730a610cef0b64120f py3k
+81419 1b0467661ef5a90f41f86f5200a28b4ec6b1342f legacy-trunk
+81420 fbfc353647e3c1b35f8fa291c513457e0f605d33 release26-maint
+81421 29b56c38a033dcda10c761ee4cb131d33d8919ae py3k
+81422 abc3f5a1cc5e8cacad35d15ba5ce3cec73a5c6ca release31-maint
+81423 06b09376cc5b042ce0d161b30344a5d8cc34e553 release31-maint
+81424 eca98bdc8a14f40b232a384e2e19bb9d952a76e0 py3k
+81425 23e38192af964883fdd6e1b46c962434a6ed6588 release26-maint
+81426 3163da22d58502acc7dcb32c085de3803036394b release31-maint
+81427 8b2d9d101c85a4966fb2935a4e71a99e0924684e py3k
+81428 6985c6b9d978e5713a35019009014daa16f163bd legacy-trunk
+81429 b14f39d0f20a2dae54f4937a336a2a6274684eda legacy-trunk
+81430 6a08eeb4b3223929754ae7ef5071d6bcf2c1fcf6 release31-maint
+81431 febd9c288e76f80bc93af82197d8d413cc571c3c legacy-trunk
+81432 f05d2996776e0ef4f3683fe21ffa54bccbc51733 legacy-trunk
+81433 11d58516033f7d54329e0a6e6128d1b2e2f54cf4 legacy-trunk
+81434 5d674970acd9a068cb71c52b7b4a20ef8bbe3cfa release26-maint
+81435 495ebe04d4798cbc0f686adc847825d920cccc53 py3k
+81436 6ef7cfb1f8f4831c0b005ec32d52b6de44c8c880 release31-maint
+81437 8c8d40ce5ca15a444cff9c6e1315d60f8bc67e03 legacy-trunk
+81438 f389563ff3723e6265cbf05d7837d3ea91541849 py3k
+81439 e20eae3b5fe4540a76a304cae9d51ea45c997a8c release26-maint
+81440 c0dbfb6a7d567303c7bbe38a47d9fe1b5425a11b legacy-trunk
+81441 3a6e9637c33dd9be3075991d5fe3f767ca9adccb release26-maint
+81442 a9cad5ae405d8d2a95f8caa1cac39f95b1f2950d py3k
+81443 72fa00ac38be3e0dd86ae78608376a92cd8da1a6 legacy-trunk
+81444 52495ccf61cc88dee735f2bc15d6741ff0cc3a7b release31-maint
+81445 95413ebd4081363883e25b241df84495b070a9b2 release26-maint
+81446 2d0b098f6cb7f9870427ace93348353176d517f4 py3k
+81447 194f488b8ad1a77b45eb89cc4e8ac814b0dcb5e2 release31-maint
+81448 1acca9c45562b8ef47af8caf6064eec67c1369c1 release31-maint
+81450 0e26cb976c4d90bbdd38a792297464790b6ddb43 legacy-trunk
+81451 0f528ee15ef72060b713611ca46631d7488913ac release26-maint
+81452 022c93ed1b8e8f4bd68a44f67da82379123948fe py3k
+81453 55e819cb5361035925c82d64f36744aa9447a744 release31-maint
+81454 c6dfc3dd2d5df4a1fb31d4a99f4f1ab061d43167 legacy-trunk
+81455 2ea90920cc10d3a1981d3cb41e644ba7308a39b5 py3k
+81456 14d23bddf793334ae69ff93133590eb7d40e944b release26-maint
+81457 815ba3872f8504786880f520e200d190b2f308c4 py3k
+81458 80be7218767b712b7606c62bfaee0caae8ff75a7 py3k-jit
+81459 99e9ed214aade6dc03ab4329cca33a20f97cf653 legacy-trunk
+81460 2a389734d57020b9260fea765a7de9cb3ff4a1aa release26-maint
+81461 1af27350f41bc6fca7e5a46f0469003355e195d9 py3k
+81462 846dbcf970abea5c85e3374938166ff9050691dd release31-maint
+81463 b739d3034ec751258665149a816d6cef1532982d legacy-trunk
+81464 9a0239c0ea3b41cddb9d0c92ee402bc7cfbecd1c release26-maint
+81465 0a647d08e685faf0b977860c73d6e2fe9da35a09 legacy-trunk
+81466 f205d66056f89dd9cff652923942f3116912356c legacy-trunk
+81467 755a1bc56326ee05a7b3d50eb4c283ef41568798 release26-maint
+81468 d6a88969717f55bc8dff70c90bebd7b8d9333e73 legacy-trunk
+81469 63b578d833ee7ad93e28a3f7c578a96db18fc73c release26-maint
+81470 356a6fc9e5785c3f6765462b1994f6730331b598 py3k
+81471 bf82c1d04e06cdabfcdb922815b14bd412bebd19 legacy-trunk
+81472 9726c217388582e1abbee616b13ad300c3333b7f legacy-trunk
+81473 ab082e387dd5ce29583ecf1675f2c950cb37aec8 release26-maint
+81474 830cd89b01e8f04f5e123efeb67392c64441f745 py3k
+81475 cd4936691163fdc29a444eaf2445ba3d54e7f29f release31-maint
+81476 6fee26c89f6e4b2a7629066e3049374c86aede52 py3k
+81477 6dc9ec88546391c731818abc67e71e7d61100190 release26-maint
+81479 ee76f0a065c24c9fcc29d4ea3d2e7915bd9b7847 legacy-trunk
+81480 1e06a6c312341a31fedf86a702bf4f3889142fc5 release31-maint
+81481 69207f801b31664543ba491b6acfbf012bb79a33 py3k
+81482 4e495263611345b7840f1eab9e2bc47b34f5b7cc release26-maint
+81483 54b51abb695124dce712640f079bd097277d8b1b release31-maint
+81484 1e8c92316463474e6aba5f56673d1823535a3bc4 legacy-trunk
+81485 b0dee32a1c6b095dfaa937a973d38b6374a048d2 py3k
+81486 0bc8ffe6ba9ac85dff85e122e28d475d4b143e4e py3k
+81487 a0a6e8bfaaf72a09391a518c2bdd07dca8e56c5e release26-maint
+81488 dca3cb19dbdd47125a7aa9a0622a7d534567e206 release26-maint
+81489 21fa09f250e3006cdc0bc52859dd533b015e5759 legacy-trunk
+81490 40cad759a3554755cde7988fde015163b9509f1a legacy-trunk
+81491 7750579c375da1d92889468c070ebaf20ca23318 py3k
+81492 e64ea1619820c0b9a3fd550e491591c1c486e326 legacy-trunk
+81493 036017f2e74c6a46e49e26b76e13803e484d11c9 py3k
+81494 2f24a2ef7331c62edf160925221d3413c75cb326 release26-maint
+81495 8ad61780535efb4adf840f777df906887d3b22eb py3k
+81498 b038fda593f6d58e1e95365f1e9dd0c3d35a26c0 py3k
+81499 c56fb63c648f49832694c411497dcce2f6bbc41d legacy-trunk
+81500 ebda6803f8d5c3e1a767ecce111cf50f338f56d2 legacy-trunk
+81501 90d6314684d43be45e59b2b3e8b60741f9269a5e legacy-trunk
+81502 e3b5338be058891bd952ffdf6792166c52842224 legacy-trunk
+81503 4be21a08dd70716e68cc64365cff3ee5d3a836c8 release26-maint
+81504 bf04eaf1af748a83bd742efb049342badf92a998 py3k
+81505 6144760e8350d4c3b087d9f1638e5333061483ed release31-maint
+81506 58491911182ce13c2107a9897f57c03b3393a810 legacy-trunk
+81508 f90368c87b33e68529ea10bfc717c4f4a4d0f2b5 py3k-jit
+81509 a8eab670326664cbaa8cdb183447a8f1dfefecb3 legacy-trunk
+81510 693e2bef4ee3bc8204b35d7737ee74bf72f3c1c3 release26-maint
+81511 7f41d75ad435d2d836dfc7c8da0d1c1d7e3463ac py3k
+81512 b73bebdfe5259c2ab7c39a8d77353b3a10c7f16b legacy-trunk
+81513 703287a99939170fc0312c327fb726c3c618ecb5 py3k
+81514 4e00914ec447bbbff575841b01f50e5bedbee9a2 py3k
+81515 5bc4fcf04143d6c5d29924b3dab44e8409486fe2 release31-maint
+81516 ce261723b3562baba8d282b45aade8e9fc51fbde legacy-trunk
+81517 7819ba77e45c00063c6ae3098d27113c4c2354d2 legacy-trunk
+81518 2297cd57d945f2fa9c4b6879b38c1c7604c39e98 legacy-trunk
+81519 22cadf264ae5217f239e4eb396d33cae686bacc8 py3k
+81520 13212d74ce008e9084e9cf19f304629e9afac715 release26-maint
+81521 54b488cbd37e39141a6fa16830c35a649ba5cb4f legacy-trunk
+81522 761ac9703a96c141f17330a12488885e34a2e2c6 py3k
+81523 e8a9393a0748d5d504290e0d699244a20658d465 release26-maint
+81524 d09c9a937e10bf6a712fa9ca8f2a0da9e47292bc release31-maint
+81525 8ac3d527745c4e3aa7d896f91160a19ecdf18910 legacy-trunk
+81526 47080080ab619b571249802851aad2ab3a358cd0 py3k
+81527 44f4222d91bd70f1d0891d713af5cc9502a1867a legacy-trunk
+81528 6dff3d9212a865c21283a19e7bcd1a07af8fa31f py3k
+81529 55dc9ef15ab1a245f4430d0d27ab536f3e9977d7 release26-maint
+81530 82c2426f7f3e9a07af921434ac3e33d84ffafe84 release31-maint
+81531 f1337fe6b7b779ec23051134ef3542927fac8e44 legacy-trunk
+81532 e4af702d61b7d3cad77b1550773a2fd2623b92c4 py3k
+81533 4c2d6e1b890ed6cc436ac999aac526fb1cde27dc py3k
+81534 93c5e6241309668092498c929d3a49946cfa9b6a release31-maint
+81535 080e550916edcd9a84a6cd5e01bdf15cd2fa89cc py3k
+81536 f788aff572d11c9598245c97c264bf18c6e8d590 release31-maint
+81537 bd5f5df7ed7894c7aabe9a3f4a6dce4d4843d3d3 legacy-trunk
+81538 6a3c2f094bbad7c7ba286330a1ecd41f019a3e0d py3k
+81539 8dbbd90eeda86e7c6a125aeadb86d4e91e78dbfa release26-maint
+81540 9f79cb98d55f44edaa9913667382f920c4cc6c7c release26-maint
+81541 81a580d947ef4e8ac88f96be200774843c3c8968 py3k
+81542 19b3e4853c74322c0d7a98dfa788d4ddf0b9aa64 release31-maint
+81543 49d497790607f92eafa4fc78b75d2fbc9f4ad8c8 legacy-trunk
+81544 702d261f3a29abde1b8755c2e304ef46f80532a9 release26-maint
+81545 9aec6ad53a1b974abf104f34fa19fc848fd8d6df py3k
+81546 9b8b1403f8dda8540860645c8fd15d9745a20368 release31-maint
+81547 4f982e94ae16aabf204d5db236a7dacadf1aee06 py3k
+81548 8328c5c3272c35104209ee24ad44b095483159da py3k
+81549 602703d0560af53a0dfceece394a8f00bcae6b00 release31-maint
+81550 fd99467ab4d596502ed3d667f595bfd33332814d py3k
+81551 56a54936da1dbd492e1b6266e672786565291ad5 legacy-trunk
+81552 c4f73975a440a92de180857d1ef04edf7ed7a4cb release26-maint
+81553 e3ad1b8c452128fd6be40899e67759e963625e33 py3k
+81554 8180abbd07cb2e60afac25a38d96ec47bbae418f release31-maint
+81555 4745e13aa9e436429a79cb45a937aa377ddbfc6d legacy-trunk
+81556 7cfbffa6a30b282ba4ed64e5761f69e3a56046f9 py3k
+81557 c42ffb3d63afc78a15d4e70d2bb3264e06bac1a0 py3k
+81558 3f4d2a81810c5cc7cb13e561d725b6349c5e163c release31-maint
+81559 1307d978789fefc3dab111060b84aa3bdde41c2e legacy-trunk
+81560 7f312f60fdb0518d555d9c8e0e39be68d4bc09a2 py3k
+81561 01482700434d8a09a3e36233c77892b7ce36ce22 legacy-trunk
+81562 555ff58cb7cb8a7ae34128f456b2ef353a0f43e7 legacy-trunk
+81563 dda0e1add8b3126b13f61ccaac4b063e0e963c84 legacy-trunk
+81564 c27ead51c7dc632319ab35a3c496f211f5d1d636 py3k
+81565 cfd215d9499c3ea1fe53219b249b953e06af683d py3k
+81566 311a253b58b75d10bd04f30c01dda2300b064be2 legacy-trunk
+81567 96a7a3cc5897eb408ccd494336c2922880d1a71a legacy-trunk
+81568 6b89de36a74fc290faaa0ab8bd50c4c597bab390 py3k
+81569 0ccf0fdc596652e131b86835e8fdc531378c7467 release26-maint
+81570 4b142f7b3812d099cb864305cea361eba9dddfa1 release31-maint
+81571 5ccc71dcb5dea4417db85b94986d1b90070db05d legacy-trunk
+81572 c9beccb63ea909a43c037df22a30f4bdaa8c12fa py3k
+81573 f501be638878a15b2fcbc513591f99fd73892a63 release26-maint
+81574 25f2a0f0e9debd308a221b9baaa972275ae9bac8 release31-maint
+81575 5cc3a0c14802ebba05060aa274541e3239106a79 py3k
+81576 7fe9b790054badb8654e189a73dd2fdc0b85588d release31-maint
+81578 9526a908a258db866ba65e728caf90042cbc000e legacy-trunk
+81579 1a5928b2593c90f768cc31334e7b8a973c7b4fca legacy-trunk
+81580 bd9cb24ba68b42d530fb9c719f469eb8d4a35ac1 release26-maint
+81581 62194155789836ec92561558b0c1ae645fe04456 py3k
+81582 7c947768b435d9389996dd5acf3f8f8e32d72d64 legacy-trunk
+81583 f12b01e68f644fc20dd98b9b449dab28681246b7 py3k
+81584 b697e21d1e7867f922a295dc6d3fcbe32cc979fc legacy-trunk
+81585 f000754c8943e180690348819f05f0bbeec8e142 py3k
+81586 4415599b70116fe49149ecf644a16ec20cd75d78 legacy-trunk
+81587 2cfb18f1c2933cd509a5a4a40f0b736b0e2bf572 legacy-trunk
+81588 308edf11c7cff6852a61417c20545191f3334270 py3k
+81589 9a04bdc4808983f2f17aa9596c145b911a1b9d61 release31-maint
+81590 852d5ea625e749523254ad860da626e21c5f8974 py3k
+81591 49ab5dbc4fac9c43b4b4343426821f8e2a52bace release31-maint
+81593 d5c79d89b393afe6f6cf6ff6aee9a48170e0ba7d legacy-trunk
+81594 2b587e7f0299b9f8d61190a194a087854dc73227 legacy-trunk
+81595 b799f862fb218b42bc7c74c252b94219ea455671 py3k
+81596 322bf4ff4d3d6efa5448c2ba99a39429cefbd6ec release26-maint
+81597 a91747336eae6024f66386180c74c3e94e8d37bb release31-maint
+81598 0372b4c7b9f4f6a27f3dae8721dd4ed426319367 legacy-trunk
+81599 164193ade4baf0e746531fee6bafe3fff6c4aa0e release26-maint
+81600 63e78fcf7f94ace661c0747e8953fcf22b727027 py3k
+81601 a7a9b58d1c186752807acb3a83ba4bef3a679f09 release31-maint
+81602 6e71eca6278cb57583192b88a90a7c9b69d1c8e9 legacy-trunk
+81603 5d43b96636c8887fcccba229aff4bf57973bdb30 release26-maint
+81604 0470dc63d12a9803becb0620b787fa319692bfc7 py3k
+81605 9fa5ed4ca0bb5b48ca0e3a7ceb5fcde91a7f45cd release31-maint
+81606 ed79da3a591c4a809b8624830ecbae8d6e312974 legacy-trunk
+81607 6b7af5a25d2e8d2a3c048c5efc68f7b539ff26d9 py3k
+81608 05d6b25dd19715ab8587e8e7b7b89675796fb49b legacy-trunk
+81609 9a4b02baa7c43130e8e2b0bfac5735da5fed347d py3k
+81610 3edfad2549c6178da134748c893d7fbe3dd814c7 legacy-trunk
+81611 5833795061c5d97085e958c7346f1ac477580b4f py3k
+81612 e766c0d86cff9d1e5ba6e3a57ccdd181d0fba503 py3k
+81613 66b3eda6283feac6a9a4031f3e03cd5972e8b43a py3k
+81618 3242a0d22de638ab72dd419f9a4a2d2c9ed744fb release26-maint
+81619 cac00cbbe77094339ba1abc193edf1bd2e2c930e release31-maint
+81620 b1b317758676532c652e3fbc0bb70de61635a901 release31-maint
+81621 7945045c3a759205e25e157ab6079be951c7ab70 legacy-trunk
+81622 c963478b9092decef413cf60a99290d6a9d1a363 release26-maint
+81623 8e21c6831c7fa6b3f9dbdcbef51361911f0bd7a5 py3k
+81624 8a13f773a97639e98fc7dea17d857622d16b74ab release31-maint
+81625 3e6425c221ecfc5a5e06008fa3d3ea2e58b82380 py3k
+81626 ebb9130ab0c458faa06ef5314949d6167cf75b9b release26-maint
+81627 57b90350372f8c026f6c6e580aea0adb49398ac4 release26-maint
+81628 714653dd4aadad453ccab9bacdec11ee083c37e2 py3k
+81629 dc2768c998de1250aebeafcfdcc2c34370a5d22b release31-maint
+81630 66109d0e4e6df1dea4b7f98c0a11b3aea2f1a585 py3k
+81631 ebd65ec54d7e9bef5d6d5a28cd7a0ac52265029e release31-maint
+81632 62ca540d8b6e6151ad12e9598209b7004f7e9ed8 py3k
+81633 9f92cbaa539d6a43c58229583ccfbcab3feb2f71 release31-maint
+81634 f81271c18eb01adc6599b91648f81efa61b478e0 legacy-trunk
+81635 53ee47322dd2a2c2a34826b1c435049617674bc2 legacy-trunk
+81636 d69b1a2d9bf0ef10481e347f8f31fbf0946aa7e4 legacy-trunk
+81637 d4260dcafc7fb62b53703bc4480ab0b2b14f2fae release26-maint
+81638 9c0c27a9b71c79cf2116fe6c9734f38c2c1bba60 py3k
+81639 10977708db2eaab3ec954d9f0c071ba6387424d9 release31-maint
+81640 898ebb2990dfa59f19a7fc79a20e69bebf7b4b79 legacy-trunk
+81641 2de71233b69b0d2016ec6ab6cc85715645aee999 release26-maint
+81642 e4cbbbb7863b92db9ba673d9ecc1bf729e702b4d py3k
+81643 cfe138600f64c4c7b15e1e1ac80b27ecf47f368b release31-maint
+81644 a03b9568359c55ddec297a3dfec4eee4981e4901 release26-maint
+81645 8e294df0e382a46b1ae062e1e821c8b4dbc6f37d legacy-trunk
+81646 7b1126b5be2d6f0d14530390d073a3e71b7a031e release26-maint
+81647 379ee212153e03f8af0f60cc6fb67dbc7acf526c py3k
+81648 d20db3ee845755f5e67b50ca69eb665c297dfaee release31-maint
+81649 bd47cd1f9bc2e8bcc26309809adea50b1cbc2ab2 legacy-trunk
+81650 34a637bfd4be78b9e461d4f333c40cce87e81f6e py3k
+81651 ea43b406450f94fc26beee57e8f23c1f764dbaf0 legacy-trunk
+81652 3b8070913169496f8ab3ce05490a4972542c75cf legacy-trunk
+81653 b47c4cf25f022d75906041e3386a88267c8e7e89 release26-maint
+81654 c3adb91ca58947099ebfd8f115d23539046d42ac py3k
+81655 dff5f09b5a860182dcf6ca732f41a5550465e452 release31-maint
+81656 97edf0ea03f9b14e2a49d48a6aa15ca80cf332e6 py3k
+81657 dfbd345f53f03a585e7c042265d70bd3c5f02347 release31-maint
+81658 6b07294b13520e2df5656d3d0bd125c567edb2cb legacy-trunk
+81659 dd378b885b94036540f2c959501aae742e9f95b4 release26-maint
+81660 bb63eaefc5a68d78fdd5aa822b2e62c94c8b4b72 py3k
+81661 833de79885e4fc92c6840f8a12f7bfd6f192525f release31-maint
+81662 f6e90182686bc615d47ee8496c8d90981113d879 legacy-trunk
+81663 291b0bb63fb76bad8400311ac575721878f8859e legacy-trunk
+81664 ed983b116a7de00ad71b2f570c4cc7975490d121 release26-maint
+81665 8bbd4eb4efc41e3c3777c35b23dead1a3834fd37 py3k
+81666 cea5ef682bdd4c683550a0b92a9dfd70d7b5cb4c release31-maint
+81667 9af600a66115701089fc75cd6ccf0485cc5f8f77 legacy-trunk
+81668 ae11f56ad5d747daf2071b7bf730fb6d74e9497b release26-maint
+81669 1b4c30742a24a3c679e80b528d90e3e282bb29cb legacy-trunk
+81670 bfbf2d650f26934d72899ddedfc8e1fd32a3a213 py3k
+81671 0534ce01ba5029b3f5461ba53fa4e2246b363fcc release31-maint
+81672 8825a7e6a5f01e697d361efa5459eb21bc75956d legacy-trunk
+81673 3797ee57d3d6e385bea741463ed726f83b2b8f61 py3k
+81674 16fbdf10d10018fccdc83f13053de69121c345fa release26-maint
+81675 3d11ba7989df0b508ec90f6ad853900b637e0313 legacy-trunk
+81676 5e28a3dfdeef3f4f1c67425afd6448adc09ecbf4 release26-maint
+81677 25b4163ffe3fd2e69d75bee8027c4a430be6c015 release31-maint
+81678 38ddeccf02a94227c52ef4fd7c97900fe42c5320 legacy-trunk
+81679 11acc57f5804cabc0c084dcff65d0105dae53929 legacy-trunk
+81680 6e120d93112eca42f7f479650bd890b35855e73a legacy-trunk
+81681 532e9e6ac825f1cfb36af7463fd8b7fb8d7b5f14 legacy-trunk
+81682 26803168ce8a7472df5adac93a89038aed8a9082 py3k
+81683 cb4fa3e4b8d5768019a6954f735fab45b9d1daf4 legacy-trunk
+81684 dd66368217c1626e31f4bebd843bc9aed83da108 legacy-trunk
+81685 22c0e228d5a7c12f6343631a304abd8b694bbb1f py3k
+81686 bf2103a22e0078e6a3d4a5d2b3a914bd30f9e34e release31-maint
+81687 3b67fa3585f07c5507e915b6038175dbcc69ef46 legacy-trunk
+81688 9fa5590259f464b0d54adaa4954fa5849d484f32 release26-maint
+81689 077d2938439918d63acd01f421d3c99589bb6d06 py3k
+81690 7b59b1f633cb4e268a2fd08b692737a3f1488ba5 release31-maint
+81691 eacbe774f029e4d89e7fa477ac9b43e518c460a2 legacy-trunk
+81692 419901e65dd219da68eef0bafa496667bf8233cd legacy-trunk
+81693 8245683e6ec610cbe90f73a9a489a03d3538e095 release26-maint
+81694 109a98f9fcddd34bba96edcf505e2bc9aaa88ccc py3k
+81695 cd192d1fcd6763b1c3c5d1ba07c73b8246c6604c py3k
+81696 84988bb91fbf6399b8ac62f2cbd860a46244e77f release31-maint
+81697 c160af09c5b0165ef3d12dd751319f07a3917859 legacy-trunk
+81698 2b25b50eaeadd5589c5997ac4b728283a532237d py3k
+81699 0c7764aa694a186a4105d49ba4d90daf50863091 py3k
+81700 4c0b2bbdd82d17047a8c1f592810a6a8fac443e1 legacy-trunk
+81701 a80c1b964a6fe96fb9fbb86d7dd00ad7ef55f367 legacy-trunk
+81702 bbaf6062f241436c9c08803819a054856f4763a9 release26-maint
+81703 f214e1bf031d297759d271fdf18c26ef8a033e73 py3k
+81704 52e92e77b3114d47f931727330402f088cf803bf release31-maint
+81705 734448e856aa7c6cea010bc151a8bde75be34ac6 legacy-trunk
+81706 09176d0bde3849e0d1e9e399f8b23933faff8635 legacy-trunk
+81707 d7541a490cbd84235dee7de21abb74965b1c35e2 legacy-trunk
+81708 9bb5c22ef13423c5f22c426e1859b1ef7a9fd25d py3k
+81709 5cdf26576e8ea1fd404174a9e3b79a34642b5c2b legacy-trunk
+81710 142cb6f60fd7e951c52c7537d6dee620445f4ffc legacy-trunk
+81711 23ed837615aab49e105e09361016283b6262fdd2 py3k
+81712 dda9bee5c84a000d08c19c9ba60d76ed01845121 legacy-trunk
+81713 60613e81fb1e852d13bc7ea729fe07e564abd696 py3k
+81714 5909e1f76be740d62c2a0844e07a70e7c90b882e py3k-cdecimal
+81715 2b5702d88f275e8fa079bf7ee28fab7ad840a3f5 py3k-cdecimal
+81716 c88648277138f1bc5b6c0bc50f29d4013669a2a1 py3k-cdecimal
+81717 6b5013fea81bbf0ef547881bf03c011dabb14d9b py3k-cdecimal
+81718 61f546e861c12f7617b98fcfe58e536bc901f4f6 py3k-cdecimal
+81719 0829f602080b9db772e9f4c2d671cf38e2fe3fd9 py3k-cdecimal
+81720 6f1f05c725b7c0f577a1d6bea3fabfd052b95e82 py3k-cdecimal
+81721 1fd365d3695962f31c9a2e468e93da0f11108a10 py3k-cdecimal
+81722 a409a5ab83bbcb2c78e5c3d957be5ab738615fd1 py3k-cdecimal
+81723 a56105401d526d4237dd1bf3fea8bbad9489ea07 py3k-cdecimal
+81724 09c05ad45b5f0bdf71891c0b80c99cff71e68e97 legacy-trunk
+81725 09c06ca27f7f846ced38360a9c6b5eacfa52d916 py3k
+81726 43e9a3e61796e6d8d002d612c237e36d2f5861cb py3k-cdecimal
+81727 cb50db9412c704c8e77a44015d14bda5ba3ecc98 py3k-cdecimal
+81728 be58814e25d785152d8dcb28f9b1642182bed11e legacy-trunk
+81729 3a571fd8c3bea0b1a0ad3169e56a57a8f067907f py3k-cdecimal
+81730 ec174f42f15bd90ddf2d156ad17ade0f3ac10ec5 py3k
+81731 0e3ec418845adc75578cf9d1bb7d82fa1b55cb55 py3k
+81732 aa5ce8615c4fc70526ecd491daef855aceb91e2a py3k-cdecimal
+81733 2f282f8f938848d3210fc3bb250b5b116e6a4a0c py3k-cdecimal
+81734 76cf4acf7b43f2d62623c559200c1f86d7e28eb3 py3k-cdecimal
+81735 986ba0ec2c55f35055e0c9afa158ce1fc653158d legacy-trunk
+81736 8fa4a5e5af552df78d8e43ed830ebe00b1956e1f legacy-trunk
+81737 06bd4a44839d96d5460aa23442b6587b6715b0f4 py3k
+81738 72dc0ef394acbb464ebfacb0d5b188a260024a13 release26-maint
+81739 f86c6a6e174414822368d1e32c5b50a64ac2c521 legacy-trunk
+81740 67c33cb9622da8ec426546f0cf54693454c80c38 legacy-trunk
+81741 e12d87c4559198e16ec6d12003a26931ebb14db0 release26-maint
+81742 1c30f9eb40b826072bd966476f88c59a13f96dcf py3k
+81743 912517ccdb3fd6fb86646eab0e52080e48065a4a py3k
+81744 3721d4e5b2eed3748dd0dc249e89949a30b92843 legacy-trunk
+81745 3662d2b5afaaeddb5dddc6c8889790ff4f5ad74d release26-maint
+81746 d0d057b5d3613285a82b78ee874383ec8c4ec94e py3k
+81747 8b87015512539a05bd0c787f598693dcaf3d019f legacy-trunk
+81748 ce9209811c0aacfa1503c80ea3bdf4b9fc21ab15 py3k
+81749 4a11522980b7b8e53680eb9cf5d90d8a78217bb5 legacy-trunk
+81750 af2bde72ce61a2c3273084640123a47857cb06a6 release26-maint
+81751 5e1b3b634d5346492b7e7df0d5f48cb1dacbf2c4 py3k
+81752 610ba99b8d0da3d02bef1aa6f2727d2372196e69 legacy-trunk
+81753 2d2b3824e39a510431d60fd0c7b478a62849dff3 legacy-trunk
+81754 3d4f1c259d2d0ab041d85583b78ac8e93b1a952c py3k
+81755 9c3091024bc8486d6342b1cec068a00aa24398a1 py3k
+81756 ca263d2005e7611e5c644a084869caeb81a14ee9 legacy-trunk
+81757 0a4b33e4ee23636522746fa3d2294017ca38bc6b py3k
+81758 5032f1d5a1e15c183591c4517c7e4468fc9040b8 legacy-trunk
+81759 c1caee32544fb79f74fc8f0c862da4eda16b4545 legacy-trunk
+81760 1d9b7d052bcc5f5722104b736848cf42b44db332 legacy-trunk
+81761 742d329dfdfd95cf0053b52463435ab210a8f6c0 legacy-trunk
+81762 da7a8ff7649976cae4f9c1f0ee7b7490d8d2b781 py3k
+81763 d7872ddb4b980808af58b036d33f13572d78e959 legacy-trunk
+81764 cdc7ca8db8d6ab44960dece234f96ee8b251e77e legacy-trunk
+81765 e0de33767c298cdc9f0156c697c93c5f5269b85d py3k
+81766 1410ac60a754121f900b3e06a98e71d79b600dcc py3k
+81767 3e0bc0e17f560ed4d72fdfa9bbf8409e4bf3aed7 legacy-trunk
+81768 26bb538ef6ea58333135130051bd2c2b787e7847 py3k
+81769 e1caed6954481fce61d2cfcd62d8dcc5a1647119 legacy-trunk
+81770 4dfd91742eb9bbe21b33a1d1be827418cbd330e0 legacy-trunk
+81771 d13dec1468b87489c06b44564af52d285a740bbc py3k
+81772 cd8ee019989d17557f66e8aa50b84a1a9ea2b230 legacy-trunk
+81773 fdda3f46142e4f97b1464a1ab58e9074725d06da legacy-trunk
+81774 0e7c7f18cd24b03ecd2fcc8dc1903a0d524050f2 legacy-trunk
+81775 381c5eeb511038d091d8e0808c4b85087ed2f684 legacy-trunk
+81776 6a28ef29b1103944351e2ddc130ad0be29f771fa legacy-trunk
+81777 589b611d7b4fa28c7227b4648174528e1fb2a51b legacy-trunk
+81778 301b78cc999b29bf1a4c4a6d5961855cc7ecae37 py3k
+81779 68fd22595db5776092398eec4153502fa4147623 py3k
+81780 c4d4ddacf9a59686a07b5ab8b89382eb908cbb55 py3k
+81781 849650507052e6f46e47dce1bd71337c47355b15 py3k
+81782 475cbde1ed19a7f40e240294f42da5a6729e8158 py3k
+81783 6a1d6d8cbc5213a6494297c25a4b6b03692f69b1 release31-maint
+81784 3143396a94f1ee35eb6f622ee2b7c8073642b307 py3k-cdecimal
+81785 495bb73b1cf1f3a56662ffe2fde83e3f63f7b55d py3k-cdecimal
+81786 43a3f2acc94ec2e160e008f519face9664add449 py3k-cdecimal
+81787 3038eac42f7dc7e4dd089b50a7d810d1e46fedb1 py3k-cdecimal
+81788 f6daf530f89ea63dc6e61407298aa737ae63debf legacy-trunk
+81789 ed0ca38921c76753153689cac4ef54231e4d887e release26-maint
+81790 df8dc8d1d571c6d0051c16e6a10f9eb5eb66a119 py3k
+81791 734fed5613aefa94cf34b90ae9e59a90dcd50fc5 release31-maint
+81792 9d49b744078c65df7a1692dc0de8e54b7f602a7c py3k
+81793 cef374b14f5bee535072020a941d40fcba9f07d3 release31-maint
+81794 c3f2ed4d8e65ecea41dedb2aa52d63fc57476e51 py3k
+81795 c32b038e0022e6e343e35cb677276f7a22fbf0d8 release31-maint
+81796 ed26ea78536ba3b9b79e446263f17cdf10c3d789 py3k-cdecimal
+81797 ff8ec94beaead8e723175360069b6e311f21cc43 py3k-cdecimal
+81798 b1b7af5183e35bcd379f6a2a63df55a4c2e3d805 py3k-cdecimal
+81799 736fa36ea81e202db9919d219ea2d6f8fa1aaa44 py3k-cdecimal
+81800 a22d8988899501b6397587eb2ee92fbe52902961 py3k-cdecimal
+81801 6e8dcb8e9e6bfb9851303b1f116a51d9fd732b18 legacy-trunk
+81802 2d7430dedec38363eaf003084cae1da607ba0105 py3k-cdecimal
+81803 fe2a0e1ec95dcf901f9d4ebdef52abc0510715b9 py3k-cdecimal
+81804 0efa1ad8bb7506ab157229041edf3acdd2fc16b7 py3k-cdecimal
+81805 b11cc1f1a698c509a1588869c6abb6c613e10400 py3k-cdecimal
+81806 0d9347934cc5b4a92aa2654e6056044755a049ea py3k
+81807 600c23127207d8206576889b5ea2b5e10bc86d3a py3k
+81808 fd8fccb2ee908cd4fd70bb7b1c00e0073ec2a3b5 release31-maint
+81809 1a1016fa072300fa6979fcc0fcd078dfcdab62d5 py3k
+81810 e932dc888517b1f87f36c91f34b934ba57142d2b release31-maint
+81811 9ce5563eecfb7940dee9698220f00572543cbccf py3k
+81812 6342d1467a4d448d28fa734ad8e30fa1c13efa7a release31-maint
+81813 a2145a06a7268f2030909b4167fda2ae3db7af05 legacy-trunk
+81814 95cc1e6d024694aa5fbbef871b7449fc395f9b6c py3k
+81815 538196cf91ff7829136deb33450473a32c0d24ec release26-maint
+81816 2f61e3a146b1cdce411b956744507c94fd58bdf2 py3k
+81817 f5ce5e1bb23a2136cd8fd0329b8fa7599311ce11 legacy-trunk
+81818 f2c4dd22ca61a21075daf832424a6ec12732f4c1 py3k
+81819 822280cee04b527f8c28ae7e85c235b55a70bcce release26-maint
+81820 26fac74ebab329e1d1c7a4debf68321abadf4aa2 legacy-trunk
+81821 fecd8fb7bbef5db077ed79983b67d7443def7e4e py3k
+81822 b44a2fe531ef51fa785063d130cf85e999bf102c release26-maint
+81823 d3797e9dfd2c197587c0d268167749d942c9503a py3k
+81824 dddb98ef3be5ef9066d5613e6e2763058eedb7ec legacy-trunk
+81825 e5f0b27bc1783798c65e8fb4e571f85ef2128571 legacy-trunk
+81826 825f65445a0a01ef1a750aedfca525e6f6ad96a3 py3k
+81827 5c6e75a8d61d55e63fc79337efdc7bd866e57fc9 py3k
+81828 3e86254039b9096fa48864ef101d915757b246c7 release26-maint
+81829 2718158c58d00ffc78bb4cafe9063916d01e84a8 py3k
+81830 a360e114866b554d8ff1b1adc5ac4c839d3bcb40 py3k
+81831 4f61332af35e69fbb14ecb8c7058a2ddb2849e45 py3k
+81832 b9518606cddce91d1ae97033bc6145d573357fff py3k
+81833 d2264f9ac61ecfd6cf08333f2db3f2735f0044fc release31-maint
+81834 35b4c356f24a62812bf890ebec6eea139898f0eb legacy-trunk
+81835 1166fb7efb07a6e554e95c3366419fe3d76f5e9d py3k
+81836 d5ec243caa1224afb764c244bf4c0496991159c9 release26-maint
+81837 b5af5c93135b24f34145d66a7974a06f0495cfa8 release31-maint
+81838 6509f9a3cde5ae27e0457ea277bf7958f85ca7a4 py3k
+81839 9f7b8b32b074aa91d31352120a4691981a70990d release31-maint
+81840 a06ad73835523f2486f036b501635aeb4abaa564 py3k
+81841 d281ed59ff0be4f2402f4f1695214f67c1059807 py3k
+81842 7ccc558114131f09b16ecdd1e6dabfadedb59d12 release31-maint
+81843 d92708cf1c1fa3364b5641093625e7ee54cfa2a6 py3k
+81844 a25ad9c4ace0018f852bb4374ec155e8833a89ea py3k
+81845 d47fe4134e7d11bf4036107c82e65b7f31652473 release31-maint
+81846 f83f201b1276084da73cae5ef7e9828c4b42692c release31-maint
+81847 1966c1bc9048e4eed1a2010a5d0e22f9266993a4 legacy-trunk
+81848 27d9bcc7e661ecbd7fa7eb985ccceecb878d9840 release26-maint
+81849 2cfe15b3cdf552c076c5b612ab51395a832350d8 py3k
+81850 b2c1995633bdc85ebc0edccfa70cb3c9de3bc900 release31-maint
+81851 d32b0e80faacd1d07725356638e4a782b34995d6 py3k
+81852 6f3855038919b622b994b871b2954eb80ec770df release31-maint
+81853 864ac7b3c3d6cef3cf5a2a62806af5541ccf9640 legacy-trunk
+81854 d7113cacd428b61b5d8a3d597d46d75246f0a24c py3k
+81855 6e6866cec37ea2c007cc9276039689e6c9abf21c release31-maint
+81856 96a5133825d2366881817d78ad7e7dcc36463990 py3k
+81857 c60402fc066f10c03a65ec0868e617e5024bb9bb py3k
+81858 b6ee205b9498bd0fe73fa19f3821ee3d6353e1a0 release31-maint
+81859 f1aadbebc577291231228fdf62e83921276fed77 legacy-trunk
+81860 ba2f2d08504b05006f175b4581466d3450831113 legacy-trunk
+81861 c1145e668d720864488ddce00195bdac5595738a release26-maint
+81862 865e34cd7e5b769297cadae070c0f1e20d839cf8 py3k
+81863 3375239d4370e2e66d87db46883d6212a72e6111 release31-maint
+81864 329c129e07b68af26279d48e9ccfd8c8c8ee8898 legacy-trunk
+81865 8f58b9e596688d42e667ace64ecd3c0af833da34 py3k
+81866 a2ea1a23186b08767016808139615fe6ae4917ad release26-maint
+81867 f33e464a9a60aa9f04978c6cf0f557fec08d60e7 release31-maint
+81868 5bf7336ea0aad89bd248220c2984d91d7517e2ed legacy-trunk
+81869 77c0ca69d5184d8922c5e17bc755563ae6cbf710 py3k
+81870 1429ac6bebc3f8d9a7ad170d9122752454bf8637 release31-maint
+81871 ddb47fd612a6701b37d5cf3564e0eab00d3584ca py3k
+81872 e087162573acc676926f2e8fbdbb17b4dd2bb778 release31-maint
+81873 fe5ed70283efe60941a7eac3548414e3391d2058 py3k
+81874 8cfa0dc38aa742b98039184a26c50fbfc1eebcbc py3k
+81875 ff50d45e061813532d3f60764897c6799d8cfc2a py3k
+81876 cd1024281b732bb848e09b1ef04e6e4fdb6b0614 legacy-trunk
+81877 f294473d879315fb326b768e7de46881352f3d1e py3k
+81878 7f540fe775fcce35db7d36eb865f59684cbdb4bd legacy-trunk
+81879 5fe4ad5b5ab9eb72a2fd8304adfda72f9d2f2a2e py3k
+81880 dbe7ae666ce229d694e8a9670917184673b8b028 legacy-trunk
+81881 0d166e57884df417da818f17af098cb7652e474a legacy-trunk
+81882 a8872b6505776a64d0f268d047ff6dec4f763713 legacy-trunk
+81883 72f774903772016cfc7436f174b3bfcb48a3ef6f py3k
+81884 9e12c649d31275f2c1c794c1fa3b4b794bcd7884 release31-maint
+81885 aeb47d30fba4e38da1e8f1221e4d062042371e1e py3k
+81886 076763c667f9565b8e28291eefa7c47ce4fb3c54 release31-maint
+81887 8c3a222fa6d158f5fbaeba3c63f53491d71a6eef release26-maint
+81888 4c99da8c1e80e7fecb3c8573e67b20d7c98ee870 legacy-trunk
+81889 7ef46a61dc97eb752f480869de8d7315fbab3d95 legacy-trunk
+81890 3420dfc559bbb83f44f6bab72c9914a11e8656de release26-maint
+81891 8319ca0d54349310c5ed7662d0d7bec5cf4f8466 py3k
+81892 4467c4c1d38ecfffaec0f22651c5839d95701e25 release31-maint
+81893 26685311d3132410a4771d3b53cc9f120f1ed86f py3k
+81894 4c3be74ca50127f0638b68fde18c0584c4e74f51 py3k
+81895 3ba1b5b4c108850084c1bde41c9744abec32711a py3k
+81896 ebc4e896924e2a8c4e00736f002bb407ff6f5c5d py3k
+81897 6adc83d999d0e452d0366b9a4d10b786d6dd2c42 py3k
+81898 6ff88dca8133987c17811db17ff080617f9ed228 py3k
+81899 cd596a8f91f378618ccb519a2801b598d71ea8aa legacy-trunk
+81900 b091a7e4285f93cb5fa3df3014af60d839c86e16 release26-maint
+81901 2a8ee11e3e18a3d44712a491546c204d8b70ed79 py3k
+81902 73d82b0b6dee4da5ce9dd5a884dcd2d6b5a2e707 py3k
+81903 50c2391749761939ef2a1e36c5a9a291d23bf1f7 release31-maint
+81904 7db7f8442414fc4b87ae29f6b016742de784886d legacy-trunk
+81905 9dac58163b7999ac53097a77f79a28bc327159b4 py3k
+81906 661519fec3b8688fc75085a7b19ab034cb6f3581 legacy-trunk
+81907 98245464b6654a05da854223aa91c2a2b540a4fe legacy-trunk
+81908 7576260d1b6541500582f2e9d23c07284a071032 py3k
+81909 22c045d1bc8ccf93cf2a4301b40a1272249d74ef release26-maint
+81910 8d5dd2276680564f73650e164f79f8aba0f31d4b release31-maint
+81911 88aec5124185dfe41821ef815590a7b2333b58cb py3k
+81912 44dc98502ac323a5cdc9157ada96cb199a863863 py3k
+81913 a653e306108f5343acbe6b8664e6103fc3b626c7 release31-maint
+81914 bd8a1fd4c316f20dec53ff9185a16cd3abc9baeb py3k
+81915 c8bc2d8e9ae1cfc6b9041fef70a7b7101027f9e1 release31-maint
+81916 f52aefdab1820e68a2e6523fc6ded0483d18ed3c py3k
+81917 2b2f553f1ce611058404f1c63a215bfc30af8abe release31-maint
+81918 f60aaf99b836bf6eee1816997c40866a1e765d56 py3k
+81919 a2551b30f049649853d418184d2976c2bc320870 legacy-trunk
+81919 fe6be0426e0d353db84ec869a5b02dbba6c3d4a5 release26-maint
+81920 0167f91721a84c618fe23a9cc564f058ad29b045 py3k
+81921 8624582809f9c72d4e347dc5a5cf9c8302a0b88e release31-maint
+81922 d9282065f5c9ebc24fdec70335dceb06b8ce2a37 release31-maint
+81923 137da7ce5e8ed1bb7af4f7466f558cc8a1456935 py3k
+81924 72169ffe32a02ce1def74df7a3030aa6445fa6c5 release31-maint
+81925 6eaa79be0449fd04f6dda7b00aa218579d934ecc py3k
+81926 10319217af4430df4feed5c1e7e1eb626ca53642 release31-maint
+81927 3022904f99711bb97e271c9f00021f5cfecf2288 py3k
+81928 8169f33f22688f24a2a46b6df3e9ca48ba00c4b1 release31-maint
+81929 444c025e298da3696ef090b8a5b42aa8b348a7fc py3k
+81930 e80dab3e909f7b33b913cbbbddd2672ef1650d86 py3k
+81931 a10a7ce97f45a7b485a647f9110718298a7beebf legacy-trunk
+81932 84dab29bdea70a392318438c91766ebe949a69dd legacy-trunk
+81933 c2b923834dea75deae5a369cc63de8bab630f9cb legacy-trunk
+81934 61d4cc6781655de999c6b8e81757938ded9dbc98 release26-maint
+81935 80110fd431911929198695864e9d5314d322991b release26-maint
+81936 6ce7ebcf9358de5f9563251ae3bb9cd9a157c961 py3k
+81937 52eb0c093b6887b9de865abc68ae575a089dfca6 py3k
+81938 a490aa303d8addfb8302095c7c0860471103544e py3k
+81939 4e9dd6d8006380ddbf5d9e98b55531afab548bf3 legacy-trunk
+81940 31f01c881c460f36c069ab33fb57aef02810bcaa legacy-trunk
+81941 aca13a5d6144d38b68626a8899b6ea2a6abeb518 legacy-trunk
+81942 41ed58ed5c93bac1d68e5963a4ccfa965e9d2caa legacy-trunk
+81943 8f27b61a40fa9905331a73039c880570bfc35a7f release26-maint
+81944 606bad58434464d31ca00b9ae931790ad00f2b73 py3k
+81945 db55167fa5e79888e77db4774c957e879ad5e29f legacy-trunk
+81946 5160048d53617110c183b3f8e906b4118ec7c672 py3k
+81947 bd86bba5ed33a01eb33595ba9b6a133953b7cf61 py3k
+81948 e55fad3d5ae484c41cd172e8aa9a83c244d27d37 py3k
+81949 9550eda1c0964e64cb6d761e831f5cc4feb556bb py3k
+81950 9b333bf08d45f75c0b691c00a835b7e83fbdd5ea py3k
+81951 44cac5c565b7f099933675ee9ac6844509fcc233 py3k
+81952 d06577db727852c50bba4296d9d382c0bd737d64 py3k
+81953 73e5354f92e71428acc1318b8e8d447579242e9e legacy-trunk
+81954 e0c4daddfc5469ced07790d1b77907569d3df0e6 py3k
+81955 b90e335a609a9791c5d96026c84de5f5049f9929 py3k
+81956 8bc0bf22014d831a844b50d285d9f87bf63dbd1c py3k
+81957 0a55ade6d85781c38c820bf76b226603597681d4 legacy-trunk
+81958 0b2e0b6839a2735bc8f21c9aff93d0ff3f112d68 py3k
+81959 b00c736555de70e3cd2eaa47c02ac47b2567c90b release26-maint
+81960 0f5d114eff01442a3b210cdffecc8cce8723fc0a release31-maint
+81961 e585b2431c4a5469d5b498b62a80cea8d57ab3f5 py3k
+81962 5295b4dbf355a84d69108487e157757557e10970 release31-maint
+81963 b9ecdcec0ff0d8bdc1f88e43dd250dcbb26f316a legacy-trunk
+81964 8f137a5c413ca31627e9f79fdee79e3052646a8d legacy-trunk
+81965 7ac6148e6a7f84a6bdee4ae695a722c340020f39 py3k
+81966 4eac135a33afd694d3703852e43ddebcf8a96ba3 release31-maint
+81967 cff0a923140be8ec8b788fb8afe6e6c117ca0a3c legacy-trunk
+81968 d064e8934f4d0cce04c95ca5a80f90e581fa5a48 py3k
+81969 2e52fbcaaa73bddc23118152529d510e1ab3c540 legacy-trunk
+81970 1383b84b17acf76ce51f57300a17119924b9345a py3k
+81971 f82d96b9f03edaaadecb45eb4ae15327ddfc1237 legacy-trunk
+81972 b084c0a934a7e96381749d8f5f7cacb06e5dabfe py3k
+81973 b32a2816f6e9c7844393bdf512d9874ce2bdec53 py3k
+81974 0840a283af5f9ab62edaecb719d8efd83992d4f8 py3k
+81975 9cb90169b25a863df72df8f5f58e7521ba6e5012 release31-maint
+81976 99b80c288fac45eed0f823e672ee6b75c5d5e225 py3k-cdecimal
+81977 92b8b67844e1017d66e69f83e678a86b3a480088 py3k-cdecimal
+81978 867b976e349dad23997a87815500b13dafe7ec1b py3k-cdecimal
+81979 0723ee19547b95615c06dc115457c72c3b05aa52 py3k-cdecimal
+81980 d78b15808710a7d675d8baf9412238e01facf139 py3k-cdecimal
+81981 b78a918b7a0ec64be89c2c8dacdf0fa95aac16d5 py3k
+81984 9be60c185032a65e22a596189482b47727c7d01e legacy-trunk
+81988 ef5de56f24c64cde0604b3f71145f337b2225f01 py3k
+81989 623b738116d242f0bbcbfbdc5d5916e7a320f33c py3k
+81990 95b5ca2468cc60a2cd2464b3e337995d21f471c6 py3k
+81991 a57d59cccb8fa5ceb2a3a23d31579813e01a6331 legacy-trunk
+81992 6f9b0c240191df73c2f1057b196216b60e92dd0f legacy-trunk
+81993 8f3fcc239781b764c3513b1affaa0df8b08e31cb release26-maint
+81994 0ebc72e366a1d96fb8e8cc6955f7288a9e84ccad py3k
+81995 7ac0f67ebbba894bcd9b0b65fa93a6367b6fb586 release31-maint
+81996 91bb572b756e06d476d6bda00b04fc8e98063356 release31-maint
+81997 3ea66e3a129a4f97b3b7c6c485e727dd45cc0488 py3k-cdecimal
+81999 e43ab52b57b23439e988ecf34b4d75e8a50c523b py3k
+82000 32c4fff445ad2cfff097ac8fe4f339a53250f183 py3k
+82001 49dd599150ca715c21e0a79aacad69c6fe91645a py3k
+82002 fa8977324ed8670ab0ae17f59c2f193254ac378a release31-maint
+82003 f19ae5cec8ce79f1605f93bb1b5f563d8ab80b3b py3k
+82004 354b751e46d61cb71f5940b00886248aaea75dd6 py3k
+82005 356d0ea8ea347f0d7d0adaa76516a25e6c6c99f0 py3k
+82006 2466afed6f5ece69e153ba63d72ead7e8c0e3511 py3k-cdecimal
+82007 b8488739879ec98a50133e178de74b40df8e2c2f release26-maint
+82008 81855cedc156f598cb6938d7d8ae585b51e07768 py3k
+82009 48f5859760ef4a3bb285f6b7e6f83e7915433556 release31-maint
+82010 8a87c5afaddabe31586610cd695fa481be11074e release26-maint
+82011 58413676befb64bc30947a7e924bfb5eca2d3c52 py3k
+82012 22ea696aa77ac63e53d22b6cdd443491c3014eec release31-maint
+82013 7bc81f8535ea41604b4fd9a97895086dcb3473c7 release26-maint
+82014 adb8c81cc39a44f1302f489256b463bacb9ff527 py3k
+82015 9dc84c424e413657af87f387916cd475b46eef0d py3k
+82016 422a183e0bbdcc72a8065d381e964b578d780c33 release31-maint
+82017 0030a74706660116bdb2d3cc054e97f0dde4bb2e release26-maint
+82018 84fefbf1d6c080b2b15131c2f84eb9496250e6e3 legacy-trunk
+82019 e753562cc023c03f1aaa350824b055ccee114bc8 release31-maint
+82020 c41cb484f0906ce0f6c376539da736e435e0c12a release26-maint
+82021 d30f6c59f810757691f53ae0d9ad907b57279171 py3k-jit
+82022 d3377ebd3ee54ffd77faabf2510a6a21c0a60386 py3k
+82023 b4237703a0cc51411feeaf079cc49fd31db68e41 release31-maint
+82024 81135ccf5f55e3e20df6fa9d50e375e72739a5aa py3k-dtoa
+82025 55e24c243e2f1a87cb9c04aaf306cab39b727466 py3k-dtoa
+82026 c6845e83086f5f831589784fd2d4909c19c6aef1 legacy-trunk
+82027 da3c4794d6dd6c519976f984ecfa6c976f2a186b release26-maint
+82028 346ce255a52fef1dee1c6af1bc42d785d2cb05c4 py3k
+82029 e4d50640f0777c4786f6143bbcd47bca010396c8 release31-maint
+82030 735782a275f50a854c7b518b6dc5912e367dbfbe py3k-jit
+82031 f3413553f8f5ea1a2692bdd76875729662f44ba7 py3k-dtoa
+82032 856276952e086397a5057d267d4b5224d3ca519c py3k-dtoa
+82033 bcc0a997f321fcae1d4e141175cedf656fb13670 release31-maint
+82034 6d3b05a429b5aca5e2f50fc4419ae680cca77be5 py3k
+82035 2dd1fe7047ffd9fd766afbf5afb21688624fa920 py3k
+82036 1b08a541551aad867ec59f8b4caab32e4fdad901 release31-maint
+82037 283d9472df4ed3b7a5bf8004f4f1d6e1b830095f py3k
+82038 807cdea47817bbe782e786714a12d89f8d1ac928 py3k
+82039 017e60ae605f4be1e213652ae01539095b5f2e45 legacy-trunk
+82040 f5889f2ac39bb38e2269051d325609d3bf98f345 release26-maint
+82041 2bb0a27a3e35c427ca0ffb37258938a71db8e4f8 py3k
+82042 8cc0e1c9ba6d609fb8a535b73d07a3825cc1abe8 release31-maint
+82043 cb4997b6aa8be698b9fa8939d15aae2f7ca56b3f py3k
+82044 2cc09f06950b04825e2376e3e10af8354555277a release31-maint
+82045 4d25639a3b14bd6bce2d8fc480e00a6a1edd93ec py3k
+82046 b1d6ccad8ead66664f06b0b9789b480d07aab4e2 release31-maint
+82047 84ed3446a29a1b830f6bae7d0af360d57a19c520 legacy-trunk
+82048 1764e0be484c6c82f400c9a26b35a82537d5da9d release26-maint
+82049 2fe0802c42c745dce72c5fe07805f1f30b62307b py3k
+82050 c2e73d844d822bd32e84ddbaa930d9b58bb66ec8 release31-maint
+82051 c48ddc96f454ae28b42fb8657bbe5c5715fe5d8c py3k
+82052 6bfdcd25eea70df03e3cb1326de8c300aa148652 release31-maint
+82053 5c0d8c284c32dc8e7a02693f292d8be0e61875d7 py3k
+82054 6a9990ef4a6f5e9732a398b1dab27d83391c30ca release31-maint
+82055 46ab5e4dba6bac7d1e7bb20dbcfe0005e28a663b py3k
+82056 1da7733e8f24731a0b88dbd6907804ca02a11dc3 legacy-trunk
+82057 f3dd930665bd17936308813304a2c4084c5bb091 py3k
+82058 da1aafa55ae0239ee526fec84a4c404266a131cd release31-maint
+82059 907f564476be669ebeaed418efead2ebe60bfcac py3k
+82060 59c60a59b27a57e7c4e162b6bed264df02c6fdb6 release31-maint
+82061 9d4d4ac0a7bfe81174af4d0115ecfd0d4a6ac190 py3k
+82062 07449b3679357db2eea96a8302df87c03cba5b5c release31-maint
+82063 fa830371c724174fba1b53a0991f0a3d518d2106 release31-maint
+82068 4d69bdb71c9ad51cdc686964526c256dbf278d3d py3k
+82069 46356267ce8fbb59d9b067528857da8102fad5a6 release31-maint
+82070 e5f5008fd56d50f49803b5e5db2f89bb70b92837 py3k
+82071 bf94eb8faf62537fd7446be43d89c9b22b3535e6 py3k
+82072 ea25129b94feec50098482c4efa825ed71d53656 release31-maint
+82073 90cc266798a24fc50c15b7621c1b348489201164 py3k
+82074 c54dd576dd055482f1cc173044ce7ed0d58d6361 release31-maint
+82075 da558461d9a94bb7ee9e79fcc2bc0e24fe8ae708 legacy-trunk
+82076 ef8a2ab26e9fefefb39f57f9fc320af8fb94c981 py3k
+82077 1f0e0781f73e461b1a5990b15b1eb59f89f39819 release26-maint
+82078 5de52eb252da706da3f6954d50e1e84a7c13c0f9 release31-maint
+82079 dd7005145f6e65f236eab5f208587993b2b3d3cb py3k-dtoa
+82080 18bcf6c2d1e37b281814f4440594d8bb7ebd35a8 py3k-dtoa
+82081 f6767dde9b2989b87ff0631660c7a79686a4e25c py3k-dtoa
+82082 b4a5a869e1c59d8af35999a266e8edbc88a677fc py3k-dtoa
+82084 3afc7d8a445aa5ac95f217c5387c6379b5c5755d py3k
+82085 0da4c7d1f3ef233e5a343e64fd5c2949ddd5773e release31-maint
+82086 b9019f0dd89d3e17691252d128f10a835f10bdae py3k-dtoa
+82087 429b329a03f8334a628cadcf2e3a633d100f2a49 py3k-dtoa
+82088 343005c4a4e3f5e1e1da0699962672ac6f722144 py3k-signalfd-issue8407
+82089 446a966858f1481e7047bf027ec276e45b722efa py3k
+82090 c4f5c734da6e4c137ad0626933a00876c59848c2 py3k
+82091 5a28c6cb47527b9d47793febd8fae08d73493535 py3k-signalfd-issue8407
+82092 069535e50a9e4fdd4df0db6bde6ff91255f59cc5 py3k-signalfd-issue8407
+82093 466c162c730c20cd4dc76d34ddaabe4f2f9a6733 py3k-signalfd-issue8407
+82094 89a42e0713ddb9eeb09df50130b3abbcb9849fe2 py3k-signalfd-issue8407
+82095 ed07740c7667aff9e9a70fa551c05311e799c9de py3k-signalfd-issue8407
+82096 880bde5ab7c5434531cd4d32678bc7e7fb46020d py3k-signalfd-issue8407
+82097 ac5f5537c73b6de4754ce914e0cb7d18d2940f5e py3k-signalfd-issue8407
+82098 80d4800774339eeb52bf69ad6c763afe8f6be766 py3k-signalfd-issue8407
+82099 f73fa35f6f05de45b5da681df093533e4c940654 py3k-signalfd-issue8407
+82100 35f801526278d4a4d268a26df7c68ccb01fb48e9 py3k-signalfd-issue8407
+82101 5cfe05f2a4e9c56ac0ca362038555d5032cf9f2d py3k-signalfd-issue8407
+82102 cec1b5584517b097527e34c82595d6974932f5d7 py3k-signalfd-issue8407
+82103 80613dcf80910d6d0bae3972953e005371cb1807 py3k-signalfd-issue8407
+82104 483f362b8ec3043832a6117f445a503e865a9700 py3k-signalfd-issue8407
+82105 306336a1ce291170ae3804364e4ffe16ffbbc7a6 py3k-signalfd-issue8407
+82106 a56faa6b8fa02fd6649c119e65e5bf9f67e18b6b py3k-signalfd-issue8407
+82107 1991a9aaff5e398515227e235456c62e2073e63a py3k-signalfd-issue8407
+82108 b614647a340052b7173e01345e26dba5ab56a8a9 py3k-signalfd-issue8407
+82109 ebac2eb7255b6553b1e73d7dd8ba599a608488b8 py3k-signalfd-issue8407
+82112 93896a0946c2ef584a97c53df05948863a722b07 legacy-trunk
+82113 5c84fcc1d906eaec9b5fd40035d7b5192319f0cc py3k
+82114 6d9746cd935c60d7f59774f52e24d8008f8beae5 py3k
+82115 654e53e75cd2b02cac3800711721e771d0b9e553 py3k
+82117 ee35f71567612b1e5978d5caf2be40923fc4e57f legacy-trunk
+82118 c91538c1a7e6c0778808d99858c5773021194771 py3k-signalfd-issue8407
+82119 6acddb5fe8e21be6dac08958d730259bf887a042 py3k
+82120 bdef454f7212a8babe00df6c9d91c57739ee53c8 legacy-trunk
+82121 923735137030f2c4c907129b137d178131be8496 py3k-signalfd-issue8407
+82122 3f09cc38e97e30ce3341da35a2a279085e1a3f9b py3k-signalfd-issue8407
+82123 965a44c2b297b9b6ce2c8740eb18103fda96dda4 py3k-signalfd-issue8407
+82124 53d3d068bf4c4b9e720dea8e5f1a78a8a2185cca py3k-signalfd-issue8407
+82125 9863bc8630a39dd73aa6e7d68bf5def26836bb77 py3k
+82126 ce21eb5c17a5f303cc279b054c404f7f70285ada legacy-trunk
+82127 d014d1f65823195c11afc31a2ea67db2ec5fde9a legacy-trunk
+82128 dd88057b27b1cd9f5be9bdf1aa425badda1b3989 py3k
+82129 f3d45c443b1379e18bf7d8b6872fd20a72768717 release31-maint
+82130 1a86d845fbc6f394add6a420c27f98a8250bcb5d legacy-trunk
+82131 73f8faca290bfeb640ccfbe41eb686c025259ef7 py3k
+82132 a101d073a5cd1fbc454fcb5c2f0555d5665e9cd5 release26-maint
+82133 1af95674588d1d3ae2ca885ed032160f895e2b83 release31-maint
+82136 5817395a048e5ff14fc85147706efbf605f507fa legacy-trunk
+82137 13e5b0b2071a2a42067fb03facc931409fa6ba50 legacy-trunk
+82138 7e4cd703a18b7333e887b55c9571040921c729d9 py3k
+82139 1f10c912c127fc30df9fe632216cdff058f91dfc legacy-trunk
+82140 daa91888da52a39663594d41b0bf37819a2920b7 release31-maint
+82141 f268c2ae0835f424b3b07dde9c94cc5417c3e022 release31-maint
+82142 af751a1d6f44947a24143aec55a4a70779238ae8 legacy-trunk
+82146 0cd99f8c30e1390008a95e140c64c29648904b8f py3k
+82147 0afd760e7c76531b0dfd41ab30055a1448f20dc4 release31-maint
+82148 0b7acdbd02eb343842968c7859c3b2f37c5afa89 py3k
+82149 5a325e0f1fd01357f84b58b5eee15364c4367ab2 legacy-trunk
+82150 6e5d21e223d2248416f68eed0d4dae9cbeb3e83a legacy-trunk
+82152 56ed68c215a71ff97a42ff5968f569522ab3c011 py3k
+82153 5d32b6afb52eeed9264d52605237d63115437efd release31-maint
+82155 108f94d53edbe2a1d0ab830b092b4b174c3ab898 legacy-trunk
+82156 d9fcba4cc14545a9a84e4fdf79f80b0332a4ea7b py3k
+82157 f918d35ec56b8528903949e60fb0301997a01a48 legacy-trunk
+82158 376e81f9ebb1d391f7c9ba0c6d15576d974db961 release26-maint
+82159 906063ce711965959c99db45bf8510ad93f67487 py3k
+82160 18635cbd66e0a33ad429e5541a7ff7097a2ff468 legacy-trunk
+82161 f78fcb1b23f5b8e00103dc16e0802b51ae007f3c legacy-trunk
+82162 1c695c0aaffb48c2d226c5aa7f2e0460fbc651aa py3k
+82163 4e24dfedf80c51e5009aab9642aea68861a66470 py3k
+82164 a1206a69e77a53b90cbd66ca04d492af2d1e0a3d release31-maint
+82165 53a152b400a7e5bc63c3e728d98242ea12b1a6b0 legacy-trunk
+82166 f17a2c1e291928c463716e004717c8d69b9eb2c2 py3k
+82167 4dd8cff6b7beb1f6f103c4cce6e08d046b880c16 legacy-trunk
+82168 d15be8b5c7cad96d4fbf3d06bd1aa90d50d6aa0f py3k
+82169 e9fb042e46fb50005f77ea16433e4f4185ef42dc legacy-trunk
+82170 8836d271670b6bb864f1ab3c44d652a992268379 release26-maint
+82171 eb95af0a99cbb1ba0abf5da5a4196f9556b3d36e py3k
+82172 2907ce8bfbb6027617b9fa409fb6204dbb8c666d release31-maint
+82177 ca4f2e9869b6752fcd9cbab112b11d926d77c6c9 legacy-trunk
+82178 426ef9c37916fafd3b8b5da46697210e9b29f6e2 release26-maint
+82179 074859ecdc187322da962367ef0d7aeedb51270a release26-maint
+82180 76bc6b577373cf54dfedd1b10b2f74d493583c7f py3k
+82181 c8d5d1205fe830a5b1d6a420601b61babed0ca16 py3k
+82182 0e4637ea20d0013a570dc912068dc743851c3880 release31-maint
+82183 66ef9a77c8afd5cc1852a67622aae32e81aeac05 legacy-trunk
+82184 3cf35231f7d3ed375a1a99dfd85b6ff0bc666af6 py3k
+82185 3afe361efcf38bf88665ea71231740af7c177f5a py3k
+82186 cf79741f7a23fc55fe5037a75bacf3a4ec1c277c py3k
+82187 95d2035a164b9b05e0540d66a83657c14c5114dc release31-maint
+82188 5f45692489da1fd3561d0639c6804f3d10da7edf legacy-trunk
+82189 cb1ab8e9158107087e01c3f9ea2fe885e53c3e79 legacy-trunk
+82190 61fc84bc4b146265d0cc9bd94473693ae1dce127 py3k
+82191 b17fcdd38a5b402a0a0119bcb60c123709118253 legacy-trunk
+82192 0d4245412d0b533b55995eda2a8346f03d284138 release26-maint
+82193 c55157e03ab943f98bb2a4f46986825ef6baff80 py3k
+82194 45baa429fc49ccd9915b6d320455316eac95a27d py3k
+82195 3d6f0a2050e2926f7093da2b1ce95126bdfc558d release31-maint
+82200 5d538d1e7098d96aa1b19ac55103677da1bae066 py3k
+82201 a39b52ee0b1d4d92eab62aa99dfaec903bd8f847 release31-maint
+82202 8939701416082a29be5194f0f55d0f515e6f6343 py3k
+82203 34744a76143a8e656e1b61a7c94f3d3d68233c10 release31-maint
+82204 21e86dd328f157ec5fc7311f7519d5d3b3d97281 py3k
+82205 b8b0a15f8a7ca4e8431ba9a0a53eb384f2fd3020 release31-maint
+82206 bb6222a4ed2426e9c7becc9875f1c095b0e1fbb2 py3k
+82207 13b2a592c18683e2fdfe0476a0813b5ad0aba000 release31-maint
+82208 bcc0e825faa0ca80e933a7384dea8fc94929c0e1 py3k
+82209 c4dd5a889ecdfb683fd96586eec6c2da50b39976 release31-maint
+82210 46b487e4a75b8c39f0880fd3c9c8683a4c63e922 legacy-trunk
+82211 57115ab06b278006136da39ef4db77b4a925bf36 py3k
+82212 598e8dc18b83e89d6b702c9425a1fd0abb9cb962 release26-maint
+82213 ef642e24047ab6815648f3c9e2dc79b111e7ba35 release31-maint
+82214 4e099e5004a1e825cc244f1137116a6a578d6a57 py3k
+82215 d96acc41c59f2f477d4ada51b4edc228d4dda3f8 release31-maint
+82220 69fdf68e0b5b46041152b21b0c08eb947a5e0715 py3k
+82221 ba55844bf5c0314b69553f1bb737b26eb9476c8c legacy-trunk
+82222 83ca0ea9ef1fb216cafcf50e5e6abbe0df6a64d0 release26-maint
+82223 1c5c146de6425d00e09d0ac835b9f0d9d5e5f823 py3k
+82224 0c87490767bf1c516792636cc7ae2174f806c901 release31-maint
+82225 b663cf6bbe8b371cbc4b106d8fae96174926d953 legacy-trunk
+82226 09eb3626d2aae811d6e43b30ecee3933d37a578b py3k
+82227 3d3108ac22b2c6e5685519706a68da50921b9cf7 legacy-trunk
+82228 2cd22257a86d7b8069a630e4a604d06e9e5dce9d py3k
+82229 a34fd6f8165179bfa352fdf1e1a8bbe80047b9f0 legacy-trunk
+82230 e24990d0544ffff9f24a676aca50ac5a9a11f141 py3k
+82231 f232c569d225d7c1470d26c6c01a5ad7a5c8cea1 py3k
+82232 c51bf3153f2ca89b40a88b604b28c0af134f32bc py3k
+82233 1ba0ab02e3b85707341aaff12237defd327cb2f9 legacy-trunk
+82234 cb6d9bd559efd3ad336e594855cea1a9f44eea8d py3k
+82235 a456b00c3b753bdd965ee785817bc00a575b4770 release31-maint
+82236 7dcce6a281ce2bf6a5d47e8999f0e93420cd72df legacy-trunk
+82237 152b44642b2c417eb6ae2ab024d3fe6ffcfe4318 release26-maint
+82238 4afef2e40b633249bd60c3656b4ee53f66aea1de py3k
+82239 21552a48ebd1968db9158c495fe49be5770a5324 release31-maint
+82242 2f6fed60613e12c8e92113340ec6ac5c1b0f47ca legacy-trunk
+82243 7b04d9a698aee676c2b058dbe9ba254763f13f56 release26-maint
+82244 d171276ed76da72334b780062fd2afdd15e3d220 py3k
+82245 1dcae52c495c846c1cfcd6d8db9d1132b4454974 release31-maint
+82246 29e509793d3c4818a8f0c570bf695d905355a48b legacy-trunk
+82247 adafee9589e4429adab07ff2cca51ff0bd30cc12 py3k
+82248 ed89b1aadc93d2d1da7908935589383a40d4729f legacy-trunk
+82249 c912b5b24c8f2d1b24a70745f326a184c709c39b release26-maint
+82250 014e7c00dc2805831f2ef24f14699ad25be1c7e5 release26-maint
+82251 396eb660ee9b40bd9ef25852f502307efe6f3be0 legacy-trunk
+82252 352dda07707bf928d3db9e9ce4c8d8f1cbd8fd21 py3k
+82253 a39ceb6cede315d8335823377d2ab325a20496c6 release31-maint
+82254 456d6c5d26dc6e6e5ef65967501a20d658af34cd release26-maint
+82255 7fd3f6eaf6495c307deb4596833087c1eabcdc23 py3k
+82256 706688fe45935673f953448b78a7b22cfcc315f7 release31-maint
+82257 5fb3f1a74726a6b83d9aab4dc073f81fe1215b73 release26-maint
+82258 f6d5ea769272796343183029e42f964267fc0380 release31-maint
+82259 e4753855ec01bbe516147227b517f7f8651a5935 py3k
+82262 6ea6d85150b12b81b79348a9138e46a8a99f8a44 py3k
+82263 547e65db4d3882efeb99337dcc24fd9e5d2f9848 py3k
+82264 6b454377affed58f777d5060cdbd8aa53ac83526 legacy-trunk
+82265 815284c9d719154da379320a11ada9df01193c4b legacy-trunk
+82266 676a480efc08cbda4ce857b95178eb8927ac2f43 legacy-trunk
+82267 f79be798130f2b1cfc85b2fbf891ae683da6d8a6 legacy-trunk
+82268 ee1ed80d7963391795cc25157b4e32860df8006b release31-maint
+82269 1a3d8ec0c5fa8ab65dee1554b43d9870066566a8 py3k
+82270 5b38b5234dedb72adc746d526844ad751d36c00f py3k
+82271 02842ecd8e5b94ada8bac3bd62293afc57ed7f7e legacy-trunk
+82272 a3dd39e36c9df19c600ff5f81a9fcd3d2d43d7b8 legacy-trunk
+82273 f1174e79f7f43e7597f6b73c5133fa0311449a00 py3k
+82274 d3c75c2f46be26bbc69ef09fc2f681ab1b34f691 release26-maint
+82275 02044573eeec1eaa33c3aa46730b8f59f43ca074 release31-maint
+82276 6b03124937559e709b4d82ea1a7da8cb1d9673db legacy-trunk
+82277 c50563824094449a7802954d96572a794aa7a4bf release26-maint
+82278 c88f7600bb17bae7085816e044eb41c3d6c7ad9b py3k
+82279 f505df03a7d7cbf739612d7247dad19aa415a7a7 release31-maint
+82280 b04cef55fdf43cc6c228c3a6159b01fc8dc688b5 release26-maint
+82281 7d928029bc0e9f36067e7c0d7fb5b9e3377a3a86 py3k
+82282 eee2579283001a98049568f2ed4b77cdf1d432c5 release31-maint
+82283 dcf9bcd9a1e081047ddf3f03b2f9e20f8b9f3ff7 py3k
+82284 a18323fbaf958fa47a1530043e11012dc7e21f5b legacy-trunk
+82285 deed156d33d806f0ddc368bd740d98120c524275 release26-maint
+82286 0be2439bbcd80185fece21fa30d3ebe951f300ba py3k
+82287 e64746e02e410100f26e2b8a12e17cf07548ab9e release31-maint
+82288 2818283c149a2f47be380bd2d988f6cf4d3501b4 py3k
+82289 933a3556f5633588fb12b3688d9f1c7f3ed028c9 py3k
+82290 ec0fd5a6bb456f787e0427eb0b51cefabc791627 py3k
+82291 cb6f3a441ac2de16e1edfd6dacc681ea4f9cf054 py3k
+82292 2f3501f8d456fdfd40cda0bc290729ada43a6691 py3k
+82293 358d86a572fb189a243509e86595fea41766b8c7 py3k
+82294 cbd5139e8fe48975cdba9d3252c9d73b6a864fe4 py3k
+82295 08973e608a2a440f5e75ad6bdad94b36e8ba1c0e py3k
+82296 0555884e986234b832093a739eeb706147c1cbc2 py3k
+82297 820f3b6cb55118749771fd3ca9db244b2fce2ee8 py3k
+82298 504c499e8c9582d5b17db66a731b2660825e3212 py3k
+82299 9f2294874910ceddbb1fe5faa6173e50ab9d1358 py3k
+82300 8a7ccb961814591f9bb878647d94c1f5600a2edd py3k
+82301 8df6192590564e65e67a64fc061a2d23fa296922 py3k
+82302 32651ee779ed00cf172075e1ae3a1500977aa34b py3k
+82303 3670c66ee149a5c383996b92731d9048cebd5d54 legacy-trunk
+82304 1d1797af46220b572052d10a1eba16344f90f504 py3k
+82305 aa262c5b18b5326dba12cf2be89338d8bb9d68c4 py3k
+82306 935075d335fe8be7bbb8ee375d86cf5a24f3399d py3k
+82307 46fec77f95e8d15ed02476926fcacbd568d54a2e py3k
+82308 6ec825c9b3b501f2ac128832db73f2f4d84e7b6e py3k
+82309 2e37603ca04da26b413715bd89dc2e852b0f52c0 py3k
+82310 4aa5b9589c4212092382c1a3d967f4b215551841 py3k
+82311 a857dd40796482faf42b816aa39db285ae11e81c py3k
+82312 2bc08000a85727e10ea948341d043a5adca392ea py3k
+82313 dd30bc5d184e9146aa8e45b4fb274f89a71e39f7 py3k
+82314 4893e4009f5671248b86b0d19f74c9891c38db7c py3k
+82315 9f699e514a62c27e528683fecd1049bb31cbd490 py3k
+82316 a9ced423dace75a2732a58103ca0f81d90c8270f py3k
+82317 47e29a5c3ddfff250de363c5319dc594af964dfa legacy-trunk
+82318 3bdcdecea5610e26f7534fa962166fa9d89c7291 py3k
+82320 b07b2c954a8077f4c9ad3fc489314ed8574f2ca1 py3k
+82321 d7e3423c9da8201bb4b2ad3e23e924430ad03ae3 py3k
+82322 e42be6e6ac2d73642d3f02a9f3a1fefdd9c17320 legacy-trunk
+82323 fd1a11293e62e1cb4bc20179b846499d940d5ace release26-maint
+82324 9f0188e4f81a88627094fe1ba3e63b8e498fa230 legacy-trunk
+82325 2003b70a9baddb6510e8fe9914b4a9dd11520201 release26-maint
+82326 eac64a4610f12262b6b55b143b48daf47e308f16 py3k
+82327 b8d365da1798941b753125ed2bb58f951c3a2e4b release31-maint
+82328 28f9a000a379d4c5e108af598f1103e8fbdf0515 py3k
+82329 3cd16ac51877153eb2fd8651ced5136f10bfb604 release31-maint
+82330 c0a49b6a6fb11d88068096a89de9d88095bcd859 legacy-trunk
+82331 f816b991e5b31ca7721e8c2710e945d37de39af2 py3k
+82332 8827617a07dc91f6e2d643685d722c9456b6db24 legacy-trunk
+82333 d71411a0a47316aeb38c1ec9a8d140367cf6f018 py3k
+82334 2dcf47b5943f4ee4f5d93169b6110e1ec54a6a43 legacy-trunk
+82335 37ce5adae8b9b88e974a5d9a986c9cb0d95cdcf0 release26-maint
+82336 746579a9ead705ce7fcddad588c53a1ad73a06d0 py3k
+82337 25b7221dda691bc5ab34e5aae955e714f9edf1e0 release31-maint
+82338 3cb3ce7dcab850f8f15cdb7dffbe257ac5c07c00 legacy-trunk
+82340 02904c6ee502976113d2a6a945134e87a6c39f44 legacy-trunk
+82341 2520b818da052193d8fa0f7350a86ca43035777d legacy-trunk
+82342 c8bdb32b04aaacaab2c999dd25b7184676163781 py3k
+82343 68b670f3614e90b41ddfbba7dc128d5955802495 py3k
+82344 ce0325276d2afaf240381b22d4279612dc90eb39 release31-maint
+82345 9ca9524d3e578a41ad5842b2d52c967e04383758 legacy-trunk
+82346 69f6d213028124c730995f7eb9c575143936fcb2 py3k
+82347 b817e716516edf03bf8635d764615279db80aad8 py3k
+82349 95f8b25e53ce09e4ee8131db3b58513f574458b8 py3k
+82351 2cf4ca1ed6d6cd6f3aedd06da785f773e90fc06b py3k
+82352 acd8648865aac5e1f3ce7687cdb65af3968740a2 release31-maint
+82354 dfbdb98c92e7f1b7f3f6d773c6be5a7ed162bbdb py3k
+82355 0e16ddd441578ebdfccd79101f5ea5d2012485aa release31-maint
+82356 2a8c68ba000ba4f2075d9f693dc8971081566469 legacy-trunk
+82357 ebfb6bc082d92ed9a4994c014793da759835718c py3k
+82358 a4e1c56be532ce58f550afcdd4b0dacfafab51c8 py3k
+82359 2f9051fe6ad9c651520f4a1a6e32fd43ad3c91e3 py3k
+82360 fe44828ea7edde1deb5769149f5419edd6e297f3 py3k
+82361 c51929233e19549f1040213e1ed5769242ae6987 release26-maint
+82363 14f94c01a002a581197d3e8894cc18fcc5de009f legacy-trunk
+82364 f7b54352771d2cfbb7c208496dff15ec5597e3ff release26-maint
+82365 b72c33f496ac8e1d757730695e929862208fd638 py3k
+82367 7199ff386f9ec7cf2c9abbcaa8602b7c10827ef6 legacy-trunk
+82368 2f8d17626cdff44d5cca01e83a6bb305c8a5788f legacy-trunk
+82369 17f17dc6d48bc4eb9f80aa04516a64472ef82203 release26-maint
+82370 07131f08c3de195c0383591c345b4aa323ee1c0b py3k
+82371 2964243748361656d9010686703586bc94a6f0bf py3k
+82373 9e291ac07c5bcf57250f53ed45c6fa90e36fc45f py3k
+82374 0fe97932642e77ba7e42d4359da731e7739023b0 release31-maint
+82375 5072590b4dfdc4f03e702e053e3d1c679ddc7a8a py3k
+82376 290bd0c150a6458d8172a1409197ef1498bf568e py3k
+82377 158166ef6f06d014fde08995dfae7c7f855622e7 py3k
+82378 a92ac75701183aa15fe294668a24ac28e1501bb1 release31-maint
+82379 b5dfa339499c284414c604756af51b59dd7c7a6d legacy-trunk
+82380 b88da4f77f686c75d341110704ff2a4d364c140d release26-maint
+82381 fcae959a2fab52f406e7e721b5cda6f46ebe3b95 py3k
+82382 321edba5f795bf6a00fed6a6b615bfc8e275e45d release31-maint
+82383 25fbf023102d9b90c67e48a42c4e46f16b011676 py3k
+82384 e6bb990ac9f6870204bcc6021028bfa76a6bc2d8 py3k
+82386 4fce25abfdd82fbd051bb124c6079d8b3863a606 py3k
+82387 16d88eca3c33a19df25dd65f322db20a218f61ba py3k
+82389 d34ce0de941ca89a4c33d593c551fbe86c9ef0d2 release31-maint
+82390 e6f1b3d1040a475a0476521babf15ee4289b3348 release31-maint
+82391 2bc54da4b82c1ab4c29e470d72a6ff689bbfbe6a py3k
+82392 30843be2e11a26c3451e16014c3a7541b8956f8d py3k
+82393 043ef04f64d22c7b6998834dba6013ef2c643a39 py3k
+82394 30e1d8d08105780f33f2ac4fbf1ba73adcaa99c0 py3k
+82399 9dcc93fe75282edf8d2d82f7a48119b571cd5aae legacy-trunk
+82400 c5afe95527793c828846b386ae4083f0e92a9eb0 legacy-trunk
+82401 9f5430e4777007e3e73cb505e72c54654dc3b8a8 release26-maint
+82402 01c9581c7e3f494dc0f0323cc1057eb8bc09d1bb py3k
+82403 e9c8a96584d434e10623cf4e30c1b9f0bfe84b07 legacy-trunk
+82404 76bc255d29fdf4e3be70e06877fd05e38275bb1d legacy-trunk
+82405 db6fd405e594fd6c3298263450371f159a8fa861 py3k
+82406 816cd858d331a8d5066439cc6ee8739ae9701f3d release26-maint
+82407 3e878e269b09ee5b1d0461aed4f4f7cc48a738b0 py3k
+82408 3a93a06e5e30cdfa894b757efefb37d7727acab6 release31-maint
+82409 b04616be7f14d7060447f033d486634d244d9950 legacy-trunk
+82410 ce81422ee35b31058e8804fcceda8595dea97773 py3k
+82413 e0d5a4a49112a28e11d07997897a0741618522b8 py3k
+82415 8b8f369941c1edb428906d5279bfe3346cc3f0f8 legacy-trunk
+82416 3185b055f93766d2acf4fb83ea871b054e9c6f8a py3k
+82417 a89a3d92f8aeadfb825c54366dc92f3a95492e74 py3k
+82418 a9a267a81dac423ad58bd645a0e0dad3beed26d7 release26-maint
+82420 c53e135a08b690a9045727ec3977b5d00da20955 legacy-trunk
+82421 a92719b49e5ebae85f03bb7a3a9aa7c75ff08401 release26-maint
+82422 fa11d2b4f98a2eeb1161e67f38bdee7a9070b463 py3k
+82423 13c06a6f467676e6dd930e35ac88289e4b4db830 release31-maint
+82429 43f06ca36ab30d168a0cf07dbaeb436deea093f1 legacy-trunk
+82430 fe9553a6f798d7119386be66e92d5fb440f8d2cd py3k
+82431 6d0dedb3a24ec0767447e1b999bbe1fbb43266c1 release26-maint
+82433 ba9cf0df21b0099072f1a3ac80743fe9be6bd0ed legacy-trunk
+82434 fef6348c2dd6cf21b5137f18a975e2631f7e778c py3k
+82437 4b0c88275f3b64258539441184e9c3669af989f4 py3k
+82438 35370d7236c9c6ae62b642050588d82a098c76cf py3k
+82439 1786628ea6ff6410db903ef24ef124ed5866e79a legacy-trunk
+82440 e17b1cb1b61c9cc63f60fc1ec9c09c4a7007b285 py3k
+82441 f430a89196c9afef3def78a2975d3a92e241e958 legacy-trunk
+82442 3304dc56dda4407f8cc65288708d889afb67a475 py3k
+82443 b3bfabc0447c518a7f8b6b53ee803e91ab02ad23 py3k
+82444 36abd7554bad8cca276736ddf4f4c3b61d5e242d release26-maint
+82445 8a689f297970c95c4069ca9f9106af6e26997938 release31-maint
+82446 ef6798a99ead2eb67033a9787b83f298f3444b56 legacy-trunk
+82447 b540a612f6017015ebc595e60e344afea9c70ba7 legacy-trunk
+82448 7f1496e41124738def4a678ffbf6eac1ab6d6d35 py3k
+82449 e834c5d3a9a33e304586f091b119a19058bb5db7 release26-maint
+82450 aec422111cdea35737f09b9cf03f301b07a6f8a0 release31-maint
+82451 f1ba4e6d6c123173421dfc30a8a9a700b3699a89 release26-maint
+82452 61ad6894ed6aa76c0a3997c85e9da8a97715f5b0 py3k
+82453 cb7800c649123cc7430ae312aa662fb5a59faf6d release31-maint
+82455 de16a915bd2ac7d587d20c33706a16658c350204 legacy-trunk
+82456 529b2175339bf0615779ff2cb84e7c39707a388c py3k
+82457 43c04711aacbcbab524adecfea84dcdc55932903 legacy-trunk
+82458 31443cf4def2f2c1b564c4b7e816d4eb4896ee88 release26-maint
+82459 fa16acb2ffdd6185a63adbdd9bcf137ac672e6de legacy-trunk
+82460 c72fd8a2ae01d066b0fa8e8cdccbfafca71a34b6 release26-maint
+82461 1eb36f169c9728ffc703739f40ba4b4c6f6bf6c8 legacy-trunk
+82462 d3fa199b4a17466d9d356eaa6e52ebd4ec38f398 py3k
+82463 8bf6d8beafe1d54e8c7013f663e8c8766ec59621 release31-maint
+82464 f271e1d0e9c4424954b1c8f76a4b7bd7c2a4f6ae py3k
+82465 d831fc0c26342c33cd753b4024c15a776498f350 py3k
+82466 b8b11d43494061d42f4f6a1910bbb6b8639f8cdc legacy-trunk
+82467 b0be89f70ff9b76edc0db41ca208d91cf6f70b36 py3k
+82468 9900a998b460ced00c5f242d28d2a8e3de9a671c py3k
+82469 9dc5f385f4942c4795dcd4ec06ae7c3c162119eb release31-maint
+82470 4de13feaea01805e1481c81506dab73b523fa1ba release26-maint
+82471 ebe1b3ff8d30218185a457eb0123975375aba464 py3k
+82472 61cb9410a8424b508513719a42fc2ae4cd021b8e py3k
+82473 4d3b4f34192b239e87d8ba07736620156829cc41 legacy-trunk
+82474 32396e80048f9a8706b16ae61bd829d89d319f06 legacy-trunk
+82475 69756cdf537b4fa37dca9d7c8f0f39938a248e0b legacy-trunk
+82476 8e20ffc6198673caafdc7201ab9bff680956fa97 legacy-trunk
+82477 cc4bd766fe109a5721d651aae3656707b39220eb release26-maint
+82478 c5855dddf0e1fabae981a75ed4a93465092b899c py3k
+82479 5613d2e1d779527eab8c4e8ed7a268d2e084b0ce release31-maint
+82480 aae7381ac0b2d0a5c498eb52e33d7c97434271c6 py3k
+82481 d97c245233210c79bb64997bde91ab478c986683 py3k
+82482 2aab957bf61fec65aacbade5a5e7ff6e209db0e8 legacy-trunk
+82483 6cfe7b904649a073c20c83646c044fdfdb56177b legacy-trunk
+82484 5d834fcdf980cdfa1fad04bbec13be348935f8df py3k
+82485 233c8dab8ffa9f710529b0671fa50efefd56430d py3k
+82486 ac823e716d5717e8ccc0e102f167a3db8674cf17 release26-maint
+82487 bb211a2ddabd5f0b862cb8ce2bf7584d5a0ff405 py3k
+82488 55edf79ad8277f399c47d09e31453e62e47f6327 py3k
+82489 d35f8e5b4197a8d7a1504ff474df2f9e8d151301 legacy-trunk
+82490 40f19b0bfa61a56b4140d1cf65ac02eb6cc7d105 legacy-trunk
+82491 6acb25356d2f1a69df14481d4f4d855a1994927e legacy-trunk
+82492 be8e1a6ebf7abe75a3814c42d32903b89becf886 legacy-trunk
+82493 4ca5d0aea41d3609cf466bfe8359112fff25a763 legacy-trunk
+82494 8bb93288db6d68e9c18a85cab95edb2e03d152b5 release26-maint
+82495 29116b2fcffe928137164e275858fb3c6906ddd7 py3k
+82496 7184421f83b564fab59fe2fb30b422766aa02c40 release31-maint
+82497 b3b912d453a582e41dfffe71a914e1cfde7bb4f7 legacy-trunk
+82498 99c84a51f5765bbebbff7508fafc5f4e01a540ae legacy-trunk
+82499 2d5f5150dce24da7cb686beccee02b2975583a07 legacy-trunk
+82500 80c8b4341312a339a00f37631c3855007878d7cd legacy-trunk
+82501 54fdcc0f4bacf37484dbbccf2d7aeec2bc82a718 legacy-trunk
+82502 2145593d108de62ebf770987a4ac2a57d268c9d1 legacy-trunk
+82503 7f7d823402c69ae6232ae26093cd482a4f357f3b release27-maint
+82504 3f46f8a9db549519339fb9d598b4bb0fcfdabd23 legacy-trunk
+82506 76d90843dba613c501381f5635b5aed6af441df6 release27-maint
+82507 36d01c017b9beef917f5bbe48078512e0e7f48d0 py3k
+82508 194b6e62be950d0cc98ea5cba5ec23656d050b31 release27-maint
+82510 262529d1c315cd19e9d65d1041dbe7e42dc9f98a py3k
+82511 2aee829edfe280228bcf98a9bdfe3a2de1b9b9d6 release31-maint
+82512 d76d0eeb23cab843abc637aa9423af0f4ff21c66 release31-maint
+82513 976aa4a8bcf307abb52ec00e3312c9a2b12be88d release27-maint
+82514 e42baf678d1440062022aae98e86d763f2e9aa4e py3k
+82515 fe46a8dbaf68ca744df6aad9166c93e58a66f319 py3k
+82516 178455a2f1aa5bbd9600a0af1f65b29ecd02fd8f py3k
+82517 31a6854f78139919f921e4bc866a89384eea724d py3k
+82518 34d827249ce0bc298fb9e3d2c0c82cf7a5badc17 py3k
+82519 fa71512a74f914d69760e9037b80fb1adfbc346f py3k
+82520 6c3c543ede8c497eeef4f72c0e7c00b2a93df947 py3k
+82521 2674d3bddb181e8e33c67c0c75aba765f5cd2f88 py3k
+82522 34f015bca54edb3339164f763767c6a0a48fbd19 py3k
+82523 32682b253ffc817e16da9a6e1215af3afec801cb py3k
+82524 4c30a6f40e684e6385383d97fe7cb5dfdfd4f12e py3k
+82526 4b934803cd341424314dad870c2f8fc0d86f6235 py3k
+82527 13557594e20b7ad0864749101bccf8c3752ae486 py3k
+82528 b67f720998a8801a8ad8b74cbaa83e2afb0781d5 release31-maint
+82529 0f6548a86768b328106321b884893ced36840a2f release27-maint
+82532 ecd71b6127e42678dc1a2b1f571f641ced0a28c3 release27-maint
+82533 343903118cb5bb671e169c451bec499c6fa50e75 py3k
+82534 124a76ae7a70e7570d9423ed7a65f6d4949b9c4f release26-maint
+82535 f0691b4a383b82aee853a13af739964fae85dc38 py3k
+82536 3fce6cdb47337711695383193b474df94ec7a8c5 release31-maint
+82537 1eaf4bbe4b1c1c18b91cece9d99c4668ba4f3d8b py3k
+82538 61caceccf80581353b84d73c0daa109916a1abe1 py3k
+82539 18282039c5c9c006dc5fd5f3f0621fa110b31d96 release31-maint
+82540 9393261996cee230c65285add7e30fa5f7a906c6 py3k
+82541 9e354ea382cce7cb00cef5be2bede0cf99c39f31 py3k
+82542 767b4c57aea4d9bd7a40f6ff3a9c56a8c096d6d8 py3k
+82543 383039ef26a0e09e5160f6a9484c27ed190342b5 release27-maint
+82544 3ae913a9cda90ea3e25d979d27544f9241661f06 release31-maint
+82545 a63f6baba6b54de98788934cd38fd1d110ef291c release27-maint
+82546 be662d1243859ed437c0869b66d3b7979abf81c9 release26-maint
+82547 361431c4d344c44acf6e6edce07e2004760bf558 py3k
+82548 7ce6e364e1183067e7ca8379fad2681f463a92ca release27-maint
+82549 3b15486608f05becd14c76054c5d99ba4548268a release31-maint
+82550 b0743d52b6a317b291f753d5ebb7357ac1d852f6 py3k
+82551 343cf5a08ff00f07237c19095f34b194e76c42c2 py3k
+82552 c6f16b8cb858db958b184bd6d4522210a7fa056b py3k
+82553 d2830091237cea3cc235a6d051fe032c310140ec py3k
+82554 692b7989cd920369050e75bb6ad0b55b3cbececd release31-maint
+82555 fb360c07905976b1d0e776fcc6d69a62917482b4 py3k
+82556 3aa22428582a38a271b9eaee6c34a1c327e1ff00 release31-maint
+82557 837e3cd3d0834633deb19ff3eda9e6161bf5f1e9 py3k
+82558 d880c114317567bc899cee684e8b357afb3fde19 py3k
+82559 c1a23a540a29df626c8d547f8a810c948d16a51f py3k
+82560 fe5217a8affbdc0f4ac768074d9aaf2cb66e9128 py3k
+82561 46abde071fffce0132cd3c8779cb09f6ec0d2a5e py3k
+82563 a1c456317b7c3a2368e6e82b3a1d77ed0ec31f02 release27-maint
+82567 7ffd2a44942cf656278d04fd9d267b1ef749ae67 py3k
+82570 dcc2e8bf64cff61fdbc987765926a4a566a53f37 py3k
+82571 01450120c0dd18d487b1d3b4d5d8d42308fa6539 release27-maint
+82572 e1f48eb014c7046aee16ff9ce0cd56f706814282 release31-maint
+82573 cf4f7f98f19e72bc1cb6f1ecb8414a1177d9d8f7 py3k
+82574 e84d5164414460a36fff780c27f7324859612b67 release27-maint
+82575 c81fc1ffe946703c791efbfc0fd1ec0cc3c96f00 release31-maint
+82576 726483d97b5c0936f80fefcd867203f95d27cf67 py3k
+82577 a7c8b4a6678bf1021300ea706d3f891042cb1777 py3k
+82578 36d5e2f5d60043954a155d046e31972ae55f9adc py3k
+82579 8ed7d111b2c97fed60e6ac42841fe0523dd25476 release31-maint
+82581 705869d1bdf0fda211f099c1d4259652f4ad3f50 release27-maint
+82585 4001d458f0b20cc7f3a14dbd8ceac9c37e08b783 py3k
+82586 ee9ee2f9feb9ccfc0b67bb16f10f1c27c0289808 release27-maint
+82587 9d5fe9361de21de68cbff37b963c2ab923c8e6e3 py3k
+82588 680bf6b8ab8240a96eee9b43c4f1e0f3557b8b17 release27-maint
+82589 6ec5722a07a5f2abe8a76cfd779036e8ec16a8b9 py3k
+82591 b6fee55faa1bbbc8086b6b92f9f78d07a9e4c669 py3k
+82592 3b73fb80807aa1bc2fe0f98d818bea3426deac4f release27-maint
+82593 87cdafe3bd6c70a362cbdf29eee94bd10f412bad py3k
+82594 8bbf24e51ccfaada3d72f90a4fbca46d4ffe2bf4 py3k
+82595 5097b1b496012e1e340f9db660fd5e0fdf93811d py3k
+82596 a07ef5eab90bb25b104e6585daa0f1b76f333943 release27-maint
+82597 4d291ad0789149fc11d016255afaeb9805790b1e py3k
+82598 3dc21907387574e738ac7f23e43ca5c8e1d49a1d release31-maint
+82599 91457b2014e40b6191620e9e751ecb24accbc569 py3k
+82600 870b6b455ef05d1b53a330938f80bc7665593ce5 py3k
+82601 1f2814eb4d1dd1b1a6714338d83fe11a6e734ea3 py3k
+82602 86890446a47bcf5284bdff3a2da191be2610505d release31-maint
+82603 39c7d54f2848c0d1fa2e3008f74be9f5086d9e26 release27-maint
+82604 1f37d082a9aaf8037e03f6b305dc78ed109cbebb py3k
+82607 f1a4147b3c023ccea7c6df8fcc6130a9d3907145 py3k
+82608 2399e0451d0dec86601f34c1fbbce31ee28a0ab7 release27-maint
+82609 d36dc37c67f887063edefa3714c080fcfa96400d release26-maint
+82609 74b0eb765a5049b253e1cc351da8ff39e3082c66 release27-maint
+82609 0728b295f53bd6a3d70f5f5c725a855b8f3af229 py3k
+82610 202f31d40389ce3f659fb156308e82cee003807d py3k
+82611 0618c6231a1f192716599cd602ff4ba00222fe9f py3k-dtoa
+82612 e12aecdc332c787796df29303cff61cf11d75b85 py3k-dtoa
+82613 4fe493d99dcc1c217bcc527b0f363fbc00deddcc release31-maint
+82614 70b0388f9d3f52565a85890caac3fb944e30e2a4 py3k-dtoa
+82615 3ea6f69db242619824b08ba822b7fdee20cd2f91 py3k
+82617 5812dd44807af96517ef2f3af811c1ad4d7c83a3 py3k
+82618 d2b1689a3381ec652d7c4ec8523c9276ab48dfaf release31-maint
+82620 0562f2e0528d12dbd2e254af04d420bfd099864d release27-maint
+82621 43aba09e8946936ed53e2bab82ab68deb98a21b8 release31-maint
+82623 912ab2fb43f58b0129883934abdbf467d0770a1c release27-maint
+82624 f641bd546de4128cd79ce793207d2300b4ef8700 py3k
+82625 e655849e79c6c82a9d497b78c06b0431ab39251f py3k
+82626 87555f45cd6be5867d82d9826694e2a4ebbdc7da py3k
+82628 74b2cbda9bda447f9978381235593991581370d9 py3k
+82629 ccf8e6020cf34b5f5ec88dd5f268b133746af10d py3k
+82630 f6266c459156306c9babd5fd8f32d776c3d10c0a py3k
+82631 e7da968e3e5a0da64bad9ded9f4af5a204688341 release27-maint
+82632 5f3e186bef0f08353b72ad394099a1cb2c4f665e py3k
+82633 34e3dbd47e4fa3ed0b6f654a2ced4139cd7a531c py3k
+82634 946464fd69210d70b4ac5ddf679e279faafb5ee2 release27-maint
+82635 553f10b037d9ee233bd51ac0c83919cc7a5f8c5b release27-maint
+82636 384f73a104e94e10d79e9c193e7fd0e2f2c84884 py3k
+82637 382dcb0c6073a1468bf470b22f72cfe074ee6494 py3k
+82638 55a024f51524bfd037188d61f8aeebbf2321f5a4 release31-maint
+82639 8c6b3dc652fb92322a8d34f6a63541b3e3d32649 release31-maint
+82640 a0082a74d125a2e85f8cd05a53b161066badb556 release27-maint
+82642 040679087d0352b56513ce529423c2920c226619 py3k
+82644 ca05371cff10a2f9d0f2a03b51384484886871a0 py3k
+82645 f845ed1d89d5bb8c030a8a1710cd80b51a2b581b release31-maint
+82646 ca0a3301a7ea1baabaf5c02dc653b27fb89fb34a py3k
+82647 10e6a5430b7944b6bebf153e1d6faa3a405b8090 py3k
+82648 c7305ba846197b935bfeda05d948ec85f62a1196 release27-maint
+82649 d156f7b39c3c34323faf947b9fbf2036f8186571 py3k
+82650 5bc7dbd31d1b4946c395dc6320cd4ea1e630ebc4 py3k
+82651 b044625322e316c6484a53261dfdb3eb4afe0af2 release31-maint
+82652 a6318dafb8eb5c2d819fd70822dbeb5e5ff70fef release27-maint
+82653 3d8a7f701cb1c2537f581a1780a126eff6552d69 release26-maint
+82654 09f5fd013c0be2fe7bb0f49464ae31e726634a97 py3k
+82655 9752b85c01192fe838daed0efaba52706d026c51 release31-maint
+82656 6edc3e2a7da4aadaface4569b0fc7bbb355443b2 release27-maint
+82657 974f8d8bc0d44d15d8b8df53852ebba8ce7d860c release26-maint
+82658 c8becf606a0aac096bf85f496d68b963828674ca release27-maint
+82659 730b728e5aefb56ccfc4e9c2cc934c2ad8638059 py3k
+82661 7a216bc2bed650b9705b688a8c0b68e2743cd6d9 py3k
+82662 3528c4e780bf07b8f902ace75370d767857c0fbf py3k
+82663 e4bda4a520ca75292a17160b5549d3d634030ceb py3k
+82664 ff2d1b2cdc69139f32de784713d1bdf05d28e231 import_unicode
+82665 c67f98adb8f361cb193676c8f51c9156e927ab0c import_unicode
+82666 5b63185372d1f37aa71d6f12bcb3467377cc97c3 import_unicode
+82667 16e348f165f85d34d6eb8b9749542f4dce1effb8 import_unicode
+82668 44bd4ad1f6d42fab2044506448500d237037ed3f import_unicode
+82669 5b6f03f391dafe2460a0a3998583b56297de7311 import_unicode
+82670 e96279ac6d1468a34d1a7f432707538e0b428160 import_unicode
+82671 a97f7503e50c4056fe30ba5f43492520cddc21c8 import_unicode
+82672 60fc9446aa2e035376dfa07113cea6ffd6c931cd import_unicode
+82673 c30d84807c62d095e84dda5fd32750bdaa3eb379 import_unicode
+82674 dfe260231c49c14298ae13b514dae3058f460aaf import_unicode
+82675 0cd9416a1c1e67b7f409e6f333a7db61225db159 import_unicode
+82676 f735bb2b06de18598dc308a194482123b32651af import_unicode
+82677 bebcb6ab09a565b1376de1a70bd859a551af6d2d import_unicode
+82678 c872e4faa1e742391ebe0725fc83336edcb81970 import_unicode
+82679 14da7c3e92232b14c38d7f00f51a7c70c8a2e0db import_unicode
+82680 0952e2df3c4d1b984cc0eddb765d98b22fb28224 import_unicode
+82681 76f36ca1061f44fa5a7b913b692424f37941aee3 import_unicode
+82682 22b9388d7c0ef90a7e6614cee404bf05d59feac0 import_unicode
+82683 e4233e9c846122651dac815be84217640c792c75 import_unicode
+82684 e766f7bcb2d55c34774da32be5cf9b8eca3da361 import_unicode
+82685 5ca41deebd0ffa2eef8630dda7b8fcdd0f4e4f75 import_unicode
+82686 2e9fc532d1d1bd9bc81b05b94990a04139de2c5f import_unicode
+82687 e1d86cf2cfe44be09453f1ea198be0b9182c4efa import_unicode
+82688 e0fb49ec945cca572429467a06895363358be207 import_unicode
+82689 a2c7f2060e5bdbd87cfbafd54779fc59f4b63c85 import_unicode
+82690 1c1fd95e13b42ebefbc2681f031876e2442558e1 import_unicode
+82691 0a30b56ca3ac9de1b15c8a366fd0dc16eeb209ad import_unicode
+82692 360e1a08e53b9480aa5dcb38e099eddbc2963ff2 import_unicode
+82693 60fbfaa7d93dfdb19d4db13f932a2c1d053ec34e import_unicode
+82694 950b4754bbe2abfc0c501bbf1f60b9253a581194 import_unicode
+82695 ffeb85128c7e848331696b6e14b23a4ea7f98ea9 import_unicode
+82696 01e4e3d3774d6045c29923584c08f7e8452284c5 import_unicode
+82697 e81ed3ad069d9ac2e5ea9ccf893a580afd903c80 import_unicode
+82698 1adc23dce9717c4840100ad2e3392e4c6363ba33 import_unicode
+82699 177a82ecff67106abbc4c67565c0f51cbe600253 import_unicode
+82700 82497f1c1c5415283aacbeba03b3aca734f07809 import_unicode
+82701 90ca45d656c2d657055ae567bfd5cb035249f8d9 import_unicode
+82702 30bbc1860fbb2e7bd06669c466ae774874a7fd62 import_unicode
+82703 865d18afda1510993bceb4da206a05426f6c5b87 import_unicode
+82704 7af229ea2e665a9ec1aea6f771c5e0f0dffeeef4 import_unicode
+82705 a29cc3850029f57e72231aa3d36c6b3a9cc848c8 import_unicode
+82706 a421b4b45aa6620f2d1a451f5b1f82f70af68e64 import_unicode
+82707 a7bb84f8498a1f6bc55bcd1c2da3c6e1b055372b import_unicode
+82708 af7ec1691047bcc32a0625708fb12ee3591fb9d8 import_unicode
+82709 68b0e72ef4f221d0b5e6a3bea752a4bcc8966ad8 import_unicode
+82710 8e70a5ec1aca629548e9c27f117305df9c89cee4 import_unicode
+82711 6dca93702e6bd02ddc7eab42ca1b97b81770cfe8 import_unicode
+82712 76c35d8a26a0120d8d0b793824f9d898e0eca3d9 import_unicode
+82713 a7cf903b17dcb1e256f7277ed58e6c5b28bde480 import_unicode
+82714 78e6a6fbd3621bd8f7103497321f485771a29f8c import_unicode
+82715 ab17b0c22ba1d24e054db9394d50cff71b962e0c import_unicode
+82716 095b2972c44f11236c0e29303c237d004ed9c50e import_unicode
+82717 36f6ed0651e1340ebf81e49d50b9220f9f1e4c9a import_unicode
+82718 852e4a75e156904ae47df9bf5bedff6d5c46f175 import_unicode
+82719 f0ef83d913545bde309c4b4a00fdc08134b2cea8 import_unicode
+82720 ecba8fa5c743ee0a23965591689202a589d61370 import_unicode
+82721 8dcf841f1bd405fecbefb046ad4b4253318650b0 import_unicode
+82722 bc0b4c918ddb4a7d3e892ce4984ce7950a0304de import_unicode
+82723 0e782a6e6bb76e3eda76a7ad2fcf08abe5eadf71 py3k
+82724 c7f3617028a839917b512ca5ba57bfb86de8d2d2 py3k
+82725 a2177262f6b7e5a744f742b40db77ed91308cda5 release27-maint
+82726 08eee89af7b99d13a0598df592778e9a962328a3 release26-maint
+82727 8c614bc766b45399f311de0b32eae281806a0a61 release26-maint
+82728 0d1220175f29ed01f00966d5caa6ca9d47c272c3 release26-maint
+82729 8aaaf01fcf03eca441ab84e9f38d3b1e0a0afe6c release26-maint
+82730 f3bfdff2146aa4e10323a50fcc4a97f99ce373b1 py3k
+82731 cfcf6f63e0b4ac05b52a091510e5cd5fea6a1ff5 py3k
+82732 585c70dc1eaa4f7eefbffb1a7fb31d2e07389dc7 release27-maint
+82733 db293fd7528b94c017cdc2c06b55d3737f7a366f release31-maint
+82734 523affd4d4729370907cef359d0c549df1c392b3 release27-maint
+82735 43a0fc184a58174912eaa14ccebfd7af5bff3de2 py3k
+82736 47d49b406203a0f2a97f15e1e068a28f3764054a release27-maint
+82737 e0dedd2dcfa81e011a9671d5d6cfd07c0c4bd70b py3k
+82738 7e94c03bb84e153ec1f11e4a7da0c24730146e4a release27-maint
+82739 10c0630f1c143a56753c3c40f5f00f8ef29c5fd9 py3k
+82740 089fd710dca8849159e3ecc5153ba277af854d53 release26-maint
+82741 7d9ab35e43bc66af9c42d9ed788bded302679a54 py3k
+82742 815ae7f3732beebd1a6e1ca312a6a5eb30f22f14 release27-maint
+82743 5ae7df6c93ed99b4bb157ace86560b3a89d32f63 py3k
+82744 e3f83f56dd3cde936c7d190ff38987f19cb88ade py3k
+82745 e97cdd5c5e4fc9915692b81c66ee3392b40f5b03 py3k
+82746 92a9dc668c9529f018a620b4707bc09ce18616c0 py3k
+82747 d41a31f5bf82f624af219f969a7e56ca53559953 release27-maint
+82748 4eff9c35c54a7bb9854fe1b63134a5ec52e7abfe py3k
+82749 fba9e91e88dcdf0c749346bf66d10414e659ff7d py3k
+82750 c70d50d21f851a6a57140699ef2da9e7bab3cf54 py3k
+82751 de1b9fc3e1e7220f432f607b58a4613faa1e567f release31-maint
+82752 8ea60ae14968f369a29c3422895d695c58517320 release31-maint
+82753 bd19c7178f242c384141f622a3307aca061b17db py3k
+82754 f4781aa82b3750b1d489d60c31b76a49c39e03e2 release31-maint
+82755 5025ba0553b6329eb158d43ec16c258c59f926dd release31-maint
+82756 63613c4f6317f06a05165a3e726f610d35108206 release31-maint
+82757 4d222ee2a1c85476dc0d6ced5f82cf91c0a3f824 py3k
+82758 7b57289ebe0d4ef991f55ff1c97c904383e53cb1 py3k
+82759 983e2c0bf8dcdecda99bf9120761f285a0c3c950 py3k
+82760 35c59d11ae13832793b308b41c74c995e84fa945 py3k
+82761 bcb79e1aa00f7f44d08b6c78567a551382f632f9 py3k
+82762 33de9caf709000022a972bbbbda506b12b03b809 py3k
+82763 254ef5205128ac6d60291b6e29a5d00c53ad653c py3k
+82764 94378470ae1c90783f22e788598718c3d47a80bc py3k
+82765 ff1a8037648c4bc9c548758749507a71a516000a release27-maint
+82766 8be2b9e487187bdc2857bfb82814de85816fb8b1 py3k
+82767 aac092eaf9d182d156bc2d7a200c936fa26ebc17 py3k
+82768 0fbdc3fa024be58e8f1b1d8887ef8d8e8d45b03b release31-maint
+82769 dab286d2ba82ffabc992a2c17d6bc780c9d729a7 release27-maint
+82770 49861dfb27018021115f0a2103e2360c0b2142ac release26-maint
+82771 ed3bc7a96ffb4ba37d3b6039026ea1a762e600a2 py3k
+82772 acd6cccce837b9351610646166e6eda7381eb702 release31-maint
+82773 429d0c7cdb856dc59b23a19beb182c171277abb1 release27-maint
+82774 acef5d6608330098c66f3e1ca86b43e8b9aef4c9 release26-maint
+82775 03f73c46f89c7ca742c89e5ef4b03df9caa31153 release27-maint
+82776 03036afca5491a014497168e2b2a96242e8cee77 release31-maint
+82777 5e60c7db0f510edba316fda9a8fc5bcedf28236e py3k
+82778 28755eb53f389460edb0b2e2a2d4fe6d06262756 release27-maint
+82780 b58b4aa469c4f8178f72efbf2a3e7541fc9ffc5f py3k
+82781 1636124e5ffeeb6cc1122951ab4a333f9fd710c0 release31-maint
+82782 7e09c64d4a64ce0d26471c279d05a486aa4fd04a release27-maint
+82783 f755d1ab80746db6ca50eaf130a693fe46255375 release26-maint
+82784 50f4f113bbc3f731fbf03210d29acb5cc19c5995 py3k
+82785 a99e8adac081dfca25bf38f5c1b0a2b1e34305d5 py3k
+82786 367d61e6a70f068f175b749958bfa5f39f5986d0 release31-maint
+82787 55533d5828b031a6aab62f9e8c8051d5255c8ae6 release27-maint
+82788 f0dd03bf6bc5fc077d7a55013da062504235d020 release26-maint
+82789 5db2e07c4451fc2b3912290e72b04ff6b364aed8 py3k
+82790 ba0f6e17eb223c03bda3a6aebfae7080e1b3f2a8 py3k
+82791 0b071e1efd414f0bd419d85925bbe6f8b7a7bd43 release27-maint
+82792 81d0557df647bff5d6382df4d5fc0b848cae3b79 release31-maint
+82793 f97be580d8c16eb0f9ab61508f6ae914dc3d17a9 release27-maint
+82794 b915162427ab4f6e74976946851e1f9afd2e9d54 release27-maint
+82795 424e3fcfd3ad11e05175454898a02b36890d2879 release31-maint
+82796 ce935e71bd07e518e2c77c419b01800bcf95625c py3k
+82797 4707ede4d14ff14e71b235489150309d2007f83d release26-maint
+82798 c8b77efe8b56e973773eff7c10f2a38b78c0e3e0 py3k
+82799 0e6fbf518853febffd773ce4f00dc330ca00ffda py3k
+82800 edab501f9df8efe1822256a1a4fa52e3f6db5667 release31-maint
+82801 297f2c28f1829339f4a8b1f3c0d08bdc9f917c77 py3k
+82802 d5d512b865a75d3db24582f70a06950ee39bd4f2 release27-maint
+82803 5012ffae18fac6b92cc37ea13f0546d20e5ca46a release27-maint
+82804 90bf0631bfb8ee870dec7db9aaa49d6bba8dd824 py3k
+82805 4cb0e87c07ca36a1f0df159044b58454ca9b2e91 py3k
+82806 612e12631511b224d3b4d18040efa68103706f72 py3k
+82807 d090f6254c453dce7d74dfb08e776c9e2ff56c9e release27-maint
+82808 365eeab4a350260af7e107612a8f2660ffaae319 release31-maint
+82809 fcfa7bbe185eafc0a9b157c629f125a11bd843df release31-maint
+82810 7f5775395d328b0c20df1ca0c417e4a2f5382aef import_unicode
+82811 be13ff3755e9fab71631cc8e8743ebc5496d704f import_unicode
+82812 81f0f0d53d1084e6172ae2603de507ee7856ed12 import_unicode
+82813 d13914ecd370ffbb49812f5efc7b6ba384658f3e import_unicode
+82814 189fa92d15dc597829e75f04db1d986bf36d19ac py3k
+82815 b1438d26c167b8621de8c2289e7041ecba1f251b release27-maint
+82816 a352b9156ceecb278849859903cd0d5e4e5d887f release31-maint
+82817 0f4b7c07d1b37b5211c7c235f1093420ebc6f4bc py3k
+82818 53e7ae8ca039148cd4a125668dd71c28f37c6334 py3k
+82819 eaccf1a1cb903b4dd6823e211f899140a9fcc01f py3k
+82820 4c11e4140ced1fa388d74d6abd94fea088443998 py3k
+82821 06b3891a639534bb4e4352bcc712f1500d871adc py3k
+82822 1cf43c6e6566b3629ff32c3b28747bbb1e7f6bf6 py3k
+82823 1129d4dfeed6fe1d1bfe8c2dc91a7a9adcb01770 release27-maint
+82824 432908d521cefeeb95752dbcf4d698e0f0abf160 release31-maint
+82825 32d8b22b0e7c5e6290d0f4e7cc94707ef5d629bb py3k
+82826 5ca22a1be3cd2168e314a497bfd98a234fb72815 import_unicode
+82827 194384b5380e52438d2abb4aa07360ba574102f7 import_unicode
+82828 4dd9852dae9b3e70eb9941a0afcd34b7d060ef80 py3k
+82829 737519ef162e6ef2766a6ebb146b07d4e6f8406b release31-maint
+82830 ab102a2260383b12dc57394c0556830c8f656408 py3k
+82831 3f37e3ccc13138787ecb87a3671c26e09c9827d1 py3k
+82832 6576fd4c0d2e3118d494d0edf0eb2411447b09f2 py3k
+82833 49b83bfcfa8fbba3ff96d6b536c738d862e8feb1 release31-maint
+82834 849f6e220aa0d2310f8a63326050110bc91c4314 py3k
+82835 30f695ec949bd225538d48a1dcc37ee0be28dd9a py3k
+82836 8e42c7a5dab8d8fb64da10d2a00de1c68bc42256 release31-maint
+82837 f5b18f268f57d8e9602ecef260cd05a1b01de255 py3k
+82838 0bb4dad81614b79f226fd32eff38ca106cffa4cd py3k
+82839 664a20f4a836c7822cdb561950ee9262671454a7 py3k
+82840 7eaba413fda4b8f257602a056f92b15e1ca0c397 release27-maint
+82841 94f529764c3873c651ed45181e80b268bb35e187 release31-maint
+82842 fcd4123aed9346c679ff8e8eae60d764cbb3dcac py3k
+82843 60fdf147032cf15f979691d7b62843334f60d421 py3k
+82844 64caa748a28eac91d5a056ebdebbef9050e183f5 release31-maint
+82845 4ef639f4d8100b4290cd55ac96399111a2ddb675 release27-maint
+82846 1f99823f4fae78a1d75e9c962a7a5bb86011fc44 release31-maint
+82847 5b352133c4521c9e828b32ea39c0bce9a9ad5bb1 release31-maint
+82848 b9eddf3c1e90a1e689a62cc62ebf050b9af4cab6 py3k
+82849 edfd7ea48edb25ed6fc91b840800e113737ef913 py3k
+82850 b5749dd8c421bb1d0824652692caf6afa68bd03c py3k
+82851 daea978a48ae894f76319ace5574825f62aa57f3 release31-maint
+82852 ad51ab8b64bd03e911e172e985239139750a3319 release27-maint
+82853 4fd5ba35df6e5695180d0289ba51822810e8c8a8 release27-maint
+82854 98a4e96f1f67401ce6d9a617d2c34a40c5bb1ac0 release27-maint
+82856 31a3d76f383519fe6b546854ea16c52ba506174e py3k
+82857 2c7579e04ad21455fafefaee42818cf3c89f54a1 py3k
+82858 ef67e7481244775d58de95bbbcd29837750fb805 release31-maint
+82859 aedb53d8c2b8cd54721a9652f269358959d750dc release31-maint
+82860 67edc424e97b82cdef854670696b097102165883 release31-maint
+82861 e607fe15f2d69425f458a6ad94ea59fcfd89fb30 import_unicode
+82862 1e367afefd7e0e994132eb4d12067eaa809f9ccd import_unicode
+82863 a5fb707cabdeebd86e99514d9d670dfe568452c6 import_unicode
+82864 d493a1b4457e9a911f57125d4d919408b595b9d5 import_unicode
+82865 20bb6fd0bd9c35f5b508f561d9b8459ec6eb0e4b import_unicode
+82866 331e37e052cf3bc53b75b80a67316611fa69ec89 import_unicode
+82867 3c9b3844f9788110ce702c4da408df33be516f1f import_unicode
+82868 0916e8585acb2d9e7d92a3894b30c1cb29dc2458 import_unicode
+82869 7f0dabb7fd8dd6126a594dc6e86eb0de27b15753 import_unicode
+82870 5b1b7f5574c001bb8a827cfde044060b526472f6 release27-maint
+82871 8635523ef5c639550a76fc44b3fadb525dbf62ee py3k
+82872 d4f67b8649288a4b508ae25affe4ac03f68b0fd5 py3k
+82873 ad95e23129c76cb26d90b5398a00460e5601f466 py3k
+82874 d30b9dffb86d410753d3ff86af36cb2e6d9e2bfb py3k
+82875 77023292fc614bca954cb817bf0d8fb70aae9649 release27-maint
+82876 18bdc43ce5ed28e5de1f34ac12c1cfe6ed8842fa release27-maint
+82877 7d7e63eb3b53018454dc453beba0af861cf67235 release27-maint
+82878 77dfe2a775d19990c3f3b7cd7a377e0d463aeedd release26-maint
+82879 eb0075e60725b9f1323cca3f93737fc7e7192cf3 py3k
+82880 41360f8039abfb346262e8a4e022df21bc3a8f53 release31-maint
+82881 d74de050c445dbe9eca83a5961c2ae5942b43c51 py3k
+82882 4b456780c8d8af429ad9fc320ae3e58b721fafae release31-maint
+82883 6141cb2e26e1470039bc0b42036322d23c547287 release27-maint
+82884 0f24314010212771963e59fa9a6eacdfe7b3036d release26-maint
+82885 c0e0756e0996634eed5dc9ccab0343805da2e9d4 py3k
+82886 3805ffe8ff38315eb6e222500ede417f6d36498a release31-maint
+82887 6c763d631dba0594767e2cd72f5efcd077e28f70 py3k
+82888 2b68a844145872ffafe51c283396ca6c1c912807 release31-maint
+82889 d4f61b36cce6e6e70027a9ec25e0b271bd67c5e6 release27-maint
+82890 9f1d9aef374c77d999add2dff320cd79333105eb py3k
+82891 0f83ca12075290bb05d364ce20155437708ba8ff release31-maint
+82892 96757c690b05f2df4bce9eb69c71fca4d011a2c2 release27-maint
+82893 c708c946ff3e43e7dccfa90768ff81b8edddd306 release26-maint
+82895 a1f7dea362196b6b1abc4450bc7a740fd48dd038 py3k
+82896 a2973e705057a71c007cc6c53d2f064b6aed9e49 release31-maint
+82897 0b291e2ff00fc91a97e80b5050e66a5abb9dde42 release27-maint
+82898 6333d3a7e5c739e9557179d125063fd9d9680330 release26-maint
+82899 46927810279087a338ac125f4374550e80406793 py3k
+82900 4fe28a491a630893ea5a6c9dba28cbe6a8851757 release31-maint
+82901 c745df9462e677ed812ee86f62b8022370f7e4bd import_unicode
+82902 ad263cc386a542232bb2eedcf3644a11eaaa0148 import_unicode
+82903 fecff04d0ab13b0e89c63b8716aacd52bddb1455 import_unicode
+82904 7cdface1ab09626ed1e4aa6cb6a565f6b93f089e import_unicode
+82905 730c8b907d7dcc8791ef6e3400bb9b6a375a8110 import_unicode
+82906 ff9ddc161ee3d0697ba1c1e98fa628e92fdc8bdf import_unicode
+82907 7b71b6dc7444e0a1ccbc04e35b51e650383db527 import_unicode
+82908 89f97a1213cd9b047584117c828a8cfc4c8e7b93 import_unicode
+82910 2026ea4428899c93a7ee36207ad894ca0eb2b144 py3k
+82912 0b753a3fe4b0e179e45f978e02f1fb46eaba1b29 release31-maint
+82913 5fffac9ac7d6c26956f79d913ca362f2e5decdf0 import_unicode
+82915 1f27a05c6c31d4a13152d3c39f7f759c7d4461aa py3k
+82916 24f7fa2581e6f1d4d2e0fa11d35b2b54d8ac2e42 release31-maint
+82917 e7031983e6fdf3c548537d7c8f9c215f50bf5333 release27-maint
+82918 e2ec5fbc6cf137cc64ca0c3a59b800dd94700a92 py3k
+82919 a0b95377aaad8d6e9bdbe140c34fbdcabe934c87 py3k
+82920 7cbf8c4e272791fd78b1323c3a1dcf04c57d8088 release31-maint
+82921 84ff41794d3f2b48da26e8862eeefde17f933dfa py3k
+82922 3c73010bd0b0cf7f2d825ba9b2d2ee4cbc34540d py3k
+82923 7a00ca4b9592b85a65ee2105d2383e087d9e491a release31-maint
+82924 01711f60fffcfcd421ff119b5e6e22ad63b56eac release27-maint
+82925 4c45a32c3cc998ee522d284c37141d3c2b1b3892 release26-maint
+82926 eaf04a3f451a2dbb01ff46d1d9c0d9d17ac66f44 py3k-cdecimal
+82927 c741a1f2297698b9678fec0e0f05c1eb32b0338d py3k
+82928 fa8f388342878e2698b45c57fc4ddde7c2b90bbd release31-maint
+82929 e05b646d6b98501f8137e8cada3633a07334c97f release27-maint
+82930 b22893be08c71e173f6683866579aa6995cdf0e6 release26-maint
+82931 cf4b833a47de85aec47580044fe5d6eba52d67c2 py3k
+82932 f28330881db44e80523b7408e3fc1ae45eee77dd release31-maint
+82933 905fa57194030ec56b02c29b341e1ae05a2df9ec release27-maint
+82934 2a79b723abdcf952e1239b0d9542091870003827 py3k
+82935 8c440cf90776d2d4738c769a5df5f5549fc97ae0 release27-maint
+82936 9e619f16f66aa424c4f81699425226b56a0e0d5b release31-maint
+82937 3c78b3cfd462cf48abbdb8c4ab0de6b94fdf1b8a py3k
+82938 abf69d402883b7b3de2c3c9a927e8356f24adfc5 release31-maint
+82939 d1d81246b22996e3f56817e6d506519abd83566e release27-maint
+82940 1e21d94e05f4629346ed0def2b36e6db831e6c0f release27-maint
+82941 2683333755f362b6b547a00423bc95fb91a74011 py3k
+82942 68036f2b5ac8d9f538930c502cedab306e86d3f0 release31-maint
+82943 b1dc60b3c7aebc2470b2cb4cd3998f744e973f14 py3k
+82944 db2dcca240694727bb091f94a7b92f05381ad3a9 release31-maint
+82945 19191559ec02c5dfb2fe9d720c1534d6d76f9366 release27-maint
+82946 c16b3f6ac511b62473d79b24c36459f0c7bbd4df release26-maint
+82947 211e318d23efa8f6cda29f2d25258bc01c759fbc py3k
+82948 db3ad6ec0a4b16d97e2c21b313ffe4c917928629 release31-maint
+82949 978683fde82037417d81844520f2d87b1da0ebc7 py3k
+82951 6dc3d22283ff54fc4b61f0fa9d2d4eeec5522589 py3k
+82952 16e862a5b6f26ded987c087a38bee346ab093c1b py3k
+82953 4bf03377584db07649b8de35e6ed26d53a59ea90 release27-maint
+82954 41ab161d47a7bf45dc58b4796176820e2daab541 py3k
+82955 7e451ce90c1a6244a3b4e9b018a69211e091d640 release31-maint
+82956 0d91812f62609687f0b23da3922c51d76bde4a03 release31-maint
+82957 31df6f8e9f1d4d049d9b2b96ae8db87747b96c40 py3k
+82958 67f8f05cd40dc0e261ec2abef0d78b145b63bcf6 py3k
+82959 ccd3e54562fa7a0d653cfe708a18089ea3262701 py3k
+82960 a4dae7e2df7e6663f0d3cfbba3acec853f0b9552 py3k
+82961 4835106ece0c5324a20c6226f61d99c8034d9ffe py3k
+82962 a65c99f94890095b0cca4a30226ee5c37156249c py3k
+82963 bb7fc08f723ec7db7fb1df9ef6368cb786a418eb release31-maint
+82964 2f955bf93037b6d68cbb84b2d4c1386db8342009 py3k
+82965 25216a7e234d6aa385cb3a24fd2a1236904caa4e py3k
+82966 d35782ac21f861f969996dd7dd81e6cb94149c2b py3k
+82967 b7942915480f78ba5396aa94964161290e77c908 py3k
+82968 c90021fd1fbfaffbfbdb4f33d14f475dbe6c3894 release31-maint
+82969 c96a722be1dbc1c4e0d0bb446d07553e34bb2bd2 release27-maint
+82970 b9c989a2fad31377cb259049e37bb4b6ae4c8ced release26-maint
+82971 aa0b56dd14af7b8b5d43ae0f4dc40483d646edbb py3k
+82972 ad66eff9800bbc2cf246726aabdd3cf67bffdbba release31-maint
+82973 354546846c297ae3e13298c9533794d2bd6985d9 release27-maint
+82974 3fdd9b43024c621f12fc2692b8c5c0ceb86ca24c release26-maint
+82975 7f313ed9e88f32439a0e4d3b15c9ea38a1161afb release26-maint
+82977 a1121409f96b20defaa4f47512f19450bee26b41 release27-maint
+82978 73ddb8b2b5747e8c32b3a16d42e5df3b6bb65101 py3k
+82979 5cff058d6ced5c159b1afdfa38923c627455b3ce release31-maint
+82980 3fa605688d035a545b602013bb0c0c16e758211b release27-maint
+82981 e1bc2c8935d20a7e8f702d19e78f230aab2a14e1 release27-maint
+82982 1c66f72f6bc93b1db43c0353ecca4208d30464f3 release26-maint
+82983 f241592ece4ebe5dea93005775089ef69272b9c7 py3k
+82984 742fdf7f654005626fe77c71bfce5b29ecc4633d release26-maint
+82985 872b34cb268851442e41933801fe66439dc6a45c py3k
+82986 b2f1385a235e0d8986e2974dc0ae7349db002b01 py3k-cdecimal
+82987 3337a2955e11927b3dfa7ae88d74a957a9000e1f py3k-cdecimal
+82988 169347f9d4c4f25db07c9fd84fd374971e6c1423 py3k-cdecimal
+82995 9c766cd211db0eaa627a581b101328d08d8da041 py3k
+82997 a14a78692c7a1580ea7995553602f60bc2e7df74 py3k
+82998 c0d8fe25e266ec8661f34f6e979d4674b00524e7 py3k-cdecimal
+82999 1e261cce411645a36b57c87f4848f5fe2be25877 release31-maint
+83000 45ed0cf2c386a6fbc97e606f420436ac2919a0e2 release26-maint
+83001 c1620220a43d28f770082309f845f4e2676524f9 release27-maint
+83005 cbd6f5d24af9061ea2abaaebe2b112c0643bea96 py3k
+83006 9057ea0144617f286410eed28626c6e5837355eb py3k
+83007 75af4a27a070971a03eb4dbc38be7a6bb46b1a1d release27-maint
+83008 d0ba3b8b0d482b11eff96d88dc68235d7db76889 release26-maint
+83009 bfdb5f08c0f81fb52c9edec95fbd0a159abbb494 py3k
+83010 15edd5fbbcae1d3bc18d096759173f5877cd295a release31-maint
+83011 fee4994620fbf9851ac13d8706fc1c1e1cbef180 py3k
+83012 f4eb1c6a34ef430ad0ebeb2f6b1e1e5cb2d6e6b0 release31-maint
+83013 7079c607814caab4c0b183a653c7ba58610d7c50 release27-maint
+83016 5b468687768cd518ab82c67107fe3068b3ca6ea3 py3k
+83017 70925d3c027947f6993698223c84a142b3871987 release31-maint
+83018 2f1a836f0fac1a23f0db519f7c8d195788d72d14 release27-maint
+83025 20e56eccdf5226386ae41cec32edf0468bab2295 py3k
+83026 4b40bf91ebeb326e597848078e054ab8079fa2a0 release31-maint
+83027 bb68e53454b6d64c6d360b32320fc82559e6fbc2 release27-maint
+83030 367529dc34d11f12534f2b3035cb296aeb5fb43e py3k
+83031 e5cdb12768cb4ab9ba940c71cf143931dd30d96f release27-maint
+83032 7b5d1527c0ce8a309065685eeae93feac820ec07 release26-maint
+83033 520bf4d1cb66516b910746ba8b1677056720b660 release31-maint
+83035 4545ff5061b7a7a2243bfc61c3a83a16f0ba147d py3k
+83037 9dbbe6e7b668c15846d7c9fb35a6e04b366dac55 release31-maint
+83045 1f4ed71b68e2246e5dd61ee5af2b8ea3313be6fc release27-maint
+83046 305902b3c1a009fbcde1747a53adefd61775fd53 py3k
+83053 29a3eda899953dc2b31568d0ec6725996160e351 py3k
+83054 ee01f5481c680c90cc3cd16d60f889d7b7962c18 release31-maint
+83059 3e609bf462ff311cc306d08e41658e895ba67463 py3k
+83062 1c441e39dbe46d880f7f17fa16084eb0670f0365 pep-0384
+83063 88520fb45bf2ed4a3b79a63d47dc03f03a654731 pep-0384
+83065 591249d98383ac6341ddbc17639439d887d6cfbe py3k
+83066 16edd4fba6a5c2d6be040f1a96ea22c5c78c7be2 py3k
+83067 2ad8e8ce46c6b8f8e69f369a906349944fdd4655 py3k
+83069 5a698a152f30235d049948354d91aa255d607eb1 release31-maint
+83070 721e728ac060f0a40bd01f9ebc2b6496e7c9b4be release27-maint
+83071 535cab1a8c00496e3cf5873d1f313045a716ed66 release27-maint
+83072 37d84891c671a2d17b45ade4526af948619a6b7e py3k
+83073 8ef957c381fda727091ead0ef4312012f5f1f96c py3k
+83074 faa5f017fea5d89f93b759627e6a42c65aaf7daf release31-maint
+83075 e60fdb348bdc6110ab0ed78e301ce1d0f8649847 py3k
+83076 c483f9497872b6321a9d5abeca82ff39450ee28f release31-maint
+83077 bffd399b764c6dd67d8353938300da82adeb24df release27-maint
+83078 76e079225079c6f5390f3dcd94afc2e6fb10daa6 py3k
+83079 996ee9e038167075e7e135da29518ac9e5bf937f release27-maint
+83080 3a93fd2ebb40cec2bf6a1c56b9af5ccbab7587ac py3k
+83081 c0cf7d7001e2320c2b827b86750925fc4d798f9e release31-maint
+83082 5ce3c06448a78ef46f1efe25aa269007961b2781 release27-maint
+83083 bdc069a1a721b28ad21849232bd5426dda871506 release26-maint
+83084 183c5625e00bdf68d0487f676eb6cbad9203ba0d release31-maint
+83085 1ce84c61f3b13600139a1216a3bf0a96449a3942 release27-maint
+83086 e267ee9760bd14a8b4270e12af982c941fa7a67d release26-maint
+83088 10274a7bc537761fdbf82630e1a369481888a869 py3k
+83089 e6383c81da41ca056b5cf617d19edc9bb3327e1d py3k
+83090 f523b39852e7460cf77d950e6fb486e9728ddd6d py3k
+83091 0483b8e8bc59f17c781b5497b7997af81c3cc61f py3k
+83092 2855d63631929ff5574db3f14d9a3ae49f9dbf97 py3k
+83093 ec42b728264db6cd4d680ff14a0e711d82a8cc9a release31-maint
+83094 2786d62cc79c38a7a0184871582ce51446670ea5 py3k
+83095 764ec9bbf013a1f0110a73e033a7c0e96048fa4a py3k
+83096 8723c1dd1d25c1a84bd9f2e8cd06659130e72344 py3k
+83097 1f8fcbb6396bc69e6c9200b59bf2726afd0a26a0 release31-maint
+83098 97b841b3b0b47bc6922c910c1c06307146836943 release27-maint
+83099 060de060f03ff0b6d96bea7a21d5f212eca8c0a2 py3k
+83100 68619c372ef013f9dbe8da31de3aca41f1372adc py3k
+83101 580c789b785d5d739609711b12fa3757a8017e1a py3k
+83102 383e8463f56c0004b55ca1bbce11261299349869 py3k
+83103 0f2b0f37764246ec142823b6462d2f098776beca py3k
+83104 227dee278638a7f78e2152bc2a705a8f02c31b80 release31-maint
+83105 32facbedfd0ebc4ea362285d462abf2cdf23949d release27-maint
+83106 482717960257a090d130aac28a6a77517631b20f py3k
+83107 e437953425d7054327f76e28f7ea48a8cc55c70b py3k
+83108 af9341324d3d82e18386a80f0afca77450d3b59c py3k
+83109 71f1c0be8aa776548ec3334f84aa600cf3c33dc9 py3k
+83110 db37af07d4c2712084a6facae34eb34cdac74c1f release26-maint
+83111 f9970391eeab28c2a6f1c4e14ea76bc20c5aa990 py3k
+83112 afdb533230659a427a36b2f65b37bce3b1f8f009 py3k
+83113 e773884577a5334b771aca20d57167087e46ef7d release31-maint
+83114 89931c8368574a8b4642e27fc64970a914b55cb6 release27-maint
+83115 4ed60c4bc8b60169bbb43a6ef5204d76e9a3bf5b py3k
+83116 8fa424aecd0db8e6ae7107ee9c65beffcc6c2d5e py3k
+83117 dc2a7c344baafea10ba0d910bcf1114fe6a64fff release27-maint
+83118 935780c62c59577009dad00a5afa1e79f8a6b51d release31-maint
+83119 ed328e672ace1a3d8a7898ba2c6250a7c9609b36 release26-maint
+83120 5aa726414f8f08d46605a5c4cca09f93e2c87b95 py3k
+83121 b0af63aa09eacabe566994b7c4c350db44e371a9 release31-maint
+83122 8072dfd97e1ddf37fd0cdfa99997d3818d07908b release27-maint
+83123 c3866cd91ae00e5ddc23feca72813a1901652b15 release27-maint
+83124 ff6449643142e24cd2d0c50f35e6a601c178c941 release27-maint
+83125 33e4a47a6ad10db553303cc2b338d1718498e884 py3k
+83126 d896f3f94a4df2288f56e607515e033dd2a691d7 release26-maint
+83127 4ccbc29c7f11329a70977dbbd5ab1376b9ac23b6 py3k
+83128 3f245be59339bffb1c8d16c1bc9c4b84f4366106 release26-maint
+83133 ad5f2793f7adf08f65e88051e1b52af09e4f9470 py3k
+83134 f8126367a2deddda26c363e47fe53bef09d23ffc release31-maint
+83135 3e6592581d0f5a82264566bf5f5b0cf1bb8780e3 release27-maint
+83136 5343ea7c1986349b97d6ee7dd6ef06380edcbd7d release26-maint
+83139 a16b5bbdf19b4282a4554d38d6d8c036a43c510d py3k
+83140 9ecba8a1012551a64f995e7aefe5868564e0f4da py3k
+83141 2c56f4ab36f26a4b3c85041cc6f16a857de2dea1 py3k
+83142 2dd299e7a6dbd371599406e9f4dc49067cc2fe44 release27-maint
+83143 ef9b39df59368062b47771fe3fb009d2631bfdbf release31-maint
+83144 b19f8a4929d5b3b8b5496ff838519c2aa244286a release31-maint
+83145 fdb0cfdccf85825f280a835e363c9600845f8a49 release27-maint
+83146 d86c18568e897574a5a12fe0b280f61d6edc5312 release31-maint
+83147 d33ebb3ef0b107d875a2976833e4a1abb28ac8af release26-maint
+83148 904b3a1616f37c38259d83883f3057dcea02c963 release31-maint
+83149 9e303d6715ce89aa66c539079dacb798299b2384 py3k
+83150 9ecbdefc9849ab909a03bc62be9de5efb4bb639e py3k
+83151 513e498b223c2a6d071be29a793f36aee2212ec0 py3k
+83152 10ce04140096884c251a24120ba52a3fd2a54fe6 py3k
+83153 fe8a2ce914ea8cdaac27a58e9edc99b03eae36fc release27-maint
+83154 fdb71d6c18224f810e2c8fbc4c87cf3afb611e63 py3k
+83155 eecc018aac3eddd7bfc809572f4e588eed7bdf4e release27-maint
+83156 55f45e90674d6c055eacffd8b744b8162f2fba1e py3k
+83157 f6b92808b9b34356e4323adc8050a5dd8e6ac759 py3k
+83158 74b16f439e07ba041aeeb43b8da02017532005dc release27-maint
+83159 4d3de16d02cc288ef8cbd8f4df94dde39bfa9a8a release31-maint
+83160 c3be20c390a27098b02be38cb193414d49a8e26f py3k
+83161 2ced1ccd35ea40ec98a1556e4eef02151a7115dc py3k
+83162 6a99d91be0f8bcb8982b19df1b553c867257b316 py3k
+83163 7a41e0c488550c303ff6540e18c84000b8e2760f py3k
+83164 ccb2199c16ba0ee2134bdae09b7664e3b7c2a4b1 release27-maint
+83166 f9a007afd40f372f8deaadeb528c2c952cf3831f py3k
+83168 35c1456234802e1181ec84a47340f8c5b5d27ac6 py3k
+83169 3e9b92cfcacc51f7b444a295e4846650b254602b py3k
+83170 0970577009e05717d0c5c036b78e8c7b013c5be7 py3k
+83171 adefd5c0235dfb34182987ea2e92fb4f6c55173b py3k
+83173 bc03476ce9019b03a257345b57b4e6aff34f067a py3k
+83174 0b84094b15158ce643ad43906bdd343ba98e9464 release27-maint
+83175 3355356f1c74d448ba5e503626ae296cddb4a21c release27-maint
+83176 5522433150e1d98cb15e0a9ad997722305c5f2ff release27-maint
+83177 f9b860ef24bad92129865041a180cf361bce1665 py3k
+83178 e1c3adfa5744df732dbf514452dbcfb9b93e2bfa release31-maint
+83179 dfe0095fcab0f6f5c8cc7cd7471a725d1977a96f release27-maint
+83181 2df733951bab47c3577015012f720c1fc155c771 py3k
+83182 f214ad09c3842d10544602619bdbe893b5a8b772 py3k
+83183 e2d62b5a873011e6d9e6fa1ff7fb09d23aa4e500 py3k
+83184 e918afd350868842d95da029d0b872433e9abd67 py3k
+83185 fd9b421cdbaf55c54c7a154c7d0f918f97f69811 release31-maint
+83186 5b5bcf4b9fb021a6e0121de47b3855ff084435da py3k
+83187 c3f5833db8431cdee3a5b12437e69e4c97c5bfba release27-maint
+83188 685d3918f2a5e1bc94417bfb5997bb5d26f3bf5d py3k
+83189 b5f3f742331867194d008bd04b51d3cc19ed9299 release31-maint
+83190 1cd454da4928b3eca6524ff753aa17429c4d82ae release27-maint
+83191 803250f5c4c268f443be27acf345a5221e8ac47e py3k
+83192 16f5cfb16c6acc296c4ae247550ea357c3816ae6 release27-maint
+83193 43dc129892addba0ae018c72bd71d9f4e8bbaa93 release31-maint
+83194 e4ab0fbbbc9460ecb070d5b3f769a77ac3c29f17 release26-maint
+83195 4a7b395edb69d76ddc1278cf183db29c29a9cdda py3k
+83196 5edce14b62877326f00afdfca434bd24951caaff py3k
+83197 ac7eb6eaef68877cf820aefeaf5836e813c23c16 py3k
+83198 74fd7e80b1be423688a5e664e3a308bd1def0488 release27-maint
+83199 5d45c651348be3b8f2f59bf6218a6f562bc4c48f release26-maint
+83200 315c2b524c59e9596114c45d2ff07f68b689a2ee release26-maint
+83201 306833ef119d1cb5e9cab515a9018959decd60b8 py3k
+83202 bb9eef8d1ac6a4fc58d3f5ad9485ee2a6e22dde8 py3k
+83204 8e8cb168a089f746aa170004d4b3f94ddb68fcf0 release27-maint
+83205 e0bcb9703442dad884e43d971e5c337884eb5a90 release27-maint
+83206 6d31b60372c4837cff1c6d226141668f2d9286df release27-maint
+83207 1743dfeeb9b03d6b7b5984a3a0497d1194e9e2ad release27-maint
+83208 ea3b535136e7f85329e4cfde51387548ba018490 release27-maint
+83209 9bcbc343778f3cdbb9280d2bd0eb8a324e3c2fe5 py3k
+83210 3119c4d7276b15edd61899f8d8eaa210223a3385 release31-maint
+83211 0bb47c51e933f868ee3b4af80663ab97d54f4073 release27-maint
+83212 aa19a7cc1bf352bbde863f9ae1bc6aa4605786bd py3k
+83213 79e376824b388a76b2d72d3461b51149a653d8af py3k
+83214 0132e4ee9e7f241c030c565baa4e69ba599634f2 py3k
+83215 d55d21c396c5cd219bc232459d7e1fc5b3050fd7 py3k
+83216 be6d014df9560a9de5de74d9eb4ad76ca538df7d py3k
+83217 51466d67722e061011bd1262b14dadd1285b9302 py3k
+83218 3d99696689f9b2ad91beb2d0452bd671ad6cd0e0 py3k
+83219 e2e32a869810df8f7c1af156e90ce80ed6e26856 py3k
+83220 e5a2f50fee64e1233a728de657addcfa88437f3a py3k
+83221 071609060f055af9361a5ea37217af3d6baedd52 release27-maint
+83222 52bc19405c0f3323a3d5b5200b92e0f0334fc237 py3k
+83223 054f3279e3cce9560b3956451e02aa5b32883368 py3k
+83224 ee37bcb8f03e722eef9f7ee89847d44c41750c1d py3k
+83225 056436065290f72b5df7d30b70f3f7e0fca02bbf release31-maint
+83226 a27468af5ec2db5ba6434d9c75f46b55574b0b47 py3k
+83227 0540e67d79241f79259fcda13d88e4e2f499e03d py3k
+83229 f6d3bf4faa9a7b5857d83d3b15f0eede21a4070e py3k
+83230 f20ff99a24275f2dfd3025a1d2395e219ebff5eb py3k
+83231 834715faf165a500be961e4c203ac4dcf99f6115 py3k
+83232 c55faf47459e2eb773e74cf3b3bff0c498f63496 py3k
+83234 1250b068f31701d9aaca2c7f3eca8a6e2631663b py3k
+83235 94b3903de1076b2b325675f599d5186e2e437b48 py3k
+83236 91cbb55e20be54fa259bdddbcf944d7cce64840c py3k
+83237 16189b7da3b62f46f7e6b6a6f528ffda3f4e2002 py3k
+83238 f435b7b9869097c7dd367bf006f0e223ed2b4cbc py3k
+83239 29ab536cfef67f29d68a15d117dcf7e0dc741dfe py3k
+83240 902131b319227d818a7e284e171455e95167404c release31-maint
+83241 b75ca25a140bacc7efbe4b3c9eb106a350d79de2 release27-maint
+83242 89d78b667d07be5412056b2a04660a4dad19c466 release26-maint
+83243 4ae0e13e94663eb723edefef815dea939da145ae import_unicode
+83244 9707c855148f68e4dde126bc21561382248a2a56 import_unicode
+83245 8a79caa4f473271ded7bd02cb7da1d7adcd7005d import_unicode
+83246 27c6a9488948fdd5777c366f23a0ddfadff292c4 import_unicode
+83247 a15e10d1cdc0dff78e087475573f7d4759e77fe7 import_unicode
+83248 9a74c75dd82525fb1a43ffe05d0ac3c644cc63a9 import_unicode
+83249 ed090116b734f7c37e206b9ac856deaf6268719c import_unicode
+83250 6219959109392e0e595313ff02e210b3d0018e3f import_unicode
+83251 098356f5c8461d34dbe17a941a2c714b02ebef58 release27-maint
+83252 326b15d8c341365875394a97ed8c9616852080b6 import_unicode
+83253 de3fff4272c84b8f4024cac5f9e73399d5d9d138 import_unicode
+83254 807beefad51c4be567d3acfebd4c53ee7c58e9a7 import_unicode
+83255 06338157b4f7083e0b8dd37470564db4fb41e33c import_unicode
+83256 04e4925e5a8cd6ca910d31a822840d56ecfee65b import_unicode
+83257 dc5da02136e98982c02c8e50b566c5d36776a8f1 import_unicode
+83258 a4e0b7af4ba44b02057ed84103006daaac57efa2 import_unicode
+83259 a966c3d43a7eaa611240e9f8c516c816b52f42df py3k
+83260 cb18bc8dd4693a84cff4da9e7fc8b81336fc75eb py3k
+83261 0a1748e13de96dc557c5eadc017328443e1c3599 py3k
+83262 0f6a1e476d310caef043025a348e6ef8873e2a37 py3k
+83263 48557db0eeea18f8925371d5a454520746b3155f py3k
+83264 24975aad426809a8b04c2c77ecec5220d4e6abf9 py3k
+83265 7111b797ec115fc34a4cfbe9d5ddf824150b94bf py3k
+83266 c5bfe1860a5d80e0dedf7f23c37b78790279e598 py3k
+83267 294123aed46b6510de3e6897f51c7ee34a36d1fe release27-maint
+83268 9704b9d810e5b71eb759468ce8a8961ce44338fc py3k
+83269 840633d372bcdaeaeb2d82a0ce480954ae9a732c py3k
+83270 efd97a0393749a5f5e886c5e7dd5ba735e22c386 py3k
+83271 0376e6435f57c12d45e168053bb6112dfc3148bd py3k
+83272 1c5f60f381b264acd6f7144f07763687cd531b04 py3k
+83274 ad98b525b587c66ad6afbe622126cb46dac208ed py3k
+83275 40d6a7c15836a2f16742a0e4f5b65e9a2c2e6874 py3k
+83276 a1e2af6537dfff2241d0434c6a64653baddfe07e release27-maint
+83277 4380fb226b112705bf5ed53d316cf728ae077409 py3k
+83278 579b339ab15f566bb5e44ffba00d518993f69f9e release31-maint
+83279 298c969f565b965bf7c1bb1d9ab0736685acc667 release27-maint
+83281 a7cc08b4ba269d9a74a8a48ba1cb7ddc28301970 py3k
+83282 abbb49ad1fc333069e242558ee2abadb0dc82d31 release27-maint
+83283 381180a8f44712bc134405d61ed241db0bf76697 py3k
+83284 934b090dfec80ed4b7ce4b6b0a7174f8fafcc1a4 py3k
+83285 fe4bb7cb1fe87b2c102fff1b27dfecb52027a350 py3k
+83286 2c9a8e6112b399201168541bceea55da5e576bab py3k
+83287 46d2ec78ef79576ca5b9c63574c813b559290864 py3k
+83288 bcf93e3766e8e403be30a18757507d95bf99972b py3k
+83289 78a3db2f7e0f1710ee91b92bba62a5c1cfab0565 py3k
+83290 20cc9317969586d9fdbd010486fd5ac4693fab05 import_unicode
+83291 c3b673b946123f93532a02b954007c18339ad91a py3k
+83292 b803cc2d6a5cbf77d1a4ac7c07d70bb224f49654 py3k
+83293 670d4cbf1464522ab5406efc1610703d7007c9e2 py3k
+83294 7871aaf111a25d29901694c1b85b7ed3f2617ccf py3k
+83295 1002c3dc90d1a5a7b2920765d47af2628d1e3e2b import_unicode
+83296 467019588fcc7b236dd3eff96dd7929db1262a76 py3k
+83297 08b943a1a9344d3c80c062434030b5f3ede89d3d import_unicode
+83298 c7dc5c7b7af195f74c666a6060407244a9ea5b7c import_unicode
+83299 3e74873f21ea59a3be237492e2571aacc0394bcf import_unicode
+83300 8cf6d26449757f24e79da5bb4dcf0249b0c62df0 import_unicode
+83301 65ee0bc97475f132d5f671a6e40945e09a4799a6 import_unicode
+83302 d6ebedcd6ec4e8e5485f01da66b8d750780337dd import_unicode
+83303 5105c12c31b27d9b2879228492d54562f41efc73 import_unicode
+83304 882fd855f102b4392ef13d9f40f688319504e5a0 import_unicode
+83305 88adb64a7afd9be7be2c6c12744e0125020174c9 import_unicode
+83306 004961801d18656266ac5c57be2307314659b1cb release27-maint
+83307 845cef2eb1d7c7e731c652b5191f9dd281da17e7 py3k
+83308 7c4a77604027732f600476f835f4e2ab6715484c py3k
+83312 661e4bf85c5885d2dc020b6a08ab74c7f25b311c release31-maint
+83313 c2ea05161c93097c420f4d5d08b284a4bcc2d3d1 py3k
+83314 5894590e9c8d5fabbbb70b2a0664927a3254d8c9 release26-maint
+83315 c3b1362665388ac9e008d9dd3262870dd9852bd6 py3k
+83316 32d94f316da9847ffe26b4cb22743cc253f23c45 py3k
+83317 7aa9757772023db144643cddd486fbbb45503e13 py3k
+83318 6b23aa3000321d79cd199ad6e7c18a79e4b7036a py3k
+83319 e17b1600f4406b6ee19f02ecdcc08f4ab88a276d py3k
+83320 550b38caf5c1fc7bfaa0001be6748d39a4d89040 py3k
+83321 8b42693e95b8c3783b529abb98b3c5f1c877d1d9 py3k
+83322 f574a071886dd7c4ac4eb84d6f2e3eb4abe97d20 py3k
+83323 790353becf8cecb9c5512b4e6a1270f873c67582 py3k
+83324 57ea00516edea9561931494a9b204240f5f2f317 py3k
+83325 6f8defd017d736e70532a1e05e5b1b9ea0a54d39 py3k
+83326 6e13ead389560488112e6cb1aa3de05a3802ccf0 py3k
+83327 a45b38dcdf16ca0067daf296882fd22fad1c2a16 py3k
+83328 74551c0b513b6c983208bbbbaec3a2911a6babdd py3k
+83329 fb6a13807ac95ae31ab55990e5e05193edec5d2e py3k
+83330 fc815f3b2781274c8f8f9af154a914b89e899616 release31-maint
+83332 1b50e627c63ace5f02388da029b1046d76ca4860 import_unicode
+83333 19ff360327e783821abea1f968ade012ba63ead5 import_unicode
+83335 043caac6c8759313a8bf374d26fb28420f7786eb py3k
+83336 29e60ce63ae5be06e1e7e3a860d8139c94aaca16 py3k
+83337 e486d19f2b0b81c3b90629de4549998e4754351a py3k
+83338 8a801a3aca3499a1aa0c24128419d930adc8e9b2 py3k
+83339 43d14bbd6eb117842b7bf1f673b74cdcd9f2c299 py3k
+83340 ded58e449da332e6f561f3ab46ce0d21ba3fdac4 import_unicode
+83341 125f54a70ab8fbe8fff5289b7a75a25607d19239 py3k
+83342 5947b1bb0fecdc17e513fc7d4e8d3c2762955db7 py3k
+83343 b37b7834757492d009b99cf0ca4d42d2153d7fac py3k
+83345 fce78a208db270b03cc89554859831762fef4963 py3k
+83348 09ca46490707ef9de43e5cd509d3de94d7fba94c py3k
+83349 a6b718e814480cfc6b31e3ad23f0b684dea1ea38 py3k
+83350 c55876a6fa3cc000a93aefeddb6e36f5c0270498 py3k
+83351 b12dda62e93bb94ac0a3e080c44b4638b5ed89fc py3k
+83352 e01d26a346899c8ac579e49099d7ab2be9bd71be py3k
+83353 4da3c570343bb11e09b516a3ab134fa800f078ac py3k
+83354 25f6d570e7c1612613f7f21806344a413b231a09 release27-maint
+83355 be61c808b52896f2e2abf85acb97fdf2a629501d py3k
+83356 e250e88524d5b09b2dcbe2021c335792e7b63a21 py3k
+83357 8bdbd32c2ebbdd6a02bbcd1e237fa0267d32d2ce py3k
+83358 f9cc09dacedadd4c52b91da260f30e72ffb3a2f9 py3k
+83359 ab89d0f52a7f30b7b609e74f960784967fa7d6e6 py3k
+83360 9eb4ba45a6b286b6c5612c52e54a102096415622 py3k
+83361 e237b15c2be99424362c5a9451573078598ed898 py3k
+83362 6ec668622d64d9ca303fe055da92c8e382391efc py3k
+83363 6eeed352663427478052a714e33187a27a47bd4a import_unicode
+83364 b24841c309be54681511ca4730c49966961b8c7b import_unicode
+83365 18b2734f7f38cc5eeb296e070d499ae30b4ea991 release27-maint
+83366 263fada2565da233c21d64d5c85c7d47a88ba60e py3k
+83367 26565ebd5e32ee7d4165590a2102fe2f317439b8 import_unicode
+83368 6f5ba71316e7161b77fffefc397bce31a71a2756 py3k
+83369 af692ee90f6838056e8ff9c92eb14739b1b8a352 py3k
+83370 28f37a2b444bf354c7ae74c729f0e041721abdca py3k
+83371 e2a9f633d6126faffc74229f5c5313f04df77fb5 py3k
+83372 1ce9d4fb13c26520209ba7ab7393f49cd3686337 py3k
+83373 65af7be614a4818c8f44a33a8b392c4972b1277b py3k
+83374 5b24d1e182699d11fa8385339724d6393cf44187 py3k
+83375 21d8c42c0b107800968d0ccae598ebaf2133832d py3k
+83376 2812bfd84b5000a5ac57fe23e3399920a8d63deb py3k
+83377 387043d2080b53fd83a197921623c7867a5ffd43 release26-maint
+83379 f29c319ff5679a3f641e488f16915d69119c19fa release26-maint
+83380 4603a5c4675a432025550887939bf06bd4d51378 py3k
+83381 e80577d56a8fc483d02bdd42ed98c7f8fd702995 release27-maint
+83382 dcb16d7036538a1d37e00a82a1701b461448fca9 release26-maint
+83383 edda7596c8312795fb295c131f772ce095133fc3 release31-maint
+83384 78bcaff0dd2b02acbbb7bc18a6fc571c8876d270 py3k
+83385 dad085c8de099b1b697502d229e92acdb8c07d27 py3k
+83386 6de70d49b9165ad85f671fb581a416598aae2d1b py3k
+83387 970b7cd52453b5ea37cdb312e8d770ba474fa5be py3k
+83388 7344427e87dfcb359e84201a52413f553d51b18c py3k
+83389 6bf292e906c2c23eb104a0df4148ae9b94e79363 py3k
+83390 3c4bd8613383e4d6150398da399b3084473cc5de py3k
+83391 5410e1167f7d3c5356484685f0bda49a2c530029 py3k
+83392 6ef32d208fcc4f4e75c9a2f3175baca2f4906e32 release27-maint
+83393 31f4c4b6c44503306f3a43f14c7a2fca6ca4aaa8 py3k
+83394 a4ad10975776c58e9f5e4571d71c5b2975e741d3 py3k
+83395 66cb15c62db42e6d750ae6e9ca6e75b2a29f1ef8 py3k
+83396 f2f79619f6a494705a8204e17edf49b15aa620a5 py3k
+83397 5ee3e2712d7dcfbf7a238de283dd3ac387fd2aca py3k
+83398 cb231b79693e46dfefe2afb0172a383a9595d148 py3k
+83399 6d35d6e585621ff3e6f1d64384b08540ddab3a76 py3k
+83400 897fd51051bb6f26aea0bc9eea105ac88de3bc00 py3k
+83401 398fa7b7753ae0a66869e9622a6c864c98d6f087 release31-maint
+83402 51aad509c20f15159551ad8bd3663b077a98c828 release27-maint
+83403 1f0271c036e168fe4ab2040c01929af9fe718669 py3k
+83404 cc2f864bac9cee3b8c87a9b3444be617df3222a3 py3k
+83405 135b991d65b60e68751b05d537b6680f4fcb9934 py3k
+83406 cf989a34c77e3039ba05755b5201a8523a637be8 py3k
+83407 88c3db6f479e43b9c878d55e6cf63edbf9091f6a py3k
+83408 22993d27fc8dee4cbe0a2f3935181e1b21618c95 py3k
+83409 0be5504213d380f0fbbcab9461d03be18f85b827 release31-maint
+83410 e3165eeaa700c58d1a6029f0d19108728db838e3 release27-maint
+83411 74599d3954e28d4c9f746193e3578db765f73c81 py3k
+83412 0fe55c286edfd47264c97b8b00c97076f90a0583 release27-maint
+83413 76605cfc4cf383bc8ebfff3061cc03faa69e1bf8 release31-maint
+83414 625c21dde1380f81f54d4a2f26c0ffb8261d9e46 release26-maint
+83415 c83ba55151b1f30d2ced5983b74ed09402651a98 py3k
+83416 30202c00140154d53d45b3c7664227d83958cb34 release31-maint
+83417 ef75ecd0e1a7b32a9540c422e6c2f663da5c8e55 py3k
+83418 cc33508e80cd7819297b9a1dae7a34115ffec2b3 release27-maint
+83419 71fc92b88b19b801e8989b38d1ebe86a6a37052d release27-maint
+83420 01cbd932026448a75105cfe05da09686e5bf36da release26-maint
+83421 84363c747c2120aa42b48a1ba04b17e0892be2b6 release27-maint
+83422 9ee196a7f9a2a32be44f87611ed57a2d2c065828 release31-maint
+83423 dbc8da813630e610f0fe5088546ffee02169db23 release31-maint
+83424 9de07c55fdda2769edc57985fc9977682f71e023 release27-maint
+83425 bc66e1566a1928472abf2ace1888b022f9032709 release31-maint
+83426 bf5c630daaf752d268433bd823a273a90481514b release27-maint
+83427 93b3ae63d2f31388417fbf6409c41f5d91f136d1 release31-maint
+83428 10c1b6141d535c5debb60a13eff5d208fa953781 release31-maint
+83429 9f2fbee420dac2a1dcd3320b1f8fd78989ffb968 release27-maint
+83430 0dcae455ec076dbd38f5e9f7b049d5cb56ebed0b release31-maint
+83431 ba342796230637a8f7e432f8ccd15c55803b883e py3k
+83432 661e0b0b40bf1f3cc8d05c8cabe5fa1356088056 release27-maint
+83433 20c7244bca7803765e0e675a46b824b31e25b4b5 release31-maint
+83434 b49201484f7fe5f3a045d73f7debf39a0f2da879 release27-maint
+83435 91802840f0f783f1dd55445e5dcc399d45dc3fd9 release31-maint
+83436 3499ed6cbd077cd56c46d25535517030e2fac60c release27-maint
+83437 4903e7577454858a5714ec9394b61fc40855f514 release31-maint
+83438 46b14a2950d00eb765363ac01ac89d3935744918 release31-maint
+83439 4f679104cb86bde643c19b730c9a2fc4d46be789 release27-maint
+83440 404a9ac1a9a2b7ee3fb65e5da108c1a43b4d634b py3k
+83441 3c0ffe39557dee55dad4ef8edd72d96e8c9d0e1b release31-maint
+83442 a8cfef88408f3c455ce434a79bb13ee993cb6d04 release27-maint
+83443 720798a1ee71922faa734aba5dccd77f7dc16720 release26-maint
+83444 765bfd8ec96898cd53d9467af6992156aa5a6b3f py3k
+83445 5af361adaae9fddbac7f40b08ae38d2e4ce34c38 release31-maint
+83446 75b3edda3c2bd9538db697f35bb82e153b5fab0c release27-maint
+83447 146fef0249f9ffc10df879766860183cf1ed5be4 release31-maint
+83448 415ea2c3cfe8a9c0f0832212a2cfe3d54eec5ae0 release31-maint
+83449 4a002da7fbfb3d9661b68b22e4ca0b33fbf0ea4c release27-maint
+83450 3d7823e6897b7612004537b2476f6b2c7823d79e release27-maint
+83451 2ca842dcbe11e844f01ca2cc14eef7172ac52e0f release31-maint
+83452 473a8068f6c54a4273593fdf11b09afbc3877a51 release27-maint
+83453 beab2fb296ccdb6810670620d2d1cf68bd3dd7ef release31-maint
+83454 01d9ca82fd4e4ee303efebdc8b8a3803fe3cec9a release31-maint
+83455 aad5766bf36fc6ccd98f27df936f5037aa9b889a release31-maint
+83456 c706f8679dfce3f4a57cf91e7b18f8fcbe2178af py3k
+83457 8c1045b92b6f19d27d7d9b807a5ce7a2a0ada68a release27-maint
+83458 f04f42134a92174fd03863e704ce5ded145813cf release31-maint
+83459 2bc1fc2d8cc09d734d5b8a4be72da0d5fd8fc312 release27-maint
+83460 69f87f9d33e7220b6beb1695fc825e064b7276eb release31-maint
+83461 bf68225dd2bce6d5d9571d3b9a3838af6506c16c release27-maint
+83462 9ea5db567bdd8bff92807699e40daab3d04e3515 release27-maint
+83463 c432adac116ad714882c3b26fceb24b16d40eaa9 release31-maint
+83464 93d124a8195cc48a5b9e2cb348eaae109ade08fb release26-maint
+83465 9f1eecbcc36620de158333e8458877a5bd710ccb release31-maint
+83466 198b2cd3a6d1b87b8ac2b931a1e817f5eb40206c release27-maint
+83467 395ecae602cb101e6dd8655e04b6335ffb8e9040 release31-maint
+83468 5b7e35aa1f1d173a8fd0ec53deed5b31367da870 release31-maint
+83469 cb5222572fcd93eb5b26ed5eb8618a8a949d09f9 release27-maint
+83470 cd11e1a1fd89bc156e43c077b321bd8c4ab5197d release31-maint
+83471 f35414642dffa335b27b768454f0cb8f95728e5a release27-maint
+83472 228a0ef23a7b2e54aa4287cb662dab04ca9403b7 release31-maint
+83473 92f968d874b86e81dee6c1b4935209f8e053054f release27-maint
+83474 f46dcd8a31135a830a6da929879db1a9c3f23be7 release31-maint
+83475 27544fb0f7f148590494470a3eab8de1f2c39082 release27-maint
+83476 1312e594ebe7848e67507b0bc2c6742d51ee653d release31-maint
+83477 9bf7a0f42eac39f539629166997549609e683262 release27-maint
+83478 6aea70928a6ac6d4966c96d44c6ad5311df2350c release31-maint
+83479 1abdbcfaa089d080b136ebafdd5689445a89fe7a py3k
+83480 f36a04078bfdbfeb264d79332156d035ee038e45 release27-maint
+83481 ebd4b28f46a0f29bbf9de5878c68d260b3c1d684 release31-maint
+83482 0dd480038a8872c872d7ea91181df352bf444d44 release27-maint
+83483 d15b43c272fbb6d647dcbd81765f9428ac5426bd release27-maint
+83484 9501cd640c8e87e2ecf117692270bcda68c95d9b release31-maint
+83485 8f8ba4bfbfa5064764bc2fc462fef65b31d45785 release26-maint
+83486 743406749b2d705cc391d141e88dfdf5185c1261 release27-maint
+83487 e8fc9a9e1991a079978515642cd36bc6a52a6d74 release26-maint
+83488 de6def79326c936676f1ddac511e8af8ab3f3115 py3k
+83489 2a4b2fec8277c7b8f5fb5c32208e6302ccc293e6 release26-maint
+83490 2c253f6e02e7f9254095c9be37cf829e7e3ca211 release26-maint
+83491 38812948c53211177c9991d78ce88651bd5ffdaa release26-maint
+83492 97cb1dd8566eb235cce69752ec78556195d66bfd release26-maint
+83493 5fd09e410d36bf360ea1e215b4248756a64901ff release26-maint
+83494 b7d5cbbea180cffdb408bc93d20ae9d0d17668fa py3k
+83495 61ad81a774c55063fb129ece9df28747e1938003 release26-maint
+83496 9c75a94187c73f6a78945860024040ac27b5732c release26-maint
+83497 0db65c6510daa568f0ee1b396a90790c059ac01b release26-maint
+83498 3174d5ba46e38f1b801eba0b6333510c05187800 release26-maint
+83499 bc10a44272dfc7ef8fea9e7b06292a0f6a75e4e0 release27-maint
+83500 fdbfcf9da2c710cbfbca88eaeb214f3397370967 release26-maint
+83501 8ada35e9f45d0f137ea53c240de37f19e440d71f py3k
+83502 2c36750161451dd502c31279d343ad0d022c12b2 release26-maint
+83503 e48ef7131cfbc7f44040d65268255316171eff6b release31-maint
+83504 c9663132390dcdc66be409eafc906d6bc6a642aa release27-maint
+83505 0aac7b8771e17fe3a82b97514fbf883550a18da3 release26-maint
+83506 8a149a9f9daf6571645006eb4e343c6608d76c22 py3k
+83507 2e97aebade4ddbcf36e36419788cfe8cea9d39a4 release31-maint
+83508 63b2349ef790d4f46b7c0e48fd742d54e040363a release27-maint
+83509 72c8fab9116eb08bb1c283f4a942e250e91cf94f release27-maint
+83510 de9f353ee865d9e585b162d63b16523c630a1753 release26-maint
+83511 37d3cd8c10fb451197e54e7bdefced7fd05cca26 release26-maint
+83512 751c6dd71b5ed55d495ce4075141e1092f2007d8 release26-maint
+83513 eb6f99254313738ddc78ef028eea7eba66fa3124 py3k
+83514 185e3f7266e90d743a3971f5a8d37afd0a7c7af2 release26-maint
+83515 30086aa33123512ac34ef4cb9d8d00cdc57b80b2 release26-maint
+83516 d8dbf2400d8a21c9e4eaab48599ba98897e815e5 py3k
+83517 8a2a82bb71c82247e1df08727b1b1c6dcfc81b08 release26-maint
+83518 2dc0b7131c721080ad9169c698403ff78406c926 release26-maint
+83519 07c84b9814014862d03da6041a06804e3ded2c24 release26-maint
+83520 fd4b07ab797699640065010dc3deb9fa9b17c01b release26-maint
+83521 39e14df765e431b9a78fa4753a3c372d196a833e py3k
+83522 904ef4bbff5e564bf416d0650af97e7e8d70b254 release31-maint
+83523 b6144daa4339a18ab10e6e1ff62d643e2ca94a48 py3k
+83524 61d3481eba741d757277e27b5742bba732034b91 py3k
+83525 77bbb05d310e63dde6ddc5ac6a306609e3da8ae4 py3k
+83526 9246aadfcd789c23f1339ad5a01f4aada673d52c py3k
+83527 eb790495c6a4502c9a0eb1565cb690d8244e51cf py3k
+83528 a349fad507a2245815e52bd97fbed9bb0cf823e1 py3k
+83529 1640efa7ff29c924b8878fcfbd19c948fa1067a5 py3k
+83530 b08d350620885f02faf24925072fd70e5838e379 release31-maint
+83531 85cdaf5f3cdc3e14c081e9f27987486e85d8a74e py3k
+83532 a3149c93165656e8f95005359908fe2cb358f64b release26-maint
+83533 6baeba54fd24bd71bae005590a1faba01bcd0c4b release27-maint
+83534 3068e00a320768a5c0243fc34f5c6389ceddf790 release31-maint
+83535 3be2464c0c3946dc22857d2ce39aebb8588a75d4 release26-maint
+83536 d7f3085d1b03e42fd76a835d069d1e5396e9968e py3k
+83537 7c3b849d181ae2d981156249cb5f5fec6000909d release26-maint
+83538 516f9e34af2096da09f63935de96804cc7cd2212 py3k
+83539 ca632bad6d60cb46a5bc1328ccb79ca0f6063caa release26-maint
+83540 dba99828d91c3e8ee1977d11c828bdf21345c7a3 release26-maint
+83541 6536150dd4f42865d2844771fad2cd2f29c6c205 release26-maint
+83542 58c22d30f74936477ba0bd6d9c874d77d397331f py3k
+83543 672493ffd753f99cefa96575971dab6941b7f48c py3k
+83544 cecc6d2a5b49cbcc44d97a05d77aab7b4ef31e66 release31-maint
+83545 b6c5fcccb6de5d57df9d5282e57a2a5c623a9560 release27-maint
+83546 7202c9a20566629dad6d167943348af9f9e9b800 py3k
+83547 0bf36cdd8334542510c5edcfcac639342fed6b8e py3k
+83548 6e3c2093bb21084c01dca42dfbf58c235d581e7c py3k
+83549 f8ce64a96c89602a5f0b95e909ab8a2ade4ba3c3 release26-maint
+83550 a24c9a7401f453517e356ac010ed725128010bb1 py3k
+83551 699fcdaf99812ca91ac924b75da563aa75e4f459 py3k
+83552 307e1cee4a5810f40eb4a371a99c282fe25be0e8 py3k
+83553 7f68f85543d4f91a7e224a4b671f17fb7b2cc4a9 py3k
+83554 7f071087d820d992db16a7b15007e0acced43a00 py3k
+83555 62d8cfccd18b44f56e96c97632abcd27b7598ab3 py3k
+83557 51102abdec50212f056771342cb1a557cc1e4a2c release26-maint
+83558 b4f6147178e5c2f79272b4224e88ce19f0700d95 py3k
+83559 aff8d7bca3f333fa996546e9ec519f65f5cbc0fe release26-maint
+83560 4874efd1f657a36f770d4ab90dcb34aaf66410af py3k
+83561 7ebf5f9011b190d2e83944a6ed955793cc80faf3 py3k
+83562 b4b89d1b42cd445ba5b146af083b967dbc862021 release26-maint
+83563 bb2dcf1203c4c470f41a48d2c75b12b3d39f0831 py3k
+83564 ac29f70c61dba3446c75bde2b207e896475e0550 release26-maint
+83565 42e19c14b1492a5c9a63333c5a8916aced4b6165 py3k
+83566 47ba905a7e87dc61b78885492abd78cf4069144e py3k
+83567 d0bb80e81b39a63c463d3c674e0cc26200317be1 release27-maint
+83568 37ba47232027a602994af11ba55f0e341bdcca99 release27-maint
+83569 ff6fabf25cef4957c93e79a42fe0bca6cebfbd94 py3k
+83570 df378e44ba9ad3ef84e025d2e908db5219ae25f6 release26-maint
+83571 236393c554f71490decc6f2caffc31397f560bed py3k
+83572 79588d4867bcb2475d62681a724e29513690904a release26-maint
+83573 dc94134186c8753c6c0e536c39267fe5faa31cf9 release26-maint
+83574 8816f4e9f712cf3b7f19abd14c96cb3a1ecda24d py3k
+83575 70a6a727ecd732935385a5bb9dfd89a239207b85 py3k
+83576 649476c663fcf610e56dcd45222daaab09f55a39 release26-maint
+83577 cc336692bab905475b9c75e5e3b2f2a150591c9c release26-maint
+83578 959400ae05b046c60ed893afcfa1e60c3acdb2cb release26-maint
+83579 319c9f9dc4561946dcd5bb48a1d339048faa1999 release26-maint
+83580 3d011c2ec237cd93558eabef7c0af927b6e31633 py3k
+83581 3af6cae5e026bba73cd6456fba12e6a07b2fe2a9 release26-maint
+83582 d6ac3d09b79d4a77ed75733f6b7b0d2fb37f447d release26-maint
+83583 b85cf85b7edbc54e515592869c53b7ce1ff83960 release26-maint
+83584 cea6ed7a0aa11a0f8497897411c4becec3fe8906 py3k
+83585 4dfb8a61e69fd038f382e80cc401d7f7082acbd6 release26-maint
+83586 76e1c5f31931f0fe079b6e45309d0abea8abb789 release26-maint
+83587 e971c104a5c21e3d37480fb84dc257813df0eb3b release27-maint
+83588 fd249750cbae5a4e6004858b998a1814fca99d52 release26-maint
+83589 6f81d6f9a6d1c4a7dcdd358255cf64cf48c93bbf release27-maint
+83590 6730cf9d627a5dae81b4975aae213ca3ca1881ee release27-maint
+83591 7449d04213c6e41e7a74436993a03723604129c0 release27-maint
+83592 21620d9b08480ce3adc366dae682b79acb78d867 release26-maint
+83593 595676e466c0d430c0ea210e7fddd07c8ffbbee0 release27-maint
+83594 a9cd2550ff40aceb0d764f2d02409a65db58cced release26-maint
+83595 13d2bacc56a415452d7f1029b25de210dc883c80 release27-maint
+83596 f3fef20a66dd08bd2beda10a4052852b045f9d0f release26-maint
+83597 29d34e4d0a9a367ae8043285ef7e8047c28e8cdd release26-maint
+83598 61b69bf1eebdce11afcb30a07c8d801fc4ba2491 release27-maint
+83599 f2d83a13703fa9fc15200a8d5973bae8c67f363d py3k
+83600 5c4cdf33c1325a7056e7880d9e577cd6ea35bc77 release27-maint
+83601 12c91f4bb41449abac6adaffc2d6c8dd0bd7ea6d release26-maint
+83602 63fb8dbbfda25e4294b9a3fbde4bedcd2dd70b48 release26-maint
+83603 443896f324ce20fa69606877086c03fceb800290 release26-maint
+83604 a2f013021e1ddb1bff0856311994574c15e32e87 release26-maint
+83605 37d399aa8c16fda675e92c645778fa5515d02174 py3k
+83606 fd20eba1f2011d63042d33b9a4ceefdf286aeba9 py3k
+83607 4750a8a8b4cf41745f23b095b1e90fb32e7a837c py3k
+83608 638410a2904681cb08269e869bbfd87418cf6afb py3k
+83609 7a47c4d30f6e1b3f46ebd0b44f871d017103f899 py3k
+83610 d485c680c65fac9373d0932ea9cffb6b16e62cf2 py3k
+83611 952a8de5ca65a177d94ffe4dba63dc9932299387 py3k
+83612 593d6417edf1079f2c3e53502f6057e62449ec6c py3k
+83613 20242af243d20e23077cbd435a8baa23e7aa61c1 py3k
+83614 2d03d6c4c829c290d90514f1f5fee74ae23d5794 py3k
+83615 4482a42885f75a5161dd6eacd0522a2d841e2a18 py3k
+83616 29f20ef10755a0aa24a0a114af8c902639e93576 py3k
+83617 6015b6ec81f2c7703cc1b21db28f0705077c501c py3k
+83618 031e6b348a8e8af9d3b13e4c36d856471e5ac5b4 py3k
+83619 762d89faceaaaac698165b475758aaf6b566ba83 release26-maint
+83620 4540b6f428d3634748468b371f22a870898a7463 release26-maint
+83621 d57552abf180e58dd240c58658543bf5d965c41b release26-maint
+83622 b92f0c49f0e8f9ca6565b3bab519df3b305f0336 release26-maint
+83623 68cfc84e4db1c86c29499fcdd9cdb34df6a86017 release26-maint
+83624 4c0b37d869caf8786b8e8138e83eb160c6074f50 release26-maint
+83625 a6934a1bfa3b0fc6051e193ea00c5d1365575bc1 release26-maint
+83626 657ae877c0bf200060cae1b800fe3548d3e44f2a release26-maint
+83627 8c79909a7ee7a61f93e7c127638fcb30d7acdcc9 release26-maint
+83628 4df72feb39d90581ccda5fd107063660da3aac52 release26-maint
+83629 ef119dbbe88766155c8a4e4b7d595c60dd1f3f17 release26-maint
+83630 a88cb8005110f573dbbc906cf1d1b8c3be8c9d28 release26-maint
+83631 b1e043de9c5a584014bca5826acefc5f93adb987 release26-maint
+83632 5cf679be3dfc4ea8f3ff86dc25d1740bbbcffb1c release26-maint
+83633 6fff0ffff85b4efbf0df3353200d79e82af339b5 release26-maint
+83634 2aca34460fdb409cf5c11c320b31214103d9d4b0 release26-maint
+83635 3efb4581790a31c778620d496458cd5a4a24f3fa release26-maint
+83636 6a6c13a7f03038a0dc84d3be661425ff506f5313 py3k
+83637 30a800d7eaccaaa718760fb1228e5f874747ec67 release26-maint
+83638 e7e7c56718af26f5560662ddc1013b87bf348159 release26-maint
+83639 19964944cc013e7c1f51de7c73506b2de9dd555b release26-maint
+83640 86d119e94da3a06bc02be76bc977b4fe7c464d32 release26-maint
+83641 63f38379e4eda0b6761d508acca3be7d5abcc3fa release26-maint
+83642 7b584a13bc965abbbf696338cb3cfc77c63931de release26-maint
+83643 f3060e6fb717585da46fcb62db21ebe678e15cb3 release27-maint
+83644 18c8c5004109ed728d88e0829ee67e664798156f py3k
+83645 6945416c8d045c68aeafc8642abeb7aae0fe20aa release31-maint
+83646 517859cb0e920023d5aac0933b3451b90ae2baa2 release27-maint
+83647 c82b6effb69531a5f3c88fcccc7a99251bc5e6cf release26-maint
+83648 cdf6a3a5040746d310a524fdb85ec0fe5d0e585b release26-maint
+83649 1288a25932876f6345d27aa786a1596881daaee4 py3k
+83650 57105e875604fefbade137667bdc5375c4d51059 release26-maint
+83651 ebc90517b8d96bff82a17d03d52be8bc08787185 release26-maint
+83652 e1ef52633350df64364c72b8b3c414d0966b8d69 release26-maint
+83653 f864ffb8f2edef686c776e759b786355d869343f release26-maint
+83654 d265f91c387d2fa840885942f4c95075fe66d503 release26-maint
+83655 a7937da62591c25e8ca701947a7a06c39b500aa0 release26-maint
+83656 48c59e90553251e7f58420abc0b37a56c72e4db8 release26-maint
+83657 7cee1b9609e47de03ff08154444f91130f2f7c7a release26-maint
+83658 b2066678d937cf990fef5e880ee582903b6ceb06 release26-maint
+83659 e210ed63b04e4238c821718f6f15900f2cf83cd3 py3k
+83660 3dcfe29d9ca5447c0f86d40296d68501ef8ef95c py3k
+83661 a3f645381d61ce2e1fae62b41054235633696b02 release27-maint
+83662 f9c4f099a24dddf774959181ecfc864e227ea3a9 release31-maint
+83663 66601fb90d3df6448b07fa814ff953413fb77f98 py3k
+83664 71ae523eba5baddf7b81a8bca8b7730e05c64ebd release27-maint
+83665 45dba22a74fc9a39e818baa03c648e6ff0e7244e release31-maint
+83666 9d9a83b25045781febe7d0acf11737758f00b9f6 release27-maint
+83667 af3655f2f248c3d344f21ef75a08da44032b9277 py3k
+83668 33e9be2fa4d2391e750a3a6c2c2afe98c872d55a release31-maint
+83669 63e1d0dc44ee07a16f696ea878ce4f5592a2fe1e release27-maint
+83670 33d2f42455610336be27b4ac019cf291e350734f py3k
+83671 dc20df9c9ba95f0ac6794867fc527cf250fd4021 release31-maint
+83672 03aa05ebd9bc5bbe994b41cc7e4bfce680272ba4 release27-maint
+83673 71c4315d49f27f2181fba81dfbe2fcf682b1c43a py3k
+83674 ff4456dd4a78ca4d3aa316c41d58002ce0222c02 release31-maint
+83675 2850bd9192770d4b1d6287dc8e29a737e8ae0284 py3k
+83676 23c089dc5cff0e90740e6f95825d2ed772bf71f7 release27-maint
+83677 d6b336dd645776fe10f46896966f0bad5e0ce29a py3k
+83678 9d68e7845e42050950f43125b9fec931510d13c2 py3k
+83679 c4bbda2d4c49865d26eb39f9ce8d9770b4b5790a release31-maint
+83680 0420f547f3bf2411061c681d380526ccfce80c3f release27-maint
+83681 398a25cd612ddaaed5ce9fec048192535340ce29 py3k
+83682 9719e5e8a8af92ebe8e17415c09eab0b9591df65 release31-maint
+83683 b33c80f7ab1766b5c770028ee4edf218807e923d py3k
+83684 f2838eb1bb1ef90af95707dae86cd1d4a6406fcc release31-maint
+83685 8a9e976127ab13976f7123f024d1768bd0165f6c release27-maint
+83686 3775bf8299b31356fb8c79bf2132ca2051a5acab release26-maint
+83687 f43f6d173076e9ab5a7e67565387b4e140349fe6 release26-maint
+83688 cf9fea22c3a9e161f9c2ace6241c2432ff48b33a release26-maint
+83689 d686f3033174a93025ebef406989259192a1d729 release31-maint
+83690 20d73fec9f62301dd243dadb3f03ace28da0650a py3k
+83691 c1dc9e7986a2a8e1070ec7bee748520febef382e release26-maint
+83692 5a73dd15be084be5d8122ef2a82defd7cb6978cd release26-maint
+83694 21a9c940110d265e3d6356c7fb87372835c9e2a0 release31-maint
+83695 fca3c9fb5a1b63c24571583d366c8bd5e1fc7654 release27-maint
+83696 bf69509626ff954a1ccb21248e4c679540322560 py3k
+83697 6e795ec38e80082850c2c9ba161bda87a6ce7456 release31-maint
+83698 af39e255fead056ad3012bbc76d4604533b507a5 py3k
+83699 f0eca74f00e14b2df2258a9827076ed4ea6916c0 py3k
+83700 1489f399aba1e71e06a1ff436d61b639284401ad release27-maint
+83701 f4c9f6f1fe76a62e3a6b0b7876c6c62c028e8193 py3k
+83702 915b028b954d75c3ad83aa9264e33e8f3e2dead7 release31-maint
+83703 583343578732e2eb34d83ec94c0abf048faeff38 release27-maint
+83704 b3fdd445e0379d731445e52dccf857fa9c90260d release26-maint
+83705 89893a002273eec559e237e7a9f6f68039567683 py3k
+83706 ba73531475077786cf8fccabda156add2a0f28cb release31-maint
+83707 4c4d8ade9dbaa16c533a1f692ad802d0b5cd7d97 py3k
+83708 f598423a462169f731200dddd268f418145a398b py3k
+83709 e688635970613f51b25687653863eb24104295f1 py3k
+83710 7719cc7ecf4546aad2f03b8a7f3de7d5d63718fe release31-maint
+83711 e5f1258cfc5895f10698f1be4f0837d900cb5d03 release27-maint
+83712 6c12b171792e250f8e75bdf40fdef47e7f15c8ed py3k
+83713 5931112eabe77fd1087f1fc6ad73d343a3d2c794 py3k
+83714 716e601570da1c519a49248f63042f3e42b6b2ab py3k
+83715 485c054c9aa165150cc4a0df0cf42120c97143e3 py3k
+83716 7042fa539e7c8154cbbc00dbbe96e58d819ee4f1 release31-maint
+83717 c5a282797d5e352edd0308bf1f46843bc5f0fec0 release27-maint
+83718 0e4529d733ac41a1cd3c31f4894fbf24b5d2c909 release26-maint
+83719 576b765844af92da5336ca15d49771f9813f59c9 py3k
+83720 b39846bc7ba5567e3f4a7bde3a6a437b83dd6ef6 release26-maint
+83721 cb34cd630000200a39cfd26cd596185f5db1a082 release26-maint
+83722 fd7f73e1256800c70716be64a95814573f78b860 py3k
+83723 83043c15256681e6ea5ce85fd0e4c3265685faa0 release31-maint
+83724 9de56c4317c943e0a90a31f0441241432c05bd17 release31-maint
+83725 b4a5332d2bcacca822efc67f315e9232a64a9806 release27-maint
+83726 2d88ca64a90bc1d18e78aaedcfba303ac9206de2 py3k
+83727 828227a0053898bae427a3225d9c90bd28e11705 py3k
+83728 35fee9211f3b585c9da5590f93aa192fdcf31596 release27-maint
+83729 8f4f468fe29e08afc61bd4ea619984b36d6a76b1 py3k
+83730 9c7046fd4d6672097bc0509d47fd6ab3c8eb2663 release31-maint
+83731 ca7ed941bcb934413edc4c34693aa6341d1addde py3k
+83732 ca6d6ed23b238b79673b04ba4f48674ca12a2e59 py3k
+83733 95fd4fc27b9bb5ecc92425e8f22583d348ef33f2 release31-maint
+83734 56ab9e111c1c0f5b7399a76a121da778282b14c9 release27-maint
+83735 3474ddf1ebfe4a3841b3e9cae0c3375a3c5923f9 py3k
+83736 eafe07d40eb7359e07b1940e9c9fc68c332d99fb py3k
+83737 c15acd1e916b3504f47b0081e8f1146e8d5dccf5 release27-maint
+83738 a185caedf32cfeddb8418d1f1931d7301d2f99fc release26-maint
+83739 35bd57d3d232cdbd361d7d791fa6a7479cc90c63 release27-maint
+83741 8100017939f499c7f856a35787f4020ec9fc2722 py3k
+83742 6339a7b3245ccc3efafe67213659ff2f31e81a77 py3k
+83743 67652a7f0aee23787a2da111bab9212f3eee00ce release26-maint
+83744 c16803bbd790d732a9985e9388c8830f83ae1ac8 py3k
+83745 72f006704fbdc81452f4572ae032ceaaf1727dca py3k
+83746 384d2189a96a901f69a1e6601be4d4c3b42bfabf release27-maint
+83747 29226c08e547d8880a44ce38b561f66c69b6d639 py3k
+83748 a03739af9d385eb2b5f921a572f80ce792956d5e release31-maint
+83749 fcb7e35924e634fceb31d2b8246dd69b85867f91 release27-maint
+83750 bb2a315d6a035002d13a9923a42b83faf1fb91a9 py3k
+83751 f806fb3d1f277639b7585c29933ca9ac1af81b6c py3k
+83752 88cf9a0ed11813f598609b45aa7d1d9b95bcab8b py3k
+83753 6b28b88f6c4e885f4c8f12faadcc4e32220a5f30 release31-maint
+83754 b906e9e5f2a7fa93840b5c6e5144d29e3e11ca57 release27-maint
+83755 76f8402ca7f3540ef0324cffeb8a1f8dd715c79c py3k
+83756 fa6314b141dc42d27a79058da8ee7497e3e72f9b release31-maint
+83757 0f8a4fcfdd1e594c3e044a6f59679ce6a37cc06b release27-maint
+83758 b06222f155ff5ed5b35a670e5835a52ffe327a31 py3k
+83759 ad292fce79f9ecb362ff0fb43ffc1f784e712c75 py3k
+83760 2c10510a1aefc5555dcca13f0a9bcdd1104bd33d release27-maint
+83761 bb2608f73eb7c6d3482f8d94ccfd376f097b40f9 release31-maint
+83762 f7bd28b3c68394d1d6c9c03998ab050fe441584a py3k
+83763 8ce6909696d42f176281998c84e13005da8fac33 py3k
+83764 d14e1e7248ba3f6faec90a0b6068200b40f52d23 release31-maint
+83765 3075a7e85c1881436ed56820045c0f846c9bf606 release27-maint
+83766 76864ac5b67d01263def81d270e2064b01290bb6 release31-maint
+83767 06bbdda132f354958cae758850669e747454392a py3k
+83768 43e6bf86c37f2c3048d4e4056bf5d6ec79b27e0f py3k
+83769 08aed00fbec339a0d7f3c1ff551739e34a02e340 release27-maint
+83770 260abe9cefac28a238c2a88cfa8efd9d580fb140 py3k
+83771 7bcf6255de2fff3d2b991e5f703978ea0a49f0fc py3k
+83772 394e48c516c4a3b12366eb877b9d0892a8c44872 release31-maint
+83773 40b4837833a8b532ff37458a7aa5212efd06e00c release27-maint
+83774 9d1c65f8323efc2def2233f655923fc0e379f46b py3k
+83775 063279c6fc160e0ad393be1c8f5c0d205e8a2c3a py3k
+83776 bccc84e04a2cae73094a4d3c8b0fa814eef49723 py3k
+83777 ec3217a9e5216dfb2ef3d72e20a053ef10a9b38d py3k
+83778 7608532f933a46eaf42ef07b8d64075fc63bb7a0 py3k
+83779 275acfcccccb08b57593fc57ceb44419e438bf39 py3k
+83780 9b802b6b439509d3aeeb754b1b9d867f0c846556 py3k
+83781 f27b27c82d8ff48bb3adc505523fa05579eeebcb release31-maint
+83782 7175d1805cc0df60aec1c467f9def3641f89d82b release27-maint
+83783 0ed665e8a115429bfcf5ad23db6d462538d71aa8 py3k
+83784 28136af00ccab6d47c9cebb15eebae3f39165644 py3k
+83785 4e3258894889fbdaaef2c05a49e21c3732fc2e77 py3k
+83786 c6d8926c99df5850b73254fc0bd76bc4ec4ff014 release31-maint
+83787 87f333038035e78c1f909a94f290b6cf60f62d3e release27-maint
+83792 c1d7f7fe47a0570707e56964b11e067144f43023 py3k
+83793 fb06fab16a3fe605b92a39fd0212a9ccf80ff76c release31-maint
+83794 ae8c25f94adf4d3519dde8d1881471e1c6125b84 release27-maint
+83795 d95fbc4aee7c3b8e61221a7c99f9918111704f43 py3k
+83796 9d3ba0d665a6508c417b5358d6edb3a8ede1c0c1 release31-maint
+83802 24b3ded518254c3af7b3372c729168aaa038bf4e py3k
+83804 4efed62eac3a86c1edf624551de26bf315987ba3 py3k
+83805 603c35508b363dc3bbe5cee77f816ec8040dd080 release31-maint
+83806 7099ec0bcbd2c9928b2608dd1799fcc7f2f772aa release27-maint
+83807 15839ca43d96a35e3f189f156a461269a2b6dc5f release31-maint
+83808 bbe2223e37506a04b56b88885494eedc52c23ba4 py3k
+83809 4bcd53617a656bed7350a6838a4b616c7042c86c py3k
+83810 28fef9e7c3bb732f1f160968a0e6d539880a9052 release31-maint
+83812 924738aab70fdd69ded150a296bc976131b8bee5 py3k-dtoa
+83813 8c210e61ca775410f72f84da13e68c61c69b6a69 py3k-dtoa
+83814 bffd1e2854b3d36b15358889770073d7510f1116 py3k-dtoa
+83815 a0bdcdd0f086437c831cfb182407e85a4e97da72 release27-maint
+83816 e41ca6672f822e096ce6e6985dd20c36c550cc8a py3k
+83817 f4d92c6d4d42a53d060a73e83abf9b3bfd0f1838 release31-maint
+83818 bf3359b7ed2ed5a7b79bc28456ae30bb4425f3de py3k
+83819 e61a094b4818d459317fe3c620b5cedeaf52e9f7 release31-maint
+83820 4b24b7a420c927fe52af02d34ac0049de174127d release27-maint
+83821 01787563e2cb344fe934173a407be5c9b2276fb4 py3k-dtoa
+83822 0370c11fd21df3d4a944f70abdff32db034625de py3k
+83823 b6feb67a05f1f16fab7b3e51fb6c75ce4af2d7ba release31-maint
+83824 e16560585e35c6b364e33fe60314f10994b995d0 release27-maint
+83825 5ea707d2caa88e9ff31b6534e1ffee80bd82af69 import_unicode
+83826 be159f3db5d6ae0de3162dbd250d7b6426af1b28 import_unicode
+83828 1086dad50c7480920d830e1ec58576f75f37a459 py3k
+83829 6b2189d8e8c44d2f4220ba1cbcf56dccec617f96 py3k
+83830 b4f54639b7b195cf9b78051987abdb2bfbb4417d py3k
+83831 983f110a224e2a45eb5983f9f75f0de38efdebb1 release31-maint
+83832 cc5a246b2da1bb82e8f17f4468d6813db4910eb2 release27-maint
+83833 75ebe6cc8083351a55fb1e7693cfb2fd754d9338 py3k
+83834 c52f5df504488975d9ad9a2a930e6186ace453c6 py3k
+83835 8683aea4b72ef8dc7991ab3d8f84157081fdcc79 py3k
+83836 e13ea83e2edb3de22e72de5374e2761eafa45bc7 release27-maint
+83837 40d11b8139da50b047feb2f5f8190a9562f4fd5f py3k
+83838 515e0d705543fe57597e7a29440e6e69de199af9 py3k
+83839 08e05d424d97a6293038dd5ea3fd80cc54000d8e py3k
+83840 60ac41ae7f3120d056cd60d9bb1493d4436b5140 release27-maint
+83841 b9d1980217458942876e2771e4fcffd083d2625c py3k
+83842 df258915f52fcb4aaf36cf0b596d7d917198f87d release31-maint
+83843 5e7f15f2c0be6cceb1f39aa345a2bf80614dd9bc release27-maint
+83845 8b3796cc309e8f98059eb2cb46fe8cc69bab6a87 py3k
+83846 cc0ee6bb5e9b871edfd1928b05a771984644d660 py3k
+83847 feffc1a2599c73e759c0e8511645741092bd4b4c release27-maint
+83848 76ba41b77f53893952849f71361e9d6a3282c7c9 release27-maint
+83849 44619a566b6b63613f9ba9f0c0d200b81f7aa088 release31-maint
+83850 fa862226560912071f657c3d62b774d9a98a5675 release31-maint
+83851 57e631f088d73605432847b3a44f9131885f0b54 py3k
+83854 4ca497f4819cfdad826701bba67d1e3e51ac2e7f py3k
+83855 77c6f60a1b240b509ddccb4a29e0ca36ee5fd7f7 release31-maint
+83856 55c70e79c688867c11d7288cf04402ad623659e8 release27-maint
+83858 55397533da518a03bb43c8a3b2d537f102828f44 release27-maint
+83859 eb5aa91f0e16f6ddb14749937e428be7f63edfe3 py3k
+83860 7d4425e308f7b85266ebb203a8f46236e4d58fad py3k
+83861 1bd3534136a03643573ea9bd447d5a6985485f78 py3k
+83862 1ad5922aec453e470317f1f0af1a7402779dcf0d py3k
+83863 d22806818fe3a53db403e2b22142fd614efdca6f py3k
+83864 ea3a2d1bded2a05b5dd07335ddf1bcd3fad3fc20 py3k
+83865 8d6b4ffc0512aa471718ac5c269c552758e60b6f import_unicode
+83866 021351595fac36b217fd22ae1689d62715a6f8ef import_unicode
+83867 0da3b59c3d380617cb5b6bf54855af930fdd9c12 import_unicode
+83868 f812b79641199a0e96d90ee7ff9c9cf49334b91a import_unicode
+83869 3f8cef837f073c2bc37797051b2a5fdb96ef14cd py3k
+83870 10c95c0f34d355be9f5d697e9874539b2c8c6efd py3k
+83871 52354cb29644926a1959dd2a2b424149ad28bbcf py3k
+83872 9c445bad35b086d04173130a5f984c5b83485cf7 py3k
+83873 7f5e115d76dfad3f648853cd2f17aefc2af4db86 release27-maint
+83874 a13bdb2b8398fbf191d3212cc221d9897c1994bc py3k
+83875 8ce1df3528b76fcb2aee2b70ee70e9aa9e29448c py3k
+83876 c7995e9bc2e36d9f1a21671502c570cffe73bdaa py3k
+83877 8b93cf33b987c8779decf5801ba15c51aea9786d py3k
+83878 688edbbbe658175e6b8fe38057e7fa7c60bf198f py3k
+83879 5e3c61cb70141d3630d3ee0bd226dd82f30d2083 release27-maint
+83880 9468d130428425d265219082c4fe9edfa6e9201a py3k
+83881 3ae95f207606344f423b55efb28b58827f61aec4 release31-maint
+83882 7b7ebf558894854738c41834d134e5d29daf877a py3k
+83883 001529d647fe49daad1401ff323553fd5e8bd652 release31-maint
+83885 3a4be9d25a5f83060cd27d81e967de2728a28068 py3k
+83886 5ae390ac6c61d8ae9a6d97a4470d85a795875303 py3k
+83887 5c0d5de56fdf9aabe895017d85fee601fe1e7929 py3k
+83888 de0809772d7e703e0d09118669a41f191fc63fce py3k
+83889 8ba09cdb6fc48b2adf0ec6bc76c1821e893a8cf7 py3k
+83890 795eb12403b94420db488c4038f6ddeed2a4266a py3k
+83891 dfbbe7b30e901b36fa4518489b39769727a16b8d py3k
+83892 e16079c6a48f583cd368d8f4f0806ffcf7816ed8 py3k
+83893 f1627cfcc89050b6f75369a9f431d563d9deda0c release27-maint
+83894 c38f3b969b4ae50444cdb5b66c70bfb37e973367 py3k
+83895 7dc37ae175fcd5707e74e60a51e064cff9749d2c py3k
+83897 6fb031037f29b50bb94d1702309cfa7232b9aa66 py3k-dtoa
+83898 355d72737364fbdd8599e8f3373a488cf5273bfc py3k-dtoa
+83900 72d0504e648960424fb2cb51dcb8dfb791bd4bb8 py3k
+83901 c89ad6f9cddc18223ce4c71584ceca49199d129e py3k
+83902 95117aab9a86df72d2f19bc1d1fa867d547a0fa3 release27-maint
+83903 50388a83ec3f7e0b2c946bc2b2e44f8c984cabbc release31-maint
+83904 50f8f5247c810aeb8018e4ca37a44e05b67926c9 release31-maint
+83905 0ae706a71a3a50dc1d15b95d0e9554bd02217b86 release27-maint
+83906 a56d8a80b8839e5597dfd305a76421a6389b3119 release27-maint
+83907 46d48d715442fcbb802eed39756fd320929fb82c release27-maint
+83908 60076f28c023ac6eaa28858239d8bf7e9cbf360d py3k
+83909 c2e1db30f7562face50da1a548df7d56db0f704c release27-maint
+83910 30cc27eb354acf51c46bde2f2710514ce6b8f1cb bbtest
+83911 9853658a8355bbfb8e43883255b12012204e7984 bbtest
+83913 29af9abc76cada153fac71862f9034af2b4851aa release26-maint
+83914 b1892b7f1966f4ec8b9307ffc49910e513f16f1d release26-maint
+83915 4c523e1ef10f2b721f6074c2bfc613412cd3ef83 release26-maint
+83916 c3912aac1b73f60f9b6ce977bc0e9ddf26f97f8d release27-maint
+83917 6cd292c9c2960e809752c58011b9ac4c635a5fc1 release27-maint
+83918 37156907f359cb9da5a89a2c9aee66885003b144 py3k
+83919 109bde5e41b944ef3ade98ac6148f6bc26e4a58c release31-maint
+83920 b65dce5902a2847bfc539a75d442fdc49df60aab release27-maint
+83921 ff9614edf3a0546fc6f15b9f2c05580fe6b43629 py3k
+83922 14fb67e7fa0468c107b6d1185d84301397fb3c28 release31-maint
+83923 fa485dcea613e915a39e14915824bbc31efc3256 release27-maint
+83924 bcea35a2d2d2bd95e105d8e8b12c1d50421da274 release27-maint
+83925 19af08287cc79293f16149559b851987cb94b1d0 release27-maint
+83926 ad6c8e228712e4c941c9fa8ca521ed8445264e6f release31-maint
+83927 c2db27aa6bf2500bacbbc8f539c5e400f3c0369c py3k
+83928 1322ef3c4a6c8292e80d99aceaed4a46dcda6a77 release27-maint
+83929 dea1d268e34ed67f132cd9b0581d1d2a6b5ba356 release31-maint
+83930 9e003a2620933c986bb5f1380a1a78b7519bf5fb release27-maint
+83931 4f76ce69aed0dc27444bd345b98071395e32b61c release27-maint
+83932 39092f86b0af32dea5c0b0950b1ba02cee39133e py3k
+83933 a3853bfa251816dd571e4b6c5d8be278c155d076 py3k
+83934 3d6a02f0a2d8a7ae3777c05eb98e6b114d536209 import_unicode
+83935 7e525e125b715e39a166f3abe7aae9a7d34cb390 import_unicode
+83936 7dd5f5cfa179467679354b2b40057442927c0971 py3k
+83937 0a1ad9b114962255d23050e904122ddd6316794d py3k
+83938 2cb58174aa7da072c59d5531b4e6c09be564e3bf release31-maint
+83939 29e20bdb2b11ab0ce14673669f2a3bd5d2261df5 py3k
+83940 40556ae424b7379f4e4a612f2c9dc27d8e918004 release26-maint
+83943 68969b9dc3b060056cdda6dbf0528d35f2c3299d py3k
+83944 7364940672f0044713eea48ac3fc47317ea711f9 py3k
+83945 930b2803c7166b223ce170faef4c481aa6ccd68e release31-maint
+83946 c3ff6e910068b2fe877d50de5c8d0fbaef7f8906 release27-maint
+83947 56066a5825ca20bcd5274c4ad69b85e4019275fc py3k
+83948 76d463c99006396dc415123381a1eb28f3ea364a py3k
+83949 9108e7dcd7d805e7bcd08db1dd6c615a06a776c0 py3k
+83950 a1de4639564e5af1d9e2f742dcbd859c0d4381c0 release27-maint
+83951 f22e950551ad2b89c048c45d80ba5bb07bdf5826 py3k
+83952 3fa8f41a1103c98caf2694bca7eea62110cc6f31 release31-maint
+83953 d1b035e24372be017dfdd4dd24d0b136d474965f release31-maint
+83954 3dbbcd34d494e258b0c9fe540db5bf29905e3ec8 release27-maint
+83956 8499ae5d97196a72a5b874b3cbf90a83da4e7359 release31-maint
+83957 ab2d94931b0c105fa53c60239fcb39b81ded43cb release27-maint
+83958 59db363fa5945c17907854bfd0022cd64c7ba187 release27-maint
+83959 fd4606efc700abb2578dbf88602015fe9925afc8 py3k
+83960 f7d8aa10c3efa768a75c160a0481bb6f44b0f992 py3k
+83961 ed66b24171af12e8b7565bf9e9e0c5f4af9aaa87 release27-maint
+83962 68c48f8aa55538234fd5ba6ce32bfe927932f2df release31-maint
+83964 5343f5714feec51ad3cfe1a7a5a6840e20c62275 release26-maint
+83965 be83d293a1e9af9e67c87052f2d9ce8a011abdec release26-maint
+83966 005721e50e0ba14fb38bb2505f181114101fe2ea py3k
+83967 64b5c6f29601cd89e4fcdfa77228252cd96ba4c1 release26-maint
+83968 cb461a9144db03543c6552edd003e2af8dc34d63 release31-maint
+83969 d2b721185bfa2cd1274448f2ab6960e62b91fbeb release26-maint
+83970 4a5ad918f7af4544b91f1873edbf34bd1dc00320 release26-maint
+83971 87b2da840252e7abafc8f927611e9d6fcf5bb6fa py3k
+83972 03e884fac4dba25290b78be60445ff814adb8423 py3k
+83973 2dd964dad16854f2715ee87913f254bf87da389a py3k
+83974 a449ce1f385b734506cf0327975a1229744c747f py3k
+83975 aa89cbb7bc219bea118c1454a5dad1af913bc550 py3k
+83976 fa2d9720a66cb10f61104171913207d4ddfaeb94 py3k
+83977 d6f8e86a1bec22c3afcb5348d7535132192cab12 py3k
+83978 7555b0035a777411d84d196c8d2d156dd8b0d6fa py3k
+83979 27b553cdd85b646ab9d4ccb8b4b197d99c16e20c py3k
+83980 f1d922d820caacaab4d678bf86ad8b40d3ee3dda py3k
+83981 913aa8a4304c574b2ed222cbc3bc6574935128c7 py3k
+83982 3a80e67a0d3725a8be7d1cd3eeeb3a85066b5d53 py3k
+83983 aa9c8e82c43576bf175f7ababa7a1340cad7d6da py3k
+83984 d4b670aa6d6b83dc673edc9a7f92e42496258c06 release31-maint
+83985 068291d44fd7f8a1a5c0e54c5b0c38ba09557439 release27-maint
+83986 e54baebbd6ff01043752cbdde524f7f45e1570bb py3k
+83987 291c9afab12ce05d8db2c5fe7ce2c9951fb8ffbf py3k
+83988 4742e7aea2f59ccf62d80981bde2579142d385c5 py3k
+83989 7be5916333dfda6f077d9b3342d5c313e8fbb1d8 py3k
+83990 50c0dbaeaa048011697f37ddd74a8a9b4210a6b9 py3k
+83991 ab6946972b7fdbbd48ff9db00e0c4e36a2fb0663 py3k
+83992 d8686c6e6b5ebd6d322e045f0745e8fca59c84e9 release26-maint
+83993 3af597f1232af68a15d09c53b0ab243afa625cbc py3k
+83994 d54da9248ed9ffaf65f651ca71988cdcb130cd82 release31-maint
+83995 70634c3e03107a1ddaf3261dde91d21e4c0993dc release31-maint
+83996 f7639dcdffc36dba4db2118a04cb8bff3105aa08 release27-maint
+83997 94232a0c45ae34865e0e9becb4dcc16a74b5182e release27-maint
+83998 cba2a9611170147728051c6814dec528e30419fd py3k
+83999 1b55b71c7c210eaa4ec57f1fecbe9119aa198d00 py3k
+84000 f8b4ebe9c41b9d9d6e873cf36159f8b290174671 py3k
+84001 38d2b64ab7c15fb75bf78bf37477b0cbf807878e py3k
+84002 d4600ee5e82f0e97164e307d7957f63e886d3223 release31-maint
+84003 494a1b9545696b5b726d1e16f58fc37f2dd2e8a5 release27-maint
+84004 971249c74e805d8b76fd7879ce77305a3862be8d release27-maint
+84005 981555e9986e3294c42146e5239ab960fe7c7ae5 py3k
+84006 aed4d7f12821d711a0c0c52a38d95b6961175c46 py3k
+84007 063c99d8032c51875233bc985eb085e9e94cb8c6 py3k
+84008 794eb40bef3a6554a899c0675c9e9f5fdeee81c3 py3k
+84009 2d7bba1cf3bc5752923cab40604e0638d48fea3a py3k
+84010 293e332b8b4b05a69722ce9637c593873ed83993 release31-maint
+84011 85adfe57877b1c9559508df8db2fd26dbb110553 py3k
+84012 953010c0b1687ff9f465916e8fef7fbdaecd8e4e py3k
+84013 a6592fcf75e77ef44a696c84c3cfc366682f0ff8 py3k
+84014 e013850860faf135b7791e219e5b8f16a16b8a20 release27-maint
+84015 2b0df9e1f69ec9e6145ca2b02cc8ef0e1069b217 py3k
+84016 f1d18f4d6163b59af32afcb24d96ab0464361cb6 py3k
+84017 94b290abbafbaa53b48a1197d34c301281666a72 py3k
+84018 a4fd37a1bf37435d8f501a497c899a949def3b44 py3k
+84019 12fe4c88f9e6674dabaf804d9de2ec8c9df4237b py3k
+84020 27711b0cd1f03b54a3b75faacb7240dd829210cf py3k
+84021 28544d668ed0dfb4657f413a81377c3c9326feba py3k
+84022 ef75955138d22759e6e3375bb5fc3f10220c1835 py3k
+84023 0aac40c77444342813fb20eb421ee53c079f82f9 py3k
+84024 b7ab77fd27b707303010544a3c5e3c333f0cac48 py3k
+84025 2c6d13c40518bea236c17cd35d2ffd9172b93cde py3k
+84026 b7220e429abb47480111416ab21882385cbcc002 py3k
+84027 9bd0827017767365b656a04f8f4c833b00e5e92f release31-maint
+84028 45b24adfd0649f088b721ac10202031834de5022 py3k
+84029 ab670e414c269e7b4dbc997ae55522b342e70c03 release27-maint
+84030 d360311f0e52476ae17db0d0b4b5a5320f38f857 py3k
+84031 5f33653e3837eee006a113a03892031d63a2db9d release26-maint
+84032 3a79aa2c4549fe35383eb53ea0650e85881e0e53 py3k
+84033 f2923a1751d82546bbfbc2d38724f51d289ef003 release31-maint
+84034 0e72183067ee7fe980b61f869b9e8c7e7e00993f release27-maint
+84035 c68f271342d065df3911b63551f56891eb55cc5d py3k
+84036 37c48790d08e0df9bc14d7fa8343a825732b0bf3 py3k
+84037 656fe6292f9f6e9b76aa13722f2950a5fdd529db release31-maint
+84038 b1f99335c6774e7b5e4c109d4d0a430cdceae2da py3k
+84039 afae999782269f347eccb2e34d1de9bd29d9c902 py3k
+84040 1e7dcfc040619b8ada5da9ea2755d20d756b23c7 release31-maint
+84043 3a1b5b1c069b2a46530a333fb562fe6d57d48525 py3k
+84044 95ce8da37e787fe5cba5f7cdc7fc6d19265c76e6 release31-maint
+84045 d8d0abe61e83e7a008ab7da8f550a8b8e7f2a185 py3k
+84046 05ba88292d4c5d9cc67c0e7ba640c2605f701982 release27-maint
+84047 d667ba93f02ac88717a19e730887488218c66f44 py3k
+84048 203b18d5c626dfa96390813ba7402f9592b5b1c3 release27-maint
+84049 7538049efde89cb16b5ee3c6e134e084584737c3 release31-maint
+84050 3534351c8300141a337ca6cd45d74549f08e1192 py3k
+84051 8db5bd701ab360fa02d1d83645c0efe06d783391 release31-maint
+84052 015f051297c5239ad39360d664562c60a5022054 release27-maint
+84053 c233c84bf403b4cb04cf82b53fe9c1089922f9d8 release27-maint
+84054 8d0ab555a1600dcd2675c1d0543da5f78067c62c py3k
+84055 266f3a877f64c8ce6672291a8e201bda7afa6bfd release27-maint
+84056 6dfc7da1791434402cc0b8ea09cc694b9e946084 py3k
+84057 2b36f29c33fc6e47a3e1666dcacd561d413a02d2 py3k
+84058 94d1dad5595534755d80081af69b12a03c80c8f6 py3k
+84059 64fb0bd55d3cdd4bfa32af0c41de0720a0257947 py3k
+84060 8e0991ba29f4573dab3068f55ebd1cf57c28d7d5 py3k
+84061 f88cdd9a44ea6c17e19e8f59254bde4bf2fe905a release31-maint
+84062 8f2f058b7d89122c27874afa069b05ce7faff9d7 py3k
+84063 567d00920ed6366cbba74b18e98c769a4fe70220 py3k
+84064 7a1adbec0db87657b822b9b3b5d0c87a78a4d52b release31-maint
+84065 b9dd467d0574189161a2b05f6fd143df51217dc9 py3k
+84066 99662db9dc41986dad4a071ef660a10af21afeaf release27-maint
+84067 827a633e68cd3e44d54ae4952c8c57f04dec6ac7 py3k
+84068 6fb1013e3079aa03f3159071c0b82a39acd5b5c3 py3k
+84069 00875cc34d175127a62f6704a8ee143701460193 py3k
+84070 9028f23db74be41ecfe776113314a3e7ae0009f8 py3k
+84072 e783c7d5ae364648bacec2d1eb3fa51fb1253a00 py3k
+84073 7a54848d492948f7871de79d8ca0fc7e6c0bf1f8 release31-maint
+84074 98686b10314e98d01f9c8106657c2c6ddbfb0edc py3k
+84075 de46e4250431c6b64b19bf8ea5417aac69e47928 release31-maint
+84076 20fdd24dd9aaf24d3a4e3c0faf427078ee6d9f55 py3k
+84077 79d572ea17df432d2035f29c3a4c160389f091e8 release31-maint
+84078 6e8f5878849c8e6d39e07361d71a0d0710d0442b py3k
+84079 d158808dbd5a2699a85c3b5f364119ce3761567c release31-maint
+84080 673c4e8a01c47bbf945672eda894cc2774861ecb py3k
+84081 b09f93fe29fbf80572bb3f4bf966158d294bf887 py3k
+84082 a927a59cee06c57c8f93975d08e34adae686aa86 py3k
+84083 18398f99fc55fd27fdc361433d2514d0b9473244 py3k
+84084 134276eed28088a42733e371c11fab0dc0bbb2c1 py3k
+84085 e9e0a00ccfb351aa4b7c041f517235c636b4e0de py3k
+84086 85ae442ff8a5d3535872e05f4ae6fb8733b848a2 py3k
+84087 8cc8ce7c3909411a1bd66f9e20734d388362275f release27-maint
+84088 f098e1c8bc597668e45b720ccd4f2ce8f52b292c py3k
+84089 92f7877088afe46979ce9eb0ec21961eb80c4155 py3k
+84090 bf18dd70c180304626582cea2183bfab8ac160df release31-maint
+84091 b4d88f9ef3f99234d1532c4665111d76dd6e1c03 release27-maint
+84092 91d4c7b1bc25f8929f12fef7905bb5eb4355d14c py3k
+84093 4b23e269c4d99a684c6096a687f6a526033f7839 release26-maint
+84094 5d9bdf5aa07bfd48e78b37b92da4f4dd5345e455 py3k
+84095 fc89b8deff1e1ccd5dbd8a293c3ef8d190786634 py3k
+84096 aae3e0c510ffe50681eda7b1c54964a78400fbf3 py3k
+84097 d52f9c8fe5d609b45674eefd2b0b6910c6d5b5ac py3k
+84098 715c44b60ef3736e43af4669e53d78dd2a999b46 py3k
+84099 a233be68d32ea8c9f302047fcf77dcb5cfe0d939 py3k
+84100 e4432efc88b9f8a241652b85462f62f0a26553b2 release27-maint
+84101 907f73e227a6b9e1fe8040fcf0c628bf61868b11 release26-maint
+84102 8994d8d610d4499e8050b330774771f5239b3473 release27-maint
+84103 9fe74eb028ab01f9c301bf027471f257dd957a9f release26-maint
+84104 dee30c46739ebd1c89fa661e75dbe33ddbb42c67 release31-maint
+84105 dc32a7d9da8029fc479319d858fa655cd432f9fe py3k
+84106 e3df34544db9089f376b1906e8c4f82831e723ac py3k
+84107 4085cc560e9ea5328872d2f4a47eb4ee821fdd73 release31-maint
+84108 756f8b398230b3a9de6cedcc9ef8d5c77c674227 release27-maint
+84109 be0aa1d1384cf62a86f855509195e9df1bf92b69 py3k
+84110 1d83d92effe81104aa80b8e6c9906c640439b1dc release27-maint
+84111 b089ed576b1325b5cfcbff453435963f0d5a7e50 py3k
+84112 77b052c64ebbc2e2781a35560041de4fe74ebfc1 py3k
+84113 4725082c282f03fe5afe9d1a98d45b09ca9d8be0 py3k
+84114 17d5b030e8779902d82f76ed32a69d8d5e71131a release26-maint
+84115 4df0d2a13aa14f13fbfa2a8ddae9cc10241e7f09 release31-maint
+84116 41c6087f2e6dae8f14293f8eaee23c505ee1ff8f release26-maint
+84117 8059e6b62463608f73fe087b5bc5abfdfd0f4f0f release26-maint
+84118 e189dc8fd66154ef46d9cd22584d56669b544ca3 release26-maint
+84119 952d650a0afd769cd62fe49dc0eaebda27bd617b release26-maint
+84120 b662a39f0823ea94f35e9538e45cc0270dae8c4e py3k
+84121 0c8bfd285ef9428170f27d9d218a9dd5688bac9d py3k
+84122 05c4baa87549c3d5e2ed0f944f16765ac91d81ed py3k
+84123 0498d68dad5d3791c2dd46a0597e2ce6dac49c37 py3k
+84124 b91059e59d0dc2253e8b97ad8e5f23ef6408d063 py3k
+84125 745bd639ed4dcd6acc8baa2ddf032365f24ae4ad py3k
+84126 0ada7ce24de2cd4917a8b8c6f6c3a7b803d446a9 py3k
+84127 97f47eac09db4ade87aaebcb143d9218d421126a release27-maint
+84128 60a4777a73a062ff577ba8db62d481ee808d6c46 release31-maint
+84129 27678ff0cda144d1a0390daa32308f8f00fffee4 py3k
+84130 6cb776e57296ba3f1c754e575f85a3b8d90d5b77 py3k
+84131 4548f4ab19cee3c43ffa9dec011b0709cecde50d py3k
+84132 77bf58296c87059f6c4649e6228033f4f9a55d15 py3k
+84133 b2a9a59c2d572bfa249088c74567211e4ccba49d py3k
+84134 a049e220f0309606d8470406b60734c639b0e691 py3k
+84135 6cc655416d639bfe282633b50ddfed8001d2070e release27-maint
+84136 24e06833b5b3b727dbb0006cb53bc3d0edd35f31 release31-maint
+84137 9dd763423a566ddc68a2d08ed80c5f926e95d08b py3k
+84138 5fce01a51aa5e515459c1fbcc32fb51e375b359f py3k
+84139 4bc9dfd95c80756b67a1f5af1a8998aa238ba3f5 py3k
+84140 212a16f906a6725c8189b6b6a985e9addaa3d0da py3k
+84141 6fd96c01b437126d9066309b9c44571a3574f51f py3k
+84142 990a766ff9833560d708f23ffd64d9016f2ab13d py3k
+84143 ca2a859e9bf63510c0ec3e8c7a90761f81dfb5b3 py3k
+84144 caeebf7497c38d57d735189471473d97a32fce87 py3k
+84145 27e17616933ef89f2c118c7ea83bffe37e56ac99 py3k
+84146 ee3dcdfe2f87365f5b03396a5cae335c6fc82d24 py3k
+84147 7925bbdfc805f0137731551981a221e339052f68 py3k
+84148 6ed381355d0d448a031d46b2ef5191ed103da10c release27-maint
+84149 35e67af806e503d406d186ddf261d7c37dc7af41 py3k
+84150 b624c7417ad4e6e91bbc39b7031c3ee09a2af403 py3k
+84151 2a4ceebdfcfb258ed6edafb5add36378d90700d0 release31-maint
+84152 febaea1a6871effd83794180fe32679733eaa97d release26-maint
+84153 39e1d3826f4ea0ef391ccb19d3fd4f84e94b9014 py3k
+84154 f3d5837e31b786c3c4b369a9e3901ba95b891d1c py3k
+84155 3fa0a95534024d8960980ad07998fca56683bcbe py3k
+84156 fda9d1fe7f06b76d2b45654f044af39548a1be04 py3k
+84157 51a7784629bbad84da8c2e7b339d42dbe4c60911 py3k
+84158 35c53e7e2280dc7a9806c60b875cbd48eb24218b release31-maint
+84159 9a54940a332ee69177eef7959f8252c12812840c py3k
+84160 f783278790ca63939233a12b546da0ccf05827a8 release31-maint
+84161 a01992e219c09033976b68bb83b48fca2a71fa2d release31-maint
+84162 2b32312dcab1506ae9ebf785ca65aeb4d2ecced5 py3k
+84163 686b18bffb864fae83b3ade87346512271358a37 py3k
+84164 fc794add559d5aab744cd7d644d2443631a00e50 py3k
+84165 4943078c90c9ad485f27de0ee6ed51a1a29adc53 py3k
+84166 71400ce0c721d15708e045f6e167ad067a38c2c8 py3k
+84167 bdd76ad3bc76b011600ab63ae87b6c7f95128a62 py3k
+84168 ee765a67c0b11b19542c5635d7131d9199a2c79c py3k
+84170 0ed76c7b98474bd645ec3b1489c639d8a70a7e0a py3k
+84171 a8d8de23cb7785c4072ad91ce51062b0c874bd6f py3k
+84172 c709351458a66af6997ed85402af45127e60cd0c py3k
+84173 c130f432f24a039bf6beffde8130ccdb30397011 py3k
+84174 ca557948a5cf67b52064457632d8d39b71402dcb release27-maint
+84175 6cda5fd0a3cf23fc395fada0acd03fc93c6ea9b1 release31-maint
+84176 b871244d7f797890f70d54c0fbb2b44531a783ad py3k
+84177 8f97c64b233362160c4b7375848c3ceef5bac150 py3k
+84178 749c22ffa36ec7577bd8135c84133a8a3adb585b release27-maint
+84179 c370866f30a75aa9fac6263729f8449fc475d476 py3k
+84180 df961064f811cfcd19d943c73404e74817fabee6 py3k
+84181 23a598c01911f204205a4ed71406c2e275eb0517 py3k
+84182 687cc854cb4bfdf9b498a3053dd5e2595eb7af68 py3k
+84183 e67e07cb5171cd89529828ab573eb598344bd1a9 py3k
+84184 05a3dfda04ffc6a325f8963138fe5a181c9e7e8b py3k
+84185 790d48788874c51812248a95a1ee1e757d77b25f py3k
+84186 80f98af17def883da435c77ebe8440793f312243 py3k
+84187 228e6f001ae13b1411d91bf15c924ec4d7e69e71 py3k
+84188 9adea94557539e4cc5c6bdfb6637aea5a2e04ae1 py3k
+84189 ea0decd2acfb62d7b00d917537d4276b6760ad0e py3k
+84190 4f831d45125f0e591b67c2e2f9ef08792ae9168a release31-maint
+84191 65fe059b97bf338928b2ef98faea800492367e67 py3k
+84192 ac12d948a89576422e816edafafc1a5cf9acb41a release27-maint
+84193 a9e78f6f694e65a98a6279c579a7430f30743a2c py3k
+84194 2cb2663e336890f58e67320df85b4a7ad1da503e py3k
+84195 ab84a0c7d63c60f6cd5474ef1ea4cea4b891f918 py3k
+84196 f6723d55de4b6ce71118f94252e690801c51fac0 release31-maint
+84197 d0e9febfa00ac71af0968f9f2408b10ad2d9cf98 release31-maint
+84198 857806147ee7341d6b634dd7da09d3760e24fa7e release27-maint
+84199 f2430585963c5845ee211f34bab87f6d08b00188 py3k
+84200 f8712a07b0b113216c18fbd38f9a29045c03673f py3k
+84201 082eafa08802721fa73725b8df751cf1896857ad py3k
+84202 f65bbfbb823ffc1af40ed1fe30a7716044d613f1 py3k
+84203 38ce947c28fb401613b18d7429484546ecb7f169 py3k
+84204 9155db659c20fff1f71db77b54b07f88319415d0 py3k
+84205 a4ec7a6a6895e4e46b884c75d85875001d782084 py3k
+84206 5d3ca1c018ae43410e03d120a85cbf5bde1036fc py3k
+84207 052f42d0222fd9f590367cdd6dd79582e8bb3a66 release27-maint
+84208 66143c23684da3bf54f4c89cefdde8ff0dd3b108 py3k
+84209 5fd26f4526000af3eb954b3ccb40aa39e64668e7 py3k
+84210 af4a91c940717b916e469469ce0d7aa157544d09 py3k
+84211 88e843ce1160e820a34f3e309c69ffd649bb628b release31-maint
+84212 ba6fde8a3a997d56dae02b775b80e04be09828b1 release27-maint
+84212 8c6c72b6f1ed0a610559b0f8c83c6b3bc37756ff py3k
+84213 54c9c86ad104b27aa4664bca98da55922a9d5e59 release31-maint
+84214 c18eeb969102f24ad96ade316b14bbfdc63a3464 py3k
+84215 38ceeae0d1f0796f02160f0036f03d755cd6078e release31-maint
+84217 549a40ca2074d7238854d3290296c9a03059aa93 release27-maint
+84218 3528ba7b4305ca75bf7a06c1cd31a16a5f14c349 py3k
+84219 f2c7e4b1d8045c123518b7d6afdd3061431465bd release31-maint
+84220 39dac0a8896a2786ba15ce444cb274850b37498b release31-maint
+84221 30a0dcf5a3d8a581b5ee12484725058f965883ff py3k
+84222 5a299d785987836167e2046ee829a20104b1a8d5 py3k
+84223 87d468ae3c3c2cf714e7b8a185a4e55ae7565dba py3k
+84224 d4e20f9f127a9f4fde69ddb45c6a76479b98fd19 py3k
+84225 ab63c4578b1bd14414befc81104c3974c6df47e4 py3k
+84226 65ce992368978658466311c1fad46a21a9fbb304 py3k
+84227 f3db504cdfb1f3f5538791a54eb78043c8ca17d9 py3k
+84228 8397f2e007ebc24e4eaa4d71bd64f2357e3f3f86 py3k
+84229 fa7d1d5d2afb6015a9730afff39fb7adbfa7f330 py3k
+84230 7d2bd8955edb83b0948928e8b4d3f65353caf99c release27-maint
+84231 0c3d763f38f142a785eabe7708bd8859a3bf0745 py3k
+84232 9d5916ab60e0f3241117c9eb1c12092f4d341932 release27-maint
+84233 996604cde41f5fe80cd684ec91cfd3781e99090c release27-maint
+84234 abcf9577d5db3fc554d04973c52de0e21f939947 py3k
+84235 1efe823e1f1885e7d0d17bbc42a4cf8aedeb9a30 release27-maint
+84236 c4f5d98ee87b03b1e8f5728a6904bebaf8499bfa py3k
+84237 497a7e284e4dc8e00341da0ce6f60e56d08be5c6 py3k
+84238 2f3ac834b53634eeba5808f50a543d090c60db5f py3k
+84239 b18c80c6875400bfa9ac5314b149125edfbc55fc py3k
+84240 dfd0229748efd4c1a65bad91b79ae6edba408dac release27-maint
+84241 97a5fb1c96ceb3e185e484247b9501e4919d77de release31-maint
+84242 8e184a8bb00e649741a2463b8907ec644b3dfcf9 py3k
+84243 461a20ab433fee4b7b7c0c625f189ecaf50d6e48 py3k
+84244 302fe25cd6b1188f2bbd5f048d5db3f87e017957 py3k
+84245 10df93872ca730420275ab5b783885971cb1decb release27-maint
+84246 f5dee30ccd39fd50d8494d904568a5b49308d9d0 release31-maint
+84247 f9ab9c92db8db24de6c5e5e9435a1041cf7e2f46 py3k
+84248 aacb15291d54610ce31b75f084ef298b02e2c975 py3k
+84249 a34be03f709a349b611f23b9d6dcd5a1a036764c py3k
+84252 01b0a6cb13d43c9ea35f52e0c4e54935113c852c py3k
+84253 6e0fe1b83ff0956d5ac56540974abe3d84a8e9ae release31-maint
+84254 9c4e85785d4e4c5e94068cd2e68842dcef8f34e8 release27-maint
+84255 0130e574f5be5a38727d34ed0c0b8e533f013914 release27-maint
+84256 7ff3fa42972183a5ba22d45ba99904d4aec958ed py3k
+84257 a5a5872050e30384df867997837a16385f7da535 py3k
+84258 b017a4ef7694faea93cd4c0b0528fee0c71257bc py3k
+84259 4acfa3fe6a5eb52c152beaedcc6d7d62f3e9cd15 release27-maint
+84259 e49c53f7535c08d5176a8183f809ae678c4ca8ec py3k
+84260 e81906e92f99aede6640a650fc7456df871ec729 release27-maint
+84260 6ab656765bca387f75d26ab74f8fafbbe90b1f4a py3k
+84261 35304c2fe9e0bb88131a05ba30a68d0839952c45 py3k
+84262 e91849cd06689dde3175f12bd02f9b436c5484f9 py3k
+84263 f2e91e08c1c57f0ae03aff85db8347f0c20d8d31 py3k
+84264 3acd86f8c552473ab9b626a99414cb4b20b12b03 py3k
+84265 1c8834f3cdb963877c72441ac927941184c75fb3 py3k
+84266 5948e48fbd880cd14ee4d98420ace93d7dc29ddf release27-maint
+84267 8f5faf5696e7af2e118137e15b4b659cbc988384 py3k
+84268 02e2d9eab730199c5baa9461902b3026dc66f5a0 py3k
+84269 716d3d102c0aa126d591a58d294e1c0ee923aa51 release31-maint
+84270 a412ceeef0f1eebac7fe7eea7d8d5c5da8db85c2 py3k
+84271 cf399de12b5427d7abfbd944a1ccb3cd5e5fdd48 py3k
+84277 7e1e343b708b182f7875c4703753fcd4b36c2583 py3k
+84278 aa25b8677cc3f79d4b5354f8bcacd1ca10ffd887 py3k
+84279 51a24a915408593b89fd10cfa329a62b354ccb67 py3k
+84280 b535cde9327383f81df02eeb0d08bf716bdc5a8a release27-maint
+84281 1a0859623882f71deef16f58fdf004621768e081 py3k
+84282 42c70f17c2fede6116108568a75b0eec08b3c73a release27-maint
+84282 9d4dc5855c515b8045293f1b40a6ddc9cb116301 py3k
+84283 ba536ac7ab4e4db028996ebe9bcc512159d2dbda py3k
+84284 e79ba555922a1687bb719dbf7db92878cc812d29 py3k
+84285 76e9cf84567602b90a7c4a7707658feb2444eaeb release31-maint
+84286 b95ec171f503643c7c96d2cba214ec0a0bca8dd6 release27-maint
+84287 efaa47e92a8e87e033332869582ee49f0af2e32b py3k
+84288 7895c4553bf5449067c50fefd8904c7782ce117b py3k
+84289 90bf2243552d3343a65836f5c657c492f72752bd py3k
+84290 e2bce1c596beb3a9ece7aa3f8a7f1b7b4700cb74 release31-maint
+84291 e716aa2094fa8d96cb375d064361a69e53bc4ed6 release27-maint
+84292 9f8771e0905277f8b3c2799113a062fda4164995 release26-maint
+84293 6db7835b0a95afc1d4f0ae9f173948b854e7ba0e release26-maint
+84294 2de9d4457082123d9009a7f25d0d94ccf65b7253 py3k
+84295 c1a83f2c708757ddd2cf2b21ab09a5105ad0fec9 py3k
+84296 d4a1f9142f7a9d477ea7842fed0ac63f821f4a82 release27-maint
+84298 db29360cad0fac3a64993b9886f14df7a17a2bc2 release26-maint
+84299 4b1296b262ca4beafc5ac57cec824977c6448856 py3k
+84300 f91f29ef4ee7b5f5ecfbc905e27d9afa9a00997d release27-maint
+84301 c1c4f8f85070da4d7b69ae36e9e0121c905e15fe py3k
+84302 8fe36e2b8ed13c2222fd1d5b7d7e9da09ea198a1 release31-maint
+84303 80a4814ecf5d6521d61ce600b6aa5b6d698da1c2 py3k
+84304 be76b37fe7fd8409d3d2f27f282e9b41ec3d81fc py3k
+84305 6180f4564714db133ecfd2537a0d6def3d8e6112 release27-maint
+84306 f65e9c158c040623a967be53b04ec642f476dade py3k
+84307 867699c9b63ff5845ec02f1744e3e76dfd718512 py3k
+84308 1488cd103d7b8214f7a110300740fef6fc35ad5e py3k
+84309 1e23c3b2e23259a90a93bf4bcf55560c5d0cbdfc py3k
+84310 87bdf53ff4bbfca42996530a7f0e9a85b54331c8 py3k
+84311 f6b3e64b76206780286bb25f35b4e30d6e96f3bf release27-maint
+84312 053ff65be54cb363c5a2848156fa23cb742700b9 release31-maint
+84313 2ccd043aad5c1090ac594b3c96a92741471e2dc0 py3k
+84314 87037d8380bf4a39ef137f1f408840b90d6963a6 py3k
+84315 3ac9a37e429ba62791afa26beff2a49e60336837 py3k
+84316 94c0f97917ddc6928178ff72d0c21ebaf075a8de py3k
+84317 0482b30ca466293ee82cbc356c225c8593c7690d py3k
+84319 aefba899eaeeb4247a1af2f2abd1139adc745b42 py3k
+84320 8330346b5c5fa8b6feb94dec849ffa710d182a2c py3k
+84321 ebfb94f2cbc3564c892c5dc86a38a8b093d55249 release27-maint
+84322 190375445241986a3a847c8a4d78e814ed54a0ad release31-maint
+84323 65520556269501e39fdadb830f274dcdfe26ce8d py3k
+84324 7915d266ee2b25dca465f704652d34e1921c0152 release27-maint
+84325 ed83d546315d2e0a3ab3e0605fa053636d89ac3e release31-maint
+84326 325d016c19f71f8474392dcd706b67f9a26857a0 py3k
+84327 9d4afd8e8621154c1f8e695b602f94f5c4103b7d py3k
+84328 debc2842b4b1bf94c8460818220e410519bb0231 pep-0384
+84329 0112f064cedfab2af8875a589a0c5cf1b4779192 py3k
+84330 d0b460a47f7ffa58df98d5c610421e0e752d1ff3 pep-0384
+84331 093a095aa74c648999664b8f67f089bed884b42f pep-0384
+84332 1aba7339fa6c2b88e535ea1f1caf4950b86cf888 py3k
+84333 cb1f5d054510e47a4cb306936f21a3b55a6152d9 py3k
+84334 34dfee590a3071b1effd404c61eb2c2ab25311b0 pep-0384
+84335 d7162207318f67cb08ab48f92e87c739ab48128e pep-0384
+84336 33c4ccafc4f538a12cd6dad2c73b8c28af59e68e pep-0384
+84337 9fac1970d3806f23b5827c3dac52b546c76be70c py3k
+84338 78e40316e02346afc677f9d35aa4789015a10371 py3k
+84339 eaae0df6d0630e1524651bc0c6fed3fccdf32b68 py3k
+84341 5dc06a059630adc36fcebac81d59d3bf52fc0156 py3k
+84344 0265d5f7bd072166a2b83ab94693c8865a3d1789 py3k
+84345 4c978cd3640fc9e7c44794b964bc584f38acfdf5 release31-maint
+84346 b2e8dcd15040341fcf7618d21a060ef518474f66 release27-maint
+84347 8f6e41c3a218a98f0026f5133c1f9aef870f5cde py3k
+84348 5c89f9571ba5490ec46521fb72980c11b121d3c3 release31-maint
+84349 3e20abd7def6e36008bad5a40ba7930d9cc9a4ed release27-maint
+84350 4bb317eb496a08757a2bcfdc8b55b233f9dd3586 release27-maint
+84351 9cba99068c54aa9fe8eccefb8b1b456c6b40f5b6 py3k
+84352 9297974604ffdb319a9e6d9f1184ae24ec61baf6 py3k
+84353 915da9f2da199e8b54a4d54da0efbf808885ae1b py3k
+84355 80d2e7d1d7d534fa465912cab4ac401f409b6067 py3k
+84356 9c51f38365632a1b7b785a278d514b2816ea0f0a py3k
+84357 726705d02add21e6d2c1bc5507af3d36c144cc40 py3k
+84358 efe9f6c8a31d4fc80d5371ebf88d05cefb3b0f56 release31-maint
+84359 8ad59b523fd8a06426f540d5d36172be1cf51ed5 py3k
+84360 e1dcdcb5201d484f8a0e5acb38561ff84e38e239 py3k
+84361 294101f77cbeca4a1a7914734df0be8606b4f659 release31-maint
+84362 e6b456f93447a1005cab1f46685b53ffd3c2df96 py3k
+84363 040ee94a9350ea2437802050a23b398b2297eae1 py3k
+84364 fe7214bc6d66b339ff1ff31a1fc6b1e9d3779bf9 py3k
+84365 a492f1ac0575479e6b8eda70ed7157d07f0136b9 release31-maint
+84366 5370d81a5f2d2b3004ec835e2cc6c9ccb90647b2 py3k
+84367 0a784f6acae76824caaa3456b16bcaa2e76f47a2 release31-maint
+84368 f92043c7ff9840e38bd622aca1d51a49a1743414 release27-maint
+84369 ea893db23e738c6088c5041437fee1b4a5491a0e release27-maint
+84369 4743738ccafe17ac9e5a3ce6d3431d81d8878b0e py3k
+84370 84883607e21a4b1afeae48be8162596041f492c1 py3k
+84372 7b2d0d77e4ac6e54773ae986990c424f4d063a53 py3k
+84373 8038929333a9c7829b5700d085fe2f1d1f911bc5 py3k
+84374 08f7ae10cc792aeab08e96d42cec51e8bc9fb7a8 py3k
+84376 ca8f8c6cc2b1b2817e144c770cff6329696973ff py3k
+84377 ac37a28ddc8f49b4a9b4a7ea867bda5f809d7bcc release31-maint
+84378 1570f6e9a687459eb7eef4e19d26a412daf7dc89 py3k
+84379 d503f7a454566b948bb1c76d3f5bafe58ae4fbf5 py3k
+84380 62930cb05ed8b8a144ae22e35b0b086f9254ae49 py3k
+84381 03268bf9a2564f84fcf1c8592831008ef7032fc0 py3k
+84382 4f2905ea7809673f0452f32f9d1d2be5f98c1a86 release27-maint
+84383 a0e756d92d600610f9bb819c5a3dd8630373bd4c py3k
+84384 8c2160b5c81af7a8820ef64c9c618bfb330d5280 py3k
+84385 9ca83c64f77ae155926d2f0a695486e32abd8b27 release31-maint
+84386 2e57615e61f0f1aca6e517868a6b55cab1fa2c96 release31-maint
+84387 9fd326af62d45c8dc2ac69032292caadb81bf05d py3k
+84388 4980b3e9e84a18149b6bfb70dc8c67338c13a938 py3k
+84389 7e9abd53b9298e70ff6e4acf068b7de22fe0e678 py3k
+84390 2973daa4724b1ed6af3d9ebfb94ec5a921954c4f release31-maint
+84391 d24870d00c4259f80c7764cf3936b20b622d62b3 py3k
+84392 b3b8d08f9d06ecfbd8363b4bb285b0b0625506a7 release31-maint
+84393 da19d02aaaaa3d6fb78e0e98a3ab8ff89950c7bd release27-maint
+84394 5a3101f558edde343acc4439add0e409e5824b91 py3k
+84395 41349817469768f7f2c28ab0cdff254d9fff3e38 release27-maint
+84396 3d1c7262aa14dcc3878da6429175a5a1d189279f release31-maint
+84397 944232521624bb78cb101f83fc9e32bb81a21599 py3k
+84398 d850c37b66b6f6fd3075a56d029778d2e3c048d2 release31-maint
+84399 061e27032e6193632fdcfa8f5d921de633b066ac release27-maint
+84400 2dc17dcc973469f29ffaf3e32e03f9ebed152ec7 py3k
+84401 de4207c9b9c128d82638e6c887077de90c517e7c py3k
+84402 3045eb940597bc2c44b245e4e746ceb47d0751f2 release27-maint
+84403 fa8b57f987c5f15b84594635e07d2aaa3f903452 py3k
+84404 d66807c5038bfb66f4f333580c8a7f96be2041ef release31-maint
+84405 6ba03322bc233bbdd2835ca6685dc87498d38f11 py3k
+84406 063b554d3153f36f6ee47c6c41b5d0e0156ef16f py3k
+84407 4d8a25a4d1f60805d824c1407db0062ead44ae6e py3k
+84408 925e9113f0aaeff13b63dea7f8e82e402de2e46b py3k
+84409 7a395bceac91af360d33b58339944a371c877528 py3k
+84410 4547b1491169037c0df54282f6a45043e3c3f02a release31-maint
+84411 fa4d78b9e3a2a6b84b8458ead72d57f74411f159 release27-maint
+84412 619afc81c9731e15d5e1db2f8b5553bba2e34647 release27-maint
+84413 fa9495316ca900d19176174d16bd00d627b7a1c4 release31-maint
+84414 a3b6419296e584bf7bda529012c515849d797f71 py3k
+84415 25edb6f438b926d99c91d7e93abb34a1d07c245f py3k
+84416 538ae6224a5eb5efed98f7a58ff99f6d09cc1306 import_unicode
+84417 d79216fc21ce75119cb97a1b53db166f440c6d71 import_unicode
+84418 82eac3c2c697df0a10bb2f0f66a2b4e7b2587e85 import_unicode
+84419 ed3d861c490ca2fc7043dd71942ec54fe5917627 import_unicode
+84420 a39ba7acbe28704a28215949721be66dd6ff935a import_unicode
+84421 e660e7bd799d70fca7a72fa34d8f4cd823e8216b import_unicode
+84422 80641c7a6f4f9c24ffefecac07684719a0db4ab1 import_unicode
+84423 3d7852b861284d9c6717a5eeb8509460f54da16e import_unicode
+84424 b21fd94f4fb37b33818638fccf10312059f94735 import_unicode
+84425 f0d0a070f128f2b70fafd8a3517faef4f4a5bc1f release31-maint
+84426 93d6ad85235341dfc217cd8e4d7aa7e6751f4e32 release27-maint
+84427 82211b1850d4da2bc3d702f16a4858295e40cdc3 release27-maint
+84428 dcb2aa41cd780a003cd7d10ed2fb55b6b1259b2b release31-maint
+84429 a0d8de04c3a82852bb877fa7024df6517b6b8be0 py3k
+84430 1f04b0076fd815e394d7bc4bf7f0f6ab0ab862f8 py3k
+84431 a7cadd7b34b526f02757d349aa369da53fa04553 py3k
+84432 47b93cda91df5b2bd2c97d704e02a625f8bc6dfa py3k
+84434 81a9ac73d6196329fb20ed08c014e1d94993ff55 py3k
+84435 0260e04d2cfc829892b8218857e96acc49d2e61b py3k
+84436 11fc798a8b432722e09f6ba0b478396a94cc1119 py3k
+84437 bd7435a8708b637ef2fa2b8bfd735d54dbb09fd1 py3k
+84438 55db60fcab5424270b5e15ef5f55b0bc66f61a0d py3k
+84439 b8cfbbfe1839067e75e2e73e1081ab4557302c02 py3k
+84440 d1c6b1ab5ba7854081724ea5d6ec98a1775b1111 py3k
+84441 8b94f15cb650ba1aadeb259200f736cb1a0f6ba8 release31-maint
+84442 4ad7efd909bce94bc2fa1eec323641344d4066a6 release27-maint
+84443 16cefdfed6820d2c564762198e148dac29bdb4d2 release27-maint
+84444 16d8a4e94dd087249622af9b3dea85f55c605ec8 py3k
+84445 33cfaa32c8e80e75ec58be9db25b21862ac8cedf release27-maint
+84446 8dbd316bebdf987251dca22fe2b60474c09e2cb0 release27-maint
+84447 d56b3cafb1e655efb81c85688449edb2e609797d py3k
+84448 b65d0371a73158b4b96e617f2808903fc5960e2e py3k
+84449 b8ee80863d63fab807fd7c39f59a9cccbeba3c55 py3k
+84450 7d1752d62050c9a3360fe84926eb09c3bcc2fc9f py3k
+84451 633166d4fc12ad92a7d8c1c79e8f3ab7d1ef04d4 release31-maint
+84452 83a6fff3f68334fd7cbda4c31781c10251136d5b py3k
+84453 1270451f46049d7a9d9166ec3bc03bd0b194ae83 release31-maint
+84454 35699f387da6e7d2d6dd676b18c64ec0a72924a7 release27-maint
+84455 98f337a6957c13c908eda0b9ed4d73e952b58b86 py3k
+84456 72640e71134418a70065a75634bc1de9847da86e py3k
+84458 5e33b27c71a861721975934e8bfe3c075df16b3f py3k
+84459 202747dae3cfaeb4d68b08181124e002633481ff py3k
+84462 ba87caeecb914f7b183667448c970a683675d777 py3k
+84463 b7cb27773e7291f5f06450b6a0356e2e2e6c05c3 release31-maint
+84464 70019c5cf35f8ec7cb3fe292c37c8de365d87b9a py3k
+84465 988718e9f93d15e2a937a6e1c86c0db42fd7fbc6 release31-maint
+84467 06e5fd4959e8a1e40405f0d2f7b2cb507c094e07 py3k
+84468 1f47206d577f07ace3d21cd157aea4d2008a6957 py3k
+84469 f8ba9558adbf915ba2f92370142d28bc5b439b62 py3k
+84470 3f7764c40c0bfb952a955d77c60a969e0f646be3 py3k
+84471 dbc95762cf58635c65d1715d118eb7b4a726a502 py3k
+84472 524b444a8095095a6d9cbac1be20e440d5553dbf py3k
+84473 e92ada642dbdfdb717d33c8ab39dbe77a1239edb release31-maint
+84474 895aeb4595c2f70e6ad50617b4fbb2ba1b195e50 release27-maint
+84475 472dcf50ca71c87fc831b9997ffb75502fbff2c2 py3k
+84476 53305baef588d857ce10b0622c218e3c34a55c7f py3k
+84477 4052d3e2865bf8a1af47ab47917c00c991181cad py3k
+84478 5e55e95d5c774b4fc2c1237513fd659d223d9f4f py3k
+84479 68fd430859a49c3a837e1e8a11796a5511c8a26a py3k
+84480 ea6d082a9cf80867cc1b320f1ff25ab101978df3 py3k
+84481 40eb59e2f2d3506fde7da5a75f9e225908a26188 py3k
+84482 e5ae03ef7fc13c8572e6344a38474861dafea911 py3k
+84483 de8d3d791e6a7f41cb85c3e8096b0ab00762d6ae py3k
+84484 03254fc83901163d3c493c4f40c7d0580dd76368 py3k
+84485 e9cd15d539e1a3feda005cbb9ecb3fee2945e272 py3k
+84486 b2b262c5daa863073a00c2b0ff449a091ee72016 py3k
+84487 b70d33eefd960e4d0c2d6c348be2d567f259b92e py3k
+84488 00c6957c77190b291bdbac3ba34fc0ae09b70e6f py3k
+84489 90eb4c973f52aff51a5fa9f135223b643c896c76 py3k
+84490 0af94ee99a484bdc2521b3d2ba7119741e587430 release31-maint
+84491 9197bae619aa40b25982a544d42ce3474681d6a8 release27-maint
+84492 ed45a26f6664da71986234abdd550d2621c726d7 py3k
+84493 43319e292d64ba19a9280727af782dc36a05a30a release31-maint
+84494 58b8101eac238e6053ad1825a196d3bf6480b49a release27-maint
+84495 0f6ee59c2a763a82a75aede59513b419897a3ec8 py3k
+84496 dabc115116bd748d211ed83ff0b9f2185079e55f py3k
+84497 d2b8f11032124bbb2723cf72223569dc6ef50996 py3k
+84498 f994e6fd06806214242926f683ed803e63e3c80f release31-maint
+84499 8ece29c8bba28ed5a6e241c4d0e8be4d1472db08 release27-maint
+84500 1b5ee6e845cdf01737d8956f9e77f36f5c925705 py3k
+84501 72523121127327c022096d30e7b28a4a5a89495d py3k
+84502 ce546a1b9fec1f60bedb3f3146d06f098805cd7d py3k
+84503 a415cf94c7da7f358bc495ef8ae5d631166c8b27 release31-maint
+84504 5997ae2eab371917874b73d26a3133c7c3a0b262 py3k
+84505 c3ad883b940be4eeab752b0eabdef6df6009c005 py3k
+84506 78ea4422df4c2c8d813bd37c5607705980bf6cbd py3k
+84507 23cf54186f56532069cf83937749e8a8c86904a9 release31-maint
+84508 98083f87645547262d981627c8b0641cedafc362 release27-maint
+84509 9720836aa3cb893156d44c37769ad574c95087c7 py3k
+84510 61c44793238d1714ecd0f69fdd51a908a24fc2f0 py3k
+84511 b32cbfa967394e3392ec44b01f57a8385bbbbeb7 py3k
+84512 c78eb016d1c51486da611f40795661f715d6775e py3k
+84513 c4b34b2a5cc0eeeb5725aad7c003777dc3015d7d py3k
+84514 0b0bd8102891bb93e6eabf60550b63c603785126 py3k
+84515 7a34def35de74bd72fb65c1aece3c28b86e054ca py3k
+84516 3c36849f06397b5a1f46204cd35454b911c6735f py3k
+84517 a8d54e8023f21a62f3b36ba382f04dbbdac3579c py3k
+84518 8bb162b01926f5af98bf499bea3e68851d8df896 py3k
+84519 263b1077ab975b3dee09e66032ec60e9893c02c5 py3k
+84520 0d86140755f0d495393e8f6610155ff9bdeea8ff py3k
+84522 56dc2a5af20a1aedbeee4909cabd6f015d5479f3 py3k
+84523 62098751da67b5eef9bb85b2157122a22dc0714d py3k
+84524 16119129324d41faf3447a3693018f053252ed75 py3k
+84525 7d9b4e018c62e923dce952ee68e00ef2eab919c0 py3k
+84528 78c4dda7cdc63737fa2487e15251df1e95a2b8c0 py3k
+84529 51048f6276ce84a3c99195941d050fba2c0efed3 py3k
+84530 dc5892f73e036df8460cdec02cd7a1cba2c052ed py3k
+84531 4f7b56b7872525617c56b7bfc8497f2e30d21a71 py3k
+84532 a75e98937542bc53234329d06c42157e7ee0cc66 py3k
+84533 b0ab832f8921281882e4e217fc0d3309a08fe533 py3k
+84534 7814dc9f31a25c9377ec66c53e319c25a6641b42 py3k
+84535 7e0d866ca8714824cb2a9f8e54eebc859838e768 py3k
+84537 7a7b531bcb64d125dd3bb01f4b7031a7004598a5 py3k
+84538 7887971dda483bcbff219f1eba59d30f0ee49f1d py3k
+84539 2139160287a11a2d06eaab1622ea930e3111564f py3k
+84540 56d4373cecb73c8b45126ba7b045b3c7b3f94b0b py3k
+84541 1d0d33c0515ee8bc6ffe674d9a1c2ef69c91053b py3k
+84542 5c99f8c90e6641654a33d377ef20ba33d878919a py3k
+84543 c34892575bc0e4af1110051000f976a1cb4310ce release31-maint
+84544 87aa62bd17156e9e288adc0218d73afafc33357b py3k
+84545 8ef68ebec0e1e2e6b168fc127f678b5ca497d81f py3k
+84546 69cb09f264240ca3c3031760df3a134d60f24550 py3k
+84547 e558ac425a5185bf1b5608311624d0956ef12624 py3k
+84548 071225af64a3d7056b0d5346a00de97ac128e365 py3k
+84549 657f795199b9e7e349127effc2ffe297635e4fd3 py3k
+84550 6324d23963a719045c534fcb113a41fd62f27e92 py3k
+84551 d38937471f8984ac9605a9e57bafb22c71dc6172 py3k
+84552 39aaa2a7fd4bf6ea2565e43cd1582b416b33dce6 py3k
+84553 1d374e5ba2f132eb99b7d55c6dc411ce2ee7f609 py3k
+84554 49441e88ccc14ad48ffc1c21a364d1161b76958e py3k
+84555 d939c80c666bd3738b407799e276d5fac48f3111 py3k
+84556 062ab51474874597ceb65e13a384473a9a1a7772 py3k
+84557 047a9d7ca241dc1b8cff6bbac8d093fb8c48dcef release31-maint
+84558 2c2a38e0cf3076551cac8577d16deaf4b1b9a333 release27-maint
+84559 9bdc5901207b8cd80f73c75dc7cc5ec7bfba42a2 py3k
+84560 4a1455d368ff5ffadc814f7e9d6abf55d73a12b3 release27-maint
+84561 f6dfd6c563e1158a486c6f3a64edda52e7b8f8be py3k
+84562 21405812f31270cffa460d7dc43554eab8ccaa5f py3k
+84563 0c0f1d0eb77e980f70fb43ecd83d8670bd456855 py3k
+84564 5413387959507119a11f699fb6489b3fd190ef39 py3k
+84565 ef16b4b79d547f62989f20a8e4c4e4c9839966ea py3k
+84566 6a8b5a618e7aef0c4f46ae24634000be6caeaca2 py3k
+84567 b306105bf83dfa265efc025acf8a7e217ab93976 py3k
+84568 1247fa7517721adca7e53541ab173710eca9acca py3k
+84569 faaab5a657eb549b217ddb0d4b2b3b009c101a26 release31-maint
+84569 1692c0b6031764156273f2093773ae783b95873e release27-maint
+84569 cd918ac7bd554c896f593b96bb5954d2fa2ce484 py3k
+84570 54b7964dd7a95e309021026657fbef0d37b3c286 py3k
+84571 5678759a8009a707d856b5192659d3fac7bac60c py3k
+84572 53cd8ecdce8ae671ab596237ff6d2af795559b27 release27-maint
+84573 b32fda9f72ff95d14d1e0caceea0e1e646e49bfd py3k
+84574 65642f085c55c945a9bb0530a490b2920d418ecc py3k
+84575 11ba6397e3a4fe4747ae1156a07c186f8d12714c py3k
+84576 c2f8418a0e1461391df612c5fd2388732347e2c6 py3k
+84577 e07c4483ad3b6fb1515d77c890cc2d910e85d640 py3k
+84578 9ced7f2f20b3f1d73ac73c19dc191058e6f2ddfd py3k
+84579 94e1f236c88d7793f6bb17c4cc9e32f3057d342b py3k
+84580 6ba20b9039ae699028f98240f91a3a48a0686178 py3k
+84581 e83af141dffdaa8f55a27ec16c4402396fa858c3 py3k
+84582 1a1e7254d965567fa4d1e6ac1de15d23f8b11908 py3k
+84583 e4de2176f98e30f4c4e8b0ac7b5c4259a0bff8f0 release27-maint
+84584 4ac8ae7e8022c44ecce71eb901e1df3069a1ae69 py3k
+84585 adfa1e488734e2cce572b8c251548dde99c861a4 release27-maint
+84586 c2199175ada8de81f2ce1faca5bda65fc89321c1 release31-maint
+84587 6095ea9dcff40095020ced83526459ae8538b6c0 py3k
+84588 1c22c1e453d4a1cce785384c8378df10d2e1a244 py3k
+84589 84c24db13677c740210af2a46c83374e1b5a8a8f py3k
+84590 3e5a89376df54404fcf51f09459b054c04d254ea release31-maint
+84591 7432e508eb66a9e0c8adc4466e5a025a78f7cc87 release27-maint
+84592 4a3ddb862a72cafdf5aa831b0e5e0ff18f8118d5 py3k
+84593 5dd1e594d9195eb51290851a01a3a8d17901811d release31-maint
+84594 4b68d47348a4dab785456229087a06624779c4a6 release27-maint
+84595 770c3ec056856b4484bb3462782394e42d3c3a50 py3k
+84596 89fe5179aec5f00c582f991939aa01491fdfd74e py3k
+84597 91c7f44e4bea9dcafa183a42ebcd603b0328eecc py3k
+84598 b2f7cf9c6776359f275160fad153d588e217317f py3k
+84599 63ceef0453f406abd20f9c4f5f2219c7eb3842b5 py3k
+84600 2400f55ea312530888885e0cf8cf89c02025fa62 release31-maint
+84601 5d73b036573b787f5020156a6dd035fa568284ee py3k
+84602 d6d4b8464b8cf6eb10284de15af9bbc0136c126c py3k
+84603 af414b29d4678713c24f93dbb1aa97f98788351a release27-maint
+84604 ef0a07d54dc17d30b849506216d442d21ffae1b6 py3k
+84605 4c64e688f665efd625047114f876470473d90541 release31-maint
+84606 d008f406dc98c9d1c3b7ddd4d651c69e514c6668 release27-maint
+84607 c2d6f0cf926a2f3e3fa00a16612d990d3e1a5b5d py3k
+84608 960de010081b763103a9574ad0a02db88d800599 py3k
+84609 384aee6273e805b696f033a5efedd42d69c85f3d release31-maint
+84610 03a6f7839d6d3532fee6bc38131166123a7f2eb8 release27-maint
+84611 558f338e132081177ec6b0be35a9767c42927aac py3k
+84612 e0623b6b43b637a32105c292f8d24afde9c8f69e release31-maint
+84613 baf1a482b57d766f7c5e6579515654594a114b07 release27-maint
+84614 8923e1493a344936ecb7a8c973073df354f8d512 py3k
+84615 d27d4bd488dc839464ee0c52e024e6b8ea1e4554 release31-maint
+84616 0fda82b1bfbbc538da6699be5cc42d17c7accf4e release27-maint
+84617 d5331712b509d57f425e1a0d7404c91754c59e00 py3k
+84619 79a14d3685401c3519d89185adcea6fb076cca5f py3k
+84620 e3edd2f9bb6ac306c164b1c03578d4ae620e108f py3k
+84621 e60ef17561dcec426b221ea2b22c092cc1f3e12b release27-maint
+84622 a0b4b2dfd9d5a813cc4509c74021c2e3d1ec214f release27-maint
+84623 851672498fe534db6e6557bf1195a16360bac80d py3k
+84624 c47ff3a53a4a51aae006f3a7ab26f3ef8b1dba67 release31-maint
+84625 575844427a95cfc1414ff0046da849ad67324c86 release27-maint
+84626 aa66df772e237847a339e1a3ede46f915ba84ab4 release27-maint
+84627 f8f66ebcd5b1eb71a3c82afb1eab6991eac5c70d release27-maint
+84628 dc5986d0e5a44316c272c783ad1a3ab4caecdf30 release31-maint
+84629 a4cfd5b5df96697531c9e8538f8feb6670b28425 py3k
+84630 45b23f3f7f6b9eccd44ed2395986ee0fd4873ca2 release31-maint
+84631 297f66cb37644a452708749a403662ad8d780e1b py3k
+84632 b1865ca7b65c146ce0fc5a2be4e1a2bc3d92e357 py3k
+84633 7c2eb5b6cc58c64bbe07116d8f985e2d69a7be31 py3k
+84634 8627c3ec971126f4094791be8d53f0d651ca8753 py3k
+84635 a2aeddc19b66b5c38e5219ac31b6e6e9e127b8d1 py3k
+84636 b1cf3f7f304cf084df4e199e022cf7dd7a3a5098 py3k
+84637 1322266f96115ad527c04ee6110a1fba5bf3c701 release27-maint
+84638 441e94ce408716fad675dd02a15ac3fb489b41d0 py3k
+84639 caf0b4b0569ead07227b614207f2cb8d2584981a py3k
+84640 a58bf66725f86f0c0f884dbdacb2717d5eafa1fc py3k
+84641 f8c896ad787f8d08b3725e64b71aeb00526b9fd8 py3k
+84642 2c547210f8c9f92ae1fadb7270c77b16ec1c248a py3k
+84643 462e0be3b6c46f6f7fe6b90ae91125712d378cb2 py3k
+84644 c88550ca0fafb64ae599cad064053a8e6cf58f4d py3k
+84645 63619b425ecaa3914ffa6ce9d39cb0ee71fcc219 py3k
+84646 fea86c5e3385890a53e340a170d5a1f849f0d716 py3k
+84647 71b264e1bb7164477911b18c5d5e6c658fdf0e8b py3k
+84648 9659e8c40079b29f26e5bdd42b74e218dbde7a1b py3k
+84649 ba54096b7a42890efab9b919cbd0b767660410b8 py3k
+84650 38ca63518085f574e4013204cd52834178460867 py3k
+84651 a51f467f5e1e80b00a5943b43567667b83317ddd release31-maint
+84652 d13c2f90c169aa76a2f06744797ccd99a9448287 release27-maint
+84653 027f81579b4a0ac01f562e5da67257c14aa82578 py3k
+84654 d4927154b77b8f23610df19e1416cbab69936856 release31-maint
+84655 fc76e8c617dc47c779d0c394978b28ab1e2532f2 py3k
+84656 ae4707949cb246091fbb62e6190483d6225e6f2b release31-maint
+84657 1b7ea43e5c7967b5536e4ce37cec09aa546b56b9 py3k
+84658 6f14f02359e80ab38fcd2745dbc27ad16a40a155 py3k
+84659 84217b2d8c0c06cd698fa60c526ee44287fd9f2e py3k
+84660 bee683cae71fc79de90f8b686e466deaf74710a1 release31-maint
+84661 f1207d9a9b07c136cc9122c31d8212a7c3d700c2 release27-maint
+84662 2da5ecd224ffe7fe749cc7af3c0f4629b95e0e6e release27-maint
+84663 5abacd3514851da274a1da7acee8a5b712b17cba release27-maint
+84664 b304336e0e35b478d50d9c17abb6bde34bb5de55 py3k
+84665 edd056c4a40d222560d69122ed71da85afbba55d release27-maint
+84666 b8e5125e6fbd736b1439139ea4103ee6d4c47683 py3k
+84667 457aa8da490a877feac052af04436d471004d627 release27-maint
+84668 c20de96a435ac609504e22799e06ea956d6b1427 release31-maint
+84669 9faa80d0111f1f32eeb473da9e5d51eb229d21fd py3k
+84670 b314adc9bcdeeadd01ea330b0ac37bf297f88c53 release31-maint
+84671 2eea89d093e2142108aab0740f30750ad45880ee py3k
+84672 c6669f4bf8c54edc553ccbcc317c68d0ae38a90a py3k
+84673 d0f9afcb0619eeb08e275d54bf8053828f66c031 py3k
+84674 378e157ac025fc99aeea94b6332489d5ab5ed997 py3k
+84675 b43d63bf0f78f104543a68f29891dda3f7b84e38 release31-maint
+84676 21ae4046e47101d92c63adbf8c47ea65b19cc198 release27-maint
+84677 7e2ceb5d28e33932fe21556708850e617f457f17 py3k
+84678 390acf5134e94aa4c22bd6c38379d215fe57e8e8 release31-maint
+84679 5c4be63cab4a22e19048f5f8c3ea2184c2e30918 py3k
+84680 9339738f8504f8837209fd2d5697b23764c452e2 py3k
+84681 16a42d5f2209c3ca139eb84e27a0c304f630ae67 py3k
+84682 9f0d69caed3b2de16858fc08fc5877d76d8270d8 release31-maint
+84683 e27030e0cceda8e8879987b89397a65b26460638 release27-maint
+84684 caecb6ebc83c2a56a0fc8ac0bd56947b230d009d py3k
+84685 25cc226dc9bd4ab0e24e48246ad739ff02c48221 py3k
+84686 252895d491570d5a27452809b582717be409b24d py3k
+84687 999d7d212f1792e04cdf3a8fc69b11825636513f py3k
+84688 583079de37e1390a8238d314516d2e6b530e5465 py3k
+84689 9265752a1c83d9a519d1b120893847ecf5e6c41c py3k
+84690 e827b9b8a7b4a5eea2ccbacbe0da0daaa501d57a py3k
+84691 1167e393aa4d6a4ee0aa38c763c8a69990310d24 release27-maint
+84692 6accc2c65cb847801eb7dc24710ed39d0a872ca8 py3k
+84693 56844b716cd7560ac1002fd70c1612e634c76b4d py3k
+84694 586a411cac7c70f8886c8c750ccf9bb274120c8b py3k
+84695 470a5360570cc01e7e59ee42d2b3d958a8600a6f py3k
+84696 a608fe1e86f00822447a0db54f531398204306bd py3k
+84697 f31e0c7c02e333d7920e233a6866f8299f4a00b3 py3k
+84698 e080f11fca19b0dd20fa9d0784be1dfb4c6b14b2 py3k
+84699 1764796e9eca2d355e4df7c0ccd32a6d58492195 py3k
+84700 fe47ea8972ebe6ba3f88b6256ac91d79a5d573b0 py3k
+84701 887ef39976d39dd85afd841121d225edb2e2638a py3k
+84702 efc99a207bbe7d2d628eb666236b1cbfaa65937d release31-maint
+84703 20a2153b0dda895d4b0a4c1bada0dc54a653d5fb py3k
+84704 1cfad55de5bd660a2cc7296ed61edf3cd56f12e8 py3k
+84705 5c9c04c29b2c0bfa8ceae7bd373f23b424dc6e14 py3k
+84706 ec92a9fd77806f0a7913be709386bdd44f4279be py3k
+84707 f72fd2cda3442f595042c44a407f0ef7276b9671 py3k
+84708 cb91307f7072ebac94e6abe199186700ae83fae3 release27-maint
+84709 e0a7b696855f40c94932e987ca54516c68bc722b release27-maint
+84709 521eb7fee67a781cab5ed1f538dcac97ba5794d2 py3k
+84710 1be874ce4eaef304424ce8ecf38a9d976b2fdadb py3k
+84711 7cf3bf0150a4d5c6024cc7046d377d0d5e2a8e56 py3k
+84712 00425209c46ee2557a76afb8ebcd0d6c3649d6d0 release31-maint
+84713 6eb4afbe77e85480c371084f1fb287a797d48eea release27-maint
+84714 d905c94f9ae1d1aedc627341615f1eff9a9074a4 py3k
+84715 8f81ed8acbb02444ea741a665e648a43fca8b448 release31-maint
+84716 601a0defd15bb2b992af1410f5cc7a31dffd0003 release31-maint
+84717 7c8f3459d9af8a76c3216476beeb8630506946f7 py3k
+84718 17a8f704f07d8942b57b52ad255260156fe40cb7 release31-maint
+84719 fd6737aa88dc46dfa3ce79a4364a7351e67cb742 py3k
+84720 533858a2989a2fb8d7d68a01a03838ee035a1232 release31-maint
+84721 c4e7233f548dbde8feb6673ea439599c393e2bff release27-maint
+84722 b007001fca710c5c060ee133aae8cce4cb89043f release27-maint
+84723 a351086105c53ce1433f66d47bd903e5f72646e0 release31-maint
+84724 5f3a64564c51a12861b0ae1f1dfeb41488f36193 py3k
+84725 56714e9c63efb84c9c572dee94560ba1382aed53 release27-maint
+84726 c35b42a8da3fb86d872148204f5da44e527e9623 py3k
+84727 f3b1eea11ce195bb37c1946e1d9d6fa22106eabb py3k
+84728 f4320e124b1fb1fb705e8b13e1c437f0d86cc428 py3k
+84729 b0c9a82e0ec5a337ea64f029b2ad3721b381f0bd release31-maint
+84730 852bb052156a8109c81b510e02fb299470ce20c3 py3k
+84731 ed43ebda35f2e5df39864dc395b7cf38a2f7a2cf py3k
+84732 63939afaf984b4a790cfed4c507ec3807a04ecb7 release31-maint
+84733 ef6f03971fb34870cd19c02579c9cd04919e2085 release31-maint
+84735 3808e379fc3ce93a778694fa93b28b1dbbc445fa py3k
+84736 3774f4def754f1f8a6b5a9ad931029785f15c72f release31-maint
+84737 fb90f2ff1764b9ce826996eea8d6a9d9ea7162a4 py3k
+84738 67ed6d4f70b1a66fb926faaad6a7bb25f8b0b063 release31-maint
+84739 7ac0e607c4d662a3bd647c52773ec37c0f348418 release27-maint
+84740 d2e58198933be48bf1b9fd1bae8183116db25758 release27-maint
+84741 8869b1b854348c4096fceadce3877e7394489abf py3k
+84742 63bda789d73b63f7aa83e736e23408f791a6f55c release31-maint
+84743 fa9510c796481a0d94658987d34819734cf54cb1 py3k
+84744 b7e244f34cc80d03b751a672551a841c2d82fe87 py3k
+84745 76b8dada06cbe6a932500b864966703d2be08406 release31-maint
+84746 4b9c8526ea4cb70ce480808f2a63bc53460ace96 release27-maint
+84747 6d282b58d90aa2fd36a8130986558d67299d4e7c py3k
+84748 2bb4dd2ad5b50707a8a9e1421e322e462eb8f58c py3k
+84749 7ab59233e83f69b5b371ff71188916209ce95ba2 py3k
+84750 921029507ad7d44c4759c9060bf9f3e3d5c03fbc py3k
+84751 c1b709076bf63a1d1b752229a679515a7b85947c py3k
+84752 9cdba6864eb60ca2a5934491d195c9598d971659 py3k
+84753 a3ee877fed89b5ed37ccb98d30c85d1eed110f51 py3k
+84754 b186afa370e6d1055e51cfbdc2146e253b6467d1 py3k
+84755 cfa119c3e43cfe872dd553d50538ba5205295540 py3k
+84756 ee967f1c731b7d036ff04315d0502cbf88615024 py3k
+84757 0de81647553ba04ab7141736e4af317520c91e48 release27-maint
+84758 9064fc57d3fa907d1101ff6131bba5049aadec6b release31-maint
+84759 1e89b5ee02f85ef9b2708ca446a9a16418566606 py3k
+84760 584b1eda11414763b0afad0b5ab38295c366c930 py3k
+84761 314d416f4d23e28c656dd57701e994326a6b550b release31-maint
+84762 b1e766c79a367749c9be3eafb721ced552862db9 py3k
+84763 add664924ae9911c04d7f1fc39548c7c3e1af646 py3k
+84764 b0d26e8d8a330aa5642037bb189a574de2c5caba release27-maint
+84765 2f8370538ffbb17c3acad9e64cdbd10eaea83cc5 py3k
+84766 28e6a41c5ba0b042dc8fdb909863da56872bba63 release27-maint
+84767 82db80b60b87bbabf3adf587ae4658dd762131b6 release31-maint
+84768 d0fc35787467469432c41ed72b827cd777c9659e release27-maint
+84769 1e922d71ce4bf6a18973f5337f86c34ef758af1d release31-maint
+84770 bba8fa88d19a21b93829f5edc3a196165867c874 release27-maint
+84771 a59ae93891319365806ac09c5c4718bc18e01b23 release27-maint
+84772 274a0bf46871ef3a591f2b93a313efc82069dd3b release27-maint
+84773 44199aa8932b7d14d03a0e0318a9b805a90dbbd2 release27-maint
+84774 557e2537c9ae23538d9ddb4ea1eb49bdc459dfe8 py3k
+84776 330d79fcb3d3d58628f8ceab3558153c9654a4ad py3k
+84777 0f3b8f928ec13d8f91ec490e5b524fe90ba7faac release27-maint
+84778 3d22ee65e4075a9b36b371c2a43815331e45b468 release27-maint
+84779 2ad8d7cbceabb01720591282f135775b45e5bbe8 release27-maint
+84780 ea121f8731a78bb555ca4250baed4efd0c8cf3f3 py3k
+84781 6ff0ef1fcb3cd98e51b335874a8682aae8eaa4df py3k
+84782 205ff2b02c77120ee20b177dc3b768be74647f68 release27-maint
+84783 7dbfc7ef39f2b636d30a876451313d977c18d839 release31-maint
+84784 557355e46ba619de53762f7530ebd4ed7f9ea5cf py3k
+84785 77c89c89f60e112289fe79c43d97bee257bbb9e5 py3k
+84786 2d084ad468dbd00c9890ca814960277df7e2e339 py3k
+84787 8234d26b13c19ef569d0481818bc0fd0953fc944 release27-maint
+84788 91a00b6b128bed0d04ec83e795fca2e0b36fa4d1 py3k
+84789 ea8483f9e55aa66093320c2f1422a8654cc01987 py3k
+84790 9f55faaa3193acc67242c322e9c633e4787c76c6 py3k
+84791 e2dec9c0d13cfcabc107ac84bc43d8fcc92b1135 py3k
+84792 cfaf0f7ee0c2c92ec3107bd2bdd626cb5e147f18 py3k
+84793 a60deecac2424efd0a3ed04bc3a503c09c989d22 release27-maint
+84794 3a2963b6f443e8501908fc71cf00803ba4581989 py3k
+84795 fbe5d08a98661399bf6571e92e8bc9e677a7ea30 py3k
+84796 69ed5ecb5026addcb522373e7af5afb6fc6a6f1e py3k
+84797 44e43bed674a54e59138418811e241480a9ef613 py3k
+84798 e5f0ff7d7a06ee90b3c6db993a9da5ae1ca82c8d py3k
+84799 4a4fbe0227aa49525fbaa2b5e3d5d066eaaf37b3 py3k
+84800 2d8e408593512ecc0d5d01850a8613e287d742d8 release27-maint
+84801 20c45cdad9cf1e8d41e6c5c92076b8ac5121af8c release31-maint
+84802 b274a90a8e2bdfe09a0a00543c8c39d030eb136b release27-maint
+84803 a42db8f54ba1706d318ad76e5bbfe73ca42e811f py3k
+84804 123f3514b45b527bf2621075571e47352dbb157d release31-maint
+84805 db9e62c265ff50e593cb2e467cdf657dc2bede1b release27-maint
+84806 7f99ac53014a54281f99bed1c92de2f47215481a release27-maint
+84807 0e96f9fa84a24a69f5a1caa4c8134effcafe2e93 py3k
+84808 fe5f9cc4076ebb796be7dafc9c5be408a6e5052a release27-maint
+84809 80d1c7734df257e47a9c61bb84aa1889447d9a38 release31-maint
+84810 0e29ae51d9bc6ae03a97f246134facf07cc18569 py3k
+84811 905ee9e3da6de071a81d575bca96b8a549e57c8e release31-maint
+84812 eded0caee621331002e9ae58bdbfddd02c9c7d79 release27-maint
+84813 534853ba8cd36ab5f2ceec8ac7e865ed5a91faf8 py3k
+84814 2bf2a7a4e17d6452be740566696c2067cb3094f7 py3k
+84815 d7ae1b9f10ab7b68033d8876e8d626b51163de43 release31-maint
+84816 2b9dea2a2fffd6291316c4ad8a19dd98648ad70b release27-maint
+84817 071bd8f3535ac0dfceb404a26380d4979bf129d8 release31-maint
+84818 3977dc349ae79430a07b5e9604d3cf5b1e37664b py3k
+84819 9151d5faae3d6a8724a5b75bd72165bb6539efed py3k
+84820 b81e8e3fa5bbe676dbda084fcec9baa0e0483e9d py3k
+84821 f643d53c51bd8b172ceb1988ebd8a507740bb19a py3k
+84822 e633e3a6b25568fa0edb39541279ed39d93b0c0f py3k
+84823 b6951b05217b21aac68770b3ce3f62f76f453b3a py3k
+84824 35848a3b7d8a5afbd2ad8250bf864ccc34d552ca release31-maint
+84825 7ef5c6be723297ff7726dc43d20742aca4a81386 py3k
+84826 9affb4d6e97e2d2eaee3e75e0f42564d145f0a37 py3k
+84827 c779de64405a903d418afc317ca6670e3f179c6d py3k
+84828 d88fdf5c5b37642e14b9fd8fc380ce5d38e40e2e py3k
+84829 bed950cbd0c01e530db691c0c6bf2bf780583a40 py3k
+84830 5b0187c0d0024812cdc20f3cde847776a9a1b5b8 py3k
+84831 bce9793fb5450ed91b55aa41ddff79cc5fea9bf2 release27-maint
+84832 a97d12e5465f7952974d4d0ec809bb0e05281be3 release31-maint
+84833 61dfc79657d737d2c072cecc0fae02d1d20ae3fc release31-maint
+84834 c0d3167773a973238ba68d799a1a2060416320ac release27-maint
+84835 beb9d176503e462a453ba7f97ef972ce639e1ab3 release27-maint
+84836 ad63f966923c41034163aabf0afc80c72665f8d8 py3k
+84837 3edc26380e496ab0f3b86abb27cb5f65048eaada release31-maint
+84838 1debff42ea46d113ec00e02e1ca40064291cba72 py3k
+84839 f2ec0115f8b203e51d47835c0c93ae3a30e7756a py3k
+84840 a16b67d4f30316d10cbc4131f6c3fead284bf85a py3k
+84841 b5774b27b3dbd9aed2f881487025efca348dc690 py3k
+84843 985072cd31d03b82fbc8b54597a71e8e59160f21 py3k
+84844 d657e8a60126649cf9536c362c4dfec873735f34 py3k
+84846 d1771b4cd0cba832ab7a1447366885388674e5c7 release27-maint
+84847 1be950dcbb1a5f81aecf2bb4fea4ca583a1dd72c py3k
+84848 2324167ec01d3aa20f63531e5c4396899dfd5c20 release31-maint
+84849 3f0004736d2839ca446440c4b0e4c27e77ca8f7c py3k
+84851 fd5c4cfed7cd0c3adb0b37a5b63dbc3409bc6721 py3k
+84852 a177ddde45d1b74a16779ebee6df4ee22160ffd4 py3k
+84856 5761f8e352ec21fdd6e763d8d02c06ff55830d87 py3k
+84857 689a813f4afc0dd9d966bd0873c6ffd4e50a05fa py3k
+84858 a8869af5d5d0ca675269ef51ef4be19f1d6dd926 release27-maint
+84858 82589a889e070ff77711c7fce67a71e024ee0ea0 py3k
+84859 c438f96346e90f1abedf7b3141abd971eda58963 release27-maint
+84859 e3c3c30f14098088a4d1f98be5aa8b7fd39cd8a1 py3k
+84860 fa47af73a691e006bf7105d7e6541135478261c1 release27-maint
+84861 ca3542adee0daebc2cad6a647f69bcde1886d042 py3k
+84862 e0641dbdc8f62a7e9ab63755ea84736b6c17b3f9 release27-maint
+84863 e39ad5dc11cfe4d740063b197da93ac72c28a818 release31-maint
+84864 dc422daa5dadd0bfc542878442da51ddce7745c0 py3k
+84865 a431c48ad42b1a19831aa5c1d45a4c8996e4a817 py3k
+84866 f77cb8d76e99157a40203a44deb6f51b27dadd62 py3k
+84867 cd2ef75287365b6e9a554ce2ccd6cd9251748fdc py3k
+84868 938d84257d110260dcc1266656ca81d7c0c6b49c release27-maint
+84869 c87ed6f58b8309881f114200e87e1b5cd25f2970 py3k
+84870 df39b0bc410673b581682c6ec1e493b176eb2799 py3k
+84871 006490f0e71fd66ec51d3a4d44c21f316dbfabb8 py3k
+84872 01dbb827717889625faa5078f6812e77e9c66b3e release31-maint
+84873 1518171775149c7cadb1c5332ac345db4184124a release27-maint
+84874 d060474e0e24585641da48fffaec99f6ba1dd37f py3k
+84875 2f280727a307f6ed96c70cf485ee561762c16897 py3k
+84876 2867ae902fa3147364643fbab80f5a4b2cb8b501 py3k
+84877 d390400d71f7b96ec231a4c1f82682876f6a362c release27-maint
+84878 b49aee38779bc0a9db267158cdc334ebf991e60d py3k
+84879 4aa2a20ac335bf05a5ad5f5e29e8cd3080deccd5 release27-maint
+84880 29ead54c05ad877ac1af85a10d84f8ae9e28e13a release31-maint
+84881 2dc1d187ee04ae3ed3d1daf7749d1619f8c40093 release27-maint
+84882 449d104e1836273aeae5d8b760ce13ed685e42b4 py3k
+84883 4981cf0a9ca4cf9e177e93e7a273c6c82a056e04 py3k
+84884 77425f2d7d7659757649083381589f51131a8a6e release31-maint
+84885 04b45d451059f50f1efaf303f6d987d73528b69f release27-maint
+84886 9291aa3d8d357237752b4b49e3bcbe4f2ef26c1b release31-maint
+84887 f3dcb314c3e302e55422f86c46ec76a3ae606a17 py3k
+84888 71b95942c3a49b88922f91888630b6cbb8cc36ed py3k
+84889 9dc84522448612981289a257ebccc3a196414a56 py3k
+84890 b69842b50e2638828f1b34b346c85ca2288b3b79 release27-maint
+84891 65f5e2c3f2dd191980ffa6d3ffc99dede574502b release31-maint
+84892 92588986b78bd28adb3d02c9485fe1f99a470890 py3k
+84893 e5294ca27abe2d123040a3e3d396c7dce198b3b4 py3k
+84894 f7a76fc97b220df3259c4d2e13306a9eb13224d6 release31-maint
+84895 451139322a131195d70031bb314131b907dcb784 py3k
+84896 cd5b9a70a685bb73398339bde18cc08369ea96d8 release27-maint
+84897 501ae94e5bf615840dbcf02ecfd7bec6523b4227 py3k
+84898 44c89c5993c83a18977d36c8de0a212459b16487 release27-maint
+84899 0ace9eef120be1f1f1a49542c0a2377d2d8d7686 py3k
+84900 a48e031d8178fb80ca0a9ec336fcaad15a79ab02 release31-maint
+84901 785a96fcd340df2d594fa517ac41e0af4eea1ee5 release27-maint
+84902 b29e8556015cb7310a185870e6fc9ae221142417 py3k
+84903 a05433060941186e1994aadb06eaa695ed985ba0 py3k
+84904 534af91f38454062fe26dc71782fdeed63f3dcf0 release27-maint
+84905 933d4b5b7f3d68b78455b919a5bbd3fc74f9605d py3k
+84906 76051eb07422c788f35d32c98a220074ead5d7dc py3k
+84907 8dfbf66f369cf5a2e7aa562e7d8488e179e7934b py3k
+84908 dd3080b80dda9194557dcf234a79b941ba7bad30 py3k
+84909 4374b1eaead1776f5b92d68bd2864721d8864b9e py3k
+84910 17ec9ed50133b8baedda60e28323c6764da14623 py3k
+84911 036585382de19bb97f1510c02a7116f5f56a40a7 py3k
+84912 4f4bdddac25b23b65324b6db37d8947c9677beb4 py3k
+84913 76fd68bba1a885a45f07471dabbfafd62df82e26 py3k
+84914 8e428b8e7d81586e23b5f92f9ca9b18daf14f449 py3k
+84915 6c77757d088115a01cdd2931f002d70687a2e302 py3k
+84916 b557253598b1f9cd3802033b01f9d7be3e704188 py3k
+84917 ec028067049da67c751d279858db71d7bf6d40d6 py3k
+84918 2cddf878e395553b6fae97997238a1e9545d4e62 py3k
+84919 cf88171499b5a7850beee7aebda42feedc156453 py3k
+84920 3a4afaa96ac3323c0dc457313191fab04e577e6b py3k
+84921 486c2d6a75465d01f616ba16ac8a50d6ac7b29d5 py3k
+84922 a88dff27be1f7b2eb09d09804bf4d9fa149b2497 py3k
+84923 f35bd08c12aef2c46b4db79a8cfa7fde9bafc399 release31-maint
+84924 6bd276f5d1bce799675f8c811f1b827983e2b0d3 release27-maint
+84925 96db640674cb7aaa53ef0941d96277f54929be20 py3k
+84926 3cace1289de488bacf620ba14ed44c875f5194b6 py3k
+84927 38b0d5d0dd30e50a7303e4f43d65efdb1cefaa45 py3k
+84928 0d0f1db634313f36313e14b99a3b52cb68f8d85b py3k
+84929 00e4ce31d4040d5c34b657dd179cea59656823d1 py3k
+84930 a6af9c7c8e67e8e46c797809b813c76850ac88e8 py3k
+84931 861c35cef7aa9e5226d4cc2eb1e9eb529a1c9848 py3k
+84932 2c73e6ce6a7568468c73836a1c7263cebb166822 release27-maint
+84933 bf011e30fc07627b528ab8cf15b854d4978a6dd1 py3k
+84934 47b10e4a51d7e8d4c0dff764e48ec2fa7673bbe7 release31-maint
+84935 364d6ef7ccae4cc24177ee458d7d3c999c3d47ca release27-maint
+84936 e90427984442cf5b989bdb304c0a5e33fad15e57 py3k
+84937 603679d8532930892a2d887f056f088947ee6899 py3k
+84938 7d45f539db97c811f2c575f0e6a491137e40ba51 py3k
+84939 b1ec48b7ffdffeb52afdf2b275e8652ee76133a2 release27-maint
+84940 d8bb98e42c2ffca38e8fa7c68ff3e15adcdfc549 release31-maint
+84941 f8ce9f359f3a64f91dd25c6ef11a3a83960fe5e6 py3k
+84942 a0e0cb893e31e320caec781ab5ec2d786ced3c1d release27-maint
+84943 3359d2e0a9671709bfd60ce3d026d77b45c5bbea release31-maint
+84944 e59a188258b348838ff7d6244c08f3d0b2593e34 py3k
+84945 d6d655fddf22acecdc69c15c3eb37c2f2557b6d8 py3k
+84946 4889a816eec169d8aa95dcd2eab7633f56380b16 py3k
+84947 b1f5134b0049bd68ead995d585c2ca31f3fc95ae release31-maint
+84948 4ec121156ee9ef49270ff41d5c83c2bc984b8f0e release27-maint
+84949 a4ee8a5c684372445d860ebaf30503368d54bf62 py3k
+84950 9ad69fc4aef75d1c301f85e407cad98d864d90df py3k
+84951 8ceeb59f4550af51da474508f68e9a1fba723162 release27-maint
+84952 08bd1a08c62f75e4d6393aedf5353180427cea5c py3k
+84953 2b9327777832a244af21ff72aae85d0c94030db8 py3k
+84954 9e2216420cd795b29b378f866a30a896aaef2a5c release31-maint
+84955 c53770b1546dad4b929959ce353c732292c961e3 release27-maint
+84956 c9edbce3fcad8c6cd2d543102a1be70bcfa155c4 py3k
+84957 e1c8eb390507028a91020d6b6976243b59a1022c py3k
+84958 05a5f71c1a78f7dcd8d994603210034f62ea2b2c release27-maint
+84959 8208a43191e29c924700a9088b8cce1c980129d6 release31-maint
+84960 8ac70b12ca61fae21487406743e1a32b8f47f766 release31-maint
+84961 b3d0deaf50e5232c6d9bec75b406d5bedb2c39cc py3k
+84962 d5fe040f4a48a2780fe3312d93818d5880083582 py3k
+84963 6b9f88ddb4cee9149a1cfd5f7903f7b413893f78 py3k
+84964 f2ceeaaac9380b5423e2c53d3d9651a2af05af19 release27-maint
+84965 ebcd811558d67d60467a22500caf12bae24dbf6d py3k
+84966 3474cee9c758a86e9427e31e1f5737cffd5bfd21 py3k
+84967 d5001d6c77368efbdaef33629b192256321c5072 py3k
+84968 f703a643e6ce07b8c1958fe0a74d81f62031f15f py3k
+84969 225a6d1cf811f70a74832118dbe4165a94983e02 py3k
+84970 9ea504d45eeaa7e1bf428f8a6429dbbcaf0579c7 py3k
+84971 96e7ee232abf11e2dcb83ac17a8e9664e9d8eb33 py3k
+84972 dfd5584eb1acb599bd42bee4a8224cbf9e94c615 release27-maint
+84973 a676ac06eacc087d681cd3706771cae8e208085d py3k
+84974 ff92cc356c3583134a2c535df4e8e612d6e8a75f py3k
+84975 ee152852c94df946742f690fe62faad9aebb4869 release27-maint
+84976 f4a1c796bc987453e568f62c5ba4b5ec2cc6a7cc py3k
+84977 633c6b11a5a9e7851af971366fac9312ac24f59d py3k
+84978 d560eece0857f06c3d0d53d8be686cd50fc19e8d py3k
+84979 e31492f440c9e8e51a9be2b5c3e1b07f3404c863 py3k
+84980 a0ecb8e2d769e7a3c26affeca55c08ee903edc5d py3k
+84981 51d8fffcd260e80aa25d531180062f37fcc5842d release31-maint
+84982 20f345fc036114b94f5f99fae47645cf9e829a42 release27-maint
+84983 d088faa35456eafb7e62545322db419e4f8baf93 py3k
+84984 2e5bde383a5c74aa18f2e44caf601a3dfd2a92a6 py3k
+84985 0c77d00f4f824e288b4b8148bfe17ffdc92b36ab py3k
+84986 ab3d92fea9fda5e5bf9de7e752e092af21483151 release31-maint
+84987 1debccfbcbc9a8eed08a39506c0c067770bde818 py3k
+84988 28d41d34a2e6155905548d53b3662a33d9c2b393 py3k
+84989 7aca458461ab271e703ff8be154c3869182048cb py3k
+84990 7952cfabbb8875f9874e7627df4abea8aee97e81 release31-maint
+84991 87afe47429c56d17f4954550be7285cd6efc2a44 py3k
+84992 aa56ebb8fe94734a32f109cc0ea850d9e51c7867 py3k
+84993 260dc7de1e87be9b5ab7fe3aca2f1fc8204c9967 py3k
+84994 007228d0e56984631e8800e76b819e1e8b6827f0 py3k
+84995 235044b39a9211a56bb4d4c96cdee798e19beb30 release31-maint
+84996 12e0dffef7bd24825bb3bd7935e344766e07e379 release27-maint
+84997 f6a0eb730a9b784bc0b47f3ca5dc8dd023d795f6 py3k
+84998 8cc4be648ab4906ddb4d6c1b65a616810d71be4a release27-maint
+84999 260dc36c2c861ef7bcca89ed4e8285780cbb1c20 py3k
+85000 b9453d504f8ca4aefa285df4d13b24fcf094bf2d py3k
+85001 b278d93f958eec184383010012eefe384f0e8204 release31-maint
+85002 e5b70793566edda5ee4aece534710285602e677c release27-maint
+85003 c9e299249323825f63bbee8a088725fc2221b6b6 py3k
+85004 9774c11e03f6b0b8d8532b1205717c02d71e4359 release27-maint
+85005 4cd0edf0b3561970dfba5bd0beb92b343f6fd935 py3k
+85006 c9b08c58f0630b91c9b3f882a583896c2e2a33c2 release27-maint
+85008 0b48c6f8671fd4e30c198bedcd55624dbc6a8fd0 py3k
+85009 c52f75c3fba2d86498a05396f32a7911c1b0f8b7 release27-maint
+85010 6511165e4830d8ff6846d47995db7f1b2e34c126 release27-maint
+85011 bc7d8808f195c9d25147c7af0340f83e91002b73 py3k
+85012 265f7017772b87112f06561e7b51b367befd219e release27-maint
+85012 43fd9e2b5e7d1fc3cbc4cfcc711016d7f172cd09 py3k
+85013 63ba7a4e7c102231af6731a54f680d287519e5e2 release27-maint
+85013 409d6c76c307e430cf224fc8e6e617478176a10d py3k
+85015 403af35f49487b94e68110cc773e3539d1507c27 py3k
+85016 6c68dbf932d0684f0e3e874ed75a1cc35468adc5 release27-maint
+85017 ac8aa225c4175afdaca3287a6e6dd303dcdee697 release27-maint
+85017 28e8ffb2accb69845b11dbe9e90724539d188a5a py3k
+85018 26dfe44c9faa459f0d0e7e032d9118e16ec28ced py3k
+85020 05c58b3d6d3941aad31c3ae4614d75b9fab55192 release27-maint
+85022 7ac30d58b1d216d83a543064a4a4f20b7a3b376d release27-maint
+85025 2fc73d7c7622d206ee9f319d41f1fa0a9836d9e3 py3k
+85026 8881260d1d14fbd9d1ad1d8f4fd86e3eb03eed4e release31-maint
+85027 3f0ffc8199eafcf0311e9c520fcf9cb328cccac9 release27-maint
+85028 fd5e51035335b38b9d0db43311ea88cf9643818a py3k
+85029 e938ecc5500548ba94565da782208f8fe7711c17 release27-maint
+85029 52efb1044de5934f9731954599ae602f880fbbea py3k
+85031 ff5d3e5c4bb595880be378f189ddd690339888e0 py3k
+85032 aed04b3f0fe3822ff5374aca21aaee88fd602e2c py3k
+85033 6b49ea11b157790b16f626dd72baaa933b07f7c2 py3k
+85034 5a7bb85a5d99c35637bc4438365ace65e230f8ac release31-maint
+85035 1dc2b50d344f85e63c9b4c150d4055c900baaac1 release27-maint
+85036 7bda0a632b0d455c5494e12e7bdeb2497535a801 release27-maint
+85037 4d3fbcf6f96a0e8238887d564e57d8e9246f8b16 release31-maint
+85038 ce4a22fc9cc441c953203ae4e96ab5458b128001 py3k-ttk-debug-on-xp5
+85043 3d490c3a019e210b634efbb7a1104d88a996ee13 py3k
+85044 f76ef1f462663706404cca7c12cc6f94847b2b04 py3k-ttk-debug-on-xp5
+85045 7dfa9900f8c7885cfccc9c0aa9a1496d4df444aa release31-maint
+85046 e12ba42f861fc7eb050cc84230e41d738835de7b release31-maint
+85047 e382ff741790262e9cb4d9f375c16a0a37aef7a5 py3k
+85048 c8dc4b5e54fbd4e14cf56552c7b969dbd78e4a44 py3k
+85049 3f4273d30b3852511a36021d56681c3f36b9d766 release27-maint-ttk-debug-on-xp5
+85050 098123a7a03cb7b1a5c12b7a4ab92a7d9e46b6b1 release27-maint
+85051 4c48eba12123ee56791cb8f074a4b30708543fbb release27-maint
+85052 694cb5d86525150cc1ef3464e6d1c08946ed5ef5 release27-maint-ttk-debug-on-xp5
+85053 a4b3998a7ad42da61003fe57e09475e68a2faeec py3k-ttk-debug-on-xp5
+85054 fafe842e3200cb8ad574928b1f8350a713ef137f py3k
+85055 4e5d201ff29401b05897fe599b53ddc3019de17c py3k
+85056 353f0c2baf77d2dd5f909455cec65aea12739fbc py3k-ttk-debug-on-xp5
+85057 cea37fb03dc0f49fdfccc781763997c54559b330 release27-maint-ttk-debug-on-xp5
+85058 45f56e30afa575f322d13753304f44f54b4dd7bf release27-maint-ttk-debug-on-xp5
+85059 9523dbe0b6499e9a10fb6bc31e6d5f8a8868cdf3 py3k
+85060 e062884765d65adf8491ef28d73453e997594bcb release27-maint
+85061 05ce585f64c488a89a6014dd637e55b7b751de02 release31-maint
+85062 e332cd95f414aa089cdebd8b4bc5cd44dbbecaee py3k
+85063 9da13e560a3a96dd54b3c1eaeff2bbee519af256 release31-maint
+85064 afb2f144b98c23655a8ed8ba161c488938fabe67 release27-maint
+85065 43b79d80f5aeceaba307cad9895747a2329b4b18 release27-maint-ttk-debug-on-xp5
+85066 7d9baf649f2d8d7dd2417f9ca96b548c75d45371 py3k
+85067 64e4117f788754aff0423dc090a0b8e08a10cfee release31-maint
+85068 d1bee7cf6c2f2ae5de55a9a91d68e5fe16925096 release27-maint
+85069 fad78e86d16ecd35bbb59bb7cfdb68b2e6a14672 release27-maint
+85070 dd94ac2a42b17efacd511d754c243f8d4f99b52a py3k
+85071 7e275a4cf9410d4290dbbc4cd4784e19a1b68fcd py3k
+85072 a08e42789e6d51d2246352dad48fbae7881ec689 py3k
+85073 472a6eec196abfc14dd504389e3cb320e5fd6a24 py3k
+85074 0f8c2eb89f46d5c0fab73b872e92fcd1aa140f98 py3k
+85075 dc3833984734b2493edf21c218fb6b6326a1b5d8 py3k
+85076 6c8adc200ee02f1d3a024f431b9efdb3b82677d5 release31-maint
+85077 6c1f10e074556407ca943765c3b339e4c8b4fc6d py3k
+85078 fb7ee0f2c6f4a047a701a1bf505e03d0fb3f3416 py3k
+85079 c18423f4b9688c89a09fe640ae959cf50db85d3a release31-maint
+85080 d12d550ebf3455ab8901ff4a519fef019c975b6a py3k
+85081 5522c6b2af872ce10b440189550fd9521b02dddc release31-maint
+85082 4cf77d193f57f5e076b1a19955eabbdee7ebbd34 py3k
+85083 dc4555646e807d826f2650d89de89d688b90d27a release31-maint
+85084 06f5e190855a3fd772848890dd2c8b9241387e70 py3k
+85085 c869ea07cd9d268c9e6ec83fac22e082b0269bb6 release31-maint
+85086 b3c7e51627fdc6990bda6aa650d6d01129e543f2 py3k
+85087 7bb0513cd0b82892eb257cfe7d306837e4c2f41f py3k
+85088 73485cbd6c9eb6ec4e00a05b6726408a247dd538 py3k
+85089 59dfb21383f8bf9f6d16fea8e29559244a55dbf4 release31-maint
+85090 0ee2113a4fde62366db673729cc537506039f939 py3k
+85091 778cb8e6c6383040341ae4776a0cdf1cccc9485f release31-maint
+85092 e12b104355308dbf725a95d5f3e9236582529a4c release27-maint
+85093 7c7d1d96e2c33414bd49b11be0052149e808f9e9 py3k
+85094 c620fe87c703b090fc7ea0fd94729f297f0ac73e py3k
+85095 ac8d9cac30335e3a23c81fbeaa8d48c48351eee4 py3k
+85096 191ed2ad5997c1fc56fa236935e59587b8cf235f py3k
+85097 961f5354eb541f4450e50f4518da043178abab3b py3k
+85098 800addc985719fee4167f737fda4a82f87006671 py3k-issue9978
+85099 3fb583c8e97e7f649029dc60e8617ac3a0ffa069 py3k-issue9978
+85100 f4d047491cb42a83f2a696270ed38785cfb1446c py3k
+85101 941090ed96df4f07af78618359bfae89cff4eab8 py3k
+85102 6434cdce71528523a9d2dd113e144377bd59635b release31-maint
+85103 0b4bf6cde11dee0d4564dbd27cd6fad2f00a404e release27-maint
+85104 1d15b567a74b283eb3d6f8b98d98ccc250b4bac5 py3k-issue9978
+85105 af9dee127e3c2b5d06a7ba39bfe7c33923762932 py3k-issue9978
+85106 c4c6d842d82a01872590d02a35fed3c6e4466196 py3k-issue9978
+85107 34abe36919e53a4a22c41c1fd0596832c6288463 py3k-issue9978
+85108 147258a0adf85cc4bc6acb9ddbecef72ea081dc1 py3k-issue9978
+85109 25e8b7827c7df396b4ab4af1bb2dce17099ea571 py3k
+85110 a430f8fec4a0fc4dac8c96c7d874a725b5acd95d release27-maint
+85111 0077ee30134c6b3d4d7b1f0692bb09efb9285050 py3k
+85113 6ddcf7428227a224851d74b6ad21e93038dd0a60 py3k
+85114 5936ec3c4ec027ff93fd0ba6cf050744854eb901 py3k
+85115 01b96f78fb70b7beab8f7e212b81c4fd6820cc12 py3k
+85116 1add8e5f3198518b323e77f2afcc49dea9d443eb py3k
+85117 746e9150119adb708216044b102473ff2b64de8b py3k
+85118 e710e792ef2e76b491ff604c9cca0acc91fe170b py3k
+85119 ef168688af0a96f815dd271b31623a29fb5fbf87 py3k
+85120 a9349fd3d0f7bcaea1560afa4c5cd893301f08c6 py3k
+85121 ea4723aac478f4bd4498b12a3e2a78aac7e272a8 py3k
+85122 4033f83c2df18d98fa276ef357aa23b9cac09e07 release27-maint-ttk-debug-on-xp5
+85123 9fe1dce2bfa44506298220b5b2833f29aa71cc73 release27-maint-ttk-debug-on-xp5
+85124 d9573e3624ec1221ef9d9dee1a6f89c57cfe6dfe release27-maint-ttk-debug-on-xp5
+85125 7add45bcc9c672c3843260c934718f26ea7bcc0b py3k
+85126 d787ef9acb724e8c5974974e0a7c6cdd64138bd5 release31-maint
+85127 b99f527e0d77c7033ec1de798c358d6172d5989c release27-maint
+85130 9f27d72bf5df89308bf40c682a619e89cda938a9 py3k
+85132 282c77db3d389bd7341b4bd6a8c5c085809d5e7f py3k
+85133 cb2fbb5e640964e7f7de6df0fc7e44977a1a91d6 release31-maint
+85135 04f53ca41596ee80103932307581261edf45afae py3k
+85136 87f4b32905df1050ef0ac865f584b4daf532094c release27-maint
+85137 597804b411259b8c0f565849a6494ce1c6f7a3ae py3k
+85138 daece7a234dc91a8190643453098b0ad516fdeb3 release27-maint
+85139 59de225a19cf8ac547a0cdbb49a9fd7c2e068525 release31-maint
+85140 a9a30cfb89a5d34bf86f7017062cfba951589f73 py3k
+85141 6f133e87a4f8b1eee0809ad55aefd5834070e387 release31-maint
+85142 15c3671c17832d9af9b17ee19869fffa98c65211 py3k
+85143 9b5e6a57ab1054291e77ce5108e3119bf96d61b1 release31-maint
+85144 2f6831cd241ed72917498b0d9b5ad10a2cc8b54d release27-maint
+85145 0622d4d08af025f251b6ffe6be5dc0cb3d1c4bb4 release27-maint
+85146 2e6840c0c1266b4606e854586f7f2b2910d4e4bc py3k
+85153 95258a6a0683e6a5495cd0d154bffeecd30afe9c py3k
+85154 340d1bf5951e108b3fd00399e50ec13e16222887 py3k
+85155 471dbd906aad011d24dd8b24d32f4b33f801a9cc release27-maint
+85156 91e623890b94c1de042f67008454bd3308225fc4 py3k
+85157 de418d9dd7331b632825d38fc6787191a88110a9 release31-maint
+85158 ce475d35b50fc636e52a055ef52799025059030e release27-maint
+85169 7c0f1837e8cbe25d47b38175ca3360f3f6a20186 py3k
+85170 bebe5e35661e2076ea7a11a4286394f05ed4dfaf release31-maint
+85171 a748bfcb69733cd9fd0e9387857b3462d93c0e0c release27-maint
+85172 de7cdb7263502b7477864c9dab0e70ce2c05abef py3k
+85173 0cc3ff8020ae65c96cd3bcd357aec28e90bf5f23 py3k
+85174 428314eeb2c763b9ccb87c30d647a57f4b8badcb py3k
+85175 bb5e18a9bde3ae227c3f1d02bfafd639b33f794b py3k
+85176 8de535def1222e4b765f02948cd31d410c14510a py3k
+85177 9048807be83abb99903e573808410bb50258f8fb py3k
+85178 c990eb9b60a9e479b1ef5873bfb4c99e240ff93f py3k
+85179 ef5c57217b203ea750cb8f4bf5551fcf12512f81 py3k
+85180 1212e500a5850e94441134af05d1f5d51dacfd60 release31-maint
+85181 f3a70d99d7e0fb5ca5b6d0512f47c87bf80d928f release27-maint
+85182 070a8f664220e6c538e58ad74dcd348b562b318a py3k
+85183 394e25382a59236b7d548b4ac3c09efbc1b51d31 release31-maint
+85193 dec08789a9b4233f733ef3b15b8de97c6822ae94 py3k
+85194 0f87085b290f4060fa80d9afd4ed6b9a3e218f82 release27-maint
+85195 b9e26b0c461798795acf4cafe5324dfa7478a0a8 release31-maint
+85196 9bbd4498658ee3712c1a3528b63e0ba9864f640e pep-382
+85197 3bb3ee6e60e0a82219b8926d6ad9a3de9bba2c6f py3k
+85198 ba8cd2007d2922f54ecd055cf569c30d2198eed0 release31-maint
+85199 139dd4cfb80f578d653c73baa5b30af54e8358d9 py3k
+85200 f7c9107f7abde2f507aaf799c5c021e40e3621e4 release31-maint
+85201 d1e0cf818ad299ffe645abe9a12b8cfff50ff1c9 release27-maint
+85202 2c2ba1b30823f208d60a394900573fbe7d02ff14 py3k
+85203 945a55d4e73ef82514073afb63a9bd385daf9de4 release31-maint
+85204 f11dc9404d11861c2c11fd450287670cf9dacb49 release27-maint
+85205 ad41fbf33e3b98d4d7b26853148760f4746f7c9d py3k
+85206 32c32b70aa33bb3406c20c8b42877162713f8f97 release31-maint
+85207 e1f6ce836fc5317fa3905dcdc843867ec53eb150 release27-maint
+85208 9eb9e3f66e3ad8feaffdd5f756f688ce06f8073a py3k
+85209 8bd0a063ceb9ce7a91411eb035d2dff3fc516cf1 py3k
+85210 b77e91445d9b71f1a4419b6f9b326ee41e3492d5 release31-maint
+85211 b334eaadb508cee24feae1359ba16762987f156d py3k
+85212 6af7b4102d77dca1339791168126edc43dc7e7ec release31-maint
+85213 3633d8fe55506a9a3d8715debe750aa4164c9dc1 release27-maint
+85215 d161f8c964eb8ab6ade4c54f4b72535c988a4ac4 py3k
+85220 c28fdeeea78608889958a9e24644defa50142e8d py3k
+85221 5f20f7f15edf7045d9bf3e82a66dc0bd81cc26b5 py3k
+85222 8fe8b281356c3db3b8531e116e86ed0ac6339061 py3k
+85223 753bf23e45c5be8c237da2bbf54e40a8b63a6a15 py3k
+85224 b065b1940cbd9fa3ce66346ff63be93057608ab4 release31-maint
+85225 12c6da5acd73067c91d16c837c5e49d6fffbc63e release27-maint
+85226 09816fc9cde557d116eb2a6c39852e89564c6ac5 py3k
+85228 fb82840f0e70becf75a12a09fa8fecbc17dab17d py3k
+85229 998890cff205f3245f7df0f3647d5c5d03c346c4 py3k
+85232 3d4250cccce918265c7a4d50eafaa4ad7a12e218 py3k
+85233 776095aa058d1e1093a4281c6cfb36352940d70d release31-maint
+85234 c6ddbfb7ab4381954f6ab0b60cb64ab3c0428dd7 release27-maint
+85235 79bb7cae69becb964e018d76c80cdf71910c5d61 py3k
+85236 759e5d275beb399a1cb2b2d7d688123c2ab90263 py3k
+85237 64ca01ec1715fb36e1837362d7257900d5140355 release31-maint
+85238 cd73917f24783866efef4c109da2d2801806e2d9 release27-maint
+85239 1c417811e508f99e85b1dc40e4c564bdf8b6ed8c py3k
+85240 8bcbdd6730a75738cd051d39a64fd80e5646204e py3k
+85241 7a0b41f1c73b852af4cf5d09117ee6c498f38cee release31-maint
+85242 eedbe5ea44cb21593dab3bcdf31617860f888077 release31-maint
+85243 eb7d69d896501cb96e164a0c921172e48b0c9c86 release31-maint
+85244 a68f8763555b214ef73529c927721123aae0f985 release31-maint
+85245 5370d4f0864809cee1e3ef629f7580da81e59d78 release31-maint
+85246 a4c9746cb03c5a5ba842badcbd80c8bab8744e4e release31-maint
+85247 bfee54781ba1f93e4d90dcf6eff07f17df3a5ee4 release31-maint
+85248 c9879b3402e4ab72d2d39b45db5aa23e3dcf6ea6 release31-maint
+85249 eb8e13784de7384c59fdbe476ae39cb02a12056e release31-maint
+85250 b9a75dd7420d0566b73225872a745db69b8771bf release31-maint
+85251 90e1735df4d962cee00c48611ca0aefe8e58eb04 release31-maint
+85252 2de8323bd4eba2aa353cdb1fd680a193a7439a4a release31-maint
+85253 a0479340f0352f2ae63bb36fd8d64f6169d94705 py3k
+85254 f00440af941378dab44d4e1d074bbbc0c536092a release31-maint
+85255 044cc8a9f19cfa1b77fad0b8ea361f9fea544d10 release31-maint
+85256 6f9d15fccfa4acf1afa370f21fb3cfdfab23a768 release31-maint
+85257 c61c02ac2099fbf7864effcbeb44067c93dbd222 release31-maint
+85258 6959adba3b6a5d227db891981b298b08cc9fd9ec release31-maint
+85259 a5c63b3a96a9a8f2242c3d209733b3ae84823f4b release31-maint
+85260 28306244afa0f4589c1c59ed744038b82ddb493b release31-maint
+85261 64989b03398ca2f8fb66884f219da9d93aa70f83 release27-maint
+85262 ff734f225b47e9689bd2dd10585e702c6448d023 release27-maint
+85263 cab458638e4db547e0df63d40795f2cf9d2e8829 release31-maint
+85264 baa98ba85fd41189c0a95c150ffd455ceddfc761 release27-maint
+85265 2c115bf52cff9ce5fbfc230cc4db0af5674ecda9 release27-maint
+85266 285651a15355ecde40598994af95b42dc2078d24 release27-maint
+85267 ce202152e21a1143e6e9beacaf802feb7e19cef0 release27-maint
+85268 536d8650da3df0d967dc9778e3343ab2ac9896ca release27-maint
+85269 e9e241a93f9ee30cef93810623afd7a80d9b92cc release27-maint
+85270 78396ef4d81cd6b753ca58373a8cefa48f53f0bd release27-maint
+85271 1a0e0669779ccaf6d8270881075613baf21e6df9 release27-maint
+85272 521eac31a893a98a0d5af3446e835b0dff47c4b5 py3k
+85273 1cfd3b12489dae94a1f64a797fc602c99d7b0b54 py3k
+85274 9afed70d3aca1c6378ae2c34d3a5ddcff79a77ca py3k
+85276 df844bb6729a4bc6618bade2c60bd8a58e90d75e py3k
+85277 9257f083fcff22f43fca98ed0c7af976db3fe4c4 release31-maint
+85278 0192055bcc3be9159076177fb5827318d0cc03ad release27-maint
+85279 d672753a03f008ce9b284ad9be47d030c1847b3b release31-maint
+85280 7018261f2ac1da1110e5776f630f7d0cdae438bd release27-maint
+85281 2d99edc4f10dfb0cfda4a26a7fc1c0d0b42e58c8 release31-maint
+85282 5b55e8a9c1071d36449448382bcf55fb8cb7fbcf release27-maint
+85287 066fb3faf6d5392f2ef3223308d8e310e571864b py3k
+85288 8629f7d8b5e337b0a097af8077925379d7046897 py3k
+85289 d0ce3eb11b286ab5499992d1eb8b32df05f9332a py3k
+85290 4da55c49343570015a4948f0dc1e3a9335376b05 py3k
+85291 b8e78cfc94eba6ae4625e97b29566418a23a4852 py3k
+85292 32dcccdc73f8f6fde85f8a583caed4498d786d11 release27-maint
+85293 7c1031d3823cc4db4459287d3845040aa4168c77 release31-maint
+85295 62c58dc912e816554b878cf76dcfc1fdcab06a7f py3k
+85296 f237fde925fa7dd4e87722d7682b39aeb00a5bb4 py3k
+85297 c1e9542b6c74aa63f08a6a44da7c83a6c8c6649c py3k
+85298 e3ae5b00ba15eee7b65b40ca092b540549d92f31 py3k
+85299 a62c4d5cdf6c7438170ec623cac85fef21f24311 py3k
+85300 b2457eb834ae09d2846288379ecbf371599e853c release31-maint
+85301 dfb34e5fe06619a85c2d88cb0e0719769b49fcdd release27-maint
+85302 071f1f7af5223b88b21ef3c6a6d2c1dbe1170476 py3k
+85304 39014f0abc328295b3b780c76127907498785e5d py3k
+85305 7879a8ec7f79a9323ccc50aef540e8ff4f66bb90 py3k
+85306 1f3919af8a536d18eed47548c05b2e869018c184 py3k
+85307 2147cc15222715411900cc25257537c2d7b8e00d py3k
+85308 8fd5d06462e6b8d5f161869e7c7c74ec94501448 py3k
+85309 e4bdd07ce0c626938ccd9936ff23f159feda18d5 py3k
+85310 1c4774b4e98a462ccd0020b05cdaa903d2375eb7 py3k
+85311 77a6a249e24e8e62eef5f35f0eb0b12b66744f21 py3k
+85312 fa6e50208d93095a48fb26bf35fe8ff4156b950d release27-maint
+85313 39a0b943e3e1f17f122f1dec801f065efe7d527f release31-maint
+85314 884c71cd8dc695a92b16c31387792aafc12c3d1a py3k
+85315 a14e074fa42fc552c249dc67b127752444ceb53f py3k
+85316 c411552cdc7cd3be89f612351572f601c3cb6ea1 py3k
+85317 8c57602ea1b30c2aa21edbc7edca1e22f08c7fd9 release31-maint
+85318 acdb32005c0ac30fac285f83949ada81652961a0 release27-maint
+85319 6a2f8f692f048cc89e824c29e82dd4efc030626c release27-maint
+85320 a9964a4d3c29f061fec190e1dec29024916f6dac release27-maint
+85321 4c98eeff37e7f3c32ea9600a77691e5a0350f0b0 py3k
+85322 1a041f364916bb3d3ab1b386ba405c668a071eca py3k
+85323 4987344cee200128eaa275f90b8d969f7dbe53b0 py3k
+85324 b1fb0539bf98bcb449649c210b82473ce1290c05 py3k
+85325 dbe02e916aeccf4be8575d5018a5f7158e589c59 py3k
+85326 5693dede9a3a08402a70ef01d1178c9dbf73ee26 py3k
+85327 9c026183d82a4ea904189dc02ef43bc26b1b7a8c py3k
+85328 aeddb187fcbeba56e37c470318f7d4233127b27f py3k
+85329 0bbc3bb00fc4ebdbec7e418c9884814bfe779f8c release31-maint
+85330 51575bdc54206feaf81a085a7e05d7459d053be5 release27-maint
+85335 42d6c262c94667057ec425bdb2bbdbf6c9f30500 release27-maint
+85336 0c4884db53e049025cfd566f5bc6923840cc33ce py3k
+85337 6543fa4b145815234bb2b9f7716c151c2aa7aeee release31-maint
+85338 7e01d6964d5d7e0ab077acbe720cd6aafb45971f release31-maint
+85339 2d164b1aeb79b7de31cde4c295eb0127825be1f6 py3k
+85340 a7ab048c6845d8e93c3accaba2f7d0c2731f8881 py3k
+85341 e7c9a85fe963b58de0f684d6a39d3dc395d6442e pep-382
+85342 cf2c583b2cbebf18bdab49101f1e532affb73f69 py3k
+85343 810b540ae650f76dc02be8ad10f5dc85d2268de3 release31-maint
+85344 0f6fba65bcde7d291490f80bd6b526472b865d2e release27-maint
+85345 b62899ed7fb7d5b3762f18a6d04e711eafc219ad py3k
+85346 d475c94546bed654e95e833ef3c4586eb192fd37 release31-maint
+85347 fdeb0dcb9a3fd0d19f463bda2a1f668e567b83ec py3k
+85348 2fa9d7345ac7fa3c9481361132d4af464516ed94 release31-maint
+85349 51d304ec6c11b5974f74ed588a5a8262d4b931d8 py3k
+85350 a9a45624cedf1de32455cd2e26e8682093af8b96 release27-maint
+85351 23134e1673d71ba9bd0f44870e37a81c6f6b98ca release31-maint
+85352 ed5e598da150ef6b9056a072730a4b493a8b33bb py3k
+85353 25d078739c2a4ed8385dd6ad16e71e7396d0b140 py3k
+85354 c019e977f222c30bd36ea300712a875154343a62 py3k
+85355 ef21f8c99fb34052ced36bebe28f9d4c5dea65e2 py3k
+85357 da012d9a2c23d144e399d2e01a55b8a83ad94573 py3k
+85358 ad15b89106de3be05e0f0396b067a87cedfe0e01 release27-maint
+85359 4518b2c2d614f13817d8e875f950332ca5a718ef py3k
+85360 cdc95fdddb7b2ba9daa0327caa5fe9c1f8bcf2de release27-maint
+85361 5ede15e124581699093ecc45206fa0b7f5d3f00a release27-maint
+85361 d50bfb7ab57c926bf07fabb98cb78aac060838b7 py3k
+85362 475830424c1e81860599453b309a974e6e3fcac6 py3k-ttk-debug-on-xp5
+85363 5aaefa9752acb49a807adceca35d2085ba341366 py3k-ttk-debug-on-xp5
+85364 62c14ed6b8a0a624a9a059b8a044da7b8f5ac57d issue9003
+85365 2676af65514d4d97a9fa2b8b744283110fff583e issue9003
+85366 d4909a056d4e7803be8a0921e1817ab2e5d89f03 release27-maint
+85367 41a9f951ebea5e1ac6cee6311dfcd73458857270 issue9003
+85368 0adb6440581ee1d5a6f3a6ea441fcc5e9679cd67 issue9437
+85369 f7f70529310f84b913c92c8146dffeaf7c7bed30 issue9437
+85370 9d6d83063ec22bdc423d411aec000b38d93fcec6 py3k
+85371 cbde81ef4af7c02ec84e8a88c0d2e3241aed4cce py3k
+85372 18b7259cd92d838ef69fdcda76837b3c8d5fe6d5 py3k
+85373 97f80d0a1d5638a3a1f3e72ffa44f06e54407eb8 pep-382
+85374 669c3728750b1756fbdb8a29ead162bc39e1c013 pep-382
+85375 5fa125ae07a6417238a0f5d7401ecc8ae171fa42 py3k
+85376 f3200be4eaa0984d8133b53a7ea0f068c32415ba release31-maint
+85377 faa4e22aaba7e4b36ef93fa0ce61b0f0dca3313b release27-maint
+85378 8cf1aff1859c6263a75a00eefc4812b5f8eaafb0 pep-382
+85379 6d918d910a9687f98e98e4b2394797ca3cf6717b pep-382
+85382 d24928c28001918b4dc6ec3e131ec925e65f01a4 py3k
+85383 9c723afa44dabb421819a7c7442e68f4c28de4bd py3k
+85384 4613e144900068243fc0d828edb7c1e119763ccd py3k
+85385 9e147c349126c6e81d614c50b796b3df740add6a py3k
+85386 ded61e26b8414f47add6ca7499a1f44369d5d707 py3k
+85387 a817205d254a9f79fe7fdec23e3c2eb45aa9666c py3k
+85389 39b38ca1ac04bd1b51acb1e95f1b5bfd14d3ec88 py3k
+85390 2ffbfbc0d3cb16c617e2c89a646c946af1f0e39e release27-maint
+85391 61731ec9a0481e5716068019461f3eb997af11bd release31-maint
+85392 e2aa3b1d08bcbc10af43db0f2ce336e0b287a955 py3k
+85393 7909436408e2ee08c4a1b12a79a6b20fb28a7626 release27-maint
+85394 3e8d28886ad660d9c394b142f2aa8fb8eaab33e6 release31-maint
+85395 f2f52b40c1f28d2804ea460e0c14f2cf7da08e5b py3k
+85396 d7a71f1d1e341c2a9cd1c32d45a9e6ab37107f0b release31-maint
+85397 21957b3b0aca093341c062625b53e54eb5c773ec release27-maint
+85398 75beb6762e3b023679d20fb6dee9b3d187d3c244 py3k
+85399 c0908cebf18410fc70d8ce3d92ae164f48a74573 release27-maint
+85400 d0f60beb28f23f230479b2da23fe9823525a57ed py3k
+85401 ead5364c4a59a733a4ae0dd26ba6bf25206b8739 py3k
+85402 f29ce0cc1d4ce6b6cd0de20a3059a2c10b47a72b py3k
+85403 75206df8e58c602850d0ef9fd6c1b668ba146b17 py3k
+85404 2ce64960d490db6dfa473bf3d6d5c0d85ff715a6 py3k
+85405 20f463a4584d7c42e0386a8f1006a38ee9903fac release27-maint
+85406 246d3dfce7b103d0d57f24d19ee10e9056b7c9fa release31-maint
+85407 23ec0be07e20eddf899c4c51477ec836745b0a37 py3k
+85408 12327b9d33251981a58131a601e52589ab06ef0a py3k
+85409 cb6e9b03d0c320c86b3ed6fd917f3b11efcfa505 py3k
+85410 a1567893783f232de0a368bf65f9b7efb2166237 py3k
+85411 bf5cfe9a0bb5e51e829513b6457410d451e1466e py3k
+85412 d02d6bb02538525396fb2700ca31682ca99aea75 py3k
+85413 e517c3f5609184b1a37edf4841590fb458f5a922 py3k
+85414 5ef76bc171ad6d7d884bbe4a7aef5c497031aaa1 py3k
+85415 37213438e21fafffe71cf70eab7d721e6945d90d py3k
+85416 40ecb4d00f25ab9b146ebe92e021529da86620c9 pep-382
+85417 c48c09e693e6c918e48d2191decc5c0a09069137 py3k
+85418 fa905700775551f475069464568c9ff5a27d017e py3k
+85419 0d16d50c57a0f2342ce2857aa008085d0aabe49a py3k
+85420 1875bfed5689b9d02929b68dfa9fa8bcaf921151 py3k
+85421 3619c1214007d3d5e3d07d2357f67b22ad2432f7 release31-maint
+85422 eeaedcbe281d5844fb35a3d034a3030ce4f8ef22 py3k
+85423 6899a9ca5f3535db3492abda01f6c48f1583de74 py3k
+85424 8b192502a4a9ad788390696cda37c26f13c6b788 release31-maint
+85425 610c25b5cfa289bf754678b6d346fc65093f9b26 release27-maint
+85426 a1eddc64b75049c9788105a93e1e3747bae59950 pep-0384
+85429 1960f58af785d4a70adbfc04192e782b816bf195 py3k
+85430 a75fd31ddabbeecb038aec6bf4b4b5c71bd76c9b py3k
+85431 00d13b2f81a3c31a123885fff0bbb7846bca65b1 release31-maint
+85432 61c35472a4f81a4227771c1f80db70a83e15ac66 py3k
+85433 6474addd2838b76977fdb85bfc623700cb347b3e release27-maint
+85434 f2f7b70fc5ebe4f90aa435084b91fc94e1d7c631 release27-maint
+85435 3335edce48a354649b2a8a8bc8dccbbaa7205155 py3k
+85436 a4a6d823ff89516622f1523e4d196a9990bcdd2d py3k
+85437 4755744724f20bad47796b5cd767fa06769eb160 release31-maint
+85438 1f225d66941a9230265221c802036ea841c2b7b5 release31-maint
+85439 e76f554158a85bea3af51d9d8f776e7849689bdf release27-maint
+85440 e9ea09787a35cf93cf535f96649dfac126b0efd4 py3k
+85441 4c5706bc2f43051fc68bf642e017a1d4bf6d0ee1 py3k
+85442 49df778889e6facce396e0d1bccce6729a59a138 py3k
+85443 a46711de92912072bd1878cacd71bfdaaa155d06 py3k
+85444 78a12b829a9aa9e77c4baf9c342016a25d616bd6 py3k
+85445 1e72abf073c56f5e31031202ebd83e36c8460338 release31-maint
+85446 ebe14ccba1b7b51a84b18b9a069427c5f8cc2fba release27-maint
+85447 6fd49d0521345dad1fc82e96357bac5ca7653e45 release27-maint
+85448 fa27dd1298fe577650872dcd164f6eaa1402d4cc release27-maint
+85449 2f3e0eecc76277bf53c1770a462789ee0d56fd9c release27-maint
+85450 ccc424c966426bd1522202f2094f292feb0a494e py3k
+85451 b5ce06bbb06fe2130310729245e35dc96219f0d1 py3k
+85452 ea2fe9581c2d8f0a2037fa1ab0f84932122fe6e5 py3k
+85453 30b3d7c5253d588eb50706905ee9192294ed2766 py3k
+85454 3611ea42b792dc13c5548c968b5d378fe299359d py3k
+85455 ba6581ecb6f1ee7a4832354b7889b0d2f942d86c py3k
+85456 fd044cda97d8370fce33a13908ebc060b80f9158 py3k
+85457 6ab0f9219660b882efd4df64c931615c8f581bcb py3k
+85458 beae76ed5ebfe3f8e3c06bc866ad0e6cdf9b4bed py3k
+85459 7d79688156db5fdbc900d8c77072e617b491e247 py3k
+85460 dc200cf2f5658ac105def52d693ae7752d965d90 py3k
+85461 2f179a3cb20660a32ccf815e7f44b15cc531da3e py3k
+85462 82cde8b7372823191c998d400c47fba23ed7f7d1 py3k
+85463 4a8e0d89755b64c2e903532ebfb6119b5ec05d6a py3k
+85464 67a218570f4a4e16b045a3583681c1061a0eea3d py3k
+85465 660afdaeb2d6e60723eadcb6574fa05aaaa8bdff py3k
+85466 2853cad9cbc024300e057b004aa56d848870ae17 py3k
+85467 e2c98c60dd64d0a5d2104d73fcb586a2410e1743 py3k
+85468 b65206129b5c94c686d1475a93091288ddc544b7 py3k
+85469 995c33e2263b1c910aab41af4f1a1ebaf7cb8879 py3k
+85470 a5eead141cb46356f5ebcdd9d2e4cb518883a893 release27-maint
+85471 6a848955401982c26d6fcdaa9572273664b3fa8b release27-maint
+85472 71e76d03fc67f250774acbfaffbedf4c444f6af4 py3k
+85473 d7f907357da7e950cbcdc41987c058f1b7cc69fb release31-maint
+85474 813b51a6a417997d55c185794cff4c1eafe2a94c release27-maint
+85475 982c8ec73ae37e0ed6d54973eba3f70bf639ec8c py3k
+85476 3d9ef098daf2e36fcbc6d22f7a956ab673b0130d py3k
+85477 a27fc0ff3678b009663407650f29ea4f21734f01 py3k
+85479 08a9c046004dd11a94af9f1ec3122fad428db6fe release27-maint
+85480 12442ac3f7ddbba3cbe9804a93289054e9bdec44 py3k
+85481 190f247edb9eebcf30dffb2afd14997eeb0bc71b py3k
+85482 ad40c0a3e22156a1e3c5ccf52d88d8beb5603ad2 py3k
+85483 b83f0a667e7ceb2eed1c0d36d8a4b074da836f95 release31-maint
+85484 07b6bb76ee43923c556fd009715f0c3a55d59c3f release27-maint
+85485 078e2e47e52b06afe12d1819999eefda2167e632 py3k
+85486 b886bf602513b4f7e97e15715ff403d5cb87c7e7 py3k
+85487 90c2b65490c7532316ad0d715d3a67369c53c144 py3k
+85488 80d3a37499b1b2b209a6ed8579f676b055474e37 release31-maint
+85489 067e8b2000dd05792ef043a60676e5f5f5ce23b3 py3k
+85490 3e79134c65357a762da25fae106e51ef3aa400eb py3k
+85491 1a6013ee974b0877b94a133c60bd3292c478cc7d release31-maint
+85492 253a26878585748fbe8bf6581270aec86476688e py3k
+85493 b7ecd944b7ceb2ad1c7fcbe1082a2ba7b0bfb298 release31-maint
+85494 d52d5d359db310010ef75d5ab5a7f25d5bee2826 release27-maint
+85495 052c199ae19a9b09b83249d62a1752946a0bbaf6 py3k
+85496 f3da8cd7411378b6d09d50688507b19c8530d2e0 release27-maint
+85497 46956a25c2641bfe7bc8c5ac3ec56b1889988706 py3k
+85498 6296632ad2cbe65f7031bbe1ce6ff1c23322bafc release31-maint
+85499 4269267e6e57da24325dd76b3620341aafb29848 release27-maint
+85500 6cf223ecaa6f0dc5327c5c1926e315f871604172 py3k
+85501 ceb12703c6dba3302615ec0ee16d67766258b984 release27-maint
+85502 27c051247233a6e24b36b1763e51b614cdabfe25 py3k
+85503 4d5f0c4487eb9ffb365e9332d75a4ded33bbc596 py3k
+85504 1782da440fb1e446f778dd7e4325ab5c866999a7 release31-maint
+85505 fea8f21b199d74d7b408da95e7d535a90f06b257 release27-maint
+85509 7d1e453b120b6e62b9a5061aaf624bcca8790fca release27-maint
+85510 89a8bf5325cd15fea9e30ee8fa9378e83f674de5 py3k
+85511 5e1576050749beba18b1c29ca3847e5849e2d8fe release31-maint
+85512 1780684ae3ad97c0fbe6ca3aac71f07916b05410 py3k
+85513 c3f2c5d35afafcd89f780edf10d83a99025a4437 release31-maint
+85514 e512372f74946d6f8a3b6058680bf32511a6ea68 py3k
+85515 cc1d8a2db3486e412837a09b95d2c904a4400ba6 py3k
+85516 f63d747622bd517347f1eafe012a12ab9ef2a570 py3k
+85517 453fd8182c2f96e9e0e17c3f33cdf72d502ea2bf py3k
+85518 bb30393d1ea189ad3cb67b954e7f737802389f73 py3k
+85519 157751cc4cd51883700e9936f2297c9cd6b52def py3k
+85520 e773a1f23d43393e7bbf7a32f74b415079bf6031 py3k
+85521 9c73fe3f47e269060993d35a77c3c504c9b84d96 py3k
+85522 6a365b9a22ba9c3b01de5087b06d2a2a55a1183f py3k
+85523 52025c3541d888fd19b0475d4be92d1adfd0b557 py3k
+85524 1f5a28ba7477d02a3b8152029a2991a8ce603c9f py3k
+85525 88bdef5360af03aceffeb7cf17859a90ec703a79 py3k
+85526 320d0fa21658d1df741896b473523605b1961994 py3k
+85527 4ebc0308f4b12ee3f8b58d9bc8aedd9e6c6a374c py3k
+85528 0b50d87061344634a7113292ffe391230fa74b11 py3k
+85529 80fe066c135a9047681b5e471c35453f1b8e5873 release27-maint
+85530 41868ca52744c8ed2f3a7e0d454f746072bea141 py3k
+85531 5633af59005702b95310056d1a5e4fa4bfe6187f py3k
+85532 8f6aba23fb2abc75be9eb2c0cce94bf12ddd58bc py3k
+85533 104358b5d4d1446dbc05abe0efbc8cdb23e15408 py3k
+85534 dc25c50a7c11606884912d02b501136bd08005dd py3k
+85535 6b8314376de2eeb4e456ee0745f85e2f16105ffd py3k
+85536 92ea56b52d8f7314bc57aa97c1852a818fd30298 py3k
+85537 9712586fa42f5f9fea0e3710557e81c8b838d7be py3k
+85538 ac8680685fdeaa3e77f8085df54675853ee668c6 py3k
+85539 d8384fce3c73b9daaf46a7bcd5150f18e0f96ed1 py3k
+85540 78d53859395a4462e73f6ec6735c5631352b51d8 py3k
+85541 f33bb850789ea852ed386645546a8dd259849345 py3k
+85542 7de365c1986babab6dc98ee7b177f34e2644d17b py3k
+85543 6f4cf73032fc9b8fc846b2aa2b416a27162e32d6 py3k
+85544 9347b0a85caf586ac0ed16ed38c35f59a1a1880e release27-maint
+85545 eec499847df7bb9d8384bbadb842a3d18866337a release27-maint
+85546 b71aaf4e7d8d901baff06ccd155591adcab3f52d py3k
+85547 0e2cbc31fc925e29622e84fbff3424c806ba00a9 py3k
+85548 394c00b4c9194cfd726ea32b312821f8746f930f py3k
+85549 844ed6dddc031efe964e35dcbb8d529c20ffa4fe py3k
+85550 348f3369640215501499c7f2ea8059af91f970c2 py3k
+85552 90052889ce3de33c1ae0a09b4d04fb3c12bce86a py3k
+85553 292b1df01bad87c7c3d7175f6a67831f74819bca py3k
+85554 3c4225bf87b412663456883ab8d5e3d5f6e78ff4 py3k
+85555 2b17be62c74fcc8035231417600daf74f9237f5c py3k
+85556 d4390b6bf7ec8e16f2e410e3955712f061d57322 release27-maint
+85557 ddf2ead26aaa45ea69e08f11f131f193e5cd73c8 release31-maint
+85558 4d6c63c65550c23699482682c4746ab67cbecdab release27-maint
+85559 932f97bfbdc0c5049feafc821a8ab146d1417d12 py3k
+85560 fcdc2fae50c081ac9b703dcac957f9fb0334d0ed py3k
+85561 f98c3e2fd05503312452e10a8b5c776051c3b381 py3k
+85562 fd5c83f7644750bd24aaff0cc2be8876b31793eb py3k
+85563 3618d9d7902d3cb448b2517b0fd480d408ab15ff release31-maint
+85564 0bd0e87a6851542246da5a7e3fe59f735d292658 release27-maint
+85565 f9184e7cd25ce13075204da78df43b8172f76fc8 py3k
+85566 dd0867bd955790d8c863596714d3d4f2c9582305 py3k
+85567 09efffe700307018efe1b167e0ef6d3ff4c67e0d py3k
+85568 76c888fd2380df26b80326f1f665b989295b113f py3k
+85569 55ed5c524428ca22864db64d8b05f65468b5db5d py3k
+85570 9ed68dd6b71ff72339b7ba97ca5d247475e3ee9c py3k
+85571 60398450934302c106eb934299a8b465c125b540 py3k
+85572 686a2a91f826080ee8e5c32b9bf7f0955f276ead py3k
+85573 3f2e145c4a02e6620fcc85506cd62fdf25435ad3 py3k
+85574 5181c3bf8970e17be13d213446a10bb63c8e46da release27-maint
+85575 a442ecb70841f2dd7c55a0954759c6c64fa5f636 release27-maint
+85576 0ba50d485f07268a347e505a6fad7cd3d2a5bf8e py3k
+85577 b4bdd428eb2b1f239a324423b417ab54d3a6025f py3k
+85578 b749dc4c374c167eba128c9a962525db1b26fde5 py3k
+85579 e1dc9861b43f39c11227d6b3d0111e5268f23848 py3k
+85580 6dcba93d626202ac059e0da01e181bef32b65d14 py3k
+85581 df0e348e71762e9a5845cdbf80fbd6a9c495b346 py3k
+85582 3794c9b50824fd7b5f83846ef8799c0621ebc266 py3k
+85583 ba86f34f08da6bca1a88ac96e7f85bf382c27b08 py3k
+85584 9306ff1c3d46f7d17bf1b0c6317d0b03522d94bb py3k
+85585 340359d80ca056a20cf5245917c0f029121ff649 py3k
+85586 443ab2cbabcbcadadf8990a9ea7e6c80a0fae88c py3k
+85587 02830553dbd19929777932a60040ee877682f729 py3k
+85588 fd5135cbd928df330e397e2688e7995c858b53db py3k
+85589 6087b1f6ca9b74eb82ccb506f3802f569dbee2c9 py3k
+85590 6b2668873f30d291c09663fe1fa3663d50ce1135 py3k
+85591 43575b0969ed063c09f744da81c0c362cc888922 py3k
+85592 6ece629445b60b3515b62a7f4b38d2a207092438 release27-maint
+85593 1bf767f28db4df6234e2200bcc8e776bb07dcdad release31-maint
+85594 0505eba623472fcefbfc1b6391cd71d36149de89 py3k
+85595 c99cf9102476c49c5505d3f97e4b713b8efdcfa8 py3k
+85596 eabc5c53f134eaccc51b705149c9c1ed3ad330a9 py3k
+85597 2880e72a464bd1c1a8851ef59e82d030fcc990f4 py3k
+85598 6e559793e450cee356532668085ab03becb28bf0 py3k
+85599 15859740aae6c2d702c5c79c4e9b1a880ad9df6f release31-maint
+85600 7025278c5a41a8b6c859341fd4731c0a4a2168a0 release27-maint
+85601 f6216c5f06803ae5bd9e5f96373cdfface1fc32e release27-maint
+85602 15e3ad0ca3648b9f970cfefed6dbce82f6107c5d release27-maint
+85603 caa17a033176b29e8664e61f1052570e3a7fe239 release27-maint
+85604 088402469016ba51f9b5bae0a838a9746708f074 py3k
+85605 931f239082966ffcc9df693c44dc0d3cc615c828 release27-maint
+85606 8733c6903fcca26dffbf09aacd4261623859cc98 py3k
+85607 be60c960ac09a40e0425100097f34c2fbb131a10 py3k
+85608 2e85047119d21baff91478c5d6906b02af1de992 py3k
+85609 5b2af35b8b4b606a2c0b0b5a730ad3014ed46559 py3k
+85610 d25346c0b9d08d62bac3bfb60c227e43bfa27553 py3k
+85611 3b5ed8490ab2c2a32a06cc5009ae9eb7f0984287 py3k
+85612 69741d4b8a60039d05da4b3099d0eb12c7913f05 py3k
+85613 96d7e7874f8c462651e931c134f112d76998c8cc py3k
+85614 966ec31b8342c7620883b28755448555a726a818 py3k
+85615 5da837fcf67593aea5472478928d424c8f32bf40 py3k
+85616 473b921e3a1f3b6d15ef796668262646a4ab4b8c py3k
+85617 7ddf60c8896aa04189961cbb3512890677cf12db py3k
+85618 a4dd383912d898dbdba65879ab83a7e40f4ad9bc py3k
+85619 a9047ce1e81dac270c2cd9ece078f030aa81e709 py3k
+85620 19ca70b463c5992cbaf7ebb7ae5325a8eac00756 py3k
+85621 aa2e4637f6ce971642a4781ec91a41ec39b9cd8d py3k
+85622 5737ad71e9e19e946e2c50b6b6305e346595650f py3k
+85623 87dcebe78d67ca2b2781b68b3e759293e11c5186 release25-maint
+85624 0999e3a44735be61e5ec16a01ba2d97512968406 py3k
+85625 d699708dc2c1904bc930ecc5818f8834eb714b69 release25-maint
+85626 5a2d3449b575e3a1057a1dbbdb00e55190d17054 py3k
+85627 06608cc25fb204cae4760e5e33803d008512a10c py3k
+85628 ce4d810257b44d8b5ad6eae928c9b515d05b29b0 release25-maint
+85629 ca969092f45a6cdb892113ba2d391a6d0bdf6faa py3k
+85630 311d7abbfbe300a1cbca4bf203ba695bf8face19 py3k
+85631 bb21359e88b9464e2681d978f99e83c283acc8dd py3k
+85632 31750c727ae3050c001c8022735e6e6f15971ee0 release27-maint
+85633 bcb260d68b158aaed30bba52721da4c515dfbded py3k
+85634 87e5b5938c65f0cac4308c588e212d65aa73fe84 release31-maint
+85635 422a4fb0a491244d5434090b7a60214e4d06edae py3k
+85636 073e1be76b47435894e6fdd87a9fea0eab14f09d py3k
+85637 9b2250fb80d8b5bb4b901052eec24a8d2178402b release27-maint
+85638 9e45fc805288a77c84a2523b94b7a5eae7fd34a6 py3k
+85639 6844027254fae6b1bf96ae27dbad36bd34b1cdf0 py3k
+85640 186af051d04f210b1c7e06e893d4e8dcebe76f50 release27-maint
+85641 994b8799f28d68a5e4b90c2a82848712a9775abc py3k
+85642 21dd71938a4472d246e583850650b76bc390b025 py3k
+85643 74d81a3a0d565a187859dd6a9c300ce57cfbac96 py3k
+85644 05d7b1991ff72e74f1526a8a1ec7553767363354 release31-maint
+85645 b42f949648bac57fdc00119b3b7597a751e79414 py3k
+85646 633de57fb73ae1163224097740d1a42124f0ff91 py3k
+85647 3c9afa92f8fdc6532b1186798002c004972b1705 release27-maint
+85648 623deae77324367d516aa4e1f2d42d528629d072 release31-maint
+85649 39a2c3b10a7b1fefaff4f7b2633d40b710bf973b py3k
+85650 9ac3fe2ca49eb5efab843bc855d10fd359ade693 release27-maint
+85651 efd369981b8dd561cb6abc7ca253ef9fc6e9a735 release31-maint
+85652 38ad57db88ac4be2f52c70751aa4b3108be57168 py3k
+85653 244cbcb67dcd87e11b6363470b2b87fb6f51acf8 py3k
+85654 39cdcc7d3e20d544eaa8a5c4aa3d6906868e8f7b py3k
+85655 023b41376290a121c77a24b701470cae70a1b23f py3k
+85656 3a47fbcb29b1205087c9e3ca9b02556a7dde7e66 py3k
+85657 7af406f219a4e61b498adc71f5aa27fcfcb9ae31 py3k
+85658 d58ce3ffb1cb697f1eedb4a53ea3b11276bd8ee1 release27-maint
+85659 b0228af6db1180a171c7de12057ad9366053adc2 py3k
+85660 95e3aeebb5abcd81e48175b4ff0d22995de15e26 py3k
+85661 d1def7b2abd2f59b43254ba324097462f1db20fb py3k
+85662 b2a9ca2b61a241b0ed8fd78088113008e34274a0 py3k
+85663 c147f910af70086fd63deae0e3f620b9163b40d8 py3k
+85664 e8969fb822fc2a279ae34be73f8e1e15c453a3d0 py3k
+85665 f8fc2d03d7e42a12e92ec274863475092ead8e7d py3k
+85666 e7580652afb8e6ce6a395adfeffc51563472bcec release31-maint
+85667 a316581290080740f7b6320cd57334381b2676b9 release27-maint
+85668 b1ca7d5a9c74d70cac144d429d712f78b773154d py3k
+85669 b1bda1ec995fa1036de09faa33c3550b2f436f47 py3k
+85670 e0ccb5f50e0c790637ee311527705043800371bb py3k
+85671 16ead83f79cc99ce1417b3f0483a8a1eb4ede1f5 py3k
+85672 96a69762b48161678160738f4390b4022b43fba4 release31-maint
+85673 7aa14cac6f4d02739ecdb4b5d305d681d5938167 release27-maint
+85674 eb8837efd84c5b1edaafcbe9045e7415fd976f92 py3k
+85675 351d794d32f44329c107373e1daec862530eed23 py3k
+85676 aa203d478bb810f6de2b6102fe4159a4211620fc release31-maint
+85677 d397b02631b547d94c67b4b91384e95e6d130f09 release27-maint
+85678 bea14f00d3e0100727ff7c0f88851d763e067ca3 py3k
+85679 b0a8fcda06547d6d34e3347228259c251034e2fe py3k
+85680 ce9f5ce33ad2a0f5d03cd08aaa78358361d2f84b py3k
+85681 a4c10a44d9ae11bec9c999426e8744696eca1ce5 py3k
+85682 17c96aaf93c87d107a3a30579849f949b34afbe7 py3k
+85683 5b069892e413a9e115aba960494889cfdbc2d943 py3k
+85684 8f0625954ffa3cdd7116239c5cc98a066af37267 py3k
+85685 cdfd198a6f1de31366995ec6d850fa68908da6cb py3k
+85686 752e4b5c64e95cac4162641dc4371640a565ebc1 py3k
+85687 c72757033d44f853d0f64b59a280f2b060854e7a py3k
+85688 68bd75c69db150ffdccb2037d42fdf3f41dd5d41 py3k
+85689 3c336348a2e986fe4779c153f7874c4598711f18 py3k
+85690 372c9807d75d9714e60643b90af0a1a8b0d96183 py3k
+85691 77c13c9c6e59e39e968c4b4effb63f718e35358a py3k
+85692 51959f39a7fb136a5ef29368bb738311b865fe7d py3k
+85693 b0ba7eeb98a55e9442b1d0519d83bafdfea0edfb release31-maint
+85694 2f7e01694926758665b169b4c89d3f1cbfe53282 release27-maint
+85695 86f00612cbd60e9e16540e824bbdd6451f173414 py3k
+85696 ecff41e068e6fe91e30d1ba488dffdbbb1d42c22 py3k
+85697 82b083c96a39fbf71309ca83b72c3e2f282e5c37 py3k
+85698 246c08c825a10588d806aceb12d8c142c8a92516 py3k
+85699 503600bb25eaa898fe26b8f7638abbd6f2e2b7ec py3k
+85700 3faff7e51f40deed0d46fb9f2e12ed12dfab5358 py3k
+85701 15e41552dcbd7cc0321666c422e913702d73469f py3k
+85702 bb333973de38bc3390826d05f1b71b9c3f2ec48f py3k
+85703 27ce99fc252701475e9f99081a4bf80bacf74ea2 pep-382
+85704 1a905391e3ed6ed428b7b6b5397666195fc3b62a py3k
+85705 8912192982cc837819329a3ff851098cd2a401ca py3k
+85706 6628f86db2b6b78902acbb526690551f559fd2db pep-382
+85707 1ec2bfa54cabb9bb63478b5bb619c9fee333fb79 pep-382
+85708 02635baead5f5ab5a7316caa6e0ab14326d524f6 pep-382
+85709 e2ba1249a2f56366022b968791a8fa553c6c85c2 py3k
+85710 d607b631305dc0a70208da8245ad0fd5caa1192e pep-382
+85711 4d55f0b090d580d82f5bd578c068fd2b19f731a9 pep-382
+85712 1303ceaf441a9c93f82e3d44200ee29271262159 pep-382
+85713 b47e4ee154032ce8b44c8aae2085eb4a089180a9 pep-382
+85714 70d2b4aedc09ea47f014ea221fe16f3b6859cb9e pep-382
+85715 59e9b58ddaf848d3ae0d0861da1463a876aea6ad pep-382
+85716 42b84d3188d10efb226b5b82eb2f310078afb9ff release31-maint
+85717 4f0dddaf82d6a7477e44c56c431e75d503132971 release27-maint
+85718 7717f8c45fcc37ff705231ab26a4880f2313abbf pep-382
+85719 6e8d2e2d8d828f73989d753d6e5ab2c27ccefdb8 pep-382
+85720 e3e6aa633f33b4e967f703fd57bf5f2104cc2022 py3k
+85721 7072a5b281d37e5c972a7ae817225ad78a4acaf2 pep-382
+85722 b5025569cbd406cbae94b937c69aed9e4bfec0a2 release27-maint
+85723 8e60d7a96142272ff171be7c06cebee6b1c6adba release31-maint
+85724 ad8923760d5c0da7423859947866705328488129 py3k
+85725 0511c868a4e38a4c40ba5f9583b53f55652edc92 py3k
+85726 b6ad401377fc59bca9190cc153a17a3e21ffa27d release31-maint
+85727 1f0ab729c632535b4e207308dc9301171a7f82b2 release27-maint
+85728 04090ab3531e4323e143899df4eff4bbe5ade8f0 py3k
+85729 c47ef180be39d6c4ee1a4e93cb4ba8b608701c87 py3k
+85730 e11ac30199b10ac3579be663f8154c34be3283bc py3k
+85731 34beab9595959adeed478376acc9c133b5e2476d py3k
+85732 036770dd90967ca2d946f58d441f655a2e8d535c py3k
+85733 962e1f4c9c003b482727bd4544403fc003bdba79 py3k
+85734 086519c1e7d29a8247679ce6dcfee4e9bf4332ba py3k
+85735 d3b61dc732eff2571f143ae33dc33daf19d04743 py3k
+85736 a661b424ed47a9bf4337d309cefe054cef7846bd release27-maint
+85736 a8eff39aeb0995a8c32bd0db960edc0f110e533e py3k
+85737 cf634a397bec81a42a83d76f5d5e8e06db27d212 issue4388
+85738 d4d53b4db96ed3889ae5d6966350988cf8a56858 issue4388
+85739 52cbf459da8bcfaafbc7dba6f6cdfc12eeddd347 issue4388
+85740 edcfc4c89f3040155277d420a1b8f20493546500 issue4388
+85741 59aac0745ec75b8c5b2a92294fd6e93981da8846 py3k-stat-on-windows
+85742 3baecd4e0c12a13ca61feef0e1563c809b57942d py3k
+85743 6dcf61447c33f681f1466a37620e430906905659 release27-maint
+85744 1618cb15b5b984400d8ae8a29204f2be64a23e73 py3k
+85745 e850bb930c842f1b5c5d3e6eceb51599a9b67945 release27-maint
+85746 5cf1e6e61c6c375aea8fa2c90ba85a0c0ed611c5 release31-maint
+85747 50dd86f6f24ad4b878d7b829a039b3a53a0a330c py3k-stat-on-windows
+85748 3016a6a4a680b84a3c0e4d2062011d725409a4bc issue4388
+85749 643a07cc9d7fb893981e74b4ad98872fb40c9074 issue4388
+85750 e53c80b016333287ef316f1c3bcd61bc84bb67b2 issue4388
+85751 d7ce37b9bced2036f1e706a97c686235a0f39653 issue4388
+85752 2f1a5506793115175de7d44fbff7507d7f284173 issue4388
+85753 f8fc24a1f9a6c2dbb665a53a1e64a745c5bde6b0 issue4388
+85754 ecfc0dd15d57f0d9a8af76218cb908de35982aa4 issue4388
+85755 e711b858617be72cc66419929f9abf255887c892 py3k
+85756 98589d0f11012ac63f8a9de9af7a47348c64a1f6 py3k
+85757 c5f97b0541585825c66dc0a43b8fce446d32ece0 py3k
+85758 80c0469f98597f81e6c3861e885b6e12a04ec07c release27-maint
+85759 8e6b7ab1e1a1407d6f09ccfe81f8389ab2e4613d release31-maint
+85760 cbe0224701471c4729f471621b51ec224434d3d8 issue4388
+85761 39366ba5f1c1074b7d3ad193542b63594a54b841 py3k
+85762 bec16a5e0cdac1ef38ee6644cb8971a1953cca5b py3k
+85763 abda8240a6405dbe9a9e397898c4966ef1b23d37 py3k
+85764 aecb56c3f4eb5e72f3cea937693f999848e9d94f issue4388
+85765 45079ad1e26009acc0f572440cac22ab0a774950 py3k
+85766 3816eb1286c0ce5958bea95cbb689122bf6340ca py3k
+85767 2e19d1f4b612ec893df0f86e680fa49b881beb83 py3k
+85768 717aacfd2dcd6836ca98fe7fdd4cbd9805b2e6d5 py3k
+85769 e8d5ad0c2f5bcb1e04cb83d6756e307c7846ce24 py3k
+85770 a2bb50ffdff3d4f9f4127a234374fcaf7dc05b4c py3k
+85771 2f94d68c27312777a834d6b73dc7c29b7313a06d py3k
+85772 0b5bfba7a907e6b9a0100ae34f5cd3f84fd664ce py3k
+85773 caa56cff2fb3a78eac2b34fd783c7dd17dcde4b7 py3k
+85774 080145d3bbf7681a61578597fd9d8d9c5032a787 py3k
+85775 e453e5ab207ca423c3257bb94ab081bce677f390 py3k
+85776 244090438623e11f12c4374ee780d766825b76fd release27-maint
+85777 e79c5767bd05d06f393cfb610a4866a45bc22281 py3k
+85778 02c1626ff60fe2a0e9c5655982c04bca96ae38e0 py3k
+85779 272b8ff60ba4c0843e0781c6bec9b413c36df5b4 release31-maint
+85780 8787f4bb4b216051989ac55db4a7367b2d8462cd release27-maint
+85782 bd1b31c37410bc03ac85111c5d10f5278086fb40 issue5639
+85783 6e4eea7543bc36894d51a8b33bc6eeb244c96de6 issue5639
+85784 7b5462951ac9b511e79ca12a2e7f9bad5b96d97e release27-maint
+85785 f984469de0bb6d3dcd1b6f53fc6f5e43d24b20b6 py3k
+85786 8525544968f3a5964fbe2f058edf7d9bc5841d66 py3k
+85787 12eb244636109417c9466341bb6f26cc62f2718d py3k
+85788 c6a0eb7f73bfcfd716f8ab29acb69ea205e65f78 py3k
+85789 46bbbdcd777f55b6bc25e061b257d52ae372b59b py3k
+85790 fe3557dbef8925235274015daadb72828db2ebff release27-maint
+85791 31a0ab7ac2d5b5527cba5adb9ab2ae3432862074 release27-maint
+85792 ea0f83cf7e995963226720174084329c66cce6ea py3k
+85793 846c0e1342d0ba1aed51ac018723e116a269446e py3k
+85794 1438d6b67052650f826150dd5b72ae20c6abaa8c py3k
+85795 06dfaeb58bde01c368f3d15ef51948ccafd02480 release31-maint
+85796 858af60b2dbbcd9bcc4c6ff0055109747dcc29b8 py3k
+85797 d985ba9811e98ea580c13af75f5a78ed94761845 py3k
+85798 9912d61cdf34c2b09200c40b295aec5a72bf8dc3 py3k
+85799 cd80d05f2fd67db616008ac67f08c1b6ed0ebd3f py3k
+85800 5b6e13b6b473b5fdc2ff50d5990c2ffc55bb83ad py3k
+85801 3835bcbfb29c0c6b310265b0b4d12482acc020bf py3k
+85802 902f577e7f94959b057391766c0e14a3a16b888f release31-maint
+85803 be8ae6b17539d2995c06ca690fcf1f2e502500d5 py3k
+85804 8d7f18332db7dd4194db71f1b3f114c9575b6160 py3k
+85805 1a08f4a9eafdc43eaf3dab63eeaccbcbeda53d23 py3k
+85806 a30e75820b8deef7101b21ce7ed76c3a78d52c93 py3k
+85807 792005de277c86a8a4819ee4cfed02cfcfa731be py3k
+85808 e996c61e47c7b39395615e9b869cd237852cf1af py3k
+85809 098177acf73f2086081bb17aa2313319b382415e py3k
+85810 b9dcfdffcb620c52724a1ddbed0e9bf505dad035 py3k
+85811 ebf6741a8d6e379dc710f9a9087dc224d472d5ec py3k
+85812 a94fb8db9f1a50f61b0caf54a777409de86668fb release27-maint
+85813 db5abd81dc94ed6a68d807d892a256992992071b release31-maint
+85814 18989ad44636ad75ef1858506ae94e88cadb35a6 py3k
+85815 53639e57ba40923af35c433b0da36f0ce1629d70 release31-maint
+85816 a4a27240fe0934b809b738ab729cacf169eadce3 release27-maint
+85817 f148f864b168b087e89273806d277ee1d858ca58 py3k
+85818 b172d7537b99b5404c968968eb3c13eb98d86871 py3k
+85819 5b536c90ca36defb30f67858bfaf7dcc4b43f453 release27-maint
+85820 a82072ca06baa051d3c001b19a0ddd59e67fd8ad py3k
+85821 c5aebffc9fac465fa8205c87366293003e0bed5e release31-maint
+85822 ccf2ff08866b9be6c2ad5c69020b12a4e01521a3 py3k
+85823 b4e370c8e7caf4321251a8e82c70869df0453144 py3k
+85824 39b9e9de372b201030f55efbb0e651e12e11e76d py3k
+85825 5a05454e565fa78f3507638cb3da1feacbd544f0 py3k
+85826 1908a146e961dc39f80b0d948df95f39260f407d py3k
+85827 db5a5080f9b8a0ee1eb6d4dd9a682a93803d4c92 py3k
+85828 cb6418f4d60b9cf649b03446048eef3457ab8590 py3k
+85829 4e36065283cf2c6f76d75cf136ac3267798646ea py3k
+85830 159530f0e406a864e2445978116de1a005d58646 py3k
+85831 660d5f32482ef48943a06ec878a0a7463bddec81 pep-0384
+85832 f570da9a43f86e0cb1bb76c07822e784964b5ab4 release27-maint
+85833 44d81922a88f35dbbec25d86c2ef653e76541d8c py3k
+85834 5c1ce5c360da21fde3f0b0edb37f40cce167a291 py3k
+85835 3a9c3ec5e9d2cffb0cfba645875deaa09ddcb77b py3k
+85836 2352e5e44053e95bb686bfb768918c2e160d004c py3k
+85837 0f07d2dbf820b8949250c4e90a1a41b61df2fd58 py3k
+85838 4e92cdefe4c7437ff92a8f12e3bc663959ba6a8e py3k
+85839 d7d323de35e76d28092926eee7199c50379bfc67 py3k
+85840 9d3eba03fd25d1d7eea4c85f7d46031db0740888 py3k
+85841 ceebb3f45f9fc62389d38faaaf2bad4f39122945 release27-maint
+85842 772b55f02835de6768cb38f18bceb60a7c842db5 release31-maint
+85843 d35100cc6c6b1b49035359562b5a36cd9f98a1c0 py3k
+85844 e55a00cf678a7e971dcb1cf013fa03a7c5a5f1a8 py3k
+85845 b9c7bdcaa031d8921654c628dde6cd3c075b83cc py3k
+85846 e515d12418586e5133dc4b597c70420c47569a64 py3k
+85847 32c4e8e95ca3cb5bf88dddd395d4eef0dac62e37 release31-maint
+85848 841892e271f7f85141babbd0669b123d88f625dc py3k
+85849 a9c79a9d2d91d09fa284ce4f49b744a1f1263b93 py3k
+85850 9da5e04b0793b9926f101a8d03121fa687a08824 py3k
+85851 1187156a1f32c116d7ba4a9da52314eb13dfb1f6 py3k
+85852 c892e4547fedcc96265dff1a3ab6bd1d943c9834 py3k
+85853 29af181de2f2d88f39a321313dc1b9b89df32045 py3k
+85854 ba1c73e16c8b1f93a8aa5f9430b5a1e30e3d157d release27-maint
+85855 ff6fa20bdaf8deccc5d84a60bf94c55636b87eeb py3k
+85856 9e4a2809e55ce0f07443e6283331069a5ce48a5b py3k
+85857 4b542217e93ed017f5eeb19c2ecbf57a8ba27eb7 py3k
+85858 bf5da636053ab9926dc7adba650b7a969f0ce4f0 py3k
+85859 6938d7ad60e41ae509cab4b95423c0ab48cf45c1 release31-maint
+85860 df02093588d6bc2a1ed8880f5b4eb0a945c084a5 release27-maint
+85861 4dca3f0e0fc0467d77cbce9b8629e5583f6c26ff py3k
+85862 e9e3fe4c9e300e5acc215739d4a0bd78dc7333b0 release31-maint
+85863 ebb82f01dbe26109c4f4da1db0c35c19c4581322 release27-maint
+85864 59abdb9278f720324373ca2eb1ff830504ca18cf py3k
+85865 0d50a911d74fe62ac0c695bae854feeef9dd3f12 release31-maint
+85866 af06f0972d97a7687c6a1f2cf9f802734963b39b release27-maint
+85867 051aa427dfedff59d2d2902550154c2742376a1d py3k
+85868 214b9051841ea89e97d913340c862a522c3d4f7a py3k
+85869 add1bc05e4266dbb9d084ed2d6938f28e257eaa8 release31-maint
+85870 f5e3de87b14bf040790b51b052d538e01a41a804 release27-maint
+85871 64de1746cd6e396320a2c8c1e15e1f3973565226 release27-maint
+85872 3e78ede8fd21247b7abeb07d4ea3b7a29d4e7865 release27-maint
+85873 e4425d68dadf2c3864759840ef0c7379cb8a77f3 release31-maint
+85874 a281989a218b0c1d5e9fc55e7435579d7acf58a8 py3k
+85875 3ff99089c02e304916bbccddf3a5a2c0d65a8900 py3k
+85876 6dff581d30f381fc08e35d74cdd89071787593ec py3k
+85877 e5f269dd318b87ea17e61e9ee97257406b9f12a4 py3k
+85878 5a882f789ec1e7d58abf1d0c38fd4a3a0be909d1 py3k
+85879 5b163f2a602beca31821b8feda6e7376ff85f79c py3k
+85880 7ad35acb20b0d498c220357ef20f89b2fa4ad0c2 py3k
+85881 2110d269a86ec00ed345b3e00af50b85834c3b53 py3k
+85882 731233f904869d9f597c53358cbf20a277d4db41 issue10209
+85883 b9ca102a76d033434449fb77e3413488b93fcb66 issue10209
+85884 66b44cca29bb83305042e935cdc0e42ed9944085 issue10209
+85886 d07b9b0caaef1e4a94a8ca60ce91851fa218d7e2 issue10209
+85887 3f7d0342949186e51326d81c9666ab4cb89a9a8c issue10209
+85888 6f31f0af53576500a55208acb73efacfb003deae py3k
+85889 5b8e688ea5aedd9cd5b9506ff04efed0ac115cbc py3k
+85890 15eacb4c54228321f389613b0d7031d592bdfd6c issue10209
+85891 dc06aed9b9845f0cc69784f34189966f914493fc py3k
+85892 5383ae8db3cdd1b5e019545e928f0e17f26ffd05 release27-maint
+85893 1c114d39ae5262ac53dfb853bd6428b7271b9b7e py3k
+85894 698d30b45116cbc40d96ede56c1195db1f0d26b7 py3k
+85895 613c7b596fe7812de87b4017fe5c17ebcaeaf067 py3k
+85896 1b7a0385c65f7ab8897731382f15930bee7d2626 py3k
+85897 70ebdbd79a02d083cfb8bb61183980a35c2db96c py3k
+85898 c6d86439aa9184518541f9e01de90564b36ad62c release31-maint
+85899 41a30140925be13526e4b480005f4276a12ee300 py3k
+85902 a56a2a803cd78ef9417e9d006e49bc93de37471a py3k
+85903 b66ded4bff2137cb2c4a1afe56dd98ca1e5aa39d py3k
+85904 6ac18576e8fa996eabfe8f0fe1b7c25eb11def08 py3k
+85905 64cee8d11f2e8b8b65e6ecbd7360f1f7ba2c7a52 release27-maint
+85906 e8c8400caa99ca57f9cbf36239bb8c6902e8d949 release31-maint
+85907 4af14f9aa970565b20412c82573e7831c62699a9 py3k
+85908 5e720f9d1e6c19d7fc3e3310d952f5600e30a25b py3k
+85909 8c5a101a63545837035ecb5e551b51aeb6c73b2e py3k
+85910 8a8f2aa9db0f990d5ba733ee28ea5c3ef47d73be py3k
+85911 722b2a4fae0d196f63c6310d7e0a0e45ef0a8bec py3k
+85913 4d23de4f41023c793cb6668de9adadb87e4f9893 release27-maint
+85914 0860be9c83433a63f99c7f4bac66620e4d16f966 py3k
+85915 16b92971c2d440c2efdab572e8a96b2933fa224c release27-maint
+85916 050f0f7be11e2622499011c0ae5f506f86e77831 py3k
+85917 f349888fae6439c0bbcbb2276df9c41e2e06de83 release27-maint
+85920 cff78ffb932a276fcd30da3483327c1852921ef1 py3k
+85921 0b5e6f7edf6e62afcf8fe84512af2d9c37c1b0ad py3k
+85922 8e6338ce084664beac7f5e2e6a2881b344bc300e py3k
+85923 4a7a3e51cd29a0268ac751f94819d3552ac6034e py3k
+85924 d14726f4b4107b56e188b8a81fa672d2ebf7cb27 py3k
+85925 cf1d27321c7821728a7dc02fe1739804e33c8f95 py3k
+85926 40427760e16294aa9474463ae2570d594d48b14c py3k
+85927 372d6aff15be8c64e6e289324182e899a717ef16 py3k
+85928 8fa132a3afb5be9fa5f91353f6b6e784a10bcbaf release31-maint
+85929 5c13cd0f99b45e4596a8b8d873dae40f5516c090 release27-maint
+85930 1532ca21b920586764d5ed13cae9899c8bbfc5e2 py3k
+85931 61a9ae522dcca6b49602499e88dc1382fcdd1ba2 py3k
+85932 f3a1eac635f98c7ced74b62012d92d0d9e02e066 release31-maint
+85933 f8d344849596e1516a4bab4184efcfdfcda4bca5 release27-maint
+85934 a4fd3dc7429970767a961ce02071af661920d126 py3k
+85935 8b32e4f6bd99d2fb3d5a42ec62bbf46029228092 py3k
+85936 b18275b117d210b4118d583e01550270410940c1 py3k
+85937 a0626f9727e0f2d08a29533977265fa209d8738e py3k
+85938 765d421d943c73514f0fa834b7e49d86221071ab py3k
+85939 1d55cc284d4ab5afe374bdad3d92009a9a8029e8 py3k
+85940 2c2eced635f60d0a3b7799904d6d687ea68632c2 py3k
+85941 eb50c48d9cb4908aa4c55dab3fdcdb5f3a2ee580 release31-maint
+85942 3da23deb6e9a519eb6f9857daa2ace34506107c3 py3k
+85943 d161714e7c928c4e33a37f8e025ef4ea8e674b7b py3k
+85944 556f591665499c242114967c07fc838ad5736a2e py3k
+85945 beded47bb17f8b0e3e06d77746478e97643dfd7c py3k
+85946 926e8b6b6c9d6f783adf3f1f7ae92e7b833a8fbc py3k
+85947 e727cf354720108332fdcd02dcbf93a38b87993d py3k
+85948 5386f1f428a15eab58e7cb36362c67b4285fd1c0 py3k
+85949 f24a53ede9ed8e84cbc914ac3aae99e9441e77af py3k
+85950 1c020bcd50cd7eb450dda64325f9aee11bb74090 py3k
+85951 5c013ec27327ddaf91693e9698bb9a7cac5dc211 py3k
+85952 e38d2d173085ff285ec469ae650befccb3357cda py3k
+85953 40ac45a092b77d4a17c19f646302969cd184f7d8 py3k
+85954 c85f5339068a11b9b1511651a5a695dceaa1409a py3k
+85955 64ef61d9ffdc4141ca2121fe1bc2ac2831c57e14 py3k
+85956 3ccc6ab546c3b1206372a2aa9298bebb0a87ea26 py3k
+85957 3fdbc6a4b0d0f7d8102471145abe8c61dd9d76e4 py3k
+85958 1883029c7b8a749416f247ca7edbd7ff614e7817 py3k
+85959 baad52e78dcb3ca2f0a7b1d893ea31dd08ceefce py3k
+85960 0f765c33f4de273f87765bd63427011bb5724f17 py3k
+85961 3b210d048f5dac49cdd1885fde067388d9d2f27e py3k
+85962 98ceca251988e2ed38a96b288fcda3637e866c2a py3k
+85963 9b66a9f137b6c09880c3b55212fb9a7a12611c57 py3k
+85964 603010af80cf367f021051ff2de6a8d7f20e7dd4 py3k
+85966 64a97c4ebadcf494b9bf13c78d9852e83875ef11 release27-maint
+85967 182cb3f82b0b65783becd704281e1431e6735b5b py3k
+85968 480e45828d4b19120caeaeb9a3418b79f1d2a6b7 release31-maint
+85969 0a2ec174fbcd628c123d68977bd0c575b77c1165 release27-maint
+85970 90bc71d6bedfa17263da98b6aced7c085dd71a4a py3k
+85971 3227b6f204cc4b260cdf7f584d1265160108699d py3k
+85972 abbd9d26ae6c64ee48353bdfc6f59ceb3c79c327 pep-0384
+85973 ea7b2600fdc598af35e0d42ea442994933d6226f pep-0384
+85975 710968a2e163b8d9724c46db1f2e4b55a43c14fa py3k
+85976 9356d765d78e3d1b098fc3017e3bd4a58adc9a66 pep-0384
+85977 f9721a8f87bd8bd3d83dabe5899a6a7a21750d80 py3k
+85978 ef6dad7517c5c54f9870a4bef296aed3de1766bf py3k
+85979 e6af146bb38b8860c470d9df40a8286a17dbfe4c py3k
+85980 ea14977a36def88abdd5f5e0cb7227d62a30d90c py3k
+85981 b03779f00739d4c6c94e8d0257f0260086602bd6 release31-maint
+85982 819b1e0535d190a6d54850f69f83b752d2166486 py3k
+85983 b7180afa0dff2f78e75e0bd7d1d01a8c1dfb0826 py3k
+85984 36ea71902fc8d1c982aa21ca786bb00e94e39f1f py3k
+85985 3856c61b5c8bbbed3d35df721824e9f4e3a022fd release27-maint
+85986 b01fc3a42d35fb8bd9d4a964392098cf2a1d5100 release31-maint
+85987 72a2d4d940032d255be4a9588c8c3f96b6ce71a5 py3k
+85988 d698205543bd7196095f59c3bc5a4919bd91938b release31-maint
+85989 e203ed071fcab4371cac3a4d0642e6bb82487d79 release27-maint
+85990 b943965fc42bc91f70f3d2f88ed673297e0aa336 py3k
+85991 8d8243483228c03fde9c856b14fec292a7aaa9cd release31-maint
+85992 24b18cd4d5f3549724adbbfd73bc2d5ebdd9aa2f py3k
+85993 42ad4ae6d8eebb6b240a975d2f1a0642e963f3b5 py3k
+85994 624e831ce700291fe8e13cd26658bc37b2e26d32 py3k
+85995 ce53fea7f9573f8afe8b6658bd8f907f7aeed600 py3k
+85996 5b627035a922f7a41215588339b52effba689196 py3k
+85997 9251ba272f2ca33f08abc51a8e8a526ed686fc86 py3k
+85998 0bc2b06406f8be3a316124e8363ab3a92e91461a py3k
+85999 1954c8e31cb38a89d67b315c466336a90ee592b0 py3k
+86000 f182518f3f428cccef378c975f442411fa24e45a py3k
+86001 71f4f3b1c3356eec5c8cc5e16d2dce0b3ffa61f7 release31-maint
+86002 9f10968f511d73f1bac3f9374736498a6fd5cc91 release27-maint
+86003 736f3a10d1733103275ea9005a5f01dd142437d2 py3k
+86004 06e21500119a29cef071fe67b88c2f2a91d18fd3 release31-maint
+86005 732ffa86c798a9ae6bc29e7b833ace2c24a78a65 release27-maint
+86006 211858723b8ca94b57ebd63668188e00d0b9b9d1 py3k
+86007 2e1ad7121e297f176aada2d61f44aa0a0853631a release27-maint
+86008 459e95b6931be43a3203de154af469958b489fc9 py3k
+86009 87709c6e56905737b1099e16bc8cf6fb61946eb0 py3k
+86010 90bc0c5d722f774c5488add6f5c752c8956d88ed release31-maint
+86011 305e93fd5b6d4aedb6f35d7ce1f36f62982578ec release27-maint
+86012 3a7559ba8eb592036a2ace0d1836dbd012c5de79 py3k
+86013 49a31ae0348a58c14a3de211e1eec88157e22ac7 py3k
+86014 612abb1e767621c7b6b27fdc710410941f66c5b8 py3k
+86015 8be08761ddc0be57f454dfdb3306017790e99d68 py3k
+86016 97f32ba5ff854a6abd2ef937cc799d52965d4777 py3k
+86017 0ee86fd902f1ef35bdea64a39c35b9a69feaf64d py3k
+86018 0ec3170faa95e582e5f0a965170a9341c277505d py3k
+86019 af9f9efcbb9db64d65a3f43d3a505ff272367d4e py3k
+86020 085de9603b629ff21450e0a602fb9e8dd1690a4f release31-maint
+86021 7608dcaf786ddddbfb0df07d3767bff4209a051d release27-maint
+86022 94c5ad981c1b7f61a350c14af6408760f01e01d0 py3k
+86023 b4819838eb5b73f21414da94c17f94b10f9395f1 py3k
+86024 21872c24a25b909cb448222a482d452fd5ec2871 release31-maint
+86025 9e291be489cf5514fb4271b4b21ff62d933139f1 release27-maint
+86026 fc8658619bdf49dea3ca419faa7e3e0b57189ad2 release31-maint
+86027 d8d33648d1b2c7e8ba2947f667ec58e7dae912ba release27-maint
+86028 c9820731883d9bd4ff4b0a0b91aa335914fd6345 release31-maint
+86029 f3afa10ce77719e3bbdc02a817cde366130fbd83 release27-maint
+86030 131e7cc9e416cd61881f903b3cbc1ca6c28a6df9 release27-maint
+86031 32c191a5c1cf9495bda0fc46881cb422f5778f73 release27-maint
+86032 b89b0c7f37094a0b733a096ad4a48596483f39e9 release31-maint
+86033 ae06c048de2472804318e8eb5060d134bbf0f9fa release27-maint
+86034 3217b10f8413a8ad798ca709693603e34cca9e10 py3k
+86035 9b81429620f4b7745eeb3dc2db6fbd269dd84ad6 py3k
+86036 4127ab1f6338c2c80e4356742688c57b7f5f5c32 py3k
+86037 97df5dde9f81ba6d4e27ba4e1682edaffff21833 py3k
+86038 a6830cc822aabe333d952867ff96769ff044979a release31-maint
+86039 140d471b061a53d172f9e42a620361b7114f3733 release27-maint
+86040 75ac13fe7da03bbca4c33e910b9eb2b0d2cb3730 py3k
+86041 6fa48fa2a86568c95835232fb790e365041ce3c0 release27-maint
+86042 94432e4cddcf6241c9303d087868fd64344da222 py3k
+86043 5c5b7a9bac05c6459ce8d9248a6147f16adf412b release27-maint
+86044 497964cf9e58e60bab7fb1da9819941c5055a701 release31-maint
+86045 5bdc0d6c693933bc83d92f0d26514a9843cefd19 py3k
+86046 5757942593a0ebb5079fa216c1306f7e4280bd4c py3k
+86047 de1e5eea7e75d105be08ac4bbf2c20090e1f33f7 py3k
+86048 719ebcb934f3dc4401556668c1ae5c07606f92a6 py3k
+86049 bc6cce4ab3c6367700f9d6ad2a48ad9e29d9b06e py3k
+86050 0005a181d10bbb94fa0e122dfb939639e4167398 py3k
+86051 ea2c2fc019d65c413be1b62ffed3c1435add8178 py3k
+86052 41d5d3d7da218f9a24e7039ebc6f4e2af26d35e8 release31-maint
+86053 0a94923783a47d40198e4251736e6f84b6954881 release27-maint
+86054 43acc9543416b45b050bfa87ea3c7799738d0925 py3k
+86055 9103aa9b2704c9b59cc30eb8c56f27cf8787a292 py3k
+86056 0599d2188837ec421f0956df97fcffbebc92af8c pep-0384
+86057 feddb9a83aef1c6ac68153c481467e1b5d179226 pep-0384
+86058 0892b2c3636d9e0c28c30eb76f31f7f08493ab21 pep-0384
+86059 97b9d4088914e384b1b23a31eb1ecfbf0438de42 pep-0384
+86060 12433e989d9c9019e73d3aaf13cd0cdc362632c7 pep-0384
+86061 3933ab6f6f7ac93d9e7889f5f7ab249ea0a625ad py3k
+86062 53b51f5e95c4ccba355c55217ad12d959a70c057 py3k
+86063 d0f1ca1a81391cd3324dab98a2e80e4fdc38397a py3k
+86064 b642441da1ea590fb270cc4239af31b35c0554d5 py3k
+86065 eaa50725122b66c592e33f3481c39d4b92d2e3b9 py3k
+86066 a2ce8218e0292dcdbc93173afd7e7a3b4fceb963 py3k
+86067 6470566196b3d35d5387f60196c98875f7af8bad py3k
+86068 0a3ae4a255de3ab75505e1fc84d0029e13c15684 release31-maint
+86069 fb12eeb1e7a9ba218ea9ee5fce5fa9f097995daa release27-maint
+86070 d0b20a6521d2146ed587bb49d212cb5f0c3105aa release27-maint
+86071 b5e1e6f31437f2c756c655d87ab7a2459844b208 py3k
+86072 c82487513e76906ab407021c9eb81086b7982194 release31-maint
+86073 ff2c5c9c079ba06c3e9a77343765c811fe738f62 py3k
+86074 7dc136a010137066b2a8f915e15e93327e69a6a9 release31-maint
+86075 451c9bb75159e42afd921f85596f87c897501846 py3k
+86076 720d45a6e3169d6b55c62fd950fed6b745e68b4f release27-maint
+86077 fe2d19b2a5c6d2df8f8b0a52ad8f569af946dae3 py3k
+86078 ba2ae097f5675312b09e1daa3bc6dfa056dce68e release31-maint
+86079 206ded943534d36b65f410b3dc908caa199b856f release27-maint
+86080 8e65849f71f50938e6dffc63e623c229b77cef1d py3k
+86081 beedc7856f5b139299c760bf4a9098096e0d0d71 py3k
+86082 9d1133c1863e4c066c1481b4d59d77cfd8b26641 release31-maint
+86083 9db8579604027235fd67a3598c6466212b6a4048 release27-maint
+86084 f0300584c82444c8bbfa93fea7a61830170d99e0 release27-maint
+86085 e5db32f4f4cd682a27f837b57cf35a6fa84d0e90 release31-maint
+86086 e71c2e1daf570bfbdc4ca97beb0bf3e5a88e547a py3k
+86087 493a2d407c94468061ffdb72226d5e4039d54010 release27-maint
+86088 43d2d5afbf738b591433f08855ee430a4c885b0f release31-maint
+86089 7c58faf22e9f2ec5779884cfb8a08b4c1d9df7e2 py3k
+86090 cb9e10034e4a65ec271dee0c033342cab7c45513 py3k
+86091 848912789b794ab405ea926be24e26882b606825 release27-maint
+86092 d8ab35ec486e908663bf88ee054d005a1239aee4 py3k
+86093 5952b937ab9a28b2225d3c98c6befa3ed0f8dad5 release27-maint
+86094 b3c098c3a82669f2194e3b39bf130c62720f5c9c py3k
+86095 621f3e9aceddc5e78d68f88925ae63b9e2590a99 py3k
+86096 3520fea5e922eb7a3107bb55fb17f3fcaf867121 py3k
+86097 52084ea63c42121a97a4589b12fb08ad572715c2 py3k
+86098 c791d026100624b431163311c4086c28d5eb08a2 py3k
+86099 538f44b32b0a8db99067a246c10679e4f3473917 py3k
+86100 ff816889aa61fc6227ae85da89f043d98d4d7036 py3k
+86101 9c7ad0ed66cbecadb56abd5fd6fef52e6a976a53 py3k
+86102 be1d7f619fc0f0061f86f15ee74f2829af04672b py3k
+86103 8e19ff964cc8da1620b587e7823b73730b860dfa py3k
+86104 4ea94c5f6d1025254d9793ee5beeb05749d99e3c release27-maint
+86105 889fd8ecbff42449da53fad64beb137e03e72416 py3k
+86106 a37d6d81f4b1e9d5b8a04d7a906649436247a7b1 release27-maint
+86107 a63959eec8ff4addbb894964d300bf98e72c50c3 py3k
+86108 b346c8d33e5601ec7a09b95b8b9f641a36628c8e release31-maint
+86109 deb23cbab5ab62353956e608392b0ce6a3c1702c release27-maint
+86111 ff6f39b3c38e46bd5a524b4646786ccde1e0ae99 py3k
+86112 573db2af2dda74f2337dcae47dd1cb99aff1e5b6 release27-maint
+86113 f3b7188171c02cb5cd7a7f796274994eedc13f3b py3k
+86114 36872a0ed94335d808001a20351f1253fcdf03c0 py3k
+86115 d7edd15ba0f2ac104f36c73e67a6648dde3cd0f9 release27-maint
+86116 15767902b545fc7bc42bb3a1a8b596b818cdb4ea py3k
+86117 49f18a9533cde26208e07e5bee1796bf01e1920a py3k
+86118 edf406eab1db7fa2e039a4a56f6a31592247b7e7 py3k
+86119 6eed0fc18818c10a6536f926f5b7da2fc833ac22 release31-maint
+86120 4ccd068cba0c9b0226b11e722ad36db4e9c6fea0 release31-maint
+86122 f4f79556a522e04f0638fa938bc61e1e61389353 release31-maint
+86123 004d5f165738decc0cf2ccc381f633c40fcc045e release27-maint
+86124 a285843e958a4c3a77c3351c20abad3443ebdb91 release27-maint
+86125 457792afdecd610bfbbe2fdc099794e53d3d03f4 py3k
+86126 23b49678401f18170ad1d43f40ec8920353cc1fa release27-maint
+86127 53fb9916327e0febd548087e70d544262a6162c6 py3k
+86128 109538716c591d1630e89f7dfe95ce94db2c2c12 py3k
+86129 0ce0f8ebdd2985223823237d51987d461a77fd9d py3k
+86130 191067f49fca0552f266e6bc967168ed7c534568 py3k
+86131 f980f944be1935426d4f4df14c56695e6fda0444 release27-maint
+86132 68341f9c59373fbe86beb2ec5f6dd9782bfe0dcf release31-maint
+86133 2697326d4a77d3ec87a935990252244805a1cd58 py3k
+86134 a9dbc87a3ff4aca74762642665a142ee7aeacab1 py3k
+86135 6d20dde9609c91e7ef6b30201a30792e3752d2ec py3k
+86136 b96edb02ef630f719fe9d663a4b2df0569ae2518 release27-maint
+86137 2d422f10022ff071477b4af51b186fbdc67b2848 py3k
+86139 58e54f563de7cf3d42a60acf20db460a5499c273 py3k
+86140 8a4e263796a3e5ff595226e8ca16583e81531ce2 py3k
+86141 b8c206e5ed44acfd3c72ee27ef3bb9353825c41f py3k
+86142 8ef32955a3494e9c6c4f9cabe8120e2f4f9c9dd3 py3k
+86143 5b065cf60dde12a069f8ffade3e0b46d754156ce py3k
+86144 f255012b346bc94a160595d800ab7b1a3c4731ed py3k
+86145 67085f2021429122fa12edab7f228a1d9372d0ed release31-maint
+86146 142d5390ac5c6a02aab2f9c42368e3ec9a359714 py3k
+86147 4d1ab2d25baf6d8ec4bb95bfa841a80a41ef98dc py3k
+86148 dc30382ba89a1307c840c5d9cba9a303e9bdb930 py3k
+86149 f29f62c357e14c95fd246a83c86067035d787829 py3k
+86150 81b0e89e3df3cd943aff41ec5d7b78149c2d4e31 py3k
+86151 8a5f0873d738021985ba6e824495559e214bdb21 py3k
+86152 8d659a5479ca84893a39ffa840198d5635d5cb06 release31-maint
+86153 46241a35b5fc507c3df26686e918479c724f28d5 py3k
+86154 299735e5fd7f9114c33abe2e527584a71a440ab6 release27-maint
+86155 c967314ef61e73f2e76c4edfb410fcab7d6ea243 release31-maint
+86158 71ac523a6b12384223e87b468413a9475b30f2d5 release27-maint
+86159 e1b61b052c66bd3f4a098132b4102606621564b0 py3k
+86160 1e4d46a61fbeeeeb3eb45090f98ea6b7ec86a313 release31-maint
+86161 844ece37376414cd3f586a2fd1905697a892751f py3k-ttk-debug-on-xp5
+86163 7c5d1dce39faaa6c0c3700a0d93652847beed278 py3k
+86164 5231a5a37a7acfe8673b12418a654f933fc5bfd6 release31-maint
+86165 beba2de200dd165e2a33c4e519ff987f41747b42 py3k
+86166 6e07c7e4c7cca948565af09867dbd0fec1142454 release27-maint
+86167 cc7a88e0889939aa620e247071db6d53d2af0247 py3k
+86168 ff6585a2a2432c1aa1cf48e1514ad57e7fcf633d py3k
+86169 6631e5f6d2cee422e32ca0c7dbc77ff6d602c660 py3k
+86170 05eed9f0ce01552608eab0d69c02f3c6e57f2f2e py3k
+86171 4294e2c002454001d474f9964d91e46878c2baae release31-maint
+86172 1f45bfb984737017c2f874c64b202dbc0a2f0988 release27-maint
+86173 ddf000aef5b07a44ec4dfb98c399cc9517680dbf py3k
+86174 3292cc222d5cd86133ddeda545e89e33240ad5cf py3k
+86175 270b50296ea9fb0ed075b8731fd42d631c951191 py3k
+86176 ea5aef32a17f1736c964e45ad605a49ca01ded89 release31-maint
+86177 4bb9c974f519876c70048a6136b14a9be6defbeb py3k
+86178 4ee682fbec30dbb14642be2bc0650785584afd4c release27-maint
+86179 62b3a0a99b19e4a6d567ed3899cd8a86d203a5a9 py3k
+86180 2d5dbde64a358b26993456491182e23b81bf1604 release27-maint
+86181 48e5549e2c2589f3dbb1c0e5128a62c59c947f78 release27-maint
+86182 7ab72ba38fe02e12b14d8b1789009cde9a0bb46f release31-maint
+86183 b836f04759cd3633faf62ff58c94c56f20553199 release31-maint
+86184 947b5acc64bd927e4d0676280b08cba6a93747d6 release27-maint
+86185 6e1ae323fde626b62fcab2daf2d61e1e7a5f1c4d py3k
+86186 430d50e3ac531a4f38b120ca8a7f73a87a878bff release27-maint
+86187 8cf8bb5dc5f86ea2c011c9409e66e004f56745c7 py3k
+86188 ec9dd973532f3c0482907ad4da235c237cc75228 release31-maint
+86189 bb66a4f5ebc2aba8559b013858a963a289c29fbb release27-maint
+86190 1ce69ee69e8ec01854248c710d25bf4852081578 release27-maint
+86191 4c1c48b3af6626b606805d1df6af3242ca6bc03d py3k
+86192 79b3fc681cb09486b4a1bf218214a83b0bb7bfbb py3k
+86193 2d05e9fdb597f02dcc1944fc27e09d99faf45bd6 release31-maint
+86194 7d28087fbaf3a9a697f47287057258b740031a27 release27-maint
+86195 b0249d0839edab123e8346c116bcb9155d7f1f80 py3k
+86196 1243ec679c298ba64ef2f5614d21e08ea6d722fb release31-maint
+86197 62ff116443391d0e3d995b43b7dc4661db14da16 release27-maint
+86198 18896d580290aca306e9c8ed2aa228344e640bdf py3k
+86199 c500b4138f7b9c1179a80d9ebd8e30177d4892e4 release27-maint
+86200 62085733f7dfb9ec2aa22bcf420d9767c4f883c5 release27-maint
+86201 b254c6507c35d2740894eb2c325d1d62540a4037 py3k
+86202 259a9bec2326c691affce617ddd26ee98ea40756 py3k
+86203 ed35b11ebec68ce7f5d60897a8a3a31419fd02e6 release27-maint
+86204 2a332e715766386edc8fccab12977b0d1a754c63 py3k
+86205 e213e465a2dc8552c98e5c577a397b25f583752e py3k
+86206 edf8c4b00041e0958a383c90684777fd926a9188 release27-maint
+86207 fe8962fc0e11993ddc405159a25ec2cc7b9f8d3b py3k
+86208 239ffee5edae529446ac34c3fcaf1e3b9c47e29c release27-maint
+86209 5b211dc968dfc7bc9a9ff3ee3dafdcf21f2beecf py3k
+86210 d31eaec883eb3ebb7108acabb6bf5e4d581042ec py3k
+86211 49b0d423023ed74fa30c8bd5973316b6ae31e1a4 py3k
+86212 c37bef8dcea2cb590d105cb9564aab664690eee6 release27-maint
+86213 edefc5d2b3d74e9fb5734d440db1bf8204e5d329 py3k
+86214 d33d62ab91ccacf6e3793a915882b071b91336f1 py3k
+86215 73ca6dfb22aa151382038912e080e66c4c16b186 release31-maint
+86216 185ab7c4b94691a88eff723512ddc13469d275f5 release27-maint
+86217 385d239bcbfa780666b15473b3d595c77bfe5264 py3k
+86218 82221410562b3db08cf1d930cfacdb745c738411 py3k
+86219 458b05abf9873d9a76e2bc3e7d49d4b823a8c026 py3k
+86220 571d317b4cd5f2f3e6531984b9a1524fee1da8ac py3k
+86221 5ded25e06a9afbac2fa90dd5ed440fa3709ce1e7 py3k
+86222 f90ed37ae16f0a442f499ea061c9c84713c20395 py3k
+86223 3bf86785cd9c5e3791b552bdd11c9494ec0f561d py3k
+86224 10e0580895ed4580420a8a31e32522c28e1713df py3k
+86225 fdd3681b14399643249eb34e71e3f6611d0c8152 release27-maint
+86226 e3fd1205b1055e5856e91598d693305a66728fd0 py3k
+86227 3207d9f4d00aed32e80d57f832055b089def7cb3 release27-maint
+86228 a090bf716a68735679c1a4fd0a3838461451c4fd py3k
+86229 9d73f9827c9f4a5f9b3cb43daf5c3d80175f5031 py3k
+86230 53ec38d31988a1d2d591120bd14aece2f0393b5b release31-maint
+86231 8911f475ad3d2ff3cdcd162502bcc1fe85417a73 release31-maint
+86232 96dbb0c168b67953137e508ccb91ee79e5249f92 release27-maint
+86233 acb0a3cc1e18c709d5b632b221c04b683684c125 release27-maint
+86234 9f86211f0a4273bc901b8655ec5a56900a2f75c8 py3k
+86235 2223afe3eaba948049719f7f546109be04601640 py3k
+86236 96f30fd54e0fea6fbdae3f97c42291535a7b5e88 py3k
+86237 f5dd4a54d79b515f9fa297d5993c875d1eb76e40 release31-maint
+86238 a17b21c27a3384749273e7855b3495f6bedd89dc release27-maint
+86239 5d84f1b73d510282d559436f43113f3f714996ef py3k
+86240 ff072aa70c1da74a91c15ed081fc8260c10b8f22 py3k
+86241 ccd99d5479dce7917a9585d0af70447042b9dd94 py3k
+86242 d43bf30faf6eb85007eeef78b9dfd4cf1031f4aa release31-maint
+86243 636fed8e78d63f62af1820b61eb6f839dffef007 release27-maint
+86244 b5648e10c23a7dc1a82dcdc28be9c57c229fc5e6 py3k
+86245 2b7eb0e86d07cdfc5ca51e35ecf052a10ebdeff0 release31-maint
+86246 df34991c7d0e95ab7cd0a849633ab1740627329a release27-maint
+86247 fc48375079a6ae69a0e7573c4c16c78006a72cbd py3k
+86248 68f8a95b50c7fae26c3ec20810a79a7445f69d17 py3k
+86249 5115d4a2d89824603d0e187a37a0e1384b3d7018 py3k
+86250 7cb8043581b57feff837744ca953c567d058b2fa release31-maint
+86251 3045ada39269157627b12ff20fa74f30950ee86c release27-maint
+86252 6ddc57634de56ed331a6b58ac1a2efb78096c82c py3k
+86253 ba0aec67b99a0a8e3fae6f86c0fc1aee19104237 py3k
+86254 8838c56b695251d26166822cf3d1519f19af6e9a release27-maint
+86255 3bf42d910db8b87874ba50e3bd4b4b1608e65174 release27-maint
+86256 ff1257128c750e7d694e31e5c9f4746f724867bf py3k
+86260 f457c46f909836c9c1fe18b28a1a4b8c3a9d16c2 py3k
+86262 e8502567efaf49e3fabdaa972d31ede12f560bbe py3k
+86263 be5469808ce9b8763a726426f96d5fb3e808b631 py3k
+86264 3826adca7a3bf4ca4188707f341ca59c800773c1 release27-maint
+86265 4feb51f6fd76bd9aac2d489f144883adb03e8d8d release27-maint
+86267 073b07b3bdaecd59e13643ec13b924fa073ba68c release31-maint
+86268 db65743d062fc5af21c8641f05e83afdc3437dfd py3k
+86269 762b944503675e4755a3fb7238db96f73107d67f release31-maint
+86270 f0c7e2b112739f3dd85eb52b818c5daccd708eef release27-maint
+86271 4348c9b6a72d6d94b55176dcb0efd944a8b50068 py3k
+86272 77b8c95f0c1b53c019a3b40d624e48912e479d68 release31-maint
+86273 97b95ae2348b2aa7320cdc158780910334760069 release27-maint
+86274 7a9dba89a7ce846b49b3820fe418b6c26b2c4220 py3k
+86275 10bdda242654550f9a3d89635300f226183dddbe py3k
+86276 af04aae193fff659e67ab37693252bd5d8fd8052 py3k
+86277 70425fd4785650bad4c7f7dd5a5f5c1c6f3d68d7 py3k
+86278 2cc3d62f06808993f455a8ac9274b3ec0b8e3276 release31-maint
+86279 1499db99c4cdcf2df32264679a053b30343a9beb release27-maint
+86280 286424e75cd924e1a2162b502ada4f819a163aa0 release27-maint
+86281 37f43de65d10e9f82f76318907b0682be76e2729 py3k
+86282 d03632c368d37285f1c6b9e0a5fe4217cad4a009 py3k
+86283 61bbd4b75874e2084c36e834aa0346f93e7c375a py3k
+86284 f6b8f336e00aa3767893faadff5d82360dc52df7 py3k
+86285 b603d248d4ad9110d0fdeafb5f189745a5965ed1 py3k
+86286 b1c06fa48cc4b093991ab45b1f0f014b5fade9fb py3k
+86287 328992b0ea79af4e8744814a621c1edb220410ab release31-maint
+86288 dcf17fa8482176e76e592190a730e0bd0f169bb2 release27-maint
+86289 3979e0cc33c13320db048ec1c04d09df2a8383b2 py3k
+86290 ad6490a56d158b9b6fd0ef0cc4f4377bcfaee5b4 release31-maint
+86291 745d0f16df76a8b010ab716885f40af7346d2702 release31-maint
+86292 6e843211664d72169a577f33c86f32c0c7f5dc9b release27-maint
+86293 e49ebbd2c4961ed2a7ce78ac24a6229ce14135df py3k
+86294 c08f7d6a023169eb91b6917486530ac2224a6b0b release31-maint
+86295 5384e4e46374dad5bbca26c3a49d9e7452618937 release27-maint
+86296 0543c02e941c1024c63330b47cd2ea95fa7fb040 py3k
+86297 2262f6c44ebca66934af442bc28a6590f469c44f release31-maint
+86298 8f09eedcd70a0a893e873ff54ed8018fb1679383 release27-maint
+86299 fdcaac0e010a035991770dd9729438883cf72f32 py3k
+86300 335423d736a7ff43b1f7fbe11d0eb8703593e2e2 py3k
+86301 e8f1ef5fd42383967b532384fe21f6d0b5242f62 py3k
+86302 418dcb1c45f7fb801df58d600531d7a91d7687ea py3k
+86303 80473ad697ac3067597ecf008d34cf266a2d714a py3k
+86304 8154db8a15933db5d2601e86b62ff39d67e6e915 py3k
+86305 f8208c33978f8f4f7fd357c4a0d5f8602e5efa10 py3k
+86306 88d04f0143c7276efab7f08e961bdb39879c5f87 py3k-cdecimal
+86307 855a10efb10a29afe1d294bfcf89d17582feba62 py3k
+86308 76bc718fe7c92a9e731a3b68678e507a79870237 py3k
+86309 3db17a494dc94d2556e9fb34bf147bb5f3f75a0a py3k
+86310 3c1bfe54cd2096a186fda754ac8a9ac8979f8fa9 py3k
+86311 6d1294adfaf4409c078fa93f4536fedc3bb30ac7 release31-maint
+86312 96c80f42bce6cb97c10c42a0c0c180ded7c734f5 release31-maint
+86313 d55b7d0bc9737fc06f14dc17e60417dad57359a0 py3k
+86314 074533a75962e0a20d0c61d601db7fe94b5e1ced release27-maint
+86315 1ffbd6753a15437ad405dfcdcd4f0f87d2b11e1c py3k
+86316 2948d5fb1ebeb5f98a190c93bf77387e4400b6ee py3k
+86317 2d6824884435b7b73b6286cbfb4096e1b11db141 release27-maint
+86318 a8aacdb4520e16e8c1f9d5a21adcebf355dd5b0f py3k-cdecimal
+86319 b0de0ce8a7264b48db830b9cdd56a26f1df2e527 py3k-cdecimal
+86320 8378eb807746bb1e27c6c329bfb837e40b1b4569 py3k-cdecimal
+86321 1698b0f640b64e5e24030b2d61ddafca863538ec py3k-cdecimal
+86322 ca2b937e1a8d1265ef3c691f911599dd0cedf7a2 py3k-cdecimal
+86323 2b1f84a4ad33c15f5da2f8edf034824b2b07504a py3k-cdecimal
+86324 070368175b249c574e556956f4b13ead07527587 py3k
+86325 3bd73113e8107ae5a0e710a4c1e16485b72aa8f2 py3k-cdecimal
+86326 427080f2aab5ed35a3f2316f93b9792eca49edc6 py3k
+86327 3f1034b434783c4020c705cedc790301f35b01ec py3k
+86328 f3c533857fabbb796d33c7c387165627a71a7e33 release31-maint
+86329 0ad6a0d0149aa82a2520d143118123b134771247 release27-maint
+86330 d6d71d4d6b6506b7582c74c4e88e312e1c891738 py3k-cdecimal
+86331 18cbaba61fa56443b203b17248a88f4fd4da0e8d py3k-cdecimal
+86332 00bc3af89b7cda1564d3a1ed3f6b5761ecd2d0b0 py3k
+86333 8ab1de0813b3bf74634f68fa79480f7e0281d053 py3k
+86334 78803cf14a94afb3c84d3229696bce4efd0ab068 py3k-cdecimal
+86335 ad648f2b5e0005df2a6342f273c6ec0464f82ab7 py3k-cdecimal
+86336 44cd040dda566625a95518d3f193fd18cf64e7fa py3k-cdecimal
+86337 428b612cb076d83887d5437d56e1fc4998256706 py3k-cdecimal
+86338 bab7e703e3ea9d11472b304c24a85bb07526564c py3k
+86339 56b6ccca1d4cb5c7e55a66473e62ab028387c70e py3k
+86340 900811f6705d75e443203e6c5170514b97bdb071 py3k
+86341 1b5f47e2e0f030f14a815f6971fb9d783362036b py3k
+86342 6a2b9117d477b760ca2d0fb4cd3bbd90f1494aae py3k
+86343 76a1c5e88352f73d2caf746eee5012e5d6cf4ff3 py3k
+86344 fc3b12ebfb9a2b43c3db1e5ada481a3a6bd440c0 py3k
+86345 75e02fdbd33e6ccb2393cdfdb9d5aa60c1c7a6af py3k
+86346 306339c317586561038966d95b4fe415312c6468 py3k
+86347 323d43e8953af91c954e96aa74981fb7df29c852 py3k
+86348 9a66feb07a0ac12aa6adc0f802825dc515d73c99 py3k
+86349 b347b5cd41126983624b719676617241dfdd565f release27-maint
+86350 640a08ec8fa294c6ddb184814bac86512a09c8a6 py3k
+86351 b6da97930f631faca9952c34f5a261362d4ee2dd py3k
+86352 b4938c34b80360cc7b14424e3b23125b0a6f693c release27-maint
+86353 448ab7516c0a06d6a892b1ac5cba195680eb6bbc py3k
+86354 646dfdc48ca86f1292105aefdccdf73466af3154 py3k
+86355 194f30dc4703459415d9fc45d7de0da81a5c1033 py3k
+86356 94d0ccb63b464ccff6024a74758ca35272b72ffd py3k
+86357 74fa63aab3fd6c797d0edb26266ed3599a8f13e0 py3k
+86358 6f2a921d97203158957f4de16ed9caa93f180a17 release31-maint
+86359 40eb0c9a3f923f994e83c8b54e5bc1d03bfeb0f6 release27-maint
+86360 8618df6ecadd9b6669077cf609d36e7dfa20ec0e py3k-cdecimal
+86361 fe9cf535119027b7f1a7e1a45bb7edb8740ce2a4 py3k-cdecimal
+86362 73672e445cc91323a170637303bc09f1dbeacb45 py3k-cdecimal
+86363 7a840b6d2f224975c9e777f37db09dfcc831d3a7 py3k-cdecimal
+86364 60005914dfc760a823093f601c9040452f57d8e0 py3k
+86365 9c09857bda0b49d03f8d0d8751bfc91ea1da0830 py3k
+86366 af26bc09495e3ce14bf529bd156c4a9a0a9b3741 py3k
+86367 312ad8f98fe3717e5a8a87beadad2608df8ce4c8 py3k-cdecimal
+86368 e33f16ca9ecfdf667f4bf5f4f85f3f51acff21eb py3k-cdecimal
+86369 eeebb622fd08f8502250f0312ef94048138c5e54 py3k
+86370 0aa8af79359d5b50c5940ca1d8fe26fd0a6d4a5c py3k
+86371 8f5d2b527634a8c1f2e322ca46c30004108595f6 py3k
+86372 bb9e47c991b4182fcb2c03910f565c3234b6fb16 py3k
+86373 65364c44e2958e8eec7d873c8fb0f2cdccc6f2d2 release31-maint
+86374 d0fc106617e2a7057481849b65b3618092be0a8b py3k
+86375 c4dcbe51c2e338ce5bb7e698a0b34c21b55244d5 py3k
+86376 9fa52478b32b9fa7f9caa218b9483be04439a4ef py3k
+86377 557bbf6b3d70ac8219fa6c00569bfd663c372e31 py3k
+86378 2dd519e599cc23d7f5abc9ab195ad8e2941bb8ae py3k
+86379 49196426ed2f143225855090fb6a0ce6e698f54b py3k-cdecimal
+86380 16a46b6e70544a1499630d1bd664e1c8f12cac7a py3k
+86381 f00502f57b28ae80d84f2e9cb64ea3243b7a6816 release31-maint
+86382 6a281f040bb134f22c5a183edf9febc82207ebc1 release27-maint
+86383 57428e3123acc341c6653fee727741e82ec66020 py3k
+86384 1b16bd2bf6c7d0cabcc3581e3c74828790daab00 release31-maint
+86385 ae926eccdd0ed0ca90241d9bf4152c6b7ec14c04 release27-maint
+86386 1817a16d1eab6a960de77bbe67b626f483dae525 release31-maint
+86388 eb4a347b98c16cdc3b1f19a3439cf8f3e9648fed py3k
+86389 1817b7088d8dfed1d00d6f3d23a33d7016adb7e3 release27-maint
+86390 f93fabdb87ab418311ee50f03ba1c7853ede3dbe py3k
+86391 e02758e552e925788ed7f4c0fe5e76021a1f79fa py3k
+86392 961c9e8821dd5db55c5fd72260154715332881ab release31-maint
+86393 a5b39d89dccb7060e8945673920b8b064458a328 release27-maint
+86395 06f76ef27f86c04b25ab1784efc9dc9cf0897478 py3k
+86396 dea4f7641940fe3d9a33820f246211c9390da636 release31-maint
+86397 74a5894b95134f089ef535259ac2cfb36c3bb5df release27-maint
+86398 8e6a1cd1f42bf3f7200e1a4a21588a7342073c17 release31-maint
+86399 7cec0dd391d69f736e3b6fe53eee65876f0b0cb9 py3k
+86401 31b1aa30306c563d06492da095ecd068c562cee8 release31-maint
+86402 e546f7605cf1230ab0d333465eb5446868af36c5 py3k
+86403 c5e049fd8170c8a4acb31114daf35a6a1a089821 py3k
+86404 aafcd5e0faf1bf9ec8c800a1384bb4eea8812df4 py3k
+86405 67eb3f53deeb929c837e55d8d4a3ac2266bced0d release31-maint
+86406 5b9ec5acdac4274ad44d6af80aad5a8e5da2fa36 pep-3151
+86407 779377f3077d9e061e64f7b9c4d4eb6f8620a0d4 pep-3151
+86408 723ed1b77871ba21e54654df6dea64216f71ac55 pep-3151
+86409 b522abfd2fde70044c20378778380c7ee88815d3 py3k
+86410 98bd3ca1ed8636f96b513ba47441bdb7db450ea5 py3k
+86411 c69aa07282a88ae82ca678dfb5278b4206b47d9e release31-maint
+86412 12da5fb81134018ff88e730d26340bf8e9214f3b release27-maint
+86413 5572b86967ff76e6b28d51f12261949cfda608ea py3k
+86414 857d9fe601698263c3dcb4613d49b68c2c61cb13 py3k
+86415 166c7be72e78a66256df1053b7a5a6205b313c6c release31-maint
+86416 df2ebddc28c632b22f2bf84ecf27099ba6c5cf2e release27-maint
+86417 c3d85d2ae1c87a3f969ec9a8739ecca7a85c7bc6 py3k
+86418 1a65290e6d03605c0611799fd031dbfc1e6d4a0d release27-maint
+86419 50307a7954245203868e6300425a63b99074bcf4 py3k
+86420 0a1a4c444381681dedbb4192d1e6135a4da4a88b release31-maint
+86421 be50c91e6da53f41cc594fd6408101cc85aa876a release27-maint
+86422 62ab39efe1c4b4956a978a0cd8b08092eb629df0 py3k
+86423 ec42112c21009ba3e702c978d876364b37ffe116 release31-maint
+86424 8eb1c9e8187bd8504145df1b0a49448aa95b8f6f py3k
+86425 c9d3e12bcd42e6e9a8f5e567839570e53162c5d5 py3k
+86427 0509ecdff8ae7c9585223e1849c534e871af34ad py3k
+86428 56fb1e77674861842b73428fc1fc10777ec91267 py3k
+86429 03296316a89231c68ef6baabd8f7b48b70bacc5b py3k
+86430 0a27c9db9ac79331a2eb6d88de77b346ba4bfc9d py3k
+86431 8d6516949a71d075855ce92a6b96e59542f42469 py3k
+86432 126102ba748f8f3f2d6dba37e586a9f6f4f33931 release27-maint
+86433 6aa7783ea0e9e6a3dc5e5a9e597ebe853948333e release31-maint
+86434 d2ef88e71b4ac9f744ec917f92645c0d1c08c866 release27-maint
+86435 e2ef47bc281d49832f46ac4944bac793ca386798 py3k
+86436 ce4127ec5eeb7dafdeb0c0265154ef01fcfe7bbb release27-maint
+86437 f6e813b48af3dacae7b62d22b908edc4d085a287 release27-maint
+86438 3d548b71d08281ce582734cf27ff019311facc0d py3k
+86439 c21aef3ff5e2f37c6ee1e047baf7319a3584a6b5 release31-maint
+86440 ca0eda40021481426b0aa013da817a179be77e03 release27-maint
+86441 5ace1da3275e9e80fe3f1603b9fc967e128a4195 py3k
+86442 032462479e0bd32afe678741c438aa5d7cdab262 py3k
+86443 5fd917d41c9c2d37ddd3f89d8dd9f51ddb916c09 py3k
+86444 cabc76115478499f440de7dd822f0eca4ae7fa65 py3k
+86445 a83d9888a0d9aba07d046afbfba9aa1610500386 py3k
+86446 d12b993629a167819a3a9b84c3c301218f3d95f6 py3k
+86447 6bdd32cb55a9a2f0fc84a823e7537f00d828ce0d release31-maint
+86448 4c4fe7139c68e21bbfa482134f54358a36dd64b0 py3k
+86449 b11a84de44925dcb9627e1cc1259b076176a66c8 py3k
+86450 c6b2f417830eab4565d8bbe785313650a8b6c664 py3k
+86451 d92a5b850f5e56808bedc01723906ed64c5e6e2e py3k
+86452 d9e6b8a7707052bd409ed46f8746756ef5359d12 py3k
+86453 d18e9d71f369d8211f6ac87252c6d3211f9bd09f release31-maint
+86454 d5ee96e7acebb3fb520ab383819a4fd10c6a457b release31-maint
+86455 63d9f00fea0730c1c437a50f64a42b7792bdcbfb release27-maint
+86456 4d45a4af32a96f718c13f792742e2630133bc3aa release27-maint
+86459 5022e5b73ad197c166765ce7c0a20465a541c372 release27-maint
+86460 ce388fb1be01f9219b5f84066c99531e1c34d223 release31-maint
+86461 0f398188c7f606100249bd0f93c4be5456a89327 release31-maint
+86462 b7d02ae45d15351748c84f588cafd9f2e80b0def release27-maint
+86463 fcabe47fe1de504f03ebcf6eacd43297ab976c70 py3k
+86465 24fc8c852d13a4765651be76886228b79ce582c5 release31-maint
+86466 b45eabc7c0046c517c414b1d9b0ad7884706d7a0 release27-maint
+86467 ba014543ed2c235c664fea4a2a757cc9510e9461 py3k
+86468 68332713736514698279db214be6380e4a08c1aa py3k-cdecimal
+86469 628959fb40c339a6921feb637465326965286ca7 py3k-cdecimal
+86470 e45d0bb780dcb3cf20aafd22d1147cef3f50fb75 py3k-cdecimal
+86471 f723aa157a82d9767289e8625468f2c498e6b3c9 py3k-cdecimal
+86472 da03c6505240eaebe2190f8054b9aa95d63be668 py3k-cdecimal
+86473 69c9131aa3224e767d8d76216d9f247b0b5ae927 py3k-cdecimal
+86474 33582710e0141fec04a9c6b8c36bbbf3838f2466 release31-maint
+86477 98c8e793c0b3dccefa4e5be0bf186b4ab8b4d09e py3k-cdecimal
+86478 0df6ac62272ba95d22b3e5c82776e176048d2f3c py3k
+86479 4b8ced5fefb746b3833b689ddb79f6c57a397ab2 py3k
+86480 34627dca2196ed8c32363a9eaa0e908ca70fbd0d py3k
+86481 52fe60216e893232217adb97381d2c2c298120d0 release31-maint
+86484 ae6610ca90a19cf68319c10f55249cc9890c3ef7 py3k
+86485 55abc0965e9d765d30336aca29b20adb5add0f32 py3k
+86486 bb12374c8dc6e7ac15100f0073703576151bdd49 py3k
+86487 c4fe4b1300d578953150ddf1b73a4fc2769c3aa0 py3k
+86488 ef1db7f5c8a9f21055b3f3897cbdbeb49af47f0c py3k
+86489 ff6b2bf75d812671adcb759e059bd13918c66a2d release31-maint
+86490 4679fbdfc817f66b15a630cb46dd1cf1e903de22 release27-maint
+86491 586a92cf4cc7f47358ab998c949d062ef752c98e py3k
+86492 c9fb30fd1f0a5cafd22e26aa4a191fd3072de870 py3k
+86493 0d1b66230247c55ce28baf043480100f9a4704f3 py3k
+86495 52bf79fd6d6c6f4b6a629b32a2488cecf2c2e45f py3k-cdecimal
+86496 d54c8f16c51c2bf5fff42f2253c2834ee2a5a4f0 py3k-cdecimal
+86497 bd68cef4f1ee0988de399dddc833b69d3282c769 py3k-cdecimal
+86498 7826d907b765bd3e26681434d72a6edb47ee511d py3k
+86499 d8cc95d7de62a1fbe5ebfe67a535d30b0577f083 py3k
+86500 75a82fe274a7c86fe7a5662ae2348002147ba916 py3k
+86501 379029714e2459897106a23566cb8085cd87e03a py3k
+86502 94bbcecd958257db0a1d2305f3705f06842c1eed release31-maint
+86503 52e5199b65133e0563cb01c27145da402414aa13 release27-maint
+86504 b41404a3f7d419b1af24c4c4876c8c6644b1f365 py3k
+86505 66e8d35d71fdeafb781a92957e1a10bd3cf839c7 release31-maint
+86506 cdc39f6bebf10bbdf7552de126a246e920469663 py3k
+86507 af13fb6fb3df7e4a6d9f5bdb619bdfacbd92db44 py3k
+86508 15bd50ee2c4c3e9868acc9c6c65301beaf144bff py3k
+86509 805c28dd67b3e21b077281e4c9b52639f48f77d6 py3k
+86510 483bbebc57bffb5f69421fdfa4ac2ab679e722b4 py3k
+86511 f9fb92ea4850292807847f01a85ecbb34674993d py3k
+86512 e105e6ac8536514d693638ca3ace49ca6544520d release27-maint
+86513 27e32d52005560897525396de66ee21621e0acbc py3k
+86514 5bc463b04c8333d31f74a6f350825ec57e961e56 py3k
+86515 019421a89ef59dc0b16fa693d48dc0e4fc51b149 release31-maint
+86516 8b6faea3057340d56fef9e54dc879bdb95b45dc3 py3k
+86517 2978160f491495bb1352a0a00d20dabaf41166e4 py3k
+86518 82b161fa28184124d967ecebbcb1395b57012e2e py3k-cdecimal
+86519 f0ddc91baec04a4729fb4c7e34587358b18bf707 py3k-cdecimal
+86520 bb2769389c531473e0e9c8c147fd9dbc62a91ff9 py3k
+86521 378d4f4e9cb50d8fd22794ddb2c499ea44e07252 py3k
+86522 fb7ddf1d35940292703e701de867a5c1f5018464 release31-maint
+86523 932a3ffa4e5611ee9706a2b16b1f7a41e2a6ea6c py3k
+86524 a019bb4ffb50e557569d9a2a6ee8b1ce5a441c9e release31-maint
+86525 1daa40b412117268e4d20425e0ba7ebf906e169d py3k
+86526 ae315a7f62d27811f3d37911a3c170109dcc5917 py3k
+86527 67ab7402e0decdeb3af4332e6e1627a76df56135 release31-maint
+86528 27c5453a147f511cc28e3890742d5a431b3b9606 py3k
+86529 b8420e767638e5626e49539668efe02590d7d635 release31-maint
+86530 0cca73b0a5bf008777ef945961203ff04edab13c py3k
+86533 a1da8243b63e6ac27d02677d04d9e5815b52aeca py3k
+86534 420301400403f0e239a7a7729c647ea97f697584 release31-maint
+86535 e983eb2229dfda0e7ccc1407cb5df5e06638eafd py3k
+86536 4b3a5502002d218900fe97141e6691fccf9d5e42 release27-maint
+86537 d9c89072044e48d75bd4891a9641515b85ab7fe0 py3k
+86538 e37344a8f0c91c39412727bafd5689747b48c310 py3k
+86539 350898e095aa6fbcf05ef9bb8dc643461880cd45 release31-maint
+86540 b9be45f433b92db85300e039320d049392e2c308 py3k
+86541 51f72c5fe28e4bf1ac86c809cd41968b274f78fb release31-maint
+86542 d4f5e27ed186b6db36adec7bbbdd0c88f211b31a py3k
+86543 4572d28dbac733a3d711fa47dbac39f81aa4976b release31-maint
+86544 cddcbe3bf57a2e83797ccd5421678416622e18a6 py3k
+86545 c64ed6da48b9ab38b5926383d00f05acb2047a39 py3k
+86546 d22aa5ae77625f769e79d96605964a036244574c release31-maint
+86547 5ed37c2c05741dee9ab10f698ba562442acdbbee py3k
+86548 e9ac3f3111995781fb9561ab5b1bcf0cd896a1d0 py3k
+86549 84a305e2e548893174c6a530b0391038ec4f4380 py3k
+86550 4b4c72132ab6eb2b35cdba9aee9e7c3aad01266d py3k
+86551 e530fc7682bf2964ba6950431b8744ffbdaeb124 py3k
+86552 40970e89e60aba39f4752543533e607193c80dc0 py3k
+86553 825e480c930da1031ec7917d09c44f01239ab2b6 py3k
+86554 f079643915b53e9cf018f6383af93887b8f7c92f release27-maint
+86555 245f6ca3b2330feb4a2781bdc42760b2a918dc54 py3k
+86556 53dd700a35b6f2fe677007984111edec21ead6e7 release27-maint
+86557 ddb3bc8e6990df4f1a61564d1fabbf3317234fe3 release31-maint
+86558 19b711a77eff1b437d66464b00fec909481abc2b release27-maint
+86559 2dd53925f0071dd65e8e13307c48201d72d251ec release27-maint
+86560 5d55c5bb8ab1c4054d7640621af1ee42ee425f8e release31-maint
+86561 b46bce87d2af01e4589824d9ff92d3391782ca7d py3k
+86562 debc766419122af608a76a5708850a9941bff68f py3k
+86564 40b0c69bb2bd7506f58de8c9e900c309172ca021 py3k
+86565 c20ade63f3dbca1b8a27824fbec606117c7cb658 py3k
+86566 4ed6101f8ab255543cb75cfcc035d9cf76694b49 py3k
+86567 7f32c5f56d1a118d7e0370293f5da2f5ac408972 py3k
+86568 a1936fa63580d62c931f52304985289899f185e7 release31-maint
+86569 59e56b82e6cb2cfb5953297e5b125a1dd387923e release27-maint
+86570 4e2da527f5b1db1afe18481ca6f5aa36cef4a50f py3k
+86571 aef8f1850d24d70dbe22197be0753d93191686ff py3k
+86572 78a380d57fea194ac324df985baa9a701fa58a43 py3k
+86573 51e1cbdd8fd2856dfea3b6480e4cc7b58a3c3ebd py3k
+86574 2ae4eed4a3b3787e849afc8fcd6c6f0457857a71 py3k
+86575 838f6948deb8b6f80568fd89e7100f2e136bab20 py3k
+86576 3d2f55ccd660ec61535ab64cdd3fa6b178d97cba py3k
+86577 80b48a3a24734c5388f1881ba758e1251cb972e2 py3k
+86578 d57181acaf8c43d643a38efdb1479a727cc32738 py3k
+86579 1ef4651feef89b802acd73e53c390b12bd5a1386 py3k
+86580 41d58bec3e08b45a380244533ed99e856a779c84 py3k
+86581 4e512a949b60c048015747c584296f984eaae960 release31-maint
+86582 a7c22107aecd04572bf04c384cc0ef1608604981 release27-maint
+86583 66d40b6a2bb1ad80dbf8d452c6652e59c984ee56 py3k
+86584 3a0e7000dc8f9d708aa5eab5161d647b711bfc3e py3k
+86585 ea8355cddd9f8197bf857872304c5b72205931b4 py3k
+86586 bc9dc7e7f373dac6d5516cb824db49b63088e519 release27-maint
+86587 3c9b1c05ba9ec57bd4c1a9c397bc892c9f04b681 py3k
+86588 7cdbdbf3480b8f02b9d097f8a0de5a256d082bd8 release31-maint
+86589 c404c2a346a5844b5a958db02e36700c4070f73f release27-maint
+86590 631d844bbc45932d588f54b67b94bfde6d53738b release27-maint
+86591 965f859e60aff91768ef6d6317cf9cb73bc70836 release27-maint
+86592 50751822f62230665aa1fc49b27c35fab068220a py3k
+86593 c06ed25e69b83327d5b5c9dab58c4cc12c763c4a py3k
+86594 4f29aa8f9f54b1a25d69b40fee91f28b9c5304f4 py3k
+86595 43e50bb923a96eeaa58e19c990f946541e9ff526 py3k
+86596 9fe76c26ea9fe7bf3beb34fdd1299cb180ec6ea8 py3k
+86597 dedf719b26a374d2924a2b00a6d37b24da9ec629 pep-0384
+86598 1293f819ce36622e4ac37658334d5b205c349894 py3k
+86599 53be1a67e964aecc39394ab4a0ff328815cebe88 pep-0384
+86600 13a2a5de1b7f6ebc55306c56c91594091989becb pep-0384
+86601 86e3f6324e6502350e1e1bcc644394a4fd0a0ff2 py3k
+86602 44b31219aecd332ebd2ceb2c9be226480de7c953 release27-maint
+86603 671e6bd181143d2846dac12805a001bdc3dccabc py3k
+86604 b6d7c5b6f1f2013b0141f5c5b2edbf17c1a3dbc7 release31-maint
+86605 f5db53783922d27677783988f2b9ac7b4ef70039 py3k
+86606 eed42d2835622df8aa49450b567f49b6e09bda3c release31-maint
+86607 6eabf8c1a75c7e5232cdadfb2b5f1882418f058b py3k
+86608 9fec6abca7d76762262efd64a6884beac0f45e5b py3k
+86609 4ae2d011a80ba5ceb4a453dadd62dec69cc182b6 release27-maint
+86610 59307aa7d2fe67a081ae4ef7133717c4d83a2a2d py3k
+86611 4335693df25979d9bf87520ba077e1b9b562bcd4 py3k
+86612 1cdc9c1c430e85c5b653ad1263d41f817f410f3f release31-maint
+86613 7aec238682877b39b2c46284323d748daa77c368 release27-maint
+86614 10a1c399864e463bd07417b23e03ae85fea6dc60 py3k
+86615 cfd538311b6fa60fbc935836a4ea407d9e51986c release31-maint
+86616 48fdc2d8f896ec74d50792629876f9789ff66044 release27-maint
+86617 7af19e99d2f85eb97ce0dd3c74727024590556c9 py3k
+86618 238caaf6852b733ef050d1669af9877a72d131dc py3k
+86619 add7e9721f809471361eb4ab4a3c5798018a51de py3k
+86620 e01237831ad2fad69c5fdbd124b9071f20d8d501 py3k
+86621 398b21821d1b4a00a447f2c326b2cea2b0445c25 py3k
+86622 257512b97f823d3e700afabb879bf00f90dd5762 py3k
+86623 1b448fd7e1a248c4932157af142a8f27f1a6d590 py3k
+86624 acd9628248191489e0631b8ab39da57756abfc5b py3k
+86625 459a69025d9c16bdb9a84260322289b628987541 py3k
+86626 62182abc116abac55e8ffd76b3c4d16a2ca0b723 py3k
+86627 07cadc2c6438299fe3c4e2daa1be6b8695d9cf3b release31-maint
+86628 837ad5854fc93b40c514292d0fbbf6923c03e518 release27-maint
+86629 2beb25369289752674342c0ea875d799c0fce521 release31-maint
+86630 5c06d3d1b9c90d5038f7eb2ed3a8cbbc8c9196f0 py3k
+86631 544b453e60a58eec0e6a42834d706ca03be1c862 py3k
+86632 2068255b4da00a18fc6cbb6afc8cbb1e905e5846 py3k
+86633 fdfc6dca80483b3d13fce5ccb6dc19240e473d52 py3k
+86634 d29a67c26600c76834b90c6178f6f5b2c8253b09 py3k
+86635 9a0c2401c6a6e1f01bce7952130fd5531966138e py3k
+86636 f54768a5e2f55dc6e1e77920205474ba00430748 py3k
+86637 614c84670c63d35a0f27a888d86985390493fe7d release27-maint
+86638 c13f8980ca7fdfb38c45b406f8a93395a8794db3 py3k
+86639 f8ceb6afd7a91aac9a79799159b9b6dcf4395322 py3k
+86640 9717153d558d049e4c352155e99e871dc718c6fb py3k
+86641 61d1ec307bb0db491eb6cbb1b20e2ab7e8169c76 py3k
+86642 322aa3e82768be3bc7c286a87b5e18bf5b737420 py3k
+86643 179dc4c3470f3cf76dfb9c98c2791107bca54743 release31-maint
+86644 943a8649900dff98551ec225554ff6ea89a3a285 release27-maint
+86645 eed3288ded895fb2d89e4ac4e995b520deb7de89 py3k
+86646 a784457e000e5c3c9857965234482b6c8aefe278 py3k
+86647 1ef8e9a75fef3c722305f648b7b484ee644810b1 py3k
+86648 22bcdac181bca911be801ac6a45d14f444de6d40 py3k
+86649 1ec0580d9d9d7b6789f29db88128cd5df71e37e0 py3k
+86650 5ba8bfce7ec1d6dc06135b4971ffb00d22c5d0c2 py3k
+86651 8ba16aabd5646b7286588e19adaa0de4d06bda15 py3k
+86652 485dcffc88b45e1685ec1cfc687ce64cd035b375 release31-maint
+86653 f47fcd5b501dec1a82db3f8e4445494a6b7df54d release27-maint
+86654 7b14f1ff602bb508dd5549a97414e71b3299a976 py3k
+86655 add8a03ddee6e35d476c5e669682bc44f835bbe4 py3k
+86656 07a4870f60a07f0f53cd5e0f17f4851b32572696 release31-maint
+86657 a081625dd6c627eb3547ff65050d74e2df08ba0a release27-maint
+86658 ffc372c8cfa0c763e3c45f332b4d1f8088132ab2 release31-maint
+86659 5d112c787d6e94f0d17fb487d232cd9d16dbb2b2 release27-maint
+86660 f02f3b33dd8f91f42b1c7030302a82558b0d45d4 py3k
+86661 5abfc1cc22d11f3c8ca1b6a08bcc727abd7e52fb py3k
+86662 66e0f5c65158689e3ca61deeee50f694e20f3448 py3k
+86663 c5ca1a9b1fdf5f2c4f7adfa8c8e1ef83d4e859e7 release31-maint
+86664 0b2716f8afb5904d42829b499b17b7f55be0a267 release27-maint
+86665 0efd42589f171e3818a881e906a6c87aa2b2c9c0 py3k
+86666 dc6a27bf85928ca75e3baabb40fb15436bc8e7cb release31-maint
+86667 9a19068ba8b10e113c44e1489e6cd648210470cf release27-maint
+86668 102db0cffe51f6cc4c9ef07ddf3d48ff0f2fa561 py3k
+86669 3e95f089237a9e27997d21fdc0c2d1939297002b py3k
+86670 0813c2acf74155194dc0d009da68bfcb8b74333a py3k
+86671 ada67de64919971cab9bc2262c073df5200ac97d py3k
+86672 5382ca95c3f6c316d8fdbf96c902305947dec2ed release31-maint
+86673 d6b6f99f5af9e0151a228431fd1eb4ceba442f8b release27-maint
+86674 aa64d4f1a79561535caf5b167273854134c68ca7 release31-maint
+86675 2ff758315fa10c5b886dc6eaf248ee66e3f53ac2 release27-maint
+86676 7b70512827cf394d29e8b5ac1ad649c749065441 py3k
+86677 0a9fd5c94dc359589d4ca122a8b4fc812686d5ee release31-maint
+86678 4c2b2be71457f750bbc6c7679734a10bb01132d4 release27-maint
+86679 c6b7df1bdf50e48b60dd7fd24467e74ec7a4638f py3k
+86680 7ee590aeb2b342124eeb36db0421e1249a256ff0 release31-maint
+86681 d9774121a6dfda7f5e90b945f7f7340bec6f83df py3k
+86682 6f25cac2836ead79639eb84e5ac139bd1044dea2 release31-maint
+86683 4f35866fd8cb12ea85efec606ddbe63f66964c81 release27-maint
+86684 f150b678548edf09c982dae11d7882cc7d083b98 py3k
+86685 3362589c0c02abe2075bdfbb95ab4b5e529ad1fc release31-maint
+86686 e0eccfa9ad6ba0a04bdc7d4b24c9e25a8a0787f7 release27-maint
+86687 82ac753bf62a9a0d900476be6126d8abc35feb43 py3k-cdecimal
+86688 e8840331f778e77dbe0de5996b2d9a9e71b2c95f py3k-cdecimal
+86689 aa4deaf344d199026e7c2dcc2c2c5a534b46f0fd py3k
+86690 dcad706b38fc48b8deaadaff2b96fe5635fdf7b0 py3k
+86691 0c668146b126a6fd42a15002bae8d3c9358dd6dc release31-maint
+86692 8dcb17781e8324ff0ac25631a10aadffda2209bb release27-maint
+86693 127f5168a774f9cdef55f46081a75055a9e63f39 py3k
+86694 98e1ddd505bc29afa4a8fc4e8180a2a6a9d19055 py3k
+86695 58ac5160d1b7bbbce78d151dec0edfb5a6b6dd39 release31-maint
+86696 3f62350edd2e936467e370d45216366b43aa1654 release27-maint
+86697 40109301828544f043a146800fa7f7e50bcc788f py3k
+86698 cc9c51f9524f9dfe1b3216a944e66305d9c59eb9 release31-maint
+86699 2c370065c1b4de9151f03844e5985bc020466d07 py3k
+86700 260ff379115c7b7c45e9e0e6e3b8138131741041 py3k
+86701 dcb60bf26dce98a60e187cb486e066a0cf07194c py3k
+86702 5a69a589c6f08697ede5de3e33195a14855780e7 py3k
+86703 a739883ee6c560617fc743aa665cea5e55dea946 release31-maint
+86704 952282a5047fc21ffab22851b045717acfee5acb release27-maint
+86705 3303abe29d0b38d2268a19e49ae54d93c747e2bf py3k
+86706 a4b7a41dabd94c836115ab7083905e0d76ebe90b release27-maint
+86707 63f114b09cafa920f4004ebb36027fefa0b634aa release31-maint
+86708 0ce57951aec62a92311432e3756c2897ed4a1c7f py3k
+86710 c86f1710467e7a5d4ac8861a9c21d87789c6fc7b py3k-urllib
+86711 6ca2890bab678dfb5b03ca3188f96af7da5e8e7e py3k-urllib
+86712 0f8c52ec9f7f15c1e13ddf719f190be9e02c5bf8 py3k-urllib
+86713 9adf397f56e7b43c7da97176eadd019cf7d673ba py3k
+86714 8b4a531ad352a448b8d7f9a93a3a9411fcfe5bfb dmalcolm-ast-optimization-branch
+86715 1ae51d13c25b9235606893d1837bd36fa2f5fd68 dmalcolm-ast-optimization-branch
+86716 be0f4d8bfceaaca56427a1e211adb462256654df dmalcolm-ast-optimization-branch
+86717 9f23c5f4856c0244e87936480693f5b162112c32 py3k
+86718 bab9c207e1cf8ad16d23244d0da2c143e7deb491 release31-maint
+86719 1404ab076b58f44c623c6f1babaf95a21b2d7e4f release27-maint
+86720 436daf095e8968e5ceac4f91adcaec58b9dbb7e7 py3k
+86721 0828814e03addb820a754dba424413bc5a293549 dmalcolm-ast-optimization-branch
+86722 61f9d3bf234cf0f90df92b39e7fbd86cbc4caf5e dmalcolm-ast-optimization-branch
+86723 0924f40bb6dc51c5bcf66248ffeb2a4c4775c7ca dmalcolm-ast-optimization-branch
+86724 4258e28cf44060ae43d9b3980bebb0fa629d0c2c dmalcolm-ast-optimization-branch
+86725 652baf23c3686e520aed3d0e7b77c6e5a4a2443f py3k
+86726 2889ed7341e07e9ff94ca15c79362a1486859a71 release27-maint
+86727 0a1baa619171af324869ecbcb6c71440298759ec py3k
+86728 f3a61dafbf6bad88f15f81d7f5303a55d47418c3 release27-maint
+86729 4fed0065983141ba02ac064624bcb67d1bb3c49f py3k
+86730 83b0517d0fc5e02f1e9ebb56062178d48c70fd7f py3k
+86731 a763ed3d6e8caa87ac17ab8200e937de5ce923f1 py3k
+86732 82da2abce7220c34630c5f9c90f332711a4444ff py3k
+86733 9cd1036455e7d6285b4c1fb343d321b1e6c47739 py3k
+86734 395ac6e319a8959b32117f15a0cca376eb08839a py3k
+86735 26f80f724b4ff169006571a5f3f40a0eeeb367ac release31-maint
+86736 2532c4bc0373a168ccd8e6779c8afbbe75725122 release27-maint
+86737 d6e8b7e250c65ac37e939dd877c7500a4a70b4f0 py3k
+86738 b73812690c6e658fbc99fd7dcd04d3f7f87d9d1f release31-maint
+86739 2877265bdb01ca15ab15ff6a70b5b458e873e16a release27-maint
+86740 98ca655323c05cb3d1aa7326d8f379a6a352784b dmalcolm-ast-optimization-branch
+86741 4dd7eb2d9856cef3fe4162e6742b3b99bd89f400 dmalcolm-ast-optimization-branch
+86742 858e86db442f5ad81acb44938818a73b443645d5 dmalcolm-ast-optimization-branch
+86743 cead04b3c5ed13f2f5b3bdc4ff1fb8997742d300 py3k
+86744 0cb26526419d88b7a46d535ee37a5716778ea2ff py3k
+86745 c54c411d3da7a14b6b3e89e025941f2dd6286404 py3k
+86746 03d933948bf3eaa8c79c649debd56cbb6cf59516 py3k
+86747 67882105dd6558bcb50c3f27725ac9717cb8e6e3 py3k
+86748 4d3952a21e25760a29a0c68c753328eb46145e94 py3k-urllib
+86749 ae82c770769cad55f1f206958db87c53f5e7fd44 py3k-urllib
+86750 1178e2545dcb5c682a2065c52b3ab5c4982f9ec4 py3k
+86751 eded691497b748c3ceb8ede0c1b167dc728da55f py3k
+86752 f3df93e262675ac5b9ce8d771f806e8977f5eb64 release31-maint
+86753 0da42cd0157655dfceb0ce21105878abfd1f9ce5 release31-maint
+86756 457c7e704ec299c39f61527dfb66ea05d2d1ee92 py3k-cdecimal
+86757 2d6cdc8185cae575cfd23dfab3ed10e834958a0b py3k-stat-on-windows-v2
+86758 140d8a657705433a8345ec84c3cfb5d2553d17cc py3k
+86759 06d23026f904569b7ee158f2ebcafeb780419985 py3k
+86760 f59dbf28e12c3f6b9cc8a9a446b20c82dc385765 release27-maint
+86761 e48ed2ef6d5ffb392d1bd78b90362682d97cbf5a release27-maint
+86762 7ab4fda77031276553124b8b0d9f280b7db945a9 release27-maint
+86763 19232020e491d78ef1b06a3d7a93ec7967510e17 release27-maint
+86764 8ce9ae5a15427b07ddfc0a3a14a6064aef265fcf release27-maint
+86765 6c35abc7d0d2192e32139d21bbf9725d8799e18e release27-maint
+86766 45ab55fa3dc0df958164bc014487b00a37ff0042 release27-maint
+86767 77771b085eca75d4b77058a3c49dfde641c26919 release27-maint
+86768 a803fd841fd17c3c4358f28d0b1f62bb58dcc86d release27-maint
+86769 d6c5750153bb118644be106959aa15527cbaf139 release27-maint
+86770 37b37b6a8972bd6f0568d91f9588be6ea07f256b release27-maint
+86771 2955f337969e81644f107cc2e78619d20f604598 release27-maint
+86772 e10f618c967ac293c6b2a16e584a1086dbd5965e release27-maint
+86773 835c176239d0257b2e69660219115decce40d175 release27-maint
+86774 fb2aa45a1b22e3b1b5f3343846a1fe0c53129ab2 release27-maint
+86775 8b6a9ecbe989c0b4c0b7bdf8ba5f9de575f594bf release27-maint
+86776 2e58126dbad08703be2f33c38a87c41de6b56ce7 release27-maint
+86777 4136515cdfacdfc784498a2bb7c14d3ab8247ba2 release27-maint
+86778 7c0eb8d56146b9aeaf397c4e7c0d4fb7f0160a16 release27-maint
+86779 71b771519333a04b1233d1ba5afdf266847395a5 release27-maint
+86780 a372fc4862816674168442811520da29dc7a1761 release31-maint
+86781 45e49269e0d8ef1dd28223f649a2eae7ba69123b release31-maint
+86782 e7593feb5ad5c3fb22b7488109f7b77c3e30511e release31-maint
+86783 a9f0ec604c8ad0880bda197d1db19e9a59bec020 release31-maint
+86784 05ee6f8c0260aa5be1e5a1f4f7689144d5e9fbdc release31-maint
+86785 39b5af773e7596ab77719af13d0656947f59df27 release27-maint
+86786 9bead909d8efedec7f40634d60369be54fb68db7 release31-maint
+86787 9b344be1be9a7e9b90254eb4ad2bec80759abee6 release31-maint
+86788 3ee6d038af9b46e80934fe970cee0e6771267e2f release31-maint
+86789 7281937b2d65b3d58bc7cbd589b4373944c5effb release31-maint
+86790 9d6e2465f5925464fb094dee5e18ea2d6ed1d829 release27-maint
+86791 4ea1c6a4e92d0fb996b44982e1681ef7da712bd2 py3k
+86792 2c16728162fddbeb6b2fcb2f9fa22877ff1f26a1 release27-maint
+86793 0000bbab08b4476846c021e4597921fd0652e3f4 release31-maint
+86794 b0e97dbd98b8438e1c6e81762b443c4895b4af0b py3k
+86795 fa017bcaee10003b2388a1df32417feaeb8665a9 py3k
+86796 5084ce948437859d51a26761504671a8cc0bc3e4 release31-maint
+86797 46feaec729bdc67bfb20491fdacd6629f4a70f9a py3k
+86798 fb5c45d38e2af5150db258c2f543386900d39b92 py3k
+86799 ac5207dd8d9a334663f787488698a54e3a7759cf py3k
+86800 aceb4516a8d44a2d50ae5c56e643a0cbae315d21 py3k
+86801 bf5f4174b8c2d5888a08b4cc6b639ced5b1e027a py3k
+86803 231b0bbc1f90464c5dd322879ef8ab02db7c7baa py3k-stat-on-windows
+86804 329842df06a10a3f6915b3c120edfca015198f55 py3k
+86805 0e1dd4548aa17c1b08bf7ed8ea228f1ed666288d py3k-stat-on-windows
+86806 132a94ec0ce80d6ee65a77ee6504b3dbaef05de5 release27-maint
+86807 4279e417b2a024b0cb4be802d11209d2ad9e2032 release31-maint
+86808 fadf74c0c5043d9798eb38a602da6760ae23de5b py3k
+86809 786ee11e0c841a0b53e6147102dbed539adb984a py3k-stat-on-windows
+86810 c7a342a798e77137790046f98ce199c192a72b4d release31-maint
+86811 749b1e71391cae3622e42805f367b2f6dd1bfe09 py3k-stat-on-windows
+86812 c8163c2a1b6f4de141660e3fb391c992a7273e8d release27-maint
+86813 c82ca3beb4df15e9532dc1375f39fdbc6dba9827 release27-maint
+86814 9feff177f44d1269ae23d63690cb6311c0ef8b76 release27-maint
+86815 ad79f9b3a021970af0eed4e2c7f41fd3797d3459 release31-maint
+86816 f22225a9d72082af66a9333082a011e3b4df2d7e release31-maint
+86817 ea4ec6de9cefe09a86d8b324a2c8d0d846280f6d py3k-stat-on-windows
+86818 abbc58a06e43d48d9ef3f8b54e6ef649d7534443 py3k-stat-on-windows
+86819 96ca99dfefd8ee71b403da96db9bed6d6ebe64ed py3k
+86820 86a6539d2c2535deec51947e49d6bf382187d45d py3k-stat-on-windows
+86821 0b6340730913c4cc557596e6d821ee62bd4a55c4 release31-maint
+86822 b4bfdc52ad5106b174a9dc1673efc8c8e3347cc7 release27-maint
+86823 ccf2633b95dd89f5c1ef15896435149bdcb694c9 py3k
+86824 63341dd360af5f7038702bf6d914fc07dd90a1a8 py3k
+86825 fee98b604139c7f5ba813aa77286fe4cfb9f2dc5 py3k
+86828 596239da3db79ded0c582ad884fa6a55de8580e8 py3k
+86829 d3bad41ad7017778884541de273429db4d8ad923 py3k
+86830 58c2ac60ccb9dab4d25e7e2e90dde2769bdb497f release31-maint
+86831 82ade213a66df92fb743792117f5f0dbd0bf6fd7 release27-maint
+86832 5395f96588d4f0199d329cb79eb109648dc4ef5e release27-maint
+86833 7e38f8fbbaddab8a16a665a494afecfcd50df3e8 release27-maint
+86834 a4f75773c0060cee38b0bb651a7aba6f56b0e996 release31-maint
+86835 dc26e4a7d2e60d0523e610221c559715e8298e46 release31-maint
+86836 63ab39d11860e15628304032db37bb5a9fce1a2d release31-maint
+86837 8737fb17f44401a0a2e97d54c9ae50d5fc4cc735 py3k
+86838 a27fb1e6e09d44e4f11d77f497216744bdad2eaa py3k
+86839 41cd092be93aa40644bc885c793f7543c41d9c9c py3k
+86840 f951274af3c7f57cf0843d0df5b9d784cfb1abcb release31-maint
+86841 72f0bea05457790084bf8278aba06e9f02f5f8b4 release27-maint
+86842 1b77f2eb16067866a8b925e9fdee3fb833905b4d py3k
+86843 0f0c6b879796bee77ea3b75cf02daf23b23389fd py3k
+86844 d0a16f9f3741fd3c934cffd39490761f756cdc86 py3k
+86845 53818e4c4fca56488407d9ccb2f8c8c1ba65f661 py3k
+86846 5be3efb47bfd58368786b52e31c0a458376e6bea release27-maint
+86847 e0a525202c77cc679755ff81ee35352e1ebbda64 release31-maint
+86848 c4aac8e6988865b40ef7a8f71786bad8875d57f7 release27-maint
+86850 27ee42b0faf6ccb07e30b21d9d6f64b7ce780c70 dmalcolm-ast-optimization-branch
+86851 72ff4353221480b63d681853b2c802bd0ef94f81 pep-0384
+86852 d24aa3b1ee2816974498fe31335a6d9006276ecd pep-0384
+86854 03d0d186713b4fe497cce84d0a831731425c93e0 py3k
+86855 bdd57841f5e2f46f8c0d6a02d42708ec574447b4 py3k
+86856 93cd4de8ee0b04a1302facb80ffbd42626d8b056 py3k
+86857 69ec77526180fbe90e0b246d2b8637c78cdffd0a py3k
+86859 16e3c95bc46c5a4ecbe2976635c1a7f8feb56aec release31-maint
+86860 7a5f26548e1c28530c874ac12861b93ff758a417 release27-maint
+86861 e5fcb4226b42a6736f43df31470ee7944ee8ab40 py3k
+86862 2e0d9009ab6b9e1c71e1f96e72d9d3f302b29dea release31-maint
+86863 8fd13c5d3882397441b97076a734f01ab93df6cd release27-maint
+86864 e812db344a65d552ac0200e54e77e1f8f24fccac py3k
+86865 ead530703b9be5cb89fa4c231fe7fe93cf357a67 release27-maint
+86866 667d2834401719da2fa4395d97a28de3964da9f5 release31-maint
+86867 cd6d0caffef24be06d2ec8806b6c20908f30dac5 py3k
+86868 b0ff333ec3da1bd6326a1547a172a0846f8435fe py3k
+86869 e89aa9147624ca639b9ace3b3a5800217c616e6d py3k
+86870 e7392ffee071a76ac0ecb518051c252222083f13 py3k
+86871 6ca8922dafb53b59d8e797deff7dfacf45f942b3 pep-382
+86872 0cca966153951b963bf19f51a0808b1a38dce2c0 release31-maint
+86873 de6e79c5b1ed443ff8d54b2ffbf867d84284dcc7 release27-maint
+86874 6799d54db37812abf10a1d2e208395fa78503f4c py3k
+86875 e32a300acac2fc86c7d3c43ee3d148471281acc8 py3k
+86876 9e9a709b389ecae36b146f9078911b1ef69176e2 release31-maint
+86877 ed4bfb75d28d880645c834579af5b6fa80a7ff3a release27-maint
+86878 312b2916cfd45d8bf311bdba26293fa88495860c py3k
+86879 32e675daa0e51bfe2f54d372ccbde2c4b7c3eae6 py3k
+86880 f16bf4cae5d737faf436f0e1efdcb5f44dd471bf py3k
+86881 28b67b570f2bf9a59be4352db14cfa2255ded432 py3k
+86882 b405a7f0aed71b8da591bffe0d7e20def04b9b39 py3k
+86883 8304bd765bcf77f837f5169a88b5d744b5e2d032 py3k
+86884 724920a015f701a21dd7e329a48f54e13d1de1a9 py3k
+86885 eda8da3a75b3c6247014369ded5890af209fc79b release27-maint
+86886 deb9f2d37b63bd131aa948868ade3fde48c4e409 release31-maint
+86887 fd6e5653b31025062fb7ba639cc22986f2fb01f8 py3k
+86888 18399e620b4110cd496cc97ea3ea9c8ecac05032 py3k
+86889 e44410e5928ee3114c658df67cd180e5b50115d9 py3k
+86890 b80f5bf26e987b8d550a533dc88427544af29161 py3k
+86891 f79928adab579f3cf1abf8fdcbeb7afe7c4bce4f py3k
+86892 7ea02f31c252cbeb43e7ebace4921610a5cbe84e py3k
+86893 2f6d0f361ab92c97c7976e40a67105b0a43174d6 py3k
+86894 340369fb2e70ef499176c8a34aab337665149da3 release31-maint
+86895 7467a1c11aeb465446588ab6cf8261111d716f93 py3k
+86896 656d24d19749b0b2fac3d9ad7ca7e8d2da177a53 py3k
+86897 d610074970d79e3f557b27d1c6b5c987ac32a02d release27-maint
+86898 04e8bd9a1abae379989d531c82c842d4585c00ce release27-maint
+86899 7fd2c7dbdda6838bdf8cb58b90bd026d6a3a0ba8 release31-maint
+86900 2984b57d67da493b899b3d320551ddfb44d2f91f release27-maint
+86901 2b2fc42621701f8969542312949a7708c8fd9fcb py3k
+86902 11552ea6a944c3b336907b1a009d5d9e0362363d py3k
+86903 693f7430c3ca50807b3050c7160f7c35a984af9a py3k
+86905 fee3a2f243e8e7f2b01d9f10447f162ab3fa373c py3k
+86906 0923d9b3de6ea822c29d51a2f1318eb46eb4ee0b py3k
+86907 5cb53f094c1a88d0c1ec58de1818cfe780993270 py3k
+86908 9184a3909de0c99392dbeb374e4543293d52944b py3k
+86909 8b95ea31725b3ee81ea268c7150948d8d65cd46e py3k
+86910 38bec90fd8ab603d8ff8891948ed9b9cc9088c7f py3k
+86911 00c8cdf53936b35abc21af0143f2938dd9334c68 py3k
+86912 14896f1313db09ff4caf3510ff5f0ca7b0b430a9 py3k
+86913 ff7c5937790300a62c15db8d64621c39b1b67b09 py3k
+86914 7180985c1c223d3320d9b266267ac4e22e5ab879 py3k
+86915 e5c28d6769cfd1716f2731e3dbc1aa9597b9875c py3k
+86916 2baad8bd0b4fc865f2d8d4be29c42360d08195d3 py3k
+86917 37002e4ff6772fbfec91c616c853d3c304a1ebde py3k
+86918 5da093b49c2a2d342368c2967e50df911074fbc4 py3k
+86919 13c71c8c5c0f85ed15c32d905365629ef08be111 py3k
+86920 4e18b9be25a408e1b8d3e6756dfa63d29be27760 py3k
+86921 cd88767b8d0c9ff14912cf5b090058b7359fe414 py3k
+86922 43965580c556db9454bf70140868dfa7db2963b4 py3k
+86923 c5b548fd0c8c826132c257cc4c0c46274cc0b2a7 py3k
+86924 b9317a9a3d3ab747f63efc191968ea131cf71742 py3k
+86925 e31a4972084af5269527fc10d06e83f7783e0280 py3k
+86926 078e5c7b3159f0cbff0e677473d149dea35c9aab release31-maint
+86927 e7844b7f6ed49eb82e4893287435a410c88a857e release27-maint
+86928 09ed411a1090628e6c37709348234bd639dcc97a py3k
+86929 90b6cbf2b11b613cbabb2827eec2726138e2a2f0 py3k
+86930 89cda0833ba60391c162137940d48fcec2326ad7 py3k
+86931 0ddfa5bcfbd3703a7f295af666de7b034e7bb200 py3k
+86932 d2ea711ab107c5b48690184fc2f852c6d43f8a45 py3k
+86933 dc73472935c58dc92613f8ac447db2cd95ba8058 py3k
+86934 7e4833764c88c0037a1f9dff7d4daf70636444df py3k
+86935 9a2058309c1aa607d23c1689e02aa73e0c44d11c py3k
+86936 b8bbc0fc619188c42e1ee40332abd272c7634a18 py3k
+86937 e339fca6e51a1016f1885706da4094451a34e7c1 py3k
+86938 a3630dd922180b219fb31fb38acd42bc39c6c470 release31-maint
+86939 45af5a068cc7f406af81f36e95a1598decc3b175 release27-maint
+86940 1add8cef7527fe9a6ff64912931791ab72031086 py3k
+86941 5f2412843bb91e6d1df293e8ab18b1074d906d4e release31-maint
+86942 8629c2a234db036d3db84690b84d6ad1d7293981 release27-maint
+86943 dee20155fd65748d8fc27b4bd8252f427960f406 py3k
+86944 18d89a30fabf9933691f4688ee2414cd8b1ba564 py3k
+86945 e11f7e662369106d2a07b03e0ac78f8e9da2e563 py3k
+86946 996f84e505be352dd0945bc03dcbea4a1dd45f5e py3k
+86947 bf495dde20e3932da9b72cb296e7bea0a5b371fd py3k
+86948 1098fab85e472736a88af53ca77d57c9c13876be py3k
+86949 f90582c6cb5ff6b72351bc28bde477aa6e4698af py3k
+86950 64c642bb7ff79ae6b251ebee2e5ef4b0050bb5a3 py3k
+86951 e02021fbfe22b5c53bbb9aeb8d773bea6bad69f1 py3k
+86952 1cbfeffea19f767da6a32a1ea976f9d03396f67e py3k
+86953 6e49af2e089109fc8a286dd713de6f64517e9833 py3k
+86954 d7de31ae95a447cc50b7d135a53150aa1db22c11 py3k
+86955 d7fa17a4669db85aabd150961b396a76d329629b py3k
+86956 c614f78675d4a701243648a4588605a966394ad2 py3k
+86957 09d23fb0d428edd4041268a4c0ce3ddfc539b9c5 py3k
+86958 a0cf64a5291e75a31ce23bb9d9fdbc6d1226ed3c py3k
+86959 7851bfb1bd7339f860edb3b16789653d8b33b89e py3k
+86960 76854e45c465270f2d0018061506cfa048e09386 py3k
+86961 8bf90b8710d037827c914163d509641eb908ea1c py3k
+86962 a5a3ae9be1fb039528684bbc2289fed26d418c62 py3k
+86963 107561c58de10435315c3ad1c8f2d5c7c8397954 py3k
+86964 48c28c281d57affe46971cf9c97ceaa1180d0c01 py3k
+86965 38353ba408a1d8426da75f051888e4a2020c86ce py3k
+86966 577a25d655c4aafc187ec408905fc34789f8ae47 py3k
+86967 81f4d1fdf5734132ed303a62912d4f02abeb1813 py3k
+86968 7c1b4ca45db6dd9e0c258b961dc51d2537d35043 py3k
+86969 94fa53b58ee5348eff15cac6dd9b2d4e5dd89d33 py3k
+86970 78216263425d1581e9ff8efb7b9978a4ca50703f py3k
+86971 4a599902310db8a4d99dc86b08b01a555441f134 py3k
+86972 5b68675d7269c6a5c049dbe37c2e61d24884ab20 release31-maint
+86973 fdb35231ebe259f52e28318b11d9ab91ce13f93a release27-maint
+86974 fe2a56a1ba74434cc011b5b708f5e0fb2c3d9e84 py3k
+86975 faad1797fc92cd61ee57e93226b30599fd899cc3 py3k
+86976 5fda519834df852b8e4f663b7526bab666815cf7 py3k
+86977 ae10282e7f4ec7f2d72c465c35b2214c79360669 py3k
+86978 301d23d6dd9b6ed80338640dae71e85842894e0a release27-maint
+86979 523a6fc53a705c45cfc2899a390685d6d6ba8e22 py3k
+86980 b30048663b7bfe61e7b52de0ba98310cacb3702f py3k
+86981 3d2bfd20c2f4d92df54bad75f52e4635406738b0 py3k
+86982 3214e231a1c4593e5fb30bc9dbdb3a0db2e8b519 pep-0384
+86983 22f0cf1a2711b244718011f67633dd4d8e083f4f py3k
+86984 f74f5a083b6f7857b7f754cbd0daa2b4a85a99b4 py3k
+86985 83ad00a3a489181652d4bf2ed5badc3abc426edd py3k
+86986 b034832414f787806d2aa53a8f8c761a5b925a33 py3k
+86987 665f0fc6ddd7bf38df50111919d37f6e52337fa8 release31-maint
+86988 7ce9001d7a771d244f429cfa254fa2ede28a571a release31-maint
+86989 3182c6087e52ee10f6ae14d7fc4830874168c60f pep-0384
+86990 556df087de4fc132e9dd406d084b9de322b5bb91 release27-maint
+86991 e756ec8f4143bb9a3f1483c4c322606722b2607f pep-0384
+86992 5a723b7aefb70f728ccef3d52353bc5aa41116b3 release27-maint
+86993 4c98447329257339b959d17b2e3fb08cf25ec824 py3k
+86994 bd3ba89942e316d35ca9a221c52e6490b7df8d08 pep-0384
+86995 f895a2221fe13b009fdb5be0295b1c6d2bf93a6f pep-0384
+86996 3dfec8f14e732e7bd6e035e66b45f202ac19d8b5 py3k
+86997 3d9a86b8cc98046f0d7456479829410e386be6b3 py3k
+86998 62b61abd02b8d70953976878ed5ce2c2157914fc py3k
+86999 1486416c86d97d821810739bbfacfd8e3cba7cd6 py3k
+87000 6b03491ee171b49bf170e332c1deee6190e60e4b py3k
+87001 4cdafb02b20e157452af4697afd8cd7dc47c8396 py3k
+87002 5ec4ed518ef8fd849c93396bc0ba1f51a6ee2154 py3k
+87003 a6e949a6ffc9c9f1d725f58f0980117b17ba560b py3k
+87004 d6183bcebdde682e94320660aac18ec2de98963e py3k
+87005 d29b55ac1631938060f9424b4a14f8942d8ad989 release27-maint
+87006 7c23a68fa3de86a37de991f6a16bba6946b2d67a release31-maint
+87007 7b6af56ee74d08470d0c11285b6c3f15c0e9c77b py3k
+87008 a2fabe224e8736321383187e2b882e8c388ba84a py3k
+87009 a907110df25a089789be0b87c5317bf74af188e2 py3k
+87010 b37da60c9072a16300e5ee133d3396b6ea704b63 py3k
+87011 56eed8f407bf9469a4dd26fda14f8ba4b034c483 py3k
+87012 1d3531aacea0e1095dfe56461374fd72ae62500c py3k
+87013 4df8b4342e70243f79516104a64b3e9197f48b83 py3k
+87014 b1e789631dbc421d3bb6475cb2ca28ee01a7591e py3k
+87015 51d28a0d1c32e8d8bfa5a24785dc44039cc76877 release31-maint
+87016 3aaf37c24db8fa7786eedacc4a5d77d2a33e3f73 release27-maint
+87017 2e1fcf28c9145cf670ac8ee7ed8e34da64d03ae4 py3k
+87018 893b098929e7efee4f753b5dae9085835d3b7526 py3k
+87019 713c6b6ca5ce22ea3ceda80dd1cd4abefb7a0775 py3k
+87020 8b02f7f9475b2a37489a172cd8eefc339b6f77f7 py3k
+87021 f35a6d7e325ff532cb396557a636ef2564f3e11e py3k
+87022 48c40709417b9c60dc4bdcfb7c0d37512816b3f4 py3k
+87023 f82eea4781f1563a3582198d7d30233f0ea90ec4 py3k
+87024 7214dc5bff5cfb798915457373448c1fa345aeb6 py3k
+87025 c2578a68879d9c5b7eb8cf933c2731c7a3d8cff1 py3k
+87026 296e6f85f56d416301a7f595b7db86f5c9831fbd py3k
+87027 d582dabb30f85b770f02fd739d0e4a127dd9b59e py3k
+87028 48450f05970b9008141c7636f233fd207e352751 py3k
+87029 8cabcf4f90338b5a9a5055887288ce6d2318b106 py3k
+87030 bede83e208534c2dafaddbf2f63ea3da9d641421 py3k
+87031 de7f28a640e5a69cb6cbec34f73d86cebb624644 py3k
+87032 573a672762171f04d2160d4215b2ca8c5308654e py3k
+87033 a8f3847619f4db2487fbc6b76340166139ef7e8b release27-maint
+87034 9b603611f6d4c6d4aa49ff36e76f496f0fb0fb24 release31-maint
+87035 294806cac8c54be53bbd5f5e8f0447a5d227cd43 release31-maint
+87036 ddc6c47bf825e398e0f4ad51e04a1390148dd3c9 py3k
+87037 f14f619d705002759045e02644a3deabb639a2d5 release31-maint
+87038 b32d19eb4338ec156fde8425b4562a0960324f13 py3k
+87039 fd638ca74634aa17fc38287d46565a1a913a1a75 py3k
+87040 ae3fa781eef2e4035fc21ac8920e3cdde54a6366 py3k
+87041 f1be349234c3e4df43d0cf3bc5979e5b042bf9fe py3k
+87042 cb6d5d151bb421a360606c7f0819399bfb90f2e3 py3k
+87043 f2a4ade36a1ea813054c92a56a27bd7fee06eb6a py3k
+87044 b55f3d639cd86f9547d5683cedcd8167ca90b6fd py3k
+87045 c2ca867cdd1a20787010e033db4830e4bd360443 py3k
+87046 5eebe4ad0d878d51407daefafc8c0d7924c82948 release31-maint
+87047 0fd6ae0a8567da1891fe5ae4d0da94535d994649 py3k
+87048 9832e96e730a9054e207de29a545c6557fa02daf py3k
+87050 75711d1743cce687f69bac8953fc952380a06cee py3k
+87051 4e62927a2bda9599477066d59b679534d7730820 py3k
+87052 779a23a08d8ceef073f968aa27e0387277bad863 py3k
+87053 339dd622de5a583248414670459d929994f1e9ad release31-maint
+87054 ba709ad3ff4ca69cf6ce8417c69a101a11ab5147 py3k
+87055 04cec2e1ca41a874cb859f628f8e4dcb6943f557 release27-maint
+87056 1827a8ac9b18e9c846c68564e55392e8bd82477f py3k
+87057 3fee88e6442a3da25f9f5dafa691d4973fcf7cf9 py3k
+87058 dfe86da27e68c38e6848aa4c422e5eb31f223549 py3k
+87059 6825b2cd9b81c38bdf29086eb8de307013580804 py3k
+87060 3d1bcb54a82b66cf4efba5212af05dfa4649358a py3k
+87061 b7f08a0aea2886512d91a2e7c2f484fc863c78ea release27-maint
+87062 11094b5288f9897e23ac57586d376e79f940ab49 py3k
+87063 56f42e184a196e9870846cf06d8016cfb374a606 py3k
+87064 2f5cd1869b1a5f6c1c3c21b9e1c961f1f505d4ea py3k
+87065 ec79aaf8c0bfc2c0f3f3f959c95529d92b3bf3b6 py3k
+87066 8358dc13a57485b0898e6cf4b71a1f36d646f541 py3k
+87067 1ccbbddbea881e7be6832a23f6ab4175a1cb8fad py3k
+87068 83955e461c4ba735aafb36c486563c342a6645cb py3k
+87069 6fb56404b6bb23ed525addda62ce4acb68f22edd py3k
+87070 4d0bfc30372464932e492ee572fb2fd54aa74f0d py3k
+87071 c38da4c54184e8f07af7f9938f4bc63474cf7254 py3k
+87072 073176f03813f0e4da333f69bc08067bad1f4982 py3k
+87073 69a50ba44e65b7f9ca6fd561e57170b07441740b py3k
+87074 285e0cfbf90f31389f2b909e9505b6fbb9f73902 py3k
+87075 5c3ac8795e9c4d43733652e7a414b7ca02af921c py3k
+87076 681a8e89c65c8238adae6e4ae7ee660442dc708f py3k
+87077 b367b532a82339a4c431041ce2844f3309c8529f py3k
+87078 cb3cebceba50fd2aa7d8145d3657607aaf4c084e py3k
+87079 b8eed7a56a8cee543d505d16a71870f98fa307db py3k
+87080 59f972b1d56701f15fd6ad8e2a4324844940d771 py3k
+87081 597c3069afd3991747010b2785b775d8162b09e0 py3k
+87082 3f24244b10fd88d6fc34cb2587857f870d62cc24 py3k
+87083 8170555416ac448823e398174140f8b8921ab20e py3k
+87084 5f286ba01396e7338e871e55e006bf531edc7fec py3k
+87085 4965be90fe199a83372d66353992402f6fdef6ea py3k
+87086 902db4722594c2f9055e572e3d52672565597397 py3k
+87087 9079ecd433a22589456a85a89038050519a17eb1 py3k
+87088 b635cea94195780c8716e236479af319bcc26253 py3k
+87089 f448dd6b67dbc0fe569015ce6be5064dbc8c3d79 py3k
+87093 062907f685ac4e71fe717ba0b193abb46e8fcc1f py3k
+87094 23ff4a0c375b3332a97e5798058bc3734defca01 py3k
+87095 1e4a6e5576af4e4702badc8e0fa7cfae5fe1ad76 release31-maint
+87096 26edfb27a0ce8e943c5dc8d56055cdf4776c73be release27-maint
+87097 0ae07caab506fef148119a1c5d2ce6902a08d527 release31-maint
+87098 26c6593571f1fae7d02343f362db3e8a09fb5302 release27-maint
+87099 e115b2bfa9d7c6539d0d81f6b55a3ef526edcf3c release31-maint
+87100 15a7570e3ffd03d276e0aadec224819783e266df release27-maint
+87101 30eaca4735cb8c8e61b5f92fbba8ed4a4efce214 py3k
+87102 c4898cef4715f08fe73bc27c693c4ebf35f80dba py3k
+87103 27d6aa4f18111f52388420ecf5770c3344ea0961 py3k
+87104 2513d892b25418b5d0aa2abe553be9385575c22c py3k
+87105 868d56ac1c5906628f3e8122d0ec13ef3a48ea93 py3k
+87106 c2349b6bffaf2a49d3af43b6f7f81df8fa5e4afc py3k
+87107 4a94c2dbf9e84a451efc66ba35a4f672451f0d15 py3k
+87108 87f23c7949ee810933f9417fc5c9462a195ef7de py3k
+87109 a1f36b9373bbaf191f51a8329c8eb84a0d6c70da py3k
+87110 39009841471b597a3b2b78e7f5e3f083e993a2a4 py3k
+87111 6ef1aeae42beb6ec851edfb031cc205c98111320 release27-maint
+87112 11fc6c3808b64047ebec24b324156b7c2cc71d90 py3k
+87113 2fb1ec5c735eb2037afdd156be0145f240fcbf4f py3k
+87114 121ed848c670b2b52e6e26db8321bdf407591799 py3k
+87115 396d9fa4fa2432aff88f5e4e7dfa6796ec7e95f4 py3k
+87116 ab13553702f55c25e1b3b67b9c95840ae4ce2fac py3k
+87117 417f8cccd2089a699854f99bccba1982333c0060 py3k
+87118 50de9f1a6d54703e4998a77548050b21b1874778 py3k
+87119 788984b7da6f2eef18049f089c524ef899028cab py3k
+87120 bded067f91e8dd8b57cb6b631d8636318c9df354 release31-maint
+87121 75cab6cd97c63523a439b1219527fb5f43512ebb release27-maint
+87122 786fbed78d57d777250c260e5748808344546d9d release27-maint
+87123 aa30b16d07bc454ffb625568a1e4a01819bf03a5 release26-maint
+87124 f4f56efa2870201cfcd535e0534a768b86e87927 py3k
+87125 9e72b6d0f48ba3f9257bfe62bb776261652b2673 py3k
+87126 0821ef122d531dce1a793f26ff76d149f481ecf4 py3k
+87127 a46e19e86680165339611aaade47b30b1e0772f0 py3k
+87128 c718cb786aeb5fc580297eecdf2072f28655ee88 py3k
+87129 324d93d685331df6af98ca84e3f97f94df082c43 py3k
+87130 d94d365d7ce5ec6fb05e827406046691ea506cfb py3k
+87131 5220122e3e9bc7d39fea736d9c9e6be097f3b355 py3k
+87132 7b7f6ef4f99c7ff61240153ef7bc5f86f398dc70 py3k
+87133 95a73e4b2ceb3e029f86e3a914caec43b9c9ce68 py3k
+87134 4c7e32e5928857f806b1341ad2afba0f89ac8766 py3k
+87135 113925b79b97b03c6eeb74abeb7ca4303c28200b py3k
+87136 d57591bdf61e8e983654edbd25c9f3b80cc1fd6c py3k
+87137 50d170bb71c7531861467ccc575d04b96823d4e4 py3k
+87138 b84261bd6d4a4e6eb0ba774214d142f4cabc53ad release27-maint
+87139 e0072bddd2d55700a38cfabef67da98aa94bad0b release31-maint
+87140 8d4feedeaaed345a4ff45a3105d1f512755c2b54 py3k
+87141 169bf01bb507e07894aa3d8303da0fc4d38e37ab py3k
+87142 21df8155c770f3cfa6669440012c9a91c22140fe release27-maint
+87143 f8bea9960462118bb61b33d0d7347bb6be9dcc23 release27-maint
+87144 800563ac057edae3e6e251e5e3bc03a88d9c9c9b release31-maint
+87145 d28126ebd60d02da9722345d123bc6115692f5b6 py3k
+87146 6e9f397bba025e2ab3ee206b2c56e81adcb61880 py3k
+87147 c537bd37f508af13c2128f42d521ea2560efa298 py3k
+87148 1b659a00570bdb4b7db0a6e32fcd096cdb3bdc56 py3k
+87149 740302bb3adfb384b67646b4168b9db479d82e99 py3k
+87150 bbce42f6dd7dbbf26a9612d322ef63b3bdf25680 py3k
+87151 3c589ca41d3a3d1b1615a2664cec8340bf838395 py3k
+87152 1486d3171c68678af57b1695967f7842c0496a2f py3k
+87153 38dc4139854c8cb8ab6c7fa48f496613495c657f py3k
+87154 9cb2ecbb1f0ca9b76e42f92eb2537f26683c9e36 py3k
+87155 8c254b64a43804cd291f5cab9f33271071340955 py3k
+87156 8de33562855faf9cb96ac63f8df4339cc8168c30 py3k
+87157 c86dc2bd3ae81313e47fac93f22aa74d3fa6fd28 py3k
+87158 74fe73c10611d23d1e38b63559de5ca099b9d8cb py3k
+87159 738eaeed0b1a24729d16029ed6d47f346e1d348d py3k
+87160 4f849720bf413730f6dbce7b23ce83f45f1715d0 py3k
+87161 0133b8cb7d806d37e35733d7b49e96506c4588f6 py3k
+87162 330a9852396df88efd6ce92e5cc29c383096cdeb release27-maint
+87163 7253be96a19ebf1688a6ebc7f48043ee2e48be66 release31-maint
+87164 fa55b03be57402e1894f4dfc6391f474fb396609 release27-maint
+87165 04ed9dbc6e051c309d69e8b8c18bd10c3dcaf0bd release31-maint
+87166 714b8e1ef7263e2809c9ad9a53f0598b083aa51d release27-maint
+87167 ac3c55271fdd42a01c13e64bf3af6c28becba71f release27-maint
+87168 aa99dc8f705dfba92d55fab66481f4bc0bb7daf4 release27-maint
+87169 207ea9a05062f242a727615016b34d9d9eb53561 release27-maint
+87171 d6c702d40ffb2de8e1bf427562f50c517550a72a py3k
+87172 353079af4f5275c9119d23a15a48c324d714d965 py3k
+87173 70436b46e434d2d92e864874971a33af0a54ad4f py3k
+87174 b1bdef56966ee1349fb69138b11436146358257d py3k
+87175 8d38c6a27181c1d157d860017b39543ef606a75c py3k
+87176 a811f7c10e8250fb4e34481c1604156cf218c8de py3k
+87177 f22d91332db94f6a3f60add28a8fe8434064be45 py3k
+87178 306d88a3235723d353d5d127f8530d6d976a2ee5 release31-maint
+87179 b97d843d6456296ea137418a95dbf969dfefc6d7 py3k
+87180 263c998b2f459c871561e27d4509a32c4dc22f72 py3k
+87181 3b628554e1aa15e3f82ca761a5fd8ca3ae1e10c2 py3k
+87182 612dd5f2aab31a76dbe8ae891e3b42528961d76d py3k
+87183 ce287768737006e509b109ac964da8172ae90eb7 py3k
+87184 53bdf1c81486bceda1f4588f5dabb09669bd9c05 py3k
+87185 2cf7bb2bbfb8eef7b69424a6f604260759578796 py3k
+87186 999b1aa246783aef90e2675a8f372ab50ab8f1be py3k
+87187 15531cbe3f55fd3ecf1f0e4734c98cc002a6041a release31-maint
+87188 0eadd1b2d258c80462207b99734bc1d62b39c78e py3k
+87189 5bfa436a287bf040470b2e78fdab7efd3315f942 py3k
+87190 7aca32a2890ef204a688f09be4c5238aac600889 py3k
+87191 66d9e3881761022a277a9de8234ab455d590e696 py3k
+87192 d02e76dace5bf11e31375752ef24e8928f0e3719 py3k
+87193 554f26ce33e1999ccf926c0bbd72d88acda22257 py3k
+87194 3242fd1771664eb074f0678b250b59eb34a1cb90 py3k
+87195 b74051cad717823707ea0473a0a80ad881b1abb2 release31-maint
+87196 a91b3168fce2981ebe1f57326b71ea5bdd1656a0 release27-maint
+87197 cfe7ca1a7bab245f59cbdfb33635dc380641f922 py3k
+87198 f3130c2c46f5a4ee43a1d3dd0c6beb5db6cba18a py3k
+87199 99eca62d691994b6806d9e45ed76bd6a2cc85899 release31-maint
+87200 8081762eb6d1aec1ae60951868f88dcf6c2aaa54 release31-maint
+87201 10ee4f32b91c402c847a0f45555a537233de0b03 py3k
+87202 b7cfb5f0fc55b36636709cc109d7157e9d6b47bf py3k
+87203 ed2ac21084f4d993642551a43a5c8fcefa3be70b py3k
+87204 2872f46e81970d4a04c8e5c3bb0ceb437c2d78c6 py3k
+87205 47088e5cb40131fec34e3ceaa2c8b6c572eb223f py3k
+87206 eab8f91f5754dd87ed8bf7f68dc2160c594444db py3k
+87207 de05d846795e4b7761a232f373009cd621e6b54d py3k
+87208 fa3d0787299341110e71533db3e8cbe6d066f3bb py3k
+87209 06206f001bcd4c721e30bb26b2a83e8fc14237ad py3k
+87210 bc8809b3e4be7f5f1af1833ba505467a39e1267c py3k
+87212 f7e9ea8c61a0277753cf2606c37f01c1e6563bd0 py3k
+87213 668c4218ae26e736fd2f1d755d09c3117c3f344f py3k
+87214 4f81b5d356ccd45f4fc9eeacbf7bd155ab456be3 py3k
+87215 794f54bb971380c4438d98541b6c7ec2c5ad4eba py3k
+87216 f8cf97314aeeae360f4f99f274af6180ca7d37bf py3k
+87217 c28771177fc405fd02ea345aa95b0c425a0afedb py3k
+87218 19116191d52d8ab3d9efa6bfd58725528e492e44 release31-maint
+87219 baf0d189ed0734b74f2d1433e5e3905408830db9 release27-maint
+87220 16b6ae75de9468203cf0e388827357029b1187aa release27-maint
+87221 10bfd3c129dae271bad676d762ddecf4e5f2eb2f py3k
+87222 262ba0ab4e21ef1e79c602c366e800808fa15714 py3k
+87223 7f8cdcfbb08e1835fdd41d870d1f3c0e9ea5e287 release31-maint
+87224 ac8da5578493c4d4b009b59eba5fbad7c07b3c47 release27-maint
+87225 b084b50e4aa6dc9183dc0e8276487d957688b82d py3k
+87226 71fb03274a89cc3a6979cc14d7673c7a6151154e release31-maint
+87227 9ac8699d88d61db31ddd4ee3b5adde4495313afd release27-maint
+87228 6f46afc51434ca89109679a1a8f25522bb0c65b9 py3k
+87229 59b43dc34158529ba208dedebdd73fdce381a74d py3k
+87230 da20e7a01fa63a6d8ab34f210da128ce441564ee py3k
+87231 69b85964ec888380091979a1758067b04ff37670 release31-maint
+87232 8ccf58b0a5da776006d7fc98d9e6975c82265a78 release27-maint
+87233 767420808a62aefa31b4caad1f63014a5eb7fc0a py3k
+87234 072ee3f743c21f3770ccf13ad48e10a18048063f release27-maint
+87235 b066bd0b64e7cf6842f88d986fc9c29d7c352b43 release31-maint
+87236 12381f19e2adfc8f16850e9c65c6ca67167028c1 py3k
+87237 3110d4a48878b4d517c203024b76a0c67c87fc40 release31-maint
+87238 f3ad52f66b8a42a5793932c722d049f89c26edc8 py3k
+87239 6afbe4612d4943bf7dd3b5d485b7b4e278c55994 release31-maint
+87240 79a2b6a1280511dfbf3b885fa00ae86708408011 release27-maint
+87241 d18f4313b197e56b2b221d438168283b3cdf0ba8 py3k
+87242 783f311ca8693cee032dfdd479da5e61b051da5e release31-maint
+87243 8d7171b3cdd69a73878eac094089d0e7eb34dd50 release27-maint
+87245 e156519a1c603744f7172eec7d778449e2cd8915 py3k
+87246 38aaa72c0131a95692801661532007189005f2f8 py3k
+87247 d6ccbd3f5b4551ce4fe2d3d0f034a76e9672dff6 py3k
+87248 40f543636846c78b6c0bc61496bf618421e1a302 py3k
+87249 f9d095596ea96401dd92092a58f9e9a9403e705a release31-maint
+87250 d709d114cde3c05c4a07456dccbcd25ab5ca0c46 release27-maint
+87251 531f423b019d31f51e0adc49a680dba19fbe266a py3k
+87252 7c3715b10cdd45be2bef6b2028d309dc47b15ebe release31-maint
+87255 4ee4086dd1b7405d0bc2888897461d6f57cd1daa release27-maint
+87256 a61544778fa741c9855f915a7bca76e94483a283 py3k
+87258 1c027a083a6e90b7b39fb71d7627b7dd86a1dd0a py3k
+87260 8e701bffe6e2c0b2e37a819de2f07c3ceade780d py3k
+87261 17858ab2cd92a48098649c045b458cf67294ad6b py3k
+87262 cfb7f6322fbbbaabfdd9eb7d923e0cba0e23c70e py3k
+87263 79a90fa079a8bf18027d1527fe16bbc48891a94f py3k
+87264 aa428aa9b68b2a7227756175c2012476b4a74898 py3k
+87265 40125cddafb90529d12ed05d91fb343da996ab5d py3k
+87266 a96a2bccdf8a27a123c6776ec213269ebfa832e2 py3k
+87267 019ad9f32c13e8abaa270df11085cdeee4375ee0 py3k
+87268 4716308404263eb19c52ce296a8a4680061519ca py3k
+87269 afe5f6b1c7667771c1a828d977b2efa8476ce01d py3k
+87270 23ddbd835950b89c198d660958212e3e50df2951 py3k
+87271 a0fcad9070ad1c7c9bc122c46aebb1ad468a5424 py3k
+87272 6da37c34f8a303240e8bdbf51a17b1ebbcbaa3a1 py3k
+87273 b580927872137744b19acf8f2f3b963cbefbaed2 py3k
+87274 4dcec146b99d46eee45c4517c84d3ba5c907f038 py3k
+87275 a28e8721117c26c478637f7dcfd9165b629fede4 py3k
+87276 9a2e56d1146df2830c9f6784fabba4458d466858 py3k
+87277 2d2997f19e90c5986a4b2896784497498f86a5e6 py3k
+87278 2613183ec0251b0c87af3a0b868fc9438853fcd5 release31-maint
+87279 5b44059247db62ba88f5d75c30cf309d6f9c5a5d release27-maint
+87280 00f7f51ce8ba5947b122559f66a1775e8afe6482 py3k
+87281 ff07a06f6d65d0a30167e91fb267a2790a4c9bff release31-maint
+87282 3b5cc6638f3d10d48165d40bf431ad1fe0f8b613 release27-maint
+87283 5ec2c2bfaded52310db12f2ac088359770bd0579 py3k
+87284 9cc1978ec9d498c491233f7a5dc1f4e6ee009ced py3k
+87285 9b1594c1544b7ecc8743466e71c07423163313a5 release31-maint
+87287 80e3ad5a631d5753a30d70db9fc3b2176c29243f release27-maint
+87288 4ae2c21116f1df3dda8dc3060f94eab783ead098 py3k
+87289 7f549908bf5032a9fa402d7c82ad6d1ce6dfcc9f py3k
+87290 a51a4f5e87e49e23b0865560acadb59e253bb51c release31-maint
+87291 56999495a9bac5bb45b5727341287c11e612ed71 release27-maint
+87292 b750c45a772ce8bd961e1563b7a45043668f2664 py3k
+87293 f59cda57a7fa83394082e70fa5de9d37bd1eb64a py3k
+87294 ad9b5c5d2831f4bd025ec16e6c4f349dc40f9bae py3k
+87295 d2d526db27736acbbe40a87d28c1b3f315f95cab py3k
+87296 ca7a5d127d57cdd4ae636159ec8576e009cce19a py3k
+87297 ecd28e84c44b0f4c4e77c96b52970da880afd448 py3k
+87298 9c1fcedef2c19d5f5f99c711c0aec616141b4588 py3k
+87299 3de6cd902624c7b908f0e0baf0a584e7d72c2d53 py3k
+87300 3f1752d4253bb13fd9a19af53a1075bd19bd6a59 py3k
+87301 1aa4e5ca9174217437e19dca956854fe16c9a91e py3k
+87302 de5b90daabb42e12147b9931068573bc1fd5c29f py3k
+87303 e08c20a67f647fead878f3237d8710276589b56b py3k
+87304 a618287eafd658b19f8b0e6881763b13151f0226 py3k
+87305 0037d65debd8d98c9e4127e7a009faff30a9a220 release31-maint
+87306 7e8eb634f0a91c547e87ef274b2092bcfd00c0e1 py3k
+87307 2aa050a44aa81f4650a75ed70a31db30c18cfb7c release31-maint
+87308 59e230297bffaddd4d36d3ec99bf0bacbb629b4c release27-maint
+87310 d84ec85600b1a9804d6b54e952d5805c69d08266 release27-maint
+87311 fd72614b9032101a57a43a4b00f7930d79128187 release27-maint
+87312 4c0619b832e1bce3e276c3cb0fa24f7e472a4489 py3k
+87313 d9b4426479ac6178ee7be5f7b020ae03ae283ec7 release31-maint
+87314 c6883ec4888042b3f8302d8106ecbe3a8da59af7 release27-maint
+87315 5b92fb02e83bc5fc9b8705b7b6f07c0e20a117fc py3k
+87316 ab65003346c11a151c52b0d7c2a48702980272ae py3k
+87317 436bbc7f0aa68aa756595a0656a2cd4d08df07e8 py3k
+87318 dc32788f0e4e3258bbd99e54f7d5a16d90f93c7d release31-maint
+87319 fc2f0c86b497cb938d54bd0cbca086f55e83eea4 release31-maint
+87320 2c429d8c5ee202a3723803d6377cff5846b60d11 release27-maint
+87321 85c2fe31b11ec09846decedbc85d3d6687de748f release31-maint
+87322 4d2b428d7882258a41a474b8fb3f2761c00fb2a2 release27-maint
+87323 e9d924fe37e03a305e6a6ece2b568d2fcf58cd35 py3k
+87324 ea8f94ce82932696de2ecec36f2d2acd550f03e7 py3k
+87325 aed2bbafa550e9dfdf41d322857f024b75b4c76d release31-maint
+87326 2391ce35ad697f2b26437063def9d85a958616dc release27-maint
+87327 9bfd6abf01ca29cde4fbeec90f8e248797aa7f77 py3k
+87328 074c21714a0278e48293495c399441e055e4212b py3k
+87329 0c2a7e5785c86112ccdaa5e298bc62d119982997 py3k
+87330 7a55b808e491c10276620115424a26d9e22ce733 release31-maint
+87331 69b3a151aec57432193d36eeb9ff34ce39be8e55 release27-maint
+87337 07113d1ef8e51a52fd547dda6710f15a63203829 py3k
+87338 61935c8dc09e0db5c966265dfb8094457f5a5e75 py3k
+87339 016b425f0cd0ce44eb34fc37563dff0c9bbf224b py3k
+87340 b6d3fe70802f3290d63adb5b98fca7b4e4071fdc py3k
+87341 5a6a1ca24e04cfaa15f7713bb77413b9f51394d5 py3k
+87342 c70aa011c05985e462ebdd46fe19f420c46caf5b release31-maint
+87343 341b93d831571d848acae6db183e74daee0b6423 release27-maint
+87344 22db4d2f655498999da528efc3cb39d045a25b07 py3k
+87345 0550a2447c1e631a039a748cf9ce97b6079ba49a py3k
+87346 3a2953e21f785734687f1d7c9538a21cef3e546c py3k
+87348 5bbf5b6d36580525c47a5c7bb73a1e0ca72b8725 py3k
+87349 ac8c6c7c0cb356754d9a94175df049741f795dea release27-maint
+87350 892236137db961812b49ea9cfcf5c0e1b1598ee9 py3k
+87351 43bc5922f2990645c5135fe63e6062f9169e7e2d py3k
+87352 61bc862667e6e3d9f3b13a551c42152c03dcb9d7 py3k
+87353 26c0f769e9b471d1b90b7759a6bb7b59f0d75a11 py3k
+87354 28717de4c562cc3a9d1af3d9767f6c08ed94f54b py3k
+87355 409ba25087122884ea066f8e2375f1bc3b967982 py3k
+87356 a5ed4a12430aa7b1df87d3c5850ec087db143ae3 py3k
+87357 884b14ed8f543dd76a1074558c8a6b147c372aee release31-maint
+87358 68a42b944fe398aa6b4944bcc9c0d2250749d0de release27-maint
+87359 cd27c3c44234afee5a542b18cf4b778a9838ca4d py3k
+87360 a0a995e0e64019f6c0b861529999fa88f52d16a0 py3k
+87361 78c152288f53a8fd33c3f6e44369ee2c980b4d97 py3k
+87362 4c042626114831f71dd70cd243be54c872208bb1 py3k
+87363 bf36d6bdde60b4af050b3e5d9a4cba7c205ec5ca py3k
+87364 9cf1512f8812c2001e0e751d6f92cdc5a20ff6ae py3k
+87365 c7a0537c7f3c286708e5fb24dbbb99eb73d82286 py3k
+87366 a06647ff5d9818e1fd19f5006c549020994ce795 py3k
+87367 e65cd21d5f7314ee7a5108441ca9647a45babfe0 py3k
+87368 fe7a8a1bdf3d6bc72103026262eaaf76338765ad py3k
+87369 72f536d10750f4b8f14d3fc44cbb31f9004fceab release27-maint
+87370 6fe94fc02fc758d30ed74e5c8113e2f675c912cf release31-maint
+87371 7ac03ec3b278b95d95b359b6ac09727bfaa1c0aa py3k
+87372 8adb75c6930472874ba135610f36b25f240464fb py3k
+87373 0b94635ed2f6fa8939339c42628440a336366415 py3k
+87374 44010039bddfa699d48afad75a75f680c35ab5b9 py3k
+87375 381556369caf6a2ef34de3b3ba907916acb65bb3 release31-maint
+87376 5f49d3cb194f970d51199d1c39f339e6dde0f8b8 release27-maint
+87377 736964f708dec238fc51a073f0ca9ade045038b2 py3k
+87378 29db97c176c9cd9d01501a2fa2474bf4a986873c py3k
+87379 515de227700184d13e74d19a6a9b70e58b56c2d3 release31-maint
+87380 7a48590afd92e4bf8f2a81c58ed8498c47dc841d release27-maint
+87381 c2d5cd032bc9161f9425bc941b9cad24ecda6996 py3k
+87382 3c182f71d4c9c56607eaafe7c4b6557a0ffe397e release31-maint
+87383 965314f12f719db9c3efa5220af64fbed4b51fc0 release27-maint
+87384 9385c536f45480279712edac86bbd63b88762856 py3k
+87385 ee9bdacd3cb610099979b9c70bbe1ddf76112330 release31-maint
+87386 0af94f976d5018fd2c5b06bcf5b8494f931286db release27-maint
+87387 dae5176d7b7f300c22e1b00d61928ba427c49aae release31-maint
+87388 d16add56dac034b9eccda0c8ca67beef9d104b16 release27-maint
+87389 552bac7558e7792b0b41b17e68f9807d9e5ba452 py3k
+87390 4e22202e62f83cd1230a2a0c3d3dd18327c20987 py3k
+87391 9fb89faa595833a20049d373c5d2b94fbcecc3c3 py3k
+87392 4e2b860e657c9abb42dbc35c2437e762250662c0 py3k
+87393 e58fa983a94ef8cfc0ab251eb96efa201941edcd py3k
+87394 4fafe97d0adba6f04032922d50e047ec30aebc43 py3k
+87395 5b8026faa0a73d61791576f7b5f47ec8501062ee py3k
+87396 13b4a0f52c2c2cbf4dd6d6d32fcaffc428cb6575 py3k
+87397 7c30d0f1028c4d37546b651895506bf2e38b538f py3k
+87398 47cc48965e525348bfdbc44aa90cc2e4c2fcc191 py3k
+87399 6f56b247a7cd28233cb08757fa284c3801d337f9 py3k
+87400 e3af5f3a7904c0d5343ec9633ea66e7acfd23a66 py3k
+87401 9b26248830f65ca61de8d762a1bffbc9760a6bfb py3k
+87402 fc96bd18bdc61c589242030016db106a08a43285 py3k
+87403 6d5627a066778ddd9b1eb665376dd2ec4ba25e7c py3k
+87405 3d86cd9fc534aefaaf5736cbd43aef986a89c945 release27-maint
+87406 0c4afc5f5938e27be950213b9a59bc92fec4dbc5 release27-maint
+87407 47dbf3ec1ad7d829d16d384388c29ab317f3d42d release27-maint
+87408 24894fa7c58c50c5bfa68b797e6923d13f5d0193 py3k
+87409 51794ada6810af498d5721c4356d26a304b2817d release27-maint
+87410 22a0ea7d974eb6d236baaa39446140faa97c9029 release31-maint
+87411 f567a6c8593645d8776734f35b323eae8b6c3b34 py3k
+87412 fcaa987ccea020627c4f0f797656722f1afe0561 release31-maint
+87413 367198b733cdbb4266fa14138fbc8036b63a1024 release27-maint
+87414 b168b2cc1b21d2e243a8a6ce9117eb65c63a33df release27-maint
+87415 815b691755fa0bfc244b35255921d265e7f43ff8 py3k
+87416 8685711586d431ec6bd5d35c07f014cacf0ae6b4 release31-maint
+87417 564a41666ef6f4b1625c76df52d61a1eaa3a1949 release27-maint
+87418 8b53f256159aa3aab840ad8d33e432a2f62915a6 py3k
+87419 52d29c7158fe20792a3314967645e77490305b1e release31-maint
+87420 cd1dee55ace84ee69c96aec14cb9e3599d0464f0 release27-maint
+87421 204bf433d366a307e46d9fbcc2953f7e2c3dc2d9 py3k
+87422 098c97e95d9319f5c76eb38d6b85ed1429364e00 release31-maint
+87423 0daf391a1f1df868d700f49d77febad9d3ba0c21 release27-maint
+87424 d5c8ce3a70d4898d5f9bff7e476b08f2f205e0f3 py3k
+87425 2f2de6cc62c78044d160848815881fbc420de5aa py3k
+87426 572f73ff28c222fe402efcc9c870595fa351c6f8 py3k
+87427 a84204f116f8b67f4e2c09a8c7fdc801cc831298 py3k
+87428 5cf8555e5be55ae1246a3e905510f39aac3a5734 release31-maint
+87429 595f258806eff0adbcb5a459169343848dd114f8 release27-maint
+87430 438a4698004add5486cf7bc4bcdc8d42834ea4a9 py3k
+87431 561ea640188b344d604ec0a2dd1380ac410258f4 release31-maint
+87432 3f9051d86603291926afd0c0fb3e01404a067941 release27-maint
+87433 8e7d4c3974587cd35b4598c226340cc036a66547 py3k
+87434 53a41a117411bbb0f0159bf3eba2cd5eaabb0aea release31-maint
+87435 c63ace5a5346bb0a9b15213720905032a4c7605f py3k
+87436 a82df209858a64dfe11ce197966f1d5fe1b46d36 py3k
+87437 6ff50cef984ee559b29977f443a23f7bf560db97 py3k
+87438 92502b3674cbec78cf82b230afdcafc61e6323fe py3k
+87439 6f48342e9e3df69b2e76f19ce6b0421f514b465e py3k
+87440 99d1463edb56c1ed75ec851cd2fc0c617e4b59ff py3k
+87441 89a416fd7c29707bd41ff845a79c1ed76b06db44 py3k
+87442 6a623a7670622c72c3d54d863d2d6d9c58e98767 py3k
+87443 e219fb4134e3bd7d6c82772530b36f9641a892c1 py3k
+87444 4dc248ac264f5890418f326a925a12b9dbfe4a1a release31-maint
+87445 cf18d9e51b9d600433a3a7bde3eff3de925dab22 py3k
+87446 36ac3d9d74c150529a1cca6e54a41ed92a25f4ce py3k
+87447 83bcdad25335f8b218aa105eb9c354d946920ae9 py3k
+87448 121ba04f0fbb101abb397aabe04f6ce9e8a62d5c py3k
+87449 2192bb95f54b0dae1e3f89580df8ce6d9cc3187c release31-maint
+87450 93f56194cf5b82c33be237b0f0b4323686a412a0 release27-maint
+87451 765796a34abe188d04593526e6dae66803d89452 py3k
+87452 81982aced86bc95c735e0bbfe87268728166f45c release31-maint
+87453 b5d03ceb8d79078e393b7a40c047b784216583da release27-maint
+87454 d4e0da76188b60267aba58dc83d1f3adac3bfc9f py3k
+87455 3b615ee787b0f067e47d4f75153b213e583380e4 py3k
+87456 c34ac9f9de8317d3626d69c3e1455f0385226b09 release31-maint
+87457 5c082f197ddf773ed9eb2a19108768570de9c43a release27-maint
+87458 fdb8b02c1e65b3523fbbce8aba20cb4212f331bc py3k
+87459 e1bf3c1c95613425adde85d97b734efb9ad2a1db py3k
+87460 caf89a6a17a7e84ba0f4ba2a14b0faa32c4070bd py3k
+87461 cef2817ea15725e94f092775a1490d7055706724 py3k
+87462 d5faa9ffdf2a93384e22df8c2299c43a068c84a1 py3k
+87463 096731620ff2aeaccb5423e7397cef03454f2a72 py3k
+87464 c37d6db02c84d03dc66260d3bfbd9510646452ed release27-maint
+87465 d2c28a37f763067504420e5a889090700dd7dc26 release31-maint
+87466 89ae2c3b085cc1b397b62c08eeedf67c2c2da728 py3k
+87467 51324154f893f7b55e119ba08e58291a33b8b7d8 py3k
+87468 1c560f4b5e5b49d04e2ccc22cbe559104e706586 py3k
+87469 968db3e5b1d80008fe66270c668783afa638fbbb py3k
+87470 6187661cdc088bc2b201660e37cd9aec9e273f1b py3k
+87471 39cea980905d3d2c31ea73569260d4288d1b6b84 py3k
+87472 2e9670d6701731e5cfcb3086f6c2fdab1366df2c py3k
+87473 c510c1505ce7234eb039f503ea1d669a3c9b165e py3k
+87474 5701a8084001917f6fa2fc16ac9e77eb47415efc py3k
+87475 84c1d26797078ff8f0092170da73623df7ee1484 py3k
+87476 2d82cdf62b2cde2fd58536ca577042a5784746c9 py3k
+87477 6c8a1c11761b48912428d5ea2dd64d1592a4c035 py3k
+87478 8e9a47db393cefbe3834a492cd8687cbbe8f4ae8 py3k
+87479 ed8df5a90cf19625058d22d936d1d144f9d96240 py3k
+87480 9503b066252ddb1799b38a21299c61801bf4b329 release31-maint
+87481 d51afe47de732a40be5d159f74f39e3102cea70e release27-maint
+87482 fa4de66c7deeb3c7c8fe3bd1974e3909d7cc4346 py3k
+87483 c566c4131439f1778f31530b9a10ddf7471db971 py3k
+87484 a67b42bff4718627ffe31309545dd0261f1c0efc py3k-futures-on-windows
+87485 38d66980187e284645b081e6b1f2b19b88fecd85 py3k
+87486 678d8336f4c3dc66e3573c2857da949056e5679b py3k
+87487 1b2160ad4c6e4a6b91762b40dbada92f17b69d80 release31-maint
+87488 488ed550b7f888cef8eb05bd5179341e14259acf release27-maint
+87489 4b926a13dc5428faafcbde1f70bec2e9cc266e6f py3k
+87490 a01533b01b9c9bc168fe7d10750369377e36b4d9 release31-maint
+87491 d5bbc65bc2b3e01a34eadb3c6859070d620a4ba5 release27-maint
+87492 c17a49972244147486a795fbcdc2ecc75cdf6b0c py3k
+87493 bf09ecf68a1999861b71ea14268b7d44f9d0c316 py3k
+87494 4d20aea605c5fb4400c3b7b12670bb0cb6e1666d release31-maint
+87495 fbbefcd6a1a695adfb6e0cb47a934fde1f4c4c80 release27-maint
+87496 f4ba54e0ba774506325683198c8ec85018094ba2 py3k
+87497 c2ae90acc90885666089d4c5d4e1275168430383 py3k
+87498 108bc126930f7f8f12eebcf4bd4c109e712e6678 py3k
+87499 e20a6436a9270f8ae7f50b25d1ce0e4620c876df release31-maint
+87500 dd6d1ecbeb56d3ca332ae2d9211c6c46f4e30e12 release27-maint
+87501 bcd6a65b8b223e55a29953275309ea1fddd1d6c9 py3k
+87502 442f1da01a8982d4aec47fdf5f2904a2f9448cab release31-maint
+87503 d4d3c89ab388f0c951ef4823a392ff2234f213b7 release27-maint
+87504 93e95b2e1a1a23b3b1b5be9cef62e03c3a6ea385 py3k
+87505 4bb7f7b151fea9498cb52671972bc7c77d34c183 py3k
+87506 66d8446a019be7679944cc3c9076ad98af6629a5 py3k
+87507 f61196453c781e706fecb18deb07992971c24ade py3k
+87508 22c12a5d8ed30515527059bc69c06d7a7376a493 py3k
+87509 5dae04d49e15c99de859cc2528e237c191f5fee8 release31-maint
+87510 c694685b75e243a1caa7b2b0188b43a66e3bab90 release27-maint
+87512 664705dbfe6299e19d3013b472ed0591742640a1 py3k
+87513 efdc5d0d81b721c28ca63e873ad4635cece9e660 py3k
+87514 bbf751fdf420677c54bdc2346efdb6c779d2dedc py3k
+87515 2d09af4c137c9c6f3cf4b1553fff5c4706428408 release27-maint
+87516 89549535d975874230e2b995fe3c15a2c111d83e py3k
+87517 6f19622dd342b4d92f0c7e7b580f0c9ec8c16b20 py3k
+87518 fc834b323f267dd44dfe9ae7ef9197d278be5aaf py3k
+87519 5605f6920b638e408e9bcc5bfb542ba4075deeba py3k
+87520 305af6f5cabf94eb42b957096be126ca9a12488d py3k
+87521 53209d00d3ab192e465c34574ba4d1eb93c368c0 py3k
+87522 0004013ae984a9c4153032e3bbe00e780b36a628 py3k
+87523 109defc1a8cfb2e2b2f42073d3da6060e801120e py3k
+87524 3a4816c36df7fecd79694efc21cdf18d943f8c1f py3k
+87525 e0c52c0e85862330cf2335d66bf4f7f1a379a55f py3k
+87526 7d551d5ef4fcf4698ed62ca8853b76a9709899ad py3k
+87527 cd6e343e278e8c24b108a92cc504a65d5886c11c py3k
+87528 61448cdc0fa8c0f5b2e327a8389110eb75c6a909 py3k
+87529 ef93531d0ac47c921fef29e8c0749d4c54363e27 py3k
+87530 2e2476fb83eff90ed7cef053ca251277447d0567 py3k
+87531 4a7739c5274b8a5b82ffd6413819191bc04ef9a3 py3k
+87532 880586b8d0d0157baf4d9ed6b550302ce44e8cf3 py3k
+87533 01714efdc6cf12094cd70e548f8827e7394998cb py3k
+87534 8fcb8f2655a59240853cf16efc8fa51af22a7795 py3k
+87535 14fd0dfb16ffc36269a6ad93b8226d7c9276438d py3k
+87536 f509129834617c961ac37643df71a35a2518bf4a py3k
+87537 b901da561cd14070fbc76642352c0438f380efaa py3k
+87538 a8be05673f34377f0f410498feb8b8c105c1c8c8 py3k
+87539 5aa433a277f937fc78ca2cee027c6ec6bf98afe3 py3k
+87540 a4ec20cc90666821b165a96de6830c9527bcf3b2 release31-maint
+87541 54f1d565155574a773b3315643792c8224e70d9c release27-maint
+87542 18bcee8569bb37a44e2bcc9e852037c0ba249f99 py3k
+87543 cc78a6befbf2f1f6eea4b580f28a159d7a84d64c release27-maint
+87544 05cccd4257a22a87842937fc29c7ffaf175c366d release27-maint
+87545 3546ce1aa355bc67419e65bd54a1f2aa7c477865 release31-maint
+87546 52a8617461297bb95946c7f9bae68a0704a1e1fc release26-maint
+87547 6ccdb1e01611574d1be03e9fe521b4efa3d2f2a3 py3k
+87548 69460c805737be8351f5ceb2e50eaf55eb7eb401 py3k
+87549 b7be652daf6ee322207b3a40cabede81dfa05c7e py3k
+87550 77dedaa36d3acb8afc31c365b2187b9bb93bcaec py3k
+87551 741b93bc68a5bebe8d71edb4290f467307cf27ab release31-maint
+87552 9559e1152595b95dd2d41732f65b4ea2584324f9 release27-maint
+87553 0d97bb99425deca1facbf9052908ccada083f1fd py3k
+87554 5bbc1dc459a581f676d9583b24e6c2d9c671e5b2 release31-maint
+87555 1df2021c7c3c47d2fbad08acbd502bbb70a9beb2 release27-maint
+87556 24988f9f850b1c3ea016b1624768fb4f2e644c13 py3k
+87557 fa5988f7c8bd2570648c54a208609f834f77b058 py3k
+87558 2a773bef40c211743e04c65bfffeed8ecab71d31 py3k
+87559 60323a0e80d7c1ffa2b32fe24e3dcd3a2d85f6e0 py3k
+87560 37a915bdf827ba514256eebb2d8eba2612e078a3 py3k
+87561 427f9f1550485e84428a8efb8d7d5095042e79bf py3k
+87562 2b40e4c7777553726e722dc5c8d28ebf985ae2e2 py3k
+87563 b0faf7a4523951143400e7638c5aece9c6e9ef22 py3k
+87564 8b5eeb5f454664bc7d6db683671072eb43c8f34b py3k
+87565 e2e59cb4f50cb2c29c002710167a2a42410e02f1 release31-maint
+87566 00bb0406bfed9401aaca4ffbd378ec3b2522f6ca release27-maint
+87567 ab61bab321c10119670217aa1f793b0f89ef0913 py3k
+87568 7e716b9a403d14949df2a4e95ed67b27f63ba91f release27-maint
+87569 f0697ca8ad476dd88af36a2692b218b22d70554f py3k
+87570 2e592a4e68ab8f6071448c0eb89733855ac04143 release31-maint
+87571 2e1dbb252f257819a01293d47e4dfcf82b550a66 py3k
+87573 10b8366837d80de735a1bc2114942eb1d1b320c6 py3k
+87574 41d5b6ca1923ef9f4b7078bf113699ee4b7f6fc9 release31-maint
+87575 e8e64eb4ca4cf57f48dce13692aa47af11818a8f py3k
+87576 9138634b8bd14602dd25faac5aaa4fc8e73aaf83 release31-maint
+87577 4c83a29a712f915da4f9fbae213788bd3e60ff48 py3k
+87579 87e6bdb373d13d55f98e6a10a0398b772c6347a9 py3k
+87580 16319f9be97c4eb9a15ae30813a4d1fdc295fc77 py3k
+87581 54ef52f971a5197f3ce6a021a8304eda1abac3e8 py3k
+87582 63bf84cfd8a614eb8560012c590dc4c8fd440d29 py3k
+87583 f0b56a38a5243be017c3ffa8cd1aee3e4db5890d py3k
+87584 44eb09a55393f07be9a4b9b81fb3b3745522271b py3k
+87585 f37f96fce7b94da7f33729d5cf7664c92eaf93d9 py3k
+87586 fdb6bd1d5354ce836e47149c400a16846298ba66 py3k
+87587 8c7df0356036020fedda0685cb9f3a0f2ccb19bb py3k
+87588 cacfff349d48d732cb0fd8a9422fd4395d8daecb py3k
+87589 0dfb8397a973bae6b16d1a7f1b6956649b21142a py3k
+87590 702037c039ff01394944debbfc3f3a2cdcb72f13 py3k
+87591 c72ee6e3b7df8bb9d18cbf40fa2df04315714429 release31-maint
+87592 a13b8663febac77ede5433cf4416cd7dc583c025 release27-maint
+87593 5510063b39d401e0e8f99c0937044da29feb2db4 py3k
+87594 3fe66fc2217b301a9be4e680d50766a4c382b235 py3k
+87595 b68f387fbb48a8be453a1e38265dc8f7021b3f06 py3k
+87596 875721da746d35b7cb9616ebff5619f64261bbf9 release31-maint
+87597 53db290e46ef93b88dce8ce6cef35963b8eb9768 release27-maint
+87598 8f924caf2e5e98dc984cbb51359dafa8678591a0 py3k
+87599 eca25f1deae731830bbec2453dbe8f1fb13de270 release31-maint
+87600 500eb3d0897f4913da88ca220f7fccbd0dc414cb release27-maint
+87601 3bc74616c9ffc319a223e7d96b82a326c6f76316 py3k
+87603 fa8550213bcfdde7232cfa346957282416a37150 py3k
+87604 33543b4e0e5d615058805bf5674d876f65957d3d py3k
+87606 cd8c9b67f033852664330557c17764599f3095ce py3k
+87607 5dba67ca6ccfb55c017e8a661f65666adbcbef7e py3k
+87608 7bb37a4cd7cf759ed01756d0d876645012a153cb release27-maint
+87609 5db89853cace196807c01ffc631a881cfadf74b2 release31-maint
+87610 900ba07e4824b8e08ec96c35af1619b6227b3e30 py3k
+87611 cced0a7ceb43e804157ac1f414f7293d38425201 py3k
+87612 415a792e12493b8c21baaecd77d558e4d988ea2b py3k
+87613 a9aa5e4eb8c3ae55f90d161edc8ab556edda1d28 release27-maint
+87615 f8c2d890fd1054b9d35dcca8e092b3c4526053a3 py3k
+87616 8dbf855c90edac781969eea46051b770e42015fe py3k-cdecimal
+87617 57857a60fa9785bee0492c35b8b3ac4e074fc11e py3k-cdecimal
+87618 dd49455d8a8c9177727be9c5cc8adc40669bb6fe py3k-cdecimal
+87619 6af9e8000332978a4a3d8d6b80f41f1047815a2c py3k-cdecimal
+87620 a6cd84ca7b2a79650f442e07dbcd528b5f253979 py3k-cdecimal
+87621 aee454400ed717b827bfeae538f33766783d2874 py3k-cdecimal
+87622 4aa66e51488f3945adbf7f1ff52cbadb904d6e2a py3k-cdecimal
+87623 0b2ea90300c0c9bffea51513296159fd0abc38a7 py3k-cdecimal
+87624 d2ca5b3104aa3cb97c14d705c237bddcf7092d5d py3k-cdecimal
+87625 d393ec536ca9d5d3ea32012237d1948690629d08 py3k-cdecimal
+87626 3feada72233c4734e72c94237f2b4e444877f310 release27-maint
+87627 dc6245bfe5661af96fc926c61bf1d98766335f37 py3k
+87628 7436daec94210e251fb8a690252dcd9da52c9acd py3k
+87629 4496deb26265da3607e086ac5033e684b8aaeb22 py3k-cdecimal
+87630 798aa3fe0347b59d99bc087ea3518347d1f47e47 py3k-cdecimal
+87631 21e4f1aa2430c2fc5996a37c670a4a1aef6c3966 py3k-cdecimal
+87632 0fc2493a3863d7e2d15330816244f621b70f2fd4 py3k-cdecimal
+87633 5d36f0a53783ade40bd1be7563c42341c151a9d0 py3k-cdecimal
+87634 e70c93612d7fcbd2bc99f1ff1f633ca3fc4765d4 py3k-cdecimal
+87635 d44ba752103f23b7aa7829a9a8b367615bcdd62a py3k-cdecimal
+87636 16e886a76c5a59c498cea9a704b8831f6ff66fc3 py3k-cdecimal
+87637 fe723b8d7c5fe3097afc89e7aed5dd75fc2dd609 py3k-cdecimal
+87638 64014913eb8809b85fdb6c9e2729cad0c4b9a2ce py3k
+87639 b344377fdd8db56b40109d8157599d2262924cfd py3k
+87640 3365c7b648937dfe52d0a56ecc92783ddf94d1e6 release27-maint
+87641 8f33b502183bf0394812ed51cabfa3d1a0817b05 release31-maint
+87642 ff1261a145733a46dbfc0b14e09173382f9d2543 py3k
+87643 9ea12e86d565227f3f69f29a9d5354376cfbf1ea release27-maint
+87644 152a0985b138b7918d17d7c8ce5b4e32adfdfa59 release27-maint
+87645 0afc4139cc70291c4a1f3024387434ad625ea78f release27-maint
+87646 0cae21de992138f4d55a64f62bc97424a4f8ec99 py3k
+87647 0071a17346909907aa6c502d7003070e39bdba1f py3k-cdecimal
+87648 6c463b07dbdb72ac54d410df924deae2085731ca py3k
+87649 dbb6fb2c5b9d7e6a099c8af92f05b4c2cb77d028 release31-maint
+87650 eb954c765521aa727d4264f7420e3fc9bd449b4c release27-maint
+87651 a5ae3a17d5fb181415fc32c5f44baeffa6a3d4ee py3k
+87652 e0e4efb63354cdb6f466ce50632283aecc37fe7b py3k-futures-on-windows
+87653 256f794c2cc0284440bf5ecc7620f33870e02fd9 py3k
+87654 581e672478f7ea4a1f3272be7ea806e82925eb28 py3k
+87655 c4d67fa909dcd2da19d1c41ef056a207662bb480 py3k
+87656 b020df9ee3816cb0a9364e40c4ea7ab85023a0b7 py3k
+87657 d39efa54deaf04930998e40291728e2ff714cbf0 py3k
+87658 4260e30252eb2bb7d55eb483dbe5528d669bc57b release31-maint
+87659 730b1af092387483d0728881fa89f06dd6f6b38a release27-maint
+87660 04aa5be706ac017711a1aa95b1a9f534243fa0d3 release31-maint
+87661 a5daa14001a8eeba4ad0297b667ee5962a058f8b py3k-futures-on-windows
+87662 f89e37cd6c6577168dcb3f0253067c226dbe3ab4 release31-maint
+87663 88e5ae5b7dc26a01c65bae9523281d79c5c13bd4 release27-maint
+87664 e28868cf982589c75e17d0d40de3a298c7a837b1 release26-maint
+87665 746143ec1f60da12954a7ea671f91536f40292a0 py3k
+87666 4af987ec033a0d06e13199f89a52efeaaeca10ae py3k
+87667 28538f2e0cc247f3f5f89a4708fa4ffaf49384d1 py3k
+87668 d8ed0cc9e3382c2694ccd0f4ea312acf3b5a15bf release31-maint
+87669 93b7c0008b085e07a29444f8961a9f2f7f2c10b7 release27-maint
+87670 73b24476ca3baaf707e7763b7bfd7f72250fd533 py3k-futures-on-windows
+87671 a048d0cf2ad1d821078495ce39702bb4473daa95 py3k
+87672 5384e720f28fd198360dcd66e9856fb13e9bd77a py3k
+87673 439bf9680bef26603c8f4a77192918ae3737e206 py3k
+87675 e8bcc7dbab7dc20c339f38313f8a44c4da543ceb release31-maint
+87676 c898dd215ba066574f7ae48e19a76f8835ff563a release27-maint
+87677 fa59ac1164840de9c18b492cca34366d8266839b py3k
+87678 5776f424d857812d71fabd671586137d2223e320 py3k
+87679 28119061f7d01188de4258119f63040fd8fc87ca py3k
+87680 80600c0c33b78b1dc85d71e8a2da02204c274a4b py3k
+87681 f5b105c9f46bf6f2abc37ce14a67ce5c2eb03bfa py3k
+87682 ba16ff86d4f6cd1596da260bd3b3a1789bfdd5d4 py3k
+87683 dba9b9c7a2db76f84770ac213f6d9386aa654103 py3k
+87684 6cb7ed7b6697e5352a3ff4ee441c0457e8ec19e8 py3k
+87685 948692712fd710d4c3118f120a2beebbea996a09 py3k
+87686 931d2320f56a07b471dd463384f035760d697567 py3k
+87687 4c46f6632ddf97764bed042e470c8a9b09830e8f py3k
+87688 77483f3e491a79360c009dbc4cd456cafe3eaaa1 py3k
+87689 c417d805768274097cd35c9b0f001f3ab0c8cbf3 py3k
+87690 747c55a94cb0e5e518dfe6686c6a217fb1f6acf7 release31-maint
+87691 6b7d9f1c2ce51a84cf0a23268dc4af8084701f9e py3k
+87692 245359382b0fad3e4328c7bdb50dc530adba6ecd release27-maint
+87693 feb23e24dcb5c70f33110799cf7296a2d41a76d0 release31-maint
+87694 a33e1f02091f8fa15e7b82b074eb2c959449e903 release27-maint
+87695 a66a6e42538fe40913f6563d2bced4afe7a972f5 py3k
+87696 e9a51d46357924431563a7a62e0948e36c34b9da release31-maint
+87697 a476eb087ee9768331e83a352480483557597abc release27-maint
+87698 8ac4bcca8e3161f2efb7bdaecc17e79f244bb1ae py3k
+87699 9aced5aed11af5ae17bc7f444b5b8c366d7ce722 release31-maint
+87700 b0b4414c0bdc21de4365247888087dd7311f609d release27-maint
+87701 78de3a7fb89634e296bc2574a5d2a5411e3bb2e6 release27-maint
+87702 275fb9849491fe15a7f20bc1bb7c6ec263f4e29f release31-maint
+87703 f498ea978c6fe0edc9da5ea88e99c40f8b98e442 py3k
+87704 611567ec4d7b715cb8068c009242fdb8d73441b7 py3k
+87705 8c18992d3750ac23dab7901c66c517c184adbf51 py3k
+87706 f60a899a204e5b28edcc6eeb41377b7c3d4b21f3 release31-maint
+87707 4094bc13acfcc4130f3c2496381431813d628dc9 release27-maint
+87708 9f49ee5239756109802ee7432f607e50fd12088e release31-maint
+87709 5bcf108a3f5dff27da210788ec33b69e55b02bc0 release27-maint
+87710 6e5aada4fdd5f1768862beb4bf70513e425a05ac py3k
+87711 5011870ec86bd4f18b2544be4b6a26537b52aa21 py3k
+87712 a7c499266a9fe0251b6e718f8f8aacddfe3489ca py3k
+87713 8f509c5260a98ac398eae8582f1357f16db1ea21 py3k
+87714 893273d793c6ef51c5529c80e2b782b924032035 py3k
+87715 731dec4e75138164ad9c8b3ddd0a810302d63864 release27-maint
+87716 9ad896426f796418013baf359aea4f80cfceef73 py3k
+87717 70bea2dadef8a714d2b3a7d3fcf6564e0d7f6b94 py3k
+87718 8b848d3c6ad014450899fecd0f8ce2a471c15cdc py3k
+87719 d36e345a1a3cecbe9ddf8f66000fd0f12c34b379 py3k
+87720 f0eb3448ce38459293407c3fa0c94428d79d89c1 py3k
+87721 9cd83c658ba4620bf32338bc6fa967fb14add2f7 py3k
+87722 374dc910db33ad68c073889f7a956dd48ced07e7 py3k
+87723 18dbc3ba16c0eafd80c672f378a67c47f2feb13d release27-maint
+87724 c007c3dbbd3fbd9ee3bd5b84cc6c76fef1e96b86 release31-maint
+87726 ad2f34380aac8678474bd653ce1396bcebdc6c5c release31-maint
+87727 3e1c3d2a86890705f1372769045ad6a9bbd34462 release27-maint
+87728 f78e7db1d5e864ece799d9e7e1957973611a12e6 py3k
+87729 4549426ee4d652ebc85dbfcac0d20365013068c5 py3k
+87730 f4a808f5a66d1ceddce44351837038c7fe6cf0c0 py3k
+87731 a7d15df7d67d3f0f1131fe48c08ebded8d07f5cb py3k
+87732 98c8aa237fc1cc1398e2d8d5701d8516014aedbb py3k
+87733 3bf4d9f1660a4c1dcea535b9444e6492cd69243e py3k
+87734 cd27982087eac4bb2418e5930bb5a700c7c30bee py3k
+87735 8aa8dca46684b54fbcddee579df7a1e68fbba691 py3k
+87736 1e62a0cee0922c3f9fb837c519f8a39338e3a37a py3k
+87737 642c8806830f5fb42024101d1a81729ebd687c71 py3k
+87738 20043da78726a394a2b2b6d2a3050f62a5851b03 py3k
+87739 629eb3b69909f1ccb6f1e0aaded3fa49b504aa6d py3k
+87740 3478d007df23722df9fd37fb2e7f45ce064cb57b py3k
+87741 a3b7c290754a0a152381a8ca813cbef974896a40 release31-maint
+87742 a6bc497b196243ced8e32011101a9c5c4e7d8370 release27-maint
+87743 7c5c37b962816b78754e905ca9dfd3eb75917f73 release27-maint
+87744 8af6e8fc0205bccc658027d1ef3793ce76268bcb py3k
+87745 4557d495a4846c3e5225f5fd5a0c6a548a99e245 release31-maint
+87746 08192265d172c4c1089747b6c0812923d2473c8e py3k
+87747 c0fef8a144fad98de8ed6ae0d290d352405b132c py3k
+87748 efcb14f94e76913bdfc1613e7698728af392618a py3k
+87749 dd3f28ffd029089d08d1f16f3528f6cd0b589844 py3k
+87750 49789a52a9762444336d482c28eb36906c369cb8 py3k
+87751 0effb175c9819b9442e250c64ccc985e71e7403a release31-maint
+87752 85fbd775534eb7d80836ac8bf54c995811d5e1de release27-maint
+87753 a0d4eda8da0af0fe8c041666942c21a5efae2fa0 py3k
+87754 4cc47a9083e389996ffad4e9b6b39628bb2f1682 py3k
+87755 4a82be47a9481b1c03bb951ae8e8c68c5e9a01e2 py3k
+87756 de862dc0cccaf69121e1e8e748469430e0f00e4b py3k
+87757 2961af80d54558b67ec4b35c763f7f30ddbbca14 py3k
+87758 5060a92a8597e50eee398a17c0e4958d543bc9df py3k
+87759 e9348d68cfcd0008e9d8856869201416102b2424 py3k
+87760 c0425b5ede47ad6f2a7d11b4203516fddfd073e7 py3k
+87761 a44badf9e00f63d3dc5df9e9d7061015be5fc4dd py3k
+87762 bc57fdd89562b1723198700d18a4aa09401702ff py3k
+87763 799cd15231117f933990053a0d6fbd413bc17fe4 release31-maint
+87764 b7426be6bbb4ca1f38faca7915ce2d8837145fef release27-maint
+87765 745225ae29ef081bfed60e1b756a5d1ef35a4c22 py3k
+87766 912fd20de0e0720cb044fe47ebe30f27cc936f2c py3k
+87767 132374d537e4d10d76d6ffe768f3e842cb43188f py3k
+87768 ed02592306112a0ce2d702328188837073548e3d py3k
+87769 bdb57f463c85fb54f3f9d2d12e0f74773f4e97e7 py3k
+87770 4bf3a5a041209379f77ad771a90353d484458aa5 release31-maint
+87771 0762898fd80286e87ff9daa1d0269d29d1ee03c4 py3k
+87772 8f53a4e896313c56dfe75f21485e6b58cc805930 py3k
+87773 de38794d174989a39ed5ef21865f269a9ccd9d11 py3k
+87774 f06c278b4f2123ebbef7fc1a44d91d410a85e3e7 py3k
+87775 58b784553ca4f5a842ef2e8d2c914ab723079fa1 py3k
+87776 92f61a692e394131adb35a30d466a99cd0971836 py3k
+87777 510f7e29e72817ee1f6ad8948c1dbbbf36a54f5d py3k
+87778 20e3af1d530a8fb3992c73c1d692f4758b73a989 py3k
+87779 cf9e1f7464dc58ece9a772ddefac639908f9307b py3k
+87780 92f2d7d28feedb320d6a5a1ee44f1fbff888fe47 py3k
+87781 34d891580f38d456f0235006846c8bbc434751cf py3k
+87782 247b7ba6ffad448918907b4b7d0114ddca6a822d py3k
+87783 8c448a4277a0d4fb9a65ca5cf8b867f486ae6906 py3k
+87784 abb686a5a1dfcd6c02ff457a3f22722acbb58b4e py3k
+87785 c9b484f2a0b7074957ec26859b1599c7c5255f35 release31-maint
+87786 71e1a996183619a3a262305b48fcde3c1ea4dfd3 py3k
+87787 3d824b5137ddb133dfe57a586f570a06536deaf3 py3k
+87788 d824e9cfbee86df0a5b3519a2fe6fb76e3727270 py3k
+87789 a3288a4e2ead9ad10376d3bca41f23fc2559ff0f py3k
+87790 142288089c1a4656a1a2d962d9c8eb8e3f1f2212 py3k
+87791 5d666854842842f91caaa359c218e72ba31e0371 py3k
+87792 ccbc84222fda58a3606ccfb949cc1d247b5f429c py3k
+87793 1774d6a2f5bfef8f1e6b41459b154886cf75f39f release31-maint
+87794 26836e47dfb91c471b6a191f56d5d84c4e4b6b11 release27-maint
+87795 d2a64612d235b6ef242ed9ac3fe3d7b27d5280d2 py3k
+87796 64c245313cff9fdd46e54dcd3c5b3998244f4019 py3k
+87797 a4cfb27824164afd1ccb255c727008a4a01d4aa4 py3k
+87798 591922299acc1118ad033a7ab8841fff1697807f release31-maint
+87799 b332e73b556707c4a1088b0089d03e67162c8c15 release27-maint
+87800 7e7fc94fd0d414fbec233e7a24b5266b6fbf3398 release31-maint
+87801 419ca089d365f3014a4e02b50a94ef30f765d721 release27-maint
+87802 6a1d080623d77b825c1de77299f386833b6c35d0 py3k
+87803 7222697964fc744399c8ee118bb3948ad15dd1da release31-maint
+87804 c7fd9b6aa002ee301ce3ff9e8e7c16f2eeda0bfb release27-maint
+87805 8a302a09ee83a76905eed2e057fffe8b90a6b032 py3k
+87806 020da9b87daa891334bb78438a104f0aad3ed727 py3k
+87807 1d4dc9df24967282356fb968ea48400d67246c84 py3k
+87808 01b253331a86e0680b7d4b7fb4a68823a8729b46 py3k
+87810 7ba5f57c74e57628ca41cf55f630d942cfb191b9 py3k
+87811 7e5777e1f0fda3f136c9c146e930bc2dbb30a29f py3k
+87812 12cc81062d4a84f670b8ba883d46e893a0259c83 py3k
+87813 43c8c1bdd94fd8aefe9885e321c11f861074add7 py3k
+87820 83d3d5e0687efe4d11887e0bead39bb7a145bb4a py3k
+87821 2ee6b444c93dee485011606034b9d79a040c0f10 py3k
+87822 5260fd12c763ddd3c9d323f5d3134953412b3469 py3k
+87823 0b0a2b6c3ad983577b84272dd5b6bc478e99a68c py3k
+87824 0933c3753a712b9f8af2d23e40ae0dda1f8ac254 py3k
+87825 14270fe84dc771f9ddf8675dda9b008364d410cb py3k
+87826 3ea280997001d423aa4a8f04fdd86c90ea944a87 py3k
+87827 377815985caf0d03c3e368b9b4903a4c3ce09ae9 py3k
+87828 5f8eb9e7acdc065ae3a006e1791feec7926583d6 py3k
+87829 12074f3ab8095f91a47368abad71d1f6fafc5a12 py3k
+87830 df9a0616004d92e97f871a8a95de397d0d90f59a py3k
+87831 133dee82a009616e1c0dccfa5dba8f92b1733893 py3k
+87832 3e75cf3f6355567dda86f0a667fa7772ad6e98fd py3k
+87833 66587e90fdfb627f88ab1ac7a29f3104da2a8fd4 py3k
+87834 f5950df03ce210c50ccd9651ea4c066cbbd94932 py3k
+87835 6a5711965571ab206b549ef4f00636690d461715 py3k
+87836 54fa6216585335b23ac54dc3beffadeb65b40e41 release31-maint
+87837 0de1905a761f87ad82345c66f4ae32ccb357ef89 release27-maint
+87838 080a0e96b482b13c0887ce2eb629a70777a44db6 py3k
+87839 b0b79c3734acdfaf9ff43e75fe39a900e6ed2879 py3k
+87840 cad1811d9e13e9fe815d147878eec306047fac1e py3k
+87841 397b99f5912e76b6c57511ff987d51939bf733de release31-maint
+87842 631e830016c0e74f5d934ad35f07fb4a7cb8b535 release27-maint
+87843 31465968ae2635c65f707ee825fd1d142ad2164d py3k
+87844 c6b8c5b564a8c4486267b289b5392b354125d71d py3k
+87845 8757cd65929194a4b4c80ac0cf3d08f86658fbaf py3k
+87846 253d91e4f6729144256896f0cc0696c515ec2540 py3k
+87847 3b79ec83ce21666f4b5065a775c8991d4eaf39c0 py3k
+87848 e480604767c4d3137822782609205bec44157dca py3k
+87849 15967b7f058f1b782a9d0b61ffab4ab21eb9a48a py3k
+87850 0e1f4df478f668a74db17dd5b7e55bf7550cca44 py3k
+87853 6492a713887e8d9350cd063e8c4dcc3931f5a024 py3k
+87856 dc9a56dda4287f7760866431d2b21a6984222ad7 py3k
+87857 90cba6a672f0e9bd7c3b6a54bf5cb99c6628f6f9 release31-maint
+87858 d6566a70caa0a84b4f217a2a7e7f204637567894 py3k
+87859 8239ec6f39e625510897e937e9dfe55dc0fcfbb3 py3k
+87860 c03f64c71b05ace0ecbc5d2e767fe6cb28f509c8 py3k
+87861 09323c91109d2fce1e5705538404765ebe55e4d6 py3k
+87862 c6d4534562f40a1272dccce811d3a6522ab60e72 py3k
+87863 f12da53b8d6830567eb5be7829cdb9cfd1547bc2 py3k
+87864 abe201dfd3dce2fb711889ecdadd6d643ce3eda4 release31-maint
+87865 075974a90c31b0c7ee05e26d82653d545824109b py3k
+87866 4d1927091b39f79fa04b05230bb2902a9fa9fe21 release27-maint
+87867 ea0b94d4754d755befa48756e80ac21cd36fbe3f py3k
+87868 20517aa3a3589ac6089a8f81ab10d1e7592db2b9 py3k
+87869 7263bd90e110d466a44d2c8f12aa74d3a042c543 py3k
+87870 3ed3c7c6b605d78070e0ba15293d4247c3e54175 py3k
+87871 1f71c43ad7e338ff30e5f73e093afb8bbecc5e92 py3k
+87872 615778be98e99525e7dfe27120cde0f21589393d release27-maint
+87873 8bbff1c24a312a0bf7338438eb967d3bd62a0b24 py3k
+87874 966b87f2395cc9c72b69f3da94a19cf59b07fee9 release31-maint
+87875 adc7e1671d8c395a2b8885630e244a8d8e71c3ff release27-maint
+87876 9f13dc439dc51c6955d22fbae2eaac84527d8a2a py3k
+87877 19c05051bf1a02d20f8d210be6055279ad490608 py3k
+87878 9b2e60ae4fef97db30d7372fa1c6ef2e5aaa362e release27-maint
+87879 7ec21653a4d1e572e67e85c3494f96debd7f49df release27-maint
+87880 95301a42852f5425e9ae10d9a81bcaf1194128f3 release27-maint
+87881 2e74369b4f4060ac6779c628f3ec0ec3bccc8f1a release31-maint
+87882 0c94c681fc5320dc280881323487d46b9a0c41b9 release27-maint
+87883 e4d07a6f7abfc16619fa589311cccc9ab5fe6a8f release27-maint
+87884 5ab96364e761900d4532a71e78d942c4df90bbb6 release31-maint
+87885 de762b01c3664b4947ca38235eb9b561a2099e3a release31-maint
+87886 58a1b7e8e7532369d0fc5f99ebc13f7f1d663f34 release27-maint
+87887 5f77907b0041e7e12a914ff9bbf56f54937cb113 release31-maint
+87888 4ad6196f30a5b2208afa7692e897d32e4ab540a6 release27-maint
+87889 e1b80e39e40f30c32750a2b29176f05f7c57ff52 release27-maint
+87890 b33bf664c48aa495e8eb97237bb2b7620edb4a31 py3k
+87891 1571cc072fc2ae308e79993476d2bdaf84aa1755 py3k
+87892 681d0542bbbd07e64289e39c7053739d06f3bd08 release27-maint
+87893 ffb2c24bcb626dd8e12e8f3349a09a2991c93404 release31-maint
+87894 4bd296c49526f63503561b24b772c6140cb53c58 release27-maint
+87895 a22d61be4842b40c745479f09dba3e9dc9e420a8 py3k
+87896 fe6fcaf7bb17da4ff05954cac6b97f1573523355 py3k
+87897 f8c683184affdb7fffbbcb5bfe4192d593c48f89 py3k
+87898 974b27c9d849df4c9d5a2316698bdfff4058888a py3k
+87899 1a37f4ba1f920183fe821672a473f183a87d3dd7 py3k
+87900 c2c4a9944596f4c136e0487dd3d3ee3cf873fb71 py3k
+87901 c4a52526e77fa64216db34bc037cb877b9b2346f py3k
+87902 b5a79b5ca20372a6017b4aabaf5f714f93cac5fa py3k
+87903 3c12ab9e214e9ecd5140e2122437b2b9826750b4 py3k
+87904 ea3ac62efe67cd4cdf7fa275c8b0f47ff34b5c36 py3k
+87905 a2b161f175252fde7d14fbcfecd1e97f0051f83e release31-maint
+87906 567d961be083c574ea634d915c0d191dbec8b0e4 py3k
+87907 ec58890975f1d2f0cbfc9abfebf16dbeb20cbf68 py3k
+87908 9855c8cccb36c0e04ad1954d20e77ea48c7c06fa py3k
+87909 db7a32d90cf4a2d9358b70cf34e9d6cd4fe33c84 release27-maint
+87910 3e6de8851f2310165f79d1eb340bd05d6211d97f py3k
+87911 1450521b9d93f4ac0e5eaa62df11cfd8a3107a10 py3k
+87912 e0a66aa3427a6969b3ca8311d0bb8375dd4ea246 py3k
+87913 e47d8d955bd61083df19c31dbb36b206938480c3 release31-maint
+87914 ae994bd466178c92e893fd4435fd0ac3ad68fe9b py3k
+87915 65add7a40f7022f29c4905b3601d12829f2b6b47 py3k
+87916 edf301af261613add0b739d395c71b655af86917 py3k
+87917 ac6cc1404e15057440ecea806c7fa007f97e5800 py3k
+87918 1c65ab44d3671b3d48fca41b627a1545e170ba14 release27-maint
+87919 d70522cc9d4fe7a642e1d573f197bd70c01c14c3 py3k
+87920 ad0eb57eb2b5b876d97a07351e59d2a8bf1119cd py3k
+87921 c0f3ac19392b6193438f8fefcc415be058c10627 py3k
+87922 b16b0d754fc93a57eac6d91016f0e8feb86cd126 py3k
+87924 d573971311242ae882bc0ab9e0595608467e2b3d py3k
+87925 db8d15933121c27fb60ef7d9fa4b41c282e9f209 py3k
+87926 78ff08ccd18b7fdba9d1fc91eb444e2507df03f4 py3k
+87927 751372b79ed6925a7714c455d2f67b35bd231b77 release31-maint
+87928 20969821bb614a3ab976252de30792827298d295 release27-maint
+87929 7b51594a15ded158d4bb274385eebc2c9f36e86e py3k-cdecimal
+87930 ed6d053eeba5eb672e889dc88953a36c810a2485 py3k-cdecimal
+87931 9fa07e7cdf3862af507f3395feeb5a30224c1b0e py3k-cdecimal
+87932 4b469c87d7e2ea8133522439fe11b92478c38472 py3k-cdecimal
+87933 830952a71d2177d81a4adefa33b66c79fb45941d py3k-cdecimal
+87934 048ad0717a45229af30b78bc97da4a084b9733ad release31-maint
+87935 f827f703ef65c0e403c2ea8cd589d22d7d36ae2e release27-maint
+87936 a3c37958a20948dc58a1d20e379471ef54c344b5 py3k-cdecimal
+87937 707f8927d663060b7c2ec7d6a12e22cfa292167f py3k-cdecimal
+87938 2244ac6c2a9bfbfd3fc6d318e4306e5316fa5d8c py3k
+87939 54c8644453f9134dc1b85dec5f2a70e1d3954f08 py3k
+87940 c0b95cdaf460a2a8233faaff9078640f28e28fff py3k
+87941 cb754a582b340c59019c4d430430782e7eae7eeb py3k
+87942 2581a17b29af03319225b03b87b0043b1debe04b py3k
+87943 df34bb0869bc852d4b4fd07ce267b1ca77044531 py3k
+87944 ec96b5b5723bcf43267501245c47c98be9cf7419 release27-maint
+87945 1b1a642971497ad0ce580d671af83177fc629fca release27-maint
+87946 7f0d0c9a2d729399c2f28cc39028cc5290fcad66 py3k
+87947 269cf46c09af5b8337b90217b226902464ab29b4 py3k
+87948 fef521f45af3a90a68b6740971533d51a7837dd1 py3k
+87949 49b0b2bc0e8331bdf9e420bdaf32f81bdf1b6d8f py3k
+87950 4350721dee553f3cc615ffb4643e72d211c20ae5 release27-maint
+87951 6009388ca5a23ffcab76215bf3f9ba1c98a21c11 release31-maint
+87952 74bf93be567102d118f43428334fca95e3147a2e py3k
+87953 601bcb6ff752d75c702f1bceb2480d1703b6a7f1 py3k
+87954 236e11ba18c57396d572e4b82e4a571ef8f936f3 py3k
+87955 2ea1cfdf929bee09386e563c0c241140407056f0 release31-maint
+87956 ddaa17c098d93dedc67cb76af607f82355941ae3 release27-maint
+87957 91446817cc3e8e73fce40a793d750dc260e508fb py3k
+87958 a50214966d2482ea6eeae27f6ecb2a074b16c0f7 py3k
+87959 77fe3f16087af9f1c735e61a8aed1014de6dea3f release31-maint
+87960 aeccbd16970f8f65a22f6a57ef098ee30e8d942c py3k
+87961 e15260a44e4478fa46df70c2ec7920b03daa3aff release27-maint
+87962 5048b27200d74a1075cfe5cbe3e075e52eeeaea0 release27-maint
+87963 6cc5277f5e7aa333521ec7456fe15b3e6aef7af0 release31-maint
+87964 ac0eb5df2c05bec18e3a977c2c9c208a58ac6d09 release27-maint
+87965 d120218d80ab43b4c7ee92a25baaf3febd3f21d7 release31-maint
+87966 3eeaecf005c14d38c4f7d205a359db1ef69c432c py3k
+87967 6dcd491506ed50533188472a5959b3d82b7e142c release31-maint
+87968 b9b551ed0858d2b7db1433b031e815d442127028 py3k
+87969 45a391cdc68ac28dcd3d4abf8a2a0f2369fa3f1a py3k
+87970 4abfb7670eadda907bd61e22e1521970233621f8 release31-maint
+87971 41bdc032e71acd7f445554a511eaa9f5cb06606f py3k
+87972 e1cc35728481eedd4b753e60ab71af02e73909e9 py3k
+87973 4e86d695ba98a58229de482e352d0b683f96e1a2 py3k
+87974 c669a6976bf8cf2b7a74736105e552eb4ab025ef py3k
+87975 ccbd6587f8ed5c8722d047225ba3c01e1670bdbf py3k
+87978 f916c2aa238fe8a20ce658a2b9faa085ad03469c py3k
+87979 efdf25617b7cd427ea47b894bec3b8ac2ae9e549 release31-maint
+87980 e125d92f7438e12fff8f3cd3dc6598c73c180501 py3k
+87981 8719dd712384db5969a5293ed2a4dc1973e43fcc py3k
+87982 10d67db679420f4e753795cb426195a46ded0fbc py3k
+87983 cbdc8b1e6bd39ca1c5a9b4c0c7969163c03bb7ef py3k
+87984 4eae33f3797c5d1cd22e69d49841feb7cfe87739 py3k
+87985 25d53e4497d8527d89e2600b7d85d79f0d9a13ee release27-maint
+87986 2f0894c02bf2b88ca022f19a3e92dce8ef82b807 py3k
+87988 7cbb5f3b6954b9ac2f25b298a51a6b004b64fa5f py3k
+87989 7d658b49b3e14e9b163ec2b3bc16d9491d145010 py3k
+87990 3ac9b7cf7614cde02f5ada05345b303b856ab770 py3k
+87991 608f3a6158a8c813378907532161eb1555819a8b py3k
+87992 474b2ce0794ffaffcae4e36dc51fd951f455a1b7 release27-maint
+87993 0353b1613aa814bc6c93e2449e22349be1288a40 py3k
+87994 f19824aab39c80bd46ceccf989ba1603cfa8c61d release31-maint
+87995 244a27477396d4a29804a4bfbaae1068c372f9b1 release31-maint
+87996 f6e9ac4b88136b38d947c1e6015ffa291af16aea py3k
+87997 7f8888b4fdfcafe9a3d00e82219a65c9e1fe737c py3k
+87998 d864328a74e4142aa286f822c4b827d1b70cd930 py3k
+87999 96ffe4a311dd4d5f0548c3bd05d4e33bee4cf36e py3k
+88000 3593b0d9caa74c9048b09d84e019d4175f00c026 py3k
+88001 febe04a6d4864dd88a882f17f33f0102b47f9623 py3k
+88002 4430e4d635947a2a14bd58b36444225881a5b218 release31-maint
+88003 18ab8e0e67025bc339bb42ddbf3be048932229a6 py3k
+88004 2afcdf68a3891f7952ba1c8e33334d379b64501e py3k
+88005 b04da544e13bbf543d7fcdf2fcb440056d683619 py3k
+88006 48454765d8e0ce6550a04c4d53ab37a28a97c868 py3k
+88007 911d0a74609e218020d3dfe2ed0a184c050c5508 py3k
+88008 7b2d7cedafb0a1162f0d25bfc8fb60cdf570c3e5 py3k
+88009 0b4c995299ddcedd1527a2cece2b907a26efb126 py3k
+88010 4dc5503731fea1767cd6cae8ed9a8c0f3ae39de4 release31-maint
+88011 2930393f0bbb91da5c4e60455a5e6dae41b83aa1 py3k
+88012 ae09945833451bb8cb5c7319ef1ae79f92f2e998 py3k
+88013 c0c594aef84235e700a2f32ac6f4929dbbbc43a1 py3k
+88014 3969a6ca16af29176c4865283b86f2e08de5d29d py3k
+88015 3f99c36d00b8ad5f27c569ec018672c16275715f py3k
+88016 93b7c0580c43469bfba17cf5118845d8c14a342e py3k
+88017 f130be01d2300d99432f3baeccef1f4baf791230 py3k
+88018 beeab0fa41e5eaff696aae59f232c6b47e00372c py3k
+88019 b03747ada44d6a802513612a2a49907e2b737614 release31-maint
+88020 ef0777af9978ee2b27f44b989f6acfef6f4c05b2 release27-maint
+88021 b8f97d8cd485f27ad35c33dbda84ad04f20eb022 py3k
+88022 3c316236eabd2aed77db59dd06f9748de92164a4 py3k
+88023 41d874ecbd81fb46617f78db015a54e0ffe879ae release31-maint
+88024 7acb839f36132eb48ac6e80f065ae37ca97bb7eb release27-maint
+88026 8ddcae2b64b471fd3eea70249c22af7342d22e1a py3k
+88028 4a20e3ca25e9ad781434cf81f5ac34f460858df3 py3k
+88032 9076e4220fa4f0d370e7074ee2027bbe01def959 py3k
+88033 e84d5efa6d754b13e467dc9b84086885f3c2ae85 py3k
+88035 ab9dc42547c098e347864f6a205b4a5966dbde11 py3k
+88036 865d5b24bf28ca41b536befc326407c03e74a4d5 py3k
+88037 fe1023af6b5969d4c514c42e91ecfcefc12be6aa release31-maint
+88038 ada702c04d14c374bef61f62f1dbbd56410dc68a release27-maint
+88039 42efc11ab782d0d1d02c58f87c62d159c7be999a py3k
+88040 8565e723b4a0ea3daa14b535ea245ae741ccfcdf py3k
+88041 fc1d159178955fc2196b1d82948ab8db1494d3cc py3k
+88042 b1104b425134c6e9dd1638ba4bdc46cc68c0651a py3k
+88043 9f282cfa89a2186a5e96b3f35e533797578f1f60 py3k
+88044 b7a97f11b41b376d941ab44d33b1bf48a4ca02f5 py3k
+88046 c91de326835e978fd95fe9e560bd0569535365be release27-maint
+88047 1f6e045e8a69bab5c55cf6e2e8bdbf66b77a032b py3k
+88048 d670482a5821175f9cf911723dd05435b1d21348 py3k
+88049 45da83327635fdbcd5c48453a128bcb151adf0e3 py3k
+88050 2cf67c6aa6ee68f0abe807a653d21dead0ef1d1f py3k
+88051 384737a74080e3e174b5e85c8fb650d5657a7625 py3k
+88052 4724b94c574568b6238bd750531a1298bd68b4d8 py3k
+88053 368e91031880200b084f3f616d8f1e2cbdffc62b py3k
+88054 aeefa221bbe652805f0f52f846143faa3919503b py3k
+88055 691bc2c2fc22d55ecdd55f2a04ac6beb6adbe67d py3k
+88056 525aeaa3d53f29fe50a4965d7872f17fd2c67afe py3k
+88057 faec1b5a96db744d76b99b1e12c856d0a76f805f py3k
+88058 36910851a715cfb5f554ee322460d713fa4af700 py3k
+88062 7b31beb88cdb2f1968304e028cd489c0cdfaecc3 release31-maint
+88063 3674dcb41a94f30c070e9efcdaab95989dfd700c py3k
+88064 dd87b0efcdd834a2e5bc4591041af62475161cad release27-maint
+88065 c59cea2185476735d0b7dec735a99b81f595f0fc release31-maint
+88066 df8b6a2bdddd72f8d40a826430111a9a6eaaadd3 py3k
+88067 811b4fb8f0cc69201a4b179d0cf271b8b0ac5d43 release31-maint
+88068 1f6d1418cc183167bbdaf6bc0b6a0c5fe80b9b76 release27-maint
+88069 a78c6d0c3f69cd9f763b217a0c33334ed147cc30 py3k
+88070 6e8e0fe18205f00a25269e1b87282d9e37267dfd release27-maint
+88071 b948dbd1fac1b4b7c6b411c1afc611a5c68a28cd release31-maint
+88072 cacc35a1e0c3d159de8314949c6d47f4ff7b80b0 py3k
+88073 d35a24a947178d493e437caad2ca0615057e12b5 py3k
+88074 4d275c58214b313291d29da3a8b52cc441ffe7da py3k
+88075 ede260a53fb50a87a9ff4e2cb273ad8bd9055546 py3k
+88076 295ff55a265e7b8714fb1050d37693cf9814e56f py3k
+88077 9a00de250e1e4982c2cd21200216c932ac2e85ce py3k
+88078 89628f3ecdcbb7b9afd1340d5e77ef00319f9c44 py3k
+88079 415173f87f45d821dc1329990c4e285a652186f2 py3k
+88080 6e68265389743b13ebd5aa3b3a9b093c384c7d74 py3k
+88081 fd8e80fc2d94364ed4e942627d4253df9802f665 release31-maint
+88082 6101629810e00dd2516373dcceab0887733ea9ad release27-maint
+88083 99eab5edf99dec72fc7d03976027dc583b2d624a py3k
+88084 57bd0d864cb037a147cc1e10fd4774e0e74be4d9 py3k
+88085 f5a3b6397a538d810229c36c4f9144092cdbf00a py3k
+88088 ed8f058dc64b075cf56e2796830216f54daa253b release31-maint
+88089 52e802914cf89620c8ea786662232c4d44dd1ac3 release27-maint
+88090 2d42f64b28fdef21cb8a599310c6459c4a4e2fbf release27-maint
+88091 34d48848d41bc811b3622fccafd2d1f7bfc7cbb7 release31-maint
+88092 f441c6e3a769129c11804c7ee8347efa25755230 py3k
+88093 4e0bcec809dd8094b99f1f51727d00d4276a6ea0 py3k
+88094 761e9ad165ef1fc19bd3f5ec3fd4e2880b1e3f7d py3k
+88097 fc5d02ae52dd6bd8275203d572ff548506f75395 py3k
+88098 2fde5abfb5f1b7fba0f179dc32d384322566cc0a release31-maint
+88099 eac5457ff195b08ef7544099b31c54c3b233ed6f release27-maint
+88100 496ea5028c01ac5d72821753411fd70435bc3b69 py3k
+88101 3824bef376cc7feacf308809d42d7884182b71a7 py3k
+88102 109af039f44f0d5966272aa56d31a1061cd3b874 py3k
+88103 cc8975724f9a8bf48a5b3ee422a0694295d40716 py3k
+88104 d7058f74bd04b4fa6fd5a8f6d7cc3d9e477f6379 py3k
+88105 41c51f5cf5d99480062d50070217800be08168bb py3k
+88106 a7aa8373b5fcb5204a71f896b8d1a112b05109ef py3k
+88107 3c1c8d426966301abeee38717f92d15d7f8e52de py3k
+88108 991470be0340be0c6badd6f02fc0224e9c6b2a52 py3k
+88109 de925361eba5116769dce35e16f2af94dbe0bac4 py3k
+88111 91abe855072a366d2d8818c0502877336d6dd3c3 py3k
+88112 07e1eb244df88b36800f2ba687a2822e673c6482 release31-maint
+88113 02ec1997d75e87cc5b98f38b14da6877e3320f9d release27-maint
+88114 c35400c36304e897a840e48b229f35c73afc5a38 py3k
+88115 a925ea4e105f814ffafc9fd9f314b91fbf374de3 py3k
+88116 b880c8227c0272c2d219c1b769fa40311aa81e20 release27-maint
+88117 233cc740274b7126b47fae7895b44a024f54b3ae py3k
+88118 e4e4bfc09e18db3cfcc49a5b0b296eb904c7f0eb py3k
+88119 6b8b6e5aec0a5f448d6851a4bcd93d10925d4482 py3k
+88120 7f7c2aab861c11a840f44ba41f368dff02948a5f py3k
+88121 da44bb0cd4e992d876819ff77a2e1d23d4f0c625 py3k
+88122 fbebf0f060579809b3fb23e11f86b7617bd91ee7 py3k
+88125 3b3c53630637a5a3b748daa21a9bbe9f50b2e2ad py3k
+88126 aef482420e96ccba38fe80729db4e8fb8a6a3916 py3k
+88127 ce40754a842a3db51c1c62485017284e1253d47d py3k
+88128 3d33f41e818dbf1ce6ac8d01f0ab6c9fb85a27b2 py3k
+88129 93e98d40f2a5a5499d12d232d0b540b358ddee4b py3k
+88130 5e70eee86c6130b1bd2176a53028b0687c1be7ef py3k
+88131 c8396d27f56e8d659ed92834f43e853266cae2f3 py3k
+88132 f36538ba90a8fa30a0ec81939f98863249aa4882 release31-maint
+88133 df91a018de3ab5058cca0613e6e3a32265ea6fac release27-maint
+88134 fb668aaa2fa4f0d75ca8a8855b5f80a8f885a589 py3k
+88135 e4e32c4ff62627a3e5c0b6416d923bb0e945ed86 py3k
+88136 cc2162708bf62b5bf75ac1400aaa6a71a018e94c py3k
+88137 8e0b617c6c2216d349d81894f036ce4d384bb44a py3k
+88138 1648011c65da9a0c26dbbf467d415a64de940dae release31-maint
+88139 24161cf405f4c2237430b7fe96a097857d4aaed2 release31-maint
+88139 de8db7aaf7a296057ae26125b99618c961b4fef6 release27-maint
+88139 c40817c95514b1471db2670e3474748ec84390ba py3k
+88140 b968053afad0dc51e8b087e59ff11e594986381c py3k
+88141 788b01b5a74ea17c60f77d6b2d1e9fa80f5b578e py3k
+88142 30c91342b6ae6365b733b13360721dd94b072d77 py3k
+88143 b3cadf5cf7426c5b27820e4f7789790bdc5b0010 py3k
+88144 08673e5f549a27cc71581e6799ef7d0d6abf6c13 py3k
+88145 baa922b46237db2b29a2840314dd06c371e13956 py3k
+88146 4f7f3995194a1c8b03d438631bd68aca4e13810e py3k
+88147 4c4abfb884fb48fe15ccd6ac6eba59ee8fd52d23 py3k
+88148 bcf030f73eeeb4157cd9df8f2350a7ed50b37f39 release31-maint
+88149 b8c0ca35979a2cde8c1f87ffe4250d3d874d56de py3k
+88150 431ddcdb43106ad9b6beb38a64b6d9f30fd106b7 py3k
+88151 fc2ade88ab4179fb8c1ed3989eacad70a000c56b py3k
+88152 d1c06306c19be82be39b24bb6fcf6d5ebc91b359 py3k
+88153 a0a5c5d9aa4fdf1f164427d01f9a2c70677bfbc1 py3k
+88154 3bb21df64aa512015eb4bc46918e59b1cd4cea00 py3k
+88155 4063e526982f26ba02c263a2be7debc88ea6654d py3k
+88156 6f40b4709e9a52fd8eca64a17bc0b412e327ec70 py3k
+88157 5a65ec28771374596f2ee4cfb0239ec3266cc23b py3k
+88158 dd27df8d14efc197feb179988959a52930bda5f9 py3k
+88159 2de699e5f8f31a5321e20781812dc418c643c9dc py3k
+88160 90a2d9b702bcbaafba9cad777216aba1d5e7ecfa py3k
+88161 f3bfeb2fbcfb06d5f3beb28014cf499cda1dd4cc py3k
+88162 03e2a87557090aa52ba028b4dbb66bf743e235fd py3k
+88163 c175f5dff39604bd907e4528e7b4cd840fc4d75c py3k
+88164 825ebadebf9ba292185ed6edd348b353372406c7 py3k
+88165 1e3f169b9e46ae4e1ba831229192bc5cacc6dbf5 py3k
+88166 70919bad745841d0266c7abfb7c1ee6a238486e3 py3k
+88169 7f9a98f766d75c9b59448902cdf5491cd45baadc release27-maint
+88170 473e436839ee6391e2c57066e1cd51deb9c3ee7a py3k
+88171 8a30a2cb4b9e3472d892dba36d8dd0d90ba25e8f py3k
+88172 598c195e52f36086fe939028dce71c48fff12322 py3k
+88173 3b93d0099ced07c7a5cbd4aa8a9eadd0378984e9 release31-maint
+88174 b0225957e0065995fb21a78a2a303163a0408519 py3k
+88175 93a41df8c7378cfab6f768856c98e2fbd2ccaaf1 release27-maint
+88176 0b5298e7b2d5405bd72379ed66b368328898871c py3k
+88177 eb4ba03d7c4df323223c76bbc61d2c81c1c542bb release31-maint
+88178 0d6eccf00b5bd67d1c2099ecfb7e380937096423 py3k
+88179 71281017c43fc43ffb177d2ad81f05e6ce3fa1b3 py3k
+88180 fae19e5517b65be2bf3073d33750381720d60e3e py3k
+88181 03220ed48bcae0de0fccdcbc0ad8c68a5b0cd879 py3k
+88182 c2bd692078d20e73ae4196d2e481e2ccb874b48e py3k
+88183 32c896688c91d068a863b763d2e377835dc4bc90 py3k
+88184 08f32d11b7efba25455dc0d69972d976f06b9cfc py3k
+88185 89a3f6c12f0212dd61ff5ae009c23a26fefd3792 py3k
+88186 757a9b1836b19f2b67f6afb6b13daa6fd0940997 py3k
+88187 00753d04bbbfb33d585a1d167bb9dd00ae02edd6 py3k
+88188 3cabce0b6cafcacc9018fa5dfafca3e0bc2b804c py3k
+88189 219754e9c39c2fa0628040c9f2a75a233b69238e test_subprocess_10826
+88190 705780ba9e3a053b5c8c52b376dc479d1cccfbfd test_subprocess_10826
+88191 776c3c294bb735c489c046b88f8875c0e4f4a7ae py3k
+88192 f6392c4ce61987777df7fc934fa0b89e5b3eb4c4 release27-maint
+88193 32fc1caffb17026fa85a7fc22e5d10a56d5e9b54 test_subprocess_10826
+88194 82b7f53c2acd4a93a7db3c6e44202c74c98ea0f3 test_subprocess_10826
+88196 f98ad65090295a54424d5b59e236670c4931872a py3k
+88197 65b097aeda8013ca7727c599a803343ef840070b py3k
+88198 7b30d9cfa0d9e51884b54f24adabced520dda5f5 py3k
+88199 48718b19c0dc082e0ae201bddc7180df8c7feffa py3k
+88200 bdf9864fd276085303a9a160fd4d96947d53b1c8 py3k
+88201 1f215fda23838ce37587781d9af1fd1137ae8901 py3k
+88202 a675a446862084397885d17a30618b03f3bd4f23 release27-maint
+88203 1d3be7b01d845ea64ec0f9340d2df842df17a045 py3k
+88204 8eaa32797f92e292e945d0c0de938e9204cd2670 py3k
+88205 ac47d11a8ca24d461f60a479bce0f71629b46ca6 release31-maint
+88206 44c1b56d7787d715223296437ec43619588579d8 release27-maint
+88207 8056176c053f05fc117ed9a52652999e49d1f043 py3k
+88208 279a0c959f7daef0b9c2613ee39dd2517fe09a2e release31-maint
+88209 591d54ffe969d7467cdc1018b8847ad0ad09aca9 py3k
+88210 f82a04cb150a2c068f159c9e39d720ca3061acc8 py3k
+88211 b0ab33522dda9f83cbae143dc99d07a3ac22099b py3k
+88212 0e30d413b9e97f46cca980d764da87fc528e3d77 py3k
+88213 bac296680cf8467bcd2d917b6a9c6dad9d2b99cd py3k
+88214 b22cc7563b2882311bd9adea46e3978d3184463a release27-maint
+88214 fc2ab7cddcf0058a51f9152f8f19c030e03daff6 py3k
+88215 dd732867296831e03a1782201fcb30d48c17952e py3k
+88220 d21cb6a7a14ee9ac33a0327ca2a92d626465bf8f py3k
+88221 e7959309f59c65b4ea28636d7b2389cae23d744a py3k
+88222 e40643a3c31dfff3aba76efc65f7865dbdfa6e16 py3k
+88223 7c7ee4e11850d077f75576faf57b85ce7f84cf9e py3k
+88224 2db617e90ca0c120d3c3af70f02bcf70bada8c69 test_subprocess_10826
+88226 3ef865327d7b0580ec0b0214a12c8bd59958de49 py3k
+88228 852186e5ae2ac69e21d0421302498167c6071df4 py3k
+88229 cf7500f080fd3ac63e430c64f9372915481c2cdc release31-maint
+88230 d7cd1b62608b9831c541f440a60a2b396f52973a py3k
+88231 085e0dd63796b80d3f8dee7f90ed73dafd9b0966 py3k
+88232 5c51724bf41116a0832b0c3376dbfa8d212b4371 py3k
+88233 be11e5653fda9754fecb414b4168f34e728ca17c release31-maint
+88234 64713e31683f8b71e24b79cf987db9c031d55816 py3k
+88235 334812ba587422bdc4b890f79bd34c1785c53e74 py3k
+88236 6a1fb94647cb4ddfc8cfa9dd67d88f3874076335 py3k
+88237 2aad707eda6278a2a3c66569065ed414ab303138 release31-maint
+88238 f12fe685e44d28dc973c612d6eebad6600303a64 release27-maint
+88239 791f52fbe5e060afbde459d90ccc77c928447526 py3k
+88240 5f1ad65a1b84c777fd534139025e076545bda906 py3k
+88241 3c7772fffbad34a26302cd331246db955e445e54 release31-maint
+88242 c690609995a627627373d64fc8afd7793ce40d1c release31-maint
+88243 b0efb6f0fe943263f765e300ade011c0d8daf326 release27-maint
+88244 0c604e65429e32b82347d9731418575dfe2884f3 py3k
+88245 46f07dc437ffbd7925a531feee488790dc3f7ee3 py3k
+88246 8a19f6029ce597e2974a2e4bbf075b384509c9ab py3k
+88247 c82588ca3a7909dca7d6f901093ccb4c9f939281 py3k
+88248 d3b4fa2dd7288ec701152f7707751f24f00dd651 release27-maint
+88251 2c9372a1c685b5b90e4bcaa555b086fa61e1120c py3k
+88252 dc501efa05b4125bc5e5be63ce939bf21c3f5710 py3k
+88256 36eeb282cd844ea890d2187f3f1a4430d717937b py3k
+88258 bfa5835e10f0e7185ad74648b91d607d6d37b881 py3k
+88259 595c2b56681ebb76dda86f7031bb90852a26b111 py3k
+88261 dfbd9568f49cbe90173b663df0166ceb015dd406 py3k
+88263 2bef7ab6256b421244459dcacfaab53eca60bd8d py3k
+88264 93c4081dfd195cbdb07be8fe1825c321dc0a6004 py3k
+88265 26574b027042c88031a78a769ef8b5b6701b1ee4 py3k
+88266 acf3e24dd0d0dfd1e20c907d696d3da965a8f56f py3k
+88267 7c3dafbee9d0b6b1c11215a52c169c7683d0ccbe py3k
+88268 e82501812ae3d3165635d97f6f97a9f8f1dcf70f release27-maint
+88269 a9dddfbab24179c0b69eb08311cd6e7ae195b46e release31-maint
+88270 18207b9d9a60f815620be56e05ca0f5c9768d324 release27-maint
+88271 0f0c5f9ace9f3bb4b520bc4f44d943ede9c758b0 py3k
+88272 de6792bdd96593bd51e210b879792212a6a18800 py3k
+88273 086c2bcd8d74e6b447468f74635fae264ab6befe py3k
+88274 4a272225c3de71e61a07185e4403b924bf0b886a py3k
+88275 bc09db82a5d0f5436910e510f87872600113a374 py3k
+88276 02efdb9e09e90ec259003946d4f44fcc19ba1382 py3k
+88280 4f94873846a3fa5ff94ec2b579af9953b2350c40 py3k
+88281 0a9f680a2cf05c3baec4c69a4d67c0dcd1990b59 py3k
+88282 987e6615a0796ad9004fc1c3aa090146bea5b40c release31-maint
+88283 a6df3c3e374236124ff96890c763462d1c27a5bc release27-maint
+88284 31f40be922524c6293ed770662e570b0b0262f15 py3k
+88285 8fa73a0885c95e8e16f5da702ead0242cf7ac3a7 release31-maint
+88286 ca909438cf9f891bf0747444e4ffe639eb023f24 release27-maint
+88299 73c49579a487c4bd1b758d8c5ce288f14a143483 py3k
+88300 900fc1ee4487efe187800610f863c560b433fdef release31-maint
+88301 944adf7eda2ebb1ea6114b516bf6a12e9b91b1da py3k
+88302 9e65951266a20512950157eeea6ddb899ecbbf97 py3k
+88318 aa873004cea80de7adfbfb15c26e9300c9f68c9b release27-maint
+88319 773cb332cc63b6c6a7c5534c28061c4985840e39 release31-maint
+88320 d33903eb3388541faed7c43a9175d1084b08f3df release27-maint
+88321 17d6f165eae97f9b4ec6cd71f19e5b8cac08a53e release31-maint
+88322 5be701139089cf8f84f5922442e4de3252882588 py3k
+88323 8e9969418dbebcb8bbf449a656f439a3846ed947 release31-maint
+88324 b21786419bb833db13670102439531c1ed5801a2 release31-maint
+88325 782bf5f37acb06fed6f04bd1dc3f1fe76ebc397b release31-maint
+88326 2e3c5841a0a6640ee76441a66068d17d960b3060 release31-maint
+88327 a1d1bfc383efcf6e1d73e84b8653c085f815171b release31-maint
+88328 6270946115d0845c5f99bd357c6cb2f828d87a72 release27-maint
+88329 038643d39fc156df3b362faea550bb52c2fc001b py3k
+88330 4506495658631beb92f0c6168e7fc7b4bc90b1aa py3k
+88331 8cc10279ac7dd6e4675393ec83b8ac103c08429a py3k
+88332 e5668adc1ed9e6aba06df6985af539f82058d652 py3k
+88333 07746be0bbad47e66c1580c2a31c0121887f2a08 py3k
+88334 0bba533c0959f625400d5ee7782285dce0fd18d8 py3k
+88335 f902fc7793e12b48b60138c286e5acc3d9dda813 release31-maint
+88336 f22c99db8a4656ff560c9c6f27cddbefb723aabe release27-maint
+88337 ce8db485e26e43568ad38e63c8e4b6869e9e5d14 py3k
+88338 dc56c8271fa851fc70d49ac7167ec82d8175bf22 release27-maint
+88339 4355212fe2c430311a82b08b923305fe2da11d07 release31-maint
+88340 ccfb5ba50a44e9c1c074edb142f81742dd20562b py3k
+88341 5a50485a375f11c8e160e89b25057450379f83a5 py3k
+88342 bc685adbaa15ce162d461cc126537882fded3df5 py3k
+88343 460f2f1c5ec83fbc0dd6d9816a16aeb480828ae2 py3k
+88344 bb3f6d3cc0b3c37ddf1db9f834b895e4d3b0e3af py3k
+88345 5267e5263e477d4ff8665607aa5828cbbb2bfadc py3k
+88346 39b5fc6c792d4b5969dc88e01e19a96782bcf5c1 py3k
+88347 88d69c2f9efa32335e34df4094af7667e5c4afaf py3k
+88348 9b33d65cdae4aeb65cc28b82d30d19c60f445e05 py3k
+88349 8d25925910b10b556dc8f19cd9f7b40f3238f25e py3k
+88350 0da68e2e4d780b68bd5faf7b3d71b004d86a23e8 py3k
+88351 aca91c55f38d450fffde75e24af5ddca57faabc3 py3k
+88352 abab2c53f58fd337406b4ba01f046aefc336a2b4 py3k
+88353 405a44c6dcedb457c3d39d404399dfc5c9258002 release27-maint
+88354 b5e36a549c253791ea49c39cbba482b3a679949f release31-maint
+88355 8e20986b3d6e9b8ddcc6a5f24ca15f313e8ba907 py3k
+88356 516b9db6afe4af48c991674c0bd04e9157d88172 py3k
+88357 394cb02247fc36b9167c0620b492452d5295cfa3 py3k
+88358 b7b1dce3e77f29653efed13e4e10a17620ef4fcf py3k
+88359 d61ebfce18ed3ae12b8dded74dac251fcea65c53 py3k
+88360 1518b935de10e707305918bfbd60e6a9b708595f py3k
+88361 b5702b20b4760e591bd4076706fc9032ebf380cf py3k
+88362 b4c7d203c3d1430ccb7551d42c9c9d2f4f37cd88 py3k
+88363 3b9d7b84561839280d88ec11123e6d7183f1cac8 py3k
+88364 09f07c7dc3dc25de1589c3044bcd658b78050767 py3k
+88365 3e021366e51fac62aa54ecb9c81d7f5a27d71773 py3k
+88366 f1faec49350dcda6e89cad20c8f193d1de0ba748 py3k
+88367 bce758939d7993bc03a817f5ae914abcdd896f1f py3k
+88368 1d9c5a2aa694e7f2e525aeb4e1d45241e7c6d8b8 py3k
+88369 261367e9e6c1c8a1cd6b02c81d43047c3d0ff250 py3k
+88370 3411cc7f64df669c4a02bbd86de3e690e3cdbe13 py3k
+88371 9fdfc05efbb5bfcf7c7a554f1796948095fc508c py3k
+88372 946ece26a48f3bfe9ad8d5c142bfa255f37b4d9c release31-maint
+88373 68d617dd30cd39198eefdb000611c8fa232ceecf release27-maint
+88374 7c71b0a5a29014b9600f603c89dd8845f1e5b347 py3k
+88375 e9fb6d50459af5c5dae59b510ab159e1c908d99a py3k
+88376 bb757facbfa6112036d65c54fffc29116f5ecfe5 release27-maint
+88377 5742c79086a87980476a3d0654d8e1fd7aecd1e2 py3k
+88378 f52e35c75e33c6f8dd17d7b87f8d07e1b57ff7d0 release31-maint
+88381 d6966d9b7609fcc731b3f98f96840b4329371d31 py3k
+88382 dcf1791cb1767a516874893bee0a4bb30ec8a71c py3k
+88383 071d25afadaa896e971cecaf33a6c67374e09fa2 py3k
+88384 643ac946eff49f4755a1a12a2666479dac3868ca py3k
+88385 146e81e4e51e4a95475f71290c41027f8ceaf072 py3k
+88386 f5b889c36f990a6df8b0195e1aaa91a0c62f26a9 py3k
+88387 5dfe0c42ffe8d4229ddc5f12e5ea8c5b3dff2004 py3k
+88388 56e617c2b5e83ec170aa7115a3c4898a8f91c0ec py3k
+88389 72b42dc041f3ff5876b2c55964cebc76ecb764df py3k
+88390 037f16b02ca552c6fd6c892ffb6d60851b5d0f40 release31-maint
+88391 2b4822b7c424ec59837be61065bd81ebf38c3b77 release27-maint
+88392 d1b5d804d2a5452713771828029d8b5762606c69 release31-maint
+88393 8084c668b6377355584f8210c82b39c4cced2f89 release31-maint
+88394 b409d7ecb6657426246d941a838c1c9fcc71af4b py3k
+88395 12acaf7a4955dda50b338a085e1e33d7b2ed0f8d py3k
+88396 4d2a58918df158762fc55e0e18728b444919355f py3k
+88397 89d52effc30aa7d39c27ac0d859bf4be6ce8b13d release27-maint
+88398 d9b713e95f39e90d3a5a17130b5ae8a6451d6665 release27-maint
+88399 02b881326f6ed82c0e0969b75b5a62cf86b6e09e py3k
+88400 20d82873aa977a9f56f18ab00c536340dca6e1d9 py3k
+88401 06a657d1a3ac199f5d40a2a44975bc36a3b57082 py3k
+88402 c310d294fdde0fb07696736cfeca5e39679474e9 py3k
+88403 2cbe9d058f7e92b1db4c85d0a27359a3db1ba8a0 py3k
+88404 111577bf5ba8966f7bca98ed79cfe13590aea346 release31-maint
+88405 11c67a6084c8ed4f2f3111aad19e2ae050366dd8 release27-maint
+88406 bbaf9304a0d04a0cc4258f257351e081d2084830 release27-maint
+88407 f3ce4abbaaf85e8fb3deb058e20ab5c6344fcf7f py3k
+88408 883a023eb9433d62f0273c6a706fa9ce51f31a09 release27-maint
+88409 7d320820f462dd83b53f7422ae4d6f4cfd549910 release31-maint
+88410 ba95c0bdd8a8d78349e1096d484a2620bf84df76 release27-maint
+88411 106603ca53c37c0d5a822f081b40e1c9c52b2b16 py3k
+88412 6a543116bf17475c228e7604f05768e78216a219 py3k
+88413 18c1f52896501c7ee13b038454a39acb45a87979 py3k
+88414 93df95e403d1a486151f3e4a91d5d36067452aea py3k
+88418 b45f4f39f204d865c92dfc07b0d3234aa9057ef0 release31-maint
+88419 0885514d897c0c4b7cbe2ace3e424f8fd9c4adb7 release27-maint
+88420 5baac186f0c28bec5a3380ec206e426e230f3a34 py3k
+88421 03ec61e13460b271aa5f79dc64d4a9299782b0a8 py3k
+88422 d1d9d7e00b4a5a198882119fd138d26cd97c5df6 release27-maint
+88423 d8031ba38e16d3edc8ac3bb5abdadc6a74425536 py3k
+88424 43af9e36bdd58a2ba78d6b0de2ad470bcfb4f3ab py3k
+88425 2ee2c76082c8c6aef5e6255620da76713165ab0e release31-maint
+88426 9ff3b669548f832a929d8abab4516b12f04f57bf py3k
+88427 7a89f4a73d1afd66449dff7d0b5731c76dde4220 release27-maint
+88428 5e7dd657f9eb751f3b14e6eb5900638f5202eaa3 release31-maint
+88429 907f3879235a8d4aea61028a28a8e7c34fc01ff4 release27-maint
+88430 ad2f8c686e0855a722d3007359d231da051e2627 py3k
+88431 39cf20d5ad4c5ea5537a9f1cc305c53dd89ec932 py3k
+88432 6d39daededd5536e79fc56d7325f15c935d53eec py3k
+88434 6c1ca9deb42a95286bb27eb55b6ca4c42e5ca48e py3k
+88435 15a8e22c4101deda95aeaaad018163773c91e662 py3k
+88436 22d94f55b0c70342ab87df96bf79aca77f27fd4f release27-maint
+88438 92debdf981c5f3443e877f58b4861157b7cd2864 py3k
+88439 6cab9a99410503540fe21ddb9207df30aed7202a py3k
+88440 5af035589aa7772effd0427c674c29e9e2676a67 py3k
+88441 5e37669172c8d27834daf868e6df28ccd81a3081 py3k
+88442 101bc66951c7ca4e639bde869af415c347cffb93 py3k
+88443 788eafaef7dc4820db78cb49a57a0adf63fc50ce py3k
+88444 5900d948fe57a4399dc2ffec3ba1264b217d4e16 py3k
+88445 496ac4d1a9abb965c9e119e244e63c7db16d1848 py3k
+88446 a222a015e28d8ae9af3899258dc6c15c3d40add0 release32-maint
+88447 66381cec6c7325c30606734dd37665dd104d65eb py3k
+88448 203945060baff206a6a77c86baad88701ad44f78 py3k
+88449 0f52cfc91faec0899775487c2fdb0445d30cecf1 py3k
+88450 441907c0814e5c71e8ce44936498bfab730ed7bf release32-maint
+88451 a83cc961c43a2d3269bda4e73ceb98991ac34219 py3k
+88452 35c0e37fe950123f0bcec5c594f5545b9e6f6f89 release27-maint
+88453 aec9527f6223276996721958d8c1c3562d9a5a69 release27-maint
+88455 bf864395d1c88b1c32c2af95a88a84681658b483 release32-maint
+88456 7b011cf64f906c22fa8cae4cceb7584a8d84c255 py3k
+88457 371f04e1bd3f8b3e92bcc2de68b69d47b47eb0d5 release32-maint
+88458 7902f5be2c906bf0b76aa437d5706dac7bc14ad5 release32-maint
+88459 983630797338e2df7b0aebe0f33b41cb6ffbf5c4 py3k
+88460 51a080bacb2508d5460bac03d01b0cd7e4240bd1 py3k
+88461 da5dd3e23c870252089c0c4df3dc94d22ff8dafb release32-maint
+88462 6c1e05a4b541f1e201af349ee418154cb593cbdb release32-maint
+88463 27ea3ae362cd51ff6a2bb02db174229f83d3aa2d py3k
+88464 954cd5db51dc35ef43b8f43945cdd2fa881f5ef0 py3k
+88465 9f8146f45eae87c92895382a0ccd0067ffa5f085 py3k
+88466 a1f35c21a712c1185f5c0a323b50bc36839d51e9 py3k
+88467 614e32900ef7db86c6a0c8de1c087398d5265f6e py3k
+88468 eb8fc1ce1c81eb83fa76e2619b97aaba9be2a502 release32-maint
+88469 482587180255a51b0921645ee6841e36b48104a6 release32-maint
+88470 b17bba1c7303ce7e59dfbc278f64e55796732f40 py3k
+88471 450f8d51dda869b3f35829ec2556a1cabf749615 release32-maint
+88472 ff86a179bc13ca7135370b573a2fe5e3638598d7 release32-maint
+88473 1853989f74e76ab475cb2645467bcb9a88308a20 release32-maint
+88474 158d6def2ef87f3129ae0d41c6fd206a1bda3572 py3k
+88475 a036c30ab5ae4ac9d705bfe7f64ae3d61650c993 py3k
+88476 ab1664b298fcdb1f8e96c9b3f40ac97ef9160de1 py3k
+88477 00a4ffa72dbe3d1ea1d2d46f35269510479072e7 release32-maint
+88478 bb857d9c307120c5dfa2224461cb459c7775fd26 py3k
+88479 284026e00342d4aee3290c80ded2b1a617e4bb4e release27-maint
+88480 2b8e6a21aeaa1954b39dbfae321f9a43f2819eab py3k
+88481 ef28aad3bbae0f57f264a0abde5d54a8b617da71 py3k
+88482 b4c15d87094d9ea517dfdfcdd45dc58e8a710a89 issue10276-snowleopard
+88483 23de3aa722306d2bffeb0feca14575b11ca19377 issue10276-snowleopard
+88484 f5e9c17b85ad06b17bd5d31cf8815b0fd537310e py3k
+88485 c6060ef5c405146ced22bea48ddb2489e895ff4f release32-maint
+88486 41c5280330fd6242d71e3f0a9221e7728611522b py3k
+88487 4295e095ad4fb8e92bcf61e60a506e9df44a41db release32-maint
+88488 b55869598683fa9b5b7e049132a9034d07326e7c release27-maint
+88490 78660714f17a3557f8b5e417fabba22c743eede0 py3k
+88491 67ec26cc4b4f7e31d3c3cd484bfc727775cd77b9 py3k
+88492 ce20ac41e31fd940404cd08c6f832d986206dd40 py3k
+88493 fed768b71136183f6e242566f80afaea43db7e8d py3k
+88494 7f85fbc16caedd0838282f81cdb98d657410ce3b py3k
+88495 473d233a04781dff3792739f978d3440068ea67a release32-maint
+88496 ae186b3b2c556e1cb32b3c1e9867a0d5fe383235 py3k
+88497 19df47839bcab55f7f631936a1168b4d3d91cbce release32-maint
+88498 ea260d393cdee3c3e3614f957deb72dbd77fb070 py3k
+88499 c90e0e5b0d25471051e2ae6c132f454f743bdafe release32-maint
+88500 372b2ef0ff37b6a1aa12e430cb2dec999b64793c py3k
+88501 24339bf0c7e66a7ea1eca2a52c24f28fcad4fef5 py3k
+88502 30411af34eebfafa755fe338ff38e542d3702a5e release32-maint
+88503 5ce499180d245f80b66a057e8decb2a335ad1dc5 py3k
+88504 980697769866205d09d300201ff8525770487c3f release32-maint
+88505 247a2810932aa55c125c561065c2927434c40955 py3k
+88506 a7515a94fdb5b50589b23f121f60ed4a8def6c1c py3k
+88507 e2f96bd29252e621bb9e1563fbbb0eca8231de53 py3k
+88508 6482dd1c11ed1c1afb99d234e2830f34c9f34786 py3k
+88509 16ee42de0fab92f190c8cca274c94ed46b491d1d release32-maint
+88510 2b54be6551698a71856a52e5c1aad122c8843335 release32-maint
+88511 327a5a78a257cfe27acd901c65e084ba719618d9 issue10276-snowleopard
+88512 2f8ec77d32cd4718aac7415553bf745d5830aba3 py3k
+88513 0586c699d467a64c3e23dd876d2d362e633d890d py3k
+88514 62994662676a7be790e0dccc632818b788f6bf21 py3k
+88515 0e9f3bb63d00b7aa50ddbb1e5768a0881e22dd6e release32-maint
+88516 2f89cbbec0b484d11b964105d0dc32496faf28a8 py3k
+88517 0874698b1201df9c2ec95d09de81088d5dc91892 py3k
+88518 ec3c06761856dd630a95e3993169afb788ee7ec3 py3k
+88519 ac0d8e21a47deb55eac927494a238c1862d70043 release32-maint
+88520 44cc9ef43127f8b6d9b5fa41fcf7a61397ba7dba py3k
+88521 f2edaf62d823fb66fe79f4dbf1bff7383221e080 py3k
+88522 7f8da10bfcefcf37edca79a8bade78fbd21b2cd0 py3k
+88523 165d015a2baf07f337d0f562d32dc5f2bbf0c628 release32-maint
+88524 03f7afbc160848d4e17b660d3def57d7294fbd19 py3k
+88525 c8c57e766428531df68baa1cf57fb766bf70926d py3k
+88526 74861a42a6e6a289c3ab5b7719bf0cf4f0b75023 py3k
+88527 ba1aeb3621821f22212914f55d8718d654c51f6a release32-maint
+88528 035efdaf8229c79c420d10461b068de4c764cfe0 py3k
+88529 2325fe36aa345663e94efdf2462d0617ffe4f769 py3k
+88530 5a9d90d4f89eb80f1343bcf385b77e8515fea86d release32-maint
+88531 aba16a5683d3685eee1d61aa74563cb6c180ecab py3k
+88532 32386fa67a12a76917337a3c3b83842867b199d3 release32-maint
+88533 cf9176f2a6205adc4f3404b6e9266d2a2c7cab85 release32-maint
+88534 a1cfe815d97aad0af492eef5e8e229659c513227 py3k
+88535 5a298afacb9554757b7d121ae90c167cffe25572 py3k
+88537 de5c3a39ade724db4265b28f0f600fc3785ba6cc release27-maint
+88538 e8dfe602efa1cdea98fc5ce1a88a550d6e4dd7a7 release32-maint
+88539 9861dc1183222fe0bb59bfaeeb131309130b2cdf py3k
+88540 8ba7653280306a43f09286e6939bebbfa2cfc4b0 py3k
+88541 7326f064d83afea520ca663c8f33fbaedc9a9854 py3k
+88542 609f2b823350e42c2664ebb018cc852a68769420 py3k
+88543 bf8906ce104b503dc8b285b6b341d03cd343f1e1 release32-maint
+88545 fd6ec5e084a2c7e6e1d35e614fd76474900876db release32-maint
+88546 db7ef34eedaf5beb9cd925a63a0c4c17324784a1 py3k
+88547 3e4d959f8e12edfee2ea5f5d0717d8ee53328d93 py3k
+88548 feab230bd0dde40a599f043e7cc52adf9a6c9f74 release32-maint
+88549 cc3c3a438398ddaf09a72fe4b41c6797619586ca release32-maint
+88550 570c5939bc03e7228b9204057f6f98ea7f63c547 release27-maint
+88551 cbcb26a9d2bddd9204cb940f1f62fb3c846ca315 py3k
+88552 45739ca63eb345b00a1ab101098927e334e2f645 release32-maint
+88553 236c4dc6f0e7d7bb82647c6d833ecebd0eba4a8e py3k
+88554 c8c0e42944a1697a699c3ad2a98308ad0110d66d py3k
+88555 364e4c106297eafae6f24abb9c41725ebc63d61b release32-maint
+88556 b245d69b4f0ad4e7af8690a3f5d975f2f73e6ce1 release31-maint
+88557 c79665fb267aa37470cd2365d172d9c7de02d622 release31-maint
+88558 614a8c7b9525ad0628a2d64ba1e00d7909524d16 py3k
+88559 92629ccaae7646e54b2c50327dadcdce5f46d9b8 release31-maint
+88560 585db068069ed616eed44f2533755e491c212c5a release31-maint
+88561 eff2e8f15bed08f265a0ad30ee3af52b8a855601 release31-maint
+88562 5b35bbbe32e70ab670dab41937b494363b8522ff release31-maint
+88563 e3c68415a32d100c6de32cfb9273497e446bfeb0 release31-maint
+88564 d356649504f9f476a71e4b1b5922ae325be824ea release27-maint
+88565 8eeee9d6d32b9131fc21dd79db518e616dfedac3 release27-maint
+88566 c7c76cfbdb4e019e79f662e36b1617c555119353 release27-maint
+88567 3e5f2e2a84abe4e8d134dc7c654b72dad9ed666d py3k
+88568 226f001a701ff34afb5f0e88ec55858a855c9a80 release27-maint
+88569 34ae316318ef454f9c2393d2e3b7d600af7f0393 release27-maint
+88570 720a2f44cbf2cca0f74c3d3e59b5683ce9f502f4 release27-maint
+88571 78db3d0c6db72a1b6d19f09816b4669b28e8d16d release27-maint
+88572 b356b871bf67d2b50fe30be87d5062843ade6ab5 release27-maint
+88573 01c96b37586dd67c49dfe7d6c81a9b114233fe35 release31-maint
+88574 03526781282ae258bb6d4d195dd78f537beceb43 py3k
+88575 740ab927bf898bdccc6f14e950e3a14dd78b93c4 py3k
+88576 b17a064929b04c8f76a3e692c02a0b9a85b0f1a3 py3k
+88577 9ff7bc3610604338defad1aa2e3a3bf4a7f078ef py3k
+88578 eb5ed3da686234a0158b4e1b245fd7ebec9eb498 py3k
+88579 1762d79eab65f5fc3b6297b55934774293de0b71 py3k
+88580 7fd80c61ddaa3f80eb24ae4f26132fba0af78abb py3k
+88581 d3f93a12d6a915ee42301300096e71ba7964df0b py3k
+88582 636b2b552073d1f0b82beba0a0ed457eb47246e8 release32-maint
+88583 fd40110d5d8737f8ad7a224922c9209d34f67a7b release27-maint
+88584 bd252c12da1d883c41d3bb60a28f1a1a3d3863aa py3k
+88585 f4b1a65795417b4bbe8ed8947b9ecb182d2ada3d py3k
+88586 be6c38d1817b3020b760400aa2f5aef717a9c923 py3k
+88587 36c1b68b05865fb9fa189b5b9e0d1f88088a32bd py3k
+88588 19d07fa42004b1241ef6931a8b21ff803bcfff09 py3k
+88589 842fee6ae0e5030890edf5d7093be5b89a5386dd py3k
+88602 7ab569b18c98f884aba5e5cb52751ff63fa9aa74 py3k
+88603 8c5b811484bc2d2ee1346a3da54652ce834920e2 py3k
+88604 12ca477c4378c1758d0999516e09b4491cf0ad73 py3k
+88605 b7e85fd0d1c92db9ff9b2d07e7ea7ff0fbb61985 release32-maint
+88606 18636b871d01742299cfa80d39859fdc1fbe8d76 release27-maint
+88607 4b6052320e983ad798d41d30c496fd9c17212407 py3k
+88608 a038342872a34c54d7093a746838c1eafa641c17 py3k
+88609 a9eb0087b602143bd659fb1da95a077f24380a3e py3k
+88610 785933ba48ac6b04761e50f4209bc6080146e4e2 py3k
+88611 66ed71a6e29a8f1bf39bba3f68b26f0fa620844e release32-maint
+88612 675b48c4c88a1bb71e8bab51edd0738c4f1d1617 release27-maint
+88613 706be6ee9668b464405bdb65b6d835971fd5a933 py3k
+88614 6f12aadffc9fb91d3e139daea656572b83b73da2 release32-maint
+88615 8b3ef719bced2daa8f840b019142c6b3e5049c26 release31-maint
+88616 db46eda20fd029fb7012094c4a405b41317c8e4c py3k
+88617 a74924eea861a9de961f57d3ee7d0663f21d994b release27-maint
+88618 f71acc4b234102b67579bed2c137e0f02e67e65a py3k
+88619 87425dc23f26e5def1ce2c6a02e3b033ed3022f2 py3k
+88620 d21900511675cea49a90c7acbb02a1ee5efc5d30 py3k
+88621 27961dca833302c1f215f0c9657f082e929bc134 py3k
+88622 17d1c6cede7ed3bcce252153aedaa81b284d06c8 py3k
+88623 59f9ed12f17a4efef4318304585d1602eaad1cff release32-maint
+88624 3d3ba452f8adec533cd32861bc7f797a331829b3 py3k
+88625 aaaf7b58e2090c2eb65086ced3434b0a6c7c0093 py3k
+88626 267dbd6c98c319301e95c701cbc1a8706ea24523 py3k
+88627 53a45fb70786fa3dced131d76f937a4d4e68fd45 py3k
+88628 73c5abb41296d69974f6b231b1399d02ab0ade8e py3k
+88629 2a19f025b974aa5bde333d8c18b050e49fc1a1c8 py3k
+88630 a867f02d8f8d7f6b2d9c0ee5171ee3d9d07a4181 py3k
+88631 654c9f13cfe9e1072f4fbb120a56d55c02c83ce1 py3k
+88632 f4555d34f340a309b102b0311637867fb1a049bc py3k
+88633 b3226ad9a398df9dfb6f59072273b0cf179bae6a py3k
+88634 ba8e302b626c008d1d31f39f896eec7acfa81732 release32-maint
+88635 c6d303b99c82aaf28a8cf181f792e2a44f416c4b pep-3151
+88636 4dd93d0f5d1e078de731479b23292ea3059f714f py3k
+88637 6808d5dba1ec13f0fa988ba925e81dfd5dcb464d pep-3151
+88638 9eb202e6320e4adc97edc9c289f67193f05dab2d empty
+88639 4092296a3d8da5b1f1a062fac234a14ab7a851b5 py3k
+88640 7fa86a9195672c8d8884eb76042dce03225b34a1 py3k
+88641 60a5b4b2355de5f7366657c83fcb5d27f1914c23 release31-maint
+88642 0b596ff6d469757e27320170c3f68e2a1a89f1ee release27-maint
+88643 73daf91c615c53cc78b5d49c8640c5aaec3bbb9e py3k
+88644 7641fe089da1dad7caf3f09328dd4a900d673c3a release32-maint
+88644 907d5b2ed5a19f5e23d615d2b214be21aa0fb28b py3k
+88645 5717dd2166ee05846252fedef7d8d49854523349 release32-maint
+88645 7eea2a574dfc84c709180945388c8ddd633bb5c1 py3k
+88646 764b99ee8c8109f40cf8f0263d16236bdbcf1f5e release32-maint
+88646 c86f90340cd7d2272d67eb1c90f415e3eaac753a py3k
+88647 07affa0338bad2941051a3ec869ceb4ef4ff20e9 py3k
+88648 31d4b04cb5b0567d2ed4af773d188f845fcaede3 release31-maint
+88649 97d050c3172f9e2edc82b29228dbd6891fcd2ba0 release27-maint
+88650 276de9b293030c104deb7c675e3af69969a98742 py3k
+88651 374f0b22e4a4c5b1be40d061d5f8469ba1d54b2d release32-maint
+88652 09129aafb9536bdcfbfd7a44c3bc2e1d02972e35 py3k
+88653 fed2c6d49f198006e54b3791a495f7bbacbe089a py3k
+88654 979da8f139dd3d6e219f0babff476f95cce6a521 release32-maint
+88654 6a8fa2e9b1055cad7cc21839903f9f3983c35780 py3k
+88655 cd14782886caa28503bb356f5b3c37a41e211b41 release32-maint
+88656 722aeeb57eabbdff9bf51b4f843ea1fc40fed019 py3k
+88658 10256bd68787915f8f3ffd594611d670069027e2 py3k
+88659 59f74aad97031f19deadce8f869045adfd984790 release32-maint
+88660 c77b25adfec23c4141a51cde1a859395d9310c15 py3k
+88662 a58129cdd3657324a2ef0884d49fdc4dbfb4c516 release27-maint
+88663 8687a1b73516cc52031c770982d92d92fbe4dbdc py3k
+88664 1909c12ef06c7c1c2e2242629c3b82d1d7744875 py3k
+88665 6cec091020a2c9969ac8aa297daf2f36ded49fd4 release32-maint
+88666 742d73a9942574b5130c94de1f3a286c1e2270cb release27-maint
+88668 650d14820bd8c66df4a0baa5d1ddae3d40875b0f py3k
+88669 a9565925ba7061d637184064d78fb52f8dc82b23 release27-maint
+88670 a5b5fda6689c653d85d6f47e7e0a46d4e21d1b3d release32-maint
+88671 2f07d375ce6eecab471e5d8ebb889106f169da10 py3k
+88672 45650eb34685117a7b86f756fb126dcb2f3fd511 release32-maint
+88673 21436e48161fc3170201001ccaba7a55b39db575 release27-maint
+88674 dc8626e08577d6b1fd12e40fd59c9e523008d6a3 release27-maint
+88675 728fbc26359c107ff755ce5bb6b9b3b080f1bef1 pep-3151
+88679 cbd0608103f6106efa1d6523d9e0eab994dca14f py3k
+88680 b7d62bc0199889212bdcd40d5d04a3ca988d345f py3k
+88682 2ddca55e098dda2b1a6856a359e19f78d985c688 py3k
+88683 bbddac5c18d3980e7658a09bd4fe8541798c353c py3k
+88684 7c6b21db00e3e3f155d2b8a91d12cd284820874e py3k
+88685 a2d61117c2d2649f9090f689aa85c5575a6d7339 py3k
+88686 10b838f6e5a1a94ba73a1d3c65c950cdd8d5db33 py3k
+88687 fdf32fa0f440e71e50d0ffc35229d6a14c7d2a42 release32-maint
+88688 b294ff7573365cddcca8a27c1649fd18d199448c pep-382
+88689 f8a77fd675f5a3ce051ee404c7b56db1c72ebf1d release31-maint
+88690 44734d3753931548ac4a8ed9282b0349b8b60152 release31-maint
+88691 2611cbd75c4f971cf6fbf6b3372799667b595030 py3k
+88692 a366096b95ad2a6b5f8a86b4a908d22871b8cdc9 release32-maint
+88693 1797300f87b99865b66581cedaa8476d2458751f release27-maint
+88694 9acc9021f11e3021836c89ce82583bbf8ef97a93 pep-382
+88696 8e07fc948680684905f26eca4e62cb8fbdaed648 py3k
+88697 9b7254670ce9da002753ca00c248eabf5ddf3fae py3k
+88698 72f30f8ef331e9b5f5140e8f31ea7dcbeb9000a2 release32-maint
+88699 b82c3e593db6555fb8165816bc7a29ca1b227c46 py3k
+88700 1d198518cb875c39e53aee3af7d54a66fc12d3f3 py3k
+88701 5dc3493e07a9f2a830e79ab3081c0649030c3d16 release32-maint
+88702 da95440d92b36b00821871115d33b0c5108c11f3 py3k
+88703 73a499f0eaf1b0aef2844a61a19c1340997f8d7c py3k
+88704 87de017da4bf7cb3d60276517d21830b3ae9e0d7 py3k
+88705 7290b8f3c9fb9984669d0807e984bec713513f03 py3k
+88706 33e768d23b16a5710e4f522a6208e92bcc2d3ce9 py3k
+88707 6f117d27ad1c5e63239dd52c32562d82425af867 py3k
+88708 c7a9363622819f3eab772c780434b23471fe0b25 py3k
+88709 378ee328b60e0b1636aa24757bea1a15f9281ae4 py3k
+88710 a1dbe53f379845ff636709b08ab456337c865c93 py3k
+88711 4dac4769ea248aacc83077e57a64d2c1341c23aa py3k
+88712 6b12d2b68f25333dd5affe6e3e8f46b55cd42424 py3k
+88717 0dc6a90dee219122abf566ac858aea65c430082f py3k
+88718 6c8ec5f8b9e51bce154e118efa91f71b0096ebd0 release32-maint
+88719 a4e7fbed753c731a55267ce71009a80d82704d4a py3k
+88720 738feec9ced01fc313892db3b10589fb6025b87a py3k
+88721 20a5a08c3b6ca9d8a408697b957670d5e3d629c0 py3k
+88722 208a5290fd38ec8c4fe138e79e823d018743ecc6 py3k
+88723 a1727063a7dfeb0d2a63a6b1a29f46fec32b0582 release32-maint
+88724 f5398fb814289b24a8b05faed344f7f90b7756d7 py3k
+88725 2fce9c742cdeab4ded11152ecbdd9067e10ef0e2 release31-maint
+88726 ddc0bb6a7b7c72c7abb7b1c480dea8fd918db9ce py3k
+88727 58cb0fe06daa3651953551be5b11b14501547b00 release32-maint
+88728 965ab9911fcd0ef14afe0da9f83555c68978e7d0 release27-maint
+88729 f2046dfca73113672d59b5046ff86b0b03b41d09 py3k
+88730 b5281f5fade4dd567f1f1d56fac9ce7d57eb9f99 py3k
+88731 bc9efbbe63cf3eb3a3b7c1b9246c544f6fa5feb2 release32-maint
+88732 a8389468e65137c5065f702c846b9c0e561e5972 release27-maint
+88733 08804aea08f1c48a16c849da12707e51a87d86d9 py3k
+88734 2f5f755b26878cb0fb35c0c59073aaf18ebe3683 py3k
+88735 d2b5bde5c1fa4c94a747c670163d6ac701f96096 py3k
+88739 1a05bc36a3340a4e6b5961538543f10e9bf8cf7a release32-maint
+88740 3f70c54d86d89adcf7a7452025967a8f70be29cf py3k
+88741 e2dfc8f24d3f6ea83863d2e32c0c303e026aaafd release27-maint
+88742 93fd16670774a277b917390426b84c28ab796c7a py3k
+88744 e74209b9b2f5288f937d6e3411a2cf10a8646b04 py3k
+88745 e7b6adba571aa93a44145f0ebf7b5bba2e385931 py3k
+88746 50b38e4b0231267b91755c4d1a00720f38195268 py3k
+88747 0e7180e4c3cdb948418bc17b574d1ff651429f4d py3k
+88752 85a34a316969278593d454a86ef43a2f76c2d76c py3k-cdecimal
diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp
index a66305b..81a07c9 100644
--- a/Misc/valgrind-python.supp
+++ b/Misc/valgrind-python.supp
@@ -137,6 +137,18 @@
###}
###
###{
+### ADDRESS_IN_RANGE/Use of uninitialised value of size 8
+### Memcheck:Addr8
+### fun:PyObject_Free
+###}
+###
+###{
+### ADDRESS_IN_RANGE/Use of uninitialised value of size 8
+### Memcheck:Value8
+### fun:PyObject_Free
+###}
+###
+###{
### ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
### Memcheck:Cond
### fun:PyObject_Free
@@ -155,6 +167,18 @@
###}
###
###{
+### ADDRESS_IN_RANGE/Use of uninitialised value of size 8
+### Memcheck:Addr8
+### fun:PyObject_Realloc
+###}
+###
+###{
+### ADDRESS_IN_RANGE/Use of uninitialised value of size 8
+### Memcheck:Value8
+### fun:PyObject_Realloc
+###}
+###
+###{
### ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
### Memcheck:Cond
### fun:PyObject_Realloc
@@ -286,6 +310,38 @@
### fun:MD5_Update
###}
+# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
+# See http://bugs.python.org/issue14171
+{
+ openssl 1.0.1 prng 1
+ Memcheck:Cond
+ fun:bcmp
+ fun:fips_get_entropy
+ fun:FIPS_drbg_instantiate
+ fun:RAND_init_fips
+ fun:OPENSSL_init_library
+ fun:SSL_library_init
+ fun:init_hashlib
+}
+
+{
+ openssl 1.0.1 prng 2
+ Memcheck:Cond
+ fun:fips_get_entropy
+ fun:FIPS_drbg_instantiate
+ fun:RAND_init_fips
+ fun:OPENSSL_init_library
+ fun:SSL_library_init
+ fun:init_hashlib
+}
+
+{
+ openssl 1.0.1 prng 3
+ Memcheck:Value8
+ fun:_x86_64_AES_encrypt_compact
+ fun:AES_encrypt
+}
+
#
# All of these problems come from using test_socket_ssl
#
@@ -388,4 +444,28 @@
fun:SHA1_Update
}
+{
+ test_buffer_non_debug
+ Memcheck:Addr4
+ fun:PyUnicodeUCS2_FSConverter
+}
+
+{
+ test_buffer_non_debug
+ Memcheck:Addr4
+ fun:PyUnicode_FSConverter
+}
+
+# Additional suppressions for the unified decimal tests:
+{
+ test_decimal
+ Memcheck:Addr4
+ fun:PyUnicodeUCS2_FSConverter
+}
+
+{
+ test_decimal2
+ Memcheck:Addr4
+ fun:PyUnicode_FSConverter
+}
diff --git a/Modules/Setup.dist b/Modules/Setup.dist
index 9269ddf..f45de5c 100644
--- a/Modules/Setup.dist
+++ b/Modules/Setup.dist
@@ -127,6 +127,9 @@ _io -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesi
# builtin module avoids some bootstrapping problems and reduces overhead.
zipimport zipimport.c
+# faulthandler module
+faulthandler faulthandler.c
+
# The rest of the modules listed in this file are all commented out by
# default. Usually they can be detected and built as dynamically
# loaded modules by the new setup.py script added in Python 2.1. If
@@ -207,7 +210,7 @@ _symtable symtablemodule.c
#
# First, look at Setup.config; configure may have set this for you.
-#crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems
+#_crypt _cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems
# Some more UNIX dependent modules -- off by default, since these
@@ -231,15 +234,14 @@ _symtable symtablemodule.c
# system does not have the OpenSSL libs containing an optimized version.
# The _md5 module implements the RSA Data Security, Inc. MD5
-# Message-Digest Algorithm, described in RFC 1321. The necessary files
-# md5.c and md5.h are included here.
+# Message-Digest Algorithm, described in RFC 1321.
-#_md5 md5module.c md5.c
+#_md5 md5module.c
# The _sha module implements the SHA checksum algorithms.
# (NIST's Secure Hash Algorithms.)
-#_sha shamodule.c
+#_sha1 sha1module.c
#_sha256 sha256module.c
#_sha512 sha512module.c
diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c
index eae2978..faca8cf 100644
--- a/Modules/_bisectmodule.c
+++ b/Modules/_bisectmodule.c
@@ -90,7 +90,9 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw)
if (PyList_Insert(list, index, item) < 0)
return NULL;
} else {
- result = PyObject_CallMethod(list, "insert", "nO", index, item);
+ _Py_IDENTIFIER(insert);
+
+ result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item);
if (result == NULL)
return NULL;
Py_DECREF(result);
@@ -193,7 +195,8 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw)
if (PyList_Insert(list, index, item) < 0)
return NULL;
} else {
- result = PyObject_CallMethod(list, "insert", "nO", index, item);
+ _Py_IDENTIFIER(insert);
+ result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item);
if (result == NULL)
return NULL;
Py_DECREF(result);
diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
new file mode 100644
index 0000000..5cac8e6
--- /dev/null
+++ b/Modules/_bz2module.c
@@ -0,0 +1,605 @@
+/* _bz2 - Low-level Python interface to libbzip2. */
+
+#define PY_SSIZE_T_CLEAN
+
+#include "Python.h"
+#include "structmember.h"
+
+#ifdef WITH_THREAD
+#include "pythread.h"
+#endif
+
+#include <bzlib.h>
+#include <stdio.h>
+
+
+#ifndef BZ_CONFIG_ERROR
+#define BZ2_bzCompress bzCompress
+#define BZ2_bzCompressInit bzCompressInit
+#define BZ2_bzCompressEnd bzCompressEnd
+#define BZ2_bzDecompress bzDecompress
+#define BZ2_bzDecompressInit bzDecompressInit
+#define BZ2_bzDecompressEnd bzDecompressEnd
+#endif /* ! BZ_CONFIG_ERROR */
+
+
+#ifdef WITH_THREAD
+#define ACQUIRE_LOCK(obj) do { \
+ if (!PyThread_acquire_lock((obj)->lock, 0)) { \
+ Py_BEGIN_ALLOW_THREADS \
+ PyThread_acquire_lock((obj)->lock, 1); \
+ Py_END_ALLOW_THREADS \
+ } } while (0)
+#define RELEASE_LOCK(obj) PyThread_release_lock((obj)->lock)
+#else
+#define ACQUIRE_LOCK(obj)
+#define RELEASE_LOCK(obj)
+#endif
+
+#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
+
+
+typedef struct {
+ PyObject_HEAD
+ bz_stream bzs;
+ int flushed;
+#ifdef WITH_THREAD
+ PyThread_type_lock lock;
+#endif
+} BZ2Compressor;
+
+typedef struct {
+ PyObject_HEAD
+ bz_stream bzs;
+ char eof; /* T_BOOL expects a char */
+ PyObject *unused_data;
+#ifdef WITH_THREAD
+ PyThread_type_lock lock;
+#endif
+} BZ2Decompressor;
+
+
+/* Helper functions. */
+
+static int
+catch_bz2_error(int bzerror)
+{
+ switch(bzerror) {
+ case BZ_OK:
+ case BZ_RUN_OK:
+ case BZ_FLUSH_OK:
+ case BZ_FINISH_OK:
+ case BZ_STREAM_END:
+ return 0;
+
+#ifdef BZ_CONFIG_ERROR
+ case BZ_CONFIG_ERROR:
+ PyErr_SetString(PyExc_SystemError,
+ "libbzip2 was not compiled correctly");
+ return 1;
+#endif
+ case BZ_PARAM_ERROR:
+ PyErr_SetString(PyExc_ValueError,
+ "Internal error - "
+ "invalid parameters passed to libbzip2");
+ return 1;
+ case BZ_MEM_ERROR:
+ PyErr_NoMemory();
+ return 1;
+ case BZ_DATA_ERROR:
+ case BZ_DATA_ERROR_MAGIC:
+ PyErr_SetString(PyExc_IOError, "Invalid data stream");
+ return 1;
+ case BZ_IO_ERROR:
+ PyErr_SetString(PyExc_IOError, "Unknown I/O error");
+ return 1;
+ case BZ_UNEXPECTED_EOF:
+ PyErr_SetString(PyExc_EOFError,
+ "Compressed file ended before the logical "
+ "end-of-stream was detected");
+ return 1;
+ case BZ_SEQUENCE_ERROR:
+ PyErr_SetString(PyExc_RuntimeError,
+ "Internal error - "
+ "Invalid sequence of commands sent to libbzip2");
+ return 1;
+ default:
+ PyErr_Format(PyExc_IOError,
+ "Unrecognized error from libbzip2: %d", bzerror);
+ return 1;
+ }
+}
+
+#if BUFSIZ < 8192
+#define SMALLCHUNK 8192
+#else
+#define SMALLCHUNK BUFSIZ
+#endif
+
+static int
+grow_buffer(PyObject **buf)
+{
+ /* Expand the buffer by an amount proportional to the current size,
+ giving us amortized linear-time behavior. Use a less-than-double
+ growth factor to avoid excessive allocation. */
+ size_t size = PyBytes_GET_SIZE(*buf);
+ size_t new_size = size + (size >> 3) + 6;
+ if (new_size > size) {
+ return _PyBytes_Resize(buf, new_size);
+ } else { /* overflow */
+ PyErr_SetString(PyExc_OverflowError,
+ "Unable to allocate buffer - output too large");
+ return -1;
+ }
+}
+
+
+/* BZ2Compressor class. */
+
+static PyObject *
+compress(BZ2Compressor *c, char *data, size_t len, int action)
+{
+ size_t data_size = 0;
+ PyObject *result;
+
+ result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
+ if (result == NULL)
+ return NULL;
+ c->bzs.next_in = data;
+ /* On a 64-bit system, len might not fit in avail_in (an unsigned int).
+ Do compression in chunks of no more than UINT_MAX bytes each. */
+ c->bzs.avail_in = MIN(len, UINT_MAX);
+ len -= c->bzs.avail_in;
+ c->bzs.next_out = PyBytes_AS_STRING(result);
+ c->bzs.avail_out = PyBytes_GET_SIZE(result);
+ for (;;) {
+ char *this_out;
+ int bzerror;
+
+ Py_BEGIN_ALLOW_THREADS
+ this_out = c->bzs.next_out;
+ bzerror = BZ2_bzCompress(&c->bzs, action);
+ data_size += c->bzs.next_out - this_out;
+ Py_END_ALLOW_THREADS
+ if (catch_bz2_error(bzerror))
+ goto error;
+
+ if (c->bzs.avail_in == 0 && len > 0) {
+ c->bzs.avail_in = MIN(len, UINT_MAX);
+ len -= c->bzs.avail_in;
+ }
+
+ /* In regular compression mode, stop when input data is exhausted.
+ In flushing mode, stop when all buffered data has been flushed. */
+ if ((action == BZ_RUN && c->bzs.avail_in == 0) ||
+ (action == BZ_FINISH && bzerror == BZ_STREAM_END))
+ break;
+
+ if (c->bzs.avail_out == 0) {
+ size_t buffer_left = PyBytes_GET_SIZE(result) - data_size;
+ if (buffer_left == 0) {
+ if (grow_buffer(&result) < 0)
+ goto error;
+ c->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
+ buffer_left = PyBytes_GET_SIZE(result) - data_size;
+ }
+ c->bzs.avail_out = MIN(buffer_left, UINT_MAX);
+ }
+ }
+ if (data_size != PyBytes_GET_SIZE(result))
+ if (_PyBytes_Resize(&result, data_size) < 0)
+ goto error;
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyDoc_STRVAR(BZ2Compressor_compress__doc__,
+"compress(data) -> bytes\n"
+"\n"
+"Provide data to the compressor object. Returns a chunk of\n"
+"compressed data if possible, or b'' otherwise.\n"
+"\n"
+"When you have finished providing data to the compressor, call the\n"
+"flush() method to finish the compression process.\n");
+
+static PyObject *
+BZ2Compressor_compress(BZ2Compressor *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "y*:compress", &buffer))
+ return NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->flushed)
+ PyErr_SetString(PyExc_ValueError, "Compressor has been flushed");
+ else
+ result = compress(self, buffer.buf, buffer.len, BZ_RUN);
+ RELEASE_LOCK(self);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+PyDoc_STRVAR(BZ2Compressor_flush__doc__,
+"flush() -> bytes\n"
+"\n"
+"Finish the compression process. Returns the compressed data left\n"
+"in internal buffers.\n"
+"\n"
+"The compressor object may not be used after this method is called.\n");
+
+static PyObject *
+BZ2Compressor_flush(BZ2Compressor *self, PyObject *noargs)
+{
+ PyObject *result = NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->flushed)
+ PyErr_SetString(PyExc_ValueError, "Repeated call to flush()");
+ else {
+ self->flushed = 1;
+ result = compress(self, NULL, 0, BZ_FINISH);
+ }
+ RELEASE_LOCK(self);
+ return result;
+}
+
+static int
+BZ2Compressor_init(BZ2Compressor *self, PyObject *args, PyObject *kwargs)
+{
+ int compresslevel = 9;
+ int bzerror;
+
+ if (!PyArg_ParseTuple(args, "|i:BZ2Compressor", &compresslevel))
+ return -1;
+ if (!(1 <= compresslevel && compresslevel <= 9)) {
+ PyErr_SetString(PyExc_ValueError,
+ "compresslevel must be between 1 and 9");
+ return -1;
+ }
+
+#ifdef WITH_THREAD
+ self->lock = PyThread_allocate_lock();
+ if (self->lock == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
+ return -1;
+ }
+#endif
+
+ bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
+ if (catch_bz2_error(bzerror))
+ goto error;
+
+ return 0;
+
+error:
+#ifdef WITH_THREAD
+ PyThread_free_lock(self->lock);
+ self->lock = NULL;
+#endif
+ return -1;
+}
+
+static void
+BZ2Compressor_dealloc(BZ2Compressor *self)
+{
+ BZ2_bzCompressEnd(&self->bzs);
+#ifdef WITH_THREAD
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+#endif
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyMethodDef BZ2Compressor_methods[] = {
+ {"compress", (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
+ BZ2Compressor_compress__doc__},
+ {"flush", (PyCFunction)BZ2Compressor_flush, METH_NOARGS,
+ BZ2Compressor_flush__doc__},
+ {NULL}
+};
+
+PyDoc_STRVAR(BZ2Compressor__doc__,
+"BZ2Compressor(compresslevel=9)\n"
+"\n"
+"Create a compressor object for compressing data incrementally.\n"
+"\n"
+"compresslevel, if given, must be a number between 1 and 9.\n"
+"\n"
+"For one-shot compression, use the compress() function instead.\n");
+
+static PyTypeObject BZ2Compressor_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_bz2.BZ2Compressor", /* tp_name */
+ sizeof(BZ2Compressor), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)BZ2Compressor_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ BZ2Compressor__doc__, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ BZ2Compressor_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BZ2Compressor_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+/* BZ2Decompressor class. */
+
+static PyObject *
+decompress(BZ2Decompressor *d, char *data, size_t len)
+{
+ size_t data_size = 0;
+ PyObject *result;
+
+ result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
+ if (result == NULL)
+ return result;
+ d->bzs.next_in = data;
+ /* On a 64-bit system, len might not fit in avail_in (an unsigned int).
+ Do decompression in chunks of no more than UINT_MAX bytes each. */
+ d->bzs.avail_in = MIN(len, UINT_MAX);
+ len -= d->bzs.avail_in;
+ d->bzs.next_out = PyBytes_AS_STRING(result);
+ d->bzs.avail_out = PyBytes_GET_SIZE(result);
+ for (;;) {
+ char *this_out;
+ int bzerror;
+
+ Py_BEGIN_ALLOW_THREADS
+ this_out = d->bzs.next_out;
+ bzerror = BZ2_bzDecompress(&d->bzs);
+ data_size += d->bzs.next_out - this_out;
+ Py_END_ALLOW_THREADS
+ if (catch_bz2_error(bzerror))
+ goto error;
+ if (bzerror == BZ_STREAM_END) {
+ d->eof = 1;
+ len += d->bzs.avail_in;
+ if (len > 0) { /* Save leftover input to unused_data */
+ Py_CLEAR(d->unused_data);
+ d->unused_data = PyBytes_FromStringAndSize(d->bzs.next_in, len);
+ if (d->unused_data == NULL)
+ goto error;
+ }
+ break;
+ }
+ if (d->bzs.avail_in == 0) {
+ if (len == 0)
+ break;
+ d->bzs.avail_in = MIN(len, UINT_MAX);
+ len -= d->bzs.avail_in;
+ }
+ if (d->bzs.avail_out == 0) {
+ size_t buffer_left = PyBytes_GET_SIZE(result) - data_size;
+ if (buffer_left == 0) {
+ if (grow_buffer(&result) < 0)
+ goto error;
+ d->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
+ buffer_left = PyBytes_GET_SIZE(result) - data_size;
+ }
+ d->bzs.avail_out = MIN(buffer_left, UINT_MAX);
+ }
+ }
+ if (data_size != PyBytes_GET_SIZE(result))
+ if (_PyBytes_Resize(&result, data_size) < 0)
+ goto error;
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyDoc_STRVAR(BZ2Decompressor_decompress__doc__,
+"decompress(data) -> bytes\n"
+"\n"
+"Provide data to the decompressor object. Returns a chunk of\n"
+"decompressed data if possible, or b'' otherwise.\n"
+"\n"
+"Attempting to decompress data after the end of stream is reached\n"
+"raises an EOFError. Any data found after the end of the stream\n"
+"is ignored and saved in the unused_data attribute.\n");
+
+static PyObject *
+BZ2Decompressor_decompress(BZ2Decompressor *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "y*:decompress", &buffer))
+ return NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->eof)
+ PyErr_SetString(PyExc_EOFError, "End of stream already reached");
+ else
+ result = decompress(self, buffer.buf, buffer.len);
+ RELEASE_LOCK(self);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+static int
+BZ2Decompressor_init(BZ2Decompressor *self, PyObject *args, PyObject *kwargs)
+{
+ int bzerror;
+
+ if (!PyArg_ParseTuple(args, ":BZ2Decompressor"))
+ return -1;
+
+#ifdef WITH_THREAD
+ self->lock = PyThread_allocate_lock();
+ if (self->lock == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
+ return -1;
+ }
+#endif
+
+ self->unused_data = PyBytes_FromStringAndSize("", 0);
+ if (self->unused_data == NULL)
+ goto error;
+
+ bzerror = BZ2_bzDecompressInit(&self->bzs, 0, 0);
+ if (catch_bz2_error(bzerror))
+ goto error;
+
+ return 0;
+
+error:
+ Py_CLEAR(self->unused_data);
+#ifdef WITH_THREAD
+ PyThread_free_lock(self->lock);
+ self->lock = NULL;
+#endif
+ return -1;
+}
+
+static void
+BZ2Decompressor_dealloc(BZ2Decompressor *self)
+{
+ BZ2_bzDecompressEnd(&self->bzs);
+ Py_CLEAR(self->unused_data);
+#ifdef WITH_THREAD
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+#endif
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyMethodDef BZ2Decompressor_methods[] = {
+ {"decompress", (PyCFunction)BZ2Decompressor_decompress, METH_VARARGS,
+ BZ2Decompressor_decompress__doc__},
+ {NULL}
+};
+
+PyDoc_STRVAR(BZ2Decompressor_eof__doc__,
+"True if the end-of-stream marker has been reached.");
+
+PyDoc_STRVAR(BZ2Decompressor_unused_data__doc__,
+"Data found after the end of the compressed stream.");
+
+static PyMemberDef BZ2Decompressor_members[] = {
+ {"eof", T_BOOL, offsetof(BZ2Decompressor, eof),
+ READONLY, BZ2Decompressor_eof__doc__},
+ {"unused_data", T_OBJECT_EX, offsetof(BZ2Decompressor, unused_data),
+ READONLY, BZ2Decompressor_unused_data__doc__},
+ {NULL}
+};
+
+PyDoc_STRVAR(BZ2Decompressor__doc__,
+"BZ2Decompressor()\n"
+"\n"
+"Create a decompressor object for decompressing data incrementally.\n"
+"\n"
+"For one-shot decompression, use the decompress() function instead.\n");
+
+static PyTypeObject BZ2Decompressor_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_bz2.BZ2Decompressor", /* tp_name */
+ sizeof(BZ2Decompressor), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)BZ2Decompressor_dealloc,/* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ BZ2Decompressor__doc__, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ BZ2Decompressor_methods, /* tp_methods */
+ BZ2Decompressor_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)BZ2Decompressor_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+/* Module initialization. */
+
+static struct PyModuleDef _bz2module = {
+ PyModuleDef_HEAD_INIT,
+ "_bz2",
+ NULL,
+ -1,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit__bz2(void)
+{
+ PyObject *m;
+
+ if (PyType_Ready(&BZ2Compressor_Type) < 0)
+ return NULL;
+ if (PyType_Ready(&BZ2Decompressor_Type) < 0)
+ return NULL;
+
+ m = PyModule_Create(&_bz2module);
+ if (m == NULL)
+ return NULL;
+
+ Py_INCREF(&BZ2Compressor_Type);
+ PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Compressor_Type);
+
+ Py_INCREF(&BZ2Decompressor_Type);
+ PyModule_AddObject(m, "BZ2Decompressor",
+ (PyObject *)&BZ2Decompressor_Type);
+
+ return m;
+}
diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c
index eb740f9..40037b1 100644
--- a/Modules/_codecsmodule.c
+++ b/Modules/_codecsmodule.c
@@ -38,6 +38,10 @@ Copyright (c) Corporation for National Research Initiatives.
#define PY_SSIZE_T_CLEAN
#include "Python.h"
+#ifdef MS_WINDOWS
+#include <windows.h>
+#endif
+
/* --- Registry ----------------------------------------------------------- */
PyDoc_STRVAR(register__doc__,
@@ -162,7 +166,6 @@ static PyObject *
escape_encode(PyObject *self,
PyObject *args)
{
- static const char *hexdigits = "0123456789abcdef";
PyObject *str;
Py_ssize_t size;
Py_ssize_t newsize;
@@ -174,12 +177,12 @@ escape_encode(PyObject *self,
return NULL;
size = PyBytes_GET_SIZE(str);
- newsize = 4*size;
- if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) {
+ if (size > PY_SSIZE_T_MAX / 4) {
PyErr_SetString(PyExc_OverflowError,
"string is too large to encode");
return NULL;
}
+ newsize = 4*size;
v = PyBytes_FromStringAndSize(NULL, newsize);
if (v == NULL) {
@@ -205,8 +208,8 @@ escape_encode(PyObject *self,
else if (c < ' ' || c >= 0x7f) {
*p++ = '\\';
*p++ = 'x';
- *p++ = hexdigits[(c & 0xf0) >> 4];
- *p++ = hexdigits[c & 0xf];
+ *p++ = Py_hexdigits[(c & 0xf0) >> 4];
+ *p++ = Py_hexdigits[c & 0xf];
}
else
*p++ = c;
@@ -236,8 +239,10 @@ unicode_internal_decode(PyObject *self,
return NULL;
if (PyUnicode_Check(obj)) {
+ if (PyUnicode_READY(obj) < 0)
+ return NULL;
Py_INCREF(obj);
- return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
+ return codec_tuple(obj, PyUnicode_GET_LENGTH(obj));
}
else {
if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
@@ -588,7 +593,7 @@ charmap_decode(PyObject *self,
return codec_tuple(unicode, pbuf.len);
}
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
static PyObject *
mbcs_decode(PyObject *self,
@@ -613,7 +618,32 @@ mbcs_decode(PyObject *self,
return codec_tuple(decoded, consumed);
}
-#endif /* MS_WINDOWS */
+static PyObject *
+code_page_decode(PyObject *self,
+ PyObject *args)
+{
+ Py_buffer pbuf;
+ const char *errors = NULL;
+ int final = 0;
+ Py_ssize_t consumed;
+ PyObject *decoded = NULL;
+ int code_page;
+
+ if (!PyArg_ParseTuple(args, "iy*|zi:code_page_decode",
+ &code_page, &pbuf, &errors, &final))
+ return NULL;
+ consumed = pbuf.len;
+
+ decoded = PyUnicode_DecodeCodePageStateful(code_page,
+ pbuf.buf, pbuf.len, errors,
+ final ? NULL : &consumed);
+ PyBuffer_Release(&pbuf);
+ if (decoded == NULL)
+ return NULL;
+ return codec_tuple(decoded, consumed);
+}
+
+#endif /* HAVE_MBCS */
/* --- Encoder ------------------------------------------------------------ */
@@ -645,17 +675,31 @@ unicode_internal_encode(PyObject *self,
PyObject *obj;
const char *errors = NULL;
const char *data;
- Py_ssize_t size;
+ Py_ssize_t len, size;
+
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "unicode_internal codec has been deprecated",
+ 1))
+ return NULL;
if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
&obj, &errors))
return NULL;
if (PyUnicode_Check(obj)) {
- data = PyUnicode_AS_DATA(obj);
- size = PyUnicode_GET_DATA_SIZE(obj);
- return codec_tuple(PyBytes_FromStringAndSize(data, size),
- PyUnicode_GET_SIZE(obj));
+ Py_UNICODE *u;
+
+ if (PyUnicode_READY(obj) < 0)
+ return NULL;
+
+ u = PyUnicode_AsUnicodeAndSize(obj, &len);
+ if (u == NULL)
+ return NULL;
+ if (len > PY_SSIZE_T_MAX / sizeof(Py_UNICODE))
+ return PyErr_NoMemory();
+ size = len * sizeof(Py_UNICODE);
+ return codec_tuple(PyBytes_FromStringAndSize((const char*)u, size),
+ PyUnicode_GET_LENGTH(obj));
}
else {
if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
@@ -676,14 +720,12 @@ utf_7_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
- return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- 0,
- 0,
- errors),
- PyUnicode_GET_SIZE(str));
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
+ return NULL;
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -700,12 +742,12 @@ utf_8_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(PyUnicode_AsEncodedString(str, "utf-8", errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -730,13 +772,12 @@ utf_16_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- byteorder),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -753,13 +794,12 @@ utf_16_le_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- -1),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -776,13 +816,12 @@ utf_16_be_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- +1),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -807,13 +846,12 @@ utf_32_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- byteorder),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -830,13 +868,12 @@ utf_32_le_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- -1),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -853,13 +890,12 @@ utf_32_be_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors,
- +1),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -876,11 +912,12 @@ unicode_escape_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str)),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -897,12 +934,12 @@ raw_unicode_escape_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
- PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str)),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -919,13 +956,12 @@ latin_1_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeLatin1(
- PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_AsLatin1String(str, errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -942,13 +978,12 @@ ascii_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeASCII(
- PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(_PyUnicode_AsASCIIString(str, errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -968,14 +1003,12 @@ charmap_encode(PyObject *self,
mapping = NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
- return NULL;
- v = codec_tuple(PyUnicode_EncodeCharmap(
- PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- mapping,
- errors),
- PyUnicode_GET_SIZE(str));
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
+ return NULL;
+ }
+ v = codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
@@ -989,7 +1022,7 @@ charmap_build(PyObject *self, PyObject *args)
return PyUnicode_BuildEncodingMap(map);
}
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
static PyObject *
mbcs_encode(PyObject *self,
@@ -1003,18 +1036,42 @@ mbcs_encode(PyObject *self,
return NULL;
str = PyUnicode_FromObject(str);
- if (str == NULL)
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
+ return NULL;
+ }
+ v = codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
+ PyUnicode_GET_LENGTH(str));
+ Py_DECREF(str);
+ return v;
+}
+
+static PyObject *
+code_page_encode(PyObject *self,
+ PyObject *args)
+{
+ PyObject *str, *v;
+ const char *errors = NULL;
+ int code_page;
+
+ if (!PyArg_ParseTuple(args, "iO|z:code_page_encode",
+ &code_page, &str, &errors))
+ return NULL;
+
+ str = PyUnicode_FromObject(str);
+ if (str == NULL || PyUnicode_READY(str) < 0) {
+ Py_XDECREF(str);
return NULL;
- v = codec_tuple(PyUnicode_EncodeMBCS(
- PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- errors),
- PyUnicode_GET_SIZE(str));
+ }
+ v = codec_tuple(PyUnicode_EncodeCodePage(code_page,
+ str,
+ errors),
+ PyUnicode_GET_LENGTH(str));
Py_DECREF(str);
return v;
}
-#endif /* MS_WINDOWS */
+#endif /* HAVE_MBCS */
/* --- Error handler registry --------------------------------------------- */
@@ -1101,9 +1158,11 @@ static PyMethodDef _codecs_functions[] = {
{"charmap_decode", charmap_decode, METH_VARARGS},
{"charmap_build", charmap_build, METH_VARARGS},
{"readbuffer_encode", readbuffer_encode, METH_VARARGS},
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
{"mbcs_encode", mbcs_encode, METH_VARARGS},
{"mbcs_decode", mbcs_decode, METH_VARARGS},
+ {"code_page_encode", code_page_encode, METH_VARARGS},
+ {"code_page_decode", code_page_decode, METH_VARARGS},
#endif
{"register_error", register_error, METH_VARARGS,
register_error__doc__},
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 54c1343..1ff95ff 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -767,8 +767,9 @@ static PyObject *
deque_reduce(dequeobject *deque)
{
PyObject *dict, *result, *aslist;
+ _Py_IDENTIFIER(__dict__);
- dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
+ dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
if (dict == NULL)
PyErr_Clear();
aslist = PySequence_List((PyObject *)deque);
@@ -832,8 +833,7 @@ deque_richcompare(PyObject *v, PyObject *w, int op)
if (!PyObject_TypeCheck(v, &deque_type) ||
!PyObject_TypeCheck(w, &deque_type)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
/* Shortcuts */
@@ -1141,6 +1141,35 @@ dequeiter_next(dequeiterobject *it)
}
static PyObject *
+dequeiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ Py_ssize_t i, index=0;
+ PyObject *deque;
+ dequeiterobject *it;
+ if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
+ return NULL;
+ assert(type == &dequeiter_type);
+
+ it = (dequeiterobject*)deque_iter((dequeobject *)deque);
+ if (!it)
+ return NULL;
+ /* consume items from the queue */
+ for(i=0; i<index; i++) {
+ PyObject *item = dequeiter_next(it);
+ if (item) {
+ Py_DECREF(item);
+ } else {
+ if (it->counter) {
+ Py_DECREF(it);
+ return NULL;
+ } else
+ break;
+ }
+ }
+ return (PyObject*)it;
+}
+
+static PyObject *
dequeiter_len(dequeiterobject *it)
{
return PyLong_FromSsize_t(it->counter);
@@ -1148,14 +1177,21 @@ dequeiter_len(dequeiterobject *it)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+dequeiter_reduce(dequeiterobject *it)
+{
+ return Py_BuildValue("O(On)", Py_TYPE(it), it->deque, it->deque->len - it->counter);
+}
+
static PyMethodDef dequeiter_methods[] = {
{"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)dequeiter_reduce, METH_NOARGS, reduce_doc},
{NULL, NULL} /* sentinel */
};
static PyTypeObject dequeiter_type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "deque_iterator", /* tp_name */
+ "_collections._deque_iterator", /* tp_name */
sizeof(dequeiterobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
@@ -1183,6 +1219,16 @@ static PyTypeObject dequeiter_type = {
PyObject_SelfIter, /* tp_iter */
(iternextfunc)dequeiter_next, /* tp_iternext */
dequeiter_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ dequeiter_new, /* tp_new */
0,
};
@@ -1236,9 +1282,38 @@ dequereviter_next(dequeiterobject *it)
return item;
}
+static PyObject *
+dequereviter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ Py_ssize_t i, index=0;
+ PyObject *deque;
+ dequeiterobject *it;
+ if (!PyArg_ParseTuple(args, "O!|n", &deque_type, &deque, &index))
+ return NULL;
+ assert(type == &dequereviter_type);
+
+ it = (dequeiterobject*)deque_reviter((dequeobject *)deque);
+ if (!it)
+ return NULL;
+ /* consume items from the queue */
+ for(i=0; i<index; i++) {
+ PyObject *item = dequereviter_next(it);
+ if (item) {
+ Py_DECREF(item);
+ } else {
+ if (it->counter) {
+ Py_DECREF(it);
+ return NULL;
+ } else
+ break;
+ }
+ }
+ return (PyObject*)it;
+}
+
static PyTypeObject dequereviter_type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "deque_reverse_iterator", /* tp_name */
+ "_collections._deque_reverse_iterator", /* tp_name */
sizeof(dequeiterobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
@@ -1266,6 +1341,16 @@ static PyTypeObject dequereviter_type = {
PyObject_SelfIter, /* tp_iter */
(iternextfunc)dequereviter_next, /* tp_iternext */
dequeiter_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ dequereviter_new, /* tp_new */
0,
};
@@ -1354,13 +1439,15 @@ defdict_reduce(defdictobject *dd)
PyObject *items;
PyObject *iter;
PyObject *result;
+ _Py_IDENTIFIER(items);
+
if (dd->default_factory == NULL || dd->default_factory == Py_None)
args = PyTuple_New(0);
else
args = PyTuple_Pack(1, dd->default_factory);
if (args == NULL)
return NULL;
- items = PyObject_CallMethod((PyObject *)dd, "items", "()");
+ items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()");
if (items == NULL) {
Py_DECREF(args);
return NULL;
@@ -1573,12 +1660,8 @@ _count_elements(PyObject *self, PyObject *args)
if (PyDict_CheckExact(mapping)) {
while (1) {
key = PyIter_Next(it);
- if (key == NULL) {
- if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration))
- PyErr_Clear();
- else
- break;
- }
+ if (key == NULL)
+ break;
oldval = PyDict_GetItem(mapping, key);
if (oldval == NULL) {
if (PyDict_SetItem(mapping, key, one) == -1)
@@ -1596,12 +1679,8 @@ _count_elements(PyObject *self, PyObject *args)
} else {
while (1) {
key = PyIter_Next(it);
- if (key == NULL) {
- if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration))
- PyErr_Clear();
- else
- break;
- }
+ if (key == NULL)
+ break;
oldval = PyObject_GetItem(mapping, key);
if (oldval == NULL) {
if (!PyErr_Occurred() || !PyErr_ExceptionMatches(PyExc_KeyError))
@@ -1678,9 +1757,13 @@ PyInit__collections(void)
if (PyType_Ready(&dequeiter_type) < 0)
return NULL;
+ Py_INCREF(&dequeiter_type);
+ PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
if (PyType_Ready(&dequereviter_type) < 0)
return NULL;
+ Py_INCREF(&dequereviter_type);
+ PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
return m;
}
diff --git a/Modules/cryptmodule.c b/Modules/_cryptmodule.c
index d5a42ff..5100788 100644
--- a/Modules/cryptmodule.c
+++ b/Modules/_cryptmodule.c
@@ -45,7 +45,7 @@ static PyMethodDef crypt_methods[] = {
static struct PyModuleDef cryptmodule = {
PyModuleDef_HEAD_INIT,
- "crypt",
+ "_crypt",
NULL,
-1,
crypt_methods,
@@ -56,7 +56,7 @@ static struct PyModuleDef cryptmodule = {
};
PyMODINIT_FUNC
-PyInit_crypt(void)
+PyInit__crypt(void)
{
return PyModule_Create(&cryptmodule);
}
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 88d4f97..48a5cf8 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -13,12 +13,40 @@ module instead.
#include "Python.h"
#include "structmember.h"
-#define IS_BASESTRING(o) \
- PyUnicode_Check(o)
-static PyObject *error_obj; /* CSV exception */
-static PyObject *dialects; /* Dialect registry */
-static long field_limit = 128 * 1024; /* max parsed field size */
+typedef struct {
+ PyObject *error_obj; /* CSV exception */
+ PyObject *dialects; /* Dialect registry */
+ long field_limit; /* max parsed field size */
+} _csvstate;
+
+#define _csvstate(o) ((_csvstate *)PyModule_GetState(o))
+
+static int
+_csv_clear(PyObject *m)
+{
+ Py_CLEAR(_csvstate(m)->error_obj);
+ Py_CLEAR(_csvstate(m)->dialects);
+ return 0;
+}
+
+static int
+_csv_traverse(PyObject *m, visitproc visit, void *arg)
+{
+ Py_VISIT(_csvstate(m)->error_obj);
+ Py_VISIT(_csvstate(m)->dialects);
+ return 0;
+}
+
+static void
+_csv_free(void *m)
+{
+ _csv_clear((PyObject *)m);
+}
+
+static struct PyModuleDef _csvmodule;
+
+#define _csvstate_global ((_csvstate *)PyModule_GetState(PyState_FindModule(&_csvmodule)))
typedef enum {
START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD,
@@ -47,9 +75,9 @@ typedef struct {
PyObject_HEAD
int doublequote; /* is " represented by ""? */
- Py_UNICODE delimiter; /* field separator */
- Py_UNICODE quotechar; /* quote character */
- Py_UNICODE escapechar; /* escape character */
+ Py_UCS4 delimiter; /* field separator */
+ Py_UCS4 quotechar; /* quote character */
+ Py_UCS4 escapechar; /* escape character */
int skipinitialspace; /* ignore spaces following delimiter? */
PyObject *lineterminator; /* string to write between records */
int quoting; /* style of quoting to write */
@@ -68,7 +96,7 @@ typedef struct {
PyObject *fields; /* field list for current record */
ParserState state; /* current CSV parse state */
- Py_UNICODE *field; /* build current field in here */
+ Py_UCS4 *field; /* temporary buffer */
Py_ssize_t field_size; /* size of allocated buffer */
Py_ssize_t field_len; /* length of current field */
int numeric_field; /* treat field as numeric */
@@ -86,7 +114,7 @@ typedef struct {
DialectObj *dialect; /* parsing dialect */
- Py_UNICODE *rec; /* buffer for parser.join */
+ Py_UCS4 *rec; /* buffer for parser.join */
Py_ssize_t rec_size; /* size of allocated record */
Py_ssize_t rec_len; /* length of record */
int num_fields; /* number of fields in record */
@@ -103,10 +131,10 @@ get_dialect_from_registry(PyObject * name_obj)
{
PyObject *dialect_obj;
- dialect_obj = PyDict_GetItem(dialects, name_obj);
+ dialect_obj = PyDict_GetItem(_csvstate_global->dialects, name_obj);
if (dialect_obj == NULL) {
if (!PyErr_Occurred())
- PyErr_Format(error_obj, "unknown dialect");
+ PyErr_Format(_csvstate_global->error_obj, "unknown dialect");
}
else
Py_INCREF(dialect_obj);
@@ -121,14 +149,14 @@ get_string(PyObject *str)
}
static PyObject *
-get_nullchar_as_None(Py_UNICODE c)
+get_nullchar_as_None(Py_UCS4 c)
{
if (c == '\0') {
Py_INCREF(Py_None);
return Py_None;
}
else
- return PyUnicode_FromUnicode((Py_UNICODE *)&c, 1);
+ return PyUnicode_FromOrdinal(c);
}
static PyObject *
@@ -203,25 +231,24 @@ _set_int(const char *name, int *target, PyObject *src, int dflt)
}
static int
-_set_char(const char *name, Py_UNICODE *target, PyObject *src, Py_UNICODE dflt)
+_set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt)
{
if (src == NULL)
*target = dflt;
else {
*target = '\0';
if (src != Py_None) {
- Py_UNICODE *buf;
Py_ssize_t len;
- buf = PyUnicode_AsUnicode(src);
- len = PyUnicode_GetSize(src);
- if (buf == NULL || len > 1) {
+ len = PyUnicode_GetLength(src);
+ if (len > 1) {
PyErr_Format(PyExc_TypeError,
"\"%s\" must be an 1-character string",
name);
return -1;
}
+ /* PyUnicode_READY() is called in PyUnicode_GetLength() */
if (len > 0)
- *target = buf[0];
+ *target = PyUnicode_READ_CHAR(src, 0);
}
}
return 0;
@@ -235,12 +262,14 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
else {
if (src == Py_None)
*target = NULL;
- else if (!IS_BASESTRING(src)) {
+ else if (!PyUnicode_Check(src)) {
PyErr_Format(PyExc_TypeError,
"\"%s\" must be a string", name);
return -1;
}
else {
+ if (PyUnicode_READY(src) == -1)
+ return -1;
Py_XDECREF(*target);
Py_INCREF(src);
*target = src;
@@ -329,7 +358,7 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
return NULL;
if (dialect != NULL) {
- if (IS_BASESTRING(dialect)) {
+ if (PyUnicode_Check(dialect)) {
dialect = get_dialect_from_registry(dialect);
if (dialect == NULL)
return NULL;
@@ -502,7 +531,8 @@ parse_save_field(ReaderObj *self)
{
PyObject *field;
- field = PyUnicode_FromUnicode(self->field, self->field_len);
+ field = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ (void *) self->field, self->field_len);
if (field == NULL)
return -1;
self->field_len = 0;
@@ -511,11 +541,9 @@ parse_save_field(ReaderObj *self)
self->numeric_field = 0;
tmp = PyNumber_Float(field);
- if (tmp == NULL) {
- Py_DECREF(field);
- return -1;
- }
Py_DECREF(field);
+ if (tmp == NULL)
+ return -1;
field = tmp;
}
PyList_Append(self->fields, field);
@@ -530,16 +558,16 @@ parse_grow_buff(ReaderObj *self)
self->field_size = 4096;
if (self->field != NULL)
PyMem_Free(self->field);
- self->field = PyMem_New(Py_UNICODE, self->field_size);
+ self->field = PyMem_New(Py_UCS4, self->field_size);
}
else {
+ Py_UCS4 *field = self->field;
if (self->field_size > PY_SSIZE_T_MAX / 2) {
PyErr_NoMemory();
return 0;
}
self->field_size *= 2;
- self->field = PyMem_Resize(self->field, Py_UNICODE,
- self->field_size);
+ self->field = PyMem_Resize(field, Py_UCS4, self->field_size);
}
if (self->field == NULL) {
PyErr_NoMemory();
@@ -549,11 +577,11 @@ parse_grow_buff(ReaderObj *self)
}
static int
-parse_add_char(ReaderObj *self, Py_UNICODE c)
+parse_add_char(ReaderObj *self, Py_UCS4 c)
{
- if (self->field_len >= field_limit) {
- PyErr_Format(error_obj, "field larger than field limit (%ld)",
- field_limit);
+ if (self->field_len >= _csvstate_global->field_limit) {
+ PyErr_Format(_csvstate_global->error_obj, "field larger than field limit (%ld)",
+ _csvstate_global->field_limit);
return -1;
}
if (self->field_len == self->field_size && !parse_grow_buff(self))
@@ -563,7 +591,7 @@ parse_add_char(ReaderObj *self, Py_UNICODE c)
}
static int
-parse_process_char(ReaderObj *self, Py_UNICODE c)
+parse_process_char(ReaderObj *self, Py_UCS4 c)
{
DialectObj *dialect = self->dialect;
@@ -710,7 +738,7 @@ parse_process_char(ReaderObj *self, Py_UNICODE c)
}
else {
/* illegal */
- PyErr_Format(error_obj, "'%c' expected after '%c'",
+ PyErr_Format(_csvstate_global->error_obj, "'%c' expected after '%c'",
dialect->delimiter,
dialect->quotechar);
return -1;
@@ -723,7 +751,7 @@ parse_process_char(ReaderObj *self, Py_UNICODE c)
else if (c == '\0')
self->state = START_RECORD;
else {
- PyErr_Format(error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?");
+ PyErr_Format(_csvstate_global->error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?");
return -1;
}
break;
@@ -748,10 +776,12 @@ parse_reset(ReaderObj *self)
static PyObject *
Reader_iternext(ReaderObj *self)
{
- PyObject *lineobj;
PyObject *fields = NULL;
- Py_UNICODE *line, c;
- Py_ssize_t linelen;
+ Py_UCS4 c;
+ Py_ssize_t pos, linelen;
+ unsigned int kind;
+ void *data;
+ PyObject *lineobj;
if (parse_reset(self) < 0)
return NULL;
@@ -762,14 +792,15 @@ Reader_iternext(ReaderObj *self)
if (!PyErr_Occurred() && (self->field_len != 0 ||
self->state == IN_QUOTED_FIELD)) {
if (self->dialect->strict)
- PyErr_SetString(error_obj, "unexpected end of data");
+ PyErr_SetString(_csvstate_global->error_obj,
+ "unexpected end of data");
else if (parse_save_field(self) >= 0)
break;
}
return NULL;
}
if (!PyUnicode_Check(lineobj)) {
- PyErr_Format(error_obj,
+ PyErr_Format(_csvstate_global->error_obj,
"iterator should return strings, "
"not %.200s "
"(did you open the file in text mode?)",
@@ -778,18 +809,20 @@ Reader_iternext(ReaderObj *self)
Py_DECREF(lineobj);
return NULL;
}
- ++self->line_num;
- line = PyUnicode_AsUnicode(lineobj);
- linelen = PyUnicode_GetSize(lineobj);
- if (line == NULL || linelen < 0) {
+ if (PyUnicode_READY(lineobj) == -1) {
Py_DECREF(lineobj);
return NULL;
}
+ ++self->line_num;
+ kind = PyUnicode_KIND(lineobj);
+ data = PyUnicode_DATA(lineobj);
+ pos = 0;
+ linelen = PyUnicode_GET_LENGTH(lineobj);
while (linelen--) {
- c = *line++;
+ c = PyUnicode_READ(kind, data, pos);
if (c == '\0') {
Py_DECREF(lineobj);
- PyErr_Format(error_obj,
+ PyErr_Format(_csvstate_global->error_obj,
"line contains NULL byte");
goto err;
}
@@ -797,6 +830,7 @@ Reader_iternext(ReaderObj *self)
Py_DECREF(lineobj);
goto err;
}
+ pos++;
}
Py_DECREF(lineobj);
if (parse_process_char(self, 0) < 0)
@@ -953,13 +987,13 @@ join_reset(WriterObj *self)
* record length.
*/
static Py_ssize_t
-join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty,
- int *quoted, int copy_phase)
+join_append_data(WriterObj *self, unsigned int field_kind, void *field_data,
+ Py_ssize_t field_len, int quote_empty, int *quoted,
+ int copy_phase)
{
DialectObj *dialect = self->dialect;
int i;
Py_ssize_t rec_len;
- Py_UNICODE *lineterm;
#define ADDCH(c) \
do {\
@@ -968,10 +1002,6 @@ join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty,
rec_len++;\
} while(0)
- lineterm = PyUnicode_AsUnicode(dialect->lineterminator);
- if (lineterm == NULL)
- return -1;
-
rec_len = self->rec_len;
/* If this is not the first field we need a field separator */
@@ -984,17 +1014,16 @@ join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty,
/* Copy/count field data */
/* If field is null just pass over */
- for (i = 0; field; i++) {
- Py_UNICODE c = field[i];
+ for (i = 0; field_data && (i < field_len); i++) {
+ Py_UCS4 c = PyUnicode_READ(field_kind, field_data, i);
int want_escape = 0;
- if (c == '\0')
- break;
-
if (c == dialect->delimiter ||
c == dialect->escapechar ||
c == dialect->quotechar ||
- Py_UNICODE_strchr(lineterm, c)) {
+ PyUnicode_FindChar(
+ dialect->lineterminator, c, 0,
+ PyUnicode_GET_LENGTH(dialect->lineterminator), 1) >= 0) {
if (dialect->quoting == QUOTE_NONE)
want_escape = 1;
else {
@@ -1009,7 +1038,7 @@ join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty,
}
if (want_escape) {
if (!dialect->escapechar) {
- PyErr_Format(error_obj,
+ PyErr_Format(_csvstate_global->error_obj,
"need to escape, but no escapechar set");
return -1;
}
@@ -1025,7 +1054,7 @@ join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty,
*/
if (i == 0 && quote_empty) {
if (dialect->quoting == QUOTE_NONE) {
- PyErr_Format(error_obj,
+ PyErr_Format(_csvstate_global->error_obj,
"single empty field record must be quoted");
return -1;
}
@@ -1057,14 +1086,13 @@ join_check_rec_size(WriterObj *self, Py_ssize_t rec_len)
self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;
if (self->rec != NULL)
PyMem_Free(self->rec);
- self->rec = PyMem_New(Py_UNICODE, self->rec_size);
+ self->rec = PyMem_New(Py_UCS4, self->rec_size);
}
else {
- Py_UNICODE* old_rec = self->rec;
+ Py_UCS4* old_rec = self->rec;
self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;
- self->rec = PyMem_Resize(self->rec, Py_UNICODE,
- self->rec_size);
+ self->rec = PyMem_Resize(old_rec, Py_UCS4, self->rec_size);
if (self->rec == NULL)
PyMem_Free(old_rec);
}
@@ -1077,11 +1105,22 @@ join_check_rec_size(WriterObj *self, Py_ssize_t rec_len)
}
static int
-join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty)
+join_append(WriterObj *self, PyObject *field, int *quoted, int quote_empty)
{
+ unsigned int field_kind = -1;
+ void *field_data = NULL;
+ Py_ssize_t field_len = 0;
Py_ssize_t rec_len;
- rec_len = join_append_data(self, field, quote_empty, quoted, 0);
+ if (field != NULL) {
+ if (PyUnicode_READY(field) == -1)
+ return 0;
+ field_kind = PyUnicode_KIND(field);
+ field_data = PyUnicode_DATA(field);
+ field_len = PyUnicode_GET_LENGTH(field);
+ }
+ rec_len = join_append_data(self, field_kind, field_data, field_len,
+ quote_empty, quoted, 0);
if (rec_len < 0)
return 0;
@@ -1089,7 +1128,8 @@ join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty)
if (!join_check_rec_size(self, rec_len))
return 0;
- self->rec_len = join_append_data(self, field, quote_empty, quoted, 1);
+ self->rec_len = join_append_data(self, field_kind, field_data, field_len,
+ quote_empty, quoted, 1);
self->num_fields++;
return 1;
@@ -1098,10 +1138,11 @@ join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty)
static int
join_append_lineterminator(WriterObj *self)
{
- Py_ssize_t terminator_len;
- Py_UNICODE *terminator;
+ Py_ssize_t terminator_len, i;
+ unsigned int term_kind;
+ void *term_data;
- terminator_len = PyUnicode_GetSize(self->dialect->lineterminator);
+ terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator);
if (terminator_len == -1)
return 0;
@@ -1109,11 +1150,10 @@ join_append_lineterminator(WriterObj *self)
if (!join_check_rec_size(self, self->rec_len + terminator_len))
return 0;
- terminator = PyUnicode_AsUnicode(self->dialect->lineterminator);
- if (terminator == NULL)
- return 0;
- memmove(self->rec + self->rec_len, terminator,
- sizeof(Py_UNICODE)*terminator_len);
+ term_kind = PyUnicode_KIND(self->dialect->lineterminator);
+ term_data = PyUnicode_DATA(self->dialect->lineterminator);
+ for (i = 0; i < terminator_len; i++)
+ self->rec[self->rec_len + i] = PyUnicode_READ(term_kind, term_data, i);
self->rec_len += terminator_len;
return 1;
@@ -1130,9 +1170,10 @@ csv_writerow(WriterObj *self, PyObject *seq)
{
DialectObj *dialect = self->dialect;
Py_ssize_t len, i;
+ PyObject *line, *result;
if (!PySequence_Check(seq))
- return PyErr_Format(error_obj, "sequence expected");
+ return PyErr_Format(_csvstate_global->error_obj, "sequence expected");
len = PySequence_Length(seq);
if (len < 0)
@@ -1163,14 +1204,11 @@ csv_writerow(WriterObj *self, PyObject *seq)
}
if (PyUnicode_Check(field)) {
- append_ok = join_append(self,
- PyUnicode_AS_UNICODE(field),
- &quoted, len == 1);
+ append_ok = join_append(self, field, &quoted, len == 1);
Py_DECREF(field);
}
else if (field == Py_None) {
- append_ok = join_append(self, NULL,
- &quoted, len == 1);
+ append_ok = join_append(self, NULL, &quoted, len == 1);
Py_DECREF(field);
}
else {
@@ -1180,9 +1218,7 @@ csv_writerow(WriterObj *self, PyObject *seq)
Py_DECREF(field);
if (str == NULL)
return NULL;
- append_ok = join_append(self,
- PyUnicode_AS_UNICODE(str),
- &quoted, len == 1);
+ append_ok = join_append(self, str, &quoted, len == 1);
Py_DECREF(str);
}
if (!append_ok)
@@ -1194,9 +1230,13 @@ csv_writerow(WriterObj *self, PyObject *seq)
if (!join_append_lineterminator(self))
return 0;
- return PyObject_CallFunction(self->writeline,
- "(u#)", self->rec,
- self->rec_len);
+ line = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ (void *) self->rec, self->rec_len);
+ if (line == NULL)
+ return NULL;
+ result = PyObject_CallFunctionObjArgs(self->writeline, line, NULL);
+ Py_DECREF(line);
+ return result;
}
PyDoc_STRVAR(csv_writerows_doc,
@@ -1320,6 +1360,7 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args)
{
PyObject * output_file, * dialect = NULL;
WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type);
+ _Py_IDENTIFIER(write);
if (!self)
return NULL;
@@ -1336,7 +1377,7 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args)
Py_DECREF(self);
return NULL;
}
- self->writeline = PyObject_GetAttrString(output_file, "write");
+ self->writeline = _PyObject_GetAttrId(output_file, &PyId_write);
if (self->writeline == NULL || !PyCallable_Check(self->writeline)) {
PyErr_SetString(PyExc_TypeError,
"argument 1 must have a \"write\" method");
@@ -1358,7 +1399,7 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args)
static PyObject *
csv_list_dialects(PyObject *module, PyObject *args)
{
- return PyDict_Keys(dialects);
+ return PyDict_Keys(_csvstate_global->dialects);
}
static PyObject *
@@ -1369,15 +1410,17 @@ csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs)
if (!PyArg_UnpackTuple(args, "", 1, 2, &name_obj, &dialect_obj))
return NULL;
- if (!IS_BASESTRING(name_obj)) {
+ if (!PyUnicode_Check(name_obj)) {
PyErr_SetString(PyExc_TypeError,
- "dialect name must be a string or unicode");
+ "dialect name must be a string");
return NULL;
}
+ if (PyUnicode_READY(name_obj) == -1)
+ return NULL;
dialect = _call_dialect(dialect_obj, kwargs);
if (dialect == NULL)
return NULL;
- if (PyDict_SetItem(dialects, name_obj, dialect) < 0) {
+ if (PyDict_SetItem(_csvstate_global->dialects, name_obj, dialect) < 0) {
Py_DECREF(dialect);
return NULL;
}
@@ -1389,8 +1432,8 @@ csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs)
static PyObject *
csv_unregister_dialect(PyObject *module, PyObject *name_obj)
{
- if (PyDict_DelItem(dialects, name_obj) < 0)
- return PyErr_Format(error_obj, "unknown dialect");
+ if (PyDict_DelItem(_csvstate_global->dialects, name_obj) < 0)
+ return PyErr_Format(_csvstate_global->error_obj, "unknown dialect");
Py_INCREF(Py_None);
return Py_None;
}
@@ -1405,7 +1448,7 @@ static PyObject *
csv_field_size_limit(PyObject *module, PyObject *args)
{
PyObject *new_limit = NULL;
- long old_limit = field_limit;
+ long old_limit = _csvstate_global->field_limit;
if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit))
return NULL;
@@ -1415,9 +1458,9 @@ csv_field_size_limit(PyObject *module, PyObject *args)
"limit must be an integer");
return NULL;
}
- field_limit = PyLong_AsLong(new_limit);
- if (field_limit == -1 && PyErr_Occurred()) {
- field_limit = old_limit;
+ _csvstate_global->field_limit = PyLong_AsLong(new_limit);
+ if (_csvstate_global->field_limit == -1 && PyErr_Occurred()) {
+ _csvstate_global->field_limit = old_limit;
return NULL;
}
}
@@ -1556,17 +1599,16 @@ static struct PyMethodDef csv_methods[] = {
{ NULL, NULL }
};
-
static struct PyModuleDef _csvmodule = {
PyModuleDef_HEAD_INIT,
"_csv",
csv_module_doc,
- -1,
+ sizeof(_csvstate),
csv_methods,
NULL,
- NULL,
- NULL,
- NULL
+ _csv_traverse,
+ _csv_clear,
+ _csv_free
};
PyMODINIT_FUNC
@@ -1594,11 +1636,16 @@ PyInit__csv(void)
MODULE_VERSION) == -1)
return NULL;
+ /* Set the field limit */
+ _csvstate(module)->field_limit = 128 * 1024;
+ /* Do I still need to add this var to the Module Dict? */
+
/* Add _dialects dictionary */
- dialects = PyDict_New();
- if (dialects == NULL)
+ _csvstate(module)->dialects = PyDict_New();
+ if (_csvstate(module)->dialects == NULL)
return NULL;
- if (PyModule_AddObject(module, "_dialects", dialects))
+ Py_INCREF(_csvstate(module)->dialects);
+ if (PyModule_AddObject(module, "_dialects", _csvstate(module)->dialects))
return NULL;
/* Add quote styles into dictionary */
@@ -1614,9 +1661,10 @@ PyInit__csv(void)
return NULL;
/* Add the CSV exception object to the module. */
- error_obj = PyErr_NewException("_csv.Error", NULL, NULL);
- if (error_obj == NULL)
+ _csvstate(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL);
+ if (_csvstate(module)->error_obj == NULL)
return NULL;
- PyModule_AddObject(module, "Error", error_obj);
+ Py_INCREF(_csvstate(module)->error_obj);
+ PyModule_AddObject(module, "Error", _csvstate(module)->error_obj);
return module;
}
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 8be5958..7516306 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -1142,6 +1142,8 @@ static int
WCharArray_set_value(CDataObject *self, PyObject *value)
{
Py_ssize_t result = 0;
+ Py_UNICODE *wstr;
+ Py_ssize_t len;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
@@ -1155,7 +1157,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
return -1;
} else
Py_INCREF(value);
- if ((unsigned)PyUnicode_GET_SIZE(value) > self->b_size/sizeof(wchar_t)) {
+
+ wstr = PyUnicode_AsUnicodeAndSize(value, &len);
+ if (wstr == NULL)
+ return -1;
+ if ((unsigned)len > self->b_size/sizeof(wchar_t)) {
PyErr_SetString(PyExc_ValueError,
"string too long");
result = -1;
@@ -1843,11 +1849,9 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
if (PyUnicode_Check(proto)) {
- PyObject *v = _PyUnicode_AsDefaultEncodedString(proto, NULL);
- if (!v)
+ proto_str = PyUnicode_AsUTF8AndSize(proto, &proto_len);
+ if (!proto_str)
goto error;
- proto_str = PyBytes_AS_STRING(v);
- proto_len = PyBytes_GET_SIZE(v);
} else {
PyErr_SetString(PyExc_TypeError,
"class must define a '_type_' string attribute");
@@ -3681,8 +3685,10 @@ _build_result(PyObject *result, PyObject *callargs,
PyTuple_SET_ITEM(tup, index, v);
index++;
} else if (bit & outmask) {
+ _Py_IDENTIFIER(__ctypes_from_outparam__);
+
v = PyTuple_GET_ITEM(callargs, i);
- v = PyObject_CallMethod(v, "__ctypes_from_outparam__", NULL);
+ v = _PyObject_CallMethodId(v, &PyId___ctypes_from_outparam__, NULL);
if (v == NULL || numretvals == 1) {
Py_DECREF(callargs);
return v;
@@ -4249,7 +4255,7 @@ Array_subscript(PyObject *_self, PyObject *item)
wchar_t *dest;
if (slicelen <= 0)
- return PyUnicode_FromUnicode(NULL, 0);
+ return PyUnicode_New(0, 0);
if (step == 1) {
return PyUnicode_FromWideChar(ptr + start,
slicelen);
@@ -4599,38 +4605,20 @@ static PyNumberMethods Simple_as_number = {
static PyObject *
Simple_repr(CDataObject *self)
{
- PyObject *val, *name, *args, *result;
- static PyObject *format;
+ PyObject *val, *result;
if (Py_TYPE(self)->tp_base != &Simple_Type) {
return PyUnicode_FromFormat("<%s object at %p>",
Py_TYPE(self)->tp_name, self);
}
- if (format == NULL) {
- format = PyUnicode_InternFromString("%s(%r)");
- if (format == NULL)
- return NULL;
- }
-
val = Simple_get_value(self);
if (val == NULL)
return NULL;
- name = PyUnicode_FromString(Py_TYPE(self)->tp_name);
- if (name == NULL) {
- Py_DECREF(val);
- return NULL;
- }
-
- args = PyTuple_Pack(2, name, val);
- Py_DECREF(name);
+ result = PyUnicode_FromFormat("%s(%R)",
+ Py_TYPE(self)->tp_name, val);
Py_DECREF(val);
- if (args == NULL)
- return NULL;
-
- result = PyUnicode_Format(format, args);
- Py_DECREF(args);
return result;
}
@@ -4942,7 +4930,7 @@ Pointer_subscript(PyObject *_self, PyObject *item)
wchar_t *dest;
if (len <= 0)
- return PyUnicode_FromUnicode(NULL, 0);
+ return PyUnicode_New(0, 0);
if (step == 1) {
return PyUnicode_FromWideChar(ptr + start,
len);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 1f3c1c0..dd441f5 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -658,13 +658,6 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa)
#ifdef CTYPES_UNICODE
if (PyUnicode_Check(obj)) {
-#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
- pa->ffi_type = &ffi_type_pointer;
- pa->value.p = PyUnicode_AS_UNICODE(obj);
- Py_INCREF(obj);
- pa->keep = obj;
- return 0;
-#else
pa->ffi_type = &ffi_type_pointer;
pa->value.p = PyUnicode_AsWideCharString(obj, NULL);
if (pa->value.p == NULL)
@@ -675,7 +668,6 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa)
return -1;
}
return 0;
-#endif
}
#endif
@@ -952,9 +944,9 @@ void _ctypes_extend_error(PyObject *exc_class, char *fmt, ...)
else {
PyErr_Clear();
PyUnicode_AppendAndDel(&s, PyUnicode_FromString("???"));
- if (s == NULL)
- goto error;
}
+ if (s == NULL)
+ goto error;
PyErr_SetObject(exc_class, s);
error:
Py_XDECREF(tp);
@@ -1695,13 +1687,15 @@ unpickle(PyObject *self, PyObject *args)
PyObject *state;
PyObject *result;
PyObject *tmp;
+ _Py_IDENTIFIER(__new__);
+ _Py_IDENTIFIER(__setstate__);
if (!PyArg_ParseTuple(args, "OO", &typ, &state))
return NULL;
- result = PyObject_CallMethod(typ, "__new__", "O", typ);
+ result = _PyObject_CallMethodId(typ, &PyId___new__, "O", typ);
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "__setstate__", "O", state);
+ tmp = _PyObject_CallMethodId(result, &PyId___setstate__, "O", state);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 9da890d..f6f8e42 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -9,7 +9,6 @@
#define CTYPES_CFIELD_CAPSULE_NAME_PYMEM "_ctypes/cfield.c pymem"
-#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T
static void pymem_destructor(PyObject *ptr)
{
void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
@@ -17,7 +16,6 @@ static void pymem_destructor(PyObject *ptr)
PyMem_Free(p);
}
}
-#endif
/******************************************************************/
@@ -52,7 +50,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
{
CFieldObject *self;
PyObject *proto;
- Py_ssize_t size, align, length;
+ Py_ssize_t size, align;
SETFUNC setfunc = NULL;
GETFUNC getfunc = NULL;
StgDictObject *dict;
@@ -106,7 +104,6 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
}
size = dict->size;
- length = dict->length;
proto = desc;
/* Field descriptors for 'c_char * n' are be scpecial cased to
@@ -1214,37 +1211,30 @@ u_get(void *ptr, Py_ssize_t size)
static PyObject *
U_get(void *ptr, Py_ssize_t size)
{
- PyObject *result;
Py_ssize_t len;
- Py_UNICODE *p;
+ wchar_t *p;
size /= sizeof(wchar_t); /* we count character units here, not bytes */
- result = PyUnicode_FromWideChar((wchar_t *)ptr, size);
- if (!result)
- return NULL;
/* We need 'result' to be able to count the characters with wcslen,
since ptr may not be NUL terminated. If the length is smaller (if
it was actually NUL terminated, we construct a new one and throw
away the result.
*/
/* chop off at the first NUL character, if any. */
- p = PyUnicode_AS_UNICODE(result);
- for (len = 0; len < size; ++len)
+ p = (wchar_t*)ptr;
+ for (len = 0; len < size; ++len) {
if (!p[len])
break;
-
- if (len < size) {
- PyObject *ob = PyUnicode_FromWideChar((wchar_t *)ptr, len);
- Py_DECREF(result);
- return ob;
}
- return result;
+
+ return PyUnicode_FromWideChar((wchar_t *)ptr, len);
}
static PyObject *
U_set(void *ptr, PyObject *value, Py_ssize_t length)
{
+ Py_UNICODE *wstr;
Py_ssize_t size;
/* It's easier to calculate in characters than in bytes */
@@ -1257,7 +1247,10 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
return NULL;
} else
Py_INCREF(value);
- size = PyUnicode_GET_SIZE(value);
+
+ wstr = PyUnicode_AsUnicodeAndSize(value, &size);
+ if (wstr == NULL)
+ return NULL;
if (size > length) {
PyErr_Format(PyExc_ValueError,
"string too long (%zd, maximum length %zd)",
@@ -1377,6 +1370,9 @@ z_get(void *ptr, Py_ssize_t size)
static PyObject *
Z_set(void *ptr, PyObject *value, Py_ssize_t size)
{
+ PyObject *keep;
+ wchar_t *buffer;
+
if (value == Py_None) {
*(wchar_t **)ptr = NULL;
Py_INCREF(value);
@@ -1396,37 +1392,20 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size)
"unicode string or integer address expected instead of %s instance",
value->ob_type->tp_name);
return NULL;
- } else
- Py_INCREF(value);
-#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
- /* We can copy directly. Hm, are unicode objects always NUL
- terminated in Python, internally?
- */
- *(wchar_t **)ptr = (wchar_t *) PyUnicode_AS_UNICODE(value);
- return value;
-#else
- {
- /* We must create a wchar_t* buffer from the unicode object,
- and keep it alive */
- PyObject *keep;
- wchar_t *buffer;
-
- buffer = PyUnicode_AsWideCharString(value, NULL);
- if (!buffer) {
- Py_DECREF(value);
- return NULL;
- }
- keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
- if (!keep) {
- Py_DECREF(value);
- PyMem_Free(buffer);
- return NULL;
- }
- *(wchar_t **)ptr = (wchar_t *)buffer;
- Py_DECREF(value);
- return keep;
}
-#endif
+
+ /* We must create a wchar_t* buffer from the unicode object,
+ and keep it alive */
+ buffer = PyUnicode_AsWideCharString(value, NULL);
+ if (!buffer)
+ return NULL;
+ keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
+ if (!keep) {
+ PyMem_Free(buffer);
+ return NULL;
+ }
+ *(wchar_t **)ptr = buffer;
+ return keep;
}
static PyObject *
@@ -1471,13 +1450,16 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
/* create a BSTR from value */
if (value) {
- Py_ssize_t size = PyUnicode_GET_SIZE(value);
+ wchar_t* wvalue;
+ Py_ssize_t size;
+ wvalue = PyUnicode_AsUnicodeAndSize(value, &size);
+ if (wvalue == NULL)
+ return NULL;
if ((unsigned) size != size) {
PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
return NULL;
}
- bstr = SysAllocStringLen(PyUnicode_AS_UNICODE(value),
- (unsigned)size);
+ bstr = SysAllocStringLen(wvalue, (unsigned)size);
Py_DECREF(value);
} else
bstr = NULL;
diff --git a/Modules/_ctypes/libffi.diff b/Modules/_ctypes/libffi.diff
index 7afa0ed..357d0ee 100644
--- a/Modules/_ctypes/libffi.diff
+++ b/Modules/_ctypes/libffi.diff
@@ -1,74 +1,14 @@
-diff -urN libffi.orig/configure libffi/configure
---- libffi.orig/configure 2010-03-19 18:29:54.588499862 +0100
-+++ libffi/configure 2010-03-19 18:32:09.113499479 +0100
-@@ -11228,6 +11228,9 @@
- i?86-*-solaris2.1[0-9]*)
- TARGET=X86_64; TARGETDIR=x86
- ;;
-+ i*86-*-nto-qnx*)
-+ TARGET=X86; TARGETDIR=x86
-+ ;;
- i?86-*-*)
- TARGET=X86; TARGETDIR=x86
- ;;
-@@ -11245,12 +11248,12 @@
- ;;
-
- mips-sgi-irix5.* | mips-sgi-irix6.*)
-- TARGET=MIPS; TARGETDIR=mips
-+ TARGET=MIPS_IRIX; TARGETDIR=mips
- ;;
- mips*-*-linux*)
- # Support 128-bit long double for NewABI.
- HAVE_LONG_DOUBLE='defined(__mips64)'
-- TARGET=MIPS; TARGETDIR=mips
-+ TARGET=MIPS_IRIX; TARGETDIR=mips
- ;;
-
- powerpc*-*-linux* | powerpc-*-sysv*)
-@@ -11307,7 +11310,7 @@
- as_fn_error "\"libffi has not been ported to $host.\"" "$LINENO" 5
- fi
-
-- if test x$TARGET = xMIPS; then
-+ if expr x$TARGET : 'xMIPS' > /dev/null; then
- MIPS_TRUE=
- MIPS_FALSE='#'
- else
-@@ -12422,6 +12425,12 @@
- ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc"
-
-
-+ac_config_links="$ac_config_links include/ffi_common.h:include/ffi_common.h"
-+
-+
-+ac_config_files="$ac_config_files fficonfig.py"
-+
-+
- cat >confcache <<\_ACEOF
- # This file is a shell script that caches the results of configure
- # tests run on this system so they can be shared between configure
-@@ -13521,6 +13530,8 @@
- "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
- "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
- "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;;
-+ "include/ffi_common.h") CONFIG_LINKS="$CONFIG_LINKS include/ffi_common.h:include/ffi_common.h" ;;
-+ "fficonfig.py") CONFIG_FILES="$CONFIG_FILES fficonfig.py" ;;
-
- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
- esac
-diff -urN libffi.orig/configure.ac libffi/configure.ac
---- libffi.orig/configure.ac 2010-03-19 18:27:44.988498585 +0100
-+++ libffi/configure.ac 2010-03-19 18:31:29.252505178 +0100
+--- libffi.orig/configure.ac 2012-04-12 05:10:51.000000000 +0200
++++ libffi/configure.ac 2012-06-26 15:42:42.477498938 +0200
@@ -1,4 +1,7 @@
dnl Process this with autoconf to create configure
+#
+# file from libffi - slightly patched for ctypes
+#
- AC_PREREQ(2.63)
+ AC_PREREQ(2.68)
-@@ -91,6 +94,9 @@
+@@ -114,6 +117,9 @@
i?86-*-solaris2.1[[0-9]]*)
TARGET=X86_64; TARGETDIR=x86
;;
@@ -76,24 +16,24 @@ diff -urN libffi.orig/configure.ac libffi/configure.ac
+ TARGET=X86; TARGETDIR=x86
+ ;;
i?86-*-*)
- TARGET=X86; TARGETDIR=x86
+ TARGET=X86_64; TARGETDIR=x86
;;
-@@ -108,12 +114,12 @@
+@@ -131,12 +137,12 @@
;;
- mips-sgi-irix5.* | mips-sgi-irix6.*)
+ mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
- TARGET=MIPS; TARGETDIR=mips
+ TARGET=MIPS_IRIX; TARGETDIR=mips
;;
- mips*-*-linux*)
+ mips*-*-linux* | mips*-*-openbsd*)
# Support 128-bit long double for NewABI.
HAVE_LONG_DOUBLE='defined(__mips64)'
- TARGET=MIPS; TARGETDIR=mips
+ TARGET=MIPS_IRIX; TARGETDIR=mips
;;
- powerpc*-*-linux* | powerpc-*-sysv*)
-@@ -170,7 +176,7 @@
+ moxie-*-*)
+@@ -212,7 +218,7 @@
AC_MSG_ERROR(["libffi has not been ported to $host."])
fi
@@ -102,7 +42,7 @@ diff -urN libffi.orig/configure.ac libffi/configure.ac
AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
AM_CONDITIONAL(X86, test x$TARGET = xX86)
AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD)
-@@ -401,4 +407,8 @@
+@@ -499,4 +505,8 @@
AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
@@ -111,3 +51,70 @@ diff -urN libffi.orig/configure.ac libffi/configure.ac
+AC_CONFIG_FILES(fficonfig.py)
+
AC_OUTPUT
+--- libffi-3.0.11/fficonfig.py.in 1970-01-01 01:00:00.000000000 +0100
++++ libffi/fficonfig.py.in 2012-03-15 01:04:27.000000000 +0100
+@@ -0,0 +1,35 @@
++ffi_sources = """
++src/prep_cif.c
++src/closures.c
++src/dlmalloc.c
++""".split()
++
++ffi_platforms = {
++ 'MIPS_IRIX': ['src/mips/ffi.c', 'src/mips/o32.S', 'src/mips/n32.S'],
++ 'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S'],
++ 'X86': ['src/x86/ffi.c', 'src/x86/sysv.S'],
++ 'X86_FREEBSD': ['src/x86/ffi.c', 'src/x86/freebsd.S'],
++ 'X86_WIN32': ['src/x86/ffi.c', 'src/x86/win32.S'],
++ 'SPARC': ['src/sparc/ffi.c', 'src/sparc/v8.S', 'src/sparc/v9.S'],
++ 'ALPHA': ['src/alpha/ffi.c', 'src/alpha/osf.S'],
++ 'IA64': ['src/ia64/ffi.c', 'src/ia64/unix.S'],
++ 'M32R': ['src/m32r/sysv.S', 'src/m32r/ffi.c'],
++ 'M68K': ['src/m68k/ffi.c', 'src/m68k/sysv.S'],
++ 'POWERPC': ['src/powerpc/ffi.c', 'src/powerpc/sysv.S', 'src/powerpc/ppc_closure.S', 'src/powerpc/linux64.S', 'src/powerpc/linux64_closure.S'],
++ 'POWERPC_AIX': ['src/powerpc/ffi.c', 'src/powerpc/aix.S', 'src/powerpc/aix_closure.S'],
++ 'POWERPC_FREEBSD': ['src/powerpc/ffi.c', 'src/powerpc/sysv.S', 'src/powerpc/ppc_closure.S'],
++ 'ARM': ['src/arm/sysv.S', 'src/arm/ffi.c'],
++ 'LIBFFI_CRIS': ['src/cris/sysv.S', 'src/cris/ffi.c'],
++ 'FRV': ['src/frv/eabi.S', 'src/frv/ffi.c'],
++ 'S390': ['src/s390/sysv.S', 'src/s390/ffi.c'],
++ 'X86_64': ['src/x86/ffi64.c', 'src/x86/unix64.S', 'src/x86/ffi.c', 'src/x86/sysv.S'],
++ 'SH': ['src/sh/sysv.S', 'src/sh/ffi.c'],
++ 'SH64': ['src/sh64/sysv.S', 'src/sh64/ffi.c'],
++ 'PA': ['src/pa/linux.S', 'src/pa/ffi.c'],
++ 'PA_LINUX': ['src/pa/linux.S', 'src/pa/ffi.c'],
++ 'PA_HPUX': ['src/pa/hpux32.S', 'src/pa/ffi.c'],
++}
++
++ffi_sources += ffi_platforms['@TARGET@']
++
++ffi_cflags = '@CFLAGS@'
+diff -urN libffi-3.0.11/src/dlmalloc.c libffi/src/dlmalloc.c
+--- libffi-3.0.11/src/dlmalloc.c 2012-04-12 04:46:06.000000000 +0200
++++ libffi/src/dlmalloc.c 2012-06-26 15:15:58.949547461 +0200
+@@ -457,6 +457,11 @@
+ #define LACKS_ERRNO_H
+ #define MALLOC_FAILURE_ACTION
+ #define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
++#elif !defined _GNU_SOURCE
++/* mremap() on Linux requires this via sys/mman.h
++ * See roundup issue 10309
++ */
++#define _GNU_SOURCE 1
+ #endif /* WIN32 */
+
+ #ifdef __OS2__
+diff -urN libffi-3.0.11/src/sparc/v8.S libffi/src/sparc/v8.S
+--- libffi-3.0.11/src/sparc/v8.S 2012-04-12 04:46:06.000000000 +0200
++++ libffi/src/sparc/v8.S 2011-03-13 05:15:04.000000000 +0100
+@@ -213,6 +213,10 @@
+ be,a done1
+ ldd [%fp-8], %i0
+
++ cmp %o0, FFI_TYPE_UINT64
++ be,a done1
++ ldd [%fp-8], %i0
++
+ ld [%fp-8], %i0
+ done1:
+ jmp %i7+8
diff --git a/Modules/_ctypes/libffi/ChangeLog b/Modules/_ctypes/libffi/ChangeLog
index 00ba7ef..f4148a9 100644
--- a/Modules/_ctypes/libffi/ChangeLog
+++ b/Modules/_ctypes/libffi/ChangeLog
@@ -1,8 +1,911 @@
+2012-04-11 Anthony Green <green@moxielogic.com>
+
+ * Makefile.am (EXTRA_DIST): Add new script.
+ * Makefile.in: Rebuilt.
+
+2012-04-11 Zachary Waldowski <zwaldowski@gmail.com>
+
+ * generate-ios-source-and-headers.py,
+ libffi.xcodeproj/project.pbxproj: Support a Mac static library via
+ Xcode. Set iOS compatibility to 4.0. Move iOS trampoline
+ generation into an Xcode "run script" phase. Include both as
+ Xcode build scripts. Don't always regenerate config files.
+
+2012-04-10 Anthony Green <green@moxielogic.com>
+
+ * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon.
+
+2012-04-06 Anthony Green <green@moxielogic.com>
+
+ * Makefile.am (EXTRA_DIST): Add new iOS/xcode files.
+ * Makefile.in: Rebuilt.
+
+2012-04-06 Mike Lewis <mikelikespie@gmail.com>
+
+ * generate-ios-source-and-headers.py: New file.
+ * libffi.xcodeproj/project.pbxproj: New file.
+ * README: Update instructions on building iOS binary.
+ * build-ios.sh: Delete.
+
+2012-04-06 H.J. Lu <hongjiu.lu@intel.com>
+
+ * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32.
+
+2012-04-06 Anthony Green <green@moxielogic.com>
+
+ * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU
+ compilers, then use it.
+
+2012-04-06 Anthony Green <green@moxielogic.com>
+
+ * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases.
+ * testsuite/Makefile.in: Rebuilt.
+
+2012-04-05 Zachary Waldowski <zwaldowski@gmail.com>
+
+ * include/ffi.h.in: Add missing trampoline table fields.
+ * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references
+ in CNAME.
+ * src/x86/ffi.c: Wrap Windows specific code in ifdefs.
+
+2012-04-02 Peter Rosin <peda@lysator.liu.se>
+
+ * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return
+ value in the Intel version as is already done for the AT&T version.
+ (ffi_closure_SYSV): Likewise.
+ (ffi_closure_raw_SYSV): Likewise.
+ (ffi_closure_STDCALL): Likewise.
+
+2012-03-29 Peter Rosin <peda@lysator.liu.se>
+
+ * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame
+ generation, fix the ENDP label and remove the surplus third arg
+ from the 'lea' insn.
+
+2012-03-29 Peter Rosin <peda@lysator.liu.se>
+
+ * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label
+ visible outside the PROC, so that ffi_closure_raw_THISCALL can see
+ it. Also instruct the assembler to add a frame to the function.
+
+2012-03-23 Peter Rosin <peda@lysator.liu.se>
+
+ * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING.
+ * Makefile.in: Rebuilt.
+ * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations
+ to all data exports, when compiling libffi clients using MSVC.
+
+2012-03-29 Peter Rosin <peda@lysator.liu.se>
+
+ * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and
+ make it the default for MSVC.
+ (FFI_TYPE_MS_STRUCT): New structure return convention.
+ * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure
+ return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT
+ instead of an ordinary FFI_TYPE_STRUCT.
+ (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT.
+ (ffi_call): Likewise.
+ (ffi_prep_incoming_args_SYSV): Likewise.
+ (ffi_raw_call): Likewise.
+ (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV.
+ * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT,
+ return a pointer to the result structure in eax and don't pop
+ that pointer from the stack, the caller takes care of it.
+ (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT.
+ (ffi_closure_raw_SYSV): Likewise.
+
+2012-03-22 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline
+ assembly version with Intel syntax.
+ * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise.
+
+2012-03-23 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/ffitest.h: Provide abstration of
+ __attribute__((fastcall)) in the form of a __FASTCALL__
+ define. Define it to __fastcall for MSVC.
+ * testsuite/libffi.call/fastthis1_win32.c: Use the above.
+ * testsuite/libffi.call/fastthis2_win32.c: Likewise.
+ * testsuite/libffi.call/fastthis3_win32.c: Likewise.
+ * testsuite/libffi.call/strlen2_win32.c: Likewise.
+ * testsuite/libffi.call/struct1_win32.c: Likewise.
+ * testsuite/libffi.call/struct2_win32.c: Likewise.
+
+2012-03-22 Peter Rosin <peda@lysator.liu.se>
+
+ * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual
+ frame on function entry, MASM adds one automatically.
+
+2012-03-22 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing
+ bits in the MSVC headers.
+
+2012-03-22 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style
+ with no declarations after statements.
+ * testsuite/libffi.call/cls_16byte.c: Likewise.
+ * testsuite/libffi.call/cls_18byte.c: Likewise.
+ * testsuite/libffi.call/cls_19byte.c: Likewise.
+ * testsuite/libffi.call/cls_1_1byte.c: Likewise.
+ * testsuite/libffi.call/cls_20byte.c: Likewise.
+ * testsuite/libffi.call/cls_20byte1.c: Likewise.
+ * testsuite/libffi.call/cls_24byte.c: Likewise.
+ * testsuite/libffi.call/cls_2byte.c: Likewise.
+ * testsuite/libffi.call/cls_3_1byte.c: Likewise.
+ * testsuite/libffi.call/cls_3byte1.c: Likewise.
+ * testsuite/libffi.call/cls_3byte2.c: Likewise.
+ * testsuite/libffi.call/cls_4_1byte.c: Likewise.
+ * testsuite/libffi.call/cls_4byte.c: Likewise.
+ * testsuite/libffi.call/cls_5_1_byte.c: Likewise.
+ * testsuite/libffi.call/cls_5byte.c: Likewise.
+ * testsuite/libffi.call/cls_64byte.c: Likewise.
+ * testsuite/libffi.call/cls_6_1_byte.c: Likewise.
+ * testsuite/libffi.call/cls_6byte.c: Likewise.
+ * testsuite/libffi.call/cls_7_1_byte.c: Likewise.
+ * testsuite/libffi.call/cls_7byte.c: Likewise.
+ * testsuite/libffi.call/cls_8byte.c: Likewise.
+ * testsuite/libffi.call/cls_9byte1.c: Likewise.
+ * testsuite/libffi.call/cls_9byte2.c: Likewise.
+ * testsuite/libffi.call/cls_align_double.c: Likewise.
+ * testsuite/libffi.call/cls_align_float.c: Likewise.
+ * testsuite/libffi.call/cls_align_longdouble.c: Likewise.
+ * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise.
+ * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise.
+ * testsuite/libffi.call/cls_align_pointer.c: Likewise.
+ * testsuite/libffi.call/cls_align_sint16.c: Likewise.
+ * testsuite/libffi.call/cls_align_sint32.c: Likewise.
+ * testsuite/libffi.call/cls_align_sint64.c: Likewise.
+ * testsuite/libffi.call/cls_align_uint16.c: Likewise.
+ * testsuite/libffi.call/cls_align_uint32.c: Likewise.
+ * testsuite/libffi.call/cls_align_uint64.c: Likewise.
+ * testsuite/libffi.call/cls_dbls_struct.c: Likewise.
+ * testsuite/libffi.call/cls_pointer_stack.c: Likewise.
+ * testsuite/libffi.call/err_bad_typedef.c: Likewise.
+ * testsuite/libffi.call/huge_struct.c: Likewise.
+ * testsuite/libffi.call/nested_struct.c: Likewise.
+ * testsuite/libffi.call/nested_struct1.c: Likewise.
+ * testsuite/libffi.call/nested_struct10.c: Likewise.
+ * testsuite/libffi.call/nested_struct2.c: Likewise.
+ * testsuite/libffi.call/nested_struct3.c: Likewise.
+ * testsuite/libffi.call/nested_struct4.c: Likewise.
+ * testsuite/libffi.call/nested_struct5.c: Likewise.
+ * testsuite/libffi.call/nested_struct6.c: Likewise.
+ * testsuite/libffi.call/nested_struct7.c: Likewise.
+ * testsuite/libffi.call/nested_struct8.c: Likewise.
+ * testsuite/libffi.call/nested_struct9.c: Likewise.
+ * testsuite/libffi.call/stret_large.c: Likewise.
+ * testsuite/libffi.call/stret_large2.c: Likewise.
+ * testsuite/libffi.call/stret_medium.c: Likewise.
+ * testsuite/libffi.call/stret_medium2.c: Likewise.
+ * testsuite/libffi.call/struct1.c: Likewise.
+ * testsuite/libffi.call/struct1_win32.c: Likewise.
+ * testsuite/libffi.call/struct2.c: Likewise.
+ * testsuite/libffi.call/struct2_win32.c: Likewise.
+ * testsuite/libffi.call/struct3.c: Likewise.
+ * testsuite/libffi.call/struct4.c: Likewise.
+ * testsuite/libffi.call/struct5.c: Likewise.
+ * testsuite/libffi.call/struct6.c: Likewise.
+ * testsuite/libffi.call/struct7.c: Likewise.
+ * testsuite/libffi.call/struct8.c: Likewise.
+ * testsuite/libffi.call/struct9.c: Likewise.
+ * testsuite/libffi.call/testclosure.c: Likewise.
+
+2012-03-06 Chung-Lin Tang <cltang@codesourcery.com>
+
+ * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to
+ ffi_call_VFP().
+ (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of
+ ffi_closure_VFP.
+ * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code.
+
+2012-03-21 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when
+ printing doubles (%lf is for long doubles).
+ (main): Likewise.
+
+2012-03-21 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*]
+ (set_ld_library_path_env_vars): Add the library search dir to PATH
+ (and save PATH for later).
+ (restore_ld_library_path_env_vars): Restore PATH.
+
+2012-03-20 Peter Rosin <peda@lysator.liu.se>
+
+ * testsuite/libffi.call/strlen2_win32.c (main): Remove bug.
+ * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label
+ visible outside the PROC, so that ffi_closure_THISCALL can see it.
+
+2012-03-19 Alan Hourihane <alanh@fairlite.co.uk>
+
+ * src/m68k/ffi.c: Add MINT support.
+ * src/m68k/sysv.S: Ditto.
+
+2012-03-19 chennam <csit@axway.com>
+
+ * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure
+ support.
+
+2012-04-02 Peter Bergner <bergner@vnet.ibm.com>
+
+ * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp.
+ Silence casting pointer to integer of different size warning.
+ Delete goto to previously deleted label.
+ (ffi_call): Silence possibly undefined warning.
+ (ffi_closure_helper_SYSV): Declare variable type.
+
+2012-03-13 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
+ just return FFI_BAD_ABI when things are wrong.
+ * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto.
+
+2012-03-09 David Edelsohn <dje.gcc@gmail.com>
+
+ * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64
+ change to return value of ffi_closure_helper_DARWIN and load type
+ from return type.
+
+2012-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned
+ long.
+ (ffi_prep_closure_loc): Cast to 64bit address in trampoline.
+ (ffi_closure_unix64_inner): Cast return pointer to unsigned long
+ first.
+
+ * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32.
+ (ffi_arg): Set to unsigned long long for x32.
+ (ffi_sarg): Set to long long for x32.
+
+2012-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI.
+
+2012-03-03 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * configure.ac: Add -no-undefined for both 32- and 64-bit x86
+ windows-like hosts.
+ * configure: Rebuilt.
+
+2012-02-27 Mikael Pettersson <mikpe@it.uu.se>
+
+ PR libffi/52223
+ * Makefile.am (FLAGS_TO_PASS): Define.
+ * Makefile.in: Regenerate.
+
+2012-02-23 Anthony Green <green@moxielogic.com>
+
+ * src/*/ffitarget.h: Ensure that users never include ffitarget.h
+ directly.
+
+2012-02-23 Kai Tietz <ktietz@redhat.com>
+
+ PR libffi/52221
+ * src/x86/ffi.c (ffi_closure_raw_THISCALL): New
+ prototype.
+ (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for
+ thiscall-convention.
+ (ffi_raw_call): Use ffi_prep_args_raw.
+ * src/x86/win32.S (ffi_closure_raw_THISCALL): Add
+ implementation for stub.
+
+2012-02-10 Kai Tietz <ktietz@redhat.com>
+
+ * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64
+ windows target.
+ * configure: Regenerated.
+
+2012-02-08 Kai Tietz <ktietz@redhat.com>
+
+ * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32
+ also FFI_THISCALL.
+ * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype.
+ (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code.
+ (ffi_prep_closure_loc): Add FFI_THISCALL support.
+ * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size.
+ * src/x86/win32.S (ffi_closure_THISCALL): New closure code
+ for thiscall-calling convention.
+ * testsuite/libffi.call/closure_thiscall.c: New test.
+
+2012-01-28 Kai Tietz <ktietz@redhat.com>
+
+ * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new
+ argument to prototype for specify calling-convention.
+ (ffi_call): Add support for stdcall/thiscall convention.
+ (ffi_prep_args): Likewise.
+ (ffi_raw_call): Likewise.
+ * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and
+ FFI_FASTCALL.
+ * src/x86/win32.S (_ffi_call_win32): Add support for
+ fastcall/thiscall calling-convention calls.
+ * testsuite/libffi.call/fastthis1_win32.c: New test.
+ * testsuite/libffi.call/fastthis2_win32.c: New test.
+ * testsuite/libffi.call/fastthis3_win32.c: New test.
+ * testsuite/libffi.call/strlen2_win32.c: New test.
+ * testsuite/libffi.call/many2_win32.c: New test.
+ * testsuite/libffi.call/struct1_win32.c: New test.
+ * testsuite/libffi.call/struct2_win32.c: New test.
+
+2012-01-23 Uros Bizjak <ubizjak@gmail.com>
+
+ * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI.
+
+2012-01-23 Anthony Green <green@moxielogic.com>
+ Chris Young <cdyoung@ntlworld.com>
+
+ * configure.ac: Add Amiga support.
+ * configure: Rebuilt.
+
+2012-01-23 Dmitry Nadezhin <dmitry.nadezhin@gmail.com>
+
+ * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions.
+
+2012-01-23 Andreas Schwab <schwab@linux-m68k.org>
+
+ * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain
+ mc68000. Test for __HAVE_68881__ in addition to __MC68881__.
+
+2012-01-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/48496
+ * src/ia64/ffi.c (ffi_call): Fix up aliasing violations.
+
+2012-01-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (i?86-*-*): Set TARGET to X86_64.
+ * configure: Regenerate.
+
+2011-12-07 Andrew Pinski <apinski@cavium.com>
+
+ PR libffi/50051
+ * src/mips/n32.S: Add ".set mips4".
+
+2011-11-21 Andreas Tobler <andreast@fgznet.ch>
+
+ * configure: Regenerate.
+
+2011-11-12 David Gilbert <david.gilbert@linaro.org>
+
+ * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h,
+ man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3,
+ man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h,
+ src/cris/ffi.c, src/prep_cif.c,
+ testsuite/libffi.call/cls_double_va.c,
+ testsuite/libffi.call/cls_longdouble_va.c,
+ testsuite/libffi.call/float_va.c: Many changes to support variadic
+ function calls.
+
+2011-11-12 Kyle Moffett <Kyle.D.Moffett@boeing.com>
+
+ * src/powerpc/ffi.c, src/powerpc/ffitarget.h,
+ src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for
+ softfloat powerpc variants.
+
+2011-11-12 Petr Salinger <Petr.Salinger@seznam.cz>
+
+ * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support.
+ * configure: Rebuilt.
+
+2011-11-12 Timothy Wall <twall@users.sf.net>
+
+ * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max
+ alignment of 4 for wince on ARM.
+
+2011-11-12 Kyle Moffett <Kyle.D.Moffett@boeing.com>
+ Anthony Green <green@moxielogic.com>
+
+ * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string
+ instructions (not available on some cores, like the PPC440).
+
+2011-11-12 Kimura Wataru <kimuraw@i.nifty.jp>
+
+ * m4/ax_enable_builddir: Change from string comparison to numeric
+ comparison for wc output.
+ * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS
+ X 10.7.
+ * configure: Rebuilt.
+
+2011-11-12 Anthony Green <green@moxielogic.com>
+
+ * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly
+ files with debug info.
+ * Makefile.in: Rebuilt.
+
+2011-11-12 Jasper Lievisse Adriaanse <jasper@openbsd.org>
+
+ * README: Update list of supported OpenBSD systems.
+
+2011-11-12 Anthony Green <green@moxielogic.com>
+
+ * libtool-version: Update.
+ * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if
+ FFI_DEBUG.
+ (libffi_la_SOURCES): Remove src/debug.c
+ (EXTRA_DIST): Add src/debug.c
+ * Makefile.in: Rebuilt.
+ * README: Update for 3.0.11.
+
+2011-11-10 Richard Henderson <rth@redhat.com>
+
+ * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check.
+ * configure, aclocal.m4: Rebuild.
+
+2011-09-04 Iain Sandoe <iains@gcc.gnu.org>
+
+ PR libffi/49594
+ * src/powerpc/darwin_closure.S (stubs): Make the stub binding
+ helper reference track the architecture pointer size.
+
+2011-08-25 Andrew Haley <aph@redhat.com>
+
+ * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly
+ instructions.
+ * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead.
+
+2011-07-11 Andrew Haley <aph@redhat.com>
+
+ * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache.
+
+2011-06-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * testsuite/libffi.call/cls_double_va.c: Move PR number to comment.
+ * testsuite/libffi.call/cls_longdouble_va.c: Likewise.
+
+2011-06-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR libffi/46660
+ * testsuite/libffi.call/cls_double_va.c: xfail dg-output on
+ mips-sgi-irix6*.
+ * testsuite/libffi.call/cls_longdouble_va.c: Likewise.
+
+2011-06-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8,
+ PRId8 instead of %hhu, %hhd.
+ * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8,
+ PRIu8): Define.
+ [__sgi__] (PRId8, PRIu8): Define.
+
+2011-04-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE):
+ Define.
+ Use them to handle ELF vs. ECOFF differences.
+ [__osf__] (_GLOBAL__F_ffi_call_osf): Define.
+
+2011-03-30 Timothy Wall <twall@users.sf.net>
+
+ * src/powerpc/darwin.S: Fix unknown FDE encoding.
+ * src/powerpc/darwin_closure.S: ditto.
+
+2011-02-25 Anthony Green <green@moxielogic.com>
+
+ * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more
+ 32-bit ABIs.
+
+2011-02-15 Anthony Green <green@moxielogic.com>
+
+ * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math.
+ * configure: Rebuilt.
+
+2011-02-13 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * configure: Regenerate.
+
+2011-02-13 Anthony Green <green@moxielogic.com>
+
+ * include/ffi_common.h (UNLIKELY, LIKELY): Define.
+ * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition.
+ * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition.
+
+ * src/prep_cif.c (initialize_aggregate): Convert assertion into
+ FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0.
+
+ * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
+ just return FFI_BAD_ABI when things are wrong.
+ * src/arm/ffi.c (ffi_prep_closure_loc): Ditto.
+ * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto.
+ * src/mips/ffi.c (ffi_prep_closure_loc): Ditto.
+ * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto.
+ * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto.
+
+2011-02-11 Anthony Green <green@moxielogic.com>
+
+ * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
+ just return FFI_BAD_ABI when things are wrong.
+
+2012-02-11 Eric Botcazou <ebotcazou@adacore.com>
+
+ * src/sparc/v9.S (STACKFRAME): Bump to 176.
+
+2011-02-09 Stuart Shelton <srcshelton@gmail.com>
+
+ http://bugs.gentoo.org/show_bug.cgi?id=286911
+ * src/mips/ffitarget.h: Clean up error messages.
+ * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to
+ ffi_raw*.
+ * include/ffi.h.in: Add pragma for SGI compiler.
+
+2011-02-09 Anthony Green <green@moxielogic.com>
+
+ * configure.ac: Add powerpc64-*-darwin* support.
+
+2011-02-09 Anthony Green <green@moxielogic.com>
+
+ * README: Mention Interix.
+
+2011-02-09 Jonathan Callen <abcd@gentoo.org>
+
+ * configure.ac: Add Interix to win32/cygwin/mingw case.
+ * configure: Ditto.
+ * src/closures.c: Treat Interix like Cygwin, instead of as a
+ generic win32.
+
+2011-02-09 Anthony Green <green@moxielogic.com>
+
+ * testsuite/libffi.call/err_bad_typedef.c: Remove xfail.
+ * testsuite/libffi.call/err_bad_abi.c: Remove xfail.
+ * src/x86/ffi64.c (UNLIKELY, LIKELY): Define.
+ (ffi_prep_closure_loc): Check for bad ABI.
+ * src/prep_cif.c (UNLIKELY, LIKELY): Define.
+ (initialize_aggregate): Check for bad types.
+
+2011-02-09 Landon Fuller <landonf@plausible.coop>
+
+ * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh,
+ src/arm/trampoline.S.
+ (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S.
+ * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define.
+ * src/arm/ffi.c (ffi_trampoline_table)
+ (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry)
+ (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET)
+ (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables)
+ (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free):
+ Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS).
+ (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case
+ separately.
+ * src/arm/sysv.S: Handle Apple iOS host.
+ * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case.
+ * build-ios.sh: New file.
+ * fficonfig.h.in, configure, Makefile.in: Rebuilt.
+ * README: Mention ARM iOS.
+
+2011-02-08 Oren Held <orenhe@il.ibm.com>
+
+ * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid
+ redefinition of mallinfo on HP-UX.
+
+2011-02-08 Ginn Chen <ginn.chen@oracle.com>
+
+ * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio
+ aggregate return ABI. Flush cache.
+ (ffi_prep_closure_loc): Flush cache.
+
+2011-02-11 Anthony Green <green@moxielogic.com>
+
+ From Tom Honermann <tom.honermann@oracle.com>:
+ * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on
+ AIX. Declare .ffi_prep_args. Insert nops after branch
+ instructions so that the AIX linker can insert TOC reload
+ instructions.
+ * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN.
+
+2011-02-08 Ed <ed@kdtc.net>
+
+ * src/powerpc/asm.h: Fix grammar nit in comment.
+
+2011-02-08 Uli Link <ul.mcamafia@linkitup.de>
+
+ * include/ffi.h.in (FFI_64_BIT_MAX): Define and use.
+
+2011-02-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR libffi/46661
+ * testsuite/libffi.call/cls_pointer.c (main): Cast void * to
+ uintptr_t first.
+ * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise.
+
+2011-02-08 Rafael Avila de Espindola <respindola@mozilla.com>
+
+ * configure.ac: Fix x86 test for pc related relocs.
+ * configure: Rebuilt.
+
+2011-02-07 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing.
+ Handle case when CPU variant does not have long double support.
+ * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire,
+ and cores with soft floating point.
+
+2011-02-07 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * configure.ac: Add mips*-*-rtems* support.
+ * configure: Regenerate.
+ * src/mips/ffitarget.h: Ensure needed constants are available
+ for targets which do not have sgidefs.h.
+
+2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
+
+ PR target/40125
+ * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs.
+ * configure: Regenerate.
+
+2010-12-18 Iain Sandoe <iains@gcc.gnu.org>
+
+ PR libffi/29152
+ PR libffi/42378
+ * src/powerpc/darwin_closure.S: Provide Darwin64 implementation,
+ update comments.
+ * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New,
+ (FFI_TRAMPOLINE_SIZE): Update for Darwin64.
+ * src/powerpc/darwin.S: Provide Darwin64 implementation,
+ update comments.
+ * src/powerpc/ffi_darwin.c: Likewise.
+
+2010-12-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double
+ backslashes.
+ (libffi_cv_as_string_pseudo_op): Likewise.
+ * configure: Regenerate.
+
+2010-12-03 Chung-Lin Tang <cltang@codesourcery.com>
+
+ * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive.
+ (ffi_closure_VFP): Same.
+ (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp'
+ directive.
+
+2010-12-01 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define.
+ (PRIuPTR): Define.
+
+2010-11-29 Richard Henderson <rth@redhat.com>
+ Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define.
+ (.eh_frame): Use FDE_ENCODING.
+ (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE.
+
+2010-11-22 Jacek Caban <jacek@codeweavers.com>
+
+ * configure.ac: Check for symbol underscores on mingw-w64.
+ * configure: Rebuilt.
+ * src/x86/win64.S: Correctly access extern symbols in respect to
+ underscores.
+
+2010-11-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * testsuite/lib/libffi-dg.exp: Rename ...
+ * testsuite/lib/libffi.exp: ... to this.
+ * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp.
+ * libffi/testsuite/libffi.special/special.exp: Likewise.
+
+2010-10-28 Chung-Lin Tang <cltang@codesourcery.com>
+
+ * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling
+ code, new parameter, and return value. Update comments.
+ (ffi_prep_cif_machdep): Add case for VFP struct return values. Add
+ call to layout_vfp_args().
+ (ffi_call_SYSV): Update declaration.
+ (ffi_call_VFP): New declaration.
+ (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP()
+ when ABI is FFI_VFP.
+ (ffi_closure_VFP): New declaration.
+ (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to
+ ffi_prep_incoming_args_SYSV().
+ (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument
+ case handling.
+ (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline
+ construction under VFP hard-float.
+ (rec_vfp_type_p): New function.
+ (vfp_type_p): Same.
+ (place_vfp_arg): Same.
+ (layout_vfp_args): Same.
+ * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI
+ based on __ARM_PCS_VFP.
+ (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific
+ fields.
+ (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code.
+ (FFI_TYPE_STRUCT_VFP_DOUBLE): Same.
+ * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to
+ direct call. Move function pointer load upwards.
+ (ffi_call_VFP): New function.
+ (ffi_closure_VFP): Same.
+
+ * testsuite/lib/libffi-dg.exp (check-flags): New function.
+ (dg-skip-if): New function.
+ * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-*
+ and compiler options include -mfloat-abi=hard.
+ * testsuite/libffi.call/cls_longdouble_va.c: Same.
+
+2010-10-01 Jakub Jelinek <jakub@redhat.com>
+
+ PR libffi/45677
+ * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is
+ a multiple of 8.
+ * testsuite/libffi.call/many2.c: New test.
+
+2010-08-20 Mark Wielaard <mjw@redhat.com>
+
+ * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r
+ returns NULL.
+
+2010-08-09 Andreas Tobler <andreast@fgznet.ch>
+
+ * configure.ac: Add target powerpc64-*-freebsd*.
+ * configure: Regenerate.
+ * testsuite/libffi.call/cls_align_longdouble_split.c: Pass
+ -mlong-double-128 only to linux targets.
+ * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise.
+ * testsuite/libffi.call/cls_longdouble.c: Likewise.
+ * testsuite/libffi.call/huge_struct.c: Likewise.
+
+2010-08-05 Dan Witte <dwitte@mozilla.com>
+
+ * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the
+ debug CRT when --enable-debug is given.
+ * configure.ac: Define it.
+ * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately.
+
+2010-08-04 Dan Witte <dwitte@mozilla.com>
+
+ * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64
+ platforms.
+ * src/x86/ffi.c: Remove redundant ifdef checks.
+ * src/prep_cif.c: Push stack space computation into src/x86/ffi.c
+ for X86_ANY so return value space doesn't get added twice.
+
+2010-08-03 Neil Rashbrooke <neil@parkwaycc.co.uk>
+
+ * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy.
+
+2010-07-22 Dan Witte <dwitte@mozilla.com>
+
+ * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI.
+ * src/prep_cif.c: Fix ABI assertion.
+ * src/cris/ffi.c: Ditto.
+
+2010-07-10 Evan Phoenix <evan@fallingsnow.net>
+
+ * src/closures.c (selinux_enabled_check): Fix strncmp usage bug.
+
+2010-07-07 Dan Horák <dan@danny.cz>
+
+ * include/ffi.h.in: Protect #define with #ifndef.
+ * src/powerpc/ffitarget.h: Ditto.
+ * src/s390/ffitarget.h: Ditto.
+ * src/sparc/ffitarget.h: Ditto.
+
+2010-07-07 Neil Roberts <neil@linux.intel.com>
+
+ * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to
+ 16-bytes.
+
+2010-07-02 Jakub Jelinek <jakub@redhat.com>
+
+ * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes.
+ * Makefile.in: Regenerated.
+
+2010-05-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as
+ output, too.
+ (libffi_cv_as_ascii_pseudo_op): Check for .ascii.
+ (libffi_cv_as_string_pseudo_op): Check for .string.
+ * configure: Regenerate.
+ * fficonfig.h.in: Regenerate.
+ * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error.
+
+2010-05-11 Dan Witte <dwitte@mozilla.com>
+
+ * doc/libffi.tex: Document previous change.
+
+2010-05-11 Makoto Kato <m_kato@ga2.so-net.ne.jp>
+
+ * src/x86/ffi.c (ffi_call): Don't copy structs passed by value.
+
+2010-05-05 Michael Kohler <michaelkohler@live.com>
+
+ * src/dlmalloc.c (dlfree): Fix spelling.
+ * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto.
+ * configure.ac: Ditto.
+ * configure: Rebuilt.
+
+2010-04-13 Dan Witte <dwitte@mozilla.com>
+
+ * msvcc.sh: Build with -W3 instead of -Wall.
+ * src/powerpc/ffi_darwin.c: Remove build warnings.
+ * src/x86/ffi.c: Ditto.
+ * src/x86/ffitarget.h: Ditto.
+
+2010-04-12 Dan Witte <dwitte@mozilla.com>
+ Walter Meinl <wuno@lsvw.de>
+
+ * configure.ac: Add OS/2 support.
+ * configure: Rebuilt.
+ * src/closures.c: Ditto.
+ * src/dlmalloc.c: Ditto.
+ * src/x86/win32.S: Ditto.
+
+2010-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable.
+
+2010-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * Makefile.in: Regenerate.
+ * aclocal.m4: Regenerate.
+ * include/Makefile.in: Regenerate.
+ * man/Makefile.in: Regenerate.
+ * testsuite/Makefile.in: Regenerate.
+
+2010-03-30 Dan Witte <dwitte@mozilla.com>
+
+ * msvcc.sh: Disable build warnings.
+ * README (tested): Clarify windows build procedure.
+
+2010-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test.
+ * configure: Regenerate.
+ * fficonfig.h.in: Regenerate.
+ * libffi/src/x86/unix64.S (.eh_frame)
+ [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type.
+
2010-03-14 Matthias Klose <doko@ubuntu.com>
* src/x86/ffi64.c: Fix typo in comment.
* src/x86/ffi.c: Use /* ... */ comment style.
+2010-02-24 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * doc/libffi.texi (The Closure API): Fix typo.
+ * doc/libffi.info: Remove.
+
+2010-02-15 Matthias Klose <doko@ubuntu.com>
+
+ * src/arm/sysv.S (__ARM_ARCH__): Define for processor
+ __ARM_ARCH_7EM__.
+
+2010-01-15 Anthony Green <green@redhat.com>
+
+ * README: Add notes on building with Microsoft Visual C++.
+
+2010-01-15 Daniel Witte <dwitte@mozilla.com>
+
+ * msvcc.sh: New file.
+
+ * src/x86/win32.S: Port assembly routines to MSVC and #ifdef.
+ * src/x86/ffi.c: Tweak function declaration and remove excess
+ parens.
+ * include/ffi.h.in: Add __declspec(align(8)) to typedef struct
+ ffi_closure.
+
+ * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new
+ function ffi_call_win32 on X86_WIN32.
+ * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32.
+ (ffi_call_STDCALL): Remove.
+
+ * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code
+ to ffi_prep_cif_machdep for x86.
+ * src/x86/ffi.c (ffi_prep_cif_machdep): To here.
+
+2010-01-15 Oliver Kiddle <okiddle@yahoo.co.uk>
+
+ * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for
+ Sun Studio compiler compatibility.
+
+2010-01-12 Conrad Irwin <conrad.irwin@gmail.com>
+
+ * doc/libffi.texi: Add closure example.
+
2010-01-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libffi/40701
@@ -148,6 +1051,13 @@
* src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE
type on HP-UX.
+2012-02-13 Kai Tietz <ktietz@redhat.com>
+
+ PR libffi/52221
+ * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall
+ support for X86_WIN32.
+ (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement.
+
2009-12-11 Eric Botcazou <ebotcazou@adacore.com>
* src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long
@@ -322,6 +1232,11 @@
* man/Makefile.in: Regenerate.
* testsuite/Makefile.in: Regenerate.
+2011-08-22 Jasper Lievisse Adriaanse <jasper@openbsd.org>
+
+ * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support.
+ * configure: Rebuilt.
+
2009-07-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force.
diff --git a/Modules/_ctypes/libffi/ChangeLog.libffi b/Modules/_ctypes/libffi/ChangeLog.libffi
index 5272f33..f3ee8b0 100644
--- a/Modules/_ctypes/libffi/ChangeLog.libffi
+++ b/Modules/_ctypes/libffi/ChangeLog.libffi
@@ -1,35 +1,6 @@
-2010-01-15 Anthony Green <green@redhat.com>
+2011-02-08 Andreas Tobler <andreast@fgznet.ch>
- * README: Add notes on building with Microsoft Visual C++.
-
-2010-01-15 Daniel Witte <dwitte@mozilla.com>
-
- * msvcc.sh: New file.
-
- * src/x86/win32.S: Port assembly routines to MSVC and #ifdef.
- * src/x86/ffi.c: Tweak function declaration and remove excess
- parens.
- * include/ffi.h.in: Add __declspec(align(8)) to typedef struct
- ffi_closure.
-
- * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new
- function ffi_call_win32 on X86_WIN32.
- * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32.
- (ffi_call_STDCALL): Remove.
-
- * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code
- to ffi_prep_cif_machdep for x86.
- * src/x86/ffi.c (ffi_prep_cif_machdep): To here.
-
-2010-01-15 Oliver Kiddle <okiddle@yahoo.co.uk>
-
- * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for
- Sun Studio compiler compatibility.
-
-2010-01-12 Conrad Irwin <conrad.irwin@gmail.com>
-
- * doc/libffi.texi: Add closure example.
- * doc/libffi.info: Rebuilt.
+ * testsuite/lib/libffi.exp: Tweak for stand-alone mode.
2009-12-25 Samuli Suominen <ssuominen@gentoo.org>
diff --git a/Modules/_ctypes/libffi/LICENSE b/Modules/_ctypes/libffi/LICENSE
index ec2fd69..aa60342 100644
--- a/Modules/_ctypes/libffi/LICENSE
+++ b/Modules/_ctypes/libffi/LICENSE
@@ -1,4 +1,4 @@
-libffi - Copyright (c) 1996-2009 Anthony Green, Red Hat, Inc and others.
+libffi - Copyright (c) 1996-2012 Anthony Green, Red Hat, Inc and others.
See source files for details.
Permission is hereby granted, free of charge, to any person obtaining
@@ -9,8 +9,8 @@ distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
diff --git a/Modules/_ctypes/libffi/Makefile.am b/Modules/_ctypes/libffi/Makefile.am
index f47dd1a..4a855d7 100644
--- a/Modules/_ctypes/libffi/Makefile.am
+++ b/Modules/_ctypes/libffi/Makefile.am
@@ -10,29 +10,32 @@ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \
src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \
- src/ia64/unix.S \
- src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
- src/mips/ffitarget.h \
- src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
- src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \
- src/powerpc/ffi.c src/powerpc/sysv.S \
+ src/ia64/unix.S src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
+ src/mips/ffitarget.h src/m32r/ffi.c src/m32r/sysv.S \
+ src/m32r/ffitarget.h src/m68k/ffi.c src/m68k/sysv.S \
+ src/m68k/ffitarget.h src/powerpc/ffi.c src/powerpc/sysv.S \
src/powerpc/linux64.S src/powerpc/linux64_closure.S \
- src/powerpc/ppc_closure.S src/powerpc/asm.h \
- src/powerpc/aix.S src/powerpc/darwin.S \
- src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \
- src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \
- src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \
- src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \
- src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \
- src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \
- src/sparc/ffi.c src/x86/darwin64.S \
- src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/win64.S \
- src/x86/darwin.S src/x86/freebsd.S \
- src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \
- src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \
- src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
- libtool-version ChangeLog.libffi m4/libtool.m4 \
- m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
+ src/powerpc/ppc_closure.S src/powerpc/asm.h src/powerpc/aix.S \
+ src/powerpc/darwin.S src/powerpc/aix_closure.S \
+ src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \
+ src/powerpc/ffitarget.h src/s390/ffi.c src/s390/sysv.S \
+ src/s390/ffitarget.h src/sh/ffi.c src/sh/sysv.S \
+ src/sh/ffitarget.h src/sh64/ffi.c src/sh64/sysv.S \
+ src/sh64/ffitarget.h src/sparc/v8.S src/sparc/v9.S \
+ src/sparc/ffitarget.h src/sparc/ffi.c src/x86/darwin64.S \
+ src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/darwin.S \
+ src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
+ src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
+ src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
+ src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
+ src/moxie/ffi.c src/moxie/eabi.S libtool-version \
+ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
+ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \
+ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c \
+ msvcc.sh generate-ios-source-and-headers.py \
+ generate-osx-source-and-headers.py \
+ libffi.xcodeproj/project.pbxproj \
+ src/arm/trampoline.S
info_TEXINFOS = doc/libffi.texi
@@ -69,6 +72,7 @@ AM_MAKEFLAGS = \
"exec_prefix=$(exec_prefix)" \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
+ "mandir=$(mandir)" \
"prefix=$(prefix)" \
"AR=$(AR)" \
"AS=$(AS)" \
@@ -86,7 +90,7 @@ ACLOCAL_AMFLAGS=$(ACLOCAL_AMFLAGS) -I m4
lib_LTLIBRARIES = libffi.la
noinst_LTLIBRARIES = libffi_convenience.la
-libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+libffi_la_SOURCES = src/prep_cif.c src/types.c \
src/raw_api.c src/java_raw_api.c src/closures.c
pkgconfigdir = $(libdir)/pkgconfig
@@ -94,6 +98,10 @@ pkgconfig_DATA = libffi.pc
nodist_libffi_la_SOURCES =
+if FFI_DEBUG
+nodist_libffi_la_SOURCES += src/debug.c
+endif
+
if MIPS
nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S
endif
@@ -141,6 +149,9 @@ nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc
endif
if ARM
nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
+if FFI_EXEC_TRAMPOLINE_TABLE
+nodist_libffi_la_SOURCES += src/arm/trampoline.S
+endif
endif
if AVR32
nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c
@@ -151,6 +162,9 @@ endif
if FRV
nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c
endif
+if MOXIE
+nodist_libffi_la_SOURCES += src/moxie/eabi.S src/moxie/ffi.c
+endif
if S390
nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c
endif
@@ -173,12 +187,17 @@ endif
libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
-AM_CFLAGS = -Wall -g -fexceptions
+AM_CFLAGS = -g
+if FFI_DEBUG
+# Build debug. Define FFI_DEBUG on the commandline so that, when building with
+# MSVC, it can link against the debug CRT.
+AM_CFLAGS += -DFFI_DEBUG
+endif
libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
-AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
-AM_CCASFLAGS = $(AM_CPPFLAGS)
+AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -DFFI_BUILDING
+AM_CCASFLAGS = $(AM_CPPFLAGS) -g
# No install-html or install-pdf support in automake yet
.PHONY: install-html install-pdf
diff --git a/Modules/_ctypes/libffi/Makefile.in b/Modules/_ctypes/libffi/Makefile.in
index 49afcc1..43ed856 100644
--- a/Modules/_ctypes/libffi/Makefile.in
+++ b/Modules/_ctypes/libffi/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -36,38 +36,45 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-@MIPS_TRUE@am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
-@X86_TRUE@am__append_2 = src/x86/ffi.c src/x86/sysv.S
-@X86_FREEBSD_TRUE@am__append_3 = src/x86/ffi.c src/x86/freebsd.S
-@X86_WIN32_TRUE@am__append_4 = src/x86/ffi.c src/x86/win32.S
-@X86_WIN64_TRUE@am__append_5 = src/x86/ffi.c src/x86/win64.S
-@X86_DARWIN_TRUE@am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
-@SPARC_TRUE@am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
-@ALPHA_TRUE@am__append_8 = src/alpha/ffi.c src/alpha/osf.S
-@IA64_TRUE@am__append_9 = src/ia64/ffi.c src/ia64/unix.S
-@M32R_TRUE@am__append_10 = src/m32r/sysv.S src/m32r/ffi.c
-@M68K_TRUE@am__append_11 = src/m68k/ffi.c src/m68k/sysv.S
-@POWERPC_TRUE@am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
-@POWERPC_AIX_TRUE@am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
-@POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
-@POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
-@ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c
-@AVR32_TRUE@am__append_17 = src/avr32/sysv.S src/avr32/ffi.c
-@LIBFFI_CRIS_TRUE@am__append_18 = src/cris/sysv.S src/cris/ffi.c
-@FRV_TRUE@am__append_19 = src/frv/eabi.S src/frv/ffi.c
-@S390_TRUE@am__append_20 = src/s390/sysv.S src/s390/ffi.c
-@X86_64_TRUE@am__append_21 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
-@SH_TRUE@am__append_22 = src/sh/sysv.S src/sh/ffi.c
-@SH64_TRUE@am__append_23 = src/sh64/sysv.S src/sh64/ffi.c
-@PA_LINUX_TRUE@am__append_24 = src/pa/linux.S src/pa/ffi.c
-@PA_HPUX_TRUE@am__append_25 = src/pa/hpux32.S src/pa/ffi.c
+@FFI_DEBUG_TRUE@am__append_1 = src/debug.c
+@MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
+@X86_TRUE@am__append_3 = src/x86/ffi.c src/x86/sysv.S
+@X86_FREEBSD_TRUE@am__append_4 = src/x86/ffi.c src/x86/freebsd.S
+@X86_WIN32_TRUE@am__append_5 = src/x86/ffi.c src/x86/win32.S
+@X86_WIN64_TRUE@am__append_6 = src/x86/ffi.c src/x86/win64.S
+@X86_DARWIN_TRUE@am__append_7 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
+@SPARC_TRUE@am__append_8 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
+@ALPHA_TRUE@am__append_9 = src/alpha/ffi.c src/alpha/osf.S
+@IA64_TRUE@am__append_10 = src/ia64/ffi.c src/ia64/unix.S
+@M32R_TRUE@am__append_11 = src/m32r/sysv.S src/m32r/ffi.c
+@M68K_TRUE@am__append_12 = src/m68k/ffi.c src/m68k/sysv.S
+@POWERPC_TRUE@am__append_13 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
+@POWERPC_AIX_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+@POWERPC_DARWIN_TRUE@am__append_15 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+@POWERPC_FREEBSD_TRUE@am__append_16 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+@ARM_TRUE@am__append_17 = src/arm/sysv.S src/arm/ffi.c
+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_18 = src/arm/trampoline.S
+@AVR32_TRUE@am__append_19 = src/avr32/sysv.S src/avr32/ffi.c
+@LIBFFI_CRIS_TRUE@am__append_20 = src/cris/sysv.S src/cris/ffi.c
+@FRV_TRUE@am__append_21 = src/frv/eabi.S src/frv/ffi.c
+@MOXIE_TRUE@am__append_22 = src/moxie/eabi.S src/moxie/ffi.c
+@S390_TRUE@am__append_23 = src/s390/sysv.S src/s390/ffi.c
+@X86_64_TRUE@am__append_24 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
+@SH_TRUE@am__append_25 = src/sh/sysv.S src/sh/ffi.c
+@SH64_TRUE@am__append_26 = src/sh64/sysv.S src/sh64/ffi.c
+@PA_LINUX_TRUE@am__append_27 = src/pa/linux.S src/pa/ffi.c
+@PA_HPUX_TRUE@am__append_28 = src/pa/hpux32.S src/pa/ffi.c
+# Build debug. Define FFI_DEBUG on the commandline so that, when building with
+# MSVC, it can link against the debug CRT.
+@FFI_DEBUG_TRUE@am__append_29 = -DFFI_DEBUG
subdir = .
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
$(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \
- $(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \
- compile config.guess config.sub depcomp install-sh ltmain.sh \
- mdate-sh missing texinfo.tex
+ $(srcdir)/fficonfig.py.in $(srcdir)/libffi.pc.in \
+ $(top_srcdir)/configure ChangeLog compile config.guess \
+ config.sub depcomp install-sh ltmain.sh mdate-sh missing \
+ texinfo.tex
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
@@ -77,7 +84,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = fficonfig.h
-CONFIG_CLEAN_FILES = libffi.pc
+CONFIG_CLEAN_FILES = libffi.pc fficonfig.py
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
@@ -100,51 +107,60 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \
"$(DESTDIR)$(pkgconfigdir)"
LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
libffi_la_LIBADD =
am__dirstamp = $(am__leading_dot)dirstamp
-am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
- src/raw_api.lo src/java_raw_api.lo src/closures.lo
-@MIPS_TRUE@am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \
+am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \
+ src/java_raw_api.lo src/closures.lo
+@FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo
+@MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \
@MIPS_TRUE@ src/mips/n32.lo
-@X86_TRUE@am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo
-@X86_FREEBSD_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo
-@X86_WIN32_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/win32.lo
-@X86_WIN64_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win64.lo
-@X86_DARWIN_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \
+@X86_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/sysv.lo
+@X86_FREEBSD_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/freebsd.lo
+@X86_WIN32_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win32.lo
+@X86_WIN64_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win64.lo
+@X86_DARWIN_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/darwin.lo \
@X86_DARWIN_TRUE@ src/x86/ffi64.lo src/x86/darwin64.lo
-@SPARC_TRUE@am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \
+@SPARC_TRUE@am__objects_8 = src/sparc/ffi.lo src/sparc/v8.lo \
@SPARC_TRUE@ src/sparc/v9.lo
-@ALPHA_TRUE@am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo
-@IA64_TRUE@am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo
-@M32R_TRUE@am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo
-@M68K_TRUE@am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo
-@POWERPC_TRUE@am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \
+@ALPHA_TRUE@am__objects_9 = src/alpha/ffi.lo src/alpha/osf.lo
+@IA64_TRUE@am__objects_10 = src/ia64/ffi.lo src/ia64/unix.lo
+@M32R_TRUE@am__objects_11 = src/m32r/sysv.lo src/m32r/ffi.lo
+@M68K_TRUE@am__objects_12 = src/m68k/ffi.lo src/m68k/sysv.lo
+@POWERPC_TRUE@am__objects_13 = src/powerpc/ffi.lo src/powerpc/sysv.lo \
@POWERPC_TRUE@ src/powerpc/ppc_closure.lo \
@POWERPC_TRUE@ src/powerpc/linux64.lo \
@POWERPC_TRUE@ src/powerpc/linux64_closure.lo
-@POWERPC_AIX_TRUE@am__objects_13 = src/powerpc/ffi_darwin.lo \
+@POWERPC_AIX_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \
@POWERPC_AIX_TRUE@ src/powerpc/aix.lo \
@POWERPC_AIX_TRUE@ src/powerpc/aix_closure.lo
-@POWERPC_DARWIN_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \
+@POWERPC_DARWIN_TRUE@am__objects_15 = src/powerpc/ffi_darwin.lo \
@POWERPC_DARWIN_TRUE@ src/powerpc/darwin.lo \
@POWERPC_DARWIN_TRUE@ src/powerpc/darwin_closure.lo
-@POWERPC_FREEBSD_TRUE@am__objects_15 = src/powerpc/ffi.lo \
+@POWERPC_FREEBSD_TRUE@am__objects_16 = src/powerpc/ffi.lo \
@POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \
@POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo
-@ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo
-@AVR32_TRUE@am__objects_17 = src/avr32/sysv.lo src/avr32/ffi.lo
-@LIBFFI_CRIS_TRUE@am__objects_18 = src/cris/sysv.lo src/cris/ffi.lo
-@FRV_TRUE@am__objects_19 = src/frv/eabi.lo src/frv/ffi.lo
-@S390_TRUE@am__objects_20 = src/s390/sysv.lo src/s390/ffi.lo
-@X86_64_TRUE@am__objects_21 = src/x86/ffi64.lo src/x86/unix64.lo \
+@ARM_TRUE@am__objects_17 = src/arm/sysv.lo src/arm/ffi.lo
+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_18 = src/arm/trampoline.lo
+@AVR32_TRUE@am__objects_19 = src/avr32/sysv.lo src/avr32/ffi.lo
+@LIBFFI_CRIS_TRUE@am__objects_20 = src/cris/sysv.lo src/cris/ffi.lo
+@FRV_TRUE@am__objects_21 = src/frv/eabi.lo src/frv/ffi.lo
+@MOXIE_TRUE@am__objects_22 = src/moxie/eabi.lo src/moxie/ffi.lo
+@S390_TRUE@am__objects_23 = src/s390/sysv.lo src/s390/ffi.lo
+@X86_64_TRUE@am__objects_24 = src/x86/ffi64.lo src/x86/unix64.lo \
@X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo
-@SH_TRUE@am__objects_22 = src/sh/sysv.lo src/sh/ffi.lo
-@SH64_TRUE@am__objects_23 = src/sh64/sysv.lo src/sh64/ffi.lo
-@PA_LINUX_TRUE@am__objects_24 = src/pa/linux.lo src/pa/ffi.lo
-@PA_HPUX_TRUE@am__objects_25 = src/pa/hpux32.lo src/pa/ffi.lo
+@SH_TRUE@am__objects_25 = src/sh/sysv.lo src/sh/ffi.lo
+@SH64_TRUE@am__objects_26 = src/sh64/sysv.lo src/sh64/ffi.lo
+@PA_LINUX_TRUE@am__objects_27 = src/pa/linux.lo src/pa/ffi.lo
+@PA_HPUX_TRUE@am__objects_28 = src/pa/hpux32.lo src/pa/ffi.lo
nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
$(am__objects_3) $(am__objects_4) $(am__objects_5) \
$(am__objects_6) $(am__objects_7) $(am__objects_8) \
@@ -153,17 +169,18 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
$(am__objects_15) $(am__objects_16) $(am__objects_17) \
$(am__objects_18) $(am__objects_19) $(am__objects_20) \
$(am__objects_21) $(am__objects_22) $(am__objects_23) \
- $(am__objects_24) $(am__objects_25)
+ $(am__objects_24) $(am__objects_25) $(am__objects_26) \
+ $(am__objects_27) $(am__objects_28)
libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
$(nodist_libffi_la_OBJECTS)
libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
libffi_convenience_la_LIBADD =
-am__objects_26 = src/debug.lo src/prep_cif.lo src/types.lo \
- src/raw_api.lo src/java_raw_api.lo src/closures.lo
-am_libffi_convenience_la_OBJECTS = $(am__objects_26)
-am__objects_27 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+am__objects_29 = src/prep_cif.lo src/types.lo src/raw_api.lo \
+ src/java_raw_api.lo src/closures.lo
+am_libffi_convenience_la_OBJECTS = $(am__objects_29)
+am__objects_30 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
$(am__objects_4) $(am__objects_5) $(am__objects_6) \
$(am__objects_7) $(am__objects_8) $(am__objects_9) \
$(am__objects_10) $(am__objects_11) $(am__objects_12) \
@@ -171,8 +188,9 @@ am__objects_27 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
$(am__objects_16) $(am__objects_17) $(am__objects_18) \
$(am__objects_19) $(am__objects_20) $(am__objects_21) \
$(am__objects_22) $(am__objects_23) $(am__objects_24) \
- $(am__objects_25)
-nodist_libffi_convenience_la_OBJECTS = $(am__objects_27)
+ $(am__objects_25) $(am__objects_26) $(am__objects_27) \
+ $(am__objects_28)
+nodist_libffi_convenience_la_OBJECTS = $(am__objects_30)
libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
$(nodist_libffi_convenience_la_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@
@@ -229,9 +247,11 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
- { test ! -d "$(distdir)" \
- || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -fr "$(distdir)"; }; }
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
am__relativize = \
dir0=`pwd`; \
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -260,6 +280,8 @@ am__relativize = \
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
ALLOCA = @ALLOCA@
@@ -282,6 +304,7 @@ CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
@@ -289,6 +312,7 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
FGREP = @FGREP@
GREP = @GREP@
HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -307,6 +331,7 @@ LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
@@ -319,6 +344,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
@@ -333,6 +359,7 @@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
@@ -365,7 +392,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@@ -395,29 +421,32 @@ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \
src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \
- src/ia64/unix.S \
- src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
- src/mips/ffitarget.h \
- src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
- src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \
- src/powerpc/ffi.c src/powerpc/sysv.S \
+ src/ia64/unix.S src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
+ src/mips/ffitarget.h src/m32r/ffi.c src/m32r/sysv.S \
+ src/m32r/ffitarget.h src/m68k/ffi.c src/m68k/sysv.S \
+ src/m68k/ffitarget.h src/powerpc/ffi.c src/powerpc/sysv.S \
src/powerpc/linux64.S src/powerpc/linux64_closure.S \
- src/powerpc/ppc_closure.S src/powerpc/asm.h \
- src/powerpc/aix.S src/powerpc/darwin.S \
- src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \
- src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \
- src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \
- src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \
- src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \
- src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \
- src/sparc/ffi.c src/x86/darwin64.S \
- src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/win64.S \
- src/x86/darwin.S src/x86/freebsd.S \
- src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \
- src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \
- src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
- libtool-version ChangeLog.libffi m4/libtool.m4 \
- m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
+ src/powerpc/ppc_closure.S src/powerpc/asm.h src/powerpc/aix.S \
+ src/powerpc/darwin.S src/powerpc/aix_closure.S \
+ src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \
+ src/powerpc/ffitarget.h src/s390/ffi.c src/s390/sysv.S \
+ src/s390/ffitarget.h src/sh/ffi.c src/sh/sysv.S \
+ src/sh/ffitarget.h src/sh64/ffi.c src/sh64/sysv.S \
+ src/sh64/ffitarget.h src/sparc/v8.S src/sparc/v9.S \
+ src/sparc/ffitarget.h src/sparc/ffi.c src/x86/darwin64.S \
+ src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/darwin.S \
+ src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
+ src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
+ src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
+ src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
+ src/moxie/ffi.c src/moxie/eabi.S libtool-version \
+ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
+ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \
+ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c \
+ msvcc.sh generate-ios-source-and-headers.py \
+ generate-osx-source-and-headers.py \
+ libffi.xcodeproj/project.pbxproj \
+ src/arm/trampoline.S
info_TEXINFOS = doc/libffi.texi
@@ -448,6 +477,7 @@ AM_MAKEFLAGS = \
"exec_prefix=$(exec_prefix)" \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
+ "mandir=$(mandir)" \
"prefix=$(prefix)" \
"AR=$(AR)" \
"AS=$(AS)" \
@@ -462,7 +492,7 @@ MAKEOVERRIDES =
ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4
lib_LTLIBRARIES = libffi.la
noinst_LTLIBRARIES = libffi_convenience.la
-libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+libffi_la_SOURCES = src/prep_cif.c src/types.c \
src/raw_api.c src/java_raw_api.c src/closures.c
pkgconfigdir = $(libdir)/pkgconfig
@@ -475,19 +505,20 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \
$(am__append_15) $(am__append_16) $(am__append_17) \
$(am__append_18) $(am__append_19) $(am__append_20) \
$(am__append_21) $(am__append_22) $(am__append_23) \
- $(am__append_24) $(am__append_25)
+ $(am__append_24) $(am__append_25) $(am__append_26) \
+ $(am__append_27) $(am__append_28)
libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
-AM_CFLAGS = -Wall -g -fexceptions
-libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(AM_LTLDFLAGS)
-AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
-AM_CCASFLAGS = $(AM_CPPFLAGS)
+AM_CFLAGS = -g $(am__append_29)
+libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
+AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -DFFI_BUILDING
+AM_CCASFLAGS = $(AM_CPPFLAGS) -g
all: fficonfig.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
.SUFFIXES:
.SUFFIXES: .S .c .dvi .lo .o .obj .ps
-am--refresh:
+am--refresh: Makefile
@:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
@@ -523,10 +554,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
fficonfig.h: stamp-h1
- @if test ! -f $@; then \
- rm -f stamp-h1; \
- $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
- else :; fi
+ @if test ! -f $@; then rm -f stamp-h1; else :; fi
+ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status
@rm -f stamp-h1
@@ -540,6 +569,8 @@ distclean-hdr:
-rm -f fficonfig.h stamp-h1
libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $@
+fficonfig.py: $(top_builddir)/config.status $(srcdir)/fficonfig.py.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@@ -586,12 +617,12 @@ src/$(am__dirstamp):
src/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) src/$(DEPDIR)
@: > src/$(DEPDIR)/$(am__dirstamp)
-src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
src/mips/$(am__dirstamp):
@$(MKDIR_P) src/mips
@: > src/mips/$(am__dirstamp)
@@ -714,6 +745,8 @@ src/arm/sysv.lo: src/arm/$(am__dirstamp) \
src/arm/$(DEPDIR)/$(am__dirstamp)
src/arm/ffi.lo: src/arm/$(am__dirstamp) \
src/arm/$(DEPDIR)/$(am__dirstamp)
+src/arm/trampoline.lo: src/arm/$(am__dirstamp) \
+ src/arm/$(DEPDIR)/$(am__dirstamp)
src/avr32/$(am__dirstamp):
@$(MKDIR_P) src/avr32
@: > src/avr32/$(am__dirstamp)
@@ -744,6 +777,16 @@ src/frv/eabi.lo: src/frv/$(am__dirstamp) \
src/frv/$(DEPDIR)/$(am__dirstamp)
src/frv/ffi.lo: src/frv/$(am__dirstamp) \
src/frv/$(DEPDIR)/$(am__dirstamp)
+src/moxie/$(am__dirstamp):
+ @$(MKDIR_P) src/moxie
+ @: > src/moxie/$(am__dirstamp)
+src/moxie/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) src/moxie/$(DEPDIR)
+ @: > src/moxie/$(DEPDIR)/$(am__dirstamp)
+src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \
+ src/moxie/$(DEPDIR)/$(am__dirstamp)
+src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \
+ src/moxie/$(DEPDIR)/$(am__dirstamp)
src/s390/$(am__dirstamp):
@$(MKDIR_P) src/s390
@: > src/s390/$(am__dirstamp)
@@ -786,9 +829,9 @@ src/pa/linux.lo: src/pa/$(am__dirstamp) \
src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp)
src/pa/hpux32.lo: src/pa/$(am__dirstamp) \
src/pa/$(DEPDIR)/$(am__dirstamp)
-libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES)
+libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES)
$(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS)
-libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES)
+libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES)
$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS)
mostlyclean-compile:
@@ -801,6 +844,8 @@ mostlyclean-compile:
-rm -f src/arm/ffi.lo
-rm -f src/arm/sysv.$(OBJEXT)
-rm -f src/arm/sysv.lo
+ -rm -f src/arm/trampoline.$(OBJEXT)
+ -rm -f src/arm/trampoline.lo
-rm -f src/avr32/ffi.$(OBJEXT)
-rm -f src/avr32/ffi.lo
-rm -f src/avr32/sysv.$(OBJEXT)
@@ -837,6 +882,10 @@ mostlyclean-compile:
-rm -f src/mips/n32.lo
-rm -f src/mips/o32.$(OBJEXT)
-rm -f src/mips/o32.lo
+ -rm -f src/moxie/eabi.$(OBJEXT)
+ -rm -f src/moxie/eabi.lo
+ -rm -f src/moxie/ffi.$(OBJEXT)
+ -rm -f src/moxie/ffi.lo
-rm -f src/pa/ffi.$(OBJEXT)
-rm -f src/pa/ffi.lo
-rm -f src/pa/hpux32.$(OBJEXT)
@@ -919,6 +968,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
@@ -934,6 +984,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
@@ -1029,6 +1081,7 @@ clean-libtool:
-rm -rf src/m32r/.libs src/m32r/_libs
-rm -rf src/m68k/.libs src/m68k/_libs
-rm -rf src/mips/.libs src/mips/_libs
+ -rm -rf src/moxie/.libs src/moxie/_libs
-rm -rf src/pa/.libs src/pa/_libs
-rm -rf src/powerpc/.libs src/powerpc/_libs
-rm -rf src/s390/.libs src/s390/_libs
@@ -1221,9 +1274,7 @@ uninstall-pkgconfigDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
@@ -1232,7 +1283,7 @@ uninstall-pkgconfigDATA:
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
- @failcom='exit 1'; \
+ @fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
@@ -1257,7 +1308,7 @@ $(RECURSIVE_TARGETS):
fi; test -z "$$fail"
$(RECURSIVE_CLEAN_TARGETS):
- @failcom='exit 1'; \
+ @fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
@@ -1424,7 +1475,8 @@ distdir: $(DISTFILES)
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-info
-test -n "$(am__skip_mode_fix)" \
- || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
@@ -1434,7 +1486,11 @@ dist-gzip: distdir
$(am__remove_distdir)
dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
$(am__remove_distdir)
dist-lzma: distdir
@@ -1442,7 +1498,7 @@ dist-lzma: distdir
$(am__remove_distdir)
dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
$(am__remove_distdir)
dist-tarZ: distdir
@@ -1468,17 +1524,19 @@ dist dist-all: distdir
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
- GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
- bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \
- unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
*.tar.xz*) \
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
- GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
@@ -1492,6 +1550,7 @@ distcheck: dist
&& am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
@@ -1520,8 +1579,16 @@ distcheck: dist
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
- @$(am__cd) '$(distuninstallcheck_dir)' \
- && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
@@ -1555,10 +1622,15 @@ install-am: all-am
installcheck: installcheck-recursive
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -1587,6 +1659,8 @@ distclean-generic:
-rm -f src/m68k/$(am__dirstamp)
-rm -f src/mips/$(DEPDIR)/$(am__dirstamp)
-rm -f src/mips/$(am__dirstamp)
+ -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp)
+ -rm -f src/moxie/$(am__dirstamp)
-rm -f src/pa/$(DEPDIR)/$(am__dirstamp)
-rm -f src/pa/$(am__dirstamp)
-rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp)
@@ -1612,7 +1686,7 @@ clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
+ -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-tags
@@ -1654,13 +1728,14 @@ install-html-am: $(HTMLS)
for p in $$list; do \
if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
$(am__strip_dir) \
- if test -d "$$d$$p"; then \
+ d2=$$d$$p; \
+ if test -d "$$d2"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
$(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
- echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
- $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
else \
- list2="$$list2 $$d$$p"; \
+ list2="$$list2 $$d2"; \
fi; \
done; \
test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
@@ -1692,8 +1767,13 @@ install-info-am: $(INFO_DEPS)
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
@$(POST_INSTALL)
- @if (install-info --version && \
- install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ @am__run_installinfo=yes; \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) am__run_installinfo=no;; \
+ *) (install-info --version) >/dev/null 2>&1 \
+ || am__run_installinfo=no;; \
+ esac; \
+ if test $$am__run_installinfo = yes; then \
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
for file in $$list; do \
relfile=`echo "$$file" | sed 's|^.*/||'`; \
@@ -1732,7 +1812,7 @@ installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
- -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
+ -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
maintainer-clean-generic maintainer-clean-vti
@@ -1761,24 +1841,24 @@ uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
all all-am am--refresh check check-am clean clean-aminfo \
clean-generic clean-libLTLIBRARIES clean-libtool \
clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \
- dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \
- dist-xz dist-zip distcheck distclean distclean-compile \
- distclean-generic distclean-hdr distclean-libtool \
- distclean-tags distcleancheck distdir distuninstallcheck dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-libLTLIBRARIES \
- install-man install-pdf install-pdf-am install-pkgconfigDATA \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-aminfo maintainer-clean-generic \
- maintainer-clean-vti mostlyclean mostlyclean-aminfo \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am uninstall-dvi-am uninstall-html-am \
- uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \
- uninstall-pkgconfigDATA uninstall-ps-am
+ dist-bzip2 dist-gzip dist-info dist-lzip dist-lzma dist-shar \
+ dist-tarZ dist-xz dist-zip distcheck distclean \
+ distclean-compile distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+ install-pkgconfigDATA install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-aminfo mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-vti pdf pdf-am ps ps-am tags \
+ tags-recursive uninstall uninstall-am uninstall-dvi-am \
+ uninstall-html-am uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pdf-am uninstall-pkgconfigDATA uninstall-ps-am
# No install-html or install-pdf support in automake yet
diff --git a/Modules/_ctypes/libffi/README b/Modules/_ctypes/libffi/README
index 167de42..bcc7178 100644
--- a/Modules/_ctypes/libffi/README
+++ b/Modules/_ctypes/libffi/README
@@ -1,7 +1,7 @@
Status
======
-libffi-3.0.10 was released on XXXXXXXXXX, 2010. Check the libffi web
+libffi-3.0.11 was released on April 11, 2012. Check the libffi web
page for updates: <URL:http://sourceware.org/libffi/>.
@@ -43,7 +43,7 @@ Libffi has been ported to many different platforms.
For specific configuration details and testing status, please
refer to the wiki page here:
- http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.10
+ http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.11
At the time of release, the following basic configurations have been
tested:
@@ -54,12 +54,17 @@ tested:
| Alpha | Linux |
| Alpha | Tru64 |
| ARM | Linux |
+| ARM | iOS |
| AVR32 | Linux |
| HPPA | HPUX |
| IA-64 | Linux |
+| M68K | FreeMiNT |
+| M68K | RTEMS |
| MIPS | IRIX |
| MIPS | Linux |
+| MIPS | RTEMS |
| MIPS64 | Linux |
+| PowerPC | AMIGA |
| PowerPC | Linux |
| PowerPC | Mac OSX |
| PowerPC | FreeBSD |
@@ -71,15 +76,18 @@ tested:
| SPARC64 | Linux |
| SPARC64 | FreeBSD |
| X86 | FreeBSD |
+| X86 | Interix |
| X86 | kFreeBSD |
| X86 | Linux |
| X86 | Mac OSX |
| X86 | OpenBSD |
+| X86 | OS/2 |
| X86 | Solaris |
| X86 | Windows/Cygwin |
| X86 | Windows/MingW |
| X86-64 | FreeBSD |
| X86-64 | Linux |
+| X86-64 | Linux/x32 |
| X86-64 | OpenBSD |
| X86-64 | Windows/MingW |
|--------------+------------------|
@@ -113,9 +121,16 @@ It's also possible to build libffi on Windows platforms with
Microsoft's Visual C++ compiler. In this case, use the msvcc.sh
wrapper script during configuration like so:
-path/to/configure --enable-shared --enable-static \
- CC=path/to/msvcc.sh LD=link \
- CPP=\"cl -nologo -EP\"
+path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\"
+
+For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64".
+You may also need to specify --build appropriately. When building with MSVC
+under a MingW environment, you may need to remove the line in configure
+that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not
+present in MingW, and is not required when using MingW-style paths.)
+
+For iOS builds, run generate-ios-source-and-headers.py and then
+libffi.xcodeproj should work.
Configure has many other options. Use "configure --help" to see them all.
@@ -133,11 +148,30 @@ History
See the ChangeLog files for details.
-3.0.10 ???-??-??
- Fix the N64 build on mips-sgi-irix6.5.
- Testsuite fixes for Tru64 Unix.
+3.0.11 Apr-11-12
+ Add support for variadic functions (ffi_prep_cif_var).
+ Add Linux/x32 support.
+ Add thiscall, fastcall and MSVC cdecl support on Windows.
+ Add Amiga and newer MacOS support.
+ Add m68k FreeMiNT support.
+ Integration with iOS' xcode build tools.
+ Fix Octeon and MC68881 support.
+ Fix code pessimizations.
+ Lots of build fixes.
+
+3.0.10 Aug-23-11
+ Add support for Apple's iOS.
+ Add support for ARM VFP ABI.
+ Add RTEMS support for MIPS and M68K.
+ Fix instruction cache clearing problems on
+ ARM and SPARC.
+ Fix the N64 build on mips-sgi-irix6.5.
Enable builds with Microsoft's compiler.
- Enable x86 builds with Sun's compiler.
+ Enable x86 builds with Oracle's Solaris compiler.
+ Fix support for calling code compiled with Oracle's Sparc
+ Solaris compiler.
+ Testsuite fixes for Tru64 Unix.
+ Additional platform support.
3.0.9 Dec-31-09
Add AVR32 and win64 ports. Add ARM softfp support.
@@ -267,7 +301,7 @@ See the ChangeLog files for details.
Authors & Credits
=================
-libffi was originally written by Anthony Green <green@redhat.com>.
+libffi was originally written by Anthony Green <green@moxielogic.com>.
The developers of the GNU Compiler Collection project have made
innumerable valuable contributions. See the ChangeLog file for
@@ -318,5 +352,6 @@ Alex Oliva solved the executable page problem for SElinux.
The list above is almost certainly incomplete and inaccurate. I'm
happy to make corrections or additions upon request.
-If you have a problem, or have found a bug, please send a note to
-green@redhat.com.
+If you have a problem, or have found a bug, please send a note to the
+author at green@moxielogic.com, or the project mailing list at
+libffi-discuss@sourceware.org.
diff --git a/Modules/_ctypes/libffi/aclocal.m4 b/Modules/_ctypes/libffi/aclocal.m4
index c8e526f..d333ff3 100644
--- a/Modules/_ctypes/libffi/aclocal.m4
+++ b/Modules/_ctypes/libffi/aclocal.m4
@@ -1,7 +1,8 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -13,18 +14,839 @@
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
-[m4_warning([this file was generated for autoconf 2.65.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*-
+#
+# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc.
+# Written by Thomas Tanner, 1999
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 18 LTDL_INIT
+
+# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE])
+# ------------------------------------------
+# DIRECTORY contains the libltdl sources. It is okay to call this
+# function multiple times, as long as the same DIRECTORY is always given.
+AC_DEFUN([LT_CONFIG_LTDL_DIR],
+[AC_BEFORE([$0], [LTDL_INIT])
+_$0($*)
+])# LT_CONFIG_LTDL_DIR
+
+# We break this out into a separate macro, so that we can call it safely
+# internally without being caught accidentally by the sed scan in libtoolize.
+m4_defun([_LT_CONFIG_LTDL_DIR],
+[dnl remove trailing slashes
+m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$]))
+m4_case(_LTDL_DIR,
+ [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.'
+ m4_if(_ARG_DIR, [.],
+ [],
+ [m4_define([_LTDL_DIR], _ARG_DIR)
+ _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])],
+ [m4_if(_ARG_DIR, _LTDL_DIR,
+ [],
+ [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])])
+m4_popdef([_ARG_DIR])
+])# _LT_CONFIG_LTDL_DIR
+
+# Initialise:
+m4_define([_LTDL_DIR], [])
+
+
+# _LT_BUILD_PREFIX
+# ----------------
+# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise
+# to `${top_builddir}/'.
+m4_define([_LT_BUILD_PREFIX],
+[m4_ifdef([AC_AUTOCONF_VERSION],
+ [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]),
+ [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX],
+ [${top_build_prefix}],
+ [${top_builddir}/])],
+ [${top_build_prefix}])],
+ [${top_builddir}/])[]dnl
+])
+
+
+# LTDL_CONVENIENCE
+# ----------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with
+# '${top_build_prefix}' if available, otherwise with '${top_builddir}/',
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!). If your package is not flat and you're not using automake,
+# define top_build_prefix, top_builddir, and top_srcdir appropriately
+# in your Makefiles.
+AC_DEFUN([LTDL_CONVENIENCE],
+[AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])# LTDL_CONVENIENCE
+
+# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools,
+# now we have LT_CONFIG_LTDL_DIR:
+AU_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [])
+
+
+# _LTDL_CONVENIENCE
+# -----------------
+# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]).
+m4_defun([_LTDL_CONVENIENCE],
+[case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+esac
+LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la"
+LTDLDEPS=$LIBLTDL
+LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLDEPS])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# _LTDL_CONVENIENCE
+
+
+# LTDL_INSTALLABLE
+# ----------------
+# sets LIBLTDL to the link flags for the libltdl installable library
+# and LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl
+# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if
+# available, otherwise with '${top_builddir}/', and LTDLINCL will be
+# prefixed with '${top_srcdir}/' (note the single quotes!). If your
+# package is not flat and you're not using automake, define top_build_prefix,
+# top_builddir, and top_srcdir appropriately in your Makefiles.
+# In the future, this macro may have to be called after LT_INIT.
+AC_DEFUN([LTDL_INSTALLABLE],
+[AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])# LTDL_INSTALLABLE
+
+# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools,
+# now we have LT_CONFIG_LTDL_DIR:
+AU_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [])
+
+
+# _LTDL_INSTALLABLE
+# -----------------
+# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]).
+m4_defun([_LTDL_INSTALLABLE],
+[if test -f $prefix/lib/libltdl.la; then
+ lt_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="-L$prefix/lib $LDFLAGS"
+ AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes])
+ LDFLAGS="$lt_save_LDFLAGS"
+ if test x"${lt_lib_ltdl-no}" = xyes; then
+ if test x"$enable_ltdl_install" != xyes; then
+ # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install
+ AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install'])
+ enable_ltdl_install=no
+ fi
+ elif test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ fi
+fi
+
+# If configure.ac declared an installable ltdl, and the user didn't override
+# with --disable-ltdl-install, we will install the shipped libltdl.
+case $enable_ltdl_install in
+ no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLDEPS=
+ LTDLINCL=
+ ;;
+ *) enable_ltdl_install=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la"
+ LTDLDEPS=$LIBLTDL
+ LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
+ ;;
+esac
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLDEPS])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# LTDL_INSTALLABLE
+
+
+# _LTDL_MODE_DISPATCH
+# -------------------
+m4_define([_LTDL_MODE_DISPATCH],
+[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself:
+m4_if(_LTDL_DIR, [],
+ [],
+ dnl if _LTDL_MODE was not set already, the default value is `subproject':
+ [m4_case(m4_default(_LTDL_MODE, [subproject]),
+ [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR)
+ _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])],
+ [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])],
+ [recursive], [],
+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl
+dnl Be careful not to expand twice:
+m4_define([$0], [])
+])# _LTDL_MODE_DISPATCH
+
+
+# _LT_LIBOBJ(MODULE_NAME)
+# -----------------------
+# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead
+# of into LIBOBJS.
+AC_DEFUN([_LT_LIBOBJ], [
+ m4_pattern_allow([^_LT_LIBOBJS$])
+ _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext"
+])# _LT_LIBOBJS
+
+
+# LTDL_INIT([OPTIONS])
+# --------------------
+# Clients of libltdl can use this macro to allow the installer to
+# choose between a shipped copy of the ltdl sources or a preinstalled
+# version of the library. If the shipped ltdl sources are not in a
+# subdirectory named libltdl, the directory name must be given by
+# LT_CONFIG_LTDL_DIR.
+AC_DEFUN([LTDL_INIT],
+[dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+dnl We need to keep our own list of libobjs separate from our parent project,
+dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while
+dnl we look for our own LIBOBJs.
+m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ]))
+m4_pushdef([AC_LIBSOURCES])
+
+dnl If not otherwise defined, default to the 1.5.x compatible subproject mode:
+m4_if(_LTDL_MODE, [],
+ [m4_define([_LTDL_MODE], m4_default([$2], [subproject]))
+ m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])],
+ [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])
+
+AC_ARG_WITH([included_ltdl],
+ [AS_HELP_STRING([--with-included-ltdl],
+ [use the GNU ltdl sources included here])])
+
+if test "x$with_included_ltdl" != xyes; then
+ # We are not being forced to use the included libltdl sources, so
+ # decide whether there is a useful installed version we can use.
+ AC_CHECK_HEADER([ltdl.h],
+ [AC_CHECK_DECL([lt_dlinterface_register],
+ [AC_CHECK_LIB([ltdl], [lt_dladvise_preload],
+ [with_included_ltdl=no],
+ [with_included_ltdl=yes])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT
+ #include <ltdl.h>])],
+ [with_included_ltdl=yes],
+ [AC_INCLUDES_DEFAULT]
+ )
+fi
+
+dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE
+dnl was called yet, then for old times' sake, we assume libltdl is in an
+dnl eponymous directory:
+AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])])
+
+AC_ARG_WITH([ltdl_include],
+ [AS_HELP_STRING([--with-ltdl-include=DIR],
+ [use the ltdl headers installed in DIR])])
+
+if test -n "$with_ltdl_include"; then
+ if test -f "$with_ltdl_include/ltdl.h"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include'])
+ fi
+else
+ with_ltdl_include=no
+fi
+
+AC_ARG_WITH([ltdl_lib],
+ [AS_HELP_STRING([--with-ltdl-lib=DIR],
+ [use the libltdl.la installed in DIR])])
+
+if test -n "$with_ltdl_lib"; then
+ if test -f "$with_ltdl_lib/libltdl.la"; then :
+ else
+ AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib'])
+ fi
+else
+ with_ltdl_lib=no
+fi
+
+case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in
+ ,yes,no,no,)
+ m4_case(m4_default(_LTDL_TYPE, [convenience]),
+ [convenience], [_LTDL_CONVENIENCE],
+ [installable], [_LTDL_INSTALLABLE],
+ [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)])
+ ;;
+ ,no,no,no,)
+ # If the included ltdl is not to be used, then use the
+ # preinstalled libltdl we found.
+ AC_DEFINE([HAVE_LTDL], [1],
+ [Define this if a modern libltdl is already installed])
+ LIBLTDL=-lltdl
+ LTDLDEPS=
+ LTDLINCL=
+ ;;
+ ,no*,no,*)
+ AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together])
+ ;;
+ *) with_included_ltdl=no
+ LIBLTDL="-L$with_ltdl_lib -lltdl"
+ LTDLDEPS=
+ LTDLINCL="-I$with_ltdl_include"
+ ;;
+esac
+INCLTDL="$LTDLINCL"
+
+# Report our decision...
+AC_MSG_CHECKING([where to find libltdl headers])
+AC_MSG_RESULT([$LTDLINCL])
+AC_MSG_CHECKING([where to find libltdl library])
+AC_MSG_RESULT([$LIBLTDL])
+
+_LTDL_SETUP
+
+dnl restore autoconf definition.
+m4_popdef([AC_LIBOBJ])
+m4_popdef([AC_LIBSOURCES])
+
+AC_CONFIG_COMMANDS_PRE([
+ _ltdl_libobjs=
+ _ltdl_ltlibobjs=
+ if test -n "$_LT_LIBOBJS"; then
+ # Remove the extension.
+ _lt_sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do
+ _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext"
+ _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo"
+ done
+ fi
+ AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs])
+ AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs])
+])
+
+# Only expand once:
+m4_define([LTDL_INIT])
+])# LTDL_INIT
+
+# Old names:
+AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)])
+AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)])
+AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIB_LTDL], [])
+dnl AC_DEFUN([AC_WITH_LTDL], [])
+dnl AC_DEFUN([LT_WITH_LTDL], [])
+
+
+# _LTDL_SETUP
+# -----------
+# Perform all the checks necessary for compilation of the ltdl objects
+# -- including compiler checks and header checks. This is a public
+# interface mainly for the benefit of libltdl's own configure.ac, most
+# other users should call LTDL_INIT instead.
+AC_DEFUN([_LTDL_SETUP],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl
+AC_REQUIRE([LT_SYS_MODULE_PATH])dnl
+AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl
+AC_REQUIRE([LT_LIB_DLLOAD])dnl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl
+AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl
+AC_REQUIRE([gl_FUNC_ARGZ])dnl
+
+m4_require([_LT_CHECK_OBJDIR])dnl
+m4_require([_LT_HEADER_DLFCN])dnl
+m4_require([_LT_CHECK_DLPREOPEN])dnl
+m4_require([_LT_DECL_SED])dnl
+
+dnl Don't require this, or it will be expanded earlier than the code
+dnl that sets the variables it relies on:
+_LT_ENABLE_INSTALL
+
+dnl _LTDL_MODE specific code must be called at least once:
+_LTDL_MODE_DISPATCH
+
+# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS
+# the user used. This is so that ltdl.h can pick up the parent projects
+# config.h file, The first file in AC_CONFIG_HEADERS must contain the
+# definitions required by ltdl.c.
+# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility).
+AC_CONFIG_COMMANDS_PRE([dnl
+m4_pattern_allow([^LT_CONFIG_H$])dnl
+m4_ifset([AH_HEADER],
+ [LT_CONFIG_H=AH_HEADER],
+ [m4_ifset([AC_LIST_HEADERS],
+ [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`],
+ [])])])
+AC_SUBST([LT_CONFIG_H])
+
+AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h],
+ [], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])])
+AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])])
+
+m4_pattern_allow([LT_LIBEXT])dnl
+AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension])
+
+name=
+eval "lt_libprefix=\"$libname_spec\""
+m4_pattern_allow([LT_LIBPREFIX])dnl
+AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix])
+
+name=ltdl
+eval "LTDLOPEN=\"$libname_spec\""
+AC_SUBST([LTDLOPEN])
+])# _LTDL_SETUP
+
+
+# _LT_ENABLE_INSTALL
+# ------------------
+m4_define([_LT_ENABLE_INSTALL],
+[AC_ARG_ENABLE([ltdl-install],
+ [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])])
+
+case ,${enable_ltdl_install},${enable_ltdl_convenience} in
+ *yes*) ;;
+ *) enable_ltdl_convenience=yes ;;
+esac
+
+m4_ifdef([AM_CONDITIONAL],
+[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno)
+ AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)])
+])# _LT_ENABLE_INSTALL
+
+
+# LT_SYS_DLOPEN_DEPLIBS
+# ---------------------
+AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
+ [lt_cv_sys_dlopen_deplibs],
+ [# PORTME does your system automatically load deplibs for dlopen?
+ # or its logical equivalent (e.g. shl_load for HP-UX < 11)
+ # For now, we just catch OSes we know something about -- in the
+ # future, we'll try test this programmatically.
+ lt_cv_sys_dlopen_deplibs=unknown
+ case $host_os in
+ aix3*|aix4.1.*|aix4.2.*)
+ # Unknown whether this is true for these versions of AIX, but
+ # we want this `case' here to explicitly catch those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ aix[[4-9]]*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ esac
+ ;;
+ darwin*)
+ # Assuming the user has installed a libdl from somewhere, this is true
+ # If you are looking for one http://www.opendarwin.org/projects/dlcompat
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ freebsd* | dragonfly*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ # GNU and its variants, using gnu ld.so (Glibc)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ hpux10*|hpux11*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ interix*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ irix[[12345]]*|irix6.[[01]]*)
+ # Catch all versions of IRIX before 6.2, and indicate that we don't
+ # know how it worked for any of those versions.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ irix*)
+ # The case above catches anything before 6.2, and it's known that
+ # at 6.2 and later dlopen does load deplibs.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ netbsd* | netbsdelf*-gnu)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ openbsd*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ osf[[1234]]*)
+ # dlopen did load deplibs (at least at 4.x), but until the 5.x series,
+ # it did *not* use an RPATH in a shared library to find objects the
+ # library depends on, so we explicitly say `no'.
+ lt_cv_sys_dlopen_deplibs=no
+ ;;
+ osf5.0|osf5.0a|osf5.1)
+ # dlopen *does* load deplibs and with the right loader patch applied
+ # it even uses RPATH in a shared library to search for shared objects
+ # that the library depends on, but there's no easy way to know if that
+ # patch is installed. Since this is the case, all we can really
+ # say is unknown -- it depends on the patch being installed. If
+ # it is, this changes to `yes'. Without it, it would be `no'.
+ lt_cv_sys_dlopen_deplibs=unknown
+ ;;
+ osf*)
+ # the two cases above should catch all versions of osf <= 5.1. Read
+ # the comments above for what we know about them.
+ # At > 5.1, deplibs are loaded *and* any RPATH in a shared library
+ # is used to find them so we can finally say `yes'.
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ qnx*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ solaris*)
+ lt_cv_sys_dlopen_deplibs=yes
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ libltdl_cv_sys_dlopen_deplibs=yes
+ ;;
+ esac
+ ])
+if test "$lt_cv_sys_dlopen_deplibs" != yes; then
+ AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
+ [Define if the OS needs help to load dependent libraries for dlopen().])
+fi
+])# LT_SYS_DLOPEN_DEPLIBS
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [])
+
+
+# LT_SYS_MODULE_EXT
+# -----------------
+AC_DEFUN([LT_SYS_MODULE_EXT],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([which extension is used for runtime loadable modules],
+ [libltdl_cv_shlibext],
+[
+module=yes
+eval libltdl_cv_shlibext=$shrext_cmds
+module=no
+eval libltdl_cv_shrext=$shrext_cmds
+ ])
+if test -n "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_MODULE_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"],
+ [Define to the extension used for runtime loadable modules, say, ".so".])
+fi
+if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then
+ m4_pattern_allow([LT_SHARED_EXT])dnl
+ AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"],
+ [Define to the shared library suffix, say, ".dylib".])
+fi
+])# LT_SYS_MODULE_EXT
+
+# Old name:
+AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SHLIBEXT], [])
+
+
+# LT_SYS_MODULE_PATH
+# ------------------
+AC_DEFUN([LT_SYS_MODULE_PATH],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([which variable specifies run-time module search path],
+ [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"])
+if test -n "$lt_cv_module_path_var"; then
+ m4_pattern_allow([LT_MODULE_PATH_VAR])dnl
+ AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"],
+ [Define to the name of the environment variable that determines the run-time module search path.])
+fi
+])# LT_SYS_MODULE_PATH
+
+# Old name:
+AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SHLIBPATH], [])
+
+
+# LT_SYS_DLSEARCH_PATH
+# --------------------
+AC_DEFUN([LT_SYS_DLSEARCH_PATH],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([for the default library search path],
+ [lt_cv_sys_dlsearch_path],
+ [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"])
+if test -n "$lt_cv_sys_dlsearch_path"; then
+ sys_dlsearch_path=
+ for dir in $lt_cv_sys_dlsearch_path; do
+ if test -z "$sys_dlsearch_path"; then
+ sys_dlsearch_path="$dir"
+ else
+ sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir"
+ fi
+ done
+ m4_pattern_allow([LT_DLSEARCH_PATH])dnl
+ AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"],
+ [Define to the system default library search path.])
+fi
+])# LT_SYS_DLSEARCH_PATH
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [])
+
+
+# _LT_CHECK_DLPREOPEN
+# -------------------
+m4_defun([_LT_CHECK_DLPREOPEN],
+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen],
+ [libltdl_cv_preloaded_symbols],
+ [if test -n "$lt_cv_sys_global_symbol_pipe"; then
+ libltdl_cv_preloaded_symbols=yes
+ else
+ libltdl_cv_preloaded_symbols=no
+ fi
+ ])
+if test x"$libltdl_cv_preloaded_symbols" = xyes; then
+ AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1],
+ [Define if libtool can extract symbol lists from object files.])
+fi
+])# _LT_CHECK_DLPREOPEN
+
+
+# LT_LIB_DLLOAD
+# -------------
+AC_DEFUN([LT_LIB_DLLOAD],
+[m4_pattern_allow([^LT_DLLOADERS$])
+LT_DLLOADERS=
+AC_SUBST([LT_DLLOADERS])
+
+AC_LANG_PUSH([C])
+
+LIBADD_DLOPEN=
+AC_SEARCH_LIBS([dlopen], [dl],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ if test "$ac_cv_search_dlopen" != "none required" ; then
+ LIBADD_DLOPEN="-ldl"
+ fi
+ libltdl_cv_lib_dl_dlopen="yes"
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+ ]], [[dlopen(0, 0);]])],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ libltdl_cv_func_dlopen="yes"
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [AC_DEFINE([HAVE_LIBDL], [1],
+ [Define if you have the libdl library or equivalent.])
+ LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes"
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])])
+if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes
+then
+ lt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ AC_CHECK_FUNCS([dlerror])
+ LIBS="$lt_save_LIBS"
+fi
+AC_SUBST([LIBADD_DLOPEN])
+
+LIBADD_SHL_LOAD=
+AC_CHECK_FUNC([shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [AC_DEFINE([HAVE_SHL_LOAD], [1],
+ [Define if you have the shl_load function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"
+ LIBADD_SHL_LOAD="-ldld"])])
+AC_SUBST([LIBADD_SHL_LOAD])
+
+case $host_os in
+darwin[[1567]].*)
+# We only want this for pre-Mac OS X 10.4.
+ AC_CHECK_FUNC([_dyld_func_lookup],
+ [AC_DEFINE([HAVE_DYLD], [1],
+ [Define if you have the _dyld_func_lookup function.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"])
+ ;;
+beos*)
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la"
+ ;;
+cygwin* | mingw* | os2* | pw32*)
+ AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include <sys/cygwin.h>]])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la"
+ ;;
+esac
+
+AC_CHECK_LIB([dld], [dld_link],
+ [AC_DEFINE([HAVE_DLD], [1],
+ [Define if you have the GNU dld library.])
+ LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"])
+AC_SUBST([LIBADD_DLD_LINK])
+
+m4_pattern_allow([^LT_DLPREOPEN$])
+LT_DLPREOPEN=
+if test -n "$LT_DLLOADERS"
+then
+ for lt_loader in $LT_DLLOADERS; do
+ LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader "
+ done
+ AC_DEFINE([HAVE_LIBDLLOADER], [1],
+ [Define if libdlloader will be built on this platform])
+fi
+AC_SUBST([LT_DLPREOPEN])
+
+dnl This isn't used anymore, but set it for backwards compatibility
+LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD"
+AC_SUBST([LIBADD_DL])
+
+AC_LANG_POP
+])# LT_LIB_DLLOAD
+
+# Old name:
+AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_DLLIB], [])
+
+
+# LT_SYS_SYMBOL_USCORE
+# --------------------
+# does the compiler prefix global symbols with an underscore?
+AC_DEFUN([LT_SYS_SYMBOL_USCORE],
+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([for _ prefix in compiled symbols],
+ [lt_cv_sys_symbol_underscore],
+ [lt_cv_sys_symbol_underscore=no
+ cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ lt_cv_sys_symbol_underscore=yes
+ else
+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ fi
+ else
+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.c >&AS_MESSAGE_LOG_FD
+ fi
+ rm -rf conftest*
+ ])
+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+ AC_SUBST([sys_symbol_underscore])
+])# LT_SYS_SYMBOL_USCORE
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [])
+
+
+# LT_FUNC_DLSYM_USCORE
+# --------------------
+AC_DEFUN([LT_FUNC_DLSYM_USCORE],
+[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+if test x"$lt_cv_sys_symbol_underscore" = xyes; then
+ if test x"$libltdl_cv_func_dlopen" = xyes ||
+ test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then
+ AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
+ [libltdl_cv_need_uscore],
+ [libltdl_cv_need_uscore=unknown
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBADD_DLOPEN"
+ _LT_TRY_DLOPEN_SELF(
+ [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes],
+ [], [libltdl_cv_need_uscore=cross])
+ LIBS="$save_LIBS"
+ ])
+ fi
+fi
+
+if test x"$libltdl_cv_need_uscore" = xyes; then
+ AC_DEFINE([NEED_USCORE], [1],
+ [Define if dlsym() requires a leading underscore in symbol names.])
+fi
+])# LT_FUNC_DLSYM_USCORE
+
+# Old name:
+AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], [])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
@@ -34,7 +856,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.11'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.11.3], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -50,7 +872,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -79,12 +901,14 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
@@ -166,14 +990,14 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 10
+# serial 12
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
@@ -213,6 +1037,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -277,7 +1102,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -342,10 +1167,13 @@ AC_DEFUN([AM_DEP_TRACK],
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
@@ -567,12 +1395,15 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
@@ -612,8 +1443,8 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -633,7 +1464,7 @@ AC_DEFUN([AM_MAINTAINER_MODE],
[disable], [m4_define([am_maintainer_other], [enable])],
[m4_define([am_maintainer_other], [enable])
m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
AC_ARG_ENABLE([maintainer-mode],
[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
@@ -779,12 +1610,15 @@ else
fi
])
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_MKDIR_P
# ---------------
# Check for `mkdir -p'.
@@ -807,13 +1641,14 @@ esac
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 4
+# serial 5
# _AM_MANGLE_OPTION(NAME)
# -----------------------
@@ -821,13 +1656,13 @@ AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -903,12 +1738,14 @@ Check your system clock])
fi
AC_MSG_RESULT(yes)])
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 1
+
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
@@ -931,13 +1768,13 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
+# serial 3
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
@@ -946,13 +1783,13 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
AC_DEFUN([_AM_SUBST_NOTMAKE])
# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
# Public sister of _AM_SUBST_NOTMAKE.
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -974,10 +1811,11 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# a tarball read from stdin.
# $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
m4_if([$1], [v7],
- [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
[m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive])
@@ -1046,6 +1884,16 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+m4_include([m4/asmcfi.m4])
+m4_include([m4/ax_append_flag.m4])
+m4_include([m4/ax_cc_maxopt.m4])
+m4_include([m4/ax_cflags_warn_all.m4])
+m4_include([m4/ax_check_compile_flag.m4])
+m4_include([m4/ax_compiler_vendor.m4])
+m4_include([m4/ax_configure_args.m4])
+m4_include([m4/ax_enable_builddir.m4])
+m4_include([m4/ax_gcc_archflag.m4])
+m4_include([m4/ax_gcc_x86_cpuid.m4])
m4_include([m4/libtool.m4])
m4_include([m4/ltoptions.m4])
m4_include([m4/ltsugar.m4])
diff --git a/Modules/_ctypes/libffi/compile b/Modules/_ctypes/libffi/compile
index 1b1d232..c0096a7 100755
--- a/Modules/_ctypes/libffi/compile
+++ b/Modules/_ctypes/libffi/compile
@@ -1,9 +1,10 @@
#! /bin/sh
# Wrapper for compilers which do not understand `-c -o'.
-scriptversion=2005-05-14.22
+scriptversion=2009-10-06.20; # UTC
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
+# Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
@@ -17,8 +18,7 @@ scriptversion=2005-05-14.22
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -103,13 +103,13 @@ if test -z "$ofile" || test -z "$cfile"; then
fi
# Name of file we expect compiler to create.
-cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
# Create the lock directory.
-# Note: use `[/.-]' here to ensure that we don't use the same name
+# Note: use `[/\\:.-]' here to ensure that we don't use the same name
# that we are using for the .o file. Also, base the name on the expected
# object file name, since that is what matters with a parallel build.
-lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
while true; do
if mkdir "$lockdir" >/dev/null 2>&1; then
break
@@ -124,9 +124,9 @@ trap "rmdir '$lockdir'; exit 1" 1 2 15
ret=$?
if test -f "$cofile"; then
- mv "$cofile" "$ofile"
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
elif test -f "${cofile}bj"; then
- mv "${cofile}bj" "$ofile"
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
fi
rmdir "$lockdir"
@@ -138,5 +138,6 @@ exit $ret
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/Modules/_ctypes/libffi/config.guess b/Modules/_ctypes/libffi/config.guess
index d53e309..b02565c 100755
--- a/Modules/_ctypes/libffi/config.guess
+++ b/Modules/_ctypes/libffi/config.guess
@@ -1,10 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
-timestamp='2009-11-19'
+timestamp='2011-06-03'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -56,8 +56,9 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
+Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -180,7 +181,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
fi
;;
*)
- os=netbsd
+ os=netbsd
;;
esac
# The OS release
@@ -223,7 +224,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
;;
*5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -269,7 +270,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,7 +299,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
echo s390-ibm-zvmoe
exit ;;
*:OS400:*:*)
- echo powerpc-ibm-os400
+ echo powerpc-ibm-os400
exit ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
@@ -333,6 +337,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
eval $set_cc_for_build
SUN_ARCH="i386"
@@ -391,23 +398,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# MiNT. But MiNT is downward compatible to TOS, so this should
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
+ echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
+ exit ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
+ echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
m68k:machten:*:*)
echo m68k-apple-machten${UNAME_RELEASE}
exit ;;
@@ -477,8 +484,8 @@ EOF
echo m88k-motorola-sysv3
exit ;;
AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
then
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -491,7 +498,7 @@ EOF
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit ;;
@@ -548,7 +555,7 @@ EOF
echo rs6000-ibm-aix3.2
fi
exit ;;
- *:AIX:*:[456])
+ *:AIX:*:[4567])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000
@@ -591,52 +598,52 @@ EOF
9000/[678][0-9][0-9])
if [ -x /usr/bin/getconf ]; then
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
+ esac ;;
+ esac
fi
if [ "${HP_ARCH}" = "" ]; then
eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
+ sed 's/^ //' << EOF >$dummy.c
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
EOF
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -727,22 +734,22 @@ EOF
exit ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
- exit ;;
+ exit ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
- exit ;;
+ exit ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
- exit ;;
+ exit ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
- exit ;;
+ exit ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
- exit ;;
+ exit ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
@@ -766,14 +773,14 @@ EOF
exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -801,14 +808,14 @@ EOF
echo ${UNAME_MACHINE}-pc-mingw32
exit ;;
i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
exit ;;
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
exit ;;
*:Interix*:*)
- case ${UNAME_MACHINE} in
+ case ${UNAME_MACHINE} in
x86)
echo i586-pc-interix${UNAME_RELEASE}
exit ;;
@@ -863,7 +870,7 @@ EOF
EV6) UNAME_MACHINE=alphaev6 ;;
EV67) UNAME_MACHINE=alphaev67 ;;
EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
+ esac
objdump --private-headers /bin/sh | grep -q ld.so.1
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
@@ -875,7 +882,13 @@ EOF
then
echo ${UNAME_MACHINE}-unknown-linux-gnu
else
- echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+ fi
fi
exit ;;
avr32*:Linux:*:*)
@@ -888,7 +901,7 @@ EOF
echo crisv32-axis-linux-gnu
exit ;;
frv:Linux:*:*)
- echo frv-unknown-linux-gnu
+ echo frv-unknown-linux-gnu
exit ;;
i*86:Linux:*:*)
LIBC=gnu
@@ -956,7 +969,7 @@ EOF
echo ${UNAME_MACHINE}-ibm-linux
exit ;;
sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
@@ -964,6 +977,9 @@ EOF
sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
+ tile*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
vax:Linux:*:*)
echo ${UNAME_MACHINE}-dec-linux-gnu
exit ;;
@@ -971,7 +987,7 @@ EOF
echo x86_64-unknown-linux-gnu
exit ;;
xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -980,11 +996,11 @@ EOF
echo i386-sequent-sysv4
exit ;;
i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
# I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
+ # Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit ;;
i*86:OS/2:*:*)
@@ -1016,7 +1032,7 @@ EOF
fi
exit ;;
i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
case `/bin/uname -X | grep "^Machine"` in
*486*) UNAME_MACHINE=i486 ;;
*Pentium) UNAME_MACHINE=i586 ;;
@@ -1044,13 +1060,13 @@ EOF
exit ;;
pc:*:*:*)
# Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
# Note: whatever this is, it MUST be the same as what config.sub
# prints for the "djgpp" host, or else GDB configury will decide that
# this is a cross-build.
echo i586-pc-msdosdjgpp
- exit ;;
+ exit ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
exit ;;
@@ -1085,8 +1101,8 @@ EOF
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
OS_REL='.3'
test -r /etc/.relid \
@@ -1129,10 +1145,10 @@ EOF
echo ns32k-sni-sysv
fi
exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes <hewes@openmarket.com>.
# How about differentiating between stratus architectures? -djm
@@ -1158,11 +1174,11 @@ EOF
exit ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
+ echo mips-nec-sysv${UNAME_RELEASE}
else
- echo mips-unknown-sysv${UNAME_RELEASE}
+ echo mips-unknown-sysv${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
echo powerpc-be-beos
exit ;;
@@ -1227,6 +1243,9 @@ EOF
*:QNX:*:4*)
echo i386-pc-qnx
exit ;;
+ NEO-?:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk${UNAME_RELEASE}
+ exit ;;
NSE-?:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE}
exit ;;
@@ -1272,13 +1291,13 @@ EOF
echo pdp10-unknown-its
exit ;;
SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
+ echo mips-sei-seiux${UNAME_RELEASE}
exit ;;
*:DragonFly:*:*)
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit ;;
*:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
case "${UNAME_MACHINE}" in
A*) echo alpha-dec-vms ; exit ;;
I*) echo ia64-dec-vms ; exit ;;
@@ -1318,11 +1337,11 @@ main ()
#include <sys/param.h>
printf ("m68k-sony-newsos%s\n",
#ifdef NEWSOS4
- "4"
+ "4"
#else
- ""
+ ""
#endif
- ); exit (0);
+ ); exit (0);
#endif
#endif
diff --git a/Modules/_ctypes/libffi/config.sub b/Modules/_ctypes/libffi/config.sub
index 17c9145..78176a4 100755
--- a/Modules/_ctypes/libffi/config.sub
+++ b/Modules/_ctypes/libffi/config.sub
@@ -1,10 +1,10 @@
#! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
-timestamp='2009-11-07'
+timestamp='2011-10-29'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -75,8 +75,9 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
+Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,8 +124,9 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | \
kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
@@ -156,8 +158,8 @@ case $os in
os=
basic_machine=$1
;;
- -bluegene*)
- os=-cnk
+ -bluegene*)
+ os=-cnk
;;
-sim | -cisco | -oki | -wec | -winbond)
os=
@@ -173,10 +175,10 @@ case $os in
os=-chorusos
basic_machine=$1
;;
- -chorusrdb)
- os=-chorusrdb
+ -chorusrdb)
+ os=-chorusrdb
basic_machine=$1
- ;;
+ ;;
-hiux*)
os=-hiuxwe2
;;
@@ -249,13 +251,17 @@ case $basic_machine in
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | be32 | be64 \
| bfin \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
+ | epiphany \
| fido | fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
| i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \
+ | le32 | le64 \
| lm32 \
| m32c | m32r | m32rle | m68000 | m68k | m88k \
| maxq | mb | microblaze | mcore | mep | metag \
@@ -281,27 +287,38 @@ case $basic_machine in
| moxie \
| mt \
| msp430 \
+ | nds32 | nds32le | nds32be \
| nios | nios2 \
| ns16k | ns32k \
+ | open8 \
| or32 \
| pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
- | rx \
+ | rl78 | rx \
| score \
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic80 | tron \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
- | v850 | v850e \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
| we32k \
- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
basic_machine=$basic_machine-unknown
;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
m6811 | m68hc11 | m6812 | m68hc12 | picochip)
# Motorola 68HC11/12.
basic_machine=$basic_machine-unknown
@@ -313,6 +330,18 @@ case $basic_machine in
basic_machine=mt-unknown
;;
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
@@ -332,16 +361,19 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
+ | be32-* | be64-* \
| bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \
+ | le32-* | le64-* \
| lm32-* \
| m32c-* | m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
@@ -367,25 +399,29 @@ case $basic_machine in
| mmix-* \
| mt-* \
| msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
| nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
- | romp-* | rs6000-* | rx-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
| tron-* \
| ubicom32-* \
- | v850-* | v850e-* | vax-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
| we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
| ymp-* \
| z8k-* | z80-*)
@@ -410,7 +446,7 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
- abacus)
+ abacus)
basic_machine=abacus-unknown
;;
adobe68k)
@@ -480,11 +516,20 @@ case $basic_machine in
basic_machine=powerpc-ibm
os=-cnk
;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
c90)
basic_machine=c90-cray
os=-unicos
;;
- cegcc)
+ cegcc)
basic_machine=arm-unknown
os=-cegcc
;;
@@ -516,7 +561,7 @@ case $basic_machine in
basic_machine=craynv-cray
os=-unicosmp
;;
- cr16)
+ cr16 | cr16-*)
basic_machine=cr16-unknown
os=-elf
;;
@@ -732,7 +777,7 @@ case $basic_machine in
basic_machine=ns32k-utek
os=-sysv
;;
- microblaze)
+ microblaze)
basic_machine=microblaze-xilinx
;;
mingw32)
@@ -775,6 +820,10 @@ case $basic_machine in
basic_machine=i370-ibm
os=-mvs
;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
@@ -839,6 +888,12 @@ case $basic_machine in
np1)
basic_machine=np1-gould
;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
nsr-tandem)
basic_machine=nsr-tandem
;;
@@ -921,9 +976,10 @@ case $basic_machine in
;;
power) basic_machine=power-ibm
;;
- ppc) basic_machine=powerpc-unknown
+ ppc | ppcbe) basic_machine=powerpc-unknown
;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
@@ -1017,6 +1073,9 @@ case $basic_machine in
basic_machine=i860-stratus
os=-sysv4
;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
sun2)
basic_machine=m68000-sun
;;
@@ -1073,20 +1132,8 @@ case $basic_machine in
basic_machine=t90-cray
os=-unicos
;;
- tic54x | c54x*)
- basic_machine=tic54x-unknown
- os=-coff
- ;;
- tic55x | c55x*)
- basic_machine=tic55x-unknown
- os=-coff
- ;;
- tic6x | c6x*)
- basic_machine=tic6x-unknown
- os=-coff
- ;;
tile*)
- basic_machine=tile-unknown
+ basic_machine=$basic_machine-unknown
os=-linux-gnu
;;
tx39)
@@ -1156,6 +1203,9 @@ case $basic_machine in
xps | xps100)
basic_machine=xps100-honeywell
;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
ymp)
basic_machine=ymp-cray
os=-unicos
@@ -1253,9 +1303,12 @@ esac
if [ x"$os" != x"" ]
then
case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
+ # First match some system type aliases
+ # that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
@@ -1277,8 +1330,8 @@ case $os in
# -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
- | -kopensolaris* \
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* | -aros* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
@@ -1291,7 +1344,8 @@ case $os in
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* | -cegcc* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -mingw32* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-uclibc* \
| -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1338,7 +1392,7 @@ case $os in
-opened*)
os=-openedition
;;
- -os400*)
+ -os400*)
os=-os400
;;
-wince*)
@@ -1387,7 +1441,7 @@ case $os in
-sinix*)
os=-sysv4
;;
- -tpf*)
+ -tpf*)
os=-tpf
;;
-triton*)
@@ -1432,6 +1486,8 @@ case $os in
-dicos*)
os=-dicos
;;
+ -nacl*)
+ ;;
-none)
;;
*)
@@ -1454,10 +1510,10 @@ else
# system, and we'll never get to this point.
case $basic_machine in
- score-*)
+ score-*)
os=-elf
;;
- spu-*)
+ spu-*)
os=-elf
;;
*-acorn)
@@ -1469,8 +1525,17 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
- c4x-* | tic4x-*)
- os=-coff
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
@@ -1497,7 +1562,7 @@ case $basic_machine in
m68*-cisco)
os=-aout
;;
- mep-*)
+ mep-*)
os=-elf
;;
mips*-cisco)
@@ -1524,7 +1589,7 @@ case $basic_machine in
*-ibm)
os=-aix
;;
- *-knuth)
+ *-knuth)
os=-mmixware
;;
*-wec)
diff --git a/Modules/_ctypes/libffi/configure b/Modules/_ctypes/libffi/configure
index c5c70b1..c86a597 100755
--- a/Modules/_ctypes/libffi/configure
+++ b/Modules/_ctypes/libffi/configure
@@ -1,13 +1,13 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for libffi 3.0.10rc0.
+# Generated by GNU Autoconf 2.68 for libffi 3.0.11.
#
-# Report bugs to <http://gcc.gnu.org/bugs.html>.
+# Report bugs to <http://github.com/atgreen/libffi/issues>.
#
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -91,6 +91,7 @@ fi
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -173,6 +174,14 @@ test x\$exitcode = x0 || exit 1"
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
if (eval "$as_required") 2>/dev/null; then :
as_have_required=yes
@@ -216,11 +225,18 @@ IFS=$as_save_IFS
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
+ # Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+ case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+ esac
+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
fi
if test x$as_have_required = xno; then :
@@ -231,8 +247,8 @@ fi
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: http://gcc.gnu.org/bugs.html about your system,
-$0: including any error possibly output before this
+$0: http://github.com/atgreen/libffi/issues about your
+$0: system, including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
fi
@@ -319,7 +335,7 @@ $as_echo X"$as_dir" |
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
@@ -359,19 +375,19 @@ else
fi # as_fn_arith
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
- as_status=$?; test $as_status -eq 0 && as_status=1
- if test "$3"; then
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $1" >&2
+ $as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -528,161 +544,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-# Check that we are running under the correct shell.
SHELL=${CONFIG_SHELL-/bin/sh}
-case X$lt_ECHO in
-X*--fallback-echo)
- # Remove one level of quotation (which was required for Make).
- ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
- ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
- # Yippee, $ECHO works!
- :
-else
- # Restart under the correct shell.
- exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<_LT_EOF
-$*
-_LT_EOF
- exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
- if test "X${echo_test_string+set}" != Xset; then
- # find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
- { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
- then
- break
- fi
- done
- fi
-
- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- :
- else
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for dir in $PATH /usr/ucb; do
- IFS="$lt_save_ifs"
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- ECHO="$dir/echo"
- break
- fi
- done
- IFS="$lt_save_ifs"
-
- if test "X$ECHO" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- ECHO='print -r'
- elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running configure again with it.
- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
- else
- # Try using printf.
- ECHO='printf %s\n'
- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # Cool, printf works
- :
- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- ECHO="$CONFIG_SHELL $0 --fallback-echo"
- elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- ECHO="$CONFIG_SHELL $0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
- if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
- then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "$0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
- else
- # Oops. We lost completely, so just stick with echo.
- ECHO=echo
- fi
- fi
- fi
- fi
- fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
- lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1
# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
@@ -701,9 +570,9 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='libffi'
PACKAGE_TARNAME='libffi'
-PACKAGE_VERSION='3.0.10rc0'
-PACKAGE_STRING='libffi 3.0.10rc0'
-PACKAGE_BUGREPORT='http://gcc.gnu.org/bugs.html'
+PACKAGE_VERSION='3.0.11'
+PACKAGE_STRING='libffi 3.0.11'
+PACKAGE_BUGREPORT='http://github.com/atgreen/libffi/issues'
PACKAGE_URL=''
# Factoring default headers for most tests.
@@ -748,8 +617,14 @@ LTLIBOBJS
LIBOBJS
toolexeclibdir
toolexecdir
+FFI_DEBUG_FALSE
+FFI_DEBUG_TRUE
TARGETDIR
TARGET
+FFI_EXEC_TRAMPOLINE_TABLE
+FFI_EXEC_TRAMPOLINE_TABLE_FALSE
+FFI_EXEC_TRAMPOLINE_TABLE_TRUE
+sys_symbol_underscore
HAVE_LONG_DOUBLE
ALLOCA
PA64_HPUX_FALSE
@@ -782,6 +657,8 @@ POWERPC_AIX_FALSE
POWERPC_AIX_TRUE
POWERPC_FALSE
POWERPC_TRUE
+MOXIE_FALSE
+MOXIE_TRUE
M68K_FALSE
M68K_TRUE
M32R_FALSE
@@ -811,15 +688,18 @@ TESTSUBDIR_TRUE
MAINT
MAINTAINER_MODE_FALSE
MAINTAINER_MODE_TRUE
+PRTDIAG
CPP
OTOOL64
OTOOL
LIPO
NMEDIT
DSYMUTIL
-lt_ECHO
+MANIFEST_TOOL
RANLIB
+ac_ct_AR
AR
+DLLTOOL
OBJDUMP
LN_S
NM
@@ -839,6 +719,7 @@ CCAS
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
+am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
@@ -875,6 +756,7 @@ am__isrc
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
+ax_enable_builddir_sed
target_os
target_vendor
target_cpu
@@ -928,13 +810,17 @@ SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
+enable_builddir
enable_dependency_tracking
enable_shared
enable_static
with_pic
enable_fast_install
with_gnu_ld
+with_sysroot
enable_libtool_lock
+enable_portable_binary
+with_gcc_arch
enable_maintainer_mode
enable_debug
enable_structs
@@ -1010,8 +896,9 @@ do
fi
case $ac_option in
- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *) ac_optarg=yes ;;
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
esac
# Accept the important Cygnus configure options, so we can diagnose typos.
@@ -1056,7 +943,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1082,7 +969,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1286,7 +1173,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1302,7 +1189,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1332,8 +1219,8 @@ do
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
- -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
;;
*=*)
@@ -1341,7 +1228,7 @@ Try \`$0 --help' for more information."
# Reject names that are not valid shell variable names.
case $ac_envvar in #(
'' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
@@ -1351,7 +1238,7 @@ Try \`$0 --help' for more information."
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
esac
@@ -1359,13 +1246,13 @@ done
if test -n "$ac_prev"; then
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- as_fn_error "missing argument to $ac_option"
+ as_fn_error $? "missing argument to $ac_option"
fi
if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
*) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1388,7 +1275,7 @@ do
[\\/$]* | ?:[\\/]* ) continue;;
NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
esac
- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
# There might be people who depend on the old broken behavior: `$host'
@@ -1402,8 +1289,8 @@ target=$target_alias
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used." >&2
+ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
@@ -1418,9 +1305,9 @@ test "$silent" = yes && exec 6>/dev/null
ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- as_fn_error "working directory cannot be determined"
+ as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- as_fn_error "pwd does not report name of working directory"
+ as_fn_error $? "pwd does not report name of working directory"
# Find the source files, if location was not specified.
@@ -1459,11 +1346,11 @@ else
fi
if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
@@ -1489,7 +1376,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures libffi 3.0.10rc0 to adapt to many kinds of systems.
+\`configure' configures libffi 3.0.11 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1503,7 +1390,7 @@ Configuration:
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking...' messages
+ -q, --quiet, --silent do not print \`checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for \`--cache-file=config.cache'
-n, --no-create do not create output files
@@ -1560,7 +1447,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of libffi 3.0.10rc0:";;
+ short | recursive ) echo "Configuration of libffi 3.0.11:";;
esac
cat <<\_ACEOF
@@ -1568,6 +1455,8 @@ Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-builddir disable automatic build in subdir of sources
+
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
--enable-shared[=PKGS] build shared libraries [default=yes]
@@ -1575,6 +1464,9 @@ Optional Features:
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-portable-binary
+ disable compiler optimizations that would produce
+ unportable binaries
--enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer
--enable-debug debugging mode
@@ -1585,9 +1477,13 @@ Optional Features:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-pic try to use only PIC/non-PIC objects [default=use
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
both]
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot=DIR Search for dependent libraries within DIR
+ (or the compiler's sysroot if not specified).
+ --with-gcc-arch=<arch> use architecture <arch> for gcc -march/-mtune,
+ instead of guessing
Some influential environment variables:
CC C compiler command
@@ -1604,7 +1500,7 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
-Report bugs to <http://gcc.gnu.org/bugs.html>.
+Report bugs to <http://github.com/atgreen/libffi/issues>.
_ACEOF
ac_status=$?
fi
@@ -1667,10 +1563,10 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-libffi configure 3.0.10rc0
-generated by GNU Autoconf 2.65
+libffi configure 3.0.11
+generated by GNU Autoconf 2.68
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1714,7 +1610,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_compile
@@ -1760,7 +1656,7 @@ fi
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_link
@@ -1774,7 +1670,7 @@ ac_fn_c_check_header_compile ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1792,7 +1688,7 @@ fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
@@ -1817,7 +1713,7 @@ $as_echo "$ac_try_echo"; } >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } >/dev/null && {
+ test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
}; then :
@@ -1828,7 +1724,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_cpp
@@ -1870,7 +1766,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_run
@@ -1883,7 +1779,7 @@ ac_fn_c_check_func ()
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1938,7 +1834,7 @@ fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
@@ -1950,10 +1846,10 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ if eval \${$3+:} false; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
@@ -1989,7 +1885,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
else
ac_header_preproc=no
fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
@@ -2012,17 +1908,15 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( cat <<\_ASBOX
-## ------------------------------------------- ##
-## Report this to http://gcc.gnu.org/bugs.html ##
-## ------------------------------------------- ##
-_ASBOX
+( $as_echo "## ------------------------------------------------------ ##
+## Report this to http://github.com/atgreen/libffi/issues ##
+## ------------------------------------------------------ ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
@@ -2031,10 +1925,64 @@ eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_mongrel
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -2208,7 +2156,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
rm -f conftest.val
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_compute_int
@@ -2216,8 +2164,8 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by libffi $as_me 3.0.10rc0, which was
-generated by GNU Autoconf 2.65. Invocation command line was
+It was created by libffi $as_me 3.0.11, which was
+generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -2327,11 +2275,9 @@ trap 'exit_status=$?
{
echo
- cat <<\_ASBOX
-## ---------------- ##
+ $as_echo "## ---------------- ##
## Cache variables. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
echo
# The following way of writing the cache mishandles newlines in values,
(
@@ -2365,11 +2311,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- cat <<\_ASBOX
-## ----------------- ##
+ $as_echo "## ----------------- ##
## Output variables. ##
-## ----------------- ##
-_ASBOX
+## ----------------- ##"
echo
for ac_var in $ac_subst_vars
do
@@ -2382,11 +2326,9 @@ _ASBOX
echo
if test -n "$ac_subst_files"; then
- cat <<\_ASBOX
-## ------------------- ##
+ $as_echo "## ------------------- ##
## File substitutions. ##
-## ------------------- ##
-_ASBOX
+## ------------------- ##"
echo
for ac_var in $ac_subst_files
do
@@ -2400,11 +2342,9 @@ _ASBOX
fi
if test -s confdefs.h; then
- cat <<\_ASBOX
-## ----------- ##
+ $as_echo "## ----------- ##
## confdefs.h. ##
-## ----------- ##
-_ASBOX
+## ----------- ##"
echo
cat confdefs.h
echo
@@ -2459,7 +2399,12 @@ _ACEOF
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- ac_site_file1=$CONFIG_SITE
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
elif test "x$prefix" != xNONE; then
ac_site_file1=$prefix/share/config.site
ac_site_file2=$prefix/etc/config.site
@@ -2474,7 +2419,11 @@ do
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file"
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
fi
done
@@ -2550,7 +2499,7 @@ if $ac_cache_corrupted; then
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2568,16 +2517,22 @@ ac_config_headers="$ac_config_headers fficonfig.h"
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
- for ac_t in install-sh install.sh shtool; do
- if test -f "$ac_dir/$ac_t"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/$ac_t -c"
- break 2
- fi
- done
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
done
if test -z "$ac_aux_dir"; then
- as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
fi
# These three variables are undocumented and unsupported,
@@ -2591,27 +2546,27 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
+if ${ac_cv_build+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
@@ -2629,14 +2584,14 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
+if ${ac_cv_host+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi
fi
@@ -2644,7 +2599,7 @@ fi
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
@@ -2662,14 +2617,14 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
+if ${ac_cv_target+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$target_alias" = x; then
ac_cv_target=$ac_cv_host
else
ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
- as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
fi
fi
@@ -2677,7 +2632,7 @@ fi
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
@@ -2704,6 +2659,110 @@ target_alias=${target_alias-$host_alias}
. ${srcdir}/configure.host
+
+ # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args
+ if test "${ac_configure_args+set}" != "set" ; then
+ ac_configure_args=
+ for ac_arg in ${1+"$@"}; do
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ done
+ fi
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+
+ax_enable_builddir="."
+# Check whether --enable-builddir was given.
+if test "${enable_builddir+set}" = set; then :
+ enableval=$enable_builddir; ax_enable_builddir="$enableval"
+else
+ ax_enable_builddir="auto"
+fi
+
+if test ".$ac_srcdir_defaulted" != ".no" ; then
+if test ".$srcdir" = ".." ; then
+ if test -f config.status ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5
+$as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;}
+ else
+ test ".$ax_enable_builddir" = "." && ax_enable_builddir="."
+ test ".$ax_enable_builddir" = ".no" && ax_enable_builddir="."
+ test ".$TARGET" = "." && TARGET="$target"
+ test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET"
+ if test ".$ax_enable_builddir" != ".." ; then # we know where to go and
+ as_dir=$ax_enable_builddir; as_fn_mkdir_p
+ echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp
+ cd $ax_enable_builddir
+ if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then
+ rm conftest.tmp
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5
+$as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; }
+ else
+ as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5
+ fi
+ srcdir=`echo "$ax_enable_builddir" |
+ sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'`
+ # going to restart from subdirectory location
+ test -f $srcdir/config.log && mv $srcdir/config.log .
+ test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h .
+ test -f $srcdir/conftest.log && mv $srcdir/conftest.log .
+ test -f $srcdir/$cache_file && mv $srcdir/$cache_file .
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5
+$as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; }
+ case "$0" in # restart
+ /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;;
+ *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;;
+ esac ; exit $?
+ fi
+ fi
+fi fi
+test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="."
+# Extract the first word of "gsed sed", so it can be a program name with args.
+set dummy gsed sed; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ax_enable_builddir_sed+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ax_enable_builddir_sed in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed"
+ ;;
+esac
+fi
+ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed
+if test -n "$ax_enable_builddir_sed"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5
+$as_echo "$ax_enable_builddir_sed" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ax_enable_builddir_auxdir="$am_aux_dir"
+ac_config_commands="$ac_config_commands buildir"
+
+
am__api_version='1.11'
# Find a good install program. We prefer a C program (faster),
@@ -2723,7 +2782,7 @@ am__api_version='1.11'
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
+if ${ac_cv_path_install+:} false; then :
$as_echo_n "(cached) " >&6
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -2810,11 +2869,11 @@ am_lf='
'
case `pwd` in
*[\\\"\#\$\&\'\`$am_lf]*)
- as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
esac
case $srcdir in
*[\\\"\#\$\&\'\`$am_lf\ \ ]*)
- as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+ as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
esac
# Do `set' in a subshell so we don't clobber the current shell's
@@ -2836,7 +2895,7 @@ if (
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
- as_fn_error "ls -t appears to fail. Make sure there is not a broken
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
alias in your environment" "$LINENO" 5
fi
@@ -2846,7 +2905,7 @@ then
# Ok.
:
else
- as_fn_error "newly created file is older than distributed files!
+ as_fn_error $? "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -2861,9 +2920,6 @@ test "$program_suffix" != NONE &&
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
@@ -2900,7 +2956,7 @@ if test "$cross_compiling" != no; then
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
+if ${ac_cv_prog_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$STRIP"; then
@@ -2940,7 +2996,7 @@ if test -z "$ac_cv_prog_STRIP"; then
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_STRIP"; then
@@ -2993,7 +3049,7 @@ INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
- if test "${ac_cv_path_mkdir+set}" = set; then :
+ if ${ac_cv_path_mkdir+:} false; then :
$as_echo_n "(cached) " >&6
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3044,7 +3100,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
+if ${ac_cv_prog_AWK+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AWK"; then
@@ -3084,7 +3140,7 @@ done
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
$as_echo_n "(cached) " >&6
else
cat >conftest.make <<\_ACEOF
@@ -3092,7 +3148,7 @@ SHELL = /bin/sh
all:
@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
*@@@%%%=?*=@@@%%%*)
eval ac_cv_prog_make_${ac_make}_set=yes;;
@@ -3126,7 +3182,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then
am__isrc=' -I$(srcdir)'
# test to see if srcdir already configured
if test -f $srcdir/config.status; then
- as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
fi
fi
@@ -3142,7 +3198,7 @@ fi
# Define the identity of the package.
PACKAGE='libffi'
- VERSION='3.0.10rc0'
+ VERSION='3.0.11'
cat >>confdefs.h <<_ACEOF
@@ -3172,11 +3228,11 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
@@ -3187,9 +3243,12 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
# We must force CC to /not/ be precious variables; otherwise
# the wrong, non-multilib-adjusted value will be used in multilibs.
# As a side effect, we have to subst CFLAGS ourselves.
+# Also save and restore CFLAGS, since AC_PROG_CC will come up with
+# defaults of its own if none are provided.
+save_CFLAGS=$CFLAGS
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3200,7 +3259,7 @@ if test -n "$ac_tool_prefix"; then
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -3240,7 +3299,7 @@ if test -z "$ac_cv_prog_CC"; then
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
@@ -3293,7 +3352,7 @@ if test -z "$CC"; then
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -3333,7 +3392,7 @@ if test -z "$CC"; then
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -3392,7 +3451,7 @@ if test -z "$CC"; then
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -3436,7 +3495,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
@@ -3490,8 +3549,8 @@ fi
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -3605,9 +3664,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -3649,8 +3707,8 @@ done
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -3707,9 +3765,9 @@ $as_echo "$ac_try_echo"; } >&5
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
+as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
@@ -3720,7 +3778,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
+if ${ac_cv_objext+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3760,8 +3818,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
@@ -3771,7 +3829,7 @@ OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3808,7 +3866,7 @@ ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
@@ -3886,7 +3944,7 @@ else
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
@@ -4032,6 +4090,7 @@ fi
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
if test "x$enable_dependency_tracking" != xno; then
AMDEP_TRUE=
@@ -4047,7 +4106,7 @@ depcc="$CC" am_compiler_list=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
@@ -4056,6 +4115,7 @@ else
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -4115,7 +4175,7 @@ else
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -4170,6 +4230,7 @@ else
fi
+CFLAGS=$save_CFLAGS
@@ -4186,7 +4247,7 @@ depcc="$CCAS" am_compiler_list=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CCAS_dependencies_compiler_type+set}" = set; then :
+if ${am_cv_CCAS_dependencies_compiler_type+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
@@ -4195,6 +4256,7 @@ else
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -4252,7 +4314,7 @@ else
break
fi
;;
- msvisualcpp | msvcmsys)
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
@@ -4316,7 +4378,7 @@ $as_echo_n "checking whether cc understands -c and -o together... " >&6; }
fi
set dummy $CC; ac_cc=`$as_echo "$2" |
sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4441,8 +4503,8 @@ esac
-macro_version='2.2.6'
-macro_revision='1.3012'
+macro_version='2.4.2'
+macro_revision='1.3337'
@@ -4458,9 +4520,78 @@ macro_revision='1.3012'
ltmain="$ac_aux_dir/ltmain.sh"
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case "$ECHO" in
+ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
+if ${ac_cv_path_SED+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
@@ -4515,7 +4646,7 @@ esac
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_SED"; then
- as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
fi
else
ac_cv_path_SED=$SED
@@ -4542,7 +4673,7 @@ Xsed="$SED -e 1s/^X//"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
+if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
@@ -4591,7 +4722,7 @@ esac
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_GREP"; then
- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_GREP=$GREP
@@ -4605,7 +4736,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
+if ${ac_cv_path_EGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -4657,7 +4788,7 @@ esac
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_EGREP"; then
- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_EGREP=$EGREP
@@ -4672,7 +4803,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
+if ${ac_cv_path_FGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
@@ -4724,7 +4855,7 @@ esac
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_FGREP"; then
- as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_FGREP=$FGREP
@@ -4803,7 +4934,7 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
-if test "${lt_cv_path_LD+set}" = set; then :
+if ${lt_cv_path_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$LD"; then
@@ -4840,10 +4971,10 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+if ${lt_cv_prog_gnu_ld+:} false; then :
$as_echo_n "(cached) " >&6
else
# I'd rather use --version here, but apparently some GNU lds only accept -v.
@@ -4870,7 +5001,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
+if ${lt_cv_path_NM+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NM"; then
@@ -4923,14 +5054,17 @@ if test "$lt_cv_path_NM" != "no"; then
NM="$lt_cv_path_NM"
else
# Didn't find any BSD compatible name lister, look for dumpbin.
- if test -n "$ac_tool_prefix"; then
- for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+if ${ac_cv_prog_DUMPBIN+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DUMPBIN"; then
@@ -4968,13 +5102,13 @@ fi
fi
if test -z "$DUMPBIN"; then
ac_ct_DUMPBIN=$DUMPBIN
- for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+ for ac_prog in dumpbin "link -dump"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_DUMPBIN"; then
@@ -5023,6 +5157,15 @@ esac
fi
fi
+ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
if test "$DUMPBIN" != ":"; then
NM="$DUMPBIN"
@@ -5037,18 +5180,18 @@ test -z "$NM" && NM=nm
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
+if ${lt_cv_nm_interface+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:5045: $ac_compile\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5
- (eval echo "\"\$as_me:5048: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&5
- (eval echo "\"\$as_me:5051: output\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
@@ -5072,7 +5215,7 @@ fi
# find the maximum length of command line arguments
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
+if ${lt_cv_sys_max_cmd_len+:} false; then :
$as_echo_n "(cached) " >&6
else
i=0
@@ -5105,6 +5248,11 @@ else
lt_cv_sys_max_cmd_len=8192;
;;
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
@@ -5130,6 +5278,11 @@ else
lt_cv_sys_max_cmd_len=196608
;;
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -5169,8 +5322,8 @@ else
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
- while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
- = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
test $i != 17 # 1/2 MB should be enough
do
i=`expr $i + 1`
@@ -5212,8 +5365,8 @@ $as_echo_n "checking whether the shell understands some XSI constructs... " >&6;
# Try some XSI features
xsi_shell=no
( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,, \
+ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+ = c,a/b,b/c, \
&& eval 'test $(( 1 + 1 )) -eq 2 \
&& test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
&& xsi_shell=yes
@@ -5262,9 +5415,83 @@ esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
+if ${lt_cv_ld_reload_flag+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ld_reload_flag='-r'
@@ -5278,6 +5505,11 @@ case $reload_flag in
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test "$GCC" != yes; then
+ reload_cmds=false
+ fi
+ ;;
darwin*)
if test "$GCC" = yes; then
reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
@@ -5300,7 +5532,7 @@ if test -n "$ac_tool_prefix"; then
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+if ${ac_cv_prog_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJDUMP"; then
@@ -5340,7 +5572,7 @@ if test -z "$ac_cv_prog_OBJDUMP"; then
set dummy objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJDUMP"; then
@@ -5399,7 +5631,7 @@ test -z "$OBJDUMP" && OBJDUMP=objdump
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
+if ${lt_cv_deplibs_check_method+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_file_magic_cmd='$MAGIC_CMD'
@@ -5441,16 +5673,18 @@ mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
- if ( file / ) >/dev/null 2>&1; then
+ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
-cegcc)
+cegcc*)
# use the weaker test based on 'objdump'. See mingw*.
lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
lt_cv_file_magic_cmd='$OBJDUMP -f'
@@ -5480,6 +5714,10 @@ gnu*)
lt_cv_deplibs_check_method=pass_all
;;
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
hpux10.20* | hpux11*)
lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
@@ -5488,11 +5726,11 @@ hpux10.20* | hpux11*)
lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
;;
hppa*64*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
;;
*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
lt_cv_file_magic_test_file=/usr/lib/libc.sl
;;
esac
@@ -5513,12 +5751,12 @@ irix5* | irix6* | nonstopux*)
lt_cv_deplibs_check_method=pass_all
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
lt_cv_deplibs_check_method=pass_all
;;
-netbsd*)
+netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
else
@@ -5595,6 +5833,21 @@ esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -5610,12 +5863,166 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh
+ # decide which to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AR"; then
@@ -5628,7 +6035,7 @@ do
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_AR="${ac_tool_prefix}ar"
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
@@ -5648,14 +6055,18 @@ $as_echo "no" >&6; }
fi
+ test -n "$AR" && break
+ done
fi
-if test -z "$ac_cv_prog_AR"; then
+if test -z "$AR"; then
ac_ct_AR=$AR
- # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_AR"; then
@@ -5668,7 +6079,7 @@ do
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_AR="ar"
+ ac_cv_prog_ac_ct_AR="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
@@ -5687,6 +6098,10 @@ else
$as_echo "no" >&6; }
fi
+
+ test -n "$ac_ct_AR" && break
+done
+
if test "x$ac_ct_AR" = x; then
AR="false"
else
@@ -5698,12 +6113,11 @@ ac_tool_warned=yes ;;
esac
AR=$ac_ct_AR
fi
-else
- AR="$ac_cv_prog_AR"
fi
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
@@ -5714,13 +6128,70 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -eq 0; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -ne 0; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
+if ${ac_cv_prog_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$STRIP"; then
@@ -5760,7 +6231,7 @@ if test -z "$ac_cv_prog_STRIP"; then
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_STRIP"; then
@@ -5819,7 +6290,7 @@ if test -n "$ac_tool_prefix"; then
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
+if ${ac_cv_prog_RANLIB+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$RANLIB"; then
@@ -5859,7 +6330,7 @@ if test -z "$ac_cv_prog_RANLIB"; then
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_RANLIB"; then
@@ -5921,15 +6392,27 @@ old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
;;
*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
;;
esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
@@ -5976,7 +6459,7 @@ compiler=$CC
# Check for command to grab the raw symbol name followed by C symbol from nm.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
$as_echo_n "(cached) " >&6
else
@@ -6037,8 +6520,8 @@ esac
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
# Handle CRLF in mingw tool chain
opt_cr=
@@ -6062,6 +6545,7 @@ for ac_symprfx in "" "_"; do
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK '"\
" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
" \$ 0!~/External *\|/{next};"\
" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -6074,6 +6558,7 @@ for ac_symprfx in "" "_"; do
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -6099,8 +6584,8 @@ _LT_EOF
test $ac_status = 0; }; then
# Now try to grab the symbols.
nlist=conftest.nm
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
- (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s "$nlist"; then
@@ -6115,6 +6600,18 @@ _LT_EOF
if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -6126,7 +6623,7 @@ _LT_EOF
cat <<_LT_EOF >> conftest.$ac_ext
/* The mapping between symbol names and symbols. */
-const struct {
+LT_DLSYM_CONST struct {
const char *name;
void *address;
}
@@ -6152,8 +6649,8 @@ static const void *lt_preloaded_setup() {
_LT_EOF
# Now try linking the two files.
mv conftest.$ac_objext conftstm.$ac_objext
- lt_save_LIBS="$LIBS"
- lt_save_CFLAGS="$CFLAGS"
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
LIBS="conftstm.$ac_objext"
CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
@@ -6163,8 +6660,8 @@ _LT_EOF
test $ac_status = 0; } && test -s conftest${ac_exeext}; then
pipe_works=yes
fi
- LIBS="$lt_save_LIBS"
- CFLAGS="$lt_save_CFLAGS"
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
else
echo "cannot find nm_test_func in $nlist" >&5
fi
@@ -6201,6 +6698,13 @@ else
$as_echo "ok" >&6; }
fi
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
@@ -6223,6 +6727,47 @@ fi
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+ withval=$with_sysroot;
+else
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+ if test "$GCC" = yes; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
# Check whether --enable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then :
enableval=$enable_libtool_lock;
@@ -6254,7 +6799,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 6257 "configure"' > conftest.$ac_ext
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -6348,7 +6893,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
CFLAGS="$CFLAGS -belf"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
+if ${lt_cv_cc_needs_belf+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_ext=c
@@ -6389,7 +6934,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
CFLAGS="$SAVE_CFLAGS"
fi
;;
-sparc*-*solaris*)
+*-*solaris*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
@@ -6400,7 +6945,20 @@ sparc*-*solaris*)
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
- yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ yes*)
+ case $host in
+ i?86-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD="${LD-ld}_sol2"
+ fi
+ ;;
*)
if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
LD="${LD-ld} -64"
@@ -6416,6 +6974,123 @@ esac
need_locks="$enable_libtool_lock"
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
case $host_os in
rhapsody* | darwin*)
@@ -6424,7 +7099,7 @@ need_locks="$enable_libtool_lock"
set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DSYMUTIL"; then
@@ -6464,7 +7139,7 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then
set dummy dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_DSYMUTIL"; then
@@ -6516,7 +7191,7 @@ fi
set dummy ${ac_tool_prefix}nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
+if ${ac_cv_prog_NMEDIT+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NMEDIT"; then
@@ -6556,7 +7231,7 @@ if test -z "$ac_cv_prog_NMEDIT"; then
set dummy nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_NMEDIT"; then
@@ -6608,7 +7283,7 @@ fi
set dummy ${ac_tool_prefix}lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
+if ${ac_cv_prog_LIPO+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$LIPO"; then
@@ -6648,7 +7323,7 @@ if test -z "$ac_cv_prog_LIPO"; then
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_LIPO"; then
@@ -6700,7 +7375,7 @@ fi
set dummy ${ac_tool_prefix}otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
+if ${ac_cv_prog_OTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OTOOL"; then
@@ -6740,7 +7415,7 @@ if test -z "$ac_cv_prog_OTOOL"; then
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OTOOL"; then
@@ -6792,7 +7467,7 @@ fi
set dummy ${ac_tool_prefix}otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
+if ${ac_cv_prog_OTOOL64+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OTOOL64"; then
@@ -6832,7 +7507,7 @@ if test -z "$ac_cv_prog_OTOOL64"; then
set dummy otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OTOOL64"; then
@@ -6907,7 +7582,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
+if ${lt_cv_apple_cc_single_mod+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_apple_cc_single_mod=no
@@ -6923,7 +7598,13 @@ else
$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c 2>conftest.err
_lt_result=$?
- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test $_lt_result -eq 0; then
lt_cv_apple_cc_single_mod=yes
else
cat conftest.err >&5
@@ -6934,9 +7615,10 @@ else
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_ld_exported_symbols_list=no
@@ -6966,6 +7648,41 @@ rm -f core conftest.err conftest.$ac_objext \
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
case $host_os in
rhapsody* | darwin1.[012])
_lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
@@ -6993,7 +7710,7 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
else
_lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
fi
- if test "$DSYMUTIL" != ":"; then
+ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
_lt_dsymutil='~$DSYMUTIL $lib || :'
else
_lt_dsymutil=
@@ -7013,7 +7730,7 @@ if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
- if test "${ac_cv_prog_CPP+set}" = set; then :
+ if ${ac_cv_prog_CPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CPP needs to be expanded
@@ -7043,7 +7760,7 @@ else
# Broken: fails on valid input.
continue
fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
@@ -7059,11 +7776,11 @@ else
ac_preproc_ok=:
break
fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
break
fi
@@ -7102,7 +7819,7 @@ else
# Broken: fails on valid input.
continue
fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
@@ -7118,18 +7835,18 @@ else
ac_preproc_ok=:
break
fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=c
@@ -7141,7 +7858,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
+if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7258,8 +7975,7 @@ do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
-eval as_val=\$$as_ac_Header
- if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
@@ -7273,7 +7989,7 @@ for ac_header in dlfcn.h
do :
ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_DLFCN_H 1
_ACEOF
@@ -7284,6 +8000,8 @@ done
+
+
# Set options
@@ -7359,7 +8077,22 @@ fi
# Check whether --with-pic was given.
if test "${with_pic+set}" = set; then :
- withval=$with_pic; pic_mode="$withval"
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for lt_pkg in $withval; do
+ IFS="$lt_save_ifs"
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
else
pic_mode=default
fi
@@ -7436,6 +8169,11 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
test -z "$LN_S" && LN_S="ln -s"
@@ -7457,7 +8195,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
+if ${lt_cv_objdir+:} false; then :
$as_echo_n "(cached) " >&6
else
rm -f .libs 2>/dev/null
@@ -7485,19 +8223,6 @@ _ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
case $host_os in
aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
@@ -7510,23 +8235,6 @@ aix3*)
;;
esac
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
# Global variables:
ofile=libtool
can_build_shared=yes
@@ -7555,7 +8263,7 @@ for cc_temp in $compiler""; do
*) break;;
esac
done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
# Only perform the check for file, if the check method requires it
@@ -7565,7 +8273,7 @@ file_magic*)
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MAGIC_CMD in
@@ -7631,7 +8339,7 @@ if test -z "$lt_cv_path_MAGIC_CMD"; then
if test -n "$ac_tool_prefix"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MAGIC_CMD in
@@ -7764,11 +8472,16 @@ if test -n "$compiler"; then
lt_prog_compiler_no_builtin_flag=
if test "$GCC" = yes; then
- lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_rtti_exceptions=no
@@ -7784,15 +8497,15 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:7787: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:7791: \$? = $ac_status" >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_rtti_exceptions=yes
@@ -7821,8 +8534,6 @@ fi
lt_prog_compiler_pic=
lt_prog_compiler_static=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
if test "$GCC" = yes; then
lt_prog_compiler_wl='-Wl,'
@@ -7870,6 +8581,12 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
lt_prog_compiler_pic='-fno-common'
;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
hpux*)
# PIC is the default for 64-bit PA HP-UX, but not for 32-bit
# PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
@@ -7912,6 +8629,15 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
lt_prog_compiler_pic='-fPIC'
;;
esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
else
# PORTME Check for flag to pass linker flags through the system compiler.
case $host_os in
@@ -7953,7 +8679,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
lt_prog_compiler_static='-non_shared'
;;
- linux* | k*bsd*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
case $cc_basename in
# old Intel for x86_64 which still supported -KPIC.
ecc*)
@@ -7974,7 +8700,13 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
lt_prog_compiler_pic='--shared'
lt_prog_compiler_static='--static'
;;
- pgcc* | pgf77* | pgf90* | pgf95*)
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
lt_prog_compiler_wl='-Wl,'
@@ -7986,25 +8718,40 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# All Alpha code is PIC.
lt_prog_compiler_static='-non_shared'
;;
- xl*)
- # IBM XL C 8.0/Fortran 10.1 on PPC
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-qpic'
lt_prog_compiler_static='-qstaticlink'
;;
*)
case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
*Sun\ C*)
# Sun C 5.9
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl='-Wl,'
;;
- *Sun\ F*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- lt_prog_compiler_pic='-KPIC'
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl=''
;;
esac
;;
@@ -8036,7 +8783,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
case $cc_basename in
- f77* | f90* | f95*)
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
lt_prog_compiler_wl='-Qoption ld ';;
*)
lt_prog_compiler_wl='-Wl,';;
@@ -8093,13 +8840,17 @@ case $host_os in
lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
#
# Check to make sure the PIC flag actually works.
@@ -8107,7 +8858,7 @@ $as_echo "$lt_prog_compiler_pic" >&6; }
if test -n "$lt_prog_compiler_pic"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_pic_works=no
@@ -8123,15 +8874,15 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8126: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:8130: \$? = $ac_status" >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_pic_works=yes
@@ -8160,13 +8911,18 @@ fi
+
+
+
+
+
#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
+if ${lt_cv_prog_compiler_static_works+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_static_works=no
@@ -8179,7 +8935,7 @@ else
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&5
- $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
lt_cv_prog_compiler_static_works=yes
@@ -8209,7 +8965,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+if ${lt_cv_prog_compiler_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o=no
@@ -8228,16 +8984,16 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8231: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:8235: \$? = $ac_status" >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o=yes
@@ -8264,7 +9020,7 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+if ${lt_cv_prog_compiler_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_c_o=no
@@ -8283,16 +9039,16 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8286: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:8290: \$? = $ac_status" >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
lt_cv_prog_compiler_c_o=yes
@@ -8358,7 +9114,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
hardcode_direct=no
hardcode_direct_absolute=no
hardcode_libdir_flag_spec=
- hardcode_libdir_flag_spec_ld=
hardcode_libdir_separator=
hardcode_minus_L=no
hardcode_shlibpath_var=unsupported
@@ -8402,10 +9157,39 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
openbsd*)
with_gnu_ld=no
;;
+ linux* | k*bsd*-gnu | gnu*)
+ link_all_deplibs=no
+ ;;
esac
ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
if test "$with_gnu_ld" = yes; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test "$lt_use_gnu_ld_interface" = yes; then
# If archive_cmds runs LD, not CC, wlarc should be empty
wlarc='${wl}'
@@ -8423,6 +9207,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
fi
supports_anon_versioning=no
case `$LD -v 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@@ -8438,11 +9223,12 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
ld_shlibs=no
cat <<_LT_EOF 1>&2
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** Warning: the GNU linker, at least up to release 2.19, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
_LT_EOF
fi
@@ -8478,10 +9264,12 @@ _LT_EOF
# _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='${wl}--export-all-symbols'
allow_undefined_flag=unsupported
always_export_symbols=no
enable_shared_with_static_runtimes=yes
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -8499,6 +9287,11 @@ _LT_EOF
fi
;;
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
interix[3-9]*)
hardcode_direct=no
hardcode_shlibpath_var=no
@@ -8514,7 +9307,7 @@ _LT_EOF
archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
- gnu* | linux* | tpf* | k*bsd*-gnu)
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
tmp_diet=no
if test "$host_os" = linux-dietlibc; then
case $cc_basename in
@@ -8524,15 +9317,16 @@ _LT_EOF
if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
&& test "$tmp_diet" = no
then
- tmp_addflag=
+ tmp_addflag=' $pic_flag'
tmp_sharedflag='-shared'
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
- pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
@@ -8543,13 +9337,17 @@ _LT_EOF
lf95*) # Lahey Fortran 8.1
whole_archive_flag_spec=
tmp_sharedflag='--shared' ;;
- xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
tmp_sharedflag='-qmkshrobj'
tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
esac
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
compiler_needs_object=yes
tmp_sharedflag='-G' ;;
*Sun\ F*) # Sun Fortran 8.3
@@ -8565,17 +9363,16 @@ _LT_EOF
fi
case $cc_basename in
- xlf*)
+ xlf* | bgf* | bgxlf* | mpixlf*)
# IBM XL Fortran 10.1 on PPC cannot create shared libs itself
whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
- hardcode_libdir_flag_spec=
- hardcode_libdir_flag_spec_ld='-rpath $libdir'
- archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test "x$supports_anon_versioning" = xyes; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
;;
esac
@@ -8584,13 +9381,13 @@ _LT_EOF
fi
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
@@ -8608,8 +9405,8 @@ _LT_EOF
_LT_EOF
elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
@@ -8655,8 +9452,8 @@ _LT_EOF
*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
@@ -8696,8 +9493,10 @@ _LT_EOF
else
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global
+ # defined symbols, whereas GNU nm marks them as "W".
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
else
export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
fi
@@ -8759,6 +9558,7 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
+ link_all_deplibs=no
else
# not using gcc
if test "$host_cpu" = ia64; then
@@ -8784,7 +9584,13 @@ _LT_EOF
allow_undefined_flag='-berok'
# Determine the default libpath from the value encoded in an
# empty executable.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -8797,25 +9603,32 @@ main ()
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
-lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\(.*\)$/\1/
- p
- }
- }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
@@ -8824,7 +9637,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
else
# Determine the default libpath from the value encoded in an
# empty executable.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -8837,30 +9656,42 @@ main ()
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
-lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\(.*\)$/\1/
- p
- }
- }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_="/usr/lib:/lib"
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
no_undefined_flag=' ${wl}-bernotok'
allow_undefined_flag=' ${wl}-berok'
- # Exported symbols can be pulled into shared objects from archives
- whole_archive_flag_spec='$convenience'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
archive_cmds_need_lc=yes
# This is similar to how AIX traditionally builds its shared libraries.
archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
@@ -8892,20 +9723,64 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
- fix_srcfile_path='`cygpath -w "$srcfile"`'
- enable_shared_with_static_runtimes=yes
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
;;
darwin* | rhapsody*)
@@ -8915,7 +9790,12 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_direct=no
hardcode_automatic=yes
hardcode_shlibpath_var=unsupported
- whole_archive_flag_spec=''
+ if test "$lt_cv_ld_force_load" = "yes"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
link_all_deplibs=yes
allow_undefined_flag="$_lt_dar_allow_undefined"
case $cc_basename in
@@ -8923,7 +9803,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
*) _lt_dar_can_shared=$GCC ;;
esac
if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=echo
+ output_verbose_link_cmd=func_echo_all
archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
@@ -8941,10 +9821,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hardcode_shlibpath_var=no
;;
- freebsd1*)
- ld_shlibs=no
- ;;
-
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
@@ -8957,7 +9833,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
+ freebsd2.*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_minus_L=yes
@@ -8966,7 +9842,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
freebsd* | dragonfly*)
- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
hardcode_shlibpath_var=no
@@ -8974,7 +9850,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
hpux9*)
if test "$GCC" = yes; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
fi
@@ -8989,14 +9865,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
;;
hpux10*)
- if test "$GCC" = yes -a "$with_gnu_ld" = no; then
- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
if test "$with_gnu_ld" = no; then
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_flag_spec_ld='+b $libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
hardcode_direct_absolute=yes
@@ -9008,16 +9883,16 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
;;
hpux11*)
- if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
case $host_cpu in
hppa*64*)
archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
@@ -9029,7 +9904,46 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
;;
esac
fi
@@ -9057,26 +9971,39 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
irix5* | irix6* | nonstopux*)
if test "$GCC" = yes; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
# Try to use the -exported_symbol ld option, if it does not
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ # This should be the same for all languages, so no per-tag cache variable.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-int foo(void) {}
+int foo (void) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
+ lt_cv_irix_exported_symbol=yes
+else
+ lt_cv_irix_exported_symbol=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+ if test "$lt_cv_irix_exported_symbol" = yes; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ fi
else
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
fi
archive_cmds_need_lc='no'
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
@@ -9085,7 +10012,7 @@ rm -f core conftest.err conftest.$ac_objext \
link_all_deplibs=yes
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
@@ -9138,17 +10065,17 @@ rm -f core conftest.err conftest.$ac_objext \
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
allow_undefined_flag=unsupported
- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
;;
osf3*)
if test "$GCC" = yes; then
allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
fi
archive_cmds_need_lc='no'
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
@@ -9158,13 +10085,13 @@ rm -f core conftest.err conftest.$ac_objext \
osf4* | osf5*) # as osf3* with the addition of -msym flag
if test "$GCC" = yes; then
allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
else
allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
# Both c and cxx compiler support -rpath directly
hardcode_libdir_flag_spec='-rpath $libdir'
@@ -9177,9 +10104,9 @@ rm -f core conftest.err conftest.$ac_objext \
no_undefined_flag=' -z defs'
if test "$GCC" = yes; then
wlarc='${wl}'
- archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
else
case `$CC -V 2>&1` in
*"Compilers 5.0"*)
@@ -9367,44 +10294,50 @@ x|xyes)
# to ld, don't add -lc before -lgcc.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_prog_compiler_wl
- pic_flag=$lt_prog_compiler_pic
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
(eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
- then
- archive_cmds_need_lc=no
- else
- archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
-$as_echo "$archive_cmds_need_lc" >&6; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
;;
esac
fi
@@ -9562,11 +10495,6 @@ esac
-
-
-
-
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }
@@ -9575,16 +10503,23 @@ if test "$GCC" = yes; then
darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
*) lt_awk_arg="/^libraries:/" ;;
esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
- if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+ *) lt_sed_strip_eq="s,=/,/,g" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
# if the path contains ";" then we assume it to be the separator
# otherwise default to the standard path separator (i.e. ":") - it is
# assumed that no part of a normal pathname contains ";" but that should
# okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
- else
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
# Ok, now we have the path, separated by spaces, we can step through it
# and add multilib dir if necessary.
lt_tmp_lt_search_path_spec=
@@ -9597,7 +10532,7 @@ if test "$GCC" = yes; then
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
fi
done
- lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS=" "; FS="/|\n";} {
lt_foo="";
lt_count=0;
@@ -9617,7 +10552,13 @@ BEGIN {RS=" "; FS="/|\n";} {
if (lt_foo != "") { lt_freq[lt_foo]++; }
if (lt_freq[lt_foo] == 1) { print lt_foo; }
}'`
- sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
@@ -9643,7 +10584,7 @@ need_version=unknown
case $host_os in
aix3*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
shlibpath_var=LIBPATH
@@ -9652,7 +10593,7 @@ aix3*)
;;
aix[4-9]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
@@ -9705,7 +10646,7 @@ amigaos*)
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
@@ -9717,7 +10658,7 @@ beos*)
;;
bsdi[45]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
@@ -9736,8 +10677,9 @@ cygwin* | mingw* | pw32* | cegcc*)
need_version=no
need_lib_prefix=no
- case $GCC,$host_os in
- yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \${file}`~
@@ -9758,36 +10700,83 @@ cygwin* | mingw* | pw32* | cegcc*)
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
- # It is most probably a Windows format PATH printed by
- # mingw gcc, but we are running on Cygwin. Gcc prints its search
- # path with ; separators, and with drive letters. We can handle the
- # drive letters (cygwin fileutils understands them), so leave them,
- # especially as we might pass files found there to a mingw objdump,
- # which wouldn't understand a cygwinified path. Ahh.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
;;
esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='${libname}.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec="$LIB"
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
;;
*)
+ # Assume MSVC wrapper
library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ dynamic_linker='Win32 ld.exe'
;;
esac
- dynamic_linker='Win32 ld.exe'
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
@@ -9808,7 +10797,7 @@ darwin* | rhapsody*)
;;
dgux*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -9816,10 +10805,6 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd1*)
- dynamic_linker=no
- ;;
-
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
@@ -9827,7 +10812,7 @@ freebsd* | dragonfly*)
objformat=`/usr/bin/objformat`
else
case $host_os in
- freebsd[123]*) objformat=aout ;;
+ freebsd[23].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
@@ -9845,7 +10830,7 @@ freebsd* | dragonfly*)
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
- freebsd2*)
+ freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[01]* | freebsdelf3.[01]*)
@@ -9865,12 +10850,26 @@ freebsd* | dragonfly*)
;;
gnu*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
@@ -9916,12 +10915,14 @@ hpux9* | hpux10* | hpux11*)
soname_spec='${libname}${release}${shared_ext}$major'
;;
esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
;;
interix[3-9]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -9937,7 +10938,7 @@ irix5* | irix6* | nonstopux*)
nonstopux*) version_type=nonstopux ;;
*)
if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
@@ -9974,9 +10975,9 @@ linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
- version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -9984,12 +10985,17 @@ linux* | k*bsd*-gnu)
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
+
# Some binutils ld are patched to set DT_RUNPATH
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -10002,26 +11008,27 @@ main ()
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
- shlibpath_overrides_runpath=yes
+ lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
- # Add ABI-specific directories to the system library path.
- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
# Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
@@ -10033,6 +11040,18 @@ rm -f core conftest.err conftest.$ac_objext \
dynamic_linker='GNU/Linux ld.so'
;;
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
netbsd*)
version_type=sunos
need_lib_prefix=no
@@ -10052,7 +11071,7 @@ netbsd*)
;;
newsos6)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
@@ -10121,7 +11140,7 @@ rdos*)
;;
solaris*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -10146,7 +11165,7 @@ sunos4*)
;;
sysv4 | sysv4.3*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -10170,7 +11189,7 @@ sysv4 | sysv4.3*)
sysv4*MP*)
if test -d /usr/nec ;then
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
soname_spec='$libname${shared_ext}.$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -10201,7 +11220,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -10211,7 +11230,7 @@ tpf*)
;;
uts4*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -10323,6 +11342,11 @@ fi
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
@@ -10395,7 +11419,7 @@ else
# if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -10429,7 +11453,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else
@@ -10443,12 +11467,12 @@ fi
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
+if test "x$ac_cv_func_shl_load" = xyes; then :
lt_cv_dlopen="shl_load"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+if ${ac_cv_lib_dld_shl_load+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -10482,16 +11506,16 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
+if test "x$ac_cv_func_dlopen" = xyes; then :
lt_cv_dlopen="dlopen"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -10525,12 +11549,12 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
+if ${ac_cv_lib_svld_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -10564,12 +11588,12 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
+if ${ac_cv_lib_dld_dld_link+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -10603,7 +11627,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
fi
@@ -10644,7 +11668,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
+if ${lt_cv_dlopen_self+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
@@ -10653,7 +11677,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10656 "configure"
+#line $LINENO "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10694,7 +11718,13 @@ else
# endif
#endif
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -10703,7 +11733,11 @@ int main ()
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
/* dlclose (self); */
}
else
@@ -10740,7 +11774,7 @@ $as_echo "$lt_cv_dlopen_self" >&6; }
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
+if ${lt_cv_dlopen_self_static+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
@@ -10749,7 +11783,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10752 "configure"
+#line $LINENO "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10790,7 +11824,13 @@ else
# endif
#endif
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -10799,7 +11839,11 @@ int main ()
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
/* dlclose (self); */
}
else
@@ -10968,6 +12012,8 @@ CC="$lt_save_CC"
+
+
ac_config_commands="$ac_config_commands libtool"
@@ -10978,6 +12024,977 @@ CC="$lt_save_CC"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
+$as_echo_n "checking for C compiler vendor... " >&6; }
+if ${ax_cv_c_compiler_vendor+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # note: don't check for gcc first since some other compilers define __GNUC__
+ vendors="intel: __ICC,__ECC,__INTEL_COMPILER
+ ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__
+ pathscale: __PATHCC__,__PATHSCALE__
+ clang: __clang__
+ gnu: __GNUC__
+ sun: __SUNPRO_C,__SUNPRO_CC
+ hp: __HP_cc,__HP_aCC
+ dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
+ borland: __BORLANDC__,__TURBOC__
+ comeau: __COMO__
+ cray: _CRAYC
+ kai: __KCC
+ lcc: __LCC__
+ sgi: __sgi,sgi
+ microsoft: _MSC_VER
+ metrowerks: __MWERKS__
+ watcom: __WATCOMC__
+ portland: __PGI
+ unknown: UNKNOWN"
+ for ventest in $vendors; do
+ case $ventest in
+ *:) vendor=$ventest; continue ;;
+ *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ #if !($vencpp)
+ thisisanerror;
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+ ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1`
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
+$as_echo "$ax_cv_c_compiler_vendor" >&6; }
+
+
+
+
+
+
+# Check whether --enable-portable-binary was given.
+if test "${enable_portable_binary+set}" = set; then :
+ enableval=$enable_portable_binary; acx_maxopt_portable=$withval
+else
+ acx_maxopt_portable=no
+fi
+
+
+# Try to determine "good" native compiler flags if none specified via CFLAGS
+if test "$ac_test_CFLAGS" != "set"; then
+ CFLAGS=""
+ case $ax_cv_c_compiler_vendor in
+ dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
+ if test "x$acx_maxopt_portable" = xno; then
+ CFLAGS="$CFLAGS -arch host"
+ fi;;
+
+ sun) CFLAGS="-native -fast -xO5 -dalign"
+ if test "x$acx_maxopt_portable" = xyes; then
+ CFLAGS="$CFLAGS -xarch=generic"
+ fi;;
+
+ hp) CFLAGS="+Oall +Optrs_ansi +DSnative"
+ if test "x$acx_maxopt_portable" = xyes; then
+ CFLAGS="$CFLAGS +DAportable"
+ fi;;
+
+ ibm) if test "x$acx_maxopt_portable" = xno; then
+ xlc_opt="-qarch=auto -qtune=auto"
+ else
+ xlc_opt="-qtune=auto"
+ fi
+ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$xlc_opt" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
+$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS $xlc_opt"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_CACHEVAR=yes"
+else
+ eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
+ CFLAGS="-O3 -qansialias -w $xlc_opt"
+else
+ CFLAGS="-O3 -qansialias -w"
+ echo "******************************************************"
+ echo "* You seem to have the IBM C compiler. It is *"
+ echo "* recommended for best performance that you use: *"
+ echo "* *"
+ echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
+ echo "* ^^^ ^^^ *"
+ echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *"
+ echo "* CPU you have. (Set the CFLAGS environment var. *"
+ echo "* and re-run configure.) For more info, man cc. *"
+ echo "******************************************************"
+fi
+
+ ;;
+
+ intel) CFLAGS="-O3 -ansi_alias"
+ if test "x$acx_maxopt_portable" = xno; then
+ icc_archflag=unknown
+ icc_flags=""
+ case $host_cpu in
+ i686*|x86_64*)
+ # icc accepts gcc assembly syntax, so these should work:
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
+$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ax_cv_gcc_x86_cpuid_0=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+ int op = 0, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+ ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
+$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_1+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ax_cv_gcc_x86_cpuid_1=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+ int op = 1, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+ ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
+ *:756e6547:*:*) # Intel
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
+ *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
+ *f??:*:*:*) icc_flags="-xN -xW -xK";;
+ esac ;;
+ esac ;;
+ esac
+ if test "x$icc_flags" != x; then
+ for flag in $icc_flags; do
+ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS $flag"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_CACHEVAR=yes"
+else
+ eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
+ icc_archflag=$flag; break
+else
+ :
+fi
+
+ done
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
+$as_echo_n "checking for icc architecture flag... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
+$as_echo "$icc_archflag" >&6; }
+ if test "x$icc_archflag" != xunknown; then
+ CFLAGS="$CFLAGS $icc_archflag"
+ fi
+ fi
+ ;;
+
+ gnu)
+ # default optimization flags for gcc on all systems
+ CFLAGS="-O3 -fomit-frame-pointer"
+
+ # -malign-double for x86 systems
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5
+$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; }
+if ${ax_cv_check_cflags___malign_double+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS -malign-double"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ax_cv_check_cflags___malign_double=yes
+else
+ ax_cv_check_cflags___malign_double=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___malign_double" >&5
+$as_echo "$ax_cv_check_cflags___malign_double" >&6; }
+if test x"$ax_cv_check_cflags___malign_double" = xyes; then :
+ CFLAGS="$CFLAGS -malign-double"
+else
+ :
+fi
+
+
+ # -fstrict-aliasing for gcc-2.95+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
+$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
+if ${ax_cv_check_cflags___fstrict_aliasing+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS -fstrict-aliasing"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ax_cv_check_cflags___fstrict_aliasing=yes
+else
+ ax_cv_check_cflags___fstrict_aliasing=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fstrict_aliasing" >&5
+$as_echo "$ax_cv_check_cflags___fstrict_aliasing" >&6; }
+if test x"$ax_cv_check_cflags___fstrict_aliasing" = xyes; then :
+ CFLAGS="$CFLAGS -fstrict-aliasing"
+else
+ :
+fi
+
+
+ # note that we enable "unsafe" fp optimization with other compilers, too
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
+$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
+if ${ax_cv_check_cflags___ffast_math+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS -ffast-math"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ax_cv_check_cflags___ffast_math=yes
+else
+ ax_cv_check_cflags___ffast_math=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___ffast_math" >&5
+$as_echo "$ax_cv_check_cflags___ffast_math" >&6; }
+if test x"$ax_cv_check_cflags___ffast_math" = xyes; then :
+ CFLAGS="$CFLAGS -ffast-math"
+else
+ :
+fi
+
+
+
+
+
+
+# Check whether --with-gcc-arch was given.
+if test "${with_gcc_arch+set}" = set; then :
+ withval=$with_gcc_arch; ax_gcc_arch=$withval
+else
+ ax_gcc_arch=yes
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
+$as_echo_n "checking for gcc architecture flag... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+if ${ax_cv_gcc_archflag+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ax_cv_gcc_archflag="unknown"
+
+if test "$GCC" = yes; then
+
+if test "x$ax_gcc_arch" = xyes; then
+ax_gcc_arch=""
+if test "$cross_compiling" = no; then
+case $host_cpu in
+ i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
+$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ax_cv_gcc_x86_cpuid_0=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+ int op = 0, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+ ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
+$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_1+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ax_cv_gcc_x86_cpuid_1=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+ int op = 1, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+ ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ case $ax_cv_gcc_x86_cpuid_0 in
+ *:756e6547:*:*) # Intel
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
+ *5??:*:*:*) ax_gcc_arch=pentium ;;
+ *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+ *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+ *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+ *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
+ *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+ *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
+ *f3[347]:*:*:*|*f41347:*:*:*)
+ case $host_cpu in
+ x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
+ *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
+ esac ;;
+ *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
+ esac ;;
+ *:68747541:*:*) # AMD
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
+ *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
+ *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
+ *60?:*:*:*) ax_gcc_arch=k7 ;;
+ *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
+ *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
+ *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
+ *6[68a]?:*:*:*)
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
+$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ax_cv_gcc_x86_cpuid_0x80000006=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+
+ int op = 0x80000006, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+ ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ # L2 cache size
+ case $ax_cv_gcc_x86_cpuid_0x80000006 in
+ *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
+ ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
+ *) ax_gcc_arch="athlon-4 athlon k7" ;;
+ esac ;;
+ *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
+ *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
+ *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
+ *f??:*:*:*) ax_gcc_arch="k8" ;;
+ esac ;;
+ *:746e6543:*:*) # IDT
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
+ *58?:*:*:*) ax_gcc_arch=winchip2 ;;
+ *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
+ *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
+ esac ;;
+ esac
+ if test x"$ax_gcc_arch" = x; then # fallback
+ case $host_cpu in
+ i586*) ax_gcc_arch=pentium ;;
+ i686*) ax_gcc_arch=pentiumpro ;;
+ esac
+ fi
+ ;;
+
+ sparc*)
+ # Extract the first word of "prtdiag", so it can be a program name with args.
+set dummy prtdiag; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PRTDIAG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PRTDIAG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
+ ;;
+esac
+fi
+PRTDIAG=$ac_cv_path_PRTDIAG
+if test -n "$PRTDIAG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
+$as_echo "$PRTDIAG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
+ cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
+ case $cputype in
+ *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
+ *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
+ *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
+ *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
+ *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
+ *cypress*) ax_gcc_arch=cypress ;;
+ esac ;;
+
+ alphaev5) ax_gcc_arch=ev5 ;;
+ alphaev56) ax_gcc_arch=ev56 ;;
+ alphapca56) ax_gcc_arch="pca56 ev56" ;;
+ alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
+ alphaev6) ax_gcc_arch=ev6 ;;
+ alphaev67) ax_gcc_arch=ev67 ;;
+ alphaev68) ax_gcc_arch="ev68 ev67" ;;
+ alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
+ alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
+ alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
+
+ powerpc*)
+ cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
+ cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
+ case $cputype in
+ *750*) ax_gcc_arch="750 G3" ;;
+ *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
+ *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
+ *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
+ *970*) ax_gcc_arch="970 G5 power4";;
+ *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
+ *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
+ 603ev|8240) ax_gcc_arch="$cputype 603e 603";;
+ *) ax_gcc_arch=$cputype ;;
+ esac
+ ax_gcc_arch="$ax_gcc_arch powerpc"
+ ;;
+esac
+fi # not cross-compiling
+fi # guess arch
+
+if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
+for arch in $ax_gcc_arch; do
+ if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
+ flags="-mtune=$arch"
+ # -mcpu=$arch and m$arch generate nonportable code on every arch except
+ # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr.
+ case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
+ else
+ flags="-march=$arch -mcpu=$arch -m$arch"
+ fi
+ for flag in $flags; do
+ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS $flag"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_CACHEVAR=yes"
+else
+ eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
+ ax_cv_gcc_archflag=$flag; break
+else
+ :
+fi
+
+ done
+ test "x$ax_cv_gcc_archflag" = xunknown || break
+done
+fi
+
+fi # $GCC=yes
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
+$as_echo_n "checking for gcc architecture flag... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
+$as_echo "$ax_cv_gcc_archflag" >&6; }
+if test "x$ax_cv_gcc_archflag" = xunknown; then
+ :
+else
+ CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
+fi
+
+ ;;
+ esac
+
+ if test -z "$CFLAGS"; then
+ echo ""
+ echo "********************************************************"
+ echo "* WARNING: Don't know the best CFLAGS for this system *"
+ echo "* Use ./configure CFLAGS=... to specify your own flags *"
+ echo "* (otherwise, a default of CFLAGS=-O3 will be used) *"
+ echo "********************************************************"
+ echo ""
+ CFLAGS="-O3"
+ fi
+
+ as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$CFLAGS" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
+$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS $CFLAGS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_CACHEVAR=yes"
+else
+ eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
+ :
+else
+
+ echo ""
+ echo "********************************************************"
+ echo "* WARNING: The guessed CFLAGS don't seem to work with *"
+ echo "* your compiler. *"
+ echo "* Use ./configure CFLAGS=... to specify your own flags *"
+ echo "********************************************************"
+ echo ""
+ CFLAGS=""
+
+fi
+
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5
+$as_echo_n "checking CFLAGS for maximum warnings... " >&6; }
+if ${ac_cv_cflags_warn_all+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_cflags_warn_all="no, unknown"
+ac_save_CFLAGS="$CFLAGS"
+for ac_arg in "-warn all % -warn all" "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" #
+do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5
+$as_echo "$ac_cv_cflags_warn_all" >&6; }
+case ".$ac_cv_cflags_warn_all" in
+ .ok|.ok,*) ;;
+ .|.no|.no,*) ;;
+ *) if ${CFLAGS+:} false; then :
+ case " $CFLAGS " in
+ *" $ac_cv_cflags_warn_all "*)
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_warn_all"; } >&5
+ (: CFLAGS already contains $ac_cv_cflags_warn_all) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ ;;
+ *)
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5
+ (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ CFLAGS="$CFLAGS $ac_cv_cflags_warn_all"
+ ;;
+ esac
+else
+ CFLAGS="$ac_cv_cflags_warn_all"
+fi
+ ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+if test "x$GCC" = "xyes"; then
+ CFLAGS="$CFLAGS -fexceptions"
+fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
@@ -11005,7 +13022,7 @@ fi
for ac_header in sys/mman.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_MMAN_H 1
_ACEOF
@@ -11017,7 +13034,7 @@ done
for ac_func in mmap
do :
ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
-if test "x$ac_cv_func_mmap" = x""yes; then :
+if test "x$ac_cv_func_mmap" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_MMAP 1
_ACEOF
@@ -11027,7 +13044,7 @@ done
ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
libffi_header_sys_mman_h=yes
else
libffi_header_sys_mman_h=no
@@ -11035,7 +13052,7 @@ fi
ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
-if test "x$ac_cv_func_mmap" = x""yes; then :
+if test "x$ac_cv_func_mmap" = xyes; then :
libffi_func_mmap=yes
else
libffi_func_mmap=no
@@ -11049,7 +13066,7 @@ if test "$libffi_header_sys_mman_h" != yes \
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5
$as_echo_n "checking whether read-only mmap of a plain file works... " >&6; }
-if test "${ac_cv_func_mmap_file+set}" = set; then :
+if ${ac_cv_func_mmap_file+:} false; then :
$as_echo_n "(cached) " >&6
else
# Add a system to this blacklist if
@@ -11068,7 +13085,7 @@ fi
$as_echo "$ac_cv_func_mmap_file" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5
$as_echo_n "checking whether mmap from /dev/zero works... " >&6; }
-if test "${ac_cv_func_mmap_dev_zero+set}" = set; then :
+if ${ac_cv_func_mmap_dev_zero+:} false; then :
$as_echo_n "(cached) " >&6
else
# Add a system to this blacklist if it has mmap() but /dev/zero
@@ -11094,7 +13111,7 @@ $as_echo "$ac_cv_func_mmap_dev_zero" >&6; }
# Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5
$as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; }
-if test "${ac_cv_decl_map_anon+set}" = set; then :
+if ${ac_cv_decl_map_anon+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -11130,7 +13147,7 @@ $as_echo "$ac_cv_decl_map_anon" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5
$as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; }
-if test "${ac_cv_func_mmap_anon+set}" = set; then :
+if ${ac_cv_func_mmap_anon+:} false; then :
$as_echo_n "(cached) " >&6
else
# Add a system to this blacklist if it has mmap() and MAP_ANON or
@@ -11180,7 +13197,7 @@ TARGETDIR="unknown"
case "$host" in
alpha*-*-*)
TARGET=ALPHA; TARGETDIR=alpha;
- # Support 128-bit long double, changable via command-line switch.
+ # Support 128-bit long double, changeable via command-line switch.
HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
;;
@@ -11208,7 +13225,7 @@ case "$host" in
TARGET=FRV; TARGETDIR=frv
;;
- hppa*-*-linux* | parisc*-*-linux*)
+ hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
TARGET=PA_LINUX; TARGETDIR=pa
;;
hppa*64-*-hpux*)
@@ -11221,10 +13238,17 @@ case "$host" in
i?86-*-freebsd* | i?86-*-openbsd*)
TARGET=X86_FREEBSD; TARGETDIR=x86
;;
- i?86-win32* | i?86-*-cygwin* | i?86-*-mingw*)
+ i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
TARGET=X86_WIN32; TARGETDIR=x86
- # All mingw/cygwin/win32 builds require this for sharedlib
- AM_LTLDFLAGS="-no-undefined"
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+ # or cross-build and select where to install dlls appropriately.
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+ else
+ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+ fi
;;
i?86-*-darwin*)
TARGET=X86_DARWIN; TARGETDIR=x86
@@ -11236,7 +13260,7 @@ case "$host" in
TARGET=X86; TARGETDIR=x86
;;
i?86-*-*)
- TARGET=X86; TARGETDIR=x86
+ TARGET=X86_64; TARGETDIR=x86
;;
ia64*-*-*)
@@ -11251,30 +13275,40 @@ case "$host" in
TARGET=M68K; TARGETDIR=m68k
;;
- mips-sgi-irix5.* | mips-sgi-irix6.*)
+ mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
TARGET=MIPS_IRIX; TARGETDIR=mips
;;
- mips*-*-linux*)
+ mips*-*-linux* | mips*-*-openbsd*)
# Support 128-bit long double for NewABI.
HAVE_LONG_DOUBLE='defined(__mips64)'
TARGET=MIPS_IRIX; TARGETDIR=mips
;;
+ moxie-*-*)
+ TARGET=MOXIE; TARGETDIR=moxie
+ ;;
+
powerpc*-*-linux* | powerpc-*-sysv*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
+ powerpc-*-amigaos*)
+ TARGET=POWERPC; TARGETDIR=powerpc
+ ;;
powerpc-*-beos*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
- powerpc-*-darwin*)
+ powerpc-*-darwin* | powerpc64-*-darwin*)
TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
;;
powerpc-*-aix* | rs6000-*-aix*)
TARGET=POWERPC_AIX; TARGETDIR=powerpc
;;
- powerpc-*-freebsd*)
+ powerpc-*-freebsd* | powerpc-*-openbsd*)
TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
;;
+ powerpc64-*-freebsd*)
+ TARGET=POWERPC; TARGETDIR=powerpc
+ ;;
powerpc*-*-rtems*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
@@ -11300,6 +13334,15 @@ case "$host" in
x86_64-*-cygwin* | x86_64-*-mingw*)
TARGET=X86_WIN64; TARGETDIR=x86
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+ # or cross-build and select where to install dlls appropriately.
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+ else
+ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+ fi
;;
x86_64-*-*)
@@ -11311,7 +13354,7 @@ esac
if test $TARGETDIR = unknown; then
- as_fn_error "\"libffi has not been ported to $host.\"" "$LINENO" 5
+ as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5
fi
if expr x$TARGET : 'xMIPS' > /dev/null; then
@@ -11402,6 +13445,14 @@ else
M68K_FALSE=
fi
+ if test x$TARGET = xMOXIE; then
+ MOXIE_TRUE=
+ MOXIE_FALSE='#'
+else
+ MOXIE_TRUE='#'
+ MOXIE_FALSE=
+fi
+
if test x$TARGET = xPOWERPC; then
POWERPC_TRUE=
POWERPC_FALSE='#'
@@ -11525,7 +13576,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
+if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -11638,7 +13689,7 @@ fi
for ac_func in memcpy
do :
ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy"
-if test "x$ac_cv_func_memcpy" = x""yes; then :
+if test "x$ac_cv_func_memcpy" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_MEMCPY 1
_ACEOF
@@ -11646,11 +13697,22 @@ _ACEOF
fi
done
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
$as_echo_n "checking for working alloca.h... " >&6; }
-if test "${ac_cv_working_alloca_h+set}" = set; then :
+if ${ac_cv_working_alloca_h+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -11683,7 +13745,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
$as_echo_n "checking for alloca... " >&6; }
-if test "${ac_cv_func_alloca_works+set}" = set; then :
+if ${ac_cv_func_alloca_works+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -11702,7 +13764,7 @@ else
#pragma alloca
# else
# ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
+void *alloca (size_t);
# endif
# endif
# endif
@@ -11746,7 +13808,7 @@ $as_echo "#define C_ALLOCA 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if test "${ac_cv_os_cray+set}" = set; then :
+if ${ac_cv_os_cray+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -11773,8 +13835,7 @@ if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
- if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define CRAY_STACKSEG_END $ac_func
@@ -11788,7 +13849,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
$as_echo_n "checking stack direction for C alloca... " >&6; }
-if test "${ac_cv_c_stack_direction+set}" = set; then :
+if ${ac_cv_c_stack_direction+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
@@ -11843,7 +13904,7 @@ fi
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
$as_echo_n "checking size of double... " >&6; }
-if test "${ac_cv_sizeof_double+set}" = set; then :
+if ${ac_cv_sizeof_double+:} false; then :
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then :
@@ -11852,9 +13913,8 @@ else
if test "$ac_cv_type_double" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (double)
-See \`config.log' for more details." "$LINENO" 5; }; }
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_double=0
fi
@@ -11877,7 +13937,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
$as_echo_n "checking size of long double... " >&6; }
-if test "${ac_cv_sizeof_long_double+set}" = set; then :
+if ${ac_cv_sizeof_long_double+:} false; then :
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then :
@@ -11886,9 +13946,8 @@ else
if test "$ac_cv_type_long_double" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (long double)
-See \`config.log' for more details." "$LINENO" 5; }; }
+as_fn_error 77 "cannot compute sizeof (long double)
+See \`config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_long_double=0
fi
@@ -11922,7 +13981,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if test "${ac_cv_c_bigendian+set}" = set; then :
+if ${ac_cv_c_bigendian+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_c_bigendian=unknown
@@ -12140,18 +14199,18 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
;; #(
*)
- as_fn_error "unknown endianness
+ as_fn_error $? "unknown endianness
presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5
$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; }
-if test "${libffi_cv_as_cfi_pseudo_op+set}" = set; then :
+if ${gcc_cv_as_cfi_pseudo_op+:} false; then :
$as_echo_n "(cached) " >&6
else
- libffi_cv_as_cfi_pseudo_op=unknown
+ gcc_cv_as_cfi_pseudo_op=unknown
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
asm (".cfi_startproc\n\t.cfi_endproc");
@@ -12164,25 +14223,26 @@ main ()
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
- libffi_cv_as_cfi_pseudo_op=yes
+ gcc_cv_as_cfi_pseudo_op=yes
else
- libffi_cv_as_cfi_pseudo_op=no
+ gcc_cv_as_cfi_pseudo_op=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_cfi_pseudo_op" >&5
-$as_echo "$libffi_cv_as_cfi_pseudo_op" >&6; }
-if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5
+$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; }
+ if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h
-fi
+ fi
+
if test x$TARGET = xSPARC; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5
$as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; }
-if test "${libffi_cv_as_sparc_ua_pcrel+set}" = set; then :
+if ${libffi_cv_as_sparc_ua_pcrel+:} false; then :
$as_echo_n "(cached) " >&6
else
@@ -12221,7 +14281,7 @@ $as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5
$as_echo_n "checking assembler .register pseudo-op support... " >&6; }
-if test "${libffi_cv_as_register_pseudo_op+set}" = set; then :
+if ${libffi_cv_as_register_pseudo_op+:} false; then :
$as_echo_n "(cached) " >&6
else
@@ -12258,13 +14318,13 @@ fi
if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5
$as_echo_n "checking assembler supports pc related relocs... " >&6; }
-if test "${libffi_cv_as_x86_pcrel+set}" = set; then :
+if ${libffi_cv_as_x86_pcrel+:} false; then :
$as_echo_n "(cached) " >&6
else
libffi_cv_as_x86_pcrel=yes
echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
- if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+ if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
libffi_cv_as_x86_pcrel=no
fi
@@ -12276,77 +14336,244 @@ $as_echo "$libffi_cv_as_x86_pcrel" >&6; }
$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h
fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5
+$as_echo_n "checking assembler .ascii pseudo-op support... " >&6; }
+if ${libffi_cv_as_ascii_pseudo_op+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ libffi_cv_as_ascii_pseudo_op=unknown
+ # Check if we have .ascii
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+asm (".ascii \\"string\\"");
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ libffi_cv_as_ascii_pseudo_op=yes
+else
+ libffi_cv_as_ascii_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5
+$as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; }
+ if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5
+$as_echo_n "checking assembler .string pseudo-op support... " >&6; }
+if ${libffi_cv_as_string_pseudo_op+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ libffi_cv_as_string_pseudo_op=unknown
+ # Check if we have .string
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+asm (".string \\"string\\"");
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ libffi_cv_as_string_pseudo_op=yes
+else
+ libffi_cv_as_string_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5
+$as_echo "$libffi_cv_as_string_pseudo_op" >&6; }
+ if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h
+
+ fi
fi
+if test x$TARGET = xX86_WIN64; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5
+$as_echo_n "checking for _ prefix in compiled symbols... " >&6; }
+if ${lt_cv_sys_symbol_underscore+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sys_symbol_underscore=no
+ cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ lt_cv_sys_symbol_underscore=yes
+ else
+ if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ fi
+ else
+ echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ rm -rf conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5
+$as_echo "$lt_cv_sys_symbol_underscore" >&6; }
+ sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+
+
+ if test "x$sys_symbol_underscore" = xyes; then
+
+$as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h
+
+ fi
+fi
+
+
+FFI_EXEC_TRAMPOLINE_TABLE=0
case "$target" in
- *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
+ *arm*-apple-darwin*)
+ FFI_EXEC_TRAMPOLINE_TABLE=1
+
+$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
+
+ ;;
+ *-apple-darwin1[10]* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
$as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
;;
esac
+ if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then
+ FFI_EXEC_TRAMPOLINE_TABLE_TRUE=
+ FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#'
+else
+ FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#'
+ FFI_EXEC_TRAMPOLINE_TABLE_FALSE=
+fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5
-$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
-if test "${libffi_cv_ro_eh_frame+set}" = set; then :
+
+
+if test x$TARGET = xX86_64; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5
+$as_echo_n "checking assembler supports unwind section type... " >&6; }
+if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then :
$as_echo_n "(cached) " >&6
else
- libffi_cv_ro_eh_frame=no
- echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
- if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
- if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
- libffi_cv_ro_eh_frame=yes
- elif grep '.section.*eh_frame.*#alloc' conftest.c \
- | grep -v '#write' > /dev/null; then
- libffi_cv_ro_eh_frame=yes
- fi
+ libffi_cv_as_x86_64_unwind_section_type=yes
+ echo '.section .eh_frame,"a",@unwind' > conftest.s
+ if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+ libffi_cv_as_x86_64_unwind_section_type=no
fi
- rm -f conftest.*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5
+$as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; }
+ if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
+
+$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h
+
+ fi
+fi
+
+if test "x$GCC" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5
+$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
+if ${libffi_cv_ro_eh_frame+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ libffi_cv_ro_eh_frame=no
+ echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+ if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+ if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+ libffi_cv_ro_eh_frame=yes
+ elif grep '.section.*eh_frame.*#alloc' conftest.c \
+ | grep -v '#write' > /dev/null; then
+ libffi_cv_ro_eh_frame=yes
+ fi
+ fi
+ rm -f conftest.*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5
$as_echo "$libffi_cv_ro_eh_frame" >&6; }
-if test "x$libffi_cv_ro_eh_frame" = xyes; then
+ if test "x$libffi_cv_ro_eh_frame" = xyes; then
$as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h
$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h
-else
+ else
$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h
-fi
+ fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5
$as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; }
-if test "${libffi_cv_hidden_visibility_attribute+set}" = set; then :
+if ${libffi_cv_hidden_visibility_attribute+:} false; then :
$as_echo_n "(cached) " >&6
else
- echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c
- libffi_cv_hidden_visibility_attribute=no
- if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5'
+ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c
+ libffi_cv_hidden_visibility_attribute=no
+ if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
- if grep '\.hidden.*foo' conftest.s >/dev/null; then
- libffi_cv_hidden_visibility_attribute=yes
- fi
- fi
- rm -f conftest.*
+ if grep '\.hidden.*foo' conftest.s >/dev/null; then
+ libffi_cv_hidden_visibility_attribute=yes
+ fi
+ fi
+ rm -f conftest.*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5
$as_echo "$libffi_cv_hidden_visibility_attribute" >&6; }
-if test $libffi_cv_hidden_visibility_attribute = yes; then
+ if test $libffi_cv_hidden_visibility_attribute = yes; then
$as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
+ fi
fi
@@ -12365,6 +14592,14 @@ $as_echo "#define FFI_DEBUG 1" >>confdefs.h
fi
fi
+ if test "$enable_debug" = "yes"; then
+ FFI_DEBUG_TRUE=
+ FFI_DEBUG_FALSE='#'
+else
+ FFI_DEBUG_TRUE='#'
+ FFI_DEBUG_FALSE=
+fi
+
# Check whether --enable-structs was given.
if test "${enable_structs+set}" = set; then :
@@ -12396,21 +14631,25 @@ $as_echo "#define USING_PURIFY 1" >>confdefs.h
fi
-if test -n "$with_cross_host" &&
- test x"$with_cross_host" != x"no"; then
- toolexecdir='$(exec_prefix)/$(target_alias)'
- toolexeclibdir='$(toolexecdir)/lib'
-else
- toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
- toolexeclibdir='$(libdir)'
-fi
-multi_os_directory=`$CC -print-multi-os-directory`
-case $multi_os_directory in
- .) ;; # Avoid trailing /.
- *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
-esac
+# These variables are only ever used when we cross-build to X86_WIN32.
+# And we only support this with GCC, so...
+if test x"$GCC" != x"no"; then
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ toolexecdir='$(exec_prefix)/$(target_alias)'
+ toolexeclibdir='$(toolexecdir)/lib'
+ else
+ toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+ toolexeclibdir='$(libdir)'
+ fi
+ multi_os_directory=`$CC -print-multi-os-directory`
+ case $multi_os_directory in
+ .) ;; # Avoid trailing /.
+ *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+ esac
+fi
if test "${multilib}" = "yes"; then
multilib_arg="--enable-multilib"
@@ -12499,10 +14738,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
- test "x$cache_file" != "x/dev/null" &&
+ if test "x$cache_file" != "x/dev/null"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
- cat confcache >$cache_file
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -12518,6 +14768,7 @@ DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
+U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
@@ -12541,132 +14792,144 @@ else
fi
if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- as_fn_error "conditional \"AMDEP\" was never defined.
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
- as_fn_error "conditional \"am__fastdepCC\" was never defined.
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
- as_fn_error "conditional \"am__fastdepCCAS\" was never defined.
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
- as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then
- as_fn_error "conditional \"TESTSUBDIR\" was never defined.
+ as_fn_error $? "conditional \"TESTSUBDIR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then
- as_fn_error "conditional \"MIPS\" was never defined.
+ as_fn_error $? "conditional \"MIPS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then
- as_fn_error "conditional \"SPARC\" was never defined.
+ as_fn_error $? "conditional \"SPARC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then
- as_fn_error "conditional \"X86\" was never defined.
+ as_fn_error $? "conditional \"X86\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then
- as_fn_error "conditional \"X86_FREEBSD\" was never defined.
+ as_fn_error $? "conditional \"X86_FREEBSD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then
- as_fn_error "conditional \"X86_WIN32\" was never defined.
+ as_fn_error $? "conditional \"X86_WIN32\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then
- as_fn_error "conditional \"X86_WIN64\" was never defined.
+ as_fn_error $? "conditional \"X86_WIN64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then
- as_fn_error "conditional \"X86_DARWIN\" was never defined.
+ as_fn_error $? "conditional \"X86_DARWIN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then
- as_fn_error "conditional \"ALPHA\" was never defined.
+ as_fn_error $? "conditional \"ALPHA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then
- as_fn_error "conditional \"IA64\" was never defined.
+ as_fn_error $? "conditional \"IA64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then
- as_fn_error "conditional \"M32R\" was never defined.
+ as_fn_error $? "conditional \"M32R\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then
- as_fn_error "conditional \"M68K\" was never defined.
+ as_fn_error $? "conditional \"M68K\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then
+ as_fn_error $? "conditional \"MOXIE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then
- as_fn_error "conditional \"POWERPC\" was never defined.
+ as_fn_error $? "conditional \"POWERPC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then
- as_fn_error "conditional \"POWERPC_AIX\" was never defined.
+ as_fn_error $? "conditional \"POWERPC_AIX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then
- as_fn_error "conditional \"POWERPC_DARWIN\" was never defined.
+ as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then
- as_fn_error "conditional \"POWERPC_FREEBSD\" was never defined.
+ as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then
- as_fn_error "conditional \"ARM\" was never defined.
+ as_fn_error $? "conditional \"ARM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then
- as_fn_error "conditional \"AVR32\" was never defined.
+ as_fn_error $? "conditional \"AVR32\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then
- as_fn_error "conditional \"LIBFFI_CRIS\" was never defined.
+ as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then
- as_fn_error "conditional \"FRV\" was never defined.
+ as_fn_error $? "conditional \"FRV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then
- as_fn_error "conditional \"S390\" was never defined.
+ as_fn_error $? "conditional \"S390\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then
- as_fn_error "conditional \"X86_64\" was never defined.
+ as_fn_error $? "conditional \"X86_64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then
- as_fn_error "conditional \"SH\" was never defined.
+ as_fn_error $? "conditional \"SH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then
- as_fn_error "conditional \"SH64\" was never defined.
+ as_fn_error $? "conditional \"SH64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then
- as_fn_error "conditional \"PA_LINUX\" was never defined.
+ as_fn_error $? "conditional \"PA_LINUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then
- as_fn_error "conditional \"PA_HPUX\" was never defined.
+ as_fn_error $? "conditional \"PA_HPUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then
- as_fn_error "conditional \"PA64_HPUX\" was never defined.
+ as_fn_error $? "conditional \"PA64_HPUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then
+ as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then
+ as_fn_error $? "conditional \"FFI_DEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@@ -12767,6 +15030,7 @@ fi
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -12812,19 +15076,19 @@ export LANGUAGE
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
- as_status=$?; test $as_status -eq 0 && as_status=1
- if test "$3"; then
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $1" >&2
+ $as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -13020,7 +15284,7 @@ $as_echo X"$as_dir" |
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
@@ -13073,8 +15337,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by libffi $as_me 3.0.10rc0, which was
-generated by GNU Autoconf 2.65. Invocation command line was
+This file was extended by libffi $as_me 3.0.11, which was
+generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -13137,17 +15401,17 @@ $config_links
Configuration commands:
$config_commands
-Report bugs to <http://gcc.gnu.org/bugs.html>."
+Report bugs to <http://github.com/atgreen/libffi/issues>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-libffi config.status 3.0.10rc0
-configured by $0, generated by GNU Autoconf 2.65,
+libffi config.status 3.0.11
+configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -13165,11 +15429,16 @@ ac_need_defaults=:
while test $# != 0
do
case $1 in
- --*=*)
+ --*=?*)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
ac_shift=:
;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
*)
ac_option=$1
ac_optarg=$2
@@ -13191,6 +15460,7 @@ do
$ac_shift
case $ac_optarg in
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
@@ -13203,7 +15473,7 @@ do
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
- as_fn_error "ambiguous option: \`$1'
+ as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
--help | --hel | -h )
$as_echo "$ac_cs_usage"; exit ;;
@@ -13212,7 +15482,7 @@ Try \`$0 --help' for more information.";;
ac_cs_silent=: ;;
# This is an error.
- -*) as_fn_error "unrecognized option: \`$1'
+ -*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
@@ -13256,6 +15526,14 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
+ax_enable_builddir_srcdir="$srcdir" # $srcdir
+ax_enable_builddir_host="$HOST" # $HOST / $host
+ax_enable_builddir_version="$VERSION" # $VERSION
+ax_enable_builddir_package="$PACKAGE" # $PACKAGE
+ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX
+ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED
+ax_enable_builddir="$ax_enable_builddir" # $SUB
+
AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
@@ -13266,131 +15544,154 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
sed_quote_subst='$sed_quote_subst'
double_quote_subst='$double_quote_subst'
delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
# Quote evaled strings.
-for var in SED \
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
GREP \
EGREP \
FGREP \
@@ -13403,8 +15704,13 @@ reload_flag \
OBJDUMP \
deplibs_check_method \
file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
AR \
AR_FLAGS \
+archiver_list_spec \
STRIP \
RANLIB \
CC \
@@ -13414,14 +15720,14 @@ lt_cv_sys_global_symbol_pipe \
lt_cv_sys_global_symbol_to_cdecl \
lt_cv_sys_global_symbol_to_c_name_address \
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-SHELL \
-ECHO \
+nm_file_list_spec \
lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
lt_prog_compiler_pic \
+lt_prog_compiler_wl \
lt_prog_compiler_static \
lt_cv_prog_compiler_c_o \
need_locks \
+MANIFEST_TOOL \
DSYMUTIL \
NMEDIT \
LIPO \
@@ -13435,9 +15741,7 @@ with_gnu_ld \
allow_undefined_flag \
no_undefined_flag \
hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
hardcode_libdir_separator \
-fix_srcfile_path \
exclude_expsyms \
include_expsyms \
file_list_spec \
@@ -13445,12 +15749,13 @@ variables_saved_for_relink \
libname_spec \
library_names_spec \
soname_spec \
+install_override_mode \
finish_eval \
old_striplib \
striplib; do
- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -13472,14 +15777,15 @@ module_cmds \
module_expsym_cmds \
export_symbols_cmds \
prelink_cmds \
+postlink_cmds \
postinstall_cmds \
postuninstall_cmds \
finish_cmds \
sys_lib_search_path_spec \
sys_lib_dlsearch_path_spec; do
- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -13487,12 +15793,6 @@ sys_lib_dlsearch_path_spec; do
esac
done
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
- ;;
-esac
-
ac_aux_dir='$ac_aux_dir'
xsi_shell='$xsi_shell'
lt_shell_append='$lt_shell_append'
@@ -13523,6 +15823,7 @@ for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;;
+ "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;;
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;;
@@ -13537,7 +15838,7 @@ do
"include/ffi_common.h") CONFIG_LINKS="$CONFIG_LINKS include/ffi_common.h:include/ffi_common.h" ;;
"fficonfig.py") CONFIG_FILES="$CONFIG_FILES fficonfig.py" ;;
- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
done
@@ -13561,9 +15862,10 @@ fi
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
- tmp=
+ tmp= ac_tmp=
trap 'exit_status=$?
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
@@ -13571,12 +15873,13 @@ $debug ||
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
+ test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
@@ -13593,12 +15896,12 @@ if test "x$ac_cr" = x; then
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
- ac_cs_awk_cr='\r'
+ ac_cs_awk_cr='\\r'
else
ac_cs_awk_cr=$ac_cr
fi
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
@@ -13607,18 +15910,18 @@ _ACEOF
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
echo "_ACEOF"
} >conf$$subs.sh ||
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
. ./conf$$subs.sh ||
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
if test $ac_delim_n = $ac_delim_num; then
break
elif $ac_last_try; then
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
@@ -13626,7 +15929,7 @@ done
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
@@ -13674,7 +15977,7 @@ t delim
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
@@ -13706,21 +16009,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
- || as_fn_error "could not setup config files machinery" "$LINENO" 5
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[ ]*\):*/\1/
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
s/^[^=]*=[ ]*$//
}'
fi
@@ -13732,7 +16043,7 @@ fi # test -n "$CONFIG_FILES"
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
@@ -13744,11 +16055,11 @@ _ACEOF
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
- ac_t=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_t"; then
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
break
elif $ac_last_try; then
- as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
@@ -13833,7 +16144,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
- as_fn_error "could not setup config headers machinery" "$LINENO" 5
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"
@@ -13846,7 +16157,7 @@ do
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
@@ -13865,7 +16176,7 @@ do
for ac_f
do
case $ac_f in
- -) ac_f="$tmp/stdin";;
+ -) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
@@ -13874,7 +16185,7 @@ do
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
@@ -13900,8 +16211,8 @@ $as_echo "$as_me: creating $ac_file" >&6;}
esac
case $ac_tag in
- *:-:* | *:-) cat >"$tmp/stdin" \
- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
@@ -14037,23 +16348,24 @@ s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
- || as_fn_error "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined." >&5
+which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined." >&2;}
+which seems to be undefined. Please make sure it is defined" >&2;}
- rm -f "$tmp/stdin"
+ rm -f "$ac_tmp/stdin"
case $ac_file in
- -) cat "$tmp/out" && rm -f "$tmp/out";;
- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
esac \
- || as_fn_error "could not create $ac_file" "$LINENO" 5
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
:H)
#
@@ -14062,21 +16374,21 @@ which seems to be undefined. Please make sure it is defined." >&2;}
if test x"$ac_file" != x-; then
{
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
- } >"$tmp/config.h" \
- || as_fn_error "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
- mv "$tmp/config.h" "$ac_file" \
- || as_fn_error "could not create $ac_file" "$LINENO" 5
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
- || as_fn_error "could not create -" "$LINENO" 5
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
fi
# Compute "$ac_file"'s index in $config_headers.
_am_arg="$ac_file"
@@ -14130,19 +16442,19 @@ $as_echo X"$_am_arg" |
$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}
if test ! -r "$ac_source"; then
- as_fn_error "$ac_source: file not found" "$LINENO" 5
+ as_fn_error $? "$ac_source: file not found" "$LINENO" 5
fi
rm -f "$ac_file"
# Try a relative symlink, then a hard link, then a copy.
- case $srcdir in
+ case $ac_source in
[\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
*) ac_rel_source=$ac_top_build_prefix$ac_source ;;
esac
ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
ln "$ac_source" "$ac_file" 2>/dev/null ||
cp -p "$ac_source" "$ac_file" ||
- as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
+ as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
fi
;;
:C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
@@ -14152,6 +16464,150 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
case $ac_file$ac_mode in
+ "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir"
+ if test ".$ax_enable_builddir" = ".." ; then
+ if test -f "$top_srcdir/Makefile" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5
+$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;}
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5
+$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;}
+ fi
+ else
+ if test -f "$ac_top_srcdir/Makefile" ; then
+ a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile`
+ test "$a" != "$b" && rm "$ac_top_srcdir/Makefile"
+ fi
+ if test -f "$ac_top_srcdir/Makefile" ; then
+ echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk
+ echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk
+ eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null"
+ if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null
+ then rm $ac_top_srcdir/Makefile ; fi
+ cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING
+ fi
+ if test ! -f "$ac_top_srcdir/Makefile" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5
+$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;}
+ x='`' ; cat >$tmp/conftemp.sed <<_EOF
+/^\$/n
+x
+/^\$/bS
+x
+/\\\\\$/{H;d;}
+{H;s/.*//;x;}
+bM
+:S
+x
+/\\\\\$/{h;d;}
+{h;s/.*//;x;}
+:M
+s/\\(\\n\\) /\\1 /g
+/^ /d
+/^[ ]*[\\#]/d
+/^VPATH *=/d
+s/^srcdir *=.*/srcdir = ./
+s/^top_srcdir *=.*/top_srcdir = ./
+/[:=]/!d
+/^\\./d
+/ = /b
+/ .= /b
+/:/!b
+s/:.*/:/
+s/ / /g
+s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g
+s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/
+s/ / /g
+/^all all-all[ :]/i\\
+all-configured : all-all
+s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g
+/-all-all/d
+a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\
+ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done
+/dist-all *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\
+ ; if test "\$\$found" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\
+ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+/dist-[a-zA-Z0-9]*-all *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\
+ ; if test "\$\$found" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\
+ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+/distclean-all *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\
+ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\
+ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\
+ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile
+_EOF
+ cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING
+ $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile
+ if test -f "$ac_top_srcdir/Makefile.mk" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5
+$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;}
+ cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile
+ fi ; xxxx="####"
+ echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile
+ # sanity check
+ if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5
+$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;}
+ $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \
+ >$ac_top_srcdir/Makefile~
+ (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null
+ fi
+ else
+ xxxx="\\#\\#\\#\\#"
+ # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed
+ echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed
+ $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp
+ cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING
+ cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING
+ if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5
+$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;}
+ rm "$tmp/mkfile.tmp"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5
+$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;}
+ mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile"
+ fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5
+$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;}
+ xxxx="####"
+ echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile
+ fi
+ ;;
"depfiles":C) test x"$AMDEP_TRUE" != x"" || {
# Autoconf 2.62 quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
@@ -14268,7 +16724,8 @@ $as_echo X"$file" |
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is part of GNU Libtool.
@@ -14316,6 +16773,15 @@ pic_mode=$pic_mode
# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
# The host system.
host_alias=$host_alias
host=$host
@@ -14365,9 +16831,11 @@ SP2NL=$lt_lt_SP2NL
# turn newlines into spaces.
NL2SP=$lt_lt_NL2SP
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
# An object symbol dumper.
OBJDUMP=$lt_OBJDUMP
@@ -14375,13 +16843,30 @@ OBJDUMP=$lt_OBJDUMP
# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method
-# Command to use when deplibs_check_method == "file_magic".
+# Command to use when deplibs_check_method = "file_magic".
file_magic_cmd=$lt_file_magic_cmd
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
# The archiver.
AR=$lt_AR
+
+# Flags to create an archive.
AR_FLAGS=$lt_AR_FLAGS
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
# A symbol stripping program.
STRIP=$lt_STRIP
@@ -14390,6 +16875,9 @@ RANLIB=$lt_RANLIB
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
# A C compiler.
LTCC=$lt_CC
@@ -14408,14 +16896,14 @@ global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
-# An echo program that does not interpret backslashes.
-ECHO=$lt_ECHO
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
# Used to examine libraries when file_magic_cmd begins with "file".
MAGIC_CMD=$MAGIC_CMD
@@ -14423,6 +16911,9 @@ MAGIC_CMD=$MAGIC_CMD
# Must we lock files when doing compilation?
need_locks=$lt_need_locks
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
DSYMUTIL=$lt_DSYMUTIL
@@ -14479,6 +16970,9 @@ library_names_spec=$lt_library_names_spec
# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
# Command to use after installation of a shared archive.
postinstall_cmds=$lt_postinstall_cmds
@@ -14518,6 +17012,10 @@ striplib=$lt_striplib
# The linker used to build libraries.
LD=$lt_LD
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds
@@ -14530,12 +17028,12 @@ with_gcc=$GCC
# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static
@@ -14585,10 +17083,6 @@ no_undefined_flag=$lt_no_undefined_flag
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking. This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator
@@ -14622,9 +17116,6 @@ inherit_rpath=$inherit_rpath
# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols
@@ -14640,6 +17131,9 @@ include_expsyms=$lt_include_expsyms
# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
# Specify filename containing input files.
file_list_spec=$lt_file_list_spec
@@ -14672,212 +17166,169 @@ ltmain="$ac_aux_dir/ltmain.sh"
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- case $xsi_shell in
- yes)
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
-}
-
-# func_basename file
-func_basename ()
-{
- func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-# dirname: Compute the dirname of FILE. If nonempty,
-# add APPEND to the result, otherwise set result
-# to NONDIR_REPLACEMENT.
-# value returned in "$func_dirname_result"
-# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
- func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
- # positional parameters, so assign one to ordinary parameter first.
- func_stripname_result=${3}
- func_stripname_result=${func_stripname_result#"${1}"}
- func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
- func_opt_split_opt=${1%%=*}
- func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
- case ${1} in
- *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
- *) func_lo2o_result=${1} ;;
- esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=${#1}
-}
-
-_LT_EOF
- ;;
- *) # Bourne compatible functions.
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
-}
-
-# func_basename file
-func_basename ()
-{
- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "X${3}" \
- | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "X${3}" \
- | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
- esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
- func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
- func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
- func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
- yes)
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "$1+=\$2"
-}
-_LT_EOF
- ;;
- *)
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "$1=\$$1\$2"
-}
-
-_LT_EOF
- ;;
- esac
-
-
- sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- mv -f "$cfgfile" "$ofile" ||
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ if test x"$xsi_shell" = xyes; then
+ sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\ case ${1} in\
+\ */*) func_dirname_result="${1%/*}${2}" ;;\
+\ * ) func_dirname_result="${3}" ;;\
+\ esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\ func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\ case ${1} in\
+\ */*) func_dirname_result="${1%/*}${2}" ;;\
+\ * ) func_dirname_result="${3}" ;;\
+\ esac\
+\ func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\ # positional parameters, so assign one to ordinary parameter first.\
+\ func_stripname_result=${3}\
+\ func_stripname_result=${func_stripname_result#"${1}"}\
+\ func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\ func_split_long_opt_name=${1%%=*}\
+\ func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\ func_split_short_opt_arg=${1#??}\
+\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\ case ${1} in\
+\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\ *) func_lo2o_result=${1} ;;\
+\ esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+ func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+ func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+ func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+ sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+ eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\ func_quote_for_eval "${2}"\
+\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+ # Save a `func_append' function call where possible by direct use of '+='
+ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+else
+ # Save a `func_append' function call even when '+=' is not available
+ sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+ mv -f "$cfgfile" "$ofile" ||
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
@@ -14897,7 +17348,7 @@ _ACEOF
ac_clean_files=$ac_clean_files_save
test $ac_write_fail = 0 ||
- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
# configure is writing to config.log, and then calls config.status.
@@ -14918,7 +17369,7 @@ if test "$no_create" != yes; then
exec 5>>config.log
# Use ||, not &&, to avoid exiting from the if with $? = 1, which
# would make configure fail if this is the last instruction.
- $ac_cs_success || as_fn_exit $?
+ $ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
diff --git a/Modules/_ctypes/libffi/configure.ac b/Modules/_ctypes/libffi/configure.ac
index 87c63e1..d8652aa 100644
--- a/Modules/_ctypes/libffi/configure.ac
+++ b/Modules/_ctypes/libffi/configure.ac
@@ -3,9 +3,9 @@ dnl Process this with autoconf to create configure
# file from libffi - slightly patched for ctypes
#
-AC_PREREQ(2.63)
+AC_PREREQ(2.68)
-AC_INIT([libffi], [3.0.10rc0], [http://gcc.gnu.org/bugs.html])
+AC_INIT([libffi], [3.0.11], [http://github.com/atgreen/libffi/issues])
AC_CONFIG_HEADERS([fficonfig.h])
AC_CANONICAL_SYSTEM
@@ -13,16 +13,22 @@ target_alias=${target_alias-$host_alias}
. ${srcdir}/configure.host
+AX_ENABLE_BUILDDIR
+
AM_INIT_AUTOMAKE
# The same as in boehm-gc and libstdc++. Have to borrow it from there.
# We must force CC to /not/ be precious variables; otherwise
# the wrong, non-multilib-adjusted value will be used in multilibs.
# As a side effect, we have to subst CFLAGS ourselves.
+# Also save and restore CFLAGS, since AC_PROG_CC will come up with
+# defaults of its own if none are provided.
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
m4_define([_AC_ARG_VAR_PRECIOUS],[])
+save_CFLAGS=$CFLAGS
AC_PROG_CC
+CFLAGS=$save_CFLAGS
m4_undefine([_AC_ARG_VAR_PRECIOUS])
m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
@@ -33,6 +39,12 @@ AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_CONFIG_MACRO_DIR([m4])
+AX_CC_MAXOPT
+AX_CFLAGS_WARN_ALL
+if test "x$GCC" = "xyes"; then
+ CFLAGS="$CFLAGS -fexceptions"
+fi
+
AM_MAINTAINER_MODE
AC_CHECK_HEADERS(sys/mman.h)
@@ -46,7 +58,7 @@ TARGETDIR="unknown"
case "$host" in
alpha*-*-*)
TARGET=ALPHA; TARGETDIR=alpha;
- # Support 128-bit long double, changable via command-line switch.
+ # Support 128-bit long double, changeable via command-line switch.
HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
;;
@@ -74,7 +86,7 @@ case "$host" in
TARGET=FRV; TARGETDIR=frv
;;
- hppa*-*-linux* | parisc*-*-linux*)
+ hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
TARGET=PA_LINUX; TARGETDIR=pa
;;
hppa*64-*-hpux*)
@@ -87,10 +99,17 @@ case "$host" in
i?86-*-freebsd* | i?86-*-openbsd*)
TARGET=X86_FREEBSD; TARGETDIR=x86
;;
- i?86-win32* | i?86-*-cygwin* | i?86-*-mingw*)
+ i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
TARGET=X86_WIN32; TARGETDIR=x86
- # All mingw/cygwin/win32 builds require this for sharedlib
- AM_LTLDFLAGS="-no-undefined"
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+ # or cross-build and select where to install dlls appropriately.
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+ else
+ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+ fi
;;
i?86-*-darwin*)
TARGET=X86_DARWIN; TARGETDIR=x86
@@ -102,7 +121,7 @@ case "$host" in
TARGET=X86; TARGETDIR=x86
;;
i?86-*-*)
- TARGET=X86; TARGETDIR=x86
+ TARGET=X86_64; TARGETDIR=x86
;;
ia64*-*-*)
@@ -117,30 +136,40 @@ case "$host" in
TARGET=M68K; TARGETDIR=m68k
;;
- mips-sgi-irix5.* | mips-sgi-irix6.*)
+ mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
TARGET=MIPS_IRIX; TARGETDIR=mips
;;
- mips*-*-linux*)
+ mips*-*-linux* | mips*-*-openbsd*)
# Support 128-bit long double for NewABI.
HAVE_LONG_DOUBLE='defined(__mips64)'
TARGET=MIPS_IRIX; TARGETDIR=mips
;;
+ moxie-*-*)
+ TARGET=MOXIE; TARGETDIR=moxie
+ ;;
+
powerpc*-*-linux* | powerpc-*-sysv*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
+ powerpc-*-amigaos*)
+ TARGET=POWERPC; TARGETDIR=powerpc
+ ;;
powerpc-*-beos*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
- powerpc-*-darwin*)
+ powerpc-*-darwin* | powerpc64-*-darwin*)
TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
;;
powerpc-*-aix* | rs6000-*-aix*)
TARGET=POWERPC_AIX; TARGETDIR=powerpc
;;
- powerpc-*-freebsd*)
+ powerpc-*-freebsd* | powerpc-*-openbsd*)
TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
;;
+ powerpc64-*-freebsd*)
+ TARGET=POWERPC; TARGETDIR=powerpc
+ ;;
powerpc*-*-rtems*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
@@ -166,6 +195,15 @@ case "$host" in
x86_64-*-cygwin* | x86_64-*-mingw*)
TARGET=X86_WIN64; TARGETDIR=x86
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+ # or cross-build and select where to install dlls appropriately.
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+ else
+ AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+ fi
;;
x86_64-*-*)
@@ -191,6 +229,7 @@ AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA)
AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
+AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
@@ -228,17 +267,7 @@ AC_SUBST(HAVE_LONG_DOUBLE)
AC_C_BIGENDIAN
-AC_CACHE_CHECK([assembler .cfi pseudo-op support],
- libffi_cv_as_cfi_pseudo_op, [
- libffi_cv_as_cfi_pseudo_op=unknown
- AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],,
- [libffi_cv_as_cfi_pseudo_op=yes],
- [libffi_cv_as_cfi_pseudo_op=no])
-])
-if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then
- AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1,
- [Define if your assembler supports .cfi_* directives.])
-fi
+GCC_AS_CFI_PSEUDO_OP
if test x$TARGET = xSPARC; then
AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs],
@@ -276,7 +305,7 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64
libffi_cv_as_x86_pcrel, [
libffi_cv_as_x86_pcrel=yes
echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
- if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+ if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
libffi_cv_as_x86_pcrel=no
fi
])
@@ -284,54 +313,114 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64
AC_DEFINE(HAVE_AS_X86_PCREL, 1,
[Define if your assembler supports PC relative relocs.])
fi
+
+ AC_CACHE_CHECK([assembler .ascii pseudo-op support],
+ libffi_cv_as_ascii_pseudo_op, [
+ libffi_cv_as_ascii_pseudo_op=unknown
+ # Check if we have .ascii
+ AC_TRY_COMPILE([asm (".ascii \\"string\\"");],,
+ [libffi_cv_as_ascii_pseudo_op=yes],
+ [libffi_cv_as_ascii_pseudo_op=no])
+ ])
+ if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
+ AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1,
+ [Define if your assembler supports .ascii.])
+ fi
+
+ AC_CACHE_CHECK([assembler .string pseudo-op support],
+ libffi_cv_as_string_pseudo_op, [
+ libffi_cv_as_string_pseudo_op=unknown
+ # Check if we have .string
+ AC_TRY_COMPILE([asm (".string \\"string\\"");],,
+ [libffi_cv_as_string_pseudo_op=yes],
+ [libffi_cv_as_string_pseudo_op=no])
+ ])
+ if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
+ AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1,
+ [Define if your assembler supports .string.])
+ fi
fi
+if test x$TARGET = xX86_WIN64; then
+ LT_SYS_SYMBOL_USCORE
+ if test "x$sys_symbol_underscore" = xyes; then
+ AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.])
+ fi
+fi
+
+
+FFI_EXEC_TRAMPOLINE_TABLE=0
case "$target" in
- *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
+ *arm*-apple-darwin*)
+ FFI_EXEC_TRAMPOLINE_TABLE=1
+ AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1,
+ [Cannot use PROT_EXEC on this target, so, we revert to
+ alternative means])
+ ;;
+ *-apple-darwin1[[10]]* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
[Cannot use malloc on this target, so, we revert to
alternative means])
;;
esac
-
-AC_CACHE_CHECK([whether .eh_frame section should be read-only],
- libffi_cv_ro_eh_frame, [
- libffi_cv_ro_eh_frame=no
- echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
- if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
- if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
- libffi_cv_ro_eh_frame=yes
- elif grep '.section.*eh_frame.*#alloc' conftest.c \
- | grep -v '#write' > /dev/null; then
- libffi_cv_ro_eh_frame=yes
- fi
+AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1)
+AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE)
+
+if test x$TARGET = xX86_64; then
+ AC_CACHE_CHECK([assembler supports unwind section type],
+ libffi_cv_as_x86_64_unwind_section_type, [
+ libffi_cv_as_x86_64_unwind_section_type=yes
+ echo '.section .eh_frame,"a",@unwind' > conftest.s
+ if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+ libffi_cv_as_x86_64_unwind_section_type=no
fi
- rm -f conftest.*
- ])
-if test "x$libffi_cv_ro_eh_frame" = xyes; then
- AC_DEFINE(HAVE_RO_EH_FRAME, 1,
- [Define if .eh_frame sections should be read-only.])
- AC_DEFINE(EH_FRAME_FLAGS, "a",
- [Define to the flags needed for the .section .eh_frame directive.])
-else
- AC_DEFINE(EH_FRAME_FLAGS, "aw",
- [Define to the flags needed for the .section .eh_frame directive.])
+ ])
+ if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
+ AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
+ [Define if your assembler supports unwind section type.])
+ fi
fi
-AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
- libffi_cv_hidden_visibility_attribute, [
- echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c
- libffi_cv_hidden_visibility_attribute=no
- if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
- if grep '\.hidden.*foo' conftest.s >/dev/null; then
- libffi_cv_hidden_visibility_attribute=yes
- fi
- fi
- rm -f conftest.*
- ])
-if test $libffi_cv_hidden_visibility_attribute = yes; then
- AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
- [Define if __attribute__((visibility("hidden"))) is supported.])
+if test "x$GCC" = "xyes"; then
+ AC_CACHE_CHECK([whether .eh_frame section should be read-only],
+ libffi_cv_ro_eh_frame, [
+ libffi_cv_ro_eh_frame=no
+ echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+ if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+ if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+ libffi_cv_ro_eh_frame=yes
+ elif grep '.section.*eh_frame.*#alloc' conftest.c \
+ | grep -v '#write' > /dev/null; then
+ libffi_cv_ro_eh_frame=yes
+ fi
+ fi
+ rm -f conftest.*
+ ])
+ if test "x$libffi_cv_ro_eh_frame" = xyes; then
+ AC_DEFINE(HAVE_RO_EH_FRAME, 1,
+ [Define if .eh_frame sections should be read-only.])
+ AC_DEFINE(EH_FRAME_FLAGS, "a",
+ [Define to the flags needed for the .section .eh_frame directive. ])
+ else
+ AC_DEFINE(EH_FRAME_FLAGS, "aw",
+ [Define to the flags needed for the .section .eh_frame directive. ])
+ fi
+
+ AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
+ libffi_cv_hidden_visibility_attribute, [
+ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c
+ libffi_cv_hidden_visibility_attribute=no
+ if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
+ if grep '\.hidden.*foo' conftest.s >/dev/null; then
+ libffi_cv_hidden_visibility_attribute=yes
+ fi
+ fi
+ rm -f conftest.*
+ ])
+ if test $libffi_cv_hidden_visibility_attribute = yes; then
+ AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
+ [Define if __attribute__((visibility("hidden"))) is supported.])
+ fi
fi
AH_BOTTOM([
@@ -360,6 +449,7 @@ AC_ARG_ENABLE(debug,
if test "$enable_debug" = "yes"; then
AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.])
fi)
+AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
AC_ARG_ENABLE(structs,
[ --disable-structs omit code for struct support],
@@ -379,21 +469,25 @@ AC_ARG_ENABLE(purify-safety,
AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.])
fi)
-if test -n "$with_cross_host" &&
- test x"$with_cross_host" != x"no"; then
- toolexecdir='$(exec_prefix)/$(target_alias)'
- toolexeclibdir='$(toolexecdir)/lib'
-else
- toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
- toolexeclibdir='$(libdir)'
+# These variables are only ever used when we cross-build to X86_WIN32.
+# And we only support this with GCC, so...
+if test x"$GCC" != x"no"; then
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ toolexecdir='$(exec_prefix)/$(target_alias)'
+ toolexeclibdir='$(toolexecdir)/lib'
+ else
+ toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+ toolexeclibdir='$(libdir)'
+ fi
+ multi_os_directory=`$CC -print-multi-os-directory`
+ case $multi_os_directory in
+ .) ;; # Avoid trailing /.
+ *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+ esac
+ AC_SUBST(toolexecdir)
+ AC_SUBST(toolexeclibdir)
fi
-multi_os_directory=`$CC -print-multi-os-directory`
-case $multi_os_directory in
- .) ;; # Avoid trailing /.
- *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
-esac
-AC_SUBST(toolexecdir)
-AC_SUBST(toolexeclibdir)
if test "${multilib}" = "yes"; then
multilib_arg="--enable-multilib"
diff --git a/Modules/_ctypes/libffi/depcomp b/Modules/_ctypes/libffi/depcomp
index ca5ea4e..df8eea7 100755
--- a/Modules/_ctypes/libffi/depcomp
+++ b/Modules/_ctypes/libffi/depcomp
@@ -1,10 +1,10 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2006-10-15.18
+scriptversion=2009-04-28.21; # UTC
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
-# Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -17,9 +17,7 @@ scriptversion=2006-10-15.18
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -87,6 +85,15 @@ if test "$depmode" = dashXmstdout; then
depmode=dashmstdout
fi
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u="sed s,\\\\\\\\,/,g"
+ depmode=msvisualcpp
+fi
+
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
@@ -192,14 +199,14 @@ sgi)
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
tr '
-' ' ' >> $depfile
- echo >> $depfile
+' ' ' >> "$depfile"
+ echo >> "$depfile"
# The second pass generates a dummy entry for each header file.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> $depfile
+ >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
@@ -215,34 +222,39 @@ aix)
# current directory. Also, the AIX compiler puts `$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
- stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
- tmpdepfile="$stripped.u"
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
"$@" -Wc,-M
else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
"$@" -M
fi
stat=$?
- if test -f "$tmpdepfile"; then :
- else
- stripped=`echo "$stripped" | sed 's,^.*/,,'`
- tmpdepfile="$stripped.u"
- fi
-
if test $stat -eq 0; then :
else
- rm -f "$tmpdepfile"
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
exit $stat
fi
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
if test -f "$tmpdepfile"; then
- outname="$stripped.o"
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
- sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
- sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
@@ -323,7 +335,12 @@ hp2)
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
# Add `dependent.h:' lines.
- sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
@@ -399,7 +416,7 @@ dashmstdout)
# Remove the call to Libtool.
if test "$libtool" = yes; then
- while test $1 != '--mode=compile'; do
+ while test "X$1" != 'X--mode=compile'; do
shift
done
shift
@@ -450,32 +467,39 @@ makedepend)
"$@" || exit $?
# Remove any Libtool call
if test "$libtool" = yes; then
- while test $1 != '--mode=compile'; do
+ while test "X$1" != 'X--mode=compile'; do
shift
done
shift
fi
# X makedepend
shift
- cleared=no
- for arg in "$@"; do
+ cleared=no eat=no
+ for arg
+ do
case $cleared in
no)
set ""; shift
cleared=yes ;;
esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift ;;
# Strip any option that makedepend may not understand. Remove
# the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
-*|$object)
;;
*)
set fnord "$@" "$arg"; shift ;;
esac
done
- obj_suffix="`echo $object | sed 's/^.*\././'`"
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
@@ -495,7 +519,7 @@ cpp)
# Remove the call to Libtool.
if test "$libtool" = yes; then
- while test $1 != '--mode=compile'; do
+ while test "X$1" != 'X--mode=compile'; do
shift
done
shift
@@ -533,13 +557,27 @@ cpp)
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout, regardless of -o,
- # because we must use -o when running libtool.
+ # always write the preprocessed file to stdout.
"$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
IFS=" "
for arg
do
case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
set fnord "$@"
shift
@@ -552,16 +590,23 @@ msvisualcpp)
;;
esac
done
- "$@" -E |
- sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
echo " " >> "$depfile"
- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
none)
exec "$@"
;;
@@ -580,5 +625,6 @@ exit 0
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/Modules/_ctypes/libffi/doc/libffi.info b/Modules/_ctypes/libffi/doc/libffi.info
index 896a5ec..402f760 100644
--- a/Modules/_ctypes/libffi/doc/libffi.info
+++ b/Modules/_ctypes/libffi/doc/libffi.info
@@ -4,7 +4,7 @@ from ../libffi/doc/libffi.texi.
This manual is for Libffi, a portable foreign-function interface
library.
- Copyright (C) 2008, 2010 Red Hat, Inc.
+ Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
@@ -27,7 +27,7 @@ libffi
This manual is for Libffi, a portable foreign-function interface
library.
- Copyright (C) 2008, 2010 Red Hat, Inc.
+ Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
@@ -115,8 +115,6 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
want. *note Multiple ABIs:: for more information.
NARGS is the number of arguments that this function accepts.
- `libffi' does not yet handle varargs functions; see *note Missing
- Features:: for more information.
RTYPE is a pointer to an `ffi_type' structure that describes the
return type of the function. *Note Types::.
@@ -129,6 +127,30 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is
incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid.
+ If the function being called is variadic (varargs) then
+`ffi_prep_cif_var' must be used instead of `ffi_prep_cif'.
+
+ -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi
+ varabi, unsigned int NFIXEDARGS, unsigned int varntotalargs,
+ ffi_type *RTYPE, ffi_type **ARGTYPES)
+ This initializes CIF according to the given parameters for a call
+ to a variadic function. In general it's operation is the same as
+ for `ffi_prep_cif' except that:
+
+ NFIXEDARGS is the number of fixed arguments, prior to any variadic
+ arguments. It must be greater than zero.
+
+ NTOTALARGS the total number of arguments, including variadic and
+ fixed arguments.
+
+ Note that, different cif's must be prepped for calls to the same
+ function when different numbers of arguments are passed.
+
+ Also note that a call to `ffi_prep_cif_var' with
+ NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
+ `ffi_prep_cif'.
+
+
To call a function using an initialized `ffi_cif', use the
`ffi_call' function:
@@ -147,7 +169,9 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
AVALUES is a vector of `void *' pointers that point to the memory
locations holding the argument values for a call. If CIF declares
that the function has no arguments (i.e., NARGS was 0), then
- AVALUES is ignored.
+ AVALUES is ignored. Note that argument values may be modified by
+ the callee (for instance, structs passed by value); the burden of
+ copying pass-by-value arguments is placed on the caller.

File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi
@@ -509,9 +533,7 @@ File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi,
`libffi' is missing a few features. We welcome patches to add support
for these.
- * There is no support for calling varargs functions. This may work
- on some platforms, depending on how the ABI is defined, but it is
- not reliable.
+ * Variadic closures.
* There is no support for bit fields in structures.
@@ -519,6 +541,9 @@ for these.
* The "raw" API is undocumented.
+ Note that variadic support is very new and tested on a relatively
+small number of platforms.
+

File: libffi.info, Node: Index, Prev: Missing Features, Up: Top
@@ -536,11 +561,12 @@ Index
* closure API: The Closure API. (line 13)
* closures: The Closure API. (line 13)
* FFI: Introduction. (line 31)
-* ffi_call: The Basics. (line 41)
-* ffi_closure_alloca: The Closure API. (line 19)
+* ffi_call: The Basics. (line 63)
+* ffi_closure_alloc: The Closure API. (line 19)
* ffi_closure_free: The Closure API. (line 26)
* FFI_CLOSURES: The Closure API. (line 13)
* ffi_prep_cif: The Basics. (line 16)
+* ffi_prep_cif_var: The Basics. (line 39)
* ffi_prep_closure_loc: The Closure API. (line 34)
* ffi_status <1>: The Closure API. (line 37)
* ffi_status: The Basics. (line 18)
@@ -568,24 +594,24 @@ Index
* ffi_type_void: Primitive Types. (line 10)
* Foreign Function Interface: Introduction. (line 31)
* void <1>: The Closure API. (line 20)
-* void: The Basics. (line 43)
+* void: The Basics. (line 65)

Tag Table:
-Node: Top706
-Node: Introduction1448
-Node: Using libffi3084
-Node: The Basics3570
-Node: Simple Example6177
-Node: Types7204
-Node: Primitive Types7487
-Node: Structures9307
-Node: Type Example10167
-Node: Multiple ABIs11390
-Node: The Closure API11761
-Node: Closure Example14705
-Node: Missing Features16264
-Node: Index16757
+Node: Top712
+Node: Introduction1460
+Node: Using libffi3096
+Node: The Basics3582
+Node: Simple Example7224
+Node: Types8251
+Node: Primitive Types8534
+Node: Structures10354
+Node: Type Example11214
+Node: Multiple ABIs12437
+Node: The Closure API12808
+Node: Closure Example15752
+Node: Missing Features17311
+Node: Index17764

End Tag Table
diff --git a/Modules/_ctypes/libffi/doc/libffi.texi b/Modules/_ctypes/libffi/doc/libffi.texi
index 9fa5b17..f0e6517 100644
--- a/Modules/_ctypes/libffi/doc/libffi.texi
+++ b/Modules/_ctypes/libffi/doc/libffi.texi
@@ -19,7 +19,7 @@
This manual is for Libffi, a portable foreign-function interface
library.
-Copyright @copyright{} 2008, 2010 Red Hat, Inc.
+Copyright @copyright{} 2008, 2010, 2011 Red Hat, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -133,8 +133,6 @@ This initializes @var{cif} according to the given parameters.
you want. @ref{Multiple ABIs} for more information.
@var{nargs} is the number of arguments that this function accepts.
-@samp{libffi} does not yet handle varargs functions; see @ref{Missing
-Features} for more information.
@var{rtype} is a pointer to an @code{ffi_type} structure that
describes the return type of the function. @xref{Types}.
@@ -150,6 +148,30 @@ objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter
is invalid.
@end defun
+If the function being called is variadic (varargs) then
+@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}.
+
+@findex ffi_prep_cif_var
+@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi var{abi}, unsigned int @var{nfixedargs}, unsigned int var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes})
+This initializes @var{cif} according to the given parameters for
+a call to a variadic function. In general it's operation is the
+same as for @code{ffi_prep_cif} except that:
+
+@var{nfixedargs} is the number of fixed arguments, prior to any
+variadic arguments. It must be greater than zero.
+
+@var{ntotalargs} the total number of arguments, including variadic
+and fixed arguments.
+
+Note that, different cif's must be prepped for calls to the same
+function when different numbers of arguments are passed.
+
+Also note that a call to @code{ffi_prep_cif_var} with
+@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to
+@code{ffi_prep_cif}.
+
+@end defun
+
To call a function using an initialized @code{ffi_cif}, use the
@code{ffi_call} function:
@@ -171,7 +193,9 @@ discarded.
@var{avalues} is a vector of @code{void *} pointers that point to the
memory locations holding the argument values for a call. If @var{cif}
declares that the function has no arguments (i.e., @var{nargs} was 0),
-then @var{avalues} is ignored.
+then @var{avalues} is ignored. Note that argument values may be
+modified by the callee (for instance, structs passed by value); the
+burden of copying pass-by-value arguments is placed on the caller.
@end defun
@@ -438,7 +462,7 @@ require special allocation on platforms that have a non-executable
heap. Memory management for closures is handled by a pair of
functions:
-@findex ffi_closure_alloca
+@findex ffi_closure_alloc
@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code})
Allocate a chunk of memory holding @var{size} bytes. This returns a
pointer to the writable address, and sets *@var{code} to the
@@ -570,9 +594,7 @@ support for these.
@itemize @bullet
@item
-There is no support for calling varargs functions. This may work on
-some platforms, depending on how the ABI is defined, but it is not
-reliable.
+Variadic closures.
@item
There is no support for bit fields in structures.
@@ -589,6 +611,8 @@ The ``raw'' API is undocumented.
@c anything else?
@end itemize
+Note that variadic support is very new and tested on a relatively
+small number of platforms.
@node Index
@unnumbered Index
diff --git a/Modules/_ctypes/libffi/doc/stamp-vti b/Modules/_ctypes/libffi/doc/stamp-vti
index 81d0b79..e259a12 100644
--- a/Modules/_ctypes/libffi/doc/stamp-vti
+++ b/Modules/_ctypes/libffi/doc/stamp-vti
@@ -1,4 +1,4 @@
-@set UPDATED 14 February 2008
-@set UPDATED-MONTH February 2008
-@set EDITION 3.0.8
-@set VERSION 3.0.8
+@set UPDATED 11 April 2012
+@set UPDATED-MONTH April 2012
+@set EDITION 3.0.11
+@set VERSION 3.0.11
diff --git a/Modules/_ctypes/libffi/doc/version.texi b/Modules/_ctypes/libffi/doc/version.texi
index 81d0b79..e259a12 100644
--- a/Modules/_ctypes/libffi/doc/version.texi
+++ b/Modules/_ctypes/libffi/doc/version.texi
@@ -1,4 +1,4 @@
-@set UPDATED 14 February 2008
-@set UPDATED-MONTH February 2008
-@set EDITION 3.0.8
-@set VERSION 3.0.8
+@set UPDATED 11 April 2012
+@set UPDATED-MONTH April 2012
+@set EDITION 3.0.11
+@set VERSION 3.0.11
diff --git a/Modules/_ctypes/libffi/fficonfig.h.in b/Modules/_ctypes/libffi/fficonfig.h.in
index e03bbf9..168ebc3 100644
--- a/Modules/_ctypes/libffi/fficonfig.h.in
+++ b/Modules/_ctypes/libffi/fficonfig.h.in
@@ -17,6 +17,9 @@
/* Define this if you want extra debugging. */
#undef FFI_DEBUG
+/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
+#undef FFI_EXEC_TRAMPOLINE_TABLE
+
/* Cannot use malloc on this target, so, we revert to alternative means */
#undef FFI_MMAP_EXEC_WRIT
@@ -33,6 +36,9 @@
*/
#undef HAVE_ALLOCA_H
+/* Define if your assembler supports .ascii. */
+#undef HAVE_AS_ASCII_PSEUDO_OP
+
/* Define if your assembler supports .cfi_* directives. */
#undef HAVE_AS_CFI_PSEUDO_OP
@@ -43,6 +49,12 @@
*/
#undef HAVE_AS_SPARC_UA_PCREL
+/* Define if your assembler supports .string. */
+#undef HAVE_AS_STRING_PSEUDO_OP
+
+/* Define if your assembler supports unwind section type. */
+#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
+
/* Define if your assembler supports PC relative relocs. */
#undef HAVE_AS_X86_PCREL
@@ -148,6 +160,9 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
+/* Define if symbols are underscored. */
+#undef SYMBOL_UNDERSCORE
+
/* Define this if you are using Purify and want to suppress spurious messages.
*/
#undef USING_PURIFY
@@ -167,6 +182,9 @@
# endif
#endif
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
#ifdef LIBFFI_ASM
diff --git a/Modules/_ctypes/libffi/generate-ios-source-and-headers.py b/Modules/_ctypes/libffi/generate-ios-source-and-headers.py
new file mode 100644
index 0000000..c2bca73
--- /dev/null
+++ b/Modules/_ctypes/libffi/generate-ios-source-and-headers.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+
+import subprocess
+import re
+import os
+import errno
+import collections
+import sys
+
+class Platform(object):
+ pass
+
+sdk_re = re.compile(r'.*-sdk ([a-zA-Z0-9.]*)')
+
+def sdkinfo(sdkname):
+ ret = {}
+ for line in subprocess.Popen(['xcodebuild', '-sdk', sdkname, '-version'], stdout=subprocess.PIPE).stdout:
+ kv = line.strip().split(': ', 1)
+ if len(kv) == 2:
+ k,v = kv
+ ret[k] = v
+ return ret
+
+sim_sdk_info = sdkinfo('iphonesimulator')
+device_sdk_info = sdkinfo('iphoneos')
+
+def latest_sdks():
+ latest_sim = None
+ latest_device = None
+ for line in subprocess.Popen(['xcodebuild', '-showsdks'], stdout=subprocess.PIPE).stdout:
+ match = sdk_re.match(line)
+ if match:
+ if 'Simulator' in line:
+ latest_sim = match.group(1)
+ elif 'iOS' in line:
+ latest_device = match.group(1)
+
+ return latest_sim, latest_device
+
+sim_sdk, device_sdk = latest_sdks()
+
+class simulator_platform(Platform):
+ sdk='iphonesimulator'
+ arch = 'i386'
+ name = 'simulator'
+ triple = 'i386-apple-darwin10'
+ sdkroot = sim_sdk_info['Path']
+
+ prefix = "#if !defined(__arm__) && defined(__i386__)\n\n"
+ suffix = "\n\n#endif"
+
+class device_platform(Platform):
+ sdk='iphoneos'
+ name = 'ios'
+ arch = 'armv7'
+ triple = 'arm-apple-darwin10'
+ sdkroot = device_sdk_info['Path']
+
+ prefix = "#ifdef __arm__\n\n"
+ suffix = "\n\n#endif"
+
+
+def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''):
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+
+ out_filename = filename
+
+ if file_suffix:
+ split_name = os.path.splitext(filename)
+ out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])
+
+ with open(os.path.join(src_dir, filename)) as in_file:
+ with open(os.path.join(dst_dir, out_filename), 'w') as out_file:
+ if prefix:
+ out_file.write(prefix)
+
+ out_file.write(in_file.read())
+
+ if suffix:
+ out_file.write(suffix)
+
+headers_seen = collections.defaultdict(set)
+
+def move_source_tree(src_dir, dest_dir, dest_include_dir, arch=None, prefix=None, suffix=None):
+ for root, dirs, files in os.walk(src_dir, followlinks=True):
+ relroot = os.path.relpath(root,src_dir)
+
+ def move_dir(arch, prefix='', suffix='', files=[]):
+ for file in files:
+ file_suffix = None
+ if file.endswith('.h'):
+ if dest_include_dir:
+ file_suffix = arch
+ if arch:
+ headers_seen[file].add(arch)
+ move_file(root, dest_include_dir, file, arch, prefix=prefix, suffix=suffix)
+
+ elif dest_dir:
+ outroot = os.path.join(dest_dir, relroot)
+ move_file(root, outroot, file, prefix=prefix, suffix=suffix)
+
+ if relroot == '.':
+ move_dir(arch=arch,
+ files=files,
+ prefix=prefix,
+ suffix=suffix)
+ elif relroot == 'arm':
+ move_dir(arch='arm',
+ prefix="#ifdef __arm__\n\n",
+ suffix="\n\n#endif",
+ files=files)
+ elif relroot == 'x86':
+ move_dir(arch='i386',
+ prefix="#if !defined(__arm__) && defined(__i386__)\n\n",
+ suffix="\n\n#endif",
+ files=files)
+
+def build_target(platform):
+ def xcrun_cmd(cmd):
+ return subprocess.check_output(['xcrun', '-sdk', platform.sdkroot, '-find', cmd]).strip()
+
+ build_dir = 'build_' + platform.name
+ if not os.path.exists(build_dir):
+ os.makedirs(build_dir)
+ env = dict(CC=xcrun_cmd('clang'),
+ LD=xcrun_cmd('ld'),
+ CFLAGS='-arch %s -isysroot %s -miphoneos-version-min=4.0' % (platform.arch, platform.sdkroot))
+ working_dir=os.getcwd()
+ try:
+ os.chdir(build_dir)
+ subprocess.check_call(['../configure', '-host', platform.triple], env=env)
+ move_source_tree('.', None, '../ios/include',
+ arch=platform.arch,
+ prefix=platform.prefix,
+ suffix=platform.suffix)
+ move_source_tree('./include', None, '../ios/include',
+ arch=platform.arch,
+ prefix=platform.prefix,
+ suffix=platform.suffix)
+ finally:
+ os.chdir(working_dir)
+
+ for header_name, archs in headers_seen.iteritems():
+ basename, suffix = os.path.splitext(header_name)
+
+def main():
+ move_source_tree('src', 'ios/src', 'ios/include')
+ move_source_tree('include', None, 'ios/include')
+ build_target(simulator_platform)
+ build_target(device_platform)
+
+ for header_name, archs in headers_seen.iteritems():
+ basename, suffix = os.path.splitext(header_name)
+ with open(os.path.join('ios/include', header_name), 'w') as header:
+ for arch in archs:
+ header.write('#include <%s_%s%s>\n' % (basename, arch, suffix))
+
+if __name__ == '__main__':
+ main()
diff --git a/Modules/_ctypes/libffi/generate-osx-source-and-headers.py b/Modules/_ctypes/libffi/generate-osx-source-and-headers.py
new file mode 100644
index 0000000..64313c1
--- /dev/null
+++ b/Modules/_ctypes/libffi/generate-osx-source-and-headers.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+import subprocess
+import re
+import os
+import errno
+import collections
+import sys
+
+class Platform(object):
+ pass
+
+sdk_re = re.compile(r'.*-sdk ([a-zA-Z0-9.]*)')
+
+def sdkinfo(sdkname):
+ ret = {}
+ for line in subprocess.Popen(['xcodebuild', '-sdk', sdkname, '-version'], stdout=subprocess.PIPE).stdout:
+ kv = line.strip().split(': ', 1)
+ if len(kv) == 2:
+ k,v = kv
+ ret[k] = v
+ return ret
+
+desktop_sdk_info = sdkinfo('macosx')
+
+def latest_sdks():
+ latest_desktop = None
+ for line in subprocess.Popen(['xcodebuild', '-showsdks'], stdout=subprocess.PIPE).stdout:
+ match = sdk_re.match(line)
+ if match:
+ if 'OS X' in line:
+ latest_desktop = match.group(1)
+
+ return latest_desktop
+
+desktop_sdk = latest_sdks()
+
+class desktop_platform_32(Platform):
+ sdk='macosx'
+ arch = 'i386'
+ name = 'mac32'
+ triple = 'i386-apple-darwin10'
+ sdkroot = desktop_sdk_info['Path']
+
+ prefix = "#if defined(__i386__) && !defined(__x86_64__)\n\n"
+ suffix = "\n\n#endif"
+
+class desktop_platform_64(Platform):
+ sdk='macosx'
+ arch = 'x86_64'
+ name = 'mac'
+ triple = 'x86_64-apple-darwin10'
+ sdkroot = desktop_sdk_info['Path']
+
+ prefix = "#if !defined(__i386__) && defined(__x86_64__)\n\n"
+ suffix = "\n\n#endif"
+
+def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''):
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+
+ out_filename = filename
+
+ if file_suffix:
+ split_name = os.path.splitext(filename)
+ out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])
+
+ with open(os.path.join(src_dir, filename)) as in_file:
+ with open(os.path.join(dst_dir, out_filename), 'w') as out_file:
+ if prefix:
+ out_file.write(prefix)
+
+ out_file.write(in_file.read())
+
+ if suffix:
+ out_file.write(suffix)
+
+headers_seen = collections.defaultdict(set)
+
+def move_source_tree(src_dir, dest_dir, dest_include_dir, arch=None, prefix=None, suffix=None):
+ for root, dirs, files in os.walk(src_dir, followlinks=True):
+ relroot = os.path.relpath(root,src_dir)
+
+ def move_dir(arch, prefix='', suffix='', files=[]):
+ for file in files:
+ file_suffix = None
+ if file.endswith('.h'):
+ if dest_include_dir:
+ file_suffix = arch
+ if arch:
+ headers_seen[file].add(arch)
+ move_file(root, dest_include_dir, file, arch, prefix=prefix, suffix=suffix)
+
+ elif dest_dir:
+ outroot = os.path.join(dest_dir, relroot)
+ move_file(root, outroot, file, prefix=prefix, suffix=suffix)
+
+ if relroot == '.':
+ move_dir(arch=arch,
+ files=files,
+ prefix=prefix,
+ suffix=suffix)
+ elif relroot == 'x86':
+ move_dir(arch='i386',
+ prefix="#if defined(__i386__) && !defined(__x86_64__)\n\n",
+ suffix="\n\n#endif",
+ files=files)
+ move_dir(arch='x86_64',
+ prefix="#if !defined(__i386__) && defined(__x86_64__)\n\n",
+ suffix="\n\n#endif",
+ files=files)
+
+def build_target(platform):
+ def xcrun_cmd(cmd):
+ return subprocess.check_output(['xcrun', '-sdk', platform.sdkroot, '-find', cmd]).strip()
+
+ build_dir = 'build_' + platform.name
+ if not os.path.exists(build_dir):
+ os.makedirs(build_dir)
+ env = dict(CC=xcrun_cmd('clang'),
+ LD=xcrun_cmd('ld'),
+ CFLAGS='-arch %s -isysroot %s -mmacosx-version-min=10.6' % (platform.arch, platform.sdkroot))
+ working_dir=os.getcwd()
+ try:
+ os.chdir(build_dir)
+ subprocess.check_call(['../configure', '-host', platform.triple], env=env)
+ move_source_tree('.', None, '../osx/include',
+ arch=platform.arch,
+ prefix=platform.prefix,
+ suffix=platform.suffix)
+ move_source_tree('./include', None, '../osx/include',
+ arch=platform.arch,
+ prefix=platform.prefix,
+ suffix=platform.suffix)
+ finally:
+ os.chdir(working_dir)
+
+ for header_name, archs in headers_seen.iteritems():
+ basename, suffix = os.path.splitext(header_name)
+
+def main():
+ move_source_tree('src', 'osx/src', 'osx/include')
+ move_source_tree('include', None, 'osx/include')
+ build_target(desktop_platform_32)
+ build_target(desktop_platform_64)
+
+ for header_name, archs in headers_seen.iteritems():
+ basename, suffix = os.path.splitext(header_name)
+ with open(os.path.join('osx/include', header_name), 'w') as header:
+ for arch in archs:
+ header.write('#include <%s_%s%s>\n' % (basename, arch, suffix))
+
+if __name__ == '__main__':
+ main()
diff --git a/Modules/_ctypes/libffi/include/Makefile.in b/Modules/_ctypes/libffi/include/Makefile.in
index 136f36c..79d493e 100644
--- a/Modules/_ctypes/libffi/include/Makefile.in
+++ b/Modules/_ctypes/libffi/include/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -37,7 +37,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = include
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(srcdir)/ffi.h.in
+ $(srcdir)/ffi.h.in $(srcdir)/ffi_common.h
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
@@ -46,7 +46,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/fficonfig.h
CONFIG_CLEAN_FILES = ffi.h ffitarget.h
-CONFIG_CLEAN_VPATH_FILES =
+CONFIG_CLEAN_VPATH_FILES = ffi_common.h
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -70,6 +70,12 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(includesdir)"
HEADERS = $(nodist_includes_HEADERS)
ETAGS = etags
@@ -78,6 +84,7 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALLOCA = @ALLOCA@
AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
AR = @AR@
AUTOCONF = @AUTOCONF@
@@ -95,6 +102,7 @@ CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
@@ -102,6 +110,7 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
FGREP = @FGREP@
GREP = @GREP@
HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -120,6 +129,7 @@ LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
@@ -132,6 +142,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
@@ -146,6 +157,7 @@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
@@ -178,7 +190,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@@ -263,9 +274,7 @@ uninstall-nodist_includesHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(includesdir)" && rm -f $$files
+ dir='$(DESTDIR)$(includesdir)'; $(am__uninstall_files_from_dir)
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -366,10 +375,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff --git a/Modules/_ctypes/libffi/include/ffi.h.in b/Modules/_ctypes/libffi/include/ffi.h.in
index df7d2cd..a51583b 100644
--- a/Modules/_ctypes/libffi/include/ffi.h.in
+++ b/Modules/_ctypes/libffi/include/ffi.h.in
@@ -1,16 +1,17 @@
/* -----------------------------------------------------------------*-C-*-
- libffi @VERSION@ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+ libffi @VERSION@ - Copyright (c) 2011 Anthony Green
+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- ``Software''), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the ``Software''), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
@@ -57,7 +58,9 @@ extern "C" {
#endif
/* Specify which architecture libffi is configured for. */
+#ifndef @TARGET@
#define @TARGET@
+#endif
/* ---- System configuration information --------------------------------- */
@@ -75,15 +78,31 @@ extern "C" {
/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
But we can find it either under the correct ANSI name, or under GNU
C's internal name. */
+
+#define FFI_64_BIT_MAX 9223372036854775807
+
#ifdef LONG_LONG_MAX
# define FFI_LONG_LONG_MAX LONG_LONG_MAX
#else
# ifdef LLONG_MAX
# define FFI_LONG_LONG_MAX LLONG_MAX
+# ifdef _AIX52 /* or newer has C99 LLONG_MAX */
+# undef FFI_64_BIT_MAX
+# define FFI_64_BIT_MAX 9223372036854775807LL
+# endif /* _AIX52 or newer */
# else
# ifdef __GNUC__
# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
# endif
+# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
+# ifndef __PPC64__
+# if defined (__IBMC__) || defined (__IBMCPP__)
+# define FFI_LONG_LONG_MAX LONGLONG_MAX
+# endif
+# endif /* __PPC64__ */
+# undef FFI_64_BIT_MAX
+# define FFI_64_BIT_MAX 9223372036854775807LL
+# endif
# endif
#endif
@@ -130,39 +149,53 @@ typedef struct _ffi_type
#endif
#if LONG_MAX == 2147483647
-# if FFI_LONG_LONG_MAX != 9223372036854775807
+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
#error "no 64-bit data type supported"
# endif
-#elif LONG_MAX != 9223372036854775807
+#elif LONG_MAX != FFI_64_BIT_MAX
#error "long size not supported"
#endif
#if LONG_MAX == 2147483647
# define ffi_type_ulong ffi_type_uint32
# define ffi_type_slong ffi_type_sint32
-#elif LONG_MAX == 9223372036854775807
+#elif LONG_MAX == FFI_64_BIT_MAX
# define ffi_type_ulong ffi_type_uint64
# define ffi_type_slong ffi_type_sint64
#else
#error "long size not supported"
#endif
+/* Need minimal decorations for DLLs to works on Windows. */
+/* GCC has autoimport and autoexport. Rely on Libtool to */
+/* help MSVC export from a DLL, but always declare data */
+/* to be imported for MSVC clients. This costs an extra */
+/* indirection for MSVC clients using the static version */
+/* of the library, but don't worry about that. Besides, */
+/* as a workaround, they can define FFI_BUILDING if they */
+/* *know* they are going to link with the static library. */
+#if defined _MSC_VER && !defined FFI_BUILDING
+#define FFI_EXTERN extern __declspec(dllimport)
+#else
+#define FFI_EXTERN extern
+#endif
+
/* These are defined in types.c */
-extern ffi_type ffi_type_void;
-extern ffi_type ffi_type_uint8;
-extern ffi_type ffi_type_sint8;
-extern ffi_type ffi_type_uint16;
-extern ffi_type ffi_type_sint16;
-extern ffi_type ffi_type_uint32;
-extern ffi_type ffi_type_sint32;
-extern ffi_type ffi_type_uint64;
-extern ffi_type ffi_type_sint64;
-extern ffi_type ffi_type_float;
-extern ffi_type ffi_type_double;
-extern ffi_type ffi_type_pointer;
+FFI_EXTERN ffi_type ffi_type_void;
+FFI_EXTERN ffi_type ffi_type_uint8;
+FFI_EXTERN ffi_type ffi_type_sint8;
+FFI_EXTERN ffi_type ffi_type_uint16;
+FFI_EXTERN ffi_type ffi_type_sint16;
+FFI_EXTERN ffi_type ffi_type_uint32;
+FFI_EXTERN ffi_type ffi_type_sint32;
+FFI_EXTERN ffi_type ffi_type_uint64;
+FFI_EXTERN ffi_type ffi_type_sint64;
+FFI_EXTERN ffi_type ffi_type_float;
+FFI_EXTERN ffi_type ffi_type_double;
+FFI_EXTERN ffi_type ffi_type_pointer;
#if @HAVE_LONG_DOUBLE@
-extern ffi_type ffi_type_longdouble;
+FFI_EXTERN ffi_type ffi_type_longdouble;
#else
#define ffi_type_longdouble ffi_type_double
#endif
@@ -188,12 +221,21 @@ typedef struct {
#endif
} ffi_cif;
+/* Used internally, but overridden by some architectures */
+ffi_status ffi_prep_cif_core(ffi_cif *cif,
+ ffi_abi abi,
+ unsigned int isvariadic,
+ unsigned int nfixedargs,
+ unsigned int ntotalargs,
+ ffi_type *rtype,
+ ffi_type **atypes);
+
/* ---- Definitions for the raw API -------------------------------------- */
#ifndef FFI_SIZEOF_ARG
# if LONG_MAX == 2147483647
# define FFI_SIZEOF_ARG 4
-# elif LONG_MAX == 9223372036854775807
+# elif LONG_MAX == FFI_64_BIT_MAX
# define FFI_SIZEOF_ARG 8
# endif
#endif
@@ -255,7 +297,12 @@ size_t ffi_java_raw_size (ffi_cif *cif);
__declspec(align(8))
#endif
typedef struct {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+ void *trampoline_table;
+ void *trampoline_table_entry;
+#else
char tramp[FFI_TRAMPOLINE_SIZE];
+#endif
ffi_cif *cif;
void (*fun)(ffi_cif*,void*,void**,void*);
void *user_data;
@@ -263,6 +310,9 @@ typedef struct {
} ffi_closure __attribute__((aligned (8)));
#else
} ffi_closure;
+# ifdef __sgi
+# pragma pack 0
+# endif
#endif
void *ffi_closure_alloc (size_t size, void **code);
@@ -281,9 +331,16 @@ ffi_prep_closure_loc (ffi_closure*,
void *user_data,
void*codeloc);
+#ifdef __sgi
+# pragma pack 8
+#endif
typedef struct {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+ void *trampoline_table;
+ void *trampoline_table_entry;
+#else
char tramp[FFI_TRAMPOLINE_SIZE];
-
+#endif
ffi_cif *cif;
#if !FFI_NATIVE_RAW_API
@@ -303,7 +360,12 @@ typedef struct {
} ffi_raw_closure;
typedef struct {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+ void *trampoline_table;
+ void *trampoline_table_entry;
+#else
char tramp[FFI_TRAMPOLINE_SIZE];
+#endif
ffi_cif *cif;
@@ -359,6 +421,13 @@ ffi_status ffi_prep_cif(ffi_cif *cif,
ffi_type *rtype,
ffi_type **atypes);
+ffi_status ffi_prep_cif_var(ffi_cif *cif,
+ ffi_abi abi,
+ unsigned int nfixedargs,
+ unsigned int ntotalargs,
+ ffi_type *rtype,
+ ffi_type **atypes);
+
void ffi_call(ffi_cif *cif,
void (*fn)(void),
void *rvalue,
diff --git a/Modules/_ctypes/libffi/include/ffi_common.h b/Modules/_ctypes/libffi/include/ffi_common.h
index 42cace9..c179d68 100644
--- a/Modules/_ctypes/libffi/include/ffi_common.h
+++ b/Modules/_ctypes/libffi/include/ffi_common.h
@@ -1,7 +1,8 @@
/* -----------------------------------------------------------------------
- ffi_common.h - Copyright (c) 1996 Red Hat, Inc.
- Copyright (C) 2007 Free Software Foundation, Inc
-
+ ffi_common.h - Copyright (C) 2011, 2012 Anthony Green
+ Copyright (C) 2007 Free Software Foundation, Inc
+ Copyright (c) 1996 Red Hat, Inc.
+
Common internal definitions and macros. Only necessary for building
libffi.
----------------------------------------------------------------------- */
@@ -74,6 +75,8 @@ void ffi_type_test(ffi_type *a, char *file, int line);
/* Perform machine dependent cif processing */
ffi_status ffi_prep_cif_machdep(ffi_cif *cif);
+ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
+ unsigned int nfixedargs, unsigned int ntotalargs);
/* Extended cif, used in callback from assembly routine */
typedef struct
@@ -112,11 +115,14 @@ typedef signed int SINT64 __attribute__((__mode__(__DI__)));
typedef float FLOAT32;
+#ifndef __GNUC__
+#define __builtin_expect(x, expected_value) (x)
+#endif
+#define LIKELY(x) __builtin_expect(!!(x),1)
+#define UNLIKELY(x) __builtin_expect((x)!=0,0)
#ifdef __cplusplus
}
#endif
#endif
-
-
diff --git a/Modules/_ctypes/libffi/install-sh b/Modules/_ctypes/libffi/install-sh
index 6ebe46d..6781b98 100755
--- a/Modules/_ctypes/libffi/install-sh
+++ b/Modules/_ctypes/libffi/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2004-12-17.09
+scriptversion=2009-04-28.21; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -39,38 +39,68 @@ scriptversion=2004-12-17.09
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
-# put in absolute paths if you don't have them in your path; or use env. vars.
+posix_mkdir=
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+# Desired mode of installed file.
+mode=0755
-chmodcmd="$chmodprog 0755"
-chowncmd=
chgrpcmd=
-stripcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
rmcmd="$rmprog -f"
-mvcmd="$mvprog"
+stripcmd=
+
src=
dst=
dir_arg=
-dstarg=
+dst_arg=
+
+copy_on_change=false
no_target_directory=
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
or: $0 [OPTION]... SRCFILES... DIRECTORY
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
or: $0 [OPTION]... -d DIRECTORIES...
@@ -80,81 +110,86 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
In the 4th, create DIRECTORIES.
Options:
--c (ignored)
--d create directories instead of installing files.
--g GROUP $chgrpprog installed files to GROUP.
--m MODE $chmodprog installed files to MODE.
--o USER $chownprog installed files to USER.
--s $stripprog installed files.
--t DIRECTORY install into DIRECTORY.
--T report an error if DSTFILE is a directory.
---help display this help and exit.
---version display version info and exit.
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
"
-while test -n "$1"; do
+while test $# -ne 0; do
case $1 in
- -c) shift
- continue;;
+ -c) ;;
- -d) dir_arg=true
- shift
- continue;;
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
-g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
+ shift;;
- --help) echo "$usage"; exit 0;;
+ --help) echo "$usage"; exit $?;;
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
-o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd=$stripprog
- shift
- continue;;
-
- -t) dstarg=$2
- shift
- shift
- continue;;
-
- -T) no_target_directory=true
- shift
- continue;;
-
- --version) echo "$0 $scriptversion"; exit 0;;
-
- *) # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- test -n "$dir_arg$dstarg" && break
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dstarg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dstarg"
- shift # fnord
- fi
- shift # arg
- dstarg=$arg
- done
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
esac
+ shift
done
-if test -z "$1"; then
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ done
+fi
+
+if test $# -eq 0; then
if test -z "$dir_arg"; then
echo "$0: no input file specified." >&2
exit 1
@@ -164,24 +199,47 @@ if test -z "$1"; then
exit 0
fi
+if test -z "$dir_arg"; then
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
for src
do
# Protect names starting with `-'.
case $src in
- -*) src=./$src ;;
+ -*) src=./$src;;
esac
if test -n "$dir_arg"; then
dst=$src
- src=
-
- if test -d "$dst"; then
- mkdircmd=:
- chmodcmd=
- else
- mkdircmd=$mkdirprog
- fi
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
else
+
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
@@ -190,71 +248,199 @@ do
exit 1
fi
- if test -z "$dstarg"; then
+ if test -z "$dst_arg"; then
echo "$0: no destination specified." >&2
exit 1
fi
- dst=$dstarg
+ dst=$dst_arg
# Protect names starting with `-'.
case $dst in
- -*) dst=./$dst ;;
+ -*) dst=./$dst;;
esac
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
if test -n "$no_target_directory"; then
- echo "$0: $dstarg: Is a directory" >&2
+ echo "$0: $dst_arg: Is a directory" >&2
exit 1
fi
- dst=$dst/`basename "$src"`
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
fi
fi
- # This sed command emulates the dirname command.
- dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
- # Make sure that the destination directory exists.
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
- # Skip lots of stat calls in the usual case.
- if test ! -d "$dstdir"; then
- defaultIFS='
- '
- IFS="${IFS-$defaultIFS}"
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
- oIFS=$IFS
- # Some sh's can't handle IFS=/ for some reason.
- IFS='%'
- set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
- shift
- IFS=$oIFS
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
- pathcomp=
+ eval "$initialize_posix_glob"
- while test $# -ne 0 ; do
- pathcomp=$pathcomp$1
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
shift
- if test ! -d "$pathcomp"; then
- $mkdirprog "$pathcomp"
- # mkdir can fail with a `File exist' error in case several
- # install-sh are creating the directory concurrently. This
- # is OK.
- test -d "$pathcomp" || exit
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
fi
- pathcomp=$pathcomp/
- done
+ fi
fi
if test -n "$dir_arg"; then
- $doit $mkdircmd "$dst" \
- && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
- && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
- && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
else
- dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
@@ -262,10 +448,9 @@ do
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
- trap '(exit $?); exit' 1 2 13 15
# Copy the file name to the temp name.
- $doit $cpprog "$src" "$dsttmp" &&
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits.
#
@@ -273,51 +458,63 @@ do
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $cpprog $src $dsttmp" command.
#
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
- && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
- && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
-
- # Now rename the file to the real destination.
- { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
- || {
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
-
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- if test -f "$dstdir/$dstfile"; then
- $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
- || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
- || {
- echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
- (exit 1); exit 1
- }
- else
- :
- fi
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
- }
- }
- fi || { (exit 1); exit 1; }
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
done
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
- (exit 0); exit 0
-}
-
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj b/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..b8e4902
--- /dev/null
+++ b/Modules/_ctypes/libffi/libffi.xcodeproj/project.pbxproj
@@ -0,0 +1,595 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 6C43CBDC1534F76F00162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBBD1534F76F00162364 /* ffi.c */; };
+ 6C43CBDD1534F76F00162364 /* sysv.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBBF1534F76F00162364 /* sysv.S */; };
+ 6C43CBDE1534F76F00162364 /* trampoline.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBC01534F76F00162364 /* trampoline.S */; };
+ 6C43CBE61534F76F00162364 /* darwin.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBC91534F76F00162364 /* darwin.S */; };
+ 6C43CBE81534F76F00162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBCB1534F76F00162364 /* ffi.c */; };
+ 6C43CBE91534F76F00162364 /* ffi64.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBCC1534F76F00162364 /* ffi64.c */; };
+ 6C43CC1F1534F77800162364 /* darwin.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC051534F77800162364 /* darwin.S */; };
+ 6C43CC201534F77800162364 /* darwin64.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC061534F77800162364 /* darwin64.S */; };
+ 6C43CC211534F77800162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC071534F77800162364 /* ffi.c */; };
+ 6C43CC221534F77800162364 /* ffi64.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC081534F77800162364 /* ffi64.c */; };
+ 6C43CC2F1534F7BE00162364 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC281534F7BE00162364 /* closures.c */; };
+ 6C43CC301534F7BE00162364 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC281534F7BE00162364 /* closures.c */; };
+ 6C43CC311534F7BE00162364 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC291534F7BE00162364 /* debug.c */; };
+ 6C43CC321534F7BE00162364 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC291534F7BE00162364 /* debug.c */; };
+ 6C43CC331534F7BE00162364 /* dlmalloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2A1534F7BE00162364 /* dlmalloc.c */; };
+ 6C43CC341534F7BE00162364 /* dlmalloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2A1534F7BE00162364 /* dlmalloc.c */; };
+ 6C43CC351534F7BE00162364 /* java_raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2B1534F7BE00162364 /* java_raw_api.c */; };
+ 6C43CC361534F7BE00162364 /* java_raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2B1534F7BE00162364 /* java_raw_api.c */; };
+ 6C43CC371534F7BE00162364 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2C1534F7BE00162364 /* prep_cif.c */; };
+ 6C43CC381534F7BE00162364 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2C1534F7BE00162364 /* prep_cif.c */; };
+ 6C43CC391534F7BE00162364 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2D1534F7BE00162364 /* raw_api.c */; };
+ 6C43CC3A1534F7BE00162364 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2D1534F7BE00162364 /* raw_api.c */; };
+ 6C43CC3B1534F7BE00162364 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2E1534F7BE00162364 /* types.c */; };
+ 6C43CC3C1534F7BE00162364 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2E1534F7BE00162364 /* types.c */; };
+ 6C43CC971535032600162364 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8D1535032600162364 /* ffi.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CC981535032600162364 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8E1535032600162364 /* ffi_common.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CC991535032600162364 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8F1535032600162364 /* ffi_i386.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CC9A1535032600162364 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC901535032600162364 /* ffi_x86_64.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CC9B1535032600162364 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC911535032600162364 /* fficonfig.h */; };
+ 6C43CC9C1535032600162364 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC921535032600162364 /* fficonfig_i386.h */; };
+ 6C43CC9D1535032600162364 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC931535032600162364 /* fficonfig_x86_64.h */; };
+ 6C43CC9E1535032600162364 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC941535032600162364 /* ffitarget.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CC9F1535032600162364 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC951535032600162364 /* ffitarget_i386.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCA01535032600162364 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC961535032600162364 /* ffitarget_x86_64.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCAD1535039600162364 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA21535039600162364 /* ffi.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCAE1535039600162364 /* ffi_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA31535039600162364 /* ffi_armv7.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCAF1535039600162364 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA41535039600162364 /* ffi_common.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCB01535039600162364 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA51535039600162364 /* ffi_i386.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCB11535039600162364 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA61535039600162364 /* fficonfig.h */; };
+ 6C43CCB21535039600162364 /* fficonfig_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA71535039600162364 /* fficonfig_armv7.h */; };
+ 6C43CCB31535039600162364 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA81535039600162364 /* fficonfig_i386.h */; };
+ 6C43CCB41535039600162364 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA91535039600162364 /* ffitarget.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCB51535039600162364 /* ffitarget_arm.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAA1535039600162364 /* ffitarget_arm.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCB61535039600162364 /* ffitarget_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAB1535039600162364 /* ffitarget_armv7.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6C43CCB71535039600162364 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAC1535039600162364 /* ffitarget_i386.h */; settings = {ATTRIBUTES = (Public, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 6C43CB3D1534E9D100162364 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 6C43CBBD1534F76F00162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = "<group>"; };
+ 6C43CBBF1534F76F00162364 /* sysv.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv.S; sourceTree = "<group>"; };
+ 6C43CBC01534F76F00162364 /* trampoline.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = trampoline.S; sourceTree = "<group>"; };
+ 6C43CBC91534F76F00162364 /* darwin.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin.S; sourceTree = "<group>"; };
+ 6C43CBCB1534F76F00162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = "<group>"; };
+ 6C43CBCC1534F76F00162364 /* ffi64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64.c; sourceTree = "<group>"; };
+ 6C43CC051534F77800162364 /* darwin.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin.S; sourceTree = "<group>"; };
+ 6C43CC061534F77800162364 /* darwin64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64.S; sourceTree = "<group>"; };
+ 6C43CC071534F77800162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = "<group>"; };
+ 6C43CC081534F77800162364 /* ffi64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64.c; sourceTree = "<group>"; };
+ 6C43CC281534F7BE00162364 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = closures.c; path = src/closures.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC291534F7BE00162364 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug.c; path = src/debug.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC2A1534F7BE00162364 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dlmalloc.c; path = src/dlmalloc.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC2B1534F7BE00162364 /* java_raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = java_raw_api.c; path = src/java_raw_api.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC2C1534F7BE00162364 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = prep_cif.c; path = src/prep_cif.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC2D1534F7BE00162364 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raw_api.c; path = src/raw_api.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC2E1534F7BE00162364 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = types.c; path = src/types.c; sourceTree = SOURCE_ROOT; };
+ 6C43CC8D1535032600162364 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = "<group>"; };
+ 6C43CC8E1535032600162364 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = "<group>"; };
+ 6C43CC8F1535032600162364 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = "<group>"; };
+ 6C43CC901535032600162364 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = "<group>"; };
+ 6C43CC911535032600162364 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = "<group>"; };
+ 6C43CC921535032600162364 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = "<group>"; };
+ 6C43CC931535032600162364 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = "<group>"; };
+ 6C43CC941535032600162364 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = "<group>"; };
+ 6C43CC951535032600162364 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = "<group>"; };
+ 6C43CC961535032600162364 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = "<group>"; };
+ 6C43CCA21535039600162364 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = "<group>"; };
+ 6C43CCA31535039600162364 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = "<group>"; };
+ 6C43CCA41535039600162364 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = "<group>"; };
+ 6C43CCA51535039600162364 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = "<group>"; };
+ 6C43CCA61535039600162364 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = "<group>"; };
+ 6C43CCA71535039600162364 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = "<group>"; };
+ 6C43CCA81535039600162364 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = "<group>"; };
+ 6C43CCA91535039600162364 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = "<group>"; };
+ 6C43CCAA1535039600162364 /* ffitarget_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm.h; sourceTree = "<group>"; };
+ 6C43CCAB1535039600162364 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = "<group>"; };
+ 6C43CCAC1535039600162364 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = "<group>"; };
+ F6F980BA147386130008F121 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 6C43CB3A1534E9D100162364 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F6F980B7147386130008F121 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 6C43CBAF1534F76F00162364 /* iOS */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CCA11535039600162364 /* include */,
+ 6C43CBBB1534F76F00162364 /* src */,
+ );
+ name = iOS;
+ path = ios;
+ sourceTree = "<group>";
+ };
+ 6C43CBBB1534F76F00162364 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CBC81534F76F00162364 /* x86 */,
+ 6C43CBBC1534F76F00162364 /* arm */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 6C43CBBC1534F76F00162364 /* arm */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CBBD1534F76F00162364 /* ffi.c */,
+ 6C43CBBF1534F76F00162364 /* sysv.S */,
+ 6C43CBC01534F76F00162364 /* trampoline.S */,
+ );
+ path = arm;
+ sourceTree = "<group>";
+ };
+ 6C43CBC81534F76F00162364 /* x86 */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CBC91534F76F00162364 /* darwin.S */,
+ 6C43CBCB1534F76F00162364 /* ffi.c */,
+ 6C43CBCC1534F76F00162364 /* ffi64.c */,
+ );
+ path = x86;
+ sourceTree = "<group>";
+ };
+ 6C43CBF01534F77800162364 /* OS X */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC8C1535032600162364 /* include */,
+ 6C43CBFC1534F77800162364 /* src */,
+ );
+ name = "OS X";
+ path = osx;
+ sourceTree = "<group>";
+ };
+ 6C43CBFC1534F77800162364 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC041534F77800162364 /* x86 */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 6C43CC041534F77800162364 /* x86 */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC051534F77800162364 /* darwin.S */,
+ 6C43CC061534F77800162364 /* darwin64.S */,
+ 6C43CC071534F77800162364 /* ffi.c */,
+ 6C43CC081534F77800162364 /* ffi64.c */,
+ );
+ path = x86;
+ sourceTree = "<group>";
+ };
+ 6C43CC3D1534F7C400162364 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC281534F7BE00162364 /* closures.c */,
+ 6C43CC291534F7BE00162364 /* debug.c */,
+ 6C43CC2A1534F7BE00162364 /* dlmalloc.c */,
+ 6C43CC2B1534F7BE00162364 /* java_raw_api.c */,
+ 6C43CC2C1534F7BE00162364 /* prep_cif.c */,
+ 6C43CC2D1534F7BE00162364 /* raw_api.c */,
+ 6C43CC2E1534F7BE00162364 /* types.c */,
+ );
+ name = src;
+ path = ios;
+ sourceTree = "<group>";
+ };
+ 6C43CC8C1535032600162364 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC8D1535032600162364 /* ffi.h */,
+ 6C43CC8E1535032600162364 /* ffi_common.h */,
+ 6C43CC8F1535032600162364 /* ffi_i386.h */,
+ 6C43CC901535032600162364 /* ffi_x86_64.h */,
+ 6C43CC911535032600162364 /* fficonfig.h */,
+ 6C43CC921535032600162364 /* fficonfig_i386.h */,
+ 6C43CC931535032600162364 /* fficonfig_x86_64.h */,
+ 6C43CC941535032600162364 /* ffitarget.h */,
+ 6C43CC951535032600162364 /* ffitarget_i386.h */,
+ 6C43CC961535032600162364 /* ffitarget_x86_64.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ 6C43CCA11535039600162364 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 6C43CCA21535039600162364 /* ffi.h */,
+ 6C43CCA31535039600162364 /* ffi_armv7.h */,
+ 6C43CCA41535039600162364 /* ffi_common.h */,
+ 6C43CCA51535039600162364 /* ffi_i386.h */,
+ 6C43CCA61535039600162364 /* fficonfig.h */,
+ 6C43CCA71535039600162364 /* fficonfig_armv7.h */,
+ 6C43CCA81535039600162364 /* fficonfig_i386.h */,
+ 6C43CCA91535039600162364 /* ffitarget.h */,
+ 6C43CCAA1535039600162364 /* ffitarget_arm.h */,
+ 6C43CCAB1535039600162364 /* ffitarget_armv7.h */,
+ 6C43CCAC1535039600162364 /* ffitarget_i386.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ F6B0839514721EE50031D8A1 = {
+ isa = PBXGroup;
+ children = (
+ 6C43CC3D1534F7C400162364 /* src */,
+ 6C43CBAF1534F76F00162364 /* iOS */,
+ 6C43CBF01534F77800162364 /* OS X */,
+ F6F980C6147386260008F121 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ F6F980C6147386260008F121 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ F6F980BA147386130008F121 /* libffi.a */,
+ 6C43CB3D1534E9D100162364 /* libffi.a */,
+ );
+ name = Products;
+ path = ../..;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 6C43CB3B1534E9D100162364 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 6C43CC971535032600162364 /* ffi.h in Headers */,
+ 6C43CC981535032600162364 /* ffi_common.h in Headers */,
+ 6C43CC991535032600162364 /* ffi_i386.h in Headers */,
+ 6C43CC9A1535032600162364 /* ffi_x86_64.h in Headers */,
+ 6C43CC9E1535032600162364 /* ffitarget.h in Headers */,
+ 6C43CC9F1535032600162364 /* ffitarget_i386.h in Headers */,
+ 6C43CCA01535032600162364 /* ffitarget_x86_64.h in Headers */,
+ 6C43CC9B1535032600162364 /* fficonfig.h in Headers */,
+ 6C43CC9C1535032600162364 /* fficonfig_i386.h in Headers */,
+ 6C43CC9D1535032600162364 /* fficonfig_x86_64.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F6F980B8147386130008F121 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 6C43CCAD1535039600162364 /* ffi.h in Headers */,
+ 6C43CCAE1535039600162364 /* ffi_armv7.h in Headers */,
+ 6C43CCAF1535039600162364 /* ffi_common.h in Headers */,
+ 6C43CCB01535039600162364 /* ffi_i386.h in Headers */,
+ 6C43CCB41535039600162364 /* ffitarget.h in Headers */,
+ 6C43CCB51535039600162364 /* ffitarget_arm.h in Headers */,
+ 6C43CCB61535039600162364 /* ffitarget_armv7.h in Headers */,
+ 6C43CCB71535039600162364 /* ffitarget_i386.h in Headers */,
+ 6C43CCB11535039600162364 /* fficonfig.h in Headers */,
+ 6C43CCB21535039600162364 /* fficonfig_armv7.h in Headers */,
+ 6C43CCB31535039600162364 /* fficonfig_i386.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 6C43CB3C1534E9D100162364 /* libffi OS X */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 6C43CB4A1534E9D100162364 /* Build configuration list for PBXNativeTarget "libffi OS X" */;
+ buildPhases = (
+ 6C43CC401534FF3B00162364 /* Generate Source and Headers */,
+ 6C43CB391534E9D100162364 /* Sources */,
+ 6C43CB3A1534E9D100162364 /* Frameworks */,
+ 6C43CB3B1534E9D100162364 /* Headers */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "libffi OS X";
+ productName = "ffi OS X";
+ productReference = 6C43CB3D1534E9D100162364 /* libffi.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ F6F980B9147386130008F121 /* libffi iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = F6F980C4147386130008F121 /* Build configuration list for PBXNativeTarget "libffi iOS" */;
+ buildPhases = (
+ 6C43CC3E1534F8E200162364 /* Generate Trampoline */,
+ 6C43CC3F1534FF1B00162364 /* Generate Source and Headers */,
+ F6F980B6147386130008F121 /* Sources */,
+ F6F980B7147386130008F121 /* Frameworks */,
+ F6F980B8147386130008F121 /* Headers */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "libffi iOS";
+ productName = ffi;
+ productReference = F6F980BA147386130008F121 /* libffi.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ F6B0839714721EE50031D8A1 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0430;
+ };
+ buildConfigurationList = F6B0839A14721EE50031D8A1 /* Build configuration list for PBXProject "libffi" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = F6B0839514721EE50031D8A1;
+ productRefGroup = F6B0839514721EE50031D8A1;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ F6F980B9147386130008F121 /* libffi iOS */,
+ 6C43CB3C1534E9D100162364 /* libffi OS X */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 6C43CC3E1534F8E200162364 /* Generate Trampoline */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Generate Trampoline";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /usr/bin/python;
+ shellScript = "import subprocess\nimport re\nimport os\nimport errno\nimport sys\n\ndef main():\n with open('src/arm/trampoline.S', 'w') as tramp_out:\n p = subprocess.Popen(['bash', 'src/arm/gentramp.sh'], stdout=tramp_out)\n p.wait()\n\nif __name__ == '__main__':\n main()";
+ };
+ 6C43CC3F1534FF1B00162364 /* Generate Source and Headers */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Generate Source and Headers";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/usr/bin/python generate-ios-source-and-headers.py";
+ };
+ 6C43CC401534FF3B00162364 /* Generate Source and Headers */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Generate Source and Headers";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/usr/bin/python generate-osx-source-and-headers.py";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 6C43CB391534E9D100162364 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 6C43CC1F1534F77800162364 /* darwin.S in Sources */,
+ 6C43CC201534F77800162364 /* darwin64.S in Sources */,
+ 6C43CC211534F77800162364 /* ffi.c in Sources */,
+ 6C43CC221534F77800162364 /* ffi64.c in Sources */,
+ 6C43CC301534F7BE00162364 /* closures.c in Sources */,
+ 6C43CC321534F7BE00162364 /* debug.c in Sources */,
+ 6C43CC341534F7BE00162364 /* dlmalloc.c in Sources */,
+ 6C43CC361534F7BE00162364 /* java_raw_api.c in Sources */,
+ 6C43CC381534F7BE00162364 /* prep_cif.c in Sources */,
+ 6C43CC3A1534F7BE00162364 /* raw_api.c in Sources */,
+ 6C43CC3C1534F7BE00162364 /* types.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F6F980B6147386130008F121 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 6C43CBDC1534F76F00162364 /* ffi.c in Sources */,
+ 6C43CBDD1534F76F00162364 /* sysv.S in Sources */,
+ 6C43CBDE1534F76F00162364 /* trampoline.S in Sources */,
+ 6C43CBE61534F76F00162364 /* darwin.S in Sources */,
+ 6C43CBE81534F76F00162364 /* ffi.c in Sources */,
+ 6C43CBE91534F76F00162364 /* ffi64.c in Sources */,
+ 6C43CC2F1534F7BE00162364 /* closures.c in Sources */,
+ 6C43CC311534F7BE00162364 /* debug.c in Sources */,
+ 6C43CC331534F7BE00162364 /* dlmalloc.c in Sources */,
+ 6C43CC351534F7BE00162364 /* java_raw_api.c in Sources */,
+ 6C43CC371534F7BE00162364 /* prep_cif.c in Sources */,
+ 6C43CC391534F7BE00162364 /* raw_api.c in Sources */,
+ 6C43CC3B1534F7BE00162364 /* types.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 6C43CB4B1534E9D100162364 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ DSTROOT = /tmp/ffi.dst;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = ffi;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 6C43CB4C1534E9D100162364 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DSTROOT = /tmp/ffi.dst;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ PRODUCT_NAME = ffi;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ F6B083AB14721EE50031D8A1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ios/include;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ F6B083AC14721EE50031D8A1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PREPROCESSOR_DEFINITIONS = "";
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VALUE = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ios/include;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ F6F980C2147386130008F121 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ armv6,
+ armv7,
+ );
+ DSTROOT = /tmp/ffi.dst;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_THUMB_SUPPORT = NO;
+ IPHONEOS_DEPLOYMENT_TARGET = 4.0;
+ OTHER_LDFLAGS = "-ObjC";
+ PRODUCT_NAME = ffi;
+ SKIP_INSTALL = YES;
+ };
+ name = Debug;
+ };
+ F6F980C3147386130008F121 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ armv6,
+ armv7,
+ );
+ DSTROOT = /tmp/ffi.dst;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_THUMB_SUPPORT = NO;
+ IPHONEOS_DEPLOYMENT_TARGET = 4.0;
+ OTHER_LDFLAGS = "-ObjC";
+ PRODUCT_NAME = ffi;
+ SKIP_INSTALL = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 6C43CB4A1534E9D100162364 /* Build configuration list for PBXNativeTarget "libffi OS X" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 6C43CB4B1534E9D100162364 /* Debug */,
+ 6C43CB4C1534E9D100162364 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F6B0839A14721EE50031D8A1 /* Build configuration list for PBXProject "libffi" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F6B083AB14721EE50031D8A1 /* Debug */,
+ F6B083AC14721EE50031D8A1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ F6F980C4147386130008F121 /* Build configuration list for PBXNativeTarget "libffi iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F6F980C2147386130008F121 /* Debug */,
+ F6F980C3147386130008F121 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = F6B0839714721EE50031D8A1 /* Project object */;
+}
diff --git a/Modules/_ctypes/libffi/libtool-version b/Modules/_ctypes/libffi/libtool-version
index b8b80e0..95f48c5 100644
--- a/Modules/_ctypes/libffi/libtool-version
+++ b/Modules/_ctypes/libffi/libtool-version
@@ -26,4 +26,4 @@
# release, then set age to 0.
#
# CURRENT:REVISION:AGE
-5:10:0
+6:0:0
diff --git a/Modules/_ctypes/libffi/ltmain.sh b/Modules/_ctypes/libffi/ltmain.sh
index 6939dcc..c2852d8 100755..100644
--- a/Modules/_ctypes/libffi/ltmain.sh
+++ b/Modules/_ctypes/libffi/ltmain.sh
@@ -1,9 +1,9 @@
-# Generated from ltmain.m4sh.
-# ltmain.sh (GNU libtool) 2.2.6
+# libtool (GNU libtool) 2.4.2
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -32,50 +32,57 @@
#
# Provide generalized library-building support services.
#
-# --config show all configuration variables
-# --debug enable verbose shell tracing
-# -n, --dry-run display commands without modifying any files
-# --features display basic configuration information and exit
-# --mode=MODE use operation mode MODE
-# --preserve-dup-deps don't remove duplicate dependency libraries
-# --quiet, --silent don't print informational messages
-# --tag=TAG use configuration variables from tag TAG
-# -v, --verbose print informational messages (default)
-# --version print version information
-# -h, --help print short or long help message
+# --config show all configuration variables
+# --debug enable verbose shell tracing
+# -n, --dry-run display commands without modifying any files
+# --features display basic configuration information and exit
+# --mode=MODE use operation mode MODE
+# --preserve-dup-deps don't remove duplicate dependency libraries
+# --quiet, --silent don't print informational messages
+# --no-quiet, --no-silent
+# print informational messages (default)
+# --no-warn don't display warning messages
+# --tag=TAG use configuration variables from tag TAG
+# -v, --verbose print more informational messages than default
+# --no-verbose don't print the extra informational messages
+# --version print version information
+# -h, --help, --help-all print short, long, or detailed help message
#
# MODE must be one of the following:
#
-# clean remove files from the build directory
-# compile compile a source file into a libtool object
-# execute automatically set library path, then run a program
-# finish complete the installation of libtool libraries
-# install install libraries or executables
-# link create a library or an executable
-# uninstall remove libraries from an installed directory
+# clean remove files from the build directory
+# compile compile a source file into a libtool object
+# execute automatically set library path, then run a program
+# finish complete the installation of libtool libraries
+# install install libraries or executables
+# link create a library or an executable
+# uninstall remove libraries from an installed directory
#
-# MODE-ARGS vary depending on the MODE.
+# MODE-ARGS vary depending on the MODE. When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
#
# When reporting a bug, please describe a test case to reproduce it and
# include the following information:
#
-# host-triplet: $host
-# shell: $SHELL
-# compiler: $LTCC
-# compiler flags: $LTCFLAGS
-# linker: $LD (gnu? $with_gnu_ld)
-# $progname: (GNU libtool) 2.2.6
-# automake: $automake_version
-# autoconf: $autoconf_version
+# host-triplet: $host
+# shell: $SHELL
+# compiler: $LTCC
+# compiler flags: $LTCFLAGS
+# linker: $LD (gnu? $with_gnu_ld)
+# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+# automake: $automake_version
+# autoconf: $autoconf_version
#
# Report bugs to <bug-libtool@gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
-PROGRAM=ltmain.sh
+PROGRAM=libtool
PACKAGE=libtool
-VERSION=2.2.6
+VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
TIMESTAMP=""
-package_revision=1.3012
+package_revision=1.3337
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
@@ -91,10 +98,15 @@ fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
lt_user_locale=
lt_safe_locale=
for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
@@ -107,24 +119,28 @@ do
lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
fi"
done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
$lt_unset CDPATH
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
: ${CP="cp -f"}
-: ${ECHO="echo"}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
: ${MAKE="make"}
: ${MKDIR="mkdir"}
: ${MV="mv -f"}
: ${RM="rm -f"}
-: ${SED="/bin/sed"}
: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
: ${Xsed="$SED -e 1s/^X//"}
@@ -144,6 +160,27 @@ IFS=" $lt_nl"
dirname="s,/[^/]*$,,"
basename="s,^.*/,,"
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE. If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+ func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+ if test "X$func_dirname_result" = "X${1}"; then
+ func_dirname_result="${3}"
+ else
+ func_dirname_result="$func_dirname_result${2}"
+ fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+ func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
# func_dirname_and_basename file append nondir_replacement
# perform func_basename and func_dirname in a single function
# call:
@@ -158,33 +195,183 @@ basename="s,^.*/,,"
# those functions but instead duplicate the functionality here.
func_dirname_and_basename ()
{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+ # Extract subdirectory from the argument.
+ func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+ if test "X$func_dirname_result" = "X${1}"; then
+ func_dirname_result="${3}"
+ else
+ func_dirname_result="$func_dirname_result${2}"
+ fi
+ func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+ case ${2} in
+ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+ s@/\./@/@g
+ t dotsl
+ s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+# value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+ # Start from root dir and reassemble the path.
+ func_normal_abspath_result=
+ func_normal_abspath_tpath=$1
+ func_normal_abspath_altnamespace=
+ case $func_normal_abspath_tpath in
+ "")
+ # Empty path, that just means $cwd.
+ func_stripname '' '/' "`pwd`"
+ func_normal_abspath_result=$func_stripname_result
+ return
+ ;;
+ # The next three entries are used to spot a run of precisely
+ # two leading slashes without using negated character classes;
+ # we take advantage of case's first-match behaviour.
+ ///*)
+ # Unusual form of absolute path, do nothing.
+ ;;
+ //*)
+ # Not necessarily an ordinary path; POSIX reserves leading '//'
+ # and for example Cygwin uses it to access remote file shares
+ # over CIFS/SMB, so we conserve a leading double slash if found.
+ func_normal_abspath_altnamespace=/
+ ;;
+ /*)
+ # Absolute path, do nothing.
+ ;;
+ *)
+ # Relative path, prepend $cwd.
+ func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+ ;;
+ esac
+ # Cancel out all the simple stuff to save iterations. We also want
+ # the path to end with a slash for ease of parsing, so make sure
+ # there is one (and only one) here.
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+ while :; do
+ # Processed it all yet?
+ if test "$func_normal_abspath_tpath" = / ; then
+ # If we ascended to the root using ".." the result may be empty now.
+ if test -z "$func_normal_abspath_result" ; then
+ func_normal_abspath_result=/
+ fi
+ break
+ fi
+ func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$pathcar"`
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$pathcdr"`
+ # Figure out what to do with it
+ case $func_normal_abspath_tcomponent in
+ "")
+ # Trailing empty path component, ignore it.
+ ;;
+ ..)
+ # Parent dir; strip last assembled component from result.
+ func_dirname "$func_normal_abspath_result"
+ func_normal_abspath_result=$func_dirname_result
+ ;;
+ *)
+ # Actual path component, append it.
+ func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+ ;;
+ esac
+ done
+ # Restore leading double-slash if one was found on entry.
+ func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
}
-# Generated shell functions inserted here.
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+# value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+ func_relative_path_result=
+ func_normal_abspath "$1"
+ func_relative_path_tlibdir=$func_normal_abspath_result
+ func_normal_abspath "$2"
+ func_relative_path_tbindir=$func_normal_abspath_result
+
+ # Ascend the tree starting from libdir
+ while :; do
+ # check if we have found a prefix of bindir
+ case $func_relative_path_tbindir in
+ $func_relative_path_tlibdir)
+ # found an exact match
+ func_relative_path_tcancelled=
+ break
+ ;;
+ $func_relative_path_tlibdir*)
+ # found a matching prefix
+ func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+ func_relative_path_tcancelled=$func_stripname_result
+ if test -z "$func_relative_path_result"; then
+ func_relative_path_result=.
+ fi
+ break
+ ;;
+ *)
+ func_dirname $func_relative_path_tlibdir
+ func_relative_path_tlibdir=${func_dirname_result}
+ if test "x$func_relative_path_tlibdir" = x ; then
+ # Have to descend all the way to the root!
+ func_relative_path_result=../$func_relative_path_result
+ func_relative_path_tcancelled=$func_relative_path_tbindir
+ break
+ fi
+ func_relative_path_result=../$func_relative_path_result
+ ;;
+ esac
+ done
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
+ # Now calculate path; take care to avoid doubling-up slashes.
+ func_stripname '' '/' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ func_stripname '/' '/' "$func_relative_path_tcancelled"
+ if test "x$func_stripname_result" != x ; then
+ func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+ fi
+
+ # Normalisation. If bindir is libdir, return empty string,
+ # else relative path ending with a slash; either way, target
+ # file name can be directly appended.
+ if test ! -z "$func_relative_path_result"; then
+ func_stripname './' '' "$func_relative_path_result/"
+ func_relative_path_result=$func_stripname_result
+ fi
+}
# The name of this program:
-# In the unlikely event $progname began with a '-', it would play havoc with
-# func_echo (imagine progname=-n), so we prepend ./ in that case:
func_dirname_and_basename "$progpath"
progname=$func_basename_result
-case $progname in
- -*) progname=./$progname ;;
-esac
# Make sure we have an absolute path for reexecution:
case $progpath in
@@ -196,7 +383,7 @@ case $progpath in
;;
*)
save_IFS="$IFS"
- IFS=:
+ IFS=${PATH_SEPARATOR-:}
for progdir in $PATH; do
IFS="$save_IFS"
test -x "$progdir/$progname" && break
@@ -215,6 +402,15 @@ sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
# Same as above, but do not quote variable references.
double_quote_subst='s/\(["`\\]\)/\\\1/g'
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes. A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
# Re-`\' parameter expansions in output of double_quote_subst that were
# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
# in input to double_quote_subst, that '$' was protected from expansion.
@@ -243,7 +439,7 @@ opt_warning=:
# name if it has been set yet.
func_echo ()
{
- $ECHO "$progname${mode+: }$mode: $*"
+ $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
}
# func_verbose arg...
@@ -258,18 +454,25 @@ func_verbose ()
:
}
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
+
# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
- $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+ $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
}
# func_warning arg...
# Echo program name prefixed warning message to standard error.
func_warning ()
{
- $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+ $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
# bash bug again:
:
@@ -326,9 +529,9 @@ func_mkdir_p ()
case $my_directory_path in */*) ;; *) break ;; esac
# ...otherwise throw away the child directory and loop
- my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+ my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
done
- my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+ my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
save_mkdir_p_IFS="$IFS"; IFS=':'
for my_dir in $my_dir_list; do
@@ -378,7 +581,7 @@ func_mktempdir ()
func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
fi
- $ECHO "X$my_tmpdir" | $Xsed
+ $ECHO "$my_tmpdir"
}
@@ -392,7 +595,7 @@ func_quote_for_eval ()
{
case $1 in
*[\\\`\"\$]*)
- func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+ func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
*)
func_quote_for_eval_unquoted_result="$1" ;;
esac
@@ -419,7 +622,7 @@ func_quote_for_expand ()
{
case $1 in
*[\\\`\"]*)
- my_arg=`$ECHO "X$1" | $Xsed \
+ my_arg=`$ECHO "$1" | $SED \
-e "$double_quote_subst" -e "$sed_double_backslash"` ;;
*)
my_arg="$1" ;;
@@ -488,15 +691,39 @@ func_show_eval_locale ()
fi
}
-
-
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result. All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+ case $1 in
+ [0-9]* | *[!a-zA-Z0-9_]*)
+ func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+ ;;
+ * )
+ func_tr_sh_result=$1
+ ;;
+ esac
+}
# func_version
# Echo version message to standard output and exit.
func_version ()
{
- $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+ $opt_debug
+
+ $SED -n '/(C)/!b go
+ :more
+ /\./!{
+ N
+ s/\n# / /
+ b more
+ }
+ :go
+ /^# '$PROGRAM' (GNU /,/# warranty; / {
s/^# //
s/^# *$//
s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
@@ -509,22 +736,28 @@ func_version ()
# Echo short help message to standard output and exit.
func_usage ()
{
- $SED -n '/^# Usage:/,/# -h/ {
+ $opt_debug
+
+ $SED -n '/^# Usage:/,/^# *.*--help/ {
s/^# //
s/^# *$//
s/\$progname/'$progname'/
p
}' < "$progpath"
- $ECHO
+ echo
$ECHO "run \`$progname --help | more' for full usage"
exit $?
}
-# func_help
-# Echo long help message to standard output and exit.
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
func_help ()
{
+ $opt_debug
+
$SED -n '/^# Usage:/,/# Report bugs to/ {
+ :print
s/^# //
s/^# *$//
s*\$progname*'$progname'*
@@ -534,11 +767,18 @@ func_help ()
s*\$LTCFLAGS*'"$LTCFLAGS"'*
s*\$LD*'"$LD"'*
s/\$with_gnu_ld/'"$with_gnu_ld"'/
- s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
- s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
p
- }' < "$progpath"
- exit $?
+ d
+ }
+ /^# .* home page:/b print
+ /^# General help using/b print
+ ' < "$progpath"
+ ret=$?
+ if test -z "$1"; then
+ exit $ret
+ fi
}
# func_missing_arg argname
@@ -546,63 +786,106 @@ func_help ()
# exit_cmd.
func_missing_arg ()
{
- func_error "missing argument for $1"
+ $opt_debug
+
+ func_error "missing argument for $1."
exit_cmd=exit
}
-exit_cmd=:
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+ my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+ my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+ func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+ func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+ my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+ my_sed_long_arg='1s/^--[^=]*=//'
+
+ func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+ func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
-# Check that we have a working $ECHO.
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
- # Yippee, $ECHO works!
- :
-else
- # Restart under the correct shell, and then maybe $ECHO will work.
- exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit $EXIT_SUCCESS
-fi
magic="%%%MAGIC variable%%%"
magic_exe="%%%MAGIC EXE variable%%%"
# Global variables.
-# $mode is unset
nonopt=
-execute_dlfiles=
preserve_args=
lo2o="s/\\.lo\$/.${objext}/"
o2lo="s/\\.${objext}\$/.lo/"
extracted_archives=
extracted_serial=0
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
# If this variable is set in any of the actions, the command in it
# will be execed at the end. This prevents here-documents from being
# left over by shells.
exec_cmd=
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+ eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+ func_quote_for_eval "${2}"
+ eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+ func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+ func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+ func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+ func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
# func_fatal_configuration arg...
# Echo program name prefixed message to standard error, followed by
# a configuration failure hint, and exit.
@@ -636,16 +919,16 @@ func_config ()
# Display the features supported by this script.
func_features ()
{
- $ECHO "host: $host"
+ echo "host: $host"
if test "$build_libtool_libs" = yes; then
- $ECHO "enable shared libraries"
+ echo "enable shared libraries"
else
- $ECHO "disable shared libraries"
+ echo "disable shared libraries"
fi
if test "$build_old_libs" = yes; then
- $ECHO "enable static libraries"
+ echo "enable static libraries"
else
- $ECHO "disable static libraries"
+ echo "disable static libraries"
fi
exit $?
@@ -692,117 +975,209 @@ func_enable_tag ()
esac
}
-# Parse options once, thoroughly. This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
{
+ if test "$package_revision" != "$macro_revision"; then
+ if test "$VERSION" != "$macro_version"; then
+ if test -z "$macro_version"; then
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+ fi
+ else
+ cat >&2 <<_LT_EOF
+$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+ fi
- # Shorthand for --mode=foo, only valid as the first argument
- case $1 in
- clean|clea|cle|cl)
- shift; set dummy --mode clean ${1+"$@"}; shift
- ;;
- compile|compil|compi|comp|com|co|c)
- shift; set dummy --mode compile ${1+"$@"}; shift
- ;;
- execute|execut|execu|exec|exe|ex|e)
- shift; set dummy --mode execute ${1+"$@"}; shift
- ;;
- finish|finis|fini|fin|fi|f)
- shift; set dummy --mode finish ${1+"$@"}; shift
- ;;
- install|instal|insta|inst|ins|in|i)
- shift; set dummy --mode install ${1+"$@"}; shift
- ;;
- link|lin|li|l)
- shift; set dummy --mode link ${1+"$@"}; shift
- ;;
- uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
- shift; set dummy --mode uninstall ${1+"$@"}; shift
- ;;
- esac
+ exit $EXIT_MISMATCH
+ fi
+}
- # Parse non-mode specific arguments:
- while test "$#" -gt 0; do
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+ shift; set dummy --mode clean ${1+"$@"}; shift
+ ;;
+compile|compil|compi|comp|com|co|c)
+ shift; set dummy --mode compile ${1+"$@"}; shift
+ ;;
+execute|execut|execu|exec|exe|ex|e)
+ shift; set dummy --mode execute ${1+"$@"}; shift
+ ;;
+finish|finis|fini|fin|fi|f)
+ shift; set dummy --mode finish ${1+"$@"}; shift
+ ;;
+install|instal|insta|inst|ins|in|i)
+ shift; set dummy --mode install ${1+"$@"}; shift
+ ;;
+link|lin|li|l)
+ shift; set dummy --mode link ${1+"$@"}; shift
+ ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+ shift; set dummy --mode uninstall ${1+"$@"}; shift
+ ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly. This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+ # this just eases exit handling
+ while test $# -gt 0; do
opt="$1"
shift
-
case $opt in
- --config) func_config ;;
-
- --debug) preserve_args="$preserve_args $opt"
+ --debug|-x) opt_debug='set -x'
func_echo "enabling shell trace mode"
- opt_debug='set -x'
$opt_debug
;;
-
- -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break
- execute_dlfiles="$execute_dlfiles $1"
- shift
+ --dry-run|--dryrun|-n)
+ opt_dry_run=:
;;
-
- --dry-run | -n) opt_dry_run=: ;;
- --features) func_features ;;
- --finish) mode="finish" ;;
-
- --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break
- case $1 in
- # Valid mode arguments:
- clean) ;;
- compile) ;;
- execute) ;;
- finish) ;;
- install) ;;
- link) ;;
- relink) ;;
- uninstall) ;;
-
- # Catch anything else as an error
- *) func_error "invalid argument for $opt"
- exit_cmd=exit
- break
- ;;
- esac
-
- mode="$1"
+ --config)
+ opt_config=:
+func_config
+ ;;
+ --dlopen|-dlopen)
+ optarg="$1"
+ opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
shift
;;
-
--preserve-dup-deps)
- opt_duplicate_deps=: ;;
-
- --quiet|--silent) preserve_args="$preserve_args $opt"
- opt_silent=:
+ opt_preserve_dup_deps=:
;;
-
- --verbose| -v) preserve_args="$preserve_args $opt"
+ --features)
+ opt_features=:
+func_features
+ ;;
+ --finish)
+ opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+ ;;
+ --help)
+ opt_help=:
+ ;;
+ --help-all)
+ opt_help_all=:
+opt_help=': help-all'
+ ;;
+ --mode)
+ test $# = 0 && func_missing_arg $opt && break
+ optarg="$1"
+ opt_mode="$optarg"
+case $optarg in
+ # Valid mode arguments:
+ clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+ # Catch anything else as an error
+ *) func_error "invalid argument for $opt"
+ exit_cmd=exit
+ break
+ ;;
+esac
+ shift
+ ;;
+ --no-silent|--no-quiet)
opt_silent=false
+func_append preserve_args " $opt"
;;
-
- --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break
- preserve_args="$preserve_args $opt $1"
- func_enable_tag "$1" # tagname is set here
+ --no-warning|--no-warn)
+ opt_warning=false
+func_append preserve_args " $opt"
+ ;;
+ --no-verbose)
+ opt_verbose=false
+func_append preserve_args " $opt"
+ ;;
+ --silent|--quiet)
+ opt_silent=:
+func_append preserve_args " $opt"
+ opt_verbose=false
+ ;;
+ --verbose|-v)
+ opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+ ;;
+ --tag)
+ test $# = 0 && func_missing_arg $opt && break
+ optarg="$1"
+ opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
shift
;;
+ -\?|-h) func_usage ;;
+ --help) func_help ;;
+ --version) func_version ;;
+
# Separate optargs to long options:
- -dlopen=*|--mode=*|--tag=*)
- func_opt_split "$opt"
- set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+ --*=*)
+ func_split_long_opt "$opt"
+ set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
shift
;;
- -\?|-h) func_usage ;;
- --help) opt_help=: ;;
- --version) func_version ;;
-
- -*) func_fatal_help "unrecognized option \`$opt'" ;;
-
- *) nonopt="$opt"
- break
+ # Separate non-argument short options:
+ -\?*|-h*|-n*|-v*)
+ func_split_short_opt "$opt"
+ set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+ shift
;;
+
+ --) break ;;
+ -*) func_fatal_help "unrecognized option \`$opt'" ;;
+ *) set dummy "$opt" ${1+"$@"}; shift; break ;;
esac
done
+ # Validate options:
+
+ # save first non-option argument
+ if test "$#" -gt 0; then
+ nonopt="$opt"
+ shift
+ fi
+
+ # preserve --debug
+ test "$opt_debug" = : || func_append preserve_args " --debug"
case $host in
*cygwin* | *mingw* | *pw32* | *cegcc*)
@@ -810,82 +1185,44 @@ func_enable_tag ()
opt_duplicate_compiler_generated_deps=:
;;
*)
- opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
;;
esac
- # Having warned about all mis-specified options, bail out if
- # anything was wrong.
- $exit_cmd $EXIT_FAILURE
-}
+ $opt_help || {
+ # Sanity checks first:
+ func_check_version_match
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
- if test "$package_revision" != "$macro_revision"; then
- if test "$VERSION" != "$macro_version"; then
- if test -z "$macro_version"; then
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- fi
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
+ if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ func_fatal_configuration "not configured to build any kind of library"
fi
- exit $EXIT_MISMATCH
- fi
-}
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+ func_error "unrecognized option \`-dlopen'"
+ $ECHO "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
-## ----------- ##
-## Main. ##
-## ----------- ##
-
-$opt_help || {
- # Sanity checks first:
- func_check_version_match
-
- if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- func_fatal_configuration "not configured to build any kind of library"
- fi
-
- test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$progname --help --mode=$opt_mode' for more information."
+ }
- # Darwin sucks
- eval std_shrext=\"$shrext_cmds\"
+ # Bail if the options were screwed
+ $exit_cmd $EXIT_FAILURE
+}
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$execute_dlfiles" && test "$mode" != execute; then
- func_error "unrecognized option \`-dlopen'"
- $ECHO "$help" 1>&2
- exit $EXIT_FAILURE
- fi
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$progname --help --mode=$mode' for more information."
-}
+## ----------- ##
+## Main. ##
+## ----------- ##
# func_lalib_p file
# True iff FILE is a libtool `.la' library or `.lo' object file.
@@ -950,12 +1287,9 @@ func_ltwrapper_executable_p ()
# temporary ltwrapper_script.
func_ltwrapper_scriptname ()
{
- func_ltwrapper_scriptname_result=""
- if func_ltwrapper_executable_p "$1"; then
- func_dirname_and_basename "$1" "" "."
- func_stripname '' '.exe' "$func_basename_result"
- func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
- fi
+ func_dirname_and_basename "$1" "" "."
+ func_stripname '' '.exe' "$func_basename_result"
+ func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
}
# func_ltwrapper_p file
@@ -1001,6 +1335,37 @@ func_source ()
}
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot. Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+ func_resolve_sysroot_result=$1
+ case $func_resolve_sysroot_result in
+ =*)
+ func_stripname '=' '' "$func_resolve_sysroot_result"
+ func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+ ;;
+ esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+ case "$lt_sysroot:$1" in
+ ?*:"$lt_sysroot"*)
+ func_stripname "$lt_sysroot" '' "$1"
+ func_replace_sysroot_result="=$func_stripname_result"
+ ;;
+ *)
+ # Including no sysroot.
+ func_replace_sysroot_result=$1
+ ;;
+ esac
+}
+
# func_infer_tag arg
# Infer tagged configuration to use if any are available and
# if one wasn't chosen via the "--tag" command line option.
@@ -1013,13 +1378,15 @@ func_infer_tag ()
if test -n "$available_tags" && test -z "$tagname"; then
CC_quoted=
for arg in $CC; do
- func_quote_for_eval "$arg"
- CC_quoted="$CC_quoted $func_quote_for_eval_result"
+ func_append_quoted CC_quoted "$arg"
done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
case $@ in
# Blanks in the command may have been stripped by the calling shell,
# but not from the CC environment variable when configure was run.
- " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
# Blanks at the start of $base_compile will cause this to fail
# if we don't check for them as well.
*)
@@ -1030,11 +1397,13 @@ func_infer_tag ()
CC_quoted=
for arg in $CC; do
# Double-quote args containing other shell metacharacters.
- func_quote_for_eval "$arg"
- CC_quoted="$CC_quoted $func_quote_for_eval_result"
+ func_append_quoted CC_quoted "$arg"
done
+ CC_expanded=`func_echo_all $CC`
+ CC_quoted_expanded=`func_echo_all $CC_quoted`
case "$@ " in
- " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+ " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
# The compiler in the base compile command matches
# the one in the tagged configuration.
# Assume this is the tagged configuration we want.
@@ -1097,6 +1466,486 @@ EOF
}
}
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+ $opt_debug
+ func_convert_core_file_wine_to_w32_result="$1"
+ if test -n "$1"; then
+ # Unfortunately, winepath does not exit with a non-zero error code, so we
+ # are forced to check the contents of stdout. On the other hand, if the
+ # command is not found, the shell will set an exit code of 127 and print
+ # *an error message* to stdout. So we must check for both error code of
+ # zero AND non-empty stdout, which explains the odd construction:
+ func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+ if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+ func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+ $SED -e "$lt_sed_naive_backslashify"`
+ else
+ func_convert_core_file_wine_to_w32_result=
+ fi
+ fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+ $opt_debug
+ # unfortunately, winepath doesn't convert paths, only file names
+ func_convert_core_path_wine_to_w32_result=""
+ if test -n "$1"; then
+ oldIFS=$IFS
+ IFS=:
+ for func_convert_core_path_wine_to_w32_f in $1; do
+ IFS=$oldIFS
+ func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+ if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+ if test -z "$func_convert_core_path_wine_to_w32_result"; then
+ func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+ else
+ func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+ fi
+ fi
+ done
+ IFS=$oldIFS
+ fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+ $opt_debug
+ if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+ func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+ if test "$?" -ne 0; then
+ # on failure, ensure result is empty
+ func_cygpath_result=
+ fi
+ else
+ func_cygpath_result=
+ func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+ fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format. Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+ $opt_debug
+ # awkward: cmd appends spaces to result
+ func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+ $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+ $opt_debug
+ if test -z "$2" && test -n "$1" ; then
+ func_error "Could not determine host file name corresponding to"
+ func_error " \`$1'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback:
+ func_to_host_file_result="$1"
+ fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+ $opt_debug
+ if test -z "$4" && test -n "$3"; then
+ func_error "Could not determine the host path corresponding to"
+ func_error " \`$3'"
+ func_error "Continuing, but uninstalled executables may not work."
+ # Fallback. This is a deliberately simplistic "conversion" and
+ # should not be "improved". See libtool.info.
+ if test "x$1" != "x$2"; then
+ lt_replace_pathsep_chars="s|$1|$2|g"
+ func_to_host_path_result=`echo "$3" |
+ $SED -e "$lt_replace_pathsep_chars"`
+ else
+ func_to_host_path_result="$3"
+ fi
+ fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+ $opt_debug
+ case $4 in
+ $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+ ;;
+ esac
+ case $4 in
+ $2 ) func_append func_to_host_path_result "$3"
+ ;;
+ esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+ $opt_debug
+ $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result. If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+ $opt_debug
+ case ,$2, in
+ *,"$to_tool_file_cmd",*)
+ func_to_tool_file_result=$1
+ ;;
+ *)
+ $to_tool_file_cmd "$1"
+ func_to_tool_file_result=$func_to_host_file_result
+ ;;
+ esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+ func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+ # LT_CYGPATH in this case.
+ func_to_host_file_result=`cygpath -m "$1"`
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format. Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_file_wine_to_w32 "$1"
+ func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ func_convert_core_msys_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_msys_to_w32_result"
+ func_to_host_file_result="$func_cygpath_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set. Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_file_result="$1"
+ if test -n "$1"; then
+ # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+ func_convert_core_file_wine_to_w32 "$1"
+ func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+ func_to_host_file_result="$func_cygpath_result"
+ fi
+ func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format. If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+# file name conversion function : func_convert_file_X_to_Y ()
+# path conversion function : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same. If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+ $opt_debug
+ if test -z "$to_host_path_cmd"; then
+ func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+ to_host_path_cmd="func_convert_path_${func_stripname_result}"
+ fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+ $opt_debug
+ func_init_to_host_path_cmd
+ $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+ func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper. Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from ARG. MSYS
+ # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+ # and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format. Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format. Requires a wine environment and
+# a working winepath. Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+ func_convert_path_check : ";" \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+ fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # See func_convert_path_msys_to_w32:
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+ func_to_host_path_result="$func_cygpath_result"
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set. Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+ $opt_debug
+ func_to_host_path_result="$1"
+ if test -n "$1"; then
+ # Remove leading and trailing path separator characters from
+ # ARG. msys behavior is inconsistent here, cygpath turns them
+ # into '.;' and ';.', and winepath ignores them completely.
+ func_stripname : : "$1"
+ func_to_host_path_tmp1=$func_stripname_result
+ func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+ func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+ func_to_host_path_result="$func_cygpath_result"
+ func_convert_path_check : : \
+ "$func_to_host_path_tmp1" "$func_to_host_path_result"
+ func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+ fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
# func_mode_compile arg...
func_mode_compile ()
{
@@ -1137,12 +1986,12 @@ func_mode_compile ()
;;
-pie | -fpie | -fPIE)
- pie_flag="$pie_flag $arg"
+ func_append pie_flag " $arg"
continue
;;
-shared | -static | -prefer-pic | -prefer-non-pic)
- later="$later $arg"
+ func_append later " $arg"
continue
;;
@@ -1163,15 +2012,14 @@ func_mode_compile ()
save_ifs="$IFS"; IFS=','
for arg in $args; do
IFS="$save_ifs"
- func_quote_for_eval "$arg"
- lastarg="$lastarg $func_quote_for_eval_result"
+ func_append_quoted lastarg "$arg"
done
IFS="$save_ifs"
func_stripname ' ' '' "$lastarg"
lastarg=$func_stripname_result
# Add the arguments to base_compile.
- base_compile="$base_compile $lastarg"
+ func_append base_compile " $lastarg"
continue
;;
@@ -1187,8 +2035,7 @@ func_mode_compile ()
esac # case $arg_mode
# Aesthetically quote the previous argument.
- func_quote_for_eval "$lastarg"
- base_compile="$base_compile $func_quote_for_eval_result"
+ func_append_quoted base_compile "$lastarg"
done # for arg
case $arg_mode in
@@ -1213,7 +2060,7 @@ func_mode_compile ()
*.[cCFSifmso] | \
*.ada | *.adb | *.ads | *.asm | \
*.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
- *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
func_xform "$libobj"
libobj=$func_xform_result
;;
@@ -1288,7 +2135,7 @@ func_mode_compile ()
# Calculate the filename of the output object if compiler does
# not support -o with -c
if test "$compiler_c_o" = no; then
- output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
lockfile="$output_obj.lock"
else
output_obj=
@@ -1319,17 +2166,16 @@ compiler."
$opt_dry_run || $RM $removelist
exit $EXIT_FAILURE
fi
- removelist="$removelist $output_obj"
+ func_append removelist " $output_obj"
$ECHO "$srcfile" > "$lockfile"
fi
$opt_dry_run || $RM $removelist
- removelist="$removelist $lockfile"
+ func_append removelist " $lockfile"
trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
- if test -n "$fix_srcfile_path"; then
- eval srcfile=\"$fix_srcfile_path\"
- fi
+ func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+ srcfile=$func_to_tool_file_result
func_quote_for_eval "$srcfile"
qsrcfile=$func_quote_for_eval_result
@@ -1349,7 +2195,7 @@ compiler."
if test -z "$output_obj"; then
# Place PIC objects in $objdir
- command="$command -o $lobj"
+ func_append command " -o $lobj"
fi
func_show_eval_locale "$command" \
@@ -1396,11 +2242,11 @@ compiler."
command="$base_compile $qsrcfile $pic_flag"
fi
if test "$compiler_c_o" = yes; then
- command="$command -o $obj"
+ func_append command " -o $obj"
fi
# Suppress compiler output if we already did a PIC compilation.
- command="$command$suppress_output"
+ func_append command "$suppress_output"
func_show_eval_locale "$command" \
'$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
@@ -1445,13 +2291,13 @@ compiler."
}
$opt_help || {
-test "$mode" = compile && func_mode_compile ${1+"$@"}
+ test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
}
func_mode_help ()
{
# We need to display help for each of the modes.
- case $mode in
+ case $opt_mode in
"")
# Generic help is extracted from the usage comments
# at the start of this file.
@@ -1482,10 +2328,11 @@ This mode accepts the following additional options:
-o OUTPUT-FILE set the output file name to OUTPUT-FILE
-no-suppress do not suppress compiler output for multiple passes
- -prefer-pic try to building PIC objects only
- -prefer-non-pic try to building non-PIC objects only
+ -prefer-pic try to build PIC objects only
+ -prefer-non-pic try to build non-PIC objects only
-shared do not build a \`.o' file suitable for static linking
-static only build a \`.o' file suitable for static linking
+ -Wc,FLAG pass FLAG directly to the compiler
COMPILE-COMMAND is a command to be used in creating a \`standard' object file
from the given SOURCEFILE.
@@ -1538,7 +2385,7 @@ either the \`install' or \`cp' program.
The following components of INSTALL-COMMAND are treated specially:
- -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation
+ -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation
The rest of the components are interpreted as arguments to that command (only
BSD-compatible install options are recognized)."
@@ -1558,6 +2405,8 @@ The following components of LINK-COMMAND are treated specially:
-all-static do not do any dynamic linking at all
-avoid-version do not add a version suffix if possible
+ -bindir BINDIR specify path to binaries directory (for systems where
+ libraries must be found in the PATH setting at runtime)
-dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
-dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
-export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
@@ -1586,6 +2435,11 @@ The following components of LINK-COMMAND are treated specially:
-version-info CURRENT[:REVISION[:AGE]]
specify library version info [each variable defaults to 0]
-weak LIBNAME declare that the target provides the LIBNAME interface
+ -Wc,FLAG
+ -Xcompiler FLAG pass linker-specific FLAG directly to the compiler
+ -Wl,FLAG
+ -Xlinker FLAG pass linker-specific FLAG directly to the linker
+ -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
All other options (arguments beginning with \`-') are ignored.
@@ -1619,18 +2473,44 @@ Otherwise, only FILE itself is deleted using RM."
;;
*)
- func_fatal_help "invalid operation mode \`$mode'"
+ func_fatal_help "invalid operation mode \`$opt_mode'"
;;
esac
- $ECHO
+ echo
$ECHO "Try \`$progname --help' for more information about other modes."
-
- exit $?
}
- # Now that we've collected a possible --mode arg, show help if necessary
- $opt_help && func_mode_help
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+ if test "$opt_help" = :; then
+ func_mode_help
+ else
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ func_mode_help
+ done
+ } | sed -n '1p; 2,$s/^Usage:/ or: /p'
+ {
+ func_help noexit
+ for opt_mode in compile link execute install finish uninstall clean; do
+ echo
+ func_mode_help
+ done
+ } |
+ sed '1d
+ /^When reporting/,/^Report/{
+ H
+ d
+ }
+ $x
+ /information about other modes/d
+ /more detailed .*MODE/d
+ s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+ fi
+ exit $?
+fi
# func_mode_execute arg...
@@ -1643,13 +2523,16 @@ func_mode_execute ()
func_fatal_help "you must specify a COMMAND"
# Handle -dlopen flags immediately.
- for file in $execute_dlfiles; do
+ for file in $opt_dlopen; do
test -f "$file" \
|| func_fatal_help "\`$file' is not a file"
dir=
case $file in
*.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
|| func_fatal_help "\`$lib' is not a valid libtool archive"
@@ -1671,7 +2554,7 @@ func_mode_execute ()
dir="$func_dirname_result"
if test -f "$dir/$objdir/$dlname"; then
- dir="$dir/$objdir"
+ func_append dir "/$objdir"
else
if test ! -f "$dir/$dlname"; then
func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
@@ -1712,7 +2595,7 @@ func_mode_execute ()
for file
do
case $file in
- -*) ;;
+ -* | *.la | *.lo ) ;;
*)
# Do a test to see if this is really a libtool program.
if func_ltwrapper_script_p "$file"; then
@@ -1728,8 +2611,7 @@ func_mode_execute ()
;;
esac
# Quote arguments (to preserve shell metacharacters).
- func_quote_for_eval "$file"
- args="$args $func_quote_for_eval_result"
+ func_append_quoted args "$file"
done
if test "X$opt_dry_run" = Xfalse; then
@@ -1754,29 +2636,66 @@ func_mode_execute ()
# Display what would be done.
if test -n "$shlibpath_var"; then
eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
- $ECHO "export $shlibpath_var"
+ echo "export $shlibpath_var"
fi
$ECHO "$cmd$args"
exit $EXIT_SUCCESS
fi
}
-test "$mode" = execute && func_mode_execute ${1+"$@"}
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
# func_mode_finish arg...
func_mode_finish ()
{
$opt_debug
- libdirs="$nonopt"
+ libs=
+ libdirs=
admincmds=
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- for dir
- do
- libdirs="$libdirs $dir"
- done
+ for opt in "$nonopt" ${1+"$@"}
+ do
+ if test -d "$opt"; then
+ func_append libdirs " $opt"
+
+ elif test -f "$opt"; then
+ if func_lalib_unsafe_p "$opt"; then
+ func_append libs " $opt"
+ else
+ func_warning "\`$opt' is not a valid libtool archive"
+ fi
+
+ else
+ func_fatal_error "invalid argument \`$opt'"
+ fi
+ done
+
+ if test -n "$libs"; then
+ if test -n "$lt_sysroot"; then
+ sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+ sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+ else
+ sysroot_cmd=
+ fi
+
+ # Remove sysroot references
+ if $opt_dry_run; then
+ for lib in $libs; do
+ echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+ done
+ else
+ tmpdir=`func_mktempdir`
+ for lib in $libs; do
+ sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+ > $tmpdir/tmp-la
+ mv -f $tmpdir/tmp-la $lib
+ done
+ ${RM}r "$tmpdir"
+ fi
+ fi
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
for libdir in $libdirs; do
if test -n "$finish_cmds"; then
# Do each command in the finish commands.
@@ -1786,7 +2705,7 @@ func_mode_finish ()
if test -n "$finish_eval"; then
# Do the single finish_eval.
eval cmds=\"$finish_eval\"
- $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+ $opt_dry_run || eval "$cmds" || func_append admincmds "
$cmds"
fi
done
@@ -1795,53 +2714,55 @@ func_mode_finish ()
# Exit here if they wanted silent mode.
$opt_silent && exit $EXIT_SUCCESS
- $ECHO "X----------------------------------------------------------------------" | $Xsed
- $ECHO "Libraries have been installed in:"
- for libdir in $libdirs; do
- $ECHO " $libdir"
- done
- $ECHO
- $ECHO "If you ever happen to want to link against installed libraries"
- $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
- $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
- $ECHO "flag during linking and do at least one of the following:"
- if test -n "$shlibpath_var"; then
- $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable"
- $ECHO " during execution"
- fi
- if test -n "$runpath_var"; then
- $ECHO " - add LIBDIR to the \`$runpath_var' environment variable"
- $ECHO " during linking"
- fi
- if test -n "$hardcode_libdir_flag_spec"; then
- libdir=LIBDIR
- eval flag=\"$hardcode_libdir_flag_spec\"
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ echo "----------------------------------------------------------------------"
+ echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $ECHO " $libdir"
+ done
+ echo
+ echo "If you ever happen to want to link against installed libraries"
+ echo "in a given directory, LIBDIR, you must either use libtool, and"
+ echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
- $ECHO " - use the \`$flag' linker flag"
- fi
- if test -n "$admincmds"; then
- $ECHO " - have your system administrator run these commands:$admincmds"
- fi
- if test -f /etc/ld.so.conf; then
- $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
- fi
- $ECHO
+ $ECHO " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $ECHO " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ echo
- $ECHO "See any operating system documentation about shared libraries for"
- case $host in
- solaris2.[6789]|solaris2.1[0-9])
- $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
- $ECHO "pages."
- ;;
- *)
- $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
- ;;
- esac
- $ECHO "X----------------------------------------------------------------------" | $Xsed
+ echo "See any operating system documentation about shared libraries for"
+ case $host in
+ solaris2.[6789]|solaris2.1[0-9])
+ echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+ echo "pages."
+ ;;
+ *)
+ echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ ;;
+ esac
+ echo "----------------------------------------------------------------------"
+ fi
exit $EXIT_SUCCESS
}
-test "$mode" = finish && func_mode_finish ${1+"$@"}
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
# func_mode_install arg...
@@ -1852,7 +2773,7 @@ func_mode_install ()
# install_prog (especially on Windows NT).
if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
# Allow the use of GNU shtool's install command.
- $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+ case $nonopt in *shtool*) :;; *) false;; esac; then
# Aesthetically quote it.
func_quote_for_eval "$nonopt"
install_prog="$func_quote_for_eval_result "
@@ -1866,7 +2787,12 @@ func_mode_install ()
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
func_quote_for_eval "$arg"
- install_prog="$install_prog$func_quote_for_eval_result"
+ func_append install_prog "$func_quote_for_eval_result"
+ install_shared_prog=$install_prog
+ case " $install_prog " in
+ *[\\\ /]cp\ *) install_cp=: ;;
+ *) install_cp=false ;;
+ esac
# We need to accept at least all the BSD install flags.
dest=
@@ -1876,10 +2802,12 @@ func_mode_install ()
install_type=
isdir=no
stripme=
+ no_mode=:
for arg
do
+ arg2=
if test -n "$dest"; then
- files="$files $dest"
+ func_append files " $dest"
dest=$arg
continue
fi
@@ -1887,10 +2815,9 @@ func_mode_install ()
case $arg in
-d) isdir=yes ;;
-f)
- case " $install_prog " in
- *[\\\ /]cp\ *) ;;
- *) prev=$arg ;;
- esac
+ if $install_cp; then :; else
+ prev=$arg
+ fi
;;
-g | -m | -o)
prev=$arg
@@ -1904,6 +2831,10 @@ func_mode_install ()
*)
# If the previous option needed an argument, then skip it.
if test -n "$prev"; then
+ if test "x$prev" = x-m && test -n "$install_override_mode"; then
+ arg2=$install_override_mode
+ no_mode=false
+ fi
prev=
else
dest=$arg
@@ -1914,7 +2845,11 @@ func_mode_install ()
# Aesthetically quote the argument.
func_quote_for_eval "$arg"
- install_prog="$install_prog $func_quote_for_eval_result"
+ func_append install_prog " $func_quote_for_eval_result"
+ if test -n "$arg2"; then
+ func_quote_for_eval "$arg2"
+ fi
+ func_append install_shared_prog " $func_quote_for_eval_result"
done
test -z "$install_prog" && \
@@ -1923,6 +2858,13 @@ func_mode_install ()
test -n "$prev" && \
func_fatal_help "the \`$prev' option requires an argument"
+ if test -n "$install_override_mode" && $no_mode; then
+ if $install_cp; then :; else
+ func_quote_for_eval "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_for_eval_result"
+ fi
+ fi
+
if test -z "$files"; then
if test -z "$dest"; then
func_fatal_help "no file or destination specified"
@@ -1977,10 +2919,13 @@ func_mode_install ()
case $file in
*.$libext)
# Do the static libraries later.
- staticlibs="$staticlibs $file"
+ func_append staticlibs " $file"
;;
*.la)
+ func_resolve_sysroot "$file"
+ file=$func_resolve_sysroot_result
+
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
|| func_fatal_help "\`$file' is not a valid libtool archive"
@@ -1994,23 +2939,23 @@ func_mode_install ()
if test "X$destdir" = "X$libdir"; then
case "$current_libdirs " in
*" $libdir "*) ;;
- *) current_libdirs="$current_libdirs $libdir" ;;
+ *) func_append current_libdirs " $libdir" ;;
esac
else
# Note the libdir as a future libdir.
case "$future_libdirs " in
*" $libdir "*) ;;
- *) future_libdirs="$future_libdirs $libdir" ;;
+ *) func_append future_libdirs " $libdir" ;;
esac
fi
func_dirname "$file" "/" ""
dir="$func_dirname_result"
- dir="$dir$objdir"
+ func_append dir "$objdir"
if test -n "$relink_command"; then
# Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+ inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
# Don't allow the user to place us outside of our expected
# location b/c this prevents finding dependent libraries that
@@ -2023,9 +2968,9 @@ func_mode_install ()
if test -n "$inst_prefix_dir"; then
# Stick the inst_prefix_dir data into the link command.
- relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
else
- relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
fi
func_warning "relinking \`$file'"
@@ -2043,7 +2988,7 @@ func_mode_install ()
test -n "$relink_command" && srcname="$realname"T
# Install the shared library and build the symlinks.
- func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+ func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
'exit $?'
tstripme="$stripme"
case $host_os in
@@ -2083,7 +3028,7 @@ func_mode_install ()
func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
# Maybe install the static library, too.
- test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ test -n "$old_library" && func_append staticlibs " $dir/$old_library"
;;
*.lo)
@@ -2183,7 +3128,7 @@ func_mode_install ()
if test -f "$lib"; then
func_source "$lib"
fi
- libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
if test -n "$libdir" && test ! -f "$libfile"; then
func_warning "\`$lib' has not been installed in \`$libdir'"
finalize=no
@@ -2202,7 +3147,7 @@ func_mode_install ()
file="$func_basename_result"
outputname="$tmpdir/$file"
# Replace the output file specification.
- relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+ relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
$opt_silent || {
func_quote_for_expand "$relink_command"
@@ -2221,7 +3166,7 @@ func_mode_install ()
}
else
# Install the binary that we compiled earlier.
- file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
fi
fi
@@ -2257,11 +3202,13 @@ func_mode_install ()
# Set up the ranlib parameters.
oldlib="$destdir/$name"
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
if test -n "$stripme" && test -n "$old_striplib"; then
- func_show_eval "$old_striplib $oldlib" 'exit $?'
+ func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
fi
# Do each command in the postinstall commands.
@@ -2280,7 +3227,7 @@ func_mode_install ()
fi
}
-test "$mode" = install && func_mode_install ${1+"$@"}
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
# func_generate_dlsyms outputname originator pic_p
@@ -2323,6 +3270,22 @@ func_generate_dlsyms ()
extern \"C\" {
#endif
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
/* External symbol declarations for the compiler. */\
"
@@ -2332,10 +3295,11 @@ extern \"C\" {
$opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
# Add our own program objects to the symbol list.
- progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
for progfile in $progfiles; do
- func_verbose "extracting global C symbols from \`$progfile'"
- $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+ func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+ func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+ $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
done
if test -n "$exclude_expsyms"; then
@@ -2371,7 +3335,7 @@ extern \"C\" {
eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
case $host in
- *cygwin | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
;;
@@ -2384,10 +3348,52 @@ extern \"C\" {
func_verbose "extracting global C symbols from \`$dlprefile'"
func_basename "$dlprefile"
name="$func_basename_result"
- $opt_dry_run || {
- eval '$ECHO ": $name " >> "$nlist"'
- eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
- }
+ case $host in
+ *cygwin* | *mingw* | *cegcc* )
+ # if an import library, we need to obtain dlname
+ if func_win32_import_lib_p "$dlprefile"; then
+ func_tr_sh "$dlprefile"
+ eval "curr_lafile=\$libfile_$func_tr_sh_result"
+ dlprefile_dlbasename=""
+ if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+ # Use subshell, to avoid clobbering current variable values
+ dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+ if test -n "$dlprefile_dlname" ; then
+ func_basename "$dlprefile_dlname"
+ dlprefile_dlbasename="$func_basename_result"
+ else
+ # no lafile. user explicitly requested -dlpreopen <import library>.
+ $sharedlib_from_linklib_cmd "$dlprefile"
+ dlprefile_dlbasename=$sharedlib_from_linklib_result
+ fi
+ fi
+ $opt_dry_run || {
+ if test -n "$dlprefile_dlbasename" ; then
+ eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+ else
+ func_warning "Could not compute DLL name from $name"
+ eval '$ECHO ": $name " >> "$nlist"'
+ fi
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ }
+ else # not an import lib
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ fi
+ ;;
+ *)
+ $opt_dry_run || {
+ eval '$ECHO ": $name " >> "$nlist"'
+ func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+ }
+ ;;
+ esac
done
$opt_dry_run || {
@@ -2415,36 +3421,19 @@ extern \"C\" {
if test -f "$nlist"S; then
eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
else
- $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
+ echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
fi
- $ECHO >> "$output_objdir/$my_dlsyms" "\
+ echo >> "$output_objdir/$my_dlsyms" "\
/* The mapping between symbol names and symbols. */
typedef struct {
const char *name;
void *address;
} lt_dlsymlist;
-"
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- $ECHO >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
- runtime relocations are performed -- see ld's documentation
- on pseudo-relocs. */"
- lt_dlsym_const= ;;
- *osf5*)
- echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
- lt_dlsym_const= ;;
- *)
- lt_dlsym_const=const ;;
- esac
-
- $ECHO >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
+extern LT_DLSYM_CONST lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
+LT_DLSYM_CONST lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[] =
{\
{ \"$my_originator\", (void *) 0 },"
@@ -2457,7 +3446,7 @@ lt_${my_prefix}_LTX_preloaded_symbols[] =
eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
;;
esac
- $ECHO >> "$output_objdir/$my_dlsyms" "\
+ echo >> "$output_objdir/$my_dlsyms" "\
{0, (void *) 0}
};
@@ -2484,7 +3473,7 @@ static const void *lt_preloaded_setup() {
# linked before any other PIC object. But we must not use
# pic_flag when linking with -static. The problem exists in
# FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
*-*-hpux*)
pic_flag_for_symtable=" $pic_flag" ;;
@@ -2500,7 +3489,7 @@ static const void *lt_preloaded_setup() {
for arg in $LTCFLAGS; do
case $arg in
-pie | -fpie | -fPIE) ;;
- *) symtab_cflags="$symtab_cflags $arg" ;;
+ *) func_append symtab_cflags " $arg" ;;
esac
done
@@ -2515,16 +3504,16 @@ static const void *lt_preloaded_setup() {
case $host in
*cygwin* | *mingw* | *cegcc* )
if test -f "$output_objdir/$my_outputname.def"; then
- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
else
- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
fi
;;
*)
- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+ compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
;;
esac
;;
@@ -2538,8 +3527,8 @@ static const void *lt_preloaded_setup() {
# really was required.
# Nullify the symbol file.
- compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
- finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+ finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
fi
}
@@ -2549,6 +3538,7 @@ static const void *lt_preloaded_setup() {
# Need a lot of goo to handle *both* DLLs and import libs
# Has to be a shell function in order to 'eat' the argument
# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
func_win32_libid ()
{
$opt_debug
@@ -2559,9 +3549,11 @@ func_win32_libid ()
win32_libid_type="x86 archive import"
;;
*ar\ archive*) # could be an import, or static
+ # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
- win32_nmres=`eval $NM -f posix -A $1 |
+ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
$SED -n -e '
1,100{
/ I /{
@@ -2590,6 +3582,131 @@ func_win32_libid ()
$ECHO "$win32_libid_type"
}
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+ $opt_debug
+ sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+ $opt_debug
+ match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+ $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+ $SED '/^Contents of section '"$match_literal"':/{
+ # Place marker at beginning of archive member dllname section
+ s/.*/====MARK====/
+ p
+ d
+ }
+ # These lines can sometimes be longer than 43 characters, but
+ # are always uninteresting
+ /:[ ]*file format pe[i]\{,1\}-/d
+ /^In archive [^:]*:/d
+ # Ensure marker is printed
+ /^====MARK====/p
+ # Remove all lines with less than 43 characters
+ /^.\{43\}/!d
+ # From remaining lines, remove first 43 characters
+ s/^.\{43\}//' |
+ $SED -n '
+ # Join marker and all lines until next marker into a single line
+ /^====MARK====/ b para
+ H
+ $ b para
+ b
+ :para
+ x
+ s/\n//g
+ # Remove the marker
+ s/^====MARK====//
+ # Remove trailing dots and whitespace
+ s/[\. \t]*$//
+ # Print
+ /./p' |
+ # we now have a list, one entry per line, of the stringified
+ # contents of the appropriate section of all members of the
+ # archive which possess that section. Heuristic: eliminate
+ # all those which have a first or second character that is
+ # a '.' (that is, objdump's representation of an unprintable
+ # character.) This should work for all archives with less than
+ # 0x302f exports -- but will fail for DLLs whose name actually
+ # begins with a literal '.' or a single character followed by
+ # a '.'.
+ #
+ # Of those that remain, print the first one.
+ $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+ $opt_debug
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+ test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+ $opt_debug
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+ test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+# $sharedlib_from_linklib_cmd
+# Result is available in the variable
+# $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+ $opt_debug
+ if func_cygming_gnu_implib_p "$1" ; then
+ # binutils import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+ elif func_cygming_ms_implib_p "$1" ; then
+ # ms-generated import library
+ sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+ else
+ # unknown
+ sharedlib_from_linklib_result=""
+ fi
+}
# func_extract_an_archive dir oldlib
@@ -2598,7 +3715,18 @@ func_extract_an_archive ()
$opt_debug
f_ex_an_ar_dir="$1"; shift
f_ex_an_ar_oldlib="$1"
- func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+ if test "$lock_old_archive_extraction" = yes; then
+ lockfile=$f_ex_an_ar_oldlib.lock
+ until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+ func_echo "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ fi
+ func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+ 'stat=$?; rm -f "$lockfile"; exit $stat'
+ if test "$lock_old_archive_extraction" = yes; then
+ $opt_dry_run || rm -f "$lockfile"
+ fi
if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
:
else
@@ -2669,7 +3797,7 @@ func_extract_archives ()
darwin_file=
darwin_files=
for darwin_file in $darwin_filelist; do
- darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+ darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
$LIPO -create -output "$darwin_file" $darwin_files
done # $darwin_filelist
$RM -rf unfat-$$
@@ -2684,25 +3812,30 @@ func_extract_archives ()
func_extract_an_archive "$my_xdir" "$my_xabs"
;;
esac
- my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
done
func_extract_archives_result="$my_oldobjs"
}
-
-# func_emit_wrapper_part1 [arg=no]
+# func_emit_wrapper [arg=no]
#
-# Emit the first part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part1 ()
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable. Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take. If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory. This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
{
- func_emit_wrapper_part1_arg1=no
- if test -n "$1" ; then
- func_emit_wrapper_part1_arg1=$1
- fi
+ func_emit_wrapper_arg1=${1-no}
$ECHO "\
#! $SHELL
@@ -2718,7 +3851,6 @@ func_emit_wrapper_part1 ()
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
sed_quote_subst='$sed_quote_subst'
# Be Bourne compatible
@@ -2749,31 +3881,135 @@ if test \"\$libtool_install_magic\" = \"$magic\"; then
else
# When we are sourced in execute mode, \$file and \$ECHO are already set.
if test \"\$libtool_execute_magic\" != \"$magic\"; then
- ECHO=\"$qecho\"
- file=\"\$0\"
- # Make sure echo works.
- if test \"X\$1\" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
- elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
- # Yippee, \$ECHO works!
- :
- else
- # Restart under the correct shell, and then maybe \$ECHO will work.
- exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
- fi
- fi\
+ file=\"\$0\""
+
+ qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+ $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+ ECHO=\"$qECHO\"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=\$0
+ shift
+ for lt_opt
+ do
+ case \"\$lt_opt\" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+ test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+ lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+ cat \"\$lt_dump_D/\$lt_dump_F\"
+ exit 0
+ ;;
+ --lt-*)
+ \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n \"\$lt_option_debug\"; then
+ echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+ lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
"
- $ECHO "\
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2* | *-cegcc*)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $ECHO "\
+ if test -n \"\$lt_option_debug\"; then
+ \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+ func_lt_dump_args \${1+\"\$@\"} 1>&2
+ fi
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $ECHO "\
+ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ case \" \$* \" in
+ *\\ --lt-*)
+ for lt_wr_arg
+ do
+ case \$lt_wr_arg in
+ --lt-*) ;;
+ *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+ esac
+ shift
+ done ;;
+ esac
+ func_exec_program_core \${1+\"\$@\"}
+}
+
+ # Parse options
+ func_parse_lt_options \"\$0\" \${1+\"\$@\"}
# Find the directory that this script lives in.
- thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
test \"x\$thisdir\" = \"x\$file\" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
- file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+ file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
while test -n \"\$file\"; do
- destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+ destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
# If there was a directory component, then change thisdir.
if test \"x\$destdir\" != \"x\$file\"; then
@@ -2783,30 +4019,13 @@ else
esac
fi
- file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
- file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
done
-"
-}
-# end: func_emit_wrapper_part1
-
-# func_emit_wrapper_part2 [arg=no]
-#
-# Emit the second part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part2 ()
-{
- func_emit_wrapper_part2_arg1=no
- if test -n "$1" ; then
- func_emit_wrapper_part2_arg1=$1
- fi
-
- $ECHO "\
# Usually 'no', except on cygwin/mingw when embedded into
# the cwrapper.
- WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
# special case for '.'
if test \"\$thisdir\" = \".\"; then
@@ -2814,7 +4033,7 @@ func_emit_wrapper_part2 ()
fi
# remove .libs from thisdir
case \"\$thisdir\" in
- *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+ *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
$objdir ) thisdir=. ;;
esac
fi
@@ -2869,6 +4088,18 @@ func_emit_wrapper_part2 ()
if test -f \"\$progdir/\$program\"; then"
+ # fixup the dll searchpath if we need to.
+ #
+ # Fix the DLL searchpath if we need to. Do this before prepending
+ # to shlibpath, because on Windows, both are PATH and uninstalled
+ # libraries must come first.
+ if test -n "$dllsearchpath"; then
+ $ECHO "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
# Export our shlibpath_var if we have one.
if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
$ECHO "\
@@ -2877,253 +4108,28 @@ func_emit_wrapper_part2 ()
# Some systems cannot cope with colon-terminated $shlibpath_var
# The second colon is a workaround for a bug in BeOS R4 sed
- $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+ $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
export $shlibpath_var
"
fi
- # fixup the dll searchpath if we need to.
- if test -n "$dllsearchpath"; then
- $ECHO "\
- # Add the dll search path components to the executable PATH
- PATH=$dllsearchpath:\$PATH
-"
- fi
-
$ECHO "\
if test \"\$libtool_execute_magic\" != \"$magic\"; then
# Run the actual program with our arguments.
-"
- case $host in
- # Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2* | *-cegcc*)
- $ECHO "\
- exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
- ;;
-
- *)
- $ECHO "\
- exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
- ;;
- esac
- $ECHO "\
- \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
- exit 1
+ func_exec_program \${1+\"\$@\"}
fi
else
# The program doesn't exist.
\$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
\$ECHO \"This script is just a wrapper for \$program.\" 1>&2
- $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+ \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
exit 1
fi
fi\
"
}
-# end: func_emit_wrapper_part2
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable. Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take. If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory. This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
- func_emit_wrapper_arg1=no
- if test -n "$1" ; then
- func_emit_wrapper_arg1=$1
- fi
-
- # split this up so that func_emit_cwrapperexe_src
- # can call each part independently.
- func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
- func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
-}
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-# $build $host
-# mingw (msys) mingw [e.g. native]
-# cygwin mingw
-# *nix + wine mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin. Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
- func_to_host_path_result="$1"
- if test -n "$1" ; then
- case $host in
- *mingw* )
- lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
- case $build in
- *mingw* ) # actually, msys
- # awkward: cmd appends spaces to result
- lt_sed_strip_trailing_spaces="s/[ ]*\$//"
- func_to_host_path_tmp1=`( cmd //c echo "$1" |\
- $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
- $SED -e "$lt_sed_naive_backslashify"`
- ;;
- *cygwin* )
- func_to_host_path_tmp1=`cygpath -w "$1"`
- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
- $SED -e "$lt_sed_naive_backslashify"`
- ;;
- * )
- # Unfortunately, winepath does not exit with a non-zero
- # error code, so we are forced to check the contents of
- # stdout. On the other hand, if the command is not
- # found, the shell will set an exit code of 127 and print
- # *an error message* to stdout. So we must check for both
- # error code of zero AND non-empty stdout, which explains
- # the odd construction:
- func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
- if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
- func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
- $SED -e "$lt_sed_naive_backslashify"`
- else
- # Allow warning below.
- func_to_host_path_result=""
- fi
- ;;
- esac
- if test -z "$func_to_host_path_result" ; then
- func_error "Could not determine host path corresponding to"
- func_error " '$1'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback:
- func_to_host_path_result="$1"
- fi
- ;;
- esac
- fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-# $build $host
-# mingw (msys) mingw [e.g. native]
-# cygwin mingw
-# *nix + wine mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
- func_to_host_pathlist_result="$1"
- if test -n "$1" ; then
- case $host in
- *mingw* )
- lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
- # Remove leading and trailing path separator characters from
- # ARG. msys behavior is inconsistent here, cygpath turns them
- # into '.;' and ';.', and winepath ignores them completely.
- func_to_host_pathlist_tmp2="$1"
- # Once set for this call, this variable should not be
- # reassigned. It is used in tha fallback case.
- func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
- $SED -e 's|^:*||' -e 's|:*$||'`
- case $build in
- *mingw* ) # Actually, msys.
- # Awkward: cmd appends spaces to result.
- lt_sed_strip_trailing_spaces="s/[ ]*\$//"
- func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
- $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
- $SED -e "$lt_sed_naive_backslashify"`
- ;;
- *cygwin* )
- func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
- $SED -e "$lt_sed_naive_backslashify"`
- ;;
- * )
- # unfortunately, winepath doesn't convert pathlists
- func_to_host_pathlist_result=""
- func_to_host_pathlist_oldIFS=$IFS
- IFS=:
- for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
- IFS=$func_to_host_pathlist_oldIFS
- if test -n "$func_to_host_pathlist_f" ; then
- func_to_host_path "$func_to_host_pathlist_f"
- if test -n "$func_to_host_path_result" ; then
- if test -z "$func_to_host_pathlist_result" ; then
- func_to_host_pathlist_result="$func_to_host_path_result"
- else
- func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
- fi
- fi
- fi
- IFS=:
- done
- IFS=$func_to_host_pathlist_oldIFS
- ;;
- esac
- if test -z "$func_to_host_pathlist_result" ; then
- func_error "Could not determine the host path(s) corresponding to"
- func_error " '$1'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback. This may break if $1 contains DOS-style drive
- # specifications. The fix is not to complicate the expression
- # below, but for the user to provide a working wine installation
- # with winepath so that path translation in the cross-to-mingw
- # case works properly.
- lt_replace_pathsep_nix_to_dos="s|:|;|g"
- func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
- $SED -e "$lt_replace_pathsep_nix_to_dos"`
- fi
- # Now, add the leading and trailing path separators back
- case "$1" in
- :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
- ;;
- esac
- case "$1" in
- *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
- ;;
- esac
- ;;
- esac
- fi
-}
-# end: func_to_host_pathlist
# func_emit_cwrapperexe_src
# emit the source code for a wrapper executable on stdout
@@ -3141,31 +4147,23 @@ func_emit_cwrapperexe_src ()
This wrapper executable should never be moved out of the build directory.
If it is, it will not operate correctly.
-
- Currently, it simply execs the wrapper *script* "$SHELL $output",
- but could eventually absorb all of the scripts functionality and
- exec $objdir/$outputname directly.
*/
EOF
cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
# include <direct.h>
# include <process.h>
# include <io.h>
-# define setmode _setmode
#else
# include <unistd.h>
# include <stdint.h>
# ifdef __CYGWIN__
# include <io.h>
-# define HAVE_SETENV
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
# endif
#endif
#include <malloc.h>
@@ -3177,6 +4175,44 @@ int setenv (const char *, const char *, int);
#include <fcntl.h>
#include <sys/stat.h>
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+# define _INTPTR_T_DEFINED
+# define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat _stat
+# define chmod _chmod
+# define getcwd _getcwd
+# define putenv _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
#if defined(PATH_MAX)
# define LT_PATHMAX PATH_MAX
#elif defined(MAXPATHLEN)
@@ -3192,14 +4228,7 @@ int setenv (const char *, const char *, int);
# define S_IXGRP 0
#endif
-#ifdef _MSC_VER
-# define S_IXUSR _S_IEXEC
-# define stat _stat
-# ifndef _INTPTR_T_DEFINED
-# define intptr_t int
-# endif
-#endif
-
+/* path handling portability macros */
#ifndef DIR_SEPARATOR
# define DIR_SEPARATOR '/'
# define PATH_SEPARATOR ':'
@@ -3230,10 +4259,6 @@ int setenv (const char *, const char *, int);
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
#endif /* PATH_SEPARATOR_2 */
-#ifdef __CYGWIN__
-# define FOPEN_WB "wb"
-#endif
-
#ifndef FOPEN_WB
# define FOPEN_WB "w"
#endif
@@ -3246,22 +4271,13 @@ int setenv (const char *, const char *, int);
if (stale) { free ((void *) stale); stale = 0; } \
} while (0)
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
- va_list args;
- va_start (args, fmt);
- (void) vfprintf (stderr, fmt, args);
- va_end (args);
-}
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
#else
-# define LTWRAPPER_DEBUGPRINTF(args)
+static int lt_debug = 0;
#endif
-const char *program_name = NULL;
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
void *xmalloc (size_t num);
char *xstrdup (const char *string);
@@ -3271,41 +4287,27 @@ char *chase_symlinks (const char *pathspec);
int make_executable (const char *path);
int check_executable (const char *path);
char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
void lt_setenv (const char *name, const char *value);
char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_opt_process_env_set (const char *arg);
-void lt_opt_process_env_prepend (const char *arg);
-void lt_opt_process_env_append (const char *arg);
-int lt_split_name_value (const char *arg, char** name, char** value);
void lt_update_exe_path (const char *name, const char *value);
void lt_update_lib_path (const char *name, const char *value);
-
-static const char *script_text_part1 =
-EOF
-
- func_emit_wrapper_part1 yes |
- $SED -e 's/\([\\"]\)/\\\1/g' \
- -e 's/^/ "/' -e 's/$/\\n"/'
- echo ";"
- cat <<EOF
-
-static const char *script_text_part2 =
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
EOF
- func_emit_wrapper_part2 yes |
- $SED -e 's/\([\\"]\)/\\\1/g' \
- -e 's/^/ "/' -e 's/$/\\n"/'
- echo ";"
cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
+volatile const char * MAGIC_EXE = "$magic_exe";
const char * LIB_PATH_VARNAME = "$shlibpath_var";
EOF
if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- func_to_host_pathlist "$temp_rpath"
+ func_to_host_path "$temp_rpath"
cat <<EOF
-const char * LIB_PATH_VALUE = "$func_to_host_pathlist_result";
+const char * LIB_PATH_VALUE = "$func_to_host_path_result";
EOF
else
cat <<"EOF"
@@ -3314,10 +4316,10 @@ EOF
fi
if test -n "$dllsearchpath"; then
- func_to_host_pathlist "$dllsearchpath:"
+ func_to_host_path "$dllsearchpath:"
cat <<EOF
const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE = "$func_to_host_pathlist_result";
+const char * EXE_PATH_VALUE = "$func_to_host_path_result";
EOF
else
cat <<"EOF"
@@ -3340,24 +4342,10 @@ EOF
cat <<"EOF"
#define LTWRAPPER_OPTION_PREFIX "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH 5
-static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH;
static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-static const size_t env_set_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
-static const char *env_set_opt = LTWRAPPER_OPTION_PREFIX "env-set";
- /* argument is putenv-style "foo=bar", value of foo is set to bar */
-
-static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
-static const char *env_prepend_opt = LTWRAPPER_OPTION_PREFIX "env-prepend";
- /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
-
-static const size_t env_append_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
-static const char *env_append_opt = LTWRAPPER_OPTION_PREFIX "env-append";
- /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug";
int
main (int argc, char *argv[])
@@ -3374,10 +4362,13 @@ main (int argc, char *argv[])
int i;
program_name = (char *) xstrdup (base_name (argv[0]));
- LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0]));
- LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+ newargz = XMALLOC (char *, argc + 1);
- /* very simple arg parsing; don't want to rely on getopt */
+ /* very simple arg parsing; don't want to rely on getopt
+ * also, copy all non cwrapper options to newargz, except
+ * argz[0], which is handled differently
+ */
+ newargc=0;
for (i = 1; i < argc; i++)
{
if (strcmp (argv[i], dumpscript_opt) == 0)
@@ -3391,25 +4382,57 @@ EOF
esac
cat <<"EOF"
- printf ("%s", script_text_part1);
- printf ("%s", script_text_part2);
+ lt_dump_script (stdout);
return 0;
}
+ if (strcmp (argv[i], debug_opt) == 0)
+ {
+ lt_debug = 1;
+ continue;
+ }
+ if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+ {
+ /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+ namespace, but it is not one of the ones we know about and
+ have already dealt with, above (inluding dump-script), then
+ report an error. Otherwise, targets might begin to believe
+ they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+ namespace. The first time any user complains about this, we'll
+ need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+ or a configure.ac-settable value.
+ */
+ lt_fatal (__FILE__, __LINE__,
+ "unrecognized %s option: '%s'",
+ ltwrapper_option_prefix, argv[i]);
+ }
+ /* otherwise ... */
+ newargz[++newargc] = xstrdup (argv[i]);
}
+ newargz[++newargc] = NULL;
+
+EOF
+ cat <<EOF
+ /* The GNU banner must be the first non-error debug message */
+ lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+ cat <<"EOF"
+ lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
- newargz = XMALLOC (char *, argc + 1);
tmp_pathspec = find_executable (argv[0]);
if (tmp_pathspec == NULL)
- lt_fatal ("Couldn't find %s", argv[0]);
- LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
- tmp_pathspec));
+ lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (before symlink chase) at: %s\n",
+ tmp_pathspec);
actual_cwrapper_path = chase_symlinks (tmp_pathspec);
- LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
- actual_cwrapper_path));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) found exe (after symlink chase) at: %s\n",
+ actual_cwrapper_path);
XFREE (tmp_pathspec);
- actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+ actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
strendzap (actual_cwrapper_path, actual_cwrapper_name);
/* wrapper name transforms */
@@ -3427,8 +4450,9 @@ EOF
target_name = tmp_pathspec;
tmp_pathspec = 0;
- LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
- target_name));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) libtool target name: %s\n",
+ target_name);
EOF
cat <<EOF
@@ -3478,80 +4502,19 @@ EOF
lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
lt_setenv ("DUALCASE", "1"); /* for MSK sh */
- lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+ /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must
+ be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+ because on Windows, both *_VARNAMEs are PATH but uninstalled
+ libraries must come first. */
lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+ lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
- newargc=0;
- for (i = 1; i < argc; i++)
- {
- if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
- {
- if (argv[i][env_set_opt_len] == '=')
- {
- const char *p = argv[i] + env_set_opt_len + 1;
- lt_opt_process_env_set (p);
- }
- else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
- {
- lt_opt_process_env_set (argv[++i]); /* don't copy */
- }
- else
- lt_fatal ("%s missing required argument", env_set_opt);
- continue;
- }
- if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
- {
- if (argv[i][env_prepend_opt_len] == '=')
- {
- const char *p = argv[i] + env_prepend_opt_len + 1;
- lt_opt_process_env_prepend (p);
- }
- else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
- {
- lt_opt_process_env_prepend (argv[++i]); /* don't copy */
- }
- else
- lt_fatal ("%s missing required argument", env_prepend_opt);
- continue;
- }
- if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
- {
- if (argv[i][env_append_opt_len] == '=')
- {
- const char *p = argv[i] + env_append_opt_len + 1;
- lt_opt_process_env_append (p);
- }
- else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
- {
- lt_opt_process_env_append (argv[++i]); /* don't copy */
- }
- else
- lt_fatal ("%s missing required argument", env_append_opt);
- continue;
- }
- if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
- {
- /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
- namespace, but it is not one of the ones we know about and
- have already dealt with, above (inluding dump-script), then
- report an error. Otherwise, targets might begin to believe
- they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
- namespace. The first time any user complains about this, we'll
- need to make LTWRAPPER_OPTION_PREFIX a configure-time option
- or a configure.ac-settable value.
- */
- lt_fatal ("Unrecognized option in %s namespace: '%s'",
- ltwrapper_option_prefix, argv[i]);
- }
- /* otherwise ... */
- newargz[++newargc] = xstrdup (argv[i]);
- }
- newargz[++newargc] = NULL;
-
- LTWRAPPER_DEBUGPRINTF (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+ lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+ nonnull (lt_argv_zero));
for (i = 0; i < newargc; i++)
{
- LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+ lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+ i, nonnull (newargz[i]));
}
EOF
@@ -3560,11 +4523,14 @@ EOF
mingw*)
cat <<"EOF"
/* execv doesn't actually work on mingw as expected on unix */
+ newargz = prepare_spawn (newargz);
rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
if (rval == -1)
{
/* failed to start process */
- LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(main) failed to launch target \"%s\": %s\n",
+ lt_argv_zero, nonnull (strerror (errno)));
return 127;
}
return rval;
@@ -3586,7 +4552,7 @@ xmalloc (size_t num)
{
void *p = (void *) malloc (num);
if (!p)
- lt_fatal ("Memory exhausted");
+ lt_fatal (__FILE__, __LINE__, "memory exhausted");
return p;
}
@@ -3620,8 +4586,8 @@ check_executable (const char *path)
{
struct stat st;
- LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n",
- path ? (*path ? path : "EMPTY!") : "NULL!"));
+ lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+ nonempty (path));
if ((!path) || (!*path))
return 0;
@@ -3638,8 +4604,8 @@ make_executable (const char *path)
int rval = 0;
struct stat st;
- LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n",
- path ? (*path ? path : "EMPTY!") : "NULL!"));
+ lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+ nonempty (path));
if ((!path) || (!*path))
return 0;
@@ -3665,8 +4631,8 @@ find_executable (const char *wrapper)
int tmp_len;
char *concat_name;
- LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n",
- wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+ lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+ nonempty (wrapper));
if ((wrapper == NULL) || (*wrapper == '\0'))
return NULL;
@@ -3719,7 +4685,8 @@ find_executable (const char *wrapper)
{
/* empty path: current directory */
if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal ("getcwd failed");
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
tmp_len = strlen (tmp);
concat_name =
XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
@@ -3744,7 +4711,8 @@ find_executable (const char *wrapper)
}
/* Relative path | not found in path: prepend cwd */
if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal ("getcwd failed");
+ lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+ nonnull (strerror (errno)));
tmp_len = strlen (tmp);
concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
memcpy (concat_name, tmp, tmp_len);
@@ -3770,8 +4738,9 @@ chase_symlinks (const char *pathspec)
int has_symlinks = 0;
while (strlen (tmp_pathspec) && !has_symlinks)
{
- LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
- tmp_pathspec));
+ lt_debugprintf (__FILE__, __LINE__,
+ "checking path component for symlinks: %s\n",
+ tmp_pathspec);
if (lstat (tmp_pathspec, &s) == 0)
{
if (S_ISLNK (s.st_mode) != 0)
@@ -3793,8 +4762,9 @@ chase_symlinks (const char *pathspec)
}
else
{
- char *errstr = strerror (errno);
- lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+ lt_fatal (__FILE__, __LINE__,
+ "error accessing file \"%s\": %s",
+ tmp_pathspec, nonnull (strerror (errno)));
}
}
XFREE (tmp_pathspec);
@@ -3807,7 +4777,8 @@ chase_symlinks (const char *pathspec)
tmp_pathspec = realpath (pathspec, buf);
if (tmp_pathspec == 0)
{
- lt_fatal ("Could not follow symlinks for %s", pathspec);
+ lt_fatal (__FILE__, __LINE__,
+ "could not follow symlinks for %s", pathspec);
}
return xstrdup (tmp_pathspec);
#endif
@@ -3833,11 +4804,25 @@ strendzap (char *str, const char *pat)
return str;
}
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+ va_list args;
+ if (lt_debug)
+ {
+ (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+ va_start (args, fmt);
+ (void) vfprintf (stderr, fmt, args);
+ va_end (args);
+ }
+}
+
static void
-lt_error_core (int exit_status, const char *mode,
+lt_error_core (int exit_status, const char *file,
+ int line, const char *mode,
const char *message, va_list ap)
{
- fprintf (stderr, "%s: %s: ", program_name, mode);
+ fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
vfprintf (stderr, message, ap);
fprintf (stderr, ".\n");
@@ -3846,20 +4831,32 @@ lt_error_core (int exit_status, const char *mode,
}
void
-lt_fatal (const char *message, ...)
+lt_fatal (const char *file, int line, const char *message, ...)
{
va_list ap;
va_start (ap, message);
- lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
va_end (ap);
}
+static const char *
+nonnull (const char *s)
+{
+ return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+ return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
void
lt_setenv (const char *name, const char *value)
{
- LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
- (name ? name : "<NULL>"),
- (value ? value : "<NULL>")));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_setenv) setting '%s' to '%s'\n",
+ nonnull (name), nonnull (value));
{
#ifdef HAVE_SETENV
/* always make a copy, for consistency with !HAVE_SETENV */
@@ -3904,95 +4901,12 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
return new_value;
}
-int
-lt_split_name_value (const char *arg, char** name, char** value)
-{
- const char *p;
- int len;
- if (!arg || !*arg)
- return 1;
-
- p = strchr (arg, (int)'=');
-
- if (!p)
- return 1;
-
- *value = xstrdup (++p);
-
- len = strlen (arg) - strlen (*value);
- *name = XMALLOC (char, len);
- strncpy (*name, arg, len-1);
- (*name)[len - 1] = '\0';
-
- return 0;
-}
-
-void
-lt_opt_process_env_set (const char *arg)
-{
- char *name = NULL;
- char *value = NULL;
-
- if (lt_split_name_value (arg, &name, &value) != 0)
- {
- XFREE (name);
- XFREE (value);
- lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
- }
-
- lt_setenv (name, value);
- XFREE (name);
- XFREE (value);
-}
-
-void
-lt_opt_process_env_prepend (const char *arg)
-{
- char *name = NULL;
- char *value = NULL;
- char *new_value = NULL;
-
- if (lt_split_name_value (arg, &name, &value) != 0)
- {
- XFREE (name);
- XFREE (value);
- lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
- }
-
- new_value = lt_extend_str (getenv (name), value, 0);
- lt_setenv (name, new_value);
- XFREE (new_value);
- XFREE (name);
- XFREE (value);
-}
-
-void
-lt_opt_process_env_append (const char *arg)
-{
- char *name = NULL;
- char *value = NULL;
- char *new_value = NULL;
-
- if (lt_split_name_value (arg, &name, &value) != 0)
- {
- XFREE (name);
- XFREE (value);
- lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
- }
-
- new_value = lt_extend_str (getenv (name), value, 1);
- lt_setenv (name, new_value);
- XFREE (new_value);
- XFREE (name);
- XFREE (value);
-}
-
void
lt_update_exe_path (const char *name, const char *value)
{
- LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
- (name ? name : "<NULL>"),
- (value ? value : "<NULL>")));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
if (name && *name && value && *value)
{
@@ -4011,9 +4925,9 @@ lt_update_exe_path (const char *name, const char *value)
void
lt_update_lib_path (const char *name, const char *value)
{
- LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
- (name ? name : "<NULL>"),
- (value ? value : "<NULL>")));
+ lt_debugprintf (__FILE__, __LINE__,
+ "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+ nonnull (name), nonnull (value));
if (name && *name && value && *value)
{
@@ -4023,11 +4937,158 @@ lt_update_lib_path (const char *name, const char *value)
}
}
+EOF
+ case $host_os in
+ mingw*)
+ cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Win32 CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+ size_t argc;
+ char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = XMALLOC (char *, argc + 1);
+
+ /* Put quoted arguments into the new argument vector. */
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ if (string[0] == '\0')
+ new_argv[i] = xstrdup ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+ char *quoted_string;
+ char *p;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ quoted_string = XMALLOC (char, length + 1);
+
+ p = quoted_string;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p = '\0';
+
+ new_argv[i] = quoted_string;
+ }
+ else
+ new_argv[i] = (char *) string;
+ }
+ new_argv[argc] = NULL;
+
+ return new_argv;
+}
+EOF
+ ;;
+ esac
+ cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+ func_emit_wrapper yes |
+ $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/ fputs ("\1", f);/p
+g
+D'
+ cat <<"EOF"
+}
EOF
}
# end: func_emit_cwrapperexe_src
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+ $opt_debug
+ case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+ *import*) : ;;
+ *) false ;;
+ esac
+}
+
# func_mode_link arg...
func_mode_link ()
{
@@ -4072,6 +5133,7 @@ func_mode_link ()
new_inherited_linker_flags=
avoid_version=no
+ bindir=
dlfiles=
dlprefiles=
dlself=no
@@ -4164,6 +5226,11 @@ func_mode_link ()
esac
case $prev in
+ bindir)
+ bindir="$arg"
+ prev=
+ continue
+ ;;
dlfiles|dlprefiles)
if test "$preload" = no; then
# Add the symbol object into the linking commands.
@@ -4195,9 +5262,9 @@ func_mode_link ()
;;
*)
if test "$prev" = dlfiles; then
- dlfiles="$dlfiles $arg"
+ func_append dlfiles " $arg"
else
- dlprefiles="$dlprefiles $arg"
+ func_append dlprefiles " $arg"
fi
prev=
continue
@@ -4221,7 +5288,7 @@ func_mode_link ()
*-*-darwin*)
case "$deplibs " in
*" $qarg.ltframework "*) ;;
- *) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+ *) func_append deplibs " $qarg.ltframework" # this is fixed later
;;
esac
;;
@@ -4240,7 +5307,7 @@ func_mode_link ()
moreargs=
for fil in `cat "$save_arg"`
do
-# moreargs="$moreargs $fil"
+# func_append moreargs " $fil"
arg=$fil
# A libtool-controlled object.
@@ -4269,7 +5336,7 @@ func_mode_link ()
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- dlfiles="$dlfiles $pic_object"
+ func_append dlfiles " $pic_object"
prev=
continue
else
@@ -4281,7 +5348,7 @@ func_mode_link ()
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
- dlprefiles="$dlprefiles $pic_object"
+ func_append dlprefiles " $pic_object"
prev=
fi
@@ -4351,12 +5418,12 @@ func_mode_link ()
if test "$prev" = rpath; then
case "$rpath " in
*" $arg "*) ;;
- *) rpath="$rpath $arg" ;;
+ *) func_append rpath " $arg" ;;
esac
else
case "$xrpath " in
*" $arg "*) ;;
- *) xrpath="$xrpath $arg" ;;
+ *) func_append xrpath " $arg" ;;
esac
fi
prev=
@@ -4368,28 +5435,28 @@ func_mode_link ()
continue
;;
weak)
- weak_libs="$weak_libs $arg"
+ func_append weak_libs " $arg"
prev=
continue
;;
xcclinker)
- linker_flags="$linker_flags $qarg"
- compiler_flags="$compiler_flags $qarg"
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $qarg"
prev=
func_append compile_command " $qarg"
func_append finalize_command " $qarg"
continue
;;
xcompiler)
- compiler_flags="$compiler_flags $qarg"
+ func_append compiler_flags " $qarg"
prev=
func_append compile_command " $qarg"
func_append finalize_command " $qarg"
continue
;;
xlinker)
- linker_flags="$linker_flags $qarg"
- compiler_flags="$compiler_flags $wl$qarg"
+ func_append linker_flags " $qarg"
+ func_append compiler_flags " $wl$qarg"
prev=
func_append compile_command " $wl$qarg"
func_append finalize_command " $wl$qarg"
@@ -4425,6 +5492,11 @@ func_mode_link ()
continue
;;
+ -bindir)
+ prev=bindir
+ continue
+ ;;
+
-dlopen)
prev=dlfiles
continue
@@ -4475,15 +5547,16 @@ func_mode_link ()
;;
-L*)
- func_stripname '-L' '' "$arg"
- dir=$func_stripname_result
- if test -z "$dir"; then
+ func_stripname "-L" '' "$arg"
+ if test -z "$func_stripname_result"; then
if test "$#" -gt 0; then
func_fatal_error "require no space between \`-L' and \`$1'"
else
func_fatal_error "need path for \`-L' option"
fi
fi
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -4495,24 +5568,30 @@ func_mode_link ()
;;
esac
case "$deplibs " in
- *" -L$dir "*) ;;
+ *" -L$dir "* | *" $arg "*)
+ # Will only happen for absolute or sysroot arguments
+ ;;
*)
- deplibs="$deplibs -L$dir"
- lib_search_path="$lib_search_path $dir"
+ # Preserve sysroot, but never include relative directories
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+ *) func_append deplibs " -L$dir" ;;
+ esac
+ func_append lib_search_path " $dir"
;;
esac
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$dir:"*) ;;
::) dllsearchpath=$dir;;
- *) dllsearchpath="$dllsearchpath:$dir";;
+ *) func_append dllsearchpath ":$dir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
::) dllsearchpath=$testbindir;;
- *) dllsearchpath="$dllsearchpath:$testbindir";;
+ *) func_append dllsearchpath ":$testbindir";;
esac
;;
esac
@@ -4522,7 +5601,7 @@ func_mode_link ()
-l*)
if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
# These systems don't actually have a C or math library (as such)
continue
;;
@@ -4536,7 +5615,7 @@ func_mode_link ()
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C and math libraries are in the System framework
- deplibs="$deplibs System.ltframework"
+ func_append deplibs " System.ltframework"
continue
;;
*-*-sco3.2v5* | *-*-sco5v6*)
@@ -4556,7 +5635,7 @@ func_mode_link ()
;;
esac
fi
- deplibs="$deplibs $arg"
+ func_append deplibs " $arg"
continue
;;
@@ -4568,21 +5647,22 @@ func_mode_link ()
# Tru64 UNIX uses -model [arg] to determine the layout of C++
# classes, name mangling, and exception handling.
# Darwin uses the -arch flag to determine output architecture.
- -model|-arch|-isysroot)
- compiler_flags="$compiler_flags $arg"
+ -model|-arch|-isysroot|--sysroot)
+ func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
prev=xcompiler
continue
;;
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
- compiler_flags="$compiler_flags $arg"
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
case "$new_inherited_linker_flags " in
*" $arg "*) ;;
- * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
esac
continue
;;
@@ -4649,13 +5729,17 @@ func_mode_link ()
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
+ =*)
+ func_stripname '=' '' "$dir"
+ dir=$lt_sysroot$func_stripname_result
+ ;;
*)
func_fatal_error "only absolute run-paths are allowed"
;;
esac
case "$xrpath " in
*" $dir "*) ;;
- *) xrpath="$xrpath $dir" ;;
+ *) func_append xrpath " $dir" ;;
esac
continue
;;
@@ -4708,8 +5792,8 @@ func_mode_link ()
for flag in $args; do
IFS="$save_ifs"
func_quote_for_eval "$flag"
- arg="$arg $wl$func_quote_for_eval_result"
- compiler_flags="$compiler_flags $func_quote_for_eval_result"
+ func_append arg " $func_quote_for_eval_result"
+ func_append compiler_flags " $func_quote_for_eval_result"
done
IFS="$save_ifs"
func_stripname ' ' '' "$arg"
@@ -4724,9 +5808,9 @@ func_mode_link ()
for flag in $args; do
IFS="$save_ifs"
func_quote_for_eval "$flag"
- arg="$arg $wl$func_quote_for_eval_result"
- compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
- linker_flags="$linker_flags $func_quote_for_eval_result"
+ func_append arg " $wl$func_quote_for_eval_result"
+ func_append compiler_flags " $wl$func_quote_for_eval_result"
+ func_append linker_flags " $func_quote_for_eval_result"
done
IFS="$save_ifs"
func_stripname ' ' '' "$arg"
@@ -4754,23 +5838,27 @@ func_mode_link ()
arg="$func_quote_for_eval_result"
;;
- # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
- # -r[0-9][0-9]* specifies the processor on the SGI compiler
- # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
- # +DA*, +DD* enable 64-bit mode on the HP compiler
- # -q* pass through compiler args for the IBM compiler
- # -m*, -t[45]*, -txscale* pass through architecture-specific
- # compiler args for GCC
- # -F/path gives path to uninstalled frameworks, gcc on darwin
- # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
- # @file GCC response files
+ # Flags to be passed through unchanged, with rationale:
+ # -64, -mips[0-9] enable 64-bit mode for the SGI compiler
+ # -r[0-9][0-9]* specify processor for the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+ # +DA*, +DD* enable 64-bit mode for the HP compiler
+ # -q* compiler args for the IBM compiler
+ # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+ # -F/path path to uninstalled frameworks, gcc on darwin
+ # -p, -pg, --coverage, -fprofile-* profiling flags for GCC
+ # @file GCC response files
+ # -tp=* Portland pgcc target processor selection
+ # --sysroot=* for sysroot support
+ # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+ -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
func_quote_for_eval "$arg"
arg="$func_quote_for_eval_result"
func_append compile_command " $arg"
func_append finalize_command " $arg"
- compiler_flags="$compiler_flags $arg"
+ func_append compiler_flags " $arg"
continue
;;
@@ -4782,7 +5870,7 @@ func_mode_link ()
*.$objext)
# A standard object.
- objs="$objs $arg"
+ func_append objs " $arg"
;;
*.lo)
@@ -4813,7 +5901,7 @@ func_mode_link ()
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- dlfiles="$dlfiles $pic_object"
+ func_append dlfiles " $pic_object"
prev=
continue
else
@@ -4825,7 +5913,7 @@ func_mode_link ()
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
- dlprefiles="$dlprefiles $pic_object"
+ func_append dlprefiles " $pic_object"
prev=
fi
@@ -4870,24 +5958,25 @@ func_mode_link ()
*.$libext)
# An archive.
- deplibs="$deplibs $arg"
- old_deplibs="$old_deplibs $arg"
+ func_append deplibs " $arg"
+ func_append old_deplibs " $arg"
continue
;;
*.la)
# A libtool-controlled library.
+ func_resolve_sysroot "$arg"
if test "$prev" = dlfiles; then
# This library was specified with -dlopen.
- dlfiles="$dlfiles $arg"
+ func_append dlfiles " $func_resolve_sysroot_result"
prev=
elif test "$prev" = dlprefiles; then
# The library was specified with -dlpreopen.
- dlprefiles="$dlprefiles $arg"
+ func_append dlprefiles " $func_resolve_sysroot_result"
prev=
else
- deplibs="$deplibs $arg"
+ func_append deplibs " $func_resolve_sysroot_result"
fi
continue
;;
@@ -4925,7 +6014,7 @@ func_mode_link ()
if test -n "$shlibpath_var"; then
# get the directories listed in $shlibpath_var
- eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
else
shlib_search_path=
fi
@@ -4934,6 +6023,8 @@ func_mode_link ()
func_dirname "$output" "/" ""
output_objdir="$func_dirname_result$objdir"
+ func_to_tool_file "$output_objdir/"
+ tool_output_objdir=$func_to_tool_file_result
# Create the object directory.
func_mkdir_p "$output_objdir"
@@ -4954,12 +6045,12 @@ func_mode_link ()
# Find all interdependent deplibs by searching for libraries
# that are linked more than once (e.g. -la -lb -la)
for deplib in $deplibs; do
- if $opt_duplicate_deps ; then
+ if $opt_preserve_dup_deps ; then
case "$libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
esac
fi
- libs="$libs $deplib"
+ func_append libs " $deplib"
done
if test "$linkmode" = lib; then
@@ -4972,9 +6063,9 @@ func_mode_link ()
if $opt_duplicate_compiler_generated_deps; then
for pre_post_dep in $predeps $postdeps; do
case "$pre_post_deps " in
- *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
esac
- pre_post_deps="$pre_post_deps $pre_post_dep"
+ func_append pre_post_deps " $pre_post_dep"
done
fi
pre_post_deps=
@@ -5033,7 +6124,10 @@ func_mode_link ()
case $pass in
dlopen) libs="$dlfiles" ;;
dlpreopen) libs="$dlprefiles" ;;
- link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ link)
+ libs="$deplibs %DEPLIBS%"
+ test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+ ;;
esac
fi
if test "$linkmode,$pass" = "lib,dlpreopen"; then
@@ -5041,17 +6135,19 @@ func_mode_link ()
for lib in $dlprefiles; do
# Ignore non-libtool-libs
dependency_libs=
+ func_resolve_sysroot "$lib"
case $lib in
- *.la) func_source "$lib" ;;
+ *.la) func_source "$func_resolve_sysroot_result" ;;
esac
# Collect preopened libtool deplibs, except any this library
# has declared as weak libs
for deplib in $dependency_libs; do
- deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+ func_basename "$deplib"
+ deplib_base=$func_basename_result
case " $weak_libs " in
*" $deplib_base "*) ;;
- *) deplibs="$deplibs $deplib" ;;
+ *) func_append deplibs " $deplib" ;;
esac
done
done
@@ -5067,16 +6163,17 @@ func_mode_link ()
lib=
found=no
case $deplib in
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
- compiler_flags="$compiler_flags $deplib"
+ func_append compiler_flags " $deplib"
if test "$linkmode" = lib ; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
- * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
esac
fi
fi
@@ -5161,7 +6258,7 @@ func_mode_link ()
if test "$linkmode" = lib ; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
- * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+ * ) func_append new_inherited_linker_flags " $deplib" ;;
esac
fi
fi
@@ -5174,7 +6271,8 @@ func_mode_link ()
test "$pass" = conv && continue
newdependency_libs="$deplib $newdependency_libs"
func_stripname '-L' '' "$deplib"
- newlib_search_path="$newlib_search_path $func_stripname_result"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
;;
prog)
if test "$pass" = conv; then
@@ -5188,7 +6286,8 @@ func_mode_link ()
finalize_deplibs="$deplib $finalize_deplibs"
fi
func_stripname '-L' '' "$deplib"
- newlib_search_path="$newlib_search_path $func_stripname_result"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
;;
*)
func_warning "\`-L' is ignored for archives/objects"
@@ -5199,17 +6298,21 @@ func_mode_link ()
-R*)
if test "$pass" = link; then
func_stripname '-R' '' "$deplib"
- dir=$func_stripname_result
+ func_resolve_sysroot "$func_stripname_result"
+ dir=$func_resolve_sysroot_result
# Make sure the xrpath contains only unique directories.
case "$xrpath " in
*" $dir "*) ;;
- *) xrpath="$xrpath $dir" ;;
+ *) func_append xrpath " $dir" ;;
esac
fi
deplibs="$deplib $deplibs"
continue
;;
- *.la) lib="$deplib" ;;
+ *.la)
+ func_resolve_sysroot "$deplib"
+ lib=$func_resolve_sysroot_result
+ ;;
*.$libext)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
@@ -5227,7 +6330,7 @@ func_mode_link ()
match_pattern*)
set dummy $deplibs_check_method; shift
match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+ if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
| $EGREP "$match_pattern_regex" > /dev/null; then
valid_a_lib=yes
fi
@@ -5237,15 +6340,15 @@ func_mode_link ()
;;
esac
if test "$valid_a_lib" != yes; then
- $ECHO
+ echo
$ECHO "*** Warning: Trying to link with static lib archive $deplib."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which you do not appear to have"
- $ECHO "*** because the file extensions .$libext of this argument makes me believe"
- $ECHO "*** that it is just a static archive that I should not use here."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because the file extensions .$libext of this argument makes me believe"
+ echo "*** that it is just a static archive that I should not use here."
else
- $ECHO
+ echo
$ECHO "*** Warning: Linking the shared library $output against the"
$ECHO "*** static library $deplib is not portable!"
deplibs="$deplib $deplibs"
@@ -5272,11 +6375,11 @@ func_mode_link ()
if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
# If there is no dlopen support or we're linking statically,
# we need to preload.
- newdlprefiles="$newdlprefiles $deplib"
+ func_append newdlprefiles " $deplib"
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
- newdlfiles="$newdlfiles $deplib"
+ func_append newdlfiles " $deplib"
fi
fi
continue
@@ -5318,20 +6421,20 @@ func_mode_link ()
# Convert "-framework foo" to "foo.ltframework"
if test -n "$inherited_linker_flags"; then
- tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+ tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
case " $new_inherited_linker_flags " in
*" $tmp_inherited_linker_flag "*) ;;
- *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+ *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
esac
done
fi
- dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan" ||
{ test "$linkmode" != prog && test "$linkmode" != lib; }; then
- test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
- test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ test -n "$dlopen" && func_append dlfiles " $dlopen"
+ test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
fi
if test "$pass" = conv; then
@@ -5342,30 +6445,36 @@ func_mode_link ()
func_fatal_error "cannot find name of link library for \`$lib'"
fi
# It is a libtool convenience library, so add in its objects.
- convenience="$convenience $ladir/$objdir/$old_library"
- old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ func_append convenience " $ladir/$objdir/$old_library"
+ func_append old_convenience " $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if $opt_preserve_dup_deps ; then
+ case "$tmp_libs " in
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+ esac
+ fi
+ func_append tmp_libs " $deplib"
+ done
elif test "$linkmode" != prog && test "$linkmode" != lib; then
func_fatal_error "\`$lib' is not a convenience library"
fi
- tmp_libs=
- for deplib in $dependency_libs; do
- deplibs="$deplib $deplibs"
- if $opt_duplicate_deps ; then
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
- fi
- tmp_libs="$tmp_libs $deplib"
- done
continue
fi # $pass = conv
# Get the name of the library we link against.
linklib=
- for l in $old_library $library_names; do
- linklib="$l"
- done
+ if test -n "$old_library" &&
+ { test "$prefer_static_libs" = yes ||
+ test "$prefer_static_libs,$installed" = "built,no"; }; then
+ linklib=$old_library
+ else
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ fi
if test -z "$linklib"; then
func_fatal_error "cannot find name of link library for \`$lib'"
fi
@@ -5382,9 +6491,9 @@ func_mode_link ()
# statically, we need to preload. We also need to preload any
# dependent libraries so libltdl's deplib preloader doesn't
# bomb out in the load deplibs phase.
- dlprefiles="$dlprefiles $lib $dependency_libs"
+ func_append dlprefiles " $lib $dependency_libs"
else
- newdlfiles="$newdlfiles $lib"
+ func_append newdlfiles " $lib"
fi
continue
fi # $pass = dlopen
@@ -5406,14 +6515,14 @@ func_mode_link ()
# Find the relevant object directory and library name.
if test "X$installed" = Xyes; then
- if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
func_warning "library \`$lib' was moved."
dir="$ladir"
absdir="$abs_ladir"
libdir="$abs_ladir"
else
- dir="$libdir"
- absdir="$libdir"
+ dir="$lt_sysroot$libdir"
+ absdir="$lt_sysroot$libdir"
fi
test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
else
@@ -5421,12 +6530,12 @@ func_mode_link ()
dir="$ladir"
absdir="$abs_ladir"
# Remove this search path later
- notinst_path="$notinst_path $abs_ladir"
+ func_append notinst_path " $abs_ladir"
else
dir="$ladir/$objdir"
absdir="$abs_ladir/$objdir"
# Remove this search path later
- notinst_path="$notinst_path $abs_ladir"
+ func_append notinst_path " $abs_ladir"
fi
fi # $installed = yes
func_stripname 'lib' '.la' "$laname"
@@ -5437,20 +6546,46 @@ func_mode_link ()
if test -z "$libdir" && test "$linkmode" = prog; then
func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
fi
- # Prefer using a static library (so that no silly _DYNAMIC symbols
- # are required to link).
- if test -n "$old_library"; then
- newdlprefiles="$newdlprefiles $dir/$old_library"
- # Keep a list of preopened convenience libraries to check
- # that they are being used correctly in the link pass.
- test -z "$libdir" && \
- dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
- # Otherwise, use the dlname, so that lt_dlopen finds it.
- elif test -n "$dlname"; then
- newdlprefiles="$newdlprefiles $dir/$dlname"
- else
- newdlprefiles="$newdlprefiles $dir/$linklib"
- fi
+ case "$host" in
+ # special handling for platforms with PE-DLLs.
+ *cygwin* | *mingw* | *cegcc* )
+ # Linker will automatically link against shared library if both
+ # static and shared are present. Therefore, ensure we extract
+ # symbols from the import library if a shared library is present
+ # (otherwise, the dlopen module name will be incorrect). We do
+ # this by putting the import library name into $newdlprefiles.
+ # We recover the dlopen module name by 'saving' the la file
+ # name in a special purpose variable, and (later) extracting the
+ # dlname from the la file.
+ if test -n "$dlname"; then
+ func_tr_sh "$dir/$linklib"
+ eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+ func_append newdlprefiles " $dir/$linklib"
+ else
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ fi
+ ;;
+ * )
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ func_append newdlprefiles " $dir/$old_library"
+ # Keep a list of preopened convenience libraries to check
+ # that they are being used correctly in the link pass.
+ test -z "$libdir" && \
+ func_append dlpreconveniencelibs " $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ func_append newdlprefiles " $dir/$dlname"
+ else
+ func_append newdlprefiles " $dir/$linklib"
+ fi
+ ;;
+ esac
fi # $pass = dlpreopen
if test -z "$libdir"; then
@@ -5468,7 +6603,7 @@ func_mode_link ()
if test "$linkmode" = prog && test "$pass" != link; then
- newlib_search_path="$newlib_search_path $ladir"
+ func_append newlib_search_path " $ladir"
deplibs="$lib $deplibs"
linkalldeplibs=no
@@ -5481,7 +6616,8 @@ func_mode_link ()
for deplib in $dependency_libs; do
case $deplib in
-L*) func_stripname '-L' '' "$deplib"
- newlib_search_path="$newlib_search_path $func_stripname_result"
+ func_resolve_sysroot "$func_stripname_result"
+ func_append newlib_search_path " $func_resolve_sysroot_result"
;;
esac
# Need to link against all dependency_libs?
@@ -5492,12 +6628,12 @@ func_mode_link ()
# or/and link against static libraries
newdependency_libs="$deplib $newdependency_libs"
fi
- if $opt_duplicate_deps ; then
+ if $opt_preserve_dup_deps ; then
case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ *" $deplib "*) func_append specialdeplibs " $deplib" ;;
esac
fi
- tmp_libs="$tmp_libs $deplib"
+ func_append tmp_libs " $deplib"
done # for deplib
continue
fi # $linkmode = prog...
@@ -5512,7 +6648,7 @@ func_mode_link ()
# Make sure the rpath contains only unique directories.
case "$temp_rpath:" in
*"$absdir:"*) ;;
- *) temp_rpath="$temp_rpath$absdir:" ;;
+ *) func_append temp_rpath "$absdir:" ;;
esac
fi
@@ -5524,7 +6660,7 @@ func_mode_link ()
*)
case "$compile_rpath " in
*" $absdir "*) ;;
- *) compile_rpath="$compile_rpath $absdir"
+ *) func_append compile_rpath " $absdir" ;;
esac
;;
esac
@@ -5533,7 +6669,7 @@ func_mode_link ()
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir"
+ *) func_append finalize_rpath " $libdir" ;;
esac
;;
esac
@@ -5558,12 +6694,12 @@ func_mode_link ()
case $host in
*cygwin* | *mingw* | *cegcc*)
# No point in relinking DLLs because paths are not encoded
- notinst_deplibs="$notinst_deplibs $lib"
+ func_append notinst_deplibs " $lib"
need_relink=no
;;
*)
if test "$installed" = no; then
- notinst_deplibs="$notinst_deplibs $lib"
+ func_append notinst_deplibs " $lib"
need_relink=yes
fi
;;
@@ -5580,7 +6716,7 @@ func_mode_link ()
fi
done
if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
- $ECHO
+ echo
if test "$linkmode" = prog; then
$ECHO "*** Warning: Linking the executable $output against the loadable module"
else
@@ -5598,7 +6734,7 @@ func_mode_link ()
*)
case "$compile_rpath " in
*" $absdir "*) ;;
- *) compile_rpath="$compile_rpath $absdir"
+ *) func_append compile_rpath " $absdir" ;;
esac
;;
esac
@@ -5607,7 +6743,7 @@ func_mode_link ()
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir"
+ *) func_append finalize_rpath " $libdir" ;;
esac
;;
esac
@@ -5661,7 +6797,7 @@ func_mode_link ()
linklib=$newlib
fi # test -n "$old_archive_from_expsyms_cmds"
- if test "$linkmode" = prog || test "$mode" != relink; then
+ if test "$linkmode" = prog || test "$opt_mode" != relink; then
add_shlibpath=
add_dir=
add=
@@ -5683,9 +6819,9 @@ func_mode_link ()
if test "X$dlopenmodule" != "X$lib"; then
$ECHO "*** Warning: lib $linklib is a module, not a shared library"
if test -z "$old_library" ; then
- $ECHO
- $ECHO "*** And there doesn't seem to be a static archive available"
- $ECHO "*** The link will probably fail, sorry"
+ echo
+ echo "*** And there doesn't seem to be a static archive available"
+ echo "*** The link will probably fail, sorry"
else
add="$dir/$old_library"
fi
@@ -5712,12 +6848,12 @@ func_mode_link ()
test "$hardcode_direct_absolute" = no; then
add="$dir/$linklib"
elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$dir"
+ add_dir="-L$absdir"
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
- add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ func_append add_dir " -L$inst_prefix_dir$libdir"
;;
esac
fi
@@ -5739,7 +6875,7 @@ func_mode_link ()
if test -n "$add_shlibpath"; then
case :$compile_shlibpath: in
*":$add_shlibpath:"*) ;;
- *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ *) func_append compile_shlibpath "$add_shlibpath:" ;;
esac
fi
if test "$linkmode" = prog; then
@@ -5753,13 +6889,13 @@ func_mode_link ()
test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
esac
fi
fi
fi
- if test "$linkmode" = prog || test "$mode" = relink; then
+ if test "$linkmode" = prog || test "$opt_mode" = relink; then
add_shlibpath=
add_dir=
add=
@@ -5773,7 +6909,7 @@ func_mode_link ()
elif test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ *) func_append finalize_shlibpath "$libdir:" ;;
esac
add="-l$name"
elif test "$hardcode_automatic" = yes; then
@@ -5790,7 +6926,7 @@ func_mode_link ()
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
- add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ func_append add_dir " -L$inst_prefix_dir$libdir"
;;
esac
fi
@@ -5825,21 +6961,21 @@ func_mode_link ()
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
- $ECHO
+ echo
$ECHO "*** Warning: This system can not link to static lib archive $lib."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which you do not appear to have."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
if test "$module" = yes; then
- $ECHO "*** But as you try to build a module library, libtool will still create "
- $ECHO "*** a static module, that should work as long as the dlopening application"
- $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ echo "*** But as you try to build a module library, libtool will still create "
+ echo "*** a static module, that should work as long as the dlopening application"
+ echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
- $ECHO
- $ECHO "*** However, this would only work if libtool was able to extract symbol"
- $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
- $ECHO "*** not find such a program. So, this module is probably useless."
- $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
build_libtool_libs=module
@@ -5867,37 +7003,46 @@ func_mode_link ()
temp_xrpath=$func_stripname_result
case " $xrpath " in
*" $temp_xrpath "*) ;;
- *) xrpath="$xrpath $temp_xrpath";;
+ *) func_append xrpath " $temp_xrpath";;
esac;;
- *) temp_deplibs="$temp_deplibs $libdir";;
+ *) func_append temp_deplibs " $libdir";;
esac
done
dependency_libs="$temp_deplibs"
fi
- newlib_search_path="$newlib_search_path $absdir"
+ func_append newlib_search_path " $absdir"
# Link against this library
test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
# ... and its dependency_libs
tmp_libs=
for deplib in $dependency_libs; do
newdependency_libs="$deplib $newdependency_libs"
- if $opt_duplicate_deps ; then
+ case $deplib in
+ -L*) func_stripname '-L' '' "$deplib"
+ func_resolve_sysroot "$func_stripname_result";;
+ *) func_resolve_sysroot "$deplib" ;;
+ esac
+ if $opt_preserve_dup_deps ; then
case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ *" $func_resolve_sysroot_result "*)
+ func_append specialdeplibs " $func_resolve_sysroot_result" ;;
esac
fi
- tmp_libs="$tmp_libs $deplib"
+ func_append tmp_libs " $func_resolve_sysroot_result"
done
if test "$link_all_deplibs" != no; then
# Add the search paths of all dependency libraries
for deplib in $dependency_libs; do
+ path=
case $deplib in
-L*) path="$deplib" ;;
*.la)
+ func_resolve_sysroot "$deplib"
+ deplib=$func_resolve_sysroot_result
func_dirname "$deplib" "" "."
- dir="$func_dirname_result"
+ dir=$func_dirname_result
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
@@ -5924,8 +7069,8 @@ func_mode_link ()
if test -z "$darwin_install_name"; then
darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
fi
- compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
- linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+ func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+ func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
path=
fi
fi
@@ -5958,7 +7103,7 @@ func_mode_link ()
compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
else
- compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
fi
fi
dependency_libs="$newdependency_libs"
@@ -5975,7 +7120,7 @@ func_mode_link ()
for dir in $newlib_search_path; do
case "$lib_search_path " in
*" $dir "*) ;;
- *) lib_search_path="$lib_search_path $dir" ;;
+ *) func_append lib_search_path " $dir" ;;
esac
done
newlib_search_path=
@@ -6033,10 +7178,10 @@ func_mode_link ()
-L*)
case " $tmp_libs " in
*" $deplib "*) ;;
- *) tmp_libs="$tmp_libs $deplib" ;;
+ *) func_append tmp_libs " $deplib" ;;
esac
;;
- *) tmp_libs="$tmp_libs $deplib" ;;
+ *) func_append tmp_libs " $deplib" ;;
esac
done
eval $var=\"$tmp_libs\"
@@ -6052,7 +7197,7 @@ func_mode_link ()
;;
esac
if test -n "$i" ; then
- tmp_libs="$tmp_libs $i"
+ func_append tmp_libs " $i"
fi
done
dependency_libs=$tmp_libs
@@ -6093,7 +7238,7 @@ func_mode_link ()
# Now set the variables for building old libraries.
build_libtool_libs=no
oldlibs="$output"
- objs="$objs$old_deplibs"
+ func_append objs "$old_deplibs"
;;
lib)
@@ -6126,10 +7271,10 @@ func_mode_link ()
if test "$deplibs_check_method" != pass_all; then
func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
else
- $ECHO
+ echo
$ECHO "*** Warning: Linking the shared library $output against the non-libtool"
$ECHO "*** objects $objs is not portable!"
- libobjs="$libobjs $objs"
+ func_append libobjs " $objs"
fi
fi
@@ -6188,13 +7333,14 @@ func_mode_link ()
# which has an extra 1 added just for fun
#
case $version_type in
+ # correct linux to gnu/linux during the next big refactor
darwin|linux|osf|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
age="$number_minor"
revision="$number_revision"
;;
- freebsd-aout|freebsd-elf|sunos)
+ freebsd-aout|freebsd-elf|qnx|sunos)
current="$number_major"
revision="$number_minor"
age="0"
@@ -6206,6 +7352,9 @@ func_mode_link ()
revision="$number_minor"
lt_irix_increment=no
;;
+ *)
+ func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+ ;;
esac
;;
no)
@@ -6304,7 +7453,7 @@ func_mode_link ()
versuffix="$major.$revision"
;;
- linux)
+ linux) # correct to gnu/linux during the next big refactor
func_arith $current - $age
major=.$func_arith_result
versuffix="$major.$age.$revision"
@@ -6327,7 +7476,7 @@ func_mode_link ()
done
# Make executables depend on our current version.
- verstring="$verstring:${current}.0"
+ func_append verstring ":${current}.0"
;;
qnx)
@@ -6395,10 +7544,10 @@ func_mode_link ()
fi
func_generate_dlsyms "$libname" "$libname" "yes"
- libobjs="$libobjs $symfileobj"
+ func_append libobjs " $symfileobj"
test "X$libobjs" = "X " && libobjs=
- if test "$mode" != relink; then
+ if test "$opt_mode" != relink; then
# Remove our outputs, but don't remove object files since they
# may have been created when compiling PIC objects.
removelist=
@@ -6414,7 +7563,7 @@ func_mode_link ()
continue
fi
fi
- removelist="$removelist $p"
+ func_append removelist " $p"
;;
*) ;;
esac
@@ -6425,27 +7574,28 @@ func_mode_link ()
# Now set the variables for building old libraries.
if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- oldlibs="$oldlibs $output_objdir/$libname.$libext"
+ func_append oldlibs " $output_objdir/$libname.$libext"
# Transform .lo files to .o files.
- oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
fi
# Eliminate all temporary directories.
#for path in $notinst_path; do
- # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
- # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
- # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+ # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+ # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+ # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
#done
if test -n "$xrpath"; then
# If the user specified any rpath flags, then add them.
temp_xrpath=
for libdir in $xrpath; do
- temp_xrpath="$temp_xrpath -R$libdir"
+ func_replace_sysroot "$libdir"
+ func_append temp_xrpath " -R$func_replace_sysroot_result"
case "$finalize_rpath " in
*" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir" ;;
+ *) func_append finalize_rpath " $libdir" ;;
esac
done
if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
@@ -6459,7 +7609,7 @@ func_mode_link ()
for lib in $old_dlfiles; do
case " $dlprefiles $dlfiles " in
*" $lib "*) ;;
- *) dlfiles="$dlfiles $lib" ;;
+ *) func_append dlfiles " $lib" ;;
esac
done
@@ -6469,19 +7619,19 @@ func_mode_link ()
for lib in $old_dlprefiles; do
case "$dlprefiles " in
*" $lib "*) ;;
- *) dlprefiles="$dlprefiles $lib" ;;
+ *) func_append dlprefiles " $lib" ;;
esac
done
if test "$build_libtool_libs" = yes; then
if test -n "$rpath"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
# these systems don't actually have a c library (as such)!
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C library is in the System framework
- deplibs="$deplibs System.ltframework"
+ func_append deplibs " System.ltframework"
;;
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
@@ -6498,7 +7648,7 @@ func_mode_link ()
*)
# Add libc to deplibs on all other systems if necessary.
if test "$build_libtool_need_lc" = "yes"; then
- deplibs="$deplibs -lc"
+ func_append deplibs " -lc"
fi
;;
esac
@@ -6547,7 +7697,7 @@ EOF
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $i "*)
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
i=""
;;
esac
@@ -6558,21 +7708,21 @@ EOF
set dummy $deplib_matches; shift
deplib_match=$1
if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
else
droppeddeps=yes
- $ECHO
+ echo
$ECHO "*** Warning: dynamic linker does not accept needed library $i."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which I believe you do not have"
- $ECHO "*** because a test_compile did reveal that the linker did not use it for"
- $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which I believe you do not have"
+ echo "*** because a test_compile did reveal that the linker did not use it for"
+ echo "*** its dynamic dependency list that programs get resolved with at runtime."
fi
fi
;;
*)
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
;;
esac
done
@@ -6590,7 +7740,7 @@ EOF
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $i "*)
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
i=""
;;
esac
@@ -6601,29 +7751,29 @@ EOF
set dummy $deplib_matches; shift
deplib_match=$1
if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
else
droppeddeps=yes
- $ECHO
+ echo
$ECHO "*** Warning: dynamic linker does not accept needed library $i."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which you do not appear to have"
- $ECHO "*** because a test_compile did reveal that the linker did not use this one"
- $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because a test_compile did reveal that the linker did not use this one"
+ echo "*** as a dynamic dependency that programs can get resolved with at runtime."
fi
fi
else
droppeddeps=yes
- $ECHO
+ echo
$ECHO "*** Warning! Library $i is needed by this library but I was not able to"
- $ECHO "*** make it link in! You will probably need to install it or some"
- $ECHO "*** library that it depends on before this library will be fully"
- $ECHO "*** functional. Installing it before continuing would be even better."
+ echo "*** make it link in! You will probably need to install it or some"
+ echo "*** library that it depends on before this library will be fully"
+ echo "*** functional. Installing it before continuing would be even better."
fi
;;
*)
- newdeplibs="$newdeplibs $i"
+ func_append newdeplibs " $i"
;;
esac
done
@@ -6640,15 +7790,27 @@ EOF
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $a_deplib "*)
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
a_deplib=""
;;
esac
fi
if test -n "$a_deplib" ; then
libname=`eval "\\$ECHO \"$libname_spec\""`
+ if test -n "$file_magic_glob"; then
+ libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+ else
+ libnameglob=$libname
+ fi
+ test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ if test "$want_nocaseglob" = yes; then
+ shopt -s nocaseglob
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ $nocaseglob
+ else
+ potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+ fi
for potent_lib in $potential_libs; do
# Follow soft links.
if ls -lLd "$potent_lib" 2>/dev/null |
@@ -6665,13 +7827,13 @@ EOF
potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
case $potliblink in
[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
esac
done
if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
$SED -e 10q |
$EGREP "$file_magic_regex" > /dev/null; then
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
a_deplib=""
break 2
fi
@@ -6680,12 +7842,12 @@ EOF
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
- $ECHO
+ echo
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which you do not appear to have"
- $ECHO "*** because I did check the linker path looking for a file starting"
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$ECHO "*** with $libname but no candidates were found. (...for file magic test)"
else
@@ -6696,7 +7858,7 @@ EOF
;;
*)
# Add a -L argument.
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
;;
esac
done # Gone through all deplibs.
@@ -6712,7 +7874,7 @@ EOF
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $a_deplib "*)
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
a_deplib=""
;;
esac
@@ -6723,9 +7885,9 @@ EOF
potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
for potent_lib in $potential_libs; do
potlib="$potent_lib" # see symlink-check above in file_magic test
- if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+ if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
$EGREP "$match_pattern_regex" > /dev/null; then
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
a_deplib=""
break 2
fi
@@ -6734,12 +7896,12 @@ EOF
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
- $ECHO
+ echo
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- $ECHO "*** I have the capability to make that library automatically link in when"
- $ECHO "*** you link to this library. But I can only do this if you have a"
- $ECHO "*** shared version of the library, which you do not appear to have"
- $ECHO "*** because I did check the linker path looking for a file starting"
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have"
+ echo "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
else
@@ -6750,32 +7912,32 @@ EOF
;;
*)
# Add a -L argument.
- newdeplibs="$newdeplibs $a_deplib"
+ func_append newdeplibs " $a_deplib"
;;
esac
done # Gone through all deplibs.
;;
none | unknown | *)
newdeplibs=""
- tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
- -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+ tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
for i in $predeps $postdeps ; do
# can't use Xsed below, because $i might contain '/'
- tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+ tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
done
fi
- if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' |
- $GREP . >/dev/null; then
- $ECHO
+ case $tmp_deplibs in
+ *[!\ \ ]*)
+ echo
if test "X$deplibs_check_method" = "Xnone"; then
- $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+ echo "*** Warning: inter-library dependencies are not supported in this platform."
else
- $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+ echo "*** Warning: inter-library dependencies are not known to be supported."
fi
- $ECHO "*** All declared inter-library dependencies are being dropped."
+ echo "*** All declared inter-library dependencies are being dropped."
droppeddeps=yes
- fi
+ ;;
+ esac
;;
esac
versuffix=$versuffix_save
@@ -6787,23 +7949,23 @@ EOF
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library with the System framework
- newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
;;
esac
if test "$droppeddeps" = yes; then
if test "$module" = yes; then
- $ECHO
- $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+ echo
+ echo "*** Warning: libtool could not satisfy all declared inter-library"
$ECHO "*** dependencies of module $libname. Therefore, libtool will create"
- $ECHO "*** a static module, that should work as long as the dlopening"
- $ECHO "*** application is linked with the -dlopen flag."
+ echo "*** a static module, that should work as long as the dlopening"
+ echo "*** application is linked with the -dlopen flag."
if test -z "$global_symbol_pipe"; then
- $ECHO
- $ECHO "*** However, this would only work if libtool was able to extract symbol"
- $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
- $ECHO "*** not find such a program. So, this module is probably useless."
- $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
@@ -6813,16 +7975,16 @@ EOF
build_libtool_libs=no
fi
else
- $ECHO "*** The inter-library dependencies that have been dropped here will be"
- $ECHO "*** automatically added whenever a program is linked with this library"
- $ECHO "*** or is declared to -dlopen it."
+ echo "*** The inter-library dependencies that have been dropped here will be"
+ echo "*** automatically added whenever a program is linked with this library"
+ echo "*** or is declared to -dlopen it."
if test "$allow_undefined" = no; then
- $ECHO
- $ECHO "*** Since this library must not contain undefined symbols,"
- $ECHO "*** because either the platform does not support them or"
- $ECHO "*** it was explicitly requested with -no-undefined,"
- $ECHO "*** libtool will only create a static version of it."
+ echo
+ echo "*** Since this library must not contain undefined symbols,"
+ echo "*** because either the platform does not support them or"
+ echo "*** it was explicitly requested with -no-undefined,"
+ echo "*** libtool will only create a static version of it."
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
build_libtool_libs=module
@@ -6839,9 +8001,9 @@ EOF
# Time to change all our "foo.ltframework" stuff back to "-framework foo"
case $host in
*-*-darwin*)
- newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
- new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
- deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
;;
esac
@@ -6854,7 +8016,7 @@ EOF
*)
case " $deplibs " in
*" -L$path/$objdir "*)
- new_libs="$new_libs -L$path/$objdir" ;;
+ func_append new_libs " -L$path/$objdir" ;;
esac
;;
esac
@@ -6864,10 +8026,10 @@ EOF
-L*)
case " $new_libs " in
*" $deplib "*) ;;
- *) new_libs="$new_libs $deplib" ;;
+ *) func_append new_libs " $deplib" ;;
esac
;;
- *) new_libs="$new_libs $deplib" ;;
+ *) func_append new_libs " $deplib" ;;
esac
done
deplibs="$new_libs"
@@ -6879,15 +8041,22 @@ EOF
# Test again, we may have decided not to build it any more
if test "$build_libtool_libs" = yes; then
+ # Remove ${wl} instances when linking with ld.
+ # FIXME: should test the right _cmds variable.
+ case $archive_cmds in
+ *\$LD\ *) wl= ;;
+ esac
if test "$hardcode_into_libs" = yes; then
# Hardcode the library paths
hardcode_libdirs=
dep_rpath=
rpath="$finalize_rpath"
- test "$mode" != relink && rpath="$compile_rpath$rpath"
+ test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
for libdir in $rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
+ func_replace_sysroot "$libdir"
+ libdir=$func_replace_sysroot_result
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
@@ -6896,18 +8065,18 @@ EOF
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
- dep_rpath="$dep_rpath $flag"
+ func_append dep_rpath " $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
- *) perm_rpath="$perm_rpath $libdir" ;;
+ *) func_append perm_rpath " $libdir" ;;
esac
fi
done
@@ -6915,17 +8084,13 @@ EOF
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
- if test -n "$hardcode_libdir_flag_spec_ld"; then
- eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
- else
- eval dep_rpath=\"$hardcode_libdir_flag_spec\"
- fi
+ eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
fi
if test -n "$runpath_var" && test -n "$perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
- rpath="$rpath$dir:"
+ func_append rpath "$dir:"
done
eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
fi
@@ -6933,7 +8098,7 @@ EOF
fi
shlibpath="$finalize_shlibpath"
- test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
if test -n "$shlibpath"; then
eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
fi
@@ -6959,18 +8124,18 @@ EOF
linknames=
for link
do
- linknames="$linknames $link"
+ func_append linknames " $link"
done
# Use standard objects if they are pic
- test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
test "X$libobjs" = "X " && libobjs=
delfiles=
if test -n "$export_symbols" && test -n "$include_expsyms"; then
$opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
export_symbols="$output_objdir/$libname.uexp"
- delfiles="$delfiles $export_symbols"
+ func_append delfiles " $export_symbols"
fi
orig_export_symbols=
@@ -7001,13 +8166,45 @@ EOF
$opt_dry_run || $RM $export_symbols
cmds=$export_symbols_cmds
save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
+ for cmd1 in $cmds; do
IFS="$save_ifs"
- eval cmd=\"$cmd\"
- func_len " $cmd"
- len=$func_len_result
- if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ # Take the normal branch if the nm_file_list_spec branch
+ # doesn't work or if tool conversion is not needed.
+ case $nm_file_list_spec~$to_tool_file_cmd in
+ *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+ try_normal_branch=yes
+ eval cmd=\"$cmd1\"
+ func_len " $cmd"
+ len=$func_len_result
+ ;;
+ *)
+ try_normal_branch=no
+ ;;
+ esac
+ if test "$try_normal_branch" = yes \
+ && { test "$len" -lt "$max_cmd_len" \
+ || test "$max_cmd_len" -le -1; }
+ then
+ func_show_eval "$cmd" 'exit $?'
+ skipped_export=false
+ elif test -n "$nm_file_list_spec"; then
+ func_basename "$output"
+ output_la=$func_basename_result
+ save_libobjs=$libobjs
+ save_output=$output
+ output=${output_objdir}/${output_la}.nm
+ func_to_tool_file "$output"
+ libobjs=$nm_file_list_spec$func_to_tool_file_result
+ func_append delfiles " $output"
+ func_verbose "creating $NM input file list: $output"
+ for obj in $save_libobjs; do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > "$output"
+ eval cmd=\"$cmd1\"
func_show_eval "$cmd" 'exit $?'
+ output=$save_output
+ libobjs=$save_libobjs
skipped_export=false
else
# The command line is too long to execute in one step.
@@ -7029,7 +8226,7 @@ EOF
if test -n "$export_symbols" && test -n "$include_expsyms"; then
tmp_export_symbols="$export_symbols"
test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
fi
if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
@@ -7041,7 +8238,7 @@ EOF
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
$opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
export_symbols=$output_objdir/$libname.def
$opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
fi
@@ -7051,7 +8248,7 @@ EOF
case " $convenience " in
*" $test_deplib "*) ;;
*)
- tmp_deplibs="$tmp_deplibs $test_deplib"
+ func_append tmp_deplibs " $test_deplib"
;;
esac
done
@@ -7071,21 +8268,21 @@ EOF
test "X$libobjs" = "X " && libobjs=
else
gentop="$output_objdir/${outputname}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_extract_archives $gentop $convenience
- libobjs="$libobjs $func_extract_archives_result"
+ func_append libobjs " $func_extract_archives_result"
test "X$libobjs" = "X " && libobjs=
fi
fi
if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
eval flag=\"$thread_safe_flag_spec\"
- linker_flags="$linker_flags $flag"
+ func_append linker_flags " $flag"
fi
# Make a backup of the uninstalled library when relinking
- if test "$mode" = relink; then
+ if test "$opt_mode" = relink; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
fi
@@ -7130,7 +8327,8 @@ EOF
save_libobjs=$libobjs
fi
save_output=$output
- output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+ func_basename "$output"
+ output_la=$func_basename_result
# Clear the reloadable object creation command queue and
# initialize k to one.
@@ -7143,13 +8341,16 @@ EOF
if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
output=${output_objdir}/${output_la}.lnkscript
func_verbose "creating GNU ld script: $output"
- $ECHO 'INPUT (' > $output
+ echo 'INPUT (' > $output
for obj in $save_libobjs
do
- $ECHO "$obj" >> $output
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
done
- $ECHO ')' >> $output
- delfiles="$delfiles $output"
+ echo ')' >> $output
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$func_to_tool_file_result
elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
output=${output_objdir}/${output_la}.lnk
func_verbose "creating linker input file list: $output"
@@ -7163,10 +8364,12 @@ EOF
fi
for obj
do
- $ECHO "$obj" >> $output
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
done
- delfiles="$delfiles $output"
- output=$firstobj\"$file_list_spec$output\"
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
else
if test -n "$save_libobjs"; then
func_verbose "creating reloadable object files..."
@@ -7190,17 +8393,19 @@ EOF
# command to the queue.
if test "$k" -eq 1 ; then
# The first file doesn't have a previous command to add.
- eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ reload_objs=$objlist
+ eval concat_cmds=\"$reload_cmds\"
else
# All subsequent reloadable object files will link in
# the last one created.
- eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
fi
last_robj=$output_objdir/$output_la-${k}.$objext
func_arith $k + 1
k=$func_arith_result
output=$output_objdir/$output_la-${k}.$objext
- objlist=$obj
+ objlist=" $obj"
func_len " $last_robj"
func_arith $len0 + $func_len_result
len=$func_arith_result
@@ -7210,11 +8415,12 @@ EOF
# reloadable object file. All subsequent reloadable object
# files will link in the last one created.
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+ reload_objs="$objlist $last_robj"
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
if test -n "$last_robj"; then
eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
fi
- delfiles="$delfiles $output"
+ func_append delfiles " $output"
else
output=
@@ -7248,7 +8454,7 @@ EOF
lt_exit=$?
# Restore the uninstalled library and exit
- if test "$mode" = relink; then
+ if test "$opt_mode" = relink; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
@@ -7269,7 +8475,7 @@ EOF
if test -n "$export_symbols" && test -n "$include_expsyms"; then
tmp_export_symbols="$export_symbols"
test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+ $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
fi
if test -n "$orig_export_symbols"; then
@@ -7281,7 +8487,7 @@ EOF
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
$opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+ func_append delfiles " $export_symbols $output_objdir/$libname.filter"
export_symbols=$output_objdir/$libname.def
$opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
fi
@@ -7322,10 +8528,10 @@ EOF
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
gentop="$output_objdir/${outputname}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_extract_archives $gentop $dlprefiles
- libobjs="$libobjs $func_extract_archives_result"
+ func_append libobjs " $func_extract_archives_result"
test "X$libobjs" = "X " && libobjs=
fi
@@ -7341,7 +8547,7 @@ EOF
lt_exit=$?
# Restore the uninstalled library and exit
- if test "$mode" = relink; then
+ if test "$opt_mode" = relink; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
@@ -7353,7 +8559,7 @@ EOF
IFS="$save_ifs"
# Restore the uninstalled library and exit
- if test "$mode" = relink; then
+ if test "$opt_mode" = relink; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
if test -n "$convenience"; then
@@ -7434,18 +8640,21 @@ EOF
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec"; then
eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
- reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+ reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
else
gentop="$output_objdir/${obj}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_extract_archives $gentop $convenience
reload_conv_objs="$reload_objs $func_extract_archives_result"
fi
fi
+ # If we're not building shared, we need to use non_pic_objs
+ test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
# Create the old-style object.
- reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+ reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
output="$obj"
func_execute_cmds "$reload_cmds" 'exit $?'
@@ -7505,8 +8714,8 @@ EOF
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library is the System framework
- compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
- finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
;;
esac
@@ -7517,14 +8726,14 @@ EOF
if test "$tagname" = CXX ; then
case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
10.[0123])
- compile_command="$compile_command ${wl}-bind_at_load"
- finalize_command="$finalize_command ${wl}-bind_at_load"
+ func_append compile_command " ${wl}-bind_at_load"
+ func_append finalize_command " ${wl}-bind_at_load"
;;
esac
fi
# Time to change all our "foo.ltframework" stuff back to "-framework foo"
- compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
- finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+ compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+ finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
;;
esac
@@ -7538,7 +8747,7 @@ EOF
*)
case " $compile_deplibs " in
*" -L$path/$objdir "*)
- new_libs="$new_libs -L$path/$objdir" ;;
+ func_append new_libs " -L$path/$objdir" ;;
esac
;;
esac
@@ -7548,17 +8757,17 @@ EOF
-L*)
case " $new_libs " in
*" $deplib "*) ;;
- *) new_libs="$new_libs $deplib" ;;
+ *) func_append new_libs " $deplib" ;;
esac
;;
- *) new_libs="$new_libs $deplib" ;;
+ *) func_append new_libs " $deplib" ;;
esac
done
compile_deplibs="$new_libs"
- compile_command="$compile_command $compile_deplibs"
- finalize_command="$finalize_command $finalize_deplibs"
+ func_append compile_command " $compile_deplibs"
+ func_append finalize_command " $finalize_deplibs"
if test -n "$rpath$xrpath"; then
# If the user specified any rpath flags, then add them.
@@ -7566,7 +8775,7 @@ EOF
# This is the magic to use -rpath.
case "$finalize_rpath " in
*" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir" ;;
+ *) func_append finalize_rpath " $libdir" ;;
esac
done
fi
@@ -7585,18 +8794,18 @@ EOF
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
+ func_append rpath " $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
- *) perm_rpath="$perm_rpath $libdir" ;;
+ *) func_append perm_rpath " $libdir" ;;
esac
fi
case $host in
@@ -7605,12 +8814,12 @@ EOF
case :$dllsearchpath: in
*":$libdir:"*) ;;
::) dllsearchpath=$libdir;;
- *) dllsearchpath="$dllsearchpath:$libdir";;
+ *) func_append dllsearchpath ":$libdir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
::) dllsearchpath=$testbindir;;
- *) dllsearchpath="$dllsearchpath:$testbindir";;
+ *) func_append dllsearchpath ":$testbindir";;
esac
;;
esac
@@ -7636,18 +8845,18 @@ EOF
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
+ func_append rpath " $flag"
fi
elif test -n "$runpath_var"; then
case "$finalize_perm_rpath " in
*" $libdir "*) ;;
- *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ *) func_append finalize_perm_rpath " $libdir" ;;
esac
fi
done
@@ -7661,8 +8870,8 @@ EOF
if test -n "$libobjs" && test "$build_old_libs" = yes; then
# Transform all the library objects into standard objects.
- compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+ finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
fi
func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
@@ -7674,15 +8883,15 @@ EOF
wrappers_required=yes
case $host in
+ *cegcc* | *mingw32ce*)
+ # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+ wrappers_required=no
+ ;;
*cygwin* | *mingw* )
if test "$build_libtool_libs" != yes; then
wrappers_required=no
fi
;;
- *cegcc)
- # Disable wrappers for cegcc, we are cross compiling anyway.
- wrappers_required=no
- ;;
*)
if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
wrappers_required=no
@@ -7691,13 +8900,19 @@ EOF
esac
if test "$wrappers_required" = no; then
# Replace the output file specification.
- compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
link_command="$compile_command$compile_rpath"
# We have no uninstalled library dependencies, so finalize right now.
exit_status=0
func_show_eval "$link_command" 'exit_status=$?'
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
# Delete the generated files.
if test -f "$output_objdir/${outputname}S.${objext}"; then
func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
@@ -7720,7 +8935,7 @@ EOF
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
- rpath="$rpath$dir:"
+ func_append rpath "$dir:"
done
compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
@@ -7728,7 +8943,7 @@ EOF
# We should set the runpath_var.
rpath=
for dir in $finalize_perm_rpath; do
- rpath="$rpath$dir:"
+ func_append rpath "$dir:"
done
finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
@@ -7738,11 +8953,18 @@ EOF
# We don't need to create a wrapper script.
link_command="$compile_var$compile_command$compile_rpath"
# Replace the output file specification.
- link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
# Delete the old output file.
$opt_dry_run || $RM $output
# Link the executable and exit
func_show_eval "$link_command" 'exit $?'
+
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
exit $EXIT_SUCCESS
fi
@@ -7757,7 +8979,7 @@ EOF
if test "$fast_install" != no; then
link_command="$finalize_var$compile_command$finalize_rpath"
if test "$fast_install" = yes; then
- relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
else
# fast_install is set to needless
relink_command=
@@ -7769,13 +8991,19 @@ EOF
fi
# Replace the output file specification.
- link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+ link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
# Delete the old output files.
$opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
func_show_eval "$link_command" 'exit $?'
+ if test -n "$postlink_cmds"; then
+ func_to_tool_file "$output_objdir/$outputname"
+ postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+ func_execute_cmds "$postlink_cmds" 'exit $?'
+ fi
+
# Now create the wrapper script.
func_verbose "creating $output"
@@ -7793,18 +9021,7 @@ EOF
fi
done
relink_command="(cd `pwd`; $relink_command)"
- relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
- fi
-
- # Quote $ECHO for shipping.
- if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
- case $progpath in
- [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
- *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
- esac
- qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
- else
- qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
fi
# Only actually do things if not in dry run mode.
@@ -7884,7 +9101,7 @@ EOF
else
oldobjs="$old_deplibs $non_pic_objects"
if test "$preload" = yes && test -f "$symfileobj"; then
- oldobjs="$oldobjs $symfileobj"
+ func_append oldobjs " $symfileobj"
fi
fi
addlibs="$old_convenience"
@@ -7892,10 +9109,10 @@ EOF
if test -n "$addlibs"; then
gentop="$output_objdir/${outputname}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_extract_archives $gentop $addlibs
- oldobjs="$oldobjs $func_extract_archives_result"
+ func_append oldobjs " $func_extract_archives_result"
fi
# Do each command in the archive commands.
@@ -7906,10 +9123,10 @@ EOF
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
gentop="$output_objdir/${outputname}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_extract_archives $gentop $dlprefiles
- oldobjs="$oldobjs $func_extract_archives_result"
+ func_append oldobjs " $func_extract_archives_result"
fi
# POSIX demands no paths to be encoded in archives. We have
@@ -7925,9 +9142,9 @@ EOF
done | sort | sort -uc >/dev/null 2>&1); then
:
else
- $ECHO "copying selected object files to avoid basename conflicts..."
+ echo "copying selected object files to avoid basename conflicts..."
gentop="$output_objdir/${outputname}x"
- generated="$generated $gentop"
+ func_append generated " $gentop"
func_mkdir_p "$gentop"
save_oldobjs=$oldobjs
oldobjs=
@@ -7951,18 +9168,30 @@ EOF
esac
done
func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
- oldobjs="$oldobjs $gentop/$newobj"
+ func_append oldobjs " $gentop/$newobj"
;;
- *) oldobjs="$oldobjs $obj" ;;
+ *) func_append oldobjs " $obj" ;;
esac
done
fi
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
eval cmds=\"$old_archive_cmds\"
func_len " $cmds"
len=$func_len_result
if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
cmds=$old_archive_cmds
+ elif test -n "$archiver_list_spec"; then
+ func_verbose "using command file archive linking..."
+ for obj in $oldobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result"
+ done > $output_objdir/$libname.libcmd
+ func_to_tool_file "$output_objdir/$libname.libcmd"
+ oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+ cmds=$old_archive_cmds
else
# the command line is too long to link in one step, link in parts
func_verbose "using piecewise archive linking..."
@@ -8036,7 +9265,7 @@ EOF
done
# Quote the link command for shipping.
relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
if test "$hardcode_automatic" = yes ; then
relink_command=
fi
@@ -8056,12 +9285,23 @@ EOF
*.la)
func_basename "$deplib"
name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ func_resolve_sysroot "$deplib"
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
test -z "$libdir" && \
func_fatal_error "\`$deplib' is not a valid libtool archive"
- newdependency_libs="$newdependency_libs $libdir/$name"
+ func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+ ;;
+ -L*)
+ func_stripname -L '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -L$func_replace_sysroot_result"
+ ;;
+ -R*)
+ func_stripname -R '' "$deplib"
+ func_replace_sysroot "$func_stripname_result"
+ func_append newdependency_libs " -R$func_replace_sysroot_result"
;;
- *) newdependency_libs="$newdependency_libs $deplib" ;;
+ *) func_append newdependency_libs " $deplib" ;;
esac
done
dependency_libs="$newdependency_libs"
@@ -8075,9 +9315,9 @@ EOF
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
func_fatal_error "\`$lib' is not a valid libtool archive"
- newdlfiles="$newdlfiles $libdir/$name"
+ func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
;;
- *) newdlfiles="$newdlfiles $lib" ;;
+ *) func_append newdlfiles " $lib" ;;
esac
done
dlfiles="$newdlfiles"
@@ -8094,7 +9334,7 @@ EOF
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
func_fatal_error "\`$lib' is not a valid libtool archive"
- newdlprefiles="$newdlprefiles $libdir/$name"
+ func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
;;
esac
done
@@ -8106,7 +9346,7 @@ EOF
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
- newdlfiles="$newdlfiles $abs"
+ func_append newdlfiles " $abs"
done
dlfiles="$newdlfiles"
newdlprefiles=
@@ -8115,15 +9355,33 @@ EOF
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
- newdlprefiles="$newdlprefiles $abs"
+ func_append newdlprefiles " $abs"
done
dlprefiles="$newdlprefiles"
fi
$RM $output
# place dlname in correct position for cygwin
+ # In fact, it would be nice if we could use this code for all target
+ # systems that can't hard-code library paths into their executables
+ # and that have no shared library path variable independent of PATH,
+ # but it turns out we can't easily determine that from inspecting
+ # libtool variables, so we have to hard-code the OSs to which it
+ # applies here; at the moment, that means platforms that use the PE
+ # object format with DLL files. See the long comment at the top of
+ # tests/bindir.at for full details.
tdlname=$dlname
case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+ # If a -bindir argument was supplied, place the dll there.
+ if test "x$bindir" != x ;
+ then
+ func_relative_path "$install_libdir" "$bindir"
+ tdlname=$func_relative_path_result$dlname
+ else
+ # Otherwise fall back on heuristic.
+ tdlname=../bin/$dlname
+ fi
+ ;;
esac
$ECHO > $output "\
# $outputname - a libtool library file
@@ -8182,7 +9440,7 @@ relink_command=\"$relink_command\""
exit $EXIT_SUCCESS
}
-{ test "$mode" = link || test "$mode" = relink; } &&
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
func_mode_link ${1+"$@"}
@@ -8202,9 +9460,9 @@ func_mode_uninstall ()
for arg
do
case $arg in
- -f) RM="$RM $arg"; rmforce=yes ;;
- -*) RM="$RM $arg" ;;
- *) files="$files $arg" ;;
+ -f) func_append RM " $arg"; rmforce=yes ;;
+ -*) func_append RM " $arg" ;;
+ *) func_append files " $arg" ;;
esac
done
@@ -8213,24 +9471,23 @@ func_mode_uninstall ()
rmdirs=
- origobjdir="$objdir"
for file in $files; do
func_dirname "$file" "" "."
dir="$func_dirname_result"
if test "X$dir" = X.; then
- objdir="$origobjdir"
+ odir="$objdir"
else
- objdir="$dir/$origobjdir"
+ odir="$dir/$objdir"
fi
func_basename "$file"
name="$func_basename_result"
- test "$mode" = uninstall && objdir="$dir"
+ test "$opt_mode" = uninstall && odir="$dir"
- # Remember objdir for removal later, being careful to avoid duplicates
- if test "$mode" = clean; then
+ # Remember odir for removal later, being careful to avoid duplicates
+ if test "$opt_mode" = clean; then
case " $rmdirs " in
- *" $objdir "*) ;;
- *) rmdirs="$rmdirs $objdir" ;;
+ *" $odir "*) ;;
+ *) func_append rmdirs " $odir" ;;
esac
fi
@@ -8256,18 +9513,17 @@ func_mode_uninstall ()
# Delete the libtool libraries and symlinks.
for n in $library_names; do
- rmfiles="$rmfiles $objdir/$n"
+ func_append rmfiles " $odir/$n"
done
- test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+ test -n "$old_library" && func_append rmfiles " $odir/$old_library"
- case "$mode" in
+ case "$opt_mode" in
clean)
- case " $library_names " in
- # " " in the beginning catches empty $dlname
+ case " $library_names " in
*" $dlname "*) ;;
- *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
esac
- test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+ test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
;;
uninstall)
if test -n "$library_names"; then
@@ -8295,19 +9551,19 @@ func_mode_uninstall ()
# Add PIC object to the list of files to remove.
if test -n "$pic_object" &&
test "$pic_object" != none; then
- rmfiles="$rmfiles $dir/$pic_object"
+ func_append rmfiles " $dir/$pic_object"
fi
# Add non-PIC object to the list of files to remove.
if test -n "$non_pic_object" &&
test "$non_pic_object" != none; then
- rmfiles="$rmfiles $dir/$non_pic_object"
+ func_append rmfiles " $dir/$non_pic_object"
fi
fi
;;
*)
- if test "$mode" = clean ; then
+ if test "$opt_mode" = clean ; then
noexename=$name
case $file in
*.exe)
@@ -8317,7 +9573,7 @@ func_mode_uninstall ()
noexename=$func_stripname_result
# $file with .exe has already been added to rmfiles,
# add $file without .exe
- rmfiles="$rmfiles $file"
+ func_append rmfiles " $file"
;;
esac
# Do a test to see if this is a libtool program.
@@ -8326,7 +9582,7 @@ func_mode_uninstall ()
func_ltwrapper_scriptname "$file"
relink_command=
func_source $func_ltwrapper_scriptname_result
- rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+ func_append rmfiles " $func_ltwrapper_scriptname_result"
else
relink_command=
func_source $dir/$noexename
@@ -8334,12 +9590,12 @@ func_mode_uninstall ()
# note $name still contains .exe if it was in $file originally
# as does the version of $file that was added into $rmfiles
- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
if test "$fast_install" = yes && test -n "$relink_command"; then
- rmfiles="$rmfiles $objdir/lt-$name"
+ func_append rmfiles " $odir/lt-$name"
fi
if test "X$noexename" != "X$name" ; then
- rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ func_append rmfiles " $odir/lt-${noexename}.c"
fi
fi
fi
@@ -8347,7 +9603,6 @@ func_mode_uninstall ()
esac
func_show_eval "$RM $rmfiles" 'exit_status=1'
done
- objdir="$origobjdir"
# Try to remove the ${objdir}s in the directories where we deleted files
for dir in $rmdirs; do
@@ -8359,16 +9614,16 @@ func_mode_uninstall ()
exit $exit_status
}
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
func_mode_uninstall ${1+"$@"}
-test -z "$mode" && {
+test -z "$opt_mode" && {
help="$generic_help"
func_fatal_help "you must specify a MODE"
}
test -z "$exec_cmd" && \
- func_fatal_help "invalid operation mode \`$mode'"
+ func_fatal_help "invalid operation mode \`$opt_mode'"
if test -n "$exec_cmd"; then
eval exec "$exec_cmd"
diff --git a/Modules/_ctypes/libffi/m4/asmcfi.m4 b/Modules/_ctypes/libffi/m4/asmcfi.m4
new file mode 100644
index 0000000..dbf73a0
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/asmcfi.m4
@@ -0,0 +1,13 @@
+AC_DEFUN([GCC_AS_CFI_PSEUDO_OP],
+[AC_CACHE_CHECK([assembler .cfi pseudo-op support],
+ gcc_cv_as_cfi_pseudo_op, [
+ gcc_cv_as_cfi_pseudo_op=unknown
+ AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],,
+ [gcc_cv_as_cfi_pseudo_op=yes],
+ [gcc_cv_as_cfi_pseudo_op=no])
+ ])
+ if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
+ AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1,
+ [Define if your assembler supports .cfi_* directives.])
+ fi
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_append_flag.m4 b/Modules/_ctypes/libffi/m4/ax_append_flag.m4
new file mode 100644
index 0000000..1d38b76
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_append_flag.m4
@@ -0,0 +1,69 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
+#
+# DESCRIPTION
+#
+# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
+# added in between.
+#
+# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
+# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
+# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
+# FLAG.
+#
+# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 2
+
+AC_DEFUN([AX_APPEND_FLAG],
+[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
+AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl
+AS_VAR_SET_IF(FLAGS,
+ [case " AS_VAR_GET(FLAGS) " in
+ *" $1 "*)
+ AC_RUN_LOG([: FLAGS already contains $1])
+ ;;
+ *)
+ AC_RUN_LOG([: FLAGS="$FLAGS $1"])
+ AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"])
+ ;;
+ esac],
+ [AS_VAR_SET(FLAGS,["$1"])])
+AS_VAR_POPDEF([FLAGS])dnl
+])dnl AX_APPEND_FLAG
diff --git a/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4 b/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4
new file mode 100644
index 0000000..4e75327
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_cc_maxopt.m4
@@ -0,0 +1,180 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CC_MAXOPT
+#
+# DESCRIPTION
+#
+# Try to turn on "good" C optimization flags for various compilers and
+# architectures, for some definition of "good". (In our case, good for
+# FFTW and hopefully for other scientific codes. Modify as needed.)
+#
+# The user can override the flags by setting the CFLAGS environment
+# variable. The user can also specify --enable-portable-binary in order to
+# disable any optimization flags that might result in a binary that only
+# runs on the host architecture.
+#
+# Note also that the flags assume that ANSI C aliasing rules are followed
+# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
+# computations can be re-ordered as needed.
+#
+# Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR,
+# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2008 Matteo Frigo
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 12
+
+AC_DEFUN([AX_CC_MAXOPT],
+[
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AX_COMPILER_VENDOR])
+AC_REQUIRE([AC_CANONICAL_HOST])
+
+AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
+ acx_maxopt_portable=$withval, acx_maxopt_portable=no)
+
+# Try to determine "good" native compiler flags if none specified via CFLAGS
+if test "$ac_test_CFLAGS" != "set"; then
+ CFLAGS=""
+ case $ax_cv_c_compiler_vendor in
+ dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
+ if test "x$acx_maxopt_portable" = xno; then
+ CFLAGS="$CFLAGS -arch host"
+ fi;;
+
+ sun) CFLAGS="-native -fast -xO5 -dalign"
+ if test "x$acx_maxopt_portable" = xyes; then
+ CFLAGS="$CFLAGS -xarch=generic"
+ fi;;
+
+ hp) CFLAGS="+Oall +Optrs_ansi +DSnative"
+ if test "x$acx_maxopt_portable" = xyes; then
+ CFLAGS="$CFLAGS +DAportable"
+ fi;;
+
+ ibm) if test "x$acx_maxopt_portable" = xno; then
+ xlc_opt="-qarch=auto -qtune=auto"
+ else
+ xlc_opt="-qtune=auto"
+ fi
+ AX_CHECK_COMPILE_FLAG($xlc_opt,
+ CFLAGS="-O3 -qansialias -w $xlc_opt",
+ [CFLAGS="-O3 -qansialias -w"
+ echo "******************************************************"
+ echo "* You seem to have the IBM C compiler. It is *"
+ echo "* recommended for best performance that you use: *"
+ echo "* *"
+ echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
+ echo "* ^^^ ^^^ *"
+ echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *"
+ echo "* CPU you have. (Set the CFLAGS environment var. *"
+ echo "* and re-run configure.) For more info, man cc. *"
+ echo "******************************************************"])
+ ;;
+
+ intel) CFLAGS="-O3 -ansi_alias"
+ if test "x$acx_maxopt_portable" = xno; then
+ icc_archflag=unknown
+ icc_flags=""
+ case $host_cpu in
+ i686*|x86_64*)
+ # icc accepts gcc assembly syntax, so these should work:
+ AX_GCC_X86_CPUID(0)
+ AX_GCC_X86_CPUID(1)
+ case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
+ *:756e6547:*:*) # Intel
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
+ *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
+ *f??:*:*:*) icc_flags="-xN -xW -xK";;
+ esac ;;
+ esac ;;
+ esac
+ if test "x$icc_flags" != x; then
+ for flag in $icc_flags; do
+ AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break])
+ done
+ fi
+ AC_MSG_CHECKING([for icc architecture flag])
+ AC_MSG_RESULT($icc_archflag)
+ if test "x$icc_archflag" != xunknown; then
+ CFLAGS="$CFLAGS $icc_archflag"
+ fi
+ fi
+ ;;
+
+ gnu)
+ # default optimization flags for gcc on all systems
+ CFLAGS="-O3 -fomit-frame-pointer"
+
+ # -malign-double for x86 systems
+ AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double")
+
+ # -fstrict-aliasing for gcc-2.95+
+ AX_CHECK_COMPILE_FLAG(-fstrict-aliasing,
+ CFLAGS="$CFLAGS -fstrict-aliasing")
+
+ # note that we enable "unsafe" fp optimization with other compilers, too
+ AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
+
+ AX_GCC_ARCHFLAG($acx_maxopt_portable)
+ ;;
+ esac
+
+ if test -z "$CFLAGS"; then
+ echo ""
+ echo "********************************************************"
+ echo "* WARNING: Don't know the best CFLAGS for this system *"
+ echo "* Use ./configure CFLAGS=... to specify your own flags *"
+ echo "* (otherwise, a default of CFLAGS=-O3 will be used) *"
+ echo "********************************************************"
+ echo ""
+ CFLAGS="-O3"
+ fi
+
+ AX_CHECK_COMPILE_FLAG($CFLAGS, [], [
+ echo ""
+ echo "********************************************************"
+ echo "* WARNING: The guessed CFLAGS don't seem to work with *"
+ echo "* your compiler. *"
+ echo "* Use ./configure CFLAGS=... to specify your own flags *"
+ echo "********************************************************"
+ echo ""
+ CFLAGS=""
+ ])
+
+fi
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4 b/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4
new file mode 100644
index 0000000..c22e37f
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_cflags_warn_all.m4
@@ -0,0 +1,121 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
+# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
+# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
+#
+# DESCRIPTION
+#
+# Try to find a compiler option that enables most reasonable warnings.
+#
+# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result
+# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default.
+#
+# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX,
+# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and
+# Intel compilers. For a given compiler, the Fortran flags are much more
+# experimental than their C equivalents.
+#
+# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS
+# - $2 add-value-if-not-found : nothing
+# - $3 action-if-found : add value to shellvariable
+# - $4 action-if-not-found : nothing
+#
+# NOTE: These macros depend on AX_APPEND_FLAG.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 13
+
+AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl
+AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
+VAR,[VAR="no, unknown"
+ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-warn all % -warn all" dnl Intel
+ "-pedantic % -Wall" dnl GCC
+ "-xstrconst % -v" dnl Solaris C
+ "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix
+ "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
+ "-ansi -ansiE % -fullwarn" dnl IRIX
+ "+ESlit % +w1" dnl HP-UX C
+ "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
+ "-h conform % -h msglevel 2" dnl Cray C (Unicos)
+ #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+ [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+FLAGS="$ac_save_[]FLAGS"
+])
+AS_VAR_POPDEF([FLAGS])dnl
+case ".$VAR" in
+ .ok|.ok,*) m4_ifvaln($3,$3) ;;
+ .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;;
+ *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+])dnl AX_FLAGS_WARN_ALL
+dnl implementation tactics:
+dnl the for-argument contains a list of options. The first part of
+dnl these does only exist to detect the compiler - usually it is
+dnl a global option to enable -ansi or -extrawarnings. All other
+dnl compilers will fail about it. That was needed since a lot of
+dnl compilers will give false positives for some option-syntax
+dnl like -Woption or -Xoption as they think of it is a pass-through
+dnl to later compile stages or something. The "%" is used as a
+dnl delimiter. A non-option comment can be given after "%%" marks
+dnl which will be shown but not added to the respective C/CXXFLAGS.
+
+AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([C])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([C])
+])
+
+AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([C++])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([C++])
+])
+
+AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl
+AC_LANG_PUSH([Fortran])
+AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
+AC_LANG_POP([Fortran])
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4 b/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4
new file mode 100644
index 0000000..c3a8d69
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_check_compile_flag.m4
@@ -0,0 +1,72 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
+#
+# DESCRIPTION
+#
+# Check whether the given FLAG works with the current language's compiler
+# or gives an error. (Warnings, however, are ignored)
+#
+# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+# success/failure.
+#
+# If EXTRA-FLAGS is defined, it is added to the current language's default
+# flags (e.g. CFLAGS) when the check is done. The check is thus made with
+# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
+# force the compiler to issue an error when a bad flag is given.
+#
+# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 2
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+ _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
+ [AS_VAR_SET(CACHEVAR,[yes])],
+ [AS_VAR_SET(CACHEVAR,[no])])
+ _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
+ [m4_default([$2], :)],
+ [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4 b/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4
new file mode 100644
index 0000000..73e32ea
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_compiler_vendor.m4
@@ -0,0 +1,84 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_COMPILER_VENDOR
+#
+# DESCRIPTION
+#
+# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
+# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
+# watcom, etc. The vendor is returned in the cache variable
+# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2008 Matteo Frigo
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 11
+
+AC_DEFUN([AX_COMPILER_VENDOR],
+[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+ [# note: don't check for gcc first since some other compilers define __GNUC__
+ vendors="intel: __ICC,__ECC,__INTEL_COMPILER
+ ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__
+ pathscale: __PATHCC__,__PATHSCALE__
+ clang: __clang__
+ gnu: __GNUC__
+ sun: __SUNPRO_C,__SUNPRO_CC
+ hp: __HP_cc,__HP_aCC
+ dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
+ borland: __BORLANDC__,__TURBOC__
+ comeau: __COMO__
+ cray: _CRAYC
+ kai: __KCC
+ lcc: __LCC__
+ sgi: __sgi,sgi
+ microsoft: _MSC_VER
+ metrowerks: __MWERKS__
+ watcom: __WATCOMC__
+ portland: __PGI
+ unknown: UNKNOWN"
+ for ventest in $vendors; do
+ case $ventest in
+ *:) vendor=$ventest; continue ;;
+ *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
+ esac
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
+ #if !($vencpp)
+ thisisanerror;
+ #endif
+ ])], [break])
+ done
+ ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1`
+ ])
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_configure_args.m4 b/Modules/_ctypes/libffi/m4/ax_configure_args.m4
new file mode 100644
index 0000000..0726b1b
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_configure_args.m4
@@ -0,0 +1,70 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_configure_args.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CONFIGURE_ARGS
+#
+# DESCRIPTION
+#
+# Helper macro for AX_ENABLE_BUILDDIR.
+#
+# The traditional way of starting a subdir-configure is running the script
+# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have
+# to rely on eval'ing $ac_configure_args however some old autoconf
+# versions do not provide that. To ensure maximum portability of autoconf
+# extension macros this helper can be AC_REQUIRE'd so that
+# $ac_configure_args will alsways be present.
+#
+# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is
+# spoiled now and must be replaced by "eval + exit $?".
+#
+# Example:
+#
+# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl
+# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl
+# eval $SHELL $ac_configure_args || exit $?
+# ...])
+#
+# LICENSE
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 9
+
+AC_DEFUN([AX_CONFIGURE_ARGS],[
+ # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args
+ if test "${ac_configure_args+set}" != "set" ; then
+ ac_configure_args=
+ for ac_arg in ${1+"[$]@"}; do
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ done
+ fi
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4 b/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4
new file mode 100644
index 0000000..3fb8731
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_enable_builddir.m4
@@ -0,0 +1,300 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])]
+#
+# DESCRIPTION
+#
+# If the current configure was run within the srcdir then we move all
+# configure-files into a subdir and let the configure steps continue
+# there. We provide an option --disable-builddir to suppress the move into
+# a separate builddir.
+#
+# Defaults:
+#
+# $1 = $host (overridden with $HOST)
+# $2 = Makefile.mk
+# $3 = -all
+#
+# This macro must be called before AM_INIT_AUTOMAKE. It creates a default
+# toplevel srcdir Makefile from the information found in the created
+# toplevel builddir Makefile. It just copies the variables and
+# rule-targets, each extended with a default rule-execution that recurses
+# into the build directory of the current "HOST". You can override the
+# auto-dection through `config.guess` and build-time of course, as in
+#
+# make HOST=i386-mingw-cross
+#
+# which can of course set at configure time as well using
+#
+# configure --host=i386-mingw-cross
+#
+# After the default has been created, additional rules can be appended
+# that will not just recurse into the subdirectories and only ever exist
+# in the srcdir toplevel makefile - these parts are read from the $2 =
+# Makefile.mk file
+#
+# The automatic rules are usually scanning the toplevel Makefile for lines
+# like '#### $host |$builddir' to recognize the place where to recurse
+# into. Usually, the last one is the only one used. However, almost all
+# targets have an additional "*-all" rule which makes the script to
+# recurse into _all_ variants of the current HOST (!!) setting. The "-all"
+# suffix can be overriden for the macro as well.
+#
+# a special rule is only given for things like "dist" that will copy the
+# tarball from the builddir to the sourcedir (or $(PUB)) for reason of
+# convenience.
+#
+# LICENSE
+#
+# Copyright (c) 2009 Guido U. Draheim <guidod@gmx.de>
+# Copyright (c) 2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 23
+
+AC_DEFUN([AX_ENABLE_BUILDDIR],[
+AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
+AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl
+AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+SUB="."
+AC_ARG_ENABLE([builddir], AS_HELP_STRING(
+ [--disable-builddir],[disable automatic build in subdir of sources])
+ ,[SUB="$enableval"], [SUB="auto"])
+if test ".$ac_srcdir_defaulted" != ".no" ; then
+if test ".$srcdir" = ".." ; then
+ if test -f config.status ; then
+ AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build)
+ else
+ test ".$SUB" = "." && SUB="."
+ test ".$SUB" = ".no" && SUB="."
+ test ".$TARGET" = "." && TARGET="$target"
+ test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])"
+ if test ".$SUB" != ".." ; then # we know where to go and
+ AS_MKDIR_P([$SUB])
+ echo __.$SUB.__ > $SUB/conftest.tmp
+ cd $SUB
+ if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then
+ rm conftest.tmp
+ AC_MSG_RESULT([continue configure in default builddir "./$SUB"])
+ else
+ AC_MSG_ERROR([could not change to default builddir "./$SUB"])
+ fi
+ srcdir=`echo "$SUB" |
+ sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'`
+ # going to restart from subdirectory location
+ test -f $srcdir/config.log && mv $srcdir/config.log .
+ test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h .
+ test -f $srcdir/conftest.log && mv $srcdir/conftest.log .
+ test -f $srcdir/$cache_file && mv $srcdir/$cache_file .
+ AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"})
+ case "[$]0" in # restart
+ [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+ *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+ esac ; exit $?
+ fi
+ fi
+fi fi
+test ".$SUB" = ".auto" && SUB="."
+dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec"
+AC_PATH_PROG(SED,gsed sed, sed)
+AUX="$am_aux_dir"
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SUB])dnl
+AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status ..............
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl
+AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+pushdef([END],[Makefile.mk])dnl
+pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl
+ SRC="$ax_enable_builddir_srcdir"
+ if test ".$SUB" = ".." ; then
+ if test -f "$TOP/Makefile" ; then
+ AC_MSG_NOTICE([skipping TOP/Makefile - left untouched])
+ else
+ AC_MSG_NOTICE([skipping TOP/Makefile - not created])
+ fi
+ else
+ if test -f "$SRC/Makefile" ; then
+ a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile`
+ test "$a" != "$b" && rm "$SRC/Makefile"
+ fi
+ if test -f "$SRC/Makefile" ; then
+ echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk
+ echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk
+ eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null"
+ if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null
+ then rm $SRC/Makefile ; fi
+ cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING
+ fi
+ if test ! -f "$SRC/Makefile" ; then
+ AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile])
+ x='`' ; cat >$tmp/conftemp.sed <<_EOF
+/^\$/n
+x
+/^\$/bS
+x
+/\\\\\$/{H;d;}
+{H;s/.*//;x;}
+bM
+:S
+x
+/\\\\\$/{h;d;}
+{h;s/.*//;x;}
+:M
+s/\\(\\n\\) /\\1 /g
+/^ /d
+/^[[ ]]*[[\\#]]/d
+/^VPATH *=/d
+s/^srcdir *=.*/srcdir = ./
+s/^top_srcdir *=.*/top_srcdir = ./
+/[[:=]]/!d
+/^\\./d
+dnl Now handle rules (i.e. lines containing ":" but not " = ").
+/ = /b
+/ .= /b
+/:/!b
+s/:.*/:/
+s/ / /g
+s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g
+s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/
+s/ / /g
+/^all all[]_ALL[[ :]]/i\\
+all-configured : all[]_ALL
+dnl dist-all exists... and would make for dist-all-all
+s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g
+/[]_ALL[]_ALL/d
+a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\
+ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done
+dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree)
+/dist[]_ALL *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\
+ ; if test "\$\$found" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\
+ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree)
+/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\
+ ; if test "\$\$found" -eq "0" ; then : \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\
+ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "distclean" removes all local builddirs completely
+/distclean[]_ALL *:/a\\
+ @ HOST="\$(HOST)\" \\\\\\
+ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\
+ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\
+ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\
+ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\
+ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\
+ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile
+_EOF
+ cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING
+ $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile
+ if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then
+ AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])])
+ cat $SRC/END >>$SRC/Makefile
+ fi ; xxxx="####"
+ echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile
+ # sanity check
+ if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then
+ AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts])
+ $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \
+ >$SRC/Makefile~
+ (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null
+ fi
+ else
+ xxxx="\\#\\#\\#\\#"
+ # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed
+ echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed
+ $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp
+ cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING
+ cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING
+ if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then
+ AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure])
+ rm "$tmp/mkfile.tmp"
+ else
+ AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure])
+ mv "$tmp/mkfile.tmp" "$SRC/Makefile"
+ fi
+ fi
+ AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)])
+ xxxx="####"
+ echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile
+ fi
+popdef([END])dnl
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SRC])dnl
+AS_VAR_POPDEF([TOP])dnl
+AS_VAR_POPDEF([SUB])dnl
+],[dnl
+ax_enable_builddir_srcdir="$srcdir" # $srcdir
+ax_enable_builddir_host="$HOST" # $HOST / $host
+ax_enable_builddir_version="$VERSION" # $VERSION
+ax_enable_builddir_package="$PACKAGE" # $PACKAGE
+ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX
+ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED
+ax_enable_builddir="$ax_enable_builddir" # $SUB
+])dnl
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4 b/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4
new file mode 100644
index 0000000..2611bab
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_gcc_archflag.m4
@@ -0,0 +1,215 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
+#
+# DESCRIPTION
+#
+# This macro tries to guess the "native" arch corresponding to the target
+# architecture for use with gcc's -march=arch or -mtune=arch flags. If
+# found, the cache variable $ax_cv_gcc_archflag is set to this flag and
+# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to
+# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
+# to add $ax_cv_gcc_archflag to the end of $CFLAGS.
+#
+# PORTABLE? should be either [yes] (default) or [no]. In the former case,
+# the flag is set to -mtune (or equivalent) so that the architecture is
+# only used for tuning, but the instruction set used is still portable. In
+# the latter case, the flag is set to -march (or equivalent) so that
+# architecture-specific instructions are enabled.
+#
+# The user can specify --with-gcc-arch=<arch> in order to override the
+# macro's choice of architecture, or --without-gcc-arch to disable this.
+#
+# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
+# called unless the user specified --with-gcc-arch manually.
+#
+# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID
+#
+# (The main emphasis here is on recent CPUs, on the principle that doing
+# high-performance computing on old hardware is uncommon.)
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2008 Matteo Frigo
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 10
+
+AC_DEFUN([AX_GCC_ARCHFLAG],
+[AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_CANONICAL_HOST])
+
+AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
+ ax_gcc_arch=$withval, ax_gcc_arch=yes)
+
+AC_MSG_CHECKING([for gcc architecture flag])
+AC_MSG_RESULT([])
+AC_CACHE_VAL(ax_cv_gcc_archflag,
+[
+ax_cv_gcc_archflag="unknown"
+
+if test "$GCC" = yes; then
+
+if test "x$ax_gcc_arch" = xyes; then
+ax_gcc_arch=""
+if test "$cross_compiling" = no; then
+case $host_cpu in
+ i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
+ AX_GCC_X86_CPUID(0)
+ AX_GCC_X86_CPUID(1)
+ case $ax_cv_gcc_x86_cpuid_0 in
+ *:756e6547:*:*) # Intel
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
+ *5??:*:*:*) ax_gcc_arch=pentium ;;
+ *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+ *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+ *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+ *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
+ *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+ *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
+ *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
+ case $host_cpu in
+ x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
+ *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
+ esac ;;
+ *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
+ esac ;;
+ *:68747541:*:*) # AMD
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
+ *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
+ *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
+ *60?:*:*:*) ax_gcc_arch=k7 ;;
+ *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
+ *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
+ *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
+ *6[[68a]]?:*:*:*)
+ AX_GCC_X86_CPUID(0x80000006) # L2 cache size
+ case $ax_cv_gcc_x86_cpuid_0x80000006 in
+ *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
+ ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
+ *) ax_gcc_arch="athlon-4 athlon k7" ;;
+ esac ;;
+ *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
+ *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
+ *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
+ *f??:*:*:*) ax_gcc_arch="k8" ;;
+ esac ;;
+ *:746e6543:*:*) # IDT
+ case $ax_cv_gcc_x86_cpuid_1 in
+ *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
+ *58?:*:*:*) ax_gcc_arch=winchip2 ;;
+ *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
+ *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
+ esac ;;
+ esac
+ if test x"$ax_gcc_arch" = x; then # fallback
+ case $host_cpu in
+ i586*) ax_gcc_arch=pentium ;;
+ i686*) ax_gcc_arch=pentiumpro ;;
+ esac
+ fi
+ ;;
+
+ sparc*)
+ AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
+ cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
+ cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
+ case $cputype in
+ *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
+ *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
+ *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
+ *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
+ *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
+ *cypress*) ax_gcc_arch=cypress ;;
+ esac ;;
+
+ alphaev5) ax_gcc_arch=ev5 ;;
+ alphaev56) ax_gcc_arch=ev56 ;;
+ alphapca56) ax_gcc_arch="pca56 ev56" ;;
+ alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
+ alphaev6) ax_gcc_arch=ev6 ;;
+ alphaev67) ax_gcc_arch=ev67 ;;
+ alphaev68) ax_gcc_arch="ev68 ev67" ;;
+ alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
+ alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
+ alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
+
+ powerpc*)
+ cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
+ cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
+ case $cputype in
+ *750*) ax_gcc_arch="750 G3" ;;
+ *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
+ *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
+ *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
+ *970*) ax_gcc_arch="970 G5 power4";;
+ *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
+ *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
+ 603ev|8240) ax_gcc_arch="$cputype 603e 603";;
+ *) ax_gcc_arch=$cputype ;;
+ esac
+ ax_gcc_arch="$ax_gcc_arch powerpc"
+ ;;
+esac
+fi # not cross-compiling
+fi # guess arch
+
+if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
+for arch in $ax_gcc_arch; do
+ if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
+ flags="-mtune=$arch"
+ # -mcpu=$arch and m$arch generate nonportable code on every arch except
+ # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr.
+ case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
+ else
+ flags="-march=$arch -mcpu=$arch -m$arch"
+ fi
+ for flag in $flags; do
+ AX_CHECK_COMPILE_FLAG($flag, [ax_cv_gcc_archflag=$flag; break])
+ done
+ test "x$ax_cv_gcc_archflag" = xunknown || break
+done
+fi
+
+fi # $GCC=yes
+])
+AC_MSG_CHECKING([for gcc architecture flag])
+AC_MSG_RESULT($ax_cv_gcc_archflag)
+if test "x$ax_cv_gcc_archflag" = xunknown; then
+ m4_default([$3],:)
+else
+ m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
+fi
+])
diff --git a/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4 b/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4
new file mode 100644
index 0000000..7d46fee
--- /dev/null
+++ b/Modules/_ctypes/libffi/m4/ax_gcc_x86_cpuid.m4
@@ -0,0 +1,79 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_GCC_X86_CPUID(OP)
+#
+# DESCRIPTION
+#
+# On Pentium and later x86 processors, with gcc or a compiler that has a
+# compatible syntax for inline assembly instructions, run a small program
+# that executes the cpuid instruction with input OP. This can be used to
+# detect the CPU type.
+#
+# On output, the values of the eax, ebx, ecx, and edx registers are stored
+# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
+# ax_cv_gcc_x86_cpuid_OP.
+#
+# If the cpuid instruction fails (because you are running a
+# cross-compiler, or because you are not using gcc, or because you are on
+# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
+# is set to the string "unknown".
+#
+# This macro mainly exists to be used in AX_GCC_ARCHFLAG.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2008 Matteo Frigo
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 7
+
+AC_DEFUN([AX_GCC_X86_CPUID],
+[AC_REQUIRE([AC_PROG_CC])
+AC_LANG_PUSH([C])
+AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
+ int op = $1, eax, ebx, ecx, edx;
+ FILE *f;
+ __asm__("cpuid"
+ : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+ : "a" (op));
+ f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+ fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+ fclose(f);
+ return 0;
+])],
+ [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
+ [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
+ [ax_cv_gcc_x86_cpuid_$1=unknown])])
+AC_LANG_POP([C])
+])
diff --git a/Modules/_ctypes/libffi/m4/libtool.m4 b/Modules/_ctypes/libffi/m4/libtool.m4
index 671cde1..828104c 100644
--- a/Modules/_ctypes/libffi/m4/libtool.m4
+++ b/Modules/_ctypes/libffi/m4/libtool.m4
@@ -1,7 +1,8 @@
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
#
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is free software; the Free Software Foundation gives
@@ -10,7 +11,8 @@
m4_define([_LT_COPYING], [dnl
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is part of GNU Libtool.
@@ -37,7 +39,7 @@ m4_define([_LT_COPYING], [dnl
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
])
-# serial 56 LT_INIT
+# serial 57 LT_INIT
# LT_PREREQ(VERSION)
@@ -66,6 +68,7 @@ esac
# ------------------
AC_DEFUN([LT_INIT],
[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
AC_BEFORE([$0], [LT_LANG])dnl
AC_BEFORE([$0], [LT_OUTPUT])dnl
AC_BEFORE([$0], [LTDL_INIT])dnl
@@ -82,6 +85,8 @@ AC_REQUIRE([LTVERSION_VERSION])dnl
AC_REQUIRE([LTOBSOLETE_VERSION])dnl
m4_require([_LT_PROG_LTMAIN])dnl
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
dnl Parse OPTIONS
_LT_SET_OPTIONS([$0], [$1])
@@ -118,7 +123,7 @@ m4_defun([_LT_CC_BASENAME],
*) break;;
esac
done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
])
@@ -138,6 +143,11 @@ m4_defun([_LT_FILEUTILS_DEFAULTS],
m4_defun([_LT_SETUP],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
_LT_DECL([], [host_alias], [0], [The host system])dnl
_LT_DECL([], [host], [0])dnl
_LT_DECL([], [host_os], [0])dnl
@@ -160,10 +170,13 @@ _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
m4_require([_LT_CMD_RELOAD])dnl
m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
_LT_CONFIG_LIBTOOL_INIT([
# See if we are running on zsh, and set the options which allow our
@@ -179,7 +192,6 @@ fi
_LT_CHECK_OBJDIR
m4_require([_LT_TAG_COMPILER])dnl
-_LT_PROG_ECHO_BACKSLASH
case $host_os in
aix3*)
@@ -193,23 +205,6 @@ aix3*)
;;
esac
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
# Global variables:
ofile=libtool
can_build_shared=yes
@@ -250,6 +245,28 @@ _LT_CONFIG_COMMANDS
])# _LT_SETUP
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
# _LT_PROG_LTMAIN
# ---------------
# Note that this code is called both from `configure', and `config.status'
@@ -408,7 +425,7 @@ m4_define([_lt_decl_all_varnames],
# declaration there will have the same value as in `configure'. VARNAME
# must have a single quote delimited value for this to work.
m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
# _LT_CONFIG_STATUS_DECLARATIONS
@@ -418,7 +435,7 @@ m4_define([_LT_CONFIG_STATUS_DECLARE],
# embedded single quotes properly. In configure, this macro expands
# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
#
-# <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
[m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
@@ -517,12 +534,20 @@ LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
# Quote evaled strings.
for var in lt_decl_all_varnames([[ \
]], lt_decl_quote_varnames); do
- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -533,9 +558,9 @@ done
# Double-quote double-evaled strings.
for var in lt_decl_all_varnames([[ \
]], lt_decl_dquote_varnames); do
- case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -543,16 +568,38 @@ for var in lt_decl_all_varnames([[ \
esac
done
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\[$]0 --fallback-echo"')dnl "
- lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
- ;;
-esac
-
_LT_OUTPUT_LIBTOOL_INIT
])
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable. If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins. After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script. The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
# LT_OUTPUT
# ---------
@@ -562,20 +609,11 @@ _LT_OUTPUT_LIBTOOL_INIT
AC_DEFUN([LT_OUTPUT],
[: ${CONFIG_LT=./config.lt}
AC_MSG_NOTICE([creating $CONFIG_LT])
-cat >"$CONFIG_LT" <<_LTEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate a libtool stub with the current configuration.
-
-lt_cl_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_LTEOF
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
cat >>"$CONFIG_LT" <<\_LTEOF
-AS_SHELL_SANITIZE
-_AS_PREPARE
-
-exec AS_MESSAGE_FD>&1
+lt_cl_silent=false
exec AS_MESSAGE_LOG_FD>>config.log
{
echo
@@ -601,7 +639,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
configured by $[0], generated by m4_PACKAGE_STRING.
-Copyright (C) 2008 Free Software Foundation, Inc.
+Copyright (C) 2011 Free Software Foundation, Inc.
This config.lt script is free software; the Free Software Foundation
gives unlimited permision to copy, distribute and modify it."
@@ -646,15 +684,13 @@ chmod +x "$CONFIG_LT"
# appending to config.log, which fails on DOS, as config.log is still kept
# open by configure. Here we exec the FD to /dev/null, effectively closing
# config.log, so it can be properly (re)opened and appended to by config.lt.
-if test "$no_create" != yes; then
- lt_cl_success=:
- test "$silent" = yes &&
- lt_config_lt_args="$lt_config_lt_args --quiet"
- exec AS_MESSAGE_LOG_FD>/dev/null
- $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
- exec AS_MESSAGE_LOG_FD>>config.log
- $lt_cl_success || AS_EXIT(1)
-fi
+lt_cl_success=:
+test "$silent" = yes &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
])# LT_OUTPUT
@@ -717,15 +753,12 @@ _LT_EOF
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- _LT_PROG_XSI_SHELLFNS
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
- sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
+ _LT_PROG_REPLACE_SHELLFNS
- mv -f "$cfgfile" "$ofile" ||
+ mv -f "$cfgfile" "$ofile" ||
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
],
@@ -770,6 +803,7 @@ AC_DEFUN([LT_LANG],
m4_case([$1],
[C], [_LT_LANG(C)],
[C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
[Java], [_LT_LANG(GCJ)],
[Fortran 77], [_LT_LANG(F77)],
[Fortran], [_LT_LANG(FC)],
@@ -791,6 +825,31 @@ m4_defun([_LT_LANG],
])# _LT_LANG
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_GO. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC], [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+ fi
+fi
+if test -z "$GOC"; then
+ AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
# _LT_LANG_DEFAULT_CONFIG
# -----------------------
m4_defun([_LT_LANG_DEFAULT_CONFIG],
@@ -821,6 +880,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
m4_ifdef([LT_PROG_GCJ],
[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+ [LT_LANG(GO)],
+ [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
AC_PROVIDE_IFELSE([LT_PROG_RC],
[LT_LANG(RC)],
[m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
@@ -831,11 +894,13 @@ AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
dnl AC_DEFUN([AC_LIBTOOL_F77], [])
dnl AC_DEFUN([AC_LIBTOOL_FC], [])
dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
# _LT_TAG_COMPILER
@@ -921,7 +986,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c 2>conftest.err
_lt_result=$?
- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test $_lt_result -eq 0; then
lt_cv_apple_cc_single_mod=yes
else
cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -929,6 +1000,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
rm -rf libconftest.dylib*
rm -f conftest.*
fi])
+
AC_CACHE_CHECK([for -exported_symbols_list linker flag],
[lt_cv_ld_exported_symbols_list],
[lt_cv_ld_exported_symbols_list=no
@@ -940,6 +1012,34 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
[lt_cv_ld_exported_symbols_list=no])
LDFLAGS="$save_LDFLAGS"
])
+
+ AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+ [lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+ echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+ $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+ ])
case $host_os in
rhapsody* | darwin1.[[012]])
_lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
@@ -967,7 +1067,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
else
_lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
fi
- if test "$DSYMUTIL" != ":"; then
+ if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
_lt_dsymutil='~$DSYMUTIL $lib || :'
else
_lt_dsymutil=
@@ -977,8 +1077,8 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
])
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
# Checks for linker and compiler features on darwin
m4_defun([_LT_DARWIN_LINKER_FEATURES],
[
@@ -987,7 +1087,13 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+ if test "$lt_cv_ld_force_load" = "yes"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+ [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+ else
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+ fi
_LT_TAGVAR(link_all_deplibs, $1)=yes
_LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
case $cc_basename in
@@ -995,7 +1101,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
*) _lt_dar_can_shared=$GCC ;;
esac
if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=echo
+ output_verbose_link_cmd=func_echo_all
_LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
_LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
_LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
@@ -1011,203 +1117,142 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
fi
])
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
# Links a minimal program and checks the executable
# for the system default hardcoded library path. In most cases,
# this is /usr/lib:/lib, but when the MPI compilers are used
# the location of the communication and MPI libs are included too.
# If we don't find anything, use the default library path according
# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
m4_defun([_LT_SYS_MODULE_PATH_AIX],
[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\(.*\)$/\1/
- p
- }
- }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
- aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+if test "${lt_cv_aix_libpath+set}" = set; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+ lt_aix_libpath_sed='[
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }]'
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi],[])
+ if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+ fi
+ ])
+ aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
])# _LT_SYS_MODULE_PATH_AIX
# _LT_SHELL_INIT(ARG)
# -------------------
m4_define([_LT_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
- [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
- [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_SHELL_INIT
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
# _LT_PROG_ECHO_BACKSLASH
# -----------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[_LT_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
- # Remove one level of quotation (which was required for Make).
- ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
- ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X[$]1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
- # Yippee, $ECHO works!
- :
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
else
- # Restart under the correct shell.
- exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<_LT_EOF
-[$]*
-_LT_EOF
- exit 0
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
fi
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
- if test "X${echo_test_string+set}" != Xset; then
- # find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
- { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
- then
- break
- fi
- done
- fi
-
- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- :
- else
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for dir in $PATH /usr/ucb; do
- IFS="$lt_save_ifs"
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- ECHO="$dir/echo"
- break
- fi
- done
- IFS="$lt_save_ifs"
-
- if test "X$ECHO" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- ECHO='print -r'
- elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running configure again with it.
- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
- else
- # Try using printf.
- ECHO='printf %s\n'
- if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # Cool, printf works
- :
- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
- elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
- if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
- then
- break
- fi
- prev="$cmd"
- done
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO "$*"
+}
- if test "$prev" != 'sed 50q "[$]0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
- else
- # Oops. We lost completely, so just stick with echo.
- ECHO=echo
- fi
- fi
- fi
- fi
- fi
-fi
+case "$ECHO" in
+ printf*) AC_MSG_RESULT([printf]) ;;
+ print*) AC_MSG_RESULT([print -r]) ;;
+ *) AC_MSG_RESULT([cat]) ;;
+esac
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
- lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test "X`printf %s $ECHO`" = "X$ECHO" \
+ || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-AC_SUBST(lt_ECHO)
-])
_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1],
- [An echo program that does not interpret backslashes])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
])# _LT_PROG_ECHO_BACKSLASH
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[ --with-sysroot[=DIR] Search for dependent libraries within DIR
+ (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted. We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+ if test "$GCC" = yes; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ AC_MSG_RESULT([${with_sysroot}])
+ AC_MSG_ERROR([The sysroot must be an absolute path.])
+ ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
# _LT_ENABLE_LOCK
# ---------------
m4_defun([_LT_ENABLE_LOCK],
@@ -1236,7 +1281,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
if test "$lt_cv_prog_gnu_ld" = yes; then
case `/usr/bin/file conftest.$ac_objext` in
@@ -1329,14 +1374,27 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
CFLAGS="$SAVE_CFLAGS"
fi
;;
-sparc*-*solaris*)
+*-*solaris*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
- yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ yes*)
+ case $host in
+ i?86-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD="${LD-ld}_sol2"
+ fi
+ ;;
*)
if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
LD="${LD-ld} -64"
@@ -1354,14 +1412,47 @@ need_locks="$enable_libtool_lock"
])# _LT_ENABLE_LOCK
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+ [lt_cv_ar_at_file=no
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+ [echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+ AC_TRY_EVAL([lt_ar_try])
+ if test "$ac_status" -eq 0; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ AC_TRY_EVAL([lt_ar_try])
+ if test "$ac_status" -ne 0; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+ ])
+ ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+ [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
# _LT_CMD_OLD_ARCHIVE
# -------------------
m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
+[_LT_PROG_AR
AC_CHECK_TOOL(STRIP, strip, :)
test -z "$STRIP" && STRIP=:
@@ -1380,18 +1471,27 @@ old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
;;
*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
;;
esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
_LT_DECL([], [old_postinstall_cmds], [2])
_LT_DECL([], [old_postuninstall_cmds], [2])
_LT_TAGDECL([], [old_archive_cmds], [2],
[Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+ [Whether to use a lock for old archive extraction])
])# _LT_CMD_OLD_ARCHIVE
@@ -1416,15 +1516,15 @@ AC_CACHE_CHECK([$1], [$2],
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
$2=yes
@@ -1464,7 +1564,7 @@ AC_CACHE_CHECK([$1], [$2],
if test -s conftest.err; then
# Append any errors to the config.log.
cat conftest.err 1>&AS_MESSAGE_LOG_FD
- $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
$SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
if diff conftest.exp conftest.er2 >/dev/null; then
$2=yes
@@ -1527,6 +1627,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=8192;
;;
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
amigaos*)
# On AmigaOS with pdksh, this test takes hours, literally.
# So we just punt and use a minimum line length of 8192.
@@ -1552,6 +1657,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=196608
;;
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -1591,8 +1701,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
- while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
- = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+ while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
test $i != 17 # 1/2 MB should be enough
do
i=`expr $i + 1`
@@ -1643,7 +1753,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
+[#line $LINENO "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -1684,7 +1794,13 @@ else
# endif
#endif
-void fnord() { int i=42;}
+/* When -fvisbility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
int main ()
{
void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
@@ -1693,7 +1809,11 @@ int main ()
if (self)
{
if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
/* dlclose (self); */
}
else
@@ -1869,16 +1989,16 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
- $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
$SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
@@ -2037,6 +2157,7 @@ m4_require([_LT_DECL_EGREP])dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_OBJDUMP])dnl
m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
AC_MSG_CHECKING([dynamic linker characteristics])
m4_if([$1],
[], [
@@ -2045,16 +2166,23 @@ if test "$GCC" = yes; then
darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
*) lt_awk_arg="/^libraries:/" ;;
esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
- if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+ *) lt_sed_strip_eq="s,=/,/,g" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
# if the path contains ";" then we assume it to be the separator
# otherwise default to the standard path separator (i.e. ":") - it is
# assumed that no part of a normal pathname contains ";" but that should
# okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
- else
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
# Ok, now we have the path, separated by spaces, we can step through it
# and add multilib dir if necessary.
lt_tmp_lt_search_path_spec=
@@ -2067,7 +2195,7 @@ if test "$GCC" = yes; then
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
fi
done
- lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS=" "; FS="/|\n";} {
lt_foo="";
lt_count=0;
@@ -2087,7 +2215,13 @@ BEGIN {RS=" "; FS="/|\n";} {
if (lt_foo != "") { lt_freq[[lt_foo]]++; }
if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
}'`
- sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi])
@@ -2113,7 +2247,7 @@ need_version=unknown
case $host_os in
aix3*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
shlibpath_var=LIBPATH
@@ -2122,7 +2256,7 @@ aix3*)
;;
aix[[4-9]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
@@ -2175,7 +2309,7 @@ amigaos*)
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
@@ -2187,7 +2321,7 @@ beos*)
;;
bsdi[[45]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
@@ -2206,8 +2340,9 @@ cygwin* | mingw* | pw32* | cegcc*)
need_version=no
need_lib_prefix=no
- case $GCC,$host_os in
- yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
postinstall_cmds='base_file=`basename \${file}`~
@@ -2228,36 +2363,83 @@ cygwin* | mingw* | pw32* | cegcc*)
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
- if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
- # It is most probably a Windows format PATH printed by
- # mingw gcc, but we are running on Cygwin. Gcc prints its search
- # path with ; separators, and with drive letters. We can handle the
- # drive letters (cygwin fileutils understands them), so leave them,
- # especially as we might pass files found there to a mingw objdump,
- # which wouldn't understand a cygwinified path. Ahh.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
;;
esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='${libname}.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec="$LIB"
+ if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
;;
*)
+ # Assume MSVC wrapper
library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ dynamic_linker='Win32 ld.exe'
;;
esac
- dynamic_linker='Win32 ld.exe'
# FIXME: first we should search . and the directory the executable is in
shlibpath_var=PATH
;;
@@ -2278,7 +2460,7 @@ m4_if([$1], [],[
;;
dgux*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
@@ -2286,10 +2468,6 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd1*)
- dynamic_linker=no
- ;;
-
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
@@ -2297,7 +2475,7 @@ freebsd* | dragonfly*)
objformat=`/usr/bin/objformat`
else
case $host_os in
- freebsd[[123]]*) objformat=aout ;;
+ freebsd[[23]].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
@@ -2315,7 +2493,7 @@ freebsd* | dragonfly*)
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
- freebsd2*)
+ freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[[01]]* | freebsdelf3.[[01]]*)
@@ -2335,12 +2513,26 @@ freebsd* | dragonfly*)
;;
gnu*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
@@ -2386,12 +2578,14 @@ hpux9* | hpux10* | hpux11*)
soname_spec='${libname}${release}${shared_ext}$major'
;;
esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
;;
interix[[3-9]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
@@ -2407,7 +2601,7 @@ irix5* | irix6* | nonstopux*)
nonstopux*) version_type=nonstopux ;;
*)
if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
@@ -2444,9 +2638,9 @@ linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
- version_type=linux
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2454,29 +2648,31 @@ linux* | k*bsd*-gnu)
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
+
# Some binutils ld are patched to set DT_RUNPATH
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
- LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
- [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
- [shlibpath_overrides_runpath=yes])])
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
+ AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+ [lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+ [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+ [lt_cv_shlibpath_overrides_runpath=yes])])
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+ ])
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
# This implies no fast_install, which is unacceptable.
# Some rework will be needed to allow for fast_install
# before this can be enabled.
hardcode_into_libs=yes
- # Add ABI-specific directories to the system library path.
- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
# Append ld.so.conf contents to the search path
if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
fi
# We used to test for /lib/ld.so.1 and disable shared libraries on
@@ -2488,6 +2684,18 @@ linux* | k*bsd*-gnu)
dynamic_linker='GNU/Linux ld.so'
;;
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
netbsd*)
version_type=sunos
need_lib_prefix=no
@@ -2507,7 +2715,7 @@ netbsd*)
;;
newsos6)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
@@ -2576,7 +2784,7 @@ rdos*)
;;
solaris*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2601,7 +2809,7 @@ sunos4*)
;;
sysv4 | sysv4.3*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -2625,7 +2833,7 @@ sysv4 | sysv4.3*)
sysv4*MP*)
if test -d /usr/nec ;then
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
soname_spec='$libname${shared_ext}.$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -2656,7 +2864,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
@@ -2666,7 +2874,7 @@ tpf*)
;;
uts4*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
soname_spec='${libname}${release}${shared_ext}$major'
shlibpath_var=LD_LIBRARY_PATH
@@ -2708,6 +2916,8 @@ _LT_DECL([], [library_names_spec], [1],
The last name is the one that the linker finds with -lNAME]])
_LT_DECL([], [soname_spec], [1],
[[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+ [Permission mode override for installation of shared libraries])
_LT_DECL([], [postinstall_cmds], [2],
[Command to use after installation of a shared archive])
_LT_DECL([], [postuninstall_cmds], [2],
@@ -2820,6 +3030,7 @@ AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
m4_require([_LT_DECL_SED])dnl
m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
AC_ARG_WITH([gnu-ld],
[AS_HELP_STRING([--with-gnu-ld],
@@ -2941,6 +3152,11 @@ case $reload_flag in
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test "$GCC" != yes; then
+ reload_cmds=false
+ fi
+ ;;
darwin*)
if test "$GCC" = yes; then
reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
@@ -2949,8 +3165,8 @@ case $host_os in
fi
;;
esac
-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_DECL([], [reload_cmds], [2])dnl
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
])# _LT_CMD_RELOAD
@@ -3002,16 +3218,18 @@ mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
- if ( file / ) >/dev/null 2>&1; then
+ # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+ if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
lt_cv_file_magic_cmd='$OBJDUMP -f'
fi
;;
-cegcc)
+cegcc*)
# use the weaker test based on 'objdump'. See mingw*.
lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
lt_cv_file_magic_cmd='$OBJDUMP -f'
@@ -3041,6 +3259,10 @@ gnu*)
lt_cv_deplibs_check_method=pass_all
;;
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
hpux10.20* | hpux11*)
lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
@@ -3049,11 +3271,11 @@ hpux10.20* | hpux11*)
lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
;;
hppa*64*)
- [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
;;
*)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
lt_cv_file_magic_test_file=/usr/lib/libc.sl
;;
esac
@@ -3074,12 +3296,12 @@ irix5* | irix6* | nonstopux*)
lt_cv_deplibs_check_method=pass_all
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
lt_cv_deplibs_check_method=pass_all
;;
-netbsd*)
+netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
else
@@ -3153,6 +3375,21 @@ tpf*)
;;
esac
])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -3160,7 +3397,11 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
_LT_DECL([], [deplibs_check_method], [1],
[Method to check whether dependent libraries are shared objects])
_LT_DECL([], [file_magic_cmd], [1],
- [Command to use when deplibs_check_method == "file_magic"])
+ [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+ [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+ [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
])# _LT_CHECK_MAGIC_METHOD
@@ -3217,7 +3458,19 @@ if test "$lt_cv_path_NM" != "no"; then
NM="$lt_cv_path_NM"
else
# Didn't find any BSD compatible name lister, look for dumpbin.
- AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+ case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
AC_SUBST([DUMPBIN])
if test "$DUMPBIN" != ":"; then
NM="$DUMPBIN"
@@ -3230,13 +3483,13 @@ _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
[lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+ (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
cat conftest.out >&AS_MESSAGE_LOG_FD
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
@@ -3251,6 +3504,67 @@ dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AM_PROG_NM], [])
dnl AC_DEFUN([AC_PROG_NM], [])
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+# -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh
+ # decide which to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+ [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+ [lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+ MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
# LT_LIB_M
# --------
@@ -3259,7 +3573,7 @@ AC_DEFUN([LT_LIB_M],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM=
case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
# These system don't have libm, or don't need it
;;
*-ncr-sysv4.3*)
@@ -3287,7 +3601,12 @@ m4_defun([_LT_COMPILER_NO_RTTI],
_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
if test "$GCC" = yes; then
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+ case $cc_basename in
+ nvcc*)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+ *)
+ _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+ esac
_LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
lt_cv_prog_compiler_rtti_exceptions,
@@ -3304,6 +3623,7 @@ _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([LT_PATH_NM])dnl
AC_REQUIRE([LT_PATH_LD])dnl
m4_require([_LT_DECL_SED])dnl
@@ -3371,8 +3691,8 @@ esac
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
# Handle CRLF in mingw tool chain
opt_cr=
@@ -3396,6 +3716,7 @@ for ac_symprfx in "" "_"; do
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK ['"\
" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
" \$ 0!~/External *\|/{next};"\
" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
@@ -3408,6 +3729,7 @@ for ac_symprfx in "" "_"; do
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -3429,7 +3751,7 @@ _LT_EOF
if AC_TRY_EVAL(ac_compile); then
# Now try to grab the symbols.
nlist=conftest.nm
- if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
mv -f "$nlist"T "$nlist"
@@ -3441,6 +3763,18 @@ _LT_EOF
if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data. */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -3452,7 +3786,7 @@ _LT_EOF
cat <<_LT_EOF >> conftest.$ac_ext
/* The mapping between symbol names and symbols. */
-const struct {
+LT@&t@_DLSYM_CONST struct {
const char *name;
void *address;
}
@@ -3478,15 +3812,15 @@ static const void *lt_preloaded_setup() {
_LT_EOF
# Now try linking the two files.
mv conftest.$ac_objext conftstm.$ac_objext
- lt_save_LIBS="$LIBS"
- lt_save_CFLAGS="$CFLAGS"
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
LIBS="conftstm.$ac_objext"
CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
pipe_works=yes
fi
- LIBS="$lt_save_LIBS"
- CFLAGS="$lt_save_CFLAGS"
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
else
echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
fi
@@ -3519,6 +3853,13 @@ else
AC_MSG_RESULT(ok)
fi
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
[Take the output of nm and produce a listing of raw symbols and C names])
_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
@@ -3529,6 +3870,8 @@ _LT_DECL([global_symbol_to_c_name_address],
_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
[lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
[Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+ [Specify filename containing input files for $NM])
]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3540,7 +3883,6 @@ _LT_TAGVAR(lt_prog_compiler_wl, $1)=
_LT_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_TAGVAR(lt_prog_compiler_static, $1)=
-AC_MSG_CHECKING([for $compiler option to produce PIC])
m4_if([$1], [CXX], [
# C++ specific cases for pic, static, wl, etc.
if test "$GXX" = yes; then
@@ -3591,6 +3933,11 @@ m4_if([$1], [CXX], [
# DJGPP does not support shared libraries at all
_LT_TAGVAR(lt_prog_compiler_pic, $1)=
;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
interix[[3-9]]*)
# Interix 3.x gcc -fpic/-fPIC options generate broken code.
# Instead, we relocate shared libraries at runtime.
@@ -3640,6 +3987,12 @@ m4_if([$1], [CXX], [
;;
esac
;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ m4_if([$1], [GCJ], [],
+ [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ ;;
dgux*)
case $cc_basename in
ec++*)
@@ -3696,7 +4049,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- linux* | k*bsd*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
case $cc_basename in
KCC*)
# KAI C++ Compiler
@@ -3729,8 +4082,8 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)=
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
- xlc* | xlC*)
- # IBM XL 8.0 on PPC
+ xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
@@ -3760,7 +4113,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
;;
*qnx* | *nto*)
# QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -3792,7 +4145,7 @@ m4_if([$1], [CXX], [
;;
solaris*)
case $cc_basename in
- CC*)
+ CC* | sunCC*)
# Sun C++ 4.2, 5.x and Centerline C++
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
@@ -3896,6 +4249,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ _LT_TAGVAR(lt_prog_compiler_static, $1)=
+ ;;
+
hpux*)
# PIC is the default for 64-bit PA HP-UX, but not for 32-bit
# PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
@@ -3938,6 +4297,15 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+ if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+ fi
+ ;;
+ esac
else
# PORTME Check for flag to pass linker flags through the system compiler.
case $host_os in
@@ -3980,7 +4348,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
- linux* | k*bsd*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
case $cc_basename in
# old Intel for x86_64 which still supported -KPIC.
ecc*)
@@ -4001,7 +4369,13 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
;;
- pgcc* | pgf77* | pgf90* | pgf95*)
+ nagfor*)
+ # NAG Fortran compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
@@ -4013,25 +4387,40 @@ m4_if([$1], [CXX], [
# All Alpha code is PIC.
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
- xl*)
- # IBM XL C 8.0/Fortran 10.1 on PPC
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
;;
*)
case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
*Sun\ C*)
# Sun C 5.9
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
;;
- *Sun\ F*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ *Intel*\ [[CF]]*Compiler*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ *Portland\ Group*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
;;
esac
;;
@@ -4063,7 +4452,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
case $cc_basename in
- f77* | f90* | f95*)
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
@@ -4120,9 +4509,11 @@ case $host_os in
_LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
;;
esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
- [How to pass a linker flag through the compiler])
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+ [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
#
# Check to make sure the PIC flag actually works.
@@ -4141,6 +4532,8 @@ fi
_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
[Additional compiler flags for building library objects])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+ [How to pass a linker flag through the compiler])
#
# Check to make sure the static flag actually works.
#
@@ -4161,6 +4554,7 @@ _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
m4_defun([_LT_LINKER_SHLIBS],
[AC_REQUIRE([LT_PATH_LD])dnl
AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_EGREP])dnl
m4_require([_LT_DECL_SED])dnl
@@ -4169,27 +4563,40 @@ m4_require([_LT_TAG_COMPILER])dnl
AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
m4_if([$1], [CXX], [
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
case $host_os in
aix[[4-9]]*)
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global defined
+ # symbols, whereas GNU nm marks them as "W".
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
else
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
_LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
- ;;
+ ;;
cygwin* | mingw* | cegcc*)
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
+ case $cc_basename in
+ cl*)
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | gnu*)
+ _LT_TAGVAR(link_all_deplibs, $1)=no
+ ;;
*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
+ ;;
esac
- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
], [
runpath_var=
_LT_TAGVAR(allow_undefined_flag, $1)=
@@ -4204,7 +4611,6 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -4249,10 +4655,39 @@ dnl Note also adjust exclude_expsyms for C++ above.
openbsd*)
with_gnu_ld=no
;;
+ linux* | k*bsd*-gnu | gnu*)
+ _LT_TAGVAR(link_all_deplibs, $1)=no
+ ;;
esac
_LT_TAGVAR(ld_shlibs, $1)=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
if test "$with_gnu_ld" = yes; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+ *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test "$lt_use_gnu_ld_interface" = yes; then
# If archive_cmds runs LD, not CC, wlarc should be empty
wlarc='${wl}'
@@ -4270,6 +4705,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
fi
supports_anon_versioning=no
case `$LD -v 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
*\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
@@ -4285,11 +4721,12 @@ dnl Note also adjust exclude_expsyms for C++ above.
_LT_TAGVAR(ld_shlibs, $1)=no
cat <<_LT_EOF 1>&2
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** Warning: the GNU linker, at least up to release 2.19, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
_LT_EOF
fi
@@ -4325,10 +4762,12 @@ _LT_EOF
# _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=no
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+ _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
@@ -4346,6 +4785,11 @@ _LT_EOF
fi
;;
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
interix[[3-9]]*)
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -4361,7 +4805,7 @@ _LT_EOF
_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
- gnu* | linux* | tpf* | k*bsd*-gnu)
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
tmp_diet=no
if test "$host_os" = linux-dietlibc; then
case $cc_basename in
@@ -4371,15 +4815,16 @@ _LT_EOF
if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
&& test "$tmp_diet" = no
then
- tmp_addflag=
+ tmp_addflag=' $pic_flag'
tmp_sharedflag='-shared'
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
- pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
@@ -4390,13 +4835,17 @@ _LT_EOF
lf95*) # Lahey Fortran 8.1
_LT_TAGVAR(whole_archive_flag_spec, $1)=
tmp_sharedflag='--shared' ;;
- xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
tmp_sharedflag='-qmkshrobj'
tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ ;;
esac
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
tmp_sharedflag='-G' ;;
*Sun\ F*) # Sun Fortran 8.3
@@ -4412,17 +4861,16 @@ _LT_EOF
fi
case $cc_basename in
- xlf*)
+ xlf* | bgf* | bgxlf* | mpixlf*)
# IBM XL Fortran 10.1 on PPC cannot create shared libs itself
_LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
- _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test "x$supports_anon_versioning" = xyes; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
;;
esac
@@ -4431,13 +4879,13 @@ _LT_EOF
fi
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
@@ -4455,8 +4903,8 @@ _LT_EOF
_LT_EOF
elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -4502,8 +4950,8 @@ _LT_EOF
*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -4543,8 +4991,10 @@ _LT_EOF
else
# If we're using GNU nm, then we don't want the "-C" option.
# -C means demangle to AIX nm, but means don't demangle with GNU nm
+ # Also, AIX nm treats weak defined symbols like other global
+ # defined symbols, whereas GNU nm marks them as "W".
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
else
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
fi
@@ -4606,6 +5056,7 @@ _LT_EOF
if test "$aix_use_runtimelinking" = yes; then
shared_flag="$shared_flag "'${wl}-G'
fi
+ _LT_TAGVAR(link_all_deplibs, $1)=no
else
# not using gcc
if test "$host_cpu" = ia64; then
@@ -4631,9 +5082,9 @@ _LT_EOF
_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
# Determine the default libpath from the value encoded in an
# empty executable.
- _LT_SYS_MODULE_PATH_AIX
+ _LT_SYS_MODULE_PATH_AIX([$1])
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
@@ -4642,14 +5093,19 @@ _LT_EOF
else
# Determine the default libpath from the value encoded in an
# empty executable.
- _LT_SYS_MODULE_PATH_AIX
+ _LT_SYS_MODULE_PATH_AIX([$1])
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
_LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
# This is similar to how AIX traditionally builds its shared libraries.
_LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
@@ -4681,20 +5137,64 @@ _LT_EOF
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- # FIXME: Should let the user specify the lib program.
- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
- _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+ esac
;;
darwin* | rhapsody*)
@@ -4707,10 +5207,6 @@ _LT_EOF
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
- freebsd1*)
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
@@ -4723,7 +5219,7 @@ _LT_EOF
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
+ freebsd2.*)
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -4732,7 +5228,7 @@ _LT_EOF
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
freebsd* | dragonfly*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -4740,7 +5236,7 @@ _LT_EOF
hpux9*)
if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
fi
@@ -4755,14 +5251,13 @@ _LT_EOF
;;
hpux10*)
- if test "$GCC" = yes -a "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
if test "$with_gnu_ld" = no; then
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
@@ -4774,16 +5269,16 @@ _LT_EOF
;;
hpux11*)
- if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ if test "$GCC" = yes && test "$with_gnu_ld" = no; then
case $host_cpu in
hppa*64*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
@@ -4795,7 +5290,14 @@ _LT_EOF
_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ m4_if($1, [], [
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ _LT_LINKER_OPTION([if $CC understands -b],
+ _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+ [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
;;
esac
fi
@@ -4823,19 +5325,34 @@ _LT_EOF
irix5* | irix6* | nonstopux*)
if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
# Try to use the -exported_symbol ld option, if it does not
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- AC_LINK_IFELSE(int foo(void) {},
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
- )
- LDFLAGS="$save_LDFLAGS"
+ # This should be the same for all languages, so no per-tag cache variable.
+ AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+ [lt_cv_irix_exported_symbol],
+ [save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ AC_LINK_IFELSE(
+ [AC_LANG_SOURCE(
+ [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+ [C++], [[int foo (void) { return 0; }]],
+ [Fortran 77], [[
+ subroutine foo
+ end]],
+ [Fortran], [[
+ subroutine foo
+ end]])])],
+ [lt_cv_irix_exported_symbol=yes],
+ [lt_cv_irix_exported_symbol=no])
+ LDFLAGS="$save_LDFLAGS"])
+ if test "$lt_cv_irix_exported_symbol" = yes; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ fi
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)='no'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
@@ -4844,7 +5361,7 @@ _LT_EOF
_LT_TAGVAR(link_all_deplibs, $1)=yes
;;
- netbsd*)
+ netbsd* | netbsdelf*-gnu)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
else
@@ -4897,17 +5414,17 @@ _LT_EOF
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_TAGVAR(hardcode_minus_L, $1)=yes
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
_LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
;;
osf3*)
if test "$GCC" = yes; then
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)='no'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
@@ -4917,13 +5434,13 @@ _LT_EOF
osf4* | osf5*) # as osf3* with the addition of -msym flag
if test "$GCC" = yes; then
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
else
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
# Both c and cxx compiler support -rpath directly
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -4936,9 +5453,9 @@ _LT_EOF
_LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
if test "$GCC" = yes; then
wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
else
case `$CC -V 2>&1` in
*"Compilers 5.0"*)
@@ -5114,36 +5631,38 @@ x|xyes)
# Test whether the compiler implicitly links with -lc since on some
# systems, -lgcc has to come before -lc. If gcc already passes -lc
# to ld, don't add -lc before -lgcc.
- AC_MSG_CHECKING([whether -lc should be explicitly linked in])
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
- pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
- _LT_TAGVAR(allow_undefined_flag, $1)=
- if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
- then
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- else
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- fi
- _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
- AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+ AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+ [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+ [$RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+ _LT_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+ then
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+ ])
+ _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
;;
esac
fi
@@ -5180,9 +5699,6 @@ _LT_TAGDECL([], [no_undefined_flag], [1],
_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
[Flag to hardcode $libdir into a binary during linking.
This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
- [[If ld is used when linking, flag to hardcode $libdir into a binary
- during linking. This must work even if $libdir does not exist]])
_LT_TAGDECL([], [hardcode_libdir_separator], [1],
[Whether we need a single "-rpath" flag with a separated argument])
_LT_TAGDECL([], [hardcode_direct], [0],
@@ -5208,8 +5724,6 @@ _LT_TAGDECL([], [inherit_rpath], [0],
to runtime path list])
_LT_TAGDECL([], [link_all_deplibs], [0],
[Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
- [Fix the shell variable $srcfile for the compiler])
_LT_TAGDECL([], [always_export_symbols], [0],
[Set to "yes" if exported symbols are required])
_LT_TAGDECL([], [export_symbols_cmds], [2],
@@ -5220,6 +5734,8 @@ _LT_TAGDECL([], [include_expsyms], [1],
[Symbols that must always be exported])
_LT_TAGDECL([], [prelink_cmds], [2],
[Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+ [Commands necessary for finishing linking programs])
_LT_TAGDECL([], [file_list_spec], [1],
[Specify filename containing input files])
dnl FIXME: Not yet implemented
@@ -5313,37 +5829,22 @@ CC="$lt_save_CC"
])# _LT_LANG_C_CONFIG
-# _LT_PROG_CXX
-# ------------
-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
-# compiler, we have our own version here.
-m4_defun([_LT_PROG_CXX],
-[
-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
-AC_PROG_CXX
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
- AC_PROG_CXXCPP
-else
- _lt_caught_CXX_error=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_CXX
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_CXX], [])
-
-
# _LT_LANG_CXX_CONFIG([TAG])
# --------------------------
# Ensure that the configuration variables for a C++ compiler are suitably
# defined. These variables are subsequently used by _LT_CONFIG to write
# the compiler configuration to `libtool'.
m4_defun([_LT_LANG_CXX_CONFIG],
-[AC_REQUIRE([_LT_PROG_CXX])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_PROG_CXXCPP
+else
+ _lt_caught_CXX_error=yes
+fi
AC_LANG_PUSH(C++)
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
@@ -5355,7 +5856,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -5365,6 +5865,8 @@ _LT_TAGVAR(module_cmds, $1)=
_LT_TAGVAR(module_expsym_cmds, $1)=
_LT_TAGVAR(link_all_deplibs, $1)=unknown
_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
_LT_TAGVAR(no_undefined_flag, $1)=
_LT_TAGVAR(whole_archive_flag_spec, $1)=
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -5396,6 +5898,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# Allow CC to be a program name with arguments.
lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
lt_save_LD=$LD
lt_save_GCC=$GCC
GCC=$GXX
@@ -5413,6 +5916,7 @@ if test "$_lt_caught_CXX_error" != yes; then
fi
test -z "${LDCXX+set}" || LD=$LDCXX
CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
compiler=$CC
_LT_TAGVAR(compiler, $1)=$CC
_LT_CC_BASENAME([$compiler])
@@ -5434,8 +5938,8 @@ if test "$_lt_caught_CXX_error" != yes; then
# Check if GNU C++ uses GNU ld as the underlying linker, since the
# archiving commands below assume that GNU ld is being used.
if test "$with_gnu_ld" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5467,7 +5971,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
GXX=no
@@ -5576,10 +6080,10 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
# Determine the default libpath from the value encoded in an empty
# executable.
- _LT_SYS_MODULE_PATH_AIX
+ _LT_SYS_MODULE_PATH_AIX([$1])
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
else
if test "$host_cpu" = ia64; then
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
@@ -5588,14 +6092,19 @@ if test "$_lt_caught_CXX_error" != yes; then
else
# Determine the default libpath from the value encoded in an
# empty executable.
- _LT_SYS_MODULE_PATH_AIX
+ _LT_SYS_MODULE_PATH_AIX([$1])
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
_LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ if test "$with_gnu_ld" = yes; then
+ # We only use this code for GNU lds that support --whole-archive.
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
# This is similar to how AIX traditionally builds its shared
# libraries.
@@ -5625,28 +6134,75 @@ if test "$_lt_caught_CXX_error" != yes; then
;;
cygwin* | mingw* | pw32* | cegcc*)
- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
- # as there is no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
+ case $GXX,$cc_basename in
+ ,cl* | no,cl*)
+ # Native MSVC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=yes
+ _LT_TAGVAR(file_list_spec, $1)='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+ else
+ $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ # Don't use ranlib
+ _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+ _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile="$lt_outputfile.exe"
+ lt_tool_outputfile="$lt_tool_outputfile.exe"
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_TAGVAR(always_export_symbols, $1)=no
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
darwin* | rhapsody*)
_LT_DARWIN_LINKER_FEATURES($1)
;;
@@ -5669,7 +6225,7 @@ if test "$_lt_caught_CXX_error" != yes; then
esac
;;
- freebsd[[12]]*)
+ freebsd2.*)
# C++ shared libraries reported to be fairly broken before
# switch to ELF
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5688,6 +6244,11 @@ if test "$_lt_caught_CXX_error" != yes; then
gnu*)
;;
+ haiku*)
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
hpux9*)
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -5712,11 +6273,11 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test "$GXX" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5777,7 +6338,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test "$GXX" = yes; then
@@ -5787,10 +6348,10 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
fi
@@ -5820,7 +6381,7 @@ if test "$_lt_caught_CXX_error" != yes; then
case $cc_basename in
CC*)
# SGI C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
# Archives containing C++ object files must be created using
# "CC -ar", where "CC" is the IRIX C++ compiler. This is
@@ -5831,9 +6392,9 @@ if test "$_lt_caught_CXX_error" != yes; then
*)
if test "$GXX" = yes; then
if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
fi
fi
_LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -5844,7 +6405,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(inherit_rpath, $1)=yes
;;
- linux* | k*bsd*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -5862,7 +6423,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5899,26 +6460,26 @@ if test "$_lt_caught_CXX_error" != yes; then
pgCC* | pgcpp*)
# Portland Group C++ compiler
case `$CC -V` in
- *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+ *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
_LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
_LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
$RANLIB $oldlib'
_LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
rm -rf $tpldir~
$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
;;
- *) # Version 6 will use weak symbols
+ *) # Version 6 and above use weak symbols
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
;;
@@ -5926,7 +6487,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
;;
cxx*)
# Compaq C++
@@ -5945,9 +6506,9 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
;;
- xl*)
+ xl* | mpixl* | bgxl*)
# IBM XL 8.0 on PPC, with GNU ld
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
@@ -5967,13 +6528,13 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
# Not sure whether something based on
# $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
# would be better.
- output_verbose_link_cmd='echo'
+ output_verbose_link_cmd='func_echo_all'
# Archives containing C++ object files must be created using
# "CC -xar", where "CC" is the Sun C++ compiler. This is
@@ -6042,7 +6603,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
_LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
fi
- output_verbose_link_cmd=echo
+ output_verbose_link_cmd=func_echo_all
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -6077,15 +6638,15 @@ if test "$_lt_caught_CXX_error" != yes; then
case $host in
osf3*)
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
;;
*)
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
$RM $lib.exp'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
;;
@@ -6101,17 +6662,17 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
if test "$GXX" = yes && test "$with_gnu_ld" = no; then
_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
case $host in
osf3*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
;;
esac
@@ -6121,7 +6682,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# FIXME: insert proper C++ library support
@@ -6157,7 +6718,7 @@ if test "$_lt_caught_CXX_error" != yes; then
solaris*)
case $cc_basename in
- CC*)
+ CC* | sunCC*)
# Sun C++ 4.2, 5.x and Centerline C++
_LT_TAGVAR(archive_cmds_need_lc,$1)=yes
_LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
@@ -6178,7 +6739,7 @@ if test "$_lt_caught_CXX_error" != yes; then
esac
_LT_TAGVAR(link_all_deplibs, $1)=yes
- output_verbose_link_cmd='echo'
+ output_verbose_link_cmd='func_echo_all'
# Archives containing C++ object files must be created using
# "CC -xar", where "CC" is the Sun C++ compiler. This is
@@ -6198,14 +6759,14 @@ if test "$_lt_caught_CXX_error" != yes; then
if test "$GXX" = yes && test "$with_gnu_ld" = no; then
_LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
# g++ 2.7 appears to require `-G' NOT `-shared' on this
# platform.
@@ -6216,7 +6777,7 @@ if test "$_lt_caught_CXX_error" != yes; then
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
fi
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
@@ -6270,6 +6831,10 @@ if test "$_lt_caught_CXX_error" != yes; then
CC*)
_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+ '"$_LT_TAGVAR(old_archive_cmds, $1)"
+ _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+ '"$_LT_TAGVAR(reload_cmds, $1)"
;;
*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
@@ -6325,6 +6890,7 @@ if test "$_lt_caught_CXX_error" != yes; then
fi # test -n "$compiler"
CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
LDCXX=$LD
LD=$lt_save_LD
GCC=$lt_save_GCC
@@ -6339,6 +6905,29 @@ AC_LANG_POP
])# _LT_LANG_CXX_CONFIG
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+ case ${2} in
+ .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+ *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
# ---------------------------------
# Figure out "hidden" library dependencies from verbose
@@ -6347,6 +6936,7 @@ AC_LANG_POP
# objects, libraries and library flags.
m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
# Dependencies to place before and after the object being linked:
_LT_TAGVAR(predep_objects, $1)=
_LT_TAGVAR(postdep_objects, $1)=
@@ -6396,7 +6986,20 @@ public class foo {
}
};
_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
dnl Parse the compiler output and extract the necessary
dnl objects, libraries and library flags.
if AC_TRY_EVAL(ac_compile); then
@@ -6408,7 +7011,7 @@ if AC_TRY_EVAL(ac_compile); then
pre_test_object_deps_done=no
for p in `eval "$output_verbose_link_cmd"`; do
- case $p in
+ case ${prev}${p} in
-L* | -R* | -l*)
# Some compilers place space between "-{L,R}" and the path.
@@ -6417,13 +7020,22 @@ if AC_TRY_EVAL(ac_compile); then
test $p = "-R"; then
prev=$p
continue
- else
- prev=
fi
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
if test "$pre_test_object_deps_done" = no; then
- case $p in
- -L* | -R*)
+ case ${prev} in
+ -L | -R)
# Internal compiler library paths should come after those
# provided the user. The postdeps already come after the
# user supplied libs so there is no need to process them.
@@ -6443,8 +7055,10 @@ if AC_TRY_EVAL(ac_compile); then
_LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
fi
fi
+ prev=
;;
+ *.lto.$objext) ;; # Ignore GCC LTO objects
*.$objext)
# This assumes that the test object file only shows up
# once in the compiler output.
@@ -6480,6 +7094,7 @@ else
fi
$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
# PORTME: override above test on systems where it is broken
m4_if([$1], [CXX],
@@ -6516,7 +7131,7 @@ linux*)
solaris*)
case $cc_basename in
- CC*)
+ CC* | sunCC*)
# The more standards-conforming stlport4 library is
# incompatible with the Cstd library. Avoid specifying
# it if it's in CXXFLAGS. Ignore libCrun as
@@ -6560,32 +7175,16 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
])# _LT_SYS_HIDDEN_LIBDEPS
-# _LT_PROG_F77
-# ------------
-# Since AC_PROG_F77 is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_F77],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
-AC_PROG_F77
-if test -z "$F77" || test "X$F77" = "Xno"; then
- _lt_disable_F77=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_F77
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_F77], [])
-
-
# _LT_LANG_F77_CONFIG([TAG])
# --------------------------
# Ensure that the configuration variables for a Fortran 77 compiler are
# suitably defined. These variables are subsequently used by _LT_CONFIG
# to write the compiler configuration to `libtool'.
m4_defun([_LT_LANG_F77_CONFIG],
-[AC_REQUIRE([_LT_PROG_F77])dnl
-AC_LANG_PUSH(Fortran 77)
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+ _lt_disable_F77=yes
+fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(allow_undefined_flag, $1)=
@@ -6595,7 +7194,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=no
@@ -6604,6 +7202,8 @@ _LT_TAGVAR(module_cmds, $1)=
_LT_TAGVAR(module_expsym_cmds, $1)=
_LT_TAGVAR(link_all_deplibs, $1)=unknown
_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
_LT_TAGVAR(no_undefined_flag, $1)=
_LT_TAGVAR(whole_archive_flag_spec, $1)=
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -6643,7 +7243,9 @@ if test "$_lt_disable_F77" != yes; then
# Allow CC to be a program name with arguments.
lt_save_CC="$CC"
lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
CC=${F77-"f77"}
+ CFLAGS=$FFLAGS
compiler=$CC
_LT_TAGVAR(compiler, $1)=$CC
_LT_CC_BASENAME([$compiler])
@@ -6697,38 +7299,24 @@ if test "$_lt_disable_F77" != yes; then
GCC=$lt_save_GCC
CC="$lt_save_CC"
+ CFLAGS="$lt_save_CFLAGS"
fi # test "$_lt_disable_F77" != yes
AC_LANG_POP
])# _LT_LANG_F77_CONFIG
-# _LT_PROG_FC
-# -----------
-# Since AC_PROG_FC is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_FC],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
-AC_PROG_FC
-if test -z "$FC" || test "X$FC" = "Xno"; then
- _lt_disable_FC=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_FC
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_FC], [])
-
-
# _LT_LANG_FC_CONFIG([TAG])
# -------------------------
# Ensure that the configuration variables for a Fortran compiler are
# suitably defined. These variables are subsequently used by _LT_CONFIG
# to write the compiler configuration to `libtool'.
m4_defun([_LT_LANG_FC_CONFIG],
-[AC_REQUIRE([_LT_PROG_FC])dnl
-AC_LANG_PUSH(Fortran)
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+ _lt_disable_FC=yes
+fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(allow_undefined_flag, $1)=
@@ -6738,7 +7326,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=no
@@ -6747,6 +7334,8 @@ _LT_TAGVAR(module_cmds, $1)=
_LT_TAGVAR(module_expsym_cmds, $1)=
_LT_TAGVAR(link_all_deplibs, $1)=unknown
_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
_LT_TAGVAR(no_undefined_flag, $1)=
_LT_TAGVAR(whole_archive_flag_spec, $1)=
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
@@ -6786,7 +7375,9 @@ if test "$_lt_disable_FC" != yes; then
# Allow CC to be a program name with arguments.
lt_save_CC="$CC"
lt_save_GCC=$GCC
+ lt_save_CFLAGS=$CFLAGS
CC=${FC-"f95"}
+ CFLAGS=$FCFLAGS
compiler=$CC
GCC=$ac_cv_fc_compiler_gnu
@@ -6842,7 +7433,8 @@ if test "$_lt_disable_FC" != yes; then
fi # test -n "$compiler"
GCC=$lt_save_GCC
- CC="$lt_save_CC"
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
fi # test "$_lt_disable_FC" != yes
AC_LANG_POP
@@ -6879,10 +7471,12 @@ _LT_COMPILER_BOILERPLATE
_LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
lt_save_GCC=$GCC
GCC=yes
CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
compiler=$CC
_LT_TAGVAR(compiler, $1)=$CC
_LT_TAGVAR(LD, $1)="$LD"
@@ -6892,6 +7486,8 @@ _LT_CC_BASENAME([$compiler])
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
@@ -6911,10 +7507,82 @@ fi
AC_LANG_RESTORE
GCC=$lt_save_GCC
-CC="$lt_save_CC"
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
])# _LT_LANG_GCJ_CONFIG
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
# _LT_LANG_RC_CONFIG([TAG])
# -------------------------
# Ensure that the configuration variables for the Windows resource compiler
@@ -6946,9 +7614,11 @@ _LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
lt_save_GCC=$GCC
GCC=
CC=${RC-"windres"}
+CFLAGS=
compiler=$CC
_LT_TAGVAR(compiler, $1)=$CC
_LT_CC_BASENAME([$compiler])
@@ -6961,7 +7631,8 @@ fi
GCC=$lt_save_GCC
AC_LANG_RESTORE
-CC="$lt_save_CC"
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
])# _LT_LANG_RC_CONFIG
@@ -6981,6 +7652,13 @@ dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
# LT_PROG_RC
# ----------
AC_DEFUN([LT_PROG_RC],
@@ -7020,6 +7698,15 @@ _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
AC_SUBST([OBJDUMP])
])
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
# _LT_DECL_SED
# ------------
@@ -7113,8 +7800,8 @@ m4_defun([_LT_CHECK_SHELL_FEATURES],
# Try some XSI features
xsi_shell=no
( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,, \
+ test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+ = c,a/b,b/c, \
&& eval 'test $(( 1 + 1 )) -eq 2 \
&& test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
&& xsi_shell=yes
@@ -7153,208 +7840,162 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
])# _LT_CHECK_SHELL_FEATURES
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
- yes)
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
-}
-
-# func_basename file
-func_basename ()
-{
- func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-# dirname: Compute the dirname of FILE. If nonempty,
-# add APPEND to the result, otherwise set result
-# to NONDIR_REPLACEMENT.
-# value returned in "$func_dirname_result"
-# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
- func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
- # positional parameters, so assign one to ordinary parameter first.
- func_stripname_result=${3}
- func_stripname_result=${func_stripname_result#"${1}"}
- func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
- func_opt_split_opt=${1%%=*}
- func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
- case ${1} in
- *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
- *) func_lo2o_result=${1} ;;
- esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=${#1}
-}
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
-_LT_EOF
- ;;
- *) # Bourne compatible functions.
- cat << \_LT_EOF >> "$cfgfile"
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
-}
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+ _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac])
+
+ _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+ func_basename_result="${1##*/}"])
+
+ _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+ case ${1} in
+ */*) func_dirname_result="${1%/*}${2}" ;;
+ * ) func_dirname_result="${3}" ;;
+ esac
+ func_basename_result="${1##*/}"])
-# func_basename file
-func_basename ()
-{
- func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
+ _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+ # positional parameters, so assign one to ordinary parameter first.
+ func_stripname_result=${3}
+ func_stripname_result=${func_stripname_result#"${1}"}
+ func_stripname_result=${func_stripname_result%"${2}"}])
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
+ _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+ func_split_long_opt_name=${1%%=*}
+ func_split_long_opt_arg=${1#*=}])
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "X${3}" \
- | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "X${3}" \
- | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
- esac
-}
+ _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+ func_split_short_opt_arg=${1#??}
+ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
+ _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+ case ${1} in
+ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+ *) func_lo2o_result=${1} ;;
+ esac])
-# func_opt_split
-func_opt_split ()
-{
- func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
- func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
+ _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo])
-# func_lo2o object
-func_lo2o ()
-{
- func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
+ _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))])
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
-}
+ _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}])
+fi
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=`expr "$[@]"`
-}
+if test x"$lt_shell_append" = xyes; then
+ _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"])
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
+ _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+ func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+ eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-_LT_EOF
-esac
+ # Save a `func_append' function call where possible by direct use of '+='
+ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+else
+ # Save a `func_append' function call even when '+=' is not available
+ sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+ && mv -f "$cfgfile.tmp" "$cfgfile" \
+ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+ test 0 -eq $? || _lt_function_replace_fail=:
+fi
-case $lt_shell_append in
- yes)
- cat << \_LT_EOF >> "$cfgfile"
+if test x"$_lt_function_replace_fail" = x":"; then
+ AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "$[1]+=\$[2]"
-}
-_LT_EOF
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
;;
- *)
- cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
;;
- esac
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+ [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+ [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/Modules/_ctypes/libffi/m4/ltoptions.m4 b/Modules/_ctypes/libffi/m4/ltoptions.m4
index 34151a3..5d9acd8 100644
--- a/Modules/_ctypes/libffi/m4/ltoptions.m4
+++ b/Modules/_ctypes/libffi/m4/ltoptions.m4
@@ -1,13 +1,14 @@
# Helper functions for option handling. -*- Autoconf -*-
#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
# Written by Gary V. Vaughan, 2004
#
# This file is free software; the Free Software Foundation gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# serial 6 ltoptions.m4
+# serial 7 ltoptions.m4
# This is to help aclocal find these macros, as it can't see m4_define.
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -125,7 +126,7 @@ LT_OPTION_DEFINE([LT_INIT], [win32-dll],
[enable_win32_dll=yes
case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
AC_CHECK_TOOL(AS, as, false)
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
AC_CHECK_TOOL(OBJDUMP, objdump, false)
@@ -133,13 +134,13 @@ case $host in
esac
test -z "$AS" && AS=as
-_LT_DECL([], [AS], [0], [Assembler program])dnl
+_LT_DECL([], [AS], [1], [Assembler program])dnl
test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
])# win32-dll
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
@@ -325,9 +326,24 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
m4_define([_LT_WITH_PIC],
[AC_ARG_WITH([pic],
- [AS_HELP_STRING([--with-pic],
+ [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
- [pic_mode="$withval"],
+ [lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for lt_pkg in $withval; do
+ IFS="$lt_save_ifs"
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
[pic_mode=default])
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
diff --git a/Modules/_ctypes/libffi/m4/ltversion.m4 b/Modules/_ctypes/libffi/m4/ltversion.m4
index b8e154f..07a8602 100644
--- a/Modules/_ctypes/libffi/m4/ltversion.m4
+++ b/Modules/_ctypes/libffi/m4/ltversion.m4
@@ -7,17 +7,17 @@
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# Generated from ltversion.in.
+# @configure_input@
-# serial 3012 ltversion.m4
+# serial 3337 ltversion.m4
# This file is part of GNU Libtool
-m4_define([LT_PACKAGE_VERSION], [2.2.6])
-m4_define([LT_PACKAGE_REVISION], [1.3012])
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.6'
-macro_revision='1.3012'
+[macro_version='2.4.2'
+macro_revision='1.3337'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])
diff --git a/Modules/_ctypes/libffi/m4/lt~obsolete.m4 b/Modules/_ctypes/libffi/m4/lt~obsolete.m4
index 637bb20..c573da9 100644
--- a/Modules/_ctypes/libffi/m4/lt~obsolete.m4
+++ b/Modules/_ctypes/libffi/m4/lt~obsolete.m4
@@ -1,13 +1,13 @@
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
#
-# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
# Written by Scott James Remnant, 2004.
#
# This file is free software; the Free Software Foundation gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# serial 4 lt~obsolete.m4
+# serial 5 lt~obsolete.m4
# These exist entirely to fool aclocal when bootstrapping libtool.
#
@@ -77,7 +77,6 @@ m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
@@ -90,3 +89,10 @@ m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/Modules/_ctypes/libffi/man/Makefile.am b/Modules/_ctypes/libffi/man/Makefile.am
index 2519277..afcbfb6 100644
--- a/Modules/_ctypes/libffi/man/Makefile.am
+++ b/Modules/_ctypes/libffi/man/Makefile.am
@@ -2,7 +2,7 @@
AUTOMAKE_OPTIONS=foreign
-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
+EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
+man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
diff --git a/Modules/_ctypes/libffi/man/Makefile.in b/Modules/_ctypes/libffi/man/Makefile.in
index 3e40be2..b29fb15 100644
--- a/Modules/_ctypes/libffi/man/Makefile.in
+++ b/Modules/_ctypes/libffi/man/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -68,6 +68,12 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
man3dir = $(mandir)/man3
am__installdirs = "$(DESTDIR)$(man3dir)"
NROFF = nroff
@@ -76,6 +82,7 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALLOCA = @ALLOCA@
AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
AR = @AR@
AUTOCONF = @AUTOCONF@
@@ -93,6 +100,7 @@ CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
@@ -100,6 +108,7 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
FGREP = @FGREP@
GREP = @GREP@
HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -118,6 +127,7 @@ LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
@@ -130,6 +140,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
@@ -144,6 +155,7 @@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
@@ -176,7 +188,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@@ -199,8 +210,8 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign
-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
+EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
+man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
all: all-am
.SUFFIXES:
@@ -275,9 +286,7 @@ uninstall-man3:
sed -n '/\.3[a-z]*$$/p'; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
- test -z "$$files" || { \
- echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(man3dir)" && rm -f $$files; }
+ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
tags: TAGS
TAGS:
@@ -345,10 +354,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff --git a/Modules/_ctypes/libffi/man/ffi.3 b/Modules/_ctypes/libffi/man/ffi.3
index 18b5d5d..1f1d303 100644
--- a/Modules/_ctypes/libffi/man/ffi.3
+++ b/Modules/_ctypes/libffi/man/ffi.3
@@ -16,6 +16,15 @@ libffi, -lffi
.Fa "ffi_type **atypes"
.Fc
.Ft void
+.Fo ffi_prep_cif_var
+.Fa "ffi_cif *cif"
+.Fa "ffi_abi abi"
+.Fa "unsigned int nfixedargs"
+.Fa "unsigned int ntotalargs"
+.Fa "ffi_type *rtype"
+.Fa "ffi_type **atypes"
+.Fc
+.Ft void
.Fo ffi_call
.Fa "ffi_cif *cif"
.Fa "void (*fn)(void)"
@@ -28,4 +37,5 @@ generate a call to another function at runtime without requiring knowledge of
the called function's interface at compile time.
.Sh SEE ALSO
.Xr ffi_prep_cif 3 ,
+.Xr ffi_prep_cif_var 3 ,
.Xr ffi_call 3
diff --git a/Modules/_ctypes/libffi/man/ffi_prep_cif.3 b/Modules/_ctypes/libffi/man/ffi_prep_cif.3
index 9436b31..e1bdbd7 100644
--- a/Modules/_ctypes/libffi/man/ffi_prep_cif.3
+++ b/Modules/_ctypes/libffi/man/ffi_prep_cif.3
@@ -37,7 +37,9 @@ structs that describe the data type, size and alignment of each argument.
points to an
.Nm ffi_type
that describes the data type, size and alignment of the
-return value.
+return value. Note that to call a variadic function
+.Nm ffi_prep_cif_var
+must be used instead.
.Sh RETURN VALUES
Upon successful completion,
.Nm ffi_prep_cif
@@ -63,4 +65,6 @@ defined in
.
.Sh SEE ALSO
.Xr ffi 3 ,
-.Xr ffi_call 3
+.Xr ffi_call 3 ,
+.Xr ffi_prep_cif_var 3
+
diff --git a/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3 b/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3
new file mode 100644
index 0000000..7e19d0b
--- /dev/null
+++ b/Modules/_ctypes/libffi/man/ffi_prep_cif_var.3
@@ -0,0 +1,73 @@
+.Dd January 25, 2011
+.Dt ffi_prep_cif_var 3
+.Sh NAME
+.Nm ffi_prep_cif_var
+.Nd Prepare a
+.Nm ffi_cif
+structure for use with
+.Nm ffi_call
+for variadic functions.
+.Sh SYNOPSIS
+.In ffi.h
+.Ft ffi_status
+.Fo ffi_prep_cif_var
+.Fa "ffi_cif *cif"
+.Fa "ffi_abi abi"
+.Fa "unsigned int nfixedargs"
+.Fa "unsigned int ntotalargs"
+.Fa "ffi_type *rtype"
+.Fa "ffi_type **atypes"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm ffi_prep_cif_var
+function prepares a
+.Nm ffi_cif
+structure for use with
+.Nm ffi_call
+for variadic functions.
+.Fa abi
+specifies a set of calling conventions to use.
+.Fa atypes
+is an array of
+.Fa ntotalargs
+pointers to
+.Nm ffi_type
+structs that describe the data type, size and alignment of each argument.
+.Fa rtype
+points to an
+.Nm ffi_type
+that describes the data type, size and alignment of the
+return value.
+.Fa nfixedargs
+must contain the number of fixed (non-variadic) arguments.
+Note that to call a non-variadic function
+.Nm ffi_prep_cif
+must be used.
+.Sh RETURN VALUES
+Upon successful completion,
+.Nm ffi_prep_cif_var
+returns
+.Nm FFI_OK .
+It will return
+.Nm FFI_BAD_TYPEDEF
+if
+.Fa cif
+is
+.Nm NULL
+or
+.Fa atypes
+or
+.Fa rtype
+is malformed. If
+.Fa abi
+does not refer to a valid ABI,
+.Nm FFI_BAD_ABI
+will be returned. Available ABIs are
+defined in
+.Nm <ffitarget.h>
+.
+.Sh SEE ALSO
+.Xr ffi 3 ,
+.Xr ffi_call 3 ,
+.Xr ffi_prep_cif 3
diff --git a/Modules/_ctypes/libffi/missing b/Modules/_ctypes/libffi/missing
index 894e786..28055d2 100755
--- a/Modules/_ctypes/libffi/missing
+++ b/Modules/_ctypes/libffi/missing
@@ -1,10 +1,10 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
-scriptversion=2005-06-08.21
+scriptversion=2009-04-28.21; # UTC
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
@@ -18,9 +18,7 @@ scriptversion=2005-06-08.21
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -33,6 +31,8 @@ if test $# -eq 0; then
fi
run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
# In the cases where this matters, `missing' is being run in the
# srcdir already.
@@ -44,7 +44,7 @@ fi
msg="missing on your system"
-case "$1" in
+case $1 in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
@@ -77,6 +77,7 @@ Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
+ autom4te touch the output file, or create a stub one
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
@@ -86,6 +87,9 @@ Supported PROGRAM values:
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
Send bug reports to <bug-automake@gnu.org>."
exit $?
;;
@@ -103,15 +107,22 @@ Send bug reports to <bug-automake@gnu.org>."
esac
+# normalize program name to check for.
+program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
# Now exit if we have it, but it failed. Also exit now if we
# don't have it and --version was passed (most likely to detect
-# the program).
-case "$1" in
- lex|yacc)
+# the program). This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+ lex*|yacc*)
# Not GNU programs, they don't have --version.
;;
- tar)
+ tar*)
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
@@ -135,7 +146,7 @@ esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
-case "$1" in
+case $program in
aclocal*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
@@ -145,7 +156,7 @@ WARNING: \`$1' is $msg. You should only need it if
touch aclocal.m4
;;
- autoconf)
+ autoconf*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`${configure_ac}'. You might want to install the
@@ -154,7 +165,7 @@ WARNING: \`$1' is $msg. You should only need it if
touch configure
;;
- autoheader)
+ autoheader*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
@@ -164,7 +175,7 @@ WARNING: \`$1' is $msg. You should only need it if
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
- case "$f" in
+ case $f in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
@@ -184,7 +195,7 @@ WARNING: \`$1' is $msg. You should only need it if
while read f; do touch "$f"; done
;;
- autom4te)
+ autom4te*)
echo 1>&2 "\
WARNING: \`$1' is needed, but is $msg.
You might have modified some files without having the
@@ -192,8 +203,8 @@ WARNING: \`$1' is needed, but is $msg.
You can get \`$1' as part of \`Autoconf' from any GNU
archive site."
- file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
- test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
if test -f "$file"; then
touch $file
else
@@ -207,80 +218,78 @@ WARNING: \`$1' is needed, but is $msg.
fi
;;
- bison|yacc)
+ bison*|yacc*)
echo 1>&2 "\
WARNING: \`$1' $msg. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
- if [ $# -ne 1 ]; then
+ if test $# -ne 1; then
eval LASTARG="\${$#}"
- case "$LASTARG" in
+ case $LASTARG in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if [ -f "$SRCFILE" ]; then
+ if test -f "$SRCFILE"; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if [ -f "$SRCFILE" ]; then
+ if test -f "$SRCFILE"; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
- if [ ! -f y.tab.h ]; then
+ if test ! -f y.tab.h; then
echo >y.tab.h
fi
- if [ ! -f y.tab.c ]; then
+ if test ! -f y.tab.c; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
- lex|flex)
+ lex*|flex*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
- if [ $# -ne 1 ]; then
+ if test $# -ne 1; then
eval LASTARG="\${$#}"
- case "$LASTARG" in
+ case $LASTARG in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if [ -f "$SRCFILE" ]; then
+ if test -f "$SRCFILE"; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
- if [ ! -f lex.yy.c ]; then
+ if test ! -f lex.yy.c; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
- help2man)
+ help2man*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
- fi
- if [ -f "$file" ]; then
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
- exit 1
+ exit $?
fi
;;
- makeinfo)
+ makeinfo*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
@@ -289,11 +298,17 @@ WARNING: \`$1' is $msg. You should only need it if
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
# The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
if test -z "$file"; then
# ... or it is the one specified with @setfilename ...
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ file=`sed -n '
+ /^@setfilename/{
+ s/.* \([^ ]*\) *$/\1/
+ p
+ q
+ }' $infile`
# ... or it is derived from the source name (dir/f.texi becomes f.info)
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
fi
@@ -303,7 +318,7 @@ WARNING: \`$1' is $msg. You should only need it if
touch $file
;;
- tar)
+ tar*)
shift
# We have already tried tar in the generic part.
@@ -317,13 +332,13 @@ WARNING: \`$1' is $msg. You should only need it if
fi
firstarg="$1"
if shift; then
- case "$firstarg" in
+ case $firstarg in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" "$@" && exit 0
;;
esac
- case "$firstarg" in
+ case $firstarg in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" "$@" && exit 0
@@ -356,5 +371,6 @@ exit 0
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/Modules/_ctypes/libffi/msvcc.sh b/Modules/_ctypes/libffi/msvcc.sh
index 8301839..dcdbeab 100644..100755
--- a/Modules/_ctypes/libffi/msvcc.sh
+++ b/Modules/_ctypes/libffi/msvcc.sh
@@ -42,13 +42,11 @@
# format and translated into something sensible for cl or ml.
#
-# Disable specific warnings, and enable warnings-as-errors so we catch any
-# mistranslated args.
-nowarn="-wd4127 -wd4820 -wd4706 -wd4100 -wd4255 -wd4668 -wd4053 -wd4324"
-args="-nologo -W3 -WX $nowarn"
+args="-nologo -W3"
md=-MD
cl="cl"
ml="ml"
+safeseh="-safeseh"
output=
while [ $# -gt 0 ]
@@ -66,15 +64,28 @@ do
-m64)
cl="cl" # "$MSVC/x86_amd64/cl"
ml="ml64" # "$MSVC/x86_amd64/ml64"
+ safeseh=
+ shift 1
+ ;;
+ -O0)
+ args="$args -Od"
shift 1
;;
-O*)
- args="$args $1"
+ # If we're optimizing, make sure we explicitly turn on some optimizations
+ # that are implicitly disabled by debug symbols (-Zi).
+ args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO"
shift 1
;;
-g)
- # Can't specify -RTC1 or -Zi in opt. -Gy is ok. Use -OPT:REF?
- args="$args -D_DEBUG -RTC1 -Zi"
+ # Enable debug symbol generation.
+ args="$args -Zi -DEBUG"
+ shift 1
+ ;;
+ -DFFI_DEBUG)
+ # Link against debug CRT and enable runtime error checks.
+ args="$args -RTC1"
+ defines="$defines $1"
md=-MDd
shift 1
;;
@@ -111,7 +122,8 @@ do
shift 1
;;
-Wall)
- args="$args -Wall"
+ # -Wall on MSVC is overzealous, and we already build with -W3. Nothing
+ # to do here.
shift 1
;;
-Werror)
@@ -166,7 +178,7 @@ if [ -n "$assembly" ]; then
echo "$cl -nologo -EP $includes $defines $src > $ppsrc"
"$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $?
output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')"
- args="-nologo -safeseh $single $output $ppsrc"
+ args="-nologo $safeseh $single $output $ppsrc"
echo "$ml $args"
eval "\"$ml\" $args"
diff --git a/Modules/_ctypes/libffi/src/alpha/ffi.c b/Modules/_ctypes/libffi/src/alpha/ffi.c
index 8d6b2ba..192f691 100644
--- a/Modules/_ctypes/libffi/src/alpha/ffi.c
+++ b/Modules/_ctypes/libffi/src/alpha/ffi.c
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
+ ffi.c - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
Alpha Foreign Function Interface
@@ -178,6 +179,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
{
unsigned int *tramp;
+ if (cif->abi != FFI_OSF)
+ return FFI_BAD_ABI;
+
tramp = (unsigned int *) &closure->tramp[0];
tramp[0] = 0x47fb0401; /* mov $27,$1 */
tramp[1] = 0xa77b0010; /* ldq $27,16($27) */
diff --git a/Modules/_ctypes/libffi/src/alpha/ffitarget.h b/Modules/_ctypes/libffi/src/alpha/ffitarget.h
index 7d06eb0..af145bc 100644
--- a/Modules/_ctypes/libffi/src/alpha/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/alpha/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for Alpha.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
diff --git a/Modules/_ctypes/libffi/src/alpha/osf.S b/Modules/_ctypes/libffi/src/alpha/osf.S
index d0e7782..6b9f4df 100644
--- a/Modules/_ctypes/libffi/src/alpha/osf.S
+++ b/Modules/_ctypes/libffi/src/alpha/osf.S
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- osf.S - Copyright (c) 1998, 2001, 2007, 2008 Red Hat
+ osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat
Alpha/OSF Foreign Function Interface
@@ -299,33 +299,51 @@ $load_table:
#endif
#ifdef __ELF__
+# define UA_SI .4byte
+# define FDE_ENCODING 0x1b /* pcrel sdata4 */
+# define FDE_ENCODE(X) .4byte X-.
+# define FDE_ARANGE(X) .4byte X
+#elif defined __osf__
+# define UA_SI .align 0; .long
+# define FDE_ENCODING 0x50 /* aligned absolute */
+# define FDE_ENCODE(X) .align 3; .quad X
+# define FDE_ARANGE(X) .align 0; .quad X
+#endif
+
+#ifdef __ELF__
.section .eh_frame,EH_FRAME_FLAGS,@progbits
+#elif defined __osf__
+ .data
+ .align 3
+ .globl _GLOBAL__F_ffi_call_osf
+_GLOBAL__F_ffi_call_osf:
+#endif
__FRAME_BEGIN__:
- .4byte $LECIE1-$LSCIE1 # Length of Common Information Entry
+ UA_SI $LECIE1-$LSCIE1 # Length of Common Information Entry
$LSCIE1:
- .4byte 0x0 # CIE Identifier Tag
+ UA_SI 0x0 # CIE Identifier Tag
.byte 0x1 # CIE Version
.ascii "zR\0" # CIE Augmentation
.byte 0x1 # uleb128 0x1; CIE Code Alignment Factor
.byte 0x78 # sleb128 -8; CIE Data Alignment Factor
.byte 26 # CIE RA Column
.byte 0x1 # uleb128 0x1; Augmentation size
- .byte 0x1b # FDE Encoding (pcrel sdata4)
+ .byte FDE_ENCODING # FDE Encoding
.byte 0xc # DW_CFA_def_cfa
.byte 30 # uleb128 column 30
.byte 0 # uleb128 offset 0
.align 3
$LECIE1:
$LSFDE1:
- .4byte $LEFDE1-$LASFDE1 # FDE Length
+ UA_SI $LEFDE1-$LASFDE1 # FDE Length
$LASFDE1:
- .4byte $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset
- .4byte $LFB1-. # FDE initial location
- .4byte $LFE1-$LFB1 # FDE address range
+ UA_SI $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset
+ FDE_ENCODE($LFB1) # FDE initial location
+ FDE_ARANGE($LFE1-$LFB1) # FDE address range
.byte 0x0 # uleb128 0x0; Augmentation size
.byte 0x4 # DW_CFA_advance_loc4
- .4byte $LCFI1-$LFB1
+ UA_SI $LCFI1-$LFB1
.byte 0x9a # DW_CFA_offset, column 26
.byte 4 # uleb128 4*-8
.byte 0x8f # DW_CFA_offset, column 15
@@ -335,32 +353,35 @@ $LASFDE1:
.byte 32 # uleb128 offset 32
.byte 0x4 # DW_CFA_advance_loc4
- .4byte $LCFI2-$LCFI1
+ UA_SI $LCFI2-$LCFI1
.byte 0xda # DW_CFA_restore, column 26
.align 3
$LEFDE1:
$LSFDE3:
- .4byte $LEFDE3-$LASFDE3 # FDE Length
+ UA_SI $LEFDE3-$LASFDE3 # FDE Length
$LASFDE3:
- .4byte $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset
- .4byte $LFB2-. # FDE initial location
- .4byte $LFE2-$LFB2 # FDE address range
+ UA_SI $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset
+ FDE_ENCODE($LFB2) # FDE initial location
+ FDE_ARANGE($LFE2-$LFB2) # FDE address range
.byte 0x0 # uleb128 0x0; Augmentation size
.byte 0x4 # DW_CFA_advance_loc4
- .4byte $LCFI5-$LFB2
+ UA_SI $LCFI5-$LFB2
.byte 0xe # DW_CFA_def_cfa_offset
.byte 0x80,0x1 # uleb128 128
.byte 0x4 # DW_CFA_advance_loc4
- .4byte $LCFI6-$LCFI5
+ UA_SI $LCFI6-$LCFI5
.byte 0x9a # DW_CFA_offset, column 26
.byte 16 # uleb128 offset 16*-8
.align 3
$LEFDE3:
+#if defined __osf__
+ .align 0
+ .long 0 # End of Table
+#endif
-#ifdef __linux__
+#if defined __ELF__ && defined __linux__
.section .note.GNU-stack,"",@progbits
#endif
-#endif
diff --git a/Modules/_ctypes/libffi/src/arm/ffi.c b/Modules/_ctypes/libffi/src/arm/ffi.c
index f6a6475..3ccceb9 100644
--- a/Modules/_ctypes/libffi/src/arm/ffi.c
+++ b/Modules/_ctypes/libffi/src/arm/ffi.c
@@ -1,6 +1,10 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1998, 2008 Red Hat, Inc.
-
+ ffi.c - Copyright (c) 2011 Timothy Wall
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+ Copyright (c) 2011 Anthony Green
+ Copyright (c) 2011 Free Software Foundation
+ Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
+
ARM Foreign Function Interface
Permission is hereby granted, free of charge, to any person obtaining
@@ -29,12 +33,20 @@
#include <stdlib.h>
-/* ffi_prep_args is called by the assembly routine once stack space
- has been allocated for the function's arguments */
+/* Forward declares. */
+static int vfp_type_p (ffi_type *);
+static void layout_vfp_args (ffi_cif *);
-void ffi_prep_args(char *stack, extended_cif *ecif)
+/* ffi_prep_args is called by the assembly routine once stack space
+ has been allocated for the function's arguments
+
+ The vfp_space parameter is the load area for VFP regs, the return
+ value is cif->vfp_used (word bitset of VFP regs used for passing
+ arguments). These are only used for the VFP hard-float ABI.
+*/
+int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space)
{
- register unsigned int i;
+ register unsigned int i, vi = 0;
register void **p_argv;
register char *argp;
register ffi_type **p_arg;
@@ -53,10 +65,31 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
i--, p_arg++)
{
size_t z;
+ size_t alignment;
+
+ /* Allocated in VFP registers. */
+ if (ecif->cif->abi == FFI_VFP
+ && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg))
+ {
+ float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++];
+ if ((*p_arg)->type == FFI_TYPE_FLOAT)
+ *((float*)vfp_slot) = *((float*)*p_argv);
+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+ *((double*)vfp_slot) = *((double*)*p_argv);
+ else
+ memcpy(vfp_slot, *p_argv, (*p_arg)->size);
+ p_argv++;
+ continue;
+ }
/* Align if necessary */
- if (((*p_arg)->alignment - 1) & (unsigned) argp) {
- argp = (char *) ALIGN(argp, (*p_arg)->alignment);
+ alignment = (*p_arg)->alignment;
+#ifdef _WIN32_WCE
+ if (alignment > 4)
+ alignment = 4;
+#endif
+ if ((alignment - 1) & (unsigned) argp) {
+ argp = (char *) ALIGN(argp, alignment);
}
if ((*p_arg)->type == FFI_TYPE_STRUCT)
@@ -103,13 +136,15 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
p_argv++;
argp += z;
}
-
- return;
+
+ /* Indicate the VFP registers used. */
+ return ecif->cif->vfp_used;
}
/* Perform machine dependent cif processing */
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
{
+ int type_code;
/* Round the stack up to a multiple of 8 bytes. This isn't needed
everywhere, but it is on some platforms, and it doesn't harm anything
when it isn't needed. */
@@ -130,7 +165,14 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
break;
case FFI_TYPE_STRUCT:
- if (cif->rtype->size <= 4)
+ if (cif->abi == FFI_VFP
+ && (type_code = vfp_type_p (cif->rtype)) != 0)
+ {
+ /* A Composite Type passed in VFP registers, either
+ FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */
+ cif->flags = (unsigned) type_code;
+ }
+ else if (cif->rtype->size <= 4)
/* A Composite Type not larger than 4 bytes is returned in r0. */
cif->flags = (unsigned)FFI_TYPE_INT;
else
@@ -145,11 +187,30 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
break;
}
+ /* Map out the register placements of VFP register args.
+ The VFP hard-float calling conventions are slightly more sophisticated than
+ the base calling conventions, so we do it here instead of in ffi_prep_args(). */
+ if (cif->abi == FFI_VFP)
+ layout_vfp_args (cif);
+
return FFI_OK;
}
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
- unsigned, unsigned, unsigned *, void (*fn)(void));
+/* Perform machine dependent cif processing for variadic calls */
+ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
+ unsigned int nfixedargs,
+ unsigned int ntotalargs)
+{
+ /* VFP variadic calls actually use the SYSV ABI */
+ if (cif->abi == FFI_VFP)
+ cif->abi = FFI_SYSV;
+
+ return ffi_prep_cif_machdep(cif);
+}
+
+/* Prototypes for assembly functions, in sysv.S */
+extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
+extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
@@ -157,6 +218,8 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
int small_struct = (cif->flags == FFI_TYPE_INT
&& cif->rtype->type == FFI_TYPE_STRUCT);
+ int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT
+ || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE);
ecif.cif = cif;
ecif.avalue = avalue;
@@ -173,38 +236,53 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
}
else if (small_struct)
ecif.rvalue = &temp;
+ else if (vfp_struct)
+ {
+ /* Largest case is double x 4. */
+ ecif.rvalue = alloca(32);
+ }
else
ecif.rvalue = rvalue;
switch (cif->abi)
{
case FFI_SYSV:
- ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
- fn);
+ ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue);
+ break;
+ case FFI_VFP:
+#ifdef __ARM_EABI__
+ ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue);
break;
+#endif
+
default:
FFI_ASSERT(0);
break;
}
if (small_struct)
memcpy (rvalue, &temp, cif->rtype->size);
+ else if (vfp_struct)
+ memcpy (rvalue, ecif.rvalue, cif->rtype->size);
}
/** private members **/
static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
- void** args, ffi_cif* cif);
+ void** args, ffi_cif* cif, float *vfp_stack);
void ffi_closure_SYSV (ffi_closure *);
+void ffi_closure_VFP (ffi_closure *);
+
/* This function is jumped to by the trampoline */
unsigned int
-ffi_closure_SYSV_inner (closure, respp, args)
+ffi_closure_SYSV_inner (closure, respp, args, vfp_args)
ffi_closure *closure;
void **respp;
void *args;
+ void *vfp_args;
{
// our various things...
ffi_cif *cif;
@@ -219,7 +297,7 @@ ffi_closure_SYSV_inner (closure, respp, args)
* a structure, it will re-set RESP to point to the
* structure return address. */
- ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
+ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args);
(closure->fun) (cif, *respp, arg_area, closure->user_data);
@@ -229,10 +307,12 @@ ffi_closure_SYSV_inner (closure, respp, args)
/*@-exportheader@*/
static void
ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
- void **avalue, ffi_cif *cif)
+ void **avalue, ffi_cif *cif,
+ /* Used only under VFP hard-float ABI. */
+ float *vfp_stack)
/*@=exportheader@*/
{
- register unsigned int i;
+ register unsigned int i, vi = 0;
register void **p_argv;
register char *argp;
register ffi_type **p_arg;
@@ -249,10 +329,23 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
{
size_t z;
-
- size_t alignment = (*p_arg)->alignment;
+ size_t alignment;
+
+ if (cif->abi == FFI_VFP
+ && vi < cif->vfp_nargs && vfp_type_p (*p_arg))
+ {
+ *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]);
+ continue;
+ }
+
+ alignment = (*p_arg)->alignment;
if (alignment < 4)
alignment = 4;
+#ifdef _WIN32_WCE
+ else
+ if (alignment > 4)
+ alignment = 4;
+#endif
/* Align if necessary */
if ((alignment - 1) & (unsigned) argp) {
argp = (char *) ALIGN(argp, alignment);
@@ -273,18 +366,237 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
/* How to make a trampoline. */
+extern unsigned int ffi_arm_trampoline[3];
+
+#if FFI_EXEC_TRAMPOLINE_TABLE
+
+#include <mach/mach.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern void *ffi_closure_trampoline_table_page;
+
+typedef struct ffi_trampoline_table ffi_trampoline_table;
+typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
+
+struct ffi_trampoline_table {
+ /* contigious writable and executable pages */
+ vm_address_t config_page;
+ vm_address_t trampoline_page;
+
+ /* free list tracking */
+ uint16_t free_count;
+ ffi_trampoline_table_entry *free_list;
+ ffi_trampoline_table_entry *free_list_pool;
+
+ ffi_trampoline_table *prev;
+ ffi_trampoline_table *next;
+};
+
+struct ffi_trampoline_table_entry {
+ void *(*trampoline)();
+ ffi_trampoline_table_entry *next;
+};
+
+/* Override the standard architecture trampoline size */
+// XXX TODO - Fix
+#undef FFI_TRAMPOLINE_SIZE
+#define FFI_TRAMPOLINE_SIZE 12
+
+/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */
+#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080));
+
+/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */
+#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16
+
+/* Total number of trampolines that fit in one trampoline table */
+#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE)
+
+static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
+static ffi_trampoline_table *ffi_trampoline_tables = NULL;
+
+static ffi_trampoline_table *
+ffi_trampoline_table_alloc ()
+{
+ ffi_trampoline_table *table = NULL;
+
+ /* Loop until we can allocate two contigious pages */
+ while (table == NULL) {
+ vm_address_t config_page = 0x0;
+ kern_return_t kt;
+
+ /* Try to allocate two pages */
+ kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE);
+ if (kt != KERN_SUCCESS) {
+ fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+ break;
+ }
+
+ /* Now drop the second half of the allocation to make room for the trampoline table */
+ vm_address_t trampoline_page = config_page+PAGE_SIZE;
+ kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE);
+ if (kt != KERN_SUCCESS) {
+ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+ break;
+ }
+
+ /* Remap the trampoline table to directly follow the config page */
+ vm_prot_t cur_prot;
+ vm_prot_t max_prot;
+
+ kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
+
+ /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
+ if (kt != KERN_SUCCESS) {
+ /* Log unexpected failures */
+ if (kt != KERN_NO_SPACE) {
+ fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+ }
+
+ vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
+ continue;
+ }
+
+ /* We have valid trampoline and config pages */
+ table = calloc (1, sizeof(ffi_trampoline_table));
+ table->free_count = FFI_TRAMPOLINE_COUNT;
+ table->config_page = config_page;
+ table->trampoline_page = trampoline_page;
+
+ /* Create and initialize the free list */
+ table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry));
+
+ uint16_t i;
+ for (i = 0; i < table->free_count; i++) {
+ ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
+ entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
+
+ if (i < table->free_count - 1)
+ entry->next = &table->free_list_pool[i+1];
+ }
+
+ table->free_list = table->free_list_pool;
+ }
+
+ return table;
+}
+
+void *
+ffi_closure_alloc (size_t size, void **code)
+{
+ /* Create the closure */
+ ffi_closure *closure = malloc(size);
+ if (closure == NULL)
+ return NULL;
+
+ pthread_mutex_lock(&ffi_trampoline_lock);
+
+ /* Check for an active trampoline table with available entries. */
+ ffi_trampoline_table *table = ffi_trampoline_tables;
+ if (table == NULL || table->free_list == NULL) {
+ table = ffi_trampoline_table_alloc ();
+ if (table == NULL) {
+ free(closure);
+ return NULL;
+ }
+
+ /* Insert the new table at the top of the list */
+ table->next = ffi_trampoline_tables;
+ if (table->next != NULL)
+ table->next->prev = table;
+
+ ffi_trampoline_tables = table;
+ }
+
+ /* Claim the free entry */
+ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
+ ffi_trampoline_tables->free_list = entry->next;
+ ffi_trampoline_tables->free_count--;
+ entry->next = NULL;
+
+ pthread_mutex_unlock(&ffi_trampoline_lock);
+
+ /* Initialize the return values */
+ *code = entry->trampoline;
+ closure->trampoline_table = table;
+ closure->trampoline_table_entry = entry;
+
+ return closure;
+}
+
+void
+ffi_closure_free (void *ptr)
+{
+ ffi_closure *closure = ptr;
+
+ pthread_mutex_lock(&ffi_trampoline_lock);
+
+ /* Fetch the table and entry references */
+ ffi_trampoline_table *table = closure->trampoline_table;
+ ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
+
+ /* Return the entry to the free list */
+ entry->next = table->free_list;
+ table->free_list = entry;
+ table->free_count++;
+
+ /* If all trampolines within this table are free, and at least one other table exists, deallocate
+ * the table */
+ if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) {
+ /* Remove from the list */
+ if (table->prev != NULL)
+ table->prev->next = table->next;
+
+ if (table->next != NULL)
+ table->next->prev = table->prev;
+
+ /* Deallocate pages */
+ kern_return_t kt;
+ kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
+ if (kt != KERN_SUCCESS)
+ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+
+ kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
+ if (kt != KERN_SUCCESS)
+ fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+
+ /* Deallocate free list */
+ free (table->free_list_pool);
+ free (table);
+ } else if (ffi_trampoline_tables != table) {
+ /* Otherwise, bump this table to the top of the list */
+ table->prev = NULL;
+ table->next = ffi_trampoline_tables;
+ if (ffi_trampoline_tables != NULL)
+ ffi_trampoline_tables->prev = table;
+
+ ffi_trampoline_tables = table;
+ }
+
+ pthread_mutex_unlock (&ffi_trampoline_lock);
+
+ /* Free the closure */
+ free (closure);
+}
+
+#else
+
#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \
unsigned int __ctx = (unsigned int)(CTX); \
- *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */ \
- *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \
- *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \
+ unsigned char *insns = (unsigned char *)(CTX); \
+ memcpy (__tramp, ffi_arm_trampoline, sizeof ffi_arm_trampoline); \
*(unsigned int*) &__tramp[12] = __ctx; \
*(unsigned int*) &__tramp[16] = __fun; \
- __clear_cache((&__tramp[0]), (&__tramp[19])); \
+ __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping. */ \
+ __clear_cache(insns, insns + 3 * sizeof (unsigned int)); \
+ /* Clear instruction \
+ mapping. */ \
})
+#endif
/* the cif must already be prep'ed */
@@ -295,15 +607,150 @@ ffi_prep_closure_loc (ffi_closure* closure,
void *user_data,
void *codeloc)
{
- FFI_ASSERT (cif->abi == FFI_SYSV);
-
+ void (*closure_func)(ffi_closure*) = NULL;
+
+ if (cif->abi == FFI_SYSV)
+ closure_func = &ffi_closure_SYSV;
+#ifdef __ARM_EABI__
+ else if (cif->abi == FFI_VFP)
+ closure_func = &ffi_closure_VFP;
+#endif
+ else
+ return FFI_BAD_ABI;
+
+#if FFI_EXEC_TRAMPOLINE_TABLE
+ void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc);
+ config[0] = closure;
+ config[1] = closure_func;
+#else
FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
- &ffi_closure_SYSV, \
+ closure_func, \
codeloc);
-
+#endif
+
closure->cif = cif;
closure->user_data = user_data;
closure->fun = fun;
return FFI_OK;
}
+
+/* Below are routines for VFP hard-float support. */
+
+static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum)
+{
+ switch (t->type)
+ {
+ case FFI_TYPE_FLOAT:
+ case FFI_TYPE_DOUBLE:
+ *elt = (int) t->type;
+ *elnum = 1;
+ return 1;
+
+ case FFI_TYPE_STRUCT_VFP_FLOAT:
+ *elt = FFI_TYPE_FLOAT;
+ *elnum = t->size / sizeof (float);
+ return 1;
+
+ case FFI_TYPE_STRUCT_VFP_DOUBLE:
+ *elt = FFI_TYPE_DOUBLE;
+ *elnum = t->size / sizeof (double);
+ return 1;
+
+ case FFI_TYPE_STRUCT:;
+ {
+ int base_elt = 0, total_elnum = 0;
+ ffi_type **el = t->elements;
+ while (*el)
+ {
+ int el_elt = 0, el_elnum = 0;
+ if (! rec_vfp_type_p (*el, &el_elt, &el_elnum)
+ || (base_elt && base_elt != el_elt)
+ || total_elnum + el_elnum > 4)
+ return 0;
+ base_elt = el_elt;
+ total_elnum += el_elnum;
+ el++;
+ }
+ *elnum = total_elnum;
+ *elt = base_elt;
+ return 1;
+ }
+ default: ;
+ }
+ return 0;
+}
+
+static int vfp_type_p (ffi_type *t)
+{
+ int elt, elnum;
+ if (rec_vfp_type_p (t, &elt, &elnum))
+ {
+ if (t->type == FFI_TYPE_STRUCT)
+ {
+ if (elnum == 1)
+ t->type = elt;
+ else
+ t->type = (elt == FFI_TYPE_FLOAT
+ ? FFI_TYPE_STRUCT_VFP_FLOAT
+ : FFI_TYPE_STRUCT_VFP_DOUBLE);
+ }
+ return (int) t->type;
+ }
+ return 0;
+}
+
+static void place_vfp_arg (ffi_cif *cif, ffi_type *t)
+{
+ int reg = cif->vfp_reg_free;
+ int nregs = t->size / sizeof (float);
+ int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT
+ || t->type == FFI_TYPE_FLOAT) ? 1 : 2);
+ /* Align register number. */
+ if ((reg & 1) && align == 2)
+ reg++;
+ while (reg + nregs <= 16)
+ {
+ int s, new_used = 0;
+ for (s = reg; s < reg + nregs; s++)
+ {
+ new_used |= (1 << s);
+ if (cif->vfp_used & (1 << s))
+ {
+ reg += align;
+ goto next_reg;
+ }
+ }
+ /* Found regs to allocate. */
+ cif->vfp_used |= new_used;
+ cif->vfp_args[cif->vfp_nargs++] = reg;
+
+ /* Update vfp_reg_free. */
+ if (cif->vfp_used & (1 << cif->vfp_reg_free))
+ {
+ reg += nregs;
+ while (cif->vfp_used & (1 << reg))
+ reg += 1;
+ cif->vfp_reg_free = reg;
+ }
+ return;
+ next_reg: ;
+ }
+}
+
+static void layout_vfp_args (ffi_cif *cif)
+{
+ int i;
+ /* Init VFP fields */
+ cif->vfp_used = 0;
+ cif->vfp_nargs = 0;
+ cif->vfp_reg_free = 0;
+ memset (cif->vfp_args, -1, 16); /* Init to -1. */
+
+ for (i = 0; i < cif->nargs; i++)
+ {
+ ffi_type *t = cif->arg_types[i];
+ if (vfp_type_p (t))
+ place_vfp_arg (cif, t);
+ }
+}
diff --git a/Modules/_ctypes/libffi/src/arm/ffitarget.h b/Modules/_ctypes/libffi/src/arm/ffitarget.h
index a957426..26d494d 100644
--- a/Modules/_ctypes/libffi/src/arm/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/arm/ffitarget.h
@@ -1,5 +1,8 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 2010 CodeSourcery
+ Copyright (c) 1996-2003 Red Hat, Inc.
+
Target configuration macros for ARM.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +30,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
@@ -34,11 +41,27 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
+ FFI_VFP,
+ FFI_LAST_ABI,
+#ifdef __ARM_PCS_VFP
+ FFI_DEFAULT_ABI = FFI_VFP,
+#else
FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+#endif
} ffi_abi;
#endif
+#define FFI_EXTRA_CIF_FIELDS \
+ int vfp_used; \
+ short vfp_reg_free, vfp_nargs; \
+ signed char vfp_args[16] \
+
+/* Internally used. */
+#define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1)
+#define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2)
+
+#define FFI_TARGET_SPECIFIC_VARIADIC
+
/* ---- Definitions for closures ----------------------------------------- */
#define FFI_CLOSURES 1
@@ -46,4 +69,3 @@ typedef enum ffi_abi {
#define FFI_NATIVE_RAW_API 0
#endif
-
diff --git a/Modules/_ctypes/libffi/src/arm/gentramp.sh b/Modules/_ctypes/libffi/src/arm/gentramp.sh
new file mode 100644
index 0000000..74f0b86
--- /dev/null
+++ b/Modules/_ctypes/libffi/src/arm/gentramp.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+# -----------------------------------------------------------------------
+# gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#
+# ARM Trampoline Page Generator
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# ``Software''), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+# -----------------------------------------------------------------------
+
+PROGNAME=$0
+
+# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change,
+# the entire arm trampoline implementation must be updated to match, too.
+
+# Size of an individual trampoline, in bytes
+TRAMPOLINE_SIZE=12
+
+# Page size, in bytes
+PAGE_SIZE=4096
+
+# Compute the size of the reachable config page; The first 16 bytes of the config page
+# are unreachable due to our maximum pc-relative ldr offset.
+PAGE_AVAIL=`expr $PAGE_SIZE - 16`
+
+# Compute the number of of available trampolines.
+TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE`
+
+header () {
+ echo "# GENERATED CODE - DO NOT EDIT"
+ echo "# This file was generated by $PROGNAME"
+ echo ""
+
+ # Write out the license header
+cat << EOF
+# Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# ``Software''), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+# -----------------------------------------------------------------------
+
+EOF
+
+ # Write out the trampoline table, aligned to the page boundary
+ echo ".text"
+ echo ".align 12"
+ echo ".globl _ffi_closure_trampoline_table_page"
+ echo "_ffi_closure_trampoline_table_page:"
+}
+
+
+# WARNING - Don't modify the trampoline code size without also updating the relevent libffi code
+trampoline () {
+ cat << END
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+END
+}
+
+main () {
+ # Write out the header
+ header
+
+ # Write out the trampolines
+ local i=0
+ while [ $i -lt ${TRAMPOLINE_COUNT} ]; do
+ trampoline
+ local i=`expr $i + 1`
+ done
+}
+
+main
diff --git a/Modules/_ctypes/libffi/src/arm/sysv.S b/Modules/_ctypes/libffi/src/arm/sysv.S
index 9064318..fb38cd6 100644
--- a/Modules/_ctypes/libffi/src/arm/sysv.S
+++ b/Modules/_ctypes/libffi/src/arm/sysv.S
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------------
- sysv.S - Copyright (c) 1998, 2008 Red Hat, Inc.
+ sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
ARM Foreign Function Interface
@@ -39,7 +40,11 @@
#else
#define CNAME(x) x
#endif
+#ifdef __APPLE__
+#define ENTRY(x) .globl _##x; _##x:
+#else
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+#endif /* __APPLE__ */
#endif
#ifdef __ELF__
@@ -48,6 +53,12 @@
#define LSYM(x) x
#endif
+/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI
+ Function Call Guide */
+#ifdef __APPLE__
+#define __SOFTFP__
+#endif
+
/* We need a better way of testing for this, but for now, this is all
we can do. */
@ This selects the minimum architecture level required.
@@ -105,21 +116,33 @@
.align 0
.thumb
.thumb_func
+#ifdef __APPLE__
+ ENTRY($0)
+#else
ENTRY(\name)
+#endif
bx pc
nop
.arm
UNWIND .fnstart
/* A hook to tell gdb that we've switched to ARM mode. Also used to call
directly from other local arm routines. */
-_L__\name:
+#ifdef __APPLE__
+_L__$0:
+#else
+_L__\name:
+#endif
.endm
#else
.macro ARM_FUNC_START name
.text
.align 0
.arm
+#ifdef __APPLE__
+ ENTRY($0)
+#else
ENTRY(\name)
+#endif
UNWIND .fnstart
.endm
#endif
@@ -141,13 +164,11 @@ _L__\name:
#endif
.endm
-
@ r0: ffi_prep_args
@ r1: &ecif
@ r2: cif->bytes
@ r3: fig->flags
@ sp+0: ecif.rvalue
- @ sp+4: fn
@ This assumes we are using gas.
ARM_FUNC_START ffi_call_SYSV
@@ -162,24 +183,23 @@ ARM_FUNC_START ffi_call_SYSV
sub sp, fp, r2
@ Place all of the ffi_prep_args in position
- mov ip, r0
mov r0, sp
@ r1 already set
@ Call ffi_prep_args(stack, &ecif)
- call_reg(ip)
+ bl CNAME(ffi_prep_args)
@ move first 4 parameters in registers
ldmia sp, {r0-r3}
@ and adjust stack
- ldr ip, [fp, #8]
- cmp ip, #16
- movhs ip, #16
- add sp, sp, ip
+ sub lr, fp, sp @ cif->bytes == fp - sp
+ ldr ip, [fp] @ load fn() in advance
+ cmp lr, #16
+ movhs lr, #16
+ add sp, sp, lr
@ call (fn) (...)
- ldr ip, [fp, #28]
call_reg(ip)
@ Remove the space we pushed for the args
@@ -224,11 +244,19 @@ ARM_FUNC_START ffi_call_SYSV
#endif
LSYM(Lepilogue):
- RETLDM "r0-r3,fp"
+#if defined (__INTERWORKING__)
+ ldmia sp!, {r0-r3,fp, lr}
+ bx lr
+#else
+ ldmia sp!, {r0-r3,fp, pc}
+#endif
.ffi_call_SYSV_end:
UNWIND .fnend
+#ifdef __ELF__
.size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
+#endif
+
/*
unsigned int FFI_HIDDEN
@@ -244,11 +272,11 @@ ARM_FUNC_START ffi_closure_SYSV
stmfd sp!, {ip, lr}
UNWIND .save {r0, lr}
add r2, sp, #8
- .pad #16
+ UNWIND .pad #16
sub sp, sp, #16
str sp, [sp, #8]
add r1, sp, #8
- bl ffi_closure_SYSV_inner
+ bl CNAME(ffi_closure_SYSV_inner)
cmp r0, #FFI_TYPE_INT
beq .Lretint
@@ -300,7 +328,177 @@ ARM_FUNC_START ffi_closure_SYSV
.ffi_closure_SYSV_end:
UNWIND .fnend
+#ifdef __ELF__
.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+#endif
+
+
+/* Below are VFP hard-float ABI call and closure implementations.
+ Add VFP FPU directive here. This is only compiled into the library
+ under EABI. */
+#ifdef __ARM_EABI__
+ .fpu vfp
+
+ @ r0: fn
+ @ r1: &ecif
+ @ r2: cif->bytes
+ @ r3: fig->flags
+ @ sp+0: ecif.rvalue
+
+ARM_FUNC_START ffi_call_VFP
+ @ Save registers
+ stmfd sp!, {r0-r3, fp, lr}
+ UNWIND .save {r0-r3, fp, lr}
+ mov fp, sp
+ UNWIND .setfp fp, sp
+
+ @ Make room for all of the new args.
+ sub sp, sp, r2
+
+ @ Make room for loading VFP args
+ sub sp, sp, #64
+
+ @ Place all of the ffi_prep_args in position
+ mov r0, sp
+ @ r1 already set
+ sub r2, fp, #64 @ VFP scratch space
+
+ @ Call ffi_prep_args(stack, &ecif, vfp_space)
+ bl CNAME(ffi_prep_args)
+
+ @ Load VFP register args if needed
+ cmp r0, #0
+ beq LSYM(Lbase_args)
+
+ @ Load only d0 if possible
+ cmp r0, #3
+ sub ip, fp, #64
+ flddle d0, [ip]
+ fldmiadgt ip, {d0-d7}
+
+LSYM(Lbase_args):
+ @ move first 4 parameters in registers
+ ldmia sp, {r0-r3}
+
+ @ and adjust stack
+ sub lr, ip, sp @ cif->bytes == (fp - 64) - sp
+ ldr ip, [fp] @ load fn() in advance
+ cmp lr, #16
+ movhs lr, #16
+ add sp, sp, lr
+
+ @ call (fn) (...)
+ call_reg(ip)
+
+ @ Remove the space we pushed for the args
+ mov sp, fp
+
+ @ Load r2 with the pointer to storage for
+ @ the return value
+ ldr r2, [sp, #24]
+
+ @ Load r3 with the return type code
+ ldr r3, [sp, #12]
+
+ @ If the return value pointer is NULL,
+ @ assume no return value.
+ cmp r2, #0
+ beq LSYM(Lepilogue_vfp)
+
+ cmp r3, #FFI_TYPE_INT
+ streq r0, [r2]
+ beq LSYM(Lepilogue_vfp)
+
+ cmp r3, #FFI_TYPE_SINT64
+ stmeqia r2, {r0, r1}
+ beq LSYM(Lepilogue_vfp)
+
+ cmp r3, #FFI_TYPE_FLOAT
+ fstseq s0, [r2]
+ beq LSYM(Lepilogue_vfp)
+
+ cmp r3, #FFI_TYPE_DOUBLE
+ fstdeq d0, [r2]
+ beq LSYM(Lepilogue_vfp)
+
+ cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT
+ cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE
+ fstmiadeq r2, {d0-d3}
+
+LSYM(Lepilogue_vfp):
+ RETLDM "r0-r3,fp"
+
+.ffi_call_VFP_end:
+ UNWIND .fnend
+ .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP)
+
+
+ARM_FUNC_START ffi_closure_VFP
+ fstmfdd sp!, {d0-d7}
+ @ r0-r3, then d0-d7
+ UNWIND .pad #80
+ add ip, sp, #80
+ stmfd sp!, {ip, lr}
+ UNWIND .save {r0, lr}
+ add r2, sp, #72
+ add r3, sp, #8
+ UNWIND .pad #72
+ sub sp, sp, #72
+ str sp, [sp, #64]
+ add r1, sp, #64
+ bl CNAME(ffi_closure_SYSV_inner)
+
+ cmp r0, #FFI_TYPE_INT
+ beq .Lretint_vfp
+
+ cmp r0, #FFI_TYPE_FLOAT
+ beq .Lretfloat_vfp
+
+ cmp r0, #FFI_TYPE_DOUBLE
+ cmpne r0, #FFI_TYPE_LONGDOUBLE
+ beq .Lretdouble_vfp
+
+ cmp r0, #FFI_TYPE_SINT64
+ beq .Lretlonglong_vfp
+
+ cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT
+ beq .Lretfloat_struct_vfp
+
+ cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE
+ beq .Lretdouble_struct_vfp
+
+.Lclosure_epilogue_vfp:
+ add sp, sp, #72
+ ldmfd sp, {sp, pc}
+
+.Lretfloat_vfp:
+ flds s0, [sp]
+ b .Lclosure_epilogue_vfp
+.Lretdouble_vfp:
+ fldd d0, [sp]
+ b .Lclosure_epilogue_vfp
+.Lretint_vfp:
+ ldr r0, [sp]
+ b .Lclosure_epilogue_vfp
+.Lretlonglong_vfp:
+ ldmia sp, {r0, r1}
+ b .Lclosure_epilogue_vfp
+.Lretfloat_struct_vfp:
+ fldmiad sp, {d0-d1}
+ b .Lclosure_epilogue_vfp
+.Lretdouble_struct_vfp:
+ fldmiad sp, {d0-d3}
+ b .Lclosure_epilogue_vfp
+
+.ffi_closure_VFP_end:
+ UNWIND .fnend
+ .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP)
+#endif
+
+ENTRY(ffi_arm_trampoline)
+ stmfd sp!, {r0-r3}
+ ldr r0, [pc]
+ ldr pc, [pc]
#if defined __ELF__ && defined __linux__
.section .note.GNU-stack,"",%progbits
diff --git a/Modules/_ctypes/libffi/src/arm/trampoline.S b/Modules/_ctypes/libffi/src/arm/trampoline.S
new file mode 100644
index 0000000..935e8de
--- /dev/null
+++ b/Modules/_ctypes/libffi/src/arm/trampoline.S
@@ -0,0 +1,4450 @@
+# GENERATED CODE - DO NOT EDIT
+# This file was generated by src/arm/gentramp.sh
+
+# Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# Software''), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+# -----------------------------------------------------------------------
+
+.text
+.align 12
+.globl _ffi_closure_trampoline_table_page
+_ffi_closure_trampoline_table_page:
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
+
+ // trampoline
+ // Save to stack
+ stmfd sp!, {r0-r3}
+
+ // Load the context argument from the config page.
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+ ldr r0, [pc, #-4092]
+
+ // Load the jump address from the config page.
+ ldr pc, [pc, #-4092]
+
diff --git a/Modules/_ctypes/libffi/src/avr32/ffi.c b/Modules/_ctypes/libffi/src/avr32/ffi.c
index 39fba2b..3d43397 100644
--- a/Modules/_ctypes/libffi/src/avr32/ffi.c
+++ b/Modules/_ctypes/libffi/src/avr32/ffi.c
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
+ ffi.c - Copyright (c) 2011 Anthony Green
+ Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
AVR32 Foreign Function Interface
@@ -394,7 +395,8 @@ ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif,
void (*fun)(ffi_cif*, void*, void**, void*), void *user_data,
void *codeloc)
{
- FFI_ASSERT(cif->abi == FFI_SYSV);
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]);
unsigned int __fun = (unsigned int)(&ffi_closure_SYSV);
diff --git a/Modules/_ctypes/libffi/src/avr32/ffitarget.h b/Modules/_ctypes/libffi/src/avr32/ffitarget.h
index 1c799b1..d0c7586 100644
--- a/Modules/_ctypes/libffi/src/avr32/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/avr32/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
Target configuration macros for AVR32.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
@@ -34,8 +39,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/closures.c b/Modules/_ctypes/libffi/src/closures.c
index 0b156e0..1b37827 100644
--- a/Modules/_ctypes/libffi/src/closures.c
+++ b/Modules/_ctypes/libffi/src/closures.c
@@ -1,6 +1,7 @@
/* -----------------------------------------------------------------------
- closures.c - Copyright (c) 2007 Red Hat, Inc.
- Copyright (C) 2007, 2009 Free Software Foundation, Inc
+ closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
+ Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
Code to allocate and deallocate memory for closures.
@@ -32,7 +33,7 @@
#include <ffi.h>
#include <ffi_common.h>
-#ifndef FFI_MMAP_EXEC_WRIT
+#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
# if __gnu_linux__
/* This macro indicates it may be forbidden to map anonymous memory
with both write and execute permission. Code compiled when this
@@ -44,7 +45,7 @@
# define FFI_MMAP_EXEC_WRIT 1
# define HAVE_MNTENT 1
# endif
-# if defined(X86_WIN32) || defined(X86_WIN64)
+# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)
/* Windows systems may have Data Execution Protection (DEP) enabled,
which requires the use of VirtualMalloc/VirtualFree to alloc/free
executable memory. */
@@ -63,7 +64,11 @@
#if FFI_CLOSURES
-# if FFI_MMAP_EXEC_WRIT
+# if FFI_EXEC_TRAMPOLINE_TABLE
+
+// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
+
+# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
#define USE_LOCKS 1
#define USE_DL_PREFIX 1
@@ -146,7 +151,7 @@ selinux_enabled_check (void)
p = strchr (p + 1, ' ');
if (p == NULL)
break;
- if (strncmp (p + 1, "selinuxfs ", 10) != 0)
+ if (strncmp (p + 1, "selinuxfs ", 10) == 0)
{
free (buf);
fclose (f);
@@ -167,7 +172,7 @@ selinux_enabled_check (void)
#endif /* !FFI_MMAP_EXEC_SELINUX */
-#elif defined (__CYGWIN__)
+#elif defined (__CYGWIN__) || defined(__INTERIX)
#include <sys/mman.h>
@@ -193,11 +198,11 @@ static int dlmalloc_trim(size_t) MAYBE_UNUSED;
static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED;
static void dlmalloc_stats(void) MAYBE_UNUSED;
-#if !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__)
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
/* Use these for mmap and munmap within dlmalloc.c. */
static void *dlmmap(void *, size_t, int, int, int, off_t);
static int dlmunmap(void *, size_t);
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__) */
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
#define mmap dlmmap
#define munmap dlmunmap
@@ -207,7 +212,7 @@ static int dlmunmap(void *, size_t);
#undef mmap
#undef munmap
-#if !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__)
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
/* A mutex used to synchronize access to *exec* variables in this file. */
static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -294,7 +299,7 @@ open_temp_exec_file_mnt (const char *mounts)
struct mntent mnt;
char buf[MAXPATHLEN * 3];
- if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)))
+ if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL)
return -1;
if (hasmntopt (&mnt, "ro")
@@ -522,7 +527,7 @@ segment_holding_code (mstate m, char* addr)
}
#endif
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__) */
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
/* Allocate a chunk of memory with the given size. Returns a pointer
to the writable address, and sets *CODE to the executable
diff --git a/Modules/_ctypes/libffi/src/cris/ffi.c b/Modules/_ctypes/libffi/src/cris/ffi.c
index e9c3953..aaca5b1 100644
--- a/Modules/_ctypes/libffi/src/cris/ffi.c
+++ b/Modules/_ctypes/libffi/src/cris/ffi.c
@@ -153,21 +153,24 @@ ffi_prep_args (char *stack, extended_cif * ecif)
return (struct_count);
}
-ffi_status
-ffi_prep_cif (ffi_cif * cif,
- ffi_abi abi, unsigned int nargs,
- ffi_type * rtype, ffi_type ** atypes)
+ffi_status FFI_HIDDEN
+ffi_prep_cif_core (ffi_cif * cif,
+ ffi_abi abi, unsigned int isvariadic,
+ unsigned int nfixedargs, unsigned int ntotalargs,
+ ffi_type * rtype, ffi_type ** atypes)
{
unsigned bytes = 0;
unsigned int i;
ffi_type **ptr;
FFI_ASSERT (cif != NULL);
- FFI_ASSERT ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
+ FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
+ FFI_ASSERT(nfixedargs <= ntotalargs);
+ FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
cif->abi = abi;
cif->arg_types = atypes;
- cif->nargs = nargs;
+ cif->nargs = ntotalargs;
cif->rtype = rtype;
cif->flags = 0;
diff --git a/Modules/_ctypes/libffi/src/cris/ffitarget.h b/Modules/_ctypes/libffi/src/cris/ffitarget.h
index 4257f10..b837e97 100644
--- a/Modules/_ctypes/libffi/src/cris/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/cris/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for CRIS.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
@@ -34,8 +39,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/dlmalloc.c b/Modules/_ctypes/libffi/src/dlmalloc.c
index 582ddc3..2773953 100644
--- a/Modules/_ctypes/libffi/src/dlmalloc.c
+++ b/Modules/_ctypes/libffi/src/dlmalloc.c
@@ -464,6 +464,14 @@ DEFAULT_MMAP_THRESHOLD default: 256K
#define _GNU_SOURCE 1
#endif /* WIN32 */
+#ifdef __OS2__
+#define INCL_DOS
+#include <os2.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_SYS_MMAN_H
+#endif /* __OS2__ */
+
#if defined(DARWIN) || defined(_DARWIN)
/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
#ifndef HAVE_MORECORE
@@ -619,6 +627,9 @@ DEFAULT_MMAP_THRESHOLD default: 256K
#include "/usr/include/malloc.h"
#else /* HAVE_USR_INCLUDE_MALLOC_H */
+/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */
+#define _STRUCT_MALLINFO
+
struct mallinfo {
MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */
MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */
@@ -1293,7 +1304,7 @@ extern void* sbrk(ptrdiff_t);
#define IS_MMAPPED_BIT (SIZE_T_ONE)
#define USE_MMAP_BIT (SIZE_T_ONE)
-#ifndef WIN32
+#if !defined(WIN32) && !defined (__OS2__)
#define CALL_MUNMAP(a, s) munmap((a), (s))
#define MMAP_PROT (PROT_READ|PROT_WRITE)
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
@@ -1316,6 +1327,42 @@ static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
#endif /* MAP_ANONYMOUS */
#define DIRECT_MMAP(s) CALL_MMAP(s)
+
+#elif defined(__OS2__)
+
+/* OS/2 MMAP via DosAllocMem */
+static void* os2mmap(size_t size) {
+ void* ptr;
+ if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) &&
+ DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE))
+ return MFAIL;
+ return ptr;
+}
+
+#define os2direct_mmap(n) os2mmap(n)
+
+/* This function supports releasing coalesed segments */
+static int os2munmap(void* ptr, size_t size) {
+ while (size) {
+ ULONG ulSize = size;
+ ULONG ulFlags = 0;
+ if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0)
+ return -1;
+ if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 ||
+ ulSize > size)
+ return -1;
+ if (DosFreeMem(ptr) != 0)
+ return -1;
+ ptr = ( void * ) ( ( char * ) ptr + ulSize );
+ size -= ulSize;
+ }
+ return 0;
+}
+
+#define CALL_MMAP(s) os2mmap(s)
+#define CALL_MUNMAP(a, s) os2munmap((a), (s))
+#define DIRECT_MMAP(s) os2direct_mmap(s)
+
#else /* WIN32 */
/* Win32 MMAP via VirtualAlloc */
@@ -1392,7 +1439,7 @@ static int win32munmap(void* ptr, size_t size) {
unique mparams values are initialized only once.
*/
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__OS2__)
/* By default use posix locks */
#include <pthread.h>
#define MLOCK_T pthread_mutex_t
@@ -1406,6 +1453,16 @@ static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+#elif defined(__OS2__)
+#define MLOCK_T HMTX
+#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE)
+#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT)
+#define RELEASE_LOCK(l) DosReleaseMutexSem(*l)
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex;
+#endif /* HAVE_MORECORE */
+static MLOCK_T magic_init_mutex;
+
#else /* WIN32 */
/*
Because lock-protected regions have bounded times, and there
@@ -2497,10 +2554,15 @@ static int init_mparams(void) {
}
RELEASE_MAGIC_INIT_LOCK();
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__OS2__)
mparams.page_size = malloc_getpagesize;
mparams.granularity = ((DEFAULT_GRANULARITY != 0)?
DEFAULT_GRANULARITY : mparams.page_size);
+#elif defined (__OS2__)
+ /* if low-memory is used, os2munmap() would break
+ if it were anything other than 64k */
+ mparams.page_size = 4096u;
+ mparams.granularity = 65536u;
#else /* WIN32 */
{
SYSTEM_INFO system_info;
@@ -4197,7 +4259,7 @@ void* dlmalloc(size_t bytes) {
void dlfree(void* mem) {
/*
- Consolidate freed chunks with preceeding or succeeding bordering
+ Consolidate freed chunks with preceding or succeeding bordering
free chunks, if they exist, and then place in a bin. Intermixed
with special cases for top, dv, mmapped chunks, and usage errors.
*/
diff --git a/Modules/_ctypes/libffi/src/frv/ffitarget.h b/Modules/_ctypes/libffi/src/frv/ffitarget.h
index 1c319ea..d42540e 100644
--- a/Modules/_ctypes/libffi/src/frv/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/frv/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2004 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2004 Red Hat, Inc.
Target configuration macros for FR-V
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- System specific configurations ----------------------------------- */
#ifndef LIBFFI_ASM
@@ -35,13 +40,9 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
-
-#ifdef FRV
FFI_EABI,
- FFI_DEFAULT_ABI = FFI_EABI,
-#endif
-
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_EABI
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/ia64/ffi.c b/Modules/_ctypes/libffi/src/ia64/ffi.c
index 3f8fcc5..9533ef6 100644
--- a/Modules/_ctypes/libffi/src/ia64/ffi.c
+++ b/Modules/_ctypes/libffi/src/ia64/ffi.c
@@ -1,6 +1,7 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1998, 2007, 2008 Red Hat, Inc.
+ ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc.
Copyright (c) 2000 Hewlett Packard Company
+ Copyright (c) 2011 Anthony Green
IA64 Foreign Function Interface
@@ -225,7 +226,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
int flags;
/* Adjust cif->bytes to include space for the bits of the ia64_args frame
- that preceeds the integer register portion. The estimate that the
+ that precedes the integer register portion. The estimate that the
generic bits did for the argument space required is good enough for the
integer component. */
cif->bytes += offsetof(struct ia64_args, gp_regs[0]);
@@ -324,13 +325,17 @@ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
case FFI_TYPE_FLOAT:
if (gpcount < 8 && fpcount < 8)
stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]);
- stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i];
+ {
+ UINT32 tmp;
+ memcpy (&tmp, avalue[i], sizeof (UINT32));
+ stack->gp_regs[gpcount++] = tmp;
+ }
break;
case FFI_TYPE_DOUBLE:
if (gpcount < 8 && fpcount < 8)
stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]);
- stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i];
+ memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64));
break;
case FFI_TYPE_LONGDOUBLE:
@@ -425,7 +430,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
struct ffi_ia64_trampoline_struct *tramp;
struct ia64_fd *fd;
- FFI_ASSERT (cif->abi == FFI_UNIX);
+ if (cif->abi != FFI_UNIX)
+ return FFI_BAD_ABI;
tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
fd = (struct ia64_fd *)(void *)ffi_closure_unix;
diff --git a/Modules/_ctypes/libffi/src/ia64/ffitarget.h b/Modules/_ctypes/libffi/src/ia64/ffitarget.h
index d85c049..e68cea6 100644
--- a/Modules/_ctypes/libffi/src/ia64/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/ia64/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for IA-64.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long long ffi_arg;
typedef signed long long ffi_sarg;
@@ -34,8 +39,8 @@ typedef signed long long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_UNIX, /* Linux and all Unix variants use the same conventions */
- FFI_DEFAULT_ABI = FFI_UNIX,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_UNIX
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/java_raw_api.c b/Modules/_ctypes/libffi/src/java_raw_api.c
index 9c5383e..522c8bf 100644
--- a/Modules/_ctypes/libffi/src/java_raw_api.c
+++ b/Modules/_ctypes/libffi/src/java_raw_api.c
@@ -311,7 +311,7 @@ ffi_java_translate_args (ffi_cif *cif, void *rvalue,
ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
ffi_java_ptrarray_to_raw (cif, avalue, raw);
- (*cl->fun) (cif, rvalue, raw, cl->user_data);
+ (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
ffi_java_raw_to_rvalue (cif, rvalue);
}
diff --git a/Modules/_ctypes/libffi/src/m32r/ffitarget.h b/Modules/_ctypes/libffi/src/m32r/ffitarget.h
index 6a761f6..6c34801 100644
--- a/Modules/_ctypes/libffi/src/m32r/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/m32r/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 2004 Renesas Technology.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 2004 Renesas Technology.
Target configuration macros for M32R.
Permission is hereby granted, free of charge, to any person obtaining
@@ -26,6 +27,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- Generic type definitions ----------------------------------------- */
#ifndef LIBFFI_ASM
@@ -36,8 +41,8 @@ typedef enum ffi_abi
{
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/m68k/ffi.c b/Modules/_ctypes/libffi/src/m68k/ffi.c
index 600cf20..37a0784 100644
--- a/Modules/_ctypes/libffi/src/m68k/ffi.c
+++ b/Modules/_ctypes/libffi/src/m68k/ffi.c
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------
ffi.c
-
- m68k Foreign Function Interface
+
+ m68k Foreign Function Interface
----------------------------------------------------------------------- */
#include <ffi.h>
@@ -9,8 +9,17 @@
#include <stdlib.h>
#include <unistd.h>
+#ifdef __rtems__
+void rtems_cache_flush_multiple_data_lines( const void *, size_t );
+#else
#include <sys/syscall.h>
+#ifdef __MINT__
+#include <mint/mintbind.h>
+#include <mint/ssystem.h>
+#else
#include <asm/cachectl.h>
+#endif
+#endif
void ffi_call_SYSV (extended_cif *,
unsigned, unsigned,
@@ -35,8 +44,12 @@ ffi_prep_args (void *stack, extended_cif *ecif)
argp = stack;
- if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
- && !ecif->cif->flags)
+ if (
+#ifdef __MINT__
+ (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
+#endif
+ (((ecif->cif->rtype->type == FFI_TYPE_STRUCT)
+ && !ecif->cif->flags)))
struct_value_ptr = ecif->rvalue;
else
struct_value_ptr = NULL;
@@ -47,12 +60,12 @@ ffi_prep_args (void *stack, extended_cif *ecif)
i != 0;
i--, p_arg++)
{
- size_t z;
+ size_t z = (*p_arg)->size;
+ int type = (*p_arg)->type;
- z = (*p_arg)->size;
if (z < sizeof (int))
{
- switch ((*p_arg)->type)
+ switch (type)
{
case FFI_TYPE_SINT8:
*(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
@@ -71,7 +84,14 @@ ffi_prep_args (void *stack, extended_cif *ecif)
break;
case FFI_TYPE_STRUCT:
+#ifdef __MINT__
+ if (z == 1 || z == 2)
+ memcpy (argp + 2, *p_argv, z);
+ else
+ memcpy (argp, *p_argv, z);
+#else
memcpy (argp + sizeof (int) - z, *p_argv, z);
+#endif
break;
default:
@@ -116,17 +136,34 @@ ffi_prep_cif_machdep (ffi_cif *cif)
break;
case FFI_TYPE_STRUCT:
+ if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
+ cif->rtype->elements[1])
+ {
+ cif->flags = 0;
+ break;
+ }
+
switch (cif->rtype->size)
{
case 1:
+#ifdef __MINT__
+ cif->flags = CIF_FLAGS_STRUCT2;
+#else
cif->flags = CIF_FLAGS_STRUCT1;
+#endif
break;
case 2:
cif->flags = CIF_FLAGS_STRUCT2;
break;
+#ifdef __MINT__
+ case 3:
+#endif
case 4:
cif->flags = CIF_FLAGS_INT;
break;
+#ifdef __MINT__
+ case 7:
+#endif
case 8:
cif->flags = CIF_FLAGS_DINT;
break;
@@ -144,9 +181,15 @@ ffi_prep_cif_machdep (ffi_cif *cif)
cif->flags = CIF_FLAGS_DOUBLE;
break;
+#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE)
case FFI_TYPE_LONGDOUBLE:
+#ifdef __MINT__
+ cif->flags = 0;
+#else
cif->flags = CIF_FLAGS_LDOUBLE;
+#endif
break;
+#endif
case FFI_TYPE_POINTER:
cif->flags = CIF_FLAGS_POINTER;
@@ -212,6 +255,26 @@ ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif)
size_t z;
z = (*p_arg)->size;
+#ifdef __MINT__
+ if (cif->flags &&
+ cif->rtype->type == FFI_TYPE_STRUCT &&
+ (z == 1 || z == 2))
+ {
+ *p_argv = (void *) (argp + 2);
+
+ z = 4;
+ }
+ else
+ if (cif->flags &&
+ cif->rtype->type == FFI_TYPE_STRUCT &&
+ (z == 3 || z == 4))
+ {
+ *p_argv = (void *) (argp);
+
+ z = 4;
+ }
+ else
+#endif
if (z <= 4)
{
*p_argv = (void *) (argp + 4 - z);
@@ -255,19 +318,31 @@ ffi_prep_closure_loc (ffi_closure* closure,
void *user_data,
void *codeloc)
{
- FFI_ASSERT (cif->abi == FFI_SYSV);
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
*(unsigned short *)closure->tramp = 0x207c;
*(void **)(closure->tramp + 2) = codeloc;
*(unsigned short *)(closure->tramp + 6) = 0x4ef9;
- if (cif->rtype->type == FFI_TYPE_STRUCT
- && !cif->flags)
+
+ if (
+#ifdef __MINT__
+ (cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
+#endif
+ (((cif->rtype->type == FFI_TYPE_STRUCT)
+ && !cif->flags)))
*(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV;
else
*(void **)(closure->tramp + 8) = ffi_closure_SYSV;
+#ifdef __rtems__
+ rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE );
+#elif defined(__MINT__)
+ Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE);
+#else
syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE,
FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE);
+#endif
closure->cif = cif;
closure->user_data = user_data;
@@ -275,4 +350,3 @@ ffi_prep_closure_loc (ffi_closure* closure,
return FFI_OK;
}
-
diff --git a/Modules/_ctypes/libffi/src/m68k/ffitarget.h b/Modules/_ctypes/libffi/src/m68k/ffitarget.h
index 633717b..e81dde2 100644
--- a/Modules/_ctypes/libffi/src/m68k/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/m68k/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for Motorola 68K.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
@@ -34,8 +39,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/m68k/sysv.S b/Modules/_ctypes/libffi/src/m68k/sysv.S
index 58822e0..f6f4ef9 100644
--- a/Modules/_ctypes/libffi/src/m68k/sysv.S
+++ b/Modules/_ctypes/libffi/src/m68k/sysv.S
@@ -1,5 +1,7 @@
/* -----------------------------------------------------------------------
- sysv.S - Copyright (c) 1998 Andreas Schwab
+
+ sysv.S - Copyright (c) 2012 Alan Hourihane
+ Copyright (c) 1998, 2012 Andreas Schwab
Copyright (c) 2008 Red Hat, Inc.
m68k Foreign Function Interface
@@ -41,13 +43,19 @@
#define CFI_ENDPROC()
#endif
+#ifdef __MINT__
+#define CALLFUNC(funcname) _ ## funcname
+#else
+#define CALLFUNC(funcname) funcname
+#endif
+
.text
- .globl ffi_call_SYSV
- .type ffi_call_SYSV,@function
+ .globl CALLFUNC(ffi_call_SYSV)
+ .type CALLFUNC(ffi_call_SYSV),@function
.align 4
-ffi_call_SYSV:
+CALLFUNC(ffi_call_SYSV):
CFI_STARTPROC()
link %fp,#0
CFI_OFFSET(14,-8)
@@ -62,14 +70,18 @@ ffi_call_SYSV:
move.l 8(%fp),-(%sp)
pea 4(%sp)
#if !defined __PIC__
- jsr ffi_prep_args
+ jsr CALLFUNC(ffi_prep_args)
#else
- bsr.l ffi_prep_args@PLTPC
+ bsr.l CALLFUNC(ffi_prep_args@PLTPC)
#endif
addq.l #8,%sp
| Pass pointer to struct value, if any
+#ifdef __MINT__
+ move.l %d0,%a1
+#else
move.l %a0,%a1
+#endif
| Call the function
move.l 24(%fp),%a0
@@ -85,7 +97,12 @@ ffi_call_SYSV:
move.l 16(%fp),%d2
| If the return value pointer is NULL, assume no return value.
+ | NOTE: On the mc68000, tst on an address register is not supported.
+#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
+ cmp.w #0, %a1
+#else
tst.l %a1
+#endif
jbeq noretval
btst #0,%d2
@@ -103,25 +120,44 @@ retlongint:
retfloat:
btst #2,%d2
jbeq retdouble
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.s %fp0,(%a1)
+#else
+ move.l %d0,(%a1)
+#endif
jbra epilogue
retdouble:
btst #3,%d2
jbeq retlongdouble
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.d %fp0,(%a1)
+#else
+ move.l %d0,(%a1)+
+ move.l %d1,(%a1)
+#endif
jbra epilogue
retlongdouble:
btst #4,%d2
jbeq retpointer
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.x %fp0,(%a1)
+#else
+ move.l %d0,(%a1)+
+ move.l %d1,(%a1)+
+ move.l %d2,(%a1)
+#endif
jbra epilogue
retpointer:
btst #5,%d2
jbeq retstruct1
+#ifdef __MINT__
+ move.l %d0,(%a1)
+#else
move.l %a0,(%a1)
+#endif
jbra epilogue
retstruct1:
@@ -141,13 +177,13 @@ epilogue:
unlk %fp
rts
CFI_ENDPROC()
- .size ffi_call_SYSV,.-ffi_call_SYSV
+ .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
- .globl ffi_closure_SYSV
- .type ffi_closure_SYSV, @function
+ .globl CALLFUNC(ffi_closure_SYSV)
+ .type CALLFUNC(ffi_closure_SYSV), @function
.align 4
-ffi_closure_SYSV:
+CALLFUNC(ffi_closure_SYSV):
CFI_STARTPROC()
link %fp,#-12
CFI_OFFSET(14,-8)
@@ -157,9 +193,9 @@ ffi_closure_SYSV:
pea -12(%fp)
move.l %a0,-(%sp)
#if !defined __PIC__
- jsr ffi_closure_SYSV_inner
+ jsr CALLFUNC(ffi_closure_SYSV_inner)
#else
- bsr.l ffi_closure_SYSV_inner@PLTPC
+ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
#endif
lsr.l #1,%d0
@@ -178,16 +214,31 @@ ffi_closure_SYSV:
move.l (%a0),%d1
jra .Lcls_epilogue
.Lcls_ret_float:
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.s (%a0),%fp0
+#else
+ move.l (%a0),%d0
+#endif
jra .Lcls_epilogue
1:
lsr.l #2,%d0
jne 1f
jcs .Lcls_ret_ldouble
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.d (%a0),%fp0
+#else
+ move.l (%a0)+,%d0
+ move.l (%a0),%d1
+#endif
jra .Lcls_epilogue
.Lcls_ret_ldouble:
+#if defined(__MC68881__) || defined(__HAVE_68881__)
fmove.x (%a0),%fp0
+#else
+ move.l (%a0)+,%d0
+ move.l (%a0)+,%d1
+ move.l (%a0),%d2
+#endif
jra .Lcls_epilogue
1:
lsr.l #2,%d0
@@ -204,13 +255,13 @@ ffi_closure_SYSV:
jra .Lcls_epilogue
CFI_ENDPROC()
- .size ffi_closure_SYSV,.-ffi_closure_SYSV
+ .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
- .globl ffi_closure_struct_SYSV
- .type ffi_closure_struct_SYSV, @function
+ .globl CALLFUNC(ffi_closure_struct_SYSV)
+ .type CALLFUNC(ffi_closure_struct_SYSV), @function
.align 4
-ffi_closure_struct_SYSV:
+CALLFUNC(ffi_closure_struct_SYSV):
CFI_STARTPROC()
link %fp,#0
CFI_OFFSET(14,-8)
@@ -220,14 +271,14 @@ ffi_closure_struct_SYSV:
move.l %a1,-(%sp)
move.l %a0,-(%sp)
#if !defined __PIC__
- jsr ffi_closure_SYSV_inner
+ jsr CALLFUNC(ffi_closure_SYSV_inner)
#else
- bsr.l ffi_closure_SYSV_inner@PLTPC
+ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
#endif
unlk %fp
rts
CFI_ENDPROC()
- .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
+ .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
#if defined __ELF__ && defined __linux__
.section .note.GNU-stack,"",@progbits
diff --git a/Modules/_ctypes/libffi/src/mips/ffi.c b/Modules/_ctypes/libffi/src/mips/ffi.c
index d714cc9..79cff9b 100644
--- a/Modules/_ctypes/libffi/src/mips/ffi.c
+++ b/Modules/_ctypes/libffi/src/mips/ffi.c
@@ -1,6 +1,7 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1996, 2007, 2008 Red Hat, Inc.
- Copyright (c) 2008 David Daney
+ ffi.c - Copyright (c) 2011 Anthony Green
+ Copyright (c) 2008 David Daney
+ Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc.
MIPS Foreign Function Interface
@@ -37,7 +38,11 @@
#endif
#ifndef USE__BUILTIN___CLEAR_CACHE
-#include <sys/cachectl.h>
+# if defined(__OpenBSD__)
+# include <mips64/sysarch.h>
+# else
+# include <sys/cachectl.h>
+# endif
#endif
#ifdef FFI_DEBUG
@@ -662,10 +667,12 @@ ffi_prep_closure_loc (ffi_closure *closure,
char *clear_location = (char *) codeloc;
#if defined(FFI_MIPS_O32)
- FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT);
+ if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
+ return FFI_BAD_ABI;
fn = ffi_closure_O32;
#else /* FFI_MIPS_N32 */
- FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64);
+ if (cif->abi != FFI_N32 && cif->abi != FFI_N64)
+ return FFI_BAD_ABI;
fn = ffi_closure_N32;
#endif /* FFI_MIPS_O32 */
diff --git a/Modules/_ctypes/libffi/src/mips/ffitarget.h b/Modules/_ctypes/libffi/src/mips/ffitarget.h
index c5f4e05..717d659 100644
--- a/Modules/_ctypes/libffi/src/mips/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/mips/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for MIPS.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,11 +28,23 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#ifdef linux
# include <asm/sgidefs.h>
-#else
+#elif defined(__rtems__)
+/*
+ * Subprogram calling convention - copied from sgidefs.h
+ */
+#define _MIPS_SIM_ABI32 1
+#define _MIPS_SIM_NABI32 2
+#define _MIPS_SIM_ABI64 3
+#elif !defined(__OpenBSD__)
# include <sgidefs.h>
#endif
+
# ifndef _ABIN32
# define _ABIN32 _MIPS_SIM_NABI32
# endif
@@ -43,7 +56,7 @@
# endif
#if !defined(_MIPS_SIM)
--- something is very wrong --
+# error -- something is very wrong --
#else
# if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64))
# define FFI_MIPS_N32
@@ -51,7 +64,7 @@
# if (_MIPS_SIM==_ABIO32 && defined(_ABIO32))
# define FFI_MIPS_O32
# else
--- this is an unsupported platform --
+# error -- this is an unsupported platform --
# endif
# endif
#endif
@@ -186,30 +199,29 @@ typedef enum ffi_abi {
FFI_O32_SOFT_FLOAT,
FFI_N32_SOFT_FLOAT,
FFI_N64_SOFT_FLOAT,
+ FFI_LAST_ABI,
#ifdef FFI_MIPS_O32
#ifdef __mips_soft_float
- FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT,
+ FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT
#else
- FFI_DEFAULT_ABI = FFI_O32,
+ FFI_DEFAULT_ABI = FFI_O32
#endif
#else
# if _MIPS_SIM==_ABI64
# ifdef __mips_soft_float
- FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT,
+ FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT
# else
- FFI_DEFAULT_ABI = FFI_N64,
+ FFI_DEFAULT_ABI = FFI_N64
# endif
# else
# ifdef __mips_soft_float
- FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT,
+ FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT
# else
- FFI_DEFAULT_ABI = FFI_N32,
+ FFI_DEFAULT_ABI = FFI_N32
# endif
# endif
#endif
-
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag
diff --git a/Modules/_ctypes/libffi/src/mips/n32.S b/Modules/_ctypes/libffi/src/mips/n32.S
index ae23094..ff4bbce 100644
--- a/Modules/_ctypes/libffi/src/mips/n32.S
+++ b/Modules/_ctypes/libffi/src/mips/n32.S
@@ -43,6 +43,7 @@
#ifdef __GNUC__
.abicalls
#endif
+ .set mips4
.text
.align 2
.globl ffi_call_N32
diff --git a/Modules/_ctypes/libffi/src/moxie/ffitarget.h b/Modules/_ctypes/libffi/src/moxie/ffitarget.h
deleted file mode 100644
index f5305d1..0000000
--- a/Modules/_ctypes/libffi/src/moxie/ffitarget.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 2009 Anthony Green
- Target configuration macros for Moxie
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- ``Software''), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long ffi_arg;
-typedef signed long ffi_sarg;
-
-typedef enum ffi_abi {
- FFI_FIRST_ABI = 0,
-
-#ifdef MOXIE
- FFI_EABI,
- FFI_DEFAULT_ABI = FFI_EABI,
-#endif
-
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 0
-#define FFI_NATIVE_RAW_API 0
-
-/* Trampolines are 5 4-byte instructions long. */
-#define FFI_TRAMPOLINE_SIZE (5*4)
-
-#endif
diff --git a/Modules/_ctypes/libffi/src/pa/ffi.c b/Modules/_ctypes/libffi/src/pa/ffi.c
index 6d7606f..4ce2bc6 100644
--- a/Modules/_ctypes/libffi/src/pa/ffi.c
+++ b/Modules/_ctypes/libffi/src/pa/ffi.c
@@ -1,9 +1,11 @@
/* -----------------------------------------------------------------------
- ffi.c - (c) 2003-2004 Randolph Chung <tausq@debian.org>
+ ffi.c - (c) 2011 Anthony Green
(c) 2008 Red Hat, Inc.
-
+ (c) 2006 Free Software Foundation, Inc.
+ (c) 2003-2004 Randolph Chung <tausq@debian.org>
+
HPPA Foreign Function Interface
- HP-UX PA ABI support (c) 2006 Free Software Foundation, Inc.
+ HP-UX PA ABI support
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -633,7 +635,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
UINT32 *tmp;
#endif
- FFI_ASSERT (cif->abi == FFI_PA32);
+ if (cif->abi != FFI_PA32)
+ return FFI_BAD_ABI;
/* Make a small trampoline that will branch to our
handler function. Use PC-relative addressing. */
diff --git a/Modules/_ctypes/libffi/src/pa/ffitarget.h b/Modules/_ctypes/libffi/src/pa/ffitarget.h
index 001f891..5e364d3 100644
--- a/Modules/_ctypes/libffi/src/pa/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/pa/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for hppa.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- System specific configurations ----------------------------------- */
#ifndef LIBFFI_ASM
@@ -38,21 +43,22 @@ typedef enum ffi_abi {
#ifdef PA_LINUX
FFI_PA32,
- FFI_DEFAULT_ABI = FFI_PA32,
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_PA32
#endif
#ifdef PA_HPUX
FFI_PA32,
- FFI_DEFAULT_ABI = FFI_PA32,
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_PA32
#endif
#ifdef PA64_HPUX
#error "PA64_HPUX FFI is not yet implemented"
FFI_PA64,
- FFI_DEFAULT_ABI = FFI_PA64,
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_PA64
#endif
-
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/powerpc/aix.S b/Modules/_ctypes/libffi/src/powerpc/aix.S
index c6f8764..213f2db 100644
--- a/Modules/_ctypes/libffi/src/powerpc/aix.S
+++ b/Modules/_ctypes/libffi/src/powerpc/aix.S
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- aix.S - Copyright (c) 2002,2009 Free Software Foundation, Inc.
+ aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
based on darwin.S by John Hornkvist
PowerPC Assembly glue.
@@ -79,6 +79,8 @@
.set f20,20
.set f21,21
+ .extern .ffi_prep_args
+
#define LIBFFI_ASM
#include <fficonfig.h>
#include <ffi.h>
@@ -125,6 +127,7 @@ ffi_call_AIX:
/* Call ffi_prep_args. */
mr r4, r1
bl .ffi_prep_args
+ nop
/* Now do the call. */
ld r0, 0(r29)
@@ -226,6 +229,7 @@ L(float_return_value):
/* Call ffi_prep_args. */
mr r4, r1
bl .ffi_prep_args
+ nop
/* Now do the call. */
lwz r0, 0(r29)
diff --git a/Modules/_ctypes/libffi/src/powerpc/aix_closure.S b/Modules/_ctypes/libffi/src/powerpc/aix_closure.S
index 5c74448..aabd3c3 100644
--- a/Modules/_ctypes/libffi/src/powerpc/aix_closure.S
+++ b/Modules/_ctypes/libffi/src/powerpc/aix_closure.S
@@ -79,6 +79,8 @@
.set f20,20
.set f21,21
+ .extern .ffi_closure_helper_DARWIN
+
#define LIBFFI_ASM
#define JUMPTARGET(name) name
#define L(x) x
@@ -165,6 +167,7 @@ ffi_closure_ASM:
/* look up the proper starting point in table */
/* by using return type as offset */
+ lhz r3, 10(r3) /* load type from return type */
ld r4, LC..60(2) /* get address of jump table */
sldi r3, r3, 4 /* now multiply return type by 16 */
ld r0, 240+16(r1) /* load return address */
@@ -337,8 +340,9 @@ L..finish:
/* look up the proper starting point in table */
/* by using return type as offset */
+ lhz r3, 6(r3) /* load type from return type */
lwz r4, LC..60(2) /* get address of jump table */
- slwi r3, r3, 4 /* now multiply return type by 4 */
+ slwi r3, r3, 4 /* now multiply return type by 16 */
lwz r0, 176+8(r1) /* load return address */
add r3, r3, r4 /* add contents of table to table address */
mtctr r3
diff --git a/Modules/_ctypes/libffi/src/powerpc/asm.h b/Modules/_ctypes/libffi/src/powerpc/asm.h
index e86e6b0..994f62d 100644
--- a/Modules/_ctypes/libffi/src/powerpc/asm.h
+++ b/Modules/_ctypes/libffi/src/powerpc/asm.h
@@ -42,7 +42,7 @@
/* If compiled for profiling, call `_mcount' at the start of each function. */
#ifdef PROF
-/* The mcount code relies on a the return address being on the stack
+/* The mcount code relies on the return address being on the stack
to locate our caller and so it can restore it; so store one just
for its benefit. */
#ifdef PIC
diff --git a/Modules/_ctypes/libffi/src/powerpc/darwin.S b/Modules/_ctypes/libffi/src/powerpc/darwin.S
index d8a1df5..4f987dc 100644
--- a/Modules/_ctypes/libffi/src/powerpc/darwin.S
+++ b/Modules/_ctypes/libffi/src/powerpc/darwin.S
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------
darwin.S - Copyright (c) 2000 John Hornkvist
- Copyright (c) 2004 Free Software Foundation, Inc.
+ Copyright (c) 2004, 2010 Free Software Foundation, Inc.
PowerPC Assembly glue.
@@ -24,51 +24,92 @@
OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------- */
+#define LIBFFI_ASM
#if defined(__ppc64__)
#define MODE_CHOICE(x, y) y
#else
#define MODE_CHOICE(x, y) x
#endif
-#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
+#define machine_choice MODE_CHOICE(ppc7400,ppc64)
-#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
+; Define some pseudo-opcodes for size-independent load & store of GPRs ...
+#define lgu MODE_CHOICE(lwzu, ldu)
+#define lg MODE_CHOICE(lwz,ld)
+#define sg MODE_CHOICE(stw,std)
+#define sgu MODE_CHOICE(stwu,stdu)
+#define sgux MODE_CHOICE(stwux,stdux)
+
+; ... and the size of GPRs and their storage indicator.
+#define GPR_BYTES MODE_CHOICE(4,8)
+#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
+#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
+
+; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
+#define LINKAGE_SIZE MODE_CHOICE(24,48)
+#define PARAM_AREA MODE_CHOICE(32,64)
+#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */
+
+/* If there is any FP stuff we make space for all of the regs. */
+#define SAVED_FPR_COUNT 13
+#define FPR_SIZE 8
+#define RESULT_BYTES 16
+
+/* This should be kept in step with the same value in ffi_darwin.c. */
+#define ASM_NEEDS_REGISTERS 4
+#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES)
-#define LIBFFI_ASM
#include <fficonfig.h>
#include <ffi.h>
+
#define JUMPTARGET(name) name
#define L(x) x
-.text
- .align 2
-.globl _ffi_prep_args
-.text
+ .text
.align 2
-.globl _ffi_call_DARWIN
-.text
+ .globl _ffi_prep_args
+
.align 2
+ .globl _ffi_call_DARWIN
+
+ /* We arrive here with:
+ r3 = ptr to extended cif.
+ r4 = -bytes.
+ r5 = cif flags.
+ r6 = ptr to return value.
+ r7 = fn pointer (user func).
+ r8 = fn pointer (ffi_prep_args).
+ r9 = ffi_type* for the ret val. */
+
_ffi_call_DARWIN:
-LFB0:
+Lstartcode:
mr r12,r8 /* We only need r12 until the call,
- so it doesn't have to be saved. */
+ so it does not have to be saved. */
LFB1:
/* Save the old stack pointer as AP. */
mr r8,r1
LCFI0:
+
+ /* Save the retval type in parents frame. */
+ sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8)
+
/* Allocate the stack space we need. */
- stwux r1,r1,r4
+ sgux r1,r1,r4
/* Save registers we use. */
mflr r9
+ sg r9,SAVED_LR_OFFSET(r8)
+
+ sg r28,-(4 * GPR_BYTES)(r8)
+ sg r29,-(3 * GPR_BYTES)(r8)
+ sg r30,-(2 * GPR_BYTES)(r8)
+ sg r31,-( GPR_BYTES)(r8)
- stw r28,-16(r8)
- stw r29,-12(r8)
- stw r30,-8(r8)
- stw r31,-4(r8)
+#if !defined(POWERPC_DARWIN)
+ /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */
+ sg r2,(5 * GPR_BYTES)(r1)
+#endif
- stw r9,8(r8)
- stw r2,20(r1)
LCFI1:
/* Save arguments over call. */
@@ -77,14 +118,17 @@ LCFI1:
mr r29,r7 /* function address, */
mr r28,r8 /* our AP. */
LCFI2:
- /* Call ffi_prep_args. */
+ /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */
mr r4,r1
li r9,0
mtctr r12 /* r12 holds address of _ffi_prep_args. */
bctrl
- lwz r2,20(r1)
+#if !defined(POWERPC_DARWIN)
+ /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */
+ lg r2,(5 * GPR_BYTES)(r1)
+#endif
/* Now do the call.
Set up cr1 with bits 4-7 of the flags. */
mtcrf 0x40,r31
@@ -92,71 +136,130 @@ LCFI2:
mtctr r29
/* Load all those argument registers.
We have set up a nice stack frame, just load it into registers. */
- lwz r3,20+(1*4)(r1)
- lwz r4,20+(2*4)(r1)
- lwz r5,20+(3*4)(r1)
- lwz r6,20+(4*4)(r1)
+ lg r3, (LINKAGE_SIZE )(r1)
+ lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1)
+ lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1)
+ lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1)
nop
- lwz r7,20+(5*4)(r1)
- lwz r8,20+(6*4)(r1)
- lwz r9,20+(7*4)(r1)
- lwz r10,20+(8*4)(r1)
+ lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1)
+ lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1)
+ lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1)
+ lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1)
L1:
- /* Load all the FP registers. */
+ /* ... Load all the FP registers. */
bf 6,L2 /* No floats to load. */
- lfd f1,-16-(13*8)(r28)
- lfd f2,-16-(12*8)(r28)
- lfd f3,-16-(11*8)(r28)
- lfd f4,-16-(10*8)(r28)
+ lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
+ lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
+ lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
+ lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
nop
- lfd f5,-16-(9*8)(r28)
- lfd f6,-16-(8*8)(r28)
- lfd f7,-16-(7*8)(r28)
- lfd f8,-16-(6*8)(r28)
+ lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
+ lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
+ lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
+ lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
nop
- lfd f9,-16-(5*8)(r28)
- lfd f10,-16-(4*8)(r28)
- lfd f11,-16-(3*8)(r28)
- lfd f12,-16-(2*8)(r28)
+ lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
+ lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
+ lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
+ lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
nop
- lfd f13,-16-(1*8)(r28)
+ lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
L2:
mr r12,r29 /* Put the target address in r12 as specified. */
mtctr r12
nop
nop
+
/* Make the call. */
bctrl
/* Now, deal with the return value. */
- mtcrf 0x01,r31
- bt 30,L(done_return_value)
- bt 29,L(fp_return_value)
- stw r3,0(r30)
- bf 28,L(done_return_value)
- stw r4,4(r30)
+ /* m64 structure returns can occupy the same set of registers as
+ would be used to pass such a structure as arg0 - so take care
+ not to step on any possibly hot regs. */
- /* Fall through. */
+ /* Get the flags.. */
+ mtcrf 0x03,r31 ; we need c6 & cr7 now.
+ ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref.
+ bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING
+ bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT
+
+ /* OK, so we have a struct. */
+#if defined(__ppc64__)
+ bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case
-L(done_return_value):
- /* Restore the registers we used and return. */
- lwz r9,8(r28)
- lwz r31,-4(r28)
- mtlr r9
- lwz r30,-8(r28)
- lwz r29,-12(r28)
- lwz r28,-16(r28)
- lwz r1,0(r1)
- blr
+ /* OK, we have to map the return back to a mem struct.
+ We are about to trample the parents param area, so recover the
+ return type. r29 is free, since the call is done. */
+ lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
+
+ sg r3, (LINKAGE_SIZE )(r28)
+ sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28)
+ sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28)
+ sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28)
+ nop
+ sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28)
+ sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28)
+ sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
+ sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
+ /* OK, so do the block move - we trust that memcpy will not trample
+ the fprs... */
+ mr r3,r30 ; dest
+ addi r4,r28,LINKAGE_SIZE ; source
+ /* The size is a size_t, should be long. */
+ lg r5,0(r29)
+ /* Figure out small structs */
+ cmpi 0,r5,4
+ bgt L3 ; 1, 2 and 4 bytes have special rules.
+ cmpi 0,r5,3
+ beq L3 ; not 3
+ addi r4,r4,8
+ subf r4,r5,r4
+L3:
+ bl _memcpy
+
+ /* ... do we need the FP registers? - recover the flags.. */
+ mtcrf 0x03,r31 ; we need c6 & cr7 now.
+ bf 29,L(done_return_value) /* No floats in the struct. */
+ stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
+ stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
+ stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
+ stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
+ nop
+ stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
+ stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
+ stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
+ stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
+ nop
+ stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
+ stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
+ stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
+ stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
+ nop
+ stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
+
+ mr r3,r29 ; ffi_type *
+ mr r4,r30 ; dest
+ addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs
+ xor r6,r6,r6
+ sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
+ addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter.
+ bl _darwin64_struct_floats_to_mem
+
+ b L(done_return_value)
+#else
+ stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes.
+#endif
+ b L(done_return_value)
L(fp_return_value):
/* Do we have long double to store? */
- bf 31,L(fd_return_value)
+ bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS
stfd f1,0(r30)
- stfd f2,8(r30)
+ stfd f2,FPR_SIZE(r30)
b L(done_return_value)
L(fd_return_value):
@@ -170,21 +273,57 @@ L(float_return_value):
stfs f1,0(r30)
b L(done_return_value)
+L(scalar_return_value):
+ bt 29,L(fp_return_value) ; FLAG_RETURNS_FP
+ ; ffi_arg is defined as unsigned long.
+ sg r3,0(r30) ; Save the reg.
+ bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS
+
+#if defined(__ppc64__)
+L(maybe_return_128):
+ std r3,0(r30)
+ bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS
+ std r4,8(r30)
+#else
+ stw r4,4(r30)
+#endif
+
+ /* Fall through. */
+ /* We want this at the end to simplify eh epilog computation. */
+
+L(done_return_value):
+ /* Restore the registers we used and return. */
+ lg r29,SAVED_LR_OFFSET(r28)
+ ; epilog
+ lg r31,-(1 * GPR_BYTES)(r28)
+ mtlr r29
+ lg r30,-(2 * GPR_BYTES)(r28)
+ lg r29,-(3 * GPR_BYTES)(r28)
+ lg r28,-(4 * GPR_BYTES)(r28)
+ lg r1,0(r1)
+ blr
LFE1:
+ .align 1
/* END(_ffi_call_DARWIN) */
/* Provide a null definition of _ffi_call_AIX. */
-.text
- .align 2
-.globl _ffi_call_AIX
-.text
+ .text
+ .globl _ffi_call_AIX
.align 2
_ffi_call_AIX:
blr
/* END(_ffi_call_AIX) */
-.data
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms
+/* EH stuff. */
+
+#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
+
+ .static_data
+ .align LOG2_GPR_BYTES
+LLFB0$non_lazy_ptr:
+ .g_long Lstartcode
+
+ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0 ; Length of Common Information Entry
@@ -193,16 +332,17 @@ LSCIE1:
.byte 0x1 ; CIE Version
.ascii "zR\0" ; CIE Augmentation
.byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
- .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor
+ .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
.byte 0x41 ; CIE RA Column
.byte 0x1 ; uleb128 0x1; Augmentation size
- .byte 0x90 ; FDE Encoding (indirect pcrel)
+ .byte 0x10 ; FDE Encoding (indirect pcrel)
.byte 0xc ; DW_CFA_def_cfa
.byte 0x1 ; uleb128 0x1
.byte 0x0 ; uleb128 0x0
.align LOG2_GPR_BYTES
LECIE1:
-.globl _ffi_call_DARWIN.eh
+
+ .globl _ffi_call_DARWIN.eh
_ffi_call_DARWIN.eh:
LSFDE1:
.set L$set$1,LEFDE1-LASFDE1
@@ -210,11 +350,11 @@ LSFDE1:
LASFDE1:
.long LASFDE1-EH_frame1 ; FDE CIE offset
.g_long LLFB0$non_lazy_ptr-. ; FDE initial location
- .set L$set$3,LFE1-LFB0
+ .set L$set$3,LFE1-Lstartcode
.g_long L$set$3 ; FDE address range
.byte 0x0 ; uleb128 0x0; Augmentation size
.byte 0x4 ; DW_CFA_advance_loc4
- .set L$set$4,LCFI0-LFB1
+ .set L$set$4,LCFI0-Lstartcode
.long L$set$4
.byte 0xd ; DW_CFA_def_cfa_register
.byte 0x08 ; uleb128 0x08
@@ -239,7 +379,5 @@ LASFDE1:
.byte 0x1c ; uleb128 0x1c
.align LOG2_GPR_BYTES
LEFDE1:
-.data
- .align LOG2_GPR_BYTES
-LLFB0$non_lazy_ptr:
- .g_long LFB0
+ .align 1
+
diff --git a/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S b/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S
index 7959838..3f6790f 100644
--- a/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S
+++ b/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S
@@ -1,6 +1,7 @@
/* -----------------------------------------------------------------------
- darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation,
- Inc. based on ppc_closure.S
+ darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010,
+ Free Software Foundation, Inc.
+ based on ppc_closure.S
PowerPC Assembly glue.
@@ -33,91 +34,177 @@
#define MODE_CHOICE(x, y) x
#endif
-#define lgu MODE_CHOICE(lwzu, ldu)
-
-#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
+#define machine_choice MODE_CHOICE(ppc7400,ppc64)
+
+; Define some pseudo-opcodes for size-independent load & store of GPRs ...
+#define lgu MODE_CHOICE(lwzu, ldu)
+#define lg MODE_CHOICE(lwz,ld)
+#define sg MODE_CHOICE(stw,std)
+#define sgu MODE_CHOICE(stwu,stdu)
+
+; ... and the size of GPRs and their storage indicator.
+#define GPR_BYTES MODE_CHOICE(4,8)
+#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
+#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
+
+; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
+#define LINKAGE_SIZE MODE_CHOICE(24,48)
+#define PARAM_AREA MODE_CHOICE(32,64)
+
+#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */
+#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */
+
+/* WARNING: if ffi_type is changed... here be monsters.
+ Offsets of items within the result type. */
+#define FFI_TYPE_TYPE MODE_CHOICE(6,10)
+#define FFI_TYPE_ELEM MODE_CHOICE(8,16)
+
+#define SAVED_FPR_COUNT 13
+#define FPR_SIZE 8
+/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */
+#define RESULT_BYTES MODE_CHOICE(16,176)
+
+; The whole stack frame **MUST** be 16byte-aligned.
+#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL)
+#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES))
+
+#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE)
+#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA)
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
+; We no longer need the pic symbol stub for Darwin >= 9.
+#define BLCLS_HELP _ffi_closure_helper_DARWIN
+#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p
+#define PASS_STR_FLOATS _darwin64_pass_struct_floats
+#undef WANT_STUB
+#else
+#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub
+#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub
+#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub
+#define WANT_STUB
+#endif
-#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
+/* m32/m64
+
+ The stack layout looks like this:
+
+ | Additional params... | | Higher address
+ ~ ~ ~
+ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
+ |--------------------------------------------| |
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
+ |--------------------------------------------| |
+ | Reserved 2*4/8 | |
+ |--------------------------------------------| |
+ | Space for callee`s LR 4/8 | |
+ |--------------------------------------------| |
+ | Saved CR [low word for m64] 4/8 | |
+ |--------------------------------------------| |
+ | Current backchain pointer 4/8 |-/ Parent`s frame.
+ |--------------------------------------------| <+ <<< on entry to
+ | Result Bytes 16/176 | |
+ |--------------------------------------------| |
+ ~ padding to 16-byte alignment ~ ~
+ |--------------------------------------------| |
+ | NUM_FPR_ARG_REGISTERS slots | |
+ | here fp13 .. fp1 13*8 | |
+ |--------------------------------------------| |
+ | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS
+ |--------------------------------------------| |
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
+ |--------------------------------------------| | stack |
+ | Reserved [compiler,binder] 2*4/8 | | grows |
+ |--------------------------------------------| | down V
+ | Space for callees LR 4/8 | |
+ |--------------------------------------------| | lower addresses
+ | Saved CR [low word for m64] 4/8 | |
+ |--------------------------------------------| | stack pointer here
+ | Current backchain pointer 4/8 |-/ during
+ |--------------------------------------------| <<< call.
+
+*/
.file "darwin_closure.S"
-.text
- .align LOG2_GPR_BYTES
-.globl _ffi_closure_ASM
-.text
+ .machine machine_choice
+
+ .text
+ .globl _ffi_closure_ASM
.align LOG2_GPR_BYTES
_ffi_closure_ASM:
LFB1:
- mflr r0 /* extract return address */
- stw r0,8(r1) /* save the return address */
+Lstartcode:
+ mflr r0 /* extract return address */
+ sg r0,SAVED_LR_OFFSET(r1) /* save the return address */
LCFI0:
- /* 24 Bytes (Linkage Area)
- 32 Bytes (outgoing parameter area, always reserved)
- 104 Bytes (13*8 from FPR)
- 16 Bytes (result)
- 176 Bytes */
-
- stwu r1,-176(r1) /* skip over caller save area
- keep stack aligned to 16. */
+ sgu r1,-SAVE_SIZE(r1) /* skip over caller save area
+ keep stack aligned to 16. */
LCFI1:
/* We want to build up an area for the parameters passed
in registers. (both floating point and integer) */
- /* We store gpr 3 to gpr 10 (aligned to 4)
- in the parents outgoing area. */
- stw r3,200(r1)
- stw r4,204(r1)
- stw r5,208(r1)
- stw r6,212(r1)
- stw r7,216(r1)
- stw r8,220(r1)
- stw r9,224(r1)
- stw r10,228(r1)
-
- /* We save fpr 1 to fpr 13. (aligned to 8) */
- stfd f1,56(r1)
- stfd f2,64(r1)
- stfd f3,72(r1)
- stfd f4,80(r1)
- stfd f5,88(r1)
- stfd f6,96(r1)
- stfd f7,104(r1)
- stfd f8,112(r1)
- stfd f9,120(r1)
- stfd f10,128(r1)
- stfd f11,136(r1)
- stfd f12,144(r1)
- stfd f13,152(r1)
+ /* Put gpr 3 to gpr 10 in the parents outgoing area...
+ ... the remainder of any params that overflowed the regs will
+ follow here. */
+ sg r3, (PARENT_PARM_BASE )(r1)
+ sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1)
+ sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1)
+ sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1)
+ sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1)
+ sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1)
+ sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1)
+ sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1)
+
+ /* We save fpr 1 to fpr 14 in our own save frame. */
+ stfd f1, (FP_SAVE_BASE )(r1)
+ stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1)
+ stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1)
+ stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1)
+ stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1)
+ stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1)
+ stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1)
+ stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1)
+ stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1)
+ stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1)
+ stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1)
+ stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1)
+ stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1)
/* Set up registers for the routine that actually does the work
get the context pointer from the trampoline. */
- mr r3,r11
+ mr r3,r11
/* Now load up the pointer to the result storage. */
- addi r4,r1,160
+ addi r4,r1,(SAVE_SIZE-RESULT_BYTES)
/* Now load up the pointer to the saved gpr registers. */
- addi r5,r1,200
+ addi r5,r1,PARENT_PARM_BASE
/* Now load up the pointer to the saved fpr registers. */
- addi r6,r1,56
+ addi r6,r1,FP_SAVE_BASE
/* Make the call. */
- bl Lffi_closure_helper_DARWIN$stub
+ bl BLCLS_HELP
+
+ /* r3 contains the rtype pointer... save it since we will need
+ it later. */
+ sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type
+ lg r0,0(r3) ; size => r0
+ lhz r3,FFI_TYPE_TYPE(r3) ; type => r3
- /* Now r3 contains the return type
- so use it to look up in a table
+ /* The helper will have intercepted struture returns and inserted
+ the caller`s destination address for structs returned by ref. */
+
+ /* r3 contains the return type so use it to look up in a table
so we know how to deal with each type. */
- /* Look up the proper starting point in table
- by using return type as offset. */
- addi r5,r1,160 /* Get pointer to results area. */
- bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */
- mflr r4 /* Move to r4. */
- slwi r3,r3,4 /* Now multiply return type by 16. */
- add r3,r3,r4 /* Add contents of table to table address. */
- mtctr r3
- bctr /* Jump to it. */
+ addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */
+ bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */
+ mflr r4 /* Move to r4. */
+ slwi r3,r3,4 /* Now multiply return type by 16. */
+ add r3,r3,r4 /* Add contents of table to table address. */
+ mtctr r3
+ bctr /* Jump to it. */
LFE1:
/* Each of the ret_typeX code fragments has to be exactly 16 bytes long
(4 instructions). For cache effectiveness we align to a 16 byte boundary
@@ -140,7 +227,7 @@ Lret_type0:
/* case FFI_TYPE_INT */
Lret_type1:
- lwz r3,0(r5)
+ lg r3,0(r5)
b Lfinish
nop
nop
@@ -168,85 +255,224 @@ Lret_type4:
/* case FFI_TYPE_UINT8 */
Lret_type5:
+#if defined(__ppc64__)
+ lbz r3,7(r5)
+#else
lbz r3,3(r5)
+#endif
b Lfinish
nop
nop
/* case FFI_TYPE_SINT8 */
Lret_type6:
+#if defined(__ppc64__)
+ lbz r3,7(r5)
+#else
lbz r3,3(r5)
+#endif
extsb r3,r3
b Lfinish
nop
/* case FFI_TYPE_UINT16 */
Lret_type7:
+#if defined(__ppc64__)
+ lhz r3,6(r5)
+#else
lhz r3,2(r5)
+#endif
b Lfinish
nop
nop
/* case FFI_TYPE_SINT16 */
Lret_type8:
+#if defined(__ppc64__)
+ lha r3,6(r5)
+#else
lha r3,2(r5)
+#endif
b Lfinish
nop
nop
/* case FFI_TYPE_UINT32 */
Lret_type9:
+#if defined(__ppc64__)
+ lwz r3,4(r5)
+#else
lwz r3,0(r5)
+#endif
b Lfinish
nop
nop
/* case FFI_TYPE_SINT32 */
Lret_type10:
+#if defined(__ppc64__)
+ lwz r3,4(r5)
+#else
lwz r3,0(r5)
+#endif
b Lfinish
nop
nop
/* case FFI_TYPE_UINT64 */
Lret_type11:
+#if defined(__ppc64__)
+ lg r3,0(r5)
+ b Lfinish
+ nop
+#else
lwz r3,0(r5)
lwz r4,4(r5)
b Lfinish
+#endif
nop
/* case FFI_TYPE_SINT64 */
Lret_type12:
+#if defined(__ppc64__)
+ lg r3,0(r5)
+ b Lfinish
+ nop
+#else
lwz r3,0(r5)
lwz r4,4(r5)
b Lfinish
+#endif
nop
/* case FFI_TYPE_STRUCT */
Lret_type13:
+#if defined(__ppc64__)
+ lg r3,0(r5) ; we need at least this...
+ cmpi 0,r0,4
+ bgt Lstructend ; not a special small case
+ b Lsmallstruct ; see if we need more.
+#else
+ cmpi 0,r0,4
+ bgt Lfinish ; not by value
+ lg r3,0(r5)
b Lfinish
- nop
- nop
- nop
-
+#endif
/* case FFI_TYPE_POINTER */
Lret_type14:
- lwz r3,0(r5)
+ lg r3,0(r5)
b Lfinish
nop
nop
+#if defined(__ppc64__)
+Lsmallstruct:
+ beq Lfour ; continuation of Lret13.
+ cmpi 0,r0,3
+ beq Lfinish ; don`t adjust this - can`t be any floats here...
+ srdi r3,r3,48
+ cmpi 0,r0,2
+ beq Lfinish ; .. or here ..
+ srdi r3,r3,8
+ b Lfinish ; .. or here.
+
+Lfour:
+ lg r6,LINKAGE_SIZE(r1) ; get the result type
+ lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer
+ lg r6,0(r6) ; first element
+ lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type
+ cmpi 0,r0,2 ; FFI_TYPE_FLOAT
+ bne Lfourint
+ lfs f1,0(r5) ; just one float in the struct.
+ b Lfinish
+
+Lfourint:
+ srdi r3,r3,32 ; four bytes.
+ b Lfinish
+
+Lstructend:
+ lg r3,LINKAGE_SIZE(r1) ; get the result type
+ bl STRUCT_RETVALUE_P
+ cmpi 0,r3,0
+ beq Lfinish ; nope.
+ /* Recover a pointer to the results. */
+ addi r11,r1,(SAVE_SIZE-RESULT_BYTES)
+ lg r3,0(r11) ; we need at least this...
+ lg r4,8(r11)
+ cmpi 0,r0,16
+ beq Lfinish ; special case 16 bytes we don't consider floats.
+
+ /* OK, frustratingly, the process of saving the struct to mem might have
+ messed with the FPRs, so we have to re-load them :(.
+ We`ll use our FPRs space again - calling:
+ void darwin64_pass_struct_floats (ffi_type *s, char *src,
+ unsigned *nfpr, double **fprs)
+ We`ll temporarily pinch the first two slots of the param area for local
+ vars used by the routine. */
+ xor r6,r6,r6
+ addi r5,r1,PARENT_PARM_BASE ; some space
+ sg r6,0(r5) ; *nfpr zeroed.
+ addi r6,r5,8 ; **fprs
+ addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space
+ sg r3,0(r6)
+ mr r4,r11 ; the struct is here...
+ lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type.
+ bl PASS_STR_FLOATS ; get struct floats into FPR save space.
+ /* See if we used any floats */
+ lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1)
+ cmpi 0,r0,0
+ beq Lstructints ; nope.
+ /* OK load `em up... */
+ lfd f1, (FP_SAVE_BASE )(r1)
+ lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1)
+ lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1)
+ lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1)
+ lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1)
+ lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1)
+ lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1)
+ lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1)
+ lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1)
+ lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1)
+ lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1)
+ lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1)
+ lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1)
+
+ /* point back at our saved struct. */
+Lstructints:
+ addi r11,r1,(SAVE_SIZE-RESULT_BYTES)
+ lg r3,0(r11) ; we end up picking the
+ lg r4,8(r11) ; first two again.
+ lg r5,16(r11)
+ lg r6,24(r11)
+ lg r7,32(r11)
+ lg r8,40(r11)
+ lg r9,48(r11)
+ lg r10,56(r11)
+#endif
+
/* case done */
Lfinish:
- addi r1,r1,176 /* Restore stack pointer. */
- lwz r0,8(r1) /* Get return address. */
- mtlr r0 /* Reset link register. */
+ addi r1,r1,SAVE_SIZE /* Restore stack pointer. */
+ lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */
+ mtlr r0 /* Reset link register. */
blr
-
+Lendcode:
+ .align 1
+
/* END(ffi_closure_ASM) */
-.data
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+/* EH frame stuff. */
+#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
+/* 176, 400 */
+#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90)
+#define EH_FRAME_OFFSETB MODE_CHOICE(1,3)
+
+ .static_data
+ .align LOG2_GPR_BYTES
+LLFB1$non_lazy_ptr:
+ .g_long Lstartcode
+
+ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0 ; Length of Common Information Entry
@@ -255,16 +481,16 @@ LSCIE1:
.byte 0x1 ; CIE Version
.ascii "zR\0" ; CIE Augmentation
.byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
- .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor
+ .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
.byte 0x41 ; CIE RA Column
.byte 0x1 ; uleb128 0x1; Augmentation size
- .byte 0x90 ; FDE Encoding (indirect pcrel)
+ .byte 0x10 ; FDE Encoding (indirect pcrel)
.byte 0xc ; DW_CFA_def_cfa
.byte 0x1 ; uleb128 0x1
.byte 0x0 ; uleb128 0x0
.align LOG2_GPR_BYTES
LECIE1:
-.globl _ffi_closure_ASM.eh
+ .globl _ffi_closure_ASM.eh
_ffi_closure_ASM.eh:
LSFDE1:
.set L$set$1,LEFDE1-LASFDE1
@@ -273,45 +499,78 @@ LSFDE1:
LASFDE1:
.long LASFDE1-EH_frame1 ; FDE CIE offset
.g_long LLFB1$non_lazy_ptr-. ; FDE initial location
- .set L$set$3,LFE1-LFB1
+ .set L$set$3,LFE1-Lstartcode
.g_long L$set$3 ; FDE address range
.byte 0x0 ; uleb128 0x0; Augmentation size
.byte 0x4 ; DW_CFA_advance_loc4
.set L$set$3,LCFI1-LCFI0
.long L$set$3
.byte 0xe ; DW_CFA_def_cfa_offset
- .byte 176,1 ; uleb128 176
+ .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3
.byte 0x4 ; DW_CFA_advance_loc4
- .set L$set$4,LCFI0-LFB1
+ .set L$set$4,LCFI0-Lstartcode
.long L$set$4
.byte 0x11 ; DW_CFA_offset_extended_sf
.byte 0x41 ; uleb128 0x41
.byte 0x7e ; sleb128 -2
.align LOG2_GPR_BYTES
LEFDE1:
-.data
- .align LOG2_GPR_BYTES
-LDFCM0:
-.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .align LOG2_GPR_BYTES
-Lffi_closure_helper_DARWIN$stub:
-#if 1
+ .align 1
+
+#ifdef WANT_STUB
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+ .align 5
+L_ffi_closure_helper_DARWIN$stub:
.indirect_symbol _ffi_closure_helper_DARWIN
- mflr r0
- bcl 20,31,LO$ffi_closure_helper_DARWIN
-LO$ffi_closure_helper_DARWIN:
- mflr r11
- addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)
- mtlr r0
- lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11)
- mtctr r12
+ mflr r0
+ bcl 20,31,"L00000000001$spb"
+"L00000000001$spb":
+ mflr r11
+ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")
+ mtlr r0
+ lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")(r11)
+ mtctr r12
bctr
-.lazy_symbol_pointer
+ .lazy_symbol_pointer
L_ffi_closure_helper_DARWIN$lazy_ptr:
.indirect_symbol _ffi_closure_helper_DARWIN
- .g_long dyld_stub_binding_helper
+ .g_long dyld_stub_binding_helper
+
+#if defined(__ppc64__)
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+ .align 5
+L_darwin64_struct_ret_by_value_p$stub:
+ .indirect_symbol _darwin64_struct_ret_by_value_p
+ mflr r0
+ bcl 20,31,"L00000000002$spb"
+"L00000000002$spb":
+ mflr r11
+ addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")
+ mtlr r0
+ lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")(r11)
+ mtctr r12
+ bctr
+ .lazy_symbol_pointer
+L_darwin64_struct_ret_by_value_p$lazy_ptr:
+ .indirect_symbol _darwin64_struct_ret_by_value_p
+ .g_long dyld_stub_binding_helper
+
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+ .align 5
+L_darwin64_pass_struct_floats$stub:
+ .indirect_symbol _darwin64_pass_struct_floats
+ mflr r0
+ bcl 20,31,"L00000000003$spb"
+"L00000000003$spb":
+ mflr r11
+ addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")
+ mtlr r0
+ lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")(r11)
+ mtctr r12
+ bctr
+ .lazy_symbol_pointer
+L_darwin64_pass_struct_floats$lazy_ptr:
+ .indirect_symbol _darwin64_pass_struct_floats
+ .g_long dyld_stub_binding_helper
+# endif
#endif
-.data
- .align LOG2_GPR_BYTES
-LLFB1$non_lazy_ptr:
- .g_long LFB1
diff --git a/Modules/_ctypes/libffi/src/powerpc/ffi.c b/Modules/_ctypes/libffi/src/powerpc/ffi.c
index 75784a9..baca694 100644
--- a/Modules/_ctypes/libffi/src/powerpc/ffi.c
+++ b/Modules/_ctypes/libffi/src/powerpc/ffi.c
@@ -1,7 +1,9 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1998 Geoffrey Keating
- Copyright (C) 2007, 2008 Free Software Foundation, Inc
- Copyright (C) 2008 Red Hat, Inc
+ ffi.c - Copyright (C) 2011 Anthony Green
+ Copyright (C) 2011 Kyle Moffett
+ Copyright (C) 2008 Red Hat, Inc
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc
+ Copyright (c) 1998 Geoffrey Keating
PowerPC Foreign Function Interface
@@ -39,32 +41,28 @@ enum {
/* The assembly depends on these exact flags. */
FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */
FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */
+#ifndef __NO_FPRS__
FLAG_RETURNS_FP = 1 << (31-29),
+#endif
FLAG_RETURNS_64BITS = 1 << (31-28),
FLAG_RETURNS_128BITS = 1 << (31-27), /* cr6 */
- FLAG_SYSV_SMST_R4 = 1 << (31-26), /* use r4 for FFI_SYSV 8 byte
- structs. */
- FLAG_SYSV_SMST_R3 = 1 << (31-25), /* use r3 for FFI_SYSV 4 byte
- structs. */
- /* Bits (31-24) through (31-19) store shift value for SMST */
FLAG_ARG_NEEDS_COPY = 1 << (31- 7),
+#ifndef __NO_FPRS__
FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
+#endif
FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
FLAG_RETVAL_REFERENCE = 1 << (31- 4)
};
/* About the SYSV ABI. */
-unsigned int NUM_GPR_ARG_REGISTERS = 8;
+#define ASM_NEEDS_REGISTERS 4
+#define NUM_GPR_ARG_REGISTERS 8
#ifndef __NO_FPRS__
-unsigned int NUM_FPR_ARG_REGISTERS = 8;
-#else
-unsigned int NUM_FPR_ARG_REGISTERS = 0;
+# define NUM_FPR_ARG_REGISTERS 8
#endif
-enum { ASM_NEEDS_REGISTERS = 4 };
-
/* ffi_prep_args_SYSV is called by the assembly routine once stack space
has been allocated for the function's arguments.
@@ -113,10 +111,12 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
valp gpr_base;
int intarg_count;
+#ifndef __NO_FPRS__
/* 'fpr_base' points at the space for fpr1, and grows upwards as
we use FPR registers. */
valp fpr_base;
int fparg_count;
+#endif
/* 'copy_space' grows down as we put structures in it. It should
stay 16-byte aligned. */
@@ -125,9 +125,8 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
/* 'next_arg' grows up as we put parameters in it. */
valp next_arg;
- int i, ii MAYBE_UNUSED;
+ int i;
ffi_type **ptr;
- double double_tmp;
union {
void **v;
char **c;
@@ -143,21 +142,23 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
size_t struct_copy_size;
unsigned gprvalue;
- if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
- NUM_FPR_ARG_REGISTERS = 0;
-
stacktop.c = (char *) stack + bytes;
gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
intarg_count = 0;
+#ifndef __NO_FPRS__
+ double double_tmp;
fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
fparg_count = 0;
copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
+#else
+ copy_space.c = gpr_base.c;
+#endif
next_arg.u = stack + 2;
/* Check that everything starts aligned properly. */
- FFI_ASSERT (((unsigned) (char *) stack & 0xF) == 0);
- FFI_ASSERT (((unsigned) copy_space.c & 0xF) == 0);
- FFI_ASSERT (((unsigned) stacktop.c & 0xF) == 0);
+ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
+ FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0);
+ FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
FFI_ASSERT ((bytes & 0xF) == 0);
FFI_ASSERT (copy_space.c >= next_arg.c);
@@ -174,12 +175,28 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
i > 0;
i--, ptr++, p_argv.v++)
{
- switch ((*ptr)->type)
- {
+ unsigned short typenum = (*ptr)->type;
+
+ /* We may need to handle some values depending on ABI */
+ if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) {
+ if (typenum == FFI_TYPE_FLOAT)
+ typenum = FFI_TYPE_UINT32;
+ if (typenum == FFI_TYPE_DOUBLE)
+ typenum = FFI_TYPE_UINT64;
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_UINT128;
+ } else if (ecif->cif->abi != FFI_LINUX) {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_STRUCT;
+#endif
+ }
+
+ /* Now test the translated value */
+ switch (typenum) {
+#ifndef __NO_FPRS__
case FFI_TYPE_FLOAT:
/* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */
- if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_float_prep;
double_tmp = **p_argv.f;
if (fparg_count >= NUM_FPR_ARG_REGISTERS)
{
@@ -195,8 +212,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
case FFI_TYPE_DOUBLE:
/* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */
- if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_double_prep;
double_tmp = **p_argv.d;
if (fparg_count >= NUM_FPR_ARG_REGISTERS)
@@ -218,43 +233,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
- if ((ecif->cif->abi != FFI_LINUX)
- && (ecif->cif->abi != FFI_LINUX_SOFT_FLOAT))
- goto do_struct;
- /* The soft float ABI for long doubles works like this,
- a long double is passed in four consecutive gprs if available.
- A maximum of 2 long doubles can be passed in gprs.
- If we do not have 4 gprs left, the long double is passed on the
- stack, 4-byte aligned. */
- if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
- {
- unsigned int int_tmp = (*p_argv.ui)[0];
- if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3)
- {
- if (intarg_count < NUM_GPR_ARG_REGISTERS)
- intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
- *next_arg.u = int_tmp;
- next_arg.u++;
- for (ii = 1; ii < 4; ii++)
- {
- int_tmp = (*p_argv.ui)[ii];
- *next_arg.u = int_tmp;
- next_arg.u++;
- }
- }
- else
- {
- *gpr_base.u++ = int_tmp;
- for (ii = 1; ii < 4; ii++)
- {
- int_tmp = (*p_argv.ui)[ii];
- *gpr_base.u++ = int_tmp;
- }
- }
- intarg_count +=4;
- }
- else
- {
double_tmp = (*p_argv.d)[0];
if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1)
@@ -280,13 +258,40 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
fparg_count += 2;
FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
- }
break;
#endif
+#endif /* have FPRs */
+
+ /*
+ * The soft float ABI for long doubles works like this, a long double
+ * is passed in four consecutive GPRs if available. A maximum of 2
+ * long doubles can be passed in gprs. If we do not have 4 GPRs
+ * left, the long double is passed on the stack, 4-byte aligned.
+ */
+ case FFI_TYPE_UINT128: {
+ unsigned int int_tmp = (*p_argv.ui)[0];
+ unsigned int ii;
+ if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) {
+ if (intarg_count < NUM_GPR_ARG_REGISTERS)
+ intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
+ *(next_arg.u++) = int_tmp;
+ for (ii = 1; ii < 4; ii++) {
+ int_tmp = (*p_argv.ui)[ii];
+ *(next_arg.u++) = int_tmp;
+ }
+ } else {
+ *(gpr_base.u++) = int_tmp;
+ for (ii = 1; ii < 4; ii++) {
+ int_tmp = (*p_argv.ui)[ii];
+ *(gpr_base.u++) = int_tmp;
+ }
+ }
+ intarg_count += 4;
+ break;
+ }
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
- soft_double_prep:
if (intarg_count == NUM_GPR_ARG_REGISTERS-1)
intarg_count++;
if (intarg_count >= NUM_GPR_ARG_REGISTERS)
@@ -319,9 +324,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
break;
case FFI_TYPE_STRUCT:
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- do_struct:
-#endif
struct_copy_size = ((*ptr)->size + 15) & ~0xF;
copy_space.c -= struct_copy_size;
memcpy (copy_space.c, *p_argv.c, (*ptr)->size);
@@ -349,7 +351,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
case FFI_TYPE_UINT32:
case FFI_TYPE_SINT32:
case FFI_TYPE_POINTER:
- soft_float_prep:
gprvalue = **p_argv.ui;
@@ -366,8 +367,10 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
/* Check that we didn't overrun the stack... */
FFI_ASSERT (copy_space.c >= next_arg.c);
FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS);
+#ifndef __NO_FPRS__
FFI_ASSERT (fpr_base.u
<= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
+#endif
FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
}
@@ -604,9 +607,6 @@ ffi_prep_cif_machdep (ffi_cif *cif)
unsigned type = cif->rtype->type;
unsigned size = cif->rtype->size;
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- NUM_FPR_ARG_REGISTERS = 0;
-
if (cif->abi != FFI_LINUX64)
{
/* All the machine-independent calculation of cif->bytes will be wrong.
@@ -646,62 +646,56 @@ ffi_prep_cif_machdep (ffi_cif *cif)
- Single/double FP values in fpr1, long double in fpr1,fpr2.
- soft-float float/doubles are treated as UINT32/UINT64 respectivley.
- soft-float long doubles are returned in gpr3-gpr6. */
+ /* First translate for softfloat/nonlinux */
+ if (cif->abi == FFI_LINUX_SOFT_FLOAT) {
+ if (type == FFI_TYPE_FLOAT)
+ type = FFI_TYPE_UINT32;
+ if (type == FFI_TYPE_DOUBLE)
+ type = FFI_TYPE_UINT64;
+ if (type == FFI_TYPE_LONGDOUBLE)
+ type = FFI_TYPE_UINT128;
+ } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ if (type == FFI_TYPE_LONGDOUBLE)
+ type = FFI_TYPE_STRUCT;
+#endif
+ }
+
switch (type)
{
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+#ifndef __NO_FPRS__
case FFI_TYPE_LONGDOUBLE:
- if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64
- && cif->abi != FFI_LINUX_SOFT_FLOAT)
- goto byref;
flags |= FLAG_RETURNS_128BITS;
/* Fall through. */
-#endif
case FFI_TYPE_DOUBLE:
flags |= FLAG_RETURNS_64BITS;
/* Fall through. */
case FFI_TYPE_FLOAT:
- /* With FFI_LINUX_SOFT_FLOAT no fp registers are used. */
- if (cif->abi != FFI_LINUX_SOFT_FLOAT)
- flags |= FLAG_RETURNS_FP;
+ flags |= FLAG_RETURNS_FP;
break;
+#endif
+ case FFI_TYPE_UINT128:
+ flags |= FLAG_RETURNS_128BITS;
+ /* Fall through. */
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
flags |= FLAG_RETURNS_64BITS;
break;
case FFI_TYPE_STRUCT:
- if (cif->abi == FFI_SYSV)
- {
- /* The final SYSV ABI says that structures smaller or equal 8 bytes
- are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them
- in memory. */
-
- /* Treat structs with size <= 8 bytes. */
- if (size <= 8)
- {
- flags |= FLAG_RETURNS_SMST;
- /* These structs are returned in r3. We pack the type and the
- precalculated shift value (needed in the sysv.S) into flags.
- The same applies for the structs returned in r3/r4. */
- if (size <= 4)
- {
- flags |= FLAG_SYSV_SMST_R3;
- flags |= 8 * (4 - size) << 8;
- break;
- }
- /* These structs are returned in r3 and r4. See above. */
- if (size <= 8)
- {
- flags |= FLAG_SYSV_SMST_R3 | FLAG_SYSV_SMST_R4;
- flags |= 8 * (8 - size) << 8;
- break;
- }
- }
- }
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- byref:
-#endif
+ /*
+ * The final SYSV ABI says that structures smaller or equal 8 bytes
+ * are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them
+ * in memory.
+ *
+ * NOTE: The assembly code can safely assume that it just needs to
+ * store both r3 and r4 into a 8-byte word-aligned buffer, as
+ * we allocate a temporary buffer in ffi_call() if this flag is
+ * set.
+ */
+ if (cif->abi == FFI_SYSV && size <= 8)
+ flags |= FLAG_RETURNS_SMST;
intarg_count++;
flags |= FLAG_RETVAL_REFERENCE;
/* Fall through. */
@@ -722,39 +716,36 @@ ffi_prep_cif_machdep (ffi_cif *cif)
Stuff on the stack needs to keep proper alignment. */
for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
{
- switch ((*ptr)->type)
- {
+ unsigned short typenum = (*ptr)->type;
+
+ /* We may need to handle some values depending on ABI */
+ if (cif->abi == FFI_LINUX_SOFT_FLOAT) {
+ if (typenum == FFI_TYPE_FLOAT)
+ typenum = FFI_TYPE_UINT32;
+ if (typenum == FFI_TYPE_DOUBLE)
+ typenum = FFI_TYPE_UINT64;
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_UINT128;
+ } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_STRUCT;
+#endif
+ }
+
+ switch (typenum) {
+#ifndef __NO_FPRS__
case FFI_TYPE_FLOAT:
- /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_float_cif;
fparg_count++;
/* floating singles are not 8-aligned on stack */
break;
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
- if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
- goto do_struct;
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- {
- if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
- || intarg_count < NUM_GPR_ARG_REGISTERS)
- /* A long double in FFI_LINUX_SOFT_FLOAT can use only
- a set of four consecutive gprs. If we have not enough,
- we have to adjust the intarg_count value. */
- intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
- intarg_count += 4;
- break;
- }
- else
- fparg_count++;
+ fparg_count++;
/* Fall thru */
#endif
case FFI_TYPE_DOUBLE:
- /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_double_cif;
fparg_count++;
/* If this FP arg is going on the stack, it must be
8-byte-aligned. */
@@ -763,10 +754,21 @@ ffi_prep_cif_machdep (ffi_cif *cif)
&& intarg_count % 2 != 0)
intarg_count++;
break;
+#endif
+ case FFI_TYPE_UINT128:
+ /*
+ * A long double in FFI_LINUX_SOFT_FLOAT can use only a set
+ * of four consecutive gprs. If we do not have enough, we
+ * have to adjust the intarg_count value.
+ */
+ if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
+ && intarg_count < NUM_GPR_ARG_REGISTERS)
+ intarg_count = NUM_GPR_ARG_REGISTERS;
+ intarg_count += 4;
+ break;
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
- soft_double_cif:
/* 'long long' arguments are passed as two words, but
either both words must fit in registers or both go
on the stack. If they go on the stack, they must
@@ -783,9 +785,6 @@ ffi_prep_cif_machdep (ffi_cif *cif)
break;
case FFI_TYPE_STRUCT:
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- do_struct:
-#endif
/* We must allocate space for a copy of these to enforce
pass-by-value. Pad the space up to a multiple of 16
bytes (the maximum alignment required for anything under
@@ -793,12 +792,20 @@ ffi_prep_cif_machdep (ffi_cif *cif)
struct_copy_size += ((*ptr)->size + 15) & ~0xF;
/* Fall through (allocate space for the pointer). */
- default:
- soft_float_cif:
+ case FFI_TYPE_POINTER:
+ case FFI_TYPE_INT:
+ case FFI_TYPE_UINT32:
+ case FFI_TYPE_SINT32:
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_SINT8:
/* Everything else is passed as a 4-byte word in a GPR, either
the object itself or a pointer to it. */
intarg_count++;
break;
+ default:
+ FFI_ASSERT (0);
}
}
else
@@ -827,16 +834,29 @@ ffi_prep_cif_machdep (ffi_cif *cif)
intarg_count += ((*ptr)->size + 7) / 8;
break;
- default:
+ case FFI_TYPE_POINTER:
+ case FFI_TYPE_UINT64:
+ case FFI_TYPE_SINT64:
+ case FFI_TYPE_INT:
+ case FFI_TYPE_UINT32:
+ case FFI_TYPE_SINT32:
+ case FFI_TYPE_UINT16:
+ case FFI_TYPE_SINT16:
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_SINT8:
/* Everything else is passed as a 8-byte word in a GPR, either
the object itself or a pointer to it. */
intarg_count++;
break;
+ default:
+ FFI_ASSERT (0);
}
}
+#ifndef __NO_FPRS__
if (fparg_count != 0)
flags |= FLAG_FP_ARGUMENTS;
+#endif
if (intarg_count > 4)
flags |= FLAG_4_GPR_ARGUMENTS;
if (struct_copy_size != 0)
@@ -844,21 +864,27 @@ ffi_prep_cif_machdep (ffi_cif *cif)
if (cif->abi != FFI_LINUX64)
{
+#ifndef __NO_FPRS__
/* Space for the FPR registers, if needed. */
if (fparg_count != 0)
bytes += NUM_FPR_ARG_REGISTERS * sizeof (double);
+#endif
/* Stack space. */
if (intarg_count > NUM_GPR_ARG_REGISTERS)
bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int);
+#ifndef __NO_FPRS__
if (fparg_count > NUM_FPR_ARG_REGISTERS)
bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double);
+#endif
}
else
{
+#ifndef __NO_FPRS__
/* Space for the FPR registers, if needed. */
if (fparg_count != 0)
bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double);
+#endif
/* Stack space. */
if (intarg_count > NUM_GPR_ARG_REGISTERS64)
@@ -886,28 +912,41 @@ extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long,
void
ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
+ /*
+ * The final SYSV ABI says that structures smaller or equal 8 bytes
+ * are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them
+ * in memory.
+ *
+ * Just to keep things simple for the assembly code, we will always
+ * bounce-buffer struct return values less than or equal to 8 bytes.
+ * This allows the ASM to handle SYSV small structures by directly
+ * writing r3 and r4 to memory without worrying about struct size.
+ */
+ unsigned int smst_buffer[2];
extended_cif ecif;
+ unsigned int rsize = 0;
ecif.cif = cif;
ecif.avalue = avalue;
- /* If the return value is a struct and we don't have a return */
- /* value address then we need to make one */
-
- if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
- {
- ecif.rvalue = alloca(cif->rtype->size);
- }
- else
- ecif.rvalue = rvalue;
-
+ /* Ensure that we have a valid struct return value */
+ ecif.rvalue = rvalue;
+ if (cif->rtype->type == FFI_TYPE_STRUCT) {
+ rsize = cif->rtype->size;
+ if (rsize <= 8)
+ ecif.rvalue = smst_buffer;
+ else if (!rvalue)
+ ecif.rvalue = alloca(rsize);
+ }
switch (cif->abi)
{
#ifndef POWERPC64
+# ifndef __NO_FPRS__
case FFI_SYSV:
case FFI_GCC_SYSV:
case FFI_LINUX:
+# endif
case FFI_LINUX_SOFT_FLOAT:
ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn);
break;
@@ -920,6 +959,10 @@ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
FFI_ASSERT (0);
break;
}
+
+ /* Check for a bounce-buffered return value */
+ if (rvalue && ecif.rvalue == smst_buffer)
+ memcpy(rvalue, smst_buffer, rsize);
}
@@ -949,14 +992,19 @@ ffi_prep_closure_loc (ffi_closure *closure,
#ifdef POWERPC64
void **tramp = (void **) &closure->tramp[0];
- FFI_ASSERT (cif->abi == FFI_LINUX64);
+ if (cif->abi != FFI_LINUX64)
+ return FFI_BAD_ABI;
/* Copy function address and TOC from ffi_closure_LINUX64. */
memcpy (tramp, (char *) ffi_closure_LINUX64, 16);
tramp[2] = codeloc;
#else
unsigned int *tramp;
- FFI_ASSERT (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV);
+ if (! (cif->abi == FFI_GCC_SYSV
+ || cif->abi == FFI_SYSV
+ || cif->abi == FFI_LINUX
+ || cif->abi == FFI_LINUX_SOFT_FLOAT))
+ return FFI_BAD_ABI;
tramp = (unsigned int *) &closure->tramp[0];
tramp[0] = 0x7c0802a6; /* mflr r0 */
@@ -1011,32 +1059,38 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
void ** avalue;
ffi_type ** arg_types;
long i, avn;
- long nf; /* number of floating registers already used */
- long ng; /* number of general registers already used */
- ffi_cif * cif;
- double temp;
- unsigned size;
+#ifndef __NO_FPRS__
+ long nf = 0; /* number of floating registers already used */
+#endif
+ long ng = 0; /* number of general registers already used */
+
+ ffi_cif *cif = closure->cif;
+ unsigned size = cif->rtype->size;
+ unsigned short rtypenum = cif->rtype->type;
- cif = closure->cif;
avalue = alloca (cif->nargs * sizeof (void *));
- size = cif->rtype->size;
- nf = 0;
- ng = 0;
+ /* First translate for softfloat/nonlinux */
+ if (cif->abi == FFI_LINUX_SOFT_FLOAT) {
+ if (rtypenum == FFI_TYPE_FLOAT)
+ rtypenum = FFI_TYPE_UINT32;
+ if (rtypenum == FFI_TYPE_DOUBLE)
+ rtypenum = FFI_TYPE_UINT64;
+ if (rtypenum == FFI_TYPE_LONGDOUBLE)
+ rtypenum = FFI_TYPE_UINT128;
+ } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ if (rtypenum == FFI_TYPE_LONGDOUBLE)
+ rtypenum = FFI_TYPE_STRUCT;
+#endif
+ }
+
/* Copy the caller's structure return value address so that the closure
returns the data directly to the caller.
For FFI_SYSV the result is passed in r3/r4 if the struct size is less
or equal 8 bytes. */
-
- if ((cif->rtype->type == FFI_TYPE_STRUCT
- && !((cif->abi == FFI_SYSV) && (size <= 8)))
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- || (cif->rtype->type == FFI_TYPE_LONGDOUBLE
- && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
-#endif
- )
- {
+ if (rtypenum == FFI_TYPE_STRUCT && ((cif->abi != FFI_SYSV) || (size > 8))) {
rvalue = (void *) *pgr;
ng++;
pgr++;
@@ -1047,10 +1101,109 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
arg_types = cif->arg_types;
/* Grab the addresses of the arguments from the stack frame. */
- while (i < avn)
- {
- switch (arg_types[i]->type)
- {
+ while (i < avn) {
+ unsigned short typenum = arg_types[i]->type;
+
+ /* We may need to handle some values depending on ABI */
+ if (cif->abi == FFI_LINUX_SOFT_FLOAT) {
+ if (typenum == FFI_TYPE_FLOAT)
+ typenum = FFI_TYPE_UINT32;
+ if (typenum == FFI_TYPE_DOUBLE)
+ typenum = FFI_TYPE_UINT64;
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_UINT128;
+ } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ if (typenum == FFI_TYPE_LONGDOUBLE)
+ typenum = FFI_TYPE_STRUCT;
+#endif
+ }
+
+ switch (typenum) {
+#ifndef __NO_FPRS__
+ case FFI_TYPE_FLOAT:
+ /* unfortunately float values are stored as doubles
+ * in the ffi_closure_SYSV code (since we don't check
+ * the type in that routine).
+ */
+
+ /* there are 8 64bit floating point registers */
+
+ if (nf < 8)
+ {
+ double temp = pfr->d;
+ pfr->f = (float) temp;
+ avalue[i] = pfr;
+ nf++;
+ pfr++;
+ }
+ else
+ {
+ /* FIXME? here we are really changing the values
+ * stored in the original calling routines outgoing
+ * parameter stack. This is probably a really
+ * naughty thing to do but...
+ */
+ avalue[i] = pst;
+ pst += 1;
+ }
+ break;
+
+ case FFI_TYPE_DOUBLE:
+ /* On the outgoing stack all values are aligned to 8 */
+ /* there are 8 64bit floating point registers */
+
+ if (nf < 8)
+ {
+ avalue[i] = pfr;
+ nf++;
+ pfr++;
+ }
+ else
+ {
+ if (((long) pst) & 4)
+ pst++;
+ avalue[i] = pst;
+ pst += 2;
+ }
+ break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ case FFI_TYPE_LONGDOUBLE:
+ if (nf < 7)
+ {
+ avalue[i] = pfr;
+ pfr += 2;
+ nf += 2;
+ }
+ else
+ {
+ if (((long) pst) & 4)
+ pst++;
+ avalue[i] = pst;
+ pst += 4;
+ nf = 8;
+ }
+ break;
+#endif
+#endif /* have FPRS */
+
+ case FFI_TYPE_UINT128:
+ /*
+ * Test if for the whole long double, 4 gprs are available.
+ * otherwise the stuff ends up on the stack.
+ */
+ if (ng < 5) {
+ avalue[i] = pgr;
+ pgr += 4;
+ ng += 4;
+ } else {
+ avalue[i] = pst;
+ pst += 4;
+ ng = 8+4;
+ }
+ break;
+
case FFI_TYPE_SINT8:
case FFI_TYPE_UINT8:
/* there are 8 gpr registers used to pass values */
@@ -1086,7 +1239,6 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
case FFI_TYPE_SINT32:
case FFI_TYPE_UINT32:
case FFI_TYPE_POINTER:
- soft_float_closure:
/* there are 8 gpr registers used to pass values */
if (ng < 8)
{
@@ -1102,9 +1254,6 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
break;
case FFI_TYPE_STRUCT:
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- do_struct:
-#endif
/* Structs are passed by reference. The address will appear in a
gpr if it is one of the first 8 arguments. */
if (ng < 8)
@@ -1122,7 +1271,6 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
case FFI_TYPE_SINT64:
case FFI_TYPE_UINT64:
- soft_double_closure:
/* passing long long ints are complex, they must
* be passed in suitable register pairs such as
* (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10)
@@ -1154,99 +1302,8 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
}
break;
- case FFI_TYPE_FLOAT:
- /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_float_closure;
- /* unfortunately float values are stored as doubles
- * in the ffi_closure_SYSV code (since we don't check
- * the type in that routine).
- */
-
- /* there are 8 64bit floating point registers */
-
- if (nf < 8)
- {
- temp = pfr->d;
- pfr->f = (float) temp;
- avalue[i] = pfr;
- nf++;
- pfr++;
- }
- else
- {
- /* FIXME? here we are really changing the values
- * stored in the original calling routines outgoing
- * parameter stack. This is probably a really
- * naughty thing to do but...
- */
- avalue[i] = pst;
- pst += 1;
- }
- break;
-
- case FFI_TYPE_DOUBLE:
- /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- goto soft_double_closure;
- /* On the outgoing stack all values are aligned to 8 */
- /* there are 8 64bit floating point registers */
-
- if (nf < 8)
- {
- avalue[i] = pfr;
- nf++;
- pfr++;
- }
- else
- {
- if (((long) pst) & 4)
- pst++;
- avalue[i] = pst;
- pst += 2;
- }
- break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- case FFI_TYPE_LONGDOUBLE:
- if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
- goto do_struct;
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- { /* Test if for the whole long double, 4 gprs are available.
- otherwise the stuff ends up on the stack. */
- if (ng < 5)
- {
- avalue[i] = pgr;
- pgr += 4;
- ng += 4;
- }
- else
- {
- avalue[i] = pst;
- pst += 4;
- ng = 8;
- }
- break;
- }
- if (nf < 7)
- {
- avalue[i] = pfr;
- pfr += 2;
- nf += 2;
- }
- else
- {
- if (((long) pst) & 4)
- pst++;
- avalue[i] = pst;
- pst += 4;
- nf = 8;
- }
- break;
-#endif
-
default:
- FFI_ASSERT (0);
+ FFI_ASSERT (0);
}
i++;
@@ -1263,39 +1320,9 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
already used and we never have a struct with size zero. That is the reason
for the subtraction of 1. See the comment in ffitarget.h about ordering.
*/
- if (cif->abi == FFI_SYSV && cif->rtype->type == FFI_TYPE_STRUCT
- && size <= 8)
+ if (cif->abi == FFI_SYSV && rtypenum == FFI_TYPE_STRUCT && size <= 8)
return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- else if (cif->rtype->type == FFI_TYPE_LONGDOUBLE
- && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
- return FFI_TYPE_STRUCT;
-#endif
- /* With FFI_LINUX_SOFT_FLOAT floats and doubles are handled like UINT32
- respectivley UINT64. */
- if (cif->abi == FFI_LINUX_SOFT_FLOAT)
- {
- switch (cif->rtype->type)
- {
- case FFI_TYPE_FLOAT:
- return FFI_TYPE_UINT32;
- break;
- case FFI_TYPE_DOUBLE:
- return FFI_TYPE_UINT64;
- break;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- case FFI_TYPE_LONGDOUBLE:
- return FFI_TYPE_UINT128;
- break;
-#endif
- default:
- return cif->rtype->type;
- }
- }
- else
- {
- return cif->rtype->type;
- }
+ return rtypenum;
}
int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *,
diff --git a/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c b/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c
index d84f1c3..dd897f4 100644
--- a/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c
+++ b/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c
@@ -3,7 +3,7 @@
Copyright (C) 1998 Geoffrey Keating
Copyright (C) 2001 John Hornkvist
- Copyright (C) 2002, 2006, 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
FFI support for Darwin and AIX.
@@ -35,11 +35,17 @@
extern void ffi_closure_ASM (void);
enum {
- /* The assembly depends on these exact flags. */
- FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */
- FLAG_RETURNS_FP = 1 << (31-29),
- FLAG_RETURNS_64BITS = 1 << (31-28),
- FLAG_RETURNS_128BITS = 1 << (31-31),
+ /* The assembly depends on these exact flags.
+ For Darwin64 (when FLAG_RETURNS_STRUCT is set):
+ FLAG_RETURNS_FP indicates that the structure embeds FP data.
+ FLAG_RETURNS_128BITS signals a special struct size that is not
+ expanded for float content. */
+ FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */
+ FLAG_RETURNS_NOTHING = 1 << (31-30),
+ FLAG_RETURNS_FP = 1 << (31-29),
+ FLAG_RETURNS_64BITS = 1 << (31-28),
+
+ FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */
FLAG_ARG_NEEDS_COPY = 1 << (31- 7),
FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
@@ -50,43 +56,61 @@ enum {
/* About the DARWIN ABI. */
enum {
NUM_GPR_ARG_REGISTERS = 8,
- NUM_FPR_ARG_REGISTERS = 13
+ NUM_FPR_ARG_REGISTERS = 13,
+ LINKAGE_AREA_GPRS = 6
};
-enum { ASM_NEEDS_REGISTERS = 4 };
+
+enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */
/* ffi_prep_args is called by the assembly routine once stack space
has been allocated for the function's arguments.
+
+ m32/m64
The stack layout we want looks like this:
| Return address from ffi_call_DARWIN | higher addresses
|--------------------------------------------|
- | Previous backchain pointer 4 | stack pointer here
+ | Previous backchain pointer 4/8 | stack pointer here
|--------------------------------------------|<+ <<< on entry to
- | Saved r28-r31 4*4 | | ffi_call_DARWIN
+ | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN
|--------------------------------------------| |
- | Parameters (at least 8*4=32) | |
+ | When we have any FP activity... the | |
+ | FPRs occupy NUM_FPR_ARG_REGISTERS slots | |
+ | here fp13 .. fp1 from high to low addr. | |
+ ~ ~ ~
+ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
|--------------------------------------------| |
- | Space for GPR2 4 | |
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
|--------------------------------------------| | stack |
- | Reserved 2*4 | | grows |
+ | Reserved 2*4/8 | | grows |
|--------------------------------------------| | down V
- | Space for callee's LR 4 | |
+ | Space for callee's LR 4/8 | |
|--------------------------------------------| | lower addresses
- | Saved CR 4 | |
+ | Saved CR [low word for m64] 4/8 | |
|--------------------------------------------| | stack pointer here
- | Current backchain pointer 4 |-/ during
+ | Current backchain pointer 4/8 |-/ during
|--------------------------------------------| <<< ffi_call_DARWIN
*/
+#if defined(POWERPC_DARWIN64)
+static void
+darwin64_pass_struct_by_value
+ (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **);
+#endif
+
+/* This depends on GPR_SIZE = sizeof (unsigned long) */
+
void
ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
{
const unsigned bytes = ecif->cif->bytes;
const unsigned flags = ecif->cif->flags;
const unsigned nargs = ecif->cif->nargs;
+#if !defined(POWERPC_DARWIN64)
const ffi_abi abi = ecif->cif->abi;
+#endif
/* 'stacktop' points at the previous backchain pointer. */
unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long));
@@ -94,18 +118,19 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
/* 'fpr_base' points at the space for fpr1, and grows upwards as
we use FPR registers. */
double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS;
- int fparg_count = 0;
-
+ int gp_count = 0, fparg_count = 0;
/* 'next_arg' grows up as we put parameters in it. */
- unsigned long *next_arg = stack + 6; /* 6 reserved positions. */
+ unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */
int i;
double double_tmp;
void **p_argv = ecif->avalue;
unsigned long gprvalue;
ffi_type** ptr = ecif->cif->arg_types;
+#if !defined(POWERPC_DARWIN64)
char *dest_cpy;
+#endif
unsigned size_al = 0;
/* Check that everything starts aligned properly. */
@@ -130,25 +155,30 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
the size of the floating-point parameter are skipped. */
case FFI_TYPE_FLOAT:
double_tmp = *(float *) *p_argv;
- if (fparg_count >= NUM_FPR_ARG_REGISTERS)
- *(double *)next_arg = double_tmp;
- else
+ if (fparg_count < NUM_FPR_ARG_REGISTERS)
*fpr_base++ = double_tmp;
+#if defined(POWERPC_DARWIN)
+ *(float *)next_arg = *(float *) *p_argv;
+#else
+ *(double *)next_arg = double_tmp;
+#endif
next_arg++;
+ gp_count++;
fparg_count++;
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
break;
case FFI_TYPE_DOUBLE:
double_tmp = *(double *) *p_argv;
- if (fparg_count >= NUM_FPR_ARG_REGISTERS)
- *(double *)next_arg = double_tmp;
- else
+ if (fparg_count < NUM_FPR_ARG_REGISTERS)
*fpr_base++ = double_tmp;
+ *(double *)next_arg = double_tmp;
#ifdef POWERPC64
next_arg++;
+ gp_count++;
#else
next_arg += 2;
+ gp_count += 2;
#endif
fparg_count++;
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
@@ -157,30 +187,41 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
-#ifdef POWERPC64
+# if defined(POWERPC64) && !defined(POWERPC_DARWIN64)
+ /* ??? This will exceed the regs count when the value starts at fp13
+ and it will not put the extra bit on the stack. */
if (fparg_count < NUM_FPR_ARG_REGISTERS)
*(long double *) fpr_base++ = *(long double *) *p_argv;
else
*(long double *) next_arg = *(long double *) *p_argv;
next_arg += 2;
fparg_count += 2;
-#else
+# else
double_tmp = ((double *) *p_argv)[0];
if (fparg_count < NUM_FPR_ARG_REGISTERS)
*fpr_base++ = double_tmp;
- else
- *(double *) next_arg = double_tmp;
+ *(double *) next_arg = double_tmp;
+# if defined(POWERPC_DARWIN64)
+ next_arg++;
+ gp_count++;
+# else
next_arg += 2;
+ gp_count += 2;
+# endif
fparg_count++;
-
double_tmp = ((double *) *p_argv)[1];
if (fparg_count < NUM_FPR_ARG_REGISTERS)
*fpr_base++ = double_tmp;
- else
- *(double *) next_arg = double_tmp;
+ *(double *) next_arg = double_tmp;
+# if defined(POWERPC_DARWIN64)
+ next_arg++;
+ gp_count++;
+# else
next_arg += 2;
+ gp_count += 2;
+# endif
fparg_count++;
-#endif
+# endif
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
break;
#endif
@@ -192,6 +233,7 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
#else
*(long long *) next_arg = *(long long *) *p_argv;
next_arg += 2;
+ gp_count += 2;
#endif
break;
case FFI_TYPE_POINTER:
@@ -211,32 +253,35 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
goto putgpr;
case FFI_TYPE_STRUCT:
-#ifdef POWERPC64
- dest_cpy = (char *) next_arg;
size_al = (*ptr)->size;
- if ((*ptr)->elements[0]->type == 3)
+#if defined(POWERPC_DARWIN64)
+ next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment);
+ darwin64_pass_struct_by_value (*ptr, (char *) *p_argv,
+ (unsigned) size_al,
+ (unsigned int *) &fparg_count,
+ &fpr_base, &next_arg);
+#else
+ dest_cpy = (char *) next_arg;
+
+ /* If the first member of the struct is a double, then include enough
+ padding in the struct size to align it to double-word. */
+ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
size_al = ALIGN((*ptr)->size, 8);
- if (size_al < 3 && abi == FFI_DARWIN)
- dest_cpy += 4 - size_al;
+# if defined(POWERPC64)
+ FFI_ASSERT (abi != FFI_DARWIN);
memcpy ((char *) dest_cpy, (char *) *p_argv, size_al);
next_arg += (size_al + 7) / 8;
-#else
- dest_cpy = (char *) next_arg;
-
+# else
/* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
SI 4 bytes) are aligned as if they were those modes.
Structures with 3 byte in size are padded upwards. */
- size_al = (*ptr)->size;
- /* If the first member of the struct is a double, then align
- the struct to double-word. */
- if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
- size_al = ALIGN((*ptr)->size, 8);
if (size_al < 3 && abi == FFI_DARWIN)
dest_cpy += 4 - size_al;
memcpy((char *) dest_cpy, (char *) *p_argv, size_al);
next_arg += (size_al + 3) / 4;
+# endif
#endif
break;
@@ -249,6 +294,7 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
gprvalue = *(unsigned int *) *p_argv;
putgpr:
*next_arg++ = gprvalue;
+ gp_count++;
break;
default:
break;
@@ -262,8 +308,269 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
//FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
}
+#if defined(POWERPC_DARWIN64)
+
+/* See if we can put some of the struct into fprs.
+ This should not be called for structures of size 16 bytes, since these are not
+ broken out this way. */
+static void
+darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr)
+{
+ int i;
+
+ FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
+
+ for (i = 0; s->elements[i] != NULL; i++)
+ {
+ ffi_type *p = s->elements[i];
+ switch (p->type)
+ {
+ case FFI_TYPE_STRUCT:
+ darwin64_scan_struct_for_floats (p, nfpr);
+ break;
+ case FFI_TYPE_LONGDOUBLE:
+ (*nfpr) += 2;
+ break;
+ case FFI_TYPE_DOUBLE:
+ case FFI_TYPE_FLOAT:
+ (*nfpr) += 1;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static int
+darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
+{
+ unsigned struct_offset=0, i;
+
+ for (i = 0; s->elements[i] != NULL; i++)
+ {
+ char *item_base;
+ ffi_type *p = s->elements[i];
+ /* Find the start of this item (0 for the first one). */
+ if (i > 0)
+ struct_offset = ALIGN(struct_offset, p->alignment);
+
+ item_base = src + struct_offset;
+
+ switch (p->type)
+ {
+ case FFI_TYPE_STRUCT:
+ if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr))
+ return 1;
+ break;
+ case FFI_TYPE_LONGDOUBLE:
+ if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+ return 1;
+ (*nfpr) += 1;
+ item_base += 8;
+ /* FALL THROUGH */
+ case FFI_TYPE_DOUBLE:
+ if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+ return 1;
+ (*nfpr) += 1;
+ break;
+ case FFI_TYPE_FLOAT:
+ if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+ return 1;
+ (*nfpr) += 1;
+ break;
+ default:
+ /* If we try and place any item, that is non-float, once we've
+ exceeded the 8 GPR mark, then we can't fit the struct. */
+ if ((unsigned long)item_base >= 8*8)
+ return 1;
+ break;
+ }
+ /* now count the size of what we just used. */
+ struct_offset += p->size;
+ }
+ return 0;
+}
+
+/* Can this struct be returned by value? */
+int
+darwin64_struct_ret_by_value_p (ffi_type *s)
+{
+ unsigned nfp = 0;
+
+ FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT);
+
+ /* The largest structure we can return is 8long + 13 doubles. */
+ if (s->size > 168)
+ return 0;
+
+ /* We can't pass more than 13 floats. */
+ darwin64_scan_struct_for_floats (s, &nfp);
+ if (nfp > 13)
+ return 0;
+
+ /* If there are not too many floats, and the struct is
+ small enough to accommodate in the GPRs, then it must be OK. */
+ if (s->size <= 64)
+ return 1;
+
+ /* Well, we have to look harder. */
+ nfp = 0;
+ if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp))
+ return 0;
+
+ return 1;
+}
+
+void
+darwin64_pass_struct_floats (ffi_type *s, char *src,
+ unsigned *nfpr, double **fprs)
+{
+ int i;
+ double *fpr_base = *fprs;
+ unsigned struct_offset = 0;
+
+ /* We don't assume anything about the alignment of the source. */
+ for (i = 0; s->elements[i] != NULL; i++)
+ {
+ char *item_base;
+ ffi_type *p = s->elements[i];
+ /* Find the start of this item (0 for the first one). */
+ if (i > 0)
+ struct_offset = ALIGN(struct_offset, p->alignment);
+ item_base = src + struct_offset;
+
+ switch (p->type)
+ {
+ case FFI_TYPE_STRUCT:
+ darwin64_pass_struct_floats (p, item_base, nfpr,
+ &fpr_base);
+ break;
+ case FFI_TYPE_LONGDOUBLE:
+ if (*nfpr < NUM_FPR_ARG_REGISTERS)
+ *fpr_base++ = *(double *)item_base;
+ (*nfpr) += 1;
+ item_base += 8;
+ /* FALL THROUGH */
+ case FFI_TYPE_DOUBLE:
+ if (*nfpr < NUM_FPR_ARG_REGISTERS)
+ *fpr_base++ = *(double *)item_base;
+ (*nfpr) += 1;
+ break;
+ case FFI_TYPE_FLOAT:
+ if (*nfpr < NUM_FPR_ARG_REGISTERS)
+ *fpr_base++ = (double) *(float *)item_base;
+ (*nfpr) += 1;
+ break;
+ default:
+ break;
+ }
+ /* now count the size of what we just used. */
+ struct_offset += p->size;
+ }
+ /* Update the scores. */
+ *fprs = fpr_base;
+}
+
+/* Darwin64 special rules.
+ Break out a struct into params and float registers. */
+static void
+darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size,
+ unsigned *nfpr, double **fprs, unsigned long **arg)
+{
+ unsigned long *next_arg = *arg;
+ char *dest_cpy = (char *)next_arg;
+
+ FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
+
+ if (!size)
+ return;
+
+ /* First... special cases. */
+ if (size < 3
+ || (size == 4
+ && s->elements[0]
+ && s->elements[0]->type != FFI_TYPE_FLOAT))
+ {
+ /* Must be at least one GPR, padding is unspecified in value,
+ let's make it zero. */
+ *next_arg = 0UL;
+ dest_cpy += 8 - size;
+ memcpy ((char *) dest_cpy, src, size);
+ next_arg++;
+ }
+ else if (size == 16)
+ {
+ memcpy ((char *) dest_cpy, src, size);
+ next_arg += 2;
+ }
+ else
+ {
+ /* now the general case, we consider embedded floats. */
+ memcpy ((char *) dest_cpy, src, size);
+ darwin64_pass_struct_floats (s, src, nfpr, fprs);
+ next_arg += (size+7)/8;
+ }
+
+ *arg = next_arg;
+}
+
+double *
+darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf)
+{
+ int i;
+ unsigned struct_offset = 0;
+
+ /* We don't assume anything about the alignment of the source. */
+ for (i = 0; s->elements[i] != NULL; i++)
+ {
+ char *item_base;
+ ffi_type *p = s->elements[i];
+ /* Find the start of this item (0 for the first one). */
+ if (i > 0)
+ struct_offset = ALIGN(struct_offset, p->alignment);
+ item_base = dest + struct_offset;
+
+ switch (p->type)
+ {
+ case FFI_TYPE_STRUCT:
+ fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf);
+ break;
+ case FFI_TYPE_LONGDOUBLE:
+ if (*nf < NUM_FPR_ARG_REGISTERS)
+ {
+ *(double *)item_base = *fprs++ ;
+ (*nf) += 1;
+ }
+ item_base += 8;
+ /* FALL THROUGH */
+ case FFI_TYPE_DOUBLE:
+ if (*nf < NUM_FPR_ARG_REGISTERS)
+ {
+ *(double *)item_base = *fprs++ ;
+ (*nf) += 1;
+ }
+ break;
+ case FFI_TYPE_FLOAT:
+ if (*nf < NUM_FPR_ARG_REGISTERS)
+ {
+ *(float *)item_base = (float) *fprs++ ;
+ (*nf) += 1;
+ }
+ break;
+ default:
+ break;
+ }
+ /* now count the size of what we just used. */
+ struct_offset += p->size;
+ }
+ return fprs;
+}
+
+#endif
+
/* Adjust the size of S to be correct for Darwin.
- On Darwin, the first field of a structure has natural alignment. */
+ On Darwin m32, the first field of a structure has natural alignment.
+ On Darwin m64, all fields have natural alignment. */
static void
darwin_adjust_aggregate_sizes (ffi_type *s)
@@ -280,22 +587,29 @@ darwin_adjust_aggregate_sizes (ffi_type *s)
int align;
p = s->elements[i];
- darwin_adjust_aggregate_sizes (p);
- if (i == 0
- && (p->type == FFI_TYPE_UINT64
- || p->type == FFI_TYPE_SINT64
- || p->type == FFI_TYPE_DOUBLE
- || p->alignment == 8))
- align = 8;
+ if (p->type == FFI_TYPE_STRUCT)
+ darwin_adjust_aggregate_sizes (p);
+#if defined(POWERPC_DARWIN64)
+ /* Natural alignment for all items. */
+ align = p->alignment;
+#else
+ /* Natrual alignment for the first item... */
+ if (i == 0)
+ align = p->alignment;
else if (p->alignment == 16 || p->alignment < 4)
+ /* .. subsequent items with vector or align < 4 have natural align. */
align = p->alignment;
else
+ /* .. or align is 4. */
align = 4;
+#endif
+ /* Pad, if necessary, before adding the current item. */
s->size = ALIGN(s->size, align) + p->size;
}
s->size = ALIGN(s->size, s->alignment);
+ /* This should not be necessary on m64, but harmless. */
if (s->elements[0]->type == FFI_TYPE_UINT64
|| s->elements[0]->type == FFI_TYPE_SINT64
|| s->elements[0]->type == FFI_TYPE_DOUBLE
@@ -344,10 +658,10 @@ ffi_status
ffi_prep_cif_machdep (ffi_cif *cif)
{
/* All this is for the DARWIN ABI. */
- int i;
+ unsigned i;
ffi_type **ptr;
unsigned bytes;
- int fparg_count = 0, intarg_count = 0;
+ unsigned fparg_count = 0, intarg_count = 0;
unsigned flags = 0;
unsigned size_al = 0;
@@ -372,16 +686,25 @@ ffi_prep_cif_machdep (ffi_cif *cif)
/* Space for the frame pointer, callee's LR, CR, etc, and for
the asm's temp regs. */
- bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long);
+ bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long);
- /* Return value handling. The rules are as follows:
+ /* Return value handling.
+ The rules m32 are as follows:
- 32-bit (or less) integer values are returned in gpr3;
- - Structures of size <= 4 bytes also returned in gpr3;
- - 64-bit integer values and structures between 5 and 8 bytes are returned
- in gpr3 and gpr4;
+ - structures of size <= 4 bytes also returned in gpr3;
+ - 64-bit integer values [??? and structures between 5 and 8 bytes] are
+ returned in gpr3 and gpr4;
- Single/double FP values are returned in fpr1;
- Long double FP (if not equivalent to double) values are returned in
fpr1 and fpr2;
+ m64:
+ - 64-bit or smaller integral values are returned in GPR3
+ - Single/double FP values are returned in fpr1;
+ - Long double FP values are returned in fpr1 and fpr2;
+ m64 Structures:
+ - If the structure could be accommodated in registers were it to be the
+ first argument to a routine, then it is returned in those registers.
+ m32/m64 structures otherwise:
- Larger structures values are allocated space and a pointer is passed
as the first argument. */
switch (cif->rtype->type)
@@ -410,9 +733,42 @@ ffi_prep_cif_machdep (ffi_cif *cif)
break;
case FFI_TYPE_STRUCT:
+#if defined(POWERPC_DARWIN64)
+ {
+ /* Can we fit the struct into regs? */
+ if (darwin64_struct_ret_by_value_p (cif->rtype))
+ {
+ unsigned nfpr = 0;
+ flags |= FLAG_RETURNS_STRUCT;
+ if (cif->rtype->size != 16)
+ darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ;
+ else
+ flags |= FLAG_RETURNS_128BITS;
+ /* Will be 0 for 16byte struct. */
+ if (nfpr)
+ flags |= FLAG_RETURNS_FP;
+ }
+ else /* By ref. */
+ {
+ flags |= FLAG_RETVAL_REFERENCE;
+ flags |= FLAG_RETURNS_NOTHING;
+ intarg_count++;
+ }
+ }
+#elif defined(DARWIN_PPC)
+ if (cif->rtype->size <= 4)
+ flags |= FLAG_RETURNS_STRUCT;
+ else /* else by reference. */
+ {
+ flags |= FLAG_RETVAL_REFERENCE;
+ flags |= FLAG_RETURNS_NOTHING;
+ intarg_count++;
+ }
+#else /* assume we pass by ref. */
flags |= FLAG_RETVAL_REFERENCE;
flags |= FLAG_RETURNS_NOTHING;
intarg_count++;
+#endif
break;
case FFI_TYPE_VOID:
flags |= FLAG_RETURNS_NOTHING;
@@ -425,57 +781,83 @@ ffi_prep_cif_machdep (ffi_cif *cif)
/* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
- goes on the stack. Structures are passed as a pointer to a copy of
- the structure. Stuff on the stack needs to keep proper alignment. */
+ goes on the stack.
+ ??? Structures are passed as a pointer to a copy of the structure.
+ Stuff on the stack needs to keep proper alignment.
+ For m64 the count is effectively of half-GPRs. */
for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
{
+ unsigned align_words;
switch ((*ptr)->type)
{
case FFI_TYPE_FLOAT:
case FFI_TYPE_DOUBLE:
fparg_count++;
+#if !defined(POWERPC_DARWIN64)
/* If this FP arg is going on the stack, it must be
8-byte-aligned. */
if (fparg_count > NUM_FPR_ARG_REGISTERS
- && intarg_count%2 != 0)
+ && (intarg_count & 0x01) != 0)
intarg_count++;
+#endif
break;
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-
case FFI_TYPE_LONGDOUBLE:
fparg_count += 2;
/* If this FP arg is going on the stack, it must be
- 8-byte-aligned. */
- if (fparg_count > NUM_FPR_ARG_REGISTERS
- && intarg_count%2 != 0)
- intarg_count++;
- intarg_count +=2;
+ 16-byte-aligned. */
+ if (fparg_count >= NUM_FPR_ARG_REGISTERS)
+#if defined (POWERPC64)
+ intarg_count = ALIGN(intarg_count, 2);
+#else
+ intarg_count = ALIGN(intarg_count, 4);
+#endif
break;
#endif
case FFI_TYPE_UINT64:
case FFI_TYPE_SINT64:
+#if defined(POWERPC64)
+ intarg_count++;
+#else
/* 'long long' arguments are passed as two words, but
either both words must fit in registers or both go
on the stack. If they go on the stack, they must
be 8-byte-aligned. */
if (intarg_count == NUM_GPR_ARG_REGISTERS-1
- || (intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count%2 != 0))
+ || (intarg_count >= NUM_GPR_ARG_REGISTERS
+ && (intarg_count & 0x01) != 0))
intarg_count++;
intarg_count += 2;
+#endif
break;
case FFI_TYPE_STRUCT:
size_al = (*ptr)->size;
+#if defined(POWERPC_DARWIN64)
+ align_words = (*ptr)->alignment >> 3;
+ if (align_words)
+ intarg_count = ALIGN(intarg_count, align_words);
+ /* Base size of the struct. */
+ intarg_count += (size_al + 7) / 8;
+ /* If 16 bytes then don't worry about floats. */
+ if (size_al != 16)
+ /* Scan through for floats to be placed in regs. */
+ darwin64_scan_struct_for_floats (*ptr, &fparg_count) ;
+#else
+ align_words = (*ptr)->alignment >> 2;
+ if (align_words)
+ intarg_count = ALIGN(intarg_count, align_words);
/* If the first member of the struct is a double, then align
- the struct to double-word. */
+ the struct to double-word.
if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
- size_al = ALIGN((*ptr)->size, 8);
-#ifdef POWERPC64
+ size_al = ALIGN((*ptr)->size, 8); */
+# ifdef POWERPC64
intarg_count += (size_al + 7) / 8;
-#else
+# else
intarg_count += (size_al + 3) / 4;
+# endif
#endif
break;
@@ -490,9 +872,18 @@ ffi_prep_cif_machdep (ffi_cif *cif)
if (fparg_count != 0)
flags |= FLAG_FP_ARGUMENTS;
+#if defined(POWERPC_DARWIN64)
+ /* Space to image the FPR registers, if needed - which includes when they might be
+ used in a struct return. */
+ if (fparg_count != 0
+ || ((flags & FLAG_RETURNS_STRUCT)
+ && (flags & FLAG_RETURNS_FP)))
+ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
+#else
/* Space for the FPR registers, if needed. */
if (fparg_count != 0)
bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
+#endif
/* Stack space. */
#ifdef POWERPC64
@@ -506,7 +897,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
/* The stack space allocated needs to be a multiple of 16 bytes. */
- bytes = (bytes + 15) & ~0xF;
+ bytes = ALIGN(bytes, 16) ;
cif->flags = flags;
cif->bytes = bytes;
@@ -516,8 +907,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
void (*fn)(void), void (*fn2)(void));
+
extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
- void (*fn)(void), void (*fn2)(void));
+ void (*fn)(void), void (*fn2)(void), ffi_type*);
void
ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
@@ -542,11 +934,11 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
case FFI_AIX:
ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
- ffi_prep_args);
+ FFI_FN(ffi_prep_args));
break;
case FFI_DARWIN:
ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
- ffi_prep_args);
+ FFI_FN(ffi_prep_args), cif->rtype);
break;
default:
FFI_ASSERT(0);
@@ -566,58 +958,48 @@ typedef struct aix_fd_struct {
} aix_fd;
/* here I'd like to add the stack frame layout we use in darwin_closure.S
- and aix_clsoure.S
-
- SP previous -> +---------------------------------------+ <--- child frame
- | back chain to caller 4 |
- +---------------------------------------+ 4
- | saved CR 4 |
- +---------------------------------------+ 8
- | saved LR 4 |
- +---------------------------------------+ 12
- | reserved for compilers 4 |
- +---------------------------------------+ 16
- | reserved for binders 4 |
- +---------------------------------------+ 20
- | saved TOC pointer 4 |
- +---------------------------------------+ 24
- | always reserved 8*4=32 (previous GPRs)|
- | according to the linkage convention |
- | from AIX |
- +---------------------------------------+ 56
- | our FPR area 13*8=104 |
- | f1 |
- | . |
- | f13 |
- +---------------------------------------+ 160
- | result area 8 |
- +---------------------------------------+ 168
- | alignement to the next multiple of 16 |
-SP current --> +---------------------------------------+ 176 <- parent frame
- | back chain to caller 4 |
- +---------------------------------------+ 180
- | saved CR 4 |
- +---------------------------------------+ 184
- | saved LR 4 |
- +---------------------------------------+ 188
- | reserved for compilers 4 |
- +---------------------------------------+ 192
- | reserved for binders 4 |
- +---------------------------------------+ 196
- | saved TOC pointer 4 |
- +---------------------------------------+ 200
- | always reserved 8*4=32 we store our |
- | GPRs here |
- | r3 |
- | . |
- | r10 |
- +---------------------------------------+ 232
- | overflow part |
- +---------------------------------------+ xxx
- | ???? |
- +---------------------------------------+ xxx
+ and aix_closure.S
+
+ m32/m64
+
+ The stack layout looks like this:
+
+ | Additional params... | | Higher address
+ ~ ~ ~
+ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
+ |--------------------------------------------| |
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
+ |--------------------------------------------| |
+ | Reserved 2*4/8 | |
+ |--------------------------------------------| |
+ | Space for callee's LR 4/8 | |
+ |--------------------------------------------| |
+ | Saved CR [low word for m64] 4/8 | |
+ |--------------------------------------------| |
+ | Current backchain pointer 4/8 |-/ Parent's frame.
+ |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM
+ | Result Bytes 16 | |
+ |--------------------------------------------| |
+ ~ padding to 16-byte alignment ~ ~
+ |--------------------------------------------| |
+ | NUM_FPR_ARG_REGISTERS slots | |
+ | here fp13 .. fp1 13*8 | |
+ |--------------------------------------------| |
+ | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS
+ |--------------------------------------------| |
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
+ |--------------------------------------------| | stack |
+ | Reserved [compiler,binder] 2*4/8 | | grows |
+ |--------------------------------------------| | down V
+ | Space for callee's LR 4/8 | |
+ |--------------------------------------------| | lower addresses
+ | Saved CR [low word for m64] 4/8 | |
+ |--------------------------------------------| | stack pointer here
+ | Current backchain pointer 4/8 |-/ during
+ |--------------------------------------------| <<< ffi_closure_ASM.
*/
+
ffi_status
ffi_prep_closure_loc (ffi_closure* closure,
ffi_cif* cif,
@@ -631,30 +1013,44 @@ ffi_prep_closure_loc (ffi_closure* closure,
switch (cif->abi)
{
- case FFI_DARWIN:
-
- FFI_ASSERT (cif->abi == FFI_DARWIN);
-
- tramp = (unsigned int *) &closure->tramp[0];
- tramp[0] = 0x7c0802a6; /* mflr r0 */
- tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */
- tramp[4] = 0x7d6802a6; /* mflr r11 */
- tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */
- tramp[6] = 0x7c0803a6; /* mtlr r0 */
- tramp[7] = 0x7d8903a6; /* mtctr r12 */
- tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */
- tramp[9] = 0x4e800420; /* bctr */
- tramp[2] = (unsigned long) ffi_closure_ASM; /* function */
- tramp[3] = (unsigned long) codeloc; /* context */
-
- closure->cif = cif;
- closure->fun = fun;
- closure->user_data = user_data;
+ case FFI_DARWIN:
+
+ FFI_ASSERT (cif->abi == FFI_DARWIN);
+
+ tramp = (unsigned int *) &closure->tramp[0];
+#if defined(POWERPC_DARWIN64)
+ tramp[0] = 0x7c0802a6; /* mflr r0 */
+ tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */
+ /* We put the addresses here. */
+ tramp[6] = 0x7d6802a6; /*L1: mflr r11 */
+ tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */
+ tramp[8] = 0x7c0803a6; /* mtlr r0 */
+ tramp[9] = 0x7d8903a6; /* mtctr r12 */
+ tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */
+ tramp[11] = 0x4e800420; /* bctr */
+
+ *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */
+ *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */
+#else
+ tramp[0] = 0x7c0802a6; /* mflr r0 */
+ tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */
+ tramp[4] = 0x7d6802a6; /* mflr r11 */
+ tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */
+ tramp[6] = 0x7c0803a6; /* mtlr r0 */
+ tramp[7] = 0x7d8903a6; /* mtctr r12 */
+ tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */
+ tramp[9] = 0x4e800420; /* bctr */
+ tramp[2] = (unsigned long) ffi_closure_ASM; /* function */
+ tramp[3] = (unsigned long) codeloc; /* context */
+#endif
+ closure->cif = cif;
+ closure->fun = fun;
+ closure->user_data = user_data;
- /* Flush the icache. Only necessary on Darwin. */
- flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
+ /* Flush the icache. Only necessary on Darwin. */
+ flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
- break;
+ break;
case FFI_AIX:
@@ -669,10 +1065,10 @@ ffi_prep_closure_loc (ffi_closure* closure,
closure->cif = cif;
closure->fun = fun;
closure->user_data = user_data;
+ break;
default:
-
- FFI_ASSERT(0);
+ return FFI_BAD_ABI;
break;
}
return FFI_OK;
@@ -708,7 +1104,7 @@ typedef union
double d;
} ffi_dblfl;
-int
+ffi_type *
ffi_closure_helper_DARWIN (ffi_closure *, void *,
unsigned long *, ffi_dblfl *);
@@ -719,7 +1115,7 @@ ffi_closure_helper_DARWIN (ffi_closure *, void *,
up space for a return value, ffi_closure_ASM invokes the
following helper function to do most of the work. */
-int
+ffi_type *
ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
unsigned long *pgr, ffi_dblfl *pfr)
{
@@ -741,16 +1137,32 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
ffi_cif * cif;
ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
unsigned size_al;
+#if defined(POWERPC_DARWIN64)
+ unsigned fpsused = 0;
+#endif
cif = closure->cif;
avalue = alloca (cif->nargs * sizeof(void *));
- /* Copy the caller's structure return value address so that the closure
- returns the data directly to the caller. */
if (cif->rtype->type == FFI_TYPE_STRUCT)
{
+#if defined(POWERPC_DARWIN64)
+ if (!darwin64_struct_ret_by_value_p (cif->rtype))
+ {
+ /* Won't fit into the regs - return by ref. */
+ rvalue = (void *) *pgr;
+ pgr++;
+ }
+#elif defined(DARWIN_PPC)
+ if (cif->rtype->size > 4)
+ {
+ rvalue = (void *) *pgr;
+ pgr++;
+ }
+#else /* assume we return by ref. */
rvalue = (void *) *pgr;
pgr++;
+#endif
}
i = 0;
@@ -764,7 +1176,7 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
{
case FFI_TYPE_SINT8:
case FFI_TYPE_UINT8:
-#ifdef POWERPC64
+#if defined(POWERPC64)
avalue[i] = (char *) pgr + 7;
#else
avalue[i] = (char *) pgr + 3;
@@ -774,7 +1186,7 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
case FFI_TYPE_SINT16:
case FFI_TYPE_UINT16:
-#ifdef POWERPC64
+#if defined(POWERPC64)
avalue[i] = (char *) pgr + 6;
#else
avalue[i] = (char *) pgr + 2;
@@ -784,7 +1196,7 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
case FFI_TYPE_SINT32:
case FFI_TYPE_UINT32:
-#ifdef POWERPC64
+#if defined(POWERPC64)
avalue[i] = (char *) pgr + 4;
#else
case FFI_TYPE_POINTER:
@@ -794,34 +1206,53 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
break;
case FFI_TYPE_STRUCT:
-#ifdef POWERPC64
size_al = arg_types[i]->size;
- if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
- size_al = ALIGN (arg_types[i]->size, 8);
- if (size_al < 3 && cif->abi == FFI_DARWIN)
- avalue[i] = (void *) pgr + 8 - size_al;
- else
- avalue[i] = (void *) pgr;
+#if defined(POWERPC_DARWIN64)
+ pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment);
+ if (size_al < 3 || size_al == 4)
+ {
+ avalue[i] = ((char *)pgr)+8-size_al;
+ if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT
+ && fpsused < NUM_FPR_ARG_REGISTERS)
+ {
+ *(float *)pgr = (float) *(double *)pfr;
+ pfr++;
+ fpsused++;
+ }
+ }
+ else
+ {
+ if (size_al != 16)
+ pfr = (ffi_dblfl *)
+ darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr,
+ (double *)pfr, &fpsused);
+ avalue[i] = pgr;
+ }
pgr += (size_al + 7) / 8;
#else
- /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
- SI 4 bytes) are aligned as if they were those modes. */
- size_al = arg_types[i]->size;
/* If the first member of the struct is a double, then align
the struct to double-word. */
if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
size_al = ALIGN(arg_types[i]->size, 8);
+# if defined(POWERPC64)
+ FFI_ASSERT (cif->abi != FFI_DARWIN);
+ avalue[i] = pgr;
+ pgr += (size_al + 7) / 8;
+# else
+ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
+ SI 4 bytes) are aligned as if they were those modes. */
if (size_al < 3 && cif->abi == FFI_DARWIN)
- avalue[i] = (void*) pgr + 4 - size_al;
+ avalue[i] = (char*) pgr + 4 - size_al;
else
- avalue[i] = (void*) pgr;
+ avalue[i] = pgr;
pgr += (size_al + 3) / 4;
+# endif
#endif
break;
case FFI_TYPE_SINT64:
case FFI_TYPE_UINT64:
-#ifdef POWERPC64
+#if defined(POWERPC64)
case FFI_TYPE_POINTER:
avalue[i] = pgr;
pgr++;
@@ -924,5 +1355,5 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
(closure->fun) (cif, rvalue, avalue, closure->user_data);
/* Tell ffi_closure_ASM to perform return type promotions. */
- return cif->rtype->type;
+ return cif->rtype;
}
diff --git a/Modules/_ctypes/libffi/src/powerpc/ffitarget.h b/Modules/_ctypes/libffi/src/powerpc/ffitarget.h
index b4f992e..3c9db49 100644
--- a/Modules/_ctypes/libffi/src/powerpc/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/powerpc/ffitarget.h
@@ -1,6 +1,8 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
- Copyright (C) 2007, 2008 Free Software Foundation, Inc
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
+ Copyright (c) 1996-2003 Red Hat, Inc.
+
Target configuration macros for PowerPC.
Permission is hereby granted, free of charge, to any person obtaining
@@ -28,15 +30,28 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- System specific configurations ----------------------------------- */
#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */
+#ifndef POWERPC64
#define POWERPC64
-#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin */
+#endif
+#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */
+#ifndef POWERPC64
#define POWERPC64
+#endif
+#ifndef POWERPC_DARWIN64
+#define POWERPC_DARWIN64
+#endif
#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */
+#ifndef POWERPC64
#define POWERPC64
#endif
+#endif
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
@@ -51,18 +66,14 @@ typedef enum ffi_abi {
FFI_LINUX64,
FFI_LINUX,
FFI_LINUX_SOFT_FLOAT,
-# ifdef POWERPC64
+# if defined(POWERPC64)
FFI_DEFAULT_ABI = FFI_LINUX64,
-# else
-# if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106))
- FFI_DEFAULT_ABI = FFI_LINUX,
-# else
-# ifdef __NO_FPRS__
+# elif defined(__NO_FPRS__)
FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT,
-# else
+# elif (__LDBL_MANT_DIG__ == 106)
+ FFI_DEFAULT_ABI = FFI_LINUX,
+# else
FFI_DEFAULT_ABI = FFI_GCC_SYSV,
-# endif
-# endif
# endif
#endif
@@ -108,9 +119,13 @@ typedef enum ffi_abi {
#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2)
#if defined(POWERPC64) || defined(POWERPC_AIX)
-#define FFI_TRAMPOLINE_SIZE 24
+# if defined(POWERPC_DARWIN64)
+# define FFI_TRAMPOLINE_SIZE 48
+# else
+# define FFI_TRAMPOLINE_SIZE 24
+# endif
#else /* POWERPC || POWERPC_AIX */
-#define FFI_TRAMPOLINE_SIZE 40
+# define FFI_TRAMPOLINE_SIZE 40
#endif
#ifndef LIBFFI_ASM
diff --git a/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S b/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S
index 56f7d1a..41fb885 100644
--- a/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S
+++ b/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S
@@ -122,22 +122,41 @@ ENTRY(ffi_closure_SYSV)
blr
# case FFI_TYPE_FLOAT
+#ifndef __NO_FPRS__
lfs %f1,112+0(%r1)
mtlr %r0
addi %r1,%r1,144
+#else
+ nop
+ nop
+ nop
+#endif
blr
# case FFI_TYPE_DOUBLE
+#ifndef __NO_FPRS__
lfd %f1,112+0(%r1)
mtlr %r0
addi %r1,%r1,144
+#else
+ nop
+ nop
+ nop
+#endif
blr
# case FFI_TYPE_LONGDOUBLE
+#ifndef __NO_FPRS__
lfd %f1,112+0(%r1)
lfd %f2,112+8(%r1)
mtlr %r0
b .Lfinish
+#else
+ nop
+ nop
+ nop
+ blr
+#endif
# case FFI_TYPE_UINT8
lbz %r3,112+3(%r1)
diff --git a/Modules/_ctypes/libffi/src/powerpc/sysv.S b/Modules/_ctypes/libffi/src/powerpc/sysv.S
index 96ea22b..675ed03 100644
--- a/Modules/_ctypes/libffi/src/powerpc/sysv.S
+++ b/Modules/_ctypes/libffi/src/powerpc/sysv.S
@@ -83,6 +83,7 @@ ENTRY(ffi_call_SYSV)
nop
1:
+#ifndef __NO_FPRS__
/* Load all the FP registers. */
bf- 6,2f
lfd %f1,-16-(8*4)-(8*8)(%r28)
@@ -94,6 +95,7 @@ ENTRY(ffi_call_SYSV)
lfd %f6,-16-(8*4)-(3*8)(%r28)
lfd %f7,-16-(8*4)-(2*8)(%r28)
lfd %f8,-16-(8*4)-(1*8)(%r28)
+#endif
2:
/* Make the call. */
@@ -103,7 +105,9 @@ ENTRY(ffi_call_SYSV)
mtcrf 0x01,%r31 /* cr7 */
bt- 31,L(small_struct_return_value)
bt- 30,L(done_return_value)
+#ifndef __NO_FPRS__
bt- 29,L(fp_return_value)
+#endif
stw %r3,0(%r30)
bf+ 28,L(done_return_value)
stw %r4,4(%r30)
@@ -124,6 +128,7 @@ L(done_return_value):
lwz %r1,0(%r1)
blr
+#ifndef __NO_FPRS__
L(fp_return_value):
bf 28,L(float_return_value)
stfd %f1,0(%r30)
@@ -134,21 +139,17 @@ L(fp_return_value):
L(float_return_value):
stfs %f1,0(%r30)
b L(done_return_value)
+#endif
L(small_struct_return_value):
- extrwi %r6,%r31,2,19 /* number of bytes padding = shift/8 */
- mtcrf 0x02,%r31 /* copy flags to cr[24:27] (cr6) */
- extrwi %r5,%r31,5,19 /* r5 <- number of bits of padding */
- subfic %r6,%r6,4 /* r6 <- number of useful bytes in r3 */
- bf- 25,L(done_return_value) /* struct in r3 ? if not, done. */
-/* smst_one_register: */
- slw %r3,%r3,%r5 /* Left-justify value in r3 */
- mtxer %r6 /* move byte count to XER ... */
- stswx %r3,0,%r30 /* ... and store that many bytes */
- bf+ 26,L(done_return_value) /* struct in r3:r4 ? */
- add %r6,%r6,%r30 /* adjust pointer */
- stswi %r4,%r6,4 /* store last four bytes */
- b L(done_return_value)
+ /*
+ * The C code always allocates a properly-aligned 8-byte bounce
+ * buffer to make this assembly code very simple. Just write out
+ * r3 and r4 to the buffer to allow the C code to handle the rest.
+ */
+ stw %r3, 0(%r30)
+ stw %r4, 4(%r30)
+ b L(done_return_value)
.LFE1:
END(ffi_call_SYSV)
diff --git a/Modules/_ctypes/libffi/src/prep_cif.c b/Modules/_ctypes/libffi/src/prep_cif.c
index c1c3b9a..eb68341 100644
--- a/Modules/_ctypes/libffi/src/prep_cif.c
+++ b/Modules/_ctypes/libffi/src/prep_cif.c
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------------
- prep_cif.c - Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
+ prep_cif.c - Copyright (c) 2011, 2012 Anthony Green
+ Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -37,17 +38,21 @@ static ffi_status initialize_aggregate(ffi_type *arg)
{
ffi_type **ptr;
- FFI_ASSERT(arg != NULL);
+ if (UNLIKELY(arg == NULL || arg->elements == NULL))
+ return FFI_BAD_TYPEDEF;
- FFI_ASSERT(arg->elements != NULL);
- FFI_ASSERT(arg->size == 0);
- FFI_ASSERT(arg->alignment == 0);
+ arg->size = 0;
+ arg->alignment = 0;
ptr = &(arg->elements[0]);
+ if (UNLIKELY(ptr == 0))
+ return FFI_BAD_TYPEDEF;
+
while ((*ptr) != NULL)
{
- if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
+ if (UNLIKELY(((*ptr)->size == 0)
+ && (initialize_aggregate((*ptr)) != FFI_OK)))
return FFI_BAD_TYPEDEF;
/* Perform a sanity check on the argument type */
@@ -85,19 +90,38 @@ static ffi_status initialize_aggregate(ffi_type *arg)
/* Perform machine independent ffi_cif preparation, then call
machine dependent routine. */
-ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
- ffi_type *rtype, ffi_type **atypes)
+/* For non variadic functions isvariadic should be 0 and
+ nfixedargs==ntotalargs.
+
+ For variadic calls, isvariadic should be 1 and nfixedargs
+ and ntotalargs set as appropriate. nfixedargs must always be >=1 */
+
+
+ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
+ unsigned int isvariadic,
+ unsigned int nfixedargs,
+ unsigned int ntotalargs,
+ ffi_type *rtype, ffi_type **atypes)
{
unsigned bytes = 0;
unsigned int i;
ffi_type **ptr;
FFI_ASSERT(cif != NULL);
- FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
+ FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
+ FFI_ASSERT(nfixedargs <= ntotalargs);
+
+#ifndef X86_WIN32
+ if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))
+ return FFI_BAD_ABI;
+#else
+ if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL))
+ return FFI_BAD_ABI;
+#endif
cif->abi = abi;
cif->arg_types = atypes;
- cif->nargs = nargs;
+ cif->nargs = ntotalargs;
cif->rtype = rtype;
cif->flags = 0;
@@ -110,7 +134,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
FFI_ASSERT_VALID_TYPE(cif->rtype);
/* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */
-#if !defined M68K && !defined __i386__ && !defined __x86_64__ && !defined S390 && !defined PA
+#if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA
/* Make space for the return structure pointer */
if (cif->rtype->type == FFI_TYPE_STRUCT
#ifdef SPARC
@@ -131,7 +155,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
check after the initialization. */
FFI_ASSERT_VALID_TYPE(*ptr);
-#if !defined __i386__ && !defined __x86_64__ && !defined S390 && !defined PA
+#if !defined X86_ANY && !defined S390 && !defined PA
#ifdef SPARC
if (((*ptr)->type == FFI_TYPE_STRUCT
&& ((*ptr)->size > 16 || cif->abi != FFI_V9))
@@ -153,10 +177,31 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
cif->bytes = bytes;
/* Perform machine dependent cif processing */
+#ifdef FFI_TARGET_SPECIFIC_VARIADIC
+ if (isvariadic)
+ return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs);
+#endif
+
return ffi_prep_cif_machdep(cif);
}
#endif /* not __CRIS__ */
+ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
+ ffi_type *rtype, ffi_type **atypes)
+{
+ return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes);
+}
+
+ffi_status ffi_prep_cif_var(ffi_cif *cif,
+ ffi_abi abi,
+ unsigned int nfixedargs,
+ unsigned int ntotalargs,
+ ffi_type *rtype,
+ ffi_type **atypes)
+{
+ return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
+}
+
#if FFI_CLOSURES
ffi_status
diff --git a/Modules/_ctypes/libffi/src/s390/ffitarget.h b/Modules/_ctypes/libffi/src/s390/ffitarget.h
index 78f3c65..97fa5c4 100644
--- a/Modules/_ctypes/libffi/src/s390/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/s390/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for S390.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,9 +28,15 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
#if defined (__s390x__)
+#ifndef S390X
#define S390X
#endif
+#endif
/* ---- System specific configurations ----------------------------------- */
@@ -40,8 +47,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/sh/ffi.c b/Modules/_ctypes/libffi/src/sh/ffi.c
index 69bd025..3515b91 100644
--- a/Modules/_ctypes/libffi/src/sh/ffi.c
+++ b/Modules/_ctypes/libffi/src/sh/ffi.c
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Kaz Kojima
+ ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima
Copyright (c) 2008 Red Hat, Inc.
SuperH Foreign Function Interface
@@ -463,7 +463,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
unsigned int *tramp;
unsigned int insn;
- FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
tramp = (unsigned int *) &closure->tramp[0];
/* Set T bit if the function returns a struct pointed with R2. */
diff --git a/Modules/_ctypes/libffi/src/sh/ffitarget.h b/Modules/_ctypes/libffi/src/sh/ffitarget.h
index 218ae3d..a36bf42 100644
--- a/Modules/_ctypes/libffi/src/sh/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/sh/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for SuperH.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- Generic type definitions ----------------------------------------- */
#ifndef LIBFFI_ASM
@@ -36,8 +41,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/sh64/ffi.c b/Modules/_ctypes/libffi/src/sh64/ffi.c
index 8fbc05c..123b87a 100644
--- a/Modules/_ctypes/libffi/src/sh64/ffi.c
+++ b/Modules/_ctypes/libffi/src/sh64/ffi.c
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 2003, 2004, 2006, 2007 Kaz Kojima
+ ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima
Copyright (c) 2008 Anthony Green
SuperH SHmedia Foreign Function Interface
@@ -302,7 +302,8 @@ ffi_prep_closure_loc (ffi_closure *closure,
{
unsigned int *tramp;
- FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
tramp = (unsigned int *) &closure->tramp[0];
/* Since ffi_closure is an aligned object, the ffi trampoline is
diff --git a/Modules/_ctypes/libffi/src/sh64/ffitarget.h b/Modules/_ctypes/libffi/src/sh64/ffitarget.h
index 4e922fc..08a6fe9 100644
--- a/Modules/_ctypes/libffi/src/sh64/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/sh64/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for SuperH - SHmedia.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- Generic type definitions ----------------------------------------- */
#ifndef LIBFFI_ASM
@@ -36,8 +41,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
- FFI_DEFAULT_ABI = FFI_SYSV,
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#define FFI_EXTRA_CIF_FIELDS long long flags2
diff --git a/Modules/_ctypes/libffi/src/sparc/ffi.c b/Modules/_ctypes/libffi/src/sparc/ffi.c
index 1d01f59..1ac5d46 100644
--- a/Modules/_ctypes/libffi/src/sparc/ffi.c
+++ b/Modules/_ctypes/libffi/src/sparc/ffi.c
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------------
- ffi.c - Copyright (c) 1996, 2003, 2004, 2007, 2008 Red Hat, Inc.
+ ffi.c - Copyright (c) 2011 Anthony Green
+ Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
SPARC Foreign Function Interface
@@ -406,8 +407,50 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
/* We don't yet support calling 32bit code from 64bit */
FFI_ASSERT(0);
#else
- ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
- cif->flags, rvalue, fn);
+ if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ || cif->flags == FFI_TYPE_LONGDOUBLE
+#endif
+ ))
+ {
+ /* For v8, we need an "unimp" with size of returning struct */
+ /* behind "call", so we alloc some executable space for it. */
+ /* l7 is used, we need to make sure v8.S doesn't use %l7. */
+ unsigned int *call_struct = NULL;
+ ffi_closure_alloc(32, &call_struct);
+ if (call_struct)
+ {
+ unsigned long f = (unsigned long)fn;
+ call_struct[0] = 0xae10001f; /* mov %i7, %l7 */
+ call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */
+ call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */
+ call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */
+ call_struct[4] = 0x01000000; /* nop */
+ if (cif->rtype->size < 0x7f)
+ call_struct[5] = cif->rtype->size; /* unimp */
+ else
+ call_struct[5] = 0x01000000; /* nop */
+ call_struct[6] = 0x81c7e008; /* ret */
+ call_struct[7] = 0xbe100017; /* mov %l7, %i7 */
+ asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
+ "r" (call_struct) : "memory");
+ /* SPARC v8 requires 5 instructions for flush to be visible */
+ asm volatile ("nop; nop; nop; nop; nop");
+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+ cif->flags, rvalue, call_struct);
+ ffi_closure_free(call_struct);
+ }
+ else
+ {
+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+ cif->flags, rvalue, fn);
+ }
+ }
+ else
+ {
+ ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+ cif->flags, rvalue, fn);
+ }
#endif
break;
case FFI_V9:
@@ -425,7 +468,6 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
FFI_ASSERT(0);
break;
}
-
}
@@ -447,7 +489,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
#ifdef SPARC64
/* Trampoline address is equal to the closure address. We take advantage
of that to reduce the trampoline size by 8 bytes. */
- FFI_ASSERT (cif->abi == FFI_V9);
+ if (cif->abi != FFI_V9)
+ return FFI_BAD_ABI;
fn = (unsigned long) ffi_closure_v9;
tramp[0] = 0x83414000; /* rd %pc, %g1 */
tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */
@@ -456,7 +499,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
*((unsigned long *) &tramp[4]) = fn;
#else
unsigned long ctx = (unsigned long) codeloc;
- FFI_ASSERT (cif->abi == FFI_V8);
+ if (cif->abi != FFI_V8)
+ return FFI_BAD_ABI;
fn = (unsigned long) ffi_closure_v8;
tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */
tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */
@@ -468,13 +512,13 @@ ffi_prep_closure_loc (ffi_closure* closure,
closure->fun = fun;
closure->user_data = user_data;
- /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */
+ /* Flush the Icache. closure is 8 bytes aligned. */
#ifdef SPARC64
- asm volatile ("flush %0" : : "r" (closure) : "memory");
- asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory");
+ asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory");
#else
- asm volatile ("iflush %0" : : "r" (closure) : "memory");
- asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory");
+ asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory");
+ /* SPARC v8 requires 5 instructions for flush to be visible */
+ asm volatile ("nop; nop; nop; nop; nop");
#endif
return FFI_OK;
diff --git a/Modules/_ctypes/libffi/src/sparc/ffitarget.h b/Modules/_ctypes/libffi/src/sparc/ffitarget.h
index 1a1a1ac..d89f787 100644
--- a/Modules/_ctypes/libffi/src/sparc/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/sparc/ffitarget.h
@@ -1,5 +1,6 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003 Red Hat, Inc.
Target configuration macros for SPARC.
Permission is hereby granted, free of charge, to any person obtaining
@@ -27,11 +28,17 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- System specific configurations ----------------------------------- */
#if defined(__arch64__) || defined(__sparcv9)
+#ifndef SPARC64
#define SPARC64
#endif
+#endif
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
@@ -42,12 +49,12 @@ typedef enum ffi_abi {
FFI_V8,
FFI_V8PLUS,
FFI_V9,
+ FFI_LAST_ABI,
#ifdef SPARC64
- FFI_DEFAULT_ABI = FFI_V9,
+ FFI_DEFAULT_ABI = FFI_V9
#else
- FFI_DEFAULT_ABI = FFI_V8,
+ FFI_DEFAULT_ABI = FFI_V8
#endif
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif
diff --git a/Modules/_ctypes/libffi/src/sparc/v9.S b/Modules/_ctypes/libffi/src/sparc/v9.S
index 489ff02..bf31a2b 100644
--- a/Modules/_ctypes/libffi/src/sparc/v9.S
+++ b/Modules/_ctypes/libffi/src/sparc/v9.S
@@ -32,7 +32,7 @@
/* Only compile this in for 64bit builds, because otherwise the object file
will have inproper architecture due to used instructions. */
-#define STACKFRAME 128 /* Minimum stack framesize for SPARC */
+#define STACKFRAME 176 /* Minimum stack framesize for SPARC 64-bit */
#define STACK_BIAS 2047
#define ARGS (128) /* Offset of register area in frame */
diff --git a/Modules/_ctypes/libffi/src/x86/ffi.c b/Modules/_ctypes/libffi/src/x86/ffi.c
index 8049653..611e221 100644
--- a/Modules/_ctypes/libffi/src/x86/ffi.c
+++ b/Modules/_ctypes/libffi/src/x86/ffi.c
@@ -3,7 +3,7 @@
Copyright (c) 2002 Ranjit Mathew
Copyright (c) 2002 Bo Thorsen
Copyright (c) 2002 Roger Sayle
- Copyright (C) 2008 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2010 Free Software Foundation, Inc.
x86 Foreign Function Interface
@@ -48,10 +48,18 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
register void **p_argv;
register char *argp;
register ffi_type **p_arg;
+#ifdef X86_WIN32
+ size_t p_stack_args[2];
+ void *p_stack_data[2];
+ char *argp2 = stack;
+ int stack_args_count = 0;
+ int cabi = ecif->cif->abi;
+#endif
argp = stack;
- if (ecif->cif->flags == FFI_TYPE_STRUCT
+ if ((ecif->cif->flags == FFI_TYPE_STRUCT
+ || ecif->cif->flags == FFI_TYPE_MS_STRUCT)
#ifdef X86_WIN64
&& (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2
&& ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8)
@@ -59,6 +67,16 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
)
{
*(void **) argp = ecif->rvalue;
+#ifdef X86_WIN32
+ /* For fastcall/thiscall this is first register-passed
+ argument. */
+ if (cabi == FFI_THISCALL || cabi == FFI_FASTCALL)
+ {
+ p_stack_args[stack_args_count] = sizeof (void*);
+ p_stack_data[stack_args_count] = argp;
+ ++stack_args_count;
+ }
+#endif
argp += sizeof(void*);
}
@@ -134,6 +152,24 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
{
memcpy(argp, *p_argv, z);
}
+
+#ifdef X86_WIN32
+ /* For thiscall/fastcall convention register-passed arguments
+ are the first two none-floating-point arguments with a size
+ smaller or equal to sizeof (void*). */
+ if ((cabi == FFI_THISCALL && stack_args_count < 1)
+ || (cabi == FFI_FASTCALL && stack_args_count < 2))
+ {
+ if (z <= 4
+ && ((*p_arg)->type != FFI_TYPE_FLOAT
+ && (*p_arg)->type != FFI_TYPE_STRUCT))
+ {
+ p_stack_args[stack_args_count] = z;
+ p_stack_data[stack_args_count] = argp;
+ ++stack_args_count;
+ }
+ }
+#endif
p_argv++;
#ifdef X86_WIN64
argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
@@ -141,7 +177,45 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
argp += z;
#endif
}
-
+
+#ifdef X86_WIN32
+ /* We need to move the register-passed arguments for thiscall/fastcall
+ on top of stack, so that those can be moved to registers ecx/edx by
+ call-handler. */
+ if (stack_args_count > 0)
+ {
+ size_t zz = (p_stack_args[0] + 3) & ~3;
+ char *h;
+
+ /* Move first argument to top-stack position. */
+ if (p_stack_data[0] != argp2)
+ {
+ h = alloca (zz + 1);
+ memcpy (h, p_stack_data[0], zz);
+ memmove (argp2 + zz, argp2,
+ (size_t) ((char *) p_stack_data[0] - (char*)argp2));
+ memcpy (argp2, h, zz);
+ }
+
+ argp2 += zz;
+ --stack_args_count;
+ if (zz > 4)
+ stack_args_count = 0;
+
+ /* If we have a second argument, then move it on top
+ after the first one. */
+ if (stack_args_count > 0 && p_stack_data[1] != argp2)
+ {
+ zz = p_stack_args[1];
+ zz = (zz + 3) & ~3;
+ h = alloca (zz + 1);
+ h = alloca (zz + 1);
+ memcpy (h, p_stack_data[1], zz);
+ memmove (argp2 + zz, argp2, (size_t) ((char*) p_stack_data[1] - (char*)argp2));
+ memcpy (argp2, h, zz);
+ }
+ }
+#endif
return;
}
@@ -155,12 +229,10 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
switch (cif->rtype->type)
{
case FFI_TYPE_VOID:
-#if defined(X86) || defined (X86_WIN32) || defined(X86_FREEBSD) || defined(X86_DARWIN) || defined(X86_WIN64)
case FFI_TYPE_UINT8:
case FFI_TYPE_UINT16:
case FFI_TYPE_SINT8:
case FFI_TYPE_SINT16:
-#endif
#ifdef X86_WIN64
case FFI_TYPE_UINT32:
case FFI_TYPE_SINT32:
@@ -208,8 +280,13 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
else
#endif
{
- cif->flags = FFI_TYPE_STRUCT;
- // allocate space for return value pointer
+#ifdef X86_WIN32
+ if (cif->abi == FFI_MS_CDECL)
+ cif->flags = FFI_TYPE_MS_STRUCT;
+ else
+#endif
+ cif->flags = FFI_TYPE_STRUCT;
+ /* allocate space for return value pointer */
cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
}
break;
@@ -234,7 +311,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
}
#ifdef X86_WIN64
- // ensure space for storing four registers
+ /* ensure space for storing four registers */
cif->bytes += 4 * sizeof(ffi_arg);
#endif
@@ -252,7 +329,7 @@ ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *,
#elif defined(X86_WIN32)
extern void
ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *,
- unsigned, unsigned, unsigned *, void (*fn)(void));
+ unsigned, unsigned, unsigned, unsigned *, void (*fn)(void));
#else
extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
unsigned, unsigned, unsigned *, void (*fn)(void));
@@ -278,7 +355,8 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
}
#else
if (rvalue == NULL
- && cif->flags == FFI_TYPE_STRUCT)
+ && (cif->flags == FFI_TYPE_STRUCT
+ || cif->flags == FFI_TYPE_MS_STRUCT))
{
ecif.rvalue = alloca(cif->rtype->size);
}
@@ -291,33 +369,44 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
#ifdef X86_WIN64
case FFI_WIN64:
- {
- // Make copies of all struct arguments
- // NOTE: not sure if responsibility should be here or in caller
- unsigned int i;
- for (i=0; i < cif->nargs;i++) {
- size_t size = cif->arg_types[i]->size;
- if ((cif->arg_types[i]->type == FFI_TYPE_STRUCT
- && (size != 1 && size != 2 && size != 4 && size != 8))
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- || cif->arg_types[i]->type == FFI_TYPE_LONGDOUBLE
-#endif
- )
- {
- void *local = alloca(size);
- memcpy(local, avalue[i], size);
- avalue[i] = local;
- }
- }
- ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
- cif->flags, ecif.rvalue, fn);
- }
+ ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
+ cif->flags, ecif.rvalue, fn);
break;
#elif defined(X86_WIN32)
case FFI_SYSV:
case FFI_STDCALL:
- ffi_call_win32(ffi_prep_args, &ecif, cif->bytes, cif->flags,
- ecif.rvalue, fn);
+ case FFI_MS_CDECL:
+ ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags,
+ ecif.rvalue, fn);
+ break;
+ case FFI_THISCALL:
+ case FFI_FASTCALL:
+ {
+ unsigned int abi = cif->abi;
+ unsigned int i, passed_regs = 0;
+
+ if (cif->flags == FFI_TYPE_STRUCT)
+ ++passed_regs;
+
+ for (i=0; i < cif->nargs && passed_regs < 2;i++)
+ {
+ size_t sz;
+
+ if (cif->arg_types[i]->type == FFI_TYPE_FLOAT
+ || cif->arg_types[i]->type == FFI_TYPE_STRUCT)
+ continue;
+ sz = (cif->arg_types[i]->size + 3) & ~3;
+ if (sz == 0 || sz > 4)
+ continue;
+ ++passed_regs;
+ }
+ if (passed_regs < 2 && abi == FFI_FASTCALL)
+ abi = FFI_THISCALL;
+ if (passed_regs < 1 && abi == FFI_THISCALL)
+ abi = FFI_STDCALL;
+ ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags,
+ ecif.rvalue, fn);
+ }
break;
#else
case FFI_SYSV:
@@ -345,8 +434,12 @@ unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
__attribute__ ((regparm(1)));
#ifdef X86_WIN32
+void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *)
+ __attribute__ ((regparm(1)));
void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
__attribute__ ((regparm(1)));
+void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *)
+ __attribute__ ((regparm(1)));
#endif
#ifdef X86_WIN64
void FFI_HIDDEN ffi_closure_win64 (ffi_closure *);
@@ -428,7 +521,8 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
argp += sizeof(void *);
}
#else
- if ( cif->flags == FFI_TYPE_STRUCT ) {
+ if ( cif->flags == FFI_TYPE_STRUCT
+ || cif->flags == FFI_TYPE_MS_STRUCT ) {
*rvalue = *(void **) argp;
argp += sizeof(void *);
}
@@ -506,6 +600,33 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \
}
+#define FFI_INIT_TRAMPOLINE_THISCALL(TRAMP,FUN,CTX,SIZE) \
+{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
+ unsigned int __fun = (unsigned int)(FUN); \
+ unsigned int __ctx = (unsigned int)(CTX); \
+ unsigned int __dis = __fun - (__ctx + 49); \
+ unsigned short __size = (unsigned short)(SIZE); \
+ *(unsigned int *) &__tramp[0] = 0x8324048b; /* mov (%esp), %eax */ \
+ *(unsigned int *) &__tramp[4] = 0x4c890cec; /* sub $12, %esp */ \
+ *(unsigned int *) &__tramp[8] = 0x04890424; /* mov %ecx, 4(%esp) */ \
+ *(unsigned char*) &__tramp[12] = 0x24; /* mov %eax, (%esp) */ \
+ *(unsigned char*) &__tramp[13] = 0xb8; \
+ *(unsigned int *) &__tramp[14] = __size; /* mov __size, %eax */ \
+ *(unsigned int *) &__tramp[18] = 0x08244c8d; /* lea 8(%esp), %ecx */ \
+ *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \
+ *(unsigned short*) &__tramp[26] = 0x0b74; /* jz 1f */ \
+ *(unsigned int *) &__tramp[28] = 0x8908518b; /* 2b: mov 8(%ecx), %edx */ \
+ *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %ecx */ \
+ *(unsigned char*) &__tramp[36] = 0x48; /* dec %eax */ \
+ *(unsigned short*) &__tramp[37] = 0xf575; /* jnz 2b ; 1f: */ \
+ *(unsigned char*) &__tramp[39] = 0xb8; \
+ *(unsigned int*) &__tramp[40] = __ctx; /* movl __ctx, %eax */ \
+ *(unsigned char *) &__tramp[44] = 0xe8; \
+ *(unsigned int*) &__tramp[45] = __dis; /* call __fun */ \
+ *(unsigned char*) &__tramp[49] = 0xc2; /* ret */ \
+ *(unsigned short*) &__tramp[50] = (__size + 8); /* ret (__size + 8) */ \
+ }
+
#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \
{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \
@@ -548,12 +669,25 @@ ffi_prep_closure_loc (ffi_closure* closure,
(void*)codeloc);
}
#ifdef X86_WIN32
+ else if (cif->abi == FFI_THISCALL)
+ {
+ FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0],
+ &ffi_closure_THISCALL,
+ (void*)codeloc,
+ cif->bytes);
+ }
else if (cif->abi == FFI_STDCALL)
{
FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
&ffi_closure_STDCALL,
(void*)codeloc, cif->bytes);
}
+ else if (cif->abi == FFI_MS_CDECL)
+ {
+ FFI_INIT_TRAMPOLINE (&closure->tramp[0],
+ &ffi_closure_SYSV,
+ (void*)codeloc);
+ }
#endif /* X86_WIN32 */
#endif /* !X86_WIN64 */
else
@@ -582,6 +716,9 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
int i;
if (cif->abi != FFI_SYSV) {
+#ifdef X86_WIN32
+ if (cif->abi != FFI_THISCALL)
+#endif
return FFI_BAD_ABI;
}
@@ -596,10 +733,20 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE);
}
-
+#ifdef X86_WIN32
+ if (cif->abi == FFI_SYSV)
+ {
+#endif
FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV,
codeloc);
-
+#ifdef X86_WIN32
+ }
+ else if (cif->abi == FFI_THISCALL)
+ {
+ FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL,
+ codeloc, cif->bytes);
+ }
+#endif
closure->cif = cif;
closure->user_data = user_data;
closure->fun = fun;
@@ -630,8 +777,9 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
/* If the return value is a struct and we don't have a return */
/* value address then we need to make one */
- if ((rvalue == NULL) &&
- (cif->rtype->type == FFI_TYPE_STRUCT))
+ if (rvalue == NULL
+ && (cif->flags == FFI_TYPE_STRUCT
+ || cif->flags == FFI_TYPE_MS_STRUCT))
{
ecif.rvalue = alloca(cif->rtype->size);
}
@@ -644,8 +792,38 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
#ifdef X86_WIN32
case FFI_SYSV:
case FFI_STDCALL:
- ffi_call_win32(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
- ecif.rvalue, fn);
+ case FFI_MS_CDECL:
+ ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags,
+ ecif.rvalue, fn);
+ break;
+ case FFI_THISCALL:
+ case FFI_FASTCALL:
+ {
+ unsigned int abi = cif->abi;
+ unsigned int i, passed_regs = 0;
+
+ if (cif->flags == FFI_TYPE_STRUCT)
+ ++passed_regs;
+
+ for (i=0; i < cif->nargs && passed_regs < 2;i++)
+ {
+ size_t sz;
+
+ if (cif->arg_types[i]->type == FFI_TYPE_FLOAT
+ || cif->arg_types[i]->type == FFI_TYPE_STRUCT)
+ continue;
+ sz = (cif->arg_types[i]->size + 3) & ~3;
+ if (sz == 0 || sz > 4)
+ continue;
+ ++passed_regs;
+ }
+ if (passed_regs < 2 && abi == FFI_FASTCALL)
+ cif->abi = abi = FFI_THISCALL;
+ if (passed_regs < 1 && abi == FFI_THISCALL)
+ cif->abi = abi = FFI_STDCALL;
+ ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags,
+ ecif.rvalue, fn);
+ }
break;
#else
case FFI_SYSV:
diff --git a/Modules/_ctypes/libffi/src/x86/ffi64.c b/Modules/_ctypes/libffi/src/x86/ffi64.c
index 07a2627..1daa1c0 100644
--- a/Modules/_ctypes/libffi/src/x86/ffi64.c
+++ b/Modules/_ctypes/libffi/src/x86/ffi64.c
@@ -1,7 +1,8 @@
/* -----------------------------------------------------------------------
- ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
- Copyright (c) 2008 Red Hat, Inc.
-
+ ffi64.c - Copyright (c) 20011 Anthony Green
+ Copyright (c) 2008, 2010 Red Hat, Inc.
+ Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
+
x86-64 Foreign Function Interface
Permission is hereby granted, free of charge, to any person obtaining
@@ -36,11 +37,17 @@
#define MAX_GPR_REGS 6
#define MAX_SSE_REGS 8
+#ifdef __INTEL_COMPILER
+#define UINT128 __m128
+#else
+#define UINT128 __int128_t
+#endif
+
struct register_args
{
/* Registers for argument passing. */
UINT64 gpr[MAX_GPR_REGS];
- __int128_t sse[MAX_SSE_REGS];
+ UINT128 sse[MAX_SSE_REGS];
};
extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
@@ -378,7 +385,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
if (align < 8)
align = 8;
- bytes = ALIGN(bytes, align);
+ bytes = ALIGN (bytes, align);
bytes += cif->arg_types[i]->size;
}
else
@@ -390,7 +397,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
if (ssecount)
flags |= 1 << 11;
cif->flags = flags;
- cif->bytes = bytes;
+ cif->bytes = ALIGN (bytes, 8);
return FFI_OK;
}
@@ -426,7 +433,7 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
/* If the return value is passed in memory, add the pointer as the
first integer argument. */
if (ret_in_memory)
- reg_args->gpr[gprcount++] = (long) rvalue;
+ reg_args->gpr[gprcount++] = (unsigned long) rvalue;
avn = cif->nargs;
arg_types = cif->arg_types;
@@ -498,12 +505,21 @@ ffi_prep_closure_loc (ffi_closure* closure,
{
volatile unsigned short *tramp;
+ /* Sanity check on the cif ABI. */
+ {
+ int abi = cif->abi;
+ if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)))
+ return FFI_BAD_ABI;
+ }
+
tramp = (volatile unsigned short *) &closure->tramp[0];
tramp[0] = 0xbb49; /* mov <code>, %r11 */
- *(void * volatile *) &tramp[1] = ffi_closure_unix64;
+ *((unsigned long long * volatile) &tramp[1])
+ = (unsigned long) ffi_closure_unix64;
tramp[5] = 0xba49; /* mov <data>, %r10 */
- *(void * volatile *) &tramp[6] = codeloc;
+ *((unsigned long long * volatile) &tramp[6])
+ = (unsigned long) codeloc;
/* Set the carry bit iff the function uses any sse registers.
This is clc or stc, together with the first byte of the jmp. */
@@ -542,7 +558,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
{
/* The return value goes in memory. Arrange for the closure
return value to go directly back to the original caller. */
- rvalue = (void *) reg_args->gpr[gprcount++];
+ rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++];
/* We don't have to do anything in asm for the return. */
ret = FFI_TYPE_VOID;
}
diff --git a/Modules/_ctypes/libffi/src/x86/ffitarget.h b/Modules/_ctypes/libffi/src/x86/ffitarget.h
index 89a8983..f442654 100644
--- a/Modules/_ctypes/libffi/src/x86/ffitarget.h
+++ b/Modules/_ctypes/libffi/src/x86/ffitarget.h
@@ -1,6 +1,7 @@
/* -----------------------------------------------------------------*-C-*-
- ffitarget.h - Copyright (c) 1996-2003, 2010 Red Hat, Inc.
- Copyright (C) 2008 Free Software Foundation, Inc.
+ ffitarget.h - Copyright (c) 2012 Anthony Green
+ Copyright (c) 1996-2003, 2010 Red Hat, Inc.
+ Copyright (C) 2008 Free Software Foundation, Inc.
Target configuration macros for x86 and x86-64.
@@ -29,8 +30,15 @@
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
+#ifndef LIBFFI_H
+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
+#endif
+
/* ---- System specific configurations ----------------------------------- */
+/* For code common to all platforms on x86 and x86_64. */
+#define X86_ANY
+
#if defined (X86_64) && defined (__i386__)
#undef X86_64
#define X86
@@ -38,7 +46,7 @@
#ifdef X86_WIN64
#define FFI_SIZEOF_ARG 8
-#define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64
+#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */
#endif
/* ---- Generic type definitions ----------------------------------------- */
@@ -53,9 +61,15 @@ typedef unsigned long long ffi_arg;
typedef long long ffi_sarg;
#endif
#else
+#if defined __x86_64__ && !defined __LP64__
+#define FFI_SIZEOF_ARG 8
+typedef unsigned long long ffi_arg;
+typedef long long ffi_sarg;
+#else
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
#endif
+#endif
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
@@ -64,28 +78,32 @@ typedef enum ffi_abi {
#ifdef X86_WIN32
FFI_SYSV,
FFI_STDCALL,
- /* TODO: Add fastcall support for the sake of completeness */
- FFI_DEFAULT_ABI = FFI_SYSV,
+ FFI_THISCALL,
+ FFI_FASTCALL,
+ FFI_MS_CDECL,
+ FFI_LAST_ABI,
+#ifdef _MSC_VER
+ FFI_DEFAULT_ABI = FFI_MS_CDECL
+#else
+ FFI_DEFAULT_ABI = FFI_SYSV
#endif
-#ifdef X86_WIN64
+#elif defined(X86_WIN64)
FFI_WIN64,
- FFI_DEFAULT_ABI = FFI_WIN64,
-#else
+ FFI_LAST_ABI,
+ FFI_DEFAULT_ABI = FFI_WIN64
+#else
/* ---- Intel x86 and AMD x86-64 - */
-#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__) || defined(__i386) || defined(__amd64))
FFI_SYSV,
FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */
+ FFI_LAST_ABI,
#if defined(__i386__) || defined(__i386)
- FFI_DEFAULT_ABI = FFI_SYSV,
+ FFI_DEFAULT_ABI = FFI_SYSV
#else
- FFI_DEFAULT_ABI = FFI_UNIX64,
+ FFI_DEFAULT_ABI = FFI_UNIX64
#endif
#endif
-#endif /* X86_WIN64 */
-
- FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif
@@ -95,13 +113,14 @@ typedef enum ffi_abi {
#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
+#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4)
#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
#define FFI_TRAMPOLINE_SIZE 24
#define FFI_NATIVE_RAW_API 0
#else
#ifdef X86_WIN32
-#define FFI_TRAMPOLINE_SIZE 13
+#define FFI_TRAMPOLINE_SIZE 52
#else
#ifdef X86_WIN64
#define FFI_TRAMPOLINE_SIZE 29
diff --git a/Modules/_ctypes/libffi/src/x86/sysv.S b/Modules/_ctypes/libffi/src/x86/sysv.S
index f4b6c1e..f108dd8 100644
--- a/Modules/_ctypes/libffi/src/x86/sysv.S
+++ b/Modules/_ctypes/libffi/src/x86/sysv.S
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008 Red Hat, Inc.
+ sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008, 2010 Red Hat, Inc.
X86 Foreign Function Interface
@@ -48,6 +48,9 @@ ffi_call_SYSV:
movl 16(%ebp),%ecx
subl %ecx,%esp
+ /* Align the stack pointer to 16-bytes */
+ andl $0xfffffff0, %esp
+
movl %esp,%eax
/* Place all of the ffi_prep_args in position */
@@ -325,23 +328,52 @@ ffi_closure_raw_SYSV:
.size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
#endif
+#if defined __PIC__
+# if defined __sun__ && defined __svr4__
+/* 32-bit Solaris 2/x86 uses datarel encoding for PIC. GNU ld before 2.22
+ doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this. */
+# define FDE_ENCODING 0x30 /* datarel */
+# define FDE_ENCODE(X) X@GOTOFF
+# else
+# define FDE_ENCODING 0x1b /* pcrel sdata4 */
+# if defined HAVE_AS_X86_PCREL
+# define FDE_ENCODE(X) X-.
+# else
+# define FDE_ENCODE(X) X@rel
+# endif
+# endif
+#else
+# define FDE_ENCODING 0 /* absolute */
+# define FDE_ENCODE(X) X
+#endif
+
.section .eh_frame,EH_FRAME_FLAGS,@progbits
.Lframe1:
.long .LECIE1-.LSCIE1 /* Length of Common Information Entry */
.LSCIE1:
.long 0x0 /* CIE Identifier Tag */
.byte 0x1 /* CIE Version */
+#ifdef HAVE_AS_ASCII_PSEUDO_OP
#ifdef __PIC__
.ascii "zR\0" /* CIE Augmentation */
#else
.ascii "\0" /* CIE Augmentation */
#endif
+#elif defined HAVE_AS_STRING_PSEUDO_OP
+#ifdef __PIC__
+ .string "zR" /* CIE Augmentation */
+#else
+ .string "" /* CIE Augmentation */
+#endif
+#else
+#error missing .ascii/.string
+#endif
.byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
.byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
.byte 0x8 /* CIE RA Column */
#ifdef __PIC__
.byte 0x1 /* .uleb128 0x1; Augmentation size */
- .byte 0x1b /* FDE Encoding (pcrel sdata4) */
+ .byte FDE_ENCODING
#endif
.byte 0xc /* DW_CFA_def_cfa */
.byte 0x4 /* .uleb128 0x4 */
@@ -354,14 +386,8 @@ ffi_closure_raw_SYSV:
.long .LEFDE1-.LASFDE1 /* FDE Length */
.LASFDE1:
.long .LASFDE1-.Lframe1 /* FDE CIE offset */
-#if defined __PIC__ && defined HAVE_AS_X86_PCREL
- .long .LFB1-. /* FDE initial location */
-#elif defined __PIC__
- .long .LFB1@rel
-#else
- .long .LFB1
-#endif
- .long .LFE1-.LFB1 /* FDE address range */
+ .long FDE_ENCODE(.LFB1) /* FDE initial location */
+ .long .LFE1-.LFB1 /* FDE address range */
#ifdef __PIC__
.byte 0x0 /* .uleb128 0x0; Augmentation size */
#endif
@@ -381,14 +407,8 @@ ffi_closure_raw_SYSV:
.long .LEFDE2-.LASFDE2 /* FDE Length */
.LASFDE2:
.long .LASFDE2-.Lframe1 /* FDE CIE offset */
-#if defined __PIC__ && defined HAVE_AS_X86_PCREL
- .long .LFB2-. /* FDE initial location */
-#elif defined __PIC__
- .long .LFB2@rel
-#else
- .long .LFB2
-#endif
- .long .LFE2-.LFB2 /* FDE address range */
+ .long FDE_ENCODE(.LFB2) /* FDE initial location */
+ .long .LFE2-.LFB2 /* FDE address range */
#ifdef __PIC__
.byte 0x0 /* .uleb128 0x0; Augmentation size */
#endif
@@ -417,14 +437,8 @@ ffi_closure_raw_SYSV:
.long .LEFDE3-.LASFDE3 /* FDE Length */
.LASFDE3:
.long .LASFDE3-.Lframe1 /* FDE CIE offset */
-#if defined __PIC__ && defined HAVE_AS_X86_PCREL
- .long .LFB3-. /* FDE initial location */
-#elif defined __PIC__
- .long .LFB3@rel
-#else
- .long .LFB3
-#endif
- .long .LFE3-.LFB3 /* FDE address range */
+ .long FDE_ENCODE(.LFB3) /* FDE initial location */
+ .long .LFE3-.LFB3 /* FDE address range */
#ifdef __PIC__
.byte 0x0 /* .uleb128 0x0; Augmentation size */
#endif
diff --git a/Modules/_ctypes/libffi/src/x86/unix64.S b/Modules/_ctypes/libffi/src/x86/unix64.S
index fe3f4fd..7a6619a 100644
--- a/Modules/_ctypes/libffi/src/x86/unix64.S
+++ b/Modules/_ctypes/libffi/src/x86/unix64.S
@@ -324,7 +324,11 @@ ffi_closure_unix64:
.LUW9:
.size ffi_closure_unix64,.-ffi_closure_unix64
+#ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
+ .section .eh_frame,"a",@unwind
+#else
.section .eh_frame,"a",@progbits
+#endif
.Lframe1:
.long .LECIE1-.LSCIE1 /* CIE Length */
.LSCIE1:
diff --git a/Modules/_ctypes/libffi/src/x86/win32.S b/Modules/_ctypes/libffi/src/x86/win32.S
index ac1ed6f..24b7bbd 100644
--- a/Modules/_ctypes/libffi/src/x86/win32.S
+++ b/Modules/_ctypes/libffi/src/x86/win32.S
@@ -45,6 +45,7 @@ _TEXT SEGMENT
ffi_call_win32 PROC NEAR,
ffi_prep_args : NEAR PTR DWORD,
ecif : NEAR PTR DWORD,
+ cif_abi : DWORD,
cif_bytes : DWORD,
cif_flags : DWORD,
rvalue : NEAR PTR DWORD,
@@ -64,6 +65,19 @@ ffi_call_win32 PROC NEAR,
;; Return stack to previous state and call the function
add esp, 8
+ ;; Handle thiscall and fastcall
+ cmp cif_abi, 3 ;; FFI_THISCALL
+ jz do_thiscall
+ cmp cif_abi, 4 ;; FFI_FASTCALL
+ jnz do_stdcall
+ mov ecx, DWORD PTR [esp]
+ mov edx, DWORD PTR [esp+4]
+ add esp, 8
+ jmp do_stdcall
+do_thiscall:
+ mov ecx, DWORD PTR [esp]
+ add esp, 4
+do_stdcall:
call fn
;; cdecl: we restore esp in the epilogue, so there's no need to
@@ -94,31 +108,37 @@ ca_jumpdata:
dd offset ca_retfloat ;; FFI_TYPE_FLOAT
dd offset ca_retdouble ;; FFI_TYPE_DOUBLE
dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE
- dd offset ca_retint8 ;; FFI_TYPE_UINT8
- dd offset ca_retint8 ;; FFI_TYPE_SINT8
- dd offset ca_retint16 ;; FFI_TYPE_UINT16
- dd offset ca_retint16 ;; FFI_TYPE_SINT16
+ dd offset ca_retuint8 ;; FFI_TYPE_UINT8
+ dd offset ca_retsint8 ;; FFI_TYPE_SINT8
+ dd offset ca_retuint16 ;; FFI_TYPE_UINT16
+ dd offset ca_retsint16 ;; FFI_TYPE_SINT16
dd offset ca_retint ;; FFI_TYPE_UINT32
dd offset ca_retint ;; FFI_TYPE_SINT32
dd offset ca_retint64 ;; FFI_TYPE_UINT64
dd offset ca_retint64 ;; FFI_TYPE_SINT64
dd offset ca_epilogue ;; FFI_TYPE_STRUCT
dd offset ca_retint ;; FFI_TYPE_POINTER
- dd offset ca_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
- dd offset ca_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
+ dd offset ca_retstruct1b ;; FFI_TYPE_SMALL_STRUCT_1B
+ dd offset ca_retstruct2b ;; FFI_TYPE_SMALL_STRUCT_2B
dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B
+ dd offset ca_epilogue ;; FFI_TYPE_MS_STRUCT
-ca_retint8:
- ;; Load %ecx with the pointer to storage for the return value
- mov ecx, rvalue
- mov [ecx + 0], al
- jmp ca_epilogue
+ /* Sign/zero extend as appropriate. */
+ca_retuint8:
+ movzx eax, al
+ jmp ca_retint
-ca_retint16:
- ;; Load %ecx with the pointer to storage for the return value
- mov ecx, rvalue
- mov [ecx + 0], ax
- jmp ca_epilogue
+ca_retsint8:
+ movsx eax, al
+ jmp ca_retint
+
+ca_retuint16:
+ movzx eax, ax
+ jmp ca_retint
+
+ca_retsint16:
+ movsx eax, ax
+ jmp ca_retint
ca_retint:
;; Load %ecx with the pointer to storage for the return value
@@ -151,11 +171,31 @@ ca_retlongdouble:
fstp TBYTE PTR [ecx]
jmp ca_epilogue
+ca_retstruct1b:
+ ;; Load %ecx with the pointer to storage for the return value
+ mov ecx, rvalue
+ mov [ecx + 0], al
+ jmp ca_epilogue
+
+ca_retstruct2b:
+ ;; Load %ecx with the pointer to storage for the return value
+ mov ecx, rvalue
+ mov [ecx + 0], ax
+ jmp ca_epilogue
+
ca_epilogue:
;; Epilogue code is autogenerated.
ret
ffi_call_win32 ENDP
+ffi_closure_THISCALL PROC NEAR FORCEFRAME
+ sub esp, 40
+ lea edx, [ebp -24]
+ mov [ebp - 12], edx /* resp */
+ lea edx, [ebp + 12] /* account for stub return address on stack */
+ jmp stub
+ffi_closure_THISCALL ENDP
+
ffi_closure_SYSV PROC NEAR FORCEFRAME
;; the ffi_closure ctx is passed in eax by the trampoline.
@@ -163,6 +203,7 @@ ffi_closure_SYSV PROC NEAR FORCEFRAME
lea edx, [ebp - 24]
mov [ebp - 12], edx ;; resp
lea edx, [ebp + 8]
+stub::
mov [esp + 8], edx ;; args
lea edx, [ebp - 12]
mov [esp + 4], edx ;; &resp
@@ -179,26 +220,35 @@ cs_jumpdata:
dd offset cs_retfloat ;; FFI_TYPE_FLOAT
dd offset cs_retdouble ;; FFI_TYPE_DOUBLE
dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE
- dd offset cs_retint8 ;; FFI_TYPE_UINT8
- dd offset cs_retint8 ;; FFI_TYPE_SINT8
- dd offset cs_retint16 ;; FFI_TYPE_UINT16
- dd offset cs_retint16 ;; FFI_TYPE_SINT16
+ dd offset cs_retuint8 ;; FFI_TYPE_UINT8
+ dd offset cs_retsint8 ;; FFI_TYPE_SINT8
+ dd offset cs_retuint16 ;; FFI_TYPE_UINT16
+ dd offset cs_retsint16 ;; FFI_TYPE_SINT16
dd offset cs_retint ;; FFI_TYPE_UINT32
dd offset cs_retint ;; FFI_TYPE_SINT32
dd offset cs_retint64 ;; FFI_TYPE_UINT64
dd offset cs_retint64 ;; FFI_TYPE_SINT64
dd offset cs_retstruct ;; FFI_TYPE_STRUCT
dd offset cs_retint ;; FFI_TYPE_POINTER
- dd offset cs_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
- dd offset cs_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
+ dd offset cs_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
+ dd offset cs_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B
+ dd offset cs_retmsstruct ;; FFI_TYPE_MS_STRUCT
+
+cs_retuint8:
+ movzx eax, BYTE PTR [ecx]
+ jmp cs_epilogue
-cs_retint8:
- mov al, [ecx]
+cs_retsint8:
+ movsx eax, BYTE PTR [ecx]
jmp cs_epilogue
-cs_retint16:
- mov ax, [ecx]
+cs_retuint16:
+ movzx eax, WORD PTR [ecx]
+ jmp cs_epilogue
+
+cs_retsint16:
+ movsx eax, WORD PTR [ecx]
jmp cs_epilogue
cs_retint:
@@ -227,6 +277,12 @@ cs_retstruct:
;; Epilogue code is autogenerated.
ret 4
+cs_retmsstruct:
+ ;; Caller expects us to return a pointer to the real return value.
+ mov eax, ecx
+ ;; Caller doesn't expects us to pop struct return value pointer hidden arg.
+ jmp cs_epilogue
+
cs_epilogue:
;; Epilogue code is autogenerated.
ret
@@ -239,7 +295,16 @@ ffi_closure_SYSV ENDP
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
#define CIF_FLAGS_OFFSET 20
-ffi_closure_raw_SYSV PROC NEAR USES esi
+ffi_closure_raw_THISCALL PROC NEAR USES esi FORCEFRAME
+ sub esp, 36
+ mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif
+ mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
+ mov [esp + 12], edx
+ lea edx, [ebp + 12]
+ jmp stubraw
+ffi_closure_raw_THISCALL ENDP
+
+ffi_closure_raw_SYSV PROC NEAR USES esi FORCEFRAME
;; the ffi_closure ctx is passed in eax by the trampoline.
sub esp, 40
@@ -247,6 +312,7 @@ ffi_closure_raw_SYSV PROC NEAR USES esi
mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
mov [esp + 12], edx ;; user_data
lea edx, [ebp + 8]
+stubraw::
mov [esp + 8], edx ;; raw_args
lea edx, [ebp - 24]
mov [esp + 4], edx ;; &res
@@ -264,26 +330,35 @@ cr_jumpdata:
dd offset cr_retfloat ;; FFI_TYPE_FLOAT
dd offset cr_retdouble ;; FFI_TYPE_DOUBLE
dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE
- dd offset cr_retint8 ;; FFI_TYPE_UINT8
- dd offset cr_retint8 ;; FFI_TYPE_SINT8
- dd offset cr_retint16 ;; FFI_TYPE_UINT16
- dd offset cr_retint16 ;; FFI_TYPE_SINT16
+ dd offset cr_retuint8 ;; FFI_TYPE_UINT8
+ dd offset cr_retsint8 ;; FFI_TYPE_SINT8
+ dd offset cr_retuint16 ;; FFI_TYPE_UINT16
+ dd offset cr_retsint16 ;; FFI_TYPE_SINT16
dd offset cr_retint ;; FFI_TYPE_UINT32
dd offset cr_retint ;; FFI_TYPE_SINT32
dd offset cr_retint64 ;; FFI_TYPE_UINT64
dd offset cr_retint64 ;; FFI_TYPE_SINT64
dd offset cr_epilogue ;; FFI_TYPE_STRUCT
dd offset cr_retint ;; FFI_TYPE_POINTER
- dd offset cr_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
- dd offset cr_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
+ dd offset cr_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
+ dd offset cr_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B
+ dd offset cr_epilogue ;; FFI_TYPE_MS_STRUCT
+
+cr_retuint8:
+ movzx eax, BYTE PTR [ecx]
+ jmp cr_epilogue
+
+cr_retsint8:
+ movsx eax, BYTE PTR [ecx]
+ jmp cr_epilogue
-cr_retint8:
- mov al, [ecx]
+cr_retuint16:
+ movzx eax, WORD PTR [ecx]
jmp cr_epilogue
-cr_retint16:
- mov ax, [ecx]
+cr_retsint16:
+ movsx eax, WORD PTR [ecx]
jmp cr_epilogue
cr_retint:
@@ -337,26 +412,34 @@ cd_jumpdata:
dd offset cd_retfloat ;; FFI_TYPE_FLOAT
dd offset cd_retdouble ;; FFI_TYPE_DOUBLE
dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE
- dd offset cd_retint8 ;; FFI_TYPE_UINT8
- dd offset cd_retint8 ;; FFI_TYPE_SINT8
- dd offset cd_retint16 ;; FFI_TYPE_UINT16
- dd offset cd_retint16 ;; FFI_TYPE_SINT16
+ dd offset cd_retuint8 ;; FFI_TYPE_UINT8
+ dd offset cd_retsint8 ;; FFI_TYPE_SINT8
+ dd offset cd_retuint16 ;; FFI_TYPE_UINT16
+ dd offset cd_retsint16 ;; FFI_TYPE_SINT16
dd offset cd_retint ;; FFI_TYPE_UINT32
dd offset cd_retint ;; FFI_TYPE_SINT32
dd offset cd_retint64 ;; FFI_TYPE_UINT64
dd offset cd_retint64 ;; FFI_TYPE_SINT64
dd offset cd_epilogue ;; FFI_TYPE_STRUCT
dd offset cd_retint ;; FFI_TYPE_POINTER
- dd offset cd_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
- dd offset cd_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
+ dd offset cd_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
+ dd offset cd_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B
-cd_retint8:
- mov al, [ecx]
+cd_retuint8:
+ movzx eax, BYTE PTR [ecx]
+ jmp cd_epilogue
+
+cd_retsint8:
+ movsx eax, BYTE PTR [ecx]
+ jmp cd_epilogue
+
+cd_retuint16:
+ movzx eax, WORD PTR [ecx]
jmp cd_epilogue
-cd_retint16:
- mov ax, [ecx]
+cd_retsint16:
+ movsx eax, WORD PTR [ecx]
jmp cd_epilogue
cd_retint:
@@ -395,7 +478,9 @@ END
# This assumes we are using gas.
.balign 16
.globl _ffi_call_win32
+#ifndef __OS2__
.def _ffi_call_win32; .scl 2; .type 32; .endef
+#endif
_ffi_call_win32:
.LFB1:
pushl %ebp
@@ -403,7 +488,7 @@ _ffi_call_win32:
movl %esp,%ebp
.LCFI1:
# Make room for all of the new args.
- movl 16(%ebp),%ecx
+ movl 20(%ebp),%ecx
subl %ecx,%esp
movl %esp,%eax
@@ -415,19 +500,34 @@ _ffi_call_win32:
# Return stack to previous state and call the function
addl $8,%esp
-
+
+ # Handle fastcall and thiscall
+ cmpl $3, 16(%ebp) # FFI_THISCALL
+ jz .do_thiscall
+ cmpl $4, 16(%ebp) # FFI_FASTCALL
+ jnz .do_fncall
+ movl (%esp), %ecx
+ movl 4(%esp), %edx
+ addl $8, %esp
+ jmp .do_fncall
+.do_thiscall:
+ movl (%esp), %ecx
+ addl $4, %esp
+
+.do_fncall:
+
# FIXME: Align the stack to a 128-bit boundary to avoid
# potential performance hits.
- call *28(%ebp)
+ call *32(%ebp)
# stdcall functions pop arguments off the stack themselves
# Load %ecx with the return type code
- movl 20(%ebp),%ecx
+ movl 24(%ebp),%ecx
# If the return value pointer is NULL, assume no return value.
- cmpl $0,24(%ebp)
+ cmpl $0,28(%ebp)
jne 0f
# Even if there is no space for the return value, we are
@@ -460,6 +560,7 @@ _ffi_call_win32:
.long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
.long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
.long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
+ .long .Lretstruct /* FFI_TYPE_MS_STRUCT */
1:
add %ecx, %ecx
add %ecx, %ecx
@@ -486,50 +587,50 @@ _ffi_call_win32:
.Lretint:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
movl %eax,0(%ecx)
jmp .Lepilogue
.Lretfloat:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
fstps (%ecx)
jmp .Lepilogue
.Lretdouble:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
fstpl (%ecx)
jmp .Lepilogue
.Lretlongdouble:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
fstpt (%ecx)
jmp .Lepilogue
.Lretint64:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
movl %eax,0(%ecx)
movl %edx,4(%ecx)
jmp .Lepilogue
.Lretstruct1b:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
movb %al,0(%ecx)
jmp .Lepilogue
.Lretstruct2b:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
movw %ax,0(%ecx)
jmp .Lepilogue
.Lretstruct4b:
# Load %ecx with the pointer to storage for the return value
- movl 24(%ebp),%ecx
+ movl 28(%ebp),%ecx
movl %eax,0(%ecx)
jmp .Lepilogue
@@ -542,12 +643,27 @@ _ffi_call_win32:
popl %ebp
ret
.ffi_call_win32_end:
+ .balign 16
+ .globl _ffi_closure_THISCALL
+#ifndef __OS2__
+ .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef
+#endif
+_ffi_closure_THISCALL:
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp
+ leal -24(%ebp), %edx
+ movl %edx, -12(%ebp) /* resp */
+ leal 12(%ebp), %edx /* account for stub return address on stack */
+ jmp .stub
.LFE1:
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_SYSV
+#ifndef __OS2__
.def _ffi_closure_SYSV; .scl 2; .type 32; .endef
+#endif
_ffi_closure_SYSV:
.LFB3:
pushl %ebp
@@ -558,6 +674,7 @@ _ffi_closure_SYSV:
leal -24(%ebp), %edx
movl %edx, -12(%ebp) /* resp */
leal 8(%ebp), %edx
+.stub:
movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
leal -12(%ebp), %edx
movl %edx, (%esp) /* &resp */
@@ -586,6 +703,7 @@ _ffi_closure_SYSV:
.long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
.long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
.long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
+ .long .Lcls_retmsstruct /* FFI_TYPE_MS_STRUCT */
1:
add %eax, %eax
@@ -650,6 +768,12 @@ _ffi_closure_SYSV:
popl %ebp
ret $0x4
+.Lcls_retmsstruct:
+ # Caller expects us to return a pointer to the real return value.
+ mov %ecx, %eax
+ # Caller doesn't expects us to pop struct return value pointer hidden arg.
+ jmp .Lcls_epilogue
+
.Lcls_noretval:
.Lcls_epilogue:
movl %ebp, %esp
@@ -664,11 +788,27 @@ _ffi_closure_SYSV:
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
#define CIF_FLAGS_OFFSET 20
-
+ .balign 16
+ .globl _ffi_closure_raw_THISCALL
+#ifndef __OS2__
+ .def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef
+#endif
+_ffi_closure_raw_THISCALL:
+ pushl %ebp
+ movl %esp, %ebp
+ pushl %esi
+ subl $36, %esp
+ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
+ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
+ movl %edx, 12(%esp) /* user_data */
+ leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */
+ jmp .stubraw
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_raw_SYSV
+#ifndef __OS2__
.def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
+#endif
_ffi_closure_raw_SYSV:
.LFB4:
pushl %ebp
@@ -682,6 +822,7 @@ _ffi_closure_raw_SYSV:
movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
movl %edx, 12(%esp) /* user_data */
leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
+.stubraw:
movl %edx, 8(%esp) /* raw_args */
leal -24(%ebp), %edx
movl %edx, 4(%esp) /* &res */
@@ -710,6 +851,7 @@ _ffi_closure_raw_SYSV:
.long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
.long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
.long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
+ .long .Lrcls_retstruct /* FFI_TYPE_MS_STRUCT */
1:
add %eax, %eax
add %eax, %eax
@@ -784,7 +926,9 @@ _ffi_closure_raw_SYSV:
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_STDCALL
+#ifndef __OS2__
.def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
+#endif
_ffi_closure_STDCALL:
.LFB5:
pushl %ebp
@@ -890,7 +1034,9 @@ _ffi_closure_STDCALL:
.ffi_closure_STDCALL_end:
.LFE5:
+#ifndef __OS2__
.section .eh_frame,"w"
+#endif
.Lframe1:
.LSCIE1:
.long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
diff --git a/Modules/_ctypes/libffi/src/x86/win64.S b/Modules/_ctypes/libffi/src/x86/win64.S
index 6e91818..fcdb270 100644
--- a/Modules/_ctypes/libffi/src/x86/win64.S
+++ b/Modules/_ctypes/libffi/src/x86/win64.S
@@ -232,10 +232,18 @@ ret_void$:
ffi_call_win64 ENDP
_TEXT ENDS
END
-#else
+
+#else
+
+#ifdef SYMBOL_UNDERSCORE
+#define SYMBOL_NAME(name) _##name
+#else
+#define SYMBOL_NAME(name) name
+#endif
+
.text
-.extern _ffi_closure_win64_inner
+.extern SYMBOL_NAME(ffi_closure_win64_inner)
# ffi_closure_win64 will be called with these registers set:
# rax points to 'closure'
@@ -246,8 +254,8 @@ END
# call ffi_closure_win64_inner for the actual work, then return the result.
#
.balign 16
- .globl _ffi_closure_win64
-_ffi_closure_win64:
+ .globl SYMBOL_NAME(ffi_closure_win64)
+SYMBOL_NAME(ffi_closure_win64):
# copy register arguments onto stack
test $1,%r11
jne .Lfirst_is_float
@@ -287,7 +295,7 @@ _ffi_closure_win64:
mov %rax, %rcx # context is first parameter
mov %rsp, %rdx # stack is second parameter
add $48, %rdx # point to start of arguments
- mov $_ffi_closure_win64_inner, %rax
+ mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax
callq *%rax # call the real closure function
add $40, %rsp
movq %rax, %xmm0 # If the closure returned a float,
@@ -296,8 +304,8 @@ _ffi_closure_win64:
.ffi_closure_win64_end:
.balign 16
- .globl _ffi_call_win64
-_ffi_call_win64:
+ .globl SYMBOL_NAME(ffi_call_win64)
+SYMBOL_NAME(ffi_call_win64):
# copy registers onto stack
mov %r9,32(%rsp)
mov %r8,24(%rsp)
diff --git a/Modules/_ctypes/libffi/testsuite/Makefile.am b/Modules/_ctypes/libffi/testsuite/Makefile.am
index eae3d74..146fdf9 100644
--- a/Modules/_ctypes/libffi/testsuite/Makefile.am
+++ b/Modules/_ctypes/libffi/testsuite/Makefile.am
@@ -15,66 +15,71 @@ AM_RUNTESTFLAGS =
CLEANFILES = *.exe core* *.log *.sum
-EXTRA_DIST = libffi.special/special.exp \
-libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \
-libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \
-lib/libffi-dg.exp lib/wrapper.exp libffi.call/float.c \
-libffi.call/cls_multi_schar.c libffi.call/float3.c \
-libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \
-libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \
-libffi.call/promotion.c libffi.call/cls_dbls_struct.c \
-libffi.call/nested_struct.c libffi.call/closure_fn1.c \
-libffi.call/cls_4_1byte.c libffi.call/cls_float.c \
-libffi.call/cls_2byte.c libffi.call/closure_fn4.c \
-libffi.call/return_fl2.c libffi.call/nested_struct7.c \
-libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \
-libffi.call/float1.c libffi.call/cls_19byte.c \
-libffi.call/nested_struct1.c libffi.call/cls_4byte.c \
-libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \
-libffi.call/nested_struct4.c libffi.call/nested_struct3.c \
-libffi.call/struct7.c libffi.call/nested_struct9.c \
-libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \
-libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \
-libffi.call/testclosure.c libffi.call/cls_3byte1.c \
-libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \
-libffi.call/cls_ushort.c libffi.call/stret_medium2.c \
-libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \
-libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \
-libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \
-libffi.call/return_ll.c libffi.call/cls_pointer.c \
-libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \
-libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \
-libffi.call/return_sl.c libffi.call/cls_1_1byte.c \
-libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \
-libffi.call/cls_double.c libffi.call/many_win32.c \
-libffi.call/cls_16byte.c libffi.call/cls_align_double.c \
-libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \
-libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \
-libffi.call/closure_stdcall.c libffi.call/return_fl.c \
-libffi.call/strlen_win32.c libffi.call/return_ldl.c \
-libffi.call/cls_align_float.c libffi.call/struct3.c \
-libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \
-libffi.call/cls_align_longdouble_split.c \
-libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \
-libffi.call/stret_large.c libffi.call/cls_align_sint16.c \
-libffi.call/nested_struct6.c libffi.call/cls_5byte.c \
-libffi.call/return_dbl.c libffi.call/cls_20byte.c \
-libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \
-libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \
-libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \
-libffi.call/cls_18byte.c libffi.call/closure_fn3.c \
-libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \
-libffi.call/struct2.c libffi.call/cls_3byte2.c \
-libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \
-libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \
-libffi.call/problem1.c libffi.call/float4.c \
-libffi.call/cls_align_uint64.c libffi.call/struct9.c \
-libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \
-libffi.call/closure_fn0.c libffi.call/closure_fn6.c \
-libffi.call/struct4.c libffi.call/nested_struct2.c \
-libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \
-libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \
-libffi.call/cls_12byte.c libffi.call/cls_double_va.c \
-libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \
+EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \
+libffi.call/cls_align_longdouble_split.c libffi.call/closure_loc_fn0.c \
+libffi.call/cls_schar.c libffi.call/closure_fn1.c \
+libffi.call/many2_win32.c libffi.call/return_ul.c \
+libffi.call/cls_align_double.c libffi.call/return_fl2.c \
+libffi.call/cls_1_1byte.c libffi.call/cls_64byte.c \
+libffi.call/nested_struct7.c libffi.call/cls_align_sint32.c \
+libffi.call/nested_struct2.c libffi.call/ffitest.h \
+libffi.call/nested_struct4.c libffi.call/cls_multi_ushort.c \
+libffi.call/struct3.c libffi.call/cls_3byte1.c \
+libffi.call/cls_16byte.c libffi.call/struct8.c \
+libffi.call/nested_struct8.c libffi.call/cls_multi_sshort.c \
+libffi.call/cls_3byte2.c libffi.call/fastthis2_win32.c \
+libffi.call/cls_pointer.c libffi.call/err_bad_typedef.c \
+libffi.call/cls_4_1byte.c libffi.call/cls_9byte2.c \
+libffi.call/cls_multi_schar.c libffi.call/stret_medium2.c \
+libffi.call/cls_5_1_byte.c libffi.call/call.exp \
+libffi.call/cls_double.c libffi.call/cls_align_sint16.c \
+libffi.call/cls_uint.c libffi.call/return_ll1.c \
+libffi.call/nested_struct3.c libffi.call/cls_20byte1.c \
+libffi.call/closure_fn4.c libffi.call/cls_uchar.c \
+libffi.call/struct2.c libffi.call/cls_7byte.c libffi.call/strlen.c \
+libffi.call/many.c libffi.call/testclosure.c libffi.call/return_fl.c \
+libffi.call/struct5.c libffi.call/cls_12byte.c \
+libffi.call/cls_multi_sshortchar.c \
+libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \
+libffi.call/return_fl3.c libffi.call/stret_medium.c \
+libffi.call/nested_struct6.c libffi.call/a.out \
+libffi.call/closure_fn3.c libffi.call/float3.c libffi.call/many2.c \
+libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \
+libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \
+libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \
+libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \
+libffi.call/cls_sshort.c libffi.call/many_win32.c \
+libffi.call/nested_struct.c libffi.call/cls_20byte.c \
+libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \
+libffi.call/return_uc.c libffi.call/closure_thiscall.c \
+libffi.call/cls_18byte.c libffi.call/cls_8byte.c \
+libffi.call/promotion.c libffi.call/struct1_win32.c \
+libffi.call/return_dbl.c libffi.call/cls_24byte.c \
+libffi.call/struct4.c libffi.call/cls_6byte.c \
+libffi.call/cls_align_uint32.c libffi.call/float.c \
+libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \
+libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \
+libffi.call/cls_align_float.c libffi.call/return_fl1.c \
libffi.call/nested_struct10.c libffi.call/nested_struct5.c \
-libffi.call/huge_struct.c
+libffi.call/fastthis1_win32.c libffi.call/cls_align_sint64.c \
+libffi.call/stret_large2.c libffi.call/return_sl.c \
+libffi.call/closure_fn0.c libffi.call/cls_5byte.c \
+libffi.call/cls_2byte.c libffi.call/float2.c \
+libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \
+libffi.call/stret_large.c libffi.call/cls_ulonglong.c \
+libffi.call/cls_ushort.c libffi.call/nested_struct1.c \
+libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \
+libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \
+libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \
+libffi.call/struct1.c libffi.call/nested_struct9.c \
+libffi.call/huge_struct.c libffi.call/problem1.c libffi.call/float4.c \
+libffi.call/fastthis3_win32.c libffi.call/return_ldl.c \
+libffi.call/strlen2_win32.c libffi.call/closure_fn5.c \
+libffi.call/struct2_win32.c libffi.call/struct6.c \
+libffi.call/return_ll.c libffi.call/struct9.c libffi.call/return_sc.c \
+libffi.call/struct7.c libffi.call/cls_align_uint64.c \
+libffi.call/cls_4byte.c libffi.call/strlen_win32.c \
+libffi.call/cls_6_1_byte.c libffi.call/cls_7_1_byte.c \
+libffi.special/unwindtest.cc libffi.special/special.exp \
+libffi.special/unwindtest_ffi_call.cc libffi.special/ffitestcxx.h \
+lib/wrapper.exp lib/target-libpath.exp lib/libffi.exp
diff --git a/Modules/_ctypes/libffi/testsuite/Makefile.in b/Modules/_ctypes/libffi/testsuite/Makefile.in
index 698c461..4cf40ca 100644
--- a/Modules/_ctypes/libffi/testsuite/Makefile.in
+++ b/Modules/_ctypes/libffi/testsuite/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11 from Makefile.am.
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -53,6 +53,7 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALLOCA = @ALLOCA@
AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
AM_RUNTESTFLAGS =
AR = @AR@
AUTOCONF = @AUTOCONF@
@@ -70,6 +71,7 @@ CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
@@ -77,6 +79,7 @@ ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
FGREP = @FGREP@
GREP = @GREP@
HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
@@ -95,6 +98,7 @@ LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
@@ -107,6 +111,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
@@ -121,6 +126,7 @@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
@@ -153,7 +159,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@@ -187,69 +192,74 @@ RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
else echo runtest; fi`
CLEANFILES = *.exe core* *.log *.sum
-EXTRA_DIST = libffi.special/special.exp \
-libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \
-libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \
-lib/libffi-dg.exp lib/wrapper.exp libffi.call/float.c \
-libffi.call/cls_multi_schar.c libffi.call/float3.c \
-libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \
-libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \
-libffi.call/promotion.c libffi.call/cls_dbls_struct.c \
-libffi.call/nested_struct.c libffi.call/closure_fn1.c \
-libffi.call/cls_4_1byte.c libffi.call/cls_float.c \
-libffi.call/cls_2byte.c libffi.call/closure_fn4.c \
-libffi.call/return_fl2.c libffi.call/nested_struct7.c \
-libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \
-libffi.call/float1.c libffi.call/cls_19byte.c \
-libffi.call/nested_struct1.c libffi.call/cls_4byte.c \
-libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \
-libffi.call/nested_struct4.c libffi.call/nested_struct3.c \
-libffi.call/struct7.c libffi.call/nested_struct9.c \
-libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \
-libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \
-libffi.call/testclosure.c libffi.call/cls_3byte1.c \
-libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \
-libffi.call/cls_ushort.c libffi.call/stret_medium2.c \
-libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \
-libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \
-libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c \
-libffi.call/return_ll.c libffi.call/cls_pointer.c \
-libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \
-libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c \
-libffi.call/return_sl.c libffi.call/cls_1_1byte.c \
-libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \
-libffi.call/cls_double.c libffi.call/many_win32.c \
-libffi.call/cls_16byte.c libffi.call/cls_align_double.c \
-libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c \
-libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \
-libffi.call/closure_stdcall.c libffi.call/return_fl.c \
-libffi.call/strlen_win32.c libffi.call/return_ldl.c \
-libffi.call/cls_align_float.c libffi.call/struct3.c \
-libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \
-libffi.call/cls_align_longdouble_split.c \
-libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \
-libffi.call/stret_large.c libffi.call/cls_align_sint16.c \
-libffi.call/nested_struct6.c libffi.call/cls_5byte.c \
-libffi.call/return_dbl.c libffi.call/cls_20byte.c \
-libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c \
-libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \
-libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \
-libffi.call/cls_18byte.c libffi.call/closure_fn3.c \
-libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c \
-libffi.call/struct2.c libffi.call/cls_3byte2.c \
-libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \
-libffi.call/return_fl3.c libffi.call/cls_align_uint32.c \
-libffi.call/problem1.c libffi.call/float4.c \
-libffi.call/cls_align_uint64.c libffi.call/struct9.c \
-libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \
-libffi.call/closure_fn0.c libffi.call/closure_fn6.c \
-libffi.call/struct4.c libffi.call/nested_struct2.c \
-libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \
-libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \
-libffi.call/cls_12byte.c libffi.call/cls_double_va.c \
-libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \
+EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \
+libffi.call/cls_align_longdouble_split.c libffi.call/closure_loc_fn0.c \
+libffi.call/cls_schar.c libffi.call/closure_fn1.c \
+libffi.call/many2_win32.c libffi.call/return_ul.c \
+libffi.call/cls_align_double.c libffi.call/return_fl2.c \
+libffi.call/cls_1_1byte.c libffi.call/cls_64byte.c \
+libffi.call/nested_struct7.c libffi.call/cls_align_sint32.c \
+libffi.call/nested_struct2.c libffi.call/ffitest.h \
+libffi.call/nested_struct4.c libffi.call/cls_multi_ushort.c \
+libffi.call/struct3.c libffi.call/cls_3byte1.c \
+libffi.call/cls_16byte.c libffi.call/struct8.c \
+libffi.call/nested_struct8.c libffi.call/cls_multi_sshort.c \
+libffi.call/cls_3byte2.c libffi.call/fastthis2_win32.c \
+libffi.call/cls_pointer.c libffi.call/err_bad_typedef.c \
+libffi.call/cls_4_1byte.c libffi.call/cls_9byte2.c \
+libffi.call/cls_multi_schar.c libffi.call/stret_medium2.c \
+libffi.call/cls_5_1_byte.c libffi.call/call.exp \
+libffi.call/cls_double.c libffi.call/cls_align_sint16.c \
+libffi.call/cls_uint.c libffi.call/return_ll1.c \
+libffi.call/nested_struct3.c libffi.call/cls_20byte1.c \
+libffi.call/closure_fn4.c libffi.call/cls_uchar.c \
+libffi.call/struct2.c libffi.call/cls_7byte.c libffi.call/strlen.c \
+libffi.call/many.c libffi.call/testclosure.c libffi.call/return_fl.c \
+libffi.call/struct5.c libffi.call/cls_12byte.c \
+libffi.call/cls_multi_sshortchar.c \
+libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \
+libffi.call/return_fl3.c libffi.call/stret_medium.c \
+libffi.call/nested_struct6.c libffi.call/a.out \
+libffi.call/closure_fn3.c libffi.call/float3.c libffi.call/many2.c \
+libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \
+libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \
+libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \
+libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \
+libffi.call/cls_sshort.c libffi.call/many_win32.c \
+libffi.call/nested_struct.c libffi.call/cls_20byte.c \
+libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \
+libffi.call/return_uc.c libffi.call/closure_thiscall.c \
+libffi.call/cls_18byte.c libffi.call/cls_8byte.c \
+libffi.call/promotion.c libffi.call/struct1_win32.c \
+libffi.call/return_dbl.c libffi.call/cls_24byte.c \
+libffi.call/struct4.c libffi.call/cls_6byte.c \
+libffi.call/cls_align_uint32.c libffi.call/float.c \
+libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \
+libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \
+libffi.call/cls_align_float.c libffi.call/return_fl1.c \
libffi.call/nested_struct10.c libffi.call/nested_struct5.c \
-libffi.call/huge_struct.c
+libffi.call/fastthis1_win32.c libffi.call/cls_align_sint64.c \
+libffi.call/stret_large2.c libffi.call/return_sl.c \
+libffi.call/closure_fn0.c libffi.call/cls_5byte.c \
+libffi.call/cls_2byte.c libffi.call/float2.c \
+libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \
+libffi.call/stret_large.c libffi.call/cls_ulonglong.c \
+libffi.call/cls_ushort.c libffi.call/nested_struct1.c \
+libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \
+libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \
+libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \
+libffi.call/struct1.c libffi.call/nested_struct9.c \
+libffi.call/huge_struct.c libffi.call/problem1.c libffi.call/float4.c \
+libffi.call/fastthis3_win32.c libffi.call/return_ldl.c \
+libffi.call/strlen2_win32.c libffi.call/closure_fn5.c \
+libffi.call/struct2_win32.c libffi.call/struct6.c \
+libffi.call/return_ll.c libffi.call/struct9.c libffi.call/return_sc.c \
+libffi.call/struct7.c libffi.call/cls_align_uint64.c \
+libffi.call/cls_4byte.c libffi.call/strlen_win32.c \
+libffi.call/cls_6_1_byte.c libffi.call/cls_7_1_byte.c \
+libffi.special/unwindtest.cc libffi.special/special.exp \
+libffi.special/unwindtest_ffi_call.cc libffi.special/ffitestcxx.h \
+lib/wrapper.exp lib/target-libpath.exp lib/libffi.exp
all: all-am
@@ -298,7 +308,7 @@ CTAGS:
check-DEJAGNU: site.exp
- srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
+ srcdir='$(srcdir)'; export srcdir; \
EXPECT=$(EXPECT); export EXPECT; \
runtest=$(RUNTEST); \
if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
@@ -309,12 +319,12 @@ check-DEJAGNU: site.exp
else echo "WARNING: could not find \`runtest'" 1>&2; :;\
fi; \
exit $$exit_status
-site.exp: Makefile
+site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
@echo 'Making a new site.exp file...'
@echo '## these variables are automatically generated by make ##' >site.tmp
@echo '# Do not edit here. If you wish to override these values' >>site.tmp
@echo '# edit the last section' >>site.tmp
- @echo 'set srcdir $(srcdir)' >>site.tmp
+ @echo 'set srcdir "$(srcdir)"' >>site.tmp
@echo "set objdir `pwd`" >>site.tmp
@echo 'set build_alias "$(build_alias)"' >>site.tmp
@echo 'set build_triplet $(build_triplet)' >>site.tmp
@@ -322,9 +332,16 @@ site.exp: Makefile
@echo 'set host_triplet $(host_triplet)' >>site.tmp
@echo 'set target_alias "$(target_alias)"' >>site.tmp
@echo 'set target_triplet $(target_triplet)' >>site.tmp
- @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
- @test ! -f site.exp || \
- sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
+ @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
+ echo "## Begin content included from file $$f. Do not modify. ##" \
+ && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
+ && echo "## End content included from file $$f. ##" \
+ || exit 1; \
+ done >> site.tmp
+ @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp
+ @if test -f site.exp; then \
+ sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \
+ fi
@-rm -f site.bak
@test ! -f site.exp || mv site.exp site.bak
@mv site.tmp site.exp
@@ -380,10 +397,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
diff --git a/Modules/_ctypes/libffi/testsuite/lib/libffi-dg.exp b/Modules/_ctypes/libffi/testsuite/lib/libffi.exp
index 838a306..4a65ed1 100644
--- a/Modules/_ctypes/libffi/testsuite/lib/libffi-dg.exp
+++ b/Modules/_ctypes/libffi/testsuite/lib/libffi.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2003, 2005, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -11,8 +11,8 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# along with this program; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
proc load_gcc_lib { filename } {
global srcdir
@@ -101,7 +101,7 @@ proc libffi-init { args } {
global tool_root_dir
global ld_library_path
- set blddirffi [pwd]/..
+ set blddirffi [pwd]/..
verbose "libffi $blddirffi"
set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
@@ -266,6 +266,56 @@ proc dg-xfail-if { args } {
}
}
+proc check-flags { args } {
+
+ # The args are within another list; pull them out.
+ set args [lindex $args 0]
+
+ # The next two arguments are optional. If they were not specified,
+ # use the defaults.
+ if { [llength $args] == 2 } {
+ lappend $args [list "*"]
+ }
+ if { [llength $args] == 3 } {
+ lappend $args [list ""]
+ }
+
+ # If the option strings are the defaults, or the same as the
+ # defaults, there is no need to call check_conditional_xfail to
+ # compare them to the actual options.
+ if { [string compare [lindex $args 2] "*"] == 0
+ && [string compare [lindex $args 3] "" ] == 0 } {
+ set result 1
+ } else {
+ # The target list might be an effective-target keyword, so replace
+ # the original list with "*-*-*", since we already know it matches.
+ set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]]
+ }
+
+ return $result
+}
+
+proc dg-skip-if { args } {
+ # Verify the number of arguments. The last two are optional.
+ set args [lreplace $args 0 0]
+ if { [llength $args] < 2 || [llength $args] > 4 } {
+ error "dg-skip-if 2: need 2, 3, or 4 arguments"
+ }
+
+ # Don't bother if we're already skipping the test.
+ upvar dg-do-what dg-do-what
+ if { [lindex ${dg-do-what} 1] == "N" } {
+ return
+ }
+
+ set selector [list target [lindex $args 1]]
+ if { [dg-process-target $selector] == "S" } {
+ if [check-flags $args] {
+ upvar dg-do-what dg-do-what
+ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
+ }
+ }
+}
# We need to make sure that additional_files and additional_sources
# are both cleared out after every test. It is not enough to clear
diff --git a/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp b/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp
index 8999aa4..6b7beba 100644
--- a/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp
+++ b/Modules/_ctypes/libffi/testsuite/lib/target-libpath.exp
@@ -25,7 +25,7 @@ set orig_ld_library64_path_saved 0
set orig_ld_library_path_32_saved 0
set orig_ld_library_path_64_saved 0
set orig_dyld_library_path_saved 0
-
+set orig_path_saved 0
#######################################
# proc set_ld_library_path_env_vars { }
@@ -42,6 +42,7 @@ proc set_ld_library_path_env_vars { } {
global orig_ld_library_path_32_saved
global orig_ld_library_path_64_saved
global orig_dyld_library_path_saved
+ global orig_path_saved
global orig_ld_library_path
global orig_ld_run_path
global orig_shlib_path
@@ -50,6 +51,7 @@ proc set_ld_library_path_env_vars { } {
global orig_ld_library_path_32
global orig_ld_library_path_64
global orig_dyld_library_path
+ global orig_path
global GCC_EXEC_PREFIX
# Set the relocated compiler prefix, but only if the user hasn't specified one.
@@ -100,6 +102,10 @@ proc set_ld_library_path_env_vars { } {
set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)"
set orig_dyld_library_path_saved 1
}
+ if [info exists env(PATH)] {
+ set orig_path "$env(PATH)"
+ set orig_path_saved 1
+ }
}
# We need to set ld library path in the environment. Currently,
@@ -169,6 +175,13 @@ proc set_ld_library_path_env_vars { } {
} else {
setenv DYLD_LIBRARY_PATH "$ld_library_path"
}
+ if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
+ if { $orig_path_saved } {
+ setenv PATH "$ld_library_path:$orig_path"
+ } else {
+ setenv PATH "$ld_library_path"
+ }
+ }
verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path"
}
@@ -187,6 +200,7 @@ proc restore_ld_library_path_env_vars { } {
global orig_ld_library_path_32_saved
global orig_ld_library_path_64_saved
global orig_dyld_library_path_saved
+ global orig_path_saved
global orig_ld_library_path
global orig_ld_run_path
global orig_shlib_path
@@ -195,6 +209,7 @@ proc restore_ld_library_path_env_vars { } {
global orig_ld_library_path_32
global orig_ld_library_path_64
global orig_dyld_library_path
+ global orig_path
if { $orig_environment_saved == 0 } {
return
@@ -240,6 +255,11 @@ proc restore_ld_library_path_env_vars { } {
} elseif [info exists env(DYLD_LIBRARY_PATH)] {
unsetenv DYLD_LIBRARY_PATH
}
+ if { $orig_path_saved } {
+ setenv PATH "$orig_path"
+ } elseif [info exists env(PATH)] {
+ unsetenv PATH
+ }
}
#######################################
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/a.out b/Modules/_ctypes/libffi/testsuite/libffi.call/a.out
new file mode 100755
index 0000000..93ee85b
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/a.out
Binary files differ
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp b/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp
index 1e9985e..26acd81 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/call.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,10 +14,6 @@
# along with this program; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
-# libffi testsuite that uses the 'dg.exp' driver.
-
-load_lib libffi-dg.exp
-
dg-init
libffi-init
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/closure_stdcall.c b/Modules/_ctypes/libffi/testsuite/libffi.call/closure_stdcall.c
index 6bfcc1f..1407f02 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/closure_stdcall.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/closure_stdcall.c
@@ -49,9 +49,17 @@ int main (void)
CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall,
(void *) 3 /* userdata */, code) == FFI_OK);
+#ifdef _MSC_VER
+ __asm { mov sp_pre, esp }
+#else
asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
+#endif
res = (*(closure_test_type0)code)(0, 1, 2, 3);
+#ifdef _MSC_VER
+ __asm { mov sp_post, esp }
+#else
asm volatile (" movl %%esp,%0" : "=g" (sp_post));
+#endif
/* { dg-output "0 1 2 3: 9" } */
printf("res: %d\n",res);
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/closure_thiscall.c b/Modules/_ctypes/libffi/testsuite/libffi.call/closure_thiscall.c
new file mode 100644
index 0000000..0f93649
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/closure_thiscall.c
@@ -0,0 +1,72 @@
+/* Area: closure_call (thiscall convention)
+ Purpose: Check handling when caller expects thiscall callee
+ Limitations: none.
+ PR: none.
+ Originator: <ktietz@redhat.com> */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+#include "ffitest.h"
+
+static void
+closure_test_thiscall(ffi_cif* cif __UNUSED__, void* resp, void** args,
+ void* userdata)
+{
+ *(ffi_arg*)resp =
+ (int)*(int *)args[0] + (int)(*(int *)args[1])
+ + (int)(*(int *)args[2]) + (int)(*(int *)args[3])
+ + (int)(intptr_t)userdata;
+
+ printf("%d %d %d %d: %d\n",
+ (int)*(int *)args[0], (int)(*(int *)args[1]),
+ (int)(*(int *)args[2]), (int)(*(int *)args[3]),
+ (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (__thiscall *closure_test_type0)(int, int, int, int);
+
+int main (void)
+{
+ ffi_cif cif;
+ void *code;
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+ ffi_type * cl_arg_types[17];
+ int res;
+ void* sp_pre;
+ void* sp_post;
+ char buf[1024];
+
+ cl_arg_types[0] = &ffi_type_uint;
+ cl_arg_types[1] = &ffi_type_uint;
+ cl_arg_types[2] = &ffi_type_uint;
+ cl_arg_types[3] = &ffi_type_uint;
+ cl_arg_types[4] = NULL;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_THISCALL, 4,
+ &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_thiscall,
+ (void *) 3 /* userdata */, code) == FFI_OK);
+
+#ifdef _MSC_VER
+ __asm { mov sp_pre, esp }
+#else
+ asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
+#endif
+ res = (*(closure_test_type0)code)(0, 1, 2, 3);
+#ifdef _MSC_VER
+ __asm { mov sp_post, esp }
+#else
+ asm volatile (" movl %%esp,%0" : "=g" (sp_post));
+#endif
+ /* { dg-output "0 1 2 3: 9" } */
+
+ printf("res: %d\n",res);
+ /* { dg-output "\nres: 9" } */
+
+ sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post);
+ printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf));
+ /* { dg-output "\nstack pointer match" } */
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c
index f0a334f..ea0825d 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_12byte.c
@@ -49,15 +49,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_12byte h_dbl = { 7, 4, 9 };
+ struct cls_struct_12byte j_dbl = { 1, 5, 3 };
+ struct cls_struct_12byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_12byte h_dbl = { 7, 4, 9 };
- struct cls_struct_12byte j_dbl = { 1, 5, 3 };
- struct cls_struct_12byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_sint;
cls_struct_fields[1] = &ffi_type_sint;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c
index 9b9292a..89a08a2 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_16byte.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_16byte h_dbl = { 7, 8.0, 9 };
+ struct cls_struct_16byte j_dbl = { 1, 9.0, 3 };
+ struct cls_struct_16byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_16byte h_dbl = { 7, 8.0, 9 };
- struct cls_struct_16byte j_dbl = { 1, 9.0, 3 };
- struct cls_struct_16byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_sint;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c
index 40c8c6d..9f75da8 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_18byte.c
@@ -54,15 +54,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 };
+ struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 };
+ struct cls_struct_18byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 };
- struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 };
- struct cls_struct_18byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c
index aa64248..278794b 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_19byte.c
@@ -57,15 +57,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 };
+ struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 };
+ struct cls_struct_19byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 };
- struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 };
- struct cls_struct_19byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c
index b9402d6..82492c0 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_1_1byte.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_1_1byte g_dbl = { 12 };
+ struct cls_struct_1_1byte f_dbl = { 178 };
+ struct cls_struct_1_1byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_1_1byte g_dbl = { 12 };
- struct cls_struct_1_1byte f_dbl = { 178 };
- struct cls_struct_1_1byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c
index 80dd7ac..3f8bb28 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 };
+ struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 };
+ struct cls_struct_20byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 };
- struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 };
- struct cls_struct_20byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c
index 50bcbbf..6562727 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_20byte1.c
@@ -52,15 +52,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 };
+ struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 };
+ struct cls_struct_20byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 };
- struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 };
- struct cls_struct_20byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_sint;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c
index 46a6eb4..1d82f6e 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_24byte.c
@@ -61,17 +61,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 };
struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 };
struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 };
struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 };
struct cls_struct_24byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c
index 101e130..81bb0a6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_2byte.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_2byte g_dbl = { 12, 127 };
+ struct cls_struct_2byte f_dbl = { 1, 13 };
+ struct cls_struct_2byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_2byte g_dbl = { 12, 127 };
- struct cls_struct_2byte f_dbl = { 1, 13 };
- struct cls_struct_2byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c
index fc780c3..b782746 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3_1byte.c
@@ -54,15 +54,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_3_1byte g_dbl = { 12, 13, 14 };
+ struct cls_struct_3_1byte f_dbl = { 178, 179, 180 };
+ struct cls_struct_3_1byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_3_1byte g_dbl = { 12, 13, 14 };
- struct cls_struct_3_1byte f_dbl = { 178, 179, 180 };
- struct cls_struct_3_1byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c
index 5705ce3..a02c463 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte1.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_3byte g_dbl = { 12, 119 };
+ struct cls_struct_3byte f_dbl = { 1, 15 };
+ struct cls_struct_3byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_3byte g_dbl = { 12, 119 };
- struct cls_struct_3byte f_dbl = { 1, 15 };
- struct cls_struct_3byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_ushort;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c
index 01770a0..c7251ce 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_3byte2.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_3byte_1 g_dbl = { 15, 125 };
+ struct cls_struct_3byte_1 f_dbl = { 9, 19 };
+ struct cls_struct_3byte_1 res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_3byte_1 g_dbl = { 15, 125 };
- struct cls_struct_3byte_1 f_dbl = { 9, 19 };
- struct cls_struct_3byte_1 res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c
index f3806d7..2d6d8b6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4_1byte.c
@@ -56,15 +56,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 };
+ struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 };
+ struct cls_struct_4_1byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 };
- struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 };
- struct cls_struct_4_1byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c
index a1aba3c..4ac3787 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_4byte.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_4byte g_dbl = { 127, 120 };
+ struct cls_struct_4byte f_dbl = { 12, 128 };
+ struct cls_struct_4byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_4byte g_dbl = { 127, 120 };
- struct cls_struct_4byte f_dbl = { 12, 128 };
- struct cls_struct_4byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_ushort;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c
index 2ceba3d..ad9d51c 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5_1_byte.c
@@ -58,15 +58,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 };
+ struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 };
+ struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 };
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 };
- struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 };
- struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 };
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c
index 61d595c..4e0c000 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_5byte.c
@@ -53,15 +53,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_5byte g_dbl = { 127, 120, 1 };
+ struct cls_struct_5byte f_dbl = { 12, 128, 9 };
+ struct cls_struct_5byte res_dbl = { 0, 0, 0 };
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_5byte g_dbl = { 127, 120, 1 };
- struct cls_struct_5byte f_dbl = { 12, 128, 9 };
- struct cls_struct_5byte res_dbl = { 0, 0, 0 };
-
cls_struct_fields[0] = &ffi_type_ushort;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c
index 576ebe0..a55edc2 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_64byte.c
@@ -66,17 +66,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 };
struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 };
struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 };
struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 };
struct cls_struct_64byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c
index 9f2eff6..b4dcdba 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6_1_byte.c
@@ -60,15 +60,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 };
+ struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 };
+ struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 };
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 };
- struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 };
- struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 };
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c
index 73257b098..7406780 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_6byte.c
@@ -56,15 +56,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 };
+ struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 };
+ struct cls_struct_6byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 };
- struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 };
- struct cls_struct_6byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_ushort;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c
index 50d09c9..14a7e96 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7_1_byte.c
@@ -62,15 +62,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 };
+ struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 };
+ struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 };
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 };
- struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 };
- struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 };
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c
index f5c0000..1645cc6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_7byte.c
@@ -55,15 +55,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 };
+ struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 };
+ struct cls_struct_7byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 };
- struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 };
- struct cls_struct_7byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_ushort;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c
index 4aa99d1..f6c1ea5 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_8byte.c
@@ -49,15 +49,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_8byte g_dbl = { 1, 2.0 };
+ struct cls_struct_8byte f_dbl = { 4, 5.0 };
+ struct cls_struct_8byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_8byte g_dbl = { 1, 2.0 };
- struct cls_struct_8byte f_dbl = { 4, 5.0 };
- struct cls_struct_8byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_sint;
cls_struct_fields[1] = &ffi_type_float;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c
index cc5e9d6..0b85722 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte1.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_9byte h_dbl = { 7, 8.0};
+ struct cls_struct_9byte j_dbl = { 1, 9.0};
+ struct cls_struct_9byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_9byte h_dbl = { 7, 8.0};
- struct cls_struct_9byte j_dbl = { 1, 9.0};
- struct cls_struct_9byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_sint;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c
index 5c0ba0d..edf991d 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_9byte2.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_9byte h_dbl = { 7.0, 8};
+ struct cls_struct_9byte j_dbl = { 1.0, 9};
+ struct cls_struct_9byte res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_9byte h_dbl = { 7.0, 8};
- struct cls_struct_9byte j_dbl = { 1.0, 9};
- struct cls_struct_9byte res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_sint;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c
index 22b94d5..aad5f3c 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_double.c
@@ -52,15 +52,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c
index 62637f2..37e0855 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_float.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_float;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c
index af38060..b3322d8 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble.c
@@ -51,15 +51,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_longdouble;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
index 4274af1..15f9365 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
@@ -6,7 +6,7 @@
/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
#include "ffitest.h"
@@ -87,15 +87,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
+ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
- struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_longdouble;
cls_struct_fields[1] = &ffi_type_longdouble;
cls_struct_fields[2] = &ffi_type_longdouble;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
index 088f0d3..ca1c356 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
@@ -7,7 +7,7 @@
/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
/* { dg-do run { xfail strongarm*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
#include "ffitest.h"
@@ -67,15 +67,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[3];
+ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
+ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
- struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_longdouble;
cls_struct_fields[1] = &ffi_type_longdouble;
cls_struct_fields[2] = &ffi_type_longdouble;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c
index cbc4f95..8fbf36a 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_pointer.c
@@ -54,15 +54,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, (void *)4951, 127 };
+ struct cls_struct_align f_dbl = { 1, (void *)9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, (void *)4951, 127 };
- struct cls_struct_align f_dbl = { 1, (void *)9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_pointer;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c
index 383ea41..039b874 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint16.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_sshort;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c
index 705d78c..c96c6d1 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint32.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_sint;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c
index 31d53af..9aa7bdd 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_sint64.c
@@ -51,15 +51,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_sint64;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c
index cb6b748..97620b7 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint16.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_ushort;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c
index e453d3e..5766fad 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint32.c
@@ -50,15 +50,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uint;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c
index 495c79f..a52cb89 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_align_uint64.c
@@ -52,15 +52,15 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_align g_dbl = { 12, 4951, 127 };
+ struct cls_struct_align f_dbl = { 1, 9320, 13 };
+ struct cls_struct_align res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
cls_struct_type.elements = cls_struct_fields;
- struct cls_struct_align g_dbl = { 12, 4951, 127 };
- struct cls_struct_align f_dbl = { 1, 9320, 13 };
- struct cls_struct_align res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uint64;
cls_struct_fields[2] = &ffi_type_uchar;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c
index 660dabb..d663791 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_dbls_struct.c
@@ -37,6 +37,8 @@ int main(int argc __UNUSED__, char** argv __UNUSED__)
ffi_type ts1_type;
ffi_type* ts1_type_elements[4];
+ Dbls arg = { 1.0, 2.0 };
+
ts1_type.size = 0;
ts1_type.alignment = 0;
ts1_type.type = FFI_TYPE_STRUCT;
@@ -48,8 +50,6 @@ int main(int argc __UNUSED__, char** argv __UNUSED__)
cl_arg_types[0] = &ts1_type;
- Dbls arg = { 1.0, 2.0 };
-
/* Initialize the cif */
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_void, cl_arg_types) == FFI_OK);
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c
index 0695874..dbf2000 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_double_va.c
@@ -6,6 +6,8 @@
/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
/* { dg-output "" { xfail avr32*-*-* } } */
+/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
+
#include "ffitest.h"
static void
@@ -34,7 +36,8 @@ int main (void)
arg_types[1] = &ffi_type_double;
arg_types[2] = NULL;
- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
+ /* This printf call is variadic */
+ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
arg_types) == FFI_OK);
args[0] = &format;
@@ -46,6 +49,9 @@ int main (void)
printf("res: %d\n", (int) res);
// { dg-output "\nres: 4" }
+ /* The call to cls_double_va_fn is static, so have to use a normal prep_cif */
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types) == FFI_OK);
+
CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK);
res = ((int(*)(char*, double))(code))(format, doubleArg);
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c
index 52af6cf..e6bac1f 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble.c
@@ -6,7 +6,7 @@
/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
/* { dg-do run { xfail arm*-*-* strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
#include "ffitest.h"
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c
index 38564cb..4fa1ea2 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c
@@ -6,6 +6,8 @@
/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */
+/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
+
#include "ffitest.h"
static void
@@ -34,7 +36,8 @@ int main (void)
arg_types[1] = &ffi_type_longdouble;
arg_types[2] = NULL;
- CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
+ /* This printf call is variadic */
+ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
arg_types) == FFI_OK);
args[0] = &format;
@@ -46,6 +49,10 @@ int main (void)
printf("res: %d\n", (int) res);
// { dg-output "\nres: 4" }
+ /* The call to cls_longdouble_va_fn is static, so have to use a normal prep_cif */
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
+ arg_types) == FFI_OK);
+
CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK);
res = ((int(*)(char*, long double))(code))(format, ldArg);
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c
index fadd353..cf03993 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer.c
@@ -65,7 +65,7 @@ int main (void)
CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
- res = (ffi_arg)((void*(*)(void*, void*))(code))(arg1, arg2);
+ res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
/* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */
printf("res: 0x%08x\n", (unsigned int) res);
/* { dg-output "\nres: 0x9be02467" } */
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c
index 697f271..e31139e 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_pointer_stack.c
@@ -28,11 +28,12 @@ void* cls_pointer_fn2(void* a1, void* a2)
char trample6 = trample4 + ((char*)&a2)[1];
long double trample7 = (intptr_t)trample5 + (intptr_t)trample1;
char trample8 = trample6 + trample2;
+ void* result;
dummyVar = dummy_func(trample1, trample2, trample3, trample4,
trample5, trample6, trample7, trample8);
- void* result = (void*)((intptr_t)a1 + (intptr_t)a2);
+ result = (void*)((intptr_t)a1 + (intptr_t)a2);
printf("0x%08x 0x%08x: 0x%08x\n",
(unsigned int)(uintptr_t) a1,
@@ -52,11 +53,12 @@ void* cls_pointer_fn1(void* a1, void* a2)
char trample6 = trample4 + ((char*)&a2)[1];
long double trample7 = (intptr_t)trample5 + (intptr_t)trample1;
char trample8 = trample6 + trample2;
+ void* result;
dummyVar = dummy_func(trample1, trample2, trample3, trample4,
trample5, trample6, trample7, trample8);
- void* result = (void*)((intptr_t)a1 + (intptr_t)a2);
+ result = (void*)((intptr_t)a1 + (intptr_t)a2);
printf("0x%08x 0x%08x: 0x%08x\n",
(unsigned int)(intptr_t) a1,
@@ -129,7 +131,7 @@ int main (void)
CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
- res = (ffi_arg)((void*(*)(void*, void*))(code))(arg1, arg2);
+ res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
printf("res: 0x%08x\n", (unsigned int) res);
// { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" }
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c b/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c
index a21a3fd..f5a7317 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_abi.c
@@ -4,7 +4,8 @@
PR: none.
Originator: Blake Chaffin 6/6/2007 */
-/* { dg-do run { xfail *-*-* } } */
+/* { dg-do run } */
+
#include "ffitest.h"
static void
@@ -17,11 +18,9 @@ int main (void)
ffi_cif cif;
void *code;
ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
- void* args[1];
ffi_type* arg_types[1];
arg_types[0] = NULL;
- args[0] = NULL;
CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void,
arg_types) == FFI_BAD_ABI);
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c b/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c
index bd2fc54..bf60161 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/err_bad_typedef.c
@@ -4,7 +4,8 @@
PR: none.
Originator: Blake Chaffin 6/6/2007 */
-/* { dg-do run { xfail *-*-* } } */
+/* { dg-do run } */
+
#include "ffitest.h"
int main (void)
@@ -12,10 +13,10 @@ int main (void)
ffi_cif cif;
ffi_type* arg_types[1];
- arg_types[0] = NULL;
-
ffi_type badType = ffi_type_void;
+ arg_types[0] = NULL;
+
badType.size = 0;
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType,
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis1_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis1_win32.c
new file mode 100644
index 0000000..cbc4724
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis1_win32.c
@@ -0,0 +1,50 @@
+/* Area: ffi_call
+ Purpose: Check fastcall fct call on X86_WIN32 systems.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+
+static size_t __FASTCALL__ my_fastcall_f(char *s, float a)
+{
+ return (size_t) ((int) strlen(s) + (int) a);
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_arg rint;
+ char *s;
+ float v2;
+ args[0] = &ffi_type_pointer;
+ args[1] = &ffi_type_float;
+ values[0] = (void*) &s;
+ values[1] = (void*) &v2;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2,
+ &ffi_type_sint, args) == FFI_OK);
+
+ s = "a";
+ v2 = 0.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 1);
+
+ s = "1234567";
+ v2 = -1.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 6);
+
+ s = "1234567890123456789012345";
+ v2 = 1.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 26);
+
+ printf("fastcall fct1 tests passed\n");
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis2_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis2_win32.c
new file mode 100644
index 0000000..7bdd0e1
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis2_win32.c
@@ -0,0 +1,50 @@
+/* Area: ffi_call
+ Purpose: Check fastcall fct call on X86_WIN32 systems.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+
+static size_t __FASTCALL__ my_fastcall_f(float a, char *s)
+{
+ return (size_t) ((int) strlen(s) + (int) a);
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_arg rint;
+ char *s;
+ float v2;
+ args[1] = &ffi_type_pointer;
+ args[0] = &ffi_type_float;
+ values[1] = (void*) &s;
+ values[0] = (void*) &v2;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2,
+ &ffi_type_sint, args) == FFI_OK);
+
+ s = "a";
+ v2 = 0.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 1);
+
+ s = "1234567";
+ v2 = -1.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 6);
+
+ s = "1234567890123456789012345";
+ v2 = 1.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 26);
+
+ printf("fastcall fct2 tests passed\n");
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis3_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis3_win32.c
new file mode 100644
index 0000000..b5d606d
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/fastthis3_win32.c
@@ -0,0 +1,56 @@
+/* Area: ffi_call
+ Purpose: Check fastcall f call on X86_WIN32 systems.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+
+static size_t __FASTCALL__ my_fastcall_f(float a, char *s, int i)
+{
+ return (size_t) ((int) strlen(s) + (int) a + i);
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_arg rint;
+ char *s;
+ int v1;
+ float v2;
+ args[2] = &ffi_type_sint;
+ args[1] = &ffi_type_pointer;
+ args[0] = &ffi_type_float;
+ values[2] = (void*) &v1;
+ values[1] = (void*) &s;
+ values[0] = (void*) &v2;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 3,
+ &ffi_type_sint, args) == FFI_OK);
+
+ s = "a";
+ v1 = 1;
+ v2 = 0.0;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 2);
+
+ s = "1234567";
+ v2 = -1.0;
+ v1 = -2;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 4);
+
+ s = "1234567890123456789012345";
+ v2 = 1.0;
+ v1 = 2;
+ ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values);
+ CHECK(rint == 28);
+
+ printf("fastcall fct3 tests passed\n");
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h b/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h
index 2cb9849..d81d4da 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/ffitest.h
@@ -25,6 +25,14 @@
#define __UNUSED__
#endif
+/* Define __FASTCALL__ so that other compilers than gcc can run the tests. */
+#undef __FASTCALL__
+#if defined _MSC_VER
+#define __FASTCALL__ __fastcall
+#else
+#define __FASTCALL__ __attribute__((fastcall))
+#endif
+
/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
file open. */
#ifdef HAVE_MMAP_ANON
@@ -67,6 +75,8 @@
#define PRIdLL "ld"
#undef PRIuLL
#define PRIuLL "lu"
+#define PRId8 "hd"
+#define PRIu8 "hu"
#define PRId64 "ld"
#define PRIu64 "lu"
#define PRIuPTR "lu"
@@ -77,6 +87,28 @@
#define PRIuPTR "lu"
#endif
+/* IRIX kludge. */
+#if defined(__sgi)
+/* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99
+ compilations. */
+#define PRId8 "hhd"
+#define PRIu8 "hhu"
+#if (_MIPS_SZLONG == 32)
+#define PRId64 "lld"
+#define PRIu64 "llu"
+#endif
+/* This doesn't match <inttypes.h>, which always has "lld" here, but the
+ arguments are uint64_t, int64_t, which are unsigned long, long for
+ 64-bit in <sgidefs.h>. */
+#if (_MIPS_SZLONG == 64)
+#define PRId64 "ld"
+#define PRIu64 "lu"
+#endif
+/* This doesn't match <inttypes.h>, which has "u" here, but the arguments
+ are uintptr_t, which is always unsigned long. */
+#define PRIuPTR "lu"
+#endif
+
/* Solaris < 10 kludge. */
#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR)
#if defined(__arch64__) || defined (__x86_64__)
@@ -86,6 +118,15 @@
#endif
#endif
+/* MSVC kludge. */
+#if defined _MSC_VER
+#define PRIuPTR "lu"
+#define PRIu8 "u"
+#define PRId8 "d"
+#define PRIu64 "I64u"
+#define PRId64 "I64d"
+#endif
+
#ifdef USING_MMAP
static inline void *
allocate_mmap (size_t size)
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c b/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c
new file mode 100644
index 0000000..aae158e
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/float_va.c
@@ -0,0 +1,107 @@
+/* Area: fp and variadics
+ Purpose: check fp inputs and returns work on variadics, even the fixed params
+ Limitations: None
+ PR: none
+ Originator: <david.gilbert@linaro.org> 2011-01-25
+
+ Intended to stress the difference in ABI on ARM vfp
+*/
+
+/* { dg-do run } */
+
+#include <stdarg.h>
+
+#include "ffitest.h"
+
+/* prints out all the parameters, and returns the sum of them all.
+ * 'x' is the number of variadic parameters all of which are double in this test
+ */
+double float_va_fn(unsigned int x, double y,...)
+{
+ double total=0.0;
+ va_list ap;
+ unsigned int i;
+
+ total+=(double)x;
+ total+=y;
+
+ printf("%u: %.1f :", x, y);
+
+ va_start(ap, y);
+ for(i=0;i<x;i++)
+ {
+ double arg=va_arg(ap, double);
+ total+=arg;
+ printf(" %d:%.1f ", i, arg);
+ }
+ va_end(ap);
+
+ printf(" total: %.1f\n", total);
+
+ return total;
+}
+
+int main (void)
+{
+ ffi_cif cif;
+
+ ffi_type *arg_types[5];
+ void *values[5];
+ double doubles[5];
+ unsigned int firstarg;
+ double resfp;
+
+ /* First test, pass float_va_fn(0,2.0) - note there are no actual
+ * variadic parameters, but it's declared variadic so the ABI may be
+ * different. */
+ /* Call it statically and then via ffi */
+ resfp=float_va_fn(0,2.0);
+ // { dg-output "0: 2.0 : total: 2.0" }
+ printf("compiled: %.1f\n", resfp);
+ // { dg-output "\ncompiled: 2.0" }
+
+ arg_types[0] = &ffi_type_uint;
+ arg_types[1] = &ffi_type_double;
+ arg_types[2] = NULL;
+ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 2,
+ &ffi_type_double, arg_types) == FFI_OK);
+
+ firstarg = 0;
+ doubles[0] = 2.0;
+ values[0] = &firstarg;
+ values[1] = &doubles[0];
+ ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
+ // { dg-output "\n0: 2.0 : total: 2.0" }
+ printf("ffi: %.1f\n", resfp);
+ // { dg-output "\nffi: 2.0" }
+
+ /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
+ /* Call it statically and then via ffi */
+ resfp=float_va_fn(2,2.0,3.0,4.0);
+ // { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" }
+ printf("compiled: %.1f\n", resfp);
+ // { dg-output "\ncompiled: 11.0" }
+
+ arg_types[0] = &ffi_type_uint;
+ arg_types[1] = &ffi_type_double;
+ arg_types[2] = &ffi_type_double;
+ arg_types[3] = &ffi_type_double;
+ arg_types[4] = NULL;
+ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 4,
+ &ffi_type_double, arg_types) == FFI_OK);
+
+ firstarg = 2;
+ doubles[0] = 2.0;
+ doubles[1] = 3.0;
+ doubles[2] = 4.0;
+ values[0] = &firstarg;
+ values[1] = &doubles[0];
+ values[2] = &doubles[1];
+ values[3] = &doubles[2];
+ ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
+ // { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" }
+ printf("ffi: %.1f\n", resfp);
+ // { dg-output "\nffi: 11.0" }
+
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c b/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c
index 9cffb71..380fedf 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/huge_struct.c
@@ -7,7 +7,7 @@
/* { dg-excess-errors "" { target x86_64-*-mingw* x86_64-*-cygwin* } } */
/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
#include "ffitest.h"
@@ -129,14 +129,14 @@ test_large_fn(
ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4),
ui8_5 + 5, si8_5 + 5};
- printf("%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %hhu %hhd: "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %hhu %hhd\n",
+ printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1,
ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2,
ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3,
@@ -229,6 +229,19 @@ main(int argc __UNUSED__, const char** argv __UNUSED__)
ffi_type* st_fields[51];
BigStruct retVal;
+ uint8_t ui8 = 1;
+ int8_t si8 = 2;
+ uint16_t ui16 = 3;
+ int16_t si16 = 4;
+ uint32_t ui32 = 5;
+ int32_t si32 = 6;
+ uint64_t ui64 = 7;
+ int64_t si64 = 8;
+ float f = 9;
+ double d = 10;
+ long double ld = 11;
+ char* p = (char*)0x12345678;
+
memset (&retVal, 0, sizeof(retVal));
ret_struct_type.size = 0;
@@ -251,19 +264,6 @@ main(int argc __UNUSED__, const char** argv __UNUSED__)
st_fields[50] = NULL;
- uint8_t ui8 = 1;
- int8_t si8 = 2;
- uint16_t ui16 = 3;
- int16_t si16 = 4;
- uint32_t ui32 = 5;
- int32_t si32 = 6;
- uint64_t ui64 = 7;
- int64_t si64 = 8;
- float f = 9;
- double d = 10;
- long double ld = 11;
- char* p = (char*)0x12345678;
-
argTypes[0] = argTypes[12] = argTypes[24] = argTypes[36] = argTypes[48] = &ffi_type_uint8;
argValues[0] = argValues[12] = argValues[24] = argValues[36] = argValues[48] = &ui8;
argTypes[1] = argTypes[13] = argTypes[25] = argTypes[37] = argTypes[49] = &ffi_type_sint8;
@@ -296,10 +296,10 @@ main(int argc __UNUSED__, const char** argv __UNUSED__)
ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues);
// { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
- printf("res: %hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %hhu %hhd\n",
+ printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
@@ -324,10 +324,10 @@ main(int argc __UNUSED__, const char** argv __UNUSED__)
ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
ui8, si8);
// { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
- printf("res: %hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
- "%hhu %hhd %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %hhu %hhd\n",
+ printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+ "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c
new file mode 100644
index 0000000..1077159
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/many2.c
@@ -0,0 +1,54 @@
+/* Area: ffi_call
+ Purpose: Check uint8_t arguments.
+ Limitations: none.
+ PR: PR45677.
+ Originator: Dan Witte <dwitte@gmail.com> 20100916 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+#define NARGS 7
+
+typedef unsigned char u8;
+
+__attribute__((noinline)) uint8_t
+foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
+ uint8_t e, uint8_t f, uint8_t g)
+{
+ return a + b + c + d + e + f + g;
+}
+
+uint8_t
+bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
+ uint8_t e, uint8_t f, uint8_t g)
+{
+ return foo (a, b, c, d, e, f, g);
+}
+
+int
+main (void)
+{
+ ffi_type *ffitypes[NARGS];
+ int i;
+ ffi_cif cif;
+ ffi_arg result = 0;
+ uint8_t args[NARGS];
+ void *argptrs[NARGS];
+
+ for (i = 0; i < NARGS; ++i)
+ ffitypes[i] = &ffi_type_uint8;
+
+ CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, NARGS,
+ &ffi_type_uint8, ffitypes) == FFI_OK);
+
+ for (i = 0; i < NARGS; ++i)
+ {
+ args[i] = i;
+ argptrs[i] = &args[i];
+ }
+ ffi_call (&cif, FFI_FN (bar), &result, argptrs);
+
+ CHECK (result == 21);
+ return 0;
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/many2_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/many2_win32.c
new file mode 100644
index 0000000..4adbe4d
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/many2_win32.c
@@ -0,0 +1,63 @@
+/* Area: ffi_call
+ Purpose: Check stdcall many call on X86_WIN32 systems.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+#include <float.h>
+
+static float __attribute__((fastcall)) fastcall_many(float f1,
+ float f2,
+ float f3,
+ float f4,
+ float f5,
+ float f6,
+ float f7,
+ float f8,
+ float f9,
+ float f10,
+ float f11,
+ float f12,
+ float f13)
+{
+ return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[13];
+ void *values[13];
+ float fa[13];
+ float f, ff;
+ unsigned long ul;
+
+ for (ul = 0; ul < 13; ul++)
+ {
+ args[ul] = &ffi_type_float;
+ values[ul] = &fa[ul];
+ fa[ul] = (float) ul;
+ }
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 13,
+ &ffi_type_float, args) == FFI_OK);
+
+ ff = fastcall_many(fa[0], fa[1],
+ fa[2], fa[3],
+ fa[4], fa[5],
+ fa[6], fa[7],
+ fa[8], fa[9],
+ fa[10], fa[11], fa[12]);
+
+ ffi_call(&cif, FFI_FN(fastcall_many), &f, values);
+
+ if (f - ff < FLT_EPSILON)
+ printf("fastcall many arg tests ok!\n");
+ else
+ CHECK(0);
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c
index 8aa527e..c15e3a0 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct.c
@@ -77,6 +77,12 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
+ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
+ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
+ {3, 1.0, 8.0}};
+ struct cls_struct_combined res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -92,12 +98,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
- struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
- struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
- {3, 1.0, 8.0}};
- struct cls_struct_combined res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_float;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c
index 2a9f515..1087f7b 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct1.c
@@ -81,6 +81,13 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
+ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
+ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
+ {3, 1.0, 8.0}};
+ struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4};
+ struct cls_struct_combined res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -96,13 +103,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
- struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
- struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
- {3, 1.0, 8.0}};
- struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4};
- struct cls_struct_combined res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_float;
cls_struct_fields[2] = &ffi_type_sint;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c
index d6a718b..34a74e7 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct10.c
@@ -67,6 +67,12 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[4];
+ struct A e_dbl = { 1LL, 7};
+ struct B f_dbl = { 99, {12LL , 127}, 255};
+ struct C g_dbl = { 2LL, 9};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -82,12 +88,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct A e_dbl = { 1LL, 7};
- struct B f_dbl = { 99, {12LL , 127}, 255};
- struct C g_dbl = { 2LL, 9};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_uint64;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c
index de1584c..69268cd 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct2.c
@@ -57,6 +57,11 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1;
ffi_type* dbl_arg_types[3];
+ struct A e_dbl = { 1, 7};
+ struct B f_dbl = {{12 , 127}, 99};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -67,11 +72,6 @@ int main (void)
cls_struct_type1.type = FFI_TYPE_STRUCT;
cls_struct_type1.elements = cls_struct_fields1;
- struct A e_dbl = { 1, 7};
- struct B f_dbl = {{12 , 127}, 99};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_ulong;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c
index 58aa853..ab18cad 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct3.c
@@ -58,6 +58,11 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1;
ffi_type* dbl_arg_types[3];
+ struct A e_dbl = { 1LL, 7};
+ struct B f_dbl = {{12LL , 127}, 99};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -68,11 +73,6 @@ int main (void)
cls_struct_type1.type = FFI_TYPE_STRUCT;
cls_struct_type1.elements = cls_struct_fields1;
- struct A e_dbl = { 1LL, 7};
- struct B f_dbl = {{12LL , 127}, 99};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_uint64;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c
index 98e491e..2ffb4d6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct4.c
@@ -58,6 +58,11 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1;
ffi_type* dbl_arg_types[3];
+ struct A e_dbl = { 1.0, 7};
+ struct B f_dbl = {{12.0 , 127}, 99};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -68,11 +73,6 @@ int main (void)
cls_struct_type1.type = FFI_TYPE_STRUCT;
cls_struct_type1.elements = cls_struct_fields1;
- struct A e_dbl = { 1.0, 7};
- struct B f_dbl = {{12.0 , 127}, 99};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c
index d8e3537..6c79845 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct5.c
@@ -58,6 +58,11 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1;
ffi_type* dbl_arg_types[3];
+ struct A e_dbl = { 1.0, 7};
+ struct B f_dbl = {{12.0 , 127}, 99};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -68,11 +73,6 @@ int main (void)
cls_struct_type1.type = FFI_TYPE_STRUCT;
cls_struct_type1.elements = cls_struct_fields1;
- struct A e_dbl = { 1.0, 7};
- struct B f_dbl = {{12.0 , 127}, 99};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_longdouble;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c
index 2f2b25a..59d3579 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct6.c
@@ -66,6 +66,12 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[4];
+ struct A e_dbl = { 1.0, 7};
+ struct B f_dbl = {{12.0 , 127}, 99};
+ struct C g_dbl = { 2, 9};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -81,12 +87,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct A e_dbl = { 1.0, 7};
- struct B f_dbl = {{12.0 , 127}, 99};
- struct C g_dbl = { 2, 9};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c
index 14c7023..27595e6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct7.c
@@ -58,6 +58,11 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1;
ffi_type* dbl_arg_types[3];
+ struct A e_dbl = { 1LL, 7};
+ struct B f_dbl = {{12.0 , 127}, 99};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -68,11 +73,6 @@ int main (void)
cls_struct_type1.type = FFI_TYPE_STRUCT;
cls_struct_type1.elements = cls_struct_fields1;
- struct A e_dbl = { 1LL, 7};
- struct B f_dbl = {{12.0 , 127}, 99};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_uint64;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c
index bb77ead..0e6c682 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct8.c
@@ -66,6 +66,12 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[4];
+ struct A e_dbl = { 1LL, 7};
+ struct B f_dbl = {{12LL , 127}, 99};
+ struct C g_dbl = { 2LL, 9};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -81,12 +87,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct A e_dbl = { 1LL, 7};
- struct B f_dbl = {{12LL , 127}, 99};
- struct C g_dbl = { 2LL, 9};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_uint64;
cls_struct_fields[1] = &ffi_type_uchar;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c
index e9f541c..5f7ac67 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/nested_struct9.c
@@ -66,6 +66,12 @@ int main (void)
ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
ffi_type* dbl_arg_types[4];
+ struct A e_dbl = { 1, 7LL};
+ struct B f_dbl = {{12.0 , 127}, 99};
+ struct C g_dbl = { 2, 9};
+
+ struct B res_dbl;
+
cls_struct_type.size = 0;
cls_struct_type.alignment = 0;
cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -81,12 +87,6 @@ int main (void)
cls_struct_type2.type = FFI_TYPE_STRUCT;
cls_struct_type2.elements = cls_struct_fields2;
- struct A e_dbl = { 1, 7LL};
- struct B f_dbl = {{12.0 , 127}, 99};
- struct C g_dbl = { 2, 9};
-
- struct B res_dbl;
-
cls_struct_fields[0] = &ffi_type_uchar;
cls_struct_fields[1] = &ffi_type_uint64;
cls_struct_fields[2] = NULL;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c b/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c
index 19608ee..a36cf3e 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/return_sc.c
@@ -30,7 +30,7 @@ int main (void)
sc < (signed char) 127; sc++)
{
ffi_call(&cif, FFI_FN(return_sc), &rint, values);
- CHECK(rint == (ffi_arg) sc);
+ CHECK((signed char)rint == sc);
}
exit(0);
}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c
index 23a93b9..f32938c 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large.c
@@ -82,17 +82,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 };
struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 };
struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 };
struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 };
struct_108byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c
index e2599d2..3b0ef9a 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_large2.c
@@ -84,17 +84,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 };
struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 };
struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 };
struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 };
struct_116byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c
index 1fc6a9e..973ee02 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium.c
@@ -68,17 +68,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 };
struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 };
struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 };
struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 };
struct_72byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c
index cb2f2fb..84323d1 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/stret_medium2.c
@@ -69,17 +69,17 @@ int main (void)
ffi_type cls_struct_type;
ffi_type* dbl_arg_types[5];
- cls_struct_type.size = 0;
- cls_struct_type.alignment = 0;
- cls_struct_type.type = FFI_TYPE_STRUCT;
- cls_struct_type.elements = cls_struct_fields;
-
struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 };
struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 };
struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 };
struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 };
struct_72byte res_dbl;
+ cls_struct_type.size = 0;
+ cls_struct_type.alignment = 0;
+ cls_struct_type.type = FFI_TYPE_STRUCT;
+ cls_struct_type.elements = cls_struct_fields;
+
cls_struct_fields[0] = &ffi_type_double;
cls_struct_fields[1] = &ffi_type_double;
cls_struct_fields[2] = &ffi_type_double;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2_win32.c
new file mode 100644
index 0000000..0d81061
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/strlen2_win32.c
@@ -0,0 +1,44 @@
+/* Area: ffi_call
+ Purpose: Check fastcall strlen call on X86_WIN32 systems.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+
+static size_t __FASTCALL__ my_fastcall_strlen(char *s)
+{
+ return (strlen(s));
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_arg rint;
+ char *s;
+ args[0] = &ffi_type_pointer;
+ values[0] = (void*) &s;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1,
+ &ffi_type_sint, args) == FFI_OK);
+
+ s = "a";
+ ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
+ CHECK(rint == 1);
+
+ s = "1234567";
+ ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
+ CHECK(rint == 7);
+
+ s = "1234567890123456789012345";
+ ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values);
+ CHECK(rint == 25);
+
+ printf("fastcall strlen tests passed\n");
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c
index ea76c85..bfc23f6 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct1.c
@@ -30,6 +30,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts1_type;
ffi_type *ts1_type_elements[4];
+
+ test_structure_1 ts1_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_1 *ts1_result =
+ (test_structure_1 *) malloc (sizeof(test_structure_1));
+
ts1_type.size = 0;
ts1_type.alignment = 0;
ts1_type.type = FFI_TYPE_STRUCT;
@@ -39,11 +46,6 @@ int main (void)
ts1_type_elements[2] = &ffi_type_uint;
ts1_type_elements[3] = NULL;
- test_structure_1 ts1_arg;
- /* This is a hack to get a properly aligned result buffer */
- test_structure_1 *ts1_result =
- (test_structure_1 *) malloc (sizeof(test_structure_1));
-
args[0] = &ts1_type;
values[0] = &ts1_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct1_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct1_win32.c
new file mode 100644
index 0000000..b756f5a
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct1_win32.c
@@ -0,0 +1,67 @@
+/* Area: ffi_call
+ Purpose: Check structures with fastcall/thiscall convention.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+#include "ffitest.h"
+
+typedef struct
+{
+ unsigned char uc;
+ double d;
+ unsigned int ui;
+} test_structure_1;
+
+static test_structure_1 __FASTCALL__ struct1(test_structure_1 ts)
+{
+ ts.uc++;
+ ts.d--;
+ ts.ui++;
+
+ return ts;
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ ffi_type ts1_type;
+ ffi_type *ts1_type_elements[4];
+
+ test_structure_1 ts1_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_1 *ts1_result =
+ (test_structure_1 *) malloc (sizeof(test_structure_1));
+
+ ts1_type.size = 0;
+ ts1_type.alignment = 0;
+ ts1_type.type = FFI_TYPE_STRUCT;
+ ts1_type.elements = ts1_type_elements;
+ ts1_type_elements[0] = &ffi_type_uchar;
+ ts1_type_elements[1] = &ffi_type_double;
+ ts1_type_elements[2] = &ffi_type_uint;
+ ts1_type_elements[3] = NULL;
+
+ args[0] = &ts1_type;
+ values[0] = &ts1_arg;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1,
+ &ts1_type, args) == FFI_OK);
+
+ ts1_arg.uc = '\x01';
+ ts1_arg.d = 3.14159;
+ ts1_arg.ui = 555;
+
+ ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+
+ CHECK(ts1_result->ui == 556);
+ CHECK(ts1_result->d == 3.14159 - 1);
+
+ free (ts1_result);
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c
index 14bc9fd..d85385e 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct2.c
@@ -29,6 +29,11 @@ int main (void)
test_structure_2 ts2_arg;
ffi_type ts2_type;
ffi_type *ts2_type_elements[3];
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_2 *ts2_result =
+ (test_structure_2 *) malloc (sizeof(test_structure_2));
+
ts2_type.size = 0;
ts2_type.alignment = 0;
ts2_type.type = FFI_TYPE_STRUCT;
@@ -37,11 +42,6 @@ int main (void)
ts2_type_elements[1] = &ffi_type_double;
ts2_type_elements[2] = NULL;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_2 *ts2_result =
- (test_structure_2 *) malloc (sizeof(test_structure_2));
-
args[0] = &ts2_type;
values[0] = &ts2_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct2_win32.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct2_win32.c
new file mode 100644
index 0000000..5d02285
--- /dev/null
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct2_win32.c
@@ -0,0 +1,67 @@
+/* Area: ffi_call
+ Purpose: Check structures in fastcall/stdcall function
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+#include "ffitest.h"
+
+typedef struct
+{
+ double d1;
+ double d2;
+} test_structure_2;
+
+static test_structure_2 __FASTCALL__ struct2(test_structure_2 ts)
+{
+ ts.d1--;
+ ts.d2--;
+
+ return ts;
+}
+
+int main (void)
+{
+ ffi_cif cif;
+ ffi_type *args[MAX_ARGS];
+ void *values[MAX_ARGS];
+ test_structure_2 ts2_arg;
+ ffi_type ts2_type;
+ ffi_type *ts2_type_elements[3];
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_2 *ts2_result =
+ (test_structure_2 *) malloc (sizeof(test_structure_2));
+
+ ts2_type.size = 0;
+ ts2_type.alignment = 0;
+ ts2_type.type = FFI_TYPE_STRUCT;
+ ts2_type.elements = ts2_type_elements;
+ ts2_type_elements[0] = &ffi_type_double;
+ ts2_type_elements[1] = &ffi_type_double;
+ ts2_type_elements[2] = NULL;
+
+ args[0] = &ts2_type;
+ values[0] = &ts2_arg;
+
+ /* Initialize the cif */
+ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, &ts2_type, args) == FFI_OK);
+
+ ts2_arg.d1 = 5.55;
+ ts2_arg.d2 = 6.66;
+
+ printf ("%g\n", ts2_arg.d1);
+ printf ("%g\n", ts2_arg.d2);
+
+ ffi_call(&cif, FFI_FN(struct2), ts2_result, values);
+
+ printf ("%g\n", ts2_result->d1);
+ printf ("%g\n", ts2_result->d2);
+
+ CHECK(ts2_result->d1 == 5.55 - 1);
+ CHECK(ts2_result->d2 == 6.66 - 1);
+
+ free (ts2_result);
+ exit(0);
+}
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c
index e0bb09b..de883c2 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct3.c
@@ -27,6 +27,11 @@ int main (void)
int compare_value;
ffi_type ts3_type;
ffi_type *ts3_type_elements[2];
+
+ test_structure_3 ts3_arg;
+ test_structure_3 *ts3_result =
+ (test_structure_3 *) malloc (sizeof(test_structure_3));
+
ts3_type.size = 0;
ts3_type.alignment = 0;
ts3_type.type = FFI_TYPE_STRUCT;
@@ -34,10 +39,6 @@ int main (void)
ts3_type_elements[0] = &ffi_type_sint;
ts3_type_elements[1] = NULL;
- test_structure_3 ts3_arg;
- test_structure_3 *ts3_result =
- (test_structure_3 *) malloc (sizeof(test_structure_3));
-
args[0] = &ts3_type;
values[0] = &ts3_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c
index 0ad0a83..48e0349 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct4.c
@@ -28,21 +28,22 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts4_type;
ffi_type *ts4_type_elements[4];
+
+ test_structure_4 ts4_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_4 *ts4_result =
+ (test_structure_4 *) malloc (sizeof(test_structure_4));
+
ts4_type.size = 0;
ts4_type.alignment = 0;
ts4_type.type = FFI_TYPE_STRUCT;
- test_structure_4 ts4_arg;
ts4_type.elements = ts4_type_elements;
ts4_type_elements[0] = &ffi_type_uint;
ts4_type_elements[1] = &ffi_type_uint;
ts4_type_elements[2] = &ffi_type_uint;
ts4_type_elements[3] = NULL;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_4 *ts4_result =
- (test_structure_4 *) malloc (sizeof(test_structure_4));
-
args[0] = &ts4_type;
values[0] = &ts4_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c
index c03cc97..28b1f0c 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct5.c
@@ -27,6 +27,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts5_type;
ffi_type *ts5_type_elements[3];
+
+ test_structure_5 ts5_arg1, ts5_arg2;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_5 *ts5_result =
+ (test_structure_5 *) malloc (sizeof(test_structure_5));
+
ts5_type.size = 0;
ts5_type.alignment = 0;
ts5_type.type = FFI_TYPE_STRUCT;
@@ -35,12 +42,6 @@ int main (void)
ts5_type_elements[1] = &ffi_type_schar;
ts5_type_elements[2] = NULL;
- test_structure_5 ts5_arg1, ts5_arg2;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_5 *ts5_result =
- (test_structure_5 *) malloc (sizeof(test_structure_5));
-
args[0] = &ts5_type;
args[1] = &ts5_type;
values[0] = &ts5_arg1;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c
index 83db9af..0e26746 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct6.c
@@ -27,6 +27,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts6_type;
ffi_type *ts6_type_elements[3];
+
+ test_structure_6 ts6_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_6 *ts6_result =
+ (test_structure_6 *) malloc (sizeof(test_structure_6));
+
ts6_type.size = 0;
ts6_type.alignment = 0;
ts6_type.type = FFI_TYPE_STRUCT;
@@ -35,13 +42,6 @@ int main (void)
ts6_type_elements[1] = &ffi_type_double;
ts6_type_elements[2] = NULL;
-
- test_structure_6 ts6_arg;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_6 *ts6_result =
- (test_structure_6 *) malloc (sizeof(test_structure_6));
-
args[0] = &ts6_type;
values[0] = &ts6_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c
index 58aac4c..8f2bbfd 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct7.c
@@ -29,6 +29,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts7_type;
ffi_type *ts7_type_elements[4];
+
+ test_structure_7 ts7_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_7 *ts7_result =
+ (test_structure_7 *) malloc (sizeof(test_structure_7));
+
ts7_type.size = 0;
ts7_type.alignment = 0;
ts7_type.type = FFI_TYPE_STRUCT;
@@ -38,13 +45,6 @@ int main (void)
ts7_type_elements[2] = &ffi_type_double;
ts7_type_elements[3] = NULL;
-
- test_structure_7 ts7_arg;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_7 *ts7_result =
- (test_structure_7 *) malloc (sizeof(test_structure_7));
-
args[0] = &ts7_type;
values[0] = &ts7_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c
index c773ac7..266e1f0 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct8.c
@@ -31,6 +31,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts8_type;
ffi_type *ts8_type_elements[5];
+
+ test_structure_8 ts8_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_8 *ts8_result =
+ (test_structure_8 *) malloc (sizeof(test_structure_8));
+
ts8_type.size = 0;
ts8_type.alignment = 0;
ts8_type.type = FFI_TYPE_STRUCT;
@@ -41,12 +48,6 @@ int main (void)
ts8_type_elements[3] = &ffi_type_float;
ts8_type_elements[4] = NULL;
- test_structure_8 ts8_arg;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_8 *ts8_result =
- (test_structure_8 *) malloc (sizeof(test_structure_8));
-
args[0] = &ts8_type;
values[0] = &ts8_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c b/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c
index f30091f..efeb716 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/struct9.c
@@ -28,6 +28,13 @@ int main (void)
void *values[MAX_ARGS];
ffi_type ts9_type;
ffi_type *ts9_type_elements[3];
+
+ test_structure_9 ts9_arg;
+
+ /* This is a hack to get a properly aligned result buffer */
+ test_structure_9 *ts9_result =
+ (test_structure_9 *) malloc (sizeof(test_structure_9));
+
ts9_type.size = 0;
ts9_type.alignment = 0;
ts9_type.type = FFI_TYPE_STRUCT;
@@ -36,12 +43,6 @@ int main (void)
ts9_type_elements[1] = &ffi_type_sint;
ts9_type_elements[2] = NULL;
- test_structure_9 ts9_arg;
-
- /* This is a hack to get a properly aligned result buffer */
- test_structure_9 *ts9_result =
- (test_structure_9 *) malloc (sizeof(test_structure_9));
-
args[0] = &ts9_type;
values[0] = &ts9_arg;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c b/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c
index 161cc89..ca31056 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c
+++ b/Modules/_ctypes/libffi/testsuite/libffi.call/testclosure.c
@@ -43,13 +43,13 @@ int main (void)
ffi_type cls_struct_type0;
ffi_type* dbl_arg_types[5];
+ struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0};
+
cls_struct_type0.size = 0;
cls_struct_type0.alignment = 0;
cls_struct_type0.type = FFI_TYPE_STRUCT;
cls_struct_type0.elements = cls_struct_fields0;
- struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0};
-
cls_struct_fields0[0] = &ffi_type_float;
cls_struct_fields0[1] = &ffi_type_float;
cls_struct_fields0[2] = &ffi_type_float;
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.special/special.exp b/Modules/_ctypes/libffi/testsuite/libffi.special/special.exp
index e167e86..74671b1 100644
--- a/Modules/_ctypes/libffi/testsuite/libffi.special/special.exp
+++ b/Modules/_ctypes/libffi/testsuite/libffi.special/special.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,8 +14,6 @@
# along with this program; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
-load_lib libffi-dg.exp
-
dg-init
libffi-init
diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
index 262d0b4..e5b0e4c 100644
--- a/Modules/_ctypes/stgdict.c
+++ b/Modules/_ctypes/stgdict.c
@@ -426,9 +426,9 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
StgDictObject *dict;
int bitsize = 0;
- if (!pair || !PyArg_ParseTuple(pair, "OO|i", &name, &desc, &bitsize)) {
- PyErr_SetString(PyExc_AttributeError,
- "'_fields_' must be a sequence of pairs");
+ if (!pair || !PyArg_ParseTuple(pair, "UO|i", &name, &desc, &bitsize)) {
+ PyErr_SetString(PyExc_TypeError,
+ "'_fields_' must be a sequence of (name, C type) pairs");
Py_XDECREF(pair);
return -1;
}
@@ -478,6 +478,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
}
} else
bitsize = 0;
+
if (isStruct && !isPacked) {
char *fieldfmt = dict->format ? dict->format : "B";
char *fieldname = _PyUnicode_AsString(name);
@@ -487,10 +488,6 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
if (fieldname == NULL)
{
- PyErr_Format(PyExc_TypeError,
- "structure field name must be string not %s",
- name->ob_type->tp_name);
-
Py_DECREF(pair);
return -1;
}
@@ -515,6 +512,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
return -1;
}
}
+
if (isStruct) {
prop = PyCField_FromDesc(desc, i,
&field_size, bitsize, &bitofs,
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index 8561a2e..1c7d084 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -16,8 +16,37 @@ static char *PyCursesVersion = "2.1";
#include <panel.h>
-static PyObject *PyCursesError;
+typedef struct {
+ PyObject *PyCursesError;
+ PyObject *PyCursesPanel_Type;
+} _curses_panelstate;
+
+#define _curses_panelstate(o) ((_curses_panelstate *)PyModule_GetState(o))
+
+static int
+_curses_panel_clear(PyObject *m)
+{
+ Py_CLEAR(_curses_panelstate(m)->PyCursesError);
+ return 0;
+}
+
+static int
+_curses_panel_traverse(PyObject *m, visitproc visit, void *arg)
+{
+ Py_VISIT(_curses_panelstate(m)->PyCursesError);
+ return 0;
+}
+
+static void
+_curses_panel_free(void *m)
+{
+ _curses_panel_clear((PyObject *) m);
+}
+static struct PyModuleDef _curses_panelmodule;
+
+#define _curses_panelstate_global \
+((_curses_panelstate *) PyModule_GetState(PyState_FindModule(&_curses_panelmodule)))
/* Utility Functions */
@@ -34,9 +63,9 @@ PyCursesCheckERR(int code, char *fname)
return Py_None;
} else {
if (fname == NULL) {
- PyErr_SetString(PyCursesError, catchall_ERR);
+ PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_ERR);
} else {
- PyErr_Format(PyCursesError, "%s() returned ERR", fname);
+ PyErr_Format(_curses_panelstate_global->PyCursesError, "%s() returned ERR", fname);
}
return NULL;
}
@@ -54,9 +83,8 @@ typedef struct {
PyCursesWindowObject *wo; /* for reference counts */
} PyCursesPanelObject;
-PyTypeObject PyCursesPanel_Type;
-
-#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type)
+#define PyCursesPanel_Check(v) \
+ (Py_TYPE(v) == _curses_panelstate_global->PyCursesPanel_Type)
/* Some helper functions. The problem is that there's always a window
associated with a panel. To ensure that Python's GC doesn't pull
@@ -175,7 +203,8 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo)
{
PyCursesPanelObject *po;
- po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type);
+ po = PyObject_NEW(PyCursesPanelObject,
+ (PyTypeObject *)(_curses_panelstate_global)->PyCursesPanel_Type);
if (po == NULL) return NULL;
po->pan = pan;
if (insert_lop(po) < 0) {
@@ -280,7 +309,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
rtn = replace_panel(self->pan, temp->win);
if (rtn == ERR) {
- PyErr_SetString(PyCursesError, "replace_panel() returned ERR");
+ PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR");
return NULL;
}
Py_DECREF(po->wo);
@@ -305,7 +334,7 @@ PyCursesPanel_userptr(PyCursesPanelObject *self)
PyCursesInitialised;
obj = (PyObject *) panel_userptr(self->pan);
if (obj == NULL) {
- PyErr_SetString(PyCursesError, "no userptr set");
+ PyErr_SetString(_curses_panelstate_global->PyCursesError, "no userptr set");
return NULL;
}
@@ -334,36 +363,18 @@ static PyMethodDef PyCursesPanel_Methods[] = {
/* -------------------------------------------------------*/
-PyTypeObject PyCursesPanel_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_curses_panel.curses panel", /*tp_name*/
- sizeof(PyCursesPanelObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- PyCursesPanel_Methods, /*tp_methods*/
+static PyType_Slot PyCursesPanel_Type_slots[] = {
+ {Py_tp_dealloc, PyCursesPanel_Dealloc},
+ {Py_tp_methods, PyCursesPanel_Methods},
+ {0, 0},
+};
+
+static PyType_Spec PyCursesPanel_Type_spec = {
+ "_curses_panel.curses panel",
+ sizeof(PyCursesPanelObject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+ PyCursesPanel_Type_slots
};
/* Wrapper for panel_above(NULL). This function returns the bottom
@@ -405,7 +416,7 @@ PyCurses_new_panel(PyObject *self, PyObject *args)
return NULL;
pan = new_panel(win->win);
if (pan == NULL) {
- PyErr_SetString(PyCursesError, catchall_NULL);
+ PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_NULL);
return NULL;
}
return (PyObject *)PyCursesPanel_New(pan, win);
@@ -467,12 +478,12 @@ static struct PyModuleDef _curses_panelmodule = {
PyModuleDef_HEAD_INIT,
"_curses_panel",
NULL,
- -1,
+ sizeof(_curses_panelstate),
PyCurses_methods,
NULL,
- NULL,
- NULL,
- NULL
+ _curses_panel_traverse,
+ _curses_panel_clear,
+ _curses_panel_free
};
PyMODINIT_FUNC
@@ -480,21 +491,23 @@ PyInit__curses_panel(void)
{
PyObject *m, *d, *v;
- /* Initialize object type */
- if (PyType_Ready(&PyCursesPanel_Type) < 0)
- return NULL;
-
- import_curses();
-
/* Create the module and add the functions */
m = PyModule_Create(&_curses_panelmodule);
if (m == NULL)
- return NULL;
+ goto fail;
d = PyModule_GetDict(m);
+ /* Initialize object type */
+ _curses_panelstate(m)->PyCursesPanel_Type = \
+ PyType_FromSpec(&PyCursesPanel_Type_spec);
+ if (_curses_panelstate(m)->PyCursesPanel_Type == NULL)
+ goto fail;
+
+ import_curses();
+
/* For exception _curses_panel.error */
- PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
- PyDict_SetItemString(d, "error", PyCursesError);
+ _curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
+ PyDict_SetItemString(d, "error", _curses_panelstate(m)->PyCursesError);
/* Make the version available */
v = PyUnicode_FromString(PyCursesVersion);
@@ -502,4 +515,7 @@ PyInit__curses_panel(void)
PyDict_SetItemString(d, "__version__", v);
Py_DECREF(v);
return m;
+ fail:
+ Py_XDECREF(m);
+ return NULL;
}
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 5e1afa9..4e1449b 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -105,10 +105,6 @@ char *PyCursesVersion = "2.2";
#include "Python.h"
-#ifdef __osf__
-#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
-#endif
-
#ifdef __hpux
#define STRICT_SYSV_CURSES
#endif
@@ -125,6 +121,10 @@ extern int setupterm(char *,int,int *);
#include <term.h>
#endif
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
typedef chtype attr_t; /* No attr_t type is available */
@@ -147,6 +147,8 @@ static int initialised = FALSE;
/* Tells whether start_color() has been called to initialise color usage. */
static int initialisedcolors = FALSE;
+static char *screen_encoding = NULL;
+
/* Utility Macros */
#define PyCursesSetupTermCalled \
if (initialised_setupterm != TRUE) { \
@@ -179,7 +181,7 @@ static int initialisedcolors = FALSE;
*/
static PyObject *
-PyCursesCheckERR(int code, char *fname)
+PyCursesCheckERR(int code, const char *fname)
{
if (code != ERR) {
Py_INCREF(Py_None);
@@ -194,27 +196,175 @@ PyCursesCheckERR(int code, char *fname)
}
}
+/* Convert an object to a byte (an integer of type chtype):
+
+ - int
+ - bytes of length 1
+ - str of length 1
+
+ Return 1 on success, 0 on error (invalid type or integer overflow). */
+static int
+PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
+{
+ long value;
+ if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
+ value = (unsigned char)PyBytes_AsString(obj)[0];
+ }
+ else if (PyUnicode_Check(obj)) {
+ if (PyUnicode_GetLength(obj) != 1) {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, "
+ "got a str of length %zi",
+ PyUnicode_GET_LENGTH(obj));
+ return 0;
+ }
+ value = PyUnicode_READ_CHAR(obj, 0);
+ if (128 < value) {
+ PyObject *bytes;
+ const char *encoding;
+ if (win)
+ encoding = win->encoding;
+ else
+ encoding = screen_encoding;
+ bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
+ if (bytes == NULL)
+ return 0;
+ if (PyBytes_GET_SIZE(bytes) == 1)
+ value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
+ else
+ value = -1;
+ Py_DECREF(bytes);
+ if (value < 0)
+ goto overflow;
+ }
+ }
+ else if (PyLong_CheckExact(obj)) {
+ int long_overflow;
+ value = PyLong_AsLongAndOverflow(obj, &long_overflow);
+ if (long_overflow)
+ goto overflow;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, got %s",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+ }
+ *ch = (chtype)value;
+ if ((long)*ch != value)
+ goto overflow;
+ return 1;
+
+overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "byte doesn't fit in chtype");
+ return 0;
+}
+
+/* Convert an object to a byte (chtype) or a character (cchar_t):
+
+ - int
+ - bytes of length 1
+ - str of length 1
+
+ Return:
+
+ - 2 if obj is a character (written into *wch)
+ - 1 if obj is a byte (written into *ch)
+ - 0 on error: raise an exception */
static int
-PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
+PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
+ chtype *ch
+#ifdef HAVE_NCURSESW
+ , cchar_t *wch
+#endif
+ )
{
- if (PyLong_CheckExact(obj)) {
+ long value;
+#ifdef HAVE_NCURSESW
+ wchar_t buffer[2];
+#endif
+
+ if (PyUnicode_Check(obj)) {
+#ifdef HAVE_NCURSESW
+ if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, "
+ "got a str of length %zi",
+ PyUnicode_GET_LENGTH(obj));
+ return 0;
+ }
+ memset(wch->chars, 0, sizeof(wch->chars));
+ wch->chars[0] = buffer[0];
+ return 2;
+#else
+ return PyCurses_ConvertToChtype(win, obj, ch);
+#endif
+ }
+ else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
+ value = (unsigned char)PyBytes_AsString(obj)[0];
+ }
+ else if (PyLong_CheckExact(obj)) {
int overflow;
- /* XXX should the truncation by the cast also be reported
- as an error? */
- *ch = (chtype) PyLong_AsLongAndOverflow(obj, &overflow);
- if (overflow)
+ value = PyLong_AsLongAndOverflow(obj, &overflow);
+ if (overflow) {
+ PyErr_SetString(PyExc_OverflowError,
+ "int doesn't fit in long");
return 0;
- } else if(PyBytes_Check(obj)
- && (PyBytes_Size(obj) == 1)) {
- *ch = (chtype) *PyBytes_AsString(obj);
- } else if (PyUnicode_Check(obj) && PyUnicode_GetSize(obj) == 1) {
- *ch = (chtype) *PyUnicode_AS_UNICODE(obj);
- } else {
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, got %s",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+ }
+
+ *ch = (chtype)value;
+ if ((long)*ch != value) {
+ PyErr_Format(PyExc_OverflowError,
+ "byte doesn't fit in chtype");
return 0;
}
return 1;
}
+/* Convert an object to a byte string (char*) or a wide character string
+ (wchar_t*). Return:
+
+ - 2 if obj is a character string (written into *wch)
+ - 1 if obj is a byte string (written into *bytes)
+ - 0 on error: raise an exception */
+static int
+PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
+ PyObject **bytes, wchar_t **wstr)
+{
+ if (PyUnicode_Check(obj)) {
+#ifdef HAVE_NCURSESW
+ assert (wstr != NULL);
+ *wstr = PyUnicode_AsWideCharString(obj, NULL);
+ if (*wstr == NULL)
+ return 0;
+ return 2;
+#else
+ assert (wstr == NULL);
+ *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
+ if (*bytes == NULL)
+ return 0;
+ return 1;
+#endif
+ }
+ else if (PyBytes_Check(obj)) {
+ Py_INCREF(obj);
+ *bytes = obj;
+ return 1;
+ }
+
+ PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+}
+
/* Function versions of the 3 functions for testing whether curses has been
initialised or not. */
@@ -358,13 +508,37 @@ Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
/* Allocation and deallocation of Window Objects */
static PyObject *
-PyCursesWindow_New(WINDOW *win)
+PyCursesWindow_New(WINDOW *win, const char *encoding)
{
PyCursesWindowObject *wo;
+ if (encoding == NULL) {
+#if defined(MS_WINDOWS)
+ char *buffer[100];
+ UINT cp;
+ cp = GetConsoleOutputCP();
+ if (cp != 0) {
+ PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
+ encoding = buffer;
+ }
+#elif defined(CODESET)
+ const char *codeset = nl_langinfo(CODESET);
+ if (codeset != NULL && codeset[0] != 0)
+ encoding = codeset;
+#endif
+ if (encoding == NULL)
+ encoding = "utf-8";
+ }
+
wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
if (wo == NULL) return NULL;
wo->win = win;
+ wo->encoding = strdup(encoding);
+ if (wo->encoding == NULL) {
+ Py_DECREF(wo);
+ PyErr_NoMemory();
+ return NULL;
+ }
return (PyObject *)wo;
}
@@ -372,6 +546,8 @@ static void
PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
{
if (wo->win != stdscr) delwin(wo->win);
+ if (wo->encoding != NULL)
+ free(wo->encoding);
PyObject_DEL(wo);
}
@@ -381,29 +557,34 @@ static PyObject *
PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
{
int rtn, x, y, use_xy = FALSE;
- PyObject *temp;
- chtype ch = 0;
+ PyObject *chobj;
+ int type;
+ chtype ch;
+#ifdef HAVE_NCURSESW
+ cchar_t wch;
+#endif
attr_t attr = A_NORMAL;
long lattr;
+ const char *funcname;
switch (PyTuple_Size(args)) {
case 1:
- if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
+ if (!PyArg_ParseTuple(args, "O;ch or int", &chobj))
return NULL;
break;
case 2:
- if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
+ if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &chobj, &lattr))
return NULL;
attr = lattr;
break;
case 3:
- if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
+ if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &chobj))
return NULL;
use_xy = TRUE;
break;
case 4:
if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
- &y, &x, &temp, &lattr))
+ &y, &x, &chobj, &lattr))
return NULL;
attr = lattr;
use_xy = TRUE;
@@ -413,17 +594,33 @@ PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
- return NULL;
+#ifdef HAVE_NCURSESW
+ type = PyCurses_ConvertToCchar_t(self, chobj, &ch, &wch);
+ if (type == 2) {
+ funcname = "add_wch";
+ wch.attr = attr;
+ if (use_xy == TRUE)
+ rtn = mvwadd_wch(self->win,y,x, &wch);
+ else {
+ rtn = wadd_wch(self->win, &wch);
+ }
+ }
+ else
+#else
+ type = PyCurses_ConvertToCchar_t(self, chobj, &ch);
+#endif
+ if (type == 1) {
+ funcname = "addch";
+ if (use_xy == TRUE)
+ rtn = mvwaddch(self->win,y,x, ch | attr);
+ else {
+ rtn = waddch(self->win, ch | attr);
+ }
}
-
- if (use_xy == TRUE)
- rtn = mvwaddch(self->win,y,x, ch | attr);
else {
- rtn = waddch(self->win, ch | attr);
+ return NULL;
}
- return PyCursesCheckERR(rtn, "addch");
+ return PyCursesCheckERR(rtn, funcname);
}
static PyObject *
@@ -431,29 +628,34 @@ PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
{
int rtn;
int x, y;
- char *str;
+ int strtype;
+ PyObject *strobj, *bytesobj = NULL;
+#ifdef HAVE_NCURSESW
+ wchar_t *wstr = NULL;
+#endif
attr_t attr = A_NORMAL , attr_old = A_NORMAL;
long lattr;
int use_xy = FALSE, use_attr = FALSE;
+ const char *funcname;
switch (PyTuple_Size(args)) {
case 1:
- if (!PyArg_ParseTuple(args,"s;str", &str))
+ if (!PyArg_ParseTuple(args,"O;str", &strobj))
return NULL;
break;
case 2:
- if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
+ if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
return NULL;
attr = lattr;
use_attr = TRUE;
break;
case 3:
- if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
+ if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
return NULL;
use_xy = TRUE;
break;
case 4:
- if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &lattr))
+ if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
return NULL;
attr = lattr;
use_xy = use_attr = TRUE;
@@ -462,47 +664,74 @@ PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
return NULL;
}
-
+#ifdef HAVE_NCURSESW
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
+#else
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
+#endif
+ if (strtype == 0)
+ return NULL;
if (use_attr == TRUE) {
attr_old = getattrs(self->win);
(void)wattrset(self->win,attr);
}
- if (use_xy == TRUE)
- rtn = mvwaddstr(self->win,y,x,str);
+#ifdef HAVE_NCURSESW
+ if (strtype == 2) {
+ funcname = "addwstr";
+ if (use_xy == TRUE)
+ rtn = mvwaddwstr(self->win,y,x,wstr);
+ else
+ rtn = waddwstr(self->win,wstr);
+ PyMem_Free(wstr);
+ }
else
- rtn = waddstr(self->win,str);
+#endif
+ {
+ char *str = PyBytes_AS_STRING(bytesobj);
+ funcname = "addstr";
+ if (use_xy == TRUE)
+ rtn = mvwaddstr(self->win,y,x,str);
+ else
+ rtn = waddstr(self->win,str);
+ Py_DECREF(bytesobj);
+ }
if (use_attr == TRUE)
(void)wattrset(self->win,attr_old);
- return PyCursesCheckERR(rtn, "addstr");
+ return PyCursesCheckERR(rtn, funcname);
}
static PyObject *
PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
{
int rtn, x, y, n;
- char *str;
+ int strtype;
+ PyObject *strobj, *bytesobj = NULL;
+#ifdef HAVE_NCURSESW
+ wchar_t *wstr = NULL;
+#endif
attr_t attr = A_NORMAL , attr_old = A_NORMAL;
long lattr;
int use_xy = FALSE, use_attr = FALSE;
+ const char *funcname;
switch (PyTuple_Size(args)) {
case 2:
- if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
+ if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
return NULL;
break;
case 3:
- if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
+ if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
return NULL;
attr = lattr;
use_attr = TRUE;
break;
case 4:
- if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
+ if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
return NULL;
use_xy = TRUE;
break;
case 5:
- if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
+ if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
return NULL;
attr = lattr;
use_xy = use_attr = TRUE;
@@ -511,18 +740,41 @@ PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
return NULL;
}
+#ifdef HAVE_NCURSESW
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
+#else
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
+#endif
+ if (strtype == 0)
+ return NULL;
if (use_attr == TRUE) {
attr_old = getattrs(self->win);
(void)wattrset(self->win,attr);
}
- if (use_xy == TRUE)
- rtn = mvwaddnstr(self->win,y,x,str,n);
+#ifdef HAVE_NCURSESW
+ if (strtype == 2) {
+ funcname = "addnwstr";
+ if (use_xy == TRUE)
+ rtn = mvwaddnwstr(self->win,y,x,wstr,n);
+ else
+ rtn = waddnwstr(self->win,wstr,n);
+ PyMem_Free(wstr);
+ }
else
- rtn = waddnstr(self->win,str,n);
+#endif
+ {
+ char *str = PyBytes_AS_STRING(bytesobj);
+ funcname = "addnstr";
+ if (use_xy == TRUE)
+ rtn = mvwaddnstr(self->win,y,x,str,n);
+ else
+ rtn = waddnstr(self->win,str,n);
+ Py_DECREF(bytesobj);
+ }
if (use_attr == TRUE)
(void)wattrset(self->win,attr_old);
- return PyCursesCheckERR(rtn, "addnstr");
+ return PyCursesCheckERR(rtn, funcname);
}
static PyObject *
@@ -548,10 +800,8 @@ PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
- PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
return NULL;
- }
return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
}
@@ -606,10 +856,8 @@ PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
- PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
return NULL;
- }
wbkgdset(self->win, bkgd | attr);
return PyCursesCheckERR(0, "bkgdset");
@@ -634,11 +882,8 @@ PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
return NULL;
for(i=0; i<8; i++) {
- if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
- PyErr_Format(PyExc_TypeError,
- "argument %i must be a ch or an int", i+1);
+ if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
return NULL;
- }
}
wborder(self->win,
@@ -783,7 +1028,7 @@ PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- return (PyObject *)PyCursesWindow_New(win);
+ return (PyObject *)PyCursesWindow_New(win, NULL);
}
static PyObject *
@@ -811,10 +1056,8 @@ PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &ch))
return NULL;
- }
#ifdef WINDOW_HAS_FLAGS
if (self->win->_flags & _ISPAD)
@@ -910,6 +1153,43 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
}
}
+#ifdef HAVE_NCURSESW
+static PyObject *
+PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
+{
+ int x, y;
+ int ct;
+ wint_t rtn;
+
+ switch (PyTuple_Size(args)) {
+ case 0:
+ Py_BEGIN_ALLOW_THREADS
+ ct = wget_wch(self->win,&rtn);
+ Py_END_ALLOW_THREADS
+ break;
+ case 2:
+ if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+ ct = mvwget_wch(self->win,y,x,&rtn);
+ Py_END_ALLOW_THREADS
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
+ return NULL;
+ }
+ if (ct == ERR) {
+ /* get_wch() returns ERR in nodelay mode */
+ PyErr_SetString(PyCursesError, "no input");
+ return NULL;
+ }
+ if (ct == KEY_CODE_YES)
+ return PyLong_FromLong(rtn);
+ else
+ return PyUnicode_FromOrdinal(rtn);
+}
+#endif
+
static PyObject *
PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
{
@@ -1001,11 +1281,8 @@ PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
}
if (code != ERR) {
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError,
- "argument 1 or 3 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &ch))
return NULL;
- }
return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
} else
return PyCursesCheckERR(code, "wmove");
@@ -1046,11 +1323,8 @@ PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError,
- "argument 1 or 3 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &ch))
return NULL;
- }
if (use_xy == TRUE)
rtn = mvwinsch(self->win,y,x, ch | attr);
@@ -1121,29 +1395,34 @@ PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
{
int rtn;
int x, y;
- char *str;
+ int strtype;
+ PyObject *strobj, *bytesobj = NULL;
+#ifdef HAVE_NCURSESW
+ wchar_t *wstr = NULL;
+#endif
attr_t attr = A_NORMAL , attr_old = A_NORMAL;
long lattr;
int use_xy = FALSE, use_attr = FALSE;
+ const char *funcname;
switch (PyTuple_Size(args)) {
case 1:
- if (!PyArg_ParseTuple(args,"s;str", &str))
+ if (!PyArg_ParseTuple(args,"O;str", &strobj))
return NULL;
break;
case 2:
- if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
+ if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
return NULL;
attr = lattr;
use_attr = TRUE;
break;
case 3:
- if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
+ if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
return NULL;
use_xy = TRUE;
break;
case 4:
- if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &lattr))
+ if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
return NULL;
attr = lattr;
use_xy = use_attr = TRUE;
@@ -1153,46 +1432,75 @@ PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
+#ifdef HAVE_NCURSESW
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
+#else
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
+#endif
+ if (strtype == 0)
+ return NULL;
+
if (use_attr == TRUE) {
attr_old = getattrs(self->win);
(void)wattrset(self->win,attr);
}
- if (use_xy == TRUE)
- rtn = mvwinsstr(self->win,y,x,str);
+#ifdef HAVE_NCURSESW
+ if (strtype == 2) {
+ funcname = "inswstr";
+ if (use_xy == TRUE)
+ rtn = mvwins_wstr(self->win,y,x,wstr);
+ else
+ rtn = wins_wstr(self->win,wstr);
+ PyMem_Free(wstr);
+ }
else
- rtn = winsstr(self->win,str);
+#endif
+ {
+ char *str = PyBytes_AS_STRING(bytesobj);
+ funcname = "insstr";
+ if (use_xy == TRUE)
+ rtn = mvwinsstr(self->win,y,x,str);
+ else
+ rtn = winsstr(self->win,str);
+ Py_DECREF(bytesobj);
+ }
if (use_attr == TRUE)
(void)wattrset(self->win,attr_old);
- return PyCursesCheckERR(rtn, "insstr");
+ return PyCursesCheckERR(rtn, funcname);
}
static PyObject *
PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
{
int rtn, x, y, n;
- char *str;
+ int strtype;
+ PyObject *strobj, *bytesobj = NULL;
+#ifdef HAVE_NCURSESW
+ wchar_t *wstr = NULL;
+#endif
attr_t attr = A_NORMAL , attr_old = A_NORMAL;
long lattr;
int use_xy = FALSE, use_attr = FALSE;
+ const char *funcname;
switch (PyTuple_Size(args)) {
case 2:
- if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
+ if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
return NULL;
break;
case 3:
- if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
+ if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
return NULL;
attr = lattr;
use_attr = TRUE;
break;
case 4:
- if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
+ if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
return NULL;
use_xy = TRUE;
break;
case 5:
- if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
+ if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
return NULL;
attr = lattr;
use_xy = use_attr = TRUE;
@@ -1202,17 +1510,41 @@ PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
+#ifdef HAVE_NCURSESW
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
+#else
+ strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
+#endif
+ if (strtype == 0)
+ return NULL;
+
if (use_attr == TRUE) {
attr_old = getattrs(self->win);
(void)wattrset(self->win,attr);
}
- if (use_xy == TRUE)
- rtn = mvwinsnstr(self->win,y,x,str,n);
+#ifdef HAVE_NCURSESW
+ if (strtype == 2) {
+ funcname = "insn_wstr";
+ if (use_xy == TRUE)
+ rtn = mvwins_nwstr(self->win,y,x,wstr,n);
+ else
+ rtn = wins_nwstr(self->win,wstr,n);
+ PyMem_Free(wstr);
+ }
else
- rtn = winsnstr(self->win,str,n);
+#endif
+ {
+ char *str = PyBytes_AS_STRING(bytesobj);
+ funcname = "insnstr";
+ if (use_xy == TRUE)
+ rtn = mvwinsnstr(self->win,y,x,str,n);
+ else
+ rtn = winsnstr(self->win,str,n);
+ Py_DECREF(bytesobj);
+ }
if (use_attr == TRUE)
(void)wattrset(self->win,attr_old);
- return PyCursesCheckERR(rtn, "insnstr");
+ return PyCursesCheckERR(rtn, funcname);
}
static PyObject *
@@ -1385,10 +1717,12 @@ PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
while (1) {
char buf[BUFSIZ];
Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
+ _Py_IDENTIFIER(write);
+
if (n <= 0)
break;
Py_DECREF(res);
- res = PyObject_CallMethod(stream, "write", "y#", buf, n);
+ res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
if (res == NULL)
break;
}
@@ -1493,7 +1827,7 @@ PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
return NULL;
}
- return (PyObject *)PyCursesWindow_New(win);
+ return (PyObject *)PyCursesWindow_New(win, self->encoding);
}
static PyObject *
@@ -1569,16 +1903,52 @@ PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
}
if (code != ERR) {
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError,
- "argument 1 or 3 must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(self, temp, &ch))
return NULL;
- }
return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
} else
return PyCursesCheckERR(code, "wmove");
}
+static PyObject *
+PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
+{
+ return PyUnicode_FromString(self->encoding);
+}
+
+static int
+PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
+{
+ PyObject *ascii;
+ char *encoding;
+
+ /* It is illegal to del win.encoding */
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "encoding may not be deleted");
+ return -1;
+ }
+
+ if (!PyUnicode_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "setting encoding to a non-string");
+ return -1;
+ }
+ ascii = PyUnicode_AsASCIIString(value);
+ if (ascii == NULL)
+ return -1;
+ encoding = strdup(PyBytes_AS_STRING(ascii));
+ Py_DECREF(ascii);
+ if (encoding == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ free(self->encoding);
+ self->encoding = encoding;
+ return 0;
+}
+
+
static PyMethodDef PyCursesWindow_Methods[] = {
{"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
{"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
@@ -1608,6 +1978,9 @@ static PyMethodDef PyCursesWindow_Methods[] = {
{"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
{"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
{"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
+#ifdef HAVE_NCURSESW
+ {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
+#endif
{"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
{"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
{"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
@@ -1663,6 +2036,14 @@ static PyMethodDef PyCursesWindow_Methods[] = {
{NULL, NULL} /* sentinel */
};
+static PyGetSetDef PyCursesWindow_getsets[] = {
+ {"encoding",
+ (getter)PyCursesWindow_get_encoding,
+ (setter)PyCursesWindow_set_encoding,
+ "the typecode character used to create the array"},
+ {NULL, NULL, NULL, NULL } /* sentinel */
+};
+
/* -------------------------------------------------------*/
PyTypeObject PyCursesWindow_Type = {
@@ -1695,6 +2076,8 @@ PyTypeObject PyCursesWindow_Type = {
0, /*tp_iter*/
0, /*tp_iternext*/
PyCursesWindow_Methods, /*tp_methods*/
+ 0, /* tp_members */
+ PyCursesWindow_getsets, /* tp_getset */
};
/*********************************************************************
@@ -1875,6 +2258,7 @@ PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
WINDOW *win;
PyCursesInitialised;
+ _Py_IDENTIFIER(read);
strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
fd = mkstemp(fn);
@@ -1886,7 +2270,7 @@ PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
remove(fn);
return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
}
- data = PyObject_CallMethod(stream, "read", "");
+ data = _PyObject_CallMethodId(stream, &PyId_read, "");
if (data == NULL) {
fclose(fp);
remove(fn);
@@ -1917,7 +2301,7 @@ PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
PyErr_SetString(PyCursesError, catchall_NULL);
return NULL;
}
- return PyCursesWindow_New(win);
+ return PyCursesWindow_New(win, NULL);
}
static PyObject *
@@ -1995,10 +2379,11 @@ static PyObject *
PyCurses_InitScr(PyObject *self)
{
WINDOW *win;
+ PyCursesWindowObject *winobj;
if (initialised == TRUE) {
wrefresh(stdscr);
- return (PyObject *)PyCursesWindow_New(stdscr);
+ return (PyObject *)PyCursesWindow_New(stdscr, NULL);
}
win = initscr();
@@ -2090,7 +2475,9 @@ PyCurses_InitScr(PyObject *self)
SetDictInt("LINES", LINES);
SetDictInt("COLS", COLS);
- return (PyObject *)PyCursesWindow_New(win);
+ winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
+ screen_encoding = winobj->encoding;
+ return (PyObject *)winobj;
}
static PyObject *
@@ -2292,7 +2679,7 @@ PyCurses_NewPad(PyObject *self, PyObject *args)
return NULL;
}
- return (PyObject *)PyCursesWindow_New(win);
+ return (PyObject *)PyCursesWindow_New(win, NULL);
}
static PyObject *
@@ -2324,7 +2711,7 @@ PyCurses_NewWindow(PyObject *self, PyObject *args)
return NULL;
}
- return (PyObject *)PyCursesWindow_New(win);
+ return (PyObject *)PyCursesWindow_New(win, NULL);
}
static PyObject *
@@ -2416,6 +2803,8 @@ update_lines_cols(void)
{
PyObject *o;
PyObject *m = PyImport_ImportModuleNoBlock("curses");
+ _Py_IDENTIFIER(LINES);
+ _Py_IDENTIFIER(COLS);
if (!m)
return 0;
@@ -2425,12 +2814,13 @@ update_lines_cols(void)
Py_DECREF(m);
return 0;
}
- if (PyObject_SetAttrString(m, "LINES", o)) {
+ if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Py_DECREF(m);
Py_DECREF(o);
return 0;
}
- if (PyDict_SetItemString(ModDict, "LINES", o)) {
+ /* PyId_LINES.object will be initialized here. */
+ if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Py_DECREF(m);
Py_DECREF(o);
return 0;
@@ -2441,12 +2831,12 @@ update_lines_cols(void)
Py_DECREF(m);
return 0;
}
- if (PyObject_SetAttrString(m, "COLS", o)) {
+ if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Py_DECREF(m);
Py_DECREF(o);
return 0;
}
- if (PyDict_SetItemString(ModDict, "COLS", o)) {
+ if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Py_DECREF(m);
Py_DECREF(o);
return 0;
@@ -2638,10 +3028,8 @@ PyCurses_UnCtrl(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
return NULL;
- }
return PyBytes_FromString(unctrl(ch));
}
@@ -2654,16 +3042,80 @@ PyCurses_UngetCh(PyObject *self, PyObject *args)
PyCursesInitialised;
- if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
+ if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
+ return NULL;
- if (!PyCurses_ConvertToChtype(temp, &ch)) {
- PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
+ if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
return NULL;
- }
return PyCursesCheckERR(ungetch(ch), "ungetch");
}
+#ifdef HAVE_NCURSESW
+/* Convert an object to a character (wchar_t):
+
+ - int
+ - str of length 1
+
+ Return 1 on success, 0 on error. */
+static int
+PyCurses_ConvertToWchar_t(PyObject *obj,
+ wchar_t *wch)
+{
+ if (PyUnicode_Check(obj)) {
+ wchar_t buffer[2];
+ if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, "
+ "got a str of length %zi",
+ PyUnicode_GET_LENGTH(obj));
+ return 0;
+ }
+ *wch = buffer[0];
+ return 2;
+ }
+ else if (PyLong_CheckExact(obj)) {
+ long value;
+ int overflow;
+ value = PyLong_AsLongAndOverflow(obj, &overflow);
+ if (overflow) {
+ PyErr_SetString(PyExc_OverflowError,
+ "int doesn't fit in long");
+ return 0;
+ }
+ *wch = (wchar_t)value;
+ if ((long)*wch != value) {
+ PyErr_Format(PyExc_OverflowError,
+ "character doesn't fit in wchar_t");
+ return 0;
+ }
+ return 1;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "expect bytes or str of length 1, or int, got %s",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+ }
+}
+
+static PyObject *
+PyCurses_Unget_Wch(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ wchar_t wch;
+
+ PyCursesInitialised;
+
+ if (!PyArg_ParseTuple(args,"O", &obj))
+ return NULL;
+
+ if (!PyCurses_ConvertToWchar_t(obj, &wch))
+ return NULL;
+ return PyCursesCheckERR(unget_wch(wch), "unget_wch");
+}
+#endif
+
static PyObject *
PyCurses_Use_Env(PyObject *self, PyObject *args)
{
@@ -2791,6 +3243,9 @@ static PyMethodDef PyCurses_methods[] = {
{"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
{"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
{"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
+#ifdef HAVE_NCURSESW
+ {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
+#endif
{"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
#ifndef STRICT_SYSV_CURSES
{"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index ef2f7b3..873d46f 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -7,8 +7,6 @@
#include <time.h>
-#include "_time.h"
-
/* Differentiate between building the core module and building extension
* modules.
*/
@@ -766,8 +764,10 @@ typedef struct
PyObject *name;
} PyDateTime_TimeZone;
-/* The interned UTC timezone instance */
+/* The interned UTC timezone instance */
static PyObject *PyDateTime_TimeZone_UTC;
+/* The interned Epoch datetime instance */
+static PyObject *PyDateTime_Epoch;
/* Create new timezone instance checking offset range. This
function does not check the name argument. Caller must assure
@@ -809,14 +809,16 @@ new_timezone(PyObject *offset, PyObject *name)
}
if (GET_TD_MICROSECONDS(offset) != 0 || GET_TD_SECONDS(offset) % 60 != 0) {
PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
- " representing a whole number of minutes");
+ " representing a whole number of minutes,"
+ " not %R.", offset);
return NULL;
}
if ((GET_TD_DAYS(offset) == -1 && GET_TD_SECONDS(offset) == 0) ||
GET_TD_DAYS(offset) < -1 || GET_TD_DAYS(offset) >= 1) {
PyErr_Format(PyExc_ValueError, "offset must be a timedelta"
" strictly between -timedelta(hours=24) and"
- " timedelta(hours=24).");
+ " timedelta(hours=24),"
+ " not %R.", offset);
return NULL;
}
@@ -946,6 +948,7 @@ static PyObject *
call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
{
PyObject *result;
+ _Py_IDENTIFIER(tzname);
assert(tzinfo != NULL);
assert(check_tzinfo_subclass(tzinfo) >= 0);
@@ -954,7 +957,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
if (tzinfo == Py_None)
Py_RETURN_NONE;
- result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);
+ result = _PyObject_CallMethodId(tzinfo, &PyId_tzname, "O", tzinfoarg);
if (result == NULL || result == Py_None)
return result;
@@ -985,9 +988,8 @@ append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo)
if (tzinfo == Py_None)
return repr;
/* Get rid of the trailing ')'. */
- assert(PyUnicode_AS_UNICODE(repr)[PyUnicode_GET_SIZE(repr)-1] == ')');
- temp = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(repr),
- PyUnicode_GET_SIZE(repr) - 1);
+ assert(PyUnicode_READ_CHAR(repr, PyUnicode_GET_LENGTH(repr)-1) == ')');
+ temp = PyUnicode_Substring(repr, 0, PyUnicode_GET_LENGTH(repr) - 1);
Py_DECREF(repr);
if (temp == NULL)
return NULL;
@@ -1079,6 +1081,8 @@ make_Zreplacement(PyObject *object, PyObject *tzinfoarg)
PyObject *temp;
PyObject *tzinfo = get_tzinfo_member(object);
PyObject *Zreplacement = PyUnicode_FromStringAndSize(NULL, 0);
+ _Py_IDENTIFIER(replace);
+
if (Zreplacement == NULL)
return NULL;
if (tzinfo == Py_None || tzinfo == NULL)
@@ -1099,7 +1103,7 @@ make_Zreplacement(PyObject *object, PyObject *tzinfoarg)
* strftime doesn't treat them as format codes.
*/
Py_DECREF(Zreplacement);
- Zreplacement = PyObject_CallMethod(temp, "replace", "ss", "%", "%%");
+ Zreplacement = _PyObject_CallMethodId(temp, &PyId_replace, "ss", "%", "%%");
Py_DECREF(temp);
if (Zreplacement == NULL)
return NULL;
@@ -1166,31 +1170,6 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
if (!pin)
return NULL;
- /* Give up if the year is before 1000.
- * Python strftime() plays games with the year, and different
- * games depending on whether envar PYTHON2K is set. This makes
- * years before 1000 a nightmare, even if the platform strftime
- * supports them (and not all do).
- * We could get a lot farther here by avoiding Python's strftime
- * wrapper and calling the C strftime() directly, but that isn't
- * an option in the Python implementation of this module.
- */
- {
- long year;
- PyObject *pyyear = PySequence_GetItem(timetuple, 0);
- if (pyyear == NULL) return NULL;
- assert(PyLong_Check(pyyear));
- year = PyLong_AsLong(pyyear);
- Py_DECREF(pyyear);
- if (year < 1000) {
- PyErr_Format(PyExc_ValueError, "year=%ld is before "
- "1000; the datetime strftime() "
- "methods require year >= 1000",
- year);
- return NULL;
- }
- }
-
/* Scan the input format, looking for %z/%Z/%f escapes, building
* a new format. Since computing the replacements for those codes
* is expensive, don't unless they're actually used.
@@ -1286,14 +1265,13 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
assert(ptoappend != NULL);
assert(ntoappend > 0);
while (usednew + ntoappend > totalnew) {
- size_t bigger = totalnew << 1;
- if ((bigger >> 1) != totalnew) { /* overflow */
+ if (totalnew > (PY_SSIZE_T_MAX >> 1)) { /* overflow */
PyErr_NoMemory();
goto Done;
}
- if (_PyBytes_Resize(&newfmt, bigger) < 0)
+ totalnew <<= 1;
+ if (_PyBytes_Resize(&newfmt, totalnew) < 0)
goto Done;
- totalnew = bigger;
pnew = PyBytes_AsString(newfmt) + usednew;
}
memcpy(pnew, ptoappend, ntoappend);
@@ -1307,12 +1285,15 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
{
PyObject *format;
PyObject *time = PyImport_ImportModuleNoBlock("time");
+
if (time == NULL)
goto Done;
format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt));
if (format != NULL) {
- result = PyObject_CallMethod(time, "strftime", "OO",
- format, timetuple, NULL);
+ _Py_IDENTIFIER(strftime);
+
+ result = _PyObject_CallMethodId(time, &PyId_strftime, "OO",
+ format, timetuple, NULL);
Py_DECREF(format);
}
Py_DECREF(time);
@@ -1338,7 +1319,9 @@ time_time(void)
PyObject *time = PyImport_ImportModuleNoBlock("time");
if (time != NULL) {
- result = PyObject_CallMethod(time, "time", "()");
+ _Py_IDENTIFIER(time);
+
+ result = _PyObject_CallMethodId(time, &PyId_time, "()");
Py_DECREF(time);
}
return result;
@@ -1355,13 +1338,15 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)
time = PyImport_ImportModuleNoBlock("time");
if (time != NULL) {
- result = PyObject_CallMethod(time, "struct_time",
- "((iiiiiiiii))",
- y, m, d,
- hh, mm, ss,
- weekday(y, m, d),
- days_before_month(y, m) + d,
- dstflag);
+ _Py_IDENTIFIER(struct_time);
+
+ result = _PyObject_CallMethodId(time, &PyId_struct_time,
+ "((iiiiiiiii))",
+ y, m, d,
+ hh, mm, ss,
+ weekday(y, m, d),
+ days_before_month(y, m) + d,
+ dstflag);
Py_DECREF(time);
}
return result;
@@ -1461,7 +1446,7 @@ delta_to_microseconds(PyDateTime_Delta *self)
goto Done;
Py_DECREF(x1);
Py_DECREF(x2);
- x1 = x2 = NULL;
+ /* x1 = */ x2 = NULL;
/* x3 has days+seconds in seconds */
x1 = PyNumber_Multiply(x3, us_per_second); /* us */
@@ -1594,11 +1579,12 @@ multiply_float_timedelta(PyObject *floatobj, PyDateTime_Delta *delta)
PyObject *result = NULL;
PyObject *pyus_in = NULL, *temp, *pyus_out;
PyObject *ratio = NULL;
+ _Py_IDENTIFIER(as_integer_ratio);
pyus_in = delta_to_microseconds(delta);
if (pyus_in == NULL)
return NULL;
- ratio = PyObject_CallMethod(floatobj, "as_integer_ratio", NULL);
+ ratio = _PyObject_CallMethodId(floatobj, &PyId_as_integer_ratio, NULL);
if (ratio == NULL)
goto error;
temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 0));
@@ -1692,11 +1678,12 @@ truedivide_timedelta_float(PyDateTime_Delta *delta, PyObject *f)
PyObject *result = NULL;
PyObject *pyus_in = NULL, *temp, *pyus_out;
PyObject *ratio = NULL;
+ _Py_IDENTIFIER(as_integer_ratio);
pyus_in = delta_to_microseconds(delta);
if (pyus_in == NULL)
return NULL;
- ratio = PyObject_CallMethod(f, "as_integer_ratio", NULL);
+ ratio = _PyObject_CallMethodId(f, &PyId_as_integer_ratio, NULL);
if (ratio == NULL)
goto error;
temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 1));
@@ -1837,8 +1824,7 @@ delta_richcompare(PyObject *self, PyObject *other, int op)
return diff_to_bool(diff, op);
}
else {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
}
@@ -1936,10 +1922,8 @@ delta_remainder(PyObject *left, PyObject *right)
PyObject *pyus_remainder;
PyObject *remainder;
- if (!PyDelta_Check(left) || !PyDelta_Check(right)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyDelta_Check(left) || !PyDelta_Check(right))
+ Py_RETURN_NOTIMPLEMENTED;
pyus_left = delta_to_microseconds((PyDateTime_Delta *)left);
if (pyus_left == NULL)
@@ -1974,10 +1958,8 @@ delta_divmod(PyObject *left, PyObject *right)
PyObject *delta;
PyObject *result;
- if (!PyDelta_Check(left) || !PyDelta_Check(right)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyDelta_Check(left) || !PyDelta_Check(right))
+ Py_RETURN_NOTIMPLEMENTED;
pyus_left = delta_to_microseconds((PyDateTime_Delta *)left);
if (pyus_left == NULL)
@@ -2460,26 +2442,29 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw)
/* Return new date from localtime(t). */
static PyObject *
-date_local_from_time_t(PyObject *cls, double ts)
+date_local_from_object(PyObject *cls, PyObject *obj)
{
struct tm *tm;
time_t t;
- PyObject *result = NULL;
- t = _PyTime_DoubleToTimet(ts);
- if (t == (time_t)-1 && PyErr_Occurred())
+ if (_PyTime_ObjectToTime_t(obj, &t) == -1)
return NULL;
+
tm = localtime(&t);
- if (tm)
- result = PyObject_CallFunction(cls, "iii",
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday);
- else
- PyErr_SetString(PyExc_ValueError,
- "timestamp out of range for "
- "platform localtime() function");
- return result;
+ if (tm == NULL) {
+ /* unconvertible time */
+#ifdef EINVAL
+ if (errno == 0)
+ errno = EINVAL;
+#endif
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ return PyObject_CallFunction(cls, "iii",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday);
}
/* Return new date from current time.
@@ -2492,6 +2477,7 @@ date_today(PyObject *cls, PyObject *dummy)
{
PyObject *time;
PyObject *result;
+ _Py_IDENTIFIER(fromtimestamp);
time = time_time();
if (time == NULL)
@@ -2503,7 +2489,7 @@ date_today(PyObject *cls, PyObject *dummy)
* time.time() delivers; if someone were gonzo about optimization,
* date.today() could get away with plain C time().
*/
- result = PyObject_CallMethod(cls, "fromtimestamp", "O", time);
+ result = _PyObject_CallMethodId(cls, &PyId_fromtimestamp, "O", time);
Py_DECREF(time);
return result;
}
@@ -2512,11 +2498,11 @@ date_today(PyObject *cls, PyObject *dummy)
static PyObject *
date_fromtimestamp(PyObject *cls, PyObject *args)
{
- double timestamp;
+ PyObject *timestamp;
PyObject *result = NULL;
- if (PyArg_ParseTuple(args, "d:fromtimestamp", &timestamp))
- result = date_local_from_time_t(cls, timestamp);
+ if (PyArg_ParseTuple(args, "O:fromtimestamp", &timestamp))
+ result = date_local_from_object(cls, timestamp);
return result;
}
@@ -2571,10 +2557,9 @@ add_date_timedelta(PyDateTime_Date *date, PyDateTime_Delta *delta, int negate)
static PyObject *
date_add(PyObject *left, PyObject *right)
{
- if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (PyDateTime_Check(left) || PyDateTime_Check(right))
+ Py_RETURN_NOTIMPLEMENTED;
+
if (PyDate_Check(left)) {
/* date + ??? */
if (PyDelta_Check(right))
@@ -2593,17 +2578,15 @@ date_add(PyObject *left, PyObject *right)
(PyDateTime_Delta *) left,
0);
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
date_subtract(PyObject *left, PyObject *right)
{
- if (PyDateTime_Check(left) || PyDateTime_Check(right)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (PyDateTime_Check(left) || PyDateTime_Check(right))
+ Py_RETURN_NOTIMPLEMENTED;
+
if (PyDate_Check(left)) {
if (PyDate_Check(right)) {
/* date - date */
@@ -2622,8 +2605,7 @@ date_subtract(PyObject *left, PyObject *right)
1);
}
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
@@ -2648,7 +2630,9 @@ date_isoformat(PyDateTime_Date *self)
static PyObject *
date_str(PyDateTime_Date *self)
{
- return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
+ _Py_IDENTIFIER(isoformat);
+
+ return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()");
}
@@ -2667,13 +2651,14 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
PyObject *result;
PyObject *tuple;
PyObject *format;
+ _Py_IDENTIFIER(timetuple);
static char *keywords[] = {"format", NULL};
if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
&format))
return NULL;
- tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");
+ tuple = _PyObject_CallMethodId((PyObject *)self, &PyId_timetuple, "()");
if (tuple == NULL)
return NULL;
result = wrap_strftime((PyObject *)self, format, tuple,
@@ -2686,15 +2671,16 @@ static PyObject *
date_format(PyDateTime_Date *self, PyObject *args)
{
PyObject *format;
+ _Py_IDENTIFIER(strftime);
if (!PyArg_ParseTuple(args, "U:__format__", &format))
return NULL;
/* if the format is zero length, return str(self) */
- if (PyUnicode_GetSize(format) == 0)
+ if (PyUnicode_GetLength(format) == 0)
return PyObject_Str((PyObject *)self);
- return PyObject_CallMethod((PyObject *)self, "strftime", "O", format);
+ return _PyObject_CallMethodId((PyObject *)self, &PyId_strftime, "O", format);
}
/* ISO methods. */
@@ -2740,10 +2726,8 @@ date_richcompare(PyObject *self, PyObject *other, int op)
_PyDateTime_DATE_DATASIZE);
return diff_to_bool(diff, op);
}
- else {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ else
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
@@ -2775,27 +2759,10 @@ date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
return clone;
}
-/*
- Borrowed from stringobject.c, originally it was string_hash()
-*/
static Py_hash_t
generic_hash(unsigned char *data, int len)
{
- register unsigned char *p;
- register Py_hash_t x;
-
- assert(_Py_HashSecret_Initialized);
- p = (unsigned char *) data;
- x = _Py_HashSecret.prefix;
- x ^= *p << 7;
- while (--len >= 0)
- x = (1000003*x) ^ *p++;
- x ^= len;
- x ^= _Py_HashSecret.suffix;
- if (x == -1)
- x = -2;
-
- return x;
+ return _Py_HashBytes(data, len);
}
@@ -3100,12 +3067,14 @@ tzinfo_reduce(PyObject *self)
{
PyObject *args, *state, *tmp;
PyObject *getinitargs, *getstate;
+ _Py_IDENTIFIER(__getinitargs__);
+ _Py_IDENTIFIER(__getstate__);
tmp = PyTuple_New(0);
if (tmp == NULL)
return NULL;
- getinitargs = PyObject_GetAttrString(self, "__getinitargs__");
+ getinitargs = _PyObject_GetAttrId(self, &PyId___getinitargs__);
if (getinitargs != NULL) {
args = PyObject_CallObject(getinitargs, tmp);
Py_DECREF(getinitargs);
@@ -3120,7 +3089,7 @@ tzinfo_reduce(PyObject *self)
Py_INCREF(args);
}
- getstate = PyObject_GetAttrString(self, "__getstate__");
+ getstate = _PyObject_GetAttrId(self, &PyId___getstate__);
if (getstate != NULL) {
state = PyObject_CallObject(getstate, tmp);
Py_DECREF(getstate);
@@ -3243,10 +3212,8 @@ static PyObject *
timezone_richcompare(PyDateTime_TimeZone *self,
PyDateTime_TimeZone *other, int op)
{
- if (op != Py_EQ && op != Py_NE) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (op != Py_EQ && op != Py_NE)
+ Py_RETURN_NOTIMPLEMENTED;
if (Py_TYPE(other) != &PyDateTime_TimeZoneType) {
if (op == Py_EQ)
Py_RETURN_FALSE;
@@ -3297,7 +3264,6 @@ timezone_repr(PyDateTime_TimeZone *self)
static PyObject *
timezone_str(PyDateTime_TimeZone *self)
{
- char buf[10];
int hours, minutes, seconds;
PyObject *offset;
char sign;
@@ -3323,11 +3289,9 @@ timezone_str(PyDateTime_TimeZone *self)
Py_DECREF(offset);
minutes = divmod(seconds, 60, &seconds);
hours = divmod(minutes, 60, &minutes);
- assert(seconds == 0);
/* XXX ignore sub-minute data, curently not allowed. */
- PyOS_snprintf(buf, sizeof(buf), "UTC%c%02d:%02d", sign, hours, minutes);
-
- return PyUnicode_FromString(buf);
+ assert(seconds == 0);
+ return PyUnicode_FromFormat("UTC%c%02d:%02d", sign, hours, minutes);
}
static PyObject *
@@ -3624,7 +3588,9 @@ time_repr(PyDateTime_Time *self)
static PyObject *
time_str(PyDateTime_Time *self)
{
- return PyObject_CallMethod((PyObject *)self, "isoformat", "()");
+ _Py_IDENTIFIER(isoformat);
+
+ return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()");
}
static PyObject *
@@ -3701,10 +3667,8 @@ time_richcompare(PyObject *self, PyObject *other, int op)
PyObject *offset1, *offset2;
int diff;
- if (! PyTime_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (! PyTime_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
if (GET_TIME_TZINFO(self) == GET_TIME_TZINFO(other)) {
diff = memcmp(((PyDateTime_Time *)self)->data,
@@ -3750,6 +3714,14 @@ time_richcompare(PyObject *self, PyObject *other, int op)
TIME_GET_MICROSECOND(other);
result = diff_to_bool(diff, op);
}
+ else if (op == Py_EQ) {
+ result = Py_False;
+ Py_INCREF(result);
+ }
+ else if (op == Py_NE) {
+ result = Py_True;
+ Py_INCREF(result);
+ }
else {
PyErr_SetString(PyExc_TypeError,
"can't compare offset-naive and "
@@ -4105,33 +4077,33 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
PyObject *tzinfo)
{
struct tm *tm;
- PyObject *result = NULL;
tm = f(&timet);
- if (tm) {
- /* The platform localtime/gmtime may insert leap seconds,
- * indicated by tm->tm_sec > 59. We don't care about them,
- * except to the extent that passing them on to the datetime
- * constructor would raise ValueError for a reason that
- * made no sense to the user.
- */
- if (tm->tm_sec > 59)
- tm->tm_sec = 59;
- result = PyObject_CallFunction(cls, "iiiiiiiO",
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- us,
- tzinfo);
+ if (tm == NULL) {
+#ifdef EINVAL
+ if (errno == 0)
+ errno = EINVAL;
+#endif
+ return PyErr_SetFromErrno(PyExc_OSError);
}
- else
- PyErr_SetString(PyExc_ValueError,
- "timestamp out of range for "
- "platform localtime()/gmtime() function");
- return result;
+
+ /* The platform localtime/gmtime may insert leap seconds,
+ * indicated by tm->tm_sec > 59. We don't care about them,
+ * except to the extent that passing them on to the datetime
+ * constructor would raise ValueError for a reason that
+ * made no sense to the user.
+ */
+ if (tm->tm_sec > 59)
+ tm->tm_sec = 59;
+ return PyObject_CallFunction(cls, "iiiiiiiO",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday,
+ tm->tm_hour,
+ tm->tm_min,
+ tm->tm_sec,
+ us,
+ tzinfo);
}
/* Internal helper.
@@ -4142,32 +4114,15 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
* to get that much precision (e.g., C time() isn't good enough).
*/
static PyObject *
-datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp,
+datetime_from_timestamp(PyObject *cls, TM_FUNC f, PyObject *timestamp,
PyObject *tzinfo)
{
time_t timet;
- double fraction;
- int us;
+ long us;
- timet = _PyTime_DoubleToTimet(timestamp);
- if (timet == (time_t)-1 && PyErr_Occurred())
+ if (_PyTime_ObjectToTimeval(timestamp, &timet, &us) == -1)
return NULL;
- fraction = timestamp - (double)timet;
- us = (int)round_to_long(fraction * 1e6);
- if (us < 0) {
- /* Truncation towards zero is not what we wanted
- for negative numbers (Python's mod semantics) */
- timet -= 1;
- us += 1000000;
- }
- /* If timestamp is less than one microsecond smaller than a
- * full second, round up. Otherwise, ValueErrors are raised
- * for some floats. */
- if (us == 1000000) {
- timet += 1;
- us = 0;
- }
- return datetime_from_timet_and_us(cls, f, timet, us, tzinfo);
+ return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo);
}
/* Internal helper.
@@ -4205,7 +4160,9 @@ datetime_now(PyObject *cls, PyObject *args, PyObject *kw)
if (self != NULL && tzinfo != Py_None) {
/* Convert UTC to tzinfo's zone. */
PyObject *temp = self;
- self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
+ _Py_IDENTIFIER(fromutc);
+
+ self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self);
Py_DECREF(temp);
}
return self;
@@ -4225,11 +4182,11 @@ static PyObject *
datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
{
PyObject *self;
- double timestamp;
+ PyObject *timestamp;
PyObject *tzinfo = Py_None;
static char *keywords[] = {"timestamp", "tz", NULL};
- if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp",
+ if (! PyArg_ParseTupleAndKeywords(args, kw, "O|O:fromtimestamp",
keywords, &timestamp, &tzinfo))
return NULL;
if (check_tzinfo_subclass(tzinfo) < 0)
@@ -4242,7 +4199,9 @@ datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
if (self != NULL && tzinfo != Py_None) {
/* Convert UTC to tzinfo's zone. */
PyObject *temp = self;
- self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);
+ _Py_IDENTIFIER(fromutc);
+
+ self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self);
Py_DECREF(temp);
}
return self;
@@ -4252,10 +4211,10 @@ datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)
static PyObject *
datetime_utcfromtimestamp(PyObject *cls, PyObject *args)
{
- double timestamp;
+ PyObject *timestamp;
PyObject *result = NULL;
- if (PyArg_ParseTuple(args, "d:utcfromtimestamp", &timestamp))
+ if (PyArg_ParseTuple(args, "O:utcfromtimestamp", &timestamp))
result = datetime_from_timestamp(cls, gmtime, timestamp,
Py_None);
return result;
@@ -4266,9 +4225,10 @@ static PyObject *
datetime_strptime(PyObject *cls, PyObject *args)
{
static PyObject *module = NULL;
- const Py_UNICODE *string, *format;
+ PyObject *string, *format;
+ _Py_IDENTIFIER(_strptime_datetime);
- if (!PyArg_ParseTuple(args, "uu:strptime", &string, &format))
+ if (!PyArg_ParseTuple(args, "UU:strptime", &string, &format))
return NULL;
if (module == NULL) {
@@ -4276,8 +4236,8 @@ datetime_strptime(PyObject *cls, PyObject *args)
if (module == NULL)
return NULL;
}
- return PyObject_CallMethod(module, "_strptime_datetime", "Ouu",
- cls, string, format);
+ return _PyObject_CallMethodId(module, &PyId__strptime_datetime, "OOO",
+ cls, string, format);
}
/* Return new datetime from date/datetime and time arguments. */
@@ -4393,8 +4353,7 @@ datetime_add(PyObject *left, PyObject *right)
(PyDateTime_Delta *) left,
1);
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
@@ -4523,7 +4482,9 @@ datetime_repr(PyDateTime_DateTime *self)
static PyObject *
datetime_str(PyDateTime_DateTime *self)
{
- return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " ");
+ _Py_IDENTIFIER(isoformat);
+
+ return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "(s)", " ");
}
static PyObject *
@@ -4596,8 +4557,7 @@ datetime_richcompare(PyObject *self, PyObject *other, int op)
Py_RETURN_TRUE;
return cmperror(self, other);
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
if (GET_DT_TZINFO(self) == GET_DT_TZINFO(other)) {
@@ -4639,6 +4599,14 @@ datetime_richcompare(PyObject *self, PyObject *other, int op)
Py_DECREF(delta);
result = diff_to_bool(diff, op);
}
+ else if (op == Py_EQ) {
+ result = Py_False;
+ Py_INCREF(result);
+ }
+ else if (op == Py_NE) {
+ result = Py_True;
+ Py_INCREF(result);
+ }
else {
PyErr_SetString(PyExc_TypeError,
"can't compare offset-naive and "
@@ -4725,16 +4693,83 @@ datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
}
static PyObject *
+local_timezone(PyDateTime_DateTime *utc_time)
+{
+ PyObject *result = NULL;
+ struct tm *timep;
+ time_t timestamp;
+ PyObject *delta;
+ PyObject *one_second;
+ PyObject *seconds;
+ PyObject *nameo = NULL;
+ const char *zone = NULL;
+
+ delta = datetime_subtract((PyObject *)utc_time, PyDateTime_Epoch);
+ if (delta == NULL)
+ return NULL;
+ one_second = new_delta(0, 1, 0, 0);
+ if (one_second == NULL)
+ goto error;
+ seconds = divide_timedelta_timedelta((PyDateTime_Delta *)delta,
+ (PyDateTime_Delta *)one_second);
+ Py_DECREF(one_second);
+ if (seconds == NULL)
+ goto error;
+ Py_DECREF(delta);
+ timestamp = PyLong_AsLong(seconds);
+ Py_DECREF(seconds);
+ if (timestamp == -1 && PyErr_Occurred())
+ return NULL;
+ timep = localtime(&timestamp);
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ zone = timep->tm_zone;
+ delta = new_delta(0, timep->tm_gmtoff, 0, 1);
+#else /* HAVE_STRUCT_TM_TM_ZONE */
+ {
+ PyObject *local_time;
+ local_time = new_datetime(timep->tm_year + 1900, timep->tm_mon + 1,
+ timep->tm_mday, timep->tm_hour, timep->tm_min,
+ timep->tm_sec, DATE_GET_MICROSECOND(utc_time),
+ utc_time->tzinfo);
+ if (local_time == NULL)
+ goto error;
+ delta = datetime_subtract(local_time, (PyObject*)utc_time);
+ /* XXX: before relying on tzname, we should compare delta
+ to the offset implied by timezone/altzone */
+ if (daylight && timep->tm_isdst >= 0)
+ zone = tzname[timep->tm_isdst % 2];
+ else
+ zone = tzname[0];
+ Py_DECREF(local_time);
+ }
+#endif /* HAVE_STRUCT_TM_TM_ZONE */
+ if (zone != NULL) {
+ nameo = PyUnicode_DecodeLocale(zone, "surrogateescape");
+ if (nameo == NULL)
+ goto error;
+ }
+ result = new_timezone(delta, nameo);
+ Py_DECREF(nameo);
+ error:
+ Py_DECREF(delta);
+ return result;
+}
+
+static PyDateTime_DateTime *
datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
{
- PyObject *result;
+ PyDateTime_DateTime *result;
PyObject *offset;
PyObject *temp;
- PyObject *tzinfo;
+ PyObject *tzinfo = Py_None;
+ _Py_IDENTIFIER(fromutc);
static char *keywords[] = {"tz", NULL};
- if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords,
- &PyDateTime_TZInfoType, &tzinfo))
+ if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:astimezone", keywords,
+ &tzinfo))
+ return NULL;
+
+ if (check_tzinfo_subclass(tzinfo) == -1)
return NULL;
if (!HASTZINFO(self) || self->tzinfo == Py_None)
@@ -4743,7 +4778,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
/* Conversion to self's own time zone is a NOP. */
if (self->tzinfo == tzinfo) {
Py_INCREF(self);
- return (PyObject *)self;
+ return self;
}
/* Convert self to UTC. */
@@ -4759,20 +4794,29 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
}
/* result = self - offset */
- result = add_datetime_timedelta(self,
- (PyDateTime_Delta *)offset, -1);
+ result = (PyDateTime_DateTime *)add_datetime_timedelta(self,
+ (PyDateTime_Delta *)offset, -1);
Py_DECREF(offset);
if (result == NULL)
return NULL;
/* Attach new tzinfo and let fromutc() do the rest. */
- temp = ((PyDateTime_DateTime *)result)->tzinfo;
- ((PyDateTime_DateTime *)result)->tzinfo = tzinfo;
- Py_INCREF(tzinfo);
+ temp = result->tzinfo;
+ if (tzinfo == Py_None) {
+ tzinfo = local_timezone(result);
+ if (tzinfo == NULL) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ }
+ else
+ Py_INCREF(tzinfo);
+ result->tzinfo = tzinfo;
Py_DECREF(temp);
- temp = result;
- result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp);
+ temp = (PyObject *)result;
+ result = (PyDateTime_DateTime *)
+ _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", temp);
Py_DECREF(temp);
return result;
@@ -4804,6 +4848,44 @@ datetime_timetuple(PyDateTime_DateTime *self)
}
static PyObject *
+datetime_timestamp(PyDateTime_DateTime *self)
+{
+ PyObject *result;
+
+ if (HASTZINFO(self) && self->tzinfo != Py_None) {
+ PyObject *delta;
+ delta = datetime_subtract((PyObject *)self, PyDateTime_Epoch);
+ if (delta == NULL)
+ return NULL;
+ result = delta_total_seconds(delta);
+ Py_DECREF(delta);
+ }
+ else {
+ struct tm time;
+ time_t timestamp;
+ memset((void *) &time, '\0', sizeof(struct tm));
+ time.tm_year = GET_YEAR(self) - 1900;
+ time.tm_mon = GET_MONTH(self) - 1;
+ time.tm_mday = GET_DAY(self);
+ time.tm_hour = DATE_GET_HOUR(self);
+ time.tm_min = DATE_GET_MINUTE(self);
+ time.tm_sec = DATE_GET_SECOND(self);
+ time.tm_wday = -1;
+ time.tm_isdst = -1;
+ timestamp = mktime(&time);
+ /* Return value of -1 does not necessarily mean an error, but tm_wday
+ * cannot remain set to -1 if mktime succeeded. */
+ if (timestamp == (time_t)(-1) && time.tm_wday == -1) {
+ PyErr_SetString(PyExc_OverflowError,
+ "timestamp out of range");
+ return NULL;
+ }
+ result = PyFloat_FromDouble(timestamp + DATE_GET_MICROSECOND(self) / 1e6);
+ }
+ return result;
+}
+
+static PyObject *
datetime_getdate(PyDateTime_DateTime *self)
{
return new_date(GET_YEAR(self),
@@ -4950,6 +5032,9 @@ static PyMethodDef datetime_methods[] = {
{"timetuple", (PyCFunction)datetime_timetuple, METH_NOARGS,
PyDoc_STR("Return time tuple, compatible with time.localtime().")},
+ {"timestamp", (PyCFunction)datetime_timestamp, METH_NOARGS,
+ PyDoc_STR("Return POSIX timestamp as float.")},
+
{"utctimetuple", (PyCFunction)datetime_utctimetuple, METH_NOARGS,
PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")},
@@ -5207,6 +5292,12 @@ PyInit__datetime(void)
return NULL;
Py_DECREF(x);
+ /* Epoch */
+ PyDateTime_Epoch = new_datetime(1970, 1, 1, 0, 0, 0, 0,
+ PyDateTime_TimeZone_UTC);
+ if (PyDateTime_Epoch == NULL)
+ return NULL;
+
/* module initialization */
PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);
PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);
diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c
index 827acce..327b873 100644
--- a/Modules/_dbmmodule.c
+++ b/Modules/_dbmmodule.c
@@ -212,6 +212,7 @@ dbm_contains(PyObject *self, PyObject *arg)
{
dbmobject *dp = (dbmobject *)self;
datum key, val;
+ Py_ssize_t size;
if ((dp)->di_dbm == NULL) {
PyErr_SetString(DbmError,
@@ -219,8 +220,9 @@ dbm_contains(PyObject *self, PyObject *arg)
return -1;
}
if (PyUnicode_Check(arg)) {
- arg = _PyUnicode_AsDefaultEncodedString(arg, NULL);
- if (arg == NULL)
+ key.dptr = PyUnicode_AsUTF8AndSize(arg, &size);
+ key.dsize = size;
+ if (key.dptr == NULL)
return -1;
}
if (!PyBytes_Check(arg)) {
@@ -229,8 +231,10 @@ dbm_contains(PyObject *self, PyObject *arg)
arg->ob_type->tp_name);
return -1;
}
- key.dptr = PyBytes_AS_STRING(arg);
- key.dsize = PyBytes_GET_SIZE(arg);
+ else {
+ key.dptr = PyBytes_AS_STRING(arg);
+ key.dsize = PyBytes_GET_SIZE(arg);
+ }
val = dbm_fetch(dp->di_dbm, key);
return val.dptr != NULL;
}
diff --git a/Modules/_decimal/README.txt b/Modules/_decimal/README.txt
new file mode 100644
index 0000000..3b17cff
--- /dev/null
+++ b/Modules/_decimal/README.txt
@@ -0,0 +1,46 @@
+
+
+About
+=====
+
+_decimal.c is a wrapper for the libmpdec library. libmpdec is a fast C
+library for correctly-rounded arbitrary precision decimal floating point
+arithmetic. It is a complete implementation of Mike Cowlishaw/IBM's
+General Decimal Arithmetic Specification.
+
+
+Build process for the module
+============================
+
+As usual, the build process for _decimal.so is driven by setup.py in the top
+level directory. setup.py autodetects the following build configurations:
+
+ 1) x64 - 64-bit Python, x86_64 processor (AMD, Intel)
+
+ 2) uint128 - 64-bit Python, compiler provides __uint128_t (gcc)
+
+ 3) ansi64 - 64-bit Python, ANSI C
+
+ 4) ppro - 32-bit Python, x86 CPU, PentiumPro or later
+
+ 5) ansi32 - 32-bit Python, ANSI C
+
+ 6) ansi-legacy - 32-bit Python, compiler without uint64_t
+
+ 7) universal - Mac OS only (multi-arch)
+
+
+It is possible to override autodetection by exporting:
+
+ PYTHON_DECIMAL_WITH_MACHINE=value, where value is one of the above options.
+
+
+NOTE
+====
+
+decimal.so is not built from a static libmpdec.a since doing so led to
+failures on AIX (user report) and Windows (mixing static and dynamic CRTs
+causes locale problems and more).
+
+
+
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
new file mode 100644
index 0000000..0610a8b
--- /dev/null
+++ b/Modules/_decimal/_decimal.c
@@ -0,0 +1,5690 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <Python.h>
+#include "longintrepr.h"
+#include "pythread.h"
+#include "structmember.h"
+#include "complexobject.h"
+#include "mpdecimal.h"
+
+#include <stdlib.h>
+
+#include "docstrings.h"
+#include "memory.h"
+
+
+/*
+ * Type sizes with assertions in mpdecimal.h and pyport.h:
+ * sizeof(size_t) == sizeof(Py_ssize_t)
+ * sizeof(size_t) == sizeof(mpd_uint_t) == sizeof(mpd_ssize_t)
+ */
+
+#ifdef TEST_COVERAGE
+ #undef Py_LOCAL_INLINE
+ #define Py_LOCAL_INLINE Py_LOCAL
+#endif
+
+#define MPD_Float_operation MPD_Not_implemented
+
+#define BOUNDS_CHECK(x, MIN, MAX) x = (x < MIN || MAX < x) ? MAX : x
+
+
+/* _Py_DEC_MINALLOC >= MPD_MINALLOC */
+#define _Py_DEC_MINALLOC 4
+
+typedef struct {
+ PyObject_HEAD
+ Py_hash_t hash;
+ mpd_t dec;
+ mpd_uint_t data[_Py_DEC_MINALLOC];
+} PyDecObject;
+
+typedef struct {
+ PyObject_HEAD
+ uint32_t *flags;
+} PyDecSignalDictObject;
+
+typedef struct {
+ PyObject_HEAD
+ mpd_context_t ctx;
+ PyObject *traps;
+ PyObject *flags;
+ int capitals;
+#ifndef WITHOUT_THREADS
+ PyThreadState *tstate;
+#endif
+} PyDecContextObject;
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *local;
+ PyObject *global;
+} PyDecContextManagerObject;
+
+
+#undef MPD
+#undef CTX
+static PyTypeObject PyDec_Type;
+static PyTypeObject *PyDecSignalDict_Type;
+static PyTypeObject PyDecContext_Type;
+static PyTypeObject PyDecContextManager_Type;
+#define PyDec_CheckExact(v) (Py_TYPE(v) == &PyDec_Type)
+#define PyDec_Check(v) PyObject_TypeCheck(v, &PyDec_Type)
+#define PyDecSignalDict_Check(v) (Py_TYPE(v) == PyDecSignalDict_Type)
+#define PyDecContext_Check(v) PyObject_TypeCheck(v, &PyDecContext_Type)
+#define MPD(v) (&((PyDecObject *)v)->dec)
+#define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags)
+#define SdFlags(v) (*((PyDecSignalDictObject *)v)->flags)
+#define CTX(v) (&((PyDecContextObject *)v)->ctx)
+#define CtxCaps(v) (((PyDecContextObject *)v)->capitals)
+
+
+Py_LOCAL_INLINE(PyObject *)
+incr_true(void)
+{
+ Py_INCREF(Py_True);
+ return Py_True;
+}
+
+Py_LOCAL_INLINE(PyObject *)
+incr_false(void)
+{
+ Py_INCREF(Py_False);
+ return Py_False;
+}
+
+
+#ifdef WITHOUT_THREADS
+/* Default module context */
+static PyObject *module_context = NULL;
+#else
+/* Key for thread state dictionary */
+static PyObject *tls_context_key = NULL;
+/* Invariant: NULL or the most recently accessed thread local context */
+static PyDecContextObject *cached_context = NULL;
+#endif
+
+/* Template for creating new thread contexts, calling Context() without
+ * arguments and initializing the module_context on first access. */
+static PyObject *default_context_template = NULL;
+/* Basic and extended context templates */
+static PyObject *basic_context_template = NULL;
+static PyObject *extended_context_template = NULL;
+
+
+/* Error codes for functions that return signals or conditions */
+#define DEC_INVALID_SIGNALS (MPD_Max_status+1U)
+#define DEC_ERR_OCCURRED (DEC_INVALID_SIGNALS<<1)
+#define DEC_ERRORS (DEC_INVALID_SIGNALS|DEC_ERR_OCCURRED)
+
+typedef struct {
+ const char *name; /* condition or signal name */
+ const char *fqname; /* fully qualified name */
+ uint32_t flag; /* libmpdec flag */
+ PyObject *ex; /* corresponding exception */
+} DecCondMap;
+
+/* Top level Exception; inherits from ArithmeticError */
+static PyObject *DecimalException = NULL;
+
+/* Exceptions that correspond to IEEE signals */
+#define SUBNORMAL 5
+#define INEXACT 6
+#define ROUNDED 7
+#define SIGNAL_MAP_LEN 9
+static DecCondMap signal_map[] = {
+ {"InvalidOperation", "decimal.InvalidOperation", MPD_IEEE_Invalid_operation, NULL},
+ {"FloatOperation", "decimal.FloatOperation", MPD_Float_operation, NULL},
+ {"DivisionByZero", "decimal.DivisionByZero", MPD_Division_by_zero, NULL},
+ {"Overflow", "decimal.Overflow", MPD_Overflow, NULL},
+ {"Underflow", "decimal.Underflow", MPD_Underflow, NULL},
+ {"Subnormal", "decimal.Subnormal", MPD_Subnormal, NULL},
+ {"Inexact", "decimal.Inexact", MPD_Inexact, NULL},
+ {"Rounded", "decimal.Rounded", MPD_Rounded, NULL},
+ {"Clamped", "decimal.Clamped", MPD_Clamped, NULL},
+ {NULL}
+};
+
+/* Exceptions that inherit from InvalidOperation */
+static DecCondMap cond_map[] = {
+ {"InvalidOperation", "decimal.InvalidOperation", MPD_Invalid_operation, NULL},
+ {"ConversionSyntax", "decimal.ConversionSyntax", MPD_Conversion_syntax, NULL},
+ {"DivisionImpossible", "decimal.DivisionImpossible", MPD_Division_impossible, NULL},
+ {"DivisionUndefined", "decimal.DivisionUndefined", MPD_Division_undefined, NULL},
+ {"InvalidContext", "decimal.InvalidContext", MPD_Invalid_context, NULL},
+#ifdef EXTRA_FUNCTIONALITY
+ {"MallocError", "decimal.MallocError", MPD_Malloc_error, NULL},
+#endif
+ {NULL}
+};
+
+static const char *dec_signal_string[MPD_NUM_FLAGS] = {
+ "Clamped",
+ "InvalidOperation",
+ "DivisionByZero",
+ "InvalidOperation",
+ "InvalidOperation",
+ "InvalidOperation",
+ "Inexact",
+ "InvalidOperation",
+ "InvalidOperation",
+ "InvalidOperation",
+ "FloatOperation",
+ "Overflow",
+ "Rounded",
+ "Subnormal",
+ "Underflow",
+};
+
+static const char *invalid_rounding_err =
+"valid values for rounding are:\n\
+ [ROUND_CEILING, ROUND_FLOOR, ROUND_UP, ROUND_DOWN,\n\
+ ROUND_HALF_UP, ROUND_HALF_DOWN, ROUND_HALF_EVEN,\n\
+ ROUND_05UP]";
+
+static const char *invalid_signals_err =
+"valid values for signals are:\n\
+ [InvalidOperation, FloatOperation, DivisionByZero,\n\
+ Overflow, Underflow, Subnormal, Inexact, Rounded,\n\
+ Clamped]";
+
+#ifdef EXTRA_FUNCTIONALITY
+static const char *invalid_flags_err =
+"valid values for _flags or _traps are:\n\
+ signals:\n\
+ [DecIEEEInvalidOperation, DecFloatOperation, DecDivisionByZero,\n\
+ DecOverflow, DecUnderflow, DecSubnormal, DecInexact, DecRounded,\n\
+ DecClamped]\n\
+ conditions which trigger DecIEEEInvalidOperation:\n\
+ [DecInvalidOperation, DecConversionSyntax, DecDivisionImpossible,\n\
+ DecDivisionUndefined, DecFpuError, DecInvalidContext, DecMallocError]";
+#endif
+
+static int
+value_error_int(const char *mesg)
+{
+ PyErr_SetString(PyExc_ValueError, mesg);
+ return -1;
+}
+
+#ifdef CONFIG_32
+static PyObject *
+value_error_ptr(const char *mesg)
+{
+ PyErr_SetString(PyExc_ValueError, mesg);
+ return NULL;
+}
+#endif
+
+static int
+type_error_int(const char *mesg)
+{
+ PyErr_SetString(PyExc_TypeError, mesg);
+ return -1;
+}
+
+static PyObject *
+type_error_ptr(const char *mesg)
+{
+ PyErr_SetString(PyExc_TypeError, mesg);
+ return NULL;
+}
+
+static int
+runtime_error_int(const char *mesg)
+{
+ PyErr_SetString(PyExc_RuntimeError, mesg);
+ return -1;
+}
+#define INTERNAL_ERROR_INT(funcname) \
+ return runtime_error_int("internal error in " funcname)
+
+static PyObject *
+runtime_error_ptr(const char *mesg)
+{
+ PyErr_SetString(PyExc_RuntimeError, mesg);
+ return NULL;
+}
+#define INTERNAL_ERROR_PTR(funcname) \
+ return runtime_error_ptr("internal error in " funcname)
+
+static void
+dec_traphandler(mpd_context_t *ctx UNUSED) /* GCOV_NOT_REACHED */
+{ /* GCOV_NOT_REACHED */
+ return; /* GCOV_NOT_REACHED */
+}
+
+static PyObject *
+flags_as_exception(uint32_t flags)
+{
+ DecCondMap *cm;
+
+ for (cm = signal_map; cm->name != NULL; cm++) {
+ if (flags&cm->flag) {
+ return cm->ex;
+ }
+ }
+
+ INTERNAL_ERROR_PTR("flags_as_exception"); /* GCOV_NOT_REACHED */
+}
+
+Py_LOCAL_INLINE(uint32_t)
+exception_as_flag(PyObject *ex)
+{
+ DecCondMap *cm;
+
+ for (cm = signal_map; cm->name != NULL; cm++) {
+ if (cm->ex == ex) {
+ return cm->flag;
+ }
+ }
+
+ PyErr_SetString(PyExc_KeyError, invalid_signals_err);
+ return DEC_INVALID_SIGNALS;
+}
+
+static PyObject *
+flags_as_list(uint32_t flags)
+{
+ PyObject *list;
+ DecCondMap *cm;
+
+ list = PyList_New(0);
+ if (list == NULL) {
+ return NULL;
+ }
+
+ for (cm = cond_map; cm->name != NULL; cm++) {
+ if (flags&cm->flag) {
+ if (PyList_Append(list, cm->ex) < 0) {
+ goto error;
+ }
+ }
+ }
+ for (cm = signal_map+1; cm->name != NULL; cm++) {
+ if (flags&cm->flag) {
+ if (PyList_Append(list, cm->ex) < 0) {
+ goto error;
+ }
+ }
+ }
+
+ return list;
+
+error:
+ Py_DECREF(list);
+ return NULL;
+}
+
+static PyObject *
+signals_as_list(uint32_t flags)
+{
+ PyObject *list;
+ DecCondMap *cm;
+
+ list = PyList_New(0);
+ if (list == NULL) {
+ return NULL;
+ }
+
+ for (cm = signal_map; cm->name != NULL; cm++) {
+ if (flags&cm->flag) {
+ if (PyList_Append(list, cm->ex) < 0) {
+ Py_DECREF(list);
+ return NULL;
+ }
+ }
+ }
+
+ return list;
+}
+
+static uint32_t
+list_as_flags(PyObject *list)
+{
+ PyObject *item;
+ uint32_t flags, x;
+ Py_ssize_t n, j;
+
+ assert(PyList_Check(list));
+
+ n = PyList_Size(list);
+ flags = 0;
+ for (j = 0; j < n; j++) {
+ item = PyList_GetItem(list, j);
+ x = exception_as_flag(item);
+ if (x & DEC_ERRORS) {
+ return x;
+ }
+ flags |= x;
+ }
+
+ return flags;
+}
+
+static PyObject *
+flags_as_dict(uint32_t flags)
+{
+ DecCondMap *cm;
+ PyObject *dict;
+
+ dict = PyDict_New();
+ if (dict == NULL) {
+ return NULL;
+ }
+
+ for (cm = signal_map; cm->name != NULL; cm++) {
+ PyObject *b = flags&cm->flag ? Py_True : Py_False;
+ if (PyDict_SetItem(dict, cm->ex, b) < 0) {
+ Py_DECREF(dict);
+ return NULL;
+ }
+ }
+
+ return dict;
+}
+
+static uint32_t
+dict_as_flags(PyObject *val)
+{
+ PyObject *b;
+ DecCondMap *cm;
+ uint32_t flags = 0;
+ int x;
+
+ if (!PyDict_Check(val)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument must be a signal dict");
+ return DEC_INVALID_SIGNALS;
+ }
+
+ if (PyDict_Size(val) != SIGNAL_MAP_LEN) {
+ PyErr_SetString(PyExc_KeyError,
+ "invalid signal dict");
+ return DEC_INVALID_SIGNALS;
+ }
+
+ for (cm = signal_map; cm->name != NULL; cm++) {
+ b = PyDict_GetItemWithError(val, cm->ex);
+ if (b == NULL) {
+ if (PyErr_Occurred()) {
+ return DEC_ERR_OCCURRED;
+ }
+ PyErr_SetString(PyExc_KeyError,
+ "invalid signal dict");
+ return DEC_INVALID_SIGNALS;
+ }
+
+ x = PyObject_IsTrue(b);
+ if (x < 0) {
+ return DEC_ERR_OCCURRED;
+ }
+ if (x == 1) {
+ flags |= cm->flag;
+ }
+ }
+
+ return flags;
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+static uint32_t
+long_as_flags(PyObject *v)
+{
+ long x;
+
+ x = PyLong_AsLong(v);
+ if (x == -1 && PyErr_Occurred()) {
+ return DEC_ERR_OCCURRED;
+ }
+ if (x < 0 || x > (long)MPD_Max_status) {
+ PyErr_SetString(PyExc_TypeError, invalid_flags_err);
+ return DEC_INVALID_SIGNALS;
+ }
+
+ return x;
+}
+#endif
+
+static int
+dec_addstatus(PyObject *context, uint32_t status)
+{
+ mpd_context_t *ctx = CTX(context);
+
+ ctx->status |= status;
+ if (status & (ctx->traps|MPD_Malloc_error)) {
+ PyObject *ex, *siglist;
+
+ if (status & MPD_Malloc_error) {
+ PyErr_NoMemory();
+ return 1;
+ }
+
+ ex = flags_as_exception(ctx->traps&status);
+ if (ex == NULL) {
+ return 1; /* GCOV_NOT_REACHED */
+ }
+ siglist = flags_as_list(ctx->traps&status);
+ if (siglist == NULL) {
+ return 1;
+ }
+
+ PyErr_SetObject(ex, siglist);
+ Py_DECREF(siglist);
+ return 1;
+ }
+ return 0;
+}
+
+
+/******************************************************************************/
+/* SignalDict Object */
+/******************************************************************************/
+
+/* The SignalDict is a MutableMapping that provides access to the
+ mpd_context_t flags, which reside in the context object. When a
+ new context is created, context.traps and context.flags are
+ initialized to new SignalDicts. Once a SignalDict is tied to
+ a context, it cannot be deleted. */
+
+static int
+signaldict_init(PyObject *self, PyObject *args UNUSED, PyObject *kwds UNUSED)
+{
+ SdFlagAddr(self) = NULL;
+ return 0;
+}
+
+static Py_ssize_t
+signaldict_len(PyObject *self UNUSED)
+{
+ return SIGNAL_MAP_LEN;
+}
+
+static PyObject *SignalTuple;
+static PyObject *
+signaldict_iter(PyObject *self UNUSED)
+{
+ return PyTuple_Type.tp_iter(SignalTuple);
+}
+
+static PyObject *
+signaldict_getitem(PyObject *self, PyObject *key)
+{
+ uint32_t flag;
+
+ flag = exception_as_flag(key);
+ if (flag & DEC_ERRORS) {
+ return NULL;
+ }
+
+ return SdFlags(self)&flag ? incr_true() : incr_false();
+}
+
+static int
+signaldict_setitem(PyObject *self, PyObject *key, PyObject *value)
+{
+ uint32_t flag;
+ int x;
+
+ if (value == NULL) {
+ return value_error_int("signal keys cannot be deleted");
+ }
+
+ flag = exception_as_flag(key);
+ if (flag & DEC_ERRORS) {
+ return -1;
+ }
+
+ x = PyObject_IsTrue(value);
+ if (x < 0) {
+ return -1;
+ }
+
+ if (x == 1) {
+ SdFlags(self) |= flag;
+ }
+ else {
+ SdFlags(self) &= ~flag;
+ }
+
+ return 0;
+}
+
+static PyObject *
+signaldict_repr(PyObject *self)
+{
+ DecCondMap *cm;
+ const char *n[SIGNAL_MAP_LEN]; /* name */
+ const char *b[SIGNAL_MAP_LEN]; /* bool */
+ int i;
+
+ assert(SIGNAL_MAP_LEN == 9);
+
+ for (cm=signal_map, i=0; cm->name != NULL; cm++, i++) {
+ n[i] = cm->fqname;
+ b[i] = SdFlags(self)&cm->flag ? "True" : "False";
+ }
+ return PyUnicode_FromFormat(
+ "{<class '%s'>:%s, <class '%s'>:%s, <class '%s'>:%s, "
+ "<class '%s'>:%s, <class '%s'>:%s, <class '%s'>:%s, "
+ "<class '%s'>:%s, <class '%s'>:%s, <class '%s'>:%s}",
+ n[0], b[0], n[1], b[1], n[2], b[2],
+ n[3], b[3], n[4], b[4], n[5], b[5],
+ n[6], b[6], n[7], b[7], n[8], b[8]);
+}
+
+static PyObject *
+signaldict_richcompare(PyObject *v, PyObject *w, int op)
+{
+ PyObject *res = Py_NotImplemented;
+
+ assert(PyDecSignalDict_Check(v));
+
+ if (op == Py_EQ || op == Py_NE) {
+ if (PyDecSignalDict_Check(w)) {
+ res = (SdFlags(v)==SdFlags(w)) ^ (op==Py_NE) ? Py_True : Py_False;
+ }
+ else if (PyDict_Check(w)) {
+ uint32_t flags = dict_as_flags(w);
+ if (flags & DEC_ERRORS) {
+ if (flags & DEC_INVALID_SIGNALS) {
+ /* non-comparable: Py_NotImplemented */
+ PyErr_Clear();
+ }
+ else {
+ return NULL;
+ }
+ }
+ else {
+ res = (SdFlags(v)==flags) ^ (op==Py_NE) ? Py_True : Py_False;
+ }
+ }
+ }
+
+ Py_INCREF(res);
+ return res;
+}
+
+static PyObject *
+signaldict_copy(PyObject *self, PyObject *args UNUSED)
+{
+ return flags_as_dict(SdFlags(self));
+}
+
+
+static PyMappingMethods signaldict_as_mapping = {
+ (lenfunc)signaldict_len, /* mp_length */
+ (binaryfunc)signaldict_getitem, /* mp_subscript */
+ (objobjargproc)signaldict_setitem /* mp_ass_subscript */
+};
+
+static PyMethodDef signaldict_methods[] = {
+ { "copy", (PyCFunction)signaldict_copy, METH_NOARGS, NULL},
+ {NULL, NULL}
+};
+
+
+static PyTypeObject PyDecSignalDictMixin_Type =
+{
+ PyVarObject_HEAD_INIT(0, 0)
+ "decimal.SignalDictMixin", /* tp_name */
+ sizeof(PyDecSignalDictObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ 0, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) 0, /* tp_getattr */
+ (setattrfunc) 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc) signaldict_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ &signaldict_as_mapping, /* tp_as_mapping */
+ PyObject_HashNotImplemented, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc) 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ (setattrofunc) 0, /* tp_setattro */
+ (PyBufferProcs *) 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|
+ Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ signaldict_richcompare, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)signaldict_iter, /* tp_iter */
+ 0, /* tp_iternext */
+ signaldict_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)signaldict_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+/******************************************************************************/
+/* Context Object, Part 1 */
+/******************************************************************************/
+
+#define Dec_CONTEXT_GET_SSIZE(mem) \
+static PyObject * \
+context_get##mem(PyObject *self, void *closure UNUSED) \
+{ \
+ return PyLong_FromSsize_t(mpd_get##mem(CTX(self))); \
+}
+
+#define Dec_CONTEXT_GET_ULONG(mem) \
+static PyObject * \
+context_get##mem(PyObject *self, void *closure UNUSED) \
+{ \
+ return PyLong_FromUnsignedLong(mpd_get##mem(CTX(self))); \
+}
+
+Dec_CONTEXT_GET_SSIZE(prec)
+Dec_CONTEXT_GET_SSIZE(emax)
+Dec_CONTEXT_GET_SSIZE(emin)
+Dec_CONTEXT_GET_SSIZE(round)
+Dec_CONTEXT_GET_SSIZE(clamp)
+
+#ifdef EXTRA_FUNCTIONALITY
+Dec_CONTEXT_GET_ULONG(traps)
+Dec_CONTEXT_GET_ULONG(status)
+#endif
+
+static PyObject *
+context_getcapitals(PyObject *self, void *closure UNUSED)
+{
+ return PyLong_FromLong(CtxCaps(self));
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+static PyObject *
+context_getallcr(PyObject *self, void *closure UNUSED)
+{
+ return PyLong_FromLong(mpd_getcr(CTX(self)));
+}
+#endif
+
+static PyObject *
+context_getetiny(PyObject *self, PyObject *dummy UNUSED)
+{
+ return PyLong_FromSsize_t(mpd_etiny(CTX(self)));
+}
+
+static PyObject *
+context_getetop(PyObject *self, PyObject *dummy UNUSED)
+{
+ return PyLong_FromSsize_t(mpd_etop(CTX(self)));
+}
+
+static int
+context_setprec(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetprec(ctx, x)) {
+ return value_error_int(
+ "valid range for prec is [1, MAX_PREC]");
+ }
+
+ return 0;
+}
+
+static int
+context_setemin(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetemin(ctx, x)) {
+ return value_error_int(
+ "valid range for Emin is [MIN_EMIN, 0]");
+ }
+
+ return 0;
+}
+
+static int
+context_setemax(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetemax(ctx, x)) {
+ return value_error_int(
+ "valid range for Emax is [0, MAX_EMAX]");
+ }
+
+ return 0;
+}
+
+#ifdef CONFIG_32
+static PyObject *
+context_unsafe_setprec(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx = CTX(self);
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+
+ if (x < 1 || x > 1070000000L) {
+ return value_error_ptr(
+ "valid range for unsafe prec is [1, 1070000000]");
+ }
+
+ ctx->prec = x;
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+context_unsafe_setemin(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx = CTX(self);
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+
+ if (x < -1070000000L || x > 0) {
+ return value_error_ptr(
+ "valid range for unsafe emin is [-1070000000, 0]");
+ }
+
+ ctx->emin = x;
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+context_unsafe_setemax(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx = CTX(self);
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+
+ if (x < 0 || x > 1070000000L) {
+ return value_error_ptr(
+ "valid range for unsafe emax is [0, 1070000000]");
+ }
+
+ ctx->emax = x;
+ Py_RETURN_NONE;
+}
+#endif
+
+static int
+context_setround(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ BOUNDS_CHECK(x, INT_MIN, INT_MAX);
+
+ ctx = CTX(self);
+ if (!mpd_qsetround(ctx, (int)x)) {
+ return type_error_int(invalid_rounding_err);
+ }
+
+ return 0;
+}
+
+static int
+context_setcapitals(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+
+ if (x != 0 && x != 1) {
+ return value_error_int(
+ "valid values for capitals are 0 or 1");
+ }
+ CtxCaps(self) = (int)x;
+
+ return 0;
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+static int
+context_settraps(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ flags = long_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsettraps(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_settraps");
+ }
+
+ return 0;
+}
+#endif
+
+static int
+context_settraps_list(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ flags = list_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsettraps(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_settraps_list");
+ }
+
+ return 0;
+}
+
+static int
+context_settraps_dict(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ if (PyDecSignalDict_Check(value)) {
+ flags = SdFlags(value);
+ }
+ else {
+ flags = dict_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsettraps(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_settraps_dict");
+ }
+
+ return 0;
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+static int
+context_setstatus(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ flags = long_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetstatus(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_setstatus");
+ }
+
+ return 0;
+}
+#endif
+
+static int
+context_setstatus_list(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ flags = list_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetstatus(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_setstatus_list");
+ }
+
+ return 0;
+}
+
+static int
+context_setstatus_dict(PyObject *self, PyObject *value)
+{
+ mpd_context_t *ctx;
+ uint32_t flags;
+
+ if (PyDecSignalDict_Check(value)) {
+ flags = SdFlags(value);
+ }
+ else {
+ flags = dict_as_flags(value);
+ if (flags & DEC_ERRORS) {
+ return -1;
+ }
+ }
+
+ ctx = CTX(self);
+ if (!mpd_qsetstatus(ctx, flags)) {
+ INTERNAL_ERROR_INT("context_setstatus_dict");
+ }
+
+ return 0;
+}
+
+static int
+context_setclamp(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ BOUNDS_CHECK(x, INT_MIN, INT_MAX);
+
+ ctx = CTX(self);
+ if (!mpd_qsetclamp(ctx, (int)x)) {
+ return value_error_int("valid values for clamp are 0 or 1");
+ }
+
+ return 0;
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+static int
+context_setallcr(PyObject *self, PyObject *value, void *closure UNUSED)
+{
+ mpd_context_t *ctx;
+ mpd_ssize_t x;
+
+ x = PyLong_AsSsize_t(value);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ BOUNDS_CHECK(x, INT_MIN, INT_MAX);
+
+ ctx = CTX(self);
+ if (!mpd_qsetcr(ctx, (int)x)) {
+ return value_error_int("valid values for _allcr are 0 or 1");
+ }
+
+ return 0;
+}
+#endif
+
+static PyObject *
+context_getattr(PyObject *self, PyObject *name)
+{
+ PyObject *retval;
+
+ if (PyUnicode_Check(name)) {
+ if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) {
+ retval = ((PyDecContextObject *)self)->traps;
+ Py_INCREF(retval);
+ return retval;
+ }
+ if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) {
+ retval = ((PyDecContextObject *)self)->flags;
+ Py_INCREF(retval);
+ return retval;
+ }
+ }
+
+ return PyObject_GenericGetAttr(self, name);
+}
+
+static int
+context_setattr(PyObject *self, PyObject *name, PyObject *value)
+{
+ if (value == NULL) {
+ PyErr_SetString(PyExc_AttributeError,
+ "context attributes cannot be deleted");
+ return -1;
+ }
+
+ if (PyUnicode_Check(name)) {
+ if (PyUnicode_CompareWithASCIIString(name, "traps") == 0) {
+ return context_settraps_dict(self, value);
+ }
+ if (PyUnicode_CompareWithASCIIString(name, "flags") == 0) {
+ return context_setstatus_dict(self, value);
+ }
+ }
+
+ return PyObject_GenericSetAttr(self, name, value);
+}
+
+static PyObject *
+context_clear_traps(PyObject *self, PyObject *dummy UNUSED)
+{
+ CTX(self)->traps = 0;
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+context_clear_flags(PyObject *self, PyObject *dummy UNUSED)
+{
+ CTX(self)->status = 0;
+ Py_RETURN_NONE;
+}
+
+#define DEC_DFLT_EMAX 999999
+#define DEC_DFLT_EMIN -999999
+
+static mpd_context_t dflt_ctx = {
+ 28, DEC_DFLT_EMAX, DEC_DFLT_EMIN,
+ MPD_IEEE_Invalid_operation|MPD_Division_by_zero|MPD_Overflow,
+ 0, 0, MPD_ROUND_HALF_EVEN, 0, 1
+};
+
+static PyObject *
+context_new(PyTypeObject *type, PyObject *args UNUSED, PyObject *kwds UNUSED)
+{
+ PyDecContextObject *self = NULL;
+ mpd_context_t *ctx;
+
+ if (type == &PyDecContext_Type) {
+ self = PyObject_New(PyDecContextObject, &PyDecContext_Type);
+ }
+ else {
+ self = (PyDecContextObject *)type->tp_alloc(type, 0);
+ }
+
+ if (self == NULL) {
+ return NULL;
+ }
+
+ self->traps = PyObject_CallObject((PyObject *)PyDecSignalDict_Type, NULL);
+ if (self->traps == NULL) {
+ self->flags = NULL;
+ Py_DECREF(self);
+ return NULL;
+ }
+ self->flags = PyObject_CallObject((PyObject *)PyDecSignalDict_Type, NULL);
+ if (self->flags == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
+
+ ctx = CTX(self);
+
+ if (default_context_template) {
+ *ctx = *CTX(default_context_template);
+ }
+ else {
+ *ctx = dflt_ctx;
+ }
+
+ SdFlagAddr(self->traps) = &ctx->traps;
+ SdFlagAddr(self->flags) = &ctx->status;
+
+ CtxCaps(self) = 1;
+#ifndef WITHOUT_THREADS
+ self->tstate = NULL;
+#endif
+
+ return (PyObject *)self;
+}
+
+static void
+context_dealloc(PyDecContextObject *self)
+{
+#ifndef WITHOUT_THREADS
+ if (self == cached_context) {
+ cached_context = NULL;
+ }
+#endif
+ Py_XDECREF(self->traps);
+ Py_XDECREF(self->flags);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+getround(PyObject *v)
+{
+ const char *s;
+ long x;
+ int i;
+
+ if (PyLong_Check(v)) {
+ x = PyLong_AsLong(v);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ BOUNDS_CHECK(x, 0, INT_MAX);
+ return (int)x;
+ }
+ else if (PyUnicode_Check(v)) {
+ for (i = 0; i < MPD_ROUND_GUARD; i++) {
+ s = mpd_round_string[i];
+ if (PyUnicode_CompareWithASCIIString(v, s) == 0) {
+ return i;
+ }
+ }
+ }
+
+ return type_error_int("invalid rounding mode");
+}
+
+static int
+context_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {
+ "prec", "rounding", "Emin", "Emax", "capitals", "clamp",
+ "flags", "traps", NULL
+ };
+ PyObject *rounding = NULL;
+ PyObject *traps = NULL;
+ PyObject *status = NULL;
+ mpd_context_t *ctx, t;
+ int capitals = 1;
+ int ret;
+
+ assert(PyTuple_Check(args));
+ ctx = CTX(self);
+
+ t = *ctx;
+ if (!PyArg_ParseTupleAndKeywords(
+ args, kwds,
+ "|nOnniiOO", kwlist,
+ &t.prec, &rounding, &t.emin, &t.emax, &capitals, &t.clamp,
+ &status, &traps
+ )) {
+ return -1;
+ }
+ if (rounding != NULL) {
+ t.round = getround(rounding);
+ if (t.round < 0) {
+ return -1;
+ }
+ }
+
+ if (!mpd_qsetprec(ctx, t.prec) ||
+ !mpd_qsetemin(ctx, t.emin) ||
+ !mpd_qsetemax(ctx, t.emax) ||
+ !mpd_qsetclamp(ctx, t.clamp)) {
+ return value_error_int("invalid context");
+ }
+ if (!mpd_qsetround(ctx, t.round) ||
+ !mpd_qsettraps(ctx, t.traps) ||
+ !mpd_qsetstatus(ctx, t.status)) {
+ return type_error_int("invalid context");
+ }
+
+ if (capitals != 0 && capitals != 1) {
+ return value_error_int("invalid context");
+ }
+ CtxCaps(self) = capitals;
+
+ if (traps != NULL) {
+ if (PyList_Check(traps)) {
+ ret = context_settraps_list(self, traps);
+ }
+#ifdef EXTRA_FUNCTIONALITY
+ else if (PyLong_Check(traps)) {
+ ret = context_settraps(self, traps, NULL);
+ }
+#endif
+ else {
+ ret = context_settraps_dict(self, traps);
+ }
+ if (ret < 0) {
+ return ret;
+ }
+ }
+ if (status != NULL) {
+ if (PyList_Check(status)) {
+ ret = context_setstatus_list(self, status);
+ }
+#ifdef EXTRA_FUNCTIONALITY
+ else if (PyLong_Check(status)) {
+ ret = context_setstatus(self, status, NULL);
+ }
+#endif
+ else {
+ ret = context_setstatus_dict(self, status);
+ }
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static PyObject *
+context_repr(PyDecContextObject *self)
+{
+ mpd_context_t *ctx;
+ char flags[MPD_MAX_SIGNAL_LIST];
+ char traps[MPD_MAX_SIGNAL_LIST];
+ int n, mem;
+
+ assert(PyDecContext_Check(self));
+ ctx = CTX(self);
+
+ mem = MPD_MAX_SIGNAL_LIST;
+ n = mpd_lsnprint_signals(flags, mem, ctx->status, dec_signal_string);
+ if (n < 0 || n >= mem) {
+ INTERNAL_ERROR_PTR("context_repr");
+ }
+
+ n = mpd_lsnprint_signals(traps, mem, ctx->traps, dec_signal_string);
+ if (n < 0 || n >= mem) {
+ INTERNAL_ERROR_PTR("context_repr");
+ }
+
+ return PyUnicode_FromFormat(
+ "Context(prec=%zd, rounding=%s, Emin=%zd, Emax=%zd, "
+ "capitals=%d, clamp=%d, flags=%s, traps=%s)",
+ ctx->prec, mpd_round_string[ctx->round], ctx->emin, ctx->emax,
+ self->capitals, ctx->clamp, flags, traps);
+}
+
+static void
+init_basic_context(PyObject *v)
+{
+ mpd_context_t ctx = dflt_ctx;
+
+ ctx.prec = 9;
+ ctx.traps |= (MPD_Underflow|MPD_Clamped);
+ ctx.round = MPD_ROUND_HALF_UP;
+
+ *CTX(v) = ctx;
+ CtxCaps(v) = 1;
+}
+
+static void
+init_extended_context(PyObject *v)
+{
+ mpd_context_t ctx = dflt_ctx;
+
+ ctx.prec = 9;
+ ctx.traps = 0;
+
+ *CTX(v) = ctx;
+ CtxCaps(v) = 1;
+}
+
+#ifdef EXTRA_FUNCTIONALITY
+/* Factory function for creating IEEE interchange format contexts */
+static PyObject *
+ieee_context(PyObject *dummy UNUSED, PyObject *v)
+{
+ PyObject *context;
+ mpd_ssize_t bits;
+ mpd_context_t ctx;
+
+ bits = PyLong_AsSsize_t(v);
+ if (bits == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ if (bits <= 0 || bits > INT_MAX) {
+ goto error;
+ }
+ if (mpd_ieee_context(&ctx, (int)bits) < 0) {
+ goto error;
+ }
+
+ context = PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL);
+ if (context == NULL) {
+ return NULL;
+ }
+ *CTX(context) = ctx;
+
+ return context;
+
+error:
+ PyErr_Format(PyExc_ValueError,
+ "argument must be a multiple of 32, with a maximum of %d",
+ MPD_IEEE_CONTEXT_MAX_BITS);
+
+ return NULL;
+}
+#endif
+
+static PyObject *
+context_copy(PyObject *self, PyObject *args UNUSED)
+{
+ PyObject *copy;
+
+ copy = PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL);
+ if (copy == NULL) {
+ return NULL;
+ }
+
+ *CTX(copy) = *CTX(self);
+ CTX(copy)->newtrap = 0;
+ CtxCaps(copy) = CtxCaps(self);
+
+ return copy;
+}
+
+static PyObject *
+context_reduce(PyObject *self, PyObject *args UNUSED)
+{
+ PyObject *flags;
+ PyObject *traps;
+ PyObject *ret;
+ mpd_context_t *ctx;
+
+ ctx = CTX(self);
+
+ flags = signals_as_list(ctx->status);
+ if (flags == NULL) {
+ return NULL;
+ }
+ traps = signals_as_list(ctx->traps);
+ if (traps == NULL) {
+ Py_DECREF(flags);
+ return NULL;
+ }
+
+ ret = Py_BuildValue(
+ "O(nsnniiOO)",
+ Py_TYPE(self),
+ ctx->prec, mpd_round_string[ctx->round], ctx->emin, ctx->emax,
+ CtxCaps(self), ctx->clamp, flags, traps
+ );
+
+ Py_DECREF(flags);
+ Py_DECREF(traps);
+ return ret;
+}
+
+
+static PyGetSetDef context_getsets [] =
+{
+ { "prec", (getter)context_getprec, (setter)context_setprec, NULL, NULL},
+ { "Emax", (getter)context_getemax, (setter)context_setemax, NULL, NULL},
+ { "Emin", (getter)context_getemin, (setter)context_setemin, NULL, NULL},
+ { "rounding", (getter)context_getround, (setter)context_setround, NULL, NULL},
+ { "capitals", (getter)context_getcapitals, (setter)context_setcapitals, NULL, NULL},
+ { "clamp", (getter)context_getclamp, (setter)context_setclamp, NULL, NULL},
+#ifdef EXTRA_FUNCTIONALITY
+ { "_allcr", (getter)context_getallcr, (setter)context_setallcr, NULL, NULL},
+ { "_traps", (getter)context_gettraps, (setter)context_settraps, NULL, NULL},
+ { "_flags", (getter)context_getstatus, (setter)context_setstatus, NULL, NULL},
+#endif
+ {NULL}
+};
+
+
+#define CONTEXT_CHECK(obj) \
+ if (!PyDecContext_Check(obj)) { \
+ PyErr_SetString(PyExc_TypeError, \
+ "argument must be a context"); \
+ return NULL; \
+ }
+
+#define CONTEXT_CHECK_VA(obj) \
+ if (!PyDecContext_Check(obj)) { \
+ PyErr_SetString(PyExc_TypeError, \
+ "optional argument must be a context"); \
+ return NULL; \
+ }
+
+
+/******************************************************************************/
+/* Global, thread local and temporary contexts */
+/******************************************************************************/
+
+#ifdef WITHOUT_THREADS
+/* Return borrowed reference to the current context. When compiled
+ * without threads, this is always the module context. */
+static int module_context_set = 0;
+static PyObject *
+current_context(void)
+{
+ /* In decimal.py, the module context is automatically initialized
+ * from the DefaultContext when it is first accessed. This
+ * complicates the code and has a speed penalty of 1-2%. */
+ if (module_context_set) {
+ return module_context;
+ }
+
+ *CTX(module_context) = *CTX(default_context_template);
+ CTX(module_context)->status = 0;
+ CTX(module_context)->newtrap = 0;
+ CtxCaps(module_context) = CtxCaps(default_context_template);
+
+ module_context_set = 1;
+ return module_context;
+}
+
+/* ctxobj := borrowed reference to the current context */
+#define CURRENT_CONTEXT(ctxobj) \
+ ctxobj = current_context()
+
+/* ctx := pointer to the mpd_context_t struct of the current context */
+#define CURRENT_CONTEXT_ADDR(ctx) \
+ ctx = CTX(current_context())
+
+/* Return a new reference to the current context */
+static PyObject *
+PyDec_GetCurrentContext(PyObject *self UNUSED, PyObject *args UNUSED)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+
+ Py_INCREF(context);
+ return context;
+}
+
+/* Set the module context to a new context, decrement old reference */
+static PyObject *
+PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
+{
+ CONTEXT_CHECK(v);
+
+ /* If the new context is one of the templates, make a copy.
+ * This is the current behavior of decimal.py. */
+ if (v == default_context_template ||
+ v == basic_context_template ||
+ v == extended_context_template) {
+ v = context_copy(v, NULL);
+ if (v == NULL) {
+ return NULL;
+ }
+ CTX(v)->status = 0;
+ }
+ else {
+ Py_INCREF(v);
+ }
+
+ Py_XDECREF(module_context);
+ module_context = v;
+ module_context_set = 1;
+ Py_RETURN_NONE;
+}
+#else
+/*
+ * Thread local storage currently has a speed penalty of about 4%.
+ * All functions that map Python's arithmetic operators to mpdecimal
+ * functions have to look up the current context for each and every
+ * operation.
+ */
+
+/* Get the context from the thread state dictionary. */
+static PyObject *
+current_context_from_dict(void)
+{
+ PyObject *dict;
+ PyObject *tl_context;
+ PyThreadState *tstate;
+
+ dict = PyThreadState_GetDict();
+ if (dict == NULL) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot get thread state");
+ return NULL;
+ }
+
+ tl_context = PyDict_GetItemWithError(dict, tls_context_key);
+ if (tl_context != NULL) {
+ /* We already have a thread local context. */
+ CONTEXT_CHECK(tl_context);
+ }
+ else {
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+
+ /* Set up a new thread local context. */
+ tl_context = context_copy(default_context_template, NULL);
+ if (tl_context == NULL) {
+ return NULL;
+ }
+ CTX(tl_context)->status = 0;
+
+ if (PyDict_SetItem(dict, tls_context_key, tl_context) < 0) {
+ Py_DECREF(tl_context);
+ return NULL;
+ }
+ Py_DECREF(tl_context);
+ }
+
+ /* Cache the context of the current thread, assuming that it
+ * will be accessed several times before a thread switch. */
+ tstate = PyThreadState_GET();
+ if (tstate) {
+ cached_context = (PyDecContextObject *)tl_context;
+ cached_context->tstate = tstate;
+ }
+
+ /* Borrowed reference with refcount==1 */
+ return tl_context;
+}
+
+/* Return borrowed reference to thread local context. */
+static PyObject *
+current_context(void)
+{
+ PyThreadState *tstate;
+
+ tstate = PyThreadState_GET();
+ if (cached_context && cached_context->tstate == tstate) {
+ return (PyObject *)cached_context;
+ }
+
+ return current_context_from_dict();
+}
+
+/* ctxobj := borrowed reference to the current context */
+#define CURRENT_CONTEXT(ctxobj) \
+ ctxobj = current_context(); \
+ if (ctxobj == NULL) { \
+ return NULL; \
+ }
+
+/* ctx := pointer to the mpd_context_t struct of the current context */
+#define CURRENT_CONTEXT_ADDR(ctx) { \
+ PyObject *_c_t_x_o_b_j = current_context(); \
+ if (_c_t_x_o_b_j == NULL) { \
+ return NULL; \
+ } \
+ ctx = CTX(_c_t_x_o_b_j); \
+}
+
+/* Return a new reference to the current context */
+static PyObject *
+PyDec_GetCurrentContext(PyObject *self UNUSED, PyObject *args UNUSED)
+{
+ PyObject *context;
+
+ context = current_context();
+ if (context == NULL) {
+ return NULL;
+ }
+
+ Py_INCREF(context);
+ return context;
+}
+
+/* Set the thread local context to a new context, decrement old reference */
+static PyObject *
+PyDec_SetCurrentContext(PyObject *self UNUSED, PyObject *v)
+{
+ PyObject *dict;
+
+ CONTEXT_CHECK(v);
+
+ dict = PyThreadState_GetDict();
+ if (dict == NULL) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot get thread state");
+ return NULL;
+ }
+
+ /* If the new context is one of the templates, make a copy.
+ * This is the current behavior of decimal.py. */
+ if (v == default_context_template ||
+ v == basic_context_template ||
+ v == extended_context_template) {
+ v = context_copy(v, NULL);
+ if (v == NULL) {
+ return NULL;
+ }
+ CTX(v)->status = 0;
+ }
+ else {
+ Py_INCREF(v);
+ }
+
+ cached_context = NULL;
+ if (PyDict_SetItem(dict, tls_context_key, v) < 0) {
+ Py_DECREF(v);
+ return NULL;
+ }
+
+ Py_DECREF(v);
+ Py_RETURN_NONE;
+}
+#endif
+
+/* Context manager object for the 'with' statement. The manager
+ * owns one reference to the global (outer) context and one
+ * to the local (inner) context. */
+static PyObject *
+ctxmanager_new(PyTypeObject *type UNUSED, PyObject *args)
+{
+ PyDecContextManagerObject *self;
+ PyObject *local;
+ PyObject *global;
+
+ CURRENT_CONTEXT(global);
+ local = global;
+ if (!PyArg_ParseTuple(args, "|O", &local)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(local);
+
+ self = PyObject_New(PyDecContextManagerObject,
+ &PyDecContextManager_Type);
+ if (self == NULL) {
+ return NULL;
+ }
+
+ self->local = context_copy(local, NULL);
+ if (self->local == NULL) {
+ self->global = NULL;
+ Py_DECREF(self);
+ return NULL;
+ }
+ self->global = global;
+ Py_INCREF(self->global);
+
+ return (PyObject *)self;
+}
+
+static void
+ctxmanager_dealloc(PyDecContextManagerObject *self)
+{
+ Py_XDECREF(self->local);
+ Py_XDECREF(self->global);
+ PyObject_Del(self);
+}
+
+static PyObject *
+ctxmanager_set_local(PyDecContextManagerObject *self, PyObject *args UNUSED)
+{
+ PyObject *ret;
+
+ ret = PyDec_SetCurrentContext(NULL, self->local);
+ if (ret == NULL) {
+ return NULL;
+ }
+ Py_DECREF(ret);
+
+ Py_INCREF(self->local);
+ return self->local;
+}
+
+static PyObject *
+ctxmanager_restore_global(PyDecContextManagerObject *self,
+ PyObject *args UNUSED)
+{
+ PyObject *ret;
+
+ ret = PyDec_SetCurrentContext(NULL, self->global);
+ if (ret == NULL) {
+ return NULL;
+ }
+ Py_DECREF(ret);
+
+ Py_RETURN_NONE;
+}
+
+
+static PyMethodDef ctxmanager_methods[] = {
+ {"__enter__", (PyCFunction)ctxmanager_set_local, METH_NOARGS, NULL},
+ {"__exit__", (PyCFunction)ctxmanager_restore_global, METH_VARARGS, NULL},
+ {NULL, NULL}
+};
+
+static PyTypeObject PyDecContextManager_Type =
+{
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "decimal.ContextManager", /* tp_name */
+ sizeof(PyDecContextManagerObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor) ctxmanager_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) 0, /* tp_getattr */
+ (setattrfunc) 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc) 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ (getattrofunc) PyObject_GenericGetAttr, /* tp_getattro */
+ (setattrofunc) 0, /* tp_setattro */
+ (PyBufferProcs *) 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ ctxmanager_methods, /* tp_methods */
+};
+
+
+/******************************************************************************/
+/* New Decimal Object */
+/******************************************************************************/
+
+static PyObject *
+PyDecType_New(PyTypeObject *type)
+{
+ PyDecObject *dec;
+
+ if (type == &PyDec_Type) {
+ dec = PyObject_New(PyDecObject, &PyDec_Type);
+ }
+ else {
+ dec = (PyDecObject *)type->tp_alloc(type, 0);
+ }
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ dec->hash = -1;
+
+ MPD(dec)->flags = MPD_STATIC|MPD_STATIC_DATA;
+ MPD(dec)->exp = 0;
+ MPD(dec)->digits = 0;
+ MPD(dec)->len = 0;
+ MPD(dec)->alloc = _Py_DEC_MINALLOC;
+ MPD(dec)->data = dec->data;
+
+ return (PyObject *)dec;
+}
+#define dec_alloc() PyDecType_New(&PyDec_Type)
+
+static void
+dec_dealloc(PyObject *dec)
+{
+ mpd_del(MPD(dec));
+ Py_TYPE(dec)->tp_free(dec);
+}
+
+
+/******************************************************************************/
+/* Conversions to Decimal */
+/******************************************************************************/
+
+Py_LOCAL_INLINE(int)
+is_space(enum PyUnicode_Kind kind, void *data, Py_ssize_t pos)
+{
+ Py_UCS4 ch = PyUnicode_READ(kind, data, pos);
+ return Py_UNICODE_ISSPACE(ch);
+}
+
+/* Return the ASCII representation of a numeric Unicode string. The numeric
+ string may contain ascii characters in the range [1, 127], any Unicode
+ space and any unicode digit. If strip_ws is true, leading and trailing
+ whitespace is stripped.
+
+ Return NULL if malloc fails and an empty string if invalid characters
+ are found. */
+static char *
+numeric_as_ascii(const PyObject *u, int strip_ws)
+{
+ enum PyUnicode_Kind kind;
+ void *data;
+ Py_UCS4 ch;
+ char *res, *cp;
+ Py_ssize_t j, len;
+ int d;
+
+ if (PyUnicode_READY(u) == -1) {
+ return NULL;
+ }
+
+ kind = PyUnicode_KIND(u);
+ data = PyUnicode_DATA(u);
+ len = PyUnicode_GET_LENGTH(u);
+
+ cp = res = PyMem_Malloc(len+1);
+ if (res == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ j = 0;
+ if (strip_ws) {
+ while (len > 0 && is_space(kind, data, len-1)) {
+ len--;
+ }
+ while (j < len && is_space(kind, data, j)) {
+ j++;
+ }
+ }
+
+ for (; j < len; j++) {
+ ch = PyUnicode_READ(kind, data, j);
+ if (0 < ch && ch <= 127) {
+ *cp++ = ch;
+ continue;
+ }
+ if (Py_UNICODE_ISSPACE(ch)) {
+ *cp++ = ' ';
+ continue;
+ }
+ d = Py_UNICODE_TODECIMAL(ch);
+ if (d < 0) {
+ /* empty string triggers ConversionSyntax */
+ *res = '\0';
+ return res;
+ }
+ *cp++ = '0' + d;
+ }
+ *cp = '\0';
+ return res;
+}
+
+/* Return a new PyDecObject or a subtype from a C string. Use the context
+ during conversion. */
+static PyObject *
+PyDecType_FromCString(PyTypeObject *type, const char *s,
+ PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_qset_string(MPD(dec), s, CTX(context), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+ return dec;
+}
+
+/* Return a new PyDecObject or a subtype from a C string. Attempt exact
+ conversion. If the operand cannot be converted exactly, set
+ InvalidOperation. */
+static PyObject *
+PyDecType_FromCStringExact(PyTypeObject *type, const char *s,
+ PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_maxcontext(&maxctx);
+
+ mpd_qset_string(MPD(dec), s, &maxctx, &status);
+ if (status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) {
+ /* we want exact results */
+ mpd_seterror(MPD(dec), MPD_Invalid_operation, &status);
+ }
+ status &= MPD_Errors;
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ return dec;
+}
+
+/* Return a new PyDecObject or a subtype from a PyUnicodeObject. */
+static PyObject *
+PyDecType_FromUnicode(PyTypeObject *type, const PyObject *u,
+ PyObject *context)
+{
+ PyObject *dec;
+ char *s;
+
+ s = numeric_as_ascii(u, 0);
+ if (s == NULL) {
+ return NULL;
+ }
+
+ dec = PyDecType_FromCString(type, s, context);
+ PyMem_Free(s);
+ return dec;
+}
+
+/* Return a new PyDecObject or a subtype from a PyUnicodeObject. Attempt exact
+ * conversion. If the conversion is not exact, fail with InvalidOperation.
+ * Allow leading and trailing whitespace in the input operand. */
+static PyObject *
+PyDecType_FromUnicodeExactWS(PyTypeObject *type, const PyObject *u,
+ PyObject *context)
+{
+ PyObject *dec;
+ char *s;
+
+ s = numeric_as_ascii(u, 1);
+ if (s == NULL) {
+ return NULL;
+ }
+
+ dec = PyDecType_FromCStringExact(type, s, context);
+ PyMem_Free(s);
+ return dec;
+}
+
+/* Set PyDecObject from triple without any error checking. */
+Py_LOCAL_INLINE(void)
+_dec_settriple(PyObject *dec, uint8_t sign, uint32_t v, mpd_ssize_t exp)
+{
+
+#ifdef CONFIG_64
+ MPD(dec)->data[0] = v;
+ MPD(dec)->len = 1;
+#else
+ uint32_t q, r;
+ q = v / MPD_RADIX;
+ r = v - q * MPD_RADIX;
+ MPD(dec)->data[1] = q;
+ MPD(dec)->data[0] = r;
+ MPD(dec)->len = q ? 2 : 1;
+#endif
+ mpd_set_flags(MPD(dec), sign);
+ MPD(dec)->exp = exp;
+ mpd_setdigits(MPD(dec));
+}
+
+/* Return a new PyDecObject from an mpd_ssize_t. */
+static PyObject *
+PyDecType_FromSsize(PyTypeObject *type, mpd_ssize_t v, PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_qset_ssize(MPD(dec), v, CTX(context), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+ return dec;
+}
+
+/* Return a new PyDecObject from an mpd_ssize_t. Conversion is exact. */
+static PyObject *
+PyDecType_FromSsizeExact(PyTypeObject *type, mpd_ssize_t v, PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_maxcontext(&maxctx);
+
+ mpd_qset_ssize(MPD(dec), v, &maxctx, &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+ return dec;
+}
+
+/* Convert from a PyLongObject. The context is not modified; flags set
+ during conversion are accumulated in the status parameter. */
+static PyObject *
+dec_from_long(PyTypeObject *type, const PyObject *v,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ PyObject *dec;
+ PyLongObject *l = (PyLongObject *)v;
+ Py_ssize_t ob_size;
+ size_t len;
+ uint8_t sign;
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ ob_size = Py_SIZE(l);
+ if (ob_size == 0) {
+ _dec_settriple(dec, MPD_POS, 0, 0);
+ return dec;
+ }
+
+ if (ob_size < 0) {
+ len = -ob_size;
+ sign = MPD_NEG;
+ }
+ else {
+ len = ob_size;
+ sign = MPD_POS;
+ }
+
+ if (len == 1) {
+ _dec_settriple(dec, sign, *l->ob_digit, 0);
+ mpd_qfinalize(MPD(dec), ctx, status);
+ return dec;
+ }
+
+#if PYLONG_BITS_IN_DIGIT == 30
+ mpd_qimport_u32(MPD(dec), l->ob_digit, len, sign, PyLong_BASE,
+ ctx, status);
+#elif PYLONG_BITS_IN_DIGIT == 15
+ mpd_qimport_u16(MPD(dec), l->ob_digit, len, sign, PyLong_BASE,
+ ctx, status);
+#else
+ #error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
+#endif
+
+ return dec;
+}
+
+/* Return a new PyDecObject from a PyLongObject. Use the context for
+ conversion. */
+static PyObject *
+PyDecType_FromLong(PyTypeObject *type, const PyObject *pylong,
+ PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+
+ dec = dec_from_long(type, pylong, CTX(context), &status);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ return dec;
+}
+
+/* Return a new PyDecObject from a PyLongObject. Use a maximum context
+ for conversion. If the conversion is not exact, set InvalidOperation. */
+static PyObject *
+PyDecType_FromLongExact(PyTypeObject *type, const PyObject *pylong,
+ PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+
+ mpd_maxcontext(&maxctx);
+ dec = dec_from_long(type, pylong, &maxctx, &status);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ if (status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) {
+ /* we want exact results */
+ mpd_seterror(MPD(dec), MPD_Invalid_operation, &status);
+ }
+ status &= MPD_Errors;
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ return dec;
+}
+
+/* Return a PyDecObject or a subtype from a PyFloatObject.
+ Conversion is exact. */
+static PyObject *
+PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
+ PyObject *context)
+{
+ PyObject *dec, *tmp;
+ PyObject *n, *d, *n_d;
+ mpd_ssize_t k;
+ double x;
+ int sign;
+ mpd_t *d1, *d2;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+
+
+ assert(PyType_IsSubtype(type, &PyDec_Type));
+
+ if (PyLong_Check(v)) {
+ return PyDecType_FromLongExact(type, v, context);
+ }
+ if (!PyFloat_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument must be int of float");
+ return NULL;
+ }
+
+ x = PyFloat_AsDouble(v);
+ if (x == -1.0 && PyErr_Occurred()) {
+ return NULL;
+ }
+ sign = (copysign(1.0, x) == 1.0) ? 0 : 1;
+
+ if (Py_IS_NAN(x) || Py_IS_INFINITY(x)) {
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+ if (Py_IS_NAN(x)) {
+ /* decimal.py calls repr(float(+-nan)),
+ * which always gives a positive result. */
+ mpd_setspecial(MPD(dec), MPD_POS, MPD_NAN);
+ }
+ else {
+ mpd_setspecial(MPD(dec), sign, MPD_INF);
+ }
+ return dec;
+ }
+
+ /* absolute value of the float */
+ tmp = PyObject_CallMethod(v, "__abs__", NULL);
+ if (tmp == NULL) {
+ return NULL;
+ }
+
+ /* float as integer ratio: numerator/denominator */
+ n_d = PyObject_CallMethod(tmp, "as_integer_ratio", NULL);
+ Py_DECREF(tmp);
+ if (n_d == NULL) {
+ return NULL;
+ }
+ n = PyTuple_GET_ITEM(n_d, 0);
+ d = PyTuple_GET_ITEM(n_d, 1);
+
+ tmp = PyObject_CallMethod(d, "bit_length", NULL);
+ if (tmp == NULL) {
+ Py_DECREF(n_d);
+ return NULL;
+ }
+ k = PyLong_AsSsize_t(tmp);
+ Py_DECREF(tmp);
+ if (k == -1 && PyErr_Occurred()) {
+ Py_DECREF(n_d);
+ return NULL;
+ }
+ k--;
+
+ dec = PyDecType_FromLongExact(type, n, context);
+ Py_DECREF(n_d);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ d1 = mpd_qnew();
+ if (d1 == NULL) {
+ Py_DECREF(dec);
+ PyErr_NoMemory();
+ return NULL;
+ }
+ d2 = mpd_qnew();
+ if (d2 == NULL) {
+ mpd_del(d1);
+ Py_DECREF(dec);
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ mpd_maxcontext(&maxctx);
+ mpd_qset_uint(d1, 5, &maxctx, &status);
+ mpd_qset_ssize(d2, k, &maxctx, &status);
+ mpd_qpow(d1, d1, d2, &maxctx, &status);
+ if (dec_addstatus(context, status)) {
+ mpd_del(d1);
+ mpd_del(d2);
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ /* result = n * 5**k */
+ mpd_qmul(MPD(dec), MPD(dec), d1, &maxctx, &status);
+ mpd_del(d1);
+ mpd_del(d2);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+ /* result = +- n * 5**k * 10**-k */
+ mpd_set_sign(MPD(dec), sign);
+ MPD(dec)->exp = -k;
+
+ return dec;
+}
+
+static PyObject *
+PyDecType_FromFloat(PyTypeObject *type, PyObject *v,
+ PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+
+ dec = PyDecType_FromFloatExact(type, v, context);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_qfinalize(MPD(dec), CTX(context), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ return dec;
+}
+
+/* Return a new PyDecObject or a subtype from a Decimal. */
+static PyObject *
+PyDecType_FromDecimalExact(PyTypeObject *type, PyObject *v, PyObject *context)
+{
+ PyObject *dec;
+ uint32_t status = 0;
+
+ if (type == &PyDec_Type && PyDec_CheckExact(v)) {
+ Py_INCREF(v);
+ return v;
+ }
+
+ dec = PyDecType_New(type);
+ if (dec == NULL) {
+ return NULL;
+ }
+
+ mpd_qcopy(MPD(dec), MPD(v), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(dec);
+ return NULL;
+ }
+
+ return dec;
+}
+
+static PyObject *
+sequence_as_tuple(PyObject *v, PyObject *ex, const char *mesg)
+{
+ if (PyTuple_Check(v)) {
+ Py_INCREF(v);
+ return v;
+ }
+ if (PyList_Check(v)) {
+ return PyList_AsTuple(v);
+ }
+
+ PyErr_SetString(ex, mesg);
+ return NULL;
+}
+
+/* Return a new C string representation of a DecimalTuple. */
+static char *
+dectuple_as_str(PyObject *dectuple)
+{
+ PyObject *digits = NULL, *tmp;
+ char *decstring = NULL;
+ char sign_special[6];
+ char *cp;
+ long sign, l;
+ mpd_ssize_t exp = 0;
+ Py_ssize_t i, mem, tsize;
+ int is_infinite = 0;
+ int n;
+
+ assert(PyTuple_Check(dectuple));
+
+ if (PyTuple_Size(dectuple) != 3) {
+ PyErr_SetString(PyExc_ValueError,
+ "argument must be a sequence of length 3");
+ goto error;
+ }
+
+ /* sign */
+ tmp = PyTuple_GET_ITEM(dectuple, 0);
+ if (!PyLong_Check(tmp)) {
+ PyErr_SetString(PyExc_ValueError,
+ "sign must be an integer with the value 0 or 1");
+ goto error;
+ }
+ sign = PyLong_AsLong(tmp);
+ if (sign == -1 && PyErr_Occurred()) {
+ goto error;
+ }
+ if (sign != 0 && sign != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "sign must be an integer with the value 0 or 1");
+ goto error;
+ }
+ sign_special[0] = sign ? '-' : '+';
+ sign_special[1] = '\0';
+
+ /* exponent or encoding for a special number */
+ tmp = PyTuple_GET_ITEM(dectuple, 2);
+ if (PyUnicode_Check(tmp)) {
+ /* special */
+ if (PyUnicode_CompareWithASCIIString(tmp, "F") == 0) {
+ strcat(sign_special, "Inf");
+ is_infinite = 1;
+ }
+ else if (PyUnicode_CompareWithASCIIString(tmp, "n") == 0) {
+ strcat(sign_special, "NaN");
+ }
+ else if (PyUnicode_CompareWithASCIIString(tmp, "N") == 0) {
+ strcat(sign_special, "sNaN");
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "string argument in the third position "
+ "must be 'F', 'n' or 'N'");
+ goto error;
+ }
+ }
+ else {
+ /* exponent */
+ if (!PyLong_Check(tmp)) {
+ PyErr_SetString(PyExc_ValueError,
+ "exponent must be an integer");
+ goto error;
+ }
+ exp = PyLong_AsSsize_t(tmp);
+ if (exp == -1 && PyErr_Occurred()) {
+ goto error;
+ }
+ }
+
+ /* coefficient */
+ digits = sequence_as_tuple(PyTuple_GET_ITEM(dectuple, 1), PyExc_ValueError,
+ "coefficient must be a tuple of digits");
+ if (digits == NULL) {
+ goto error;
+ }
+
+ tsize = PyTuple_Size(digits);
+ /* [sign][coeffdigits+1][E][-][expdigits+1]['\0'] */
+ mem = 1 + tsize + 3 + MPD_EXPDIGITS + 2;
+ cp = decstring = PyMem_Malloc(mem);
+ if (decstring == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+
+ n = snprintf(cp, mem, "%s", sign_special);
+ if (n < 0 || n >= mem) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error in dec_sequence_as_str");
+ goto error;
+ }
+ cp += n;
+
+ if (tsize == 0 && sign_special[1] == '\0') {
+ /* empty tuple: zero coefficient, except for special numbers */
+ *cp++ = '0';
+ }
+ for (i = 0; i < tsize; i++) {
+ tmp = PyTuple_GET_ITEM(digits, i);
+ if (!PyLong_Check(tmp)) {
+ PyErr_SetString(PyExc_ValueError,
+ "coefficient must be a tuple of digits");
+ goto error;
+ }
+ l = PyLong_AsLong(tmp);
+ if (l == -1 && PyErr_Occurred()) {
+ goto error;
+ }
+ if (l < 0 || l > 9) {
+ PyErr_SetString(PyExc_ValueError,
+ "coefficient must be a tuple of digits");
+ goto error;
+ }
+ if (is_infinite) {
+ /* accept but ignore any well-formed coefficient for compatibility
+ with decimal.py */
+ continue;
+ }
+ *cp++ = (char)l + '0';
+ }
+ *cp = '\0';
+
+ if (sign_special[1] == '\0') {
+ /* not a special number */
+ *cp++ = 'E';
+ n = snprintf(cp, MPD_EXPDIGITS+2, "%" PRI_mpd_ssize_t, exp);
+ if (n < 0 || n >= MPD_EXPDIGITS+2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error in dec_sequence_as_str");
+ goto error;
+ }
+ }
+
+ Py_XDECREF(digits);
+ return decstring;
+
+
+error:
+ Py_XDECREF(digits);
+ if (decstring) PyMem_Free(decstring);
+ return NULL;
+}
+
+/* Currently accepts tuples and lists. */
+static PyObject *
+PyDecType_FromSequence(PyTypeObject *type, PyObject *v,
+ PyObject *context)
+{
+ PyObject *dectuple;
+ PyObject *dec;
+ char *s;
+
+ dectuple = sequence_as_tuple(v, PyExc_TypeError,
+ "argument must be a tuple or list");
+ if (dectuple == NULL) {
+ return NULL;
+ }
+
+ s = dectuple_as_str(dectuple);
+ Py_DECREF(dectuple);
+ if (s == NULL) {
+ return NULL;
+ }
+
+ dec = PyDecType_FromCString(type, s, context);
+
+ PyMem_Free(s);
+ return dec;
+}
+
+/* Currently accepts tuples and lists. */
+static PyObject *
+PyDecType_FromSequenceExact(PyTypeObject *type, PyObject *v,
+ PyObject *context)
+{
+ PyObject *dectuple;
+ PyObject *dec;
+ char *s;
+
+ dectuple = sequence_as_tuple(v, PyExc_TypeError,
+ "argument must be a tuple or list");
+ if (dectuple == NULL) {
+ return NULL;
+ }
+
+ s = dectuple_as_str(dectuple);
+ Py_DECREF(dectuple);
+ if (s == NULL) {
+ return NULL;
+ }
+
+ dec = PyDecType_FromCStringExact(type, s, context);
+
+ PyMem_Free(s);
+ return dec;
+}
+
+#define PyDec_FromCString(str, context) \
+ PyDecType_FromCString(&PyDec_Type, str, context)
+#define PyDec_FromCStringExact(str, context) \
+ PyDecType_FromCStringExact(&PyDec_Type, str, context)
+
+#define PyDec_FromUnicode(unicode, context) \
+ PyDecType_FromUnicode(&PyDec_Type, unicode, context)
+#define PyDec_FromUnicodeExact(unicode, context) \
+ PyDecType_FromUnicodeExact(&PyDec_Type, unicode, context)
+#define PyDec_FromUnicodeExactWS(unicode, context) \
+ PyDecType_FromUnicodeExactWS(&PyDec_Type, unicode, context)
+
+#define PyDec_FromSsize(v, context) \
+ PyDecType_FromSsize(&PyDec_Type, v, context)
+#define PyDec_FromSsizeExact(v, context) \
+ PyDecType_FromSsizeExact(&PyDec_Type, v, context)
+
+#define PyDec_FromLong(pylong, context) \
+ PyDecType_FromLong(&PyDec_Type, pylong, context)
+#define PyDec_FromLongExact(pylong, context) \
+ PyDecType_FromLongExact(&PyDec_Type, pylong, context)
+
+#define PyDec_FromFloat(pyfloat, context) \
+ PyDecType_FromFloat(&PyDec_Type, pyfloat, context)
+#define PyDec_FromFloatExact(pyfloat, context) \
+ PyDecType_FromFloatExact(&PyDec_Type, pyfloat, context)
+
+#define PyDec_FromSequence(sequence, context) \
+ PyDecType_FromSequence(&PyDec_Type, sequence, context)
+#define PyDec_FromSequenceExact(sequence, context) \
+ PyDecType_FromSequenceExact(&PyDec_Type, sequence, context)
+
+/* class method */
+static PyObject *
+dec_from_float(PyObject *dec, PyObject *pyfloat)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ return PyDecType_FromFloatExact((PyTypeObject *)dec, pyfloat, context);
+}
+
+/* create_decimal_from_float */
+static PyObject *
+ctx_from_float(PyObject *context, PyObject *v)
+{
+ return PyDec_FromFloat(v, context);
+}
+
+/* Apply the context to the input operand. Return a new PyDecObject. */
+static PyObject *
+dec_apply(PyObject *v, PyObject *context)
+{
+ PyObject *result;
+ uint32_t status = 0;
+
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ mpd_qcopy(MPD(result), MPD(v), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ mpd_qfinalize(MPD(result), CTX(context), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+/* 'v' can have any type accepted by the Decimal constructor. Attempt
+ an exact conversion. If the result does not meet the restrictions
+ for an mpd_t, fail with InvalidOperation. */
+static PyObject *
+PyDecType_FromObjectExact(PyTypeObject *type, PyObject *v, PyObject *context)
+{
+ if (v == NULL) {
+ return PyDecType_FromSsizeExact(type, 0, context);
+ }
+ else if (PyDec_Check(v)) {
+ return PyDecType_FromDecimalExact(type, v, context);
+ }
+ else if (PyUnicode_Check(v)) {
+ return PyDecType_FromUnicodeExactWS(type, v, context);
+ }
+ else if (PyLong_Check(v)) {
+ return PyDecType_FromLongExact(type, v, context);
+ }
+ else if (PyTuple_Check(v) || PyList_Check(v)) {
+ return PyDecType_FromSequenceExact(type, v, context);
+ }
+ else if (PyFloat_Check(v)) {
+ if (dec_addstatus(context, MPD_Float_operation)) {
+ return NULL;
+ }
+ return PyDecType_FromFloatExact(type, v, context);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "conversion from %s to Decimal is not supported",
+ v->ob_type->tp_name);
+ return NULL;
+ }
+}
+
+/* The context is used during conversion. This function is the
+ equivalent of context.create_decimal(). */
+static PyObject *
+PyDec_FromObject(PyObject *v, PyObject *context)
+{
+ if (v == NULL) {
+ return PyDec_FromSsize(0, context);
+ }
+ else if (PyDec_Check(v)) {
+ mpd_context_t *ctx = CTX(context);
+ if (mpd_isnan(MPD(v)) &&
+ MPD(v)->digits > ctx->prec - ctx->clamp) {
+ /* Special case: too many NaN payload digits */
+ PyObject *result;
+ if (dec_addstatus(context, MPD_Conversion_syntax)) {
+ return NULL;
+ }
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+ mpd_setspecial(MPD(result), MPD_POS, MPD_NAN);
+ return result;
+ }
+ return dec_apply(v, context);
+ }
+ else if (PyUnicode_Check(v)) {
+ return PyDec_FromUnicode(v, context);
+ }
+ else if (PyLong_Check(v)) {
+ return PyDec_FromLong(v, context);
+ }
+ else if (PyTuple_Check(v) || PyList_Check(v)) {
+ return PyDec_FromSequence(v, context);
+ }
+ else if (PyFloat_Check(v)) {
+ if (dec_addstatus(context, MPD_Float_operation)) {
+ return NULL;
+ }
+ return PyDec_FromFloat(v, context);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "conversion from %s to Decimal is not supported",
+ v->ob_type->tp_name);
+ return NULL;
+ }
+}
+
+static PyObject *
+dec_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"value", "context", NULL};
+ PyObject *v = NULL;
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO", kwlist,
+ &v, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ return PyDecType_FromObjectExact(type, v, context);
+}
+
+static PyObject *
+ctx_create_decimal(PyObject *context, PyObject *args)
+{
+ PyObject *v = NULL;
+
+ if (!PyArg_ParseTuple(args, "|O", &v)) {
+ return NULL;
+ }
+
+ return PyDec_FromObject(v, context);
+}
+
+
+/******************************************************************************/
+/* Implicit conversions to Decimal */
+/******************************************************************************/
+
+/* Try to convert PyObject v to a new PyDecObject conv. If the conversion
+ fails, set conv to NULL (exception is set). If the conversion is not
+ implemented, set conv to Py_NotImplemented. */
+#define NOT_IMPL 0
+#define TYPE_ERR 1
+Py_LOCAL_INLINE(int)
+convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
+{
+
+ if (PyDec_Check(v)) {
+ *conv = v;
+ Py_INCREF(v);
+ return 1;
+ }
+ if (PyLong_Check(v)) {
+ *conv = PyDec_FromLongExact(v, context);
+ if (*conv == NULL) {
+ return 0;
+ }
+ return 1;
+ }
+
+ if (type_err) {
+ PyErr_Format(PyExc_TypeError,
+ "conversion from %s to Decimal is not supported",
+ v->ob_type->tp_name);
+ }
+ else {
+ Py_INCREF(Py_NotImplemented);
+ *conv = Py_NotImplemented;
+ }
+ return 0;
+}
+
+/* Return NotImplemented for unsupported types. */
+#define CONVERT_OP(a, v, context) \
+ if (!convert_op(NOT_IMPL, a, v, context)) { \
+ return *(a); \
+ }
+
+#define CONVERT_BINOP(a, b, v, w, context) \
+ if (!convert_op(NOT_IMPL, a, v, context)) { \
+ return *(a); \
+ } \
+ if (!convert_op(NOT_IMPL, b, w, context)) { \
+ Py_DECREF(*(a)); \
+ return *(b); \
+ }
+
+#define CONVERT_TERNOP(a, b, c, v, w, x, context) \
+ if (!convert_op(NOT_IMPL, a, v, context)) { \
+ return *(a); \
+ } \
+ if (!convert_op(NOT_IMPL, b, w, context)) { \
+ Py_DECREF(*(a)); \
+ return *(b); \
+ } \
+ if (!convert_op(NOT_IMPL, c, x, context)) { \
+ Py_DECREF(*(a)); \
+ Py_DECREF(*(b)); \
+ return *(c); \
+ }
+
+/* Raise TypeError for unsupported types. */
+#define CONVERT_OP_RAISE(a, v, context) \
+ if (!convert_op(TYPE_ERR, a, v, context)) { \
+ return NULL; \
+ }
+
+#define CONVERT_BINOP_RAISE(a, b, v, w, context) \
+ if (!convert_op(TYPE_ERR, a, v, context)) { \
+ return NULL; \
+ } \
+ if (!convert_op(TYPE_ERR, b, w, context)) { \
+ Py_DECREF(*(a)); \
+ return NULL; \
+ }
+
+#define CONVERT_TERNOP_RAISE(a, b, c, v, w, x, context) \
+ if (!convert_op(TYPE_ERR, a, v, context)) { \
+ return NULL; \
+ } \
+ if (!convert_op(TYPE_ERR, b, w, context)) { \
+ Py_DECREF(*(a)); \
+ return NULL; \
+ } \
+ if (!convert_op(TYPE_ERR, c, x, context)) { \
+ Py_DECREF(*(a)); \
+ Py_DECREF(*(b)); \
+ return NULL; \
+ }
+
+
+/******************************************************************************/
+/* Implicit conversions to Decimal for comparison */
+/******************************************************************************/
+
+/* Convert rationals for comparison */
+static PyObject *Rational = NULL;
+static PyObject *
+multiply_by_denominator(PyObject *v, PyObject *r, PyObject *context)
+{
+ PyObject *result;
+ PyObject *tmp = NULL;
+ PyObject *denom = NULL;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+ mpd_ssize_t exp;
+ mpd_t *vv;
+
+ /* v is not special, r is a rational */
+ tmp = PyObject_GetAttrString(r, "denominator");
+ if (tmp == NULL) {
+ return NULL;
+ }
+ denom = PyDec_FromLongExact(tmp, context);
+ Py_DECREF(tmp);
+ if (denom == NULL) {
+ return NULL;
+ }
+
+ vv = mpd_qncopy(MPD(v));
+ if (vv == NULL) {
+ Py_DECREF(denom);
+ PyErr_NoMemory();
+ return NULL;
+ }
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(denom);
+ mpd_del(vv);
+ return NULL;
+ }
+
+ mpd_maxcontext(&maxctx);
+ /* Prevent Overflow in the following multiplication. The result of
+ the multiplication is only used in mpd_qcmp, which can handle
+ values that are technically out of bounds, like (for 32-bit)
+ 99999999999999999999...99999999e+425000000. */
+ exp = vv->exp;
+ vv->exp = 0;
+ mpd_qmul(MPD(result), vv, MPD(denom), &maxctx, &status);
+ MPD(result)->exp = exp;
+
+ Py_DECREF(denom);
+ mpd_del(vv);
+ /* If any status has been accumulated during the multiplication,
+ the result is invalid. This is very unlikely, since even the
+ 32-bit version supports 425000000 digits. */
+ if (status) {
+ PyErr_SetString(PyExc_ValueError,
+ "exact conversion for comparison failed");
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static PyObject *
+numerator_as_decimal(PyObject *r, PyObject *context)
+{
+ PyObject *tmp, *num;
+
+ tmp = PyObject_GetAttrString(r, "numerator");
+ if (tmp == NULL) {
+ return NULL;
+ }
+
+ num = PyDec_FromLongExact(tmp, context);
+ Py_DECREF(tmp);
+ return num;
+}
+
+/* Convert v and w for comparison. v is a Decimal. If w is a Rational, both
+ v and w have to be transformed. Return 1 for success, with new references
+ to the converted objects in vcmp and wcmp. Return 0 for failure. In that
+ case wcmp is either NULL or Py_NotImplemented (new reference) and vcmp
+ is undefined. */
+static int
+convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
+ int op, PyObject *context)
+{
+ mpd_context_t *ctx = CTX(context);
+
+ *vcmp = v;
+
+ if (PyDec_Check(w)) {
+ Py_INCREF(w);
+ *wcmp = w;
+ }
+ else if (PyLong_Check(w)) {
+ *wcmp = PyDec_FromLongExact(w, context);
+ }
+ else if (PyFloat_Check(w)) {
+ if (op != Py_EQ && op != Py_NE &&
+ dec_addstatus(context, MPD_Float_operation)) {
+ *wcmp = NULL;
+ }
+ else {
+ ctx->status |= MPD_Float_operation;
+ *wcmp = PyDec_FromFloatExact(w, context);
+ }
+ }
+ else if (PyComplex_Check(w) && (op == Py_EQ || op == Py_NE)) {
+ Py_complex c = PyComplex_AsCComplex(w);
+ if (c.real == -1.0 && PyErr_Occurred()) {
+ *wcmp = NULL;
+ }
+ else if (c.imag == 0.0) {
+ PyObject *tmp = PyFloat_FromDouble(c.real);
+ if (tmp == NULL) {
+ *wcmp = NULL;
+ }
+ else {
+ ctx->status |= MPD_Float_operation;
+ *wcmp = PyDec_FromFloatExact(tmp, context);
+ Py_DECREF(tmp);
+ }
+ }
+ else {
+ Py_INCREF(Py_NotImplemented);
+ *wcmp = Py_NotImplemented;
+ }
+ }
+ else if (PyObject_IsInstance(w, Rational)) {
+ *wcmp = numerator_as_decimal(w, context);
+ if (*wcmp && !mpd_isspecial(MPD(v))) {
+ *vcmp = multiply_by_denominator(v, w, context);
+ if (*vcmp == NULL) {
+ Py_CLEAR(*wcmp);
+ }
+ }
+ }
+ else {
+ Py_INCREF(Py_NotImplemented);
+ *wcmp = Py_NotImplemented;
+ }
+
+ if (*wcmp == NULL || *wcmp == Py_NotImplemented) {
+ return 0;
+ }
+ if (*vcmp == v) {
+ Py_INCREF(v);
+ }
+ return 1;
+}
+
+#define CONVERT_BINOP_CMP(vcmp, wcmp, v, w, op, ctx) \
+ if (!convert_op_cmp(vcmp, wcmp, v, w, op, ctx)) { \
+ return *(wcmp); \
+ } \
+
+
+/******************************************************************************/
+/* Conversions from decimal */
+/******************************************************************************/
+
+static PyObject *
+unicode_fromascii(const char *s, Py_ssize_t size)
+{
+ PyObject *res;
+
+ res = PyUnicode_New(size, 127);
+ if (res == NULL) {
+ return NULL;
+ }
+
+ memcpy(PyUnicode_1BYTE_DATA(res), s, size);
+ return res;
+}
+
+/* PyDecObject as a string. The default module context is only used for
+ the value of 'capitals'. */
+static PyObject *
+dec_str(PyObject *dec)
+{
+ PyObject *res, *context;
+ mpd_ssize_t size;
+ char *cp;
+
+ CURRENT_CONTEXT(context);
+ size = mpd_to_sci_size(&cp, MPD(dec), CtxCaps(context));
+ if (size < 0) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ res = unicode_fromascii(cp, size);
+ mpd_free(cp);
+ return res;
+}
+
+/* Representation of a PyDecObject. */
+static PyObject *
+dec_repr(PyObject *dec)
+{
+ PyObject *res, *context;
+ char *cp;
+
+ CURRENT_CONTEXT(context);
+ cp = mpd_to_sci(MPD(dec), CtxCaps(context));
+ if (cp == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ res = PyUnicode_FromFormat("Decimal('%s')", cp);
+ mpd_free(cp);
+ return res;
+}
+
+/* Convert decimal_point or thousands_sep, which may be multibyte or in
+ the range [128, 255], to a UTF8 string. */
+static PyObject *
+dotsep_as_utf8(const char *s)
+{
+ PyObject *utf8;
+ PyObject *tmp;
+ wchar_t buf[2];
+ size_t n;
+
+ n = mbstowcs(buf, s, 2);
+ if (n != 1) { /* Issue #7442 */
+ PyErr_SetString(PyExc_ValueError,
+ "invalid decimal point or unsupported "
+ "combination of LC_CTYPE and LC_NUMERIC");
+ return NULL;
+ }
+ tmp = PyUnicode_FromWideChar(buf, n);
+ if (tmp == NULL) {
+ return NULL;
+ }
+ utf8 = PyUnicode_AsUTF8String(tmp);
+ Py_DECREF(tmp);
+ return utf8;
+}
+
+/* Formatted representation of a PyDecObject. */
+static PyObject *
+dec_format(PyObject *dec, PyObject *args)
+{
+ PyObject *result = NULL;
+ PyObject *override = NULL;
+ PyObject *dot = NULL;
+ PyObject *sep = NULL;
+ PyObject *grouping = NULL;
+ PyObject *fmt = NULL;
+ PyObject *fmtarg;
+ PyObject *context;
+ mpd_spec_t spec;
+ char *decstring= NULL;
+ uint32_t status = 0;
+ size_t n;
+
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTuple(args, "O|O", &fmtarg, &override)) {
+ return NULL;
+ }
+
+ if (PyUnicode_Check(fmtarg)) {
+ fmt = PyUnicode_AsUTF8String(fmtarg);
+ if (fmt == NULL) {
+ return NULL;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "format arg must be str");
+ return NULL;
+ }
+
+ if (!mpd_parse_fmt_str(&spec, PyBytes_AS_STRING(fmt),
+ CtxCaps(context))) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid format string");
+ goto finish;
+ }
+ if (override) {
+ /* Values for decimal_point, thousands_sep and grouping can
+ be explicitly specified in the override dict. These values
+ take precedence over the values obtained from localeconv()
+ in mpd_parse_fmt_str(). The feature is not documented and
+ is only used in test_decimal. */
+ if (!PyDict_Check(override)) {
+ PyErr_SetString(PyExc_TypeError,
+ "optional argument must be a dict");
+ goto finish;
+ }
+ if ((dot = PyDict_GetItemString(override, "decimal_point"))) {
+ if ((dot = PyUnicode_AsUTF8String(dot)) == NULL) {
+ goto finish;
+ }
+ spec.dot = PyBytes_AS_STRING(dot);
+ }
+ if ((sep = PyDict_GetItemString(override, "thousands_sep"))) {
+ if ((sep = PyUnicode_AsUTF8String(sep)) == NULL) {
+ goto finish;
+ }
+ spec.sep = PyBytes_AS_STRING(sep);
+ }
+ if ((grouping = PyDict_GetItemString(override, "grouping"))) {
+ if ((grouping = PyUnicode_AsUTF8String(grouping)) == NULL) {
+ goto finish;
+ }
+ spec.grouping = PyBytes_AS_STRING(grouping);
+ }
+ if (mpd_validate_lconv(&spec) < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid override dict");
+ goto finish;
+ }
+ }
+ else {
+ n = strlen(spec.dot);
+ if (n > 1 || (n == 1 && !isascii((uchar)spec.dot[0]))) {
+ /* fix locale dependent non-ascii characters */
+ dot = dotsep_as_utf8(spec.dot);
+ if (dot == NULL) {
+ goto finish;
+ }
+ spec.dot = PyBytes_AS_STRING(dot);
+ }
+ n = strlen(spec.sep);
+ if (n > 1 || (n == 1 && !isascii((uchar)spec.sep[0]))) {
+ /* fix locale dependent non-ascii characters */
+ sep = dotsep_as_utf8(spec.sep);
+ if (sep == NULL) {
+ goto finish;
+ }
+ spec.sep = PyBytes_AS_STRING(sep);
+ }
+ }
+
+
+ decstring = mpd_qformat_spec(MPD(dec), &spec, CTX(context), &status);
+ if (decstring == NULL) {
+ dec_addstatus(context, status);
+ goto finish;
+ }
+ result = PyUnicode_DecodeUTF8(decstring, strlen(decstring), NULL);
+
+
+finish:
+ Py_XDECREF(grouping);
+ Py_XDECREF(sep);
+ Py_XDECREF(dot);
+ Py_XDECREF(fmt);
+ if (decstring) mpd_free(decstring);
+ return result;
+}
+
+/* Return a PyLongObject from a PyDecObject, using the specified rounding
+ * mode. The context precision is not observed. */
+static PyObject *
+dec_as_long(PyObject *dec, PyObject *context, int round)
+{
+ PyLongObject *pylong;
+ digit *ob_digit;
+ size_t n;
+ Py_ssize_t i;
+ mpd_t *x;
+ mpd_context_t workctx;
+ uint32_t status = 0;
+
+ if (mpd_isspecial(MPD(dec))) {
+ if (mpd_isnan(MPD(dec))) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot convert NaN to integer");
+ }
+ else {
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot convert Infinity to integer");
+ }
+ return NULL;
+ }
+
+ x = mpd_qnew();
+ if (x == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ workctx = *CTX(context);
+ workctx.round = round;
+ mpd_qround_to_int(x, MPD(dec), &workctx, &status);
+ if (dec_addstatus(context, status)) {
+ mpd_del(x);
+ return NULL;
+ }
+
+ status = 0;
+ ob_digit = NULL;
+#if PYLONG_BITS_IN_DIGIT == 30
+ n = mpd_qexport_u32(&ob_digit, 0, PyLong_BASE, x, &status);
+#elif PYLONG_BITS_IN_DIGIT == 15
+ n = mpd_qexport_u16(&ob_digit, 0, PyLong_BASE, x, &status);
+#else
+ #error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
+#endif
+
+ if (n == SIZE_MAX) {
+ PyErr_NoMemory();
+ mpd_del(x);
+ return NULL;
+ }
+
+ assert(n > 0);
+ pylong = _PyLong_New(n);
+ if (pylong == NULL) {
+ mpd_free(ob_digit);
+ mpd_del(x);
+ return NULL;
+ }
+
+ memcpy(pylong->ob_digit, ob_digit, n * sizeof(digit));
+ mpd_free(ob_digit);
+
+ i = n;
+ while ((i > 0) && (pylong->ob_digit[i-1] == 0)) {
+ i--;
+ }
+
+ Py_SIZE(pylong) = i;
+ if (mpd_isnegative(x) && !mpd_iszero(x)) {
+ Py_SIZE(pylong) = -i;
+ }
+
+ mpd_del(x);
+ return (PyObject *) pylong;
+}
+
+static PyObject *
+PyDec_ToIntegralValue(PyObject *dec, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"rounding", "context", NULL};
+ PyObject *result;
+ PyObject *context;
+ uint32_t status = 0;
+ mpd_context_t workctx;
+ int round = -1;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iO", kwlist,
+ &round, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ workctx = *CTX(context);
+ if (round >= 0) {
+ if (!mpd_qsetround(&workctx, round)) {
+ return type_error_ptr(invalid_rounding_err);
+ }
+ }
+
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ mpd_qround_to_int(MPD(result), MPD(dec), &workctx, &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static PyObject *
+PyDec_ToIntegralExact(PyObject *dec, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"rounding", "context", NULL};
+ PyObject *result;
+ PyObject *context;
+ uint32_t status = 0;
+ mpd_context_t workctx;
+ int round = -1;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iO", kwlist,
+ &round, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ workctx = *CTX(context);
+ if (round >= 0) {
+ if (!mpd_qsetround(&workctx, round)) {
+ return type_error_ptr(invalid_rounding_err);
+ }
+ }
+
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ mpd_qround_to_intx(MPD(result), MPD(dec), &workctx, &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static PyObject *
+PyDec_AsFloat(PyObject *dec)
+{
+ PyObject *f, *s;
+
+ if (mpd_isnan(MPD(dec))) {
+ if (mpd_issnan(MPD(dec))) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot convert signaling NaN to float");
+ return NULL;
+ }
+ if (mpd_isnegative(MPD(dec))) {
+ s = PyUnicode_FromString("-nan");
+ }
+ else {
+ s = PyUnicode_FromString("nan");
+ }
+ }
+ else {
+ s = dec_str(dec);
+ }
+
+ if (s == NULL) {
+ return NULL;
+ }
+
+ f = PyFloat_FromString(s);
+ Py_DECREF(s);
+
+ return f;
+}
+
+static PyObject *
+PyDec_Round(PyObject *dec, PyObject *args)
+{
+ PyObject *result;
+ PyObject *x = NULL;
+ uint32_t status = 0;
+ PyObject *context;
+
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTuple(args, "|O", &x)) {
+ return NULL;
+ }
+
+ if (x) {
+ mpd_uint_t dq[1] = {1};
+ mpd_t q = {MPD_STATIC|MPD_CONST_DATA,0,1,1,1,dq};
+ mpd_ssize_t y;
+
+ if (!PyLong_Check(x)) {
+ PyErr_SetString(PyExc_TypeError,
+ "optional arg must be an integer");
+ return NULL;
+ }
+
+ y = PyLong_AsSsize_t(x);
+ if (y == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ q.exp = (y == MPD_SSIZE_MIN) ? MPD_SSIZE_MAX : -y;
+ mpd_qquantize(MPD(result), MPD(dec), &q, CTX(context), &status);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+ }
+ else {
+ return dec_as_long(dec, context, MPD_ROUND_HALF_EVEN);
+ }
+}
+
+PyObject *DecimalTuple = NULL;
+/* Return the DecimalTuple representation of a PyDecObject. */
+static PyObject *
+PyDec_AsTuple(PyObject *dec, PyObject *dummy UNUSED)
+{
+ PyObject *result = NULL;
+ PyObject *sign = NULL;
+ PyObject *coeff = NULL;
+ PyObject *expt = NULL;
+ PyObject *tmp = NULL;
+ mpd_t *x = NULL;
+ char *intstring = NULL;
+ Py_ssize_t intlen, i;
+
+
+ x = mpd_qncopy(MPD(dec));
+ if (x == NULL) {
+ PyErr_NoMemory();
+ goto out;
+ }
+
+ sign = PyLong_FromUnsignedLong(mpd_sign(MPD(dec)));
+ if (sign == NULL) {
+ goto out;
+ }
+
+ if (mpd_isinfinite(x)) {
+ expt = PyUnicode_FromString("F");
+ if (expt == NULL) {
+ goto out;
+ }
+ /* decimal.py has non-compliant infinity payloads. */
+ coeff = Py_BuildValue("(i)", 0);
+ if (coeff == NULL) {
+ goto out;
+ }
+ }
+ else {
+ if (mpd_isnan(x)) {
+ expt = PyUnicode_FromString(mpd_isqnan(x)?"n":"N");
+ }
+ else {
+ expt = PyLong_FromSsize_t(MPD(dec)->exp);
+ }
+ if (expt == NULL) {
+ goto out;
+ }
+
+ /* coefficient is defined */
+ if (x->len > 0) {
+
+ /* make an integer */
+ x->exp = 0;
+ /* clear NaN and sign */
+ mpd_clear_flags(x);
+ intstring = mpd_to_sci(x, 1);
+ if (intstring == NULL) {
+ PyErr_NoMemory();
+ goto out;
+ }
+
+ intlen = strlen(intstring);
+ coeff = PyTuple_New(intlen);
+ if (coeff == NULL) {
+ goto out;
+ }
+
+ for (i = 0; i < intlen; i++) {
+ tmp = PyLong_FromLong(intstring[i]-'0');
+ if (tmp == NULL) {
+ goto out;
+ }
+ PyTuple_SET_ITEM(coeff, i, tmp);
+ }
+ }
+ else {
+ coeff = PyTuple_New(0);
+ if (coeff == NULL) {
+ goto out;
+ }
+ }
+ }
+
+ result = PyObject_CallFunctionObjArgs(DecimalTuple,
+ sign, coeff, expt, NULL);
+
+out:
+ if (x) mpd_del(x);
+ if (intstring) mpd_free(intstring);
+ Py_XDECREF(sign);
+ Py_XDECREF(coeff);
+ Py_XDECREF(expt);
+ return result;
+}
+
+
+/******************************************************************************/
+/* Macros for converting mpdecimal functions to Decimal methods */
+/******************************************************************************/
+
+/* Unary number method that uses the default module context. */
+#define Dec_UnaryNumberMethod(MPDFUNC) \
+static PyObject * \
+nm_##MPDFUNC(PyObject *self) \
+{ \
+ PyObject *result; \
+ PyObject *context; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context); \
+ if ((result = dec_alloc()) == NULL) { \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(self), CTX(context), &status); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Binary number method that uses default module context. */
+#define Dec_BinaryNumberMethod(MPDFUNC) \
+static PyObject * \
+nm_##MPDFUNC(PyObject *self, PyObject *other) \
+{ \
+ PyObject *a, *b; \
+ PyObject *result; \
+ PyObject *context; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context) ; \
+ CONVERT_BINOP(&a, &b, self, other, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b), CTX(context), &status); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Boolean function without a context arg. */
+#define Dec_BoolFunc(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *dummy UNUSED) \
+{ \
+ return MPDFUNC(MPD(self)) ? incr_true() : incr_false(); \
+}
+
+/* Boolean function with an optional context arg. */
+#define Dec_BoolFuncVA(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"context", NULL}; \
+ PyObject *context; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, \
+ &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ \
+ return MPDFUNC(MPD(self), CTX(context)) ? incr_true() : incr_false(); \
+}
+
+/* Unary function with an optional context arg. */
+#define Dec_UnaryFuncVA(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"context", NULL}; \
+ PyObject *result; \
+ PyObject *context; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, \
+ &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(self), CTX(context), &status); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Unary function with an optional context arg. The actual MPDFUNC
+ only takes a status parameter. */
+#define Dec_UnaryFuncVA_NO_CTX(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"context", NULL}; \
+ PyObject *result; \
+ PyObject *context; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, \
+ &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(self), &status); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Binary function with an optional context arg. */
+#define Dec_BinaryFuncVA(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"other", "context", NULL}; \
+ PyObject *other, *context; \
+ PyObject *a, *b; \
+ PyObject *result; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, \
+ &other, &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ CONVERT_BINOP_RAISE(&a, &b, self, other, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b), CTX(context), &status); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Binary function with an optional context arg. Actual MPDFUNC does
+ NOT take a context. The context is used to record InvalidOperation
+ if the second operand cannot be converted exactly. */
+#define Dec_BinaryFuncVA_NO_CTX(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"other", "context", NULL}; \
+ PyObject *other, *context; \
+ PyObject *a, *b; \
+ PyObject *result; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, \
+ &other, &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ CONVERT_BINOP_RAISE(&a, &b, self, other, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b)); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ \
+ return result; \
+}
+
+/* Ternary function with an optional context arg. */
+#define Dec_TernaryFuncVA(MPDFUNC) \
+static PyObject * \
+dec_##MPDFUNC(PyObject *self, PyObject *args, PyObject *kwds) \
+{ \
+ static char *kwlist[] = {"other", "third", "context", NULL}; \
+ PyObject *other, *third, *context; \
+ PyObject *a, *b, *c; \
+ PyObject *result; \
+ uint32_t status = 0; \
+ \
+ CURRENT_CONTEXT(context); \
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist, \
+ &other, &third, &context)) { \
+ return NULL; \
+ } \
+ CONTEXT_CHECK_VA(context); \
+ CONVERT_TERNOP_RAISE(&a, &b, &c, self, other, third, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ Py_DECREF(c); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b), MPD(c), CTX(context), &status); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ Py_DECREF(c); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+
+/**********************************************/
+/* Number methods */
+/**********************************************/
+
+Dec_UnaryNumberMethod(mpd_qminus)
+Dec_UnaryNumberMethod(mpd_qplus)
+Dec_UnaryNumberMethod(mpd_qabs)
+
+Dec_BinaryNumberMethod(mpd_qadd)
+Dec_BinaryNumberMethod(mpd_qsub)
+Dec_BinaryNumberMethod(mpd_qmul)
+Dec_BinaryNumberMethod(mpd_qdiv)
+Dec_BinaryNumberMethod(mpd_qrem)
+Dec_BinaryNumberMethod(mpd_qdivint)
+
+static PyObject *
+nm_dec_as_long(PyObject *dec)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ return dec_as_long(dec, context, MPD_ROUND_DOWN);
+}
+
+static int
+nm_nonzero(PyObject *v)
+{
+ return !mpd_iszero(MPD(v));
+}
+
+static PyObject *
+nm_mpd_qdivmod(PyObject *v, PyObject *w)
+{
+ PyObject *a, *b;
+ PyObject *q, *r;
+ PyObject *context;
+ uint32_t status = 0;
+ PyObject *ret;
+
+ CURRENT_CONTEXT(context);
+ CONVERT_BINOP(&a, &b, v, w, context);
+
+ q = dec_alloc();
+ if (q == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return NULL;
+ }
+ r = dec_alloc();
+ if (r == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ Py_DECREF(q);
+ return NULL;
+ }
+
+ mpd_qdivmod(MPD(q), MPD(r), MPD(a), MPD(b), CTX(context), &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(r);
+ Py_DECREF(q);
+ return NULL;
+ }
+
+ ret = Py_BuildValue("(OO)", q, r);
+ Py_DECREF(r);
+ Py_DECREF(q);
+ return ret;
+}
+
+static mpd_uint_t data_zero[1] = {0};
+static const mpd_t zero = {MPD_STATIC|MPD_CONST_DATA, 0, 1, 1, 1, data_zero};
+
+static PyObject *
+nm_mpd_qpow(PyObject *base, PyObject *exp, PyObject *mod)
+{
+ PyObject *a, *b, *c = NULL;
+ PyObject *result;
+ PyObject *context;
+ uint32_t status = 0;
+
+ CURRENT_CONTEXT(context);
+ CONVERT_BINOP(&a, &b, base, exp, context);
+
+ if (mod != Py_None) {
+ if (!convert_op(NOT_IMPL, &c, mod, context)) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return c;
+ }
+ }
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ Py_XDECREF(c);
+ return NULL;
+ }
+
+ if (c == NULL) {
+ mpd_qpow(MPD(result), MPD(a), MPD(b),
+ CTX(context), &status);
+ }
+ else {
+ mpd_qpowmod(MPD(result), MPD(a), MPD(b), MPD(c),
+ CTX(context), &status);
+ Py_DECREF(c);
+ }
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+
+/******************************************************************************/
+/* Decimal Methods */
+/******************************************************************************/
+
+/* Unary arithmetic functions, optional context arg */
+Dec_UnaryFuncVA(mpd_qexp)
+Dec_UnaryFuncVA(mpd_qln)
+Dec_UnaryFuncVA(mpd_qlog10)
+Dec_UnaryFuncVA(mpd_qnext_minus)
+Dec_UnaryFuncVA(mpd_qnext_plus)
+Dec_UnaryFuncVA(mpd_qreduce)
+Dec_UnaryFuncVA(mpd_qsqrt)
+
+/* Binary arithmetic functions, optional context arg */
+Dec_BinaryFuncVA(mpd_qcompare)
+Dec_BinaryFuncVA(mpd_qcompare_signal)
+Dec_BinaryFuncVA(mpd_qmax)
+Dec_BinaryFuncVA(mpd_qmax_mag)
+Dec_BinaryFuncVA(mpd_qmin)
+Dec_BinaryFuncVA(mpd_qmin_mag)
+Dec_BinaryFuncVA(mpd_qnext_toward)
+Dec_BinaryFuncVA(mpd_qrem_near)
+
+/* Ternary arithmetic functions, optional context arg */
+Dec_TernaryFuncVA(mpd_qfma)
+
+/* Boolean functions, no context arg */
+Dec_BoolFunc(mpd_iscanonical)
+Dec_BoolFunc(mpd_isfinite)
+Dec_BoolFunc(mpd_isinfinite)
+Dec_BoolFunc(mpd_isnan)
+Dec_BoolFunc(mpd_isqnan)
+Dec_BoolFunc(mpd_issnan)
+Dec_BoolFunc(mpd_issigned)
+Dec_BoolFunc(mpd_iszero)
+
+/* Boolean functions, optional context arg */
+Dec_BoolFuncVA(mpd_isnormal)
+Dec_BoolFuncVA(mpd_issubnormal)
+
+/* Unary functions, no context arg */
+static PyObject *
+dec_mpd_adjexp(PyObject *self, PyObject *dummy UNUSED)
+{
+ mpd_ssize_t retval;
+
+ if (mpd_isspecial(MPD(self))) {
+ retval = 0;
+ }
+ else {
+ retval = mpd_adjexp(MPD(self));
+ }
+
+ return PyLong_FromSsize_t(retval);
+}
+
+static PyObject *
+dec_canonical(PyObject *self, PyObject *dummy UNUSED)
+{
+ Py_INCREF(self);
+ return self;
+}
+
+static PyObject *
+dec_conjugate(PyObject *self, PyObject *dummy UNUSED)
+{
+ Py_INCREF(self);
+ return self;
+}
+
+static PyObject *
+dec_mpd_radix(PyObject *self UNUSED, PyObject *dummy UNUSED)
+{
+ PyObject *result;
+
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ _dec_settriple(result, MPD_POS, 10, 0);
+ return result;
+}
+
+/* Unary functions, optional context arg for conversion errors */
+Dec_UnaryFuncVA_NO_CTX(mpd_qcopy_abs)
+Dec_UnaryFuncVA_NO_CTX(mpd_qcopy_negate)
+
+/* Unary functions, optional context arg */
+Dec_UnaryFuncVA(mpd_qinvert)
+Dec_UnaryFuncVA(mpd_qlogb)
+
+static PyObject *
+dec_mpd_class(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"context", NULL};
+ PyObject *context;
+ const char *cp;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist,
+ &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ cp = mpd_class(MPD(self), CTX(context));
+ return PyUnicode_FromString(cp);
+}
+
+static PyObject *
+dec_mpd_to_eng(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"context", NULL};
+ PyObject *result;
+ PyObject *context;
+ mpd_ssize_t size;
+ char *s;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist,
+ &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ size = mpd_to_eng_size(&s, MPD(self), CtxCaps(context));
+ if (size < 0) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ result = unicode_fromascii(s, size);
+ mpd_free(s);
+
+ return result;
+}
+
+/* Binary functions, optional context arg for conversion errors */
+Dec_BinaryFuncVA_NO_CTX(mpd_compare_total)
+Dec_BinaryFuncVA_NO_CTX(mpd_compare_total_mag)
+
+static PyObject *
+dec_mpd_qcopy_sign(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"other", "context", NULL};
+ PyObject *other, *context;
+ PyObject *a, *b;
+ PyObject *result;
+ uint32_t status = 0;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
+ &other, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+ CONVERT_BINOP_RAISE(&a, &b, self, other, context);
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return NULL;
+ }
+
+ mpd_qcopy_sign(MPD(result), MPD(a), MPD(b), &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static PyObject *
+dec_mpd_same_quantum(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"other", "context", NULL};
+ PyObject *other, *context;
+ PyObject *a, *b;
+ PyObject *result;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
+ &other, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+ CONVERT_BINOP_RAISE(&a, &b, self, other, context);
+
+ result = mpd_same_quantum(MPD(a), MPD(b)) ? incr_true() : incr_false();
+ Py_DECREF(a);
+ Py_DECREF(b);
+
+ return result;
+}
+
+/* Binary functions, optional context arg */
+Dec_BinaryFuncVA(mpd_qand)
+Dec_BinaryFuncVA(mpd_qor)
+Dec_BinaryFuncVA(mpd_qxor)
+
+Dec_BinaryFuncVA(mpd_qrotate)
+Dec_BinaryFuncVA(mpd_qscaleb)
+Dec_BinaryFuncVA(mpd_qshift)
+
+static PyObject *
+dec_mpd_qquantize(PyObject *v, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"exp", "rounding", "context", NULL};
+ PyObject *w, *context;
+ PyObject *a, *b;
+ PyObject *result;
+ uint32_t status = 0;
+ mpd_context_t workctx;
+ int round = -1;
+
+ CURRENT_CONTEXT(context);
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iO", kwlist,
+ &w, &round, &context)) {
+ return NULL;
+ }
+ CONTEXT_CHECK_VA(context);
+
+ workctx = *CTX(context);
+ if (round >= 0) {
+ if (!mpd_qsetround(&workctx, round)) {
+ return type_error_ptr(invalid_rounding_err);
+ }
+ }
+
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context);
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return NULL;
+ }
+
+ mpd_qquantize(MPD(result), MPD(a), MPD(b), &workctx, &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+/* Special methods */
+static PyObject *
+dec_richcompare(PyObject *v, PyObject *w, int op)
+{
+ PyObject *a;
+ PyObject *b;
+ PyObject *context;
+ uint32_t status = 0;
+ int a_issnan, b_issnan;
+ int r;
+
+ assert(PyDec_Check(v));
+
+ CURRENT_CONTEXT(context);
+ CONVERT_BINOP_CMP(&a, &b, v, w, op, context);
+
+ a_issnan = mpd_issnan(MPD(a));
+ b_issnan = mpd_issnan(MPD(b));
+
+ r = mpd_qcmp(MPD(a), MPD(b), &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (r == INT_MAX) {
+ /* sNaNs or op={le,ge,lt,gt} always signal. */
+ if (a_issnan || b_issnan || (op != Py_EQ && op != Py_NE)) {
+ if (dec_addstatus(context, status)) {
+ return NULL;
+ }
+ }
+ /* qNaN comparison with op={eq,ne} or comparison
+ * with InvalidOperation disabled. */
+ return (op == Py_NE) ? incr_true() : incr_false();
+ }
+
+ switch (op) {
+ case Py_EQ:
+ r = (r == 0);
+ break;
+ case Py_NE:
+ r = (r != 0);
+ break;
+ case Py_LE:
+ r = (r <= 0);
+ break;
+ case Py_GE:
+ r = (r >= 0);
+ break;
+ case Py_LT:
+ r = (r == -1);
+ break;
+ case Py_GT:
+ r = (r == 1);
+ break;
+ }
+
+ return PyBool_FromLong(r);
+}
+
+/* __ceil__ */
+static PyObject *
+dec_ceil(PyObject *self, PyObject *dummy UNUSED)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ return dec_as_long(self, context, MPD_ROUND_CEILING);
+}
+
+/* __complex__ */
+static PyObject *
+dec_complex(PyObject *self, PyObject *dummy UNUSED)
+{
+ PyObject *f;
+ double x;
+
+ f = PyDec_AsFloat(self);
+ if (f == NULL) {
+ return NULL;
+ }
+
+ x = PyFloat_AsDouble(f);
+ Py_DECREF(f);
+ if (x == -1.0 && PyErr_Occurred()) {
+ return NULL;
+ }
+
+ return PyComplex_FromDoubles(x, 0);
+}
+
+/* __copy__ and __deepcopy__ */
+static PyObject *
+dec_copy(PyObject *self, PyObject *dummy UNUSED)
+{
+ Py_INCREF(self);
+ return self;
+}
+
+/* __floor__ */
+static PyObject *
+dec_floor(PyObject *self, PyObject *dummy UNUSED)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ return dec_as_long(self, context, MPD_ROUND_FLOOR);
+}
+
+/* Always uses the module context */
+static Py_hash_t
+_dec_hash(PyDecObject *v)
+{
+#if defined(CONFIG_64) && _PyHASH_BITS == 61
+ /* 2**61 - 1 */
+ mpd_uint_t p_data[1] = {2305843009213693951ULL};
+ mpd_t p = {MPD_POS|MPD_STATIC|MPD_CONST_DATA, 0, 19, 1, 1, p_data};
+ /* Inverse of 10 modulo p */
+ mpd_uint_t inv10_p_data[1] = {2075258708292324556ULL};
+ mpd_t inv10_p = {MPD_POS|MPD_STATIC|MPD_CONST_DATA,
+ 0, 19, 1, 1, inv10_p_data};
+#elif defined(CONFIG_32) && _PyHASH_BITS == 31
+ /* 2**31 - 1 */
+ mpd_uint_t p_data[2] = {147483647UL, 2};
+ mpd_t p = {MPD_POS|MPD_STATIC|MPD_CONST_DATA, 0, 10, 2, 2, p_data};
+ /* Inverse of 10 modulo p */
+ mpd_uint_t inv10_p_data[2] = {503238553UL, 1};
+ mpd_t inv10_p = {MPD_POS|MPD_STATIC|MPD_CONST_DATA,
+ 0, 10, 2, 2, inv10_p_data};
+#else
+ #error "No valid combination of CONFIG_64, CONFIG_32 and _PyHASH_BITS"
+#endif
+ const Py_hash_t py_hash_inf = 314159;
+ const Py_hash_t py_hash_nan = 0;
+ mpd_uint_t ten_data[1] = {10};
+ mpd_t ten = {MPD_POS|MPD_STATIC|MPD_CONST_DATA,
+ 0, 2, 1, 1, ten_data};
+ Py_hash_t result;
+ mpd_t *exp_hash = NULL;
+ mpd_t *tmp = NULL;
+ mpd_ssize_t exp;
+ uint32_t status = 0;
+ mpd_context_t maxctx;
+ PyObject *context;
+
+
+ context = current_context();
+ if (context == NULL) {
+ return -1;
+ }
+
+ if (mpd_isspecial(MPD(v))) {
+ if (mpd_issnan(MPD(v))) {
+ PyErr_SetString(PyExc_TypeError,
+ "Cannot hash a signaling NaN value");
+ return -1;
+ }
+ else if (mpd_isnan(MPD(v))) {
+ return py_hash_nan;
+ }
+ else {
+ return py_hash_inf * mpd_arith_sign(MPD(v));
+ }
+ }
+
+ mpd_maxcontext(&maxctx);
+ exp_hash = mpd_qnew();
+ if (exp_hash == NULL) {
+ goto malloc_error;
+ }
+ tmp = mpd_qnew();
+ if (tmp == NULL) {
+ goto malloc_error;
+ }
+
+ /*
+ * exp(v): exponent of v
+ * int(v): coefficient of v
+ */
+ exp = MPD(v)->exp;
+ if (exp >= 0) {
+ /* 10**exp(v) % p */
+ mpd_qsset_ssize(tmp, exp, &maxctx, &status);
+ mpd_qpowmod(exp_hash, &ten, tmp, &p, &maxctx, &status);
+ }
+ else {
+ /* inv10_p**(-exp(v)) % p */
+ mpd_qsset_ssize(tmp, -exp, &maxctx, &status);
+ mpd_qpowmod(exp_hash, &inv10_p, tmp, &p, &maxctx, &status);
+ }
+
+ /* hash = (int(v) * exp_hash) % p */
+ if (!mpd_qcopy(tmp, MPD(v), &status)) {
+ goto malloc_error;
+ }
+ tmp->exp = 0;
+ mpd_set_positive(tmp);
+
+ maxctx.prec = MPD_MAX_PREC + 21;
+ maxctx.emax = MPD_MAX_EMAX + 21;
+ maxctx.emin = MPD_MIN_EMIN - 21;
+
+ mpd_qmul(tmp, tmp, exp_hash, &maxctx, &status);
+ mpd_qrem(tmp, tmp, &p, &maxctx, &status);
+
+ result = mpd_qget_ssize(tmp, &status);
+ result = mpd_ispositive(MPD(v)) ? result : -result;
+ result = (result == -1) ? -2 : result;
+
+ if (status != 0) {
+ if (status & MPD_Malloc_error) {
+ goto malloc_error;
+ }
+ else {
+ PyErr_SetString(PyExc_RuntimeError,
+ "dec_hash: internal error: please report");
+ }
+ result = -1;
+ }
+
+
+finish:
+ if (exp_hash) mpd_del(exp_hash);
+ if (tmp) mpd_del(tmp);
+ return result;
+
+malloc_error:
+ PyErr_NoMemory();
+ result = -1;
+ goto finish;
+}
+
+static Py_hash_t
+dec_hash(PyDecObject *self)
+{
+ if (self->hash == -1) {
+ self->hash = _dec_hash(self);
+ }
+
+ return self->hash;
+}
+
+/* __reduce__ */
+static PyObject *
+dec_reduce(PyObject *self, PyObject *dummy UNUSED)
+{
+ PyObject *result, *str;
+
+ str = dec_str(self);
+ if (str == NULL) {
+ return NULL;
+ }
+
+ result = Py_BuildValue("O(O)", Py_TYPE(self), str);
+ Py_DECREF(str);
+
+ return result;
+}
+
+/* __sizeof__ */
+static PyObject *
+dec_sizeof(PyObject *v, PyObject *dummy UNUSED)
+{
+ Py_ssize_t res;
+
+ res = sizeof(PyDecObject);
+ if (mpd_isdynamic_data(MPD(v))) {
+ res += MPD(v)->alloc * sizeof(mpd_uint_t);
+ }
+ return PyLong_FromSsize_t(res);
+}
+
+/* __trunc__ */
+static PyObject *
+dec_trunc(PyObject *self, PyObject *dummy UNUSED)
+{
+ PyObject *context;
+
+ CURRENT_CONTEXT(context);
+ return dec_as_long(self, context, MPD_ROUND_DOWN);
+}
+
+/* real and imag */
+static PyObject *
+dec_real(PyObject *self, void *closure UNUSED)
+{
+ Py_INCREF(self);
+ return self;
+}
+
+static PyObject *
+dec_imag(PyObject *self UNUSED, void *closure UNUSED)
+{
+ PyObject *result;
+
+ result = dec_alloc();
+ if (result == NULL) {
+ return NULL;
+ }
+
+ _dec_settriple(result, MPD_POS, 0, 0);
+ return result;
+}
+
+
+static PyGetSetDef dec_getsets [] =
+{
+ { "real", (getter)dec_real, NULL, NULL, NULL},
+ { "imag", (getter)dec_imag, NULL, NULL, NULL},
+ {NULL}
+};
+
+static PyNumberMethods dec_number_methods =
+{
+ (binaryfunc) nm_mpd_qadd,
+ (binaryfunc) nm_mpd_qsub,
+ (binaryfunc) nm_mpd_qmul,
+ (binaryfunc) nm_mpd_qrem,
+ (binaryfunc) nm_mpd_qdivmod,
+ (ternaryfunc) nm_mpd_qpow,
+ (unaryfunc) nm_mpd_qminus,
+ (unaryfunc) nm_mpd_qplus,
+ (unaryfunc) nm_mpd_qabs,
+ (inquiry) nm_nonzero,
+ (unaryfunc) 0, /* no bit-complement */
+ (binaryfunc) 0, /* no shiftl */
+ (binaryfunc) 0, /* no shiftr */
+ (binaryfunc) 0, /* no bit-and */
+ (binaryfunc) 0, /* no bit-xor */
+ (binaryfunc) 0, /* no bit-ior */
+ (unaryfunc) nm_dec_as_long,
+ 0, /* nb_reserved */
+ (unaryfunc) PyDec_AsFloat,
+ 0, /* binaryfunc nb_inplace_add; */
+ 0, /* binaryfunc nb_inplace_subtract; */
+ 0, /* binaryfunc nb_inplace_multiply; */
+ 0, /* binaryfunc nb_inplace_remainder; */
+ 0, /* ternaryfunc nb_inplace_power; */
+ 0, /* binaryfunc nb_inplace_lshift; */
+ 0, /* binaryfunc nb_inplace_rshift; */
+ 0, /* binaryfunc nb_inplace_and; */
+ 0, /* binaryfunc nb_inplace_xor; */
+ 0, /* binaryfunc nb_inplace_or; */
+ (binaryfunc) nm_mpd_qdivint, /* binaryfunc nb_floor_divide; */
+ (binaryfunc) nm_mpd_qdiv, /* binaryfunc nb_true_divide; */
+ 0, /* binaryfunc nb_inplace_floor_divide; */
+ 0, /* binaryfunc nb_inplace_true_divide; */
+};
+
+static PyMethodDef dec_methods [] =
+{
+ /* Unary arithmetic functions, optional context arg */
+ { "exp", (PyCFunction)dec_mpd_qexp, METH_VARARGS|METH_KEYWORDS, doc_exp },
+ { "ln", (PyCFunction)dec_mpd_qln, METH_VARARGS|METH_KEYWORDS, doc_ln },
+ { "log10", (PyCFunction)dec_mpd_qlog10, METH_VARARGS|METH_KEYWORDS, doc_log10 },
+ { "next_minus", (PyCFunction)dec_mpd_qnext_minus, METH_VARARGS|METH_KEYWORDS, doc_next_minus },
+ { "next_plus", (PyCFunction)dec_mpd_qnext_plus, METH_VARARGS|METH_KEYWORDS, doc_next_plus },
+ { "normalize", (PyCFunction)dec_mpd_qreduce, METH_VARARGS|METH_KEYWORDS, doc_normalize },
+ { "to_integral", (PyCFunction)PyDec_ToIntegralValue, METH_VARARGS|METH_KEYWORDS, doc_to_integral },
+ { "to_integral_exact", (PyCFunction)PyDec_ToIntegralExact, METH_VARARGS|METH_KEYWORDS, doc_to_integral_exact },
+ { "to_integral_value", (PyCFunction)PyDec_ToIntegralValue, METH_VARARGS|METH_KEYWORDS, doc_to_integral_value },
+ { "sqrt", (PyCFunction)dec_mpd_qsqrt, METH_VARARGS|METH_KEYWORDS, doc_sqrt },
+
+ /* Binary arithmetic functions, optional context arg */
+ { "compare", (PyCFunction)dec_mpd_qcompare, METH_VARARGS|METH_KEYWORDS, doc_compare },
+ { "compare_signal", (PyCFunction)dec_mpd_qcompare_signal, METH_VARARGS|METH_KEYWORDS, doc_compare_signal },
+ { "max", (PyCFunction)dec_mpd_qmax, METH_VARARGS|METH_KEYWORDS, doc_max },
+ { "max_mag", (PyCFunction)dec_mpd_qmax_mag, METH_VARARGS|METH_KEYWORDS, doc_max_mag },
+ { "min", (PyCFunction)dec_mpd_qmin, METH_VARARGS|METH_KEYWORDS, doc_min },
+ { "min_mag", (PyCFunction)dec_mpd_qmin_mag, METH_VARARGS|METH_KEYWORDS, doc_min_mag },
+ { "next_toward", (PyCFunction)dec_mpd_qnext_toward, METH_VARARGS|METH_KEYWORDS, doc_next_toward },
+ { "quantize", (PyCFunction)dec_mpd_qquantize, METH_VARARGS|METH_KEYWORDS, doc_quantize },
+ { "remainder_near", (PyCFunction)dec_mpd_qrem_near, METH_VARARGS|METH_KEYWORDS, doc_remainder_near },
+
+ /* Ternary arithmetic functions, optional context arg */
+ { "fma", (PyCFunction)dec_mpd_qfma, METH_VARARGS|METH_KEYWORDS, doc_fma },
+
+ /* Boolean functions, no context arg */
+ { "is_canonical", dec_mpd_iscanonical, METH_NOARGS, doc_is_canonical },
+ { "is_finite", dec_mpd_isfinite, METH_NOARGS, doc_is_finite },
+ { "is_infinite", dec_mpd_isinfinite, METH_NOARGS, doc_is_infinite },
+ { "is_nan", dec_mpd_isnan, METH_NOARGS, doc_is_nan },
+ { "is_qnan", dec_mpd_isqnan, METH_NOARGS, doc_is_qnan },
+ { "is_snan", dec_mpd_issnan, METH_NOARGS, doc_is_snan },
+ { "is_signed", dec_mpd_issigned, METH_NOARGS, doc_is_signed },
+ { "is_zero", dec_mpd_iszero, METH_NOARGS, doc_is_zero },
+
+ /* Boolean functions, optional context arg */
+ { "is_normal", (PyCFunction)dec_mpd_isnormal, METH_VARARGS|METH_KEYWORDS, doc_is_normal },
+ { "is_subnormal", (PyCFunction)dec_mpd_issubnormal, METH_VARARGS|METH_KEYWORDS, doc_is_subnormal },
+
+ /* Unary functions, no context arg */
+ { "adjusted", dec_mpd_adjexp, METH_NOARGS, doc_adjusted },
+ { "canonical", dec_canonical, METH_NOARGS, doc_canonical },
+ { "conjugate", dec_conjugate, METH_NOARGS, doc_conjugate },
+ { "radix", dec_mpd_radix, METH_NOARGS, doc_radix },
+
+ /* Unary functions, optional context arg for conversion errors */
+ { "copy_abs", (PyCFunction)dec_mpd_qcopy_abs, METH_VARARGS|METH_KEYWORDS, doc_copy_abs },
+ { "copy_negate", (PyCFunction)dec_mpd_qcopy_negate, METH_VARARGS|METH_KEYWORDS, doc_copy_negate },
+
+ /* Unary functions, optional context arg */
+ { "logb", (PyCFunction)dec_mpd_qlogb, METH_VARARGS|METH_KEYWORDS, doc_logb },
+ { "logical_invert", (PyCFunction)dec_mpd_qinvert, METH_VARARGS|METH_KEYWORDS, doc_logical_invert },
+ { "number_class", (PyCFunction)dec_mpd_class, METH_VARARGS|METH_KEYWORDS, doc_number_class },
+ { "to_eng_string", (PyCFunction)dec_mpd_to_eng, METH_VARARGS|METH_KEYWORDS, doc_to_eng_string },
+
+ /* Binary functions, optional context arg for conversion errors */
+ { "compare_total", (PyCFunction)dec_mpd_compare_total, METH_VARARGS|METH_KEYWORDS, doc_compare_total },
+ { "compare_total_mag", (PyCFunction)dec_mpd_compare_total_mag, METH_VARARGS|METH_KEYWORDS, doc_compare_total_mag },
+ { "copy_sign", (PyCFunction)dec_mpd_qcopy_sign, METH_VARARGS|METH_KEYWORDS, doc_copy_sign },
+ { "same_quantum", (PyCFunction)dec_mpd_same_quantum, METH_VARARGS|METH_KEYWORDS, doc_same_quantum },
+
+ /* Binary functions, optional context arg */
+ { "logical_and", (PyCFunction)dec_mpd_qand, METH_VARARGS|METH_KEYWORDS, doc_logical_and },
+ { "logical_or", (PyCFunction)dec_mpd_qor, METH_VARARGS|METH_KEYWORDS, doc_logical_or },
+ { "logical_xor", (PyCFunction)dec_mpd_qxor, METH_VARARGS|METH_KEYWORDS, doc_logical_xor },
+ { "rotate", (PyCFunction)dec_mpd_qrotate, METH_VARARGS|METH_KEYWORDS, doc_rotate },
+ { "scaleb", (PyCFunction)dec_mpd_qscaleb, METH_VARARGS|METH_KEYWORDS, doc_scaleb },
+ { "shift", (PyCFunction)dec_mpd_qshift, METH_VARARGS|METH_KEYWORDS, doc_shift },
+
+ /* Miscellaneous */
+ { "from_float", dec_from_float, METH_O|METH_CLASS, doc_from_float },
+ { "as_tuple", PyDec_AsTuple, METH_NOARGS, doc_as_tuple },
+
+ /* Special methods */
+ { "__copy__", dec_copy, METH_NOARGS, NULL },
+ { "__deepcopy__", dec_copy, METH_O, NULL },
+ { "__format__", dec_format, METH_VARARGS, NULL },
+ { "__reduce__", dec_reduce, METH_NOARGS, NULL },
+ { "__round__", PyDec_Round, METH_VARARGS, NULL },
+ { "__ceil__", dec_ceil, METH_NOARGS, NULL },
+ { "__floor__", dec_floor, METH_NOARGS, NULL },
+ { "__trunc__", dec_trunc, METH_NOARGS, NULL },
+ { "__complex__", dec_complex, METH_NOARGS, NULL },
+ { "__sizeof__", dec_sizeof, METH_NOARGS, NULL },
+
+ { NULL, NULL, 1 }
+};
+
+static PyTypeObject PyDec_Type =
+{
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "decimal.Decimal", /* tp_name */
+ sizeof(PyDecObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor) dec_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) 0, /* tp_getattr */
+ (setattrfunc) 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc) dec_repr, /* tp_repr */
+ &dec_number_methods, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ (hashfunc) dec_hash, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc) dec_str, /* tp_str */
+ (getattrofunc) PyObject_GenericGetAttr, /* tp_getattro */
+ (setattrofunc) 0, /* tp_setattro */
+ (PyBufferProcs *) 0, /* tp_as_buffer */
+ (Py_TPFLAGS_DEFAULT|
+ Py_TPFLAGS_BASETYPE), /* tp_flags */
+ doc_decimal, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ dec_richcompare, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ dec_methods, /* tp_methods */
+ 0, /* tp_members */
+ dec_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ dec_new, /* tp_new */
+ PyObject_Del, /* tp_free */
+};
+
+
+/******************************************************************************/
+/* Context Object, Part 2 */
+/******************************************************************************/
+
+
+/************************************************************************/
+/* Macros for converting mpdecimal functions to Context methods */
+/************************************************************************/
+
+/* Boolean context method. */
+#define DecCtx_BoolFunc(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *v) \
+{ \
+ PyObject *ret; \
+ PyObject *a; \
+ \
+ CONVERT_OP_RAISE(&a, v, context); \
+ \
+ ret = MPDFUNC(MPD(a), CTX(context)) ? incr_true() : incr_false(); \
+ Py_DECREF(a); \
+ return ret; \
+}
+
+/* Boolean context method. MPDFUNC does NOT use a context. */
+#define DecCtx_BoolFunc_NO_CTX(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *v) \
+{ \
+ PyObject *ret; \
+ PyObject *a; \
+ \
+ CONVERT_OP_RAISE(&a, v, context); \
+ \
+ ret = MPDFUNC(MPD(a)) ? incr_true() : incr_false(); \
+ Py_DECREF(a); \
+ return ret; \
+}
+
+/* Unary context method. */
+#define DecCtx_UnaryFunc(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *v) \
+{ \
+ PyObject *result, *a; \
+ uint32_t status = 0; \
+ \
+ CONVERT_OP_RAISE(&a, v, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), CTX(context), &status); \
+ Py_DECREF(a); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/* Binary context method. */
+#define DecCtx_BinaryFunc(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *args) \
+{ \
+ PyObject *v, *w; \
+ PyObject *a, *b; \
+ PyObject *result; \
+ uint32_t status = 0; \
+ \
+ if (!PyArg_ParseTuple(args, "OO", &v, &w)) { \
+ return NULL; \
+ } \
+ \
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b), CTX(context), &status); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+/*
+ * Binary context method. The context is only used for conversion.
+ * The actual MPDFUNC does NOT take a context arg.
+ */
+#define DecCtx_BinaryFunc_NO_CTX(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *args) \
+{ \
+ PyObject *v, *w; \
+ PyObject *a, *b; \
+ PyObject *result; \
+ \
+ if (!PyArg_ParseTuple(args, "OO", &v, &w)) { \
+ return NULL; \
+ } \
+ \
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b)); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ \
+ return result; \
+}
+
+/* Ternary context method. */
+#define DecCtx_TernaryFunc(MPDFUNC) \
+static PyObject * \
+ctx_##MPDFUNC(PyObject *context, PyObject *args) \
+{ \
+ PyObject *v, *w, *x; \
+ PyObject *a, *b, *c; \
+ PyObject *result; \
+ uint32_t status = 0; \
+ \
+ if (!PyArg_ParseTuple(args, "OOO", &v, &w, &x)) { \
+ return NULL; \
+ } \
+ \
+ CONVERT_TERNOP_RAISE(&a, &b, &c, v, w, x, context); \
+ \
+ if ((result = dec_alloc()) == NULL) { \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ Py_DECREF(c); \
+ return NULL; \
+ } \
+ \
+ MPDFUNC(MPD(result), MPD(a), MPD(b), MPD(c), CTX(context), &status); \
+ Py_DECREF(a); \
+ Py_DECREF(b); \
+ Py_DECREF(c); \
+ if (dec_addstatus(context, status)) { \
+ Py_DECREF(result); \
+ return NULL; \
+ } \
+ \
+ return result; \
+}
+
+
+/* Unary arithmetic functions */
+DecCtx_UnaryFunc(mpd_qabs)
+DecCtx_UnaryFunc(mpd_qexp)
+DecCtx_UnaryFunc(mpd_qln)
+DecCtx_UnaryFunc(mpd_qlog10)
+DecCtx_UnaryFunc(mpd_qminus)
+DecCtx_UnaryFunc(mpd_qnext_minus)
+DecCtx_UnaryFunc(mpd_qnext_plus)
+DecCtx_UnaryFunc(mpd_qplus)
+DecCtx_UnaryFunc(mpd_qreduce)
+DecCtx_UnaryFunc(mpd_qround_to_int)
+DecCtx_UnaryFunc(mpd_qround_to_intx)
+DecCtx_UnaryFunc(mpd_qsqrt)
+
+/* Binary arithmetic functions */
+DecCtx_BinaryFunc(mpd_qadd)
+DecCtx_BinaryFunc(mpd_qcompare)
+DecCtx_BinaryFunc(mpd_qcompare_signal)
+DecCtx_BinaryFunc(mpd_qdiv)
+DecCtx_BinaryFunc(mpd_qdivint)
+DecCtx_BinaryFunc(mpd_qmax)
+DecCtx_BinaryFunc(mpd_qmax_mag)
+DecCtx_BinaryFunc(mpd_qmin)
+DecCtx_BinaryFunc(mpd_qmin_mag)
+DecCtx_BinaryFunc(mpd_qmul)
+DecCtx_BinaryFunc(mpd_qnext_toward)
+DecCtx_BinaryFunc(mpd_qquantize)
+DecCtx_BinaryFunc(mpd_qrem)
+DecCtx_BinaryFunc(mpd_qrem_near)
+DecCtx_BinaryFunc(mpd_qsub)
+
+static PyObject *
+ctx_mpd_qdivmod(PyObject *context, PyObject *args)
+{
+ PyObject *v, *w;
+ PyObject *a, *b;
+ PyObject *q, *r;
+ uint32_t status = 0;
+ PyObject *ret;
+
+ if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
+ return NULL;
+ }
+
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context);
+
+ q = dec_alloc();
+ if (q == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return NULL;
+ }
+ r = dec_alloc();
+ if (r == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ Py_DECREF(q);
+ return NULL;
+ }
+
+ mpd_qdivmod(MPD(q), MPD(r), MPD(a), MPD(b), CTX(context), &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(r);
+ Py_DECREF(q);
+ return NULL;
+ }
+
+ ret = Py_BuildValue("(OO)", q, r);
+ Py_DECREF(r);
+ Py_DECREF(q);
+ return ret;
+}
+
+/* Binary or ternary arithmetic functions */
+static PyObject *
+ctx_mpd_qpow(PyObject *context, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"a", "b", "modulo", NULL};
+ PyObject *base, *exp, *mod = NULL;
+ PyObject *a, *b, *c = NULL;
+ PyObject *result;
+ uint32_t status = 0;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist,
+ &base, &exp, &mod)) {
+ return NULL;
+ }
+
+ CONVERT_BINOP_RAISE(&a, &b, base, exp, context);
+
+ if (mod != NULL) {
+ if (!convert_op(TYPE_ERR, &c, mod, context)) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return c;
+ }
+ }
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ Py_XDECREF(c);
+ return NULL;
+ }
+
+ if (c == NULL) {
+ mpd_qpow(MPD(result), MPD(a), MPD(b),
+ CTX(context), &status);
+ }
+ else {
+ mpd_qpowmod(MPD(result), MPD(a), MPD(b), MPD(c),
+ CTX(context), &status);
+ Py_DECREF(c);
+ }
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+/* Ternary arithmetic functions */
+DecCtx_TernaryFunc(mpd_qfma)
+
+/* No argument */
+static PyObject *
+ctx_mpd_radix(PyObject *context, PyObject *dummy)
+{
+ return dec_mpd_radix(context, dummy);
+}
+
+/* Boolean functions: single decimal argument */
+DecCtx_BoolFunc(mpd_isnormal)
+DecCtx_BoolFunc(mpd_issubnormal)
+DecCtx_BoolFunc_NO_CTX(mpd_isfinite)
+DecCtx_BoolFunc_NO_CTX(mpd_isinfinite)
+DecCtx_BoolFunc_NO_CTX(mpd_isnan)
+DecCtx_BoolFunc_NO_CTX(mpd_isqnan)
+DecCtx_BoolFunc_NO_CTX(mpd_issigned)
+DecCtx_BoolFunc_NO_CTX(mpd_issnan)
+DecCtx_BoolFunc_NO_CTX(mpd_iszero)
+
+static PyObject *
+ctx_iscanonical(PyObject *context UNUSED, PyObject *v)
+{
+ if (!PyDec_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument must be a Decimal");
+ return NULL;
+ }
+
+ return mpd_iscanonical(MPD(v)) ? incr_true() : incr_false();
+}
+
+/* Functions with a single decimal argument */
+static PyObject *
+PyDecContext_Apply(PyObject *context, PyObject *v)
+{
+ PyObject *result, *a;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ result = dec_apply(a, context);
+ Py_DECREF(a);
+ return result;
+}
+
+static PyObject *
+ctx_canonical(PyObject *context UNUSED, PyObject *v)
+{
+ if (!PyDec_Check(v)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument must be a Decimal");
+ return NULL;
+ }
+
+ Py_INCREF(v);
+ return v;
+}
+
+static PyObject *
+ctx_mpd_qcopy_abs(PyObject *context, PyObject *v)
+{
+ PyObject *result, *a;
+ uint32_t status = 0;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ return NULL;
+ }
+
+ mpd_qcopy_abs(MPD(result), MPD(a), &status);
+ Py_DECREF(a);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+static PyObject *
+ctx_copy_decimal(PyObject *context, PyObject *v)
+{
+ PyObject *result;
+
+ CONVERT_OP_RAISE(&result, v, context);
+ return result;
+}
+
+static PyObject *
+ctx_mpd_qcopy_negate(PyObject *context, PyObject *v)
+{
+ PyObject *result, *a;
+ uint32_t status = 0;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ return NULL;
+ }
+
+ mpd_qcopy_negate(MPD(result), MPD(a), &status);
+ Py_DECREF(a);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+DecCtx_UnaryFunc(mpd_qlogb)
+DecCtx_UnaryFunc(mpd_qinvert)
+
+static PyObject *
+ctx_mpd_class(PyObject *context, PyObject *v)
+{
+ PyObject *a;
+ const char *cp;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ cp = mpd_class(MPD(a), CTX(context));
+ Py_DECREF(a);
+
+ return PyUnicode_FromString(cp);
+}
+
+static PyObject *
+ctx_mpd_to_sci(PyObject *context, PyObject *v)
+{
+ PyObject *result;
+ PyObject *a;
+ mpd_ssize_t size;
+ char *s;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ size = mpd_to_sci_size(&s, MPD(a), CtxCaps(context));
+ Py_DECREF(a);
+ if (size < 0) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ result = unicode_fromascii(s, size);
+ mpd_free(s);
+
+ return result;
+}
+
+static PyObject *
+ctx_mpd_to_eng(PyObject *context, PyObject *v)
+{
+ PyObject *result;
+ PyObject *a;
+ mpd_ssize_t size;
+ char *s;
+
+ CONVERT_OP_RAISE(&a, v, context);
+
+ size = mpd_to_eng_size(&s, MPD(a), CtxCaps(context));
+ Py_DECREF(a);
+ if (size < 0) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ result = unicode_fromascii(s, size);
+ mpd_free(s);
+
+ return result;
+}
+
+/* Functions with two decimal arguments */
+DecCtx_BinaryFunc_NO_CTX(mpd_compare_total)
+DecCtx_BinaryFunc_NO_CTX(mpd_compare_total_mag)
+
+static PyObject *
+ctx_mpd_qcopy_sign(PyObject *context, PyObject *args)
+{
+ PyObject *v, *w;
+ PyObject *a, *b;
+ PyObject *result;
+ uint32_t status = 0;
+
+ if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
+ return NULL;
+ }
+
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context);
+
+ result = dec_alloc();
+ if (result == NULL) {
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return NULL;
+ }
+
+ mpd_qcopy_sign(MPD(result), MPD(a), MPD(b), &status);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (dec_addstatus(context, status)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+DecCtx_BinaryFunc(mpd_qand)
+DecCtx_BinaryFunc(mpd_qor)
+DecCtx_BinaryFunc(mpd_qxor)
+
+DecCtx_BinaryFunc(mpd_qrotate)
+DecCtx_BinaryFunc(mpd_qscaleb)
+DecCtx_BinaryFunc(mpd_qshift)
+
+static PyObject *
+ctx_mpd_same_quantum(PyObject *context, PyObject *args)
+{
+ PyObject *v, *w;
+ PyObject *a, *b;
+ PyObject *result;
+
+ if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
+ return NULL;
+ }
+
+ CONVERT_BINOP_RAISE(&a, &b, v, w, context);
+
+ result = mpd_same_quantum(MPD(a), MPD(b)) ? incr_true() : incr_false();
+ Py_DECREF(a);
+ Py_DECREF(b);
+
+ return result;
+}
+
+
+static PyMethodDef context_methods [] =
+{
+ /* Unary arithmetic functions */
+ { "abs", ctx_mpd_qabs, METH_O, doc_ctx_abs },
+ { "exp", ctx_mpd_qexp, METH_O, doc_ctx_exp },
+ { "ln", ctx_mpd_qln, METH_O, doc_ctx_ln },
+ { "log10", ctx_mpd_qlog10, METH_O, doc_ctx_log10 },
+ { "minus", ctx_mpd_qminus, METH_O, doc_ctx_minus },
+ { "next_minus", ctx_mpd_qnext_minus, METH_O, doc_ctx_next_minus },
+ { "next_plus", ctx_mpd_qnext_plus, METH_O, doc_ctx_next_plus },
+ { "normalize", ctx_mpd_qreduce, METH_O, doc_ctx_normalize },
+ { "plus", ctx_mpd_qplus, METH_O, doc_ctx_plus },
+ { "to_integral", ctx_mpd_qround_to_int, METH_O, doc_ctx_to_integral },
+ { "to_integral_exact", ctx_mpd_qround_to_intx, METH_O, doc_ctx_to_integral_exact },
+ { "to_integral_value", ctx_mpd_qround_to_int, METH_O, doc_ctx_to_integral_value },
+ { "sqrt", ctx_mpd_qsqrt, METH_O, doc_ctx_sqrt },
+
+ /* Binary arithmetic functions */
+ { "add", ctx_mpd_qadd, METH_VARARGS, doc_ctx_add },
+ { "compare", ctx_mpd_qcompare, METH_VARARGS, doc_ctx_compare },
+ { "compare_signal", ctx_mpd_qcompare_signal, METH_VARARGS, doc_ctx_compare_signal },
+ { "divide", ctx_mpd_qdiv, METH_VARARGS, doc_ctx_divide },
+ { "divide_int", ctx_mpd_qdivint, METH_VARARGS, doc_ctx_divide_int },
+ { "divmod", ctx_mpd_qdivmod, METH_VARARGS, doc_ctx_divmod },
+ { "max", ctx_mpd_qmax, METH_VARARGS, doc_ctx_max },
+ { "max_mag", ctx_mpd_qmax_mag, METH_VARARGS, doc_ctx_max_mag },
+ { "min", ctx_mpd_qmin, METH_VARARGS, doc_ctx_min },
+ { "min_mag", ctx_mpd_qmin_mag, METH_VARARGS, doc_ctx_min_mag },
+ { "multiply", ctx_mpd_qmul, METH_VARARGS, doc_ctx_multiply },
+ { "next_toward", ctx_mpd_qnext_toward, METH_VARARGS, doc_ctx_next_toward },
+ { "quantize", ctx_mpd_qquantize, METH_VARARGS, doc_ctx_quantize },
+ { "remainder", ctx_mpd_qrem, METH_VARARGS, doc_ctx_remainder },
+ { "remainder_near", ctx_mpd_qrem_near, METH_VARARGS, doc_ctx_remainder_near },
+ { "subtract", ctx_mpd_qsub, METH_VARARGS, doc_ctx_subtract },
+
+ /* Binary or ternary arithmetic functions */
+ { "power", (PyCFunction)ctx_mpd_qpow, METH_VARARGS|METH_KEYWORDS, doc_ctx_power },
+
+ /* Ternary arithmetic functions */
+ { "fma", ctx_mpd_qfma, METH_VARARGS, doc_ctx_fma },
+
+ /* No argument */
+ { "Etiny", context_getetiny, METH_NOARGS, doc_ctx_Etiny },
+ { "Etop", context_getetop, METH_NOARGS, doc_ctx_Etop },
+ { "radix", ctx_mpd_radix, METH_NOARGS, doc_ctx_radix },
+
+ /* Boolean functions */
+ { "is_canonical", ctx_iscanonical, METH_O, doc_ctx_is_canonical },
+ { "is_finite", ctx_mpd_isfinite, METH_O, doc_ctx_is_finite },
+ { "is_infinite", ctx_mpd_isinfinite, METH_O, doc_ctx_is_infinite },
+ { "is_nan", ctx_mpd_isnan, METH_O, doc_ctx_is_nan },
+ { "is_normal", ctx_mpd_isnormal, METH_O, doc_ctx_is_normal },
+ { "is_qnan", ctx_mpd_isqnan, METH_O, doc_ctx_is_qnan },
+ { "is_signed", ctx_mpd_issigned, METH_O, doc_ctx_is_signed },
+ { "is_snan", ctx_mpd_issnan, METH_O, doc_ctx_is_snan },
+ { "is_subnormal", ctx_mpd_issubnormal, METH_O, doc_ctx_is_subnormal },
+ { "is_zero", ctx_mpd_iszero, METH_O, doc_ctx_is_zero },
+
+ /* Functions with a single decimal argument */
+ { "_apply", PyDecContext_Apply, METH_O, NULL }, /* alias for apply */
+#ifdef EXTRA_FUNCTIONALITY
+ { "apply", PyDecContext_Apply, METH_O, doc_ctx_apply },
+#endif
+ { "canonical", ctx_canonical, METH_O, doc_ctx_canonical },
+ { "copy_abs", ctx_mpd_qcopy_abs, METH_O, doc_ctx_copy_abs },
+ { "copy_decimal", ctx_copy_decimal, METH_O, doc_ctx_copy_decimal },
+ { "copy_negate", ctx_mpd_qcopy_negate, METH_O, doc_ctx_copy_negate },
+ { "logb", ctx_mpd_qlogb, METH_O, doc_ctx_logb },
+ { "logical_invert", ctx_mpd_qinvert, METH_O, doc_ctx_logical_invert },
+ { "number_class", ctx_mpd_class, METH_O, doc_ctx_number_class },
+ { "to_sci_string", ctx_mpd_to_sci, METH_O, doc_ctx_to_sci_string },
+ { "to_eng_string", ctx_mpd_to_eng, METH_O, doc_ctx_to_eng_string },
+
+ /* Functions with two decimal arguments */
+ { "compare_total", ctx_mpd_compare_total, METH_VARARGS, doc_ctx_compare_total },
+ { "compare_total_mag", ctx_mpd_compare_total_mag, METH_VARARGS, doc_ctx_compare_total_mag },
+ { "copy_sign", ctx_mpd_qcopy_sign, METH_VARARGS, doc_ctx_copy_sign },
+ { "logical_and", ctx_mpd_qand, METH_VARARGS, doc_ctx_logical_and },
+ { "logical_or", ctx_mpd_qor, METH_VARARGS, doc_ctx_logical_or },
+ { "logical_xor", ctx_mpd_qxor, METH_VARARGS, doc_ctx_logical_xor },
+ { "rotate", ctx_mpd_qrotate, METH_VARARGS, doc_ctx_rotate },
+ { "same_quantum", ctx_mpd_same_quantum, METH_VARARGS, doc_ctx_same_quantum },
+ { "scaleb", ctx_mpd_qscaleb, METH_VARARGS, doc_ctx_scaleb },
+ { "shift", ctx_mpd_qshift, METH_VARARGS, doc_ctx_shift },
+
+ /* Set context values */
+ { "clear_flags", context_clear_flags, METH_NOARGS, doc_ctx_clear_flags },
+ { "clear_traps", context_clear_traps, METH_NOARGS, doc_ctx_clear_traps },
+
+#ifdef CONFIG_32
+ /* Unsafe set functions with relaxed range checks */
+ { "_unsafe_setprec", context_unsafe_setprec, METH_O, NULL },
+ { "_unsafe_setemin", context_unsafe_setemin, METH_O, NULL },
+ { "_unsafe_setemax", context_unsafe_setemax, METH_O, NULL },
+#endif
+
+ /* Miscellaneous */
+ { "__copy__", (PyCFunction)context_copy, METH_NOARGS, NULL },
+ { "__reduce__", context_reduce, METH_NOARGS, NULL },
+ { "copy", (PyCFunction)context_copy, METH_NOARGS, doc_ctx_copy },
+ { "create_decimal", ctx_create_decimal, METH_VARARGS, doc_ctx_create_decimal },
+ { "create_decimal_from_float", ctx_from_float, METH_O, doc_ctx_create_decimal_from_float },
+
+ { NULL, NULL, 1 }
+};
+
+static PyTypeObject PyDecContext_Type =
+{
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "decimal.Context", /* tp_name */
+ sizeof(PyDecContextObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor) context_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc) 0, /* tp_getattr */
+ (setattrfunc) 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc) context_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ (hashfunc) 0, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc) context_repr, /* tp_str */
+ (getattrofunc) context_getattr, /* tp_getattro */
+ (setattrofunc) context_setattr, /* tp_setattro */
+ (PyBufferProcs *) 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
+ doc_context, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ context_methods, /* tp_methods */
+ 0, /* tp_members */
+ context_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ context_init, /* tp_init */
+ 0, /* tp_alloc */
+ context_new, /* tp_new */
+ PyObject_Del, /* tp_free */
+};
+
+
+static PyMethodDef _decimal_methods [] =
+{
+ { "getcontext", (PyCFunction)PyDec_GetCurrentContext, METH_NOARGS, doc_getcontext},
+ { "setcontext", (PyCFunction)PyDec_SetCurrentContext, METH_O, doc_setcontext},
+ { "localcontext", (PyCFunction)ctxmanager_new, METH_VARARGS, doc_localcontext},
+#ifdef EXTRA_FUNCTIONALITY
+ { "IEEEContext", (PyCFunction)ieee_context, METH_O, doc_ieee_context},
+#endif
+ { NULL, NULL, 1, NULL }
+};
+
+static struct PyModuleDef _decimal_module = {
+ PyModuleDef_HEAD_INIT,
+ "decimal",
+ doc__decimal,
+ -1,
+ _decimal_methods,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+struct ssize_constmap { const char *name; mpd_ssize_t val; };
+static struct ssize_constmap ssize_constants [] = {
+ {"MAX_PREC", MPD_MAX_PREC},
+ {"MAX_EMAX", MPD_MAX_EMAX},
+ {"MIN_EMIN", MPD_MIN_EMIN},
+ {"MIN_ETINY", MPD_MIN_ETINY},
+ {NULL}
+};
+
+struct int_constmap { const char *name; int val; };
+static struct int_constmap int_constants [] = {
+ /* int constants */
+#ifdef EXTRA_FUNCTIONALITY
+ {"DECIMAL32", MPD_DECIMAL32},
+ {"DECIMAL64", MPD_DECIMAL64},
+ {"DECIMAL128", MPD_DECIMAL128},
+ {"IEEE_CONTEXT_MAX_BITS", MPD_IEEE_CONTEXT_MAX_BITS},
+#endif
+ {"ROUND_CEILING", MPD_ROUND_CEILING},
+ {"ROUND_FLOOR", MPD_ROUND_FLOOR},
+ {"ROUND_UP", MPD_ROUND_UP},
+ {"ROUND_DOWN", MPD_ROUND_DOWN},
+ {"ROUND_HALF_UP", MPD_ROUND_HALF_UP},
+ {"ROUND_HALF_DOWN", MPD_ROUND_HALF_DOWN},
+ {"ROUND_HALF_EVEN", MPD_ROUND_HALF_EVEN},
+ {"ROUND_05UP", MPD_ROUND_05UP},
+#ifdef EXTRA_FUNCTIONALITY
+ {"ROUND_TRUNC", MPD_ROUND_TRUNC},
+ /* int condition flags */
+ {"DecClamped", MPD_Clamped},
+ {"DecConversionSyntax", MPD_Conversion_syntax},
+ {"DecDivisionByZero", MPD_Division_by_zero},
+ {"DecDivisionImpossible", MPD_Division_impossible},
+ {"DecDivisionUndefined", MPD_Division_undefined},
+ {"DecFpuError", MPD_Fpu_error},
+ {"DecInexact", MPD_Inexact},
+ {"DecInvalidContext", MPD_Invalid_context},
+ {"DecInvalidOperation", MPD_Invalid_operation},
+ {"DecIEEEInvalidOperation", MPD_IEEE_Invalid_operation},
+ {"DecMallocError", MPD_Malloc_error},
+ {"DecFloatOperation", MPD_Float_operation},
+ {"DecOverflow", MPD_Overflow},
+ {"DecRounded", MPD_Rounded},
+ {"DecSubnormal", MPD_Subnormal},
+ {"DecUnderflow", MPD_Underflow},
+ {"DecErrors", MPD_Errors},
+ {"DecTraps", MPD_Traps},
+#endif
+ {NULL}
+};
+
+
+#define CHECK_INT(expr) \
+ do { if ((expr) < 0) goto error; } while (0)
+#define ASSIGN_PTR(result, expr) \
+ do { result = (expr); if (result == NULL) goto error; } while (0)
+#define CHECK_PTR(expr) \
+ do { if ((expr) == NULL) goto error; } while (0)
+
+PyMODINIT_FUNC
+PyInit__decimal(void)
+{
+ PyObject *m = NULL;
+ PyObject *numbers = NULL;
+ PyObject *Number = NULL;
+ PyObject *collections = NULL;
+ PyObject *MutableMapping = NULL;
+ PyObject *obj = NULL;
+ DecCondMap *cm;
+ struct ssize_constmap *ssize_cm;
+ struct int_constmap *int_cm;
+ int i;
+
+
+ /* Init libmpdec */
+ mpd_traphandler = dec_traphandler;
+ mpd_mallocfunc = PyMem_Malloc;
+ mpd_reallocfunc = PyMem_Realloc;
+ mpd_callocfunc = mpd_callocfunc_em;
+ mpd_free = PyMem_Free;
+ mpd_setminalloc(_Py_DEC_MINALLOC);
+
+
+ /* Init types */
+ PyDec_Type.tp_base = &PyBaseObject_Type;
+ PyDecContext_Type.tp_base = &PyBaseObject_Type;
+ PyDecContextManager_Type.tp_base = &PyBaseObject_Type;
+ PyDecSignalDictMixin_Type.tp_base = &PyBaseObject_Type;
+
+ CHECK_INT(PyType_Ready(&PyDec_Type));
+ CHECK_INT(PyType_Ready(&PyDecContext_Type));
+ CHECK_INT(PyType_Ready(&PyDecSignalDictMixin_Type));
+ CHECK_INT(PyType_Ready(&PyDecContextManager_Type));
+
+ ASSIGN_PTR(obj, PyUnicode_FromString("decimal"));
+ CHECK_INT(PyDict_SetItemString(PyDec_Type.tp_dict, "__module__", obj));
+ CHECK_INT(PyDict_SetItemString(PyDecContext_Type.tp_dict,
+ "__module__", obj));
+ Py_CLEAR(obj);
+
+
+ /* Numeric abstract base classes */
+ ASSIGN_PTR(numbers, PyImport_ImportModule("numbers"));
+ ASSIGN_PTR(Number, PyObject_GetAttrString(numbers, "Number"));
+ /* Register Decimal with the Number abstract base class */
+ ASSIGN_PTR(obj, PyObject_CallMethod(Number, "register", "(O)",
+ (PyObject *)&PyDec_Type));
+ Py_CLEAR(obj);
+ /* Rational is a global variable used for fraction comparisons. */
+ ASSIGN_PTR(Rational, PyObject_GetAttrString(numbers, "Rational"));
+ /* Done with numbers, Number */
+ Py_CLEAR(numbers);
+ Py_CLEAR(Number);
+
+ /* DecimalTuple */
+ ASSIGN_PTR(collections, PyImport_ImportModule("collections"));
+ ASSIGN_PTR(DecimalTuple, PyObject_CallMethod(collections,
+ "namedtuple", "(ss)", "DecimalTuple",
+ "sign digits exponent"));
+ /* MutableMapping */
+ ASSIGN_PTR(MutableMapping, PyObject_GetAttrString(collections,
+ "MutableMapping"));
+ /* Create SignalDict type */
+ ASSIGN_PTR(PyDecSignalDict_Type,
+ (PyTypeObject *)PyObject_CallFunction(
+ (PyObject *)&PyType_Type, "s(OO){}",
+ "SignalDict", &PyDecSignalDictMixin_Type,
+ MutableMapping));
+
+ /* Done with collections, MutableMapping */
+ Py_CLEAR(collections);
+ Py_CLEAR(MutableMapping);
+
+
+ /* Create the module */
+ ASSIGN_PTR(m, PyModule_Create(&_decimal_module));
+
+
+ /* Add types to the module */
+ Py_INCREF(&PyDec_Type);
+ CHECK_INT(PyModule_AddObject(m, "Decimal", (PyObject *)&PyDec_Type));
+ Py_INCREF(&PyDecContext_Type);
+ CHECK_INT(PyModule_AddObject(m, "Context",
+ (PyObject *)&PyDecContext_Type));
+ Py_INCREF(DecimalTuple);
+ CHECK_INT(PyModule_AddObject(m, "DecimalTuple", DecimalTuple));
+
+
+ /* Create top level exception */
+ ASSIGN_PTR(DecimalException, PyErr_NewException(
+ "decimal.DecimalException",
+ PyExc_ArithmeticError, NULL));
+ Py_INCREF(DecimalException);
+ CHECK_INT(PyModule_AddObject(m, "DecimalException", DecimalException));
+
+ /* Create signal tuple */
+ ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));
+
+ /* Add exceptions that correspond to IEEE signals */
+ for (i = SIGNAL_MAP_LEN-1; i >= 0; i--) {
+ PyObject *base;
+
+ cm = signal_map + i;
+
+ switch (cm->flag) {
+ case MPD_Float_operation:
+ base = PyTuple_Pack(2, DecimalException, PyExc_TypeError);
+ break;
+ case MPD_Division_by_zero:
+ base = PyTuple_Pack(2, DecimalException, PyExc_ZeroDivisionError);
+ break;
+ case MPD_Overflow:
+ base = PyTuple_Pack(2, signal_map[INEXACT].ex,
+ signal_map[ROUNDED].ex);
+ break;
+ case MPD_Underflow:
+ base = PyTuple_Pack(3, signal_map[INEXACT].ex,
+ signal_map[ROUNDED].ex,
+ signal_map[SUBNORMAL].ex);
+ break;
+ default:
+ base = PyTuple_Pack(1, DecimalException);
+ break;
+ }
+
+ if (base == NULL) {
+ goto error;
+ }
+
+ ASSIGN_PTR(cm->ex, PyErr_NewException((char *)cm->fqname, base, NULL));
+ Py_DECREF(base);
+
+ /* add to module */
+ Py_INCREF(cm->ex);
+ CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+
+ /* add to signal tuple */
+ Py_INCREF(cm->ex);
+ PyTuple_SET_ITEM(SignalTuple, i, cm->ex);
+ }
+
+ /*
+ * Unfortunately, InvalidOperation is a signal that comprises
+ * several conditions, including InvalidOperation! Naming the
+ * signal IEEEInvalidOperation would prevent the confusion.
+ */
+ cond_map[0].ex = signal_map[0].ex;
+
+ /* Add remaining exceptions, inherit from InvalidOperation */
+ for (cm = cond_map+1; cm->name != NULL; cm++) {
+ PyObject *base;
+ if (cm->flag == MPD_Division_undefined) {
+ base = PyTuple_Pack(2, signal_map[0].ex, PyExc_ZeroDivisionError);
+ }
+ else {
+ base = PyTuple_Pack(1, signal_map[0].ex);
+ }
+ if (base == NULL) {
+ goto error;
+ }
+
+ ASSIGN_PTR(cm->ex, PyErr_NewException((char *)cm->fqname, base, NULL));
+ Py_DECREF(base);
+
+ Py_INCREF(cm->ex);
+ CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex));
+ }
+
+
+ /* Init default context template first */
+ ASSIGN_PTR(default_context_template,
+ PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
+ Py_INCREF(default_context_template);
+ CHECK_INT(PyModule_AddObject(m, "DefaultContext",
+ default_context_template));
+
+#ifdef WITHOUT_THREADS
+ /* Init module context */
+ ASSIGN_PTR(module_context,
+ PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
+ Py_INCREF(Py_False);
+ CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_False));
+#else
+ ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__"));
+ Py_INCREF(Py_True);
+ CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_True));
+#endif
+
+ /* Init basic context template */
+ ASSIGN_PTR(basic_context_template,
+ PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
+ init_basic_context(basic_context_template);
+ Py_INCREF(basic_context_template);
+ CHECK_INT(PyModule_AddObject(m, "BasicContext",
+ basic_context_template));
+
+ /* Init extended context template */
+ ASSIGN_PTR(extended_context_template,
+ PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
+ init_extended_context(extended_context_template);
+ Py_INCREF(extended_context_template);
+ CHECK_INT(PyModule_AddObject(m, "ExtendedContext",
+ extended_context_template));
+
+
+ /* Init mpd_ssize_t constants */
+ for (ssize_cm = ssize_constants; ssize_cm->name != NULL; ssize_cm++) {
+ ASSIGN_PTR(obj, PyLong_FromSsize_t(ssize_cm->val));
+ CHECK_INT(PyModule_AddObject(m, ssize_cm->name, obj));
+ obj = NULL;
+ }
+
+ /* Init int constants */
+ for (int_cm = int_constants; int_cm->name != NULL; int_cm++) {
+ CHECK_INT(PyModule_AddIntConstant(m, int_cm->name,
+ int_cm->val));
+ }
+
+ /* Add specification version number */
+ CHECK_INT(PyModule_AddStringConstant(m, "__version__", " 1.70"));
+
+
+ return m;
+
+
+error:
+ Py_CLEAR(obj); /* GCOV_NOT_REACHED */
+ Py_CLEAR(numbers); /* GCOV_NOT_REACHED */
+ Py_CLEAR(Number); /* GCOV_NOT_REACHED */
+ Py_CLEAR(Rational); /* GCOV_NOT_REACHED */
+ Py_CLEAR(collections); /* GCOV_NOT_REACHED */
+ Py_CLEAR(MutableMapping); /* GCOV_NOT_REACHED */
+ Py_CLEAR(SignalTuple); /* GCOV_NOT_REACHED */
+ Py_CLEAR(DecimalTuple); /* GCOV_NOT_REACHED */
+#ifdef WITHOUT_THREADS
+ Py_CLEAR(module_context); /* GCOV_NOT_REACHED */
+#else
+ Py_CLEAR(default_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(tls_context_key); /* GCOV_NOT_REACHED */
+#endif
+ Py_CLEAR(basic_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(extended_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(m); /* GCOV_NOT_REACHED */
+
+ return NULL; /* GCOV_NOT_REACHED */
+}
+
+
diff --git a/Modules/_decimal/docstrings.h b/Modules/_decimal/docstrings.h
new file mode 100644
index 0000000..cf150c7
--- /dev/null
+++ b/Modules/_decimal/docstrings.h
@@ -0,0 +1,753 @@
+/*
+ * Copyright (c) 2001-2012 Python Software Foundation. All Rights Reserved.
+ * Modified and extended by Stefan Krah.
+ */
+
+
+#ifndef DOCSTRINGS_H
+#define DOCSTRINGS_H
+
+
+#include "pymacro.h"
+
+
+/******************************************************************************/
+/* Module */
+/******************************************************************************/
+
+
+PyDoc_STRVAR(doc__decimal,
+"C decimal arithmetic module");
+
+PyDoc_STRVAR(doc_getcontext,"\n\
+getcontext() - Get the current default context.\n\
+\n");
+
+PyDoc_STRVAR(doc_setcontext,"\n\
+setcontext(c) - Set a new default context.\n\
+\n");
+
+PyDoc_STRVAR(doc_localcontext,"\n\
+localcontext(c) - Return a context manager that will set the default context\n\
+to a copy of c on entry to the with-statement and restore the previous default\n\
+context when exiting the with-statement. If no context is specified, a copy of\n\
+the current default context is used.\n\
+\n");
+
+#ifdef EXTRA_FUNCTIONALITY
+PyDoc_STRVAR(doc_ieee_context,"\n\
+IEEEContext(bits) - Return a context object initialized to the proper values for\n\
+one of the IEEE interchange formats. The argument must be a multiple of 32 and\n\
+less than IEEE_CONTEXT_MAX_BITS. For the most common values, the constants\n\
+DECIMAL32, DECIMAL64 and DECIMAL128 are provided.\n\
+\n");
+#endif
+
+
+/******************************************************************************/
+/* Decimal Object and Methods */
+/******************************************************************************/
+
+PyDoc_STRVAR(doc_decimal,"\n\
+Decimal([value[, context]]): Construct a new Decimal object from value.\n\
+\n\
+value can be an integer, string, tuple, or another Decimal object.\n\
+If no value is given, return Decimal('0'). The context does not affect\n\
+the conversion and is only passed to determine if the InvalidOperation\n\
+trap is active.\n\
+\n");
+
+PyDoc_STRVAR(doc_adjusted,"\n\
+adjusted() - Return the adjusted exponent of the number.\n\
+\n\
+Defined as exp + digits - 1.\n\
+\n");
+
+PyDoc_STRVAR(doc_as_tuple,"\n\
+as_tuple() - Return a tuple representation of the number.\n\
+\n");
+
+PyDoc_STRVAR(doc_canonical,"\n\
+canonical() - Return the canonical encoding of the argument. Currently,\n\
+the encoding of a Decimal instance is always canonical, so this operation\n\
+returns its argument unchanged.\n\
+\n");
+
+PyDoc_STRVAR(doc_compare,"\n\
+compare(other[, context]) - Compare self to other. Return a decimal value:\n\
+\n\
+ a or b is a NaN ==> Decimal('NaN')\n\
+ a < b ==> Decimal('-1')\n\
+ a == b ==> Decimal('0')\n\
+ a > b ==> Decimal('1')\n\
+\n");
+
+PyDoc_STRVAR(doc_compare_signal,"\n\
+compare_signal(other[, context]) - Identical to compare, except that\n\
+all NaNs signal.\n\
+\n");
+
+PyDoc_STRVAR(doc_compare_total,"\n\
+compare_total(other) - Compare two operands using their abstract representation\n\
+rather than their numerical value. Similar to the compare() method, but the\n\
+result gives a total ordering on Decimal instances. Two Decimal instances with\n\
+the same numeric value but different representations compare unequal in this\n\
+ordering:\n\
+\n\
+ >>> Decimal('12.0').compare_total(Decimal('12'))\n\
+ Decimal('-1')\n\
+\n\
+Quiet and signaling NaNs are also included in the total ordering. The result\n\
+of this function is Decimal('0') if both operands have the same representation,\n\
+Decimal('-1') if the first operand is lower in the total order than the second,\n\
+and Decimal('1') if the first operand is higher in the total order than the\n\
+second operand. See the specification for details of the total order.\n\
+\n");
+
+PyDoc_STRVAR(doc_compare_total_mag,"\n\
+compare_total_mag(other) - Compare two operands using their abstract\n\
+representation rather than their value as in compare_total(), but\n\
+ignoring the sign of each operand. x.compare_total_mag(y) is\n\
+equivalent to x.copy_abs().compare_total(y.copy_abs()).\n\
+\n");
+
+PyDoc_STRVAR(doc_conjugate,"\n\
+conjugate() - Return self.\n\
+\n");
+
+PyDoc_STRVAR(doc_copy_abs,"\n\
+copy_abs() - Return the absolute value of the argument. This operation\n\
+is unaffected by the context and is quiet: no flags are changed and no\n\
+rounding is performed.\n\
+\n");
+
+PyDoc_STRVAR(doc_copy_negate,"\n\
+copy_negate() - Return the negation of the argument. This operation is\n\
+unaffected by the context and is quiet: no flags are changed and no\n\
+rounding is performed.\n\
+\n");
+
+PyDoc_STRVAR(doc_copy_sign,"\n\
+copy_sign(other) - Return a copy of the first operand with the sign set\n\
+to be the same as the sign of the second operand. For example:\n\
+\n\
+ >>> Decimal('2.3').copy_sign(Decimal('-1.5'))\n\
+ Decimal('-2.3')\n\
+\n\
+This operation is unaffected by the context and is quiet: no flags are\n\
+changed and no rounding is performed.\n\
+\n");
+
+PyDoc_STRVAR(doc_exp,"\n\
+exp([context]) - Return the value of the (natural) exponential function e**x\n\
+at the given number. The function always uses the ROUND_HALF_EVEN mode and\n\
+the result is correctly rounded.\n\
+\n");
+
+PyDoc_STRVAR(doc_from_float,"\n\
+from_float(f) - Class method that converts a float to a decimal number, exactly.\n\
+Since 0.1 is not exactly representable in binary floating point,\n\
+Decimal.from_float(0.1) is not the same as Decimal('0.1').\n\
+\n\
+ >>> Decimal.from_float(0.1)\n\
+ Decimal('0.1000000000000000055511151231257827021181583404541015625')\n\
+ >>> Decimal.from_float(float('nan'))\n\
+ Decimal('NaN')\n\
+ >>> Decimal.from_float(float('inf'))\n\
+ Decimal('Infinity')\n\
+ >>> Decimal.from_float(float('-inf'))\n\
+ Decimal('-Infinity')\n\
+\n\
+\n");
+
+PyDoc_STRVAR(doc_fma,"\n\
+fma(other, third[, context]) - Fused multiply-add. Return self*other+third\n\
+with no rounding of the intermediate product self*other.\n\
+\n\
+ >>> Decimal(2).fma(3, 5)\n\
+ Decimal('11')\n\
+\n\
+\n");
+
+PyDoc_STRVAR(doc_is_canonical,"\n\
+is_canonical() - Return True if the argument is canonical and False otherwise.\n\
+Currently, a Decimal instance is always canonical, so this operation always\n\
+returns True.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_finite,"\n\
+is_finite() - Return True if the argument is a finite number, and False if the\n\
+argument is infinite or a NaN.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_infinite,"\n\
+is_infinite() - Return True if the argument is either positive or negative\n\
+infinity and False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_nan,"\n\
+is_nan() - Return True if the argument is a (quiet or signaling) NaN and\n\
+False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_normal,"\n\
+is_normal([context]) - Return True if the argument is a normal finite non-zero\n\
+number with an adjusted exponent greater than or equal to Emin. Return False\n\
+if the argument is zero, subnormal, infinite or a NaN.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_qnan,"\n\
+is_qnan() - Return True if the argument is a quiet NaN, and False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_signed,"\n\
+is_signed() - Return True if the argument has a negative sign and\n\
+False otherwise. Note that both zeros and NaNs can carry signs.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_snan,"\n\
+is_snan() - Return True if the argument is a signaling NaN and False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_subnormal,"\n\
+is_subnormal([context]) - Return True if the argument is subnormal, and False\n\
+otherwise. A number is subnormal if it is non-zero, finite, and has an\n\
+adjusted exponent less than Emin.\n\
+\n");
+
+PyDoc_STRVAR(doc_is_zero,"\n\
+is_zero() - Return True if the argument is a (positive or negative) zero and\n\
+False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ln,"\n\
+ln([context]) - Return the natural (base e) logarithm of the operand.\n\
+The function always uses the ROUND_HALF_EVEN mode and the result is\n\
+correctly rounded.\n\
+\n");
+
+PyDoc_STRVAR(doc_log10,"\n\
+log10([context]) - Return the base ten logarithm of the operand.\n\
+The function always uses the ROUND_HALF_EVEN mode and the result is\n\
+correctly rounded.\n\
+\n");
+
+PyDoc_STRVAR(doc_logb,"\n\
+logb([context]) - For a non-zero number, return the adjusted exponent\n\
+of the operand as a Decimal instance. If the operand is a zero, then\n\
+Decimal('-Infinity') is returned and the DivisionByZero condition is\n\
+raised. If the operand is an infinity then Decimal('Infinity') is returned.\n\
+\n");
+
+PyDoc_STRVAR(doc_logical_and,"\n\
+logical_and(other[, context]) - Return the digit-wise and of the two\n\
+(logical) operands.\n\
+\n");
+
+PyDoc_STRVAR(doc_logical_invert,"\n\
+logical_invert([context]) - Return the digit-wise inversion of the\n\
+(logical) operand.\n\
+\n");
+
+PyDoc_STRVAR(doc_logical_or,"\n\
+logical_or(other[, context]) - Return the digit-wise or of the two\n\
+(logical) operands.\n\
+\n");
+
+PyDoc_STRVAR(doc_logical_xor,"\n\
+logical_xor(other[, context]) - Return the digit-wise exclusive or of the\n\
+two (logical) operands.\n\
+\n");
+
+PyDoc_STRVAR(doc_max,"\n\
+max(other[, context]) - Maximum of self and other. If one operand is a quiet\n\
+NaN and the other is numeric, the numeric operand is returned.\n\
+\n");
+
+PyDoc_STRVAR(doc_max_mag,"\n\
+max_mag(other[, context]) - Similar to the max() method, but the comparison is\n\
+done using the absolute values of the operands.\n\
+\n");
+
+PyDoc_STRVAR(doc_min,"\n\
+min(other[, context]) - Minimum of self and other. If one operand is a quiet\n\
+NaN and the other is numeric, the numeric operand is returned.\n\
+\n");
+
+PyDoc_STRVAR(doc_min_mag,"\n\
+min_mag(other[, context]) - Similar to the min() method, but the comparison is\n\
+done using the absolute values of the operands.\n\
+\n");
+
+PyDoc_STRVAR(doc_next_minus,"\n\
+next_minus([context]) - Return the largest number representable in the given\n\
+context (or in the current default context if no context is given) that is\n\
+smaller than the given operand.\n\
+\n");
+
+PyDoc_STRVAR(doc_next_plus,"\n\
+next_plus([context]) - Return the smallest number representable in the given\n\
+context (or in the current default context if no context is given) that is\n\
+larger than the given operand.\n\
+\n");
+
+PyDoc_STRVAR(doc_next_toward,"\n\
+next_toward(other[, context]) - If the two operands are unequal, return the\n\
+number closest to the first operand in the direction of the second operand.\n\
+If both operands are numerically equal, return a copy of the first operand\n\
+with the sign set to be the same as the sign of the second operand.\n\
+\n");
+
+PyDoc_STRVAR(doc_normalize,"\n\
+normalize([context]) - Normalize the number by stripping the rightmost trailing\n\
+zeros and converting any result equal to Decimal('0') to Decimal('0e0'). Used\n\
+for producing canonical values for members of an equivalence class. For example,\n\
+Decimal('32.100') and Decimal('0.321000e+2') both normalize to the equivalent\n\
+value Decimal('32.1').\n\
+\n");
+
+PyDoc_STRVAR(doc_number_class,"\n\
+number_class([context]) - Return a string describing the class of the operand.\n\
+The returned value is one of the following ten strings:\n\
+\n\
+ * '-Infinity', indicating that the operand is negative infinity.\n\
+ * '-Normal', indicating that the operand is a negative normal number.\n\
+ * '-Subnormal', indicating that the operand is negative and subnormal.\n\
+ * '-Zero', indicating that the operand is a negative zero.\n\
+ * '+Zero', indicating that the operand is a positive zero.\n\
+ * '+Subnormal', indicating that the operand is positive and subnormal.\n\
+ * '+Normal', indicating that the operand is a positive normal number.\n\
+ * '+Infinity', indicating that the operand is positive infinity.\n\
+ * 'NaN', indicating that the operand is a quiet NaN (Not a Number).\n\
+ * 'sNaN', indicating that the operand is a signaling NaN.\n\
+\n\
+\n");
+
+PyDoc_STRVAR(doc_quantize,"\n\
+quantize(exp[, rounding[, context]]) - Return a value equal to the first\n\
+operand after rounding and having the exponent of the second operand.\n\
+\n\
+ >>> Decimal('1.41421356').quantize(Decimal('1.000'))\n\
+ Decimal('1.414')\n\
+\n\
+Unlike other operations, if the length of the coefficient after the quantize\n\
+operation would be greater than precision, then an InvalidOperation is signaled.\n\
+This guarantees that, unless there is an error condition, the quantized exponent\n\
+is always equal to that of the right-hand operand.\n\
+\n\
+Also unlike other operations, quantize never signals Underflow, even if the\n\
+result is subnormal and inexact.\n\
+\n\
+If the exponent of the second operand is larger than that of the first, then\n\
+rounding may be necessary. In this case, the rounding mode is determined by the\n\
+rounding argument if given, else by the given context argument; if neither\n\
+argument is given, the rounding mode of the current thread's context is used.\n\
+\n");
+
+PyDoc_STRVAR(doc_radix,"\n\
+radix() - Return Decimal(10), the radix (base) in which the Decimal class does\n\
+all its arithmetic. Included for compatibility with the specification.\n\
+\n");
+
+PyDoc_STRVAR(doc_remainder_near,"\n\
+remainder_near(other[, context]) - Compute the modulo as either a positive\n\
+or negative value depending on which is closest to zero. For instance,\n\
+Decimal(10).remainder_near(6) returns Decimal('-2'), which is closer to zero\n\
+than Decimal('4').\n\
+\n\
+If both are equally close, the one chosen will have the same sign as self.\n\
+\n");
+
+PyDoc_STRVAR(doc_rotate,"\n\
+rotate(other[, context]) - Return the result of rotating the digits of the\n\
+first operand by an amount specified by the second operand. The second operand\n\
+must be an integer in the range -precision through precision. The absolute\n\
+value of the second operand gives the number of places to rotate. If the second\n\
+operand is positive then rotation is to the left; otherwise rotation is to the\n\
+right. The coefficient of the first operand is padded on the left with zeros to\n\
+length precision if necessary. The sign and exponent of the first operand are\n\
+unchanged.\n\
+\n");
+
+PyDoc_STRVAR(doc_same_quantum,"\n\
+same_quantum(other[, context]) - Test whether self and other have the\n\
+same exponent or whether both are NaN.\n\
+\n");
+
+PyDoc_STRVAR(doc_scaleb,"\n\
+scaleb(other[, context]) - Return the first operand with the exponent adjusted\n\
+the second. Equivalently, return the first operand multiplied by 10**other.\n\
+The second operand must be an integer.\n\
+\n");
+
+PyDoc_STRVAR(doc_shift,"\n\
+shift(other[, context]) - Return the result of shifting the digits of\n\
+the first operand by an amount specified by the second operand. The second\n\
+operand must be an integer in the range -precision through precision. The\n\
+absolute value of the second operand gives the number of places to shift.\n\
+If the second operand is positive, then the shift is to the left; otherwise\n\
+the shift is to the right. Digits shifted into the coefficient are zeros.\n\
+The sign and exponent of the first operand are unchanged.\n\
+\n");
+
+PyDoc_STRVAR(doc_sqrt,"\n\
+sqrt([context]) - Return the square root of the argument to full precision.\n\
+The result is correctly rounded using the ROUND_HALF_EVEN rounding mode.\n\
+\n");
+
+PyDoc_STRVAR(doc_to_eng_string,"\n\
+to_eng_string([context]) - Convert to an engineering-type string.\n\
+Engineering notation has an exponent which is a multiple of 3, so\n\
+there are up to 3 digits left of the decimal place. For example,\n\
+Decimal('123E+1') is converted to Decimal('1.23E+3')\n\
+\n");
+
+PyDoc_STRVAR(doc_to_integral,"\n\
+to_integral([rounding[, context]]) - Identical to the to_integral_value()\n\
+method. The to_integral name has been kept for compatibility with older\n\
+versions.\n\
+\n");
+
+PyDoc_STRVAR(doc_to_integral_exact,"\n\
+to_integral_exact([rounding[, context]]) - Round to the nearest integer,\n\
+signaling Inexact or Rounded as appropriate if rounding occurs. The rounding\n\
+mode is determined by the rounding parameter if given, else by the given\n\
+context. If neither parameter is given, then the rounding mode of the current\n\
+default context is used.\n\
+\n");
+
+PyDoc_STRVAR(doc_to_integral_value,"\n\
+to_integral_value([rounding[, context]]) - Round to the nearest integer without\n\
+signaling Inexact or Rounded. The rounding mode is determined by the rounding\n\
+parameter if given, else by the given context. If neither parameter is given,\n\
+then the rounding mode of the current default context is used.\n\
+\n");
+
+
+/******************************************************************************/
+/* Context Object and Methods */
+/******************************************************************************/
+
+PyDoc_STRVAR(doc_context,"\n\
+The context affects almost all operations and controls rounding,\n\
+Over/Underflow, raising of exceptions and much more. A new context\n\
+can be constructed as follows:\n\
+\n\
+ >>> c = Context(prec=28, Emin=-425000000, Emax=425000000,\n\
+ ... rounding=ROUND_HALF_EVEN, capitals=1, clamp=1,\n\
+ ... traps=[InvalidOperation, DivisionByZero, Overflow],\n\
+ ... flags=[])\n\
+ >>>\n\
+\n\
+\n");
+
+#ifdef EXTRA_FUNCTIONALITY
+PyDoc_STRVAR(doc_ctx_apply,"\n\
+apply(x) - Apply self to Decimal x.\n\
+\n");
+#endif
+
+PyDoc_STRVAR(doc_ctx_clear_flags,"\n\
+clear_flags() - Reset all flags to False.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_clear_traps,"\n\
+clear_traps() - Set all traps to False.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_copy,"\n\
+copy() - Return a duplicate of the context with all flags cleared.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_copy_decimal,"\n\
+copy_decimal(x) - Return a copy of Decimal x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_create_decimal,"\n\
+create_decimal(x) - Create a new Decimal instance from x, using self as the\n\
+context. Unlike the Decimal constructor, this function observes the context\n\
+limits.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_create_decimal_from_float,"\n\
+create_decimal_from_float(f) - Create a new Decimal instance from float f.\n\
+Unlike the Decimal.from_float() class method, this function observes the\n\
+context limits.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_Etiny,"\n\
+Etiny() - Return a value equal to Emin - prec + 1, which is the minimum\n\
+exponent value for subnormal results. When underflow occurs, the exponent\n\
+is set to Etiny.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_Etop,"\n\
+Etop() - Return a value equal to Emax - prec + 1. This is the maximum exponent\n\
+if the _clamp field of the context is set to 1 (IEEE clamp mode). Etop() must\n\
+not be negative.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_abs,"\n\
+abs(x) - Return the absolute value of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_add,"\n\
+add(x, y) - Return the sum of x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_canonical,"\n\
+canonical(x) - Return a new instance of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_compare,"\n\
+compare(x, y) - Compare x and y numerically.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_compare_signal,"\n\
+compare_signal(x, y) - Compare x and y numerically. All NaNs signal.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_compare_total,"\n\
+compare_total(x, y) - Compare x and y using their abstract representation.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_compare_total_mag,"\n\
+compare_total_mag(x, y) - Compare x and y using their abstract representation,\n\
+ignoring sign.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_copy_abs,"\n\
+copy_abs(x) - Return a copy of x with the sign set to 0.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_copy_negate,"\n\
+copy_negate(x) - Return a copy of x with the sign inverted.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_copy_sign,"\n\
+copy_sign(x, y) - Copy the sign from y to x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_divide,"\n\
+divide(x, y) - Return x divided by y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_divide_int,"\n\
+divide_int(x, y) - Return x divided by y, truncated to an integer.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_divmod,"\n\
+divmod(x, y) - Return quotient and remainder of the division x / y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_exp,"\n\
+exp(x) - Return e ** x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_fma,"\n\
+fma(x, y, z) - Return x multiplied by y, plus z.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_canonical,"\n\
+is_canonical(x) - Return True if x is canonical, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_finite,"\n\
+is_finite(x) - Return True if x is finite, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_infinite,"\n\
+is_infinite(x) - Return True if x is infinite, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_nan,"\n\
+is_nan(x) - Return True if x is a qNaN or sNaN, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_normal,"\n\
+is_normal(x) - Return True if x is a normal number, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_qnan,"\n\
+is_qnan(x) - Return True if x is a quiet NaN, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_signed,"\n\
+is_signed(x) - Return True if x is negative, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_snan,"\n\
+is_snan() - Return True if x is a signaling NaN, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_subnormal,"\n\
+is_subnormal(x) - Return True if x is subnormal, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_is_zero,"\n\
+is_zero(x) - Return True if x is a zero, False otherwise.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_ln,"\n\
+ln(x) - Return the natural (base e) logarithm of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_log10,"\n\
+log10(x) - Return the base 10 logarithm of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_logb,"\n\
+logb(x) - Return the exponent of the magnitude of the operand's MSD.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_logical_and,"\n\
+logical_and(x, y) - Digit-wise and of x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_logical_invert,"\n\
+logical_invert(x) - Invert all digits of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_logical_or,"\n\
+logical_or(x, y) - Digit-wise or of x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_logical_xor,"\n\
+logical_xor(x, y) - Digit-wise xor of x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_max,"\n\
+max(x, y) - Compare the values numerically and return the maximum.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_max_mag,"\n\
+max_mag(x, y) - Compare the values numerically with their sign ignored.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_min,"\n\
+min(x, y) - Compare the values numerically and return the minimum.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_min_mag,"\n\
+min_mag(x, y) - Compare the values numerically with their sign ignored.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_minus,"\n\
+minus(x) - Minus corresponds to the unary prefix minus operator in Python,\n\
+but applies the context to the result.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_multiply,"\n\
+multiply(x, y) - Return the product of x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_next_minus,"\n\
+next_minus(x) - Return the largest representable number smaller than x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_next_plus,"\n\
+next_plus(x) - Return the smallest representable number larger than x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_next_toward,"\n\
+next_toward(x) - Return the number closest to x, in the direction towards y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_normalize,"\n\
+normalize(x) - Reduce x to its simplest form. Alias for reduce(x).\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_number_class,"\n\
+number_class(x) - Return an indication of the class of x.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_plus,"\n\
+plus(x) - Plus corresponds to the unary prefix plus operator in Python,\n\
+but applies the context to the result.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_power,"\n\
+power(x, y) - Compute x**y. If x is negative, then y must be integral.\n\
+The result will be inexact unless y is integral and the result is finite\n\
+and can be expressed exactly in 'precision' digits. In the Python version\n\
+the result is always correctly rounded, in the C version the result is\n\
+almost always correctly rounded.\n\
+\n\
+power(x, y, m) - Compute (x**y) % m. The following restrictions hold:\n\
+\n\
+ * all three arguments must be integral\n\
+ * y must be nonnegative\n\
+ * at least one of x or y must be nonzero\n\
+ * m must be nonzero and less than 10**prec in absolute value\n\
+\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_quantize,"\n\
+quantize(x, y) - Return a value equal to x (rounded), having the exponent of y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_radix,"\n\
+radix() - Return 10.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_remainder,"\n\
+remainder(x, y) - Return the remainder from integer division. The sign of\n\
+the result, if non-zero, is the same as that of the original dividend.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_remainder_near,"\n\
+remainder_near(x, y) - Return x - y * n, where n is the integer nearest the\n\
+exact value of x / y (if the result is 0 then its sign will be the sign of x).\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_rotate,"\n\
+rotate(x, y) - Return a copy of x, rotated by y places.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_same_quantum,"\n\
+same_quantum(x, y) - Return True if the two operands have the same exponent.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_scaleb,"\n\
+scaleb(x, y) - Return the first operand after adding the second value\n\
+to its exp.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_shift,"\n\
+shift(x, y) - Return a copy of x, shifted by y places.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_sqrt,"\n\
+sqrt(x) - Square root of a non-negative number to context precision.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_subtract,"\n\
+subtract(x, y) - Return the difference between x and y.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_to_eng_string,"\n\
+to_eng_string(x) - Convert a number to a string, using engineering notation.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_to_integral,"\n\
+to_integral(x) - Identical to to_integral_value(x).\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_to_integral_exact,"\n\
+to_integral_exact(x) - Round to an integer. Signal if the result is\n\
+rounded or inexact.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_to_integral_value,"\n\
+to_integral_value(x) - Round to an integer.\n\
+\n");
+
+PyDoc_STRVAR(doc_ctx_to_sci_string,"\n\
+to_sci_string(x) - Convert a number to a string using scientific notation.\n\
+\n");
+
+
+#endif /* DOCSTRINGS_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/README.txt b/Modules/_decimal/libmpdec/README.txt
new file mode 100644
index 0000000..ad8f88c
--- /dev/null
+++ b/Modules/_decimal/libmpdec/README.txt
@@ -0,0 +1,90 @@
+
+
+libmpdec
+========
+
+libmpdec is a fast C/C++ library for correctly-rounded arbitrary precision
+decimal floating point arithmetic. It is a complete implementation of
+Mike Cowlishaw/IBM's General Decimal Arithmetic Specification.
+
+
+Files required for the Python _decimal module
+=============================================
+
+ Core files for small and medium precision arithmetic
+ ----------------------------------------------------
+
+ basearith.{c,h} -> Core arithmetic in base 10**9 or 10**19.
+ bits.h -> Portable detection of least/most significant one-bit.
+ constants.{c,h} -> Constants that are used in multiple files.
+ context.c -> Context functions.
+ io.{c,h} -> Conversions between mpd_t and ASCII strings,
+ mpd_t formatting (allows UTF-8 fill character).
+ memory.{c,h} -> Allocation handlers with overflow detection
+ and functions for switching between static
+ and dynamic mpd_t.
+ mpdecimal.{c,h} -> All (quiet) functions of the specification.
+ typearith.h -> Fast primitives for double word multiplication,
+ division etc.
+
+ Visual Studio only:
+ ~~~~~~~~~~~~~~~~~~~
+ vccompat.h -> snprintf <==> sprintf_s and similar things.
+ vcstdint.h -> stdint.h (included in VS 2010 but not in VS 2008).
+ vcdiv64.asm -> Double word division used in typearith.h. VS 2008 does
+ not allow inline asm for x64. Also, it does not provide
+ an intrinsic for double word division.
+
+ Files for bignum arithmetic:
+ ----------------------------
+
+ The following files implement the Fast Number Theoretic Transform
+ used for multiplying coefficients with more than 1024 words (see
+ mpdecimal.c: _mpd_fntmul()).
+
+ umodarith.h -> Fast low level routines for unsigned modular arithmetic.
+ numbertheory.{c,h} -> Routines for setting up the Number Theoretic Transform.
+ difradix2.{c,h} -> Decimation in frequency transform, used as the
+ "base case" by the following three files:
+
+ fnt.{c,h} -> Transform arrays up to 4096 words.
+ sixstep.{c,h} -> Transform larger arrays of length 2**n.
+ fourstep.{c,h} -> Transform larger arrays of length 3 * 2**n.
+
+ convolute.{c,h} -> Fast convolution using one of the three transform
+ functions.
+ transpose.{c,h} -> Transpositions needed for the sixstep algorithm.
+ crt.{c,h} -> Chinese Remainder Theorem: use information from three
+ transforms modulo three different primes to get the
+ final result.
+
+
+Pointers to literature, proofs and more
+=======================================
+
+ literature/
+ -----------
+
+ REFERENCES.txt -> List of relevant papers.
+ bignum.txt -> Explanation of the Fast Number Theoretic Transform (FNT).
+ fnt.py -> Verify constants used in the FNT; Python demo for the
+ O(N**2) discrete transform.
+
+ matrix-transform.txt -> Proof for the Matrix Fourier Transform used in
+ fourstep.c.
+ six-step.txt -> Show that the algorithm used in sixstep.c is
+ a variant of the Matrix Fourier Transform.
+ mulmod-64.txt -> Proof for the mulmod64 algorithm from
+ umodarith.h.
+ mulmod-ppro.txt -> Proof for the x87 FPU modular multiplication
+ from umodarith.h.
+ umodarith.lisp -> ACL2 proofs for many functions from umodarith.h.
+
+
+Library Author
+==============
+
+ Stefan Krah <skrah@bytereef.org>
+
+
+
diff --git a/Modules/_decimal/libmpdec/basearith.c b/Modules/_decimal/libmpdec/basearith.c
new file mode 100644
index 0000000..dd21a7a
--- /dev/null
+++ b/Modules/_decimal/libmpdec/basearith.c
@@ -0,0 +1,658 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "constants.h"
+#include "memory.h"
+#include "typearith.h"
+#include "basearith.h"
+
+
+/*********************************************************************/
+/* Calculations in base MPD_RADIX */
+/*********************************************************************/
+
+
+/*
+ * Knuth, TAOCP, Volume 2, 4.3.1:
+ * w := sum of u (len m) and v (len n)
+ * n > 0 and m >= n
+ * The calling function has to handle a possible final carry.
+ */
+mpd_uint_t
+_mpd_baseadd(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n)
+{
+ mpd_uint_t s;
+ mpd_uint_t carry = 0;
+ mpd_size_t i;
+
+ assert(n > 0 && m >= n);
+
+ /* add n members of u and v */
+ for (i = 0; i < n; i++) {
+ s = u[i] + (v[i] + carry);
+ carry = (s < u[i]) | (s >= MPD_RADIX);
+ w[i] = carry ? s-MPD_RADIX : s;
+ }
+ /* if there is a carry, propagate it */
+ for (; carry && i < m; i++) {
+ s = u[i] + carry;
+ carry = (s == MPD_RADIX);
+ w[i] = carry ? 0 : s;
+ }
+ /* copy the rest of u */
+ for (; i < m; i++) {
+ w[i] = u[i];
+ }
+
+ return carry;
+}
+
+/*
+ * Add the contents of u to w. Carries are propagated further. The caller
+ * has to make sure that w is big enough.
+ */
+void
+_mpd_baseaddto(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n)
+{
+ mpd_uint_t s;
+ mpd_uint_t carry = 0;
+ mpd_size_t i;
+
+ if (n == 0) return;
+
+ /* add n members of u to w */
+ for (i = 0; i < n; i++) {
+ s = w[i] + (u[i] + carry);
+ carry = (s < w[i]) | (s >= MPD_RADIX);
+ w[i] = carry ? s-MPD_RADIX : s;
+ }
+ /* if there is a carry, propagate it */
+ for (; carry; i++) {
+ s = w[i] + carry;
+ carry = (s == MPD_RADIX);
+ w[i] = carry ? 0 : s;
+ }
+}
+
+/*
+ * Add v to w (len m). The calling function has to handle a possible
+ * final carry. Assumption: m > 0.
+ */
+mpd_uint_t
+_mpd_shortadd(mpd_uint_t *w, mpd_size_t m, mpd_uint_t v)
+{
+ mpd_uint_t s;
+ mpd_uint_t carry;
+ mpd_size_t i;
+
+ assert(m > 0);
+
+ /* add v to w */
+ s = w[0] + v;
+ carry = (s < v) | (s >= MPD_RADIX);
+ w[0] = carry ? s-MPD_RADIX : s;
+
+ /* if there is a carry, propagate it */
+ for (i = 1; carry && i < m; i++) {
+ s = w[i] + carry;
+ carry = (s == MPD_RADIX);
+ w[i] = carry ? 0 : s;
+ }
+
+ return carry;
+}
+
+/* Increment u. The calling function has to handle a possible carry. */
+mpd_uint_t
+_mpd_baseincr(mpd_uint_t *u, mpd_size_t n)
+{
+ mpd_uint_t s;
+ mpd_uint_t carry = 1;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ /* if there is a carry, propagate it */
+ for (i = 0; carry && i < n; i++) {
+ s = u[i] + carry;
+ carry = (s == MPD_RADIX);
+ u[i] = carry ? 0 : s;
+ }
+
+ return carry;
+}
+
+/*
+ * Knuth, TAOCP, Volume 2, 4.3.1:
+ * w := difference of u (len m) and v (len n).
+ * number in u >= number in v;
+ */
+void
+_mpd_basesub(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n)
+{
+ mpd_uint_t d;
+ mpd_uint_t borrow = 0;
+ mpd_size_t i;
+
+ assert(m > 0 && n > 0);
+
+ /* subtract n members of v from u */
+ for (i = 0; i < n; i++) {
+ d = u[i] - (v[i] + borrow);
+ borrow = (u[i] < d);
+ w[i] = borrow ? d + MPD_RADIX : d;
+ }
+ /* if there is a borrow, propagate it */
+ for (; borrow && i < m; i++) {
+ d = u[i] - borrow;
+ borrow = (u[i] == 0);
+ w[i] = borrow ? MPD_RADIX-1 : d;
+ }
+ /* copy the rest of u */
+ for (; i < m; i++) {
+ w[i] = u[i];
+ }
+}
+
+/*
+ * Subtract the contents of u from w. w is larger than u. Borrows are
+ * propagated further, but eventually w can absorb the final borrow.
+ */
+void
+_mpd_basesubfrom(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n)
+{
+ mpd_uint_t d;
+ mpd_uint_t borrow = 0;
+ mpd_size_t i;
+
+ if (n == 0) return;
+
+ /* subtract n members of u from w */
+ for (i = 0; i < n; i++) {
+ d = w[i] - (u[i] + borrow);
+ borrow = (w[i] < d);
+ w[i] = borrow ? d + MPD_RADIX : d;
+ }
+ /* if there is a borrow, propagate it */
+ for (; borrow; i++) {
+ d = w[i] - borrow;
+ borrow = (w[i] == 0);
+ w[i] = borrow ? MPD_RADIX-1 : d;
+ }
+}
+
+/* w := product of u (len n) and v (single word) */
+void
+_mpd_shortmul(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, mpd_uint_t v)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t carry = 0;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ for (i=0; i < n; i++) {
+
+ _mpd_mul_words(&hi, &lo, u[i], v);
+ lo = carry + lo;
+ if (lo < carry) hi++;
+
+ _mpd_div_words_r(&carry, &w[i], hi, lo);
+ }
+ w[i] = carry;
+}
+
+/*
+ * Knuth, TAOCP, Volume 2, 4.3.1:
+ * w := product of u (len m) and v (len n)
+ * w must be initialized to zero
+ */
+void
+_mpd_basemul(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t carry;
+ mpd_size_t i, j;
+
+ assert(m > 0 && n > 0);
+
+ for (j=0; j < n; j++) {
+ carry = 0;
+ for (i=0; i < m; i++) {
+
+ _mpd_mul_words(&hi, &lo, u[i], v[j]);
+ lo = w[i+j] + lo;
+ if (lo < w[i+j]) hi++;
+ lo = carry + lo;
+ if (lo < carry) hi++;
+
+ _mpd_div_words_r(&carry, &w[i+j], hi, lo);
+ }
+ w[j+m] = carry;
+ }
+}
+
+/*
+ * Knuth, TAOCP Volume 2, 4.3.1, exercise 16:
+ * w := quotient of u (len n) divided by a single word v
+ */
+mpd_uint_t
+_mpd_shortdiv(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, mpd_uint_t v)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t rem = 0;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ for (i=n-1; i != MPD_SIZE_MAX; i--) {
+
+ _mpd_mul_words(&hi, &lo, rem, MPD_RADIX);
+ lo = u[i] + lo;
+ if (lo < u[i]) hi++;
+
+ _mpd_div_words(&w[i], &rem, hi, lo, v);
+ }
+
+ return rem;
+}
+
+/*
+ * Knuth, TAOCP Volume 2, 4.3.1:
+ * q, r := quotient and remainder of uconst (len nplusm)
+ * divided by vconst (len n)
+ * nplusm >= n
+ *
+ * If r is not NULL, r will contain the remainder. If r is NULL, the
+ * return value indicates if there is a remainder: 1 for true, 0 for
+ * false. A return value of -1 indicates an error.
+ */
+int
+_mpd_basedivmod(mpd_uint_t *q, mpd_uint_t *r,
+ const mpd_uint_t *uconst, const mpd_uint_t *vconst,
+ mpd_size_t nplusm, mpd_size_t n)
+{
+ mpd_uint_t ustatic[MPD_MINALLOC_MAX];
+ mpd_uint_t vstatic[MPD_MINALLOC_MAX];
+ mpd_uint_t *u = ustatic;
+ mpd_uint_t *v = vstatic;
+ mpd_uint_t d, qhat, rhat, w2[2];
+ mpd_uint_t hi, lo, x;
+ mpd_uint_t carry;
+ mpd_size_t i, j, m;
+ int retval = 0;
+
+ assert(n > 1 && nplusm >= n);
+ m = sub_size_t(nplusm, n);
+
+ /* D1: normalize */
+ d = MPD_RADIX / (vconst[n-1] + 1);
+
+ if (nplusm >= MPD_MINALLOC_MAX) {
+ if ((u = mpd_alloc(nplusm+1, sizeof *u)) == NULL) {
+ return -1;
+ }
+ }
+ if (n >= MPD_MINALLOC_MAX) {
+ if ((v = mpd_alloc(n+1, sizeof *v)) == NULL) {
+ mpd_free(u);
+ return -1;
+ }
+ }
+
+ _mpd_shortmul(u, uconst, nplusm, d);
+ _mpd_shortmul(v, vconst, n, d);
+
+ /* D2: loop */
+ for (j=m; j != MPD_SIZE_MAX; j--) {
+
+ /* D3: calculate qhat and rhat */
+ rhat = _mpd_shortdiv(w2, u+j+n-1, 2, v[n-1]);
+ qhat = w2[1] * MPD_RADIX + w2[0];
+
+ while (1) {
+ if (qhat < MPD_RADIX) {
+ _mpd_singlemul(w2, qhat, v[n-2]);
+ if (w2[1] <= rhat) {
+ if (w2[1] != rhat || w2[0] <= u[j+n-2]) {
+ break;
+ }
+ }
+ }
+ qhat -= 1;
+ rhat += v[n-1];
+ if (rhat < v[n-1] || rhat >= MPD_RADIX) {
+ break;
+ }
+ }
+ /* D4: multiply and subtract */
+ carry = 0;
+ for (i=0; i <= n; i++) {
+
+ _mpd_mul_words(&hi, &lo, qhat, v[i]);
+
+ lo = carry + lo;
+ if (lo < carry) hi++;
+
+ _mpd_div_words_r(&hi, &lo, hi, lo);
+
+ x = u[i+j] - lo;
+ carry = (u[i+j] < x);
+ u[i+j] = carry ? x+MPD_RADIX : x;
+ carry += hi;
+ }
+ q[j] = qhat;
+ /* D5: test remainder */
+ if (carry) {
+ q[j] -= 1;
+ /* D6: add back */
+ (void)_mpd_baseadd(u+j, u+j, v, n+1, n);
+ }
+ }
+
+ /* D8: unnormalize */
+ if (r != NULL) {
+ _mpd_shortdiv(r, u, n, d);
+ /* we are not interested in the return value here */
+ retval = 0;
+ }
+ else {
+ retval = !_mpd_isallzero(u, n);
+ }
+
+
+if (u != ustatic) mpd_free(u);
+if (v != vstatic) mpd_free(v);
+return retval;
+}
+
+/*
+ * Left shift of src by 'shift' digits; src may equal dest.
+ *
+ * dest := area of n mpd_uint_t with space for srcdigits+shift digits.
+ * src := coefficient with length m.
+ *
+ * The case splits in the function are non-obvious. The following
+ * equations might help:
+ *
+ * Let msdigits denote the number of digits in the most significant
+ * word of src. Then 1 <= msdigits <= rdigits.
+ *
+ * 1) shift = q * rdigits + r
+ * 2) srcdigits = qsrc * rdigits + msdigits
+ * 3) destdigits = shift + srcdigits
+ * = q * rdigits + r + qsrc * rdigits + msdigits
+ * = q * rdigits + (qsrc * rdigits + (r + msdigits))
+ *
+ * The result has q zero words, followed by the coefficient that
+ * is left-shifted by r. The case r == 0 is trivial. For r > 0, it
+ * is important to keep in mind that we always read m source words,
+ * but write m+1 destination words if r + msdigits > rdigits, m words
+ * otherwise.
+ */
+void
+_mpd_baseshiftl(mpd_uint_t *dest, mpd_uint_t *src, mpd_size_t n, mpd_size_t m,
+ mpd_size_t shift)
+{
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
+ /* spurious uninitialized warnings */
+ mpd_uint_t l=l, lprev=lprev, h=h;
+#else
+ mpd_uint_t l, lprev, h;
+#endif
+ mpd_uint_t q, r;
+ mpd_uint_t ph;
+
+ assert(m > 0 && n >= m);
+
+ _mpd_div_word(&q, &r, (mpd_uint_t)shift, MPD_RDIGITS);
+
+ if (r != 0) {
+
+ ph = mpd_pow10[r];
+
+ --m; --n;
+ _mpd_divmod_pow10(&h, &lprev, src[m--], MPD_RDIGITS-r);
+ if (h != 0) { /* r + msdigits > rdigits <==> h != 0 */
+ dest[n--] = h;
+ }
+ /* write m-1 shifted words */
+ for (; m != MPD_SIZE_MAX; m--,n--) {
+ _mpd_divmod_pow10(&h, &l, src[m], MPD_RDIGITS-r);
+ dest[n] = ph * lprev + h;
+ lprev = l;
+ }
+ /* write least significant word */
+ dest[q] = ph * lprev;
+ }
+ else {
+ while (--m != MPD_SIZE_MAX) {
+ dest[m+q] = src[m];
+ }
+ }
+
+ mpd_uint_zero(dest, q);
+}
+
+/*
+ * Right shift of src by 'shift' digits; src may equal dest.
+ * Assumption: srcdigits-shift > 0.
+ *
+ * dest := area with space for srcdigits-shift digits.
+ * src := coefficient with length 'slen'.
+ *
+ * The case splits in the function rely on the following equations:
+ *
+ * Let msdigits denote the number of digits in the most significant
+ * word of src. Then 1 <= msdigits <= rdigits.
+ *
+ * 1) shift = q * rdigits + r
+ * 2) srcdigits = qsrc * rdigits + msdigits
+ * 3) destdigits = srcdigits - shift
+ * = qsrc * rdigits + msdigits - (q * rdigits + r)
+ * = (qsrc - q) * rdigits + msdigits - r
+ *
+ * Since destdigits > 0 and 1 <= msdigits <= rdigits:
+ *
+ * 4) qsrc >= q
+ * 5) qsrc == q ==> msdigits > r
+ *
+ * The result has slen-q words if msdigits > r, slen-q-1 words otherwise.
+ */
+mpd_uint_t
+_mpd_baseshiftr(mpd_uint_t *dest, mpd_uint_t *src, mpd_size_t slen,
+ mpd_size_t shift)
+{
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
+ /* spurious uninitialized warnings */
+ mpd_uint_t l=l, h=h, hprev=hprev; /* low, high, previous high */
+#else
+ mpd_uint_t l, h, hprev; /* low, high, previous high */
+#endif
+ mpd_uint_t rnd, rest; /* rounding digit, rest */
+ mpd_uint_t q, r;
+ mpd_size_t i, j;
+ mpd_uint_t ph;
+
+ assert(slen > 0);
+
+ _mpd_div_word(&q, &r, (mpd_uint_t)shift, MPD_RDIGITS);
+
+ rnd = rest = 0;
+ if (r != 0) {
+
+ ph = mpd_pow10[MPD_RDIGITS-r];
+
+ _mpd_divmod_pow10(&hprev, &rest, src[q], r);
+ _mpd_divmod_pow10(&rnd, &rest, rest, r-1);
+
+ if (rest == 0 && q > 0) {
+ rest = !_mpd_isallzero(src, q);
+ }
+ /* write slen-q-1 words */
+ for (j=0,i=q+1; i<slen; i++,j++) {
+ _mpd_divmod_pow10(&h, &l, src[i], r);
+ dest[j] = ph * l + hprev;
+ hprev = h;
+ }
+ /* write most significant word */
+ if (hprev != 0) { /* always the case if slen==q-1 */
+ dest[j] = hprev;
+ }
+ }
+ else {
+ if (q > 0) {
+ _mpd_divmod_pow10(&rnd, &rest, src[q-1], MPD_RDIGITS-1);
+ /* is there any non-zero digit below rnd? */
+ if (rest == 0) rest = !_mpd_isallzero(src, q-1);
+ }
+ for (j = 0; j < slen-q; j++) {
+ dest[j] = src[q+j];
+ }
+ }
+
+ /* 0-4 ==> rnd+rest < 0.5 */
+ /* 5 ==> rnd+rest == 0.5 */
+ /* 6-9 ==> rnd+rest > 0.5 */
+ return (rnd == 0 || rnd == 5) ? rnd + !!rest : rnd;
+}
+
+
+/*********************************************************************/
+/* Calculations in base b */
+/*********************************************************************/
+
+/*
+ * Add v to w (len m). The calling function has to handle a possible
+ * final carry. Assumption: m > 0.
+ */
+mpd_uint_t
+_mpd_shortadd_b(mpd_uint_t *w, mpd_size_t m, mpd_uint_t v, mpd_uint_t b)
+{
+ mpd_uint_t s;
+ mpd_uint_t carry;
+ mpd_size_t i;
+
+ assert(m > 0);
+
+ /* add v to w */
+ s = w[0] + v;
+ carry = (s < v) | (s >= b);
+ w[0] = carry ? s-b : s;
+
+ /* if there is a carry, propagate it */
+ for (i = 1; carry && i < m; i++) {
+ s = w[i] + carry;
+ carry = (s == b);
+ w[i] = carry ? 0 : s;
+ }
+
+ return carry;
+}
+
+/* w := product of u (len n) and v (single word). Return carry. */
+mpd_uint_t
+_mpd_shortmul_c(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, mpd_uint_t v)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t carry = 0;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ for (i=0; i < n; i++) {
+
+ _mpd_mul_words(&hi, &lo, u[i], v);
+ lo = carry + lo;
+ if (lo < carry) hi++;
+
+ _mpd_div_words_r(&carry, &w[i], hi, lo);
+ }
+
+ return carry;
+}
+
+/* w := product of u (len n) and v (single word) */
+mpd_uint_t
+_mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v, mpd_uint_t b)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t carry = 0;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ for (i=0; i < n; i++) {
+
+ _mpd_mul_words(&hi, &lo, u[i], v);
+ lo = carry + lo;
+ if (lo < carry) hi++;
+
+ _mpd_div_words(&carry, &w[i], hi, lo, b);
+ }
+
+ return carry;
+}
+
+/*
+ * Knuth, TAOCP Volume 2, 4.3.1, exercise 16:
+ * w := quotient of u (len n) divided by a single word v
+ */
+mpd_uint_t
+_mpd_shortdiv_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v, mpd_uint_t b)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t rem = 0;
+ mpd_size_t i;
+
+ assert(n > 0);
+
+ for (i=n-1; i != MPD_SIZE_MAX; i--) {
+
+ _mpd_mul_words(&hi, &lo, rem, b);
+ lo = u[i] + lo;
+ if (lo < u[i]) hi++;
+
+ _mpd_div_words(&w[i], &rem, hi, lo, v);
+ }
+
+ return rem;
+}
+
+
+
diff --git a/Modules/_decimal/libmpdec/basearith.h b/Modules/_decimal/libmpdec/basearith.h
new file mode 100644
index 0000000..5004b2c
--- /dev/null
+++ b/Modules/_decimal/libmpdec/basearith.h
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef BASEARITH_H
+#define BASEARITH_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include "typearith.h"
+
+
+mpd_uint_t _mpd_baseadd(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n);
+void _mpd_baseaddto(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n);
+mpd_uint_t _mpd_shortadd(mpd_uint_t *w, mpd_size_t m, mpd_uint_t v);
+mpd_uint_t _mpd_shortadd_b(mpd_uint_t *w, mpd_size_t m, mpd_uint_t v,
+ mpd_uint_t b);
+mpd_uint_t _mpd_baseincr(mpd_uint_t *u, mpd_size_t n);
+void _mpd_basesub(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n);
+void _mpd_basesubfrom(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n);
+void _mpd_basemul(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t m, mpd_size_t n);
+void _mpd_shortmul(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v);
+mpd_uint_t _mpd_shortmul_c(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v);
+mpd_uint_t _mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v, mpd_uint_t b);
+mpd_uint_t _mpd_shortdiv(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v);
+mpd_uint_t _mpd_shortdiv_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
+ mpd_uint_t v, mpd_uint_t b);
+int _mpd_basedivmod(mpd_uint_t *q, mpd_uint_t *r, const mpd_uint_t *uconst,
+ const mpd_uint_t *vconst, mpd_size_t nplusm, mpd_size_t n);
+void _mpd_baseshiftl(mpd_uint_t *dest, mpd_uint_t *src, mpd_size_t n,
+ mpd_size_t m, mpd_size_t shift);
+mpd_uint_t _mpd_baseshiftr(mpd_uint_t *dest, mpd_uint_t *src, mpd_size_t slen,
+ mpd_size_t shift);
+
+
+
+#ifdef CONFIG_64
+extern const mpd_uint_t mprime_rdx;
+
+/*
+ * Algorithm from: Division by Invariant Integers using Multiplication,
+ * T. Granlund and P. L. Montgomery, Proceedings of the SIGPLAN '94
+ * Conference on Programming Language Design and Implementation.
+ *
+ * http://gmplib.org/~tege/divcnst-pldi94.pdf
+ *
+ * Variables from the paper and their translations (See section 8):
+ *
+ * N := 64
+ * d := MPD_RADIX
+ * l := 64
+ * m' := floor((2**(64+64) - 1)/MPD_RADIX) - 2**64
+ *
+ * Since N-l == 0:
+ *
+ * dnorm := d
+ * n2 := hi
+ * n10 := lo
+ *
+ * ACL2 proof: mpd-div-words-r-correct
+ */
+static inline void
+_mpd_div_words_r(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo)
+{
+ mpd_uint_t n_adj, h, l, t;
+ mpd_uint_t n1_neg;
+
+ /* n1_neg = if lo >= 2**63 then MPD_UINT_MAX else 0 */
+ n1_neg = (lo & (1ULL<<63)) ? MPD_UINT_MAX : 0;
+ /* n_adj = if lo >= 2**63 then lo+MPD_RADIX else lo */
+ n_adj = lo + (n1_neg & MPD_RADIX);
+
+ /* (h, l) = if lo >= 2**63 then m'*(hi+1) else m'*hi */
+ _mpd_mul_words(&h, &l, mprime_rdx, hi-n1_neg);
+ l = l + n_adj;
+ if (l < n_adj) h++;
+ t = h + hi;
+ /* At this point t == qest, with q == qest or q == qest+1:
+ * 1) 0 <= 2**64*hi + lo - qest*MPD_RADIX < 2*MPD_RADIX
+ */
+
+ /* t = 2**64-1 - qest = 2**64 - (qest+1) */
+ t = MPD_UINT_MAX - t;
+
+ /* (h, l) = 2**64*MPD_RADIX - (qest+1)*MPD_RADIX */
+ _mpd_mul_words(&h, &l, t, MPD_RADIX);
+ l = l + lo;
+ if (l < lo) h++;
+ h += hi;
+ h -= MPD_RADIX;
+ /* (h, l) = 2**64*hi + lo - (qest+1)*MPD_RADIX (mod 2**128)
+ * Case q == qest+1:
+ * a) h == 0, l == r
+ * b) q := h - t == qest+1
+ * c) r := l
+ * Case q == qest:
+ * a) h == MPD_UINT_MAX, l == 2**64-(MPD_RADIX-r)
+ * b) q := h - t == qest
+ * c) r := l + MPD_RADIX = r
+ */
+
+ *q = (h - t);
+ *r = l + (MPD_RADIX & h);
+}
+#else
+static inline void
+_mpd_div_words_r(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo)
+{
+ _mpd_div_words(q, r, hi, lo, MPD_RADIX);
+}
+#endif
+
+
+/* Multiply two single base MPD_RADIX words, store result in array w[2]. */
+static inline void
+_mpd_singlemul(mpd_uint_t w[2], mpd_uint_t u, mpd_uint_t v)
+{
+ mpd_uint_t hi, lo;
+
+ _mpd_mul_words(&hi, &lo, u, v);
+ _mpd_div_words_r(&w[1], &w[0], hi, lo);
+}
+
+/* Multiply u (len 2) and v (len m, 1 <= m <= 2). */
+static inline void
+_mpd_mul_2_le2(mpd_uint_t w[4], mpd_uint_t u[2], mpd_uint_t v[2], mpd_ssize_t m)
+{
+ mpd_uint_t hi, lo;
+
+ _mpd_mul_words(&hi, &lo, u[0], v[0]);
+ _mpd_div_words_r(&w[1], &w[0], hi, lo);
+
+ _mpd_mul_words(&hi, &lo, u[1], v[0]);
+ lo = w[1] + lo;
+ if (lo < w[1]) hi++;
+ _mpd_div_words_r(&w[2], &w[1], hi, lo);
+ if (m == 1) return;
+
+ _mpd_mul_words(&hi, &lo, u[0], v[1]);
+ lo = w[1] + lo;
+ if (lo < w[1]) hi++;
+ _mpd_div_words_r(&w[3], &w[1], hi, lo);
+
+ _mpd_mul_words(&hi, &lo, u[1], v[1]);
+ lo = w[2] + lo;
+ if (lo < w[2]) hi++;
+ lo = w[3] + lo;
+ if (lo < w[3]) hi++;
+ _mpd_div_words_r(&w[3], &w[2], hi, lo);
+}
+
+
+/*
+ * Test if all words from data[len-1] to data[0] are zero. If len is 0, nothing
+ * is tested and the coefficient is regarded as "all zero".
+ */
+static inline int
+_mpd_isallzero(const mpd_uint_t *data, mpd_ssize_t len)
+{
+ while (--len >= 0) {
+ if (data[len] != 0) return 0;
+ }
+ return 1;
+}
+
+/*
+ * Test if all full words from data[len-1] to data[0] are MPD_RADIX-1
+ * (all nines). Return true if len == 0.
+ */
+static inline int
+_mpd_isallnine(const mpd_uint_t *data, mpd_ssize_t len)
+{
+ while (--len >= 0) {
+ if (data[len] != MPD_RADIX-1) return 0;
+ }
+ return 1;
+}
+
+
+#endif /* BASEARITH_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/bits.h b/Modules/_decimal/libmpdec/bits.h
new file mode 100644
index 0000000..949ec94
--- /dev/null
+++ b/Modules/_decimal/libmpdec/bits.h
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef BITS_H
+#define BITS_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+/* Check if n is a power of 2. */
+static inline int
+ispower2(mpd_size_t n)
+{
+ return n != 0 && (n & (n-1)) == 0;
+}
+
+#if defined(ANSI)
+/*
+ * Return the most significant bit position of n from 0 to 31 (63).
+ * Assumptions: n != 0.
+ */
+static inline int
+mpd_bsr(mpd_size_t n)
+{
+ int pos = 0;
+ mpd_size_t tmp;
+
+#ifdef CONFIG_64
+ tmp = n >> 32;
+ if (tmp != 0) { n = tmp; pos += 32; }
+#endif
+ tmp = n >> 16;
+ if (tmp != 0) { n = tmp; pos += 16; }
+ tmp = n >> 8;
+ if (tmp != 0) { n = tmp; pos += 8; }
+ tmp = n >> 4;
+ if (tmp != 0) { n = tmp; pos += 4; }
+ tmp = n >> 2;
+ if (tmp != 0) { n = tmp; pos += 2; }
+ tmp = n >> 1;
+ if (tmp != 0) { n = tmp; pos += 1; }
+
+ return pos + (int)n - 1;
+}
+
+/*
+ * Return the least significant bit position of n from 0 to 31 (63).
+ * Assumptions: n != 0.
+ */
+static inline int
+mpd_bsf(mpd_size_t n)
+{
+ int pos;
+
+#ifdef CONFIG_64
+ pos = 63;
+ if (n & 0x00000000FFFFFFFFULL) { pos -= 32; } else { n >>= 32; }
+ if (n & 0x000000000000FFFFULL) { pos -= 16; } else { n >>= 16; }
+ if (n & 0x00000000000000FFULL) { pos -= 8; } else { n >>= 8; }
+ if (n & 0x000000000000000FULL) { pos -= 4; } else { n >>= 4; }
+ if (n & 0x0000000000000003ULL) { pos -= 2; } else { n >>= 2; }
+ if (n & 0x0000000000000001ULL) { pos -= 1; }
+#else
+ pos = 31;
+ if (n & 0x000000000000FFFFUL) { pos -= 16; } else { n >>= 16; }
+ if (n & 0x00000000000000FFUL) { pos -= 8; } else { n >>= 8; }
+ if (n & 0x000000000000000FUL) { pos -= 4; } else { n >>= 4; }
+ if (n & 0x0000000000000003UL) { pos -= 2; } else { n >>= 2; }
+ if (n & 0x0000000000000001UL) { pos -= 1; }
+#endif
+ return pos;
+}
+/* END ANSI */
+
+#elif defined(ASM)
+/*
+ * Bit scan reverse. Assumptions: a != 0.
+ */
+static inline int
+mpd_bsr(mpd_size_t a)
+{
+ mpd_size_t retval;
+
+ __asm__ (
+#ifdef CONFIG_64
+ "bsrq %1, %0\n\t"
+#else
+ "bsr %1, %0\n\t"
+#endif
+ :"=r" (retval)
+ :"r" (a)
+ :"cc"
+ );
+
+ return (int)retval;
+}
+
+/*
+ * Bit scan forward. Assumptions: a != 0.
+ */
+static inline int
+mpd_bsf(mpd_size_t a)
+{
+ mpd_size_t retval;
+
+ __asm__ (
+#ifdef CONFIG_64
+ "bsfq %1, %0\n\t"
+#else
+ "bsf %1, %0\n\t"
+#endif
+ :"=r" (retval)
+ :"r" (a)
+ :"cc"
+ );
+
+ return (int)retval;
+}
+/* END ASM */
+
+#elif defined(MASM)
+#include <intrin.h>
+/*
+ * Bit scan reverse. Assumptions: a != 0.
+ */
+static inline int __cdecl
+mpd_bsr(mpd_size_t a)
+{
+ unsigned long retval;
+
+#ifdef CONFIG_64
+ _BitScanReverse64(&retval, a);
+#else
+ _BitScanReverse(&retval, a);
+#endif
+
+ return (int)retval;
+}
+
+/*
+ * Bit scan forward. Assumptions: a != 0.
+ */
+static inline int __cdecl
+mpd_bsf(mpd_size_t a)
+{
+ unsigned long retval;
+
+#ifdef CONFIG_64
+ _BitScanForward64(&retval, a);
+#else
+ _BitScanForward(&retval, a);
+#endif
+
+ return (int)retval;
+}
+/* END MASM (_MSC_VER) */
+#else
+ #error "missing preprocessor definitions"
+#endif /* BSR/BSF */
+
+
+#endif /* BITS_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/constants.c b/Modules/_decimal/libmpdec/constants.c
new file mode 100644
index 0000000..92f5891
--- /dev/null
+++ b/Modules/_decimal/libmpdec/constants.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include "constants.h"
+
+
+#if defined(CONFIG_64)
+
+ /* number-theory.c */
+ const mpd_uint_t mpd_moduli[3] = {
+ 18446744069414584321ULL, 18446744056529682433ULL, 18446742974197923841ULL
+ };
+ const mpd_uint_t mpd_roots[3] = {7ULL, 10ULL, 19ULL};
+
+ /* crt.c */
+ const mpd_uint_t INV_P1_MOD_P2 = 18446744055098026669ULL;
+ const mpd_uint_t INV_P1P2_MOD_P3 = 287064143708160ULL;
+ const mpd_uint_t LH_P1P2 = 18446744052234715137ULL; /* (P1*P2) % 2^64 */
+ const mpd_uint_t UH_P1P2 = 18446744052234715141ULL; /* (P1*P2) / 2^64 */
+
+ /* transpose.c */
+ const mpd_size_t mpd_bits[64] = {
+ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
+ 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608,
+ 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824,
+ 2147483648ULL, 4294967296ULL, 8589934592ULL, 17179869184ULL, 34359738368ULL,
+ 68719476736ULL, 137438953472ULL, 274877906944ULL, 549755813888ULL,
+ 1099511627776ULL, 2199023255552ULL, 4398046511104, 8796093022208ULL,
+ 17592186044416ULL, 35184372088832ULL, 70368744177664ULL, 140737488355328ULL,
+ 281474976710656ULL, 562949953421312ULL, 1125899906842624ULL,
+ 2251799813685248ULL, 4503599627370496ULL, 9007199254740992ULL,
+ 18014398509481984ULL, 36028797018963968ULL, 72057594037927936ULL,
+ 144115188075855872ULL, 288230376151711744ULL, 576460752303423488ULL,
+ 1152921504606846976ULL, 2305843009213693952ULL, 4611686018427387904ULL,
+ 9223372036854775808ULL
+ };
+
+ /* mpdecimal.c */
+ const mpd_uint_t mpd_pow10[MPD_RDIGITS+1] = {
+ 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,
+ 10000000000ULL,100000000000ULL,1000000000000ULL,10000000000000ULL,
+ 100000000000000ULL,1000000000000000ULL,10000000000000000ULL,
+ 100000000000000000ULL,1000000000000000000ULL,10000000000000000000ULL
+ };
+
+ /* magic number for constant division by MPD_RADIX */
+ const mpd_uint_t mprime_rdx = 15581492618384294730ULL;
+
+#elif defined(CONFIG_32)
+
+ /* number-theory.c */
+ const mpd_uint_t mpd_moduli[3] = {2113929217UL, 2013265921UL, 1811939329UL};
+ const mpd_uint_t mpd_roots[3] = {5UL, 31UL, 13UL};
+
+ /* PentiumPro modular multiplication: These constants have to be loaded as
+ * 80 bit long doubles, which are not supported by certain compilers. */
+ const uint32_t mpd_invmoduli[3][3] = {
+ {4293885170U, 2181570688U, 16352U}, /* ((long double) 1 / 2113929217UL) */
+ {1698898177U, 2290649223U, 16352U}, /* ((long double) 1 / 2013265921UL) */
+ {2716021846U, 2545165803U, 16352U} /* ((long double) 1 / 1811939329UL) */
+ };
+
+ const float MPD_TWO63 = 9223372036854775808.0; /* 2^63 */
+
+ /* crt.c */
+ const mpd_uint_t INV_P1_MOD_P2 = 2013265901UL;
+ const mpd_uint_t INV_P1P2_MOD_P3 = 54UL;
+ const mpd_uint_t LH_P1P2 = 4127195137UL; /* (P1*P2) % 2^32 */
+ const mpd_uint_t UH_P1P2 = 990904320UL; /* (P1*P2) / 2^32 */
+
+ /* transpose.c */
+ const mpd_size_t mpd_bits[32] = {
+ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
+ 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608,
+ 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824,
+ 2147483648UL
+ };
+
+ /* mpdecimal.c */
+ const mpd_uint_t mpd_pow10[MPD_RDIGITS+1] = {
+ 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000
+ };
+
+#else
+ #error "CONFIG_64 or CONFIG_32 must be defined."
+#endif
+
+const char *mpd_round_string[MPD_ROUND_GUARD] = {
+ "ROUND_UP", /* round away from 0 */
+ "ROUND_DOWN", /* round toward 0 (truncate) */
+ "ROUND_CEILING", /* round toward +infinity */
+ "ROUND_FLOOR", /* round toward -infinity */
+ "ROUND_HALF_UP", /* 0.5 is rounded up */
+ "ROUND_HALF_DOWN", /* 0.5 is rounded down */
+ "ROUND_HALF_EVEN", /* 0.5 is rounded to even */
+ "ROUND_05UP", /* round zero or five away from 0 */
+ "ROUND_TRUNC", /* truncate, but set infinity */
+};
+
+const char *mpd_clamp_string[MPD_CLAMP_GUARD] = {
+ "CLAMP_DEFAULT",
+ "CLAMP_IEEE_754"
+};
+
+
diff --git a/Modules/_decimal/libmpdec/constants.h b/Modules/_decimal/libmpdec/constants.h
new file mode 100644
index 0000000..2d63d7e
--- /dev/null
+++ b/Modules/_decimal/libmpdec/constants.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef CONSTANTS_H
+#define CONSTANTS_H
+
+
+#include "mpdecimal.h"
+
+
+/* choice of optimized functions */
+#if defined(CONFIG_64)
+/* x64 */
+ #define MULMOD(a, b) x64_mulmod(a, b, umod)
+ #define MULMOD2C(a0, a1, w) x64_mulmod2c(a0, a1, w, umod)
+ #define MULMOD2(a0, b0, a1, b1) x64_mulmod2(a0, b0, a1, b1, umod)
+ #define POWMOD(base, exp) x64_powmod(base, exp, umod)
+ #define SETMODULUS(modnum) std_setmodulus(modnum, &umod)
+ #define SIZE3_NTT(x0, x1, x2, w3table) std_size3_ntt(x0, x1, x2, w3table, umod)
+#elif defined(PPRO)
+/* PentiumPro (or later) gcc inline asm */
+ #define MULMOD(a, b) ppro_mulmod(a, b, &dmod, dinvmod)
+ #define MULMOD2C(a0, a1, w) ppro_mulmod2c(a0, a1, w, &dmod, dinvmod)
+ #define MULMOD2(a0, b0, a1, b1) ppro_mulmod2(a0, b0, a1, b1, &dmod, dinvmod)
+ #define POWMOD(base, exp) ppro_powmod(base, exp, &dmod, dinvmod)
+ #define SETMODULUS(modnum) ppro_setmodulus(modnum, &umod, &dmod, dinvmod)
+ #define SIZE3_NTT(x0, x1, x2, w3table) ppro_size3_ntt(x0, x1, x2, w3table, umod, &dmod, dinvmod)
+#else
+ /* ANSI C99 */
+ #define MULMOD(a, b) std_mulmod(a, b, umod)
+ #define MULMOD2C(a0, a1, w) std_mulmod2c(a0, a1, w, umod)
+ #define MULMOD2(a0, b0, a1, b1) std_mulmod2(a0, b0, a1, b1, umod)
+ #define POWMOD(base, exp) std_powmod(base, exp, umod)
+ #define SETMODULUS(modnum) std_setmodulus(modnum, &umod)
+ #define SIZE3_NTT(x0, x1, x2, w3table) std_size3_ntt(x0, x1, x2, w3table, umod)
+#endif
+
+/* PentiumPro (or later) gcc inline asm */
+extern const float MPD_TWO63;
+extern const uint32_t mpd_invmoduli[3][3];
+
+enum {P1, P2, P3};
+
+extern const mpd_uint_t mpd_moduli[];
+extern const mpd_uint_t mpd_roots[];
+extern const mpd_size_t mpd_bits[];
+extern const mpd_uint_t mpd_pow10[];
+
+extern const mpd_uint_t INV_P1_MOD_P2;
+extern const mpd_uint_t INV_P1P2_MOD_P3;
+extern const mpd_uint_t LH_P1P2;
+extern const mpd_uint_t UH_P1P2;
+
+
+#endif /* CONSTANTS_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/context.c b/Modules/_decimal/libmpdec/context.c
new file mode 100644
index 0000000..159f88c
--- /dev/null
+++ b/Modules/_decimal/libmpdec/context.c
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+
+void
+mpd_dflt_traphandler(mpd_context_t *ctx UNUSED)
+{
+ raise(SIGFPE);
+}
+
+void (* mpd_traphandler)(mpd_context_t *) = mpd_dflt_traphandler;
+
+
+/* Set guaranteed minimum number of coefficient words. The function may
+ be used once at program start. Setting MPD_MINALLOC to out-of-bounds
+ values is a catastrophic error, so in that case the function exits rather
+ than relying on the user to check a return value. */
+void
+mpd_setminalloc(mpd_ssize_t n)
+{
+ static int minalloc_is_set = 0;
+
+ if (minalloc_is_set) {
+ mpd_err_warn("mpd_setminalloc: ignoring request to set "
+ "MPD_MINALLOC a second time\n");
+ return;
+ }
+ if (n < MPD_MINALLOC_MIN || n > MPD_MINALLOC_MAX) {
+ mpd_err_fatal("illegal value for MPD_MINALLOC"); /* GCOV_NOT_REACHED */
+ }
+ MPD_MINALLOC = n;
+ minalloc_is_set = 1;
+}
+
+void
+mpd_init(mpd_context_t *ctx, mpd_ssize_t prec)
+{
+ mpd_ssize_t ideal_minalloc;
+
+ mpd_defaultcontext(ctx);
+
+ if (!mpd_qsetprec(ctx, prec)) {
+ mpd_addstatus_raise(ctx, MPD_Invalid_context);
+ return;
+ }
+
+ ideal_minalloc = 2 * ((prec+MPD_RDIGITS-1) / MPD_RDIGITS);
+ if (ideal_minalloc < MPD_MINALLOC_MIN) ideal_minalloc = MPD_MINALLOC_MIN;
+ if (ideal_minalloc > MPD_MINALLOC_MAX) ideal_minalloc = MPD_MINALLOC_MAX;
+
+ mpd_setminalloc(ideal_minalloc);
+}
+
+void
+mpd_maxcontext(mpd_context_t *ctx)
+{
+ ctx->prec=MPD_MAX_PREC;
+ ctx->emax=MPD_MAX_EMAX;
+ ctx->emin=MPD_MIN_EMIN;
+ ctx->round=MPD_ROUND_HALF_EVEN;
+ ctx->traps=MPD_Traps;
+ ctx->status=0;
+ ctx->newtrap=0;
+ ctx->clamp=0;
+ ctx->allcr=1;
+}
+
+void
+mpd_defaultcontext(mpd_context_t *ctx)
+{
+ ctx->prec=2*MPD_RDIGITS;
+ ctx->emax=MPD_MAX_EMAX;
+ ctx->emin=MPD_MIN_EMIN;
+ ctx->round=MPD_ROUND_HALF_UP;
+ ctx->traps=MPD_Traps;
+ ctx->status=0;
+ ctx->newtrap=0;
+ ctx->clamp=0;
+ ctx->allcr=1;
+}
+
+void
+mpd_basiccontext(mpd_context_t *ctx)
+{
+ ctx->prec=9;
+ ctx->emax=MPD_MAX_EMAX;
+ ctx->emin=MPD_MIN_EMIN;
+ ctx->round=MPD_ROUND_HALF_UP;
+ ctx->traps=MPD_Traps|MPD_Clamped;
+ ctx->status=0;
+ ctx->newtrap=0;
+ ctx->clamp=0;
+ ctx->allcr=1;
+}
+
+int
+mpd_ieee_context(mpd_context_t *ctx, int bits)
+{
+ if (bits <= 0 || bits > MPD_IEEE_CONTEXT_MAX_BITS || bits % 32) {
+ return -1;
+ }
+
+ ctx->prec = 9 * (bits/32) - 2;
+ ctx->emax = 3 * ((mpd_ssize_t)1<<(bits/16+3));
+ ctx->emin = 1 - ctx->emax;
+ ctx->round=MPD_ROUND_HALF_EVEN;
+ ctx->traps=0;
+ ctx->status=0;
+ ctx->newtrap=0;
+ ctx->clamp=1;
+ ctx->allcr=1;
+
+ return 0;
+}
+
+mpd_ssize_t
+mpd_getprec(const mpd_context_t *ctx)
+{
+ return ctx->prec;
+}
+
+mpd_ssize_t
+mpd_getemax(const mpd_context_t *ctx)
+{
+ return ctx->emax;
+}
+
+mpd_ssize_t
+mpd_getemin(const mpd_context_t *ctx)
+{
+ return ctx->emin;
+}
+
+int
+mpd_getround(const mpd_context_t *ctx)
+{
+ return ctx->round;
+}
+
+uint32_t
+mpd_gettraps(const mpd_context_t *ctx)
+{
+ return ctx->traps;
+}
+
+uint32_t
+mpd_getstatus(const mpd_context_t *ctx)
+{
+ return ctx->status;
+}
+
+int
+mpd_getclamp(const mpd_context_t *ctx)
+{
+ return ctx->clamp;
+}
+
+int
+mpd_getcr(const mpd_context_t *ctx)
+{
+ return ctx->allcr;
+}
+
+
+int
+mpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec)
+{
+ if (prec <= 0 || prec > MPD_MAX_PREC) {
+ return 0;
+ }
+ ctx->prec = prec;
+ return 1;
+}
+
+int
+mpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax)
+{
+ if (emax < 0 || emax > MPD_MAX_EMAX) {
+ return 0;
+ }
+ ctx->emax = emax;
+ return 1;
+}
+
+int
+mpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin)
+{
+ if (emin > 0 || emin < MPD_MIN_EMIN) {
+ return 0;
+ }
+ ctx->emin = emin;
+ return 1;
+}
+
+int
+mpd_qsetround(mpd_context_t *ctx, int round)
+{
+ if (!(0 <= round && round < MPD_ROUND_GUARD)) {
+ return 0;
+ }
+ ctx->round = round;
+ return 1;
+}
+
+int
+mpd_qsettraps(mpd_context_t *ctx, uint32_t traps)
+{
+ if (traps > MPD_Max_status) {
+ return 0;
+ }
+ ctx->traps = traps;
+ return 1;
+}
+
+int
+mpd_qsetstatus(mpd_context_t *ctx, uint32_t flags)
+{
+ if (flags > MPD_Max_status) {
+ return 0;
+ }
+ ctx->status = flags;
+ return 1;
+}
+
+int
+mpd_qsetclamp(mpd_context_t *ctx, int c)
+{
+ if (c != 0 && c != 1) {
+ return 0;
+ }
+ ctx->clamp = c;
+ return 1;
+}
+
+int
+mpd_qsetcr(mpd_context_t *ctx, int c)
+{
+ if (c != 0 && c != 1) {
+ return 0;
+ }
+ ctx->allcr = c;
+ return 1;
+}
+
+
+void
+mpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags)
+{
+ ctx->status |= flags;
+ if (flags&ctx->traps) {
+ ctx->newtrap = (flags&ctx->traps);
+ mpd_traphandler(ctx);
+ }
+}
+
+
diff --git a/Modules/_decimal/libmpdec/convolute.c b/Modules/_decimal/libmpdec/convolute.c
new file mode 100644
index 0000000..b5fe131
--- /dev/null
+++ b/Modules/_decimal/libmpdec/convolute.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include "bits.h"
+#include "constants.h"
+#include "fnt.h"
+#include "fourstep.h"
+#include "numbertheory.h"
+#include "sixstep.h"
+#include "umodarith.h"
+#include "convolute.h"
+
+
+/* Bignum: Fast convolution using the Number Theoretic Transform. Used for
+ the multiplication of very large coefficients. */
+
+
+/* Convolute the data in c1 and c2. Result is in c1. */
+int
+fnt_convolute(mpd_uint_t *c1, mpd_uint_t *c2, mpd_size_t n, int modnum)
+{
+ int (*fnt)(mpd_uint_t *, mpd_size_t, int);
+ int (*inv_fnt)(mpd_uint_t *, mpd_size_t, int);
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t n_inv, umod;
+ mpd_size_t i;
+
+
+ SETMODULUS(modnum);
+ n_inv = POWMOD(n, (umod-2));
+
+ if (ispower2(n)) {
+ if (n > SIX_STEP_THRESHOLD) {
+ fnt = six_step_fnt;
+ inv_fnt = inv_six_step_fnt;
+ }
+ else {
+ fnt = std_fnt;
+ inv_fnt = std_inv_fnt;
+ }
+ }
+ else {
+ fnt = four_step_fnt;
+ inv_fnt = inv_four_step_fnt;
+ }
+
+ if (!fnt(c1, n, modnum)) {
+ return 0;
+ }
+ if (!fnt(c2, n, modnum)) {
+ return 0;
+ }
+ for (i = 0; i < n-1; i += 2) {
+ mpd_uint_t x0 = c1[i];
+ mpd_uint_t y0 = c2[i];
+ mpd_uint_t x1 = c1[i+1];
+ mpd_uint_t y1 = c2[i+1];
+ MULMOD2(&x0, y0, &x1, y1);
+ c1[i] = x0;
+ c1[i+1] = x1;
+ }
+
+ if (!inv_fnt(c1, n, modnum)) {
+ return 0;
+ }
+ for (i = 0; i < n-3; i += 4) {
+ mpd_uint_t x0 = c1[i];
+ mpd_uint_t x1 = c1[i+1];
+ mpd_uint_t x2 = c1[i+2];
+ mpd_uint_t x3 = c1[i+3];
+ MULMOD2C(&x0, &x1, n_inv);
+ MULMOD2C(&x2, &x3, n_inv);
+ c1[i] = x0;
+ c1[i+1] = x1;
+ c1[i+2] = x2;
+ c1[i+3] = x3;
+ }
+
+ return 1;
+}
+
+/* Autoconvolute the data in c1. Result is in c1. */
+int
+fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum)
+{
+ int (*fnt)(mpd_uint_t *, mpd_size_t, int);
+ int (*inv_fnt)(mpd_uint_t *, mpd_size_t, int);
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t n_inv, umod;
+ mpd_size_t i;
+
+
+ SETMODULUS(modnum);
+ n_inv = POWMOD(n, (umod-2));
+
+ if (ispower2(n)) {
+ if (n > SIX_STEP_THRESHOLD) {
+ fnt = six_step_fnt;
+ inv_fnt = inv_six_step_fnt;
+ }
+ else {
+ fnt = std_fnt;
+ inv_fnt = std_inv_fnt;
+ }
+ }
+ else {
+ fnt = four_step_fnt;
+ inv_fnt = inv_four_step_fnt;
+ }
+
+ if (!fnt(c1, n, modnum)) {
+ return 0;
+ }
+ for (i = 0; i < n-1; i += 2) {
+ mpd_uint_t x0 = c1[i];
+ mpd_uint_t x1 = c1[i+1];
+ MULMOD2(&x0, x0, &x1, x1);
+ c1[i] = x0;
+ c1[i+1] = x1;
+ }
+
+ if (!inv_fnt(c1, n, modnum)) {
+ return 0;
+ }
+ for (i = 0; i < n-3; i += 4) {
+ mpd_uint_t x0 = c1[i];
+ mpd_uint_t x1 = c1[i+1];
+ mpd_uint_t x2 = c1[i+2];
+ mpd_uint_t x3 = c1[i+3];
+ MULMOD2C(&x0, &x1, n_inv);
+ MULMOD2C(&x2, &x3, n_inv);
+ c1[i] = x0;
+ c1[i+1] = x1;
+ c1[i+2] = x2;
+ c1[i+3] = x3;
+ }
+
+ return 1;
+}
+
+
diff --git a/Modules/_decimal/libmpdec/convolute.h b/Modules/_decimal/libmpdec/convolute.h
new file mode 100644
index 0000000..2f8d6d8
--- /dev/null
+++ b/Modules/_decimal/libmpdec/convolute.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef CONVOLUTE_H
+#define CONVOLUTE_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+#define SIX_STEP_THRESHOLD 4096
+
+
+int fnt_convolute(mpd_uint_t *c1, mpd_uint_t *c2, mpd_size_t n, int modnum);
+int fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum);
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/crt.c b/Modules/_decimal/libmpdec/crt.c
new file mode 100644
index 0000000..c71c4ee
--- /dev/null
+++ b/Modules/_decimal/libmpdec/crt.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <assert.h>
+#include "numbertheory.h"
+#include "umodarith.h"
+#include "crt.h"
+
+
+/* Bignum: Chinese Remainder Theorem, extends the maximum transform length. */
+
+
+/* Multiply P1P2 by v, store result in w. */
+static inline void
+_crt_mulP1P2_3(mpd_uint_t w[3], mpd_uint_t v)
+{
+ mpd_uint_t hi1, hi2, lo;
+
+ _mpd_mul_words(&hi1, &lo, LH_P1P2, v);
+ w[0] = lo;
+
+ _mpd_mul_words(&hi2, &lo, UH_P1P2, v);
+ lo = hi1 + lo;
+ if (lo < hi1) hi2++;
+
+ w[1] = lo;
+ w[2] = hi2;
+}
+
+/* Add 3 words from v to w. The result is known to fit in w. */
+static inline void
+_crt_add3(mpd_uint_t w[3], mpd_uint_t v[3])
+{
+ mpd_uint_t carry;
+ mpd_uint_t s;
+
+ s = w[0] + v[0];
+ carry = (s < w[0]);
+ w[0] = s;
+
+ s = w[1] + (v[1] + carry);
+ carry = (s < w[1]);
+ w[1] = s;
+
+ w[2] = w[2] + (v[2] + carry);
+}
+
+/* Divide 3 words in u by v, store result in w, return remainder. */
+static inline mpd_uint_t
+_crt_div3(mpd_uint_t *w, const mpd_uint_t *u, mpd_uint_t v)
+{
+ mpd_uint_t r1 = u[2];
+ mpd_uint_t r2;
+
+ if (r1 < v) {
+ w[2] = 0;
+ }
+ else {
+ _mpd_div_word(&w[2], &r1, u[2], v); /* GCOV_NOT_REACHED */
+ }
+
+ _mpd_div_words(&w[1], &r2, r1, u[1], v);
+ _mpd_div_words(&w[0], &r1, r2, u[0], v);
+
+ return r1;
+}
+
+
+/*
+ * Chinese Remainder Theorem:
+ * Algorithm from Joerg Arndt, "Matters Computational",
+ * Chapter 37.4.1 [http://www.jjj.de/fxt/]
+ *
+ * See also Knuth, TAOCP, Volume 2, 4.3.2, exercise 7.
+ */
+
+/*
+ * CRT with carry: x1, x2, x3 contain numbers modulo p1, p2, p3. For each
+ * triple of members of the arrays, find the unique z modulo p1*p2*p3, with
+ * zmax = p1*p2*p3 - 1.
+ *
+ * In each iteration of the loop, split z into result[i] = z % MPD_RADIX
+ * and carry = z / MPD_RADIX. Let N be the size of carry[] and cmax the
+ * maximum carry.
+ *
+ * Limits for the 32-bit build:
+ *
+ * N = 2**96
+ * cmax = 7711435591312380274
+ *
+ * Limits for the 64 bit build:
+ *
+ * N = 2**192
+ * cmax = 627710135393475385904124401220046371710
+ *
+ * The following statements hold for both versions:
+ *
+ * 1) cmax + zmax < N, so the addition does not overflow.
+ *
+ * 2) (cmax + zmax) / MPD_RADIX == cmax.
+ *
+ * 3) If c <= cmax, then c_next = (c + zmax) / MPD_RADIX <= cmax.
+ */
+void
+crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t rsize)
+{
+ mpd_uint_t p1 = mpd_moduli[P1];
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t a1, a2, a3;
+ mpd_uint_t s;
+ mpd_uint_t z[3], t[3];
+ mpd_uint_t carry[3] = {0,0,0};
+ mpd_uint_t hi, lo;
+ mpd_size_t i;
+
+ for (i = 0; i < rsize; i++) {
+
+ a1 = x1[i];
+ a2 = x2[i];
+ a3 = x3[i];
+
+ SETMODULUS(P2);
+ s = ext_submod(a2, a1, umod);
+ s = MULMOD(s, INV_P1_MOD_P2);
+
+ _mpd_mul_words(&hi, &lo, s, p1);
+ lo = lo + a1;
+ if (lo < a1) hi++;
+
+ SETMODULUS(P3);
+ s = dw_submod(a3, hi, lo, umod);
+ s = MULMOD(s, INV_P1P2_MOD_P3);
+
+ z[0] = lo;
+ z[1] = hi;
+ z[2] = 0;
+
+ _crt_mulP1P2_3(t, s);
+ _crt_add3(z, t);
+ _crt_add3(carry, z);
+
+ x1[i] = _crt_div3(carry, carry, MPD_RADIX);
+ }
+
+ assert(carry[0] == 0 && carry[1] == 0 && carry[2] == 0);
+}
+
+
diff --git a/Modules/_decimal/libmpdec/crt.h b/Modules/_decimal/libmpdec/crt.h
new file mode 100644
index 0000000..0e03e5d
--- /dev/null
+++ b/Modules/_decimal/libmpdec/crt.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef CRT_H
+#define CRT_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+void crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t nmemb);
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/difradix2.c b/Modules/_decimal/libmpdec/difradix2.c
new file mode 100644
index 0000000..4ebb0b5
--- /dev/null
+++ b/Modules/_decimal/libmpdec/difradix2.c
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <assert.h>
+#include "bits.h"
+#include "numbertheory.h"
+#include "umodarith.h"
+#include "difradix2.h"
+
+
+/* Bignum: The actual transform routine (decimation in frequency). */
+
+
+/*
+ * Generate index pairs (x, bitreverse(x)) and carry out the permutation.
+ * n must be a power of two.
+ * Algorithm due to Brent/Lehmann, see Joerg Arndt, "Matters Computational",
+ * Chapter 1.14.4. [http://www.jjj.de/fxt/]
+ */
+static inline void
+bitreverse_permute(mpd_uint_t a[], mpd_size_t n)
+{
+ mpd_size_t x = 0;
+ mpd_size_t r = 0;
+ mpd_uint_t t;
+
+ do { /* Invariant: r = bitreverse(x) */
+ if (r > x) {
+ t = a[x];
+ a[x] = a[r];
+ a[r] = t;
+ }
+ /* Flip trailing consecutive 1 bits and the first zero bit
+ * that absorbs a possible carry. */
+ x += 1;
+ /* Mirror the operation on r: Flip n_trailing_zeros(x)+1
+ high bits of r. */
+ r ^= (n - (n >> (mpd_bsf(x)+1)));
+ /* The loop invariant is preserved. */
+ } while (x < n);
+}
+
+
+/* Fast Number Theoretic Transform, decimation in frequency. */
+void
+fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams)
+{
+ mpd_uint_t *wtable = tparams->wtable;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t u0, u1, v0, v1;
+ mpd_uint_t w, w0, w1, wstep;
+ mpd_size_t m, mhalf;
+ mpd_size_t j, r;
+
+
+ assert(ispower2(n));
+ assert(n >= 4);
+
+ SETMODULUS(tparams->modnum);
+
+ /* m == n */
+ mhalf = n / 2;
+ for (j = 0; j < mhalf; j += 2) {
+
+ w0 = wtable[j];
+ w1 = wtable[j+1];
+
+ u0 = a[j];
+ v0 = a[j+mhalf];
+
+ u1 = a[j+1];
+ v1 = a[j+1+mhalf];
+
+ a[j] = addmod(u0, v0, umod);
+ v0 = submod(u0, v0, umod);
+
+ a[j+1] = addmod(u1, v1, umod);
+ v1 = submod(u1, v1, umod);
+
+ MULMOD2(&v0, w0, &v1, w1);
+
+ a[j+mhalf] = v0;
+ a[j+1+mhalf] = v1;
+
+ }
+
+ wstep = 2;
+ for (m = n/2; m >= 2; m>>=1, wstep<<=1) {
+
+ mhalf = m / 2;
+
+ /* j == 0 */
+ for (r = 0; r < n; r += 2*m) {
+
+ u0 = a[r];
+ v0 = a[r+mhalf];
+
+ u1 = a[m+r];
+ v1 = a[m+r+mhalf];
+
+ a[r] = addmod(u0, v0, umod);
+ v0 = submod(u0, v0, umod);
+
+ a[m+r] = addmod(u1, v1, umod);
+ v1 = submod(u1, v1, umod);
+
+ a[r+mhalf] = v0;
+ a[m+r+mhalf] = v1;
+ }
+
+ for (j = 1; j < mhalf; j++) {
+
+ w = wtable[j*wstep];
+
+ for (r = 0; r < n; r += 2*m) {
+
+ u0 = a[r+j];
+ v0 = a[r+j+mhalf];
+
+ u1 = a[m+r+j];
+ v1 = a[m+r+j+mhalf];
+
+ a[r+j] = addmod(u0, v0, umod);
+ v0 = submod(u0, v0, umod);
+
+ a[m+r+j] = addmod(u1, v1, umod);
+ v1 = submod(u1, v1, umod);
+
+ MULMOD2C(&v0, &v1, w);
+
+ a[r+j+mhalf] = v0;
+ a[m+r+j+mhalf] = v1;
+ }
+
+ }
+
+ }
+
+ bitreverse_permute(a, n);
+}
+
+
diff --git a/Modules/_decimal/libmpdec/difradix2.h b/Modules/_decimal/libmpdec/difradix2.h
new file mode 100644
index 0000000..759442a
--- /dev/null
+++ b/Modules/_decimal/libmpdec/difradix2.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef DIF_RADIX2_H
+#define DIF_RADIX2_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include "numbertheory.h"
+
+
+void fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams);
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/fnt.c b/Modules/_decimal/libmpdec/fnt.c
new file mode 100644
index 0000000..9311653
--- /dev/null
+++ b/Modules/_decimal/libmpdec/fnt.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "bits.h"
+#include "difradix2.h"
+#include "numbertheory.h"
+#include "fnt.h"
+
+
+/* Bignum: Fast transform for medium-sized coefficients. */
+
+
+/* forward transform, sign = -1 */
+int
+std_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ struct fnt_params *tparams;
+
+ assert(ispower2(n));
+ assert(n >= 4);
+ assert(n <= 3*MPD_MAXTRANSFORM_2N);
+
+ if ((tparams = _mpd_init_fnt_params(n, -1, modnum)) == NULL) {
+ return 0;
+ }
+ fnt_dif2(a, n, tparams);
+
+ mpd_free(tparams);
+ return 1;
+}
+
+/* reverse transform, sign = 1 */
+int
+std_inv_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ struct fnt_params *tparams;
+
+ assert(ispower2(n));
+ assert(n >= 4);
+ assert(n <= 3*MPD_MAXTRANSFORM_2N);
+
+ if ((tparams = _mpd_init_fnt_params(n, 1, modnum)) == NULL) {
+ return 0;
+ }
+ fnt_dif2(a, n, tparams);
+
+ mpd_free(tparams);
+ return 1;
+}
+
+
+
diff --git a/Modules/_decimal/libmpdec/fnt.h b/Modules/_decimal/libmpdec/fnt.h
new file mode 100644
index 0000000..2d701b6
--- /dev/null
+++ b/Modules/_decimal/libmpdec/fnt.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef FNT_H
+#define FNT_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+int std_fnt(mpd_uint_t a[], mpd_size_t n, int modnum);
+int std_inv_fnt(mpd_uint_t a[], mpd_size_t n, int modnum);
+
+
+#endif
+
diff --git a/Modules/_decimal/libmpdec/fourstep.c b/Modules/_decimal/libmpdec/fourstep.c
new file mode 100644
index 0000000..aa32c0d
--- /dev/null
+++ b/Modules/_decimal/libmpdec/fourstep.c
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <assert.h>
+#include "numbertheory.h"
+#include "sixstep.h"
+#include "transpose.h"
+#include "umodarith.h"
+#include "fourstep.h"
+
+
+/* Bignum: Cache efficient Matrix Fourier Transform for arrays of the
+ form 3 * 2**n (See literature/matrix-transform.txt). */
+
+
+#ifndef PPRO
+static inline void
+std_size3_ntt(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3,
+ mpd_uint_t w3table[3], mpd_uint_t umod)
+{
+ mpd_uint_t r1, r2;
+ mpd_uint_t w;
+ mpd_uint_t s, tmp;
+
+
+ /* k = 0 -> w = 1 */
+ s = *x1;
+ s = addmod(s, *x2, umod);
+ s = addmod(s, *x3, umod);
+
+ r1 = s;
+
+ /* k = 1 */
+ s = *x1;
+
+ w = w3table[1];
+ tmp = MULMOD(*x2, w);
+ s = addmod(s, tmp, umod);
+
+ w = w3table[2];
+ tmp = MULMOD(*x3, w);
+ s = addmod(s, tmp, umod);
+
+ r2 = s;
+
+ /* k = 2 */
+ s = *x1;
+
+ w = w3table[2];
+ tmp = MULMOD(*x2, w);
+ s = addmod(s, tmp, umod);
+
+ w = w3table[1];
+ tmp = MULMOD(*x3, w);
+ s = addmod(s, tmp, umod);
+
+ *x3 = s;
+ *x2 = r2;
+ *x1 = r1;
+}
+#else /* PPRO */
+static inline void
+ppro_size3_ntt(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_uint_t w3table[3],
+ mpd_uint_t umod, double *dmod, uint32_t dinvmod[3])
+{
+ mpd_uint_t r1, r2;
+ mpd_uint_t w;
+ mpd_uint_t s, tmp;
+
+
+ /* k = 0 -> w = 1 */
+ s = *x1;
+ s = addmod(s, *x2, umod);
+ s = addmod(s, *x3, umod);
+
+ r1 = s;
+
+ /* k = 1 */
+ s = *x1;
+
+ w = w3table[1];
+ tmp = ppro_mulmod(*x2, w, dmod, dinvmod);
+ s = addmod(s, tmp, umod);
+
+ w = w3table[2];
+ tmp = ppro_mulmod(*x3, w, dmod, dinvmod);
+ s = addmod(s, tmp, umod);
+
+ r2 = s;
+
+ /* k = 2 */
+ s = *x1;
+
+ w = w3table[2];
+ tmp = ppro_mulmod(*x2, w, dmod, dinvmod);
+ s = addmod(s, tmp, umod);
+
+ w = w3table[1];
+ tmp = ppro_mulmod(*x3, w, dmod, dinvmod);
+ s = addmod(s, tmp, umod);
+
+ *x3 = s;
+ *x2 = r2;
+ *x1 = r1;
+}
+#endif
+
+
+/* forward transform, sign = -1; transform length = 3 * 2**n */
+int
+four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ mpd_size_t R = 3; /* number of rows */
+ mpd_size_t C = n / 3; /* number of columns */
+ mpd_uint_t w3table[3];
+ mpd_uint_t kernel, w0, w1, wstep;
+ mpd_uint_t *s, *p0, *p1, *p2;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_size_t i, k;
+
+
+ assert(n >= 48);
+ assert(n <= 3*MPD_MAXTRANSFORM_2N);
+
+
+ /* Length R transform on the columns. */
+ SETMODULUS(modnum);
+ _mpd_init_w3table(w3table, -1, modnum);
+ for (p0=a, p1=p0+C, p2=p0+2*C; p0<a+C; p0++,p1++,p2++) {
+
+ SIZE3_NTT(p0, p1, p2, w3table);
+ }
+
+ /* Multiply each matrix element (addressed by i*C+k) by r**(i*k). */
+ kernel = _mpd_getkernel(n, -1, modnum);
+ for (i = 1; i < R; i++) {
+ w0 = 1; /* r**(i*0): initial value for k=0 */
+ w1 = POWMOD(kernel, i); /* r**(i*1): initial value for k=1 */
+ wstep = MULMOD(w1, w1); /* r**(2*i) */
+ for (k = 0; k < C-1; k += 2) {
+ mpd_uint_t x0 = a[i*C+k];
+ mpd_uint_t x1 = a[i*C+k+1];
+ MULMOD2(&x0, w0, &x1, w1);
+ MULMOD2C(&w0, &w1, wstep); /* r**(i*(k+2)) = r**(i*k) * r**(2*i) */
+ a[i*C+k] = x0;
+ a[i*C+k+1] = x1;
+ }
+ }
+
+ /* Length C transform on the rows. */
+ for (s = a; s < a+n; s += C) {
+ if (!six_step_fnt(s, C, modnum)) {
+ return 0;
+ }
+ }
+
+#if 0
+ /* An unordered transform is sufficient for convolution. */
+ /* Transpose the matrix. */
+ transpose_3xpow2(a, R, C);
+#endif
+
+ return 1;
+}
+
+/* backward transform, sign = 1; transform length = 3 * 2**n */
+int
+inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ mpd_size_t R = 3; /* number of rows */
+ mpd_size_t C = n / 3; /* number of columns */
+ mpd_uint_t w3table[3];
+ mpd_uint_t kernel, w0, w1, wstep;
+ mpd_uint_t *s, *p0, *p1, *p2;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_size_t i, k;
+
+
+ assert(n >= 48);
+ assert(n <= 3*MPD_MAXTRANSFORM_2N);
+
+
+#if 0
+ /* An unordered transform is sufficient for convolution. */
+ /* Transpose the matrix, producing an R*C matrix. */
+ transpose_3xpow2(a, C, R);
+#endif
+
+ /* Length C transform on the rows. */
+ for (s = a; s < a+n; s += C) {
+ if (!inv_six_step_fnt(s, C, modnum)) {
+ return 0;
+ }
+ }
+
+ /* Multiply each matrix element (addressed by i*C+k) by r**(i*k). */
+ SETMODULUS(modnum);
+ kernel = _mpd_getkernel(n, 1, modnum);
+ for (i = 1; i < R; i++) {
+ w0 = 1;
+ w1 = POWMOD(kernel, i);
+ wstep = MULMOD(w1, w1);
+ for (k = 0; k < C; k += 2) {
+ mpd_uint_t x0 = a[i*C+k];
+ mpd_uint_t x1 = a[i*C+k+1];
+ MULMOD2(&x0, w0, &x1, w1);
+ MULMOD2C(&w0, &w1, wstep);
+ a[i*C+k] = x0;
+ a[i*C+k+1] = x1;
+ }
+ }
+
+ /* Length R transform on the columns. */
+ _mpd_init_w3table(w3table, 1, modnum);
+ for (p0=a, p1=p0+C, p2=p0+2*C; p0<a+C; p0++,p1++,p2++) {
+
+ SIZE3_NTT(p0, p1, p2, w3table);
+ }
+
+ return 1;
+}
+
+
diff --git a/Modules/_decimal/libmpdec/fourstep.h b/Modules/_decimal/libmpdec/fourstep.h
new file mode 100644
index 0000000..61d9d6a
--- /dev/null
+++ b/Modules/_decimal/libmpdec/fourstep.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef FOUR_STEP_H
+#define FOUR_STEP_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+int four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum);
+int inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum);
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/io.c b/Modules/_decimal/libmpdec/io.c
new file mode 100644
index 0000000..2648135
--- /dev/null
+++ b/Modules/_decimal/libmpdec/io.c
@@ -0,0 +1,1575 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <assert.h>
+#include <errno.h>
+#include <locale.h>
+#include "bits.h"
+#include "constants.h"
+#include "memory.h"
+#include "typearith.h"
+#include "io.h"
+
+
+/* This file contains functions for decimal <-> string conversions, including
+ PEP-3101 formatting for numeric types. */
+
+
+/*
+ * Work around the behavior of tolower() and strcasecmp() in certain
+ * locales. For example, in tr_TR.utf8:
+ *
+ * tolower((unsigned char)'I') == 'I'
+ *
+ * u is the exact uppercase version of l; n is strlen(l) or strlen(l)+1
+ */
+static inline int
+_mpd_strneq(const char *s, const char *l, const char *u, size_t n)
+{
+ while (--n != SIZE_MAX) {
+ if (*s != *l && *s != *u) {
+ return 0;
+ }
+ s++; u++; l++;
+ }
+
+ return 1;
+}
+
+static mpd_ssize_t
+strtoexp(const char *s)
+{
+ char *end;
+ mpd_ssize_t retval;
+
+ errno = 0;
+ retval = mpd_strtossize(s, &end, 10);
+ if (errno == 0 && !(*s != '\0' && *end == '\0'))
+ errno = EINVAL;
+
+ return retval;
+}
+
+/*
+ * Scan 'len' words. The most significant word contains 'r' digits,
+ * the remaining words are full words. Skip dpoint. The string 's' must
+ * consist of digits and an optional single decimal point at 'dpoint'.
+ */
+static void
+string_to_coeff(mpd_uint_t *data, const char *s, const char *dpoint, int r,
+ size_t len)
+{
+ int j;
+
+ if (r > 0) {
+ data[--len] = 0;
+ for (j = 0; j < r; j++, s++) {
+ if (s == dpoint) s++;
+ data[len] = 10 * data[len] + (*s - '0');
+ }
+ }
+
+ while (--len != SIZE_MAX) {
+ data[len] = 0;
+ for (j = 0; j < MPD_RDIGITS; j++, s++) {
+ if (s == dpoint) s++;
+ data[len] = 10 * data[len] + (*s - '0');
+ }
+ }
+}
+
+/*
+ * Partially verify a numeric string of the form:
+ *
+ * [cdigits][.][cdigits][eE][+-][edigits]
+ *
+ * If successful, return a pointer to the location of the first
+ * relevant coefficient digit. This digit is either non-zero or
+ * part of one of the following patterns:
+ *
+ * ["0\x00", "0.\x00", "0.E", "0.e", "0E", "0e"]
+ *
+ * The locations of a single optional dot or indicator are stored
+ * in 'dpoint' and 'exp'.
+ *
+ * The end of the string is stored in 'end'. If an indicator [eE]
+ * occurs without trailing [edigits], the condition is caught
+ * later by strtoexp().
+ */
+static const char *
+scan_dpoint_exp(const char *s, const char **dpoint, const char **exp,
+ const char **end)
+{
+ const char *coeff = NULL;
+
+ *dpoint = NULL;
+ *exp = NULL;
+ for (; *s != '\0'; s++) {
+ switch (*s) {
+ case '.':
+ if (*dpoint != NULL || *exp != NULL)
+ return NULL;
+ *dpoint = s;
+ break;
+ case 'E': case 'e':
+ if (*exp != NULL)
+ return NULL;
+ *exp = s;
+ if (*(s+1) == '+' || *(s+1) == '-')
+ s++;
+ break;
+ default:
+ if (!isdigit((uchar)*s))
+ return NULL;
+ if (coeff == NULL && *exp == NULL) {
+ if (*s == '0') {
+ if (!isdigit((uchar)*(s+1)))
+ if (!(*(s+1) == '.' &&
+ isdigit((uchar)*(s+2))))
+ coeff = s;
+ }
+ else {
+ coeff = s;
+ }
+ }
+ break;
+
+ }
+ }
+
+ *end = s;
+ return coeff;
+}
+
+/* scan the payload of a NaN */
+static const char *
+scan_payload(const char *s, const char **end)
+{
+ const char *coeff;
+
+ while (*s == '0')
+ s++;
+ coeff = s;
+
+ while (isdigit((uchar)*s))
+ s++;
+ *end = s;
+
+ return (*s == '\0') ? coeff : NULL;
+}
+
+/* convert a character string to a decimal */
+void
+mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_ssize_t q, r, len;
+ const char *coeff, *end;
+ const char *dpoint = NULL, *exp = NULL;
+ size_t digits;
+ uint8_t sign = MPD_POS;
+
+ mpd_set_flags(dec, 0);
+ dec->len = 0;
+ dec->exp = 0;
+
+ /* sign */
+ if (*s == '+') {
+ s++;
+ }
+ else if (*s == '-') {
+ mpd_set_negative(dec);
+ sign = MPD_NEG;
+ s++;
+ }
+
+ if (_mpd_strneq(s, "nan", "NAN", 3)) { /* NaN */
+ s += 3;
+ mpd_setspecial(dec, sign, MPD_NAN);
+ if (*s == '\0')
+ return;
+ /* validate payload: digits only */
+ if ((coeff = scan_payload(s, &end)) == NULL)
+ goto conversion_error;
+ /* payload consists entirely of zeros */
+ if (*coeff == '\0')
+ return;
+ digits = end - coeff;
+ /* prec >= 1, clamp is 0 or 1 */
+ if (digits > (size_t)(ctx->prec-ctx->clamp))
+ goto conversion_error;
+ } /* sNaN */
+ else if (_mpd_strneq(s, "snan", "SNAN", 4)) {
+ s += 4;
+ mpd_setspecial(dec, sign, MPD_SNAN);
+ if (*s == '\0')
+ return;
+ /* validate payload: digits only */
+ if ((coeff = scan_payload(s, &end)) == NULL)
+ goto conversion_error;
+ /* payload consists entirely of zeros */
+ if (*coeff == '\0')
+ return;
+ digits = end - coeff;
+ if (digits > (size_t)(ctx->prec-ctx->clamp))
+ goto conversion_error;
+ }
+ else if (_mpd_strneq(s, "inf", "INF", 3)) {
+ s += 3;
+ if (*s == '\0' || _mpd_strneq(s, "inity", "INITY", 6)) {
+ /* numeric-value: infinity */
+ mpd_setspecial(dec, sign, MPD_INF);
+ return;
+ }
+ goto conversion_error;
+ }
+ else {
+ /* scan for start of coefficient, decimal point, indicator, end */
+ if ((coeff = scan_dpoint_exp(s, &dpoint, &exp, &end)) == NULL)
+ goto conversion_error;
+
+ /* numeric-value: [exponent-part] */
+ if (exp) {
+ /* exponent-part */
+ end = exp; exp++;
+ dec->exp = strtoexp(exp);
+ if (errno) {
+ if (!(errno == ERANGE &&
+ (dec->exp == MPD_SSIZE_MAX ||
+ dec->exp == MPD_SSIZE_MIN)))
+ goto conversion_error;
+ }
+ }
+
+ digits = end - coeff;
+ if (dpoint) {
+ size_t fracdigits = end-dpoint-1;
+ if (dpoint > coeff) digits--;
+
+ if (fracdigits > MPD_MAX_PREC) {
+ goto conversion_error;
+ }
+ if (dec->exp < MPD_SSIZE_MIN+(mpd_ssize_t)fracdigits) {
+ dec->exp = MPD_SSIZE_MIN;
+ }
+ else {
+ dec->exp -= (mpd_ssize_t)fracdigits;
+ }
+ }
+ if (digits > MPD_MAX_PREC) {
+ goto conversion_error;
+ }
+ if (dec->exp > MPD_EXP_INF) {
+ dec->exp = MPD_EXP_INF;
+ }
+ if (dec->exp == MPD_SSIZE_MIN) {
+ dec->exp = MPD_SSIZE_MIN+1;
+ }
+ }
+
+ _mpd_idiv_word(&q, &r, (mpd_ssize_t)digits, MPD_RDIGITS);
+
+ len = (r == 0) ? q : q+1;
+ if (len == 0) {
+ goto conversion_error; /* GCOV_NOT_REACHED */
+ }
+ if (!mpd_qresize(dec, len, status)) {
+ mpd_seterror(dec, MPD_Malloc_error, status);
+ return;
+ }
+ dec->len = len;
+
+ string_to_coeff(dec->data, coeff, dpoint, (int)r, len);
+
+ mpd_setdigits(dec);
+ mpd_qfinalize(dec, ctx, status);
+ return;
+
+conversion_error:
+ /* standard wants a positive NaN */
+ mpd_seterror(dec, MPD_Conversion_syntax, status);
+}
+
+/* Print word x with n decimal digits to string s. dot is either NULL
+ or the location of a decimal point. */
+#define EXTRACT_DIGIT(s, x, d, dot) \
+ if (s == dot) *s++ = '.'; *s++ = '0' + (char)(x / d); x %= d
+static inline char *
+word_to_string(char *s, mpd_uint_t x, int n, char *dot)
+{
+ switch(n) {
+#ifdef CONFIG_64
+ case 20: EXTRACT_DIGIT(s, x, 10000000000000000000ULL, dot); /* GCOV_NOT_REACHED */
+ case 19: EXTRACT_DIGIT(s, x, 1000000000000000000ULL, dot);
+ case 18: EXTRACT_DIGIT(s, x, 100000000000000000ULL, dot);
+ case 17: EXTRACT_DIGIT(s, x, 10000000000000000ULL, dot);
+ case 16: EXTRACT_DIGIT(s, x, 1000000000000000ULL, dot);
+ case 15: EXTRACT_DIGIT(s, x, 100000000000000ULL, dot);
+ case 14: EXTRACT_DIGIT(s, x, 10000000000000ULL, dot);
+ case 13: EXTRACT_DIGIT(s, x, 1000000000000ULL, dot);
+ case 12: EXTRACT_DIGIT(s, x, 100000000000ULL, dot);
+ case 11: EXTRACT_DIGIT(s, x, 10000000000ULL, dot);
+#endif
+ case 10: EXTRACT_DIGIT(s, x, 1000000000UL, dot);
+ case 9: EXTRACT_DIGIT(s, x, 100000000UL, dot);
+ case 8: EXTRACT_DIGIT(s, x, 10000000UL, dot);
+ case 7: EXTRACT_DIGIT(s, x, 1000000UL, dot);
+ case 6: EXTRACT_DIGIT(s, x, 100000UL, dot);
+ case 5: EXTRACT_DIGIT(s, x, 10000UL, dot);
+ case 4: EXTRACT_DIGIT(s, x, 1000UL, dot);
+ case 3: EXTRACT_DIGIT(s, x, 100UL, dot);
+ case 2: EXTRACT_DIGIT(s, x, 10UL, dot);
+ default: if (s == dot) *s++ = '.'; *s++ = '0' + (char)x;
+ }
+
+ *s = '\0';
+ return s;
+}
+
+/* Print exponent x to string s. Undefined for MPD_SSIZE_MIN. */
+static inline char *
+exp_to_string(char *s, mpd_ssize_t x)
+{
+ char sign = '+';
+
+ if (x < 0) {
+ sign = '-';
+ x = -x;
+ }
+ *s++ = sign;
+
+ return word_to_string(s, x, mpd_word_digits(x), NULL);
+}
+
+/* Print the coefficient of dec to string s. len(dec) > 0. */
+static inline char *
+coeff_to_string(char *s, const mpd_t *dec)
+{
+ mpd_uint_t x;
+ mpd_ssize_t i;
+
+ /* most significant word */
+ x = mpd_msword(dec);
+ s = word_to_string(s, x, mpd_word_digits(x), NULL);
+
+ /* remaining full words */
+ for (i=dec->len-2; i >= 0; --i) {
+ x = dec->data[i];
+ s = word_to_string(s, x, MPD_RDIGITS, NULL);
+ }
+
+ return s;
+}
+
+/* Print the coefficient of dec to string s. len(dec) > 0. dot is either
+ NULL or a pointer to the location of a decimal point. */
+static inline char *
+coeff_to_string_dot(char *s, char *dot, const mpd_t *dec)
+{
+ mpd_uint_t x;
+ mpd_ssize_t i;
+
+ /* most significant word */
+ x = mpd_msword(dec);
+ s = word_to_string(s, x, mpd_word_digits(x), dot);
+
+ /* remaining full words */
+ for (i=dec->len-2; i >= 0; --i) {
+ x = dec->data[i];
+ s = word_to_string(s, x, MPD_RDIGITS, dot);
+ }
+
+ return s;
+}
+
+/* Format type */
+#define MPD_FMT_LOWER 0x00000000
+#define MPD_FMT_UPPER 0x00000001
+#define MPD_FMT_TOSCI 0x00000002
+#define MPD_FMT_TOENG 0x00000004
+#define MPD_FMT_EXP 0x00000008
+#define MPD_FMT_FIXED 0x00000010
+#define MPD_FMT_PERCENT 0x00000020
+#define MPD_FMT_SIGN_SPACE 0x00000040
+#define MPD_FMT_SIGN_PLUS 0x00000080
+
+/* Default place of the decimal point for MPD_FMT_TOSCI, MPD_FMT_EXP */
+#define MPD_DEFAULT_DOTPLACE 1
+
+/*
+ * Set *result to the string representation of a decimal. Return the length
+ * of *result, not including the terminating '\0' character.
+ *
+ * Formatting is done according to 'flags'. A return value of -1 with *result
+ * set to NULL indicates MPD_Malloc_error.
+ *
+ * 'dplace' is the default place of the decimal point. It is always set to
+ * MPD_DEFAULT_DOTPLACE except for zeros in combination with MPD_FMT_EXP.
+ */
+static mpd_ssize_t
+_mpd_to_string(char **result, const mpd_t *dec, int flags, mpd_ssize_t dplace)
+{
+ char *decstring = NULL, *cp = NULL;
+ mpd_ssize_t ldigits;
+ mpd_ssize_t mem = 0, k;
+
+ if (mpd_isspecial(dec)) {
+
+ mem = sizeof "-Infinity";
+ if (mpd_isnan(dec) && dec->len > 0) {
+ /* diagnostic code */
+ mem += dec->digits;
+ }
+ cp = decstring = mpd_alloc(mem, sizeof *decstring);
+ if (cp == NULL) {
+ *result = NULL;
+ return -1;
+ }
+
+ if (mpd_isnegative(dec)) {
+ *cp++ = '-';
+ }
+ else if (flags&MPD_FMT_SIGN_SPACE) {
+ *cp++ = ' ';
+ }
+ else if (flags&MPD_FMT_SIGN_PLUS) {
+ *cp++ = '+';
+ }
+
+ if (mpd_isnan(dec)) {
+ if (mpd_isqnan(dec)) {
+ strcpy(cp, "NaN");
+ cp += 3;
+ }
+ else {
+ strcpy(cp, "sNaN");
+ cp += 4;
+ }
+ if (dec->len > 0) { /* diagnostic code */
+ cp = coeff_to_string(cp, dec);
+ }
+ }
+ else if (mpd_isinfinite(dec)) {
+ strcpy(cp, "Infinity");
+ cp += 8;
+ }
+ else { /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+ }
+ else {
+ assert(dec->len > 0);
+
+ /*
+ * For easier manipulation of the decimal point's location
+ * and the exponent that is finally printed, the number is
+ * rescaled to a virtual representation with exp = 0. Here
+ * ldigits denotes the number of decimal digits to the left
+ * of the decimal point and remains constant once initialized.
+ *
+ * dplace is the location of the decimal point relative to
+ * the start of the coefficient. Note that 3) always holds
+ * when dplace is shifted.
+ *
+ * 1) ldigits := dec->digits - dec->exp
+ * 2) dplace := ldigits (initially)
+ * 3) exp := ldigits - dplace (initially exp = 0)
+ *
+ * 0.00000_.____._____000000.
+ * ^ ^ ^ ^
+ * | | | |
+ * | | | `- dplace >= digits
+ * | | `- dplace in the middle of the coefficient
+ * | ` dplace = 1 (after the first coefficient digit)
+ * `- dplace <= 0
+ */
+
+ ldigits = dec->digits + dec->exp;
+
+ if (flags&MPD_FMT_EXP) {
+ ;
+ }
+ else if (flags&MPD_FMT_FIXED || (dec->exp <= 0 && ldigits > -6)) {
+ /* MPD_FMT_FIXED: always use fixed point notation.
+ * MPD_FMT_TOSCI, MPD_FMT_TOENG: for a certain range,
+ * override exponent notation. */
+ dplace = ldigits;
+ }
+ else if (flags&MPD_FMT_TOENG) {
+ if (mpd_iszero(dec)) {
+ /* If the exponent is divisible by three,
+ * dplace = 1. Otherwise, move dplace one
+ * or two places to the left. */
+ dplace = -1 + mod_mpd_ssize_t(dec->exp+2, 3);
+ }
+ else { /* ldigits-1 is the adjusted exponent, which
+ * should be divisible by three. If not, move
+ * dplace one or two places to the right. */
+ dplace += mod_mpd_ssize_t(ldigits-1, 3);
+ }
+ }
+
+ /*
+ * Basic space requirements:
+ *
+ * [-][.][coeffdigits][E][-][expdigits+1][%]['\0']
+ *
+ * If the decimal point lies outside of the coefficient digits,
+ * space is adjusted accordingly.
+ */
+ if (dplace <= 0) {
+ mem = -dplace + dec->digits + 2;
+ }
+ else if (dplace >= dec->digits) {
+ mem = dplace;
+ }
+ else {
+ mem = dec->digits;
+ }
+ mem += (MPD_EXPDIGITS+1+6);
+
+ cp = decstring = mpd_alloc(mem, sizeof *decstring);
+ if (cp == NULL) {
+ *result = NULL;
+ return -1;
+ }
+
+
+ if (mpd_isnegative(dec)) {
+ *cp++ = '-';
+ }
+ else if (flags&MPD_FMT_SIGN_SPACE) {
+ *cp++ = ' ';
+ }
+ else if (flags&MPD_FMT_SIGN_PLUS) {
+ *cp++ = '+';
+ }
+
+ if (dplace <= 0) {
+ /* space: -dplace+dec->digits+2 */
+ *cp++ = '0';
+ *cp++ = '.';
+ for (k = 0; k < -dplace; k++) {
+ *cp++ = '0';
+ }
+ cp = coeff_to_string(cp, dec);
+ }
+ else if (dplace >= dec->digits) {
+ /* space: dplace */
+ cp = coeff_to_string(cp, dec);
+ for (k = 0; k < dplace-dec->digits; k++) {
+ *cp++ = '0';
+ }
+ }
+ else {
+ /* space: dec->digits+1 */
+ cp = coeff_to_string_dot(cp, cp+dplace, dec);
+ }
+
+ /*
+ * Conditions for printing an exponent:
+ *
+ * MPD_FMT_TOSCI, MPD_FMT_TOENG: only if ldigits != dplace
+ * MPD_FMT_FIXED: never (ldigits == dplace)
+ * MPD_FMT_EXP: always
+ */
+ if (ldigits != dplace || flags&MPD_FMT_EXP) {
+ /* space: expdigits+2 */
+ *cp++ = (flags&MPD_FMT_UPPER) ? 'E' : 'e';
+ cp = exp_to_string(cp, ldigits-dplace);
+ }
+
+ if (flags&MPD_FMT_PERCENT) {
+ *cp++ = '%';
+ }
+ }
+
+ assert(cp < decstring+mem);
+ assert(cp-decstring < MPD_SSIZE_MAX);
+
+ *cp = '\0';
+ *result = decstring;
+ return (mpd_ssize_t)(cp-decstring);
+}
+
+char *
+mpd_to_sci(const mpd_t *dec, int fmt)
+{
+ char *res;
+ int flags = MPD_FMT_TOSCI;
+
+ flags |= fmt ? MPD_FMT_UPPER : MPD_FMT_LOWER;
+ (void)_mpd_to_string(&res, dec, flags, MPD_DEFAULT_DOTPLACE);
+ return res;
+}
+
+char *
+mpd_to_eng(const mpd_t *dec, int fmt)
+{
+ char *res;
+ int flags = MPD_FMT_TOENG;
+
+ flags |= fmt ? MPD_FMT_UPPER : MPD_FMT_LOWER;
+ (void)_mpd_to_string(&res, dec, flags, MPD_DEFAULT_DOTPLACE);
+ return res;
+}
+
+mpd_ssize_t
+mpd_to_sci_size(char **res, const mpd_t *dec, int fmt)
+{
+ int flags = MPD_FMT_TOSCI;
+
+ flags |= fmt ? MPD_FMT_UPPER : MPD_FMT_LOWER;
+ return _mpd_to_string(res, dec, flags, MPD_DEFAULT_DOTPLACE);
+}
+
+mpd_ssize_t
+mpd_to_eng_size(char **res, const mpd_t *dec, int fmt)
+{
+ int flags = MPD_FMT_TOENG;
+
+ flags |= fmt ? MPD_FMT_UPPER : MPD_FMT_LOWER;
+ return _mpd_to_string(res, dec, flags, MPD_DEFAULT_DOTPLACE);
+}
+
+/* Copy a single UTF-8 char to dest. See: The Unicode Standard, version 5.2,
+ chapter 3.9: Well-formed UTF-8 byte sequences. */
+static int
+_mpd_copy_utf8(char dest[5], const char *s)
+{
+ const uchar *cp = (const uchar *)s;
+ uchar lb, ub;
+ int count, i;
+
+
+ if (*cp == 0) {
+ /* empty string */
+ dest[0] = '\0';
+ return 0;
+ }
+ else if (*cp <= 0x7f) {
+ /* ascii */
+ dest[0] = *cp;
+ dest[1] = '\0';
+ return 1;
+ }
+ else if (0xc2 <= *cp && *cp <= 0xdf) {
+ lb = 0x80; ub = 0xbf;
+ count = 2;
+ }
+ else if (*cp == 0xe0) {
+ lb = 0xa0; ub = 0xbf;
+ count = 3;
+ }
+ else if (*cp <= 0xec) {
+ lb = 0x80; ub = 0xbf;
+ count = 3;
+ }
+ else if (*cp == 0xed) {
+ lb = 0x80; ub = 0x9f;
+ count = 3;
+ }
+ else if (*cp <= 0xef) {
+ lb = 0x80; ub = 0xbf;
+ count = 3;
+ }
+ else if (*cp == 0xf0) {
+ lb = 0x90; ub = 0xbf;
+ count = 4;
+ }
+ else if (*cp <= 0xf3) {
+ lb = 0x80; ub = 0xbf;
+ count = 4;
+ }
+ else if (*cp == 0xf4) {
+ lb = 0x80; ub = 0x8f;
+ count = 4;
+ }
+ else {
+ /* invalid */
+ goto error;
+ }
+
+ dest[0] = *cp++;
+ if (*cp < lb || ub < *cp) {
+ goto error;
+ }
+ dest[1] = *cp++;
+ for (i = 2; i < count; i++) {
+ if (*cp < 0x80 || 0xbf < *cp) {
+ goto error;
+ }
+ dest[i] = *cp++;
+ }
+ dest[i] = '\0';
+
+ return count;
+
+error:
+ dest[0] = '\0';
+ return -1;
+}
+
+int
+mpd_validate_lconv(mpd_spec_t *spec)
+{
+ size_t n;
+#if CHAR_MAX == SCHAR_MAX
+ const char *cp = spec->grouping;
+ while (*cp != '\0') {
+ if (*cp++ < 0) {
+ return -1;
+ }
+ }
+#endif
+ n = strlen(spec->dot);
+ if (n == 0 || n > 4) {
+ return -1;
+ }
+ if (strlen(spec->sep) > 4) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+mpd_parse_fmt_str(mpd_spec_t *spec, const char *fmt, int caps)
+{
+ char *cp = (char *)fmt;
+ int have_align = 0, n;
+
+ /* defaults */
+ spec->min_width = 0;
+ spec->prec = -1;
+ spec->type = caps ? 'G' : 'g';
+ spec->align = '>';
+ spec->sign = '-';
+ spec->dot = "";
+ spec->sep = "";
+ spec->grouping = "";
+
+
+ /* presume that the first character is a UTF-8 fill character */
+ if ((n = _mpd_copy_utf8(spec->fill, cp)) < 0) {
+ return 0;
+ }
+
+ /* alignment directive, prefixed by a fill character */
+ if (*cp && (*(cp+n) == '<' || *(cp+n) == '>' ||
+ *(cp+n) == '=' || *(cp+n) == '^')) {
+ cp += n;
+ spec->align = *cp++;
+ have_align = 1;
+ } /* alignment directive */
+ else {
+ /* default fill character */
+ spec->fill[0] = ' ';
+ spec->fill[1] = '\0';
+ if (*cp == '<' || *cp == '>' ||
+ *cp == '=' || *cp == '^') {
+ spec->align = *cp++;
+ have_align = 1;
+ }
+ }
+
+ /* sign formatting */
+ if (*cp == '+' || *cp == '-' || *cp == ' ') {
+ spec->sign = *cp++;
+ }
+
+ /* zero padding */
+ if (*cp == '0') {
+ /* zero padding implies alignment, which should not be
+ * specified twice. */
+ if (have_align) {
+ return 0;
+ }
+ spec->align = 'z';
+ spec->fill[0] = *cp++;
+ spec->fill[1] = '\0';
+ }
+
+ /* minimum width */
+ if (isdigit((uchar)*cp)) {
+ if (*cp == '0') {
+ return 0;
+ }
+ errno = 0;
+ spec->min_width = mpd_strtossize(cp, &cp, 10);
+ if (errno == ERANGE || errno == EINVAL) {
+ return 0;
+ }
+ }
+
+ /* thousands separator */
+ if (*cp == ',') {
+ spec->dot = ".";
+ spec->sep = ",";
+ spec->grouping = "\003\003";
+ cp++;
+ }
+
+ /* fraction digits or significant digits */
+ if (*cp == '.') {
+ cp++;
+ if (!isdigit((uchar)*cp)) {
+ return 0;
+ }
+ errno = 0;
+ spec->prec = mpd_strtossize(cp, &cp, 10);
+ if (errno == ERANGE || errno == EINVAL) {
+ return 0;
+ }
+ }
+
+ /* type */
+ if (*cp == 'E' || *cp == 'e' || *cp == 'F' || *cp == 'f' ||
+ *cp == 'G' || *cp == 'g' || *cp == '%') {
+ spec->type = *cp++;
+ }
+ else if (*cp == 'N' || *cp == 'n') {
+ /* locale specific conversion */
+ struct lconv *lc;
+ /* separator has already been specified */
+ if (*spec->sep) {
+ return 0;
+ }
+ spec->type = *cp++;
+ spec->type = (spec->type == 'N') ? 'G' : 'g';
+ lc = localeconv();
+ spec->dot = lc->decimal_point;
+ spec->sep = lc->thousands_sep;
+ spec->grouping = lc->grouping;
+ if (mpd_validate_lconv(spec) < 0) {
+ return 0; /* GCOV_NOT_REACHED */
+ }
+ }
+
+ /* check correctness */
+ if (*cp != '\0') {
+ return 0;
+ }
+
+ return 1;
+}
+
+/*
+ * The following functions assume that spec->min_width <= MPD_MAX_PREC, which
+ * is made sure in mpd_qformat_spec. Then, even with a spec that inserts a
+ * four-byte separator after each digit, nbytes in the following struct
+ * cannot overflow.
+ */
+
+/* Multibyte string */
+typedef struct {
+ mpd_ssize_t nbytes; /* length in bytes */
+ mpd_ssize_t nchars; /* length in chars */
+ mpd_ssize_t cur; /* current write index */
+ char *data;
+} mpd_mbstr_t;
+
+static inline void
+_mpd_bcopy(char *dest, const char *src, mpd_ssize_t n)
+{
+ while (--n >= 0) {
+ dest[n] = src[n];
+ }
+}
+
+static inline void
+_mbstr_copy_char(mpd_mbstr_t *dest, const char *src, mpd_ssize_t n)
+{
+ dest->nbytes += n;
+ dest->nchars += (n > 0 ? 1 : 0);
+ dest->cur -= n;
+
+ if (dest->data != NULL) {
+ _mpd_bcopy(dest->data+dest->cur, src, n);
+ }
+}
+
+static inline void
+_mbstr_copy_ascii(mpd_mbstr_t *dest, const char *src, mpd_ssize_t n)
+{
+ dest->nbytes += n;
+ dest->nchars += n;
+ dest->cur -= n;
+
+ if (dest->data != NULL) {
+ _mpd_bcopy(dest->data+dest->cur, src, n);
+ }
+}
+
+static inline void
+_mbstr_copy_pad(mpd_mbstr_t *dest, mpd_ssize_t n)
+{
+ dest->nbytes += n;
+ dest->nchars += n;
+ dest->cur -= n;
+
+ if (dest->data != NULL) {
+ char *cp = dest->data + dest->cur;
+ while (--n >= 0) {
+ cp[n] = '0';
+ }
+ }
+}
+
+/*
+ * Copy a numeric string to dest->data, adding separators in the integer
+ * part according to spec->grouping. If leading zero padding is enabled
+ * and the result is smaller than spec->min_width, continue adding zeros
+ * and separators until the minimum width is reached.
+ *
+ * The final length of dest->data is stored in dest->nbytes. The number
+ * of UTF-8 characters is stored in dest->nchars.
+ *
+ * First run (dest->data == NULL): determine the length of the result
+ * string and store it in dest->nbytes.
+ *
+ * Second run (write to dest->data): data is written in chunks and in
+ * reverse order, starting with the rest of the numeric string.
+ */
+static void
+_mpd_add_sep_dot(mpd_mbstr_t *dest,
+ const char *sign, /* location of optional sign */
+ const char *src, mpd_ssize_t n_src, /* integer part and length */
+ const char *dot, /* location of optional decimal point */
+ const char *rest, mpd_ssize_t n_rest, /* remaining part and length */
+ const mpd_spec_t *spec)
+{
+ mpd_ssize_t n_sep, n_sign, consume;
+ const char *g;
+ int pad = 0;
+
+ n_sign = sign ? 1 : 0;
+ n_sep = (mpd_ssize_t)strlen(spec->sep);
+ /* Initial write index: set to location of '\0' in the output string.
+ * Irrelevant for the first run. */
+ dest->cur = dest->nbytes;
+ dest->nbytes = dest->nchars = 0;
+
+ _mbstr_copy_ascii(dest, rest, n_rest);
+
+ if (dot) {
+ _mbstr_copy_char(dest, dot, (mpd_ssize_t)strlen(dot));
+ }
+
+ g = spec->grouping;
+ consume = *g;
+ while (1) {
+ /* If the group length is 0 or CHAR_MAX or greater than the
+ * number of source bytes, consume all remaining bytes. */
+ if (*g == 0 || *g == CHAR_MAX || consume > n_src) {
+ consume = n_src;
+ }
+ n_src -= consume;
+ if (pad) {
+ _mbstr_copy_pad(dest, consume);
+ }
+ else {
+ _mbstr_copy_ascii(dest, src+n_src, consume);
+ }
+
+ if (n_src == 0) {
+ /* Either the real source of intpart digits or the virtual
+ * source of padding zeros is exhausted. */
+ if (spec->align == 'z' &&
+ dest->nchars + n_sign < spec->min_width) {
+ /* Zero padding is set and length < min_width:
+ * Generate n_src additional characters. */
+ n_src = spec->min_width - (dest->nchars + n_sign);
+ /* Next iteration:
+ * case *g == 0 || *g == CHAR_MAX:
+ * consume all padding characters
+ * case consume < g*:
+ * fill remainder of current group
+ * case consume == g*
+ * copying is a no-op */
+ consume = *g - consume;
+ /* Switch on virtual source of zeros. */
+ pad = 1;
+ continue;
+ }
+ break;
+ }
+
+ if (n_sep > 0) {
+ /* If padding is switched on, separators are counted
+ * as padding characters. This rule does not apply if
+ * the separator would be the first character of the
+ * result string. */
+ if (pad && n_src > 1) n_src -= 1;
+ _mbstr_copy_char(dest, spec->sep, n_sep);
+ }
+
+ /* If non-NUL, use the next value for grouping. */
+ if (*g && *(g+1)) g++;
+ consume = *g;
+ }
+
+ if (sign) {
+ _mbstr_copy_ascii(dest, sign, 1);
+ }
+
+ if (dest->data) {
+ dest->data[dest->nbytes] = '\0';
+ }
+}
+
+/*
+ * Convert a numeric-string to its locale-specific appearance.
+ * The string must have one of these forms:
+ *
+ * 1) [sign] digits [exponent-part]
+ * 2) [sign] digits '.' [digits] [exponent-part]
+ *
+ * Not allowed, since _mpd_to_string() never returns this form:
+ *
+ * 3) [sign] '.' digits [exponent-part]
+ *
+ * Input: result->data := original numeric string (ASCII)
+ * result->bytes := strlen(result->data)
+ * result->nchars := strlen(result->data)
+ *
+ * Output: result->data := modified or original string
+ * result->bytes := strlen(result->data)
+ * result->nchars := number of characters (possibly UTF-8)
+ */
+static int
+_mpd_apply_lconv(mpd_mbstr_t *result, const mpd_spec_t *spec, uint32_t *status)
+{
+ const char *sign = NULL, *intpart = NULL, *dot = NULL;
+ const char *rest, *dp;
+ char *decstring;
+ mpd_ssize_t n_int, n_rest;
+
+ /* original numeric string */
+ dp = result->data;
+
+ /* sign */
+ if (*dp == '+' || *dp == '-' || *dp == ' ') {
+ sign = dp++;
+ }
+ /* integer part */
+ assert(isdigit((uchar)*dp));
+ intpart = dp++;
+ while (isdigit((uchar)*dp)) {
+ dp++;
+ }
+ n_int = (mpd_ssize_t)(dp-intpart);
+ /* decimal point */
+ if (*dp == '.') {
+ dp++; dot = spec->dot;
+ }
+ /* rest */
+ rest = dp;
+ n_rest = result->nbytes - (mpd_ssize_t)(dp-result->data);
+
+ if (dot == NULL && (*spec->sep == '\0' || *spec->grouping == '\0')) {
+ /* _mpd_add_sep_dot() would not change anything */
+ return 1;
+ }
+
+ /* Determine the size of the new decimal string after inserting the
+ * decimal point, optional separators and optional padding. */
+ decstring = result->data;
+ result->data = NULL;
+ _mpd_add_sep_dot(result, sign, intpart, n_int, dot,
+ rest, n_rest, spec);
+
+ result->data = mpd_alloc(result->nbytes+1, 1);
+ if (result->data == NULL) {
+ *status |= MPD_Malloc_error;
+ mpd_free(decstring);
+ return 0;
+ }
+
+ /* Perform actual writes. */
+ _mpd_add_sep_dot(result, sign, intpart, n_int, dot,
+ rest, n_rest, spec);
+
+ mpd_free(decstring);
+ return 1;
+}
+
+/* Add padding to the formatted string if necessary. */
+static int
+_mpd_add_pad(mpd_mbstr_t *result, const mpd_spec_t *spec, uint32_t *status)
+{
+ if (result->nchars < spec->min_width) {
+ mpd_ssize_t add_chars, add_bytes;
+ size_t lpad = 0, rpad = 0;
+ size_t n_fill, len, i, j;
+ char align = spec->align;
+ uint8_t err = 0;
+ char *cp;
+
+ n_fill = strlen(spec->fill);
+ add_chars = (spec->min_width - result->nchars);
+ /* max value: MPD_MAX_PREC * 4 */
+ add_bytes = add_chars * (mpd_ssize_t)n_fill;
+
+ cp = result->data = mpd_realloc(result->data,
+ result->nbytes+add_bytes+1,
+ sizeof *result->data, &err);
+ if (err) {
+ *status |= MPD_Malloc_error;
+ mpd_free(result->data);
+ return 0;
+ }
+
+ if (align == 'z') {
+ align = '=';
+ }
+
+ if (align == '<') {
+ rpad = add_chars;
+ }
+ else if (align == '>' || align == '=') {
+ lpad = add_chars;
+ }
+ else { /* align == '^' */
+ lpad = add_chars/2;
+ rpad = add_chars-lpad;
+ }
+
+ len = result->nbytes;
+ if (align == '=' && (*cp == '-' || *cp == '+' || *cp == ' ')) {
+ /* leave sign in the leading position */
+ cp++; len--;
+ }
+
+ memmove(cp+n_fill*lpad, cp, len);
+ for (i = 0; i < lpad; i++) {
+ for (j = 0; j < n_fill; j++) {
+ cp[i*n_fill+j] = spec->fill[j];
+ }
+ }
+ cp += (n_fill*lpad + len);
+ for (i = 0; i < rpad; i++) {
+ for (j = 0; j < n_fill; j++) {
+ cp[i*n_fill+j] = spec->fill[j];
+ }
+ }
+
+ result->nbytes += add_bytes;
+ result->nchars += add_chars;
+ result->data[result->nbytes] = '\0';
+ }
+
+ return 1;
+}
+
+/* Round a number to prec digits. The adjusted exponent stays the same
+ or increases by one if rounding up crosses a power of ten boundary.
+ If result->digits would exceed MPD_MAX_PREC+1, MPD_Invalid_operation
+ is set and the result is NaN. */
+static inline void
+_mpd_round(mpd_t *result, const mpd_t *a, mpd_ssize_t prec,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t exp = a->exp + a->digits - prec;
+
+ if (prec <= 0) {
+ mpd_seterror(result, MPD_Invalid_operation, status); /* GCOV_NOT_REACHED */
+ return; /* GCOV_NOT_REACHED */
+ }
+ if (mpd_isspecial(a) || mpd_iszero(a)) {
+ mpd_qcopy(result, a, status); /* GCOV_NOT_REACHED */
+ return; /* GCOV_NOT_REACHED */
+ }
+
+ mpd_qrescale_fmt(result, a, exp, ctx, status);
+ if (result->digits > prec) {
+ mpd_qrescale_fmt(result, result, exp+1, ctx, status);
+ }
+}
+
+/*
+ * Return the string representation of an mpd_t, formatted according to 'spec'.
+ * The format specification is assumed to be valid. Memory errors are indicated
+ * as usual. This function is quiet.
+ */
+char *
+mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_uint_t dt[MPD_MINALLOC_MAX];
+ mpd_t tmp = {MPD_STATIC|MPD_STATIC_DATA,0,0,0,MPD_MINALLOC_MAX,dt};
+ mpd_ssize_t dplace = MPD_DEFAULT_DOTPLACE;
+ mpd_mbstr_t result;
+ mpd_spec_t stackspec;
+ char type = spec->type;
+ int flags = 0;
+
+
+ if (spec->min_width > MPD_MAX_PREC) {
+ *status |= MPD_Invalid_operation;
+ return NULL;
+ }
+
+ if (isupper((uchar)type)) {
+ type = tolower((uchar)type);
+ flags |= MPD_FMT_UPPER;
+ }
+ if (spec->sign == ' ') {
+ flags |= MPD_FMT_SIGN_SPACE;
+ }
+ else if (spec->sign == '+') {
+ flags |= MPD_FMT_SIGN_PLUS;
+ }
+
+ if (mpd_isspecial(dec)) {
+ if (spec->align == 'z') {
+ stackspec = *spec;
+ stackspec.fill[0] = ' ';
+ stackspec.fill[1] = '\0';
+ stackspec.align = '>';
+ spec = &stackspec;
+ }
+ }
+ else {
+ uint32_t workstatus = 0;
+ mpd_ssize_t prec;
+
+ switch (type) {
+ case 'g': flags |= MPD_FMT_TOSCI; break;
+ case 'e': flags |= MPD_FMT_EXP; break;
+ case '%': flags |= MPD_FMT_PERCENT;
+ if (!mpd_qcopy(&tmp, dec, status)) {
+ return NULL;
+ }
+ tmp.exp += 2;
+ dec = &tmp;
+ type = 'f'; /* fall through */
+ case 'f': flags |= MPD_FMT_FIXED; break;
+ default: abort(); /* debug: GCOV_NOT_REACHED */
+ }
+
+ if (spec->prec >= 0) {
+ if (spec->prec > MPD_MAX_PREC) {
+ *status |= MPD_Invalid_operation;
+ goto error;
+ }
+
+ switch (type) {
+ case 'g':
+ prec = (spec->prec == 0) ? 1 : spec->prec;
+ if (dec->digits > prec) {
+ _mpd_round(&tmp, dec, prec, ctx,
+ &workstatus);
+ dec = &tmp;
+ }
+ break;
+ case 'e':
+ if (mpd_iszero(dec)) {
+ dplace = 1-spec->prec;
+ }
+ else {
+ _mpd_round(&tmp, dec, spec->prec+1, ctx,
+ &workstatus);
+ dec = &tmp;
+ }
+ break;
+ case 'f':
+ mpd_qrescale(&tmp, dec, -spec->prec, ctx,
+ &workstatus);
+ dec = &tmp;
+ break;
+ }
+ }
+
+ if (type == 'f') {
+ if (mpd_iszero(dec) && dec->exp > 0) {
+ mpd_qrescale(&tmp, dec, 0, ctx, &workstatus);
+ dec = &tmp;
+ }
+ }
+
+ if (workstatus&MPD_Errors) {
+ *status |= (workstatus&MPD_Errors);
+ goto error;
+ }
+ }
+
+ /*
+ * At this point, for all scaled or non-scaled decimals:
+ * 1) 1 <= digits <= MAX_PREC+1
+ * 2) adjexp(scaled) = adjexp(orig) [+1]
+ * 3) case 'g': MIN_ETINY <= exp <= MAX_EMAX+1
+ * case 'e': MIN_ETINY-MAX_PREC <= exp <= MAX_EMAX+1
+ * case 'f': MIN_ETINY <= exp <= MAX_EMAX+1
+ * 4) max memory alloc in _mpd_to_string:
+ * case 'g': MAX_PREC+36
+ * case 'e': MAX_PREC+36
+ * case 'f': 2*MPD_MAX_PREC+30
+ */
+ result.nbytes = _mpd_to_string(&result.data, dec, flags, dplace);
+ result.nchars = result.nbytes;
+ if (result.nbytes < 0) {
+ *status |= MPD_Malloc_error;
+ goto error;
+ }
+
+ if (*spec->dot != '\0' && !mpd_isspecial(dec)) {
+ if (result.nchars > MPD_MAX_PREC+36) {
+ /* Since a group length of one is not explicitly
+ * disallowed, ensure that it is always possible to
+ * insert a four byte separator after each digit. */
+ *status |= MPD_Invalid_operation;
+ mpd_free(result.data);
+ goto error;
+ }
+ if (!_mpd_apply_lconv(&result, spec, status)) {
+ goto error;
+ }
+ }
+
+ if (spec->min_width) {
+ if (!_mpd_add_pad(&result, spec, status)) {
+ goto error;
+ }
+ }
+
+ mpd_del(&tmp);
+ return result.data;
+
+error:
+ mpd_del(&tmp);
+ return NULL;
+}
+
+char *
+mpd_qformat(const mpd_t *dec, const char *fmt, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_spec_t spec;
+
+ if (!mpd_parse_fmt_str(&spec, fmt, 1)) {
+ *status |= MPD_Invalid_operation;
+ return NULL;
+ }
+
+ return mpd_qformat_spec(dec, &spec, ctx, status);
+}
+
+/*
+ * The specification has a *condition* called Invalid_operation and an
+ * IEEE *signal* called Invalid_operation. The former corresponds to
+ * MPD_Invalid_operation, the latter to MPD_IEEE_Invalid_operation.
+ * MPD_IEEE_Invalid_operation comprises the following conditions:
+ *
+ * [MPD_Conversion_syntax, MPD_Division_impossible, MPD_Division_undefined,
+ * MPD_Fpu_error, MPD_Invalid_context, MPD_Invalid_operation,
+ * MPD_Malloc_error]
+ *
+ * In the following functions, 'flag' denotes the condition, 'signal'
+ * denotes the IEEE signal.
+ */
+
+static const char *mpd_flag_string[MPD_NUM_FLAGS] = {
+ "Clamped",
+ "Conversion_syntax",
+ "Division_by_zero",
+ "Division_impossible",
+ "Division_undefined",
+ "Fpu_error",
+ "Inexact",
+ "Invalid_context",
+ "Invalid_operation",
+ "Malloc_error",
+ "Not_implemented",
+ "Overflow",
+ "Rounded",
+ "Subnormal",
+ "Underflow",
+};
+
+static const char *mpd_signal_string[MPD_NUM_FLAGS] = {
+ "Clamped",
+ "IEEE_Invalid_operation",
+ "Division_by_zero",
+ "IEEE_Invalid_operation",
+ "IEEE_Invalid_operation",
+ "IEEE_Invalid_operation",
+ "Inexact",
+ "IEEE_Invalid_operation",
+ "IEEE_Invalid_operation",
+ "IEEE_Invalid_operation",
+ "Not_implemented",
+ "Overflow",
+ "Rounded",
+ "Subnormal",
+ "Underflow",
+};
+
+/* print conditions to buffer, separated by spaces */
+int
+mpd_snprint_flags(char *dest, int nmemb, uint32_t flags)
+{
+ char *cp;
+ int n, j;
+
+ assert(nmemb >= MPD_MAX_FLAG_STRING);
+
+ *dest = '\0'; cp = dest;
+ for (j = 0; j < MPD_NUM_FLAGS; j++) {
+ if (flags & (1U<<j)) {
+ n = snprintf(cp, nmemb, "%s ", mpd_flag_string[j]);
+ if (n < 0 || n >= nmemb) return -1;
+ cp += n; nmemb -= n;
+ }
+ }
+
+ if (cp != dest) {
+ *(--cp) = '\0';
+ }
+
+ return (int)(cp-dest);
+}
+
+/* print conditions to buffer, in list form */
+int
+mpd_lsnprint_flags(char *dest, int nmemb, uint32_t flags, const char *flag_string[])
+{
+ char *cp;
+ int n, j;
+
+ assert(nmemb >= MPD_MAX_FLAG_LIST);
+ if (flag_string == NULL) {
+ flag_string = mpd_flag_string;
+ }
+
+ *dest = '[';
+ *(dest+1) = '\0';
+ cp = dest+1;
+ --nmemb;
+
+ for (j = 0; j < MPD_NUM_FLAGS; j++) {
+ if (flags & (1U<<j)) {
+ n = snprintf(cp, nmemb, "%s, ", flag_string[j]);
+ if (n < 0 || n >= nmemb) return -1;
+ cp += n; nmemb -= n;
+ }
+ }
+
+ /* erase the last ", " */
+ if (cp != dest+1) {
+ cp -= 2;
+ }
+
+ *cp++ = ']';
+ *cp = '\0';
+
+ return (int)(cp-dest); /* strlen, without NUL terminator */
+}
+
+/* print signals to buffer, in list form */
+int
+mpd_lsnprint_signals(char *dest, int nmemb, uint32_t flags, const char *signal_string[])
+{
+ char *cp;
+ int n, j;
+ int ieee_invalid_done = 0;
+
+ assert(nmemb >= MPD_MAX_SIGNAL_LIST);
+ if (signal_string == NULL) {
+ signal_string = mpd_signal_string;
+ }
+
+ *dest = '[';
+ *(dest+1) = '\0';
+ cp = dest+1;
+ --nmemb;
+
+ for (j = 0; j < MPD_NUM_FLAGS; j++) {
+ uint32_t f = flags & (1U<<j);
+ if (f) {
+ if (f&MPD_IEEE_Invalid_operation) {
+ if (ieee_invalid_done) {
+ continue;
+ }
+ ieee_invalid_done = 1;
+ }
+ n = snprintf(cp, nmemb, "%s, ", signal_string[j]);
+ if (n < 0 || n >= nmemb) return -1;
+ cp += n; nmemb -= n;
+ }
+ }
+
+ /* erase the last ", " */
+ if (cp != dest+1) {
+ cp -= 2;
+ }
+
+ *cp++ = ']';
+ *cp = '\0';
+
+ return (int)(cp-dest); /* strlen, without NUL terminator */
+}
+
+/* The following two functions are mainly intended for debugging. */
+void
+mpd_fprint(FILE *file, const mpd_t *dec)
+{
+ char *decstring;
+
+ decstring = mpd_to_sci(dec, 1);
+ if (decstring != NULL) {
+ fprintf(file, "%s\n", decstring);
+ mpd_free(decstring);
+ }
+ else {
+ fputs("mpd_fprint: output error\n", file); /* GCOV_NOT_REACHED */
+ }
+}
+
+void
+mpd_print(const mpd_t *dec)
+{
+ char *decstring;
+
+ decstring = mpd_to_sci(dec, 1);
+ if (decstring != NULL) {
+ printf("%s\n", decstring);
+ mpd_free(decstring);
+ }
+ else {
+ fputs("mpd_fprint: output error\n", stderr); /* GCOV_NOT_REACHED */
+ }
+}
+
+
diff --git a/Modules/_decimal/libmpdec/io.h b/Modules/_decimal/libmpdec/io.h
new file mode 100644
index 0000000..3dfce73
--- /dev/null
+++ b/Modules/_decimal/libmpdec/io.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef IO_H
+#define IO_H
+
+
+#include <errno.h>
+#include "mpdecimal.h"
+
+
+#if SIZE_MAX == MPD_SIZE_MAX
+ #define mpd_strtossize _mpd_strtossize
+#else
+static inline mpd_ssize_t
+mpd_strtossize(const char *s, char **end, int base)
+{
+ int64_t retval;
+
+ errno = 0;
+ retval = _mpd_strtossize(s, end, base);
+ if (errno == 0 && (retval > MPD_SSIZE_MAX || retval < MPD_SSIZE_MIN)) {
+ errno = ERANGE;
+ }
+ if (errno == ERANGE) {
+ return (retval < 0) ? MPD_SSIZE_MIN : MPD_SSIZE_MAX;
+ }
+
+ return (mpd_ssize_t)retval;
+}
+#endif
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/literature/REFERENCES.txt b/Modules/_decimal/libmpdec/literature/REFERENCES.txt
new file mode 100644
index 0000000..9ed5782
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/REFERENCES.txt
@@ -0,0 +1,51 @@
+
+
+This document contains links to the literature used in the process of
+creating the library. The list is probably not complete.
+
+
+Mike Cowlishaw: General Decimal Arithmetic Specification
+http://speleotrove.com/decimal/decarith.html
+
+
+Jean-Michel Muller: On the definition of ulp (x)
+lara.inist.fr/bitstream/2332/518/1/LIP-RR2005-09.pdf
+
+
+T. E. Hull, A. Abrham: Properly rounded variable precision square root
+http://portal.acm.org/citation.cfm?id=214413
+
+
+T. E. Hull, A. Abrham: Variable precision exponential function
+http://portal.acm.org/citation.cfm?id=6498
+
+
+Roman E. Maeder: Storage allocation for the Karatsuba integer multiplication
+algorithm. http://www.springerlink.com/content/w15058mj6v59t565/
+
+
+J. M. Pollard: The fast Fourier transform in a finite field
+http://www.ams.org/journals/mcom/1971-25-114/S0025-5718-1971-0301966-0/home.html
+
+
+David H. Bailey: FFTs in External or Hierarchical Memory
+http://crd.lbl.gov/~dhbailey/dhbpapers/
+
+
+W. Morven Gentleman: Matrix Multiplication and Fast Fourier Transforms
+http://www.alcatel-lucent.com/bstj/vol47-1968/articles/bstj47-6-1099.pdf
+
+
+Mikko Tommila: Apfloat documentation
+http://www.apfloat.org/apfloat/2.41/apfloat.pdf
+
+
+Joerg Arndt: "Matters Computational"
+http://www.jjj.de/fxt/
+
+
+Karl Hasselstrom: Fast Division of Large Integers
+www.treskal.com/kalle/exjobb/original-report.pdf
+
+
+
diff --git a/Modules/_decimal/libmpdec/literature/bignum.txt b/Modules/_decimal/libmpdec/literature/bignum.txt
new file mode 100644
index 0000000..8a8731d
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/bignum.txt
@@ -0,0 +1,83 @@
+
+
+Bignum support (Fast Number Theoretic Transform or FNT):
+========================================================
+
+Bignum arithmetic in libmpdec uses the scheme for fast convolution
+of integer sequences from:
+
+J. M. Pollard: The fast Fourier transform in a finite field
+http://www.ams.org/journals/mcom/1971-25-114/S0025-5718-1971-0301966-0/home.html
+
+
+The transform in a finite field can be used for convolution in the same
+way as the Fourier Transform. The main advantages of the Number Theoretic
+Transform are that it is both exact and very memory efficient.
+
+
+Convolution in pseudo-code:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ fnt_convolute(a, b):
+ x = fnt(a) # forward transform of a
+ y = fnt(b) # forward transform of b
+ z = pairwise multiply x[i] and y[i]
+ result = inv_fnt(z) # backward transform of z.
+
+
+Extending the maximum transform length (Chinese Remainder Theorem):
+-------------------------------------------------------------------
+
+The maximum transform length is quite limited when using a single
+prime field. However, it is possible to use multiple primes and
+recover the result using the Chinese Remainder Theorem.
+
+
+Multiplication in pseudo-code:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ _mpd_fntmul(u, v):
+ c1 = fnt_convolute(u, v, P1) # convolute modulo prime1
+ c2 = fnt_convolute(u, v, P2) # convolute modulo prime2
+ c3 = fnt_convolute(u, v, P3) # convolute modulo prime3
+ result = crt3(c1, c2, c3) # Chinese Remainder Theorem
+
+
+Optimized transform functions:
+------------------------------
+
+There are three different fnt() functions:
+
+ std_fnt: "standard" decimation in frequency transform for array lengths
+ of 2**n. Performs well up to 1024 words.
+
+ sixstep: Cache-friendly algorithm for array lengths of 2**n. Outperforms
+ std_fnt for large arrays.
+
+ fourstep: Algorithm for array lengths of 3 * 2**n. Also cache friendly
+ in large parts.
+
+
+List of bignum-only files:
+--------------------------
+
+Functions from these files are only used in _mpd_fntmul().
+
+ umodarith.h -> fast low level routines for unsigned modular arithmetic
+ numbertheory.c -> routines for setting up the FNT
+ difradix2.c -> decimation in frequency transform, used as the
+ "base case" by the following three files:
+
+ fnt.c -> standard transform for smaller arrays
+ sixstep.c -> transform large arrays of length 2**n
+ fourstep.c -> transform arrays of length 3 * 2**n
+
+ convolute.c -> do the actual fast convolution, using one of
+ the three transform functions.
+ transpose.c -> transpositions needed for the sixstep algorithm.
+ crt.c -> Chinese Remainder Theorem: use information from three
+ transforms modulo three different primes to get the
+ final result.
+
+
+
diff --git a/Modules/_decimal/libmpdec/literature/fnt.py b/Modules/_decimal/libmpdec/literature/fnt.py
new file mode 100644
index 0000000..bf93745
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/fnt.py
@@ -0,0 +1,208 @@
+#
+# Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+
+######################################################################
+# This file lists and checks some of the constants and limits used #
+# in libmpdec's Number Theoretic Transform. At the end of the file #
+# there is an example function for the plain DFT transform. #
+######################################################################
+
+
+#
+# Number theoretic transforms are done in subfields of F(p). P[i]
+# are the primes, D[i] = P[i] - 1 are highly composite and w[i]
+# are the respective primitive roots of F(p).
+#
+# The strategy is to convolute two coefficients modulo all three
+# primes, then use the Chinese Remainder Theorem on the three
+# result arrays to recover the result in the usual base RADIX
+# form.
+#
+
+# ======================================================================
+# Primitive roots
+# ======================================================================
+
+#
+# Verify primitive roots:
+#
+# For a prime field, r is a primitive root if and only if for all prime
+# factors f of p-1, r**((p-1)/f) =/= 1 (mod p).
+#
+def prod(F, E):
+ """Check that the factorization of P-1 is correct. F is the list of
+ factors of P-1, E lists the number of occurrences of each factor."""
+ x = 1
+ for y, z in zip(F, E):
+ x *= y**z
+ return x
+
+def is_primitive_root(r, p, factors, exponents):
+ """Check if r is a primitive root of F(p)."""
+ if p != prod(factors, exponents) + 1:
+ return False
+ for f in factors:
+ q, control = divmod(p-1, f)
+ if control != 0:
+ return False
+ if pow(r, q, p) == 1:
+ return False
+ return True
+
+
+# =================================================================
+# Constants and limits for the 64-bit version
+# =================================================================
+
+RADIX = 10**19
+
+# Primes P1, P2 and P3:
+P = [2**64-2**32+1, 2**64-2**34+1, 2**64-2**40+1]
+
+# P-1, highly composite. The transform length d is variable and
+# must divide D = P-1. Since all D are divisible by 3 * 2**32,
+# transform lengths can be 2**n or 3 * 2**n (where n <= 32).
+D = [2**32 * 3 * (5 * 17 * 257 * 65537),
+ 2**34 * 3**2 * (7 * 11 * 31 * 151 * 331),
+ 2**40 * 3**2 * (5 * 7 * 13 * 17 * 241)]
+
+# Prime factors of P-1 and their exponents:
+F = [(2,3,5,17,257,65537), (2,3,7,11,31,151,331), (2,3,5,7,13,17,241)]
+E = [(32,1,1,1,1,1), (34,2,1,1,1,1,1), (40,2,1,1,1,1,1)]
+
+# Maximum transform length for 2**n. Above that only 3 * 2**31
+# or 3 * 2**32 are possible.
+MPD_MAXTRANSFORM_2N = 2**32
+
+
+# Limits in the terminology of Pollard's paper:
+m2 = (MPD_MAXTRANSFORM_2N * 3) // 2 # Maximum length of the smaller array.
+M1 = M2 = RADIX-1 # Maximum value per single word.
+L = m2 * M1 * M2
+P[0] * P[1] * P[2] > 2 * L
+
+
+# Primitive roots of F(P1), F(P2) and F(P3):
+w = [7, 10, 19]
+
+# The primitive roots are correct:
+for i in range(3):
+ if not is_primitive_root(w[i], P[i], F[i], E[i]):
+ print("FAIL")
+
+
+# =================================================================
+# Constants and limits for the 32-bit version
+# =================================================================
+
+RADIX = 10**9
+
+# Primes P1, P2 and P3:
+P = [2113929217, 2013265921, 1811939329]
+
+# P-1, highly composite. All D = P-1 are divisible by 3 * 2**25,
+# allowing for transform lengths up to 3 * 2**25 words.
+D = [2**25 * 3**2 * 7,
+ 2**27 * 3 * 5,
+ 2**26 * 3**3]
+
+# Prime factors of P-1 and their exponents:
+F = [(2,3,7), (2,3,5), (2,3)]
+E = [(25,2,1), (27,1,1), (26,3)]
+
+# Maximum transform length for 2**n. Above that only 3 * 2**24 or
+# 3 * 2**25 are possible.
+MPD_MAXTRANSFORM_2N = 2**25
+
+
+# Limits in the terminology of Pollard's paper:
+m2 = (MPD_MAXTRANSFORM_2N * 3) // 2 # Maximum length of the smaller array.
+M1 = M2 = RADIX-1 # Maximum value per single word.
+L = m2 * M1 * M2
+P[0] * P[1] * P[2] > 2 * L
+
+
+# Primitive roots of F(P1), F(P2) and F(P3):
+w = [5, 31, 13]
+
+# The primitive roots are correct:
+for i in range(3):
+ if not is_primitive_root(w[i], P[i], F[i], E[i]):
+ print("FAIL")
+
+
+# ======================================================================
+# Example transform using a single prime
+# ======================================================================
+
+def ntt(lst, dir):
+ """Perform a transform on the elements of lst. len(lst) must
+ be 2**n or 3 * 2**n, where n <= 25. This is the slow DFT."""
+ p = 2113929217 # prime
+ d = len(lst) # transform length
+ d_prime = pow(d, (p-2), p) # inverse of d
+ xi = (p-1)//d
+ w = 5 # primitive root of F(p)
+ r = pow(w, xi, p) # primitive root of the subfield
+ r_prime = pow(w, (p-1-xi), p) # inverse of r
+ if dir == 1: # forward transform
+ a = lst # input array
+ A = [0] * d # transformed values
+ for i in range(d):
+ s = 0
+ for j in range(d):
+ s += a[j] * pow(r, i*j, p)
+ A[i] = s % p
+ return A
+ elif dir == -1: # backward transform
+ A = lst # input array
+ a = [0] * d # transformed values
+ for j in range(d):
+ s = 0
+ for i in range(d):
+ s += A[i] * pow(r_prime, i*j, p)
+ a[j] = (d_prime * s) % p
+ return a
+
+def ntt_convolute(a, b):
+ """convolute arrays a and b."""
+ assert(len(a) == len(b))
+ x = ntt(a, 1)
+ y = ntt(b, 1)
+ for i in range(len(a)):
+ y[i] = y[i] * x[i]
+ r = ntt(y, -1)
+ return r
+
+
+# Example: Two arrays representing 21 and 81 in little-endian:
+a = [1, 2, 0, 0]
+b = [1, 8, 0, 0]
+
+assert(ntt_convolute(a, b) == [1, 10, 16, 0])
+assert(21 * 81 == (1*10**0 + 10*10**1 + 16*10**2 + 0*10**3))
diff --git a/Modules/_decimal/libmpdec/literature/matrix-transform.txt b/Modules/_decimal/libmpdec/literature/matrix-transform.txt
new file mode 100644
index 0000000..ff62198
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/matrix-transform.txt
@@ -0,0 +1,256 @@
+
+
+(* Copyright (c) 2011 Stefan Krah. All rights reserved. *)
+
+
+The Matrix Fourier Transform:
+=============================
+
+In libmpdec, the Matrix Fourier Transform [1] is called four-step transform
+after a variant that appears in [2]. The algorithm requires that the input
+array can be viewed as an R*C matrix.
+
+All operations are done modulo p. For readability, the proofs drop all
+instances of (mod p).
+
+
+Algorithm four-step (forward transform):
+----------------------------------------
+
+ a := input array
+ d := len(a) = R * C
+ p := prime
+ w := primitive root of unity of the prime field
+ r := w**((p-1)/d)
+ A := output array
+
+ 1) Apply a length R FNT to each column.
+
+ 2) Multiply each matrix element (addressed by j*C+m) by r**(j*m).
+
+ 3) Apply a length C FNT to each row.
+
+ 4) Transpose the matrix.
+
+
+Proof (forward transform):
+--------------------------
+
+ The algorithm can be derived starting from the regular definition of
+ the finite-field transform of length d:
+
+ d-1
+ ,----
+ \
+ A[k] = | a[l] * r**(k * l)
+ /
+ `----
+ l = 0
+
+
+ The sum can be rearranged into the sum of the sums of columns:
+
+ C-1 R-1
+ ,---- ,----
+ \ \
+ = | | a[i * C + j] * r**(k * (i * C + j))
+ / /
+ `---- `----
+ j = 0 i = 0
+
+
+ Extracting a constant from the inner sum:
+
+ C-1 R-1
+ ,---- ,----
+ \ \
+ = | r**k*j * | a[i * C + j] * r**(k * i * C)
+ / /
+ `---- `----
+ j = 0 i = 0
+
+
+ Without any loss of generality, let k = n * R + m,
+ where n < C and m < R:
+
+ C-1 R-1
+ ,---- ,----
+ \ \
+ A[n*R+m] = | r**(R*n*j) * r**(m*j) * | a[i*C+j] * r**(R*C*n*i) * r**(C*m*i)
+ / /
+ `---- `----
+ j = 0 i = 0
+
+
+ Since r = w ** ((p-1) / (R*C)):
+
+ a) r**(R*C*n*i) = w**((p-1)*n*i) = 1
+
+ b) r**(C*m*i) = w**((p-1) / R) ** (m*i) = r_R ** (m*i)
+
+ c) r**(R*n*j) = w**((p-1) / C) ** (n*j) = r_C ** (n*j)
+
+ r_R := root of the subfield of length R.
+ r_C := root of the subfield of length C.
+
+
+ C-1 R-1
+ ,---- ,----
+ \ \
+ A[n*R+m] = | r_C**(n*j) * [ r**(m*j) * | a[i*C+j] * r_R**(m*i) ]
+ / ^ /
+ `---- | `---- 1) transform the columns
+ j = 0 | i = 0
+ ^ |
+ | `-- 2) multiply
+ |
+ `-- 3) transform the rows
+
+
+ Note that the entire RHS is a function of n and m and that the results
+ for each pair (n, m) are stored in Fortran order.
+
+ Let the term in square brackets be f(m, j). Step 1) and 2) precalculate
+ the term for all (m, j). After that, the original matrix is now a lookup
+ table with the mth element in the jth column at location m * C + j.
+
+ Let the complete RHS be g(m, n). Step 3) does an in-place transform of
+ length n on all rows. After that, the original matrix is now a lookup
+ table with the mth element in the nth column at location m * C + n.
+
+ But each (m, n) pair should be written to location n * R + m. Therefore,
+ step 4) transposes the result of step 3).
+
+
+
+Algorithm four-step (inverse transform):
+----------------------------------------
+
+ A := input array
+ d := len(A) = R * C
+ p := prime
+ d' := d**(p-2) # inverse of d
+ w := primitive root of unity of the prime field
+ r := w**((p-1)/d) # root of the subfield
+ r' := w**((p-1) - (p-1)/d) # inverse of r
+ a := output array
+
+ 0) View the matrix as a C*R matrix.
+
+ 1) Transpose the matrix, producing an R*C matrix.
+
+ 2) Apply a length C FNT to each row.
+
+ 3) Multiply each matrix element (addressed by i*C+n) by r**(i*n).
+
+ 4) Apply a length R FNT to each column.
+
+
+Proof (inverse transform):
+--------------------------
+
+ The algorithm can be derived starting from the regular definition of
+ the finite-field inverse transform of length d:
+
+ d-1
+ ,----
+ \
+ a[k] = d' * | A[l] * r' ** (k * l)
+ /
+ `----
+ l = 0
+
+
+ The sum can be rearranged into the sum of the sums of columns. Note
+ that at this stage we still have a C*R matrix, so C denotes the number
+ of rows:
+
+ R-1 C-1
+ ,---- ,----
+ \ \
+ = d' * | | a[j * R + i] * r' ** (k * (j * R + i))
+ / /
+ `---- `----
+ i = 0 j = 0
+
+
+ Extracting a constant from the inner sum:
+
+ R-1 C-1
+ ,---- ,----
+ \ \
+ = d' * | r' ** (k*i) * | a[j * R + i] * r' ** (k * j * R)
+ / /
+ `---- `----
+ i = 0 j = 0
+
+
+ Without any loss of generality, let k = m * C + n,
+ where m < R and n < C:
+
+ R-1 C-1
+ ,---- ,----
+ \ \
+ A[m*C+n] = d' * | r' ** (C*m*i) * r' ** (n*i) * | a[j*R+i] * r' ** (R*C*m*j) * r' ** (R*n*j)
+ / /
+ `---- `----
+ i = 0 j = 0
+
+
+ Since r' = w**((p-1) - (p-1)/d) and d = R*C:
+
+ a) r' ** (R*C*m*j) = w**((p-1)*R*C*m*j - (p-1)*m*j) = 1
+
+ b) r' ** (C*m*i) = w**((p-1)*C - (p-1)/R) ** (m*i) = r_R' ** (m*i)
+
+ c) r' ** (R*n*j) = r_C' ** (n*j)
+
+ d) d' = d**(p-2) = (R*C) ** (p-2) = R**(p-2) * C**(p-2) = R' * C'
+
+ r_R' := inverse of the root of the subfield of length R.
+ r_C' := inverse of the root of the subfield of length C.
+ R' := inverse of R
+ C' := inverse of C
+
+
+ R-1 C-1
+ ,---- ,---- 2) transform the rows of a^T
+ \ \
+ A[m*C+n] = R' * | r_R' ** (m*i) * [ r' ** (n*i) * C' * | a[j*R+i] * r_C' ** (n*j) ]
+ / ^ / ^
+ `---- | `---- |
+ i = 0 | j = 0 |
+ ^ | `-- 1) Transpose input matrix
+ | `-- 3) multiply to address elements by
+ | i * C + j
+ `-- 3) transform the columns
+
+
+
+ Note that the entire RHS is a function of m and n and that the results
+ for each pair (m, n) are stored in C order.
+
+ Let the term in square brackets be f(n, i). Without step 1), the sum
+ would perform a length C transform on the columns of the input matrix.
+ This is a) inefficient and b) the results are needed in C order, so
+ step 1) exchanges rows and columns.
+
+ Step 2) and 3) precalculate f(n, i) for all (n, i). After that, the
+ original matrix is now a lookup table with the ith element in the nth
+ column at location i * C + n.
+
+ Let the complete RHS be g(m, n). Step 4) does an in-place transform of
+ length m on all columns. After that, the original matrix is now a lookup
+ table with the mth element in the nth column at location m * C + n,
+ which means that all A[k] = A[m * C + n] are in the correct order.
+
+
+--
+
+ [1] Joerg Arndt: "Matters Computational"
+ http://www.jjj.de/fxt/
+ [2] David H. Bailey: FFTs in External or Hierarchical Memory
+ http://crd.lbl.gov/~dhbailey/dhbpapers/
+
+
+
diff --git a/Modules/_decimal/libmpdec/literature/mulmod-64.txt b/Modules/_decimal/libmpdec/literature/mulmod-64.txt
new file mode 100644
index 0000000..93bf22e
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/mulmod-64.txt
@@ -0,0 +1,127 @@
+
+
+(* Copyright (c) 2011 Stefan Krah. All rights reserved. *)
+
+
+==========================================================================
+ Calculate (a * b) % p using special primes
+==========================================================================
+
+A description of the algorithm can be found in the apfloat manual by
+Tommila [1].
+
+
+Definitions:
+------------
+
+In the whole document, "==" stands for "is congruent with".
+
+Result of a * b in terms of high/low words:
+
+ (1) hi * 2**64 + lo = a * b
+
+Special primes:
+
+ (2) p = 2**64 - z + 1, where z = 2**n
+
+Single step modular reduction:
+
+ (3) R(hi, lo) = hi * z - hi + lo
+
+
+Strategy:
+---------
+
+ a) Set (hi, lo) to the result of a * b.
+
+ b) Set (hi', lo') to the result of R(hi, lo).
+
+ c) Repeat step b) until 0 <= hi' * 2**64 + lo' < 2*p.
+
+ d) If the result is less than p, return lo'. Otherwise return lo' - p.
+
+
+The reduction step b) preserves congruence:
+-------------------------------------------
+
+ hi * 2**64 + lo == hi * z - hi + lo (mod p)
+
+ Proof:
+ ~~~~~~
+
+ hi * 2**64 + lo = (2**64 - z + 1) * hi + z * hi - hi + lo
+
+ = p * hi + z * hi - hi + lo
+
+ == z * hi - hi + lo (mod p)
+
+
+Maximum numbers of step b):
+---------------------------
+
+# To avoid unneccessary formalism, define:
+
+def R(hi, lo, z):
+ return divmod(hi * z - hi + lo, 2**64)
+
+# For simplicity, assume hi=2**64-1, lo=2**64-1 after the
+# initial multiplication a * b. This is of course impossible
+# but certainly covers all cases.
+
+# Then, for p1:
+hi=2**64-1; lo=2**64-1; z=2**32
+p1 = 2**64 - z + 1
+
+hi, lo = R(hi, lo, z) # First reduction
+hi, lo = R(hi, lo, z) # Second reduction
+hi * 2**64 + lo < 2 * p1 # True
+
+# For p2:
+hi=2**64-1; lo=2**64-1; z=2**34
+p2 = 2**64 - z + 1
+
+hi, lo = R(hi, lo, z) # First reduction
+hi, lo = R(hi, lo, z) # Second reduction
+hi, lo = R(hi, lo, z) # Third reduction
+hi * 2**64 + lo < 2 * p2 # True
+
+# For p3:
+hi=2**64-1; lo=2**64-1; z=2**40
+p3 = 2**64 - z + 1
+
+hi, lo = R(hi, lo, z) # First reduction
+hi, lo = R(hi, lo, z) # Second reduction
+hi, lo = R(hi, lo, z) # Third reduction
+hi * 2**64 + lo < 2 * p3 # True
+
+
+Step d) preserves congruence and yields a result < p:
+-----------------------------------------------------
+
+ Case hi = 0:
+
+ Case lo < p: trivial.
+
+ Case lo >= p:
+
+ lo == lo - p (mod p) # result is congruent
+
+ p <= lo < 2*p -> 0 <= lo - p < p # result is in the correct range
+
+ Case hi = 1:
+
+ p < 2**64 /\ 2**64 + lo < 2*p -> lo < p # lo is always less than p
+
+ 2**64 + lo == 2**64 + (lo - p) (mod p) # result is congruent
+
+ = lo - p # exactly the same value as the previous RHS
+ # in uint64_t arithmetic.
+
+ p < 2**64 + lo < 2*p -> 0 < 2**64 + (lo - p) < p # correct range
+
+
+
+[1] http://www.apfloat.org/apfloat/2.40/apfloat.pdf
+
+
+
diff --git a/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt
new file mode 100644
index 0000000..43e6e4e
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt
@@ -0,0 +1,269 @@
+
+
+(* Copyright (c) 2011 Stefan Krah. All rights reserved. *)
+
+
+========================================================================
+ Calculate (a * b) % p using the 80-bit x87 FPU
+========================================================================
+
+A description of the algorithm can be found in the apfloat manual by
+Tommila [1].
+
+The proof follows an argument made by Granlund/Montgomery in [2].
+
+
+Definitions and assumptions:
+----------------------------
+
+The 80-bit extended precision format uses 64 bits for the significand:
+
+ (1) F = 64
+
+The modulus is prime and less than 2**31:
+
+ (2) 2 <= p < 2**31
+
+The factors are less than p:
+
+ (3) 0 <= a < p
+ (4) 0 <= b < p
+
+The product a * b is less than 2**62 and is thus exact in 64 bits:
+
+ (5) n = a * b
+
+The product can be represented in terms of quotient and remainder:
+
+ (6) n = q * p + r
+
+Using (3), (4) and the fact that p is prime, the remainder is always
+greater than zero:
+
+ (7) 0 <= q < p /\ 1 <= r < p
+
+
+Strategy:
+---------
+
+Precalculate the 80-bit long double inverse of p, with a maximum
+relative error of 2**(1-F):
+
+ (8) pinv = (long double)1.0 / p
+
+Calculate an estimate for q = floor(n/p). The multiplication has another
+maximum relative error of 2**(1-F):
+
+ (9) qest = n * pinv
+
+If we can show that q < qest < q+1, then trunc(qest) = q. It is then
+easy to recover the remainder r. The complete algorithm is:
+
+ a) Set the control word to 64-bit precision and truncation mode.
+
+ b) n = a * b # Calculate exact product.
+
+ c) qest = n * pinv # Calculate estimate for the quotient.
+
+ d) q = (qest+2**63)-2**63 # Truncate qest to the exact quotient.
+
+ f) r = n - q * p # Calculate remainder.
+
+
+Proof for q < qest < q+1:
+-------------------------
+
+Using the cumulative error, the error bounds for qest are:
+
+ n n * (1 + 2**(1-F))**2
+ (9) --------------------- <= qest <= ---------------------
+ p * (1 + 2**(1-F))**2 p
+
+
+ Lemma 1:
+ --------
+ n q * p + r
+ (10) q < --------------------- = ---------------------
+ p * (1 + 2**(1-F))**2 p * (1 + 2**(1-F))**2
+
+
+ Proof:
+ ~~~~~~
+
+ (I) q * p * (1 + 2**(1-F))**2 < q * p + r
+
+ (II) q * p * 2**(2-F) + q * p * 2**(2-2*F) < r
+
+ Using (1) and (7), it is sufficient to show that:
+
+ (III) q * p * 2**(-62) + q * p * 2**(-126) < 1 <= r
+
+ (III) can easily be verified by substituting the largest possible
+ values p = 2**31-1 and q = 2**31-2.
+
+ The critical cases occur when r = 1, n = m * p + 1. These cases
+ can be exhaustively verified with a test program.
+
+
+ Lemma 2:
+ --------
+
+ n * (1 + 2**(1-F))**2 (q * p + r) * (1 + 2**(1-F))**2
+ (11) --------------------- = ------------------------------- < q + 1
+ p p
+
+ Proof:
+ ~~~~~~
+
+ (I) (q * p + r) + (q * p + r) * 2**(2-F) + (q * p + r) * 2**(2-2*F) < q * p + p
+
+ (II) (q * p + r) * 2**(2-F) + (q * p + r) * 2**(2-2*F) < p - r
+
+ Using (1) and (7), it is sufficient to show that:
+
+ (III) (q * p + r) * 2**(-62) + (q * p + r) * 2**(-126) < 1 <= p - r
+
+ (III) can easily be verified by substituting the largest possible
+ values p = 2**31-1, q = 2**31-2 and r = 2**31-2.
+
+ The critical cases occur when r = (p - 1), n = m * p - 1. These cases
+ can be exhaustively verified with a test program.
+
+
+[1] http://www.apfloat.org/apfloat/2.40/apfloat.pdf
+[2] http://gmplib.org/~tege/divcnst-pldi94.pdf
+ [Section 7: "Use of floating point"]
+
+
+
+(* Coq proof for (10) and (11) *)
+
+Require Import ZArith.
+Require Import QArith.
+Require Import Qpower.
+Require Import Qabs.
+Require Import Psatz.
+
+Open Scope Q_scope.
+
+
+Ltac qreduce T :=
+ rewrite <- (Qred_correct (T)); simpl (Qred (T)).
+
+Theorem Qlt_move_right :
+ forall x y z:Q, x + z < y <-> x < y - z.
+Proof.
+ intros.
+ split.
+ intros.
+ psatzl Q.
+ intros.
+ psatzl Q.
+Qed.
+
+Theorem Qlt_mult_by_z :
+ forall x y z:Q, 0 < z -> (x < y <-> x * z < y * z).
+Proof.
+ intros.
+ split.
+ intros.
+ apply Qmult_lt_compat_r. trivial. trivial.
+ intros.
+ rewrite <- (Qdiv_mult_l x z). rewrite <- (Qdiv_mult_l y z).
+ apply Qmult_lt_compat_r.
+ apply Qlt_shift_inv_l.
+ trivial. psatzl Q. trivial. psatzl Q. psatzl Q.
+Qed.
+
+Theorem Qle_mult_quad :
+ forall (a b c d:Q),
+ 0 <= a -> a <= c ->
+ 0 <= b -> b <= d ->
+ a * b <= c * d.
+ intros.
+ psatz Q.
+Qed.
+
+
+Theorem q_lt_qest:
+ forall (p q r:Q),
+ (0 < p) -> (p <= (2#1)^31 - 1) ->
+ (0 <= q) -> (q <= p - 1) ->
+ (1 <= r) -> (r <= p - 1) ->
+ q < (q * p + r) / (p * (1 + (2#1)^(-63))^2).
+Proof.
+ intros.
+ rewrite Qlt_mult_by_z with (z := (p * (1 + (2#1)^(-63))^2)).
+
+ unfold Qdiv.
+ rewrite <- Qmult_assoc.
+ rewrite (Qmult_comm (/ (p * (1 + (2 # 1) ^ (-63)) ^ 2)) (p * (1 + (2 # 1) ^ (-63)) ^ 2)).
+ rewrite Qmult_inv_r.
+ rewrite Qmult_1_r.
+
+ assert (q * (p * (1 + (2 # 1) ^ (-63)) ^ 2) == q * p + (q * p) * ((2 # 1) ^ (-62) + (2 # 1) ^ (-126))).
+ qreduce ((1 + (2 # 1) ^ (-63)) ^ 2).
+ qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)).
+ ring_simplify.
+ reflexivity.
+ rewrite H5.
+
+ rewrite Qplus_comm.
+ rewrite Qlt_move_right.
+ ring_simplify (q * p + r - q * p).
+ qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)).
+
+ apply Qlt_le_trans with (y := 1).
+ rewrite Qlt_mult_by_z with (z := 85070591730234615865843651857942052864 # 18446744073709551617).
+ ring_simplify.
+
+ apply Qle_lt_trans with (y := ((2 # 1) ^ 31 - (2#1)) * ((2 # 1) ^ 31 - 1)).
+ apply Qle_mult_quad.
+ assumption. psatzl Q. psatzl Q. psatzl Q. psatzl Q. psatzl Q. assumption. psatzl Q. psatzl Q.
+Qed.
+
+Theorem qest_lt_qplus1:
+ forall (p q r:Q),
+ (0 < p) -> (p <= (2#1)^31 - 1) ->
+ (0 <= q) -> (q <= p - 1) ->
+ (1 <= r) -> (r <= p - 1) ->
+ ((q * p + r) * (1 + (2#1)^(-63))^2) / p < q + 1.
+Proof.
+ intros.
+ rewrite Qlt_mult_by_z with (z := p).
+
+ unfold Qdiv.
+ rewrite <- Qmult_assoc.
+ rewrite (Qmult_comm (/ p) p).
+ rewrite Qmult_inv_r.
+ rewrite Qmult_1_r.
+
+ assert ((q * p + r) * (1 + (2 # 1) ^ (-63)) ^ 2 == q * p + r + (q * p + r) * ((2 # 1) ^ (-62) + (2 # 1) ^ (-126))).
+ qreduce ((1 + (2 # 1) ^ (-63)) ^ 2).
+ qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)).
+ ring_simplify. reflexivity.
+ rewrite H5.
+
+ rewrite <- Qplus_assoc. rewrite <- Qplus_comm. rewrite Qlt_move_right.
+ ring_simplify ((q + 1) * p - q * p).
+
+ rewrite <- Qplus_comm. rewrite Qlt_move_right.
+
+ apply Qlt_le_trans with (y := 1).
+ qreduce ((2 # 1) ^ (-62) + (2 # 1) ^ (-126)).
+
+ rewrite Qlt_mult_by_z with (z := 85070591730234615865843651857942052864 # 18446744073709551617).
+ ring_simplify.
+
+ ring_simplify in H0.
+ apply Qle_lt_trans with (y := (2147483646 # 1) * (2147483647 # 1) + (2147483646 # 1)).
+
+ apply Qplus_le_compat.
+ apply Qle_mult_quad.
+ assumption. psatzl Q. auto with qarith. assumption. psatzl Q.
+ auto with qarith. auto with qarith.
+ psatzl Q. psatzl Q. assumption.
+Qed.
+
+
+
diff --git a/Modules/_decimal/libmpdec/literature/six-step.txt b/Modules/_decimal/libmpdec/literature/six-step.txt
new file mode 100644
index 0000000..759147f
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/six-step.txt
@@ -0,0 +1,63 @@
+
+
+(* Copyright (c) 2011 Stefan Krah. All rights reserved. *)
+
+
+The Six Step Transform:
+=======================
+
+In libmpdec, the six-step transform is the Matrix Fourier Transform (See
+matrix-transform.txt) in disguise. It is called six-step transform after
+a variant that appears in [1]. The algorithm requires that the input
+array can be viewed as an R*C matrix.
+
+
+Algorithm six-step (forward transform):
+---------------------------------------
+
+ 1a) Transpose the matrix.
+
+ 1b) Apply a length R FNT to each row.
+
+ 1c) Transpose the matrix.
+
+ 2) Multiply each matrix element (addressed by j*C+m) by r**(j*m).
+
+ 3) Apply a length C FNT to each row.
+
+ 4) Transpose the matrix.
+
+Note that steps 1a) - 1c) are exactly equivalent to step 1) of the Matrix
+Fourier Transform. For large R, it is faster to transpose twice and do
+a transform on the rows than to perform a column transpose directly.
+
+
+
+Algorithm six-step (inverse transform):
+---------------------------------------
+
+ 0) View the matrix as a C*R matrix.
+
+ 1) Transpose the matrix, producing an R*C matrix.
+
+ 2) Apply a length C FNT to each row.
+
+ 3) Multiply each matrix element (addressed by i*C+n) by r**(i*n).
+
+ 4a) Transpose the matrix.
+
+ 4b) Apply a length R FNT to each row.
+
+ 4c) Transpose the matrix.
+
+Again, steps 4a) - 4c) are equivalent to step 4) of the Matrix Fourier
+Transform.
+
+
+
+--
+
+ [1] David H. Bailey: FFTs in External or Hierarchical Memory
+ http://crd.lbl.gov/~dhbailey/dhbpapers/
+
+
diff --git a/Modules/_decimal/libmpdec/literature/umodarith.lisp b/Modules/_decimal/libmpdec/literature/umodarith.lisp
new file mode 100644
index 0000000..60a14a4
--- /dev/null
+++ b/Modules/_decimal/libmpdec/literature/umodarith.lisp
@@ -0,0 +1,692 @@
+;
+; Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+;
+; 1. Redistributions of source code must retain the above copyright
+; notice, this list of conditions and the following disclaimer.
+;
+; 2. Redistributions in binary form must reproduce the above copyright
+; notice, this list of conditions and the following disclaimer in the
+; documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; SUCH DAMAGE.
+;
+
+
+(in-package "ACL2")
+
+(include-book "arithmetic/top-with-meta" :dir :system)
+(include-book "arithmetic-2/floor-mod/floor-mod" :dir :system)
+
+
+;; =====================================================================
+;; Proofs for several functions in umodarith.h
+;; =====================================================================
+
+
+
+;; =====================================================================
+;; Helper theorems
+;; =====================================================================
+
+(defthm elim-mod-m<x<2*m
+ (implies (and (<= m x)
+ (< x (* 2 m))
+ (rationalp x) (rationalp m))
+ (equal (mod x m)
+ (+ x (- m)))))
+
+(defthm modaux-1a
+ (implies (and (< x m) (< 0 x) (< 0 m)
+ (rationalp x) (rationalp m))
+ (equal (mod (- x) m)
+ (+ (- x) m))))
+
+(defthm modaux-1b
+ (implies (and (< (- x) m) (< x 0) (< 0 m)
+ (rationalp x) (rationalp m))
+ (equal (mod x m)
+ (+ x m)))
+ :hints (("Goal" :use ((:instance modaux-1a
+ (x (- x)))))))
+
+(defthm modaux-1c
+ (implies (and (< x m) (< 0 x) (< 0 m)
+ (rationalp x) (rationalp m))
+ (equal (mod x m)
+ x)))
+
+(defthm modaux-2a
+ (implies (and (< 0 b) (< b m)
+ (natp x) (natp b) (natp m)
+ (< (mod (+ b x) m) b))
+ (equal (mod (+ (- m) b x) m)
+ (+ (- m) b (mod x m)))))
+
+(defthm modaux-2b
+ (implies (and (< 0 b) (< b m)
+ (natp x) (natp b) (natp m)
+ (< (mod (+ b x) m) b))
+ (equal (mod (+ b x) m)
+ (+ (- m) b (mod x m))))
+ :hints (("Goal" :use (modaux-2a))))
+
+(defthm linear-mod-1
+ (implies (and (< x m) (< b m)
+ (natp x) (natp b)
+ (rationalp m))
+ (equal (< x (mod (+ (- b) x) m))
+ (< x b)))
+ :hints (("Goal" :use ((:instance modaux-1a
+ (x (+ b (- x))))))))
+
+(defthm linear-mod-2
+ (implies (and (< 0 b) (< b m)
+ (natp x) (natp b)
+ (natp m))
+ (equal (< (mod x m)
+ (mod (+ (- b) x) m))
+ (< (mod x m) b))))
+
+(defthm linear-mod-3
+ (implies (and (< x m) (< b m)
+ (natp x) (natp b)
+ (rationalp m))
+ (equal (<= b (mod (+ b x) m))
+ (< (+ b x) m)))
+ :hints (("Goal" :use ((:instance elim-mod-m<x<2*m
+ (x (+ b x)))))))
+
+(defthm modaux-2c
+ (implies (and (< 0 b) (< b m)
+ (natp x) (natp b) (natp m)
+ (<= b (mod (+ b x) m)))
+ (equal (mod (+ b x) m)
+ (+ b (mod x m))))
+ :hints (("Subgoal *1/8''" :use (linear-mod-3))))
+
+(defthmd modaux-2d
+ (implies (and (< x m) (< 0 x) (< 0 m)
+ (< (- m) b) (< b 0) (rationalp m)
+ (<= x (mod (+ b x) m))
+ (rationalp x) (rationalp b))
+ (equal (+ (- m) (mod (+ b x) m))
+ (+ b x)))
+ :hints (("Goal" :cases ((<= 0 (+ b x))))
+ ("Subgoal 2'" :use ((:instance modaux-1b
+ (x (+ b x)))))))
+
+(defthm mod-m-b
+ (implies (and (< 0 x) (< 0 b) (< 0 m)
+ (< x b) (< b m)
+ (natp x) (natp b) (natp m))
+ (equal (mod (+ (mod (- x) m) b) m)
+ (mod (- x) b))))
+
+
+;; =====================================================================
+;; addmod, submod
+;; =====================================================================
+
+(defun addmod (a b m base)
+ (let* ((s (mod (+ a b) base))
+ (s (if (< s a) (mod (- s m) base) s))
+ (s (if (>= s m) (mod (- s m) base) s)))
+ s))
+
+(defthmd addmod-correct
+ (implies (and (< 0 m) (< m base)
+ (< a m) (<= b m)
+ (natp m) (natp base)
+ (natp a) (natp b))
+ (equal (addmod a b m base)
+ (mod (+ a b) m)))
+ :hints (("Goal" :cases ((<= base (+ a b))))
+ ("Subgoal 2.1'" :use ((:instance elim-mod-m<x<2*m
+ (x (+ a b)))))))
+
+(defun submod (a b m base)
+ (let* ((d (mod (- a b) base))
+ (d (if (< a d) (mod (+ d m) base) d)))
+ d))
+
+(defthmd submod-aux1
+ (implies (and (< a (mod (+ a (- b)) base))
+ (< 0 base) (< a base) (<= b base)
+ (natp base) (natp a) (natp b))
+ (< a b))
+ :rule-classes :forward-chaining)
+
+(defthmd submod-aux2
+ (implies (and (<= (mod (+ a (- b)) base) a)
+ (< 0 base) (< a base) (< b base)
+ (natp base) (natp a) (natp b))
+ (<= b a))
+ :rule-classes :forward-chaining)
+
+(defthmd submod-correct
+ (implies (and (< 0 m) (< m base)
+ (< a m) (<= b m)
+ (natp m) (natp base)
+ (natp a) (natp b))
+ (equal (submod a b m base)
+ (mod (- a b) m)))
+ :hints (("Goal" :cases ((<= base (+ a b))))
+ ("Subgoal 2.2" :use ((:instance submod-aux1)))
+ ("Subgoal 2.2'''" :cases ((and (< 0 (+ a (- b) m))
+ (< (+ a (- b) m) m))))
+ ("Subgoal 2.1" :use ((:instance submod-aux2)))
+ ("Subgoal 1.2" :use ((:instance submod-aux1)))
+ ("Subgoal 1.1" :use ((:instance submod-aux2)))))
+
+
+(defun submod-2 (a b m base)
+ (let* ((d (mod (- a b) base))
+ (d (if (< a b) (mod (+ d m) base) d)))
+ d))
+
+(defthm submod-2-correct
+ (implies (and (< 0 m) (< m base)
+ (< a m) (<= b m)
+ (natp m) (natp base)
+ (natp a) (natp b))
+ (equal (submod-2 a b m base)
+ (mod (- a b) m)))
+ :hints (("Subgoal 2'" :cases ((and (< 0 (+ a (- b) m))
+ (< (+ a (- b) m) m))))))
+
+
+;; =========================================================================
+;; ext-submod is correct
+;; =========================================================================
+
+; a < 2*m, b < 2*m
+(defun ext-submod (a b m base)
+ (let* ((a (if (>= a m) (- a m) a))
+ (b (if (>= b m) (- b m) b))
+ (d (mod (- a b) base))
+ (d (if (< a b) (mod (+ d m) base) d)))
+ d))
+
+; a < 2*m, b < 2*m
+(defun ext-submod-2 (a b m base)
+ (let* ((a (mod a m))
+ (b (mod b m))
+ (d (mod (- a b) base))
+ (d (if (< a b) (mod (+ d m) base) d)))
+ d))
+
+(defthmd ext-submod-ext-submod-2-equal
+ (implies (and (< 0 m) (< m base)
+ (< a (* 2 m)) (< b (* 2 m))
+ (natp m) (natp base)
+ (natp a) (natp b))
+ (equal (ext-submod a b m base)
+ (ext-submod-2 a b m base))))
+
+(defthmd ext-submod-2-correct
+ (implies (and (< 0 m) (< m base)
+ (< a (* 2 m)) (< b (* 2 m))
+ (natp m) (natp base)
+ (natp a) (natp b))
+ (equal (ext-submod-2 a b m base)
+ (mod (- a b) m))))
+
+
+;; =========================================================================
+;; dw-reduce is correct
+;; =========================================================================
+
+(defun dw-reduce (hi lo m base)
+ (let* ((r1 (mod hi m))
+ (r2 (mod (+ (* r1 base) lo) m)))
+ r2))
+
+(defthmd dw-reduce-correct
+ (implies (and (< 0 m) (< m base)
+ (< hi base) (< lo base)
+ (natp m) (natp base)
+ (natp hi) (natp lo))
+ (equal (dw-reduce hi lo m base)
+ (mod (+ (* hi base) lo) m))))
+
+(defthmd <=-multiply-both-sides-by-z
+ (implies (and (rationalp x) (rationalp y)
+ (< 0 z) (rationalp z))
+ (equal (<= x y)
+ (<= (* z x) (* z y)))))
+
+(defthmd dw-reduce-aux1
+ (implies (and (< 0 m) (< m base)
+ (natp m) (natp base)
+ (< lo base) (natp lo)
+ (< x m) (natp x))
+ (< (+ lo (* base x)) (* base m)))
+ :hints (("Goal" :cases ((<= (+ x 1) m)))
+ ("Subgoal 1''" :cases ((<= (* base (+ x 1)) (* base m))))
+ ("subgoal 1.2" :use ((:instance <=-multiply-both-sides-by-z
+ (x (+ 1 x))
+ (y m)
+ (z base))))))
+
+(defthm dw-reduce-aux2
+ (implies (and (< x (* base m))
+ (< 0 m) (< m base)
+ (natp m) (natp base) (natp x))
+ (< (floor x m) base)))
+
+;; This is the necessary condition for using _mpd_div_words().
+(defthmd dw-reduce-second-quotient-fits-in-single-word
+ (implies (and (< 0 m) (< m base)
+ (< hi base) (< lo base)
+ (natp m) (natp base)
+ (natp hi) (natp lo)
+ (equal r1 (mod hi m)))
+ (< (floor (+ (* r1 base) lo) m)
+ base))
+ :hints (("Goal" :cases ((< r1 m)))
+ ("Subgoal 1''" :cases ((< (+ lo (* base (mod hi m))) (* base m))))
+ ("Subgoal 1.2" :use ((:instance dw-reduce-aux1
+ (x (mod hi m)))))))
+
+
+;; =========================================================================
+;; dw-submod is correct
+;; =========================================================================
+
+(defun dw-submod (a hi lo m base)
+ (let* ((r (dw-reduce hi lo m base))
+ (d (mod (- a r) base))
+ (d (if (< a r) (mod (+ d m) base) d)))
+ d))
+
+(defthmd dw-submod-aux1
+ (implies (and (natp a) (< 0 m) (natp m)
+ (natp x) (equal r (mod x m)))
+ (equal (mod (- a x) m)
+ (mod (- a r) m))))
+
+(defthmd dw-submod-correct
+ (implies (and (< 0 m) (< m base)
+ (natp a) (< a m)
+ (< hi base) (< lo base)
+ (natp m) (natp base)
+ (natp hi) (natp lo))
+ (equal (dw-submod a hi lo m base)
+ (mod (- a (+ (* base hi) lo)) m)))
+ :hints (("Goal" :in-theory (disable dw-reduce)
+ :use ((:instance dw-submod-aux1
+ (x (+ lo (* base hi)))
+ (r (dw-reduce hi lo m base)))
+ (:instance dw-reduce-correct)))))
+
+
+;; =========================================================================
+;; ANSI C arithmetic for uint64_t
+;; =========================================================================
+
+(defun add (a b)
+ (mod (+ a b)
+ (expt 2 64)))
+
+(defun sub (a b)
+ (mod (- a b)
+ (expt 2 64)))
+
+(defun << (w n)
+ (mod (* w (expt 2 n))
+ (expt 2 64)))
+
+(defun >> (w n)
+ (floor w (expt 2 n)))
+
+;; join upper and lower half of a double word, yielding a 128 bit number
+(defun join (hi lo)
+ (+ (* (expt 2 64) hi) lo))
+
+
+;; =============================================================================
+;; Fast modular reduction
+;; =============================================================================
+
+;; These are the three primes used in the Number Theoretic Transform.
+;; A fast modular reduction scheme exists for all of them.
+(defmacro p1 ()
+ (+ (expt 2 64) (- (expt 2 32)) 1))
+
+(defmacro p2 ()
+ (+ (expt 2 64) (- (expt 2 34)) 1))
+
+(defmacro p3 ()
+ (+ (expt 2 64) (- (expt 2 40)) 1))
+
+
+;; reduce the double word number hi*2**64 + lo (mod p1)
+(defun simple-mod-reduce-p1 (hi lo)
+ (+ (* (expt 2 32) hi) (- hi) lo))
+
+;; reduce the double word number hi*2**64 + lo (mod p2)
+(defun simple-mod-reduce-p2 (hi lo)
+ (+ (* (expt 2 34) hi) (- hi) lo))
+
+;; reduce the double word number hi*2**64 + lo (mod p3)
+(defun simple-mod-reduce-p3 (hi lo)
+ (+ (* (expt 2 40) hi) (- hi) lo))
+
+
+; ----------------------------------------------------------
+; The modular reductions given above are correct
+; ----------------------------------------------------------
+
+(defthmd congruence-p1-aux
+ (equal (* (expt 2 64) hi)
+ (+ (* (p1) hi)
+ (* (expt 2 32) hi)
+ (- hi))))
+
+(defthmd congruence-p2-aux
+ (equal (* (expt 2 64) hi)
+ (+ (* (p2) hi)
+ (* (expt 2 34) hi)
+ (- hi))))
+
+(defthmd congruence-p3-aux
+ (equal (* (expt 2 64) hi)
+ (+ (* (p3) hi)
+ (* (expt 2 40) hi)
+ (- hi))))
+
+(defthmd mod-augment
+ (implies (and (rationalp x)
+ (rationalp y)
+ (rationalp m))
+ (equal (mod (+ x y) m)
+ (mod (+ x (mod y m)) m))))
+
+(defthmd simple-mod-reduce-p1-congruent
+ (implies (and (integerp hi)
+ (integerp lo))
+ (equal (mod (simple-mod-reduce-p1 hi lo) (p1))
+ (mod (join hi lo) (p1))))
+ :hints (("Goal''" :use ((:instance congruence-p1-aux)
+ (:instance mod-augment
+ (m (p1))
+ (x (+ (- hi) lo (* (expt 2 32) hi)))
+ (y (* (p1) hi)))))))
+
+(defthmd simple-mod-reduce-p2-congruent
+ (implies (and (integerp hi)
+ (integerp lo))
+ (equal (mod (simple-mod-reduce-p2 hi lo) (p2))
+ (mod (join hi lo) (p2))))
+ :hints (("Goal''" :use ((:instance congruence-p2-aux)
+ (:instance mod-augment
+ (m (p2))
+ (x (+ (- hi) lo (* (expt 2 34) hi)))
+ (y (* (p2) hi)))))))
+
+(defthmd simple-mod-reduce-p3-congruent
+ (implies (and (integerp hi)
+ (integerp lo))
+ (equal (mod (simple-mod-reduce-p3 hi lo) (p3))
+ (mod (join hi lo) (p3))))
+ :hints (("Goal''" :use ((:instance congruence-p3-aux)
+ (:instance mod-augment
+ (m (p3))
+ (x (+ (- hi) lo (* (expt 2 40) hi)))
+ (y (* (p3) hi)))))))
+
+
+; ---------------------------------------------------------------------
+; We need a number less than 2*p, so that we can use the trick from
+; elim-mod-m<x<2*m for the final reduction.
+; For p1, two modular reductions are sufficient, for p2 and p3 three.
+; ---------------------------------------------------------------------
+
+;; p1: the first reduction is less than 2**96
+(defthmd simple-mod-reduce-p1-<-2**96
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p1 hi lo)
+ (expt 2 96))))
+
+;; p1: the second reduction is less than 2*p1
+(defthmd simple-mod-reduce-p1-<-2*p1
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (< (join hi lo) (expt 2 96))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p1 hi lo)
+ (* 2 (p1)))))
+
+
+;; p2: the first reduction is less than 2**98
+(defthmd simple-mod-reduce-p2-<-2**98
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p2 hi lo)
+ (expt 2 98))))
+
+;; p2: the second reduction is less than 2**69
+(defthmd simple-mod-reduce-p2-<-2*69
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (< (join hi lo) (expt 2 98))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p2 hi lo)
+ (expt 2 69))))
+
+;; p3: the third reduction is less than 2*p2
+(defthmd simple-mod-reduce-p2-<-2*p2
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (< (join hi lo) (expt 2 69))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p2 hi lo)
+ (* 2 (p2)))))
+
+
+;; p3: the first reduction is less than 2**104
+(defthmd simple-mod-reduce-p3-<-2**104
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p3 hi lo)
+ (expt 2 104))))
+
+;; p3: the second reduction is less than 2**81
+(defthmd simple-mod-reduce-p3-<-2**81
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (< (join hi lo) (expt 2 104))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p3 hi lo)
+ (expt 2 81))))
+
+;; p3: the third reduction is less than 2*p3
+(defthmd simple-mod-reduce-p3-<-2*p3
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (< (join hi lo) (expt 2 81))
+ (natp hi) (natp lo))
+ (< (simple-mod-reduce-p3 hi lo)
+ (* 2 (p3)))))
+
+
+; -------------------------------------------------------------------------
+; The simple modular reductions, adapted for compiler friendly C
+; -------------------------------------------------------------------------
+
+(defun mod-reduce-p1 (hi lo)
+ (let* ((y hi)
+ (x y)
+ (hi (>> hi 32))
+ (x (sub lo x))
+ (hi (if (> x lo) (+ hi -1) hi))
+ (y (<< y 32))
+ (lo (add y x))
+ (hi (if (< lo y) (+ hi 1) hi)))
+ (+ (* hi (expt 2 64)) lo)))
+
+(defun mod-reduce-p2 (hi lo)
+ (let* ((y hi)
+ (x y)
+ (hi (>> hi 30))
+ (x (sub lo x))
+ (hi (if (> x lo) (+ hi -1) hi))
+ (y (<< y 34))
+ (lo (add y x))
+ (hi (if (< lo y) (+ hi 1) hi)))
+ (+ (* hi (expt 2 64)) lo)))
+
+(defun mod-reduce-p3 (hi lo)
+ (let* ((y hi)
+ (x y)
+ (hi (>> hi 24))
+ (x (sub lo x))
+ (hi (if (> x lo) (+ hi -1) hi))
+ (y (<< y 40))
+ (lo (add y x))
+ (hi (if (< lo y) (+ hi 1) hi)))
+ (+ (* hi (expt 2 64)) lo)))
+
+
+; -------------------------------------------------------------------------
+; The compiler friendly versions are equal to the simple versions
+; -------------------------------------------------------------------------
+
+(defthm mod-reduce-aux1
+ (implies (and (<= 0 a) (natp a) (natp m)
+ (< (- m) b) (<= b 0)
+ (integerp b)
+ (< (mod (+ b a) m)
+ (mod a m)))
+ (equal (mod (+ b a) m)
+ (+ b (mod a m))))
+ :hints (("Subgoal 2" :use ((:instance modaux-1b
+ (x (+ a b)))))))
+
+(defthm mod-reduce-aux2
+ (implies (and (<= 0 a) (natp a) (natp m)
+ (< b m) (natp b)
+ (< (mod (+ b a) m)
+ (mod a m)))
+ (equal (+ m (mod (+ b a) m))
+ (+ b (mod a m)))))
+
+
+(defthm mod-reduce-aux3
+ (implies (and (< 0 a) (natp a) (natp m)
+ (< (- m) b) (< b 0)
+ (integerp b)
+ (<= (mod a m)
+ (mod (+ b a) m)))
+ (equal (+ (- m) (mod (+ b a) m))
+ (+ b (mod a m))))
+ :hints (("Subgoal 1.2'" :use ((:instance modaux-1b
+ (x b))))
+ ("Subgoal 1''" :use ((:instance modaux-2d
+ (x I))))))
+
+
+(defthm mod-reduce-aux4
+ (implies (and (< 0 a) (natp a) (natp m)
+ (< b m) (natp b)
+ (<= (mod a m)
+ (mod (+ b a) m)))
+ (equal (mod (+ b a) m)
+ (+ b (mod a m)))))
+
+
+(defthm mod-reduce-p1==simple-mod-reduce-p1
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (equal (mod-reduce-p1 hi lo)
+ (simple-mod-reduce-p1 hi lo)))
+ :hints (("Goal" :in-theory (disable expt)
+ :cases ((< 0 hi)))
+ ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 32) hi)))))
+ ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 32) hi)))))
+ ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 32) hi)))))
+ ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 32) hi)))))))
+
+
+(defthm mod-reduce-p2==simple-mod-reduce-p2
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (equal (mod-reduce-p2 hi lo)
+ (simple-mod-reduce-p2 hi lo)))
+ :hints (("Goal" :cases ((< 0 hi)))
+ ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 34) hi)))))
+ ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 34) hi)))))
+ ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 34) hi)))))
+ ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 34) hi)))))))
+
+
+(defthm mod-reduce-p3==simple-mod-reduce-p3
+ (implies (and (< hi (expt 2 64))
+ (< lo (expt 2 64))
+ (natp hi) (natp lo))
+ (equal (mod-reduce-p3 hi lo)
+ (simple-mod-reduce-p3 hi lo)))
+ :hints (("Goal" :cases ((< 0 hi)))
+ ("Subgoal 1.2.2'" :use ((:instance mod-reduce-aux1
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 40) hi)))))
+ ("Subgoal 1.2.1'" :use ((:instance mod-reduce-aux3
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 40) hi)))))
+ ("Subgoal 1.1.2'" :use ((:instance mod-reduce-aux2
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 40) hi)))))
+ ("Subgoal 1.1.1'" :use ((:instance mod-reduce-aux4
+ (m (expt 2 64))
+ (b (+ (- HI) LO))
+ (a (* (expt 2 40) hi)))))))
+
+
+
diff --git a/Modules/_decimal/libmpdec/memory.c b/Modules/_decimal/libmpdec/memory.c
new file mode 100644
index 0000000..bf6350f
--- /dev/null
+++ b/Modules/_decimal/libmpdec/memory.c
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "typearith.h"
+#include "memory.h"
+
+
+/* Guaranteed minimum allocation for a coefficient. May be changed once
+ at program start using mpd_setminalloc(). */
+mpd_ssize_t MPD_MINALLOC = MPD_MINALLOC_MIN;
+
+/* Custom allocation and free functions */
+void *(* mpd_mallocfunc)(size_t size) = malloc;
+void *(* mpd_reallocfunc)(void *ptr, size_t size) = realloc;
+void *(* mpd_callocfunc)(size_t nmemb, size_t size) = calloc;
+void (* mpd_free)(void *ptr) = free;
+
+
+/* emulate calloc if it is not available */
+void *
+mpd_callocfunc_em(size_t nmemb, size_t size)
+{
+ void *ptr;
+ size_t req;
+ mpd_size_t overflow;
+
+#if MPD_SIZE_MAX < SIZE_MAX
+ /* full_coverage test only */
+ if (nmemb > MPD_SIZE_MAX || size > MPD_SIZE_MAX) {
+ return NULL;
+ }
+#endif
+
+ req = mul_size_t_overflow((mpd_size_t)nmemb, (mpd_size_t)size,
+ &overflow);
+ if (overflow) {
+ return NULL;
+ }
+
+ ptr = mpd_mallocfunc(req);
+ if (ptr == NULL) {
+ return NULL;
+ }
+ /* used on uint32_t or uint64_t */
+ memset(ptr, 0, req);
+
+ return ptr;
+}
+
+
+/* malloc with overflow checking */
+void *
+mpd_alloc(mpd_size_t nmemb, mpd_size_t size)
+{
+ mpd_size_t req, overflow;
+
+ req = mul_size_t_overflow(nmemb, size, &overflow);
+ if (overflow) {
+ return NULL;
+ }
+
+ return mpd_mallocfunc(req);
+}
+
+/* calloc with overflow checking */
+void *
+mpd_calloc(mpd_size_t nmemb, mpd_size_t size)
+{
+ mpd_size_t overflow;
+
+ (void)mul_size_t_overflow(nmemb, size, &overflow);
+ if (overflow) {
+ return NULL;
+ }
+
+ return mpd_callocfunc(nmemb, size);
+}
+
+/* realloc with overflow checking */
+void *
+mpd_realloc(void *ptr, mpd_size_t nmemb, mpd_size_t size, uint8_t *err)
+{
+ void *new;
+ mpd_size_t req, overflow;
+
+ req = mul_size_t_overflow(nmemb, size, &overflow);
+ if (overflow) {
+ *err = 1;
+ return ptr;
+ }
+
+ new = mpd_reallocfunc(ptr, req);
+ if (new == NULL) {
+ *err = 1;
+ return ptr;
+ }
+
+ return new;
+}
+
+/* struct hack malloc with overflow checking */
+void *
+mpd_sh_alloc(mpd_size_t struct_size, mpd_size_t nmemb, mpd_size_t size)
+{
+ mpd_size_t req, overflow;
+
+ req = mul_size_t_overflow(nmemb, size, &overflow);
+ if (overflow) {
+ return NULL;
+ }
+
+ req = add_size_t_overflow(req, struct_size, &overflow);
+ if (overflow) {
+ return NULL;
+ }
+
+ return mpd_mallocfunc(req);
+}
+
+
+/* Allocate a new decimal with a coefficient of length 'nwords'. In case
+ of an error the return value is NULL. */
+mpd_t *
+mpd_qnew_size(mpd_ssize_t nwords)
+{
+ mpd_t *result;
+
+ nwords = (nwords < MPD_MINALLOC) ? MPD_MINALLOC : nwords;
+
+ result = mpd_alloc(1, sizeof *result);
+ if (result == NULL) {
+ return NULL;
+ }
+
+ result->data = mpd_alloc(nwords, sizeof *result->data);
+ if (result->data == NULL) {
+ mpd_free(result);
+ return NULL;
+ }
+
+ result->flags = 0;
+ result->exp = 0;
+ result->digits = 0;
+ result->len = 0;
+ result->alloc = nwords;
+
+ return result;
+}
+
+/* Allocate a new decimal with a coefficient of length MPD_MINALLOC.
+ In case of an error the return value is NULL. */
+mpd_t *
+mpd_qnew(void)
+{
+ return mpd_qnew_size(MPD_MINALLOC);
+}
+
+/* Allocate new decimal. Caller can check for NULL or MPD_Malloc_error.
+ Raises on error. */
+mpd_t *
+mpd_new(mpd_context_t *ctx)
+{
+ mpd_t *result;
+
+ result = mpd_qnew();
+ if (result == NULL) {
+ mpd_addstatus_raise(ctx, MPD_Malloc_error);
+ }
+ return result;
+}
+
+/*
+ * Input: 'result' is a static mpd_t with a static coefficient.
+ * Assumption: 'nwords' >= result->alloc.
+ *
+ * Resize the static coefficient to a larger dynamic one and copy the
+ * existing data. If successful, the value of 'result' is unchanged.
+ * Otherwise, set 'result' to NaN and update 'status' with MPD_Malloc_error.
+ */
+int
+mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status)
+{
+ mpd_uint_t *p = result->data;
+
+ assert(nwords >= result->alloc);
+
+ result->data = mpd_alloc(nwords, sizeof *result->data);
+ if (result->data == NULL) {
+ result->data = p;
+ mpd_set_qnan(result);
+ mpd_set_positive(result);
+ result->exp = result->digits = result->len = 0;
+ *status |= MPD_Malloc_error;
+ return 0;
+ }
+
+ memcpy(result->data, p, result->alloc * (sizeof *result->data));
+ result->alloc = nwords;
+ mpd_set_dynamic_data(result);
+ return 1;
+}
+
+/*
+ * Input: 'result' is a static mpd_t with a static coefficient.
+ *
+ * Convert the coefficient to a dynamic one that is initialized to zero. If
+ * malloc fails, set 'result' to NaN and update 'status' with MPD_Malloc_error.
+ */
+int
+mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t nwords, uint32_t *status)
+{
+ mpd_uint_t *p = result->data;
+
+ result->data = mpd_calloc(nwords, sizeof *result->data);
+ if (result->data == NULL) {
+ result->data = p;
+ mpd_set_qnan(result);
+ mpd_set_positive(result);
+ result->exp = result->digits = result->len = 0;
+ *status |= MPD_Malloc_error;
+ return 0;
+ }
+
+ result->alloc = nwords;
+ mpd_set_dynamic_data(result);
+
+ return 1;
+}
+
+/*
+ * Input: 'result' is a static or a dynamic mpd_t with a dynamic coefficient.
+ * Resize the coefficient to length 'nwords':
+ * Case nwords > result->alloc:
+ * If realloc is successful:
+ * 'result' has a larger coefficient but the same value. Return 1.
+ * Otherwise:
+ * Set 'result' to NaN, update status with MPD_Malloc_error and return 0.
+ * Case nwords < result->alloc:
+ * If realloc is successful:
+ * 'result' has a smaller coefficient. result->len is undefined. Return 1.
+ * Otherwise (unlikely):
+ * 'result' is unchanged. Reuse the now oversized coefficient. Return 1.
+ */
+int
+mpd_realloc_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status)
+{
+ uint8_t err = 0;
+
+ result->data = mpd_realloc(result->data, nwords, sizeof *result->data, &err);
+ if (!err) {
+ result->alloc = nwords;
+ }
+ else if (nwords > result->alloc) {
+ mpd_set_qnan(result);
+ mpd_set_positive(result);
+ result->exp = result->digits = result->len = 0;
+ *status |= MPD_Malloc_error;
+ return 0;
+ }
+
+ return 1;
+}
+
+
diff --git a/Modules/_decimal/libmpdec/memory.h b/Modules/_decimal/libmpdec/memory.h
new file mode 100644
index 0000000..b3a4a56
--- /dev/null
+++ b/Modules/_decimal/libmpdec/memory.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef MEMORY_H
+#define MEMORY_H
+
+
+#include "mpdecimal.h"
+
+
+int mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status);
+int mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t size, uint32_t *status);
+int mpd_realloc_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status);
+
+
+#endif
+
+
+
diff --git a/Modules/_decimal/libmpdec/mpdecimal.c b/Modules/_decimal/libmpdec/mpdecimal.c
new file mode 100644
index 0000000..05f7628
--- /dev/null
+++ b/Modules/_decimal/libmpdec/mpdecimal.c
@@ -0,0 +1,8149 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <math.h>
+#include "basearith.h"
+#include "bits.h"
+#include "convolute.h"
+#include "crt.h"
+#include "memory.h"
+#include "typearith.h"
+#include "umodarith.h"
+
+#ifdef PPRO
+ #if defined(_MSC_VER)
+ #include <float.h>
+ #pragma fenv_access(on)
+ #elif !defined(__OpenBSD__) && !defined(__NetBSD__)
+ /* C99 */
+ #include <fenv.h>
+ #pragma STDC FENV_ACCESS ON
+ #endif
+#endif
+
+
+#if defined(_MSC_VER)
+ #define ALWAYS_INLINE __forceinline
+#elif defined(LEGACY_COMPILER)
+ #define ALWAYS_INLINE
+ #undef inline
+ #define inline
+#else
+ #ifdef TEST_COVERAGE
+ #define ALWAYS_INLINE
+ #else
+ #define ALWAYS_INLINE inline __attribute__ ((always_inline))
+ #endif
+#endif
+
+
+#define MPD_NEWTONDIV_CUTOFF 1024L
+
+#define MPD_NEW_STATIC(name, flags, exp, digits, len) \
+ mpd_uint_t name##_data[MPD_MINALLOC_MAX]; \
+ mpd_t name = {flags|MPD_STATIC|MPD_STATIC_DATA, exp, digits, \
+ len, MPD_MINALLOC_MAX, name##_data}
+
+#define MPD_NEW_CONST(name, flags, exp, digits, len, alloc, initval) \
+ mpd_uint_t name##_data[alloc] = {initval}; \
+ mpd_t name = {flags|MPD_STATIC|MPD_CONST_DATA, exp, digits, \
+ len, alloc, name##_data}
+
+#define MPD_NEW_SHARED(name, a) \
+ mpd_t name = {(a->flags&~MPD_DATAFLAGS)|MPD_STATIC|MPD_SHARED_DATA, \
+ a->exp, a->digits, a->len, a->alloc, a->data}
+
+
+static mpd_uint_t data_one[1] = {1};
+static mpd_uint_t data_zero[1] = {0};
+static const mpd_t one = {MPD_STATIC|MPD_CONST_DATA, 0, 1, 1, 1, data_one};
+static const mpd_t minus_one = {MPD_NEG|MPD_STATIC|MPD_CONST_DATA, 0, 1, 1, 1,
+ data_one};
+static const mpd_t zero = {MPD_STATIC|MPD_CONST_DATA, 0, 1, 1, 1, data_zero};
+
+static inline void _mpd_check_exp(mpd_t *dec, const mpd_context_t *ctx,
+ uint32_t *status);
+static void _settriple(mpd_t *result, uint8_t sign, mpd_uint_t a,
+ mpd_ssize_t exp);
+static inline mpd_ssize_t _mpd_real_size(mpd_uint_t *data, mpd_ssize_t size);
+
+static void _mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status);
+static inline void _mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status);
+static void _mpd_base_ndivmod(mpd_t *q, mpd_t *r, const mpd_t *a,
+ const mpd_t *b, uint32_t *status);
+static inline void _mpd_qpow_uint(mpd_t *result, const mpd_t *base,
+ mpd_uint_t exp, uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status);
+
+mpd_uint_t mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n);
+
+
+/******************************************************************************/
+/* Performance critical inline functions */
+/******************************************************************************/
+
+#ifdef CONFIG_64
+/* Digits in a word, primarily useful for the most significant word. */
+ALWAYS_INLINE int
+mpd_word_digits(mpd_uint_t word)
+{
+ if (word < mpd_pow10[9]) {
+ if (word < mpd_pow10[4]) {
+ if (word < mpd_pow10[2]) {
+ return (word < mpd_pow10[1]) ? 1 : 2;
+ }
+ return (word < mpd_pow10[3]) ? 3 : 4;
+ }
+ if (word < mpd_pow10[6]) {
+ return (word < mpd_pow10[5]) ? 5 : 6;
+ }
+ if (word < mpd_pow10[8]) {
+ return (word < mpd_pow10[7]) ? 7 : 8;
+ }
+ return 9;
+ }
+ if (word < mpd_pow10[14]) {
+ if (word < mpd_pow10[11]) {
+ return (word < mpd_pow10[10]) ? 10 : 11;
+ }
+ if (word < mpd_pow10[13]) {
+ return (word < mpd_pow10[12]) ? 12 : 13;
+ }
+ return 14;
+ }
+ if (word < mpd_pow10[18]) {
+ if (word < mpd_pow10[16]) {
+ return (word < mpd_pow10[15]) ? 15 : 16;
+ }
+ return (word < mpd_pow10[17]) ? 17 : 18;
+ }
+
+ return (word < mpd_pow10[19]) ? 19 : 20;
+}
+#else
+ALWAYS_INLINE int
+mpd_word_digits(mpd_uint_t word)
+{
+ if (word < mpd_pow10[4]) {
+ if (word < mpd_pow10[2]) {
+ return (word < mpd_pow10[1]) ? 1 : 2;
+ }
+ return (word < mpd_pow10[3]) ? 3 : 4;
+ }
+ if (word < mpd_pow10[6]) {
+ return (word < mpd_pow10[5]) ? 5 : 6;
+ }
+ if (word < mpd_pow10[8]) {
+ return (word < mpd_pow10[7]) ? 7 : 8;
+ }
+
+ return (word < mpd_pow10[9]) ? 9 : 10;
+}
+#endif
+
+
+/* Adjusted exponent */
+ALWAYS_INLINE mpd_ssize_t
+mpd_adjexp(const mpd_t *dec)
+{
+ return (dec->exp + dec->digits) - 1;
+}
+
+/* Etiny */
+ALWAYS_INLINE mpd_ssize_t
+mpd_etiny(const mpd_context_t *ctx)
+{
+ return ctx->emin - (ctx->prec - 1);
+}
+
+/* Etop: used for folding down in IEEE clamping */
+ALWAYS_INLINE mpd_ssize_t
+mpd_etop(const mpd_context_t *ctx)
+{
+ return ctx->emax - (ctx->prec - 1);
+}
+
+/* Most significant word */
+ALWAYS_INLINE mpd_uint_t
+mpd_msword(const mpd_t *dec)
+{
+ assert(dec->len > 0);
+ return dec->data[dec->len-1];
+}
+
+/* Most significant digit of a word */
+inline mpd_uint_t
+mpd_msd(mpd_uint_t word)
+{
+ int n;
+
+ n = mpd_word_digits(word);
+ return word / mpd_pow10[n-1];
+}
+
+/* Least significant digit of a word */
+ALWAYS_INLINE mpd_uint_t
+mpd_lsd(mpd_uint_t word)
+{
+ return word % 10;
+}
+
+/* Coefficient size needed to store 'digits' */
+ALWAYS_INLINE mpd_ssize_t
+mpd_digits_to_size(mpd_ssize_t digits)
+{
+ mpd_ssize_t q, r;
+
+ _mpd_idiv_word(&q, &r, digits, MPD_RDIGITS);
+ return (r == 0) ? q : q+1;
+}
+
+/* Number of digits in the exponent. Not defined for MPD_SSIZE_MIN. */
+inline int
+mpd_exp_digits(mpd_ssize_t exp)
+{
+ exp = (exp < 0) ? -exp : exp;
+ return mpd_word_digits(exp);
+}
+
+/* Canonical */
+ALWAYS_INLINE int
+mpd_iscanonical(const mpd_t *dec UNUSED)
+{
+ return 1;
+}
+
+/* Finite */
+ALWAYS_INLINE int
+mpd_isfinite(const mpd_t *dec)
+{
+ return !(dec->flags & MPD_SPECIAL);
+}
+
+/* Infinite */
+ALWAYS_INLINE int
+mpd_isinfinite(const mpd_t *dec)
+{
+ return dec->flags & MPD_INF;
+}
+
+/* NaN */
+ALWAYS_INLINE int
+mpd_isnan(const mpd_t *dec)
+{
+ return dec->flags & (MPD_NAN|MPD_SNAN);
+}
+
+/* Negative */
+ALWAYS_INLINE int
+mpd_isnegative(const mpd_t *dec)
+{
+ return dec->flags & MPD_NEG;
+}
+
+/* Positive */
+ALWAYS_INLINE int
+mpd_ispositive(const mpd_t *dec)
+{
+ return !(dec->flags & MPD_NEG);
+}
+
+/* qNaN */
+ALWAYS_INLINE int
+mpd_isqnan(const mpd_t *dec)
+{
+ return dec->flags & MPD_NAN;
+}
+
+/* Signed */
+ALWAYS_INLINE int
+mpd_issigned(const mpd_t *dec)
+{
+ return dec->flags & MPD_NEG;
+}
+
+/* sNaN */
+ALWAYS_INLINE int
+mpd_issnan(const mpd_t *dec)
+{
+ return dec->flags & MPD_SNAN;
+}
+
+/* Special */
+ALWAYS_INLINE int
+mpd_isspecial(const mpd_t *dec)
+{
+ return dec->flags & MPD_SPECIAL;
+}
+
+/* Zero */
+ALWAYS_INLINE int
+mpd_iszero(const mpd_t *dec)
+{
+ return !mpd_isspecial(dec) && mpd_msword(dec) == 0;
+}
+
+/* Test for zero when specials have been ruled out already */
+ALWAYS_INLINE int
+mpd_iszerocoeff(const mpd_t *dec)
+{
+ return mpd_msword(dec) == 0;
+}
+
+/* Normal */
+inline int
+mpd_isnormal(const mpd_t *dec, const mpd_context_t *ctx)
+{
+ if (mpd_isspecial(dec)) return 0;
+ if (mpd_iszerocoeff(dec)) return 0;
+
+ return mpd_adjexp(dec) >= ctx->emin;
+}
+
+/* Subnormal */
+inline int
+mpd_issubnormal(const mpd_t *dec, const mpd_context_t *ctx)
+{
+ if (mpd_isspecial(dec)) return 0;
+ if (mpd_iszerocoeff(dec)) return 0;
+
+ return mpd_adjexp(dec) < ctx->emin;
+}
+
+/* Odd word */
+ALWAYS_INLINE int
+mpd_isoddword(mpd_uint_t word)
+{
+ return word & 1;
+}
+
+/* Odd coefficient */
+ALWAYS_INLINE int
+mpd_isoddcoeff(const mpd_t *dec)
+{
+ return mpd_isoddword(dec->data[0]);
+}
+
+/* 0 if dec is positive, 1 if dec is negative */
+ALWAYS_INLINE uint8_t
+mpd_sign(const mpd_t *dec)
+{
+ return dec->flags & MPD_NEG;
+}
+
+/* 1 if dec is positive, -1 if dec is negative */
+ALWAYS_INLINE int
+mpd_arith_sign(const mpd_t *dec)
+{
+ return 1 - 2 * mpd_isnegative(dec);
+}
+
+/* Radix */
+ALWAYS_INLINE long
+mpd_radix(void)
+{
+ return 10;
+}
+
+/* Dynamic decimal */
+ALWAYS_INLINE int
+mpd_isdynamic(mpd_t *dec)
+{
+ return !(dec->flags & MPD_STATIC);
+}
+
+/* Static decimal */
+ALWAYS_INLINE int
+mpd_isstatic(mpd_t *dec)
+{
+ return dec->flags & MPD_STATIC;
+}
+
+/* Data of decimal is dynamic */
+ALWAYS_INLINE int
+mpd_isdynamic_data(mpd_t *dec)
+{
+ return !(dec->flags & MPD_DATAFLAGS);
+}
+
+/* Data of decimal is static */
+ALWAYS_INLINE int
+mpd_isstatic_data(mpd_t *dec)
+{
+ return dec->flags & MPD_STATIC_DATA;
+}
+
+/* Data of decimal is shared */
+ALWAYS_INLINE int
+mpd_isshared_data(mpd_t *dec)
+{
+ return dec->flags & MPD_SHARED_DATA;
+}
+
+/* Data of decimal is const */
+ALWAYS_INLINE int
+mpd_isconst_data(mpd_t *dec)
+{
+ return dec->flags & MPD_CONST_DATA;
+}
+
+
+/******************************************************************************/
+/* Inline memory handling */
+/******************************************************************************/
+
+/* Fill destination with zeros */
+ALWAYS_INLINE void
+mpd_uint_zero(mpd_uint_t *dest, mpd_size_t len)
+{
+ mpd_size_t i;
+
+ for (i = 0; i < len; i++) {
+ dest[i] = 0;
+ }
+}
+
+/* Free a decimal */
+ALWAYS_INLINE void
+mpd_del(mpd_t *dec)
+{
+ if (mpd_isdynamic_data(dec)) {
+ mpd_free(dec->data);
+ }
+ if (mpd_isdynamic(dec)) {
+ mpd_free(dec);
+ }
+}
+
+/*
+ * Resize the coefficient. Existing data up to 'nwords' is left untouched.
+ * Return 1 on success, 0 otherwise.
+ *
+ * Input invariant: MPD_MINALLOC <= result->alloc.
+ *
+ * Case nwords == result->alloc:
+ * 'result' is unchanged. Return 1.
+ *
+ * Case nwords > result->alloc:
+ * Case realloc success:
+ * The value of 'result' does not change. Return 1.
+ * Case realloc failure:
+ * 'result' is NaN, status is updated with MPD_Malloc_error. Return 0.
+ *
+ * Case nwords < result->alloc:
+ * Case is_static_data or realloc failure [1]:
+ * 'result' is unchanged. Return 1.
+ * Case realloc success:
+ * The value of result is undefined (expected). Return 1.
+ *
+ *
+ * [1] In that case the old (now oversized) area is still valid.
+ */
+ALWAYS_INLINE int
+mpd_qresize(mpd_t *result, mpd_ssize_t nwords, uint32_t *status)
+{
+ assert(!mpd_isconst_data(result)); /* illegal operation for a const */
+ assert(!mpd_isshared_data(result)); /* illegal operation for a shared */
+ assert(MPD_MINALLOC <= result->alloc);
+
+ nwords = (nwords <= MPD_MINALLOC) ? MPD_MINALLOC : nwords;
+ if (nwords == result->alloc) {
+ return 1;
+ }
+ if (mpd_isstatic_data(result)) {
+ if (nwords > result->alloc) {
+ return mpd_switch_to_dyn(result, nwords, status);
+ }
+ return 1;
+ }
+
+ return mpd_realloc_dyn(result, nwords, status);
+}
+
+/* Same as mpd_qresize, but the complete coefficient (including the old
+ * memory area!) is initialized to zero. */
+ALWAYS_INLINE int
+mpd_qresize_zero(mpd_t *result, mpd_ssize_t nwords, uint32_t *status)
+{
+ assert(!mpd_isconst_data(result)); /* illegal operation for a const */
+ assert(!mpd_isshared_data(result)); /* illegal operation for a shared */
+ assert(MPD_MINALLOC <= result->alloc);
+
+ nwords = (nwords <= MPD_MINALLOC) ? MPD_MINALLOC : nwords;
+ if (nwords != result->alloc) {
+ if (mpd_isstatic_data(result)) {
+ if (nwords > result->alloc) {
+ return mpd_switch_to_dyn_zero(result, nwords, status);
+ }
+ }
+ else if (!mpd_realloc_dyn(result, nwords, status)) {
+ return 0;
+ }
+ }
+
+ mpd_uint_zero(result->data, nwords);
+ return 1;
+}
+
+/*
+ * Reduce memory size for the coefficient to MPD_MINALLOC. In theory,
+ * realloc may fail even when reducing the memory size. But in that case
+ * the old memory area is always big enough, so checking for MPD_Malloc_error
+ * is not imperative.
+ */
+ALWAYS_INLINE void
+mpd_minalloc(mpd_t *result)
+{
+ assert(!mpd_isconst_data(result)); /* illegal operation for a const */
+ assert(!mpd_isshared_data(result)); /* illegal operation for a shared */
+
+ if (!mpd_isstatic_data(result) && result->alloc > MPD_MINALLOC) {
+ uint8_t err = 0;
+ result->data = mpd_realloc(result->data, MPD_MINALLOC,
+ sizeof *result->data, &err);
+ if (!err) {
+ result->alloc = MPD_MINALLOC;
+ }
+ }
+}
+
+int
+mpd_resize(mpd_t *result, mpd_ssize_t nwords, mpd_context_t *ctx)
+{
+ uint32_t status = 0;
+ if (!mpd_qresize(result, nwords, &status)) {
+ mpd_addstatus_raise(ctx, status);
+ return 0;
+ }
+ return 1;
+}
+
+int
+mpd_resize_zero(mpd_t *result, mpd_ssize_t nwords, mpd_context_t *ctx)
+{
+ uint32_t status = 0;
+ if (!mpd_qresize_zero(result, nwords, &status)) {
+ mpd_addstatus_raise(ctx, status);
+ return 0;
+ }
+ return 1;
+}
+
+
+/******************************************************************************/
+/* Set attributes of a decimal */
+/******************************************************************************/
+
+/* Set digits. Assumption: result->len is initialized and > 0. */
+inline void
+mpd_setdigits(mpd_t *result)
+{
+ mpd_ssize_t wdigits = mpd_word_digits(mpd_msword(result));
+ result->digits = wdigits + (result->len-1) * MPD_RDIGITS;
+}
+
+/* Set sign */
+ALWAYS_INLINE void
+mpd_set_sign(mpd_t *result, uint8_t sign)
+{
+ result->flags &= ~MPD_NEG;
+ result->flags |= sign;
+}
+
+/* Copy sign from another decimal */
+ALWAYS_INLINE void
+mpd_signcpy(mpd_t *result, mpd_t *a)
+{
+ uint8_t sign = a->flags&MPD_NEG;
+
+ result->flags &= ~MPD_NEG;
+ result->flags |= sign;
+}
+
+/* Set infinity */
+ALWAYS_INLINE void
+mpd_set_infinity(mpd_t *result)
+{
+ result->flags &= ~MPD_SPECIAL;
+ result->flags |= MPD_INF;
+}
+
+/* Set qNaN */
+ALWAYS_INLINE void
+mpd_set_qnan(mpd_t *result)
+{
+ result->flags &= ~MPD_SPECIAL;
+ result->flags |= MPD_NAN;
+}
+
+/* Set sNaN */
+ALWAYS_INLINE void
+mpd_set_snan(mpd_t *result)
+{
+ result->flags &= ~MPD_SPECIAL;
+ result->flags |= MPD_SNAN;
+}
+
+/* Set to negative */
+ALWAYS_INLINE void
+mpd_set_negative(mpd_t *result)
+{
+ result->flags |= MPD_NEG;
+}
+
+/* Set to positive */
+ALWAYS_INLINE void
+mpd_set_positive(mpd_t *result)
+{
+ result->flags &= ~MPD_NEG;
+}
+
+/* Set to dynamic */
+ALWAYS_INLINE void
+mpd_set_dynamic(mpd_t *result)
+{
+ result->flags &= ~MPD_STATIC;
+}
+
+/* Set to static */
+ALWAYS_INLINE void
+mpd_set_static(mpd_t *result)
+{
+ result->flags |= MPD_STATIC;
+}
+
+/* Set data to dynamic */
+ALWAYS_INLINE void
+mpd_set_dynamic_data(mpd_t *result)
+{
+ result->flags &= ~MPD_DATAFLAGS;
+}
+
+/* Set data to static */
+ALWAYS_INLINE void
+mpd_set_static_data(mpd_t *result)
+{
+ result->flags &= ~MPD_DATAFLAGS;
+ result->flags |= MPD_STATIC_DATA;
+}
+
+/* Set data to shared */
+ALWAYS_INLINE void
+mpd_set_shared_data(mpd_t *result)
+{
+ result->flags &= ~MPD_DATAFLAGS;
+ result->flags |= MPD_SHARED_DATA;
+}
+
+/* Set data to const */
+ALWAYS_INLINE void
+mpd_set_const_data(mpd_t *result)
+{
+ result->flags &= ~MPD_DATAFLAGS;
+ result->flags |= MPD_CONST_DATA;
+}
+
+/* Clear flags, preserving memory attributes. */
+ALWAYS_INLINE void
+mpd_clear_flags(mpd_t *result)
+{
+ result->flags &= (MPD_STATIC|MPD_DATAFLAGS);
+}
+
+/* Set flags, preserving memory attributes. */
+ALWAYS_INLINE void
+mpd_set_flags(mpd_t *result, uint8_t flags)
+{
+ result->flags &= (MPD_STATIC|MPD_DATAFLAGS);
+ result->flags |= flags;
+}
+
+/* Copy flags, preserving memory attributes of result. */
+ALWAYS_INLINE void
+mpd_copy_flags(mpd_t *result, const mpd_t *a)
+{
+ uint8_t aflags = a->flags;
+ result->flags &= (MPD_STATIC|MPD_DATAFLAGS);
+ result->flags |= (aflags & ~(MPD_STATIC|MPD_DATAFLAGS));
+}
+
+/* Initialize a workcontext from ctx. Set traps, flags and newtrap to 0. */
+static inline void
+mpd_workcontext(mpd_context_t *workctx, const mpd_context_t *ctx)
+{
+ workctx->prec = ctx->prec;
+ workctx->emax = ctx->emax;
+ workctx->emin = ctx->emin;
+ workctx->round = ctx->round;
+ workctx->traps = 0;
+ workctx->status = 0;
+ workctx->newtrap = 0;
+ workctx->clamp = ctx->clamp;
+ workctx->allcr = ctx->allcr;
+}
+
+
+/******************************************************************************/
+/* Getting and setting parts of decimals */
+/******************************************************************************/
+
+/* Flip the sign of a decimal */
+static inline void
+_mpd_negate(mpd_t *dec)
+{
+ dec->flags ^= MPD_NEG;
+}
+
+/* Set coefficient to zero */
+void
+mpd_zerocoeff(mpd_t *result)
+{
+ mpd_minalloc(result);
+ result->digits = 1;
+ result->len = 1;
+ result->data[0] = 0;
+}
+
+/* Set the coefficient to all nines. */
+void
+mpd_qmaxcoeff(mpd_t *result, const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t len, r;
+
+ _mpd_idiv_word(&len, &r, ctx->prec, MPD_RDIGITS);
+ len = (r == 0) ? len : len+1;
+
+ if (!mpd_qresize(result, len, status)) {
+ return;
+ }
+
+ result->len = len;
+ result->digits = ctx->prec;
+
+ --len;
+ if (r > 0) {
+ result->data[len--] = mpd_pow10[r]-1;
+ }
+ for (; len >= 0; --len) {
+ result->data[len] = MPD_RADIX-1;
+ }
+}
+
+/*
+ * Cut off the most significant digits so that the rest fits in ctx->prec.
+ * Cannot fail.
+ */
+static void
+_mpd_cap(mpd_t *result, const mpd_context_t *ctx)
+{
+ uint32_t dummy;
+ mpd_ssize_t len, r;
+
+ if (result->len > 0 && result->digits > ctx->prec) {
+ _mpd_idiv_word(&len, &r, ctx->prec, MPD_RDIGITS);
+ len = (r == 0) ? len : len+1;
+
+ if (r != 0) {
+ result->data[len-1] %= mpd_pow10[r];
+ }
+
+ len = _mpd_real_size(result->data, len);
+ /* resize to fewer words cannot fail */
+ mpd_qresize(result, len, &dummy);
+ result->len = len;
+ mpd_setdigits(result);
+ }
+ if (mpd_iszero(result)) {
+ _settriple(result, mpd_sign(result), 0, result->exp);
+ }
+}
+
+/*
+ * Cut off the most significant digits of a NaN payload so that the rest
+ * fits in ctx->prec - ctx->clamp. Cannot fail.
+ */
+static void
+_mpd_fix_nan(mpd_t *result, const mpd_context_t *ctx)
+{
+ uint32_t dummy;
+ mpd_ssize_t prec;
+ mpd_ssize_t len, r;
+
+ prec = ctx->prec - ctx->clamp;
+ if (result->len > 0 && result->digits > prec) {
+ if (prec == 0) {
+ mpd_minalloc(result);
+ result->len = result->digits = 0;
+ }
+ else {
+ _mpd_idiv_word(&len, &r, prec, MPD_RDIGITS);
+ len = (r == 0) ? len : len+1;
+
+ if (r != 0) {
+ result->data[len-1] %= mpd_pow10[r];
+ }
+
+ len = _mpd_real_size(result->data, len);
+ /* resize to fewer words cannot fail */
+ mpd_qresize(result, len, &dummy);
+ result->len = len;
+ mpd_setdigits(result);
+ if (mpd_iszerocoeff(result)) {
+ /* NaN0 is not a valid representation */
+ result->len = result->digits = 0;
+ }
+ }
+ }
+}
+
+/*
+ * Get n most significant digits from a decimal, where 0 < n <= MPD_UINT_DIGITS.
+ * Assumes MPD_UINT_DIGITS == MPD_RDIGITS+1, which is true for 32 and 64 bit
+ * machines.
+ *
+ * The result of the operation will be in lo. If the operation is impossible,
+ * hi will be nonzero. This is used to indicate an error.
+ */
+static inline void
+_mpd_get_msdigits(mpd_uint_t *hi, mpd_uint_t *lo, const mpd_t *dec,
+ unsigned int n)
+{
+ mpd_uint_t r, tmp;
+
+ assert(0 < n && n <= MPD_RDIGITS+1);
+
+ _mpd_div_word(&tmp, &r, dec->digits, MPD_RDIGITS);
+ r = (r == 0) ? MPD_RDIGITS : r; /* digits in the most significant word */
+
+ *hi = 0;
+ *lo = dec->data[dec->len-1];
+ if (n <= r) {
+ *lo /= mpd_pow10[r-n];
+ }
+ else if (dec->len > 1) {
+ /* at this point 1 <= r < n <= MPD_RDIGITS+1 */
+ _mpd_mul_words(hi, lo, *lo, mpd_pow10[n-r]);
+ tmp = dec->data[dec->len-2] / mpd_pow10[MPD_RDIGITS-(n-r)];
+ *lo = *lo + tmp;
+ if (*lo < tmp) (*hi)++;
+ }
+}
+
+
+/******************************************************************************/
+/* Gathering information about a decimal */
+/******************************************************************************/
+
+/* The real size of the coefficient without leading zero words. */
+static inline mpd_ssize_t
+_mpd_real_size(mpd_uint_t *data, mpd_ssize_t size)
+{
+ while (size > 1 && data[size-1] == 0) {
+ size--;
+ }
+
+ return size;
+}
+
+/* Return number of trailing zeros. No errors are possible. */
+mpd_ssize_t
+mpd_trail_zeros(const mpd_t *dec)
+{
+ mpd_uint_t word;
+ mpd_ssize_t i, tz = 0;
+
+ for (i=0; i < dec->len; ++i) {
+ if (dec->data[i] != 0) {
+ word = dec->data[i];
+ tz = i * MPD_RDIGITS;
+ while (word % 10 == 0) {
+ word /= 10;
+ tz++;
+ }
+ break;
+ }
+ }
+
+ return tz;
+}
+
+/* Integer: Undefined for specials */
+static int
+_mpd_isint(const mpd_t *dec)
+{
+ mpd_ssize_t tz;
+
+ if (mpd_iszerocoeff(dec)) {
+ return 1;
+ }
+
+ tz = mpd_trail_zeros(dec);
+ return (dec->exp + tz >= 0);
+}
+
+/* Integer */
+int
+mpd_isinteger(const mpd_t *dec)
+{
+ if (mpd_isspecial(dec)) {
+ return 0;
+ }
+ return _mpd_isint(dec);
+}
+
+/* Word is a power of 10 */
+static int
+mpd_word_ispow10(mpd_uint_t word)
+{
+ int n;
+
+ n = mpd_word_digits(word);
+ if (word == mpd_pow10[n-1]) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Coefficient is a power of 10 */
+static int
+mpd_coeff_ispow10(const mpd_t *dec)
+{
+ if (mpd_word_ispow10(mpd_msword(dec))) {
+ if (_mpd_isallzero(dec->data, dec->len-1)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* All digits of a word are nines */
+static int
+mpd_word_isallnine(mpd_uint_t word)
+{
+ int n;
+
+ n = mpd_word_digits(word);
+ if (word == mpd_pow10[n]-1) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* All digits of the coefficient are nines */
+static int
+mpd_coeff_isallnine(const mpd_t *dec)
+{
+ if (mpd_word_isallnine(mpd_msword(dec))) {
+ if (_mpd_isallnine(dec->data, dec->len-1)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* Odd decimal: Undefined for non-integers! */
+int
+mpd_isodd(const mpd_t *dec)
+{
+ mpd_uint_t q, r;
+ assert(mpd_isinteger(dec));
+ if (mpd_iszerocoeff(dec)) return 0;
+ if (dec->exp < 0) {
+ _mpd_div_word(&q, &r, -dec->exp, MPD_RDIGITS);
+ q = dec->data[q] / mpd_pow10[r];
+ return mpd_isoddword(q);
+ }
+ return dec->exp == 0 && mpd_isoddword(dec->data[0]);
+}
+
+/* Even: Undefined for non-integers! */
+int
+mpd_iseven(const mpd_t *dec)
+{
+ return !mpd_isodd(dec);
+}
+
+/******************************************************************************/
+/* Getting and setting decimals */
+/******************************************************************************/
+
+/* Internal function: Set a static decimal from a triple, no error checking. */
+static void
+_ssettriple(mpd_t *result, uint8_t sign, mpd_uint_t a, mpd_ssize_t exp)
+{
+ mpd_set_flags(result, sign);
+ result->exp = exp;
+ _mpd_div_word(&result->data[1], &result->data[0], a, MPD_RADIX);
+ result->len = (result->data[1] == 0) ? 1 : 2;
+ mpd_setdigits(result);
+}
+
+/* Internal function: Set a decimal from a triple, no error checking. */
+static void
+_settriple(mpd_t *result, uint8_t sign, mpd_uint_t a, mpd_ssize_t exp)
+{
+ mpd_minalloc(result);
+ mpd_set_flags(result, sign);
+ result->exp = exp;
+ _mpd_div_word(&result->data[1], &result->data[0], a, MPD_RADIX);
+ result->len = (result->data[1] == 0) ? 1 : 2;
+ mpd_setdigits(result);
+}
+
+/* Set a special number from a triple */
+void
+mpd_setspecial(mpd_t *result, uint8_t sign, uint8_t type)
+{
+ mpd_minalloc(result);
+ result->flags &= ~(MPD_NEG|MPD_SPECIAL);
+ result->flags |= (sign|type);
+ result->exp = result->digits = result->len = 0;
+}
+
+/* Set result of NaN with an error status */
+void
+mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status)
+{
+ mpd_minalloc(result);
+ mpd_set_qnan(result);
+ mpd_set_positive(result);
+ result->exp = result->digits = result->len = 0;
+ *status |= flags;
+}
+
+/* quietly set a static decimal from an mpd_ssize_t */
+void
+mpd_qsset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_uint_t u;
+ uint8_t sign = MPD_POS;
+
+ if (a < 0) {
+ if (a == MPD_SSIZE_MIN) {
+ u = (mpd_uint_t)MPD_SSIZE_MAX +
+ (-(MPD_SSIZE_MIN+MPD_SSIZE_MAX));
+ }
+ else {
+ u = -a;
+ }
+ sign = MPD_NEG;
+ }
+ else {
+ u = a;
+ }
+ _ssettriple(result, sign, u, 0);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* quietly set a static decimal from an mpd_uint_t */
+void
+mpd_qsset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ _ssettriple(result, MPD_POS, a, 0);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* quietly set a static decimal from an int32_t */
+void
+mpd_qsset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qsset_ssize(result, a, ctx, status);
+}
+
+/* quietly set a static decimal from a uint32_t */
+void
+mpd_qsset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qsset_uint(result, a, ctx, status);
+}
+
+#ifdef CONFIG_64
+/* quietly set a static decimal from an int64_t */
+void
+mpd_qsset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qsset_ssize(result, a, ctx, status);
+}
+
+/* quietly set a static decimal from a uint64_t */
+void
+mpd_qsset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qsset_uint(result, a, ctx, status);
+}
+#endif
+
+/* quietly set a decimal from an mpd_ssize_t */
+void
+mpd_qset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_minalloc(result);
+ mpd_qsset_ssize(result, a, ctx, status);
+}
+
+/* quietly set a decimal from an mpd_uint_t */
+void
+mpd_qset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ _settriple(result, MPD_POS, a, 0);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* quietly set a decimal from an int32_t */
+void
+mpd_qset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qset_ssize(result, a, ctx, status);
+}
+
+/* quietly set a decimal from a uint32_t */
+void
+mpd_qset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_qset_uint(result, a, ctx, status);
+}
+
+#if defined(CONFIG_32) && !defined(LEGACY_COMPILER)
+/* set a decimal from a uint64_t */
+static void
+_c32setu64(mpd_t *result, uint64_t u, uint8_t sign, uint32_t *status)
+{
+ mpd_uint_t w[3];
+ uint64_t q;
+ int i, len;
+
+ len = 0;
+ do {
+ q = u / MPD_RADIX;
+ w[len] = (mpd_uint_t)(u - q * MPD_RADIX);
+ u = q; len++;
+ } while (u != 0);
+
+ if (!mpd_qresize(result, len, status)) {
+ return;
+ }
+ for (i = 0; i < len; i++) {
+ result->data[i] = w[i];
+ }
+
+ mpd_set_sign(result, sign);
+ result->exp = 0;
+ result->len = len;
+ mpd_setdigits(result);
+}
+
+static void
+_c32_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ _c32setu64(result, a, MPD_POS, status);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* set a decimal from an int64_t */
+static void
+_c32_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ uint64_t u;
+ uint8_t sign = MPD_POS;
+
+ if (a < 0) {
+ if (a == INT64_MIN) {
+ u = (uint64_t)INT64_MAX + (-(INT64_MIN+INT64_MAX));
+ }
+ else {
+ u = -a;
+ }
+ sign = MPD_NEG;
+ }
+ else {
+ u = a;
+ }
+ _c32setu64(result, u, sign, status);
+ mpd_qfinalize(result, ctx, status);
+}
+#endif /* CONFIG_32 && !LEGACY_COMPILER */
+
+#ifndef LEGACY_COMPILER
+/* quietly set a decimal from an int64_t */
+void
+mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+#ifdef CONFIG_64
+ mpd_qset_ssize(result, a, ctx, status);
+#else
+ _c32_qset_i64(result, a, ctx, status);
+#endif
+}
+
+/* quietly set a decimal from a uint64_t */
+void
+mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+#ifdef CONFIG_64
+ mpd_qset_uint(result, a, ctx, status);
+#else
+ _c32_qset_u64(result, a, ctx, status);
+#endif
+}
+#endif /* !LEGACY_COMPILER */
+
+
+/*
+ * Quietly get an mpd_uint_t from a decimal. Assumes
+ * MPD_UINT_DIGITS == MPD_RDIGITS+1, which is true for
+ * 32 and 64 bit machines.
+ *
+ * If the operation is impossible, MPD_Invalid_operation is set.
+ */
+static mpd_uint_t
+_mpd_qget_uint(int use_sign, const mpd_t *a, uint32_t *status)
+{
+ mpd_t tmp;
+ mpd_uint_t tmp_data[2];
+ mpd_uint_t lo, hi;
+
+ if (mpd_isspecial(a)) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+ if (mpd_iszero(a)) {
+ return 0;
+ }
+ if (use_sign && mpd_isnegative(a)) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+
+ if (a->digits+a->exp > MPD_RDIGITS+1) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+
+ if (a->exp < 0) {
+ if (!_mpd_isint(a)) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+ /* At this point a->digits+a->exp <= MPD_RDIGITS+1,
+ * so the shift fits. */
+ tmp.data = tmp_data;
+ tmp.flags = MPD_STATIC|MPD_STATIC_DATA;
+ tmp.alloc = 2;
+ mpd_qsshiftr(&tmp, a, -a->exp);
+ tmp.exp = 0;
+ a = &tmp;
+ }
+
+ _mpd_get_msdigits(&hi, &lo, a, MPD_RDIGITS+1);
+ if (hi) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+
+ if (a->exp > 0) {
+ _mpd_mul_words(&hi, &lo, lo, mpd_pow10[a->exp]);
+ if (hi) {
+ *status |= MPD_Invalid_operation;
+ return MPD_UINT_MAX;
+ }
+ }
+
+ return lo;
+}
+
+/*
+ * Sets Invalid_operation for:
+ * - specials
+ * - negative numbers (except negative zero)
+ * - non-integers
+ * - overflow
+ */
+mpd_uint_t
+mpd_qget_uint(const mpd_t *a, uint32_t *status)
+{
+ return _mpd_qget_uint(1, a, status);
+}
+
+/* Same as above, but gets the absolute value, i.e. the sign is ignored. */
+mpd_uint_t
+mpd_qabs_uint(const mpd_t *a, uint32_t *status)
+{
+ return _mpd_qget_uint(0, a, status);
+}
+
+/* quietly get an mpd_ssize_t from a decimal */
+mpd_ssize_t
+mpd_qget_ssize(const mpd_t *a, uint32_t *status)
+{
+ mpd_uint_t u;
+ int isneg;
+
+ u = mpd_qabs_uint(a, status);
+ if (*status&MPD_Invalid_operation) {
+ return MPD_SSIZE_MAX;
+ }
+
+ isneg = mpd_isnegative(a);
+ if (u <= MPD_SSIZE_MAX) {
+ return isneg ? -((mpd_ssize_t)u) : (mpd_ssize_t)u;
+ }
+ else if (isneg && u+(MPD_SSIZE_MIN+MPD_SSIZE_MAX) == MPD_SSIZE_MAX) {
+ return MPD_SSIZE_MIN;
+ }
+
+ *status |= MPD_Invalid_operation;
+ return MPD_SSIZE_MAX;
+}
+
+#ifdef CONFIG_64
+/* quietly get a uint64_t from a decimal */
+uint64_t
+mpd_qget_u64(const mpd_t *a, uint32_t *status)
+{
+ return mpd_qget_uint(a, status);
+}
+
+/* quietly get an int64_t from a decimal */
+int64_t
+mpd_qget_i64(const mpd_t *a, uint32_t *status)
+{
+ return mpd_qget_ssize(a, status);
+}
+#else
+/* quietly get a uint32_t from a decimal */
+uint32_t
+mpd_qget_u32(const mpd_t *a, uint32_t *status)
+{
+ return mpd_qget_uint(a, status);
+}
+
+/* quietly get an int32_t from a decimal */
+int32_t
+mpd_qget_i32(const mpd_t *a, uint32_t *status)
+{
+ return mpd_qget_ssize(a, status);
+}
+#endif
+
+
+/******************************************************************************/
+/* Filtering input of functions, finalizing output of functions */
+/******************************************************************************/
+
+/*
+ * Check if the operand is NaN, copy to result and return 1 if this is
+ * the case. Copying can fail since NaNs are allowed to have a payload that
+ * does not fit in MPD_MINALLOC.
+ */
+int
+mpd_qcheck_nan(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isnan(a)) {
+ *status |= mpd_issnan(a) ? MPD_Invalid_operation : 0;
+ mpd_qcopy(result, a, status);
+ mpd_set_qnan(result);
+ _mpd_fix_nan(result, ctx);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Check if either operand is NaN, copy to result and return 1 if this
+ * is the case. Copying can fail since NaNs are allowed to have a payload
+ * that does not fit in MPD_MINALLOC.
+ */
+int
+mpd_qcheck_nans(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if ((a->flags|b->flags)&(MPD_NAN|MPD_SNAN)) {
+ const mpd_t *choice = b;
+ if (mpd_issnan(a)) {
+ choice = a;
+ *status |= MPD_Invalid_operation;
+ }
+ else if (mpd_issnan(b)) {
+ *status |= MPD_Invalid_operation;
+ }
+ else if (mpd_isqnan(a)) {
+ choice = a;
+ }
+ mpd_qcopy(result, choice, status);
+ mpd_set_qnan(result);
+ _mpd_fix_nan(result, ctx);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Check if one of the operands is NaN, copy to result and return 1 if this
+ * is the case. Copying can fail since NaNs are allowed to have a payload
+ * that does not fit in MPD_MINALLOC.
+ */
+static int
+mpd_qcheck_3nans(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if ((a->flags|b->flags|c->flags)&(MPD_NAN|MPD_SNAN)) {
+ const mpd_t *choice = c;
+ if (mpd_issnan(a)) {
+ choice = a;
+ *status |= MPD_Invalid_operation;
+ }
+ else if (mpd_issnan(b)) {
+ choice = b;
+ *status |= MPD_Invalid_operation;
+ }
+ else if (mpd_issnan(c)) {
+ *status |= MPD_Invalid_operation;
+ }
+ else if (mpd_isqnan(a)) {
+ choice = a;
+ }
+ else if (mpd_isqnan(b)) {
+ choice = b;
+ }
+ mpd_qcopy(result, choice, status);
+ mpd_set_qnan(result);
+ _mpd_fix_nan(result, ctx);
+ return 1;
+ }
+ return 0;
+}
+
+/* Check if rounding digit 'rnd' leads to an increment. */
+static inline int
+_mpd_rnd_incr(const mpd_t *dec, mpd_uint_t rnd, const mpd_context_t *ctx)
+{
+ int ld;
+
+ switch (ctx->round) {
+ case MPD_ROUND_DOWN: case MPD_ROUND_TRUNC:
+ return 0;
+ case MPD_ROUND_HALF_UP:
+ return (rnd >= 5);
+ case MPD_ROUND_HALF_EVEN:
+ return (rnd > 5) || ((rnd == 5) && mpd_isoddcoeff(dec));
+ case MPD_ROUND_CEILING:
+ return !(rnd == 0 || mpd_isnegative(dec));
+ case MPD_ROUND_FLOOR:
+ return !(rnd == 0 || mpd_ispositive(dec));
+ case MPD_ROUND_HALF_DOWN:
+ return (rnd > 5);
+ case MPD_ROUND_UP:
+ return !(rnd == 0);
+ case MPD_ROUND_05UP:
+ ld = (int)mpd_lsd(dec->data[0]);
+ return (!(rnd == 0) && (ld == 0 || ld == 5));
+ default:
+ /* Without a valid context, further results will be undefined. */
+ return 0; /* GCOV_NOT_REACHED */
+ }
+}
+
+/*
+ * Apply rounding to a decimal that has been right-shifted into a full
+ * precision decimal. If an increment leads to an overflow of the precision,
+ * adjust the coefficient and the exponent and check the new exponent for
+ * overflow.
+ */
+static inline void
+_mpd_apply_round(mpd_t *dec, mpd_uint_t rnd, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (_mpd_rnd_incr(dec, rnd, ctx)) {
+ /* We have a number with exactly ctx->prec digits. The increment
+ * can only lead to an overflow if the decimal is all nines. In
+ * that case, the result is a power of ten with prec+1 digits.
+ *
+ * If the precision is a multiple of MPD_RDIGITS, this situation is
+ * detected by _mpd_baseincr returning a carry.
+ * If the precision is not a multiple of MPD_RDIGITS, we have to
+ * check if the result has one digit too many.
+ */
+ mpd_uint_t carry = _mpd_baseincr(dec->data, dec->len);
+ if (carry) {
+ dec->data[dec->len-1] = mpd_pow10[MPD_RDIGITS-1];
+ dec->exp += 1;
+ _mpd_check_exp(dec, ctx, status);
+ return;
+ }
+ mpd_setdigits(dec);
+ if (dec->digits > ctx->prec) {
+ mpd_qshiftr_inplace(dec, 1);
+ dec->exp += 1;
+ dec->digits = ctx->prec;
+ _mpd_check_exp(dec, ctx, status);
+ }
+ }
+}
+
+/*
+ * Apply rounding to a decimal. Allow overflow of the precision.
+ */
+static inline void
+_mpd_apply_round_excess(mpd_t *dec, mpd_uint_t rnd, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (_mpd_rnd_incr(dec, rnd, ctx)) {
+ mpd_uint_t carry = _mpd_baseincr(dec->data, dec->len);
+ if (carry) {
+ if (!mpd_qresize(dec, dec->len+1, status)) {
+ return;
+ }
+ dec->data[dec->len] = 1;
+ dec->len += 1;
+ }
+ mpd_setdigits(dec);
+ }
+}
+
+/*
+ * Apply rounding to a decimal that has been right-shifted into a decimal
+ * with full precision or less. Return failure if an increment would
+ * overflow the precision.
+ */
+static inline int
+_mpd_apply_round_fit(mpd_t *dec, mpd_uint_t rnd, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (_mpd_rnd_incr(dec, rnd, ctx)) {
+ mpd_uint_t carry = _mpd_baseincr(dec->data, dec->len);
+ if (carry) {
+ if (!mpd_qresize(dec, dec->len+1, status)) {
+ return 0;
+ }
+ dec->data[dec->len] = 1;
+ dec->len += 1;
+ }
+ mpd_setdigits(dec);
+ if (dec->digits > ctx->prec) {
+ mpd_seterror(dec, MPD_Invalid_operation, status);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/* Check a normal number for overflow, underflow, clamping. If the operand
+ is modified, it will be zero, special or (sub)normal with a coefficient
+ that fits into the current context precision. */
+static inline void
+_mpd_check_exp(mpd_t *dec, const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t adjexp, etiny, shift;
+ int rnd;
+
+ adjexp = mpd_adjexp(dec);
+ if (adjexp > ctx->emax) {
+
+ if (mpd_iszerocoeff(dec)) {
+ dec->exp = ctx->emax;
+ if (ctx->clamp) {
+ dec->exp -= (ctx->prec-1);
+ }
+ mpd_zerocoeff(dec);
+ *status |= MPD_Clamped;
+ return;
+ }
+
+ switch (ctx->round) {
+ case MPD_ROUND_HALF_UP: case MPD_ROUND_HALF_EVEN:
+ case MPD_ROUND_HALF_DOWN: case MPD_ROUND_UP:
+ case MPD_ROUND_TRUNC:
+ mpd_setspecial(dec, mpd_sign(dec), MPD_INF);
+ break;
+ case MPD_ROUND_DOWN: case MPD_ROUND_05UP:
+ mpd_qmaxcoeff(dec, ctx, status);
+ dec->exp = ctx->emax - ctx->prec + 1;
+ break;
+ case MPD_ROUND_CEILING:
+ if (mpd_isnegative(dec)) {
+ mpd_qmaxcoeff(dec, ctx, status);
+ dec->exp = ctx->emax - ctx->prec + 1;
+ }
+ else {
+ mpd_setspecial(dec, MPD_POS, MPD_INF);
+ }
+ break;
+ case MPD_ROUND_FLOOR:
+ if (mpd_ispositive(dec)) {
+ mpd_qmaxcoeff(dec, ctx, status);
+ dec->exp = ctx->emax - ctx->prec + 1;
+ }
+ else {
+ mpd_setspecial(dec, MPD_NEG, MPD_INF);
+ }
+ break;
+ default: /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+
+ *status |= MPD_Overflow|MPD_Inexact|MPD_Rounded;
+
+ } /* fold down */
+ else if (ctx->clamp && dec->exp > mpd_etop(ctx)) {
+ /* At this point adjexp=exp+digits-1 <= emax and exp > etop=emax-prec+1:
+ * (1) shift = exp -emax+prec-1 > 0
+ * (2) digits+shift = exp+digits-1 - emax + prec <= prec */
+ shift = dec->exp - mpd_etop(ctx);
+ if (!mpd_qshiftl(dec, dec, shift, status)) {
+ return;
+ }
+ dec->exp -= shift;
+ *status |= MPD_Clamped;
+ if (!mpd_iszerocoeff(dec) && adjexp < ctx->emin) {
+ /* Underflow is impossible, since exp < etiny=emin-prec+1
+ * and exp > etop=emax-prec+1 would imply emax < emin. */
+ *status |= MPD_Subnormal;
+ }
+ }
+ else if (adjexp < ctx->emin) {
+
+ etiny = mpd_etiny(ctx);
+
+ if (mpd_iszerocoeff(dec)) {
+ if (dec->exp < etiny) {
+ dec->exp = etiny;
+ mpd_zerocoeff(dec);
+ *status |= MPD_Clamped;
+ }
+ return;
+ }
+
+ *status |= MPD_Subnormal;
+ if (dec->exp < etiny) {
+ /* At this point adjexp=exp+digits-1 < emin and exp < etiny=emin-prec+1:
+ * (1) shift = emin-prec+1 - exp > 0
+ * (2) digits-shift = exp+digits-1 - emin + prec < prec */
+ shift = etiny - dec->exp;
+ rnd = (int)mpd_qshiftr_inplace(dec, shift);
+ dec->exp = etiny;
+ /* We always have a spare digit in case of an increment. */
+ _mpd_apply_round_excess(dec, rnd, ctx, status);
+ *status |= MPD_Rounded;
+ if (rnd) {
+ *status |= (MPD_Inexact|MPD_Underflow);
+ if (mpd_iszerocoeff(dec)) {
+ mpd_zerocoeff(dec);
+ *status |= MPD_Clamped;
+ }
+ }
+ }
+ /* Case exp >= etiny=emin-prec+1:
+ * (1) adjexp=exp+digits-1 < emin
+ * (2) digits < emin-exp+1 <= prec */
+ }
+}
+
+/* Transcendental functions do not always set Underflow reliably,
+ * since they only use as much precision as is necessary for correct
+ * rounding. If a result like 1.0000000000e-101 is finalized, there
+ * is no rounding digit that would trigger Underflow. But we can
+ * assume Inexact, so a short check suffices. */
+static inline void
+mpd_check_underflow(mpd_t *dec, const mpd_context_t *ctx, uint32_t *status)
+{
+ if (mpd_adjexp(dec) < ctx->emin && !mpd_iszero(dec) &&
+ dec->exp < mpd_etiny(ctx)) {
+ *status |= MPD_Underflow;
+ }
+}
+
+/* Check if a normal number must be rounded after the exponent has been checked. */
+static inline void
+_mpd_check_round(mpd_t *dec, const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_uint_t rnd;
+ mpd_ssize_t shift;
+
+ /* must handle specials: _mpd_check_exp() can produce infinities or NaNs */
+ if (mpd_isspecial(dec)) {
+ return;
+ }
+
+ if (dec->digits > ctx->prec) {
+ shift = dec->digits - ctx->prec;
+ rnd = mpd_qshiftr_inplace(dec, shift);
+ dec->exp += shift;
+ _mpd_apply_round(dec, rnd, ctx, status);
+ *status |= MPD_Rounded;
+ if (rnd) {
+ *status |= MPD_Inexact;
+ }
+ }
+}
+
+/* Finalize all operations. */
+void
+mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status)
+{
+ if (mpd_isspecial(result)) {
+ if (mpd_isnan(result)) {
+ _mpd_fix_nan(result, ctx);
+ }
+ return;
+ }
+
+ _mpd_check_exp(result, ctx, status);
+ _mpd_check_round(result, ctx, status);
+}
+
+
+/******************************************************************************/
+/* Copying */
+/******************************************************************************/
+
+/* Internal function: Copy a decimal, share data with src: USE WITH CARE! */
+static inline void
+_mpd_copy_shared(mpd_t *dest, const mpd_t *src)
+{
+ dest->flags = src->flags;
+ dest->exp = src->exp;
+ dest->digits = src->digits;
+ dest->len = src->len;
+ dest->alloc = src->alloc;
+ dest->data = src->data;
+
+ mpd_set_shared_data(dest);
+}
+
+/*
+ * Copy a decimal. In case of an error, status is set to MPD_Malloc_error.
+ */
+int
+mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status)
+{
+ if (result == a) return 1;
+
+ if (!mpd_qresize(result, a->len, status)) {
+ return 0;
+ }
+
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+ result->digits = a->digits;
+ result->len = a->len;
+ memcpy(result->data, a->data, a->len * (sizeof *result->data));
+
+ return 1;
+}
+
+/*
+ * Copy to a decimal with a static buffer. The caller has to make sure that
+ * the buffer is big enough. Cannot fail.
+ */
+static void
+mpd_qcopy_static(mpd_t *result, const mpd_t *a)
+{
+ if (result == a) return;
+
+ memcpy(result->data, a->data, a->len * (sizeof *result->data));
+
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+ result->digits = a->digits;
+ result->len = a->len;
+}
+
+/*
+ * Return a newly allocated copy of the operand. In case of an error,
+ * status is set to MPD_Malloc_error and the return value is NULL.
+ */
+mpd_t *
+mpd_qncopy(const mpd_t *a)
+{
+ mpd_t *result;
+
+ if ((result = mpd_qnew_size(a->len)) == NULL) {
+ return NULL;
+ }
+ memcpy(result->data, a->data, a->len * (sizeof *result->data));
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+ result->digits = a->digits;
+ result->len = a->len;
+
+ return result;
+}
+
+/*
+ * Copy a decimal and set the sign to positive. In case of an error, the
+ * status is set to MPD_Malloc_error.
+ */
+int
+mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status)
+{
+ if (!mpd_qcopy(result, a, status)) {
+ return 0;
+ }
+ mpd_set_positive(result);
+ return 1;
+}
+
+/*
+ * Copy a decimal and negate the sign. In case of an error, the
+ * status is set to MPD_Malloc_error.
+ */
+int
+mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status)
+{
+ if (!mpd_qcopy(result, a, status)) {
+ return 0;
+ }
+ _mpd_negate(result);
+ return 1;
+}
+
+/*
+ * Copy a decimal, setting the sign of the first operand to the sign of the
+ * second operand. In case of an error, the status is set to MPD_Malloc_error.
+ */
+int
+mpd_qcopy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t *status)
+{
+ uint8_t sign_b = mpd_sign(b); /* result may equal b! */
+
+ if (!mpd_qcopy(result, a, status)) {
+ return 0;
+ }
+ mpd_set_sign(result, sign_b);
+ return 1;
+}
+
+
+/******************************************************************************/
+/* Comparisons */
+/******************************************************************************/
+
+/*
+ * For all functions that compare two operands and return an int the usual
+ * convention applies to the return value:
+ *
+ * -1 if op1 < op2
+ * 0 if op1 == op2
+ * 1 if op1 > op2
+ *
+ * INT_MAX for error
+ */
+
+
+/* Convenience macro. If a and b are not equal, return from the calling
+ * function with the correct comparison value. */
+#define CMP_EQUAL_OR_RETURN(a, b) \
+ if (a != b) { \
+ if (a < b) { \
+ return -1; \
+ } \
+ return 1; \
+ }
+
+/*
+ * Compare the data of big and small. This function does the equivalent
+ * of first shifting small to the left and then comparing the data of
+ * big and small, except that no allocation for the left shift is needed.
+ */
+static int
+_mpd_basecmp(mpd_uint_t *big, mpd_uint_t *small, mpd_size_t n, mpd_size_t m,
+ mpd_size_t shift)
+{
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
+ /* spurious uninitialized warnings */
+ mpd_uint_t l=l, lprev=lprev, h=h;
+#else
+ mpd_uint_t l, lprev, h;
+#endif
+ mpd_uint_t q, r;
+ mpd_uint_t ph, x;
+
+ assert(m > 0 && n >= m && shift > 0);
+
+ _mpd_div_word(&q, &r, (mpd_uint_t)shift, MPD_RDIGITS);
+
+ if (r != 0) {
+
+ ph = mpd_pow10[r];
+
+ --m; --n;
+ _mpd_divmod_pow10(&h, &lprev, small[m--], MPD_RDIGITS-r);
+ if (h != 0) {
+ CMP_EQUAL_OR_RETURN(big[n], h)
+ --n;
+ }
+ for (; m != MPD_SIZE_MAX; m--,n--) {
+ _mpd_divmod_pow10(&h, &l, small[m], MPD_RDIGITS-r);
+ x = ph * lprev + h;
+ CMP_EQUAL_OR_RETURN(big[n], x)
+ lprev = l;
+ }
+ x = ph * lprev;
+ CMP_EQUAL_OR_RETURN(big[q], x)
+ }
+ else {
+ while (--m != MPD_SIZE_MAX) {
+ CMP_EQUAL_OR_RETURN(big[m+q], small[m])
+ }
+ }
+
+ return !_mpd_isallzero(big, q);
+}
+
+/* Compare two decimals with the same adjusted exponent. */
+static int
+_mpd_cmp_same_adjexp(const mpd_t *a, const mpd_t *b)
+{
+ mpd_ssize_t shift, i;
+
+ if (a->exp != b->exp) {
+ /* Cannot wrap: a->exp + a->digits = b->exp + b->digits, so
+ * a->exp - b->exp = b->digits - a->digits. */
+ shift = a->exp - b->exp;
+ if (shift > 0) {
+ return -1 * _mpd_basecmp(b->data, a->data, b->len, a->len, shift);
+ }
+ else {
+ return _mpd_basecmp(a->data, b->data, a->len, b->len, -shift);
+ }
+ }
+
+ /*
+ * At this point adjexp(a) == adjexp(b) and a->exp == b->exp,
+ * so a->digits == b->digits, therefore a->len == b->len.
+ */
+ for (i = a->len-1; i >= 0; --i) {
+ CMP_EQUAL_OR_RETURN(a->data[i], b->data[i])
+ }
+
+ return 0;
+}
+
+/* Compare two numerical values. */
+static int
+_mpd_cmp(const mpd_t *a, const mpd_t *b)
+{
+ mpd_ssize_t adjexp_a, adjexp_b;
+
+ /* equal pointers */
+ if (a == b) {
+ return 0;
+ }
+
+ /* infinities */
+ if (mpd_isinfinite(a)) {
+ if (mpd_isinfinite(b)) {
+ return mpd_isnegative(b) - mpd_isnegative(a);
+ }
+ return mpd_arith_sign(a);
+ }
+ if (mpd_isinfinite(b)) {
+ return -mpd_arith_sign(b);
+ }
+
+ /* zeros */
+ if (mpd_iszerocoeff(a)) {
+ if (mpd_iszerocoeff(b)) {
+ return 0;
+ }
+ return -mpd_arith_sign(b);
+ }
+ if (mpd_iszerocoeff(b)) {
+ return mpd_arith_sign(a);
+ }
+
+ /* different signs */
+ if (mpd_sign(a) != mpd_sign(b)) {
+ return mpd_sign(b) - mpd_sign(a);
+ }
+
+ /* different adjusted exponents */
+ adjexp_a = mpd_adjexp(a);
+ adjexp_b = mpd_adjexp(b);
+ if (adjexp_a != adjexp_b) {
+ if (adjexp_a < adjexp_b) {
+ return -1 * mpd_arith_sign(a);
+ }
+ return mpd_arith_sign(a);
+ }
+
+ /* same adjusted exponents */
+ return _mpd_cmp_same_adjexp(a, b) * mpd_arith_sign(a);
+}
+
+/* Compare the absolutes of two numerical values. */
+static int
+_mpd_cmp_abs(const mpd_t *a, const mpd_t *b)
+{
+ mpd_ssize_t adjexp_a, adjexp_b;
+
+ /* equal pointers */
+ if (a == b) {
+ return 0;
+ }
+
+ /* infinities */
+ if (mpd_isinfinite(a)) {
+ if (mpd_isinfinite(b)) {
+ return 0;
+ }
+ return 1;
+ }
+ if (mpd_isinfinite(b)) {
+ return -1;
+ }
+
+ /* zeros */
+ if (mpd_iszerocoeff(a)) {
+ if (mpd_iszerocoeff(b)) {
+ return 0;
+ }
+ return -1;
+ }
+ if (mpd_iszerocoeff(b)) {
+ return 1;
+ }
+
+ /* different adjusted exponents */
+ adjexp_a = mpd_adjexp(a);
+ adjexp_b = mpd_adjexp(b);
+ if (adjexp_a != adjexp_b) {
+ if (adjexp_a < adjexp_b) {
+ return -1;
+ }
+ return 1;
+ }
+
+ /* same adjusted exponents */
+ return _mpd_cmp_same_adjexp(a, b);
+}
+
+/* Compare two values and return an integer result. */
+int
+mpd_qcmp(const mpd_t *a, const mpd_t *b, uint32_t *status)
+{
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_isnan(a) || mpd_isnan(b)) {
+ *status |= MPD_Invalid_operation;
+ return INT_MAX;
+ }
+ }
+
+ return _mpd_cmp(a, b);
+}
+
+/*
+ * Compare a and b, convert the the usual integer result to a decimal and
+ * store it in 'result'. For convenience, the integer result of the comparison
+ * is returned. Comparisons involving NaNs return NaN/INT_MAX.
+ */
+int
+mpd_qcompare(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return INT_MAX;
+ }
+ }
+
+ c = _mpd_cmp(a, b);
+ _settriple(result, (c < 0), (c != 0), 0);
+ return c;
+}
+
+/* Same as mpd_compare(), but signal for all NaNs, i.e. also for quiet NaNs. */
+int
+mpd_qcompare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ *status |= MPD_Invalid_operation;
+ return INT_MAX;
+ }
+ }
+
+ c = _mpd_cmp(a, b);
+ _settriple(result, (c < 0), (c != 0), 0);
+ return c;
+}
+
+/* Compare the operands using a total order. */
+int
+mpd_cmp_total(const mpd_t *a, const mpd_t *b)
+{
+ mpd_t aa, bb;
+ int nan_a, nan_b;
+ int c;
+
+ if (mpd_sign(a) != mpd_sign(b)) {
+ return mpd_sign(b) - mpd_sign(a);
+ }
+
+
+ if (mpd_isnan(a)) {
+ c = 1;
+ if (mpd_isnan(b)) {
+ nan_a = (mpd_isqnan(a)) ? 1 : 0;
+ nan_b = (mpd_isqnan(b)) ? 1 : 0;
+ if (nan_b == nan_a) {
+ if (a->len > 0 && b->len > 0) {
+ _mpd_copy_shared(&aa, a);
+ _mpd_copy_shared(&bb, b);
+ aa.exp = bb.exp = 0;
+ /* compare payload */
+ c = _mpd_cmp_abs(&aa, &bb);
+ }
+ else {
+ c = (a->len > 0) - (b->len > 0);
+ }
+ }
+ else {
+ c = nan_a - nan_b;
+ }
+ }
+ }
+ else if (mpd_isnan(b)) {
+ c = -1;
+ }
+ else {
+ c = _mpd_cmp_abs(a, b);
+ if (c == 0 && a->exp != b->exp) {
+ c = (a->exp < b->exp) ? -1 : 1;
+ }
+ }
+
+ return c * mpd_arith_sign(a);
+}
+
+/*
+ * Compare a and b according to a total order, convert the usual integer result
+ * to a decimal and store it in 'result'. For convenience, the integer result
+ * of the comparison is returned.
+ */
+int
+mpd_compare_total(mpd_t *result, const mpd_t *a, const mpd_t *b)
+{
+ int c;
+
+ c = mpd_cmp_total(a, b);
+ _settriple(result, (c < 0), (c != 0), 0);
+ return c;
+}
+
+/* Compare the magnitude of the operands using a total order. */
+int
+mpd_cmp_total_mag(const mpd_t *a, const mpd_t *b)
+{
+ mpd_t aa, bb;
+
+ _mpd_copy_shared(&aa, a);
+ _mpd_copy_shared(&bb, b);
+
+ mpd_set_positive(&aa);
+ mpd_set_positive(&bb);
+
+ return mpd_cmp_total(&aa, &bb);
+}
+
+/*
+ * Compare the magnitude of a and b according to a total order, convert the
+ * the usual integer result to a decimal and store it in 'result'.
+ * For convenience, the integer result of the comparison is returned.
+ */
+int
+mpd_compare_total_mag(mpd_t *result, const mpd_t *a, const mpd_t *b)
+{
+ int c;
+
+ c = mpd_cmp_total_mag(a, b);
+ _settriple(result, (c < 0), (c != 0), 0);
+ return c;
+}
+
+/* Determine an ordering for operands that are numerically equal. */
+static inline int
+_mpd_cmp_numequal(const mpd_t *a, const mpd_t *b)
+{
+ int sign_a, sign_b;
+ int c;
+
+ sign_a = mpd_sign(a);
+ sign_b = mpd_sign(b);
+ if (sign_a != sign_b) {
+ c = sign_b - sign_a;
+ }
+ else {
+ c = (a->exp < b->exp) ? -1 : 1;
+ c *= mpd_arith_sign(a);
+ }
+
+ return c;
+}
+
+
+/******************************************************************************/
+/* Shifting the coefficient */
+/******************************************************************************/
+
+/*
+ * Shift the coefficient of the operand to the left, no check for specials.
+ * Both operands may be the same pointer. If the result length has to be
+ * increased, mpd_qresize() might fail with MPD_Malloc_error.
+ */
+int
+mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
+{
+ mpd_ssize_t size;
+
+ assert(!mpd_isspecial(a));
+ assert(n >= 0);
+
+ if (mpd_iszerocoeff(a) || n == 0) {
+ return mpd_qcopy(result, a, status);
+ }
+
+ size = mpd_digits_to_size(a->digits+n);
+ if (!mpd_qresize(result, size, status)) {
+ return 0; /* result is NaN */
+ }
+
+ _mpd_baseshiftl(result->data, a->data, size, a->len, n);
+
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+ result->digits = a->digits+n;
+ result->len = size;
+
+ return 1;
+}
+
+/* Determine the rounding indicator if all digits of the coefficient are shifted
+ * out of the picture. */
+static mpd_uint_t
+_mpd_get_rnd(const mpd_uint_t *data, mpd_ssize_t len, int use_msd)
+{
+ mpd_uint_t rnd = 0, rest = 0, word;
+
+ word = data[len-1];
+ /* special treatment for the most significant digit if shift == digits */
+ if (use_msd) {
+ _mpd_divmod_pow10(&rnd, &rest, word, mpd_word_digits(word)-1);
+ if (len > 1 && rest == 0) {
+ rest = !_mpd_isallzero(data, len-1);
+ }
+ }
+ else {
+ rest = !_mpd_isallzero(data, len);
+ }
+
+ return (rnd == 0 || rnd == 5) ? rnd + !!rest : rnd;
+}
+
+/*
+ * Same as mpd_qshiftr(), but 'result' is an mpd_t with a static coefficient.
+ * It is the caller's responsibility to ensure that the coefficient is big
+ * enough. The function cannot fail.
+ */
+mpd_uint_t
+mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n)
+{
+ mpd_uint_t rnd;
+ mpd_ssize_t size;
+
+ assert(!mpd_isspecial(a));
+ assert(n >= 0);
+
+ if (mpd_iszerocoeff(a) || n == 0) {
+ mpd_qcopy_static(result, a);
+ return 0;
+ }
+
+ if (n >= a->digits) {
+ rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits));
+ mpd_zerocoeff(result);
+ }
+ else {
+ result->digits = a->digits-n;
+ size = mpd_digits_to_size(result->digits);
+ rnd = _mpd_baseshiftr(result->data, a->data, a->len, n);
+ result->len = size;
+ }
+
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+
+ return rnd;
+}
+
+/*
+ * Inplace shift of the coefficient to the right, no check for specials.
+ * Returns the rounding indicator for mpd_rnd_incr().
+ * The function cannot fail.
+ */
+mpd_uint_t
+mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n)
+{
+ uint32_t dummy;
+ mpd_uint_t rnd;
+ mpd_ssize_t size;
+
+ assert(!mpd_isspecial(result));
+ assert(n >= 0);
+
+ if (mpd_iszerocoeff(result) || n == 0) {
+ return 0;
+ }
+
+ if (n >= result->digits) {
+ rnd = _mpd_get_rnd(result->data, result->len, (n==result->digits));
+ mpd_zerocoeff(result);
+ }
+ else {
+ rnd = _mpd_baseshiftr(result->data, result->data, result->len, n);
+ result->digits -= n;
+ size = mpd_digits_to_size(result->digits);
+ /* reducing the size cannot fail */
+ mpd_qresize(result, size, &dummy);
+ result->len = size;
+ }
+
+ return rnd;
+}
+
+/*
+ * Shift the coefficient of the operand to the right, no check for specials.
+ * Both operands may be the same pointer. Returns the rounding indicator to
+ * be used by mpd_rnd_incr(). If the result length has to be increased,
+ * mpd_qcopy() or mpd_qresize() might fail with MPD_Malloc_error. In those
+ * cases, MPD_UINT_MAX is returned.
+ */
+mpd_uint_t
+mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
+{
+ mpd_uint_t rnd;
+ mpd_ssize_t size;
+
+ assert(!mpd_isspecial(a));
+ assert(n >= 0);
+
+ if (mpd_iszerocoeff(a) || n == 0) {
+ if (!mpd_qcopy(result, a, status)) {
+ return MPD_UINT_MAX;
+ }
+ return 0;
+ }
+
+ if (n >= a->digits) {
+ rnd = _mpd_get_rnd(a->data, a->len, (n==a->digits));
+ mpd_zerocoeff(result);
+ }
+ else {
+ result->digits = a->digits-n;
+ size = mpd_digits_to_size(result->digits);
+ if (result == a) {
+ rnd = _mpd_baseshiftr(result->data, a->data, a->len, n);
+ /* reducing the size cannot fail */
+ mpd_qresize(result, size, status);
+ }
+ else {
+ if (!mpd_qresize(result, size, status)) {
+ return MPD_UINT_MAX;
+ }
+ rnd = _mpd_baseshiftr(result->data, a->data, a->len, n);
+ }
+ result->len = size;
+ }
+
+ mpd_copy_flags(result, a);
+ result->exp = a->exp;
+
+ return rnd;
+}
+
+
+/******************************************************************************/
+/* Miscellaneous operations */
+/******************************************************************************/
+
+/* Logical And */
+void
+mpd_qand(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ const mpd_t *big = a, *small = b;
+ mpd_uint_t x, y, z, xbit, ybit;
+ int k, mswdigits;
+ mpd_ssize_t i;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b) ||
+ mpd_isnegative(a) || mpd_isnegative(b) ||
+ a->exp != 0 || b->exp != 0) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (b->digits > a->digits) {
+ big = b;
+ small = a;
+ }
+ if (!mpd_qresize(result, big->len, status)) {
+ return;
+ }
+
+
+ /* full words */
+ for (i = 0; i < small->len-1; i++) {
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit&ybit) ? mpd_pow10[k] : 0;
+ }
+ result->data[i] = z;
+ }
+ /* most significant word of small */
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ mswdigits = mpd_word_digits(x);
+ for (k = 0; k < mswdigits; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit&ybit) ? mpd_pow10[k] : 0;
+ }
+ result->data[i++] = z;
+
+ /* scan the rest of y for digits > 1 */
+ for (; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ }
+ /* scan the rest of big for digits > 1 */
+ for (; i < big->len; i++) {
+ y = big->data[i];
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ }
+ }
+
+ mpd_clear_flags(result);
+ result->exp = 0;
+ result->len = _mpd_real_size(result->data, small->len);
+ mpd_qresize(result, result->len, status);
+ mpd_setdigits(result);
+ _mpd_cap(result, ctx);
+ return;
+
+invalid_operation:
+ mpd_seterror(result, MPD_Invalid_operation, status);
+}
+
+/* Class of an operand. Returns a pointer to the constant name. */
+const char *
+mpd_class(const mpd_t *a, const mpd_context_t *ctx)
+{
+ if (mpd_isnan(a)) {
+ if (mpd_isqnan(a))
+ return "NaN";
+ else
+ return "sNaN";
+ }
+ else if (mpd_ispositive(a)) {
+ if (mpd_isinfinite(a))
+ return "+Infinity";
+ else if (mpd_iszero(a))
+ return "+Zero";
+ else if (mpd_isnormal(a, ctx))
+ return "+Normal";
+ else
+ return "+Subnormal";
+ }
+ else {
+ if (mpd_isinfinite(a))
+ return "-Infinity";
+ else if (mpd_iszero(a))
+ return "-Zero";
+ else if (mpd_isnormal(a, ctx))
+ return "-Normal";
+ else
+ return "-Subnormal";
+ }
+}
+
+/* Logical Xor */
+void
+mpd_qinvert(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_uint_t x, z, xbit;
+ mpd_ssize_t i, digits, len;
+ mpd_ssize_t q, r;
+ int k;
+
+ if (mpd_isspecial(a) || mpd_isnegative(a) || a->exp != 0) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ digits = (a->digits < ctx->prec) ? ctx->prec : a->digits;
+ _mpd_idiv_word(&q, &r, digits, MPD_RDIGITS);
+ len = (r == 0) ? q : q+1;
+ if (!mpd_qresize(result, len, status)) {
+ return;
+ }
+
+ for (i = 0; i < len; i++) {
+ x = (i < a->len) ? a->data[i] : 0;
+ z = 0;
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ xbit = x % 10;
+ x /= 10;
+ if (xbit > 1) {
+ goto invalid_operation;
+ }
+ z += !xbit ? mpd_pow10[k] : 0;
+ }
+ result->data[i] = z;
+ }
+
+ mpd_clear_flags(result);
+ result->exp = 0;
+ result->len = _mpd_real_size(result->data, len);
+ mpd_qresize(result, result->len, status);
+ mpd_setdigits(result);
+ _mpd_cap(result, ctx);
+ return;
+
+invalid_operation:
+ mpd_seterror(result, MPD_Invalid_operation, status);
+}
+
+/* Exponent of the magnitude of the most significant digit of the operand. */
+void
+mpd_qlogb(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ }
+ else if (mpd_iszerocoeff(a)) {
+ mpd_setspecial(result, MPD_NEG, MPD_INF);
+ *status |= MPD_Division_by_zero;
+ }
+ else {
+ mpd_qset_ssize(result, mpd_adjexp(a), ctx, status);
+ }
+}
+
+/* Logical Or */
+void
+mpd_qor(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ const mpd_t *big = a, *small = b;
+ mpd_uint_t x, y, z, xbit, ybit;
+ int k, mswdigits;
+ mpd_ssize_t i;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b) ||
+ mpd_isnegative(a) || mpd_isnegative(b) ||
+ a->exp != 0 || b->exp != 0) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (b->digits > a->digits) {
+ big = b;
+ small = a;
+ }
+ if (!mpd_qresize(result, big->len, status)) {
+ return;
+ }
+
+
+ /* full words */
+ for (i = 0; i < small->len-1; i++) {
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit|ybit) ? mpd_pow10[k] : 0;
+ }
+ result->data[i] = z;
+ }
+ /* most significant word of small */
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ mswdigits = mpd_word_digits(x);
+ for (k = 0; k < mswdigits; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit|ybit) ? mpd_pow10[k] : 0;
+ }
+
+ /* scan for digits > 1 and copy the rest of y */
+ for (; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ z += ybit*mpd_pow10[k];
+ }
+ result->data[i++] = z;
+ /* scan for digits > 1 and copy the rest of big */
+ for (; i < big->len; i++) {
+ y = big->data[i];
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ }
+ result->data[i] = big->data[i];
+ }
+
+ mpd_clear_flags(result);
+ result->exp = 0;
+ result->len = _mpd_real_size(result->data, big->len);
+ mpd_qresize(result, result->len, status);
+ mpd_setdigits(result);
+ _mpd_cap(result, ctx);
+ return;
+
+invalid_operation:
+ mpd_seterror(result, MPD_Invalid_operation, status);
+}
+
+/*
+ * Rotate the coefficient of 'a' by 'b' digits. 'b' must be an integer with
+ * exponent 0.
+ */
+void
+mpd_qrotate(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ MPD_NEW_STATIC(tmp,0,0,0,0);
+ MPD_NEW_STATIC(big,0,0,0,0);
+ MPD_NEW_STATIC(small,0,0,0,0);
+ mpd_ssize_t n, lshift, rshift;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ }
+ if (b->exp != 0 || mpd_isinfinite(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ n = mpd_qget_ssize(b, &workstatus);
+ if (workstatus&MPD_Invalid_operation) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (n > ctx->prec || n < -ctx->prec) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+ if (n >= 0) {
+ lshift = n;
+ rshift = ctx->prec-n;
+ }
+ else {
+ lshift = ctx->prec+n;
+ rshift = -n;
+ }
+
+ if (a->digits > ctx->prec) {
+ if (!mpd_qcopy(&tmp, a, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+ _mpd_cap(&tmp, ctx);
+ a = &tmp;
+ }
+
+ if (!mpd_qshiftl(&big, a, lshift, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+ _mpd_cap(&big, ctx);
+
+ if (mpd_qshiftr(&small, a, rshift, status) == MPD_UINT_MAX) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+ _mpd_qadd(result, &big, &small, ctx, status);
+
+
+finish:
+ mpd_del(&tmp);
+ mpd_del(&big);
+ mpd_del(&small);
+}
+
+/*
+ * b must be an integer with exponent 0 and in the range +-2*(emax + prec).
+ * XXX: In my opinion +-(2*emax + prec) would be more sensible.
+ * The result is a with the value of b added to its exponent.
+ */
+void
+mpd_qscaleb(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_uint_t n, maxjump;
+#ifndef LEGACY_COMPILER
+ int64_t exp;
+#else
+ mpd_uint_t x;
+ int x_sign, n_sign;
+ mpd_ssize_t exp;
+#endif
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ }
+ if (b->exp != 0 || mpd_isinfinite(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ n = mpd_qabs_uint(b, &workstatus);
+ /* the spec demands this */
+ maxjump = 2 * (mpd_uint_t)(ctx->emax + ctx->prec);
+
+ if (n > maxjump || workstatus&MPD_Invalid_operation) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+#ifndef LEGACY_COMPILER
+ exp = a->exp + (int64_t)n * mpd_arith_sign(b);
+ exp = (exp > MPD_EXP_INF) ? MPD_EXP_INF : exp;
+ exp = (exp < MPD_EXP_CLAMP) ? MPD_EXP_CLAMP : exp;
+#else
+ x = (a->exp < 0) ? -a->exp : a->exp;
+ x_sign = (a->exp < 0) ? 1 : 0;
+ n_sign = mpd_isnegative(b) ? 1 : 0;
+
+ if (x_sign == n_sign) {
+ x = x + n;
+ if (x < n) x = MPD_UINT_MAX;
+ }
+ else {
+ x_sign = (x >= n) ? x_sign : n_sign;
+ x = (x >= n) ? x - n : n - x;
+ }
+ if (!x_sign && x > MPD_EXP_INF) x = MPD_EXP_INF;
+ if (x_sign && x > -MPD_EXP_CLAMP) x = -MPD_EXP_CLAMP;
+ exp = x_sign ? -((mpd_ssize_t)x) : (mpd_ssize_t)x;
+#endif
+
+ mpd_qcopy(result, a, status);
+ result->exp = (mpd_ssize_t)exp;
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/*
+ * Shift the coefficient by n digits, positive n is a left shift. In the case
+ * of a left shift, the result is decapitated to fit the context precision. If
+ * you don't want that, use mpd_shiftl().
+ */
+void
+mpd_qshiftn(mpd_t *result, const mpd_t *a, mpd_ssize_t n, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+ if (n >= 0 && n <= ctx->prec) {
+ mpd_qshiftl(result, a, n, status);
+ _mpd_cap(result, ctx);
+ }
+ else if (n < 0 && n >= -ctx->prec) {
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+ _mpd_cap(result, ctx);
+ mpd_qshiftr_inplace(result, -n);
+ }
+ else {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+}
+
+/*
+ * Same as mpd_shiftn(), but the shift is specified by the decimal b, which
+ * must be an integer with a zero exponent. Infinities remain infinities.
+ */
+void
+mpd_qshift(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_ssize_t n;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ }
+ if (b->exp != 0 || mpd_isinfinite(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ n = mpd_qget_ssize(b, &workstatus);
+ if (workstatus&MPD_Invalid_operation) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (n > ctx->prec || n < -ctx->prec) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+ if (n >= 0) {
+ mpd_qshiftl(result, a, n, status);
+ _mpd_cap(result, ctx);
+ }
+ else {
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+ _mpd_cap(result, ctx);
+ mpd_qshiftr_inplace(result, -n);
+ }
+}
+
+/* Logical Xor */
+void
+mpd_qxor(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ const mpd_t *big = a, *small = b;
+ mpd_uint_t x, y, z, xbit, ybit;
+ int k, mswdigits;
+ mpd_ssize_t i;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b) ||
+ mpd_isnegative(a) || mpd_isnegative(b) ||
+ a->exp != 0 || b->exp != 0) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (b->digits > a->digits) {
+ big = b;
+ small = a;
+ }
+ if (!mpd_qresize(result, big->len, status)) {
+ return;
+ }
+
+
+ /* full words */
+ for (i = 0; i < small->len-1; i++) {
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit^ybit) ? mpd_pow10[k] : 0;
+ }
+ result->data[i] = z;
+ }
+ /* most significant word of small */
+ x = small->data[i];
+ y = big->data[i];
+ z = 0;
+ mswdigits = mpd_word_digits(x);
+ for (k = 0; k < mswdigits; k++) {
+ xbit = x % 10;
+ x /= 10;
+ ybit = y % 10;
+ y /= 10;
+ if (xbit > 1 || ybit > 1) {
+ goto invalid_operation;
+ }
+ z += (xbit^ybit) ? mpd_pow10[k] : 0;
+ }
+
+ /* scan for digits > 1 and copy the rest of y */
+ for (; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ z += ybit*mpd_pow10[k];
+ }
+ result->data[i++] = z;
+ /* scan for digits > 1 and copy the rest of big */
+ for (; i < big->len; i++) {
+ y = big->data[i];
+ for (k = 0; k < MPD_RDIGITS; k++) {
+ ybit = y % 10;
+ y /= 10;
+ if (ybit > 1) {
+ goto invalid_operation;
+ }
+ }
+ result->data[i] = big->data[i];
+ }
+
+ mpd_clear_flags(result);
+ result->exp = 0;
+ result->len = _mpd_real_size(result->data, big->len);
+ mpd_qresize(result, result->len, status);
+ mpd_setdigits(result);
+ _mpd_cap(result, ctx);
+ return;
+
+invalid_operation:
+ mpd_seterror(result, MPD_Invalid_operation, status);
+}
+
+
+/******************************************************************************/
+/* Arithmetic operations */
+/******************************************************************************/
+
+/*
+ * The absolute value of a. If a is negative, the result is the same
+ * as the result of the minus operation. Otherwise, the result is the
+ * result of the plus operation.
+ */
+void
+mpd_qabs(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ }
+
+ if (mpd_isnegative(a)) {
+ mpd_qminus(result, a, ctx, status);
+ }
+ else {
+ mpd_qplus(result, a, ctx, status);
+ }
+}
+
+static inline void
+_mpd_ptrswap(mpd_t **a, mpd_t **b)
+{
+ mpd_t *t = *a;
+ *a = *b;
+ *b = t;
+}
+
+/* Add or subtract infinities. */
+static void
+_mpd_qaddsub_inf(mpd_t *result, const mpd_t *a, const mpd_t *b, uint8_t sign_b,
+ uint32_t *status)
+{
+ if (mpd_isinfinite(a)) {
+ if (mpd_sign(a) != sign_b && mpd_isinfinite(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+ else {
+ mpd_setspecial(result, mpd_sign(a), MPD_INF);
+ }
+ return;
+ }
+ assert(mpd_isinfinite(b));
+ mpd_setspecial(result, sign_b, MPD_INF);
+}
+
+/* Add or subtract non-special numbers. */
+static void
+_mpd_qaddsub(mpd_t *result, const mpd_t *a, const mpd_t *b, uint8_t sign_b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_t *big, *small;
+ MPD_NEW_STATIC(big_aligned,0,0,0,0);
+ MPD_NEW_CONST(tiny,0,0,1,1,1,1);
+ mpd_uint_t carry;
+ mpd_ssize_t newsize, shift;
+ mpd_ssize_t exp, i;
+ int swap = 0;
+
+
+ /* compare exponents */
+ big = (mpd_t *)a; small = (mpd_t *)b;
+ if (big->exp != small->exp) {
+ if (small->exp > big->exp) {
+ _mpd_ptrswap(&big, &small);
+ swap++;
+ }
+ /* align the coefficients */
+ if (!mpd_iszerocoeff(big)) {
+ exp = big->exp - 1;
+ exp += (big->digits > ctx->prec) ? 0 : big->digits-ctx->prec-1;
+ if (mpd_adjexp(small) < exp) {
+ /*
+ * Avoid huge shifts by substituting a value for small that is
+ * guaranteed to produce the same results.
+ *
+ * adjexp(small) < exp if and only if:
+ *
+ * bdigits <= prec AND
+ * bdigits+shift >= prec+2+sdigits AND
+ * exp = bexp+bdigits-prec-2
+ *
+ * 1234567000000000 -> bdigits + shift
+ * ----------XX1234 -> sdigits
+ * ----------X1 -> tiny-digits
+ * |- prec -|
+ *
+ * OR
+ *
+ * bdigits > prec AND
+ * shift > sdigits AND
+ * exp = bexp-1
+ *
+ * 1234567892100000 -> bdigits + shift
+ * ----------XX1234 -> sdigits
+ * ----------X1 -> tiny-digits
+ * |- prec -|
+ *
+ * If tiny is zero, adding or subtracting is a no-op.
+ * Otherwise, adding tiny generates a non-zero digit either
+ * below the rounding digit or the least significant digit
+ * of big. When subtracting, tiny is in the same position as
+ * the carry that would be generated by subtracting sdigits.
+ */
+ mpd_copy_flags(&tiny, small);
+ tiny.exp = exp;
+ tiny.digits = 1;
+ tiny.len = 1;
+ tiny.data[0] = mpd_iszerocoeff(small) ? 0 : 1;
+ small = &tiny;
+ }
+ /* This cannot wrap: the difference is positive and <= maxprec */
+ shift = big->exp - small->exp;
+ if (!mpd_qshiftl(&big_aligned, big, shift, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+ big = &big_aligned;
+ }
+ }
+ result->exp = small->exp;
+
+
+ /* compare length of coefficients */
+ if (big->len < small->len) {
+ _mpd_ptrswap(&big, &small);
+ swap++;
+ }
+
+ newsize = big->len;
+ if (!mpd_qresize(result, newsize, status)) {
+ goto finish;
+ }
+
+ if (mpd_sign(a) == sign_b) {
+
+ carry = _mpd_baseadd(result->data, big->data, small->data,
+ big->len, small->len);
+
+ if (carry) {
+ newsize = big->len + 1;
+ if (!mpd_qresize(result, newsize, status)) {
+ goto finish;
+ }
+ result->data[newsize-1] = carry;
+ }
+
+ result->len = newsize;
+ mpd_set_flags(result, sign_b);
+ }
+ else {
+ if (big->len == small->len) {
+ for (i=big->len-1; i >= 0; --i) {
+ if (big->data[i] != small->data[i]) {
+ if (big->data[i] < small->data[i]) {
+ _mpd_ptrswap(&big, &small);
+ swap++;
+ }
+ break;
+ }
+ }
+ }
+
+ _mpd_basesub(result->data, big->data, small->data,
+ big->len, small->len);
+ newsize = _mpd_real_size(result->data, big->len);
+ /* resize to smaller cannot fail */
+ (void)mpd_qresize(result, newsize, status);
+
+ result->len = newsize;
+ sign_b = (swap & 1) ? sign_b : mpd_sign(a);
+ mpd_set_flags(result, sign_b);
+
+ if (mpd_iszerocoeff(result)) {
+ mpd_set_positive(result);
+ if (ctx->round == MPD_ROUND_FLOOR) {
+ mpd_set_negative(result);
+ }
+ }
+ }
+
+ mpd_setdigits(result);
+
+finish:
+ mpd_del(&big_aligned);
+}
+
+/* Add a and b. No specials, no finalizing. */
+static void
+_mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ _mpd_qaddsub(result, a, b, mpd_sign(b), ctx, status);
+}
+
+/* Subtract b from a. No specials, no finalizing. */
+static void
+_mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ _mpd_qaddsub(result, a, b, !mpd_sign(b), ctx, status);
+}
+
+/* Add a and b. */
+void
+mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ _mpd_qaddsub_inf(result, a, b, mpd_sign(b), status);
+ return;
+ }
+
+ _mpd_qaddsub(result, a, b, mpd_sign(b), ctx, status);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* Add a and b. Set NaN/Invalid_operation if the result is inexact. */
+static void
+_mpd_qadd_exact(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+
+ mpd_qadd(result, a, b, ctx, &workstatus);
+ *status |= workstatus;
+ if (workstatus & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+}
+
+/* Subtract b from a. */
+void
+mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ _mpd_qaddsub_inf(result, a, b, !mpd_sign(b), status);
+ return;
+ }
+
+ _mpd_qaddsub(result, a, b, !mpd_sign(b), ctx, status);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* Subtract b from a. Set NaN/Invalid_operation if the result is inexact. */
+static void
+_mpd_qsub_exact(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+
+ mpd_qsub(result, a, b, ctx, &workstatus);
+ *status |= workstatus;
+ if (workstatus & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+}
+
+/* Add decimal and mpd_ssize_t. */
+void
+mpd_qadd_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_ssize(&bb, b, &maxcontext, status);
+ mpd_qadd(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Add decimal and mpd_uint_t. */
+void
+mpd_qadd_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_uint(&bb, b, &maxcontext, status);
+ mpd_qadd(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Subtract mpd_ssize_t from decimal. */
+void
+mpd_qsub_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_ssize(&bb, b, &maxcontext, status);
+ mpd_qsub(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Subtract mpd_uint_t from decimal. */
+void
+mpd_qsub_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_uint(&bb, b, &maxcontext, status);
+ mpd_qsub(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Add decimal and int32_t. */
+void
+mpd_qadd_i32(mpd_t *result, const mpd_t *a, int32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qadd_ssize(result, a, b, ctx, status);
+}
+
+/* Add decimal and uint32_t. */
+void
+mpd_qadd_u32(mpd_t *result, const mpd_t *a, uint32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qadd_uint(result, a, b, ctx, status);
+}
+
+#ifdef CONFIG_64
+/* Add decimal and int64_t. */
+void
+mpd_qadd_i64(mpd_t *result, const mpd_t *a, int64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qadd_ssize(result, a, b, ctx, status);
+}
+
+/* Add decimal and uint64_t. */
+void
+mpd_qadd_u64(mpd_t *result, const mpd_t *a, uint64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qadd_uint(result, a, b, ctx, status);
+}
+#endif
+
+/* Subtract int32_t from decimal. */
+void
+mpd_qsub_i32(mpd_t *result, const mpd_t *a, int32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qsub_ssize(result, a, b, ctx, status);
+}
+
+/* Subtract uint32_t from decimal. */
+void
+mpd_qsub_u32(mpd_t *result, const mpd_t *a, uint32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qsub_uint(result, a, b, ctx, status);
+}
+
+#ifdef CONFIG_64
+/* Subtract int64_t from decimal. */
+void
+mpd_qsub_i64(mpd_t *result, const mpd_t *a, int64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qsub_ssize(result, a, b, ctx, status);
+}
+
+/* Subtract uint64_t from decimal. */
+void
+mpd_qsub_u64(mpd_t *result, const mpd_t *a, uint64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qsub_uint(result, a, b, ctx, status);
+}
+#endif
+
+
+/* Divide infinities. */
+static void
+_mpd_qdiv_inf(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if (mpd_isinfinite(a)) {
+ if (mpd_isinfinite(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ mpd_setspecial(result, mpd_sign(a)^mpd_sign(b), MPD_INF);
+ return;
+ }
+ assert(mpd_isinfinite(b));
+ _settriple(result, mpd_sign(a)^mpd_sign(b), 0, mpd_etiny(ctx));
+ *status |= MPD_Clamped;
+}
+
+enum {NO_IDEAL_EXP, SET_IDEAL_EXP};
+/* Divide a by b. */
+static void
+_mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ MPD_NEW_STATIC(aligned,0,0,0,0);
+ mpd_uint_t ld;
+ mpd_ssize_t shift, exp, tz;
+ mpd_ssize_t newsize;
+ mpd_ssize_t ideal_exp;
+ mpd_uint_t rem;
+ uint8_t sign_a = mpd_sign(a);
+ uint8_t sign_b = mpd_sign(b);
+
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(q, a, b, ctx, status)) {
+ return;
+ }
+ _mpd_qdiv_inf(q, a, b, ctx, status);
+ return;
+ }
+ if (mpd_iszerocoeff(b)) {
+ if (mpd_iszerocoeff(a)) {
+ mpd_seterror(q, MPD_Division_undefined, status);
+ }
+ else {
+ mpd_setspecial(q, sign_a^sign_b, MPD_INF);
+ *status |= MPD_Division_by_zero;
+ }
+ return;
+ }
+ if (mpd_iszerocoeff(a)) {
+ exp = a->exp - b->exp;
+ _settriple(q, sign_a^sign_b, 0, exp);
+ mpd_qfinalize(q, ctx, status);
+ return;
+ }
+
+ shift = (b->digits - a->digits) + ctx->prec + 1;
+ ideal_exp = a->exp - b->exp;
+ exp = ideal_exp - shift;
+ if (shift > 0) {
+ if (!mpd_qshiftl(&aligned, a, shift, status)) {
+ mpd_seterror(q, MPD_Malloc_error, status);
+ goto finish;
+ }
+ a = &aligned;
+ }
+ else if (shift < 0) {
+ shift = -shift;
+ if (!mpd_qshiftl(&aligned, b, shift, status)) {
+ mpd_seterror(q, MPD_Malloc_error, status);
+ goto finish;
+ }
+ b = &aligned;
+ }
+
+
+ newsize = a->len - b->len + 1;
+ if ((q != b && q != a) || (q == b && newsize > b->len)) {
+ if (!mpd_qresize(q, newsize, status)) {
+ mpd_seterror(q, MPD_Malloc_error, status);
+ goto finish;
+ }
+ }
+
+
+ if (b->len == 1) {
+ rem = _mpd_shortdiv(q->data, a->data, a->len, b->data[0]);
+ }
+ else if (b->len <= MPD_NEWTONDIV_CUTOFF) {
+ int ret = _mpd_basedivmod(q->data, NULL, a->data, b->data,
+ a->len, b->len);
+ if (ret < 0) {
+ mpd_seterror(q, MPD_Malloc_error, status);
+ goto finish;
+ }
+ rem = ret;
+ }
+ else {
+ MPD_NEW_STATIC(r,0,0,0,0);
+ _mpd_base_ndivmod(q, &r, a, b, status);
+ if (mpd_isspecial(q) || mpd_isspecial(&r)) {
+ mpd_setspecial(q, MPD_POS, MPD_NAN);
+ mpd_del(&r);
+ goto finish;
+ }
+ rem = !mpd_iszerocoeff(&r);
+ mpd_del(&r);
+ newsize = q->len;
+ }
+
+ newsize = _mpd_real_size(q->data, newsize);
+ /* resize to smaller cannot fail */
+ mpd_qresize(q, newsize, status);
+ mpd_set_flags(q, sign_a^sign_b);
+ q->len = newsize;
+ mpd_setdigits(q);
+
+ shift = ideal_exp - exp;
+ if (rem) {
+ ld = mpd_lsd(q->data[0]);
+ if (ld == 0 || ld == 5) {
+ q->data[0] += 1;
+ }
+ }
+ else if (action == SET_IDEAL_EXP && shift > 0) {
+ tz = mpd_trail_zeros(q);
+ shift = (tz > shift) ? shift : tz;
+ mpd_qshiftr_inplace(q, shift);
+ exp += shift;
+ }
+
+ q->exp = exp;
+
+
+finish:
+ mpd_del(&aligned);
+ mpd_qfinalize(q, ctx, status);
+}
+
+/* Divide a by b. */
+void
+mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ _mpd_qdiv(SET_IDEAL_EXP, q, a, b, ctx, status);
+}
+
+/* Internal function. */
+static void
+_mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ MPD_NEW_STATIC(aligned,0,0,0,0);
+ mpd_ssize_t qsize, rsize;
+ mpd_ssize_t ideal_exp, expdiff, shift;
+ uint8_t sign_a = mpd_sign(a);
+ uint8_t sign_ab = mpd_sign(a)^mpd_sign(b);
+
+
+ ideal_exp = (a->exp > b->exp) ? b->exp : a->exp;
+ if (mpd_iszerocoeff(a)) {
+ if (!mpd_qcopy(r, a, status)) {
+ goto nanresult; /* GCOV_NOT_REACHED */
+ }
+ r->exp = ideal_exp;
+ _settriple(q, sign_ab, 0, 0);
+ return;
+ }
+
+ expdiff = mpd_adjexp(a) - mpd_adjexp(b);
+ if (expdiff < 0) {
+ if (a->exp > b->exp) {
+ /* positive and less than b->digits - a->digits */
+ shift = a->exp - b->exp;
+ if (!mpd_qshiftl(r, a, shift, status)) {
+ goto nanresult;
+ }
+ r->exp = ideal_exp;
+ }
+ else {
+ if (!mpd_qcopy(r, a, status)) {
+ goto nanresult;
+ }
+ }
+ _settriple(q, sign_ab, 0, 0);
+ return;
+ }
+ if (expdiff > ctx->prec) {
+ *status |= MPD_Division_impossible;
+ goto nanresult;
+ }
+
+
+ /*
+ * At this point we have:
+ * (1) 0 <= a->exp + a->digits - b->exp - b->digits <= prec
+ * (2) a->exp - b->exp >= b->digits - a->digits
+ * (3) a->exp - b->exp <= prec + b->digits - a->digits
+ */
+ if (a->exp != b->exp) {
+ shift = a->exp - b->exp;
+ if (shift > 0) {
+ /* by (3), after the shift a->digits <= prec + b->digits */
+ if (!mpd_qshiftl(&aligned, a, shift, status)) {
+ goto nanresult;
+ }
+ a = &aligned;
+ }
+ else {
+ shift = -shift;
+ /* by (2), after the shift b->digits <= a->digits */
+ if (!mpd_qshiftl(&aligned, b, shift, status)) {
+ goto nanresult;
+ }
+ b = &aligned;
+ }
+ }
+
+
+ qsize = a->len - b->len + 1;
+ if (!(q == a && qsize < a->len) && !(q == b && qsize < b->len)) {
+ if (!mpd_qresize(q, qsize, status)) {
+ goto nanresult;
+ }
+ }
+
+ rsize = b->len;
+ if (!(r == a && rsize < a->len)) {
+ if (!mpd_qresize(r, rsize, status)) {
+ goto nanresult;
+ }
+ }
+
+ if (b->len == 1) {
+ if (a->len == 1) {
+ _mpd_div_word(&q->data[0], &r->data[0], a->data[0], b->data[0]);
+ }
+ else {
+ r->data[0] = _mpd_shortdiv(q->data, a->data, a->len, b->data[0]);
+ }
+ }
+ else if (b->len <= MPD_NEWTONDIV_CUTOFF) {
+ int ret;
+ ret = _mpd_basedivmod(q->data, r->data, a->data, b->data,
+ a->len, b->len);
+ if (ret == -1) {
+ *status |= MPD_Malloc_error;
+ goto nanresult;
+ }
+ }
+ else {
+ _mpd_base_ndivmod(q, r, a, b, status);
+ if (mpd_isspecial(q) || mpd_isspecial(r)) {
+ goto nanresult;
+ }
+ qsize = q->len;
+ rsize = r->len;
+ }
+
+ qsize = _mpd_real_size(q->data, qsize);
+ /* resize to smaller cannot fail */
+ mpd_qresize(q, qsize, status);
+ q->len = qsize;
+ mpd_setdigits(q);
+ mpd_set_flags(q, sign_ab);
+ q->exp = 0;
+ if (q->digits > ctx->prec) {
+ *status |= MPD_Division_impossible;
+ goto nanresult;
+ }
+
+ rsize = _mpd_real_size(r->data, rsize);
+ /* resize to smaller cannot fail */
+ mpd_qresize(r, rsize, status);
+ r->len = rsize;
+ mpd_setdigits(r);
+ mpd_set_flags(r, sign_a);
+ r->exp = ideal_exp;
+
+out:
+ mpd_del(&aligned);
+ return;
+
+nanresult:
+ mpd_setspecial(q, MPD_POS, MPD_NAN);
+ mpd_setspecial(r, MPD_POS, MPD_NAN);
+ goto out;
+}
+
+/* Integer division with remainder. */
+void
+mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint8_t sign = mpd_sign(a)^mpd_sign(b);
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(q, a, b, ctx, status)) {
+ mpd_qcopy(r, q, status);
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ if (mpd_isinfinite(b)) {
+ mpd_setspecial(q, MPD_POS, MPD_NAN);
+ }
+ else {
+ mpd_setspecial(q, sign, MPD_INF);
+ }
+ mpd_setspecial(r, MPD_POS, MPD_NAN);
+ *status |= MPD_Invalid_operation;
+ return;
+ }
+ if (mpd_isinfinite(b)) {
+ if (!mpd_qcopy(r, a, status)) {
+ mpd_seterror(q, MPD_Malloc_error, status);
+ return;
+ }
+ mpd_qfinalize(r, ctx, status);
+ _settriple(q, sign, 0, 0);
+ return;
+ }
+ /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+ if (mpd_iszerocoeff(b)) {
+ if (mpd_iszerocoeff(a)) {
+ mpd_setspecial(q, MPD_POS, MPD_NAN);
+ mpd_setspecial(r, MPD_POS, MPD_NAN);
+ *status |= MPD_Division_undefined;
+ }
+ else {
+ mpd_setspecial(q, sign, MPD_INF);
+ mpd_setspecial(r, MPD_POS, MPD_NAN);
+ *status |= (MPD_Division_by_zero|MPD_Invalid_operation);
+ }
+ return;
+ }
+
+ _mpd_qdivmod(q, r, a, b, ctx, status);
+ mpd_qfinalize(q, ctx, status);
+ mpd_qfinalize(r, ctx, status);
+}
+
+void
+mpd_qdivint(mpd_t *q, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ MPD_NEW_STATIC(r,0,0,0,0);
+ uint8_t sign = mpd_sign(a)^mpd_sign(b);
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(q, a, b, ctx, status)) {
+ return;
+ }
+ if (mpd_isinfinite(a) && mpd_isinfinite(b)) {
+ mpd_seterror(q, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_setspecial(q, sign, MPD_INF);
+ return;
+ }
+ if (mpd_isinfinite(b)) {
+ _settriple(q, sign, 0, 0);
+ return;
+ }
+ /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+ if (mpd_iszerocoeff(b)) {
+ if (mpd_iszerocoeff(a)) {
+ mpd_seterror(q, MPD_Division_undefined, status);
+ }
+ else {
+ mpd_setspecial(q, sign, MPD_INF);
+ *status |= MPD_Division_by_zero;
+ }
+ return;
+ }
+
+
+ _mpd_qdivmod(q, &r, a, b, ctx, status);
+ mpd_del(&r);
+ mpd_qfinalize(q, ctx, status);
+}
+
+/* Divide decimal by mpd_ssize_t. */
+void
+mpd_qdiv_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_ssize(&bb, b, &maxcontext, status);
+ mpd_qdiv(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Divide decimal by mpd_uint_t. */
+void
+mpd_qdiv_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_uint(&bb, b, &maxcontext, status);
+ mpd_qdiv(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Divide decimal by int32_t. */
+void
+mpd_qdiv_i32(mpd_t *result, const mpd_t *a, int32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qdiv_ssize(result, a, b, ctx, status);
+}
+
+/* Divide decimal by uint32_t. */
+void
+mpd_qdiv_u32(mpd_t *result, const mpd_t *a, uint32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qdiv_uint(result, a, b, ctx, status);
+}
+
+#ifdef CONFIG_64
+/* Divide decimal by int64_t. */
+void
+mpd_qdiv_i64(mpd_t *result, const mpd_t *a, int64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qdiv_ssize(result, a, b, ctx, status);
+}
+
+/* Divide decimal by uint64_t. */
+void
+mpd_qdiv_u64(mpd_t *result, const mpd_t *a, uint64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qdiv_uint(result, a, b, ctx, status);
+}
+#endif
+
+/* Pad the result with trailing zeros if it has fewer digits than prec. */
+static void
+_mpd_zeropad(mpd_t *result, const mpd_context_t *ctx, uint32_t *status)
+{
+ if (!mpd_isspecial(result) && !mpd_iszero(result) &&
+ result->digits < ctx->prec) {
+ mpd_ssize_t shift = ctx->prec - result->digits;
+ mpd_qshiftl(result, result, shift, status);
+ result->exp -= shift;
+ }
+}
+
+/* Check if the result is guaranteed to be one. */
+static int
+_mpd_qexp_check_one(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ MPD_NEW_CONST(lim,0,-(ctx->prec+1),1,1,1,9);
+ MPD_NEW_SHARED(aa, a);
+
+ mpd_set_positive(&aa);
+
+ /* abs(a) <= 9 * 10**(-prec-1) */
+ if (_mpd_cmp(&aa, &lim) <= 0) {
+ _settriple(result, 0, 1, 0);
+ *status |= MPD_Rounded|MPD_Inexact;
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Get the number of iterations for the Horner scheme in _mpd_qexp().
+ */
+static inline mpd_ssize_t
+_mpd_get_exp_iterations(const mpd_t *r, mpd_ssize_t p)
+{
+ mpd_ssize_t log10pbyr; /* lower bound for log10(p / abs(r)) */
+ mpd_ssize_t n;
+
+ assert(p >= 10);
+ assert(!mpd_iszero(r));
+ assert(-p < mpd_adjexp(r) && mpd_adjexp(r) <= -1);
+
+#ifdef CONFIG_64
+ if (p > (mpd_ssize_t)(1ULL<<52)) {
+ return MPD_SSIZE_MAX;
+ }
+#endif
+
+ /*
+ * Lower bound for log10(p / abs(r)): adjexp(p) - (adjexp(r) + 1)
+ * At this point (for CONFIG_64, CONFIG_32 is not problematic):
+ * 1) 10 <= p <= 2**52
+ * 2) -p < adjexp(r) <= -1
+ * 3) 1 <= log10pbyr <= 2**52 + 14
+ */
+ log10pbyr = (mpd_word_digits(p)-1) - (mpd_adjexp(r)+1);
+
+ /*
+ * The numerator in the paper is 1.435 * p - 1.182, calculated
+ * exactly. We compensate for rounding errors by using 1.43503.
+ * ACL2 proofs:
+ * 1) exp-iter-approx-lower-bound: The term below evaluated
+ * in 53-bit floating point arithmetic is greater than or
+ * equal to the exact term used in the paper.
+ * 2) exp-iter-approx-upper-bound: The term below is less than
+ * or equal to 3/2 * p <= 3/2 * 2**52.
+ */
+ n = (mpd_ssize_t)ceil((1.43503*(double)p - 1.182) / (double)log10pbyr);
+ return n >= 3 ? n : 3;
+}
+
+/*
+ * Internal function, specials have been dealt with. Apart from Overflow
+ * and Underflow, two cases must be considered for the error of the result:
+ *
+ * 1) abs(a) <= 9 * 10**(-prec-1) ==> result == 1
+ *
+ * Absolute error: abs(1 - e**x) < 10**(-prec)
+ * -------------------------------------------
+ *
+ * 2) abs(a) > 9 * 10**(-prec-1)
+ *
+ * Relative error: abs(result - e**x) < 0.5 * 10**(-prec) * e**x
+ * -------------------------------------------------------------
+ *
+ * The algorithm is from Hull&Abrham, Variable Precision Exponential Function,
+ * ACM Transactions on Mathematical Software, Vol. 12, No. 2, June 1986.
+ *
+ * Main differences:
+ *
+ * - The number of iterations for the Horner scheme is calculated using
+ * 53-bit floating point arithmetic.
+ *
+ * - In the error analysis for ER (relative error accumulated in the
+ * evaluation of the truncated series) the reduced operand r may
+ * have any number of digits.
+ * ACL2 proof: exponent-relative-error
+ *
+ * - The analysis for early abortion has been adapted for the mpd_t
+ * ranges.
+ */
+static void
+_mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_STATIC(tmp,0,0,0,0);
+ MPD_NEW_STATIC(sum,0,0,0,0);
+ MPD_NEW_CONST(word,0,0,1,1,1,1);
+ mpd_ssize_t j, n, t;
+
+ assert(!mpd_isspecial(a));
+
+ if (mpd_iszerocoeff(a)) {
+ _settriple(result, MPD_POS, 1, 0);
+ return;
+ }
+
+ /*
+ * We are calculating e^x = e^(r*10^t) = (e^r)^(10^t), where abs(r) < 1 and t >= 0.
+ *
+ * If t > 0, we have:
+ *
+ * (1) 0.1 <= r < 1, so e^0.1 <= e^r. If t > MAX_T, overflow occurs:
+ *
+ * MAX-EMAX+1 < log10(e^(0.1*10*t)) <= log10(e^(r*10^t)) < adjexp(e^(r*10^t))+1
+ *
+ * (2) -1 < r <= -0.1, so e^r <= e^-0.1. If t > MAX_T, underflow occurs:
+ *
+ * adjexp(e^(r*10^t)) <= log10(e^(r*10^t)) <= log10(e^(-0.1*10^t)) < MIN-ETINY
+ */
+#if defined(CONFIG_64)
+ #define MPD_EXP_MAX_T 19
+#elif defined(CONFIG_32)
+ #define MPD_EXP_MAX_T 10
+#endif
+ t = a->digits + a->exp;
+ t = (t > 0) ? t : 0;
+ if (t > MPD_EXP_MAX_T) {
+ if (mpd_ispositive(a)) {
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ *status |= MPD_Overflow|MPD_Inexact|MPD_Rounded;
+ }
+ else {
+ _settriple(result, MPD_POS, 0, mpd_etiny(ctx));
+ *status |= (MPD_Inexact|MPD_Rounded|MPD_Subnormal|
+ MPD_Underflow|MPD_Clamped);
+ }
+ return;
+ }
+
+ /* abs(a) <= 9 * 10**(-prec-1) */
+ if (_mpd_qexp_check_one(result, a, ctx, status)) {
+ return;
+ }
+
+ mpd_maxcontext(&workctx);
+ workctx.prec = ctx->prec + t + 2;
+ workctx.prec = (workctx.prec < 10) ? 10 : workctx.prec;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+ result->exp -= t;
+
+ /*
+ * At this point:
+ * 1) 9 * 10**(-prec-1) < abs(a)
+ * 2) 9 * 10**(-prec-t-1) < abs(r)
+ * 3) log10(9) - prec - t - 1 < log10(abs(r)) < adjexp(abs(r)) + 1
+ * 4) - prec - t - 2 < adjexp(abs(r)) <= -1
+ */
+ n = _mpd_get_exp_iterations(result, workctx.prec);
+ if (n == MPD_SSIZE_MAX) {
+ mpd_seterror(result, MPD_Invalid_operation, status); /* GCOV_UNLIKELY */
+ return; /* GCOV_UNLIKELY */
+ }
+
+ _settriple(&sum, MPD_POS, 1, 0);
+
+ for (j = n-1; j >= 1; j--) {
+ word.data[0] = j;
+ mpd_setdigits(&word);
+ mpd_qdiv(&tmp, result, &word, &workctx, &workctx.status);
+ mpd_qfma(&sum, &sum, &tmp, &one, &workctx, &workctx.status);
+ }
+
+#ifdef CONFIG_64
+ _mpd_qpow_uint(result, &sum, mpd_pow10[t], MPD_POS, &workctx, status);
+#else
+ if (t <= MPD_MAX_POW10) {
+ _mpd_qpow_uint(result, &sum, mpd_pow10[t], MPD_POS, &workctx, status);
+ }
+ else {
+ t -= MPD_MAX_POW10;
+ _mpd_qpow_uint(&tmp, &sum, mpd_pow10[MPD_MAX_POW10], MPD_POS,
+ &workctx, status);
+ _mpd_qpow_uint(result, &tmp, mpd_pow10[t], MPD_POS, &workctx, status);
+ }
+#endif
+
+ mpd_del(&tmp);
+ mpd_del(&sum);
+ *status |= (workctx.status&MPD_Errors);
+ *status |= (MPD_Inexact|MPD_Rounded);
+}
+
+/* exp(a) */
+void
+mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ _settriple(result, MPD_POS, 0, 0);
+ }
+ else {
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ }
+ return;
+ }
+ if (mpd_iszerocoeff(a)) {
+ _settriple(result, MPD_POS, 1, 0);
+ return;
+ }
+
+ workctx = *ctx;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+
+ if (ctx->allcr) {
+ MPD_NEW_STATIC(t1, 0,0,0,0);
+ MPD_NEW_STATIC(t2, 0,0,0,0);
+ MPD_NEW_STATIC(ulp, 0,0,0,0);
+ MPD_NEW_STATIC(aa, 0,0,0,0);
+ mpd_ssize_t prec;
+ mpd_ssize_t ulpexp;
+ uint32_t workstatus;
+
+ if (result == a) {
+ if (!mpd_qcopy(&aa, a, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ a = &aa;
+ }
+
+ workctx.clamp = 0;
+ prec = ctx->prec + 3;
+ while (1) {
+ workctx.prec = prec;
+ workstatus = 0;
+
+ _mpd_qexp(result, a, &workctx, &workstatus);
+ *status |= workstatus;
+
+ ulpexp = result->exp + result->digits - workctx.prec;
+ if (workstatus & MPD_Underflow) {
+ /* The effective work precision is result->digits. */
+ ulpexp = result->exp;
+ }
+ _ssettriple(&ulp, MPD_POS, 1, ulpexp);
+
+ /*
+ * At this point [1]:
+ * 1) abs(result - e**x) < 0.5 * 10**(-prec) * e**x
+ * 2) result - ulp < e**x < result + ulp
+ * 3) result - ulp < result < result + ulp
+ *
+ * If round(result-ulp)==round(result+ulp), then
+ * round(result)==round(e**x). Therefore the result
+ * is correctly rounded.
+ *
+ * [1] If abs(a) <= 9 * 10**(-prec-1), use the absolute
+ * error for a similar argument.
+ */
+ workctx.prec = ctx->prec;
+ mpd_qadd(&t1, result, &ulp, &workctx, &workctx.status);
+ mpd_qsub(&t2, result, &ulp, &workctx, &workctx.status);
+ if (mpd_isspecial(result) || mpd_iszerocoeff(result) ||
+ mpd_qcmp(&t1, &t2, status) == 0) {
+ workctx.clamp = ctx->clamp;
+ _mpd_zeropad(result, &workctx, status);
+ mpd_check_underflow(result, &workctx, status);
+ mpd_qfinalize(result, &workctx, status);
+ break;
+ }
+ prec += MPD_RDIGITS;
+ }
+ mpd_del(&t1);
+ mpd_del(&t2);
+ mpd_del(&ulp);
+ mpd_del(&aa);
+ }
+ else {
+ _mpd_qexp(result, a, &workctx, status);
+ _mpd_zeropad(result, &workctx, status);
+ mpd_check_underflow(result, &workctx, status);
+ mpd_qfinalize(result, &workctx, status);
+ }
+}
+
+/* Fused multiply-add: (a * b) + c, with a single final rounding. */
+void
+mpd_qfma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_t *cc = (mpd_t *)c;
+
+ if (result == c) {
+ if ((cc = mpd_qncopy(c)) == NULL) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ }
+
+ _mpd_qmul(result, a, b, ctx, &workstatus);
+ if (!(workstatus&MPD_Invalid_operation)) {
+ mpd_qadd(result, result, cc, ctx, &workstatus);
+ }
+
+ if (cc != c) mpd_del(cc);
+ *status |= workstatus;
+}
+
+/*
+ * Schedule the optimal precision increase for the Newton iteration.
+ * v := input operand
+ * z_0 := initial approximation
+ * initprec := natural number such that abs(log(v) - z_0) < 10**-initprec
+ * maxprec := target precision
+ *
+ * For convenience the output klist contains the elements in reverse order:
+ * klist := [k_n-1, ..., k_0], where
+ * 1) k_0 <= initprec and
+ * 2) abs(log(v) - result) < 10**(-2*k_n-1 + 1) <= 10**-maxprec.
+ */
+static inline int
+ln_schedule_prec(mpd_ssize_t klist[MPD_MAX_PREC_LOG2], mpd_ssize_t maxprec,
+ mpd_ssize_t initprec)
+{
+ mpd_ssize_t k;
+ int i;
+
+ assert(maxprec >= 2 && initprec >= 2);
+ if (maxprec <= initprec) return -1;
+
+ i = 0; k = maxprec;
+ do {
+ k = (k+2) / 2;
+ klist[i++] = k;
+ } while (k > initprec);
+
+ return i-1;
+}
+
+/* The constants have been verified with both decimal.py and mpfr. */
+#ifdef CONFIG_64
+#if MPD_RDIGITS != 19
+ #error "mpdecimal.c: MPD_RDIGITS must be 19."
+#endif
+static const mpd_uint_t mpd_ln10_data[MPD_MINALLOC_MAX] = {
+ 6983716328982174407ULL, 9089704281976336583ULL, 1515961135648465461ULL,
+ 4416816335727555703ULL, 2900988039194170265ULL, 2307925037472986509ULL,
+ 107598438319191292ULL, 3466624107184669231ULL, 4450099781311469159ULL,
+ 9807828059751193854ULL, 7713456862091670584ULL, 1492198849978748873ULL,
+ 6528728696511086257ULL, 2385392051446341972ULL, 8692180205189339507ULL,
+ 6518769751037497088ULL, 2375253577097505395ULL, 9095610299291824318ULL,
+ 982748238504564801ULL, 5438635917781170543ULL, 7547331541421808427ULL,
+ 752371033310119785ULL, 3171643095059950878ULL, 9785265383207606726ULL,
+ 2932258279850258550ULL, 5497347726624257094ULL, 2976979522110718264ULL,
+ 9221477656763693866ULL, 1979650047149510504ULL, 6674183485704422507ULL,
+ 9702766860595249671ULL, 9278096762712757753ULL, 9314848524948644871ULL,
+ 6826928280848118428ULL, 754403708474699401ULL, 230105703089634572ULL,
+ 1929203337658714166ULL, 7589402567763113569ULL, 4208241314695689016ULL,
+ 2922455440575892572ULL, 9356734206705811364ULL, 2684916746550586856ULL,
+ 644507064800027750ULL, 9476834636167921018ULL, 5659121373450747856ULL,
+ 2835522011480466371ULL, 6470806855677432162ULL, 7141748003688084012ULL,
+ 9619404400222105101ULL, 5504893431493939147ULL, 6674744042432743651ULL,
+ 2287698219886746543ULL, 7773262884616336622ULL, 1985283935053089653ULL,
+ 4680843799894826233ULL, 8168948290720832555ULL, 8067566662873690987ULL,
+ 6248633409525465082ULL, 9829834196778404228ULL, 3524802359972050895ULL,
+ 3327900967572609677ULL, 110148862877297603ULL, 179914546843642076ULL,
+ 2302585092994045684ULL
+};
+#else
+#if MPD_RDIGITS != 9
+ #error "mpdecimal.c: MPD_RDIGITS must be 9."
+#endif
+static const mpd_uint_t mpd_ln10_data[MPD_MINALLOC_MAX] = {
+ 401682692UL, 708474699UL, 720754403UL, 30896345UL, 602301057UL, 765871416UL,
+ 192920333UL, 763113569UL, 589402567UL, 956890167UL, 82413146UL, 589257242UL,
+ 245544057UL, 811364292UL, 734206705UL, 868569356UL, 167465505UL, 775026849UL,
+ 706480002UL, 18064450UL, 636167921UL, 569476834UL, 734507478UL, 156591213UL,
+ 148046637UL, 283552201UL, 677432162UL, 470806855UL, 880840126UL, 417480036UL,
+ 210510171UL, 940440022UL, 939147961UL, 893431493UL, 436515504UL, 440424327UL,
+ 654366747UL, 821988674UL, 622228769UL, 884616336UL, 537773262UL, 350530896UL,
+ 319852839UL, 989482623UL, 468084379UL, 720832555UL, 168948290UL, 736909878UL,
+ 675666628UL, 546508280UL, 863340952UL, 404228624UL, 834196778UL, 508959829UL,
+ 23599720UL, 967735248UL, 96757260UL, 603332790UL, 862877297UL, 760110148UL,
+ 468436420UL, 401799145UL, 299404568UL, 230258509UL
+};
+#endif
+/* _mpd_ln10 is used directly for precisions smaller than MINALLOC_MAX*RDIGITS.
+ Otherwise, it serves as the initial approximation for calculating ln(10). */
+static const mpd_t _mpd_ln10 = {
+ MPD_STATIC|MPD_CONST_DATA, -(MPD_MINALLOC_MAX*MPD_RDIGITS-1),
+ MPD_MINALLOC_MAX*MPD_RDIGITS, MPD_MINALLOC_MAX, MPD_MINALLOC_MAX,
+ (mpd_uint_t *)mpd_ln10_data
+};
+
+/*
+ * Set 'result' to log(10).
+ * Ulp error: abs(result - log(10)) < ulp(log(10))
+ * Relative error: abs(result - log(10)) < 5 * 10**-prec * log(10)
+ *
+ * NOTE: The relative error is not derived from the ulp error, but
+ * calculated separately using the fact that 23/10 < log(10) < 24/10.
+ */
+void
+mpd_qln10(mpd_t *result, mpd_ssize_t prec, uint32_t *status)
+{
+ mpd_context_t varcontext, maxcontext;
+ MPD_NEW_STATIC(tmp, 0,0,0,0);
+ MPD_NEW_CONST(static10, 0,0,2,1,1,10);
+ mpd_ssize_t klist[MPD_MAX_PREC_LOG2];
+ mpd_uint_t rnd;
+ mpd_ssize_t shift;
+ int i;
+
+ assert(prec >= 1);
+
+ shift = MPD_MINALLOC_MAX*MPD_RDIGITS-prec;
+ shift = shift < 0 ? 0 : shift;
+
+ rnd = mpd_qshiftr(result, &_mpd_ln10, shift, status);
+ if (rnd == MPD_UINT_MAX) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ result->exp = -(result->digits-1);
+
+ mpd_maxcontext(&maxcontext);
+ if (prec < MPD_MINALLOC_MAX*MPD_RDIGITS) {
+ maxcontext.prec = prec;
+ _mpd_apply_round_excess(result, rnd, &maxcontext, status);
+ *status |= (MPD_Inexact|MPD_Rounded);
+ return;
+ }
+
+ mpd_maxcontext(&varcontext);
+ varcontext.round = MPD_ROUND_TRUNC;
+
+ i = ln_schedule_prec(klist, prec+2, -result->exp);
+ for (; i >= 0; i--) {
+ varcontext.prec = 2*klist[i]+3;
+ result->flags ^= MPD_NEG;
+ _mpd_qexp(&tmp, result, &varcontext, status);
+ result->flags ^= MPD_NEG;
+ mpd_qmul(&tmp, &static10, &tmp, &varcontext, status);
+ mpd_qsub(&tmp, &tmp, &one, &maxcontext, status);
+ mpd_qadd(result, result, &tmp, &maxcontext, status);
+ if (mpd_isspecial(result)) {
+ break;
+ }
+ }
+
+ mpd_del(&tmp);
+ maxcontext.prec = prec;
+ mpd_qfinalize(result, &maxcontext, status);
+}
+
+/*
+ * Initial approximations for the ln() iteration. The values have the
+ * following properties (established with both decimal.py and mpfr):
+ *
+ * Index 0 - 400, logarithms of x in [1.00, 5.00]:
+ * abs(lnapprox[i] * 10**-3 - log((i+100)/100)) < 10**-2
+ * abs(lnapprox[i] * 10**-3 - log((i+1+100)/100)) < 10**-2
+ *
+ * Index 401 - 899, logarithms of x in (0.500, 0.999]:
+ * abs(-lnapprox[i] * 10**-3 - log((i+100)/1000)) < 10**-2
+ * abs(-lnapprox[i] * 10**-3 - log((i+1+100)/1000)) < 10**-2
+ */
+static const uint16_t lnapprox[900] = {
+ /* index 0 - 400: log((i+100)/100) * 1000 */
+ 0, 10, 20, 30, 39, 49, 58, 68, 77, 86, 95, 104, 113, 122, 131, 140, 148, 157,
+ 166, 174, 182, 191, 199, 207, 215, 223, 231, 239, 247, 255, 262, 270, 278,
+ 285, 293, 300, 308, 315, 322, 329, 336, 344, 351, 358, 365, 372, 378, 385,
+ 392, 399, 406, 412, 419, 425, 432, 438, 445, 451, 457, 464, 470, 476, 482,
+ 489, 495, 501, 507, 513, 519, 525, 531, 536, 542, 548, 554, 560, 565, 571,
+ 577, 582, 588, 593, 599, 604, 610, 615, 621, 626, 631, 637, 642, 647, 652,
+ 658, 663, 668, 673, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728,
+ 732, 737, 742, 747, 751, 756, 761, 766, 770, 775, 779, 784, 788, 793, 798,
+ 802, 806, 811, 815, 820, 824, 829, 833, 837, 842, 846, 850, 854, 859, 863,
+ 867, 871, 876, 880, 884, 888, 892, 896, 900, 904, 908, 912, 916, 920, 924,
+ 928, 932, 936, 940, 944, 948, 952, 956, 959, 963, 967, 971, 975, 978, 982,
+ 986, 990, 993, 997, 1001, 1004, 1008, 1012, 1015, 1019, 1022, 1026, 1030,
+ 1033, 1037, 1040, 1044, 1047, 1051, 1054, 1058, 1061, 1065, 1068, 1072, 1075,
+ 1078, 1082, 1085, 1089, 1092, 1095, 1099, 1102, 1105, 1109, 1112, 1115, 1118,
+ 1122, 1125, 1128, 1131, 1135, 1138, 1141, 1144, 1147, 1151, 1154, 1157, 1160,
+ 1163, 1166, 1169, 1172, 1176, 1179, 1182, 1185, 1188, 1191, 1194, 1197, 1200,
+ 1203, 1206, 1209, 1212, 1215, 1218, 1221, 1224, 1227, 1230, 1233, 1235, 1238,
+ 1241, 1244, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1270, 1273, 1275,
+ 1278, 1281, 1284, 1286, 1289, 1292, 1295, 1297, 1300, 1303, 1306, 1308, 1311,
+ 1314, 1316, 1319, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1340, 1343, 1345,
+ 1348, 1351, 1353, 1356, 1358, 1361, 1364, 1366, 1369, 1371, 1374, 1376, 1379,
+ 1381, 1384, 1386, 1389, 1391, 1394, 1396, 1399, 1401, 1404, 1406, 1409, 1411,
+ 1413, 1416, 1418, 1421, 1423, 1426, 1428, 1430, 1433, 1435, 1437, 1440, 1442,
+ 1445, 1447, 1449, 1452, 1454, 1456, 1459, 1461, 1463, 1466, 1468, 1470, 1472,
+ 1475, 1477, 1479, 1482, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1500, 1502,
+ 1504, 1506, 1509, 1511, 1513, 1515, 1517, 1520, 1522, 1524, 1526, 1528, 1530,
+ 1533, 1535, 1537, 1539, 1541, 1543, 1545, 1548, 1550, 1552, 1554, 1556, 1558,
+ 1560, 1562, 1564, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1581, 1583, 1585,
+ 1587, 1589, 1591, 1593, 1595, 1597, 1599, 1601, 1603, 1605, 1607, 1609,
+ /* index 401 - 899: -log((i+100)/1000) * 1000 */
+ 691, 689, 687, 685, 683, 681, 679, 677, 675, 673, 671, 669, 668, 666, 664,
+ 662, 660, 658, 656, 654, 652, 650, 648, 646, 644, 642, 641, 639, 637, 635,
+ 633, 631, 629, 627, 626, 624, 622, 620, 618, 616, 614, 612, 611, 609, 607,
+ 605, 603, 602, 600, 598, 596, 594, 592, 591, 589, 587, 585, 583, 582, 580,
+ 578, 576, 574, 573, 571, 569, 567, 566, 564, 562, 560, 559, 557, 555, 553,
+ 552, 550, 548, 546, 545, 543, 541, 540, 538, 536, 534, 533, 531, 529, 528,
+ 526, 524, 523, 521, 519, 518, 516, 514, 512, 511, 509, 508, 506, 504, 502,
+ 501, 499, 498, 496, 494, 493, 491, 489, 488, 486, 484, 483, 481, 480, 478,
+ 476, 475, 473, 472, 470, 468, 467, 465, 464, 462, 460, 459, 457, 456, 454,
+ 453, 451, 449, 448, 446, 445, 443, 442, 440, 438, 437, 435, 434, 432, 431,
+ 429, 428, 426, 425, 423, 422, 420, 419, 417, 416, 414, 412, 411, 410, 408,
+ 406, 405, 404, 402, 400, 399, 398, 396, 394, 393, 392, 390, 389, 387, 386,
+ 384, 383, 381, 380, 378, 377, 375, 374, 372, 371, 370, 368, 367, 365, 364,
+ 362, 361, 360, 358, 357, 355, 354, 352, 351, 350, 348, 347, 345, 344, 342,
+ 341, 340, 338, 337, 336, 334, 333, 331, 330, 328, 327, 326, 324, 323, 322,
+ 320, 319, 318, 316, 315, 313, 312, 311, 309, 308, 306, 305, 304, 302, 301,
+ 300, 298, 297, 296, 294, 293, 292, 290, 289, 288, 286, 285, 284, 282, 281,
+ 280, 278, 277, 276, 274, 273, 272, 270, 269, 268, 267, 265, 264, 263, 261,
+ 260, 259, 258, 256, 255, 254, 252, 251, 250, 248, 247, 246, 245, 243, 242,
+ 241, 240, 238, 237, 236, 234, 233, 232, 231, 229, 228, 227, 226, 224, 223,
+ 222, 221, 219, 218, 217, 216, 214, 213, 212, 211, 210, 208, 207, 206, 205,
+ 203, 202, 201, 200, 198, 197, 196, 195, 194, 192, 191, 190, 189, 188, 186,
+ 185, 184, 183, 182, 180, 179, 178, 177, 176, 174, 173, 172, 171, 170, 168,
+ 167, 166, 165, 164, 162, 161, 160, 159, 158, 157, 156, 154, 153, 152, 151,
+ 150, 148, 147, 146, 145, 144, 143, 142, 140, 139, 138, 137, 136, 135, 134,
+ 132, 131, 130, 129, 128, 127, 126, 124, 123, 122, 121, 120, 119, 118, 116,
+ 115, 114, 113, 112, 111, 110, 109, 108, 106, 105, 104, 103, 102, 101, 100,
+ 99, 98, 97, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 84, 83, 82, 81, 80, 79,
+ 78, 77, 76, 75, 74, 73, 72, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59,
+ 58, 57, 56, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39,
+ 38, 37, 36, 35, 34, 33, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19,
+ 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+
+/*
+ * Internal ln() function that does not check for specials, zero or one.
+ * Relative error: abs(result - log(a)) < 0.1 * 10**-prec * abs(log(a))
+ */
+static void
+_mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t varcontext, maxcontext;
+ mpd_t *z = (mpd_t *) result;
+ MPD_NEW_STATIC(v,0,0,0,0);
+ MPD_NEW_STATIC(vtmp,0,0,0,0);
+ MPD_NEW_STATIC(tmp,0,0,0,0);
+ mpd_ssize_t klist[MPD_MAX_PREC_LOG2];
+ mpd_ssize_t maxprec, shift, t;
+ mpd_ssize_t a_digits, a_exp;
+ mpd_uint_t dummy, x;
+ int i;
+
+ assert(!mpd_isspecial(a) && !mpd_iszerocoeff(a));
+
+ /*
+ * We are calculating ln(a) = ln(v * 10^t) = ln(v) + t*ln(10),
+ * where 0.5 < v <= 5.
+ */
+ if (!mpd_qcopy(&v, a, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+
+ /* Initial approximation: we have at least one non-zero digit */
+ _mpd_get_msdigits(&dummy, &x, &v, 3);
+ if (x < 10) x *= 10;
+ if (x < 100) x *= 10;
+ x -= 100;
+
+ /* a may equal z */
+ a_digits = a->digits;
+ a_exp = a->exp;
+
+ mpd_minalloc(z);
+ mpd_clear_flags(z);
+ z->data[0] = lnapprox[x];
+ z->len = 1;
+ z->exp = -3;
+ mpd_setdigits(z);
+
+ if (x <= 400) {
+ /* Reduce the input operand to 1.00 <= v <= 5.00. Let y = x + 100,
+ * so 100 <= y <= 500. Since y contains the most significant digits
+ * of v, y/100 <= v < (y+1)/100 and abs(z - log(v)) < 10**-2. */
+ v.exp = -(a_digits - 1);
+ t = a_exp + a_digits - 1;
+ }
+ else {
+ /* Reduce the input operand to 0.500 < v <= 0.999. Let y = x + 100,
+ * so 500 < y <= 999. Since y contains the most significant digits
+ * of v, y/1000 <= v < (y+1)/1000 and abs(z - log(v)) < 10**-2. */
+ v.exp = -a_digits;
+ t = a_exp + a_digits;
+ mpd_set_negative(z);
+ }
+
+ mpd_maxcontext(&maxcontext);
+ mpd_maxcontext(&varcontext);
+ varcontext.round = MPD_ROUND_TRUNC;
+
+ maxprec = ctx->prec + 2;
+ if (t == 0 && (x <= 15 || x >= 800)) {
+ /* 0.900 <= v <= 1.15: Estimate the magnitude of the logarithm.
+ * If ln(v) will underflow, skip the loop. Otherwise, adjust the
+ * precision upwards in order to obtain a sufficient number of
+ * significant digits.
+ *
+ * Case v > 1:
+ * abs((v-1)/10) < abs((v-1)/v) < abs(ln(v)) < abs(v-1)
+ * Case v < 1:
+ * abs(v-1) < abs(ln(v)) < abs((v-1)/v) < abs((v-1)*10)
+ */
+ int cmp = _mpd_cmp(&v, &one);
+
+ /* Upper bound (assume v > 1): abs(v-1), unrounded */
+ _mpd_qsub(&tmp, &v, &one, &maxcontext, &maxcontext.status);
+ if (maxcontext.status & MPD_Errors) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto finish;
+ }
+
+ if (cmp < 0) {
+ /* v < 1: abs((v-1)*10) */
+ tmp.exp += 1;
+ }
+ if (mpd_adjexp(&tmp) < mpd_etiny(ctx)) {
+ /* The upper bound is less than etiny: Underflow to zero */
+ _settriple(result, (cmp<0), 1, mpd_etiny(ctx)-1);
+ goto finish;
+ }
+ /* Lower bound: abs((v-1)/10) or abs(v-1) */
+ tmp.exp -= 1;
+ if (mpd_adjexp(&tmp) < 0) {
+ /* Absolute error of the loop: abs(z - log(v)) < 10**-p. If
+ * p = ctx->prec+2-adjexp(lower), then the relative error of
+ * the result is (using 10**adjexp(x) <= abs(x)):
+ *
+ * abs(z - log(v)) / abs(log(v)) < 10**-p / abs(log(v))
+ * <= 10**(-ctx->prec-2)
+ */
+ maxprec = maxprec - mpd_adjexp(&tmp);
+ }
+ }
+
+ i = ln_schedule_prec(klist, maxprec, 2);
+ for (; i >= 0; i--) {
+ varcontext.prec = 2*klist[i]+3;
+ z->flags ^= MPD_NEG;
+ _mpd_qexp(&tmp, z, &varcontext, status);
+ z->flags ^= MPD_NEG;
+
+ if (v.digits > varcontext.prec) {
+ shift = v.digits - varcontext.prec;
+ mpd_qshiftr(&vtmp, &v, shift, status);
+ vtmp.exp += shift;
+ mpd_qmul(&tmp, &vtmp, &tmp, &varcontext, status);
+ }
+ else {
+ mpd_qmul(&tmp, &v, &tmp, &varcontext, status);
+ }
+
+ mpd_qsub(&tmp, &tmp, &one, &maxcontext, status);
+ mpd_qadd(z, z, &tmp, &maxcontext, status);
+ if (mpd_isspecial(z)) {
+ break;
+ }
+ }
+
+ /*
+ * Case t == 0:
+ * t * log(10) == 0, the result does not change and the analysis
+ * above applies. If v < 0.900 or v > 1.15, the relative error is
+ * less than 10**(-ctx.prec-1).
+ * Case t != 0:
+ * z := approx(log(v))
+ * y := approx(log(10))
+ * p := maxprec = ctx->prec + 2
+ * Absolute errors:
+ * 1) abs(z - log(v)) < 10**-p
+ * 2) abs(y - log(10)) < 10**-p
+ * The multiplication is exact, so:
+ * 3) abs(t*y - t*log(10)) < t*10**-p
+ * The sum is exact, so:
+ * 4) abs((z + t*y) - (log(v) + t*log(10))) < (abs(t) + 1) * 10**-p
+ * Bounds for log(v) and log(10):
+ * 5) -7/10 < log(v) < 17/10
+ * 6) 23/10 < log(10) < 24/10
+ * Using 4), 5), 6) and t != 0, the relative error is:
+ *
+ * 7) relerr < ((abs(t) + 1)*10**-p) / abs(log(v) + t*log(10))
+ * < 0.5 * 10**(-p + 1) = 0.5 * 10**(-ctx->prec-1)
+ */
+ mpd_qln10(&v, maxprec+1, status);
+ mpd_qmul_ssize(&tmp, &v, t, &maxcontext, status);
+ mpd_qadd(result, &tmp, z, &maxcontext, status);
+
+
+finish:
+ *status |= (MPD_Inexact|MPD_Rounded);
+ mpd_del(&v);
+ mpd_del(&vtmp);
+ mpd_del(&tmp);
+}
+
+/* ln(a) */
+void
+mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ mpd_ssize_t adjexp, t;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ return;
+ }
+ if (mpd_iszerocoeff(a)) {
+ mpd_setspecial(result, MPD_NEG, MPD_INF);
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (_mpd_cmp(a, &one) == 0) {
+ _settriple(result, MPD_POS, 0, 0);
+ return;
+ }
+ /*
+ * Check if the result will overflow (0 < x, x != 1):
+ * 1) log10(x) < 0 iff adjexp(x) < 0
+ * 2) 0 < x /\ x <= y ==> adjexp(x) <= adjexp(y)
+ * 3) 0 < x /\ x != 1 ==> 2 * abs(log10(x)) < abs(log(x))
+ * 4) adjexp(x) <= log10(x) < adjexp(x) + 1
+ *
+ * Case adjexp(x) >= 0:
+ * 5) 2 * adjexp(x) < abs(log(x))
+ * Case adjexp(x) > 0:
+ * 6) adjexp(2 * adjexp(x)) <= adjexp(abs(log(x)))
+ * Case adjexp(x) == 0:
+ * mpd_exp_digits(t)-1 == 0 <= emax (the shortcut is not triggered)
+ *
+ * Case adjexp(x) < 0:
+ * 7) 2 * (-adjexp(x) - 1) < abs(log(x))
+ * Case adjexp(x) < -1:
+ * 8) adjexp(2 * (-adjexp(x) - 1)) <= adjexp(abs(log(x)))
+ * Case adjexp(x) == -1:
+ * mpd_exp_digits(t)-1 == 0 <= emax (the shortcut is not triggered)
+ */
+ adjexp = mpd_adjexp(a);
+ t = (adjexp < 0) ? -adjexp-1 : adjexp;
+ t *= 2;
+ if (mpd_exp_digits(t)-1 > ctx->emax) {
+ *status |= MPD_Overflow|MPD_Inexact|MPD_Rounded;
+ mpd_setspecial(result, (adjexp<0), MPD_INF);
+ return;
+ }
+
+ workctx = *ctx;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+
+ if (ctx->allcr) {
+ MPD_NEW_STATIC(t1, 0,0,0,0);
+ MPD_NEW_STATIC(t2, 0,0,0,0);
+ MPD_NEW_STATIC(ulp, 0,0,0,0);
+ MPD_NEW_STATIC(aa, 0,0,0,0);
+ mpd_ssize_t prec;
+
+ if (result == a) {
+ if (!mpd_qcopy(&aa, a, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ a = &aa;
+ }
+
+ workctx.clamp = 0;
+ prec = ctx->prec + 3;
+ while (1) {
+ workctx.prec = prec;
+ _mpd_qln(result, a, &workctx, status);
+ _ssettriple(&ulp, MPD_POS, 1,
+ result->exp + result->digits-workctx.prec);
+
+ workctx.prec = ctx->prec;
+ mpd_qadd(&t1, result, &ulp, &workctx, &workctx.status);
+ mpd_qsub(&t2, result, &ulp, &workctx, &workctx.status);
+ if (mpd_isspecial(result) || mpd_iszerocoeff(result) ||
+ mpd_qcmp(&t1, &t2, status) == 0) {
+ workctx.clamp = ctx->clamp;
+ mpd_check_underflow(result, &workctx, status);
+ mpd_qfinalize(result, &workctx, status);
+ break;
+ }
+ prec += MPD_RDIGITS;
+ }
+ mpd_del(&t1);
+ mpd_del(&t2);
+ mpd_del(&ulp);
+ mpd_del(&aa);
+ }
+ else {
+ _mpd_qln(result, a, &workctx, status);
+ mpd_check_underflow(result, &workctx, status);
+ mpd_qfinalize(result, &workctx, status);
+ }
+}
+
+/*
+ * Internal log10() function that does not check for specials, zero or one.
+ * Case SKIP_FINALIZE:
+ * Relative error: abs(result - log10(a)) < 0.1 * 10**-prec * abs(log10(a))
+ * Case DO_FINALIZE:
+ * Ulp error: abs(result - log10(a)) < ulp(log10(a))
+ */
+enum {SKIP_FINALIZE, DO_FINALIZE};
+static void
+_mpd_qlog10(int action, mpd_t *result, const mpd_t *a,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_STATIC(ln10,0,0,0,0);
+
+ mpd_maxcontext(&workctx);
+ workctx.prec = ctx->prec + 3;
+ /* relative error: 0.1 * 10**(-p-3). The specific underflow shortcut
+ * in _mpd_qln() does not change the final result. */
+ _mpd_qln(result, a, &workctx, status);
+ /* relative error: 5 * 10**(-p-3) */
+ mpd_qln10(&ln10, workctx.prec, status);
+
+ if (action == DO_FINALIZE) {
+ workctx = *ctx;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+ }
+ /* SKIP_FINALIZE: relative error: 5 * 10**(-p-3) */
+ _mpd_qdiv(NO_IDEAL_EXP, result, result, &ln10, &workctx, status);
+
+ mpd_del(&ln10);
+}
+
+/* log10(a) */
+void
+mpd_qlog10(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ mpd_ssize_t adjexp, t;
+
+ workctx = *ctx;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ return;
+ }
+ if (mpd_iszerocoeff(a)) {
+ mpd_setspecial(result, MPD_NEG, MPD_INF);
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_coeff_ispow10(a)) {
+ uint8_t sign = 0;
+ adjexp = mpd_adjexp(a);
+ if (adjexp < 0) {
+ sign = 1;
+ adjexp = -adjexp;
+ }
+ _settriple(result, sign, adjexp, 0);
+ mpd_qfinalize(result, &workctx, status);
+ return;
+ }
+ /*
+ * Check if the result will overflow (0 < x, x != 1):
+ * 1) log10(x) < 0 iff adjexp(x) < 0
+ * 2) 0 < x /\ x <= y ==> adjexp(x) <= adjexp(y)
+ * 3) adjexp(x) <= log10(x) < adjexp(x) + 1
+ *
+ * Case adjexp(x) >= 0:
+ * 4) adjexp(x) <= abs(log10(x))
+ * Case adjexp(x) > 0:
+ * 5) adjexp(adjexp(x)) <= adjexp(abs(log10(x)))
+ * Case adjexp(x) == 0:
+ * mpd_exp_digits(t)-1 == 0 <= emax (the shortcut is not triggered)
+ *
+ * Case adjexp(x) < 0:
+ * 6) -adjexp(x) - 1 < abs(log10(x))
+ * Case adjexp(x) < -1:
+ * 7) adjexp(-adjexp(x) - 1) <= adjexp(abs(log(x)))
+ * Case adjexp(x) == -1:
+ * mpd_exp_digits(t)-1 == 0 <= emax (the shortcut is not triggered)
+ */
+ adjexp = mpd_adjexp(a);
+ t = (adjexp < 0) ? -adjexp-1 : adjexp;
+ if (mpd_exp_digits(t)-1 > ctx->emax) {
+ *status |= MPD_Overflow|MPD_Inexact|MPD_Rounded;
+ mpd_setspecial(result, (adjexp<0), MPD_INF);
+ return;
+ }
+
+ if (ctx->allcr) {
+ MPD_NEW_STATIC(t1, 0,0,0,0);
+ MPD_NEW_STATIC(t2, 0,0,0,0);
+ MPD_NEW_STATIC(ulp, 0,0,0,0);
+ MPD_NEW_STATIC(aa, 0,0,0,0);
+ mpd_ssize_t prec;
+
+ if (result == a) {
+ if (!mpd_qcopy(&aa, a, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ a = &aa;
+ }
+
+ workctx.clamp = 0;
+ prec = ctx->prec + 3;
+ while (1) {
+ workctx.prec = prec;
+ _mpd_qlog10(SKIP_FINALIZE, result, a, &workctx, status);
+ _ssettriple(&ulp, MPD_POS, 1,
+ result->exp + result->digits-workctx.prec);
+
+ workctx.prec = ctx->prec;
+ mpd_qadd(&t1, result, &ulp, &workctx, &workctx.status);
+ mpd_qsub(&t2, result, &ulp, &workctx, &workctx.status);
+ if (mpd_isspecial(result) || mpd_iszerocoeff(result) ||
+ mpd_qcmp(&t1, &t2, status) == 0) {
+ workctx.clamp = ctx->clamp;
+ mpd_check_underflow(result, &workctx, status);
+ mpd_qfinalize(result, &workctx, status);
+ break;
+ }
+ prec += MPD_RDIGITS;
+ }
+ mpd_del(&t1);
+ mpd_del(&t2);
+ mpd_del(&ulp);
+ mpd_del(&aa);
+ }
+ else {
+ _mpd_qlog10(DO_FINALIZE, result, a, &workctx, status);
+ mpd_check_underflow(result, &workctx, status);
+ }
+}
+
+/*
+ * Maximum of the two operands. Attention: If one operand is a quiet NaN and the
+ * other is numeric, the numeric operand is returned. This may not be what one
+ * expects.
+ */
+void
+mpd_qmax(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isqnan(a) && !mpd_isnan(b)) {
+ mpd_qcopy(result, b, status);
+ }
+ else if (mpd_isqnan(b) && !mpd_isnan(a)) {
+ mpd_qcopy(result, a, status);
+ }
+ else if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ else {
+ c = _mpd_cmp(a, b);
+ if (c == 0) {
+ c = _mpd_cmp_numequal(a, b);
+ }
+
+ if (c < 0) {
+ mpd_qcopy(result, b, status);
+ }
+ else {
+ mpd_qcopy(result, a, status);
+ }
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/*
+ * Maximum magnitude: Same as mpd_max(), but compares the operands with their
+ * sign ignored.
+ */
+void
+mpd_qmax_mag(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isqnan(a) && !mpd_isnan(b)) {
+ mpd_qcopy(result, b, status);
+ }
+ else if (mpd_isqnan(b) && !mpd_isnan(a)) {
+ mpd_qcopy(result, a, status);
+ }
+ else if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ else {
+ c = _mpd_cmp_abs(a, b);
+ if (c == 0) {
+ c = _mpd_cmp_numequal(a, b);
+ }
+
+ if (c < 0) {
+ mpd_qcopy(result, b, status);
+ }
+ else {
+ mpd_qcopy(result, a, status);
+ }
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/*
+ * Minimum of the two operands. Attention: If one operand is a quiet NaN and the
+ * other is numeric, the numeric operand is returned. This may not be what one
+ * expects.
+ */
+void
+mpd_qmin(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isqnan(a) && !mpd_isnan(b)) {
+ mpd_qcopy(result, b, status);
+ }
+ else if (mpd_isqnan(b) && !mpd_isnan(a)) {
+ mpd_qcopy(result, a, status);
+ }
+ else if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ else {
+ c = _mpd_cmp(a, b);
+ if (c == 0) {
+ c = _mpd_cmp_numequal(a, b);
+ }
+
+ if (c < 0) {
+ mpd_qcopy(result, a, status);
+ }
+ else {
+ mpd_qcopy(result, b, status);
+ }
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/*
+ * Minimum magnitude: Same as mpd_min(), but compares the operands with their
+ * sign ignored.
+ */
+void
+mpd_qmin_mag(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_isqnan(a) && !mpd_isnan(b)) {
+ mpd_qcopy(result, b, status);
+ }
+ else if (mpd_isqnan(b) && !mpd_isnan(a)) {
+ mpd_qcopy(result, a, status);
+ }
+ else if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ else {
+ c = _mpd_cmp_abs(a, b);
+ if (c == 0) {
+ c = _mpd_cmp_numequal(a, b);
+ }
+
+ if (c < 0) {
+ mpd_qcopy(result, a, status);
+ }
+ else {
+ mpd_qcopy(result, b, status);
+ }
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* Minimum space needed for the result array in _karatsuba_rec(). */
+static inline mpd_size_t
+_kmul_resultsize(mpd_size_t la, mpd_size_t lb)
+{
+ mpd_size_t n, m;
+
+ n = add_size_t(la, lb);
+ n = add_size_t(n, 1);
+
+ m = (la+1)/2 + 1;
+ m = mul_size_t(m, 3);
+
+ return (m > n) ? m : n;
+}
+
+/* Work space needed in _karatsuba_rec(). lim >= 4 */
+static inline mpd_size_t
+_kmul_worksize(mpd_size_t n, mpd_size_t lim)
+{
+ mpd_size_t m;
+
+ if (n <= lim) {
+ return 0;
+ }
+
+ m = (n+1)/2 + 1;
+
+ return add_size_t(mul_size_t(m, 2), _kmul_worksize(m, lim));
+}
+
+
+#define MPD_KARATSUBA_BASECASE 16 /* must be >= 4 */
+
+/*
+ * Add the product of a and b to c.
+ * c must be _kmul_resultsize(la, lb) in size.
+ * w is used as a work array and must be _kmul_worksize(a, lim) in size.
+ * Roman E. Maeder, Storage Allocation for the Karatsuba Integer Multiplication
+ * Algorithm. In "Design and implementation of symbolic computation systems",
+ * Springer, 1993, ISBN 354057235X, 9783540572350.
+ */
+static void
+_karatsuba_rec(mpd_uint_t *c, const mpd_uint_t *a, const mpd_uint_t *b,
+ mpd_uint_t *w, mpd_size_t la, mpd_size_t lb)
+{
+ mpd_size_t m, lt;
+
+ assert(la >= lb && lb > 0);
+ assert(la <= MPD_KARATSUBA_BASECASE || w != NULL);
+
+ if (la <= MPD_KARATSUBA_BASECASE) {
+ _mpd_basemul(c, a, b, la, lb);
+ return;
+ }
+
+ m = (la+1)/2; /* ceil(la/2) */
+
+ /* lb <= m < la */
+ if (lb <= m) {
+
+ /* lb can now be larger than la-m */
+ if (lb > la-m) {
+ lt = lb + lb + 1; /* space needed for result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ _karatsuba_rec(w, b, a+m, w+lt, lb, la-m); /* b*ah */
+ }
+ else {
+ lt = (la-m) + (la-m) + 1; /* space needed for result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ _karatsuba_rec(w, a+m, b, w+lt, la-m, lb); /* ah*b */
+ }
+ _mpd_baseaddto(c+m, w, (la-m)+lb); /* add ah*b*B**m */
+
+ lt = m + m + 1; /* space needed for the result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ _karatsuba_rec(w, a, b, w+lt, m, lb); /* al*b */
+ _mpd_baseaddto(c, w, m+lb); /* add al*b */
+
+ return;
+ }
+
+ /* la >= lb > m */
+ memcpy(w, a, m * sizeof *w);
+ w[m] = 0;
+ _mpd_baseaddto(w, a+m, la-m);
+
+ memcpy(w+(m+1), b, m * sizeof *w);
+ w[m+1+m] = 0;
+ _mpd_baseaddto(w+(m+1), b+m, lb-m);
+
+ _karatsuba_rec(c+m, w, w+(m+1), w+2*(m+1), m+1, m+1);
+
+ lt = (la-m) + (la-m) + 1;
+ mpd_uint_zero(w, lt);
+
+ _karatsuba_rec(w, a+m, b+m, w+lt, la-m, lb-m);
+
+ _mpd_baseaddto(c+2*m, w, (la-m) + (lb-m));
+ _mpd_basesubfrom(c+m, w, (la-m) + (lb-m));
+
+ lt = m + m + 1;
+ mpd_uint_zero(w, lt);
+
+ _karatsuba_rec(w, a, b, w+lt, m, m);
+ _mpd_baseaddto(c, w, m+m);
+ _mpd_basesubfrom(c+m, w, m+m);
+
+ return;
+}
+
+/*
+ * Multiply u and v, using Karatsuba multiplication. Returns a pointer
+ * to the result or NULL in case of failure (malloc error).
+ * Conditions: ulen >= vlen, ulen >= 4
+ */
+mpd_uint_t *
+_mpd_kmul(const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t ulen, mpd_size_t vlen,
+ mpd_size_t *rsize)
+{
+ mpd_uint_t *result = NULL, *w = NULL;
+ mpd_size_t m;
+
+ assert(ulen >= 4);
+ assert(ulen >= vlen);
+
+ *rsize = _kmul_resultsize(ulen, vlen);
+ if ((result = mpd_calloc(*rsize, sizeof *result)) == NULL) {
+ return NULL;
+ }
+
+ m = _kmul_worksize(ulen, MPD_KARATSUBA_BASECASE);
+ if (m && ((w = mpd_calloc(m, sizeof *w)) == NULL)) {
+ mpd_free(result);
+ return NULL;
+ }
+
+ _karatsuba_rec(result, u, v, w, ulen, vlen);
+
+
+ if (w) mpd_free(w);
+ return result;
+}
+
+
+/*
+ * Determine the minimum length for the number theoretic transform. Valid
+ * transform lengths are 2**n or 3*2**n, where 2**n <= MPD_MAXTRANSFORM_2N.
+ * The function finds the shortest length m such that rsize <= m.
+ */
+static inline mpd_size_t
+_mpd_get_transform_len(mpd_size_t rsize)
+{
+ mpd_size_t log2rsize;
+ mpd_size_t x, step;
+
+ assert(rsize >= 4);
+ log2rsize = mpd_bsr(rsize);
+
+ if (rsize <= 1024) {
+ /* 2**n is faster in this range. */
+ x = ((mpd_size_t)1)<<log2rsize;
+ return (rsize == x) ? x : x<<1;
+ }
+ else if (rsize <= MPD_MAXTRANSFORM_2N) {
+ x = ((mpd_size_t)1)<<log2rsize;
+ if (rsize == x) return x;
+ step = x>>1;
+ x += step;
+ return (rsize <= x) ? x : x + step;
+ }
+ else if (rsize <= MPD_MAXTRANSFORM_2N+MPD_MAXTRANSFORM_2N/2) {
+ return MPD_MAXTRANSFORM_2N+MPD_MAXTRANSFORM_2N/2;
+ }
+ else if (rsize <= 3*MPD_MAXTRANSFORM_2N) {
+ return 3*MPD_MAXTRANSFORM_2N;
+ }
+ else {
+ return MPD_SIZE_MAX;
+ }
+}
+
+#ifdef PPRO
+#ifndef _MSC_VER
+static inline unsigned short
+_mpd_get_control87(void)
+{
+ unsigned short cw;
+
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
+ return cw;
+}
+
+static inline void
+_mpd_set_control87(unsigned short cw)
+{
+ __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+}
+#endif
+
+unsigned int
+mpd_set_fenv(void)
+{
+ unsigned int cw;
+#ifdef _MSC_VER
+ unsigned int flags =
+ _EM_INVALID|_EM_DENORMAL|_EM_ZERODIVIDE|_EM_OVERFLOW|
+ _EM_UNDERFLOW|_EM_INEXACT|_RC_CHOP|_PC_64;
+ unsigned int mask = _MCW_EM|_MCW_RC|_MCW_PC;
+ unsigned int dummy;
+
+ __control87_2(0, 0, &cw, NULL);
+ __control87_2(flags, mask, &dummy, NULL);
+#else
+ cw = _mpd_get_control87();
+ _mpd_set_control87(cw|0xF3F);
+#endif
+ return cw;
+}
+
+void
+mpd_restore_fenv(unsigned int cw)
+{
+#ifdef _MSC_VER
+ unsigned int mask = _MCW_EM|_MCW_RC|_MCW_PC;
+ unsigned int dummy;
+
+ __control87_2(cw, mask, &dummy, NULL);
+#else
+ _mpd_set_control87((unsigned short)cw);
+#endif
+}
+#endif /* PPRO */
+
+/*
+ * Multiply u and v, using the fast number theoretic transform. Returns
+ * a pointer to the result or NULL in case of failure (malloc error).
+ */
+mpd_uint_t *
+_mpd_fntmul(const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t ulen, mpd_size_t vlen,
+ mpd_size_t *rsize)
+{
+ mpd_uint_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *vtmp = NULL;
+ mpd_size_t n;
+
+#ifdef PPRO
+ unsigned int cw;
+ cw = mpd_set_fenv();
+#endif
+
+ *rsize = add_size_t(ulen, vlen);
+ if ((n = _mpd_get_transform_len(*rsize)) == MPD_SIZE_MAX) {
+ goto malloc_error;
+ }
+
+ if ((c1 = mpd_calloc(n, sizeof *c1)) == NULL) {
+ goto malloc_error;
+ }
+ if ((c2 = mpd_calloc(n, sizeof *c2)) == NULL) {
+ goto malloc_error;
+ }
+ if ((c3 = mpd_calloc(n, sizeof *c3)) == NULL) {
+ goto malloc_error;
+ }
+
+ memcpy(c1, u, ulen * (sizeof *c1));
+ memcpy(c2, u, ulen * (sizeof *c2));
+ memcpy(c3, u, ulen * (sizeof *c3));
+
+ if (u == v) {
+ if (!fnt_autoconvolute(c1, n, P1) ||
+ !fnt_autoconvolute(c2, n, P2) ||
+ !fnt_autoconvolute(c3, n, P3)) {
+ goto malloc_error;
+ }
+ }
+ else {
+ if ((vtmp = mpd_calloc(n, sizeof *vtmp)) == NULL) {
+ goto malloc_error;
+ }
+
+ memcpy(vtmp, v, vlen * (sizeof *vtmp));
+ if (!fnt_convolute(c1, vtmp, n, P1)) {
+ mpd_free(vtmp);
+ goto malloc_error;
+ }
+
+ memcpy(vtmp, v, vlen * (sizeof *vtmp));
+ mpd_uint_zero(vtmp+vlen, n-vlen);
+ if (!fnt_convolute(c2, vtmp, n, P2)) {
+ mpd_free(vtmp);
+ goto malloc_error;
+ }
+
+ memcpy(vtmp, v, vlen * (sizeof *vtmp));
+ mpd_uint_zero(vtmp+vlen, n-vlen);
+ if (!fnt_convolute(c3, vtmp, n, P3)) {
+ mpd_free(vtmp);
+ goto malloc_error;
+ }
+
+ mpd_free(vtmp);
+ }
+
+ crt3(c1, c2, c3, *rsize);
+
+out:
+#ifdef PPRO
+ mpd_restore_fenv(cw);
+#endif
+ if (c2) mpd_free(c2);
+ if (c3) mpd_free(c3);
+ return c1;
+
+malloc_error:
+ if (c1) mpd_free(c1);
+ c1 = NULL;
+ goto out;
+}
+
+
+/*
+ * Karatsuba multiplication with FNT/basemul as the base case.
+ */
+static int
+_karatsuba_rec_fnt(mpd_uint_t *c, const mpd_uint_t *a, const mpd_uint_t *b,
+ mpd_uint_t *w, mpd_size_t la, mpd_size_t lb)
+{
+ mpd_size_t m, lt;
+
+ assert(la >= lb && lb > 0);
+ assert(la <= 3*(MPD_MAXTRANSFORM_2N/2) || w != NULL);
+
+ if (la <= 3*(MPD_MAXTRANSFORM_2N/2)) {
+
+ if (lb <= 192) {
+ _mpd_basemul(c, b, a, lb, la);
+ }
+ else {
+ mpd_uint_t *result;
+ mpd_size_t dummy;
+
+ if ((result = _mpd_fntmul(a, b, la, lb, &dummy)) == NULL) {
+ return 0;
+ }
+ memcpy(c, result, (la+lb) * (sizeof *result));
+ mpd_free(result);
+ }
+ return 1;
+ }
+
+ m = (la+1)/2; /* ceil(la/2) */
+
+ /* lb <= m < la */
+ if (lb <= m) {
+
+ /* lb can now be larger than la-m */
+ if (lb > la-m) {
+ lt = lb + lb + 1; /* space needed for result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ if (!_karatsuba_rec_fnt(w, b, a+m, w+lt, lb, la-m)) { /* b*ah */
+ return 0; /* GCOV_UNLIKELY */
+ }
+ }
+ else {
+ lt = (la-m) + (la-m) + 1; /* space needed for result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ if (!_karatsuba_rec_fnt(w, a+m, b, w+lt, la-m, lb)) { /* ah*b */
+ return 0; /* GCOV_UNLIKELY */
+ }
+ }
+ _mpd_baseaddto(c+m, w, (la-m)+lb); /* add ah*b*B**m */
+
+ lt = m + m + 1; /* space needed for the result array */
+ mpd_uint_zero(w, lt); /* clear result array */
+ if (!_karatsuba_rec_fnt(w, a, b, w+lt, m, lb)) { /* al*b */
+ return 0; /* GCOV_UNLIKELY */
+ }
+ _mpd_baseaddto(c, w, m+lb); /* add al*b */
+
+ return 1;
+ }
+
+ /* la >= lb > m */
+ memcpy(w, a, m * sizeof *w);
+ w[m] = 0;
+ _mpd_baseaddto(w, a+m, la-m);
+
+ memcpy(w+(m+1), b, m * sizeof *w);
+ w[m+1+m] = 0;
+ _mpd_baseaddto(w+(m+1), b+m, lb-m);
+
+ if (!_karatsuba_rec_fnt(c+m, w, w+(m+1), w+2*(m+1), m+1, m+1)) {
+ return 0; /* GCOV_UNLIKELY */
+ }
+
+ lt = (la-m) + (la-m) + 1;
+ mpd_uint_zero(w, lt);
+
+ if (!_karatsuba_rec_fnt(w, a+m, b+m, w+lt, la-m, lb-m)) {
+ return 0; /* GCOV_UNLIKELY */
+ }
+
+ _mpd_baseaddto(c+2*m, w, (la-m) + (lb-m));
+ _mpd_basesubfrom(c+m, w, (la-m) + (lb-m));
+
+ lt = m + m + 1;
+ mpd_uint_zero(w, lt);
+
+ if (!_karatsuba_rec_fnt(w, a, b, w+lt, m, m)) {
+ return 0; /* GCOV_UNLIKELY */
+ }
+ _mpd_baseaddto(c, w, m+m);
+ _mpd_basesubfrom(c+m, w, m+m);
+
+ return 1;
+}
+
+/*
+ * Multiply u and v, using Karatsuba multiplication with the FNT as the
+ * base case. Returns a pointer to the result or NULL in case of failure
+ * (malloc error). Conditions: ulen >= vlen, ulen >= 4.
+ */
+mpd_uint_t *
+_mpd_kmul_fnt(const mpd_uint_t *u, const mpd_uint_t *v,
+ mpd_size_t ulen, mpd_size_t vlen,
+ mpd_size_t *rsize)
+{
+ mpd_uint_t *result = NULL, *w = NULL;
+ mpd_size_t m;
+
+ assert(ulen >= 4);
+ assert(ulen >= vlen);
+
+ *rsize = _kmul_resultsize(ulen, vlen);
+ if ((result = mpd_calloc(*rsize, sizeof *result)) == NULL) {
+ return NULL;
+ }
+
+ m = _kmul_worksize(ulen, 3*(MPD_MAXTRANSFORM_2N/2));
+ if (m && ((w = mpd_calloc(m, sizeof *w)) == NULL)) {
+ mpd_free(result); /* GCOV_UNLIKELY */
+ return NULL; /* GCOV_UNLIKELY */
+ }
+
+ if (!_karatsuba_rec_fnt(result, u, v, w, ulen, vlen)) {
+ mpd_free(result);
+ result = NULL;
+ }
+
+
+ if (w) mpd_free(w);
+ return result;
+}
+
+
+/* Deal with the special cases of multiplying infinities. */
+static void
+_mpd_qmul_inf(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t *status)
+{
+ if (mpd_isinfinite(a)) {
+ if (mpd_iszero(b)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+ else {
+ mpd_setspecial(result, mpd_sign(a)^mpd_sign(b), MPD_INF);
+ }
+ return;
+ }
+ assert(mpd_isinfinite(b));
+ if (mpd_iszero(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+ else {
+ mpd_setspecial(result, mpd_sign(a)^mpd_sign(b), MPD_INF);
+ }
+}
+
+/*
+ * Internal function: Multiply a and b. _mpd_qmul deals with specials but
+ * does NOT finalize the result. This is for use in mpd_fma().
+ */
+static inline void
+_mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_t *big = (mpd_t *)a, *small = (mpd_t *)b;
+ mpd_uint_t *rdata = NULL;
+ mpd_uint_t rbuf[MPD_MINALLOC_MAX];
+ mpd_size_t rsize, i;
+
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ _mpd_qmul_inf(result, a, b, status);
+ return;
+ }
+
+ if (small->len > big->len) {
+ _mpd_ptrswap(&big, &small);
+ }
+
+ rsize = big->len + small->len;
+
+ if (big->len == 1) {
+ _mpd_singlemul(result->data, big->data[0], small->data[0]);
+ goto finish;
+ }
+ if (rsize <= (mpd_size_t)MPD_MINALLOC_MAX) {
+ if (big->len == 2) {
+ _mpd_mul_2_le2(rbuf, big->data, small->data, small->len);
+ }
+ else {
+ mpd_uint_zero(rbuf, rsize);
+ if (small->len == 1) {
+ _mpd_shortmul(rbuf, big->data, big->len, small->data[0]);
+ }
+ else {
+ _mpd_basemul(rbuf, small->data, big->data, small->len, big->len);
+ }
+ }
+ if (!mpd_qresize(result, rsize, status)) {
+ return;
+ }
+ for(i = 0; i < rsize; i++) {
+ result->data[i] = rbuf[i];
+ }
+ goto finish;
+ }
+
+
+ if (small->len <= 256) {
+ rdata = mpd_calloc(rsize, sizeof *rdata);
+ if (rdata != NULL) {
+ if (small->len == 1) {
+ _mpd_shortmul(rdata, big->data, big->len, small->data[0]);
+ }
+ else {
+ _mpd_basemul(rdata, small->data, big->data, small->len, big->len);
+ }
+ }
+ }
+ else if (rsize <= 1024) {
+ rdata = _mpd_kmul(big->data, small->data, big->len, small->len, &rsize);
+ }
+ else if (rsize <= 3*MPD_MAXTRANSFORM_2N) {
+ rdata = _mpd_fntmul(big->data, small->data, big->len, small->len, &rsize);
+ }
+ else {
+ rdata = _mpd_kmul_fnt(big->data, small->data, big->len, small->len, &rsize);
+ }
+
+ if (rdata == NULL) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+
+ if (mpd_isdynamic_data(result)) {
+ mpd_free(result->data);
+ }
+ result->data = rdata;
+ result->alloc = rsize;
+ mpd_set_dynamic_data(result);
+
+
+finish:
+ mpd_set_flags(result, mpd_sign(a)^mpd_sign(b));
+ result->exp = big->exp + small->exp;
+ result->len = _mpd_real_size(result->data, rsize);
+ /* resize to smaller cannot fail */
+ mpd_qresize(result, result->len, status);
+ mpd_setdigits(result);
+}
+
+/* Multiply a and b. */
+void
+mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ _mpd_qmul(result, a, b, ctx, status);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* Multiply a and b. Set NaN/Invalid_operation if the result is inexact. */
+static void
+_mpd_qmul_exact(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+
+ mpd_qmul(result, a, b, ctx, &workstatus);
+ *status |= workstatus;
+ if (workstatus & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+}
+
+/* Multiply decimal and mpd_ssize_t. */
+void
+mpd_qmul_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_ssize(&bb, b, &maxcontext, status);
+ mpd_qmul(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+/* Multiply decimal and mpd_uint_t. */
+void
+mpd_qmul_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(bb,0,0,0,0);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_qsset_uint(&bb, b, &maxcontext, status);
+ mpd_qmul(result, a, &bb, ctx, status);
+ mpd_del(&bb);
+}
+
+void
+mpd_qmul_i32(mpd_t *result, const mpd_t *a, int32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qmul_ssize(result, a, b, ctx, status);
+}
+
+void
+mpd_qmul_u32(mpd_t *result, const mpd_t *a, uint32_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qmul_uint(result, a, b, ctx, status);
+}
+
+#ifdef CONFIG_64
+void
+mpd_qmul_i64(mpd_t *result, const mpd_t *a, int64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qmul_ssize(result, a, b, ctx, status);
+}
+
+void
+mpd_qmul_u64(mpd_t *result, const mpd_t *a, uint64_t b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_qmul_uint(result, a, b, ctx, status);
+}
+#endif
+
+/* Like the minus operator. */
+void
+mpd_qminus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ }
+
+ if (mpd_iszero(a) && ctx->round != MPD_ROUND_FLOOR) {
+ mpd_qcopy_abs(result, a, status);
+ }
+ else {
+ mpd_qcopy_negate(result, a, status);
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* Like the plus operator. */
+void
+mpd_qplus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ }
+
+ if (mpd_iszero(a) && ctx->round != MPD_ROUND_FLOOR) {
+ mpd_qcopy_abs(result, a, status);
+ }
+ else {
+ mpd_qcopy(result, a, status);
+ }
+
+ mpd_qfinalize(result, ctx, status);
+}
+
+/* The largest representable number that is smaller than the operand. */
+void
+mpd_qnext_minus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_CONST(tiny,MPD_POS,mpd_etiny(ctx)-1,1,1,1,1);
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+
+ assert(mpd_isinfinite(a));
+ if (mpd_isnegative(a)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+ else {
+ mpd_clear_flags(result);
+ mpd_qmaxcoeff(result, ctx, status);
+ if (mpd_isnan(result)) {
+ return;
+ }
+ result->exp = mpd_etop(ctx);
+ return;
+ }
+ }
+
+ mpd_workcontext(&workctx, ctx);
+ workctx.round = MPD_ROUND_FLOOR;
+
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+
+ mpd_qfinalize(result, &workctx, &workctx.status);
+ if (workctx.status&(MPD_Inexact|MPD_Errors)) {
+ *status |= (workctx.status&MPD_Errors);
+ return;
+ }
+
+ workctx.status = 0;
+ mpd_qsub(result, a, &tiny, &workctx, &workctx.status);
+ *status |= (workctx.status&MPD_Errors);
+}
+
+/* The smallest representable number that is larger than the operand. */
+void
+mpd_qnext_plus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_CONST(tiny,MPD_POS,mpd_etiny(ctx)-1,1,1,1,1);
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+
+ assert(mpd_isinfinite(a));
+ if (mpd_ispositive(a)) {
+ mpd_qcopy(result, a, status);
+ }
+ else {
+ mpd_clear_flags(result);
+ mpd_qmaxcoeff(result, ctx, status);
+ if (mpd_isnan(result)) {
+ return;
+ }
+ mpd_set_flags(result, MPD_NEG);
+ result->exp = mpd_etop(ctx);
+ }
+ return;
+ }
+
+ mpd_workcontext(&workctx, ctx);
+ workctx.round = MPD_ROUND_CEILING;
+
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+
+ mpd_qfinalize(result, &workctx, &workctx.status);
+ if (workctx.status & (MPD_Inexact|MPD_Errors)) {
+ *status |= (workctx.status&MPD_Errors);
+ return;
+ }
+
+ workctx.status = 0;
+ mpd_qadd(result, a, &tiny, &workctx, &workctx.status);
+ *status |= (workctx.status&MPD_Errors);
+}
+
+/*
+ * The number closest to the first operand that is in the direction towards
+ * the second operand.
+ */
+void
+mpd_qnext_toward(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ int c;
+
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+
+ c = _mpd_cmp(a, b);
+ if (c == 0) {
+ mpd_qcopy_sign(result, a, b, status);
+ return;
+ }
+
+ if (c < 0) {
+ mpd_qnext_plus(result, a, ctx, status);
+ }
+ else {
+ mpd_qnext_minus(result, a, ctx, status);
+ }
+
+ if (mpd_isinfinite(result)) {
+ *status |= (MPD_Overflow|MPD_Rounded|MPD_Inexact);
+ }
+ else if (mpd_adjexp(result) < ctx->emin) {
+ *status |= (MPD_Underflow|MPD_Subnormal|MPD_Rounded|MPD_Inexact);
+ if (mpd_iszero(result)) {
+ *status |= MPD_Clamped;
+ }
+ }
+}
+
+/*
+ * Internal function: Integer power with mpd_uint_t exponent. The function
+ * can fail with MPD_Malloc_error.
+ *
+ * The error is equal to the error incurred in k-1 multiplications. Assuming
+ * the upper bound for the relative error in each operation:
+ *
+ * abs(err) = 5 * 10**-prec
+ * result = x**k * (1 + err)**(k-1)
+ */
+static inline void
+_mpd_qpow_uint(mpd_t *result, const mpd_t *base, mpd_uint_t exp,
+ uint8_t resultsign, const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_uint_t n;
+
+ if (exp == 0) {
+ _settriple(result, resultsign, 1, 0); /* GCOV_NOT_REACHED */
+ return; /* GCOV_NOT_REACHED */
+ }
+
+ if (!mpd_qcopy(result, base, status)) {
+ return;
+ }
+
+ n = mpd_bits[mpd_bsr(exp)];
+ while (n >>= 1) {
+ mpd_qmul(result, result, result, ctx, &workstatus);
+ if (exp & n) {
+ mpd_qmul(result, result, base, ctx, &workstatus);
+ }
+ if (mpd_isspecial(result) ||
+ (mpd_iszerocoeff(result) && (workstatus & MPD_Clamped))) {
+ break;
+ }
+ }
+
+ *status |= workstatus;
+ mpd_set_sign(result, resultsign);
+}
+
+/*
+ * Internal function: Integer power with mpd_t exponent, tbase and texp
+ * are modified!! Function can fail with MPD_Malloc_error.
+ *
+ * The error is equal to the error incurred in k multiplications. Assuming
+ * the upper bound for the relative error in each operation:
+ *
+ * abs(err) = 5 * 10**-prec
+ * result = x**k * (1 + err)**k
+ */
+static inline void
+_mpd_qpow_mpd(mpd_t *result, mpd_t *tbase, mpd_t *texp, uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_context_t maxctx;
+ MPD_NEW_CONST(two,0,0,1,1,1,2);
+
+
+ mpd_maxcontext(&maxctx);
+
+ /* resize to smaller cannot fail */
+ mpd_qcopy(result, &one, status);
+
+ while (!mpd_iszero(texp)) {
+ if (mpd_isodd(texp)) {
+ mpd_qmul(result, result, tbase, ctx, &workstatus);
+ *status |= workstatus;
+ if (mpd_isspecial(result) ||
+ (mpd_iszerocoeff(result) && (workstatus & MPD_Clamped))) {
+ break;
+ }
+ }
+ mpd_qmul(tbase, tbase, tbase, ctx, &workstatus);
+ mpd_qdivint(texp, texp, &two, &maxctx, &workstatus);
+ if (mpd_isnan(tbase) || mpd_isnan(texp)) {
+ mpd_seterror(result, workstatus&MPD_Errors, status);
+ return;
+ }
+ }
+ mpd_set_sign(result, resultsign);
+}
+
+/*
+ * The power function for integer exponents. Relative error _before_ the
+ * final rounding to prec:
+ * abs(result - base**exp) < 0.1 * 10**-prec * abs(base**exp)
+ */
+static void
+_mpd_qpow_int(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_STATIC(tbase,0,0,0,0);
+ MPD_NEW_STATIC(texp,0,0,0,0);
+ mpd_ssize_t n;
+
+
+ mpd_workcontext(&workctx, ctx);
+ workctx.prec += (exp->digits + exp->exp + 2);
+ workctx.round = MPD_ROUND_HALF_EVEN;
+ workctx.clamp = 0;
+ if (mpd_isnegative(exp)) {
+ workctx.prec += 1;
+ mpd_qdiv(&tbase, &one, base, &workctx, status);
+ if (*status&MPD_Errors) {
+ mpd_setspecial(result, MPD_POS, MPD_NAN);
+ goto finish;
+ }
+ }
+ else {
+ if (!mpd_qcopy(&tbase, base, status)) {
+ mpd_setspecial(result, MPD_POS, MPD_NAN);
+ goto finish;
+ }
+ }
+
+ n = mpd_qabs_uint(exp, &workctx.status);
+ if (workctx.status&MPD_Invalid_operation) {
+ if (!mpd_qcopy(&texp, exp, status)) {
+ mpd_setspecial(result, MPD_POS, MPD_NAN); /* GCOV_UNLIKELY */
+ goto finish; /* GCOV_UNLIKELY */
+ }
+ _mpd_qpow_mpd(result, &tbase, &texp, resultsign, &workctx, status);
+ }
+ else {
+ _mpd_qpow_uint(result, &tbase, n, resultsign, &workctx, status);
+ }
+
+ if (mpd_isinfinite(result)) {
+ /* for ROUND_DOWN, ROUND_FLOOR, etc. */
+ _settriple(result, resultsign, 1, MPD_EXP_INF);
+ }
+
+finish:
+ mpd_del(&tbase);
+ mpd_del(&texp);
+ mpd_qfinalize(result, ctx, status);
+}
+
+/*
+ * If the exponent is infinite and base equals one, the result is one
+ * with a coefficient of length prec. Otherwise, result is undefined.
+ * Return the value of the comparison against one.
+ */
+static int
+_qcheck_pow_one_inf(mpd_t *result, const mpd_t *base, uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t shift;
+ int cmp;
+
+ if ((cmp = _mpd_cmp(base, &one)) == 0) {
+ shift = ctx->prec-1;
+ mpd_qshiftl(result, &one, shift, status);
+ result->exp = -shift;
+ mpd_set_flags(result, resultsign);
+ *status |= (MPD_Inexact|MPD_Rounded);
+ }
+
+ return cmp;
+}
+
+/*
+ * If abs(base) equals one, calculate the correct power of one result.
+ * Otherwise, result is undefined. Return the value of the comparison
+ * against 1.
+ *
+ * This is an internal function that does not check for specials.
+ */
+static int
+_qcheck_pow_one(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_ssize_t shift;
+ int cmp;
+
+ if ((cmp = _mpd_cmp_abs(base, &one)) == 0) {
+ if (_mpd_isint(exp)) {
+ if (mpd_isnegative(exp)) {
+ _settriple(result, resultsign, 1, 0);
+ return 0;
+ }
+ /* 1.000**3 = 1.000000000 */
+ mpd_qmul_ssize(result, exp, -base->exp, ctx, &workstatus);
+ if (workstatus&MPD_Errors) {
+ *status |= (workstatus&MPD_Errors);
+ return 0;
+ }
+ /* digits-1 after exponentiation */
+ shift = mpd_qget_ssize(result, &workstatus);
+ /* shift is MPD_SSIZE_MAX if result is too large */
+ if (shift > ctx->prec-1) {
+ shift = ctx->prec-1;
+ *status |= MPD_Rounded;
+ }
+ }
+ else if (mpd_ispositive(base)) {
+ shift = ctx->prec-1;
+ *status |= (MPD_Inexact|MPD_Rounded);
+ }
+ else {
+ return -2; /* GCOV_NOT_REACHED */
+ }
+ if (!mpd_qshiftl(result, &one, shift, status)) {
+ return 0;
+ }
+ result->exp = -shift;
+ mpd_set_flags(result, resultsign);
+ }
+
+ return cmp;
+}
+
+/*
+ * Detect certain over/underflow of x**y.
+ * ACL2 proof: pow-bounds.lisp.
+ *
+ * Symbols:
+ *
+ * e: EXP_INF or EXP_CLAMP
+ * x: base
+ * y: exponent
+ *
+ * omega(e) = log10(abs(e))
+ * zeta(x) = log10(abs(log10(x)))
+ * theta(y) = log10(abs(y))
+ *
+ * Upper and lower bounds:
+ *
+ * ub_omega(e) = ceil(log10(abs(e)))
+ * lb_theta(y) = floor(log10(abs(y)))
+ *
+ * | floor(log10(floor(abs(log10(x))))) if x < 1/10 or x >= 10
+ * lb_zeta(x) = | floor(log10(abs(x-1)/10)) if 1/10 <= x < 1
+ * | floor(log10(abs((x-1)/100))) if 1 < x < 10
+ *
+ * ub_omega(e) and lb_theta(y) are obviously upper and lower bounds
+ * for omega(e) and theta(y).
+ *
+ * lb_zeta is a lower bound for zeta(x):
+ *
+ * x < 1/10 or x >= 10:
+ *
+ * abs(log10(x)) >= 1, so the outer log10 is well defined. Since log10
+ * is strictly increasing, the end result is a lower bound.
+ *
+ * 1/10 <= x < 1:
+ *
+ * We use: log10(x) <= (x-1)/log(10)
+ * abs(log10(x)) >= abs(x-1)/log(10)
+ * abs(log10(x)) >= abs(x-1)/10
+ *
+ * 1 < x < 10:
+ *
+ * We use: (x-1)/(x*log(10)) < log10(x)
+ * abs((x-1)/100) < abs(log10(x))
+ *
+ * XXX: abs((x-1)/10) would work, need ACL2 proof.
+ *
+ *
+ * Let (0 < x < 1 and y < 0) or (x > 1 and y > 0). (H1)
+ * Let ub_omega(exp_inf) < lb_zeta(x) + lb_theta(y) (H2)
+ *
+ * Then:
+ * log10(abs(exp_inf)) < log10(abs(log10(x))) + log10(abs(y)). (1)
+ * exp_inf < log10(x) * y (2)
+ * 10**exp_inf < x**y (3)
+ *
+ * Let (0 < x < 1 and y > 0) or (x > 1 and y < 0). (H3)
+ * Let ub_omega(exp_clamp) < lb_zeta(x) + lb_theta(y) (H4)
+ *
+ * Then:
+ * log10(abs(exp_clamp)) < log10(abs(log10(x))) + log10(abs(y)). (4)
+ * log10(x) * y < exp_clamp (5)
+ * x**y < 10**exp_clamp (6)
+ *
+ */
+static mpd_ssize_t
+_lower_bound_zeta(const mpd_t *x, uint32_t *status)
+{
+ mpd_context_t maxctx;
+ MPD_NEW_STATIC(scratch,0,0,0,0);
+ mpd_ssize_t t, u;
+
+ t = mpd_adjexp(x);
+ if (t > 0) {
+ /* x >= 10 -> floor(log10(floor(abs(log10(x))))) */
+ return mpd_exp_digits(t) - 1;
+ }
+ else if (t < -1) {
+ /* x < 1/10 -> floor(log10(floor(abs(log10(x))))) */
+ return mpd_exp_digits(t+1) - 1;
+ }
+ else {
+ mpd_maxcontext(&maxctx);
+ mpd_qsub(&scratch, x, &one, &maxctx, status);
+ if (mpd_isspecial(&scratch)) {
+ mpd_del(&scratch);
+ return MPD_SSIZE_MAX;
+ }
+ u = mpd_adjexp(&scratch);
+ mpd_del(&scratch);
+
+ /* t == -1, 1/10 <= x < 1 -> floor(log10(abs(x-1)/10))
+ * t == 0, 1 < x < 10 -> floor(log10(abs(x-1)/100)) */
+ return (t == 0) ? u-2 : u-1;
+ }
+}
+
+/*
+ * Detect cases of certain overflow/underflow in the power function.
+ * Assumptions: x != 1, y != 0. The proof above is for positive x.
+ * If x is negative and y is an odd integer, x**y == -(abs(x)**y),
+ * so the analysis does not change.
+ */
+static int
+_qcheck_pow_bounds(mpd_t *result, const mpd_t *x, const mpd_t *y,
+ uint8_t resultsign,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ MPD_NEW_SHARED(abs_x, x);
+ mpd_ssize_t ub_omega, lb_zeta, lb_theta;
+ uint8_t sign;
+
+ mpd_set_positive(&abs_x);
+
+ lb_theta = mpd_adjexp(y);
+ lb_zeta = _lower_bound_zeta(&abs_x, status);
+ if (lb_zeta == MPD_SSIZE_MAX) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return 1;
+ }
+
+ sign = (mpd_adjexp(&abs_x) < 0) ^ mpd_sign(y);
+ if (sign == 0) {
+ /* (0 < |x| < 1 and y < 0) or (|x| > 1 and y > 0) */
+ ub_omega = mpd_exp_digits(ctx->emax);
+ if (ub_omega < lb_zeta + lb_theta) {
+ _settriple(result, resultsign, 1, MPD_EXP_INF);
+ mpd_qfinalize(result, ctx, status);
+ return 1;
+ }
+ }
+ else {
+ /* (0 < |x| < 1 and y > 0) or (|x| > 1 and y < 0). */
+ ub_omega = mpd_exp_digits(mpd_etiny(ctx));
+ if (ub_omega < lb_zeta + lb_theta) {
+ _settriple(result, resultsign, 1, mpd_etiny(ctx)-1);
+ mpd_qfinalize(result, ctx, status);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * TODO: Implement algorithm for computing exact powers from decimal.py.
+ * In order to prevent infinite loops, this has to be called before
+ * using Ziv's strategy for correct rounding.
+ */
+/*
+static int
+_mpd_qpow_exact(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ return 0;
+}
+*/
+
+/*
+ * The power function for real exponents.
+ * Relative error: abs(result - e**y) < e**y * 1/5 * 10**(-prec - 1)
+ */
+static void
+_mpd_qpow_real(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_STATIC(texp,0,0,0,0);
+
+ if (!mpd_qcopy(&texp, exp, status)) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+
+ mpd_maxcontext(&workctx);
+ workctx.prec = (base->digits > ctx->prec) ? base->digits : ctx->prec;
+ workctx.prec += (4 + MPD_EXPDIGITS);
+ workctx.round = MPD_ROUND_HALF_EVEN;
+ workctx.allcr = ctx->allcr;
+
+ /*
+ * extra := MPD_EXPDIGITS = MPD_EXP_MAX_T
+ * wp := prec + 4 + extra
+ * abs(err) < 5 * 10**-wp
+ * y := log(base) * exp
+ * Calculate:
+ * 1) e**(y * (1 + err)**2) * (1 + err)
+ * = e**y * e**(y * (2*err + err**2)) * (1 + err)
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ * Relative error of the underlined term:
+ * 2) abs(e**(y * (2*err + err**2)) - 1)
+ * Case abs(y) >= 10**extra:
+ * 3) adjexp(y)+1 > log10(abs(y)) >= extra
+ * This triggers the Overflow/Underflow shortcut in _mpd_qexp(),
+ * so no further analysis is necessary.
+ * Case abs(y) < 10**extra:
+ * 4) abs(y * (2*err + err**2)) < 1/5 * 10**(-prec - 2)
+ * Use (see _mpd_qexp):
+ * 5) abs(x) <= 9/10 * 10**-p ==> abs(e**x - 1) < 10**-p
+ * With 2), 4) and 5):
+ * 6) abs(e**(y * (2*err + err**2)) - 1) < 10**(-prec - 2)
+ * The complete relative error of 1) is:
+ * 7) abs(result - e**y) < e**y * 1/5 * 10**(-prec - 1)
+ */
+ mpd_qln(result, base, &workctx, &workctx.status);
+ mpd_qmul(result, result, &texp, &workctx, &workctx.status);
+ mpd_qexp(result, result, &workctx, status);
+
+ mpd_del(&texp);
+ *status |= (workctx.status&MPD_Errors);
+ *status |= (MPD_Inexact|MPD_Rounded);
+}
+
+/* The power function: base**exp */
+void
+mpd_qpow(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint8_t resultsign = 0;
+ int intexp = 0;
+ int cmp;
+
+ if (mpd_isspecial(base) || mpd_isspecial(exp)) {
+ if (mpd_qcheck_nans(result, base, exp, ctx, status)) {
+ return;
+ }
+ }
+ if (mpd_isinteger(exp)) {
+ intexp = 1;
+ resultsign = mpd_isnegative(base) && mpd_isodd(exp);
+ }
+
+ if (mpd_iszero(base)) {
+ if (mpd_iszero(exp)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ }
+ else if (mpd_isnegative(exp)) {
+ mpd_setspecial(result, resultsign, MPD_INF);
+ }
+ else {
+ _settriple(result, resultsign, 0, 0);
+ }
+ return;
+ }
+ if (mpd_isnegative(base)) {
+ if (!intexp || mpd_isinfinite(exp)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ }
+ if (mpd_isinfinite(exp)) {
+ /* power of one */
+ cmp = _qcheck_pow_one_inf(result, base, resultsign, ctx, status);
+ if (cmp == 0) {
+ return;
+ }
+ else {
+ cmp *= mpd_arith_sign(exp);
+ if (cmp < 0) {
+ _settriple(result, resultsign, 0, 0);
+ }
+ else {
+ mpd_setspecial(result, resultsign, MPD_INF);
+ }
+ }
+ return;
+ }
+ if (mpd_isinfinite(base)) {
+ if (mpd_iszero(exp)) {
+ _settriple(result, resultsign, 1, 0);
+ }
+ else if (mpd_isnegative(exp)) {
+ _settriple(result, resultsign, 0, 0);
+ }
+ else {
+ mpd_setspecial(result, resultsign, MPD_INF);
+ }
+ return;
+ }
+ if (mpd_iszero(exp)) {
+ _settriple(result, resultsign, 1, 0);
+ return;
+ }
+ if (_qcheck_pow_one(result, base, exp, resultsign, ctx, status) == 0) {
+ return;
+ }
+ if (_qcheck_pow_bounds(result, base, exp, resultsign, ctx, status)) {
+ return;
+ }
+
+ if (intexp) {
+ _mpd_qpow_int(result, base, exp, resultsign, ctx, status);
+ }
+ else {
+ _mpd_qpow_real(result, base, exp, ctx, status);
+ if (!mpd_isspecial(result) && _mpd_cmp(result, &one) == 0) {
+ mpd_ssize_t shift = ctx->prec-1;
+ mpd_qshiftl(result, &one, shift, status);
+ result->exp = -shift;
+ }
+ if (mpd_isinfinite(result)) {
+ /* for ROUND_DOWN, ROUND_FLOOR, etc. */
+ _settriple(result, MPD_POS, 1, MPD_EXP_INF);
+ }
+ mpd_qfinalize(result, ctx, status);
+ }
+}
+
+/*
+ * Internal function: Integer powmod with mpd_uint_t exponent, base is modified!
+ * Function can fail with MPD_Malloc_error.
+ */
+static inline void
+_mpd_qpowmod_uint(mpd_t *result, mpd_t *base, mpd_uint_t exp,
+ const mpd_t *mod, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+
+ mpd_maxcontext(&maxcontext);
+
+ /* resize to smaller cannot fail */
+ mpd_qcopy(result, &one, status);
+
+ while (exp > 0) {
+ if (exp & 1) {
+ _mpd_qmul_exact(result, result, base, &maxcontext, status);
+ mpd_qrem(result, result, mod, &maxcontext, status);
+ }
+ _mpd_qmul_exact(base, base, base, &maxcontext, status);
+ mpd_qrem(base, base, mod, &maxcontext, status);
+ exp >>= 1;
+ }
+}
+
+/* The powmod function: (base**exp) % mod */
+void
+mpd_qpowmod(mpd_t *result, const mpd_t *base, const mpd_t *exp,
+ const mpd_t *mod,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(tbase,0,0,0,0);
+ MPD_NEW_STATIC(texp,0,0,0,0);
+ MPD_NEW_STATIC(tmod,0,0,0,0);
+ MPD_NEW_STATIC(tmp,0,0,0,0);
+ MPD_NEW_CONST(two,0,0,1,1,1,2);
+ mpd_ssize_t tbase_exp, texp_exp;
+ mpd_ssize_t i;
+ mpd_t t;
+ mpd_uint_t r;
+ uint8_t sign;
+
+
+ if (mpd_isspecial(base) || mpd_isspecial(exp) || mpd_isspecial(mod)) {
+ if (mpd_qcheck_3nans(result, base, exp, mod, ctx, status)) {
+ return;
+ }
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+
+ if (!_mpd_isint(base) || !_mpd_isint(exp) || !_mpd_isint(mod)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_iszerocoeff(mod)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mod->digits+mod->exp > ctx->prec) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ sign = (mpd_isnegative(base)) && (mpd_isodd(exp));
+ if (mpd_iszerocoeff(exp)) {
+ if (mpd_iszerocoeff(base)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ r = (_mpd_cmp_abs(mod, &one)==0) ? 0 : 1;
+ _settriple(result, sign, r, 0);
+ return;
+ }
+ if (mpd_isnegative(exp)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_iszerocoeff(base)) {
+ _settriple(result, sign, 0, 0);
+ return;
+ }
+
+ mpd_maxcontext(&maxcontext);
+
+ mpd_qrescale(&tmod, mod, 0, &maxcontext, &maxcontext.status);
+ if (maxcontext.status&MPD_Errors) {
+ mpd_seterror(result, maxcontext.status&MPD_Errors, status);
+ goto out;
+ }
+ maxcontext.status = 0;
+ mpd_set_positive(&tmod);
+
+ mpd_qround_to_int(&tbase, base, &maxcontext, status);
+ mpd_set_positive(&tbase);
+ tbase_exp = tbase.exp;
+ tbase.exp = 0;
+
+ mpd_qround_to_int(&texp, exp, &maxcontext, status);
+ texp_exp = texp.exp;
+ texp.exp = 0;
+
+ /* base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo */
+ mpd_qrem(&tbase, &tbase, &tmod, &maxcontext, status);
+ mpd_qshiftl(result, &one, tbase_exp, status);
+ mpd_qrem(result, result, &tmod, &maxcontext, status);
+ _mpd_qmul_exact(&tbase, &tbase, result, &maxcontext, status);
+ mpd_qrem(&tbase, &tbase, &tmod, &maxcontext, status);
+ if (mpd_isspecial(&tbase) ||
+ mpd_isspecial(&texp) ||
+ mpd_isspecial(&tmod)) {
+ goto mpd_errors;
+ }
+
+ for (i = 0; i < texp_exp; i++) {
+ _mpd_qpowmod_uint(&tmp, &tbase, 10, &tmod, status);
+ t = tmp;
+ tmp = tbase;
+ tbase = t;
+ }
+ if (mpd_isspecial(&tbase)) {
+ goto mpd_errors; /* GCOV_UNLIKELY */
+ }
+
+ /* resize to smaller cannot fail */
+ mpd_qcopy(result, &one, status);
+ while (mpd_isfinite(&texp) && !mpd_iszero(&texp)) {
+ if (mpd_isodd(&texp)) {
+ _mpd_qmul_exact(result, result, &tbase, &maxcontext, status);
+ mpd_qrem(result, result, &tmod, &maxcontext, status);
+ }
+ _mpd_qmul_exact(&tbase, &tbase, &tbase, &maxcontext, status);
+ mpd_qrem(&tbase, &tbase, &tmod, &maxcontext, status);
+ mpd_qdivint(&texp, &texp, &two, &maxcontext, status);
+ }
+ if (mpd_isspecial(&texp) || mpd_isspecial(&tbase) ||
+ mpd_isspecial(&tmod) || mpd_isspecial(result)) {
+ /* MPD_Malloc_error */
+ goto mpd_errors;
+ }
+ else {
+ mpd_set_sign(result, sign);
+ }
+
+out:
+ mpd_del(&tbase);
+ mpd_del(&texp);
+ mpd_del(&tmod);
+ mpd_del(&tmp);
+ return;
+
+mpd_errors:
+ mpd_setspecial(result, MPD_POS, MPD_NAN);
+ goto out;
+}
+
+void
+mpd_qquantize(mpd_t *result, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_ssize_t b_exp = b->exp;
+ mpd_ssize_t expdiff, shift;
+ mpd_uint_t rnd;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(result, a, b, ctx, status)) {
+ return;
+ }
+ if (mpd_isinfinite(a) && mpd_isinfinite(b)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ if (b->exp > ctx->emax || b->exp < mpd_etiny(ctx)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ if (mpd_iszero(a)) {
+ _settriple(result, mpd_sign(a), 0, b->exp);
+ mpd_qfinalize(result, ctx, status);
+ return;
+ }
+
+
+ expdiff = a->exp - b->exp;
+ if (a->digits + expdiff > ctx->prec) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ if (expdiff >= 0) {
+ shift = expdiff;
+ if (!mpd_qshiftl(result, a, shift, status)) {
+ return;
+ }
+ result->exp = b_exp;
+ }
+ else {
+ /* At this point expdiff < 0 and a->digits+expdiff <= prec,
+ * so the shift before an increment will fit in prec. */
+ shift = -expdiff;
+ rnd = mpd_qshiftr(result, a, shift, status);
+ if (rnd == MPD_UINT_MAX) {
+ return;
+ }
+ result->exp = b_exp;
+ if (!_mpd_apply_round_fit(result, rnd, ctx, status)) {
+ return;
+ }
+ workstatus |= MPD_Rounded;
+ if (rnd) {
+ workstatus |= MPD_Inexact;
+ }
+ }
+
+ if (mpd_adjexp(result) > ctx->emax ||
+ mpd_adjexp(result) < mpd_etiny(ctx)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ *status |= workstatus;
+ mpd_qfinalize(result, ctx, status);
+}
+
+void
+mpd_qreduce(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_ssize_t shift, maxexp, maxshift;
+ uint8_t sign_a = mpd_sign(a);
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+ if (!mpd_qcopy(result, a, status)) {
+ return;
+ }
+ mpd_qfinalize(result, ctx, status);
+ if (mpd_isspecial(result)) {
+ return;
+ }
+ if (mpd_iszero(result)) {
+ _settriple(result, sign_a, 0, 0);
+ return;
+ }
+
+ shift = mpd_trail_zeros(result);
+ maxexp = (ctx->clamp) ? mpd_etop(ctx) : ctx->emax;
+ /* After the finalizing above result->exp <= maxexp. */
+ maxshift = maxexp - result->exp;
+ shift = (shift > maxshift) ? maxshift : shift;
+
+ mpd_qshiftr_inplace(result, shift);
+ result->exp += shift;
+}
+
+void
+mpd_qrem(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ MPD_NEW_STATIC(q,0,0,0,0);
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(r, a, b, ctx, status)) {
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_seterror(r, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(b)) {
+ mpd_qcopy(r, a, status);
+ mpd_qfinalize(r, ctx, status);
+ return;
+ }
+ /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+ if (mpd_iszerocoeff(b)) {
+ if (mpd_iszerocoeff(a)) {
+ mpd_seterror(r, MPD_Division_undefined, status);
+ }
+ else {
+ mpd_seterror(r, MPD_Invalid_operation, status);
+ }
+ return;
+ }
+
+ _mpd_qdivmod(&q, r, a, b, ctx, status);
+ mpd_del(&q);
+ mpd_qfinalize(r, ctx, status);
+}
+
+void
+mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_context_t workctx;
+ MPD_NEW_STATIC(btmp,0,0,0,0);
+ MPD_NEW_STATIC(q,0,0,0,0);
+ mpd_ssize_t expdiff, qdigits;
+ int cmp, isodd, allnine;
+
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ if (mpd_qcheck_nans(r, a, b, ctx, status)) {
+ return;
+ }
+ if (mpd_isinfinite(a)) {
+ mpd_seterror(r, MPD_Invalid_operation, status);
+ return;
+ }
+ if (mpd_isinfinite(b)) {
+ mpd_qcopy(r, a, status);
+ mpd_qfinalize(r, ctx, status);
+ return;
+ }
+ /* debug */
+ abort(); /* GCOV_NOT_REACHED */
+ }
+ if (mpd_iszerocoeff(b)) {
+ if (mpd_iszerocoeff(a)) {
+ mpd_seterror(r, MPD_Division_undefined, status);
+ }
+ else {
+ mpd_seterror(r, MPD_Invalid_operation, status);
+ }
+ return;
+ }
+
+ if (r == b) {
+ if (!mpd_qcopy(&btmp, b, status)) {
+ mpd_seterror(r, MPD_Malloc_error, status);
+ return;
+ }
+ b = &btmp;
+ }
+
+ _mpd_qdivmod(&q, r, a, b, ctx, status);
+ if (mpd_isnan(&q) || mpd_isnan(r)) {
+ goto finish;
+ }
+ if (mpd_iszerocoeff(r)) {
+ goto finish;
+ }
+
+ expdiff = mpd_adjexp(b) - mpd_adjexp(r);
+ if (-1 <= expdiff && expdiff <= 1) {
+
+ allnine = mpd_coeff_isallnine(&q);
+ qdigits = q.digits;
+ isodd = mpd_isodd(&q);
+
+ mpd_maxcontext(&workctx);
+ if (mpd_sign(a) == mpd_sign(b)) {
+ /* sign(r) == sign(b) */
+ _mpd_qsub(&q, r, b, &workctx, &workctx.status);
+ }
+ else {
+ /* sign(r) != sign(b) */
+ _mpd_qadd(&q, r, b, &workctx, &workctx.status);
+ }
+
+ if (workctx.status&MPD_Errors) {
+ mpd_seterror(r, workctx.status&MPD_Errors, status);
+ goto finish;
+ }
+
+ cmp = _mpd_cmp_abs(&q, r);
+ if (cmp < 0 || (cmp == 0 && isodd)) {
+ /* abs(r) > abs(b)/2 or abs(r) == abs(b)/2 and isodd(quotient) */
+ if (allnine && qdigits == ctx->prec) {
+ /* abs(quotient) + 1 == 10**prec */
+ mpd_seterror(r, MPD_Division_impossible, status);
+ goto finish;
+ }
+ mpd_qcopy(r, &q, status);
+ }
+ }
+
+
+finish:
+ mpd_del(&btmp);
+ mpd_del(&q);
+ mpd_qfinalize(r, ctx, status);
+}
+
+static void
+_mpd_qrescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t expdiff, shift;
+ mpd_uint_t rnd;
+
+ if (mpd_isspecial(a)) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+
+ if (mpd_iszero(a)) {
+ _settriple(result, mpd_sign(a), 0, exp);
+ return;
+ }
+
+ expdiff = a->exp - exp;
+ if (expdiff >= 0) {
+ shift = expdiff;
+ if (a->digits + shift > MPD_MAX_PREC+1) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ if (!mpd_qshiftl(result, a, shift, status)) {
+ return;
+ }
+ result->exp = exp;
+ }
+ else {
+ shift = -expdiff;
+ rnd = mpd_qshiftr(result, a, shift, status);
+ if (rnd == MPD_UINT_MAX) {
+ return;
+ }
+ result->exp = exp;
+ _mpd_apply_round_excess(result, rnd, ctx, status);
+ *status |= MPD_Rounded;
+ if (rnd) {
+ *status |= MPD_Inexact;
+ }
+ }
+
+ if (mpd_issubnormal(result, ctx)) {
+ *status |= MPD_Subnormal;
+ }
+}
+
+/*
+ * Rescale a number so that it has exponent 'exp'. Does not regard context
+ * precision, emax, emin, but uses the rounding mode. Special numbers are
+ * quietly copied. Restrictions:
+ *
+ * MPD_MIN_ETINY <= exp <= MPD_MAX_EMAX+1
+ * result->digits <= MPD_MAX_PREC+1
+ */
+void
+mpd_qrescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if (exp > MPD_MAX_EMAX+1 || exp < MPD_MIN_ETINY) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ _mpd_qrescale(result, a, exp, ctx, status);
+}
+
+/*
+ * Same as mpd_qrescale, but with relaxed restrictions. The result of this
+ * function should only be used for formatting a number and never as input
+ * for other operations.
+ *
+ * MPD_MIN_ETINY-MPD_MAX_PREC <= exp <= MPD_MAX_EMAX+1
+ * result->digits <= MPD_MAX_PREC+1
+ */
+void
+mpd_qrescale_fmt(mpd_t *result, const mpd_t *a, mpd_ssize_t exp,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ if (exp > MPD_MAX_EMAX+1 || exp < MPD_MIN_ETINY-MPD_MAX_PREC) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ _mpd_qrescale(result, a, exp, ctx, status);
+}
+
+/* Round to an integer according to 'action' and ctx->round. */
+enum {TO_INT_EXACT, TO_INT_SILENT, TO_INT_TRUNC};
+static void
+_mpd_qround_to_integral(int action, mpd_t *result, const mpd_t *a,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_uint_t rnd;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ mpd_qcopy(result, a, status);
+ return;
+ }
+ if (a->exp >= 0) {
+ mpd_qcopy(result, a, status);
+ return;
+ }
+ if (mpd_iszerocoeff(a)) {
+ _settriple(result, mpd_sign(a), 0, 0);
+ return;
+ }
+
+ rnd = mpd_qshiftr(result, a, -a->exp, status);
+ if (rnd == MPD_UINT_MAX) {
+ return;
+ }
+ result->exp = 0;
+
+ if (action == TO_INT_EXACT || action == TO_INT_SILENT) {
+ _mpd_apply_round_excess(result, rnd, ctx, status);
+ if (action == TO_INT_EXACT) {
+ *status |= MPD_Rounded;
+ if (rnd) {
+ *status |= MPD_Inexact;
+ }
+ }
+ }
+}
+
+void
+mpd_qround_to_intx(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ (void)_mpd_qround_to_integral(TO_INT_EXACT, result, a, ctx, status);
+}
+
+void
+mpd_qround_to_int(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a, ctx, status);
+}
+
+void
+mpd_qtrunc(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ (void)_mpd_qround_to_integral(TO_INT_TRUNC, result, a, ctx, status);
+}
+
+void
+mpd_qfloor(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx = *ctx;
+ workctx.round = MPD_ROUND_FLOOR;
+ (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a,
+ &workctx, status);
+}
+
+void
+mpd_qceil(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx = *ctx;
+ workctx.round = MPD_ROUND_CEILING;
+ (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a,
+ &workctx, status);
+}
+
+int
+mpd_same_quantum(const mpd_t *a, const mpd_t *b)
+{
+ if (mpd_isspecial(a) || mpd_isspecial(b)) {
+ return ((mpd_isnan(a) && mpd_isnan(b)) ||
+ (mpd_isinfinite(a) && mpd_isinfinite(b)));
+ }
+
+ return a->exp == b->exp;
+}
+
+/* Schedule the increase in precision for the Newton iteration. */
+static inline int
+recpr_schedule_prec(mpd_ssize_t klist[MPD_MAX_PREC_LOG2],
+ mpd_ssize_t maxprec, mpd_ssize_t initprec)
+{
+ mpd_ssize_t k;
+ int i;
+
+ assert(maxprec > 0 && initprec > 0);
+ if (maxprec <= initprec) return -1;
+
+ i = 0; k = maxprec;
+ do {
+ k = (k+1) / 2;
+ klist[i++] = k;
+ } while (k > initprec);
+
+ return i-1;
+}
+
+/*
+ * Initial approximation for the reciprocal:
+ * k_0 := MPD_RDIGITS-2
+ * z_0 := 10**(-k_0) * floor(10**(2*k_0 + 2) / floor(v * 10**(k_0 + 2)))
+ * Absolute error:
+ * |1/v - z_0| < 10**(-k_0)
+ * ACL2 proof: maxerror-inverse-approx
+ */
+static void
+_mpd_qreciprocal_approx(mpd_t *z, const mpd_t *v, uint32_t *status)
+{
+ mpd_uint_t p10data[2] = {0, mpd_pow10[MPD_RDIGITS-2]};
+ mpd_uint_t dummy, word;
+ int n;
+
+ assert(v->exp == -v->digits);
+
+ _mpd_get_msdigits(&dummy, &word, v, MPD_RDIGITS);
+ n = mpd_word_digits(word);
+ word *= mpd_pow10[MPD_RDIGITS-n];
+
+ mpd_qresize(z, 2, status);
+ (void)_mpd_shortdiv(z->data, p10data, 2, word);
+
+ mpd_clear_flags(z);
+ z->exp = -(MPD_RDIGITS-2);
+ z->len = (z->data[1] == 0) ? 1 : 2;
+ mpd_setdigits(z);
+}
+
+/*
+ * Reciprocal, calculated with Newton's Method. Assumption: result != a.
+ * NOTE: The comments in the function show that certain operations are
+ * exact. The proof for the maximum error is too long to fit in here.
+ * ACL2 proof: maxerror-inverse-complete
+ */
+static void
+_mpd_qreciprocal(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t varcontext, maxcontext;
+ mpd_t *z = result; /* current approximation */
+ mpd_t *v; /* a, normalized to a number between 0.1 and 1 */
+ MPD_NEW_SHARED(vtmp, a); /* v shares data with a */
+ MPD_NEW_STATIC(s,0,0,0,0); /* temporary variable */
+ MPD_NEW_STATIC(t,0,0,0,0); /* temporary variable */
+ MPD_NEW_CONST(two,0,0,1,1,1,2); /* const 2 */
+ mpd_ssize_t klist[MPD_MAX_PREC_LOG2];
+ mpd_ssize_t adj, maxprec, initprec;
+ uint8_t sign = mpd_sign(a);
+ int i;
+
+ assert(result != a);
+
+ v = &vtmp;
+ mpd_clear_flags(v);
+ adj = v->digits + v->exp;
+ v->exp = -v->digits;
+
+ /* Initial approximation */
+ _mpd_qreciprocal_approx(z, v, status);
+
+ mpd_maxcontext(&varcontext);
+ mpd_maxcontext(&maxcontext);
+ varcontext.round = maxcontext.round = MPD_ROUND_TRUNC;
+ varcontext.emax = maxcontext.emax = MPD_MAX_EMAX + 100;
+ varcontext.emin = maxcontext.emin = MPD_MIN_EMIN - 100;
+ maxcontext.prec = MPD_MAX_PREC + 100;
+
+ maxprec = ctx->prec;
+ maxprec += 2;
+ initprec = MPD_RDIGITS-3;
+
+ i = recpr_schedule_prec(klist, maxprec, initprec);
+ for (; i >= 0; i--) {
+ /* Loop invariant: z->digits <= klist[i]+7 */
+ /* Let s := z**2, exact result */
+ _mpd_qmul_exact(&s, z, z, &maxcontext, status);
+ varcontext.prec = 2*klist[i] + 5;
+ if (v->digits > varcontext.prec) {
+ /* Let t := v, truncated to n >= 2*k+5 fraction digits */
+ mpd_qshiftr(&t, v, v->digits-varcontext.prec, status);
+ t.exp = -varcontext.prec;
+ /* Let t := trunc(v)*s, truncated to n >= 2*k+1 fraction digits */
+ mpd_qmul(&t, &t, &s, &varcontext, status);
+ }
+ else { /* v->digits <= 2*k+5 */
+ /* Let t := v*s, truncated to n >= 2*k+1 fraction digits */
+ mpd_qmul(&t, v, &s, &varcontext, status);
+ }
+ /* Let s := 2*z, exact result */
+ _mpd_qmul_exact(&s, z, &two, &maxcontext, status);
+ /* s.digits < t.digits <= 2*k+5, |adjexp(s)-adjexp(t)| <= 1,
+ * so the subtraction generates at most 2*k+6 <= klist[i+1]+7
+ * digits. The loop invariant is preserved. */
+ _mpd_qsub_exact(z, &s, &t, &maxcontext, status);
+ }
+
+ if (!mpd_isspecial(z)) {
+ z->exp -= adj;
+ mpd_set_flags(z, sign);
+ }
+
+ mpd_del(&s);
+ mpd_del(&t);
+ mpd_qfinalize(z, ctx, status);
+}
+
+/*
+ * Internal function for large numbers:
+ *
+ * q, r = divmod(coeff(a), coeff(b))
+ *
+ * Strategy: Multiply the dividend by the reciprocal of the divisor. The
+ * inexact result is fixed by a small loop, using at most one iteration.
+ *
+ * ACL2 proofs:
+ * ------------
+ * 1) q is a natural number. (ndivmod-quotient-natp)
+ * 2) r is a natural number. (ndivmod-remainder-natp)
+ * 3) a = q * b + r (ndivmod-q*b+r==a)
+ * 4) r < b (ndivmod-remainder-<-b)
+ */
+static void
+_mpd_base_ndivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+ mpd_t *qq = q, *rr = r;
+ mpd_t aa, bb;
+ int k;
+
+ _mpd_copy_shared(&aa, a);
+ _mpd_copy_shared(&bb, b);
+
+ mpd_set_positive(&aa);
+ mpd_set_positive(&bb);
+ aa.exp = 0;
+ bb.exp = 0;
+
+ if (q == a || q == b) {
+ if ((qq = mpd_qnew()) == NULL) {
+ *status |= MPD_Malloc_error;
+ goto nanresult;
+ }
+ }
+ if (r == a || r == b) {
+ if ((rr = mpd_qnew()) == NULL) {
+ *status |= MPD_Malloc_error;
+ goto nanresult;
+ }
+ }
+
+ mpd_maxcontext(&workctx);
+
+ /* Let prec := adigits - bdigits + 4 */
+ workctx.prec = a->digits - b->digits + 1 + 3;
+ if (a->digits > MPD_MAX_PREC || workctx.prec > MPD_MAX_PREC) {
+ *status |= MPD_Division_impossible;
+ goto nanresult;
+ }
+
+ /* Let x := _mpd_qreciprocal(b, prec)
+ * Then x is bounded by:
+ * 1) 1/b - 10**(-prec - bdigits) < x < 1/b + 10**(-prec - bdigits)
+ * 2) 1/b - 10**(-adigits - 4) < x < 1/b + 10**(-adigits - 4)
+ */
+ _mpd_qreciprocal(rr, &bb, &workctx, &workctx.status);
+
+ /* Get an estimate for the quotient. Let q := a * x
+ * Then q is bounded by:
+ * 3) a/b - 10**-4 < q < a/b + 10**-4
+ */
+ _mpd_qmul(qq, &aa, rr, &workctx, &workctx.status);
+ /* Truncate q to an integer:
+ * 4) a/b - 2 < trunc(q) < a/b + 1
+ */
+ mpd_qtrunc(qq, qq, &workctx, &workctx.status);
+
+ workctx.prec = aa.digits + 3;
+ workctx.emax = MPD_MAX_EMAX + 3;
+ workctx.emin = MPD_MIN_EMIN - 3;
+ /* Multiply the estimate for q by b:
+ * 5) a - 2 * b < trunc(q) * b < a + b
+ */
+ _mpd_qmul(rr, &bb, qq, &workctx, &workctx.status);
+ /* Get the estimate for r such that a = q * b + r. */
+ _mpd_qsub_exact(rr, &aa, rr, &workctx, &workctx.status);
+
+ /* Fix the result. At this point -b < r < 2*b, so the correction loop
+ takes at most one iteration. */
+ for (k = 0;; k++) {
+ if (mpd_isspecial(qq) || mpd_isspecial(rr)) {
+ *status |= (workctx.status&MPD_Errors);
+ goto nanresult;
+ }
+ if (k > 2) { /* Allow two iterations despite the proof. */
+ mpd_err_warn("libmpdec: internal error in " /* GCOV_NOT_REACHED */
+ "_mpd_base_ndivmod: please report"); /* GCOV_NOT_REACHED */
+ *status |= MPD_Invalid_operation; /* GCOV_NOT_REACHED */
+ goto nanresult; /* GCOV_NOT_REACHED */
+ }
+ /* r < 0 */
+ else if (_mpd_cmp(&zero, rr) == 1) {
+ _mpd_qadd_exact(rr, rr, &bb, &workctx, &workctx.status);
+ _mpd_qadd_exact(qq, qq, &minus_one, &workctx, &workctx.status);
+ }
+ /* 0 <= r < b */
+ else if (_mpd_cmp(rr, &bb) == -1) {
+ break;
+ }
+ /* r >= b */
+ else {
+ _mpd_qsub_exact(rr, rr, &bb, &workctx, &workctx.status);
+ _mpd_qadd_exact(qq, qq, &one, &workctx, &workctx.status);
+ }
+ }
+
+ if (qq != q) {
+ if (!mpd_qcopy(q, qq, status)) {
+ goto nanresult; /* GCOV_UNLIKELY */
+ }
+ mpd_del(qq);
+ }
+ if (rr != r) {
+ if (!mpd_qcopy(r, rr, status)) {
+ goto nanresult; /* GCOV_UNLIKELY */
+ }
+ mpd_del(rr);
+ }
+
+ *status |= (workctx.status&MPD_Errors);
+ return;
+
+
+nanresult:
+ if (qq && qq != q) mpd_del(qq);
+ if (rr && rr != r) mpd_del(rr);
+ mpd_setspecial(q, MPD_POS, MPD_NAN);
+ mpd_setspecial(r, MPD_POS, MPD_NAN);
+}
+
+/* LIBMPDEC_ONLY */
+/*
+ * Schedule the optimal precision increase for the Newton iteration.
+ * v := input operand
+ * z_0 := initial approximation
+ * initprec := natural number such that abs(sqrt(v) - z_0) < 10**-initprec
+ * maxprec := target precision
+ *
+ * For convenience the output klist contains the elements in reverse order:
+ * klist := [k_n-1, ..., k_0], where
+ * 1) k_0 <= initprec and
+ * 2) abs(sqrt(v) - result) < 10**(-2*k_n-1 + 2) <= 10**-maxprec.
+ */
+static inline int
+invroot_schedule_prec(mpd_ssize_t klist[MPD_MAX_PREC_LOG2],
+ mpd_ssize_t maxprec, mpd_ssize_t initprec)
+{
+ mpd_ssize_t k;
+ int i;
+
+ assert(maxprec >= 3 && initprec >= 3);
+ if (maxprec <= initprec) return -1;
+
+ i = 0; k = maxprec;
+ do {
+ k = (k+3) / 2;
+ klist[i++] = k;
+ } while (k > initprec);
+
+ return i-1;
+}
+
+/*
+ * Initial approximation for the inverse square root function.
+ * Input:
+ * v := rational number, with 1 <= v < 100
+ * vhat := floor(v * 10**6)
+ * Output:
+ * z := approximation to 1/sqrt(v), such that abs(z - 1/sqrt(v)) < 10**-3.
+ */
+static inline void
+_invroot_init_approx(mpd_t *z, mpd_uint_t vhat)
+{
+ mpd_uint_t lo = 1000;
+ mpd_uint_t hi = 10000;
+ mpd_uint_t a, sq;
+
+ assert(lo*lo <= vhat && vhat < (hi+1)*(hi+1));
+
+ for(;;) {
+ a = (lo + hi) / 2;
+ sq = a * a;
+ if (vhat >= sq) {
+ if (vhat < sq + 2*a + 1) {
+ break;
+ }
+ lo = a + 1;
+ }
+ else {
+ hi = a - 1;
+ }
+ }
+
+ /*
+ * After the binary search we have:
+ * 1) a**2 <= floor(v * 10**6) < (a + 1)**2
+ * This implies:
+ * 2) a**2 <= v * 10**6 < (a + 1)**2
+ * 3) a <= sqrt(v) * 10**3 < a + 1
+ * Since 10**3 <= a:
+ * 4) 0 <= 10**prec/a - 1/sqrt(v) < 10**-prec
+ * We have:
+ * 5) 10**3/a - 10**-3 < floor(10**9/a) * 10**-6 <= 10**3/a
+ * Merging 4) and 5):
+ * 6) abs(floor(10**9/a) * 10**-6 - 1/sqrt(v)) < 10**-3
+ */
+ mpd_minalloc(z);
+ mpd_clear_flags(z);
+ z->data[0] = 1000000000UL / a;
+ z->len = 1;
+ z->exp = -6;
+ mpd_setdigits(z);
+}
+
+/*
+ * Set 'result' to 1/sqrt(a).
+ * Relative error: abs(result - 1/sqrt(a)) < 10**-prec * 1/sqrt(a)
+ */
+static void
+_mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ uint32_t workstatus = 0;
+ mpd_context_t varcontext, maxcontext;
+ mpd_t *z = result; /* current approximation */
+ mpd_t *v; /* a, normalized to a number between 1 and 100 */
+ MPD_NEW_SHARED(vtmp, a); /* by default v will share data with a */
+ MPD_NEW_STATIC(s,0,0,0,0); /* temporary variable */
+ MPD_NEW_STATIC(t,0,0,0,0); /* temporary variable */
+ MPD_NEW_CONST(one_half,0,-1,1,1,1,5);
+ MPD_NEW_CONST(three,0,0,1,1,1,3);
+ mpd_ssize_t klist[MPD_MAX_PREC_LOG2];
+ mpd_ssize_t ideal_exp, shift;
+ mpd_ssize_t adj, tz;
+ mpd_ssize_t maxprec, fracdigits;
+ mpd_uint_t vhat, dummy;
+ int i, n;
+
+
+ ideal_exp = -(a->exp - (a->exp & 1)) / 2;
+
+ v = &vtmp;
+ if (result == a) {
+ if ((v = mpd_qncopy(a)) == NULL) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ }
+
+ /* normalize a to 1 <= v < 100 */
+ if ((v->digits+v->exp) & 1) {
+ fracdigits = v->digits - 1;
+ v->exp = -fracdigits;
+ n = (v->digits > 7) ? 7 : (int)v->digits;
+ /* Let vhat := floor(v * 10**(2*initprec)) */
+ _mpd_get_msdigits(&dummy, &vhat, v, n);
+ if (n < 7) {
+ vhat *= mpd_pow10[7-n];
+ }
+ }
+ else {
+ fracdigits = v->digits - 2;
+ v->exp = -fracdigits;
+ n = (v->digits > 8) ? 8 : (int)v->digits;
+ /* Let vhat := floor(v * 10**(2*initprec)) */
+ _mpd_get_msdigits(&dummy, &vhat, v, n);
+ if (n < 8) {
+ vhat *= mpd_pow10[8-n];
+ }
+ }
+ adj = (a->exp-v->exp) / 2;
+
+ /* initial approximation */
+ _invroot_init_approx(z, vhat);
+
+ mpd_maxcontext(&maxcontext);
+ mpd_maxcontext(&varcontext);
+ varcontext.round = MPD_ROUND_TRUNC;
+ maxprec = ctx->prec + 1;
+
+ /* initprec == 3 */
+ i = invroot_schedule_prec(klist, maxprec, 3);
+ for (; i >= 0; i--) {
+ varcontext.prec = 2*klist[i]+2;
+ mpd_qmul(&s, z, z, &maxcontext, &workstatus);
+ if (v->digits > varcontext.prec) {
+ shift = v->digits - varcontext.prec;
+ mpd_qshiftr(&t, v, shift, &workstatus);
+ t.exp += shift;
+ mpd_qmul(&t, &t, &s, &varcontext, &workstatus);
+ }
+ else {
+ mpd_qmul(&t, v, &s, &varcontext, &workstatus);
+ }
+ mpd_qsub(&t, &three, &t, &maxcontext, &workstatus);
+ mpd_qmul(z, z, &t, &varcontext, &workstatus);
+ mpd_qmul(z, z, &one_half, &maxcontext, &workstatus);
+ }
+
+ z->exp -= adj;
+
+ tz = mpd_trail_zeros(result);
+ shift = ideal_exp - result->exp;
+ shift = (tz > shift) ? shift : tz;
+ if (shift > 0) {
+ mpd_qshiftr_inplace(result, shift);
+ result->exp += shift;
+ }
+
+
+ mpd_del(&s);
+ mpd_del(&t);
+ if (v != &vtmp) mpd_del(v);
+ *status |= (workstatus&MPD_Errors);
+ *status |= (MPD_Rounded|MPD_Inexact);
+}
+
+void
+mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t workctx;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ /* positive infinity */
+ _settriple(result, MPD_POS, 0, mpd_etiny(ctx));
+ *status |= MPD_Clamped;
+ return;
+ }
+ if (mpd_iszero(a)) {
+ mpd_setspecial(result, mpd_sign(a), MPD_INF);
+ *status |= MPD_Division_by_zero;
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ workctx = *ctx;
+ workctx.prec += 2;
+ workctx.round = MPD_ROUND_HALF_EVEN;
+ _mpd_qinvroot(result, a, &workctx, status);
+ mpd_qfinalize(result, ctx, status);
+}
+/* END LIBMPDEC_ONLY */
+
+/* Algorithm from decimal.py */
+void
+mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx,
+ uint32_t *status)
+{
+ mpd_context_t maxcontext;
+ MPD_NEW_STATIC(c,0,0,0,0);
+ MPD_NEW_STATIC(q,0,0,0,0);
+ MPD_NEW_STATIC(r,0,0,0,0);
+ MPD_NEW_CONST(two,0,0,1,1,1,2);
+ mpd_ssize_t prec, ideal_exp;
+ mpd_ssize_t l, shift;
+ int exact = 0;
+
+
+ ideal_exp = (a->exp - (a->exp & 1)) / 2;
+
+ if (mpd_isspecial(a)) {
+ if (mpd_qcheck_nan(result, a, ctx, status)) {
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+ mpd_setspecial(result, MPD_POS, MPD_INF);
+ return;
+ }
+ if (mpd_iszero(a)) {
+ _settriple(result, mpd_sign(a), 0, ideal_exp);
+ mpd_qfinalize(result, ctx, status);
+ return;
+ }
+ if (mpd_isnegative(a)) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ mpd_maxcontext(&maxcontext);
+ prec = ctx->prec + 1;
+
+ if (!mpd_qcopy(&c, a, status)) {
+ goto malloc_error;
+ }
+ c.exp = 0;
+
+ if (a->exp & 1) {
+ if (!mpd_qshiftl(&c, &c, 1, status)) {
+ goto malloc_error;
+ }
+ l = (a->digits >> 1) + 1;
+ }
+ else {
+ l = (a->digits + 1) >> 1;
+ }
+
+ shift = prec - l;
+ if (shift >= 0) {
+ if (!mpd_qshiftl(&c, &c, 2*shift, status)) {
+ goto malloc_error;
+ }
+ exact = 1;
+ }
+ else {
+ exact = !mpd_qshiftr_inplace(&c, -2*shift);
+ }
+
+ ideal_exp -= shift;
+
+ /* find result = floor(sqrt(c)) using Newton's method */
+ if (!mpd_qshiftl(result, &one, prec, status)) {
+ goto malloc_error;
+ }
+
+ while (1) {
+ _mpd_qdivmod(&q, &r, &c, result, &maxcontext, &maxcontext.status);
+ if (mpd_isspecial(result) || mpd_isspecial(&q)) {
+ mpd_seterror(result, maxcontext.status&MPD_Errors, status);
+ goto out;
+ }
+ if (_mpd_cmp(result, &q) <= 0) {
+ break;
+ }
+ _mpd_qadd_exact(result, result, &q, &maxcontext, &maxcontext.status);
+ if (mpd_isspecial(result)) {
+ mpd_seterror(result, maxcontext.status&MPD_Errors, status);
+ goto out;
+ }
+ _mpd_qdivmod(result, &r, result, &two, &maxcontext, &maxcontext.status);
+ }
+
+ if (exact) {
+ _mpd_qmul_exact(&r, result, result, &maxcontext, &maxcontext.status);
+ if (mpd_isspecial(&r)) {
+ mpd_seterror(result, maxcontext.status&MPD_Errors, status);
+ goto out;
+ }
+ exact = (_mpd_cmp(&r, &c) == 0);
+ }
+
+ if (exact) {
+ if (shift >= 0) {
+ mpd_qshiftr_inplace(result, shift);
+ }
+ else {
+ if (!mpd_qshiftl(result, result, -shift, status)) {
+ goto malloc_error;
+ }
+ }
+ ideal_exp += shift;
+ }
+ else {
+ int lsd = (int)mpd_lsd(result->data[0]);
+ if (lsd == 0 || lsd == 5) {
+ result->data[0] += 1;
+ }
+ }
+
+ result->exp = ideal_exp;
+
+
+out:
+ mpd_del(&c);
+ mpd_del(&q);
+ mpd_del(&r);
+ maxcontext = *ctx;
+ maxcontext.round = MPD_ROUND_HALF_EVEN;
+ mpd_qfinalize(result, &maxcontext, status);
+ return;
+
+malloc_error:
+ mpd_seterror(result, MPD_Malloc_error, status);
+ goto out;
+}
+
+
+/******************************************************************************/
+/* Base conversions */
+/******************************************************************************/
+
+/* Space needed to represent an integer mpd_t in base 'base'. */
+size_t
+mpd_sizeinbase(const mpd_t *a, uint32_t base)
+{
+ double x;
+ size_t digits;
+
+ assert(mpd_isinteger(a));
+ assert(base >= 2);
+
+ if (mpd_iszero(a)) {
+ return 1;
+ }
+
+ digits = a->digits+a->exp;
+ assert(digits > 0);
+
+#ifdef CONFIG_64
+ /* ceil(2711437152599294 / log10(2)) + 4 == 2**53 */
+ if (digits > 2711437152599294ULL) {
+ return SIZE_MAX;
+ }
+#endif
+
+ x = (double)digits / log10(base);
+ return (x > SIZE_MAX-1) ? SIZE_MAX : (size_t)x + 1;
+}
+
+/* Space needed to import a base 'base' integer of length 'srclen'. */
+static mpd_ssize_t
+_mpd_importsize(size_t srclen, uint32_t base)
+{
+ double x;
+
+ assert(srclen > 0);
+ assert(base >= 2);
+
+#if SIZE_MAX == UINT64_MAX
+ if (srclen > (1ULL<<53)) {
+ return MPD_SSIZE_MAX;
+ }
+#endif
+
+ x = (double)srclen * (log10(base)/MPD_RDIGITS);
+ return (x >= MPD_MAXIMPORT) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1;
+}
+
+static uint8_t
+mpd_resize_u16(uint16_t **w, size_t nmemb)
+{
+ uint8_t err = 0;
+ *w = mpd_realloc(*w, nmemb, sizeof **w, &err);
+ return !err;
+}
+
+static uint8_t
+mpd_resize_u32(uint32_t **w, size_t nmemb)
+{
+ uint8_t err = 0;
+ *w = mpd_realloc(*w, nmemb, sizeof **w, &err);
+ return !err;
+}
+
+static size_t
+_baseconv_to_u16(uint16_t **w, size_t wlen, mpd_uint_t wbase,
+ mpd_uint_t *u, mpd_ssize_t ulen)
+{
+ size_t n = 0;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(wbase <= (1U<<16));
+
+ do {
+ if (n >= wlen) {
+ if (!mpd_resize_u16(w, n+1)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ (*w)[n++] = (uint16_t)_mpd_shortdiv(u, u, ulen, wbase);
+ /* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
+ ulen = _mpd_real_size(u, ulen);
+
+ } while (u[ulen-1] != 0);
+
+ return n;
+}
+
+static size_t
+_coeff_from_u16(mpd_t *w, mpd_ssize_t wlen,
+ const mpd_uint_t *u, size_t ulen, uint32_t ubase,
+ uint32_t *status)
+{
+ mpd_ssize_t n = 0;
+ mpd_uint_t carry;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(ubase <= (1U<<16));
+
+ w->data[n++] = u[--ulen];
+ while (--ulen != SIZE_MAX) {
+ carry = _mpd_shortmul_c(w->data, w->data, n, ubase);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_qresize(w, n+1, status)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ w->data[n++] = carry;
+ }
+ carry = _mpd_shortadd(w->data, n, u[ulen]);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_qresize(w, n+1, status)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ w->data[n++] = carry;
+ }
+ }
+
+ return n;
+}
+
+/* target base wbase < source base ubase */
+static size_t
+_baseconv_to_smaller(uint32_t **w, size_t wlen, uint32_t wbase,
+ mpd_uint_t *u, mpd_ssize_t ulen, mpd_uint_t ubase)
+{
+ size_t n = 0;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(wbase < ubase);
+
+ do {
+ if (n >= wlen) {
+ if (!mpd_resize_u32(w, n+1)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ (*w)[n++] = (uint32_t)_mpd_shortdiv_b(u, u, ulen, wbase, ubase);
+ /* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
+ ulen = _mpd_real_size(u, ulen);
+
+ } while (u[ulen-1] != 0);
+
+ return n;
+}
+
+#ifdef CONFIG_32
+/* target base 'wbase' == source base 'ubase' */
+static size_t
+_copy_equal_base(uint32_t **w, size_t wlen,
+ const uint32_t *u, size_t ulen)
+{
+ if (wlen < ulen) {
+ if (!mpd_resize_u32(w, ulen)) {
+ return SIZE_MAX;
+ }
+ }
+
+ memcpy(*w, u, ulen * (sizeof **w));
+ return ulen;
+}
+
+/* target base 'wbase' > source base 'ubase' */
+static size_t
+_baseconv_to_larger(uint32_t **w, size_t wlen, mpd_uint_t wbase,
+ const mpd_uint_t *u, size_t ulen, mpd_uint_t ubase)
+{
+ size_t n = 0;
+ mpd_uint_t carry;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(ubase < wbase);
+
+ (*w)[n++] = u[--ulen];
+ while (--ulen != SIZE_MAX) {
+ carry = _mpd_shortmul_b(*w, *w, n, ubase, wbase);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_resize_u32(w, n+1)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ (*w)[n++] = carry;
+ }
+ carry = _mpd_shortadd_b(*w, n, u[ulen], wbase);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_resize_u32(w, n+1)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ (*w)[n++] = carry;
+ }
+ }
+
+ return n;
+}
+
+/* target base wbase < source base ubase */
+static size_t
+_coeff_from_larger_base(mpd_t *w, size_t wlen, mpd_uint_t wbase,
+ mpd_uint_t *u, mpd_ssize_t ulen, mpd_uint_t ubase,
+ uint32_t *status)
+{
+ size_t n = 0;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(wbase < ubase);
+
+ do {
+ if (n >= wlen) {
+ if (!mpd_qresize(w, n+1, status)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ w->data[n++] = (uint32_t)_mpd_shortdiv_b(u, u, ulen, wbase, ubase);
+ /* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
+ ulen = _mpd_real_size(u, ulen);
+
+ } while (u[ulen-1] != 0);
+
+ return n;
+}
+#endif
+
+/* target base 'wbase' > source base 'ubase' */
+static size_t
+_coeff_from_smaller_base(mpd_t *w, mpd_ssize_t wlen, mpd_uint_t wbase,
+ const uint32_t *u, size_t ulen, mpd_uint_t ubase,
+ uint32_t *status)
+{
+ mpd_ssize_t n = 0;
+ mpd_uint_t carry;
+
+ assert(wlen > 0 && ulen > 0);
+ assert(wbase > ubase);
+
+ w->data[n++] = u[--ulen];
+ while (--ulen != SIZE_MAX) {
+ carry = _mpd_shortmul_b(w->data, w->data, n, ubase, wbase);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_qresize(w, n+1, status)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ w->data[n++] = carry;
+ }
+ carry = _mpd_shortadd_b(w->data, n, u[ulen], wbase);
+ if (carry) {
+ if (n >= wlen) {
+ if (!mpd_qresize(w, n+1, status)) {
+ return SIZE_MAX;
+ }
+ wlen = n+1;
+ }
+ w->data[n++] = carry;
+ }
+ }
+
+ return n;
+}
+
+/*
+ * Convert an integer mpd_t to a multiprecision integer with base <= 2**16.
+ * The least significant word of the result is (*rdata)[0].
+ *
+ * If rdata is NULL, space is allocated by the function and rlen is irrelevant.
+ * In case of an error any allocated storage is freed and rdata is set back to
+ * NULL.
+ *
+ * If rdata is non-NULL, it MUST be allocated by one of libmpdec's allocation
+ * functions and rlen MUST be correct. If necessary, the function will resize
+ * rdata. In case of an error the caller must free rdata.
+ *
+ * Return value: In case of success, the exact length of rdata, SIZE_MAX
+ * otherwise.
+ */
+size_t
+mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t rbase,
+ const mpd_t *src, uint32_t *status)
+{
+ MPD_NEW_STATIC(tsrc,0,0,0,0);
+ int alloc = 0; /* rdata == NULL */
+ size_t n;
+
+ assert(rbase <= (1U<<16));
+
+ if (mpd_isspecial(src) || !_mpd_isint(src)) {
+ *status |= MPD_Invalid_operation;
+ return SIZE_MAX;
+ }
+
+ if (*rdata == NULL) {
+ rlen = mpd_sizeinbase(src, rbase);
+ if (rlen == SIZE_MAX) {
+ *status |= MPD_Invalid_operation;
+ return SIZE_MAX;
+ }
+ *rdata = mpd_alloc(rlen, sizeof **rdata);
+ if (*rdata == NULL) {
+ goto malloc_error;
+ }
+ alloc = 1;
+ }
+
+ if (mpd_iszero(src)) {
+ **rdata = 0;
+ return 1;
+ }
+
+ if (src->exp >= 0) {
+ if (!mpd_qshiftl(&tsrc, src, src->exp, status)) {
+ goto malloc_error;
+ }
+ }
+ else {
+ if (mpd_qshiftr(&tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
+ goto malloc_error;
+ }
+ }
+
+ n = _baseconv_to_u16(rdata, rlen, rbase, tsrc.data, tsrc.len);
+ if (n == SIZE_MAX) {
+ goto malloc_error;
+ }
+
+
+out:
+ mpd_del(&tsrc);
+ return n;
+
+malloc_error:
+ if (alloc) {
+ mpd_free(*rdata);
+ *rdata = NULL;
+ }
+ n = SIZE_MAX;
+ *status |= MPD_Malloc_error;
+ goto out;
+}
+
+/*
+ * Convert an integer mpd_t to a multiprecision integer with base<=UINT32_MAX.
+ * The least significant word of the result is (*rdata)[0].
+ *
+ * If rdata is NULL, space is allocated by the function and rlen is irrelevant.
+ * In case of an error any allocated storage is freed and rdata is set back to
+ * NULL.
+ *
+ * If rdata is non-NULL, it MUST be allocated by one of libmpdec's allocation
+ * functions and rlen MUST be correct. If necessary, the function will resize
+ * rdata. In case of an error the caller must free rdata.
+ *
+ * Return value: In case of success, the exact length of rdata, SIZE_MAX
+ * otherwise.
+ */
+size_t
+mpd_qexport_u32(uint32_t **rdata, size_t rlen, uint32_t rbase,
+ const mpd_t *src, uint32_t *status)
+{
+ MPD_NEW_STATIC(tsrc,0,0,0,0);
+ int alloc = 0; /* rdata == NULL */
+ size_t n;
+
+ if (mpd_isspecial(src) || !_mpd_isint(src)) {
+ *status |= MPD_Invalid_operation;
+ return SIZE_MAX;
+ }
+
+ if (*rdata == NULL) {
+ rlen = mpd_sizeinbase(src, rbase);
+ if (rlen == SIZE_MAX) {
+ *status |= MPD_Invalid_operation;
+ return SIZE_MAX;
+ }
+ *rdata = mpd_alloc(rlen, sizeof **rdata);
+ if (*rdata == NULL) {
+ goto malloc_error;
+ }
+ alloc = 1;
+ }
+
+ if (mpd_iszero(src)) {
+ **rdata = 0;
+ return 1;
+ }
+
+ if (src->exp >= 0) {
+ if (!mpd_qshiftl(&tsrc, src, src->exp, status)) {
+ goto malloc_error;
+ }
+ }
+ else {
+ if (mpd_qshiftr(&tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
+ goto malloc_error;
+ }
+ }
+
+#ifdef CONFIG_64
+ n = _baseconv_to_smaller(rdata, rlen, rbase,
+ tsrc.data, tsrc.len, MPD_RADIX);
+#else
+ if (rbase == MPD_RADIX) {
+ n = _copy_equal_base(rdata, rlen, tsrc.data, tsrc.len);
+ }
+ else if (rbase < MPD_RADIX) {
+ n = _baseconv_to_smaller(rdata, rlen, rbase,
+ tsrc.data, tsrc.len, MPD_RADIX);
+ }
+ else {
+ n = _baseconv_to_larger(rdata, rlen, rbase,
+ tsrc.data, tsrc.len, MPD_RADIX);
+ }
+#endif
+
+ if (n == SIZE_MAX) {
+ goto malloc_error;
+ }
+
+
+out:
+ mpd_del(&tsrc);
+ return n;
+
+malloc_error:
+ if (alloc) {
+ mpd_free(*rdata);
+ *rdata = NULL;
+ }
+ n = SIZE_MAX;
+ *status |= MPD_Malloc_error;
+ goto out;
+}
+
+
+/*
+ * Converts a multiprecision integer with base <= UINT16_MAX+1 to an mpd_t.
+ * The least significant word of the source is srcdata[0].
+ */
+void
+mpd_qimport_u16(mpd_t *result,
+ const uint16_t *srcdata, size_t srclen,
+ uint8_t srcsign, uint32_t srcbase,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_uint_t *usrc; /* uint16_t src copied to an mpd_uint_t array */
+ mpd_ssize_t rlen; /* length of the result */
+ size_t n;
+
+ assert(srclen > 0);
+ assert(srcbase <= (1U<<16));
+
+ rlen = _mpd_importsize(srclen, srcbase);
+ if (rlen == MPD_SSIZE_MAX) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc);
+ if (usrc == NULL) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ for (n = 0; n < srclen; n++) {
+ usrc[n] = srcdata[n];
+ }
+
+ if (!mpd_qresize(result, rlen, status)) {
+ goto finish;
+ }
+
+ n = _coeff_from_u16(result, rlen, usrc, srclen, srcbase, status);
+ if (n == SIZE_MAX) {
+ goto finish;
+ }
+
+ mpd_set_flags(result, srcsign);
+ result->exp = 0;
+ result->len = n;
+ mpd_setdigits(result);
+
+ mpd_qresize(result, result->len, status);
+ mpd_qfinalize(result, ctx, status);
+
+
+finish:
+ mpd_free(usrc);
+}
+
+/*
+ * Converts a multiprecision integer with base <= UINT32_MAX to an mpd_t.
+ * The least significant word of the source is srcdata[0].
+ */
+void
+mpd_qimport_u32(mpd_t *result,
+ const uint32_t *srcdata, size_t srclen,
+ uint8_t srcsign, uint32_t srcbase,
+ const mpd_context_t *ctx, uint32_t *status)
+{
+ mpd_ssize_t rlen; /* length of the result */
+ size_t n;
+
+ assert(srclen > 0);
+
+ rlen = _mpd_importsize(srclen, srcbase);
+ if (rlen == MPD_SSIZE_MAX) {
+ mpd_seterror(result, MPD_Invalid_operation, status);
+ return;
+ }
+
+ if (!mpd_qresize(result, rlen, status)) {
+ return;
+ }
+
+#ifdef CONFIG_64
+ n = _coeff_from_smaller_base(result, rlen, MPD_RADIX,
+ srcdata, srclen, srcbase,
+ status);
+#else
+ if (srcbase == MPD_RADIX) {
+ if (!mpd_qresize(result, srclen, status)) {
+ return;
+ }
+ memcpy(result->data, srcdata, srclen * (sizeof *srcdata));
+ n = srclen;
+ }
+ else if (srcbase < MPD_RADIX) {
+ n = _coeff_from_smaller_base(result, rlen, MPD_RADIX,
+ srcdata, srclen, srcbase,
+ status);
+ }
+ else {
+ mpd_uint_t *usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc);
+ if (usrc == NULL) {
+ mpd_seterror(result, MPD_Malloc_error, status);
+ return;
+ }
+ for (n = 0; n < srclen; n++) {
+ usrc[n] = srcdata[n];
+ }
+
+ n = _coeff_from_larger_base(result, rlen, MPD_RADIX,
+ usrc, (mpd_ssize_t)srclen, srcbase,
+ status);
+ mpd_free(usrc);
+ }
+#endif
+
+ if (n == SIZE_MAX) {
+ return;
+ }
+
+ mpd_set_flags(result, srcsign);
+ result->exp = 0;
+ result->len = n;
+ mpd_setdigits(result);
+
+ mpd_qresize(result, result->len, status);
+ mpd_qfinalize(result, ctx, status);
+}
+
+
+
diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h
new file mode 100644
index 0000000..d131c71
--- /dev/null
+++ b/Modules/_decimal/libmpdec/mpdecimal.h
@@ -0,0 +1,800 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef MPDECIMAL_H
+#define MPDECIMAL_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#define __STDC_LIMIT_MACROS
+#endif
+
+
+#ifndef _MSC_VER
+ #include "pyconfig.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <assert.h>
+
+#ifdef _MSC_VER
+ #include "vccompat.h"
+ #ifndef UNUSED
+ #define UNUSED
+ #endif
+ #define EXTINLINE extern inline
+#else
+ #ifdef HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+ #ifdef HAVE_INTTYPES_H
+ #include <inttypes.h>
+ #endif
+ #ifndef __GNUC_STDC_INLINE__
+ #define __GNUC_STDC_INLINE__
+ #endif
+ #if defined(__GNUC__) && !defined(__INTEL_COMPILER)
+ #define UNUSED __attribute__((unused))
+ #else
+ #define UNUSED
+ #endif
+ #define EXTINLINE
+#endif
+
+
+#if !defined(LEGACY_COMPILER)
+ #if !defined(UINT64_MAX)
+ /* The following #error is just a warning. If the compiler indeed does
+ * not have uint64_t, it is perfectly safe to comment out the #error. */
+ #error "Warning: Compiler without uint64_t. Comment out this line."
+ #define LEGACY_COMPILER
+ #endif
+#endif
+
+
+/******************************************************************************/
+/* Configuration */
+/******************************************************************************/
+
+#if defined(UNIVERSAL)
+ #if defined(CONFIG_64) || defined(CONFIG_32)
+ #error "cannot use CONFIG_64 or CONFIG_32 with UNIVERSAL."
+ #endif
+ #if defined(__ppc__)
+ #define CONFIG_32
+ #define ANSI
+ #elif defined(__ppc64__)
+ #define CONFIG_64
+ #define ANSI
+ #elif defined(__i386__)
+ #define CONFIG_32
+ #define ANSI
+ #elif defined(__x86_64__)
+ #define CONFIG_64
+ #define ASM
+ #else
+ #error "unknown architecture for universal build."
+ #endif
+#endif
+
+
+/* BEGIN CONFIG_64 */
+#if defined(CONFIG_64)
+/* types for modular and base arithmetic */
+#define MPD_UINT_MAX UINT64_MAX
+#define MPD_BITS_PER_UINT 64
+typedef uint64_t mpd_uint_t; /* unsigned mod type */
+
+#define MPD_SIZE_MAX SIZE_MAX
+typedef size_t mpd_size_t; /* unsigned size type */
+
+/* type for exp, digits, len, prec */
+#define MPD_SSIZE_MAX INT64_MAX
+#define MPD_SSIZE_MIN INT64_MIN
+typedef int64_t mpd_ssize_t;
+#define _mpd_strtossize strtoll
+
+/* decimal arithmetic */
+#define MPD_RADIX 10000000000000000000ULL /* 10**19 */
+#define MPD_RDIGITS 19
+#define MPD_MAX_POW10 19
+#define MPD_EXPDIGITS 19 /* MPD_EXPDIGITS <= MPD_RDIGITS+1 */
+
+#define MPD_MAXTRANSFORM_2N 4294967296ULL /* 2**32 */
+#define MPD_MAX_PREC 999999999999999999LL
+#define MPD_MAX_PREC_LOG2 64
+#define MPD_ELIMIT 1000000000000000000LL
+#define MPD_MAX_EMAX 999999999999999999LL /* ELIMIT-1 */
+#define MPD_MIN_EMIN (-999999999999999999LL) /* -EMAX */
+#define MPD_MIN_ETINY (MPD_MIN_EMIN-(MPD_MAX_PREC-1))
+#define MPD_EXP_INF 2000000000000000001LL
+#define MPD_EXP_CLAMP (-4000000000000000001LL)
+#define MPD_MAXIMPORT 105263157894736842L /* ceil((2*MPD_MAX_PREC)/MPD_RDIGITS) */
+
+/* conversion specifiers */
+#define PRI_mpd_uint_t PRIu64
+#define PRI_mpd_ssize_t PRIi64
+/* END CONFIG_64 */
+
+
+/* BEGIN CONFIG_32 */
+#elif defined(CONFIG_32)
+/* types for modular and base arithmetic */
+#define MPD_UINT_MAX UINT32_MAX
+#define MPD_BITS_PER_UINT 32
+typedef uint32_t mpd_uint_t; /* unsigned mod type */
+
+#ifndef LEGACY_COMPILER
+#define MPD_UUINT_MAX UINT64_MAX
+typedef uint64_t mpd_uuint_t; /* double width unsigned mod type */
+#endif
+
+#define MPD_SIZE_MAX SIZE_MAX
+typedef size_t mpd_size_t; /* unsigned size type */
+
+/* type for dec->len, dec->exp, ctx->prec */
+#define MPD_SSIZE_MAX INT32_MAX
+#define MPD_SSIZE_MIN INT32_MIN
+typedef int32_t mpd_ssize_t;
+#define _mpd_strtossize strtol
+
+/* decimal arithmetic */
+#define MPD_RADIX 1000000000UL /* 10**9 */
+#define MPD_RDIGITS 9
+#define MPD_MAX_POW10 9
+#define MPD_EXPDIGITS 10 /* MPD_EXPDIGITS <= MPD_RDIGITS+1 */
+
+#define MPD_MAXTRANSFORM_2N 33554432UL /* 2**25 */
+#define MPD_MAX_PREC 425000000L
+#define MPD_MAX_PREC_LOG2 32
+#define MPD_ELIMIT 425000001L
+#define MPD_MAX_EMAX 425000000L /* ELIMIT-1 */
+#define MPD_MIN_EMIN (-425000000L) /* -EMAX */
+#define MPD_MIN_ETINY (MPD_MIN_EMIN-(MPD_MAX_PREC-1))
+#define MPD_EXP_INF 1000000001L /* allows for emax=999999999 in the tests */
+#define MPD_EXP_CLAMP (-2000000001L) /* allows for emin=-999999999 in the tests */
+#define MPD_MAXIMPORT 94444445L /* ceil((2*MPD_MAX_PREC)/MPD_RDIGITS) */
+
+/* conversion specifiers */
+#define PRI_mpd_uint_t PRIu32
+#define PRI_mpd_ssize_t PRIi32
+/* END CONFIG_32 */
+
+#else
+ #error "define CONFIG_64 or CONFIG_32"
+#endif
+/* END CONFIG */
+
+
+#if MPD_SIZE_MAX != MPD_UINT_MAX
+ #error "unsupported platform: need mpd_size_t == mpd_uint_t"
+#endif
+
+
+/******************************************************************************/
+/* Context */
+/******************************************************************************/
+
+enum {
+ MPD_ROUND_UP, /* round away from 0 */
+ MPD_ROUND_DOWN, /* round toward 0 (truncate) */
+ MPD_ROUND_CEILING, /* round toward +infinity */
+ MPD_ROUND_FLOOR, /* round toward -infinity */
+ MPD_ROUND_HALF_UP, /* 0.5 is rounded up */
+ MPD_ROUND_HALF_DOWN, /* 0.5 is rounded down */
+ MPD_ROUND_HALF_EVEN, /* 0.5 is rounded to even */
+ MPD_ROUND_05UP, /* round zero or five away from 0 */
+ MPD_ROUND_TRUNC, /* truncate, but set infinity */
+ MPD_ROUND_GUARD
+};
+
+enum { MPD_CLAMP_DEFAULT, MPD_CLAMP_IEEE_754, MPD_CLAMP_GUARD };
+
+extern const char *mpd_round_string[MPD_ROUND_GUARD];
+extern const char *mpd_clamp_string[MPD_CLAMP_GUARD];
+
+
+typedef struct {
+ mpd_ssize_t prec; /* precision */
+ mpd_ssize_t emax; /* max positive exp */
+ mpd_ssize_t emin; /* min negative exp */
+ uint32_t traps; /* status events that should be trapped */
+ uint32_t status; /* status flags */
+ uint32_t newtrap; /* set by mpd_addstatus_raise() */
+ int round; /* rounding mode */
+ int clamp; /* clamp mode */
+ int allcr; /* all functions correctly rounded */
+} mpd_context_t;
+
+
+/* Status flags */
+#define MPD_Clamped 0x00000001U
+#define MPD_Conversion_syntax 0x00000002U
+#define MPD_Division_by_zero 0x00000004U
+#define MPD_Division_impossible 0x00000008U
+#define MPD_Division_undefined 0x00000010U
+#define MPD_Fpu_error 0x00000020U
+#define MPD_Inexact 0x00000040U
+#define MPD_Invalid_context 0x00000080U
+#define MPD_Invalid_operation 0x00000100U
+#define MPD_Malloc_error 0x00000200U
+#define MPD_Not_implemented 0x00000400U
+#define MPD_Overflow 0x00000800U
+#define MPD_Rounded 0x00001000U
+#define MPD_Subnormal 0x00002000U
+#define MPD_Underflow 0x00004000U
+#define MPD_Max_status (0x00008000U-1U)
+
+/* Conditions that result in an IEEE 754 exception */
+#define MPD_IEEE_Invalid_operation (MPD_Conversion_syntax | \
+ MPD_Division_impossible | \
+ MPD_Division_undefined | \
+ MPD_Fpu_error | \
+ MPD_Invalid_context | \
+ MPD_Invalid_operation | \
+ MPD_Malloc_error) \
+
+/* Errors that require the result of an operation to be set to NaN */
+#define MPD_Errors (MPD_IEEE_Invalid_operation | \
+ MPD_Division_by_zero)
+
+/* Default traps */
+#define MPD_Traps (MPD_IEEE_Invalid_operation | \
+ MPD_Division_by_zero | \
+ MPD_Overflow | \
+ MPD_Underflow)
+
+/* Official name */
+#define MPD_Insufficient_storage MPD_Malloc_error
+
+/* IEEE 754 interchange format contexts */
+#define MPD_IEEE_CONTEXT_MAX_BITS 512 /* 16*(log2(MPD_MAX_EMAX / 3)-3) */
+#define MPD_DECIMAL32 32
+#define MPD_DECIMAL64 64
+#define MPD_DECIMAL128 128
+
+
+#define MPD_MINALLOC_MIN 2
+#define MPD_MINALLOC_MAX 64
+extern mpd_ssize_t MPD_MINALLOC;
+extern void (* mpd_traphandler)(mpd_context_t *);
+void mpd_dflt_traphandler(mpd_context_t *);
+
+void mpd_setminalloc(mpd_ssize_t n);
+void mpd_init(mpd_context_t *ctx, mpd_ssize_t prec);
+
+void mpd_maxcontext(mpd_context_t *ctx);
+void mpd_defaultcontext(mpd_context_t *ctx);
+void mpd_basiccontext(mpd_context_t *ctx);
+int mpd_ieee_context(mpd_context_t *ctx, int bits);
+
+mpd_ssize_t mpd_getprec(const mpd_context_t *ctx);
+mpd_ssize_t mpd_getemax(const mpd_context_t *ctx);
+mpd_ssize_t mpd_getemin(const mpd_context_t *ctx);
+int mpd_getround(const mpd_context_t *ctx);
+uint32_t mpd_gettraps(const mpd_context_t *ctx);
+uint32_t mpd_getstatus(const mpd_context_t *ctx);
+int mpd_getclamp(const mpd_context_t *ctx);
+int mpd_getcr(const mpd_context_t *ctx);
+
+int mpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec);
+int mpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax);
+int mpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin);
+int mpd_qsetround(mpd_context_t *ctx, int newround);
+int mpd_qsettraps(mpd_context_t *ctx, uint32_t flags);
+int mpd_qsetstatus(mpd_context_t *ctx, uint32_t flags);
+int mpd_qsetclamp(mpd_context_t *ctx, int c);
+int mpd_qsetcr(mpd_context_t *ctx, int c);
+void mpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags);
+
+
+/******************************************************************************/
+/* Decimal Arithmetic */
+/******************************************************************************/
+
+/* mpd_t flags */
+#define MPD_POS ((uint8_t)0)
+#define MPD_NEG ((uint8_t)1)
+#define MPD_INF ((uint8_t)2)
+#define MPD_NAN ((uint8_t)4)
+#define MPD_SNAN ((uint8_t)8)
+#define MPD_SPECIAL (MPD_INF|MPD_NAN|MPD_SNAN)
+#define MPD_STATIC ((uint8_t)16)
+#define MPD_STATIC_DATA ((uint8_t)32)
+#define MPD_SHARED_DATA ((uint8_t)64)
+#define MPD_CONST_DATA ((uint8_t)128)
+#define MPD_DATAFLAGS (MPD_STATIC_DATA|MPD_SHARED_DATA|MPD_CONST_DATA)
+
+/* mpd_t */
+typedef struct {
+ uint8_t flags;
+ mpd_ssize_t exp;
+ mpd_ssize_t digits;
+ mpd_ssize_t len;
+ mpd_ssize_t alloc;
+ mpd_uint_t *data;
+} mpd_t;
+
+
+typedef unsigned char uchar;
+
+
+/******************************************************************************/
+/* Quiet, thread-safe functions */
+/******************************************************************************/
+
+/* format specification */
+typedef struct {
+ mpd_ssize_t min_width; /* minimum field width */
+ mpd_ssize_t prec; /* fraction digits or significant digits */
+ char type; /* conversion specifier */
+ char align; /* alignment */
+ char sign; /* sign printing/alignment */
+ char fill[5]; /* fill character */
+ const char *dot; /* decimal point */
+ const char *sep; /* thousands separator */
+ const char *grouping; /* grouping of digits */
+} mpd_spec_t;
+
+/* output to a string */
+char *mpd_to_sci(const mpd_t *dec, int fmt);
+char *mpd_to_eng(const mpd_t *dec, int fmt);
+mpd_ssize_t mpd_to_sci_size(char **res, const mpd_t *dec, int fmt);
+mpd_ssize_t mpd_to_eng_size(char **res, const mpd_t *dec, int fmt);
+int mpd_validate_lconv(mpd_spec_t *spec);
+int mpd_parse_fmt_str(mpd_spec_t *spec, const char *fmt, int caps);
+char * mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, const mpd_context_t *ctx, uint32_t *status);
+char *mpd_qformat(const mpd_t *dec, const char *fmt, const mpd_context_t *ctx, uint32_t *status);
+
+#define MPD_NUM_FLAGS 15
+#define MPD_MAX_FLAG_STRING 208
+#define MPD_MAX_FLAG_LIST (MPD_MAX_FLAG_STRING+18)
+#define MPD_MAX_SIGNAL_LIST 121
+int mpd_snprint_flags(char *dest, int nmemb, uint32_t flags);
+int mpd_lsnprint_flags(char *dest, int nmemb, uint32_t flags, const char *flag_string[]);
+int mpd_lsnprint_signals(char *dest, int nmemb, uint32_t flags, const char *signal_string[]);
+
+/* output to a file */
+void mpd_fprint(FILE *file, const mpd_t *dec);
+void mpd_print(const mpd_t *dec);
+
+/* assignment from a string */
+void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, uint32_t *status);
+
+/* set to NaN with error flags */
+void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status);
+/* set a special with sign and type */
+void mpd_setspecial(mpd_t *dec, uint8_t sign, uint8_t type);
+/* set coefficient to zero or all nines */
+void mpd_zerocoeff(mpd_t *result);
+void mpd_qmaxcoeff(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);
+
+/* quietly assign a C integer type to an mpd_t */
+void mpd_qset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t *status);
+#ifndef LEGACY_COMPILER
+void mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status);
+#endif
+
+/* quietly assign a C integer type to an mpd_t with a static coefficient */
+void mpd_qsset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t *status);
+
+/* quietly get a C integer type from an mpd_t */
+mpd_ssize_t mpd_qget_ssize(const mpd_t *dec, uint32_t *status);
+mpd_uint_t mpd_qget_uint(const mpd_t *dec, uint32_t *status);
+mpd_uint_t mpd_qabs_uint(const mpd_t *dec, uint32_t *status);
+
+
+/* quiet functions */
+int mpd_qcheck_nan(mpd_t *nanresult, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+int mpd_qcheck_nans(mpd_t *nanresult, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);
+
+const char * mpd_class(const mpd_t *a, const mpd_context_t *ctx);
+
+int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status);
+mpd_t *mpd_qncopy(const mpd_t *a);
+int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status);
+int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status);
+int mpd_qcopy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t *status);
+
+void mpd_qand(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qinvert(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qlogb(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qor(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qscaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qxor(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+int mpd_same_quantum(const mpd_t *a, const mpd_t *b);
+
+void mpd_qrotate(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+int mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status);
+mpd_uint_t mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status);
+mpd_uint_t mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n);
+void mpd_qshift(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qshiftn(mpd_t *result, const mpd_t *a, mpd_ssize_t n, const mpd_context_t *ctx, uint32_t *status);
+
+int mpd_qcmp(const mpd_t *a, const mpd_t *b, uint32_t *status);
+int mpd_qcompare(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+int mpd_qcompare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+int mpd_cmp_total(const mpd_t *a, const mpd_t *b);
+int mpd_cmp_total_mag(const mpd_t *a, const mpd_t *b);
+int mpd_compare_total(mpd_t *result, const mpd_t *a, const mpd_t *b);
+int mpd_compare_total_mag(mpd_t *result, const mpd_t *a, const mpd_t *b);
+
+void mpd_qround_to_intx(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qround_to_int(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qtrunc(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qfloor(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qceil(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+
+void mpd_qabs(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmax(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmax_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmin(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmin_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qminus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qplus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qnext_minus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qnext_plus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qnext_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qquantize(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qrescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qrescale_fmt(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qreduce(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qfma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdivint(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qrem(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qpow(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qpowmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_t *mod, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qln10(mpd_t *result, mpd_ssize_t prec, uint32_t *status);
+void mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qlog10(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
+
+
+size_t mpd_sizeinbase(const mpd_t *a, uint32_t base);
+void mpd_qimport_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen,
+ uint8_t srcsign, uint32_t srcbase,
+ const mpd_context_t *ctx, uint32_t *status);
+void mpd_qimport_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen,
+ uint8_t srcsign, uint32_t srcbase,
+ const mpd_context_t *ctx, uint32_t *status);
+size_t mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t base,
+ const mpd_t *src, uint32_t *status);
+size_t mpd_qexport_u32(uint32_t **rdata, size_t rlen, uint32_t base,
+ const mpd_t *src, uint32_t *status);
+
+
+/******************************************************************************/
+/* Signalling functions */
+/******************************************************************************/
+
+char * mpd_format(const mpd_t *dec, const char *fmt, mpd_context_t *ctx);
+void mpd_import_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);
+void mpd_import_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);
+size_t mpd_export_u16(uint16_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
+size_t mpd_export_u32(uint32_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
+void mpd_finalize(mpd_t *result, mpd_context_t *ctx);
+int mpd_check_nan(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+int mpd_check_nans(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_set_string(mpd_t *result, const char *s, mpd_context_t *ctx);
+void mpd_maxcoeff(mpd_t *result, mpd_context_t *ctx);
+void mpd_sset_ssize(mpd_t *result, mpd_ssize_t a, mpd_context_t *ctx);
+void mpd_sset_i32(mpd_t *result, int32_t a, mpd_context_t *ctx);
+void mpd_sset_uint(mpd_t *result, mpd_uint_t a, mpd_context_t *ctx);
+void mpd_sset_u32(mpd_t *result, uint32_t a, mpd_context_t *ctx);
+void mpd_set_ssize(mpd_t *result, mpd_ssize_t a, mpd_context_t *ctx);
+void mpd_set_i32(mpd_t *result, int32_t a, mpd_context_t *ctx);
+void mpd_set_uint(mpd_t *result, mpd_uint_t a, mpd_context_t *ctx);
+void mpd_set_u32(mpd_t *result, uint32_t a, mpd_context_t *ctx);
+#ifndef LEGACY_COMPILER
+void mpd_set_i64(mpd_t *result, int64_t a, mpd_context_t *ctx);
+void mpd_set_u64(mpd_t *result, uint64_t a, mpd_context_t *ctx);
+#endif
+mpd_ssize_t mpd_get_ssize(const mpd_t *a, mpd_context_t *ctx);
+mpd_uint_t mpd_get_uint(const mpd_t *a, mpd_context_t *ctx);
+mpd_uint_t mpd_abs_uint(const mpd_t *a, mpd_context_t *ctx);
+void mpd_and(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_copy(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_canonical(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_copy_abs(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_copy_negate(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_copy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_invert(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_logb(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_or(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_rotate(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_scaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_shiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);
+mpd_uint_t mpd_shiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);
+void mpd_shiftn(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);
+void mpd_shift(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_xor(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_abs(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+int mpd_cmp(const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+int mpd_compare(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+int mpd_compare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_add(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_add_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);
+void mpd_add_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);
+void mpd_add_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);
+void mpd_add_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);
+void mpd_sub(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_sub_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);
+void mpd_sub_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);
+void mpd_sub_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);
+void mpd_sub_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);
+void mpd_div(mpd_t *q, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_div_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);
+void mpd_div_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);
+void mpd_div_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);
+void mpd_div_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);
+void mpd_divmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_divint(mpd_t *q, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_exp(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_fma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, mpd_context_t *ctx);
+void mpd_ln(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_log10(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_max(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_max_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_min(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_min_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_minus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_mul(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_mul_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);
+void mpd_mul_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);
+void mpd_mul_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);
+void mpd_mul_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);
+void mpd_next_minus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_next_plus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_next_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_plus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_pow(mpd_t *result, const mpd_t *base, const mpd_t *exp, mpd_context_t *ctx);
+void mpd_powmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_t *mod, mpd_context_t *ctx);
+void mpd_quantize(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_rescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, mpd_context_t *ctx);
+void mpd_reduce(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_rem(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_rem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
+void mpd_round_to_intx(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_round_to_int(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_trunc(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_floor(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_ceil(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_sqrt(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+void mpd_invroot(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
+
+
+/******************************************************************************/
+/* Configuration specific */
+/******************************************************************************/
+
+#ifdef CONFIG_64
+void mpd_qsset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status);
+int64_t mpd_qget_i64(const mpd_t *dec, uint32_t *status);
+uint64_t mpd_qget_u64(const mpd_t *dec, uint32_t *status);
+
+void mpd_qadd_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qadd_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);
+
+void mpd_sset_i64(mpd_t *result, int64_t a, mpd_context_t *ctx);
+void mpd_sset_u64(mpd_t *result, uint64_t a, mpd_context_t *ctx);
+int64_t mpd_get_i64(const mpd_t *a, mpd_context_t *ctx);
+uint64_t mpd_get_u64(const mpd_t *a, mpd_context_t *ctx);
+
+void mpd_add_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);
+void mpd_add_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);
+void mpd_sub_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);
+void mpd_sub_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);
+void mpd_div_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);
+void mpd_div_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);
+void mpd_mul_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);
+void mpd_mul_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);
+#else
+int32_t mpd_qget_i32(const mpd_t *dec, uint32_t *status);
+uint32_t mpd_qget_u32(const mpd_t *dec, uint32_t *status);
+int32_t mpd_get_i32(const mpd_t *a, mpd_context_t *ctx);
+uint32_t mpd_get_u32(const mpd_t *a, mpd_context_t *ctx);
+#endif
+
+
+/******************************************************************************/
+/* Get attributes of a decimal */
+/******************************************************************************/
+
+EXTINLINE mpd_ssize_t mpd_adjexp(const mpd_t *dec);
+EXTINLINE mpd_ssize_t mpd_etiny(const mpd_context_t *ctx);
+EXTINLINE mpd_ssize_t mpd_etop(const mpd_context_t *ctx);
+EXTINLINE mpd_uint_t mpd_msword(const mpd_t *dec);
+EXTINLINE int mpd_word_digits(mpd_uint_t word);
+/* most significant digit of a word */
+EXTINLINE mpd_uint_t mpd_msd(mpd_uint_t word);
+/* least significant digit of a word */
+EXTINLINE mpd_uint_t mpd_lsd(mpd_uint_t word);
+/* coefficient size needed to store 'digits' */
+EXTINLINE mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits);
+/* number of digits in the exponent, undefined for MPD_SSIZE_MIN */
+EXTINLINE int mpd_exp_digits(mpd_ssize_t exp);
+EXTINLINE int mpd_iscanonical(const mpd_t *dec UNUSED);
+EXTINLINE int mpd_isfinite(const mpd_t *dec);
+EXTINLINE int mpd_isinfinite(const mpd_t *dec);
+EXTINLINE int mpd_isinteger(const mpd_t *dec);
+EXTINLINE int mpd_isnan(const mpd_t *dec);
+EXTINLINE int mpd_isnegative(const mpd_t *dec);
+EXTINLINE int mpd_ispositive(const mpd_t *dec);
+EXTINLINE int mpd_isqnan(const mpd_t *dec);
+EXTINLINE int mpd_issigned(const mpd_t *dec);
+EXTINLINE int mpd_issnan(const mpd_t *dec);
+EXTINLINE int mpd_isspecial(const mpd_t *dec);
+EXTINLINE int mpd_iszero(const mpd_t *dec);
+/* undefined for special numbers */
+EXTINLINE int mpd_iszerocoeff(const mpd_t *dec);
+EXTINLINE int mpd_isnormal(const mpd_t *dec, const mpd_context_t *ctx);
+EXTINLINE int mpd_issubnormal(const mpd_t *dec, const mpd_context_t *ctx);
+/* odd word */
+EXTINLINE int mpd_isoddword(mpd_uint_t word);
+/* odd coefficient */
+EXTINLINE int mpd_isoddcoeff(const mpd_t *dec);
+/* odd decimal, only defined for integers */
+int mpd_isodd(const mpd_t *dec);
+/* even decimal, only defined for integers */
+int mpd_iseven(const mpd_t *dec);
+/* 0 if dec is positive, 1 if dec is negative */
+EXTINLINE uint8_t mpd_sign(const mpd_t *dec);
+/* 1 if dec is positive, -1 if dec is negative */
+EXTINLINE int mpd_arith_sign(const mpd_t *dec);
+EXTINLINE long mpd_radix(void);
+EXTINLINE int mpd_isdynamic(mpd_t *dec);
+EXTINLINE int mpd_isstatic(mpd_t *dec);
+EXTINLINE int mpd_isdynamic_data(mpd_t *dec);
+EXTINLINE int mpd_isstatic_data(mpd_t *dec);
+EXTINLINE int mpd_isshared_data(mpd_t *dec);
+EXTINLINE int mpd_isconst_data(mpd_t *dec);
+EXTINLINE mpd_ssize_t mpd_trail_zeros(const mpd_t *dec);
+
+
+/******************************************************************************/
+/* Set attributes of a decimal */
+/******************************************************************************/
+
+/* set number of decimal digits in the coefficient */
+EXTINLINE void mpd_setdigits(mpd_t *result);
+EXTINLINE void mpd_set_sign(mpd_t *result, uint8_t sign);
+/* copy sign from another decimal */
+EXTINLINE void mpd_signcpy(mpd_t *result, mpd_t *a);
+EXTINLINE void mpd_set_infinity(mpd_t *result);
+EXTINLINE void mpd_set_qnan(mpd_t *result);
+EXTINLINE void mpd_set_snan(mpd_t *result);
+EXTINLINE void mpd_set_negative(mpd_t *result);
+EXTINLINE void mpd_set_positive(mpd_t *result);
+EXTINLINE void mpd_set_dynamic(mpd_t *result);
+EXTINLINE void mpd_set_static(mpd_t *result);
+EXTINLINE void mpd_set_dynamic_data(mpd_t *result);
+EXTINLINE void mpd_set_static_data(mpd_t *result);
+EXTINLINE void mpd_set_shared_data(mpd_t *result);
+EXTINLINE void mpd_set_const_data(mpd_t *result);
+EXTINLINE void mpd_clear_flags(mpd_t *result);
+EXTINLINE void mpd_set_flags(mpd_t *result, uint8_t flags);
+EXTINLINE void mpd_copy_flags(mpd_t *result, const mpd_t *a);
+
+
+/******************************************************************************/
+/* Error Macros */
+/******************************************************************************/
+
+#define mpd_err_fatal(...) \
+ do {fprintf(stderr, "%s:%d: error: ", __FILE__, __LINE__); \
+ fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); \
+ abort(); \
+ } while (0)
+#define mpd_err_warn(...) \
+ do {fprintf(stderr, "%s:%d: warning: ", __FILE__, __LINE__); \
+ fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); \
+ } while (0)
+
+
+/******************************************************************************/
+/* Memory handling */
+/******************************************************************************/
+
+extern void *(* mpd_mallocfunc)(size_t size);
+extern void *(* mpd_callocfunc)(size_t nmemb, size_t size);
+extern void *(* mpd_reallocfunc)(void *ptr, size_t size);
+extern void (* mpd_free)(void *ptr);
+
+void *mpd_callocfunc_em(size_t nmemb, size_t size);
+
+void *mpd_alloc(mpd_size_t nmemb, mpd_size_t size);
+void *mpd_calloc(mpd_size_t nmemb, mpd_size_t size);
+void *mpd_realloc(void *ptr, mpd_size_t nmemb, mpd_size_t size, uint8_t *err);
+void *mpd_sh_alloc(mpd_size_t struct_size, mpd_size_t nmemb, mpd_size_t size);
+
+mpd_t *mpd_qnew(void);
+mpd_t *mpd_new(mpd_context_t *ctx);
+mpd_t *mpd_qnew_size(mpd_ssize_t size);
+void mpd_del(mpd_t *dec);
+
+void mpd_uint_zero(mpd_uint_t *dest, mpd_size_t len);
+int mpd_qresize(mpd_t *result, mpd_ssize_t size, uint32_t *status);
+int mpd_qresize_zero(mpd_t *result, mpd_ssize_t size, uint32_t *status);
+void mpd_minalloc(mpd_t *result);
+
+int mpd_resize(mpd_t *result, mpd_ssize_t size, mpd_context_t *ctx);
+int mpd_resize_zero(mpd_t *result, mpd_ssize_t size, mpd_context_t *ctx);
+
+
+#ifdef __cplusplus
+} /* END extern "C" */
+#endif
+
+
+#endif /* MPDECIMAL_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/numbertheory.c b/Modules/_decimal/libmpdec/numbertheory.c
new file mode 100644
index 0000000..10ce6dc
--- /dev/null
+++ b/Modules/_decimal/libmpdec/numbertheory.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdlib.h>
+#include <assert.h>
+#include "bits.h"
+#include "umodarith.h"
+#include "numbertheory.h"
+
+
+/* Bignum: Initialize the Number Theoretic Transform. */
+
+
+/*
+ * Return the nth root of unity in F(p). This corresponds to e**((2*pi*i)/n)
+ * in the Fourier transform. We have w**n == 1 (mod p).
+ * n := transform length.
+ * sign := -1 for forward transform, 1 for backward transform.
+ * modnum := one of {P1, P2, P3}.
+ */
+mpd_uint_t
+_mpd_getkernel(mpd_uint_t n, int sign, int modnum)
+{
+ mpd_uint_t umod, p, r, xi;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+
+ SETMODULUS(modnum);
+ r = mpd_roots[modnum]; /* primitive root of F(p) */
+ p = umod;
+ xi = (p-1) / n;
+
+ if (sign == -1)
+ return POWMOD(r, (p-1-xi));
+ else
+ return POWMOD(r, xi);
+}
+
+/*
+ * Initialize and return transform parameters.
+ * n := transform length.
+ * sign := -1 for forward transform, 1 for backward transform.
+ * modnum := one of {P1, P2, P3}.
+ */
+struct fnt_params *
+_mpd_init_fnt_params(mpd_size_t n, int sign, int modnum)
+{
+ struct fnt_params *tparams;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t kernel, w;
+ mpd_uint_t i;
+ mpd_size_t nhalf;
+
+ assert(ispower2(n));
+ assert(sign == -1 || sign == 1);
+ assert(P1 <= modnum && modnum <= P3);
+
+ nhalf = n/2;
+ tparams = mpd_sh_alloc(sizeof *tparams, nhalf, sizeof (mpd_uint_t));
+ if (tparams == NULL) {
+ return NULL;
+ }
+
+ SETMODULUS(modnum);
+ kernel = _mpd_getkernel(n, sign, modnum);
+
+ tparams->modnum = modnum;
+ tparams->modulus = umod;
+ tparams->kernel = kernel;
+
+ /* wtable[] := w**0, w**1, ..., w**(nhalf-1) */
+ w = 1;
+ for (i = 0; i < nhalf; i++) {
+ tparams->wtable[i] = w;
+ w = MULMOD(w, kernel);
+ }
+
+ return tparams;
+}
+
+/* Initialize wtable of size three. */
+void
+_mpd_init_w3table(mpd_uint_t w3table[3], int sign, int modnum)
+{
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t kernel;
+
+ SETMODULUS(modnum);
+ kernel = _mpd_getkernel(3, sign, modnum);
+
+ w3table[0] = 1;
+ w3table[1] = kernel;
+ w3table[2] = POWMOD(kernel, 2);
+}
+
+
diff --git a/Modules/_decimal/libmpdec/numbertheory.h b/Modules/_decimal/libmpdec/numbertheory.h
new file mode 100644
index 0000000..f54d11d
--- /dev/null
+++ b/Modules/_decimal/libmpdec/numbertheory.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef NUMBER_THEORY_H
+#define NUMBER_THEORY_H
+
+
+#include "constants.h"
+#include "mpdecimal.h"
+
+
+/* transform parameters */
+struct fnt_params {
+ int modnum;
+ mpd_uint_t modulus;
+ mpd_uint_t kernel;
+ mpd_uint_t wtable[];
+};
+
+
+mpd_uint_t _mpd_getkernel(mpd_uint_t n, int sign, int modnum);
+struct fnt_params *_mpd_init_fnt_params(mpd_size_t n, int sign, int modnum);
+void _mpd_init_w3table(mpd_uint_t w3table[3], int sign, int modnum);
+
+
+#ifdef PPRO
+static inline void
+ppro_setmodulus(int modnum, mpd_uint_t *umod, double *dmod, uint32_t dinvmod[3])
+{
+ *dmod = *umod = mpd_moduli[modnum];
+ dinvmod[0] = mpd_invmoduli[modnum][0];
+ dinvmod[1] = mpd_invmoduli[modnum][1];
+ dinvmod[2] = mpd_invmoduli[modnum][2];
+}
+#else
+static inline void
+std_setmodulus(int modnum, mpd_uint_t *umod)
+{
+ *umod = mpd_moduli[modnum];
+}
+#endif
+
+
+#endif
+
+
diff --git a/Modules/_decimal/libmpdec/sixstep.c b/Modules/_decimal/libmpdec/sixstep.c
new file mode 100644
index 0000000..7d0542d
--- /dev/null
+++ b/Modules/_decimal/libmpdec/sixstep.c
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "bits.h"
+#include "difradix2.h"
+#include "numbertheory.h"
+#include "transpose.h"
+#include "umodarith.h"
+#include "sixstep.h"
+
+
+/* Bignum: Cache efficient Matrix Fourier Transform for arrays of the
+ form 2**n (See literature/six-step.txt). */
+
+
+/* forward transform with sign = -1 */
+int
+six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ struct fnt_params *tparams;
+ mpd_size_t log2n, C, R;
+ mpd_uint_t kernel;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t *x, w0, w1, wstep;
+ mpd_size_t i, k;
+
+
+ assert(ispower2(n));
+ assert(n >= 16);
+ assert(n <= MPD_MAXTRANSFORM_2N);
+
+ log2n = mpd_bsr(n);
+ C = ((mpd_size_t)1) << (log2n / 2); /* number of columns */
+ R = ((mpd_size_t)1) << (log2n - (log2n / 2)); /* number of rows */
+
+
+ /* Transpose the matrix. */
+ if (!transpose_pow2(a, R, C)) {
+ return 0;
+ }
+
+ /* Length R transform on the rows. */
+ if ((tparams = _mpd_init_fnt_params(R, -1, modnum)) == NULL) {
+ return 0;
+ }
+ for (x = a; x < a+n; x += R) {
+ fnt_dif2(x, R, tparams);
+ }
+
+ /* Transpose the matrix. */
+ if (!transpose_pow2(a, C, R)) {
+ mpd_free(tparams);
+ return 0;
+ }
+
+ /* Multiply each matrix element (addressed by i*C+k) by r**(i*k). */
+ SETMODULUS(modnum);
+ kernel = _mpd_getkernel(n, -1, modnum);
+ for (i = 1; i < R; i++) {
+ w0 = 1; /* r**(i*0): initial value for k=0 */
+ w1 = POWMOD(kernel, i); /* r**(i*1): initial value for k=1 */
+ wstep = MULMOD(w1, w1); /* r**(2*i) */
+ for (k = 0; k < C; k += 2) {
+ mpd_uint_t x0 = a[i*C+k];
+ mpd_uint_t x1 = a[i*C+k+1];
+ MULMOD2(&x0, w0, &x1, w1);
+ MULMOD2C(&w0, &w1, wstep); /* r**(i*(k+2)) = r**(i*k) * r**(2*i) */
+ a[i*C+k] = x0;
+ a[i*C+k+1] = x1;
+ }
+ }
+
+ /* Length C transform on the rows. */
+ if (C != R) {
+ mpd_free(tparams);
+ if ((tparams = _mpd_init_fnt_params(C, -1, modnum)) == NULL) {
+ return 0;
+ }
+ }
+ for (x = a; x < a+n; x += C) {
+ fnt_dif2(x, C, tparams);
+ }
+ mpd_free(tparams);
+
+#if 0
+ /* An unordered transform is sufficient for convolution. */
+ /* Transpose the matrix. */
+ if (!transpose_pow2(a, R, C)) {
+ return 0;
+ }
+#endif
+
+ return 1;
+}
+
+
+/* reverse transform, sign = 1 */
+int
+inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum)
+{
+ struct fnt_params *tparams;
+ mpd_size_t log2n, C, R;
+ mpd_uint_t kernel;
+ mpd_uint_t umod;
+#ifdef PPRO
+ double dmod;
+ uint32_t dinvmod[3];
+#endif
+ mpd_uint_t *x, w0, w1, wstep;
+ mpd_size_t i, k;
+
+
+ assert(ispower2(n));
+ assert(n >= 16);
+ assert(n <= MPD_MAXTRANSFORM_2N);
+
+ log2n = mpd_bsr(n);
+ C = ((mpd_size_t)1) << (log2n / 2); /* number of columns */
+ R = ((mpd_size_t)1) << (log2n - (log2n / 2)); /* number of rows */
+
+
+#if 0
+ /* An unordered transform is sufficient for convolution. */
+ /* Transpose the matrix, producing an R*C matrix. */
+ if (!transpose_pow2(a, C, R)) {
+ return 0;
+ }
+#endif
+
+ /* Length C transform on the rows. */
+ if ((tparams = _mpd_init_fnt_params(C, 1, modnum)) == NULL) {
+ return 0;
+ }
+ for (x = a; x < a+n; x += C) {
+ fnt_dif2(x, C, tparams);
+ }
+
+ /* Multiply each matrix element (addressed by i*C+k) by r**(i*k). */
+ SETMODULUS(modnum);
+ kernel = _mpd_getkernel(n, 1, modnum);
+ for (i = 1; i < R; i++) {
+ w0 = 1;
+ w1 = POWMOD(kernel, i);
+ wstep = MULMOD(w1, w1);
+ for (k = 0; k < C; k += 2) {
+ mpd_uint_t x0 = a[i*C+k];
+ mpd_uint_t x1 = a[i*C+k+1];
+ MULMOD2(&x0, w0, &x1, w1);
+ MULMOD2C(&w0, &w1, wstep);
+ a[i*C+k] = x0;
+ a[i*C+k+1] = x1;
+ }
+ }
+
+ /* Transpose the matrix. */
+ if (!transpose_pow2(a, R, C)) {
+ mpd_free(tparams);
+ return 0;
+ }
+
+ /* Length R transform on the rows. */
+ if (R != C) {
+ mpd_free(tparams);
+ if ((tparams = _mpd_init_fnt_params(R, 1, modnum)) == NULL) {
+ return 0;
+ }
+ }
+ for (x = a; x < a+n; x += R) {
+ fnt_dif2(x, R, tparams);
+ }
+ mpd_free(tparams);
+
+ /* Transpose the matrix. */
+ if (!transpose_pow2(a, C, R)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+
diff --git a/Modules/_decimal/libmpdec/sixstep.h b/Modules/_decimal/libmpdec/sixstep.h
new file mode 100644
index 0000000..4d251df
--- /dev/null
+++ b/Modules/_decimal/libmpdec/sixstep.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef SIX_STEP_H
+#define SIX_STEP_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+int six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum);
+int inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum);
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/transpose.c b/Modules/_decimal/libmpdec/transpose.c
new file mode 100644
index 0000000..5e5d4b6
--- /dev/null
+++ b/Modules/_decimal/libmpdec/transpose.c
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <assert.h>
+#include "bits.h"
+#include "constants.h"
+#include "typearith.h"
+#include "transpose.h"
+
+
+#define BUFSIZE 4096
+#define SIDE 128
+
+
+/* Bignum: The transpose functions are used for very large transforms
+ in sixstep.c and fourstep.c. */
+
+
+/* Definition of the matrix transpose */
+void
+std_trans(mpd_uint_t dest[], mpd_uint_t src[], mpd_size_t rows, mpd_size_t cols)
+{
+ mpd_size_t idest, isrc;
+ mpd_size_t r, c;
+
+ for (r = 0; r < rows; r++) {
+ isrc = r * cols;
+ idest = r;
+ for (c = 0; c < cols; c++) {
+ dest[idest] = src[isrc];
+ isrc += 1;
+ idest += rows;
+ }
+ }
+}
+
+/*
+ * Swap half-rows of 2^n * (2*2^n) matrix.
+ * FORWARD_CYCLE: even/odd permutation of the halfrows.
+ * BACKWARD_CYCLE: reverse the even/odd permutation.
+ */
+static int
+swap_halfrows_pow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols, int dir)
+{
+ mpd_uint_t buf1[BUFSIZE];
+ mpd_uint_t buf2[BUFSIZE];
+ mpd_uint_t *readbuf, *writebuf, *hp;
+ mpd_size_t *done, dbits;
+ mpd_size_t b = BUFSIZE, stride;
+ mpd_size_t hn, hmax; /* halfrow number */
+ mpd_size_t m, r=0;
+ mpd_size_t offset;
+ mpd_size_t next;
+
+
+ assert(cols == mul_size_t(2, rows));
+
+ if (dir == FORWARD_CYCLE) {
+ r = rows;
+ }
+ else if (dir == BACKWARD_CYCLE) {
+ r = 2;
+ }
+ else {
+ abort(); /* GCOV_NOT_REACHED */
+ }
+
+ m = cols - 1;
+ hmax = rows; /* cycles start at odd halfrows */
+ dbits = 8 * sizeof *done;
+ if ((done = mpd_calloc(hmax/(sizeof *done) + 1, sizeof *done)) == NULL) {
+ return 0;
+ }
+
+ for (hn = 1; hn <= hmax; hn += 2) {
+
+ if (done[hn/dbits] & mpd_bits[hn%dbits]) {
+ continue;
+ }
+
+ readbuf = buf1; writebuf = buf2;
+
+ for (offset = 0; offset < cols/2; offset += b) {
+
+ stride = (offset + b < cols/2) ? b : cols/2-offset;
+
+ hp = matrix + hn*cols/2;
+ memcpy(readbuf, hp+offset, stride*(sizeof *readbuf));
+ pointerswap(&readbuf, &writebuf);
+
+ next = mulmod_size_t(hn, r, m);
+ hp = matrix + next*cols/2;
+
+ while (next != hn) {
+
+ memcpy(readbuf, hp+offset, stride*(sizeof *readbuf));
+ memcpy(hp+offset, writebuf, stride*(sizeof *writebuf));
+ pointerswap(&readbuf, &writebuf);
+
+ done[next/dbits] |= mpd_bits[next%dbits];
+
+ next = mulmod_size_t(next, r, m);
+ hp = matrix + next*cols/2;
+
+ }
+
+ memcpy(hp+offset, writebuf, stride*(sizeof *writebuf));
+
+ done[hn/dbits] |= mpd_bits[hn%dbits];
+ }
+ }
+
+ mpd_free(done);
+ return 1;
+}
+
+/* In-place transpose of a square matrix */
+static inline void
+squaretrans(mpd_uint_t *buf, mpd_size_t cols)
+{
+ mpd_uint_t tmp;
+ mpd_size_t idest, isrc;
+ mpd_size_t r, c;
+
+ for (r = 0; r < cols; r++) {
+ c = r+1;
+ isrc = r*cols + c;
+ idest = c*cols + r;
+ for (c = r+1; c < cols; c++) {
+ tmp = buf[isrc];
+ buf[isrc] = buf[idest];
+ buf[idest] = tmp;
+ isrc += 1;
+ idest += cols;
+ }
+ }
+}
+
+/*
+ * Transpose 2^n * 2^n matrix. For cache efficiency, the matrix is split into
+ * square blocks with side length 'SIDE'. First, the blocks are transposed,
+ * then a square tranposition is done on each individual block.
+ */
+static void
+squaretrans_pow2(mpd_uint_t *matrix, mpd_size_t size)
+{
+ mpd_uint_t buf1[SIDE*SIDE];
+ mpd_uint_t buf2[SIDE*SIDE];
+ mpd_uint_t *to, *from;
+ mpd_size_t b = size;
+ mpd_size_t r, c;
+ mpd_size_t i;
+
+ while (b > SIDE) b >>= 1;
+
+ for (r = 0; r < size; r += b) {
+
+ for (c = r; c < size; c += b) {
+
+ from = matrix + r*size + c;
+ to = buf1;
+ for (i = 0; i < b; i++) {
+ memcpy(to, from, b*(sizeof *to));
+ from += size;
+ to += b;
+ }
+ squaretrans(buf1, b);
+
+ if (r == c) {
+ to = matrix + r*size + c;
+ from = buf1;
+ for (i = 0; i < b; i++) {
+ memcpy(to, from, b*(sizeof *to));
+ from += b;
+ to += size;
+ }
+ continue;
+ }
+ else {
+ from = matrix + c*size + r;
+ to = buf2;
+ for (i = 0; i < b; i++) {
+ memcpy(to, from, b*(sizeof *to));
+ from += size;
+ to += b;
+ }
+ squaretrans(buf2, b);
+
+ to = matrix + c*size + r;
+ from = buf1;
+ for (i = 0; i < b; i++) {
+ memcpy(to, from, b*(sizeof *to));
+ from += b;
+ to += size;
+ }
+
+ to = matrix + r*size + c;
+ from = buf2;
+ for (i = 0; i < b; i++) {
+ memcpy(to, from, b*(sizeof *to));
+ from += b;
+ to += size;
+ }
+ }
+ }
+ }
+
+}
+
+/*
+ * In-place transposition of a 2^n x 2^n or a 2^n x (2*2^n)
+ * or a (2*2^n) x 2^n matrix.
+ */
+int
+transpose_pow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols)
+{
+ mpd_size_t size = mul_size_t(rows, cols);
+
+ assert(ispower2(rows));
+ assert(ispower2(cols));
+
+ if (cols == rows) {
+ squaretrans_pow2(matrix, rows);
+ }
+ else if (cols == mul_size_t(2, rows)) {
+ if (!swap_halfrows_pow2(matrix, rows, cols, FORWARD_CYCLE)) {
+ return 0;
+ }
+ squaretrans_pow2(matrix, rows);
+ squaretrans_pow2(matrix+(size/2), rows);
+ }
+ else if (rows == mul_size_t(2, cols)) {
+ squaretrans_pow2(matrix, cols);
+ squaretrans_pow2(matrix+(size/2), cols);
+ if (!swap_halfrows_pow2(matrix, cols, rows, BACKWARD_CYCLE)) {
+ return 0;
+ }
+ }
+ else {
+ abort(); /* GCOV_NOT_REACHED */
+ }
+
+ return 1;
+}
+
+
diff --git a/Modules/_decimal/libmpdec/transpose.h b/Modules/_decimal/libmpdec/transpose.h
new file mode 100644
index 0000000..dd0aec6
--- /dev/null
+++ b/Modules/_decimal/libmpdec/transpose.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef TRANSPOSE_H
+#define TRANSPOSE_H
+
+
+#include "mpdecimal.h"
+#include <stdio.h>
+
+
+enum {FORWARD_CYCLE, BACKWARD_CYCLE};
+
+
+void std_trans(mpd_uint_t dest[], mpd_uint_t src[], mpd_size_t rows, mpd_size_t cols);
+int transpose_pow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols);
+void transpose_3xpow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols);
+
+
+static inline void pointerswap(mpd_uint_t **a, mpd_uint_t **b)
+{
+ mpd_uint_t *tmp;
+
+ tmp = *b;
+ *b = *a;
+ *a = tmp;
+}
+
+
+#endif
diff --git a/Modules/_decimal/libmpdec/typearith.h b/Modules/_decimal/libmpdec/typearith.h
new file mode 100644
index 0000000..614812c
--- /dev/null
+++ b/Modules/_decimal/libmpdec/typearith.h
@@ -0,0 +1,669 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef TYPEARITH_H
+#define TYPEARITH_H
+
+
+#include "mpdecimal.h"
+
+
+/*****************************************************************************/
+/* Low level native arithmetic on basic types */
+/*****************************************************************************/
+
+
+/** ------------------------------------------------------------
+ ** Double width multiplication and division
+ ** ------------------------------------------------------------
+ */
+
+#if defined(CONFIG_64)
+#if defined(ANSI)
+#if defined(HAVE_UINT128_T)
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ __uint128_t hl;
+
+ hl = (__uint128_t)a * b;
+
+ *hi = hl >> 64;
+ *lo = (mpd_uint_t)hl;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d)
+{
+ __uint128_t hl;
+
+ hl = ((__uint128_t)hi<<64) + lo;
+ *q = (mpd_uint_t)(hl / d); /* quotient is known to fit */
+ *r = (mpd_uint_t)(hl - (__uint128_t)(*q) * d);
+}
+#else
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ uint32_t w[4], carry;
+ uint32_t ah, al, bh, bl;
+ uint64_t hl;
+
+ ah = (uint32_t)(a>>32); al = (uint32_t)a;
+ bh = (uint32_t)(b>>32); bl = (uint32_t)b;
+
+ hl = (uint64_t)al * bl;
+ w[0] = (uint32_t)hl;
+ carry = (uint32_t)(hl>>32);
+
+ hl = (uint64_t)ah * bl + carry;
+ w[1] = (uint32_t)hl;
+ w[2] = (uint32_t)(hl>>32);
+
+ hl = (uint64_t)al * bh + w[1];
+ w[1] = (uint32_t)hl;
+ carry = (uint32_t)(hl>>32);
+
+ hl = ((uint64_t)ah * bh + w[2]) + carry;
+ w[2] = (uint32_t)hl;
+ w[3] = (uint32_t)(hl>>32);
+
+ *hi = ((uint64_t)w[3]<<32) + w[2];
+ *lo = ((uint64_t)w[1]<<32) + w[0];
+}
+
+/*
+ * By Henry S. Warren: http://www.hackersdelight.org/HDcode/divlu.c.txt
+ * http://www.hackersdelight.org/permissions.htm:
+ * "You are free to use, copy, and distribute any of the code on this web
+ * site, whether modified by you or not. You need not give attribution."
+ *
+ * Slightly modified, comments are mine.
+ */
+static inline int
+nlz(uint64_t x)
+{
+ int n;
+
+ if (x == 0) return(64);
+
+ n = 0;
+ if (x <= 0x00000000FFFFFFFF) {n = n +32; x = x <<32;}
+ if (x <= 0x0000FFFFFFFFFFFF) {n = n +16; x = x <<16;}
+ if (x <= 0x00FFFFFFFFFFFFFF) {n = n + 8; x = x << 8;}
+ if (x <= 0x0FFFFFFFFFFFFFFF) {n = n + 4; x = x << 4;}
+ if (x <= 0x3FFFFFFFFFFFFFFF) {n = n + 2; x = x << 2;}
+ if (x <= 0x7FFFFFFFFFFFFFFF) {n = n + 1;}
+
+ return n;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t u1, mpd_uint_t u0,
+ mpd_uint_t v)
+{
+ const mpd_uint_t b = 4294967296;
+ mpd_uint_t un1, un0,
+ vn1, vn0,
+ q1, q0,
+ un32, un21, un10,
+ rhat, t;
+ int s;
+
+ assert(u1 < v);
+
+ s = nlz(v);
+ v = v << s;
+ vn1 = v >> 32;
+ vn0 = v & 0xFFFFFFFF;
+
+ t = (s == 0) ? 0 : u0 >> (64 - s);
+ un32 = (u1 << s) | t;
+ un10 = u0 << s;
+
+ un1 = un10 >> 32;
+ un0 = un10 & 0xFFFFFFFF;
+
+ q1 = un32 / vn1;
+ rhat = un32 - q1*vn1;
+again1:
+ if (q1 >= b || q1*vn0 > b*rhat + un1) {
+ q1 = q1 - 1;
+ rhat = rhat + vn1;
+ if (rhat < b) goto again1;
+ }
+
+ /*
+ * Before again1 we had:
+ * (1) q1*vn1 + rhat = un32
+ * (2) q1*vn1*b + rhat*b + un1 = un32*b + un1
+ *
+ * The statements inside the if-clause do not change the value
+ * of the left-hand side of (2), and the loop is only exited
+ * if q1*vn0 <= rhat*b + un1, so:
+ *
+ * (3) q1*vn1*b + q1*vn0 <= un32*b + un1
+ * (4) q1*v <= un32*b + un1
+ * (5) 0 <= un32*b + un1 - q1*v
+ *
+ * By (5) we are certain that the possible add-back step from
+ * Knuth's algorithm D is never required.
+ *
+ * Since the final quotient is less than 2**64, the following
+ * must be true:
+ *
+ * (6) un32*b + un1 - q1*v <= UINT64_MAX
+ *
+ * This means that in the following line, the high words
+ * of un32*b and q1*v can be discarded without any effect
+ * on the result.
+ */
+ un21 = un32*b + un1 - q1*v;
+
+ q0 = un21 / vn1;
+ rhat = un21 - q0*vn1;
+again2:
+ if (q0 >= b || q0*vn0 > b*rhat + un0) {
+ q0 = q0 - 1;
+ rhat = rhat + vn1;
+ if (rhat < b) goto again2;
+ }
+
+ *q = q1*b + q0;
+ *r = (un21*b + un0 - q0*v) >> s;
+}
+#endif
+
+/* END ANSI */
+#elif defined(ASM)
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ mpd_uint_t h, l;
+
+ __asm__ ( "mulq %3\n\t"
+ : "=d" (h), "=a" (l)
+ : "%a" (a), "rm" (b)
+ : "cc"
+ );
+
+ *hi = h;
+ *lo = l;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d)
+{
+ mpd_uint_t qq, rr;
+
+ __asm__ ( "divq %4\n\t"
+ : "=a" (qq), "=d" (rr)
+ : "a" (lo), "d" (hi), "rm" (d)
+ : "cc"
+ );
+
+ *q = qq;
+ *r = rr;
+}
+/* END GCC ASM */
+#elif defined(MASM)
+#include <intrin.h>
+#pragma intrinsic(_umul128)
+
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ *lo = _umul128(a, b, hi);
+}
+
+void _mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d);
+
+/* END MASM (_MSC_VER) */
+#else
+ #error "need platform specific 128 bit multiplication and division"
+#endif
+
+#define DIVMOD(q, r, v, d) *q = v / d; *r = v - *q * d
+static inline void
+_mpd_divmod_pow10(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t v, mpd_uint_t exp)
+{
+ assert(exp <= 19);
+
+ if (exp <= 9) {
+ if (exp <= 4) {
+ switch (exp) {
+ case 0: *q = v; *r = 0; break;
+ case 1: DIVMOD(q, r, v, 10UL); break;
+ case 2: DIVMOD(q, r, v, 100UL); break;
+ case 3: DIVMOD(q, r, v, 1000UL); break;
+ case 4: DIVMOD(q, r, v, 10000UL); break;
+ }
+ }
+ else {
+ switch (exp) {
+ case 5: DIVMOD(q, r, v, 100000UL); break;
+ case 6: DIVMOD(q, r, v, 1000000UL); break;
+ case 7: DIVMOD(q, r, v, 10000000UL); break;
+ case 8: DIVMOD(q, r, v, 100000000UL); break;
+ case 9: DIVMOD(q, r, v, 1000000000UL); break;
+ }
+ }
+ }
+ else {
+ if (exp <= 14) {
+ switch (exp) {
+ case 10: DIVMOD(q, r, v, 10000000000ULL); break;
+ case 11: DIVMOD(q, r, v, 100000000000ULL); break;
+ case 12: DIVMOD(q, r, v, 1000000000000ULL); break;
+ case 13: DIVMOD(q, r, v, 10000000000000ULL); break;
+ case 14: DIVMOD(q, r, v, 100000000000000ULL); break;
+ }
+ }
+ else {
+ switch (exp) {
+ case 15: DIVMOD(q, r, v, 1000000000000000ULL); break;
+ case 16: DIVMOD(q, r, v, 10000000000000000ULL); break;
+ case 17: DIVMOD(q, r, v, 100000000000000000ULL); break;
+ case 18: DIVMOD(q, r, v, 1000000000000000000ULL); break;
+ case 19: DIVMOD(q, r, v, 10000000000000000000ULL); break; /* GCOV_NOT_REACHED */
+ }
+ }
+ }
+}
+
+/* END CONFIG_64 */
+#elif defined(CONFIG_32)
+#if defined(ANSI)
+#if !defined(LEGACY_COMPILER)
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ mpd_uuint_t hl;
+
+ hl = (mpd_uuint_t)a * b;
+
+ *hi = hl >> 32;
+ *lo = (mpd_uint_t)hl;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d)
+{
+ mpd_uuint_t hl;
+
+ hl = ((mpd_uuint_t)hi<<32) + lo;
+ *q = (mpd_uint_t)(hl / d); /* quotient is known to fit */
+ *r = (mpd_uint_t)(hl - (mpd_uuint_t)(*q) * d);
+}
+/* END ANSI + uint64_t */
+#else
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ uint16_t w[4], carry;
+ uint16_t ah, al, bh, bl;
+ uint32_t hl;
+
+ ah = (uint16_t)(a>>16); al = (uint16_t)a;
+ bh = (uint16_t)(b>>16); bl = (uint16_t)b;
+
+ hl = (uint32_t)al * bl;
+ w[0] = (uint16_t)hl;
+ carry = (uint16_t)(hl>>16);
+
+ hl = (uint32_t)ah * bl + carry;
+ w[1] = (uint16_t)hl;
+ w[2] = (uint16_t)(hl>>16);
+
+ hl = (uint32_t)al * bh + w[1];
+ w[1] = (uint16_t)hl;
+ carry = (uint16_t)(hl>>16);
+
+ hl = ((uint32_t)ah * bh + w[2]) + carry;
+ w[2] = (uint16_t)hl;
+ w[3] = (uint16_t)(hl>>16);
+
+ *hi = ((uint32_t)w[3]<<16) + w[2];
+ *lo = ((uint32_t)w[1]<<16) + w[0];
+}
+
+/*
+ * By Henry S. Warren: http://www.hackersdelight.org/HDcode/divlu.c.txt
+ * http://www.hackersdelight.org/permissions.htm:
+ * "You are free to use, copy, and distribute any of the code on this web
+ * site, whether modified by you or not. You need not give attribution."
+ *
+ * Slightly modified, comments are mine.
+ */
+static inline int
+nlz(uint32_t x)
+{
+ int n;
+
+ if (x == 0) return(32);
+
+ n = 0;
+ if (x <= 0x0000FFFF) {n = n +16; x = x <<16;}
+ if (x <= 0x00FFFFFF) {n = n + 8; x = x << 8;}
+ if (x <= 0x0FFFFFFF) {n = n + 4; x = x << 4;}
+ if (x <= 0x3FFFFFFF) {n = n + 2; x = x << 2;}
+ if (x <= 0x7FFFFFFF) {n = n + 1;}
+
+ return n;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t u1, mpd_uint_t u0,
+ mpd_uint_t v)
+{
+ const mpd_uint_t b = 65536;
+ mpd_uint_t un1, un0,
+ vn1, vn0,
+ q1, q0,
+ un32, un21, un10,
+ rhat, t;
+ int s;
+
+ assert(u1 < v);
+
+ s = nlz(v);
+ v = v << s;
+ vn1 = v >> 16;
+ vn0 = v & 0xFFFF;
+
+ t = (s == 0) ? 0 : u0 >> (32 - s);
+ un32 = (u1 << s) | t;
+ un10 = u0 << s;
+
+ un1 = un10 >> 16;
+ un0 = un10 & 0xFFFF;
+
+ q1 = un32 / vn1;
+ rhat = un32 - q1*vn1;
+again1:
+ if (q1 >= b || q1*vn0 > b*rhat + un1) {
+ q1 = q1 - 1;
+ rhat = rhat + vn1;
+ if (rhat < b) goto again1;
+ }
+
+ /*
+ * Before again1 we had:
+ * (1) q1*vn1 + rhat = un32
+ * (2) q1*vn1*b + rhat*b + un1 = un32*b + un1
+ *
+ * The statements inside the if-clause do not change the value
+ * of the left-hand side of (2), and the loop is only exited
+ * if q1*vn0 <= rhat*b + un1, so:
+ *
+ * (3) q1*vn1*b + q1*vn0 <= un32*b + un1
+ * (4) q1*v <= un32*b + un1
+ * (5) 0 <= un32*b + un1 - q1*v
+ *
+ * By (5) we are certain that the possible add-back step from
+ * Knuth's algorithm D is never required.
+ *
+ * Since the final quotient is less than 2**32, the following
+ * must be true:
+ *
+ * (6) un32*b + un1 - q1*v <= UINT32_MAX
+ *
+ * This means that in the following line, the high words
+ * of un32*b and q1*v can be discarded without any effect
+ * on the result.
+ */
+ un21 = un32*b + un1 - q1*v;
+
+ q0 = un21 / vn1;
+ rhat = un21 - q0*vn1;
+again2:
+ if (q0 >= b || q0*vn0 > b*rhat + un0) {
+ q0 = q0 - 1;
+ rhat = rhat + vn1;
+ if (rhat < b) goto again2;
+ }
+
+ *q = q1*b + q0;
+ *r = (un21*b + un0 - q0*v) >> s;
+}
+#endif /* END ANSI + LEGACY_COMPILER */
+
+/* END ANSI */
+#elif defined(ASM)
+static inline void
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ mpd_uint_t h, l;
+
+ __asm__ ( "mull %3\n\t"
+ : "=d" (h), "=a" (l)
+ : "%a" (a), "rm" (b)
+ : "cc"
+ );
+
+ *hi = h;
+ *lo = l;
+}
+
+static inline void
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d)
+{
+ mpd_uint_t qq, rr;
+
+ __asm__ ( "divl %4\n\t"
+ : "=a" (qq), "=d" (rr)
+ : "a" (lo), "d" (hi), "rm" (d)
+ : "cc"
+ );
+
+ *q = qq;
+ *r = rr;
+}
+/* END GCC ASM */
+#elif defined(MASM)
+static inline void __cdecl
+_mpd_mul_words(mpd_uint_t *hi, mpd_uint_t *lo, mpd_uint_t a, mpd_uint_t b)
+{
+ mpd_uint_t h, l;
+
+ __asm {
+ mov eax, a
+ mul b
+ mov h, edx
+ mov l, eax
+ }
+
+ *hi = h;
+ *lo = l;
+}
+
+static inline void __cdecl
+_mpd_div_words(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t hi, mpd_uint_t lo,
+ mpd_uint_t d)
+{
+ mpd_uint_t qq, rr;
+
+ __asm {
+ mov eax, lo
+ mov edx, hi
+ div d
+ mov qq, eax
+ mov rr, edx
+ }
+
+ *q = qq;
+ *r = rr;
+}
+/* END MASM (_MSC_VER) */
+#else
+ #error "need platform specific 64 bit multiplication and division"
+#endif
+
+#define DIVMOD(q, r, v, d) *q = v / d; *r = v - *q * d
+static inline void
+_mpd_divmod_pow10(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t v, mpd_uint_t exp)
+{
+ assert(exp <= 9);
+
+ if (exp <= 4) {
+ switch (exp) {
+ case 0: *q = v; *r = 0; break;
+ case 1: DIVMOD(q, r, v, 10UL); break;
+ case 2: DIVMOD(q, r, v, 100UL); break;
+ case 3: DIVMOD(q, r, v, 1000UL); break;
+ case 4: DIVMOD(q, r, v, 10000UL); break;
+ }
+ }
+ else {
+ switch (exp) {
+ case 5: DIVMOD(q, r, v, 100000UL); break;
+ case 6: DIVMOD(q, r, v, 1000000UL); break;
+ case 7: DIVMOD(q, r, v, 10000000UL); break;
+ case 8: DIVMOD(q, r, v, 100000000UL); break;
+ case 9: DIVMOD(q, r, v, 1000000000UL); break; /* GCOV_NOT_REACHED */
+ }
+ }
+}
+/* END CONFIG_32 */
+
+/* NO CONFIG */
+#else
+ #error "define CONFIG_64 or CONFIG_32"
+#endif /* CONFIG */
+
+
+static inline void
+_mpd_div_word(mpd_uint_t *q, mpd_uint_t *r, mpd_uint_t v, mpd_uint_t d)
+{
+ *q = v / d;
+ *r = v - *q * d;
+}
+
+static inline void
+_mpd_idiv_word(mpd_ssize_t *q, mpd_ssize_t *r, mpd_ssize_t v, mpd_ssize_t d)
+{
+ *q = v / d;
+ *r = v - *q * d;
+}
+
+
+/** ------------------------------------------------------------
+ ** Arithmetic with overflow checking
+ ** ------------------------------------------------------------
+ */
+
+/* The following macros do call exit() in case of an overflow.
+ If the library is used correctly (i.e. with valid context
+ parameters), such overflows cannot occur. The macros are used
+ as sanity checks in a couple of strategic places and should
+ be viewed as a handwritten version of gcc's -ftrapv option. */
+
+static inline mpd_size_t
+add_size_t(mpd_size_t a, mpd_size_t b)
+{
+ if (a > MPD_SIZE_MAX - b) {
+ mpd_err_fatal("add_size_t(): overflow: check the context"); /* GCOV_NOT_REACHED */
+ }
+ return a + b;
+}
+
+static inline mpd_size_t
+sub_size_t(mpd_size_t a, mpd_size_t b)
+{
+ if (b > a) {
+ mpd_err_fatal("sub_size_t(): overflow: check the context"); /* GCOV_NOT_REACHED */
+ }
+ return a - b;
+}
+
+#if MPD_SIZE_MAX != MPD_UINT_MAX
+ #error "adapt mul_size_t() and mulmod_size_t()"
+#endif
+
+static inline mpd_size_t
+mul_size_t(mpd_size_t a, mpd_size_t b)
+{
+ mpd_uint_t hi, lo;
+
+ _mpd_mul_words(&hi, &lo, (mpd_uint_t)a, (mpd_uint_t)b);
+ if (hi) {
+ mpd_err_fatal("mul_size_t(): overflow: check the context"); /* GCOV_NOT_REACHED */
+ }
+ return lo;
+}
+
+static inline mpd_size_t
+add_size_t_overflow(mpd_size_t a, mpd_size_t b, mpd_size_t *overflow)
+{
+ mpd_size_t ret;
+
+ *overflow = 0;
+ ret = a + b;
+ if (ret < a) *overflow = 1;
+ return ret;
+}
+
+static inline mpd_size_t
+mul_size_t_overflow(mpd_size_t a, mpd_size_t b, mpd_size_t *overflow)
+{
+ mpd_uint_t lo;
+
+ _mpd_mul_words((mpd_uint_t *)overflow, &lo, (mpd_uint_t)a,
+ (mpd_uint_t)b);
+ return lo;
+}
+
+static inline mpd_ssize_t
+mod_mpd_ssize_t(mpd_ssize_t a, mpd_ssize_t m)
+{
+ mpd_ssize_t r = a % m;
+ return (r < 0) ? r + m : r;
+}
+
+static inline mpd_size_t
+mulmod_size_t(mpd_size_t a, mpd_size_t b, mpd_size_t m)
+{
+ mpd_uint_t hi, lo;
+ mpd_uint_t q, r;
+
+ _mpd_mul_words(&hi, &lo, (mpd_uint_t)a, (mpd_uint_t)b);
+ _mpd_div_words(&q, &r, hi, lo, (mpd_uint_t)m);
+
+ return r;
+}
+
+
+#endif /* TYPEARITH_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/umodarith.h b/Modules/_decimal/libmpdec/umodarith.h
new file mode 100644
index 0000000..a6aeceb
--- /dev/null
+++ b/Modules/_decimal/libmpdec/umodarith.h
@@ -0,0 +1,650 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef UMODARITH_H
+#define UMODARITH_H
+
+
+#include "constants.h"
+#include "mpdecimal.h"
+#include "typearith.h"
+
+
+/* Bignum: Low level routines for unsigned modular arithmetic. These are
+ used in the fast convolution functions for very large coefficients. */
+
+
+/**************************************************************************/
+/* ANSI modular arithmetic */
+/**************************************************************************/
+
+
+/*
+ * Restrictions: a < m and b < m
+ * ACL2 proof: umodarith.lisp: addmod-correct
+ */
+static inline mpd_uint_t
+addmod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ mpd_uint_t s;
+
+ s = a + b;
+ s = (s < a) ? s - m : s;
+ s = (s >= m) ? s - m : s;
+
+ return s;
+}
+
+/*
+ * Restrictions: a < m and b < m
+ * ACL2 proof: umodarith.lisp: submod-2-correct
+ */
+static inline mpd_uint_t
+submod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ mpd_uint_t d;
+
+ d = a - b;
+ d = (a < b) ? d + m : d;
+
+ return d;
+}
+
+/*
+ * Restrictions: a < 2m and b < 2m
+ * ACL2 proof: umodarith.lisp: section ext-submod
+ */
+static inline mpd_uint_t
+ext_submod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ mpd_uint_t d;
+
+ a = (a >= m) ? a - m : a;
+ b = (b >= m) ? b - m : b;
+
+ d = a - b;
+ d = (a < b) ? d + m : d;
+
+ return d;
+}
+
+/*
+ * Reduce double word modulo m.
+ * Restrictions: m != 0
+ * ACL2 proof: umodarith.lisp: section dw-reduce
+ */
+static inline mpd_uint_t
+dw_reduce(mpd_uint_t hi, mpd_uint_t lo, mpd_uint_t m)
+{
+ mpd_uint_t r1, r2, w;
+
+ _mpd_div_word(&w, &r1, hi, m);
+ _mpd_div_words(&w, &r2, r1, lo, m);
+
+ return r2;
+}
+
+/*
+ * Subtract double word from a.
+ * Restrictions: a < m
+ * ACL2 proof: umodarith.lisp: section dw-submod
+ */
+static inline mpd_uint_t
+dw_submod(mpd_uint_t a, mpd_uint_t hi, mpd_uint_t lo, mpd_uint_t m)
+{
+ mpd_uint_t d, r;
+
+ r = dw_reduce(hi, lo, m);
+ d = a - r;
+ d = (a < r) ? d + m : d;
+
+ return d;
+}
+
+#ifdef CONFIG_64
+
+/**************************************************************************/
+/* 64-bit modular arithmetic */
+/**************************************************************************/
+
+/*
+ * A proof of the algorithm is in literature/mulmod-64.txt. An ACL2
+ * proof is in umodarith.lisp: section "Fast modular reduction".
+ *
+ * Algorithm: calculate (a * b) % p:
+ *
+ * a) hi, lo <- a * b # Calculate a * b.
+ *
+ * b) hi, lo <- R(hi, lo) # Reduce modulo p.
+ *
+ * c) Repeat step b) until 0 <= hi * 2**64 + lo < 2*p.
+ *
+ * d) If the result is less than p, return lo. Otherwise return lo - p.
+ */
+
+static inline mpd_uint_t
+x64_mulmod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ mpd_uint_t hi, lo, x, y;
+
+
+ _mpd_mul_words(&hi, &lo, a, b);
+
+ if (m & (1ULL<<32)) { /* P1 */
+
+ /* first reduction */
+ x = y = hi;
+ hi >>= 32;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 32;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ /* second reduction */
+ x = y = hi;
+ hi >>= 32;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 32;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ return (hi || lo >= m ? lo - m : lo);
+ }
+ else if (m & (1ULL<<34)) { /* P2 */
+
+ /* first reduction */
+ x = y = hi;
+ hi >>= 30;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 34;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ /* second reduction */
+ x = y = hi;
+ hi >>= 30;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 34;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ /* third reduction */
+ x = y = hi;
+ hi >>= 30;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 34;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ return (hi || lo >= m ? lo - m : lo);
+ }
+ else { /* P3 */
+
+ /* first reduction */
+ x = y = hi;
+ hi >>= 24;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 40;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ /* second reduction */
+ x = y = hi;
+ hi >>= 24;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 40;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ /* third reduction */
+ x = y = hi;
+ hi >>= 24;
+
+ x = lo - x;
+ if (x > lo) hi--;
+
+ y <<= 40;
+ lo = y + x;
+ if (lo < y) hi++;
+
+ return (hi || lo >= m ? lo - m : lo);
+ }
+}
+
+static inline void
+x64_mulmod2c(mpd_uint_t *a, mpd_uint_t *b, mpd_uint_t w, mpd_uint_t m)
+{
+ *a = x64_mulmod(*a, w, m);
+ *b = x64_mulmod(*b, w, m);
+}
+
+static inline void
+x64_mulmod2(mpd_uint_t *a0, mpd_uint_t b0, mpd_uint_t *a1, mpd_uint_t b1,
+ mpd_uint_t m)
+{
+ *a0 = x64_mulmod(*a0, b0, m);
+ *a1 = x64_mulmod(*a1, b1, m);
+}
+
+static inline mpd_uint_t
+x64_powmod(mpd_uint_t base, mpd_uint_t exp, mpd_uint_t umod)
+{
+ mpd_uint_t r = 1;
+
+ while (exp > 0) {
+ if (exp & 1)
+ r = x64_mulmod(r, base, umod);
+ base = x64_mulmod(base, base, umod);
+ exp >>= 1;
+ }
+
+ return r;
+}
+
+/* END CONFIG_64 */
+#else /* CONFIG_32 */
+
+
+/**************************************************************************/
+/* 32-bit modular arithmetic */
+/**************************************************************************/
+
+#if defined(ANSI)
+#if !defined(LEGACY_COMPILER)
+/* HAVE_UINT64_T */
+static inline mpd_uint_t
+std_mulmod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ return ((mpd_uuint_t) a * b) % m;
+}
+
+static inline void
+std_mulmod2c(mpd_uint_t *a, mpd_uint_t *b, mpd_uint_t w, mpd_uint_t m)
+{
+ *a = ((mpd_uuint_t) *a * w) % m;
+ *b = ((mpd_uuint_t) *b * w) % m;
+}
+
+static inline void
+std_mulmod2(mpd_uint_t *a0, mpd_uint_t b0, mpd_uint_t *a1, mpd_uint_t b1,
+ mpd_uint_t m)
+{
+ *a0 = ((mpd_uuint_t) *a0 * b0) % m;
+ *a1 = ((mpd_uuint_t) *a1 * b1) % m;
+}
+/* END HAVE_UINT64_T */
+#else
+/* LEGACY_COMPILER */
+static inline mpd_uint_t
+std_mulmod(mpd_uint_t a, mpd_uint_t b, mpd_uint_t m)
+{
+ mpd_uint_t hi, lo, q, r;
+ _mpd_mul_words(&hi, &lo, a, b);
+ _mpd_div_words(&q, &r, hi, lo, m);
+ return r;
+}
+
+static inline void
+std_mulmod2c(mpd_uint_t *a, mpd_uint_t *b, mpd_uint_t w, mpd_uint_t m)
+{
+ *a = std_mulmod(*a, w, m);
+ *b = std_mulmod(*b, w, m);
+}
+
+static inline void
+std_mulmod2(mpd_uint_t *a0, mpd_uint_t b0, mpd_uint_t *a1, mpd_uint_t b1,
+ mpd_uint_t m)
+{
+ *a0 = std_mulmod(*a0, b0, m);
+ *a1 = std_mulmod(*a1, b1, m);
+}
+/* END LEGACY_COMPILER */
+#endif
+
+static inline mpd_uint_t
+std_powmod(mpd_uint_t base, mpd_uint_t exp, mpd_uint_t umod)
+{
+ mpd_uint_t r = 1;
+
+ while (exp > 0) {
+ if (exp & 1)
+ r = std_mulmod(r, base, umod);
+ base = std_mulmod(base, base, umod);
+ exp >>= 1;
+ }
+
+ return r;
+}
+#endif /* ANSI CONFIG_32 */
+
+
+/**************************************************************************/
+/* Pentium Pro modular arithmetic */
+/**************************************************************************/
+
+/*
+ * A proof of the algorithm is in literature/mulmod-ppro.txt. The FPU
+ * control word must be set to 64-bit precision and truncation mode
+ * prior to using these functions.
+ *
+ * Algorithm: calculate (a * b) % p:
+ *
+ * p := prime < 2**31
+ * pinv := (long double)1.0 / p (precalculated)
+ *
+ * a) n = a * b # Calculate exact product.
+ * b) qest = n * pinv # Calculate estimate for q = n / p.
+ * c) q = (qest+2**63)-2**63 # Truncate qest to the exact quotient.
+ * d) r = n - q * p # Calculate remainder.
+ *
+ * Remarks:
+ *
+ * - p = dmod and pinv = dinvmod.
+ * - dinvmod points to an array of three uint32_t, which is interpreted
+ * as an 80 bit long double by fldt.
+ * - Intel compilers prior to version 11 do not seem to handle the
+ * __GNUC__ inline assembly correctly.
+ * - random tests are provided in tests/extended/ppro_mulmod.c
+ */
+
+#if defined(PPRO)
+#if defined(ASM)
+
+/* Return (a * b) % dmod */
+static inline mpd_uint_t
+ppro_mulmod(mpd_uint_t a, mpd_uint_t b, double *dmod, uint32_t *dinvmod)
+{
+ mpd_uint_t retval;
+
+ __asm__ (
+ "fildl %2\n\t"
+ "fildl %1\n\t"
+ "fmulp %%st, %%st(1)\n\t"
+ "fldt (%4)\n\t"
+ "fmul %%st(1), %%st\n\t"
+ "flds %5\n\t"
+ "fadd %%st, %%st(1)\n\t"
+ "fsubrp %%st, %%st(1)\n\t"
+ "fldl (%3)\n\t"
+ "fmulp %%st, %%st(1)\n\t"
+ "fsubrp %%st, %%st(1)\n\t"
+ "fistpl %0\n\t"
+ : "=m" (retval)
+ : "m" (a), "m" (b), "r" (dmod), "r" (dinvmod), "m" (MPD_TWO63)
+ : "st", "memory"
+ );
+
+ return retval;
+}
+
+/*
+ * Two modular multiplications in parallel:
+ * *a0 = (*a0 * w) % dmod
+ * *a1 = (*a1 * w) % dmod
+ */
+static inline void
+ppro_mulmod2c(mpd_uint_t *a0, mpd_uint_t *a1, mpd_uint_t w,
+ double *dmod, uint32_t *dinvmod)
+{
+ __asm__ (
+ "fildl %2\n\t"
+ "fildl (%1)\n\t"
+ "fmul %%st(1), %%st\n\t"
+ "fxch %%st(1)\n\t"
+ "fildl (%0)\n\t"
+ "fmulp %%st, %%st(1) \n\t"
+ "fldt (%4)\n\t"
+ "flds %5\n\t"
+ "fld %%st(2)\n\t"
+ "fmul %%st(2)\n\t"
+ "fadd %%st(1)\n\t"
+ "fsub %%st(1)\n\t"
+ "fmull (%3)\n\t"
+ "fsubrp %%st, %%st(3)\n\t"
+ "fxch %%st(2)\n\t"
+ "fistpl (%0)\n\t"
+ "fmul %%st(2)\n\t"
+ "fadd %%st(1)\n\t"
+ "fsubp %%st, %%st(1)\n\t"
+ "fmull (%3)\n\t"
+ "fsubrp %%st, %%st(1)\n\t"
+ "fistpl (%1)\n\t"
+ : : "r" (a0), "r" (a1), "m" (w),
+ "r" (dmod), "r" (dinvmod),
+ "m" (MPD_TWO63)
+ : "st", "memory"
+ );
+}
+
+/*
+ * Two modular multiplications in parallel:
+ * *a0 = (*a0 * b0) % dmod
+ * *a1 = (*a1 * b1) % dmod
+ */
+static inline void
+ppro_mulmod2(mpd_uint_t *a0, mpd_uint_t b0, mpd_uint_t *a1, mpd_uint_t b1,
+ double *dmod, uint32_t *dinvmod)
+{
+ __asm__ (
+ "fildl %3\n\t"
+ "fildl (%2)\n\t"
+ "fmulp %%st, %%st(1)\n\t"
+ "fildl %1\n\t"
+ "fildl (%0)\n\t"
+ "fmulp %%st, %%st(1)\n\t"
+ "fldt (%5)\n\t"
+ "fld %%st(2)\n\t"
+ "fmul %%st(1), %%st\n\t"
+ "fxch %%st(1)\n\t"
+ "fmul %%st(2), %%st\n\t"
+ "flds %6\n\t"
+ "fldl (%4)\n\t"
+ "fxch %%st(3)\n\t"
+ "fadd %%st(1), %%st\n\t"
+ "fxch %%st(2)\n\t"
+ "fadd %%st(1), %%st\n\t"
+ "fxch %%st(2)\n\t"
+ "fsub %%st(1), %%st\n\t"
+ "fxch %%st(2)\n\t"
+ "fsubp %%st, %%st(1)\n\t"
+ "fxch %%st(1)\n\t"
+ "fmul %%st(2), %%st\n\t"
+ "fxch %%st(1)\n\t"
+ "fmulp %%st, %%st(2)\n\t"
+ "fsubrp %%st, %%st(3)\n\t"
+ "fsubrp %%st, %%st(1)\n\t"
+ "fxch %%st(1)\n\t"
+ "fistpl (%2)\n\t"
+ "fistpl (%0)\n\t"
+ : : "r" (a0), "m" (b0), "r" (a1), "m" (b1),
+ "r" (dmod), "r" (dinvmod),
+ "m" (MPD_TWO63)
+ : "st", "memory"
+ );
+}
+/* END PPRO GCC ASM */
+#elif defined(MASM)
+
+/* Return (a * b) % dmod */
+static inline mpd_uint_t __cdecl
+ppro_mulmod(mpd_uint_t a, mpd_uint_t b, double *dmod, uint32_t *dinvmod)
+{
+ mpd_uint_t retval;
+
+ __asm {
+ mov eax, dinvmod
+ mov edx, dmod
+ fild b
+ fild a
+ fmulp st(1), st
+ fld TBYTE PTR [eax]
+ fmul st, st(1)
+ fld MPD_TWO63
+ fadd st(1), st
+ fsubp st(1), st
+ fld QWORD PTR [edx]
+ fmulp st(1), st
+ fsubp st(1), st
+ fistp retval
+ }
+
+ return retval;
+}
+
+/*
+ * Two modular multiplications in parallel:
+ * *a0 = (*a0 * w) % dmod
+ * *a1 = (*a1 * w) % dmod
+ */
+static inline mpd_uint_t __cdecl
+ppro_mulmod2c(mpd_uint_t *a0, mpd_uint_t *a1, mpd_uint_t w,
+ double *dmod, uint32_t *dinvmod)
+{
+ __asm {
+ mov ecx, dmod
+ mov edx, a1
+ mov ebx, dinvmod
+ mov eax, a0
+ fild w
+ fild DWORD PTR [edx]
+ fmul st, st(1)
+ fxch st(1)
+ fild DWORD PTR [eax]
+ fmulp st(1), st
+ fld TBYTE PTR [ebx]
+ fld MPD_TWO63
+ fld st(2)
+ fmul st, st(2)
+ fadd st, st(1)
+ fsub st, st(1)
+ fmul QWORD PTR [ecx]
+ fsubp st(3), st
+ fxch st(2)
+ fistp DWORD PTR [eax]
+ fmul st, st(2)
+ fadd st, st(1)
+ fsubrp st(1), st
+ fmul QWORD PTR [ecx]
+ fsubp st(1), st
+ fistp DWORD PTR [edx]
+ }
+}
+
+/*
+ * Two modular multiplications in parallel:
+ * *a0 = (*a0 * b0) % dmod
+ * *a1 = (*a1 * b1) % dmod
+ */
+static inline void __cdecl
+ppro_mulmod2(mpd_uint_t *a0, mpd_uint_t b0, mpd_uint_t *a1, mpd_uint_t b1,
+ double *dmod, uint32_t *dinvmod)
+{
+ __asm {
+ mov ecx, dmod
+ mov edx, a1
+ mov ebx, dinvmod
+ mov eax, a0
+ fild b1
+ fild DWORD PTR [edx]
+ fmulp st(1), st
+ fild b0
+ fild DWORD PTR [eax]
+ fmulp st(1), st
+ fld TBYTE PTR [ebx]
+ fld st(2)
+ fmul st, st(1)
+ fxch st(1)
+ fmul st, st(2)
+ fld DWORD PTR MPD_TWO63
+ fld QWORD PTR [ecx]
+ fxch st(3)
+ fadd st, st(1)
+ fxch st(2)
+ fadd st, st(1)
+ fxch st(2)
+ fsub st, st(1)
+ fxch st(2)
+ fsubrp st(1), st
+ fxch st(1)
+ fmul st, st(2)
+ fxch st(1)
+ fmulp st(2), st
+ fsubp st(3), st
+ fsubp st(1), st
+ fxch st(1)
+ fistp DWORD PTR [edx]
+ fistp DWORD PTR [eax]
+ }
+}
+#endif /* PPRO MASM (_MSC_VER) */
+
+
+/* Return (base ** exp) % dmod */
+static inline mpd_uint_t
+ppro_powmod(mpd_uint_t base, mpd_uint_t exp, double *dmod, uint32_t *dinvmod)
+{
+ mpd_uint_t r = 1;
+
+ while (exp > 0) {
+ if (exp & 1)
+ r = ppro_mulmod(r, base, dmod, dinvmod);
+ base = ppro_mulmod(base, base, dmod, dinvmod);
+ exp >>= 1;
+ }
+
+ return r;
+}
+#endif /* PPRO */
+#endif /* CONFIG_32 */
+
+
+#endif /* UMODARITH_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/vccompat.h b/Modules/_decimal/libmpdec/vccompat.h
new file mode 100644
index 0000000..276e037
--- /dev/null
+++ b/Modules/_decimal/libmpdec/vccompat.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#ifndef VCCOMPAT_H
+#define VCCOMPAT_H
+
+
+/* Visual C fixes: no stdint.h, no snprintf ... */
+#ifdef _MSC_VER
+ #include "vcstdint.h"
+ #undef inline
+ #define inline __inline
+ #undef random
+ #define random rand
+ #undef srandom
+ #define srandom srand
+ #undef snprintf
+ #define snprintf sprintf_s
+ #define HAVE_SNPRINTF
+ #undef strncasecmp
+ #define strncasecmp _strnicmp
+ #undef strcasecmp
+ #define strcasecmp _stricmp
+ #undef strtoll
+ #define strtoll _strtoi64
+ #define strdup _strdup
+ #define PRIi64 "I64i"
+ #define PRIu64 "I64u"
+ #define PRIi32 "I32i"
+ #define PRIu32 "I32u"
+#endif
+
+
+#endif /* VCCOMPAT_H */
+
+
+
diff --git a/Modules/_decimal/libmpdec/vcdiv64.asm b/Modules/_decimal/libmpdec/vcdiv64.asm
new file mode 100644
index 0000000..31bba08
--- /dev/null
+++ b/Modules/_decimal/libmpdec/vcdiv64.asm
@@ -0,0 +1,48 @@
+;
+; Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+;
+; 1. Redistributions of source code must retain the above copyright
+; notice, this list of conditions and the following disclaimer.
+;
+; 2. Redistributions in binary form must reproduce the above copyright
+; notice, this list of conditions and the following disclaimer in the
+; documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; SUCH DAMAGE.
+;
+
+
+PUBLIC _mpd_div_words
+_TEXT SEGMENT
+q$ = 8
+r$ = 16
+hi$ = 24
+lo$ = 32
+d$ = 40
+_mpd_div_words PROC
+ mov r10, rdx
+ mov rdx, r8
+ mov rax, r9
+ div QWORD PTR d$[rsp]
+ mov QWORD PTR [r10], rdx
+ mov QWORD PTR [rcx], rax
+ ret 0
+_mpd_div_words ENDP
+_TEXT ENDS
+END
+
+
diff --git a/Modules/_decimal/libmpdec/vcstdint.h b/Modules/_decimal/libmpdec/vcstdint.h
new file mode 100644
index 0000000..e032ff1
--- /dev/null
+++ b/Modules/_decimal/libmpdec/vcstdint.h
@@ -0,0 +1,232 @@
+// ISO C9x compliant stdint.h for Microsoft Visual Studio
+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
+//
+// Copyright (c) 2006-2008 Alexander Chemeris
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// 3. The name of the author may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MSC_VER // [
+#error "Use this header only with Microsoft Visual C++ compilers!"
+#endif // _MSC_VER ]
+
+#ifndef _MSC_STDINT_H_ // [
+#define _MSC_STDINT_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <limits.h>
+
+// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}'
+// or compiler give many errors like this:
+// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+#if (_MSC_VER < 1300) && defined(__cplusplus)
+ extern "C++" {
+#endif
+# include <wchar.h>
+#if (_MSC_VER < 1300) && defined(__cplusplus)
+ }
+#endif
+
+// Define _W64 macros to mark types changing their size, like intptr_t.
+#ifndef _W64
+# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+# define _W64 __w64
+# else
+# define _W64
+# endif
+#endif
+
+
+// 7.18.1 Integer types
+
+// 7.18.1.1 Exact-width integer types
+typedef __int8 int8_t;
+typedef __int16 int16_t;
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// 7.18.1.2 Minimum-width integer types
+typedef int8_t int_least8_t;
+typedef int16_t int_least16_t;
+typedef int32_t int_least32_t;
+typedef int64_t int_least64_t;
+typedef uint8_t uint_least8_t;
+typedef uint16_t uint_least16_t;
+typedef uint32_t uint_least32_t;
+typedef uint64_t uint_least64_t;
+
+// 7.18.1.3 Fastest minimum-width integer types
+typedef int8_t int_fast8_t;
+typedef int16_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef int64_t int_fast64_t;
+typedef uint8_t uint_fast8_t;
+typedef uint16_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+typedef uint64_t uint_fast64_t;
+
+// 7.18.1.4 Integer types capable of holding object pointers
+#ifdef _WIN64 // [
+ typedef __int64 intptr_t;
+ typedef unsigned __int64 uintptr_t;
+#else // _WIN64 ][
+ typedef _W64 int intptr_t;
+ typedef _W64 unsigned int uintptr_t;
+#endif // _WIN64 ]
+
+// 7.18.1.5 Greatest-width integer types
+typedef int64_t intmax_t;
+typedef uint64_t uintmax_t;
+
+
+// 7.18.2 Limits of specified-width integer types
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
+
+// 7.18.2.1 Limits of exact-width integer types
+#define INT8_MIN ((int8_t)_I8_MIN)
+#define INT8_MAX _I8_MAX
+#define INT16_MIN ((int16_t)_I16_MIN)
+#define INT16_MAX _I16_MAX
+#define INT32_MIN ((int32_t)_I32_MIN)
+#define INT32_MAX _I32_MAX
+#define INT64_MIN ((int64_t)_I64_MIN)
+#define INT64_MAX _I64_MAX
+#define UINT8_MAX _UI8_MAX
+#define UINT16_MAX _UI16_MAX
+#define UINT32_MAX _UI32_MAX
+#define UINT64_MAX _UI64_MAX
+
+// 7.18.2.2 Limits of minimum-width integer types
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+
+// 7.18.2.3 Limits of fastest minimum-width integer types
+#define INT_FAST8_MIN INT8_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+
+// 7.18.2.4 Limits of integer types capable of holding object pointers
+#ifdef _WIN64 // [
+# define INTPTR_MIN INT64_MIN
+# define INTPTR_MAX INT64_MAX
+# define UINTPTR_MAX UINT64_MAX
+#else // _WIN64 ][
+# define INTPTR_MIN INT32_MIN
+# define INTPTR_MAX INT32_MAX
+# define UINTPTR_MAX UINT32_MAX
+#endif // _WIN64 ]
+
+// 7.18.2.5 Limits of greatest-width integer types
+#define INTMAX_MIN INT64_MIN
+#define INTMAX_MAX INT64_MAX
+#define UINTMAX_MAX UINT64_MAX
+
+// 7.18.3 Limits of other integer types
+
+#ifdef _WIN64 // [
+# define PTRDIFF_MIN _I64_MIN
+# define PTRDIFF_MAX _I64_MAX
+#else // _WIN64 ][
+# define PTRDIFF_MIN _I32_MIN
+# define PTRDIFF_MAX _I32_MAX
+#endif // _WIN64 ]
+
+#define SIG_ATOMIC_MIN INT_MIN
+#define SIG_ATOMIC_MAX INT_MAX
+
+#ifndef SIZE_MAX // [
+# ifdef _WIN64 // [
+# define SIZE_MAX _UI64_MAX
+# else // _WIN64 ][
+# define SIZE_MAX _UI32_MAX
+# endif // _WIN64 ]
+#endif // SIZE_MAX ]
+
+// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+#ifndef WCHAR_MIN // [
+# define WCHAR_MIN 0
+#endif // WCHAR_MIN ]
+#ifndef WCHAR_MAX // [
+# define WCHAR_MAX _UI16_MAX
+#endif // WCHAR_MAX ]
+
+#define WINT_MIN 0
+#define WINT_MAX _UI16_MAX
+
+#endif // __STDC_LIMIT_MACROS ]
+
+
+// 7.18.4 Limits of other integer types
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
+
+// 7.18.4.1 Macros for minimum-width integer constants
+
+#define INT8_C(val) val##i8
+#define INT16_C(val) val##i16
+#define INT32_C(val) val##i32
+#define INT64_C(val) val##i64
+
+#define UINT8_C(val) val##ui8
+#define UINT16_C(val) val##ui16
+#define UINT32_C(val) val##ui32
+#define UINT64_C(val) val##ui64
+
+// 7.18.4.2 Macros for greatest-width integer constants
+#define INTMAX_C INT64_C
+#define UINTMAX_C UINT64_C
+
+#endif // __STDC_CONSTANT_MACROS ]
+
+
+#endif // _MSC_STDINT_H_ ]
diff --git a/Modules/_decimal/tests/README.txt b/Modules/_decimal/tests/README.txt
new file mode 100644
index 0000000..97b6ff6
--- /dev/null
+++ b/Modules/_decimal/tests/README.txt
@@ -0,0 +1,15 @@
+
+
+This directory contains extended tests and a benchmark against decimal.py:
+
+ bench.py -> Benchmark for small and large precisions.
+ Usage: ../../../python bench.py
+
+ formathelper.py ->
+ randdec.py -> Generate test cases for deccheck.py.
+ randfloat.py ->
+
+ deccheck.py -> Run extended tests.
+ Usage: ../../../python deccheck.py [--short|--medium|--long|--all]
+
+
diff --git a/Modules/_decimal/tests/bench.py b/Modules/_decimal/tests/bench.py
new file mode 100644
index 0000000..7e4a210
--- /dev/null
+++ b/Modules/_decimal/tests/bench.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+#
+# Copyright (C) 2001-2012 Python Software Foundation. All Rights Reserved.
+# Modified and extended by Stefan Krah.
+#
+
+# Usage: ../../../python bench.py
+
+
+import time
+from math import log, ceil
+try:
+ from test.support import import_fresh_module
+except ImportError:
+ from test.test_support import import_fresh_module
+
+C = import_fresh_module('decimal', fresh=['_decimal'])
+P = import_fresh_module('decimal', blocked=['_decimal'])
+
+#
+# NOTE: This is the pi function from the decimal documentation, modified
+# for benchmarking purposes. Since floats do not have a context, the higher
+# intermediate precision from the original is NOT used, so the modified
+# algorithm only gives an approximation to the correctly rounded result.
+# For serious use, refer to the documentation or the appropriate literature.
+#
+def pi_float():
+ """native float"""
+ lasts, t, s, n, na, d, da = 0, 3.0, 3, 1, 0, 0, 24
+ while s != lasts:
+ lasts = s
+ n, na = n+na, na+8
+ d, da = d+da, da+32
+ t = (t * n) / d
+ s += t
+ return s
+
+def pi_cdecimal():
+ """cdecimal"""
+ D = C.Decimal
+ lasts, t, s, n, na, d, da = D(0), D(3), D(3), D(1), D(0), D(0), D(24)
+ while s != lasts:
+ lasts = s
+ n, na = n+na, na+8
+ d, da = d+da, da+32
+ t = (t * n) / d
+ s += t
+ return s
+
+def pi_decimal():
+ """decimal"""
+ D = P.Decimal
+ lasts, t, s, n, na, d, da = D(0), D(3), D(3), D(1), D(0), D(0), D(24)
+ while s != lasts:
+ lasts = s
+ n, na = n+na, na+8
+ d, da = d+da, da+32
+ t = (t * n) / d
+ s += t
+ return s
+
+def factorial(n, m):
+ if (n > m):
+ return factorial(m, n)
+ elif m == 0:
+ return 1
+ elif n == m:
+ return n
+ else:
+ return factorial(n, (n+m)//2) * factorial((n+m)//2 + 1, m)
+
+
+print("\n# ======================================================================")
+print("# Calculating pi, 10000 iterations")
+print("# ======================================================================\n")
+
+to_benchmark = [pi_float, pi_decimal]
+if C is not None:
+ to_benchmark.insert(1, pi_cdecimal)
+
+for prec in [9, 19]:
+ print("\nPrecision: %d decimal digits\n" % prec)
+ for func in to_benchmark:
+ start = time.time()
+ if C is not None:
+ C.getcontext().prec = prec
+ P.getcontext().prec = prec
+ for i in range(10000):
+ x = func()
+ print("%s:" % func.__name__.replace("pi_", ""))
+ print("result: %s" % str(x))
+ print("time: %fs\n" % (time.time()-start))
+
+
+print("\n# ======================================================================")
+print("# Factorial")
+print("# ======================================================================\n")
+
+if C is not None:
+ c = C.getcontext()
+ c.prec = C.MAX_PREC
+ c.Emax = C.MAX_EMAX
+ c.Emin = C.MIN_EMIN
+
+for n in [100000, 1000000]:
+
+ print("n = %d\n" % n)
+
+ if C is not None:
+ # C version of decimal
+ start_calc = time.time()
+ x = factorial(C.Decimal(n), 0)
+ end_calc = time.time()
+ start_conv = time.time()
+ sx = str(x)
+ end_conv = time.time()
+ print("cdecimal:")
+ print("calculation time: %fs" % (end_calc-start_calc))
+ print("conversion time: %fs\n" % (end_conv-start_conv))
+
+ # Python integers
+ start_calc = time.time()
+ y = factorial(n, 0)
+ end_calc = time.time()
+ start_conv = time.time()
+ sy = str(y)
+ end_conv = time.time()
+
+ print("int:")
+ print("calculation time: %fs" % (end_calc-start_calc))
+ print("conversion time: %fs\n\n" % (end_conv-start_conv))
+
+ if C is not None:
+ assert(sx == sy)
diff --git a/Modules/_decimal/tests/bignum.py b/Modules/_decimal/tests/bignum.py
new file mode 100644
index 0000000..a67e161
--- /dev/null
+++ b/Modules/_decimal/tests/bignum.py
@@ -0,0 +1,42 @@
+#
+# These tests require gmpy and test the limits of the 32-bit build. The
+# limits of the 64-bit build are so large that they cannot be tested
+# on accessible hardware.
+#
+
+import sys
+from decimal import *
+from gmpy import mpz
+
+
+_PyHASH_MODULUS = sys.hash_info.modulus
+# hash values to use for positive and negative infinities, and nans
+_PyHASH_INF = sys.hash_info.inf
+_PyHASH_NAN = sys.hash_info.nan
+
+# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
+_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
+
+def xhash(coeff, exp):
+ sign = 1
+ if coeff < 0:
+ sign = -1
+ coeff = -coeff
+ if exp >= 0:
+ exp_hash = pow(10, exp, _PyHASH_MODULUS)
+ else:
+ exp_hash = pow(_PyHASH_10INV, -exp, _PyHASH_MODULUS)
+ hash_ = coeff * exp_hash % _PyHASH_MODULUS
+ ans = hash_ if sign == 1 else -hash_
+ return -2 if ans == -1 else ans
+
+
+x = mpz(10) ** 425000000 - 1
+coeff = int(x)
+
+d = Decimal('9' * 425000000 + 'e-849999999')
+
+h1 = xhash(coeff, -849999999)
+h2 = hash(d)
+
+assert h2 == h1
diff --git a/Modules/_decimal/tests/deccheck.py b/Modules/_decimal/tests/deccheck.py
new file mode 100644
index 0000000..c8da4d0
--- /dev/null
+++ b/Modules/_decimal/tests/deccheck.py
@@ -0,0 +1,1075 @@
+#!/usr/bin/env python
+
+#
+# Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+#
+# Usage: python deccheck.py [--short|--medium|--long|--all]
+#
+
+import sys, random
+from copy import copy
+from collections import defaultdict
+from test.support import import_fresh_module
+from randdec import randfloat, all_unary, all_binary, all_ternary
+from formathelper import rand_format, rand_locale
+
+C = import_fresh_module('decimal', fresh=['_decimal'])
+P = import_fresh_module('decimal', blocked=['_decimal'])
+EXIT_STATUS = 0
+
+
+# Contains all categories of Decimal methods.
+Functions = {
+ # Plain unary:
+ 'unary': (
+ '__abs__', '__bool__', '__ceil__', '__complex__', '__copy__',
+ '__floor__', '__float__', '__hash__', '__int__', '__neg__',
+ '__pos__', '__reduce__', '__repr__', '__str__', '__trunc__',
+ 'adjusted', 'as_tuple', 'canonical', 'conjugate', 'copy_abs',
+ 'copy_negate', 'is_canonical', 'is_finite', 'is_infinite',
+ 'is_nan', 'is_qnan', 'is_signed', 'is_snan', 'is_zero', 'radix'
+ ),
+ # Unary with optional context:
+ 'unary_ctx': (
+ 'exp', 'is_normal', 'is_subnormal', 'ln', 'log10', 'logb',
+ 'logical_invert', 'next_minus', 'next_plus', 'normalize',
+ 'number_class', 'sqrt', 'to_eng_string'
+ ),
+ # Unary with optional rounding mode and context:
+ 'unary_rnd_ctx': ('to_integral', 'to_integral_exact', 'to_integral_value'),
+ # Plain binary:
+ 'binary': (
+ '__add__', '__divmod__', '__eq__', '__floordiv__', '__ge__', '__gt__',
+ '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__pow__',
+ '__radd__', '__rdivmod__', '__rfloordiv__', '__rmod__', '__rmul__',
+ '__rpow__', '__rsub__', '__rtruediv__', '__sub__', '__truediv__',
+ 'compare_total', 'compare_total_mag', 'copy_sign', 'quantize',
+ 'same_quantum'
+ ),
+ # Binary with optional context:
+ 'binary_ctx': (
+ 'compare', 'compare_signal', 'logical_and', 'logical_or', 'logical_xor',
+ 'max', 'max_mag', 'min', 'min_mag', 'next_toward', 'remainder_near',
+ 'rotate', 'scaleb', 'shift'
+ ),
+ # Plain ternary:
+ 'ternary': ('__pow__',),
+ # Ternary with optional context:
+ 'ternary_ctx': ('fma',),
+ # Special:
+ 'special': ('__format__', '__reduce_ex__', '__round__', 'from_float',
+ 'quantize'),
+ # Properties:
+ 'property': ('real', 'imag')
+}
+
+# Contains all categories of Context methods. The n-ary classification
+# applies to the number of Decimal arguments.
+ContextFunctions = {
+ # Plain nullary:
+ 'nullary': ('context.__hash__', 'context.__reduce__', 'context.radix'),
+ # Plain unary:
+ 'unary': ('context.abs', 'context.canonical', 'context.copy_abs',
+ 'context.copy_decimal', 'context.copy_negate',
+ 'context.create_decimal', 'context.exp', 'context.is_canonical',
+ 'context.is_finite', 'context.is_infinite', 'context.is_nan',
+ 'context.is_normal', 'context.is_qnan', 'context.is_signed',
+ 'context.is_snan', 'context.is_subnormal', 'context.is_zero',
+ 'context.ln', 'context.log10', 'context.logb',
+ 'context.logical_invert', 'context.minus', 'context.next_minus',
+ 'context.next_plus', 'context.normalize', 'context.number_class',
+ 'context.plus', 'context.sqrt', 'context.to_eng_string',
+ 'context.to_integral', 'context.to_integral_exact',
+ 'context.to_integral_value', 'context.to_sci_string'
+ ),
+ # Plain binary:
+ 'binary': ('context.add', 'context.compare', 'context.compare_signal',
+ 'context.compare_total', 'context.compare_total_mag',
+ 'context.copy_sign', 'context.divide', 'context.divide_int',
+ 'context.divmod', 'context.logical_and', 'context.logical_or',
+ 'context.logical_xor', 'context.max', 'context.max_mag',
+ 'context.min', 'context.min_mag', 'context.multiply',
+ 'context.next_toward', 'context.power', 'context.quantize',
+ 'context.remainder', 'context.remainder_near', 'context.rotate',
+ 'context.same_quantum', 'context.scaleb', 'context.shift',
+ 'context.subtract'
+ ),
+ # Plain ternary:
+ 'ternary': ('context.fma', 'context.power'),
+ # Special:
+ 'special': ('context.__reduce_ex__', 'context.create_decimal_from_float')
+}
+
+# Functions that require a restricted exponent range for reasonable runtimes.
+UnaryRestricted = [
+ '__ceil__', '__floor__', '__int__', '__long__', '__trunc__',
+ 'to_integral', 'to_integral_value'
+]
+
+BinaryRestricted = ['__round__']
+
+TernaryRestricted = ['__pow__', 'context.power']
+
+
+# ======================================================================
+# Unified Context
+# ======================================================================
+
+# Translate symbols.
+CondMap = {
+ C.Clamped: P.Clamped,
+ C.ConversionSyntax: P.ConversionSyntax,
+ C.DivisionByZero: P.DivisionByZero,
+ C.DivisionImpossible: P.InvalidOperation,
+ C.DivisionUndefined: P.DivisionUndefined,
+ C.Inexact: P.Inexact,
+ C.InvalidContext: P.InvalidContext,
+ C.InvalidOperation: P.InvalidOperation,
+ C.Overflow: P.Overflow,
+ C.Rounded: P.Rounded,
+ C.Subnormal: P.Subnormal,
+ C.Underflow: P.Underflow,
+ C.FloatOperation: P.FloatOperation,
+}
+
+RoundMap = {
+ C.ROUND_UP: P.ROUND_UP,
+ C.ROUND_DOWN: P.ROUND_DOWN,
+ C.ROUND_CEILING: P.ROUND_CEILING,
+ C.ROUND_FLOOR: P.ROUND_FLOOR,
+ C.ROUND_HALF_UP: P.ROUND_HALF_UP,
+ C.ROUND_HALF_DOWN: P.ROUND_HALF_DOWN,
+ C.ROUND_HALF_EVEN: P.ROUND_HALF_EVEN,
+ C.ROUND_05UP: P.ROUND_05UP
+}
+RoundModes = RoundMap.items()
+
+
+class Context(object):
+ """Provides a convenient way of syncing the C and P contexts"""
+
+ __slots__ = ['c', 'p']
+
+ def __init__(self, c_ctx=None, p_ctx=None):
+ """Initialization is from the C context"""
+ self.c = C.getcontext() if c_ctx is None else c_ctx
+ self.p = P.getcontext() if p_ctx is None else p_ctx
+ self.p.prec = self.c.prec
+ self.p.Emin = self.c.Emin
+ self.p.Emax = self.c.Emax
+ self.p.rounding = RoundMap[self.c.rounding]
+ self.p.capitals = self.c.capitals
+ self.settraps([sig for sig in self.c.traps if self.c.traps[sig]])
+ self.setstatus([sig for sig in self.c.flags if self.c.flags[sig]])
+ self.p.clamp = self.c.clamp
+
+ def __str__(self):
+ return str(self.c) + '\n' + str(self.p)
+
+ def getprec(self):
+ assert(self.c.prec == self.p.prec)
+ return self.c.prec
+
+ def setprec(self, val):
+ self.c.prec = val
+ self.p.prec = val
+
+ def getemin(self):
+ assert(self.c.Emin == self.p.Emin)
+ return self.c.Emin
+
+ def setemin(self, val):
+ self.c.Emin = val
+ self.p.Emin = val
+
+ def getemax(self):
+ assert(self.c.Emax == self.p.Emax)
+ return self.c.Emax
+
+ def setemax(self, val):
+ self.c.Emax = val
+ self.p.Emax = val
+
+ def getround(self):
+ assert(self.c.rounding == RoundMap[self.p.rounding])
+ return self.c.rounding
+
+ def setround(self, val):
+ self.c.rounding = val
+ self.p.rounding = RoundMap[val]
+
+ def getcapitals(self):
+ assert(self.c.capitals == self.p.capitals)
+ return self.c.capitals
+
+ def setcapitals(self, val):
+ self.c.capitals = val
+ self.p.capitals = val
+
+ def getclamp(self):
+ assert(self.c.clamp == self.p.clamp)
+ return self.c.clamp
+
+ def setclamp(self, val):
+ self.c.clamp = val
+ self.p.clamp = val
+
+ prec = property(getprec, setprec)
+ Emin = property(getemin, setemin)
+ Emax = property(getemax, setemax)
+ rounding = property(getround, setround)
+ clamp = property(getclamp, setclamp)
+ capitals = property(getcapitals, setcapitals)
+
+ def clear_traps(self):
+ self.c.clear_traps()
+ for trap in self.p.traps:
+ self.p.traps[trap] = False
+
+ def clear_status(self):
+ self.c.clear_flags()
+ self.p.clear_flags()
+
+ def settraps(self, lst):
+ """lst: C signal list"""
+ self.clear_traps()
+ for signal in lst:
+ self.c.traps[signal] = True
+ self.p.traps[CondMap[signal]] = True
+
+ def setstatus(self, lst):
+ """lst: C signal list"""
+ self.clear_status()
+ for signal in lst:
+ self.c.flags[signal] = True
+ self.p.flags[CondMap[signal]] = True
+
+ def assert_eq_status(self):
+ """assert equality of C and P status"""
+ for signal in self.c.flags:
+ if self.c.flags[signal] == (not self.p.flags[CondMap[signal]]):
+ return False
+ return True
+
+
+# We don't want exceptions so that we can compare the status flags.
+context = Context()
+context.Emin = C.MIN_EMIN
+context.Emax = C.MAX_EMAX
+context.clear_traps()
+
+# When creating decimals, _decimal is ultimately limited by the maximum
+# context values. We emulate this restriction for decimal.py.
+maxcontext = P.Context(
+ prec=C.MAX_PREC,
+ Emin=C.MIN_EMIN,
+ Emax=C.MAX_EMAX,
+ rounding=P.ROUND_HALF_UP,
+ capitals=1
+)
+maxcontext.clamp = 0
+
+def RestrictedDecimal(value):
+ maxcontext.traps = copy(context.p.traps)
+ maxcontext.clear_flags()
+ if isinstance(value, str):
+ value = value.strip()
+ dec = maxcontext.create_decimal(value)
+ if maxcontext.flags[P.Inexact] or \
+ maxcontext.flags[P.Rounded] or \
+ maxcontext.flags[P.Clamped] or \
+ maxcontext.flags[P.InvalidOperation]:
+ return context.p._raise_error(P.InvalidOperation)
+ if maxcontext.flags[P.FloatOperation]:
+ context.p.flags[P.FloatOperation] = True
+ return dec
+
+
+# ======================================================================
+# TestSet: Organize data and events during a single test case
+# ======================================================================
+
+class RestrictedList(list):
+ """List that can only be modified by appending items."""
+ def __getattribute__(self, name):
+ if name != 'append':
+ raise AttributeError("unsupported operation")
+ return list.__getattribute__(self, name)
+ def unsupported(self, *_):
+ raise AttributeError("unsupported operation")
+ __add__ = __delattr__ = __delitem__ = __iadd__ = __imul__ = unsupported
+ __mul__ = __reversed__ = __rmul__ = __setattr__ = __setitem__ = unsupported
+
+class TestSet(object):
+ """A TestSet contains the original input operands, converted operands,
+ Python exceptions that occurred either during conversion or during
+ execution of the actual function, and the final results.
+
+ For safety, most attributes are lists that only support the append
+ operation.
+
+ If a function name is prefixed with 'context.', the corresponding
+ context method is called.
+ """
+ def __init__(self, funcname, operands):
+ if funcname.startswith("context."):
+ self.funcname = funcname.replace("context.", "")
+ self.contextfunc = True
+ else:
+ self.funcname = funcname
+ self.contextfunc = False
+ self.op = operands # raw operand tuple
+ self.context = context # context used for the operation
+ self.cop = RestrictedList() # converted C.Decimal operands
+ self.cex = RestrictedList() # Python exceptions for C.Decimal
+ self.cresults = RestrictedList() # C.Decimal results
+ self.pop = RestrictedList() # converted P.Decimal operands
+ self.pex = RestrictedList() # Python exceptions for P.Decimal
+ self.presults = RestrictedList() # P.Decimal results
+
+
+# ======================================================================
+# SkipHandler: skip known discrepancies
+# ======================================================================
+
+class SkipHandler:
+ """Handle known discrepancies between decimal.py and _decimal.so.
+ These are either ULP differences in the power function or
+ extremely minor issues."""
+
+ def __init__(self):
+ self.ulpdiff = 0
+ self.powmod_zeros = 0
+ self.maxctx = P.Context(Emax=10**18, Emin=-10**18)
+
+ def default(self, t):
+ return False
+ __ge__ = __gt__ = __le__ = __lt__ = __ne__ = __eq__ = default
+ __reduce__ = __format__ = __repr__ = __str__ = default
+
+ def harrison_ulp(self, dec):
+ """ftp://ftp.inria.fr/INRIA/publication/publi-pdf/RR/RR-5504.pdf"""
+ a = dec.next_plus()
+ b = dec.next_minus()
+ return abs(a - b)
+
+ def standard_ulp(self, dec, prec):
+ return P._dec_from_triple(0, '1', dec._exp+len(dec._int)-prec)
+
+ def rounding_direction(self, x, mode):
+ """Determine the effective direction of the rounding when
+ the exact result x is rounded according to mode.
+ Return -1 for downwards, 0 for undirected, 1 for upwards,
+ 2 for ROUND_05UP."""
+ cmp = 1 if x.compare_total(P.Decimal("+0")) >= 0 else -1
+
+ if mode in (P.ROUND_HALF_EVEN, P.ROUND_HALF_UP, P.ROUND_HALF_DOWN):
+ return 0
+ elif mode == P.ROUND_CEILING:
+ return 1
+ elif mode == P.ROUND_FLOOR:
+ return -1
+ elif mode == P.ROUND_UP:
+ return cmp
+ elif mode == P.ROUND_DOWN:
+ return -cmp
+ elif mode == P.ROUND_05UP:
+ return 2
+ else:
+ raise ValueError("Unexpected rounding mode: %s" % mode)
+
+ def check_ulpdiff(self, exact, rounded):
+ # current precision
+ p = context.p.prec
+
+ # Convert infinities to the largest representable number + 1.
+ x = exact
+ if exact.is_infinite():
+ x = P._dec_from_triple(exact._sign, '10', context.p.Emax)
+ y = rounded
+ if rounded.is_infinite():
+ y = P._dec_from_triple(rounded._sign, '10', context.p.Emax)
+
+ # err = (rounded - exact) / ulp(rounded)
+ self.maxctx.prec = p * 2
+ t = self.maxctx.subtract(y, x)
+ if context.c.flags[C.Clamped] or \
+ context.c.flags[C.Underflow]:
+ # The standard ulp does not work in Underflow territory.
+ ulp = self.harrison_ulp(y)
+ else:
+ ulp = self.standard_ulp(y, p)
+ # Error in ulps.
+ err = self.maxctx.divide(t, ulp)
+
+ dir = self.rounding_direction(x, context.p.rounding)
+ if dir == 0:
+ if P.Decimal("-0.6") < err < P.Decimal("0.6"):
+ return True
+ elif dir == 1: # directed, upwards
+ if P.Decimal("-0.1") < err < P.Decimal("1.1"):
+ return True
+ elif dir == -1: # directed, downwards
+ if P.Decimal("-1.1") < err < P.Decimal("0.1"):
+ return True
+ else: # ROUND_05UP
+ if P.Decimal("-1.1") < err < P.Decimal("1.1"):
+ return True
+
+ print("ulp: %s error: %s exact: %s c_rounded: %s"
+ % (ulp, err, exact, rounded))
+ return False
+
+ def bin_resolve_ulp(self, t):
+ """Check if results of _decimal's power function are within the
+ allowed ulp ranges."""
+ # NaNs are beyond repair.
+ if t.rc.is_nan() or t.rp.is_nan():
+ return False
+
+ # "exact" result, double precision, half_even
+ self.maxctx.prec = context.p.prec * 2
+
+ op1, op2 = t.pop[0], t.pop[1]
+ if t.contextfunc:
+ exact = getattr(self.maxctx, t.funcname)(op1, op2)
+ else:
+ exact = getattr(op1, t.funcname)(op2, context=self.maxctx)
+
+ # _decimal's rounded result
+ rounded = P.Decimal(t.cresults[0])
+
+ self.ulpdiff += 1
+ return self.check_ulpdiff(exact, rounded)
+
+ ############################ Correct rounding #############################
+ def resolve_underflow(self, t):
+ """In extremely rare cases where the infinite precision result is just
+ below etiny, cdecimal does not set Subnormal/Underflow. Example:
+
+ setcontext(Context(prec=21, rounding=ROUND_UP, Emin=-55, Emax=85))
+ Decimal("1.00000000000000000000000000000000000000000000000"
+ "0000000100000000000000000000000000000000000000000"
+ "0000000000000025").ln()
+ """
+ if t.cresults != t.presults:
+ return False # Results must be identical.
+ if context.c.flags[C.Rounded] and \
+ context.c.flags[C.Inexact] and \
+ context.p.flags[P.Rounded] and \
+ context.p.flags[P.Inexact]:
+ return True # Subnormal/Underflow may be missing.
+ return False
+
+ def exp(self, t):
+ """Resolve Underflow or ULP difference."""
+ return self.resolve_underflow(t)
+
+ def log10(self, t):
+ """Resolve Underflow or ULP difference."""
+ return self.resolve_underflow(t)
+
+ def ln(self, t):
+ """Resolve Underflow or ULP difference."""
+ return self.resolve_underflow(t)
+
+ def __pow__(self, t):
+ """Always calls the resolve function. C.Decimal does not have correct
+ rounding for the power function."""
+ if context.c.flags[C.Rounded] and \
+ context.c.flags[C.Inexact] and \
+ context.p.flags[P.Rounded] and \
+ context.p.flags[P.Inexact]:
+ return self.bin_resolve_ulp(t)
+ else:
+ return False
+ power = __rpow__ = __pow__
+
+ ############################## Technicalities #############################
+ def __float__(self, t):
+ """NaN comparison in the verify() function obviously gives an
+ incorrect answer: nan == nan -> False"""
+ if t.cop[0].is_nan() and t.pop[0].is_nan():
+ return True
+ return False
+ __complex__ = __float__
+
+ def __radd__(self, t):
+ """decimal.py gives precedence to the first NaN; this is
+ not important, as __radd__ will not be called for
+ two decimal arguments."""
+ if t.rc.is_nan() and t.rp.is_nan():
+ return True
+ return False
+ __rmul__ = __radd__
+
+ ################################ Various ##################################
+ def __round__(self, t):
+ """Exception: Decimal('1').__round__(-100000000000000000000000000)
+ Should it really be InvalidOperation?"""
+ if t.rc is None and t.rp.is_nan():
+ return True
+ return False
+
+shandler = SkipHandler()
+def skip_error(t):
+ return getattr(shandler, t.funcname, shandler.default)(t)
+
+
+# ======================================================================
+# Handling verification errors
+# ======================================================================
+
+class VerifyError(Exception):
+ """Verification failed."""
+ pass
+
+def function_as_string(t):
+ if t.contextfunc:
+ cargs = t.cop
+ pargs = t.pop
+ cfunc = "c_func: %s(" % t.funcname
+ pfunc = "p_func: %s(" % t.funcname
+ else:
+ cself, cargs = t.cop[0], t.cop[1:]
+ pself, pargs = t.pop[0], t.pop[1:]
+ cfunc = "c_func: %s.%s(" % (repr(cself), t.funcname)
+ pfunc = "p_func: %s.%s(" % (repr(pself), t.funcname)
+
+ err = cfunc
+ for arg in cargs:
+ err += "%s, " % repr(arg)
+ err = err.rstrip(", ")
+ err += ")\n"
+
+ err += pfunc
+ for arg in pargs:
+ err += "%s, " % repr(arg)
+ err = err.rstrip(", ")
+ err += ")"
+
+ return err
+
+def raise_error(t):
+ global EXIT_STATUS
+
+ if skip_error(t):
+ return
+ EXIT_STATUS = 1
+
+ err = "Error in %s:\n\n" % t.funcname
+ err += "input operands: %s\n\n" % (t.op,)
+ err += function_as_string(t)
+ err += "\n\nc_result: %s\np_result: %s\n\n" % (t.cresults, t.presults)
+ err += "c_exceptions: %s\np_exceptions: %s\n\n" % (t.cex, t.pex)
+ err += "%s\n\n" % str(t.context)
+
+ raise VerifyError(err)
+
+
+# ======================================================================
+# Main testing functions
+#
+# The procedure is always (t is the TestSet):
+#
+# convert(t) -> Initialize the TestSet as necessary.
+#
+# Return 0 for early abortion (e.g. if a TypeError
+# occurs during conversion, there is nothing to test).
+#
+# Return 1 for continuing with the test case.
+#
+# callfuncs(t) -> Call the relevant function for each implementation
+# and record the results in the TestSet.
+#
+# verify(t) -> Verify the results. If verification fails, details
+# are printed to stdout.
+# ======================================================================
+
+def convert(t, convstr=True):
+ """ t is the testset. At this stage the testset contains a tuple of
+ operands t.op of various types. For decimal methods the first
+ operand (self) is always converted to Decimal. If 'convstr' is
+ true, string operands are converted as well.
+
+ Context operands are of type deccheck.Context, rounding mode
+ operands are given as a tuple (C.rounding, P.rounding).
+
+ Other types (float, int, etc.) are left unchanged.
+ """
+ for i, op in enumerate(t.op):
+
+ context.clear_status()
+
+ if not t.contextfunc and i == 0 or \
+ convstr and isinstance(op, str):
+ try:
+ c = C.Decimal(op)
+ cex = None
+ except (TypeError, ValueError, OverflowError) as e:
+ c = None
+ cex = e.__class__
+
+ try:
+ p = RestrictedDecimal(op)
+ pex = None
+ except (TypeError, ValueError, OverflowError) as e:
+ p = None
+ pex = e.__class__
+
+ t.cop.append(c)
+ t.cex.append(cex)
+ t.pop.append(p)
+ t.pex.append(pex)
+
+ if cex is pex:
+ if str(c) != str(p) or not context.assert_eq_status():
+ raise_error(t)
+ if cex and pex:
+ # nothing to test
+ return 0
+ else:
+ raise_error(t)
+
+ elif isinstance(op, Context):
+ t.context = op
+ t.cop.append(op.c)
+ t.pop.append(op.p)
+
+ elif op in RoundModes:
+ t.cop.append(op[0])
+ t.pop.append(op[1])
+
+ else:
+ t.cop.append(op)
+ t.pop.append(op)
+
+ return 1
+
+def callfuncs(t):
+ """ t is the testset. At this stage the testset contains operand lists
+ t.cop and t.pop for the C and Python versions of decimal.
+ For Decimal methods, the first operands are of type C.Decimal and
+ P.Decimal respectively. The remaining operands can have various types.
+ For Context methods, all operands can have any type.
+
+ t.rc and t.rp are the results of the operation.
+ """
+ context.clear_status()
+
+ try:
+ if t.contextfunc:
+ cargs = t.cop
+ t.rc = getattr(context.c, t.funcname)(*cargs)
+ else:
+ cself = t.cop[0]
+ cargs = t.cop[1:]
+ t.rc = getattr(cself, t.funcname)(*cargs)
+ t.cex.append(None)
+ except (TypeError, ValueError, OverflowError, MemoryError) as e:
+ t.rc = None
+ t.cex.append(e.__class__)
+
+ try:
+ if t.contextfunc:
+ pargs = t.pop
+ t.rp = getattr(context.p, t.funcname)(*pargs)
+ else:
+ pself = t.pop[0]
+ pargs = t.pop[1:]
+ t.rp = getattr(pself, t.funcname)(*pargs)
+ t.pex.append(None)
+ except (TypeError, ValueError, OverflowError, MemoryError) as e:
+ t.rp = None
+ t.pex.append(e.__class__)
+
+def verify(t, stat):
+ """ t is the testset. At this stage the testset contains the following
+ tuples:
+
+ t.op: original operands
+ t.cop: C.Decimal operands (see convert for details)
+ t.pop: P.Decimal operands (see convert for details)
+ t.rc: C result
+ t.rp: Python result
+
+ t.rc and t.rp can have various types.
+ """
+ t.cresults.append(str(t.rc))
+ t.presults.append(str(t.rp))
+ if isinstance(t.rc, C.Decimal) and isinstance(t.rp, P.Decimal):
+ # General case: both results are Decimals.
+ t.cresults.append(t.rc.to_eng_string())
+ t.cresults.append(t.rc.as_tuple())
+ t.cresults.append(str(t.rc.imag))
+ t.cresults.append(str(t.rc.real))
+ t.presults.append(t.rp.to_eng_string())
+ t.presults.append(t.rp.as_tuple())
+ t.presults.append(str(t.rp.imag))
+ t.presults.append(str(t.rp.real))
+
+ nc = t.rc.number_class().lstrip('+-s')
+ stat[nc] += 1
+ else:
+ # Results from e.g. __divmod__ can only be compared as strings.
+ if not isinstance(t.rc, tuple) and not isinstance(t.rp, tuple):
+ if t.rc != t.rp:
+ raise_error(t)
+ stat[type(t.rc).__name__] += 1
+
+ # The return value lists must be equal.
+ if t.cresults != t.presults:
+ raise_error(t)
+ # The Python exception lists (TypeError, etc.) must be equal.
+ if t.cex != t.pex:
+ raise_error(t)
+ # The context flags must be equal.
+ if not t.context.assert_eq_status():
+ raise_error(t)
+
+
+# ======================================================================
+# Main test loops
+#
+# test_method(method, testspecs, testfunc) ->
+#
+# Loop through various context settings. The degree of
+# thoroughness is determined by 'testspec'. For each
+# setting, call 'testfunc'. Generally, 'testfunc' itself
+# a loop, iterating through many test cases generated
+# by the functions in randdec.py.
+#
+# test_n-ary(method, prec, exp_range, restricted_range, itr, stat) ->
+#
+# 'test_unary', 'test_binary' and 'test_ternary' are the
+# main test functions passed to 'test_method'. They deal
+# with the regular cases. The thoroughness of testing is
+# determined by 'itr'.
+#
+# 'prec', 'exp_range' and 'restricted_range' are passed
+# to the test-generating functions and limit the generated
+# values. In some cases, for reasonable run times a
+# maximum exponent of 9999 is required.
+#
+# The 'stat' parameter is passed down to the 'verify'
+# function, which records statistics for the result values.
+# ======================================================================
+
+def log(fmt, args=None):
+ if args:
+ sys.stdout.write(''.join((fmt, '\n')) % args)
+ else:
+ sys.stdout.write(''.join((str(fmt), '\n')))
+ sys.stdout.flush()
+
+def test_method(method, testspecs, testfunc):
+ """Iterate a test function through many context settings."""
+ log("testing %s ...", method)
+ stat = defaultdict(int)
+ for spec in testspecs:
+ if 'samples' in spec:
+ spec['prec'] = sorted(random.sample(range(1, 101),
+ spec['samples']))
+ for prec in spec['prec']:
+ context.prec = prec
+ for expts in spec['expts']:
+ emin, emax = expts
+ if emin == 'rand':
+ context.Emin = random.randrange(-1000, 0)
+ context.Emax = random.randrange(prec, 1000)
+ else:
+ context.Emin, context.Emax = emin, emax
+ if prec > context.Emax: continue
+ log(" prec: %d emin: %d emax: %d",
+ (context.prec, context.Emin, context.Emax))
+ restr_range = 9999 if context.Emax > 9999 else context.Emax+99
+ for rounding in sorted(RoundMap):
+ context.rounding = rounding
+ context.capitals = random.randrange(2)
+ if spec['clamp'] == 'rand':
+ context.clamp = random.randrange(2)
+ else:
+ context.clamp = spec['clamp']
+ exprange = context.c.Emax
+ testfunc(method, prec, exprange, restr_range,
+ spec['iter'], stat)
+ log(" result types: %s" % sorted([t for t in stat.items()]))
+
+def test_unary(method, prec, exp_range, restricted_range, itr, stat):
+ """Iterate a unary function through many test cases."""
+ if method in UnaryRestricted:
+ exp_range = restricted_range
+ for op in all_unary(prec, exp_range, itr):
+ t = TestSet(method, op)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def test_binary(method, prec, exp_range, restricted_range, itr, stat):
+ """Iterate a binary function through many test cases."""
+ if method in BinaryRestricted:
+ exp_range = restricted_range
+ for op in all_binary(prec, exp_range, itr):
+ t = TestSet(method, op)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def test_ternary(method, prec, exp_range, restricted_range, itr, stat):
+ """Iterate a ternary function through many test cases."""
+ if method in TernaryRestricted:
+ exp_range = restricted_range
+ for op in all_ternary(prec, exp_range, itr):
+ t = TestSet(method, op)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def test_format(method, prec, exp_range, restricted_range, itr, stat):
+ """Iterate the __format__ method through many test cases."""
+ for op in all_unary(prec, exp_range, itr):
+ fmt1 = rand_format(chr(random.randrange(32, 128)), 'EeGgn')
+ fmt2 = rand_locale()
+ for fmt in (fmt1, fmt2):
+ fmtop = (op[0], fmt)
+ t = TestSet(method, fmtop)
+ try:
+ if not convert(t, convstr=False):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+ for op in all_unary(prec, 9999, itr):
+ fmt1 = rand_format(chr(random.randrange(32, 128)), 'Ff%')
+ fmt2 = rand_locale()
+ for fmt in (fmt1, fmt2):
+ fmtop = (op[0], fmt)
+ t = TestSet(method, fmtop)
+ try:
+ if not convert(t, convstr=False):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def test_round(method, prec, exprange, restricted_range, itr, stat):
+ """Iterate the __round__ method through many test cases."""
+ for op in all_unary(prec, 9999, itr):
+ n = random.randrange(10)
+ roundop = (op[0], n)
+ t = TestSet(method, roundop)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def test_from_float(method, prec, exprange, restricted_range, itr, stat):
+ """Iterate the __float__ method through many test cases."""
+ for rounding in sorted(RoundMap):
+ context.rounding = rounding
+ for i in range(1000):
+ f = randfloat()
+ op = (f,) if method.startswith("context.") else ("sNaN", f)
+ t = TestSet(method, op)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+def randcontext(exprange):
+ c = Context(C.Context(), P.Context())
+ c.Emax = random.randrange(1, exprange+1)
+ c.Emin = random.randrange(-exprange, 0)
+ maxprec = 100 if c.Emax >= 100 else c.Emax
+ c.prec = random.randrange(1, maxprec+1)
+ c.clamp = random.randrange(2)
+ c.clear_traps()
+ return c
+
+def test_quantize_api(method, prec, exprange, restricted_range, itr, stat):
+ """Iterate the 'quantize' method through many test cases, using
+ the optional arguments."""
+ for op in all_binary(prec, restricted_range, itr):
+ for rounding in RoundModes:
+ c = randcontext(exprange)
+ quantizeop = (op[0], op[1], rounding, c)
+ t = TestSet(method, quantizeop)
+ try:
+ if not convert(t):
+ continue
+ callfuncs(t)
+ verify(t, stat)
+ except VerifyError as err:
+ log(err)
+
+
+def check_untested(funcdict, c_cls, p_cls):
+ """Determine untested, C-only and Python-only attributes.
+ Uncomment print lines for debugging."""
+ c_attr = set(dir(c_cls))
+ p_attr = set(dir(p_cls))
+ intersect = c_attr & p_attr
+
+ funcdict['c_only'] = tuple(sorted(c_attr-intersect))
+ funcdict['p_only'] = tuple(sorted(p_attr-intersect))
+
+ tested = set()
+ for lst in funcdict.values():
+ for v in lst:
+ v = v.replace("context.", "") if c_cls == C.Context else v
+ tested.add(v)
+
+ funcdict['untested'] = tuple(sorted(intersect-tested))
+
+ #for key in ('untested', 'c_only', 'p_only'):
+ # s = 'Context' if c_cls == C.Context else 'Decimal'
+ # print("\n%s %s:\n%s" % (s, key, funcdict[key]))
+
+
+if __name__ == '__main__':
+
+ import time
+
+ randseed = int(time.time())
+ random.seed(randseed)
+
+ # Set up the testspecs list. A testspec is simply a dictionary
+ # that determines the amount of different contexts that 'test_method'
+ # will generate.
+ base_expts = [(C.MIN_EMIN, C.MAX_EMAX)]
+ if C.MAX_EMAX == 999999999999999999:
+ base_expts.append((-999999999, 999999999))
+
+ # Basic contexts.
+ base = {
+ 'expts': base_expts,
+ 'prec': [],
+ 'clamp': 'rand',
+ 'iter': None,
+ 'samples': None,
+ }
+ # Contexts with small values for prec, emin, emax.
+ small = {
+ 'prec': [1, 2, 3, 4, 5],
+ 'expts': [(-1, 1), (-2, 2), (-3, 3), (-4, 4), (-5, 5)],
+ 'clamp': 'rand',
+ 'iter': None
+ }
+ # IEEE interchange format.
+ ieee = [
+ # DECIMAL32
+ {'prec': [7], 'expts': [(-95, 96)], 'clamp': 1, 'iter': None},
+ # DECIMAL64
+ {'prec': [16], 'expts': [(-383, 384)], 'clamp': 1, 'iter': None},
+ # DECIMAL128
+ {'prec': [34], 'expts': [(-6143, 6144)], 'clamp': 1, 'iter': None}
+ ]
+
+ if '--medium' in sys.argv:
+ base['expts'].append(('rand', 'rand'))
+ # 5 random precisions
+ base['samples'] = 5
+ testspecs = [small] + ieee + [base]
+ if '--long' in sys.argv:
+ base['expts'].append(('rand', 'rand'))
+ # 10 random precisions
+ base['samples'] = 10
+ testspecs = [small] + ieee + [base]
+ elif '--all' in sys.argv:
+ base['expts'].append(('rand', 'rand'))
+ # All precisions in [1, 100]
+ base['samples'] = 100
+ testspecs = [small] + ieee + [base]
+ else: # --short
+ rand_ieee = random.choice(ieee)
+ base['iter'] = small['iter'] = rand_ieee['iter'] = 1
+ # 1 random precision and exponent pair
+ base['samples'] = 1
+ base['expts'] = [random.choice(base_expts)]
+ # 1 random precision and exponent pair
+ prec = random.randrange(1, 6)
+ small['prec'] = [prec]
+ small['expts'] = [(-prec, prec)]
+ testspecs = [small, rand_ieee, base]
+
+ check_untested(Functions, C.Decimal, P.Decimal)
+ check_untested(ContextFunctions, C.Context, P.Context)
+
+
+ log("\n\nRandom seed: %d\n\n", randseed)
+
+ # Decimal methods:
+ for method in Functions['unary'] + Functions['unary_ctx'] + \
+ Functions['unary_rnd_ctx']:
+ test_method(method, testspecs, test_unary)
+
+ for method in Functions['binary'] + Functions['binary_ctx']:
+ test_method(method, testspecs, test_binary)
+
+ for method in Functions['ternary'] + Functions['ternary_ctx']:
+ test_method(method, testspecs, test_ternary)
+
+ test_method('__format__', testspecs, test_format)
+ test_method('__round__', testspecs, test_round)
+ test_method('from_float', testspecs, test_from_float)
+ test_method('quantize', testspecs, test_quantize_api)
+
+ # Context methods:
+ for method in ContextFunctions['unary']:
+ test_method(method, testspecs, test_unary)
+
+ for method in ContextFunctions['binary']:
+ test_method(method, testspecs, test_binary)
+
+ for method in ContextFunctions['ternary']:
+ test_method(method, testspecs, test_ternary)
+
+ test_method('context.create_decimal_from_float', testspecs, test_from_float)
+
+
+ sys.exit(EXIT_STATUS)
diff --git a/Modules/_decimal/tests/formathelper.py b/Modules/_decimal/tests/formathelper.py
new file mode 100644
index 0000000..9da2b37
--- /dev/null
+++ b/Modules/_decimal/tests/formathelper.py
@@ -0,0 +1,344 @@
+#
+# Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+
+# Generate PEP-3101 format strings.
+
+
+import os, sys, locale, random
+import platform, subprocess
+from test.support import import_fresh_module
+from distutils.spawn import find_executable
+
+C = import_fresh_module('decimal', fresh=['_decimal'])
+P = import_fresh_module('decimal', blocked=['_decimal'])
+
+
+windows_lang_strings = [
+ "chinese", "chinese-simplified", "chinese-traditional", "czech", "danish",
+ "dutch", "belgian", "english", "australian", "canadian", "english-nz",
+ "english-uk", "english-us", "finnish", "french", "french-belgian",
+ "french-canadian", "french-swiss", "german", "german-austrian",
+ "german-swiss", "greek", "hungarian", "icelandic", "italian", "italian-swiss",
+ "japanese", "korean", "norwegian", "norwegian-bokmal", "norwegian-nynorsk",
+ "polish", "portuguese", "portuguese-brazil", "russian", "slovak", "spanish",
+ "spanish-mexican", "spanish-modern", "swedish", "turkish",
+]
+
+preferred_encoding = {
+ 'cs_CZ': 'ISO8859-2',
+ 'cs_CZ.iso88592': 'ISO8859-2',
+ 'czech': 'ISO8859-2',
+ 'eesti': 'ISO8859-1',
+ 'estonian': 'ISO8859-1',
+ 'et_EE': 'ISO8859-15',
+ 'et_EE.ISO-8859-15': 'ISO8859-15',
+ 'et_EE.iso885915': 'ISO8859-15',
+ 'et_EE.iso88591': 'ISO8859-1',
+ 'fi_FI.iso88591': 'ISO8859-1',
+ 'fi_FI': 'ISO8859-15',
+ 'fi_FI@euro': 'ISO8859-15',
+ 'fi_FI.iso885915@euro': 'ISO8859-15',
+ 'finnish': 'ISO8859-1',
+ 'lv_LV': 'ISO8859-13',
+ 'lv_LV.iso885913': 'ISO8859-13',
+ 'nb_NO': 'ISO8859-1',
+ 'nb_NO.iso88591': 'ISO8859-1',
+ 'bokmal': 'ISO8859-1',
+ 'nn_NO': 'ISO8859-1',
+ 'nn_NO.iso88591': 'ISO8859-1',
+ 'no_NO': 'ISO8859-1',
+ 'norwegian': 'ISO8859-1',
+ 'nynorsk': 'ISO8859-1',
+ 'ru_RU': 'ISO8859-5',
+ 'ru_RU.iso88595': 'ISO8859-5',
+ 'russian': 'ISO8859-5',
+ 'ru_RU.KOI8-R': 'KOI8-R',
+ 'ru_RU.koi8r': 'KOI8-R',
+ 'ru_RU.CP1251': 'CP1251',
+ 'ru_RU.cp1251': 'CP1251',
+ 'sk_SK': 'ISO8859-2',
+ 'sk_SK.iso88592': 'ISO8859-2',
+ 'slovak': 'ISO8859-2',
+ 'sv_FI': 'ISO8859-1',
+ 'sv_FI.iso88591': 'ISO8859-1',
+ 'sv_FI@euro': 'ISO8859-15',
+ 'sv_FI.iso885915@euro': 'ISO8859-15',
+ 'uk_UA': 'KOI8-U',
+ 'uk_UA.koi8u': 'KOI8-U'
+}
+
+integers = [
+ "",
+ "1",
+ "12",
+ "123",
+ "1234",
+ "12345",
+ "123456",
+ "1234567",
+ "12345678",
+ "123456789",
+ "1234567890",
+ "12345678901",
+ "123456789012",
+ "1234567890123",
+ "12345678901234",
+ "123456789012345",
+ "1234567890123456",
+ "12345678901234567",
+ "123456789012345678",
+ "1234567890123456789",
+ "12345678901234567890",
+ "123456789012345678901",
+ "1234567890123456789012",
+]
+
+numbers = [
+ "0", "-0", "+0",
+ "0.0", "-0.0", "+0.0",
+ "0e0", "-0e0", "+0e0",
+ ".0", "-.0",
+ ".1", "-.1",
+ "1.1", "-1.1",
+ "1e1", "-1e1"
+]
+
+# Get the list of available locales.
+if platform.system() == 'Windows':
+ locale_list = windows_lang_strings
+else:
+ locale_list = ['C']
+ if os.path.isfile("/var/lib/locales/supported.d/local"):
+ # On Ubuntu, `locale -a` gives the wrong case for some locales,
+ # so we get the correct names directly:
+ with open("/var/lib/locales/supported.d/local") as f:
+ locale_list = [loc.split()[0] for loc in f.readlines() \
+ if not loc.startswith('#')]
+ elif find_executable('locale'):
+ locale_list = subprocess.Popen(["locale", "-a"],
+ stdout=subprocess.PIPE).communicate()[0]
+ try:
+ locale_list = locale_list.decode()
+ except UnicodeDecodeError:
+ # Some distributions insist on using latin-1 characters
+ # in their locale names.
+ locale_list = locale_list.decode('latin-1')
+ locale_list = locale_list.split('\n')
+try:
+ locale_list.remove('')
+except ValueError:
+ pass
+
+# Debian
+if os.path.isfile("/etc/locale.alias"):
+ with open("/etc/locale.alias") as f:
+ while 1:
+ try:
+ line = f.readline()
+ except UnicodeDecodeError:
+ continue
+ if line == "":
+ break
+ if line.startswith('#'):
+ continue
+ x = line.split()
+ if len(x) == 2:
+ if x[0] in locale_list:
+ locale_list.remove(x[0])
+
+# FreeBSD
+if platform.system() == 'FreeBSD':
+ # http://www.freebsd.org/cgi/query-pr.cgi?pr=142173
+ # en_GB.US-ASCII has 163 as the currency symbol.
+ for loc in ['it_CH.ISO8859-1', 'it_CH.ISO8859-15', 'it_CH.UTF-8',
+ 'it_IT.ISO8859-1', 'it_IT.ISO8859-15', 'it_IT.UTF-8',
+ 'sl_SI.ISO8859-2', 'sl_SI.UTF-8',
+ 'en_GB.US-ASCII']:
+ try:
+ locale_list.remove(loc)
+ except ValueError:
+ pass
+
+# Print a testcase in the format of the IBM tests (for runtest.c):
+def get_preferred_encoding():
+ loc = locale.setlocale(locale.LC_CTYPE)
+ if loc in preferred_encoding:
+ return preferred_encoding[loc]
+ else:
+ return locale.getpreferredencoding()
+
+def printit(testno, s, fmt, encoding=None):
+ if not encoding:
+ encoding = get_preferred_encoding()
+ try:
+ result = format(P.Decimal(s), fmt)
+ fmt = str(fmt.encode(encoding))[2:-1]
+ result = str(result.encode(encoding))[2:-1]
+ if "'" in result:
+ sys.stdout.write("xfmt%d format %s '%s' -> \"%s\"\n"
+ % (testno, s, fmt, result))
+ else:
+ sys.stdout.write("xfmt%d format %s '%s' -> '%s'\n"
+ % (testno, s, fmt, result))
+ except Exception as err:
+ sys.stderr.write("%s %s %s\n" % (err, s, fmt))
+
+
+# Check if an integer can be converted to a valid fill character.
+def check_fillchar(i):
+ try:
+ c = chr(i)
+ c.encode('utf-8').decode()
+ format(P.Decimal(0), c + '<19g')
+ if c in ("'", '"', '\\'):
+ return None
+ return c
+ except:
+ return None
+
+# Generate all unicode characters that are accepted as
+# fill characters by decimal.py.
+def all_fillchars():
+ for i in range(32, 0x110002):
+ c = check_fillchar(i)
+ if c: yield c
+
+# Return random fill character.
+def rand_fillchar():
+ while 1:
+ i = random.randrange(32, 0x110002)
+ c = check_fillchar(i)
+ if c: return c
+
+# Generate random format strings
+# [[fill]align][sign][#][0][width][.precision][type]
+def rand_format(fill, typespec='EeGgFfn%'):
+ active = sorted(random.sample(range(7), random.randrange(8)))
+ have_align = 0
+ s = ''
+ for elem in active:
+ if elem == 0: # fill+align
+ s += fill
+ s += random.choice('<>=^')
+ have_align = 1
+ elif elem == 1: # sign
+ s += random.choice('+- ')
+ elif elem == 2 and not have_align: # zeropad
+ s += '0'
+ elif elem == 3: # width
+ s += str(random.randrange(1, 100))
+ elif elem == 4: # thousands separator
+ s += ','
+ elif elem == 5: # prec
+ s += '.'
+ s += str(random.randrange(100))
+ elif elem == 6:
+ if 4 in active: c = typespec.replace('n', '')
+ else: c = typespec
+ s += random.choice(c)
+ return s
+
+# Partially brute force all possible format strings containing a thousands
+# separator. Fall back to random where the runtime would become excessive.
+# [[fill]align][sign][#][0][width][,][.precision][type]
+def all_format_sep():
+ for align in ('', '<', '>', '=', '^'):
+ for fill in ('', 'x'):
+ if align == '': fill = ''
+ for sign in ('', '+', '-', ' '):
+ for zeropad in ('', '0'):
+ if align != '': zeropad = ''
+ for width in ['']+[str(y) for y in range(1, 15)]+['101']:
+ for prec in ['']+['.'+str(y) for y in range(15)]:
+ # for type in ('', 'E', 'e', 'G', 'g', 'F', 'f', '%'):
+ type = random.choice(('', 'E', 'e', 'G', 'g', 'F', 'f', '%'))
+ yield ''.join((fill, align, sign, zeropad, width, ',', prec, type))
+
+# Partially brute force all possible format strings with an 'n' specifier.
+# [[fill]align][sign][#][0][width][,][.precision][type]
+def all_format_loc():
+ for align in ('', '<', '>', '=', '^'):
+ for fill in ('', 'x'):
+ if align == '': fill = ''
+ for sign in ('', '+', '-', ' '):
+ for zeropad in ('', '0'):
+ if align != '': zeropad = ''
+ for width in ['']+[str(y) for y in range(1, 20)]+['101']:
+ for prec in ['']+['.'+str(y) for y in range(1, 20)]:
+ yield ''.join((fill, align, sign, zeropad, width, prec, 'n'))
+
+# Generate random format strings with a unicode fill character
+# [[fill]align][sign][#][0][width][,][.precision][type]
+def randfill(fill):
+ active = sorted(random.sample(range(5), random.randrange(6)))
+ s = ''
+ s += str(fill)
+ s += random.choice('<>=^')
+ for elem in active:
+ if elem == 0: # sign
+ s += random.choice('+- ')
+ elif elem == 1: # width
+ s += str(random.randrange(1, 100))
+ elif elem == 2: # thousands separator
+ s += ','
+ elif elem == 3: # prec
+ s += '.'
+ s += str(random.randrange(100))
+ elif elem == 4:
+ if 2 in active: c = 'EeGgFf%'
+ else: c = 'EeGgFfn%'
+ s += random.choice(c)
+ return s
+
+# Generate random format strings with random locale setting
+# [[fill]align][sign][#][0][width][,][.precision][type]
+def rand_locale():
+ try:
+ loc = random.choice(locale_list)
+ locale.setlocale(locale.LC_ALL, loc)
+ except locale.Error as err:
+ pass
+ active = sorted(random.sample(range(5), random.randrange(6)))
+ s = ''
+ have_align = 0
+ for elem in active:
+ if elem == 0: # fill+align
+ s += chr(random.randrange(32, 128))
+ s += random.choice('<>=^')
+ have_align = 1
+ elif elem == 1: # sign
+ s += random.choice('+- ')
+ elif elem == 2 and not have_align: # zeropad
+ s += '0'
+ elif elem == 3: # width
+ s += str(random.randrange(1, 100))
+ elif elem == 4: # prec
+ s += '.'
+ s += str(random.randrange(100))
+ s += 'n'
+ return s
diff --git a/Modules/_decimal/tests/randdec.py b/Modules/_decimal/tests/randdec.py
new file mode 100644
index 0000000..80858bf
--- /dev/null
+++ b/Modules/_decimal/tests/randdec.py
@@ -0,0 +1,559 @@
+#!/usr/bin/env python
+
+#
+# Copyright (c) 2008-2012 Stefan Krah. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+
+# Generate test cases for deccheck.py.
+
+
+#
+# Grammar from http://speleotrove.com/decimal/daconvs.html
+#
+# sign ::= '+' | '-'
+# digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |
+# '8' | '9'
+# indicator ::= 'e' | 'E'
+# digits ::= digit [digit]...
+# decimal-part ::= digits '.' [digits] | ['.'] digits
+# exponent-part ::= indicator [sign] digits
+# infinity ::= 'Infinity' | 'Inf'
+# nan ::= 'NaN' [digits] | 'sNaN' [digits]
+# numeric-value ::= decimal-part [exponent-part] | infinity
+# numeric-string ::= [sign] numeric-value | [sign] nan
+#
+
+
+from random import randrange, sample
+from fractions import Fraction
+from randfloat import un_randfloat, bin_randfloat, tern_randfloat
+
+
+def sign():
+ if randrange(2):
+ if randrange(2): return '+'
+ return ''
+ return '-'
+
+def indicator():
+ return "eE"[randrange(2)]
+
+def digits(maxprec):
+ if maxprec == 0: return ''
+ return str(randrange(10**maxprec))
+
+def dot():
+ if randrange(2): return '.'
+ return ''
+
+def decimal_part(maxprec):
+ if randrange(100) > 60: # integers
+ return digits(maxprec)
+ if randrange(2):
+ intlen = randrange(1, maxprec+1)
+ fraclen = maxprec-intlen
+ intpart = digits(intlen)
+ fracpart = digits(fraclen)
+ return ''.join((intpart, '.', fracpart))
+ else:
+ return ''.join((dot(), digits(maxprec)))
+
+def expdigits(maxexp):
+ return str(randrange(maxexp))
+
+def exponent_part(maxexp):
+ return ''.join((indicator(), sign(), expdigits(maxexp)))
+
+def infinity():
+ if randrange(2): return 'Infinity'
+ return 'Inf'
+
+def nan():
+ d = ''
+ if randrange(2):
+ d = digits(randrange(99))
+ if randrange(2):
+ return ''.join(('NaN', d))
+ else:
+ return ''.join(('sNaN', d))
+
+def numeric_value(maxprec, maxexp):
+ if randrange(100) > 90:
+ return infinity()
+ exp_part = ''
+ if randrange(100) > 60:
+ exp_part = exponent_part(maxexp)
+ return ''.join((decimal_part(maxprec), exp_part))
+
+def numeric_string(maxprec, maxexp):
+ if randrange(100) > 95:
+ return ''.join((sign(), nan()))
+ else:
+ return ''.join((sign(), numeric_value(maxprec, maxexp)))
+
+def randdec(maxprec, maxexp):
+ return numeric_string(maxprec, maxexp)
+
+def rand_adjexp(maxprec, maxadjexp):
+ d = digits(maxprec)
+ maxexp = maxadjexp-len(d)+1
+ if maxexp == 0: maxexp = 1
+ exp = str(randrange(maxexp-2*(abs(maxexp)), maxexp))
+ return ''.join((sign(), d, 'E', exp))
+
+
+def ndigits(n):
+ if n < 1: return 0
+ return randrange(10**(n-1), 10**n)
+
+def randtuple(maxprec, maxexp):
+ n = randrange(100)
+ sign = randrange(2)
+ coeff = ndigits(maxprec)
+ if n >= 95:
+ coeff = ()
+ exp = 'F'
+ elif n >= 85:
+ coeff = tuple(map(int, str(ndigits(maxprec))))
+ exp = "nN"[randrange(2)]
+ else:
+ coeff = tuple(map(int, str(ndigits(maxprec))))
+ exp = randrange(-maxexp, maxexp)
+ return (sign, coeff, exp)
+
+def from_triple(sign, coeff, exp):
+ return ''.join((str(sign*coeff), indicator(), str(exp)))
+
+
+# Close to 10**n
+def un_close_to_pow10(prec, maxexp, itr=None):
+ if itr is None:
+ lst = range(prec+30)
+ else:
+ lst = sample(range(prec+30), itr)
+ nines = [10**n - 1 for n in lst]
+ pow10 = [10**n for n in lst]
+ for coeff in nines:
+ yield coeff
+ yield -coeff
+ yield from_triple(1, coeff, randrange(2*maxexp))
+ yield from_triple(-1, coeff, randrange(2*maxexp))
+ for coeff in pow10:
+ yield coeff
+ yield -coeff
+
+# Close to 10**n
+def bin_close_to_pow10(prec, maxexp, itr=None):
+ if itr is None:
+ lst = range(prec+30)
+ else:
+ lst = sample(range(prec+30), itr)
+ nines = [10**n - 1 for n in lst]
+ pow10 = [10**n for n in lst]
+ for coeff in nines:
+ yield coeff, 1
+ yield -coeff, -1
+ yield 1, coeff
+ yield -1, -coeff
+ yield from_triple(1, coeff, randrange(2*maxexp)), 1
+ yield from_triple(-1, coeff, randrange(2*maxexp)), -1
+ yield 1, from_triple(1, coeff, -randrange(2*maxexp))
+ yield -1, from_triple(-1, coeff, -randrange(2*maxexp))
+ for coeff in pow10:
+ yield coeff, -1
+ yield -coeff, 1
+ yield 1, -coeff
+ yield -coeff, 1
+
+# Close to 1:
+def close_to_one_greater(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("1.", '0'*randrange(prec),
+ str(randrange(rprec))))
+
+def close_to_one_less(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("0.9", '9'*randrange(prec),
+ str(randrange(rprec))))
+
+# Close to 0:
+def close_to_zero_greater(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("0.", '0'*randrange(prec),
+ str(randrange(rprec))))
+
+def close_to_zero_less(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("-0.", '0'*randrange(prec),
+ str(randrange(rprec))))
+
+# Close to emax:
+def close_to_emax_less(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("9.", '9'*randrange(prec),
+ str(randrange(rprec)), "E", str(emax)))
+
+def close_to_emax_greater(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("1.", '0'*randrange(prec),
+ str(randrange(rprec)), "E", str(emax+1)))
+
+# Close to emin:
+def close_to_emin_greater(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("1.", '0'*randrange(prec),
+ str(randrange(rprec)), "E", str(emin)))
+
+def close_to_emin_less(prec, emax, emin):
+ rprec = 10**prec
+ return ''.join(("9.", '9'*randrange(prec),
+ str(randrange(rprec)), "E", str(emin-1)))
+
+# Close to etiny:
+def close_to_etiny_greater(prec, emax, emin):
+ rprec = 10**prec
+ etiny = emin - (prec - 1)
+ return ''.join(("1.", '0'*randrange(prec),
+ str(randrange(rprec)), "E", str(etiny)))
+
+def close_to_etiny_less(prec, emax, emin):
+ rprec = 10**prec
+ etiny = emin - (prec - 1)
+ return ''.join(("9.", '9'*randrange(prec),
+ str(randrange(rprec)), "E", str(etiny-1)))
+
+
+def close_to_min_etiny_greater(prec, max_prec, min_emin):
+ rprec = 10**prec
+ etiny = min_emin - (max_prec - 1)
+ return ''.join(("1.", '0'*randrange(prec),
+ str(randrange(rprec)), "E", str(etiny)))
+
+def close_to_min_etiny_less(prec, max_prec, min_emin):
+ rprec = 10**prec
+ etiny = min_emin - (max_prec - 1)
+ return ''.join(("9.", '9'*randrange(prec),
+ str(randrange(rprec)), "E", str(etiny-1)))
+
+
+close_funcs = [
+ close_to_one_greater, close_to_one_less, close_to_zero_greater,
+ close_to_zero_less, close_to_emax_less, close_to_emax_greater,
+ close_to_emin_greater, close_to_emin_less, close_to_etiny_greater,
+ close_to_etiny_less, close_to_min_etiny_greater, close_to_min_etiny_less
+]
+
+
+def un_close_numbers(prec, emax, emin, itr=None):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func in close_funcs:
+ yield func(prec, emax, emin)
+
+def bin_close_numbers(prec, emax, emin, itr=None):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func1 in close_funcs:
+ for func2 in close_funcs:
+ yield func1(prec, emax, emin), func2(prec, emax, emin)
+ for func in close_funcs:
+ yield randdec(prec, emax), func(prec, emax, emin)
+ yield func(prec, emax, emin), randdec(prec, emax)
+
+def tern_close_numbers(prec, emax, emin, itr):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func1 in close_funcs:
+ for func2 in close_funcs:
+ for func3 in close_funcs:
+ yield (func1(prec, emax, emin), func2(prec, emax, emin),
+ func3(prec, emax, emin))
+ for func in close_funcs:
+ yield (randdec(prec, emax), func(prec, emax, emin),
+ func(prec, emax, emin))
+ yield (func(prec, emax, emin), randdec(prec, emax),
+ func(prec, emax, emin))
+ yield (func(prec, emax, emin), func(prec, emax, emin),
+ randdec(prec, emax))
+ for func in close_funcs:
+ yield (randdec(prec, emax), randdec(prec, emax),
+ func(prec, emax, emin))
+ yield (randdec(prec, emax), func(prec, emax, emin),
+ randdec(prec, emax))
+ yield (func(prec, emax, emin), randdec(prec, emax),
+ randdec(prec, emax))
+
+
+# If itr == None, test all digit lengths up to prec + 30
+def un_incr_digits(prec, maxexp, itr):
+ if itr is None:
+ lst = range(prec+30)
+ else:
+ lst = sample(range(prec+30), itr)
+ for m in lst:
+ yield from_triple(1, ndigits(m), 0)
+ yield from_triple(-1, ndigits(m), 0)
+ yield from_triple(1, ndigits(m), randrange(maxexp))
+ yield from_triple(-1, ndigits(m), randrange(maxexp))
+
+# If itr == None, test all digit lengths up to prec + 30
+# Also output decimals im tuple form.
+def un_incr_digits_tuple(prec, maxexp, itr):
+ if itr is None:
+ lst = range(prec+30)
+ else:
+ lst = sample(range(prec+30), itr)
+ for m in lst:
+ yield from_triple(1, ndigits(m), 0)
+ yield from_triple(-1, ndigits(m), 0)
+ yield from_triple(1, ndigits(m), randrange(maxexp))
+ yield from_triple(-1, ndigits(m), randrange(maxexp))
+ # test from tuple
+ yield (0, tuple(map(int, str(ndigits(m)))), 0)
+ yield (1, tuple(map(int, str(ndigits(m)))), 0)
+ yield (0, tuple(map(int, str(ndigits(m)))), randrange(maxexp))
+ yield (1, tuple(map(int, str(ndigits(m)))), randrange(maxexp))
+
+# If itr == None, test all combinations of digit lengths up to prec + 30
+def bin_incr_digits(prec, maxexp, itr):
+ if itr is None:
+ lst1 = range(prec+30)
+ lst2 = range(prec+30)
+ else:
+ lst1 = sample(range(prec+30), itr)
+ lst2 = sample(range(prec+30), itr)
+ for m in lst1:
+ x = from_triple(1, ndigits(m), 0)
+ yield x, x
+ x = from_triple(-1, ndigits(m), 0)
+ yield x, x
+ x = from_triple(1, ndigits(m), randrange(maxexp))
+ yield x, x
+ x = from_triple(-1, ndigits(m), randrange(maxexp))
+ yield x, x
+ for m in lst1:
+ for n in lst2:
+ x = from_triple(1, ndigits(m), 0)
+ y = from_triple(1, ndigits(n), 0)
+ yield x, y
+ x = from_triple(-1, ndigits(m), 0)
+ y = from_triple(1, ndigits(n), 0)
+ yield x, y
+ x = from_triple(1, ndigits(m), 0)
+ y = from_triple(-1, ndigits(n), 0)
+ yield x, y
+ x = from_triple(-1, ndigits(m), 0)
+ y = from_triple(-1, ndigits(n), 0)
+ yield x, y
+ x = from_triple(1, ndigits(m), randrange(maxexp))
+ y = from_triple(1, ndigits(n), randrange(maxexp))
+ yield x, y
+ x = from_triple(-1, ndigits(m), randrange(maxexp))
+ y = from_triple(1, ndigits(n), randrange(maxexp))
+ yield x, y
+ x = from_triple(1, ndigits(m), randrange(maxexp))
+ y = from_triple(-1, ndigits(n), randrange(maxexp))
+ yield x, y
+ x = from_triple(-1, ndigits(m), randrange(maxexp))
+ y = from_triple(-1, ndigits(n), randrange(maxexp))
+ yield x, y
+
+
+def randsign():
+ return (1, -1)[randrange(2)]
+
+# If itr == None, test all combinations of digit lengths up to prec + 30
+def tern_incr_digits(prec, maxexp, itr):
+ if itr is None:
+ lst1 = range(prec+30)
+ lst2 = range(prec+30)
+ lst3 = range(prec+30)
+ else:
+ lst1 = sample(range(prec+30), itr)
+ lst2 = sample(range(prec+30), itr)
+ lst3 = sample(range(prec+30), itr)
+ for m in lst1:
+ for n in lst2:
+ for p in lst3:
+ x = from_triple(randsign(), ndigits(m), 0)
+ y = from_triple(randsign(), ndigits(n), 0)
+ z = from_triple(randsign(), ndigits(p), 0)
+ yield x, y, z
+
+
+# Tests for the 'logical' functions
+def bindigits(prec):
+ z = 0
+ for i in range(prec):
+ z += randrange(2) * 10**i
+ return z
+
+def logical_un_incr_digits(prec, itr):
+ if itr is None:
+ lst = range(prec+30)
+ else:
+ lst = sample(range(prec+30), itr)
+ for m in lst:
+ yield from_triple(1, bindigits(m), 0)
+
+def logical_bin_incr_digits(prec, itr):
+ if itr is None:
+ lst1 = range(prec+30)
+ lst2 = range(prec+30)
+ else:
+ lst1 = sample(range(prec+30), itr)
+ lst2 = sample(range(prec+30), itr)
+ for m in lst1:
+ x = from_triple(1, bindigits(m), 0)
+ yield x, x
+ for m in lst1:
+ for n in lst2:
+ x = from_triple(1, bindigits(m), 0)
+ y = from_triple(1, bindigits(n), 0)
+ yield x, y
+
+
+def randint():
+ p = randrange(1, 100)
+ return ndigits(p) * (1,-1)[randrange(2)]
+
+def randfloat():
+ p = randrange(1, 100)
+ s = numeric_value(p, 383)
+ try:
+ f = float(numeric_value(p, 383))
+ except ValueError:
+ f = 0.0
+ return f
+
+def randcomplex():
+ real = randfloat()
+ if randrange(100) > 30:
+ imag = 0.0
+ else:
+ imag = randfloat()
+ return complex(real, imag)
+
+def randfraction():
+ num = randint()
+ denom = randint()
+ if denom == 0:
+ denom = 1
+ return Fraction(num, denom)
+
+number_funcs = [randint, randfloat, randcomplex, randfraction]
+
+def un_random_mixed_op(itr=None):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func in number_funcs:
+ yield func()
+ # Test garbage input
+ for x in (['x'], ('y',), {'z'}, {1:'z'}):
+ yield x
+
+def bin_random_mixed_op(prec, emax, emin, itr=None):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func in number_funcs:
+ yield randdec(prec, emax), func()
+ yield func(), randdec(prec, emax)
+ for number in number_funcs:
+ for dec in close_funcs:
+ yield dec(prec, emax, emin), number()
+ # Test garbage input
+ for x in (['x'], ('y',), {'z'}, {1:'z'}):
+ for y in (['x'], ('y',), {'z'}, {1:'z'}):
+ yield x, y
+
+def tern_random_mixed_op(prec, emax, emin, itr):
+ if itr is None:
+ itr = 1000
+ for _ in range(itr):
+ for func in number_funcs:
+ yield randdec(prec, emax), randdec(prec, emax), func()
+ yield randdec(prec, emax), func(), func()
+ yield func(), func(), func()
+ # Test garbage input
+ for x in (['x'], ('y',), {'z'}, {1:'z'}):
+ for y in (['x'], ('y',), {'z'}, {1:'z'}):
+ for z in (['x'], ('y',), {'z'}, {1:'z'}):
+ yield x, y, z
+
+def all_unary(prec, exp_range, itr):
+ for a in un_close_to_pow10(prec, exp_range, itr):
+ yield (a,)
+ for a in un_close_numbers(prec, exp_range, -exp_range, itr):
+ yield (a,)
+ for a in un_incr_digits_tuple(prec, exp_range, itr):
+ yield (a,)
+ for a in un_randfloat():
+ yield (a,)
+ for a in un_random_mixed_op(itr):
+ yield (a,)
+ for a in logical_un_incr_digits(prec, itr):
+ yield (a,)
+ for _ in range(100):
+ yield (randdec(prec, exp_range),)
+ for _ in range(100):
+ yield (randtuple(prec, exp_range),)
+
+def all_binary(prec, exp_range, itr):
+ for a, b in bin_close_to_pow10(prec, exp_range, itr):
+ yield a, b
+ for a, b in bin_close_numbers(prec, exp_range, -exp_range, itr):
+ yield a, b
+ for a, b in bin_incr_digits(prec, exp_range, itr):
+ yield a, b
+ for a, b in bin_randfloat():
+ yield a, b
+ for a, b in bin_random_mixed_op(prec, exp_range, -exp_range, itr):
+ yield a, b
+ for a, b in logical_bin_incr_digits(prec, itr):
+ yield a, b
+ for _ in range(100):
+ yield randdec(prec, exp_range), randdec(prec, exp_range)
+
+def all_ternary(prec, exp_range, itr):
+ for a, b, c in tern_close_numbers(prec, exp_range, -exp_range, itr):
+ yield a, b, c
+ for a, b, c in tern_incr_digits(prec, exp_range, itr):
+ yield a, b, c
+ for a, b, c in tern_randfloat():
+ yield a, b, c
+ for a, b, c in tern_random_mixed_op(prec, exp_range, -exp_range, itr):
+ yield a, b, c
+ for _ in range(100):
+ a = randdec(prec, 2*exp_range)
+ b = randdec(prec, 2*exp_range)
+ c = randdec(prec, 2*exp_range)
+ yield a, b, c
diff --git a/Modules/_decimal/tests/randfloat.py b/Modules/_decimal/tests/randfloat.py
new file mode 100644
index 0000000..1687303
--- /dev/null
+++ b/Modules/_decimal/tests/randfloat.py
@@ -0,0 +1,250 @@
+# Copyright (c) 2010 Python Software Foundation. All Rights Reserved.
+# Adapted from Python's Lib/test/test_strtod.py (by Mark Dickinson)
+
+# More test cases for deccheck.py.
+
+import random
+
+TEST_SIZE = 2
+
+
+def test_short_halfway_cases():
+ # exact halfway cases with a small number of significant digits
+ for k in 0, 5, 10, 15, 20:
+ # upper = smallest integer >= 2**54/5**k
+ upper = -(-2**54//5**k)
+ # lower = smallest odd number >= 2**53/5**k
+ lower = -(-2**53//5**k)
+ if lower % 2 == 0:
+ lower += 1
+ for i in range(10 * TEST_SIZE):
+ # Select a random odd n in [2**53/5**k,
+ # 2**54/5**k). Then n * 10**k gives a halfway case
+ # with small number of significant digits.
+ n, e = random.randrange(lower, upper, 2), k
+
+ # Remove any additional powers of 5.
+ while n % 5 == 0:
+ n, e = n // 5, e + 1
+ assert n % 10 in (1, 3, 7, 9)
+
+ # Try numbers of the form n * 2**p2 * 10**e, p2 >= 0,
+ # until n * 2**p2 has more than 20 significant digits.
+ digits, exponent = n, e
+ while digits < 10**20:
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+ # Same again, but with extra trailing zeros.
+ s = '{}e{}'.format(digits * 10**40, exponent - 40)
+ yield s
+ digits *= 2
+
+ # Try numbers of the form n * 5**p2 * 10**(e - p5), p5
+ # >= 0, with n * 5**p5 < 10**20.
+ digits, exponent = n, e
+ while digits < 10**20:
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+ # Same again, but with extra trailing zeros.
+ s = '{}e{}'.format(digits * 10**40, exponent - 40)
+ yield s
+ digits *= 5
+ exponent -= 1
+
+def test_halfway_cases():
+ # test halfway cases for the round-half-to-even rule
+ for i in range(1000):
+ for j in range(TEST_SIZE):
+ # bit pattern for a random finite positive (or +0.0) float
+ bits = random.randrange(2047*2**52)
+
+ # convert bit pattern to a number of the form m * 2**e
+ e, m = divmod(bits, 2**52)
+ if e:
+ m, e = m + 2**52, e - 1
+ e -= 1074
+
+ # add 0.5 ulps
+ m, e = 2*m + 1, e - 1
+
+ # convert to a decimal string
+ if e >= 0:
+ digits = m << e
+ exponent = 0
+ else:
+ # m * 2**e = (m * 5**-e) * 10**e
+ digits = m * 5**-e
+ exponent = e
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+
+def test_boundaries():
+ # boundaries expressed as triples (n, e, u), where
+ # n*10**e is an approximation to the boundary value and
+ # u*10**e is 1ulp
+ boundaries = [
+ (10000000000000000000, -19, 1110), # a power of 2 boundary (1.0)
+ (17976931348623159077, 289, 1995), # overflow boundary (2.**1024)
+ (22250738585072013831, -327, 4941), # normal/subnormal (2.**-1022)
+ (0, -327, 4941), # zero
+ ]
+ for n, e, u in boundaries:
+ for j in range(1000):
+ for i in range(TEST_SIZE):
+ digits = n + random.randrange(-3*u, 3*u)
+ exponent = e
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+ n *= 10
+ u *= 10
+ e -= 1
+
+def test_underflow_boundary():
+ # test values close to 2**-1075, the underflow boundary; similar
+ # to boundary_tests, except that the random error doesn't scale
+ # with n
+ for exponent in range(-400, -320):
+ base = 10**-exponent // 2**1075
+ for j in range(TEST_SIZE):
+ digits = base + random.randrange(-1000, 1000)
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+
+def test_bigcomp():
+ for ndigs in 5, 10, 14, 15, 16, 17, 18, 19, 20, 40, 41, 50:
+ dig10 = 10**ndigs
+ for i in range(100 * TEST_SIZE):
+ digits = random.randrange(dig10)
+ exponent = random.randrange(-400, 400)
+ s = '{}e{}'.format(digits, exponent)
+ yield s
+
+def test_parsing():
+ # make '0' more likely to be chosen than other digits
+ digits = '000000123456789'
+ signs = ('+', '-', '')
+
+ # put together random short valid strings
+ # \d*[.\d*]?e
+ for i in range(1000):
+ for j in range(TEST_SIZE):
+ s = random.choice(signs)
+ intpart_len = random.randrange(5)
+ s += ''.join(random.choice(digits) for _ in range(intpart_len))
+ if random.choice([True, False]):
+ s += '.'
+ fracpart_len = random.randrange(5)
+ s += ''.join(random.choice(digits)
+ for _ in range(fracpart_len))
+ else:
+ fracpart_len = 0
+ if random.choice([True, False]):
+ s += random.choice(['e', 'E'])
+ s += random.choice(signs)
+ exponent_len = random.randrange(1, 4)
+ s += ''.join(random.choice(digits)
+ for _ in range(exponent_len))
+
+ if intpart_len + fracpart_len:
+ yield s
+
+test_particular = [
+ # squares
+ '1.00000000100000000025',
+ '1.0000000000000000000000000100000000000000000000000' #...
+ '00025',
+ '1.0000000000000000000000000000000000000000000010000' #...
+ '0000000000000000000000000000000000000000025',
+ '1.0000000000000000000000000000000000000000000000000' #...
+ '000001000000000000000000000000000000000000000000000' #...
+ '000000000025',
+ '0.99999999900000000025',
+ '0.9999999999999999999999999999999999999999999999999' #...
+ '999000000000000000000000000000000000000000000000000' #...
+ '000025',
+ '0.9999999999999999999999999999999999999999999999999' #...
+ '999999999999999999999999999999999999999999999999999' #...
+ '999999999999999999999999999999999999999990000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '0000000000000000000000000000025',
+
+ '1.0000000000000000000000000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '100000000000000000000000000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000001',
+ '1.0000000000000000000000000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '500000000000000000000000000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000005',
+ '1.0000000000000000000000000000000000000000000000000' #...
+ '000000000100000000000000000000000000000000000000000' #...
+ '000000000000000000250000000000000002000000000000000' #...
+ '000000000000000000000000000000000000000000010000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '0000000000000000001',
+ '1.0000000000000000000000000000000000000000000000000' #...
+ '000000000100000000000000000000000000000000000000000' #...
+ '000000000000000000249999999999999999999999999999999' #...
+ '999999999999979999999999999999999999999999999999999' #...
+ '999999999999999999999900000000000000000000000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '00000000000000000000000001',
+
+ '0.9999999999999999999999999999999999999999999999999' #...
+ '999999999900000000000000000000000000000000000000000' #...
+ '000000000000000000249999999999999998000000000000000' #...
+ '000000000000000000000000000000000000000000010000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '0000000000000000001',
+ '0.9999999999999999999999999999999999999999999999999' #...
+ '999999999900000000000000000000000000000000000000000' #...
+ '000000000000000000250000001999999999999999999999999' #...
+ '999999999999999999999999999999999990000000000000000' #...
+ '000000000000000000000000000000000000000000000000000' #...
+ '1',
+
+ # tough cases for ln etc.
+ '1.000000000000000000000000000000000000000000000000' #...
+ '00000000000000000000000000000000000000000000000000' #...
+ '00100000000000000000000000000000000000000000000000' #...
+ '00000000000000000000000000000000000000000000000000' #...
+ '0001',
+ '0.999999999999999999999999999999999999999999999999' #...
+ '99999999999999999999999999999999999999999999999999' #...
+ '99899999999999999999999999999999999999999999999999' #...
+ '99999999999999999999999999999999999999999999999999' #...
+ '99999999999999999999999999999999999999999999999999' #...
+ '9999'
+ ]
+
+
+TESTCASES = [
+ [x for x in test_short_halfway_cases()],
+ [x for x in test_halfway_cases()],
+ [x for x in test_boundaries()],
+ [x for x in test_underflow_boundary()],
+ [x for x in test_bigcomp()],
+ [x for x in test_parsing()],
+ test_particular
+]
+
+def un_randfloat():
+ for i in range(1000):
+ l = random.choice(TESTCASES[:6])
+ yield random.choice(l)
+ for v in test_particular:
+ yield v
+
+def bin_randfloat():
+ for i in range(1000):
+ l1 = random.choice(TESTCASES)
+ l2 = random.choice(TESTCASES)
+ yield random.choice(l1), random.choice(l2)
+
+def tern_randfloat():
+ for i in range(1000):
+ l1 = random.choice(TESTCASES)
+ l2 = random.choice(TESTCASES)
+ l3 = random.choice(TESTCASES)
+ yield random.choice(l1), random.choice(l2), random.choice(l3)
diff --git a/Modules/_decimal/tests/runall-memorydebugger.sh b/Modules/_decimal/tests/runall-memorydebugger.sh
new file mode 100755
index 0000000..44ff3b3
--- /dev/null
+++ b/Modules/_decimal/tests/runall-memorydebugger.sh
@@ -0,0 +1,175 @@
+#!/bin/sh
+
+#
+# Purpose: test with and without threads, all machine configurations, pydebug,
+# refleaks, release build and release build with valgrind.
+#
+# Synopsis: ./runall-memorydebugger.sh [--all-configs64 | --all-configs32]
+#
+# Requirements: valgrind
+#
+
+# Set additional CFLAGS for ./configure
+ADD_CFLAGS=
+
+
+CONFIGS_64="x64 uint128 ansi64 universal"
+CONFIGS_32="ppro ansi32 ansi-legacy universal"
+
+VALGRIND="valgrind --tool=memcheck --leak-resolution=high \
+ --db-attach=yes --suppressions=Misc/valgrind-python.supp"
+
+# Get args
+case $@ in
+ *--all-configs64*)
+ CONFIGS=$CONFIGS_64
+ ;;
+ *--all-configs32*)
+ CONFIGS=$CONFIGS_32
+ ;;
+ *)
+ CONFIGS="auto"
+ ;;
+esac
+
+# gmake required
+GMAKE=`which gmake`
+if [ X"$GMAKE" = X"" ]; then
+ GMAKE=make
+fi
+
+# Pretty print configurations
+print_config ()
+{
+ len=`echo $@ | wc -c`
+ margin="#%"`expr \( 74 - $len \) / 2`"s"
+
+ echo ""
+ echo "# ========================================================================"
+ printf $margin ""
+ echo $@
+ echo "# ========================================================================"
+ echo ""
+}
+
+
+cd ..
+
+# test_decimal: refleak, regular and Valgrind tests
+for args in "--without-threads" ""; do
+ for config in $CONFIGS; do
+
+ unset PYTHON_DECIMAL_WITH_MACHINE
+ libmpdec_config=$config
+ if [ X"$config" != X"auto" ]; then
+ PYTHON_DECIMAL_WITH_MACHINE=$config
+ export PYTHON_DECIMAL_WITH_MACHINE
+ else
+ libmpdec_config=""
+ fi
+
+ ############ refleak tests ###########
+ print_config "refleak tests: config=$config" $args
+ printf "\nbuilding python ...\n\n"
+
+ cd ../../
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" --with-pydebug $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ======================== refleak tests ===========================\n\n"
+ ./python -m test -uall -R 2:2 test_decimal
+
+
+ ############ regular tests ###########
+ print_config "regular tests: config=$config" $args
+ printf "\nbuilding python ...\n\n"
+
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ======================== regular tests ===========================\n\n"
+ ./python -m test -uall test_decimal
+
+
+ ########### valgrind tests ###########
+ valgrind=$VALGRIND
+ case "$config" in
+ # Valgrind has no support for 80 bit long double arithmetic.
+ ppro) valgrind= ;;
+ auto) case `uname -m` in
+ i386|i486|i586|i686) valgrind= ;;
+ esac
+ esac
+
+ print_config "valgrind tests: config=$config" $args
+ printf "\nbuilding python ...\n\n"
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" --without-pymalloc $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ======================== valgrind tests ===========================\n\n"
+ $valgrind ./python -m test -uall test_decimal
+
+ cd Modules/_decimal
+ done
+done
+
+# deccheck
+cd ../../
+for config in $CONFIGS; do
+ for args in "--without-threads" ""; do
+
+ unset PYTHON_DECIMAL_WITH_MACHINE
+ if [ X"$config" != X"auto" ]; then
+ PYTHON_DECIMAL_WITH_MACHINE=$config
+ export PYTHON_DECIMAL_WITH_MACHINE
+ fi
+
+ ############ debug ############
+ print_config "deccheck: config=$config --with-pydebug" $args
+ printf "\nbuilding python ...\n\n"
+
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" --with-pydebug $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ========================== debug ===========================\n\n"
+ ./python Modules/_decimal/tests/deccheck.py
+
+ ########### regular ###########
+ print_config "deccheck: config=$config " $args
+ printf "\nbuilding python ...\n\n"
+
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ======================== regular ===========================\n\n"
+ ./python Modules/_decimal/tests/deccheck.py
+
+ ########### valgrind ###########
+ valgrind=$VALGRIND
+ case "$config" in
+ # Valgrind has no support for 80 bit long double arithmetic.
+ ppro) valgrind= ;;
+ auto) case `uname -m` in
+ i386|i486|i586|i686) valgrind= ;;
+ esac
+ esac
+
+ print_config "valgrind deccheck: config=$config " $args
+ printf "\nbuilding python ...\n\n"
+
+ $GMAKE distclean > /dev/null 2>&1
+ ./configure CFLAGS="$ADD_CFLAGS" --without-pymalloc $args > /dev/null 2>&1
+ $GMAKE | grep _decimal
+
+ printf "\n\n# ======================== valgrind ==========================\n\n"
+ $valgrind ./python Modules/_decimal/tests/deccheck.py
+ done
+done
+
+
+
diff --git a/Modules/_decimal/tests/runall.bat b/Modules/_decimal/tests/runall.bat
new file mode 100755
index 0000000..5bc872a
--- /dev/null
+++ b/Modules/_decimal/tests/runall.bat
@@ -0,0 +1,111 @@
+@ECHO OFF
+
+rem Test all machine configurations, pydebug, refleaks, release build.
+
+cd ..\..\..\
+
+
+echo.
+echo # ======================================================================
+echo # Building Python
+echo # ======================================================================
+echo.
+
+call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x64
+msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64
+msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64
+msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=x64
+msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64
+
+call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86
+msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=Win32
+msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32
+echo.
+echo.
+
+echo.
+echo # ======================================================================
+echo # test_decimal: platform=x64
+echo # ======================================================================
+echo.
+
+cd PCbuild\amd64
+
+echo # ==================== refleak tests =======================
+echo.
+python_d.exe -m test -uall -R 2:2 test_decimal
+echo.
+echo.
+
+echo # ==================== regular tests =======================
+echo.
+python.exe -m test -uall test_decimal
+echo.
+echo.
+
+cd ..
+
+echo.
+echo # ======================================================================
+echo # test_decimal: platform=x86
+echo # ======================================================================
+echo.
+
+echo # ==================== refleak tests =======================
+echo.
+python_d.exe -m test -uall -R 2:2 test_decimal
+echo.
+echo.
+
+echo # ==================== regular tests =======================
+echo.
+python.exe -m test -uall test_decimal
+echo.
+echo.
+
+cd amd64
+
+echo.
+echo # ======================================================================
+echo # deccheck: platform=x64
+echo # ======================================================================
+echo.
+
+echo # ==================== debug build =======================
+echo.
+python_d.exe ..\..\Modules\_decimal\tests\deccheck.py
+echo.
+echo.
+
+echo # =================== release build ======================
+echo.
+python.exe ..\..\Modules\_decimal\tests\deccheck.py
+echo.
+echo.
+
+cd ..
+
+echo.
+echo # ======================================================================
+echo # deccheck: platform=x86
+echo # ======================================================================
+echo.
+echo.
+
+echo # ==================== debug build =======================
+echo.
+python_d.exe ..\Modules\_decimal\tests\deccheck.py
+echo.
+echo.
+
+echo # =================== release build ======================
+echo.
+python.exe ..\Modules\_decimal\tests\deccheck.py
+echo.
+echo.
+
+
+cd ..\Modules\_decimal\tests
+
+
+
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index c36af5d..0c8abcf 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -48,6 +48,7 @@
/* See http://www.python.org/psf/license for licensing details. */
#include "Python.h"
+#include "structmember.h"
#define VERSION "1.0.6"
@@ -57,9 +58,6 @@
/* Leave defined to include the expat-based XMLParser type */
#define USE_EXPAT
-/* Define to do all expat calls via pyexpat's embedded expat library */
-/* #define USE_PYEXPAT_CAPI */
-
/* An element can hold this many children without extra memory
allocations. */
#define STATIC_CHILDREN 4
@@ -70,7 +68,7 @@
helps if you have lots of leaf nodes with attributes). */
/* Also note that pymalloc always allocates blocks in multiples of
- eight bytes. For the current version of cElementTree, this means
+ eight bytes. For the current C version of ElementTree, this means
that the number of children should be an even number, at least on
32-bit platforms. */
@@ -94,39 +92,17 @@ do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0)
#define LOCAL(type) static type
#endif
-/* compatibility macros */
-#if (PY_VERSION_HEX < 0x02060000)
-#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
-#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
-#endif
-
-#if (PY_VERSION_HEX < 0x02050000)
-typedef int Py_ssize_t;
-#define lenfunc inquiry
-#endif
-
-#if (PY_VERSION_HEX < 0x02040000)
-#define PyDict_CheckExact PyDict_Check
-
-#if !defined(Py_RETURN_NONE)
-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
-#endif
-#endif
-
/* macros used to store 'join' flags in string object pointers. note
that all use of text and tail as object pointers must be wrapped in
JOIN_OBJ. see comments in the ElementObject definition for more
info. */
#define JOIN_GET(p) ((Py_uintptr_t) (p) & 1)
#define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag)))
-#define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1))
+#define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~(Py_uintptr_t)1))
/* glue functions (see the init function for details) */
static PyObject* elementtree_parseerror_obj;
-static PyObject* elementtree_copyelement_obj;
static PyObject* elementtree_deepcopy_obj;
-static PyObject* elementtree_iter_obj;
-static PyObject* elementtree_itertext_obj;
static PyObject* elementpath_obj;
/* helpers */
@@ -147,17 +123,11 @@ deepcopy(PyObject* object, PyObject* memo)
return NULL;
}
- args = PyTuple_New(2);
+ args = PyTuple_Pack(2, object, memo);
if (!args)
return NULL;
-
- Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object);
- Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo);
-
result = PyObject_CallObject(elementtree_deepcopy_obj, args);
-
Py_DECREF(args);
-
return result;
}
@@ -165,53 +135,30 @@ LOCAL(PyObject*)
list_join(PyObject* list)
{
/* join list elements (destroying the list in the process) */
-
PyObject* joiner;
- PyObject* function;
- PyObject* args;
PyObject* result;
- switch (PyList_GET_SIZE(list)) {
- case 0:
- Py_DECREF(list);
- return PyBytes_FromString("");
- case 1:
- result = PyList_GET_ITEM(list, 0);
- Py_INCREF(result);
- Py_DECREF(list);
- return result;
- }
-
- /* two or more elements: slice out a suitable separator from the
- first member, and use that to join the entire list */
-
- joiner = PySequence_GetSlice(PyList_GET_ITEM(list, 0), 0, 0);
+ joiner = PyUnicode_FromStringAndSize("", 0);
if (!joiner)
return NULL;
-
- function = PyObject_GetAttrString(joiner, "join");
- if (!function) {
- Py_DECREF(joiner);
- return NULL;
- }
-
- args = PyTuple_New(1);
- if (!args)
- return NULL;
-
- PyTuple_SET_ITEM(args, 0, list);
-
- result = PyObject_CallObject(function, args);
-
- Py_DECREF(args); /* also removes list */
- Py_DECREF(function);
+ result = PyUnicode_Join(joiner, list);
Py_DECREF(joiner);
-
+ if (result)
+ Py_DECREF(list);
return result;
}
+/* Is the given object an empty dictionary?
+*/
+static int
+is_empty_dict(PyObject *obj)
+{
+ return PyDict_CheckExact(obj) && PyDict_Size(obj) == 0;
+}
+
+
/* -------------------------------------------------------------------- */
-/* the element type */
+/* the Element type */
typedef struct {
@@ -226,7 +173,7 @@ typedef struct {
PyObject* *children;
PyObject* _children[STATIC_CHILDREN];
-
+
} ElementObjectExtra;
typedef struct {
@@ -249,6 +196,8 @@ typedef struct {
ElementObjectExtra* extra;
+ PyObject *weakreflist; /* For tp_weaklistoffset */
+
} ElementObject;
static PyTypeObject Element_Type;
@@ -256,10 +205,10 @@ static PyTypeObject Element_Type;
#define Element_CheckExact(op) (Py_TYPE(op) == &Element_Type)
/* -------------------------------------------------------------------- */
-/* element constructor and destructor */
+/* Element constructors and destructor */
LOCAL(int)
-element_new_extra(ElementObject* self, PyObject* attrib)
+create_extra(ElementObject* self, PyObject* attrib)
{
self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));
if (!self->extra)
@@ -279,47 +228,48 @@ element_new_extra(ElementObject* self, PyObject* attrib)
}
LOCAL(void)
-element_dealloc_extra(ElementObject* self)
+dealloc_extra(ElementObject* self)
{
+ ElementObjectExtra *myextra;
int i;
- Py_DECREF(self->extra->attrib);
+ if (!self->extra)
+ return;
- for (i = 0; i < self->extra->length; i++)
- Py_DECREF(self->extra->children[i]);
+ /* Avoid DECREFs calling into this code again (cycles, etc.)
+ */
+ myextra = self->extra;
+ self->extra = NULL;
+
+ Py_DECREF(myextra->attrib);
- if (self->extra->children != self->extra->_children)
- PyObject_Free(self->extra->children);
+ for (i = 0; i < myextra->length; i++)
+ Py_DECREF(myextra->children[i]);
- PyObject_Free(self->extra);
+ if (myextra->children != myextra->_children)
+ PyObject_Free(myextra->children);
+
+ PyObject_Free(myextra);
}
+/* Convenience internal function to create new Element objects with the given
+ * tag and attributes.
+*/
LOCAL(PyObject*)
-element_new(PyObject* tag, PyObject* attrib)
+create_new_element(PyObject* tag, PyObject* attrib)
{
ElementObject* self;
- self = PyObject_New(ElementObject, &Element_Type);
+ self = PyObject_GC_New(ElementObject, &Element_Type);
if (self == NULL)
return NULL;
-
- /* use None for empty dictionaries */
- if (PyDict_CheckExact(attrib) && !PyDict_Size(attrib))
- attrib = Py_None;
-
self->extra = NULL;
- if (attrib != Py_None) {
-
- if (element_new_extra(self, attrib) < 0) {
+ if (attrib != Py_None && !is_empty_dict(attrib)) {
+ if (create_extra(self, attrib) < 0) {
PyObject_Del(self);
return NULL;
}
-
- self->extra->length = 0;
- self->extra->allocated = STATIC_CHILDREN;
- self->extra->children = self->extra->_children;
-
}
Py_INCREF(tag);
@@ -331,11 +281,128 @@ element_new(PyObject* tag, PyObject* attrib)
Py_INCREF(Py_None);
self->tail = Py_None;
- ALLOC(sizeof(ElementObject), "create element");
+ self->weakreflist = NULL;
+ ALLOC(sizeof(ElementObject), "create element");
+ PyObject_GC_Track(self);
return (PyObject*) self;
}
+static PyObject *
+element_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ ElementObject *e = (ElementObject *)type->tp_alloc(type, 0);
+ if (e != NULL) {
+ Py_INCREF(Py_None);
+ e->tag = Py_None;
+
+ Py_INCREF(Py_None);
+ e->text = Py_None;
+
+ Py_INCREF(Py_None);
+ e->tail = Py_None;
+
+ e->extra = NULL;
+ e->weakreflist = NULL;
+ }
+ return (PyObject *)e;
+}
+
+/* Helper function for extracting the attrib dictionary from a keywords dict.
+ * This is required by some constructors/functions in this module that can
+ * either accept attrib as a keyword argument or all attributes splashed
+ * directly into *kwds.
+ * If there is no 'attrib' keyword, return an empty dict.
+ */
+static PyObject*
+get_attrib_from_keywords(PyObject *kwds)
+{
+ PyObject *attrib_str = PyUnicode_FromString("attrib");
+ PyObject *attrib = PyDict_GetItem(kwds, attrib_str);
+
+ if (attrib) {
+ /* If attrib was found in kwds, copy its value and remove it from
+ * kwds
+ */
+ if (!PyDict_Check(attrib)) {
+ Py_DECREF(attrib_str);
+ PyErr_Format(PyExc_TypeError, "attrib must be dict, not %.100s",
+ Py_TYPE(attrib)->tp_name);
+ return NULL;
+ }
+ attrib = PyDict_Copy(attrib);
+ PyDict_DelItem(kwds, attrib_str);
+ } else {
+ attrib = PyDict_New();
+ }
+
+ Py_DECREF(attrib_str);
+
+ if (attrib)
+ PyDict_Update(attrib, kwds);
+ return attrib;
+}
+
+static int
+element_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *tag;
+ PyObject *tmp;
+ PyObject *attrib = NULL;
+ ElementObject *self_elem;
+
+ if (!PyArg_ParseTuple(args, "O|O!:Element", &tag, &PyDict_Type, &attrib))
+ return -1;
+
+ if (attrib) {
+ /* attrib passed as positional arg */
+ attrib = PyDict_Copy(attrib);
+ if (!attrib)
+ return -1;
+ if (kwds) {
+ if (PyDict_Update(attrib, kwds) < 0) {
+ Py_DECREF(attrib);
+ return -1;
+ }
+ }
+ } else if (kwds) {
+ /* have keywords args */
+ attrib = get_attrib_from_keywords(kwds);
+ if (!attrib)
+ return -1;
+ }
+
+ self_elem = (ElementObject *)self;
+
+ if (attrib != NULL && !is_empty_dict(attrib)) {
+ if (create_extra(self_elem, attrib) < 0) {
+ Py_DECREF(attrib);
+ return -1;
+ }
+ }
+
+ /* We own a reference to attrib here and it's no longer needed. */
+ Py_XDECREF(attrib);
+
+ /* Replace the objects already pointed to by tag, text and tail. */
+ tmp = self_elem->tag;
+ Py_INCREF(tag);
+ self_elem->tag = tag;
+ Py_DECREF(tmp);
+
+ tmp = self_elem->text;
+ Py_INCREF(Py_None);
+ self_elem->text = Py_None;
+ Py_DECREF(JOIN_OBJ(tmp));
+
+ tmp = self_elem->tail;
+ Py_INCREF(Py_None);
+ self_elem->tail = Py_None;
+ Py_DECREF(JOIN_OBJ(tmp));
+
+ return 0;
+}
+
LOCAL(int)
element_resize(ElementObject* self, int extra)
{
@@ -346,7 +413,7 @@ element_resize(ElementObject* self, int extra)
elements. set an exception and return -1 if allocation failed */
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
size = self->extra->length + extra;
@@ -354,14 +421,14 @@ element_resize(ElementObject* self, int extra)
/* use Python 2.4's list growth strategy */
size = (size >> 3) + (size < 9 ? 3 : 6) + size;
/* Coverity CID #182 size_error: Allocating 1 bytes to pointer "children"
- * which needs at least 4 bytes.
- * Although it's a false alarm always assume at least one child to
+ * which needs at least 4 bytes.
+ * Although it's a false alarm always assume at least one child to
* be safe.
*/
size = size ? size : 1;
if (self->extra->children != self->extra->_children) {
/* Coverity CID #182 size_error: Allocating 1 bytes to pointer
- * "children", which needs at least 4 bytes. Although it's a
+ * "children", which needs at least 4 bytes. Although it's a
* false alarm always assume at least one child to be safe.
*/
children = PyObject_Realloc(self->extra->children,
@@ -412,11 +479,11 @@ element_get_attrib(ElementObject* self)
PyObject* res = self->extra->attrib;
if (res == Py_None) {
- Py_DECREF(res);
/* create missing dictionary */
res = PyDict_New();
if (!res)
return NULL;
+ Py_DECREF(Py_None);
self->extra->attrib = res;
}
@@ -464,84 +531,110 @@ element_get_tail(ElementObject* self)
}
static PyObject*
-element(PyObject* self, PyObject* args, PyObject* kw)
+subelement(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject* elem;
+ ElementObject* parent;
PyObject* tag;
PyObject* attrib = NULL;
- if (!PyArg_ParseTuple(args, "O|O!:Element", &tag,
+ if (!PyArg_ParseTuple(args, "O!O|O!:SubElement",
+ &Element_Type, &parent, &tag,
&PyDict_Type, &attrib))
return NULL;
- if (attrib || kw) {
- attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New();
+ if (attrib) {
+ /* attrib passed as positional arg */
+ attrib = PyDict_Copy(attrib);
+ if (!attrib)
+ return NULL;
+ if (kwds) {
+ if (PyDict_Update(attrib, kwds) < 0) {
+ return NULL;
+ }
+ }
+ } else if (kwds) {
+ /* have keyword args */
+ attrib = get_attrib_from_keywords(kwds);
if (!attrib)
return NULL;
- if (kw)
- PyDict_Update(attrib, kw);
} else {
+ /* no attrib arg, no kwds, so no attribute */
Py_INCREF(Py_None);
attrib = Py_None;
}
- elem = element_new(tag, attrib);
+ elem = create_new_element(tag, attrib);
Py_DECREF(attrib);
+ if (element_add_subelement(parent, elem) < 0) {
+ Py_DECREF(elem);
+ return NULL;
+ }
+
return elem;
}
-static PyObject*
-subelement(PyObject* self, PyObject* args, PyObject* kw)
+static int
+element_gc_traverse(ElementObject *self, visitproc visit, void *arg)
{
- PyObject* elem;
+ Py_VISIT(self->tag);
+ Py_VISIT(JOIN_OBJ(self->text));
+ Py_VISIT(JOIN_OBJ(self->tail));
- ElementObject* parent;
- PyObject* tag;
- PyObject* attrib = NULL;
- if (!PyArg_ParseTuple(args, "O!O|O!:SubElement",
- &Element_Type, &parent, &tag,
- &PyDict_Type, &attrib))
- return NULL;
+ if (self->extra) {
+ int i;
+ Py_VISIT(self->extra->attrib);
- if (attrib || kw) {
- attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New();
- if (!attrib)
- return NULL;
- if (kw)
- PyDict_Update(attrib, kw);
- } else {
- Py_INCREF(Py_None);
- attrib = Py_None;
+ for (i = 0; i < self->extra->length; ++i)
+ Py_VISIT(self->extra->children[i]);
}
+ return 0;
+}
- elem = element_new(tag, attrib);
+static int
+element_gc_clear(ElementObject *self)
+{
+ Py_CLEAR(self->tag);
- Py_DECREF(attrib);
+ /* The following is like Py_CLEAR for self->text and self->tail, but
+ * written explicitily because the real pointers hide behind access
+ * macros.
+ */
+ if (self->text) {
+ PyObject *tmp = JOIN_OBJ(self->text);
+ self->text = NULL;
+ Py_DECREF(tmp);
+ }
- if (element_add_subelement(parent, elem) < 0) {
- Py_DECREF(elem);
- return NULL;
+ if (self->tail) {
+ PyObject *tmp = JOIN_OBJ(self->tail);
+ self->tail = NULL;
+ Py_DECREF(tmp);
}
- return elem;
+ /* After dropping all references from extra, it's no longer valid anyway,
+ * so fully deallocate it.
+ */
+ dealloc_extra(self);
+ return 0;
}
static void
element_dealloc(ElementObject* self)
{
- if (self->extra)
- element_dealloc_extra(self);
+ PyObject_GC_UnTrack(self);
- /* discard attributes */
- Py_DECREF(self->tag);
- Py_DECREF(JOIN_OBJ(self->text));
- Py_DECREF(JOIN_OBJ(self->tail));
+ if (self->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) self);
- RELEASE(sizeof(ElementObject), "destroy element");
+ /* element_gc_clear clears all references and deallocates extra
+ */
+ element_gc_clear(self);
- PyObject_Del(self);
+ RELEASE(sizeof(ElementObject), "destroy element");
+ Py_TYPE(self)->tp_free((PyObject *)self);
}
/* -------------------------------------------------------------------- */
@@ -561,15 +654,12 @@ element_append(ElementObject* self, PyObject* args)
}
static PyObject*
-element_clear(ElementObject* self, PyObject* args)
+element_clearmethod(ElementObject* self, PyObject* args)
{
if (!PyArg_ParseTuple(args, ":clear"))
return NULL;
- if (self->extra) {
- element_dealloc_extra(self);
- self->extra = NULL;
- }
+ dealloc_extra(self);
Py_INCREF(Py_None);
Py_DECREF(JOIN_OBJ(self->text));
@@ -591,7 +681,7 @@ element_copy(ElementObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, ":__copy__"))
return NULL;
- element = (ElementObject*) element_new(
+ element = (ElementObject*) create_new_element(
self->tag, (self->extra) ? self->extra->attrib : Py_None
);
if (!element)
@@ -606,7 +696,7 @@ element_copy(ElementObject* self, PyObject* args)
Py_INCREF(JOIN_OBJ(element->tail));
if (self->extra) {
-
+
if (element_resize(element, self->extra->length) < 0) {
Py_DECREF(element);
return NULL;
@@ -618,7 +708,7 @@ element_copy(ElementObject* self, PyObject* args)
}
element->extra->length = self->extra->length;
-
+
}
return (PyObject*) element;
@@ -654,14 +744,14 @@ element_deepcopy(ElementObject* self, PyObject* args)
attrib = Py_None;
}
- element = (ElementObject*) element_new(tag, attrib);
+ element = (ElementObject*) create_new_element(tag, attrib);
Py_DECREF(tag);
Py_DECREF(attrib);
if (!element)
return NULL;
-
+
text = deepcopy(JOIN_OBJ(self->text), memo);
if (!text)
goto error;
@@ -675,7 +765,7 @@ element_deepcopy(ElementObject* self, PyObject* args)
element->tail = JOIN_SET(tail, JOIN_GET(self->tail));
if (self->extra) {
-
+
if (element_resize(element, self->extra->length) < 0)
goto error;
@@ -689,11 +779,11 @@ element_deepcopy(ElementObject* self, PyObject* args)
}
element->extra->length = self->extra->length;
-
+
}
/* add object to memo dictionary (so deepcopy won't visit it again) */
- id = PyLong_FromLong((Py_uintptr_t) self);
+ id = PyLong_FromSsize_t((Py_uintptr_t) self);
if (!id)
goto error;
@@ -711,6 +801,19 @@ element_deepcopy(ElementObject* self, PyObject* args)
return NULL;
}
+static PyObject*
+element_sizeof(PyObject* _self, PyObject* args)
+{
+ ElementObject *self = (ElementObject*)_self;
+ Py_ssize_t result = sizeof(ElementObject);
+ if (self->extra) {
+ result += sizeof(ElementObjectExtra);
+ if (self->extra->children != self->extra->_children)
+ result += sizeof(PyObject*) * self->extra->allocated;
+ }
+ return PyLong_FromSsize_t(result);
+}
+
LOCAL(int)
checkpath(PyObject* tag)
{
@@ -723,13 +826,16 @@ checkpath(PyObject* tag)
(ch == '/' || ch == '*' || ch == '[' || ch == '@' || ch == '.')
if (PyUnicode_Check(tag)) {
- Py_UNICODE *p = PyUnicode_AS_UNICODE(tag);
- for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) {
- if (p[i] == '{')
+ const Py_ssize_t len = PyUnicode_GET_LENGTH(tag);
+ void *data = PyUnicode_DATA(tag);
+ unsigned int kind = PyUnicode_KIND(tag);
+ for (i = 0; i < len; i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch == '{')
check = 0;
- else if (p[i] == '}')
+ else if (ch == '}')
check = 1;
- else if (check && PATHCHAR(p[i]))
+ else if (check && PATHCHAR(ch))
return 1;
}
return 0;
@@ -772,6 +878,15 @@ element_extend(ElementObject* self, PyObject* args)
seqlen = PySequence_Size(seq);
for (i = 0; i < seqlen; i++) {
PyObject* element = PySequence_Fast_GET_ITEM(seq, i);
+ if (!PyObject_IsInstance(element, (PyObject *)&Element_Type)) {
+ Py_DECREF(seq);
+ PyErr_Format(
+ PyExc_TypeError,
+ "expected an Element, not \"%.200s\"",
+ Py_TYPE(element)->tp_name);
+ return NULL;
+ }
+
if (element_add_subelement(self, element) < 0) {
Py_DECREF(seq);
return NULL;
@@ -784,23 +899,27 @@ element_extend(ElementObject* self, PyObject* args)
}
static PyObject*
-element_find(ElementObject* self, PyObject* args)
+element_find(ElementObject *self, PyObject *args, PyObject *kwds)
{
int i;
-
PyObject* tag;
PyObject* namespaces = Py_None;
- if (!PyArg_ParseTuple(args, "O|O:find", &tag, &namespaces))
+ static char *kwlist[] = {"path", "namespaces", 0};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:find", kwlist,
+ &tag, &namespaces))
return NULL;
- if (checkpath(tag) || namespaces != Py_None)
- return PyObject_CallMethod(
- elementpath_obj, "find", "OOO", self, tag, namespaces
+ if (checkpath(tag) || namespaces != Py_None) {
+ _Py_IDENTIFIER(find);
+ return _PyObject_CallMethodId(
+ elementpath_obj, &PyId_find, "OOO", self, tag, namespaces
);
+ }
if (!self->extra)
Py_RETURN_NONE;
-
+
for (i = 0; i < self->extra->length; i++) {
PyObject* item = self->extra->children[i];
if (Element_CheckExact(item) &&
@@ -814,19 +933,22 @@ element_find(ElementObject* self, PyObject* args)
}
static PyObject*
-element_findtext(ElementObject* self, PyObject* args)
+element_findtext(ElementObject *self, PyObject *args, PyObject *kwds)
{
int i;
-
PyObject* tag;
PyObject* default_value = Py_None;
PyObject* namespaces = Py_None;
- if (!PyArg_ParseTuple(args, "O|OO:findtext", &tag, &default_value, &namespaces))
+ _Py_IDENTIFIER(findtext);
+ static char *kwlist[] = {"path", "default", "namespaces", 0};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:findtext", kwlist,
+ &tag, &default_value, &namespaces))
return NULL;
if (checkpath(tag) || namespaces != Py_None)
- return PyObject_CallMethod(
- elementpath_obj, "findtext", "OOOO", self, tag, default_value, namespaces
+ return _PyObject_CallMethodId(
+ elementpath_obj, &PyId_findtext, "OOOO", self, tag, default_value, namespaces
);
if (!self->extra) {
@@ -851,20 +973,24 @@ element_findtext(ElementObject* self, PyObject* args)
}
static PyObject*
-element_findall(ElementObject* self, PyObject* args)
+element_findall(ElementObject *self, PyObject *args, PyObject *kwds)
{
int i;
PyObject* out;
-
PyObject* tag;
PyObject* namespaces = Py_None;
- if (!PyArg_ParseTuple(args, "O|O:findall", &tag, &namespaces))
+ static char *kwlist[] = {"path", "namespaces", 0};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:findall", kwlist,
+ &tag, &namespaces))
return NULL;
- if (checkpath(tag) || namespaces != Py_None)
- return PyObject_CallMethod(
- elementpath_obj, "findall", "OOO", self, tag, namespaces
+ if (checkpath(tag) || namespaces != Py_None) {
+ _Py_IDENTIFIER(findall);
+ return _PyObject_CallMethodId(
+ elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces
);
+ }
out = PyList_New(0);
if (!out)
@@ -888,15 +1014,19 @@ element_findall(ElementObject* self, PyObject* args)
}
static PyObject*
-element_iterfind(ElementObject* self, PyObject* args)
+element_iterfind(ElementObject *self, PyObject *args, PyObject *kwds)
{
PyObject* tag;
PyObject* namespaces = Py_None;
- if (!PyArg_ParseTuple(args, "O|O:iterfind", &tag, &namespaces))
+ _Py_IDENTIFIER(iterfind);
+ static char *kwlist[] = {"path", "namespaces", 0};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:iterfind", kwlist,
+ &tag, &namespaces))
return NULL;
- return PyObject_CallMethod(
- elementpath_obj, "iterfind", "OOO", self, tag, namespaces
+ return _PyObject_CallMethodId(
+ elementpath_obj, &PyId_iterfind, "OOO", self, tag, namespaces
);
}
@@ -949,67 +1079,32 @@ element_getchildren(ElementObject* self, PyObject* args)
return list;
}
-static PyObject*
-element_iter(ElementObject* self, PyObject* args)
+
+static PyObject *
+create_elementiter(ElementObject *self, PyObject *tag, int gettext);
+
+
+static PyObject *
+element_iter(ElementObject *self, PyObject *args)
{
- PyObject* result;
-
PyObject* tag = Py_None;
if (!PyArg_ParseTuple(args, "|O:iter", &tag))
return NULL;
- if (!elementtree_iter_obj) {
- PyErr_SetString(
- PyExc_RuntimeError,
- "iter helper not found"
- );
- return NULL;
- }
-
- args = PyTuple_New(2);
- if (!args)
- return NULL;
-
- Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self);
- Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag);
-
- result = PyObject_CallObject(elementtree_iter_obj, args);
-
- Py_DECREF(args);
-
- return result;
+ return create_elementiter(self, tag, 0);
}
static PyObject*
element_itertext(ElementObject* self, PyObject* args)
{
- PyObject* result;
-
if (!PyArg_ParseTuple(args, ":itertext"))
return NULL;
- if (!elementtree_itertext_obj) {
- PyErr_SetString(
- PyExc_RuntimeError,
- "itertext helper not found"
- );
- return NULL;
- }
-
- args = PyTuple_New(1);
- if (!args)
- return NULL;
-
- Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self);
-
- result = PyObject_CallObject(elementtree_itertext_obj, args);
-
- Py_DECREF(args);
-
- return result;
+ return create_elementiter(self, Py_None, 1);
}
+
static PyObject*
element_getitem(PyObject* self_, Py_ssize_t index)
{
@@ -1039,7 +1134,7 @@ element_insert(ElementObject* self, PyObject* args)
return NULL;
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
if (index < 0) {
index += self->extra->length;
@@ -1110,7 +1205,7 @@ element_makeelement(PyObject* self, PyObject* args, PyObject* kw)
if (!attrib)
return NULL;
- elem = element_new(tag, attrib);
+ elem = create_new_element(tag, attrib);
Py_DECREF(attrib);
@@ -1118,31 +1213,6 @@ element_makeelement(PyObject* self, PyObject* args, PyObject* kw)
}
static PyObject*
-element_reduce(ElementObject* self, PyObject* args)
-{
- if (!PyArg_ParseTuple(args, ":__reduce__"))
- return NULL;
-
- /* Hack alert: This method is used to work around a __copy__
- problem on certain 2.3 and 2.4 versions. To save time and
- simplify the code, we create the copy in here, and use a dummy
- copyelement helper to trick the copy module into doing the
- right thing. */
-
- if (!elementtree_copyelement_obj) {
- PyErr_SetString(
- PyExc_RuntimeError,
- "copyelement helper not found"
- );
- return NULL;
- }
-
- return Py_BuildValue(
- "O(N)", elementtree_copyelement_obj, element_copy(self, args)
- );
-}
-
-static PyObject*
element_remove(ElementObject* self, PyObject* args)
{
int i;
@@ -1189,7 +1259,10 @@ element_remove(ElementObject* self, PyObject* args)
static PyObject*
element_repr(ElementObject* self)
{
- return PyUnicode_FromFormat("<Element %R at %p>", self->tag, self);
+ if (self->tag)
+ return PyUnicode_FromFormat("<Element %R at %p>", self->tag, self);
+ else
+ return PyUnicode_FromFormat("<Element at %p>", self);
}
static PyObject*
@@ -1203,7 +1276,7 @@ element_set(ElementObject* self, PyObject* args)
return NULL;
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
attrib = element_get_attrib(self);
if (!attrib)
@@ -1250,13 +1323,8 @@ element_subscr(PyObject* self_, PyObject* item)
{
ElementObject* self = (ElementObject*) self_;
-#if (PY_VERSION_HEX < 0x02050000)
- if (PyInt_Check(item) || PyLong_Check(item)) {
- long i = PyInt_AsLong(item);
-#else
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
-#endif
if (i == -1 && PyErr_Occurred()) {
return NULL;
@@ -1307,13 +1375,8 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
{
ElementObject* self = (ElementObject*) self_;
-#if (PY_VERSION_HEX < 0x02050000)
- if (PyInt_Check(item) || PyLong_Check(item)) {
- long i = PyInt_AsLong(item);
-#else
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
-#endif
if (i == -1 && PyErr_Occurred()) {
return -1;
@@ -1329,7 +1392,7 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
PyObject* seq = NULL;
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
if (PySlice_GetIndicesEx(item,
self->extra->length,
@@ -1337,9 +1400,74 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
return -1;
}
- if (value == NULL)
- newlen = 0;
+ if (value == NULL) {
+ /* Delete slice */
+ size_t cur;
+ Py_ssize_t i;
+
+ if (slicelen <= 0)
+ return 0;
+
+ /* Since we're deleting, the direction of the range doesn't matter,
+ * so for simplicity make it always ascending.
+ */
+ if (step < 0) {
+ stop = start + 1;
+ start = stop + step * (slicelen - 1) - 1;
+ step = -step;
+ }
+
+ assert((size_t)slicelen <= PY_SIZE_MAX / sizeof(PyObject *));
+
+ /* recycle is a list that will contain all the children
+ * scheduled for removal.
+ */
+ if (!(recycle = PyList_New(slicelen))) {
+ PyErr_NoMemory();
+ return -1;
+ }
+
+ /* This loop walks over all the children that have to be deleted,
+ * with cur pointing at them. num_moved is the amount of children
+ * until the next deleted child that have to be "shifted down" to
+ * occupy the deleted's places.
+ * Note that in the ith iteration, shifting is done i+i places down
+ * because i children were already removed.
+ */
+ for (cur = start, i = 0; cur < (size_t)stop; cur += step, ++i) {
+ /* Compute how many children have to be moved, clipping at the
+ * list end.
+ */
+ Py_ssize_t num_moved = step - 1;
+ if (cur + step >= (size_t)self->extra->length) {
+ num_moved = self->extra->length - cur - 1;
+ }
+
+ PyList_SET_ITEM(recycle, i, self->extra->children[cur]);
+
+ memmove(
+ self->extra->children + cur - i,
+ self->extra->children + cur + 1,
+ num_moved * sizeof(PyObject *));
+ }
+
+ /* Leftover "tail" after the last removed child */
+ cur = start + (size_t)slicelen * step;
+ if (cur < (size_t)self->extra->length) {
+ memmove(
+ self->extra->children + cur - slicelen,
+ self->extra->children + cur,
+ (self->extra->length - cur) * sizeof(PyObject *));
+ }
+
+ self->extra->length -= slicelen;
+
+ /* Discard the recycle list with all the deleted sub-elements */
+ Py_XDECREF(recycle);
+ return 0;
+ }
else {
+ /* A new slice is actually being assigned */
seq = PySequence_Fast(value, "");
if (!seq) {
PyErr_Format(
@@ -1354,19 +1482,13 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
if (step != 1 && newlen != slicelen)
{
PyErr_Format(PyExc_ValueError,
-#if (PY_VERSION_HEX < 0x02050000)
- "attempt to assign sequence of size %d "
- "to extended slice of size %d",
-#else
"attempt to assign sequence of size %zd "
"to extended slice of size %zd",
-#endif
newlen, slicelen
);
return -1;
}
-
/* Resize before creating the recycle bin, to prevent refleaks. */
if (newlen > slicelen) {
if (element_resize(self, newlen - slicelen) < 0) {
@@ -1431,14 +1553,14 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value)
static PyMethodDef element_methods[] = {
- {"clear", (PyCFunction) element_clear, METH_VARARGS},
+ {"clear", (PyCFunction) element_clearmethod, METH_VARARGS},
{"get", (PyCFunction) element_get, METH_VARARGS},
{"set", (PyCFunction) element_set, METH_VARARGS},
- {"find", (PyCFunction) element_find, METH_VARARGS},
- {"findtext", (PyCFunction) element_findtext, METH_VARARGS},
- {"findall", (PyCFunction) element_findall, METH_VARARGS},
+ {"find", (PyCFunction) element_find, METH_VARARGS | METH_KEYWORDS},
+ {"findtext", (PyCFunction) element_findtext, METH_VARARGS | METH_KEYWORDS},
+ {"findall", (PyCFunction) element_findall, METH_VARARGS | METH_KEYWORDS},
{"append", (PyCFunction) element_append, METH_VARARGS},
{"extend", (PyCFunction) element_extend, METH_VARARGS},
@@ -1447,7 +1569,7 @@ static PyMethodDef element_methods[] = {
{"iter", (PyCFunction) element_iter, METH_VARARGS},
{"itertext", (PyCFunction) element_itertext, METH_VARARGS},
- {"iterfind", (PyCFunction) element_iterfind, METH_VARARGS},
+ {"iterfind", (PyCFunction) element_iterfind, METH_VARARGS | METH_KEYWORDS},
{"getiterator", (PyCFunction) element_iter, METH_VARARGS},
{"getchildren", (PyCFunction) element_getchildren, METH_VARARGS},
@@ -1459,18 +1581,7 @@ static PyMethodDef element_methods[] = {
{"__copy__", (PyCFunction) element_copy, METH_VARARGS},
{"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS},
-
- /* Some 2.3 and 2.4 versions do not handle the __copy__ method on
- C objects correctly, so we have to fake it using a __reduce__-
- based hack (see the element_reduce implementation above for
- details). */
-
- /* The behaviour has been changed in 2.3.5 and 2.4.1, so we're
- using a runtime test to figure out if we need to fake things
- or now (see the init code below). The following entry is
- enabled only if the hack is needed. */
-
- {"!__reduce__", (PyCFunction) element_reduce, METH_VARARGS},
+ {"__sizeof__", element_sizeof, METH_NOARGS},
{NULL, NULL}
};
@@ -1483,7 +1594,7 @@ element_getattro(ElementObject* self, PyObject* nameobj)
if (PyUnicode_Check(nameobj))
name = _PyUnicode_AsString(nameobj);
-
+
if (name == NULL)
return NULL;
@@ -1510,7 +1621,7 @@ element_getattro(ElementObject* self, PyObject* nameobj)
} else if (strcmp(name, "attrib") == 0) {
PyErr_Clear();
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
res = element_get_attrib(self);
}
@@ -1521,16 +1632,15 @@ element_getattro(ElementObject* self, PyObject* nameobj)
return res;
}
-static int
-element_setattr(ElementObject* self, const char* name, PyObject* value)
+static PyObject*
+element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
{
- if (value == NULL) {
- PyErr_SetString(
- PyExc_AttributeError,
- "can't delete element attributes"
- );
- return -1;
- }
+ char *name = "";
+ if (PyUnicode_Check(nameobj))
+ name = _PyUnicode_AsString(nameobj);
+
+ if (name == NULL)
+ return NULL;
if (strcmp(name, "tag") == 0) {
Py_DECREF(self->tag);
@@ -1546,16 +1656,16 @@ element_setattr(ElementObject* self, const char* name, PyObject* value)
Py_INCREF(self->tail);
} else if (strcmp(name, "attrib") == 0) {
if (!self->extra)
- element_new_extra(self, NULL);
+ create_extra(self, NULL);
Py_DECREF(self->extra->attrib);
self->extra->attrib = value;
Py_INCREF(self->extra->attrib);
} else {
PyErr_SetString(PyExc_AttributeError, name);
- return -1;
+ return NULL;
}
- return 0;
+ return NULL;
}
static PySequenceMethods element_as_sequence = {
@@ -1578,56 +1688,331 @@ static PyTypeObject Element_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"Element", sizeof(ElementObject), 0,
/* methods */
- (destructor)element_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- (setattrfunc)element_setattr, /* tp_setattr */
- 0, /* tp_reserved */
- (reprfunc)element_repr, /* tp_repr */
- 0, /* tp_as_number */
- &element_as_sequence, /* tp_as_sequence */
- &element_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- (getattrofunc)element_getattro, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- element_methods, /* tp_methods */
- 0, /* tp_members */
+ (destructor)element_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc)element_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ &element_as_sequence, /* tp_as_sequence */
+ &element_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ (getattrofunc)element_getattro, /* tp_getattro */
+ (setattrofunc)element_setattro, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)element_gc_traverse, /* tp_traverse */
+ (inquiry)element_gc_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ offsetof(ElementObject, weakreflist), /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ element_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)element_init, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ element_new, /* tp_new */
+ 0, /* tp_free */
};
+/******************************* Element iterator ****************************/
+
+/* ElementIterObject represents the iteration state over an XML element in
+ * pre-order traversal. To keep track of which sub-element should be returned
+ * next, a stack of parents is maintained. This is a standard stack-based
+ * iterative pre-order traversal of a tree.
+ * The stack is managed using a single-linked list starting at parent_stack.
+ * Each stack node contains the saved parent to which we should return after
+ * the current one is exhausted, and the next child to examine in that parent.
+ */
+typedef struct ParentLocator_t {
+ ElementObject *parent;
+ Py_ssize_t child_index;
+ struct ParentLocator_t *next;
+} ParentLocator;
+
+typedef struct {
+ PyObject_HEAD
+ ParentLocator *parent_stack;
+ ElementObject *root_element;
+ PyObject *sought_tag;
+ int root_done;
+ int gettext;
+} ElementIterObject;
+
+
+static void
+elementiter_dealloc(ElementIterObject *it)
+{
+ ParentLocator *p = it->parent_stack;
+ while (p) {
+ ParentLocator *temp = p;
+ Py_XDECREF(p->parent);
+ p = p->next;
+ PyObject_Free(temp);
+ }
+
+ Py_XDECREF(it->sought_tag);
+ Py_XDECREF(it->root_element);
+
+ PyObject_GC_UnTrack(it);
+ PyObject_GC_Del(it);
+}
+
+static int
+elementiter_traverse(ElementIterObject *it, visitproc visit, void *arg)
+{
+ ParentLocator *p = it->parent_stack;
+ while (p) {
+ Py_VISIT(p->parent);
+ p = p->next;
+ }
+
+ Py_VISIT(it->root_element);
+ Py_VISIT(it->sought_tag);
+ return 0;
+}
+
+/* Helper function for elementiter_next. Add a new parent to the parent stack.
+ */
+static ParentLocator *
+parent_stack_push_new(ParentLocator *stack, ElementObject *parent)
+{
+ ParentLocator *new_node = PyObject_Malloc(sizeof(ParentLocator));
+ if (new_node) {
+ new_node->parent = parent;
+ Py_INCREF(parent);
+ new_node->child_index = 0;
+ new_node->next = stack;
+ }
+ return new_node;
+}
+
+static PyObject *
+elementiter_next(ElementIterObject *it)
+{
+ /* Sub-element iterator.
+ *
+ * A short note on gettext: this function serves both the iter() and
+ * itertext() methods to avoid code duplication. However, there are a few
+ * small differences in the way these iterations work. Namely:
+ * - itertext() only yields text from nodes that have it, and continues
+ * iterating when a node doesn't have text (so it doesn't return any
+ * node like iter())
+ * - itertext() also has to handle tail, after finishing with all the
+ * children of a node.
+ */
+ ElementObject *cur_parent;
+ Py_ssize_t child_index;
+
+ while (1) {
+ /* Handle the case reached in the beginning and end of iteration, where
+ * the parent stack is empty. The root_done flag gives us indication
+ * whether we've just started iterating (so root_done is 0), in which
+ * case the root is returned. If root_done is 1 and we're here, the
+ * iterator is exhausted.
+ */
+ if (!it->parent_stack->parent) {
+ if (it->root_done) {
+ PyErr_SetNone(PyExc_StopIteration);
+ return NULL;
+ } else {
+ it->parent_stack = parent_stack_push_new(it->parent_stack,
+ it->root_element);
+ if (!it->parent_stack) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ it->root_done = 1;
+ if (it->sought_tag == Py_None ||
+ PyObject_RichCompareBool(it->root_element->tag,
+ it->sought_tag, Py_EQ) == 1) {
+ if (it->gettext) {
+ PyObject *text = JOIN_OBJ(it->root_element->text);
+ if (PyObject_IsTrue(text)) {
+ Py_INCREF(text);
+ return text;
+ }
+ } else {
+ Py_INCREF(it->root_element);
+ return (PyObject *)it->root_element;
+ }
+ }
+ }
+ }
+
+ /* See if there are children left to traverse in the current parent. If
+ * yes, visit the next child. If not, pop the stack and try again.
+ */
+ cur_parent = it->parent_stack->parent;
+ child_index = it->parent_stack->child_index;
+ if (cur_parent->extra && child_index < cur_parent->extra->length) {
+ ElementObject *child = (ElementObject *)
+ cur_parent->extra->children[child_index];
+ it->parent_stack->child_index++;
+ it->parent_stack = parent_stack_push_new(it->parent_stack,
+ child);
+ if (!it->parent_stack) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (it->gettext) {
+ PyObject *text = JOIN_OBJ(child->text);
+ if (PyObject_IsTrue(text)) {
+ Py_INCREF(text);
+ return text;
+ }
+ } else if (it->sought_tag == Py_None ||
+ PyObject_RichCompareBool(child->tag,
+ it->sought_tag, Py_EQ) == 1) {
+ Py_INCREF(child);
+ return (PyObject *)child;
+ }
+ else
+ continue;
+ }
+ else {
+ PyObject *tail = it->gettext ? JOIN_OBJ(cur_parent->tail) : Py_None;
+ ParentLocator *next = it->parent_stack->next;
+ Py_XDECREF(it->parent_stack->parent);
+ PyObject_Free(it->parent_stack);
+ it->parent_stack = next;
+
+ /* Note that extra condition on it->parent_stack->parent here;
+ * this is because itertext() is supposed to only return *inner*
+ * text, not text following the element it began iteration with.
+ */
+ if (it->parent_stack->parent && PyObject_IsTrue(tail)) {
+ Py_INCREF(tail);
+ return tail;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+
+static PyTypeObject ElementIter_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_elementtree._element_iterator", /* tp_name */
+ sizeof(ElementIterObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)elementiter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)elementiter_traverse, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ PyObject_SelfIter, /* tp_iter */
+ (iternextfunc)elementiter_next, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+};
+
+
+static PyObject *
+create_elementiter(ElementObject *self, PyObject *tag, int gettext)
+{
+ ElementIterObject *it;
+ PyObject *star = NULL;
+
+ it = PyObject_GC_New(ElementIterObject, &ElementIter_Type);
+ if (!it)
+ return NULL;
+ if (!(it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)))) {
+ PyObject_GC_Del(it);
+ return NULL;
+ }
+
+ it->parent_stack->parent = NULL;
+ it->parent_stack->child_index = 0;
+ it->parent_stack->next = NULL;
+
+ if (PyUnicode_Check(tag))
+ star = PyUnicode_FromString("*");
+ else if (PyBytes_Check(tag))
+ star = PyBytes_FromString("*");
+
+ if (star && PyObject_RichCompareBool(tag, star, Py_EQ) == 1)
+ tag = Py_None;
+
+ Py_XDECREF(star);
+ it->sought_tag = tag;
+ it->root_done = 0;
+ it->gettext = gettext;
+ it->root_element = self;
+
+ Py_INCREF(self);
+ Py_INCREF(tag);
+
+ PyObject_GC_Track(it);
+ return (PyObject *)it;
+}
+
+
/* ==================================================================== */
/* the tree builder type */
typedef struct {
PyObject_HEAD
- PyObject* root; /* root node (first created node) */
+ PyObject *root; /* root node (first created node) */
- ElementObject* this; /* current node */
- ElementObject* last; /* most recently created node */
+ PyObject *this; /* current node */
+ PyObject *last; /* most recently created node */
- PyObject* data; /* data collector (string or list), or NULL */
+ PyObject *data; /* data collector (string or list), or NULL */
- PyObject* stack; /* element stack */
- Py_ssize_t index; /* current stack size (0=empty) */
+ PyObject *stack; /* element stack */
+ Py_ssize_t index; /* current stack size (0 means empty) */
- /* element tracing */
- PyObject* events; /* list of events, or NULL if not collecting */
- PyObject* start_event_obj; /* event objects (NULL to ignore) */
- PyObject* end_event_obj;
- PyObject* start_ns_event_obj;
- PyObject* end_ns_event_obj;
+ PyObject *element_factory;
+ /* element tracing */
+ PyObject *events; /* list of events, or NULL if not collecting */
+ PyObject *start_event_obj; /* event objects (NULL to ignore) */
+ PyObject *end_event_obj;
+ PyObject *start_ns_event_obj;
+ PyObject *end_ns_event_obj;
} TreeBuilderObject;
static PyTypeObject TreeBuilder_Type;
@@ -1637,75 +2022,157 @@ static PyTypeObject TreeBuilder_Type;
/* -------------------------------------------------------------------- */
/* constructor and destructor */
-LOCAL(PyObject*)
-treebuilder_new(void)
+static PyObject *
+treebuilder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- TreeBuilderObject* self;
-
- self = PyObject_New(TreeBuilderObject, &TreeBuilder_Type);
- if (self == NULL)
- return NULL;
+ TreeBuilderObject *t = (TreeBuilderObject *)type->tp_alloc(type, 0);
+ if (t != NULL) {
+ t->root = NULL;
- self->root = NULL;
+ Py_INCREF(Py_None);
+ t->this = Py_None;
+ Py_INCREF(Py_None);
+ t->last = Py_None;
+
+ t->data = NULL;
+ t->element_factory = NULL;
+ t->stack = PyList_New(20);
+ if (!t->stack) {
+ Py_DECREF(t->this);
+ Py_DECREF(t->last);
+ Py_DECREF((PyObject *) t);
+ return NULL;
+ }
+ t->index = 0;
- Py_INCREF(Py_None);
- self->this = (ElementObject*) Py_None;
+ t->events = NULL;
+ t->start_event_obj = t->end_event_obj = NULL;
+ t->start_ns_event_obj = t->end_ns_event_obj = NULL;
+ }
+ return (PyObject *)t;
+}
- Py_INCREF(Py_None);
- self->last = (ElementObject*) Py_None;
+static int
+treebuilder_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"element_factory", 0};
+ PyObject *element_factory = NULL;
+ TreeBuilderObject *self_tb = (TreeBuilderObject *)self;
+ PyObject *tmp;
- self->data = NULL;
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:TreeBuilder", kwlist,
+ &element_factory)) {
+ return -1;
+ }
- self->stack = PyList_New(20);
- self->index = 0;
+ if (element_factory) {
+ Py_INCREF(element_factory);
+ tmp = self_tb->element_factory;
+ self_tb->element_factory = element_factory;
+ Py_XDECREF(tmp);
+ }
- self->events = NULL;
- self->start_event_obj = self->end_event_obj = NULL;
- self->start_ns_event_obj = self->end_ns_event_obj = NULL;
+ return 0;
+}
- ALLOC(sizeof(TreeBuilderObject), "create treebuilder");
+static int
+treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->root);
+ Py_VISIT(self->this);
+ Py_VISIT(self->last);
+ Py_VISIT(self->data);
+ Py_VISIT(self->stack);
+ Py_VISIT(self->element_factory);
+ return 0;
+}
- return (PyObject*) self;
+static int
+treebuilder_gc_clear(TreeBuilderObject *self)
+{
+ Py_CLEAR(self->end_ns_event_obj);
+ Py_CLEAR(self->start_ns_event_obj);
+ Py_CLEAR(self->end_event_obj);
+ Py_CLEAR(self->start_event_obj);
+ Py_CLEAR(self->events);
+ Py_CLEAR(self->stack);
+ Py_CLEAR(self->data);
+ Py_CLEAR(self->last);
+ Py_CLEAR(self->this);
+ Py_CLEAR(self->element_factory);
+ Py_CLEAR(self->root);
+ return 0;
}
-static PyObject*
-treebuilder(PyObject* self_, PyObject* args)
+static void
+treebuilder_dealloc(TreeBuilderObject *self)
{
- if (!PyArg_ParseTuple(args, ":TreeBuilder"))
- return NULL;
-
- return treebuilder_new();
+ PyObject_GC_UnTrack(self);
+ treebuilder_gc_clear(self);
+ Py_TYPE(self)->tp_free((PyObject *)self);
}
-static void
-treebuilder_dealloc(TreeBuilderObject* self)
-{
- Py_XDECREF(self->end_ns_event_obj);
- Py_XDECREF(self->start_ns_event_obj);
- Py_XDECREF(self->end_event_obj);
- Py_XDECREF(self->start_event_obj);
- Py_XDECREF(self->events);
- Py_DECREF(self->stack);
- Py_XDECREF(self->data);
- Py_DECREF(self->last);
- Py_DECREF(self->this);
- Py_XDECREF(self->root);
+/* -------------------------------------------------------------------- */
+/* helpers for handling of arbitrary element-like objects */
- RELEASE(sizeof(TreeBuilderObject), "destroy treebuilder");
+static int
+treebuilder_set_element_text_or_tail(PyObject *element, PyObject *data,
+ PyObject **dest, _Py_Identifier *name)
+{
+ if (Element_CheckExact(element)) {
+ Py_DECREF(JOIN_OBJ(*dest));
+ *dest = JOIN_SET(data, PyList_CheckExact(data));
+ return 0;
+ }
+ else {
+ PyObject *joined = list_join(data);
+ int r;
+ if (joined == NULL)
+ return -1;
+ r = _PyObject_SetAttrId(element, name, joined);
+ Py_DECREF(joined);
+ return r;
+ }
+}
- PyObject_Del(self);
+/* These two functions steal a reference to data */
+static int
+treebuilder_set_element_text(PyObject *element, PyObject *data)
+{
+ _Py_IDENTIFIER(text);
+ return treebuilder_set_element_text_or_tail(
+ element, data, &((ElementObject *) element)->text, &PyId_text);
}
-/* -------------------------------------------------------------------- */
-/* handlers */
+static int
+treebuilder_set_element_tail(PyObject *element, PyObject *data)
+{
+ _Py_IDENTIFIER(tail);
+ return treebuilder_set_element_text_or_tail(
+ element, data, &((ElementObject *) element)->tail, &PyId_tail);
+}
-LOCAL(PyObject*)
-treebuilder_handle_xml(TreeBuilderObject* self, PyObject* encoding,
- PyObject* standalone)
+static int
+treebuilder_add_subelement(PyObject *element, PyObject *child)
{
- Py_RETURN_NONE;
+ _Py_IDENTIFIER(append);
+ if (Element_CheckExact(element)) {
+ ElementObject *elem = (ElementObject *) element;
+ return element_add_subelement(elem, child);
+ }
+ else {
+ PyObject *res;
+ res = _PyObject_CallMethodId(element, &PyId_append, "O", child);
+ if (res == NULL)
+ return -1;
+ Py_DECREF(res);
+ return 0;
+ }
}
+/* -------------------------------------------------------------------- */
+/* handlers */
+
LOCAL(PyObject*)
treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
PyObject* attrib)
@@ -1715,27 +2182,29 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
if (self->data) {
if (self->this == self->last) {
- Py_DECREF(JOIN_OBJ(self->last->text));
- self->last->text = JOIN_SET(
- self->data, PyList_CheckExact(self->data)
- );
- } else {
- Py_DECREF(JOIN_OBJ(self->last->tail));
- self->last->tail = JOIN_SET(
- self->data, PyList_CheckExact(self->data)
- );
+ if (treebuilder_set_element_text(self->last, self->data))
+ return NULL;
+ }
+ else {
+ if (treebuilder_set_element_tail(self->last, self->data))
+ return NULL;
}
self->data = NULL;
}
- node = element_new(tag, attrib);
- if (!node)
+ if (self->element_factory) {
+ node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib);
+ } else {
+ node = create_new_element(tag, attrib);
+ }
+ if (!node) {
return NULL;
+ }
- this = (PyObject*) self->this;
+ this = self->this;
if (this != Py_None) {
- if (element_add_subelement((ElementObject*) this, node) < 0)
+ if (treebuilder_add_subelement(this, node) < 0)
goto error;
} else {
if (self->root) {
@@ -1761,19 +2230,17 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
Py_DECREF(this);
Py_INCREF(node);
- self->this = (ElementObject*) node;
+ self->this = node;
Py_DECREF(self->last);
Py_INCREF(node);
- self->last = (ElementObject*) node;
+ self->last = node;
if (self->start_event_obj) {
PyObject* res;
PyObject* action = self->start_event_obj;
- res = PyTuple_New(2);
+ res = PyTuple_Pack(2, action, node);
if (res) {
- Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action);
- Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node);
PyList_Append(self->events, res);
Py_DECREF(res);
} else
@@ -1791,7 +2258,7 @@ LOCAL(PyObject*)
treebuilder_handle_data(TreeBuilderObject* self, PyObject* data)
{
if (!self->data) {
- if (self->last == (ElementObject*) Py_None) {
+ if (self->last == Py_None) {
/* ignore calls to data before the first call to start */
Py_RETURN_NONE;
}
@@ -1801,6 +2268,7 @@ treebuilder_handle_data(TreeBuilderObject* self, PyObject* data)
/* more than one item; use a list to collect items */
if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 &&
PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) {
+ /* XXX this code path unused in Python 3? */
/* expat often generates single character data sections; handle
the most common case by resizing the existing string... */
Py_ssize_t size = PyBytes_GET_SIZE(self->data);
@@ -1830,15 +2298,11 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
if (self->data) {
if (self->this == self->last) {
- Py_DECREF(JOIN_OBJ(self->last->text));
- self->last->text = JOIN_SET(
- self->data, PyList_CheckExact(self->data)
- );
+ if (treebuilder_set_element_text(self->last, self->data))
+ return NULL;
} else {
- Py_DECREF(JOIN_OBJ(self->last->tail));
- self->last->tail = JOIN_SET(
- self->data, PyList_CheckExact(self->data)
- );
+ if (treebuilder_set_element_tail(self->last, self->data))
+ return NULL;
}
self->data = NULL;
}
@@ -1858,17 +2322,15 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
Py_DECREF(self->last);
- self->last = (ElementObject*) self->this;
- self->this = (ElementObject*) item;
+ self->last = self->this;
+ self->this = item;
if (self->end_event_obj) {
PyObject* res;
PyObject* action = self->end_event_obj;
PyObject* node = (PyObject*) self->last;
- res = PyTuple_New(2);
+ res = PyTuple_Pack(2, action, node);
if (res) {
- Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action);
- Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node);
PyList_Append(self->events, res);
Py_DECREF(res);
} else
@@ -1914,8 +2376,12 @@ treebuilder_handle_namespace(TreeBuilderObject* self, int start,
PyTuple_SET_ITEM(res, 1, parcel);
PyList_Append(self->events, res);
Py_DECREF(res);
- } else
+ }
+ else {
+ Py_DECREF(action);
+ Py_DECREF(parcel);
PyErr_Clear(); /* FIXME: propagate error */
+ }
}
/* -------------------------------------------------------------------- */
@@ -1977,22 +2443,10 @@ treebuilder_start(TreeBuilderObject* self, PyObject* args)
return treebuilder_handle_start(self, tag, attrib);
}
-static PyObject*
-treebuilder_xml(TreeBuilderObject* self, PyObject* args)
-{
- PyObject* encoding;
- PyObject* standalone;
- if (!PyArg_ParseTuple(args, "OO:xml", &encoding, &standalone))
- return NULL;
-
- return treebuilder_handle_xml(self, encoding, standalone);
-}
-
static PyMethodDef treebuilder_methods[] = {
{"data", (PyCFunction) treebuilder_data, METH_VARARGS},
{"start", (PyCFunction) treebuilder_start, METH_VARARGS},
{"end", (PyCFunction) treebuilder_end, METH_VARARGS},
- {"xml", (PyCFunction) treebuilder_xml, METH_VARARGS},
{"close", (PyCFunction) treebuilder_close, METH_VARARGS},
{NULL, NULL}
};
@@ -2001,31 +2455,42 @@ static PyTypeObject TreeBuilder_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"TreeBuilder", sizeof(TreeBuilderObject), 0,
/* methods */
- (destructor)treebuilder_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_reserved */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- treebuilder_methods, /* tp_methods */
- 0, /* tp_members */
+ (destructor)treebuilder_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)treebuilder_gc_traverse, /* tp_traverse */
+ (inquiry)treebuilder_gc_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ treebuilder_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)treebuilder_init, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ treebuilder_new, /* tp_new */
+ 0, /* tp_free */
};
/* ==================================================================== */
@@ -2034,40 +2499,39 @@ static PyTypeObject TreeBuilder_Type = {
#if defined(USE_EXPAT)
#include "expat.h"
-
-#if defined(USE_PYEXPAT_CAPI)
#include "pyexpat.h"
-static struct PyExpat_CAPI* expat_capi;
+static struct PyExpat_CAPI *expat_capi;
#define EXPAT(func) (expat_capi->func)
-#else
-#define EXPAT(func) (XML_##func)
-#endif
+
+static XML_Memory_Handling_Suite ExpatMemoryHandler = {
+ PyObject_Malloc, PyObject_Realloc, PyObject_Free};
typedef struct {
PyObject_HEAD
XML_Parser parser;
- PyObject* target;
- PyObject* entity;
+ PyObject *target;
+ PyObject *entity;
- PyObject* names;
+ PyObject *names;
- PyObject* handle_xml;
+ PyObject *handle_start;
+ PyObject *handle_data;
+ PyObject *handle_end;
- PyObject* handle_start;
- PyObject* handle_data;
- PyObject* handle_end;
+ PyObject *handle_comment;
+ PyObject *handle_pi;
+ PyObject *handle_doctype;
- PyObject* handle_comment;
- PyObject* handle_pi;
-
- PyObject* handle_close;
+ PyObject *handle_close;
} XMLParserObject;
static PyTypeObject XMLParser_Type;
+#define XMLParser_CheckExact(op) (Py_TYPE(op) == &XMLParser_Type)
+
/* helpers */
LOCAL(PyObject*)
@@ -2076,7 +2540,7 @@ makeuniversal(XMLParserObject* self, const char* string)
/* convert a UTF-8 tag/attribute name from the expat parser
to a universal name string */
- int size = strlen(string);
+ Py_ssize_t size = (Py_ssize_t) strlen(string);
PyObject* key;
PyObject* value;
@@ -2095,7 +2559,7 @@ makeuniversal(XMLParserObject* self, const char* string)
PyObject* tag;
char* p;
- int i;
+ Py_ssize_t i;
/* look for namespace separator */
for (i = 0; i < size; i++)
@@ -2113,7 +2577,7 @@ makeuniversal(XMLParserObject* self, const char* string)
Py_INCREF(key);
tag = key;
}
-
+
/* decode universal name */
p = PyBytes_AS_STRING(tag);
value = PyUnicode_DecodeUTF8(p, size, "strict");
@@ -2135,20 +2599,39 @@ makeuniversal(XMLParserObject* self, const char* string)
return value;
}
+/* Set the ParseError exception with the given parameters.
+ * If message is not NULL, it's used as the error string. Otherwise, the
+ * message string is the default for the given error_code.
+*/
static void
-expat_set_error(const char* message, int line, int column)
+expat_set_error(enum XML_Error error_code, int line, int column, char *message)
{
- PyObject *error;
- PyObject *position;
- char buffer[256];
+ PyObject *errmsg, *error, *position, *code;
- sprintf(buffer, "%.100s: line %d, column %d", message, line, column);
+ errmsg = PyUnicode_FromFormat("%s: line %d, column %d",
+ message ? message : EXPAT(ErrorString)(error_code),
+ line, column);
+ if (errmsg == NULL)
+ return;
- error = PyObject_CallFunction(elementtree_parseerror_obj, "s", buffer);
+ error = PyObject_CallFunction(elementtree_parseerror_obj, "O", errmsg);
+ Py_DECREF(errmsg);
if (!error)
return;
- /* add position attribute */
+ /* Add code and position attributes */
+ code = PyLong_FromLong((long)error_code);
+ if (!code) {
+ Py_DECREF(error);
+ return;
+ }
+ if (PyObject_SetAttrString(error, "code", code) == -1) {
+ Py_DECREF(error);
+ Py_DECREF(code);
+ return;
+ }
+ Py_DECREF(code);
+
position = Py_BuildValue("(ii)", line, column);
if (!position) {
Py_DECREF(error);
@@ -2200,9 +2683,10 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
char message[128] = "undefined entity ";
strncat(message, data_in, data_len < 100?data_len:100);
expat_set_error(
- message,
+ XML_ERROR_UNDEFINED_ENTITY,
EXPAT(GetErrorLineNumber)(self->parser),
- EXPAT(GetErrorColumnNumber)(self->parser)
+ EXPAT(GetErrorColumnNumber)(self->parser),
+ message
);
}
@@ -2247,21 +2731,18 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
attrib_in += 2;
}
} else {
- Py_INCREF(Py_None);
- attrib = Py_None;
+ /* Pass an empty dictionary on */
+ attrib = PyDict_New();
+ if (!attrib)
+ return;
}
- if (TreeBuilder_CheckExact(self->target))
+ if (TreeBuilder_CheckExact(self->target)) {
/* shortcut */
res = treebuilder_handle_start((TreeBuilderObject*) self->target,
tag, attrib);
+ }
else if (self->handle_start) {
- if (attrib == Py_None) {
- Py_DECREF(attrib);
- attrib = PyDict_New();
- if (!attrib)
- return;
- }
res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib);
} else
res = NULL;
@@ -2371,6 +2852,78 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
}
}
+static void
+expat_start_doctype_handler(XMLParserObject *self,
+ const XML_Char *doctype_name,
+ const XML_Char *sysid,
+ const XML_Char *pubid,
+ int has_internal_subset)
+{
+ PyObject *self_pyobj = (PyObject *)self;
+ PyObject *doctype_name_obj, *sysid_obj, *pubid_obj;
+ PyObject *parser_doctype = NULL;
+ PyObject *res = NULL;
+
+ doctype_name_obj = makeuniversal(self, doctype_name);
+ if (!doctype_name_obj)
+ return;
+
+ if (sysid) {
+ sysid_obj = makeuniversal(self, sysid);
+ if (!sysid_obj) {
+ Py_DECREF(doctype_name_obj);
+ return;
+ }
+ } else {
+ Py_INCREF(Py_None);
+ sysid_obj = Py_None;
+ }
+
+ if (pubid) {
+ pubid_obj = makeuniversal(self, pubid);
+ if (!pubid_obj) {
+ Py_DECREF(doctype_name_obj);
+ Py_DECREF(sysid_obj);
+ return;
+ }
+ } else {
+ Py_INCREF(Py_None);
+ pubid_obj = Py_None;
+ }
+
+ /* If the target has a handler for doctype, call it. */
+ if (self->handle_doctype) {
+ res = PyObject_CallFunction(self->handle_doctype, "OOO",
+ doctype_name_obj, pubid_obj, sysid_obj);
+ Py_CLEAR(res);
+ }
+
+ /* Now see if the parser itself has a doctype method. If yes and it's
+ * a subclass, call it but warn about deprecation. If it's not a subclass
+ * (i.e. vanilla XMLParser), do nothing.
+ */
+ parser_doctype = PyObject_GetAttrString(self_pyobj, "doctype");
+ if (parser_doctype) {
+ if (!XMLParser_CheckExact(self_pyobj)) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "This method of XMLParser is deprecated. Define"
+ " doctype() method on the TreeBuilder target.",
+ 1) < 0) {
+ goto clear;
+ }
+ res = PyObject_CallFunction(parser_doctype, "OOO",
+ doctype_name_obj, pubid_obj, sysid_obj);
+ Py_CLEAR(res);
+ }
+ }
+
+clear:
+ Py_XDECREF(parser_doctype);
+ Py_DECREF(doctype_name_obj);
+ Py_DECREF(pubid_obj);
+ Py_DECREF(sysid_obj);
+}
+
static void
expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
const XML_Char* data_in)
@@ -2399,29 +2952,33 @@ expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name,
XML_Encoding *info)
{
PyObject* u;
- Py_UNICODE* p;
unsigned char s[256];
int i;
+ void *data;
+ unsigned int kind;
memset(info, 0, sizeof(XML_Encoding));
for (i = 0; i < 256; i++)
s[i] = i;
-
+
u = PyUnicode_Decode((char*) s, 256, name, "replace");
if (!u)
return XML_STATUS_ERROR;
+ if (PyUnicode_READY(u))
+ return XML_STATUS_ERROR;
- if (PyUnicode_GET_SIZE(u) != 256) {
+ if (PyUnicode_GET_LENGTH(u) != 256) {
Py_DECREF(u);
return XML_STATUS_ERROR;
}
- p = PyUnicode_AS_UNICODE(u);
-
+ kind = PyUnicode_KIND(u);
+ data = PyUnicode_DATA(u);
for (i = 0; i < 256; i++) {
- if (p[i] != Py_UNICODE_REPLACEMENT_CHARACTER)
- info->map[i] = p[i];
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch != Py_UNICODE_REPLACEMENT_CHARACTER)
+ info->map[i] = ch;
else
info->map[i] = -1;
}
@@ -2432,144 +2989,156 @@ expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name,
}
/* -------------------------------------------------------------------- */
-/* constructor and destructor */
-static PyObject*
-xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
+static PyObject *
+xmlparser_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- XMLParserObject* self;
- /* FIXME: does this need to be static? */
- static XML_Memory_Handling_Suite memory_handler;
+ XMLParserObject *self = (XMLParserObject *)type->tp_alloc(type, 0);
+ if (self) {
+ self->parser = NULL;
+ self->target = self->entity = self->names = NULL;
+ self->handle_start = self->handle_data = self->handle_end = NULL;
+ self->handle_comment = self->handle_pi = self->handle_close = NULL;
+ self->handle_doctype = NULL;
+ }
+ return (PyObject *)self;
+}
- PyObject* target = NULL;
- char* encoding = NULL;
- static char* kwlist[] = { "target", "encoding", NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kw, "|Oz:XMLParser", kwlist,
- &target, &encoding))
- return NULL;
+static int
+xmlparser_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ XMLParserObject *self_xp = (XMLParserObject *)self;
+ PyObject *target = NULL, *html = NULL;
+ char *encoding = NULL;
+ static char *kwlist[] = {"html", "target", "encoding", 0};
-#if defined(USE_PYEXPAT_CAPI)
- if (!expat_capi) {
- PyErr_SetString(
- PyExc_RuntimeError, "cannot load dispatch table from pyexpat"
- );
- return NULL;
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOz:XMLParser", kwlist,
+ &html, &target, &encoding)) {
+ return -1;
}
-#endif
- self = PyObject_New(XMLParserObject, &XMLParser_Type);
- if (self == NULL)
- return NULL;
+ self_xp->entity = PyDict_New();
+ if (!self_xp->entity)
+ return -1;
- self->entity = PyDict_New();
- if (!self->entity) {
- PyObject_Del(self);
- return NULL;
- }
-
- self->names = PyDict_New();
- if (!self->names) {
- PyObject_Del(self->entity);
- PyObject_Del(self);
- return NULL;
+ self_xp->names = PyDict_New();
+ if (!self_xp->names) {
+ Py_CLEAR(self_xp->entity);
+ return -1;
}
- memory_handler.malloc_fcn = PyObject_Malloc;
- memory_handler.realloc_fcn = PyObject_Realloc;
- memory_handler.free_fcn = PyObject_Free;
-
- self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}");
- if (!self->parser) {
- PyObject_Del(self->names);
- PyObject_Del(self->entity);
- PyObject_Del(self);
+ self_xp->parser = EXPAT(ParserCreate_MM)(encoding, &ExpatMemoryHandler, "}");
+ if (!self_xp->parser) {
+ Py_CLEAR(self_xp->entity);
+ Py_CLEAR(self_xp->names);
PyErr_NoMemory();
- return NULL;
+ return -1;
}
- /* setup target handlers */
- if (!target) {
- target = treebuilder_new();
+ if (target) {
+ Py_INCREF(target);
+ } else {
+ target = treebuilder_new(&TreeBuilder_Type, NULL, NULL);
if (!target) {
- EXPAT(ParserFree)(self->parser);
- PyObject_Del(self->names);
- PyObject_Del(self->entity);
- PyObject_Del(self);
- return NULL;
+ Py_CLEAR(self_xp->entity);
+ Py_CLEAR(self_xp->names);
+ EXPAT(ParserFree)(self_xp->parser);
+ return -1;
}
- } else
- Py_INCREF(target);
- self->target = target;
+ }
+ self_xp->target = target;
- self->handle_xml = PyObject_GetAttrString(target, "xml");
- self->handle_start = PyObject_GetAttrString(target, "start");
- self->handle_data = PyObject_GetAttrString(target, "data");
- self->handle_end = PyObject_GetAttrString(target, "end");
- self->handle_comment = PyObject_GetAttrString(target, "comment");
- self->handle_pi = PyObject_GetAttrString(target, "pi");
- self->handle_close = PyObject_GetAttrString(target, "close");
+ self_xp->handle_start = PyObject_GetAttrString(target, "start");
+ self_xp->handle_data = PyObject_GetAttrString(target, "data");
+ self_xp->handle_end = PyObject_GetAttrString(target, "end");
+ self_xp->handle_comment = PyObject_GetAttrString(target, "comment");
+ self_xp->handle_pi = PyObject_GetAttrString(target, "pi");
+ self_xp->handle_close = PyObject_GetAttrString(target, "close");
+ self_xp->handle_doctype = PyObject_GetAttrString(target, "doctype");
PyErr_Clear();
-
+
/* configure parser */
- EXPAT(SetUserData)(self->parser, self);
+ EXPAT(SetUserData)(self_xp->parser, self_xp);
EXPAT(SetElementHandler)(
- self->parser,
+ self_xp->parser,
(XML_StartElementHandler) expat_start_handler,
(XML_EndElementHandler) expat_end_handler
);
EXPAT(SetDefaultHandlerExpand)(
- self->parser,
+ self_xp->parser,
(XML_DefaultHandler) expat_default_handler
);
EXPAT(SetCharacterDataHandler)(
- self->parser,
+ self_xp->parser,
(XML_CharacterDataHandler) expat_data_handler
);
- if (self->handle_comment)
+ if (self_xp->handle_comment)
EXPAT(SetCommentHandler)(
- self->parser,
+ self_xp->parser,
(XML_CommentHandler) expat_comment_handler
);
- if (self->handle_pi)
+ if (self_xp->handle_pi)
EXPAT(SetProcessingInstructionHandler)(
- self->parser,
+ self_xp->parser,
(XML_ProcessingInstructionHandler) expat_pi_handler
);
+ EXPAT(SetStartDoctypeDeclHandler)(
+ self_xp->parser,
+ (XML_StartDoctypeDeclHandler) expat_start_doctype_handler
+ );
EXPAT(SetUnknownEncodingHandler)(
- self->parser,
+ self_xp->parser,
(XML_UnknownEncodingHandler) expat_unknown_encoding_handler, NULL
);
- ALLOC(sizeof(XMLParserObject), "create expatparser");
+ return 0;
+}
- return (PyObject*) self;
+static int
+xmlparser_gc_traverse(XMLParserObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->handle_close);
+ Py_VISIT(self->handle_pi);
+ Py_VISIT(self->handle_comment);
+ Py_VISIT(self->handle_end);
+ Py_VISIT(self->handle_data);
+ Py_VISIT(self->handle_start);
+
+ Py_VISIT(self->target);
+ Py_VISIT(self->entity);
+ Py_VISIT(self->names);
+
+ return 0;
}
-static void
-xmlparser_dealloc(XMLParserObject* self)
+static int
+xmlparser_gc_clear(XMLParserObject *self)
{
EXPAT(ParserFree)(self->parser);
- Py_XDECREF(self->handle_close);
- Py_XDECREF(self->handle_pi);
- Py_XDECREF(self->handle_comment);
- Py_XDECREF(self->handle_end);
- Py_XDECREF(self->handle_data);
- Py_XDECREF(self->handle_start);
- Py_XDECREF(self->handle_xml);
-
- Py_DECREF(self->target);
- Py_DECREF(self->entity);
- Py_DECREF(self->names);
+ Py_CLEAR(self->handle_close);
+ Py_CLEAR(self->handle_pi);
+ Py_CLEAR(self->handle_comment);
+ Py_CLEAR(self->handle_end);
+ Py_CLEAR(self->handle_data);
+ Py_CLEAR(self->handle_start);
+ Py_CLEAR(self->handle_doctype);
- RELEASE(sizeof(XMLParserObject), "destroy expatparser");
+ Py_CLEAR(self->target);
+ Py_CLEAR(self->entity);
+ Py_CLEAR(self->names);
- PyObject_Del(self);
+ return 0;
}
-/* -------------------------------------------------------------------- */
-/* methods (in alphabetical order) */
+static void
+xmlparser_dealloc(XMLParserObject* self)
+{
+ PyObject_GC_UnTrack(self);
+ xmlparser_gc_clear(self);
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
LOCAL(PyObject*)
expat_parse(XMLParserObject* self, char* data, int data_len, int final)
@@ -2583,9 +3152,10 @@ expat_parse(XMLParserObject* self, char* data, int data_len, int final)
if (!ok) {
expat_set_error(
- EXPAT(ErrorString)(EXPAT(GetErrorCode)(self->parser)),
+ EXPAT(GetErrorCode)(self->parser),
EXPAT(GetErrorLineNumber)(self->parser),
- EXPAT(GetErrorColumnNumber)(self->parser)
+ EXPAT(GetErrorColumnNumber)(self->parser),
+ NULL
);
return NULL;
}
@@ -2636,6 +3206,7 @@ xmlparser_parse(XMLParserObject* self, PyObject* args)
PyObject* reader;
PyObject* buffer;
+ PyObject* temp;
PyObject* res;
PyObject* fileobj;
@@ -2645,7 +3216,7 @@ xmlparser_parse(XMLParserObject* self, PyObject* args)
reader = PyObject_GetAttrString(fileobj, "read");
if (!reader)
return NULL;
-
+
/* read from open file object */
for (;;) {
@@ -2657,7 +3228,22 @@ xmlparser_parse(XMLParserObject* self, PyObject* args)
return NULL;
}
- if (!PyBytes_CheckExact(buffer) || PyBytes_GET_SIZE(buffer) == 0) {
+ if (PyUnicode_CheckExact(buffer)) {
+ /* A unicode object is encoded into bytes using UTF-8 */
+ if (PyUnicode_GET_SIZE(buffer) == 0) {
+ Py_DECREF(buffer);
+ break;
+ }
+ temp = PyUnicode_AsEncodedString(buffer, "utf-8", "surrogatepass");
+ Py_DECREF(buffer);
+ if (!temp) {
+ /* Propagate exception from PyUnicode_AsEncodedString */
+ Py_DECREF(reader);
+ return NULL;
+ }
+ buffer = temp;
+ }
+ else if (!PyBytes_CheckExact(buffer) || PyBytes_GET_SIZE(buffer) == 0) {
Py_DECREF(buffer);
break;
}
@@ -2689,7 +3275,13 @@ xmlparser_parse(XMLParserObject* self, PyObject* args)
}
static PyObject*
-xmlparser_setevents(XMLParserObject* self, PyObject* args)
+xmlparser_doctype(XMLParserObject *self, PyObject *args)
+{
+ Py_RETURN_NONE;
+}
+
+static PyObject*
+xmlparser_setevents(XMLParserObject *self, PyObject* args)
{
/* activate element event reporting */
@@ -2705,7 +3297,7 @@ xmlparser_setevents(XMLParserObject* self, PyObject* args)
if (!TreeBuilder_CheckExact(self->target)) {
PyErr_SetString(
PyExc_TypeError,
- "event handling only supported for cElementTree.Treebuilder "
+ "event handling only supported for ElementTree.TreeBuilder "
"targets"
);
return NULL;
@@ -2718,10 +3310,10 @@ xmlparser_setevents(XMLParserObject* self, PyObject* args)
target->events = events;
/* clear out existing events */
- Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL;
- Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL;
- Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL;
- Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL;
+ Py_CLEAR(target->start_event_obj);
+ Py_CLEAR(target->end_event_obj);
+ Py_CLEAR(target->start_ns_event_obj);
+ Py_CLEAR(target->end_ns_event_obj);
if (event_set == Py_None) {
/* default is "end" only */
@@ -2793,10 +3385,11 @@ static PyMethodDef xmlparser_methods[] = {
{"close", (PyCFunction) xmlparser_close, METH_VARARGS},
{"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
{"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS},
+ {"doctype", (PyCFunction) xmlparser_doctype, METH_VARARGS},
{NULL, NULL}
};
-static PyObject*
+static PyObject*
xmlparser_getattro(XMLParserObject* self, PyObject* nameobj)
{
if (PyUnicode_Check(nameobj)) {
@@ -2824,31 +3417,42 @@ static PyTypeObject XMLParser_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"XMLParser", sizeof(XMLParserObject), 0,
/* methods */
- (destructor)xmlparser_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_reserved */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- (getattrofunc)xmlparser_getattro, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- xmlparser_methods, /* tp_methods */
- 0, /* tp_members */
+ (destructor)xmlparser_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ (getattrofunc)xmlparser_getattro, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)xmlparser_gc_traverse, /* tp_traverse */
+ (inquiry)xmlparser_gc_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ xmlparser_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)xmlparser_init, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ xmlparser_new, /* tp_new */
+ 0, /* tp_free */
};
#endif
@@ -2857,13 +3461,7 @@ static PyTypeObject XMLParser_Type = {
/* python module interface */
static PyMethodDef _functions[] = {
- {"Element", (PyCFunction) element, METH_VARARGS|METH_KEYWORDS},
{"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS},
- {"TreeBuilder", (PyCFunction) treebuilder, METH_VARARGS},
-#if defined(USE_EXPAT)
- {"XMLParser", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS},
- {"XMLTreeBuilder", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS},
-#endif
{NULL, NULL}
};
@@ -2883,9 +3481,7 @@ static struct PyModuleDef _elementtreemodule = {
PyMODINIT_FUNC
PyInit__elementtree(void)
{
- PyObject* m;
- PyObject* g;
- char* bootstrap;
+ PyObject *m, *temp;
/* Initialize object types */
if (PyType_Ready(&TreeBuilder_Type) < 0)
@@ -2901,212 +3497,15 @@ PyInit__elementtree(void)
if (!m)
return NULL;
- /* The code below requires that the module gets already added
- to sys.modules. */
- PyDict_SetItemString(PyImport_GetModuleDict(),
- _elementtreemodule.m_name,
- m);
-
- /* python glue code */
-
- g = PyDict_New();
- if (!g)
- return NULL;
-
- PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins());
-
- bootstrap = (
-
- "from copy import copy, deepcopy\n"
-
- "try:\n"
- " from xml.etree import ElementTree\n"
- "except ImportError:\n"
- " import ElementTree\n"
- "ET = ElementTree\n"
- "del ElementTree\n"
-
- "import _elementtree as cElementTree\n"
-
- "try:\n" /* check if copy works as is */
- " copy(cElementTree.Element('x'))\n"
- "except:\n"
- " def copyelement(elem):\n"
- " return elem\n"
-
- "class CommentProxy:\n"
- " def __call__(self, text=None):\n"
- " element = cElementTree.Element(ET.Comment)\n"
- " element.text = text\n"
- " return element\n"
- " def __eq__(self, other):\n"
- " return ET.Comment == other\n"
- "cElementTree.Comment = CommentProxy()\n"
-
- "class ElementTree(ET.ElementTree):\n" /* public */
- " def parse(self, source, parser=None):\n"
- " close_source = False\n"
- " if not hasattr(source, 'read'):\n"
- " source = open(source, 'rb')\n"
- " close_source = True\n"
- " try:\n"
- " if parser is not None:\n"
- " while 1:\n"
- " data = source.read(65536)\n"
- " if not data:\n"
- " break\n"
- " parser.feed(data)\n"
- " self._root = parser.close()\n"
- " else:\n"
- " parser = cElementTree.XMLParser()\n"
- " self._root = parser._parse(source)\n"
- " return self._root\n"
- " finally:\n"
- " if close_source:\n"
- " source.close()\n"
- "cElementTree.ElementTree = ElementTree\n"
-
- "def iter(node, tag=None):\n" /* helper */
- " if tag == '*':\n"
- " tag = None\n"
- " if tag is None or node.tag == tag:\n"
- " yield node\n"
- " for node in node:\n"
- " for node in iter(node, tag):\n"
- " yield node\n"
-
- "def itertext(node):\n" /* helper */
- " if node.text:\n"
- " yield node.text\n"
- " for e in node:\n"
- " for s in e.itertext():\n"
- " yield s\n"
- " if e.tail:\n"
- " yield e.tail\n"
-
- "def parse(source, parser=None):\n" /* public */
- " tree = ElementTree()\n"
- " tree.parse(source, parser)\n"
- " return tree\n"
- "cElementTree.parse = parse\n"
-
- "class iterparse:\n"
- " root = None\n"
- " def __init__(self, file, events=None):\n"
- " self._close_file = False\n"
- " if not hasattr(file, 'read'):\n"
- " file = open(file, 'rb')\n"
- " self._close_file = True\n"
- " self._file = file\n"
- " self._events = []\n"
- " self._index = 0\n"
- " self._error = None\n"
- " self.root = self._root = None\n"
- " b = cElementTree.TreeBuilder()\n"
- " self._parser = cElementTree.XMLParser(b)\n"
- " self._parser._setevents(self._events, events)\n"
- " def __next__(self):\n"
- " while 1:\n"
- " try:\n"
- " item = self._events[self._index]\n"
- " self._index += 1\n"
- " return item\n"
- " except IndexError:\n"
- " pass\n"
- " if self._error:\n"
- " e = self._error\n"
- " self._error = None\n"
- " raise e\n"
- " if self._parser is None:\n"
- " self.root = self._root\n"
- " if self._close_file:\n"
- " self._file.close()\n"
- " raise StopIteration\n"
- " # load event buffer\n"
- " del self._events[:]\n"
- " self._index = 0\n"
- " data = self._file.read(16384)\n"
- " if data:\n"
- " try:\n"
- " self._parser.feed(data)\n"
- " except SyntaxError as exc:\n"
- " self._error = exc\n"
- " else:\n"
- " self._root = self._parser.close()\n"
- " self._parser = None\n"
- " def __iter__(self):\n"
- " return self\n"
- "cElementTree.iterparse = iterparse\n"
-
- "class PIProxy:\n"
- " def __call__(self, target, text=None):\n"
- " element = cElementTree.Element(ET.PI)\n"
- " element.text = target\n"
- " if text:\n"
- " element.text = element.text + ' ' + text\n"
- " return element\n"
- " def __eq__(self, other):\n"
- " return ET.PI == other\n"
- "cElementTree.PI = cElementTree.ProcessingInstruction = PIProxy()\n"
-
- "def XML(text):\n" /* public */
- " parser = cElementTree.XMLParser()\n"
- " parser.feed(text)\n"
- " return parser.close()\n"
- "cElementTree.XML = cElementTree.fromstring = XML\n"
-
- "def XMLID(text):\n" /* public */
- " tree = XML(text)\n"
- " ids = {}\n"
- " for elem in tree.iter():\n"
- " id = elem.get('id')\n"
- " if id:\n"
- " ids[id] = elem\n"
- " return tree, ids\n"
- "cElementTree.XMLID = XMLID\n"
-
- "try:\n"
- " register_namespace = ET.register_namespace\n"
- "except AttributeError:\n"
- " def register_namespace(prefix, uri):\n"
- " ET._namespace_map[uri] = prefix\n"
- "cElementTree.register_namespace = register_namespace\n"
-
- "cElementTree.dump = ET.dump\n"
- "cElementTree.ElementPath = ElementPath = ET.ElementPath\n"
- "cElementTree.iselement = ET.iselement\n"
- "cElementTree.QName = ET.QName\n"
- "cElementTree.tostring = ET.tostring\n"
- "cElementTree.fromstringlist = ET.fromstringlist\n"
- "cElementTree.tostringlist = ET.tostringlist\n"
- "cElementTree.VERSION = '" VERSION "'\n"
- "cElementTree.__version__ = '" VERSION "'\n"
-
- );
-
- if (!PyRun_String(bootstrap, Py_file_input, g, NULL))
- return NULL;
-
- elementpath_obj = PyDict_GetItemString(g, "ElementPath");
-
- elementtree_copyelement_obj = PyDict_GetItemString(g, "copyelement");
- if (elementtree_copyelement_obj) {
- /* reduce hack needed; enable reduce method */
- PyMethodDef* mp;
- for (mp = element_methods; mp->ml_name; mp++)
- if (mp->ml_meth == (PyCFunction) element_reduce) {
- mp->ml_name = "__reduce__";
- break;
- }
- } else
- PyErr_Clear();
+ if (!(temp = PyImport_ImportModule("copy")))
+ return NULL;
+ elementtree_deepcopy_obj = PyObject_GetAttrString(temp, "deepcopy");
+ Py_XDECREF(temp);
- elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy");
- elementtree_iter_obj = PyDict_GetItemString(g, "iter");
- elementtree_itertext_obj = PyDict_GetItemString(g, "itertext");
+ if (!(elementpath_obj = PyImport_ImportModule("xml.etree.ElementPath")))
+ return NULL;
-#if defined(USE_PYEXPAT_CAPI)
- /* link against pyexpat, if possible */
+ /* link against pyexpat */
expat_capi = PyCapsule_Import(PyExpat_CAPSULE_NAME, 0);
if (expat_capi) {
/* check that it's usable */
@@ -3122,13 +3521,23 @@ PyInit__elementtree(void)
} else {
return NULL;
}
-#endif
elementtree_parseerror_obj = PyErr_NewException(
- "cElementTree.ParseError", PyExc_SyntaxError, NULL
+ "xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL
);
Py_INCREF(elementtree_parseerror_obj);
PyModule_AddObject(m, "ParseError", elementtree_parseerror_obj);
+ Py_INCREF((PyObject *)&Element_Type);
+ PyModule_AddObject(m, "Element", (PyObject *)&Element_Type);
+
+ Py_INCREF((PyObject *)&TreeBuilder_Type);
+ PyModule_AddObject(m, "TreeBuilder", (PyObject *)&TreeBuilder_Type);
+
+#if defined(USE_EXPAT)
+ Py_INCREF((PyObject *)&XMLParser_Type);
+ PyModule_AddObject(m, "XMLParser", (PyObject *)&XMLParser_Type);
+#endif
+
return m;
}
diff --git a/Modules/_freeze_importlib.c b/Modules/_freeze_importlib.c
new file mode 100644
index 0000000..65b29e1
--- /dev/null
+++ b/Modules/_freeze_importlib.c
@@ -0,0 +1,142 @@
+/* This is built as a stand-alone executable by the Makefile, and helps turn
+ Lib/importlib/_bootstrap.py into a frozen module in Python/importlib.h
+*/
+
+#include <Python.h>
+#include <marshal.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifndef MS_WINDOWS
+#include <unistd.h>
+#endif
+
+
+/* To avoid a circular dependency on frozen.o, we create our own structure
+ of frozen modules instead, left deliberately blank so as to avoid
+ unintentional import of a stale version of _frozen_importlib. */
+
+static struct _frozen _PyImport_FrozenModules[] = {
+ {0, 0, 0} /* sentinel */
+};
+
+#ifndef MS_WINDOWS
+/* On Windows, this links with the regular pythonXY.dll, so this variable comes
+ from frozen.obj. In the Makefile, frozen.o is not linked into this executable,
+ so we define the variable here. */
+struct _frozen *PyImport_FrozenModules;
+#endif
+
+const char header[] = "/* Auto-generated by Modules/_freeze_importlib.c */";
+
+int
+main(int argc, char *argv[])
+{
+ char *inpath, *outpath;
+ FILE *infile, *outfile = NULL;
+ struct stat st;
+ size_t text_size, data_size, n;
+ char *text;
+ unsigned char *data;
+ PyObject *code, *marshalled;
+
+ PyImport_FrozenModules = _PyImport_FrozenModules;
+
+ if (argc != 3) {
+ fprintf(stderr, "need to specify input and output paths\n");
+ return 2;
+ }
+ inpath = argv[1];
+ outpath = argv[2];
+ infile = fopen(inpath, "rb");
+ if (infile == NULL) {
+ fprintf(stderr, "cannot open '%s' for reading\n", inpath);
+ return 1;
+ }
+ if (fstat(fileno(infile), &st)) {
+ fclose(infile);
+ fprintf(stderr, "cannot fstat '%s'\n", inpath);
+ return 1;
+ }
+ text_size = st.st_size;
+ text = (char *) malloc(text_size + 1);
+ if (text == NULL) {
+ fclose(infile);
+ fprintf(stderr, "could not allocate %ld bytes\n", (long) text_size);
+ return 1;
+ }
+ n = fread(text, 1, text_size, infile);
+ fclose(infile);
+ infile = NULL;
+ if (n < text_size) {
+ fprintf(stderr, "read too short: got %ld instead of %ld bytes\n",
+ (long) n, (long) text_size);
+ return 1;
+ }
+ text[text_size] = '\0';
+
+ Py_NoUserSiteDirectory++;
+ Py_NoSiteFlag++;
+ Py_IgnoreEnvironmentFlag++;
+
+ Py_SetProgramName(L"./_freeze_importlib");
+ /* Don't install importlib, since it could execute outdated bytecode. */
+ _Py_InitializeEx_Private(1, 0);
+
+ code = Py_CompileStringExFlags(text, "<frozen importlib._bootstrap>",
+ Py_file_input, NULL, 0);
+ if (code == NULL)
+ goto error;
+ marshalled = PyMarshal_WriteObjectToString(code, Py_MARSHAL_VERSION);
+ Py_DECREF(code);
+ if (marshalled == NULL)
+ goto error;
+
+ assert(PyBytes_CheckExact(marshalled));
+ data = (unsigned char *) PyBytes_AS_STRING(marshalled);
+ data_size = PyBytes_GET_SIZE(marshalled);
+
+ /* Open the file in text mode. The hg checkout should be using the eol extension,
+ which in turn should cause the EOL style match the C library's text mode */
+ outfile = fopen(outpath, "w");
+ if (outfile == NULL) {
+ fprintf(stderr, "cannot open '%s' for writing\n", outpath);
+ return 1;
+ }
+ fprintf(outfile, "%s\n", header);
+ fprintf(outfile, "unsigned char _Py_M__importlib[] = {\n");
+ for (n = 0; n < data_size; n += 16) {
+ size_t i, end = Py_MIN(n + 16, data_size);
+ fprintf(outfile, " ");
+ for (i = n; i < end; i++) {
+ fprintf(outfile, "%d,", (unsigned int) data[i]);
+ }
+ fprintf(outfile, "\n");
+ }
+ fprintf(outfile, "};\n");
+
+ Py_DECREF(marshalled);
+
+ Py_Finalize();
+ if (infile)
+ fclose(infile);
+ if (outfile) {
+ if (ferror(outfile)) {
+ fprintf(stderr, "error when writing to '%s'\n", outpath);
+ fclose(outfile);
+ return 1;
+ }
+ fclose(outfile);
+ }
+ return 0;
+
+error:
+ PyErr_Print();
+ Py_Finalize();
+ if (infile)
+ fclose(infile);
+ if (outfile)
+ fclose(outfile);
+ return 1;
+}
diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
index d8a283b..3ff07bc 100644
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -155,44 +155,8 @@ static PyMemberDef partial_memberlist[] = {
{NULL} /* Sentinel */
};
-static PyObject *
-partial_get_dict(partialobject *pto)
-{
- if (pto->dict == NULL) {
- pto->dict = PyDict_New();
- if (pto->dict == NULL)
- return NULL;
- }
- Py_INCREF(pto->dict);
- return pto->dict;
-}
-
-static int
-partial_set_dict(partialobject *pto, PyObject *value)
-{
- PyObject *tmp;
-
- /* It is illegal to del p.__dict__ */
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "a partial object's dictionary may not be deleted");
- return -1;
- }
- /* Can only set __dict__ to a dictionary */
- if (!PyDict_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "setting partial object's dictionary to a non-dict");
- return -1;
- }
- tmp = pto->dict;
- Py_INCREF(value);
- pto->dict = value;
- Py_XDECREF(tmp);
- return 0;
-}
-
static PyGetSetDef partial_getsetlist[] = {
- {"__dict__", (getter)partial_get_dict, (setter)partial_set_dict},
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{NULL} /* Sentinel */
};
@@ -330,6 +294,176 @@ static PyTypeObject partial_type = {
};
+/* cmp_to_key ***************************************************************/
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *cmp;
+ PyObject *object;
+} keyobject;
+
+static void
+keyobject_dealloc(keyobject *ko)
+{
+ Py_DECREF(ko->cmp);
+ Py_XDECREF(ko->object);
+ PyObject_FREE(ko);
+}
+
+static int
+keyobject_traverse(keyobject *ko, visitproc visit, void *arg)
+{
+ Py_VISIT(ko->cmp);
+ if (ko->object)
+ Py_VISIT(ko->object);
+ return 0;
+}
+
+static int
+keyobject_clear(keyobject *ko)
+{
+ Py_CLEAR(ko->cmp);
+ if (ko->object)
+ Py_CLEAR(ko->object);
+ return 0;
+}
+
+static PyMemberDef keyobject_members[] = {
+ {"obj", T_OBJECT,
+ offsetof(keyobject, object), 0,
+ PyDoc_STR("Value wrapped by a key function.")},
+ {NULL}
+};
+
+static PyObject *
+keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds);
+
+static PyObject *
+keyobject_richcompare(PyObject *ko, PyObject *other, int op);
+
+static PyTypeObject keyobject_type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "functools.KeyWrapper", /* tp_name */
+ sizeof(keyobject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)keyobject_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ (ternaryfunc)keyobject_call, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)keyobject_traverse, /* tp_traverse */
+ (inquiry)keyobject_clear, /* tp_clear */
+ keyobject_richcompare, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ keyobject_members, /* tp_members */
+ 0, /* tp_getset */
+};
+
+static PyObject *
+keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds)
+{
+ PyObject *object;
+ keyobject *result;
+ static char *kwargs[] = {"obj", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:K", kwargs, &object))
+ return NULL;
+ result = PyObject_New(keyobject, &keyobject_type);
+ if (!result)
+ return NULL;
+ Py_INCREF(ko->cmp);
+ result->cmp = ko->cmp;
+ Py_INCREF(object);
+ result->object = object;
+ return (PyObject *)result;
+}
+
+static PyObject *
+keyobject_richcompare(PyObject *ko, PyObject *other, int op)
+{
+ PyObject *res;
+ PyObject *args;
+ PyObject *x;
+ PyObject *y;
+ PyObject *compare;
+ PyObject *answer;
+ static PyObject *zero;
+
+ if (zero == NULL) {
+ zero = PyLong_FromLong(0);
+ if (!zero)
+ return NULL;
+ }
+
+ if (Py_TYPE(other) != &keyobject_type){
+ PyErr_Format(PyExc_TypeError, "other argument must be K instance");
+ return NULL;
+ }
+ compare = ((keyobject *) ko)->cmp;
+ assert(compare != NULL);
+ x = ((keyobject *) ko)->object;
+ y = ((keyobject *) other)->object;
+ if (!x || !y){
+ PyErr_Format(PyExc_AttributeError, "object");
+ return NULL;
+ }
+
+ /* Call the user's comparison function and translate the 3-way
+ * result into true or false (or error).
+ */
+ args = PyTuple_New(2);
+ if (args == NULL)
+ return NULL;
+ Py_INCREF(x);
+ Py_INCREF(y);
+ PyTuple_SET_ITEM(args, 0, x);
+ PyTuple_SET_ITEM(args, 1, y);
+ res = PyObject_Call(compare, args, NULL);
+ Py_DECREF(args);
+ if (res == NULL)
+ return NULL;
+ answer = PyObject_RichCompare(res, zero, op);
+ Py_DECREF(res);
+ return answer;
+}
+
+static PyObject *
+functools_cmp_to_key(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *cmp;
+ static char *kwargs[] = {"mycmp", NULL};
+ keyobject *object;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:cmp_to_key", kwargs, &cmp))
+ return NULL;
+ object = PyObject_New(keyobject, &keyobject_type);
+ if (!object)
+ return NULL;
+ Py_INCREF(cmp);
+ object->cmp = cmp;
+ object->object = NULL;
+ return (PyObject *)object;
+}
+
+PyDoc_STRVAR(functools_cmp_to_key_doc,
+"Convert a cmp= function into a key= function.");
+
/* reduce (used to be a builtin) ********************************************/
static PyObject *
@@ -413,6 +547,8 @@ PyDoc_STRVAR(module_doc,
static PyMethodDef module_methods[] = {
{"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc},
+ {"cmp_to_key", (PyCFunction)functools_cmp_to_key,
+ METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/_gestalt.c b/Modules/_gestalt.c
index a45780f..cd30683 100644
--- a/Modules/_gestalt.c
+++ b/Modules/_gestalt.c
@@ -33,7 +33,7 @@ static int
convert_to_OSType(PyObject *v, OSType *pr)
{
uint32_t tmp;
- if (!PyUnicode_Check(v) || PyUnicode_GetSize(v) != 4) {
+ if (!PyUnicode_Check(v) || PyUnicode_GetLength(v) != 4) {
PyErr_SetString(PyExc_TypeError,
"OSType arg must be string of 4 chars");
return 0;
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index dd4317f..d37689e 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -201,13 +201,11 @@ EVP_hexdigest(EVPobject *self, PyObject *unused)
/* Make hex version of the digest */
for(i=j=0; i<digest_size; i++) {
- char c;
+ unsigned char c;
c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
}
retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2);
PyMem_Free(hex_digest);
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index e18aec6..d3a87e7 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -1,9 +1,9 @@
/*
An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"
-
+
Classes defined here: UnsupportedOperation, BlockingIOError.
Functions defined here: open().
-
+
Mostly written by Amaury Forgeot d'Arc
*/
@@ -36,6 +36,7 @@ PyObject *_PyIO_str_nl;
PyObject *_PyIO_str_read;
PyObject *_PyIO_str_read1;
PyObject *_PyIO_str_readable;
+PyObject *_PyIO_str_readall;
PyObject *_PyIO_str_readinto;
PyObject *_PyIO_str_readline;
PyObject *_PyIO_str_reset;
@@ -90,94 +91,11 @@ PyDoc_STRVAR(module_doc,
/*
- * BlockingIOError extends IOError
- */
-
-static int
-blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args,
- PyObject *kwds)
-{
- PyObject *myerrno = NULL, *strerror = NULL;
- PyObject *baseargs = NULL;
- Py_ssize_t written = 0;
-
- assert(PyTuple_Check(args));
-
- self->written = 0;
- if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError",
- &myerrno, &strerror, &written))
- return -1;
-
- baseargs = PyTuple_Pack(2, myerrno, strerror);
- if (baseargs == NULL)
- return -1;
- /* This will take care of initializing of myerrno and strerror members */
- if (((PyTypeObject *)PyExc_IOError)->tp_init(
- (PyObject *)self, baseargs, kwds) == -1) {
- Py_DECREF(baseargs);
- return -1;
- }
- Py_DECREF(baseargs);
-
- self->written = written;
- return 0;
-}
-
-static PyMemberDef blockingioerror_members[] = {
- {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0},
- {NULL} /* Sentinel */
-};
-
-static PyTypeObject _PyExc_BlockingIOError = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "BlockingIOError", /*tp_name*/
- sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare */
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- PyDoc_STR("Exception raised when I/O would block "
- "on a non-blocking I/O stream"), /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- blockingioerror_members, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)blockingioerror_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
-};
-PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError;
-
-
-/*
* The main open() function
*/
PyDoc_STRVAR(open_doc,
"open(file, mode='r', buffering=-1, encoding=None,\n"
-" errors=None, newline=None, closefd=True) -> file object\n"
+" errors=None, newline=None, closefd=True, opener=None) -> file object\n"
"\n"
"Open file and return a stream. Raise IOError upon failure.\n"
"\n"
@@ -190,18 +108,20 @@ PyDoc_STRVAR(open_doc,
"mode is an optional string that specifies the mode in which the file\n"
"is opened. It defaults to 'r' which means open for reading in text\n"
"mode. Other common values are 'w' for writing (truncating the file if\n"
-"it already exists), and 'a' for appending (which on some Unix systems,\n"
-"means that all writes append to the end of the file regardless of the\n"
-"current seek position). In text mode, if encoding is not specified the\n"
-"encoding used is platform dependent. (For reading and writing raw\n"
-"bytes use binary mode and leave encoding unspecified.) The available\n"
-"modes are:\n"
+"it already exists), 'x' for creating and writing to a new file, and\n"
+"'a' for appending (which on some Unix systems, means that all writes\n"
+"append to the end of the file regardless of the current seek position).\n"
+"In text mode, if encoding is not specified the encoding used is platform\n"
+"dependent: locale.getpreferredencoding(False) is called to get the\n"
+"current locale encoding. (For reading and writing raw bytes use binary\n"
+"mode and leave encoding unspecified.) The available modes are:\n"
"\n"
"========= ===============================================================\n"
"Character Meaning\n"
"--------- ---------------------------------------------------------------\n"
"'r' open for reading (default)\n"
"'w' open for writing, truncating the file first\n"
+"'x' create a new file and open it for writing\n"
"'a' open for writing, appending to the end of the file if it exists\n"
"'b' binary mode\n"
"'t' text mode (default)\n"
@@ -212,7 +132,8 @@ PyDoc_STRVAR(open_doc,
"\n"
"The default mode is 'rt' (open for reading text). For binary random\n"
"access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
-"'r+b' opens the file without truncation.\n"
+"'r+b' opens the file without truncation. The 'x' mode implies 'w' and\n"
+"raises an `FileExistsError` if the file already exists.\n"
"\n"
"Python distinguishes between files opened in binary and text modes,\n"
"even when the underlying operating system doesn't. Files opened in\n"
@@ -272,6 +193,12 @@ PyDoc_STRVAR(open_doc,
"when the file is closed. This does not work when a file name is given\n"
"and must be True in that case.\n"
"\n"
+"A custom opener can be used by passing a callable as *opener*. The\n"
+"underlying file descriptor for the file object is then obtained by\n"
+"calling *opener* with (*file*, *flags*). *opener* must return an open\n"
+"file descriptor (passing os.open as *opener* results in functionality\n"
+"similar to passing None).\n"
+"\n"
"open() returns a file object whose type depends on the mode, and\n"
"through which the standard file operations such as reading and writing\n"
"are performed. When open() is used to open a file in a text mode ('w',\n"
@@ -292,25 +219,29 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
{
char *kwlist[] = {"file", "mode", "buffering",
"encoding", "errors", "newline",
- "closefd", NULL};
- PyObject *file;
+ "closefd", "opener", NULL};
+ PyObject *file, *opener = Py_None;
char *mode = "r";
int buffering = -1, closefd = 1;
char *encoding = NULL, *errors = NULL, *newline = NULL;
unsigned i;
- int reading = 0, writing = 0, appending = 0, updating = 0;
+ int creating = 0, reading = 0, writing = 0, appending = 0, updating = 0;
int text = 0, binary = 0, universal = 0;
- char rawmode[5], *m;
+ char rawmode[6], *m;
int line_buffering, isatty;
PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist,
+ _Py_IDENTIFIER(isatty);
+ _Py_IDENTIFIER(fileno);
+ _Py_IDENTIFIER(mode);
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist,
&file, &mode, &buffering,
&encoding, &errors, &newline,
- &closefd)) {
+ &closefd, &opener)) {
return NULL;
}
@@ -326,6 +257,9 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
char c = mode[i];
switch (c) {
+ case 'x':
+ creating = 1;
+ break;
case 'r':
reading = 1;
break;
@@ -362,6 +296,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
}
m = rawmode;
+ if (creating) *(m++) = 'x';
if (reading) *(m++) = 'r';
if (writing) *(m++) = 'w';
if (appending) *(m++) = 'a';
@@ -384,9 +319,9 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
return NULL;
}
- if (reading + writing + appending > 1) {
+ if (creating + reading + writing + appending > 1) {
PyErr_SetString(PyExc_ValueError,
- "must have exactly one of read/write/append mode");
+ "must have exactly one of create/read/write/append mode");
return NULL;
}
@@ -410,7 +345,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
/* Create the Raw file stream */
raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
- "Osi", file, rawmode, closefd);
+ "OsiO", file, rawmode, closefd, opener);
if (raw == NULL)
return NULL;
@@ -420,7 +355,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
/* buffering */
{
- PyObject *res = PyObject_CallMethod(raw, "isatty", NULL);
+ PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
if (res == NULL)
goto error;
isatty = PyLong_AsLong(res);
@@ -442,7 +377,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
{
struct stat st;
long fileno;
- PyObject *res = PyObject_CallMethod(raw, "fileno", NULL);
+ PyObject *res = _PyObject_CallMethodId(raw, &PyId_fileno, NULL);
if (res == NULL)
goto error;
@@ -480,7 +415,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
if (updating)
Buffered_class = (PyObject *)&PyBufferedRandom_Type;
- else if (writing || appending)
+ else if (creating || writing || appending)
Buffered_class = (PyObject *)&PyBufferedWriter_Type;
else if (reading)
Buffered_class = (PyObject *)&PyBufferedReader_Type;
@@ -513,7 +448,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
if (wrapper == NULL)
goto error;
- if (PyObject_SetAttrString(wrapper, "mode", modeobj) < 0)
+ if (_PyObject_SetAttrId(wrapper, &PyId_mode, modeobj) < 0)
goto error;
Py_DECREF(modeobj);
return wrapper;
@@ -576,7 +511,7 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err)
/* Basically the "n" format code with the ability to turn None into -1. */
-int
+int
_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
Py_ssize_t limit;
if (obj == Py_None) {
@@ -603,7 +538,6 @@ iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
_PyIO_State *state = IO_MOD_STATE(mod);
if (!state->initialized)
return 0;
- Py_VISIT(state->os_module);
if (state->locale_module != NULL) {
Py_VISIT(state->locale_module);
}
@@ -617,7 +551,6 @@ iomodule_clear(PyObject *mod) {
_PyIO_State *state = IO_MOD_STATE(mod);
if (!state->initialized)
return 0;
- Py_CLEAR(state->os_module);
if (state->locale_module != NULL)
Py_CLEAR(state->locale_module);
Py_CLEAR(state->unsupported_operation);
@@ -661,11 +594,6 @@ PyInit__io(void)
state = IO_MOD_STATE(m);
state->initialized = 0;
- /* put os in the module state */
- state->os_module = PyImport_ImportModule("os");
- if (state->os_module == NULL)
- goto fail;
-
#define ADD_TYPE(type, name) \
if (PyType_Ready(type) < 0) \
goto fail; \
@@ -690,9 +618,11 @@ PyInit__io(void)
state->unsupported_operation) < 0)
goto fail;
- /* BlockingIOError */
- _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;
- ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");
+ /* BlockingIOError, for compatibility */
+ Py_INCREF(PyExc_BlockingIOError);
+ if (PyModule_AddObject(m, "BlockingIOError",
+ (PyObject *) PyExc_BlockingIOError) < 0)
+ goto fail;
/* Concrete base types of the IO ABCs.
(the ABCs themselves are declared through inheritance in io.py)
@@ -758,6 +688,7 @@ PyInit__io(void)
ADD_INTERNED(read)
ADD_INTERNED(read1)
ADD_INTERNED(readable)
+ ADD_INTERNED(readall)
ADD_INTERNED(readinto)
ADD_INTERNED(readline)
ADD_INTERNED(reset)
@@ -788,7 +719,6 @@ PyInit__io(void)
return m;
fail:
- Py_XDECREF(state->os_module);
Py_XDECREF(state->unsupported_operation);
Py_DECREF(m);
return NULL;
diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h
index aa8bfd6..0fe90a3 100644
--- a/Modules/_io/_iomodule.h
+++ b/Modules/_io/_iomodule.h
@@ -50,12 +50,12 @@ extern PyObject *_PyIncrementalNewlineDecoder_decode(
`*consumed`.
If not found, returns -1 and sets `*consumed` to the number of characters
which can be safely put aside until another search.
-
- NOTE: for performance reasons, `end` must point to a NUL character ('\0').
+
+ NOTE: for performance reasons, `end` must point to a NUL character ('\0').
Otherwise, the function will scan further and return garbage. */
extern Py_ssize_t _PyIO_find_line_ending(
int translated, int universal, PyObject *readnl,
- Py_UNICODE *start, Py_UNICODE *end, Py_ssize_t *consumed);
+ int kind, char *start, char *end, Py_ssize_t *consumed);
/* Return 1 if an EnvironmentError with errno == EINTR is set (and then
clears the error indicator), 0 otherwise.
@@ -65,15 +65,6 @@ extern int _PyIO_trap_eintr(void);
#define DEFAULT_BUFFER_SIZE (8 * 1024) /* bytes */
-typedef struct {
- PyException_HEAD
- PyObject *myerrno;
- PyObject *strerror;
- PyObject *filename; /* Not used, but part of the IOError object */
- Py_ssize_t written;
-} PyBlockingIOErrorObject;
-extern PyObject *PyExc_BlockingIOError;
-
/*
* Offset type for positioning.
*/
@@ -138,7 +129,6 @@ extern PyModuleDef _PyIO_Module;
typedef struct {
int initialized;
- PyObject *os_module;
PyObject *locale_module;
PyObject *unsupported_operation;
@@ -160,6 +150,7 @@ extern PyObject *_PyIO_str_nl;
extern PyObject *_PyIO_str_read;
extern PyObject *_PyIO_str_read1;
extern PyObject *_PyIO_str_readable;
+extern PyObject *_PyIO_str_readall;
extern PyObject *_PyIO_str_readinto;
extern PyObject *_PyIO_str_readline;
extern PyObject *_PyIO_str_reset;
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index bb77acc..334734b 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -1,9 +1,9 @@
/*
An implementation of Buffered I/O as defined by PEP 3116 - "New I/O"
-
+
Classes defined here: BufferedIOBase, BufferedReader, BufferedWriter,
BufferedRandom.
-
+
Written by Amaury Forgeot d'Arc and Antoine Pitrou
*/
@@ -13,6 +13,20 @@
#include "pythread.h"
#include "_iomodule.h"
+_Py_IDENTIFIER(close);
+_Py_IDENTIFIER(_dealloc_warn);
+_Py_IDENTIFIER(flush);
+_Py_IDENTIFIER(isatty);
+_Py_IDENTIFIER(mode);
+_Py_IDENTIFIER(name);
+_Py_IDENTIFIER(peek);
+_Py_IDENTIFIER(read);
+_Py_IDENTIFIER(read1);
+_Py_IDENTIFIER(readable);
+_Py_IDENTIFIER(readinto);
+_Py_IDENTIFIER(writable);
+_Py_IDENTIFIER(write);
+
/*
* BufferedIOBase class, inherits from IOBase.
*/
@@ -38,12 +52,13 @@ bufferediobase_readinto(PyObject *self, PyObject *args)
Py_buffer buf;
Py_ssize_t len;
PyObject *data;
+ _Py_IDENTIFIER(read);
if (!PyArg_ParseTuple(args, "w*:readinto", &buf)) {
return NULL;
}
- data = PyObject_CallMethod(self, "read", "n", buf.len);
+ data = _PyObject_CallMethodId(self, &PyId_read, "n", buf.len);
if (data == NULL)
goto error;
@@ -198,7 +213,7 @@ typedef struct {
int readable;
int writable;
int deallocating;
-
+
/* True if this is a vanilla Buffered object (rather than a user derived
class) *and* the raw stream is a vanilla FileIO object. */
int fast_closed_checks;
@@ -237,7 +252,7 @@ typedef struct {
/*
Implementation notes:
-
+
* BufferedReader, BufferedWriter and BufferedRandom try to share most
methods (this is helped by the members `readable` and `writable`, which
are initialized in the respective constructors)
@@ -255,7 +270,7 @@ typedef struct {
NOTE: we should try to maintain block alignment of reads and writes to the
raw stream (according to the buffer size), but for now it is only done
in read() and friends.
-
+
*/
/* These macros protect the buffered object against concurrent operations. */
@@ -421,7 +436,7 @@ buffered_dealloc_warn(buffered *self, PyObject *source)
{
if (self->ok && self->raw) {
PyObject *r;
- r = PyObject_CallMethod(self->raw, "_dealloc_warn", "O", source);
+ r = _PyObject_CallMethodId(self->raw, &PyId__dealloc_warn, "O", source);
if (r)
Py_DECREF(r);
else
@@ -554,14 +569,14 @@ static PyObject *
buffered_name_get(buffered *self, void *context)
{
CHECK_INITIALIZED(self)
- return PyObject_GetAttrString(self->raw, "name");
+ return _PyObject_GetAttrId(self->raw, &PyId_name);
}
static PyObject *
buffered_mode_get(buffered *self, void *context)
{
CHECK_INITIALIZED(self)
- return PyObject_GetAttrString(self->raw, "mode");
+ return _PyObject_GetAttrId(self->raw, &PyId_mode);
}
/* Lower-level APIs */
@@ -600,14 +615,15 @@ _bufferedreader_reset_buf(buffered *self);
static void
_bufferedwriter_reset_buf(buffered *self);
static PyObject *
-_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t);
+_bufferedreader_peek_unlocked(buffered *self);
static PyObject *
_bufferedreader_read_all(buffered *self);
static PyObject *
_bufferedreader_read_fast(buffered *self, Py_ssize_t);
static PyObject *
_bufferedreader_read_generic(buffered *self, Py_ssize_t);
-
+static Py_ssize_t
+_bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len);
/*
* Helpers
@@ -631,14 +647,14 @@ static Py_ssize_t *
_buffered_check_blocking_error(void)
{
PyObject *t, *v, *tb;
- PyBlockingIOErrorObject *err;
+ PyOSErrorObject *err;
PyErr_Fetch(&t, &v, &tb);
if (v == NULL || !PyErr_GivenExceptionMatches(v, PyExc_BlockingIOError)) {
PyErr_Restore(t, v, tb);
return NULL;
}
- err = (PyBlockingIOErrorObject *) v;
+ err = (PyOSErrorObject *) v;
/* TODO: sanity check (err->written >= 0) */
PyErr_Restore(t, v, tb);
return &err->written;
@@ -658,7 +674,7 @@ _buffered_raw_tell(buffered *self)
if (!PyErr_Occurred())
PyErr_Format(PyExc_IOError,
"Raw stream returned invalid position %" PY_PRIdOFF,
- (PY_OFF_T_COMPAT)n);
+ (PY_OFF_T_COMPAT)n);
return -1;
}
self->abs_pos = n;
@@ -691,7 +707,7 @@ _buffered_raw_seek(buffered *self, Py_off_t target, int whence)
if (!PyErr_Occurred())
PyErr_Format(PyExc_IOError,
"Raw stream returned invalid position %" PY_PRIdOFF,
- (PY_OFF_T_COMPAT)n);
+ (PY_OFF_T_COMPAT)n);
return -1;
}
self->abs_pos = n;
@@ -832,7 +848,7 @@ buffered_peek(buffered *self, PyObject *args)
goto end;
Py_CLEAR(res);
}
- res = _bufferedreader_peek_unlocked(self, n);
+ res = _bufferedreader_peek_unlocked(self);
end:
LEAVE_BUFFERED(self)
@@ -896,61 +912,112 @@ buffered_read1(buffered *self, PyObject *args)
if (n == 0)
return PyBytes_FromStringAndSize(NULL, 0);
- if (!ENTER_BUFFERED(self))
- return NULL;
-
/* Return up to n bytes. If at least one byte is buffered, we
only return buffered bytes. Otherwise, we do one raw read. */
- /* XXX: this mimicks the io.py implementation but is probably wrong.
- If we need to read from the raw stream, then we could actually read
- all `n` bytes asked by the caller (and possibly more, so as to fill
- our buffer for the next reads). */
-
have = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
if (have > 0) {
- if (n > have)
- n = have;
- res = PyBytes_FromStringAndSize(self->buffer + self->pos, n);
- if (res == NULL)
- goto end;
- self->pos += n;
- goto end;
+ n = Py_MIN(have, n);
+ res = _bufferedreader_read_fast(self, n);
+ assert(res != Py_None);
+ return res;
}
-
- if (self->writable) {
- res = buffered_flush_and_rewind_unlocked(self);
- if (res == NULL)
- goto end;
+ res = PyBytes_FromStringAndSize(NULL, n);
+ if (res == NULL)
+ return NULL;
+ if (!ENTER_BUFFERED(self)) {
Py_DECREF(res);
+ return NULL;
}
-
- /* Fill the buffer from the raw stream, and copy it to the result. */
_bufferedreader_reset_buf(self);
- r = _bufferedreader_fill_buffer(self);
- if (r == -1)
- goto end;
+ r = _bufferedreader_raw_read(self, PyBytes_AS_STRING(res), n);
+ LEAVE_BUFFERED(self)
+ if (r == -1) {
+ Py_DECREF(res);
+ return NULL;
+ }
if (r == -2)
r = 0;
if (n > r)
- n = r;
- res = PyBytes_FromStringAndSize(self->buffer, n);
- if (res == NULL)
- goto end;
- self->pos = n;
-
-end:
- LEAVE_BUFFERED(self)
+ _PyBytes_Resize(&res, r);
return res;
}
static PyObject *
buffered_readinto(buffered *self, PyObject *args)
{
+ Py_buffer buf;
+ Py_ssize_t n, written = 0, remaining;
+ PyObject *res = NULL;
+
CHECK_INITIALIZED(self)
-
- /* TODO: use raw.readinto() (or a direct copy from our buffer) instead! */
- return bufferediobase_readinto((PyObject *)self, args);
+
+ if (!PyArg_ParseTuple(args, "w*:readinto", &buf))
+ return NULL;
+
+ n = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
+ if (n > 0) {
+ if (n >= buf.len) {
+ memcpy(buf.buf, self->buffer + self->pos, buf.len);
+ self->pos += buf.len;
+ res = PyLong_FromSsize_t(buf.len);
+ goto end_unlocked;
+ }
+ memcpy(buf.buf, self->buffer + self->pos, n);
+ self->pos += n;
+ written = n;
+ }
+
+ if (!ENTER_BUFFERED(self))
+ goto end_unlocked;
+
+ if (self->writable) {
+ res = buffered_flush_and_rewind_unlocked(self);
+ if (res == NULL)
+ goto end;
+ Py_CLEAR(res);
+ }
+
+ _bufferedreader_reset_buf(self);
+ self->pos = 0;
+
+ for (remaining = buf.len - written;
+ remaining > 0;
+ written += n, remaining -= n) {
+ /* If remaining bytes is larger than internal buffer size, copy
+ * directly into caller's buffer. */
+ if (remaining > self->buffer_size) {
+ n = _bufferedreader_raw_read(self, (char *) buf.buf + written,
+ remaining);
+ }
+ else {
+ n = _bufferedreader_fill_buffer(self);
+ if (n > 0) {
+ if (n > remaining)
+ n = remaining;
+ memcpy((char *) buf.buf + written,
+ self->buffer + self->pos, n);
+ self->pos += n;
+ continue; /* short circuit */
+ }
+ }
+ if (n == 0 || (n == -2 && written > 0))
+ break;
+ if (n < 0) {
+ if (n == -2) {
+ Py_INCREF(Py_None);
+ res = Py_None;
+ }
+ goto end;
+ }
+ }
+ res = PyLong_FromSsize_t(written);
+
+end:
+ LEAVE_BUFFERED(self);
+end_unlocked:
+ PyBuffer_Release(&buf);
+ return res;
}
static PyObject *
@@ -1101,9 +1168,20 @@ buffered_seek(buffered *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O|i:seek", &targetobj, &whence)) {
return NULL;
}
- if (whence < 0 || whence > 2) {
+
+ /* Do some error checking instead of trusting OS 'seek()'
+ ** error detection, just in case.
+ */
+ if ((whence < 0 || whence >2)
+#ifdef SEEK_HOLE
+ && (whence != SEEK_HOLE)
+#endif
+#ifdef SEEK_DATA
+ && (whence != SEEK_DATA)
+#endif
+ ) {
PyErr_Format(PyExc_ValueError,
- "whence must be between 0 and 2, not %d", whence);
+ "whence value %d unsupported", whence);
return NULL;
}
@@ -1116,7 +1194,11 @@ buffered_seek(buffered *self, PyObject *args)
if (target == -1 && PyErr_Occurred())
return NULL;
- if (whence != 2 && self->readable) {
+ /* SEEK_SET and SEEK_CUR are special because we could seek inside the
+ buffer. Other whence values must be managed without this optimization.
+ Some Operating Systems can provide additional values, like
+ SEEK_HOLE/SEEK_DATA. */
+ if (((whence == 0) || (whence == 1)) && self->readable) {
Py_off_t current, avail;
/* Check if seeking leaves us inside the current buffer,
so as to return quickly if possible. Also, we needn't take the
@@ -1242,7 +1324,7 @@ buffered_repr(buffered *self)
{
PyObject *nameobj, *res;
- nameobj = PyObject_GetAttrString((PyObject *) self, "name");
+ nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -1368,33 +1450,60 @@ static PyObject *
_bufferedreader_read_all(buffered *self)
{
Py_ssize_t current_size;
- PyObject *res, *data = NULL;
- PyObject *chunks = PyList_New(0);
-
- if (chunks == NULL)
- return NULL;
+ PyObject *res, *data = NULL, *chunk, *chunks;
/* First copy what we have in the current buffer. */
current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
if (current_size) {
data = PyBytes_FromStringAndSize(
self->buffer + self->pos, current_size);
- if (data == NULL) {
- Py_DECREF(chunks);
+ if (data == NULL)
return NULL;
- }
self->pos += current_size;
}
/* We're going past the buffer's bounds, flush it */
if (self->writable) {
res = buffered_flush_and_rewind_unlocked(self);
- if (res == NULL) {
- Py_DECREF(chunks);
+ if (res == NULL)
return NULL;
- }
Py_CLEAR(res);
}
_bufferedreader_reset_buf(self);
+
+ if (PyObject_HasAttr(self->raw, _PyIO_str_readall)) {
+ chunk = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readall, NULL);
+ if (chunk == NULL)
+ return NULL;
+ if (chunk != Py_None && !PyBytes_Check(chunk)) {
+ Py_XDECREF(data);
+ Py_DECREF(chunk);
+ PyErr_SetString(PyExc_TypeError, "readall() should return bytes");
+ return NULL;
+ }
+ if (chunk == Py_None) {
+ if (current_size == 0)
+ return chunk;
+ else {
+ Py_DECREF(chunk);
+ return data;
+ }
+ }
+ else if (current_size) {
+ PyBytes_Concat(&data, chunk);
+ Py_DECREF(chunk);
+ if (data == NULL)
+ return NULL;
+ return data;
+ } else
+ return chunk;
+ }
+
+ chunks = PyList_New(0);
+ if (chunks == NULL) {
+ Py_XDECREF(data);
+ return NULL;
+ }
+
while (1) {
if (data) {
if (PyList_Append(chunks, data) < 0) {
@@ -1556,7 +1665,7 @@ error:
}
static PyObject *
-_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t n)
+_bufferedreader_peek_unlocked(buffered *self)
{
Py_ssize_t have, r;
@@ -1598,6 +1707,7 @@ static PyMethodDef bufferedreader_methods[] = {
{"read", (PyCFunction)buffered_read, METH_VARARGS},
{"peek", (PyCFunction)buffered_peek, METH_VARARGS},
{"read1", (PyCFunction)buffered_read1, METH_VARARGS},
+ {"readinto", (PyCFunction)buffered_readinto, METH_VARARGS},
{"readline", (PyCFunction)buffered_readline, METH_VARARGS},
{"seek", (PyCFunction)buffered_seek, METH_VARARGS},
{"tell", (PyCFunction)buffered_tell, METH_NOARGS},
@@ -1663,15 +1773,6 @@ PyTypeObject PyBufferedReader_Type = {
-static int
-complain_about_max_buffer_size(void)
-{
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "max_buffer_size is deprecated", 1) < 0)
- return 0;
- return 1;
-}
-
/*
* class BufferedWriter
*/
@@ -1680,7 +1781,7 @@ PyDoc_STRVAR(bufferedwriter_doc,
"\n"
"The constructor creates a BufferedWriter for the given writeable raw\n"
"stream. If the buffer_size is not given, it defaults to\n"
- "DEFAULT_BUFFER_SIZE. max_buffer_size isn't used anymore.\n"
+ "DEFAULT_BUFFER_SIZE.\n"
);
static void
@@ -1693,23 +1794,18 @@ _bufferedwriter_reset_buf(buffered *self)
static int
bufferedwriter_init(buffered *self, PyObject *args, PyObject *kwds)
{
- /* TODO: properly deprecate max_buffer_size */
- char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};
+ char *kwlist[] = {"raw", "buffer_size", NULL};
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
- Py_ssize_t max_buffer_size = -234;
PyObject *raw;
self->ok = 0;
self->detached = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|nn:BufferedReader", kwlist,
- &raw, &buffer_size, &max_buffer_size)) {
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:BufferedReader", kwlist,
+ &raw, &buffer_size)) {
return -1;
}
- if (max_buffer_size != -234 && !complain_about_max_buffer_size())
- return -1;
-
if (_PyIOBase_check_writable(raw, Py_True) == NULL)
return -1;
@@ -2091,16 +2187,12 @@ bufferedrwpair_init(rwpair *self, PyObject *args, PyObject *kwds)
{
PyObject *reader, *writer;
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
- Py_ssize_t max_buffer_size = -234;
- if (!PyArg_ParseTuple(args, "OO|nn:BufferedRWPair", &reader, &writer,
- &buffer_size, &max_buffer_size)) {
+ if (!PyArg_ParseTuple(args, "OO|n:BufferedRWPair", &reader, &writer,
+ &buffer_size)) {
return -1;
}
- if (max_buffer_size != -234 && !complain_about_max_buffer_size())
- return -1;
-
if (_PyIOBase_check_readable(reader, Py_True) == NULL)
return -1;
if (_PyIOBase_check_writable(writer, Py_True) == NULL)
@@ -2148,13 +2240,13 @@ bufferedrwpair_dealloc(rwpair *self)
}
static PyObject *
-_forward_call(buffered *self, const char *name, PyObject *args)
+_forward_call(buffered *self, _Py_Identifier *name, PyObject *args)
{
- PyObject *func = PyObject_GetAttrString((PyObject *)self, name);
+ PyObject *func = _PyObject_GetAttrId((PyObject *)self, name);
PyObject *ret;
if (func == NULL) {
- PyErr_SetString(PyExc_AttributeError, name);
+ PyErr_SetString(PyExc_AttributeError, name->string);
return NULL;
}
@@ -2166,66 +2258,66 @@ _forward_call(buffered *self, const char *name, PyObject *args)
static PyObject *
bufferedrwpair_read(rwpair *self, PyObject *args)
{
- return _forward_call(self->reader, "read", args);
+ return _forward_call(self->reader, &PyId_read, args);
}
static PyObject *
bufferedrwpair_peek(rwpair *self, PyObject *args)
{
- return _forward_call(self->reader, "peek", args);
+ return _forward_call(self->reader, &PyId_peek, args);
}
static PyObject *
bufferedrwpair_read1(rwpair *self, PyObject *args)
{
- return _forward_call(self->reader, "read1", args);
+ return _forward_call(self->reader, &PyId_read1, args);
}
static PyObject *
bufferedrwpair_readinto(rwpair *self, PyObject *args)
{
- return _forward_call(self->reader, "readinto", args);
+ return _forward_call(self->reader, &PyId_readinto, args);
}
static PyObject *
bufferedrwpair_write(rwpair *self, PyObject *args)
{
- return _forward_call(self->writer, "write", args);
+ return _forward_call(self->writer, &PyId_write, args);
}
static PyObject *
bufferedrwpair_flush(rwpair *self, PyObject *args)
{
- return _forward_call(self->writer, "flush", args);
+ return _forward_call(self->writer, &PyId_flush, args);
}
static PyObject *
bufferedrwpair_readable(rwpair *self, PyObject *args)
{
- return _forward_call(self->reader, "readable", args);
+ return _forward_call(self->reader, &PyId_readable, args);
}
static PyObject *
bufferedrwpair_writable(rwpair *self, PyObject *args)
{
- return _forward_call(self->writer, "writable", args);
+ return _forward_call(self->writer, &PyId_writable, args);
}
static PyObject *
bufferedrwpair_close(rwpair *self, PyObject *args)
{
- PyObject *ret = _forward_call(self->writer, "close", args);
+ PyObject *ret = _forward_call(self->writer, &PyId_close, args);
if (ret == NULL)
return NULL;
Py_DECREF(ret);
- return _forward_call(self->reader, "close", args);
+ return _forward_call(self->reader, &PyId_close, args);
}
static PyObject *
bufferedrwpair_isatty(rwpair *self, PyObject *args)
{
- PyObject *ret = _forward_call(self->writer, "isatty", args);
+ PyObject *ret = _forward_call(self->writer, &PyId_isatty, args);
if (ret != Py_False) {
/* either True or exception */
@@ -2233,7 +2325,7 @@ bufferedrwpair_isatty(rwpair *self, PyObject *args)
}
Py_DECREF(ret);
- return _forward_call(self->reader, "isatty", args);
+ return _forward_call(self->reader, &PyId_isatty, args);
}
static PyObject *
@@ -2325,28 +2417,24 @@ PyDoc_STRVAR(bufferedrandom_doc,
"\n"
"The constructor creates a reader and writer for a seekable stream,\n"
"raw, given in the first argument. If the buffer_size is omitted it\n"
- "defaults to DEFAULT_BUFFER_SIZE. max_buffer_size isn't used anymore.\n"
+ "defaults to DEFAULT_BUFFER_SIZE.\n"
);
static int
bufferedrandom_init(buffered *self, PyObject *args, PyObject *kwds)
{
- char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};
+ char *kwlist[] = {"raw", "buffer_size", NULL};
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
- Py_ssize_t max_buffer_size = -234;
PyObject *raw;
self->ok = 0;
self->detached = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|nn:BufferedReader", kwlist,
- &raw, &buffer_size, &max_buffer_size)) {
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:BufferedReader", kwlist,
+ &raw, &buffer_size)) {
return -1;
}
- if (max_buffer_size != -234 && !complain_about_max_buffer_size())
- return -1;
-
if (_PyIOBase_check_seekable(raw, Py_True) == NULL)
return -1;
if (_PyIOBase_check_readable(raw, Py_True) == NULL)
diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c
index 4164533..54840bb 100644
--- a/Modules/_io/bytesio.c
+++ b/Modules/_io/bytesio.c
@@ -962,13 +962,11 @@ static int
bytesiobuf_getbuffer(bytesiobuf *obj, Py_buffer *view, int flags)
{
int ret;
- void *ptr;
bytesio *b = (bytesio *) obj->source;
if (view == NULL) {
b->exports++;
return 0;
}
- ptr = (void *) obj;
ret = PyBuffer_FillInfo(view, (PyObject*)obj, b->buf, b->string_size,
0, flags);
if (ret >= 0) {
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index 605ad51..6e0bbee 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -46,6 +46,7 @@
typedef struct {
PyObject_HEAD
int fd;
+ unsigned int created : 1;
unsigned int readable : 1;
unsigned int writable : 1;
signed int seekable : 2; /* -1 means unknown */
@@ -122,6 +123,7 @@ internal_close(fileio *self)
static PyObject *
fileio_close(fileio *self)
{
+ _Py_IDENTIFIER(close);
if (!self->closefd) {
self->fd = -1;
Py_RETURN_NONE;
@@ -137,8 +139,8 @@ fileio_close(fileio *self)
if (errno < 0)
return NULL;
- return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,
- "close", "O", self);
+ return _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type,
+ &PyId_close, "O", self);
}
static PyObject *
@@ -151,6 +153,7 @@ fileio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self = (fileio *) type->tp_alloc(type, 0);
if (self != NULL) {
self->fd = -1;
+ self->created = 0;
self->readable = 0;
self->writable = 0;
self->seekable = -1;
@@ -204,9 +207,9 @@ static int
fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
{
fileio *self = (fileio *) oself;
- static char *kwlist[] = {"file", "mode", "closefd", NULL};
+ static char *kwlist[] = {"file", "mode", "closefd", "opener", NULL};
const char *name = NULL;
- PyObject *nameobj, *stringobj = NULL;
+ PyObject *nameobj, *stringobj = NULL, *opener = Py_None;
char *mode = "r";
char *s;
#ifdef MS_WINDOWS
@@ -230,8 +233,9 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
self->fd = -1;
}
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio",
- kwlist, &nameobj, &mode, &closefd))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|siO:fileio",
+ kwlist, &nameobj, &mode, &closefd,
+ &opener))
return -1;
if (PyFloat_Check(nameobj)) {
@@ -258,9 +262,10 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
PyErr_SetString(PyExc_TypeError, "embedded NUL character");
return -1;
}
- widename = PyUnicode_AS_UNICODE(nameobj);
- }
- if (widename == NULL)
+ widename = PyUnicode_AsUnicode(nameobj);
+ if (widename == NULL)
+ return -1;
+ } else
#endif
if (fd < 0)
{
@@ -273,15 +278,23 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
s = mode;
while (*s) {
switch (*s++) {
- case 'r':
+ case 'x':
if (rwa) {
bad_mode:
PyErr_SetString(PyExc_ValueError,
- "Must have exactly one of read/write/append "
+ "Must have exactly one of create/read/write/append "
"mode and at most one plus");
goto error;
}
rwa = 1;
+ self->created = 1;
+ self->writable = 1;
+ flags |= O_EXCL | O_CREAT;
+ break;
+ case 'r':
+ if (rwa)
+ goto bad_mode;
+ rwa = 1;
self->readable = 1;
break;
case 'w':
@@ -347,20 +360,40 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
goto error;
}
- Py_BEGIN_ALLOW_THREADS
errno = 0;
+ if (opener == Py_None) {
+ Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
- if (widename != NULL)
- self->fd = _wopen(widename, flags, 0666);
- else
+ if (widename != NULL)
+ self->fd = _wopen(widename, flags, 0666);
+ else
#endif
- self->fd = open(name, flags, 0666);
- Py_END_ALLOW_THREADS
+ self->fd = open(name, flags, 0666);
+ Py_END_ALLOW_THREADS
+ } else {
+ PyObject *fdobj = PyObject_CallFunction(
+ opener, "Oi", nameobj, flags);
+ if (fdobj == NULL)
+ goto error;
+ if (!PyLong_Check(fdobj)) {
+ Py_DECREF(fdobj);
+ PyErr_SetString(PyExc_TypeError,
+ "expected integer from opener");
+ goto error;
+ }
+
+ self->fd = PyLong_AsLong(fdobj);
+ Py_DECREF(fdobj);
+ if (self->fd == -1) {
+ goto error;
+ }
+ }
+
fd_is_own = 1;
if (self->fd < 0) {
#ifdef MS_WINDOWS
if (widename != NULL)
- PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);
else
#endif
PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
@@ -529,36 +562,53 @@ fileio_readinto(fileio *self, PyObject *args)
}
static size_t
-new_buffersize(fileio *self, size_t currentsize)
+new_buffersize(fileio *self, size_t currentsize
+#ifdef HAVE_FSTAT
+ , Py_off_t pos, Py_off_t end
+#endif
+ )
{
+ size_t addend;
#ifdef HAVE_FSTAT
- off_t pos, end;
- struct stat st;
- if (fstat(self->fd, &st) == 0) {
- end = st.st_size;
- pos = lseek(self->fd, 0L, SEEK_CUR);
+ if (end != (Py_off_t)-1) {
/* Files claiming a size smaller than SMALLCHUNK may
actually be streaming pseudo-files. In this case, we
apply the more aggressive algorithm below.
*/
if (end >= SMALLCHUNK && end >= pos && pos >= 0) {
/* Add 1 so if the file were to grow we'd notice. */
- return currentsize + end - pos + 1;
+ Py_off_t bufsize = currentsize + end - pos + 1;
+ if (bufsize < PY_SSIZE_T_MAX)
+ return (size_t)bufsize;
+ else
+ return PY_SSIZE_T_MAX;
}
}
#endif
/* Expand the buffer by an amount proportional to the current size,
- giving us amortized linear-time behavior. Use a less-than-double
- growth factor to avoid excessive allocation. */
- return currentsize + (currentsize >> 3) + 6;
+ giving us amortized linear-time behavior. For bigger sizes, use a
+ less-than-double growth factor to avoid excessive allocation. */
+ if (currentsize > 65536)
+ addend = currentsize >> 3;
+ else
+ addend = 256 + currentsize;
+ if (addend < SMALLCHUNK)
+ /* Avoid tiny read() calls. */
+ addend = SMALLCHUNK;
+ return addend + currentsize;
}
static PyObject *
fileio_readall(fileio *self)
{
+#ifdef HAVE_FSTAT
+ struct stat st;
+ Py_off_t pos, end;
+#endif
PyObject *result;
Py_ssize_t total = 0;
int n;
+ size_t newsize;
if (self->fd < 0)
return err_closed();
@@ -569,8 +619,23 @@ fileio_readall(fileio *self)
if (result == NULL)
return NULL;
+#ifdef HAVE_FSTAT
+#if defined(MS_WIN64) || defined(MS_WINDOWS)
+ pos = _lseeki64(self->fd, 0L, SEEK_CUR);
+#else
+ pos = lseek(self->fd, 0L, SEEK_CUR);
+#endif
+ if (fstat(self->fd, &st) == 0)
+ end = st.st_size;
+ else
+ end = (Py_off_t)-1;
+#endif
while (1) {
- size_t newsize = new_buffersize(self, total);
+#ifdef HAVE_FSTAT
+ newsize = new_buffersize(self, total, pos, end);
+#else
+ newsize = new_buffersize(self, total);
+#endif
if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
PyErr_SetString(PyExc_OverflowError,
"unbounded read returned more bytes "
@@ -616,6 +681,9 @@ fileio_readall(fileio *self)
return NULL;
}
total += n;
+#ifdef HAVE_FSTAT
+ pos += n;
+#endif
}
if (PyBytes_GET_SIZE(result) > total) {
@@ -929,6 +997,12 @@ fileio_truncate(fileio *self, PyObject *args)
static char *
mode_string(fileio *self)
{
+ if (self->created) {
+ if (self->readable)
+ return "xb+";
+ else
+ return "xb";
+ }
if (self->readable) {
if (self->writable)
return "rb+";
@@ -942,12 +1016,13 @@ mode_string(fileio *self)
static PyObject *
fileio_repr(fileio *self)
{
+ _Py_IDENTIFIER(name);
PyObject *nameobj, *res;
if (self->fd < 0)
return PyUnicode_FromFormat("<_io.FileIO [closed]>");
- nameobj = PyObject_GetAttrString((PyObject *) self, "name");
+ nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -987,13 +1062,19 @@ fileio_getstate(fileio *self)
PyDoc_STRVAR(fileio_doc,
-"file(name: str[, mode: str]) -> file IO object\n"
+"file(name: str[, mode: str][, opener: None]) -> file IO object\n"
"\n"
-"Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n"
-"writing or appending. The file will be created if it doesn't exist\n"
-"when opened for writing or appending; it will be truncated when\n"
-"opened for writing. Add a '+' to the mode to allow simultaneous\n"
-"reading and writing.");
+"Open a file. The mode can be 'r', 'w', 'x' or 'a' for reading (default),\n"
+"writing, exclusive creation or appending. The file will be created if it\n"
+"doesn't exist when opened for writing or appending; it will be truncated\n"
+"when opened for writing. A `FileExistsError` will be raised if it already\n"
+"exists when opened for creating. Opening a file for creating implies\n"
+"writing so this mode behaves in a similar way to 'w'.Add a '+' to the mode\n"
+"to allow simultaneous reading and writing. A custom opener can be used by\n"
+"passing a callable as *opener*. The underlying file descriptor for the file\n"
+"object is then obtained by calling opener with (*name*, *flags*).\n"
+"*opener* must return an open file descriptor (passing os.open as *opener*\n"
+"results in functionality similar to passing None).");
PyDoc_STRVAR(read_doc,
"read(size: int) -> bytes. read at most size bytes, returned as bytes.\n"
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index ba86146..babb019 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -59,8 +59,9 @@ PyDoc_STRVAR(iobase_doc,
of the IOBase object rather than the virtual `closed` attribute as returned
by whatever subclass. */
+_Py_IDENTIFIER(__IOBase_closed);
#define IS_CLOSED(self) \
- PyObject_HasAttrString(self, "__IOBase_closed")
+ _PyObject_HasAttrId(self, &PyId___IOBase_closed)
/* Internal methods */
static PyObject *
@@ -97,7 +98,9 @@ PyDoc_STRVAR(iobase_tell_doc,
static PyObject *
iobase_tell(PyObject *self, PyObject *args)
{
- return PyObject_CallMethod(self, "seek", "ii", 0, 1);
+ _Py_IDENTIFIER(seek);
+
+ return _PyObject_CallMethodId(self, &PyId_seek, "ii", 0, 1);
}
PyDoc_STRVAR(iobase_truncate_doc,
@@ -156,19 +159,6 @@ iobase_closed_get(PyObject *self, void *context)
return PyBool_FromLong(IS_CLOSED(self));
}
-static PyObject *
-iobase_get_dict(PyObject *self)
-{
- PyObject **dictptr = _PyObject_GetDictPtr(self);
- PyObject *dict;
- assert(dictptr);
- dict = *dictptr;
- if (dict == NULL)
- dict = *dictptr = PyDict_New();
- Py_XINCREF(dict);
- return dict;
-}
-
PyObject *
_PyIOBase_check_closed(PyObject *self, PyObject *args)
{
@@ -190,12 +180,13 @@ static PyObject *
iobase_close(PyObject *self, PyObject *args)
{
PyObject *res;
+ _Py_IDENTIFIER(__IOBase_closed);
if (IS_CLOSED(self))
Py_RETURN_NONE;
res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL);
- PyObject_SetAttrString(self, "__IOBase_closed", Py_True);
+ _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True);
if (res == NULL) {
return NULL;
}
@@ -464,12 +455,14 @@ iobase_readline(PyObject *self, PyObject *args)
int has_peek = 0;
PyObject *buffer, *result;
Py_ssize_t old_size = -1;
+ _Py_IDENTIFIER(read);
+ _Py_IDENTIFIER(peek);
if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
return NULL;
}
- if (PyObject_HasAttrString(self, "peek"))
+ if (_PyObject_HasAttrId(self, &PyId_peek))
has_peek = 1;
buffer = PyByteArray_FromStringAndSize(NULL, 0);
@@ -481,7 +474,7 @@ iobase_readline(PyObject *self, PyObject *args)
PyObject *b;
if (has_peek) {
- PyObject *readahead = PyObject_CallMethod(self, "peek", "i", 1);
+ PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1);
if (readahead == NULL) {
/* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
when EINTR occurs so we needn't do it ourselves. */
@@ -521,7 +514,7 @@ iobase_readline(PyObject *self, PyObject *args)
Py_DECREF(readahead);
}
- b = PyObject_CallMethod(self, "read", "n", nreadahead);
+ b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead);
if (b == NULL) {
/* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
when EINTR occurs so we needn't do it ourselves. */
@@ -613,7 +606,9 @@ iobase_readlines(PyObject *self, PyObject *args)
/* XXX special-casing this made sense in the Python version in order
to remove the bytecode interpretation overhead, but it could
probably be removed here. */
- PyObject *ret = PyObject_CallMethod(result, "extend", "O", self);
+ _Py_IDENTIFIER(extend);
+ PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self);
+
if (ret == NULL) {
Py_DECREF(result);
return NULL;
@@ -716,7 +711,7 @@ static PyMethodDef iobase_methods[] = {
};
static PyGetSetDef iobase_getset[] = {
- {"__dict__", (getter)iobase_get_dict, NULL, NULL},
+ {"__dict__", PyObject_GenericGetDict, NULL, NULL},
{"closed", (getter)iobase_closed_get, NULL, NULL},
{NULL}
};
@@ -793,8 +788,11 @@ rawiobase_read(PyObject *self, PyObject *args)
return NULL;
}
- if (n < 0)
- return PyObject_CallMethod(self, "readall", NULL);
+ if (n < 0) {
+ _Py_IDENTIFIER(readall);
+
+ return _PyObject_CallMethodId(self, &PyId_readall, NULL);
+ }
/* TODO: allocate a bytes object directly instead and manually construct
a writable memoryview pointing to it. */
@@ -835,8 +833,9 @@ rawiobase_readall(PyObject *self, PyObject *args)
return NULL;
while (1) {
- PyObject *data = PyObject_CallMethod(self, "read",
- "i", DEFAULT_BUFFER_SIZE);
+ _Py_IDENTIFIER(read);
+ PyObject *data = _PyObject_CallMethodId(self, &PyId_read,
+ "i", DEFAULT_BUFFER_SIZE);
if (!data) {
/* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
when EINTR occurs so we needn't do it ourselves. */
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index 1f1fa40..9d73884 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -1,19 +1,32 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "structmember.h"
+#include "accu.h"
#include "_iomodule.h"
/* Implementation note: the buffer is always at least one character longer
than the enclosed string, for proper functioning of _PyIO_find_line_ending.
*/
+#define STATE_REALIZED 1
+#define STATE_ACCUMULATING 2
+
typedef struct {
PyObject_HEAD
- Py_UNICODE *buf;
+ Py_UCS4 *buf;
Py_ssize_t pos;
Py_ssize_t string_size;
size_t buf_size;
+ /* The stringio object can be in two states: accumulating or realized.
+ In accumulating state, the internal buffer contains nothing and
+ the contents are given by the embedded _PyAccu structure.
+ In realized state, the internal buffer is meaningful and the
+ _PyAccu is destroyed.
+ */
+ int state;
+ _PyAccu accu;
+
char ok; /* initialized? */
char closed;
char readuniversal;
@@ -21,7 +34,7 @@ typedef struct {
PyObject *decoder;
PyObject *readnl;
PyObject *writenl;
-
+
PyObject *dict;
PyObject *weakreflist;
} stringio;
@@ -40,6 +53,11 @@ typedef struct {
return NULL; \
}
+#define ENSURE_REALIZED(self) \
+ if (realize(self) < 0) { \
+ return NULL; \
+ }
+
PyDoc_STRVAR(stringio_doc,
"Text I/O implementation using an in-memory buffer.\n"
"\n"
@@ -56,7 +74,7 @@ resize_buffer(stringio *self, size_t size)
/* Here, unsigned types are used to avoid dealing with signed integer
overflow, which is undefined in C. */
size_t alloc = self->buf_size;
- Py_UNICODE *new_buf = NULL;
+ Py_UCS4 *new_buf = NULL;
assert(self->buf != NULL);
@@ -84,10 +102,9 @@ resize_buffer(stringio *self, size_t size)
alloc = size + 1;
}
- if (alloc > ((size_t)-1) / sizeof(Py_UNICODE))
+ if (alloc > PY_SIZE_MAX / sizeof(Py_UCS4))
goto overflow;
- new_buf = (Py_UNICODE *)PyMem_Realloc(self->buf,
- alloc * sizeof(Py_UNICODE));
+ new_buf = (Py_UCS4 *)PyMem_Realloc(self->buf, alloc * sizeof(Py_UCS4));
if (new_buf == NULL) {
PyErr_NoMemory();
return -1;
@@ -103,14 +120,62 @@ resize_buffer(stringio *self, size_t size)
return -1;
}
+static PyObject *
+make_intermediate(stringio *self)
+{
+ PyObject *intermediate = _PyAccu_Finish(&self->accu);
+ self->state = STATE_REALIZED;
+ if (intermediate == NULL)
+ return NULL;
+ if (_PyAccu_Init(&self->accu) ||
+ _PyAccu_Accumulate(&self->accu, intermediate)) {
+ Py_DECREF(intermediate);
+ return NULL;
+ }
+ self->state = STATE_ACCUMULATING;
+ return intermediate;
+}
+
+static int
+realize(stringio *self)
+{
+ Py_ssize_t len;
+ PyObject *intermediate;
+
+ if (self->state == STATE_REALIZED)
+ return 0;
+ assert(self->state == STATE_ACCUMULATING);
+ self->state = STATE_REALIZED;
+
+ intermediate = _PyAccu_Finish(&self->accu);
+ if (intermediate == NULL)
+ return -1;
+
+ /* Append the intermediate string to the internal buffer.
+ The length should be equal to the current cursor position.
+ */
+ len = PyUnicode_GET_LENGTH(intermediate);
+ if (resize_buffer(self, len) < 0) {
+ Py_DECREF(intermediate);
+ return -1;
+ }
+ if (!PyUnicode_AsUCS4(intermediate, self->buf, len, 0)) {
+ Py_DECREF(intermediate);
+ return -1;
+ }
+
+ Py_DECREF(intermediate);
+ return 0;
+}
+
/* Internal routine for writing a whole PyUnicode object to the buffer of a
StringIO object. Returns 0 on success, or -1 on error. */
static Py_ssize_t
write_str(stringio *self, PyObject *obj)
{
- Py_UNICODE *str;
Py_ssize_t len;
PyObject *decoded = NULL;
+
assert(self->buf != NULL);
assert(self->pos >= 0);
@@ -132,9 +197,11 @@ write_str(stringio *self, PyObject *obj)
return -1;
assert(PyUnicode_Check(decoded));
- str = PyUnicode_AS_UNICODE(decoded);
- len = PyUnicode_GET_SIZE(decoded);
-
+ if (PyUnicode_READY(decoded)) {
+ Py_DECREF(decoded);
+ return -1;
+ }
+ len = PyUnicode_GET_LENGTH(decoded);
assert(len >= 0);
/* This overflow check is not strictly necessary. However, it avoids us to
@@ -145,6 +212,17 @@ write_str(stringio *self, PyObject *obj)
"new position too large");
goto fail;
}
+
+ if (self->state == STATE_ACCUMULATING) {
+ if (self->string_size == self->pos) {
+ if (_PyAccu_Accumulate(&self->accu, decoded))
+ goto fail;
+ goto success;
+ }
+ if (realize(self))
+ goto fail;
+ }
+
if (self->pos + len > self->string_size) {
if (resize_buffer(self, self->pos + len) < 0)
goto fail;
@@ -161,18 +239,22 @@ write_str(stringio *self, PyObject *obj)
*/
memset(self->buf + self->string_size, '\0',
- (self->pos - self->string_size) * sizeof(Py_UNICODE));
+ (self->pos - self->string_size) * sizeof(Py_UCS4));
}
/* Copy the data to the internal buffer, overwriting some of the
existing data if self->pos < self->string_size. */
- memcpy(self->buf + self->pos, str, len * sizeof(Py_UNICODE));
- self->pos += len;
+ if (!PyUnicode_AsUCS4(decoded,
+ self->buf + self->pos,
+ self->buf_size - self->pos,
+ 0))
+ goto fail;
+success:
/* Set the new length of the internal string if it has changed. */
- if (self->string_size < self->pos) {
+ self->pos += len;
+ if (self->string_size < self->pos)
self->string_size = self->pos;
- }
Py_DECREF(decoded);
return 0;
@@ -190,7 +272,10 @@ stringio_getvalue(stringio *self)
{
CHECK_INITIALIZED(self);
CHECK_CLOSED(self);
- return PyUnicode_FromUnicode(self->buf, self->string_size);
+ if (self->state == STATE_ACCUMULATING)
+ return make_intermediate(self);
+ return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, self->buf,
+ self->string_size);
}
PyDoc_STRVAR(stringio_tell_doc,
@@ -214,7 +299,7 @@ static PyObject *
stringio_read(stringio *self, PyObject *args)
{
Py_ssize_t size, n;
- Py_UNICODE *output;
+ Py_UCS4 *output;
PyObject *arg = Py_None;
CHECK_INITIALIZED(self);
@@ -245,21 +330,29 @@ stringio_read(stringio *self, PyObject *args)
size = 0;
}
+ /* Optimization for seek(0); read() */
+ if (self->state == STATE_ACCUMULATING && self->pos == 0 && size == n) {
+ PyObject *result = make_intermediate(self);
+ self->pos = self->string_size;
+ return result;
+ }
+
+ ENSURE_REALIZED(self);
output = self->buf + self->pos;
self->pos += size;
- return PyUnicode_FromUnicode(output, size);
+ return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, output, size);
}
/* Internal helper, used by stringio_readline and stringio_iternext */
static PyObject *
_stringio_readline(stringio *self, Py_ssize_t limit)
{
- Py_UNICODE *start, *end, old_char;
+ Py_UCS4 *start, *end, old_char;
Py_ssize_t len, consumed;
/* In case of overseek, return the empty string */
if (self->pos >= self->string_size)
- return PyUnicode_FromString("");
+ return PyUnicode_New(0, 0);
start = self->buf + self->pos;
if (limit < 0 || limit > self->string_size - self->pos)
@@ -270,14 +363,14 @@ _stringio_readline(stringio *self, Py_ssize_t limit)
*end = '\0';
len = _PyIO_find_line_ending(
self->readtranslate, self->readuniversal, self->readnl,
- start, end, &consumed);
+ PyUnicode_4BYTE_KIND, (char*)start, (char*)end, &consumed);
*end = old_char;
/* If we haven't found any line ending, we just return everything
(`consumed` is ignored). */
if (len < 0)
len = limit;
self->pos += len;
- return PyUnicode_FromUnicode(start, len);
+ return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, start, len);
}
PyDoc_STRVAR(stringio_readline_doc,
@@ -295,6 +388,7 @@ stringio_readline(stringio *self, PyObject *args)
if (!PyArg_ParseTuple(args, "|O:readline", &arg))
return NULL;
CHECK_CLOSED(self);
+ ENSURE_REALIZED(self);
if (PyNumber_Check(arg)) {
limit = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
@@ -316,6 +410,7 @@ stringio_iternext(stringio *self)
CHECK_INITIALIZED(self);
CHECK_CLOSED(self);
+ ENSURE_REALIZED(self);
if (Py_TYPE(self) == &PyStringIO_Type) {
/* Skip method call overhead for speed */
@@ -337,7 +432,7 @@ stringio_iternext(stringio *self)
if (line == NULL)
return NULL;
- if (PyUnicode_GET_SIZE(line) == 0) {
+ if (PyUnicode_GET_LENGTH(line) == 0) {
/* Reached EOF */
Py_DECREF(line);
return NULL;
@@ -386,6 +481,7 @@ stringio_truncate(stringio *self, PyObject *args)
}
if (size < self->string_size) {
+ ENSURE_REALIZED(self);
if (resize_buffer(self, size) < 0)
return NULL;
self->string_size = size;
@@ -462,8 +558,10 @@ stringio_write(stringio *self, PyObject *obj)
Py_TYPE(obj)->tp_name);
return NULL;
}
+ if (PyUnicode_READY(obj))
+ return NULL;
CHECK_CLOSED(self);
- size = PyUnicode_GET_SIZE(obj);
+ size = PyUnicode_GET_LENGTH(obj);
if (size > 0 && write_str(self, obj) < 0)
return NULL;
@@ -484,6 +582,7 @@ stringio_close(stringio *self)
/* Free up some memory */
if (resize_buffer(self, 0) < 0)
return NULL;
+ _PyAccu_Destroy(&self->accu);
Py_CLEAR(self->readnl);
Py_CLEAR(self->writenl);
Py_CLEAR(self->decoder);
@@ -513,6 +612,7 @@ stringio_dealloc(stringio *self)
PyMem_Free(self->buf);
self->buf = NULL;
}
+ _PyAccu_Destroy(&self->accu);
Py_CLEAR(self->readnl);
Py_CLEAR(self->writenl);
Py_CLEAR(self->decoder);
@@ -535,7 +635,7 @@ stringio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
/* tp_alloc initializes all the fields to zero. So we don't have to
initialize them here. */
- self->buf = (Py_UNICODE *)PyMem_Malloc(0);
+ self->buf = (Py_UCS4 *)PyMem_Malloc(0);
if (self->buf == NULL) {
Py_DECREF(self);
return PyErr_NoMemory();
@@ -551,6 +651,7 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds)
PyObject *value = NULL;
PyObject *newline_obj = NULL;
char *newline = "\n";
+ Py_ssize_t value_len;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:__init__", kwlist,
&value, &newline_obj))
@@ -592,6 +693,7 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds)
self->ok = 0;
+ _PyAccu_Destroy(&self->accu);
Py_CLEAR(self->readnl);
Py_CLEAR(self->writenl);
Py_CLEAR(self->decoder);
@@ -628,19 +730,27 @@ stringio_init(stringio *self, PyObject *args, PyObject *kwds)
/* Now everything is set up, resize buffer to size of initial value,
and copy it */
self->string_size = 0;
- if (value && value != Py_None) {
- Py_ssize_t len = PyUnicode_GetSize(value);
+ if (value && value != Py_None)
+ value_len = PyUnicode_GetLength(value);
+ else
+ value_len = 0;
+ if (value_len > 0) {
/* This is a heuristic, for newline translation might change
the string length. */
- if (resize_buffer(self, len) < 0)
+ if (resize_buffer(self, 0) < 0)
return -1;
+ self->state = STATE_REALIZED;
self->pos = 0;
if (write_str(self, value) < 0)
return -1;
}
else {
+ /* Empty stringio object, we can start by accumulating */
if (resize_buffer(self, 0) < 0)
return -1;
+ if (_PyAccu_Init(&self->accu))
+ return -1;
+ self->state = STATE_ACCUMULATING;
}
self->pos = 0;
@@ -760,11 +870,22 @@ stringio_setstate(stringio *self, PyObject *state)
once by __init__. So we do not take any chance and replace object's
buffer completely. */
{
- Py_UNICODE *buf = PyUnicode_AS_UNICODE(PyTuple_GET_ITEM(state, 0));
- Py_ssize_t bufsize = PyUnicode_GET_SIZE(PyTuple_GET_ITEM(state, 0));
- if (resize_buffer(self, bufsize) < 0)
+ PyObject *item;
+ Py_UCS4 *buf;
+ Py_ssize_t bufsize;
+
+ item = PyTuple_GET_ITEM(state, 0);
+ buf = PyUnicode_AsUCS4Copy(item);
+ if (buf == NULL)
return NULL;
- memcpy(self->buf, buf, bufsize * sizeof(Py_UNICODE));
+ bufsize = PyUnicode_GET_LENGTH(item);
+
+ if (resize_buffer(self, bufsize) < 0) {
+ PyMem_Free(buf);
+ return NULL;
+ }
+ memcpy(self->buf, buf, bufsize * sizeof(Py_UCS4));
+ PyMem_Free(buf);
self->string_size = bufsize;
}
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 2fbb8f3..96434a8 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -11,6 +11,27 @@
#include "structmember.h"
#include "_iomodule.h"
+_Py_IDENTIFIER(close);
+_Py_IDENTIFIER(_dealloc_warn);
+_Py_IDENTIFIER(decode);
+_Py_IDENTIFIER(fileno);
+_Py_IDENTIFIER(flush);
+_Py_IDENTIFIER(getpreferredencoding);
+_Py_IDENTIFIER(isatty);
+_Py_IDENTIFIER(mode);
+_Py_IDENTIFIER(name);
+_Py_IDENTIFIER(raw);
+_Py_IDENTIFIER(read);
+_Py_IDENTIFIER(read1);
+_Py_IDENTIFIER(readable);
+_Py_IDENTIFIER(replace);
+_Py_IDENTIFIER(reset);
+_Py_IDENTIFIER(seek);
+_Py_IDENTIFIER(seekable);
+_Py_IDENTIFIER(setstate);
+_Py_IDENTIFIER(tell);
+_Py_IDENTIFIER(writable);
+
/* TextIOBase */
PyDoc_STRVAR(textiobase_doc,
@@ -274,18 +295,26 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
goto error;
}
- output_len = PyUnicode_GET_SIZE(output);
+ if (PyUnicode_READY(output) == -1)
+ goto error;
+
+ output_len = PyUnicode_GET_LENGTH(output);
if (self->pendingcr && (final || output_len > 0)) {
- Py_UNICODE *out;
- PyObject *modified = PyUnicode_FromUnicode(NULL, output_len + 1);
+ /* Prefix output with CR */
+ int kind;
+ PyObject *modified;
+ char *out;
+
+ modified = PyUnicode_New(output_len + 1,
+ PyUnicode_MAX_CHAR_VALUE(output));
if (modified == NULL)
goto error;
- out = PyUnicode_AS_UNICODE(modified);
- out[0] = '\r';
- memcpy(out + 1, PyUnicode_AS_UNICODE(output),
- output_len * sizeof(Py_UNICODE));
+ kind = PyUnicode_KIND(modified);
+ out = PyUnicode_DATA(modified);
+ PyUnicode_WRITE(kind, PyUnicode_DATA(modified), 0, '\r');
+ memcpy(out + kind, PyUnicode_DATA(output), kind * output_len);
Py_DECREF(output);
- output = modified;
+ output = modified; /* output remains ready */
self->pendingcr = 0;
output_len++;
}
@@ -295,21 +324,13 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
*/
if (!final) {
if (output_len > 0
- && PyUnicode_AS_UNICODE(output)[output_len - 1] == '\r') {
-
- if (Py_REFCNT(output) == 1) {
- if (PyUnicode_Resize(&output, output_len - 1) < 0)
- goto error;
- }
- else {
- PyObject *modified = PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(output),
- output_len - 1);
- if (modified == NULL)
- goto error;
- Py_DECREF(output);
- output = modified;
- }
+ && PyUnicode_READ_CHAR(output, output_len - 1) == '\r')
+ {
+ PyObject *modified = PyUnicode_Substring(output, 0, output_len -1);
+ if (modified == NULL)
+ goto error;
+ Py_DECREF(output);
+ output = modified;
self->pendingcr = 1;
}
}
@@ -317,13 +338,15 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
/* Record which newlines are read and do newline translation if desired,
all in one pass. */
{
- Py_UNICODE *in_str;
+ void *in_str;
Py_ssize_t len;
int seennl = self->seennl;
int only_lf = 0;
+ int kind;
- in_str = PyUnicode_AS_UNICODE(output);
- len = PyUnicode_GET_SIZE(output);
+ in_str = PyUnicode_DATA(output);
+ len = PyUnicode_GET_LENGTH(output);
+ kind = PyUnicode_KIND(output);
if (len == 0)
return output;
@@ -332,7 +355,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
for the \r *byte* with the libc's optimized memchr.
*/
if (seennl == SEEN_LF || seennl == 0) {
- only_lf = (memchr(in_str, '\r', len * sizeof(Py_UNICODE)) == NULL);
+ only_lf = (memchr(in_str, '\r', kind * len) == NULL);
}
if (only_lf) {
@@ -340,51 +363,51 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
(there's nothing else to be done, even when in translation mode)
*/
if (seennl == 0 &&
- memchr(in_str, '\n', len * sizeof(Py_UNICODE)) != NULL) {
- Py_UNICODE *s, *end;
- s = in_str;
- end = in_str + len;
- for (;;) {
- Py_UNICODE c;
- /* Fast loop for non-control characters */
- while (*s > '\n')
- s++;
- c = *s++;
- if (c == '\n') {
- seennl |= SEEN_LF;
- break;
+ memchr(in_str, '\n', kind * len) != NULL) {
+ if (kind == PyUnicode_1BYTE_KIND)
+ seennl |= SEEN_LF;
+ else {
+ Py_ssize_t i = 0;
+ for (;;) {
+ Py_UCS4 c;
+ /* Fast loop for non-control characters */
+ while (PyUnicode_READ(kind, in_str, i) > '\n')
+ i++;
+ c = PyUnicode_READ(kind, in_str, i++);
+ if (c == '\n') {
+ seennl |= SEEN_LF;
+ break;
+ }
+ if (i >= len)
+ break;
}
- if (s > end)
- break;
}
}
/* Finished: we have scanned for newlines, and none of them
need translating */
}
else if (!self->translate) {
- Py_UNICODE *s, *end;
+ Py_ssize_t i = 0;
/* We have already seen all newline types, no need to scan again */
if (seennl == SEEN_ALL)
goto endscan;
- s = in_str;
- end = in_str + len;
for (;;) {
- Py_UNICODE c;
+ Py_UCS4 c;
/* Fast loop for non-control characters */
- while (*s > '\r')
- s++;
- c = *s++;
+ while (PyUnicode_READ(kind, in_str, i) > '\r')
+ i++;
+ c = PyUnicode_READ(kind, in_str, i++);
if (c == '\n')
seennl |= SEEN_LF;
else if (c == '\r') {
- if (*s == '\n') {
+ if (PyUnicode_READ(kind, in_str, i) == '\n') {
seennl |= SEEN_CRLF;
- s++;
+ i++;
}
else
seennl |= SEEN_CR;
}
- if (s > end)
+ if (i >= len)
break;
if (seennl == SEEN_ALL)
break;
@@ -393,61 +416,51 @@ _PyIncrementalNewlineDecoder_decode(PyObject *_self,
;
}
else {
- PyObject *translated = NULL;
- Py_UNICODE *out_str;
- Py_UNICODE *in, *out, *end;
- if (Py_REFCNT(output) != 1) {
- /* We could try to optimize this so that we only do a copy
- when there is something to translate. On the other hand,
- most decoders should only output non-shared strings, i.e.
- translation is done in place. */
- translated = PyUnicode_FromUnicode(NULL, len);
- if (translated == NULL)
- goto error;
- assert(Py_REFCNT(translated) == 1);
- memcpy(PyUnicode_AS_UNICODE(translated),
- PyUnicode_AS_UNICODE(output),
- len * sizeof(Py_UNICODE));
- }
- else {
- translated = output;
+ void *translated;
+ int kind = PyUnicode_KIND(output);
+ void *in_str = PyUnicode_DATA(output);
+ Py_ssize_t in, out;
+ /* XXX: Previous in-place translation here is disabled as
+ resizing is not possible anymore */
+ /* We could try to optimize this so that we only do a copy
+ when there is something to translate. On the other hand,
+ we already know there is a \r byte, so chances are high
+ that something needs to be done. */
+ translated = PyMem_Malloc(kind * len);
+ if (translated == NULL) {
+ PyErr_NoMemory();
+ goto error;
}
- out_str = PyUnicode_AS_UNICODE(translated);
- in = in_str;
- out = out_str;
- end = in_str + len;
+ in = out = 0;
for (;;) {
- Py_UNICODE c;
+ Py_UCS4 c;
/* Fast loop for non-control characters */
- while ((c = *in++) > '\r')
- *out++ = c;
+ while ((c = PyUnicode_READ(kind, in_str, in++)) > '\r')
+ PyUnicode_WRITE(kind, translated, out++, c);
if (c == '\n') {
- *out++ = c;
+ PyUnicode_WRITE(kind, translated, out++, c);
seennl |= SEEN_LF;
continue;
}
if (c == '\r') {
- if (*in == '\n') {
+ if (PyUnicode_READ(kind, in_str, in) == '\n') {
in++;
seennl |= SEEN_CRLF;
}
else
seennl |= SEEN_CR;
- *out++ = '\n';
+ PyUnicode_WRITE(kind, translated, out++, '\n');
continue;
}
- if (in > end)
+ if (in > len)
break;
- *out++ = c;
- }
- if (translated != output) {
- Py_DECREF(output);
- output = translated;
- }
- if (out - out_str != len) {
- if (PyUnicode_Resize(&output, out - out_str) < 0)
- goto error;
+ PyUnicode_WRITE(kind, translated, out++, c);
}
+ Py_DECREF(output);
+ output = PyUnicode_FromKindAndData(kind, translated, out);
+ PyMem_Free(translated);
+ if (!output)
+ return NULL;
}
self->seennl |= seennl;
}
@@ -514,8 +527,8 @@ incrementalnewlinedecoder_setstate(nldecoder_object *self, PyObject *state)
flag >>= 1;
if (self->decoder != Py_None)
- return PyObject_CallMethod(self->decoder,
- "setstate", "((OK))", buffer, flag);
+ return _PyObject_CallMethodId(self->decoder,
+ &PyId_setstate, "((OK))", buffer, flag);
else
Py_RETURN_NONE;
}
@@ -617,7 +630,7 @@ PyDoc_STRVAR(textiowrapper_doc,
"Character and line based layer over a BufferedIOBase object, buffer.\n"
"\n"
"encoding gives the name of the encoding that the stream will be\n"
- "decoded or encoded with. It defaults to locale.getpreferredencoding.\n"
+ "decoded or encoded with. It defaults to locale.getpreferredencoding(False).\n"
"\n"
"errors determines the strictness of encoding and decoding (see the\n"
"codecs.register) and defaults to \"strict\".\n"
@@ -687,12 +700,16 @@ typedef struct
PyObject *pending_bytes; /* list of bytes objects waiting to be
written, or NULL */
Py_ssize_t pending_bytes_count;
- PyObject *snapshot;
+
/* snapshot is either None, or a tuple (dec_flags, next_input) where
* dec_flags is the second (integer) item of the decoder state and
* next_input is the chunk of input bytes that comes next after the
* snapshot point. We use this to reconstruct decoder states in tell().
*/
+ PyObject *snapshot;
+ /* Bytes-to-characters ratio for the current chunk. Serves as input for
+ the heuristic in tell(). */
+ double b2cratio;
/* Cache raw object if it's a FileIO object */
PyObject *raw;
@@ -708,25 +725,21 @@ typedef struct
static PyObject *
ascii_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors));
+ return _PyUnicode_AsASCIIString(text, PyBytes_AS_STRING(self->errors));
}
static PyObject *
utf16be_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), 1);
+ return _PyUnicode_EncodeUTF16(text,
+ PyBytes_AS_STRING(self->errors), 1);
}
static PyObject *
utf16le_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), -1);
+ return _PyUnicode_EncodeUTF16(text,
+ PyBytes_AS_STRING(self->errors), -1);
}
static PyObject *
@@ -740,25 +753,22 @@ utf16_encode(textio *self, PyObject *text)
return utf16le_encode(self, text);
#endif
}
- return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), 0);
+ return _PyUnicode_EncodeUTF16(text,
+ PyBytes_AS_STRING(self->errors), 0);
}
static PyObject *
utf32be_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), 1);
+ return _PyUnicode_EncodeUTF32(text,
+ PyBytes_AS_STRING(self->errors), 1);
}
static PyObject *
utf32le_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), -1);
+ return _PyUnicode_EncodeUTF32(text,
+ PyBytes_AS_STRING(self->errors), -1);
}
static PyObject *
@@ -772,25 +782,20 @@ utf32_encode(textio *self, PyObject *text)
return utf32le_encode(self, text);
#endif
}
- return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors), 0);
+ return _PyUnicode_EncodeUTF32(text,
+ PyBytes_AS_STRING(self->errors), 0);
}
static PyObject *
utf8_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors));
+ return _PyUnicode_AsUTF8String(text, PyBytes_AS_STRING(self->errors));
}
static PyObject *
latin1_encode(textio *self, PyObject *text)
{
- return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text),
- PyBytes_AS_STRING(self->errors));
+ return _PyUnicode_AsLatin1String(text, PyBytes_AS_STRING(self->errors));
}
/* Map normalized encoding names onto the specialized encoding funcs */
@@ -859,11 +864,12 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
self->decoded_chars_used = 0;
self->pending_bytes_count = 0;
self->encodefunc = NULL;
+ self->b2cratio = 0.0;
if (encoding == NULL) {
/* Try os.device_encoding(fileno) */
PyObject *fileno;
- fileno = PyObject_CallMethod(buffer, "fileno", NULL);
+ fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL);
/* Ignore only AttributeError and UnsupportedOperation */
if (fileno == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError) ||
@@ -875,9 +881,13 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
}
}
else {
- self->encoding = PyObject_CallMethod(state->os_module,
- "device_encoding",
- "N", fileno);
+ int fd = (int) PyLong_AsLong(fileno);
+ Py_DECREF(fileno);
+ if (fd == -1 && PyErr_Occurred()) {
+ goto error;
+ }
+
+ self->encoding = _Py_device_encoding(fd);
if (self->encoding == NULL)
goto error;
else if (!PyUnicode_Check(self->encoding))
@@ -894,8 +904,8 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
}
else {
use_locale:
- self->encoding = PyObject_CallMethod(
- state->locale_module, "getpreferredencoding", NULL);
+ self->encoding = _PyObject_CallMethodId(
+ state->locale_module, &PyId_getpreferredencoding, "O", Py_False);
if (self->encoding == NULL) {
catch_ImportError:
/*
@@ -960,7 +970,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
#endif
/* Build the decoder object */
- res = PyObject_CallMethod(buffer, "readable", NULL);
+ res = _PyObject_CallMethodId(buffer, &PyId_readable, NULL);
if (res == NULL)
goto error;
r = PyObject_IsTrue(res);
@@ -985,7 +995,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
}
/* Build the encoder object */
- res = PyObject_CallMethod(buffer, "writable", NULL);
+ res = _PyObject_CallMethodId(buffer, &PyId_writable, NULL);
if (res == NULL)
goto error;
r = PyObject_IsTrue(res);
@@ -1002,7 +1012,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
ci = _PyCodec_Lookup(encoding);
if (ci == NULL)
goto error;
- res = PyObject_GetAttrString(ci, "name");
+ res = _PyObject_GetAttrId(ci, &PyId_name);
Py_DECREF(ci);
if (res == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
@@ -1029,7 +1039,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
if (Py_TYPE(buffer) == &PyBufferedReader_Type ||
Py_TYPE(buffer) == &PyBufferedWriter_Type ||
Py_TYPE(buffer) == &PyBufferedRandom_Type) {
- raw = PyObject_GetAttrString(buffer, "raw");
+ raw = _PyObject_GetAttrId(buffer, &PyId_raw);
/* Cache the raw FileIO object to speed up 'closed' checks */
if (raw == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
@@ -1043,7 +1053,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
Py_DECREF(raw);
}
- res = PyObject_CallMethod(buffer, "seekable", NULL);
+ res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL);
if (res == NULL)
goto error;
r = PyObject_IsTrue(res);
@@ -1052,7 +1062,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
goto error;
self->seekable = self->telling = r;
- self->has_read1 = PyObject_HasAttrString(buffer, "read1");
+ self->has_read1 = _PyObject_HasAttrId(buffer, &PyId_read1);
self->encoding_start_of_stream = 0;
if (self->seekable && self->encoder) {
@@ -1218,18 +1228,6 @@ textiowrapper_detach(textio *self)
return buffer;
}
-Py_LOCAL_INLINE(const Py_UNICODE *)
-findchar(const Py_UNICODE *s, Py_ssize_t size, Py_UNICODE ch)
-{
- /* like wcschr, but doesn't stop at NULL characters */
- while (size-- > 0) {
- if (*s == ch)
- return s;
- s++;
- }
- return NULL;
-}
-
/* Flush the internal write buffer. This doesn't explicitly flush the
underlying buffered object, though. */
static int
@@ -1274,6 +1272,9 @@ textiowrapper_write(textio *self, PyObject *args)
return NULL;
}
+ if (PyUnicode_READY(text) == -1)
+ return NULL;
+
CHECK_CLOSED(self);
if (self->encoder == NULL)
@@ -1281,16 +1282,15 @@ textiowrapper_write(textio *self, PyObject *args)
Py_INCREF(text);
- textlen = PyUnicode_GetSize(text);
+ textlen = PyUnicode_GET_LENGTH(text);
if ((self->writetranslate && self->writenl != NULL) || self->line_buffering)
- if (findchar(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text), '\n'))
+ if (PyUnicode_FindChar(text, '\n', 0, PyUnicode_GET_LENGTH(text), 1) != -1)
haslf = 1;
if (haslf && self->writetranslate && self->writenl != NULL) {
- PyObject *newtext = PyObject_CallMethod(
- text, "replace", "ss", "\n", self->writenl);
+ PyObject *newtext = _PyObject_CallMethodId(
+ text, &PyId_replace, "ss", "\n", self->writenl);
Py_DECREF(text);
if (newtext == NULL)
return NULL;
@@ -1301,8 +1301,7 @@ textiowrapper_write(textio *self, PyObject *args)
needflush = 1;
else if (self->line_buffering &&
(haslf ||
- findchar(PyUnicode_AS_UNICODE(text),
- PyUnicode_GET_SIZE(text), '\r')))
+ PyUnicode_FindChar(text, '\r', 0, PyUnicode_GET_LENGTH(text), 1) != -1))
needflush = 1;
/* XXX What if we were just reading? */
@@ -1346,7 +1345,7 @@ textiowrapper_write(textio *self, PyObject *args)
Py_CLEAR(self->snapshot);
if (self->decoder) {
- ret = PyObject_CallMethod(self->decoder, "reset", NULL);
+ ret = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL);
if (ret == NULL)
return NULL;
Py_DECREF(ret);
@@ -1374,7 +1373,8 @@ textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)
if (self->decoded_chars == NULL)
return PyUnicode_FromStringAndSize(NULL, 0);
- avail = (PyUnicode_GET_SIZE(self->decoded_chars)
+ /* decoded_chars is guaranteed to be "ready". */
+ avail = (PyUnicode_GET_LENGTH(self->decoded_chars)
- self->decoded_chars_used);
assert(avail >= 0);
@@ -1383,9 +1383,9 @@ textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)
n = avail;
if (self->decoded_chars_used > 0 || n < avail) {
- chars = PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(self->decoded_chars)
- + self->decoded_chars_used, n);
+ chars = PyUnicode_Substring(self->decoded_chars,
+ self->decoded_chars_used,
+ self->decoded_chars_used + n);
if (chars == NULL)
return NULL;
}
@@ -1401,12 +1401,13 @@ textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)
/* Read and decode the next chunk of data from the BufferedReader.
*/
static int
-textiowrapper_read_chunk(textio *self)
+textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint)
{
PyObject *dec_buffer = NULL;
PyObject *dec_flags = NULL;
PyObject *input_chunk = NULL;
PyObject *decoded_chars, *chunk_size;
+ Py_ssize_t nbytes, nchars;
int eof;
/* The return value is True unless EOF was reached. The decoded string is
@@ -1442,7 +1443,10 @@ textiowrapper_read_chunk(textio *self)
}
/* Read a chunk, decode it, and put the result in self._decoded_chars. */
- chunk_size = PyLong_FromSsize_t(self->chunk_size);
+ if (size_hint > 0) {
+ size_hint = (Py_ssize_t)(Py_MAX(self->b2cratio, 1.0) * size_hint);
+ }
+ chunk_size = PyLong_FromSsize_t(Py_MAX(self->chunk_size, size_hint));
if (chunk_size == NULL)
goto fail;
input_chunk = PyObject_CallMethodObjArgs(self->buffer,
@@ -1453,7 +1457,8 @@ textiowrapper_read_chunk(textio *self)
goto fail;
assert(PyBytes_Check(input_chunk));
- eof = (PyBytes_Size(input_chunk) == 0);
+ nbytes = PyBytes_Size(input_chunk);
+ eof = (nbytes == 0);
if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type) {
decoded_chars = _PyIncrementalNewlineDecoder_decode(
@@ -1467,8 +1472,15 @@ textiowrapper_read_chunk(textio *self)
/* TODO sanity check: isinstance(decoded_chars, unicode) */
if (decoded_chars == NULL)
goto fail;
+ if (PyUnicode_READY(decoded_chars) == -1)
+ goto fail;
textiowrapper_set_decoded_chars(self, decoded_chars);
- if (PyUnicode_GET_SIZE(decoded_chars) > 0)
+ nchars = PyUnicode_GET_LENGTH(decoded_chars);
+ if (nchars > 0)
+ self->b2cratio = (double) nbytes / nchars;
+ else
+ self->b2cratio = 0.0;
+ if (nchars > 0)
eof = 0;
if (self->telling) {
@@ -1515,12 +1527,17 @@ textiowrapper_read(textio *self, PyObject *args)
if (n < 0) {
/* Read everything */
- PyObject *bytes = PyObject_CallMethod(self->buffer, "read", NULL);
+ PyObject *bytes = _PyObject_CallMethodId(self->buffer, &PyId_read, NULL);
PyObject *decoded;
if (bytes == NULL)
goto fail;
- decoded = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_decode,
- bytes, Py_True, NULL);
+
+ if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type)
+ decoded = _PyIncrementalNewlineDecoder_decode(self->decoder,
+ bytes, 1);
+ else
+ decoded = PyObject_CallMethodObjArgs(
+ self->decoder, _PyIO_str_decode, bytes, Py_True, NULL);
Py_DECREF(bytes);
if (decoded == NULL)
goto fail;
@@ -1546,11 +1563,13 @@ textiowrapper_read(textio *self, PyObject *args)
result = textiowrapper_get_decoded_chars(self, n);
if (result == NULL)
goto fail;
- remaining -= PyUnicode_GET_SIZE(result);
+ if (PyUnicode_READY(result) == -1)
+ goto fail;
+ remaining -= PyUnicode_GET_LENGTH(result);
/* Keep reading chunks until we have n characters to return */
while (remaining > 0) {
- res = textiowrapper_read_chunk(self);
+ res = textiowrapper_read_chunk(self, remaining);
if (res < 0) {
/* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
when EINTR occurs so we needn't do it ourselves. */
@@ -1566,13 +1585,14 @@ textiowrapper_read(textio *self, PyObject *args)
if (chunks == NULL)
goto fail;
}
- if (PyList_Append(chunks, result) < 0)
+ if (PyUnicode_GET_LENGTH(result) > 0 &&
+ PyList_Append(chunks, result) < 0)
goto fail;
Py_DECREF(result);
result = textiowrapper_get_decoded_chars(self, remaining);
if (result == NULL)
goto fail;
- remaining -= PyUnicode_GET_SIZE(result);
+ remaining -= PyUnicode_GET_LENGTH(result);
}
if (chunks != NULL) {
if (result != NULL && PyList_Append(chunks, result) < 0)
@@ -1592,36 +1612,39 @@ textiowrapper_read(textio *self, PyObject *args)
}
-/* NOTE: `end` must point to the real end of the Py_UNICODE storage,
+/* NOTE: `end` must point to the real end of the Py_UCS4 storage,
that is to the NUL character. Otherwise the function will produce
incorrect results. */
-static Py_UNICODE *
-find_control_char(Py_UNICODE *start, Py_UNICODE *end, Py_UNICODE ch)
+static char *
+find_control_char(int kind, char *s, char *end, Py_UCS4 ch)
{
- Py_UNICODE *s = start;
+ if (kind == PyUnicode_1BYTE_KIND) {
+ assert(ch < 256);
+ return (char *) memchr((void *) s, (char) ch, end - s);
+ }
for (;;) {
- while (*s > ch)
- s++;
- if (*s == ch)
+ while (PyUnicode_READ(kind, s, 0) > ch)
+ s += kind;
+ if (PyUnicode_READ(kind, s, 0) == ch)
return s;
if (s == end)
return NULL;
- s++;
+ s += kind;
}
}
Py_ssize_t
_PyIO_find_line_ending(
int translated, int universal, PyObject *readnl,
- Py_UNICODE *start, Py_UNICODE *end, Py_ssize_t *consumed)
+ int kind, char *start, char *end, Py_ssize_t *consumed)
{
- Py_ssize_t len = end - start;
+ Py_ssize_t len = ((char*)end - (char*)start)/kind;
if (translated) {
/* Newlines are already translated, only search for \n */
- Py_UNICODE *pos = find_control_char(start, end, '\n');
+ char *pos = find_control_char(kind, start, end, '\n');
if (pos != NULL)
- return pos - start + 1;
+ return (pos - start)/kind + 1;
else {
*consumed = len;
return -1;
@@ -1631,63 +1654,66 @@ _PyIO_find_line_ending(
/* Universal newline search. Find any of \r, \r\n, \n
* The decoder ensures that \r\n are not split in two pieces
*/
- Py_UNICODE *s = start;
+ char *s = start;
for (;;) {
- Py_UNICODE ch;
+ Py_UCS4 ch;
/* Fast path for non-control chars. The loop always ends
- since the Py_UNICODE storage is NUL-terminated. */
- while (*s > '\r')
- s++;
+ since the Unicode string is NUL-terminated. */
+ while (PyUnicode_READ(kind, s, 0) > '\r')
+ s += kind;
if (s >= end) {
*consumed = len;
return -1;
}
- ch = *s++;
+ ch = PyUnicode_READ(kind, s, 0);
+ s += kind;
if (ch == '\n')
- return s - start;
+ return (s - start)/kind;
if (ch == '\r') {
- if (*s == '\n')
- return s - start + 1;
+ if (PyUnicode_READ(kind, s, 0) == '\n')
+ return (s - start)/kind + 1;
else
- return s - start;
+ return (s - start)/kind;
}
}
}
else {
/* Non-universal mode. */
- Py_ssize_t readnl_len = PyUnicode_GET_SIZE(readnl);
- Py_UNICODE *nl = PyUnicode_AS_UNICODE(readnl);
+ Py_ssize_t readnl_len = PyUnicode_GET_LENGTH(readnl);
+ char *nl = PyUnicode_DATA(readnl);
+ /* Assume that readnl is an ASCII character. */
+ assert(PyUnicode_KIND(readnl) == PyUnicode_1BYTE_KIND);
if (readnl_len == 1) {
- Py_UNICODE *pos = find_control_char(start, end, nl[0]);
+ char *pos = find_control_char(kind, start, end, nl[0]);
if (pos != NULL)
- return pos - start + 1;
+ return (pos - start)/kind + 1;
*consumed = len;
return -1;
}
else {
- Py_UNICODE *s = start;
- Py_UNICODE *e = end - readnl_len + 1;
- Py_UNICODE *pos;
+ char *s = start;
+ char *e = end - (readnl_len - 1)*kind;
+ char *pos;
if (e < s)
e = s;
while (s < e) {
Py_ssize_t i;
- Py_UNICODE *pos = find_control_char(s, end, nl[0]);
+ char *pos = find_control_char(kind, s, end, nl[0]);
if (pos == NULL || pos >= e)
break;
for (i = 1; i < readnl_len; i++) {
- if (pos[i] != nl[i])
+ if (PyUnicode_READ(kind, pos, i) != nl[i])
break;
}
if (i == readnl_len)
- return pos - start + readnl_len;
- s = pos + 1;
+ return (pos - start)/kind + readnl_len;
+ s = pos + kind;
}
- pos = find_control_char(e, end, nl[0]);
+ pos = find_control_char(kind, e, end, nl[0]);
if (pos == NULL)
*consumed = len;
else
- *consumed = pos - start;
+ *consumed = (pos - start)/kind;
return -1;
}
}
@@ -1708,15 +1734,16 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
chunked = 0;
while (1) {
- Py_UNICODE *ptr;
+ char *ptr;
Py_ssize_t line_len;
+ int kind;
Py_ssize_t consumed = 0;
/* First, get some data if necessary */
res = 1;
while (!self->decoded_chars ||
- !PyUnicode_GET_SIZE(self->decoded_chars)) {
- res = textiowrapper_read_chunk(self);
+ !PyUnicode_GET_LENGTH(self->decoded_chars)) {
+ res = textiowrapper_read_chunk(self, 0);
if (res < 0) {
/* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
when EINTR occurs so we needn't do it ourselves. */
@@ -1746,18 +1773,24 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
assert(self->decoded_chars_used == 0);
line = PyUnicode_Concat(remaining, self->decoded_chars);
start = 0;
- offset_to_buffer = PyUnicode_GET_SIZE(remaining);
+ offset_to_buffer = PyUnicode_GET_LENGTH(remaining);
Py_CLEAR(remaining);
if (line == NULL)
goto error;
+ if (PyUnicode_READY(line) == -1)
+ goto error;
}
- ptr = PyUnicode_AS_UNICODE(line);
- line_len = PyUnicode_GET_SIZE(line);
+ ptr = PyUnicode_DATA(line);
+ line_len = PyUnicode_GET_LENGTH(line);
+ kind = PyUnicode_KIND(line);
endpos = _PyIO_find_line_ending(
self->readtranslate, self->readuniversal, self->readnl,
- ptr + start, ptr + line_len, &consumed);
+ kind,
+ ptr + kind * start,
+ ptr + kind * line_len,
+ &consumed);
if (endpos >= 0) {
endpos += start;
if (limit >= 0 && (endpos - start) + chunked >= limit)
@@ -1781,21 +1814,20 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
if (chunks == NULL)
goto error;
}
- s = PyUnicode_FromUnicode(ptr + start, endpos - start);
+ s = PyUnicode_Substring(line, start, endpos);
if (s == NULL)
goto error;
if (PyList_Append(chunks, s) < 0) {
Py_DECREF(s);
goto error;
}
- chunked += PyUnicode_GET_SIZE(s);
+ chunked += PyUnicode_GET_LENGTH(s);
Py_DECREF(s);
}
/* There may be some remaining bytes we'll have to prepend to the
next chunk of data */
if (endpos < line_len) {
- remaining = PyUnicode_FromUnicode(
- ptr + endpos, line_len - endpos);
+ remaining = PyUnicode_Substring(line, endpos, line_len);
if (remaining == NULL)
goto error;
}
@@ -1807,19 +1839,12 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
if (line != NULL) {
/* Our line ends in the current buffer */
self->decoded_chars_used = endpos - offset_to_buffer;
- if (start > 0 || endpos < PyUnicode_GET_SIZE(line)) {
- if (start == 0 && Py_REFCNT(line) == 1) {
- if (PyUnicode_Resize(&line, endpos) < 0)
- goto error;
- }
- else {
- PyObject *s = PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(line) + start, endpos - start);
- Py_CLEAR(line);
- if (s == NULL)
- goto error;
- line = s;
- }
+ if (start > 0 || endpos < PyUnicode_GET_LENGTH(line)) {
+ PyObject *s = PyUnicode_Substring(line, start, endpos);
+ Py_CLEAR(line);
+ if (s == NULL)
+ goto error;
+ line = s;
}
}
if (remaining != NULL) {
@@ -1833,16 +1858,20 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit)
Py_CLEAR(remaining);
}
if (chunks != NULL) {
- if (line != NULL && PyList_Append(chunks, line) < 0)
- goto error;
- Py_CLEAR(line);
+ if (line != NULL) {
+ if (PyList_Append(chunks, line) < 0)
+ goto error;
+ Py_DECREF(line);
+ }
line = PyUnicode_Join(_PyIO_empty_str, chunks);
if (line == NULL)
goto error;
- Py_DECREF(chunks);
+ Py_CLEAR(chunks);
+ }
+ if (line == NULL) {
+ Py_INCREF(_PyIO_empty_str);
+ line = _PyIO_empty_str;
}
- if (line == NULL)
- line = PyUnicode_FromStringAndSize(NULL, 0);
return line;
@@ -1965,8 +1994,8 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie)
if (cookie->start_pos == 0 && cookie->dec_flags == 0)
res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL);
else
- res = PyObject_CallMethod(self->decoder, "setstate",
- "((yi))", "", cookie->dec_flags);
+ res = _PyObject_CallMethodId(self->decoder, &PyId_setstate,
+ "((yi))", "", cookie->dec_flags);
if (res == NULL)
return -1;
Py_DECREF(res);
@@ -2030,13 +2059,12 @@ textiowrapper_seek(textio *self, PyObject *args)
* sync the underlying buffer with the current position.
*/
Py_DECREF(cookieObj);
- cookieObj = PyObject_CallMethod((PyObject *)self, "tell", NULL);
+ cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL);
if (cookieObj == NULL)
goto fail;
}
else if (whence == 2) {
/* seek relative to end of file */
-
cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_EQ);
if (cmp < 0)
goto fail;
@@ -2046,7 +2074,7 @@ textiowrapper_seek(textio *self, PyObject *args)
goto fail;
}
- res = PyObject_CallMethod((PyObject *)self, "flush", NULL);
+ res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL);
if (res == NULL)
goto fail;
Py_DECREF(res);
@@ -2054,13 +2082,13 @@ textiowrapper_seek(textio *self, PyObject *args)
textiowrapper_set_decoded_chars(self, NULL);
Py_CLEAR(self->snapshot);
if (self->decoder) {
- res = PyObject_CallMethod(self->decoder, "reset", NULL);
+ res = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL);
if (res == NULL)
goto fail;
Py_DECREF(res);
}
- res = PyObject_CallMethod(self->buffer, "seek", "ii", 0, 2);
+ res = _PyObject_CallMethodId(self->buffer, &PyId_seek, "ii", 0, 2);
Py_XDECREF(cookieObj);
return res;
}
@@ -2113,8 +2141,8 @@ textiowrapper_seek(textio *self, PyObject *args)
if (cookie.chars_to_skip) {
/* Just like _read_chunk, feed the decoder and save a snapshot. */
- PyObject *input_chunk = PyObject_CallMethod(
- self->buffer, "read", "i", cookie.bytes_to_feed);
+ PyObject *input_chunk = _PyObject_CallMethodId(
+ self->buffer, &PyId_read, "i", cookie.bytes_to_feed);
PyObject *decoded;
if (input_chunk == NULL)
@@ -2128,16 +2156,20 @@ textiowrapper_seek(textio *self, PyObject *args)
goto fail;
}
- decoded = PyObject_CallMethod(self->decoder, "decode",
- "Oi", input_chunk, (int)cookie.need_eof);
+ decoded = _PyObject_CallMethodId(self->decoder, &PyId_decode,
+ "Oi", input_chunk, (int)cookie.need_eof);
if (decoded == NULL)
goto fail;
+ if (PyUnicode_READY(decoded) == -1) {
+ Py_DECREF(decoded);
+ goto fail;
+ }
textiowrapper_set_decoded_chars(self, decoded);
/* Skip chars_to_skip of the decoded characters. */
- if (PyUnicode_GetSize(self->decoded_chars) < cookie.chars_to_skip) {
+ if (PyUnicode_GetLength(self->decoded_chars) < cookie.chars_to_skip) {
PyErr_SetString(PyExc_IOError, "can't restore logical file position");
goto fail;
}
@@ -2169,8 +2201,12 @@ textiowrapper_tell(textio *self, PyObject *args)
cookie_type cookie = {0,0,0,0,0};
PyObject *next_input;
Py_ssize_t chars_to_skip, chars_decoded;
+ Py_ssize_t skip_bytes, skip_back;
PyObject *saved_state = NULL;
char *input, *input_end;
+ char *dec_buffer;
+ Py_ssize_t dec_buffer_len;
+ int dec_flags;
CHECK_INITIALIZED(self);
CHECK_CLOSED(self);
@@ -2187,17 +2223,17 @@ textiowrapper_tell(textio *self, PyObject *args)
if (_textiowrapper_writeflush(self) < 0)
return NULL;
- res = PyObject_CallMethod((PyObject *)self, "flush", NULL);
+ res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL);
if (res == NULL)
goto fail;
Py_DECREF(res);
- posobj = PyObject_CallMethod(self->buffer, "tell", NULL);
+ posobj = _PyObject_CallMethodId(self->buffer, &PyId_tell, NULL);
if (posobj == NULL)
goto fail;
if (self->decoder == NULL || self->snapshot == NULL) {
- assert (self->decoded_chars == NULL || PyUnicode_GetSize(self->decoded_chars) == 0);
+ assert (self->decoded_chars == NULL || PyUnicode_GetLength(self->decoded_chars) == 0);
return posobj;
}
@@ -2206,6 +2242,7 @@ textiowrapper_tell(textio *self, PyObject *args)
#else
cookie.start_pos = PyLong_AsLong(posobj);
#endif
+ Py_DECREF(posobj);
if (PyErr_Occurred())
goto fail;
@@ -2220,57 +2257,99 @@ textiowrapper_tell(textio *self, PyObject *args)
/* How many decoded characters have been used up since the snapshot? */
if (self->decoded_chars_used == 0) {
/* We haven't moved from the snapshot point. */
- Py_DECREF(posobj);
return textiowrapper_build_cookie(&cookie);
}
chars_to_skip = self->decoded_chars_used;
- /* Starting from the snapshot position, we will walk the decoder
- * forward until it gives us enough decoded characters.
- */
+ /* Decoder state will be restored at the end */
saved_state = PyObject_CallMethodObjArgs(self->decoder,
_PyIO_str_getstate, NULL);
if (saved_state == NULL)
goto fail;
- /* Note our initial start point. */
- if (_textiowrapper_decoder_setstate(self, &cookie) < 0)
- goto fail;
+#define DECODER_GETSTATE() do { \
+ PyObject *_state = PyObject_CallMethodObjArgs(self->decoder, \
+ _PyIO_str_getstate, NULL); \
+ if (_state == NULL) \
+ goto fail; \
+ if (!PyArg_Parse(_state, "(y#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) { \
+ Py_DECREF(_state); \
+ goto fail; \
+ } \
+ Py_DECREF(_state); \
+ } while (0)
+
+ /* TODO: replace assert with exception */
+#define DECODER_DECODE(start, len, res) do { \
+ PyObject *_decoded = _PyObject_CallMethodId( \
+ self->decoder, &PyId_decode, "y#", start, len); \
+ if (_decoded == NULL) \
+ goto fail; \
+ assert (PyUnicode_Check(_decoded)); \
+ res = PyUnicode_GET_LENGTH(_decoded); \
+ Py_DECREF(_decoded); \
+ } while (0)
+
+ /* Fast search for an acceptable start point, close to our
+ current pos */
+ skip_bytes = (Py_ssize_t) (self->b2cratio * chars_to_skip);
+ skip_back = 1;
+ assert(skip_back <= PyBytes_GET_SIZE(next_input));
+ input = PyBytes_AS_STRING(next_input);
+ while (skip_bytes > 0) {
+ /* Decode up to temptative start point */
+ if (_textiowrapper_decoder_setstate(self, &cookie) < 0)
+ goto fail;
+ DECODER_DECODE(input, skip_bytes, chars_decoded);
+ if (chars_decoded <= chars_to_skip) {
+ DECODER_GETSTATE();
+ if (dec_buffer_len == 0) {
+ /* Before pos and no bytes buffered in decoder => OK */
+ cookie.dec_flags = dec_flags;
+ chars_to_skip -= chars_decoded;
+ break;
+ }
+ /* Skip back by buffered amount and reset heuristic */
+ skip_bytes -= dec_buffer_len;
+ skip_back = 1;
+ }
+ else {
+ /* We're too far ahead, skip back a bit */
+ skip_bytes -= skip_back;
+ skip_back *= 2;
+ }
+ }
+ if (skip_bytes <= 0) {
+ skip_bytes = 0;
+ if (_textiowrapper_decoder_setstate(self, &cookie) < 0)
+ goto fail;
+ }
- /* Feed the decoder one byte at a time. As we go, note the
- * nearest "safe start point" before the current location
- * (a point where the decoder has nothing buffered, so seek()
+ /* Note our initial start point. */
+ cookie.start_pos += skip_bytes;
+ cookie.chars_to_skip = chars_to_skip;
+ if (chars_to_skip == 0)
+ goto finally;
+
+ /* We should be close to the desired position. Now feed the decoder one
+ * byte at a time until we reach the `chars_to_skip` target.
+ * As we go, note the nearest "safe start point" before the current
+ * location (a point where the decoder has nothing buffered, so seek()
* can safely start from there and advance to this location).
*/
chars_decoded = 0;
input = PyBytes_AS_STRING(next_input);
input_end = input + PyBytes_GET_SIZE(next_input);
+ input += skip_bytes;
while (input < input_end) {
- PyObject *state;
- char *dec_buffer;
- Py_ssize_t dec_buffer_len;
- int dec_flags;
-
- PyObject *decoded = PyObject_CallMethod(
- self->decoder, "decode", "y#", input, 1);
- if (decoded == NULL)
- goto fail;
- assert (PyUnicode_Check(decoded));
- chars_decoded += PyUnicode_GET_SIZE(decoded);
- Py_DECREF(decoded);
+ Py_ssize_t n;
+ DECODER_DECODE(input, 1, n);
+ /* We got n chars for 1 byte */
+ chars_decoded += n;
cookie.bytes_to_feed += 1;
-
- state = PyObject_CallMethodObjArgs(self->decoder,
- _PyIO_str_getstate, NULL);
- if (state == NULL)
- goto fail;
- if (!PyArg_Parse(state, "(y#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) {
- Py_DECREF(state);
- goto fail;
- }
- Py_DECREF(state);
+ DECODER_GETSTATE();
if (dec_buffer_len == 0 && chars_decoded <= chars_to_skip) {
/* Decoder buffer is empty, so this is a safe start point. */
@@ -2286,12 +2365,12 @@ textiowrapper_tell(textio *self, PyObject *args)
}
if (input == input_end) {
/* We didn't get enough decoded data; signal EOF to get more. */
- PyObject *decoded = PyObject_CallMethod(
- self->decoder, "decode", "yi", "", /* final = */ 1);
+ PyObject *decoded = _PyObject_CallMethodId(
+ self->decoder, &PyId_decode, "yi", "", /* final = */ 1);
if (decoded == NULL)
goto fail;
assert (PyUnicode_Check(decoded));
- chars_decoded += PyUnicode_GET_SIZE(decoded);
+ chars_decoded += PyUnicode_GET_LENGTH(decoded);
Py_DECREF(decoded);
cookie.need_eof = 1;
@@ -2302,9 +2381,8 @@ textiowrapper_tell(textio *self, PyObject *args)
}
}
- /* finally */
- Py_XDECREF(posobj);
- res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state);
+finally:
+ res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "(O)", saved_state);
Py_DECREF(saved_state);
if (res == NULL)
return NULL;
@@ -2314,13 +2392,12 @@ textiowrapper_tell(textio *self, PyObject *args)
cookie.chars_to_skip = Py_SAFE_DOWNCAST(chars_to_skip, Py_ssize_t, int);
return textiowrapper_build_cookie(&cookie);
- fail:
- Py_XDECREF(posobj);
+fail:
if (saved_state) {
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
- res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state);
+ res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "(O)", saved_state);
Py_DECREF(saved_state);
if (res == NULL)
return NULL;
@@ -2360,7 +2437,7 @@ textiowrapper_repr(textio *self)
res = PyUnicode_FromString("<_io.TextIOWrapper");
if (res == NULL)
return NULL;
- nameobj = PyObject_GetAttrString((PyObject *) self, "name");
+ nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -2376,7 +2453,7 @@ textiowrapper_repr(textio *self)
if (res == NULL)
return NULL;
}
- modeobj = PyObject_GetAttrString((PyObject *) self, "mode");
+ modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode);
if (modeobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -2408,35 +2485,35 @@ static PyObject *
textiowrapper_fileno(textio *self, PyObject *args)
{
CHECK_INITIALIZED(self);
- return PyObject_CallMethod(self->buffer, "fileno", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_fileno, NULL);
}
static PyObject *
textiowrapper_seekable(textio *self, PyObject *args)
{
CHECK_INITIALIZED(self);
- return PyObject_CallMethod(self->buffer, "seekable", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_seekable, NULL);
}
static PyObject *
textiowrapper_readable(textio *self, PyObject *args)
{
CHECK_INITIALIZED(self);
- return PyObject_CallMethod(self->buffer, "readable", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL);
}
static PyObject *
textiowrapper_writable(textio *self, PyObject *args)
{
CHECK_INITIALIZED(self);
- return PyObject_CallMethod(self->buffer, "writable", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL);
}
static PyObject *
textiowrapper_isatty(textio *self, PyObject *args)
{
CHECK_INITIALIZED(self);
- return PyObject_CallMethod(self->buffer, "isatty", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL);
}
static PyObject *
@@ -2455,7 +2532,7 @@ textiowrapper_flush(textio *self, PyObject *args)
self->telling = self->seekable;
if (_textiowrapper_writeflush(self) < 0)
return NULL;
- return PyObject_CallMethod(self->buffer, "flush", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_flush, NULL);
}
static PyObject *
@@ -2478,20 +2555,20 @@ textiowrapper_close(textio *self, PyObject *args)
}
else {
if (self->deallocating) {
- res = PyObject_CallMethod(self->buffer, "_dealloc_warn", "O", self);
+ res = _PyObject_CallMethodId(self->buffer, &PyId__dealloc_warn, "O", self);
if (res)
Py_DECREF(res);
else
PyErr_Clear();
}
- res = PyObject_CallMethod((PyObject *)self, "flush", NULL);
+ res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL);
if (res == NULL) {
return NULL;
}
else
Py_DECREF(res);
- return PyObject_CallMethod(self->buffer, "close", NULL);
+ return _PyObject_CallMethodId(self->buffer, &PyId_close, NULL);
}
}
@@ -2519,10 +2596,10 @@ textiowrapper_iternext(textio *self)
}
}
- if (line == NULL)
+ if (line == NULL || PyUnicode_READY(line) == -1)
return NULL;
- if (PyUnicode_GET_SIZE(line) == 0) {
+ if (PyUnicode_GET_LENGTH(line) == 0) {
/* Reached EOF or would have blocked */
Py_DECREF(line);
Py_CLEAR(self->snapshot);
@@ -2537,7 +2614,7 @@ static PyObject *
textiowrapper_name_get(textio *self, void *context)
{
CHECK_INITIALIZED(self);
- return PyObject_GetAttrString(self->buffer, "name");
+ return _PyObject_GetAttrId(self->buffer, &PyId_name);
}
static PyObject *
diff --git a/Modules/_json.c b/Modules/_json.c
index 01436b6..5b42f6f 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -1,5 +1,7 @@
#include "Python.h"
#include "structmember.h"
+#include "accu.h"
+
#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE)
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
#endif
@@ -76,6 +78,21 @@ static PyMemberDef encoder_members[] = {
};
static PyObject *
+join_list_unicode(PyObject *lst)
+{
+ /* return u''.join(lst) */
+ static PyObject *sep = NULL;
+ if (sep == NULL) {
+ sep = PyUnicode_FromStringAndSize("", 0);
+ if (sep == NULL)
+ return NULL;
+ }
+ return PyUnicode_Join(sep, lst);
+}
+
+/* Forward decls */
+
+static PyObject *
ascii_escape_unicode(PyObject *pystr);
static PyObject *
py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr);
@@ -101,11 +118,11 @@ encoder_dealloc(PyObject *self);
static int
encoder_clear(PyObject *self);
static int
-encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level);
+encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level);
static int
-encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level);
+encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, PyObject *obj, Py_ssize_t indent_level);
static int
-encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level);
+encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, PyObject *dct, Py_ssize_t indent_level);
static PyObject *
_encoded_const(PyObject *obj);
static void
@@ -122,13 +139,6 @@ encoder_encode_float(PyEncoderObject *s, PyObject *obj);
#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"')
#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r'))
-#define MIN_EXPANSION 6
-#ifdef Py_UNICODE_WIDE
-#define MAX_EXPANSION (2 * MIN_EXPANSION)
-#else
-#define MAX_EXPANSION MIN_EXPANSION
-#endif
-
static int
_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr)
{
@@ -147,7 +157,7 @@ _convertPyInt_FromSsize_t(Py_ssize_t *size_ptr)
}
static Py_ssize_t
-ascii_escape_unichar(Py_UNICODE c, Py_UNICODE *output, Py_ssize_t chars)
+ascii_escape_unichar(Py_UCS4 c, unsigned char *output, Py_ssize_t chars)
{
/* Escape unicode code point c to ASCII escape sequences
in char *output. output must have at least 12 bytes unused to
@@ -162,25 +172,23 @@ ascii_escape_unichar(Py_UNICODE c, Py_UNICODE *output, Py_ssize_t chars)
case '\r': output[chars++] = 'r'; break;
case '\t': output[chars++] = 't'; break;
default:
-#ifdef Py_UNICODE_WIDE
if (c >= 0x10000) {
/* UTF-16 surrogate pair */
- Py_UNICODE v = c - 0x10000;
+ Py_UCS4 v = c - 0x10000;
c = 0xd800 | ((v >> 10) & 0x3ff);
output[chars++] = 'u';
- output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
- output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf];
- output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf];
- output[chars++] = "0123456789abcdef"[(c ) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
+ output[chars++] = Py_hexdigits[(c ) & 0xf];
c = 0xdc00 | (v & 0x3ff);
output[chars++] = '\\';
}
-#endif
output[chars++] = 'u';
- output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];
- output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf];
- output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf];
- output[chars++] = "0123456789abcdef"[(c ) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 12) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 8) & 0xf];
+ output[chars++] = Py_hexdigits[(c >> 4) & 0xf];
+ output[chars++] = Py_hexdigits[(c ) & 0xf];
}
return chars;
}
@@ -192,54 +200,53 @@ ascii_escape_unicode(PyObject *pystr)
Py_ssize_t i;
Py_ssize_t input_chars;
Py_ssize_t output_size;
- Py_ssize_t max_output_size;
Py_ssize_t chars;
PyObject *rval;
- Py_UNICODE *output;
- Py_UNICODE *input_unicode;
+ void *input;
+ unsigned char *output;
+ int kind;
+
+ if (PyUnicode_READY(pystr) == -1)
+ return NULL;
- input_chars = PyUnicode_GET_SIZE(pystr);
- input_unicode = PyUnicode_AS_UNICODE(pystr);
+ input_chars = PyUnicode_GET_LENGTH(pystr);
+ input = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
- /* One char input can be up to 6 chars output, estimate 4 of these */
- output_size = 2 + (MIN_EXPANSION * 4) + input_chars;
- max_output_size = 2 + (input_chars * MAX_EXPANSION);
- rval = PyUnicode_FromStringAndSize(NULL, output_size);
+ /* Compute the output size */
+ for (i = 0, output_size = 2; i < input_chars; i++) {
+ Py_UCS4 c = PyUnicode_READ(kind, input, i);
+ if (S_CHAR(c))
+ output_size++;
+ else {
+ switch(c) {
+ case '\\': case '"': case '\b': case '\f':
+ case '\n': case '\r': case '\t':
+ output_size += 2; break;
+ default:
+ output_size += c >= 0x10000 ? 12 : 6;
+ }
+ }
+ }
+
+ rval = PyUnicode_New(output_size, 127);
if (rval == NULL) {
return NULL;
}
- output = PyUnicode_AS_UNICODE(rval);
+ output = PyUnicode_1BYTE_DATA(rval);
chars = 0;
output[chars++] = '"';
for (i = 0; i < input_chars; i++) {
- Py_UNICODE c = input_unicode[i];
+ Py_UCS4 c = PyUnicode_READ(kind, input, i);
if (S_CHAR(c)) {
output[chars++] = c;
}
else {
chars = ascii_escape_unichar(c, output, chars);
}
- if (output_size - chars < (1 + MAX_EXPANSION)) {
- /* There's more than four, so let's resize by a lot */
- Py_ssize_t new_output_size = output_size * 2;
- /* This is an upper bound */
- if (new_output_size > max_output_size) {
- new_output_size = max_output_size;
- }
- /* Make sure that the output size changed before resizing */
- if (new_output_size != output_size) {
- output_size = new_output_size;
- if (PyUnicode_Resize(&rval, output_size) == -1) {
- return NULL;
- }
- output = PyUnicode_AS_UNICODE(rval);
- }
- }
}
output[chars++] = '"';
- if (PyUnicode_Resize(&rval, chars) == -1) {
- return NULL;
- }
+ assert(_PyUnicode_CheckConsistency(rval, 1));
return rval;
}
@@ -267,19 +274,6 @@ raise_errmsg(char *msg, PyObject *s, Py_ssize_t end)
}
static PyObject *
-join_list_unicode(PyObject *lst)
-{
- /* return u''.join(lst) */
- static PyObject *sep = NULL;
- if (sep == NULL) {
- sep = PyUnicode_FromStringAndSize("", 0);
- if (sep == NULL)
- return NULL;
- }
- return PyUnicode_Join(sep, lst);
-}
-
-static PyObject *
_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
/* return (rval, idx) tuple, stealing reference to rval */
PyObject *tpl;
@@ -333,22 +327,30 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
Return value is a new PyUnicode
*/
PyObject *rval = NULL;
- Py_ssize_t len = PyUnicode_GET_SIZE(pystr);
+ Py_ssize_t len;
Py_ssize_t begin = end - 1;
- Py_ssize_t next = begin;
- const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr);
+ Py_ssize_t next /* = begin */;
+ const void *buf;
+ int kind;
PyObject *chunks = NULL;
PyObject *chunk = NULL;
+ if (PyUnicode_READY(pystr) == -1)
+ return 0;
+
+ len = PyUnicode_GET_LENGTH(pystr);
+ buf = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
+
if (end < 0 || len <= end) {
PyErr_SetString(PyExc_ValueError, "end is out of bounds");
goto bail;
}
while (1) {
/* Find the end of the string or the next escape */
- Py_UNICODE c = 0;
+ Py_UCS4 c = 0;
for (next = end; next < len; next++) {
- c = buf[next];
+ c = PyUnicode_READ(kind, buf, next);
if (c == '"' || c == '\\') {
break;
}
@@ -364,7 +366,10 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
/* Pick up this chunk if it's not zero length */
if (next != end) {
APPEND_OLD_CHUNK
- chunk = PyUnicode_FromUnicode(&buf[end], next - end);
+ chunk = PyUnicode_FromKindAndData(
+ kind,
+ (char*)buf + kind * end,
+ next - end);
if (chunk == NULL) {
goto bail;
}
@@ -378,7 +383,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
raise_errmsg("Unterminated string starting at", pystr, begin);
goto bail;
}
- c = buf[next];
+ c = PyUnicode_READ(kind, buf, next);
if (c != 'u') {
/* Non-unicode backslash escapes */
end = next + 1;
@@ -408,7 +413,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
}
/* Decode 4 hex digits */
for (; next < end; next++) {
- Py_UNICODE digit = buf[next];
+ Py_UCS4 digit = PyUnicode_READ(kind, buf, next);
c <<= 4;
switch (digit) {
case '0': case '1': case '2': case '3': case '4':
@@ -425,22 +430,22 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
goto bail;
}
}
-#ifdef Py_UNICODE_WIDE
/* Surrogate pair */
if ((c & 0xfc00) == 0xd800) {
- Py_UNICODE c2 = 0;
+ Py_UCS4 c2 = 0;
if (end + 6 >= len) {
raise_errmsg("Unpaired high surrogate", pystr, end - 5);
goto bail;
}
- if (buf[next++] != '\\' || buf[next++] != 'u') {
+ if (PyUnicode_READ(kind, buf, next++) != '\\' ||
+ PyUnicode_READ(kind, buf, next++) != 'u') {
raise_errmsg("Unpaired high surrogate", pystr, end - 5);
goto bail;
}
end += 6;
/* Decode 4 hex digits */
for (; next < end; next++) {
- Py_UNICODE digit = buf[next];
+ Py_UCS4 digit = PyUnicode_READ(kind, buf, next);
c2 <<= 4;
switch (digit) {
case '0': case '1': case '2': case '3': case '4':
@@ -467,10 +472,9 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
raise_errmsg("Unpaired low surrogate", pystr, end - 5);
goto bail;
}
-#endif
}
APPEND_OLD_CHUNK
- chunk = PyUnicode_FromUnicode(&c, 1);
+ chunk = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, &c, 1);
if (chunk == NULL) {
goto bail;
}
@@ -608,8 +612,9 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
Returns a new PyObject (usually a dict, but object_hook can change that)
*/
- Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
- Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
+ void *str;
+ int kind;
+ Py_ssize_t end_idx;
PyObject *val = NULL;
PyObject *rval = NULL;
PyObject *key = NULL;
@@ -617,6 +622,13 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
int has_pairs_hook = (s->object_pairs_hook != Py_None);
Py_ssize_t next_idx;
+ if (PyUnicode_READY(pystr) == -1)
+ return NULL;
+
+ str = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
+ end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
+
if (has_pairs_hook)
rval = PyList_New(0);
else
@@ -625,15 +637,15 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
return NULL;
/* skip whitespace after { */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind,str, idx))) idx++;
/* only loop if the object is non-empty */
- if (idx <= end_idx && str[idx] != '}') {
+ if (idx <= end_idx && PyUnicode_READ(kind, str, idx) != '}') {
while (idx <= end_idx) {
PyObject *memokey;
/* read key */
- if (str[idx] != '"') {
+ if (PyUnicode_READ(kind, str, idx) != '"') {
raise_errmsg("Expecting property name enclosed in double quotes", pystr, idx);
goto bail;
}
@@ -653,13 +665,13 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
idx = next_idx;
/* skip whitespace between key and : delimiter, read :, skip whitespace */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
- if (idx > end_idx || str[idx] != ':') {
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ':') {
raise_errmsg("Expecting ':' delimiter", pystr, idx);
goto bail;
}
idx++;
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* read any JSON term */
val = scan_once_unicode(s, pystr, idx, &next_idx);
@@ -687,26 +699,26 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss
idx = next_idx;
/* skip whitespace before } or , */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* bail if the object is closed or we didn't get the , delimiter */
if (idx > end_idx) break;
- if (str[idx] == '}') {
+ if (PyUnicode_READ(kind, str, idx) == '}') {
break;
}
- else if (str[idx] != ',') {
+ else if (PyUnicode_READ(kind, str, idx) != ',') {
raise_errmsg("Expecting ',' delimiter", pystr, idx);
goto bail;
}
idx++;
/* skip whitespace after , delimiter */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
}
}
/* verify that idx < end_idx, str[idx] should be '}' */
- if (idx > end_idx || str[idx] != '}') {
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != '}') {
raise_errmsg("Expecting object", pystr, end_idx);
goto bail;
}
@@ -742,19 +754,27 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
Returns a new PyList
*/
- Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
- Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
+ void *str;
+ int kind;
+ Py_ssize_t end_idx;
PyObject *val = NULL;
PyObject *rval = PyList_New(0);
Py_ssize_t next_idx;
if (rval == NULL)
return NULL;
+ if (PyUnicode_READY(pystr) == -1)
+ return NULL;
+
+ str = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
+ end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
+
/* skip whitespace after [ */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* only loop if the array is non-empty */
- if (idx <= end_idx && str[idx] != ']') {
+ if (idx <= end_idx && PyUnicode_READ(kind, str, idx) != ']') {
while (idx <= end_idx) {
/* read any JSON term */
@@ -769,26 +789,26 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi
idx = next_idx;
/* skip whitespace between term and , */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
/* bail if the array is closed or we didn't get the , delimiter */
if (idx > end_idx) break;
- if (str[idx] == ']') {
+ if (PyUnicode_READ(kind, str, idx) == ']') {
break;
}
- else if (str[idx] != ',') {
+ else if (PyUnicode_READ(kind, str, idx) != ',') {
raise_errmsg("Expecting ',' delimiter", pystr, idx);
goto bail;
}
idx++;
/* skip whitespace after , */
- while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;
+ while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
}
}
- /* verify that idx < end_idx, str[idx] should be ']' */
- if (idx > end_idx || str[idx] != ']') {
+ /* verify that idx < end_idx, PyUnicode_READ(kind, str, idx) should be ']' */
+ if (idx > end_idx || PyUnicode_READ(kind, str, idx) != ']') {
raise_errmsg("Expecting object", pystr, end_idx);
goto bail;
}
@@ -820,7 +840,7 @@ _parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *
/* rval = parse_constant(constant) */
rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL);
- idx += PyUnicode_GET_SIZE(cstr);
+ idx += PyUnicode_GET_LENGTH(cstr);
Py_DECREF(cstr);
*next_idx_ptr = idx;
return rval;
@@ -837,15 +857,24 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
PyInt, PyLong, or PyFloat.
May return other types if parse_int or parse_float are set
*/
- Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
- Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;
+ void *str;
+ int kind;
+ Py_ssize_t end_idx;
Py_ssize_t idx = start;
int is_float = 0;
PyObject *rval;
- PyObject *numstr;
+ PyObject *numstr = NULL;
+ PyObject *custom_func;
+
+ if (PyUnicode_READY(pystr) == -1)
+ return NULL;
+
+ str = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
+ end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
/* read a sign if it's there, make sure it's not the end of the string */
- if (str[idx] == '-') {
+ if (PyUnicode_READ(kind, str, idx) == '-') {
idx++;
if (idx > end_idx) {
PyErr_SetNone(PyExc_StopIteration);
@@ -854,12 +883,12 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
}
/* read as many integer digits as we find as long as it doesn't start with 0 */
- if (str[idx] >= '1' && str[idx] <= '9') {
+ if (PyUnicode_READ(kind, str, idx) >= '1' && PyUnicode_READ(kind, str, idx) <= '9') {
idx++;
- while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
+ while (idx <= end_idx && PyUnicode_READ(kind, str, idx) >= '0' && PyUnicode_READ(kind, str, idx) <= '9') idx++;
}
/* if it starts with 0 we only expect one integer digit */
- else if (str[idx] == '0') {
+ else if (PyUnicode_READ(kind, str, idx) == '0') {
idx++;
}
/* no integer digits, error */
@@ -869,25 +898,25 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
}
/* if the next char is '.' followed by a digit then read all float digits */
- if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') {
+ if (idx < end_idx && PyUnicode_READ(kind, str, idx) == '.' && PyUnicode_READ(kind, str, idx + 1) >= '0' && PyUnicode_READ(kind, str, idx + 1) <= '9') {
is_float = 1;
idx += 2;
- while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
+ while (idx <= end_idx && PyUnicode_READ(kind, str, idx) >= '0' && PyUnicode_READ(kind, str, idx) <= '9') idx++;
}
/* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */
- if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) {
+ if (idx < end_idx && (PyUnicode_READ(kind, str, idx) == 'e' || PyUnicode_READ(kind, str, idx) == 'E')) {
Py_ssize_t e_start = idx;
idx++;
/* read an exponent sign if present */
- if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++;
+ if (idx < end_idx && (PyUnicode_READ(kind, str, idx) == '-' || PyUnicode_READ(kind, str, idx) == '+')) idx++;
/* read all digits */
- while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;
+ while (idx <= end_idx && PyUnicode_READ(kind, str, idx) >= '0' && PyUnicode_READ(kind, str, idx) <= '9') idx++;
/* if we got a digit, then parse as float. if not, backtrack */
- if (str[idx - 1] >= '0' && str[idx - 1] <= '9') {
+ if (PyUnicode_READ(kind, str, idx - 1) >= '0' && PyUnicode_READ(kind, str, idx - 1) <= '9') {
is_float = 1;
}
else {
@@ -895,22 +924,39 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_
}
}
- /* copy the section we determined to be a number */
- numstr = PyUnicode_FromUnicode(&str[start], idx - start);
- if (numstr == NULL)
- return NULL;
- if (is_float) {
- /* parse as a float using a fast path if available, otherwise call user defined method */
- if (s->parse_float != (PyObject *)&PyFloat_Type) {
- rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL);
- }
- else {
- rval = PyFloat_FromString(numstr);
- }
+ if (is_float && s->parse_float != (PyObject *)&PyFloat_Type)
+ custom_func = s->parse_float;
+ else if (!is_float && s->parse_int != (PyObject *) &PyLong_Type)
+ custom_func = s->parse_int;
+ else
+ custom_func = NULL;
+
+ if (custom_func) {
+ /* copy the section we determined to be a number */
+ numstr = PyUnicode_FromKindAndData(kind,
+ (char*)str + kind * start,
+ idx - start);
+ if (numstr == NULL)
+ return NULL;
+ rval = PyObject_CallFunctionObjArgs(custom_func, numstr, NULL);
}
else {
- /* no fast path for unicode -> int, just call */
- rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL);
+ Py_ssize_t i, n;
+ char *buf;
+ /* Straight conversion to ASCII, to avoid costly conversion of
+ decimal unicode digits (which cannot appear here) */
+ n = idx - start;
+ numstr = PyBytes_FromStringAndSize(NULL, n);
+ if (numstr == NULL)
+ return NULL;
+ buf = PyBytes_AS_STRING(numstr);
+ for (i = 0; i < n; i++) {
+ buf[i] = (char) PyUnicode_READ(kind, str, i + start);
+ }
+ if (is_float)
+ rval = PyFloat_FromString(numstr);
+ else
+ rval = PyLong_FromString(buf, NULL, 10);
}
Py_DECREF(numstr);
*next_idx_ptr = idx;
@@ -928,13 +974,23 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
Returns a new PyObject representation of the term.
*/
PyObject *res;
- Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);
- Py_ssize_t length = PyUnicode_GET_SIZE(pystr);
+ void *str;
+ int kind;
+ Py_ssize_t length;
+
+ if (PyUnicode_READY(pystr) == -1)
+ return NULL;
+
+ str = PyUnicode_DATA(pystr);
+ kind = PyUnicode_KIND(pystr);
+ length = PyUnicode_GET_LENGTH(pystr);
+
if (idx >= length) {
PyErr_SetNone(PyExc_StopIteration);
return NULL;
}
- switch (str[idx]) {
+
+ switch (PyUnicode_READ(kind, str, idx)) {
case '"':
/* string */
return scanstring_unicode(pystr, idx + 1,
@@ -958,7 +1014,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
return res;
case 'n':
/* null */
- if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') {
+ if ((idx + 3 < length) && PyUnicode_READ(kind, str, idx + 1) == 'u' && PyUnicode_READ(kind, str, idx + 2) == 'l' && PyUnicode_READ(kind, str, idx + 3) == 'l') {
Py_INCREF(Py_None);
*next_idx_ptr = idx + 4;
return Py_None;
@@ -966,7 +1022,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
break;
case 't':
/* true */
- if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') {
+ if ((idx + 3 < length) && PyUnicode_READ(kind, str, idx + 1) == 'r' && PyUnicode_READ(kind, str, idx + 2) == 'u' && PyUnicode_READ(kind, str, idx + 3) == 'e') {
Py_INCREF(Py_True);
*next_idx_ptr = idx + 4;
return Py_True;
@@ -974,7 +1030,10 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
break;
case 'f':
/* false */
- if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') {
+ if ((idx + 4 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' &&
+ PyUnicode_READ(kind, str, idx + 2) == 'l' &&
+ PyUnicode_READ(kind, str, idx + 3) == 's' &&
+ PyUnicode_READ(kind, str, idx + 4) == 'e') {
Py_INCREF(Py_False);
*next_idx_ptr = idx + 5;
return Py_False;
@@ -982,19 +1041,33 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_
break;
case 'N':
/* NaN */
- if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') {
+ if ((idx + 2 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' &&
+ PyUnicode_READ(kind, str, idx + 2) == 'N') {
return _parse_constant(s, "NaN", idx, next_idx_ptr);
}
break;
case 'I':
/* Infinity */
- if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') {
+ if ((idx + 7 < length) && PyUnicode_READ(kind, str, idx + 1) == 'n' &&
+ PyUnicode_READ(kind, str, idx + 2) == 'f' &&
+ PyUnicode_READ(kind, str, idx + 3) == 'i' &&
+ PyUnicode_READ(kind, str, idx + 4) == 'n' &&
+ PyUnicode_READ(kind, str, idx + 5) == 'i' &&
+ PyUnicode_READ(kind, str, idx + 6) == 't' &&
+ PyUnicode_READ(kind, str, idx + 7) == 'y') {
return _parse_constant(s, "Infinity", idx, next_idx_ptr);
}
break;
case '-':
/* -Infinity */
- if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') {
+ if ((idx + 8 < length) && PyUnicode_READ(kind, str, idx + 1) == 'I' &&
+ PyUnicode_READ(kind, str, idx + 2) == 'n' &&
+ PyUnicode_READ(kind, str, idx + 3) == 'f' &&
+ PyUnicode_READ(kind, str, idx + 4) == 'i' &&
+ PyUnicode_READ(kind, str, idx + 5) == 'n' &&
+ PyUnicode_READ(kind, str, idx + 6) == 'i' &&
+ PyUnicode_READ(kind, str, idx + 7) == 't' &&
+ PyUnicode_READ(kind, str, idx + 8) == 'y') {
return _parse_constant(s, "-Infinity", idx, next_idx_ptr);
}
break;
@@ -1210,22 +1283,22 @@ encoder_call(PyObject *self, PyObject *args, PyObject *kwds)
/* Python callable interface to encode_listencode_obj */
static char *kwlist[] = {"obj", "_current_indent_level", NULL};
PyObject *obj;
- PyObject *rval;
Py_ssize_t indent_level;
PyEncoderObject *s;
+ _PyAccu acc;
+
assert(PyEncoder_Check(self));
s = (PyEncoderObject *)self;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist,
&obj, _convertPyInt_AsSsize_t, &indent_level))
return NULL;
- rval = PyList_New(0);
- if (rval == NULL)
+ if (_PyAccu_Init(&acc))
return NULL;
- if (encoder_listencode_obj(s, rval, obj, indent_level)) {
- Py_DECREF(rval);
+ if (encoder_listencode_obj(s, &acc, obj, indent_level)) {
+ _PyAccu_Destroy(&acc);
return NULL;
}
- return rval;
+ return _PyAccu_FinishAsList(&acc);
}
static PyObject *
@@ -1297,18 +1370,19 @@ encoder_encode_string(PyEncoderObject *s, PyObject *obj)
}
static int
-_steal_list_append(PyObject *lst, PyObject *stolen)
+_steal_accumulate(_PyAccu *acc, PyObject *stolen)
{
/* Append stolen and then decrement its reference count */
- int rval = PyList_Append(lst, stolen);
+ int rval = _PyAccu_Accumulate(acc, stolen);
Py_DECREF(stolen);
return rval;
}
static int
-encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level)
+encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc,
+ PyObject *obj, Py_ssize_t indent_level)
{
- /* Encode Python object obj to a JSON term, rval is a PyList */
+ /* Encode Python object obj to a JSON term */
PyObject *newobj;
int rv;
@@ -1316,38 +1390,38 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
PyObject *cstr = _encoded_const(obj);
if (cstr == NULL)
return -1;
- return _steal_list_append(rval, cstr);
+ return _steal_accumulate(acc, cstr);
}
else if (PyUnicode_Check(obj))
{
PyObject *encoded = encoder_encode_string(s, obj);
if (encoded == NULL)
return -1;
- return _steal_list_append(rval, encoded);
+ return _steal_accumulate(acc, encoded);
}
else if (PyLong_Check(obj)) {
PyObject *encoded = PyObject_Str(obj);
if (encoded == NULL)
return -1;
- return _steal_list_append(rval, encoded);
+ return _steal_accumulate(acc, encoded);
}
else if (PyFloat_Check(obj)) {
PyObject *encoded = encoder_encode_float(s, obj);
if (encoded == NULL)
return -1;
- return _steal_list_append(rval, encoded);
+ return _steal_accumulate(acc, encoded);
}
else if (PyList_Check(obj) || PyTuple_Check(obj)) {
if (Py_EnterRecursiveCall(" while encoding a JSON object"))
return -1;
- rv = encoder_listencode_list(s, rval, obj, indent_level);
+ rv = encoder_listencode_list(s, acc, obj, indent_level);
Py_LeaveRecursiveCall();
return rv;
}
else if (PyDict_Check(obj)) {
if (Py_EnterRecursiveCall(" while encoding a JSON object"))
return -1;
- rv = encoder_listencode_dict(s, rval, obj, indent_level);
+ rv = encoder_listencode_dict(s, acc, obj, indent_level);
Py_LeaveRecursiveCall();
return rv;
}
@@ -1378,7 +1452,7 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
if (Py_EnterRecursiveCall(" while encoding a JSON object"))
return -1;
- rv = encoder_listencode_obj(s, rval, newobj, indent_level);
+ rv = encoder_listencode_obj(s, acc, newobj, indent_level);
Py_LeaveRecursiveCall();
Py_DECREF(newobj);
@@ -1398,9 +1472,10 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
}
static int
-encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level)
+encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc,
+ PyObject *dct, Py_ssize_t indent_level)
{
- /* Encode Python dict dct a JSON term, rval is a PyList */
+ /* Encode Python dict dct a JSON term */
static PyObject *open_dict = NULL;
static PyObject *close_dict = NULL;
static PyObject *empty_dict = NULL;
@@ -1420,7 +1495,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
return -1;
}
if (Py_SIZE(dct) == 0)
- return PyList_Append(rval, empty_dict);
+ return _PyAccu_Accumulate(acc, empty_dict);
if (s->markers != Py_None) {
int has_key;
@@ -1438,7 +1513,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
}
}
- if (PyList_Append(rval, open_dict))
+ if (_PyAccu_Accumulate(acc, open_dict))
goto bail;
if (s->indent != Py_None) {
@@ -1525,7 +1600,7 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
}
if (idx) {
- if (PyList_Append(rval, s->item_separator))
+ if (_PyAccu_Accumulate(acc, s->item_separator))
goto bail;
}
@@ -1533,16 +1608,16 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
Py_CLEAR(kstr);
if (encoded == NULL)
goto bail;
- if (PyList_Append(rval, encoded)) {
+ if (_PyAccu_Accumulate(acc, encoded)) {
Py_DECREF(encoded);
goto bail;
}
Py_DECREF(encoded);
- if (PyList_Append(rval, s->key_separator))
+ if (_PyAccu_Accumulate(acc, s->key_separator))
goto bail;
value = PyTuple_GET_ITEM(item, 1);
- if (encoder_listencode_obj(s, rval, value, indent_level))
+ if (encoder_listencode_obj(s, acc, value, indent_level))
goto bail;
idx += 1;
Py_DECREF(item);
@@ -1556,14 +1631,13 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
goto bail;
Py_CLEAR(ident);
}
+ /* TODO DOES NOT RUN; dead code
if (s->indent != Py_None) {
- /* TODO: DOES NOT RUN */
indent_level -= 1;
- /*
- yield '\n' + (' ' * (_indent * _current_indent_level))
- */
- }
- if (PyList_Append(rval, close_dict))
+
+ yield '\n' + (' ' * (_indent * _current_indent_level))
+ }*/
+ if (_PyAccu_Accumulate(acc, close_dict))
goto bail;
return 0;
@@ -1577,9 +1651,10 @@ bail:
static int
-encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level)
+encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc,
+ PyObject *seq, Py_ssize_t indent_level)
{
- /* Encode Python list seq to a JSON term, rval is a PyList */
+ /* Encode Python list seq to a JSON term */
static PyObject *open_array = NULL;
static PyObject *close_array = NULL;
static PyObject *empty_array = NULL;
@@ -1600,7 +1675,7 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss
return -1;
if (PySequence_Fast_GET_SIZE(s_fast) == 0) {
Py_DECREF(s_fast);
- return PyList_Append(rval, empty_array);
+ return _PyAccu_Accumulate(acc, empty_array);
}
if (s->markers != Py_None) {
@@ -1619,7 +1694,7 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss
}
}
- if (PyList_Append(rval, open_array))
+ if (_PyAccu_Accumulate(acc, open_array))
goto bail;
if (s->indent != Py_None) {
/* TODO: DOES NOT RUN */
@@ -1633,10 +1708,10 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss
for (i = 0; i < PySequence_Fast_GET_SIZE(s_fast); i++) {
PyObject *obj = PySequence_Fast_GET_ITEM(s_fast, i);
if (i) {
- if (PyList_Append(rval, s->item_separator))
+ if (_PyAccu_Accumulate(acc, s->item_separator))
goto bail;
}
- if (encoder_listencode_obj(s, rval, obj, indent_level))
+ if (encoder_listencode_obj(s, acc, obj, indent_level))
goto bail;
}
if (ident != NULL) {
@@ -1644,14 +1719,14 @@ encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ss
goto bail;
Py_CLEAR(ident);
}
+
+ /* TODO: DOES NOT RUN
if (s->indent != Py_None) {
- /* TODO: DOES NOT RUN */
indent_level -= 1;
- /*
- yield '\n' + (' ' * (_indent * _current_indent_level))
- */
- }
- if (PyList_Append(rval, close_array))
+
+ yield '\n' + (' ' * (_indent * _current_indent_level))
+ }*/
+ if (_PyAccu_Accumulate(acc, close_array))
goto bail;
Py_DECREF(s_fast);
return 0;
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 1001dd2..cc688ba 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -42,43 +42,6 @@ PyDoc_STRVAR(locale__doc__, "Support for POSIX locales.");
static PyObject *Error;
-/* Convert a char* to a Unicode object according to the current locale */
-static PyObject*
-str2uni(const char* s)
-{
-#ifdef HAVE_BROKEN_MBSTOWCS
- size_t needed = strlen(s);
-#else
- size_t needed = mbstowcs(NULL, s, 0);
-#endif
- size_t res1;
- wchar_t smallbuf[30];
- wchar_t *dest;
- PyObject *res2;
- if (needed == (size_t)-1) {
- PyErr_SetString(PyExc_ValueError, "Cannot convert byte to string");
- return NULL;
- }
- if (needed*sizeof(wchar_t) < sizeof(smallbuf))
- dest = smallbuf;
- else {
- dest = PyMem_Malloc((needed+1)*sizeof(wchar_t));
- if (!dest)
- return PyErr_NoMemory();
- }
- /* This shouldn't fail now */
- res1 = mbstowcs(dest, s, needed+1);
-#ifdef HAVE_BROKEN_MBSTOWCS
- assert(res1 != (size_t)-1);
-#else
- assert(res1 == needed);
-#endif
- res2 = PyUnicode_FromWideChar(dest, res1);
- if (dest != smallbuf)
- PyMem_Free(dest);
- return res2;
-}
-
/* support functions for formatting floating point numbers */
PyDoc_STRVAR(setlocale__doc__,
@@ -149,7 +112,7 @@ PyLocale_setlocale(PyObject* self, PyObject* args)
PyErr_SetString(Error, "unsupported locale setting");
return NULL;
}
- result_object = str2uni(result);
+ result_object = PyUnicode_DecodeLocale(result, NULL);
if (!result_object)
return NULL;
} else {
@@ -159,7 +122,7 @@ PyLocale_setlocale(PyObject* self, PyObject* args)
PyErr_SetString(Error, "locale query failed");
return NULL;
}
- result_object = str2uni(result);
+ result_object = PyUnicode_DecodeLocale(result, NULL);
}
return result_object;
}
@@ -185,7 +148,7 @@ PyLocale_localeconv(PyObject* self)
involved herein */
#define RESULT_STRING(s)\
- x = str2uni(l->s); \
+ x = PyUnicode_DecodeLocale(l->s, NULL); \
if (!x) goto failed;\
PyDict_SetItemString(result, #s, x);\
Py_XDECREF(x)
@@ -271,51 +234,43 @@ Return a string that can be used as a key for locale-aware comparisons.");
static PyObject*
PyLocale_strxfrm(PyObject* self, PyObject* args)
{
- Py_UNICODE *s0;
- Py_ssize_t n0;
- wchar_t *s, *buf = NULL;
- size_t n1, n2;
+ PyObject *str;
+ Py_ssize_t n1;
+ wchar_t *s = NULL, *buf = NULL;
+ size_t n2;
PyObject *result = NULL;
-#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T
- Py_ssize_t i;
-#endif
- if (!PyArg_ParseTuple(args, "u#:strxfrm", &s0, &n0))
+ if (!PyArg_ParseTuple(args, "U:strxfrm", &str))
return NULL;
-#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
- s = (wchar_t *) s0;
-#else
- s = PyMem_Malloc((n0+1)*sizeof(wchar_t));
- if (!s)
- return PyErr_NoMemory();
- for (i=0; i<=n0; i++)
- s[i] = s0[i];
-#endif
+ s = PyUnicode_AsWideCharString(str, &n1);
+ if (s == NULL)
+ goto exit;
/* assume no change in size, first */
- n1 = wcslen(s) + 1;
- buf = PyMem_Malloc(n1*sizeof(wchar_t));
+ n1 = n1 + 1;
+ buf = PyMem_Malloc(n1 * sizeof(wchar_t));
if (!buf) {
PyErr_NoMemory();
goto exit;
}
n2 = wcsxfrm(buf, s, n1);
- if (n2 >= n1) {
+ if (n2 >= (size_t)n1) {
/* more space needed */
- buf = PyMem_Realloc(buf, (n2+1)*sizeof(wchar_t));
- if (!buf) {
+ wchar_t * new_buf = PyMem_Realloc(buf, (n2+1)*sizeof(wchar_t));
+ if (!new_buf) {
PyErr_NoMemory();
goto exit;
}
+ buf = new_buf;
n2 = wcsxfrm(buf, s, n2+1);
}
result = PyUnicode_FromWideChar(buf, n2);
- exit:
- if (buf) PyMem_Free(buf);
-#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T
- PyMem_Free(s);
-#endif
+exit:
+ if (buf)
+ PyMem_Free(buf);
+ if (s)
+ PyMem_Free(s);
return result;
}
#endif
@@ -485,7 +440,7 @@ PyLocale_nl_langinfo(PyObject* self, PyObject* args)
instead of an empty string for nl_langinfo(ERA). */
const char *result = nl_langinfo(item);
result = result != NULL ? result : "";
- return str2uni(result);
+ return PyUnicode_DecodeLocale(result, NULL);
}
PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");
return NULL;
@@ -504,7 +459,7 @@ PyIntl_gettext(PyObject* self, PyObject *args)
char *in;
if (!PyArg_ParseTuple(args, "s", &in))
return 0;
- return str2uni(gettext(in));
+ return PyUnicode_DecodeLocale(gettext(in), NULL);
}
PyDoc_STRVAR(dgettext__doc__,
@@ -517,7 +472,7 @@ PyIntl_dgettext(PyObject* self, PyObject *args)
char *domain, *in;
if (!PyArg_ParseTuple(args, "zs", &domain, &in))
return 0;
- return str2uni(dgettext(domain, in));
+ return PyUnicode_DecodeLocale(dgettext(domain, in), NULL);
}
PyDoc_STRVAR(dcgettext__doc__,
@@ -531,7 +486,7 @@ PyIntl_dcgettext(PyObject *self, PyObject *args)
int category;
if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category))
return 0;
- return str2uni(dcgettext(domain,msgid,category));
+ return PyUnicode_DecodeLocale(dcgettext(domain,msgid,category), NULL);
}
PyDoc_STRVAR(textdomain__doc__,
@@ -549,7 +504,7 @@ PyIntl_textdomain(PyObject* self, PyObject* args)
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
- return str2uni(domain);
+ return PyUnicode_DecodeLocale(domain, NULL);
}
PyDoc_STRVAR(bindtextdomain__doc__,
@@ -581,7 +536,7 @@ PyIntl_bindtextdomain(PyObject* self,PyObject*args)
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
- result = str2uni(current_dirname);
+ result = PyUnicode_DecodeLocale(current_dirname, NULL);
Py_XDECREF(dirname_bytes);
return result;
}
@@ -599,7 +554,7 @@ PyIntl_bind_textdomain_codeset(PyObject* self,PyObject*args)
return NULL;
codeset = bind_textdomain_codeset(domain, codeset);
if (codeset)
- return str2uni(codeset);
+ return PyUnicode_DecodeLocale(codeset, NULL);
Py_RETURN_NONE;
}
#endif
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index cc412bf..b0a226b 100644
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -176,36 +176,29 @@ normalizeUserObj(PyObject *obj)
if (fn->m_self == NULL) {
/* built-in function: look up the module name */
PyObject *mod = fn->m_module;
- const char *modname;
- if (mod && PyUnicode_Check(mod)) {
- /* XXX: The following will truncate module names with embedded
- * null-characters. It is unlikely that this can happen in
- * practice and the concequences are not serious enough to
- * introduce extra checks here.
- */
- modname = _PyUnicode_AsString(mod);
- if (modname == NULL) {
- modname = "<encoding error>";
- PyErr_Clear();
+ PyObject *modname = NULL;
+ if (mod != NULL) {
+ if (PyUnicode_Check(mod)) {
+ modname = mod;
+ Py_INCREF(modname);
}
- }
- else if (mod && PyModule_Check(mod)) {
- modname = PyModule_GetName(mod);
- if (modname == NULL) {
- PyErr_Clear();
- modname = "builtins";
+ else if (PyModule_Check(mod)) {
+ modname = PyModule_GetNameObject(mod);
+ if (modname == NULL)
+ PyErr_Clear();
}
}
- else {
- modname = "builtins";
+ if (modname != NULL) {
+ if (PyUnicode_CompareWithASCIIString(modname, "builtins") != 0) {
+ PyObject *result;
+ result = PyUnicode_FromFormat("<%U.%s>", modname,
+ fn->m_ml->ml_name);
+ Py_DECREF(modname);
+ return result;
+ }
+ Py_DECREF(modname);
}
- if (strcmp(modname, "builtins") != 0)
- return PyUnicode_FromFormat("<%s.%s>",
- modname,
- fn->m_ml->ml_name);
- else
- return PyUnicode_FromFormat("<%s>",
- fn->m_ml->ml_name);
+ return PyUnicode_FromFormat("<%s>", fn->m_ml->ml_name);
}
else {
/* built-in method: try to return
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
new file mode 100644
index 0000000..b482a77
--- /dev/null
+++ b/Modules/_lzmamodule.c
@@ -0,0 +1,1286 @@
+/* _lzma - Low-level Python interface to liblzma.
+
+ Initial implementation by Per Øyvind Karlsen.
+ Rewritten by Nadeem Vawda.
+
+*/
+
+#define PY_SSIZE_T_CLEAN
+
+#include "Python.h"
+#include "structmember.h"
+#ifdef WITH_THREAD
+#include "pythread.h"
+#endif
+
+#include <stdarg.h>
+#include <string.h>
+
+#include <lzma.h>
+
+
+#ifndef PY_LONG_LONG
+#error "This module requires PY_LONG_LONG to be defined"
+#endif
+
+
+#ifdef WITH_THREAD
+#define ACQUIRE_LOCK(obj) do { \
+ if (!PyThread_acquire_lock((obj)->lock, 0)) { \
+ Py_BEGIN_ALLOW_THREADS \
+ PyThread_acquire_lock((obj)->lock, 1); \
+ Py_END_ALLOW_THREADS \
+ } } while (0)
+#define RELEASE_LOCK(obj) PyThread_release_lock((obj)->lock)
+#else
+#define ACQUIRE_LOCK(obj)
+#define RELEASE_LOCK(obj)
+#endif
+
+
+/* Container formats: */
+enum {
+ FORMAT_AUTO,
+ FORMAT_XZ,
+ FORMAT_ALONE,
+ FORMAT_RAW,
+};
+
+#define LZMA_CHECK_UNKNOWN (LZMA_CHECK_ID_MAX + 1)
+
+
+typedef struct {
+ PyObject_HEAD
+ lzma_stream lzs;
+ int flushed;
+#ifdef WITH_THREAD
+ PyThread_type_lock lock;
+#endif
+} Compressor;
+
+typedef struct {
+ PyObject_HEAD
+ lzma_stream lzs;
+ int check;
+ char eof;
+ PyObject *unused_data;
+#ifdef WITH_THREAD
+ PyThread_type_lock lock;
+#endif
+} Decompressor;
+
+/* LZMAError class object. */
+static PyObject *Error;
+
+/* An empty tuple, used by the filter specifier parsing code. */
+static PyObject *empty_tuple;
+
+
+/* Helper functions. */
+
+static int
+catch_lzma_error(lzma_ret lzret)
+{
+ switch (lzret) {
+ case LZMA_OK:
+ case LZMA_GET_CHECK:
+ case LZMA_NO_CHECK:
+ case LZMA_STREAM_END:
+ return 0;
+ case LZMA_UNSUPPORTED_CHECK:
+ PyErr_SetString(Error, "Unsupported integrity check");
+ return 1;
+ case LZMA_MEM_ERROR:
+ PyErr_NoMemory();
+ return 1;
+ case LZMA_MEMLIMIT_ERROR:
+ PyErr_SetString(Error, "Memory usage limit exceeded");
+ return 1;
+ case LZMA_FORMAT_ERROR:
+ PyErr_SetString(Error, "Input format not supported by decoder");
+ return 1;
+ case LZMA_OPTIONS_ERROR:
+ PyErr_SetString(Error, "Invalid or unsupported options");
+ return 1;
+ case LZMA_DATA_ERROR:
+ PyErr_SetString(Error, "Corrupt input data");
+ return 1;
+ case LZMA_BUF_ERROR:
+ PyErr_SetString(Error, "Insufficient buffer space");
+ return 1;
+ case LZMA_PROG_ERROR:
+ PyErr_SetString(Error, "Internal error");
+ return 1;
+ default:
+ PyErr_Format(Error, "Unrecognized error from liblzma: %d", lzret);
+ return 1;
+ }
+}
+
+#if BUFSIZ < 8192
+#define INITIAL_BUFFER_SIZE 8192
+#else
+#define INITIAL_BUFFER_SIZE BUFSIZ
+#endif
+
+static int
+grow_buffer(PyObject **buf)
+{
+ size_t size = PyBytes_GET_SIZE(*buf);
+ return _PyBytes_Resize(buf, size + (size >> 3) + 6);
+}
+
+
+/* Some custom type conversions for PyArg_ParseTupleAndKeywords(),
+ since the predefined conversion specifiers do not suit our needs:
+
+ uint32_t - the "I" (unsigned int) specifier is the right size, but
+ silently ignores overflows on conversion.
+
+ lzma_vli - the "K" (unsigned PY_LONG_LONG) specifier is the right
+ size, but like "I" it silently ignores overflows on conversion.
+
+ lzma_mode and lzma_match_finder - these are enumeration types, and
+ so the size of each is implementation-defined. Worse, different
+ enum types can be of different sizes within the same program, so
+ to be strictly correct, we need to define two separate converters.
+ */
+
+#define INT_TYPE_CONVERTER_FUNC(TYPE, FUNCNAME) \
+ static int \
+ FUNCNAME(PyObject *obj, void *ptr) \
+ { \
+ unsigned PY_LONG_LONG val; \
+ \
+ val = PyLong_AsUnsignedLongLong(obj); \
+ if (PyErr_Occurred()) \
+ return 0; \
+ if ((unsigned PY_LONG_LONG)(TYPE)val != val) { \
+ PyErr_SetString(PyExc_OverflowError, \
+ "Value too large for " #TYPE " type"); \
+ return 0; \
+ } \
+ *(TYPE *)ptr = (TYPE)val; \
+ return 1; \
+ }
+
+INT_TYPE_CONVERTER_FUNC(uint32_t, uint32_converter)
+INT_TYPE_CONVERTER_FUNC(lzma_vli, lzma_vli_converter)
+INT_TYPE_CONVERTER_FUNC(lzma_mode, lzma_mode_converter)
+INT_TYPE_CONVERTER_FUNC(lzma_match_finder, lzma_mf_converter)
+
+#undef INT_TYPE_CONVERTER_FUNC
+
+
+/* Filter specifier parsing.
+
+ This code handles converting filter specifiers (Python dicts) into
+ the C lzma_filter structs expected by liblzma. */
+
+static void *
+parse_filter_spec_lzma(PyObject *spec)
+{
+ static char *optnames[] = {"id", "preset", "dict_size", "lc", "lp",
+ "pb", "mode", "nice_len", "mf", "depth", NULL};
+ PyObject *id;
+ PyObject *preset_obj;
+ uint32_t preset = LZMA_PRESET_DEFAULT;
+ lzma_options_lzma *options;
+
+ /* First, fill in default values for all the options using a preset.
+ Then, override the defaults with any values given by the caller. */
+
+ preset_obj = PyMapping_GetItemString(spec, "preset");
+ if (preset_obj == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ PyErr_Clear();
+ else
+ return NULL;
+ } else {
+ int ok = uint32_converter(preset_obj, &preset);
+ Py_DECREF(preset_obj);
+ if (!ok)
+ return NULL;
+ }
+
+ options = (lzma_options_lzma *)PyMem_Malloc(sizeof *options);
+ if (options == NULL)
+ return PyErr_NoMemory();
+ memset(options, 0, sizeof *options);
+
+ if (lzma_lzma_preset(options, preset)) {
+ PyMem_Free(options);
+ PyErr_Format(Error, "Invalid compression preset: %d", preset);
+ return NULL;
+ }
+
+ if (!PyArg_ParseTupleAndKeywords(empty_tuple, spec,
+ "|OOO&O&O&O&O&O&O&O&", optnames,
+ &id, &preset_obj,
+ uint32_converter, &options->dict_size,
+ uint32_converter, &options->lc,
+ uint32_converter, &options->lp,
+ uint32_converter, &options->pb,
+ lzma_mode_converter, &options->mode,
+ uint32_converter, &options->nice_len,
+ lzma_mf_converter, &options->mf,
+ uint32_converter, &options->depth)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Invalid filter specifier for LZMA filter");
+ PyMem_Free(options);
+ options = NULL;
+ }
+ return options;
+}
+
+static void *
+parse_filter_spec_delta(PyObject *spec)
+{
+ static char *optnames[] = {"id", "dist", NULL};
+ PyObject *id;
+ uint32_t dist = 1;
+ lzma_options_delta *options;
+
+ if (!PyArg_ParseTupleAndKeywords(empty_tuple, spec, "|OO&", optnames,
+ &id, uint32_converter, &dist)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Invalid filter specifier for delta filter");
+ return NULL;
+ }
+
+ options = (lzma_options_delta *)PyMem_Malloc(sizeof *options);
+ if (options == NULL)
+ return PyErr_NoMemory();
+ memset(options, 0, sizeof *options);
+ options->type = LZMA_DELTA_TYPE_BYTE;
+ options->dist = dist;
+ return options;
+}
+
+static void *
+parse_filter_spec_bcj(PyObject *spec)
+{
+ static char *optnames[] = {"id", "start_offset", NULL};
+ PyObject *id;
+ uint32_t start_offset = 0;
+ lzma_options_bcj *options;
+
+ if (!PyArg_ParseTupleAndKeywords(empty_tuple, spec, "|OO&", optnames,
+ &id, uint32_converter, &start_offset)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Invalid filter specifier for BCJ filter");
+ return NULL;
+ }
+
+ options = (lzma_options_bcj *)PyMem_Malloc(sizeof *options);
+ if (options == NULL)
+ return PyErr_NoMemory();
+ memset(options, 0, sizeof *options);
+ options->start_offset = start_offset;
+ return options;
+}
+
+static void *
+parse_filter_spec(lzma_filter *f, PyObject *spec)
+{
+ PyObject *id_obj;
+
+ if (!PyMapping_Check(spec)) {
+ PyErr_SetString(PyExc_TypeError,
+ "Filter specifier must be a dict or dict-like object");
+ return NULL;
+ }
+ id_obj = PyMapping_GetItemString(spec, "id");
+ if (id_obj == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ PyErr_SetString(PyExc_ValueError,
+ "Filter specifier must have an \"id\" entry");
+ return NULL;
+ }
+ f->id = PyLong_AsUnsignedLongLong(id_obj);
+ Py_DECREF(id_obj);
+ if (PyErr_Occurred())
+ return NULL;
+
+ switch (f->id) {
+ case LZMA_FILTER_LZMA1:
+ case LZMA_FILTER_LZMA2:
+ f->options = parse_filter_spec_lzma(spec);
+ return f->options;
+ case LZMA_FILTER_DELTA:
+ f->options = parse_filter_spec_delta(spec);
+ return f->options;
+ case LZMA_FILTER_X86:
+ case LZMA_FILTER_POWERPC:
+ case LZMA_FILTER_IA64:
+ case LZMA_FILTER_ARM:
+ case LZMA_FILTER_ARMTHUMB:
+ case LZMA_FILTER_SPARC:
+ f->options = parse_filter_spec_bcj(spec);
+ return f->options;
+ default:
+ PyErr_Format(PyExc_ValueError, "Invalid filter ID: %llu", f->id);
+ return NULL;
+ }
+}
+
+static void
+free_filter_chain(lzma_filter filters[])
+{
+ int i;
+
+ for (i = 0; filters[i].id != LZMA_VLI_UNKNOWN; i++)
+ PyMem_Free(filters[i].options);
+}
+
+static int
+parse_filter_chain_spec(lzma_filter filters[], PyObject *filterspecs)
+{
+ Py_ssize_t i, num_filters;
+
+ num_filters = PySequence_Length(filterspecs);
+ if (num_filters == -1)
+ return -1;
+ if (num_filters > LZMA_FILTERS_MAX) {
+ PyErr_Format(PyExc_ValueError,
+ "Too many filters - liblzma supports a maximum of %d",
+ LZMA_FILTERS_MAX);
+ return -1;
+ }
+
+ for (i = 0; i < num_filters; i++) {
+ int ok = 1;
+ PyObject *spec = PySequence_GetItem(filterspecs, i);
+ if (spec == NULL || parse_filter_spec(&filters[i], spec) == NULL)
+ ok = 0;
+ Py_XDECREF(spec);
+ if (!ok) {
+ filters[i].id = LZMA_VLI_UNKNOWN;
+ free_filter_chain(filters);
+ return -1;
+ }
+ }
+ filters[num_filters].id = LZMA_VLI_UNKNOWN;
+ return 0;
+}
+
+
+/* Filter specifier construction.
+
+ This code handles converting C lzma_filter structs into
+ Python-level filter specifiers (represented as dicts). */
+
+static int
+spec_add_field(PyObject *spec, _Py_Identifier *key, unsigned PY_LONG_LONG value)
+{
+ int status;
+ PyObject *value_object;
+
+ value_object = PyLong_FromUnsignedLongLong(value);
+ if (value_object == NULL)
+ return -1;
+
+ status = _PyDict_SetItemId(spec, key, value_object);
+ Py_DECREF(value_object);
+ return status;
+}
+
+static PyObject *
+build_filter_spec(const lzma_filter *f)
+{
+ PyObject *spec;
+
+ spec = PyDict_New();
+ if (spec == NULL)
+ return NULL;
+
+#define ADD_FIELD(SOURCE, FIELD) \
+ do { \
+ _Py_IDENTIFIER(FIELD); \
+ if (spec_add_field(spec, &PyId_##FIELD, SOURCE->FIELD) == -1) \
+ goto error;\
+ } while (0)
+
+ ADD_FIELD(f, id);
+
+ switch (f->id) {
+ /* For LZMA1 filters, lzma_properties_{encode,decode}() only look at the
+ lc, lp, pb, and dict_size fields. For LZMA2 filters, only the
+ dict_size field is used. */
+ case LZMA_FILTER_LZMA1: {
+ lzma_options_lzma *options = f->options;
+ ADD_FIELD(options, lc);
+ ADD_FIELD(options, lp);
+ ADD_FIELD(options, pb);
+ ADD_FIELD(options, dict_size);
+ break;
+ }
+ case LZMA_FILTER_LZMA2: {
+ lzma_options_lzma *options = f->options;
+ ADD_FIELD(options, dict_size);
+ break;
+ }
+ case LZMA_FILTER_DELTA: {
+ lzma_options_delta *options = f->options;
+ ADD_FIELD(options, dist);
+ break;
+ }
+ case LZMA_FILTER_X86:
+ case LZMA_FILTER_POWERPC:
+ case LZMA_FILTER_IA64:
+ case LZMA_FILTER_ARM:
+ case LZMA_FILTER_ARMTHUMB:
+ case LZMA_FILTER_SPARC: {
+ lzma_options_bcj *options = f->options;
+ ADD_FIELD(options, start_offset);
+ break;
+ }
+ default:
+ PyErr_Format(PyExc_ValueError, "Invalid filter ID: %llu", f->id);
+ goto error;
+ }
+
+#undef ADD_FIELD
+
+ return spec;
+
+error:
+ Py_DECREF(spec);
+ return NULL;
+}
+
+
+/* LZMACompressor class. */
+
+static PyObject *
+compress(Compressor *c, uint8_t *data, size_t len, lzma_action action)
+{
+ size_t data_size = 0;
+ PyObject *result;
+
+ result = PyBytes_FromStringAndSize(NULL, INITIAL_BUFFER_SIZE);
+ if (result == NULL)
+ return NULL;
+ c->lzs.next_in = data;
+ c->lzs.avail_in = len;
+ c->lzs.next_out = (uint8_t *)PyBytes_AS_STRING(result);
+ c->lzs.avail_out = PyBytes_GET_SIZE(result);
+ for (;;) {
+ lzma_ret lzret;
+
+ Py_BEGIN_ALLOW_THREADS
+ lzret = lzma_code(&c->lzs, action);
+ data_size = (char *)c->lzs.next_out - PyBytes_AS_STRING(result);
+ Py_END_ALLOW_THREADS
+ if (catch_lzma_error(lzret))
+ goto error;
+ if ((action == LZMA_RUN && c->lzs.avail_in == 0) ||
+ (action == LZMA_FINISH && lzret == LZMA_STREAM_END)) {
+ break;
+ } else if (c->lzs.avail_out == 0) {
+ if (grow_buffer(&result) == -1)
+ goto error;
+ c->lzs.next_out = (uint8_t *)PyBytes_AS_STRING(result) + data_size;
+ c->lzs.avail_out = PyBytes_GET_SIZE(result) - data_size;
+ }
+ }
+ if (data_size != PyBytes_GET_SIZE(result))
+ if (_PyBytes_Resize(&result, data_size) == -1)
+ goto error;
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyDoc_STRVAR(Compressor_compress_doc,
+"compress(data) -> bytes\n"
+"\n"
+"Provide data to the compressor object. Returns a chunk of\n"
+"compressed data if possible, or b\"\" otherwise.\n"
+"\n"
+"When you have finished providing data to the compressor, call the\n"
+"flush() method to finish the conversion process.\n");
+
+static PyObject *
+Compressor_compress(Compressor *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "y*:compress", &buffer))
+ return NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->flushed)
+ PyErr_SetString(PyExc_ValueError, "Compressor has been flushed");
+ else
+ result = compress(self, buffer.buf, buffer.len, LZMA_RUN);
+ RELEASE_LOCK(self);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+PyDoc_STRVAR(Compressor_flush_doc,
+"flush() -> bytes\n"
+"\n"
+"Finish the compression process. Returns the compressed data left\n"
+"in internal buffers.\n"
+"\n"
+"The compressor object cannot be used after this method is called.\n");
+
+static PyObject *
+Compressor_flush(Compressor *self, PyObject *noargs)
+{
+ PyObject *result = NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->flushed) {
+ PyErr_SetString(PyExc_ValueError, "Repeated call to flush()");
+ } else {
+ self->flushed = 1;
+ result = compress(self, NULL, 0, LZMA_FINISH);
+ }
+ RELEASE_LOCK(self);
+ return result;
+}
+
+static int
+Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset,
+ PyObject *filterspecs)
+{
+ lzma_ret lzret;
+
+ if (filterspecs == Py_None) {
+ lzret = lzma_easy_encoder(lzs, preset, check);
+ } else {
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+
+ if (parse_filter_chain_spec(filters, filterspecs) == -1)
+ return -1;
+ lzret = lzma_stream_encoder(lzs, filters, check);
+ free_filter_chain(filters);
+ }
+ if (catch_lzma_error(lzret))
+ return -1;
+ else
+ return 0;
+}
+
+static int
+Compressor_init_alone(lzma_stream *lzs, uint32_t preset, PyObject *filterspecs)
+{
+ lzma_ret lzret;
+
+ if (filterspecs == Py_None) {
+ lzma_options_lzma options;
+
+ if (lzma_lzma_preset(&options, preset)) {
+ PyErr_Format(Error, "Invalid compression preset: %d", preset);
+ return -1;
+ }
+ lzret = lzma_alone_encoder(lzs, &options);
+ } else {
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+
+ if (parse_filter_chain_spec(filters, filterspecs) == -1)
+ return -1;
+ if (filters[0].id == LZMA_FILTER_LZMA1 &&
+ filters[1].id == LZMA_VLI_UNKNOWN) {
+ lzret = lzma_alone_encoder(lzs, filters[0].options);
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "Invalid filter chain for FORMAT_ALONE - "
+ "must be a single LZMA1 filter");
+ lzret = LZMA_PROG_ERROR;
+ }
+ free_filter_chain(filters);
+ }
+ if (PyErr_Occurred() || catch_lzma_error(lzret))
+ return -1;
+ else
+ return 0;
+}
+
+static int
+Compressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
+{
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+ lzma_ret lzret;
+
+ if (filterspecs == Py_None) {
+ PyErr_SetString(PyExc_ValueError,
+ "Must specify filters for FORMAT_RAW");
+ return -1;
+ }
+ if (parse_filter_chain_spec(filters, filterspecs) == -1)
+ return -1;
+ lzret = lzma_raw_encoder(lzs, filters);
+ free_filter_chain(filters);
+ if (catch_lzma_error(lzret))
+ return -1;
+ else
+ return 0;
+}
+
+static int
+Compressor_init(Compressor *self, PyObject *args, PyObject *kwargs)
+{
+ static char *arg_names[] = {"format", "check", "preset", "filters", NULL};
+ int format = FORMAT_XZ;
+ int check = -1;
+ uint32_t preset = LZMA_PRESET_DEFAULT;
+ PyObject *preset_obj = Py_None;
+ PyObject *filterspecs = Py_None;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "|iiOO:LZMACompressor", arg_names,
+ &format, &check, &preset_obj,
+ &filterspecs))
+ return -1;
+
+ if (format != FORMAT_XZ && check != -1 && check != LZMA_CHECK_NONE) {
+ PyErr_SetString(PyExc_ValueError,
+ "Integrity checks are only supported by FORMAT_XZ");
+ return -1;
+ }
+
+ if (preset_obj != Py_None && filterspecs != Py_None) {
+ PyErr_SetString(PyExc_ValueError,
+ "Cannot specify both preset and filter chain");
+ return -1;
+ }
+
+ if (preset_obj != Py_None)
+ if (!uint32_converter(preset_obj, &preset))
+ return -1;
+
+#ifdef WITH_THREAD
+ self->lock = PyThread_allocate_lock();
+ if (self->lock == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
+ return -1;
+ }
+#endif
+
+ self->flushed = 0;
+ switch (format) {
+ case FORMAT_XZ:
+ if (check == -1)
+ check = LZMA_CHECK_CRC64;
+ if (Compressor_init_xz(&self->lzs, check, preset, filterspecs) != 0)
+ break;
+ return 0;
+
+ case FORMAT_ALONE:
+ if (Compressor_init_alone(&self->lzs, preset, filterspecs) != 0)
+ break;
+ return 0;
+
+ case FORMAT_RAW:
+ if (Compressor_init_raw(&self->lzs, filterspecs) != 0)
+ break;
+ return 0;
+
+ default:
+ PyErr_Format(PyExc_ValueError,
+ "Invalid container format: %d", format);
+ break;
+ }
+
+#ifdef WITH_THREAD
+ PyThread_free_lock(self->lock);
+ self->lock = NULL;
+#endif
+ return -1;
+}
+
+static void
+Compressor_dealloc(Compressor *self)
+{
+ lzma_end(&self->lzs);
+#ifdef WITH_THREAD
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+#endif
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyMethodDef Compressor_methods[] = {
+ {"compress", (PyCFunction)Compressor_compress, METH_VARARGS,
+ Compressor_compress_doc},
+ {"flush", (PyCFunction)Compressor_flush, METH_NOARGS,
+ Compressor_flush_doc},
+ {NULL}
+};
+
+PyDoc_STRVAR(Compressor_doc,
+"LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)\n"
+"\n"
+"Create a compressor object for compressing data incrementally.\n"
+"\n"
+"format specifies the container format to use for the output. This can\n"
+"be FORMAT_XZ (default), FORMAT_ALONE, or FORMAT_RAW.\n"
+"\n"
+"check specifies the integrity check to use. For FORMAT_XZ, the default\n"
+"is CHECK_CRC64. FORMAT_ALONE and FORMAT_RAW do not suport integrity\n"
+"checks; for these formats, check must be omitted, or be CHECK_NONE.\n"
+"\n"
+"The settings used by the compressor can be specified either as a\n"
+"preset compression level (with the 'preset' argument), or in detail\n"
+"as a custom filter chain (with the 'filters' argument). For FORMAT_XZ\n"
+"and FORMAT_ALONE, the default is to use the PRESET_DEFAULT preset\n"
+"level. For FORMAT_RAW, the caller must always specify a filter chain;\n"
+"the raw compressor does not support preset compression levels.\n"
+"\n"
+"preset (if provided) should be an integer in the range 0-9, optionally\n"
+"OR-ed with the constant PRESET_EXTREME.\n"
+"\n"
+"filters (if provided) should be a sequence of dicts. Each dict should\n"
+"have an entry for \"id\" indicating the ID of the filter, plus\n"
+"additional entries for options to the filter.\n"
+"\n"
+"For one-shot compression, use the compress() function instead.\n");
+
+static PyTypeObject Compressor_type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_lzma.LZMACompressor", /* tp_name */
+ sizeof(Compressor), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Compressor_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Compressor_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ Compressor_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Compressor_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+/* LZMADecompressor class. */
+
+static PyObject *
+decompress(Decompressor *d, uint8_t *data, size_t len)
+{
+ size_t data_size = 0;
+ PyObject *result;
+
+ result = PyBytes_FromStringAndSize(NULL, INITIAL_BUFFER_SIZE);
+ if (result == NULL)
+ return NULL;
+ d->lzs.next_in = data;
+ d->lzs.avail_in = len;
+ d->lzs.next_out = (uint8_t *)PyBytes_AS_STRING(result);
+ d->lzs.avail_out = PyBytes_GET_SIZE(result);
+ for (;;) {
+ lzma_ret lzret;
+
+ Py_BEGIN_ALLOW_THREADS
+ lzret = lzma_code(&d->lzs, LZMA_RUN);
+ data_size = (char *)d->lzs.next_out - PyBytes_AS_STRING(result);
+ Py_END_ALLOW_THREADS
+ if (catch_lzma_error(lzret))
+ goto error;
+ if (lzret == LZMA_GET_CHECK || lzret == LZMA_NO_CHECK)
+ d->check = lzma_get_check(&d->lzs);
+ if (lzret == LZMA_STREAM_END) {
+ d->eof = 1;
+ if (d->lzs.avail_in > 0) {
+ Py_CLEAR(d->unused_data);
+ d->unused_data = PyBytes_FromStringAndSize(
+ (char *)d->lzs.next_in, d->lzs.avail_in);
+ if (d->unused_data == NULL)
+ goto error;
+ }
+ break;
+ } else if (d->lzs.avail_in == 0) {
+ break;
+ } else if (d->lzs.avail_out == 0) {
+ if (grow_buffer(&result) == -1)
+ goto error;
+ d->lzs.next_out = (uint8_t *)PyBytes_AS_STRING(result) + data_size;
+ d->lzs.avail_out = PyBytes_GET_SIZE(result) - data_size;
+ }
+ }
+ if (data_size != PyBytes_GET_SIZE(result))
+ if (_PyBytes_Resize(&result, data_size) == -1)
+ goto error;
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyDoc_STRVAR(Decompressor_decompress_doc,
+"decompress(data) -> bytes\n"
+"\n"
+"Provide data to the decompressor object. Returns a chunk of\n"
+"decompressed data if possible, or b\"\" otherwise.\n"
+"\n"
+"Attempting to decompress data after the end of the stream is\n"
+"reached raises an EOFError. Any data found after the end of the\n"
+"stream is ignored, and saved in the unused_data attribute.\n");
+
+static PyObject *
+Decompressor_decompress(Decompressor *self, PyObject *args)
+{
+ Py_buffer buffer;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "y*:decompress", &buffer))
+ return NULL;
+
+ ACQUIRE_LOCK(self);
+ if (self->eof)
+ PyErr_SetString(PyExc_EOFError, "Already at end of stream");
+ else
+ result = decompress(self, buffer.buf, buffer.len);
+ RELEASE_LOCK(self);
+ PyBuffer_Release(&buffer);
+ return result;
+}
+
+static int
+Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
+{
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+ lzma_ret lzret;
+
+ if (parse_filter_chain_spec(filters, filterspecs) == -1)
+ return -1;
+ lzret = lzma_raw_decoder(lzs, filters);
+ free_filter_chain(filters);
+ if (catch_lzma_error(lzret))
+ return -1;
+ else
+ return 0;
+}
+
+static int
+Decompressor_init(Decompressor *self, PyObject *args, PyObject *kwargs)
+{
+ static char *arg_names[] = {"format", "memlimit", "filters", NULL};
+ const uint32_t decoder_flags = LZMA_TELL_ANY_CHECK | LZMA_TELL_NO_CHECK;
+ int format = FORMAT_AUTO;
+ uint64_t memlimit = UINT64_MAX;
+ PyObject *memlimit_obj = Py_None;
+ PyObject *filterspecs = Py_None;
+ lzma_ret lzret;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "|iOO:LZMADecompressor", arg_names,
+ &format, &memlimit_obj, &filterspecs))
+ return -1;
+
+ if (memlimit_obj != Py_None) {
+ if (format == FORMAT_RAW) {
+ PyErr_SetString(PyExc_ValueError,
+ "Cannot specify memory limit with FORMAT_RAW");
+ return -1;
+ }
+ memlimit = PyLong_AsUnsignedLongLong(memlimit_obj);
+ if (PyErr_Occurred())
+ return -1;
+ }
+
+ if (format == FORMAT_RAW && filterspecs == Py_None) {
+ PyErr_SetString(PyExc_ValueError,
+ "Must specify filters for FORMAT_RAW");
+ return -1;
+ } else if (format != FORMAT_RAW && filterspecs != Py_None) {
+ PyErr_SetString(PyExc_ValueError,
+ "Cannot specify filters except with FORMAT_RAW");
+ return -1;
+ }
+
+#ifdef WITH_THREAD
+ self->lock = PyThread_allocate_lock();
+ if (self->lock == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
+ return -1;
+ }
+#endif
+
+ self->check = LZMA_CHECK_UNKNOWN;
+ self->unused_data = PyBytes_FromStringAndSize(NULL, 0);
+ if (self->unused_data == NULL)
+ goto error;
+
+ switch (format) {
+ case FORMAT_AUTO:
+ lzret = lzma_auto_decoder(&self->lzs, memlimit, decoder_flags);
+ if (catch_lzma_error(lzret))
+ break;
+ return 0;
+
+ case FORMAT_XZ:
+ lzret = lzma_stream_decoder(&self->lzs, memlimit, decoder_flags);
+ if (catch_lzma_error(lzret))
+ break;
+ return 0;
+
+ case FORMAT_ALONE:
+ self->check = LZMA_CHECK_NONE;
+ lzret = lzma_alone_decoder(&self->lzs, memlimit);
+ if (catch_lzma_error(lzret))
+ break;
+ return 0;
+
+ case FORMAT_RAW:
+ self->check = LZMA_CHECK_NONE;
+ if (Decompressor_init_raw(&self->lzs, filterspecs) == -1)
+ break;
+ return 0;
+
+ default:
+ PyErr_Format(PyExc_ValueError,
+ "Invalid container format: %d", format);
+ break;
+ }
+
+error:
+ Py_CLEAR(self->unused_data);
+#ifdef WITH_THREAD
+ PyThread_free_lock(self->lock);
+ self->lock = NULL;
+#endif
+ return -1;
+}
+
+static void
+Decompressor_dealloc(Decompressor *self)
+{
+ lzma_end(&self->lzs);
+ Py_CLEAR(self->unused_data);
+#ifdef WITH_THREAD
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+#endif
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyMethodDef Decompressor_methods[] = {
+ {"decompress", (PyCFunction)Decompressor_decompress, METH_VARARGS,
+ Decompressor_decompress_doc},
+ {NULL}
+};
+
+PyDoc_STRVAR(Decompressor_check_doc,
+"ID of the integrity check used by the input stream.");
+
+PyDoc_STRVAR(Decompressor_eof_doc,
+"True if the end-of-stream marker has been reached.");
+
+PyDoc_STRVAR(Decompressor_unused_data_doc,
+"Data found after the end of the compressed stream.");
+
+static PyMemberDef Decompressor_members[] = {
+ {"check", T_INT, offsetof(Decompressor, check), READONLY,
+ Decompressor_check_doc},
+ {"eof", T_BOOL, offsetof(Decompressor, eof), READONLY,
+ Decompressor_eof_doc},
+ {"unused_data", T_OBJECT_EX, offsetof(Decompressor, unused_data), READONLY,
+ Decompressor_unused_data_doc},
+ {NULL}
+};
+
+PyDoc_STRVAR(Decompressor_doc,
+"LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)\n"
+"\n"
+"Create a decompressor object for decompressing data incrementally.\n"
+"\n"
+"format specifies the container format of the input stream. If this is\n"
+"FORMAT_AUTO (the default), the decompressor will automatically detect\n"
+"whether the input is FORMAT_XZ or FORMAT_ALONE. Streams created with\n"
+"FORMAT_RAW cannot be autodetected.\n"
+"\n"
+"memlimit can be specified to limit the amount of memory used by the\n"
+"decompressor. This will cause decompression to fail if the input\n"
+"cannot be decompressed within the given limit.\n"
+"\n"
+"filters specifies a custom filter chain. This argument is required for\n"
+"FORMAT_RAW, and not accepted with any other format. When provided,\n"
+"this should be a sequence of dicts, each indicating the ID and options\n"
+"for a single filter.\n"
+"\n"
+"For one-shot decompression, use the decompress() function instead.\n");
+
+static PyTypeObject Decompressor_type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_lzma.LZMADecompressor", /* tp_name */
+ sizeof(Decompressor), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)Decompressor_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Decompressor_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ Decompressor_methods, /* tp_methods */
+ Decompressor_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)Decompressor_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+/* Module-level functions. */
+
+PyDoc_STRVAR(is_check_supported_doc,
+"is_check_supported(check_id) -> bool\n"
+"\n"
+"Test whether the given integrity check is supported.\n"
+"\n"
+"Always returns True for CHECK_NONE and CHECK_CRC32.\n");
+
+static PyObject *
+is_check_supported(PyObject *self, PyObject *args)
+{
+ int check_id;
+
+ if (!PyArg_ParseTuple(args, "i:is_check_supported", &check_id))
+ return NULL;
+
+ return PyBool_FromLong(lzma_check_is_supported(check_id));
+}
+
+
+PyDoc_STRVAR(_encode_filter_properties_doc,
+"_encode_filter_properties(filter) -> bytes\n"
+"\n"
+"Return a bytes object encoding the options (properties) of the filter\n"
+"specified by *filter* (a dict).\n"
+"\n"
+"The result does not include the filter ID itself, only the options.\n");
+
+static PyObject *
+_encode_filter_properties(PyObject *self, PyObject *args)
+{
+ PyObject *filterspec;
+ lzma_filter filter;
+ lzma_ret lzret;
+ uint32_t encoded_size;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "O:_encode_filter_properties", &filterspec))
+ return NULL;
+
+ if (parse_filter_spec(&filter, filterspec) == NULL)
+ return NULL;
+
+ lzret = lzma_properties_size(&encoded_size, &filter);
+ if (catch_lzma_error(lzret))
+ goto error;
+
+ result = PyBytes_FromStringAndSize(NULL, encoded_size);
+ if (result == NULL)
+ goto error;
+
+ lzret = lzma_properties_encode(
+ &filter, (uint8_t *)PyBytes_AS_STRING(result));
+ if (catch_lzma_error(lzret))
+ goto error;
+
+ PyMem_Free(filter.options);
+ return result;
+
+error:
+ Py_XDECREF(result);
+ PyMem_Free(filter.options);
+ return NULL;
+}
+
+
+PyDoc_STRVAR(_decode_filter_properties_doc,
+"_decode_filter_properties(filter_id, encoded_props) -> dict\n"
+"\n"
+"Return a dict describing a filter with ID *filter_id*, and options\n"
+"(properties) decoded from the bytes object *encoded_props*.\n");
+
+static PyObject *
+_decode_filter_properties(PyObject *self, PyObject *args)
+{
+ Py_buffer encoded_props;
+ lzma_filter filter;
+ lzma_ret lzret;
+ PyObject *result = NULL;
+
+ if (!PyArg_ParseTuple(args, "O&y*:_decode_filter_properties",
+ lzma_vli_converter, &filter.id, &encoded_props))
+ return NULL;
+
+ lzret = lzma_properties_decode(
+ &filter, NULL, encoded_props.buf, encoded_props.len);
+ PyBuffer_Release(&encoded_props);
+ if (catch_lzma_error(lzret))
+ return NULL;
+
+ result = build_filter_spec(&filter);
+
+ /* We use vanilla free() here instead of PyMem_Free() - filter.options was
+ allocated by lzma_properties_decode() using the default allocator. */
+ free(filter.options);
+ return result;
+}
+
+
+/* Module initialization. */
+
+static PyMethodDef module_methods[] = {
+ {"is_check_supported", (PyCFunction)is_check_supported,
+ METH_VARARGS, is_check_supported_doc},
+ {"_encode_filter_properties", (PyCFunction)_encode_filter_properties,
+ METH_VARARGS, _encode_filter_properties_doc},
+ {"_decode_filter_properties", (PyCFunction)_decode_filter_properties,
+ METH_VARARGS, _decode_filter_properties_doc},
+ {NULL}
+};
+
+static PyModuleDef _lzmamodule = {
+ PyModuleDef_HEAD_INIT,
+ "_lzma",
+ NULL,
+ -1,
+ module_methods,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+/* Some of our constants are more than 32 bits wide, so PyModule_AddIntConstant
+ would not work correctly on platforms with 32-bit longs. */
+static int
+module_add_int_constant(PyObject *m, const char *name, PY_LONG_LONG value)
+{
+ PyObject *o = PyLong_FromLongLong(value);
+ if (o == NULL)
+ return -1;
+ if (PyModule_AddObject(m, name, o) == 0)
+ return 0;
+ Py_DECREF(o);
+ return -1;
+}
+
+#define ADD_INT_PREFIX_MACRO(m, macro) \
+ module_add_int_constant(m, #macro, LZMA_ ## macro)
+
+PyMODINIT_FUNC
+PyInit__lzma(void)
+{
+ PyObject *m;
+
+ empty_tuple = PyTuple_New(0);
+ if (empty_tuple == NULL)
+ return NULL;
+
+ m = PyModule_Create(&_lzmamodule);
+ if (m == NULL)
+ return NULL;
+
+ if (PyModule_AddIntMacro(m, FORMAT_AUTO) == -1 ||
+ PyModule_AddIntMacro(m, FORMAT_XZ) == -1 ||
+ PyModule_AddIntMacro(m, FORMAT_ALONE) == -1 ||
+ PyModule_AddIntMacro(m, FORMAT_RAW) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_NONE) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_CRC32) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_CRC64) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_SHA256) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_ID_MAX) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, CHECK_UNKNOWN) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_LZMA1) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_LZMA2) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_DELTA) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_X86) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_IA64) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_ARM) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_ARMTHUMB) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_SPARC) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, FILTER_POWERPC) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MF_HC3) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MF_HC4) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MF_BT2) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MF_BT3) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MF_BT4) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MODE_FAST) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, MODE_NORMAL) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, PRESET_DEFAULT) == -1 ||
+ ADD_INT_PREFIX_MACRO(m, PRESET_EXTREME) == -1)
+ return NULL;
+
+ Error = PyErr_NewExceptionWithDoc(
+ "_lzma.LZMAError", "Call to liblzma failed.", NULL, NULL);
+ if (Error == NULL)
+ return NULL;
+ Py_INCREF(Error);
+ if (PyModule_AddObject(m, "LZMAError", Error) == -1)
+ return NULL;
+
+ if (PyType_Ready(&Compressor_type) == -1)
+ return NULL;
+ Py_INCREF(&Compressor_type);
+ if (PyModule_AddObject(m, "LZMACompressor",
+ (PyObject *)&Compressor_type) == -1)
+ return NULL;
+
+ if (PyType_Ready(&Decompressor_type) == -1)
+ return NULL;
+ Py_INCREF(&Decompressor_type);
+ if (PyModule_AddObject(m, "LZMADecompressor",
+ (PyObject *)&Decompressor_type) == -1)
+ return NULL;
+
+ return m;
+}
diff --git a/Modules/_multiprocessing/connection.h b/Modules/_multiprocessing/connection.h
deleted file mode 100644
index 002d5aa..0000000
--- a/Modules/_multiprocessing/connection.h
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Definition of a `Connection` type.
- * Used by `socket_connection.c` and `pipe_connection.c`.
- *
- * connection.h
- *
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
- */
-
-#ifndef CONNECTION_H
-#define CONNECTION_H
-
-/*
- * Read/write flags
- */
-
-#define READABLE 1
-#define WRITABLE 2
-
-#define CHECK_READABLE(self) \
- if (!(self->flags & READABLE)) { \
- PyErr_SetString(PyExc_IOError, "connection is write-only"); \
- return NULL; \
- }
-
-#define CHECK_WRITABLE(self) \
- if (!(self->flags & WRITABLE)) { \
- PyErr_SetString(PyExc_IOError, "connection is read-only"); \
- return NULL; \
- }
-
-/*
- * Allocation and deallocation
- */
-
-static PyObject *
-connection_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- ConnectionObject *self;
- HANDLE handle;
- BOOL readable = TRUE, writable = TRUE;
-
- static char *kwlist[] = {"handle", "readable", "writable", NULL};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, F_HANDLE "|ii", kwlist,
- &handle, &readable, &writable))
- return NULL;
-
- if (handle == INVALID_HANDLE_VALUE || (Py_ssize_t)handle < 0) {
- PyErr_Format(PyExc_IOError, "invalid handle %zd",
- (Py_ssize_t)handle);
- return NULL;
- }
-
- if (!readable && !writable) {
- PyErr_SetString(PyExc_ValueError,
- "either readable or writable must be true");
- return NULL;
- }
-
- self = PyObject_New(ConnectionObject, type);
- if (self == NULL)
- return NULL;
-
- self->weakreflist = NULL;
- self->handle = handle;
- self->flags = 0;
-
- if (readable)
- self->flags |= READABLE;
- if (writable)
- self->flags |= WRITABLE;
- assert(self->flags >= 1 && self->flags <= 3);
-
- return (PyObject*)self;
-}
-
-static void
-connection_dealloc(ConnectionObject* self)
-{
- if (self->weakreflist != NULL)
- PyObject_ClearWeakRefs((PyObject*)self);
-
- if (self->handle != INVALID_HANDLE_VALUE) {
- Py_BEGIN_ALLOW_THREADS
- CLOSE(self->handle);
- Py_END_ALLOW_THREADS
- }
- PyObject_Del(self);
-}
-
-/*
- * Functions for transferring buffers
- */
-
-static PyObject *
-connection_sendbytes(ConnectionObject *self, PyObject *args)
-{
- Py_buffer pbuffer;
- char *buffer;
- Py_ssize_t length, offset=0, size=PY_SSIZE_T_MIN;
- int res;
-
- if (!PyArg_ParseTuple(args, F_RBUFFER "*|" F_PY_SSIZE_T F_PY_SSIZE_T,
- &pbuffer, &offset, &size))
- return NULL;
- buffer = pbuffer.buf;
- length = pbuffer.len;
-
- CHECK_WRITABLE(self); /* XXX release buffer in case of failure */
-
- if (offset < 0) {
- PyBuffer_Release(&pbuffer);
- PyErr_SetString(PyExc_ValueError, "offset is negative");
- return NULL;
- }
- if (length < offset) {
- PyBuffer_Release(&pbuffer);
- PyErr_SetString(PyExc_ValueError, "buffer length < offset");
- return NULL;
- }
-
- if (size == PY_SSIZE_T_MIN) {
- size = length - offset;
- } else {
- if (size < 0) {
- PyBuffer_Release(&pbuffer);
- PyErr_SetString(PyExc_ValueError, "size is negative");
- return NULL;
- }
- if (offset + size > length) {
- PyBuffer_Release(&pbuffer);
- PyErr_SetString(PyExc_ValueError,
- "buffer length < offset + size");
- return NULL;
- }
- }
-
- res = conn_send_string(self, buffer + offset, size);
-
- PyBuffer_Release(&pbuffer);
- if (res < 0) {
- if (PyErr_Occurred())
- return NULL;
- else
- return mp_SetError(PyExc_IOError, res);
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-connection_recvbytes(ConnectionObject *self, PyObject *args)
-{
- char *freeme = NULL;
- Py_ssize_t res, maxlength = PY_SSIZE_T_MAX;
- PyObject *result = NULL;
-
- if (!PyArg_ParseTuple(args, "|" F_PY_SSIZE_T, &maxlength))
- return NULL;
-
- CHECK_READABLE(self);
-
- if (maxlength < 0) {
- PyErr_SetString(PyExc_ValueError, "maxlength < 0");
- return NULL;
- }
-
- res = conn_recv_string(self, self->buffer, CONNECTION_BUFFER_SIZE,
- &freeme, maxlength);
-
- if (res < 0) {
- if (res == MP_BAD_MESSAGE_LENGTH) {
- if ((self->flags & WRITABLE) == 0) {
- Py_BEGIN_ALLOW_THREADS
- CLOSE(self->handle);
- Py_END_ALLOW_THREADS
- self->handle = INVALID_HANDLE_VALUE;
- } else {
- self->flags = WRITABLE;
- }
- }
- mp_SetError(PyExc_IOError, res);
- } else {
- if (freeme == NULL) {
- result = PyBytes_FromStringAndSize(self->buffer, res);
- } else {
- result = PyBytes_FromStringAndSize(freeme, res);
- PyMem_Free(freeme);
- }
- }
-
- return result;
-}
-
-static PyObject *
-connection_recvbytes_into(ConnectionObject *self, PyObject *args)
-{
- char *freeme = NULL, *buffer = NULL;
- Py_ssize_t res, length, offset = 0;
- PyObject *result = NULL;
- Py_buffer pbuf;
-
- CHECK_READABLE(self);
-
- if (!PyArg_ParseTuple(args, "w*|" F_PY_SSIZE_T,
- &pbuf, &offset))
- return NULL;
-
- buffer = pbuf.buf;
- length = pbuf.len;
-
- if (offset < 0) {
- PyErr_SetString(PyExc_ValueError, "negative offset");
- goto _error;
- }
-
- if (offset > length) {
- PyErr_SetString(PyExc_ValueError, "offset too large");
- goto _error;
- }
-
- res = conn_recv_string(self, buffer+offset, length-offset,
- &freeme, PY_SSIZE_T_MAX);
-
- if (res < 0) {
- if (res == MP_BAD_MESSAGE_LENGTH) {
- if ((self->flags & WRITABLE) == 0) {
- Py_BEGIN_ALLOW_THREADS
- CLOSE(self->handle);
- Py_END_ALLOW_THREADS
- self->handle = INVALID_HANDLE_VALUE;
- } else {
- self->flags = WRITABLE;
- }
- }
- mp_SetError(PyExc_IOError, res);
- } else {
- if (freeme == NULL) {
- result = PyInt_FromSsize_t(res);
- } else {
- result = PyObject_CallFunction(BufferTooShort,
- F_RBUFFER "#",
- freeme, res);
- PyMem_Free(freeme);
- if (result) {
- PyErr_SetObject(BufferTooShort, result);
- Py_DECREF(result);
- }
- goto _error;
- }
- }
-
-_cleanup:
- PyBuffer_Release(&pbuf);
- return result;
-
-_error:
- result = NULL;
- goto _cleanup;
-}
-
-/*
- * Functions for transferring objects
- */
-
-static PyObject *
-connection_send_obj(ConnectionObject *self, PyObject *obj)
-{
- char *buffer;
- int res;
- Py_ssize_t length;
- PyObject *pickled_string = NULL;
-
- CHECK_WRITABLE(self);
-
- pickled_string = PyObject_CallFunctionObjArgs(pickle_dumps, obj,
- pickle_protocol, NULL);
- if (!pickled_string)
- goto failure;
-
- if (PyBytes_AsStringAndSize(pickled_string, &buffer, &length) < 0)
- goto failure;
-
- res = conn_send_string(self, buffer, (int)length);
-
- if (res < 0) {
- mp_SetError(PyExc_IOError, res);
- goto failure;
- }
-
- Py_XDECREF(pickled_string);
- Py_RETURN_NONE;
-
- failure:
- Py_XDECREF(pickled_string);
- return NULL;
-}
-
-static PyObject *
-connection_recv_obj(ConnectionObject *self)
-{
- char *freeme = NULL;
- Py_ssize_t res;
- PyObject *temp = NULL, *result = NULL;
-
- CHECK_READABLE(self);
-
- res = conn_recv_string(self, self->buffer, CONNECTION_BUFFER_SIZE,
- &freeme, PY_SSIZE_T_MAX);
-
- if (res < 0) {
- if (res == MP_BAD_MESSAGE_LENGTH) {
- if ((self->flags & WRITABLE) == 0) {
- Py_BEGIN_ALLOW_THREADS
- CLOSE(self->handle);
- Py_END_ALLOW_THREADS
- self->handle = INVALID_HANDLE_VALUE;
- } else {
- self->flags = WRITABLE;
- }
- }
- mp_SetError(PyExc_IOError, res);
- } else {
- if (freeme == NULL) {
- temp = PyBytes_FromStringAndSize(self->buffer, res);
- } else {
- temp = PyBytes_FromStringAndSize(freeme, res);
- PyMem_Free(freeme);
- }
- }
-
- if (temp)
- result = PyObject_CallFunctionObjArgs(pickle_loads,
- temp, NULL);
- Py_XDECREF(temp);
- return result;
-}
-
-/*
- * Other functions
- */
-
-static PyObject *
-connection_poll(ConnectionObject *self, PyObject *args)
-{
- PyObject *timeout_obj = NULL;
- double timeout = 0.0;
- int res;
-
- CHECK_READABLE(self);
-
- if (!PyArg_ParseTuple(args, "|O", &timeout_obj))
- return NULL;
-
- if (timeout_obj == NULL) {
- timeout = 0.0;
- } else if (timeout_obj == Py_None) {
- timeout = -1.0; /* block forever */
- } else {
- timeout = PyFloat_AsDouble(timeout_obj);
- if (PyErr_Occurred())
- return NULL;
- if (timeout < 0.0)
- timeout = 0.0;
- }
-
- Py_BEGIN_ALLOW_THREADS
- res = conn_poll(self, timeout, _save);
- Py_END_ALLOW_THREADS
-
- switch (res) {
- case TRUE:
- Py_RETURN_TRUE;
- case FALSE:
- Py_RETURN_FALSE;
- default:
- return mp_SetError(PyExc_IOError, res);
- }
-}
-
-static PyObject *
-connection_fileno(ConnectionObject* self)
-{
- if (self->handle == INVALID_HANDLE_VALUE) {
- PyErr_SetString(PyExc_IOError, "handle is invalid");
- return NULL;
- }
- return PyInt_FromLong((long)self->handle);
-}
-
-static PyObject *
-connection_close(ConnectionObject *self)
-{
- if (self->handle != INVALID_HANDLE_VALUE) {
- Py_BEGIN_ALLOW_THREADS
- CLOSE(self->handle);
- Py_END_ALLOW_THREADS
- self->handle = INVALID_HANDLE_VALUE;
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-connection_repr(ConnectionObject *self)
-{
- static char *conn_type[] = {"read-only", "write-only", "read-write"};
-
- assert(self->flags >= 1 && self->flags <= 3);
- return FROM_FORMAT("<%s %s, handle %zd>",
- conn_type[self->flags - 1],
- CONNECTION_NAME, (Py_ssize_t)self->handle);
-}
-
-/*
- * Getters and setters
- */
-
-static PyObject *
-connection_closed(ConnectionObject *self, void *closure)
-{
- return PyBool_FromLong((long)(self->handle == INVALID_HANDLE_VALUE));
-}
-
-static PyObject *
-connection_readable(ConnectionObject *self, void *closure)
-{
- return PyBool_FromLong((long)(self->flags & READABLE));
-}
-
-static PyObject *
-connection_writable(ConnectionObject *self, void *closure)
-{
- return PyBool_FromLong((long)(self->flags & WRITABLE));
-}
-
-/*
- * Tables
- */
-
-static PyMethodDef connection_methods[] = {
- {"send_bytes", (PyCFunction)connection_sendbytes, METH_VARARGS,
- "send the byte data from a readable buffer-like object"},
- {"recv_bytes", (PyCFunction)connection_recvbytes, METH_VARARGS,
- "receive byte data as a string"},
- {"recv_bytes_into",(PyCFunction)connection_recvbytes_into,METH_VARARGS,
- "receive byte data into a writeable buffer-like object\n"
- "returns the number of bytes read"},
-
- {"send", (PyCFunction)connection_send_obj, METH_O,
- "send a (picklable) object"},
- {"recv", (PyCFunction)connection_recv_obj, METH_NOARGS,
- "receive a (picklable) object"},
-
- {"poll", (PyCFunction)connection_poll, METH_VARARGS,
- "whether there is any input available to be read"},
- {"fileno", (PyCFunction)connection_fileno, METH_NOARGS,
- "file descriptor or handle of the connection"},
- {"close", (PyCFunction)connection_close, METH_NOARGS,
- "close the connection"},
-
- {NULL} /* Sentinel */
-};
-
-static PyGetSetDef connection_getset[] = {
- {"closed", (getter)connection_closed, NULL,
- "True if the connection is closed", NULL},
- {"readable", (getter)connection_readable, NULL,
- "True if the connection is readable", NULL},
- {"writable", (getter)connection_writable, NULL,
- "True if the connection is writable", NULL},
- {NULL}
-};
-
-/*
- * Connection type
- */
-
-PyDoc_STRVAR(connection_doc,
- "Connection type whose constructor signature is\n\n"
- " Connection(handle, readable=True, writable=True).\n\n"
- "The constructor does *not* duplicate the handle.");
-
-PyTypeObject CONNECTION_TYPE = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* tp_name */ "_multiprocessing." CONNECTION_NAME,
- /* tp_basicsize */ sizeof(ConnectionObject),
- /* tp_itemsize */ 0,
- /* tp_dealloc */ (destructor)connection_dealloc,
- /* tp_print */ 0,
- /* tp_getattr */ 0,
- /* tp_setattr */ 0,
- /* tp_reserved */ 0,
- /* tp_repr */ (reprfunc)connection_repr,
- /* tp_as_number */ 0,
- /* tp_as_sequence */ 0,
- /* tp_as_mapping */ 0,
- /* tp_hash */ 0,
- /* tp_call */ 0,
- /* tp_str */ 0,
- /* tp_getattro */ 0,
- /* tp_setattro */ 0,
- /* tp_as_buffer */ 0,
- /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
- Py_TPFLAGS_HAVE_WEAKREFS,
- /* tp_doc */ connection_doc,
- /* tp_traverse */ 0,
- /* tp_clear */ 0,
- /* tp_richcompare */ 0,
- /* tp_weaklistoffset */ offsetof(ConnectionObject, weakreflist),
- /* tp_iter */ 0,
- /* tp_iternext */ 0,
- /* tp_methods */ connection_methods,
- /* tp_members */ 0,
- /* tp_getset */ connection_getset,
- /* tp_base */ 0,
- /* tp_dict */ 0,
- /* tp_descr_get */ 0,
- /* tp_descr_set */ 0,
- /* tp_dictoffset */ 0,
- /* tp_init */ 0,
- /* tp_alloc */ 0,
- /* tp_new */ connection_new,
-};
-
-#endif /* CONNECTION_H */
diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c
index ee250e0..eb05c62 100644
--- a/Modules/_multiprocessing/multiprocessing.c
+++ b/Modules/_multiprocessing/multiprocessing.c
@@ -3,20 +3,13 @@
*
* multiprocessing.c
*
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
+ * Copyright (c) 2006-2008, R Oudkerk
+ * Licensed to PSF under a Contributor Agreement.
*/
#include "multiprocessing.h"
-#if (defined(CMSG_LEN) && defined(SCM_RIGHTS))
- #define HAVE_FD_TRANSFER 1
-#else
- #define HAVE_FD_TRANSFER 0
-#endif
-
-PyObject *create_win32_namespace(void);
-PyObject *pickle_dumps, *pickle_loads, *pickle_protocol;
PyObject *ProcessError, *BufferTooShort;
/*
@@ -49,16 +42,6 @@ mp_SetError(PyObject *Type, int num)
case MP_MEMORY_ERROR:
PyErr_NoMemory();
break;
- case MP_END_OF_FILE:
- PyErr_SetNone(PyExc_EOFError);
- break;
- case MP_EARLY_END_OF_FILE:
- PyErr_SetString(PyExc_IOError,
- "got end of file during message");
- break;
- case MP_BAD_MESSAGE_LENGTH:
- PyErr_SetString(PyExc_IOError, "bad message length");
- break;
case MP_EXCEPTION_HAS_BEEN_SET:
break;
default:
@@ -68,170 +51,82 @@ mp_SetError(PyObject *Type, int num)
return NULL;
}
-
-/*
- * Windows only
- */
-
#ifdef MS_WINDOWS
-
-/* On Windows we set an event to signal Ctrl-C; compare with timemodule.c */
-
-HANDLE sigint_event = NULL;
-
-static BOOL WINAPI
-ProcessingCtrlHandler(DWORD dwCtrlType)
-{
- SetEvent(sigint_event);
- return FALSE;
-}
-
-/*
- * Unix only
- */
-
-#else /* !MS_WINDOWS */
-
-#if HAVE_FD_TRANSFER
-
-/* Functions for transferring file descriptors between processes.
- Reimplements some of the functionality of the fdcred
- module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */
-/* Based in http://resin.csoft.net/cgi-bin/man.cgi?section=3&topic=CMSG_DATA */
-
static PyObject *
-multiprocessing_sendfd(PyObject *self, PyObject *args)
+multiprocessing_closesocket(PyObject *self, PyObject *args)
{
- int conn, fd, res;
- struct iovec dummy_iov;
- char dummy_char;
- struct msghdr msg;
- struct cmsghdr *cmsg;
- union {
- struct cmsghdr hdr;
- unsigned char buf[CMSG_SPACE(sizeof(int))];
- } cmsgbuf;
-
- if (!PyArg_ParseTuple(args, "ii", &conn, &fd))
- return NULL;
-
- dummy_iov.iov_base = &dummy_char;
- dummy_iov.iov_len = 1;
+ HANDLE handle;
+ int ret;
- memset(&msg, 0, sizeof(msg));
- msg.msg_control = &cmsgbuf.buf;
- msg.msg_controllen = sizeof(cmsgbuf.buf);
- msg.msg_iov = &dummy_iov;
- msg.msg_iovlen = 1;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- * (int *) CMSG_DATA(cmsg) = fd;
+ if (!PyArg_ParseTuple(args, F_HANDLE ":closesocket" , &handle))
+ return NULL;
Py_BEGIN_ALLOW_THREADS
- res = sendmsg(conn, &msg, 0);
+ ret = closesocket((SOCKET) handle);
Py_END_ALLOW_THREADS
- if (res < 0)
- return PyErr_SetFromErrno(PyExc_OSError);
+ if (ret)
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
Py_RETURN_NONE;
}
static PyObject *
-multiprocessing_recvfd(PyObject *self, PyObject *args)
+multiprocessing_recv(PyObject *self, PyObject *args)
{
- int conn, fd, res;
- char dummy_char;
- struct iovec dummy_iov;
- struct msghdr msg = {0};
- struct cmsghdr *cmsg;
- union {
- struct cmsghdr hdr;
- unsigned char buf[CMSG_SPACE(sizeof(int))];
- } cmsgbuf;
-
- if (!PyArg_ParseTuple(args, "i", &conn))
- return NULL;
-
- dummy_iov.iov_base = &dummy_char;
- dummy_iov.iov_len = 1;
+ HANDLE handle;
+ int size, nread;
+ PyObject *buf;
- memset(&msg, 0, sizeof(msg));
- msg.msg_control = &cmsgbuf.buf;
- msg.msg_controllen = sizeof(cmsgbuf.buf);
- msg.msg_iov = &dummy_iov;
- msg.msg_iovlen = 1;
+ if (!PyArg_ParseTuple(args, F_HANDLE "i:recv" , &handle, &size))
+ return NULL;
- cmsg = CMSG_FIRSTHDR(&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
- msg.msg_controllen = cmsg->cmsg_len;
+ buf = PyBytes_FromStringAndSize(NULL, size);
+ if (!buf)
+ return NULL;
Py_BEGIN_ALLOW_THREADS
- res = recvmsg(conn, &msg, 0);
+ nread = recv((SOCKET) handle, PyBytes_AS_STRING(buf), size, 0);
Py_END_ALLOW_THREADS
- if (res < 0)
- return PyErr_SetFromErrno(PyExc_OSError);
-
- if (msg.msg_controllen < CMSG_LEN(sizeof(int)) ||
- (cmsg = CMSG_FIRSTHDR(&msg)) == NULL ||
- cmsg->cmsg_level != SOL_SOCKET ||
- cmsg->cmsg_type != SCM_RIGHTS ||
- cmsg->cmsg_len < CMSG_LEN(sizeof(int))) {
- /* If at least one control message is present, there should be
- no room for any further data in the buffer. */
- PyErr_SetString(PyExc_RuntimeError, "No file descriptor received");
- return NULL;
+ if (nread < 0) {
+ Py_DECREF(buf);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
}
-
- fd = * (int *) CMSG_DATA(cmsg);
- return Py_BuildValue("i", fd);
+ _PyBytes_Resize(&buf, nread);
+ return buf;
}
-#endif /* HAVE_FD_TRANSFER */
-
-#endif /* !MS_WINDOWS */
-
-
-/*
- * All platforms
- */
-
-static PyObject*
-multiprocessing_address_of_buffer(PyObject *self, PyObject *obj)
+static PyObject *
+multiprocessing_send(PyObject *self, PyObject *args)
{
- void *buffer;
- Py_ssize_t buffer_len;
+ HANDLE handle;
+ Py_buffer buf;
+ int ret;
- if (PyObject_AsWriteBuffer(obj, &buffer, &buffer_len) < 0)
+ if (!PyArg_ParseTuple(args, F_HANDLE "y*:send" , &handle, &buf))
return NULL;
- return Py_BuildValue("N" F_PY_SSIZE_T,
- PyLong_FromVoidPtr(buffer), buffer_len);
+ Py_BEGIN_ALLOW_THREADS
+ ret = send((SOCKET) handle, buf.buf, buf.len, 0);
+ Py_END_ALLOW_THREADS
+
+ PyBuffer_Release(&buf);
+ if (ret < 0)
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
+ return PyLong_FromLong(ret);
}
+#endif
/*
* Function table
*/
static PyMethodDef module_methods[] = {
- {"address_of_buffer", multiprocessing_address_of_buffer, METH_O,
- "address_of_buffer(obj) -> int\n"
- "Return address of obj assuming obj supports buffer inteface"},
-#if HAVE_FD_TRANSFER
- {"sendfd", multiprocessing_sendfd, METH_VARARGS,
- "sendfd(sockfd, fd) -> None\n"
- "Send file descriptor given by fd over the unix domain socket\n"
- "whose file decriptor is sockfd"},
- {"recvfd", multiprocessing_recvfd, METH_VARARGS,
- "recvfd(sockfd) -> fd\n"
- "Receive a file descriptor over a unix domain socket\n"
- "whose file decriptor is sockfd"},
+#ifdef MS_WINDOWS
+ {"closesocket", multiprocessing_closesocket, METH_VARARGS, ""},
+ {"recv", multiprocessing_recv, METH_VARARGS, ""},
+ {"send", multiprocessing_send, METH_VARARGS, ""},
#endif
{NULL}
};
@@ -257,22 +152,13 @@ static struct PyModuleDef multiprocessing_module = {
PyMODINIT_FUNC
PyInit__multiprocessing(void)
{
- PyObject *module, *temp, *value;
+ PyObject *module, *temp, *value = NULL;
/* Initialize module */
module = PyModule_Create(&multiprocessing_module);
if (!module)
return NULL;
- /* Get copy of objects from pickle */
- temp = PyImport_ImportModule(PICKLE_MODULE);
- if (!temp)
- return NULL;
- pickle_dumps = PyObject_GetAttrString(temp, "dumps");
- pickle_loads = PyObject_GetAttrString(temp, "loads");
- pickle_protocol = PyObject_GetAttrString(temp, "HIGHEST_PROTOCOL");
- Py_XDECREF(temp);
-
/* Get copy of BufferTooShort */
temp = PyImport_ImportModule("multiprocessing");
if (!temp)
@@ -280,12 +166,6 @@ PyInit__multiprocessing(void)
BufferTooShort = PyObject_GetAttrString(temp, "BufferTooShort");
Py_XDECREF(temp);
- /* Add connection type to module */
- if (PyType_Ready(&ConnectionType) < 0)
- return NULL;
- Py_INCREF(&ConnectionType);
- PyModule_AddObject(module, "Connection", (PyObject*)&ConnectionType);
-
#if defined(MS_WINDOWS) || \
(defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
/* Add SemLock type to module */
@@ -308,32 +188,6 @@ PyInit__multiprocessing(void)
PyModule_AddObject(module, "SemLock", (PyObject*)&SemLockType);
#endif
-#ifdef MS_WINDOWS
- /* Add PipeConnection to module */
- if (PyType_Ready(&PipeConnectionType) < 0)
- return NULL;
- Py_INCREF(&PipeConnectionType);
- PyModule_AddObject(module, "PipeConnection",
- (PyObject*)&PipeConnectionType);
-
- /* Initialize win32 class and add to multiprocessing */
- temp = create_win32_namespace();
- if (!temp)
- return NULL;
- PyModule_AddObject(module, "win32", temp);
-
- /* Initialize the event handle used to signal Ctrl-C */
- sigint_event = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!sigint_event) {
- PyErr_SetFromWindowsErr(0);
- return NULL;
- }
- if (!SetConsoleCtrlHandler(ProcessingCtrlHandler, TRUE)) {
- PyErr_SetFromWindowsErr(0);
- return NULL;
- }
-#endif
-
/* Add configuration macros */
temp = PyDict_New();
if (!temp)
@@ -343,7 +197,7 @@ PyInit__multiprocessing(void)
value = Py_BuildValue("i", name); \
if (value == NULL) { Py_DECREF(temp); return NULL; } \
if (PyDict_SetItemString(temp, #name, value) < 0) { \
- Py_DECREF(temp); Py_DECREF(value); return NULL; } \
+ Py_DECREF(temp); Py_DECREF(value); return NULL; } \
Py_DECREF(value)
#if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
@@ -352,9 +206,6 @@ PyInit__multiprocessing(void)
#ifdef HAVE_SEM_TIMEDWAIT
ADD_FLAG(HAVE_SEM_TIMEDWAIT);
#endif
-#ifdef HAVE_FD_TRANSFER
- ADD_FLAG(HAVE_FD_TRANSFER);
-#endif
#ifdef HAVE_BROKEN_SEM_GETVALUE
ADD_FLAG(HAVE_BROKEN_SEM_GETVALUE);
#endif
diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h
index 14425de..e3de9ba 100644
--- a/Modules/_multiprocessing/multiprocessing.h
+++ b/Modules/_multiprocessing/multiprocessing.h
@@ -3,12 +3,6 @@
#define PY_SSIZE_T_CLEAN
-#ifdef __sun
-/* The control message API is only available on Solaris
- if XPG 4.2 or later is requested. */
-#define _XOPEN_SOURCE 500
-#endif
-
#include "Python.h"
#include "structmember.h"
#include "pythread.h"
@@ -29,10 +23,6 @@
# define SEM_VALUE_MAX LONG_MAX
#else
# include <fcntl.h> /* O_CREAT and O_EXCL */
-# include <netinet/in.h>
-# include <sys/socket.h>
-# include <sys/uio.h>
-# include <arpa/inet.h> /* htonl() and ntohl() */
# if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
# include <semaphore.h>
typedef sem_t *SEM_HANDLE;
@@ -64,20 +54,6 @@
/*
- * Make sure Py_ssize_t available
- */
-
-#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
- typedef int Py_ssize_t;
-# define PY_SSIZE_T_MAX INT_MAX
-# define PY_SSIZE_T_MIN INT_MIN
-# define F_PY_SSIZE_T "i"
-# define PyInt_FromSsize_t(n) PyInt_FromLong((long)n)
-#else
-# define F_PY_SSIZE_T "n"
-#endif
-
-/*
* Format codes
*/
@@ -105,12 +81,6 @@
# define T_SEM_HANDLE T_POINTER
#endif
-#if PY_VERSION_HEX >= 0x03000000
-# define F_RBUFFER "y"
-#else
-# define F_RBUFFER "s"
-#endif
-
/*
* Error codes which can be returned by functions called without GIL
*/
@@ -118,11 +88,8 @@
#define MP_SUCCESS (0)
#define MP_STANDARD_ERROR (-1)
#define MP_MEMORY_ERROR (-1001)
-#define MP_END_OF_FILE (-1002)
-#define MP_EARLY_END_OF_FILE (-1003)
-#define MP_BAD_MESSAGE_LENGTH (-1004)
-#define MP_SOCKET_ERROR (-1005)
-#define MP_EXCEPTION_HAS_BEEN_SET (-1006)
+#define MP_SOCKET_ERROR (-1002)
+#define MP_EXCEPTION_HAS_BEEN_SET (-1003)
PyObject *mp_SetError(PyObject *Type, int num);
@@ -130,57 +97,14 @@ PyObject *mp_SetError(PyObject *Type, int num);
* Externs - not all will really exist on all platforms
*/
-extern PyObject *pickle_dumps;
-extern PyObject *pickle_loads;
-extern PyObject *pickle_protocol;
extern PyObject *BufferTooShort;
extern PyTypeObject SemLockType;
-extern PyTypeObject ConnectionType;
extern PyTypeObject PipeConnectionType;
-extern HANDLE sigint_event;
-
-/*
- * Py3k compatibility
- */
-
-#if PY_VERSION_HEX >= 0x03000000
-# define PICKLE_MODULE "pickle"
-# define FROM_FORMAT PyUnicode_FromFormat
-# define PyInt_FromLong PyLong_FromLong
-# define PyInt_FromSsize_t PyLong_FromSsize_t
-#else
-# define PICKLE_MODULE "cPickle"
-# define FROM_FORMAT PyString_FromFormat
-#endif
-
-#ifndef PyVarObject_HEAD_INIT
-# define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
-#endif
-
-#ifndef Py_TPFLAGS_HAVE_WEAKREFS
-# define Py_TPFLAGS_HAVE_WEAKREFS 0
-#endif
-
-/*
- * Connection definition
- */
-
-#define CONNECTION_BUFFER_SIZE 1024
-
-typedef struct {
- PyObject_HEAD
- HANDLE handle;
- int flags;
- PyObject *weakreflist;
- char buffer[CONNECTION_BUFFER_SIZE];
-} ConnectionObject;
/*
* Miscellaneous
*/
-#define MAX_MESSAGE_LENGTH 0x7fffffff
-
#ifndef MIN
# define MIN(x, y) ((x) < (y) ? x : y)
# define MAX(x, y) ((x) > (y) ? x : y)
diff --git a/Modules/_multiprocessing/pipe_connection.c b/Modules/_multiprocessing/pipe_connection.c
deleted file mode 100644
index 05dde0c..0000000
--- a/Modules/_multiprocessing/pipe_connection.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * A type which wraps a pipe handle in message oriented mode
- *
- * pipe_connection.c
- *
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
- */
-
-#include "multiprocessing.h"
-
-#define CLOSE(h) CloseHandle(h)
-
-/*
- * Send string to the pipe; assumes in message oriented mode
- */
-
-static Py_ssize_t
-conn_send_string(ConnectionObject *conn, char *string, size_t length)
-{
- DWORD amount_written;
- BOOL ret;
-
- Py_BEGIN_ALLOW_THREADS
- ret = WriteFile(conn->handle, string, length, &amount_written, NULL);
- Py_END_ALLOW_THREADS
-
- if (ret == 0 && GetLastError() == ERROR_NO_SYSTEM_RESOURCES) {
- PyErr_Format(PyExc_ValueError, "Cannnot send %" PY_FORMAT_SIZE_T "d bytes over connection", length);
- return MP_STANDARD_ERROR;
- }
-
- return ret ? MP_SUCCESS : MP_STANDARD_ERROR;
-}
-
-/*
- * Attempts to read into buffer, or if buffer too small into *newbuffer.
- *
- * Returns number of bytes read. Assumes in message oriented mode.
- */
-
-static Py_ssize_t
-conn_recv_string(ConnectionObject *conn, char *buffer,
- size_t buflength, char **newbuffer, size_t maxlength)
-{
- DWORD left, length, full_length, err;
- BOOL ret;
- *newbuffer = NULL;
-
- Py_BEGIN_ALLOW_THREADS
- ret = ReadFile(conn->handle, buffer, MIN(buflength, maxlength),
- &length, NULL);
- Py_END_ALLOW_THREADS
- if (ret)
- return length;
-
- err = GetLastError();
- if (err != ERROR_MORE_DATA) {
- if (err == ERROR_BROKEN_PIPE)
- return MP_END_OF_FILE;
- return MP_STANDARD_ERROR;
- }
-
- if (!PeekNamedPipe(conn->handle, NULL, 0, NULL, NULL, &left))
- return MP_STANDARD_ERROR;
-
- full_length = length + left;
- if (full_length > maxlength)
- return MP_BAD_MESSAGE_LENGTH;
-
- *newbuffer = PyMem_Malloc(full_length);
- if (*newbuffer == NULL)
- return MP_MEMORY_ERROR;
-
- memcpy(*newbuffer, buffer, length);
-
- Py_BEGIN_ALLOW_THREADS
- ret = ReadFile(conn->handle, *newbuffer+length, left, &length, NULL);
- Py_END_ALLOW_THREADS
- if (ret) {
- assert(length == left);
- return full_length;
- } else {
- PyMem_Free(*newbuffer);
- return MP_STANDARD_ERROR;
- }
-}
-
-/*
- * Check whether any data is available for reading
- */
-
-static int
-conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save)
-{
- DWORD bytes, deadline, delay;
- int difference, res;
- BOOL block = FALSE;
-
- if (!PeekNamedPipe(conn->handle, NULL, 0, NULL, &bytes, NULL))
- return MP_STANDARD_ERROR;
-
- if (timeout == 0.0)
- return bytes > 0;
-
- if (timeout < 0.0)
- block = TRUE;
- else
- /* XXX does not check for overflow */
- deadline = GetTickCount() + (DWORD)(1000 * timeout + 0.5);
-
- Sleep(0);
-
- for (delay = 1 ; ; delay += 1) {
- if (!PeekNamedPipe(conn->handle, NULL, 0, NULL, &bytes, NULL))
- return MP_STANDARD_ERROR;
- else if (bytes > 0)
- return TRUE;
-
- if (!block) {
- difference = deadline - GetTickCount();
- if (difference < 0)
- return FALSE;
- if ((int)delay > difference)
- delay = difference;
- }
-
- if (delay > 20)
- delay = 20;
-
- Sleep(delay);
-
- /* check for signals */
- Py_BLOCK_THREADS
- res = PyErr_CheckSignals();
- Py_UNBLOCK_THREADS
-
- if (res)
- return MP_EXCEPTION_HAS_BEEN_SET;
- }
-}
-
-/*
- * "connection.h" defines the PipeConnection type using the definitions above
- */
-
-#define CONNECTION_NAME "PipeConnection"
-#define CONNECTION_TYPE PipeConnectionType
-
-#include "connection.h"
diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c
index 1f37d6a..8ea92f2 100644
--- a/Modules/_multiprocessing/semaphore.c
+++ b/Modules/_multiprocessing/semaphore.c
@@ -3,7 +3,8 @@
*
* semaphore.c
*
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
+ * Copyright (c) 2006-2008, R Oudkerk
+ * Licensed to PSF under a Contributor Agreement.
*/
#include "multiprocessing.h"
@@ -62,7 +63,8 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
int blocking = 1;
double timeout;
PyObject *timeout_obj = Py_None;
- DWORD res, full_msecs, msecs, start, ticks;
+ DWORD res, full_msecs, nhandles;
+ HANDLE handles[2], sigint_event;
static char *kwlist[] = {"block", "timeout", NULL};
@@ -96,53 +98,40 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
Py_RETURN_TRUE;
}
- /* check whether we can acquire without blocking */
+ /* check whether we can acquire without releasing the GIL and blocking */
if (WaitForSingleObject(self->handle, 0) == WAIT_OBJECT_0) {
self->last_tid = GetCurrentThreadId();
++self->count;
Py_RETURN_TRUE;
}
- msecs = full_msecs;
- start = GetTickCount();
-
- for ( ; ; ) {
- HANDLE handles[2] = {self->handle, sigint_event};
+ /* prepare list of handles */
+ nhandles = 0;
+ handles[nhandles++] = self->handle;
+ if (_PyOS_IsMainThread()) {
+ sigint_event = _PyOS_SigintEvent();
+ assert(sigint_event != NULL);
+ handles[nhandles++] = sigint_event;
+ }
- /* do the wait */
- Py_BEGIN_ALLOW_THREADS
+ /* do the wait */
+ Py_BEGIN_ALLOW_THREADS
+ if (sigint_event != NULL)
ResetEvent(sigint_event);
- res = WaitForMultipleObjects(2, handles, FALSE, msecs);
- Py_END_ALLOW_THREADS
-
- /* handle result */
- if (res != WAIT_OBJECT_0 + 1)
- break;
-
- /* got SIGINT so give signal handler a chance to run */
- Sleep(1);
-
- /* if this is main thread let KeyboardInterrupt be raised */
- if (PyErr_CheckSignals())
- return NULL;
-
- /* recalculate timeout */
- if (msecs != INFINITE) {
- ticks = GetTickCount();
- if ((DWORD)(ticks - start) >= full_msecs)
- Py_RETURN_FALSE;
- msecs = full_msecs - (ticks - start);
- }
- }
+ res = WaitForMultipleObjects(nhandles, handles, FALSE, full_msecs);
+ Py_END_ALLOW_THREADS
/* handle result */
switch (res) {
case WAIT_TIMEOUT:
Py_RETURN_FALSE;
- case WAIT_OBJECT_0:
+ case WAIT_OBJECT_0 + 0:
self->last_tid = GetCurrentThreadId();
++self->count;
Py_RETURN_TRUE;
+ case WAIT_OBJECT_0 + 1:
+ errno = EINTR;
+ return PyErr_SetFromErrno(PyExc_IOError);
case WAIT_FAILED:
return PyErr_SetFromWindowsErr(0);
default:
@@ -483,7 +472,7 @@ semlock_dealloc(SemLockObject* self)
static PyObject *
semlock_count(SemLockObject *self)
{
- return PyInt_FromLong((long)self->count);
+ return PyLong_FromLong((long)self->count);
}
static PyObject *
@@ -507,7 +496,7 @@ semlock_getvalue(SemLockObject *self)
the number of waiting threads */
if (sval < 0)
sval = 0;
- return PyInt_FromLong((long)sval);
+ return PyLong_FromLong((long)sval);
#endif
}
diff --git a/Modules/_multiprocessing/socket_connection.c b/Modules/_multiprocessing/socket_connection.c
deleted file mode 100644
index 1169c0a..0000000
--- a/Modules/_multiprocessing/socket_connection.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * A type which wraps a socket
- *
- * socket_connection.c
- *
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
- */
-
-#include "multiprocessing.h"
-
-#ifdef MS_WINDOWS
-# define WRITE(h, buffer, length) send((SOCKET)h, buffer, length, 0)
-# define READ(h, buffer, length) recv((SOCKET)h, buffer, length, 0)
-# define CLOSE(h) closesocket((SOCKET)h)
-#else
-# define WRITE(h, buffer, length) write(h, buffer, length)
-# define READ(h, buffer, length) read(h, buffer, length)
-# define CLOSE(h) close(h)
-#endif
-
-/*
- * Send string to file descriptor
- */
-
-static Py_ssize_t
-_conn_sendall(HANDLE h, char *string, size_t length)
-{
- char *p = string;
- Py_ssize_t res;
-
- while (length > 0) {
- res = WRITE(h, p, length);
- if (res < 0)
- return MP_SOCKET_ERROR;
- length -= res;
- p += res;
- }
-
- return MP_SUCCESS;
-}
-
-/*
- * Receive string of exact length from file descriptor
- */
-
-static Py_ssize_t
-_conn_recvall(HANDLE h, char *buffer, size_t length)
-{
- size_t remaining = length;
- Py_ssize_t temp;
- char *p = buffer;
-
- while (remaining > 0) {
- temp = READ(h, p, remaining);
- if (temp <= 0) {
- if (temp == 0)
- return remaining == length ?
- MP_END_OF_FILE : MP_EARLY_END_OF_FILE;
- else
- return temp;
- }
- remaining -= temp;
- p += temp;
- }
-
- return MP_SUCCESS;
-}
-
-/*
- * Send a string prepended by the string length in network byte order
- */
-
-static Py_ssize_t
-conn_send_string(ConnectionObject *conn, char *string, size_t length)
-{
- Py_ssize_t res;
- /* The "header" of the message is a 32 bit unsigned number (in
- network order) which specifies the length of the "body". If
- the message is shorter than about 16kb then it is quicker to
- combine the "header" and the "body" of the message and send
- them at once. */
- if (length < (16*1024)) {
- char *message;
-
- message = PyMem_Malloc(length+4);
- if (message == NULL)
- return MP_MEMORY_ERROR;
-
- *(UINT32*)message = htonl((UINT32)length);
- memcpy(message+4, string, length);
- Py_BEGIN_ALLOW_THREADS
- res = _conn_sendall(conn->handle, message, length+4);
- Py_END_ALLOW_THREADS
- PyMem_Free(message);
- } else {
- UINT32 lenbuff;
-
- if (length > MAX_MESSAGE_LENGTH)
- return MP_BAD_MESSAGE_LENGTH;
-
- lenbuff = htonl((UINT32)length);
- Py_BEGIN_ALLOW_THREADS
- res = _conn_sendall(conn->handle, (char*)&lenbuff, 4) ||
- _conn_sendall(conn->handle, string, length);
- Py_END_ALLOW_THREADS
- }
- return res;
-}
-
-/*
- * Attempts to read into buffer, or failing that into *newbuffer
- *
- * Returns number of bytes read.
- */
-
-static Py_ssize_t
-conn_recv_string(ConnectionObject *conn, char *buffer,
- size_t buflength, char **newbuffer, size_t maxlength)
-{
- Py_ssize_t res;
- UINT32 ulength;
-
- *newbuffer = NULL;
-
- Py_BEGIN_ALLOW_THREADS
- res = _conn_recvall(conn->handle, (char*)&ulength, 4);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return res;
-
- ulength = ntohl(ulength);
- if (ulength > maxlength)
- return MP_BAD_MESSAGE_LENGTH;
-
- if (ulength > buflength) {
- *newbuffer = buffer = PyMem_Malloc((size_t)ulength);
- if (buffer == NULL)
- return MP_MEMORY_ERROR;
- }
-
- Py_BEGIN_ALLOW_THREADS
- res = _conn_recvall(conn->handle, buffer, (size_t)ulength);
- Py_END_ALLOW_THREADS
-
- if (res >= 0) {
- res = (Py_ssize_t)ulength;
- } else if (*newbuffer != NULL) {
- PyMem_Free(*newbuffer);
- *newbuffer = NULL;
- }
- return res;
-}
-
-/*
- * Check whether any data is available for reading -- neg timeout blocks
- */
-
-static int
-conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save)
-{
- int res;
- fd_set rfds;
-
- /*
- * Verify the handle, issue 3321. Not required for windows.
- */
- #ifndef MS_WINDOWS
- if (((int)conn->handle) < 0 || ((int)conn->handle) >= FD_SETSIZE) {
- Py_BLOCK_THREADS
- PyErr_SetString(PyExc_IOError, "handle out of range in select()");
- Py_UNBLOCK_THREADS
- return MP_EXCEPTION_HAS_BEEN_SET;
- }
- #endif
-
- FD_ZERO(&rfds);
- FD_SET((SOCKET)conn->handle, &rfds);
-
- if (timeout < 0.0) {
- res = select((int)conn->handle+1, &rfds, NULL, NULL, NULL);
- } else {
- struct timeval tv;
- tv.tv_sec = (long)timeout;
- tv.tv_usec = (long)((timeout - tv.tv_sec) * 1e6 + 0.5);
- res = select((int)conn->handle+1, &rfds, NULL, NULL, &tv);
- }
-
- if (res < 0) {
- return MP_SOCKET_ERROR;
- } else if (FD_ISSET(conn->handle, &rfds)) {
- return TRUE;
- } else {
- assert(res == 0);
- return FALSE;
- }
-}
-
-/*
- * "connection.h" defines the Connection type using defs above
- */
-
-#define CONNECTION_NAME "Connection"
-#define CONNECTION_TYPE ConnectionType
-
-#include "connection.h"
diff --git a/Modules/_multiprocessing/win32_functions.c b/Modules/_multiprocessing/win32_functions.c
deleted file mode 100644
index 0e348c4..0000000
--- a/Modules/_multiprocessing/win32_functions.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Win32 functions used by multiprocessing package
- *
- * win32_functions.c
- *
- * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
- */
-
-#include "multiprocessing.h"
-
-
-#define WIN32_FUNCTION(func) \
- {#func, (PyCFunction)win32_ ## func, METH_VARARGS | METH_STATIC, ""}
-
-#define WIN32_CONSTANT(fmt, con) \
- PyDict_SetItemString(Win32Type.tp_dict, #con, Py_BuildValue(fmt, con))
-
-
-static PyObject *
-win32_CloseHandle(PyObject *self, PyObject *args)
-{
- HANDLE hObject;
- BOOL success;
-
- if (!PyArg_ParseTuple(args, F_HANDLE, &hObject))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- success = CloseHandle(hObject);
- Py_END_ALLOW_THREADS
-
- if (!success)
- return PyErr_SetFromWindowsErr(0);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-win32_ConnectNamedPipe(PyObject *self, PyObject *args)
-{
- HANDLE hNamedPipe;
- LPOVERLAPPED lpOverlapped;
- BOOL success;
-
- if (!PyArg_ParseTuple(args, F_HANDLE F_POINTER,
- &hNamedPipe, &lpOverlapped))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- success = ConnectNamedPipe(hNamedPipe, lpOverlapped);
- Py_END_ALLOW_THREADS
-
- if (!success)
- return PyErr_SetFromWindowsErr(0);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-win32_CreateFile(PyObject *self, PyObject *args)
-{
- LPCTSTR lpFileName;
- DWORD dwDesiredAccess;
- DWORD dwShareMode;
- LPSECURITY_ATTRIBUTES lpSecurityAttributes;
- DWORD dwCreationDisposition;
- DWORD dwFlagsAndAttributes;
- HANDLE hTemplateFile;
- HANDLE handle;
-
- if (!PyArg_ParseTuple(args, "s" F_DWORD F_DWORD F_POINTER
- F_DWORD F_DWORD F_HANDLE,
- &lpFileName, &dwDesiredAccess, &dwShareMode,
- &lpSecurityAttributes, &dwCreationDisposition,
- &dwFlagsAndAttributes, &hTemplateFile))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- handle = CreateFile(lpFileName, dwDesiredAccess,
- dwShareMode, lpSecurityAttributes,
- dwCreationDisposition,
- dwFlagsAndAttributes, hTemplateFile);
- Py_END_ALLOW_THREADS
-
- if (handle == INVALID_HANDLE_VALUE)
- return PyErr_SetFromWindowsErr(0);
-
- return Py_BuildValue(F_HANDLE, handle);
-}
-
-static PyObject *
-win32_CreateNamedPipe(PyObject *self, PyObject *args)
-{
- LPCTSTR lpName;
- DWORD dwOpenMode;
- DWORD dwPipeMode;
- DWORD nMaxInstances;
- DWORD nOutBufferSize;
- DWORD nInBufferSize;
- DWORD nDefaultTimeOut;
- LPSECURITY_ATTRIBUTES lpSecurityAttributes;
- HANDLE handle;
-
- if (!PyArg_ParseTuple(args, "s" F_DWORD F_DWORD F_DWORD
- F_DWORD F_DWORD F_DWORD F_POINTER,
- &lpName, &dwOpenMode, &dwPipeMode,
- &nMaxInstances, &nOutBufferSize,
- &nInBufferSize, &nDefaultTimeOut,
- &lpSecurityAttributes))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- handle = CreateNamedPipe(lpName, dwOpenMode, dwPipeMode,
- nMaxInstances, nOutBufferSize,
- nInBufferSize, nDefaultTimeOut,
- lpSecurityAttributes);
- Py_END_ALLOW_THREADS
-
- if (handle == INVALID_HANDLE_VALUE)
- return PyErr_SetFromWindowsErr(0);
-
- return Py_BuildValue(F_HANDLE, handle);
-}
-
-static PyObject *
-win32_ExitProcess(PyObject *self, PyObject *args)
-{
- UINT uExitCode;
-
- if (!PyArg_ParseTuple(args, "I", &uExitCode))
- return NULL;
-
- #if defined(Py_DEBUG)
- SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOALIGNMENTFAULTEXCEPT|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX);
- _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
- #endif
-
-
- ExitProcess(uExitCode);
-
- return NULL;
-}
-
-static PyObject *
-win32_GetLastError(PyObject *self, PyObject *args)
-{
- return Py_BuildValue(F_DWORD, GetLastError());
-}
-
-static PyObject *
-win32_OpenProcess(PyObject *self, PyObject *args)
-{
- DWORD dwDesiredAccess;
- BOOL bInheritHandle;
- DWORD dwProcessId;
- HANDLE handle;
-
- if (!PyArg_ParseTuple(args, F_DWORD "i" F_DWORD,
- &dwDesiredAccess, &bInheritHandle, &dwProcessId))
- return NULL;
-
- handle = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
- if (handle == NULL)
- return PyErr_SetFromWindowsErr(0);
-
- return Py_BuildValue(F_HANDLE, handle);
-}
-
-static PyObject *
-win32_SetNamedPipeHandleState(PyObject *self, PyObject *args)
-{
- HANDLE hNamedPipe;
- PyObject *oArgs[3];
- DWORD dwArgs[3], *pArgs[3] = {NULL, NULL, NULL};
- int i;
-
- if (!PyArg_ParseTuple(args, F_HANDLE "OOO",
- &hNamedPipe, &oArgs[0], &oArgs[1], &oArgs[2]))
- return NULL;
-
- PyErr_Clear();
-
- for (i = 0 ; i < 3 ; i++) {
- if (oArgs[i] != Py_None) {
- dwArgs[i] = PyLong_AsUnsignedLongMask(oArgs[i]);
- if (PyErr_Occurred())
- return NULL;
- pArgs[i] = &dwArgs[i];
- }
- }
-
- if (!SetNamedPipeHandleState(hNamedPipe, pArgs[0], pArgs[1], pArgs[2]))
- return PyErr_SetFromWindowsErr(0);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-win32_WaitNamedPipe(PyObject *self, PyObject *args)
-{
- LPCTSTR lpNamedPipeName;
- DWORD nTimeOut;
- BOOL success;
-
- if (!PyArg_ParseTuple(args, "s" F_DWORD, &lpNamedPipeName, &nTimeOut))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- success = WaitNamedPipe(lpNamedPipeName, nTimeOut);
- Py_END_ALLOW_THREADS
-
- if (!success)
- return PyErr_SetFromWindowsErr(0);
-
- Py_RETURN_NONE;
-}
-
-static PyMethodDef win32_methods[] = {
- WIN32_FUNCTION(CloseHandle),
- WIN32_FUNCTION(GetLastError),
- WIN32_FUNCTION(OpenProcess),
- WIN32_FUNCTION(ExitProcess),
- WIN32_FUNCTION(ConnectNamedPipe),
- WIN32_FUNCTION(CreateFile),
- WIN32_FUNCTION(CreateNamedPipe),
- WIN32_FUNCTION(SetNamedPipeHandleState),
- WIN32_FUNCTION(WaitNamedPipe),
- {NULL}
-};
-
-
-PyTypeObject Win32Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
-};
-
-
-PyObject *
-create_win32_namespace(void)
-{
- Win32Type.tp_name = "_multiprocessing.win32";
- Win32Type.tp_methods = win32_methods;
- if (PyType_Ready(&Win32Type) < 0)
- return NULL;
- Py_INCREF(&Win32Type);
-
- WIN32_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS);
- WIN32_CONSTANT(F_DWORD, ERROR_NO_DATA);
- WIN32_CONSTANT(F_DWORD, ERROR_PIPE_BUSY);
- WIN32_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED);
- WIN32_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT);
- WIN32_CONSTANT(F_DWORD, GENERIC_READ);
- WIN32_CONSTANT(F_DWORD, GENERIC_WRITE);
- WIN32_CONSTANT(F_DWORD, INFINITE);
- WIN32_CONSTANT(F_DWORD, NMPWAIT_WAIT_FOREVER);
- WIN32_CONSTANT(F_DWORD, OPEN_EXISTING);
- WIN32_CONSTANT(F_DWORD, PIPE_ACCESS_DUPLEX);
- WIN32_CONSTANT(F_DWORD, PIPE_ACCESS_INBOUND);
- WIN32_CONSTANT(F_DWORD, PIPE_READMODE_MESSAGE);
- WIN32_CONSTANT(F_DWORD, PIPE_TYPE_MESSAGE);
- WIN32_CONSTANT(F_DWORD, PIPE_UNLIMITED_INSTANCES);
- WIN32_CONSTANT(F_DWORD, PIPE_WAIT);
- WIN32_CONSTANT(F_DWORD, PROCESS_ALL_ACCESS);
-
- WIN32_CONSTANT("i", NULL);
-
- return (PyObject*)&Win32Type;
-}
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index fc5f871..5ba5599 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -319,6 +319,7 @@ typedef struct PicklerObject {
objects to support self-referential objects
pickling. */
PyObject *pers_func; /* persistent_id() method, can be NULL */
+ PyObject *dispatch_table; /* private dispatch_table, can be NULL */
PyObject *arg;
PyObject *write; /* write() method of the output stream. */
@@ -605,7 +606,7 @@ PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
/*************************************************************************/
/* Helpers for creating the argument tuple passed to functions. This has the
- performance advantage of calling PyTuple_New() only once.
+ performance advantage of calling PyTuple_New() only once.
XXX(avassalotti): Inline directly in _Pickler_FastCall() and
_Unpickler_FastCall(). */
@@ -764,6 +765,7 @@ _Pickler_New(void)
return NULL;
self->pers_func = NULL;
+ self->dispatch_table = NULL;
self->arg = NULL;
self->write = NULL;
self->proto = 0;
@@ -813,7 +815,7 @@ _Pickler_SetProtocol(PicklerObject *self, PyObject *proto_obj,
fix_imports = PyObject_IsTrue(fix_imports_obj);
if (fix_imports == -1)
return -1;
-
+
self->proto = proto;
self->bin = proto > 0;
self->fix_imports = fix_imports && proto < 3;
@@ -826,8 +828,9 @@ _Pickler_SetProtocol(PicklerObject *self, PyObject *proto_obj,
static int
_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
{
+ _Py_IDENTIFIER(write);
assert(file != NULL);
- self->write = PyObject_GetAttrString(file, "write");
+ self->write = _PyObject_GetAttrId(file, &PyId_write);
if (self->write == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_SetString(PyExc_TypeError,
@@ -909,7 +912,7 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
Py_ssize_t read_size, prefetched_size = 0;
assert(self->read != NULL);
-
+
if (_Unpickler_SkipConsumed(self) < 0)
return -1;
@@ -1037,7 +1040,7 @@ _Unpickler_Readline(UnpicklerObject *self, char **result)
self->next_read_idx = num_read;
return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
}
-
+
/* If we get here, we've run off the end of the input string. Return the
remaining string and let the caller figure it out. */
*result = self->input_buffer + self->next_read_idx;
@@ -1173,15 +1176,19 @@ _Unpickler_New(void)
static int
_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
{
- self->peek = PyObject_GetAttrString(file, "peek");
+ _Py_IDENTIFIER(peek);
+ _Py_IDENTIFIER(read);
+ _Py_IDENTIFIER(readline);
+
+ self->peek = _PyObject_GetAttrId(file, &PyId_peek);
if (self->peek == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
else
return -1;
}
- self->read = PyObject_GetAttrString(file, "read");
- self->readline = PyObject_GetAttrString(file, "readline");
+ self->read = _PyObject_GetAttrId(file, &PyId_read);
+ self->readline = _PyObject_GetAttrId(file, &PyId_readline);
if (self->readline == NULL || self->read == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_SetString(PyExc_TypeError,
@@ -1543,7 +1550,10 @@ save_long(PicklerObject *self, PyObject *obj)
PyErr_Clear();
}
else
- return save_int(self, val);
+#if SIZEOF_LONG > 4
+ if (val <= 0x7fffffffL && val >= -0x80000000L)
+#endif
+ return save_int(self, val);
if (self->proto >= 2) {
/* Linear-time pickling. */
@@ -1598,7 +1608,7 @@ save_long(PicklerObject *self, PyObject *obj)
* bits.
*/
if (sign < 0 &&
- nbytes > 1 &&
+ nbytes > 1 &&
pdata[nbytes - 1] == 0xff &&
(pdata[nbytes - 2] & 0x80) != 0) {
nbytes--;
@@ -1664,7 +1674,7 @@ save_float(PicklerObject *self, PyObject *obj)
return -1;
if (_Pickler_Write(self, pdata, 9) < 0)
return -1;
- }
+ }
else {
int result = -1;
char *buf = NULL;
@@ -1798,90 +1808,65 @@ save_bytes(PicklerObject *self, PyObject *obj)
/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
backslash and newline characters to \uXXXX escapes. */
static PyObject *
-raw_unicode_escape(const Py_UNICODE *s, Py_ssize_t size)
+raw_unicode_escape(PyObject *obj)
{
PyObject *repr, *result;
char *p;
- char *q;
+ Py_ssize_t i, size, expandsize;
+ void *data;
+ unsigned int kind;
- static const char *hexdigits = "0123456789abcdef";
+ if (PyUnicode_READY(obj))
+ return NULL;
+
+ size = PyUnicode_GET_LENGTH(obj);
+ data = PyUnicode_DATA(obj);
+ kind = PyUnicode_KIND(obj);
+ if (kind == PyUnicode_4BYTE_KIND)
+ expandsize = 10;
+ else
+ expandsize = 6;
-#ifdef Py_UNICODE_WIDE
- const Py_ssize_t expandsize = 10;
-#else
- const Py_ssize_t expandsize = 6;
-#endif
-
if (size > PY_SSIZE_T_MAX / expandsize)
return PyErr_NoMemory();
-
repr = PyByteArray_FromStringAndSize(NULL, expandsize * size);
if (repr == NULL)
return NULL;
if (size == 0)
goto done;
- p = q = PyByteArray_AS_STRING(repr);
- while (size-- > 0) {
- Py_UNICODE ch = *s++;
-#ifdef Py_UNICODE_WIDE
+ p = PyByteArray_AS_STRING(repr);
+ for (i=0; i < size; i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
/* Map 32-bit characters to '\Uxxxxxxxx' */
if (ch >= 0x10000) {
*p++ = '\\';
*p++ = 'U';
- *p++ = hexdigits[(ch >> 28) & 0xf];
- *p++ = hexdigits[(ch >> 24) & 0xf];
- *p++ = hexdigits[(ch >> 20) & 0xf];
- *p++ = hexdigits[(ch >> 16) & 0xf];
- *p++ = hexdigits[(ch >> 12) & 0xf];
- *p++ = hexdigits[(ch >> 8) & 0xf];
- *p++ = hexdigits[(ch >> 4) & 0xf];
- *p++ = hexdigits[ch & 15];
+ *p++ = Py_hexdigits[(ch >> 28) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 24) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 20) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 16) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 12) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 8) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 4) & 0xf];
+ *p++ = Py_hexdigits[ch & 15];
}
- else
-#else
- /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
- if (ch >= 0xD800 && ch < 0xDC00) {
- Py_UNICODE ch2;
- Py_UCS4 ucs;
-
- ch2 = *s++;
- size--;
- if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
- ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
- *p++ = '\\';
- *p++ = 'U';
- *p++ = hexdigits[(ucs >> 28) & 0xf];
- *p++ = hexdigits[(ucs >> 24) & 0xf];
- *p++ = hexdigits[(ucs >> 20) & 0xf];
- *p++ = hexdigits[(ucs >> 16) & 0xf];
- *p++ = hexdigits[(ucs >> 12) & 0xf];
- *p++ = hexdigits[(ucs >> 8) & 0xf];
- *p++ = hexdigits[(ucs >> 4) & 0xf];
- *p++ = hexdigits[ucs & 0xf];
- continue;
- }
- /* Fall through: isolated surrogates are copied as-is */
- s--;
- size++;
- }
-#endif
/* Map 16-bit characters to '\uxxxx' */
- if (ch >= 256 || ch == '\\' || ch == '\n') {
+ else if (ch >= 256 || ch == '\\' || ch == '\n') {
*p++ = '\\';
*p++ = 'u';
- *p++ = hexdigits[(ch >> 12) & 0xf];
- *p++ = hexdigits[(ch >> 8) & 0xf];
- *p++ = hexdigits[(ch >> 4) & 0xf];
- *p++ = hexdigits[ch & 15];
+ *p++ = Py_hexdigits[(ch >> 12) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 8) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 4) & 0xf];
+ *p++ = Py_hexdigits[ch & 15];
}
/* Copy everything else as-is */
else
*p++ = (char) ch;
}
- size = p - q;
+ size = p - PyByteArray_AS_STRING(repr);
- done:
+done:
result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(repr), size);
Py_DECREF(repr);
return result;
@@ -1896,9 +1881,7 @@ save_unicode(PicklerObject *self, PyObject *obj)
if (self->bin) {
char pdata[5];
- encoded = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(obj),
- PyUnicode_GET_SIZE(obj),
- "surrogatepass");
+ encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
if (encoded == NULL)
goto error;
@@ -1924,8 +1907,7 @@ save_unicode(PicklerObject *self, PyObject *obj)
else {
const char unicode_op = UNICODE;
- encoded = raw_unicode_escape(PyUnicode_AS_UNICODE(obj),
- PyUnicode_GET_SIZE(obj));
+ encoded = raw_unicode_escape(obj);
if (encoded == NULL)
goto error;
@@ -2544,7 +2526,9 @@ save_dict(PicklerObject *self, PyObject *obj)
status = batch_dict_exact(self, obj);
Py_LeaveRecursiveCall();
} else {
- items = PyObject_CallMethod(obj, "items", "()");
+ _Py_IDENTIFIER(items);
+
+ items = _PyObject_CallMethodId(obj, &PyId_items, "()");
if (items == NULL)
goto error;
iter = PyObject_GetIter(items);
@@ -2828,6 +2812,30 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
}
static int
+save_ellipsis(PicklerObject *self, PyObject *obj)
+{
+ PyObject *str = PyUnicode_FromString("Ellipsis");
+ int res;
+ if (str == NULL)
+ return -1;
+ res = save_global(self, Py_Ellipsis, str);
+ Py_DECREF(str);
+ return res;
+}
+
+static int
+save_notimplemented(PicklerObject *self, PyObject *obj)
+{
+ PyObject *str = PyUnicode_FromString("NotImplemented");
+ int res;
+ if (str == NULL)
+ return -1;
+ res = save_global(self, Py_NotImplemented, str);
+ Py_DECREF(str);
+ return res;
+}
+
+static int
save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
{
PyObject *pid = NULL;
@@ -2881,6 +2889,28 @@ save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
return status;
}
+static PyObject *
+get_class(PyObject *obj)
+{
+ PyObject *cls;
+ static PyObject *str_class;
+
+ if (str_class == NULL) {
+ str_class = PyUnicode_InternFromString("__class__");
+ if (str_class == NULL)
+ return NULL;
+ }
+ cls = PyObject_GetAttr(obj, str_class);
+ if (cls == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_Clear();
+ cls = (PyObject *) Py_TYPE(obj);
+ Py_INCREF(cls);
+ }
+ }
+ return cls;
+}
+
/* We're saving obj, and args is the 2-thru-5 tuple returned by the
* appropriate __reduce__ method for obj.
*/
@@ -2946,17 +2976,18 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
/* Protocol 2 special case: if callable's name is __newobj__, use
NEWOBJ. */
if (use_newobj) {
- static PyObject *newobj_str = NULL;
- PyObject *name_str;
+ static PyObject *newobj_str = NULL, *name_str = NULL;
+ PyObject *name;
if (newobj_str == NULL) {
newobj_str = PyUnicode_InternFromString("__newobj__");
- if (newobj_str == NULL)
+ name_str = PyUnicode_InternFromString("__name__");
+ if (newobj_str == NULL || name_str == NULL)
return -1;
}
- name_str = PyObject_GetAttrString(callable, "__name__");
- if (name_str == NULL) {
+ name = PyObject_GetAttr(callable, name_str);
+ if (name == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
else
@@ -2964,9 +2995,9 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
use_newobj = 0;
}
else {
- use_newobj = PyUnicode_Check(name_str) &&
- PyUnicode_Compare(name_str, newobj_str) == 0;
- Py_DECREF(name_str);
+ use_newobj = PyUnicode_Check(name) &&
+ PyUnicode_Compare(name, newobj_str) == 0;
+ Py_DECREF(name);
}
}
if (use_newobj) {
@@ -2982,20 +3013,14 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
}
cls = PyTuple_GET_ITEM(argtup, 0);
- if (!PyObject_HasAttrString(cls, "__new__")) {
+ if (!PyType_Check(cls)) {
PyErr_SetString(PicklingError, "args[0] from "
- "__newobj__ args has no __new__");
+ "__newobj__ args is not a type");
return -1;
}
if (obj != NULL) {
- obj_class = PyObject_GetAttrString(obj, "__class__");
- if (obj_class == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
- else
- return -1;
- }
+ obj_class = get_class(obj);
p = obj_class != cls; /* true iff a problem */
Py_DECREF(obj_class);
if (p) {
@@ -3069,7 +3094,7 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
return -1;
if (state) {
- if (save(self, state, 0) < 0 ||
+ if (save(self, state, 0) < 0 ||
_Pickler_Write(self, &build_op, 1) < 0)
return -1;
}
@@ -3113,6 +3138,14 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
status = save_none(self, obj);
goto done;
}
+ else if (obj == Py_Ellipsis) {
+ status = save_ellipsis(self, obj);
+ goto done;
+ }
+ else if (obj == Py_NotImplemented) {
+ status = save_notimplemented(self, obj);
+ goto done;
+ }
else if (obj == Py_False || obj == Py_True) {
status = save_bool(self, obj);
goto done;
@@ -3177,17 +3210,24 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
/* XXX: This part needs some unit tests. */
/* Get a reduction callable, and call it. This may come from
- * copyreg.dispatch_table, the object's __reduce_ex__ method,
- * or the object's __reduce__ method.
+ * self.dispatch_table, copyreg.dispatch_table, the object's
+ * __reduce_ex__ method, or the object's __reduce__ method.
*/
- reduce_func = PyDict_GetItem(dispatch_table, (PyObject *)type);
+ if (self->dispatch_table == NULL) {
+ reduce_func = PyDict_GetItem(dispatch_table, (PyObject *)type);
+ /* PyDict_GetItem() unlike PyObject_GetItem() and
+ PyObject_GetAttr() returns a borrowed ref */
+ Py_XINCREF(reduce_func);
+ } else {
+ reduce_func = PyObject_GetItem(self->dispatch_table, (PyObject *)type);
+ if (reduce_func == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ PyErr_Clear();
+ else
+ goto error;
+ }
+ }
if (reduce_func != NULL) {
- /* Here, the reference count of the reduce_func object returned by
- PyDict_GetItem needs to be increased to be consistent with the one
- returned by PyObject_GetAttr. This is allow us to blindly DECREF
- reduce_func at the end of the save() routine.
- */
- Py_INCREF(reduce_func);
Py_INCREF(obj);
reduce_value = _Pickler_FastCall(self, reduce_func, obj);
}
@@ -3323,7 +3363,7 @@ Pickler_dump(PicklerObject *self, PyObject *args)
Developers often forget to call __init__() in their subclasses, which
would trigger a segfault without this check. */
if (self->write == NULL) {
- PyErr_Format(PicklingError,
+ PyErr_Format(PicklingError,
"Pickler.__init__() was not called by %s.__init__()",
Py_TYPE(self)->tp_name);
return NULL;
@@ -3360,6 +3400,7 @@ Pickler_dealloc(PicklerObject *self)
Py_XDECREF(self->output_buffer);
Py_XDECREF(self->write);
Py_XDECREF(self->pers_func);
+ Py_XDECREF(self->dispatch_table);
Py_XDECREF(self->arg);
Py_XDECREF(self->fast_memo);
@@ -3373,6 +3414,7 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
{
Py_VISIT(self->write);
Py_VISIT(self->pers_func);
+ Py_VISIT(self->dispatch_table);
Py_VISIT(self->arg);
Py_VISIT(self->fast_memo);
return 0;
@@ -3384,6 +3426,7 @@ Pickler_clear(PicklerObject *self)
Py_CLEAR(self->output_buffer);
Py_CLEAR(self->write);
Py_CLEAR(self->pers_func);
+ Py_CLEAR(self->dispatch_table);
Py_CLEAR(self->arg);
Py_CLEAR(self->fast_memo);
@@ -3427,6 +3470,8 @@ Pickler_init(PicklerObject *self, PyObject *args, PyObject *kwds)
PyObject *file;
PyObject *proto_obj = NULL;
PyObject *fix_imports = Py_True;
+ _Py_IDENTIFIER(persistent_id);
+ _Py_IDENTIFIER(dispatch_table);
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:Pickler",
kwlist, &file, &proto_obj, &fix_imports))
@@ -3462,12 +3507,19 @@ Pickler_init(PicklerObject *self, PyObject *args, PyObject *kwds)
self->fast_nesting = 0;
self->fast_memo = NULL;
self->pers_func = NULL;
- if (PyObject_HasAttrString((PyObject *)self, "persistent_id")) {
- self->pers_func = PyObject_GetAttrString((PyObject *)self,
- "persistent_id");
+ if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) {
+ self->pers_func = _PyObject_GetAttrId((PyObject *)self,
+ &PyId_persistent_id);
if (self->pers_func == NULL)
return -1;
}
+ self->dispatch_table = NULL;
+ if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) {
+ self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
+ &PyId_dispatch_table);
+ if (self->dispatch_table == NULL)
+ return -1;
+ }
return 0;
}
@@ -3749,6 +3801,7 @@ Pickler_set_persid(PicklerObject *self, PyObject *value)
static PyMemberDef Pickler_members[] = {
{"bin", T_INT, offsetof(PicklerObject, bin)},
{"fast", T_INT, offsetof(PicklerObject, fast)},
+ {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
{NULL}
};
@@ -3803,7 +3856,7 @@ static PyTypeObject Pickler_Type = {
0, /*tp_is_gc*/
};
-/* Temporary helper for calling self.find_class().
+/* Temporary helper for calling self.find_class().
XXX: It would be nice to able to avoid Python function call overhead, by
using directly the C version of find_class(), when find_class() is not
@@ -3813,8 +3866,10 @@ static PyTypeObject Pickler_Type = {
static PyObject *
find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
{
- return PyObject_CallMethod((PyObject *)self, "find_class", "OO",
- module_name, global_name);
+ _Py_IDENTIFIER(find_class);
+
+ return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO",
+ module_name, global_name);
}
static Py_ssize_t
@@ -3856,7 +3911,7 @@ load_int(UnpicklerObject *self)
return bad_readline();
errno = 0;
- /* XXX: Should the base argument of strtol() be explicitly set to 10?
+ /* XXX: Should the base argument of strtol() be explicitly set to 10?
XXX(avassalotti): Should this uses PyOS_strtol()? */
x = strtol(s, &endptr, 0);
@@ -4221,7 +4276,7 @@ load_binstring(UnpicklerObject *self)
x = calc_binint(s, 4);
if (x < 0) {
- PyErr_SetString(UnpicklingError,
+ PyErr_SetString(UnpicklingError,
"BINSTRING pickle has negative byte count");
return -1;
}
@@ -4418,16 +4473,19 @@ static PyObject *
instantiate(PyObject *cls, PyObject *args)
{
PyObject *result = NULL;
+ _Py_IDENTIFIER(__getinitargs__);
/* Caller must assure args are a tuple. Normally, args come from
Pdata_poptuple which packs objects from the top of the stack
into a newly created tuple. */
assert(PyTuple_Check(args));
if (Py_SIZE(args) > 0 || !PyType_Check(cls) ||
- PyObject_HasAttrString(cls, "__getinitargs__")) {
+ _PyObject_HasAttrId(cls, &PyId___getinitargs__)) {
result = PyObject_CallObject(cls, args);
}
else {
- result = PyObject_CallMethod(cls, "__new__", "O", cls);
+ _Py_IDENTIFIER(__new__);
+
+ result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls);
}
return result;
}
@@ -4968,8 +5026,9 @@ do_append(UnpicklerObject *self, Py_ssize_t x)
}
else {
PyObject *append_func;
+ _Py_IDENTIFIER(append);
- append_func = PyObject_GetAttrString(list, "append");
+ append_func = _PyObject_GetAttrId(list, &PyId_append);
if (append_func == NULL)
return -1;
for (i = x; i < len; i++) {
@@ -5015,7 +5074,7 @@ do_setitems(UnpicklerObject *self, Py_ssize_t x)
return stack_underflow();
if (len == x) /* nothing to do */
return 0;
- if ((len - x) % 2 != 0) {
+ if ((len - x) % 2 != 0) {
/* Currupt or hostile pickle -- we never write one like this. */
PyErr_SetString(UnpicklingError, "odd number of items for SETITEMS");
return -1;
@@ -5056,6 +5115,7 @@ load_build(UnpicklerObject *self)
PyObject *state, *inst, *slotstate;
PyObject *setstate;
int status = 0;
+ _Py_IDENTIFIER(__setstate__);
/* Stack is ... instance, state. We want to leave instance at
* the stack top, possibly mutated via instance.__setstate__(state).
@@ -5069,7 +5129,7 @@ load_build(UnpicklerObject *self)
inst = self->stack->data[Py_SIZE(self->stack) - 1];
- setstate = PyObject_GetAttrString(inst, "__setstate__");
+ setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
if (setstate == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -5112,12 +5172,13 @@ load_build(UnpicklerObject *self)
PyObject *dict;
PyObject *d_key, *d_value;
Py_ssize_t i;
+ _Py_IDENTIFIER(__dict__);
if (!PyDict_Check(state)) {
PyErr_SetString(UnpicklingError, "state is not a dictionary");
goto error;
}
- dict = PyObject_GetAttrString(inst, "__dict__");
+ dict = _PyObject_GetAttrId(inst, &PyId___dict__);
if (dict == NULL)
goto error;
@@ -5372,7 +5433,7 @@ Unpickler_load(UnpicklerObject *self)
not call Unpickler.__init__(). Here, we simply ensure that self->read
is not NULL. */
if (self->read == NULL) {
- PyErr_Format(UnpicklingError,
+ PyErr_Format(UnpicklingError,
"Unpickler.__init__() was not called by %s.__init__()",
Py_TYPE(self)->tp_name);
return NULL;
@@ -5474,7 +5535,7 @@ Unpickler_find_class(UnpicklerObject *self, PyObject *args)
global = PyObject_GetAttr(module, global_name);
Py_DECREF(module);
}
- else {
+ else {
global = PyObject_GetAttr(module, global_name);
}
return global;
@@ -5582,6 +5643,7 @@ Unpickler_init(UnpicklerObject *self, PyObject *args, PyObject *kwds)
PyObject *fix_imports = Py_True;
char *encoding = NULL;
char *errors = NULL;
+ _Py_IDENTIFIER(persistent_load);
/* XXX: That is an horrible error message. But, I don't know how to do
better... */
@@ -5616,9 +5678,9 @@ Unpickler_init(UnpicklerObject *self, PyObject *args, PyObject *kwds)
if (self->fix_imports == -1)
return -1;
- if (PyObject_HasAttrString((PyObject *)self, "persistent_load")) {
- self->pers_func = PyObject_GetAttrString((PyObject *)self,
- "persistent_load");
+ if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) {
+ self->pers_func = _PyObject_GetAttrId((PyObject *)self,
+ &PyId_persistent_load);
if (self->pers_func == NULL)
return -1;
}
@@ -5651,7 +5713,7 @@ Unpickler_init(UnpicklerObject *self, PyObject *args, PyObject *kwds)
* intentional, as these should be treated as black-box implementation details.
*
* We do, however, have to implement pickling/unpickling support because of
- * real-world code like cvs2svn.
+ * real-world code like cvs2svn.
*/
typedef struct {
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index 19ca31f..b7b120b 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -47,7 +47,9 @@ static int
_enable_gc(PyObject *gc_module)
{
PyObject *result;
- result = PyObject_CallMethod(gc_module, "enable", NULL);
+ _Py_IDENTIFIER(enable);
+
+ result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
if (result == NULL)
return 1;
Py_DECREF(result);
@@ -78,7 +80,7 @@ _pos_int_from_ascii(char *name)
* that properly supports /dev/fd.
*/
static int
-_is_fdescfs_mounted_on_dev_fd()
+_is_fdescfs_mounted_on_dev_fd(void)
{
struct stat dev_stat;
struct stat dev_fd_stat;
@@ -506,7 +508,7 @@ static PyObject *
subprocess_fork_exec(PyObject* self, PyObject *args)
{
PyObject *gc_module = NULL;
- PyObject *executable_list, *py_close_fds, *py_fds_to_keep;
+ PyObject *executable_list, *py_fds_to_keep;
PyObject *env_list, *preexec_fn;
PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
PyObject *preexec_fn_args_tuple = NULL;
@@ -521,17 +523,14 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
Py_ssize_t arg_num;
if (!PyArg_ParseTuple(
- args, "OOOOOOiiiiiiiiiiO:fork_exec",
- &process_args, &executable_list, &py_close_fds, &py_fds_to_keep,
+ args, "OOpOOOiiiiiiiiiiO:fork_exec",
+ &process_args, &executable_list, &close_fds, &py_fds_to_keep,
&cwd_obj, &env_list,
&p2cread, &p2cwrite, &c2pread, &c2pwrite,
&errread, &errwrite, &errpipe_read, &errpipe_write,
&restore_signals, &call_setsid, &preexec_fn))
return NULL;
- close_fds = PyObject_IsTrue(py_close_fds);
- if (close_fds < 0)
- return NULL;
if (close_fds && errpipe_write < 3) { /* precondition */
PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
return NULL;
@@ -548,10 +547,13 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
/* We need to call gc.disable() when we'll be calling preexec_fn */
if (preexec_fn != Py_None) {
PyObject *result;
+ _Py_IDENTIFIER(isenabled);
+ _Py_IDENTIFIER(disable);
+
gc_module = PyImport_ImportModule("gc");
if (gc_module == NULL)
return NULL;
- result = PyObject_CallMethod(gc_module, "isenabled", NULL);
+ result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
if (result == NULL) {
Py_DECREF(gc_module);
return NULL;
@@ -562,7 +564,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
Py_DECREF(gc_module);
return NULL;
}
- result = PyObject_CallMethod(gc_module, "disable", NULL);
+ result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
if (result == NULL) {
Py_DECREF(gc_module);
return NULL;
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
index bc9b04a..6540ab9 100644
--- a/Modules/_randommodule.c
+++ b/Modules/_randommodule.c
@@ -210,7 +210,7 @@ random_seed(RandomObject *self, PyObject *args)
PyObject *masklower = NULL;
PyObject *thirtytwo = NULL;
PyObject *n = NULL;
- unsigned long *key = NULL;
+ unsigned long *new_key, *key = NULL;
unsigned long keymax; /* # of allocated slots in key */
unsigned long keyused; /* # of used slots in key */
int err;
@@ -228,16 +228,17 @@ random_seed(RandomObject *self, PyObject *args)
Py_INCREF(Py_None);
return Py_None;
}
- /* If the arg is an int or long, use its absolute value; else use
- * the absolute value of its hash code.
+ /* This algorithm relies on the number being unsigned.
+ * So: if the arg is a PyLong, use its absolute value.
+ * Otherwise use its hash value, cast to unsigned.
*/
if (PyLong_Check(arg))
n = PyNumber_Absolute(arg);
else {
- long hash = PyObject_Hash(arg);
+ Py_hash_t hash = PyObject_Hash(arg);
if (hash == -1)
goto Done;
- n = PyLong_FromUnsignedLong((unsigned long)hash);
+ n = PyLong_FromSize_t((size_t)hash);
}
if (n == NULL)
goto Done;
@@ -283,14 +284,16 @@ random_seed(RandomObject *self, PyObject *args)
n = newn;
if (keyused >= keymax) {
unsigned long bigger = keymax << 1;
- if ((bigger >> 1) != keymax) {
+ if ((bigger >> 1) != keymax ||
+ bigger > PY_SSIZE_T_MAX / sizeof(*key)) {
PyErr_NoMemory();
goto Done;
}
- key = (unsigned long *)PyMem_Realloc(key,
+ new_key = (unsigned long *)PyMem_Realloc(key,
bigger * sizeof(*key));
- if (key == NULL)
+ if (new_key == NULL)
goto Done;
+ key = new_key;
keymax = bigger;
}
assert(keyused < keymax);
diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c
index 735a242..3693363 100644
--- a/Modules/_sqlite/cache.c
+++ b/Modules/_sqlite/cache.c
@@ -217,8 +217,6 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args)
pysqlite_Node* ptr;
PyObject* prevkey;
PyObject* nextkey;
- PyObject* fmt_args;
- PyObject* template;
PyObject* display_str;
ptr = self->first;
@@ -229,36 +227,21 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args)
} else {
prevkey = Py_None;
}
- Py_INCREF(prevkey);
if (ptr->next) {
nextkey = ptr->next->key;
} else {
nextkey = Py_None;
}
- Py_INCREF(nextkey);
- fmt_args = Py_BuildValue("OOO", prevkey, ptr->key, nextkey);
- if (!fmt_args) {
- return NULL;
- }
- template = PyUnicode_FromString("%s <- %s ->%s\n");
- if (!template) {
- Py_DECREF(fmt_args);
- return NULL;
- }
- display_str = PyUnicode_Format(template, fmt_args);
- Py_DECREF(template);
- Py_DECREF(fmt_args);
+ display_str = PyUnicode_FromFormat("%S <- %S -> %S\n",
+ prevkey, ptr->key, nextkey);
if (!display_str) {
return NULL;
}
PyObject_Print(display_str, stdout, Py_PRINT_RAW);
Py_DECREF(display_str);
- Py_DECREF(prevkey);
- Py_DECREF(nextkey);
-
ptr = ptr->next;
}
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 9d4c72f..bc4ce50 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -671,7 +671,7 @@ void _pysqlite_final_callback(sqlite3_context* context)
{
PyObject* function_result = NULL;
PyObject** aggregate_instance;
- PyObject* aggregate_class;
+ _Py_IDENTIFIER(finalize);
#ifdef WITH_THREAD
PyGILState_STATE threadstate;
@@ -679,8 +679,6 @@ void _pysqlite_final_callback(sqlite3_context* context)
threadstate = PyGILState_Ensure();
#endif
- aggregate_class = (PyObject*)sqlite3_user_data(context);
-
aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*));
if (!*aggregate_instance) {
/* this branch is executed if there was an exception in the aggregate's
@@ -689,7 +687,7 @@ void _pysqlite_final_callback(sqlite3_context* context)
goto error;
}
- function_result = PyObject_CallMethod(*aggregate_instance, "finalize", "");
+ function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, "");
if (!function_result) {
if (_enable_callback_tracebacks) {
PyErr_Print();
@@ -905,6 +903,38 @@ static int _progress_handler(void* user_arg)
return rc;
}
+static void _trace_callback(void* user_arg, const char* statement_string)
+{
+ PyObject *py_statement = NULL;
+ PyObject *ret = NULL;
+
+#ifdef WITH_THREAD
+ PyGILState_STATE gilstate;
+
+ gilstate = PyGILState_Ensure();
+#endif
+ py_statement = PyUnicode_DecodeUTF8(statement_string,
+ strlen(statement_string), "replace");
+ if (py_statement) {
+ ret = PyObject_CallFunctionObjArgs((PyObject*)user_arg, py_statement, NULL);
+ Py_DECREF(py_statement);
+ }
+
+ if (ret) {
+ Py_DECREF(ret);
+ } else {
+ if (_enable_callback_tracebacks) {
+ PyErr_Print();
+ } else {
+ PyErr_Clear();
+ }
+ }
+
+#ifdef WITH_THREAD
+ PyGILState_Release(gilstate);
+#endif
+}
+
static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
{
PyObject* authorizer_cb;
@@ -964,6 +994,34 @@ static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* s
return Py_None;
}
+static PyObject* pysqlite_connection_set_trace_callback(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
+{
+ PyObject* trace_callback;
+
+ static char *kwlist[] = { "trace_callback", NULL };
+
+ if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
+ return NULL;
+ }
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:set_trace_callback",
+ kwlist, &trace_callback)) {
+ return NULL;
+ }
+
+ if (trace_callback == Py_None) {
+ /* None clears the trace callback previously set */
+ sqlite3_trace(self->db, 0, (void*)0);
+ } else {
+ if (PyDict_SetItem(self->function_pinboard, trace_callback, Py_None) == -1)
+ return NULL;
+ sqlite3_trace(self->db, _trace_callback, trace_callback);
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
#ifdef HAVE_LOAD_EXTENSION
static PyObject* pysqlite_enable_load_extension(pysqlite_Connection* self, PyObject* args)
{
@@ -1169,8 +1227,9 @@ PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args,
PyObject* cursor = 0;
PyObject* result = 0;
PyObject* method = 0;
+ _Py_IDENTIFIER(cursor);
- cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
+ cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, "");
if (!cursor) {
goto error;
}
@@ -1198,8 +1257,9 @@ PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* a
PyObject* cursor = 0;
PyObject* result = 0;
PyObject* method = 0;
+ _Py_IDENTIFIER(cursor);
- cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
+ cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, "");
if (!cursor) {
goto error;
}
@@ -1227,8 +1287,9 @@ PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject*
PyObject* cursor = 0;
PyObject* result = 0;
PyObject* method = 0;
+ _Py_IDENTIFIER(cursor);
- cursor = PyObject_CallMethod((PyObject*)self, "cursor", "");
+ cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, "");
if (!cursor) {
goto error;
}
@@ -1375,10 +1436,12 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
PyObject* uppercase_name = 0;
PyObject* name;
PyObject* retval;
- Py_UNICODE* chk;
Py_ssize_t i, len;
+ _Py_IDENTIFIER(upper);
char *uppercase_name_str;
int rc;
+ unsigned int kind;
+ void *data;
if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
goto finally;
@@ -1388,17 +1451,21 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
goto finally;
}
- uppercase_name = PyObject_CallMethod(name, "upper", "");
+ uppercase_name = _PyObject_CallMethodId(name, &PyId_upper, "");
if (!uppercase_name) {
goto finally;
}
- len = PyUnicode_GET_SIZE(uppercase_name);
- chk = PyUnicode_AS_UNICODE(uppercase_name);
- for (i=0; i<len; i++, chk++) {
- if ((*chk >= '0' && *chk <= '9')
- || (*chk >= 'A' && *chk <= 'Z')
- || (*chk == '_'))
+ if (PyUnicode_READY(uppercase_name))
+ goto finally;
+ len = PyUnicode_GET_LENGTH(uppercase_name);
+ kind = PyUnicode_KIND(uppercase_name);
+ data = PyUnicode_DATA(uppercase_name);
+ for (i=0; i<len; i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if ((ch >= '0' && ch <= '9')
+ || (ch >= 'A' && ch <= 'Z')
+ || (ch == '_'))
{
continue;
} else {
@@ -1517,6 +1584,8 @@ static PyMethodDef connection_methods[] = {
#endif
{"set_progress_handler", (PyCFunction)pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS,
PyDoc_STR("Sets progress handler callback. Non-standard.")},
+ {"set_trace_callback", (PyCFunction)pysqlite_connection_set_trace_callback, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("Sets a trace callback called for each SQL statement (passed as unicode). Non-standard.")},
{"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS,
PyDoc_STR("Executes a SQL statement. Non-standard.")},
{"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS,
diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h
index c8e2f7c..0c9734c 100644
--- a/Modules/_sqlite/connection.h
+++ b/Modules/_sqlite/connection.h
@@ -83,8 +83,7 @@ typedef struct
/* Determines how bytestrings from SQLite are converted to Python objects:
* - PyUnicode_Type: Python Unicode objects are constructed from UTF-8 bytestrings
- * - OptimizedUnicode: Like before, but for ASCII data, only PyStrings are created.
- * - PyBytes_Type: PyStrings are created as-is.
+ * - PyBytes_Type: The bytestrings are returned as-is.
* - Any custom callable: Any object returned from the callable called with the bytestring
* as single parameter.
*/
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 86fbd4e..8a56d3c 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -126,11 +126,9 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject*
static void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
{
- int rc;
-
/* Reset the statement if the user has not closed the cursor */
if (self->statement) {
- rc = pysqlite_statement_reset(self->statement);
+ pysqlite_statement_reset(self->statement);
Py_DECREF(self->statement);
}
@@ -152,8 +150,9 @@ PyObject* _pysqlite_get_converter(PyObject* key)
{
PyObject* upcase_key;
PyObject* retval;
+ _Py_IDENTIFIER(upper);
- upcase_key = PyObject_CallMethod(key, "upper", "");
+ upcase_key = _PyObject_CallMethodId(key, &PyId_upper, "");
if (!upcase_key) {
return NULL;
}
@@ -268,11 +267,6 @@ PyObject* _pysqlite_build_column_name(const char* colname)
}
}
-PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize)
-{
- return PyUnicode_FromStringAndSize(val_str, size);
-}
-
/*
* Returns a row from the currently active SQLite statement
*
@@ -356,12 +350,8 @@ PyObject* _pysqlite_fetch_one_row(pysqlite_Cursor* self)
} else if (coltype == SQLITE_TEXT) {
val_str = (const char*)sqlite3_column_text(self->statement->st, i);
nbytes = sqlite3_column_bytes(self->statement->st, i);
- if ((self->connection->text_factory == (PyObject*)&PyUnicode_Type)
- || (self->connection->text_factory == pysqlite_OptimizedUnicode)) {
-
- converted = pysqlite_unicode_from_string(val_str, nbytes,
- self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0);
-
+ if (self->connection->text_factory == (PyObject*)&PyUnicode_Type) {
+ converted = PyUnicode_FromStringAndSize(val_str, nbytes);
if (!converted) {
colname = sqlite3_column_name(self->statement->st, i);
if (!colname) {
@@ -460,7 +450,6 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
int statement_type;
PyObject* descriptor;
PyObject* second_argument = NULL;
- int allow_8bit_chars;
if (!check_cursor(self)) {
goto error;
@@ -469,10 +458,6 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
self->locked = 1;
self->reset = 0;
- /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */
- allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) &&
- (self->connection->text_factory != pysqlite_OptimizedUnicode));
-
Py_XDECREF(self->next_row);
self->next_row = NULL;
@@ -536,7 +521,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
if (self->statement != NULL) {
/* There is an active statement */
- rc = pysqlite_statement_reset(self->statement);
+ pysqlite_statement_reset(self->statement);
}
operation_cstr = _PyUnicode_AsStringAndSize(operation, &operation_len);
@@ -631,7 +616,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
pysqlite_statement_mark_dirty(self->statement);
- pysqlite_statement_bind_parameters(self->statement, parameters, allow_8bit_chars);
+ pysqlite_statement_bind_parameters(self->statement, parameters);
if (PyErr_Occurred()) {
goto error;
}
@@ -741,7 +726,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
}
if (multiple) {
- rc = pysqlite_statement_reset(self->statement);
+ pysqlite_statement_reset(self->statement);
}
Py_XDECREF(parameters);
}
diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c
index c730afa..2261b80 100644
--- a/Modules/_sqlite/microprotocols.c
+++ b/Modules/_sqlite/microprotocols.c
@@ -95,7 +95,9 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
/* try to have the protocol adapt this object*/
if (PyObject_HasAttrString(proto, "__adapt__")) {
- PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj);
+ _Py_IDENTIFIER(__adapt__);
+ PyObject *adapted = _PyObject_CallMethodId(proto, &PyId___adapt__, "O", obj);
+
if (adapted) {
if (adapted != Py_None) {
return adapted;
@@ -110,7 +112,9 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
/* and finally try to have the object adapt itself */
if (PyObject_HasAttrString(obj, "__conform__")) {
- PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto);
+ _Py_IDENTIFIER(__conform__);
+ PyObject *adapted = _PyObject_CallMethodId(obj, &PyId___conform__,"O", proto);
+
if (adapted) {
if (adapted != Py_None) {
return adapted;
diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c
index cbc3b8e..bea6d6a 100644
--- a/Modules/_sqlite/module.c
+++ b/Modules/_sqlite/module.c
@@ -37,7 +37,7 @@
PyObject* pysqlite_Error, *pysqlite_Warning, *pysqlite_InterfaceError, *pysqlite_DatabaseError,
*pysqlite_InternalError, *pysqlite_OperationalError, *pysqlite_ProgrammingError,
- *pysqlite_IntegrityError, *pysqlite_DataError, *pysqlite_NotSupportedError, *pysqlite_OptimizedUnicode;
+ *pysqlite_IntegrityError, *pysqlite_DataError, *pysqlite_NotSupportedError;
PyObject* converters;
int _enable_callback_tracebacks;
@@ -179,13 +179,14 @@ static PyObject* module_register_converter(PyObject* self, PyObject* args)
PyObject* name = NULL;
PyObject* callable;
PyObject* retval = NULL;
+ _Py_IDENTIFIER(upper);
if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) {
return NULL;
}
/* convert the name to upper case */
- name = PyObject_CallMethod(orig_name, "upper", "");
+ name = _PyObject_CallMethodId(orig_name, &PyId_upper, "");
if (!name) {
goto error;
}
@@ -406,13 +407,13 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
}
PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError);
- /* We just need "something" unique for pysqlite_OptimizedUnicode. It does not really
- * need to be a string subclass. Just anything that can act as a special
- * marker for us. So I pulled PyCell_Type out of my magic hat.
- */
- Py_INCREF((PyObject*)&PyCell_Type);
- pysqlite_OptimizedUnicode = (PyObject*)&PyCell_Type;
- PyDict_SetItemString(dict, "OptimizedUnicode", pysqlite_OptimizedUnicode);
+ /* In Python 2.x, setting Connection.text_factory to
+ OptimizedUnicode caused Unicode objects to be returned for
+ non-ASCII data and bytestrings to be returned for ASCII data.
+ Now OptimizedUnicode is an alias for str, so it has no
+ effect. */
+ Py_INCREF((PyObject*)&PyUnicode_Type);
+ PyDict_SetItemString(dict, "OptimizedUnicode", (PyObject*)&PyUnicode_Type);
/* Set integer constants */
for (i = 0; _int_constants[i].constant_name != 0; i++) {
diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h
index 0eddb67..b51724b 100644
--- a/Modules/_sqlite/module.h
+++ b/Modules/_sqlite/module.h
@@ -38,8 +38,6 @@ extern PyObject* pysqlite_IntegrityError;
extern PyObject* pysqlite_DataError;
extern PyObject* pysqlite_NotSupportedError;
-extern PyObject* pysqlite_OptimizedUnicode;
-
/* the functions time.time() and time.sleep() */
extern PyObject* time_time;
extern PyObject* time_sleep;
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c
index 3d44094..b50658c 100644
--- a/Modules/_sqlite/row.c
+++ b/Modules/_sqlite/row.c
@@ -173,10 +173,9 @@ static Py_hash_t pysqlite_row_hash(pysqlite_Row *self)
static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other, int opid)
{
- if (opid != Py_EQ && opid != Py_NE) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (opid != Py_EQ && opid != Py_NE)
+ Py_RETURN_NOTIMPLEMENTED;
+
if (PyType_IsSubtype(Py_TYPE(_other), &pysqlite_RowType)) {
pysqlite_Row *other = (pysqlite_Row *)_other;
PyObject *res = PyObject_RichCompare(self->description, other->description, opid);
@@ -186,8 +185,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
return PyObject_RichCompare(self->data, other->data, opid);
}
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
PyMappingMethods pysqlite_row_as_mapping = {
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index 80bcc38..9884860 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -87,7 +87,7 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con
return rc;
}
-int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter, int allow_8bit_chars)
+int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter)
{
int rc = SQLITE_OK;
PY_LONG_LONG longlongval;
@@ -166,7 +166,7 @@ static int _need_adapt(PyObject* obj)
}
}
-void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters, int allow_8bit_chars)
+void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters)
{
PyObject* current_param;
PyObject* adapted;
@@ -220,7 +220,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
}
}
- rc = pysqlite_statement_bind_parameter(self, i + 1, adapted, allow_8bit_chars);
+ rc = pysqlite_statement_bind_parameter(self, i + 1, adapted);
Py_DECREF(adapted);
if (rc != SQLITE_OK) {
@@ -265,7 +265,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
}
}
- rc = pysqlite_statement_bind_parameter(self, i, adapted, allow_8bit_chars);
+ rc = pysqlite_statement_bind_parameter(self, i, adapted);
Py_DECREF(adapted);
if (rc != SQLITE_OK) {
@@ -369,11 +369,9 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self)
void pysqlite_statement_dealloc(pysqlite_Statement* self)
{
- int rc;
-
if (self->st) {
Py_BEGIN_ALLOW_THREADS
- rc = sqlite3_finalize(self->st);
+ sqlite3_finalize(self->st);
Py_END_ALLOW_THREADS
}
diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h
index e5da42e..4681443 100644
--- a/Modules/_sqlite/statement.h
+++ b/Modules/_sqlite/statement.h
@@ -46,8 +46,8 @@ extern PyTypeObject pysqlite_StatementType;
int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql);
void pysqlite_statement_dealloc(pysqlite_Statement* self);
-int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter, int allow_8bit_chars);
-void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters, int allow_8bit_chars);
+int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter);
+void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* parameters);
int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* parameters);
int pysqlite_statement_finalize(pysqlite_Statement* self);
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 472b5a3..cb1f791 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -163,21 +163,17 @@ static unsigned int sre_lower_locale(unsigned int ch)
/* unicode-specific character predicates */
-#if defined(HAVE_UNICODE)
-
-#define SRE_UNI_IS_DIGIT(ch) Py_UNICODE_ISDECIMAL((Py_UNICODE)(ch))
-#define SRE_UNI_IS_SPACE(ch) Py_UNICODE_ISSPACE((Py_UNICODE)(ch))
-#define SRE_UNI_IS_LINEBREAK(ch) Py_UNICODE_ISLINEBREAK((Py_UNICODE)(ch))
-#define SRE_UNI_IS_ALNUM(ch) Py_UNICODE_ISALNUM((Py_UNICODE)(ch))
-#define SRE_UNI_IS_WORD(ch) (SRE_UNI_IS_ALNUM((ch)) || (ch) == '_')
+#define SRE_UNI_IS_DIGIT(ch) Py_UNICODE_ISDECIMAL(ch)
+#define SRE_UNI_IS_SPACE(ch) Py_UNICODE_ISSPACE(ch)
+#define SRE_UNI_IS_LINEBREAK(ch) Py_UNICODE_ISLINEBREAK(ch)
+#define SRE_UNI_IS_ALNUM(ch) Py_UNICODE_ISALNUM(ch)
+#define SRE_UNI_IS_WORD(ch) (SRE_UNI_IS_ALNUM(ch) || (ch) == '_')
static unsigned int sre_lower_unicode(unsigned int ch)
{
- return (unsigned int) Py_UNICODE_TOLOWER((Py_UNICODE)(ch));
+ return (unsigned int) Py_UNICODE_TOLOWER(ch);
}
-#endif
-
LOCAL(int)
sre_category(SRE_CODE category, unsigned int ch)
{
@@ -205,7 +201,6 @@ sre_category(SRE_CODE category, unsigned int ch)
case SRE_CATEGORY_LOC_NOT_WORD:
return !SRE_LOC_IS_WORD(ch);
-#if defined(HAVE_UNICODE)
case SRE_CATEGORY_UNI_DIGIT:
return SRE_UNI_IS_DIGIT(ch);
case SRE_CATEGORY_UNI_NOT_DIGIT:
@@ -222,24 +217,6 @@ sre_category(SRE_CODE category, unsigned int ch)
return SRE_UNI_IS_LINEBREAK(ch);
case SRE_CATEGORY_UNI_NOT_LINEBREAK:
return !SRE_UNI_IS_LINEBREAK(ch);
-#else
- case SRE_CATEGORY_UNI_DIGIT:
- return SRE_IS_DIGIT(ch);
- case SRE_CATEGORY_UNI_NOT_DIGIT:
- return !SRE_IS_DIGIT(ch);
- case SRE_CATEGORY_UNI_SPACE:
- return SRE_IS_SPACE(ch);
- case SRE_CATEGORY_UNI_NOT_SPACE:
- return !SRE_IS_SPACE(ch);
- case SRE_CATEGORY_UNI_WORD:
- return SRE_LOC_IS_WORD(ch);
- case SRE_CATEGORY_UNI_NOT_WORD:
- return !SRE_LOC_IS_WORD(ch);
- case SRE_CATEGORY_UNI_LINEBREAK:
- return SRE_IS_LINEBREAK(ch);
- case SRE_CATEGORY_UNI_NOT_LINEBREAK:
- return !SRE_IS_LINEBREAK(ch);
-#endif
}
return 0;
}
@@ -280,6 +257,7 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
/* generate 8-bit version */
#define SRE_CHAR unsigned char
+#define SRE_CHARGET(state, buf, index) ((unsigned char*)buf)[index]
#define SRE_AT sre_at
#define SRE_COUNT sre_count
#define SRE_CHARSET sre_charset
@@ -287,15 +265,11 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
#define SRE_MATCH sre_match
#define SRE_MATCH_CONTEXT sre_match_context
#define SRE_SEARCH sre_search
-#define SRE_LITERAL_TEMPLATE sre_literal_template
-
-#if defined(HAVE_UNICODE)
#define SRE_RECURSIVE
#include "_sre.c"
#undef SRE_RECURSIVE
-#undef SRE_LITERAL_TEMPLATE
#undef SRE_SEARCH
#undef SRE_MATCH
#undef SRE_MATCH_CONTEXT
@@ -304,10 +278,15 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
#undef SRE_COUNT
#undef SRE_AT
#undef SRE_CHAR
+#undef SRE_CHARGET
-/* generate 16-bit unicode version */
+/* generate 8/16/32-bit unicode version */
-#define SRE_CHAR Py_UNICODE
+#define SRE_CHAR void
+#define SRE_CHARGET(state, buf, index) \
+ ((state->charsize==1) ? ((Py_UCS1*)buf)[index] : \
+ (state->charsize==2) ? ((Py_UCS2*)buf)[index] : \
+ ((Py_UCS4*)buf)[index])
#define SRE_AT sre_uat
#define SRE_COUNT sre_ucount
#define SRE_CHARSET sre_ucharset
@@ -315,8 +294,6 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
#define SRE_MATCH sre_umatch
#define SRE_MATCH_CONTEXT sre_umatch_context
#define SRE_SEARCH sre_usearch
-#define SRE_LITERAL_TEMPLATE sre_uliteral_template
-#endif
#endif /* SRE_RECURSIVE */
@@ -327,7 +304,7 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
settings */
LOCAL(int)
-SRE_AT(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
+SRE_AT(SRE_STATE* state, char* ptr, SRE_CODE at)
{
/* check if pointer is at given position */
@@ -341,16 +318,16 @@ SRE_AT(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
case SRE_AT_BEGINNING_LINE:
return ((void*) ptr == state->beginning ||
- SRE_IS_LINEBREAK((int) ptr[-1]));
+ SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, -1)));
case SRE_AT_END:
- return (((void*) (ptr+1) == state->end &&
- SRE_IS_LINEBREAK((int) ptr[0])) ||
+ return (((void*) (ptr+state->charsize) == state->end &&
+ SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, 0))) ||
((void*) ptr == state->end));
case SRE_AT_END_LINE:
return ((void*) ptr == state->end ||
- SRE_IS_LINEBREAK((int) ptr[0]));
+ SRE_IS_LINEBREAK((int) SRE_CHARGET(state, ptr, 0)));
case SRE_AT_END_STRING:
return ((void*) ptr == state->end);
@@ -359,57 +336,55 @@ SRE_AT(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_IS_WORD((int) ptr[-1]) : 0;
+ SRE_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_IS_WORD((int) ptr[0]) : 0;
+ SRE_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp != thatp;
case SRE_AT_NON_BOUNDARY:
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_IS_WORD((int) ptr[-1]) : 0;
+ SRE_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_IS_WORD((int) ptr[0]) : 0;
+ SRE_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp == thatp;
case SRE_AT_LOC_BOUNDARY:
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
+ SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_LOC_IS_WORD((int) ptr[0]) : 0;
+ SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp != thatp;
case SRE_AT_LOC_NON_BOUNDARY:
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_LOC_IS_WORD((int) ptr[-1]) : 0;
+ SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_LOC_IS_WORD((int) ptr[0]) : 0;
+ SRE_LOC_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp == thatp;
-#if defined(HAVE_UNICODE)
case SRE_AT_UNI_BOUNDARY:
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
+ SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_UNI_IS_WORD((int) ptr[0]) : 0;
+ SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp != thatp;
case SRE_AT_UNI_NON_BOUNDARY:
if (state->beginning == state->end)
return 0;
thatp = ((void*) ptr > state->beginning) ?
- SRE_UNI_IS_WORD((int) ptr[-1]) : 0;
+ SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, -1)) : 0;
thisp = ((void*) ptr < state->end) ?
- SRE_UNI_IS_WORD((int) ptr[0]) : 0;
+ SRE_UNI_IS_WORD((int) SRE_CHARGET(state, ptr, 0)) : 0;
return thisp == thatp;
-#endif
}
@@ -476,7 +451,7 @@ SRE_CHARSET(SRE_CODE* set, SRE_CODE ch)
count = *(set++);
if (sizeof(SRE_CODE) == 2) {
- block = ((unsigned char*)set)[ch >> 8];
+ block = ((char*)set)[ch >> 8];
set += 128;
if (set[block*16 + ((ch & 255)>>4)] & (1 << (ch & 15)))
return ok;
@@ -486,7 +461,7 @@ SRE_CHARSET(SRE_CODE* set, SRE_CODE ch)
/* !(c & ~N) == (c < N+1) for any unsigned c, this avoids
* warnings when c's type supports only numbers < N+1 */
if (!(ch & ~65535))
- block = ((unsigned char*)set)[ch >> 8];
+ block = ((char*)set)[ch >> 8];
else
block = -1;
set += 64;
@@ -512,28 +487,29 @@ LOCAL(Py_ssize_t)
SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
{
SRE_CODE chr;
- SRE_CHAR* ptr = (SRE_CHAR *)state->ptr;
- SRE_CHAR* end = (SRE_CHAR *)state->end;
+ char* ptr = (char *)state->ptr;
+ char* end = (char *)state->end;
Py_ssize_t i;
/* adjust end */
if (maxcount < end - ptr && maxcount != 65535)
- end = ptr + maxcount;
+ end = ptr + maxcount*state->charsize;
switch (pattern[0]) {
case SRE_OP_IN:
/* repeated set */
TRACE(("|%p|%p|COUNT IN\n", pattern, ptr));
- while (ptr < end && SRE_CHARSET(pattern + 2, *ptr))
- ptr++;
+ while (ptr < end &&
+ SRE_CHARSET(pattern + 2, SRE_CHARGET(state, ptr, 0)))
+ ptr += state->charsize;
break;
case SRE_OP_ANY:
/* repeated dot wildcard. */
TRACE(("|%p|%p|COUNT ANY\n", pattern, ptr));
- while (ptr < end && !SRE_IS_LINEBREAK(*ptr))
- ptr++;
+ while (ptr < end && !SRE_IS_LINEBREAK(SRE_CHARGET(state, ptr, 0)))
+ ptr += state->charsize;
break;
case SRE_OP_ANY_ALL:
@@ -547,38 +523,38 @@ SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
/* repeated literal */
chr = pattern[1];
TRACE(("|%p|%p|COUNT LITERAL %d\n", pattern, ptr, chr));
- while (ptr < end && (SRE_CODE) *ptr == chr)
- ptr++;
+ while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) == chr)
+ ptr += state->charsize;
break;
case SRE_OP_LITERAL_IGNORE:
/* repeated literal */
chr = pattern[1];
TRACE(("|%p|%p|COUNT LITERAL_IGNORE %d\n", pattern, ptr, chr));
- while (ptr < end && (SRE_CODE) state->lower(*ptr) == chr)
- ptr++;
+ while (ptr < end && (SRE_CODE) state->lower(SRE_CHARGET(state, ptr, 0)) == chr)
+ ptr += state->charsize;
break;
case SRE_OP_NOT_LITERAL:
/* repeated non-literal */
chr = pattern[1];
TRACE(("|%p|%p|COUNT NOT_LITERAL %d\n", pattern, ptr, chr));
- while (ptr < end && (SRE_CODE) *ptr != chr)
- ptr++;
+ while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) != chr)
+ ptr += state->charsize;
break;
case SRE_OP_NOT_LITERAL_IGNORE:
/* repeated non-literal */
chr = pattern[1];
TRACE(("|%p|%p|COUNT NOT_LITERAL_IGNORE %d\n", pattern, ptr, chr));
- while (ptr < end && (SRE_CODE) state->lower(*ptr) != chr)
- ptr++;
+ while (ptr < end && (SRE_CODE) state->lower(SRE_CHARGET(state, ptr, 0)) != chr)
+ ptr += state->charsize;
break;
default:
/* repeated single character pattern */
TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr));
- while ((SRE_CHAR*) state->ptr < end) {
+ while ((char*) state->ptr < end) {
i = SRE_MATCH(state, pattern);
if (i < 0)
return i;
@@ -586,12 +562,12 @@ SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount)
break;
}
TRACE(("|%p|%p|COUNT %d\n", pattern, ptr,
- (SRE_CHAR*) state->ptr - ptr));
- return (SRE_CHAR*) state->ptr - ptr;
+ ((char*)state->ptr - ptr)/state->charsize));
+ return ((char*)state->ptr - ptr)/state->charsize;
}
- TRACE(("|%p|%p|COUNT %d\n", pattern, ptr, ptr - (SRE_CHAR*) state->ptr));
- return ptr - (SRE_CHAR*) state->ptr;
+ TRACE(("|%p|%p|COUNT %d\n", pattern, ptr, (ptr - (char*) state->ptr)/state->charsize));
+ return (ptr - (char*) state->ptr)/state->charsize;
}
#if 0 /* not used in this release */
@@ -602,8 +578,8 @@ SRE_INFO(SRE_STATE* state, SRE_CODE* pattern)
returns the number of SRE_CODE objects to skip if successful, 0
if no match */
- SRE_CHAR* end = state->end;
- SRE_CHAR* ptr = state->ptr;
+ char* end = state->end;
+ char* ptr = state->ptr;
Py_ssize_t i;
/* check minimal length */
@@ -614,7 +590,7 @@ SRE_INFO(SRE_STATE* state, SRE_CODE* pattern)
if (pattern[2] & SRE_INFO_PREFIX && pattern[5] > 1) {
/* <length> <skip> <prefix data> <overlap data> */
for (i = 0; i < pattern[5]; i++)
- if ((SRE_CODE) ptr[i] != pattern[7 + i])
+ if ((SRE_CODE) SRE_CHARGET(state, ptr, i) != pattern[7 + i])
return 0;
return pattern[0] + 2 * pattern[6];
}
@@ -783,7 +759,7 @@ do { \
typedef struct {
Py_ssize_t last_ctx_pos;
Py_ssize_t jump;
- SRE_CHAR* ptr;
+ char* ptr;
SRE_CODE* pattern;
Py_ssize_t count;
Py_ssize_t lastmark;
@@ -799,7 +775,7 @@ typedef struct {
LOCAL(Py_ssize_t)
SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
{
- SRE_CHAR* end = (SRE_CHAR *)state->end;
+ char* end = (char*)state->end;
Py_ssize_t alloc_pos, ctx_pos = -1;
Py_ssize_t i, ret = 0;
Py_ssize_t jump;
@@ -818,12 +794,12 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
entrance:
- ctx->ptr = (SRE_CHAR *)state->ptr;
+ ctx->ptr = (char *)state->ptr;
if (ctx->pattern[0] == SRE_OP_INFO) {
/* optimization info block */
/* <INFO> <1=skip> <2=flags> <3=min> ... */
- if (ctx->pattern[3] && (end - ctx->ptr) < ctx->pattern[3]) {
+ if (ctx->pattern[3] && (end - ctx->ptr)/state->charsize < ctx->pattern[3]) {
TRACE(("reject (got %d chars, need %d)\n",
(end - ctx->ptr), ctx->pattern[3]));
RETURN_FAILURE;
@@ -865,10 +841,10 @@ entrance:
/* <LITERAL> <code> */
TRACE(("|%p|%p|LITERAL %d\n", ctx->pattern,
ctx->ptr, *ctx->pattern));
- if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] != ctx->pattern[0])
+ if (ctx->ptr >= end || (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) != ctx->pattern[0])
RETURN_FAILURE;
ctx->pattern++;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_NOT_LITERAL:
@@ -876,10 +852,10 @@ entrance:
/* <NOT_LITERAL> <code> */
TRACE(("|%p|%p|NOT_LITERAL %d\n", ctx->pattern,
ctx->ptr, *ctx->pattern));
- if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] == ctx->pattern[0])
+ if (ctx->ptr >= end || (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) == ctx->pattern[0])
RETURN_FAILURE;
ctx->pattern++;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_SUCCESS:
@@ -902,19 +878,19 @@ entrance:
/* <CATEGORY> <code> */
TRACE(("|%p|%p|CATEGORY %d\n", ctx->pattern,
ctx->ptr, *ctx->pattern));
- if (ctx->ptr >= end || !sre_category(ctx->pattern[0], ctx->ptr[0]))
+ if (ctx->ptr >= end || !sre_category(ctx->pattern[0], SRE_CHARGET(state, ctx->ptr, 0)))
RETURN_FAILURE;
ctx->pattern++;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_ANY:
/* match anything (except a newline) */
/* <ANY> */
TRACE(("|%p|%p|ANY\n", ctx->pattern, ctx->ptr));
- if (ctx->ptr >= end || SRE_IS_LINEBREAK(ctx->ptr[0]))
- RETURN_FAILURE;
- ctx->ptr++;
+ if (ctx->ptr >= end || SRE_IS_LINEBREAK(SRE_CHARGET(state, ctx->ptr, 0)))
+ RETURN_FAILURE;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_ANY_ALL:
@@ -923,47 +899,47 @@ entrance:
TRACE(("|%p|%p|ANY_ALL\n", ctx->pattern, ctx->ptr));
if (ctx->ptr >= end)
RETURN_FAILURE;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_IN:
/* match set member (or non_member) */
/* <IN> <skip> <set> */
TRACE(("|%p|%p|IN\n", ctx->pattern, ctx->ptr));
- if (ctx->ptr >= end || !SRE_CHARSET(ctx->pattern + 1, *ctx->ptr))
- RETURN_FAILURE;
+ if (ctx->ptr >= end || !SRE_CHARSET(ctx->pattern + 1, SRE_CHARGET(state, ctx->ptr, 0)))
+ RETURN_FAILURE;
ctx->pattern += ctx->pattern[0];
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_LITERAL_IGNORE:
TRACE(("|%p|%p|LITERAL_IGNORE %d\n",
ctx->pattern, ctx->ptr, ctx->pattern[0]));
if (ctx->ptr >= end ||
- state->lower(*ctx->ptr) != state->lower(*ctx->pattern))
+ state->lower(SRE_CHARGET(state, ctx->ptr, 0)) != state->lower(*ctx->pattern))
RETURN_FAILURE;
ctx->pattern++;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_NOT_LITERAL_IGNORE:
TRACE(("|%p|%p|NOT_LITERAL_IGNORE %d\n",
ctx->pattern, ctx->ptr, *ctx->pattern));
if (ctx->ptr >= end ||
- state->lower(*ctx->ptr) == state->lower(*ctx->pattern))
+ state->lower(SRE_CHARGET(state, ctx->ptr, 0)) == state->lower(*ctx->pattern))
RETURN_FAILURE;
ctx->pattern++;
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_IN_IGNORE:
TRACE(("|%p|%p|IN_IGNORE\n", ctx->pattern, ctx->ptr));
if (ctx->ptr >= end
|| !SRE_CHARSET(ctx->pattern+1,
- (SRE_CODE)state->lower(*ctx->ptr)))
+ (SRE_CODE)state->lower(SRE_CHARGET(state, ctx->ptr, 0))))
RETURN_FAILURE;
ctx->pattern += ctx->pattern[0];
- ctx->ptr++;
+ ctx->ptr += state->charsize;
break;
case SRE_OP_JUMP:
@@ -986,11 +962,11 @@ entrance:
for (; ctx->pattern[0]; ctx->pattern += ctx->pattern[0]) {
if (ctx->pattern[1] == SRE_OP_LITERAL &&
(ctx->ptr >= end ||
- (SRE_CODE) *ctx->ptr != ctx->pattern[2]))
+ (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0) != ctx->pattern[2]))
continue;
if (ctx->pattern[1] == SRE_OP_IN &&
(ctx->ptr >= end ||
- !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) *ctx->ptr)))
+ !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) SRE_CHARGET(state, ctx->ptr, 0))))
continue;
state->ptr = ctx->ptr;
DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1);
@@ -1021,7 +997,7 @@ entrance:
TRACE(("|%p|%p|REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
ctx->pattern[1], ctx->pattern[2]));
- if (ctx->ptr + ctx->pattern[1] > end)
+ if (ctx->ptr + state->charsize * ctx->pattern[1] > end)
RETURN_FAILURE; /* cannot match */
state->ptr = ctx->ptr;
@@ -1030,7 +1006,7 @@ entrance:
RETURN_ON_ERROR(ret);
DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
ctx->count = ret;
- ctx->ptr += ctx->count;
+ ctx->ptr += state->charsize * ctx->count;
/* when we arrive here, count contains the number of
matches, and ctx->ptr points to the tail of the target
@@ -1054,8 +1030,9 @@ entrance:
ctx->u.chr = ctx->pattern[ctx->pattern[0]+1];
for (;;) {
while (ctx->count >= (Py_ssize_t) ctx->pattern[1] &&
- (ctx->ptr >= end || *ctx->ptr != ctx->u.chr)) {
- ctx->ptr--;
+ (ctx->ptr >= end ||
+ SRE_CHARGET(state, ctx->ptr, 0) != ctx->u.chr)) {
+ ctx->ptr -= state->charsize;
ctx->count--;
}
if (ctx->count < (Py_ssize_t) ctx->pattern[1])
@@ -1070,7 +1047,7 @@ entrance:
LASTMARK_RESTORE();
- ctx->ptr--;
+ ctx->ptr -= state->charsize;
ctx->count--;
}
@@ -1084,7 +1061,7 @@ entrance:
RETURN_ON_ERROR(ret);
RETURN_SUCCESS;
}
- ctx->ptr--;
+ ctx->ptr -= state->charsize;
ctx->count--;
LASTMARK_RESTORE();
}
@@ -1104,7 +1081,7 @@ entrance:
TRACE(("|%p|%p|MIN_REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr,
ctx->pattern[1], ctx->pattern[2]));
- if (ctx->ptr + ctx->pattern[1] > end)
+ if (ctx->ptr + state->charsize * ctx->pattern[1] > end)
RETURN_FAILURE; /* cannot match */
state->ptr = ctx->ptr;
@@ -1121,7 +1098,7 @@ entrance:
RETURN_FAILURE;
/* advance past minimum matches of repeat */
ctx->count = ret;
- ctx->ptr += ctx->count;
+ ctx->ptr += state->charsize * ctx->count;
}
if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) {
@@ -1148,7 +1125,7 @@ entrance:
if (ret == 0)
break;
assert(ret == 1);
- ctx->ptr++;
+ ctx->ptr += state->charsize;
ctx->count++;
LASTMARK_RESTORE();
}
@@ -1320,14 +1297,16 @@ entrance:
if (groupref >= state->lastmark) {
RETURN_FAILURE;
} else {
- SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
- SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
+ char* p = (char*) state->mark[groupref];
+ char* e = (char*) state->mark[groupref+1];
if (!p || !e || e < p)
RETURN_FAILURE;
while (p < e) {
- if (ctx->ptr >= end || *ctx->ptr != *p)
+ if (ctx->ptr >= end ||
+ SRE_CHARGET(state, ctx->ptr, 0) != SRE_CHARGET(state, p, 0))
RETURN_FAILURE;
- p++; ctx->ptr++;
+ p += state->charsize;
+ ctx->ptr += state->charsize;
}
}
}
@@ -1344,15 +1323,16 @@ entrance:
if (groupref >= state->lastmark) {
RETURN_FAILURE;
} else {
- SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref];
- SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1];
+ char* p = (char*) state->mark[groupref];
+ char* e = (char*) state->mark[groupref+1];
if (!p || !e || e < p)
RETURN_FAILURE;
while (p < e) {
if (ctx->ptr >= end ||
- state->lower(*ctx->ptr) != state->lower(*p))
+ state->lower(SRE_CHARGET(state, ctx->ptr, 0)) != state->lower(*p))
RETURN_FAILURE;
- p++; ctx->ptr++;
+ p++;
+ ctx->ptr += state->charsize;
}
}
}
@@ -1386,7 +1366,7 @@ entrance:
/* <ASSERT> <skip> <back> <pattern> */
TRACE(("|%p|%p|ASSERT %d\n", ctx->pattern,
ctx->ptr, ctx->pattern[1]));
- state->ptr = ctx->ptr - ctx->pattern[1];
+ state->ptr = ctx->ptr - state->charsize * ctx->pattern[1];
if (state->ptr < state->beginning)
RETURN_FAILURE;
DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2);
@@ -1399,7 +1379,7 @@ entrance:
/* <ASSERT_NOT> <skip> <back> <pattern> */
TRACE(("|%p|%p|ASSERT_NOT %d\n", ctx->pattern,
ctx->ptr, ctx->pattern[1]));
- state->ptr = ctx->ptr - ctx->pattern[1];
+ state->ptr = ctx->ptr - state->charsize * ctx->pattern[1];
if (state->ptr >= state->beginning) {
DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2);
if (ret) {
@@ -1481,8 +1461,8 @@ exit:
LOCAL(Py_ssize_t)
SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
{
- SRE_CHAR* ptr = (SRE_CHAR *)state->start;
- SRE_CHAR* end = (SRE_CHAR *)state->end;
+ char* ptr = (char*)state->start;
+ char* end = (char*)state->end;
Py_ssize_t status = 0;
Py_ssize_t prefix_len = 0;
Py_ssize_t prefix_skip = 0;
@@ -1500,9 +1480,9 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
if (pattern[3] > 1) {
/* adjust end point (but make sure we leave at least one
character in there, so literal search will work) */
- end -= pattern[3]-1;
+ end -= (pattern[3]-1) * state->charsize;
if (end <= ptr)
- end = ptr+1;
+ end = ptr + state->charsize;
}
if (flags & SRE_INFO_PREFIX) {
@@ -1528,10 +1508,10 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
/* pattern starts with a known prefix. use the overlap
table to skip forward as fast as we possibly can */
Py_ssize_t i = 0;
- end = (SRE_CHAR *)state->end;
+ end = (char *)state->end;
while (ptr < end) {
for (;;) {
- if ((SRE_CODE) ptr[0] != prefix[i]) {
+ if ((SRE_CODE) SRE_CHARGET(state, ptr, 0) != prefix[i]) {
if (!i)
break;
else
@@ -1540,8 +1520,8 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
if (++i == prefix_len) {
/* found a potential match */
TRACE(("|%p|%p|SEARCH SCAN\n", pattern, ptr));
- state->start = ptr + 1 - prefix_len;
- state->ptr = ptr + 1 - prefix_len + prefix_skip;
+ state->start = ptr - (prefix_len - 1) * state->charsize;
+ state->ptr = ptr - (prefix_len - prefix_skip - 1) * state->charsize;
if (flags & SRE_INFO_LITERAL)
return 1; /* we got all of it */
status = SRE_MATCH(state, pattern + 2*prefix_skip);
@@ -1553,7 +1533,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
break;
}
}
- ptr++;
+ ptr += state->charsize;
}
return 0;
}
@@ -1563,15 +1543,16 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
/* pattern starts with a literal character. this is used
for short prefixes, and if fast search is disabled */
SRE_CODE chr = pattern[1];
- end = (SRE_CHAR *)state->end;
+ end = (char*)state->end;
for (;;) {
- while (ptr < end && (SRE_CODE) ptr[0] != chr)
- ptr++;
+ while (ptr < end && (SRE_CODE) SRE_CHARGET(state, ptr, 0) != chr)
+ ptr += state->charsize;
if (ptr >= end)
return 0;
TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr));
state->start = ptr;
- state->ptr = ++ptr;
+ ptr += state->charsize;
+ state->ptr = ptr;
if (flags & SRE_INFO_LITERAL)
return 1; /* we got all of it */
status = SRE_MATCH(state, pattern + 2);
@@ -1580,10 +1561,10 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
}
} else if (charset) {
/* pattern starts with a character from a known set */
- end = (SRE_CHAR *)state->end;
+ end = (char*)state->end;
for (;;) {
- while (ptr < end && !SRE_CHARSET(charset, ptr[0]))
- ptr++;
+ while (ptr < end && !SRE_CHARSET(charset, SRE_CHARGET(state, ptr, 0)))
+ ptr += state->charsize;
if (ptr >= end)
return 0;
TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
@@ -1592,13 +1573,14 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
status = SRE_MATCH(state, pattern);
if (status != 0)
break;
- ptr++;
+ ptr += state->charsize;
}
} else
/* general case */
while (ptr <= end) {
TRACE(("|%p|%p|SEARCH\n", pattern, ptr));
- state->start = state->ptr = ptr++;
+ state->start = state->ptr = ptr;
+ ptr += state->charsize;
status = SRE_MATCH(state, pattern);
if (status != 0)
break;
@@ -1607,16 +1589,6 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
return status;
}
-LOCAL(int)
-SRE_LITERAL_TEMPLATE(SRE_CHAR* ptr, Py_ssize_t len)
-{
- /* check if given string is a literal template (i.e. no escapes) */
- while (len-- > 0)
- if (*ptr++ == '\\')
- return 0;
- return 1;
-}
-
#if !defined(SRE_RECURSIVE)
/* -------------------------------------------------------------------- */
@@ -1624,7 +1596,24 @@ SRE_LITERAL_TEMPLATE(SRE_CHAR* ptr, Py_ssize_t len)
/* see sre.h for object declarations */
static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, int);
-static PyObject*pattern_scanner(PatternObject*, PyObject*);
+static PyObject*pattern_scanner(PatternObject*, PyObject*, PyObject* kw);
+
+static int
+sre_literal_template(int charsize, char* ptr, Py_ssize_t len)
+{
+ /* check if given string is a literal template (i.e. no escapes) */
+ struct {
+ int charsize;
+ } state = {
+ charsize
+ };
+ while (len-- > 0) {
+ if (SRE_CHARGET((&state), ptr, 0) == '\\')
+ return 0;
+ ptr += charsize;
+ }
+ return 1;
+}
static PyObject *
sre_codesize(PyObject* self, PyObject *unused)
@@ -1641,11 +1630,7 @@ sre_getlower(PyObject* self, PyObject* args)
if (flags & SRE_FLAG_LOCALE)
return Py_BuildValue("i", sre_lower_locale(character));
if (flags & SRE_FLAG_UNICODE)
-#if defined(HAVE_UNICODE)
return Py_BuildValue("i", sre_lower_unicode(character));
-#else
- return Py_BuildValue("i", sre_lower_locale(character));
-#endif
return Py_BuildValue("i", sre_lower(character));
}
@@ -1664,7 +1649,9 @@ state_reset(SRE_STATE* state)
}
static void*
-getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *view)
+getstring(PyObject* string, Py_ssize_t* p_length,
+ int* p_logical_charsize, int* p_charsize,
+ Py_buffer *view)
{
/* given a python object, return a data pointer, a length (in
characters), and a character size. return NULL if the object
@@ -1678,13 +1665,16 @@ getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *vi
/* Unicode objects do not support the buffer API. So, get the data
directly instead. */
if (PyUnicode_Check(string)) {
- ptr = (void *)PyUnicode_AS_DATA(string);
- *p_length = PyUnicode_GET_SIZE(string);
- *p_charsize = sizeof(Py_UNICODE);
+ if (PyUnicode_READY(string) == -1)
+ return NULL;
+ ptr = PyUnicode_DATA(string);
+ *p_length = PyUnicode_GET_LENGTH(string);
+ *p_charsize = PyUnicode_KIND(string);
+ *p_logical_charsize = 4;
return ptr;
}
- /* get pointer to string buffer */
+ /* get pointer to byte string buffer */
view->len = -1;
buffer = Py_TYPE(string)->tp_as_buffer;
if (!buffer || !buffer->bf_getbuffer ||
@@ -1707,10 +1697,6 @@ getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *vi
if (PyBytes_Check(string) || bytes == size)
charsize = 1;
-#if defined(HAVE_UNICODE)
- else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE)))
- charsize = sizeof(Py_UNICODE);
-#endif
else {
PyErr_SetString(PyExc_TypeError, "buffer size mismatch");
goto err;
@@ -1718,6 +1704,7 @@ getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *vi
*p_length = size;
*p_charsize = charsize;
+ *p_logical_charsize = charsize;
if (ptr == NULL) {
PyErr_SetString(PyExc_ValueError,
@@ -1738,7 +1725,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
/* prepare state object */
Py_ssize_t length;
- int charsize;
+ int logical_charsize, charsize;
void* ptr;
memset(state, 0, sizeof(SRE_STATE));
@@ -1747,18 +1734,18 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
state->lastindex = -1;
state->buffer.buf = NULL;
- ptr = getstring(string, &length, &charsize, &state->buffer);
+ ptr = getstring(string, &length, &logical_charsize, &charsize, &state->buffer);
if (!ptr)
goto err;
- if (charsize == 1 && pattern->charsize > 1) {
+ if (logical_charsize == 1 && pattern->logical_charsize > 1) {
PyErr_SetString(PyExc_TypeError,
- "can't use a string pattern on a bytes-like object");
+ "can't use a string pattern on a bytes-like object");
goto err;
}
- if (charsize > 1 && pattern->charsize == 1) {
+ if (logical_charsize > 1 && pattern->logical_charsize == 1) {
PyErr_SetString(PyExc_TypeError,
- "can't use a bytes pattern on a string-like object");
+ "can't use a bytes pattern on a string-like object");
goto err;
}
@@ -1773,6 +1760,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
else if (end > length)
end = length;
+ state->logical_charsize = logical_charsize;
state->charsize = charsize;
state->beginning = ptr;
@@ -1788,11 +1776,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
if (pattern->flags & SRE_FLAG_LOCALE)
state->lower = sre_lower_locale;
else if (pattern->flags & SRE_FLAG_UNICODE)
-#if defined(HAVE_UNICODE)
state->lower = sre_lower_unicode;
-#else
- state->lower = sre_lower_locale;
-#endif
else
state->lower = sre_lower;
@@ -1899,12 +1883,10 @@ pattern_match(PatternObject* self, PyObject* args, PyObject* kw)
TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
- if (state.charsize == 1) {
+ if (state.logical_charsize == 1) {
status = sre_match(&state, PatternObject_GetCode(self));
} else {
-#if defined(HAVE_UNICODE)
status = sre_umatch(&state, PatternObject_GetCode(self));
-#endif
}
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
@@ -1936,12 +1918,10 @@ pattern_search(PatternObject* self, PyObject* args, PyObject* kw)
TRACE(("|%p|%p|SEARCH\n", PatternObject_GetCode(self), state.ptr));
- if (state.charsize == 1) {
+ if (state.logical_charsize == 1) {
status = sre_search(&state, PatternObject_GetCode(self));
} else {
-#if defined(HAVE_UNICODE)
status = sre_usearch(&state, PatternObject_GetCode(self));
-#endif
}
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr));
@@ -2083,16 +2063,14 @@ pattern_findall(PatternObject* self, PyObject* args, PyObject* kw)
state.ptr = state.start;
- if (state.charsize == 1) {
+ if (state.logical_charsize == 1) {
status = sre_search(&state, PatternObject_GetCode(self));
} else {
-#if defined(HAVE_UNICODE)
status = sre_usearch(&state, PatternObject_GetCode(self));
-#endif
}
- if (PyErr_Occurred())
- goto error;
+ if (PyErr_Occurred())
+ goto error;
if (status <= 0) {
if (status == 0)
@@ -2154,13 +2132,13 @@ error:
#if PY_VERSION_HEX >= 0x02020000
static PyObject*
-pattern_finditer(PatternObject* pattern, PyObject* args)
+pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kw)
{
PyObject* scanner;
PyObject* search;
PyObject* iterator;
- scanner = pattern_scanner(pattern, args);
+ scanner = pattern_scanner(pattern, args, kw);
if (!scanner)
return NULL;
@@ -2213,16 +2191,14 @@ pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
state.ptr = state.start;
- if (state.charsize == 1) {
+ if (state.logical_charsize == 1) {
status = sre_search(&state, PatternObject_GetCode(self));
} else {
-#if defined(HAVE_UNICODE)
status = sre_usearch(&state, PatternObject_GetCode(self));
-#endif
}
- if (PyErr_Occurred())
- goto error;
+ if (PyErr_Occurred())
+ goto error;
if (status <= 0) {
if (status == 0)
@@ -2303,7 +2279,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
int status;
Py_ssize_t n;
Py_ssize_t i, b, e;
- int bint;
+ int logical_charsize, charsize;
int filter_is_callable;
Py_buffer view;
@@ -2316,16 +2292,10 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
/* if not callable, check if it's a literal string */
int literal;
view.buf = NULL;
- ptr = getstring(ptemplate, &n, &bint, &view);
- b = bint;
+ ptr = getstring(ptemplate, &n, &logical_charsize, &charsize, &view);
+ b = charsize;
if (ptr) {
- if (b == 1) {
- literal = sre_literal_template((unsigned char *)ptr, n);
- } else {
-#if defined(HAVE_UNICODE)
- literal = sre_uliteral_template((Py_UNICODE *)ptr, n);
-#endif
- }
+ literal = sre_literal_template(b, ptr, n);
} else {
PyErr_Clear();
literal = 0;
@@ -2369,16 +2339,14 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
state.ptr = state.start;
- if (state.charsize == 1) {
+ if (state.logical_charsize == 1) {
status = sre_search(&state, PatternObject_GetCode(self));
} else {
-#if defined(HAVE_UNICODE)
status = sre_usearch(&state, PatternObject_GetCode(self));
-#endif
}
- if (PyErr_Occurred())
- goto error;
+ if (PyErr_Occurred())
+ goto error;
if (status <= 0) {
if (status == 0)
@@ -2596,22 +2564,22 @@ PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects");
static PyMethodDef pattern_methods[] = {
{"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS,
- pattern_match_doc},
+ pattern_match_doc},
{"search", (PyCFunction) pattern_search, METH_VARARGS|METH_KEYWORDS,
- pattern_search_doc},
+ pattern_search_doc},
{"sub", (PyCFunction) pattern_sub, METH_VARARGS|METH_KEYWORDS,
- pattern_sub_doc},
+ pattern_sub_doc},
{"subn", (PyCFunction) pattern_subn, METH_VARARGS|METH_KEYWORDS,
- pattern_subn_doc},
+ pattern_subn_doc},
{"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS,
- pattern_split_doc},
+ pattern_split_doc},
{"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS,
- pattern_findall_doc},
+ pattern_findall_doc},
#if PY_VERSION_HEX >= 0x02020000
- {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS,
- pattern_finditer_doc},
+ {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS|METH_KEYWORDS,
+ pattern_finditer_doc},
#endif
- {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS},
+ {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS|METH_KEYWORDS},
{"__copy__", (PyCFunction) pattern_copy, METH_NOARGS},
{"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_O},
{NULL, NULL}
@@ -2630,31 +2598,31 @@ static PyTypeObject Pattern_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"_" SRE_MODULE ".SRE_Pattern",
sizeof(PatternObject), sizeof(SRE_CODE),
- (destructor)pattern_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_reserved */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- pattern_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- pattern_methods, /* tp_methods */
- pattern_members, /* tp_members */
+ (destructor)pattern_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ pattern_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ pattern_methods, /* tp_methods */
+ pattern_members, /* tp_members */
};
static int _validate(PatternObject *self); /* Forward */
@@ -2708,11 +2676,14 @@ _compile(PyObject* self_, PyObject* args)
return NULL;
}
- if (pattern == Py_None)
+ if (pattern == Py_None) {
+ self->logical_charsize = -1;
self->charsize = -1;
+ }
else {
Py_ssize_t p_length;
- if (!getstring(pattern, &p_length, &self->charsize, &self->view)) {
+ if (!getstring(pattern, &p_length, &self->logical_charsize,
+ &self->charsize, &self->view)) {
Py_DECREF(self);
return NULL;
}
@@ -2977,13 +2948,13 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
<INFO> <1=skip> <2=flags> <3=min> <4=max>;
If SRE_INFO_PREFIX or SRE_INFO_CHARSET is in the flags,
more follows. */
- SRE_CODE flags, min, max, i;
+ SRE_CODE flags, i;
SRE_CODE *newcode;
GET_SKIP;
newcode = code+skip-1;
GET_ARG; flags = arg;
- GET_ARG; min = arg;
- GET_ARG; max = arg;
+ GET_ARG;
+ GET_ARG;
/* Check that only valid flags are present */
if ((flags & ~(SRE_INFO_PREFIX |
SRE_INFO_LITERAL |
@@ -2999,9 +2970,9 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
FAIL;
/* Validate the prefix */
if (flags & SRE_INFO_PREFIX) {
- SRE_CODE prefix_len, prefix_skip;
+ SRE_CODE prefix_len;
GET_ARG; prefix_len = arg;
- GET_ARG; prefix_skip = arg;
+ GET_ARG;
/* Here comes the prefix string */
if (code+prefix_len < code || code+prefix_len > newcode)
FAIL;
@@ -3065,10 +3036,8 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
GET_ARG; max = arg;
if (min > max)
FAIL;
-#ifdef Py_UNICODE_WIDE
if (max > 65535)
FAIL;
-#endif
if (!_validate_inner(code, code+skip-4, groups))
FAIL;
code += skip-4;
@@ -3086,10 +3055,8 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
GET_ARG; max = arg;
if (min > max)
FAIL;
-#ifdef Py_UNICODE_WIDE
if (max > 65535)
FAIL;
-#endif
if (!_validate_inner(code, code+skip-3, groups))
FAIL;
code += skip-3;
@@ -3252,8 +3219,8 @@ match_getindex(MatchObject* self, PyObject* index)
Py_ssize_t i;
if (index == NULL)
- /* Default value */
- return 0;
+ /* Default value */
+ return 0;
if (PyLong_Check(index))
return PyLong_AsSsize_t(index);
@@ -3593,7 +3560,7 @@ static PyObject *
match_lastindex_get(MatchObject *self)
{
if (self->lastindex >= 0)
- return Py_BuildValue("i", self->lastindex);
+ return Py_BuildValue("i", self->lastindex);
Py_INCREF(Py_None);
return Py_None;
}
@@ -3646,32 +3613,32 @@ static PyTypeObject Match_Type = {
PyVarObject_HEAD_INIT(NULL,0)
"_" SRE_MODULE ".SRE_Match",
sizeof(MatchObject), sizeof(Py_ssize_t),
- (destructor)match_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_reserved */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- match_methods, /* tp_methods */
- match_members, /* tp_members */
- match_getset, /* tp_getset */
+ (destructor)match_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ match_methods, /* tp_methods */
+ match_members, /* tp_members */
+ match_getset, /* tp_getset */
};
static PyObject*
@@ -3760,12 +3727,10 @@ scanner_match(ScannerObject* self, PyObject *unused)
state->ptr = state->start;
- if (state->charsize == 1) {
+ if (state->logical_charsize == 1) {
status = sre_match(state, PatternObject_GetCode(self->pattern));
} else {
-#if defined(HAVE_UNICODE)
status = sre_umatch(state, PatternObject_GetCode(self->pattern));
-#endif
}
if (PyErr_Occurred())
return NULL;
@@ -3793,12 +3758,10 @@ scanner_search(ScannerObject* self, PyObject *unused)
state->ptr = state->start;
- if (state->charsize == 1) {
+ if (state->logical_charsize == 1) {
status = sre_search(state, PatternObject_GetCode(self->pattern));
} else {
-#if defined(HAVE_UNICODE)
status = sre_usearch(state, PatternObject_GetCode(self->pattern));
-#endif
}
if (PyErr_Occurred())
return NULL;
@@ -3822,7 +3785,7 @@ static PyMethodDef scanner_methods[] = {
#define SCAN_OFF(x) offsetof(ScannerObject, x)
static PyMemberDef scanner_members[] = {
- {"pattern", T_OBJECT, SCAN_OFF(pattern), READONLY},
+ {"pattern", T_OBJECT, SCAN_OFF(pattern), READONLY},
{NULL} /* Sentinel */
};
@@ -3831,35 +3794,35 @@ static PyTypeObject Scanner_Type = {
"_" SRE_MODULE ".SRE_Scanner",
sizeof(ScannerObject), 0,
(destructor)scanner_dealloc,/* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_reserved */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- scanner_methods, /* tp_methods */
- scanner_members, /* tp_members */
- 0, /* tp_getset */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ scanner_methods, /* tp_methods */
+ scanner_members, /* tp_members */
+ 0, /* tp_getset */
};
static PyObject*
-pattern_scanner(PatternObject* pattern, PyObject* args)
+pattern_scanner(PatternObject* pattern, PyObject* args, PyObject* kw)
{
/* create search state object */
@@ -3868,7 +3831,9 @@ pattern_scanner(PatternObject* pattern, PyObject* args)
PyObject* string;
Py_ssize_t start = 0;
Py_ssize_t end = PY_SSIZE_T_MAX;
- if (!PyArg_ParseTuple(args, "O|nn:scanner", &string, &start, &end))
+ static char* kwlist[] = { "source", "pos", "endpos", NULL };
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:scanner", kwlist,
+ &string, &start, &end))
return NULL;
/* create scanner object */
@@ -3897,15 +3862,15 @@ static PyMethodDef _functions[] = {
};
static struct PyModuleDef sremodule = {
- PyModuleDef_HEAD_INIT,
- "_" SRE_MODULE,
- NULL,
- -1,
- _functions,
- NULL,
- NULL,
- NULL,
- NULL
+ PyModuleDef_HEAD_INIT,
+ "_" SRE_MODULE,
+ NULL,
+ -1,
+ _functions,
+ NULL,
+ NULL,
+ NULL,
+ NULL
};
PyMODINIT_FUNC PyInit__sre(void)
@@ -3921,7 +3886,7 @@ PyMODINIT_FUNC PyInit__sre(void)
m = PyModule_Create(&sremodule);
if (m == NULL)
- return NULL;
+ return NULL;
d = PyModule_GetDict(m);
x = PyLong_FromLong(SRE_MAGIC);
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index e9de8ca..ad22c52 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -18,16 +18,21 @@
#ifdef WITH_THREAD
#include "pythread.h"
+#define PySSL_BEGIN_ALLOW_THREADS_S(save) \
+ do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
+#define PySSL_END_ALLOW_THREADS_S(save) \
+ do { if (_ssl_locks_count>0) { PyEval_RestoreThread(save); } } while (0)
#define PySSL_BEGIN_ALLOW_THREADS { \
PyThreadState *_save = NULL; \
- if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
-#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
-#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
-#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
- }
+ PySSL_BEGIN_ALLOW_THREADS_S(_save);
+#define PySSL_BLOCK_THREADS PySSL_END_ALLOW_THREADS_S(_save);
+#define PySSL_UNBLOCK_THREADS PySSL_BEGIN_ALLOW_THREADS_S(_save);
+#define PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS_S(_save); }
#else /* no WITH_THREAD */
+#define PySSL_BEGIN_ALLOW_THREADS_S(save)
+#define PySSL_END_ALLOW_THREADS_S(save)
#define PySSL_BEGIN_ALLOW_THREADS
#define PySSL_BLOCK_THREADS
#define PySSL_UNBLOCK_THREADS
@@ -71,6 +76,16 @@ enum py_ssl_version {
PY_SSL_VERSION_TLS1
};
+struct py_ssl_error_code {
+ const char *mnemonic;
+ int library, reason;
+};
+
+struct py_ssl_library_code {
+ const char *library;
+ int code;
+};
+
/* Include symbols from _socket module */
#include "socketmodule.h"
@@ -92,8 +107,21 @@ static PySocketModule_APIObject PySocketModule;
#include "openssl/err.h"
#include "openssl/rand.h"
+/* Include generated data (error codes) */
+#include "_ssl_data.h"
+
/* SSL error object */
static PyObject *PySSLErrorObject;
+static PyObject *PySSLZeroReturnErrorObject;
+static PyObject *PySSLWantReadErrorObject;
+static PyObject *PySSLWantWriteErrorObject;
+static PyObject *PySSLSyscallErrorObject;
+static PyObject *PySSLEOFErrorObject;
+
+/* Error mappings */
+static PyObject *err_codes_to_names;
+static PyObject *err_names_to_codes;
+static PyObject *lib_codes_to_names;
#ifdef WITH_THREAD
@@ -124,9 +152,35 @@ static unsigned int _ssl_locks_count = 0;
# undef HAVE_SSL_CTX_CLEAR_OPTIONS
#endif
+/* In case of 'tls-unique' it will be 12 bytes for TLS, 36 bytes for
+ * older SSL, but let's be safe */
+#define PySSL_CB_MAXLEN 128
+
+/* SSL_get_finished got added to OpenSSL in 0.9.5 */
+#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
+# define HAVE_OPENSSL_FINISHED 1
+#else
+# define HAVE_OPENSSL_FINISHED 0
+#endif
+
+/* ECDH support got added to OpenSSL in 0.9.8 */
+#if OPENSSL_VERSION_NUMBER < 0x0090800fL && !defined(OPENSSL_NO_ECDH)
+# define OPENSSL_NO_ECDH
+#endif
+
+/* compression support got added to OpenSSL in 0.9.8 */
+#if OPENSSL_VERSION_NUMBER < 0x0090800fL && !defined(OPENSSL_NO_COMP)
+# define OPENSSL_NO_COMP
+#endif
+
+
typedef struct {
PyObject_HEAD
SSL_CTX *ctx;
+#ifdef OPENSSL_NPN_NEGOTIATED
+ char *npn_protocols;
+ int npn_protocols_len;
+#endif
} PySSLContext;
typedef struct {
@@ -135,6 +189,7 @@ typedef struct {
SSL *ssl;
X509 *peer_cert;
int shutdown_seen_zero;
+ enum py_ssl_server_or_client socket_type;
} PySSLSocket;
static PyTypeObject PySSLContext_Type;
@@ -165,36 +220,152 @@ typedef enum {
#define ERRSTR1(x,y,z) (x ":" y ": " z)
#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
-/* XXX It might be helpful to augment the error message generated
- below with the name of the SSL function that generated the error.
- I expect it's obvious most of the time.
-*/
+
+/*
+ * SSL errors.
+ */
+
+PyDoc_STRVAR(SSLError_doc,
+"An error occurred in the SSL implementation.");
+
+PyDoc_STRVAR(SSLZeroReturnError_doc,
+"SSL/TLS session closed cleanly.");
+
+PyDoc_STRVAR(SSLWantReadError_doc,
+"Non-blocking SSL socket needs to read more data\n"
+"before the requested operation can be completed.");
+
+PyDoc_STRVAR(SSLWantWriteError_doc,
+"Non-blocking SSL socket needs to write more data\n"
+"before the requested operation can be completed.");
+
+PyDoc_STRVAR(SSLSyscallError_doc,
+"System error when attempting SSL operation.");
+
+PyDoc_STRVAR(SSLEOFError_doc,
+"SSL/TLS connection terminated abruptly.");
+
+static PyObject *
+SSLError_str(PyOSErrorObject *self)
+{
+ if (self->strerror != NULL && PyUnicode_Check(self->strerror)) {
+ Py_INCREF(self->strerror);
+ return self->strerror;
+ }
+ else
+ return PyObject_Str(self->args);
+}
+
+static PyType_Slot sslerror_type_slots[] = {
+ {Py_tp_base, NULL}, /* Filled out in module init as it's not a constant */
+ {Py_tp_doc, SSLError_doc},
+ {Py_tp_str, SSLError_str},
+ {0, 0},
+};
+
+static PyType_Spec sslerror_type_spec = {
+ "ssl.SSLError",
+ sizeof(PyOSErrorObject),
+ 0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ sslerror_type_slots
+};
+
+static void
+fill_and_set_sslerror(PyObject *type, int ssl_errno, const char *errstr,
+ int lineno, unsigned long errcode)
+{
+ PyObject *err_value = NULL, *reason_obj = NULL, *lib_obj = NULL;
+ PyObject *init_value, *msg, *key;
+ _Py_IDENTIFIER(reason);
+ _Py_IDENTIFIER(library);
+
+ if (errcode != 0) {
+ int lib, reason;
+
+ lib = ERR_GET_LIB(errcode);
+ reason = ERR_GET_REASON(errcode);
+ key = Py_BuildValue("ii", lib, reason);
+ if (key == NULL)
+ goto fail;
+ reason_obj = PyDict_GetItem(err_codes_to_names, key);
+ Py_DECREF(key);
+ if (reason_obj == NULL) {
+ /* XXX if reason < 100, it might reflect a library number (!!) */
+ PyErr_Clear();
+ }
+ key = PyLong_FromLong(lib);
+ if (key == NULL)
+ goto fail;
+ lib_obj = PyDict_GetItem(lib_codes_to_names, key);
+ Py_DECREF(key);
+ if (lib_obj == NULL) {
+ PyErr_Clear();
+ }
+ if (errstr == NULL)
+ errstr = ERR_reason_error_string(errcode);
+ }
+ if (errstr == NULL)
+ errstr = "unknown error";
+
+ if (reason_obj && lib_obj)
+ msg = PyUnicode_FromFormat("[%S: %S] %s (_ssl.c:%d)",
+ lib_obj, reason_obj, errstr, lineno);
+ else if (lib_obj)
+ msg = PyUnicode_FromFormat("[%S] %s (_ssl.c:%d)",
+ lib_obj, errstr, lineno);
+ else
+ msg = PyUnicode_FromFormat("%s (_ssl.c:%d)", errstr, lineno);
+
+ if (msg == NULL)
+ goto fail;
+ init_value = Py_BuildValue("iN", ssl_errno, msg);
+ err_value = PyObject_CallObject(type, init_value);
+ Py_DECREF(init_value);
+ if (err_value == NULL)
+ goto fail;
+ if (reason_obj == NULL)
+ reason_obj = Py_None;
+ if (_PyObject_SetAttrId(err_value, &PyId_reason, reason_obj))
+ goto fail;
+ if (lib_obj == NULL)
+ lib_obj = Py_None;
+ if (_PyObject_SetAttrId(err_value, &PyId_library, lib_obj))
+ goto fail;
+ PyErr_SetObject(type, err_value);
+fail:
+ Py_XDECREF(err_value);
+}
static PyObject *
PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
{
- PyObject *v;
- char buf[2048];
- char *errstr;
+ PyObject *type = PySSLErrorObject;
+ char *errstr = NULL;
int err;
enum py_ssl_error p = PY_SSL_ERROR_NONE;
+ unsigned long e = 0;
assert(ret <= 0);
+ e = ERR_peek_last_error();
if (obj->ssl != NULL) {
err = SSL_get_error(obj->ssl, ret);
switch (err) {
case SSL_ERROR_ZERO_RETURN:
- errstr = "TLS/SSL connection has been closed";
+ errstr = "TLS/SSL connection has been closed (EOF)";
+ type = PySSLZeroReturnErrorObject;
p = PY_SSL_ERROR_ZERO_RETURN;
break;
case SSL_ERROR_WANT_READ:
errstr = "The operation did not complete (read)";
+ type = PySSLWantReadErrorObject;
p = PY_SSL_ERROR_WANT_READ;
break;
case SSL_ERROR_WANT_WRITE:
p = PY_SSL_ERROR_WANT_WRITE;
+ type = PySSLWantWriteErrorObject;
errstr = "The operation did not complete (write)";
break;
case SSL_ERROR_WANT_X509_LOOKUP:
@@ -207,80 +378,64 @@ PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
break;
case SSL_ERROR_SYSCALL:
{
- unsigned long e = ERR_get_error();
if (e == 0) {
PySocketSockObject *s
= (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
if (ret == 0 || (((PyObject *)s) == Py_None)) {
p = PY_SSL_ERROR_EOF;
+ type = PySSLEOFErrorObject;
errstr = "EOF occurred in violation of protocol";
} else if (ret == -1) {
/* underlying BIO reported an I/O error */
Py_INCREF(s);
ERR_clear_error();
- v = s->errorhandler();
+ s->errorhandler();
Py_DECREF(s);
- return v;
+ return NULL;
} else { /* possible? */
p = PY_SSL_ERROR_SYSCALL;
+ type = PySSLSyscallErrorObject;
errstr = "Some I/O error occurred";
}
} else {
p = PY_SSL_ERROR_SYSCALL;
- /* XXX Protected by global interpreter lock */
- errstr = ERR_error_string(e, NULL);
}
break;
}
case SSL_ERROR_SSL:
{
- unsigned long e = ERR_get_error();
p = PY_SSL_ERROR_SSL;
- if (e != 0)
- /* XXX Protected by global interpreter lock */
- errstr = ERR_error_string(e, NULL);
- else { /* possible? */
+ if (e == 0)
+ /* possible? */
errstr = "A failure in the SSL library occurred";
- }
break;
}
default:
p = PY_SSL_ERROR_INVALID_ERROR_CODE;
errstr = "Invalid error code";
}
- } else {
- errstr = ERR_error_string(ERR_peek_last_error(), NULL);
}
- PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
+ fill_and_set_sslerror(type, p, errstr, lineno, e);
ERR_clear_error();
- v = Py_BuildValue("(is)", p, buf);
- if (v != NULL) {
- PyErr_SetObject(PySSLErrorObject, v);
- Py_DECREF(v);
- }
return NULL;
}
static PyObject *
_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
- char buf[2048];
- PyObject *v;
-
- if (errstr == NULL) {
+ if (errstr == NULL)
errcode = ERR_peek_last_error();
- errstr = ERR_error_string(errcode, NULL);
- }
- PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
+ else
+ errcode = 0;
+ fill_and_set_sslerror(PySSLErrorObject, errcode, errstr, lineno, errcode);
ERR_clear_error();
- v = Py_BuildValue("(is)", errcode, buf);
- if (v != NULL) {
- PyErr_SetObject(PySSLErrorObject, v);
- Py_DECREF(v);
- }
return NULL;
}
+/*
+ * SSL objects
+ */
+
static PySSLSocket *
newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
enum py_ssl_server_or_client socket_type,
@@ -328,6 +483,7 @@ newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
SSL_set_accept_state(self->ssl);
PySSL_END_ALLOW_THREADS
+ self->socket_type = socket_type;
self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
return self;
}
@@ -356,7 +512,6 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
/* Actually negotiate SSL connection */
/* XXX If SSL_do_handshake() returns 0, it's also a failure. */
- sockstate = 0;
do {
PySSL_BEGIN_ALLOW_THREADS
ret = SSL_do_handshake(self->ssl);
@@ -882,19 +1037,15 @@ PySSL_peercert(PySSLSocket *self, PyObject *args)
PyObject *retval = NULL;
int len;
int verification;
- PyObject *binary_mode = Py_None;
- int b;
+ int binary_mode = 0;
- if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
+ if (!PyArg_ParseTuple(args, "|p:peer_certificate", &binary_mode))
return NULL;
if (!self->peer_cert)
Py_RETURN_NONE;
- b = PyObject_IsTrue(binary_mode);
- if (b < 0)
- return NULL;
- if (b) {
+ if (binary_mode) {
/* return cert in DER-encoded format */
unsigned char *bytes_buf = NULL;
@@ -980,6 +1131,39 @@ static PyObject *PySSL_cipher (PySSLSocket *self) {
return NULL;
}
+#ifdef OPENSSL_NPN_NEGOTIATED
+static PyObject *PySSL_selected_npn_protocol(PySSLSocket *self) {
+ const unsigned char *out;
+ unsigned int outlen;
+
+ SSL_get0_next_proto_negotiated(self->ssl,
+ &out, &outlen);
+
+ if (out == NULL)
+ Py_RETURN_NONE;
+ return PyUnicode_FromStringAndSize((char *) out, outlen);
+}
+#endif
+
+static PyObject *PySSL_compression(PySSLSocket *self) {
+#ifdef OPENSSL_NO_COMP
+ Py_RETURN_NONE;
+#else
+ const COMP_METHOD *comp_method;
+ const char *short_name;
+
+ if (self->ssl == NULL)
+ Py_RETURN_NONE;
+ comp_method = SSL_get_current_compression(self->ssl);
+ if (comp_method == NULL || comp_method->type == NID_undef)
+ Py_RETURN_NONE;
+ short_name = OBJ_nid2sn(comp_method->type);
+ if (short_name == NULL)
+ Py_RETURN_NONE;
+ return PyUnicode_DecodeFSDefault(short_name);
+#endif
+}
+
static void PySSL_dealloc(PySSLSocket *self)
{
if (self->peer_cert) /* Possible not to have one? */
@@ -1100,7 +1284,6 @@ static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args)
goto error;
}
do {
- err = 0;
PySSL_BEGIN_ALLOW_THREADS
len = SSL_write(self->ssl, buf.buf, buf.len);
err = SSL_get_error(self->ssl, len);
@@ -1236,7 +1419,6 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args)
}
}
do {
- err = 0;
PySSL_BEGIN_ALLOW_THREADS
count = SSL_read(self->ssl, mem, len);
err = SSL_get_error(self->ssl, count);
@@ -1388,6 +1570,41 @@ PyDoc_STRVAR(PySSL_SSLshutdown_doc,
Does the SSL shutdown handshake with the remote end, and returns\n\
the underlying socket object.");
+#if HAVE_OPENSSL_FINISHED
+static PyObject *
+PySSL_tls_unique_cb(PySSLSocket *self)
+{
+ PyObject *retval = NULL;
+ char buf[PySSL_CB_MAXLEN];
+ int len;
+
+ if (SSL_session_reused(self->ssl) ^ !self->socket_type) {
+ /* if session is resumed XOR we are the client */
+ len = SSL_get_finished(self->ssl, buf, PySSL_CB_MAXLEN);
+ }
+ else {
+ /* if a new session XOR we are the server */
+ len = SSL_get_peer_finished(self->ssl, buf, PySSL_CB_MAXLEN);
+ }
+
+ /* It cannot be negative in current OpenSSL version as of July 2011 */
+ assert(len >= 0);
+ if (len == 0)
+ Py_RETURN_NONE;
+
+ retval = PyBytes_FromStringAndSize(buf, len);
+
+ return retval;
+}
+
+PyDoc_STRVAR(PySSL_tls_unique_cb_doc,
+"tls_unique_cb() -> bytes\n\
+\n\
+Returns the 'tls-unique' channel binding data, as defined by RFC 5929.\n\
+\n\
+If the TLS handshake is not yet complete, None is returned");
+
+#endif /* HAVE_OPENSSL_FINISHED */
static PyMethodDef PySSLMethods[] = {
{"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
@@ -1400,8 +1617,16 @@ static PyMethodDef PySSLMethods[] = {
{"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
PySSL_peercert_doc},
{"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
+#ifdef OPENSSL_NPN_NEGOTIATED
+ {"selected_npn_protocol", (PyCFunction)PySSL_selected_npn_protocol, METH_NOARGS},
+#endif
+ {"compression", (PyCFunction)PySSL_compression, METH_NOARGS},
{"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
PySSL_SSLshutdown_doc},
+#if HAVE_OPENSSL_FINISHED
+ {"tls_unique_cb", (PyCFunction)PySSL_tls_unique_cb, METH_NOARGS,
+ PySSL_tls_unique_cb_doc},
+#endif
{NULL, NULL}
};
@@ -1488,6 +1713,9 @@ context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
self->ctx = ctx;
+#ifdef OPENSSL_NPN_NEGOTIATED
+ self->npn_protocols = NULL;
+#endif
/* Defaults */
SSL_CTX_set_verify(self->ctx, SSL_VERIFY_NONE, NULL);
SSL_CTX_set_options(self->ctx,
@@ -1505,6 +1733,9 @@ static void
context_dealloc(PySSLContext *self)
{
SSL_CTX_free(self->ctx);
+#ifdef OPENSSL_NPN_NEGOTIATED
+ PyMem_Free(self->npn_protocols);
+#endif
Py_TYPE(self)->tp_free(self);
}
@@ -1529,6 +1760,91 @@ set_ciphers(PySSLContext *self, PyObject *args)
Py_RETURN_NONE;
}
+#ifdef OPENSSL_NPN_NEGOTIATED
+/* this callback gets passed to SSL_CTX_set_next_protos_advertise_cb */
+static int
+_advertiseNPN_cb(SSL *s,
+ const unsigned char **data, unsigned int *len,
+ void *args)
+{
+ PySSLContext *ssl_ctx = (PySSLContext *) args;
+
+ if (ssl_ctx->npn_protocols == NULL) {
+ *data = (unsigned char *) "";
+ *len = 0;
+ } else {
+ *data = (unsigned char *) ssl_ctx->npn_protocols;
+ *len = ssl_ctx->npn_protocols_len;
+ }
+
+ return SSL_TLSEXT_ERR_OK;
+}
+/* this callback gets passed to SSL_CTX_set_next_proto_select_cb */
+static int
+_selectNPN_cb(SSL *s,
+ unsigned char **out, unsigned char *outlen,
+ const unsigned char *server, unsigned int server_len,
+ void *args)
+{
+ PySSLContext *ssl_ctx = (PySSLContext *) args;
+
+ unsigned char *client = (unsigned char *) ssl_ctx->npn_protocols;
+ int client_len;
+
+ if (client == NULL) {
+ client = (unsigned char *) "";
+ client_len = 0;
+ } else {
+ client_len = ssl_ctx->npn_protocols_len;
+ }
+
+ SSL_select_next_proto(out, outlen,
+ server, server_len,
+ client, client_len);
+
+ return SSL_TLSEXT_ERR_OK;
+}
+#endif
+
+static PyObject *
+_set_npn_protocols(PySSLContext *self, PyObject *args)
+{
+#ifdef OPENSSL_NPN_NEGOTIATED
+ Py_buffer protos;
+
+ if (!PyArg_ParseTuple(args, "y*:set_npn_protocols", &protos))
+ return NULL;
+
+ if (self->npn_protocols != NULL) {
+ PyMem_Free(self->npn_protocols);
+ }
+
+ self->npn_protocols = PyMem_Malloc(protos.len);
+ if (self->npn_protocols == NULL) {
+ PyBuffer_Release(&protos);
+ return PyErr_NoMemory();
+ }
+ memcpy(self->npn_protocols, protos.buf, protos.len);
+ self->npn_protocols_len = (int) protos.len;
+
+ /* set both server and client callbacks, because the context can
+ * be used to create both types of sockets */
+ SSL_CTX_set_next_protos_advertised_cb(self->ctx,
+ _advertiseNPN_cb,
+ self);
+ SSL_CTX_set_next_proto_select_cb(self->ctx,
+ _selectNPN_cb,
+ self);
+
+ PyBuffer_Release(&protos);
+ Py_RETURN_NONE;
+#else
+ PyErr_SetString(PyExc_NotImplementedError,
+ "The NPN extension requires OpenSSL 1.0.1 or later.");
+ return NULL;
+#endif
+}
+
static PyObject *
get_verify_mode(PySSLContext *self, void *c)
{
@@ -1595,19 +1911,118 @@ set_options(PySSLContext *self, PyObject *arg, void *c)
return 0;
}
+typedef struct {
+ PyThreadState *thread_state;
+ PyObject *callable;
+ char *password;
+ Py_ssize_t size;
+ int error;
+} _PySSLPasswordInfo;
+
+static int
+_pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
+ const char *bad_type_error)
+{
+ /* Set the password and size fields of a _PySSLPasswordInfo struct
+ from a unicode, bytes, or byte array object.
+ The password field will be dynamically allocated and must be freed
+ by the caller */
+ PyObject *password_bytes = NULL;
+ const char *data = NULL;
+ Py_ssize_t size;
+
+ if (PyUnicode_Check(password)) {
+ password_bytes = PyUnicode_AsEncodedString(password, NULL, NULL);
+ if (!password_bytes) {
+ goto error;
+ }
+ data = PyBytes_AS_STRING(password_bytes);
+ size = PyBytes_GET_SIZE(password_bytes);
+ } else if (PyBytes_Check(password)) {
+ data = PyBytes_AS_STRING(password);
+ size = PyBytes_GET_SIZE(password);
+ } else if (PyByteArray_Check(password)) {
+ data = PyByteArray_AS_STRING(password);
+ size = PyByteArray_GET_SIZE(password);
+ } else {
+ PyErr_SetString(PyExc_TypeError, bad_type_error);
+ goto error;
+ }
+
+ free(pw_info->password);
+ pw_info->password = malloc(size);
+ if (!pw_info->password) {
+ PyErr_SetString(PyExc_MemoryError,
+ "unable to allocate password buffer");
+ goto error;
+ }
+ memcpy(pw_info->password, data, size);
+ pw_info->size = size;
+
+ Py_XDECREF(password_bytes);
+ return 1;
+
+error:
+ Py_XDECREF(password_bytes);
+ return 0;
+}
+
+static int
+_password_callback(char *buf, int size, int rwflag, void *userdata)
+{
+ _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata;
+ PyObject *fn_ret = NULL;
+
+ PySSL_END_ALLOW_THREADS_S(pw_info->thread_state);
+
+ if (pw_info->callable) {
+ fn_ret = PyObject_CallFunctionObjArgs(pw_info->callable, NULL);
+ if (!fn_ret) {
+ /* TODO: It would be nice to move _ctypes_add_traceback() into the
+ core python API, so we could use it to add a frame here */
+ goto error;
+ }
+
+ if (!_pwinfo_set(pw_info, fn_ret,
+ "password callback must return a string")) {
+ goto error;
+ }
+ Py_CLEAR(fn_ret);
+ }
+
+ if (pw_info->size > size) {
+ PyErr_Format(PyExc_ValueError,
+ "password cannot be longer than %d bytes", size);
+ goto error;
+ }
+
+ PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
+ memcpy(buf, pw_info->password, pw_info->size);
+ return pw_info->size;
+
+error:
+ Py_XDECREF(fn_ret);
+ PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
+ pw_info->error = 1;
+ return -1;
+}
+
static PyObject *
load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
{
- char *kwlist[] = {"certfile", "keyfile", NULL};
- PyObject *certfile, *keyfile = NULL;
+ char *kwlist[] = {"certfile", "keyfile", "password", NULL};
+ PyObject *certfile, *keyfile = NULL, *password = NULL;
PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
+ pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
+ void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
+ _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
int r;
errno = 0;
ERR_clear_error();
if (!PyArg_ParseTupleAndKeywords(args, kwds,
- "O|O:load_cert_chain", kwlist,
- &certfile, &keyfile))
+ "O|OO:load_cert_chain", kwlist,
+ &certfile, &keyfile, &password))
return NULL;
if (keyfile == Py_None)
keyfile = NULL;
@@ -1621,12 +2036,26 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
"keyfile should be a valid filesystem path");
goto error;
}
- PySSL_BEGIN_ALLOW_THREADS
+ if (password && password != Py_None) {
+ if (PyCallable_Check(password)) {
+ pw_info.callable = password;
+ } else if (!_pwinfo_set(&pw_info, password,
+ "password should be a string or callable")) {
+ goto error;
+ }
+ SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback);
+ SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info);
+ }
+ PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
r = SSL_CTX_use_certificate_chain_file(self->ctx,
PyBytes_AS_STRING(certfile_bytes));
- PySSL_END_ALLOW_THREADS
+ PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
if (r != 1) {
- if (errno != 0) {
+ if (pw_info.error) {
+ ERR_clear_error();
+ /* the password callback has already set the error information */
+ }
+ else if (errno != 0) {
ERR_clear_error();
PyErr_SetFromErrno(PyExc_IOError);
}
@@ -1635,33 +2064,43 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
}
goto error;
}
- PySSL_BEGIN_ALLOW_THREADS
+ PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
r = SSL_CTX_use_PrivateKey_file(self->ctx,
PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
SSL_FILETYPE_PEM);
- PySSL_END_ALLOW_THREADS
- Py_XDECREF(keyfile_bytes);
- Py_XDECREF(certfile_bytes);
+ PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
+ Py_CLEAR(keyfile_bytes);
+ Py_CLEAR(certfile_bytes);
if (r != 1) {
- if (errno != 0) {
+ if (pw_info.error) {
+ ERR_clear_error();
+ /* the password callback has already set the error information */
+ }
+ else if (errno != 0) {
ERR_clear_error();
PyErr_SetFromErrno(PyExc_IOError);
}
else {
_setSSLError(NULL, 0, __FILE__, __LINE__);
}
- return NULL;
+ goto error;
}
- PySSL_BEGIN_ALLOW_THREADS
+ PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
r = SSL_CTX_check_private_key(self->ctx);
- PySSL_END_ALLOW_THREADS
+ PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
if (r != 1) {
_setSSLError(NULL, 0, __FILE__, __LINE__);
- return NULL;
+ goto error;
}
+ SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
+ SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
+ free(pw_info.password);
Py_RETURN_NONE;
error:
+ SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
+ SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
+ free(pw_info.password);
Py_XDECREF(keyfile_bytes);
Py_XDECREF(certfile_bytes);
return NULL;
@@ -1724,6 +2163,38 @@ load_verify_locations(PySSLContext *self, PyObject *args, PyObject *kwds)
}
static PyObject *
+load_dh_params(PySSLContext *self, PyObject *filepath)
+{
+ FILE *f;
+ DH *dh;
+
+ f = _Py_fopen(filepath, "rb");
+ if (f == NULL) {
+ if (!PyErr_Occurred())
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
+ return NULL;
+ }
+ errno = 0;
+ PySSL_BEGIN_ALLOW_THREADS
+ dh = PEM_read_DHparams(f, NULL, NULL, NULL);
+ PySSL_END_ALLOW_THREADS
+ if (dh == NULL) {
+ if (errno != 0) {
+ ERR_clear_error();
+ PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
+ }
+ else {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ }
+ return NULL;
+ }
+ if (SSL_CTX_set_tmp_dh(self->ctx, dh) == 0)
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ DH_free(dh);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds)
{
char *kwlist[] = {"sock", "server_side", "server_hostname", NULL};
@@ -1808,6 +2279,35 @@ set_default_verify_paths(PySSLContext *self, PyObject *unused)
Py_RETURN_NONE;
}
+#ifndef OPENSSL_NO_ECDH
+static PyObject *
+set_ecdh_curve(PySSLContext *self, PyObject *name)
+{
+ PyObject *name_bytes;
+ int nid;
+ EC_KEY *key;
+
+ if (!PyUnicode_FSConverter(name, &name_bytes))
+ return NULL;
+ assert(PyBytes_Check(name_bytes));
+ nid = OBJ_sn2nid(PyBytes_AS_STRING(name_bytes));
+ Py_DECREF(name_bytes);
+ if (nid == 0) {
+ PyErr_Format(PyExc_ValueError,
+ "unknown elliptic curve name %R", name);
+ return NULL;
+ }
+ key = EC_KEY_new_by_curve_name(nid);
+ if (key == NULL) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return NULL;
+ }
+ SSL_CTX_set_tmp_ecdh(self->ctx, key);
+ EC_KEY_free(key);
+ Py_RETURN_NONE;
+}
+#endif
+
static PyGetSetDef context_getsetlist[] = {
{"options", (getter) get_options,
(setter) set_options, NULL},
@@ -1821,14 +2321,22 @@ static struct PyMethodDef context_methods[] = {
METH_VARARGS | METH_KEYWORDS, NULL},
{"set_ciphers", (PyCFunction) set_ciphers,
METH_VARARGS, NULL},
+ {"_set_npn_protocols", (PyCFunction) _set_npn_protocols,
+ METH_VARARGS, NULL},
{"load_cert_chain", (PyCFunction) load_cert_chain,
METH_VARARGS | METH_KEYWORDS, NULL},
+ {"load_dh_params", (PyCFunction) load_dh_params,
+ METH_O, NULL},
{"load_verify_locations", (PyCFunction) load_verify_locations,
METH_VARARGS | METH_KEYWORDS, NULL},
{"session_stats", (PyCFunction) session_stats,
METH_NOARGS, NULL},
{"set_default_verify_paths", (PyCFunction) set_default_verify_paths,
METH_NOARGS, NULL},
+#ifndef OPENSSL_NO_ECDH
+ {"set_ecdh_curve", (PyCFunction) set_ecdh_curve,
+ METH_O, NULL},
+#endif
{NULL, NULL} /* sentinel */
};
@@ -1899,6 +2407,69 @@ Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
bound on the entropy contained in string. See RFC 1750.");
static PyObject *
+PySSL_RAND(int len, int pseudo)
+{
+ int ok;
+ PyObject *bytes;
+ unsigned long err;
+ const char *errstr;
+ PyObject *v;
+
+ bytes = PyBytes_FromStringAndSize(NULL, len);
+ if (bytes == NULL)
+ return NULL;
+ if (pseudo) {
+ ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
+ if (ok == 0 || ok == 1)
+ return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
+ }
+ else {
+ ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
+ if (ok == 1)
+ return bytes;
+ }
+ Py_DECREF(bytes);
+
+ err = ERR_get_error();
+ errstr = ERR_reason_error_string(err);
+ v = Py_BuildValue("(ks)", err, errstr);
+ if (v != NULL) {
+ PyErr_SetObject(PySSLErrorObject, v);
+ Py_DECREF(v);
+ }
+ return NULL;
+}
+
+static PyObject *
+PySSL_RAND_bytes(PyObject *self, PyObject *args)
+{
+ int len;
+ if (!PyArg_ParseTuple(args, "i:RAND_bytes", &len))
+ return NULL;
+ return PySSL_RAND(len, 0);
+}
+
+PyDoc_STRVAR(PySSL_RAND_bytes_doc,
+"RAND_bytes(n) -> bytes\n\
+\n\
+Generate n cryptographically strong pseudo-random bytes.");
+
+static PyObject *
+PySSL_RAND_pseudo_bytes(PyObject *self, PyObject *args)
+{
+ int len;
+ if (!PyArg_ParseTuple(args, "i:RAND_pseudo_bytes", &len))
+ return NULL;
+ return PySSL_RAND(len, 1);
+}
+
+PyDoc_STRVAR(PySSL_RAND_pseudo_bytes_doc,
+"RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)\n\
+\n\
+Generate n pseudo-random bytes. is_cryptographic is True if the bytes\
+generated are cryptographically strong.");
+
+static PyObject *
PySSL_RAND_status(PyObject *self)
{
return PyLong_FromLong(RAND_status());
@@ -1951,6 +2522,10 @@ static PyMethodDef PySSL_methods[] = {
#ifdef HAVE_OPENSSL_RAND
{"RAND_add", PySSL_RAND_add, METH_VARARGS,
PySSL_RAND_add_doc},
+ {"RAND_bytes", PySSL_RAND_bytes, METH_VARARGS,
+ PySSL_RAND_bytes_doc},
+ {"RAND_pseudo_bytes", PySSL_RAND_pseudo_bytes, METH_VARARGS,
+ PySSL_RAND_pseudo_bytes_doc},
{"RAND_egd", PySSL_RAND_egd, METH_VARARGS,
PySSL_RAND_egd_doc},
{"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
@@ -2071,6 +2646,8 @@ PyInit__ssl(void)
unsigned long libver;
unsigned int major, minor, fix, patch, status;
PySocketModule_APIObject *socket_api;
+ struct py_ssl_error_code *errcode;
+ struct py_ssl_library_code *libcode;
if (PyType_Ready(&PySSLContext_Type) < 0)
return NULL;
@@ -2100,12 +2677,38 @@ PyInit__ssl(void)
OpenSSL_add_all_algorithms();
/* Add symbols to module dict */
- PySSLErrorObject = PyErr_NewException("ssl.SSLError",
- PySocketModule.error,
- NULL);
+ sslerror_type_slots[0].pfunc = PyExc_OSError;
+ PySSLErrorObject = PyType_FromSpec(&sslerror_type_spec);
if (PySSLErrorObject == NULL)
return NULL;
- if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
+
+ PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc(
+ "ssl.SSLZeroReturnError", SSLZeroReturnError_doc,
+ PySSLErrorObject, NULL);
+ PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc(
+ "ssl.SSLWantReadError", SSLWantReadError_doc,
+ PySSLErrorObject, NULL);
+ PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc(
+ "ssl.SSLWantWriteError", SSLWantWriteError_doc,
+ PySSLErrorObject, NULL);
+ PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc(
+ "ssl.SSLSyscallError", SSLSyscallError_doc,
+ PySSLErrorObject, NULL);
+ PySSLEOFErrorObject = PyErr_NewExceptionWithDoc(
+ "ssl.SSLEOFError", SSLEOFError_doc,
+ PySSLErrorObject, NULL);
+ if (PySSLZeroReturnErrorObject == NULL
+ || PySSLWantReadErrorObject == NULL
+ || PySSLWantWriteErrorObject == NULL
+ || PySSLSyscallErrorObject == NULL
+ || PySSLEOFErrorObject == NULL)
+ return NULL;
+ if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0
+ || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0
+ || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0
+ || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0
+ || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0
+ || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0)
return NULL;
if (PyDict_SetItemString(d, "_SSLContext",
(PyObject *)&PySSLContext_Type) != 0)
@@ -2158,6 +2761,16 @@ PyInit__ssl(void)
PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
+ PyModule_AddIntConstant(m, "OP_CIPHER_SERVER_PREFERENCE",
+ SSL_OP_CIPHER_SERVER_PREFERENCE);
+ PyModule_AddIntConstant(m, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
+#ifdef SSL_OP_SINGLE_ECDH_USE
+ PyModule_AddIntConstant(m, "OP_SINGLE_ECDH_USE", SSL_OP_SINGLE_ECDH_USE);
+#endif
+#ifdef SSL_OP_NO_COMPRESSION
+ PyModule_AddIntConstant(m, "OP_NO_COMPRESSION",
+ SSL_OP_NO_COMPRESSION);
+#endif
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
r = Py_True;
@@ -2167,6 +2780,74 @@ PyInit__ssl(void)
Py_INCREF(r);
PyModule_AddObject(m, "HAS_SNI", r);
+#if HAVE_OPENSSL_FINISHED
+ r = Py_True;
+#else
+ r = Py_False;
+#endif
+ Py_INCREF(r);
+ PyModule_AddObject(m, "HAS_TLS_UNIQUE", r);
+
+#ifdef OPENSSL_NO_ECDH
+ r = Py_False;
+#else
+ r = Py_True;
+#endif
+ Py_INCREF(r);
+ PyModule_AddObject(m, "HAS_ECDH", r);
+
+#ifdef OPENSSL_NPN_NEGOTIATED
+ r = Py_True;
+#else
+ r = Py_False;
+#endif
+ Py_INCREF(r);
+ PyModule_AddObject(m, "HAS_NPN", r);
+
+ /* Mappings for error codes */
+ err_codes_to_names = PyDict_New();
+ err_names_to_codes = PyDict_New();
+ if (err_codes_to_names == NULL || err_names_to_codes == NULL)
+ return NULL;
+ errcode = error_codes;
+ while (errcode->mnemonic != NULL) {
+ PyObject *mnemo, *key;
+ mnemo = PyUnicode_FromString(errcode->mnemonic);
+ key = Py_BuildValue("ii", errcode->library, errcode->reason);
+ if (mnemo == NULL || key == NULL)
+ return NULL;
+ if (PyDict_SetItem(err_codes_to_names, key, mnemo))
+ return NULL;
+ if (PyDict_SetItem(err_names_to_codes, mnemo, key))
+ return NULL;
+ Py_DECREF(key);
+ Py_DECREF(mnemo);
+ errcode++;
+ }
+ if (PyModule_AddObject(m, "err_codes_to_names", err_codes_to_names))
+ return NULL;
+ if (PyModule_AddObject(m, "err_names_to_codes", err_names_to_codes))
+ return NULL;
+
+ lib_codes_to_names = PyDict_New();
+ if (lib_codes_to_names == NULL)
+ return NULL;
+ libcode = library_codes;
+ while (libcode->library != NULL) {
+ PyObject *mnemo, *key;
+ key = PyLong_FromLong(libcode->code);
+ mnemo = PyUnicode_FromString(libcode->library);
+ if (key == NULL || mnemo == NULL)
+ return NULL;
+ if (PyDict_SetItem(lib_codes_to_names, key, mnemo))
+ return NULL;
+ Py_DECREF(key);
+ Py_DECREF(mnemo);
+ libcode++;
+ }
+ if (PyModule_AddObject(m, "lib_codes_to_names", lib_codes_to_names))
+ return NULL;
+
/* OpenSSL version */
/* SSLeay() gives us the version of the library linked against,
which could be different from the headers version.
diff --git a/Modules/_ssl_data.h b/Modules/_ssl_data.h
new file mode 100644
index 0000000..81a8d7b
--- /dev/null
+++ b/Modules/_ssl_data.h
@@ -0,0 +1,1653 @@
+/* File generated by Tools/ssl/make_ssl_data.py */
+/* Generated on 2012-05-16T23:56:40.981382 */
+
+static struct py_ssl_library_code library_codes[] = {
+ {"PEM", ERR_LIB_PEM},
+ {"SSL", ERR_LIB_SSL},
+ {"X509", ERR_LIB_X509},
+ { NULL }
+};
+
+static struct py_ssl_error_code error_codes[] = {
+ #ifdef PEM_R_BAD_BASE64_DECODE
+ {"BAD_BASE64_DECODE", ERR_LIB_PEM, PEM_R_BAD_BASE64_DECODE},
+ #else
+ {"BAD_BASE64_DECODE", ERR_LIB_PEM, 100},
+ #endif
+ #ifdef PEM_R_BAD_DECRYPT
+ {"BAD_DECRYPT", ERR_LIB_PEM, PEM_R_BAD_DECRYPT},
+ #else
+ {"BAD_DECRYPT", ERR_LIB_PEM, 101},
+ #endif
+ #ifdef PEM_R_BAD_END_LINE
+ {"BAD_END_LINE", ERR_LIB_PEM, PEM_R_BAD_END_LINE},
+ #else
+ {"BAD_END_LINE", ERR_LIB_PEM, 102},
+ #endif
+ #ifdef PEM_R_BAD_IV_CHARS
+ {"BAD_IV_CHARS", ERR_LIB_PEM, PEM_R_BAD_IV_CHARS},
+ #else
+ {"BAD_IV_CHARS", ERR_LIB_PEM, 103},
+ #endif
+ #ifdef PEM_R_BAD_MAGIC_NUMBER
+ {"BAD_MAGIC_NUMBER", ERR_LIB_PEM, PEM_R_BAD_MAGIC_NUMBER},
+ #else
+ {"BAD_MAGIC_NUMBER", ERR_LIB_PEM, 116},
+ #endif
+ #ifdef PEM_R_BAD_PASSWORD_READ
+ {"BAD_PASSWORD_READ", ERR_LIB_PEM, PEM_R_BAD_PASSWORD_READ},
+ #else
+ {"BAD_PASSWORD_READ", ERR_LIB_PEM, 104},
+ #endif
+ #ifdef PEM_R_BAD_VERSION_NUMBER
+ {"BAD_VERSION_NUMBER", ERR_LIB_PEM, PEM_R_BAD_VERSION_NUMBER},
+ #else
+ {"BAD_VERSION_NUMBER", ERR_LIB_PEM, 117},
+ #endif
+ #ifdef PEM_R_BIO_WRITE_FAILURE
+ {"BIO_WRITE_FAILURE", ERR_LIB_PEM, PEM_R_BIO_WRITE_FAILURE},
+ #else
+ {"BIO_WRITE_FAILURE", ERR_LIB_PEM, 118},
+ #endif
+ #ifdef PEM_R_CIPHER_IS_NULL
+ {"CIPHER_IS_NULL", ERR_LIB_PEM, PEM_R_CIPHER_IS_NULL},
+ #else
+ {"CIPHER_IS_NULL", ERR_LIB_PEM, 127},
+ #endif
+ #ifdef PEM_R_ERROR_CONVERTING_PRIVATE_KEY
+ {"ERROR_CONVERTING_PRIVATE_KEY", ERR_LIB_PEM, PEM_R_ERROR_CONVERTING_PRIVATE_KEY},
+ #else
+ {"ERROR_CONVERTING_PRIVATE_KEY", ERR_LIB_PEM, 115},
+ #endif
+ #ifdef PEM_R_EXPECTING_PRIVATE_KEY_BLOB
+ {"EXPECTING_PRIVATE_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PRIVATE_KEY_BLOB},
+ #else
+ {"EXPECTING_PRIVATE_KEY_BLOB", ERR_LIB_PEM, 119},
+ #endif
+ #ifdef PEM_R_EXPECTING_PUBLIC_KEY_BLOB
+ {"EXPECTING_PUBLIC_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PUBLIC_KEY_BLOB},
+ #else
+ {"EXPECTING_PUBLIC_KEY_BLOB", ERR_LIB_PEM, 120},
+ #endif
+ #ifdef PEM_R_INCONSISTENT_HEADER
+ {"INCONSISTENT_HEADER", ERR_LIB_PEM, PEM_R_INCONSISTENT_HEADER},
+ #else
+ {"INCONSISTENT_HEADER", ERR_LIB_PEM, 121},
+ #endif
+ #ifdef PEM_R_KEYBLOB_HEADER_PARSE_ERROR
+ {"KEYBLOB_HEADER_PARSE_ERROR", ERR_LIB_PEM, PEM_R_KEYBLOB_HEADER_PARSE_ERROR},
+ #else
+ {"KEYBLOB_HEADER_PARSE_ERROR", ERR_LIB_PEM, 122},
+ #endif
+ #ifdef PEM_R_KEYBLOB_TOO_SHORT
+ {"KEYBLOB_TOO_SHORT", ERR_LIB_PEM, PEM_R_KEYBLOB_TOO_SHORT},
+ #else
+ {"KEYBLOB_TOO_SHORT", ERR_LIB_PEM, 123},
+ #endif
+ #ifdef PEM_R_NOT_DEK_INFO
+ {"NOT_DEK_INFO", ERR_LIB_PEM, PEM_R_NOT_DEK_INFO},
+ #else
+ {"NOT_DEK_INFO", ERR_LIB_PEM, 105},
+ #endif
+ #ifdef PEM_R_NOT_ENCRYPTED
+ {"NOT_ENCRYPTED", ERR_LIB_PEM, PEM_R_NOT_ENCRYPTED},
+ #else
+ {"NOT_ENCRYPTED", ERR_LIB_PEM, 106},
+ #endif
+ #ifdef PEM_R_NOT_PROC_TYPE
+ {"NOT_PROC_TYPE", ERR_LIB_PEM, PEM_R_NOT_PROC_TYPE},
+ #else
+ {"NOT_PROC_TYPE", ERR_LIB_PEM, 107},
+ #endif
+ #ifdef PEM_R_NO_START_LINE
+ {"NO_START_LINE", ERR_LIB_PEM, PEM_R_NO_START_LINE},
+ #else
+ {"NO_START_LINE", ERR_LIB_PEM, 108},
+ #endif
+ #ifdef PEM_R_PROBLEMS_GETTING_PASSWORD
+ {"PROBLEMS_GETTING_PASSWORD", ERR_LIB_PEM, PEM_R_PROBLEMS_GETTING_PASSWORD},
+ #else
+ {"PROBLEMS_GETTING_PASSWORD", ERR_LIB_PEM, 109},
+ #endif
+ #ifdef PEM_R_PUBLIC_KEY_NO_RSA
+ {"PUBLIC_KEY_NO_RSA", ERR_LIB_PEM, PEM_R_PUBLIC_KEY_NO_RSA},
+ #else
+ {"PUBLIC_KEY_NO_RSA", ERR_LIB_PEM, 110},
+ #endif
+ #ifdef PEM_R_PVK_DATA_TOO_SHORT
+ {"PVK_DATA_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_DATA_TOO_SHORT},
+ #else
+ {"PVK_DATA_TOO_SHORT", ERR_LIB_PEM, 124},
+ #endif
+ #ifdef PEM_R_PVK_TOO_SHORT
+ {"PVK_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_TOO_SHORT},
+ #else
+ {"PVK_TOO_SHORT", ERR_LIB_PEM, 125},
+ #endif
+ #ifdef PEM_R_READ_KEY
+ {"READ_KEY", ERR_LIB_PEM, PEM_R_READ_KEY},
+ #else
+ {"READ_KEY", ERR_LIB_PEM, 111},
+ #endif
+ #ifdef PEM_R_SHORT_HEADER
+ {"SHORT_HEADER", ERR_LIB_PEM, PEM_R_SHORT_HEADER},
+ #else
+ {"SHORT_HEADER", ERR_LIB_PEM, 112},
+ #endif
+ #ifdef PEM_R_UNSUPPORTED_CIPHER
+ {"UNSUPPORTED_CIPHER", ERR_LIB_PEM, PEM_R_UNSUPPORTED_CIPHER},
+ #else
+ {"UNSUPPORTED_CIPHER", ERR_LIB_PEM, 113},
+ #endif
+ #ifdef PEM_R_UNSUPPORTED_ENCRYPTION
+ {"UNSUPPORTED_ENCRYPTION", ERR_LIB_PEM, PEM_R_UNSUPPORTED_ENCRYPTION},
+ #else
+ {"UNSUPPORTED_ENCRYPTION", ERR_LIB_PEM, 114},
+ #endif
+ #ifdef PEM_R_UNSUPPORTED_KEY_COMPONENTS
+ {"UNSUPPORTED_KEY_COMPONENTS", ERR_LIB_PEM, PEM_R_UNSUPPORTED_KEY_COMPONENTS},
+ #else
+ {"UNSUPPORTED_KEY_COMPONENTS", ERR_LIB_PEM, 126},
+ #endif
+ #ifdef SSL_R_APP_DATA_IN_HANDSHAKE
+ {"APP_DATA_IN_HANDSHAKE", ERR_LIB_SSL, SSL_R_APP_DATA_IN_HANDSHAKE},
+ #else
+ {"APP_DATA_IN_HANDSHAKE", ERR_LIB_SSL, 100},
+ #endif
+ #ifdef SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT
+ {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", ERR_LIB_SSL, SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT},
+ #else
+ {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", ERR_LIB_SSL, 272},
+ #endif
+ #ifdef SSL_R_BAD_ALERT_RECORD
+ {"BAD_ALERT_RECORD", ERR_LIB_SSL, SSL_R_BAD_ALERT_RECORD},
+ #else
+ {"BAD_ALERT_RECORD", ERR_LIB_SSL, 101},
+ #endif
+ #ifdef SSL_R_BAD_AUTHENTICATION_TYPE
+ {"BAD_AUTHENTICATION_TYPE", ERR_LIB_SSL, SSL_R_BAD_AUTHENTICATION_TYPE},
+ #else
+ {"BAD_AUTHENTICATION_TYPE", ERR_LIB_SSL, 102},
+ #endif
+ #ifdef SSL_R_BAD_CHANGE_CIPHER_SPEC
+ {"BAD_CHANGE_CIPHER_SPEC", ERR_LIB_SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC},
+ #else
+ {"BAD_CHANGE_CIPHER_SPEC", ERR_LIB_SSL, 103},
+ #endif
+ #ifdef SSL_R_BAD_CHECKSUM
+ {"BAD_CHECKSUM", ERR_LIB_SSL, SSL_R_BAD_CHECKSUM},
+ #else
+ {"BAD_CHECKSUM", ERR_LIB_SSL, 104},
+ #endif
+ #ifdef SSL_R_BAD_DATA_RETURNED_BY_CALLBACK
+ {"BAD_DATA_RETURNED_BY_CALLBACK", ERR_LIB_SSL, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK},
+ #else
+ {"BAD_DATA_RETURNED_BY_CALLBACK", ERR_LIB_SSL, 106},
+ #endif
+ #ifdef SSL_R_BAD_DECOMPRESSION
+ {"BAD_DECOMPRESSION", ERR_LIB_SSL, SSL_R_BAD_DECOMPRESSION},
+ #else
+ {"BAD_DECOMPRESSION", ERR_LIB_SSL, 107},
+ #endif
+ #ifdef SSL_R_BAD_DH_G_LENGTH
+ {"BAD_DH_G_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DH_G_LENGTH},
+ #else
+ {"BAD_DH_G_LENGTH", ERR_LIB_SSL, 108},
+ #endif
+ #ifdef SSL_R_BAD_DH_PUB_KEY_LENGTH
+ {"BAD_DH_PUB_KEY_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DH_PUB_KEY_LENGTH},
+ #else
+ {"BAD_DH_PUB_KEY_LENGTH", ERR_LIB_SSL, 109},
+ #endif
+ #ifdef SSL_R_BAD_DH_P_LENGTH
+ {"BAD_DH_P_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DH_P_LENGTH},
+ #else
+ {"BAD_DH_P_LENGTH", ERR_LIB_SSL, 110},
+ #endif
+ #ifdef SSL_R_BAD_DIGEST_LENGTH
+ {"BAD_DIGEST_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DIGEST_LENGTH},
+ #else
+ {"BAD_DIGEST_LENGTH", ERR_LIB_SSL, 111},
+ #endif
+ #ifdef SSL_R_BAD_DSA_SIGNATURE
+ {"BAD_DSA_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_DSA_SIGNATURE},
+ #else
+ {"BAD_DSA_SIGNATURE", ERR_LIB_SSL, 112},
+ #endif
+ #ifdef SSL_R_BAD_ECC_CERT
+ {"BAD_ECC_CERT", ERR_LIB_SSL, SSL_R_BAD_ECC_CERT},
+ #else
+ {"BAD_ECC_CERT", ERR_LIB_SSL, 304},
+ #endif
+ #ifdef SSL_R_BAD_ECDSA_SIGNATURE
+ {"BAD_ECDSA_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_ECDSA_SIGNATURE},
+ #else
+ {"BAD_ECDSA_SIGNATURE", ERR_LIB_SSL, 305},
+ #endif
+ #ifdef SSL_R_BAD_ECPOINT
+ {"BAD_ECPOINT", ERR_LIB_SSL, SSL_R_BAD_ECPOINT},
+ #else
+ {"BAD_ECPOINT", ERR_LIB_SSL, 306},
+ #endif
+ #ifdef SSL_R_BAD_HANDSHAKE_LENGTH
+ {"BAD_HANDSHAKE_LENGTH", ERR_LIB_SSL, SSL_R_BAD_HANDSHAKE_LENGTH},
+ #else
+ {"BAD_HANDSHAKE_LENGTH", ERR_LIB_SSL, 332},
+ #endif
+ #ifdef SSL_R_BAD_HELLO_REQUEST
+ {"BAD_HELLO_REQUEST", ERR_LIB_SSL, SSL_R_BAD_HELLO_REQUEST},
+ #else
+ {"BAD_HELLO_REQUEST", ERR_LIB_SSL, 105},
+ #endif
+ #ifdef SSL_R_BAD_LENGTH
+ {"BAD_LENGTH", ERR_LIB_SSL, SSL_R_BAD_LENGTH},
+ #else
+ {"BAD_LENGTH", ERR_LIB_SSL, 271},
+ #endif
+ #ifdef SSL_R_BAD_MAC_DECODE
+ {"BAD_MAC_DECODE", ERR_LIB_SSL, SSL_R_BAD_MAC_DECODE},
+ #else
+ {"BAD_MAC_DECODE", ERR_LIB_SSL, 113},
+ #endif
+ #ifdef SSL_R_BAD_MAC_LENGTH
+ {"BAD_MAC_LENGTH", ERR_LIB_SSL, SSL_R_BAD_MAC_LENGTH},
+ #else
+ {"BAD_MAC_LENGTH", ERR_LIB_SSL, 333},
+ #endif
+ #ifdef SSL_R_BAD_MESSAGE_TYPE
+ {"BAD_MESSAGE_TYPE", ERR_LIB_SSL, SSL_R_BAD_MESSAGE_TYPE},
+ #else
+ {"BAD_MESSAGE_TYPE", ERR_LIB_SSL, 114},
+ #endif
+ #ifdef SSL_R_BAD_PACKET_LENGTH
+ {"BAD_PACKET_LENGTH", ERR_LIB_SSL, SSL_R_BAD_PACKET_LENGTH},
+ #else
+ {"BAD_PACKET_LENGTH", ERR_LIB_SSL, 115},
+ #endif
+ #ifdef SSL_R_BAD_PROTOCOL_VERSION_NUMBER
+ {"BAD_PROTOCOL_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_BAD_PROTOCOL_VERSION_NUMBER},
+ #else
+ {"BAD_PROTOCOL_VERSION_NUMBER", ERR_LIB_SSL, 116},
+ #endif
+ #ifdef SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH
+ {"BAD_PSK_IDENTITY_HINT_LENGTH", ERR_LIB_SSL, SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH},
+ #else
+ {"BAD_PSK_IDENTITY_HINT_LENGTH", ERR_LIB_SSL, 316},
+ #endif
+ #ifdef SSL_R_BAD_RESPONSE_ARGUMENT
+ {"BAD_RESPONSE_ARGUMENT", ERR_LIB_SSL, SSL_R_BAD_RESPONSE_ARGUMENT},
+ #else
+ {"BAD_RESPONSE_ARGUMENT", ERR_LIB_SSL, 117},
+ #endif
+ #ifdef SSL_R_BAD_RSA_DECRYPT
+ {"BAD_RSA_DECRYPT", ERR_LIB_SSL, SSL_R_BAD_RSA_DECRYPT},
+ #else
+ {"BAD_RSA_DECRYPT", ERR_LIB_SSL, 118},
+ #endif
+ #ifdef SSL_R_BAD_RSA_ENCRYPT
+ {"BAD_RSA_ENCRYPT", ERR_LIB_SSL, SSL_R_BAD_RSA_ENCRYPT},
+ #else
+ {"BAD_RSA_ENCRYPT", ERR_LIB_SSL, 119},
+ #endif
+ #ifdef SSL_R_BAD_RSA_E_LENGTH
+ {"BAD_RSA_E_LENGTH", ERR_LIB_SSL, SSL_R_BAD_RSA_E_LENGTH},
+ #else
+ {"BAD_RSA_E_LENGTH", ERR_LIB_SSL, 120},
+ #endif
+ #ifdef SSL_R_BAD_RSA_MODULUS_LENGTH
+ {"BAD_RSA_MODULUS_LENGTH", ERR_LIB_SSL, SSL_R_BAD_RSA_MODULUS_LENGTH},
+ #else
+ {"BAD_RSA_MODULUS_LENGTH", ERR_LIB_SSL, 121},
+ #endif
+ #ifdef SSL_R_BAD_RSA_SIGNATURE
+ {"BAD_RSA_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_RSA_SIGNATURE},
+ #else
+ {"BAD_RSA_SIGNATURE", ERR_LIB_SSL, 122},
+ #endif
+ #ifdef SSL_R_BAD_SIGNATURE
+ {"BAD_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_SIGNATURE},
+ #else
+ {"BAD_SIGNATURE", ERR_LIB_SSL, 123},
+ #endif
+ #ifdef SSL_R_BAD_SSL_FILETYPE
+ {"BAD_SSL_FILETYPE", ERR_LIB_SSL, SSL_R_BAD_SSL_FILETYPE},
+ #else
+ {"BAD_SSL_FILETYPE", ERR_LIB_SSL, 124},
+ #endif
+ #ifdef SSL_R_BAD_SSL_SESSION_ID_LENGTH
+ {"BAD_SSL_SESSION_ID_LENGTH", ERR_LIB_SSL, SSL_R_BAD_SSL_SESSION_ID_LENGTH},
+ #else
+ {"BAD_SSL_SESSION_ID_LENGTH", ERR_LIB_SSL, 125},
+ #endif
+ #ifdef SSL_R_BAD_STATE
+ {"BAD_STATE", ERR_LIB_SSL, SSL_R_BAD_STATE},
+ #else
+ {"BAD_STATE", ERR_LIB_SSL, 126},
+ #endif
+ #ifdef SSL_R_BAD_WRITE_RETRY
+ {"BAD_WRITE_RETRY", ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY},
+ #else
+ {"BAD_WRITE_RETRY", ERR_LIB_SSL, 127},
+ #endif
+ #ifdef SSL_R_BIO_NOT_SET
+ {"BIO_NOT_SET", ERR_LIB_SSL, SSL_R_BIO_NOT_SET},
+ #else
+ {"BIO_NOT_SET", ERR_LIB_SSL, 128},
+ #endif
+ #ifdef SSL_R_BLOCK_CIPHER_PAD_IS_WRONG
+ {"BLOCK_CIPHER_PAD_IS_WRONG", ERR_LIB_SSL, SSL_R_BLOCK_CIPHER_PAD_IS_WRONG},
+ #else
+ {"BLOCK_CIPHER_PAD_IS_WRONG", ERR_LIB_SSL, 129},
+ #endif
+ #ifdef SSL_R_BN_LIB
+ {"BN_LIB", ERR_LIB_SSL, SSL_R_BN_LIB},
+ #else
+ {"BN_LIB", ERR_LIB_SSL, 130},
+ #endif
+ #ifdef SSL_R_CA_DN_LENGTH_MISMATCH
+ {"CA_DN_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CA_DN_LENGTH_MISMATCH},
+ #else
+ {"CA_DN_LENGTH_MISMATCH", ERR_LIB_SSL, 131},
+ #endif
+ #ifdef SSL_R_CA_DN_TOO_LONG
+ {"CA_DN_TOO_LONG", ERR_LIB_SSL, SSL_R_CA_DN_TOO_LONG},
+ #else
+ {"CA_DN_TOO_LONG", ERR_LIB_SSL, 132},
+ #endif
+ #ifdef SSL_R_CCS_RECEIVED_EARLY
+ {"CCS_RECEIVED_EARLY", ERR_LIB_SSL, SSL_R_CCS_RECEIVED_EARLY},
+ #else
+ {"CCS_RECEIVED_EARLY", ERR_LIB_SSL, 133},
+ #endif
+ #ifdef SSL_R_CERTIFICATE_VERIFY_FAILED
+ {"CERTIFICATE_VERIFY_FAILED", ERR_LIB_SSL, SSL_R_CERTIFICATE_VERIFY_FAILED},
+ #else
+ {"CERTIFICATE_VERIFY_FAILED", ERR_LIB_SSL, 134},
+ #endif
+ #ifdef SSL_R_CERT_LENGTH_MISMATCH
+ {"CERT_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CERT_LENGTH_MISMATCH},
+ #else
+ {"CERT_LENGTH_MISMATCH", ERR_LIB_SSL, 135},
+ #endif
+ #ifdef SSL_R_CHALLENGE_IS_DIFFERENT
+ {"CHALLENGE_IS_DIFFERENT", ERR_LIB_SSL, SSL_R_CHALLENGE_IS_DIFFERENT},
+ #else
+ {"CHALLENGE_IS_DIFFERENT", ERR_LIB_SSL, 136},
+ #endif
+ #ifdef SSL_R_CIPHER_CODE_WRONG_LENGTH
+ {"CIPHER_CODE_WRONG_LENGTH", ERR_LIB_SSL, SSL_R_CIPHER_CODE_WRONG_LENGTH},
+ #else
+ {"CIPHER_CODE_WRONG_LENGTH", ERR_LIB_SSL, 137},
+ #endif
+ #ifdef SSL_R_CIPHER_OR_HASH_UNAVAILABLE
+ {"CIPHER_OR_HASH_UNAVAILABLE", ERR_LIB_SSL, SSL_R_CIPHER_OR_HASH_UNAVAILABLE},
+ #else
+ {"CIPHER_OR_HASH_UNAVAILABLE", ERR_LIB_SSL, 138},
+ #endif
+ #ifdef SSL_R_CIPHER_TABLE_SRC_ERROR
+ {"CIPHER_TABLE_SRC_ERROR", ERR_LIB_SSL, SSL_R_CIPHER_TABLE_SRC_ERROR},
+ #else
+ {"CIPHER_TABLE_SRC_ERROR", ERR_LIB_SSL, 139},
+ #endif
+ #ifdef SSL_R_CLIENTHELLO_TLSEXT
+ {"CLIENTHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_CLIENTHELLO_TLSEXT},
+ #else
+ {"CLIENTHELLO_TLSEXT", ERR_LIB_SSL, 226},
+ #endif
+ #ifdef SSL_R_COMPRESSED_LENGTH_TOO_LONG
+ {"COMPRESSED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_COMPRESSED_LENGTH_TOO_LONG},
+ #else
+ {"COMPRESSED_LENGTH_TOO_LONG", ERR_LIB_SSL, 140},
+ #endif
+ #ifdef SSL_R_COMPRESSION_DISABLED
+ {"COMPRESSION_DISABLED", ERR_LIB_SSL, SSL_R_COMPRESSION_DISABLED},
+ #else
+ {"COMPRESSION_DISABLED", ERR_LIB_SSL, 343},
+ #endif
+ #ifdef SSL_R_COMPRESSION_FAILURE
+ {"COMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_COMPRESSION_FAILURE},
+ #else
+ {"COMPRESSION_FAILURE", ERR_LIB_SSL, 141},
+ #endif
+ #ifdef SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE
+ {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", ERR_LIB_SSL, SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE},
+ #else
+ {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", ERR_LIB_SSL, 307},
+ #endif
+ #ifdef SSL_R_COMPRESSION_LIBRARY_ERROR
+ {"COMPRESSION_LIBRARY_ERROR", ERR_LIB_SSL, SSL_R_COMPRESSION_LIBRARY_ERROR},
+ #else
+ {"COMPRESSION_LIBRARY_ERROR", ERR_LIB_SSL, 142},
+ #endif
+ #ifdef SSL_R_CONNECTION_ID_IS_DIFFERENT
+ {"CONNECTION_ID_IS_DIFFERENT", ERR_LIB_SSL, SSL_R_CONNECTION_ID_IS_DIFFERENT},
+ #else
+ {"CONNECTION_ID_IS_DIFFERENT", ERR_LIB_SSL, 143},
+ #endif
+ #ifdef SSL_R_CONNECTION_TYPE_NOT_SET
+ {"CONNECTION_TYPE_NOT_SET", ERR_LIB_SSL, SSL_R_CONNECTION_TYPE_NOT_SET},
+ #else
+ {"CONNECTION_TYPE_NOT_SET", ERR_LIB_SSL, 144},
+ #endif
+ #ifdef SSL_R_COOKIE_MISMATCH
+ {"COOKIE_MISMATCH", ERR_LIB_SSL, SSL_R_COOKIE_MISMATCH},
+ #else
+ {"COOKIE_MISMATCH", ERR_LIB_SSL, 308},
+ #endif
+ #ifdef SSL_R_DATA_BETWEEN_CCS_AND_FINISHED
+ {"DATA_BETWEEN_CCS_AND_FINISHED", ERR_LIB_SSL, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED},
+ #else
+ {"DATA_BETWEEN_CCS_AND_FINISHED", ERR_LIB_SSL, 145},
+ #endif
+ #ifdef SSL_R_DATA_LENGTH_TOO_LONG
+ {"DATA_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_DATA_LENGTH_TOO_LONG},
+ #else
+ {"DATA_LENGTH_TOO_LONG", ERR_LIB_SSL, 146},
+ #endif
+ #ifdef SSL_R_DECRYPTION_FAILED
+ {"DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED},
+ #else
+ {"DECRYPTION_FAILED", ERR_LIB_SSL, 147},
+ #endif
+ #ifdef SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC
+ {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC},
+ #else
+ {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", ERR_LIB_SSL, 281},
+ #endif
+ #ifdef SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG
+ {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG},
+ #else
+ {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, 148},
+ #endif
+ #ifdef SSL_R_DIGEST_CHECK_FAILED
+ {"DIGEST_CHECK_FAILED", ERR_LIB_SSL, SSL_R_DIGEST_CHECK_FAILED},
+ #else
+ {"DIGEST_CHECK_FAILED", ERR_LIB_SSL, 149},
+ #endif
+ #ifdef SSL_R_DTLS_MESSAGE_TOO_BIG
+ {"DTLS_MESSAGE_TOO_BIG", ERR_LIB_SSL, SSL_R_DTLS_MESSAGE_TOO_BIG},
+ #else
+ {"DTLS_MESSAGE_TOO_BIG", ERR_LIB_SSL, 334},
+ #endif
+ #ifdef SSL_R_DUPLICATE_COMPRESSION_ID
+ {"DUPLICATE_COMPRESSION_ID", ERR_LIB_SSL, SSL_R_DUPLICATE_COMPRESSION_ID},
+ #else
+ {"DUPLICATE_COMPRESSION_ID", ERR_LIB_SSL, 309},
+ #endif
+ #ifdef SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT
+ {"ECC_CERT_NOT_FOR_KEY_AGREEMENT", ERR_LIB_SSL, SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT},
+ #else
+ {"ECC_CERT_NOT_FOR_KEY_AGREEMENT", ERR_LIB_SSL, 317},
+ #endif
+ #ifdef SSL_R_ECC_CERT_NOT_FOR_SIGNING
+ {"ECC_CERT_NOT_FOR_SIGNING", ERR_LIB_SSL, SSL_R_ECC_CERT_NOT_FOR_SIGNING},
+ #else
+ {"ECC_CERT_NOT_FOR_SIGNING", ERR_LIB_SSL, 318},
+ #endif
+ #ifdef SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE
+ {"ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE", ERR_LIB_SSL, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE},
+ #else
+ {"ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE", ERR_LIB_SSL, 322},
+ #endif
+ #ifdef SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE
+ {"ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE", ERR_LIB_SSL, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE},
+ #else
+ {"ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE", ERR_LIB_SSL, 323},
+ #endif
+ #ifdef SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER
+ {"ECGROUP_TOO_LARGE_FOR_CIPHER", ERR_LIB_SSL, SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER},
+ #else
+ {"ECGROUP_TOO_LARGE_FOR_CIPHER", ERR_LIB_SSL, 310},
+ #endif
+ #ifdef SSL_R_ENCRYPTED_LENGTH_TOO_LONG
+ {"ENCRYPTED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_ENCRYPTED_LENGTH_TOO_LONG},
+ #else
+ {"ENCRYPTED_LENGTH_TOO_LONG", ERR_LIB_SSL, 150},
+ #endif
+ #ifdef SSL_R_ERROR_GENERATING_TMP_RSA_KEY
+ {"ERROR_GENERATING_TMP_RSA_KEY", ERR_LIB_SSL, SSL_R_ERROR_GENERATING_TMP_RSA_KEY},
+ #else
+ {"ERROR_GENERATING_TMP_RSA_KEY", ERR_LIB_SSL, 282},
+ #endif
+ #ifdef SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST
+ {"ERROR_IN_RECEIVED_CIPHER_LIST", ERR_LIB_SSL, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST},
+ #else
+ {"ERROR_IN_RECEIVED_CIPHER_LIST", ERR_LIB_SSL, 151},
+ #endif
+ #ifdef SSL_R_EXCESSIVE_MESSAGE_SIZE
+ {"EXCESSIVE_MESSAGE_SIZE", ERR_LIB_SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE},
+ #else
+ {"EXCESSIVE_MESSAGE_SIZE", ERR_LIB_SSL, 152},
+ #endif
+ #ifdef SSL_R_EXTRA_DATA_IN_MESSAGE
+ {"EXTRA_DATA_IN_MESSAGE", ERR_LIB_SSL, SSL_R_EXTRA_DATA_IN_MESSAGE},
+ #else
+ {"EXTRA_DATA_IN_MESSAGE", ERR_LIB_SSL, 153},
+ #endif
+ #ifdef SSL_R_GOT_A_FIN_BEFORE_A_CCS
+ {"GOT_A_FIN_BEFORE_A_CCS", ERR_LIB_SSL, SSL_R_GOT_A_FIN_BEFORE_A_CCS},
+ #else
+ {"GOT_A_FIN_BEFORE_A_CCS", ERR_LIB_SSL, 154},
+ #endif
+ #ifdef SSL_R_HTTPS_PROXY_REQUEST
+ {"HTTPS_PROXY_REQUEST", ERR_LIB_SSL, SSL_R_HTTPS_PROXY_REQUEST},
+ #else
+ {"HTTPS_PROXY_REQUEST", ERR_LIB_SSL, 155},
+ #endif
+ #ifdef SSL_R_HTTP_REQUEST
+ {"HTTP_REQUEST", ERR_LIB_SSL, SSL_R_HTTP_REQUEST},
+ #else
+ {"HTTP_REQUEST", ERR_LIB_SSL, 156},
+ #endif
+ #ifdef SSL_R_ILLEGAL_PADDING
+ {"ILLEGAL_PADDING", ERR_LIB_SSL, SSL_R_ILLEGAL_PADDING},
+ #else
+ {"ILLEGAL_PADDING", ERR_LIB_SSL, 283},
+ #endif
+ #ifdef SSL_R_INCONSISTENT_COMPRESSION
+ {"INCONSISTENT_COMPRESSION", ERR_LIB_SSL, SSL_R_INCONSISTENT_COMPRESSION},
+ #else
+ {"INCONSISTENT_COMPRESSION", ERR_LIB_SSL, 340},
+ #endif
+ #ifdef SSL_R_INVALID_CHALLENGE_LENGTH
+ {"INVALID_CHALLENGE_LENGTH", ERR_LIB_SSL, SSL_R_INVALID_CHALLENGE_LENGTH},
+ #else
+ {"INVALID_CHALLENGE_LENGTH", ERR_LIB_SSL, 158},
+ #endif
+ #ifdef SSL_R_INVALID_COMMAND
+ {"INVALID_COMMAND", ERR_LIB_SSL, SSL_R_INVALID_COMMAND},
+ #else
+ {"INVALID_COMMAND", ERR_LIB_SSL, 280},
+ #endif
+ #ifdef SSL_R_INVALID_COMPRESSION_ALGORITHM
+ {"INVALID_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_INVALID_COMPRESSION_ALGORITHM},
+ #else
+ {"INVALID_COMPRESSION_ALGORITHM", ERR_LIB_SSL, 341},
+ #endif
+ #ifdef SSL_R_INVALID_PURPOSE
+ {"INVALID_PURPOSE", ERR_LIB_SSL, SSL_R_INVALID_PURPOSE},
+ #else
+ {"INVALID_PURPOSE", ERR_LIB_SSL, 278},
+ #endif
+ #ifdef SSL_R_INVALID_STATUS_RESPONSE
+ {"INVALID_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_INVALID_STATUS_RESPONSE},
+ #else
+ {"INVALID_STATUS_RESPONSE", ERR_LIB_SSL, 328},
+ #endif
+ #ifdef SSL_R_INVALID_TICKET_KEYS_LENGTH
+ {"INVALID_TICKET_KEYS_LENGTH", ERR_LIB_SSL, SSL_R_INVALID_TICKET_KEYS_LENGTH},
+ #else
+ {"INVALID_TICKET_KEYS_LENGTH", ERR_LIB_SSL, 325},
+ #endif
+ #ifdef SSL_R_INVALID_TRUST
+ {"INVALID_TRUST", ERR_LIB_SSL, SSL_R_INVALID_TRUST},
+ #else
+ {"INVALID_TRUST", ERR_LIB_SSL, 279},
+ #endif
+ #ifdef SSL_R_KEY_ARG_TOO_LONG
+ {"KEY_ARG_TOO_LONG", ERR_LIB_SSL, SSL_R_KEY_ARG_TOO_LONG},
+ #else
+ {"KEY_ARG_TOO_LONG", ERR_LIB_SSL, 284},
+ #endif
+ #ifdef SSL_R_KRB5
+ {"KRB5", ERR_LIB_SSL, SSL_R_KRB5},
+ #else
+ {"KRB5", ERR_LIB_SSL, 285},
+ #endif
+ #ifdef SSL_R_KRB5_C_CC_PRINC
+ {"KRB5_C_CC_PRINC", ERR_LIB_SSL, SSL_R_KRB5_C_CC_PRINC},
+ #else
+ {"KRB5_C_CC_PRINC", ERR_LIB_SSL, 286},
+ #endif
+ #ifdef SSL_R_KRB5_C_GET_CRED
+ {"KRB5_C_GET_CRED", ERR_LIB_SSL, SSL_R_KRB5_C_GET_CRED},
+ #else
+ {"KRB5_C_GET_CRED", ERR_LIB_SSL, 287},
+ #endif
+ #ifdef SSL_R_KRB5_C_INIT
+ {"KRB5_C_INIT", ERR_LIB_SSL, SSL_R_KRB5_C_INIT},
+ #else
+ {"KRB5_C_INIT", ERR_LIB_SSL, 288},
+ #endif
+ #ifdef SSL_R_KRB5_C_MK_REQ
+ {"KRB5_C_MK_REQ", ERR_LIB_SSL, SSL_R_KRB5_C_MK_REQ},
+ #else
+ {"KRB5_C_MK_REQ", ERR_LIB_SSL, 289},
+ #endif
+ #ifdef SSL_R_KRB5_S_BAD_TICKET
+ {"KRB5_S_BAD_TICKET", ERR_LIB_SSL, SSL_R_KRB5_S_BAD_TICKET},
+ #else
+ {"KRB5_S_BAD_TICKET", ERR_LIB_SSL, 290},
+ #endif
+ #ifdef SSL_R_KRB5_S_INIT
+ {"KRB5_S_INIT", ERR_LIB_SSL, SSL_R_KRB5_S_INIT},
+ #else
+ {"KRB5_S_INIT", ERR_LIB_SSL, 291},
+ #endif
+ #ifdef SSL_R_KRB5_S_RD_REQ
+ {"KRB5_S_RD_REQ", ERR_LIB_SSL, SSL_R_KRB5_S_RD_REQ},
+ #else
+ {"KRB5_S_RD_REQ", ERR_LIB_SSL, 292},
+ #endif
+ #ifdef SSL_R_KRB5_S_TKT_EXPIRED
+ {"KRB5_S_TKT_EXPIRED", ERR_LIB_SSL, SSL_R_KRB5_S_TKT_EXPIRED},
+ #else
+ {"KRB5_S_TKT_EXPIRED", ERR_LIB_SSL, 293},
+ #endif
+ #ifdef SSL_R_KRB5_S_TKT_NYV
+ {"KRB5_S_TKT_NYV", ERR_LIB_SSL, SSL_R_KRB5_S_TKT_NYV},
+ #else
+ {"KRB5_S_TKT_NYV", ERR_LIB_SSL, 294},
+ #endif
+ #ifdef SSL_R_KRB5_S_TKT_SKEW
+ {"KRB5_S_TKT_SKEW", ERR_LIB_SSL, SSL_R_KRB5_S_TKT_SKEW},
+ #else
+ {"KRB5_S_TKT_SKEW", ERR_LIB_SSL, 295},
+ #endif
+ #ifdef SSL_R_LENGTH_MISMATCH
+ {"LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_LENGTH_MISMATCH},
+ #else
+ {"LENGTH_MISMATCH", ERR_LIB_SSL, 159},
+ #endif
+ #ifdef SSL_R_LENGTH_TOO_SHORT
+ {"LENGTH_TOO_SHORT", ERR_LIB_SSL, SSL_R_LENGTH_TOO_SHORT},
+ #else
+ {"LENGTH_TOO_SHORT", ERR_LIB_SSL, 160},
+ #endif
+ #ifdef SSL_R_LIBRARY_BUG
+ {"LIBRARY_BUG", ERR_LIB_SSL, SSL_R_LIBRARY_BUG},
+ #else
+ {"LIBRARY_BUG", ERR_LIB_SSL, 274},
+ #endif
+ #ifdef SSL_R_LIBRARY_HAS_NO_CIPHERS
+ {"LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_LIBRARY_HAS_NO_CIPHERS},
+ #else
+ {"LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, 161},
+ #endif
+ #ifdef SSL_R_MESSAGE_TOO_LONG
+ {"MESSAGE_TOO_LONG", ERR_LIB_SSL, SSL_R_MESSAGE_TOO_LONG},
+ #else
+ {"MESSAGE_TOO_LONG", ERR_LIB_SSL, 296},
+ #endif
+ #ifdef SSL_R_MISSING_DH_DSA_CERT
+ {"MISSING_DH_DSA_CERT", ERR_LIB_SSL, SSL_R_MISSING_DH_DSA_CERT},
+ #else
+ {"MISSING_DH_DSA_CERT", ERR_LIB_SSL, 162},
+ #endif
+ #ifdef SSL_R_MISSING_DH_KEY
+ {"MISSING_DH_KEY", ERR_LIB_SSL, SSL_R_MISSING_DH_KEY},
+ #else
+ {"MISSING_DH_KEY", ERR_LIB_SSL, 163},
+ #endif
+ #ifdef SSL_R_MISSING_DH_RSA_CERT
+ {"MISSING_DH_RSA_CERT", ERR_LIB_SSL, SSL_R_MISSING_DH_RSA_CERT},
+ #else
+ {"MISSING_DH_RSA_CERT", ERR_LIB_SSL, 164},
+ #endif
+ #ifdef SSL_R_MISSING_DSA_SIGNING_CERT
+ {"MISSING_DSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_DSA_SIGNING_CERT},
+ #else
+ {"MISSING_DSA_SIGNING_CERT", ERR_LIB_SSL, 165},
+ #endif
+ #ifdef SSL_R_MISSING_EXPORT_TMP_DH_KEY
+ {"MISSING_EXPORT_TMP_DH_KEY", ERR_LIB_SSL, SSL_R_MISSING_EXPORT_TMP_DH_KEY},
+ #else
+ {"MISSING_EXPORT_TMP_DH_KEY", ERR_LIB_SSL, 166},
+ #endif
+ #ifdef SSL_R_MISSING_EXPORT_TMP_RSA_KEY
+ {"MISSING_EXPORT_TMP_RSA_KEY", ERR_LIB_SSL, SSL_R_MISSING_EXPORT_TMP_RSA_KEY},
+ #else
+ {"MISSING_EXPORT_TMP_RSA_KEY", ERR_LIB_SSL, 167},
+ #endif
+ #ifdef SSL_R_MISSING_RSA_CERTIFICATE
+ {"MISSING_RSA_CERTIFICATE", ERR_LIB_SSL, SSL_R_MISSING_RSA_CERTIFICATE},
+ #else
+ {"MISSING_RSA_CERTIFICATE", ERR_LIB_SSL, 168},
+ #endif
+ #ifdef SSL_R_MISSING_RSA_ENCRYPTING_CERT
+ {"MISSING_RSA_ENCRYPTING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_ENCRYPTING_CERT},
+ #else
+ {"MISSING_RSA_ENCRYPTING_CERT", ERR_LIB_SSL, 169},
+ #endif
+ #ifdef SSL_R_MISSING_RSA_SIGNING_CERT
+ {"MISSING_RSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_SIGNING_CERT},
+ #else
+ {"MISSING_RSA_SIGNING_CERT", ERR_LIB_SSL, 170},
+ #endif
+ #ifdef SSL_R_MISSING_TMP_DH_KEY
+ {"MISSING_TMP_DH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_DH_KEY},
+ #else
+ {"MISSING_TMP_DH_KEY", ERR_LIB_SSL, 171},
+ #endif
+ #ifdef SSL_R_MISSING_TMP_ECDH_KEY
+ {"MISSING_TMP_ECDH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_ECDH_KEY},
+ #else
+ {"MISSING_TMP_ECDH_KEY", ERR_LIB_SSL, 311},
+ #endif
+ #ifdef SSL_R_MISSING_TMP_RSA_KEY
+ {"MISSING_TMP_RSA_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_RSA_KEY},
+ #else
+ {"MISSING_TMP_RSA_KEY", ERR_LIB_SSL, 172},
+ #endif
+ #ifdef SSL_R_MISSING_TMP_RSA_PKEY
+ {"MISSING_TMP_RSA_PKEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_RSA_PKEY},
+ #else
+ {"MISSING_TMP_RSA_PKEY", ERR_LIB_SSL, 173},
+ #endif
+ #ifdef SSL_R_MISSING_VERIFY_MESSAGE
+ {"MISSING_VERIFY_MESSAGE", ERR_LIB_SSL, SSL_R_MISSING_VERIFY_MESSAGE},
+ #else
+ {"MISSING_VERIFY_MESSAGE", ERR_LIB_SSL, 174},
+ #endif
+ #ifdef SSL_R_NON_SSLV2_INITIAL_PACKET
+ {"NON_SSLV2_INITIAL_PACKET", ERR_LIB_SSL, SSL_R_NON_SSLV2_INITIAL_PACKET},
+ #else
+ {"NON_SSLV2_INITIAL_PACKET", ERR_LIB_SSL, 175},
+ #endif
+ #ifdef SSL_R_NO_CERTIFICATES_RETURNED
+ {"NO_CERTIFICATES_RETURNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATES_RETURNED},
+ #else
+ {"NO_CERTIFICATES_RETURNED", ERR_LIB_SSL, 176},
+ #endif
+ #ifdef SSL_R_NO_CERTIFICATE_ASSIGNED
+ {"NO_CERTIFICATE_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_ASSIGNED},
+ #else
+ {"NO_CERTIFICATE_ASSIGNED", ERR_LIB_SSL, 177},
+ #endif
+ #ifdef SSL_R_NO_CERTIFICATE_RETURNED
+ {"NO_CERTIFICATE_RETURNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_RETURNED},
+ #else
+ {"NO_CERTIFICATE_RETURNED", ERR_LIB_SSL, 178},
+ #endif
+ #ifdef SSL_R_NO_CERTIFICATE_SET
+ {"NO_CERTIFICATE_SET", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_SET},
+ #else
+ {"NO_CERTIFICATE_SET", ERR_LIB_SSL, 179},
+ #endif
+ #ifdef SSL_R_NO_CERTIFICATE_SPECIFIED
+ {"NO_CERTIFICATE_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_SPECIFIED},
+ #else
+ {"NO_CERTIFICATE_SPECIFIED", ERR_LIB_SSL, 180},
+ #endif
+ #ifdef SSL_R_NO_CIPHERS_AVAILABLE
+ {"NO_CIPHERS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_CIPHERS_AVAILABLE},
+ #else
+ {"NO_CIPHERS_AVAILABLE", ERR_LIB_SSL, 181},
+ #endif
+ #ifdef SSL_R_NO_CIPHERS_PASSED
+ {"NO_CIPHERS_PASSED", ERR_LIB_SSL, SSL_R_NO_CIPHERS_PASSED},
+ #else
+ {"NO_CIPHERS_PASSED", ERR_LIB_SSL, 182},
+ #endif
+ #ifdef SSL_R_NO_CIPHERS_SPECIFIED
+ {"NO_CIPHERS_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_CIPHERS_SPECIFIED},
+ #else
+ {"NO_CIPHERS_SPECIFIED", ERR_LIB_SSL, 183},
+ #endif
+ #ifdef SSL_R_NO_CIPHER_LIST
+ {"NO_CIPHER_LIST", ERR_LIB_SSL, SSL_R_NO_CIPHER_LIST},
+ #else
+ {"NO_CIPHER_LIST", ERR_LIB_SSL, 184},
+ #endif
+ #ifdef SSL_R_NO_CIPHER_MATCH
+ {"NO_CIPHER_MATCH", ERR_LIB_SSL, SSL_R_NO_CIPHER_MATCH},
+ #else
+ {"NO_CIPHER_MATCH", ERR_LIB_SSL, 185},
+ #endif
+ #ifdef SSL_R_NO_CLIENT_CERT_METHOD
+ {"NO_CLIENT_CERT_METHOD", ERR_LIB_SSL, SSL_R_NO_CLIENT_CERT_METHOD},
+ #else
+ {"NO_CLIENT_CERT_METHOD", ERR_LIB_SSL, 331},
+ #endif
+ #ifdef SSL_R_NO_CLIENT_CERT_RECEIVED
+ {"NO_CLIENT_CERT_RECEIVED", ERR_LIB_SSL, SSL_R_NO_CLIENT_CERT_RECEIVED},
+ #else
+ {"NO_CLIENT_CERT_RECEIVED", ERR_LIB_SSL, 186},
+ #endif
+ #ifdef SSL_R_NO_COMPRESSION_SPECIFIED
+ {"NO_COMPRESSION_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_COMPRESSION_SPECIFIED},
+ #else
+ {"NO_COMPRESSION_SPECIFIED", ERR_LIB_SSL, 187},
+ #endif
+ #ifdef SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER
+ {"NO_GOST_CERTIFICATE_SENT_BY_PEER", ERR_LIB_SSL, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER},
+ #else
+ {"NO_GOST_CERTIFICATE_SENT_BY_PEER", ERR_LIB_SSL, 330},
+ #endif
+ #ifdef SSL_R_NO_METHOD_SPECIFIED
+ {"NO_METHOD_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_METHOD_SPECIFIED},
+ #else
+ {"NO_METHOD_SPECIFIED", ERR_LIB_SSL, 188},
+ #endif
+ #ifdef SSL_R_NO_PRIVATEKEY
+ {"NO_PRIVATEKEY", ERR_LIB_SSL, SSL_R_NO_PRIVATEKEY},
+ #else
+ {"NO_PRIVATEKEY", ERR_LIB_SSL, 189},
+ #endif
+ #ifdef SSL_R_NO_PRIVATE_KEY_ASSIGNED
+ {"NO_PRIVATE_KEY_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_PRIVATE_KEY_ASSIGNED},
+ #else
+ {"NO_PRIVATE_KEY_ASSIGNED", ERR_LIB_SSL, 190},
+ #endif
+ #ifdef SSL_R_NO_PROTOCOLS_AVAILABLE
+ {"NO_PROTOCOLS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_PROTOCOLS_AVAILABLE},
+ #else
+ {"NO_PROTOCOLS_AVAILABLE", ERR_LIB_SSL, 191},
+ #endif
+ #ifdef SSL_R_NO_PUBLICKEY
+ {"NO_PUBLICKEY", ERR_LIB_SSL, SSL_R_NO_PUBLICKEY},
+ #else
+ {"NO_PUBLICKEY", ERR_LIB_SSL, 192},
+ #endif
+ #ifdef SSL_R_NO_RENEGOTIATION
+ {"NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_NO_RENEGOTIATION},
+ #else
+ {"NO_RENEGOTIATION", ERR_LIB_SSL, 339},
+ #endif
+ #ifdef SSL_R_NO_REQUIRED_DIGEST
+ {"NO_REQUIRED_DIGEST", ERR_LIB_SSL, SSL_R_NO_REQUIRED_DIGEST},
+ #else
+ {"NO_REQUIRED_DIGEST", ERR_LIB_SSL, 324},
+ #endif
+ #ifdef SSL_R_NO_SHARED_CIPHER
+ {"NO_SHARED_CIPHER", ERR_LIB_SSL, SSL_R_NO_SHARED_CIPHER},
+ #else
+ {"NO_SHARED_CIPHER", ERR_LIB_SSL, 193},
+ #endif
+ #ifdef SSL_R_NO_VERIFY_CALLBACK
+ {"NO_VERIFY_CALLBACK", ERR_LIB_SSL, SSL_R_NO_VERIFY_CALLBACK},
+ #else
+ {"NO_VERIFY_CALLBACK", ERR_LIB_SSL, 194},
+ #endif
+ #ifdef SSL_R_NULL_SSL_CTX
+ {"NULL_SSL_CTX", ERR_LIB_SSL, SSL_R_NULL_SSL_CTX},
+ #else
+ {"NULL_SSL_CTX", ERR_LIB_SSL, 195},
+ #endif
+ #ifdef SSL_R_NULL_SSL_METHOD_PASSED
+ {"NULL_SSL_METHOD_PASSED", ERR_LIB_SSL, SSL_R_NULL_SSL_METHOD_PASSED},
+ #else
+ {"NULL_SSL_METHOD_PASSED", ERR_LIB_SSL, 196},
+ #endif
+ #ifdef SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED
+ {"OLD_SESSION_CIPHER_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED},
+ #else
+ {"OLD_SESSION_CIPHER_NOT_RETURNED", ERR_LIB_SSL, 197},
+ #endif
+ #ifdef SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED
+ {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED},
+ #else
+ {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", ERR_LIB_SSL, 344},
+ #endif
+ #ifdef SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE
+ {"ONLY_TLS_ALLOWED_IN_FIPS_MODE", ERR_LIB_SSL, SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE},
+ #else
+ {"ONLY_TLS_ALLOWED_IN_FIPS_MODE", ERR_LIB_SSL, 297},
+ #endif
+ #ifdef SSL_R_OPAQUE_PRF_INPUT_TOO_LONG
+ {"OPAQUE_PRF_INPUT_TOO_LONG", ERR_LIB_SSL, SSL_R_OPAQUE_PRF_INPUT_TOO_LONG},
+ #else
+ {"OPAQUE_PRF_INPUT_TOO_LONG", ERR_LIB_SSL, 327},
+ #endif
+ #ifdef SSL_R_PACKET_LENGTH_TOO_LONG
+ {"PACKET_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_PACKET_LENGTH_TOO_LONG},
+ #else
+ {"PACKET_LENGTH_TOO_LONG", ERR_LIB_SSL, 198},
+ #endif
+ #ifdef SSL_R_PARSE_TLSEXT
+ {"PARSE_TLSEXT", ERR_LIB_SSL, SSL_R_PARSE_TLSEXT},
+ #else
+ {"PARSE_TLSEXT", ERR_LIB_SSL, 227},
+ #endif
+ #ifdef SSL_R_PATH_TOO_LONG
+ {"PATH_TOO_LONG", ERR_LIB_SSL, SSL_R_PATH_TOO_LONG},
+ #else
+ {"PATH_TOO_LONG", ERR_LIB_SSL, 270},
+ #endif
+ #ifdef SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE
+ {"PEER_DID_NOT_RETURN_A_CERTIFICATE", ERR_LIB_SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE},
+ #else
+ {"PEER_DID_NOT_RETURN_A_CERTIFICATE", ERR_LIB_SSL, 199},
+ #endif
+ #ifdef SSL_R_PEER_ERROR
+ {"PEER_ERROR", ERR_LIB_SSL, SSL_R_PEER_ERROR},
+ #else
+ {"PEER_ERROR", ERR_LIB_SSL, 200},
+ #endif
+ #ifdef SSL_R_PEER_ERROR_CERTIFICATE
+ {"PEER_ERROR_CERTIFICATE", ERR_LIB_SSL, SSL_R_PEER_ERROR_CERTIFICATE},
+ #else
+ {"PEER_ERROR_CERTIFICATE", ERR_LIB_SSL, 201},
+ #endif
+ #ifdef SSL_R_PEER_ERROR_NO_CERTIFICATE
+ {"PEER_ERROR_NO_CERTIFICATE", ERR_LIB_SSL, SSL_R_PEER_ERROR_NO_CERTIFICATE},
+ #else
+ {"PEER_ERROR_NO_CERTIFICATE", ERR_LIB_SSL, 202},
+ #endif
+ #ifdef SSL_R_PEER_ERROR_NO_CIPHER
+ {"PEER_ERROR_NO_CIPHER", ERR_LIB_SSL, SSL_R_PEER_ERROR_NO_CIPHER},
+ #else
+ {"PEER_ERROR_NO_CIPHER", ERR_LIB_SSL, 203},
+ #endif
+ #ifdef SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE
+ {"PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE},
+ #else
+ {"PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE", ERR_LIB_SSL, 204},
+ #endif
+ #ifdef SSL_R_PRE_MAC_LENGTH_TOO_LONG
+ {"PRE_MAC_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_PRE_MAC_LENGTH_TOO_LONG},
+ #else
+ {"PRE_MAC_LENGTH_TOO_LONG", ERR_LIB_SSL, 205},
+ #endif
+ #ifdef SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS
+ {"PROBLEMS_MAPPING_CIPHER_FUNCTIONS", ERR_LIB_SSL, SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS},
+ #else
+ {"PROBLEMS_MAPPING_CIPHER_FUNCTIONS", ERR_LIB_SSL, 206},
+ #endif
+ #ifdef SSL_R_PROTOCOL_IS_SHUTDOWN
+ {"PROTOCOL_IS_SHUTDOWN", ERR_LIB_SSL, SSL_R_PROTOCOL_IS_SHUTDOWN},
+ #else
+ {"PROTOCOL_IS_SHUTDOWN", ERR_LIB_SSL, 207},
+ #endif
+ #ifdef SSL_R_PSK_IDENTITY_NOT_FOUND
+ {"PSK_IDENTITY_NOT_FOUND", ERR_LIB_SSL, SSL_R_PSK_IDENTITY_NOT_FOUND},
+ #else
+ {"PSK_IDENTITY_NOT_FOUND", ERR_LIB_SSL, 223},
+ #endif
+ #ifdef SSL_R_PSK_NO_CLIENT_CB
+ {"PSK_NO_CLIENT_CB", ERR_LIB_SSL, SSL_R_PSK_NO_CLIENT_CB},
+ #else
+ {"PSK_NO_CLIENT_CB", ERR_LIB_SSL, 224},
+ #endif
+ #ifdef SSL_R_PSK_NO_SERVER_CB
+ {"PSK_NO_SERVER_CB", ERR_LIB_SSL, SSL_R_PSK_NO_SERVER_CB},
+ #else
+ {"PSK_NO_SERVER_CB", ERR_LIB_SSL, 225},
+ #endif
+ #ifdef SSL_R_PUBLIC_KEY_ENCRYPT_ERROR
+ {"PUBLIC_KEY_ENCRYPT_ERROR", ERR_LIB_SSL, SSL_R_PUBLIC_KEY_ENCRYPT_ERROR},
+ #else
+ {"PUBLIC_KEY_ENCRYPT_ERROR", ERR_LIB_SSL, 208},
+ #endif
+ #ifdef SSL_R_PUBLIC_KEY_IS_NOT_RSA
+ {"PUBLIC_KEY_IS_NOT_RSA", ERR_LIB_SSL, SSL_R_PUBLIC_KEY_IS_NOT_RSA},
+ #else
+ {"PUBLIC_KEY_IS_NOT_RSA", ERR_LIB_SSL, 209},
+ #endif
+ #ifdef SSL_R_PUBLIC_KEY_NOT_RSA
+ {"PUBLIC_KEY_NOT_RSA", ERR_LIB_SSL, SSL_R_PUBLIC_KEY_NOT_RSA},
+ #else
+ {"PUBLIC_KEY_NOT_RSA", ERR_LIB_SSL, 210},
+ #endif
+ #ifdef SSL_R_READ_BIO_NOT_SET
+ {"READ_BIO_NOT_SET", ERR_LIB_SSL, SSL_R_READ_BIO_NOT_SET},
+ #else
+ {"READ_BIO_NOT_SET", ERR_LIB_SSL, 211},
+ #endif
+ #ifdef SSL_R_READ_TIMEOUT_EXPIRED
+ {"READ_TIMEOUT_EXPIRED", ERR_LIB_SSL, SSL_R_READ_TIMEOUT_EXPIRED},
+ #else
+ {"READ_TIMEOUT_EXPIRED", ERR_LIB_SSL, 312},
+ #endif
+ #ifdef SSL_R_READ_WRONG_PACKET_TYPE
+ {"READ_WRONG_PACKET_TYPE", ERR_LIB_SSL, SSL_R_READ_WRONG_PACKET_TYPE},
+ #else
+ {"READ_WRONG_PACKET_TYPE", ERR_LIB_SSL, 212},
+ #endif
+ #ifdef SSL_R_RECORD_LENGTH_MISMATCH
+ {"RECORD_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_RECORD_LENGTH_MISMATCH},
+ #else
+ {"RECORD_LENGTH_MISMATCH", ERR_LIB_SSL, 213},
+ #endif
+ #ifdef SSL_R_RECORD_TOO_LARGE
+ {"RECORD_TOO_LARGE", ERR_LIB_SSL, SSL_R_RECORD_TOO_LARGE},
+ #else
+ {"RECORD_TOO_LARGE", ERR_LIB_SSL, 214},
+ #endif
+ #ifdef SSL_R_RECORD_TOO_SMALL
+ {"RECORD_TOO_SMALL", ERR_LIB_SSL, SSL_R_RECORD_TOO_SMALL},
+ #else
+ {"RECORD_TOO_SMALL", ERR_LIB_SSL, 298},
+ #endif
+ #ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG
+ {"RENEGOTIATE_EXT_TOO_LONG", ERR_LIB_SSL, SSL_R_RENEGOTIATE_EXT_TOO_LONG},
+ #else
+ {"RENEGOTIATE_EXT_TOO_LONG", ERR_LIB_SSL, 335},
+ #endif
+ #ifdef SSL_R_RENEGOTIATION_ENCODING_ERR
+ {"RENEGOTIATION_ENCODING_ERR", ERR_LIB_SSL, SSL_R_RENEGOTIATION_ENCODING_ERR},
+ #else
+ {"RENEGOTIATION_ENCODING_ERR", ERR_LIB_SSL, 336},
+ #endif
+ #ifdef SSL_R_RENEGOTIATION_MISMATCH
+ {"RENEGOTIATION_MISMATCH", ERR_LIB_SSL, SSL_R_RENEGOTIATION_MISMATCH},
+ #else
+ {"RENEGOTIATION_MISMATCH", ERR_LIB_SSL, 337},
+ #endif
+ #ifdef SSL_R_REQUIRED_CIPHER_MISSING
+ {"REQUIRED_CIPHER_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_CIPHER_MISSING},
+ #else
+ {"REQUIRED_CIPHER_MISSING", ERR_LIB_SSL, 215},
+ #endif
+ #ifdef SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING
+ {"REQUIRED_COMPRESSSION_ALGORITHM_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING},
+ #else
+ {"REQUIRED_COMPRESSSION_ALGORITHM_MISSING", ERR_LIB_SSL, 342},
+ #endif
+ #ifdef SSL_R_REUSE_CERT_LENGTH_NOT_ZERO
+ {"REUSE_CERT_LENGTH_NOT_ZERO", ERR_LIB_SSL, SSL_R_REUSE_CERT_LENGTH_NOT_ZERO},
+ #else
+ {"REUSE_CERT_LENGTH_NOT_ZERO", ERR_LIB_SSL, 216},
+ #endif
+ #ifdef SSL_R_REUSE_CERT_TYPE_NOT_ZERO
+ {"REUSE_CERT_TYPE_NOT_ZERO", ERR_LIB_SSL, SSL_R_REUSE_CERT_TYPE_NOT_ZERO},
+ #else
+ {"REUSE_CERT_TYPE_NOT_ZERO", ERR_LIB_SSL, 217},
+ #endif
+ #ifdef SSL_R_REUSE_CIPHER_LIST_NOT_ZERO
+ {"REUSE_CIPHER_LIST_NOT_ZERO", ERR_LIB_SSL, SSL_R_REUSE_CIPHER_LIST_NOT_ZERO},
+ #else
+ {"REUSE_CIPHER_LIST_NOT_ZERO", ERR_LIB_SSL, 218},
+ #endif
+ #ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING
+ {"SCSV_RECEIVED_WHEN_RENEGOTIATING", ERR_LIB_SSL, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING},
+ #else
+ {"SCSV_RECEIVED_WHEN_RENEGOTIATING", ERR_LIB_SSL, 345},
+ #endif
+ #ifdef SSL_R_SERVERHELLO_TLSEXT
+ {"SERVERHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_SERVERHELLO_TLSEXT},
+ #else
+ {"SERVERHELLO_TLSEXT", ERR_LIB_SSL, 275},
+ #endif
+ #ifdef SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED
+ {"SESSION_ID_CONTEXT_UNINITIALIZED", ERR_LIB_SSL, SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED},
+ #else
+ {"SESSION_ID_CONTEXT_UNINITIALIZED", ERR_LIB_SSL, 277},
+ #endif
+ #ifdef SSL_R_SHORT_READ
+ {"SHORT_READ", ERR_LIB_SSL, SSL_R_SHORT_READ},
+ #else
+ {"SHORT_READ", ERR_LIB_SSL, 219},
+ #endif
+ #ifdef SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE
+ {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", ERR_LIB_SSL, SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE},
+ #else
+ {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", ERR_LIB_SSL, 220},
+ #endif
+ #ifdef SSL_R_SSL23_DOING_SESSION_ID_REUSE
+ {"SSL23_DOING_SESSION_ID_REUSE", ERR_LIB_SSL, SSL_R_SSL23_DOING_SESSION_ID_REUSE},
+ #else
+ {"SSL23_DOING_SESSION_ID_REUSE", ERR_LIB_SSL, 221},
+ #endif
+ #ifdef SSL_R_SSL2_CONNECTION_ID_TOO_LONG
+ {"SSL2_CONNECTION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL2_CONNECTION_ID_TOO_LONG},
+ #else
+ {"SSL2_CONNECTION_ID_TOO_LONG", ERR_LIB_SSL, 299},
+ #endif
+ #ifdef SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT
+ {"SSL3_EXT_INVALID_ECPOINTFORMAT", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT},
+ #else
+ {"SSL3_EXT_INVALID_ECPOINTFORMAT", ERR_LIB_SSL, 321},
+ #endif
+ #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME
+ {"SSL3_EXT_INVALID_SERVERNAME", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME},
+ #else
+ {"SSL3_EXT_INVALID_SERVERNAME", ERR_LIB_SSL, 319},
+ #endif
+ #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE
+ {"SSL3_EXT_INVALID_SERVERNAME_TYPE", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE},
+ #else
+ {"SSL3_EXT_INVALID_SERVERNAME_TYPE", ERR_LIB_SSL, 320},
+ #endif
+ #ifdef SSL_R_SSL3_SESSION_ID_TOO_LONG
+ {"SSL3_SESSION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL3_SESSION_ID_TOO_LONG},
+ #else
+ {"SSL3_SESSION_ID_TOO_LONG", ERR_LIB_SSL, 300},
+ #endif
+ #ifdef SSL_R_SSL3_SESSION_ID_TOO_SHORT
+ {"SSL3_SESSION_ID_TOO_SHORT", ERR_LIB_SSL, SSL_R_SSL3_SESSION_ID_TOO_SHORT},
+ #else
+ {"SSL3_SESSION_ID_TOO_SHORT", ERR_LIB_SSL, 222},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_BAD_CERTIFICATE
+ {"SSLV3_ALERT_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_CERTIFICATE},
+ #else
+ {"SSLV3_ALERT_BAD_CERTIFICATE", ERR_LIB_SSL, 1042},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_BAD_RECORD_MAC
+ {"SSLV3_ALERT_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_RECORD_MAC},
+ #else
+ {"SSLV3_ALERT_BAD_RECORD_MAC", ERR_LIB_SSL, 1020},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED
+ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED},
+ #else
+ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", ERR_LIB_SSL, 1045},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED
+ {"SSLV3_ALERT_CERTIFICATE_REVOKED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED},
+ #else
+ {"SSLV3_ALERT_CERTIFICATE_REVOKED", ERR_LIB_SSL, 1044},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN
+ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN},
+ #else
+ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", ERR_LIB_SSL, 1046},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE
+ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE},
+ #else
+ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", ERR_LIB_SSL, 1030},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE
+ {"SSLV3_ALERT_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE},
+ #else
+ {"SSLV3_ALERT_HANDSHAKE_FAILURE", ERR_LIB_SSL, 1040},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER
+ {"SSLV3_ALERT_ILLEGAL_PARAMETER", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER},
+ #else
+ {"SSLV3_ALERT_ILLEGAL_PARAMETER", ERR_LIB_SSL, 1047},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_NO_CERTIFICATE
+ {"SSLV3_ALERT_NO_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_NO_CERTIFICATE},
+ #else
+ {"SSLV3_ALERT_NO_CERTIFICATE", ERR_LIB_SSL, 1041},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE
+ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE},
+ #else
+ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", ERR_LIB_SSL, 1010},
+ #endif
+ #ifdef SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
+ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE},
+ #else
+ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", ERR_LIB_SSL, 1043},
+ #endif
+ #ifdef SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION
+ {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", ERR_LIB_SSL, SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION},
+ #else
+ {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", ERR_LIB_SSL, 228},
+ #endif
+ #ifdef SSL_R_SSL_HANDSHAKE_FAILURE
+ {"SSL_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSL_HANDSHAKE_FAILURE},
+ #else
+ {"SSL_HANDSHAKE_FAILURE", ERR_LIB_SSL, 229},
+ #endif
+ #ifdef SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS
+ {"SSL_LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS},
+ #else
+ {"SSL_LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, 230},
+ #endif
+ #ifdef SSL_R_SSL_SESSION_ID_CALLBACK_FAILED
+ {"SSL_SESSION_ID_CALLBACK_FAILED", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CALLBACK_FAILED},
+ #else
+ {"SSL_SESSION_ID_CALLBACK_FAILED", ERR_LIB_SSL, 301},
+ #endif
+ #ifdef SSL_R_SSL_SESSION_ID_CONFLICT
+ {"SSL_SESSION_ID_CONFLICT", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONFLICT},
+ #else
+ {"SSL_SESSION_ID_CONFLICT", ERR_LIB_SSL, 302},
+ #endif
+ #ifdef SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG
+ {"SSL_SESSION_ID_CONTEXT_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG},
+ #else
+ {"SSL_SESSION_ID_CONTEXT_TOO_LONG", ERR_LIB_SSL, 273},
+ #endif
+ #ifdef SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH
+ {"SSL_SESSION_ID_HAS_BAD_LENGTH", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH},
+ #else
+ {"SSL_SESSION_ID_HAS_BAD_LENGTH", ERR_LIB_SSL, 303},
+ #endif
+ #ifdef SSL_R_SSL_SESSION_ID_IS_DIFFERENT
+ {"SSL_SESSION_ID_IS_DIFFERENT", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_IS_DIFFERENT},
+ #else
+ {"SSL_SESSION_ID_IS_DIFFERENT", ERR_LIB_SSL, 231},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_ACCESS_DENIED
+ {"TLSV1_ALERT_ACCESS_DENIED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_ACCESS_DENIED},
+ #else
+ {"TLSV1_ALERT_ACCESS_DENIED", ERR_LIB_SSL, 1049},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_DECODE_ERROR
+ {"TLSV1_ALERT_DECODE_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECODE_ERROR},
+ #else
+ {"TLSV1_ALERT_DECODE_ERROR", ERR_LIB_SSL, 1050},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_DECRYPTION_FAILED
+ {"TLSV1_ALERT_DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPTION_FAILED},
+ #else
+ {"TLSV1_ALERT_DECRYPTION_FAILED", ERR_LIB_SSL, 1021},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_DECRYPT_ERROR
+ {"TLSV1_ALERT_DECRYPT_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPT_ERROR},
+ #else
+ {"TLSV1_ALERT_DECRYPT_ERROR", ERR_LIB_SSL, 1051},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION
+ {"TLSV1_ALERT_EXPORT_RESTRICTION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION},
+ #else
+ {"TLSV1_ALERT_EXPORT_RESTRICTION", ERR_LIB_SSL, 1060},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY
+ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY},
+ #else
+ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", ERR_LIB_SSL, 1071},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_INTERNAL_ERROR
+ {"TLSV1_ALERT_INTERNAL_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INTERNAL_ERROR},
+ #else
+ {"TLSV1_ALERT_INTERNAL_ERROR", ERR_LIB_SSL, 1080},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_NO_RENEGOTIATION
+ {"TLSV1_ALERT_NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_RENEGOTIATION},
+ #else
+ {"TLSV1_ALERT_NO_RENEGOTIATION", ERR_LIB_SSL, 1100},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_PROTOCOL_VERSION
+ {"TLSV1_ALERT_PROTOCOL_VERSION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_PROTOCOL_VERSION},
+ #else
+ {"TLSV1_ALERT_PROTOCOL_VERSION", ERR_LIB_SSL, 1070},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_RECORD_OVERFLOW
+ {"TLSV1_ALERT_RECORD_OVERFLOW", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_RECORD_OVERFLOW},
+ #else
+ {"TLSV1_ALERT_RECORD_OVERFLOW", ERR_LIB_SSL, 1022},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_CA
+ {"TLSV1_ALERT_UNKNOWN_CA", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_CA},
+ #else
+ {"TLSV1_ALERT_UNKNOWN_CA", ERR_LIB_SSL, 1048},
+ #endif
+ #ifdef SSL_R_TLSV1_ALERT_USER_CANCELLED
+ {"TLSV1_ALERT_USER_CANCELLED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_USER_CANCELLED},
+ #else
+ {"TLSV1_ALERT_USER_CANCELLED", ERR_LIB_SSL, 1090},
+ #endif
+ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE
+ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE},
+ #else
+ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", ERR_LIB_SSL, 1114},
+ #endif
+ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE
+ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE},
+ #else
+ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", ERR_LIB_SSL, 1113},
+ #endif
+ #ifdef SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE
+ {"TLSV1_CERTIFICATE_UNOBTAINABLE", ERR_LIB_SSL, SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE},
+ #else
+ {"TLSV1_CERTIFICATE_UNOBTAINABLE", ERR_LIB_SSL, 1111},
+ #endif
+ #ifdef SSL_R_TLSV1_UNRECOGNIZED_NAME
+ {"TLSV1_UNRECOGNIZED_NAME", ERR_LIB_SSL, SSL_R_TLSV1_UNRECOGNIZED_NAME},
+ #else
+ {"TLSV1_UNRECOGNIZED_NAME", ERR_LIB_SSL, 1112},
+ #endif
+ #ifdef SSL_R_TLSV1_UNSUPPORTED_EXTENSION
+ {"TLSV1_UNSUPPORTED_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV1_UNSUPPORTED_EXTENSION},
+ #else
+ {"TLSV1_UNSUPPORTED_EXTENSION", ERR_LIB_SSL, 1110},
+ #endif
+ #ifdef SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER
+ {"TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER", ERR_LIB_SSL, SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER},
+ #else
+ {"TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER", ERR_LIB_SSL, 232},
+ #endif
+ #ifdef SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST
+ {"TLS_INVALID_ECPOINTFORMAT_LIST", ERR_LIB_SSL, SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST},
+ #else
+ {"TLS_INVALID_ECPOINTFORMAT_LIST", ERR_LIB_SSL, 157},
+ #endif
+ #ifdef SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST
+ {"TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST", ERR_LIB_SSL, SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST},
+ #else
+ {"TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST", ERR_LIB_SSL, 233},
+ #endif
+ #ifdef SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG
+ {"TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG},
+ #else
+ {"TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, 234},
+ #endif
+ #ifdef SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER
+ {"TRIED_TO_USE_UNSUPPORTED_CIPHER", ERR_LIB_SSL, SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER},
+ #else
+ {"TRIED_TO_USE_UNSUPPORTED_CIPHER", ERR_LIB_SSL, 235},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_DECODE_DH_CERTS
+ {"UNABLE_TO_DECODE_DH_CERTS", ERR_LIB_SSL, SSL_R_UNABLE_TO_DECODE_DH_CERTS},
+ #else
+ {"UNABLE_TO_DECODE_DH_CERTS", ERR_LIB_SSL, 236},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_DECODE_ECDH_CERTS
+ {"UNABLE_TO_DECODE_ECDH_CERTS", ERR_LIB_SSL, SSL_R_UNABLE_TO_DECODE_ECDH_CERTS},
+ #else
+ {"UNABLE_TO_DECODE_ECDH_CERTS", ERR_LIB_SSL, 313},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY
+ {"UNABLE_TO_EXTRACT_PUBLIC_KEY", ERR_LIB_SSL, SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY},
+ #else
+ {"UNABLE_TO_EXTRACT_PUBLIC_KEY", ERR_LIB_SSL, 237},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_FIND_DH_PARAMETERS
+ {"UNABLE_TO_FIND_DH_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_DH_PARAMETERS},
+ #else
+ {"UNABLE_TO_FIND_DH_PARAMETERS", ERR_LIB_SSL, 238},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS
+ {"UNABLE_TO_FIND_ECDH_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS},
+ #else
+ {"UNABLE_TO_FIND_ECDH_PARAMETERS", ERR_LIB_SSL, 314},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS
+ {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS},
+ #else
+ {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", ERR_LIB_SSL, 239},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_FIND_SSL_METHOD
+ {"UNABLE_TO_FIND_SSL_METHOD", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_SSL_METHOD},
+ #else
+ {"UNABLE_TO_FIND_SSL_METHOD", ERR_LIB_SSL, 240},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES
+ {"UNABLE_TO_LOAD_SSL2_MD5_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES},
+ #else
+ {"UNABLE_TO_LOAD_SSL2_MD5_ROUTINES", ERR_LIB_SSL, 241},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES
+ {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES},
+ #else
+ {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", ERR_LIB_SSL, 242},
+ #endif
+ #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES
+ {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES},
+ #else
+ {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", ERR_LIB_SSL, 243},
+ #endif
+ #ifdef SSL_R_UNEXPECTED_MESSAGE
+ {"UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_UNEXPECTED_MESSAGE},
+ #else
+ {"UNEXPECTED_MESSAGE", ERR_LIB_SSL, 244},
+ #endif
+ #ifdef SSL_R_UNEXPECTED_RECORD
+ {"UNEXPECTED_RECORD", ERR_LIB_SSL, SSL_R_UNEXPECTED_RECORD},
+ #else
+ {"UNEXPECTED_RECORD", ERR_LIB_SSL, 245},
+ #endif
+ #ifdef SSL_R_UNINITIALIZED
+ {"UNINITIALIZED", ERR_LIB_SSL, SSL_R_UNINITIALIZED},
+ #else
+ {"UNINITIALIZED", ERR_LIB_SSL, 276},
+ #endif
+ #ifdef SSL_R_UNKNOWN_ALERT_TYPE
+ {"UNKNOWN_ALERT_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_ALERT_TYPE},
+ #else
+ {"UNKNOWN_ALERT_TYPE", ERR_LIB_SSL, 246},
+ #endif
+ #ifdef SSL_R_UNKNOWN_CERTIFICATE_TYPE
+ {"UNKNOWN_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE},
+ #else
+ {"UNKNOWN_CERTIFICATE_TYPE", ERR_LIB_SSL, 247},
+ #endif
+ #ifdef SSL_R_UNKNOWN_CIPHER_RETURNED
+ {"UNKNOWN_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_RETURNED},
+ #else
+ {"UNKNOWN_CIPHER_RETURNED", ERR_LIB_SSL, 248},
+ #endif
+ #ifdef SSL_R_UNKNOWN_CIPHER_TYPE
+ {"UNKNOWN_CIPHER_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_TYPE},
+ #else
+ {"UNKNOWN_CIPHER_TYPE", ERR_LIB_SSL, 249},
+ #endif
+ #ifdef SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE
+ {"UNKNOWN_KEY_EXCHANGE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE},
+ #else
+ {"UNKNOWN_KEY_EXCHANGE_TYPE", ERR_LIB_SSL, 250},
+ #endif
+ #ifdef SSL_R_UNKNOWN_PKEY_TYPE
+ {"UNKNOWN_PKEY_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_PKEY_TYPE},
+ #else
+ {"UNKNOWN_PKEY_TYPE", ERR_LIB_SSL, 251},
+ #endif
+ #ifdef SSL_R_UNKNOWN_PROTOCOL
+ {"UNKNOWN_PROTOCOL", ERR_LIB_SSL, SSL_R_UNKNOWN_PROTOCOL},
+ #else
+ {"UNKNOWN_PROTOCOL", ERR_LIB_SSL, 252},
+ #endif
+ #ifdef SSL_R_UNKNOWN_REMOTE_ERROR_TYPE
+ {"UNKNOWN_REMOTE_ERROR_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_REMOTE_ERROR_TYPE},
+ #else
+ {"UNKNOWN_REMOTE_ERROR_TYPE", ERR_LIB_SSL, 253},
+ #endif
+ #ifdef SSL_R_UNKNOWN_SSL_VERSION
+ {"UNKNOWN_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNKNOWN_SSL_VERSION},
+ #else
+ {"UNKNOWN_SSL_VERSION", ERR_LIB_SSL, 254},
+ #endif
+ #ifdef SSL_R_UNKNOWN_STATE
+ {"UNKNOWN_STATE", ERR_LIB_SSL, SSL_R_UNKNOWN_STATE},
+ #else
+ {"UNKNOWN_STATE", ERR_LIB_SSL, 255},
+ #endif
+ #ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED
+ {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", ERR_LIB_SSL, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED},
+ #else
+ {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", ERR_LIB_SSL, 338},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_CIPHER
+ {"UNSUPPORTED_CIPHER", ERR_LIB_SSL, SSL_R_UNSUPPORTED_CIPHER},
+ #else
+ {"UNSUPPORTED_CIPHER", ERR_LIB_SSL, 256},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM
+ {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM},
+ #else
+ {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_SSL, 257},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_DIGEST_TYPE
+ {"UNSUPPORTED_DIGEST_TYPE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_DIGEST_TYPE},
+ #else
+ {"UNSUPPORTED_DIGEST_TYPE", ERR_LIB_SSL, 326},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_ELLIPTIC_CURVE
+ {"UNSUPPORTED_ELLIPTIC_CURVE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE},
+ #else
+ {"UNSUPPORTED_ELLIPTIC_CURVE", ERR_LIB_SSL, 315},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_PROTOCOL
+ {"UNSUPPORTED_PROTOCOL", ERR_LIB_SSL, SSL_R_UNSUPPORTED_PROTOCOL},
+ #else
+ {"UNSUPPORTED_PROTOCOL", ERR_LIB_SSL, 258},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_SSL_VERSION
+ {"UNSUPPORTED_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNSUPPORTED_SSL_VERSION},
+ #else
+ {"UNSUPPORTED_SSL_VERSION", ERR_LIB_SSL, 259},
+ #endif
+ #ifdef SSL_R_UNSUPPORTED_STATUS_TYPE
+ {"UNSUPPORTED_STATUS_TYPE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_STATUS_TYPE},
+ #else
+ {"UNSUPPORTED_STATUS_TYPE", ERR_LIB_SSL, 329},
+ #endif
+ #ifdef SSL_R_WRITE_BIO_NOT_SET
+ {"WRITE_BIO_NOT_SET", ERR_LIB_SSL, SSL_R_WRITE_BIO_NOT_SET},
+ #else
+ {"WRITE_BIO_NOT_SET", ERR_LIB_SSL, 260},
+ #endif
+ #ifdef SSL_R_WRONG_CIPHER_RETURNED
+ {"WRONG_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_WRONG_CIPHER_RETURNED},
+ #else
+ {"WRONG_CIPHER_RETURNED", ERR_LIB_SSL, 261},
+ #endif
+ #ifdef SSL_R_WRONG_MESSAGE_TYPE
+ {"WRONG_MESSAGE_TYPE", ERR_LIB_SSL, SSL_R_WRONG_MESSAGE_TYPE},
+ #else
+ {"WRONG_MESSAGE_TYPE", ERR_LIB_SSL, 262},
+ #endif
+ #ifdef SSL_R_WRONG_NUMBER_OF_KEY_BITS
+ {"WRONG_NUMBER_OF_KEY_BITS", ERR_LIB_SSL, SSL_R_WRONG_NUMBER_OF_KEY_BITS},
+ #else
+ {"WRONG_NUMBER_OF_KEY_BITS", ERR_LIB_SSL, 263},
+ #endif
+ #ifdef SSL_R_WRONG_SIGNATURE_LENGTH
+ {"WRONG_SIGNATURE_LENGTH", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_LENGTH},
+ #else
+ {"WRONG_SIGNATURE_LENGTH", ERR_LIB_SSL, 264},
+ #endif
+ #ifdef SSL_R_WRONG_SIGNATURE_SIZE
+ {"WRONG_SIGNATURE_SIZE", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_SIZE},
+ #else
+ {"WRONG_SIGNATURE_SIZE", ERR_LIB_SSL, 265},
+ #endif
+ #ifdef SSL_R_WRONG_SSL_VERSION
+ {"WRONG_SSL_VERSION", ERR_LIB_SSL, SSL_R_WRONG_SSL_VERSION},
+ #else
+ {"WRONG_SSL_VERSION", ERR_LIB_SSL, 266},
+ #endif
+ #ifdef SSL_R_WRONG_VERSION_NUMBER
+ {"WRONG_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_WRONG_VERSION_NUMBER},
+ #else
+ {"WRONG_VERSION_NUMBER", ERR_LIB_SSL, 267},
+ #endif
+ #ifdef SSL_R_X509_LIB
+ {"X509_LIB", ERR_LIB_SSL, SSL_R_X509_LIB},
+ #else
+ {"X509_LIB", ERR_LIB_SSL, 268},
+ #endif
+ #ifdef SSL_R_X509_VERIFICATION_SETUP_PROBLEMS
+ {"X509_VERIFICATION_SETUP_PROBLEMS", ERR_LIB_SSL, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS},
+ #else
+ {"X509_VERIFICATION_SETUP_PROBLEMS", ERR_LIB_SSL, 269},
+ #endif
+ #ifdef X509_R_BAD_X509_FILETYPE
+ {"BAD_X509_FILETYPE", ERR_LIB_X509, X509_R_BAD_X509_FILETYPE},
+ #else
+ {"BAD_X509_FILETYPE", ERR_LIB_X509, 100},
+ #endif
+ #ifdef X509_R_BASE64_DECODE_ERROR
+ {"BASE64_DECODE_ERROR", ERR_LIB_X509, X509_R_BASE64_DECODE_ERROR},
+ #else
+ {"BASE64_DECODE_ERROR", ERR_LIB_X509, 118},
+ #endif
+ #ifdef X509_R_CANT_CHECK_DH_KEY
+ {"CANT_CHECK_DH_KEY", ERR_LIB_X509, X509_R_CANT_CHECK_DH_KEY},
+ #else
+ {"CANT_CHECK_DH_KEY", ERR_LIB_X509, 114},
+ #endif
+ #ifdef X509_R_CERT_ALREADY_IN_HASH_TABLE
+ {"CERT_ALREADY_IN_HASH_TABLE", ERR_LIB_X509, X509_R_CERT_ALREADY_IN_HASH_TABLE},
+ #else
+ {"CERT_ALREADY_IN_HASH_TABLE", ERR_LIB_X509, 101},
+ #endif
+ #ifdef X509_R_ERR_ASN1_LIB
+ {"ERR_ASN1_LIB", ERR_LIB_X509, X509_R_ERR_ASN1_LIB},
+ #else
+ {"ERR_ASN1_LIB", ERR_LIB_X509, 102},
+ #endif
+ #ifdef X509_R_INVALID_DIRECTORY
+ {"INVALID_DIRECTORY", ERR_LIB_X509, X509_R_INVALID_DIRECTORY},
+ #else
+ {"INVALID_DIRECTORY", ERR_LIB_X509, 113},
+ #endif
+ #ifdef X509_R_INVALID_FIELD_NAME
+ {"INVALID_FIELD_NAME", ERR_LIB_X509, X509_R_INVALID_FIELD_NAME},
+ #else
+ {"INVALID_FIELD_NAME", ERR_LIB_X509, 119},
+ #endif
+ #ifdef X509_R_INVALID_TRUST
+ {"INVALID_TRUST", ERR_LIB_X509, X509_R_INVALID_TRUST},
+ #else
+ {"INVALID_TRUST", ERR_LIB_X509, 123},
+ #endif
+ #ifdef X509_R_KEY_TYPE_MISMATCH
+ {"KEY_TYPE_MISMATCH", ERR_LIB_X509, X509_R_KEY_TYPE_MISMATCH},
+ #else
+ {"KEY_TYPE_MISMATCH", ERR_LIB_X509, 115},
+ #endif
+ #ifdef X509_R_KEY_VALUES_MISMATCH
+ {"KEY_VALUES_MISMATCH", ERR_LIB_X509, X509_R_KEY_VALUES_MISMATCH},
+ #else
+ {"KEY_VALUES_MISMATCH", ERR_LIB_X509, 116},
+ #endif
+ #ifdef X509_R_LOADING_CERT_DIR
+ {"LOADING_CERT_DIR", ERR_LIB_X509, X509_R_LOADING_CERT_DIR},
+ #else
+ {"LOADING_CERT_DIR", ERR_LIB_X509, 103},
+ #endif
+ #ifdef X509_R_LOADING_DEFAULTS
+ {"LOADING_DEFAULTS", ERR_LIB_X509, X509_R_LOADING_DEFAULTS},
+ #else
+ {"LOADING_DEFAULTS", ERR_LIB_X509, 104},
+ #endif
+ #ifdef X509_R_METHOD_NOT_SUPPORTED
+ {"METHOD_NOT_SUPPORTED", ERR_LIB_X509, X509_R_METHOD_NOT_SUPPORTED},
+ #else
+ {"METHOD_NOT_SUPPORTED", ERR_LIB_X509, 124},
+ #endif
+ #ifdef X509_R_NO_CERT_SET_FOR_US_TO_VERIFY
+ {"NO_CERT_SET_FOR_US_TO_VERIFY", ERR_LIB_X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY},
+ #else
+ {"NO_CERT_SET_FOR_US_TO_VERIFY", ERR_LIB_X509, 105},
+ #endif
+ #ifdef X509_R_PUBLIC_KEY_DECODE_ERROR
+ {"PUBLIC_KEY_DECODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_DECODE_ERROR},
+ #else
+ {"PUBLIC_KEY_DECODE_ERROR", ERR_LIB_X509, 125},
+ #endif
+ #ifdef X509_R_PUBLIC_KEY_ENCODE_ERROR
+ {"PUBLIC_KEY_ENCODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_ENCODE_ERROR},
+ #else
+ {"PUBLIC_KEY_ENCODE_ERROR", ERR_LIB_X509, 126},
+ #endif
+ #ifdef X509_R_SHOULD_RETRY
+ {"SHOULD_RETRY", ERR_LIB_X509, X509_R_SHOULD_RETRY},
+ #else
+ {"SHOULD_RETRY", ERR_LIB_X509, 106},
+ #endif
+ #ifdef X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN
+ {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", ERR_LIB_X509, X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN},
+ #else
+ {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", ERR_LIB_X509, 107},
+ #endif
+ #ifdef X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY
+ {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", ERR_LIB_X509, X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY},
+ #else
+ {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", ERR_LIB_X509, 108},
+ #endif
+ #ifdef X509_R_UNKNOWN_KEY_TYPE
+ {"UNKNOWN_KEY_TYPE", ERR_LIB_X509, X509_R_UNKNOWN_KEY_TYPE},
+ #else
+ {"UNKNOWN_KEY_TYPE", ERR_LIB_X509, 117},
+ #endif
+ #ifdef X509_R_UNKNOWN_NID
+ {"UNKNOWN_NID", ERR_LIB_X509, X509_R_UNKNOWN_NID},
+ #else
+ {"UNKNOWN_NID", ERR_LIB_X509, 109},
+ #endif
+ #ifdef X509_R_UNKNOWN_PURPOSE_ID
+ {"UNKNOWN_PURPOSE_ID", ERR_LIB_X509, X509_R_UNKNOWN_PURPOSE_ID},
+ #else
+ {"UNKNOWN_PURPOSE_ID", ERR_LIB_X509, 121},
+ #endif
+ #ifdef X509_R_UNKNOWN_TRUST_ID
+ {"UNKNOWN_TRUST_ID", ERR_LIB_X509, X509_R_UNKNOWN_TRUST_ID},
+ #else
+ {"UNKNOWN_TRUST_ID", ERR_LIB_X509, 120},
+ #endif
+ #ifdef X509_R_UNSUPPORTED_ALGORITHM
+ {"UNSUPPORTED_ALGORITHM", ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM},
+ #else
+ {"UNSUPPORTED_ALGORITHM", ERR_LIB_X509, 111},
+ #endif
+ #ifdef X509_R_WRONG_LOOKUP_TYPE
+ {"WRONG_LOOKUP_TYPE", ERR_LIB_X509, X509_R_WRONG_LOOKUP_TYPE},
+ #else
+ {"WRONG_LOOKUP_TYPE", ERR_LIB_X509, 112},
+ #endif
+ #ifdef X509_R_WRONG_TYPE
+ {"WRONG_TYPE", ERR_LIB_X509, X509_R_WRONG_TYPE},
+ #else
+ {"WRONG_TYPE", ERR_LIB_X509, 122},
+ #endif
+ { NULL }
+};
diff --git a/Modules/_struct.c b/Modules/_struct.c
index edbe9b9..0cd0512 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -58,6 +58,7 @@ typedef struct { char c; long x; } st_long;
typedef struct { char c; float x; } st_float;
typedef struct { char c; double x; } st_double;
typedef struct { char c; void *x; } st_void_p;
+typedef struct { char c; size_t x; } st_size_t;
#define SHORT_ALIGN (sizeof(st_short) - sizeof(short))
#define INT_ALIGN (sizeof(st_int) - sizeof(int))
@@ -65,6 +66,7 @@ typedef struct { char c; void *x; } st_void_p;
#define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))
#define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))
#define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))
+#define SIZE_T_ALIGN (sizeof(st_size_t) - sizeof(size_t))
/* We can't support q and Q in native mode unless the compiler does;
in std mode, they're 8 bytes on all platforms. */
@@ -213,6 +215,52 @@ get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
#endif
+/* Same, but handling Py_ssize_t */
+
+static int
+get_ssize_t(PyObject *v, Py_ssize_t *p)
+{
+ Py_ssize_t x;
+
+ v = get_pylong(v);
+ if (v == NULL)
+ return -1;
+ assert(PyLong_Check(v));
+ x = PyLong_AsSsize_t(v);
+ Py_DECREF(v);
+ if (x == (Py_ssize_t)-1 && PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError))
+ PyErr_SetString(StructError,
+ "argument out of range");
+ return -1;
+ }
+ *p = x;
+ return 0;
+}
+
+/* Same, but handling size_t */
+
+static int
+get_size_t(PyObject *v, size_t *p)
+{
+ size_t x;
+
+ v = get_pylong(v);
+ if (v == NULL)
+ return -1;
+ assert(PyLong_Check(v));
+ x = PyLong_AsSize_t(v);
+ Py_DECREF(v);
+ if (x == (size_t)-1 && PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError))
+ PyErr_SetString(StructError,
+ "argument out of range");
+ return -1;
+ }
+ *p = x;
+ return 0;
+}
+
#define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag)
@@ -369,6 +417,23 @@ nu_ulong(const char *p, const formatdef *f)
return PyLong_FromUnsignedLong(x);
}
+static PyObject *
+nu_ssize_t(const char *p, const formatdef *f)
+{
+ Py_ssize_t x;
+ memcpy((char *)&x, p, sizeof x);
+ return PyLong_FromSsize_t(x);
+}
+
+static PyObject *
+nu_size_t(const char *p, const formatdef *f)
+{
+ size_t x;
+ memcpy((char *)&x, p, sizeof x);
+ return PyLong_FromSize_t(x);
+}
+
+
/* Native mode doesn't support q or Q unless the platform C supports
long long (or, on Windows, __int64). */
@@ -558,6 +623,26 @@ np_ulong(char *p, PyObject *v, const formatdef *f)
return 0;
}
+static int
+np_ssize_t(char *p, PyObject *v, const formatdef *f)
+{
+ Py_ssize_t x;
+ if (get_ssize_t(v, &x) < 0)
+ return -1;
+ memcpy(p, (char *)&x, sizeof x);
+ return 0;
+}
+
+static int
+np_size_t(char *p, PyObject *v, const formatdef *f)
+{
+ size_t x;
+ if (get_size_t(v, &x) < 0)
+ return -1;
+ memcpy(p, (char *)&x, sizeof x);
+ return 0;
+}
+
#ifdef HAVE_LONG_LONG
static int
@@ -651,6 +736,8 @@ static formatdef native_table[] = {
{'I', sizeof(int), INT_ALIGN, nu_uint, np_uint},
{'l', sizeof(long), LONG_ALIGN, nu_long, np_long},
{'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong},
+ {'n', sizeof(size_t), SIZE_T_ALIGN, nu_ssize_t, np_ssize_t},
+ {'N', sizeof(size_t), SIZE_T_ALIGN, nu_size_t, np_size_t},
#ifdef HAVE_LONG_LONG
{'q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_longlong, np_longlong},
{'Q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},
@@ -1974,7 +2061,8 @@ these can be preceded by a decimal repeat count:\n\
l:long; L:unsigned long; f:float; d:double.\n\
Special cases (preceding decimal count indicates length):\n\
s:string (array of char); p: pascal string (with count byte).\n\
-Special case (only available in native format):\n\
+Special cases (only available in native format):\n\
+ n:ssize_t; N:size_t;\n\
P:an integer type that is wide enough to hold a pointer.\n\
Special case (not in native mode unless 'long long' in platform C):\n\
q:long long; Q:unsigned long long\n\
diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c
new file mode 100644
index 0000000..316666e
--- /dev/null
+++ b/Modules/_testbuffer.c
@@ -0,0 +1,2875 @@
+/* C Extension module to test all aspects of PEP-3118.
+ Written by Stefan Krah. */
+
+
+#define PY_SSIZE_T_CLEAN
+
+#include "Python.h"
+
+
+/* struct module */
+PyObject *structmodule = NULL;
+PyObject *Struct = NULL;
+PyObject *calcsize = NULL;
+
+/* cache simple format string */
+static const char *simple_fmt = "B";
+PyObject *simple_format = NULL;
+#define SIMPLE_FORMAT(fmt) (fmt == NULL || strcmp(fmt, "B") == 0)
+#define FIX_FORMAT(fmt) (fmt == NULL ? "B" : fmt)
+
+
+/**************************************************************************/
+/* NDArray Object */
+/**************************************************************************/
+
+static PyTypeObject NDArray_Type;
+#define NDArray_Check(v) (Py_TYPE(v) == &NDArray_Type)
+
+#define CHECK_LIST_OR_TUPLE(v) \
+ if (!PyList_Check(v) && !PyTuple_Check(v)) { \
+ PyErr_SetString(PyExc_TypeError, \
+ #v " must be a list or a tuple"); \
+ return NULL; \
+ } \
+
+#define PyMem_XFree(v) \
+ do { if (v) PyMem_Free(v); } while (0)
+
+/* Maximum number of dimensions. */
+#define ND_MAX_NDIM (2 * PyBUF_MAX_NDIM)
+
+/* Check for the presence of suboffsets in the first dimension. */
+#define HAVE_PTR(suboffsets) (suboffsets && suboffsets[0] >= 0)
+/* Adjust ptr if suboffsets are present. */
+#define ADJUST_PTR(ptr, suboffsets) \
+ (HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
+
+/* Default: NumPy style (strides), read-only, no var-export, C-style layout */
+#define ND_DEFAULT 0x000
+/* User configurable flags for the ndarray */
+#define ND_VAREXPORT 0x001 /* change layout while buffers are exported */
+/* User configurable flags for each base buffer */
+#define ND_WRITABLE 0x002 /* mark base buffer as writable */
+#define ND_FORTRAN 0x004 /* Fortran contiguous layout */
+#define ND_SCALAR 0x008 /* scalar: ndim = 0 */
+#define ND_PIL 0x010 /* convert to PIL-style array (suboffsets) */
+#define ND_REDIRECT 0x020 /* redirect buffer requests */
+#define ND_GETBUF_FAIL 0x040 /* trigger getbuffer failure */
+#define ND_GETBUF_UNDEFINED 0x080 /* undefined view.obj */
+/* Internal flags for the base buffer */
+#define ND_C 0x100 /* C contiguous layout (default) */
+#define ND_OWN_ARRAYS 0x200 /* consumer owns arrays */
+
+/* ndarray properties */
+#define ND_IS_CONSUMER(nd) \
+ (((NDArrayObject *)nd)->head == &((NDArrayObject *)nd)->staticbuf)
+
+/* ndbuf->flags properties */
+#define ND_C_CONTIGUOUS(flags) (!!(flags&(ND_SCALAR|ND_C)))
+#define ND_FORTRAN_CONTIGUOUS(flags) (!!(flags&(ND_SCALAR|ND_FORTRAN)))
+#define ND_ANY_CONTIGUOUS(flags) (!!(flags&(ND_SCALAR|ND_C|ND_FORTRAN)))
+
+/* getbuffer() requests */
+#define REQ_INDIRECT(flags) ((flags&PyBUF_INDIRECT) == PyBUF_INDIRECT)
+#define REQ_C_CONTIGUOUS(flags) ((flags&PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS)
+#define REQ_F_CONTIGUOUS(flags) ((flags&PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS)
+#define REQ_ANY_CONTIGUOUS(flags) ((flags&PyBUF_ANY_CONTIGUOUS) == PyBUF_ANY_CONTIGUOUS)
+#define REQ_STRIDES(flags) ((flags&PyBUF_STRIDES) == PyBUF_STRIDES)
+#define REQ_SHAPE(flags) ((flags&PyBUF_ND) == PyBUF_ND)
+#define REQ_WRITABLE(flags) (flags&PyBUF_WRITABLE)
+#define REQ_FORMAT(flags) (flags&PyBUF_FORMAT)
+
+
+/* Single node of a list of base buffers. The list is needed to implement
+ changes in memory layout while exported buffers are active. */
+static PyTypeObject NDArray_Type;
+
+struct ndbuf;
+typedef struct ndbuf {
+ struct ndbuf *next;
+ struct ndbuf *prev;
+ Py_ssize_t len; /* length of data */
+ Py_ssize_t offset; /* start of the array relative to data */
+ char *data; /* raw data */
+ int flags; /* capabilities of the base buffer */
+ Py_ssize_t exports; /* number of exports */
+ Py_buffer base; /* base buffer */
+} ndbuf_t;
+
+typedef struct {
+ PyObject_HEAD
+ int flags; /* ndarray flags */
+ ndbuf_t staticbuf; /* static buffer for re-exporting mode */
+ ndbuf_t *head; /* currently active base buffer */
+} NDArrayObject;
+
+
+static ndbuf_t *
+ndbuf_new(Py_ssize_t nitems, Py_ssize_t itemsize, Py_ssize_t offset, int flags)
+{
+ ndbuf_t *ndbuf;
+ Py_buffer *base;
+ Py_ssize_t len;
+
+ len = nitems * itemsize;
+ if (offset % itemsize) {
+ PyErr_SetString(PyExc_ValueError,
+ "offset must be a multiple of itemsize");
+ return NULL;
+ }
+ if (offset < 0 || offset+itemsize > len) {
+ PyErr_SetString(PyExc_ValueError, "offset out of bounds");
+ return NULL;
+ }
+
+ ndbuf = PyMem_Malloc(sizeof *ndbuf);
+ if (ndbuf == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ ndbuf->next = NULL;
+ ndbuf->prev = NULL;
+ ndbuf->len = len;
+ ndbuf->offset= offset;
+
+ ndbuf->data = PyMem_Malloc(len);
+ if (ndbuf->data == NULL) {
+ PyErr_NoMemory();
+ PyMem_Free(ndbuf);
+ return NULL;
+ }
+
+ ndbuf->flags = flags;
+ ndbuf->exports = 0;
+
+ base = &ndbuf->base;
+ base->obj = NULL;
+ base->buf = ndbuf->data;
+ base->len = len;
+ base->itemsize = 1;
+ base->readonly = 0;
+ base->format = NULL;
+ base->ndim = 1;
+ base->shape = NULL;
+ base->strides = NULL;
+ base->suboffsets = NULL;
+ base->internal = ndbuf;
+
+ return ndbuf;
+}
+
+static void
+ndbuf_free(ndbuf_t *ndbuf)
+{
+ Py_buffer *base = &ndbuf->base;
+
+ PyMem_XFree(ndbuf->data);
+ PyMem_XFree(base->format);
+ PyMem_XFree(base->shape);
+ PyMem_XFree(base->strides);
+ PyMem_XFree(base->suboffsets);
+
+ PyMem_Free(ndbuf);
+}
+
+static void
+ndbuf_push(NDArrayObject *nd, ndbuf_t *elt)
+{
+ elt->next = nd->head;
+ if (nd->head) nd->head->prev = elt;
+ nd->head = elt;
+ elt->prev = NULL;
+}
+
+static void
+ndbuf_delete(NDArrayObject *nd, ndbuf_t *elt)
+{
+ if (elt->prev)
+ elt->prev->next = elt->next;
+ else
+ nd->head = elt->next;
+
+ if (elt->next)
+ elt->next->prev = elt->prev;
+
+ ndbuf_free(elt);
+}
+
+static void
+ndbuf_pop(NDArrayObject *nd)
+{
+ ndbuf_delete(nd, nd->head);
+}
+
+
+static PyObject *
+ndarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ NDArrayObject *nd;
+
+ nd = PyObject_New(NDArrayObject, &NDArray_Type);
+ if (nd == NULL)
+ return NULL;
+
+ nd->flags = 0;
+ nd->head = NULL;
+ return (PyObject *)nd;
+}
+
+static void
+ndarray_dealloc(NDArrayObject *self)
+{
+ if (self->head) {
+ if (ND_IS_CONSUMER(self)) {
+ Py_buffer *base = &self->head->base;
+ if (self->head->flags & ND_OWN_ARRAYS) {
+ PyMem_XFree(base->shape);
+ PyMem_XFree(base->strides);
+ PyMem_XFree(base->suboffsets);
+ }
+ PyBuffer_Release(base);
+ }
+ else {
+ while (self->head)
+ ndbuf_pop(self);
+ }
+ }
+ PyObject_Del(self);
+}
+
+static int
+ndarray_init_staticbuf(PyObject *exporter, NDArrayObject *nd, int flags)
+{
+ Py_buffer *base = &nd->staticbuf.base;
+
+ if (PyObject_GetBuffer(exporter, base, flags) < 0)
+ return -1;
+
+ nd->head = &nd->staticbuf;
+
+ nd->head->next = NULL;
+ nd->head->prev = NULL;
+ nd->head->len = -1;
+ nd->head->offset = -1;
+ nd->head->data = NULL;
+
+ nd->head->flags = base->readonly ? 0 : ND_WRITABLE;
+ nd->head->exports = 0;
+
+ return 0;
+}
+
+static void
+init_flags(ndbuf_t *ndbuf)
+{
+ if (ndbuf->base.ndim == 0)
+ ndbuf->flags |= ND_SCALAR;
+ if (ndbuf->base.suboffsets)
+ ndbuf->flags |= ND_PIL;
+ if (PyBuffer_IsContiguous(&ndbuf->base, 'C'))
+ ndbuf->flags |= ND_C;
+ if (PyBuffer_IsContiguous(&ndbuf->base, 'F'))
+ ndbuf->flags |= ND_FORTRAN;
+}
+
+
+/****************************************************************************/
+/* Buffer/List conversions */
+/****************************************************************************/
+
+static Py_ssize_t *strides_from_shape(const ndbuf_t *, int flags);
+
+/* Get number of members in a struct: see issue #12740 */
+typedef struct {
+ PyObject_HEAD
+ Py_ssize_t s_size;
+ Py_ssize_t s_len;
+} PyPartialStructObject;
+
+static Py_ssize_t
+get_nmemb(PyObject *s)
+{
+ return ((PyPartialStructObject *)s)->s_len;
+}
+
+/* Pack all items into the buffer of 'obj'. The 'format' parameter must be
+ in struct module syntax. For standard C types, a single item is an integer.
+ For compound types, a single item is a tuple of integers. */
+static int
+pack_from_list(PyObject *obj, PyObject *items, PyObject *format,
+ Py_ssize_t itemsize)
+{
+ PyObject *structobj, *pack_into;
+ PyObject *args, *offset;
+ PyObject *item, *tmp;
+ Py_ssize_t nitems; /* number of items */
+ Py_ssize_t nmemb; /* number of members in a single item */
+ Py_ssize_t i, j;
+ int ret = 0;
+
+ assert(PyObject_CheckBuffer(obj));
+ assert(PyList_Check(items) || PyTuple_Check(items));
+
+ structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
+ if (structobj == NULL)
+ return -1;
+
+ nitems = PySequence_Fast_GET_SIZE(items);
+ nmemb = get_nmemb(structobj);
+ assert(nmemb >= 1);
+
+ pack_into = PyObject_GetAttrString(structobj, "pack_into");
+ if (pack_into == NULL) {
+ Py_DECREF(structobj);
+ return -1;
+ }
+
+ /* nmemb >= 1 */
+ args = PyTuple_New(2 + nmemb);
+ if (args == NULL) {
+ Py_DECREF(pack_into);
+ Py_DECREF(structobj);
+ return -1;
+ }
+
+ offset = NULL;
+ for (i = 0; i < nitems; i++) {
+ /* Loop invariant: args[j] are borrowed references or NULL. */
+ PyTuple_SET_ITEM(args, 0, obj);
+ for (j = 1; j < 2+nmemb; j++)
+ PyTuple_SET_ITEM(args, j, NULL);
+
+ Py_XDECREF(offset);
+ offset = PyLong_FromSsize_t(i*itemsize);
+ if (offset == NULL) {
+ ret = -1;
+ break;
+ }
+ PyTuple_SET_ITEM(args, 1, offset);
+
+ item = PySequence_Fast_GET_ITEM(items, i);
+ if ((PyBytes_Check(item) || PyLong_Check(item) ||
+ PyFloat_Check(item)) && nmemb == 1) {
+ PyTuple_SET_ITEM(args, 2, item);
+ }
+ else if ((PyList_Check(item) || PyTuple_Check(item)) &&
+ PySequence_Length(item) == nmemb) {
+ for (j = 0; j < nmemb; j++) {
+ tmp = PySequence_Fast_GET_ITEM(item, j);
+ PyTuple_SET_ITEM(args, 2+j, tmp);
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "mismatch between initializer element and format string");
+ ret = -1;
+ break;
+ }
+
+ tmp = PyObject_CallObject(pack_into, args);
+ if (tmp == NULL) {
+ ret = -1;
+ break;
+ }
+ Py_DECREF(tmp);
+ }
+
+ Py_INCREF(obj); /* args[0] */
+ /* args[1]: offset is either NULL or should be dealloc'd */
+ for (i = 2; i < 2+nmemb; i++) {
+ tmp = PyTuple_GET_ITEM(args, i);
+ Py_XINCREF(tmp);
+ }
+ Py_DECREF(args);
+
+ Py_DECREF(pack_into);
+ Py_DECREF(structobj);
+ return ret;
+
+}
+
+/* Pack single element */
+static int
+pack_single(char *ptr, PyObject *item, const char *fmt, Py_ssize_t itemsize)
+{
+ PyObject *structobj = NULL, *pack_into = NULL, *args = NULL;
+ PyObject *format = NULL, *mview = NULL, *zero = NULL;
+ Py_ssize_t i, nmemb;
+ int ret = -1;
+ PyObject *x;
+
+ if (fmt == NULL) fmt = "B";
+
+ format = PyUnicode_FromString(fmt);
+ if (format == NULL)
+ goto out;
+
+ structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
+ if (structobj == NULL)
+ goto out;
+
+ nmemb = get_nmemb(structobj);
+ assert(nmemb >= 1);
+
+ mview = PyMemoryView_FromMemory(ptr, itemsize, PyBUF_WRITE);
+ if (mview == NULL)
+ goto out;
+
+ zero = PyLong_FromLong(0);
+ if (zero == NULL)
+ goto out;
+
+ pack_into = PyObject_GetAttrString(structobj, "pack_into");
+ if (pack_into == NULL)
+ goto out;
+
+ args = PyTuple_New(2+nmemb);
+ if (args == NULL)
+ goto out;
+
+ PyTuple_SET_ITEM(args, 0, mview);
+ PyTuple_SET_ITEM(args, 1, zero);
+
+ if ((PyBytes_Check(item) || PyLong_Check(item) ||
+ PyFloat_Check(item)) && nmemb == 1) {
+ PyTuple_SET_ITEM(args, 2, item);
+ }
+ else if ((PyList_Check(item) || PyTuple_Check(item)) &&
+ PySequence_Length(item) == nmemb) {
+ for (i = 0; i < nmemb; i++) {
+ x = PySequence_Fast_GET_ITEM(item, i);
+ PyTuple_SET_ITEM(args, 2+i, x);
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "mismatch between initializer element and format string");
+ goto args_out;
+ }
+
+ x = PyObject_CallObject(pack_into, args);
+ if (x != NULL) {
+ Py_DECREF(x);
+ ret = 0;
+ }
+
+
+args_out:
+ for (i = 0; i < 2+nmemb; i++)
+ Py_XINCREF(PyTuple_GET_ITEM(args, i));
+ Py_XDECREF(args);
+out:
+ Py_XDECREF(pack_into);
+ Py_XDECREF(zero);
+ Py_XDECREF(mview);
+ Py_XDECREF(structobj);
+ Py_XDECREF(format);
+ return ret;
+}
+
+static void
+copy_rec(const Py_ssize_t *shape, Py_ssize_t ndim, Py_ssize_t itemsize,
+ char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets,
+ char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets,
+ char *mem)
+{
+ Py_ssize_t i;
+
+ assert(ndim >= 1);
+
+ if (ndim == 1) {
+ if (!HAVE_PTR(dsuboffsets) && !HAVE_PTR(ssuboffsets) &&
+ dstrides[0] == itemsize && sstrides[0] == itemsize) {
+ memmove(dptr, sptr, shape[0] * itemsize);
+ }
+ else {
+ char *p;
+ assert(mem != NULL);
+ for (i=0, p=mem; i<shape[0]; p+=itemsize, sptr+=sstrides[0], i++) {
+ char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
+ memcpy(p, xsptr, itemsize);
+ }
+ for (i=0, p=mem; i<shape[0]; p+=itemsize, dptr+=dstrides[0], i++) {
+ char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
+ memcpy(xdptr, p, itemsize);
+ }
+ }
+ return;
+ }
+
+ for (i = 0; i < shape[0]; dptr+=dstrides[0], sptr+=sstrides[0], i++) {
+ char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
+ char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
+
+ copy_rec(shape+1, ndim-1, itemsize,
+ xdptr, dstrides+1, dsuboffsets ? dsuboffsets+1 : NULL,
+ xsptr, sstrides+1, ssuboffsets ? ssuboffsets+1 : NULL,
+ mem);
+ }
+}
+
+static int
+cmp_structure(Py_buffer *dest, Py_buffer *src)
+{
+ Py_ssize_t i;
+
+ if (strcmp(FIX_FORMAT(dest->format), FIX_FORMAT(src->format)) != 0 ||
+ dest->itemsize != src->itemsize ||
+ dest->ndim != src->ndim)
+ return -1;
+
+ for (i = 0; i < dest->ndim; i++) {
+ if (dest->shape[i] != src->shape[i])
+ return -1;
+ if (dest->shape[i] == 0)
+ break;
+ }
+
+ return 0;
+}
+
+/* Copy src to dest. Both buffers must have the same format, itemsize,
+ ndim and shape. Copying is atomic, the function never fails with
+ a partial copy. */
+static int
+copy_buffer(Py_buffer *dest, Py_buffer *src)
+{
+ char *mem = NULL;
+
+ assert(dest->ndim > 0);
+
+ if (cmp_structure(dest, src) < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "ndarray assignment: lvalue and rvalue have different structures");
+ return -1;
+ }
+
+ if ((dest->suboffsets && dest->suboffsets[dest->ndim-1] >= 0) ||
+ (src->suboffsets && src->suboffsets[src->ndim-1] >= 0) ||
+ dest->strides[dest->ndim-1] != dest->itemsize ||
+ src->strides[src->ndim-1] != src->itemsize) {
+ mem = PyMem_Malloc(dest->shape[dest->ndim-1] * dest->itemsize);
+ if (mem == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ }
+
+ copy_rec(dest->shape, dest->ndim, dest->itemsize,
+ dest->buf, dest->strides, dest->suboffsets,
+ src->buf, src->strides, src->suboffsets,
+ mem);
+
+ PyMem_XFree(mem);
+ return 0;
+}
+
+
+/* Unpack single element */
+static PyObject *
+unpack_single(char *ptr, const char *fmt, Py_ssize_t itemsize)
+{
+ PyObject *x, *unpack_from, *mview;
+
+ if (fmt == NULL) {
+ fmt = "B";
+ itemsize = 1;
+ }
+
+ unpack_from = PyObject_GetAttrString(structmodule, "unpack_from");
+ if (unpack_from == NULL)
+ return NULL;
+
+ mview = PyMemoryView_FromMemory(ptr, itemsize, PyBUF_READ);
+ if (mview == NULL) {
+ Py_DECREF(unpack_from);
+ return NULL;
+ }
+
+ x = PyObject_CallFunction(unpack_from, "sO", fmt, mview);
+ Py_DECREF(unpack_from);
+ Py_DECREF(mview);
+ if (x == NULL)
+ return NULL;
+
+ if (PyTuple_GET_SIZE(x) == 1) {
+ PyObject *tmp = PyTuple_GET_ITEM(x, 0);
+ Py_INCREF(tmp);
+ Py_DECREF(x);
+ return tmp;
+ }
+
+ return x;
+}
+
+/* Unpack a multi-dimensional matrix into a nested list. Return a scalar
+ for ndim = 0. */
+static PyObject *
+unpack_rec(PyObject *unpack_from, char *ptr, PyObject *mview, char *item,
+ const Py_ssize_t *shape, const Py_ssize_t *strides,
+ const Py_ssize_t *suboffsets, Py_ssize_t ndim, Py_ssize_t itemsize)
+{
+ PyObject *lst, *x;
+ Py_ssize_t i;
+
+ assert(ndim >= 0);
+ assert(shape != NULL);
+ assert(strides != NULL);
+
+ if (ndim == 0) {
+ memcpy(item, ptr, itemsize);
+ x = PyObject_CallFunctionObjArgs(unpack_from, mview, NULL);
+ if (x == NULL)
+ return NULL;
+ if (PyTuple_GET_SIZE(x) == 1) {
+ PyObject *tmp = PyTuple_GET_ITEM(x, 0);
+ Py_INCREF(tmp);
+ Py_DECREF(x);
+ return tmp;
+ }
+ return x;
+ }
+
+ lst = PyList_New(shape[0]);
+ if (lst == NULL)
+ return NULL;
+
+ for (i = 0; i < shape[0]; ptr+=strides[0], i++) {
+ char *nextptr = ADJUST_PTR(ptr, suboffsets);
+
+ x = unpack_rec(unpack_from, nextptr, mview, item,
+ shape+1, strides+1, suboffsets ? suboffsets+1 : NULL,
+ ndim-1, itemsize);
+ if (x == NULL) {
+ Py_DECREF(lst);
+ return NULL;
+ }
+
+ PyList_SET_ITEM(lst, i, x);
+ }
+
+ return lst;
+}
+
+
+static PyObject *
+ndarray_as_list(NDArrayObject *nd)
+{
+ PyObject *structobj = NULL, *unpack_from = NULL;
+ PyObject *lst = NULL, *mview = NULL;
+ Py_buffer *base = &nd->head->base;
+ Py_ssize_t *shape = base->shape;
+ Py_ssize_t *strides = base->strides;
+ Py_ssize_t simple_shape[1];
+ Py_ssize_t simple_strides[1];
+ char *item = NULL;
+ PyObject *format;
+ char *fmt = base->format;
+
+ base = &nd->head->base;
+
+ if (fmt == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "ndarray: tolist() does not support format=NULL, use "
+ "tobytes()");
+ return NULL;
+ }
+ if (shape == NULL) {
+ assert(ND_C_CONTIGUOUS(nd->head->flags));
+ assert(base->strides == NULL);
+ assert(base->ndim <= 1);
+ shape = simple_shape;
+ shape[0] = base->len;
+ strides = simple_strides;
+ strides[0] = base->itemsize;
+ }
+ else if (strides == NULL) {
+ assert(ND_C_CONTIGUOUS(nd->head->flags));
+ strides = strides_from_shape(nd->head, 0);
+ if (strides == NULL)
+ return NULL;
+ }
+
+ format = PyUnicode_FromString(fmt);
+ if (format == NULL)
+ goto out;
+
+ structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
+ Py_DECREF(format);
+ if (structobj == NULL)
+ goto out;
+
+ unpack_from = PyObject_GetAttrString(structobj, "unpack_from");
+ if (unpack_from == NULL)
+ goto out;
+
+ item = PyMem_Malloc(base->itemsize);
+ if (item == NULL) {
+ PyErr_NoMemory();
+ goto out;
+ }
+
+ mview = PyMemoryView_FromMemory(item, base->itemsize, PyBUF_WRITE);
+ if (mview == NULL)
+ goto out;
+
+ lst = unpack_rec(unpack_from, base->buf, mview, item,
+ shape, strides, base->suboffsets,
+ base->ndim, base->itemsize);
+
+out:
+ Py_XDECREF(mview);
+ PyMem_XFree(item);
+ Py_XDECREF(unpack_from);
+ Py_XDECREF(structobj);
+ if (strides != base->strides && strides != simple_strides)
+ PyMem_XFree(strides);
+
+ return lst;
+}
+
+
+/****************************************************************************/
+/* Initialize ndbuf */
+/****************************************************************************/
+
+/*
+ State of a new ndbuf during initialization. 'OK' means that initialization
+ is complete. 'PTR' means that a pointer has been initialized, but the
+ state of the memory is still undefined and ndbuf->offset is disregarded.
+
+ +-----------------+-----------+-------------+----------------+
+ | | ndbuf_new | init_simple | init_structure |
+ +-----------------+-----------+-------------+----------------+
+ | next | OK (NULL) | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | prev | OK (NULL) | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | len | OK | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | offset | OK | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | data | PTR | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | flags | user | user | OK |
+ +-----------------+-----------+-------------+----------------+
+ | exports | OK (0) | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.obj | OK (NULL) | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.buf | PTR | PTR | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.len | len(data) | len(data) | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.itemsize | 1 | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.readonly | 0 | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.format | NULL | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.ndim | 1 | 1 | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.shape | NULL | NULL | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.strides | NULL | NULL | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.suboffsets | NULL | NULL | OK |
+ +-----------------+-----------+-------------+----------------+
+ | base.internal | OK | OK | OK |
+ +-----------------+-----------+-------------+----------------+
+
+*/
+
+static Py_ssize_t
+get_itemsize(PyObject *format)
+{
+ PyObject *tmp;
+ Py_ssize_t itemsize;
+
+ tmp = PyObject_CallFunctionObjArgs(calcsize, format, NULL);
+ if (tmp == NULL)
+ return -1;
+ itemsize = PyLong_AsSsize_t(tmp);
+ Py_DECREF(tmp);
+
+ return itemsize;
+}
+
+static char *
+get_format(PyObject *format)
+{
+ PyObject *tmp;
+ char *fmt;
+
+ tmp = PyUnicode_AsASCIIString(format);
+ if (tmp == NULL)
+ return NULL;
+ fmt = PyMem_Malloc(PyBytes_GET_SIZE(tmp)+1);
+ if (fmt == NULL) {
+ PyErr_NoMemory();
+ Py_DECREF(tmp);
+ return NULL;
+ }
+ strcpy(fmt, PyBytes_AS_STRING(tmp));
+ Py_DECREF(tmp);
+
+ return fmt;
+}
+
+static int
+init_simple(ndbuf_t *ndbuf, PyObject *items, PyObject *format,
+ Py_ssize_t itemsize)
+{
+ PyObject *mview;
+ Py_buffer *base = &ndbuf->base;
+ int ret;
+
+ mview = PyMemoryView_FromBuffer(base);
+ if (mview == NULL)
+ return -1;
+
+ ret = pack_from_list(mview, items, format, itemsize);
+ Py_DECREF(mview);
+ if (ret < 0)
+ return -1;
+
+ base->readonly = !(ndbuf->flags & ND_WRITABLE);
+ base->itemsize = itemsize;
+ base->format = get_format(format);
+ if (base->format == NULL)
+ return -1;
+
+ return 0;
+}
+
+static Py_ssize_t *
+seq_as_ssize_array(PyObject *seq, Py_ssize_t len, int is_shape)
+{
+ Py_ssize_t *dest;
+ Py_ssize_t x, i;
+
+ dest = PyMem_Malloc(len * (sizeof *dest));
+ if (dest == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ for (i = 0; i < len; i++) {
+ PyObject *tmp = PySequence_Fast_GET_ITEM(seq, i);
+ if (!PyLong_Check(tmp)) {
+ PyErr_Format(PyExc_ValueError,
+ "elements of %s must be integers",
+ is_shape ? "shape" : "strides");
+ PyMem_Free(dest);
+ return NULL;
+ }
+ x = PyLong_AsSsize_t(tmp);
+ if (PyErr_Occurred()) {
+ PyMem_Free(dest);
+ return NULL;
+ }
+ if (is_shape && x < 0) {
+ PyErr_Format(PyExc_ValueError,
+ "elements of shape must be integers >= 0");
+ PyMem_Free(dest);
+ return NULL;
+ }
+ dest[i] = x;
+ }
+
+ return dest;
+}
+
+static Py_ssize_t *
+strides_from_shape(const ndbuf_t *ndbuf, int flags)
+{
+ const Py_buffer *base = &ndbuf->base;
+ Py_ssize_t *s, i;
+
+ s = PyMem_Malloc(base->ndim * (sizeof *s));
+ if (s == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (flags & ND_FORTRAN) {
+ s[0] = base->itemsize;
+ for (i = 1; i < base->ndim; i++)
+ s[i] = s[i-1] * base->shape[i-1];
+ }
+ else {
+ s[base->ndim-1] = base->itemsize;
+ for (i = base->ndim-2; i >= 0; i--)
+ s[i] = s[i+1] * base->shape[i+1];
+ }
+
+ return s;
+}
+
+/* Bounds check:
+
+ len := complete length of allocated memory
+ offset := start of the array
+
+ A single array element is indexed by:
+
+ i = indices[0] * strides[0] + indices[1] * strides[1] + ...
+
+ imin is reached when all indices[n] combined with positive strides are 0
+ and all indices combined with negative strides are shape[n]-1, which is
+ the maximum index for the nth dimension.
+
+ imax is reached when all indices[n] combined with negative strides are 0
+ and all indices combined with positive strides are shape[n]-1.
+*/
+static int
+verify_structure(Py_ssize_t len, Py_ssize_t itemsize, Py_ssize_t offset,
+ const Py_ssize_t *shape, const Py_ssize_t *strides,
+ Py_ssize_t ndim)
+{
+ Py_ssize_t imin, imax;
+ Py_ssize_t n;
+
+ assert(ndim >= 0);
+
+ if (ndim == 0 && (offset < 0 || offset+itemsize > len))
+ goto invalid_combination;
+
+ for (n = 0; n < ndim; n++)
+ if (strides[n] % itemsize) {
+ PyErr_SetString(PyExc_ValueError,
+ "strides must be a multiple of itemsize");
+ return -1;
+ }
+
+ for (n = 0; n < ndim; n++)
+ if (shape[n] == 0)
+ return 0;
+
+ imin = imax = 0;
+ for (n = 0; n < ndim; n++)
+ if (strides[n] <= 0)
+ imin += (shape[n]-1) * strides[n];
+ else
+ imax += (shape[n]-1) * strides[n];
+
+ if (imin + offset < 0 || imax + offset + itemsize > len)
+ goto invalid_combination;
+
+ return 0;
+
+
+invalid_combination:
+ PyErr_SetString(PyExc_ValueError,
+ "invalid combination of buffer, shape and strides");
+ return -1;
+}
+
+/*
+ Convert a NumPy-style array to an array using suboffsets to stride in
+ the first dimension. Requirements: ndim > 0.
+
+ Contiguous example
+ ==================
+
+ Input:
+ ------
+ shape = {2, 2, 3};
+ strides = {6, 3, 1};
+ suboffsets = NULL;
+ data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ buf = &data[0]
+
+ Output:
+ -------
+ shape = {2, 2, 3};
+ strides = {sizeof(char *), 3, 1};
+ suboffsets = {0, -1, -1};
+ data = {p1, p2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ | | ^ ^
+ `---'---' |
+ | |
+ `---------------------'
+ buf = &data[0]
+
+ So, in the example the input resembles the three-dimensional array
+ char v[2][2][3], while the output resembles an array of two pointers
+ to two-dimensional arrays: char (*v[2])[2][3].
+
+
+ Non-contiguous example:
+ =======================
+
+ Input (with offset and negative strides):
+ -----------------------------------------
+ shape = {2, 2, 3};
+ strides = {-6, 3, -1};
+ offset = 8
+ suboffsets = NULL;
+ data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+
+ Output:
+ -------
+ shape = {2, 2, 3};
+ strides = {-sizeof(char *), 3, -1};
+ suboffsets = {2, -1, -1};
+ newdata = {p1, p2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ | | ^ ^ ^ ^
+ `---'---' | | `- p2+suboffsets[0]
+ | `-----------|--- p1+suboffsets[0]
+ `---------------------'
+ buf = &newdata[1] # striding backwards over the pointers.
+
+ suboffsets[0] is the same as the offset that one would specify if
+ the two {2, 3} subarrays were created directly, hence the name.
+*/
+static int
+init_suboffsets(ndbuf_t *ndbuf)
+{
+ Py_buffer *base = &ndbuf->base;
+ Py_ssize_t start, step;
+ Py_ssize_t imin, suboffset0;
+ Py_ssize_t addsize;
+ Py_ssize_t n;
+ char *data;
+
+ assert(base->ndim > 0);
+ assert(base->suboffsets == NULL);
+
+ /* Allocate new data with additional space for shape[0] pointers. */
+ addsize = base->shape[0] * (sizeof (char *));
+
+ /* Align array start to a multiple of 8. */
+ addsize = 8 * ((addsize + 7) / 8);
+
+ data = PyMem_Malloc(ndbuf->len + addsize);
+ if (data == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+
+ memcpy(data + addsize, ndbuf->data, ndbuf->len);
+
+ PyMem_Free(ndbuf->data);
+ ndbuf->data = data;
+ ndbuf->len += addsize;
+ base->buf = ndbuf->data;
+
+ /* imin: minimum index of the input array relative to ndbuf->offset.
+ suboffset0: offset for each sub-array of the output. This is the
+ same as calculating -imin' for a sub-array of ndim-1. */
+ imin = suboffset0 = 0;
+ for (n = 0; n < base->ndim; n++) {
+ if (base->shape[n] == 0)
+ break;
+ if (base->strides[n] <= 0) {
+ Py_ssize_t x = (base->shape[n]-1) * base->strides[n];
+ imin += x;
+ suboffset0 += (n >= 1) ? -x : 0;
+ }
+ }
+
+ /* Initialize the array of pointers to the sub-arrays. */
+ start = addsize + ndbuf->offset + imin;
+ step = base->strides[0] < 0 ? -base->strides[0] : base->strides[0];
+
+ for (n = 0; n < base->shape[0]; n++)
+ ((char **)base->buf)[n] = (char *)base->buf + start + n*step;
+
+ /* Initialize suboffsets. */
+ base->suboffsets = PyMem_Malloc(base->ndim * (sizeof *base->suboffsets));
+ if (base->suboffsets == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ base->suboffsets[0] = suboffset0;
+ for (n = 1; n < base->ndim; n++)
+ base->suboffsets[n] = -1;
+
+ /* Adjust strides for the first (zeroth) dimension. */
+ if (base->strides[0] >= 0) {
+ base->strides[0] = sizeof(char *);
+ }
+ else {
+ /* Striding backwards. */
+ base->strides[0] = -(Py_ssize_t)sizeof(char *);
+ if (base->shape[0] > 0)
+ base->buf = (char *)base->buf + (base->shape[0]-1) * sizeof(char *);
+ }
+
+ ndbuf->flags &= ~(ND_C|ND_FORTRAN);
+ ndbuf->offset = 0;
+ return 0;
+}
+
+static void
+init_len(Py_buffer *base)
+{
+ Py_ssize_t i;
+
+ base->len = 1;
+ for (i = 0; i < base->ndim; i++)
+ base->len *= base->shape[i];
+ base->len *= base->itemsize;
+}
+
+static int
+init_structure(ndbuf_t *ndbuf, PyObject *shape, PyObject *strides,
+ Py_ssize_t ndim)
+{
+ Py_buffer *base = &ndbuf->base;
+
+ base->ndim = (int)ndim;
+ if (ndim == 0) {
+ if (ndbuf->flags & ND_PIL) {
+ PyErr_SetString(PyExc_TypeError,
+ "ndim = 0 cannot be used in conjunction with ND_PIL");
+ return -1;
+ }
+ ndbuf->flags |= (ND_SCALAR|ND_C|ND_FORTRAN);
+ return 0;
+ }
+
+ /* shape */
+ base->shape = seq_as_ssize_array(shape, ndim, 1);
+ if (base->shape == NULL)
+ return -1;
+
+ /* strides */
+ if (strides) {
+ base->strides = seq_as_ssize_array(strides, ndim, 0);
+ }
+ else {
+ base->strides = strides_from_shape(ndbuf, ndbuf->flags);
+ }
+ if (base->strides == NULL)
+ return -1;
+ if (verify_structure(base->len, base->itemsize, ndbuf->offset,
+ base->shape, base->strides, ndim) < 0)
+ return -1;
+
+ /* buf */
+ base->buf = ndbuf->data + ndbuf->offset;
+
+ /* len */
+ init_len(base);
+
+ /* ndbuf->flags */
+ if (PyBuffer_IsContiguous(base, 'C'))
+ ndbuf->flags |= ND_C;
+ if (PyBuffer_IsContiguous(base, 'F'))
+ ndbuf->flags |= ND_FORTRAN;
+
+
+ /* convert numpy array to suboffset representation */
+ if (ndbuf->flags & ND_PIL) {
+ /* modifies base->buf, base->strides and base->suboffsets **/
+ return init_suboffsets(ndbuf);
+ }
+
+ return 0;
+}
+
+static ndbuf_t *
+init_ndbuf(PyObject *items, PyObject *shape, PyObject *strides,
+ Py_ssize_t offset, PyObject *format, int flags)
+{
+ ndbuf_t *ndbuf;
+ Py_ssize_t ndim;
+ Py_ssize_t nitems;
+ Py_ssize_t itemsize;
+
+ /* ndim = len(shape) */
+ CHECK_LIST_OR_TUPLE(shape)
+ ndim = PySequence_Fast_GET_SIZE(shape);
+ if (ndim > ND_MAX_NDIM) {
+ PyErr_Format(PyExc_ValueError,
+ "ndim must not exceed %d", ND_MAX_NDIM);
+ return NULL;
+ }
+
+ /* len(strides) = len(shape) */
+ if (strides) {
+ CHECK_LIST_OR_TUPLE(strides)
+ if (PySequence_Fast_GET_SIZE(strides) == 0)
+ strides = NULL;
+ else if (flags & ND_FORTRAN) {
+ PyErr_SetString(PyExc_TypeError,
+ "ND_FORTRAN cannot be used together with strides");
+ return NULL;
+ }
+ else if (PySequence_Fast_GET_SIZE(strides) != ndim) {
+ PyErr_SetString(PyExc_ValueError,
+ "len(shape) != len(strides)");
+ return NULL;
+ }
+ }
+
+ /* itemsize */
+ itemsize = get_itemsize(format);
+ if (itemsize <= 0) {
+ if (itemsize == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "itemsize must not be zero");
+ }
+ return NULL;
+ }
+
+ /* convert scalar to list */
+ if (ndim == 0) {
+ items = Py_BuildValue("(O)", items);
+ if (items == NULL)
+ return NULL;
+ }
+ else {
+ CHECK_LIST_OR_TUPLE(items)
+ Py_INCREF(items);
+ }
+
+ /* number of items */
+ nitems = PySequence_Fast_GET_SIZE(items);
+ if (nitems == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "initializer list or tuple must not be empty");
+ Py_DECREF(items);
+ return NULL;
+ }
+
+ ndbuf = ndbuf_new(nitems, itemsize, offset, flags);
+ if (ndbuf == NULL) {
+ Py_DECREF(items);
+ return NULL;
+ }
+
+
+ if (init_simple(ndbuf, items, format, itemsize) < 0)
+ goto error;
+ if (init_structure(ndbuf, shape, strides, ndim) < 0)
+ goto error;
+
+ Py_DECREF(items);
+ return ndbuf;
+
+error:
+ Py_DECREF(items);
+ ndbuf_free(ndbuf);
+ return NULL;
+}
+
+/* initialize and push a new base onto the linked list */
+static int
+ndarray_push_base(NDArrayObject *nd, PyObject *items,
+ PyObject *shape, PyObject *strides,
+ Py_ssize_t offset, PyObject *format, int flags)
+{
+ ndbuf_t *ndbuf;
+
+ ndbuf = init_ndbuf(items, shape, strides, offset, format, flags);
+ if (ndbuf == NULL)
+ return -1;
+
+ ndbuf_push(nd, ndbuf);
+ return 0;
+}
+
+#define PyBUF_UNUSED 0x10000
+static int
+ndarray_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ static char *kwlist[] = {
+ "obj", "shape", "strides", "offset", "format", "flags", "getbuf", NULL
+ };
+ PyObject *v = NULL; /* initializer: scalar, list, tuple or base object */
+ PyObject *shape = NULL; /* size of each dimension */
+ PyObject *strides = NULL; /* number of bytes to the next elt in each dim */
+ Py_ssize_t offset = 0; /* buffer offset */
+ PyObject *format = simple_format; /* struct module specifier: "B" */
+ int flags = ND_DEFAULT; /* base buffer and ndarray flags */
+
+ int getbuf = PyBUF_UNUSED; /* re-exporter: getbuffer request flags */
+
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOnOii", kwlist,
+ &v, &shape, &strides, &offset, &format, &flags, &getbuf))
+ return -1;
+
+ /* NDArrayObject is re-exporter */
+ if (PyObject_CheckBuffer(v) && shape == NULL) {
+ if (strides || offset || format != simple_format ||
+ !(flags == ND_DEFAULT || flags == ND_REDIRECT)) {
+ PyErr_SetString(PyExc_TypeError,
+ "construction from exporter object only takes 'obj', 'getbuf' "
+ "and 'flags' arguments");
+ return -1;
+ }
+
+ getbuf = (getbuf == PyBUF_UNUSED) ? PyBUF_FULL_RO : getbuf;
+
+ if (ndarray_init_staticbuf(v, nd, getbuf) < 0)
+ return -1;
+
+ init_flags(nd->head);
+ nd->head->flags |= flags;
+
+ return 0;
+ }
+
+ /* NDArrayObject is the original base object. */
+ if (getbuf != PyBUF_UNUSED) {
+ PyErr_SetString(PyExc_TypeError,
+ "getbuf argument only valid for construction from exporter "
+ "object");
+ return -1;
+ }
+ if (shape == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "shape is a required argument when constructing from "
+ "list, tuple or scalar");
+ return -1;
+ }
+
+ if (flags & ND_VAREXPORT) {
+ nd->flags |= ND_VAREXPORT;
+ flags &= ~ND_VAREXPORT;
+ }
+
+ /* Initialize and push the first base buffer onto the linked list. */
+ return ndarray_push_base(nd, v, shape, strides, offset, format, flags);
+}
+
+/* Push an additional base onto the linked list. */
+static PyObject *
+ndarray_push(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ static char *kwlist[] = {
+ "items", "shape", "strides", "offset", "format", "flags", NULL
+ };
+ PyObject *items = NULL; /* initializer: scalar, list or tuple */
+ PyObject *shape = NULL; /* size of each dimension */
+ PyObject *strides = NULL; /* number of bytes to the next elt in each dim */
+ PyObject *format = simple_format; /* struct module specifier: "B" */
+ Py_ssize_t offset = 0; /* buffer offset */
+ int flags = ND_DEFAULT; /* base buffer flags */
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|OnOi", kwlist,
+ &items, &shape, &strides, &offset, &format, &flags))
+ return NULL;
+
+ if (flags & ND_VAREXPORT) {
+ PyErr_SetString(PyExc_ValueError,
+ "ND_VAREXPORT flag can only be used during object creation");
+ return NULL;
+ }
+ if (ND_IS_CONSUMER(nd)) {
+ PyErr_SetString(PyExc_BufferError,
+ "structure of re-exporting object is immutable");
+ return NULL;
+ }
+ if (!(nd->flags&ND_VAREXPORT) && nd->head->exports > 0) {
+ PyErr_Format(PyExc_BufferError,
+ "cannot change structure: %zd exported buffer%s",
+ nd->head->exports, nd->head->exports==1 ? "" : "s");
+ return NULL;
+ }
+
+ if (ndarray_push_base(nd, items, shape, strides,
+ offset, format, flags) < 0)
+ return NULL;
+ Py_RETURN_NONE;
+}
+
+/* Pop a base from the linked list (if possible). */
+static PyObject *
+ndarray_pop(PyObject *self, PyObject *dummy)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ if (ND_IS_CONSUMER(nd)) {
+ PyErr_SetString(PyExc_BufferError,
+ "structure of re-exporting object is immutable");
+ return NULL;
+ }
+ if (nd->head->exports > 0) {
+ PyErr_Format(PyExc_BufferError,
+ "cannot change structure: %zd exported buffer%s",
+ nd->head->exports, nd->head->exports==1 ? "" : "s");
+ return NULL;
+ }
+ if (nd->head->next == NULL) {
+ PyErr_SetString(PyExc_BufferError,
+ "list only has a single base");
+ return NULL;
+ }
+
+ ndbuf_pop(nd);
+ Py_RETURN_NONE;
+}
+
+/**************************************************************************/
+/* getbuffer */
+/**************************************************************************/
+
+static int
+ndarray_getbuf(NDArrayObject *self, Py_buffer *view, int flags)
+{
+ ndbuf_t *ndbuf = self->head;
+ Py_buffer *base = &ndbuf->base;
+ int baseflags = ndbuf->flags;
+
+ /* redirect mode */
+ if (base->obj != NULL && (baseflags&ND_REDIRECT)) {
+ return PyObject_GetBuffer(base->obj, view, flags);
+ }
+
+ /* start with complete information */
+ *view = *base;
+ view->obj = NULL;
+
+ /* reconstruct format */
+ if (view->format == NULL)
+ view->format = "B";
+
+ if (base->ndim != 0 &&
+ ((REQ_SHAPE(flags) && base->shape == NULL) ||
+ (REQ_STRIDES(flags) && base->strides == NULL))) {
+ /* The ndarray is a re-exporter that has been created without full
+ information for testing purposes. In this particular case the
+ ndarray is not a PEP-3118 compliant buffer provider. */
+ PyErr_SetString(PyExc_BufferError,
+ "re-exporter does not provide format, shape or strides");
+ return -1;
+ }
+
+ if (baseflags & ND_GETBUF_FAIL) {
+ PyErr_SetString(PyExc_BufferError,
+ "ND_GETBUF_FAIL: forced test exception");
+ if (baseflags & ND_GETBUF_UNDEFINED)
+ view->obj = (PyObject *)0x1; /* wrong but permitted in <= 3.2 */
+ return -1;
+ }
+
+ if (REQ_WRITABLE(flags) && base->readonly) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray is not writable");
+ return -1;
+ }
+ if (!REQ_FORMAT(flags)) {
+ /* NULL indicates that the buffer's data type has been cast to 'B'.
+ view->itemsize is the _previous_ itemsize. If shape is present,
+ the equality product(shape) * itemsize = len still holds at this
+ point. The equality calcsize(format) = itemsize does _not_ hold
+ from here on! */
+ view->format = NULL;
+ }
+
+ if (REQ_C_CONTIGUOUS(flags) && !ND_C_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray is not C-contiguous");
+ return -1;
+ }
+ if (REQ_F_CONTIGUOUS(flags) && !ND_FORTRAN_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray is not Fortran contiguous");
+ return -1;
+ }
+ if (REQ_ANY_CONTIGUOUS(flags) && !ND_ANY_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray is not contiguous");
+ return -1;
+ }
+ if (!REQ_INDIRECT(flags) && (baseflags & ND_PIL)) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray cannot be represented without suboffsets");
+ return -1;
+ }
+ if (!REQ_STRIDES(flags)) {
+ if (!ND_C_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "ndarray is not C-contiguous");
+ return -1;
+ }
+ view->strides = NULL;
+ }
+ if (!REQ_SHAPE(flags)) {
+ /* PyBUF_SIMPLE or PyBUF_WRITABLE: at this point buf is C-contiguous,
+ so base->buf = ndbuf->data. */
+ if (view->format != NULL) {
+ /* PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT do
+ not make sense. */
+ PyErr_Format(PyExc_BufferError,
+ "ndarray: cannot cast to unsigned bytes if the format flag "
+ "is present");
+ return -1;
+ }
+ /* product(shape) * itemsize = len and calcsize(format) = itemsize
+ do _not_ hold from here on! */
+ view->ndim = 1;
+ view->shape = NULL;
+ }
+
+ view->obj = (PyObject *)self;
+ Py_INCREF(view->obj);
+ self->head->exports++;
+
+ return 0;
+}
+
+static int
+ndarray_releasebuf(NDArrayObject *self, Py_buffer *view)
+{
+ if (!ND_IS_CONSUMER(self)) {
+ ndbuf_t *ndbuf = view->internal;
+ if (--ndbuf->exports == 0 && ndbuf != self->head)
+ ndbuf_delete(self, ndbuf);
+ }
+
+ return 0;
+}
+
+static PyBufferProcs ndarray_as_buffer = {
+ (getbufferproc)ndarray_getbuf, /* bf_getbuffer */
+ (releasebufferproc)ndarray_releasebuf /* bf_releasebuffer */
+};
+
+
+/**************************************************************************/
+/* indexing/slicing */
+/**************************************************************************/
+
+static char *
+ptr_from_index(Py_buffer *base, Py_ssize_t index)
+{
+ char *ptr;
+ Py_ssize_t nitems; /* items in the first dimension */
+
+ if (base->shape)
+ nitems = base->shape[0];
+ else {
+ assert(base->ndim == 1 && SIMPLE_FORMAT(base->format));
+ nitems = base->len;
+ }
+
+ if (index < 0) {
+ index += nitems;
+ }
+ if (index < 0 || index >= nitems) {
+ PyErr_SetString(PyExc_IndexError, "index out of bounds");
+ return NULL;
+ }
+
+ ptr = (char *)base->buf;
+
+ if (base->strides == NULL)
+ ptr += base->itemsize * index;
+ else
+ ptr += base->strides[0] * index;
+
+ ptr = ADJUST_PTR(ptr, base->suboffsets);
+
+ return ptr;
+}
+
+static PyObject *
+ndarray_item(NDArrayObject *self, Py_ssize_t index)
+{
+ ndbuf_t *ndbuf = self->head;
+ Py_buffer *base = &ndbuf->base;
+ char *ptr;
+
+ if (base->ndim == 0) {
+ PyErr_SetString(PyExc_TypeError, "invalid indexing of scalar");
+ return NULL;
+ }
+
+ ptr = ptr_from_index(base, index);
+ if (ptr == NULL)
+ return NULL;
+
+ if (base->ndim == 1) {
+ return unpack_single(ptr, base->format, base->itemsize);
+ }
+ else {
+ NDArrayObject *nd;
+ Py_buffer *subview;
+
+ nd = (NDArrayObject *)ndarray_new(&NDArray_Type, NULL, NULL);
+ if (nd == NULL)
+ return NULL;
+
+ if (ndarray_init_staticbuf((PyObject *)self, nd, PyBUF_FULL_RO) < 0) {
+ Py_DECREF(nd);
+ return NULL;
+ }
+
+ subview = &nd->staticbuf.base;
+
+ subview->buf = ptr;
+ subview->len /= subview->shape[0];
+
+ subview->ndim--;
+ subview->shape++;
+ if (subview->strides) subview->strides++;
+ if (subview->suboffsets) subview->suboffsets++;
+
+ init_flags(&nd->staticbuf);
+
+ return (PyObject *)nd;
+ }
+}
+
+/*
+ For each dimension, we get valid (start, stop, step, slicelength) quadruples
+ from PySlice_GetIndicesEx().
+
+ Slicing NumPy arrays
+ ====================
+
+ A pointer to an element in a NumPy array is defined by:
+
+ ptr = (char *)buf + indices[0] * strides[0] +
+ ... +
+ indices[ndim-1] * strides[ndim-1]
+
+ Adjust buf:
+ -----------
+ Adding start[n] for each dimension effectively adds the constant:
+
+ c = start[0] * strides[0] + ... + start[ndim-1] * strides[ndim-1]
+
+ Therefore init_slice() adds all start[n] directly to buf.
+
+ Adjust shape:
+ -------------
+ Obviously shape[n] = slicelength[n]
+
+ Adjust strides:
+ ---------------
+ In the original array, the next element in a dimension is reached
+ by adding strides[n] to the pointer. In the sliced array, elements
+ may be skipped, so the next element is reached by adding:
+
+ strides[n] * step[n]
+
+ Slicing PIL arrays
+ ==================
+
+ Layout:
+ -------
+ In the first (zeroth) dimension, PIL arrays have an array of pointers
+ to sub-arrays of ndim-1. Striding in the first dimension is done by
+ getting the index of the nth pointer, dereference it and then add a
+ suboffset to it. The arrays pointed to can best be seen a regular
+ NumPy arrays.
+
+ Adjust buf:
+ -----------
+ In the original array, buf points to a location (usually the start)
+ in the array of pointers. For the sliced array, start[0] can be
+ added to buf in the same manner as for NumPy arrays.
+
+ Adjust suboffsets:
+ ------------------
+ Due to the dereferencing step in the addressing scheme, it is not
+ possible to adjust buf for higher dimensions. Recall that the
+ sub-arrays pointed to are regular NumPy arrays, so for each of
+ those arrays adding start[n] effectively adds the constant:
+
+ c = start[1] * strides[1] + ... + start[ndim-1] * strides[ndim-1]
+
+ This constant is added to suboffsets[0]. suboffsets[0] in turn is
+ added to each pointer right after dereferencing.
+
+ Adjust shape and strides:
+ -------------------------
+ Shape and strides are not influenced by the dereferencing step, so
+ they are adjusted in the same manner as for NumPy arrays.
+
+ Multiple levels of suboffsets
+ =============================
+
+ For a construct like an array of pointers to array of pointers to
+ sub-arrays of ndim-2:
+
+ suboffsets[0] = start[1] * strides[1]
+ suboffsets[1] = start[2] * strides[2] + ...
+*/
+static int
+init_slice(Py_buffer *base, PyObject *key, int dim)
+{
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx(key, base->shape[dim],
+ &start, &stop, &step, &slicelength) < 0) {
+ return -1;
+ }
+
+
+ if (base->suboffsets == NULL || dim == 0) {
+ adjust_buf:
+ base->buf = (char *)base->buf + base->strides[dim] * start;
+ }
+ else {
+ Py_ssize_t n = dim-1;
+ while (n >= 0 && base->suboffsets[n] < 0)
+ n--;
+ if (n < 0)
+ goto adjust_buf; /* all suboffsets are negative */
+ base->suboffsets[n] = base->suboffsets[n] + base->strides[dim] * start;
+ }
+ base->shape[dim] = slicelength;
+ base->strides[dim] = base->strides[dim] * step;
+
+ return 0;
+}
+
+static int
+copy_structure(Py_buffer *base)
+{
+ Py_ssize_t *shape = NULL, *strides = NULL, *suboffsets = NULL;
+ Py_ssize_t i;
+
+ shape = PyMem_Malloc(base->ndim * (sizeof *shape));
+ strides = PyMem_Malloc(base->ndim * (sizeof *strides));
+ if (shape == NULL || strides == NULL)
+ goto err_nomem;
+
+ suboffsets = NULL;
+ if (base->suboffsets) {
+ suboffsets = PyMem_Malloc(base->ndim * (sizeof *suboffsets));
+ if (suboffsets == NULL)
+ goto err_nomem;
+ }
+
+ for (i = 0; i < base->ndim; i++) {
+ shape[i] = base->shape[i];
+ strides[i] = base->strides[i];
+ if (suboffsets)
+ suboffsets[i] = base->suboffsets[i];
+ }
+
+ base->shape = shape;
+ base->strides = strides;
+ base->suboffsets = suboffsets;
+
+ return 0;
+
+err_nomem:
+ PyErr_NoMemory();
+ PyMem_XFree(shape);
+ PyMem_XFree(strides);
+ PyMem_XFree(suboffsets);
+ return -1;
+}
+
+static PyObject *
+ndarray_subscript(NDArrayObject *self, PyObject *key)
+{
+ NDArrayObject *nd;
+ ndbuf_t *ndbuf;
+ Py_buffer *base = &self->head->base;
+
+ if (base->ndim == 0) {
+ if (PyTuple_Check(key) && PyTuple_GET_SIZE(key) == 0) {
+ return unpack_single(base->buf, base->format, base->itemsize);
+ }
+ else if (key == Py_Ellipsis) {
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "invalid indexing of scalar");
+ return NULL;
+ }
+ }
+ if (PyIndex_Check(key)) {
+ Py_ssize_t index = PyLong_AsSsize_t(key);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ return ndarray_item(self, index);
+ }
+
+ nd = (NDArrayObject *)ndarray_new(&NDArray_Type, NULL, NULL);
+ if (nd == NULL)
+ return NULL;
+
+ /* new ndarray is a consumer */
+ if (ndarray_init_staticbuf((PyObject *)self, nd, PyBUF_FULL_RO) < 0) {
+ Py_DECREF(nd);
+ return NULL;
+ }
+
+ /* copy shape, strides and suboffsets */
+ ndbuf = nd->head;
+ base = &ndbuf->base;
+ if (copy_structure(base) < 0) {
+ Py_DECREF(nd);
+ return NULL;
+ }
+ ndbuf->flags |= ND_OWN_ARRAYS;
+
+ if (PySlice_Check(key)) {
+ /* one-dimensional slice */
+ if (init_slice(base, key, 0) < 0)
+ goto err_occurred;
+ }
+ else if PyTuple_Check(key) {
+ /* multi-dimensional slice */
+ PyObject *tuple = key;
+ Py_ssize_t i, n;
+
+ n = PyTuple_GET_SIZE(tuple);
+ for (i = 0; i < n; i++) {
+ key = PyTuple_GET_ITEM(tuple, i);
+ if (!PySlice_Check(key))
+ goto type_error;
+ if (init_slice(base, key, (int)i) < 0)
+ goto err_occurred;
+ }
+ }
+ else {
+ goto type_error;
+ }
+
+ init_len(base);
+ init_flags(ndbuf);
+
+ return (PyObject *)nd;
+
+
+type_error:
+ PyErr_Format(PyExc_TypeError,
+ "cannot index memory using \"%.200s\"",
+ key->ob_type->tp_name);
+err_occurred:
+ Py_DECREF(nd);
+ return NULL;
+}
+
+
+static int
+ndarray_ass_subscript(NDArrayObject *self, PyObject *key, PyObject *value)
+{
+ NDArrayObject *nd;
+ Py_buffer *dest = &self->head->base;
+ Py_buffer src;
+ char *ptr;
+ Py_ssize_t index;
+ int ret = -1;
+
+ if (dest->readonly) {
+ PyErr_SetString(PyExc_TypeError, "ndarray is not writable");
+ return -1;
+ }
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "ndarray data cannot be deleted");
+ return -1;
+ }
+ if (dest->ndim == 0) {
+ if (key == Py_Ellipsis ||
+ (PyTuple_Check(key) && PyTuple_GET_SIZE(key) == 0)) {
+ ptr = (char *)dest->buf;
+ return pack_single(ptr, value, dest->format, dest->itemsize);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "invalid indexing of scalar");
+ return -1;
+ }
+ }
+ if (dest->ndim == 1 && PyIndex_Check(key)) {
+ /* rvalue must be a single item */
+ index = PyLong_AsSsize_t(key);
+ if (index == -1 && PyErr_Occurred())
+ return -1;
+ else {
+ ptr = ptr_from_index(dest, index);
+ if (ptr == NULL)
+ return -1;
+ }
+ return pack_single(ptr, value, dest->format, dest->itemsize);
+ }
+
+ /* rvalue must be an exporter */
+ if (PyObject_GetBuffer(value, &src, PyBUF_FULL_RO) == -1)
+ return -1;
+
+ nd = (NDArrayObject *)ndarray_subscript(self, key);
+ if (nd != NULL) {
+ dest = &nd->head->base;
+ ret = copy_buffer(dest, &src);
+ Py_DECREF(nd);
+ }
+
+ PyBuffer_Release(&src);
+ return ret;
+}
+
+static PyObject *
+slice_indices(PyObject *self, PyObject *args)
+{
+ PyObject *ret, *key, *tmp;
+ Py_ssize_t s[4]; /* start, stop, step, slicelength */
+ Py_ssize_t i, len;
+
+ if (!PyArg_ParseTuple(args, "On", &key, &len)) {
+ return NULL;
+ }
+ if (!PySlice_Check(key)) {
+ PyErr_SetString(PyExc_TypeError,
+ "first argument must be a slice object");
+ return NULL;
+ }
+ if (PySlice_GetIndicesEx(key, len, &s[0], &s[1], &s[2], &s[3]) < 0) {
+ return NULL;
+ }
+
+ ret = PyTuple_New(4);
+ if (ret == NULL)
+ return NULL;
+
+ for (i = 0; i < 4; i++) {
+ tmp = PyLong_FromSsize_t(s[i]);
+ if (tmp == NULL)
+ goto error;
+ PyTuple_SET_ITEM(ret, i, tmp);
+ }
+
+ return ret;
+
+error:
+ Py_DECREF(ret);
+ return NULL;
+}
+
+
+static PyMappingMethods ndarray_as_mapping = {
+ NULL, /* mp_length */
+ (binaryfunc)ndarray_subscript, /* mp_subscript */
+ (objobjargproc)ndarray_ass_subscript /* mp_ass_subscript */
+};
+
+static PySequenceMethods ndarray_as_sequence = {
+ 0, /* sq_length */
+ 0, /* sq_concat */
+ 0, /* sq_repeat */
+ (ssizeargfunc)ndarray_item, /* sq_item */
+};
+
+
+/**************************************************************************/
+/* getters */
+/**************************************************************************/
+
+static PyObject *
+ssize_array_as_tuple(Py_ssize_t *array, Py_ssize_t len)
+{
+ PyObject *tuple, *x;
+ Py_ssize_t i;
+
+ if (array == NULL)
+ return PyTuple_New(0);
+
+ tuple = PyTuple_New(len);
+ if (tuple == NULL)
+ return NULL;
+
+ for (i = 0; i < len; i++) {
+ x = PyLong_FromSsize_t(array[i]);
+ if (x == NULL) {
+ Py_DECREF(tuple);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(tuple, i, x);
+ }
+
+ return tuple;
+}
+
+static PyObject *
+ndarray_get_flags(NDArrayObject *self, void *closure)
+{
+ return PyLong_FromLong(self->head->flags);
+}
+
+static PyObject *
+ndarray_get_offset(NDArrayObject *self, void *closure)
+{
+ ndbuf_t *ndbuf = self->head;
+ return PyLong_FromSsize_t(ndbuf->offset);
+}
+
+static PyObject *
+ndarray_get_obj(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+
+ if (base->obj == NULL) {
+ Py_RETURN_NONE;
+ }
+ Py_INCREF(base->obj);
+ return base->obj;
+}
+
+static PyObject *
+ndarray_get_nbytes(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return PyLong_FromSsize_t(base->len);
+}
+
+static PyObject *
+ndarray_get_readonly(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return PyLong_FromLong(base->readonly);
+}
+
+static PyObject *
+ndarray_get_itemsize(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return PyLong_FromSsize_t(base->itemsize);
+}
+
+static PyObject *
+ndarray_get_format(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ char *fmt = base->format ? base->format : "";
+ return PyUnicode_FromString(fmt);
+}
+
+static PyObject *
+ndarray_get_ndim(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return PyLong_FromSsize_t(base->ndim);
+}
+
+static PyObject *
+ndarray_get_shape(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return ssize_array_as_tuple(base->shape, base->ndim);
+}
+
+static PyObject *
+ndarray_get_strides(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return ssize_array_as_tuple(base->strides, base->ndim);
+}
+
+static PyObject *
+ndarray_get_suboffsets(NDArrayObject *self, void *closure)
+{
+ Py_buffer *base = &self->head->base;
+ return ssize_array_as_tuple(base->suboffsets, base->ndim);
+}
+
+static PyObject *
+ndarray_c_contig(PyObject *self, PyObject *dummy)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ int ret = PyBuffer_IsContiguous(&nd->head->base, 'C');
+
+ if (ret != ND_C_CONTIGUOUS(nd->head->flags)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "results from PyBuffer_IsContiguous() and flags differ");
+ return NULL;
+ }
+ return PyBool_FromLong(ret);
+}
+
+static PyObject *
+ndarray_fortran_contig(PyObject *self, PyObject *dummy)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ int ret = PyBuffer_IsContiguous(&nd->head->base, 'F');
+
+ if (ret != ND_FORTRAN_CONTIGUOUS(nd->head->flags)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "results from PyBuffer_IsContiguous() and flags differ");
+ return NULL;
+ }
+ return PyBool_FromLong(ret);
+}
+
+static PyObject *
+ndarray_contig(PyObject *self, PyObject *dummy)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ int ret = PyBuffer_IsContiguous(&nd->head->base, 'A');
+
+ if (ret != ND_ANY_CONTIGUOUS(nd->head->flags)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "results from PyBuffer_IsContiguous() and flags differ");
+ return NULL;
+ }
+ return PyBool_FromLong(ret);
+}
+
+
+static PyGetSetDef ndarray_getset [] =
+{
+ /* ndbuf */
+ { "flags", (getter)ndarray_get_flags, NULL, NULL, NULL},
+ { "offset", (getter)ndarray_get_offset, NULL, NULL, NULL},
+ /* ndbuf.base */
+ { "obj", (getter)ndarray_get_obj, NULL, NULL, NULL},
+ { "nbytes", (getter)ndarray_get_nbytes, NULL, NULL, NULL},
+ { "readonly", (getter)ndarray_get_readonly, NULL, NULL, NULL},
+ { "itemsize", (getter)ndarray_get_itemsize, NULL, NULL, NULL},
+ { "format", (getter)ndarray_get_format, NULL, NULL, NULL},
+ { "ndim", (getter)ndarray_get_ndim, NULL, NULL, NULL},
+ { "shape", (getter)ndarray_get_shape, NULL, NULL, NULL},
+ { "strides", (getter)ndarray_get_strides, NULL, NULL, NULL},
+ { "suboffsets", (getter)ndarray_get_suboffsets, NULL, NULL, NULL},
+ { "c_contiguous", (getter)ndarray_c_contig, NULL, NULL, NULL},
+ { "f_contiguous", (getter)ndarray_fortran_contig, NULL, NULL, NULL},
+ { "contiguous", (getter)ndarray_contig, NULL, NULL, NULL},
+ {NULL}
+};
+
+static PyObject *
+ndarray_tolist(PyObject *self, PyObject *dummy)
+{
+ return ndarray_as_list((NDArrayObject *)self);
+}
+
+static PyObject *
+ndarray_tobytes(PyObject *self, PyObject *dummy)
+{
+ ndbuf_t *ndbuf = ((NDArrayObject *)self)->head;
+ Py_buffer *src = &ndbuf->base;
+ Py_buffer dest;
+ PyObject *ret = NULL;
+ char *mem;
+
+ if (ND_C_CONTIGUOUS(ndbuf->flags))
+ return PyBytes_FromStringAndSize(src->buf, src->len);
+
+ assert(src->shape != NULL);
+ assert(src->strides != NULL);
+ assert(src->ndim > 0);
+
+ mem = PyMem_Malloc(src->len);
+ if (mem == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ dest = *src;
+ dest.buf = mem;
+ dest.suboffsets = NULL;
+ dest.strides = strides_from_shape(ndbuf, 0);
+ if (dest.strides == NULL)
+ goto out;
+ if (copy_buffer(&dest, src) < 0)
+ goto out;
+
+ ret = PyBytes_FromStringAndSize(mem, src->len);
+
+out:
+ PyMem_XFree(dest.strides);
+ PyMem_Free(mem);
+ return ret;
+}
+
+/* add redundant (negative) suboffsets for testing */
+static PyObject *
+ndarray_add_suboffsets(PyObject *self, PyObject *dummy)
+{
+ NDArrayObject *nd = (NDArrayObject *)self;
+ Py_buffer *base = &nd->head->base;
+ Py_ssize_t i;
+
+ if (base->suboffsets != NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "cannot add suboffsets to PIL-style array");
+ return NULL;
+ }
+ if (base->strides == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "cannot add suboffsets to array without strides");
+ return NULL;
+ }
+
+ base->suboffsets = PyMem_Malloc(base->ndim * (sizeof *base->suboffsets));
+ if (base->suboffsets == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ for (i = 0; i < base->ndim; i++)
+ base->suboffsets[i] = -1;
+
+ Py_RETURN_NONE;
+}
+
+/* Test PyMemoryView_FromBuffer(): return a memoryview from a static buffer.
+ Obviously this is fragile and only one such view may be active at any
+ time. Never use anything like this in real code! */
+static char *infobuf = NULL;
+static PyObject *
+ndarray_memoryview_from_buffer(PyObject *self, PyObject *dummy)
+{
+ const NDArrayObject *nd = (NDArrayObject *)self;
+ const Py_buffer *view = &nd->head->base;
+ const ndbuf_t *ndbuf;
+ static char format[ND_MAX_NDIM+1];
+ static Py_ssize_t shape[ND_MAX_NDIM];
+ static Py_ssize_t strides[ND_MAX_NDIM];
+ static Py_ssize_t suboffsets[ND_MAX_NDIM];
+ static Py_buffer info;
+ char *p;
+
+ if (!ND_IS_CONSUMER(nd))
+ ndbuf = nd->head; /* self is ndarray/original exporter */
+ else if (NDArray_Check(view->obj) && !ND_IS_CONSUMER(view->obj))
+ /* self is ndarray and consumer from ndarray/original exporter */
+ ndbuf = ((NDArrayObject *)view->obj)->head;
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview_from_buffer(): ndarray must be original exporter or "
+ "consumer from ndarray/original exporter");
+ return NULL;
+ }
+
+ info = *view;
+ p = PyMem_Realloc(infobuf, ndbuf->len);
+ if (p == NULL) {
+ PyMem_Free(infobuf);
+ PyErr_NoMemory();
+ infobuf = NULL;
+ return NULL;
+ }
+ else {
+ infobuf = p;
+ }
+ /* copy the complete raw data */
+ memcpy(infobuf, ndbuf->data, ndbuf->len);
+ info.buf = infobuf + ((char *)view->buf - ndbuf->data);
+
+ if (view->format) {
+ if (strlen(view->format) > ND_MAX_NDIM) {
+ PyErr_Format(PyExc_TypeError,
+ "memoryview_from_buffer: format is limited to %d characters",
+ ND_MAX_NDIM);
+ return NULL;
+ }
+ strcpy(format, view->format);
+ info.format = format;
+ }
+ if (view->ndim > ND_MAX_NDIM) {
+ PyErr_Format(PyExc_TypeError,
+ "memoryview_from_buffer: ndim is limited to %d", ND_MAX_NDIM);
+ return NULL;
+ }
+ if (view->shape) {
+ memcpy(shape, view->shape, view->ndim * sizeof(Py_ssize_t));
+ info.shape = shape;
+ }
+ if (view->strides) {
+ memcpy(strides, view->strides, view->ndim * sizeof(Py_ssize_t));
+ info.strides = strides;
+ }
+ if (view->suboffsets) {
+ memcpy(suboffsets, view->suboffsets, view->ndim * sizeof(Py_ssize_t));
+ info.suboffsets = suboffsets;
+ }
+
+ return PyMemoryView_FromBuffer(&info);
+}
+
+/* Get a single item from bufobj at the location specified by seq.
+ seq is a list or tuple of indices. The purpose of this function
+ is to check other functions against PyBuffer_GetPointer(). */
+static PyObject *
+get_pointer(PyObject *self, PyObject *args)
+{
+ PyObject *ret = NULL, *bufobj, *seq;
+ Py_buffer view;
+ Py_ssize_t indices[ND_MAX_NDIM];
+ Py_ssize_t i;
+ void *ptr;
+
+ if (!PyArg_ParseTuple(args, "OO", &bufobj, &seq)) {
+ return NULL;
+ }
+
+ CHECK_LIST_OR_TUPLE(seq);
+ if (PyObject_GetBuffer(bufobj, &view, PyBUF_FULL_RO) < 0)
+ return NULL;
+
+ if (view.ndim > ND_MAX_NDIM) {
+ PyErr_Format(PyExc_ValueError,
+ "get_pointer(): ndim > %d", ND_MAX_NDIM);
+ goto out;
+ }
+ if (PySequence_Fast_GET_SIZE(seq) != view.ndim) {
+ PyErr_SetString(PyExc_ValueError,
+ "get_pointer(): len(indices) != ndim");
+ goto out;
+ }
+
+ for (i = 0; i < view.ndim; i++) {
+ PyObject *x = PySequence_Fast_GET_ITEM(seq, i);
+ indices[i] = PyLong_AsSsize_t(x);
+ if (PyErr_Occurred())
+ goto out;
+ if (indices[i] < 0 || indices[i] >= view.shape[i]) {
+ PyErr_Format(PyExc_ValueError,
+ "get_pointer(): invalid index %zd at position %zd",
+ indices[i], i);
+ goto out;
+ }
+ }
+
+ ptr = PyBuffer_GetPointer(&view, indices);
+ ret = unpack_single(ptr, view.format, view.itemsize);
+
+out:
+ PyBuffer_Release(&view);
+ return ret;
+}
+
+static PyObject *
+get_sizeof_void_p(PyObject *self)
+{
+ return PyLong_FromSize_t(sizeof(void *));
+}
+
+static char
+get_ascii_order(PyObject *order)
+{
+ PyObject *ascii_order;
+ char ord;
+
+ if (!PyUnicode_Check(order)) {
+ PyErr_SetString(PyExc_TypeError,
+ "order must be a string");
+ return CHAR_MAX;
+ }
+
+ ascii_order = PyUnicode_AsASCIIString(order);
+ if (ascii_order == NULL) {
+ return CHAR_MAX;
+ }
+
+ ord = PyBytes_AS_STRING(ascii_order)[0];
+ Py_DECREF(ascii_order);
+
+ if (ord != 'C' && ord != 'F' && ord != 'A') {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid order, must be C, F or A");
+ return CHAR_MAX;
+ }
+
+ return ord;
+}
+
+/* Get a contiguous memoryview. */
+static PyObject *
+get_contiguous(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ PyObject *buffertype;
+ PyObject *order;
+ long type;
+ char ord;
+
+ if (!PyArg_ParseTuple(args, "OOO", &obj, &buffertype, &order)) {
+ return NULL;
+ }
+
+ if (!PyLong_Check(buffertype)) {
+ PyErr_SetString(PyExc_TypeError,
+ "buffertype must be PyBUF_READ or PyBUF_WRITE");
+ return NULL;
+ }
+
+ type = PyLong_AsLong(buffertype);
+ if (type == -1 && PyErr_Occurred()) {
+ return NULL;
+ }
+ if (type != PyBUF_READ && type != PyBUF_WRITE) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid buffer type");
+ return NULL;
+ }
+
+ ord = get_ascii_order(order);
+ if (ord == CHAR_MAX)
+ return NULL;
+
+ return PyMemoryView_GetContiguous(obj, (int)type, ord);
+}
+
+/* PyBuffer_ToContiguous() */
+static PyObject *
+py_buffer_to_contiguous(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ PyObject *order;
+ PyObject *ret = NULL;
+ int flags;
+ char ord;
+ Py_buffer view;
+ char *buf = NULL;
+
+ if (!PyArg_ParseTuple(args, "OOi", &obj, &order, &flags)) {
+ return NULL;
+ }
+
+ if (PyObject_GetBuffer(obj, &view, flags) < 0) {
+ return NULL;
+ }
+
+ ord = get_ascii_order(order);
+ if (ord == CHAR_MAX) {
+ goto out;
+ }
+
+ buf = PyMem_Malloc(view.len);
+ if (buf == NULL) {
+ PyErr_NoMemory();
+ goto out;
+ }
+
+ if (PyBuffer_ToContiguous(buf, &view, view.len, ord) < 0) {
+ goto out;
+ }
+
+ ret = PyBytes_FromStringAndSize(buf, view.len);
+
+out:
+ PyBuffer_Release(&view);
+ PyMem_XFree(buf);
+ return ret;
+}
+
+static int
+fmtcmp(const char *fmt1, const char *fmt2)
+{
+ if (fmt1 == NULL) {
+ return fmt2 == NULL || strcmp(fmt2, "B") == 0;
+ }
+ if (fmt2 == NULL) {
+ return fmt1 == NULL || strcmp(fmt1, "B") == 0;
+ }
+ return strcmp(fmt1, fmt2) == 0;
+}
+
+static int
+arraycmp(const Py_ssize_t *a1, const Py_ssize_t *a2, const Py_ssize_t *shape,
+ Py_ssize_t ndim)
+{
+ Py_ssize_t i;
+
+ if (ndim == 1 && shape && shape[0] == 1) {
+ /* This is for comparing strides: For example, the array
+ [175], shape=[1], strides=[-5] is considered contiguous. */
+ return 1;
+ }
+
+ for (i = 0; i < ndim; i++) {
+ if (a1[i] != a2[i]) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/* Compare two contiguous buffers for physical equality. */
+static PyObject *
+cmp_contig(PyObject *self, PyObject *args)
+{
+ PyObject *b1, *b2; /* buffer objects */
+ Py_buffer v1, v2;
+ PyObject *ret;
+ int equal = 0;
+
+ if (!PyArg_ParseTuple(args, "OO", &b1, &b2)) {
+ return NULL;
+ }
+
+ if (PyObject_GetBuffer(b1, &v1, PyBUF_FULL_RO) < 0) {
+ PyErr_SetString(PyExc_TypeError,
+ "cmp_contig: first argument does not implement the buffer "
+ "protocol");
+ return NULL;
+ }
+ if (PyObject_GetBuffer(b2, &v2, PyBUF_FULL_RO) < 0) {
+ PyErr_SetString(PyExc_TypeError,
+ "cmp_contig: second argument does not implement the buffer "
+ "protocol");
+ PyBuffer_Release(&v1);
+ return NULL;
+ }
+
+ if (!(PyBuffer_IsContiguous(&v1, 'C')&&PyBuffer_IsContiguous(&v2, 'C')) &&
+ !(PyBuffer_IsContiguous(&v1, 'F')&&PyBuffer_IsContiguous(&v2, 'F'))) {
+ goto result;
+ }
+
+ /* readonly may differ if created from non-contiguous */
+ if (v1.len != v2.len ||
+ v1.itemsize != v2.itemsize ||
+ v1.ndim != v2.ndim ||
+ !fmtcmp(v1.format, v2.format) ||
+ !!v1.shape != !!v2.shape ||
+ !!v1.strides != !!v2.strides ||
+ !!v1.suboffsets != !!v2.suboffsets) {
+ goto result;
+ }
+
+ if ((v1.shape && !arraycmp(v1.shape, v2.shape, NULL, v1.ndim)) ||
+ (v1.strides && !arraycmp(v1.strides, v2.strides, v1.shape, v1.ndim)) ||
+ (v1.suboffsets && !arraycmp(v1.suboffsets, v2.suboffsets, NULL,
+ v1.ndim))) {
+ goto result;
+ }
+
+ if (memcmp((char *)v1.buf, (char *)v2.buf, v1.len) != 0) {
+ goto result;
+ }
+
+ equal = 1;
+
+result:
+ PyBuffer_Release(&v1);
+ PyBuffer_Release(&v2);
+
+ ret = equal ? Py_True : Py_False;
+ Py_INCREF(ret);
+ return ret;
+}
+
+static PyObject *
+is_contiguous(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ PyObject *order;
+ PyObject *ret = NULL;
+ Py_buffer view;
+ char ord;
+
+ if (!PyArg_ParseTuple(args, "OO", &obj, &order)) {
+ return NULL;
+ }
+
+ if (PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO) < 0) {
+ PyErr_SetString(PyExc_TypeError,
+ "is_contiguous: object does not implement the buffer "
+ "protocol");
+ return NULL;
+ }
+
+ ord = get_ascii_order(order);
+ if (ord == CHAR_MAX) {
+ goto release;
+ }
+
+ ret = PyBuffer_IsContiguous(&view, ord) ? Py_True : Py_False;
+ Py_INCREF(ret);
+
+release:
+ PyBuffer_Release(&view);
+ return ret;
+}
+
+static Py_hash_t
+ndarray_hash(PyObject *self)
+{
+ const NDArrayObject *nd = (NDArrayObject *)self;
+ const Py_buffer *view = &nd->head->base;
+ PyObject *bytes;
+ Py_hash_t hash;
+
+ if (!view->readonly) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot hash writable ndarray object");
+ return -1;
+ }
+ if (view->obj != NULL && PyObject_Hash(view->obj) == -1) {
+ return -1;
+ }
+
+ bytes = ndarray_tobytes(self, NULL);
+ if (bytes == NULL) {
+ return -1;
+ }
+
+ hash = PyObject_Hash(bytes);
+ Py_DECREF(bytes);
+ return hash;
+}
+
+
+static PyMethodDef ndarray_methods [] =
+{
+ { "tolist", ndarray_tolist, METH_NOARGS, NULL },
+ { "tobytes", ndarray_tobytes, METH_NOARGS, NULL },
+ { "push", (PyCFunction)ndarray_push, METH_VARARGS|METH_KEYWORDS, NULL },
+ { "pop", ndarray_pop, METH_NOARGS, NULL },
+ { "add_suboffsets", ndarray_add_suboffsets, METH_NOARGS, NULL },
+ { "memoryview_from_buffer", ndarray_memoryview_from_buffer, METH_NOARGS, NULL },
+ {NULL}
+};
+
+static PyTypeObject NDArray_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "ndarray", /* Name of this type */
+ sizeof(NDArrayObject), /* Basic object size */
+ 0, /* Item size for varobject */
+ (destructor)ndarray_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ &ndarray_as_sequence, /* tp_as_sequence */
+ &ndarray_as_mapping, /* tp_as_mapping */
+ (hashfunc)ndarray_hash, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ &ndarray_as_buffer, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ ndarray_methods, /* tp_methods */
+ 0, /* tp_members */
+ ndarray_getset, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ ndarray_init, /* tp_init */
+ 0, /* tp_alloc */
+ ndarray_new, /* tp_new */
+};
+
+/**************************************************************************/
+/* StaticArray Object */
+/**************************************************************************/
+
+static PyTypeObject StaticArray_Type;
+
+typedef struct {
+ PyObject_HEAD
+ int legacy_mode; /* if true, use the view.obj==NULL hack */
+} StaticArrayObject;
+
+static char static_mem[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
+static Py_ssize_t static_shape[1] = {12};
+static Py_ssize_t static_strides[1] = {1};
+static Py_buffer static_buffer = {
+ static_mem, /* buf */
+ NULL, /* obj */
+ 12, /* len */
+ 1, /* itemsize */
+ 1, /* readonly */
+ 1, /* ndim */
+ "B", /* format */
+ static_shape, /* shape */
+ static_strides, /* strides */
+ NULL, /* suboffsets */
+ NULL /* internal */
+};
+
+static PyObject *
+staticarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ return (PyObject *)PyObject_New(StaticArrayObject, &StaticArray_Type);
+}
+
+static int
+staticarray_init(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ StaticArrayObject *a = (StaticArrayObject *)self;
+ static char *kwlist[] = {
+ "legacy_mode", NULL
+ };
+ PyObject *legacy_mode = Py_False;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &legacy_mode))
+ return -1;
+
+ a->legacy_mode = (legacy_mode != Py_False);
+ return 0;
+}
+
+static void
+staticarray_dealloc(StaticArrayObject *self)
+{
+ PyObject_Del(self);
+}
+
+/* Return a buffer for a PyBUF_FULL_RO request. Flags are not checked,
+ which makes this object a non-compliant exporter! */
+static int
+staticarray_getbuf(StaticArrayObject *self, Py_buffer *view, int flags)
+{
+ *view = static_buffer;
+
+ if (self->legacy_mode) {
+ view->obj = NULL; /* Don't use this in new code. */
+ }
+ else {
+ view->obj = (PyObject *)self;
+ Py_INCREF(view->obj);
+ }
+
+ return 0;
+}
+
+static PyBufferProcs staticarray_as_buffer = {
+ (getbufferproc)staticarray_getbuf, /* bf_getbuffer */
+ NULL, /* bf_releasebuffer */
+};
+
+static PyTypeObject StaticArray_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "staticarray", /* Name of this type */
+ sizeof(StaticArrayObject), /* Basic object size */
+ 0, /* Item size for varobject */
+ (destructor)staticarray_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ &staticarray_as_buffer, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ staticarray_init, /* tp_init */
+ 0, /* tp_alloc */
+ staticarray_new, /* tp_new */
+};
+
+
+static struct PyMethodDef _testbuffer_functions[] = {
+ {"slice_indices", slice_indices, METH_VARARGS, NULL},
+ {"get_pointer", get_pointer, METH_VARARGS, NULL},
+ {"get_sizeof_void_p", (PyCFunction)get_sizeof_void_p, METH_NOARGS, NULL},
+ {"get_contiguous", get_contiguous, METH_VARARGS, NULL},
+ {"py_buffer_to_contiguous", py_buffer_to_contiguous, METH_VARARGS, NULL},
+ {"is_contiguous", is_contiguous, METH_VARARGS, NULL},
+ {"cmp_contig", cmp_contig, METH_VARARGS, NULL},
+ {NULL, NULL}
+};
+
+static struct PyModuleDef _testbuffermodule = {
+ PyModuleDef_HEAD_INIT,
+ "_testbuffer",
+ NULL,
+ -1,
+ _testbuffer_functions,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+
+PyMODINIT_FUNC
+PyInit__testbuffer(void)
+{
+ PyObject *m;
+
+ m = PyModule_Create(&_testbuffermodule);
+ if (m == NULL)
+ return NULL;
+
+ Py_TYPE(&NDArray_Type) = &PyType_Type;
+ Py_INCREF(&NDArray_Type);
+ PyModule_AddObject(m, "ndarray", (PyObject *)&NDArray_Type);
+
+ Py_TYPE(&StaticArray_Type) = &PyType_Type;
+ Py_INCREF(&StaticArray_Type);
+ PyModule_AddObject(m, "staticarray", (PyObject *)&StaticArray_Type);
+
+ structmodule = PyImport_ImportModule("struct");
+ if (structmodule == NULL)
+ return NULL;
+
+ Struct = PyObject_GetAttrString(structmodule, "Struct");
+ calcsize = PyObject_GetAttrString(structmodule, "calcsize");
+ if (Struct == NULL || calcsize == NULL)
+ return NULL;
+
+ simple_format = PyUnicode_FromString(simple_fmt);
+ if (simple_format == NULL)
+ return NULL;
+
+ PyModule_AddIntConstant(m, "ND_MAX_NDIM", ND_MAX_NDIM);
+ PyModule_AddIntConstant(m, "ND_VAREXPORT", ND_VAREXPORT);
+ PyModule_AddIntConstant(m, "ND_WRITABLE", ND_WRITABLE);
+ PyModule_AddIntConstant(m, "ND_FORTRAN", ND_FORTRAN);
+ PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR);
+ PyModule_AddIntConstant(m, "ND_PIL", ND_PIL);
+ PyModule_AddIntConstant(m, "ND_GETBUF_FAIL", ND_GETBUF_FAIL);
+ PyModule_AddIntConstant(m, "ND_GETBUF_UNDEFINED", ND_GETBUF_UNDEFINED);
+ PyModule_AddIntConstant(m, "ND_REDIRECT", ND_REDIRECT);
+
+ PyModule_AddIntConstant(m, "PyBUF_SIMPLE", PyBUF_SIMPLE);
+ PyModule_AddIntConstant(m, "PyBUF_WRITABLE", PyBUF_WRITABLE);
+ PyModule_AddIntConstant(m, "PyBUF_FORMAT", PyBUF_FORMAT);
+ PyModule_AddIntConstant(m, "PyBUF_ND", PyBUF_ND);
+ PyModule_AddIntConstant(m, "PyBUF_STRIDES", PyBUF_STRIDES);
+ PyModule_AddIntConstant(m, "PyBUF_INDIRECT", PyBUF_INDIRECT);
+ PyModule_AddIntConstant(m, "PyBUF_C_CONTIGUOUS", PyBUF_C_CONTIGUOUS);
+ PyModule_AddIntConstant(m, "PyBUF_F_CONTIGUOUS", PyBUF_F_CONTIGUOUS);
+ PyModule_AddIntConstant(m, "PyBUF_ANY_CONTIGUOUS", PyBUF_ANY_CONTIGUOUS);
+ PyModule_AddIntConstant(m, "PyBUF_FULL", PyBUF_FULL);
+ PyModule_AddIntConstant(m, "PyBUF_FULL_RO", PyBUF_FULL_RO);
+ PyModule_AddIntConstant(m, "PyBUF_RECORDS", PyBUF_RECORDS);
+ PyModule_AddIntConstant(m, "PyBUF_RECORDS_RO", PyBUF_RECORDS_RO);
+ PyModule_AddIntConstant(m, "PyBUF_STRIDED", PyBUF_STRIDED);
+ PyModule_AddIntConstant(m, "PyBUF_STRIDED_RO", PyBUF_STRIDED_RO);
+ PyModule_AddIntConstant(m, "PyBUF_CONTIG", PyBUF_CONTIG);
+ PyModule_AddIntConstant(m, "PyBUF_CONTIG_RO", PyBUF_CONTIG_RO);
+
+ PyModule_AddIntConstant(m, "PyBUF_READ", PyBUF_READ);
+ PyModule_AddIntConstant(m, "PyBUF_WRITE", PyBUF_WRITE);
+
+ return m;
+}
+
+
+
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 94b6e67..2f43813 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -22,14 +22,7 @@ static PyObject *TestError; /* set to exception object in init */
static PyObject *
raiseTestError(const char* test_name, const char* msg)
{
- char buf[2048];
-
- if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
- PyErr_SetString(TestError, "internal error msg too large");
- else {
- PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
- PyErr_SetString(TestError, buf);
- }
+ PyErr_Format(TestError, "%s: %s", test_name, msg);
return NULL;
}
@@ -43,11 +36,9 @@ static PyObject*
sizeof_error(const char* fatname, const char* typname,
int expected, int got)
{
- char buf[1024];
- PyOS_snprintf(buf, sizeof(buf),
- "%.200s #define == %d but sizeof(%.200s) == %d",
+ PyErr_Format(TestError,
+ "%s #define == %d but sizeof(%s) == %d",
fatname, expected, typname, got);
- PyErr_SetString(TestError, buf);
return (PyObject*)NULL;
}
@@ -284,95 +275,6 @@ test_lazy_hash_inheritance(PyObject* self)
}
-/* Issue #7385: Check that memoryview() does not crash
- * when bf_getbuffer returns an error
- */
-
-static int
-broken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags)
-{
- PyErr_SetString(
- TestError,
- "test_broken_memoryview: expected error in bf_getbuffer");
- return -1;
-}
-
-static PyBufferProcs memoryviewtester_as_buffer = {
- (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */
- 0, /* bf_releasebuffer */
-};
-
-static PyTypeObject _MemoryViewTester_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "memoryviewtester", /* Name of this type */
- sizeof(PyObject), /* Basic object size */
- 0, /* Item size for varobject */
- (destructor)PyObject_Del, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
- 0, /* tp_setattro */
- &memoryviewtester_as_buffer, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
-};
-
-static PyObject*
-test_broken_memoryview(PyObject* self)
-{
- PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
- PyObject *res;
-
- if (obj == NULL) {
- PyErr_Clear();
- PyErr_SetString(
- TestError,
- "test_broken_memoryview: failed to create object");
- return NULL;
- }
-
- res = PyMemoryView_FromObject(obj);
- if (res || !PyErr_Occurred()){
- PyErr_SetString(
- TestError,
- "test_broken_memoryview: memoryview() didn't raise an Exception");
- Py_XDECREF(res);
- Py_DECREF(obj);
- return NULL;
- }
-
- PyErr_Clear();
- Py_DECREF(obj);
- Py_RETURN_NONE;
-}
-
-
/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
PyLong_{As, From}{Unsigned,}LongLong().
@@ -778,6 +680,68 @@ test_long_long_and_overflow(PyObject *self)
return Py_None;
}
+/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
+ non-integer arguments are handled correctly. It should be extended to
+ test overflow handling.
+ */
+
+static PyObject *
+test_long_as_size_t(PyObject *self)
+{
+ size_t out_u;
+ Py_ssize_t out_s;
+
+ Py_INCREF(Py_None);
+
+ out_u = PyLong_AsSize_t(Py_None);
+ if (out_u != (size_t)-1 || !PyErr_Occurred())
+ return raiseTestError("test_long_as_size_t",
+ "PyLong_AsSize_t(None) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return raiseTestError("test_long_as_size_t",
+ "PyLong_AsSize_t(None) raised "
+ "something other than TypeError");
+ PyErr_Clear();
+
+ out_s = PyLong_AsSsize_t(Py_None);
+ if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
+ return raiseTestError("test_long_as_size_t",
+ "PyLong_AsSsize_t(None) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return raiseTestError("test_long_as_size_t",
+ "PyLong_AsSsize_t(None) raised "
+ "something other than TypeError");
+ PyErr_Clear();
+
+ /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
+ return Py_None;
+}
+
+/* Test the PyLong_AsDouble API. At present this just tests that
+ non-integer arguments are handled correctly.
+ */
+
+static PyObject *
+test_long_as_double(PyObject *self)
+{
+ double out;
+
+ Py_INCREF(Py_None);
+
+ out = PyLong_AsDouble(Py_None);
+ if (out != -1.0 || !PyErr_Occurred())
+ return raiseTestError("test_long_as_double",
+ "PyLong_AsDouble(None) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return raiseTestError("test_long_as_double",
+ "PyLong_AsDouble(None) raised "
+ "something other than TypeError");
+ PyErr_Clear();
+
+ /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
+ return Py_None;
+}
+
/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
for both long and int arguments. The test may leak a little memory if
it fails.
@@ -837,7 +801,8 @@ getargs_tuple(PyObject *self, PyObject *args)
}
/* test PyArg_ParseTupleAndKeywords */
-static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
+static PyObject *
+getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
{
static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
static char *fmt="(ii)i|(i(ii))(iii)i";
@@ -852,6 +817,21 @@ static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwar
int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
}
+/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
+static PyObject *
+getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"required", "optional", "keyword_only", NULL};
+ int required = -1;
+ int optional = -1;
+ int keyword_only = -1;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
+ &required, &optional, &keyword_only))
+ return NULL;
+ return Py_BuildValue("iii", required, optional, keyword_only);
+}
+
/* Functions to call PyArg_ParseTuple with integer format codes,
and return the result.
*/
@@ -936,6 +916,15 @@ getargs_n(PyObject *self, PyObject *args)
return PyLong_FromSsize_t(value);
}
+static PyObject *
+getargs_p(PyObject *self, PyObject *args)
+{
+ int value;
+ if (!PyArg_ParseTuple(args, "p", &value))
+ return NULL;
+ return PyLong_FromLong(value);
+}
+
#ifdef HAVE_LONG_LONG
static PyObject *
getargs_L(PyObject *self, PyObject *args)
@@ -1012,6 +1001,15 @@ test_k_code(PyObject *self)
}
static PyObject *
+getargs_c(PyObject *self, PyObject *args)
+{
+ char c;
+ if (!PyArg_ParseTuple(args, "c", &c))
+ return NULL;
+ return PyBytes_FromStringAndSize(&c, 1);
+}
+
+static PyObject *
getargs_s(PyObject *self, PyObject *args)
{
char *str;
@@ -1197,50 +1195,72 @@ test_s_code(PyObject *self)
}
static PyObject *
-test_bug_7414(PyObject *self)
+parse_tuple_and_keywords(PyObject *self, PyObject *args)
{
- /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
- skipped properly in skipitem() */
- int a = 0, b = 0, result;
- char *kwlist[] = {"a", "b", NULL};
- PyObject *tuple = NULL, *dict = NULL, *b_str;
+ PyObject *sub_args;
+ PyObject *sub_kwargs;
+ char *sub_format;
+ PyObject *sub_keywords;
- tuple = PyTuple_New(0);
- if (tuple == NULL)
- goto failure;
- dict = PyDict_New();
- if (dict == NULL)
- goto failure;
- b_str = PyUnicode_FromString("b");
- if (b_str == NULL)
- goto failure;
- result = PyDict_SetItemString(dict, "b", b_str);
- Py_DECREF(b_str);
- if (result < 0)
- goto failure;
+ Py_ssize_t i, size;
+ char *keywords[8 + 1]; /* space for NULL at end */
+ PyObject *o;
+ PyObject *converted[8];
- result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
- kwlist, &a, &b);
- if (!result)
- goto failure;
+ int result;
+ PyObject *return_value = NULL;
- if (a != 0)
- return raiseTestError("test_bug_7414",
- "C format code not skipped properly");
- if (b != 'b')
- return raiseTestError("test_bug_7414",
- "C format code returned wrong value");
+ double buffers[8][4]; /* double ensures alignment where necessary */
- Py_DECREF(dict);
- Py_DECREF(tuple);
- Py_RETURN_NONE;
+ if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
+ &sub_args, &sub_kwargs,
+ &sub_format, &sub_keywords))
+ return NULL;
- failure:
- Py_XDECREF(dict);
- Py_XDECREF(tuple);
- return NULL;
-}
+ if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
+ return NULL;
+ }
+
+ memset(buffers, 0, sizeof(buffers));
+ memset(converted, 0, sizeof(converted));
+ memset(keywords, 0, sizeof(keywords));
+ size = PySequence_Fast_GET_SIZE(sub_keywords);
+ if (size > 8) {
+ PyErr_SetString(PyExc_ValueError,
+ "parse_tuple_and_keywords: too many keywords in sub_keywords");
+ goto exit;
+ }
+
+ for (i = 0; i < size; i++) {
+ o = PySequence_Fast_GET_ITEM(sub_keywords, i);
+ if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
+ PyErr_Format(PyExc_ValueError,
+ "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
+ goto exit;
+ }
+ keywords[i] = PyBytes_AS_STRING(converted[i]);
+ }
+
+ result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
+ sub_format, keywords,
+ buffers + 0, buffers + 1, buffers + 2, buffers + 3,
+ buffers + 4, buffers + 5, buffers + 6, buffers + 7);
+
+ if (result) {
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+ }
+
+exit:
+ size = sizeof(converted) / sizeof(converted[0]);
+ for (i = 0; i < size; i++) {
+ Py_XDECREF(converted[i]);
+ }
+ return return_value;
+}
static volatile int x;
@@ -1293,7 +1313,7 @@ static PyObject *
test_Z_code(PyObject *self)
{
PyObject *tuple, *obj;
- Py_UNICODE *value1, *value2;
+ const Py_UNICODE *value1, *value2;
Py_ssize_t len1, len2;
tuple = PyTuple_New(2);
@@ -1347,6 +1367,7 @@ test_widechar(PyObject *self)
#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
size_t wtextlen = 1;
+ const wchar_t invalid[1] = {(wchar_t)0x110000u};
#else
const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
size_t wtextlen = 2;
@@ -1363,7 +1384,7 @@ test_widechar(PyObject *self)
return NULL;
}
- if (PyUnicode_GET_SIZE(wide) != PyUnicode_GET_SIZE(utf8)) {
+ if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Py_DECREF(wide);
Py_DECREF(utf8);
return raiseTestError("test_widechar",
@@ -1382,6 +1403,23 @@ test_widechar(PyObject *self)
Py_DECREF(wide);
Py_DECREF(utf8);
+
+#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
+ wide = PyUnicode_FromWideChar(invalid, 1);
+ if (wide == NULL)
+ PyErr_Clear();
+ else
+ return raiseTestError("test_widechar",
+ "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
+
+ wide = PyUnicode_FromUnicode(invalid, 1);
+ if (wide == NULL)
+ PyErr_Clear();
+ else
+ return raiseTestError("test_widechar",
+ "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
+#endif
+
Py_RETURN_NONE;
}
@@ -1483,6 +1521,29 @@ unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
}
static PyObject *
+unicode_legacy_string(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *data;
+ Py_ssize_t len;
+ PyObject *u;
+
+ if (!PyArg_ParseTuple(args, "u#", &data, &len))
+ return NULL;
+
+ u = PyUnicode_FromUnicode(NULL, len);
+ if (u == NULL)
+ return NULL;
+
+ memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
+
+ if (len > 0) { /* The empty string is always ready. */
+ assert(!PyUnicode_IS_READY(u));
+ }
+
+ return u;
+}
+
+static PyObject *
getargs_w_star(PyObject *self, PyObject *args)
{
Py_buffer buffer;
@@ -1576,7 +1637,7 @@ test_long_numbits(PyObject *self)
{-0xfffffffL, 28, -1}};
int i;
- for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
+ for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
PyObject *plong = PyLong_FromLong(testcases[i].input);
size_t nbits = _PyLong_NumBits(plong);
int sign = _PyLong_Sign(plong);
@@ -1632,6 +1693,29 @@ raise_exception(PyObject *self, PyObject *args)
return NULL;
}
+static PyObject *
+test_set_exc_info(PyObject *self, PyObject *args)
+{
+ PyObject *orig_exc;
+ PyObject *new_type, *new_value, *new_tb;
+ PyObject *type, *value, *tb;
+ if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
+ &new_type, &new_value, &new_tb))
+ return NULL;
+
+ PyErr_GetExcInfo(&type, &value, &tb);
+
+ Py_INCREF(new_type);
+ Py_INCREF(new_value);
+ Py_INCREF(new_tb);
+ PyErr_SetExcInfo(new_type, new_value, new_tb);
+
+ orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(tb);
+ return orig_exc;
+}
static int test_run_counter = 0;
@@ -1786,13 +1870,12 @@ test_string_from_format(PyObject *self, PyObject *args)
{
PyObject *result;
char *msg;
- static const Py_UNICODE one[] = {'1', 0};
#define CHECK_1_FORMAT(FORMAT, TYPE) \
result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
if (result == NULL) \
return NULL; \
- if (Py_UNICODE_strcmp(PyUnicode_AS_UNICODE(result), one)) { \
+ if (PyUnicode_CompareWithASCIIString(result, "1")) { \
msg = FORMAT " failed at 1"; \
goto Fail; \
} \
@@ -2317,6 +2400,14 @@ run_in_subinterp(PyObject *self, PyObject *args)
PyThreadState_Swap(NULL);
substate = Py_NewInterpreter();
+ if (substate == NULL) {
+ /* Since no new thread state was created, there is no exception to
+ propagate; raise a fresh one after swapping in the old thread
+ state. */
+ PyThreadState_Swap(mainstate);
+ PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
+ return NULL;
+ }
r = PyRun_SimpleString(code);
Py_EndInterpreter(substate);
@@ -2325,6 +2416,44 @@ run_in_subinterp(PyObject *self, PyObject *args)
return PyLong_FromLong(r);
}
+static PyObject *
+test_pytime_object_to_time_t(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ if (!PyArg_ParseTuple(args, "O:pytime_object_to_time_t", &obj))
+ return NULL;
+ if (_PyTime_ObjectToTime_t(obj, &sec) == -1)
+ return NULL;
+ return _PyLong_FromTime_t(sec);
+}
+
+static PyObject *
+test_pytime_object_to_timeval(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long usec;
+ if (!PyArg_ParseTuple(args, "O:pytime_object_to_timeval", &obj))
+ return NULL;
+ if (_PyTime_ObjectToTimeval(obj, &sec, &usec) == -1)
+ return NULL;
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
+}
+
+static PyObject *
+test_pytime_object_to_timespec(PyObject *self, PyObject *args)
+{
+ PyObject *obj;
+ time_t sec;
+ long nsec;
+ if (!PyArg_ParseTuple(args, "O:pytime_object_to_timespec", &obj))
+ return NULL;
+ if (_PyTime_ObjectToTimespec(obj, &sec, &nsec) == -1)
+ return NULL;
+ return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
+}
+
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
@@ -2334,14 +2463,15 @@ static PyMethodDef TestMethods[] = {
{"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
{"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
{"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
- {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
{"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
METH_NOARGS},
+ {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
+ {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
{"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
{"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
- {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
+ {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
{"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
@@ -2352,6 +2482,8 @@ static PyMethodDef TestMethods[] = {
{"getargs_tuple", getargs_tuple, METH_VARARGS},
{"getargs_keywords", (PyCFunction)getargs_keywords,
METH_VARARGS|METH_KEYWORDS},
+ {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
+ METH_VARARGS|METH_KEYWORDS},
{"getargs_b", getargs_b, METH_VARARGS},
{"getargs_B", getargs_B, METH_VARARGS},
{"getargs_h", getargs_h, METH_VARARGS},
@@ -2361,6 +2493,7 @@ static PyMethodDef TestMethods[] = {
{"getargs_i", getargs_i, METH_VARARGS},
{"getargs_l", getargs_l, METH_VARARGS},
{"getargs_n", getargs_n, METH_VARARGS},
+ {"getargs_p", getargs_p, METH_VARARGS},
#ifdef HAVE_LONG_LONG
{"getargs_L", getargs_L, METH_VARARGS},
{"getargs_K", getargs_K, METH_VARARGS},
@@ -2369,6 +2502,7 @@ static PyMethodDef TestMethods[] = {
(PyCFunction)test_long_long_and_overflow, METH_NOARGS},
{"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
#endif
+ {"getargs_c", getargs_c, METH_VARARGS},
{"getargs_s", getargs_s, METH_VARARGS},
{"getargs_s_star", getargs_s_star, METH_VARARGS},
{"getargs_s_hash", getargs_s_hash, METH_VARARGS},
@@ -2395,6 +2529,7 @@ static PyMethodDef TestMethods[] = {
{"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
{"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
{"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
+ {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
#ifdef WITH_THREAD
{"_test_thread_state", test_thread_state, METH_VARARGS},
{"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
@@ -2404,6 +2539,7 @@ static PyMethodDef TestMethods[] = {
#endif
{"traceback_print", traceback_print, METH_VARARGS},
{"exception_print", exception_print, METH_VARARGS},
+ {"set_exc_info", test_set_exc_info, METH_VARARGS},
{"argparsing", argparsing, METH_VARARGS},
{"code_newempty", code_newempty, METH_VARARGS},
{"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
@@ -2412,6 +2548,9 @@ static PyMethodDef TestMethods[] = {
METH_NOARGS},
{"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
{"run_in_subinterp", run_in_subinterp, METH_VARARGS},
+ {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
+ {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
+ {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
{NULL, NULL} /* sentinel */
};
@@ -2594,7 +2733,6 @@ PyInit__testcapi(void)
return NULL;
Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
- Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Py_TYPE(&test_structmembersType)=&PyType_Type;
Py_INCREF(&test_structmembersType);
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 5f76a7b..63efdc3 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -23,6 +23,7 @@ typedef struct {
PyObject_HEAD
PyThread_type_lock lock_lock;
PyObject *in_weakreflist;
+ char locked; /* for sanity checking */
} lockobject;
static void
@@ -32,9 +33,8 @@ lock_dealloc(lockobject *self)
PyObject_ClearWeakRefs((PyObject *) self);
if (self->lock_lock != NULL) {
/* Unlock the lock so it's safe to free it */
- PyThread_acquire_lock(self->lock_lock, 0);
- PyThread_release_lock(self->lock_lock);
-
+ if (self->locked)
+ PyThread_release_lock(self->lock_lock);
PyThread_free_lock(self->lock_lock);
}
PyObject_Del(self);
@@ -53,6 +53,7 @@ acquire_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds)
_PyTime_timeval curtime;
_PyTime_timeval endtime;
+
if (microseconds > 0) {
_PyTime_gettimeofday(&endtime);
endtime.tv_sec += microseconds / (1000 * 1000);
@@ -61,9 +62,13 @@ acquire_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds)
do {
- Py_BEGIN_ALLOW_THREADS
- r = PyThread_acquire_lock_timed(lock, microseconds, 1);
- Py_END_ALLOW_THREADS
+ /* first a simple non-blocking try without releasing the GIL */
+ r = PyThread_acquire_lock_timed(lock, 0, 0);
+ if (r == PY_LOCK_FAILURE && microseconds != 0) {
+ Py_BEGIN_ALLOW_THREADS
+ r = PyThread_acquire_lock_timed(lock, microseconds, 1);
+ Py_END_ALLOW_THREADS
+ }
if (r == PY_LOCK_INTR) {
/* Run signal handlers if we were interrupted. Propagate
@@ -75,7 +80,7 @@ acquire_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds)
/* If we're using a timeout, recompute the timeout after processing
* signals, since those can take time. */
- if (microseconds >= 0) {
+ if (microseconds > 0) {
_PyTime_gettimeofday(&curtime);
microseconds = ((endtime.tv_sec - curtime.tv_sec) * 1000000 +
(endtime.tv_usec - curtime.tv_usec));
@@ -134,6 +139,8 @@ lock_PyThread_acquire_lock(lockobject *self, PyObject *args, PyObject *kwds)
return NULL;
}
+ if (r == PY_LOCK_ACQUIRED)
+ self->locked = 1;
return PyBool_FromLong(r == PY_LOCK_ACQUIRED);
}
@@ -152,13 +159,13 @@ static PyObject *
lock_PyThread_release_lock(lockobject *self)
{
/* Sanity check: the lock must be locked */
- if (PyThread_acquire_lock(self->lock_lock, 0)) {
- PyThread_release_lock(self->lock_lock);
+ if (!self->locked) {
PyErr_SetString(ThreadError, "release unlocked lock");
return NULL;
}
PyThread_release_lock(self->lock_lock);
+ self->locked = 0;
Py_INCREF(Py_None);
return Py_None;
}
@@ -174,11 +181,7 @@ but it needn't be locked by the same thread that unlocks it.");
static PyObject *
lock_locked_lock(lockobject *self)
{
- if (PyThread_acquire_lock(self->lock_lock, 0)) {
- PyThread_release_lock(self->lock_lock);
- return PyBool_FromLong(0L);
- }
- return PyBool_FromLong(1L);
+ return PyBool_FromLong((long)self->locked);
}
PyDoc_STRVAR(locked_doc,
@@ -312,14 +315,7 @@ rlock_acquire(rlockobject *self, PyObject *args, PyObject *kwds)
self->rlock_count = count;
Py_RETURN_TRUE;
}
-
- if (self->rlock_count > 0 ||
- !PyThread_acquire_lock(self->rlock_lock, 0)) {
- if (microseconds == 0) {
- Py_RETURN_FALSE;
- }
- r = acquire_timed(self->rlock_lock, microseconds);
- }
+ r = acquire_timed(self->rlock_lock, microseconds);
if (r == PY_LOCK_ACQUIRED) {
assert(self->rlock_count == 0);
self->rlock_owner = tid;
@@ -413,6 +409,12 @@ rlock_release_save(rlockobject *self)
long owner;
unsigned long count;
+ if (self->rlock_count == 0) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot release un-acquired lock");
+ return NULL;
+ }
+
owner = self->rlock_owner;
count = self->rlock_count;
self->rlock_count = 0;
@@ -541,6 +543,7 @@ newlockobject(void)
if (self == NULL)
return NULL;
self->lock_lock = PyThread_allocate_lock();
+ self->locked = 0;
self->in_weakreflist = NULL;
if (self->lock_lock == NULL) {
Py_DECREF(self);
@@ -1225,11 +1228,9 @@ the suggested approach in the absence of more specific information).");
static PyMethodDef thread_methods[] = {
{"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
- METH_VARARGS,
- start_new_doc},
+ METH_VARARGS, start_new_doc},
{"start_new", (PyCFunction)thread_PyThread_start_new_thread,
- METH_VARARGS,
- start_new_doc},
+ METH_VARARGS, start_new_doc},
{"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
METH_NOARGS, allocate_doc},
{"allocate", (PyCFunction)thread_PyThread_allocate_lock,
@@ -1245,8 +1246,7 @@ static PyMethodDef thread_methods[] = {
{"_count", (PyCFunction)thread__count,
METH_NOARGS, _count_doc},
{"stack_size", (PyCFunction)thread_stack_size,
- METH_VARARGS,
- stack_size_doc},
+ METH_VARARGS, stack_size_doc},
{NULL, NULL} /* sentinel */
};
@@ -1310,7 +1310,9 @@ PyInit__thread(void)
/* Add a symbolic constant */
d = PyModule_GetDict(m);
- ThreadError = PyErr_NewException("_thread.error", NULL, NULL);
+ ThreadError = PyExc_RuntimeError;
+ Py_INCREF(ThreadError);
+
PyDict_SetItemString(d, "error", ThreadError);
Locktype.tp_doc = lock_doc;
Py_INCREF(&Locktype);
diff --git a/Modules/_time.c b/Modules/_time.c
deleted file mode 100644
index 10cc8e1..0000000
--- a/Modules/_time.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "Python.h"
-#include "_time.h"
-
-/* Exposed in timefuncs.h. */
-time_t
-_PyTime_DoubleToTimet(double x)
-{
- time_t result;
- double diff;
-
- result = (time_t)x;
- /* How much info did we lose? time_t may be an integral or
- * floating type, and we don't know which. If it's integral,
- * we don't know whether C truncates, rounds, returns the floor,
- * etc. If we lost a second or more, the C rounding is
- * unreasonable, or the input just doesn't fit in a time_t;
- * call it an error regardless. Note that the original cast to
- * time_t can cause a C error too, but nothing we can do to
- * work around that.
- */
- diff = x - (double)result;
- if (diff <= -1.0 || diff >= 1.0) {
- PyErr_SetString(PyExc_ValueError,
- "timestamp out of range for platform time_t");
- result = (time_t)-1;
- }
- return result;
-}
diff --git a/Modules/_time.h b/Modules/_time.h
deleted file mode 100644
index 816593b..0000000
--- a/Modules/_time.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* XXX: It is probably best to move timefuncs.h content in here, and
- remove it but user code may rely on it. */
-#include "timefuncs.h"
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 23906de..70f4703 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -80,18 +80,6 @@ Copyright (C) 1994 Steen Lumholt.
#error "Tk older than 8.3.1 not supported"
#endif
-/* Unicode conversion assumes that Tcl_UniChar is two bytes.
- We cannot test this directly, so we test UTF-8 size instead,
- expecting that TCL_UTF_MAX is changed if Tcl ever supports
- either UTF-16 or UCS-4.
- Redhat 8 sets TCL_UTF_MAX to 6, and uses wchar_t for
- Tcl_Unichar. This is also ok as long as Python uses UCS-4,
- as well.
-*/
-#if TCL_UTF_MAX != 3 && !(defined(Py_UNICODE_WIDE) && TCL_UTF_MAX==6)
-#error "unsupported Tcl configuration"
-#endif
-
#if !(defined(MS_WINDOWS) || defined(__CYGWIN__))
#define HAVE_CREATEFILEHANDLER
#endif
@@ -975,40 +963,46 @@ AsObj(PyObject *value)
return result;
}
else if (PyUnicode_Check(value)) {
- Py_UNICODE *inbuf = PyUnicode_AS_UNICODE(value);
- Py_ssize_t size = PyUnicode_GET_SIZE(value);
- /* This #ifdef assumes that Tcl uses UCS-2.
- See TCL_UTF_MAX test above. */
-#if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX == 3
+ void *inbuf;
+ Py_ssize_t size;
+ int kind;
Tcl_UniChar *outbuf = NULL;
Py_ssize_t i;
- size_t allocsize = ((size_t)size) * sizeof(Tcl_UniChar);
- if (allocsize >= size)
- outbuf = (Tcl_UniChar*)ckalloc(allocsize);
+ size_t allocsize;
+
+ if (PyUnicode_READY(value) == -1)
+ return NULL;
+
+ inbuf = PyUnicode_DATA(value);
+ size = PyUnicode_GET_LENGTH(value);
+ kind = PyUnicode_KIND(value);
+ allocsize = ((size_t)size) * sizeof(Tcl_UniChar);
+ outbuf = (Tcl_UniChar*)ckalloc(allocsize);
/* Else overflow occurred, and we take the next exit */
if (!outbuf) {
PyErr_NoMemory();
return NULL;
}
for (i = 0; i < size; i++) {
- if (inbuf[i] >= 0x10000) {
+ Py_UCS4 ch = PyUnicode_READ(kind, inbuf, i);
+ /* We cannot test for sizeof(Tcl_UniChar) directly,
+ so we test for UTF-8 size instead. */
+#if TCL_UTF_MAX == 3
+ if (ch >= 0x10000) {
/* Tcl doesn't do UTF-16, yet. */
PyErr_Format(PyExc_ValueError,
"character U+%x is above the range "
"(U+0000-U+FFFF) allowed by Tcl",
- inbuf[i]);
+ ch);
ckfree(FREECAST outbuf);
return NULL;
}
- outbuf[i] = inbuf[i];
+#endif
+ outbuf[i] = ch;
}
result = Tcl_NewUnicodeObj(outbuf, size);
ckfree(FREECAST outbuf);
return result;
-#else
- return Tcl_NewUnicodeObj(inbuf, size);
-#endif
-
}
else if(PyTclObject_Check(value)) {
Tcl_Obj *v = ((PyTclObject*)value)->value;
@@ -1090,24 +1084,14 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
}
if (value->typePtr == app->StringType) {
-#if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX==3
- PyObject *result;
- int size;
- Tcl_UniChar *input;
- Py_UNICODE *output;
-
- size = Tcl_GetCharLength(value);
- result = PyUnicode_FromUnicode(NULL, size);
- if (!result)
- return NULL;
- input = Tcl_GetUnicode(value);
- output = PyUnicode_AS_UNICODE(result);
- while (size--)
- *output++ = *input++;
- return result;
+#if TCL_UTF_MAX==3
+ return PyUnicode_FromKindAndData(
+ PyUnicode_2BYTE_KIND, Tcl_GetUnicode(value),
+ Tcl_GetCharLength(value));
#else
- return PyUnicode_FromUnicode(Tcl_GetUnicode(value),
- Tcl_GetCharLength(value));
+ return PyUnicode_FromKindAndData(
+ PyUnicode_4BYTE_KIND, Tcl_GetUnicode(value),
+ Tcl_GetCharLength(value));
#endif
}
@@ -1359,6 +1343,11 @@ Tkapp_GlobalCall(PyObject *self, PyObject *args)
char *cmd;
PyObject *res = NULL;
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "globalcall is deprecated and will be removed in 3.4",
+ 1) < 0)
+ return 0;
+
CHECK_TCL_APPARTMENT;
cmd = Merge(args);
@@ -1408,6 +1397,11 @@ Tkapp_GlobalEval(PyObject *self, PyObject *args)
PyObject *res = NULL;
int err;
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "globaleval is deprecated and will be removed in 3.4",
+ 1) < 0)
+ return 0;
+
if (!PyArg_ParseTuple(args, "s:globaleval", &script))
return NULL;
@@ -1970,9 +1964,16 @@ Tkapp_Split(PyObject *self, PyObject *args)
static PyObject *
Tkapp_Merge(PyObject *self, PyObject *args)
{
- char *s = Merge(args);
+ char *s;
PyObject *res = NULL;
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "merge is deprecated and will be removed in 3.4",
+ 1) < 0)
+ return 0;
+
+ s = Merge(args);
+
if (s) {
res = PyUnicode_FromString(s);
ckfree(s);
@@ -2007,7 +2008,7 @@ static int
PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
{
PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData;
- PyObject *self, *func, *arg, *res;
+ PyObject *func, *arg, *res;
int i, rv;
Tcl_Obj *obj_res;
@@ -2016,7 +2017,6 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
/* TBD: no error checking here since we know, via the
* Tkapp_CreateCommand() that the client data is a two-tuple
*/
- self = data->self;
func = data->func;
/* Create argument list (argv1, ..., argvN) */
@@ -2415,11 +2415,9 @@ static PyObject *
Tktt_Repr(PyObject *self)
{
TkttObject *v = (TkttObject *)self;
- char buf[100];
-
- PyOS_snprintf(buf, sizeof(buf), "<tktimertoken at %p%s>", v,
- v->func == NULL ? ", handler deleted" : "");
- return PyUnicode_FromString(buf);
+ return PyUnicode_FromFormat("<tktimertoken at %p%s>",
+ v,
+ v->func == NULL ? ", handler deleted" : "");
}
static PyTypeObject Tktt_Type =
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
new file mode 100644
index 0000000..1074891
--- /dev/null
+++ b/Modules/_winapi.c
@@ -0,0 +1,1328 @@
+/*
+ * Support routines from the Windows API
+ *
+ * This module was originally created by merging PC/_subprocess.c with
+ * Modules/_multiprocessing/win32_functions.c.
+ *
+ * Copyright (c) 2004 by Fredrik Lundh <fredrik@pythonware.com>
+ * Copyright (c) 2004 by Secret Labs AB, http://www.pythonware.com
+ * Copyright (c) 2004 by Peter Astrand <astrand@lysator.liu.se>
+ *
+ * By obtaining, using, and/or copying this software and/or its
+ * associated documentation, you agree that you have read, understood,
+ * and will comply with the following terms and conditions:
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its associated documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appears in
+ * all copies, and that both that copyright notice and this permission
+ * notice appear in supporting documentation, and that the name of the
+ * authors not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/* Licensed to PSF under a Contributor Agreement. */
+/* See http://www.python.org/2.4/license for licensing details. */
+
+#include "Python.h"
+#include "structmember.h"
+
+#define WINDOWS_LEAN_AND_MEAN
+#include "windows.h"
+#include <crtdbg.h>
+
+#if defined(MS_WIN32) && !defined(MS_WIN64)
+#define HANDLE_TO_PYNUM(handle) \
+ PyLong_FromUnsignedLong((unsigned long) handle)
+#define PYNUM_TO_HANDLE(obj) ((HANDLE)PyLong_AsUnsignedLong(obj))
+#define F_POINTER "k"
+#define T_POINTER T_ULONG
+#else
+#define HANDLE_TO_PYNUM(handle) \
+ PyLong_FromUnsignedLongLong((unsigned long long) handle)
+#define PYNUM_TO_HANDLE(obj) ((HANDLE)PyLong_AsUnsignedLongLong(obj))
+#define F_POINTER "K"
+#define T_POINTER T_ULONGLONG
+#endif
+
+#define F_HANDLE F_POINTER
+#define F_DWORD "k"
+#define F_BOOL "i"
+#define F_UINT "I"
+
+#define T_HANDLE T_POINTER
+
+/* Grab CancelIoEx dynamically from kernel32 */
+static int has_CancelIoEx = -1;
+static BOOL (CALLBACK *Py_CancelIoEx)(HANDLE, LPOVERLAPPED);
+
+static int
+check_CancelIoEx()
+{
+ if (has_CancelIoEx == -1)
+ {
+ HINSTANCE hKernel32 = GetModuleHandle("KERNEL32");
+ * (FARPROC *) &Py_CancelIoEx = GetProcAddress(hKernel32,
+ "CancelIoEx");
+ has_CancelIoEx = (Py_CancelIoEx != NULL);
+ }
+ return has_CancelIoEx;
+}
+
+
+/*
+ * A Python object wrapping an OVERLAPPED structure and other useful data
+ * for overlapped I/O
+ */
+
+typedef struct {
+ PyObject_HEAD
+ OVERLAPPED overlapped;
+ /* For convenience, we store the file handle too */
+ HANDLE handle;
+ /* Whether there's I/O in flight */
+ int pending;
+ /* Whether I/O completed successfully */
+ int completed;
+ /* Buffer used for reading (optional) */
+ PyObject *read_buffer;
+ /* Buffer used for writing (optional) */
+ Py_buffer write_buffer;
+} OverlappedObject;
+
+static void
+overlapped_dealloc(OverlappedObject *self)
+{
+ DWORD bytes;
+ int err = GetLastError();
+ if (self->pending) {
+ /* make it a programming error to deallocate while operation
+ is pending, even if we can safely cancel it */
+ if (check_CancelIoEx() &&
+ Py_CancelIoEx(self->handle, &self->overlapped))
+ GetOverlappedResult(self->handle, &self->overlapped, &bytes, TRUE);
+ PyErr_SetString(PyExc_RuntimeError,
+ "I/O operations still in flight while destroying "
+ "Overlapped object, the process may crash");
+ PyErr_WriteUnraisable(NULL);
+ }
+ CloseHandle(self->overlapped.hEvent);
+ SetLastError(err);
+ if (self->write_buffer.obj)
+ PyBuffer_Release(&self->write_buffer);
+ Py_CLEAR(self->read_buffer);
+ PyObject_Del(self);
+}
+
+static PyObject *
+overlapped_GetOverlappedResult(OverlappedObject *self, PyObject *waitobj)
+{
+ int wait;
+ BOOL res;
+ DWORD transferred = 0;
+ DWORD err;
+
+ wait = PyObject_IsTrue(waitobj);
+ if (wait < 0)
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+ res = GetOverlappedResult(self->handle, &self->overlapped, &transferred,
+ wait != 0);
+ Py_END_ALLOW_THREADS
+
+ err = res ? ERROR_SUCCESS : GetLastError();
+ switch (err) {
+ case ERROR_SUCCESS:
+ case ERROR_MORE_DATA:
+ case ERROR_OPERATION_ABORTED:
+ self->completed = 1;
+ self->pending = 0;
+ break;
+ case ERROR_IO_INCOMPLETE:
+ break;
+ default:
+ self->pending = 0;
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, err);
+ }
+ if (self->completed && self->read_buffer != NULL) {
+ assert(PyBytes_CheckExact(self->read_buffer));
+ if (transferred != PyBytes_GET_SIZE(self->read_buffer) &&
+ _PyBytes_Resize(&self->read_buffer, transferred))
+ return NULL;
+ }
+ return Py_BuildValue("II", (unsigned) transferred, (unsigned) err);
+}
+
+static PyObject *
+overlapped_getbuffer(OverlappedObject *self)
+{
+ PyObject *res;
+ if (!self->completed) {
+ PyErr_SetString(PyExc_ValueError,
+ "can't get read buffer before GetOverlappedResult() "
+ "signals the operation completed");
+ return NULL;
+ }
+ res = self->read_buffer ? self->read_buffer : Py_None;
+ Py_INCREF(res);
+ return res;
+}
+
+static PyObject *
+overlapped_cancel(OverlappedObject *self)
+{
+ BOOL res = TRUE;
+
+ if (self->pending) {
+ Py_BEGIN_ALLOW_THREADS
+ if (check_CancelIoEx())
+ res = Py_CancelIoEx(self->handle, &self->overlapped);
+ else
+ res = CancelIo(self->handle);
+ Py_END_ALLOW_THREADS
+ }
+
+ /* CancelIoEx returns ERROR_NOT_FOUND if the I/O completed in-between */
+ if (!res && GetLastError() != ERROR_NOT_FOUND)
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ self->pending = 0;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef overlapped_methods[] = {
+ {"GetOverlappedResult", (PyCFunction) overlapped_GetOverlappedResult,
+ METH_O, NULL},
+ {"getbuffer", (PyCFunction) overlapped_getbuffer, METH_NOARGS, NULL},
+ {"cancel", (PyCFunction) overlapped_cancel, METH_NOARGS, NULL},
+ {NULL}
+};
+
+static PyMemberDef overlapped_members[] = {
+ {"event", T_HANDLE,
+ offsetof(OverlappedObject, overlapped) + offsetof(OVERLAPPED, hEvent),
+ READONLY, "overlapped event handle"},
+ {NULL}
+};
+
+PyTypeObject OverlappedType = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ /* tp_name */ "_winapi.Overlapped",
+ /* tp_basicsize */ sizeof(OverlappedObject),
+ /* tp_itemsize */ 0,
+ /* tp_dealloc */ (destructor) overlapped_dealloc,
+ /* tp_print */ 0,
+ /* tp_getattr */ 0,
+ /* tp_setattr */ 0,
+ /* tp_reserved */ 0,
+ /* tp_repr */ 0,
+ /* tp_as_number */ 0,
+ /* tp_as_sequence */ 0,
+ /* tp_as_mapping */ 0,
+ /* tp_hash */ 0,
+ /* tp_call */ 0,
+ /* tp_str */ 0,
+ /* tp_getattro */ 0,
+ /* tp_setattro */ 0,
+ /* tp_as_buffer */ 0,
+ /* tp_flags */ Py_TPFLAGS_DEFAULT,
+ /* tp_doc */ "OVERLAPPED structure wrapper",
+ /* tp_traverse */ 0,
+ /* tp_clear */ 0,
+ /* tp_richcompare */ 0,
+ /* tp_weaklistoffset */ 0,
+ /* tp_iter */ 0,
+ /* tp_iternext */ 0,
+ /* tp_methods */ overlapped_methods,
+ /* tp_members */ overlapped_members,
+ /* tp_getset */ 0,
+ /* tp_base */ 0,
+ /* tp_dict */ 0,
+ /* tp_descr_get */ 0,
+ /* tp_descr_set */ 0,
+ /* tp_dictoffset */ 0,
+ /* tp_init */ 0,
+ /* tp_alloc */ 0,
+ /* tp_new */ 0,
+};
+
+static OverlappedObject *
+new_overlapped(HANDLE handle)
+{
+ OverlappedObject *self;
+
+ self = PyObject_New(OverlappedObject, &OverlappedType);
+ if (!self)
+ return NULL;
+ self->handle = handle;
+ self->read_buffer = NULL;
+ self->pending = 0;
+ self->completed = 0;
+ memset(&self->overlapped, 0, sizeof(OVERLAPPED));
+ memset(&self->write_buffer, 0, sizeof(Py_buffer));
+ /* Manual reset, initially non-signalled */
+ self->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ return self;
+}
+
+/* -------------------------------------------------------------------- */
+/* windows API functions */
+
+PyDoc_STRVAR(CloseHandle_doc,
+"CloseHandle(handle) -> None\n\
+\n\
+Close handle.");
+
+static PyObject *
+winapi_CloseHandle(PyObject *self, PyObject *args)
+{
+ HANDLE hObject;
+ BOOL success;
+
+ if (!PyArg_ParseTuple(args, F_HANDLE ":CloseHandle", &hObject))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ success = CloseHandle(hObject);
+ Py_END_ALLOW_THREADS
+
+ if (!success)
+ return PyErr_SetFromWindowsErr(0);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+winapi_ConnectNamedPipe(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ HANDLE hNamedPipe;
+ int use_overlapped = 0;
+ BOOL success;
+ OverlappedObject *overlapped = NULL;
+ static char *kwlist[] = {"handle", "overlapped", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds,
+ F_HANDLE "|" F_BOOL, kwlist,
+ &hNamedPipe, &use_overlapped))
+ return NULL;
+
+ if (use_overlapped) {
+ overlapped = new_overlapped(hNamedPipe);
+ if (!overlapped)
+ return NULL;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ success = ConnectNamedPipe(hNamedPipe,
+ overlapped ? &overlapped->overlapped : NULL);
+ Py_END_ALLOW_THREADS
+
+ if (overlapped) {
+ int err = GetLastError();
+ /* Overlapped ConnectNamedPipe never returns a success code */
+ assert(success == 0);
+ if (err == ERROR_IO_PENDING)
+ overlapped->pending = 1;
+ else if (err == ERROR_PIPE_CONNECTED)
+ SetEvent(overlapped->overlapped.hEvent);
+ else {
+ Py_DECREF(overlapped);
+ return PyErr_SetFromWindowsErr(err);
+ }
+ return (PyObject *) overlapped;
+ }
+ if (!success)
+ return PyErr_SetFromWindowsErr(0);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+winapi_CreateFile(PyObject *self, PyObject *args)
+{
+ LPCTSTR lpFileName;
+ DWORD dwDesiredAccess;
+ DWORD dwShareMode;
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes;
+ DWORD dwCreationDisposition;
+ DWORD dwFlagsAndAttributes;
+ HANDLE hTemplateFile;
+ HANDLE handle;
+
+ if (!PyArg_ParseTuple(args, "s" F_DWORD F_DWORD F_POINTER
+ F_DWORD F_DWORD F_HANDLE,
+ &lpFileName, &dwDesiredAccess, &dwShareMode,
+ &lpSecurityAttributes, &dwCreationDisposition,
+ &dwFlagsAndAttributes, &hTemplateFile))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ handle = CreateFile(lpFileName, dwDesiredAccess,
+ dwShareMode, lpSecurityAttributes,
+ dwCreationDisposition,
+ dwFlagsAndAttributes, hTemplateFile);
+ Py_END_ALLOW_THREADS
+
+ if (handle == INVALID_HANDLE_VALUE)
+ return PyErr_SetFromWindowsErr(0);
+
+ return Py_BuildValue(F_HANDLE, handle);
+}
+
+static PyObject *
+winapi_CreateNamedPipe(PyObject *self, PyObject *args)
+{
+ LPCTSTR lpName;
+ DWORD dwOpenMode;
+ DWORD dwPipeMode;
+ DWORD nMaxInstances;
+ DWORD nOutBufferSize;
+ DWORD nInBufferSize;
+ DWORD nDefaultTimeOut;
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes;
+ HANDLE handle;
+
+ if (!PyArg_ParseTuple(args, "s" F_DWORD F_DWORD F_DWORD
+ F_DWORD F_DWORD F_DWORD F_POINTER,
+ &lpName, &dwOpenMode, &dwPipeMode,
+ &nMaxInstances, &nOutBufferSize,
+ &nInBufferSize, &nDefaultTimeOut,
+ &lpSecurityAttributes))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ handle = CreateNamedPipe(lpName, dwOpenMode, dwPipeMode,
+ nMaxInstances, nOutBufferSize,
+ nInBufferSize, nDefaultTimeOut,
+ lpSecurityAttributes);
+ Py_END_ALLOW_THREADS
+
+ if (handle == INVALID_HANDLE_VALUE)
+ return PyErr_SetFromWindowsErr(0);
+
+ return Py_BuildValue(F_HANDLE, handle);
+}
+
+PyDoc_STRVAR(CreatePipe_doc,
+"CreatePipe(pipe_attrs, size) -> (read_handle, write_handle)\n\
+\n\
+Create an anonymous pipe, and return handles to the read and\n\
+write ends of the pipe.\n\
+\n\
+pipe_attrs is ignored internally and can be None.");
+
+static PyObject *
+winapi_CreatePipe(PyObject* self, PyObject* args)
+{
+ HANDLE read_pipe;
+ HANDLE write_pipe;
+ BOOL result;
+
+ PyObject* pipe_attributes; /* ignored */
+ DWORD size;
+
+ if (! PyArg_ParseTuple(args, "O" F_DWORD ":CreatePipe",
+ &pipe_attributes, &size))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = CreatePipe(&read_pipe, &write_pipe, NULL, size);
+ Py_END_ALLOW_THREADS
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return Py_BuildValue(
+ "NN", HANDLE_TO_PYNUM(read_pipe), HANDLE_TO_PYNUM(write_pipe));
+}
+
+/* helpers for createprocess */
+
+static unsigned long
+getulong(PyObject* obj, char* name)
+{
+ PyObject* value;
+ unsigned long ret;
+
+ value = PyObject_GetAttrString(obj, name);
+ if (! value) {
+ PyErr_Clear(); /* FIXME: propagate error? */
+ return 0;
+ }
+ ret = PyLong_AsUnsignedLong(value);
+ Py_DECREF(value);
+ return ret;
+}
+
+static HANDLE
+gethandle(PyObject* obj, char* name)
+{
+ PyObject* value;
+ HANDLE ret;
+
+ value = PyObject_GetAttrString(obj, name);
+ if (! value) {
+ PyErr_Clear(); /* FIXME: propagate error? */
+ return NULL;
+ }
+ if (value == Py_None)
+ ret = NULL;
+ else
+ ret = PYNUM_TO_HANDLE(value);
+ Py_DECREF(value);
+ return ret;
+}
+
+static PyObject*
+getenvironment(PyObject* environment)
+{
+ Py_ssize_t i, envsize, totalsize;
+ Py_UCS4 *buffer = NULL, *p, *end;
+ PyObject *keys, *values, *res;
+
+ /* convert environment dictionary to windows enviroment string */
+ if (! PyMapping_Check(environment)) {
+ PyErr_SetString(
+ PyExc_TypeError, "environment must be dictionary or None");
+ return NULL;
+ }
+
+ envsize = PyMapping_Length(environment);
+
+ keys = PyMapping_Keys(environment);
+ values = PyMapping_Values(environment);
+ if (!keys || !values)
+ goto error;
+
+ totalsize = 1; /* trailing null character */
+ for (i = 0; i < envsize; i++) {
+ PyObject* key = PyList_GET_ITEM(keys, i);
+ PyObject* value = PyList_GET_ITEM(values, i);
+
+ if (! PyUnicode_Check(key) || ! PyUnicode_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "environment can only contain strings");
+ goto error;
+ }
+ totalsize += PyUnicode_GET_LENGTH(key) + 1; /* +1 for '=' */
+ totalsize += PyUnicode_GET_LENGTH(value) + 1; /* +1 for '\0' */
+ }
+
+ buffer = PyMem_Malloc(totalsize * sizeof(Py_UCS4));
+ if (! buffer)
+ goto error;
+ p = buffer;
+ end = buffer + totalsize;
+
+ for (i = 0; i < envsize; i++) {
+ PyObject* key = PyList_GET_ITEM(keys, i);
+ PyObject* value = PyList_GET_ITEM(values, i);
+ if (!PyUnicode_AsUCS4(key, p, end - p, 0))
+ goto error;
+ p += PyUnicode_GET_LENGTH(key);
+ *p++ = '=';
+ if (!PyUnicode_AsUCS4(value, p, end - p, 0))
+ goto error;
+ p += PyUnicode_GET_LENGTH(value);
+ *p++ = '\0';
+ }
+
+ /* add trailing null byte */
+ *p++ = '\0';
+ assert(p == end);
+
+ Py_XDECREF(keys);
+ Py_XDECREF(values);
+
+ res = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, p - buffer);
+ PyMem_Free(buffer);
+ return res;
+
+ error:
+ PyMem_Free(buffer);
+ Py_XDECREF(keys);
+ Py_XDECREF(values);
+ return NULL;
+}
+
+PyDoc_STRVAR(CreateProcess_doc,
+"CreateProcess(app_name, cmd_line, proc_attrs, thread_attrs,\n\
+ inherit, flags, env_mapping, curdir,\n\
+ startup_info) -> (proc_handle, thread_handle,\n\
+ pid, tid)\n\
+\n\
+Create a new process and its primary thread. The return\n\
+value is a tuple of the process handle, thread handle,\n\
+process ID, and thread ID.\n\
+\n\
+proc_attrs and thread_attrs are ignored internally and can be None.");
+
+static PyObject *
+winapi_CreateProcess(PyObject* self, PyObject* args)
+{
+ BOOL result;
+ PROCESS_INFORMATION pi;
+ STARTUPINFOW si;
+ PyObject* environment;
+ wchar_t *wenvironment;
+
+ wchar_t* application_name;
+ wchar_t* command_line;
+ PyObject* process_attributes; /* ignored */
+ PyObject* thread_attributes; /* ignored */
+ BOOL inherit_handles;
+ DWORD creation_flags;
+ PyObject* env_mapping;
+ wchar_t* current_directory;
+ PyObject* startup_info;
+
+ if (! PyArg_ParseTuple(args, "ZZOO" F_BOOL F_DWORD "OZO:CreateProcess",
+ &application_name,
+ &command_line,
+ &process_attributes,
+ &thread_attributes,
+ &inherit_handles,
+ &creation_flags,
+ &env_mapping,
+ &current_directory,
+ &startup_info))
+ return NULL;
+
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+
+ /* note: we only support a small subset of all SI attributes */
+ si.dwFlags = getulong(startup_info, "dwFlags");
+ si.wShowWindow = (WORD)getulong(startup_info, "wShowWindow");
+ si.hStdInput = gethandle(startup_info, "hStdInput");
+ si.hStdOutput = gethandle(startup_info, "hStdOutput");
+ si.hStdError = gethandle(startup_info, "hStdError");
+ if (PyErr_Occurred())
+ return NULL;
+
+ if (env_mapping != Py_None) {
+ environment = getenvironment(env_mapping);
+ if (! environment)
+ return NULL;
+ wenvironment = PyUnicode_AsUnicode(environment);
+ if (wenvironment == NULL)
+ {
+ Py_XDECREF(environment);
+ return NULL;
+ }
+ }
+ else {
+ environment = NULL;
+ wenvironment = NULL;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ result = CreateProcessW(application_name,
+ command_line,
+ NULL,
+ NULL,
+ inherit_handles,
+ creation_flags | CREATE_UNICODE_ENVIRONMENT,
+ wenvironment,
+ current_directory,
+ &si,
+ &pi);
+ Py_END_ALLOW_THREADS
+
+ Py_XDECREF(environment);
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return Py_BuildValue("NNkk",
+ HANDLE_TO_PYNUM(pi.hProcess),
+ HANDLE_TO_PYNUM(pi.hThread),
+ pi.dwProcessId,
+ pi.dwThreadId);
+}
+
+PyDoc_STRVAR(DuplicateHandle_doc,
+"DuplicateHandle(source_proc_handle, source_handle,\n\
+ target_proc_handle, target_handle, access,\n\
+ inherit[, options]) -> handle\n\
+\n\
+Return a duplicate handle object.\n\
+\n\
+The duplicate handle refers to the same object as the original\n\
+handle. Therefore, any changes to the object are reflected\n\
+through both handles.");
+
+static PyObject *
+winapi_DuplicateHandle(PyObject* self, PyObject* args)
+{
+ HANDLE target_handle;
+ BOOL result;
+
+ HANDLE source_process_handle;
+ HANDLE source_handle;
+ HANDLE target_process_handle;
+ DWORD desired_access;
+ BOOL inherit_handle;
+ DWORD options = 0;
+
+ if (! PyArg_ParseTuple(args,
+ F_HANDLE F_HANDLE F_HANDLE F_DWORD F_BOOL F_DWORD
+ ":DuplicateHandle",
+ &source_process_handle,
+ &source_handle,
+ &target_process_handle,
+ &desired_access,
+ &inherit_handle,
+ &options))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = DuplicateHandle(
+ source_process_handle,
+ source_handle,
+ target_process_handle,
+ &target_handle,
+ desired_access,
+ inherit_handle,
+ options
+ );
+ Py_END_ALLOW_THREADS
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return HANDLE_TO_PYNUM(target_handle);
+}
+
+static PyObject *
+winapi_ExitProcess(PyObject *self, PyObject *args)
+{
+ UINT uExitCode;
+
+ if (!PyArg_ParseTuple(args, F_UINT, &uExitCode))
+ return NULL;
+
+ #if defined(Py_DEBUG)
+ SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOALIGNMENTFAULTEXCEPT|
+ SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX);
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
+ #endif
+
+ ExitProcess(uExitCode);
+
+ return NULL;
+}
+
+PyDoc_STRVAR(GetCurrentProcess_doc,
+"GetCurrentProcess() -> handle\n\
+\n\
+Return a handle object for the current process.");
+
+static PyObject *
+winapi_GetCurrentProcess(PyObject* self, PyObject* args)
+{
+ if (! PyArg_ParseTuple(args, ":GetCurrentProcess"))
+ return NULL;
+
+ return HANDLE_TO_PYNUM(GetCurrentProcess());
+}
+
+PyDoc_STRVAR(GetExitCodeProcess_doc,
+"GetExitCodeProcess(handle) -> Exit code\n\
+\n\
+Return the termination status of the specified process.");
+
+static PyObject *
+winapi_GetExitCodeProcess(PyObject* self, PyObject* args)
+{
+ DWORD exit_code;
+ BOOL result;
+
+ HANDLE process;
+ if (! PyArg_ParseTuple(args, F_HANDLE ":GetExitCodeProcess", &process))
+ return NULL;
+
+ result = GetExitCodeProcess(process, &exit_code);
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return PyLong_FromUnsignedLong(exit_code);
+}
+
+static PyObject *
+winapi_GetLastError(PyObject *self, PyObject *args)
+{
+ return Py_BuildValue(F_DWORD, GetLastError());
+}
+
+PyDoc_STRVAR(GetModuleFileName_doc,
+"GetModuleFileName(module) -> path\n\
+\n\
+Return the fully-qualified path for the file that contains\n\
+the specified module. The module must have been loaded by the\n\
+current process.\n\
+\n\
+The module parameter should be a handle to the loaded module\n\
+whose path is being requested. If this parameter is 0, \n\
+GetModuleFileName retrieves the path of the executable file\n\
+of the current process.");
+
+static PyObject *
+winapi_GetModuleFileName(PyObject* self, PyObject* args)
+{
+ BOOL result;
+ HMODULE module;
+ WCHAR filename[MAX_PATH];
+
+ if (! PyArg_ParseTuple(args, F_HANDLE ":GetModuleFileName",
+ &module))
+ return NULL;
+
+ result = GetModuleFileNameW(module, filename, MAX_PATH);
+ filename[MAX_PATH-1] = '\0';
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return PyUnicode_FromWideChar(filename, wcslen(filename));
+}
+
+PyDoc_STRVAR(GetStdHandle_doc,
+"GetStdHandle(handle) -> integer\n\
+\n\
+Return a handle to the specified standard device\n\
+(STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE).\n\
+The integer associated with the handle object is returned.");
+
+static PyObject *
+winapi_GetStdHandle(PyObject* self, PyObject* args)
+{
+ HANDLE handle;
+ DWORD std_handle;
+
+ if (! PyArg_ParseTuple(args, F_DWORD ":GetStdHandle", &std_handle))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ handle = GetStdHandle(std_handle);
+ Py_END_ALLOW_THREADS
+
+ if (handle == INVALID_HANDLE_VALUE)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ if (! handle) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ /* note: returns integer, not handle object */
+ return HANDLE_TO_PYNUM(handle);
+}
+
+PyDoc_STRVAR(GetVersion_doc,
+"GetVersion() -> version\n\
+\n\
+Return the version number of the current operating system.");
+
+static PyObject *
+winapi_GetVersion(PyObject* self, PyObject* args)
+{
+ if (! PyArg_ParseTuple(args, ":GetVersion"))
+ return NULL;
+
+ return PyLong_FromUnsignedLong(GetVersion());
+}
+
+static PyObject *
+winapi_OpenProcess(PyObject *self, PyObject *args)
+{
+ DWORD dwDesiredAccess;
+ BOOL bInheritHandle;
+ DWORD dwProcessId;
+ HANDLE handle;
+
+ if (!PyArg_ParseTuple(args, F_DWORD F_BOOL F_DWORD,
+ &dwDesiredAccess, &bInheritHandle, &dwProcessId))
+ return NULL;
+
+ handle = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
+ if (handle == NULL)
+ return PyErr_SetFromWindowsErr(0);
+
+ return Py_BuildValue(F_HANDLE, handle);
+}
+
+static PyObject *
+winapi_PeekNamedPipe(PyObject *self, PyObject *args)
+{
+ HANDLE handle;
+ int size = 0;
+ PyObject *buf = NULL;
+ DWORD nread, navail, nleft;
+ BOOL ret;
+
+ if (!PyArg_ParseTuple(args, F_HANDLE "|i:PeekNamedPipe" , &handle, &size))
+ return NULL;
+
+ if (size < 0) {
+ PyErr_SetString(PyExc_ValueError, "negative size");
+ return NULL;
+ }
+
+ if (size) {
+ buf = PyBytes_FromStringAndSize(NULL, size);
+ if (!buf)
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+ ret = PeekNamedPipe(handle, PyBytes_AS_STRING(buf), size, &nread,
+ &navail, &nleft);
+ Py_END_ALLOW_THREADS
+ if (!ret) {
+ Py_DECREF(buf);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ }
+ if (_PyBytes_Resize(&buf, nread))
+ return NULL;
+ return Py_BuildValue("Nii", buf, navail, nleft);
+ }
+ else {
+ Py_BEGIN_ALLOW_THREADS
+ ret = PeekNamedPipe(handle, NULL, 0, NULL, &navail, &nleft);
+ Py_END_ALLOW_THREADS
+ if (!ret) {
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ }
+ return Py_BuildValue("ii", navail, nleft);
+ }
+}
+
+static PyObject *
+winapi_ReadFile(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ HANDLE handle;
+ int size;
+ DWORD nread;
+ PyObject *buf;
+ BOOL ret;
+ int use_overlapped = 0;
+ DWORD err;
+ OverlappedObject *overlapped = NULL;
+ static char *kwlist[] = {"handle", "size", "overlapped", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds,
+ F_HANDLE "i|i:ReadFile", kwlist,
+ &handle, &size, &use_overlapped))
+ return NULL;
+
+ buf = PyBytes_FromStringAndSize(NULL, size);
+ if (!buf)
+ return NULL;
+ if (use_overlapped) {
+ overlapped = new_overlapped(handle);
+ if (!overlapped) {
+ Py_DECREF(buf);
+ return NULL;
+ }
+ /* Steals reference to buf */
+ overlapped->read_buffer = buf;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ ret = ReadFile(handle, PyBytes_AS_STRING(buf), size, &nread,
+ overlapped ? &overlapped->overlapped : NULL);
+ Py_END_ALLOW_THREADS
+
+ err = ret ? 0 : GetLastError();
+
+ if (overlapped) {
+ if (!ret) {
+ if (err == ERROR_IO_PENDING)
+ overlapped->pending = 1;
+ else if (err != ERROR_MORE_DATA) {
+ Py_DECREF(overlapped);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ }
+ }
+ return Py_BuildValue("NI", (PyObject *) overlapped, err);
+ }
+
+ if (!ret && err != ERROR_MORE_DATA) {
+ Py_DECREF(buf);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ }
+ if (_PyBytes_Resize(&buf, nread))
+ return NULL;
+ return Py_BuildValue("NI", buf, err);
+}
+
+static PyObject *
+winapi_SetNamedPipeHandleState(PyObject *self, PyObject *args)
+{
+ HANDLE hNamedPipe;
+ PyObject *oArgs[3];
+ DWORD dwArgs[3], *pArgs[3] = {NULL, NULL, NULL};
+ int i;
+
+ if (!PyArg_ParseTuple(args, F_HANDLE "OOO",
+ &hNamedPipe, &oArgs[0], &oArgs[1], &oArgs[2]))
+ return NULL;
+
+ PyErr_Clear();
+
+ for (i = 0 ; i < 3 ; i++) {
+ if (oArgs[i] != Py_None) {
+ dwArgs[i] = PyLong_AsUnsignedLongMask(oArgs[i]);
+ if (PyErr_Occurred())
+ return NULL;
+ pArgs[i] = &dwArgs[i];
+ }
+ }
+
+ if (!SetNamedPipeHandleState(hNamedPipe, pArgs[0], pArgs[1], pArgs[2]))
+ return PyErr_SetFromWindowsErr(0);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(TerminateProcess_doc,
+"TerminateProcess(handle, exit_code) -> None\n\
+\n\
+Terminate the specified process and all of its threads.");
+
+static PyObject *
+winapi_TerminateProcess(PyObject* self, PyObject* args)
+{
+ BOOL result;
+
+ HANDLE process;
+ UINT exit_code;
+ if (! PyArg_ParseTuple(args, F_HANDLE F_UINT ":TerminateProcess",
+ &process, &exit_code))
+ return NULL;
+
+ result = TerminateProcess(process, exit_code);
+
+ if (! result)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+winapi_WaitNamedPipe(PyObject *self, PyObject *args)
+{
+ LPCTSTR lpNamedPipeName;
+ DWORD nTimeOut;
+ BOOL success;
+
+ if (!PyArg_ParseTuple(args, "s" F_DWORD, &lpNamedPipeName, &nTimeOut))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ success = WaitNamedPipe(lpNamedPipeName, nTimeOut);
+ Py_END_ALLOW_THREADS
+
+ if (!success)
+ return PyErr_SetFromWindowsErr(0);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+winapi_WaitForMultipleObjects(PyObject* self, PyObject* args)
+{
+ DWORD result;
+ PyObject *handle_seq;
+ HANDLE handles[MAXIMUM_WAIT_OBJECTS];
+ HANDLE sigint_event = NULL;
+ Py_ssize_t nhandles, i;
+ BOOL wait_flag;
+ DWORD milliseconds = INFINITE;
+
+ if (!PyArg_ParseTuple(args, "O" F_BOOL "|" F_DWORD
+ ":WaitForMultipleObjects",
+ &handle_seq, &wait_flag, &milliseconds))
+ return NULL;
+
+ if (!PySequence_Check(handle_seq)) {
+ PyErr_Format(PyExc_TypeError,
+ "sequence type expected, got '%s'",
+ Py_TYPE(handle_seq)->tp_name);
+ return NULL;
+ }
+ nhandles = PySequence_Length(handle_seq);
+ if (nhandles == -1)
+ return NULL;
+ if (nhandles < 0 || nhandles >= MAXIMUM_WAIT_OBJECTS - 1) {
+ PyErr_Format(PyExc_ValueError,
+ "need at most %zd handles, got a sequence of length %zd",
+ MAXIMUM_WAIT_OBJECTS - 1, nhandles);
+ return NULL;
+ }
+ for (i = 0; i < nhandles; i++) {
+ HANDLE h;
+ PyObject *v = PySequence_GetItem(handle_seq, i);
+ if (v == NULL)
+ return NULL;
+ if (!PyArg_Parse(v, F_HANDLE, &h)) {
+ Py_DECREF(v);
+ return NULL;
+ }
+ handles[i] = h;
+ Py_DECREF(v);
+ }
+ /* If this is the main thread then make the wait interruptible
+ by Ctrl-C unless we are waiting for *all* handles */
+ if (!wait_flag && _PyOS_IsMainThread()) {
+ sigint_event = _PyOS_SigintEvent();
+ assert(sigint_event != NULL);
+ handles[nhandles++] = sigint_event;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ if (sigint_event != NULL)
+ ResetEvent(sigint_event);
+ result = WaitForMultipleObjects((DWORD) nhandles, handles,
+ wait_flag, milliseconds);
+ Py_END_ALLOW_THREADS
+
+ if (result == WAIT_FAILED)
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ else if (sigint_event != NULL && result == WAIT_OBJECT_0 + nhandles - 1) {
+ errno = EINTR;
+ return PyErr_SetFromErrno(PyExc_IOError);
+ }
+
+ return PyLong_FromLong((int) result);
+}
+
+PyDoc_STRVAR(WaitForSingleObject_doc,
+"WaitForSingleObject(handle, timeout) -> result\n\
+\n\
+Wait until the specified object is in the signaled state or\n\
+the time-out interval elapses. The timeout value is specified\n\
+in milliseconds.");
+
+static PyObject *
+winapi_WaitForSingleObject(PyObject* self, PyObject* args)
+{
+ DWORD result;
+
+ HANDLE handle;
+ DWORD milliseconds;
+ if (! PyArg_ParseTuple(args, F_HANDLE F_DWORD ":WaitForSingleObject",
+ &handle,
+ &milliseconds))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = WaitForSingleObject(handle, milliseconds);
+ Py_END_ALLOW_THREADS
+
+ if (result == WAIT_FAILED)
+ return PyErr_SetFromWindowsErr(GetLastError());
+
+ return PyLong_FromUnsignedLong(result);
+}
+
+static PyObject *
+winapi_WriteFile(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ HANDLE handle;
+ Py_buffer _buf, *buf;
+ PyObject *bufobj;
+ DWORD written;
+ BOOL ret;
+ int use_overlapped = 0;
+ DWORD err;
+ OverlappedObject *overlapped = NULL;
+ static char *kwlist[] = {"handle", "buffer", "overlapped", NULL};
+
+ /* First get handle and use_overlapped to know which Py_buffer to use */
+ if (!PyArg_ParseTupleAndKeywords(args, kwds,
+ F_HANDLE "O|i:WriteFile", kwlist,
+ &handle, &bufobj, &use_overlapped))
+ return NULL;
+
+ if (use_overlapped) {
+ overlapped = new_overlapped(handle);
+ if (!overlapped)
+ return NULL;
+ buf = &overlapped->write_buffer;
+ }
+ else
+ buf = &_buf;
+
+ if (!PyArg_Parse(bufobj, "y*", buf)) {
+ Py_XDECREF(overlapped);
+ return NULL;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ ret = WriteFile(handle, buf->buf, buf->len, &written,
+ overlapped ? &overlapped->overlapped : NULL);
+ Py_END_ALLOW_THREADS
+
+ err = ret ? 0 : GetLastError();
+
+ if (overlapped) {
+ if (!ret) {
+ if (err == ERROR_IO_PENDING)
+ overlapped->pending = 1;
+ else {
+ Py_DECREF(overlapped);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ }
+ }
+ return Py_BuildValue("NI", (PyObject *) overlapped, err);
+ }
+
+ PyBuffer_Release(buf);
+ if (!ret)
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, 0);
+ return Py_BuildValue("II", written, err);
+}
+
+
+static PyMethodDef winapi_functions[] = {
+ {"CloseHandle", winapi_CloseHandle, METH_VARARGS,
+ CloseHandle_doc},
+ {"ConnectNamedPipe", (PyCFunction)winapi_ConnectNamedPipe,
+ METH_VARARGS | METH_KEYWORDS, ""},
+ {"CreateFile", winapi_CreateFile, METH_VARARGS,
+ ""},
+ {"CreateNamedPipe", winapi_CreateNamedPipe, METH_VARARGS,
+ ""},
+ {"CreatePipe", winapi_CreatePipe, METH_VARARGS,
+ CreatePipe_doc},
+ {"CreateProcess", winapi_CreateProcess, METH_VARARGS,
+ CreateProcess_doc},
+ {"DuplicateHandle", winapi_DuplicateHandle, METH_VARARGS,
+ DuplicateHandle_doc},
+ {"ExitProcess", winapi_ExitProcess, METH_VARARGS,
+ ""},
+ {"GetCurrentProcess", winapi_GetCurrentProcess, METH_VARARGS,
+ GetCurrentProcess_doc},
+ {"GetExitCodeProcess", winapi_GetExitCodeProcess, METH_VARARGS,
+ GetExitCodeProcess_doc},
+ {"GetLastError", winapi_GetLastError, METH_NOARGS,
+ GetCurrentProcess_doc},
+ {"GetModuleFileName", winapi_GetModuleFileName, METH_VARARGS,
+ GetModuleFileName_doc},
+ {"GetStdHandle", winapi_GetStdHandle, METH_VARARGS,
+ GetStdHandle_doc},
+ {"GetVersion", winapi_GetVersion, METH_VARARGS,
+ GetVersion_doc},
+ {"OpenProcess", winapi_OpenProcess, METH_VARARGS,
+ ""},
+ {"PeekNamedPipe", winapi_PeekNamedPipe, METH_VARARGS,
+ ""},
+ {"ReadFile", (PyCFunction)winapi_ReadFile, METH_VARARGS | METH_KEYWORDS,
+ ""},
+ {"SetNamedPipeHandleState", winapi_SetNamedPipeHandleState, METH_VARARGS,
+ ""},
+ {"TerminateProcess", winapi_TerminateProcess, METH_VARARGS,
+ TerminateProcess_doc},
+ {"WaitNamedPipe", winapi_WaitNamedPipe, METH_VARARGS,
+ ""},
+ {"WaitForMultipleObjects", winapi_WaitForMultipleObjects, METH_VARARGS,
+ ""},
+ {"WaitForSingleObject", winapi_WaitForSingleObject, METH_VARARGS,
+ WaitForSingleObject_doc},
+ {"WriteFile", (PyCFunction)winapi_WriteFile, METH_VARARGS | METH_KEYWORDS,
+ ""},
+ {NULL, NULL}
+};
+
+static struct PyModuleDef winapi_module = {
+ PyModuleDef_HEAD_INIT,
+ "_winapi",
+ NULL,
+ -1,
+ winapi_functions,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+#define WINAPI_CONSTANT(fmt, con) \
+ PyDict_SetItemString(d, #con, Py_BuildValue(fmt, con))
+
+PyMODINIT_FUNC
+PyInit__winapi(void)
+{
+ PyObject *d;
+ PyObject *m;
+
+ if (PyType_Ready(&OverlappedType) < 0)
+ return NULL;
+
+ m = PyModule_Create(&winapi_module);
+ if (m == NULL)
+ return NULL;
+ d = PyModule_GetDict(m);
+
+ PyDict_SetItemString(d, "Overlapped", (PyObject *) &OverlappedType);
+
+ /* constants */
+ WINAPI_CONSTANT(F_DWORD, CREATE_NEW_CONSOLE);
+ WINAPI_CONSTANT(F_DWORD, CREATE_NEW_PROCESS_GROUP);
+ WINAPI_CONSTANT(F_DWORD, DUPLICATE_SAME_ACCESS);
+ WINAPI_CONSTANT(F_DWORD, DUPLICATE_CLOSE_SOURCE);
+ WINAPI_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS);
+ WINAPI_CONSTANT(F_DWORD, ERROR_BROKEN_PIPE);
+ WINAPI_CONSTANT(F_DWORD, ERROR_IO_PENDING);
+ WINAPI_CONSTANT(F_DWORD, ERROR_MORE_DATA);
+ WINAPI_CONSTANT(F_DWORD, ERROR_NETNAME_DELETED);
+ WINAPI_CONSTANT(F_DWORD, ERROR_NO_SYSTEM_RESOURCES);
+ WINAPI_CONSTANT(F_DWORD, ERROR_MORE_DATA);
+ WINAPI_CONSTANT(F_DWORD, ERROR_NETNAME_DELETED);
+ WINAPI_CONSTANT(F_DWORD, ERROR_NO_DATA);
+ WINAPI_CONSTANT(F_DWORD, ERROR_NO_SYSTEM_RESOURCES);
+ WINAPI_CONSTANT(F_DWORD, ERROR_OPERATION_ABORTED);
+ WINAPI_CONSTANT(F_DWORD, ERROR_PIPE_BUSY);
+ WINAPI_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED);
+ WINAPI_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT);
+ WINAPI_CONSTANT(F_DWORD, FILE_FLAG_FIRST_PIPE_INSTANCE);
+ WINAPI_CONSTANT(F_DWORD, FILE_FLAG_OVERLAPPED);
+ WINAPI_CONSTANT(F_DWORD, FILE_GENERIC_READ);
+ WINAPI_CONSTANT(F_DWORD, FILE_GENERIC_WRITE);
+ WINAPI_CONSTANT(F_DWORD, GENERIC_READ);
+ WINAPI_CONSTANT(F_DWORD, GENERIC_WRITE);
+ WINAPI_CONSTANT(F_DWORD, INFINITE);
+ WINAPI_CONSTANT(F_DWORD, NMPWAIT_WAIT_FOREVER);
+ WINAPI_CONSTANT(F_DWORD, OPEN_EXISTING);
+ WINAPI_CONSTANT(F_DWORD, PIPE_ACCESS_DUPLEX);
+ WINAPI_CONSTANT(F_DWORD, PIPE_ACCESS_INBOUND);
+ WINAPI_CONSTANT(F_DWORD, PIPE_READMODE_MESSAGE);
+ WINAPI_CONSTANT(F_DWORD, PIPE_TYPE_MESSAGE);
+ WINAPI_CONSTANT(F_DWORD, PIPE_UNLIMITED_INSTANCES);
+ WINAPI_CONSTANT(F_DWORD, PIPE_WAIT);
+ WINAPI_CONSTANT(F_DWORD, PROCESS_ALL_ACCESS);
+ WINAPI_CONSTANT(F_DWORD, PROCESS_DUP_HANDLE);
+ WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
+ WINAPI_CONSTANT(F_DWORD, STARTF_USESTDHANDLES);
+ WINAPI_CONSTANT(F_DWORD, STD_INPUT_HANDLE);
+ WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
+ WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);
+ WINAPI_CONSTANT(F_DWORD, STILL_ACTIVE);
+ WINAPI_CONSTANT(F_DWORD, SW_HIDE);
+ WINAPI_CONSTANT(F_DWORD, WAIT_OBJECT_0);
+ WINAPI_CONSTANT(F_DWORD, WAIT_TIMEOUT);
+
+ WINAPI_CONSTANT("i", NULL);
+
+ return m;
+}
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 2d4ee72..3f5aa8b 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -22,7 +22,7 @@ struct arrayobject; /* Forward */
* functions aren't visible yet.
*/
struct arraydescr {
- Py_UNICODE typecode;
+ char typecode;
int itemsize;
PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
@@ -356,6 +356,59 @@ LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
return 0;
}
+#ifdef HAVE_LONG_LONG
+
+static PyObject *
+q_getitem(arrayobject *ap, Py_ssize_t i)
+{
+ return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
+}
+
+static int
+q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
+{
+ PY_LONG_LONG x;
+ if (!PyArg_Parse(v, "L;array item must be integer", &x))
+ return -1;
+ if (i >= 0)
+ ((PY_LONG_LONG *)ap->ob_item)[i] = x;
+ return 0;
+}
+
+static PyObject *
+QQ_getitem(arrayobject *ap, Py_ssize_t i)
+{
+ return PyLong_FromUnsignedLongLong(
+ ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
+}
+
+static int
+QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
+{
+ unsigned PY_LONG_LONG x;
+ if (PyLong_Check(v)) {
+ x = PyLong_AsUnsignedLongLong(v);
+ if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
+ return -1;
+ }
+ else {
+ PY_LONG_LONG y;
+ if (!PyArg_Parse(v, "L;array item must be integer", &y))
+ return -1;
+ if (y < 0) {
+ PyErr_SetString(PyExc_OverflowError,
+ "unsigned long long is less than minimum");
+ return -1;
+ }
+ x = (unsigned PY_LONG_LONG)y;
+ }
+
+ if (i >= 0)
+ ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
+ return 0;
+}
+#endif
+
static PyObject *
f_getitem(arrayobject *ap, Py_ssize_t i)
{
@@ -406,6 +459,10 @@ static struct arraydescr descriptors[] = {
{'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
{'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
{'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
+#ifdef HAVE_LONG_LONG
+ {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
+ {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
+#endif
{'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
{'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
{'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
@@ -426,11 +483,11 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
return NULL;
}
- nbytes = size * descr->itemsize;
/* Check for overflow */
- if (nbytes / descr->itemsize != (size_t)size) {
+ if (size > PY_SSIZE_T_MAX / descr->itemsize) {
return PyErr_NoMemory();
}
+ nbytes = size * descr->itemsize;
op = (arrayobject *) type->tp_alloc(type, 0);
if (op == NULL) {
return NULL;
@@ -514,10 +571,8 @@ array_richcompare(PyObject *v, PyObject *w, int op)
Py_ssize_t i, k;
PyObject *res;
- if (!array_Check(v) || !array_Check(w)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!array_Check(v) || !array_Check(w))
+ Py_RETURN_NOTIMPLEMENTED;
va = (arrayobject *)v;
wa = (arrayobject *)w;
@@ -876,7 +931,6 @@ array_inplace_repeat(arrayobject *self, Py_ssize_t n)
if (Py_SIZE(self) > 0) {
if (n < 0)
n = 0;
- items = self->ob_item;
if ((self->ob_descr->itemsize != 0) &&
(Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
return PyErr_NoMemory();
@@ -1191,18 +1245,23 @@ array_fromfile(arrayobject *self, PyObject *args)
PyObject *f, *b, *res;
Py_ssize_t itemsize = self->ob_descr->itemsize;
Py_ssize_t n, nbytes;
+ _Py_IDENTIFIER(read);
int not_enough_bytes;
if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
return NULL;
- nbytes = n * itemsize;
- if (nbytes < 0 || nbytes/itemsize != n) {
+ if (n < 0) {
+ PyErr_SetString(PyExc_ValueError, "negative count");
+ return NULL;
+ }
+ if (n > PY_SSIZE_T_MAX / itemsize) {
PyErr_NoMemory();
return NULL;
}
+ nbytes = n * itemsize;
- b = PyObject_CallMethod(f, "read", "n", nbytes);
+ b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
if (b == NULL)
return NULL;
@@ -1259,12 +1318,14 @@ array_tofile(arrayobject *self, PyObject *f)
char* ptr = self->ob_item + i*BLOCKSIZE;
Py_ssize_t size = BLOCKSIZE;
PyObject *bytes, *res;
+ _Py_IDENTIFIER(write);
+
if (i*BLOCKSIZE + size > nbytes)
size = nbytes - i*BLOCKSIZE;
bytes = PyBytes_FromStringAndSize(ptr, size);
if (bytes == NULL)
return NULL;
- res = PyObject_CallMethod(f, "write", "O", bytes);
+ res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
Py_DECREF(bytes);
if (res == NULL)
return NULL;
@@ -1456,7 +1517,7 @@ array_fromunicode(arrayobject *self, PyObject *args)
{
Py_UNICODE *ustr;
Py_ssize_t n;
- Py_UNICODE typecode;
+ char typecode;
if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
return NULL;
@@ -1491,7 +1552,7 @@ append Unicode data to an array of some other type.");
static PyObject *
array_tounicode(arrayobject *self, PyObject *unused)
{
- Py_UNICODE typecode;
+ char typecode;
typecode = self->ob_descr->typecode;
if ((typecode != 'u')) {
PyErr_SetString(PyExc_ValueError,
@@ -1601,7 +1662,7 @@ static const struct mformatdescr {
* be found.
*/
static enum machine_format_code
-typecode_to_mformat_code(int typecode)
+typecode_to_mformat_code(char typecode)
{
#ifdef WORDS_BIGENDIAN
const int is_big_endian = 1;
@@ -1671,6 +1732,16 @@ typecode_to_mformat_code(int typecode)
intsize = sizeof(long);
is_signed = 0;
break;
+#if HAVE_LONG_LONG
+ case 'q':
+ intsize = sizeof(PY_LONG_LONG);
+ is_signed = 1;
+ break;
+ case 'Q':
+ intsize = sizeof(PY_LONG_LONG);
+ is_signed = 0;
+ break;
+#endif
default:
return UNKNOWN_FORMAT;
}
@@ -1701,7 +1772,7 @@ static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
* NULL is returned to indicate a failure.
*/
static PyObject *
-make_array(PyTypeObject *arraytype, Py_UNICODE typecode, PyObject *items)
+make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
{
PyObject *new_args;
PyObject *array_obj;
@@ -1710,7 +1781,7 @@ make_array(PyTypeObject *arraytype, Py_UNICODE typecode, PyObject *items)
assert(arraytype != NULL);
assert(items != NULL);
- typecode_obj = PyUnicode_FromUnicode(&typecode, 1);
+ typecode_obj = PyUnicode_FromOrdinal(typecode);
if (typecode_obj == NULL)
return NULL;
@@ -1740,17 +1811,14 @@ array_reconstructor(PyObject *self, PyObject *args)
PyObject *items;
PyObject *converted_items;
PyObject *result;
- int typecode_int;
- Py_UNICODE typecode;
+ int typecode;
enum machine_format_code mformat_code;
struct arraydescr *descr;
if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
- &arraytype, &typecode_int, &mformat_code, &items))
+ &arraytype, &typecode, &mformat_code, &items))
return NULL;
- typecode = (Py_UNICODE)typecode_int;
-
if (!PyType_Check(arraytype)) {
PyErr_Format(PyExc_TypeError,
"first argument must a type object, not %.200s",
@@ -1764,7 +1832,7 @@ array_reconstructor(PyObject *self, PyObject *args)
return NULL;
}
for (descr = descriptors; descr->typecode != '\0'; descr++) {
- if (descr->typecode == typecode)
+ if ((int)descr->typecode == typecode)
break;
}
if (descr->typecode == '\0') {
@@ -1786,9 +1854,9 @@ array_reconstructor(PyObject *self, PyObject *args)
}
/* Fast path: No decoding has to be done. */
- if (mformat_code == typecode_to_mformat_code(typecode) ||
+ if (mformat_code == typecode_to_mformat_code((char)typecode) ||
mformat_code == UNKNOWN_FORMAT) {
- return make_array(arraytype, typecode, items);
+ return make_array(arraytype, (char)typecode, items);
}
/* Slow path: Decode the byte string according to the given machine
@@ -1934,7 +2002,7 @@ array_reconstructor(PyObject *self, PyObject *args)
return NULL;
}
- result = make_array(arraytype, typecode, converted_items);
+ result = make_array(arraytype, (char)typecode, converted_items);
Py_DECREF(converted_items);
return result;
}
@@ -1949,14 +2017,16 @@ array_reduce_ex(arrayobject *array, PyObject *value)
int mformat_code;
static PyObject *array_reconstructor = NULL;
long protocol;
+ _Py_IDENTIFIER(_array_reconstructor);
+ _Py_IDENTIFIER(__dict__);
if (array_reconstructor == NULL) {
PyObject *array_module = PyImport_ImportModule("array");
if (array_module == NULL)
return NULL;
- array_reconstructor = PyObject_GetAttrString(
+ array_reconstructor = _PyObject_GetAttrId(
array_module,
- "_array_reconstructor");
+ &PyId__array_reconstructor);
Py_DECREF(array_module);
if (array_reconstructor == NULL)
return NULL;
@@ -1971,7 +2041,7 @@ array_reduce_ex(arrayobject *array, PyObject *value)
if (protocol == -1 && PyErr_Occurred())
return NULL;
- dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
+ dict = _PyObject_GetAttrId((PyObject *)array, &PyId___dict__);
if (dict == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return NULL;
@@ -2023,8 +2093,8 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
static PyObject *
array_get_typecode(arrayobject *a, void *closure)
{
- Py_UNICODE tc = a->ob_descr->typecode;
- return PyUnicode_FromUnicode(&tc, 1);
+ char typecode = a->ob_descr->typecode;
+ return PyUnicode_FromOrdinal(typecode);
}
static PyObject *
@@ -2098,7 +2168,7 @@ static PyMethodDef array_methods[] = {
static PyObject *
array_repr(arrayobject *a)
{
- Py_UNICODE typecode;
+ char typecode;
PyObject *s, *v = NULL;
Py_ssize_t len;
@@ -2107,7 +2177,7 @@ array_repr(arrayobject *a)
if (len == 0) {
return PyUnicode_FromFormat("array('%c')", (int)typecode);
}
- if ((typecode == 'u'))
+ if (typecode == 'u')
v = array_tounicode(a, NULL);
else
v = array_tolist(a, NULL);
@@ -2302,7 +2372,7 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
self->ob_item + (cur + 1) * itemsize,
lim * itemsize);
}
- cur = start + slicelength * step;
+ cur = start + (size_t)slicelength * step;
if (cur < (size_t)Py_SIZE(self)) {
memmove(self->ob_item + (cur-slicelength) * itemsize,
self->ob_item + cur * itemsize,
@@ -2486,7 +2556,17 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF(v);
}
else if (initial != NULL && PyUnicode_Check(initial)) {
- Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
+ Py_UNICODE *ustr;
+ Py_ssize_t n;
+
+ ustr = PyUnicode_AsUnicode(initial);
+ if (ustr == NULL) {
+ PyErr_NoMemory();
+ Py_DECREF(a);
+ return NULL;
+ }
+
+ n = PyUnicode_GET_DATA_SIZE(initial);
if (n > 0) {
arrayobject *self = (arrayobject *)a;
char *item = self->ob_item;
@@ -2498,7 +2578,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
self->ob_item = item;
Py_SIZE(self) = n / sizeof(Py_UNICODE);
- memcpy(item, PyUnicode_AS_DATA(initial), n);
+ memcpy(item, ustr, n);
self->allocated = Py_SIZE(self);
}
}
@@ -2519,7 +2599,11 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
}
PyErr_SetString(PyExc_ValueError,
+#ifdef HAVE_LONG_LONG
+ "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
+#else
"bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
+#endif
return NULL;
}
@@ -2542,12 +2626,18 @@ is a single character. The following type codes are defined:\n\
'I' unsigned integer 2 \n\
'l' signed integer 4 \n\
'L' unsigned integer 4 \n\
+ 'q' signed integer 8 (see note) \n\
+ 'Q' unsigned integer 8 (see note) \n\
'f' floating point 4 \n\
'd' floating point 8 \n\
\n\
NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
\n\
+NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
+C compiler used to build Python supports 'long long', or, on Windows, \n\
+'__int64'.\n\
+\n\
The constructor is:\n\
\n\
array(typecode [, initializer]) -- create a new array\n\
@@ -2692,6 +2782,34 @@ arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
return 0;
}
+static PyObject *
+arrayiter_reduce(arrayiterobject *it)
+{
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
+ it->ao, it->index);
+}
+
+static PyObject *
+arrayiter_setstate(arrayiterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (index < 0)
+ index = 0;
+ it->index = index;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+static PyMethodDef arrayiter_methods[] = {
+ {"__reduce__", (PyCFunction)arrayiter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)arrayiter_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
static PyTypeObject PyArrayIter_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"arrayiterator", /* tp_name */
@@ -2721,7 +2839,7 @@ static PyTypeObject PyArrayIter_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)arrayiter_next, /* tp_iternext */
- 0, /* tp_methods */
+ arrayiter_methods, /* tp_methods */
};
@@ -2751,9 +2869,9 @@ PyMODINIT_FUNC
PyInit_array(void)
{
PyObject *m;
+ char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
PyObject *typecodes;
Py_ssize_t size = 0;
- register Py_UNICODE *p;
struct arraydescr *descr;
if (PyType_Ready(&Arraytype) < 0)
@@ -2772,13 +2890,13 @@ PyInit_array(void)
size++;
}
- typecodes = PyUnicode_FromStringAndSize(NULL, size);
- p = PyUnicode_AS_UNICODE(typecodes);
+ p = buffer;
for (descr = descriptors; descr->typecode != '\0'; descr++) {
*p++ = (char)descr->typecode;
}
+ typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
- PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
+ PyModule_AddObject(m, "typecodes", typecodes);
if (PyErr_Occurred()) {
Py_DECREF(m);
diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c
index 1ee7ead..f68d804 100644
--- a/Modules/atexitmodule.c
+++ b/Modules/atexitmodule.c
@@ -211,6 +211,14 @@ atexit_clear(PyObject *self, PyObject *unused)
Py_RETURN_NONE;
}
+static void
+atexit_free(PyObject *m)
+{
+ atexitmodule_state *modstate;
+ modstate = GET_ATEXIT_STATE(m);
+ PyMem_Free(modstate->atexit_callbacks);
+}
+
PyDoc_STRVAR(atexit_unregister__doc__,
"unregister(func) -> None\n\
\n\
@@ -275,7 +283,7 @@ static struct PyModuleDef atexitmodule = {
NULL,
NULL,
NULL,
- NULL
+ (freefunc)atexit_free
};
PyMODINIT_FUNC
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 9ab4834..2bca391 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -513,7 +513,6 @@ audioop_findfit(PyObject *self, PyObject *args)
best_result = result;
best_j = 0;
- j = 0;
for ( j=1; j<=len1-len2; j++) {
aj_m1 = (double)cp1[j-1];
@@ -599,7 +598,6 @@ audioop_findmax(PyObject *self, PyObject *args)
best_result = result;
best_j = 0;
- j = 0;
for ( j=1; j<=len1-len2; j++) {
aj_m1 = (double)cp1[j-1];
@@ -1110,8 +1108,7 @@ audioop_ratecv(PyObject *self, PyObject *args)
PyErr_SetString(AudioopError, "# of channels should be >= 1");
return NULL;
}
- bytes_per_frame = size * nchannels;
- if (bytes_per_frame / nchannels != size) {
+ if (size > INT_MAX / nchannels) {
/* This overflow test is rigorously correct because
both multiplicands are >= 1. Use the argument names
from the docs for the error msg. */
@@ -1119,6 +1116,7 @@ audioop_ratecv(PyObject *self, PyObject *args)
"width * nchannels too big for a C int");
return NULL;
}
+ bytes_per_frame = size * nchannels;
if (weightA < 1 || weightB < 0) {
PyErr_SetString(AudioopError,
"weightA should be >= 1, weightB should be >= 0");
@@ -1433,7 +1431,6 @@ audioop_lin2adpcm(PyObject *self, PyObject *args)
if ( state == Py_None ) {
/* First time, it seems. Set defaults */
valpred = 0;
- step = 7;
index = 0;
} else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
return 0;
@@ -1534,7 +1531,6 @@ audioop_adpcm2lin(PyObject *self, PyObject *args)
if ( state == Py_None ) {
/* First time, it seems. Set defaults */
valpred = 0;
- step = 7;
index = 0;
} else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
return 0;
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 19681b4..ad5e1b1 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -183,6 +183,44 @@ static unsigned short crctab_hqx[256] = {
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
};
+static int
+ascii_buffer_converter(PyObject *arg, Py_buffer *buf)
+{
+ if (arg == NULL) {
+ PyBuffer_Release(buf);
+ return 1;
+ }
+ if (PyUnicode_Check(arg)) {
+ if (PyUnicode_READY(arg) < 0)
+ return 0;
+ if (!PyUnicode_IS_ASCII(arg)) {
+ PyErr_SetString(PyExc_ValueError,
+ "string argument should contain only ASCII characters");
+ return 0;
+ }
+ assert(PyUnicode_KIND(arg) == PyUnicode_1BYTE_KIND);
+ buf->buf = (void *) PyUnicode_1BYTE_DATA(arg);
+ buf->len = PyUnicode_GET_LENGTH(arg);
+ buf->obj = NULL;
+ return 1;
+ }
+ if (PyObject_GetBuffer(arg, buf, PyBUF_SIMPLE) != 0) {
+ PyErr_Format(PyExc_TypeError,
+ "argument should be bytes, buffer or ASCII string, "
+ "not %R", Py_TYPE(arg));
+ return 0;
+ }
+ if (!PyBuffer_IsContiguous(buf, 'C')) {
+ PyErr_Format(PyExc_TypeError,
+ "argument should be a contiguous buffer, "
+ "not %R", Py_TYPE(arg));
+ PyBuffer_Release(buf);
+ return 0;
+ }
+ return Py_CLEANUP_SUPPORTED;
+}
+
+
PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");
static PyObject *
@@ -196,7 +234,7 @@ binascii_a2b_uu(PyObject *self, PyObject *args)
PyObject *rv;
Py_ssize_t ascii_len, bin_len;
- if ( !PyArg_ParseTuple(args, "y*:a2b_uu", &pascii) )
+ if ( !PyArg_ParseTuple(args, "O&:a2b_uu", ascii_buffer_converter, &pascii) )
return NULL;
ascii_data = pascii.buf;
ascii_len = pascii.len;
@@ -370,7 +408,7 @@ binascii_a2b_base64(PyObject *self, PyObject *args)
Py_ssize_t ascii_len, bin_len;
int quad_pos = 0;
- if ( !PyArg_ParseTuple(args, "y*:a2b_base64", &pascii) )
+ if ( !PyArg_ParseTuple(args, "O&:a2b_base64", ascii_buffer_converter, &pascii) )
return NULL;
ascii_data = pascii.buf;
ascii_len = pascii.len;
@@ -546,7 +584,7 @@ binascii_a2b_hqx(PyObject *self, PyObject *args)
Py_ssize_t len;
int done = 0;
- if ( !PyArg_ParseTuple(args, "y*:a2b_hqx", &pascii) )
+ if ( !PyArg_ParseTuple(args, "O&:a2b_hqx", ascii_buffer_converter, &pascii) )
return NULL;
ascii_data = pascii.buf;
len = pascii.len;
@@ -1078,13 +1116,11 @@ binascii_hexlify(PyObject *self, PyObject *args)
/* make hex version of string, taken from shamodule.c */
for (i=j=0; i < arglen; i++) {
- char c;
+ unsigned char c;
c = (argbuf[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- retbuf[j++] = c;
+ retbuf[j++] = Py_hexdigits[c];
c = argbuf[i] & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- retbuf[j++] = c;
+ retbuf[j++] = Py_hexdigits[c];
}
PyBuffer_Release(&parg);
return retval;
@@ -1121,7 +1157,7 @@ binascii_unhexlify(PyObject *self, PyObject *args)
char* retbuf;
Py_ssize_t i, j;
- if (!PyArg_ParseTuple(args, "y*:a2b_hex", &parg))
+ if (!PyArg_ParseTuple(args, "O&:a2b_hex", ascii_buffer_converter, &parg))
return NULL;
argbuf = parg.buf;
arglen = parg.len;
@@ -1199,8 +1235,8 @@ binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
static char *kwlist[] = {"data", "header", NULL};
int header = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", kwlist, &pdata,
- &header))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|i:a2b_qp", kwlist,
+ ascii_buffer_converter, &pdata, &header))
return NULL;
data = pdata.buf;
datalen = pdata.len;
diff --git a/Modules/bz2module.c b/Modules/bz2module.c
deleted file mode 100644
index 4795965..0000000
--- a/Modules/bz2module.c
+++ /dev/null
@@ -1,2193 +0,0 @@
-/*
-
-python-bz2 - python bz2 library interface
-
-Copyright (c) 2002 Gustavo Niemeyer <niemeyer@conectiva.com>
-Copyright (c) 2002 Python Software Foundation; All Rights Reserved
-
-*/
-
-#include "Python.h"
-#include <stdio.h>
-#include <bzlib.h>
-#include "structmember.h"
-
-#ifdef WITH_THREAD
-#include "pythread.h"
-#endif
-
-static char __author__[] =
-"The bz2 python module was written by:\n\
-\n\
- Gustavo Niemeyer <niemeyer@conectiva.com>\n\
-";
-
-/* Our very own off_t-like type, 64-bit if possible */
-/* copied from Objects/fileobject.c */
-#if !defined(HAVE_LARGEFILE_SUPPORT)
-typedef off_t Py_off_t;
-#elif SIZEOF_OFF_T >= 8
-typedef off_t Py_off_t;
-#elif SIZEOF_FPOS_T >= 8
-typedef fpos_t Py_off_t;
-#else
-#error "Large file support, but neither off_t nor fpos_t is large enough."
-#endif
-
-#define BUF(v) PyBytes_AS_STRING(v)
-
-#define MODE_CLOSED 0
-#define MODE_READ 1
-#define MODE_READ_EOF 2
-#define MODE_WRITE 3
-
-
-#ifndef BZ_CONFIG_ERROR
-
-#define BZ2_bzRead bzRead
-#define BZ2_bzReadOpen bzReadOpen
-#define BZ2_bzReadClose bzReadClose
-#define BZ2_bzWrite bzWrite
-#define BZ2_bzWriteOpen bzWriteOpen
-#define BZ2_bzWriteClose bzWriteClose
-#define BZ2_bzCompress bzCompress
-#define BZ2_bzCompressInit bzCompressInit
-#define BZ2_bzCompressEnd bzCompressEnd
-#define BZ2_bzDecompress bzDecompress
-#define BZ2_bzDecompressInit bzDecompressInit
-#define BZ2_bzDecompressEnd bzDecompressEnd
-
-#endif /* ! BZ_CONFIG_ERROR */
-
-
-#ifdef WITH_THREAD
-#define ACQUIRE_LOCK(obj) do { \
- if (!PyThread_acquire_lock(obj->lock, 0)) { \
- Py_BEGIN_ALLOW_THREADS \
- PyThread_acquire_lock(obj->lock, 1); \
- Py_END_ALLOW_THREADS \
- } } while(0)
-#define RELEASE_LOCK(obj) PyThread_release_lock(obj->lock)
-#else
-#define ACQUIRE_LOCK(obj)
-#define RELEASE_LOCK(obj)
-#endif
-
-#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
-
-/* ===================================================================== */
-/* Structure definitions. */
-
-typedef struct {
- PyObject_HEAD
- FILE *rawfp;
-
- char* f_buf; /* Allocated readahead buffer */
- char* f_bufend; /* Points after last occupied position */
- char* f_bufptr; /* Current buffer position */
-
- BZFILE *fp;
- int mode;
- Py_off_t pos;
- Py_off_t size;
-#ifdef WITH_THREAD
- PyThread_type_lock lock;
-#endif
-} BZ2FileObject;
-
-typedef struct {
- PyObject_HEAD
- bz_stream bzs;
- int running;
-#ifdef WITH_THREAD
- PyThread_type_lock lock;
-#endif
-} BZ2CompObject;
-
-typedef struct {
- PyObject_HEAD
- bz_stream bzs;
- int running;
- PyObject *unused_data;
-#ifdef WITH_THREAD
- PyThread_type_lock lock;
-#endif
-} BZ2DecompObject;
-
-/* ===================================================================== */
-/* Utility functions. */
-
-/* Refuse regular I/O if there's data in the iteration-buffer.
- * Mixing them would cause data to arrive out of order, as the read*
- * methods don't use the iteration buffer. */
-static int
-check_iterbuffered(BZ2FileObject *f)
-{
- if (f->f_buf != NULL &&
- (f->f_bufend - f->f_bufptr) > 0 &&
- f->f_buf[0] != '\0') {
- PyErr_SetString(PyExc_ValueError,
- "Mixing iteration and read methods would lose data");
- return -1;
- }
- return 0;
-}
-
-static int
-Util_CatchBZ2Error(int bzerror)
-{
- int ret = 0;
- switch(bzerror) {
- case BZ_OK:
- case BZ_STREAM_END:
- break;
-
-#ifdef BZ_CONFIG_ERROR
- case BZ_CONFIG_ERROR:
- PyErr_SetString(PyExc_SystemError,
- "the bz2 library was not compiled "
- "correctly");
- ret = 1;
- break;
-#endif
-
- case BZ_PARAM_ERROR:
- PyErr_SetString(PyExc_ValueError,
- "the bz2 library has received wrong "
- "parameters");
- ret = 1;
- break;
-
- case BZ_MEM_ERROR:
- PyErr_NoMemory();
- ret = 1;
- break;
-
- case BZ_DATA_ERROR:
- case BZ_DATA_ERROR_MAGIC:
- PyErr_SetString(PyExc_IOError, "invalid data stream");
- ret = 1;
- break;
-
- case BZ_IO_ERROR:
- PyErr_SetString(PyExc_IOError, "unknown IO error");
- ret = 1;
- break;
-
- case BZ_UNEXPECTED_EOF:
- PyErr_SetString(PyExc_EOFError,
- "compressed file ended before the "
- "logical end-of-stream was detected");
- ret = 1;
- break;
-
- case BZ_SEQUENCE_ERROR:
- PyErr_SetString(PyExc_RuntimeError,
- "wrong sequence of bz2 library "
- "commands used");
- ret = 1;
- break;
- }
- return ret;
-}
-
-#if BUFSIZ < 8192
-#define SMALLCHUNK 8192
-#else
-#define SMALLCHUNK BUFSIZ
-#endif
-
-/* This is a hacked version of Python's fileobject.c:new_buffersize(). */
-static size_t
-Util_NewBufferSize(size_t currentsize)
-{
- /* Expand the buffer by an amount proportional to the current size,
- giving us amortized linear-time behavior. Use a less-than-double
- growth factor to avoid excessive allocation. */
- return currentsize + (currentsize >> 3) + 6;
-}
-
-static int
-Util_GrowBuffer(PyObject **buf)
-{
- size_t size = PyBytes_GET_SIZE(*buf);
- size_t new_size = Util_NewBufferSize(size);
- if (new_size > size) {
- return _PyBytes_Resize(buf, new_size);
- } else { /* overflow */
- PyErr_SetString(PyExc_OverflowError,
- "Unable to allocate buffer - output too large");
- return -1;
- }
-}
-
-/* This is a hacked version of Python's fileobject.c:get_line(). */
-static PyObject *
-Util_GetLine(BZ2FileObject *f, int n)
-{
- char c;
- char *buf, *end;
- size_t total_v_size; /* total # of slots in buffer */
- size_t used_v_size; /* # used slots in buffer */
- size_t increment; /* amount to increment the buffer */
- PyObject *v;
- int bzerror;
- int bytes_read;
-
- total_v_size = n > 0 ? n : 100;
- v = PyBytes_FromStringAndSize((char *)NULL, total_v_size);
- if (v == NULL)
- return NULL;
-
- buf = BUF(v);
- end = buf + total_v_size;
-
- for (;;) {
- Py_BEGIN_ALLOW_THREADS
- do {
- bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
- f->pos++;
- if (bytes_read == 0)
- break;
- *buf++ = c;
- } while (bzerror == BZ_OK && c != '\n' && buf != end);
- Py_END_ALLOW_THREADS
- if (bzerror == BZ_STREAM_END) {
- f->size = f->pos;
- f->mode = MODE_READ_EOF;
- break;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- Py_DECREF(v);
- return NULL;
- }
- if (c == '\n')
- break;
- /* Must be because buf == end */
- if (n > 0)
- break;
- used_v_size = total_v_size;
- increment = total_v_size >> 2; /* mild exponential growth */
- total_v_size += increment;
- if (total_v_size > INT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "line is longer than a Python string can hold");
- Py_DECREF(v);
- return NULL;
- }
- if (_PyBytes_Resize(&v, total_v_size) < 0) {
- return NULL;
- }
- buf = BUF(v) + used_v_size;
- end = BUF(v) + total_v_size;
- }
-
- used_v_size = buf - BUF(v);
- if (used_v_size != total_v_size) {
- if (_PyBytes_Resize(&v, used_v_size) < 0) {
- v = NULL;
- }
- }
- return v;
-}
-
-/* This is a hacked version of Python's fileobject.c:drop_readahead(). */
-static void
-Util_DropReadAhead(BZ2FileObject *f)
-{
- if (f->f_buf != NULL) {
- PyMem_Free(f->f_buf);
- f->f_buf = NULL;
- }
-}
-
-/* This is a hacked version of Python's fileobject.c:readahead(). */
-static int
-Util_ReadAhead(BZ2FileObject *f, int bufsize)
-{
- int chunksize;
- int bzerror;
-
- if (f->f_buf != NULL) {
- if((f->f_bufend - f->f_bufptr) >= 1)
- return 0;
- else
- Util_DropReadAhead(f);
- }
- if (f->mode == MODE_READ_EOF) {
- f->f_bufptr = f->f_buf;
- f->f_bufend = f->f_buf;
- return 0;
- }
- if ((f->f_buf = PyMem_Malloc(bufsize)) == NULL) {
- PyErr_NoMemory();
- return -1;
- }
- Py_BEGIN_ALLOW_THREADS
- chunksize = BZ2_bzRead(&bzerror, f->fp, f->f_buf, bufsize);
- Py_END_ALLOW_THREADS
- f->pos += chunksize;
- if (bzerror == BZ_STREAM_END) {
- f->size = f->pos;
- f->mode = MODE_READ_EOF;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- Util_DropReadAhead(f);
- return -1;
- }
- f->f_bufptr = f->f_buf;
- f->f_bufend = f->f_buf + chunksize;
- return 0;
-}
-
-/* This is a hacked version of Python's
- * fileobject.c:readahead_get_line_skip(). */
-static PyBytesObject *
-Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
-{
- PyBytesObject* s;
- char *bufptr;
- char *buf;
- int len;
-
- if (f->f_buf == NULL)
- if (Util_ReadAhead(f, bufsize) < 0)
- return NULL;
-
- len = f->f_bufend - f->f_bufptr;
- if (len == 0)
- return (PyBytesObject *)
- PyBytes_FromStringAndSize(NULL, skip);
- bufptr = memchr(f->f_bufptr, '\n', len);
- if (bufptr != NULL) {
- bufptr++; /* Count the '\n' */
- len = bufptr - f->f_bufptr;
- s = (PyBytesObject *)
- PyBytes_FromStringAndSize(NULL, skip+len);
- if (s == NULL)
- return NULL;
- memcpy(PyBytes_AS_STRING(s)+skip, f->f_bufptr, len);
- f->f_bufptr = bufptr;
- if (bufptr == f->f_bufend)
- Util_DropReadAhead(f);
- } else {
- bufptr = f->f_bufptr;
- buf = f->f_buf;
- f->f_buf = NULL; /* Force new readahead buffer */
- s = Util_ReadAheadGetLineSkip(f, skip+len,
- bufsize + (bufsize>>2));
- if (s == NULL) {
- PyMem_Free(buf);
- return NULL;
- }
- memcpy(PyBytes_AS_STRING(s)+skip, bufptr, len);
- PyMem_Free(buf);
- }
- return s;
-}
-
-/* ===================================================================== */
-/* Methods of BZ2File. */
-
-PyDoc_STRVAR(BZ2File_read__doc__,
-"read([size]) -> string\n\
-\n\
-Read at most size uncompressed bytes, returned as a string. If the size\n\
-argument is negative or omitted, read until EOF is reached.\n\
-");
-
-/* This is a hacked version of Python's fileobject.c:file_read(). */
-static PyObject *
-BZ2File_read(BZ2FileObject *self, PyObject *args)
-{
- long bytesrequested = -1;
- size_t bytesread, buffersize, chunksize;
- int bzerror;
- PyObject *ret = NULL;
-
- if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))
- return NULL;
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_READ:
- break;
- case MODE_READ_EOF:
- ret = PyBytes_FromStringAndSize("", 0);
- goto cleanup;
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
- default:
- PyErr_SetString(PyExc_IOError,
- "file is not ready for reading");
- goto cleanup;
- }
-
- /* refuse to mix with f.next() */
- if (check_iterbuffered(self))
- goto cleanup;
-
- if (bytesrequested < 0)
- buffersize = Util_NewBufferSize((size_t)0);
- else
- buffersize = bytesrequested;
- if (buffersize > INT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "requested number of bytes is "
- "more than a Python string can hold");
- goto cleanup;
- }
- ret = PyBytes_FromStringAndSize((char *)NULL, buffersize);
- if (ret == NULL || buffersize == 0)
- goto cleanup;
- bytesread = 0;
-
- for (;;) {
- Py_BEGIN_ALLOW_THREADS
- chunksize = BZ2_bzRead(&bzerror, self->fp,
- BUF(ret)+bytesread,
- buffersize-bytesread);
- self->pos += chunksize;
- Py_END_ALLOW_THREADS
- bytesread += chunksize;
- if (bzerror == BZ_STREAM_END) {
- self->size = self->pos;
- self->mode = MODE_READ_EOF;
- break;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- Py_DECREF(ret);
- ret = NULL;
- goto cleanup;
- }
- if (bytesrequested < 0) {
- buffersize = Util_NewBufferSize(buffersize);
- if (_PyBytes_Resize(&ret, buffersize) < 0) {
- ret = NULL;
- goto cleanup;
- }
- } else {
- break;
- }
- }
- if (bytesread != buffersize) {
- if (_PyBytes_Resize(&ret, bytesread) < 0) {
- ret = NULL;
- }
- }
-
-cleanup:
- RELEASE_LOCK(self);
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_readline__doc__,
-"readline([size]) -> string\n\
-\n\
-Return the next line from the file, as a string, retaining newline.\n\
-A non-negative size argument will limit the maximum number of bytes to\n\
-return (an incomplete line may be returned then). Return an empty\n\
-string at EOF.\n\
-");
-
-static PyObject *
-BZ2File_readline(BZ2FileObject *self, PyObject *args)
-{
- PyObject *ret = NULL;
- int sizehint = -1;
-
- if (!PyArg_ParseTuple(args, "|i:readline", &sizehint))
- return NULL;
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_READ:
- break;
- case MODE_READ_EOF:
- ret = PyBytes_FromStringAndSize("", 0);
- goto cleanup;
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
- default:
- PyErr_SetString(PyExc_IOError,
- "file is not ready for reading");
- goto cleanup;
- }
-
- /* refuse to mix with f.next() */
- if (check_iterbuffered(self))
- goto cleanup;
-
- if (sizehint == 0)
- ret = PyBytes_FromStringAndSize("", 0);
- else
- ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint);
-
-cleanup:
- RELEASE_LOCK(self);
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_readlines__doc__,
-"readlines([size]) -> list\n\
-\n\
-Call readline() repeatedly and return a list of lines read.\n\
-The optional size argument, if given, is an approximate bound on the\n\
-total number of bytes in the lines returned.\n\
-");
-
-/* This is a hacked version of Python's fileobject.c:file_readlines(). */
-static PyObject *
-BZ2File_readlines(BZ2FileObject *self, PyObject *args)
-{
- long sizehint = 0;
- PyObject *list = NULL;
- PyObject *line;
- char small_buffer[SMALLCHUNK];
- char *buffer = small_buffer;
- size_t buffersize = SMALLCHUNK;
- PyObject *big_buffer = NULL;
- size_t nfilled = 0;
- size_t nread;
- size_t totalread = 0;
- char *p, *q, *end;
- int err;
- int shortread = 0;
- int bzerror;
-
- if (!PyArg_ParseTuple(args, "|l:readlines", &sizehint))
- return NULL;
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_READ:
- break;
- case MODE_READ_EOF:
- list = PyList_New(0);
- goto cleanup;
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
- default:
- PyErr_SetString(PyExc_IOError,
- "file is not ready for reading");
- goto cleanup;
- }
-
- /* refuse to mix with f.next() */
- if (check_iterbuffered(self))
- goto cleanup;
-
- if ((list = PyList_New(0)) == NULL)
- goto cleanup;
-
- for (;;) {
- Py_BEGIN_ALLOW_THREADS
- nread = BZ2_bzRead(&bzerror, self->fp,
- buffer+nfilled, buffersize-nfilled);
- self->pos += nread;
- Py_END_ALLOW_THREADS
- if (bzerror == BZ_STREAM_END) {
- self->size = self->pos;
- self->mode = MODE_READ_EOF;
- if (nread == 0) {
- sizehint = 0;
- break;
- }
- shortread = 1;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- error:
- Py_DECREF(list);
- list = NULL;
- goto cleanup;
- }
- totalread += nread;
- p = memchr(buffer+nfilled, '\n', nread);
- if (!shortread && p == NULL) {
- /* Need a larger buffer to fit this line */
- nfilled += nread;
- buffersize *= 2;
- if (buffersize > INT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "line is longer than a Python string can hold");
- goto error;
- }
- if (big_buffer == NULL) {
- /* Create the big buffer */
- big_buffer = PyBytes_FromStringAndSize(
- NULL, buffersize);
- if (big_buffer == NULL)
- goto error;
- buffer = PyBytes_AS_STRING(big_buffer);
- memcpy(buffer, small_buffer, nfilled);
- }
- else {
- /* Grow the big buffer */
- if (_PyBytes_Resize(&big_buffer, buffersize) < 0){
- big_buffer = NULL;
- goto error;
- }
- buffer = PyBytes_AS_STRING(big_buffer);
- }
- continue;
- }
- end = buffer+nfilled+nread;
- q = buffer;
- while (p != NULL) {
- /* Process complete lines */
- p++;
- line = PyBytes_FromStringAndSize(q, p-q);
- if (line == NULL)
- goto error;
- err = PyList_Append(list, line);
- Py_DECREF(line);
- if (err != 0)
- goto error;
- q = p;
- p = memchr(q, '\n', end-q);
- }
- /* Move the remaining incomplete line to the start */
- nfilled = end-q;
- memmove(buffer, q, nfilled);
- if (sizehint > 0)
- if (totalread >= (size_t)sizehint)
- break;
- if (shortread) {
- sizehint = 0;
- break;
- }
- }
- if (nfilled != 0) {
- /* Partial last line */
- line = PyBytes_FromStringAndSize(buffer, nfilled);
- if (line == NULL)
- goto error;
- if (sizehint > 0) {
- /* Need to complete the last line */
- PyObject *rest = Util_GetLine(self, 0);
- if (rest == NULL) {
- Py_DECREF(line);
- goto error;
- }
- PyBytes_Concat(&line, rest);
- Py_DECREF(rest);
- if (line == NULL)
- goto error;
- }
- err = PyList_Append(list, line);
- Py_DECREF(line);
- if (err != 0)
- goto error;
- }
-
- cleanup:
- RELEASE_LOCK(self);
- if (big_buffer) {
- Py_DECREF(big_buffer);
- }
- return list;
-}
-
-PyDoc_STRVAR(BZ2File_write__doc__,
-"write(data) -> None\n\
-\n\
-Write the 'data' string to file. Note that due to buffering, close() may\n\
-be needed before the file on disk reflects the data written.\n\
-");
-
-/* This is a hacked version of Python's fileobject.c:file_write(). */
-static PyObject *
-BZ2File_write(BZ2FileObject *self, PyObject *args)
-{
- PyObject *ret = NULL;
- Py_buffer pbuf;
- char *buf;
- int len;
- int bzerror;
-
- if (!PyArg_ParseTuple(args, "y*:write", &pbuf))
- return NULL;
- buf = pbuf.buf;
- len = pbuf.len;
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_WRITE:
- break;
-
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
-
- default:
- PyErr_SetString(PyExc_IOError,
- "file is not ready for writing");
- goto cleanup;
- }
-
- Py_BEGIN_ALLOW_THREADS
- BZ2_bzWrite (&bzerror, self->fp, buf, len);
- self->pos += len;
- Py_END_ALLOW_THREADS
-
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
-
- Py_INCREF(Py_None);
- ret = Py_None;
-
-cleanup:
- PyBuffer_Release(&pbuf);
- RELEASE_LOCK(self);
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_writelines__doc__,
-"writelines(sequence_of_strings) -> None\n\
-\n\
-Write the sequence of strings to the file. Note that newlines are not\n\
-added. The sequence can be any iterable object producing strings. This is\n\
-equivalent to calling write() for each string.\n\
-");
-
-/* This is a hacked version of Python's fileobject.c:file_writelines(). */
-static PyObject *
-BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
-{
-#define CHUNKSIZE 1000
- PyObject *list = NULL;
- PyObject *iter = NULL;
- PyObject *ret = NULL;
- PyObject *line;
- int i, j, index, len, islist;
- int bzerror;
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_WRITE:
- break;
-
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto error;
-
- default:
- PyErr_SetString(PyExc_IOError,
- "file is not ready for writing");
- goto error;
- }
-
- islist = PyList_Check(seq);
- if (!islist) {
- iter = PyObject_GetIter(seq);
- if (iter == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "writelines() requires an iterable argument");
- goto error;
- }
- list = PyList_New(CHUNKSIZE);
- if (list == NULL)
- goto error;
- }
-
- /* Strategy: slurp CHUNKSIZE lines into a private list,
- checking that they are all strings, then write that list
- without holding the interpreter lock, then come back for more. */
- for (index = 0; ; index += CHUNKSIZE) {
- if (islist) {
- Py_XDECREF(list);
- list = PyList_GetSlice(seq, index, index+CHUNKSIZE);
- if (list == NULL)
- goto error;
- j = PyList_GET_SIZE(list);
- }
- else {
- for (j = 0; j < CHUNKSIZE; j++) {
- line = PyIter_Next(iter);
- if (line == NULL) {
- if (PyErr_Occurred())
- goto error;
- break;
- }
- PyList_SetItem(list, j, line);
- }
- }
- if (j == 0)
- break;
-
- /* Check that all entries are indeed byte strings. If not,
- apply the same rules as for file.write() and
- convert the rets to strings. This is slow, but
- seems to be the only way since all conversion APIs
- could potentially execute Python code. */
- for (i = 0; i < j; i++) {
- PyObject *v = PyList_GET_ITEM(list, i);
- if (!PyBytes_Check(v)) {
- const char *buffer;
- Py_ssize_t len;
- if (PyObject_AsCharBuffer(v, &buffer, &len)) {
- PyErr_SetString(PyExc_TypeError,
- "writelines() "
- "argument must be "
- "a sequence of "
- "bytes objects");
- goto error;
- }
- line = PyBytes_FromStringAndSize(buffer,
- len);
- if (line == NULL)
- goto error;
- Py_DECREF(v);
- PyList_SET_ITEM(list, i, line);
- }
- }
-
- /* Since we are releasing the global lock, the
- following code may *not* execute Python code. */
- Py_BEGIN_ALLOW_THREADS
- for (i = 0; i < j; i++) {
- line = PyList_GET_ITEM(list, i);
- len = PyBytes_GET_SIZE(line);
- BZ2_bzWrite (&bzerror, self->fp,
- PyBytes_AS_STRING(line), len);
- if (bzerror != BZ_OK) {
- Py_BLOCK_THREADS
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
- }
- Py_END_ALLOW_THREADS
-
- if (j < CHUNKSIZE)
- break;
- }
-
- Py_INCREF(Py_None);
- ret = Py_None;
-
- error:
- RELEASE_LOCK(self);
- Py_XDECREF(list);
- Py_XDECREF(iter);
- return ret;
-#undef CHUNKSIZE
-}
-
-PyDoc_STRVAR(BZ2File_seek__doc__,
-"seek(offset [, whence]) -> None\n\
-\n\
-Move to new file position. Argument offset is a byte count. Optional\n\
-argument whence defaults to 0 (offset from start of file, offset\n\
-should be >= 0); other values are 1 (move relative to current position,\n\
-positive or negative), and 2 (move relative to end of file, usually\n\
-negative, although many platforms allow seeking beyond the end of a file).\n\
-\n\
-Note that seeking of bz2 files is emulated, and depending on the parameters\n\
-the operation may be extremely slow.\n\
-");
-
-static PyObject *
-BZ2File_seek(BZ2FileObject *self, PyObject *args)
-{
- int where = 0;
- PyObject *offobj;
- Py_off_t offset;
- char small_buffer[SMALLCHUNK];
- char *buffer = small_buffer;
- size_t buffersize = SMALLCHUNK;
- Py_off_t bytesread = 0;
- size_t readsize;
- int chunksize;
- int bzerror;
- PyObject *ret = NULL;
-
- if (!PyArg_ParseTuple(args, "O|i:seek", &offobj, &where))
- return NULL;
-#if !defined(HAVE_LARGEFILE_SUPPORT)
- offset = PyLong_AsLong(offobj);
-#else
- offset = PyLong_Check(offobj) ?
- PyLong_AsLongLong(offobj) : PyLong_AsLong(offobj);
-#endif
- if (PyErr_Occurred())
- return NULL;
-
- ACQUIRE_LOCK(self);
- Util_DropReadAhead(self);
- switch (self->mode) {
- case MODE_READ:
- case MODE_READ_EOF:
- break;
-
- case MODE_CLOSED:
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
-
- default:
- PyErr_SetString(PyExc_IOError,
- "seek works only while reading");
- goto cleanup;
- }
-
- if (where == 2) {
- if (self->size == -1) {
- assert(self->mode != MODE_READ_EOF);
- for (;;) {
- Py_BEGIN_ALLOW_THREADS
- chunksize = BZ2_bzRead(&bzerror, self->fp,
- buffer, buffersize);
- self->pos += chunksize;
- Py_END_ALLOW_THREADS
-
- bytesread += chunksize;
- if (bzerror == BZ_STREAM_END) {
- break;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
- }
- self->mode = MODE_READ_EOF;
- self->size = self->pos;
- bytesread = 0;
- }
- offset = self->size + offset;
- } else if (where == 1) {
- offset = self->pos + offset;
- }
-
- /* Before getting here, offset must be the absolute position the file
- * pointer should be set to. */
-
- if (offset >= self->pos) {
- /* we can move forward */
- offset -= self->pos;
- } else {
- /* we cannot move back, so rewind the stream */
- BZ2_bzReadClose(&bzerror, self->fp);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
- rewind(self->rawfp);
- self->pos = 0;
- self->fp = BZ2_bzReadOpen(&bzerror, self->rawfp,
- 0, 0, NULL, 0);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
- self->mode = MODE_READ;
- }
-
- if (offset <= 0 || self->mode == MODE_READ_EOF)
- goto exit;
-
- /* Before getting here, offset must be set to the number of bytes
- * to walk forward. */
- for (;;) {
- if (offset-bytesread > buffersize)
- readsize = buffersize;
- else
- /* offset might be wider that readsize, but the result
- * of the subtraction is bound by buffersize (see the
- * condition above). buffersize is 8192. */
- readsize = (size_t)(offset-bytesread);
- Py_BEGIN_ALLOW_THREADS
- chunksize = BZ2_bzRead(&bzerror, self->fp, buffer, readsize);
- self->pos += chunksize;
- Py_END_ALLOW_THREADS
- bytesread += chunksize;
- if (bzerror == BZ_STREAM_END) {
- self->size = self->pos;
- self->mode = MODE_READ_EOF;
- break;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
- if (bytesread == offset)
- break;
- }
-
-exit:
- Py_INCREF(Py_None);
- ret = Py_None;
-
-cleanup:
- RELEASE_LOCK(self);
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_tell__doc__,
-"tell() -> int\n\
-\n\
-Return the current file position, an integer (may be a long integer).\n\
-");
-
-static PyObject *
-BZ2File_tell(BZ2FileObject *self, PyObject *args)
-{
- PyObject *ret = NULL;
-
- if (self->mode == MODE_CLOSED) {
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- goto cleanup;
- }
-
-#if !defined(HAVE_LARGEFILE_SUPPORT)
- ret = PyLong_FromLong(self->pos);
-#else
- ret = PyLong_FromLongLong(self->pos);
-#endif
-
-cleanup:
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_close__doc__,
-"close() -> None or (perhaps) an integer\n\
-\n\
-Close the file. Sets data attribute .closed to true. A closed file\n\
-cannot be used for further I/O operations. close() may be called more\n\
-than once without error.\n\
-");
-
-static PyObject *
-BZ2File_close(BZ2FileObject *self)
-{
- PyObject *ret = NULL;
- int bzerror = BZ_OK;
-
- if (self->mode == MODE_CLOSED) {
- Py_RETURN_NONE;
- }
-
- ACQUIRE_LOCK(self);
- switch (self->mode) {
- case MODE_READ:
- case MODE_READ_EOF:
- BZ2_bzReadClose(&bzerror, self->fp);
- break;
- case MODE_WRITE:
- BZ2_bzWriteClose(&bzerror, self->fp,
- 0, NULL, NULL);
- break;
- }
- self->mode = MODE_CLOSED;
- fclose(self->rawfp);
- self->rawfp = NULL;
- if (bzerror == BZ_OK) {
- Py_INCREF(Py_None);
- ret = Py_None;
- }
- else {
- Util_CatchBZ2Error(bzerror);
- }
-
- RELEASE_LOCK(self);
- return ret;
-}
-
-PyDoc_STRVAR(BZ2File_enter_doc,
-"__enter__() -> self.");
-
-static PyObject *
-BZ2File_enter(BZ2FileObject *self)
-{
- if (self->mode == MODE_CLOSED) {
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- return NULL;
- }
- Py_INCREF(self);
- return (PyObject *) self;
-}
-
-PyDoc_STRVAR(BZ2File_exit_doc,
-"__exit__(*excinfo) -> None. Closes the file.");
-
-static PyObject *
-BZ2File_exit(BZ2FileObject *self, PyObject *args)
-{
- PyObject *ret = PyObject_CallMethod((PyObject *) self, "close", NULL);
- if (!ret)
- /* If error occurred, pass through */
- return NULL;
- Py_DECREF(ret);
- Py_RETURN_NONE;
-}
-
-
-static PyObject *BZ2File_getiter(BZ2FileObject *self);
-
-static PyMethodDef BZ2File_methods[] = {
- {"read", (PyCFunction)BZ2File_read, METH_VARARGS, BZ2File_read__doc__},
- {"readline", (PyCFunction)BZ2File_readline, METH_VARARGS, BZ2File_readline__doc__},
- {"readlines", (PyCFunction)BZ2File_readlines, METH_VARARGS, BZ2File_readlines__doc__},
- {"write", (PyCFunction)BZ2File_write, METH_VARARGS, BZ2File_write__doc__},
- {"writelines", (PyCFunction)BZ2File_writelines, METH_O, BZ2File_writelines__doc__},
- {"seek", (PyCFunction)BZ2File_seek, METH_VARARGS, BZ2File_seek__doc__},
- {"tell", (PyCFunction)BZ2File_tell, METH_NOARGS, BZ2File_tell__doc__},
- {"close", (PyCFunction)BZ2File_close, METH_NOARGS, BZ2File_close__doc__},
- {"__enter__", (PyCFunction)BZ2File_enter, METH_NOARGS, BZ2File_enter_doc},
- {"__exit__", (PyCFunction)BZ2File_exit, METH_VARARGS, BZ2File_exit_doc},
- {NULL, NULL} /* sentinel */
-};
-
-
-/* ===================================================================== */
-/* Getters and setters of BZ2File. */
-
-static PyObject *
-BZ2File_get_closed(BZ2FileObject *self, void *closure)
-{
- return PyLong_FromLong(self->mode == MODE_CLOSED);
-}
-
-static PyGetSetDef BZ2File_getset[] = {
- {"closed", (getter)BZ2File_get_closed, NULL,
- "True if the file is closed"},
- {NULL} /* Sentinel */
-};
-
-
-/* ===================================================================== */
-/* Slot definitions for BZ2File_Type. */
-
-static int
-BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = {"filename", "mode", "buffering",
- "compresslevel", 0};
- PyObject *name_obj = NULL;
- char *name;
- char *mode = "r";
- int buffering = -1;
- int compresslevel = 9;
- int bzerror;
- int mode_char = 0;
-
- self->size = -1;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|sii:BZ2File",
- kwlist, PyUnicode_FSConverter, &name_obj,
- &mode, &buffering,
- &compresslevel))
- return -1;
-
- name = PyBytes_AsString(name_obj);
- if (compresslevel < 1 || compresslevel > 9) {
- PyErr_SetString(PyExc_ValueError,
- "compresslevel must be between 1 and 9");
- Py_DECREF(name_obj);
- return -1;
- }
-
- for (;;) {
- int error = 0;
- switch (*mode) {
- case 'r':
- case 'w':
- if (mode_char)
- error = 1;
- mode_char = *mode;
- break;
-
- case 'b':
- break;
-
- default:
- error = 1;
- break;
- }
- if (error) {
- PyErr_Format(PyExc_ValueError,
- "invalid mode char %c", *mode);
- Py_DECREF(name_obj);
- return -1;
- }
- mode++;
- if (*mode == '\0')
- break;
- }
-
- if (mode_char == 0) {
- mode_char = 'r';
- }
-
- mode = (mode_char == 'r') ? "rb" : "wb";
-
- self->rawfp = fopen(name, mode);
- Py_DECREF(name_obj);
- if (self->rawfp == NULL) {
- PyErr_SetFromErrno(PyExc_IOError);
- return -1;
- }
- /* XXX Ignore buffering */
-
- /* From now on, we have stuff to dealloc, so jump to error label
- * instead of returning */
-
-#ifdef WITH_THREAD
- self->lock = PyThread_allocate_lock();
- if (!self->lock) {
- PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
- goto error;
- }
-#endif
-
- if (mode_char == 'r')
- self->fp = BZ2_bzReadOpen(&bzerror, self->rawfp,
- 0, 0, NULL, 0);
- else
- self->fp = BZ2_bzWriteOpen(&bzerror, self->rawfp,
- compresslevel, 0, 0);
-
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
-
- self->mode = (mode_char == 'r') ? MODE_READ : MODE_WRITE;
-
- return 0;
-
-error:
- fclose(self->rawfp);
- self->rawfp = NULL;
-#ifdef WITH_THREAD
- if (self->lock) {
- PyThread_free_lock(self->lock);
- self->lock = NULL;
- }
-#endif
- return -1;
-}
-
-static void
-BZ2File_dealloc(BZ2FileObject *self)
-{
- int bzerror;
-#ifdef WITH_THREAD
- if (self->lock)
- PyThread_free_lock(self->lock);
-#endif
- switch (self->mode) {
- case MODE_READ:
- case MODE_READ_EOF:
- BZ2_bzReadClose(&bzerror, self->fp);
- break;
- case MODE_WRITE:
- BZ2_bzWriteClose(&bzerror, self->fp,
- 0, NULL, NULL);
- break;
- }
- Util_DropReadAhead(self);
- if (self->rawfp != NULL)
- fclose(self->rawfp);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-/* This is a hacked version of Python's fileobject.c:file_getiter(). */
-static PyObject *
-BZ2File_getiter(BZ2FileObject *self)
-{
- if (self->mode == MODE_CLOSED) {
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- return NULL;
- }
- Py_INCREF((PyObject*)self);
- return (PyObject *)self;
-}
-
-/* This is a hacked version of Python's fileobject.c:file_iternext(). */
-#define READAHEAD_BUFSIZE 8192
-static PyObject *
-BZ2File_iternext(BZ2FileObject *self)
-{
- PyBytesObject* ret;
- ACQUIRE_LOCK(self);
- if (self->mode == MODE_CLOSED) {
- RELEASE_LOCK(self);
- PyErr_SetString(PyExc_ValueError,
- "I/O operation on closed file");
- return NULL;
- }
- ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE);
- RELEASE_LOCK(self);
- if (ret == NULL || PyBytes_GET_SIZE(ret) == 0) {
- Py_XDECREF(ret);
- return NULL;
- }
- return (PyObject *)ret;
-}
-
-/* ===================================================================== */
-/* BZ2File_Type definition. */
-
-PyDoc_VAR(BZ2File__doc__) =
-PyDoc_STR(
-"BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\n\
-\n\
-Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or\n\
-writing. When opened for writing, the file will be created if it doesn't\n\
-exist, and truncated otherwise. If the buffering argument is given, 0 means\n\
-unbuffered, and larger numbers specify the buffer size. If compresslevel\n\
-is given, must be a number between 1 and 9.\n\
-Data read is always returned in bytes; data written ought to be bytes.\n\
-");
-
-static PyTypeObject BZ2File_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "bz2.BZ2File", /*tp_name*/
- sizeof(BZ2FileObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)BZ2File_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- PyObject_GenericGetAttr,/*tp_getattro*/
- PyObject_GenericSetAttr,/*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
- BZ2File__doc__, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- (getiterfunc)BZ2File_getiter, /*tp_iter*/
- (iternextfunc)BZ2File_iternext, /*tp_iternext*/
- BZ2File_methods, /*tp_methods*/
- 0, /*tp_members*/
- BZ2File_getset, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- (initproc)BZ2File_init, /*tp_init*/
- PyType_GenericAlloc, /*tp_alloc*/
- PyType_GenericNew, /*tp_new*/
- PyObject_Free, /*tp_free*/
- 0, /*tp_is_gc*/
-};
-
-
-/* ===================================================================== */
-/* Methods of BZ2Comp. */
-
-PyDoc_STRVAR(BZ2Comp_compress__doc__,
-"compress(data) -> string\n\
-\n\
-Provide more data to the compressor object. It will return chunks of\n\
-compressed data whenever possible. When you've finished providing data\n\
-to compress, call the flush() method to finish the compression process,\n\
-and return what is left in the internal buffers.\n\
-");
-
-static PyObject *
-BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
-{
- Py_buffer pdata;
- size_t input_left;
- size_t output_size = 0;
- PyObject *ret = NULL;
- bz_stream *bzs = &self->bzs;
- int bzerror;
-
- if (!PyArg_ParseTuple(args, "y*:compress", &pdata))
- return NULL;
-
- if (pdata.len == 0) {
- PyBuffer_Release(&pdata);
- return PyBytes_FromStringAndSize("", 0);
- }
-
- ACQUIRE_LOCK(self);
- if (!self->running) {
- PyErr_SetString(PyExc_ValueError,
- "this object was already flushed");
- goto error;
- }
-
- ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (!ret)
- goto error;
-
- bzs->next_in = pdata.buf;
- bzs->avail_in = MIN(pdata.len, UINT_MAX);
- input_left = pdata.len - bzs->avail_in;
-
- bzs->next_out = BUF(ret);
- bzs->avail_out = PyBytes_GET_SIZE(ret);
-
- for (;;) {
- char *saved_next_out;
-
- Py_BEGIN_ALLOW_THREADS
- saved_next_out = bzs->next_out;
- bzerror = BZ2_bzCompress(bzs, BZ_RUN);
- output_size += bzs->next_out - saved_next_out;
- Py_END_ALLOW_THREADS
-
- if (bzerror != BZ_RUN_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
- if (bzs->avail_in == 0) {
- if (input_left == 0)
- break; /* no more input data */
- bzs->avail_in = MIN(input_left, UINT_MAX);
- input_left -= bzs->avail_in;
- }
- if (bzs->avail_out == 0) {
- size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- if (buffer_left == 0) {
- if (Util_GrowBuffer(&ret) < 0) {
- BZ2_bzCompressEnd(bzs);
- goto error;
- }
- bzs->next_out = BUF(ret) + output_size;
- buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- }
- bzs->avail_out = MIN(buffer_left, UINT_MAX);
- }
- }
-
- if (_PyBytes_Resize(&ret, output_size) < 0)
- goto error;
-
- RELEASE_LOCK(self);
- PyBuffer_Release(&pdata);
- return ret;
-
-error:
- RELEASE_LOCK(self);
- PyBuffer_Release(&pdata);
- Py_XDECREF(ret);
- return NULL;
-}
-
-PyDoc_STRVAR(BZ2Comp_flush__doc__,
-"flush() -> string\n\
-\n\
-Finish the compression process and return what is left in internal buffers.\n\
-You must not use the compressor object after calling this method.\n\
-");
-
-static PyObject *
-BZ2Comp_flush(BZ2CompObject *self)
-{
- size_t output_size = 0;
- PyObject *ret = NULL;
- bz_stream *bzs = &self->bzs;
- int bzerror;
-
- ACQUIRE_LOCK(self);
- if (!self->running) {
- PyErr_SetString(PyExc_ValueError, "object was already flushed");
- goto error;
- }
- self->running = 0;
-
- ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (!ret)
- goto error;
-
- bzs->next_out = BUF(ret);
- bzs->avail_out = PyBytes_GET_SIZE(ret);
-
- for (;;) {
- char *saved_next_out;
-
- Py_BEGIN_ALLOW_THREADS
- saved_next_out = bzs->next_out;
- bzerror = BZ2_bzCompress(bzs, BZ_FINISH);
- output_size += bzs->next_out - saved_next_out;
- Py_END_ALLOW_THREADS
-
- if (bzerror == BZ_STREAM_END) {
- break;
- } else if (bzerror != BZ_FINISH_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
- if (bzs->avail_out == 0) {
- size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- if (buffer_left == 0) {
- if (Util_GrowBuffer(&ret) < 0)
- goto error;
- bzs->next_out = BUF(ret) + output_size;
- buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- }
- bzs->avail_out = MIN(buffer_left, UINT_MAX);
- }
- }
-
- if (output_size != PyBytes_GET_SIZE(ret))
- if (_PyBytes_Resize(&ret, output_size) < 0)
- goto error;
-
- RELEASE_LOCK(self);
- return ret;
-
-error:
- RELEASE_LOCK(self);
- Py_XDECREF(ret);
- return NULL;
-}
-
-static PyMethodDef BZ2Comp_methods[] = {
- {"compress", (PyCFunction)BZ2Comp_compress, METH_VARARGS,
- BZ2Comp_compress__doc__},
- {"flush", (PyCFunction)BZ2Comp_flush, METH_NOARGS,
- BZ2Comp_flush__doc__},
- {NULL, NULL} /* sentinel */
-};
-
-
-/* ===================================================================== */
-/* Slot definitions for BZ2Comp_Type. */
-
-static int
-BZ2Comp_init(BZ2CompObject *self, PyObject *args, PyObject *kwargs)
-{
- int compresslevel = 9;
- int bzerror;
- static char *kwlist[] = {"compresslevel", 0};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:BZ2Compressor",
- kwlist, &compresslevel))
- return -1;
-
- if (compresslevel < 1 || compresslevel > 9) {
- PyErr_SetString(PyExc_ValueError,
- "compresslevel must be between 1 and 9");
- goto error;
- }
-
-#ifdef WITH_THREAD
- self->lock = PyThread_allocate_lock();
- if (!self->lock) {
- PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
- goto error;
- }
-#endif
-
- memset(&self->bzs, 0, sizeof(bz_stream));
- bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
-
- self->running = 1;
-
- return 0;
-error:
-#ifdef WITH_THREAD
- if (self->lock) {
- PyThread_free_lock(self->lock);
- self->lock = NULL;
- }
-#endif
- return -1;
-}
-
-static void
-BZ2Comp_dealloc(BZ2CompObject *self)
-{
-#ifdef WITH_THREAD
- if (self->lock)
- PyThread_free_lock(self->lock);
-#endif
- BZ2_bzCompressEnd(&self->bzs);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-
-/* ===================================================================== */
-/* BZ2Comp_Type definition. */
-
-PyDoc_STRVAR(BZ2Comp__doc__,
-"BZ2Compressor([compresslevel=9]) -> compressor object\n\
-\n\
-Create a new compressor object. This object may be used to compress\n\
-data sequentially. If you want to compress data in one shot, use the\n\
-compress() function instead. The compresslevel parameter, if given,\n\
-must be a number between 1 and 9.\n\
-");
-
-static PyTypeObject BZ2Comp_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "bz2.BZ2Compressor", /*tp_name*/
- sizeof(BZ2CompObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)BZ2Comp_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- PyObject_GenericGetAttr,/*tp_getattro*/
- PyObject_GenericSetAttr,/*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
- BZ2Comp__doc__, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- BZ2Comp_methods, /*tp_methods*/
- 0, /*tp_members*/
- 0, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- (initproc)BZ2Comp_init, /*tp_init*/
- PyType_GenericAlloc, /*tp_alloc*/
- PyType_GenericNew, /*tp_new*/
- PyObject_Free, /*tp_free*/
- 0, /*tp_is_gc*/
-};
-
-
-/* ===================================================================== */
-/* Members of BZ2Decomp. */
-
-#undef OFF
-#define OFF(x) offsetof(BZ2DecompObject, x)
-
-static PyMemberDef BZ2Decomp_members[] = {
- {"unused_data", T_OBJECT, OFF(unused_data), READONLY},
- {NULL} /* Sentinel */
-};
-
-
-/* ===================================================================== */
-/* Methods of BZ2Decomp. */
-
-PyDoc_STRVAR(BZ2Decomp_decompress__doc__,
-"decompress(data) -> string\n\
-\n\
-Provide more data to the decompressor object. It will return chunks\n\
-of decompressed data whenever possible. If you try to decompress data\n\
-after the end of stream is found, EOFError will be raised. If any data\n\
-was found after the end of stream, it'll be ignored and saved in\n\
-unused_data attribute.\n\
-");
-
-static PyObject *
-BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
-{
- Py_buffer pdata;
- size_t input_left;
- size_t output_size = 0;
- PyObject *ret = NULL;
- bz_stream *bzs = &self->bzs;
- int bzerror;
-
- if (!PyArg_ParseTuple(args, "y*:decompress", &pdata))
- return NULL;
-
- ACQUIRE_LOCK(self);
- if (!self->running) {
- PyErr_SetString(PyExc_EOFError, "end of stream was "
- "already found");
- goto error;
- }
-
- ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (!ret)
- goto error;
-
- bzs->next_in = pdata.buf;
- bzs->avail_in = MIN(pdata.len, UINT_MAX);
- input_left = pdata.len - bzs->avail_in;
-
- bzs->next_out = BUF(ret);
- bzs->avail_out = PyBytes_GET_SIZE(ret);
-
- for (;;) {
- char *saved_next_out;
-
- Py_BEGIN_ALLOW_THREADS
- saved_next_out = bzs->next_out;
- bzerror = BZ2_bzDecompress(bzs);
- output_size += bzs->next_out - saved_next_out;
- Py_END_ALLOW_THREADS
-
- if (bzerror == BZ_STREAM_END) {
- self->running = 0;
- input_left += bzs->avail_in;
- if (input_left != 0) {
- Py_DECREF(self->unused_data);
- self->unused_data =
- PyBytes_FromStringAndSize(bzs->next_in, input_left);
- if (self->unused_data == NULL)
- goto error;
- }
- break;
- }
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
- if (bzs->avail_in == 0) {
- if (input_left == 0)
- break; /* no more input data */
- bzs->avail_in = MIN(input_left, UINT_MAX);
- input_left -= bzs->avail_in;
- }
- if (bzs->avail_out == 0) {
- size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- if (buffer_left == 0) {
- if (Util_GrowBuffer(&ret) < 0) {
- BZ2_bzDecompressEnd(bzs);
- goto error;
- }
- bzs->next_out = BUF(ret) + output_size;
- buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- }
- bzs->avail_out = MIN(buffer_left, UINT_MAX);
- }
- }
-
- if (output_size != PyBytes_GET_SIZE(ret))
- if (_PyBytes_Resize(&ret, output_size) < 0)
- goto error;
-
- RELEASE_LOCK(self);
- PyBuffer_Release(&pdata);
- return ret;
-
-error:
- RELEASE_LOCK(self);
- PyBuffer_Release(&pdata);
- Py_XDECREF(ret);
- return NULL;
-}
-
-static PyMethodDef BZ2Decomp_methods[] = {
- {"decompress", (PyCFunction)BZ2Decomp_decompress, METH_VARARGS, BZ2Decomp_decompress__doc__},
- {NULL, NULL} /* sentinel */
-};
-
-
-/* ===================================================================== */
-/* Slot definitions for BZ2Decomp_Type. */
-
-static int
-BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
-{
- int bzerror;
-
- if (!PyArg_ParseTuple(args, ":BZ2Decompressor"))
- return -1;
-
-#ifdef WITH_THREAD
- self->lock = PyThread_allocate_lock();
- if (!self->lock) {
- PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
- goto error;
- }
-#endif
-
- self->unused_data = PyBytes_FromStringAndSize("", 0);
- if (!self->unused_data)
- goto error;
-
- memset(&self->bzs, 0, sizeof(bz_stream));
- bzerror = BZ2_bzDecompressInit(&self->bzs, 0, 0);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto error;
- }
-
- self->running = 1;
-
- return 0;
-
-error:
-#ifdef WITH_THREAD
- if (self->lock) {
- PyThread_free_lock(self->lock);
- self->lock = NULL;
- }
-#endif
- Py_CLEAR(self->unused_data);
- return -1;
-}
-
-static void
-BZ2Decomp_dealloc(BZ2DecompObject *self)
-{
-#ifdef WITH_THREAD
- if (self->lock)
- PyThread_free_lock(self->lock);
-#endif
- Py_XDECREF(self->unused_data);
- BZ2_bzDecompressEnd(&self->bzs);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-
-/* ===================================================================== */
-/* BZ2Decomp_Type definition. */
-
-PyDoc_STRVAR(BZ2Decomp__doc__,
-"BZ2Decompressor() -> decompressor object\n\
-\n\
-Create a new decompressor object. This object may be used to decompress\n\
-data sequentially. If you want to decompress data in one shot, use the\n\
-decompress() function instead.\n\
-");
-
-static PyTypeObject BZ2Decomp_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "bz2.BZ2Decompressor", /*tp_name*/
- sizeof(BZ2DecompObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)BZ2Decomp_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- PyObject_GenericGetAttr,/*tp_getattro*/
- PyObject_GenericSetAttr,/*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
- BZ2Decomp__doc__, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- BZ2Decomp_methods, /*tp_methods*/
- BZ2Decomp_members, /*tp_members*/
- 0, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- (initproc)BZ2Decomp_init, /*tp_init*/
- PyType_GenericAlloc, /*tp_alloc*/
- PyType_GenericNew, /*tp_new*/
- PyObject_Free, /*tp_free*/
- 0, /*tp_is_gc*/
-};
-
-
-/* ===================================================================== */
-/* Module functions. */
-
-PyDoc_STRVAR(bz2_compress__doc__,
-"compress(data [, compresslevel=9]) -> string\n\
-\n\
-Compress data in one shot. If you want to compress data sequentially,\n\
-use an instance of BZ2Compressor instead. The compresslevel parameter, if\n\
-given, must be a number between 1 and 9.\n\
-");
-
-static PyObject *
-bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- int compresslevel=9;
- int action;
- Py_buffer pdata;
- size_t input_left;
- size_t output_size = 0;
- PyObject *ret = NULL;
- bz_stream _bzs;
- bz_stream *bzs = &_bzs;
- int bzerror;
- static char *kwlist[] = {"data", "compresslevel", 0};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i",
- kwlist, &pdata,
- &compresslevel))
- return NULL;
-
- if (compresslevel < 1 || compresslevel > 9) {
- PyErr_SetString(PyExc_ValueError,
- "compresslevel must be between 1 and 9");
- PyBuffer_Release(&pdata);
- return NULL;
- }
-
- ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (!ret) {
- PyBuffer_Release(&pdata);
- return NULL;
- }
-
- memset(bzs, 0, sizeof(bz_stream));
-
- bzs->next_in = pdata.buf;
- bzs->avail_in = MIN(pdata.len, UINT_MAX);
- input_left = pdata.len - bzs->avail_in;
-
- bzs->next_out = BUF(ret);
- bzs->avail_out = PyBytes_GET_SIZE(ret);
-
- bzerror = BZ2_bzCompressInit(bzs, compresslevel, 0, 0);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- PyBuffer_Release(&pdata);
- Py_DECREF(ret);
- return NULL;
- }
-
- action = BZ_RUN;
-
- for (;;) {
- char *saved_next_out;
-
- Py_BEGIN_ALLOW_THREADS
- saved_next_out = bzs->next_out;
- bzerror = BZ2_bzCompress(bzs, action);
- output_size += bzs->next_out - saved_next_out;
- Py_END_ALLOW_THREADS
-
- if (bzerror == BZ_STREAM_END) {
- break;
- } else if (bzerror != BZ_RUN_OK && bzerror != BZ_FINISH_OK) {
- BZ2_bzCompressEnd(bzs);
- Util_CatchBZ2Error(bzerror);
- PyBuffer_Release(&pdata);
- Py_DECREF(ret);
- return NULL;
- }
- if (action == BZ_RUN && bzs->avail_in == 0) {
- if (input_left == 0) {
- action = BZ_FINISH;
- } else {
- bzs->avail_in = MIN(input_left, UINT_MAX);
- input_left -= bzs->avail_in;
- }
- }
- if (bzs->avail_out == 0) {
- size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- if (buffer_left == 0) {
- if (Util_GrowBuffer(&ret) < 0) {
- BZ2_bzCompressEnd(bzs);
- PyBuffer_Release(&pdata);
- return NULL;
- }
- bzs->next_out = BUF(ret) + output_size;
- buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- }
- bzs->avail_out = MIN(buffer_left, UINT_MAX);
- }
- }
-
- if (output_size != PyBytes_GET_SIZE(ret))
- _PyBytes_Resize(&ret, output_size); /* Sets ret to NULL on failure. */
-
- BZ2_bzCompressEnd(bzs);
- PyBuffer_Release(&pdata);
- return ret;
-}
-
-PyDoc_STRVAR(bz2_decompress__doc__,
-"decompress(data) -> decompressed data\n\
-\n\
-Decompress data in one shot. If you want to decompress data sequentially,\n\
-use an instance of BZ2Decompressor instead.\n\
-");
-
-static PyObject *
-bz2_decompress(PyObject *self, PyObject *args)
-{
- Py_buffer pdata;
- size_t input_left;
- size_t output_size = 0;
- PyObject *ret;
- bz_stream _bzs;
- bz_stream *bzs = &_bzs;
- int bzerror;
-
- if (!PyArg_ParseTuple(args, "y*:decompress", &pdata))
- return NULL;
-
- if (pdata.len == 0) {
- PyBuffer_Release(&pdata);
- return PyBytes_FromStringAndSize("", 0);
- }
-
- ret = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
- if (!ret) {
- PyBuffer_Release(&pdata);
- return NULL;
- }
-
- memset(bzs, 0, sizeof(bz_stream));
-
- bzs->next_in = pdata.buf;
- bzs->avail_in = MIN(pdata.len, UINT_MAX);
- input_left = pdata.len - bzs->avail_in;
-
- bzs->next_out = BUF(ret);
- bzs->avail_out = PyBytes_GET_SIZE(ret);
-
- bzerror = BZ2_bzDecompressInit(bzs, 0, 0);
- if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- Py_DECREF(ret);
- PyBuffer_Release(&pdata);
- return NULL;
- }
-
- for (;;) {
- char *saved_next_out;
-
- Py_BEGIN_ALLOW_THREADS
- saved_next_out = bzs->next_out;
- bzerror = BZ2_bzDecompress(bzs);
- output_size += bzs->next_out - saved_next_out;
- Py_END_ALLOW_THREADS
-
- if (bzerror == BZ_STREAM_END) {
- break;
- } else if (bzerror != BZ_OK) {
- BZ2_bzDecompressEnd(bzs);
- Util_CatchBZ2Error(bzerror);
- PyBuffer_Release(&pdata);
- Py_DECREF(ret);
- return NULL;
- }
- if (bzs->avail_in == 0) {
- if (input_left == 0) {
- BZ2_bzDecompressEnd(bzs);
- PyErr_SetString(PyExc_ValueError,
- "couldn't find end of stream");
- PyBuffer_Release(&pdata);
- Py_DECREF(ret);
- return NULL;
- }
- bzs->avail_in = MIN(input_left, UINT_MAX);
- input_left -= bzs->avail_in;
- }
- if (bzs->avail_out == 0) {
- size_t buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- if (buffer_left == 0) {
- if (Util_GrowBuffer(&ret) < 0) {
- BZ2_bzDecompressEnd(bzs);
- PyBuffer_Release(&pdata);
- return NULL;
- }
- bzs->next_out = BUF(ret) + output_size;
- buffer_left = PyBytes_GET_SIZE(ret) - output_size;
- }
- bzs->avail_out = MIN(buffer_left, UINT_MAX);
- }
- }
-
- if (output_size != PyBytes_GET_SIZE(ret))
- _PyBytes_Resize(&ret, output_size); /* Sets ret to NULL on failure. */
-
- BZ2_bzDecompressEnd(bzs);
- PyBuffer_Release(&pdata);
- return ret;
-}
-
-static PyMethodDef bz2_methods[] = {
- {"compress", (PyCFunction) bz2_compress, METH_VARARGS|METH_KEYWORDS,
- bz2_compress__doc__},
- {"decompress", (PyCFunction) bz2_decompress, METH_VARARGS,
- bz2_decompress__doc__},
- {NULL, NULL} /* sentinel */
-};
-
-/* ===================================================================== */
-/* Initialization function. */
-
-PyDoc_STRVAR(bz2__doc__,
-"The python bz2 module provides a comprehensive interface for\n\
-the bz2 compression library. It implements a complete file\n\
-interface, one shot (de)compression functions, and types for\n\
-sequential (de)compression.\n\
-");
-
-
-static struct PyModuleDef bz2module = {
- PyModuleDef_HEAD_INIT,
- "bz2",
- bz2__doc__,
- -1,
- bz2_methods,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-PyMODINIT_FUNC
-PyInit_bz2(void)
-{
- PyObject *m;
-
- if (PyType_Ready(&BZ2File_Type) < 0)
- return NULL;
- if (PyType_Ready(&BZ2Comp_Type) < 0)
- return NULL;
- if (PyType_Ready(&BZ2Decomp_Type) < 0)
- return NULL;
-
- m = PyModule_Create(&bz2module);
- if (m == NULL)
- return NULL;
-
- PyModule_AddObject(m, "__author__", PyUnicode_FromString(__author__));
-
- Py_INCREF(&BZ2File_Type);
- PyModule_AddObject(m, "BZ2File", (PyObject *)&BZ2File_Type);
-
- Py_INCREF(&BZ2Comp_Type);
- PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Comp_Type);
-
- Py_INCREF(&BZ2Decomp_Type);
- PyModule_AddObject(m, "BZ2Decompressor", (PyObject *)&BZ2Decomp_Type);
- return m;
-}
diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c
index ab4e659..9e9e96c 100644
--- a/Modules/cjkcodecs/_codecs_cn.c
+++ b/Modules/cjkcodecs/_codecs_cn.c
@@ -85,7 +85,7 @@ DECODER(gb2312)
TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
NEXT(2, 1)
}
- else return 2;
+ else return 1;
}
return 0;
@@ -141,7 +141,7 @@ DECODER(gbk)
REQUIRE_INBUF(2)
GBK_DECODE(c, IN2, **outbuf)
- else return 2;
+ else return 1;
NEXT(2, 1)
}
@@ -267,7 +267,7 @@ DECODER(gb18030)
c3 = IN3;
c4 = IN4;
if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)
- return 4;
+ return 1;
c -= 0x81; c2 -= 0x30;
c3 -= 0x81; c4 -= 0x30;
@@ -292,12 +292,12 @@ DECODER(gb18030)
continue;
}
}
- return 4;
+ return 1;
}
GBK_DECODE(c, c2, **outbuf)
else TRYMAP_DEC(gb18030ext, **outbuf, c, c2);
- else return 2;
+ else return 1;
NEXT(2, 1)
}
@@ -400,7 +400,7 @@ DECODER(hz)
else if (c2 == '\n')
; /* line-continuation */
else
- return 2;
+ return 1;
NEXT(2, 0);
continue;
}
@@ -419,7 +419,7 @@ DECODER(hz)
NEXT(2, 1)
}
else
- return 2;
+ return 1;
}
}
diff --git a/Modules/cjkcodecs/_codecs_hk.c b/Modules/cjkcodecs/_codecs_hk.c
index 558a42f..d3ad04b 100644
--- a/Modules/cjkcodecs/_codecs_hk.c
+++ b/Modules/cjkcodecs/_codecs_hk.c
@@ -161,7 +161,7 @@ DECODER(big5hkscs)
case 0x8864: WRITE2(0x00ca, 0x030c); break;
case 0x88a3: WRITE2(0x00ea, 0x0304); break;
case 0x88a5: WRITE2(0x00ea, 0x030c); break;
- default: return 2;
+ default: return 1;
}
NEXT(2, 2) /* all decoded codepoints are pairs, above. */
diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c
index 25c1a36..cbc1542 100644
--- a/Modules/cjkcodecs/_codecs_iso2022.c
+++ b/Modules/cjkcodecs/_codecs_iso2022.c
@@ -123,7 +123,7 @@ struct iso2022_config {
CODEC_INIT(iso2022)
{
- const struct iso2022_designation *desig = CONFIG_DESIGNATIONS;
+ const struct iso2022_designation *desig;
for (desig = CONFIG_DESIGNATIONS; desig->mark; desig++)
if (desig->initializer != NULL && desig->initializer() != 0)
return -1;
diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c
index a05e01b..a500696 100644
--- a/Modules/cjkcodecs/_codecs_jp.c
+++ b/Modules/cjkcodecs/_codecs_jp.c
@@ -112,7 +112,7 @@ DECODER(cp932)
TRYMAP_DEC(cp932ext, **outbuf, c, c2);
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
- return 2;
+ return 1;
c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
@@ -120,7 +120,7 @@ DECODER(cp932)
c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
TRYMAP_DEC(jisx0208, **outbuf, c, c2);
- else return 2;
+ else return 1;
}
else if (c >= 0xf0 && c <= 0xf9) {
if ((c2 >= 0x40 && c2 <= 0x7e) ||
@@ -128,10 +128,10 @@ DECODER(cp932)
OUT1(0xe000 + 188 * (c - 0xf0) +
(c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))
else
- return 2;
+ return 1;
}
else
- return 2;
+ return 1;
NEXT(2, 1)
}
@@ -256,7 +256,7 @@ DECODER(euc_jis_2004)
NEXT(2, 1)
}
else
- return 2;
+ return 1;
}
else if (c == 0x8f) {
unsigned char c2, c3;
@@ -274,7 +274,7 @@ DECODER(euc_jis_2004)
continue;
}
else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;
- else return 3;
+ else return 1;
NEXT(3, 1)
}
else {
@@ -300,7 +300,7 @@ DECODER(euc_jis_2004)
NEXT(2, 2)
continue;
}
- else return 2;
+ else return 1;
NEXT(2, 1)
}
}
@@ -388,7 +388,7 @@ DECODER(euc_jp)
NEXT(2, 1)
}
else
- return 2;
+ return 1;
}
else if (c == 0x8f) {
unsigned char c2, c3;
@@ -401,7 +401,7 @@ DECODER(euc_jp)
NEXT(3, 1)
}
else
- return 3;
+ return 1;
}
else {
unsigned char c2;
@@ -417,7 +417,7 @@ DECODER(euc_jp)
#endif
TRYMAP_DEC(jisx0208, **outbuf,
c ^ 0x80, c2 ^ 0x80) ;
- else return 2;
+ else return 1;
NEXT(2, 1)
}
}
@@ -502,7 +502,7 @@ DECODER(shift_jis)
REQUIRE_INBUF(2)
c2 = IN2;
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
- return 2;
+ return 1;
c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
@@ -522,10 +522,10 @@ DECODER(shift_jis)
continue;
}
else
- return 2;
+ return 1;
}
else
- return 2;
+ return 1;
NEXT(1, 1) /* JIS X 0201 */
}
@@ -645,7 +645,7 @@ DECODER(shift_jis_2004)
REQUIRE_INBUF(2)
c2 = IN2;
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
- return 2;
+ return 1;
c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
@@ -671,7 +671,7 @@ DECODER(shift_jis_2004)
NEXT_OUT(2)
}
else
- return 2;
+ return 1;
NEXT_IN(2)
}
else { /* Plane 2 */
@@ -689,13 +689,13 @@ DECODER(shift_jis_2004)
continue;
}
else
- return 2;
+ return 1;
NEXT(2, 1)
}
continue;
}
else
- return 2;
+ return 1;
NEXT(1, 1) /* JIS X 0201 */
}
diff --git a/Modules/cjkcodecs/_codecs_kr.c b/Modules/cjkcodecs/_codecs_kr.c
index 9272e36..f5697dd 100644
--- a/Modules/cjkcodecs/_codecs_kr.c
+++ b/Modules/cjkcodecs/_codecs_kr.c
@@ -123,7 +123,7 @@ DECODER(euc_kr)
if ((*inbuf)[2] != EUCKR_JAMO_FIRSTBYTE ||
(*inbuf)[4] != EUCKR_JAMO_FIRSTBYTE ||
(*inbuf)[6] != EUCKR_JAMO_FIRSTBYTE)
- return 8;
+ return 1;
c = (*inbuf)[3];
if (0xa1 <= c && c <= 0xbe)
@@ -143,7 +143,7 @@ DECODER(euc_kr)
jong = NONE;
if (cho == NONE || jung == NONE || jong == NONE)
- return 8;
+ return 1;
OUT1(0xac00 + cho*588 + jung*28 + jong);
NEXT(8, 1)
@@ -152,7 +152,7 @@ DECODER(euc_kr)
NEXT(2, 1)
}
else
- return 2;
+ return 1;
}
return 0;
@@ -208,7 +208,7 @@ DECODER(cp949)
REQUIRE_INBUF(2)
TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80);
else TRYMAP_DEC(cp949ext, **outbuf, c, IN2);
- else return 2;
+ else return 1;
NEXT(2, 1)
}
@@ -375,7 +375,7 @@ DECODER(johab)
i_jong = johabidx_jongseong[c_jong];
if (i_cho == NONE || i_jung == NONE || i_jong == NONE)
- return 2;
+ return 1;
/* we don't use U+1100 hangul jamo yet. */
if (i_cho == FILL) {
@@ -391,7 +391,7 @@ DECODER(johab)
OUT1(0x3100 |
johabjamo_jungseong[c_jung])
else
- return 2;
+ return 1;
}
} else {
if (i_jung == FILL) {
@@ -399,7 +399,7 @@ DECODER(johab)
OUT1(0x3100 |
johabjamo_choseong[c_cho])
else
- return 2;
+ return 1;
}
else
OUT1(0xac00 +
@@ -414,7 +414,7 @@ DECODER(johab)
c2 < 0x31 || (c2 >= 0x80 && c2 < 0x91) ||
(c2 & 0x7f) == 0x7f ||
(c == 0xda && (c2 >= 0xa1 && c2 <= 0xd3)))
- return 2;
+ return 1;
else {
unsigned char t1, t2;
@@ -425,7 +425,7 @@ DECODER(johab)
t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;
TRYMAP_DEC(ksx1001, **outbuf, t1, t2);
- else return 2;
+ else return 1;
NEXT(2, 1)
}
}
diff --git a/Modules/cjkcodecs/_codecs_tw.c b/Modules/cjkcodecs/_codecs_tw.c
index 38cf723..916298d 100644
--- a/Modules/cjkcodecs/_codecs_tw.c
+++ b/Modules/cjkcodecs/_codecs_tw.c
@@ -55,7 +55,7 @@ DECODER(big5)
TRYMAP_DEC(big5, **outbuf, c, IN2) {
NEXT(2, 1)
}
- else return 2;
+ else return 1;
}
return 0;
@@ -109,7 +109,7 @@ DECODER(cp950)
TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
else TRYMAP_DEC(big5, **outbuf, c, IN2);
- else return 2;
+ else return 1;
NEXT(2, 1)
}
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 7b04f020..abad251 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -443,10 +443,12 @@ multibytecodec_decerror(MultibyteCodec *codec,
goto errorexit;
}
+ if (PyUnicode_AsUnicode(retuni) == NULL)
+ goto errorexit;
retunisize = PyUnicode_GET_SIZE(retuni);
if (retunisize > 0) {
REQUIRE_DECODEBUFFER(buf, retunisize);
- memcpy((char *)buf->outbuf, PyUnicode_AS_DATA(retuni),
+ memcpy((char *)buf->outbuf, PyUnicode_AS_UNICODE(retuni),
retunisize * Py_UNICODE_SIZE);
buf->outbuf += retunisize;
}
@@ -483,6 +485,7 @@ multibytecodec_encode(MultibyteCodec *codec,
return PyBytes_FromStringAndSize(NULL, 0);
buf.excobj = NULL;
+ buf.outobj = NULL;
buf.inbuf = buf.inbuf_top = *data;
buf.inbuf_end = buf.inbuf_top + datalen;
@@ -573,8 +576,11 @@ MultibyteCodec_Encode(MultibyteCodecObject *self,
}
}
- data = PyUnicode_AS_UNICODE(arg);
- datalen = PyUnicode_GET_SIZE(arg);
+ data = PyUnicode_AsUnicodeAndSize(arg, &datalen);
+ if (data == NULL) {
+ Py_XDECREF(ucvt);
+ return NULL;
+ }
errorcb = internal_error_callback(errors);
if (errorcb == NULL) {
@@ -627,7 +633,7 @@ MultibyteCodec_Decode(MultibyteCodecObject *self,
if (datalen == 0) {
PyBuffer_Release(&pdata);
ERROR_DECREF(errorcb);
- return make_tuple(PyUnicode_FromUnicode(NULL, 0), 0);
+ return make_tuple(PyUnicode_New(0, 0), 0);
}
buf.excobj = NULL;
@@ -637,6 +643,8 @@ MultibyteCodec_Decode(MultibyteCodecObject *self,
if (buf.outobj == NULL)
goto errorexit;
buf.outbuf = PyUnicode_AS_UNICODE(buf.outobj);
+ if (buf.outbuf == NULL)
+ goto errorexit;
buf.outbuf_end = buf.outbuf + PyUnicode_GET_SIZE(buf.outobj);
if (self->codec->decinit != NULL &&
@@ -742,6 +750,7 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
PyObject *ucvt, *r = NULL;
Py_UNICODE *inbuf, *inbuf_end, *inbuf_tmp = NULL;
Py_ssize_t datalen, origpending;
+ wchar_t *data;
if (PyUnicode_Check(unistr))
ucvt = NULL;
@@ -757,7 +766,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
}
}
- datalen = PyUnicode_GET_SIZE(unistr);
+ data = PyUnicode_AsUnicodeAndSize(unistr, &datalen);
+ if (data == NULL)
+ goto errorexit;
origpending = ctx->pendingsize;
if (origpending > 0) {
@@ -848,7 +859,9 @@ decoder_prepare_buffer(MultibyteDecodeBuffer *buf, const char *data,
buf->outobj = PyUnicode_FromUnicode(NULL, size);
if (buf->outobj == NULL)
return -1;
- buf->outbuf = PyUnicode_AS_UNICODE(buf->outobj);
+ buf->outbuf = PyUnicode_AsUnicode(buf->outobj);
+ if (buf->outbuf == NULL)
+ return -1;
buf->outbuf_end = buf->outbuf +
PyUnicode_GET_SIZE(buf->outobj);
}
@@ -900,11 +913,17 @@ mbiencoder_encode(MultibyteIncrementalEncoderObject *self,
static PyObject *
mbiencoder_reset(MultibyteIncrementalEncoderObject *self)
{
- if (self->codec->decreset != NULL &&
- self->codec->decreset(&self->state, self->codec->config) != 0)
- return NULL;
+ /* Longest output: 4 bytes (b'\x0F\x1F(B') with ISO 2022 */
+ unsigned char buffer[4], *outbuf;
+ Py_ssize_t r;
+ if (self->codec->encreset != NULL) {
+ outbuf = buffer;
+ r = self->codec->encreset(&self->state, self->codec->config,
+ &outbuf, sizeof(buffer));
+ if (r != 0)
+ return NULL;
+ }
self->pendingsize = 0;
-
Py_RETURN_NONE;
}
@@ -1246,7 +1265,7 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self,
Py_ssize_t rsize, finalsize = 0;
if (sizehint == 0)
- return PyUnicode_FromUnicode(NULL, 0);
+ return PyUnicode_New(0, 0);
buf.outobj = buf.excobj = NULL;
cres = NULL;
@@ -1572,12 +1591,13 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
PyObject *unistr)
{
PyObject *str, *wr;
+ _Py_IDENTIFIER(write);
str = encoder_encode_stateful(STATEFUL_ECTX(self), unistr, 0);
if (str == NULL)
return -1;
- wr = PyObject_CallMethod(self->stream, "write", "O", str);
+ wr = _PyObject_CallMethodId(self->stream, &PyId_write, "O", str);
Py_DECREF(str);
if (wr == NULL)
return -1;
@@ -1643,7 +1663,9 @@ mbstreamwriter_reset(MultibyteStreamWriterObject *self)
assert(PyBytes_Check(pwrt));
if (PyBytes_Size(pwrt) > 0) {
PyObject *wr;
- wr = PyObject_CallMethod(self->stream, "write", "O", pwrt);
+ _Py_IDENTIFIER(write);
+
+ wr = _PyObject_CallMethodId(self->stream, &PyId_write, "O", pwrt);
if (wr == NULL) {
Py_DECREF(pwrt);
return NULL;
diff --git a/Modules/config.c.in b/Modules/config.c.in
index 34d44d5..7a24e2d 100644
--- a/Modules/config.c.in
+++ b/Modules/config.c.in
@@ -39,13 +39,12 @@ struct _inittab _PyImport_Inittab[] = {
{"marshal", PyMarshal_Init},
/* This lives in import.c */
- {"imp", PyInit_imp},
+ {"_imp", PyInit_imp},
/* This lives in Python/Python-ast.c */
{"_ast", PyInit__ast},
/* These entries are here for sys.builtin_module_names */
- {"__main__", NULL},
{"builtins", NULL},
{"sys", NULL},
diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c
index 86720af..06ed53a 100644
--- a/Modules/errnomodule.c
+++ b/Modules/errnomodule.c
@@ -7,6 +7,33 @@
#ifdef MS_WINDOWS
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
+/* The following constants were added to errno.h in VS2010 but have
+ preferred WSA equivalents. */
+#undef EADDRINUSE
+#undef EADDRNOTAVAIL
+#undef EAFNOSUPPORT
+#undef EALREADY
+#undef ECONNABORTED
+#undef ECONNREFUSED
+#undef ECONNRESET
+#undef EDESTADDRREQ
+#undef EHOSTUNREACH
+#undef EINPROGRESS
+#undef EISCONN
+#undef ELOOP
+#undef EMSGSIZE
+#undef ENETDOWN
+#undef ENETRESET
+#undef ENETUNREACH
+#undef ENOBUFS
+#undef ENOPROTOOPT
+#undef ENOTCONN
+#undef ENOTSOCK
+#undef EOPNOTSUPP
+#undef EPROTONOSUPPORT
+#undef EPROTOTYPE
+#undef ETIMEDOUT
+#undef EWOULDBLOCK
#endif
/*
@@ -84,6 +111,8 @@ PyInit_errno(void)
* The names and comments are borrowed from linux/include/errno.h,
* which should be pretty all-inclusive. However, the Solaris specific
* names and comments are borrowed from sys/errno.h in Solaris.
+ * MacOSX specific names and comments are borrowed from sys/errno.h in
+ * MacOSX.
*/
#ifdef ENODEV
@@ -848,6 +877,59 @@ PyInit_errno(void)
inscode(d, ds, de, "ENOTACTIVE", ENOTACTIVE, "Facility is not active");
#endif
+ /* MacOSX specific errnos */
+#ifdef EAUTH
+ inscode(d, ds, de, "EAUTH", EAUTH, "Authentication error");
+#endif
+#ifdef EBADARCH
+ inscode(d, ds, de, "EBADARCH", EBADARCH, "Bad CPU type in executable");
+#endif
+#ifdef EBADEXEC
+ inscode(d, ds, de, "EBADEXEC", EBADEXEC, "Bad executable (or shared library)");
+#endif
+#ifdef EBADMACHO
+ inscode(d, ds, de, "EBADMACHO", EBADMACHO, "Malformed Mach-o file");
+#endif
+#ifdef EBADRPC
+ inscode(d, ds, de, "EBADRPC", EBADRPC, "RPC struct is bad");
+#endif
+#ifdef EDEVERR
+ inscode(d, ds, de, "EDEVERR", EDEVERR, "Device error");
+#endif
+#ifdef EFTYPE
+ inscode(d, ds, de, "EFTYPE", EFTYPE, "Inappropriate file type or format");
+#endif
+#ifdef ENEEDAUTH
+ inscode(d, ds, de, "ENEEDAUTH", ENEEDAUTH, "Need authenticator");
+#endif
+#ifdef ENOATTR
+ inscode(d, ds, de, "ENOATTR", ENOATTR, "Attribute not found");
+#endif
+#ifdef ENOPOLICY
+ inscode(d, ds, de, "ENOPOLICY", ENOPOLICY, "Policy not found");
+#endif
+#ifdef EPROCLIM
+ inscode(d, ds, de, "EPROCLIM", EPROCLIM, "Too many processes");
+#endif
+#ifdef EPROCUNAVAIL
+ inscode(d, ds, de, "EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program");
+#endif
+#ifdef EPROGMISMATCH
+ inscode(d, ds, de, "EPROGMISMATCH", EPROGMISMATCH, "Program version wrong");
+#endif
+#ifdef EPROGUNAVAIL
+ inscode(d, ds, de, "EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail");
+#endif
+#ifdef EPWROFF
+ inscode(d, ds, de, "EPWROFF", EPWROFF, "Device power is off");
+#endif
+#ifdef ERPCMISMATCH
+ inscode(d, ds, de, "ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong");
+#endif
+#ifdef ESHLIBVERS
+ inscode(d, ds, de, "ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch");
+#endif
+
Py_DECREF(de);
return m;
}
diff --git a/Modules/expat/COPYING b/Modules/expat/COPYING
index fc97b02..dcb4506 100644
--- a/Modules/expat/COPYING
+++ b/Modules/expat/COPYING
@@ -1,5 +1,6 @@
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/Modules/expat/amigaconfig.h b/Modules/expat/amigaconfig.h
index 6781a71..86c6115 100644
--- a/Modules/expat/amigaconfig.h
+++ b/Modules/expat/amigaconfig.h
@@ -10,66 +10,12 @@
/* Define to 1 if you have the <check.h> header file. */
#undef HAVE_CHECK_H
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the `getpagesize' function. */
-#undef HAVE_GETPAGESIZE
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
/* Define to 1 if you have the `memmove' function. */
#define HAVE_MEMMOVE 1
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have a working `mmap' system call. */
-#undef HAVE_MMAP
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "expat"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "expat 1.95.8"
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.95.8"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
/* whether byteorder is bigendian */
#define WORDS_BIGENDIAN
@@ -83,14 +29,4 @@
/* Define to make XML Namespaces functionality available. */
#define XML_NS
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `long' if <sys/types.h> does not define. */
-#undef off_t
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-#undef size_t
-
-
#endif /* AMIGACONFIG_H */
diff --git a/Modules/expat/ascii.h b/Modules/expat/ascii.h
index 337e5bb..d10530b 100644
--- a/Modules/expat/ascii.h
+++ b/Modules/expat/ascii.h
@@ -83,3 +83,10 @@
#define ASCII_LSQB 0x5B
#define ASCII_RSQB 0x5D
#define ASCII_UNDERSCORE 0x5F
+#define ASCII_LPAREN 0x28
+#define ASCII_RPAREN 0x29
+#define ASCII_FF 0x0C
+#define ASCII_SLASH 0x2F
+#define ASCII_HASH 0x23
+#define ASCII_PIPE 0x7C
+#define ASCII_COMMA 0x2C
diff --git a/Modules/expat/expat.h b/Modules/expat/expat.h
index 89646d2..06b5de0 100644
--- a/Modules/expat/expat.h
+++ b/Modules/expat/expat.h
@@ -742,6 +742,29 @@ XML_GetSpecifiedAttributeCount(XML_Parser parser);
XMLPARSEAPI(int)
XML_GetIdAttributeIndex(XML_Parser parser);
+#ifdef XML_ATTR_INFO
+/* Source file byte offsets for the start and end of attribute names and values.
+ The value indices are exclusive of surrounding quotes; thus in a UTF-8 source
+ file an attribute value of "blah" will yield:
+ info->valueEnd - info->valueStart = 4 bytes.
+*/
+typedef struct {
+ XML_Index nameStart; /* Offset to beginning of the attribute name. */
+ XML_Index nameEnd; /* Offset after the attribute name's last byte. */
+ XML_Index valueStart; /* Offset to beginning of the attribute value. */
+ XML_Index valueEnd; /* Offset after the attribute value's last byte. */
+} XML_AttrInfo;
+
+/* Returns an array of XML_AttrInfo structures for the attribute/value pairs
+ passed in last call to the XML_StartElementHandler that were specified
+ in the start-tag rather than defaulted. Each attribute/value pair counts
+ as 1; thus the number of entries in the array is
+ XML_GetSpecifiedAttributeCount(parser) / 2.
+*/
+XMLPARSEAPI(const XML_AttrInfo *)
+XML_GetAttributeInfo(XML_Parser parser);
+#endif
+
/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is
detected. The last call to XML_Parse must have isFinal true; len
may be zero for this call (or any other).
@@ -994,7 +1017,9 @@ enum XML_FeatureEnum {
XML_FEATURE_MIN_SIZE,
XML_FEATURE_SIZEOF_XML_CHAR,
XML_FEATURE_SIZEOF_XML_LCHAR,
- XML_FEATURE_NS
+ XML_FEATURE_NS,
+ XML_FEATURE_LARGE_SIZE,
+ XML_FEATURE_ATTR_INFO
/* Additional features must be added to the end of this enum. */
};
@@ -1014,7 +1039,7 @@ XML_GetFeatureList(void);
change to major or minor version.
*/
#define XML_MAJOR_VERSION 2
-#define XML_MINOR_VERSION 0
+#define XML_MINOR_VERSION 1
#define XML_MICRO_VERSION 0
#ifdef __cplusplus
diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h
index 3f1c363..2c03284 100644
--- a/Modules/expat/expat_external.h
+++ b/Modules/expat/expat_external.h
@@ -7,11 +7,7 @@
/* External API definitions */
-/* Namespace external symbols to allow multiple libexpat version to
- co-exist. */
-#include "pyexpatns.h"
-
-#if defined(_MSC_EXTENSIONS) && !defined(__CYGWIN__)
+#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
#define XML_USE_MSC_EXTENSIONS 1
#endif
@@ -38,9 +34,9 @@
system headers may assume the cdecl convention.
*/
#ifndef XMLCALL
-#if defined(XML_USE_MSC_EXTENSIONS)
+#if defined(_MSC_VER)
#define XMLCALL __cdecl
-#elif defined(__GNUC__) && defined(__i386)
+#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)
#define XMLCALL __attribute__((cdecl))
#else
/* For any platform which uses this definition and supports more than
diff --git a/Modules/expat/internal.h b/Modules/expat/internal.h
index ff056c6..dd54548 100644
--- a/Modules/expat/internal.h
+++ b/Modules/expat/internal.h
@@ -20,7 +20,7 @@
and therefore subject to change.
*/
-#if defined(__GNUC__) && defined(__i386__)
+#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__)
/* We'll use this version by default only where we know it helps.
regparm() generates warnings on Solaris boxes. See SF bug #692878.
diff --git a/Modules/expat/watcomconfig.h b/Modules/expat/watcomconfig.h
new file mode 100644
index 0000000..2f05e3f
--- /dev/null
+++ b/Modules/expat/watcomconfig.h
@@ -0,0 +1,47 @@
+/* expat_config.h for use with Open Watcom 1.5 and above. */
+
+#ifndef WATCOMCONFIG_H
+#define WATCOMCONFIG_H
+
+#ifdef __NT__
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#endif
+
+/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */
+#define BYTEORDER 1234
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "expat"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "expat 2.0.0"
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.0.0"
+
+/* Define to specify how much context to retain around the current parse
+ point. */
+#define XML_CONTEXT_BYTES 1024
+
+/* Define to make parameter entity parsing functionality available. */
+#define XML_DTD 1
+
+/* Define to make XML Namespaces functionality available. */
+#define XML_NS 1
+
+#endif
+
diff --git a/Modules/expat/xmlparse.c b/Modules/expat/xmlparse.c
index 46f6507..f35aa36 100644
--- a/Modules/expat/xmlparse.c
+++ b/Modules/expat/xmlparse.c
@@ -2,24 +2,27 @@
See the file COPYING for copying permission.
*/
+#include <stddef.h>
+#include <string.h> /* memset(), memcpy() */
+#include <assert.h>
+#include <limits.h> /* UINT_MAX */
+#include <time.h> /* time() */
+
#define XML_BUILDING_EXPAT 1
#ifdef COMPILED_FROM_DSP
#include "winconfig.h"
#elif defined(MACOS_CLASSIC)
#include "macconfig.h"
-#elif defined(__amigaos4__)
+#elif defined(__amigaos__)
#include "amigaconfig.h"
+#elif defined(__WATCOMC__)
+#include "watcomconfig.h"
#elif defined(HAVE_EXPAT_CONFIG_H)
#include <expat_config.h>
#endif /* ndef COMPILED_FROM_DSP */
-#include <stddef.h>
-#include <string.h> /* memset(), memcpy() */
-#include <assert.h>
-#include <limits.h> /* UINT_MAX */
-#include <time.h> /* time() */
-
+#include "ascii.h"
#include "expat.h"
#ifdef XML_UNICODE
@@ -28,7 +31,8 @@
#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
#define XmlEncode XmlUtf16Encode
-#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
+/* Using pointer subtraction to convert to integer type. */
+#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))
typedef unsigned short ICHAR;
#else
#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
@@ -325,15 +329,15 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
static enum XML_Error
initializeEncoding(XML_Parser parser);
static enum XML_Error
-doProlog(XML_Parser parser, const ENCODING *enc, const char *s,
- const char *end, int tok, const char *next, const char **nextPtr,
+doProlog(XML_Parser parser, const ENCODING *enc, const char *s,
+ const char *end, int tok, const char *next, const char **nextPtr,
XML_Bool haveMore);
static enum XML_Error
-processInternalEntity(XML_Parser parser, ENTITY *entity,
+processInternalEntity(XML_Parser parser, ENTITY *entity,
XML_Bool betweenDecl);
static enum XML_Error
doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
- const char *start, const char *end, const char **endPtr,
+ const char *start, const char *end, const char **endPtr,
XML_Bool haveMore);
static enum XML_Error
doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
@@ -351,7 +355,7 @@ static enum XML_Error
addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
const XML_Char *uri, BINDING **bindingsPtr);
static int
-defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
static enum XML_Error
storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
@@ -436,6 +440,7 @@ parserCreate(const XML_Char *encodingName,
const XML_Memory_Handling_Suite *memsuite,
const XML_Char *nameSep,
DTD *dtd);
+
static void
parserInit(XML_Parser parser, const XML_Char *encodingName);
@@ -535,6 +540,9 @@ struct XML_ParserStruct {
NS_ATT *m_nsAtts;
unsigned long m_nsAttsVersion;
unsigned char m_nsAttsPower;
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *m_attInfo;
+#endif
POSITION m_position;
STRING_POOL m_tempPool;
STRING_POOL m_temp2Pool;
@@ -643,6 +651,7 @@ struct XML_ParserStruct {
#define nsAtts (parser->m_nsAtts)
#define nsAttsVersion (parser->m_nsAttsVersion)
#define nsAttsPower (parser->m_nsAttsPower)
+#define attInfo (parser->m_attInfo)
#define tempPool (parser->m_tempPool)
#define temp2Pool (parser->m_temp2Pool)
#define groupConnector (parser->m_groupConnector)
@@ -673,10 +682,12 @@ XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
}
static const XML_Char implicitContext[] = {
- 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/',
- 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
- 'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
- 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
+ ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,
+ ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
+ ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,
+ ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,
+ ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
+ ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
};
static unsigned long
@@ -690,23 +701,22 @@ generate_hash_secret_salt(void)
static XML_Bool /* only valid for root parser */
startParsing(XML_Parser parser)
{
- /* hash functions must be initialized before setContext() is called */
-
- if (hash_secret_salt == 0)
- hash_secret_salt = generate_hash_secret_salt();
- if (ns) {
- /* implicit context only set for root parser, since child
- parsers (i.e. external entity parsers) will inherit it
- */
- return setContext(parser, implicitContext);
- }
- return XML_TRUE;
+ /* hash functions must be initialized before setContext() is called */
+ if (hash_secret_salt == 0)
+ hash_secret_salt = generate_hash_secret_salt();
+ if (ns) {
+ /* implicit context only set for root parser, since child
+ parsers (i.e. external entity parsers) will inherit it
+ */
+ return setContext(parser, implicitContext);
+ }
+ return XML_TRUE;
}
XML_Parser XMLCALL
XML_ParserCreate_MM(const XML_Char *encodingName,
- const XML_Memory_Handling_Suite *memsuite,
- const XML_Char *nameSep)
+ const XML_Memory_Handling_Suite *memsuite,
+ const XML_Char *nameSep)
{
return parserCreate(encodingName, memsuite, nameSep, NULL);
}
@@ -753,9 +763,20 @@ parserCreate(const XML_Char *encodingName,
FREE(parser);
return NULL;
}
+#ifdef XML_ATTR_INFO
+ attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
+ if (attInfo == NULL) {
+ FREE(atts);
+ FREE(parser);
+ return NULL;
+ }
+#endif
dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
if (dataBuf == NULL) {
FREE(atts);
+#ifdef XML_ATTR_INFO
+ FREE(attInfo);
+#endif
FREE(parser);
return NULL;
}
@@ -768,6 +789,9 @@ parserCreate(const XML_Char *encodingName,
if (_dtd == NULL) {
FREE(dataBuf);
FREE(atts);
+#ifdef XML_ATTR_INFO
+ FREE(attInfo);
+#endif
FREE(parser);
return NULL;
}
@@ -783,7 +807,7 @@ parserCreate(const XML_Char *encodingName,
unknownEncodingHandler = NULL;
unknownEncodingHandlerData = NULL;
- namespaceSeparator = '!';
+ namespaceSeparator = ASCII_EXCL;
ns = XML_FALSE;
ns_triplets = XML_FALSE;
@@ -1154,6 +1178,9 @@ XML_ParserFree(XML_Parser parser)
#endif /* XML_DTD */
dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
FREE((void *)atts);
+#ifdef XML_ATTR_INFO
+ FREE((void *)attInfo);
+#endif
FREE(groupConnector);
FREE(buffer);
FREE(dataBuf);
@@ -1234,6 +1261,14 @@ XML_GetIdAttributeIndex(XML_Parser parser)
return idAttIndex;
}
+#ifdef XML_ATTR_INFO
+const XML_AttrInfo * XMLCALL
+XML_GetAttributeInfo(XML_Parser parser)
+{
+ return attInfo;
+}
+#endif
+
void XMLCALL
XML_SetElementHandler(XML_Parser parser,
XML_StartElementHandler start,
@@ -1499,7 +1534,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
positionPtr = bufferPtr;
return XML_STATUS_SUSPENDED;
- case XML_INITIALIZED:
+ case XML_INITIALIZED:
case XML_PARSING:
ps_parsing = XML_FINISHED;
/* fall through */
@@ -1555,15 +1590,11 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
: (char *)REALLOC(buffer, len * 2));
if (temp == NULL) {
errorCode = XML_ERROR_NO_MEMORY;
- return XML_STATUS_ERROR;
- }
- buffer = temp;
- if (!buffer) {
- errorCode = XML_ERROR_NO_MEMORY;
eventPtr = eventEndPtr = NULL;
processor = errorProcessor;
return XML_STATUS_ERROR;
}
+ buffer = temp;
bufferLim = buffer + len * 2;
}
memcpy(buffer, end, nLeftOver);
@@ -1629,7 +1660,7 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
case XML_SUSPENDED:
result = XML_STATUS_SUSPENDED;
break;
- case XML_INITIALIZED:
+ case XML_INITIALIZED:
case XML_PARSING:
if (isFinal) {
ps_parsing = XML_FINISHED;
@@ -1719,6 +1750,8 @@ XML_GetBuffer(XML_Parser parser, int len)
bufferPtr = buffer = newBuf;
#endif /* not defined XML_CONTEXT_BYTES */
}
+ eventPtr = eventEndPtr = NULL;
+ positionPtr = NULL;
}
return bufferEnd;
}
@@ -1776,7 +1809,7 @@ XML_ResumeParser(XML_Parser parser)
case XML_SUSPENDED:
result = XML_STATUS_SUSPENDED;
break;
- case XML_INITIALIZED:
+ case XML_INITIALIZED:
case XML_PARSING:
if (ps_finalBuffer) {
ps_parsing = XML_FINISHED;
@@ -2001,6 +2034,12 @@ XML_GetFeatureList(void)
#ifdef XML_NS
{XML_FEATURE_NS, XML_L("XML_NS"), 0},
#endif
+#ifdef XML_LARGE_SIZE
+ {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
+#endif
+#ifdef XML_ATTR_INFO
+ {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0},
+#endif
{XML_FEATURE_END, NULL, 0}
};
@@ -2063,7 +2102,7 @@ contentProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doContent(parser, 0, encoding, start, end,
+ enum XML_Error result = doContent(parser, 0, encoding, start, end,
endPtr, (XML_Bool)!ps_finalBuffer);
if (result == XML_ERROR_NONE) {
if (!storeRawNames(parser))
@@ -2145,7 +2184,7 @@ externalEntityInitProcessor3(XML_Parser parser,
if (result != XML_ERROR_NONE)
return result;
switch (ps_parsing) {
- case XML_SUSPENDED:
+ case XML_SUSPENDED:
*endPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
@@ -2179,7 +2218,7 @@ externalEntityContentProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doContent(parser, 1, encoding, start, end,
+ enum XML_Error result = doContent(parser, 1, encoding, start, end,
endPtr, (XML_Bool)!ps_finalBuffer);
if (result == XML_ERROR_NONE) {
if (!storeRawNames(parser))
@@ -2198,7 +2237,7 @@ doContent(XML_Parser parser,
XML_Bool haveMore)
{
/* save one level of indirection */
- DTD * const dtd = _dtd;
+ DTD * const dtd = _dtd;
const char **eventPP;
const char **eventEndPP;
@@ -2229,8 +2268,8 @@ doContent(XML_Parser parser,
}
else if (defaultHandler)
reportDefault(parser, enc, s, end);
- /* We are at the end of the final buffer, should we check for
- XML_SUSPENDED, XML_FINISHED?
+ /* We are at the end of the final buffer, should we check for
+ XML_SUSPENDED, XML_FINISHED?
*/
if (startTagLevel == 0)
return XML_ERROR_NO_ELEMENTS;
@@ -2581,8 +2620,8 @@ doContent(XML_Parser parser,
}
else if (defaultHandler)
reportDefault(parser, enc, s, end);
- /* We are at the end of the final buffer, should we check for
- XML_SUSPENDED, XML_FINISHED?
+ /* We are at the end of the final buffer, should we check for
+ XML_SUSPENDED, XML_FINISHED?
*/
if (startTagLevel == 0) {
*eventPP = end;
@@ -2595,26 +2634,29 @@ doContent(XML_Parser parser,
*nextPtr = end;
return XML_ERROR_NONE;
case XML_TOK_DATA_CHARS:
- if (characterDataHandler) {
- if (MUST_CONVERT(enc, s)) {
- for (;;) {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
- *eventEndPP = s;
- characterDataHandler(handlerArg, dataBuf,
- (int)(dataPtr - (ICHAR *)dataBuf));
- if (s == next)
- break;
- *eventPP = s;
+ {
+ XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ if (charDataHandler) {
+ if (MUST_CONVERT(enc, s)) {
+ for (;;) {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ *eventEndPP = s;
+ charDataHandler(handlerArg, dataBuf,
+ (int)(dataPtr - (ICHAR *)dataBuf));
+ if (s == next)
+ break;
+ *eventPP = s;
+ }
}
+ else
+ charDataHandler(handlerArg,
+ (XML_Char *)s,
+ (int)((XML_Char *)next - (XML_Char *)s));
}
- else
- characterDataHandler(handlerArg,
- (XML_Char *)s,
- (int)((XML_Char *)next - (XML_Char *)s));
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
}
- else if (defaultHandler)
- reportDefault(parser, enc, s, next);
break;
case XML_TOK_PI:
if (!reportProcessingInstruction(parser, enc, s, next))
@@ -2631,7 +2673,7 @@ doContent(XML_Parser parser,
}
*eventPP = s = next;
switch (ps_parsing) {
- case XML_SUSPENDED:
+ case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
@@ -2690,23 +2732,44 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
if (n + nDefaultAtts > attsSize) {
int oldAttsSize = attsSize;
ATTRIBUTE *temp;
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *temp2;
+#endif
attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
if (temp == NULL)
return XML_ERROR_NO_MEMORY;
atts = temp;
+#ifdef XML_ATTR_INFO
+ temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
+ if (temp2 == NULL)
+ return XML_ERROR_NO_MEMORY;
+ attInfo = temp2;
+#endif
if (n > oldAttsSize)
XmlGetAttributes(enc, attStr, n, atts);
}
appAtts = (const XML_Char **)atts;
for (i = 0; i < n; i++) {
+ ATTRIBUTE *currAtt = &atts[i];
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *currAttInfo = &attInfo[i];
+#endif
/* add the name and value to the attribute list */
- ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name,
- atts[i].name
- + XmlNameLength(enc, atts[i].name));
+ ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
+ currAtt->name
+ + XmlNameLength(enc, currAtt->name));
if (!attId)
return XML_ERROR_NO_MEMORY;
+#ifdef XML_ATTR_INFO
+ currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
+ currAttInfo->nameEnd = currAttInfo->nameStart +
+ XmlNameLength(enc, currAtt->name);
+ currAttInfo->valueStart = parseEndByteIndex -
+ (parseEndPtr - currAtt->valuePtr);
+ currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
+#endif
/* Detect duplicate attributes by their QNames. This does not work when
namespace processing is turned on and different prefixes for the same
namespace are used. For this case we have a check further down.
@@ -2848,8 +2911,6 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
unsigned long uriHash = hash_secret_salt;
((XML_Char *)s)[-1] = 0; /* clear flag */
id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
- if (!id)
- return XML_ERROR_NO_MEMORY;
b = id->prefix->binding;
if (!b)
return XML_ERROR_UNBOUND_PREFIX;
@@ -2861,7 +2922,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
return XML_ERROR_NO_MEMORY;
uriHash = CHAR_HASH(uriHash, c);
}
- while (*s++ != XML_T(':'))
+ while (*s++ != XML_T(ASCII_COLON))
;
do { /* copies null terminator */
const XML_Char c = *s;
@@ -2935,7 +2996,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
if (!binding)
return XML_ERROR_UNBOUND_PREFIX;
localPart = tagNamePtr->str;
- while (*localPart++ != XML_T(':'))
+ while (*localPart++ != XML_T(ASCII_COLON))
;
}
else if (dtd->defaultPrefix.binding) {
@@ -2990,25 +3051,29 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
const XML_Char *uri, BINDING **bindingsPtr)
{
static const XML_Char xmlNamespace[] = {
- 'h', 't', 't', 'p', ':', '/', '/',
- 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
- 'X', 'M', 'L', '/', '1', '9', '9', '8', '/',
- 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0'
+ ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
+ ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,
+ ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,
+ ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
+ ASCII_e, '\0'
};
- static const int xmlLen =
+ static const int xmlLen =
(int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;
static const XML_Char xmlnsNamespace[] = {
- 'h', 't', 't', 'p', ':', '/', '/',
- 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/',
- '2', '0', '0', '0', '/', 'x', 'm', 'l', 'n', 's', '/', '\0'
+ ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
+ ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,
+ ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,
+ ASCII_SLASH, '\0'
};
- static const int xmlnsLen =
+ static const int xmlnsLen =
(int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;
XML_Bool mustBeXML = XML_FALSE;
XML_Bool isXML = XML_TRUE;
XML_Bool isXMLNS = XML_TRUE;
-
+
BINDING *b;
int len;
@@ -3017,13 +3082,13 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
return XML_ERROR_UNDECLARING_PREFIX;
if (prefix->name
- && prefix->name[0] == XML_T('x')
- && prefix->name[1] == XML_T('m')
- && prefix->name[2] == XML_T('l')) {
+ && prefix->name[0] == XML_T(ASCII_x)
+ && prefix->name[1] == XML_T(ASCII_m)
+ && prefix->name[2] == XML_T(ASCII_l)) {
/* Not allowed to bind xmlns */
- if (prefix->name[3] == XML_T('n')
- && prefix->name[4] == XML_T('s')
+ if (prefix->name[3] == XML_T(ASCII_n)
+ && prefix->name[4] == XML_T(ASCII_s)
&& prefix->name[5] == XML_T('\0'))
return XML_ERROR_RESERVED_PREFIX_XMLNS;
@@ -3035,7 +3100,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))
isXML = XML_FALSE;
- if (!mustBeXML && isXMLNS
+ if (!mustBeXML && isXMLNS
&& (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
isXMLNS = XML_FALSE;
}
@@ -3177,26 +3242,29 @@ doCdataSection(XML_Parser parser,
reportDefault(parser, enc, s, next);
break;
case XML_TOK_DATA_CHARS:
- if (characterDataHandler) {
- if (MUST_CONVERT(enc, s)) {
- for (;;) {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
- *eventEndPP = next;
- characterDataHandler(handlerArg, dataBuf,
- (int)(dataPtr - (ICHAR *)dataBuf));
- if (s == next)
- break;
- *eventPP = s;
+ {
+ XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ if (charDataHandler) {
+ if (MUST_CONVERT(enc, s)) {
+ for (;;) {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ *eventEndPP = next;
+ charDataHandler(handlerArg, dataBuf,
+ (int)(dataPtr - (ICHAR *)dataBuf));
+ if (s == next)
+ break;
+ *eventPP = s;
+ }
}
+ else
+ charDataHandler(handlerArg,
+ (XML_Char *)s,
+ (int)((XML_Char *)next - (XML_Char *)s));
}
- else
- characterDataHandler(handlerArg,
- (XML_Char *)s,
- (int)((XML_Char *)next - (XML_Char *)s));
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
}
- else if (defaultHandler)
- reportDefault(parser, enc, s, next);
break;
case XML_TOK_INVALID:
*eventPP = next;
@@ -3243,7 +3311,7 @@ ignoreSectionProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
+ enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
endPtr, (XML_Bool)!ps_finalBuffer);
if (result != XML_ERROR_NONE)
return result;
@@ -3525,7 +3593,7 @@ entityValueInitProcessor(XML_Parser parser,
const char *next = start;
eventPtr = start;
- for (;;) {
+ for (;;) {
tok = XmlPrologTok(encoding, start, end, &next);
eventEndPtr = next;
if (tok <= 0) {
@@ -3553,7 +3621,7 @@ entityValueInitProcessor(XML_Parser parser,
if (result != XML_ERROR_NONE)
return result;
switch (ps_parsing) {
- case XML_SUSPENDED:
+ case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
@@ -3618,7 +3686,7 @@ externalParEntProcessor(XML_Parser parser,
}
processor = prologProcessor;
- return doProlog(parser, encoding, s, end, tok, next,
+ return doProlog(parser, encoding, s, end, tok, next,
nextPtr, (XML_Bool)!ps_finalBuffer);
}
@@ -3668,7 +3736,7 @@ prologProcessor(XML_Parser parser,
{
const char *next = s;
int tok = XmlPrologTok(encoding, s, end, &next);
- return doProlog(parser, encoding, s, end, tok, next,
+ return doProlog(parser, encoding, s, end, tok, next,
nextPtr, (XML_Bool)!ps_finalBuffer);
}
@@ -3683,26 +3751,30 @@ doProlog(XML_Parser parser,
XML_Bool haveMore)
{
#ifdef XML_DTD
- static const XML_Char externalSubsetName[] = { '#' , '\0' };
+ static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
#endif /* XML_DTD */
- static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' };
- static const XML_Char atypeID[] = { 'I', 'D', '\0' };
- static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' };
- static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' };
- static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' };
- static const XML_Char atypeENTITIES[] =
- { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' };
+ static const XML_Char atypeCDATA[] =
+ { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
+ static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };
+ static const XML_Char atypeIDREF[] =
+ { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
+ static const XML_Char atypeIDREFS[] =
+ { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
+ static const XML_Char atypeENTITY[] =
+ { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
+ static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,
+ ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };
static const XML_Char atypeNMTOKEN[] = {
- 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' };
- static const XML_Char atypeNMTOKENS[] = {
- 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' };
- static const XML_Char notationPrefix[] = {
- 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' };
- static const XML_Char enumValueSep[] = { '|', '\0' };
- static const XML_Char enumValueStart[] = { '(', '\0' };
+ ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
+ static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,
+ ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };
+ static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,
+ ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };
+ static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };
+ static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
/* save one level of indirection */
- DTD * const dtd = _dtd;
+ DTD * const dtd = _dtd;
const char **eventPP;
const char **eventEndPP;
@@ -3818,15 +3890,17 @@ doProlog(XML_Parser parser,
#endif /* XML_DTD */
dtd->hasParamEntityRefs = XML_TRUE;
if (startDoctypeDeclHandler) {
+ XML_Char *pubId;
if (!XmlIsPublicId(enc, s, next, eventPP))
return XML_ERROR_PUBLICID;
- doctypePubid = poolStoreString(&tempPool, enc,
- s + enc->minBytesPerChar,
- next - enc->minBytesPerChar);
- if (!doctypePubid)
+ pubId = poolStoreString(&tempPool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!pubId)
return XML_ERROR_NO_MEMORY;
- normalizePublicId((XML_Char *)doctypePubid);
+ normalizePublicId(pubId);
poolFinish(&tempPool);
+ doctypePubid = pubId;
handleDefault = XML_FALSE;
goto alreadyChecked;
}
@@ -3881,8 +3955,8 @@ doProlog(XML_Parser parser,
entity->publicId))
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
if (dtd->paramEntityRead) {
- if (!dtd->standalone &&
- notStandaloneHandler &&
+ if (!dtd->standalone &&
+ notStandaloneHandler &&
!notStandaloneHandler(handlerArg))
return XML_ERROR_NOT_STANDALONE;
}
@@ -4010,11 +4084,11 @@ doProlog(XML_Parser parser,
0, parser))
return XML_ERROR_NO_MEMORY;
if (attlistDeclHandler && declAttributeType) {
- if (*declAttributeType == XML_T('(')
- || (*declAttributeType == XML_T('N')
- && declAttributeType[1] == XML_T('O'))) {
+ if (*declAttributeType == XML_T(ASCII_LPAREN)
+ || (*declAttributeType == XML_T(ASCII_N)
+ && declAttributeType[1] == XML_T(ASCII_O))) {
/* Enumerated or Notation type */
- if (!poolAppendChar(&tempPool, XML_T(')'))
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
|| !poolAppendChar(&tempPool, XML_T('\0')))
return XML_ERROR_NO_MEMORY;
declAttributeType = tempPool.start;
@@ -4047,11 +4121,11 @@ doProlog(XML_Parser parser,
declAttributeIsCdata, XML_FALSE, attVal, parser))
return XML_ERROR_NO_MEMORY;
if (attlistDeclHandler && declAttributeType) {
- if (*declAttributeType == XML_T('(')
- || (*declAttributeType == XML_T('N')
- && declAttributeType[1] == XML_T('O'))) {
+ if (*declAttributeType == XML_T(ASCII_LPAREN)
+ || (*declAttributeType == XML_T(ASCII_N)
+ && declAttributeType[1] == XML_T(ASCII_O))) {
/* Enumerated or Notation type */
- if (!poolAppendChar(&tempPool, XML_T(')'))
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
|| !poolAppendChar(&tempPool, XML_T('\0')))
return XML_ERROR_NO_MEMORY;
declAttributeType = tempPool.start;
@@ -4321,7 +4395,7 @@ doProlog(XML_Parser parser,
switch (tok) {
case XML_TOK_PARAM_ENTITY_REF:
/* PE references in internal subset are
- not allowed within declarations. */
+ not allowed within declarations. */
return XML_ERROR_PARAM_ENTITY_REF;
case XML_TOK_XML_DECL:
return XML_ERROR_MISPLACED_XML_PI;
@@ -4379,14 +4453,14 @@ doProlog(XML_Parser parser,
}
break;
case XML_ROLE_GROUP_SEQUENCE:
- if (groupConnector[prologState.level] == '|')
+ if (groupConnector[prologState.level] == ASCII_PIPE)
return XML_ERROR_SYNTAX;
- groupConnector[prologState.level] = ',';
+ groupConnector[prologState.level] = ASCII_COMMA;
if (dtd->in_eldecl && elementDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_GROUP_CHOICE:
- if (groupConnector[prologState.level] == ',')
+ if (groupConnector[prologState.level] == ASCII_COMMA)
return XML_ERROR_SYNTAX;
if (dtd->in_eldecl
&& !groupConnector[prologState.level]
@@ -4398,7 +4472,7 @@ doProlog(XML_Parser parser,
if (elementDeclHandler)
handleDefault = XML_FALSE;
}
- groupConnector[prologState.level] = '|';
+ groupConnector[prologState.level] = ASCII_PIPE;
break;
case XML_ROLE_PARAM_ENTITY_REF:
#ifdef XML_DTD
@@ -4442,7 +4516,7 @@ doProlog(XML_Parser parser,
return XML_ERROR_RECURSIVE_ENTITY_REF;
if (entity->textPtr) {
enum XML_Error result;
- XML_Bool betweenDecl =
+ XML_Bool betweenDecl =
(role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
result = processInternalEntity(parser, entity, betweenDecl);
if (result != XML_ERROR_NONE)
@@ -4637,7 +4711,7 @@ doProlog(XML_Parser parser,
reportDefault(parser, enc, s, next);
switch (ps_parsing) {
- case XML_SUSPENDED:
+ case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
@@ -4707,7 +4781,7 @@ epilogProcessor(XML_Parser parser,
}
eventPtr = s = next;
switch (ps_parsing) {
- case XML_SUSPENDED:
+ case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
case XML_FINISHED:
@@ -4750,12 +4824,12 @@ processInternalEntity(XML_Parser parser, ENTITY *entity,
#ifdef XML_DTD
if (entity->is_param) {
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
next, &next, XML_FALSE);
}
- else
+ else
#endif /* XML_DTD */
- result = doContent(parser, tagLevel, internalEncoding, textStart,
+ result = doContent(parser, tagLevel, internalEncoding, textStart,
textEnd, &next, XML_FALSE);
if (result == XML_ERROR_NONE) {
@@ -4795,13 +4869,13 @@ internalEntityProcessor(XML_Parser parser,
#ifdef XML_DTD
if (entity->is_param) {
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
next, &next, XML_FALSE);
}
else
#endif /* XML_DTD */
- result = doContent(parser, openEntity->startTagLevel, internalEncoding,
- textStart, textEnd, &next, XML_FALSE);
+ result = doContent(parser, openEntity->startTagLevel, internalEncoding,
+ textStart, textEnd, &next, XML_FALSE);
if (result != XML_ERROR_NONE)
return result;
@@ -4822,7 +4896,7 @@ internalEntityProcessor(XML_Parser parser,
int tok;
processor = prologProcessor;
tok = XmlPrologTok(encoding, s, end, &next);
- return doProlog(parser, encoding, s, end, tok, next, nextPtr,
+ return doProlog(parser, encoding, s, end, tok, next, nextPtr,
(XML_Bool)!ps_finalBuffer);
}
else
@@ -4831,8 +4905,8 @@ internalEntityProcessor(XML_Parser parser,
processor = contentProcessor;
/* see externalEntityContentProcessor vs contentProcessor */
return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
- nextPtr, (XML_Bool)!ps_finalBuffer);
- }
+ nextPtr, (XML_Bool)!ps_finalBuffer);
+ }
}
static enum XML_Error PTRCALL
@@ -4985,7 +5059,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
if (!entity->textPtr) {
if (enc == encoding)
eventPtr = ptr;
- return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
+ return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
}
else {
enum XML_Error result;
@@ -5328,7 +5402,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
DTD * const dtd = _dtd; /* save one level of indirection */
const XML_Char *name;
for (name = elementType->name; *name; name++) {
- if (*name == XML_T(':')) {
+ if (*name == XML_T(ASCII_COLON)) {
PREFIX *prefix;
const XML_Char *s;
for (s = elementType->name; s != name; s++) {
@@ -5375,12 +5449,12 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
poolFinish(&dtd->pool);
if (!ns)
;
- else if (name[0] == XML_T('x')
- && name[1] == XML_T('m')
- && name[2] == XML_T('l')
- && name[3] == XML_T('n')
- && name[4] == XML_T('s')
- && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) {
+ else if (name[0] == XML_T(ASCII_x)
+ && name[1] == XML_T(ASCII_m)
+ && name[2] == XML_T(ASCII_l)
+ && name[3] == XML_T(ASCII_n)
+ && name[4] == XML_T(ASCII_s)
+ && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {
if (name[5] == XML_T('\0'))
id->prefix = &dtd->defaultPrefix;
else
@@ -5391,7 +5465,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
int i;
for (i = 0; name[i]; i++) {
/* attributes without prefix are *not* in the default namespace */
- if (name[i] == XML_T(':')) {
+ if (name[i] == XML_T(ASCII_COLON)) {
int j;
for (j = 0; j < i; j++) {
if (!poolAppendChar(&dtd->pool, name[j]))
@@ -5401,8 +5475,6 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
return NULL;
id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
sizeof(PREFIX));
- if (!id->prefix)
- return NULL;
if (id->prefix->name == poolStart(&dtd->pool))
poolFinish(&dtd->pool);
else
@@ -5415,7 +5487,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
return id;
}
-#define CONTEXT_SEP XML_T('\f')
+#define CONTEXT_SEP XML_T(ASCII_FF)
static const XML_Char *
getContext(XML_Parser parser)
@@ -5427,7 +5499,7 @@ getContext(XML_Parser parser)
if (dtd->defaultPrefix.binding) {
int i;
int len;
- if (!poolAppendChar(&tempPool, XML_T('=')))
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
return NULL;
len = dtd->defaultPrefix.binding->uriLen;
if (namespaceSeparator)
@@ -5453,7 +5525,7 @@ getContext(XML_Parser parser)
for (s = prefix->name; *s; s++)
if (!poolAppendChar(&tempPool, *s))
return NULL;
- if (!poolAppendChar(&tempPool, XML_T('=')))
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
return NULL;
len = prefix->binding->uriLen;
if (namespaceSeparator)
@@ -5505,7 +5577,7 @@ setContext(XML_Parser parser, const XML_Char *context)
context = s;
poolDiscard(&tempPool);
}
- else if (*s == XML_T('=')) {
+ else if (*s == XML_T(ASCII_EQUALS)) {
PREFIX *prefix;
if (poolLength(&tempPool) == 0)
prefix = &dtd->defaultPrefix;
@@ -6162,12 +6234,13 @@ poolGrow(STRING_POOL *pool)
}
if (pool->blocks && pool->start == pool->blocks->s) {
int blockSize = (int)(pool->end - pool->start)*2;
- pool->blocks = (BLOCK *)
+ BLOCK *temp = (BLOCK *)
pool->mem->realloc_fcn(pool->blocks,
(offsetof(BLOCK, s)
+ blockSize * sizeof(XML_Char)));
- if (pool->blocks == NULL)
+ if (temp == NULL)
return XML_FALSE;
+ pool->blocks = temp;
pool->blocks->size = blockSize;
pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
pool->start = pool->blocks->s;
diff --git a/Modules/expat/xmlrole.c b/Modules/expat/xmlrole.c
index 15d4d8f..44772e2 100644
--- a/Modules/expat/xmlrole.c
+++ b/Modules/expat/xmlrole.c
@@ -2,20 +2,22 @@
See the file COPYING for copying permission.
*/
+#include <stddef.h>
+
#ifdef COMPILED_FROM_DSP
#include "winconfig.h"
#elif defined(MACOS_CLASSIC)
#include "macconfig.h"
-#elif defined(__amigaos4__)
+#elif defined(__amigaos__)
#include "amigaconfig.h"
+#elif defined(__WATCOMC__)
+#include "watcomconfig.h"
#else
#ifdef HAVE_EXPAT_CONFIG_H
#include <expat_config.h>
#endif
#endif /* ndef COMPILED_FROM_DSP */
-#include <stddef.h>
-
#include "expat_external.h"
#include "internal.h"
#include "xmlrole.h"
@@ -53,12 +55,16 @@ static const char KW_IDREF[] = {
ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
static const char KW_IDREFS[] = {
ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
+#ifdef XML_DTD
static const char KW_IGNORE[] = {
ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
+#endif
static const char KW_IMPLIED[] = {
ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
+#ifdef XML_DTD
static const char KW_INCLUDE[] = {
ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
+#endif
static const char KW_NDATA[] = {
ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
static const char KW_NMTOKEN[] = {
diff --git a/Modules/expat/xmltok.c b/Modules/expat/xmltok.c
index db92247..bf09dfc 100644
--- a/Modules/expat/xmltok.c
+++ b/Modules/expat/xmltok.c
@@ -2,20 +2,22 @@
See the file COPYING for copying permission.
*/
+#include <stddef.h>
+
#ifdef COMPILED_FROM_DSP
#include "winconfig.h"
#elif defined(MACOS_CLASSIC)
#include "macconfig.h"
-#elif defined(__amigaos4__)
+#elif defined(__amigaos__)
#include "amigaconfig.h"
+#elif defined(__WATCOMC__)
+#include "watcomconfig.h"
#else
#ifdef HAVE_EXPAT_CONFIG_H
#include <expat_config.h>
#endif
#endif /* ndef COMPILED_FROM_DSP */
-#include <stddef.h>
-
#include "expat_external.h"
#include "internal.h"
#include "xmltok.h"
@@ -295,7 +297,9 @@ sb_charMatches(const ENCODING *enc, const char *p, int c)
#endif
#define PREFIX(ident) normal_ ## ident
+#define XML_TOK_IMPL_C
#include "xmltok_impl.c"
+#undef XML_TOK_IMPL_C
#undef MINBPC
#undef BYTE_TYPE
@@ -692,7 +696,9 @@ little2_isNmstrtMin(const ENCODING *enc, const char *p)
#define IS_NMSTRT_CHAR(enc, p, n) (0)
#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p)
+#define XML_TOK_IMPL_C
#include "xmltok_impl.c"
+#undef XML_TOK_IMPL_C
#undef MINBPC
#undef BYTE_TYPE
@@ -831,7 +837,9 @@ big2_isNmstrtMin(const ENCODING *enc, const char *p)
#define IS_NMSTRT_CHAR(enc, p, n) (0)
#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p)
+#define XML_TOK_IMPL_C
#include "xmltok_impl.c"
+#undef XML_TOK_IMPL_C
#undef MINBPC
#undef BYTE_TYPE
@@ -1337,7 +1345,7 @@ unknown_toUtf16(const ENCODING *enc,
ENCODING *
XmlInitUnknownEncoding(void *mem,
int *table,
- CONVERTER convert,
+ CONVERTER convert,
void *userData)
{
int i;
@@ -1610,7 +1618,9 @@ initScan(const ENCODING * const *encodingTable,
#define NS(x) x
#define ns(x) x
+#define XML_TOK_NS_C
#include "xmltok_ns.c"
+#undef XML_TOK_NS_C
#undef NS
#undef ns
@@ -1619,7 +1629,9 @@ initScan(const ENCODING * const *encodingTable,
#define NS(x) x ## NS
#define ns(x) x ## _ns
+#define XML_TOK_NS_C
#include "xmltok_ns.c"
+#undef XML_TOK_NS_C
#undef NS
#undef ns
@@ -1627,7 +1639,7 @@ initScan(const ENCODING * const *encodingTable,
ENCODING *
XmlInitUnknownEncodingNS(void *mem,
int *table,
- CONVERTER convert,
+ CONVERTER convert,
void *userData)
{
ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData);
diff --git a/Modules/expat/xmltok_impl.c b/Modules/expat/xmltok_impl.c
index f793a6b..9c2895b 100644
--- a/Modules/expat/xmltok_impl.c
+++ b/Modules/expat/xmltok_impl.c
@@ -2,6 +2,9 @@
See the file COPYING for copying permission.
*/
+/* This file is included! */
+#ifdef XML_TOK_IMPL_C
+
#ifndef IS_INVALID_CHAR
#define IS_INVALID_CHAR(enc, ptr, n) (0)
#endif
@@ -882,7 +885,7 @@ PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
const char **nextTokPtr)
{
if (ptr == end)
- return -XML_TOK_PERCENT;
+ return XML_TOK_PARTIAL;
switch (BYTE_TYPE(enc, ptr)) {
CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
@@ -1777,3 +1780,4 @@ PREFIX(updatePosition)(const ENCODING *enc,
#undef CHECK_NMSTRT_CASE
#undef CHECK_NMSTRT_CASES
+#endif /* XML_TOK_IMPL_C */
diff --git a/Modules/expat/xmltok_ns.c b/Modules/expat/xmltok_ns.c
index d2f8938..c3b88fd 100644
--- a/Modules/expat/xmltok_ns.c
+++ b/Modules/expat/xmltok_ns.c
@@ -1,3 +1,10 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* This file is included! */
+#ifdef XML_TOK_NS_C
+
const ENCODING *
NS(XmlGetUtf8InternalEncoding)(void)
{
@@ -104,3 +111,5 @@ NS(XmlParseXmlDecl)(int isGeneralTextEntity,
encoding,
standalone);
}
+
+#endif /* XML_TOK_NS_C */
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
new file mode 100644
index 0000000..7e363f0
--- /dev/null
+++ b/Modules/faulthandler.c
@@ -0,0 +1,1152 @@
+#include "Python.h"
+#include "pythread.h"
+#include <signal.h>
+#include <object.h>
+#include <frameobject.h>
+#include <signal.h>
+#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
+#include <pthread.h>
+#endif
+
+/* Allocate at maximum 100 MB of the stack to raise the stack overflow */
+#define STACK_OVERFLOW_MAX_SIZE (100*1024*1024)
+
+#ifdef WITH_THREAD
+# define FAULTHANDLER_LATER
+#endif
+
+#ifndef MS_WINDOWS
+ /* register() is useless on Windows, because only SIGSEGV, SIGABRT and
+ SIGILL can be handled by the process, and these signals can only be used
+ with enable(), not using register() */
+# define FAULTHANDLER_USER
+#endif
+
+#define PUTS(fd, str) write(fd, str, strlen(str))
+
+#ifdef HAVE_SIGACTION
+typedef struct sigaction _Py_sighandler_t;
+#else
+typedef PyOS_sighandler_t _Py_sighandler_t;
+#endif
+
+typedef struct {
+ int signum;
+ int enabled;
+ const char* name;
+ _Py_sighandler_t previous;
+ int all_threads;
+} fault_handler_t;
+
+static struct {
+ int enabled;
+ PyObject *file;
+ int fd;
+ int all_threads;
+ PyInterpreterState *interp;
+} fatal_error = {0, NULL, -1, 0};
+
+#ifdef FAULTHANDLER_LATER
+static struct {
+ PyObject *file;
+ int fd;
+ PY_TIMEOUT_T timeout_us; /* timeout in microseconds */
+ int repeat;
+ PyInterpreterState *interp;
+ int exit;
+ char *header;
+ size_t header_len;
+ /* The main thread always holds this lock. It is only released when
+ faulthandler_thread() is interrupted before this thread exits, or at
+ Python exit. */
+ PyThread_type_lock cancel_event;
+ /* released by child thread when joined */
+ PyThread_type_lock running;
+} thread;
+#endif
+
+#ifdef FAULTHANDLER_USER
+typedef struct {
+ int enabled;
+ PyObject *file;
+ int fd;
+ int all_threads;
+ int chain;
+ _Py_sighandler_t previous;
+ PyInterpreterState *interp;
+} user_signal_t;
+
+static user_signal_t *user_signals;
+
+/* the following macros come from Python: Modules/signalmodule.c */
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)
+#define NSIG 12
+#endif
+#ifndef NSIG
+# if defined(_NSIG)
+# define NSIG _NSIG /* For BSD/SysV */
+# elif defined(_SIGMAX)
+# define NSIG (_SIGMAX + 1) /* For QNX */
+# elif defined(SIGMAX)
+# define NSIG (SIGMAX + 1) /* For djgpp */
+# else
+# define NSIG 64 /* Use a reasonable default value */
+# endif
+#endif
+
+static void faulthandler_user(int signum);
+#endif /* FAULTHANDLER_USER */
+
+
+static fault_handler_t faulthandler_handlers[] = {
+#ifdef SIGBUS
+ {SIGBUS, 0, "Bus error", },
+#endif
+#ifdef SIGILL
+ {SIGILL, 0, "Illegal instruction", },
+#endif
+ {SIGFPE, 0, "Floating point exception", },
+ {SIGABRT, 0, "Aborted", },
+ /* define SIGSEGV at the end to make it the default choice if searching the
+ handler fails in faulthandler_fatal_error() */
+ {SIGSEGV, 0, "Segmentation fault", }
+};
+static const unsigned char faulthandler_nsignals = \
+ Py_ARRAY_LENGTH(faulthandler_handlers);
+
+#ifdef HAVE_SIGALTSTACK
+static stack_t stack;
+#endif
+
+
+/* Get the file descriptor of a file by calling its fileno() method and then
+ call its flush() method.
+
+ If file is NULL or Py_None, use sys.stderr as the new file.
+
+ On success, return the new file and write the file descriptor into *p_fd.
+ On error, return NULL. */
+
+static PyObject*
+faulthandler_get_fileno(PyObject *file, int *p_fd)
+{
+ PyObject *result;
+ _Py_IDENTIFIER(fileno);
+ _Py_IDENTIFIER(flush);
+ long fd_long;
+ int fd;
+
+ if (file == NULL || file == Py_None) {
+ file = PySys_GetObject("stderr");
+ if (file == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr");
+ return NULL;
+ }
+ }
+
+ result = _PyObject_CallMethodId(file, &PyId_fileno, "");
+ if (result == NULL)
+ return NULL;
+
+ fd = -1;
+ if (PyLong_Check(result)) {
+ fd_long = PyLong_AsLong(result);
+ if (0 <= fd_long && fd_long < INT_MAX)
+ fd = (int)fd_long;
+ }
+ Py_DECREF(result);
+
+ if (fd == -1) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "file.fileno() is not a valid file descriptor");
+ return NULL;
+ }
+
+ result = _PyObject_CallMethodId(file, &PyId_flush, "");
+ if (result != NULL)
+ Py_DECREF(result);
+ else {
+ /* ignore flush() error */
+ PyErr_Clear();
+ }
+ *p_fd = fd;
+ return file;
+}
+
+/* Get the state of the current thread: only call this function if the current
+ thread holds the GIL. Raise an exception on error. */
+static PyThreadState*
+get_thread_state(void)
+{
+ PyThreadState *tstate = PyThreadState_Get();
+ if (tstate == NULL) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "unable to get the current thread state");
+ return NULL;
+ }
+ return tstate;
+}
+
+static PyObject*
+faulthandler_dump_traceback_py(PyObject *self,
+ PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = {"file", "all_threads", NULL};
+ PyObject *file = NULL;
+ int all_threads = 1;
+ PyThreadState *tstate;
+ const char *errmsg;
+ int fd;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "|Oi:dump_traceback", kwlist,
+ &file, &all_threads))
+ return NULL;
+
+ file = faulthandler_get_fileno(file, &fd);
+ if (file == NULL)
+ return NULL;
+
+ tstate = get_thread_state();
+ if (tstate == NULL)
+ return NULL;
+
+ if (all_threads) {
+ errmsg = _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
+ if (errmsg != NULL) {
+ PyErr_SetString(PyExc_RuntimeError, errmsg);
+ return NULL;
+ }
+ }
+ else {
+ _Py_DumpTraceback(fd, tstate);
+ }
+ Py_RETURN_NONE;
+}
+
+
+/* Handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL signals.
+
+ Display the current Python traceback, restore the previous handler and call
+ the previous handler.
+
+ On Windows, don't explicitly call the previous handler, because the Windows
+ signal handler would not be called (for an unknown reason). The execution of
+ the program continues at faulthandler_fatal_error() exit, but the same
+ instruction will raise the same fault (signal), and so the previous handler
+ will be called.
+
+ This function is signal-safe and should only call signal-safe functions. */
+
+static void
+faulthandler_fatal_error(int signum)
+{
+ const int fd = fatal_error.fd;
+ unsigned int i;
+ fault_handler_t *handler = NULL;
+ PyThreadState *tstate;
+ int save_errno = errno;
+
+ if (!fatal_error.enabled)
+ return;
+
+ for (i=0; i < faulthandler_nsignals; i++) {
+ handler = &faulthandler_handlers[i];
+ if (handler->signum == signum)
+ break;
+ }
+ if (handler == NULL) {
+ /* faulthandler_nsignals == 0 (unlikely) */
+ return;
+ }
+
+ /* restore the previous handler */
+#ifdef HAVE_SIGACTION
+ (void)sigaction(signum, &handler->previous, NULL);
+#else
+ (void)signal(signum, handler->previous);
+#endif
+ handler->enabled = 0;
+
+ PUTS(fd, "Fatal Python error: ");
+ PUTS(fd, handler->name);
+ PUTS(fd, "\n\n");
+
+#ifdef WITH_THREAD
+ /* SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL are synchronous signals and
+ are thus delivered to the thread that caused the fault. Get the Python
+ thread state of the current thread.
+
+ PyThreadState_Get() doesn't give the state of the thread that caused the
+ fault if the thread released the GIL, and so this function cannot be
+ used. Read the thread local storage (TLS) instead: call
+ PyGILState_GetThisThreadState(). */
+ tstate = PyGILState_GetThisThreadState();
+#else
+ tstate = PyThreadState_Get();
+#endif
+
+ if (fatal_error.all_threads)
+ _Py_DumpTracebackThreads(fd, fatal_error.interp, tstate);
+ else {
+ if (tstate != NULL)
+ _Py_DumpTraceback(fd, tstate);
+ }
+
+ errno = save_errno;
+#ifdef MS_WINDOWS
+ if (signum == SIGSEGV) {
+ /* don't explicitly call the previous handler for SIGSEGV in this signal
+ handler, because the Windows signal handler would not be called */
+ return;
+ }
+#endif
+ /* call the previous signal handler: it is called immediatly if we use
+ sigaction() thanks to SA_NODEFER flag, otherwise it is deferred */
+ raise(signum);
+}
+
+/* Install the handler for fatal signals, faulthandler_fatal_error(). */
+
+static PyObject*
+faulthandler_enable(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = {"file", "all_threads", NULL};
+ PyObject *file = NULL;
+ int all_threads = 1;
+ unsigned int i;
+ fault_handler_t *handler;
+#ifdef HAVE_SIGACTION
+ struct sigaction action;
+#endif
+ int err;
+ int fd;
+ PyThreadState *tstate;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "|Oi:enable", kwlist, &file, &all_threads))
+ return NULL;
+
+ file = faulthandler_get_fileno(file, &fd);
+ if (file == NULL)
+ return NULL;
+
+ tstate = get_thread_state();
+ if (tstate == NULL)
+ return NULL;
+
+ Py_XDECREF(fatal_error.file);
+ Py_INCREF(file);
+ fatal_error.file = file;
+ fatal_error.fd = fd;
+ fatal_error.all_threads = all_threads;
+ fatal_error.interp = tstate->interp;
+
+ if (!fatal_error.enabled) {
+ fatal_error.enabled = 1;
+
+ for (i=0; i < faulthandler_nsignals; i++) {
+ handler = &faulthandler_handlers[i];
+#ifdef HAVE_SIGACTION
+ action.sa_handler = faulthandler_fatal_error;
+ sigemptyset(&action.sa_mask);
+ /* Do not prevent the signal from being received from within
+ its own signal handler */
+ action.sa_flags = SA_NODEFER;
+#ifdef HAVE_SIGALTSTACK
+ if (stack.ss_sp != NULL) {
+ /* Call the signal handler on an alternate signal stack
+ provided by sigaltstack() */
+ action.sa_flags |= SA_ONSTACK;
+ }
+#endif
+ err = sigaction(handler->signum, &action, &handler->previous);
+#else
+ handler->previous = signal(handler->signum,
+ faulthandler_fatal_error);
+ err = (handler->previous == SIG_ERR);
+#endif
+ if (err) {
+ PyErr_SetFromErrno(PyExc_RuntimeError);
+ return NULL;
+ }
+ handler->enabled = 1;
+ }
+ }
+ Py_RETURN_NONE;
+}
+
+static void
+faulthandler_disable(void)
+{
+ unsigned int i;
+ fault_handler_t *handler;
+
+ if (fatal_error.enabled) {
+ fatal_error.enabled = 0;
+ for (i=0; i < faulthandler_nsignals; i++) {
+ handler = &faulthandler_handlers[i];
+ if (!handler->enabled)
+ continue;
+#ifdef HAVE_SIGACTION
+ (void)sigaction(handler->signum, &handler->previous, NULL);
+#else
+ (void)signal(handler->signum, handler->previous);
+#endif
+ handler->enabled = 0;
+ }
+ }
+
+ Py_CLEAR(fatal_error.file);
+}
+
+static PyObject*
+faulthandler_disable_py(PyObject *self)
+{
+ if (!fatal_error.enabled) {
+ Py_INCREF(Py_False);
+ return Py_False;
+ }
+ faulthandler_disable();
+ Py_INCREF(Py_True);
+ return Py_True;
+}
+
+static PyObject*
+faulthandler_is_enabled(PyObject *self)
+{
+ return PyBool_FromLong(fatal_error.enabled);
+}
+
+#ifdef FAULTHANDLER_LATER
+
+static void
+faulthandler_thread(void *unused)
+{
+ PyLockStatus st;
+ const char* errmsg;
+ PyThreadState *current;
+ int ok;
+#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
+ sigset_t set;
+
+ /* we don't want to receive any signal */
+ sigfillset(&set);
+ pthread_sigmask(SIG_SETMASK, &set, NULL);
+#endif
+
+ do {
+ st = PyThread_acquire_lock_timed(thread.cancel_event,
+ thread.timeout_us, 0);
+ if (st == PY_LOCK_ACQUIRED) {
+ PyThread_release_lock(thread.cancel_event);
+ break;
+ }
+ /* Timeout => dump traceback */
+ assert(st == PY_LOCK_FAILURE);
+
+ /* get the thread holding the GIL, NULL if no thread hold the GIL */
+ current = _Py_atomic_load_relaxed(&_PyThreadState_Current);
+
+ write(thread.fd, thread.header, thread.header_len);
+
+ errmsg = _Py_DumpTracebackThreads(thread.fd, thread.interp, current);
+ ok = (errmsg == NULL);
+
+ if (thread.exit)
+ _exit(1);
+ } while (ok && thread.repeat);
+
+ /* The only way out */
+ PyThread_release_lock(thread.running);
+}
+
+static void
+cancel_dump_traceback_later(void)
+{
+ /* Notify cancellation */
+ PyThread_release_lock(thread.cancel_event);
+
+ /* Wait for thread to join */
+ PyThread_acquire_lock(thread.running, 1);
+ PyThread_release_lock(thread.running);
+
+ /* The main thread should always hold the cancel_event lock */
+ PyThread_acquire_lock(thread.cancel_event, 1);
+
+ Py_CLEAR(thread.file);
+ if (thread.header) {
+ free(thread.header);
+ thread.header = NULL;
+ }
+}
+
+static char*
+format_timeout(double timeout)
+{
+ unsigned long us, sec, min, hour;
+ double intpart, fracpart;
+ char buffer[100];
+
+ fracpart = modf(timeout, &intpart);
+ sec = (unsigned long)intpart;
+ us = (unsigned long)(fracpart * 1e6);
+ min = sec / 60;
+ sec %= 60;
+ hour = min / 60;
+ min %= 60;
+
+ if (us != 0)
+ PyOS_snprintf(buffer, sizeof(buffer),
+ "Timeout (%lu:%02lu:%02lu.%06lu)!\n",
+ hour, min, sec, us);
+ else
+ PyOS_snprintf(buffer, sizeof(buffer),
+ "Timeout (%lu:%02lu:%02lu)!\n",
+ hour, min, sec);
+
+ return strdup(buffer);
+}
+
+static PyObject*
+faulthandler_dump_traceback_later(PyObject *self,
+ PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = {"timeout", "repeat", "file", "exit", NULL};
+ double timeout;
+ PY_TIMEOUT_T timeout_us;
+ int repeat = 0;
+ PyObject *file = NULL;
+ int fd;
+ int exit = 0;
+ PyThreadState *tstate;
+ char *header;
+ size_t header_len;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "d|iOi:dump_traceback_later", kwlist,
+ &timeout, &repeat, &file, &exit))
+ return NULL;
+ if ((timeout * 1e6) >= (double) PY_TIMEOUT_MAX) {
+ PyErr_SetString(PyExc_OverflowError, "timeout value is too large");
+ return NULL;
+ }
+ timeout_us = (PY_TIMEOUT_T)(timeout * 1e6);
+ if (timeout_us <= 0) {
+ PyErr_SetString(PyExc_ValueError, "timeout must be greater than 0");
+ return NULL;
+ }
+
+ tstate = get_thread_state();
+ if (tstate == NULL)
+ return NULL;
+
+ file = faulthandler_get_fileno(file, &fd);
+ if (file == NULL)
+ return NULL;
+
+ /* format the timeout */
+ header = format_timeout(timeout);
+ if (header == NULL)
+ return PyErr_NoMemory();
+ header_len = strlen(header);
+
+ /* Cancel previous thread, if running */
+ cancel_dump_traceback_later();
+
+ Py_XDECREF(thread.file);
+ Py_INCREF(file);
+ thread.file = file;
+ thread.fd = fd;
+ thread.timeout_us = timeout_us;
+ thread.repeat = repeat;
+ thread.interp = tstate->interp;
+ thread.exit = exit;
+ thread.header = header;
+ thread.header_len = header_len;
+
+ /* Arm these locks to serve as events when released */
+ PyThread_acquire_lock(thread.running, 1);
+
+ if (PyThread_start_new_thread(faulthandler_thread, NULL) == -1) {
+ PyThread_release_lock(thread.running);
+ Py_CLEAR(thread.file);
+ free(header);
+ thread.header = NULL;
+ PyErr_SetString(PyExc_RuntimeError,
+ "unable to start watchdog thread");
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+static PyObject*
+faulthandler_cancel_dump_traceback_later_py(PyObject *self)
+{
+ cancel_dump_traceback_later();
+ Py_RETURN_NONE;
+}
+#endif /* FAULTHANDLER_LATER */
+
+#ifdef FAULTHANDLER_USER
+static int
+faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous)
+{
+#ifdef HAVE_SIGACTION
+ struct sigaction action;
+ action.sa_handler = faulthandler_user;
+ sigemptyset(&action.sa_mask);
+ /* if the signal is received while the kernel is executing a system
+ call, try to restart the system call instead of interrupting it and
+ return EINTR. */
+ action.sa_flags = SA_RESTART;
+ if (chain) {
+ /* do not prevent the signal from being received from within its
+ own signal handler */
+ action.sa_flags = SA_NODEFER;
+ }
+#ifdef HAVE_SIGALTSTACK
+ if (stack.ss_sp != NULL) {
+ /* Call the signal handler on an alternate signal stack
+ provided by sigaltstack() */
+ action.sa_flags |= SA_ONSTACK;
+ }
+#endif
+ return sigaction(signum, &action, p_previous);
+#else
+ _Py_sighandler_t previous;
+ previous = signal(signum, faulthandler_user);
+ if (p_previous != NULL)
+ *p_previous = previous;
+ return (previous == SIG_ERR);
+#endif
+}
+
+/* Handler of user signals (e.g. SIGUSR1).
+
+ Dump the traceback of the current thread, or of all threads if
+ thread.all_threads is true.
+
+ This function is signal safe and should only call signal safe functions. */
+
+static void
+faulthandler_user(int signum)
+{
+ user_signal_t *user;
+ PyThreadState *tstate;
+ int save_errno = errno;
+
+ user = &user_signals[signum];
+ if (!user->enabled)
+ return;
+
+#ifdef WITH_THREAD
+ /* PyThreadState_Get() doesn't give the state of the current thread if
+ the thread doesn't hold the GIL. Read the thread local storage (TLS)
+ instead: call PyGILState_GetThisThreadState(). */
+ tstate = PyGILState_GetThisThreadState();
+#else
+ tstate = PyThreadState_Get();
+#endif
+
+ if (user->all_threads)
+ _Py_DumpTracebackThreads(user->fd, user->interp, tstate);
+ else {
+ if (tstate != NULL)
+ _Py_DumpTraceback(user->fd, tstate);
+ }
+#ifdef HAVE_SIGACTION
+ if (user->chain) {
+ (void)sigaction(signum, &user->previous, NULL);
+ errno = save_errno;
+
+ /* call the previous signal handler */
+ raise(signum);
+
+ save_errno = errno;
+ (void)faulthandler_register(signum, user->chain, NULL);
+ errno = save_errno;
+ }
+#else
+ if (user->chain) {
+ errno = save_errno;
+ /* call the previous signal handler */
+ user->previous(signum);
+ }
+#endif
+}
+
+static int
+check_signum(int signum)
+{
+ unsigned int i;
+
+ for (i=0; i < faulthandler_nsignals; i++) {
+ if (faulthandler_handlers[i].signum == signum) {
+ PyErr_Format(PyExc_RuntimeError,
+ "signal %i cannot be registered, "
+ "use enable() instead",
+ signum);
+ return 0;
+ }
+ }
+ if (signum < 1 || NSIG <= signum) {
+ PyErr_SetString(PyExc_ValueError, "signal number out of range");
+ return 0;
+ }
+ return 1;
+}
+
+static PyObject*
+faulthandler_register_py(PyObject *self,
+ PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = {"signum", "file", "all_threads", "chain", NULL};
+ int signum;
+ PyObject *file = NULL;
+ int all_threads = 1;
+ int chain = 0;
+ int fd;
+ user_signal_t *user;
+ _Py_sighandler_t previous;
+ PyThreadState *tstate;
+ int err;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "i|Oii:register", kwlist,
+ &signum, &file, &all_threads, &chain))
+ return NULL;
+
+ if (!check_signum(signum))
+ return NULL;
+
+ tstate = get_thread_state();
+ if (tstate == NULL)
+ return NULL;
+
+ file = faulthandler_get_fileno(file, &fd);
+ if (file == NULL)
+ return NULL;
+
+ if (user_signals == NULL) {
+ user_signals = calloc(NSIG, sizeof(user_signal_t));
+ if (user_signals == NULL)
+ return PyErr_NoMemory();
+ }
+ user = &user_signals[signum];
+
+ if (!user->enabled) {
+ err = faulthandler_register(signum, chain, &previous);
+ if (err) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+ }
+
+ Py_XDECREF(user->file);
+ Py_INCREF(file);
+ user->file = file;
+ user->fd = fd;
+ user->all_threads = all_threads;
+ user->chain = chain;
+ user->previous = previous;
+ user->interp = tstate->interp;
+ user->enabled = 1;
+
+ Py_RETURN_NONE;
+}
+
+static int
+faulthandler_unregister(user_signal_t *user, int signum)
+{
+ if (!user->enabled)
+ return 0;
+ user->enabled = 0;
+#ifdef HAVE_SIGACTION
+ (void)sigaction(signum, &user->previous, NULL);
+#else
+ (void)signal(signum, user->previous);
+#endif
+ Py_CLEAR(user->file);
+ user->fd = -1;
+ return 1;
+}
+
+static PyObject*
+faulthandler_unregister_py(PyObject *self, PyObject *args)
+{
+ int signum;
+ user_signal_t *user;
+ int change;
+
+ if (!PyArg_ParseTuple(args, "i:unregister", &signum))
+ return NULL;
+
+ if (!check_signum(signum))
+ return NULL;
+
+ if (user_signals == NULL)
+ Py_RETURN_FALSE;
+
+ user = &user_signals[signum];
+ change = faulthandler_unregister(user, signum);
+ return PyBool_FromLong(change);
+}
+#endif /* FAULTHANDLER_USER */
+
+
+static PyObject *
+faulthandler_read_null(PyObject *self, PyObject *args)
+{
+ volatile int *x;
+ volatile int y;
+ int release_gil = 0;
+ if (!PyArg_ParseTuple(args, "|i:_read_null", &release_gil))
+ return NULL;
+
+ x = NULL;
+ if (release_gil) {
+ Py_BEGIN_ALLOW_THREADS
+ y = *x;
+ Py_END_ALLOW_THREADS
+ } else
+ y = *x;
+ return PyLong_FromLong(y);
+
+}
+
+static PyObject *
+faulthandler_sigsegv(PyObject *self, PyObject *args)
+{
+#if defined(MS_WINDOWS)
+ /* For SIGSEGV, faulthandler_fatal_error() restores the previous signal
+ handler and then gives back the execution flow to the program (without
+ explicitly calling the previous error handler). In a normal case, the
+ SIGSEGV was raised by the kernel because of a fault, and so if the
+ program retries to execute the same instruction, the fault will be
+ raised again.
+
+ Here the fault is simulated by a fake SIGSEGV signal raised by the
+ application. We have to raise SIGSEGV at lease twice: once for
+ faulthandler_fatal_error(), and one more time for the previous signal
+ handler. */
+ while(1)
+ raise(SIGSEGV);
+#else
+ raise(SIGSEGV);
+#endif
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+faulthandler_sigfpe(PyObject *self, PyObject *args)
+{
+ /* Do an integer division by zero: raise a SIGFPE on Intel CPU, but not on
+ PowerPC. Use volatile to disable compile-time optimizations. */
+ volatile int x = 1, y = 0, z;
+ z = x / y;
+ /* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC),
+ raise it manually. */
+ raise(SIGFPE);
+ /* This line is never reached, but we pretend to make something with z
+ to silence a compiler warning. */
+ return PyLong_FromLong(z);
+}
+
+static PyObject *
+faulthandler_sigabrt(PyObject *self, PyObject *args)
+{
+#ifdef _MSC_VER
+ /* Visual Studio: configure abort() to not display an error message nor
+ open a popup asking to report the fault. */
+ _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+#endif
+ abort();
+ Py_RETURN_NONE;
+}
+
+#ifdef SIGBUS
+static PyObject *
+faulthandler_sigbus(PyObject *self, PyObject *args)
+{
+ raise(SIGBUS);
+ Py_RETURN_NONE;
+}
+#endif
+
+#ifdef SIGILL
+static PyObject *
+faulthandler_sigill(PyObject *self, PyObject *args)
+{
+ raise(SIGILL);
+ Py_RETURN_NONE;
+}
+#endif
+
+static PyObject *
+faulthandler_fatal_error_py(PyObject *self, PyObject *args)
+{
+ char *message;
+ if (!PyArg_ParseTuple(args, "y:fatal_error", &message))
+ return NULL;
+ Py_FatalError(message);
+ Py_RETURN_NONE;
+}
+
+#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
+static void*
+stack_overflow(void *min_sp, void *max_sp, size_t *depth)
+{
+ /* allocate 4096 bytes on the stack at each call */
+ unsigned char buffer[4096];
+ void *sp = &buffer;
+ *depth += 1;
+ if (sp < min_sp || max_sp < sp)
+ return sp;
+ buffer[0] = 1;
+ buffer[4095] = 0;
+ return stack_overflow(min_sp, max_sp, depth);
+}
+
+static PyObject *
+faulthandler_stack_overflow(PyObject *self)
+{
+ size_t depth, size;
+ char *sp = (char *)&depth, *stop;
+
+ depth = 0;
+ stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE,
+ sp + STACK_OVERFLOW_MAX_SIZE,
+ &depth);
+ if (sp < stop)
+ size = stop - sp;
+ else
+ size = sp - stop;
+ PyErr_Format(PyExc_RuntimeError,
+ "unable to raise a stack overflow (allocated %zu bytes "
+ "on the stack, %zu recursive calls)",
+ size, depth);
+ return NULL;
+}
+#endif
+
+
+static int
+faulthandler_traverse(PyObject *module, visitproc visit, void *arg)
+{
+#ifdef FAULTHANDLER_USER
+ unsigned int signum;
+#endif
+
+#ifdef FAULTHANDLER_LATER
+ Py_VISIT(thread.file);
+#endif
+#ifdef FAULTHANDLER_USER
+ if (user_signals != NULL) {
+ for (signum=0; signum < NSIG; signum++)
+ Py_VISIT(user_signals[signum].file);
+ }
+#endif
+ Py_VISIT(fatal_error.file);
+ return 0;
+}
+
+PyDoc_STRVAR(module_doc,
+"faulthandler module.");
+
+static PyMethodDef module_methods[] = {
+ {"enable",
+ (PyCFunction)faulthandler_enable, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("enable(file=sys.stderr, all_threads=True): "
+ "enable the fault handler")},
+ {"disable", (PyCFunction)faulthandler_disable_py, METH_NOARGS,
+ PyDoc_STR("disable(): disable the fault handler")},
+ {"is_enabled", (PyCFunction)faulthandler_is_enabled, METH_NOARGS,
+ PyDoc_STR("is_enabled()->bool: check if the handler is enabled")},
+ {"dump_traceback",
+ (PyCFunction)faulthandler_dump_traceback_py, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): "
+ "dump the traceback of the current thread, or of all threads "
+ "if all_threads is True, into file")},
+#ifdef FAULTHANDLER_LATER
+ {"dump_traceback_later",
+ (PyCFunction)faulthandler_dump_traceback_later, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\n"
+ "dump the traceback of all threads in timeout seconds,\n"
+ "or each timeout seconds if repeat is True. If exit is True, "
+ "call _exit(1) which is not safe.")},
+ {"cancel_dump_traceback_later",
+ (PyCFunction)faulthandler_cancel_dump_traceback_later_py, METH_NOARGS,
+ PyDoc_STR("cancel_dump_traceback_later():\ncancel the previous call "
+ "to dump_traceback_later().")},
+#endif
+
+#ifdef FAULTHANDLER_USER
+ {"register",
+ (PyCFunction)faulthandler_register_py, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("register(signum, file=sys.stderr, all_threads=True, chain=False): "
+ "register an handler for the signal 'signum': dump the "
+ "traceback of the current thread, or of all threads if "
+ "all_threads is True, into file")},
+ {"unregister",
+ faulthandler_unregister_py, METH_VARARGS|METH_KEYWORDS,
+ PyDoc_STR("unregister(signum): unregister the handler of the signal "
+ "'signum' registered by register()")},
+#endif
+
+ {"_read_null", faulthandler_read_null, METH_VARARGS,
+ PyDoc_STR("_read_null(release_gil=False): read from NULL, raise "
+ "a SIGSEGV or SIGBUS signal depending on the platform")},
+ {"_sigsegv", faulthandler_sigsegv, METH_VARARGS,
+ PyDoc_STR("_sigsegv(): raise a SIGSEGV signal")},
+ {"_sigabrt", faulthandler_sigabrt, METH_VARARGS,
+ PyDoc_STR("_sigabrt(): raise a SIGABRT signal")},
+ {"_sigfpe", (PyCFunction)faulthandler_sigfpe, METH_NOARGS,
+ PyDoc_STR("_sigfpe(): raise a SIGFPE signal")},
+#ifdef SIGBUS
+ {"_sigbus", (PyCFunction)faulthandler_sigbus, METH_NOARGS,
+ PyDoc_STR("_sigbus(): raise a SIGBUS signal")},
+#endif
+#ifdef SIGILL
+ {"_sigill", (PyCFunction)faulthandler_sigill, METH_NOARGS,
+ PyDoc_STR("_sigill(): raise a SIGILL signal")},
+#endif
+ {"_fatal_error", faulthandler_fatal_error_py, METH_VARARGS,
+ PyDoc_STR("_fatal_error(message): call Py_FatalError(message)")},
+#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
+ {"_stack_overflow", (PyCFunction)faulthandler_stack_overflow, METH_NOARGS,
+ PyDoc_STR("_stack_overflow(): recursive call to raise a stack overflow")},
+#endif
+ {NULL, NULL} /* sentinel */
+};
+
+static struct PyModuleDef module_def = {
+ PyModuleDef_HEAD_INIT,
+ "faulthandler",
+ module_doc,
+ 0, /* non-negative size to be able to unload the module */
+ module_methods,
+ NULL,
+ faulthandler_traverse,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit_faulthandler(void)
+{
+ return PyModule_Create(&module_def);
+}
+
+/* Call faulthandler.enable() if the PYTHONFAULTHANDLER environment variable
+ is defined, or if sys._xoptions has a 'faulthandler' key. */
+
+static int
+faulthandler_env_options(void)
+{
+ PyObject *xoptions, *key, *module, *res;
+ _Py_IDENTIFIER(enable);
+
+ if (!Py_GETENV("PYTHONFAULTHANDLER")) {
+ int has_key;
+
+ xoptions = PySys_GetXOptions();
+ if (xoptions == NULL)
+ return -1;
+
+ key = PyUnicode_FromString("faulthandler");
+ if (key == NULL)
+ return -1;
+
+ has_key = PyDict_Contains(xoptions, key);
+ Py_DECREF(key);
+ if (!has_key)
+ return 0;
+ }
+
+ module = PyImport_ImportModule("faulthandler");
+ if (module == NULL) {
+ return -1;
+ }
+ res = _PyObject_CallMethodId(module, &PyId_enable, "");
+ Py_DECREF(module);
+ if (res == NULL)
+ return -1;
+ Py_DECREF(res);
+ return 0;
+}
+
+int _PyFaulthandler_Init(void)
+{
+#ifdef HAVE_SIGALTSTACK
+ int err;
+
+ /* Try to allocate an alternate stack for faulthandler() signal handler to
+ * be able to allocate memory on the stack, even on a stack overflow. If it
+ * fails, ignore the error. */
+ stack.ss_flags = 0;
+ stack.ss_size = SIGSTKSZ;
+ stack.ss_sp = PyMem_Malloc(stack.ss_size);
+ if (stack.ss_sp != NULL) {
+ err = sigaltstack(&stack, NULL);
+ if (err) {
+ PyMem_Free(stack.ss_sp);
+ stack.ss_sp = NULL;
+ }
+ }
+#endif
+#ifdef FAULTHANDLER_LATER
+ thread.file = NULL;
+ thread.cancel_event = PyThread_allocate_lock();
+ thread.running = PyThread_allocate_lock();
+ if (!thread.cancel_event || !thread.running) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "could not allocate locks for faulthandler");
+ return -1;
+ }
+ PyThread_acquire_lock(thread.cancel_event, 1);
+#endif
+
+ return faulthandler_env_options();
+}
+
+void _PyFaulthandler_Fini(void)
+{
+#ifdef FAULTHANDLER_USER
+ unsigned int signum;
+#endif
+
+#ifdef FAULTHANDLER_LATER
+ /* later */
+ if (thread.cancel_event) {
+ cancel_dump_traceback_later();
+ PyThread_release_lock(thread.cancel_event);
+ PyThread_free_lock(thread.cancel_event);
+ thread.cancel_event = NULL;
+ }
+ if (thread.running) {
+ PyThread_free_lock(thread.running);
+ thread.running = NULL;
+ }
+#endif
+
+#ifdef FAULTHANDLER_USER
+ /* user */
+ if (user_signals != NULL) {
+ for (signum=0; signum < NSIG; signum++)
+ faulthandler_unregister(&user_signals[signum], signum);
+ free(user_signals);
+ user_signals = NULL;
+ }
+#endif
+
+ /* fatal */
+ faulthandler_disable();
+#ifdef HAVE_SIGALTSTACK
+ if (stack.ss_sp != NULL) {
+ PyMem_Free(stack.ss_sp);
+ stack.ss_sp = NULL;
+ }
+#endif
+}
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index bfc5985..6b7e3fc 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -540,10 +540,13 @@ all_ins(PyObject* d)
if (ins(d, "F_SHLCK", (long)F_SHLCK)) return -1;
#endif
-/* OS X (and maybe others) let you tell the storage device to flush to physical media */
+/* OS X specifics */
#ifdef F_FULLFSYNC
if (ins(d, "F_FULLFSYNC", (long)F_FULLFSYNC)) return -1;
#endif
+#ifdef F_NOCACHE
+ if (ins(d, "F_NOCACHE", (long)F_NOCACHE)) return -1;
+#endif
/* For F_{GET|SET}FL */
#ifdef FD_CLOEXEC
diff --git a/Modules/fpectlmodule.c b/Modules/fpectlmodule.c
index 1bb51cf..6af2f82 100644
--- a/Modules/fpectlmodule.c
+++ b/Modules/fpectlmodule.c
@@ -174,17 +174,6 @@ static void fpe_reset(Sigfunc *handler)
fp_enable(TRP_INVALID | TRP_DIV_BY_ZERO | TRP_OVERFLOW);
PyOS_setsig(SIGFPE, handler);
-/*-- DEC ALPHA OSF --------------------------------------------------------*/
-#elif defined(__alpha) && defined(__osf__)
- /* References: exception_intro, ieee man pages */
- /* cc -c -I/usr/local/python/include fpectlmodule.c */
- /* ld -shared -o fpectlmodule.so fpectlmodule.o */
-#include <machine/fpu.h>
- unsigned long fp_control =
- IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF;
- ieee_set_fp_control(fp_control);
- PyOS_setsig(SIGFPE, handler);
-
/*-- DEC ALPHA LINUX ------------------------------------------------------*/
#elif defined(__alpha) && defined(linux)
#include <asm/fpu.h>
diff --git a/Modules/gc_weakref.txt b/Modules/gc_weakref.txt
index d7be6c3..2f18402 100644
--- a/Modules/gc_weakref.txt
+++ b/Modules/gc_weakref.txt
@@ -15,8 +15,8 @@ have been called before resurrection). At best (and this has been an
historically common bug), tp_clear empties an instance's __dict__, and
"impossible" AttributeErrors result. At worst, tp_clear leaves behind an
insane object at the C level, and segfaults result (historically, most
-often by setting a new-style class's mro pointer to NULL, after which
-attribute lookups performed by the class can segfault).
+often by setting a class's mro pointer to NULL, after which attribute
+lookups performed by the class can segfault).
OTOH, it's OK to run Python-level code that can't access unreachable
objects, and sometimes that's necessary. The chief example is the callback
@@ -119,7 +119,7 @@ isn't easy to stumble into by accident while Python is running, and, indeed,
it took quite a while to dream up failing test cases. Zope3 saw segfaults
during shutdown, during the second call of gc in Py_Finalize, after most
modules had been torn down. That creates many trash cycles (esp. those
-involving new-style classes), making the problem much more likely. Once you
+involving classes), making the problem much more likely. Once you
know what's required to provoke the problem, though, it's easy to create
tests that segfault before shutdown.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 8c524f8..f782dd0 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -65,17 +65,17 @@ static PyObject *garbage = NULL;
/* Python string to use if unhandled exception occurs */
static PyObject *gc_str = NULL;
-/* Python string used to look for __del__ attribute. */
-static PyObject *delstr = NULL;
+/* a list of callbacks to be invoked when collection is performed */
+static PyObject *callbacks = NULL;
-/* This is the number of objects who survived the last full collection. It
+/* This is the number of objects that survived the last full collection. It
approximates the number of long lived objects tracked by the GC.
(by "full collection", we mean a collection of the oldest generation).
*/
static Py_ssize_t long_lived_total = 0;
-/* This is the number of objects who survived all "non-full" collections,
+/* This is the number of objects that survived all "non-full" collections,
and are awaiting to undergo a full collection for the first time.
*/
@@ -731,8 +731,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
static void
debug_cycle(char *msg, PyObject *op)
{
- PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
- msg, Py_TYPE(op)->tp_name, op);
+ PySys_FormatStderr("gc: %s <%s %p>\n",
+ msg, Py_TYPE(op)->tp_name, op);
}
/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
@@ -813,6 +813,9 @@ clear_freelists(void)
(void)PyTuple_ClearFreeList();
(void)PyUnicode_ClearFreeList();
(void)PyFloat_ClearFreeList();
+ (void)PyList_ClearFreeList();
+ (void)PyDict_ClearFreeList();
+ (void)PySet_ClearFreeList();
}
static double
@@ -820,7 +823,9 @@ get_time(void)
{
double result = 0;
if (tmod != NULL) {
- PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
+ _Py_IDENTIFIER(time);
+
+ PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL);
if (f == NULL) {
PyErr_Clear();
}
@@ -836,7 +841,7 @@ get_time(void)
/* This is the main function. Read this to understand how the
* collection process works. */
static Py_ssize_t
-collect(int generation)
+collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
{
int i;
Py_ssize_t m = 0; /* # objects collected */
@@ -848,12 +853,6 @@ collect(int generation)
PyGC_Head *gc;
double t1 = 0.0;
- if (delstr == NULL) {
- delstr = PyUnicode_InternFromString("__del__");
- if (delstr == NULL)
- Py_FatalError("gc couldn't allocate \"__del__\"");
- }
-
if (debug & DEBUG_STATS) {
PySys_WriteStderr("gc: collecting generation %d...\n",
generation);
@@ -993,9 +992,64 @@ collect(int generation)
PyErr_WriteUnraisable(gc_str);
Py_FatalError("unexpected exception during garbage collection");
}
+
+ if (n_collected)
+ *n_collected = m;
+ if (n_uncollectable)
+ *n_uncollectable = n;
return n+m;
}
+/* Invoke progress callbacks to notify clients that garbage collection
+ * is starting or stopping
+ */
+static void
+invoke_gc_callback(const char *phase, int generation,
+ Py_ssize_t collected, Py_ssize_t uncollectable)
+{
+ Py_ssize_t i;
+ PyObject *info = NULL;
+
+ /* we may get called very early */
+ if (callbacks == NULL)
+ return;
+ /* The local variable cannot be rebound, check it for sanity */
+ assert(callbacks != NULL && PyList_CheckExact(callbacks));
+ if (PyList_GET_SIZE(callbacks) != 0) {
+ info = Py_BuildValue("{sisnsn}",
+ "generation", generation,
+ "collected", collected,
+ "uncollectable", uncollectable);
+ if (info == NULL) {
+ PyErr_WriteUnraisable(NULL);
+ return;
+ }
+ }
+ for (i=0; i<PyList_GET_SIZE(callbacks); i++) {
+ PyObject *r, *cb = PyList_GET_ITEM(callbacks, i);
+ Py_INCREF(cb); /* make sure cb doesn't go away */
+ r = PyObject_CallFunction(cb, "sO", phase, info);
+ Py_XDECREF(r);
+ if (r == NULL)
+ PyErr_WriteUnraisable(cb);
+ Py_DECREF(cb);
+ }
+ Py_XDECREF(info);
+}
+
+/* Perform garbage collection of a generation and invoke
+ * progress callbacks.
+ */
+static Py_ssize_t
+collect_with_callback(int generation)
+{
+ Py_ssize_t result, collected, uncollectable;
+ invoke_gc_callback("start", generation, 0, 0);
+ result = collect(generation, &collected, &uncollectable);
+ invoke_gc_callback("stop", generation, collected, uncollectable);
+ return result;
+}
+
static Py_ssize_t
collect_generations(void)
{
@@ -1014,7 +1068,7 @@ collect_generations(void)
if (i == NUM_GENERATIONS - 1
&& long_lived_pending < long_lived_total / 4)
continue;
- n = collect(i);
+ n = collect_with_callback(i);
break;
}
}
@@ -1085,7 +1139,7 @@ gc_collect(PyObject *self, PyObject *args, PyObject *kws)
n = 0; /* already collecting, don't do anything */
else {
collecting = 1;
- n = collect(genarg);
+ n = collect_with_callback(genarg);
collecting = 0;
}
@@ -1378,6 +1432,15 @@ PyInit_gc(void)
if (PyModule_AddObject(m, "garbage", garbage) < 0)
return NULL;
+ if (callbacks == NULL) {
+ callbacks = PyList_New(0);
+ if (callbacks == NULL)
+ return NULL;
+ }
+ Py_INCREF(callbacks);
+ if (PyModule_AddObject(m, "callbacks", callbacks) < 0)
+ return NULL;
+
/* Importing can't be done in collect() because collect()
* can be called via PyGC_Collect() in Py_Finalize().
* This wouldn't be a problem, except that <initialized> is
@@ -1410,7 +1473,7 @@ PyGC_Collect(void)
n = 0; /* already collecting, don't do anything */
else {
collecting = 1;
- n = collect(NUM_GENERATIONS - 1);
+ n = collect_with_callback(NUM_GENERATIONS - 1);
collecting = 0;
}
@@ -1447,6 +1510,7 @@ _PyGC_Fini(void)
Py_XDECREF(bytes);
}
}
+ Py_CLEAR(callbacks);
}
/* for debugging */
diff --git a/Modules/getbuildinfo.c b/Modules/getbuildinfo.c
index 7069b6e..0971a64 100644
--- a/Modules/getbuildinfo.c
+++ b/Modules/getbuildinfo.c
@@ -20,14 +20,6 @@
#endif
#endif
-/* on unix, SVNVERSION is passed on the command line.
- * on Windows, the string is interpolated using
- * subwcrev.exe
- */
-#ifndef SVNVERSION
-#define SVNVERSION "$WCRANGE$$WCMODS?M:$"
-#endif
-
/* XXX Only unix build process has been tested */
#ifndef HGVERSION
#define HGVERSION ""
@@ -57,16 +49,6 @@ Py_GetBuildInfo(void)
}
const char *
-_Py_svnversion(void)
-{
- /* the following string can be modified by subwcrev.exe */
- static const char svnversion[] = SVNVERSION;
- if (svnversion[0] != '$')
- return svnversion; /* it was interpolated, or passed on command line */
- return "Unversioned directory";
-}
-
-const char *
_Py_hgversion(void)
{
return HGVERSION;
diff --git a/Modules/getpath.c b/Modules/getpath.c
index b7f9573..b98c520 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -260,6 +260,59 @@ absolutize(wchar_t *path)
wcscpy(path, buffer);
}
+/* search for a prefix value in an environment file. If found, copy it
+ to the provided buffer, which is expected to be no more than MAXPATHLEN
+ bytes long.
+*/
+
+static int
+find_env_config_value(FILE * env_file, const wchar_t * key, wchar_t * value)
+{
+ int result = 0; /* meaning not found */
+ char buffer[MAXPATHLEN*2+1]; /* allow extra for key, '=', etc. */
+
+ fseek(env_file, 0, SEEK_SET);
+ while (!feof(env_file)) {
+ char * p = fgets(buffer, MAXPATHLEN*2, env_file);
+ wchar_t tmpbuffer[MAXPATHLEN*2+1];
+ PyObject * decoded;
+ int n;
+
+ if (p == NULL)
+ break;
+ n = strlen(p);
+ if (p[n - 1] != '\n') {
+ /* line has overflowed - bail */
+ break;
+ }
+ if (p[0] == '#') /* Comment - skip */
+ continue;
+ decoded = PyUnicode_DecodeUTF8(buffer, n, "surrogateescape");
+ if (decoded != NULL) {
+ Py_ssize_t k;
+ wchar_t * state;
+ k = PyUnicode_AsWideChar(decoded,
+ tmpbuffer, MAXPATHLEN * 2);
+ Py_DECREF(decoded);
+ if (k >= 0) {
+ wchar_t * tok = wcstok(tmpbuffer, L" \t\r\n", &state);
+ if ((tok != NULL) && !wcscmp(tok, key)) {
+ tok = wcstok(NULL, L" \t", &state);
+ if ((tok != NULL) && !wcscmp(tok, L"=")) {
+ tok = wcstok(NULL, L"\r\n", &state);
+ if (tok != NULL) {
+ wcsncpy(value, tok, MAXPATHLEN);
+ result = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN
bytes long.
*/
@@ -406,7 +459,7 @@ calculate_path(void)
static wchar_t delimiter[2] = {DELIM, '\0'};
static wchar_t separator[2] = {SEP, '\0'};
char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */
- wchar_t rtpypath[MAXPATHLEN+1];
+ wchar_t *rtpypath = NULL;
wchar_t *home = Py_GetPythonHome();
char *_path = getenv("PATH");
wchar_t *path_buffer = NULL;
@@ -421,6 +474,7 @@ calculate_path(void)
wchar_t *defpath;
#ifdef WITH_NEXT_FRAMEWORK
NSModule pythonModule;
+ const char* modPath;
#endif
#ifdef __APPLE__
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
@@ -515,8 +569,8 @@ calculate_path(void)
*/
pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize"));
/* Use dylib functions to find out where the framework was loaded from */
- buf = (wchar_t *)NSLibraryNameForModule(pythonModule);
- if (buf != NULL) {
+ modPath = NSLibraryNameForModule(pythonModule);
+ if (modPath != NULL) {
/* We're in a framework. */
/* See if we might be in the build directory. The framework in the
** build directory is incomplete, it only has the .dylib and a few
@@ -525,7 +579,12 @@ calculate_path(void)
** be running the interpreter in the build directory, so we use the
** build-directory-specific logic to find Lib and such.
*/
- wcsncpy(argv0_path, buf, MAXPATHLEN);
+ wchar_t* wbuf = _Py_char2wchar(modPath, NULL);
+ if (wbuf == NULL) {
+ Py_FatalError("Cannot decode framework location");
+ }
+
+ wcsncpy(argv0_path, wbuf, MAXPATHLEN);
reduce(argv0_path);
joinpath(argv0_path, lib_python);
joinpath(argv0_path, LANDMARK);
@@ -536,8 +595,9 @@ calculate_path(void)
}
else {
/* Use the location of the library as the progpath */
- wcsncpy(argv0_path, buf, MAXPATHLEN);
+ wcsncpy(argv0_path, wbuf, MAXPATHLEN);
}
+ PyMem_Free(wbuf);
}
#endif
@@ -565,6 +625,40 @@ calculate_path(void)
MAXPATHLEN bytes long.
*/
+ /* Search for an environment configuration file, first in the
+ executable's directory and then in the parent directory.
+ If found, open it for use when searching for prefixes.
+ */
+
+ {
+ wchar_t tmpbuffer[MAXPATHLEN+1];
+ wchar_t *env_cfg = L"pyvenv.cfg";
+ FILE * env_file = NULL;
+
+ wcscpy(tmpbuffer, argv0_path);
+
+ joinpath(tmpbuffer, env_cfg);
+ env_file = _Py_wfopen(tmpbuffer, L"r");
+ if (env_file == NULL) {
+ errno = 0;
+ reduce(tmpbuffer);
+ reduce(tmpbuffer);
+ joinpath(tmpbuffer, env_cfg);
+ env_file = _Py_wfopen(tmpbuffer, L"r");
+ if (env_file == NULL) {
+ errno = 0;
+ }
+ }
+ if (env_file != NULL) {
+ /* Look for a 'home' variable and set argv0_path to it, if found */
+ if (find_env_config_value(env_file, L"home", tmpbuffer)) {
+ wcscpy(argv0_path, tmpbuffer);
+ }
+ fclose(env_file);
+ env_file = NULL;
+ }
+ }
+
if (!(pfound = search_for_prefix(argv0_path, home, _prefix))) {
if (!Py_FrozenFlag)
fprintf(stderr,
@@ -606,12 +700,12 @@ calculate_path(void)
bufsz = 0;
if (_rtpypath) {
- size_t s = mbstowcs(rtpypath, _rtpypath, sizeof(rtpypath)/sizeof(wchar_t));
- if (s == (size_t)-1 || s >=sizeof(rtpypath))
- /* XXX deal with errors more gracefully */
+ size_t rtpypath_len;
+ rtpypath = _Py_char2wchar(_rtpypath, &rtpypath_len);
+ if (rtpypath != NULL)
+ bufsz += rtpypath_len + 1;
+ else
_rtpypath = NULL;
- if (_rtpypath)
- bufsz += wcslen(rtpypath) + 1;
}
defpath = _pythonpath;
@@ -645,7 +739,7 @@ calculate_path(void)
}
else {
/* Run-time value of $PYTHONPATH goes first */
- if (_rtpypath) {
+ if (rtpypath) {
wcscpy(buf, rtpypath);
wcscat(buf, delimiter);
}
@@ -719,6 +813,8 @@ calculate_path(void)
PyMem_Free(_pythonpath);
PyMem_Free(_prefix);
PyMem_Free(_exec_prefix);
+ if (rtpypath != NULL)
+ PyMem_Free(rtpypath);
}
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 77e76fe..9115b67 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -134,6 +134,53 @@ groupby_next(groupbyobject *gbo)
return r;
}
+static PyObject *
+groupby_reduce(groupbyobject *lz)
+{
+ /* reduce as a 'new' call with an optional 'setstate' if groupby
+ * has started
+ */
+ PyObject *value;
+ if (lz->tgtkey && lz->currkey && lz->currvalue)
+ value = Py_BuildValue("O(OO)(OOO)", Py_TYPE(lz),
+ lz->it, lz->keyfunc, lz->currkey, lz->currvalue, lz->tgtkey);
+ else
+ value = Py_BuildValue("O(OO)", Py_TYPE(lz),
+ lz->it, lz->keyfunc);
+
+ return value;
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+groupby_setstate(groupbyobject *lz, PyObject *state)
+{
+ PyObject *currkey, *currvalue, *tgtkey;
+ if (!PyArg_ParseTuple(state, "OOO", &currkey, &currvalue, &tgtkey))
+ return NULL;
+ Py_CLEAR(lz->currkey);
+ lz->currkey = currkey;
+ Py_INCREF(lz->currkey);
+ Py_CLEAR(lz->currvalue);
+ lz->currvalue = currvalue;
+ Py_INCREF(lz->currvalue);
+ Py_CLEAR(lz->tgtkey);
+ lz->tgtkey = tgtkey;
+ Py_INCREF(lz->tgtkey);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
+static PyMethodDef groupby_methods[] = {
+ {"__reduce__", (PyCFunction)groupby_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)groupby_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(groupby_doc,
"groupby(iterable[, keyfunc]) -> create an iterator which returns\n\
(key, sub-iterator) grouped by each value of key(value).\n");
@@ -168,7 +215,7 @@ static PyTypeObject groupby_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)groupby_next, /* tp_iternext */
- 0, /* tp_methods */
+ groupby_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -194,6 +241,17 @@ typedef struct {
static PyTypeObject _grouper_type;
static PyObject *
+_grouper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyObject *parent, *tgtkey;
+
+ if (!PyArg_ParseTuple(args, "O!O", &groupby_type, &parent, &tgtkey))
+ return NULL;
+
+ return _grouper_create((groupbyobject*) parent, tgtkey);
+}
+
+static PyObject *
_grouper_create(groupbyobject *parent, PyObject *tgtkey)
{
_grouperobject *igo;
@@ -269,6 +327,20 @@ _grouper_next(_grouperobject *igo)
return r;
}
+static PyObject *
+_grouper_reduce(_grouperobject *lz)
+{
+ return Py_BuildValue("O(OO)", Py_TYPE(lz),
+ lz->parent, lz->tgtkey);
+}
+
+static PyMethodDef _grouper_methods[] = {
+ {"__reduce__", (PyCFunction)_grouper_reduce, METH_NOARGS,
+ reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+
static PyTypeObject _grouper_type = {
PyVarObject_HEAD_INIT(NULL, 0)
"itertools._grouper", /* tp_name */
@@ -298,7 +370,7 @@ static PyTypeObject _grouper_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)_grouper_next, /* tp_iternext */
- 0, /* tp_methods */
+ _grouper_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -308,7 +380,7 @@ static PyTypeObject _grouper_type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- 0, /* tp_new */
+ _grouper_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
};
@@ -344,7 +416,7 @@ typedef struct {
static PyTypeObject teedataobject_type;
static PyObject *
-teedataobject_new(PyObject *it)
+teedataobject_newinternal(PyObject *it)
{
teedataobject *tdo;
@@ -364,7 +436,7 @@ static PyObject *
teedataobject_jumplink(teedataobject *tdo)
{
if (tdo->nextlink == NULL)
- tdo->nextlink = teedataobject_new(tdo->it);
+ tdo->nextlink = teedataobject_newinternal(tdo->it);
Py_XINCREF(tdo->nextlink);
return tdo->nextlink;
}
@@ -420,11 +492,81 @@ teedataobject_dealloc(teedataobject *tdo)
PyObject_GC_Del(tdo);
}
+static PyObject *
+teedataobject_reduce(teedataobject *tdo)
+{
+ int i;
+ /* create a temporary list of already iterated values */
+ PyObject *values = PyList_New(tdo->numread);
+ if (!values)
+ return NULL;
+ for (i=0 ; i<tdo->numread ; i++) {
+ Py_INCREF(tdo->values[i]);
+ PyList_SET_ITEM(values, i, tdo->values[i]);
+ }
+ return Py_BuildValue("O(ONO)", Py_TYPE(tdo), tdo->it,
+ values,
+ tdo->nextlink ? tdo->nextlink : Py_None);
+}
+
+static PyTypeObject teedataobject_type;
+
+static PyObject *
+teedataobject_new(PyTypeObject *type, PyObject *args, PyObject *kw)
+{
+ teedataobject *tdo;
+ PyObject *it, *values, *next;
+ Py_ssize_t i, len;
+
+ assert(type == &teedataobject_type);
+ if (!PyArg_ParseTuple(args, "OO!O", &it, &PyList_Type, &values, &next))
+ return NULL;
+
+ tdo = (teedataobject *)teedataobject_newinternal(it);
+ if (!tdo)
+ return NULL;
+
+ len = PyList_GET_SIZE(values);
+ if (len > LINKCELLS)
+ goto err;
+ for (i=0; i<len; i++) {
+ tdo->values[i] = PyList_GET_ITEM(values, i);
+ Py_INCREF(tdo->values[i]);
+ }
+ /* len <= LINKCELLS < INT_MAX */
+ tdo->numread = Py_SAFE_DOWNCAST(len, Py_ssize_t, int);
+
+ if (len == LINKCELLS) {
+ if (next != Py_None) {
+ if (Py_TYPE(next) != &teedataobject_type)
+ goto err;
+ assert(tdo->nextlink == NULL);
+ Py_INCREF(next);
+ tdo->nextlink = next;
+ }
+ } else {
+ if (next != Py_None)
+ goto err; /* shouldn't have a next if we are not full */
+ }
+ return (PyObject*)tdo;
+
+err:
+ Py_XDECREF(tdo);
+ PyErr_SetString(PyExc_ValueError, "Invalid arguments");
+ return NULL;
+}
+
+static PyMethodDef teedataobject_methods[] = {
+ {"__reduce__", (PyCFunction)teedataobject_reduce, METH_NOARGS,
+ reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(teedataobject_doc, "Data container common to multiple tee objects.");
static PyTypeObject teedataobject_type = {
PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
- "itertools.tee_dataobject", /* tp_name */
+ "itertools._tee_dataobject", /* tp_name */
sizeof(teedataobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
@@ -451,7 +593,7 @@ static PyTypeObject teedataobject_type = {
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
- 0, /* tp_methods */
+ teedataobject_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -461,7 +603,7 @@ static PyTypeObject teedataobject_type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- 0, /* tp_new */
+ teedataobject_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
};
@@ -528,7 +670,7 @@ tee_fromiterable(PyObject *iterable)
to = PyObject_GC_New(teeobject, &tee_type);
if (to == NULL)
goto done;
- to->dataobj = (teedataobject *)teedataobject_new(it);
+ to->dataobj = (teedataobject *)teedataobject_newinternal(it);
if (!to->dataobj) {
PyObject_GC_Del(to);
to = NULL;
@@ -548,7 +690,7 @@ tee_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
PyObject *iterable;
- if (!PyArg_UnpackTuple(args, "tee", 1, 1, &iterable))
+ if (!PyArg_UnpackTuple(args, "_tee", 1, 1, &iterable))
return NULL;
return tee_fromiterable(iterable);
}
@@ -570,17 +712,43 @@ tee_dealloc(teeobject *to)
PyObject_GC_Del(to);
}
+static PyObject *
+tee_reduce(teeobject *to)
+{
+ return Py_BuildValue("O(())(Oi)", Py_TYPE(to), to->dataobj, to->index);
+}
+
+static PyObject *
+tee_setstate(teeobject *to, PyObject *state)
+{
+ teedataobject *tdo;
+ int index;
+ if (!PyArg_ParseTuple(state, "O!i", &teedataobject_type, &tdo, &index))
+ return NULL;
+ if (index < 0 || index > LINKCELLS) {
+ PyErr_SetString(PyExc_ValueError, "Index out of range");
+ return NULL;
+ }
+ Py_CLEAR(to->dataobj);
+ to->dataobj = tdo;
+ Py_INCREF(to->dataobj);
+ to->index = index;
+ Py_RETURN_NONE;
+}
+
PyDoc_STRVAR(teeobject_doc,
"Iterator wrapped to make it copyable");
static PyMethodDef tee_methods[] = {
{"__copy__", (PyCFunction)tee_copy, METH_NOARGS, teecopy_doc},
+ {"__reduce__", (PyCFunction)tee_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)tee_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
static PyTypeObject tee_type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "itertools.tee", /* tp_name */
+ "itertools._tee", /* tp_name */
sizeof(teeobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
@@ -626,6 +794,7 @@ tee(PyObject *self, PyObject *args)
{
Py_ssize_t i, n=2;
PyObject *it, *iterable, *copyable, *result;
+ _Py_IDENTIFIER(__copy__);
if (!PyArg_ParseTuple(args, "O|n", &iterable, &n))
return NULL;
@@ -643,7 +812,7 @@ tee(PyObject *self, PyObject *args)
Py_DECREF(result);
return NULL;
}
- if (!PyObject_HasAttrString(it, "__copy__")) {
+ if (!_PyObject_HasAttrId(it, &PyId___copy__)) {
copyable = tee_fromiterable(it);
Py_DECREF(it);
if (copyable == NULL) {
@@ -654,7 +823,8 @@ tee(PyObject *self, PyObject *args)
copyable = it;
PyTuple_SET_ITEM(result, 0, copyable);
for (i=1 ; i<n ; i++) {
- copyable = PyObject_CallMethod(copyable, "__copy__", NULL);
+
+ copyable = _PyObject_CallMethodId(copyable, &PyId___copy__, NULL);
if (copyable == NULL) {
Py_DECREF(result);
return NULL;
@@ -769,6 +939,38 @@ cycle_next(cycleobject *lz)
}
}
+static PyObject *
+cycle_reduce(cycleobject *lz)
+{
+ /* Create a new cycle with the iterator tuple, then set
+ * the saved state on it.
+ */
+ return Py_BuildValue("O(O)(Oi)", Py_TYPE(lz),
+ lz->it, lz->saved, lz->firstpass);
+ }
+
+static PyObject *
+cycle_setstate(cycleobject *lz, PyObject *state)
+{
+ PyObject *saved=NULL;
+ int firstpass;
+ if (!PyArg_ParseTuple(state, "Oi", &saved, &firstpass))
+ return NULL;
+ Py_CLEAR(lz->saved);
+ lz->saved = saved;
+ Py_XINCREF(lz->saved);
+ lz->firstpass = firstpass != 0;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef cycle_methods[] = {
+ {"__reduce__", (PyCFunction)cycle_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)cycle_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(cycle_doc,
"cycle(iterable) --> cycle object\n\
\n\
@@ -805,7 +1007,7 @@ static PyTypeObject cycle_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)cycle_next, /* tp_iternext */
- 0, /* tp_methods */
+ cycle_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -913,6 +1115,31 @@ dropwhile_next(dropwhileobject *lz)
}
}
+static PyObject *
+dropwhile_reduce(dropwhileobject *lz)
+{
+ return Py_BuildValue("O(OO)l", Py_TYPE(lz),
+ lz->func, lz->it, lz->start);
+}
+
+static PyObject *
+dropwhile_setstate(dropwhileobject *lz, PyObject *state)
+{
+ int start = PyObject_IsTrue(state);
+ if (start < 0)
+ return NULL;
+ lz->start = start;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef dropwhile_methods[] = {
+ {"__reduce__", (PyCFunction)dropwhile_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)dropwhile_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(dropwhile_doc,
"dropwhile(predicate, iterable) --> dropwhile object\n\
\n\
@@ -949,7 +1176,7 @@ static PyTypeObject dropwhile_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)dropwhile_next, /* tp_iternext */
- 0, /* tp_methods */
+ dropwhile_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1045,7 +1272,7 @@ takewhile_next(takewhileobject *lz)
}
ok = PyObject_IsTrue(good);
Py_DECREF(good);
- if (ok > 0)
+ if (ok == 1)
return item;
Py_DECREF(item);
if (ok == 0)
@@ -1053,6 +1280,30 @@ takewhile_next(takewhileobject *lz)
return NULL;
}
+static PyObject *
+takewhile_reduce(takewhileobject *lz)
+{
+ return Py_BuildValue("O(OO)l", Py_TYPE(lz),
+ lz->func, lz->it, lz->stop);
+}
+
+static PyObject *
+takewhile_reduce_setstate(takewhileobject *lz, PyObject *state)
+{
+ int stop = PyObject_IsTrue(state);
+ if (stop < 0)
+ return NULL;
+ lz->stop = stop;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef takewhile_reduce_methods[] = {
+ {"__reduce__", (PyCFunction)takewhile_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)takewhile_reduce_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
PyDoc_STRVAR(takewhile_doc,
"takewhile(predicate, iterable) --> takewhile object\n\
\n\
@@ -1089,7 +1340,7 @@ static PyTypeObject takewhile_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)takewhile_next, /* tp_iternext */
- 0, /* tp_methods */
+ takewhile_reduce_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1245,6 +1496,44 @@ islice_next(isliceobject *lz)
return item;
}
+static PyObject *
+islice_reduce(isliceobject *lz)
+{
+ /* When unpickled, generate a new object with the same bounds,
+ * then 'setstate' with the next and count
+ */
+ PyObject *stop;
+ if (lz->stop == -1) {
+ stop = Py_None;
+ Py_INCREF(stop);
+ } else {
+ stop = PyLong_FromSsize_t(lz->stop);
+ if (stop == NULL)
+ return NULL;
+ }
+ return Py_BuildValue("O(OnNn)n", Py_TYPE(lz),
+ lz->it, lz->next, stop, lz->step,
+ lz->cnt);
+}
+
+static PyObject *
+islice_setstate(isliceobject *lz, PyObject *state)
+{
+ Py_ssize_t cnt = PyLong_AsSsize_t(state);
+ if (cnt == -1 && PyErr_Occurred())
+ return NULL;
+ lz->cnt = cnt;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef islice_methods[] = {
+ {"__reduce__", (PyCFunction)islice_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)islice_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(islice_doc,
"islice(iterable, [start,] stop [, step]) --> islice object\n\
\n\
@@ -1285,7 +1574,7 @@ static PyTypeObject islice_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)islice_next, /* tp_iternext */
- 0, /* tp_methods */
+ islice_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1380,6 +1669,19 @@ starmap_next(starmapobject *lz)
return result;
}
+static PyObject *
+starmap_reduce(starmapobject *lz)
+{
+ /* Just pickle the iterator */
+ return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->func, lz->it);
+}
+
+static PyMethodDef starmap_methods[] = {
+ {"__reduce__", (PyCFunction)starmap_reduce, METH_NOARGS,
+ reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(starmap_doc,
"starmap(function, sequence) --> starmap object\n\
\n\
@@ -1416,7 +1718,7 @@ static PyTypeObject starmap_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)starmap_next, /* tp_iternext */
- 0, /* tp_methods */
+ starmap_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1535,6 +1837,41 @@ chain_next(chainobject *lz)
return chain_next(lz); /* recurse and use next active */
}
+static PyObject *
+chain_reduce(chainobject *lz)
+{
+ if (lz->source) {
+ /* we can't pickle function objects (itertools.from_iterable) so
+ * we must use setstate to replace the iterable. One day we
+ * will fix pickling of functions
+ */
+ if (lz->active) {
+ return Py_BuildValue("O()(OO)", Py_TYPE(lz), lz->source, lz->active);
+ } else {
+ return Py_BuildValue("O()(O)", Py_TYPE(lz), lz->source);
+ }
+ } else {
+ return Py_BuildValue("O()", Py_TYPE(lz)); /* exhausted */
+ }
+ return NULL;
+}
+
+static PyObject *
+chain_setstate(chainobject *lz, PyObject *state)
+{
+ PyObject *source, *active=NULL;
+ if (! PyArg_ParseTuple(state, "O|O", &source, &active))
+ return NULL;
+
+ Py_CLEAR(lz->source);
+ lz->source = source;
+ Py_INCREF(lz->source);
+ Py_CLEAR(lz->active);
+ lz->active = active;
+ Py_XINCREF(lz->active);
+ Py_RETURN_NONE;
+}
+
PyDoc_STRVAR(chain_doc,
"chain(*iterables) --> chain object\n\
\n\
@@ -1551,6 +1888,10 @@ that evaluates lazily.");
static PyMethodDef chain_methods[] = {
{"from_iterable", (PyCFunction) chain_new_from_iterable, METH_O | METH_CLASS,
chain_from_iterable_doc},
+ {"__reduce__", (PyCFunction)chain_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)chain_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -1791,6 +2132,83 @@ empty:
return NULL;
}
+static PyObject *
+product_reduce(productobject *lz)
+{
+ if (lz->stopped) {
+ return Py_BuildValue("O(())", Py_TYPE(lz));
+ } else if (lz->result == NULL) {
+ return Py_BuildValue("OO", Py_TYPE(lz), lz->pools);
+ } else {
+ PyObject *indices;
+ Py_ssize_t n, i;
+
+ /* we must pickle the indices use them for setstate, and
+ * additionally indicate that the iterator has started
+ */
+ n = PyTuple_GET_SIZE(lz->pools);
+ indices = PyTuple_New(n);
+ if (indices == NULL)
+ return NULL;
+ for (i=0; i<n; i++){
+ PyObject* index = PyLong_FromSsize_t(lz->indices[i]);
+ if (!index) {
+ Py_DECREF(indices);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(indices, i, index);
+ }
+ return Py_BuildValue("OON", Py_TYPE(lz), lz->pools, indices);
+ }
+}
+
+static PyObject *
+product_setstate(productobject *lz, PyObject *state)
+{
+ PyObject *result;
+ Py_ssize_t n, i;
+
+ n = PyTuple_GET_SIZE(lz->pools);
+ if (!PyTuple_Check(state) || PyTuple_GET_SIZE(state) != n) {
+ PyErr_SetString(PyExc_ValueError, "invalid arguments");
+ return NULL;
+ }
+ for (i=0; i<n; i++)
+ {
+ PyObject* indexObject = PyTuple_GET_ITEM(state, i);
+ Py_ssize_t index = PyLong_AsSsize_t(indexObject);
+ if (index < 0 && PyErr_Occurred())
+ return NULL; /* not an integer */
+ /* clamp the index */
+ if (index < 0)
+ index = 0;
+ else if (index > n-1)
+ index = n-1;
+ lz->indices[i] = index;
+ }
+
+ result = PyTuple_New(n);
+ if (!result)
+ return NULL;
+ for (i=0; i<n; i++) {
+ PyObject *pool = PyTuple_GET_ITEM(lz->pools, i);
+ PyObject *element = PyTuple_GET_ITEM(pool, lz->indices[i]);
+ Py_INCREF(element);
+ PyTuple_SET_ITEM(result, i, element);
+ }
+ Py_CLEAR(lz->result);
+ lz->result = result;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef product_methods[] = {
+ {"__reduce__", (PyCFunction)product_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)product_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(product_doc,
"product(*iterables) --> product object\n\
\n\
@@ -1835,7 +2253,7 @@ static PyTypeObject product_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)product_next, /* tp_iternext */
- 0, /* tp_methods */
+ product_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2022,6 +2440,86 @@ empty:
return NULL;
}
+static PyObject *
+combinations_reduce(combinationsobject *lz)
+{
+ if (lz->result == NULL) {
+ return Py_BuildValue("O(On)", Py_TYPE(lz), lz->pool, lz->r);
+ } else if (lz->stopped) {
+ return Py_BuildValue("O(()n)", Py_TYPE(lz), lz->r);
+ } else {
+ PyObject *indices;
+ Py_ssize_t i;
+
+ /* we must pickle the indices and use them for setstate */
+ indices = PyTuple_New(lz->r);
+ if (!indices)
+ return NULL;
+ for (i=0; i<lz->r; i++)
+ {
+ PyObject* index = PyLong_FromSsize_t(lz->indices[i]);
+ if (!index) {
+ Py_DECREF(indices);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(indices, i, index);
+ }
+
+ return Py_BuildValue("O(On)N", Py_TYPE(lz), lz->pool, lz->r, indices);
+ }
+}
+
+static PyObject *
+combinations_setstate(combinationsobject *lz, PyObject *state)
+{
+ PyObject *result;
+ Py_ssize_t i;
+ Py_ssize_t n = PyTuple_GET_SIZE(lz->pool);
+
+ if (!PyTuple_Check(state) || PyTuple_GET_SIZE(state) != lz->r)
+ {
+ PyErr_SetString(PyExc_ValueError, "invalid arguments");
+ return NULL;
+ }
+
+ for (i=0; i<lz->r; i++)
+ {
+ Py_ssize_t max;
+ PyObject* indexObject = PyTuple_GET_ITEM(state, i);
+ Py_ssize_t index = PyLong_AsSsize_t(indexObject);
+ if (index == -1 && PyErr_Occurred())
+ return NULL; /* not an integer */
+ max = i + n - lz->r;
+ /* clamp the index (beware of negative max) */
+ if (index > max)
+ index = max;
+ if (index < 0)
+ index = 0;
+ lz->indices[i] = index;
+ }
+
+ result = PyTuple_New(lz->r);
+ if (result == NULL)
+ return NULL;
+ for (i=0; i<lz->r; i++) {
+ PyObject *element = PyTuple_GET_ITEM(lz->pool, lz->indices[i]);
+ Py_INCREF(element);
+ PyTuple_SET_ITEM(result, i, element);
+ }
+
+ Py_CLEAR(lz->result);
+ lz->result = result;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef combinations_methods[] = {
+ {"__reduce__", (PyCFunction)combinations_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)combinations_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(combinations_doc,
"combinations(iterable, r) --> combinations object\n\
\n\
@@ -2030,11 +2528,11 @@ combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)");
static PyTypeObject combinations_type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "itertools.combinations", /* tp_name */
+ "itertools.combinations", /* tp_name */
sizeof(combinationsobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- (destructor)combinations_dealloc, /* tp_dealloc */
+ (destructor)combinations_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
@@ -2051,14 +2549,14 @@ static PyTypeObject combinations_type = {
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */
- combinations_doc, /* tp_doc */
- (traverseproc)combinations_traverse, /* tp_traverse */
+ combinations_doc, /* tp_doc */
+ (traverseproc)combinations_traverse,/* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
- (iternextfunc)combinations_next, /* tp_iternext */
- 0, /* tp_methods */
+ (iternextfunc)combinations_next, /* tp_iternext */
+ combinations_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2068,7 +2566,7 @@ static PyTypeObject combinations_type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- combinations_new, /* tp_new */
+ combinations_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
};
@@ -2267,6 +2765,82 @@ empty:
return NULL;
}
+static PyObject *
+cwr_reduce(cwrobject *lz)
+{
+ if (lz->result == NULL) {
+ return Py_BuildValue("O(On)", Py_TYPE(lz), lz->pool, lz->r);
+ } else if (lz->stopped) {
+ return Py_BuildValue("O(()n)", Py_TYPE(lz), lz->r);
+ } else {
+ PyObject *indices;
+ Py_ssize_t i;
+
+ /* we must pickle the indices and use them for setstate */
+ indices = PyTuple_New(lz->r);
+ if (!indices)
+ return NULL;
+ for (i=0; i<lz->r; i++)
+ {
+ PyObject* index = PyLong_FromSsize_t(lz->indices[i]);
+ if (!index) {
+ Py_DECREF(indices);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(indices, i, index);
+ }
+
+ return Py_BuildValue("O(On)N", Py_TYPE(lz), lz->pool, lz->r, indices);
+ }
+}
+
+static PyObject *
+cwr_setstate(cwrobject *lz, PyObject *state)
+{
+ PyObject *result;
+ Py_ssize_t n, i;
+
+ if (!PyTuple_Check(state) || PyTuple_GET_SIZE(state) != lz->r)
+ {
+ PyErr_SetString(PyExc_ValueError, "invalid arguments");
+ return NULL;
+ }
+
+ n = PyTuple_GET_SIZE(lz->pool);
+ for (i=0; i<lz->r; i++)
+ {
+ PyObject* indexObject = PyTuple_GET_ITEM(state, i);
+ Py_ssize_t index = PyLong_AsSsize_t(indexObject);
+ if (index < 0 && PyErr_Occurred())
+ return NULL; /* not an integer */
+ /* clamp the index */
+ if (index < 0)
+ index = 0;
+ else if (index > n-1)
+ index = n-1;
+ lz->indices[i] = index;
+ }
+ result = PyTuple_New(lz->r);
+ if (result == NULL)
+ return NULL;
+ for (i=0; i<lz->r; i++) {
+ PyObject *element = PyTuple_GET_ITEM(lz->pool, lz->indices[i]);
+ Py_INCREF(element);
+ PyTuple_SET_ITEM(result, i, element);
+ }
+ Py_CLEAR(lz->result);
+ lz->result = result;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef cwr_methods[] = {
+ {"__reduce__", (PyCFunction)cwr_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)cwr_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(cwr_doc,
"combinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\
\n\
@@ -2276,11 +2850,11 @@ combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC");
static PyTypeObject cwr_type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "itertools.combinations_with_replacement", /* tp_name */
- sizeof(cwrobject), /* tp_basicsize */
+ "itertools.combinations_with_replacement", /* tp_name */
+ sizeof(cwrobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- (destructor)cwr_dealloc, /* tp_dealloc */
+ (destructor)cwr_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
@@ -2292,19 +2866,19 @@ static PyTypeObject cwr_type = {
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_BASETYPE, /* tp_flags */
- cwr_doc, /* tp_doc */
- (traverseproc)cwr_traverse, /* tp_traverse */
+ Py_TPFLAGS_BASETYPE, /* tp_flags */
+ cwr_doc, /* tp_doc */
+ (traverseproc)cwr_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)cwr_next, /* tp_iternext */
- 0, /* tp_methods */
+ PyObject_SelfIter, /* tp_iter */
+ (iternextfunc)cwr_next, /* tp_iternext */
+ cwr_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2314,8 +2888,8 @@ static PyTypeObject cwr_type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- cwr_new, /* tp_new */
- PyObject_GC_Del, /* tp_free */
+ cwr_new, /* tp_new */
+ PyObject_GC_Del, /* tp_free */
};
@@ -2539,6 +3113,115 @@ empty:
return NULL;
}
+static PyObject *
+permutations_reduce(permutationsobject *po)
+{
+ if (po->result == NULL) {
+ return Py_BuildValue("O(On)", Py_TYPE(po), po->pool, po->r);
+ } else if (po->stopped) {
+ return Py_BuildValue("O(()n)", Py_TYPE(po), po->r);
+ } else {
+ PyObject *indices=NULL, *cycles=NULL;
+ Py_ssize_t n, i;
+
+ /* we must pickle the indices and cycles and use them for setstate */
+ n = PyTuple_GET_SIZE(po->pool);
+ indices = PyTuple_New(n);
+ if (indices == NULL)
+ goto err;
+ for (i=0; i<n; i++){
+ PyObject* index = PyLong_FromSsize_t(po->indices[i]);
+ if (!index)
+ goto err;
+ PyTuple_SET_ITEM(indices, i, index);
+ }
+
+ cycles = PyTuple_New(po->r);
+ if (cycles == NULL)
+ goto err;
+ for (i=0; i<po->r; i++)
+ {
+ PyObject* index = PyLong_FromSsize_t(po->cycles[i]);
+ if (!index)
+ goto err;
+ PyTuple_SET_ITEM(cycles, i, index);
+ }
+ return Py_BuildValue("O(On)(NN)", Py_TYPE(po),
+ po->pool, po->r,
+ indices, cycles);
+ err:
+ Py_XDECREF(indices);
+ Py_XDECREF(cycles);
+ return NULL;
+ }
+}
+
+static PyObject *
+permutations_setstate(permutationsobject *po, PyObject *state)
+{
+ PyObject *indices, *cycles, *result;
+ Py_ssize_t n, i;
+
+ if (!PyArg_ParseTuple(state, "O!O!",
+ &PyTuple_Type, &indices,
+ &PyTuple_Type, &cycles))
+ return NULL;
+
+ n = PyTuple_GET_SIZE(po->pool);
+ if (PyTuple_GET_SIZE(indices) != n ||
+ PyTuple_GET_SIZE(cycles) != po->r)
+ {
+ PyErr_SetString(PyExc_ValueError, "invalid arguments");
+ return NULL;
+ }
+
+ for (i=0; i<n; i++)
+ {
+ PyObject* indexObject = PyTuple_GET_ITEM(indices, i);
+ Py_ssize_t index = PyLong_AsSsize_t(indexObject);
+ if (index < 0 && PyErr_Occurred())
+ return NULL; /* not an integer */
+ /* clamp the index */
+ if (index < 0)
+ index = 0;
+ else if (index > n-1)
+ index = n-1;
+ po->indices[i] = index;
+ }
+
+ for (i=0; i<po->r; i++)
+ {
+ PyObject* indexObject = PyTuple_GET_ITEM(cycles, i);
+ Py_ssize_t index = PyLong_AsSsize_t(indexObject);
+ if (index < 0 && PyErr_Occurred())
+ return NULL; /* not an integer */
+ if (index < 1)
+ index = 1;
+ else if (index > n-i)
+ index = n-i;
+ po->cycles[i] = index;
+ }
+ result = PyTuple_New(po->r);
+ if (result == NULL)
+ return NULL;
+ for (i=0; i<po->r; i++) {
+ PyObject *element = PyTuple_GET_ITEM(po->pool, po->indices[i]);
+ Py_INCREF(element);
+ PyTuple_SET_ITEM(result, i, element);
+ }
+ Py_CLEAR(po->result);
+ po->result = result;
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef permuations_methods[] = {
+ {"__reduce__", (PyCFunction)permutations_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)permutations_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(permutations_doc,
"permutations(iterable[, r]) --> permutations object\n\
\n\
@@ -2575,7 +3258,7 @@ static PyTypeObject permutations_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)permutations_next, /* tp_iternext */
- 0, /* tp_methods */
+ permuations_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2595,6 +3278,7 @@ typedef struct {
PyObject_HEAD
PyObject *total;
PyObject *it;
+ PyObject *binop;
} accumulateobject;
static PyTypeObject accumulate_type;
@@ -2602,12 +3286,14 @@ static PyTypeObject accumulate_type;
static PyObject *
accumulate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- static char *kwargs[] = {"iterable", NULL};
+ static char *kwargs[] = {"iterable", "func", NULL};
PyObject *iterable;
PyObject *it;
+ PyObject *binop = Py_None;
accumulateobject *lz;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:accumulate", kwargs, &iterable))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:accumulate",
+ kwargs, &iterable, &binop))
return NULL;
/* Get iterator. */
@@ -2622,6 +3308,10 @@ accumulate_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
+ if (binop != Py_None) {
+ Py_XINCREF(binop);
+ lz->binop = binop;
+ }
lz->total = NULL;
lz->it = it;
return (PyObject *)lz;
@@ -2631,6 +3321,7 @@ static void
accumulate_dealloc(accumulateobject *lz)
{
PyObject_GC_UnTrack(lz);
+ Py_XDECREF(lz->binop);
Py_XDECREF(lz->total);
Py_XDECREF(lz->it);
Py_TYPE(lz)->tp_free(lz);
@@ -2639,6 +3330,7 @@ accumulate_dealloc(accumulateobject *lz)
static int
accumulate_traverse(accumulateobject *lz, visitproc visit, void *arg)
{
+ Py_VISIT(lz->binop);
Py_VISIT(lz->it);
Py_VISIT(lz->total);
return 0;
@@ -2658,8 +3350,11 @@ accumulate_next(accumulateobject *lz)
lz->total = val;
return lz->total;
}
-
- newtotal = PyNumber_Add(lz->total, val);
+
+ if (lz->binop == NULL)
+ newtotal = PyNumber_Add(lz->total, val);
+ else
+ newtotal = PyObject_CallFunctionObjArgs(lz->binop, lz->total, val, NULL);
Py_DECREF(val);
if (newtotal == NULL)
return NULL;
@@ -2672,10 +3367,35 @@ accumulate_next(accumulateobject *lz)
return newtotal;
}
+static PyObject *
+accumulate_reduce(accumulateobject *lz)
+{
+ return Py_BuildValue("O(OO)O", Py_TYPE(lz),
+ lz->it, lz->binop?lz->binop:Py_None,
+ lz->total?lz->total:Py_None);
+ }
+
+static PyObject *
+accumulate_setstate(accumulateobject *lz, PyObject *state)
+{
+ Py_CLEAR(lz->total);
+ lz->total = state;
+ Py_INCREF(lz->total);
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef accumulate_methods[] = {
+ {"__reduce__", (PyCFunction)accumulate_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)accumulate_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(accumulate_doc,
-"accumulate(iterable) --> accumulate object\n\
+"accumulate(iterable[, func]) --> accumulate object\n\
\n\
-Return series of accumulated sums.");
+Return series of accumulated sums (or other binary function results).");
static PyTypeObject accumulate_type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -2707,7 +3427,7 @@ static PyTypeObject accumulate_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)accumulate_next, /* tp_iternext */
- 0, /* tp_methods */
+ accumulate_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2819,11 +3539,24 @@ compress_next(compressobject *lz)
if (ok == 1)
return datum;
Py_DECREF(datum);
- if (ok == -1)
+ if (ok < 0)
return NULL;
}
}
+static PyObject *
+compress_reduce(compressobject *lz)
+{
+ return Py_BuildValue("O(OO)", Py_TYPE(lz),
+ lz->data, lz->selectors);
+ }
+
+static PyMethodDef compress_methods[] = {
+ {"__reduce__", (PyCFunction)compress_reduce, METH_NOARGS,
+ reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(compress_doc,
"compress(data, selectors) --> iterator over selected data\n\
\n\
@@ -2861,7 +3594,7 @@ static PyTypeObject compress_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)compress_next, /* tp_iternext */
- 0, /* tp_methods */
+ compress_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -2970,6 +3703,19 @@ filterfalse_next(filterfalseobject *lz)
}
}
+static PyObject *
+filterfalse_reduce(filterfalseobject *lz)
+{
+ return Py_BuildValue("O(OO)", Py_TYPE(lz),
+ lz->func, lz->it);
+ }
+
+static PyMethodDef filterfalse_methods[] = {
+ {"__reduce__", (PyCFunction)filterfalse_reduce, METH_NOARGS,
+ reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(filterfalse_doc,
"filterfalse(function or None, sequence) --> filterfalse object\n\
\n\
@@ -3006,7 +3752,7 @@ static PyTypeObject filterfalse_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)filterfalse_next, /* tp_iternext */
- 0, /* tp_methods */
+ filterfalse_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -3200,11 +3946,9 @@ count_reduce(countobject *lz)
return Py_BuildValue("O(n)", Py_TYPE(lz), lz->cnt);
}
-PyDoc_STRVAR(count_reduce_doc, "Return state information for pickling.");
-
static PyMethodDef count_methods[] = {
{"__reduce__", (PyCFunction)count_reduce, METH_NOARGS,
- count_reduce_doc},
+ reduce_doc},
{NULL, NULL} /* sentinel */
};
@@ -3345,8 +4089,21 @@ repeat_len(repeatobject *ro)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+repeat_reduce(repeatobject *ro)
+{
+ /* unpickle this so that a new repeat iterator is constructed with an
+ * object, then call __setstate__ on it to set cnt
+ */
+ if (ro->cnt >= 0)
+ return Py_BuildValue("O(On)", Py_TYPE(ro), ro->element, ro->cnt);
+ else
+ return Py_BuildValue("O(O)", Py_TYPE(ro), ro->element);
+}
+
static PyMethodDef repeat_methods[] = {
{"__length_hint__", (PyCFunction)repeat_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)repeat_reduce, METH_NOARGS, reduce_doc},
{NULL, NULL} /* sentinel */
};
@@ -3572,6 +4329,49 @@ zip_longest_next(ziplongestobject *lz)
return result;
}
+static PyObject *
+zip_longest_reduce(ziplongestobject *lz)
+{
+
+ /* Create a new tuple with empty sequences where appropriate to pickle.
+ * Then use setstate to set the fillvalue
+ */
+ int i;
+ PyObject *args = PyTuple_New(PyTuple_GET_SIZE(lz->ittuple));
+ if (args == NULL)
+ return NULL;
+ for (i=0; i<PyTuple_GET_SIZE(lz->ittuple); i++) {
+ PyObject *elem = PyTuple_GET_ITEM(lz->ittuple, i);
+ if (elem == NULL) {
+ elem = PyTuple_New(0);
+ if (elem == NULL) {
+ Py_DECREF(args);
+ return NULL;
+ }
+ } else
+ Py_INCREF(elem);
+ PyTuple_SET_ITEM(args, i, elem);
+ }
+ return Py_BuildValue("ONO", Py_TYPE(lz), args, lz->fillvalue);
+}
+
+static PyObject *
+zip_longest_setstate(ziplongestobject *lz, PyObject *state)
+{
+ Py_CLEAR(lz->fillvalue);
+ lz->fillvalue = state;
+ Py_INCREF(lz->fillvalue);
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef zip_longest_methods[] = {
+ {"__reduce__", (PyCFunction)zip_longest_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)zip_longest_setstate, METH_O,
+ setstate_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(zip_longest_doc,
"zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n\
\n\
@@ -3613,7 +4413,7 @@ static PyTypeObject ziplongest_type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)zip_longest_next, /* tp_iternext */
- 0, /* tp_methods */
+ zip_longest_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -3638,7 +4438,7 @@ cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\
repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times\n\
\n\
Iterators terminating on the shortest input sequence:\n\
-accumulate(p, start=0) --> p0, p0+p1, p0+p1+p2\n\
+accumulate(p[, func]) --> p0, p0+p1, p0+p1+p2\n\
chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... \n\
compress(data, selectors) --> (d[0] if s[0]), (d[1] if s[1]), ...\n\
dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails\n\
@@ -3701,6 +4501,9 @@ PyInit_itertools(void)
&product_type,
&repeat_type,
&groupby_type,
+ &_grouper_type,
+ &tee_type,
+ &teedataobject_type,
NULL
};
@@ -3718,11 +4521,5 @@ PyInit_itertools(void)
PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);
}
- if (PyType_Ready(&teedataobject_type) < 0)
- return NULL;
- if (PyType_Ready(&tee_type) < 0)
- return NULL;
- if (PyType_Ready(&_grouper_type) < 0)
- return NULL;
return m;
}
diff --git a/Modules/main.c b/Modules/main.c
index 5d1d896..a16ce65 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -6,6 +6,7 @@
#include <locale.h>
#ifdef __VMS
+#error "PEP 11: VMS is now unsupported, code will be removed in Python 3.4"
#include <unixlib.h>
#endif
@@ -72,9 +73,6 @@ static char *usage_2 = "\
-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
-OO : remove doc-strings in addition to the -O optimizations\n\
-q : don't print version and copyright messages on interactive startup\n\
--R : use a pseudo-random salt to make hash() values of various types be\n\
- unpredictable between separate invocations of the interpreter, as\n\
- a defence against denial-of-service attacks\n\
-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
-S : don't imply 'import site' on initialization\n\
";
@@ -102,13 +100,14 @@ static char *usage_5 =
"PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n"
" The default module search path uses %s.\n"
"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
-"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
+"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
+"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n\
";
static char *usage_6 = "\
-PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\
- as specifying the -R option: a random value is used to seed the hashes of\n\
- str, bytes and datetime objects. It can also be set to an integer\n\
- in the range [0,4294967295] to get hash values with a predictable seed.\n\
+PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n\
+ to seed the hashes of str, bytes and datetime objects. It can also be\n\
+ set to an integer in the range [0,4294967295] to get hash values with a\n\
+ predictable seed.\n\
";
static int
@@ -225,7 +224,7 @@ RunMainFromImporter(wchar_t *filename)
if (importer == NULL)
goto error;
- if (importer->ob_type == &PyNullImporter_Type) {
+ if (importer == Py_None) {
Py_DECREF(argv0);
Py_DECREF(importer);
return -1;
@@ -345,21 +344,13 @@ Py_Main(int argc, wchar_t **argv)
not interpreter options. */
break;
}
- switch (c) {
- case 'E':
+ if (c == 'E') {
Py_IgnoreEnvironmentFlag++;
break;
- case 'R':
- Py_HashRandomizationFlag++;
- break;
}
}
- /* The variable is only tested for existence here; _PyRandom_Init will
- check its value further. */
- if (!Py_HashRandomizationFlag &&
- (p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
- Py_HashRandomizationFlag = 1;
+ Py_HashRandomizationFlag = 1;
_PyRandom_Init();
PySys_ResetWarnOptions();
@@ -466,7 +457,7 @@ Py_Main(int argc, wchar_t **argv)
break;
case 'R':
- /* Already handled above */
+ /* Ignored */
break;
/* This space reserved for other options */
@@ -533,16 +524,13 @@ Py_Main(int argc, wchar_t **argv)
/* Use utf-8 on Mac OS X */
unicode = PyUnicode_FromString(p);
#else
- wchar_t *wchar;
- size_t len;
- wchar = _Py_char2wchar(p, &len);
- if (wchar == NULL)
- continue;
- unicode = PyUnicode_FromWideChar(wchar, len);
- PyMem_Free(wchar);
+ unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
#endif
- if (unicode == NULL)
+ if (unicode == NULL) {
+ /* ignore errors */
+ PyErr_Clear();
continue;
+ }
PySys_AddWarnOptionUnicode(unicode);
Py_DECREF(unicode);
}
@@ -617,7 +605,6 @@ Py_Main(int argc, wchar_t **argv)
if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
wchar_t* buffer;
size_t len = strlen(p) + 1;
- size_t r;
buffer = malloc(len * sizeof(wchar_t));
if (buffer == NULL) {
@@ -625,11 +612,33 @@ Py_Main(int argc, wchar_t **argv)
"not enough memory to copy PYTHONEXECUTABLE");
}
- r = mbstowcs(buffer, p, len);
+ mbstowcs(buffer, p, len);
Py_SetProgramName(buffer);
/* buffer is now handed off - do not free */
} else {
+#ifdef WITH_NEXT_FRAMEWORK
+ char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
+
+ if (pyvenv_launcher && *pyvenv_launcher) {
+ /* Used by Mac/Tools/pythonw.c to forward
+ * the argv0 of the stub executable
+ */
+ wchar_t* wbuf = _Py_char2wchar(pyvenv_launcher, NULL);
+
+ if (wbuf == NULL) {
+ Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
+ }
+ Py_SetProgramName(wbuf);
+
+ /* Don't free wbuf, the argument to Py_SetProgramName
+ * must remain valid until the Py_Finalize is called.
+ */
+ } else {
+ Py_SetProgramName(argv[0]);
+ }
+#else
Py_SetProgramName(argv[0]);
+#endif
}
#else
Py_SetProgramName(argv[0]);
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 142eca4..3fa52d0 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -55,11 +55,6 @@ raised for division by zero and mod by zero.
#include "Python.h"
#include "_math.h"
-#ifdef _OSF_SOURCE
-/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
-extern double copysign(double, double);
-#endif
-
/*
sin(pi*x), giving accurate results for all finite x (especially x
integral or close to an integer). This is here for use in the
@@ -244,7 +239,8 @@ m_tgamma(double x)
}
if (x == 0.0) {
errno = EDOM;
- return 1.0/x; /* tgamma(+-0.0) = +-inf, divide-by-zero */
+ /* tgamma(+-0.0) = +-inf, divide-by-zero */
+ return copysign(Py_HUGE_VAL, x);
}
/* integer arguments */
@@ -582,6 +578,61 @@ m_log(double x)
}
}
+/*
+ log2: log to base 2.
+
+ Uses an algorithm that should:
+
+ (a) produce exact results for powers of 2, and
+ (b) give a monotonic log2 (for positive finite floats),
+ assuming that the system log is monotonic.
+*/
+
+static double
+m_log2(double x)
+{
+ if (!Py_IS_FINITE(x)) {
+ if (Py_IS_NAN(x))
+ return x; /* log2(nan) = nan */
+ else if (x > 0.0)
+ return x; /* log2(+inf) = +inf */
+ else {
+ errno = EDOM;
+ return Py_NAN; /* log2(-inf) = nan, invalid-operation */
+ }
+ }
+
+ if (x > 0.0) {
+#ifdef HAVE_LOG2
+ return log2(x);
+#else
+ double m;
+ int e;
+ m = frexp(x, &e);
+ /* We want log2(m * 2**e) == log(m) / log(2) + e. Care is needed when
+ * x is just greater than 1.0: in that case e is 1, log(m) is negative,
+ * and we get significant cancellation error from the addition of
+ * log(m) / log(2) to e. The slight rewrite of the expression below
+ * avoids this problem.
+ */
+ if (x >= 1.0) {
+ return log(2.0 * m) / log(2.0) + (e - 1);
+ }
+ else {
+ return log(m) / log(2.0) + e;
+ }
+#endif
+ }
+ else if (x == 0.0) {
+ errno = EDOM;
+ return -Py_HUGE_VAL; /* log2(0) = -inf, divide-by-zero */
+ }
+ else {
+ errno = EDOM;
+ return Py_NAN; /* log2(-inf) = nan, invalid-operation */
+ }
+}
+
static double
m_log10(double x)
{
@@ -836,10 +887,10 @@ FUNC1(atanh, m_atanh, 0,
"atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
static PyObject * math_ceil(PyObject *self, PyObject *number) {
- static PyObject *ceil_str = NULL;
+ _Py_IDENTIFIER(__ceil__);
PyObject *method, *result;
- method = _PyObject_LookupSpecial(number, "__ceil__", &ceil_str);
+ method = _PyObject_LookupSpecial(number, &PyId___ceil__);
if (method == NULL) {
if (PyErr_Occurred())
return NULL;
@@ -874,10 +925,10 @@ FUNC1(fabs, fabs, 0,
"fabs(x)\n\nReturn the absolute value of the float x.")
static PyObject * math_floor(PyObject *self, PyObject *number) {
- static PyObject *floor_str = NULL;
+ _Py_IDENTIFIER(__floor__);
PyObject *method, *result;
- method = _PyObject_LookupSpecial(number, "__floor__", &floor_str);
+ method = _PyObject_LookupSpecial(number, &PyId___floor__);
if (method == NULL) {
if (PyErr_Occurred())
return NULL;
@@ -1383,7 +1434,7 @@ math_factorial(PyObject *self, PyObject *arg)
}
/* use lookup table if x is small */
- if (x < (long)(sizeof(SmallFactorials)/sizeof(SmallFactorials[0])))
+ if (x < (long)Py_ARRAY_LENGTH(SmallFactorials))
return PyLong_FromUnsignedLong(SmallFactorials[x]);
/* else express in the form odd_part * 2**two_valuation, and compute as
@@ -1410,7 +1461,7 @@ PyDoc_STRVAR(math_factorial_doc,
static PyObject *
math_trunc(PyObject *self, PyObject *number)
{
- static PyObject *trunc_str = NULL;
+ _Py_IDENTIFIER(__trunc__);
PyObject *trunc, *result;
if (Py_TYPE(number)->tp_dict == NULL) {
@@ -1418,7 +1469,7 @@ math_trunc(PyObject *self, PyObject *number)
return NULL;
}
- trunc = _PyObject_LookupSpecial(number, "__trunc__", &trunc_str);
+ trunc = _PyObject_LookupSpecial(number, &PyId___trunc__);
if (trunc == NULL) {
if (!PyErr_Occurred())
PyErr_Format(PyExc_TypeError,
@@ -1627,6 +1678,15 @@ Return the logarithm of x to the given base.\n\
If the base not specified, returns the natural logarithm (base e) of x.");
static PyObject *
+math_log2(PyObject *self, PyObject *arg)
+{
+ return loghelper(arg, m_log2, "log2");
+}
+
+PyDoc_STRVAR(math_log2_doc,
+"log2(x)\n\nReturn the base 2 logarithm of x.");
+
+static PyObject *
math_log10(PyObject *self, PyObject *arg)
{
return loghelper(arg, m_log10, "log10");
@@ -1898,6 +1958,7 @@ static PyMethodDef math_methods[] = {
{"log", math_log, METH_VARARGS, math_log_doc},
{"log1p", math_log1p, METH_O, math_log1p_doc},
{"log10", math_log10, METH_O, math_log10_doc},
+ {"log2", math_log2, METH_O, math_log2_doc},
{"modf", math_modf, METH_O, math_modf_doc},
{"pow", math_pow, METH_VARARGS, math_pow_doc},
{"radians", math_radians, METH_O, math_radians_doc},
diff --git a/Modules/md5module.c b/Modules/md5module.c
index 208930d..e2681a8 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -210,7 +210,8 @@ static void md5_compress(struct md5_state *md5, unsigned char *buf)
Initialize the hash state
@param sha1 The hash state you wish to initialize
*/
-void md5_init(struct md5_state *md5)
+static void
+md5_init(struct md5_state *md5)
{
assert(md5 != NULL);
md5->state[0] = 0x67452301UL;
@@ -227,8 +228,8 @@ void md5_init(struct md5_state *md5)
@param in The data to hash
@param inlen The length of the data (octets)
*/
-void md5_process(struct md5_state *md5,
- const unsigned char *in, Py_ssize_t inlen)
+static void
+md5_process(struct md5_state *md5, const unsigned char *in, Py_ssize_t inlen)
{
Py_ssize_t n;
@@ -243,7 +244,7 @@ void md5_process(struct md5_state *md5,
in += MD5_BLOCKSIZE;
inlen -= MD5_BLOCKSIZE;
} else {
- n = MIN(inlen, (MD5_BLOCKSIZE - md5->curlen));
+ n = MIN(inlen, (Py_ssize_t)(MD5_BLOCKSIZE - md5->curlen));
memcpy(md5->buf + md5->curlen, in, (size_t)n);
md5->curlen += n;
in += n;
@@ -262,7 +263,8 @@ void md5_process(struct md5_state *md5,
@param sha1 The hash state
@param out [out] The destination of the hash (16 bytes)
*/
-void md5_done(struct md5_state *md5, unsigned char *out)
+static void
+md5_done(struct md5_state *md5, unsigned char *out)
{
int i;
@@ -376,7 +378,7 @@ MD5_hexdigest(MD5object *self, PyObject *unused)
unsigned char digest[MD5_DIGESTSIZE];
struct md5_state temp;
PyObject *retval;
- Py_UNICODE *hex_digest;
+ Py_UCS1 *hex_digest;
int i, j;
/* Get the raw (binary) digest value */
@@ -384,25 +386,20 @@ MD5_hexdigest(MD5object *self, PyObject *unused)
md5_done(&temp, digest);
/* Create a new string */
- retval = PyUnicode_FromStringAndSize(NULL, MD5_DIGESTSIZE * 2);
+ retval = PyUnicode_New(MD5_DIGESTSIZE * 2, 127);
if (!retval)
return NULL;
- hex_digest = PyUnicode_AS_UNICODE(retval);
- if (!hex_digest) {
- Py_DECREF(retval);
- return NULL;
- }
+ hex_digest = PyUnicode_1BYTE_DATA(retval);
/* Make hex version of the digest */
for(i=j=0; i<MD5_DIGESTSIZE; i++) {
- char c;
+ unsigned char c;
c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
}
+ assert(_PyUnicode_CheckConsistency(retval, 1));
return retval;
}
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 33c143e..d650eae 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -78,8 +78,6 @@ my_getpagesize(void)
# define MAP_ANONYMOUS MAP_ANON
#endif
-static PyObject *mmap_module_error;
-
typedef enum
{
ACCESS_DEFAULT,
@@ -240,15 +238,37 @@ mmap_read_line_method(mmap_object *self,
return result;
}
+/* Basically the "n" format code with the ability to turn None into -1. */
+static int
+mmap_convert_ssize_t(PyObject *obj, void *result) {
+ Py_ssize_t limit;
+ if (obj == Py_None) {
+ limit = -1;
+ }
+ else if (PyNumber_Check(obj)) {
+ limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
+ if (limit == -1 && PyErr_Occurred())
+ return 0;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "integer argument expected, got '%.200s'",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+ }
+ *((Py_ssize_t *)result) = limit;
+ return 1;
+}
+
static PyObject *
mmap_read_method(mmap_object *self,
PyObject *args)
{
- Py_ssize_t num_bytes, n;
+ Py_ssize_t num_bytes = -1, n;
PyObject *result;
CHECK_VALID(NULL);
- if (!PyArg_ParseTuple(args, "n:read", &num_bytes))
+ if (!PyArg_ParseTuple(args, "|O&:read", mmap_convert_ssize_t, &num_bytes))
return(NULL);
/* silently 'adjust' out-of-range requests */
@@ -437,7 +457,7 @@ mmap_size_method(mmap_object *self,
{
struct stat buf;
if (-1 == fstat(self->fd, &buf)) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
#ifdef HAVE_LARGEFILE_SUPPORT
@@ -527,7 +547,7 @@ mmap_resize_method(mmap_object *self,
void *newmap;
if (ftruncate(self->fd, self->offset + new_size) == -1) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -542,7 +562,7 @@ mmap_resize_method(mmap_object *self,
#endif
if (newmap == (void *)-1)
{
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
self->data = newmap;
@@ -583,7 +603,7 @@ mmap_flush_method(mmap_object *self, PyObject *args)
/* XXX semantics of return value? */
/* XXX flags for msync? */
if (-1 == msync(self->data + offset, size, MS_SYNC)) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
return PyLong_FromLong(0);
@@ -645,9 +665,9 @@ mmap_move_method(mmap_object *self, PyObject *args)
return NULL;
} else {
/* bounds check the values */
- if (cnt < 0 || (cnt + dest) < cnt || (cnt + src) < cnt ||
- src < 0 || src > self->size || (src + cnt) > self->size ||
- dest < 0 || dest > self->size || (dest + cnt) > self->size) {
+ if ((cnt + dest) < cnt || (cnt + src) < cnt ||
+ src > self->size || (src + cnt) > self->size ||
+ dest > self->size || (dest + cnt) > self->size) {
PyErr_SetString(PyExc_ValueError,
"source, destination, or count out of range");
return NULL;
@@ -680,7 +700,9 @@ mmap__enter__method(mmap_object *self, PyObject *args)
static PyObject *
mmap__exit__method(PyObject *self, PyObject *args)
{
- return PyObject_CallMethod(self, "close", NULL);
+ _Py_IDENTIFIER(close);
+
+ return _PyObject_CallMethodId(self, &PyId_close, NULL);
}
static struct PyMethodDef mmap_object_methods[] = {
@@ -937,13 +959,13 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
}
static PySequenceMethods mmap_as_sequence = {
- (lenfunc)mmap_length, /*sq_length*/
- (binaryfunc)mmap_concat, /*sq_concat*/
- (ssizeargfunc)mmap_repeat, /*sq_repeat*/
- (ssizeargfunc)mmap_item, /*sq_item*/
- 0, /*sq_slice*/
- (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/
- 0, /*sq_ass_slice*/
+ (lenfunc)mmap_length, /*sq_length*/
+ (binaryfunc)mmap_concat, /*sq_concat*/
+ (ssizeargfunc)mmap_repeat, /*sq_repeat*/
+ (ssizeargfunc)mmap_item, /*sq_item*/
+ 0, /*sq_slice*/
+ (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/
+ 0, /*sq_ass_slice*/
};
static PyMappingMethods mmap_as_mapping = {
@@ -1005,7 +1027,7 @@ static PyTypeObject mmap_object_type = {
PyObject_GenericGetAttr, /*tp_getattro*/
0, /*tp_setattro*/
&mmap_as_buffer, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
mmap_doc, /*tp_doc*/
0, /* tp_traverse */
0, /* tp_clear */
@@ -1021,10 +1043,10 @@ static PyTypeObject mmap_object_type = {
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
- 0, /* tp_init */
+ 0, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
new_mmap_object, /* tp_new */
- PyObject_Del, /* tp_free */
+ PyObject_Del, /* tp_free */
};
@@ -1075,8 +1097,8 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
int devzero = -1;
int access = (int)ACCESS_DEFAULT;
static char *keywords[] = {"fileno", "length",
- "flags", "prot",
- "access", "offset", NULL};
+ "flags", "prot",
+ "access", "offset", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|iii" _Py_PARSE_OFF_T, keywords,
&fd, &map_size_obj, &flags, &prot,
@@ -1186,7 +1208,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
fd = devzero = open("/dev/zero", O_RDWR);
if (devzero == -1) {
Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
#endif
@@ -1194,7 +1216,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
m_obj->fd = dup(fd);
if (m_obj->fd == -1) {
Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
}
@@ -1210,7 +1232,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
if (m_obj->data == (char *)-1) {
m_obj->data = NULL;
Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
m_obj->access = (access_mode)access;
@@ -1243,8 +1265,8 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
int access = (access_mode)ACCESS_DEFAULT;
DWORD flProtect, dwDesiredAccess;
static char *keywords[] = { "fileno", "length",
- "tagname",
- "access", "offset", NULL };
+ "tagname",
+ "access", "offset", NULL };
if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|ziL", keywords,
&fileno, &map_size_obj,
@@ -1291,12 +1313,12 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
if (fileno != -1 && fileno != 0) {
/* Ensure that fileno is within the CRT's valid range */
if (_PyVerify_fd(fileno) == 0) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
fh = (HANDLE)_get_osfhandle(fileno);
if (fh==(HANDLE)-1) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
/* Win9x appears to need us seeked to zero */
@@ -1456,11 +1478,7 @@ PyInit_mmap(void)
dict = PyModule_GetDict(module);
if (!dict)
return NULL;
- mmap_module_error = PyErr_NewException("mmap.error",
- PyExc_EnvironmentError , NULL);
- if (mmap_module_error == NULL)
- return NULL;
- PyDict_SetItemString(dict, "error", mmap_module_error);
+ PyDict_SetItemString(dict, "error", PyExc_OSError);
PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type);
#ifdef PROT_EXEC
setint(dict, "PROT_EXEC", PROT_EXEC);
diff --git a/Modules/nismodule.c b/Modules/nismodule.c
index a81ca8c..0af495f 100644
--- a/Modules/nismodule.c
+++ b/Modules/nismodule.c
@@ -411,7 +411,7 @@ nis_maps (PyObject *self, PyObject *args, PyObject *kwdict)
return NULL;
if ((list = PyList_New(0)) == NULL)
return NULL;
- for (maps = maps; maps; maps = maps->next) {
+ for (; maps; maps = maps->next) {
PyObject *str = PyUnicode_FromString(maps->map);
if (!str || PyList_Append(list, str) < 0)
{
diff --git a/Modules/operator.c b/Modules/operator.c
index 866ec3a..12fdad5 100644
--- a/Modules/operator.c
+++ b/Modules/operator.c
@@ -159,6 +159,143 @@ is_not(PyObject *s, PyObject *a)
#undef spam2
#undef spam1o
#undef spam1o
+
+/* compare_digest **********************************************************/
+
+/*
+ * timing safe compare
+ *
+ * Returns 1 of the strings are equal.
+ * In case of len(a) != len(b) the function tries to keep the timing
+ * dependent on the length of b. CPU cache locally may still alter timing
+ * a bit.
+ */
+static int
+_tscmp(const unsigned char *a, const unsigned char *b,
+ Py_ssize_t len_a, Py_ssize_t len_b)
+{
+ /* The volatile type declarations make sure that the compiler has no
+ * chance to optimize and fold the code in any way that may change
+ * the timing.
+ */
+ volatile Py_ssize_t length;
+ volatile const unsigned char *left;
+ volatile const unsigned char *right;
+ Py_ssize_t i;
+ unsigned char result;
+
+ /* loop count depends on length of b */
+ length = len_b;
+ left = NULL;
+ right = b;
+
+ /* don't use else here to keep the amount of CPU instructions constant,
+ * volatile forces re-evaluation
+ * */
+ if (len_a == length) {
+ left = *((volatile const unsigned char**)&a);
+ result = 0;
+ }
+ if (len_a != length) {
+ left = b;
+ result = 1;
+ }
+
+ for (i=0; i < length; i++) {
+ result |= *left++ ^ *right++;
+ }
+
+ return (result == 0);
+}
+
+PyDoc_STRVAR(compare_digest__doc__,
+"compare_digest(a, b) -> bool\n"
+"\n"
+"Return 'a == b'. This function uses an approach designed to prevent\n"
+"timing analysis, making it appropriate for cryptography.\n"
+"a and b must both be of the same type: either str (ASCII only),\n"
+"or any type that supports the buffer protocol (e.g. bytes).\n"
+"\n"
+"Note: If a and b are of different lengths, or if an error occurs,\n"
+"a timing attack could theoretically reveal information about the\n"
+"types and lengths of a and b--but not their values.\n");
+
+static PyObject*
+compare_digest(PyObject *self, PyObject *args)
+{
+ PyObject *a, *b;
+ int rc;
+
+ if (!PyArg_ParseTuple(args, "OO:compare_digest", &a, &b)) {
+ return NULL;
+ }
+
+ /* ASCII unicode string */
+ if(PyUnicode_Check(a) && PyUnicode_Check(b)) {
+ if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) {
+ return NULL;
+ }
+ if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) {
+ PyErr_SetString(PyExc_TypeError,
+ "comparing strings with non-ASCII characters is "
+ "not supported");
+ return NULL;
+ }
+
+ rc = _tscmp(PyUnicode_DATA(a),
+ PyUnicode_DATA(b),
+ PyUnicode_GET_LENGTH(a),
+ PyUnicode_GET_LENGTH(b));
+ }
+ /* fallback to buffer interface for bytes, bytesarray and other */
+ else {
+ Py_buffer view_a;
+ Py_buffer view_b;
+
+ if ((PyObject_CheckBuffer(a) == 0) & (PyObject_CheckBuffer(b) == 0)) {
+ PyErr_Format(PyExc_TypeError,
+ "unsupported operand types(s) or combination of types: "
+ "'%.100s' and '%.100s'",
+ Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
+ return NULL;
+ }
+
+ if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) {
+ return NULL;
+ }
+ if (view_a.ndim > 1) {
+ PyErr_SetString(PyExc_BufferError,
+ "Buffer must be single dimension");
+ PyBuffer_Release(&view_a);
+ return NULL;
+ }
+
+ if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) {
+ PyBuffer_Release(&view_a);
+ return NULL;
+ }
+ if (view_b.ndim > 1) {
+ PyErr_SetString(PyExc_BufferError,
+ "Buffer must be single dimension");
+ PyBuffer_Release(&view_a);
+ PyBuffer_Release(&view_b);
+ return NULL;
+ }
+
+ rc = _tscmp((const unsigned char*)view_a.buf,
+ (const unsigned char*)view_b.buf,
+ view_a.len,
+ view_b.len);
+
+ PyBuffer_Release(&view_a);
+ PyBuffer_Release(&view_b);
+ }
+
+ return PyBool_FromLong(rc);
+}
+
+/* operator methods **********************************************************/
+
#define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)},
#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \
{#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},
@@ -227,6 +364,8 @@ spam2(ne,__ne__, "ne(a, b) -- Same as a!=b.")
spam2(gt,__gt__, "gt(a, b) -- Same as a>b.")
spam2(ge,__ge__, "ge(a, b) -- Same as a>=b.")
+ {"_compare_digest", (PyCFunction)compare_digest, METH_VARARGS,
+ compare_digest__doc__},
{NULL, NULL} /* sentinel */
};
@@ -402,7 +541,8 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
for (idx = 0; idx < nattrs; ++idx) {
PyObject *item = PyTuple_GET_ITEM(args, idx);
Py_ssize_t item_len;
- Py_UNICODE *item_buffer;
+ void *data;
+ unsigned int kind;
int dot_count;
if (!PyUnicode_Check(item)) {
@@ -411,13 +551,18 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF(attr);
return NULL;
}
- item_len = PyUnicode_GET_SIZE(item);
- item_buffer = PyUnicode_AS_UNICODE(item);
+ if (PyUnicode_READY(item)) {
+ Py_DECREF(attr);
+ return NULL;
+ }
+ item_len = PyUnicode_GET_LENGTH(item);
+ kind = PyUnicode_KIND(item);
+ data = PyUnicode_DATA(item);
/* check whethere the string is dotted */
dot_count = 0;
for (char_idx = 0; char_idx < item_len; ++char_idx) {
- if (item_buffer[char_idx] == (Py_UNICODE)'.')
+ if (PyUnicode_READ(kind, data, char_idx) == '.')
++dot_count;
}
@@ -438,12 +583,12 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
for (; dot_count > 0; --dot_count) {
- while (item_buffer[unibuff_till] != (Py_UNICODE)'.') {
+ while (PyUnicode_READ(kind, data, unibuff_till) != '.') {
++unibuff_till;
}
- attr_chain_item = PyUnicode_FromUnicode(
- item_buffer + unibuff_from,
- unibuff_till - unibuff_from);
+ attr_chain_item = PyUnicode_Substring(item,
+ unibuff_from,
+ unibuff_till);
if (attr_chain_item == NULL) {
Py_DECREF(attr_chain);
Py_DECREF(attr);
@@ -456,9 +601,8 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
/* now add the last dotless name */
- attr_chain_item = PyUnicode_FromUnicode(
- item_buffer + unibuff_from,
- item_len - unibuff_from);
+ attr_chain_item = PyUnicode_Substring(item,
+ unibuff_from, item_len);
if (attr_chain_item == NULL) {
Py_DECREF(attr_chain);
Py_DECREF(attr);
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index b38ce52..a17a647 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -214,6 +214,21 @@ oss_mixer_dealloc(oss_mixer_t *self)
* Helper functions
*/
+/* Check if a given file descriptor is valid (i.e. hasn't been closed).
+ * If true, return 1. Otherwise, raise ValueError and return 0.
+ */
+static int _is_fd_valid(int fd)
+{
+ /* the FD is set to -1 in oss_close()/oss_mixer_close() */
+ if (fd >= 0) {
+ return 1;
+ } else {
+ PyErr_SetString(PyExc_ValueError,
+ "Operation on closed OSS device.");
+ return 0;
+ }
+}
+
/* _do_ioctl_1() is a private helper function used for the OSS ioctls --
SNDCTL_DSP_{SETFMT,CHANNELS,SPEED} -- that that are called from C
like this:
@@ -301,6 +316,9 @@ _do_ioctl_0(int fd, PyObject *args, char *fname, int cmd)
static PyObject *
oss_nonblock(oss_audio_t *self, PyObject *unused)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
/* Hmmm: it doesn't appear to be possible to return to blocking
mode once we're in non-blocking mode! */
if (ioctl(self->fd, SNDCTL_DSP_NONBLOCK, NULL) == -1)
@@ -312,6 +330,9 @@ oss_nonblock(oss_audio_t *self, PyObject *unused)
static PyObject *
oss_setfmt(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1(self->fd, args, "setfmt", SNDCTL_DSP_SETFMT);
}
@@ -319,6 +340,10 @@ static PyObject *
oss_getfmts(oss_audio_t *self, PyObject *unused)
{
int mask;
+
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (ioctl(self->fd, SNDCTL_DSP_GETFMTS, &mask) == -1)
return PyErr_SetFromErrno(PyExc_IOError);
return PyLong_FromLong(mask);
@@ -327,30 +352,45 @@ oss_getfmts(oss_audio_t *self, PyObject *unused)
static PyObject *
oss_channels(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1(self->fd, args, "channels", SNDCTL_DSP_CHANNELS);
}
static PyObject *
oss_speed(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1(self->fd, args, "speed", SNDCTL_DSP_SPEED);
}
static PyObject *
oss_sync(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_0(self->fd, args, "sync", SNDCTL_DSP_SYNC);
}
static PyObject *
oss_reset(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_0(self->fd, args, "reset", SNDCTL_DSP_RESET);
}
static PyObject *
oss_post(oss_audio_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_0(self->fd, args, "post", SNDCTL_DSP_POST);
}
@@ -365,6 +405,9 @@ oss_read(oss_audio_t *self, PyObject *args)
char *cp;
PyObject *rv;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (!PyArg_ParseTuple(args, "i:read", &size))
return NULL;
rv = PyBytes_FromStringAndSize(NULL, size);
@@ -392,6 +435,9 @@ oss_write(oss_audio_t *self, PyObject *args)
char *cp;
int rv, size;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (!PyArg_ParseTuple(args, "y#:write", &cp, &size)) {
return NULL;
}
@@ -423,6 +469,9 @@ oss_writeall(oss_audio_t *self, PyObject *args)
mode, the behaviour of write() and writeall() from Python is
indistinguishable. */
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (!PyArg_ParseTuple(args, "y#:write", &cp, &size))
return NULL;
@@ -482,10 +531,12 @@ oss_self(PyObject *self, PyObject *unused)
return self;
}
-static PyObject *
+static PyObject *
oss_exit(PyObject *self, PyObject *unused)
{
- PyObject *ret = PyObject_CallMethod(self, "close", NULL);
+ _Py_IDENTIFIER(close);
+
+ PyObject *ret = _PyObject_CallMethodId(self, &PyId_close, NULL);
if (!ret)
return NULL;
Py_DECREF(ret);
@@ -495,6 +546,9 @@ oss_exit(PyObject *self, PyObject *unused)
static PyObject *
oss_fileno(oss_audio_t *self, PyObject *unused)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return PyLong_FromLong(self->fd);
}
@@ -509,6 +563,9 @@ oss_setparameters(oss_audio_t *self, PyObject *args)
int fmt, channels, rate;
PyObject * rv; /* return tuple (fmt, channels, rate) */
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (!PyArg_ParseTuple(args, "iii|i:setparameters",
&wanted_fmt, &wanted_channels, &wanted_rate,
&strict))
@@ -599,6 +656,9 @@ oss_bufsize(oss_audio_t *self, PyObject *unused)
audio_buf_info ai;
int nchannels=0, ssize=0;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
@@ -618,6 +678,9 @@ oss_obufcount(oss_audio_t *self, PyObject *unused)
audio_buf_info ai;
int nchannels=0, ssize=0;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
@@ -638,6 +701,9 @@ oss_obuffree(oss_audio_t *self, PyObject *unused)
audio_buf_info ai;
int nchannels=0, ssize=0;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) {
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
@@ -655,6 +721,9 @@ oss_getptr(oss_audio_t *self, PyObject *unused)
count_info info;
int req;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
if (self->mode == O_RDONLY)
req = SNDCTL_DSP_GETIPTR;
else
@@ -685,6 +754,9 @@ oss_mixer_close(oss_mixer_t *self, PyObject *unused)
static PyObject *
oss_mixer_fileno(oss_mixer_t *self, PyObject *unused)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return PyLong_FromLong(self->fd);
}
@@ -693,6 +765,9 @@ oss_mixer_fileno(oss_mixer_t *self, PyObject *unused)
static PyObject *
oss_mixer_controls(oss_mixer_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1_internal(self->fd, args, "controls",
SOUND_MIXER_READ_DEVMASK);
}
@@ -700,6 +775,9 @@ oss_mixer_controls(oss_mixer_t *self, PyObject *args)
static PyObject *
oss_mixer_stereocontrols(oss_mixer_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1_internal(self->fd, args, "stereocontrols",
SOUND_MIXER_READ_STEREODEVS);
}
@@ -707,6 +785,9 @@ oss_mixer_stereocontrols(oss_mixer_t *self, PyObject *args)
static PyObject *
oss_mixer_reccontrols(oss_mixer_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1_internal(self->fd, args, "reccontrols",
SOUND_MIXER_READ_RECMASK);
}
@@ -716,6 +797,9 @@ oss_mixer_get(oss_mixer_t *self, PyObject *args)
{
int channel, volume;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
/* Can't use _do_ioctl_1 because of encoded arg thingy. */
if (!PyArg_ParseTuple(args, "i:get", &channel))
return NULL;
@@ -736,6 +820,9 @@ oss_mixer_set(oss_mixer_t *self, PyObject *args)
{
int channel, volume, leftVol, rightVol;
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
/* Can't use _do_ioctl_1 because of encoded arg thingy. */
if (!PyArg_ParseTuple(args, "i(ii):set", &channel, &leftVol, &rightVol))
return NULL;
@@ -761,6 +848,9 @@ oss_mixer_set(oss_mixer_t *self, PyObject *args)
static PyObject *
oss_mixer_get_recsrc(oss_mixer_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1_internal(self->fd, args, "get_recsrc",
SOUND_MIXER_READ_RECSRC);
}
@@ -768,6 +858,9 @@ oss_mixer_get_recsrc(oss_mixer_t *self, PyObject *args)
static PyObject *
oss_mixer_set_recsrc(oss_mixer_t *self, PyObject *args)
{
+ if (!_is_fd_valid(self->fd))
+ return NULL;
+
return _do_ioctl_1(self->fd, args, "set_recsrc",
SOUND_MIXER_WRITE_RECSRC);
}
@@ -971,8 +1064,8 @@ build_namelists (PyObject *module)
int num_controls;
int i;
- num_controls = sizeof(control_labels) / sizeof(control_labels[0]);
- assert(num_controls == sizeof(control_names) / sizeof(control_names[0]));
+ num_controls = Py_ARRAY_LENGTH(control_labels);
+ assert(num_controls == Py_ARRAY_LENGTH(control_names));
labels = PyList_New(num_controls);
names = PyList_New(num_controls);
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index b8732dc..b4602f5 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -300,25 +300,25 @@ parser_richcompare(PyObject *left, PyObject *right, int op)
/* Convert return value to a Boolean */
switch (op) {
- case Py_EQ:
+ case Py_EQ:
v = TEST_COND(result == 0);
break;
- case Py_NE:
+ case Py_NE:
v = TEST_COND(result != 0);
break;
- case Py_LE:
+ case Py_LE:
v = TEST_COND(result <= 0);
break;
- case Py_GE:
+ case Py_GE:
v = TEST_COND(result >= 0);
break;
- case Py_LT:
+ case Py_LT:
v = TEST_COND(result < 0);
break;
- case Py_GT:
+ case Py_GT:
v = TEST_COND(result > 0);
break;
- default:
+ default:
PyErr_BadArgument();
return NULL;
}
@@ -382,40 +382,28 @@ parser_sizeof(PyST_Object *st, void *unused)
static PyObject*
parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw)
{
- PyObject *line_option = 0;
- PyObject *col_option = 0;
+ int line_info = 0;
+ int col_info = 0;
PyObject *res = 0;
int ok;
static char *keywords[] = {"st", "line_info", "col_info", NULL};
if (self == NULL || PyModule_Check(self)) {
- ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2tuple", keywords,
- &PyST_Type, &self, &line_option,
- &col_option);
+ ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|pp:st2tuple", keywords,
+ &PyST_Type, &self, &line_info,
+ &col_info);
}
else
- ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:totuple", &keywords[1],
- &line_option, &col_option);
+ ok = PyArg_ParseTupleAndKeywords(args, kw, "|pp:totuple", &keywords[1],
+ &line_info, &col_info);
if (ok != 0) {
- int lineno = 0;
- int col_offset = 0;
- if (line_option != NULL) {
- lineno = PyObject_IsTrue(line_option);
- if (lineno < 0)
- return NULL;
- }
- if (col_option != NULL) {
- col_offset = PyObject_IsTrue(col_option);
- if (col_offset < 0)
- return NULL;
- }
/*
* Convert ST into a tuple representation. Use Guido's function,
* since it's known to work already.
*/
res = node2tuple(((PyST_Object*)self)->st_node,
- PyTuple_New, PyTuple_SetItem, lineno, col_offset);
+ PyTuple_New, PyTuple_SetItem, line_info, col_info);
}
return (res);
}
@@ -430,39 +418,27 @@ parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw)
static PyObject*
parser_st2list(PyST_Object *self, PyObject *args, PyObject *kw)
{
- PyObject *line_option = 0;
- PyObject *col_option = 0;
+ int line_info = 0;
+ int col_info = 0;
PyObject *res = 0;
int ok;
static char *keywords[] = {"st", "line_info", "col_info", NULL};
if (self == NULL || PyModule_Check(self))
- ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2list", keywords,
- &PyST_Type, &self, &line_option,
- &col_option);
+ ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|pp:st2list", keywords,
+ &PyST_Type, &self, &line_info,
+ &col_info);
else
- ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:tolist", &keywords[1],
- &line_option, &col_option);
+ ok = PyArg_ParseTupleAndKeywords(args, kw, "|pp:tolist", &keywords[1],
+ &line_info, &col_info);
if (ok) {
- int lineno = 0;
- int col_offset = 0;
- if (line_option != 0) {
- lineno = PyObject_IsTrue(line_option);
- if (lineno < 0)
- return NULL;
- }
- if (col_option != 0) {
- col_offset = PyObject_IsTrue(col_option);
- if (col_offset < 0)
- return NULL;
- }
/*
* Convert ST into a tuple representation. Use Guido's function,
* since it's known to work already.
*/
res = node2tuple(self->st_node,
- PyList_New, PyList_SetItem, lineno, col_offset);
+ PyList_New, PyList_SetItem, line_info, col_info);
}
return (res);
}
@@ -600,8 +576,10 @@ parser_do_parse(PyObject *args, PyObject *kw, char *argspec, int type)
if (res)
((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK;
}
- else
+ else {
PyParser_SetError(&err);
+ }
+ PyParser_ClearError(&err);
}
return (res);
}
@@ -995,6 +973,7 @@ VALIDATER(comp_iter); VALIDATER(comp_if);
VALIDATER(testlist_comp); VALIDATER(yield_expr);
VALIDATER(or_test);
VALIDATER(test_nocond); VALIDATER(lambdef_nocond);
+VALIDATER(yield_arg);
#undef VALIDATER
@@ -1655,22 +1634,49 @@ validate_raise_stmt(node *tree)
}
-/* yield_expr: 'yield' [testlist]
+/* yield_expr: 'yield' [yield_arg]
*/
static int
validate_yield_expr(node *tree)
{
int nch = NCH(tree);
- int res = (validate_ntype(tree, yield_expr)
- && ((nch == 1) || (nch == 2))
- && validate_name(CHILD(tree, 0), "yield"));
-
- if (res && (nch == 2))
- res = validate_testlist(CHILD(tree, 1));
-
- return (res);
+ if (nch < 1 || nch > 2)
+ return 0;
+ if (!validate_ntype(tree, yield_expr))
+ return 0;
+ if (!validate_name(CHILD(tree, 0), "yield"))
+ return 0;
+ if (nch == 2) {
+ if (!validate_yield_arg(CHILD(tree, 1)))
+ return 0;
+ }
+ return 1;
}
+/* yield_arg: 'from' test | testlist
+ */
+static int
+validate_yield_arg(node *tree)
+{
+ int nch = NCH(tree);
+ if (!validate_ntype(tree, yield_arg))
+ return 0;
+ switch (nch) {
+ case 1:
+ if (!validate_testlist(CHILD(tree, nch - 1)))
+ return 0;
+ break;
+ case 2:
+ if (!validate_name(CHILD(tree, 0), "from"))
+ return 0;
+ if (!validate_test(CHILD(tree, 1)))
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
/* yield_stmt: yield_expr
*/
@@ -2165,16 +2171,16 @@ validate_comp_op(node *tree)
*/
tree = CHILD(tree, 0);
switch (TYPE(tree)) {
- case LESS:
- case GREATER:
- case EQEQUAL:
- case EQUAL:
- case LESSEQUAL:
- case GREATEREQUAL:
- case NOTEQUAL:
+ case LESS:
+ case GREATER:
+ case EQEQUAL:
+ case EQUAL:
+ case LESSEQUAL:
+ case GREATEREQUAL:
+ case NOTEQUAL:
res = 1;
break;
- case NAME:
+ case NAME:
res = ((strcmp(STR(tree), "in") == 0)
|| (strcmp(STR(tree), "is") == 0));
if (!res) {
@@ -2719,9 +2725,9 @@ validate_argument(node *tree)
{
int nch = NCH(tree);
int res = (validate_ntype(tree, argument)
- && ((nch == 1) || (nch == 2) || (nch == 3))
- && validate_test(CHILD(tree, 0)));
-
+ && ((nch == 1) || (nch == 2) || (nch == 3)));
+ if (res)
+ res = validate_test(CHILD(tree, 0));
if (res && (nch == 2))
res = validate_comp_for(CHILD(tree, 1));
else if (res && (nch == 3))
@@ -3356,10 +3362,13 @@ PyInit_parser(void)
copyreg = PyImport_ImportModuleNoBlock("copyreg");
if (copyreg != NULL) {
PyObject *func, *pickler;
+ _Py_IDENTIFIER(pickle);
+ _Py_IDENTIFIER(sequence2st);
+ _Py_IDENTIFIER(_pickler);
- func = PyObject_GetAttrString(copyreg, "pickle");
- pickle_constructor = PyObject_GetAttrString(module, "sequence2st");
- pickler = PyObject_GetAttrString(module, "_pickler");
+ func = _PyObject_GetAttrId(copyreg, &PyId_pickle);
+ pickle_constructor = _PyObject_GetAttrId(module, &PyId_sequence2st);
+ pickler = _PyObject_GetAttrId(module, &PyId__pickler);
Py_XINCREF(pickle_constructor);
if ((func != NULL) && (pickle_constructor != NULL)
&& (pickler != NULL)) {
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 9f57673..d4982f0 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -28,6 +28,7 @@
#include "Python.h"
#if defined(__VMS)
+# error "PEP 11: VMS is now unsupported, code will be removed in Python 3.4"
# include <unixio.h>
#endif /* defined(__VMS) */
@@ -43,6 +44,7 @@ corresponding Unix manual entries for more information on calls.");
#if defined(PYOS_OS2)
+#error "PEP 11: OS/2 is now unsupported, code will be removed in Python 3.4"
#define INCL_DOS
#define INCL_DOSERRORS
#define INCL_DOSPROCESS
@@ -57,6 +59,10 @@ corresponding Unix manual entries for more information on calls.");
#include "osdefs.h"
#endif
+#ifdef HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif
+
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
@@ -93,6 +99,48 @@ corresponding Unix manual entries for more information on calls.");
#include <langinfo.h>
#endif
+#ifdef HAVE_SYS_SENDFILE_H
+#include <sys/sendfile.h>
+#endif
+
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+
+#if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY)
+#undef HAVE_SCHED_SETAFFINITY
+#endif
+
+#if defined(HAVE_SYS_XATTR_H) && defined(__GLIBC__)
+#define USE_XATTRS
+#endif
+
+#ifdef USE_XATTRS
+#include <sys/xattr.h>
+#endif
+
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__)
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#endif
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#if defined(MS_WINDOWS)
+# define TERMSIZE_USE_CONIO
+#elif defined(HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h>
+# if defined(HAVE_TERMIOS_H)
+# include <termios.h>
+# endif
+# if defined(TIOCGWINSZ)
+# define TERMSIZE_USE_IOCTL
+# endif
+#endif /* MS_WINDOWS */
+
/* Various compilers have only certain posix functions */
/* XXX Gosh I wish these were all moved into pyconfig.h */
#if defined(PYCC_VACPP) && defined(PYOS_OS2)
@@ -155,6 +203,9 @@ corresponding Unix manual entries for more information on calls.");
#endif /* ! __WATCOMC__ || __QNX__ */
#endif /* ! __IBMC__ */
+
+
+
#ifndef _MSC_VER
#if defined(__sgi)&&_COMPILER_VERSION>=700
@@ -328,10 +379,12 @@ static int win32_can_symlink = 0;
#undef STRUCT_STAT
#if defined(MS_WIN64) || defined(MS_WINDOWS)
# define STAT win32_stat
+# define LSTAT win32_lstat
# define FSTAT win32_fstat
# define STRUCT_STAT struct win32_stat
#else
# define STAT stat
+# define LSTAT lstat
# define FSTAT fstat
# define STRUCT_STAT struct stat
#endif
@@ -347,6 +400,402 @@ static int win32_can_symlink = 0;
#endif
#endif
+
+#ifdef MS_WINDOWS
+static int
+win32_warn_bytes_api()
+{
+ return PyErr_WarnEx(PyExc_DeprecationWarning,
+ "The Windows bytes API has been deprecated, "
+ "use Unicode filenames instead",
+ 1);
+}
+#endif
+
+
+#ifdef AT_FDCWD
+/*
+ * Why the (int) cast? Solaris 10 defines AT_FDCWD as 0xffd19553 (-3041965);
+ * without the int cast, the value gets interpreted as uint (4291925331),
+ * which doesn't play nicely with all the initializer lines in this file that
+ * look like this:
+ * int dir_fd = DEFAULT_DIR_FD;
+ */
+#define DEFAULT_DIR_FD (int)AT_FDCWD
+#else
+#define DEFAULT_DIR_FD (-100)
+#endif
+
+static int
+_fd_converter(PyObject *o, int *p, int default_value) {
+ long long_value;
+ if (o == Py_None) {
+ *p = default_value;
+ return 1;
+ }
+ if (PyFloat_Check(o)) {
+ PyErr_SetString(PyExc_TypeError,
+ "integer argument expected, got float" );
+ return 0;
+ }
+ long_value = PyLong_AsLong(o);
+ if (long_value == -1 && PyErr_Occurred())
+ return 0;
+ if (long_value > INT_MAX) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed integer is greater than maximum");
+ return 0;
+ }
+ if (long_value < INT_MIN) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed integer is less than minimum");
+ return 0;
+ }
+ *p = (int)long_value;
+ return 1;
+}
+
+static int
+dir_fd_converter(PyObject *o, void *p) {
+ return _fd_converter(o, (int *)p, DEFAULT_DIR_FD);
+}
+
+
+
+/*
+ * A PyArg_ParseTuple "converter" function
+ * that handles filesystem paths in the manner
+ * preferred by the os module.
+ *
+ * path_converter accepts (Unicode) strings and their
+ * subclasses, and bytes and their subclasses. What
+ * it does with the argument depends on the platform:
+ *
+ * * On Windows, if we get a (Unicode) string we
+ * extract the wchar_t * and return it; if we get
+ * bytes we extract the char * and return that.
+ *
+ * * On all other platforms, strings are encoded
+ * to bytes using PyUnicode_FSConverter, then we
+ * extract the char * from the bytes object and
+ * return that.
+ *
+ * path_converter also optionally accepts signed
+ * integers (representing open file descriptors) instead
+ * of path strings.
+ *
+ * Input fields:
+ * path.nullable
+ * If nonzero, the path is permitted to be None.
+ * path.allow_fd
+ * If nonzero, the path is permitted to be a file handle
+ * (a signed int) instead of a string.
+ * path.function_name
+ * If non-NULL, path_converter will use that as the name
+ * of the function in error messages.
+ * (If path.argument_name is NULL it omits the function name.)
+ * path.argument_name
+ * If non-NULL, path_converter will use that as the name
+ * of the parameter in error messages.
+ * (If path.argument_name is NULL it uses "path".)
+ *
+ * Output fields:
+ * path.wide
+ * Points to the path if it was expressed as Unicode
+ * and was not encoded. (Only used on Windows.)
+ * path.narrow
+ * Points to the path if it was expressed as bytes,
+ * or it was Unicode and was encoded to bytes.
+ * path.fd
+ * Contains a file descriptor if path.accept_fd was true
+ * and the caller provided a signed integer instead of any
+ * sort of string.
+ *
+ * WARNING: if your "path" parameter is optional, and is
+ * unspecified, path_converter will never get called.
+ * So if you set allow_fd, you *MUST* initialize path.fd = -1
+ * yourself!
+ * path.length
+ * The length of the path in characters, if specified as
+ * a string.
+ * path.object
+ * The original object passed in.
+ * path.cleanup
+ * For internal use only. May point to a temporary object.
+ * (Pay no attention to the man behind the curtain.)
+ *
+ * At most one of path.wide or path.narrow will be non-NULL.
+ * If path was None and path.nullable was set,
+ * or if path was an integer and path.allow_fd was set,
+ * both path.wide and path.narrow will be NULL
+ * and path.length will be 0.
+ *
+ * path_converter takes care to not write to the path_t
+ * unless it's successful. However it must reset the
+ * "cleanup" field each time it's called.
+ *
+ * Use as follows:
+ * path_t path;
+ * memset(&path, 0, sizeof(path));
+ * PyArg_ParseTuple(args, "O&", path_converter, &path);
+ * // ... use values from path ...
+ * path_cleanup(&path);
+ *
+ * (Note that if PyArg_Parse fails you don't need to call
+ * path_cleanup(). However it is safe to do so.)
+ */
+typedef struct {
+ char *function_name;
+ char *argument_name;
+ int nullable;
+ int allow_fd;
+ wchar_t *wide;
+ char *narrow;
+ int fd;
+ Py_ssize_t length;
+ PyObject *object;
+ PyObject *cleanup;
+} path_t;
+
+static void
+path_cleanup(path_t *path) {
+ if (path->cleanup) {
+ Py_DECREF(path->cleanup);
+ path->cleanup = NULL;
+ }
+}
+
+static int
+path_converter(PyObject *o, void *p) {
+ path_t *path = (path_t *)p;
+ PyObject *unicode, *bytes;
+ Py_ssize_t length;
+ char *narrow;
+
+#define FORMAT_EXCEPTION(exc, fmt) \
+ PyErr_Format(exc, "%s%s" fmt, \
+ path->function_name ? path->function_name : "", \
+ path->function_name ? ": " : "", \
+ path->argument_name ? path->argument_name : "path")
+
+ /* Py_CLEANUP_SUPPORTED support */
+ if (o == NULL) {
+ path_cleanup(path);
+ return 1;
+ }
+
+ /* ensure it's always safe to call path_cleanup() */
+ path->cleanup = NULL;
+
+ if (o == Py_None) {
+ if (!path->nullable) {
+ FORMAT_EXCEPTION(PyExc_TypeError,
+ "can't specify None for %s argument");
+ return 0;
+ }
+ path->wide = NULL;
+ path->narrow = NULL;
+ path->length = 0;
+ path->object = o;
+ path->fd = -1;
+ return 1;
+ }
+
+ unicode = PyUnicode_FromObject(o);
+ if (unicode) {
+#ifdef MS_WINDOWS
+ wchar_t *wide;
+ length = PyUnicode_GET_SIZE(unicode);
+ if (length > 32767) {
+ FORMAT_EXCEPTION(PyExc_ValueError, "%s too long for Windows");
+ Py_DECREF(unicode);
+ return 0;
+ }
+
+ wide = PyUnicode_AsUnicode(unicode);
+ if (!wide) {
+ Py_DECREF(unicode);
+ return 0;
+ }
+
+ path->wide = wide;
+ path->narrow = NULL;
+ path->length = length;
+ path->object = o;
+ path->fd = -1;
+ path->cleanup = unicode;
+ return Py_CLEANUP_SUPPORTED;
+#else
+ int converted = PyUnicode_FSConverter(unicode, &bytes);
+ Py_DECREF(unicode);
+ if (!converted)
+ bytes = NULL;
+#endif
+ }
+ else {
+ PyErr_Clear();
+ bytes = PyBytes_FromObject(o);
+ if (!bytes) {
+ PyErr_Clear();
+ if (path->allow_fd) {
+ int fd;
+ /*
+ * note: _fd_converter always permits None.
+ * but we've already done our None check.
+ * so o cannot be None at this point.
+ */
+ int result = _fd_converter(o, &fd, -1);
+ if (result) {
+ path->wide = NULL;
+ path->narrow = NULL;
+ path->length = 0;
+ path->object = o;
+ path->fd = fd;
+ return result;
+ }
+ }
+ }
+ }
+
+ if (!bytes) {
+ if (!PyErr_Occurred())
+ FORMAT_EXCEPTION(PyExc_TypeError, "illegal type for %s parameter");
+ return 0;
+ }
+
+#ifdef MS_WINDOWS
+ if (win32_warn_bytes_api()) {
+ Py_DECREF(bytes);
+ return 0;
+ }
+#endif
+
+ length = PyBytes_GET_SIZE(bytes);
+#ifdef MS_WINDOWS
+ if (length > MAX_PATH) {
+ FORMAT_EXCEPTION(PyExc_ValueError, "%s too long for Windows");
+ Py_DECREF(bytes);
+ return 0;
+ }
+#endif
+
+ narrow = PyBytes_AS_STRING(bytes);
+ if (length != strlen(narrow)) {
+ FORMAT_EXCEPTION(PyExc_ValueError, "embedded NUL character in %s");
+ Py_DECREF(bytes);
+ return 0;
+ }
+
+ path->wide = NULL;
+ path->narrow = narrow;
+ path->length = length;
+ path->object = o;
+ path->fd = -1;
+ path->cleanup = bytes;
+ return Py_CLEANUP_SUPPORTED;
+}
+
+static void
+argument_unavailable_error(char *function_name, char *argument_name) {
+ PyErr_Format(PyExc_NotImplementedError,
+ "%s%s%s unavailable on this platform",
+ (function_name != NULL) ? function_name : "",
+ (function_name != NULL) ? ": ": "",
+ argument_name);
+}
+
+static int
+dir_fd_unavailable(PyObject *o, void *p) {
+ int *dir_fd = (int *)p;
+ int return_value = _fd_converter(o, dir_fd, DEFAULT_DIR_FD);
+ if (!return_value)
+ return 0;
+ if (*dir_fd == DEFAULT_DIR_FD)
+ return 1;
+ argument_unavailable_error(NULL, "dir_fd");
+ return 0;
+}
+
+static int
+fd_specified(char *function_name, int fd) {
+ if (fd == -1)
+ return 0;
+
+ argument_unavailable_error(function_name, "fd");
+ return 1;
+}
+
+static int
+follow_symlinks_specified(char *function_name, int follow_symlinks) {
+ if (follow_symlinks)
+ return 0;
+
+ argument_unavailable_error(function_name, "follow_symlinks");
+ return 1;
+}
+
+static int
+path_and_dir_fd_invalid(char *function_name, path_t *path, int dir_fd) {
+ if (!path->narrow && !path->wide && (dir_fd != DEFAULT_DIR_FD)) {
+ PyErr_Format(PyExc_ValueError,
+ "%s: can't specify dir_fd without matching path",
+ function_name);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+dir_fd_and_fd_invalid(char *function_name, int dir_fd, int fd) {
+ if ((dir_fd != DEFAULT_DIR_FD) && (fd != -1)) {
+ PyErr_Format(PyExc_ValueError,
+ "%s: can't specify both dir_fd and fd",
+ function_name);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+fd_and_follow_symlinks_invalid(char *function_name, int fd,
+ int follow_symlinks) {
+ if ((fd > 0) && (!follow_symlinks)) {
+ PyErr_Format(PyExc_ValueError,
+ "%s: cannot use fd and follow_symlinks together",
+ function_name);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+dir_fd_and_follow_symlinks_invalid(char *function_name, int dir_fd,
+ int follow_symlinks) {
+ if ((dir_fd != DEFAULT_DIR_FD) && (!follow_symlinks)) {
+ PyErr_Format(PyExc_ValueError,
+ "%s: cannot use dir_fd and follow_symlinks together",
+ function_name);
+ return 1;
+ }
+ return 0;
+}
+
+/* A helper used by a number of POSIX-only functions */
+#ifndef MS_WINDOWS
+static int
+_parse_off_t(PyObject* arg, void* addr)
+{
+#if !defined(HAVE_LARGEFILE_SUPPORT)
+ *((off_t*)addr) = PyLong_AsLong(arg);
+#else
+ *((off_t*)addr) = PyLong_AsLongLong(arg);
+#endif
+ if (PyErr_Occurred())
+ return 0;
+ return 1;
+}
+#endif
+
#if defined _MSC_VER && _MSC_VER >= 1400
/* Microsoft CRT in VS2005 and higher will verify that a filehandle is
* valid and throw an assertion if it isn't.
@@ -498,6 +947,7 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag)
return TRUE;
}
+
#endif /* MS_WINDOWS */
/* Return a dictionary corresponding to the POSIX environment table */
@@ -653,7 +1103,7 @@ win32_error(char* function, const char* filename)
}
static PyObject *
-win32_error_unicode(char* function, Py_UNICODE* filename)
+win32_error_unicode(char* function, wchar_t* filename)
{
/* XXX - see win32_error for comments on 'function' */
errno = GetLastError();
@@ -663,25 +1113,48 @@ win32_error_unicode(char* function, Py_UNICODE* filename)
return PyErr_SetFromWindowsErr(errno);
}
-static int
-convert_to_unicode(PyObject **param)
-{
- if (PyUnicode_CheckExact(*param))
- Py_INCREF(*param);
- else if (PyUnicode_Check(*param))
- /* For a Unicode subtype that's not a Unicode object,
- return a true Unicode object with the same data. */
- *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
- PyUnicode_GET_SIZE(*param));
+static PyObject *
+win32_error_object(char* function, PyObject* filename)
+{
+ /* XXX - see win32_error for comments on 'function' */
+ errno = GetLastError();
+ if (filename)
+ return PyErr_SetExcFromWindowsErrWithFilenameObject(
+ PyExc_WindowsError,
+ errno,
+ filename);
else
- *param = PyUnicode_FromEncodedObject(*param,
- Py_FileSystemDefaultEncoding,
- "strict");
- return (*param) != NULL;
+ return PyErr_SetFromWindowsErr(errno);
}
#endif /* MS_WINDOWS */
+/*
+ * Some functions return Win32 errors, others only ever use posix_error
+ * (this is for backwards compatibility with exceptions)
+ */
+static PyObject *
+path_posix_error(char *function_name, path_t *path)
+{
+ if (path->narrow)
+ return posix_error_with_filename(path->narrow);
+ return posix_error();
+}
+
+static PyObject *
+path_error(char *function_name, path_t *path)
+{
+#ifdef MS_WINDOWS
+ if (path->narrow)
+ return win32_error(function_name, path->narrow);
+ if (path->wide)
+ return win32_error_unicode(function_name, path->wide);
+ return win32_error(function_name, NULL);
+#else
+ return path_posix_error(function_name, path);
+#endif
+}
+
#if defined(PYOS_OS2)
/**********************************************************************
* Helper Function to Trim and Format OS/2 Messages
@@ -800,32 +1273,6 @@ posix_1str(PyObject *args, char *format, int (*func)(const char*))
return Py_None;
}
-static PyObject *
-posix_2str(PyObject *args,
- char *format,
- int (*func)(const char *, const char *))
-{
- PyObject *opath1 = NULL, *opath2 = NULL;
- char *path1, *path2;
- int res;
- if (!PyArg_ParseTuple(args, format,
- PyUnicode_FSConverter, &opath1,
- PyUnicode_FSConverter, &opath2)) {
- return NULL;
- }
- path1 = PyBytes_AsString(opath1);
- path2 = PyBytes_AsString(opath2);
- Py_BEGIN_ALLOW_THREADS
- res = (*func)(path1, path2);
- Py_END_ALLOW_THREADS
- Py_DECREF(opath1);
- Py_DECREF(opath2);
- if (res != 0)
- /* XXX how to report both path1 and path2??? */
- return posix_error();
- Py_INCREF(Py_None);
- return Py_None;
-}
#ifdef MS_WINDOWS
static PyObject*
@@ -834,22 +1281,28 @@ win32_1str(PyObject* args, char* func,
char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
{
PyObject *uni;
- char *ansi;
+ const char *ansi;
BOOL result;
- if (!PyArg_ParseTuple(args, wformat, &uni))
- PyErr_Clear();
- else {
+ if (PyArg_ParseTuple(args, wformat, &uni))
+ {
+ wchar_t *wstr = PyUnicode_AsUnicode(uni);
+ if (wstr == NULL)
+ return NULL;
Py_BEGIN_ALLOW_THREADS
- result = funcW(PyUnicode_AsUnicode(uni));
+ result = funcW(wstr);
Py_END_ALLOW_THREADS
if (!result)
- return win32_error_unicode(func, PyUnicode_AsUnicode(uni));
+ return win32_error_object(func, uni);
Py_INCREF(Py_None);
return Py_None;
}
+ PyErr_Clear();
+
if (!PyArg_ParseTuple(args, format, &ansi))
return NULL;
+ if (win32_warn_bytes_api())
+ return NULL;
Py_BEGIN_ALLOW_THREADS
result = funcA(ansi);
Py_END_ALLOW_THREADS
@@ -1064,18 +1517,19 @@ attributes_from_dir_w(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *
/* Grab GetFinalPathNameByHandle dynamically from kernel32 */
static int has_GetFinalPathNameByHandle = 0;
-static DWORD (CALLBACK *Py_GetFinalPathNameByHandleA)(HANDLE, LPSTR, DWORD,
- DWORD);
static DWORD (CALLBACK *Py_GetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD,
DWORD);
static int
check_GetFinalPathNameByHandle()
{
HINSTANCE hKernel32;
+ DWORD (CALLBACK *Py_GetFinalPathNameByHandleA)(HANDLE, LPSTR, DWORD,
+ DWORD);
+
/* only recheck */
if (!has_GetFinalPathNameByHandle)
{
- hKernel32 = GetModuleHandle("KERNEL32");
+ hKernel32 = GetModuleHandleW(L"KERNEL32");
*(FARPROC*)&Py_GetFinalPathNameByHandleA = GetProcAddress(hKernel32,
"GetFinalPathNameByHandleA");
*(FARPROC*)&Py_GetFinalPathNameByHandleW = GetProcAddress(hKernel32,
@@ -1382,7 +1836,10 @@ win32_fstat(int file_number, struct win32_stat *result)
HANDLE h;
int type;
- h = (HANDLE)_get_osfhandle(file_number);
+ if (!_PyVerify_fd(file_number))
+ h = INVALID_HANDLE_VALUE;
+ else
+ h = (HANDLE)_get_osfhandle(file_number);
/* Protocol violation: we explicitly clear errno, instead of
setting it to a POSIX error. Callers should use GetLastError. */
@@ -1426,7 +1883,7 @@ win32_fstat(int file_number, struct win32_stat *result)
#endif /* MS_WINDOWS */
PyDoc_STRVAR(stat_result__doc__,
-"stat_result: Result from stat or lstat.\n\n\
+"stat_result: Result from stat, fstat, or lstat.\n\n\
This object may be accessed either as a tuple of\n\
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\
@@ -1451,6 +1908,9 @@ static PyStructSequence_Field stat_result_fields[] = {
{"st_atime", "time of last access"},
{"st_mtime", "time of last modification"},
{"st_ctime", "time of last change"},
+ {"st_atime_ns", "time of last access in nanoseconds"},
+ {"st_mtime_ns", "time of last modification in nanoseconds"},
+ {"st_ctime_ns", "time of last change in nanoseconds"},
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
{"st_blksize", "blocksize for filesystem I/O"},
#endif
@@ -1473,9 +1933,9 @@ static PyStructSequence_Field stat_result_fields[] = {
};
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-#define ST_BLKSIZE_IDX 13
+#define ST_BLKSIZE_IDX 16
#else
-#define ST_BLKSIZE_IDX 12
+#define ST_BLKSIZE_IDX 15
#endif
#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
@@ -1544,9 +2004,39 @@ static PyStructSequence_Desc statvfs_result_desc = {
10
};
+#if defined(HAVE_WAITID) && !defined(__APPLE__)
+PyDoc_STRVAR(waitid_result__doc__,
+"waitid_result: Result from waitid.\n\n\
+This object may be accessed either as a tuple of\n\
+ (si_pid, si_uid, si_signo, si_status, si_code),\n\
+or via the attributes si_pid, si_uid, and so on.\n\
+\n\
+See os.waitid for more information.");
+
+static PyStructSequence_Field waitid_result_fields[] = {
+ {"si_pid", },
+ {"si_uid", },
+ {"si_signo", },
+ {"si_status", },
+ {"si_code", },
+ {0}
+};
+
+static PyStructSequence_Desc waitid_result_desc = {
+ "waitid_result", /* name */
+ waitid_result__doc__, /* doc */
+ waitid_result_fields,
+ 5
+};
+static PyTypeObject WaitidResultType;
+#endif
+
static int initialized;
static PyTypeObject StatResultType;
static PyTypeObject StatVFSResultType;
+#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
+static PyTypeObject SchedParamType;
+#endif
static newfunc structseq_new;
static PyObject *
@@ -1589,6 +2079,10 @@ stat_float_times(PyObject* self, PyObject *args)
int newval = -1;
if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval))
return NULL;
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "stat_float_times() is deprecated",
+ 1))
+ return NULL;
if (newval == -1)
/* Return old value */
return PyBool_FromLong(_stat_float_times);
@@ -1597,25 +2091,50 @@ stat_float_times(PyObject* self, PyObject *args)
return Py_None;
}
+static PyObject *billion = NULL;
+
static void
fill_time(PyObject *v, int index, time_t sec, unsigned long nsec)
{
- PyObject *fval,*ival;
-#if SIZEOF_TIME_T > SIZEOF_LONG
- ival = PyLong_FromLongLong((PY_LONG_LONG)sec);
-#else
- ival = PyLong_FromLong((long)sec);
-#endif
- if (!ival)
- return;
+ PyObject *s = _PyLong_FromTime_t(sec);
+ PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec);
+ PyObject *s_in_ns = NULL;
+ PyObject *ns_total = NULL;
+ PyObject *float_s = NULL;
+
+ if (!(s && ns_fractional))
+ goto exit;
+
+ s_in_ns = PyNumber_Multiply(s, billion);
+ if (!s_in_ns)
+ goto exit;
+
+ ns_total = PyNumber_Add(s_in_ns, ns_fractional);
+ if (!ns_total)
+ goto exit;
+
if (_stat_float_times) {
- fval = PyFloat_FromDouble(sec + 1e-9*nsec);
- } else {
- fval = ival;
- Py_INCREF(fval);
+ float_s = PyFloat_FromDouble(sec + 1e-9*nsec);
+ if (!float_s)
+ goto exit;
+ }
+ else {
+ float_s = s;
+ Py_INCREF(float_s);
}
- PyStructSequence_SET_ITEM(v, index, ival);
- PyStructSequence_SET_ITEM(v, index+3, fval);
+
+ PyStructSequence_SET_ITEM(v, index, s);
+ PyStructSequence_SET_ITEM(v, index+3, float_s);
+ PyStructSequence_SET_ITEM(v, index+6, ns_total);
+ s = NULL;
+ float_s = NULL;
+ ns_total = NULL;
+exit:
+ Py_XDECREF(s);
+ Py_XDECREF(ns_fractional);
+ Py_XDECREF(s_in_ns);
+ Py_XDECREF(ns_total);
+ Py_XDECREF(float_s);
}
/* pack a system stat C structure into the Python stat tuple
@@ -1718,126 +2237,238 @@ _pystat_fromstructstat(STRUCT_STAT *st)
return v;
}
+/* POSIX methods */
+
+
static PyObject *
-posix_do_stat(PyObject *self, PyObject *args,
- char *format,
-#ifdef __VMS
- int (*statfunc)(const char *, STRUCT_STAT *, ...),
-#else
- int (*statfunc)(const char *, STRUCT_STAT *),
-#endif
- char *wformat,
- int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *))
+posix_do_stat(char *function_name, path_t *path,
+ int dir_fd, int follow_symlinks)
{
STRUCT_STAT st;
- PyObject *opath;
- char *path;
- int res;
- PyObject *result;
-
-#ifdef MS_WINDOWS
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, wformat, &po)) {
- Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
-
- Py_BEGIN_ALLOW_THREADS
- /* PyUnicode_AS_UNICODE result OK without
- thread lock as it is a simple dereference. */
- res = wstatfunc(wpath, &st);
- Py_END_ALLOW_THREADS
+ int result;
- if (res != 0)
- return win32_error_unicode("stat", wpath);
- return _pystat_fromstructstat(&st);
- }
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
+#if !defined(MS_WINDOWS) && !defined(HAVE_FSTATAT) && !defined(HAVE_LSTAT)
+ if (follow_symlinks_specified(function_name, follow_symlinks))
+ return NULL;
#endif
- if (!PyArg_ParseTuple(args, format,
- PyUnicode_FSConverter, &opath))
+ if (path_and_dir_fd_invalid("stat", path, dir_fd) ||
+ dir_fd_and_fd_invalid("stat", dir_fd, path->fd) ||
+ fd_and_follow_symlinks_invalid("stat", path->fd, follow_symlinks))
return NULL;
- path = PyBytes_AsString(opath);
- Py_BEGIN_ALLOW_THREADS
- res = (*statfunc)(path, &st);
- Py_END_ALLOW_THREADS
- if (res != 0) {
+ Py_BEGIN_ALLOW_THREADS
+ if (path->fd != -1)
+ result = FSTAT(path->fd, &st);
+ else
#ifdef MS_WINDOWS
- result = win32_error("stat", path);
-#else
- result = posix_error_with_filename(path);
-#endif
+ if (path->wide) {
+ if (follow_symlinks)
+ result = win32_stat_w(path->wide, &st);
+ else
+ result = win32_lstat_w(path->wide, &st);
}
else
- result = _pystat_fromstructstat(&st);
+#endif
+#if defined(HAVE_LSTAT) || defined(MS_WINDOWS)
+ if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD))
+ result = LSTAT(path->narrow, &st);
+ else
+#endif
+#ifdef HAVE_FSTATAT
+ if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks)
+ result = fstatat(dir_fd, path->narrow, &st,
+ follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW);
+ else
+#endif
+ result = STAT(path->narrow, &st);
+ Py_END_ALLOW_THREADS
- Py_DECREF(opath);
- return result;
+ if (result != 0)
+ return path_error("stat", path);
+
+ return _pystat_fromstructstat(&st);
}
-/* POSIX methods */
+PyDoc_STRVAR(posix_stat__doc__,
+"stat(path, *, dir_fd=None, follow_symlinks=True) -> stat result\n\n\
+Perform a stat system call on the given path.\n\
+\n\
+path may be specified as either a string or as an open file descriptor.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+ dir_fd may not be supported on your platform; if it is unavailable, using\n\
+ it will raise a NotImplementedError.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, stat will examine the symbolic link itself instead of the file the\n\
+ link points to.\n\
+It is an error to use dir_fd or follow_symlinks when specifying path as\n\
+ an open file descriptor.");
+
+static PyObject *
+posix_stat(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"path", "dir_fd", "follow_symlinks", NULL};
+ path_t path;
+ int dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 1;
+ PyObject *return_value;
+
+ memset(&path, 0, sizeof(path));
+ path.allow_fd = 1;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&p:stat", keywords,
+ path_converter, &path,
+#ifdef HAVE_FSTATAT
+ dir_fd_converter, &dir_fd,
+#else
+ dir_fd_unavailable, &dir_fd,
+#endif
+ &follow_symlinks))
+ return NULL;
+ return_value = posix_do_stat("stat", &path, dir_fd, follow_symlinks);
+ path_cleanup(&path);
+ return return_value;
+}
+
+PyDoc_STRVAR(posix_lstat__doc__,
+"lstat(path, *, dir_fd=None) -> stat result\n\n\
+Like stat(), but do not follow symbolic links.\n\
+Equivalent to stat(path, follow_symlinks=False).");
+
+static PyObject *
+posix_lstat(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *keywords[] = {"path", "dir_fd", NULL};
+ path_t path;
+ int dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 0;
+ PyObject *return_value;
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:lstat", keywords,
+ path_converter, &path,
+#ifdef HAVE_FSTATAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
+ return NULL;
+ return_value = posix_do_stat("stat", &path, dir_fd, follow_symlinks);
+ path_cleanup(&path);
+ return return_value;
+}
PyDoc_STRVAR(posix_access__doc__,
-"access(path, mode) -> True if granted, False otherwise\n\n\
-Use the real uid/gid to test for access to a path. Note that most\n\
-operations will use the effective uid/gid, therefore this routine can\n\
-be used in a suid/sgid environment to test if the invoking user has the\n\
-specified access to the path. The mode argument can be F_OK to test\n\
-existence, or the inclusive-OR of R_OK, W_OK, and X_OK.");
+"access(path, mode, *, dir_fd=None, effective_ids=False,\
+ follow_symlinks=True)\n\n\
+Use the real uid/gid to test for access to a path. Returns True if granted,\n\
+False otherwise.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+If effective_ids is True, access will use the effective uid/gid instead of\n\
+ the real uid/gid.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, access will examine the symbolic link itself instead of the file the\n\
+ link points to.\n\
+dir_fd, effective_ids, and follow_symlinks may not be implemented\n\
+ on your platform. If they are unavailable, using them will raise a\n\
+ NotImplementedError.\n\
+\n\
+Note that most operations will use the effective uid/gid, therefore this\n\
+ routine can be used in a suid/sgid environment to test if the invoking user\n\
+ has the specified access to the path.\n\
+The mode argument can be F_OK to test existence, or the inclusive-OR\n\
+ of R_OK, W_OK, and X_OK.");
static PyObject *
-posix_access(PyObject *self, PyObject *args)
+posix_access(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *path;
+ static char *keywords[] = {"path", "mode", "dir_fd", "effective_ids",
+ "follow_symlinks", NULL};
+ path_t path;
int mode;
+ int dir_fd = DEFAULT_DIR_FD;
+ int effective_ids = 0;
+ int follow_symlinks = 1;
+ PyObject *return_value = NULL;
#ifdef MS_WINDOWS
DWORD attr;
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, "Ui:access", &po, &mode)) {
- Py_BEGIN_ALLOW_THREADS
- /* PyUnicode_AS_UNICODE OK without thread lock as
- it is a simple dereference. */
- attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
- Py_END_ALLOW_THREADS
- goto finish;
- }
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
- if (!PyArg_ParseTuple(args, "O&i:access",
- PyUnicode_FSConverter, &opath, &mode))
+#else
+ int result;
+#endif
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|$O&pp:access", keywords,
+ path_converter, &path, &mode,
+#ifdef HAVE_FACCESSAT
+ dir_fd_converter, &dir_fd,
+#else
+ dir_fd_unavailable, &dir_fd,
+#endif
+ &effective_ids, &follow_symlinks))
return NULL;
- path = PyBytes_AsString(opath);
+
+#ifndef HAVE_FACCESSAT
+ if (follow_symlinks_specified("access", follow_symlinks))
+ goto exit;
+
+ if (effective_ids) {
+ argument_unavailable_error("access", "effective_ids");
+ goto exit;
+ }
+#endif
+
+#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
- attr = GetFileAttributesA(path);
+ if (path.wide != NULL)
+ attr = GetFileAttributesW(path.wide);
+ else
+ attr = GetFileAttributesA(path.narrow);
Py_END_ALLOW_THREADS
- Py_DECREF(opath);
-finish:
- if (attr == 0xFFFFFFFF)
- /* File does not exist, or cannot read attributes */
- return PyBool_FromLong(0);
- /* Access is possible if either write access wasn't requested, or
- the file isn't read-only, or if it's a directory, as there are
- no read-only directories on Windows. */
- return PyBool_FromLong(!(mode & 2)
- || !(attr & FILE_ATTRIBUTE_READONLY)
- || (attr & FILE_ATTRIBUTE_DIRECTORY));
+
+ /*
+ * Access is possible if
+ * * we didn't get a -1, and
+ * * write access wasn't requested,
+ * * or the file isn't read-only,
+ * * or it's a directory.
+ * (Directories cannot be read-only on Windows.)
+ */
+ return_value = PyBool_FromLong(
+ (attr != 0xFFFFFFFF) &&
+ (!(mode & 2) ||
+ !(attr & FILE_ATTRIBUTE_READONLY) ||
+ (attr & FILE_ATTRIBUTE_DIRECTORY)));
#else
- int res;
- if (!PyArg_ParseTuple(args, "O&i:access",
- PyUnicode_FSConverter, &opath, &mode))
- return NULL;
- path = PyBytes_AsString(opath);
+
Py_BEGIN_ALLOW_THREADS
- res = access(path, mode);
+#ifdef HAVE_FACCESSAT
+ if ((dir_fd != DEFAULT_DIR_FD) ||
+ effective_ids ||
+ !follow_symlinks) {
+ int flags = 0;
+ if (!follow_symlinks)
+ flags |= AT_SYMLINK_NOFOLLOW;
+ if (effective_ids)
+ flags |= AT_EACCESS;
+ result = faccessat(dir_fd, path.narrow, mode, flags);
+ }
+ else
+#endif
+ result = access(path.narrow, mode);
Py_END_ALLOW_THREADS
- Py_DECREF(opath);
- return PyBool_FromLong(res == 0);
+ return_value = PyBool_FromLong(!result);
+#endif
+
+#ifndef HAVE_FACCESSAT
+exit:
#endif
+ path_cleanup(&path);
+ return return_value;
}
#ifndef F_OK
@@ -1908,27 +2539,66 @@ posix_ctermid(PyObject *self, PyObject *noargs)
PyDoc_STRVAR(posix_chdir__doc__,
"chdir(path)\n\n\
-Change the current working directory to the specified path.");
+Change the current working directory to the specified path.\n\
+\n\
+path may always be specified as a string.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.");
static PyObject *
-posix_chdir(PyObject *self, PyObject *args)
+posix_chdir(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ path_t path;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", NULL};
+
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FCHDIR
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&:chdir", keywords,
+ path_converter, &path
+ ))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
- return win32_1str(args, "chdir", "y:chdir", win32_chdir, "U:chdir", win32_wchdir);
+ if (path.wide)
+ result = win32_wchdir(path.wide);
+ else
+ result = win32_chdir(path.narrow);
+ result = !result; /* on unix, success = 0, on windows, success = !0 */
#elif defined(PYOS_OS2) && defined(PYCC_GCC)
- return posix_1str(args, "O&:chdir", _chdir2);
-#elif defined(__VMS)
- return posix_1str(args, "O&:chdir", (int (*)(const char *))chdir);
+ result = _chdir2(path.narrow);
#else
- return posix_1str(args, "O&:chdir", chdir);
+#ifdef HAVE_FCHDIR
+ if (path.fd != -1)
+ result = fchdir(path.fd);
+ else
+#endif
+ result = chdir(path.narrow);
#endif
+ Py_END_ALLOW_THREADS
+
+ if (result) {
+ return_value = path_error("chdir", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#ifdef HAVE_FCHDIR
PyDoc_STRVAR(posix_fchdir__doc__,
-"fchdir(fildes)\n\n\
-Change to the directory of the given file descriptor. fildes must be\n\
-opened on a directory, not a file.");
+"fchdir(fd)\n\n\
+Change to the directory of the given file descriptor. fd must be\n\
+opened on a directory, not a file. Equivalent to os.chdir(fd).");
static PyObject *
posix_fchdir(PyObject *self, PyObject *fdobj)
@@ -1939,87 +2609,155 @@ posix_fchdir(PyObject *self, PyObject *fdobj)
PyDoc_STRVAR(posix_chmod__doc__,
-"chmod(path, mode)\n\n\
-Change the access permissions of a file.");
+"chmod(path, mode, *, dir_fd=None, follow_symlinks=True)\n\n\
+Change the access permissions of a file.\n\
+\n\
+path may always be specified as a string.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, chmod will modify the symbolic link itself instead of the file the\n\
+ link points to.\n\
+It is an error to use dir_fd or follow_symlinks when specifying path as\n\
+ an open file descriptor.\n\
+dir_fd and follow_symlinks may not be implemented on your platform.\n\
+ If they are unavailable, using them will raise a NotImplementedError.");
+
+static PyObject *
+posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ int mode;
+ int dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 1;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "mode", "dir_fd",
+ "follow_symlinks", NULL};
-static PyObject *
-posix_chmod(PyObject *self, PyObject *args)
-{
- PyObject *opath = NULL;
- char *path = NULL;
- int i;
- int res;
#ifdef MS_WINDOWS
DWORD attr;
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, "Ui|:chmod", &po, &i)) {
- Py_BEGIN_ALLOW_THREADS
- attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
- if (attr != 0xFFFFFFFF) {
- if (i & _S_IWRITE)
- attr &= ~FILE_ATTRIBUTE_READONLY;
- else
- attr |= FILE_ATTRIBUTE_READONLY;
- res = SetFileAttributesW(PyUnicode_AS_UNICODE(po), attr);
- }
- else
- res = 0;
- Py_END_ALLOW_THREADS
- if (!res)
- return win32_error_unicode("chmod",
- PyUnicode_AS_UNICODE(po));
- Py_INCREF(Py_None);
- return Py_None;
- }
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
+#endif
- if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
- &opath, &i))
+#ifdef HAVE_FCHMODAT
+ int fchmodat_nofollow_unsupported = 0;
+#endif
+
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FCHMOD
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|$O&p:chmod", keywords,
+ path_converter, &path,
+ &mode,
+#ifdef HAVE_FCHMODAT
+ dir_fd_converter, &dir_fd,
+#else
+ dir_fd_unavailable, &dir_fd,
+#endif
+ &follow_symlinks))
return NULL;
- path = PyBytes_AsString(opath);
+
+#if !(defined(HAVE_FCHMODAT) || defined(HAVE_LCHMOD))
+ if (follow_symlinks_specified("chmod", follow_symlinks))
+ goto exit;
+#endif
+
+#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
- attr = GetFileAttributesA(path);
- if (attr != 0xFFFFFFFF) {
- if (i & _S_IWRITE)
+ if (path.wide)
+ attr = GetFileAttributesW(path.wide);
+ else
+ attr = GetFileAttributesA(path.narrow);
+ if (attr == 0xFFFFFFFF)
+ result = 0;
+ else {
+ if (mode & _S_IWRITE)
attr &= ~FILE_ATTRIBUTE_READONLY;
else
attr |= FILE_ATTRIBUTE_READONLY;
- res = SetFileAttributesA(path, attr);
+ if (path.wide)
+ result = SetFileAttributesW(path.wide, attr);
+ else
+ result = SetFileAttributesA(path.narrow, attr);
}
- else
- res = 0;
Py_END_ALLOW_THREADS
- if (!res) {
- win32_error("chmod", path);
- Py_DECREF(opath);
- return NULL;
+
+ if (!result) {
+ return_value = win32_error_object("chmod", path.object);
+ goto exit;
}
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
#else /* MS_WINDOWS */
- if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
- &opath, &i))
- return NULL;
- path = PyBytes_AsString(opath);
Py_BEGIN_ALLOW_THREADS
- res = chmod(path, i);
+#ifdef HAVE_FCHMOD
+ if (path.fd != -1)
+ result = fchmod(path.fd, mode);
+ else
+#endif
+#ifdef HAVE_LCHMOD
+ if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD))
+ result = lchmod(path.narrow, mode);
+ else
+#endif
+#ifdef HAVE_FCHMODAT
+ if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) {
+ /*
+ * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW!
+ * The documentation specifically shows how to use it,
+ * and then says it isn't implemented yet.
+ * (true on linux with glibc 2.15, and openindiana 3.x)
+ *
+ * Once it is supported, os.chmod will automatically
+ * support dir_fd and follow_symlinks=False. (Hopefully.)
+ * Until then, we need to be careful what exception we raise.
+ */
+ result = fchmodat(dir_fd, path.narrow, mode,
+ follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW);
+ /*
+ * But wait! We can't throw the exception without allowing threads,
+ * and we can't do that in this nested scope. (Macro trickery, sigh.)
+ */
+ fchmodat_nofollow_unsupported =
+ result &&
+ ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) &&
+ !follow_symlinks;
+ }
+ else
+#endif
+ result = chmod(path.narrow, mode);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
+
+ if (result) {
+#ifdef HAVE_FCHMODAT
+ if (fchmodat_nofollow_unsupported) {
+ if (dir_fd != DEFAULT_DIR_FD)
+ dir_fd_and_follow_symlinks_invalid("chmod",
+ dir_fd, follow_symlinks);
+ else
+ follow_symlinks_specified("chmod", follow_symlinks);
+ }
+ else
#endif
+ return_value = path_error("chmod", &path);
+ goto exit;
+ }
+#endif
+
+ Py_INCREF(Py_None);
+ return_value = Py_None;
+exit:
+ path_cleanup(&path);
+ return return_value;
}
+
#ifdef HAVE_FCHMOD
PyDoc_STRVAR(posix_fchmod__doc__,
"fchmod(fd, mode)\n\n\
Change the access permissions of the file given by file\n\
-descriptor fd.");
+descriptor fd. Equivalent to os.chmod(fd, mode).");
static PyObject *
posix_fchmod(PyObject *self, PyObject *args)
@@ -2040,7 +2778,8 @@ posix_fchmod(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_lchmod__doc__,
"lchmod(path, mode)\n\n\
Change the access permissions of a file. If path is a symlink, this\n\
-affects the link itself rather than the target.");
+affects the link itself rather than the target.\n\
+Equivalent to chmod(path, mode, follow_symlinks=False).");
static PyObject *
posix_lchmod(PyObject *self, PyObject *args)
@@ -2066,28 +2805,56 @@ posix_lchmod(PyObject *self, PyObject *args)
#ifdef HAVE_CHFLAGS
PyDoc_STRVAR(posix_chflags__doc__,
-"chflags(path, flags)\n\n\
-Set file flags.");
+"chflags(path, flags, *, follow_symlinks=True)\n\n\
+Set file flags.\n\
+\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, chflags will change flags on the symbolic link itself instead of the\n\
+ file the link points to.\n\
+follow_symlinks may not be implemented on your platform. If it is\n\
+unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_chflags(PyObject *self, PyObject *args)
+posix_chflags(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *path;
+ path_t path;
unsigned long flags;
- int res;
- if (!PyArg_ParseTuple(args, "O&k:chflags",
- PyUnicode_FSConverter, &opath, &flags))
+ int follow_symlinks = 1;
+ int result;
+ PyObject *return_value;
+ static char *keywords[] = {"path", "flags", "follow_symlinks", NULL};
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&k|$i:chflags", keywords,
+ path_converter, &path,
+ &flags, &follow_symlinks))
return NULL;
- path = PyBytes_AsString(opath);
+
+#ifndef HAVE_LCHFLAGS
+ if (follow_symlinks_specified("chflags", follow_symlinks))
+ goto exit;
+#endif
+
Py_BEGIN_ALLOW_THREADS
- res = chflags(path, flags);
+#ifdef HAVE_LCHFLAGS
+ if (!follow_symlinks)
+ result = lchflags(path.narrow, flags);
+ else
+#endif
+ result = chflags(path.narrow, flags);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
+
+ if (result) {
+ return_value = path_posix_error("chflags", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
Py_INCREF(Py_None);
- return Py_None;
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#endif /* HAVE_CHFLAGS */
@@ -2095,7 +2862,8 @@ posix_chflags(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_lchflags__doc__,
"lchflags(path, flags)\n\n\
Set file flags.\n\
-This function will not follow symbolic links.");
+This function will not follow symbolic links.\n\
+Equivalent to chflags(path, flags, follow_symlinks=False).");
static PyObject *
posix_lchflags(PyObject *self, PyObject *args)
@@ -2143,6 +2911,21 @@ posix_fsync(PyObject *self, PyObject *fdobj)
}
#endif /* HAVE_FSYNC */
+#ifdef HAVE_SYNC
+PyDoc_STRVAR(posix_sync__doc__,
+"sync()\n\n\
+Force write of everything to disk.");
+
+static PyObject *
+posix_sync(PyObject *self, PyObject *noargs)
+{
+ Py_BEGIN_ALLOW_THREADS
+ sync();
+ Py_END_ALLOW_THREADS
+ Py_RETURN_NONE;
+}
+#endif
+
#ifdef HAVE_FDATASYNC
#ifdef __hpux
@@ -2164,29 +2947,105 @@ posix_fdatasync(PyObject *self, PyObject *fdobj)
#ifdef HAVE_CHOWN
PyDoc_STRVAR(posix_chown__doc__,
-"chown(path, uid, gid)\n\n\
-Change the owner and group id of path to the numeric uid and gid.");
+"chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)\n\n\
+Change the owner and group id of path to the numeric uid and gid.\n\
+\n\
+path may always be specified as a string.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, chown will modify the symbolic link itself instead of the file the\n\
+ link points to.\n\
+It is an error to use dir_fd or follow_symlinks when specifying path as\n\
+ an open file descriptor.\n\
+dir_fd and follow_symlinks may not be implemented on your platform.\n\
+ If they are unavailable, using them will raise a NotImplementedError.");
+
+static PyObject *
+posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ long uid_l, gid_l;
+ uid_t uid;
+ gid_t gid;
+ int dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 1;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "uid", "gid", "dir_fd",
+ "follow_symlinks", NULL};
-static PyObject *
-posix_chown(PyObject *self, PyObject *args)
-{
- PyObject *opath;
- char *path;
- long uid, gid;
- int res;
- if (!PyArg_ParseTuple(args, "O&ll:chown",
- PyUnicode_FSConverter, &opath,
- &uid, &gid))
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FCHOWN
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&ll|$O&p:chown", keywords,
+ path_converter, &path,
+ &uid_l, &gid_l,
+#ifdef HAVE_FCHOWNAT
+ dir_fd_converter, &dir_fd,
+#else
+ dir_fd_unavailable, &dir_fd,
+#endif
+ &follow_symlinks))
return NULL;
- path = PyBytes_AsString(opath);
+
+#if !(defined(HAVE_LCHOWN) || defined(HAVE_FCHOWNAT))
+ if (follow_symlinks_specified("chown", follow_symlinks))
+ goto exit;
+#endif
+ if (dir_fd_and_fd_invalid("chown", dir_fd, path.fd) ||
+ fd_and_follow_symlinks_invalid("chown", path.fd, follow_symlinks))
+ goto exit;
+
+#ifdef __APPLE__
+ /*
+ * This is for Mac OS X 10.3, which doesn't have lchown.
+ * (But we still have an lchown symbol because of weak-linking.)
+ * It doesn't have fchownat either. So there's no possibility
+ * of a graceful failover.
+ */
+ if ((!follow_symlinks) && (lchown == NULL)) {
+ follow_symlinks_specified("chown", follow_symlinks);
+ goto exit;
+ }
+#endif
+
Py_BEGIN_ALLOW_THREADS
- res = chown(path, (uid_t) uid, (gid_t) gid);
+ uid = (uid_t)uid_l;
+ gid = (uid_t)gid_l;
+#ifdef HAVE_FCHOWN
+ if (path.fd != -1)
+ result = fchown(path.fd, uid, gid);
+ else
+#endif
+#ifdef HAVE_LCHOWN
+ if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD))
+ result = lchown(path.narrow, uid, gid);
+ else
+#endif
+#ifdef HAVE_FCHOWNAT
+ if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks))
+ result = fchownat(dir_fd, path.narrow, uid, gid,
+ follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW);
+ else
+#endif
+ result = chown(path.narrow, uid, gid);
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
+
+ if (result) {
+ return_value = path_posix_error("chown", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
Py_INCREF(Py_None);
- return Py_None;
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#endif /* HAVE_CHOWN */
@@ -2194,7 +3053,7 @@ posix_chown(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_fchown__doc__,
"fchown(fd, uid, gid)\n\n\
Change the owner and group id of the file given by file descriptor\n\
-fd to the numeric uid and gid.");
+fd to the numeric uid and gid. Equivalent to os.chown(fd, uid, gid).");
static PyObject *
posix_fchown(PyObject *self, PyObject *args)
@@ -2217,7 +3076,8 @@ posix_fchown(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_lchown__doc__,
"lchown(path, uid, gid)\n\n\
Change the owner and group id of path to the numeric uid and gid.\n\
-This function will not follow symbolic links.");
+This function will not follow symbolic links.\n\
+Equivalent to os.chown(path, uid, gid, follow_symlinks=False).");
static PyObject *
posix_lchown(PyObject *self, PyObject *args)
@@ -2279,6 +3139,9 @@ posix_getcwd(int use_bytes)
if (wbuf2 != wbuf) free(wbuf2);
return resobj;
}
+
+ if (win32_warn_bytes_api())
+ return NULL;
#endif
Py_BEGIN_ALLOW_THREADS
@@ -2316,150 +3179,226 @@ posix_getcwd_bytes(PyObject *self)
}
#endif
+#if ((!defined(HAVE_LINK)) && defined(MS_WINDOWS))
+#define HAVE_LINK 1
+#endif
#ifdef HAVE_LINK
PyDoc_STRVAR(posix_link__doc__,
-"link(src, dst)\n\n\
-Create a hard link to a file.");
-
-static PyObject *
-posix_link(PyObject *self, PyObject *args)
-{
- return posix_2str(args, "O&O&:link", link);
-}
-#endif /* HAVE_LINK */
-
+"link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)\n\n\
+Create a hard link to a file.\n\
+\n\
+If either src_dir_fd or dst_dir_fd is not None, it should be a file\n\
+ descriptor open to a directory, and the respective path string (src or dst)\n\
+ should be relative; the path will then be relative to that directory.\n\
+If follow_symlinks is False, and the last element of src is a symbolic\n\
+ link, link will create a link to the symbolic link itself instead of the\n\
+ file the link points to.\n\
+src_dir_fd, dst_dir_fd, and follow_symlinks may not be implemented on your\n\
+ platform. If they are unavailable, using them will raise a\n\
+ NotImplementedError.");
+
+static PyObject *
+posix_link(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t src, dst;
+ int src_dir_fd = DEFAULT_DIR_FD;
+ int dst_dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 1;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd",
+ "follow_symlinks", NULL};
#ifdef MS_WINDOWS
-PyDoc_STRVAR(win32_link__doc__,
-"link(src, dst)\n\n\
-Create a hard link to a file.");
-
-static PyObject *
-win32_link(PyObject *self, PyObject *args)
-{
- PyObject *osrc, *odst;
- char *src, *dst;
- BOOL rslt;
-
- PyUnicodeObject *usrc, *udst;
- if (PyArg_ParseTuple(args, "UU:link", &usrc, &udst)) {
- Py_BEGIN_ALLOW_THREADS
- rslt = CreateHardLinkW(PyUnicode_AS_UNICODE(udst),
- PyUnicode_AS_UNICODE(usrc), NULL);
- Py_END_ALLOW_THREADS
+ BOOL result;
+#else
+ int result;
+#endif
- if (rslt == 0)
- return win32_error("link", NULL);
+ memset(&src, 0, sizeof(src));
+ memset(&dst, 0, sizeof(dst));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|O&O&p:link", keywords,
+ path_converter, &src,
+ path_converter, &dst,
+ dir_fd_converter, &src_dir_fd,
+ dir_fd_converter, &dst_dir_fd,
+ &follow_symlinks))
+ return NULL;
- Py_RETURN_NONE;
+#ifndef HAVE_LINKAT
+ if ((src_dir_fd != DEFAULT_DIR_FD) || (dst_dir_fd != DEFAULT_DIR_FD)) {
+ argument_unavailable_error("link", "src_dir_fd and dst_dir_fd");
+ goto exit;
}
+#endif
- /* Narrow strings also valid. */
- PyErr_Clear();
-
- if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc,
- PyUnicode_FSConverter, &odst))
- return NULL;
+ if ((src.narrow && dst.wide) || (src.wide && dst.narrow)) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "link: src and dst must be the same type");
+ goto exit;
+ }
- src = PyBytes_AsString(osrc);
- dst = PyBytes_AsString(odst);
+#ifdef MS_WINDOWS
+ Py_BEGIN_ALLOW_THREADS
+ if (src.wide)
+ result = CreateHardLinkW(dst.wide, src.wide, NULL);
+ else
+ result = CreateHardLinkA(dst.narrow, src.narrow, NULL);
+ Py_END_ALLOW_THREADS
+ if (!result) {
+ return_value = win32_error_object("link", dst.object);
+ goto exit;
+ }
+#else
Py_BEGIN_ALLOW_THREADS
- rslt = CreateHardLinkA(dst, src, NULL);
+#ifdef HAVE_LINKAT
+ if ((src_dir_fd != DEFAULT_DIR_FD) ||
+ (dst_dir_fd != DEFAULT_DIR_FD) ||
+ (!follow_symlinks))
+ result = linkat(src_dir_fd, src.narrow,
+ dst_dir_fd, dst.narrow,
+ follow_symlinks ? AT_SYMLINK_FOLLOW : 0);
+ else
+#endif
+ result = link(src.narrow, dst.narrow);
Py_END_ALLOW_THREADS
- Py_DECREF(osrc);
- Py_DECREF(odst);
- if (rslt == 0)
- return win32_error("link", NULL);
+ if (result) {
+ return_value = path_error("link", &dst);
+ goto exit;
+ }
+#endif
- Py_RETURN_NONE;
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+
+exit:
+ path_cleanup(&src);
+ path_cleanup(&dst);
+ return return_value;
}
-#endif /* MS_WINDOWS */
+#endif
+
PyDoc_STRVAR(posix_listdir__doc__,
-"listdir([path]) -> list_of_strings\n\n\
-Return a list containing the names of the entries in the directory.\n\
-\n\
- path: path of directory to list (default: '.')\n\
-\n\
+"listdir(path='.') -> list_of_filenames\n\n\
+Return a list containing the names of the files in the directory.\n\
The list is in arbitrary order. It does not include the special\n\
-entries '.' and '..' even if they are present in the directory.");
+entries '.' and '..' even if they are present in the directory.\n\
+\n\
+path can be specified as either str or bytes. If path is bytes,\n\
+ the filenames returned will also be bytes; in all other circumstances\n\
+ the filenames returned will be str.\n\
+On some platforms, path may also be specified as an open file descriptor;\n\
+ the file descriptor must refer to a directory.\n\
+ If this functionality is unavailable, using it raises NotImplementedError.");
static PyObject *
-posix_listdir(PyObject *self, PyObject *args)
+posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
{
- /* XXX Should redo this putting the (now four) versions of opendir
- in separate files instead of having them all here... */
-#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
+ path_t path;
+ PyObject *list = NULL;
+ static char *keywords[] = {"path", NULL};
+ int fd = -1;
- PyObject *d, *v;
- HANDLE hFindFile;
+#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
+ PyObject *v;
+ HANDLE hFindFile = INVALID_HANDLE_VALUE;
BOOL result;
WIN32_FIND_DATA FileData;
- PyObject *opath;
char namebuf[MAX_PATH+5]; /* Overallocate for \\*.*\0 */
char *bufptr = namebuf;
- Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
-
+ /* only claim to have space for MAX_PATH */
+ Py_ssize_t len = sizeof(namebuf)-5;
PyObject *po = NULL;
- if (PyArg_ParseTuple(args, "|U:listdir", &po)) {
+ wchar_t *wnamebuf = NULL;
+#elif defined(PYOS_OS2)
+#ifndef MAX_PATH
+#define MAX_PATH CCHMAXPATH
+#endif
+ char *pt;
+ PyObject *v;
+ char namebuf[MAX_PATH+5];
+ HDIR hdir = 1;
+ ULONG srchcnt = 1;
+ FILEFINDBUF3 ep;
+ APIRET rc;
+#else
+ PyObject *v;
+ DIR *dirp = NULL;
+ struct dirent *ep;
+ int return_str; /* if false, return bytes */
+#endif
+
+ memset(&path, 0, sizeof(path));
+ path.nullable = 1;
+#ifdef HAVE_FDOPENDIR
+ path.allow_fd = 1;
+ path.fd = -1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
+ path_converter, &path
+ ))
+ return NULL;
+
+ /* XXX Should redo this putting the (now four) versions of opendir
+ in separate files instead of having them all here... */
+#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
+ if (!path.narrow) {
WIN32_FIND_DATAW wFileData;
- Py_UNICODE *wnamebuf, *po_wchars;
+ wchar_t *po_wchars;
- if (po == NULL) { /* Default arg: "." */
+ if (!path.wide) { /* Default arg: "." */
po_wchars = L".";
len = 1;
} else {
- po_wchars = PyUnicode_AS_UNICODE(po);
- len = PyUnicode_GET_SIZE(po);
+ po_wchars = path.wide;
+ len = wcslen(path.wide);
}
- /* Overallocate for \\*.*\0 */
+ /* The +5 is so we can append "\\*.*\0" */
wnamebuf = malloc((len + 5) * sizeof(wchar_t));
if (!wnamebuf) {
PyErr_NoMemory();
- return NULL;
+ goto exit;
}
wcscpy(wnamebuf, po_wchars);
if (len > 0) {
- Py_UNICODE wch = wnamebuf[len-1];
+ wchar_t wch = wnamebuf[len-1];
if (wch != L'/' && wch != L'\\' && wch != L':')
wnamebuf[len++] = L'\\';
wcscpy(wnamebuf + len, L"*.*");
}
- if ((d = PyList_New(0)) == NULL) {
- free(wnamebuf);
- return NULL;
+ if ((list = PyList_New(0)) == NULL) {
+ goto exit;
}
Py_BEGIN_ALLOW_THREADS
hFindFile = FindFirstFileW(wnamebuf, &wFileData);
Py_END_ALLOW_THREADS
if (hFindFile == INVALID_HANDLE_VALUE) {
int error = GetLastError();
- if (error == ERROR_FILE_NOT_FOUND) {
- free(wnamebuf);
- return d;
- }
- Py_DECREF(d);
+ if (error == ERROR_FILE_NOT_FOUND)
+ goto exit;
+ Py_DECREF(list);
+ list = NULL;
win32_error_unicode("FindFirstFileW", wnamebuf);
- free(wnamebuf);
- return NULL;
+ goto exit;
}
do {
/* Skip over . and .. */
if (wcscmp(wFileData.cFileName, L".") != 0 &&
wcscmp(wFileData.cFileName, L"..") != 0) {
- v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName));
+ v = PyUnicode_FromWideChar(wFileData.cFileName,
+ wcslen(wFileData.cFileName));
if (v == NULL) {
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
- if (PyList_Append(d, v) != 0) {
+ if (PyList_Append(list, v) != 0) {
Py_DECREF(v);
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
Py_DECREF(v);
@@ -2470,38 +3409,16 @@ posix_listdir(PyObject *self, PyObject *args)
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
- Py_DECREF(d);
- win32_error_unicode("FindNextFileW", wnamebuf);
- FindClose(hFindFile);
- free(wnamebuf);
- return NULL;
+ Py_DECREF(list);
+ list = win32_error_unicode("FindNextFileW", wnamebuf);
+ goto exit;
}
} while (result == TRUE);
- if (FindClose(hFindFile) == FALSE) {
- Py_DECREF(d);
- win32_error_unicode("FindClose", wnamebuf);
- free(wnamebuf);
- return NULL;
- }
- free(wnamebuf);
- return d;
+ goto exit;
}
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
-
- if (!PyArg_ParseTuple(args, "O&:listdir",
- PyUnicode_FSConverter, &opath))
- return NULL;
- if (PyBytes_GET_SIZE(opath)+1 > MAX_PATH) {
- PyErr_SetString(PyExc_ValueError, "path too long");
- Py_DECREF(opath);
- return NULL;
- }
- strcpy(namebuf, PyBytes_AsString(opath));
- len = PyObject_Size(opath);
- Py_DECREF(opath);
+ strcpy(namebuf, path.narrow);
+ len = path.length;
if (len > 0) {
char ch = namebuf[len-1];
if (ch != SEP && ch != ALTSEP && ch != ':')
@@ -2509,7 +3426,7 @@ posix_listdir(PyObject *self, PyObject *args)
strcpy(namebuf + len, "*.*");
}
- if ((d = PyList_New(0)) == NULL)
+ if ((list = PyList_New(0)) == NULL)
return NULL;
Py_BEGIN_ALLOW_THREADS
@@ -2518,9 +3435,10 @@ posix_listdir(PyObject *self, PyObject *args)
if (hFindFile == INVALID_HANDLE_VALUE) {
int error = GetLastError();
if (error == ERROR_FILE_NOT_FOUND)
- return d;
- Py_DECREF(d);
- return win32_error("FindFirstFile", namebuf);
+ goto exit;
+ Py_DECREF(list);
+ list = win32_error("FindFirstFile", namebuf);
+ goto exit;
}
do {
/* Skip over . and .. */
@@ -2528,14 +3446,14 @@ posix_listdir(PyObject *self, PyObject *args)
strcmp(FileData.cFileName, "..") != 0) {
v = PyBytes_FromString(FileData.cFileName);
if (v == NULL) {
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
- if (PyList_Append(d, v) != 0) {
+ if (PyList_Append(list, v) != 0) {
Py_DECREF(v);
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
Py_DECREF(v);
@@ -2546,46 +3464,33 @@ posix_listdir(PyObject *self, PyObject *args)
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
- Py_DECREF(d);
- win32_error("FindNextFile", namebuf);
- FindClose(hFindFile);
- return NULL;
+ Py_DECREF(list);
+ list = win32_error("FindNextFile", namebuf);
+ goto exit;
}
} while (result == TRUE);
- if (FindClose(hFindFile) == FALSE) {
- Py_DECREF(d);
- return win32_error("FindClose", namebuf);
+exit:
+ if (hFindFile != INVALID_HANDLE_VALUE) {
+ if (FindClose(hFindFile) == FALSE) {
+ if (list != NULL) {
+ Py_DECREF(list);
+ list = win32_error_object("FindClose", path.object);
+ }
+ }
}
+ if (wnamebuf)
+ free(wnamebuf);
+ path_cleanup(&path);
- return d;
+ return list;
#elif defined(PYOS_OS2)
-
-#ifndef MAX_PATH
-#define MAX_PATH CCHMAXPATH
-#endif
- PyObject *oname;
- char *name, *pt;
- Py_ssize_t len;
- PyObject *d, *v;
- char namebuf[MAX_PATH+5];
- HDIR hdir = 1;
- ULONG srchcnt = 1;
- FILEFINDBUF3 ep;
- APIRET rc;
-
- if (!PyArg_ParseTuple(args, "O&:listdir",
- PyUnicode_FSConverter, &oname))
- return NULL;
- name = PyBytes_AsString(oname);
- len = PyBytes_GET_SIZE(oname);
- if (len >= MAX_PATH) {
- Py_DECREF(oname);
+ if (path.length >= MAX_PATH) {
PyErr_SetString(PyExc_ValueError, "path too long");
- return NULL;
+ goto exit;
}
- strcpy(namebuf, name);
+ strcpy(namebuf, path.narrow);
for (pt = namebuf; *pt; pt++)
if (*pt == ALTSEP)
*pt = SEP;
@@ -2593,9 +3498,8 @@ posix_listdir(PyObject *self, PyObject *args)
namebuf[len++] = SEP;
strcpy(namebuf + len, "*.*");
- if ((d = PyList_New(0)) == NULL) {
- Py_DECREF(oname);
- return NULL;
+ if ((list = PyList_New(0)) == NULL) {
+ goto exit;
}
rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
@@ -2607,7 +3511,9 @@ posix_listdir(PyObject *self, PyObject *args)
if (rc != NO_ERROR) {
errno = ENOENT;
- return posix_error_with_allocated_filename(oname);
+ Py_DECREF(list);
+ list = posix_error_with_filename(path.narrow);
+ goto exit;
}
if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
@@ -2623,55 +3529,70 @@ posix_listdir(PyObject *self, PyObject *args)
v = PyBytes_FromString(namebuf);
if (v == NULL) {
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
- if (PyList_Append(d, v) != 0) {
+ if (PyList_Append(list, v) != 0) {
Py_DECREF(v);
- Py_DECREF(d);
- d = NULL;
+ Py_DECREF(list);
+ list = NULL;
break;
}
Py_DECREF(v);
} while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
}
- Py_DECREF(oname);
- return d;
+exit:
+ path_cleanup(&path);
+
+ return list;
#else
- PyObject *oname;
- char *name;
- PyObject *d, *v;
- DIR *dirp;
- struct dirent *ep;
- int arg_is_unicode = 1;
errno = 0;
- /* v is never read, so it does not need to be initialized yet. */
- if (!PyArg_ParseTuple(args, "|U:listdir", &v)) {
- arg_is_unicode = 0;
- PyErr_Clear();
+#ifdef HAVE_FDOPENDIR
+ if (path.fd != -1) {
+ /* closedir() closes the FD, so we duplicate it */
+ Py_BEGIN_ALLOW_THREADS
+ fd = dup(path.fd);
+ Py_END_ALLOW_THREADS
+
+ if (fd == -1) {
+ list = posix_error();
+ goto exit;
+ }
+
+ return_str = 1;
+
+ Py_BEGIN_ALLOW_THREADS
+ dirp = fdopendir(fd);
+ Py_END_ALLOW_THREADS
}
- oname = NULL;
- if (!PyArg_ParseTuple(args, "|O&:listdir", PyUnicode_FSConverter, &oname))
- return NULL;
- if (oname == NULL) { /* Default arg: "." */
- oname = PyBytes_FromString(".");
+ else
+#endif
+ {
+ char *name;
+ if (path.narrow) {
+ name = path.narrow;
+ /* only return bytes if they specified a bytes object */
+ return_str = !(PyBytes_Check(path.object));
+ }
+ else {
+ name = ".";
+ return_str = 1;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ dirp = opendir(name);
+ Py_END_ALLOW_THREADS
}
- name = PyBytes_AsString(oname);
- Py_BEGIN_ALLOW_THREADS
- dirp = opendir(name);
- Py_END_ALLOW_THREADS
+
if (dirp == NULL) {
- return posix_error_with_allocated_filename(oname);
+ list = path_error("listdir", &path);
+ goto exit;
}
- if ((d = PyList_New(0)) == NULL) {
- Py_BEGIN_ALLOW_THREADS
- closedir(dirp);
- Py_END_ALLOW_THREADS
- Py_DECREF(oname);
- return NULL;
+ if ((list = PyList_New(0)) == NULL) {
+ goto exit;
}
for (;;) {
errno = 0;
@@ -2682,38 +3603,43 @@ posix_listdir(PyObject *self, PyObject *args)
if (errno == 0) {
break;
} else {
- Py_BEGIN_ALLOW_THREADS
- closedir(dirp);
- Py_END_ALLOW_THREADS
- Py_DECREF(d);
- return posix_error_with_allocated_filename(oname);
+ Py_DECREF(list);
+ list = path_error("listdir", &path);
+ goto exit;
}
}
if (ep->d_name[0] == '.' &&
(NAMLEN(ep) == 1 ||
(ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
continue;
- if (arg_is_unicode)
+ if (return_str)
v = PyUnicode_DecodeFSDefaultAndSize(ep->d_name, NAMLEN(ep));
else
v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
if (v == NULL) {
- Py_CLEAR(d);
+ Py_CLEAR(list);
break;
}
- if (PyList_Append(d, v) != 0) {
+ if (PyList_Append(list, v) != 0) {
Py_DECREF(v);
- Py_CLEAR(d);
+ Py_CLEAR(list);
break;
}
Py_DECREF(v);
}
- Py_BEGIN_ALLOW_THREADS
- closedir(dirp);
- Py_END_ALLOW_THREADS
- Py_DECREF(oname);
- return d;
+exit:
+ if (dirp != NULL) {
+ Py_BEGIN_ALLOW_THREADS
+ if (fd > -1)
+ rewinddir(dirp);
+ closedir(dirp);
+ Py_END_ALLOW_THREADS
+ }
+
+ path_cleanup(&path);
+
+ return list;
#endif /* which OS */
} /* end of posix_listdir */
@@ -2723,31 +3649,35 @@ posix_listdir(PyObject *self, PyObject *args)
static PyObject *
posix__getfullpathname(PyObject *self, PyObject *args)
{
- PyObject *opath;
- char *path;
+ const char *path;
char outbuf[MAX_PATH*2];
char *temp;
-#ifdef MS_WINDOWS
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) {
- Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
- Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
- Py_UNICODE *wtemp;
+ PyObject *po;
+
+ if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po))
+ {
+ wchar_t *wpath;
+ wchar_t woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
+ wchar_t *wtemp;
DWORD result;
PyObject *v;
+
+ wpath = PyUnicode_AsUnicode(po);
+ if (wpath == NULL)
+ return NULL;
result = GetFullPathNameW(wpath,
- sizeof(woutbuf)/sizeof(woutbuf[0]),
+ Py_ARRAY_LENGTH(woutbuf),
woutbuf, &wtemp);
- if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) {
- woutbufp = malloc(result * sizeof(Py_UNICODE));
+ if (result > Py_ARRAY_LENGTH(woutbuf)) {
+ woutbufp = malloc(result * sizeof(wchar_t));
if (!woutbufp)
return PyErr_NoMemory();
result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
}
if (result)
- v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp));
+ v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp));
else
- v = win32_error_unicode("GetFullPathNameW", wpath);
+ v = win32_error_object("GetFullPathNameW", po);
if (woutbufp != woutbuf)
free(woutbufp);
return v;
@@ -2756,18 +3686,16 @@ posix__getfullpathname(PyObject *self, PyObject *args)
are also valid. */
PyErr_Clear();
-#endif
- if (!PyArg_ParseTuple (args, "O&:_getfullpathname",
- PyUnicode_FSConverter, &opath))
+ if (!PyArg_ParseTuple (args, "y:_getfullpathname",
+ &path))
return NULL;
- path = PyBytes_AsString(opath);
- if (!GetFullPathName(path, sizeof(outbuf)/sizeof(outbuf[0]),
+ if (win32_warn_bytes_api())
+ return NULL;
+ if (!GetFullPathName(path, Py_ARRAY_LENGTH(outbuf),
outbuf, &temp)) {
win32_error("GetFullPathName", path);
- Py_DECREF(opath);
return NULL;
}
- Py_DECREF(opath);
if (PyUnicode_Check(PyTuple_GetItem(args, 0))) {
return PyUnicode_Decode(outbuf, strlen(outbuf),
Py_FileSystemDefaultEncoding, NULL);
@@ -2785,12 +3713,14 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
int buf_size;
wchar_t *target_path;
int result_length;
- PyObject *result;
+ PyObject *po, *result;
wchar_t *path;
- if (!PyArg_ParseTuple(args, "u|:_getfinalpathname", &path)) {
+ if (!PyArg_ParseTuple(args, "U|:_getfinalpathname", &po))
+ return NULL;
+ path = PyUnicode_AsUnicode(po);
+ if (path == NULL)
return NULL;
- }
if(!check_GetFinalPathNameByHandle()) {
/* If the OS doesn't have GetFinalPathNameByHandle, return a
@@ -2809,18 +3739,15 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
- if(hFile == INVALID_HANDLE_VALUE) {
- return win32_error_unicode("GetFinalPathNamyByHandle", path);
- return PyErr_Format(PyExc_RuntimeError,
- "Could not get a handle to file.");
- }
+ if(hFile == INVALID_HANDLE_VALUE)
+ return win32_error_object("CreateFileW", po);
/* We have a good handle to the target, use it to determine the
target path name. */
buf_size = Py_GetFinalPathNameByHandleW(hFile, 0, 0, VOLUME_NAME_NT);
if(!buf_size)
- return win32_error_unicode("GetFinalPathNameByHandle", path);
+ return win32_error_object("GetFinalPathNameByHandle", po);
target_path = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
if(!target_path)
@@ -2829,13 +3756,13 @@ posix__getfinalpathname(PyObject *self, PyObject *args)
result_length = Py_GetFinalPathNameByHandleW(hFile, target_path,
buf_size, VOLUME_NAME_DOS);
if(!result_length)
- return win32_error_unicode("GetFinalPathNamyByHandle", path);
+ return win32_error_object("GetFinalPathNamyByHandle", po);
if(!CloseHandle(hFile))
- return win32_error_unicode("GetFinalPathNameByHandle", path);
+ return win32_error_object("CloseHandle", po);
target_path[result_length] = 0;
- result = PyUnicode_FromUnicode(target_path, result_length);
+ result = PyUnicode_FromWideChar(target_path, result_length);
free(target_path);
return result;
@@ -2872,13 +3799,14 @@ PyDoc_STRVAR(posix__isdir__doc__,
static PyObject *
posix__isdir(PyObject *self, PyObject *args)
{
- PyObject *opath;
- char *path;
- PyUnicodeObject *po;
+ const char *path;
+ PyObject *po;
DWORD attributes;
if (PyArg_ParseTuple(args, "U|:_isdir", &po)) {
- Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
+ wchar_t *wpath = PyUnicode_AsUnicode(po);
+ if (wpath == NULL)
+ return NULL;
attributes = GetFileAttributesW(wpath);
if (attributes == INVALID_FILE_ATTRIBUTES)
@@ -2889,11 +3817,10 @@ posix__isdir(PyObject *self, PyObject *args)
are also valid. */
PyErr_Clear();
- if (!PyArg_ParseTuple(args, "O&:_isdir",
- PyUnicode_FSConverter, &opath))
+ if (!PyArg_ParseTuple(args, "y:_isdir", &path))
+ return NULL;
+ if (win32_warn_bytes_api())
return NULL;
-
- path = PyBytes_AsString(opath);
attributes = GetFileAttributesA(path);
if (attributes == INVALID_FILE_ATTRIBUTES)
Py_RETURN_FALSE;
@@ -2907,69 +3834,72 @@ check:
#endif /* MS_WINDOWS */
PyDoc_STRVAR(posix_mkdir__doc__,
-"mkdir(path [, mode=0777])\n\n\
-Create a directory.");
+"mkdir(path, mode=0o777, *, dir_fd=None)\n\n\
+Create a directory.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.\n\
+\n\
+The mode argument is ignored on Windows.");
static PyObject *
-posix_mkdir(PyObject *self, PyObject *args)
+posix_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
{
- int res;
- PyObject *opath;
- char *path;
+ path_t path;
int mode = 0777;
+ int dir_fd = DEFAULT_DIR_FD;
+ static char *keywords[] = {"path", "mode", "dir_fd", NULL};
+ PyObject *return_value = NULL;
+ int result;
-#ifdef MS_WINDOWS
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, "U|i:mkdir", &po, &mode)) {
- Py_BEGIN_ALLOW_THREADS
- /* PyUnicode_AS_UNICODE OK without thread lock as
- it is a simple dereference. */
- res = CreateDirectoryW(PyUnicode_AS_UNICODE(po), NULL);
- Py_END_ALLOW_THREADS
- if (!res)
- return win32_error_unicode("mkdir", PyUnicode_AS_UNICODE(po));
- Py_INCREF(Py_None);
- return Py_None;
- }
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
- if (!PyArg_ParseTuple(args, "O&|i:mkdir",
- PyUnicode_FSConverter, &opath, &mode))
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|i$O&:mkdir", keywords,
+ path_converter, &path, &mode,
+#ifdef HAVE_MKDIRAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
return NULL;
- path = PyBytes_AsString(opath);
+
+#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
- /* PyUnicode_AS_UNICODE OK without thread lock as
- it is a simple dereference. */
- res = CreateDirectoryA(path, NULL);
+ if (path.wide)
+ result = CreateDirectoryW(path.wide, NULL);
+ else
+ result = CreateDirectoryA(path.narrow, NULL);
Py_END_ALLOW_THREADS
- if (!res) {
- win32_error("mkdir", path);
- Py_DECREF(opath);
- return NULL;
+
+ if (!result) {
+ return_value = win32_error_object("mkdir", path.object);
+ goto exit;
}
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
#else
-
- if (!PyArg_ParseTuple(args, "O&|i:mkdir",
- PyUnicode_FSConverter, &opath, &mode))
- return NULL;
- path = PyBytes_AsString(opath);
Py_BEGIN_ALLOW_THREADS
+#if HAVE_MKDIRAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = mkdirat(dir_fd, path.narrow, mode);
+ else
+#endif
#if ( defined(__WATCOMC__) || defined(PYCC_VACPP) ) && !defined(__QNX__)
- res = mkdir(path);
+ result = mkdir(path.narrow);
#else
- res = mkdir(path, mode);
+ result = mkdir(path.narrow, mode);
#endif
Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
+ if (result < 0) {
+ return_value = path_error("mkdir", &path);
+ goto exit;
+ }
#endif
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+exit:
+ path_cleanup(&path);
+ return return_value;
}
@@ -3015,79 +3945,220 @@ posix_nice(PyObject *self, PyObject *args)
}
#endif /* HAVE_NICE */
-PyDoc_STRVAR(posix_rename__doc__,
-"rename(old, new)\n\n\
-Rename a file or directory.");
+
+#ifdef HAVE_GETPRIORITY
+PyDoc_STRVAR(posix_getpriority__doc__,
+"getpriority(which, who) -> current_priority\n\n\
+Get program scheduling priority.");
+
+static PyObject *
+posix_getpriority(PyObject *self, PyObject *args)
+{
+ int which, who, retval;
+
+ if (!PyArg_ParseTuple(args, "ii", &which, &who))
+ return NULL;
+ errno = 0;
+ retval = getpriority(which, who);
+ if (errno != 0)
+ return posix_error();
+ return PyLong_FromLong((long)retval);
+}
+#endif /* HAVE_GETPRIORITY */
+
+
+#ifdef HAVE_SETPRIORITY
+PyDoc_STRVAR(posix_setpriority__doc__,
+"setpriority(which, who, prio) -> None\n\n\
+Set program scheduling priority.");
static PyObject *
-posix_rename(PyObject *self, PyObject *args)
+posix_setpriority(PyObject *self, PyObject *args)
{
+ int which, who, prio, retval;
+
+ if (!PyArg_ParseTuple(args, "iii", &which, &who, &prio))
+ return NULL;
+ retval = setpriority(which, who, prio);
+ if (retval == -1)
+ return posix_error();
+ Py_RETURN_NONE;
+}
+#endif /* HAVE_SETPRIORITY */
+
+
+static PyObject *
+internal_rename(PyObject *args, PyObject *kwargs, int is_replace)
+{
+ char *function_name = is_replace ? "replace" : "rename";
+ path_t src;
+ path_t dst;
+ int src_dir_fd = DEFAULT_DIR_FD;
+ int dst_dir_fd = DEFAULT_DIR_FD;
+ int dir_fd_specified;
+ PyObject *return_value = NULL;
+ char format[24];
+ static char *keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL};
+
#ifdef MS_WINDOWS
- PyObject *o1, *o2;
- char *p1, *p2;
BOOL result;
- if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2))
- goto error;
- if (!convert_to_unicode(&o1))
- goto error;
- if (!convert_to_unicode(&o2)) {
- Py_DECREF(o1);
- goto error;
+ int flags = is_replace ? MOVEFILE_REPLACE_EXISTING : 0;
+#else
+ int result;
+#endif
+
+ memset(&src, 0, sizeof(src));
+ memset(&dst, 0, sizeof(dst));
+ strcpy(format, "O&O&|$O&O&:");
+ strcat(format, function_name);
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, format, keywords,
+ path_converter, &src,
+ path_converter, &dst,
+ dir_fd_converter, &src_dir_fd,
+ dir_fd_converter, &dst_dir_fd))
+ return NULL;
+
+ dir_fd_specified = (src_dir_fd != DEFAULT_DIR_FD) ||
+ (dst_dir_fd != DEFAULT_DIR_FD);
+#ifndef HAVE_RENAMEAT
+ if (dir_fd_specified) {
+ argument_unavailable_error(function_name, "src_dir_fd and dst_dir_fd");
+ goto exit;
+ }
+#endif
+
+ if ((src.narrow && dst.wide) || (src.wide && dst.narrow)) {
+ PyErr_Format(PyExc_ValueError,
+ "%s: src and dst must be the same type", function_name);
+ goto exit;
}
+
+#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
- result = MoveFileW(PyUnicode_AsUnicode(o1),
- PyUnicode_AsUnicode(o2));
+ if (src.wide)
+ result = MoveFileExW(src.wide, dst.wide, flags);
+ else
+ result = MoveFileExA(src.narrow, dst.narrow, flags);
Py_END_ALLOW_THREADS
- Py_DECREF(o1);
- Py_DECREF(o2);
- if (!result)
- return win32_error("rename", NULL);
- Py_INCREF(Py_None);
- return Py_None;
-error:
- PyErr_Clear();
- if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2))
- return NULL;
+
+ if (!result) {
+ return_value = win32_error_object(function_name, dst.object);
+ goto exit;
+ }
+
+#else
Py_BEGIN_ALLOW_THREADS
- result = MoveFileA(p1, p2);
+#ifdef HAVE_RENAMEAT
+ if (dir_fd_specified)
+ result = renameat(src_dir_fd, src.narrow, dst_dir_fd, dst.narrow);
+ else
+#endif
+ result = rename(src.narrow, dst.narrow);
Py_END_ALLOW_THREADS
- if (!result)
- return win32_error("rename", NULL);
- Py_INCREF(Py_None);
- return Py_None;
-#else
- return posix_2str(args, "O&O&:rename", rename);
+
+ if (result) {
+ return_value = path_error(function_name, &dst);
+ goto exit;
+ }
#endif
-}
+ Py_INCREF(Py_None);
+ return_value = Py_None;
+exit:
+ path_cleanup(&src);
+ path_cleanup(&dst);
+ return return_value;
+}
-PyDoc_STRVAR(posix_rmdir__doc__,
-"rmdir(path)\n\n\
-Remove a directory.");
+PyDoc_STRVAR(posix_rename__doc__,
+"rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\n\n\
+Rename a file or directory.\n\
+\n\
+If either src_dir_fd or dst_dir_fd is not None, it should be a file\n\
+ descriptor open to a directory, and the respective path string (src or dst)\n\
+ should be relative; the path will then be relative to that directory.\n\
+src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n\
+ If they are unavailable, using them will raise a NotImplementedError.");
static PyObject *
-posix_rmdir(PyObject *self, PyObject *args)
+posix_rename(PyObject *self, PyObject *args, PyObject *kwargs)
{
-#ifdef MS_WINDOWS
- return win32_1str(args, "rmdir", "y:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW);
-#else
- return posix_1str(args, "O&:rmdir", rmdir);
-#endif
+ return internal_rename(args, kwargs, 0);
}
+PyDoc_STRVAR(posix_replace__doc__,
+"replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)\n\n\
+Rename a file or directory, overwriting the destination.\n\
+\n\
+If either src_dir_fd or dst_dir_fd is not None, it should be a file\n\
+ descriptor open to a directory, and the respective path string (src or dst)\n\
+ should be relative; the path will then be relative to that directory.\n\
+src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n\
+ If they are unavailable, using them will raise a NotImplementedError.");
-PyDoc_STRVAR(posix_stat__doc__,
-"stat(path) -> stat result\n\n\
-Perform a stat system call on the given path.");
+static PyObject *
+posix_replace(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ return internal_rename(args, kwargs, 1);
+}
+
+PyDoc_STRVAR(posix_rmdir__doc__,
+"rmdir(path, *, dir_fd=None)\n\n\
+Remove a directory.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_stat(PyObject *self, PyObject *args)
+posix_rmdir(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ path_t path;
+ int dir_fd = DEFAULT_DIR_FD;
+ static char *keywords[] = {"path", "dir_fd", NULL};
+ int result;
+ PyObject *return_value = NULL;
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:rmdir", keywords,
+ path_converter, &path,
+#ifdef HAVE_UNLINKAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
- return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_stat_w);
+ if (path.wide)
+ result = RemoveDirectoryW(path.wide);
+ else
+ result = RemoveDirectoryA(path.narrow);
+ result = !result; /* Windows, success=1, UNIX, success=0 */
#else
- return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL);
+#ifdef HAVE_UNLINKAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = unlinkat(dir_fd, path.narrow, AT_REMOVEDIR);
+ else
#endif
+ result = rmdir(path.narrow);
+#endif
+ Py_END_ALLOW_THREADS
+
+ if (result) {
+ return_value = path_error("rmdir", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
@@ -3179,163 +4250,468 @@ BOOL WINAPI Py_DeleteFileW(LPCWSTR lpFileName)
#endif /* MS_WINDOWS */
PyDoc_STRVAR(posix_unlink__doc__,
-"unlink(path)\n\n\
-Remove a file (same as remove(path)).");
+"unlink(path, *, dir_fd=None)\n\n\
+Remove a file (same as remove()).\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
PyDoc_STRVAR(posix_remove__doc__,
-"remove(path)\n\n\
-Remove a file (same as unlink(path)).");
+"remove(path, *, dir_fd=None)\n\n\
+Remove a file (same as unlink()).\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_unlink(PyObject *self, PyObject *args)
+posix_unlink(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ path_t path;
+ int dir_fd = DEFAULT_DIR_FD;
+ static char *keywords[] = {"path", "dir_fd", NULL};
+ int result;
+ PyObject *return_value = NULL;
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:unlink", keywords,
+ path_converter, &path,
+#ifdef HAVE_UNLINKAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
- return win32_1str(args, "remove", "y:remove", DeleteFileA,
- "U:remove", Py_DeleteFileW);
+ if (path.wide)
+ result = Py_DeleteFileW(path.wide);
+ else
+ result = DeleteFileA(path.narrow);
+ result = !result; /* Windows, success=1, UNIX, success=0 */
#else
- return posix_1str(args, "O&:remove", unlink);
+#ifdef HAVE_UNLINKAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = unlinkat(dir_fd, path.narrow, 0);
+ else
+#endif /* HAVE_UNLINKAT */
+ result = unlink(path.narrow);
#endif
+ Py_END_ALLOW_THREADS
+
+ if (result) {
+ return_value = path_error("unlink", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
-#ifdef HAVE_UNAME
PyDoc_STRVAR(posix_uname__doc__,
-"uname() -> (sysname, nodename, release, version, machine)\n\n\
-Return a tuple identifying the current operating system.");
+"uname() -> uname_result\n\n\
+Return an object identifying the current operating system.\n\
+The object behaves like a named tuple with the following fields:\n\
+ (sysname, nodename, release, version, machine)");
+
+static PyStructSequence_Field uname_result_fields[] = {
+ {"sysname", "operating system name"},
+ {"nodename", "name of machine on network (implementation-defined)"},
+ {"release", "operating system release"},
+ {"version", "operating system version"},
+ {"machine", "hardware identifier"},
+ {NULL}
+};
+
+PyDoc_STRVAR(uname_result__doc__,
+"uname_result: Result from os.uname().\n\n\
+This object may be accessed either as a tuple of\n\
+ (sysname, nodename, release, version, machine),\n\
+or via the attributes sysname, nodename, release, version, and machine.\n\
+\n\
+See os.uname for more information.");
+
+static PyStructSequence_Desc uname_result_desc = {
+ "uname_result", /* name */
+ uname_result__doc__, /* doc */
+ uname_result_fields,
+ 5
+};
+static PyTypeObject UnameResultType;
+
+
+#ifdef HAVE_UNAME
static PyObject *
posix_uname(PyObject *self, PyObject *noargs)
{
struct utsname u;
int res;
+ PyObject *value;
Py_BEGIN_ALLOW_THREADS
res = uname(&u);
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
- return Py_BuildValue("(sssss)",
- u.sysname,
- u.nodename,
- u.release,
- u.version,
- u.machine);
+
+ value = PyStructSequence_New(&UnameResultType);
+ if (value == NULL)
+ return NULL;
+
+#define SET(i, field) \
+ { \
+ PyObject *o = PyUnicode_DecodeASCII(field, strlen(field), NULL); \
+ if (!o) { \
+ Py_DECREF(value); \
+ return NULL; \
+ } \
+ PyStructSequence_SET_ITEM(value, i, o); \
+ } \
+
+ SET(0, u.sysname);
+ SET(1, u.nodename);
+ SET(2, u.release);
+ SET(3, u.version);
+ SET(4, u.machine);
+
+#undef SET
+
+ return value;
}
#endif /* HAVE_UNAME */
+
+PyDoc_STRVAR(posix_utime__doc__,
+"utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True)\n\
+Set the access and modified time of path.\n\
+\n\
+path may always be specified as a string.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.\n\
+\n\
+If times is not None, it must be a tuple (atime, mtime);\n\
+ atime and mtime should be expressed as float seconds since the epoch.\n\
+If ns is not None, it must be a tuple (atime_ns, mtime_ns);\n\
+ atime_ns and mtime_ns should be expressed as integer nanoseconds\n\
+ since the epoch.\n\
+If both times and ns are None, utime uses the current time.\n\
+Specifying tuples for both times and ns is an error.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, utime will modify the symbolic link itself instead of the file the\n\
+ link points to.\n\
+It is an error to use dir_fd or follow_symlinks when specifying path\n\
+ as an open file descriptor.\n\
+dir_fd and follow_symlinks may not be available on your platform.\n\
+ If they are unavailable, using them will raise a NotImplementedError.");
+
+typedef struct {
+ int now;
+ time_t atime_s;
+ long atime_ns;
+ time_t mtime_s;
+ long mtime_ns;
+} utime_t;
+
+/*
+ * these macros assume that "utime" is a pointer to a utime_t
+ * they also intentionally leak the declaration of a pointer named "time"
+ */
+#define UTIME_TO_TIMESPEC \
+ struct timespec ts[2]; \
+ struct timespec *time; \
+ if (utime->now) \
+ time = NULL; \
+ else { \
+ ts[0].tv_sec = utime->atime_s; \
+ ts[0].tv_nsec = utime->atime_ns; \
+ ts[1].tv_sec = utime->mtime_s; \
+ ts[1].tv_nsec = utime->mtime_ns; \
+ time = ts; \
+ } \
+
+#define UTIME_TO_TIMEVAL \
+ struct timeval tv[2]; \
+ struct timeval *time; \
+ if (utime->now) \
+ time = NULL; \
+ else { \
+ tv[0].tv_sec = utime->atime_s; \
+ tv[0].tv_usec = utime->atime_ns / 1000; \
+ tv[1].tv_sec = utime->mtime_s; \
+ tv[1].tv_usec = utime->mtime_ns / 1000; \
+ time = tv; \
+ } \
+
+#define UTIME_TO_UTIMBUF \
+ struct utimbuf u[2]; \
+ struct utimbuf *time; \
+ if (utime->now) \
+ time = NULL; \
+ else { \
+ u.actime = utime->atime_s; \
+ u.modtime = utime->mtime_s; \
+ time = u; \
+ }
+
+#define UTIME_TO_TIME_T \
+ time_t timet[2]; \
+ struct timet time; \
+ if (utime->now) \
+ time = NULL; \
+ else { \
+ timet[0] = utime->atime_s; \
+ timet[1] = utime->mtime_s; \
+ time = &timet; \
+ } \
+
+
+#define UTIME_HAVE_DIR_FD (defined(HAVE_FUTIMESAT) || defined(HAVE_UTIMENSAT))
+
+#if UTIME_HAVE_DIR_FD
+
+static int
+utime_dir_fd(utime_t *utime, int dir_fd, char *path, int follow_symlinks)
+{
+#ifdef HAVE_UTIMENSAT
+ int flags = follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW;
+ UTIME_TO_TIMESPEC;
+ return utimensat(dir_fd, path, time, flags);
+#elif defined(HAVE_FUTIMESAT)
+ UTIME_TO_TIMEVAL;
+ /*
+ * follow_symlinks will never be false here;
+ * we only allow !follow_symlinks and dir_fd together
+ * if we have utimensat()
+ */
+ assert(follow_symlinks);
+ return futimesat(dir_fd, path, time);
+#endif
+}
+
+#endif
+
+#define UTIME_HAVE_FD (defined(HAVE_FUTIMES) || defined(HAVE_FUTIMENS))
+
+#if UTIME_HAVE_FD
+
static int
-extract_time(PyObject *t, time_t* sec, long* usec)
+utime_fd(utime_t *utime, int fd)
{
- time_t intval;
- if (PyFloat_Check(t)) {
- double tval = PyFloat_AsDouble(t);
- PyObject *intobj = PyNumber_Long(t);
- if (!intobj)
- return -1;
-#if SIZEOF_TIME_T > SIZEOF_LONG
- intval = PyLong_AsUnsignedLongLongMask(intobj);
+#ifdef HAVE_FUTIMENS
+ UTIME_TO_TIMESPEC;
+ return futimens(fd, time);
#else
- intval = PyLong_AsLong(intobj);
+ UTIME_TO_TIMEVAL;
+ return futimes(fd, time);
#endif
- Py_DECREF(intobj);
- if (intval == -1 && PyErr_Occurred())
- return -1;
- *sec = intval;
- *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */
- if (*usec < 0)
- /* If rounding gave us a negative number,
- truncate. */
- *usec = 0;
- return 0;
- }
-#if SIZEOF_TIME_T > SIZEOF_LONG
- intval = PyLong_AsUnsignedLongLongMask(t);
+}
+
+#endif
+
+
+#define UTIME_HAVE_NOFOLLOW_SYMLINKS \
+ (defined(HAVE_UTIMENSAT) || defined(HAVE_LUTIMES))
+
+#if UTIME_HAVE_NOFOLLOW_SYMLINKS
+
+static int
+utime_nofollow_symlinks(utime_t *utime, char *path)
+{
+#ifdef HAVE_UTIMENSAT
+ UTIME_TO_TIMESPEC;
+ return utimensat(DEFAULT_DIR_FD, path, time, AT_SYMLINK_NOFOLLOW);
#else
- intval = PyLong_AsLong(t);
+ UTIME_TO_TIMEVAL;
+ return lutimes(path, time);
#endif
- if (intval == -1 && PyErr_Occurred())
- return -1;
- *sec = intval;
- *usec = 0;
- return 0;
}
-PyDoc_STRVAR(posix_utime__doc__,
-"utime(path, (atime, mtime))\n\
-utime(path, None)\n\n\
-Set the access and modified time of the file to the given values. If the\n\
-second form is used, set the access and modified times to the current time.");
+#endif
+
+#ifndef MS_WINDOWS
+
+static int
+utime_default(utime_t *utime, char *path)
+{
+#ifdef HAVE_UTIMENSAT
+ UTIME_TO_TIMESPEC;
+ return utimensat(DEFAULT_DIR_FD, path, time, 0);
+#elif defined(HAVE_UTIMES)
+ UTIME_TO_TIMEVAL;
+ return utimes(path, time);
+#elif defined(HAVE_UTIME_H)
+ UTIME_TO_UTIMBUF;
+ return utime(path, time);
+#else
+ UTIME_TO_TIME_T;
+ return utime(path, time);
+#endif
+}
+
+#endif
+
+static int
+split_py_long_to_s_and_ns(PyObject *py_long, time_t *s, long *ns)
+{
+ int result = 0;
+ PyObject *divmod;
+ divmod = PyNumber_Divmod(py_long, billion);
+ if (!divmod)
+ goto exit;
+ *s = _PyLong_AsTime_t(PyTuple_GET_ITEM(divmod, 0));
+ if ((*s == -1) && PyErr_Occurred())
+ goto exit;
+ *ns = PyLong_AsLong(PyTuple_GET_ITEM(divmod, 1));
+ if ((*ns == -1) && PyErr_Occurred())
+ goto exit;
+
+ result = 1;
+exit:
+ Py_XDECREF(divmod);
+ return result;
+}
static PyObject *
-posix_utime(PyObject *self, PyObject *args)
+posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ path_t path;
+ PyObject *times = NULL;
+ PyObject *ns = NULL;
+ int dir_fd = DEFAULT_DIR_FD;
+ int follow_symlinks = 1;
+ char *keywords[] = {"path", "times", "ns", "dir_fd",
+ "follow_symlinks", NULL};
+
+ utime_t utime;
+
#ifdef MS_WINDOWS
- PyObject *arg;
- PyUnicodeObject *obwpath;
- wchar_t *wpath = NULL;
- PyObject *oapath;
- char *apath;
HANDLE hFile;
- time_t atimesec, mtimesec;
- long ausec, musec;
FILETIME atime, mtime;
- PyObject *result = NULL;
+#else
+ int result;
+#endif
- if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
- wpath = PyUnicode_AS_UNICODE(obwpath);
- Py_BEGIN_ALLOW_THREADS
- hFile = CreateFileW(wpath, FILE_WRITE_ATTRIBUTES, 0,
+ PyObject *return_value = NULL;
+
+ memset(&path, 0, sizeof(path));
+#if UTIME_HAVE_FD
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
+ "O&|O$OO&p:utime", keywords,
+ path_converter, &path,
+ &times, &ns,
+#if UTIME_HAVE_DIR_FD
+ dir_fd_converter, &dir_fd,
+#else
+ dir_fd_unavailable, &dir_fd,
+#endif
+ &follow_symlinks
+ ))
+ return NULL;
+
+ if (times && (times != Py_None) && ns) {
+ PyErr_SetString(PyExc_ValueError,
+ "utime: you may specify either 'times'"
+ " or 'ns' but not both");
+ goto exit;
+ }
+
+ if (times && (times != Py_None)) {
+ if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) {
+ PyErr_SetString(PyExc_TypeError,
+ "utime: 'times' must be either"
+ " a tuple of two ints or None");
+ goto exit;
+ }
+ utime.now = 0;
+ if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0),
+ &utime.atime_s, &utime.atime_ns) == -1 ||
+ _PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
+ &utime.mtime_s, &utime.mtime_ns) == -1) {
+ goto exit;
+ }
+ }
+ else if (ns) {
+ if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {
+ PyErr_SetString(PyExc_TypeError,
+ "utime: 'ns' must be a tuple of two ints");
+ goto exit;
+ }
+ utime.now = 0;
+ if (!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 0),
+ &utime.atime_s, &utime.atime_ns) ||
+ !split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 1),
+ &utime.mtime_s, &utime.mtime_ns)) {
+ goto exit;
+ }
+ }
+ else {
+ /* times and ns are both None/unspecified. use "now". */
+ utime.now = 1;
+ }
+
+#if !UTIME_HAVE_NOFOLLOW_SYMLINKS
+ if (follow_symlinks_specified("utime", follow_symlinks))
+ goto exit;
+#endif
+
+ if (path_and_dir_fd_invalid("utime", &path, dir_fd) ||
+ dir_fd_and_fd_invalid("utime", dir_fd, path.fd) ||
+ fd_and_follow_symlinks_invalid("utime", path.fd, follow_symlinks))
+ goto exit;
+
+#if !defined(HAVE_UTIMENSAT)
+ if ((dir_fd != DEFAULT_DIR_FD) && (!follow_symlinks)) {
+ PyErr_SetString(PyExc_ValueError,
+ "utime: cannot use dir_fd and follow_symlinks "
+ "together on this platform");
+ goto exit;
+ }
+#endif
+
+#ifdef MS_WINDOWS
+ Py_BEGIN_ALLOW_THREADS
+ if (path.wide)
+ hFile = CreateFileW(path.wide, FILE_WRITE_ATTRIBUTES, 0,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
- Py_END_ALLOW_THREADS
- if (hFile == INVALID_HANDLE_VALUE)
- return win32_error_unicode("utime", wpath);
- } else
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
-
- if (!wpath) {
- if (!PyArg_ParseTuple(args, "O&O:utime",
- PyUnicode_FSConverter, &oapath, &arg))
- return NULL;
- apath = PyBytes_AsString(oapath);
- Py_BEGIN_ALLOW_THREADS
- hFile = CreateFileA(apath, FILE_WRITE_ATTRIBUTES, 0,
+ else
+ hFile = CreateFileA(path.narrow, FILE_WRITE_ATTRIBUTES, 0,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
- Py_END_ALLOW_THREADS
- if (hFile == INVALID_HANDLE_VALUE) {
- win32_error("utime", apath);
- Py_DECREF(oapath);
- return NULL;
- }
- Py_DECREF(oapath);
+ Py_END_ALLOW_THREADS
+ if (hFile == INVALID_HANDLE_VALUE) {
+ win32_error_object("utime", path.object);
+ goto exit;
}
- if (arg == Py_None) {
+ if (utime.now) {
SYSTEMTIME now;
GetSystemTime(&now);
if (!SystemTimeToFileTime(&now, &mtime) ||
!SystemTimeToFileTime(&now, &atime)) {
win32_error("utime", NULL);
- goto done;
+ goto exit;
}
}
- else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
- PyErr_SetString(PyExc_TypeError,
- "utime() arg 2 must be a tuple (atime, mtime)");
- goto done;
- }
else {
- if (extract_time(PyTuple_GET_ITEM(arg, 0),
- &atimesec, &ausec) == -1)
- goto done;
- time_t_to_FILE_TIME(atimesec, 1000*ausec, &atime);
- if (extract_time(PyTuple_GET_ITEM(arg, 1),
- &mtimesec, &musec) == -1)
- goto done;
- time_t_to_FILE_TIME(mtimesec, 1000*musec, &mtime);
+ time_t_to_FILE_TIME(utime.atime_s, utime.atime_ns, &atime);
+ time_t_to_FILE_TIME(utime.mtime_s, utime.mtime_ns, &mtime);
}
if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
/* Avoid putting the file name into the error here,
@@ -3343,93 +4719,52 @@ posix_utime(PyObject *self, PyObject *args)
something is wrong with the file, when it also
could be the time stamp that gives a problem. */
win32_error("utime", NULL);
- goto done;
+ goto exit;
}
- Py_INCREF(Py_None);
- result = Py_None;
-done:
- CloseHandle(hFile);
- return result;
#else /* MS_WINDOWS */
+ Py_BEGIN_ALLOW_THREADS
- PyObject *opath;
- char *path;
- time_t atime, mtime;
- long ausec, musec;
- int res;
- PyObject* arg;
+#if UTIME_HAVE_NOFOLLOW_SYMLINKS
+ if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD))
+ result = utime_nofollow_symlinks(&utime, path.narrow);
+ else
+#endif
-#if defined(HAVE_UTIMES)
- struct timeval buf[2];
-#define ATIME buf[0].tv_sec
-#define MTIME buf[1].tv_sec
-#elif defined(HAVE_UTIME_H)
-/* XXX should define struct utimbuf instead, above */
- struct utimbuf buf;
-#define ATIME buf.actime
-#define MTIME buf.modtime
-#define UTIME_ARG &buf
-#else /* HAVE_UTIMES */
- time_t buf[2];
-#define ATIME buf[0]
-#define MTIME buf[1]
-#define UTIME_ARG buf
-#endif /* HAVE_UTIMES */
-
-
- if (!PyArg_ParseTuple(args, "O&O:utime",
- PyUnicode_FSConverter, &opath, &arg))
- return NULL;
- path = PyBytes_AsString(opath);
- if (arg == Py_None) {
- /* optional time values not given */
- Py_BEGIN_ALLOW_THREADS
- res = utime(path, NULL);
- Py_END_ALLOW_THREADS
- }
- else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
- PyErr_SetString(PyExc_TypeError,
- "utime() arg 2 must be a tuple (atime, mtime)");
- Py_DECREF(opath);
- return NULL;
- }
- else {
- if (extract_time(PyTuple_GET_ITEM(arg, 0),
- &atime, &ausec) == -1) {
- Py_DECREF(opath);
- return NULL;
- }
- if (extract_time(PyTuple_GET_ITEM(arg, 1),
- &mtime, &musec) == -1) {
- Py_DECREF(opath);
- return NULL;
- }
- ATIME = atime;
- MTIME = mtime;
-#ifdef HAVE_UTIMES
- buf[0].tv_usec = ausec;
- buf[1].tv_usec = musec;
- Py_BEGIN_ALLOW_THREADS
- res = utimes(path, buf);
- Py_END_ALLOW_THREADS
-#else
- Py_BEGIN_ALLOW_THREADS
- res = utime(path, UTIME_ARG);
- Py_END_ALLOW_THREADS
-#endif /* HAVE_UTIMES */
- }
- if (res < 0) {
- return posix_error_with_allocated_filename(opath);
+#if UTIME_HAVE_DIR_FD
+ if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks))
+ result = utime_dir_fd(&utime, dir_fd, path.narrow, follow_symlinks);
+ else
+#endif
+
+#if UTIME_HAVE_FD
+ if (path.fd != -1)
+ result = utime_fd(&utime, path.fd);
+ else
+#endif
+
+ result = utime_default(&utime, path.narrow);
+
+ Py_END_ALLOW_THREADS
+
+ if (result < 0) {
+ /* see previous comment about not putting filename in error here */
+ return_value = posix_error();
+ goto exit;
}
- Py_DECREF(opath);
- Py_INCREF(Py_None);
- return Py_None;
-#undef UTIME_ARG
-#undef ATIME
-#undef MTIME
+
#endif /* MS_WINDOWS */
-}
+ Py_INCREF(Py_None);
+ return_value = Py_None;
+
+exit:
+ path_cleanup(&path);
+#ifdef MS_WINDOWS
+ if (hFile != INVALID_HANDLE_VALUE)
+ CloseHandle(hFile);
+#endif
+ return return_value;
+}
/* Process operations */
@@ -3474,79 +4809,7 @@ int fsconvert_strdup(PyObject *o, char**out)
}
#endif
-
-#ifdef HAVE_EXECV
-PyDoc_STRVAR(posix_execv__doc__,
-"execv(path, args)\n\n\
-Execute an executable path with arguments, replacing current process.\n\
-\n\
- path: path of executable file\n\
- args: tuple or list of strings");
-
-static PyObject *
-posix_execv(PyObject *self, PyObject *args)
-{
- PyObject *opath;
- char *path;
- PyObject *argv;
- char **argvlist;
- Py_ssize_t i, argc;
- PyObject *(*getitem)(PyObject *, Py_ssize_t);
-
- /* execv has two arguments: (path, argv), where
- argv is a list or tuple of strings. */
-
- if (!PyArg_ParseTuple(args, "O&O:execv",
- PyUnicode_FSConverter,
- &opath, &argv))
- return NULL;
- path = PyBytes_AsString(opath);
- if (PyList_Check(argv)) {
- argc = PyList_Size(argv);
- getitem = PyList_GetItem;
- }
- else if (PyTuple_Check(argv)) {
- argc = PyTuple_Size(argv);
- getitem = PyTuple_GetItem;
- }
- else {
- PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
- Py_DECREF(opath);
- return NULL;
- }
- if (argc < 1) {
- PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
- Py_DECREF(opath);
- return NULL;
- }
-
- argvlist = PyMem_NEW(char *, argc+1);
- if (argvlist == NULL) {
- Py_DECREF(opath);
- return PyErr_NoMemory();
- }
- for (i = 0; i < argc; i++) {
- if (!fsconvert_strdup((*getitem)(argv, i),
- &argvlist[i])) {
- free_string_array(argvlist, i);
- PyErr_SetString(PyExc_TypeError,
- "execv() arg 2 must contain only strings");
- Py_DECREF(opath);
- return NULL;
-
- }
- }
- argvlist[argc] = NULL;
-
- execv(path, argvlist);
-
- /* If we get here it's definitely an error */
-
- free_string_array(argvlist, argc);
- Py_DECREF(opath);
- return posix_error();
-}
-
+#if defined(HAVE_EXECV) || defined (HAVE_FEXECVE)
static char**
parse_envlist(PyObject* env, Py_ssize_t *envc_ptr)
{
@@ -3628,87 +4891,162 @@ error:
return NULL;
}
+static char**
+parse_arglist(PyObject* argv, Py_ssize_t *argc)
+{
+ int i;
+ char **argvlist = PyMem_NEW(char *, *argc+1);
+ if (argvlist == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ for (i = 0; i < *argc; i++) {
+ PyObject* item = PySequence_ITEM(argv, i);
+ if (item == NULL)
+ goto fail;
+ if (!fsconvert_strdup(item, &argvlist[i])) {
+ Py_DECREF(item);
+ goto fail;
+ }
+ Py_DECREF(item);
+ }
+ argvlist[*argc] = NULL;
+ return argvlist;
+fail:
+ *argc = i;
+ free_string_array(argvlist, *argc);
+ return NULL;
+}
+#endif
+
+#ifdef HAVE_EXECV
+PyDoc_STRVAR(posix_execv__doc__,
+"execv(path, args)\n\n\
+Execute an executable path with arguments, replacing current process.\n\
+\n\
+ path: path of executable file\n\
+ args: tuple or list of strings");
+
+static PyObject *
+posix_execv(PyObject *self, PyObject *args)
+{
+ PyObject *opath;
+ char *path;
+ PyObject *argv;
+ char **argvlist;
+ Py_ssize_t argc;
+
+ /* execv has two arguments: (path, argv), where
+ argv is a list or tuple of strings. */
+
+ if (!PyArg_ParseTuple(args, "O&O:execv",
+ PyUnicode_FSConverter,
+ &opath, &argv))
+ return NULL;
+ path = PyBytes_AsString(opath);
+ if (!PyList_Check(argv) && !PyTuple_Check(argv)) {
+ PyErr_SetString(PyExc_TypeError,
+ "execv() arg 2 must be a tuple or list");
+ Py_DECREF(opath);
+ return NULL;
+ }
+ argc = PySequence_Size(argv);
+ if (argc < 1) {
+ PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
+ Py_DECREF(opath);
+ return NULL;
+ }
+
+ argvlist = parse_arglist(argv, &argc);
+ if (argvlist == NULL) {
+ Py_DECREF(opath);
+ return NULL;
+ }
+
+ execv(path, argvlist);
+
+ /* If we get here it's definitely an error */
+
+ free_string_array(argvlist, argc);
+ Py_DECREF(opath);
+ return posix_error();
+}
+
PyDoc_STRVAR(posix_execve__doc__,
"execve(path, args, env)\n\n\
Execute a path with arguments and environment, replacing current process.\n\
\n\
path: path of executable file\n\
args: tuple or list of arguments\n\
- env: dictionary of strings mapping to strings");
+ env: dictionary of strings mapping to strings\n\
+\n\
+On some platforms, you may specify an open file descriptor for path;\n\
+ execve will execute the program the file descriptor is open to.\n\
+ If this functionality is unavailable, using it raises NotImplementedError.");
static PyObject *
-posix_execve(PyObject *self, PyObject *args)
+posix_execve(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *path;
+ path_t path;
PyObject *argv, *env;
- char **argvlist;
+ char **argvlist = NULL;
char **envlist;
- Py_ssize_t i, argc, envc;
- PyObject *(*getitem)(PyObject *, Py_ssize_t);
- Py_ssize_t lastarg = 0;
+ Py_ssize_t argc, envc;
+ static char *keywords[] = {"path", "argv", "environment", NULL};
/* execve has three arguments: (path, argv, env), where
argv is a list or tuple of strings and env is a dictionary
like posix.environ. */
- if (!PyArg_ParseTuple(args, "O&OO:execve",
- PyUnicode_FSConverter,
- &opath, &argv, &env))
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FEXECVE
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&OO:execve", keywords,
+ path_converter, &path,
+ &argv, &env
+ ))
return NULL;
- path = PyBytes_AsString(opath);
- if (PyList_Check(argv)) {
- argc = PyList_Size(argv);
- getitem = PyList_GetItem;
- }
- else if (PyTuple_Check(argv)) {
- argc = PyTuple_Size(argv);
- getitem = PyTuple_GetItem;
- }
- else {
+
+ if (!PyList_Check(argv) && !PyTuple_Check(argv)) {
PyErr_SetString(PyExc_TypeError,
- "execve() arg 2 must be a tuple or list");
- goto fail_0;
+ "execve: argv must be a tuple or list");
+ goto fail;
}
+ argc = PySequence_Size(argv);
if (!PyMapping_Check(env)) {
PyErr_SetString(PyExc_TypeError,
- "execve() arg 3 must be a mapping object");
- goto fail_0;
+ "execve: environment must be a mapping object");
+ goto fail;
}
- argvlist = PyMem_NEW(char *, argc+1);
+ argvlist = parse_arglist(argv, &argc);
if (argvlist == NULL) {
- PyErr_NoMemory();
- goto fail_0;
- }
- for (i = 0; i < argc; i++) {
- if (!fsconvert_strdup((*getitem)(argv, i),
- &argvlist[i]))
- {
- lastarg = i;
- goto fail_1;
- }
+ goto fail;
}
- lastarg = argc;
- argvlist[argc] = NULL;
envlist = parse_envlist(env, &envc);
if (envlist == NULL)
- goto fail_1;
+ goto fail;
- execve(path, argvlist, envlist);
+#ifdef HAVE_FEXECVE
+ if (path.fd > -1)
+ fexecve(path.fd, argvlist, envlist);
+ else
+#endif
+ execve(path.narrow, argvlist, envlist);
/* If we get here it's definitely an error */
- (void) posix_error();
+ path_posix_error("execve", &path);
while (--envc >= 0)
PyMem_DEL(envlist[envc]);
PyMem_DEL(envlist);
- fail_1:
- free_string_array(argvlist, lastarg);
- fail_0:
- Py_DECREF(opath);
+ fail:
+ if (argvlist)
+ free_string_array(argvlist, argc);
+ path_cleanup(&path);
return NULL;
}
#endif /* HAVE_EXECV */
@@ -4153,6 +5491,405 @@ posix_fork(PyObject *self, PyObject *noargs)
}
#endif
+#ifdef HAVE_SCHED_H
+
+#ifdef HAVE_SCHED_GET_PRIORITY_MAX
+
+PyDoc_STRVAR(posix_sched_get_priority_max__doc__,
+"sched_get_priority_max(policy)\n\n\
+Get the maximum scheduling priority for *policy*.");
+
+static PyObject *
+posix_sched_get_priority_max(PyObject *self, PyObject *args)
+{
+ int policy, max;
+
+ if (!PyArg_ParseTuple(args, "i:sched_get_priority_max", &policy))
+ return NULL;
+ max = sched_get_priority_max(policy);
+ if (max < 0)
+ return posix_error();
+ return PyLong_FromLong(max);
+}
+
+PyDoc_STRVAR(posix_sched_get_priority_min__doc__,
+"sched_get_priority_min(policy)\n\n\
+Get the minimum scheduling priority for *policy*.");
+
+static PyObject *
+posix_sched_get_priority_min(PyObject *self, PyObject *args)
+{
+ int policy, min;
+
+ if (!PyArg_ParseTuple(args, "i:sched_get_priority_min", &policy))
+ return NULL;
+ min = sched_get_priority_min(policy);
+ if (min < 0)
+ return posix_error();
+ return PyLong_FromLong(min);
+}
+
+#endif /* HAVE_SCHED_GET_PRIORITY_MAX */
+
+#ifdef HAVE_SCHED_SETSCHEDULER
+
+PyDoc_STRVAR(posix_sched_getscheduler__doc__,
+"sched_getscheduler(pid)\n\n\
+Get the scheduling policy for the process with a PID of *pid*.\n\
+Passing a PID of 0 returns the scheduling policy for the calling process.");
+
+static PyObject *
+posix_sched_getscheduler(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ int policy;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":sched_getscheduler", &pid))
+ return NULL;
+ policy = sched_getscheduler(pid);
+ if (policy < 0)
+ return posix_error();
+ return PyLong_FromLong(policy);
+}
+
+#endif
+
+#if defined(HAVE_SCHED_SETSCHEDULER) || defined(HAVE_SCHED_SETPARAM)
+
+static PyObject *
+sched_param_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *res, *priority;
+ static char *kwlist[] = {"sched_priority", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:sched_param", kwlist, &priority))
+ return NULL;
+ res = PyStructSequence_New(type);
+ if (!res)
+ return NULL;
+ Py_INCREF(priority);
+ PyStructSequence_SET_ITEM(res, 0, priority);
+ return res;
+}
+
+PyDoc_STRVAR(sched_param__doc__,
+"sched_param(sched_priority): A scheduling parameter.\n\n\
+Current has only one field: sched_priority");
+
+static PyStructSequence_Field sched_param_fields[] = {
+ {"sched_priority", "the scheduling priority"},
+ {0}
+};
+
+static PyStructSequence_Desc sched_param_desc = {
+ "sched_param", /* name */
+ sched_param__doc__, /* doc */
+ sched_param_fields,
+ 1
+};
+
+static int
+convert_sched_param(PyObject *param, struct sched_param *res)
+{
+ long priority;
+
+ if (Py_TYPE(param) != &SchedParamType) {
+ PyErr_SetString(PyExc_TypeError, "must have a sched_param object");
+ return 0;
+ }
+ priority = PyLong_AsLong(PyStructSequence_GET_ITEM(param, 0));
+ if (priority == -1 && PyErr_Occurred())
+ return 0;
+ if (priority > INT_MAX || priority < INT_MIN) {
+ PyErr_SetString(PyExc_OverflowError, "sched_priority out of range");
+ return 0;
+ }
+ res->sched_priority = Py_SAFE_DOWNCAST(priority, long, int);
+ return 1;
+}
+
+#endif
+
+#ifdef HAVE_SCHED_SETSCHEDULER
+
+PyDoc_STRVAR(posix_sched_setscheduler__doc__,
+"sched_setscheduler(pid, policy, param)\n\n\
+Set the scheduling policy, *policy*, for *pid*.\n\
+If *pid* is 0, the calling process is changed.\n\
+*param* is an instance of sched_param.");
+
+static PyObject *
+posix_sched_setscheduler(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ int policy;
+ struct sched_param param;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID "iO&:sched_setscheduler",
+ &pid, &policy, &convert_sched_param, &param))
+ return NULL;
+
+ /*
+ ** sched_setscheduler() returns 0 in Linux, but the previous
+ ** scheduling policy under Solaris/Illumos, and others.
+ ** On error, -1 is returned in all Operating Systems.
+ */
+ if (sched_setscheduler(pid, policy, &param) == -1)
+ return posix_error();
+ Py_RETURN_NONE;
+}
+
+#endif
+
+#ifdef HAVE_SCHED_SETPARAM
+
+PyDoc_STRVAR(posix_sched_getparam__doc__,
+"sched_getparam(pid) -> sched_param\n\n\
+Returns scheduling parameters for the process with *pid* as an instance of the\n\
+sched_param class. A PID of 0 means the calling process.");
+
+static PyObject *
+posix_sched_getparam(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ struct sched_param param;
+ PyObject *res, *priority;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":sched_getparam", &pid))
+ return NULL;
+ if (sched_getparam(pid, &param))
+ return posix_error();
+ res = PyStructSequence_New(&SchedParamType);
+ if (!res)
+ return NULL;
+ priority = PyLong_FromLong(param.sched_priority);
+ if (!priority) {
+ Py_DECREF(res);
+ return NULL;
+ }
+ PyStructSequence_SET_ITEM(res, 0, priority);
+ return res;
+}
+
+PyDoc_STRVAR(posix_sched_setparam__doc__,
+"sched_setparam(pid, param)\n\n\
+Set scheduling parameters for a process with PID *pid*.\n\
+A PID of 0 means the calling process.");
+
+static PyObject *
+posix_sched_setparam(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ struct sched_param param;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID "O&:sched_setparam",
+ &pid, &convert_sched_param, &param))
+ return NULL;
+ if (sched_setparam(pid, &param))
+ return posix_error();
+ Py_RETURN_NONE;
+}
+
+#endif
+
+#ifdef HAVE_SCHED_RR_GET_INTERVAL
+
+PyDoc_STRVAR(posix_sched_rr_get_interval__doc__,
+"sched_rr_get_interval(pid) -> float\n\n\
+Return the round-robin quantum for the process with PID *pid* in seconds.");
+
+static PyObject *
+posix_sched_rr_get_interval(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ struct timespec interval;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":sched_rr_get_interval", &pid))
+ return NULL;
+ if (sched_rr_get_interval(pid, &interval))
+ return posix_error();
+ return PyFloat_FromDouble((double)interval.tv_sec + 1e-9*interval.tv_nsec);
+}
+
+#endif
+
+PyDoc_STRVAR(posix_sched_yield__doc__,
+"sched_yield()\n\n\
+Voluntarily relinquish the CPU.");
+
+static PyObject *
+posix_sched_yield(PyObject *self, PyObject *noargs)
+{
+ if (sched_yield())
+ return posix_error();
+ Py_RETURN_NONE;
+}
+
+#ifdef HAVE_SCHED_SETAFFINITY
+
+/* The minimum number of CPUs allocated in a cpu_set_t */
+static const int NCPUS_START = sizeof(unsigned long) * CHAR_BIT;
+
+PyDoc_STRVAR(posix_sched_setaffinity__doc__,
+"sched_setaffinity(pid, cpu_set)\n\n\
+Set the affinity of the process with PID *pid* to *cpu_set*.");
+
+static PyObject *
+posix_sched_setaffinity(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ int ncpus;
+ size_t setsize;
+ cpu_set_t *mask = NULL;
+ PyObject *iterable, *iterator = NULL, *item;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID "O:sched_setaffinity",
+ &pid, &iterable))
+ return NULL;
+
+ iterator = PyObject_GetIter(iterable);
+ if (iterator == NULL)
+ return NULL;
+
+ ncpus = NCPUS_START;
+ setsize = CPU_ALLOC_SIZE(ncpus);
+ mask = CPU_ALLOC(ncpus);
+ if (mask == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ CPU_ZERO_S(setsize, mask);
+
+ while ((item = PyIter_Next(iterator))) {
+ long cpu;
+ if (!PyLong_Check(item)) {
+ PyErr_Format(PyExc_TypeError,
+ "expected an iterator of ints, "
+ "but iterator yielded %R",
+ Py_TYPE(item));
+ Py_DECREF(item);
+ goto error;
+ }
+ cpu = PyLong_AsLong(item);
+ Py_DECREF(item);
+ if (cpu < 0) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_ValueError, "negative CPU number");
+ goto error;
+ }
+ if (cpu > INT_MAX - 1) {
+ PyErr_SetString(PyExc_OverflowError, "CPU number too large");
+ goto error;
+ }
+ if (cpu >= ncpus) {
+ /* Grow CPU mask to fit the CPU number */
+ int newncpus = ncpus;
+ cpu_set_t *newmask;
+ size_t newsetsize;
+ while (newncpus <= cpu) {
+ if (newncpus > INT_MAX / 2)
+ newncpus = cpu + 1;
+ else
+ newncpus = newncpus * 2;
+ }
+ newmask = CPU_ALLOC(newncpus);
+ if (newmask == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ newsetsize = CPU_ALLOC_SIZE(newncpus);
+ CPU_ZERO_S(newsetsize, newmask);
+ memcpy(newmask, mask, setsize);
+ CPU_FREE(mask);
+ setsize = newsetsize;
+ mask = newmask;
+ ncpus = newncpus;
+ }
+ CPU_SET_S(cpu, setsize, mask);
+ }
+ Py_CLEAR(iterator);
+
+ if (sched_setaffinity(pid, setsize, mask)) {
+ posix_error();
+ goto error;
+ }
+ CPU_FREE(mask);
+ Py_RETURN_NONE;
+
+error:
+ if (mask)
+ CPU_FREE(mask);
+ Py_XDECREF(iterator);
+ return NULL;
+}
+
+PyDoc_STRVAR(posix_sched_getaffinity__doc__,
+"sched_getaffinity(pid, ncpus) -> cpu_set\n\n\
+Return the affinity of the process with PID *pid*.\n\
+The returned cpu_set will be of size *ncpus*.");
+
+static PyObject *
+posix_sched_getaffinity(PyObject *self, PyObject *args)
+{
+ pid_t pid;
+ int cpu, ncpus, count;
+ size_t setsize;
+ cpu_set_t *mask = NULL;
+ PyObject *res = NULL;
+
+ if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":sched_getaffinity",
+ &pid))
+ return NULL;
+
+ ncpus = NCPUS_START;
+ while (1) {
+ setsize = CPU_ALLOC_SIZE(ncpus);
+ mask = CPU_ALLOC(ncpus);
+ if (mask == NULL)
+ return PyErr_NoMemory();
+ if (sched_getaffinity(pid, setsize, mask) == 0)
+ break;
+ CPU_FREE(mask);
+ if (errno != EINVAL)
+ return posix_error();
+ if (ncpus > INT_MAX / 2) {
+ PyErr_SetString(PyExc_OverflowError, "could not allocate "
+ "a large enough CPU set");
+ return NULL;
+ }
+ ncpus = ncpus * 2;
+ }
+
+ res = PySet_New(NULL);
+ if (res == NULL)
+ goto error;
+ for (cpu = 0, count = CPU_COUNT_S(setsize, mask); count; cpu++) {
+ if (CPU_ISSET_S(cpu, setsize, mask)) {
+ PyObject *cpu_num = PyLong_FromLong(cpu);
+ --count;
+ if (cpu_num == NULL)
+ goto error;
+ if (PySet_Add(res, cpu_num)) {
+ Py_DECREF(cpu_num);
+ goto error;
+ }
+ Py_DECREF(cpu_num);
+ }
+ }
+ CPU_FREE(mask);
+ return res;
+
+error:
+ if (mask)
+ CPU_FREE(mask);
+ Py_XDECREF(res);
+ return NULL;
+}
+
+#endif /* HAVE_SCHED_SETAFFINITY */
+
+#endif /* HAVE_SCHED_H */
+
/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */
/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */
#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX)
@@ -4279,6 +6016,7 @@ posix_forkpty(PyObject *self, PyObject *noargs)
}
#endif
+
#ifdef HAVE_GETEGID
PyDoc_STRVAR(posix_getegid__doc__,
"getegid() -> egid\n\n\
@@ -4328,6 +6066,70 @@ posix_getpid(PyObject *self, PyObject *noargs)
return PyLong_FromPid(getpid());
}
+#ifdef HAVE_GETGROUPLIST
+PyDoc_STRVAR(posix_getgrouplist__doc__,
+"getgrouplist(user, group) -> list of groups to which a user belongs\n\n\
+Returns a list of groups to which a user belongs.\n\n\
+ user: username to lookup\n\
+ group: base group id of the user");
+
+static PyObject *
+posix_getgrouplist(PyObject *self, PyObject *args)
+{
+#ifdef NGROUPS_MAX
+#define MAX_GROUPS NGROUPS_MAX
+#else
+ /* defined to be 16 on Solaris7, so this should be a small number */
+#define MAX_GROUPS 64
+#endif
+
+ const char *user;
+ int i, ngroups;
+ PyObject *list;
+#ifdef __APPLE__
+ int *groups, basegid;
+#else
+ gid_t *groups, basegid;
+#endif
+ ngroups = MAX_GROUPS;
+
+ if (!PyArg_ParseTuple(args, "si", &user, &basegid))
+ return NULL;
+
+#ifdef __APPLE__
+ groups = PyMem_Malloc(ngroups * sizeof(int));
+#else
+ groups = PyMem_Malloc(ngroups * sizeof(gid_t));
+#endif
+ if (groups == NULL)
+ return PyErr_NoMemory();
+
+ if (getgrouplist(user, basegid, groups, &ngroups) == -1) {
+ PyMem_Del(groups);
+ return posix_error();
+ }
+
+ list = PyList_New(ngroups);
+ if (list == NULL) {
+ PyMem_Del(groups);
+ return NULL;
+ }
+
+ for (i = 0; i < ngroups; i++) {
+ PyObject *o = PyLong_FromUnsignedLong((unsigned long)groups[i]);
+ if (o == NULL) {
+ Py_DECREF(list);
+ PyMem_Del(groups);
+ return NULL;
+ }
+ PyList_SET_ITEM(list, i, o);
+ }
+
+ PyMem_Del(groups);
+
+ return list;
+}
+#endif
#ifdef HAVE_GETGROUPS
PyDoc_STRVAR(posix_getgroups__doc__,
@@ -4565,7 +6367,7 @@ posix_getlogin(PyObject *self, PyObject *noargs)
PyObject *result = NULL;
#ifdef MS_WINDOWS
wchar_t user_name[UNLEN + 1];
- DWORD num_chars = sizeof(user_name)/sizeof(user_name[0]);
+ DWORD num_chars = Py_ARRAY_LENGTH(user_name);
if (GetUserNameW(user_name, &num_chars)) {
/* num_chars is the number of unicode chars plus null terminator */
@@ -4965,6 +6767,7 @@ wait_helper(pid_t pid, int status, struct rusage *ru)
{
PyObject *result;
static PyObject *struct_rusage;
+ _Py_IDENTIFIER(struct_rusage);
if (pid == -1)
return posix_error();
@@ -4973,7 +6776,7 @@ wait_helper(pid_t pid, int status, struct rusage *ru)
PyObject *m = PyImport_ImportModuleNoBlock("resource");
if (m == NULL)
return NULL;
- struct_rusage = PyObject_GetAttrString(m, "struct_rusage");
+ struct_rusage = _PyObject_GetAttrId(m, &PyId_struct_rusage);
Py_DECREF(m);
if (struct_rusage == NULL)
return NULL;
@@ -5069,6 +6872,55 @@ posix_wait4(PyObject *self, PyObject *args)
}
#endif /* HAVE_WAIT4 */
+#if defined(HAVE_WAITID) && !defined(__APPLE__)
+PyDoc_STRVAR(posix_waitid__doc__,
+"waitid(idtype, id, options) -> waitid_result\n\n\
+Wait for the completion of one or more child processes.\n\n\
+idtype can be P_PID, P_PGID or P_ALL.\n\
+id specifies the pid to wait on.\n\
+options is constructed from the ORing of one or more of WEXITED, WSTOPPED\n\
+or WCONTINUED and additionally may be ORed with WNOHANG or WNOWAIT.\n\
+Returns either waitid_result or None if WNOHANG is specified and there are\n\
+no children in a waitable state.");
+
+static PyObject *
+posix_waitid(PyObject *self, PyObject *args)
+{
+ PyObject *result;
+ idtype_t idtype;
+ id_t id;
+ int options, res;
+ siginfo_t si;
+ si.si_pid = 0;
+ if (!PyArg_ParseTuple(args, "i" _Py_PARSE_PID "i:waitid", &idtype, &id, &options))
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+ res = waitid(idtype, id, &si, options);
+ Py_END_ALLOW_THREADS
+ if (res == -1)
+ return posix_error();
+
+ if (si.si_pid == 0)
+ Py_RETURN_NONE;
+
+ result = PyStructSequence_New(&WaitidResultType);
+ if (!result)
+ return NULL;
+
+ PyStructSequence_SET_ITEM(result, 0, PyLong_FromPid(si.si_pid));
+ PyStructSequence_SET_ITEM(result, 1, PyLong_FromPid(si.si_uid));
+ PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si.si_signo)));
+ PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong((long)(si.si_status)));
+ PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong((long)(si.si_code)));
+ if (PyErr_Occurred()) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+#endif
+
#ifdef HAVE_WAITPID
PyDoc_STRVAR(posix_waitpid__doc__,
"waitpid(pid, options) -> (pid, status)\n\n\
@@ -5142,106 +6994,226 @@ posix_wait(PyObject *self, PyObject *noargs)
#endif
-PyDoc_STRVAR(posix_lstat__doc__,
-"lstat(path) -> stat result\n\n\
-Like stat(path), but do not follow symbolic links.");
+#if defined(HAVE_READLINK) || defined(MS_WINDOWS)
+PyDoc_STRVAR(readlink__doc__,
+"readlink(path, *, dir_fd=None) -> path\n\n\
+Return a string representing the path to which the symbolic link points.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
+#endif
+
+#ifdef HAVE_READLINK
static PyObject *
-posix_lstat(PyObject *self, PyObject *args)
+posix_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
{
-#ifdef HAVE_LSTAT
- return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL);
-#else /* !HAVE_LSTAT */
-#ifdef MS_WINDOWS
- return posix_do_stat(self, args, "O&:lstat", win32_lstat, "U:lstat",
- win32_lstat_w);
+ path_t path;
+ int dir_fd = DEFAULT_DIR_FD;
+ char buffer[MAXPATHLEN];
+ ssize_t length;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "dir_fd", NULL};
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&:readlink", keywords,
+ path_converter, &path,
+#ifdef HAVE_READLINKAT
+ dir_fd_converter, &dir_fd
#else
- return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL);
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+#ifdef HAVE_READLINKAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ length = readlinkat(dir_fd, path.narrow, buffer, sizeof(buffer));
+ else
#endif
-#endif /* !HAVE_LSTAT */
+ length = readlink(path.narrow, buffer, sizeof(buffer));
+ Py_END_ALLOW_THREADS
+
+ if (length < 0) {
+ return_value = path_posix_error("readlink", &path);
+ goto exit;
+ }
+
+ if (PyUnicode_Check(path.object))
+ return_value = PyUnicode_DecodeFSDefaultAndSize(buffer, length);
+ else
+ return_value = PyBytes_FromStringAndSize(buffer, length);
+exit:
+ path_cleanup(&path);
+ return return_value;
}
-#ifdef HAVE_READLINK
-PyDoc_STRVAR(posix_readlink__doc__,
-"readlink(path) -> path\n\n\
-Return a string representing the path to which the symbolic link points.");
+#endif /* HAVE_READLINK */
+
+
+#ifdef HAVE_SYMLINK
+PyDoc_STRVAR(posix_symlink__doc__,
+"symlink(src, dst, target_is_directory=False, *, dir_fd=None)\n\n\
+Create a symbolic link pointing to src named dst.\n\n\
+target_is_directory is required on Windows if the target is to be\n\
+ interpreted as a directory. (On Windows, symlink requires\n\
+ Windows 6.0 or greater, and raises a NotImplementedError otherwise.)\n\
+ target_is_directory is ignored on non-Windows platforms.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
+
+#if defined(MS_WINDOWS)
+
+/* Grab CreateSymbolicLinkW dynamically from kernel32 */
+static DWORD (CALLBACK *Py_CreateSymbolicLinkW)(LPWSTR, LPWSTR, DWORD) = NULL;
+static DWORD (CALLBACK *Py_CreateSymbolicLinkA)(LPSTR, LPSTR, DWORD) = NULL;
+static int
+check_CreateSymbolicLink()
+{
+ HINSTANCE hKernel32;
+ /* only recheck */
+ if (Py_CreateSymbolicLinkW && Py_CreateSymbolicLinkA)
+ return 1;
+ hKernel32 = GetModuleHandleW(L"KERNEL32");
+ *(FARPROC*)&Py_CreateSymbolicLinkW = GetProcAddress(hKernel32,
+ "CreateSymbolicLinkW");
+ *(FARPROC*)&Py_CreateSymbolicLinkA = GetProcAddress(hKernel32,
+ "CreateSymbolicLinkA");
+ return (Py_CreateSymbolicLinkW && Py_CreateSymbolicLinkA);
+}
+
+#endif
static PyObject *
-posix_readlink(PyObject *self, PyObject *args)
+posix_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject* v;
- char buf[MAXPATHLEN];
- PyObject *opath;
- char *path;
- int n;
- int arg_is_unicode = 0;
+ path_t src;
+ path_t dst;
+ int dir_fd = DEFAULT_DIR_FD;
+ int target_is_directory = 0;
+ static char *keywords[] = {"src", "dst", "target_is_directory",
+ "dir_fd", NULL};
+ PyObject *return_value;
+#ifdef MS_WINDOWS
+ DWORD result;
+#else
+ int result;
+#endif
- if (!PyArg_ParseTuple(args, "O&:readlink",
- PyUnicode_FSConverter, &opath))
- return NULL;
- path = PyBytes_AsString(opath);
- v = PySequence_GetItem(args, 0);
- if (v == NULL) {
- Py_DECREF(opath);
+ memset(&src, 0, sizeof(src));
+ src.argument_name = "src";
+ memset(&dst, 0, sizeof(dst));
+ dst.argument_name = "dst";
+
+#ifdef MS_WINDOWS
+ if (!check_CreateSymbolicLink()) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "CreateSymbolicLink functions not found");
+ return NULL;
+ }
+ if (!win32_can_symlink) {
+ PyErr_SetString(PyExc_OSError, "symbolic link privilege not held");
+ return NULL;
+ }
+#endif
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|i$O&:symlink",
+ keywords,
+ path_converter, &src,
+ path_converter, &dst,
+ &target_is_directory,
+#ifdef HAVE_SYMLINKAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
return NULL;
- }
- if (PyUnicode_Check(v)) {
- arg_is_unicode = 1;
+ if ((src.narrow && dst.wide) || (src.wide && dst.narrow)) {
+ PyErr_SetString(PyExc_ValueError,
+ "symlink: src and dst must be the same type");
+ return_value = NULL;
+ goto exit;
}
- Py_DECREF(v);
+#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
- n = readlink(path, buf, (int) sizeof buf);
+ if (dst.wide)
+ result = Py_CreateSymbolicLinkW(dst.wide, src.wide,
+ target_is_directory);
+ else
+ result = Py_CreateSymbolicLinkA(dst.narrow, src.narrow,
+ target_is_directory);
Py_END_ALLOW_THREADS
- if (n < 0)
- return posix_error_with_allocated_filename(opath);
- Py_DECREF(opath);
- if (arg_is_unicode)
- return PyUnicode_DecodeFSDefaultAndSize(buf, n);
- else
- return PyBytes_FromStringAndSize(buf, n);
-}
-#endif /* HAVE_READLINK */
+ if (!result) {
+ return_value = win32_error_object("symlink", src.object);
+ goto exit;
+ }
+#else
-#if defined(HAVE_SYMLINK) && !defined(MS_WINDOWS)
-PyDoc_STRVAR(posix_symlink__doc__,
-"symlink(src, dst)\n\n\
-Create a symbolic link pointing to src named dst.");
+ Py_BEGIN_ALLOW_THREADS
+#if HAVE_SYMLINKAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = symlinkat(src.narrow, dir_fd, dst.narrow);
+ else
+#endif
+ result = symlink(src.narrow, dst.narrow);
+ Py_END_ALLOW_THREADS
-static PyObject *
-posix_symlink(PyObject *self, PyObject *args)
-{
- return posix_2str(args, "O&O&:symlink", symlink);
+ if (result) {
+ return_value = path_error("symlink", &dst);
+ goto exit;
+ }
+#endif
+
+ return_value = Py_None;
+ Py_INCREF(Py_None);
+ goto exit; /* silence "unused label" warning */
+exit:
+ path_cleanup(&src);
+ path_cleanup(&dst);
+ return return_value;
}
+
#endif /* HAVE_SYMLINK */
-#if !defined(HAVE_READLINK) && defined(MS_WINDOWS)
-PyDoc_STRVAR(win_readlink__doc__,
-"readlink(path) -> path\n\n\
-Return a string representing the path to which the symbolic link points.");
+#if !defined(HAVE_READLINK) && defined(MS_WINDOWS)
-/* Windows readlink implementation */
static PyObject *
-win_readlink(PyObject *self, PyObject *args)
+win_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
{
wchar_t *path;
DWORD n_bytes_returned;
DWORD io_result;
- PyObject *result;
+ PyObject *po, *result;
+ int dir_fd;
HANDLE reparse_point_handle;
char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer;
wchar_t *print_name;
- if (!PyArg_ParseTuple(args,
- "u:readlink",
- &path))
+ static char *keywords[] = {"path", "dir_fd", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "U|$O&:readlink", keywords,
+ &po,
+ dir_fd_unavailable, &dir_fd
+ ))
+ return NULL;
+
+ path = PyUnicode_AsUnicode(po);
+ if (path == NULL)
return NULL;
/* First get a handle to the reparse point */
@@ -5257,9 +7229,7 @@ win_readlink(PyObject *self, PyObject *args)
Py_END_ALLOW_THREADS
if (reparse_point_handle==INVALID_HANDLE_VALUE)
- {
- return win32_error_unicode("readlink", path);
- }
+ return win32_error_object("readlink", po);
Py_BEGIN_ALLOW_THREADS
/* New call DeviceIoControl to read the reparse point */
@@ -5275,9 +7245,7 @@ win_readlink(PyObject *self, PyObject *args)
Py_END_ALLOW_THREADS
if (io_result==0)
- {
- return win32_error_unicode("readlink", path);
- }
+ return win32_error_object("readlink", po);
if (rdb->ReparseTag != IO_REPARSE_TAG_SYMLINK)
{
@@ -5295,80 +7263,76 @@ win_readlink(PyObject *self, PyObject *args)
#endif /* !defined(HAVE_READLINK) && defined(MS_WINDOWS) */
-#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS)
-/* Grab CreateSymbolicLinkW dynamically from kernel32 */
-static int has_CreateSymbolicLinkW = 0;
-static DWORD (CALLBACK *Py_CreateSymbolicLinkW)(LPWSTR, LPWSTR, DWORD);
-static int
-check_CreateSymbolicLinkW()
-{
- HINSTANCE hKernel32;
- /* only recheck */
- if (has_CreateSymbolicLinkW)
- return has_CreateSymbolicLinkW;
- hKernel32 = GetModuleHandle("KERNEL32");
- *(FARPROC*)&Py_CreateSymbolicLinkW = GetProcAddress(hKernel32,
- "CreateSymbolicLinkW");
- if (Py_CreateSymbolicLinkW)
- has_CreateSymbolicLinkW = 1;
- return has_CreateSymbolicLinkW;
-}
+static PyStructSequence_Field times_result_fields[] = {
+ {"user", "user time"},
+ {"system", "system time"},
+ {"children_user", "user time of children"},
+ {"children_system", "system time of children"},
+ {"elapsed", "elapsed time since an arbitrary point in the past"},
+ {NULL}
+};
-PyDoc_STRVAR(win_symlink__doc__,
-"symlink(src, dst, target_is_directory=False)\n\n\
-Create a symbolic link pointing to src named dst.\n\
-target_is_directory is required if the target is to be interpreted as\n\
-a directory.\n\
-This function requires Windows 6.0 or greater, and raises a\n\
-NotImplementedError otherwise.");
+PyDoc_STRVAR(times_result__doc__,
+"times_result: Result from os.times().\n\n\
+This object may be accessed either as a tuple of\n\
+ (user, system, children_user, children_system, elapsed),\n\
+or via the attributes user, system, children_user, children_system,\n\
+and elapsed.\n\
+\n\
+See os.times for more information.");
+
+static PyStructSequence_Desc times_result_desc = {
+ "times_result", /* name */
+ times_result__doc__, /* doc */
+ times_result_fields,
+ 5
+};
+
+static PyTypeObject TimesResultType;
+
+#ifdef MS_WINDOWS
+#define HAVE_TIMES /* mandatory, for the method table */
+#endif
+
+#ifdef HAVE_TIMES
static PyObject *
-win_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
+build_times_result(double user, double system,
+ double children_user, double children_system,
+ double elapsed)
{
- static char *kwlist[] = {"src", "dest", "target_is_directory", NULL};
- PyObject *src, *dest;
- int target_is_directory = 0;
- DWORD res;
-
- if (!check_CreateSymbolicLinkW())
- {
- /* raise NotImplementedError */
- return PyErr_Format(PyExc_NotImplementedError,
- "CreateSymbolicLinkW not found");
- }
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i:symlink",
- kwlist, &src, &dest, &target_is_directory))
+ PyObject *value = PyStructSequence_New(&TimesResultType);
+ if (value == NULL)
return NULL;
- if (win32_can_symlink == 0)
- return PyErr_Format(PyExc_OSError, "symbolic link privilege not held");
+#define SET(i, field) \
+ { \
+ PyObject *o = PyFloat_FromDouble(field); \
+ if (!o) { \
+ Py_DECREF(value); \
+ return NULL; \
+ } \
+ PyStructSequence_SET_ITEM(value, i, o); \
+ } \
- if (!convert_to_unicode(&src)) { return NULL; }
- if (!convert_to_unicode(&dest)) {
- Py_DECREF(src);
- return NULL;
- }
+ SET(0, user);
+ SET(1, system);
+ SET(2, children_user);
+ SET(3, children_system);
+ SET(4, elapsed);
- Py_BEGIN_ALLOW_THREADS
- res = Py_CreateSymbolicLinkW(
- PyUnicode_AsUnicode(dest),
- PyUnicode_AsUnicode(src),
- target_is_directory);
- Py_END_ALLOW_THREADS
- Py_DECREF(src);
- Py_DECREF(dest);
- if (!res)
- {
- return win32_error_unicode("symlink", PyUnicode_AsUnicode(src));
- }
+#undef SET
- Py_INCREF(Py_None);
- return Py_None;
+ return value;
}
-#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */
-#ifdef HAVE_TIMES
+PyDoc_STRVAR(posix_times__doc__,
+"times() -> times_result\n\n\
+Return an object containing floating point numbers indicating process\n\
+times. The object behaves like a named tuple with these fields:\n\
+ (utime, stime, cutime, cstime, elapsed_time)");
+
#if defined(PYCC_VACPP) && defined(PYOS_OS2)
static long
system_uptime(void)
@@ -5386,38 +7350,14 @@ static PyObject *
posix_times(PyObject *self, PyObject *noargs)
{
/* Currently Only Uptime is Provided -- Others Later */
- return Py_BuildValue("ddddd",
+ return build_times_result(
(double)0 /* t.tms_utime / HZ */,
(double)0 /* t.tms_stime / HZ */,
(double)0 /* t.tms_cutime / HZ */,
(double)0 /* t.tms_cstime / HZ */,
(double)system_uptime() / 1000);
}
-#else /* not OS2 */
-#define NEED_TICKS_PER_SECOND
-static long ticks_per_second = -1;
-static PyObject *
-posix_times(PyObject *self, PyObject *noargs)
-{
- struct tms t;
- clock_t c;
- errno = 0;
- c = times(&t);
- if (c == (clock_t) -1)
- return posix_error();
- return Py_BuildValue("ddddd",
- (double)t.tms_utime / ticks_per_second,
- (double)t.tms_stime / ticks_per_second,
- (double)t.tms_cutime / ticks_per_second,
- (double)t.tms_cstime / ticks_per_second,
- (double)c / ticks_per_second);
-}
-#endif /* not OS2 */
-#endif /* HAVE_TIMES */
-
-
-#ifdef MS_WINDOWS
-#define HAVE_TIMES /* so the method table will pick it up */
+#elif defined(MS_WINDOWS)
static PyObject *
posix_times(PyObject *self, PyObject *noargs)
{
@@ -5430,8 +7370,7 @@ posix_times(PyObject *self, PyObject *noargs)
1e7 is one second in such units; 1e-7 the inverse.
429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
*/
- return Py_BuildValue(
- "ddddd",
+ return build_times_result(
(double)(user.dwHighDateTime*429.4967296 +
user.dwLowDateTime*1e-7),
(double)(kernel.dwHighDateTime*429.4967296 +
@@ -5440,14 +7379,29 @@ posix_times(PyObject *self, PyObject *noargs)
(double)0,
(double)0);
}
-#endif /* MS_WINDOWS */
-
-#ifdef HAVE_TIMES
-PyDoc_STRVAR(posix_times__doc__,
-"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\
-Return a tuple of floating point numbers indicating process times.");
+#else /* Neither Windows nor OS/2 */
+#define NEED_TICKS_PER_SECOND
+static long ticks_per_second = -1;
+static PyObject *
+posix_times(PyObject *self, PyObject *noargs)
+{
+ struct tms t;
+ clock_t c;
+ errno = 0;
+ c = times(&t);
+ if (c == (clock_t) -1)
+ return posix_error();
+ return build_times_result(
+ (double)t.tms_utime / ticks_per_second,
+ (double)t.tms_stime / ticks_per_second,
+ (double)t.tms_cutime / ticks_per_second,
+ (double)t.tms_cstime / ticks_per_second,
+ (double)c / ticks_per_second);
+}
#endif
+#endif /* HAVE_TIMES */
+
#ifdef HAVE_GETSID
PyDoc_STRVAR(posix_getsid__doc__,
@@ -5546,49 +7500,68 @@ posix_tcsetpgrp(PyObject *self, PyObject *args)
/* Functions acting on file descriptors */
PyDoc_STRVAR(posix_open__doc__,
-"open(filename, flag [, mode=0777]) -> fd\n\n\
-Open a file (for low level IO).");
+"open(path, flags, mode=0o777, *, dir_fd=None)\n\n\
+Open a file for low level IO. Returns a file handle (integer).\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_open(PyObject *self, PyObject *args)
+posix_open(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *ofile;
- char *file;
- int flag;
+ path_t path;
+ int flags;
int mode = 0777;
+ int dir_fd = DEFAULT_DIR_FD;
int fd;
-
-#ifdef MS_WINDOWS
- PyUnicodeObject *po;
- if (PyArg_ParseTuple(args, "Ui|i:open", &po, &flag, &mode)) {
- Py_BEGIN_ALLOW_THREADS
- /* PyUnicode_AS_UNICODE OK without thread
- lock as it is a simple dereference. */
- fd = _wopen(PyUnicode_AS_UNICODE(po), flag, mode);
- Py_END_ALLOW_THREADS
- if (fd < 0)
- return posix_error();
- return PyLong_FromLong((long)fd);
- }
- /* Drop the argument parsing error as narrow strings
- are also valid. */
- PyErr_Clear();
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "flags", "mode", "dir_fd", NULL};
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|i$O&:open", keywords,
+ path_converter, &path,
+ &flags, &mode,
+#ifdef HAVE_OPENAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
#endif
-
- if (!PyArg_ParseTuple(args, "O&i|i:open",
- PyUnicode_FSConverter, &ofile,
- &flag, &mode))
+ ))
return NULL;
- file = PyBytes_AsString(ofile);
+
Py_BEGIN_ALLOW_THREADS
- fd = open(file, flag, mode);
+#ifdef MS_WINDOWS
+ if (path.wide)
+ fd = _wopen(path.wide, flags, mode);
+ else
+#endif
+#ifdef HAVE_OPENAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ fd = openat(dir_fd, path.narrow, flags, mode);
+ else
+#endif
+ fd = open(path.narrow, flags, mode);
Py_END_ALLOW_THREADS
- if (fd < 0)
- return posix_error_with_allocated_filename(ofile);
- Py_DECREF(ofile);
- return PyLong_FromLong((long)fd);
-}
+ if (fd == -1) {
+#ifdef MS_WINDOWS
+ /* force use of posix_error here for exact backwards compatibility */
+ if (path.wide)
+ return_value = posix_error();
+ else
+#endif
+ return_value = path_error("open", &path);
+ goto exit;
+ }
+
+ return_value = PyLong_FromLong((long)fd);
+
+exit:
+ path_cleanup(&path);
+ return return_value;
+}
PyDoc_STRVAR(posix_close__doc__,
"close(fd)\n\n\
@@ -5643,9 +7616,7 @@ posix_dup(PyObject *self, PyObject *args)
return NULL;
if (!_PyVerify_fd(fd))
return posix_error();
- Py_BEGIN_ALLOW_THREADS
fd = dup(fd);
- Py_END_ALLOW_THREADS
if (fd < 0)
return posix_error();
return PyLong_FromLong((long)fd);
@@ -5664,15 +7635,42 @@ posix_dup2(PyObject *self, PyObject *args)
return NULL;
if (!_PyVerify_fd_dup2(fd, fd2))
return posix_error();
- Py_BEGIN_ALLOW_THREADS
res = dup2(fd, fd2);
- Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
Py_INCREF(Py_None);
return Py_None;
}
+#ifdef HAVE_LOCKF
+PyDoc_STRVAR(posix_lockf__doc__,
+"lockf(fd, cmd, len)\n\n\
+Apply, test or remove a POSIX lock on an open file descriptor.\n\n\
+fd is an open file descriptor.\n\
+cmd specifies the command to use - one of F_LOCK, F_TLOCK, F_ULOCK or\n\
+F_TEST.\n\
+len specifies the section of the file to lock.");
+
+static PyObject *
+posix_lockf(PyObject *self, PyObject *args)
+{
+ int fd, cmd, res;
+ off_t len;
+ if (!PyArg_ParseTuple(args, "iiO&:lockf",
+ &fd, &cmd, _parse_off_t, &len))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ res = lockf(fd, cmd, len);
+ Py_END_ALLOW_THREADS
+
+ if (res < 0)
+ return posix_error();
+
+ Py_RETURN_NONE;
+}
+#endif
+
PyDoc_STRVAR(posix_lseek__doc__,
"lseek(fd, pos, how) -> newpos\n\n\
@@ -5703,8 +7701,7 @@ posix_lseek(PyObject *self, PyObject *args)
#if !defined(HAVE_LARGEFILE_SUPPORT)
pos = PyLong_AsLong(posobj);
#else
- pos = PyLong_Check(posobj) ?
- PyLong_AsLongLong(posobj) : PyLong_AsLong(posobj);
+ pos = PyLong_AsLongLong(posobj);
#endif
if (PyErr_Occurred())
return NULL;
@@ -5764,6 +7761,140 @@ posix_read(PyObject *self, PyObject *args)
return buffer;
}
+#if (defined(HAVE_SENDFILE) && (defined(__FreeBSD__) || defined(__DragonFly__) \
+ || defined(__APPLE__))) || defined(HAVE_READV) || defined(HAVE_WRITEV)
+static Py_ssize_t
+iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, int cnt, int type)
+{
+ int i, j;
+ Py_ssize_t blen, total = 0;
+
+ *iov = PyMem_New(struct iovec, cnt);
+ if (*iov == NULL) {
+ PyErr_NoMemory();
+ return total;
+ }
+
+ *buf = PyMem_New(Py_buffer, cnt);
+ if (*buf == NULL) {
+ PyMem_Del(*iov);
+ PyErr_NoMemory();
+ return total;
+ }
+
+ for (i = 0; i < cnt; i++) {
+ PyObject *item = PySequence_GetItem(seq, i);
+ if (item == NULL)
+ goto fail;
+ if (PyObject_GetBuffer(item, &(*buf)[i], type) == -1) {
+ Py_DECREF(item);
+ goto fail;
+ }
+ Py_DECREF(item);
+ (*iov)[i].iov_base = (*buf)[i].buf;
+ blen = (*buf)[i].len;
+ (*iov)[i].iov_len = blen;
+ total += blen;
+ }
+ return total;
+
+fail:
+ PyMem_Del(*iov);
+ for (j = 0; j < i; j++) {
+ PyBuffer_Release(&(*buf)[j]);
+ }
+ PyMem_Del(*buf);
+ return 0;
+}
+
+static void
+iov_cleanup(struct iovec *iov, Py_buffer *buf, int cnt)
+{
+ int i;
+ PyMem_Del(iov);
+ for (i = 0; i < cnt; i++) {
+ PyBuffer_Release(&buf[i]);
+ }
+ PyMem_Del(buf);
+}
+#endif
+
+#ifdef HAVE_READV
+PyDoc_STRVAR(posix_readv__doc__,
+"readv(fd, buffers) -> bytesread\n\n\
+Read from a file descriptor into a number of writable buffers. buffers\n\
+is an arbitrary sequence of writable buffers.\n\
+Returns the total number of bytes read.");
+
+static PyObject *
+posix_readv(PyObject *self, PyObject *args)
+{
+ int fd, cnt;
+ Py_ssize_t n;
+ PyObject *seq;
+ struct iovec *iov;
+ Py_buffer *buf;
+
+ if (!PyArg_ParseTuple(args, "iO:readv", &fd, &seq))
+ return NULL;
+ if (!PySequence_Check(seq)) {
+ PyErr_SetString(PyExc_TypeError,
+ "readv() arg 2 must be a sequence");
+ return NULL;
+ }
+ cnt = PySequence_Size(seq);
+
+ if (!iov_setup(&iov, &buf, seq, cnt, PyBUF_WRITABLE))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ n = readv(fd, iov, cnt);
+ Py_END_ALLOW_THREADS
+
+ iov_cleanup(iov, buf, cnt);
+ return PyLong_FromSsize_t(n);
+}
+#endif
+
+#ifdef HAVE_PREAD
+PyDoc_STRVAR(posix_pread__doc__,
+"pread(fd, buffersize, offset) -> string\n\n\
+Read from a file descriptor, fd, at a position of offset. It will read up\n\
+to buffersize number of bytes. The file offset remains unchanged.");
+
+static PyObject *
+posix_pread(PyObject *self, PyObject *args)
+{
+ int fd, size;
+ off_t offset;
+ Py_ssize_t n;
+ PyObject *buffer;
+ if (!PyArg_ParseTuple(args, "iiO&:pread", &fd, &size, _parse_off_t, &offset))
+ return NULL;
+
+ if (size < 0) {
+ errno = EINVAL;
+ return posix_error();
+ }
+ buffer = PyBytes_FromStringAndSize((char *)NULL, size);
+ if (buffer == NULL)
+ return NULL;
+ if (!_PyVerify_fd(fd)) {
+ Py_DECREF(buffer);
+ return posix_error();
+ }
+ Py_BEGIN_ALLOW_THREADS
+ n = pread(fd, PyBytes_AS_STRING(buffer), size, offset);
+ Py_END_ALLOW_THREADS
+ if (n < 0) {
+ Py_DECREF(buffer);
+ return posix_error();
+ }
+ if (n != size)
+ _PyBytes_Resize(&buffer, n);
+ return buffer;
+}
+#endif
PyDoc_STRVAR(posix_write__doc__,
"write(fd, string) -> byteswritten\n\n\
@@ -5798,10 +7929,149 @@ posix_write(PyObject *self, PyObject *args)
return PyLong_FromSsize_t(size);
}
+#ifdef HAVE_SENDFILE
+PyDoc_STRVAR(posix_sendfile__doc__,
+"sendfile(out, in, offset, nbytes) -> byteswritten\n\
+sendfile(out, in, offset, nbytes, headers=None, trailers=None, flags=0)\n\
+ -> byteswritten\n\
+Copy nbytes bytes from file descriptor in to file descriptor out.");
+
+static PyObject *
+posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
+{
+ int in, out;
+ Py_ssize_t ret;
+ off_t offset;
+
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__)
+#ifndef __APPLE__
+ Py_ssize_t len;
+#endif
+ PyObject *headers = NULL, *trailers = NULL;
+ Py_buffer *hbuf, *tbuf;
+ off_t sbytes;
+ struct sf_hdtr sf;
+ int flags = 0;
+ sf.headers = NULL;
+ sf.trailers = NULL;
+ static char *keywords[] = {"out", "in",
+ "offset", "count",
+ "headers", "trailers", "flags", NULL};
+
+#ifdef __APPLE__
+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&O&|OOi:sendfile",
+ keywords, &out, &in, _parse_off_t, &offset, _parse_off_t, &sbytes,
+#else
+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&n|OOi:sendfile",
+ keywords, &out, &in, _parse_off_t, &offset, &len,
+#endif
+ &headers, &trailers, &flags))
+ return NULL;
+ if (headers != NULL) {
+ if (!PySequence_Check(headers)) {
+ PyErr_SetString(PyExc_TypeError,
+ "sendfile() headers must be a sequence or None");
+ return NULL;
+ } else {
+ Py_ssize_t i = 0; /* Avoid uninitialized warning */
+ sf.hdr_cnt = PySequence_Size(headers);
+ if (sf.hdr_cnt > 0 &&
+ !(i = iov_setup(&(sf.headers), &hbuf,
+ headers, sf.hdr_cnt, PyBUF_SIMPLE)))
+ return NULL;
+#ifdef __APPLE__
+ sbytes += i;
+#endif
+ }
+ }
+ if (trailers != NULL) {
+ if (!PySequence_Check(trailers)) {
+ PyErr_SetString(PyExc_TypeError,
+ "sendfile() trailers must be a sequence or None");
+ return NULL;
+ } else {
+ Py_ssize_t i = 0; /* Avoid uninitialized warning */
+ sf.trl_cnt = PySequence_Size(trailers);
+ if (sf.trl_cnt > 0 &&
+ !(i = iov_setup(&(sf.trailers), &tbuf,
+ trailers, sf.trl_cnt, PyBUF_SIMPLE)))
+ return NULL;
+#ifdef __APPLE__
+ sbytes += i;
+#endif
+ }
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+#ifdef __APPLE__
+ ret = sendfile(in, out, offset, &sbytes, &sf, flags);
+#else
+ ret = sendfile(in, out, offset, len, &sf, &sbytes, flags);
+#endif
+ Py_END_ALLOW_THREADS
+
+ if (sf.headers != NULL)
+ iov_cleanup(sf.headers, hbuf, sf.hdr_cnt);
+ if (sf.trailers != NULL)
+ iov_cleanup(sf.trailers, tbuf, sf.trl_cnt);
+
+ if (ret < 0) {
+ if ((errno == EAGAIN) || (errno == EBUSY)) {
+ if (sbytes != 0) {
+ // some data has been sent
+ goto done;
+ }
+ else {
+ // no data has been sent; upper application is supposed
+ // to retry on EAGAIN or EBUSY
+ return posix_error();
+ }
+ }
+ return posix_error();
+ }
+ goto done;
+
+done:
+ #if !defined(HAVE_LARGEFILE_SUPPORT)
+ return Py_BuildValue("l", sbytes);
+ #else
+ return Py_BuildValue("L", sbytes);
+ #endif
+
+#else
+ Py_ssize_t count;
+ PyObject *offobj;
+ static char *keywords[] = {"out", "in",
+ "offset", "count", NULL};
+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiOn:sendfile",
+ keywords, &out, &in, &offobj, &count))
+ return NULL;
+#ifdef linux
+ if (offobj == Py_None) {
+ Py_BEGIN_ALLOW_THREADS
+ ret = sendfile(out, in, NULL, count);
+ Py_END_ALLOW_THREADS
+ if (ret < 0)
+ return posix_error();
+ return Py_BuildValue("n", ret);
+ }
+#endif
+ if (!_parse_off_t(offobj, &offset))
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+ ret = sendfile(out, in, &offset, count);
+ Py_END_ALLOW_THREADS
+ if (ret < 0)
+ return posix_error();
+ return Py_BuildValue("n", ret);
+#endif
+}
+#endif
PyDoc_STRVAR(posix_fstat__doc__,
"fstat(fd) -> stat result\n\n\
-Like stat(), but for an open file descriptor.");
+Like stat(), but for an open file descriptor.\n\
+Equivalent to stat(fd=fd).");
static PyObject *
posix_fstat(PyObject *self, PyObject *args)
@@ -5815,8 +8085,6 @@ posix_fstat(PyObject *self, PyObject *args)
/* on OpenVMS we must ensure that all bytes are written to the file */
fsync(fd);
#endif
- if (!_PyVerify_fd(fd))
- return posix_error();
Py_BEGIN_ALLOW_THREADS
res = FSTAT(fd, &st);
Py_END_ALLOW_THREADS
@@ -5859,9 +8127,7 @@ posix_pipe(PyObject *self, PyObject *noargs)
HFILE read, write;
APIRET rc;
- Py_BEGIN_ALLOW_THREADS
rc = DosCreatePipe( &read, &write, 4096);
- Py_END_ALLOW_THREADS
if (rc != NO_ERROR)
return os2_error(rc);
@@ -5870,9 +8136,7 @@ posix_pipe(PyObject *self, PyObject *noargs)
#if !defined(MS_WINDOWS)
int fds[2];
int res;
- Py_BEGIN_ALLOW_THREADS
res = pipe(fds);
- Py_END_ALLOW_THREADS
if (res != 0)
return posix_error();
return Py_BuildValue("(ii)", fds[0], fds[1]);
@@ -5880,9 +8144,7 @@ posix_pipe(PyObject *self, PyObject *noargs)
HANDLE read, write;
int read_fd, write_fd;
BOOL ok;
- Py_BEGIN_ALLOW_THREADS
ok = CreatePipe(&read, &write, NULL, 0);
- Py_END_ALLOW_THREADS
if (!ok)
return win32_error("CreatePipe", NULL);
read_fd = _open_osfhandle((Py_intptr_t)read, 0);
@@ -5893,66 +8155,214 @@ posix_pipe(PyObject *self, PyObject *noargs)
}
#endif /* HAVE_PIPE */
+#ifdef HAVE_PIPE2
+PyDoc_STRVAR(posix_pipe2__doc__,
+"pipe2(flags) -> (read_end, write_end)\n\n\
+Create a pipe with flags set atomically.\n\
+flags can be constructed by ORing together one or more of these values:\n\
+O_NONBLOCK, O_CLOEXEC.\n\
+");
+
+static PyObject *
+posix_pipe2(PyObject *self, PyObject *arg)
+{
+ int flags;
+ int fds[2];
+ int res;
+
+ flags = PyLong_AsLong(arg);
+ if (flags == -1 && PyErr_Occurred())
+ return NULL;
+
+ res = pipe2(fds, flags);
+ if (res != 0)
+ return posix_error();
+ return Py_BuildValue("(ii)", fds[0], fds[1]);
+}
+#endif /* HAVE_PIPE2 */
+
+#ifdef HAVE_WRITEV
+PyDoc_STRVAR(posix_writev__doc__,
+"writev(fd, buffers) -> byteswritten\n\n\
+Write the contents of buffers to a file descriptor, where buffers is an\n\
+arbitrary sequence of buffers.\n\
+Returns the total bytes written.");
+
+static PyObject *
+posix_writev(PyObject *self, PyObject *args)
+{
+ int fd, cnt;
+ Py_ssize_t res;
+ PyObject *seq;
+ struct iovec *iov;
+ Py_buffer *buf;
+ if (!PyArg_ParseTuple(args, "iO:writev", &fd, &seq))
+ return NULL;
+ if (!PySequence_Check(seq)) {
+ PyErr_SetString(PyExc_TypeError,
+ "writev() arg 2 must be a sequence");
+ return NULL;
+ }
+ cnt = PySequence_Size(seq);
+
+ if (!iov_setup(&iov, &buf, seq, cnt, PyBUF_SIMPLE)) {
+ return NULL;
+ }
+
+ Py_BEGIN_ALLOW_THREADS
+ res = writev(fd, iov, cnt);
+ Py_END_ALLOW_THREADS
+
+ iov_cleanup(iov, buf, cnt);
+ return PyLong_FromSsize_t(res);
+}
+#endif
+
+#ifdef HAVE_PWRITE
+PyDoc_STRVAR(posix_pwrite__doc__,
+"pwrite(fd, string, offset) -> byteswritten\n\n\
+Write string to a file descriptor, fd, from offset, leaving the file\n\
+offset unchanged.");
+
+static PyObject *
+posix_pwrite(PyObject *self, PyObject *args)
+{
+ Py_buffer pbuf;
+ int fd;
+ off_t offset;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "iy*O&:pwrite", &fd, &pbuf, _parse_off_t, &offset))
+ return NULL;
+
+ if (!_PyVerify_fd(fd)) {
+ PyBuffer_Release(&pbuf);
+ return posix_error();
+ }
+ Py_BEGIN_ALLOW_THREADS
+ size = pwrite(fd, pbuf.buf, (size_t)pbuf.len, offset);
+ Py_END_ALLOW_THREADS
+ PyBuffer_Release(&pbuf);
+ if (size < 0)
+ return posix_error();
+ return PyLong_FromSsize_t(size);
+}
+#endif
#ifdef HAVE_MKFIFO
PyDoc_STRVAR(posix_mkfifo__doc__,
-"mkfifo(filename [, mode=0666])\n\n\
-Create a FIFO (a POSIX named pipe).");
+"mkfifo(path, mode=0o666, *, dir_fd=None)\n\n\
+Create a FIFO (a POSIX named pipe).\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_mkfifo(PyObject *self, PyObject *args)
+posix_mkfifo(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *filename;
+ path_t path;
int mode = 0666;
- int res;
- if (!PyArg_ParseTuple(args, "O&|i:mkfifo", PyUnicode_FSConverter, &opath,
- &mode))
+ int dir_fd = DEFAULT_DIR_FD;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "mode", "dir_fd", NULL};
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|i$O&:mkfifo", keywords,
+ path_converter, &path,
+ &mode,
+#ifdef HAVE_MKFIFOAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
return NULL;
- filename = PyBytes_AS_STRING(opath);
+
Py_BEGIN_ALLOW_THREADS
- res = mkfifo(filename, mode);
+#ifdef HAVE_MKFIFOAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = mkfifoat(dir_fd, path.narrow, mode);
+ else
+#endif
+ result = mkfifo(path.narrow, mode);
Py_END_ALLOW_THREADS
- Py_DECREF(opath);
- if (res < 0)
- return posix_error();
+
+ if (result < 0) {
+ return_value = posix_error();
+ goto exit;
+ }
+
+ return_value = Py_None;
Py_INCREF(Py_None);
- return Py_None;
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#endif
-
#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
PyDoc_STRVAR(posix_mknod__doc__,
-"mknod(filename [, mode=0600, device])\n\n\
+"mknod(filename, mode=0o600, device=0, *, dir_fd=None)\n\n\
Create a filesystem node (file, device special file or named pipe)\n\
named filename. mode specifies both the permissions to use and the\n\
type of node to be created, being combined (bitwise OR) with one of\n\
S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
device defines the newly created device special file (probably using\n\
-os.makedev()), otherwise it is ignored.");
+os.makedev()), otherwise it is ignored.\n\
+\n\
+If dir_fd is not None, it should be a file descriptor open to a directory,\n\
+ and path should be relative; path will then be relative to that directory.\n\
+dir_fd may not be implemented on your platform.\n\
+ If it is unavailable, using it will raise a NotImplementedError.");
static PyObject *
-posix_mknod(PyObject *self, PyObject *args)
+posix_mknod(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *filename;
- int mode = 0600;
+ path_t path;
+ int mode = 0666;
int device = 0;
- int res;
- if (!PyArg_ParseTuple(args, "O&|ii:mknod", PyUnicode_FSConverter, &opath,
- &mode, &device))
+ int dir_fd = DEFAULT_DIR_FD;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "mode", "device", "dir_fd", NULL};
+
+ memset(&path, 0, sizeof(path));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|ii$O&:mknod", keywords,
+ path_converter, &path,
+ &mode, &device,
+#ifdef HAVE_MKNODAT
+ dir_fd_converter, &dir_fd
+#else
+ dir_fd_unavailable, &dir_fd
+#endif
+ ))
return NULL;
- filename = PyBytes_AS_STRING(opath);
+
Py_BEGIN_ALLOW_THREADS
- res = mknod(filename, mode, device);
+#ifdef HAVE_MKNODAT
+ if (dir_fd != DEFAULT_DIR_FD)
+ result = mknodat(dir_fd, path.narrow, mode, device);
+ else
+#endif
+ result = mknod(path.narrow, mode, device);
Py_END_ALLOW_THREADS
- Py_DECREF(opath);
- if (res < 0)
- return posix_error();
+
+ if (result < 0) {
+ return_value = posix_error();
+ goto exit;
+ }
+
+ return_value = Py_None;
Py_INCREF(Py_None);
- return Py_None;
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#endif
@@ -6009,18 +8419,8 @@ posix_ftruncate(PyObject *self, PyObject *args)
int fd;
off_t length;
int res;
- PyObject *lenobj;
-
- if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
- return NULL;
-#if !defined(HAVE_LARGEFILE_SUPPORT)
- length = PyLong_AsLong(lenobj);
-#else
- length = PyLong_Check(lenobj) ?
- PyLong_AsLongLong(lenobj) : PyLong_AsLong(lenobj);
-#endif
- if (PyErr_Occurred())
+ if (!PyArg_ParseTuple(args, "iO&:ftruncate", &fd, _parse_off_t, &length))
return NULL;
Py_BEGIN_ALLOW_THREADS
@@ -6033,6 +8433,109 @@ posix_ftruncate(PyObject *self, PyObject *args)
}
#endif
+#ifdef HAVE_TRUNCATE
+PyDoc_STRVAR(posix_truncate__doc__,
+"truncate(path, length)\n\n\
+Truncate the file given by path to length bytes.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.");
+
+static PyObject *
+posix_truncate(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ off_t length;
+ int res;
+ PyObject *result = NULL;
+ static char *keywords[] = {"path", "length", NULL};
+
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FTRUNCATE
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&:truncate", keywords,
+ path_converter, &path,
+ _parse_off_t, &length))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+#ifdef HAVE_FTRUNCATE
+ if (path.fd != -1)
+ res = ftruncate(path.fd, length);
+ else
+#endif
+ res = truncate(path.narrow, length);
+ Py_END_ALLOW_THREADS
+ if (res < 0)
+ result = path_posix_error("truncate", &path);
+ else {
+ Py_INCREF(Py_None);
+ result = Py_None;
+ }
+ path_cleanup(&path);
+ return result;
+}
+#endif
+
+#ifdef HAVE_POSIX_FALLOCATE
+PyDoc_STRVAR(posix_posix_fallocate__doc__,
+"posix_fallocate(fd, offset, len)\n\n\
+Ensures that enough disk space is allocated for the file specified by fd\n\
+starting from offset and continuing for len bytes.");
+
+static PyObject *
+posix_posix_fallocate(PyObject *self, PyObject *args)
+{
+ off_t len, offset;
+ int res, fd;
+
+ if (!PyArg_ParseTuple(args, "iO&O&:posix_fallocate",
+ &fd, _parse_off_t, &offset, _parse_off_t, &len))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ res = posix_fallocate(fd, offset, len);
+ Py_END_ALLOW_THREADS
+ if (res != 0) {
+ errno = res;
+ return posix_error();
+ }
+ Py_RETURN_NONE;
+}
+#endif
+
+#ifdef HAVE_POSIX_FADVISE
+PyDoc_STRVAR(posix_posix_fadvise__doc__,
+"posix_fadvise(fd, offset, len, advice)\n\n\
+Announces an intention to access data in a specific pattern thus allowing\n\
+the kernel to make optimizations.\n\
+The advice applies to the region of the file specified by fd starting at\n\
+offset and continuing for len bytes.\n\
+advice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\n\
+POSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED or\n\
+POSIX_FADV_DONTNEED.");
+
+static PyObject *
+posix_posix_fadvise(PyObject *self, PyObject *args)
+{
+ off_t len, offset;
+ int res, fd, advice;
+
+ if (!PyArg_ParseTuple(args, "iO&O&i:posix_fadvise",
+ &fd, _parse_off_t, &offset, _parse_off_t, &len, &advice))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ res = posix_fadvise(fd, offset, len, advice);
+ Py_END_ALLOW_THREADS
+ if (res != 0) {
+ errno = res;
+ return posix_error();
+ }
+ Py_RETURN_NONE;
+}
+#endif
+
#ifdef HAVE_PUTENV
PyDoc_STRVAR(posix_putenv__doc__,
"putenv(key, value)\n\n\
@@ -6045,23 +8548,40 @@ static PyObject *posix_putenv_garbage;
static PyObject *
posix_putenv(PyObject *self, PyObject *args)
{
+ PyObject *newstr = NULL;
#ifdef MS_WINDOWS
- wchar_t *s1, *s2;
+ PyObject *os1, *os2;
wchar_t *newenv;
+
+ if (!PyArg_ParseTuple(args,
+ "UU:putenv",
+ &os1, &os2))
+ return NULL;
+
+ newstr = PyUnicode_FromFormat("%U=%U", os1, os2);
+ if (newstr == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ if (_MAX_ENV < PyUnicode_GET_LENGTH(newstr)) {
+ PyErr_Format(PyExc_ValueError,
+ "the environment variable is longer than %u characters",
+ _MAX_ENV);
+ goto error;
+ }
+
+ newenv = PyUnicode_AsUnicode(newstr);
+ if (newenv == NULL)
+ goto error;
+ if (_wputenv(newenv)) {
+ posix_error();
+ goto error;
+ }
#else
PyObject *os1, *os2;
char *s1, *s2;
char *newenv;
-#endif
- PyObject *newstr = NULL;
- size_t len;
-#ifdef MS_WINDOWS
- if (!PyArg_ParseTuple(args,
- "uu:putenv",
- &s1, &s2))
- return NULL;
-#else
if (!PyArg_ParseTuple(args,
"O&O&:putenv",
PyUnicode_FSConverter, &os1,
@@ -6069,58 +8589,14 @@ posix_putenv(PyObject *self, PyObject *args)
return NULL;
s1 = PyBytes_AsString(os1);
s2 = PyBytes_AsString(os2);
-#endif
-
-#if defined(PYOS_OS2)
- if (stricmp(s1, "BEGINLIBPATH") == 0) {
- APIRET rc;
-
- rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
- if (rc != NO_ERROR) {
- os2_error(rc);
- goto error;
- }
- } else if (stricmp(s1, "ENDLIBPATH") == 0) {
- APIRET rc;
-
- rc = DosSetExtLIBPATH(s2, END_LIBPATH);
- if (rc != NO_ERROR) {
- os2_error(rc);
- goto error;
- }
- } else {
-#endif
- /* XXX This can leak memory -- not easy to fix :-( */
- /* len includes space for a trailing \0; the size arg to
- PyBytes_FromStringAndSize does not count that */
-#ifdef MS_WINDOWS
- len = wcslen(s1) + wcslen(s2) + 2;
- if (_MAX_ENV < (len - 1)) {
- PyErr_Format(PyExc_ValueError,
- "the environment variable is longer than %u characters",
- _MAX_ENV);
- goto error;
- }
- newstr = PyUnicode_FromUnicode(NULL, (int)len - 1);
-#else
- len = PyBytes_GET_SIZE(os1) + PyBytes_GET_SIZE(os2) + 2;
- newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1);
-#endif
+ newstr = PyBytes_FromFormat("%s=%s", s1, s2);
if (newstr == NULL) {
PyErr_NoMemory();
goto error;
}
-#ifdef MS_WINDOWS
- newenv = PyUnicode_AsUnicode(newstr);
- _snwprintf(newenv, len, L"%s=%s", s1, s2);
- if (_wputenv(newenv)) {
- posix_error();
- goto error;
- }
-#else
+
newenv = PyBytes_AS_STRING(newstr);
- PyOS_snprintf(newenv, len, "%s=%s", s1, s2);
if (putenv(newenv)) {
posix_error();
goto error;
@@ -6131,13 +8607,7 @@ posix_putenv(PyObject *self, PyObject *args)
* this will cause previous value to be collected. This has to
* happen after the real putenv() call because the old value
* was still accessible until then. */
- if (PyDict_SetItem(posix_putenv_garbage,
-#ifdef MS_WINDOWS
- PyTuple_GET_ITEM(args, 0),
-#else
- os1,
-#endif
- newstr)) {
+ if (PyDict_SetItem(posix_putenv_garbage, os1, newstr)) {
/* really not much we can do; just leak */
PyErr_Clear();
}
@@ -6145,10 +8615,6 @@ posix_putenv(PyObject *self, PyObject *args)
Py_DECREF(newstr);
}
-#if defined(PYOS_OS2)
- }
-#endif
-
#ifndef MS_WINDOWS
Py_DECREF(os1);
Py_DECREF(os2);
@@ -6173,23 +8639,22 @@ Delete an environment variable.");
static PyObject *
posix_unsetenv(PyObject *self, PyObject *args)
{
- PyObject *os1;
- char *s1;
+ PyObject *name;
#ifndef HAVE_BROKEN_UNSETENV
int err;
#endif
if (!PyArg_ParseTuple(args, "O&:unsetenv",
- PyUnicode_FSConverter, &os1))
+
+ PyUnicode_FSConverter, &name))
return NULL;
- s1 = PyBytes_AsString(os1);
#ifdef HAVE_BROKEN_UNSETENV
- unsetenv(s1);
+ unsetenv(PyBytes_AS_STRING(name));
#else
- err = unsetenv(s1);
+ err = unsetenv(PyBytes_AS_STRING(name));
if (err) {
- Py_DECREF(os1);
+ Py_DECREF(name);
return posix_error();
}
#endif
@@ -6199,12 +8664,11 @@ posix_unsetenv(PyObject *self, PyObject *args)
* happen after the real unsetenv() call because the
* old value was still accessible until then.
*/
- if (PyDict_DelItem(posix_putenv_garbage, os1)) {
+ if (PyDict_DelItem(posix_putenv_garbage, name)) {
/* really not much we can do; just leak */
PyErr_Clear();
}
-
- Py_DECREF(os1);
+ Py_DECREF(name);
Py_RETURN_NONE;
}
#endif /* unsetenv */
@@ -6226,7 +8690,7 @@ posix_strerror(PyObject *self, PyObject *args)
"strerror() argument out of range");
return NULL;
}
- return PyUnicode_FromString(message);
+ return PyUnicode_DecodeLocale(message, "surrogateescape");
}
@@ -6432,7 +8896,8 @@ _pystatvfs_fromstructstatvfs(struct statvfs st) {
PyDoc_STRVAR(posix_fstatvfs__doc__,
"fstatvfs(fd) -> statvfs result\n\n\
-Perform an fstatvfs system call on the given fd.");
+Perform an fstatvfs system call on the given fd.\n\
+Equivalent to statvfs(fd).");
static PyObject *
posix_fstatvfs(PyObject *self, PyObject *args)
@@ -6457,27 +8922,87 @@ posix_fstatvfs(PyObject *self, PyObject *args)
#include <sys/statvfs.h>
PyDoc_STRVAR(posix_statvfs__doc__,
-"statvfs(path) -> statvfs result\n\n\
-Perform a statvfs system call on the given path.");
+"statvfs(path)\n\n\
+Perform a statvfs system call on the given path.\n\
+\n\
+path may always be specified as a string.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.");
static PyObject *
-posix_statvfs(PyObject *self, PyObject *args)
+posix_statvfs(PyObject *self, PyObject *args, PyObject *kwargs)
{
- char *path;
- int res;
+ static char *keywords[] = {"path", NULL};
+ path_t path;
+ int result;
+ PyObject *return_value = NULL;
struct statvfs st;
- if (!PyArg_ParseTuple(args, "s:statvfs", &path))
+
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FSTATVFS
+ path.allow_fd = 1;
+#endif
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&:statvfs", keywords,
+ path_converter, &path
+ ))
return NULL;
+
Py_BEGIN_ALLOW_THREADS
- res = statvfs(path, &st);
+#ifdef HAVE_FSTATVFS
+ if (path.fd != -1) {
+#ifdef __APPLE__
+ /* handle weak-linking on Mac OS X 10.3 */
+ if (fstatvfs == NULL) {
+ fd_specified("statvfs", path.fd);
+ goto exit;
+ }
+#endif
+ result = fstatvfs(path.fd, &st);
+ }
+ else
+#endif
+ result = statvfs(path.narrow, &st);
Py_END_ALLOW_THREADS
- if (res != 0)
- return posix_error_with_filename(path);
- return _pystatvfs_fromstructstatvfs(st);
+ if (result) {
+ return_value = path_posix_error("statvfs", &path);
+ goto exit;
+ }
+
+ return_value = _pystatvfs_fromstructstatvfs(st);
+
+exit:
+ path_cleanup(&path);
+ return return_value;
}
#endif /* HAVE_STATVFS */
+#ifdef MS_WINDOWS
+PyDoc_STRVAR(win32__getdiskusage__doc__,
+"_getdiskusage(path) -> (total, free)\n\n\
+Return disk usage statistics about the given path as (total, free) tuple.");
+
+static PyObject *
+win32__getdiskusage(PyObject *self, PyObject *args)
+{
+ BOOL retval;
+ ULARGE_INTEGER _, total, free;
+ const wchar_t *path;
+
+ if (! PyArg_ParseTuple(args, "u", &path))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ retval = GetDiskFreeSpaceExW(path, &_, &total, &free);
+ Py_END_ALLOW_THREADS
+ if (retval == 0)
+ return PyErr_SetFromWindowsErr(0);
+
+ return Py_BuildValue("(LL)", total.QuadPart, free.QuadPart);
+}
+#endif
+
+
/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
* It maps strings representing configuration variable names to
* integer values, allowing those functions to be called with the
@@ -6664,31 +9189,45 @@ posix_fpathconf(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_pathconf__doc__,
"pathconf(path, name) -> integer\n\n\
Return the configuration limit name for the file or directory path.\n\
-If there is no limit, return -1.");
+If there is no limit, return -1.\n\
+On some platforms, path may also be specified as an open file descriptor.\n\
+ If this functionality is unavailable, using it raises an exception.");
static PyObject *
-posix_pathconf(PyObject *self, PyObject *args)
+posix_pathconf(PyObject *self, PyObject *args, PyObject *kwargs)
{
+ path_t path;
PyObject *result = NULL;
int name;
- char *path;
+ static char *keywords[] = {"path", "name", NULL};
- if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
- conv_path_confname, &name)) {
+ memset(&path, 0, sizeof(path));
+#ifdef HAVE_FPATHCONF
+ path.allow_fd = 1;
+#endif
+ if (PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&:pathconf", keywords,
+ path_converter, &path,
+ conv_path_confname, &name)) {
long limit;
errno = 0;
- limit = pathconf(path, name);
+#ifdef HAVE_FPATHCONF
+ if (path.fd != -1)
+ limit = fpathconf(path.fd, name);
+ else
+#endif
+ limit = pathconf(path.narrow, name);
if (limit == -1 && errno != 0) {
if (errno == EINVAL)
/* could be a path or name problem */
posix_error();
else
- posix_error_with_filename(path);
+ result = path_posix_error("pathconf", &path);
}
else
result = PyLong_FromLong(limit);
}
+ path_cleanup(&path);
return result;
}
#endif
@@ -7540,9 +10079,10 @@ win32_startfile(PyObject *self, PyObject *args)
PyObject *ofilepath;
char *filepath;
char *operation = NULL;
+ wchar_t *wpath, *woperation;
HINSTANCE rc;
- PyObject *unipath, *woperation = NULL;
+ PyObject *unipath, *uoperation = NULL;
if (!PyArg_ParseTuple(args, "U|s:startfile",
&unipath, &operation)) {
PyErr_Clear();
@@ -7550,26 +10090,35 @@ win32_startfile(PyObject *self, PyObject *args)
}
if (operation) {
- woperation = PyUnicode_DecodeASCII(operation,
+ uoperation = PyUnicode_DecodeASCII(operation,
strlen(operation), NULL);
- if (!woperation) {
+ if (!uoperation) {
PyErr_Clear();
operation = NULL;
goto normal;
}
}
+ wpath = PyUnicode_AsUnicode(unipath);
+ if (wpath == NULL)
+ goto normal;
+ if (uoperation) {
+ woperation = PyUnicode_AsUnicode(uoperation);
+ if (woperation == NULL)
+ goto normal;
+ }
+ else
+ woperation = NULL;
+
Py_BEGIN_ALLOW_THREADS
- rc = ShellExecuteW((HWND)0, woperation ? PyUnicode_AS_UNICODE(woperation) : 0,
- PyUnicode_AS_UNICODE(unipath),
- NULL, NULL, SW_SHOWNORMAL);
+ rc = ShellExecuteW((HWND)0, woperation, wpath,
+ NULL, NULL, SW_SHOWNORMAL);
Py_END_ALLOW_THREADS
- Py_XDECREF(woperation);
+ Py_XDECREF(uoperation);
if (rc <= (HINSTANCE)32) {
- PyObject *errval = win32_error_unicode("startfile",
- PyUnicode_AS_UNICODE(unipath));
- return errval;
+ win32_error_object("startfile", unipath);
+ return NULL;
}
Py_INCREF(Py_None);
return Py_None;
@@ -7579,6 +10128,10 @@ normal:
PyUnicode_FSConverter, &ofilepath,
&operation))
return NULL;
+ if (win32_warn_bytes_api()) {
+ Py_DECREF(ofilepath);
+ return NULL;
+ }
filepath = PyBytes_AsString(ofilepath);
Py_BEGIN_ALLOW_THREADS
rc = ShellExecute((HWND)0, operation, filepath,
@@ -7623,62 +10176,11 @@ static PyObject *
device_encoding(PyObject *self, PyObject *args)
{
int fd;
- if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
- return NULL;
- if (!_PyVerify_fd(fd) || !isatty(fd)) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-#if defined(MS_WINDOWS) || defined(MS_WIN64)
- if (fd == 0) {
- char buf[100];
- sprintf(buf, "cp%d", GetConsoleCP());
- return PyUnicode_FromString(buf);
- }
- if (fd == 1 || fd == 2) {
- char buf[100];
- sprintf(buf, "cp%d", GetConsoleOutputCP());
- return PyUnicode_FromString(buf);
- }
-#elif defined(CODESET)
- {
- char *codeset = nl_langinfo(CODESET);
- if (codeset != NULL && codeset[0] != 0)
- return PyUnicode_FromString(codeset);
- }
-#endif
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-PyDoc_STRVAR(posix_urandom__doc__,
-"urandom(n) -> str\n\n\
-Return n random bytes suitable for cryptographic use.");
-
-static PyObject *
-posix_urandom(PyObject *self, PyObject *args)
-{
- Py_ssize_t size;
- PyObject *result;
- int ret;
- /* Read arguments */
- if (!PyArg_ParseTuple(args, "n:urandom", &size))
- return NULL;
- if (size < 0)
- return PyErr_Format(PyExc_ValueError,
- "negative argument not allowed");
- result = PyBytes_FromStringAndSize(NULL, size);
- if (result == NULL)
+ if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
return NULL;
- ret = _PyOS_URandom(PyBytes_AS_STRING(result),
- PyBytes_GET_SIZE(result));
- if (ret == -1) {
- Py_DECREF(result);
- return NULL;
- }
- return result;
+ return _Py_device_encoding(fd);
}
#ifdef HAVE_SETRESUID
@@ -7757,21 +10259,468 @@ posix_getresgid (PyObject *self, PyObject *noargs)
}
#endif
+#ifdef USE_XATTRS
+
+PyDoc_STRVAR(posix_getxattr__doc__,
+"getxattr(path, attribute, *, follow_symlinks=True) -> value\n\n\
+Return the value of extended attribute attribute on path.\n\
+\n\
+path may be either a string or an open file descriptor.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, getxattr will examine the symbolic link itself instead of the file\n\
+ the link points to.");
+
+static PyObject *
+posix_getxattr(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ path_t attribute;
+ int follow_symlinks = 1;
+ PyObject *buffer = NULL;
+ int i;
+ static char *keywords[] = {"path", "attribute", "follow_symlinks", NULL};
+
+ memset(&path, 0, sizeof(path));
+ memset(&attribute, 0, sizeof(attribute));
+ path.allow_fd = 1;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|$p:getxattr", keywords,
+ path_converter, &path,
+ path_converter, &attribute,
+ &follow_symlinks))
+ return NULL;
+
+ if (fd_and_follow_symlinks_invalid("getxattr", path.fd, follow_symlinks))
+ goto exit;
+
+ for (i = 0; ; i++) {
+ void *ptr;
+ ssize_t result;
+ static Py_ssize_t buffer_sizes[] = {128, XATTR_SIZE_MAX, 0};
+ Py_ssize_t buffer_size = buffer_sizes[i];
+ if (!buffer_size) {
+ path_error("getxattr", &path);
+ goto exit;
+ }
+ buffer = PyBytes_FromStringAndSize(NULL, buffer_size);
+ if (!buffer)
+ goto exit;
+ ptr = PyBytes_AS_STRING(buffer);
+
+ Py_BEGIN_ALLOW_THREADS;
+ if (path.fd >= 0)
+ result = fgetxattr(path.fd, attribute.narrow, ptr, buffer_size);
+ else if (follow_symlinks)
+ result = getxattr(path.narrow, attribute.narrow, ptr, buffer_size);
+ else
+ result = lgetxattr(path.narrow, attribute.narrow, ptr, buffer_size);
+ Py_END_ALLOW_THREADS;
+
+ if (result < 0) {
+ Py_DECREF(buffer);
+ buffer = NULL;
+ if (errno == ERANGE)
+ continue;
+ path_error("getxattr", &path);
+ goto exit;
+ }
+
+ if (result != buffer_size) {
+ /* Can only shrink. */
+ _PyBytes_Resize(&buffer, result);
+ }
+ break;
+ }
+
+exit:
+ path_cleanup(&path);
+ path_cleanup(&attribute);
+ return buffer;
+}
+
+PyDoc_STRVAR(posix_setxattr__doc__,
+"setxattr(path, attribute, value, flags=0, *, follow_symlinks=True)\n\n\
+Set extended attribute attribute on path to value.\n\
+path may be either a string or an open file descriptor.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, setxattr will modify the symbolic link itself instead of the file\n\
+ the link points to.");
+
+static PyObject *
+posix_setxattr(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ path_t attribute;
+ Py_buffer value;
+ int flags = 0;
+ int follow_symlinks = 1;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "attribute", "value",
+ "flags", "follow_symlinks", NULL};
+
+ memset(&path, 0, sizeof(path));
+ path.allow_fd = 1;
+ memset(&attribute, 0, sizeof(attribute));
+ memset(&value, 0, sizeof(value));
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&y*|i$p:setxattr",
+ keywords,
+ path_converter, &path,
+ path_converter, &attribute,
+ &value, &flags,
+ &follow_symlinks))
+ return NULL;
+
+ if (fd_and_follow_symlinks_invalid("setxattr", path.fd, follow_symlinks))
+ goto exit;
+
+ Py_BEGIN_ALLOW_THREADS;
+ if (path.fd > -1)
+ result = fsetxattr(path.fd, attribute.narrow,
+ value.buf, value.len, flags);
+ else if (follow_symlinks)
+ result = setxattr(path.narrow, attribute.narrow,
+ value.buf, value.len, flags);
+ else
+ result = lsetxattr(path.narrow, attribute.narrow,
+ value.buf, value.len, flags);
+ Py_END_ALLOW_THREADS;
+
+ if (result) {
+ return_value = path_error("setxattr", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
+ Py_INCREF(return_value);
+
+exit:
+ path_cleanup(&path);
+ path_cleanup(&attribute);
+ PyBuffer_Release(&value);
+
+ return return_value;
+}
+
+PyDoc_STRVAR(posix_removexattr__doc__,
+"removexattr(path, attribute, *, follow_symlinks=True)\n\n\
+Remove extended attribute attribute on path.\n\
+path may be either a string or an open file descriptor.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, removexattr will modify the symbolic link itself instead of the file\n\
+ the link points to.");
+
+static PyObject *
+posix_removexattr(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ path_t attribute;
+ int follow_symlinks = 1;
+ int result;
+ PyObject *return_value = NULL;
+ static char *keywords[] = {"path", "attribute", "follow_symlinks", NULL};
+
+ memset(&path, 0, sizeof(path));
+ memset(&attribute, 0, sizeof(attribute));
+ path.allow_fd = 1;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&|$p:removexattr",
+ keywords,
+ path_converter, &path,
+ path_converter, &attribute,
+ &follow_symlinks))
+ return NULL;
+
+ if (fd_and_follow_symlinks_invalid("removexattr", path.fd, follow_symlinks))
+ goto exit;
+
+ Py_BEGIN_ALLOW_THREADS;
+ if (path.fd > -1)
+ result = fremovexattr(path.fd, attribute.narrow);
+ else if (follow_symlinks)
+ result = removexattr(path.narrow, attribute.narrow);
+ else
+ result = lremovexattr(path.narrow, attribute.narrow);
+ Py_END_ALLOW_THREADS;
+
+ if (result) {
+ return_value = path_error("removexattr", &path);
+ goto exit;
+ }
+
+ return_value = Py_None;
+ Py_INCREF(return_value);
+
+exit:
+ path_cleanup(&path);
+ path_cleanup(&attribute);
+
+ return return_value;
+}
+
+PyDoc_STRVAR(posix_listxattr__doc__,
+"listxattr(path='.', *, follow_symlinks=True)\n\n\
+Return a list of extended attributes on path.\n\
+\n\
+path may be either None, a string, or an open file descriptor.\n\
+if path is None, listxattr will examine the current directory.\n\
+If follow_symlinks is False, and the last element of the path is a symbolic\n\
+ link, listxattr will examine the symbolic link itself instead of the file\n\
+ the link points to.");
+
+static PyObject *
+posix_listxattr(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ path_t path;
+ int follow_symlinks = 1;
+ Py_ssize_t i;
+ PyObject *result = NULL;
+ char *buffer = NULL;
+ char *name;
+ static char *keywords[] = {"path", "follow_symlinks", NULL};
+
+ memset(&path, 0, sizeof(path));
+ path.allow_fd = 1;
+ path.fd = -1;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&$p:listxattr", keywords,
+ path_converter, &path,
+ &follow_symlinks))
+ return NULL;
+
+ if (fd_and_follow_symlinks_invalid("listxattr", path.fd, follow_symlinks))
+ goto exit;
+
+ name = path.narrow ? path.narrow : ".";
+ for (i = 0; ; i++) {
+ char *start, *trace, *end;
+ ssize_t length;
+ static Py_ssize_t buffer_sizes[] = { 256, XATTR_LIST_MAX, 0 };
+ Py_ssize_t buffer_size = buffer_sizes[i];
+ if (!buffer_size) {
+ /* ERANGE */
+ path_error("listxattr", &path);
+ break;
+ }
+ buffer = PyMem_MALLOC(buffer_size);
+ if (!buffer) {
+ PyErr_NoMemory();
+ break;
+ }
+
+ Py_BEGIN_ALLOW_THREADS;
+ if (path.fd > -1)
+ length = flistxattr(path.fd, buffer, buffer_size);
+ else if (follow_symlinks)
+ length = listxattr(name, buffer, buffer_size);
+ else
+ length = llistxattr(name, buffer, buffer_size);
+ Py_END_ALLOW_THREADS;
+
+ if (length < 0) {
+ if (errno == ERANGE)
+ continue;
+ path_error("listxattr", &path);
+ break;
+ }
+
+ result = PyList_New(0);
+ if (!result) {
+ goto exit;
+ }
+
+ end = buffer + length;
+ for (trace = start = buffer; trace != end; trace++) {
+ if (!*trace) {
+ int error;
+ PyObject *attribute = PyUnicode_DecodeFSDefaultAndSize(start,
+ trace - start);
+ if (!attribute) {
+ Py_DECREF(result);
+ result = NULL;
+ goto exit;
+ }
+ error = PyList_Append(result, attribute);
+ Py_DECREF(attribute);
+ if (error) {
+ Py_DECREF(result);
+ result = NULL;
+ goto exit;
+ }
+ start = trace + 1;
+ }
+ }
+ break;
+ }
+exit:
+ path_cleanup(&path);
+ if (buffer)
+ PyMem_FREE(buffer);
+ return result;
+}
+
+#endif /* USE_XATTRS */
+
+
+PyDoc_STRVAR(posix_urandom__doc__,
+"urandom(n) -> str\n\n\
+Return n random bytes suitable for cryptographic use.");
+
+static PyObject *
+posix_urandom(PyObject *self, PyObject *args)
+{
+ Py_ssize_t size;
+ PyObject *result;
+ int ret;
+
+ /* Read arguments */
+ if (!PyArg_ParseTuple(args, "n:urandom", &size))
+ return NULL;
+ if (size < 0)
+ return PyErr_Format(PyExc_ValueError,
+ "negative argument not allowed");
+ result = PyBytes_FromStringAndSize(NULL, size);
+ if (result == NULL)
+ return NULL;
+
+ ret = _PyOS_URandom(PyBytes_AS_STRING(result),
+ PyBytes_GET_SIZE(result));
+ if (ret == -1) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ return result;
+}
+
+/* Terminal size querying */
+
+static PyTypeObject TerminalSizeType;
+
+PyDoc_STRVAR(TerminalSize_docstring,
+ "A tuple of (columns, lines) for holding terminal window size");
+
+static PyStructSequence_Field TerminalSize_fields[] = {
+ {"columns", "width of the terminal window in characters"},
+ {"lines", "height of the terminal window in characters"},
+ {NULL, NULL}
+};
+
+static PyStructSequence_Desc TerminalSize_desc = {
+ "os.terminal_size",
+ TerminalSize_docstring,
+ TerminalSize_fields,
+ 2,
+};
+
+#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)
+PyDoc_STRVAR(termsize__doc__,
+ "Return the size of the terminal window as (columns, lines).\n" \
+ "\n" \
+ "The optional argument fd (default standard output) specifies\n" \
+ "which file descriptor should be queried.\n" \
+ "\n" \
+ "If the file descriptor is not connected to a terminal, an OSError\n" \
+ "is thrown.\n" \
+ "\n" \
+ "This function will only be defined if an implementation is\n" \
+ "available for this system.\n" \
+ "\n" \
+ "shutil.get_terminal_size is the high-level function which should \n" \
+ "normally be used, os.get_terminal_size is the low-level implementation.");
+
+static PyObject*
+get_terminal_size(PyObject *self, PyObject *args)
+{
+ int columns, lines;
+ PyObject *termsize;
+
+ int fd = fileno(stdout);
+ /* Under some conditions stdout may not be connected and
+ * fileno(stdout) may point to an invalid file descriptor. For example
+ * GUI apps don't have valid standard streams by default.
+ *
+ * If this happens, and the optional fd argument is not present,
+ * the ioctl below will fail returning EBADF. This is what we want.
+ */
+
+ if (!PyArg_ParseTuple(args, "|i", &fd))
+ return NULL;
+
+#ifdef TERMSIZE_USE_IOCTL
+ {
+ struct winsize w;
+ if (ioctl(fd, TIOCGWINSZ, &w))
+ return PyErr_SetFromErrno(PyExc_OSError);
+ columns = w.ws_col;
+ lines = w.ws_row;
+ }
+#endif /* TERMSIZE_USE_IOCTL */
+
+#ifdef TERMSIZE_USE_CONIO
+ {
+ DWORD nhandle;
+ HANDLE handle;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ switch (fd) {
+ case 0: nhandle = STD_INPUT_HANDLE;
+ break;
+ case 1: nhandle = STD_OUTPUT_HANDLE;
+ break;
+ case 2: nhandle = STD_ERROR_HANDLE;
+ break;
+ default:
+ return PyErr_Format(PyExc_ValueError, "bad file descriptor");
+ }
+ handle = GetStdHandle(nhandle);
+ if (handle == NULL)
+ return PyErr_Format(PyExc_OSError, "handle cannot be retrieved");
+ if (handle == INVALID_HANDLE_VALUE)
+ return PyErr_SetFromWindowsErr(0);
+
+ if (!GetConsoleScreenBufferInfo(handle, &csbi))
+ return PyErr_SetFromWindowsErr(0);
+
+ columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
+ lines = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
+ }
+#endif /* TERMSIZE_USE_CONIO */
+
+ termsize = PyStructSequence_New(&TerminalSizeType);
+ if (termsize == NULL)
+ return NULL;
+ PyStructSequence_SET_ITEM(termsize, 0, PyLong_FromLong(columns));
+ PyStructSequence_SET_ITEM(termsize, 1, PyLong_FromLong(lines));
+ if (PyErr_Occurred()) {
+ Py_DECREF(termsize);
+ return NULL;
+ }
+ return termsize;
+}
+#endif /* defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) */
+
+
static PyMethodDef posix_methods[] = {
- {"access", posix_access, METH_VARARGS, posix_access__doc__},
+ {"access", (PyCFunction)posix_access,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_access__doc__},
#ifdef HAVE_TTYNAME
{"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
#endif
- {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
+ {"chdir", (PyCFunction)posix_chdir,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_chdir__doc__},
#ifdef HAVE_CHFLAGS
- {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__},
+ {"chflags", (PyCFunction)posix_chflags,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_chflags__doc__},
#endif /* HAVE_CHFLAGS */
- {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
+ {"chmod", (PyCFunction)posix_chmod,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_chmod__doc__},
#ifdef HAVE_FCHMOD
{"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
#endif /* HAVE_FCHMOD */
#ifdef HAVE_CHOWN
- {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
+ {"chown", (PyCFunction)posix_chown,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_chown__doc__},
#endif /* HAVE_CHOWN */
#ifdef HAVE_LCHMOD
{"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
@@ -7797,32 +10746,57 @@ static PyMethodDef posix_methods[] = {
{"getcwdb", (PyCFunction)posix_getcwd_bytes,
METH_NOARGS, posix_getcwdb__doc__},
#endif
-#ifdef HAVE_LINK
- {"link", posix_link, METH_VARARGS, posix_link__doc__},
+#if defined(HAVE_LINK) || defined(MS_WINDOWS)
+ {"link", (PyCFunction)posix_link,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_link__doc__},
#endif /* HAVE_LINK */
- {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
- {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
- {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
+ {"listdir", (PyCFunction)posix_listdir,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_listdir__doc__},
+ {"lstat", (PyCFunction)posix_lstat,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_lstat__doc__},
+ {"mkdir", (PyCFunction)posix_mkdir,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_mkdir__doc__},
#ifdef HAVE_NICE
{"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
#endif /* HAVE_NICE */
+#ifdef HAVE_GETPRIORITY
+ {"getpriority", posix_getpriority, METH_VARARGS, posix_getpriority__doc__},
+#endif /* HAVE_GETPRIORITY */
+#ifdef HAVE_SETPRIORITY
+ {"setpriority", posix_setpriority, METH_VARARGS, posix_setpriority__doc__},
+#endif /* HAVE_SETPRIORITY */
#ifdef HAVE_READLINK
- {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
+ {"readlink", (PyCFunction)posix_readlink,
+ METH_VARARGS | METH_KEYWORDS,
+ readlink__doc__},
#endif /* HAVE_READLINK */
#if !defined(HAVE_READLINK) && defined(MS_WINDOWS)
- {"readlink", win_readlink, METH_VARARGS, win_readlink__doc__},
+ {"readlink", (PyCFunction)win_readlink,
+ METH_VARARGS | METH_KEYWORDS,
+ readlink__doc__},
#endif /* !defined(HAVE_READLINK) && defined(MS_WINDOWS) */
- {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
- {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
- {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
+ {"rename", (PyCFunction)posix_rename,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_rename__doc__},
+ {"replace", (PyCFunction)posix_replace,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_replace__doc__},
+ {"rmdir", (PyCFunction)posix_rmdir,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_rmdir__doc__},
+ {"stat", (PyCFunction)posix_stat,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_stat__doc__},
{"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__},
-#if defined(HAVE_SYMLINK) && !defined(MS_WINDOWS)
- {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
+#if defined(HAVE_SYMLINK)
+ {"symlink", (PyCFunction)posix_symlink,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_symlink__doc__},
#endif /* HAVE_SYMLINK */
-#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS)
- {"symlink", (PyCFunction)win_symlink, METH_VARARGS | METH_KEYWORDS,
- win_symlink__doc__},
-#endif /* defined(HAVE_SYMLINK) && defined(MS_WINDOWS) */
#ifdef HAVE_SYSTEM
{"system", posix_system, METH_VARARGS, posix_system__doc__},
#endif
@@ -7830,16 +10804,23 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_UNAME
{"uname", posix_uname, METH_NOARGS, posix_uname__doc__},
#endif /* HAVE_UNAME */
- {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
- {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
- {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
+ {"unlink", (PyCFunction)posix_unlink,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_unlink__doc__},
+ {"remove", (PyCFunction)posix_unlink,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_remove__doc__},
+ {"utime", (PyCFunction)posix_utime,
+ METH_VARARGS | METH_KEYWORDS, posix_utime__doc__},
#ifdef HAVE_TIMES
{"times", posix_times, METH_NOARGS, posix_times__doc__},
#endif /* HAVE_TIMES */
{"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
#ifdef HAVE_EXECV
{"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
- {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
+ {"execve", (PyCFunction)posix_execve,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_execve__doc__},
#endif /* HAVE_EXECV */
#ifdef HAVE_SPAWNV
{"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
@@ -7855,6 +10836,32 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_FORK
{"fork", posix_fork, METH_NOARGS, posix_fork__doc__},
#endif /* HAVE_FORK */
+#ifdef HAVE_SCHED_H
+#ifdef HAVE_SCHED_GET_PRIORITY_MAX
+ {"sched_get_priority_max", posix_sched_get_priority_max, METH_VARARGS, posix_sched_get_priority_max__doc__},
+ {"sched_get_priority_min", posix_sched_get_priority_min, METH_VARARGS, posix_sched_get_priority_min__doc__},
+#endif
+#ifdef HAVE_SCHED_SETPARAM
+ {"sched_getparam", posix_sched_getparam, METH_VARARGS, posix_sched_getparam__doc__},
+#endif
+#ifdef HAVE_SCHED_SETSCHEDULER
+ {"sched_getscheduler", posix_sched_getscheduler, METH_VARARGS, posix_sched_getscheduler__doc__},
+#endif
+#ifdef HAVE_SCHED_RR_GET_INTERVAL
+ {"sched_rr_get_interval", posix_sched_rr_get_interval, METH_VARARGS, posix_sched_rr_get_interval__doc__},
+#endif
+#ifdef HAVE_SCHED_SETPARAM
+ {"sched_setparam", posix_sched_setparam, METH_VARARGS, posix_sched_setparam__doc__},
+#endif
+#ifdef HAVE_SCHED_SETSCHEDULER
+ {"sched_setscheduler", posix_sched_setscheduler, METH_VARARGS, posix_sched_setscheduler__doc__},
+#endif
+ {"sched_yield", posix_sched_yield, METH_NOARGS, posix_sched_yield__doc__},
+#ifdef HAVE_SCHED_SETAFFINITY
+ {"sched_setaffinity", posix_sched_setaffinity, METH_VARARGS, posix_sched_setaffinity__doc__},
+ {"sched_getaffinity", posix_sched_getaffinity, METH_VARARGS, posix_sched_getaffinity__doc__},
+#endif
+#endif /* HAVE_SCHED_H */
#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
{"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__},
#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */
@@ -7870,6 +10877,9 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_GETGID
{"getgid", posix_getgid, METH_NOARGS, posix_getgid__doc__},
#endif /* HAVE_GETGID */
+#ifdef HAVE_GETGROUPLIST
+ {"getgrouplist", posix_getgrouplist, METH_VARARGS, posix_getgrouplist__doc__},
+#endif
#ifdef HAVE_GETGROUPS
{"getgroups", posix_getgroups, METH_NOARGS, posix_getgroups__doc__},
#endif
@@ -7898,7 +10908,6 @@ static PyMethodDef posix_methods[] = {
#ifdef MS_WINDOWS
{"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__},
{"kill", win32_kill, METH_VARARGS, win32_kill__doc__},
- {"link", win32_link, METH_VARARGS, win32_link__doc__},
#endif
#ifdef HAVE_SETUID
{"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
@@ -7939,6 +10948,9 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_WAIT4
{"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__},
#endif /* HAVE_WAIT4 */
+#if defined(HAVE_WAITID) && !defined(__APPLE__)
+ {"waitid", posix_waitid, METH_VARARGS, posix_waitid__doc__},
+#endif
#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
{"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
#endif /* HAVE_WAITPID */
@@ -7957,25 +10969,53 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_TCSETPGRP
{"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
#endif /* HAVE_TCSETPGRP */
- {"open", posix_open, METH_VARARGS, posix_open__doc__},
+ {"open", (PyCFunction)posix_open,\
+ METH_VARARGS | METH_KEYWORDS,
+ posix_open__doc__},
{"close", posix_close, METH_VARARGS, posix_close__doc__},
{"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__},
{"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__},
{"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
{"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
+#ifdef HAVE_LOCKF
+ {"lockf", posix_lockf, METH_VARARGS, posix_lockf__doc__},
+#endif
{"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
{"read", posix_read, METH_VARARGS, posix_read__doc__},
+#ifdef HAVE_READV
+ {"readv", posix_readv, METH_VARARGS, posix_readv__doc__},
+#endif
+#ifdef HAVE_PREAD
+ {"pread", posix_pread, METH_VARARGS, posix_pread__doc__},
+#endif
{"write", posix_write, METH_VARARGS, posix_write__doc__},
+#ifdef HAVE_WRITEV
+ {"writev", posix_writev, METH_VARARGS, posix_writev__doc__},
+#endif
+#ifdef HAVE_PWRITE
+ {"pwrite", posix_pwrite, METH_VARARGS, posix_pwrite__doc__},
+#endif
+#ifdef HAVE_SENDFILE
+ {"sendfile", (PyCFunction)posix_sendfile, METH_VARARGS | METH_KEYWORDS,
+ posix_sendfile__doc__},
+#endif
{"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
{"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__},
#ifdef HAVE_PIPE
{"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__},
#endif
+#ifdef HAVE_PIPE2
+ {"pipe2", posix_pipe2, METH_O, posix_pipe2__doc__},
+#endif
#ifdef HAVE_MKFIFO
- {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
+ {"mkfifo", (PyCFunction)posix_mkfifo,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_mkfifo__doc__},
#endif
#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
- {"mknod", posix_mknod, METH_VARARGS, posix_mknod__doc__},
+ {"mknod", (PyCFunction)posix_mknod,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_mknod__doc__},
#endif
#ifdef HAVE_DEVICE_MACROS
{"major", posix_major, METH_VARARGS, posix_major__doc__},
@@ -7985,6 +11025,17 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_FTRUNCATE
{"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
#endif
+#ifdef HAVE_TRUNCATE
+ {"truncate", (PyCFunction)posix_truncate,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_truncate__doc__},
+#endif
+#ifdef HAVE_POSIX_FALLOCATE
+ {"posix_fallocate", posix_posix_fallocate, METH_VARARGS, posix_posix_fallocate__doc__},
+#endif
+#ifdef HAVE_POSIX_FADVISE
+ {"posix_fadvise", posix_posix_fadvise, METH_VARARGS, posix_posix_fadvise__doc__},
+#endif
#ifdef HAVE_PUTENV
{"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
#endif
@@ -7998,6 +11049,9 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_FSYNC
{"fsync", posix_fsync, METH_O, posix_fsync__doc__},
#endif
+#ifdef HAVE_SYNC
+ {"sync", posix_sync, METH_NOARGS, posix_sync__doc__},
+#endif
#ifdef HAVE_FDATASYNC
{"fdatasync", posix_fdatasync, METH_O, posix_fdatasync__doc__},
#endif
@@ -8031,7 +11085,9 @@ static PyMethodDef posix_methods[] = {
{"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
#endif
#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
- {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
+ {"statvfs", (PyCFunction)posix_statvfs,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_statvfs__doc__},
#endif
#ifdef HAVE_CONFSTR
{"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
@@ -8043,7 +11099,9 @@ static PyMethodDef posix_methods[] = {
{"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
#endif
#ifdef HAVE_PATHCONF
- {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
+ {"pathconf", (PyCFunction)posix_pathconf,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_pathconf__doc__},
#endif
{"abort", posix_abort, METH_NOARGS, posix_abort__doc__},
#ifdef MS_WINDOWS
@@ -8051,6 +11109,7 @@ static PyMethodDef posix_methods[] = {
{"_getfinalpathname", posix__getfinalpathname, METH_VARARGS, NULL},
{"_getfileinformation", posix__getfileinformation, METH_VARARGS, NULL},
{"_isdir", posix__isdir, METH_VARARGS, posix__isdir__doc__},
+ {"_getdiskusage", win32__getdiskusage, METH_VARARGS, win32__getdiskusage__doc__},
#endif
#ifdef HAVE_GETLOADAVG
{"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
@@ -8068,6 +11127,24 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_GETRESGID
{"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__},
#endif
+
+#ifdef USE_XATTRS
+ {"setxattr", (PyCFunction)posix_setxattr,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_setxattr__doc__},
+ {"getxattr", (PyCFunction)posix_getxattr,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_getxattr__doc__},
+ {"removexattr", (PyCFunction)posix_removexattr,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_removexattr__doc__},
+ {"listxattr", (PyCFunction)posix_listxattr,
+ METH_VARARGS | METH_KEYWORDS,
+ posix_listxattr__doc__},
+#endif
+#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)
+ {"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__},
+#endif
{NULL, NULL} /* Sentinel */
};
@@ -8235,6 +11312,9 @@ all_ins(PyObject *d)
#ifdef O_TEXT
if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
#endif
+#ifdef O_XATTR
+ if (ins(d, "O_XATTR", (long)O_XATTR)) return -1;
+#endif
#ifdef O_LARGEFILE
if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
#endif
@@ -8244,6 +11324,38 @@ all_ins(PyObject *d)
#ifdef O_EXLOCK
if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
#endif
+#ifdef O_EXEC
+ if (ins(d, "O_EXEC", (long)O_EXEC)) return -1;
+#endif
+#ifdef O_SEARCH
+ if (ins(d, "O_SEARCH", (long)O_SEARCH)) return -1;
+#endif
+#ifdef O_TTY_INIT
+ if (ins(d, "O_TTY_INIT", (long)O_TTY_INIT)) return -1;
+#endif
+#ifdef PRIO_PROCESS
+ if (ins(d, "PRIO_PROCESS", (long)PRIO_PROCESS)) return -1;
+#endif
+#ifdef PRIO_PGRP
+ if (ins(d, "PRIO_PGRP", (long)PRIO_PGRP)) return -1;
+#endif
+#ifdef PRIO_USER
+ if (ins(d, "PRIO_USER", (long)PRIO_USER)) return -1;
+#endif
+#ifdef O_CLOEXEC
+ if (ins(d, "O_CLOEXEC", (long)O_CLOEXEC)) return -1;
+#endif
+#ifdef O_ACCMODE
+ if (ins(d, "O_ACCMODE", (long)O_ACCMODE)) return -1;
+#endif
+
+
+#ifdef SEEK_HOLE
+ if (ins(d, "SEEK_HOLE", (long)SEEK_HOLE)) return -1;
+#endif
+#ifdef SEEK_DATA
+ if (ins(d, "SEEK_DATA", (long)SEEK_DATA)) return -1;
+#endif
/* MS Windows */
#ifdef O_NOINHERIT
@@ -8286,6 +11398,10 @@ all_ins(PyObject *d)
/* Do not follow links. */
if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
#endif
+#ifdef O_NOLINKS
+ /* Fails if link count of the named file is greater than 1 */
+ if (ins(d, "O_NOLINKS", (long)O_NOLINKS)) return -1;
+#endif
#ifdef O_NOATIME
/* Do not update the access time. */
if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
@@ -8352,6 +11468,79 @@ all_ins(PyObject *d)
if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
#endif /* ST_NOSUID */
+ /* FreeBSD sendfile() constants */
+#ifdef SF_NODISKIO
+ if (ins(d, "SF_NODISKIO", (long)SF_NODISKIO)) return -1;
+#endif
+#ifdef SF_MNOWAIT
+ if (ins(d, "SF_MNOWAIT", (long)SF_MNOWAIT)) return -1;
+#endif
+#ifdef SF_SYNC
+ if (ins(d, "SF_SYNC", (long)SF_SYNC)) return -1;
+#endif
+
+ /* constants for posix_fadvise */
+#ifdef POSIX_FADV_NORMAL
+ if (ins(d, "POSIX_FADV_NORMAL", (long)POSIX_FADV_NORMAL)) return -1;
+#endif
+#ifdef POSIX_FADV_SEQUENTIAL
+ if (ins(d, "POSIX_FADV_SEQUENTIAL", (long)POSIX_FADV_SEQUENTIAL)) return -1;
+#endif
+#ifdef POSIX_FADV_RANDOM
+ if (ins(d, "POSIX_FADV_RANDOM", (long)POSIX_FADV_RANDOM)) return -1;
+#endif
+#ifdef POSIX_FADV_NOREUSE
+ if (ins(d, "POSIX_FADV_NOREUSE", (long)POSIX_FADV_NOREUSE)) return -1;
+#endif
+#ifdef POSIX_FADV_WILLNEED
+ if (ins(d, "POSIX_FADV_WILLNEED", (long)POSIX_FADV_WILLNEED)) return -1;
+#endif
+#ifdef POSIX_FADV_DONTNEED
+ if (ins(d, "POSIX_FADV_DONTNEED", (long)POSIX_FADV_DONTNEED)) return -1;
+#endif
+
+ /* constants for waitid */
+#if defined(HAVE_SYS_WAIT_H) && defined(HAVE_WAITID)
+ if (ins(d, "P_PID", (long)P_PID)) return -1;
+ if (ins(d, "P_PGID", (long)P_PGID)) return -1;
+ if (ins(d, "P_ALL", (long)P_ALL)) return -1;
+#endif
+#ifdef WEXITED
+ if (ins(d, "WEXITED", (long)WEXITED)) return -1;
+#endif
+#ifdef WNOWAIT
+ if (ins(d, "WNOWAIT", (long)WNOWAIT)) return -1;
+#endif
+#ifdef WSTOPPED
+ if (ins(d, "WSTOPPED", (long)WSTOPPED)) return -1;
+#endif
+#ifdef CLD_EXITED
+ if (ins(d, "CLD_EXITED", (long)CLD_EXITED)) return -1;
+#endif
+#ifdef CLD_DUMPED
+ if (ins(d, "CLD_DUMPED", (long)CLD_DUMPED)) return -1;
+#endif
+#ifdef CLD_TRAPPED
+ if (ins(d, "CLD_TRAPPED", (long)CLD_TRAPPED)) return -1;
+#endif
+#ifdef CLD_CONTINUED
+ if (ins(d, "CLD_CONTINUED", (long)CLD_CONTINUED)) return -1;
+#endif
+
+ /* constants for lockf */
+#ifdef F_LOCK
+ if (ins(d, "F_LOCK", (long)F_LOCK)) return -1;
+#endif
+#ifdef F_TLOCK
+ if (ins(d, "F_TLOCK", (long)F_TLOCK)) return -1;
+#endif
+#ifdef F_ULOCK
+ if (ins(d, "F_ULOCK", (long)F_ULOCK)) return -1;
+#endif
+#ifdef F_TEST
+ if (ins(d, "F_TEST", (long)F_TEST)) return -1;
+#endif
+
#ifdef HAVE_SPAWNV
#if defined(PYOS_OS2) && defined(PYCC_GCC)
if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
@@ -8383,6 +11572,64 @@ all_ins(PyObject *d)
#endif
#endif
+#ifdef HAVE_SCHED_H
+ if (ins(d, "SCHED_OTHER", (long)SCHED_OTHER)) return -1;
+ if (ins(d, "SCHED_FIFO", (long)SCHED_FIFO)) return -1;
+ if (ins(d, "SCHED_RR", (long)SCHED_RR)) return -1;
+#ifdef SCHED_SPORADIC
+ if (ins(d, "SCHED_SPORADIC", (long)SCHED_SPORADIC) return -1;
+#endif
+#ifdef SCHED_BATCH
+ if (ins(d, "SCHED_BATCH", (long)SCHED_BATCH)) return -1;
+#endif
+#ifdef SCHED_IDLE
+ if (ins(d, "SCHED_IDLE", (long)SCHED_IDLE)) return -1;
+#endif
+#ifdef SCHED_RESET_ON_FORK
+ if (ins(d, "SCHED_RESET_ON_FORK", (long)SCHED_RESET_ON_FORK)) return -1;
+#endif
+#ifdef SCHED_SYS
+ if (ins(d, "SCHED_SYS", (long)SCHED_SYS)) return -1;
+#endif
+#ifdef SCHED_IA
+ if (ins(d, "SCHED_IA", (long)SCHED_IA)) return -1;
+#endif
+#ifdef SCHED_FSS
+ if (ins(d, "SCHED_FSS", (long)SCHED_FSS)) return -1;
+#endif
+#ifdef SCHED_FX
+ if (ins(d, "SCHED_FX", (long)SCHED_FSS)) return -1;
+#endif
+#endif
+
+#ifdef USE_XATTRS
+ if (ins(d, "XATTR_CREATE", (long)XATTR_CREATE)) return -1;
+ if (ins(d, "XATTR_REPLACE", (long)XATTR_REPLACE)) return -1;
+ if (ins(d, "XATTR_SIZE_MAX", (long)XATTR_SIZE_MAX)) return -1;
+#endif
+
+#ifdef RTLD_LAZY
+ if (PyModule_AddIntMacro(d, RTLD_LAZY)) return -1;
+#endif
+#ifdef RTLD_NOW
+ if (PyModule_AddIntMacro(d, RTLD_NOW)) return -1;
+#endif
+#ifdef RTLD_GLOBAL
+ if (PyModule_AddIntMacro(d, RTLD_GLOBAL)) return -1;
+#endif
+#ifdef RTLD_LOCAL
+ if (PyModule_AddIntMacro(d, RTLD_LOCAL)) return -1;
+#endif
+#ifdef RTLD_NODELETE
+ if (PyModule_AddIntMacro(d, RTLD_NODELETE)) return -1;
+#endif
+#ifdef RTLD_NOLOAD
+ if (PyModule_AddIntMacro(d, RTLD_NOLOAD)) return -1;
+#endif
+#ifdef RTLD_DEEPBIND
+ if (PyModule_AddIntMacro(d, RTLD_DEEPBIND)) return -1;
+#endif
+
#if defined(PYOS_OS2)
if (insertvalues(d)) return -1;
#endif
@@ -8416,10 +11663,138 @@ static struct PyModuleDef posixmodule = {
};
+static char *have_functions[] = {
+
+#ifdef HAVE_FACCESSAT
+ "HAVE_FACCESSAT",
+#endif
+
+#ifdef HAVE_FCHDIR
+ "HAVE_FCHDIR",
+#endif
+
+#ifdef HAVE_FCHMOD
+ "HAVE_FCHMOD",
+#endif
+
+#ifdef HAVE_FCHMODAT
+ "HAVE_FCHMODAT",
+#endif
+
+#ifdef HAVE_FCHOWN
+ "HAVE_FCHOWN",
+#endif
+
+#ifdef HAVE_FEXECVE
+ "HAVE_FEXECVE",
+#endif
+
+#ifdef HAVE_FDOPENDIR
+ "HAVE_FDOPENDIR",
+#endif
+
+#ifdef HAVE_FPATHCONF
+ "HAVE_FPATHCONF",
+#endif
+
+#ifdef HAVE_FSTATAT
+ "HAVE_FSTATAT",
+#endif
+
+#ifdef HAVE_FSTATVFS
+ "HAVE_FSTATVFS",
+#endif
+
+#ifdef HAVE_FTRUNCATE
+ "HAVE_FTRUNCATE",
+#endif
+
+#ifdef HAVE_FUTIMENS
+ "HAVE_FUTIMENS",
+#endif
+
+#ifdef HAVE_FUTIMES
+ "HAVE_FUTIMES",
+#endif
+
+#ifdef HAVE_FUTIMESAT
+ "HAVE_FUTIMESAT",
+#endif
+
+#ifdef HAVE_LINKAT
+ "HAVE_LINKAT",
+#endif
+
+#ifdef HAVE_LCHFLAGS
+ "HAVE_LCHFLAGS",
+#endif
+
+#ifdef HAVE_LCHMOD
+ "HAVE_LCHMOD",
+#endif
+
+#ifdef HAVE_LCHOWN
+ "HAVE_LCHOWN",
+#endif
+
+#ifdef HAVE_LSTAT
+ "HAVE_LSTAT",
+#endif
+
+#ifdef HAVE_LUTIMES
+ "HAVE_LUTIMES",
+#endif
+
+#ifdef HAVE_MKDIRAT
+ "HAVE_MKDIRAT",
+#endif
+
+#ifdef HAVE_MKFIFOAT
+ "HAVE_MKFIFOAT",
+#endif
+
+#ifdef HAVE_MKNODAT
+ "HAVE_MKNODAT",
+#endif
+
+#ifdef HAVE_OPENAT
+ "HAVE_OPENAT",
+#endif
+
+#ifdef HAVE_READLINKAT
+ "HAVE_READLINKAT",
+#endif
+
+#ifdef HAVE_RENAMEAT
+ "HAVE_RENAMEAT",
+#endif
+
+#ifdef HAVE_SYMLINKAT
+ "HAVE_SYMLINKAT",
+#endif
+
+#ifdef HAVE_UNLINKAT
+ "HAVE_UNLINKAT",
+#endif
+
+#ifdef HAVE_UTIMENSAT
+ "HAVE_UTIMENSAT",
+#endif
+
+#ifdef MS_WINDOWS
+ "MS_WINDOWS",
+#endif
+
+ NULL
+};
+
+
PyMODINIT_FUNC
INITFUNC(void)
{
PyObject *m, *v;
+ PyObject *list;
+ char **trace;
#if defined(HAVE_SYMLINK) && defined(MS_WINDOWS)
win32_can_symlink = enable_symlink();
@@ -8451,6 +11826,11 @@ INITFUNC(void)
#endif
if (!initialized) {
+#if defined(HAVE_WAITID) && !defined(__APPLE__)
+ waitid_result_desc.name = MODNAME ".waitid_result";
+ PyStructSequence_InitType(&WaitidResultType, &waitid_result_desc);
+#endif
+
stat_result_desc.name = MODNAME ".stat_result";
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
@@ -8470,13 +11850,38 @@ INITFUNC(void)
ticks_per_second = 60; /* magic fallback value; may be bogus */
# endif
#endif
+
+#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
+ sched_param_desc.name = MODNAME ".sched_param";
+ PyStructSequence_InitType(&SchedParamType, &sched_param_desc);
+ SchedParamType.tp_new = sched_param_new;
+#endif
+
+ /* initialize TerminalSize_info */
+ PyStructSequence_InitType(&TerminalSizeType, &TerminalSize_desc);
}
+#if defined(HAVE_WAITID) && !defined(__APPLE__)
+ Py_INCREF((PyObject*) &WaitidResultType);
+ PyModule_AddObject(m, "waitid_result", (PyObject*) &WaitidResultType);
+#endif
Py_INCREF((PyObject*) &StatResultType);
PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType);
Py_INCREF((PyObject*) &StatVFSResultType);
PyModule_AddObject(m, "statvfs_result",
(PyObject*) &StatVFSResultType);
- initialized = 1;
+
+#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
+ Py_INCREF(&SchedParamType);
+ PyModule_AddObject(m, "sched_param", (PyObject *)&SchedParamType);
+#endif
+
+ times_result_desc.name = MODNAME ".times_result";
+ PyStructSequence_InitType(&TimesResultType, &times_result_desc);
+ PyModule_AddObject(m, "times_result", (PyObject *)&TimesResultType);
+
+ uname_result_desc.name = MODNAME ".uname_result";
+ PyStructSequence_InitType(&UnameResultType, &uname_result_desc);
+ PyModule_AddObject(m, "uname_result", (PyObject *)&UnameResultType);
#ifdef __APPLE__
/*
@@ -8486,7 +11891,7 @@ INITFUNC(void)
* currently active platform.
*
* This block allow one to use a python binary that was build on
- * OSX 10.4 on OSX 10.3, without loosing access to new APIs on
+ * OSX 10.4 on OSX 10.3, without losing access to new APIs on
* OSX 10.4.
*/
#ifdef HAVE_FSTATVFS
@@ -8515,6 +11920,43 @@ INITFUNC(void)
#endif /* __APPLE__ */
+
+ Py_INCREF(&TerminalSizeType);
+ PyModule_AddObject(m, "terminal_size", (PyObject*) &TerminalSizeType);
+
+ billion = PyLong_FromLong(1000000000);
+ if (!billion)
+ return NULL;
+
+ /* suppress "function not used" warnings */
+ {
+ int ignored;
+ fd_specified("", -1);
+ follow_symlinks_specified("", 1);
+ dir_fd_and_follow_symlinks_invalid("chmod", DEFAULT_DIR_FD, 1);
+ dir_fd_converter(Py_None, &ignored);
+ dir_fd_unavailable(Py_None, &ignored);
+ }
+
+ /*
+ * provide list of locally available functions
+ * so os.py can populate support_* lists
+ */
+ list = PyList_New(0);
+ if (!list)
+ return NULL;
+ for (trace = have_functions; *trace; trace++) {
+ PyObject *unicode = PyUnicode_DecodeASCII(*trace, strlen(*trace), NULL);
+ if (!unicode)
+ return NULL;
+ if (PyList_Append(list, unicode))
+ return NULL;
+ Py_DECREF(unicode);
+ }
+ PyModule_AddObject(m, "_have_functions", list);
+
+ initialized = 1;
+
return m;
}
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 4b9687a..3f59f0f 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -100,16 +100,17 @@ static PyObject *
set_error(xmlparseobject *self, enum XML_Error code)
{
PyObject *err;
- char buffer[256];
+ PyObject *buffer;
XML_Parser parser = self->itself;
int lineno = XML_GetErrorLineNumber(parser);
int column = XML_GetErrorColumnNumber(parser);
- /* There is no risk of overflowing this buffer, since
- even for 64-bit integers, there is sufficient space. */
- sprintf(buffer, "%.200s: line %i, column %i",
- XML_ErrorString(code), lineno, column);
- err = PyObject_CallFunction(ErrorObject, "s", buffer);
+ buffer = PyUnicode_FromFormat("%s: line %i, column %i",
+ XML_ErrorString(code), lineno, column);
+ if (buffer == NULL)
+ return NULL;
+ err = PyObject_CallFunction(ErrorObject, "O", buffer);
+ Py_DECREF(buffer);
if ( err != NULL
&& set_error_attr(err, "code", code)
&& set_error_attr(err, "offset", column)
@@ -842,9 +843,9 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f)
{
int rv = 1;
PyObject *readmethod = NULL;
+ _Py_IDENTIFIER(read);
-
- readmethod = PyObject_GetAttrString(f, "read");
+ readmethod = _PyObject_GetAttrId(f, &PyId_read);
if (readmethod == NULL) {
PyErr_SetString(PyExc_TypeError,
"argument must have 'read' attribute");
@@ -1032,16 +1033,10 @@ getting the advantage of providing document type information to the parser.\n\
static PyObject *
xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args)
{
- PyObject *flagobj = NULL;
int flag = 1;
enum XML_Error rc;
- if (!PyArg_ParseTuple(args, "|O:UseForeignDTD", &flagobj))
+ if (!PyArg_ParseTuple(args, "|p:UseForeignDTD", &flag))
return NULL;
- if (flagobj != NULL) {
- flag = PyObject_IsTrue(flagobj);
- if (flag < 0)
- return NULL;
- }
rc = XML_UseForeignDTD(self->itself, flag ? XML_TRUE : XML_FALSE);
if (rc != XML_ERROR_NONE) {
return set_error(self, rc);
@@ -1104,17 +1099,22 @@ PyUnknownEncodingHandler(void *encodingHandlerData,
PyUnicodeObject *_u_string = NULL;
int result = 0;
int i;
+ int kind;
+ void *data;
/* Yes, supports only 8bit encodings */
_u_string = (PyUnicodeObject *)
PyUnicode_Decode(template_buffer, 256, name, "replace");
- if (_u_string == NULL)
+ if (_u_string == NULL || PyUnicode_READY(_u_string) == -1)
return result;
+ kind = PyUnicode_KIND(_u_string);
+ data = PyUnicode_DATA(_u_string);
+
for (i = 0; i < 256; i++) {
/* Stupid to access directly, but fast */
- Py_UNICODE c = _u_string->str[i];
+ Py_UCS4 c = PyUnicode_READ(kind, data, i);
if (c == Py_UNICODE_REPLACEMENT_CHARACTER)
info->map[i] = -1;
else
@@ -1238,11 +1238,13 @@ get_pybool(int istrue)
static PyObject *
xmlparse_getattro(xmlparseobject *self, PyObject *nameobj)
{
- Py_UNICODE *name;
+ Py_UCS4 first_char;
int handlernum = -1;
if (!PyUnicode_Check(nameobj))
goto generic;
+ if (PyUnicode_READY(nameobj))
+ return NULL;
handlernum = handlername2int(nameobj);
@@ -1254,8 +1256,8 @@ xmlparse_getattro(xmlparseobject *self, PyObject *nameobj)
return result;
}
- name = PyUnicode_AS_UNICODE(nameobj);
- if (name[0] == 'E') {
+ first_char = PyUnicode_READ_CHAR(nameobj, 0);
+ if (first_char == 'E') {
if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorCode") == 0)
return PyLong_FromLong((long)
XML_GetErrorCode(self->itself));
@@ -1269,7 +1271,7 @@ xmlparse_getattro(xmlparseobject *self, PyObject *nameobj)
return PyLong_FromLong((long)
XML_GetErrorByteIndex(self->itself));
}
- if (name[0] == 'C') {
+ if (first_char == 'C') {
if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentLineNumber") == 0)
return PyLong_FromLong((long)
XML_GetCurrentLineNumber(self->itself));
@@ -1280,7 +1282,7 @@ xmlparse_getattro(xmlparseobject *self, PyObject *nameobj)
return PyLong_FromLong((long)
XML_GetCurrentByteIndex(self->itself));
}
- if (name[0] == 'b') {
+ if (first_char == 'b') {
if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_size") == 0)
return PyLong_FromLong((long) self->buffer_size);
if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_text") == 0)
@@ -1674,7 +1676,6 @@ MODULE_INITFUNC(void)
PyObject *errors_module;
PyObject *modelmod_name;
PyObject *model_module;
- PyObject *version;
PyObject *sys_modules;
PyObject *tmpnum, *tmpstr;
PyObject *codes_dict;
@@ -1711,10 +1712,6 @@ MODULE_INITFUNC(void)
Py_INCREF(&Xmlparsetype);
PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);
- version = PyUnicode_FromString(PY_VERSION);
- if (!version)
- return NULL;
- PyModule_AddObject(m, "__version__", version);
PyModule_AddStringConstant(m, "EXPAT_VERSION",
(char *) XML_ExpatVersion());
{
@@ -1907,6 +1904,7 @@ MODULE_INITFUNC(void)
capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler;
capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler;
capi.SetUserData = XML_SetUserData;
+ capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
/* export using capsule */
capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);
diff --git a/Modules/python.c b/Modules/python.c
index cf9383f..c70bf37 100644
--- a/Modules/python.c
+++ b/Modules/python.c
@@ -51,6 +51,7 @@ main(int argc, char **argv)
argv_copy[i] = _Py_char2wchar(argv[i], NULL);
#endif
if (!argv_copy[i]) {
+ free(oldloc);
fprintf(stderr, "Fatal Python error: "
"unable to decode the command line argument #%i\n",
i + 1);
diff --git a/Modules/readline.c b/Modules/readline.c
index 4d54dad..a710652 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -235,10 +235,9 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *args)
Py_XDECREF(tmp);
}
else {
- PyOS_snprintf(buf, sizeof(buf),
- "set_%.50s(func): argument not callable",
- funcname);
- PyErr_SetString(PyExc_TypeError, buf);
+ PyErr_Format(PyExc_TypeError,
+ "set_%.50s(func): argument not callable",
+ funcname);
return NULL;
}
Py_RETURN_NONE;
@@ -892,7 +891,7 @@ setup_readline(void)
#endif
#ifdef __APPLE__
- /* the libedit readline emulation resets key bindings etc
+ /* the libedit readline emulation resets key bindings etc
* when calling rl_initialize. So call it upfront
*/
if (using_libedit_emulation)
@@ -932,11 +931,11 @@ setup_readline(void)
*/
#ifdef __APPLE__
if (using_libedit_emulation)
- rl_read_init_file(NULL);
+ rl_read_init_file(NULL);
else
#endif /* __APPLE__ */
rl_initialize();
-
+
RESTORE_LOCALE(saved_locale)
}
diff --git a/Modules/resource.c b/Modules/resource.c
index 1875e48..1aed497 100644
--- a/Modules/resource.c
+++ b/Modules/resource.c
@@ -18,8 +18,6 @@
#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
-static PyObject *ResourceError;
-
PyDoc_STRVAR(struct_rusage__doc__,
"struct_rusage: Result from getrusage.\n\n"
"This object may be accessed either as a tuple of\n"
@@ -73,7 +71,7 @@ resource_getrusage(PyObject *self, PyObject *args)
"invalid who parameter");
return NULL;
}
- PyErr_SetFromErrno(ResourceError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -125,7 +123,7 @@ resource_getrlimit(PyObject *self, PyObject *args)
}
if (getrlimit(resource, &rl) == -1) {
- PyErr_SetFromErrno(ResourceError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -183,7 +181,7 @@ resource_setrlimit(PyObject *self, PyObject *args)
PyErr_SetString(PyExc_ValueError,
"not allowed to raise maximum limit");
else
- PyErr_SetFromErrno(ResourceError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
Py_INCREF(Py_None);
@@ -246,12 +244,8 @@ PyInit_resource(void)
return NULL;
/* Add some symbolic constants to the module */
- if (ResourceError == NULL) {
- ResourceError = PyErr_NewException("resource.error",
- NULL, NULL);
- }
- Py_INCREF(ResourceError);
- PyModule_AddObject(m, "error", ResourceError);
+ Py_INCREF(PyExc_OSError);
+ PyModule_AddObject(m, "error", PyExc_OSError);
if (!initialized)
PyStructSequence_InitType(&StructRUsageType,
&struct_rusage_desc);
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 0736215..9e53773 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -7,6 +7,14 @@
#include "Python.h"
#include <structmember.h>
+#ifdef HAVE_SYS_DEVPOLL_H
+#include <sys/resource.h>
+#include <sys/devpoll.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#endif
+
#ifdef __APPLE__
/* Perform runtime testing for a broken poll on OSX to make it easier
* to use the same binary on multiple releases of the OS.
@@ -54,8 +62,6 @@ extern void bzero(void *, int);
# endif
#endif
-static PyObject *SelectError;
-
/* list of Python objects and their file descriptor */
typedef struct {
PyObject *obj; /* owned reference */
@@ -198,9 +204,7 @@ select_select(PyObject *self, PyObject *args)
PyObject *ret = NULL;
PyObject *tout = Py_None;
fd_set ifdset, ofdset, efdset;
- double timeout;
struct timeval tv, *tvp;
- long seconds;
int imax, omax, emax, max;
int n;
@@ -217,18 +221,31 @@ select_select(PyObject *self, PyObject *args)
return NULL;
}
else {
- timeout = PyFloat_AsDouble(tout);
- if (timeout == -1 && PyErr_Occurred())
+#ifdef MS_WINDOWS
+ time_t sec;
+ if (_PyTime_ObjectToTimeval(tout, &sec, &tv.tv_usec) == -1)
return NULL;
- if (timeout > (double)LONG_MAX) {
+ assert(sizeof(tv.tv_sec) == sizeof(long));
+#if SIZEOF_TIME_T > SIZEOF_LONG
+ if (sec > LONG_MAX) {
PyErr_SetString(PyExc_OverflowError,
- "timeout period too long");
+ "timeout is too large");
+ return NULL;
+ }
+#endif
+ tv.tv_sec = (long)sec;
+#else
+ /* 64-bit OS X has struct timeval.tv_usec as an int (and thus still 4
+ bytes as required), but no longer defined by a long. */
+ long tv_usec;
+ if (_PyTime_ObjectToTimeval(tout, &tv.tv_sec, &tv_usec) == -1)
+ return NULL;
+ tv.tv_usec = tv_usec;
+#endif
+ if (tv.tv_sec < 0) {
+ PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
return NULL;
}
- seconds = (long)timeout;
- timeout = timeout - (double)seconds;
- tv.tv_sec = seconds;
- tv.tv_usec = (long)(timeout * 1E6);
tvp = &tv;
}
@@ -267,11 +284,11 @@ select_select(PyObject *self, PyObject *args)
#ifdef MS_WINDOWS
if (n == SOCKET_ERROR) {
- PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
+ PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
}
#else
if (n < 0) {
- PyErr_SetFromErrno(SelectError);
+ PyErr_SetFromErrno(PyExc_OSError);
}
#endif
else {
@@ -418,7 +435,7 @@ poll_modify(pollObject *self, PyObject *args)
return NULL;
if (PyDict_GetItem(self->dict, key) == NULL) {
errno = ENOENT;
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
Py_DECREF(key);
return NULL;
}
@@ -518,7 +535,7 @@ poll_poll(pollObject *self, PyObject *args)
Py_END_ALLOW_THREADS
if (poll_result < 0) {
- PyErr_SetFromErrno(SelectError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -644,6 +661,339 @@ static PyTypeObject poll_Type = {
poll_methods, /*tp_methods*/
};
+#ifdef HAVE_SYS_DEVPOLL_H
+typedef struct {
+ PyObject_HEAD
+ int fd_devpoll;
+ int max_n_fds;
+ int n_fds;
+ struct pollfd *fds;
+} devpollObject;
+
+static PyTypeObject devpoll_Type;
+
+static int devpoll_flush(devpollObject *self)
+{
+ int size, n;
+
+ if (!self->n_fds) return 0;
+
+ size = sizeof(struct pollfd)*self->n_fds;
+ self->n_fds = 0;
+
+ Py_BEGIN_ALLOW_THREADS
+ n = write(self->fd_devpoll, self->fds, size);
+ Py_END_ALLOW_THREADS
+
+ if (n == -1 ) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return -1;
+ }
+ if (n < size) {
+ /*
+ ** Data writed to /dev/poll is a binary data structure. It is not
+ ** clear what to do if a partial write occurred. For now, raise
+ ** an exception and see if we actually found this problem in
+ ** the wild.
+ ** See http://bugs.python.org/issue6397.
+ */
+ PyErr_Format(PyExc_IOError, "failed to write all pollfds. "
+ "Please, report at http://bugs.python.org/. "
+ "Data to report: Size tried: %d, actual size written: %d.",
+ size, n);
+ return -1;
+ }
+ return 0;
+}
+
+static PyObject *
+internal_devpoll_register(devpollObject *self, PyObject *args, int remove)
+{
+ PyObject *o;
+ int fd, events = POLLIN | POLLPRI | POLLOUT;
+
+ if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) {
+ return NULL;
+ }
+
+ fd = PyObject_AsFileDescriptor(o);
+ if (fd == -1) return NULL;
+
+ if (remove) {
+ self->fds[self->n_fds].fd = fd;
+ self->fds[self->n_fds].events = POLLREMOVE;
+
+ if (++self->n_fds == self->max_n_fds) {
+ if (devpoll_flush(self))
+ return NULL;
+ }
+ }
+
+ self->fds[self->n_fds].fd = fd;
+ self->fds[self->n_fds].events = events;
+
+ if (++self->n_fds == self->max_n_fds) {
+ if (devpoll_flush(self))
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(devpoll_register_doc,
+"register(fd [, eventmask] ) -> None\n\n\
+Register a file descriptor with the polling object.\n\
+fd -- either an integer, or an object with a fileno() method returning an\n\
+ int.\n\
+events -- an optional bitmask describing the type of events to check for");
+
+static PyObject *
+devpoll_register(devpollObject *self, PyObject *args)
+{
+ return internal_devpoll_register(self, args, 0);
+}
+
+PyDoc_STRVAR(devpoll_modify_doc,
+"modify(fd[, eventmask]) -> None\n\n\
+Modify a possible already registered file descriptor.\n\
+fd -- either an integer, or an object with a fileno() method returning an\n\
+ int.\n\
+events -- an optional bitmask describing the type of events to check for");
+
+static PyObject *
+devpoll_modify(devpollObject *self, PyObject *args)
+{
+ return internal_devpoll_register(self, args, 1);
+}
+
+
+PyDoc_STRVAR(devpoll_unregister_doc,
+"unregister(fd) -> None\n\n\
+Remove a file descriptor being tracked by the polling object.");
+
+static PyObject *
+devpoll_unregister(devpollObject *self, PyObject *o)
+{
+ int fd;
+
+ fd = PyObject_AsFileDescriptor( o );
+ if (fd == -1)
+ return NULL;
+
+ self->fds[self->n_fds].fd = fd;
+ self->fds[self->n_fds].events = POLLREMOVE;
+
+ if (++self->n_fds == self->max_n_fds) {
+ if (devpoll_flush(self))
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(devpoll_poll_doc,
+"poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
+Polls the set of registered file descriptors, returning a list containing \n\
+any descriptors that have events or errors to report.");
+
+static PyObject *
+devpoll_poll(devpollObject *self, PyObject *args)
+{
+ struct dvpoll dvp;
+ PyObject *result_list = NULL, *tout = NULL;
+ int poll_result, i;
+ long timeout;
+ PyObject *value, *num1, *num2;
+
+ if (!PyArg_UnpackTuple(args, "poll", 0, 1, &tout)) {
+ return NULL;
+ }
+
+ /* Check values for timeout */
+ if (tout == NULL || tout == Py_None)
+ timeout = -1;
+ else if (!PyNumber_Check(tout)) {
+ PyErr_SetString(PyExc_TypeError,
+ "timeout must be an integer or None");
+ return NULL;
+ }
+ else {
+ tout = PyNumber_Long(tout);
+ if (!tout)
+ return NULL;
+ timeout = PyLong_AsLong(tout);
+ Py_DECREF(tout);
+ if (timeout == -1 && PyErr_Occurred())
+ return NULL;
+ }
+
+ if ((timeout < -1) || (timeout > INT_MAX)) {
+ PyErr_SetString(PyExc_OverflowError,
+ "timeout is out of range");
+ return NULL;
+ }
+
+ if (devpoll_flush(self))
+ return NULL;
+
+ dvp.dp_fds = self->fds;
+ dvp.dp_nfds = self->max_n_fds;
+ dvp.dp_timeout = timeout;
+
+ /* call devpoll() */
+ Py_BEGIN_ALLOW_THREADS
+ poll_result = ioctl(self->fd_devpoll, DP_POLL, &dvp);
+ Py_END_ALLOW_THREADS
+
+ if (poll_result < 0) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+
+ /* build the result list */
+
+ result_list = PyList_New(poll_result);
+ if (!result_list)
+ return NULL;
+ else {
+ for (i = 0; i < poll_result; i++) {
+ num1 = PyLong_FromLong(self->fds[i].fd);
+ num2 = PyLong_FromLong(self->fds[i].revents);
+ if ((num1 == NULL) || (num2 == NULL)) {
+ Py_XDECREF(num1);
+ Py_XDECREF(num2);
+ goto error;
+ }
+ value = PyTuple_Pack(2, num1, num2);
+ Py_DECREF(num1);
+ Py_DECREF(num2);
+ if (value == NULL)
+ goto error;
+ if ((PyList_SetItem(result_list, i, value)) == -1) {
+ Py_DECREF(value);
+ goto error;
+ }
+ }
+ }
+
+ return result_list;
+
+ error:
+ Py_DECREF(result_list);
+ return NULL;
+}
+
+static PyMethodDef devpoll_methods[] = {
+ {"register", (PyCFunction)devpoll_register,
+ METH_VARARGS, devpoll_register_doc},
+ {"modify", (PyCFunction)devpoll_modify,
+ METH_VARARGS, devpoll_modify_doc},
+ {"unregister", (PyCFunction)devpoll_unregister,
+ METH_O, devpoll_unregister_doc},
+ {"poll", (PyCFunction)devpoll_poll,
+ METH_VARARGS, devpoll_poll_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+static devpollObject *
+newDevPollObject(void)
+{
+ devpollObject *self;
+ int fd_devpoll, limit_result;
+ struct pollfd *fds;
+ struct rlimit limit;
+
+ Py_BEGIN_ALLOW_THREADS
+ /*
+ ** If we try to process more that getrlimit()
+ ** fds, the kernel will give an error, so
+ ** we set the limit here. It is a dynamic
+ ** value, because we can change rlimit() anytime.
+ */
+ limit_result = getrlimit(RLIMIT_NOFILE, &limit);
+ if (limit_result != -1)
+ fd_devpoll = open("/dev/poll", O_RDWR);
+ Py_END_ALLOW_THREADS
+
+ if (limit_result == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+ if (fd_devpoll == -1) {
+ PyErr_SetFromErrnoWithFilename(PyExc_IOError, "/dev/poll");
+ return NULL;
+ }
+
+ fds = PyMem_NEW(struct pollfd, limit.rlim_cur);
+ if (fds == NULL) {
+ close(fd_devpoll);
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ self = PyObject_New(devpollObject, &devpoll_Type);
+ if (self == NULL) {
+ close(fd_devpoll);
+ PyMem_DEL(fds);
+ return NULL;
+ }
+ self->fd_devpoll = fd_devpoll;
+ self->max_n_fds = limit.rlim_cur;
+ self->n_fds = 0;
+ self->fds = fds;
+
+ return self;
+}
+
+static void
+devpoll_dealloc(devpollObject *self)
+{
+ Py_BEGIN_ALLOW_THREADS
+ close(self->fd_devpoll);
+ Py_END_ALLOW_THREADS
+
+ PyMem_DEL(self->fds);
+
+ PyObject_Del(self);
+}
+
+static PyTypeObject devpoll_Type = {
+ /* The ob_type field must be initialized in the module init function
+ * to be portable to Windows without using C++. */
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "select.devpoll", /*tp_name*/
+ sizeof(devpollObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ /* methods */
+ (destructor)devpoll_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_reserved*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ devpoll_methods, /*tp_methods*/
+};
+#endif /* HAVE_SYS_DEVPOLL_H */
+
+
+
PyDoc_STRVAR(poll_doc,
"Returns a polling object, which supports registering and\n\
unregistering file descriptors, and then polling them for I/O events.");
@@ -654,6 +1004,19 @@ select_poll(PyObject *self, PyObject *unused)
return (PyObject *)newPollObject();
}
+#ifdef HAVE_SYS_DEVPOLL_H
+PyDoc_STRVAR(devpoll_doc,
+"Returns a polling object, which supports registering and\n\
+unregistering file descriptors, and then polling them for I/O events.");
+
+static PyObject *
+select_devpoll(PyObject *self, PyObject *unused)
+{
+ return (PyObject *)newDevPollObject();
+}
+#endif
+
+
#ifdef __APPLE__
/*
* On some systems poll() sets errno on invalid file descriptors. We test
@@ -729,20 +1092,10 @@ pyepoll_internal_close(pyEpoll_Object *self)
}
static PyObject *
-newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
+newPyEpoll_Object(PyTypeObject *type, int sizehint, int flags, SOCKET fd)
{
pyEpoll_Object *self;
- if (sizehint == -1) {
- sizehint = FD_SETSIZE-1;
- }
- else if (sizehint < 1) {
- PyErr_Format(PyExc_ValueError,
- "sizehint must be greater zero, got %d",
- sizehint);
- return NULL;
- }
-
assert(type != NULL && type->tp_alloc != NULL);
self = (pyEpoll_Object *) type->tp_alloc(type, 0);
if (self == NULL)
@@ -750,6 +1103,11 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
if (fd == -1) {
Py_BEGIN_ALLOW_THREADS
+#ifdef HAVE_EPOLL_CREATE1
+ if (flags)
+ self->epfd = epoll_create1(flags);
+ else
+#endif
self->epfd = epoll_create(sizehint);
Py_END_ALLOW_THREADS
}
@@ -758,7 +1116,7 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
}
if (self->epfd < 0) {
Py_DECREF(self);
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
return (PyObject *)self;
@@ -768,14 +1126,18 @@ newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd)
static PyObject *
pyepoll_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- int sizehint = -1;
- static char *kwlist[] = {"sizehint", NULL};
+ int flags = 0, sizehint = FD_SETSIZE - 1;
+ static char *kwlist[] = {"sizehint", "flags", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:epoll", kwlist,
- &sizehint))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:epoll", kwlist,
+ &sizehint, &flags))
+ return NULL;
+ if (sizehint < 0) {
+ PyErr_SetString(PyExc_ValueError, "negative sizehint");
return NULL;
+ }
- return newPyEpoll_Object(type, sizehint, -1);
+ return newPyEpoll_Object(type, sizehint, flags, -1);
}
@@ -791,7 +1153,7 @@ pyepoll_close(pyEpoll_Object *self)
{
errno = pyepoll_internal_close(self);
if (errno < 0) {
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
Py_RETURN_NONE;
@@ -833,7 +1195,7 @@ pyepoll_fromfd(PyObject *cls, PyObject *args)
if (!PyArg_ParseTuple(args, "i:fromfd", &fd))
return NULL;
- return newPyEpoll_Object((PyTypeObject*)cls, -1, fd);
+ return newPyEpoll_Object((PyTypeObject*)cls, FD_SETSIZE - 1, 0, fd);
}
PyDoc_STRVAR(pyepoll_fromfd_doc,
@@ -884,7 +1246,7 @@ pyepoll_internal_ctl(int epfd, int op, PyObject *pfd, unsigned int events)
}
if (result < 0) {
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
Py_RETURN_NONE;
@@ -908,7 +1270,7 @@ pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
PyDoc_STRVAR(pyepoll_register_doc,
"register(fd[, eventmask]) -> None\n\
\n\
-Registers a new fd or raises an IOError if the fd is already registered.\n\
+Registers a new fd or raises an OSError if the fd is already registered.\n\
fd is the target file descriptor of the operation.\n\
events is a bit set composed of the various EPOLL constants; the default\n\
is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
@@ -1007,7 +1369,7 @@ pyepoll_poll(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
nfds = epoll_wait(self->epfd, evs, maxevents, timeout);
Py_END_ALLOW_THREADS
if (nfds < 0) {
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
goto error;
}
@@ -1062,7 +1424,7 @@ static PyGetSetDef pyepoll_getsetlist[] = {
};
PyDoc_STRVAR(pyepoll_doc,
-"select.epoll([sizehint=-1])\n\
+"select.epoll(sizehint=-1, flags=0)\n\
\n\
Returns an epolling object\n\
\n\
@@ -1398,7 +1760,7 @@ newKqueue_Object(PyTypeObject *type, SOCKET fd)
}
if (self->kqfd < 0) {
Py_DECREF(self);
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
return (PyObject *)self;
@@ -1430,7 +1792,7 @@ kqueue_queue_close(kqueue_queue_Object *self)
{
errno = kqueue_queue_internal_close(self);
if (errno < 0) {
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
Py_RETURN_NONE;
@@ -1493,7 +1855,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
PyObject *result = NULL;
struct kevent *evl = NULL;
struct kevent *chl = NULL;
- struct timespec timeoutspec;
+ struct timespec timeout;
struct timespec *ptimeoutspec;
if (self->kqfd < 0)
@@ -1513,28 +1875,16 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
ptimeoutspec = NULL;
}
else if (PyNumber_Check(otimeout)) {
- double timeout;
- long seconds;
-
- timeout = PyFloat_AsDouble(otimeout);
- if (timeout == -1 && PyErr_Occurred())
- return NULL;
- if (timeout > (double)LONG_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "timeout period too long");
+ if (_PyTime_ObjectToTimespec(otimeout,
+ &timeout.tv_sec, &timeout.tv_nsec) == -1)
return NULL;
- }
- if (timeout < 0) {
+
+ if (timeout.tv_sec < 0) {
PyErr_SetString(PyExc_ValueError,
"timeout must be positive or None");
return NULL;
}
-
- seconds = (long)timeout;
- timeout = timeout - (double)seconds;
- timeoutspec.tv_sec = seconds;
- timeoutspec.tv_nsec = (long)(timeout * 1E9);
- ptimeoutspec = &timeoutspec;
+ ptimeoutspec = &timeout;
}
else {
PyErr_Format(PyExc_TypeError,
@@ -1711,6 +2061,11 @@ static PyTypeObject kqueue_queue_Type = {
};
#endif /* HAVE_KQUEUE */
+
+
+
+
+
/* ************************************************************************ */
PyDoc_STRVAR(select_doc,
@@ -1742,6 +2097,9 @@ static PyMethodDef select_methods[] = {
#ifdef HAVE_POLL
{"poll", select_poll, METH_NOARGS, poll_doc},
#endif /* HAVE_POLL */
+#ifdef HAVE_SYS_DEVPOLL_H
+ {"devpoll", select_devpoll, METH_NOARGS, devpoll_doc},
+#endif
{0, 0}, /* sentinel */
};
@@ -1764,6 +2122,9 @@ static struct PyModuleDef selectmodule = {
NULL
};
+
+
+
PyMODINIT_FUNC
PyInit_select(void)
{
@@ -1772,9 +2133,8 @@ PyInit_select(void)
if (m == NULL)
return NULL;
- SelectError = PyErr_NewException("select.error", NULL, NULL);
- Py_INCREF(SelectError);
- PyModule_AddObject(m, "error", SelectError);
+ Py_INCREF(PyExc_OSError);
+ PyModule_AddObject(m, "error", PyExc_OSError);
#ifdef PIPE_BUF
#ifdef HAVE_BROKEN_PIPE_BUF
@@ -1821,6 +2181,11 @@ PyInit_select(void)
}
#endif /* HAVE_POLL */
+#ifdef HAVE_SYS_DEVPOLL_H
+ if (PyType_Ready(&devpoll_Type) < 0)
+ return NULL;
+#endif
+
#ifdef HAVE_EPOLL
Py_TYPE(&pyEpoll_Type) = &PyType_Type;
if (PyType_Ready(&pyEpoll_Type) < 0)
@@ -1845,6 +2210,10 @@ PyInit_select(void)
PyModule_AddIntConstant(m, "EPOLLWRNORM", EPOLLWRNORM);
PyModule_AddIntConstant(m, "EPOLLWRBAND", EPOLLWRBAND);
PyModule_AddIntConstant(m, "EPOLLMSG", EPOLLMSG);
+
+#ifdef EPOLL_CLOEXEC
+ PyModule_AddIntConstant(m, "EPOLL_CLOEXEC", EPOLL_CLOEXEC);
+#endif
#endif /* HAVE_EPOLL */
#ifdef HAVE_KQUEUE
diff --git a/Modules/sha1module.c b/Modules/sha1module.c
index b25bd44..a733c4b 100644
--- a/Modules/sha1module.c
+++ b/Modules/sha1module.c
@@ -184,7 +184,8 @@ static void sha1_compress(struct sha1_state *sha1, unsigned char *buf)
Initialize the hash state
@param sha1 The hash state you wish to initialize
*/
-void sha1_init(struct sha1_state *sha1)
+static void
+sha1_init(struct sha1_state *sha1)
{
assert(sha1 != NULL);
sha1->state[0] = 0x67452301UL;
@@ -202,7 +203,8 @@ void sha1_init(struct sha1_state *sha1)
@param in The data to hash
@param inlen The length of the data (octets)
*/
-void sha1_process(struct sha1_state *sha1,
+static void
+sha1_process(struct sha1_state *sha1,
const unsigned char *in, Py_ssize_t inlen)
{
Py_ssize_t n;
@@ -218,7 +220,7 @@ void sha1_process(struct sha1_state *sha1,
in += SHA1_BLOCKSIZE;
inlen -= SHA1_BLOCKSIZE;
} else {
- n = MIN(inlen, (SHA1_BLOCKSIZE - sha1->curlen));
+ n = MIN(inlen, (Py_ssize_t)(SHA1_BLOCKSIZE - sha1->curlen));
memcpy(sha1->buf + sha1->curlen, in, (size_t)n);
sha1->curlen += n;
in += n;
@@ -237,7 +239,8 @@ void sha1_process(struct sha1_state *sha1,
@param sha1 The hash state
@param out [out] The destination of the hash (20 bytes)
*/
-void sha1_done(struct sha1_state *sha1, unsigned char *out)
+static void
+sha1_done(struct sha1_state *sha1, unsigned char *out)
{
int i;
@@ -352,7 +355,7 @@ SHA1_hexdigest(SHA1object *self, PyObject *unused)
unsigned char digest[SHA1_DIGESTSIZE];
struct sha1_state temp;
PyObject *retval;
- Py_UNICODE *hex_digest;
+ Py_UCS1 *hex_digest;
int i, j;
/* Get the raw (binary) digest value */
@@ -360,25 +363,20 @@ SHA1_hexdigest(SHA1object *self, PyObject *unused)
sha1_done(&temp, digest);
/* Create a new string */
- retval = PyUnicode_FromStringAndSize(NULL, SHA1_DIGESTSIZE * 2);
+ retval = PyUnicode_New(SHA1_DIGESTSIZE * 2, 127);
if (!retval)
return NULL;
- hex_digest = PyUnicode_AS_UNICODE(retval);
- if (!hex_digest) {
- Py_DECREF(retval);
- return NULL;
- }
+ hex_digest = PyUnicode_1BYTE_DATA(retval);
/* Make hex version of the digest */
for(i=j=0; i<SHA1_DIGESTSIZE; i++) {
- char c;
+ unsigned char c;
c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
}
+ assert(_PyUnicode_CheckConsistency(retval, 1));
return retval;
}
diff --git a/Modules/sha256module.c b/Modules/sha256module.c
index 8617210..76d91af 100644
--- a/Modules/sha256module.c
+++ b/Modules/sha256module.c
@@ -445,7 +445,7 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused)
unsigned char digest[SHA_DIGESTSIZE];
SHAobject temp;
PyObject *retval;
- Py_UNICODE *hex_digest;
+ Py_UCS1 *hex_digest;
int i, j;
/* Get the raw (binary) digest value */
@@ -453,25 +453,20 @@ SHA256_hexdigest(SHAobject *self, PyObject *unused)
sha_final(digest, &temp);
/* Create a new string */
- retval = PyUnicode_FromStringAndSize(NULL, self->digestsize * 2);
+ retval = PyUnicode_New(self->digestsize * 2, 127);
if (!retval)
return NULL;
- hex_digest = PyUnicode_AS_UNICODE(retval);
- if (!hex_digest) {
- Py_DECREF(retval);
- return NULL;
- }
+ hex_digest = PyUnicode_1BYTE_DATA(retval);
/* Make hex version of the digest */
for(i=j=0; i<self->digestsize; i++) {
- char c;
+ unsigned char c;
c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
}
+ assert(_PyUnicode_CheckConsistency(retval, 1));
return retval;
}
diff --git a/Modules/sha512module.c b/Modules/sha512module.c
index 0faaf5c..88f8a64 100644
--- a/Modules/sha512module.c
+++ b/Modules/sha512module.c
@@ -511,7 +511,7 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused)
unsigned char digest[SHA_DIGESTSIZE];
SHAobject temp;
PyObject *retval;
- Py_UNICODE *hex_digest;
+ Py_UCS1 *hex_digest;
int i, j;
/* Get the raw (binary) digest value */
@@ -519,25 +519,20 @@ SHA512_hexdigest(SHAobject *self, PyObject *unused)
sha512_final(digest, &temp);
/* Create a new string */
- retval = PyUnicode_FromStringAndSize(NULL, self->digestsize * 2);
+ retval = PyUnicode_New(self->digestsize * 2, 127);
if (!retval)
return NULL;
- hex_digest = PyUnicode_AS_UNICODE(retval);
- if (!hex_digest) {
- Py_DECREF(retval);
- return NULL;
- }
+ hex_digest = PyUnicode_1BYTE_DATA(retval);
/* Make hex version of the digest */
for (i=j=0; i<self->digestsize; i++) {
- char c;
+ unsigned char c;
c = (digest[i] >> 4) & 0xf;
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
c = (digest[i] & 0xf);
- c = (c>9) ? c+'a'-10 : c + '0';
- hex_digest[j++] = c;
+ hex_digest[j++] = Py_hexdigits[c];
}
+ assert(_PyUnicode_CheckConsistency(retval, 1));
return retval;
}
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 32cd8bb..2eb7f29 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -22,6 +22,14 @@
#include <sys/time.h>
#endif
+#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
+# define PYPTHREAD_SIGMASK
+#endif
+
+#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
+# include <pthread.h>
+#endif
+
#ifndef SIG_ERR
#define SIG_ERR ((PyOS_sighandler_t)(-1))
#endif
@@ -101,6 +109,10 @@ static PyObject *IntHandler;
static PyOS_sighandler_t old_siginthandler = SIG_DFL;
+#ifdef MS_WINDOWS
+static HANDLE sigint_event = NULL;
+#endif
+
#ifdef HAVE_GETITIMER
static PyObject *ItimerError;
@@ -168,15 +180,19 @@ checksignals_witharg(void * unused)
static void
trip_signal(int sig_num)
{
+ unsigned char byte;
+
Handlers[sig_num].tripped = 1;
+ if (wakeup_fd != -1) {
+ byte = (unsigned char)sig_num;
+ write(wakeup_fd, &byte, 1);
+ }
if (is_tripped)
return;
/* Set is_tripped after setting .tripped, as it gets
cleared in PyErr_CheckSignals() before .tripped. */
is_tripped = 1;
Py_AddPendingCall(checksignals_witharg, NULL);
- if (wakeup_fd != -1)
- write(wakeup_fd, "\0", 1);
}
static void
@@ -217,6 +233,11 @@ signal_handler(int sig_num)
/* Issue #10311: asynchronously executing signal handlers should not
mutate errno under the feet of unsuspecting C code. */
errno = save_errno;
+
+#ifdef MS_WINDOWS
+ if (sig_num == SIGINT)
+ SetEvent(sigint_event);
+#endif
}
@@ -313,7 +334,7 @@ signal_signal(PyObject *self, PyObject *args)
else
func = signal_handler;
if (PyOS_setsig(sig_num, func) == SIG_ERR) {
- PyErr_SetFromErrno(PyExc_RuntimeError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
old_handler = Handlers[sig_num].func;
@@ -382,7 +403,7 @@ signal_siginterrupt(PyObject *self, PyObject *args)
return NULL;
}
if (siginterrupt(sig_num, flag)<0) {
- PyErr_SetFromErrno(PyExc_RuntimeError);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -495,6 +516,341 @@ PyDoc_STRVAR(getitimer_doc,
Returns current value of given itimer.");
#endif
+#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
+ defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
+/* Convert an iterable to a sigset.
+ Return 0 on success, return -1 and raise an exception on error. */
+
+static int
+iterable_to_sigset(PyObject *iterable, sigset_t *mask)
+{
+ int result = -1;
+ PyObject *iterator, *item;
+ long signum;
+ int err;
+
+ sigemptyset(mask);
+
+ iterator = PyObject_GetIter(iterable);
+ if (iterator == NULL)
+ goto error;
+
+ while (1)
+ {
+ item = PyIter_Next(iterator);
+ if (item == NULL) {
+ if (PyErr_Occurred())
+ goto error;
+ else
+ break;
+ }
+
+ signum = PyLong_AsLong(item);
+ Py_DECREF(item);
+ if (signum == -1 && PyErr_Occurred())
+ goto error;
+ if (0 < signum && signum < NSIG)
+ err = sigaddset(mask, (int)signum);
+ else
+ err = 1;
+ if (err) {
+ PyErr_Format(PyExc_ValueError,
+ "signal number %ld out of range", signum);
+ goto error;
+ }
+ }
+ result = 0;
+
+error:
+ Py_XDECREF(iterator);
+ return result;
+}
+#endif
+
+#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
+static PyObject*
+sigset_to_set(sigset_t mask)
+{
+ PyObject *signum, *result;
+ int sig;
+
+ result = PySet_New(0);
+ if (result == NULL)
+ return NULL;
+
+ for (sig = 1; sig < NSIG; sig++) {
+ if (sigismember(&mask, sig) != 1)
+ continue;
+
+ /* Handle the case where it is a member by adding the signal to
+ the result list. Ignore the other cases because they mean the
+ signal isn't a member of the mask or the signal was invalid,
+ and an invalid signal must have been our fault in constructing
+ the loop boundaries. */
+ signum = PyLong_FromLong(sig);
+ if (signum == NULL) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ if (PySet_Add(result, signum) == -1) {
+ Py_DECREF(signum);
+ Py_DECREF(result);
+ return NULL;
+ }
+ Py_DECREF(signum);
+ }
+ return result;
+}
+#endif
+
+#ifdef PYPTHREAD_SIGMASK
+static PyObject *
+signal_pthread_sigmask(PyObject *self, PyObject *args)
+{
+ int how;
+ PyObject *signals;
+ sigset_t mask, previous;
+ int err;
+
+ if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
+ return NULL;
+
+ if (iterable_to_sigset(signals, &mask))
+ return NULL;
+
+ err = pthread_sigmask(how, &mask, &previous);
+ if (err != 0) {
+ errno = err;
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ /* if signals was unblocked, signal handlers have been called */
+ if (PyErr_CheckSignals())
+ return NULL;
+
+ return sigset_to_set(previous);
+}
+
+PyDoc_STRVAR(signal_pthread_sigmask_doc,
+"pthread_sigmask(how, mask) -> old mask\n\
+\n\
+Fetch and/or change the signal mask of the calling thread.");
+#endif /* #ifdef PYPTHREAD_SIGMASK */
+
+
+#ifdef HAVE_SIGPENDING
+static PyObject *
+signal_sigpending(PyObject *self)
+{
+ int err;
+ sigset_t mask;
+ err = sigpending(&mask);
+ if (err)
+ return PyErr_SetFromErrno(PyExc_OSError);
+ return sigset_to_set(mask);
+}
+
+PyDoc_STRVAR(signal_sigpending_doc,
+"sigpending() -> list\n\
+\n\
+Examine pending signals.");
+#endif /* #ifdef HAVE_SIGPENDING */
+
+
+#ifdef HAVE_SIGWAIT
+static PyObject *
+signal_sigwait(PyObject *self, PyObject *args)
+{
+ PyObject *signals;
+ sigset_t set;
+ int err, signum;
+
+ if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
+ return NULL;
+
+ if (iterable_to_sigset(signals, &set))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ err = sigwait(&set, &signum);
+ Py_END_ALLOW_THREADS
+ if (err) {
+ errno = err;
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
+
+ return PyLong_FromLong(signum);
+}
+
+PyDoc_STRVAR(signal_sigwait_doc,
+"sigwait(sigset) -> signum\n\
+\n\
+Wait a signal.");
+#endif /* #ifdef HAVE_SIGPENDING */
+
+#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
+static int initialized;
+static PyStructSequence_Field struct_siginfo_fields[] = {
+ {"si_signo", "signal number"},
+ {"si_code", "signal code"},
+ {"si_errno", "errno associated with this signal"},
+ {"si_pid", "sending process ID"},
+ {"si_uid", "real user ID of sending process"},
+ {"si_status", "exit value or signal"},
+ {"si_band", "band event for SIGPOLL"},
+ {0}
+};
+
+PyDoc_STRVAR(struct_siginfo__doc__,
+"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
+This object may be accessed either as a tuple of\n\
+(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
+or via the attributes si_signo, si_code, and so on.");
+
+static PyStructSequence_Desc struct_siginfo_desc = {
+ "signal.struct_siginfo", /* name */
+ struct_siginfo__doc__, /* doc */
+ struct_siginfo_fields, /* fields */
+ 7 /* n_in_sequence */
+};
+
+static PyTypeObject SiginfoType;
+
+static PyObject *
+fill_siginfo(siginfo_t *si)
+{
+ PyObject *result = PyStructSequence_New(&SiginfoType);
+ if (!result)
+ return NULL;
+
+ PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
+ PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
+ PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
+ PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
+ PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong((long)(si->si_uid)));
+ PyStructSequence_SET_ITEM(result, 5,
+ PyLong_FromLong((long)(si->si_status)));
+ PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
+ if (PyErr_Occurred()) {
+ Py_DECREF(result);
+ return NULL;
+ }
+
+ return result;
+}
+#endif
+
+#ifdef HAVE_SIGWAITINFO
+static PyObject *
+signal_sigwaitinfo(PyObject *self, PyObject *args)
+{
+ PyObject *signals;
+ sigset_t set;
+ siginfo_t si;
+ int err;
+
+ if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
+ return NULL;
+
+ if (iterable_to_sigset(signals, &set))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ err = sigwaitinfo(&set, &si);
+ Py_END_ALLOW_THREADS
+ if (err == -1)
+ return PyErr_SetFromErrno(PyExc_OSError);
+
+ return fill_siginfo(&si);
+}
+
+PyDoc_STRVAR(signal_sigwaitinfo_doc,
+"sigwaitinfo(sigset) -> struct_siginfo\n\
+\n\
+Wait synchronously for a signal until one of the signals in *sigset* is\n\
+delivered.\n\
+Returns a struct_siginfo containing information about the signal.");
+#endif /* #ifdef HAVE_SIGWAITINFO */
+
+#ifdef HAVE_SIGTIMEDWAIT
+static PyObject *
+signal_sigtimedwait(PyObject *self, PyObject *args)
+{
+ PyObject *signals, *timeout;
+ struct timespec buf;
+ sigset_t set;
+ siginfo_t si;
+ int err;
+
+ if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
+ &signals, &timeout))
+ return NULL;
+
+ if (_PyTime_ObjectToTimespec(timeout, &buf.tv_sec, &buf.tv_nsec) == -1)
+ return NULL;
+
+ if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
+ PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
+ return NULL;
+ }
+
+ if (iterable_to_sigset(signals, &set))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ err = sigtimedwait(&set, &si, &buf);
+ Py_END_ALLOW_THREADS
+ if (err == -1) {
+ if (errno == EAGAIN)
+ Py_RETURN_NONE;
+ else
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
+
+ return fill_siginfo(&si);
+}
+
+PyDoc_STRVAR(signal_sigtimedwait_doc,
+"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
+\n\
+Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
+nanoseconds).");
+#endif /* #ifdef HAVE_SIGTIMEDWAIT */
+
+
+#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
+static PyObject *
+signal_pthread_kill(PyObject *self, PyObject *args)
+{
+ long tid;
+ int signum;
+ int err;
+
+ if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
+ return NULL;
+
+ err = pthread_kill((pthread_t)tid, signum);
+ if (err != 0) {
+ errno = err;
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ /* the signal may have been send to the current thread */
+ if (PyErr_CheckSignals())
+ return NULL;
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(signal_pthread_kill_doc,
+"pthread_kill(thread_id, signum)\n\
+\n\
+Send a signal to a thread.");
+#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
+
+
/* List of functions defined in the module */
static PyMethodDef signal_methods[] = {
@@ -515,10 +871,34 @@ static PyMethodDef signal_methods[] = {
#endif
#ifdef HAVE_PAUSE
{"pause", (PyCFunction)signal_pause,
- METH_NOARGS,pause_doc},
+ METH_NOARGS, pause_doc},
#endif
{"default_int_handler", signal_default_int_handler,
METH_VARARGS, default_int_handler_doc},
+#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
+ {"pthread_kill", (PyCFunction)signal_pthread_kill,
+ METH_VARARGS, signal_pthread_kill_doc},
+#endif
+#ifdef PYPTHREAD_SIGMASK
+ {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
+ METH_VARARGS, signal_pthread_sigmask_doc},
+#endif
+#ifdef HAVE_SIGPENDING
+ {"sigpending", (PyCFunction)signal_sigpending,
+ METH_NOARGS, signal_sigpending_doc},
+#endif
+#ifdef HAVE_SIGWAIT
+ {"sigwait", (PyCFunction)signal_sigwait,
+ METH_VARARGS, signal_sigwait_doc},
+#endif
+#ifdef HAVE_SIGWAITINFO
+ {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
+ METH_VARARGS, signal_sigwaitinfo_doc},
+#endif
+#ifdef HAVE_SIGTIMEDWAIT
+ {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
+ METH_VARARGS, signal_sigtimedwait_doc},
+#endif
{NULL, NULL} /* sentinel */
};
@@ -587,6 +967,15 @@ PyInit_signal(void)
if (m == NULL)
return NULL;
+#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
+ if (!initialized)
+ PyStructSequence_InitType(&SiginfoType, &struct_siginfo_desc);
+
+ Py_INCREF((PyObject*) &SiginfoType);
+ PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
+ initialized = 1;
+#endif
+
/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
@@ -603,6 +992,19 @@ PyInit_signal(void)
goto finally;
Py_DECREF(x);
+#ifdef SIG_BLOCK
+ if (PyModule_AddIntMacro(m, SIG_BLOCK))
+ goto finally;
+#endif
+#ifdef SIG_UNBLOCK
+ if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
+ goto finally;
+#endif
+#ifdef SIG_SETMASK
+ if (PyModule_AddIntMacro(m, SIG_SETMASK))
+ goto finally;
+#endif
+
x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
if (!x)
goto finally;
@@ -855,6 +1257,11 @@ PyInit_signal(void)
Py_DECREF(x);
#endif
+#ifdef MS_WINDOWS
+ /* Create manual-reset event, initially unset */
+ sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
+#endif
+
if (PyErr_Occurred()) {
Py_DECREF(m);
m = NULL;
@@ -1001,3 +1408,25 @@ PyOS_AfterFork(void)
_PyImport_ReInitLock();
#endif
}
+
+int
+_PyOS_IsMainThread(void)
+{
+#ifdef WITH_THREAD
+ return PyThread_get_thread_ident() == main_thread;
+#else
+ return 1;
+#endif
+}
+
+#ifdef MS_WINDOWS
+void *_PyOS_SigintEvent(void)
+{
+ /* Returns a manual-reset event which gets tripped whenever
+ SIGINT is received.
+
+ Python.h does not include windows.h so we do cannot use HANDLE
+ as the return type of this function. We use void* instead. */
+ return sigint_event;
+}
+#endif
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 4f896fd..d8c81fe 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -42,6 +42,9 @@ Module interface:
- socket.inet_ntoa(packed IP) -> IP address string
- socket.getdefaulttimeout() -> None | float
- socket.setdefaulttimeout(None | float)
+- socket.if_nameindex() -> list of tuples (if_index, if_name)
+- socket.if_nametoindex(name) -> corresponding interface index
+- socket.if_indextoname(index) -> corresponding interface name
- an Internet socket address is a pair (hostname, port)
where hostname can be anything recognized by gethostbyname()
(including the dd.dd.dd.dd notation) and port is in host byte order
@@ -133,6 +136,9 @@ setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
setsockopt(level, optname, value) -- set socket options\n\
settimeout(None | float) -- set or clear the timeout\n\
shutdown(how) -- shut down traffic in one or both directions\n\
+if_nameindex() -- return all network interface indices and names\n\
+if_nametoindex(name) -- return the corresponding interface index\n\
+if_indextoname(index) -- return the corresponding interface name\n\
\n\
[*] not available on all platforms!");
@@ -150,12 +156,16 @@ shutdown(how) -- shut down traffic in one or both directions\n\
# undef HAVE_GETHOSTBYNAME_R_6_ARG
#endif
+#if defined(__OpenBSD__)
+# include <sys/uio.h>
+#endif
+
#ifndef WITH_THREAD
# undef HAVE_GETHOSTBYNAME_R
#endif
#ifdef HAVE_GETHOSTBYNAME_R
-# if defined(_AIX) || defined(__osf__)
+# if defined(_AIX)
# define HAVE_GETHOSTBYNAME_R_3_ARG
# elif defined(__sun) || defined(__sgi)
# define HAVE_GETHOSTBYNAME_R_5_ARG
@@ -208,6 +218,11 @@ shutdown(how) -- shut down traffic in one or both directions\n\
# include <ioctl.h>
#endif
+#ifdef __APPLE__
+# include <sys/ioctl.h>
+#endif
+
+
#if defined(PYOS_OS2)
# define INCL_DOS
# define INCL_DOSERRORS
@@ -250,6 +265,14 @@ shutdown(how) -- shut down traffic in one or both directions\n\
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+
/* Generic socket object definitions and includes */
#define PySocket_BUILDING_SOCKET
#include "socketmodule.h"
@@ -260,6 +283,7 @@ shutdown(how) -- shut down traffic in one or both directions\n\
/* Non-MS WINDOWS includes */
# include <netdb.h>
+# include <unistd.h>
/* Headers needed for inet_ntoa() and inet_addr() */
# if defined(PYOS_OS2) && defined(PYCC_VACPP)
@@ -357,7 +381,7 @@ dup_socket(SOCKET handle)
return INVALID_SOCKET;
return WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
- FROM_PROTOCOL_INFO, &info, 0, 0);
+ FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
}
#define SOCKETCLOSE closesocket
#else
@@ -366,6 +390,7 @@ dup_socket(SOCKET handle)
#endif
#ifdef MS_WIN32
+#undef EAFNOSUPPORT
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#define snprintf _snprintf
#endif
@@ -417,7 +442,8 @@ dup_socket(SOCKET handle)
#define SEGMENT_SIZE (32 * 1024 -1)
#endif
-#define SAS2SA(x) ((struct sockaddr *)(x))
+/* Convert "sock_addr_t *" to "struct sockaddr *". */
+#define SAS2SA(x) (&((x)->sa))
/*
* Constants for getnameinfo()
@@ -438,7 +464,6 @@ dup_socket(SOCKET handle)
/* Global variable holding the exception type for errors detected
by this module (but not argument type or memory errors, etc.). */
-static PyObject *socket_error;
static PyObject *socket_herror;
static PyObject *socket_gaierror;
static PyObject *socket_timeout;
@@ -455,6 +480,17 @@ static PyTypeObject sock_type;
#include <sys/poll.h>
#endif
+/* Largest value to try to store in a socklen_t (used when handling
+ ancillary data). POSIX requires socklen_t to hold at least
+ (2**31)-1 and recommends against storing larger values, but
+ socklen_t was originally int in the BSD interface, so to be on the
+ safe side we use the smaller of (2**31)-1 and INT_MAX. */
+#if INT_MAX > 0x7fffffff
+#define SOCKLEN_T_LIMIT 0x7fffffff
+#else
+#define SOCKLEN_T_LIMIT INT_MAX
+#endif
+
#ifdef HAVE_POLL
/* Instead of select(), we'll use poll() since poll() works on any fd. */
#define IS_SELECTABLE(s) 1
@@ -468,7 +504,7 @@ static PyTypeObject sock_type;
static PyObject*
select_error(void)
{
- PyErr_SetString(socket_error, "unable to select on socket");
+ PyErr_SetString(PyExc_OSError, "unable to select on socket");
return NULL;
}
@@ -495,7 +531,7 @@ set_error(void)
recognizes the error codes used by both GetLastError() and
WSAGetLastError */
if (err_no)
- return PyErr_SetExcFromWindowsErr(socket_error, err_no);
+ return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
#endif
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
@@ -526,7 +562,7 @@ set_error(void)
}
v = Py_BuildValue("(is)", myerrorcode, outbuf);
if (v != NULL) {
- PyErr_SetObject(socket_error, v);
+ PyErr_SetObject(PyExc_OSError, v);
Py_DECREF(v);
}
return NULL;
@@ -534,7 +570,7 @@ set_error(void)
}
#endif
- return PyErr_SetFromErrno(socket_error);
+ return PyErr_SetFromErrno(PyExc_OSError);
}
@@ -853,13 +889,13 @@ setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
#endif
default:
freeaddrinfo(res);
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"unsupported address family");
return -1;
}
if (res->ai_next) {
freeaddrinfo(res);
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"wildcard resolved to multiple address");
return -1;
}
@@ -872,7 +908,7 @@ setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
struct sockaddr_in *sin;
if (af != AF_INET && af != AF_UNSPEC) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"address family mismatched");
return -1;
}
@@ -930,7 +966,7 @@ setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
return 16;
#endif
default:
- PyErr_SetString(socket_error, "unknown address family");
+ PyErr_SetString(PyExc_OSError, "unknown address family");
return -1;
}
}
@@ -979,7 +1015,7 @@ setbdaddr(char *name, bdaddr_t *bdaddr)
bdaddr->b[5] = b5;
return 6;
} else {
- PyErr_SetString(socket_error, "bad bluetooth address");
+ PyErr_SetString(PyExc_OSError, "bad bluetooth address");
return -1;
}
}
@@ -1044,7 +1080,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
#endif /* linux */
{
/* regular NULL-terminated string */
- return PyUnicode_FromString(a->sun_path);
+ return PyUnicode_DecodeFSDefault(a->sun_path);
}
}
#endif /* AF_UNIX */
@@ -1190,6 +1226,42 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
}
#endif
+#ifdef AF_CAN
+ case AF_CAN:
+ {
+ struct sockaddr_can *a = (struct sockaddr_can *)addr;
+ char *ifname = "";
+ struct ifreq ifr;
+ /* need to look up interface name given index */
+ if (a->can_ifindex) {
+ ifr.ifr_ifindex = a->can_ifindex;
+ if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
+ ifname = ifr.ifr_name;
+ }
+
+ return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
+ ifname,
+ a->can_family);
+ }
+#endif
+
+#ifdef PF_SYSTEM
+ case PF_SYSTEM:
+ switch(proto) {
+#ifdef SYSPROTO_CONTROL
+ case SYSPROTO_CONTROL:
+ {
+ struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
+ return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
+ }
+#endif
+ default:
+ PyErr_SetString(PyExc_ValueError,
+ "Invalid address type");
+ return 0;
+ }
+#endif
+
/* More cases here... */
default:
@@ -1221,17 +1293,27 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_un* addr;
char *path;
int len;
- if (!PyArg_Parse(args, "s#", &path, &len))
- return 0;
+ int retval = 0;
+
+ /* PEP 383. Not using PyUnicode_FSConverter since we need to
+ allow embedded nulls on Linux. */
+ if (PyUnicode_Check(args)) {
+ if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
+ return 0;
+ }
+ else
+ Py_INCREF(args);
+ if (!PyArg_Parse(args, "y#", &path, &len))
+ goto unix_out;
addr = (struct sockaddr_un*)addr_ret;
#ifdef linux
if (len > 0 && path[0] == 0) {
/* Linux abstract namespace extension */
if (len > sizeof addr->sun_path) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"AF_UNIX path too long");
- return 0;
+ goto unix_out;
}
}
else
@@ -1239,9 +1321,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{
/* regular NULL-terminated string */
if (len >= sizeof addr->sun_path) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"AF_UNIX path too long");
- return 0;
+ goto unix_out;
}
addr->sun_path[len] = 0;
}
@@ -1252,7 +1334,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
#else
*len_ret = len + offsetof(struct sockaddr_un, sun_path);
#endif
- return 1;
+ retval = 1;
+ unix_out:
+ Py_DECREF(args);
+ return retval;
}
#endif /* AF_UNIX */
@@ -1280,6 +1365,11 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
}
#endif
+#ifdef AF_RDS
+ case AF_RDS:
+ /* RDS sockets use sockaddr_in: fall-through */
+#endif
+
case AF_INET:
{
struct sockaddr_in* addr;
@@ -1376,7 +1466,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyArg_ParseTuple(args, "si", &straddr,
&_BT_L2_MEMB(addr, psm))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
"wrong format");
return 0;
}
@@ -1395,7 +1485,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyArg_ParseTuple(args, "si", &straddr,
&_BT_RC_MEMB(addr, channel))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
"wrong format");
return 0;
}
@@ -1413,7 +1503,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
if (straddr == NULL) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
"wrong format");
return 0;
}
@@ -1422,7 +1512,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
#else
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
"wrong format");
return 0;
}
@@ -1439,7 +1529,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
addr = (struct sockaddr_sco *)addr_ret;
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyBytes_Check(args)) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
"wrong format");
return 0;
}
@@ -1452,7 +1542,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
}
#endif
default:
- PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
return 0;
}
}
@@ -1564,10 +1654,116 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
}
#endif
+#ifdef AF_CAN
+ case AF_CAN:
+ switch (s->sock_proto) {
+ case CAN_RAW:
+ {
+ struct sockaddr_can *addr;
+ PyObject *interfaceName;
+ struct ifreq ifr;
+ addr = (struct sockaddr_can *)addr_ret;
+ Py_ssize_t len;
+
+ if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
+ &interfaceName))
+ return 0;
+
+ len = PyBytes_GET_SIZE(interfaceName);
+
+ if (len == 0) {
+ ifr.ifr_ifindex = 0;
+ } else if (len < sizeof(ifr.ifr_name)) {
+ strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
+ ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
+ if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
+ s->errorhandler();
+ Py_DECREF(interfaceName);
+ return 0;
+ }
+ } else {
+ PyErr_SetString(PyExc_OSError,
+ "AF_CAN interface name too long");
+ Py_DECREF(interfaceName);
+ return 0;
+ }
+
+ addr->can_family = AF_CAN;
+ addr->can_ifindex = ifr.ifr_ifindex;
+
+ *len_ret = sizeof(*addr);
+ Py_DECREF(interfaceName);
+ return 1;
+ }
+ default:
+ PyErr_SetString(PyExc_OSError,
+ "getsockaddrarg: unsupported CAN protocol");
+ return 0;
+ }
+#endif
+
+#ifdef PF_SYSTEM
+ case PF_SYSTEM:
+ switch (s->sock_proto) {
+#ifdef SYSPROTO_CONTROL
+ case SYSPROTO_CONTROL:
+ {
+ struct sockaddr_ctl *addr;
+
+ addr = (struct sockaddr_ctl *)addr_ret;
+ addr->sc_family = AF_SYSTEM;
+ addr->ss_sysaddr = AF_SYS_CONTROL;
+
+ if (PyUnicode_Check(args)) {
+ struct ctl_info info;
+ PyObject *ctl_name;
+
+ if (!PyArg_Parse(args, "O&",
+ PyUnicode_FSConverter, &ctl_name)) {
+ return 0;
+ }
+
+ if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
+ PyErr_SetString(PyExc_ValueError,
+ "provided string is too long");
+ Py_DECREF(ctl_name);
+ return 0;
+ }
+ strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
+ sizeof(info.ctl_name));
+ Py_DECREF(ctl_name);
+
+ if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
+ PyErr_SetString(PyExc_OSError,
+ "cannot find kernel control with provided name");
+ return 0;
+ }
+
+ addr->sc_id = info.ctl_id;
+ addr->sc_unit = 0;
+ } else if (!PyArg_ParseTuple(args, "II",
+ &(addr->sc_id), &(addr->sc_unit))) {
+ PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
+ "expected str or tuple of two ints");
+
+ return 0;
+ }
+
+ *len_ret = sizeof(*addr);
+ return 1;
+ }
+#endif
+ default:
+ PyErr_SetString(PyExc_OSError,
+ "getsockaddrarg: unsupported PF_SYSTEM protocol");
+ return 0;
+ }
+#endif
+
/* More cases here... */
default:
- PyErr_SetString(socket_error, "getsockaddrarg: bad family");
+ PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
return 0;
}
@@ -1598,6 +1794,11 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
}
#endif
+#ifdef AF_RDS
+ case AF_RDS:
+ /* RDS sockets use sockaddr_in: fall-through */
+#endif
+
case AF_INET:
{
*len_ret = sizeof (struct sockaddr_in);
@@ -1633,7 +1834,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
return 1;
#endif
default:
- PyErr_SetString(socket_error, "getsockaddrlen: "
+ PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
"unknown BT protocol");
return 0;
@@ -1657,16 +1858,151 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
}
#endif
+#ifdef AF_CAN
+ case AF_CAN:
+ {
+ *len_ret = sizeof (struct sockaddr_can);
+ return 1;
+ }
+#endif
+
+#ifdef PF_SYSTEM
+ case PF_SYSTEM:
+ switch(s->sock_proto) {
+#ifdef SYSPROTO_CONTROL
+ case SYSPROTO_CONTROL:
+ *len_ret = sizeof (struct sockaddr_ctl);
+ return 1;
+#endif
+ default:
+ PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
+ "unknown PF_SYSTEM protocol");
+ return 0;
+ }
+#endif
+
/* More cases here... */
default:
- PyErr_SetString(socket_error, "getsockaddrlen: bad family");
+ PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
return 0;
}
}
+/* Support functions for the sendmsg() and recvmsg[_into]() methods.
+ Currently, these methods are only compiled if the RFC 2292/3542
+ CMSG_LEN() macro is available. Older systems seem to have used
+ sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
+ it may be possible to define CMSG_LEN() that way if it's not
+ provided. Some architectures might need extra padding after the
+ cmsghdr, however, and CMSG_LEN() would have to take account of
+ this. */
+#ifdef CMSG_LEN
+/* If length is in range, set *result to CMSG_LEN(length) and return
+ true; otherwise, return false. */
+static int
+get_CMSG_LEN(size_t length, size_t *result)
+{
+ size_t tmp;
+
+ if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
+ return 0;
+ tmp = CMSG_LEN(length);
+ if (tmp > SOCKLEN_T_LIMIT || tmp < length)
+ return 0;
+ *result = tmp;
+ return 1;
+}
+
+#ifdef CMSG_SPACE
+/* If length is in range, set *result to CMSG_SPACE(length) and return
+ true; otherwise, return false. */
+static int
+get_CMSG_SPACE(size_t length, size_t *result)
+{
+ size_t tmp;
+
+ /* Use CMSG_SPACE(1) here in order to take account of the padding
+ necessary before *and* after the data. */
+ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
+ return 0;
+ tmp = CMSG_SPACE(length);
+ if (tmp > SOCKLEN_T_LIMIT || tmp < length)
+ return 0;
+ *result = tmp;
+ return 1;
+}
+#endif
+
+/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
+ pointer in msg->msg_control with at least "space" bytes after it,
+ and its cmsg_len member inside the buffer. */
+static int
+cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
+{
+ size_t cmsg_offset;
+ static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
+ sizeof(cmsgh->cmsg_len));
+
+ /* Note that POSIX allows msg_controllen to be of signed type. */
+ if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
+ return 0;
+ if (space < cmsg_len_end)
+ space = cmsg_len_end;
+ cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
+ return (cmsg_offset <= (size_t)-1 - space &&
+ cmsg_offset + space <= msg->msg_controllen);
+}
+
+/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
+ *space to number of bytes following it in the buffer and return
+ true; otherwise, return false. Assumes cmsgh, msg->msg_control and
+ msg->msg_controllen are valid. */
+static int
+get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
+{
+ size_t data_offset;
+ char *data_ptr;
+
+ if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
+ return 0;
+ data_offset = data_ptr - (char *)msg->msg_control;
+ if (data_offset > msg->msg_controllen)
+ return 0;
+ *space = msg->msg_controllen - data_offset;
+ return 1;
+}
+
+/* If cmsgh is invalid or not contained in the buffer pointed to by
+ msg->msg_control, return -1. If cmsgh is valid and its associated
+ data is entirely contained in the buffer, set *data_len to the
+ length of the associated data and return 0. If only part of the
+ associated data is contained in the buffer but cmsgh is otherwise
+ valid, set *data_len to the length contained in the buffer and
+ return 1. */
+static int
+get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
+{
+ size_t space, cmsg_data_len;
+
+ if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
+ cmsgh->cmsg_len < CMSG_LEN(0))
+ return -1;
+ cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
+ if (!get_cmsg_data_space(msg, cmsgh, &space))
+ return -1;
+ if (space >= cmsg_data_len) {
+ *data_len = cmsg_data_len;
+ return 0;
+ }
+ *data_len = space;
+ return 1;
+}
+#endif /* CMSG_LEN */
+
+
/* s._accept() -> (fd, address) */
static PyObject *
@@ -1889,7 +2225,7 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args)
#else
if (buflen <= 0 || buflen > 1024) {
#endif
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"getsockopt buflen out of range");
return NULL;
}
@@ -2620,6 +2956,331 @@ PyDoc_STRVAR(recvfrom_into_doc,
Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
+/* The sendmsg() and recvmsg[_into]() methods require a working
+ CMSG_LEN(). See the comment near get_CMSG_LEN(). */
+#ifdef CMSG_LEN
+/*
+ * Call recvmsg() with the supplied iovec structures, flags, and
+ * ancillary data buffer size (controllen). Returns the tuple return
+ * value for recvmsg() or recvmsg_into(), with the first item provided
+ * by the supplied makeval() function. makeval() will be called with
+ * the length read and makeval_data as arguments, and must return a
+ * new reference (which will be decrefed if there is a subsequent
+ * error). On error, closes any file descriptors received via
+ * SCM_RIGHTS.
+ */
+static PyObject *
+sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
+ int flags, Py_ssize_t controllen,
+ PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
+{
+ ssize_t bytes_received = -1;
+ int timeout;
+ sock_addr_t addrbuf;
+ socklen_t addrbuflen;
+ struct msghdr msg = {0};
+ PyObject *cmsg_list = NULL, *retval = NULL;
+ void *controlbuf = NULL;
+ struct cmsghdr *cmsgh;
+ size_t cmsgdatalen = 0;
+ int cmsg_status;
+
+ /* XXX: POSIX says that msg_name and msg_namelen "shall be
+ ignored" when the socket is connected (Linux fills them in
+ anyway for AF_UNIX sockets at least). Normally msg_namelen
+ seems to be set to 0 if there's no address, but try to
+ initialize msg_name to something that won't be mistaken for a
+ real address if that doesn't happen. */
+ if (!getsockaddrlen(s, &addrbuflen))
+ return NULL;
+ memset(&addrbuf, 0, addrbuflen);
+ SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
+
+ if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid ancillary data buffer length");
+ return NULL;
+ }
+ if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
+ return PyErr_NoMemory();
+
+ /* Make the system call. */
+ if (!IS_SELECTABLE(s)) {
+ select_error();
+ goto finally;
+ }
+
+ BEGIN_SELECT_LOOP(s)
+ Py_BEGIN_ALLOW_THREADS;
+ msg.msg_name = SAS2SA(&addrbuf);
+ msg.msg_namelen = addrbuflen;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = iovlen;
+ msg.msg_control = controlbuf;
+ msg.msg_controllen = controllen;
+ timeout = internal_select_ex(s, 0, interval);
+ if (!timeout)
+ bytes_received = recvmsg(s->sock_fd, &msg, flags);
+ Py_END_ALLOW_THREADS;
+ if (timeout == 1) {
+ PyErr_SetString(socket_timeout, "timed out");
+ goto finally;
+ }
+ END_SELECT_LOOP(s)
+
+ if (bytes_received < 0) {
+ s->errorhandler();
+ goto finally;
+ }
+
+ /* Make list of (level, type, data) tuples from control messages. */
+ if ((cmsg_list = PyList_New(0)) == NULL)
+ goto err_closefds;
+ /* Check for empty ancillary data as old CMSG_FIRSTHDR()
+ implementations didn't do so. */
+ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
+ cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
+ PyObject *bytes, *tuple;
+ int tmp;
+
+ cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
+ if (cmsg_status != 0) {
+ if (PyErr_WarnEx(PyExc_RuntimeWarning,
+ "received malformed or improperly-truncated "
+ "ancillary data", 1) == -1)
+ goto err_closefds;
+ }
+ if (cmsg_status < 0)
+ break;
+ if (cmsgdatalen > PY_SSIZE_T_MAX) {
+ PyErr_SetString(PyExc_OSError, "control message too long");
+ goto err_closefds;
+ }
+
+ bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
+ cmsgdatalen);
+ tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
+ (int)cmsgh->cmsg_type, bytes);
+ if (tuple == NULL)
+ goto err_closefds;
+ tmp = PyList_Append(cmsg_list, tuple);
+ Py_DECREF(tuple);
+ if (tmp != 0)
+ goto err_closefds;
+
+ if (cmsg_status != 0)
+ break;
+ }
+
+ retval = Py_BuildValue("NOiN",
+ (*makeval)(bytes_received, makeval_data),
+ cmsg_list,
+ (int)msg.msg_flags,
+ makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
+ ((msg.msg_namelen > addrbuflen) ?
+ addrbuflen : msg.msg_namelen),
+ s->sock_proto));
+ if (retval == NULL)
+ goto err_closefds;
+
+finally:
+ Py_XDECREF(cmsg_list);
+ PyMem_Free(controlbuf);
+ return retval;
+
+err_closefds:
+#ifdef SCM_RIGHTS
+ /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
+ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
+ cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
+ cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
+ if (cmsg_status < 0)
+ break;
+ if (cmsgh->cmsg_level == SOL_SOCKET &&
+ cmsgh->cmsg_type == SCM_RIGHTS) {
+ size_t numfds;
+ int *fdp;
+
+ numfds = cmsgdatalen / sizeof(int);
+ fdp = (int *)CMSG_DATA(cmsgh);
+ while (numfds-- > 0)
+ close(*fdp++);
+ }
+ if (cmsg_status != 0)
+ break;
+ }
+#endif /* SCM_RIGHTS */
+ goto finally;
+}
+
+
+static PyObject *
+makeval_recvmsg(ssize_t received, void *data)
+{
+ PyObject **buf = data;
+
+ if (received < PyBytes_GET_SIZE(*buf))
+ _PyBytes_Resize(buf, received);
+ Py_XINCREF(*buf);
+ return *buf;
+}
+
+/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
+
+static PyObject *
+sock_recvmsg(PySocketSockObject *s, PyObject *args)
+{
+ Py_ssize_t bufsize, ancbufsize = 0;
+ int flags = 0;
+ struct iovec iov;
+ PyObject *buf = NULL, *retval = NULL;
+
+ if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
+ return NULL;
+
+ if (bufsize < 0) {
+ PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
+ return NULL;
+ }
+ if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
+ return NULL;
+ iov.iov_base = PyBytes_AS_STRING(buf);
+ iov.iov_len = bufsize;
+
+ /* Note that we're passing a pointer to *our pointer* to the bytes
+ object here (&buf); makeval_recvmsg() may incref the object, or
+ deallocate it and set our pointer to NULL. */
+ retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
+ &makeval_recvmsg, &buf);
+ Py_XDECREF(buf);
+ return retval;
+}
+
+PyDoc_STRVAR(recvmsg_doc,
+"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
+\n\
+Receive normal data (up to bufsize bytes) and ancillary data from the\n\
+socket. The ancbufsize argument sets the size in bytes of the\n\
+internal buffer used to receive the ancillary data; it defaults to 0,\n\
+meaning that no ancillary data will be received. Appropriate buffer\n\
+sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
+CMSG_LEN(), and items which do not fit into the buffer might be\n\
+truncated or discarded. The flags argument defaults to 0 and has the\n\
+same meaning as for recv().\n\
+\n\
+The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
+The data item is a bytes object holding the non-ancillary data\n\
+received. The ancdata item is a list of zero or more tuples\n\
+(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
+(control messages) received: cmsg_level and cmsg_type are integers\n\
+specifying the protocol level and protocol-specific type respectively,\n\
+and cmsg_data is a bytes object holding the associated data. The\n\
+msg_flags item is the bitwise OR of various flags indicating\n\
+conditions on the received message; see your system documentation for\n\
+details. If the receiving socket is unconnected, address is the\n\
+address of the sending socket, if available; otherwise, its value is\n\
+unspecified.\n\
+\n\
+If recvmsg() raises an exception after the system call returns, it\n\
+will first attempt to close any file descriptors received via the\n\
+SCM_RIGHTS mechanism.");
+
+
+static PyObject *
+makeval_recvmsg_into(ssize_t received, void *data)
+{
+ return PyLong_FromSsize_t(received);
+}
+
+/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
+
+static PyObject *
+sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
+{
+ Py_ssize_t ancbufsize = 0;
+ int flags = 0;
+ struct iovec *iovs = NULL;
+ Py_ssize_t i, nitems, nbufs = 0;
+ Py_buffer *bufs = NULL;
+ PyObject *buffers_arg, *fast, *retval = NULL;
+
+ if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
+ &buffers_arg, &ancbufsize, &flags))
+ return NULL;
+
+ if ((fast = PySequence_Fast(buffers_arg,
+ "recvmsg_into() argument 1 must be an "
+ "iterable")) == NULL)
+ return NULL;
+ nitems = PySequence_Fast_GET_SIZE(fast);
+ if (nitems > INT_MAX) {
+ PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
+ goto finally;
+ }
+
+ /* Fill in an iovec for each item, and save the Py_buffer
+ structs to release afterwards. */
+ if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
+ (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
+ PyErr_NoMemory();
+ goto finally;
+ }
+ for (; nbufs < nitems; nbufs++) {
+ if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
+ "w*;recvmsg_into() argument 1 must be an iterable "
+ "of single-segment read-write buffers",
+ &bufs[nbufs]))
+ goto finally;
+ iovs[nbufs].iov_base = bufs[nbufs].buf;
+ iovs[nbufs].iov_len = bufs[nbufs].len;
+ }
+
+ retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
+ &makeval_recvmsg_into, NULL);
+finally:
+ for (i = 0; i < nbufs; i++)
+ PyBuffer_Release(&bufs[i]);
+ PyMem_Free(bufs);
+ PyMem_Free(iovs);
+ Py_DECREF(fast);
+ return retval;
+}
+
+PyDoc_STRVAR(recvmsg_into_doc,
+"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
+\n\
+Receive normal data and ancillary data from the socket, scattering the\n\
+non-ancillary data into a series of buffers. The buffers argument\n\
+must be an iterable of objects that export writable buffers\n\
+(e.g. bytearray objects); these will be filled with successive chunks\n\
+of the non-ancillary data until it has all been written or there are\n\
+no more buffers. The ancbufsize argument sets the size in bytes of\n\
+the internal buffer used to receive the ancillary data; it defaults to\n\
+0, meaning that no ancillary data will be received. Appropriate\n\
+buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
+or CMSG_LEN(), and items which do not fit into the buffer might be\n\
+truncated or discarded. The flags argument defaults to 0 and has the\n\
+same meaning as for recv().\n\
+\n\
+The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
+The nbytes item is the total number of bytes of non-ancillary data\n\
+written into the buffers. The ancdata item is a list of zero or more\n\
+tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
+data (control messages) received: cmsg_level and cmsg_type are\n\
+integers specifying the protocol level and protocol-specific type\n\
+respectively, and cmsg_data is a bytes object holding the associated\n\
+data. The msg_flags item is the bitwise OR of various flags\n\
+indicating conditions on the received message; see your system\n\
+documentation for details. If the receiving socket is unconnected,\n\
+address is the address of the sending socket, if available; otherwise,\n\
+its value is unspecified.\n\
+\n\
+If recvmsg_into() raises an exception after the system call returns,\n\
+it will first attempt to close any file descriptors received via the\n\
+SCM_RIGHTS mechanism.");
+#endif /* CMSG_LEN */
+
+
/* s.send(data [,flags]) method */
static PyObject *
@@ -2771,6 +3432,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
PyErr_Format(PyExc_TypeError,
"sendto() takes 2 or 3 arguments (%d given)",
arglen);
+ return NULL;
}
if (PyErr_Occurred())
return NULL;
@@ -2814,6 +3476,234 @@ Like send(data, flags) but allows specifying the destination address.\n\
For IP sockets, the address is a pair (hostaddr, port).");
+/* The sendmsg() and recvmsg[_into]() methods require a working
+ CMSG_LEN(). See the comment near get_CMSG_LEN(). */
+#ifdef CMSG_LEN
+/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
+
+static PyObject *
+sock_sendmsg(PySocketSockObject *s, PyObject *args)
+{
+ Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
+ Py_buffer *databufs = NULL;
+ struct iovec *iovs = NULL;
+ sock_addr_t addrbuf;
+ struct msghdr msg = {0};
+ struct cmsginfo {
+ int level;
+ int type;
+ Py_buffer data;
+ } *cmsgs = NULL;
+ void *controlbuf = NULL;
+ size_t controllen, controllen_last;
+ ssize_t bytes_sent = -1;
+ int addrlen, timeout, flags = 0;
+ PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
+ *cmsg_fast = NULL, *retval = NULL;
+
+ if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
+ &data_arg, &cmsg_arg, &flags, &addr_arg))
+ return NULL;
+
+ /* Parse destination address. */
+ if (addr_arg != NULL && addr_arg != Py_None) {
+ if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
+ goto finally;
+ msg.msg_name = &addrbuf;
+ msg.msg_namelen = addrlen;
+ }
+
+ /* Fill in an iovec for each message part, and save the Py_buffer
+ structs to release afterwards. */
+ if ((data_fast = PySequence_Fast(data_arg,
+ "sendmsg() argument 1 must be an "
+ "iterable")) == NULL)
+ goto finally;
+ ndataparts = PySequence_Fast_GET_SIZE(data_fast);
+ if (ndataparts > INT_MAX) {
+ PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
+ goto finally;
+ }
+ msg.msg_iovlen = ndataparts;
+ if (ndataparts > 0 &&
+ ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
+ (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
+ PyErr_NoMemory();
+ goto finally;
+ }
+ for (; ndatabufs < ndataparts; ndatabufs++) {
+ if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
+ "y*;sendmsg() argument 1 must be an iterable of "
+ "buffer-compatible objects",
+ &databufs[ndatabufs]))
+ goto finally;
+ iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
+ iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
+ }
+
+ if (cmsg_arg == NULL)
+ ncmsgs = 0;
+ else {
+ if ((cmsg_fast = PySequence_Fast(cmsg_arg,
+ "sendmsg() argument 2 must be an "
+ "iterable")) == NULL)
+ goto finally;
+ ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
+ }
+
+#ifndef CMSG_SPACE
+ if (ncmsgs > 1) {
+ PyErr_SetString(PyExc_OSError,
+ "sending multiple control messages is not supported "
+ "on this system");
+ goto finally;
+ }
+#endif
+ /* Save level, type and Py_buffer for each control message,
+ and calculate total size. */
+ if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
+ PyErr_NoMemory();
+ goto finally;
+ }
+ controllen = controllen_last = 0;
+ while (ncmsgbufs < ncmsgs) {
+ size_t bufsize, space;
+
+ if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
+ "(iiy*):[sendmsg() ancillary data items]",
+ &cmsgs[ncmsgbufs].level,
+ &cmsgs[ncmsgbufs].type,
+ &cmsgs[ncmsgbufs].data))
+ goto finally;
+ bufsize = cmsgs[ncmsgbufs++].data.len;
+
+#ifdef CMSG_SPACE
+ if (!get_CMSG_SPACE(bufsize, &space)) {
+#else
+ if (!get_CMSG_LEN(bufsize, &space)) {
+#endif
+ PyErr_SetString(PyExc_OSError, "ancillary data item too large");
+ goto finally;
+ }
+ controllen += space;
+ if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
+ PyErr_SetString(PyExc_OSError, "too much ancillary data");
+ goto finally;
+ }
+ controllen_last = controllen;
+ }
+
+ /* Construct ancillary data block from control message info. */
+ if (ncmsgbufs > 0) {
+ struct cmsghdr *cmsgh = NULL;
+
+ if ((msg.msg_control = controlbuf =
+ PyMem_Malloc(controllen)) == NULL) {
+ PyErr_NoMemory();
+ goto finally;
+ }
+ msg.msg_controllen = controllen;
+
+ /* Need to zero out the buffer as a workaround for glibc's
+ CMSG_NXTHDR() implementation. After getting the pointer to
+ the next header, it checks its (uninitialized) cmsg_len
+ member to see if the "message" fits in the buffer, and
+ returns NULL if it doesn't. Zero-filling the buffer
+ ensures that that doesn't happen. */
+ memset(controlbuf, 0, controllen);
+
+ for (i = 0; i < ncmsgbufs; i++) {
+ size_t msg_len, data_len = cmsgs[i].data.len;
+ int enough_space = 0;
+
+ cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
+ if (cmsgh == NULL) {
+ PyErr_Format(PyExc_RuntimeError,
+ "unexpected NULL result from %s()",
+ (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
+ goto finally;
+ }
+ if (!get_CMSG_LEN(data_len, &msg_len)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "item size out of range for CMSG_LEN()");
+ goto finally;
+ }
+ if (cmsg_min_space(&msg, cmsgh, msg_len)) {
+ size_t space;
+
+ cmsgh->cmsg_len = msg_len;
+ if (get_cmsg_data_space(&msg, cmsgh, &space))
+ enough_space = (space >= data_len);
+ }
+ if (!enough_space) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "ancillary data does not fit in calculated "
+ "space");
+ goto finally;
+ }
+ cmsgh->cmsg_level = cmsgs[i].level;
+ cmsgh->cmsg_type = cmsgs[i].type;
+ memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
+ }
+ }
+
+ /* Make the system call. */
+ if (!IS_SELECTABLE(s)) {
+ select_error();
+ goto finally;
+ }
+
+ BEGIN_SELECT_LOOP(s)
+ Py_BEGIN_ALLOW_THREADS;
+ timeout = internal_select_ex(s, 1, interval);
+ if (!timeout)
+ bytes_sent = sendmsg(s->sock_fd, &msg, flags);
+ Py_END_ALLOW_THREADS;
+ if (timeout == 1) {
+ PyErr_SetString(socket_timeout, "timed out");
+ goto finally;
+ }
+ END_SELECT_LOOP(s)
+
+ if (bytes_sent < 0) {
+ s->errorhandler();
+ goto finally;
+ }
+ retval = PyLong_FromSsize_t(bytes_sent);
+
+finally:
+ PyMem_Free(controlbuf);
+ for (i = 0; i < ncmsgbufs; i++)
+ PyBuffer_Release(&cmsgs[i].data);
+ PyMem_Free(cmsgs);
+ Py_XDECREF(cmsg_fast);
+ for (i = 0; i < ndatabufs; i++)
+ PyBuffer_Release(&databufs[i]);
+ PyMem_Free(databufs);
+ PyMem_Free(iovs);
+ Py_XDECREF(data_fast);
+ return retval;
+}
+
+PyDoc_STRVAR(sendmsg_doc,
+"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
+\n\
+Send normal and ancillary data to the socket, gathering the\n\
+non-ancillary data from a series of buffers and concatenating it into\n\
+a single message. The buffers argument specifies the non-ancillary\n\
+data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
+The ancdata argument specifies the ancillary data (control messages)\n\
+as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
+cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
+protocol level and protocol-specific type respectively, and cmsg_data\n\
+is a buffer-compatible object holding the associated data. The flags\n\
+argument defaults to 0 and has the same meaning as for send(). If\n\
+address is supplied and not None, it sets a destination address for\n\
+the message. The return value is the number of bytes of non-ancillary\n\
+data sent.");
+#endif /* CMSG_LEN */
+
+
/* s.shutdown(how) method */
static PyObject *
@@ -2882,6 +3772,34 @@ PyDoc_STRVAR(sock_ioctl_doc,
Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
+#endif
+
+#if defined(MS_WINDOWS)
+static PyObject*
+sock_share(PySocketSockObject *s, PyObject *arg)
+{
+ WSAPROTOCOL_INFO info;
+ DWORD processId;
+ int result;
+
+ if (!PyArg_ParseTuple(arg, "I", &processId))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = WSADuplicateSocket(s->sock_fd, processId, &info);
+ Py_END_ALLOW_THREADS
+ if (result == SOCKET_ERROR)
+ return set_error();
+ return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
+}
+PyDoc_STRVAR(sock_share_doc,
+"share(process_id) -> bytes\n\
+\n\
+Share the socket with another process. The target process id\n\
+must be provided and the resulting bytes object passed to the target\n\
+process. There the shared socket can be instantiated by calling\n\
+socket.fromshare().");
+
#endif
@@ -2914,6 +3832,10 @@ static PyMethodDef sock_methods[] = {
{"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
sock_ioctl_doc},
#endif
+#if defined(MS_WINDOWS)
+ {"share", (PyCFunction)sock_share, METH_VARARGS,
+ sock_share_doc},
+#endif
{"listen", (PyCFunction)sock_listen, METH_O,
listen_doc},
{"recv", (PyCFunction)sock_recv, METH_VARARGS,
@@ -2940,6 +3862,14 @@ static PyMethodDef sock_methods[] = {
setsockopt_doc},
{"shutdown", (PyCFunction)sock_shutdown, METH_O,
shutdown_doc},
+#ifdef CMSG_LEN
+ {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
+ recvmsg_doc},
+ {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
+ recvmsg_into_doc,},
+ {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
+ sendmsg_doc},
+#endif
{NULL, NULL} /* sentinel */
};
@@ -3033,13 +3963,40 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
return -1;
if (fdobj != NULL && fdobj != Py_None) {
- fd = PyLong_AsSocket_t(fdobj);
- if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
- return -1;
- if (fd == INVALID_SOCKET) {
- PyErr_SetString(PyExc_ValueError,
- "can't use invalid socket value");
- return -1;
+#ifdef MS_WINDOWS
+ /* recreate a socket that was duplicated */
+ if (PyBytes_Check(fdobj)) {
+ WSAPROTOCOL_INFO info;
+ if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
+ PyErr_Format(PyExc_ValueError,
+ "socket descriptor string has wrong size, "
+ "should be %zu bytes.", sizeof(info));
+ return -1;
+ }
+ memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
+ Py_BEGIN_ALLOW_THREADS
+ fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
+ FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
+ Py_END_ALLOW_THREADS
+ if (fd == INVALID_SOCKET) {
+ set_error();
+ return -1;
+ }
+ family = info.iAddressFamily;
+ type = info.iSocketType;
+ proto = info.iProtocol;
+ }
+ else
+#endif
+ {
+ fd = PyLong_AsSocket_t(fdobj);
+ if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
+ return -1;
+ if (fd == INVALID_SOCKET) {
+ PyErr_SetString(PyExc_ValueError,
+ "can't use invalid socket value");
+ return -1;
+ }
}
}
else {
@@ -3115,25 +4072,35 @@ socket_gethostname(PyObject *self, PyObject *unused)
version of the hostname, whereas we need a Unicode string.
Otherwise, gethostname apparently also returns the DNS name. */
wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
- DWORD size = sizeof(buf) / sizeof(wchar_t);
+ DWORD size = Py_ARRAY_LENGTH(buf);
+ wchar_t *name;
PyObject *result;
- if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
- if (GetLastError() == ERROR_MORE_DATA) {
- /* MSDN says this may occur "because DNS allows longer names */
- if (size == 0) /* XXX: I'm not sure how to handle this */
- return PyUnicode_FromUnicode(NULL, 0);
- result = PyUnicode_FromUnicode(NULL, size - 1);
- if (!result)
- return NULL;
- if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
- PyUnicode_AS_UNICODE(result),
- &size))
- return result;
- Py_DECREF(result);
- }
- return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
+
+ if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
+ return PyUnicode_FromWideChar(buf, size);
+
+ if (GetLastError() != ERROR_MORE_DATA)
+ return PyErr_SetFromWindowsErr(0);
+
+ if (size == 0)
+ return PyUnicode_New(0, 0);
+
+ /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
+ names */
+ name = PyMem_Malloc(size * sizeof(wchar_t));
+ if (!name)
+ return NULL;
+ if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
+ name,
+ &size))
+ {
+ PyMem_Free(name);
+ return PyErr_SetFromWindowsErr(0);
}
- return PyUnicode_FromUnicode(buf, size);
+
+ result = PyUnicode_FromWideChar(name, size);
+ PyMem_Free(name);
+ return result;
#else
char buf[1024];
int res;
@@ -3152,6 +4119,37 @@ PyDoc_STRVAR(gethostname_doc,
\n\
Return the current host name.");
+#ifdef HAVE_SETHOSTNAME
+PyDoc_STRVAR(sethostname_doc,
+"sethostname(name)\n\n\
+Sets the hostname to name.");
+
+static PyObject *
+socket_sethostname(PyObject *self, PyObject *args)
+{
+ PyObject *hnobj;
+ Py_buffer buf;
+ int res, flag = 0;
+
+ if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
+ PyErr_Clear();
+ if (!PyArg_ParseTuple(args, "O&:sethostname",
+ PyUnicode_FSConverter, &hnobj))
+ return NULL;
+ flag = 1;
+ }
+ res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
+ if (!res) {
+ res = sethostname(buf.buf, buf.len);
+ PyBuffer_Release(&buf);
+ }
+ if (flag)
+ Py_DECREF(hnobj);
+ if (res)
+ return set_error();
+ Py_RETURN_NONE;
+}
+#endif
/* Python interface to gethostbyname(name). */
@@ -3198,9 +4196,8 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
if (h->h_addrtype != af) {
/* Let's get real error message to return */
- PyErr_SetString(socket_error,
- (char *)strerror(EAFNOSUPPORT));
-
+ errno = EAFNOSUPPORT;
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
@@ -3283,7 +4280,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
#endif
default: /* can't happen */
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"unsupported address family");
return NULL;
}
@@ -3315,11 +4312,7 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
{
char *name;
struct hostent *h;
-#ifdef ENABLE_IPV6
- struct sockaddr_storage addr;
-#else
- struct sockaddr_in addr;
-#endif
+ sock_addr_t addr;
struct sockaddr *sa;
PyObject *ret = NULL;
#ifdef HAVE_GETHOSTBYNAME_R
@@ -3331,19 +4324,19 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
int buf_len = (sizeof buf) - 1;
int errnop;
#endif
-#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
+#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
int result;
#endif
#endif /* HAVE_GETHOSTBYNAME_R */
if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
return NULL;
- if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
+ if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
goto finally;
Py_BEGIN_ALLOW_THREADS
#ifdef HAVE_GETHOSTBYNAME_R
#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
- result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
+ gethostbyname_r(name, &hp_allocated, buf, buf_len,
&h, &errnop);
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
@@ -3363,8 +4356,8 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
addr.ss_family.
Therefore, we cast the sockaddr_storage into sockaddr to
access sa_family. */
- sa = (struct sockaddr*)&addr;
- ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
+ sa = SAS2SA(&addr);
+ ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
sa->sa_family);
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_release_lock(netdb_lock);
@@ -3387,12 +4380,8 @@ for a host. The host argument is a string giving a host name or IP number.");
static PyObject *
socket_gethostbyaddr(PyObject *self, PyObject *args)
{
-#ifdef ENABLE_IPV6
- struct sockaddr_storage addr;
-#else
- struct sockaddr_in addr;
-#endif
- struct sockaddr *sa = (struct sockaddr *)&addr;
+ sock_addr_t addr;
+ struct sockaddr *sa = SAS2SA(&addr);
char *ip_num;
struct hostent *h;
PyObject *ret = NULL;
@@ -3409,7 +4398,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
int buf_len = (sizeof buf) - 1;
int errnop;
#endif
-#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
+#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
int result;
#endif
#endif /* HAVE_GETHOSTBYNAME_R */
@@ -3424,7 +4413,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
goto finally;
af = sa->sa_family;
ap = NULL;
- al = 0;
+ /* al = 0; */
switch (af) {
case AF_INET:
ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
@@ -3437,13 +4426,13 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
break;
#endif
default:
- PyErr_SetString(socket_error, "unsupported address family");
+ PyErr_SetString(PyExc_OSError, "unsupported address family");
goto finally;
}
Py_BEGIN_ALLOW_THREADS
#ifdef HAVE_GETHOSTBYNAME_R
#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
- result = gethostbyaddr_r(ap, al, af,
+ gethostbyaddr_r(ap, al, af,
&hp_allocated, buf, buf_len,
&h, &errnop);
#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
@@ -3461,7 +4450,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
h = gethostbyaddr(ap, al, af);
#endif /* HAVE_GETHOSTBYNAME_R */
Py_END_ALLOW_THREADS
- ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
+ ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_release_lock(netdb_lock);
#endif
@@ -3493,7 +4482,7 @@ socket_getservbyname(PyObject *self, PyObject *args)
sp = getservbyname(name, proto);
Py_END_ALLOW_THREADS
if (sp == NULL) {
- PyErr_SetString(socket_error, "service/proto not found");
+ PyErr_SetString(PyExc_OSError, "service/proto not found");
return NULL;
}
return PyLong_FromLong((long) ntohs(sp->s_port));
@@ -3530,7 +4519,7 @@ socket_getservbyport(PyObject *self, PyObject *args)
sp = getservbyport(htons((short)port), proto);
Py_END_ALLOW_THREADS
if (sp == NULL) {
- PyErr_SetString(socket_error, "port/proto not found");
+ PyErr_SetString(PyExc_OSError, "port/proto not found");
return NULL;
}
return PyUnicode_FromString(sp->s_name);
@@ -3559,7 +4548,7 @@ socket_getprotobyname(PyObject *self, PyObject *args)
sp = getprotobyname(name);
Py_END_ALLOW_THREADS
if (sp == NULL) {
- PyErr_SetString(socket_error, "protocol not found");
+ PyErr_SetString(PyExc_OSError, "protocol not found");
return NULL;
}
return PyLong_FromLong((long) sp->p_proto);
@@ -3814,7 +4803,7 @@ socket_inet_aton(PyObject *self, PyObject *args)
return PyBytes_FromStringAndSize((char *)(&buf),
sizeof(buf));
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"illegal IP address string passed to inet_aton");
return NULL;
@@ -3835,7 +4824,7 @@ socket_inet_aton(PyObject *self, PyObject *args)
packed_addr = inet_addr(ip_addr);
if (packed_addr == INADDR_NONE) { /* invalid address */
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"illegal IP address string passed to inet_aton");
return NULL;
}
@@ -3867,7 +4856,7 @@ socket_inet_ntoa(PyObject *self, PyObject *args)
}
if (addr_len != sizeof(packed_addr)) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"packed IP wrong length for inet_ntoa");
return NULL;
}
@@ -3902,7 +4891,7 @@ socket_inet_pton(PyObject *self, PyObject *args)
#if !defined(ENABLE_IPV6) && defined(AF_INET6)
if(af == AF_INET6) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"can't use AF_INET6, IPv6 is disabled");
return NULL;
}
@@ -3910,10 +4899,10 @@ socket_inet_pton(PyObject *self, PyObject *args)
retval = inet_pton(af, ip, packed);
if (retval < 0) {
- PyErr_SetFromErrno(socket_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
} else if (retval == 0) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"illegal IP address string passed to inet_pton");
return NULL;
} else if (af == AF_INET) {
@@ -3925,7 +4914,7 @@ socket_inet_pton(PyObject *self, PyObject *args)
sizeof(struct in6_addr));
#endif
} else {
- PyErr_SetString(socket_error, "unknown address family");
+ PyErr_SetString(PyExc_OSError, "unknown address family");
return NULL;
}
}
@@ -3977,7 +4966,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
retval = inet_ntop(af, packed, ip, sizeof(ip));
if (!retval) {
- PyErr_SetFromErrno(socket_error);
+ PyErr_SetFromErrno(PyExc_OSError);
return NULL;
} else {
return PyUnicode_FromString(retval);
@@ -3996,7 +4985,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
static PyObject *
socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
{
- static char* kwnames[] = {"host", "port", "family", "type", "proto",
+ static char* kwnames[] = {"host", "port", "family", "type", "proto",
"flags", 0};
struct addrinfo hints, *res;
struct addrinfo *res0 = NULL;
@@ -4011,7 +5000,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
family = socktype = protocol = flags = 0;
family = AF_UNSPEC;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
kwnames, &hobj, &pobj, &family, &socktype,
&protocol, &flags)) {
return NULL;
@@ -4019,7 +5008,9 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
if (hobj == Py_None) {
hptr = NULL;
} else if (PyUnicode_Check(hobj)) {
- idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
+ _Py_IDENTIFIER(encode);
+
+ idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
if (!idna)
return NULL;
assert(PyBytes_Check(idna));
@@ -4046,7 +5037,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
} else if (pobj == Py_None) {
pptr = (char *)NULL;
} else {
- PyErr_SetString(socket_error, "Int or String expected");
+ PyErr_SetString(PyExc_OSError, "Int or String expected");
goto err;
}
memset(&hints, 0, sizeof(hints));
@@ -4149,7 +5140,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
goto fail;
}
if (res->ai_next) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"sockaddr resolved to multiple addresses");
goto fail;
}
@@ -4157,7 +5148,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
case AF_INET:
{
if (PyTuple_GET_SIZE(sa) != 2) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_OSError,
"IPv4 sockaddr must be 2 tuple");
goto fail;
}
@@ -4244,6 +5235,163 @@ Set the default timeout in seconds (float) for new socket objects.\n\
A value of None indicates that new socket objects have no timeout.\n\
When the socket module is first imported, the default is None.");
+#ifdef HAVE_IF_NAMEINDEX
+/* Python API for getting interface indices and names */
+
+static PyObject *
+socket_if_nameindex(PyObject *self, PyObject *arg)
+{
+ PyObject *list;
+ int i;
+ struct if_nameindex *ni;
+
+ ni = if_nameindex();
+ if (ni == NULL) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ list = PyList_New(0);
+ if (list == NULL) {
+ if_freenameindex(ni);
+ return NULL;
+ }
+
+ for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
+ PyObject *ni_tuple = Py_BuildValue("IO&",
+ ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
+
+ if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
+ Py_XDECREF(ni_tuple);
+ Py_DECREF(list);
+ if_freenameindex(ni);
+ return NULL;
+ }
+ Py_DECREF(ni_tuple);
+ }
+
+ if_freenameindex(ni);
+ return list;
+}
+
+PyDoc_STRVAR(if_nameindex_doc,
+"if_nameindex()\n\
+\n\
+Returns a list of network interface information (index, name) tuples.");
+
+static PyObject *
+socket_if_nametoindex(PyObject *self, PyObject *args)
+{
+ PyObject *oname;
+ unsigned long index;
+
+ if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
+ PyUnicode_FSConverter, &oname))
+ return NULL;
+
+ index = if_nametoindex(PyBytes_AS_STRING(oname));
+ Py_DECREF(oname);
+ if (index == 0) {
+ /* if_nametoindex() doesn't set errno */
+ PyErr_SetString(PyExc_OSError, "no interface with this name");
+ return NULL;
+ }
+
+ return PyLong_FromUnsignedLong(index);
+}
+
+PyDoc_STRVAR(if_nametoindex_doc,
+"if_nametoindex(if_name)\n\
+\n\
+Returns the interface index corresponding to the interface name if_name.");
+
+static PyObject *
+socket_if_indextoname(PyObject *self, PyObject *arg)
+{
+ unsigned long index;
+ char name[IF_NAMESIZE + 1];
+
+ index = PyLong_AsUnsignedLong(arg);
+ if (index == (unsigned long) -1)
+ return NULL;
+
+ if (if_indextoname(index, name) == NULL) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ return PyUnicode_DecodeFSDefault(name);
+}
+
+PyDoc_STRVAR(if_indextoname_doc,
+"if_indextoname(if_index)\n\
+\n\
+Returns the interface name corresponding to the interface index if_index.");
+
+#endif /* HAVE_IF_NAMEINDEX */
+
+
+#ifdef CMSG_LEN
+/* Python interface to CMSG_LEN(length). */
+
+static PyObject *
+socket_CMSG_LEN(PyObject *self, PyObject *args)
+{
+ Py_ssize_t length;
+ size_t result;
+
+ if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
+ return NULL;
+ if (length < 0 || !get_CMSG_LEN(length, &result)) {
+ PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
+ return NULL;
+ }
+ return PyLong_FromSize_t(result);
+}
+
+PyDoc_STRVAR(CMSG_LEN_doc,
+"CMSG_LEN(length) -> control message length\n\
+\n\
+Return the total length, without trailing padding, of an ancillary\n\
+data item with associated data of the given length. This value can\n\
+often be used as the buffer size for recvmsg() to receive a single\n\
+item of ancillary data, but RFC 3542 requires portable applications to\n\
+use CMSG_SPACE() and thus include space for padding, even when the\n\
+item will be the last in the buffer. Raises OverflowError if length\n\
+is outside the permissible range of values.");
+
+
+#ifdef CMSG_SPACE
+/* Python interface to CMSG_SPACE(length). */
+
+static PyObject *
+socket_CMSG_SPACE(PyObject *self, PyObject *args)
+{
+ Py_ssize_t length;
+ size_t result;
+
+ if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
+ return NULL;
+ if (length < 0 || !get_CMSG_SPACE(length, &result)) {
+ PyErr_SetString(PyExc_OverflowError,
+ "CMSG_SPACE() argument out of range");
+ return NULL;
+ }
+ return PyLong_FromSize_t(result);
+}
+
+PyDoc_STRVAR(CMSG_SPACE_doc,
+"CMSG_SPACE(length) -> buffer size\n\
+\n\
+Return the buffer size needed for recvmsg() to receive an ancillary\n\
+data item with associated data of the given length, along with any\n\
+trailing padding. The buffer space needed to receive multiple items\n\
+is the sum of the CMSG_SPACE() values for their associated data\n\
+lengths. Raises OverflowError if length is outside the permissible\n\
+range of values.");
+#endif /* CMSG_SPACE */
+#endif /* CMSG_LEN */
+
/* List of functions exported by this module. */
@@ -4256,6 +5404,10 @@ static PyMethodDef socket_methods[] = {
METH_VARARGS, gethostbyaddr_doc},
{"gethostname", socket_gethostname,
METH_NOARGS, gethostname_doc},
+#ifdef HAVE_SETHOSTNAME
+ {"sethostname", socket_sethostname,
+ METH_VARARGS, sethostname_doc},
+#endif
{"getservbyname", socket_getservbyname,
METH_VARARGS, getservbyname_doc},
{"getservbyport", socket_getservbyport,
@@ -4296,6 +5448,22 @@ static PyMethodDef socket_methods[] = {
METH_NOARGS, getdefaulttimeout_doc},
{"setdefaulttimeout", socket_setdefaulttimeout,
METH_O, setdefaulttimeout_doc},
+#ifdef HAVE_IF_NAMEINDEX
+ {"if_nameindex", socket_if_nameindex,
+ METH_NOARGS, if_nameindex_doc},
+ {"if_nametoindex", socket_if_nametoindex,
+ METH_VARARGS, if_nametoindex_doc},
+ {"if_indextoname", socket_if_indextoname,
+ METH_O, if_indextoname_doc},
+#endif
+#ifdef CMSG_LEN
+ {"CMSG_LEN", socket_CMSG_LEN,
+ METH_VARARGS, CMSG_LEN_doc},
+#ifdef CMSG_SPACE
+ {"CMSG_SPACE", socket_CMSG_SPACE,
+ METH_VARARGS, CMSG_SPACE_doc},
+#endif
+#endif
{NULL, NULL} /* Sentinel */
};
@@ -4428,27 +5596,24 @@ PyInit__socket(void)
if (m == NULL)
return NULL;
- socket_error = PyErr_NewException("socket.error",
- PyExc_IOError, NULL);
- if (socket_error == NULL)
- return NULL;
- PySocketModuleAPI.error = socket_error;
- Py_INCREF(socket_error);
- PyModule_AddObject(m, "error", socket_error);
+ Py_INCREF(PyExc_OSError);
+ PySocketModuleAPI.error = PyExc_OSError;
+ Py_INCREF(PyExc_OSError);
+ PyModule_AddObject(m, "error", PyExc_OSError);
socket_herror = PyErr_NewException("socket.herror",
- socket_error, NULL);
+ PyExc_OSError, NULL);
if (socket_herror == NULL)
return NULL;
Py_INCREF(socket_herror);
PyModule_AddObject(m, "herror", socket_herror);
- socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
+ socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
NULL);
if (socket_gaierror == NULL)
return NULL;
Py_INCREF(socket_gaierror);
PyModule_AddObject(m, "gaierror", socket_gaierror);
socket_timeout = PyErr_NewException("socket.timeout",
- socket_error, NULL);
+ PyExc_OSError, NULL);
if (socket_timeout == NULL)
return NULL;
PySocketModuleAPI.timeout_error = socket_timeout;
@@ -4634,6 +5799,31 @@ PyInit__socket(void)
PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
#endif
+#ifdef AF_CAN
+ /* Controller Area Network */
+ PyModule_AddIntConstant(m, "AF_CAN", AF_CAN);
+#endif
+#ifdef PF_CAN
+ /* Controller Area Network */
+ PyModule_AddIntConstant(m, "PF_CAN", PF_CAN);
+#endif
+
+/* Reliable Datagram Sockets */
+#ifdef AF_RDS
+ PyModule_AddIntConstant(m, "AF_RDS", AF_RDS);
+#endif
+#ifdef PF_RDS
+ PyModule_AddIntConstant(m, "PF_RDS", PF_RDS);
+#endif
+
+/* Kernel event messages */
+#ifdef PF_SYSTEM
+ PyModule_AddIntConstant(m, "PF_SYSTEM", PF_SYSTEM);
+#endif
+#ifdef AF_SYSTEM
+ PyModule_AddIntConstant(m, "AF_SYSTEM", AF_SYSTEM);
+#endif
+
#ifdef AF_PACKET
PyModule_AddIntMacro(m, AF_PACKET);
#endif
@@ -4783,6 +5973,18 @@ PyInit__socket(void)
#ifdef SO_SETFIB
PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
#endif
+#ifdef SO_PASSCRED
+ PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
+#endif
+#ifdef SO_PEERCRED
+ PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
+#endif
+#ifdef LOCAL_PEERCRED
+ PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED);
+#endif
+#ifdef SO_BINDTODEVICE
+ PyModule_AddIntMacro(m, SO_BINDTODEVICE);
+#endif
/* Maximum number of connections for "listen" */
#ifdef SOMAXCONN
@@ -4791,6 +5993,17 @@ PyInit__socket(void)
PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
#endif
+ /* Ancilliary message types */
+#ifdef SCM_RIGHTS
+ PyModule_AddIntConstant(m, "SCM_RIGHTS", SCM_RIGHTS);
+#endif
+#ifdef SCM_CREDENTIALS
+ PyModule_AddIntConstant(m, "SCM_CREDENTIALS", SCM_CREDENTIALS);
+#endif
+#ifdef SCM_CREDS
+ PyModule_AddIntConstant(m, "SCM_CREDS", SCM_CREDS);
+#endif
+
/* Flags for send, recv */
#ifdef MSG_OOB
PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
@@ -4822,6 +6035,33 @@ PyInit__socket(void)
#ifdef MSG_ETAG
PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
#endif
+#ifdef MSG_NOSIGNAL
+ PyModule_AddIntConstant(m, "MSG_NOSIGNAL", MSG_NOSIGNAL);
+#endif
+#ifdef MSG_NOTIFICATION
+ PyModule_AddIntConstant(m, "MSG_NOTIFICATION", MSG_NOTIFICATION);
+#endif
+#ifdef MSG_CMSG_CLOEXEC
+ PyModule_AddIntConstant(m, "MSG_CMSG_CLOEXEC", MSG_CMSG_CLOEXEC);
+#endif
+#ifdef MSG_ERRQUEUE
+ PyModule_AddIntConstant(m, "MSG_ERRQUEUE", MSG_ERRQUEUE);
+#endif
+#ifdef MSG_CONFIRM
+ PyModule_AddIntConstant(m, "MSG_CONFIRM", MSG_CONFIRM);
+#endif
+#ifdef MSG_MORE
+ PyModule_AddIntConstant(m, "MSG_MORE", MSG_MORE);
+#endif
+#ifdef MSG_EOF
+ PyModule_AddIntConstant(m, "MSG_EOF", MSG_EOF);
+#endif
+#ifdef MSG_BCAST
+ PyModule_AddIntConstant(m, "MSG_BCAST", MSG_BCAST);
+#endif
+#ifdef MSG_MCAST
+ PyModule_AddIntConstant(m, "MSG_MCAST", MSG_MCAST);
+#endif
/* Protocol level and numbers, usable for [gs]etsockopt */
#ifdef SOL_SOCKET
@@ -4857,6 +6097,49 @@ PyInit__socket(void)
#else
PyModule_AddIntConstant(m, "SOL_UDP", 17);
#endif
+#ifdef SOL_CAN_BASE
+ PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE);
+#endif
+#ifdef SOL_CAN_RAW
+ PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW);
+ PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW);
+#endif
+#ifdef HAVE_LINUX_CAN_H
+ PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG);
+ PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG);
+ PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG);
+
+ PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK);
+ PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK);
+ PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK);
+#endif
+#ifdef HAVE_LINUX_CAN_RAW_H
+ PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER);
+ PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER);
+ PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK);
+ PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS);
+#endif
+#ifdef SOL_RDS
+ PyModule_AddIntConstant(m, "SOL_RDS", SOL_RDS);
+#endif
+#ifdef RDS_CANCEL_SENT_TO
+ PyModule_AddIntConstant(m, "RDS_CANCEL_SENT_TO", RDS_CANCEL_SENT_TO);
+#endif
+#ifdef RDS_GET_MR
+ PyModule_AddIntConstant(m, "RDS_GET_MR", RDS_GET_MR);
+#endif
+#ifdef RDS_FREE_MR
+ PyModule_AddIntConstant(m, "RDS_FREE_MR", RDS_FREE_MR);
+#endif
+#ifdef RDS_RECVERR
+ PyModule_AddIntConstant(m, "RDS_RECVERR", RDS_RECVERR);
+#endif
+#ifdef RDS_CONG_MONITOR
+ PyModule_AddIntConstant(m, "RDS_CONG_MONITOR", RDS_CONG_MONITOR);
+#endif
+#ifdef RDS_GET_MR_FOR_DEST
+ PyModule_AddIntConstant(m, "RDS_GET_MR_FOR_DEST", RDS_GET_MR_FOR_DEST);
+#endif
#ifdef IPPROTO_IP
PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
#else
@@ -4961,6 +6244,9 @@ PyInit__socket(void)
#ifdef IPPROTO_VRRP
PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
#endif
+#ifdef IPPROTO_SCTP
+ PyModule_AddIntConstant(m, "IPPROTO_SCTP", IPPROTO_SCTP);
+#endif
#ifdef IPPROTO_BIP
PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
#endif
@@ -4974,6 +6260,10 @@ PyInit__socket(void)
PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
#endif
+#ifdef SYSPROTO_CONTROL
+ PyModule_AddIntConstant(m, "SYSPROTO_CONTROL", SYSPROTO_CONTROL);
+#endif
+
/* Some port configuration */
#ifdef IPPORT_RESERVED
PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
@@ -5076,6 +6366,9 @@ PyInit__socket(void)
#ifdef IP_MAX_MEMBERSHIPS
PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
#endif
+#ifdef IP_TRANSPARENT
+ PyModule_AddIntConstant(m, "IP_TRANSPARENT", IP_TRANSPARENT);
+#endif
/* IPv6 [gs]etsockopt options, defined in RFC2553 */
#ifdef IPV6_JOIN_GROUP
@@ -5206,6 +6499,44 @@ PyInit__socket(void)
PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
#endif
+/* Reliable Datagram Sockets */
+#ifdef RDS_CMSG_RDMA_ARGS
+ PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_ARGS", RDS_CMSG_RDMA_ARGS);
+#endif
+#ifdef RDS_CMSG_RDMA_DEST
+ PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_DEST", RDS_CMSG_RDMA_DEST);
+#endif
+#ifdef RDS_CMSG_RDMA_MAP
+ PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_MAP", RDS_CMSG_RDMA_MAP);
+#endif
+#ifdef RDS_CMSG_RDMA_STATUS
+ PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_STATUS", RDS_CMSG_RDMA_STATUS);
+#endif
+#ifdef RDS_CMSG_RDMA_UPDATE
+ PyModule_AddIntConstant(m, "RDS_CMSG_RDMA_UPDATE", RDS_CMSG_RDMA_UPDATE);
+#endif
+#ifdef RDS_RDMA_READWRITE
+ PyModule_AddIntConstant(m, "RDS_RDMA_READWRITE", RDS_RDMA_READWRITE);
+#endif
+#ifdef RDS_RDMA_FENCE
+ PyModule_AddIntConstant(m, "RDS_RDMA_FENCE", RDS_RDMA_FENCE);
+#endif
+#ifdef RDS_RDMA_INVALIDATE
+ PyModule_AddIntConstant(m, "RDS_RDMA_INVALIDATE", RDS_RDMA_INVALIDATE);
+#endif
+#ifdef RDS_RDMA_USE_ONCE
+ PyModule_AddIntConstant(m, "RDS_RDMA_USE_ONCE", RDS_RDMA_USE_ONCE);
+#endif
+#ifdef RDS_RDMA_DONTWAIT
+ PyModule_AddIntConstant(m, "RDS_RDMA_DONTWAIT", RDS_RDMA_DONTWAIT);
+#endif
+#ifdef RDS_RDMA_NOTIFY_ME
+ PyModule_AddIntConstant(m, "RDS_RDMA_NOTIFY_ME", RDS_RDMA_NOTIFY_ME);
+#endif
+#ifdef RDS_RDMA_SILENT
+ PyModule_AddIntConstant(m, "RDS_RDMA_SILENT", RDS_RDMA_SILENT);
+#endif
+
/* get{addr,name}info parameters */
#ifdef EAI_ADDRFAMILY
PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
@@ -5332,7 +6663,7 @@ PyInit__socket(void)
DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
int i;
- for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
+ for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
PyObject *tmp;
tmp = PyLong_FromUnsignedLong(codes[i]);
if (tmp == NULL)
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index f064795..0435878 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -59,9 +59,12 @@ typedef int socklen_t;
#include <bluetooth.h>
#endif
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+
#ifdef HAVE_NETPACKET_PACKET_H
# include <sys/ioctl.h>
-# include <net/if.h>
# include <netpacket/packet.h>
#endif
@@ -69,6 +72,21 @@ typedef int socklen_t;
# include <linux/tipc.h>
#endif
+#ifdef HAVE_LINUX_CAN_H
+#include <linux/can.h>
+#endif
+
+#ifdef HAVE_LINUX_CAN_RAW_H
+#include <linux/can/raw.h>
+#endif
+
+#ifdef HAVE_SYS_SYS_DOMAIN_H
+#include <sys/sys_domain.h>
+#endif
+#ifdef HAVE_SYS_KERN_CONTROL_H
+#include <sys/kern_control.h>
+#endif
+
#ifndef Py__SOCKET_H
#define Py__SOCKET_H
#ifdef __cplusplus
@@ -104,6 +122,7 @@ typedef int SOCKET_T;
/* Socket address */
typedef union sock_addr {
struct sockaddr_in in;
+ struct sockaddr sa;
#ifdef AF_UNIX
struct sockaddr_un un;
#endif
@@ -123,6 +142,12 @@ typedef union sock_addr {
#ifdef HAVE_NETPACKET_PACKET_H
struct sockaddr_ll ll;
#endif
+#ifdef HAVE_LINUX_CAN_H
+ struct sockaddr_can can;
+#endif
+#ifdef HAVE_SYS_KERN_CONTROL_H
+ struct sockaddr_ctl ctl;
+#endif
} sock_addr_t;
/* The object holding a socket. It holds some extra information,
diff --git a/Modules/sre.h b/Modules/sre.h
index aec9b54..00b52aa 100644
--- a/Modules/sre.h
+++ b/Modules/sre.h
@@ -14,12 +14,8 @@
#include "sre_constants.h"
/* size of a code word (must be unsigned short or larger, and
- large enough to hold a Py_UNICODE character) */
-#ifdef Py_UNICODE_WIDE
+ large enough to hold a UCS4 character) */
#define SRE_CODE Py_UCS4
-#else
-#define SRE_CODE unsigned short
-#endif
typedef struct {
PyObject_VAR_HEAD
@@ -30,7 +26,8 @@ typedef struct {
PyObject* pattern; /* pattern source (or None) */
int flags; /* flags used when compiling pattern source */
PyObject *weakreflist; /* List of weak references */
- int charsize; /* pattern charsize (or -1) */
+ int logical_charsize; /* pattern charsize (or -1) */
+ int charsize;
Py_buffer view;
/* pattern code */
Py_ssize_t codesize;
@@ -72,6 +69,7 @@ typedef struct {
PyObject* string;
Py_ssize_t pos, endpos;
/* character size */
+ int logical_charsize; /* kind of thing: 1 - bytes, 2/4 - unicode */
int charsize;
/* registers */
Py_ssize_t lastindex;
diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c
index 5b86963..8b877cf 100644
--- a/Modules/syslogmodule.c
+++ b/Modules/syslogmodule.c
@@ -70,7 +70,7 @@ syslog_get_argv(void)
Py_ssize_t argv_len, scriptlen;
PyObject *scriptobj;
- Py_UNICODE *atslash, *atstart;
+ Py_ssize_t slash;
PyObject *argv = PySys_GetObject("argv");
if (argv == NULL) {
@@ -90,16 +90,16 @@ syslog_get_argv(void)
if (!PyUnicode_Check(scriptobj)) {
return(NULL);
}
- scriptlen = PyUnicode_GET_SIZE(scriptobj);
+ scriptlen = PyUnicode_GET_LENGTH(scriptobj);
if (scriptlen == 0) {
return(NULL);
}
- atstart = PyUnicode_AS_UNICODE(scriptobj);
- atslash = Py_UNICODE_strrchr(atstart, SEP);
- if (atslash) {
- return(PyUnicode_FromUnicode(atslash + 1,
- scriptlen - (atslash - atstart) - 1));
+ slash = PyUnicode_FindChar(scriptobj, SEP, 0, scriptlen, -1);
+ if (slash == -2)
+ return NULL;
+ if (slash != -1) {
+ return PyUnicode_Substring(scriptobj, slash, scriptlen);
} else {
Py_INCREF(scriptobj);
return(scriptobj);
@@ -291,6 +291,9 @@ PyInit_syslog(void)
PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
+#ifdef LOG_ODELAY
+ PyModule_AddIntConstant(m, "LOG_ODELAY", LOG_ODELAY);
+#endif
#ifdef LOG_NOWAIT
PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
#endif
@@ -331,5 +334,10 @@ PyInit_syslog(void)
PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);
+
+#ifdef LOG_AUTHPRIV
+ PyModule_AddIntConstant(m, "LOG_AUTHPRIV", LOG_AUTHPRIV);
+#endif
+
return m;
}
diff --git a/Modules/termios.c b/Modules/termios.c
index edeb6f5..b78d33e 100644
--- a/Modules/termios.c
+++ b/Modules/termios.c
@@ -9,11 +9,6 @@
#endif
#include <termios.h>
-#ifdef __osf__
-/* On OSF, sys/ioctl.h requires that struct termio already be defined,
- * so this needs to be included first on that platform. */
-#include <termio.h>
-#endif
#include <sys/ioctl.h>
/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
diff --git a/Modules/testcapi_long.h b/Modules/testcapi_long.h
index fa94fd6..6bddad7 100644
--- a/Modules/testcapi_long.h
+++ b/Modules/testcapi_long.h
@@ -33,8 +33,7 @@ TESTNAME(PyObject *error(const char*))
unsigned TYPENAME uin, uout;
/* For 0, 1, 2 use base; for 3, 4, 5 use -base */
- uin = j < 3 ? base
- : (unsigned TYPENAME)(-(TYPENAME)base);
+ uin = j < 3 ? base : 0U - base;
/* For 0 & 3, subtract 1.
* For 1 & 4, leave alone.
@@ -177,6 +176,32 @@ TESTNAME(PyObject *error(const char*))
Py_DECREF(one);
}
+ /* Test F_PY_TO_{S,U} on non-pylong input. This should raise a TypeError. */
+ {
+ TYPENAME out;
+ unsigned TYPENAME uout;
+
+ Py_INCREF(Py_None);
+
+ out = F_PY_TO_S(Py_None);
+ if (out != (TYPENAME)-1 || !PyErr_Occurred())
+ return error("PyLong_AsXXX(None) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return error("PyLong_AsXXX(None) raised "
+ "something other than TypeError");
+ PyErr_Clear();
+
+ uout = F_PY_TO_U(Py_None);
+ if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred())
+ return error("PyLong_AsXXX(None) didn't complain");
+ if (!PyErr_ExceptionMatches(PyExc_TypeError))
+ return error("PyLong_AsXXX(None) raised "
+ "something other than TypeError");
+ PyErr_Clear();
+
+ Py_DECREF(Py_None);
+ }
+
Py_INCREF(Py_None);
return Py_None;
}
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 626db3e..161407d 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -1,13 +1,20 @@
/* Time module */
#include "Python.h"
-#include "_time.h"
#include <ctype.h>
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
+
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
-#endif /* HAVE_SYS_TYPES_H */
+#endif
+
+#if defined(HAVE_SYS_RESOURCE_H)
+#include <sys/resource.h>
+#endif
#ifdef QUICKWIN
#include <io.h>
@@ -21,19 +28,6 @@
#include <windows.h>
#include "pythread.h"
-/* helper to allow us to interrupt sleep() on Windows*/
-static HANDLE hInterruptEvent = NULL;
-static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
-{
- SetEvent(hInterruptEvent);
- /* allow other default handlers to be called.
- Default Python handler will setup the
- KeyboardInterrupt exception.
- */
- return FALSE;
-}
-static long main_thread;
-
#if defined(__BORLANDC__)
/* These overrides not needed for Win32 */
#define timezone _timezone
@@ -43,11 +37,6 @@ static long main_thread;
#endif /* MS_WINDOWS */
#endif /* !__WATCOMC__ || __QNX__ */
-#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
-/* Win32 has better clock replacement; we have our own version below. */
-#undef HAVE_CLOCK
-#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
-
#if defined(PYOS_OS2)
#define INCL_DOS
#define INCL_ERRORS
@@ -58,23 +47,22 @@ static long main_thread;
#include <sys/time.h>
#endif
+#if defined(__APPLE__)
+#include <mach/mach_time.h>
+#endif
+
/* Forward declarations */
static int floatsleep(double);
-static double floattime(void);
+static PyObject* floattime(_Py_clock_info_t *info);
-/* For Y2K check */
-static PyObject *moddict;
+#ifdef MS_WINDOWS
+static OSVERSIONINFOEX winver;
+#endif
static PyObject *
time_time(PyObject *self, PyObject *unused)
{
- double secs;
- secs = floattime();
- if (secs == 0.0) {
- PyErr_SetFromErrno(PyExc_IOError);
- return NULL;
- }
- return PyFloat_FromDouble(secs);
+ return floattime(NULL);
}
PyDoc_STRVAR(time_doc,
@@ -83,7 +71,7 @@ PyDoc_STRVAR(time_doc,
Return the current time in seconds since the Epoch.\n\
Fractions of a second may be present if the system clock provides them.");
-#ifdef HAVE_CLOCK
+#if defined(HAVE_CLOCK)
#ifndef CLOCKS_PER_SEC
#ifdef CLK_TCK
@@ -94,42 +82,82 @@ Fractions of a second may be present if the system clock provides them.");
#endif
static PyObject *
-time_clock(PyObject *self, PyObject *unused)
+floatclock(_Py_clock_info_t *info)
{
- return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);
+ clock_t value;
+ value = clock();
+ if (value == (clock_t)-1) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "the processor time used is not available "
+ "or its value cannot be represented");
+ return NULL;
+ }
+ if (info) {
+ info->implementation = "clock()";
+ info->resolution = 1.0 / (double)CLOCKS_PER_SEC;
+ info->monotonic = 1;
+ info->adjustable = 0;
+ }
+ return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
}
#endif /* HAVE_CLOCK */
#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
-/* Due to Mark Hammond and Tim Peters */
-static PyObject *
-time_clock(PyObject *self, PyObject *unused)
+#define WIN32_PERF_COUNTER
+/* Win32 has better clock replacement; we have our own version, due to Mark
+ Hammond and Tim Peters */
+static int
+win_perf_counter(_Py_clock_info_t *info, PyObject **result)
{
- static LARGE_INTEGER ctrStart;
- static double divisor = 0.0;
+ static LONGLONG cpu_frequency = 0;
+ static LONGLONG ctrStart;
LARGE_INTEGER now;
double diff;
- if (divisor == 0.0) {
+ if (cpu_frequency == 0) {
LARGE_INTEGER freq;
- QueryPerformanceCounter(&ctrStart);
+ QueryPerformanceCounter(&now);
+ ctrStart = now.QuadPart;
if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
/* Unlikely to happen - this works on all intel
machines at least! Revert to clock() */
- return PyFloat_FromDouble(((double)clock()) /
- CLOCKS_PER_SEC);
+ *result = NULL;
+ return -1;
}
- divisor = (double)freq.QuadPart;
+ cpu_frequency = freq.QuadPart;
}
QueryPerformanceCounter(&now);
- diff = (double)(now.QuadPart - ctrStart.QuadPart);
- return PyFloat_FromDouble(diff / divisor);
+ diff = (double)(now.QuadPart - ctrStart);
+ if (info) {
+ info->implementation = "QueryPerformanceCounter()";
+ info->resolution = 1.0 / (double)cpu_frequency;
+ info->monotonic = 1;
+ info->adjustable = 0;
+ }
+ *result = PyFloat_FromDouble(diff / (double)cpu_frequency);
+ return 0;
}
+#endif
-#define HAVE_CLOCK /* So it gets included in the methods */
-#endif /* MS_WINDOWS && !defined(__BORLANDC__) */
+#if defined(WIN32_PERF_COUNTER) || defined(HAVE_CLOCK)
+#define PYCLOCK
+static PyObject*
+pyclock(_Py_clock_info_t *info)
+{
+#ifdef WIN32_PERF_COUNTER
+ PyObject *res;
+ if (win_perf_counter(info, &res) == 0)
+ return res;
+#endif
+ return floatclock(info);
+}
+
+static PyObject *
+time_clock(PyObject *self, PyObject *unused)
+{
+ return pyclock(NULL);
+}
-#ifdef HAVE_CLOCK
PyDoc_STRVAR(clock_doc,
"clock() -> floating point number\n\
\n\
@@ -138,12 +166,93 @@ the first call to clock(). This has as much precision as the system\n\
records.");
#endif
+#ifdef HAVE_CLOCK_GETTIME
+static PyObject *
+time_clock_gettime(PyObject *self, PyObject *args)
+{
+ int ret;
+ int clk_id;
+ struct timespec tp;
+
+ if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id))
+ return NULL;
+
+ ret = clock_gettime((clockid_t)clk_id, &tp);
+ if (ret != 0) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+}
+
+PyDoc_STRVAR(clock_gettime_doc,
+"clock_gettime(clk_id) -> floating point number\n\
+\n\
+Return the time of the specified clock clk_id.");
+
+static PyObject *
+time_clock_settime(PyObject *self, PyObject *args)
+{
+ int clk_id;
+ PyObject *obj;
+ struct timespec tp;
+ int ret;
+
+ if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
+ return NULL;
+
+ if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1)
+ return NULL;
+
+ ret = clock_settime((clockid_t)clk_id, &tp);
+ if (ret != 0) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(clock_settime_doc,
+"clock_settime(clk_id, time)\n\
+\n\
+Set the time of the specified clock clk_id.");
+
+static PyObject *
+time_clock_getres(PyObject *self, PyObject *args)
+{
+ int ret;
+ int clk_id;
+ struct timespec tp;
+
+ if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id))
+ return NULL;
+
+ ret = clock_getres((clockid_t)clk_id, &tp);
+ if (ret != 0) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+}
+
+PyDoc_STRVAR(clock_getres_doc,
+"clock_getres(clk_id) -> floating point number\n\
+\n\
+Return the resolution (precision) of the specified clock clk_id.");
+#endif /* HAVE_CLOCK_GETTIME */
+
static PyObject *
time_sleep(PyObject *self, PyObject *args)
{
double secs;
if (!PyArg_ParseTuple(args, "d:sleep", &secs))
return NULL;
+ if (secs < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "sleep length must be non-negative");
+ return NULL;
+ }
if (floatsleep(secs) != 0)
return NULL;
Py_INCREF(Py_None);
@@ -166,6 +275,10 @@ static PyStructSequence_Field struct_time_type_fields[] = {
{"tm_wday", "day of week, range [0, 6], Monday is 0"},
{"tm_yday", "day of year, range [1, 366]"},
{"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ {"tm_zone", "abbreviation of timezone name"},
+ {"tm_gmtoff", "offset from UTC in seconds"},
+#endif /* HAVE_STRUCT_TM_TM_ZONE */
{0}
};
@@ -185,6 +298,7 @@ static PyStructSequence_Desc struct_time_type_desc = {
static int initialized;
static PyTypeObject StructTimeType;
+
static PyObject *
tmtotuple(struct tm *p)
{
@@ -203,6 +317,11 @@ tmtotuple(struct tm *p)
SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */
SET(7, p->tm_yday + 1); /* Want January, 1 == 1 */
SET(8, p->tm_isdst);
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ PyStructSequence_SET_ITEM(v, 9,
+ PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
+ SET(10, p->tm_gmtoff);
+#endif /* HAVE_STRUCT_TM_TM_ZONE */
#undef SET
if (PyErr_Occurred()) {
Py_XDECREF(v);
@@ -212,55 +331,49 @@ tmtotuple(struct tm *p)
return v;
}
-static PyObject *
-time_convert(double when, struct tm * (*function)(const time_t *))
-{
- struct tm *p;
- time_t whent = _PyTime_DoubleToTimet(when);
-
- if (whent == (time_t)-1 && PyErr_Occurred())
- return NULL;
- errno = 0;
- p = function(&whent);
- if (p == NULL) {
-#ifdef EINVAL
- if (errno == 0)
- errno = EINVAL;
-#endif
- return PyErr_SetFromErrno(PyExc_ValueError);
- }
- return tmtotuple(p);
-}
-
/* Parse arg tuple that can contain an optional float-or-None value;
format needs to be "|O:name".
Returns non-zero on success (parallels PyArg_ParseTuple).
*/
static int
-parse_time_double_args(PyObject *args, char *format, double *pwhen)
+parse_time_t_args(PyObject *args, char *format, time_t *pwhen)
{
PyObject *ot = NULL;
+ time_t whent;
if (!PyArg_ParseTuple(args, format, &ot))
return 0;
- if (ot == NULL || ot == Py_None)
- *pwhen = floattime();
+ if (ot == NULL || ot == Py_None) {
+ whent = time(NULL);
+ }
else {
- double when = PyFloat_AsDouble(ot);
- if (PyErr_Occurred())
+ if (_PyTime_ObjectToTime_t(ot, &whent) == -1)
return 0;
- *pwhen = when;
}
+ *pwhen = whent;
return 1;
}
static PyObject *
time_gmtime(PyObject *self, PyObject *args)
{
- double when;
- if (!parse_time_double_args(args, "|O:gmtime", &when))
+ time_t when;
+ struct tm buf, *local;
+
+ if (!parse_time_t_args(args, "|O:gmtime", &when))
return NULL;
- return time_convert(when, gmtime);
+
+ errno = 0;
+ local = gmtime(&when);
+ if (local == NULL) {
+#ifdef EINVAL
+ if (errno == 0)
+ errno = EINVAL;
+#endif
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
+ buf = *local;
+ return tmtotuple(&buf);
}
PyDoc_STRVAR(gmtime_doc,
@@ -268,15 +381,42 @@ PyDoc_STRVAR(gmtime_doc,
tm_sec, tm_wday, tm_yday, tm_isdst)\n\
\n\
Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
-GMT). When 'seconds' is not passed in, convert the current time instead.");
+GMT). When 'seconds' is not passed in, convert the current time instead.\n\
+\n\
+If the platform supports the tm_gmtoff and tm_zone, they are available as\n\
+attributes only.");
+
+static int
+pylocaltime(time_t *timep, struct tm *result)
+{
+ struct tm *local;
+
+ assert (timep != NULL);
+ local = localtime(timep);
+ if (local == NULL) {
+ /* unconvertible time */
+#ifdef EINVAL
+ if (errno == 0)
+ errno = EINVAL;
+#endif
+ PyErr_SetFromErrno(PyExc_OSError);
+ return -1;
+ }
+ *result = *local;
+ return 0;
+}
static PyObject *
time_localtime(PyObject *self, PyObject *args)
{
- double when;
- if (!parse_time_double_args(args, "|O:localtime", &when))
+ time_t when;
+ struct tm buf;
+
+ if (!parse_time_t_args(args, "|O:localtime", &when))
return NULL;
- return time_convert(when, localtime);
+ if (pylocaltime(&when, &buf) == -1)
+ return NULL;
+ return tmtotuple(&buf);
}
PyDoc_STRVAR(localtime_doc,
@@ -307,53 +447,21 @@ gettmarg(PyObject *args, struct tm *p)
&p->tm_hour, &p->tm_min, &p->tm_sec,
&p->tm_wday, &p->tm_yday, &p->tm_isdst))
return 0;
-
- /* If year is specified with less than 4 digits, its interpretation
- * depends on the accept2dyear value.
- *
- * If accept2dyear is true (default), a backward compatibility behavior is
- * invoked as follows:
- *
- * - for 2-digit year, century is guessed according to POSIX rules for
- * %y strptime format: 21st century for y < 69, 20th century
- * otherwise. A deprecation warning is issued when century
- * information is guessed in this way.
- *
- * - for 3-digit or negative year, a ValueError exception is raised.
- *
- * If accept2dyear is false (set by the program or as a result of a
- * non-empty value assigned to PYTHONY2K environment variable) all year
- * values are interpreted as given.
- */
- if (y < 1000) {
- PyObject *accept = PyDict_GetItemString(moddict,
- "accept2dyear");
- if (accept != NULL) {
- int acceptval = PyObject_IsTrue(accept);
- if (acceptval == -1)
- return 0;
- if (acceptval) {
- if (0 <= y && y < 69)
- y += 2000;
- else if (69 <= y && y < 100)
- y += 1900;
- else {
- PyErr_SetString(PyExc_ValueError,
- "year out of range");
- return 0;
- }
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Century info guessed for a 2-digit year.", 1) != 0)
- return 0;
- }
- }
- else
- return 0;
- }
p->tm_year = y - 1900;
p->tm_mon--;
p->tm_wday = (p->tm_wday + 1) % 7;
p->tm_yday--;
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ if (Py_TYPE(args) == &StructTimeType) {
+ PyObject *item;
+ item = PyTuple_GET_ITEM(args, 9);
+ p->tm_zone = item == Py_None ? NULL : _PyUnicode_AsString(item);
+ item = PyTuple_GET_ITEM(args, 10);
+ p->tm_gmtoff = item == Py_None ? 0 : PyLong_AsLong(item);
+ if (PyErr_Occurred())
+ return 0;
+ }
+#endif /* HAVE_STRUCT_TM_TM_ZONE */
return 1;
}
@@ -470,7 +578,8 @@ time_strftime(PyObject *self, PyObject *args)
if (tup == NULL) {
time_t tt = time(NULL);
- buf = *localtime(&tt);
+ if (pylocaltime(&tt, &buf) == -1)
+ return NULL;
}
else if (!gettmarg(tup, &buf) || !checktm(&buf))
return NULL;
@@ -498,7 +607,7 @@ time_strftime(PyObject *self, PyObject *args)
fmt = format;
#else
/* Convert the unicode string to an ascii one */
- format = PyUnicode_EncodeFSDefault(format_arg);
+ format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
if (format == NULL)
return NULL;
fmt = PyBytes_AS_STRING(format);
@@ -549,7 +658,8 @@ time_strftime(PyObject *self, PyObject *args)
#ifdef HAVE_WCSFTIME
ret = PyUnicode_FromWideChar(outbuf, buflen);
#else
- ret = PyUnicode_DecodeFSDefaultAndSize(outbuf, buflen);
+ ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
+ "surrogateescape");
#endif
PyMem_Free(outbuf);
break;
@@ -587,11 +697,12 @@ time_strptime(PyObject *self, PyObject *args)
{
PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");
PyObject *strptime_result;
+ _Py_IDENTIFIER(_strptime_time);
if (!strptime_module)
return NULL;
- strptime_result = PyObject_CallMethod(strptime_module,
- "_strptime_time", "O", args);
+ strptime_result = _PyObject_CallMethodId(strptime_module,
+ &PyId__strptime_time, "O", args);
Py_DECREF(strptime_module);
return strptime_result;
}
@@ -608,31 +719,20 @@ _asctime(struct tm *timeptr)
{
/* Inspired by Open Group reference implementation available at
* http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
- static char wday_name[7][3] = {
+ static char wday_name[7][4] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
- static char mon_name[12][3] = {
+ static char mon_name[12][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
- char buf[20]; /* 'Sun Sep 16 01:03:52\0' */
- int n;
-
- n = PyOS_snprintf(buf, sizeof(buf), "%.3s %.3s%3d %.2d:%.2d:%.2d",
- wday_name[timeptr->tm_wday],
- mon_name[timeptr->tm_mon],
- timeptr->tm_mday, timeptr->tm_hour,
- timeptr->tm_min, timeptr->tm_sec);
- /* XXX: since the fields used by snprintf above are validated in checktm,
- * the following condition should never trigger. We keep the check because
- * historically fixed size buffer used in asctime was the source of
- * crashes. */
- if (n + 1 != sizeof(buf)) {
- PyErr_SetString(PyExc_ValueError, "unconvertible time");
- return NULL;
- }
-
- return PyUnicode_FromFormat("%s %d", buf, 1900 + timeptr->tm_year);
+ return PyUnicode_FromFormat(
+ "%s %s%3d %.2d:%.2d:%.2d %d",
+ wday_name[timeptr->tm_wday],
+ mon_name[timeptr->tm_mon],
+ timeptr->tm_mday, timeptr->tm_hour,
+ timeptr->tm_min, timeptr->tm_sec,
+ 1900 + timeptr->tm_year);
}
static PyObject *
@@ -645,7 +745,9 @@ time_asctime(PyObject *self, PyObject *args)
return NULL;
if (tup == NULL) {
time_t tt = time(NULL);
- buf = *localtime(&tt);
+ if (pylocaltime(&tt, &buf) == -1)
+ return NULL;
+
} else if (!gettmarg(tup, &buf) || !checktm(&buf))
return NULL;
return _asctime(&buf);
@@ -661,28 +763,13 @@ is used.");
static PyObject *
time_ctime(PyObject *self, PyObject *args)
{
- PyObject *ot = NULL;
time_t tt;
- struct tm *timeptr;
-
- if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))
+ struct tm buf;
+ if (!parse_time_t_args(args, "|O:ctime", &tt))
return NULL;
- if (ot == NULL || ot == Py_None)
- tt = time(NULL);
- else {
- double dt = PyFloat_AsDouble(ot);
- if (PyErr_Occurred())
- return NULL;
- tt = _PyTime_DoubleToTimet(dt);
- if (tt == (time_t)-1 && PyErr_Occurred())
- return NULL;
- }
- timeptr = localtime(&tt);
- if (timeptr == NULL) {
- PyErr_SetString(PyExc_ValueError, "unconvertible time");
+ if (pylocaltime(&tt, &buf) == -1)
return NULL;
- }
- return _asctime(timeptr);
+ return _asctime(&buf);
}
PyDoc_STRVAR(ctime_doc,
@@ -715,7 +802,10 @@ time_mktime(PyObject *self, PyObject *tup)
PyDoc_STRVAR(mktime_doc,
"mktime(tuple) -> floating point number\n\
\n\
-Convert a time tuple in local time to seconds since the Epoch.");
+Convert a time tuple in local time to seconds since the Epoch.\n\
+Note that mktime(gmtime(0)) will not generally return zero for most\n\
+time zones; instead the returned value will either be equal to that\n\
+of the timezone or altzone attributes on the time module.");
#endif /* HAVE_MKTIME */
#ifdef HAVE_WORKING_TZSET
@@ -755,6 +845,402 @@ the local timezone used by methods such as localtime, but this behaviour\n\
should not be relied on.");
#endif /* HAVE_WORKING_TZSET */
+#if defined(MS_WINDOWS) || defined(__APPLE__) \
+ || (defined(HAVE_CLOCK_GETTIME) \
+ && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC)))
+#define PYMONOTONIC
+#endif
+
+#ifdef PYMONOTONIC
+static PyObject*
+pymonotonic(_Py_clock_info_t *info)
+{
+#if defined(MS_WINDOWS)
+ static ULONGLONG (*GetTickCount64) (void) = NULL;
+ static ULONGLONG (CALLBACK *Py_GetTickCount64)(void);
+ static int has_getickcount64 = -1;
+ double result;
+
+ if (has_getickcount64 == -1) {
+ /* GetTickCount64() was added to Windows Vista */
+ if (winver.dwMajorVersion >= 6) {
+ HINSTANCE hKernel32;
+ hKernel32 = GetModuleHandleW(L"KERNEL32");
+ *(FARPROC*)&Py_GetTickCount64 = GetProcAddress(hKernel32,
+ "GetTickCount64");
+ has_getickcount64 = (Py_GetTickCount64 != NULL);
+ }
+ else
+ has_getickcount64 = 0;
+ }
+
+ if (has_getickcount64) {
+ ULONGLONG ticks;
+ ticks = Py_GetTickCount64();
+ result = (double)ticks * 1e-3;
+ }
+ else {
+ static DWORD last_ticks = 0;
+ static DWORD n_overflow = 0;
+ DWORD ticks;
+
+ ticks = GetTickCount();
+ if (ticks < last_ticks)
+ n_overflow++;
+ last_ticks = ticks;
+
+ result = ldexp(n_overflow, 32);
+ result += ticks;
+ result *= 1e-3;
+ }
+
+ if (info) {
+ DWORD timeAdjustment, timeIncrement;
+ BOOL isTimeAdjustmentDisabled, ok;
+ if (has_getickcount64)
+ info->implementation = "GetTickCount64()";
+ else
+ info->implementation = "GetTickCount()";
+ info->monotonic = 1;
+ ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
+ &isTimeAdjustmentDisabled);
+ if (!ok) {
+ PyErr_SetFromWindowsErr(0);
+ return NULL;
+ }
+ info->resolution = timeIncrement * 1e-7;
+ info->adjustable = 0;
+ }
+ return PyFloat_FromDouble(result);
+
+#elif defined(__APPLE__)
+ static mach_timebase_info_data_t timebase;
+ uint64_t time;
+ double secs;
+
+ if (timebase.denom == 0) {
+ /* According to the Technical Q&A QA1398, mach_timebase_info() cannot
+ fail: https://developer.apple.com/library/mac/#qa/qa1398/ */
+ (void)mach_timebase_info(&timebase);
+ }
+
+ time = mach_absolute_time();
+ secs = (double)time * timebase.numer / timebase.denom * 1e-9;
+ if (info) {
+ info->implementation = "mach_absolute_time()";
+ info->resolution = (double)timebase.numer / timebase.denom * 1e-9;
+ info->monotonic = 1;
+ info->adjustable = 0;
+ }
+ return PyFloat_FromDouble(secs);
+
+#elif defined(HAVE_CLOCK_GETTIME) && (defined(CLOCK_HIGHRES) || defined(CLOCK_MONOTONIC))
+ struct timespec tp;
+#ifdef CLOCK_HIGHRES
+ const clockid_t clk_id = CLOCK_HIGHRES;
+ const char *function = "clock_gettime(CLOCK_HIGHRES)";
+#else
+ const clockid_t clk_id = CLOCK_MONOTONIC;
+ const char *function = "clock_gettime(CLOCK_MONOTONIC)";
+#endif
+
+ if (clock_gettime(clk_id, &tp) != 0) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ if (info) {
+ struct timespec res;
+ info->monotonic = 1;
+ info->implementation = function;
+ info->adjustable = 0;
+ if (clock_getres(clk_id, &res) == 0)
+ info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
+ else
+ info->resolution = 1e-9;
+ }
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+#endif
+}
+
+static PyObject *
+time_monotonic(PyObject *self, PyObject *unused)
+{
+ return pymonotonic(NULL);
+}
+
+PyDoc_STRVAR(monotonic_doc,
+"monotonic() -> float\n\
+\n\
+Monotonic clock, cannot go backward.");
+#endif /* PYMONOTONIC */
+
+static PyObject*
+perf_counter(_Py_clock_info_t *info)
+{
+#if defined(WIN32_PERF_COUNTER) || defined(PYMONOTONIC)
+ PyObject *res;
+#endif
+#if defined(WIN32_PERF_COUNTER)
+ static int use_perf_counter = 1;
+#endif
+#ifdef PYMONOTONIC
+ static int use_monotonic = 1;
+#endif
+
+#ifdef WIN32_PERF_COUNTER
+ if (use_perf_counter) {
+ if (win_perf_counter(info, &res) == 0)
+ return res;
+ use_perf_counter = 0;
+ }
+#endif
+
+#ifdef PYMONOTONIC
+ if (use_monotonic) {
+ res = pymonotonic(info);
+ if (res != NULL)
+ return res;
+ use_monotonic = 0;
+ PyErr_Clear();
+ }
+#endif
+
+ return floattime(info);
+}
+
+static PyObject *
+time_perf_counter(PyObject *self, PyObject *unused)
+{
+ return perf_counter(NULL);
+}
+
+PyDoc_STRVAR(perf_counter_doc,
+"perf_counter() -> float\n\
+\n\
+Performance counter for benchmarking.");
+
+static PyObject*
+py_process_time(_Py_clock_info_t *info)
+{
+#if defined(MS_WINDOWS)
+ HANDLE process;
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+ ULARGE_INTEGER large;
+ double total;
+ BOOL ok;
+
+ process = GetCurrentProcess();
+ ok = GetProcessTimes(process, &creation_time, &exit_time, &kernel_time, &user_time);
+ if (!ok)
+ return PyErr_SetFromWindowsErr(0);
+
+ large.u.LowPart = kernel_time.dwLowDateTime;
+ large.u.HighPart = kernel_time.dwHighDateTime;
+ total = (double)large.QuadPart;
+ large.u.LowPart = user_time.dwLowDateTime;
+ large.u.HighPart = user_time.dwHighDateTime;
+ total += (double)large.QuadPart;
+ if (info) {
+ info->implementation = "GetProcessTimes()";
+ info->resolution = 1e-7;
+ info->monotonic = 1;
+ info->adjustable = 0;
+ }
+ return PyFloat_FromDouble(total * 1e-7);
+#else
+
+#if defined(HAVE_SYS_RESOURCE_H)
+ struct rusage ru;
+#endif
+#ifdef HAVE_TIMES
+ struct tms t;
+ static long ticks_per_second = -1;
+#endif
+
+#if defined(HAVE_CLOCK_GETTIME) \
+ && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
+ struct timespec tp;
+#ifdef CLOCK_PROF
+ const clockid_t clk_id = CLOCK_PROF;
+ const char *function = "clock_gettime(CLOCK_PROF)";
+#else
+ const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID;
+ const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)";
+#endif
+
+ if (clock_gettime(clk_id, &tp) == 0) {
+ if (info) {
+ struct timespec res;
+ info->implementation = function;
+ info->monotonic = 1;
+ info->adjustable = 0;
+ if (clock_getres(clk_id, &res) == 0)
+ info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
+ else
+ info->resolution = 1e-9;
+ }
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+ }
+#endif
+
+#if defined(HAVE_SYS_RESOURCE_H)
+ if (getrusage(RUSAGE_SELF, &ru) == 0) {
+ double total;
+ total = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec * 1e-6;
+ total += ru.ru_stime.tv_sec + ru.ru_stime.tv_usec * 1e-6;
+ if (info) {
+ info->implementation = "getrusage(RUSAGE_SELF)";
+ info->monotonic = 1;
+ info->adjustable = 0;
+ info->resolution = 1e-6;
+ }
+ return PyFloat_FromDouble(total);
+ }
+#endif
+
+#ifdef HAVE_TIMES
+ if (times(&t) != (clock_t)-1) {
+ double total;
+
+ if (ticks_per_second == -1) {
+#if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
+ ticks_per_second = sysconf(_SC_CLK_TCK);
+ if (ticks_per_second < 1)
+ ticks_per_second = -1;
+#elif defined(HZ)
+ ticks_per_second = HZ;
+#else
+ ticks_per_second = 60; /* magic fallback value; may be bogus */
+#endif
+ }
+
+ if (ticks_per_second != -1) {
+ total = (double)t.tms_utime / ticks_per_second;
+ total += (double)t.tms_stime / ticks_per_second;
+ if (info) {
+ info->implementation = "times()";
+ info->monotonic = 1;
+ info->adjustable = 0;
+ info->resolution = 1.0 / ticks_per_second;
+ }
+ return PyFloat_FromDouble(total);
+ }
+ }
+#endif
+
+ return floatclock(info);
+#endif
+}
+
+static PyObject *
+time_process_time(PyObject *self, PyObject *unused)
+{
+ return py_process_time(NULL);
+}
+
+PyDoc_STRVAR(process_time_doc,
+"process_time() -> float\n\
+\n\
+Process time for profiling: sum of the kernel and user-space CPU time.");
+
+
+static PyObject *
+time_get_clock_info(PyObject *self, PyObject *args)
+{
+ char *name;
+ _Py_clock_info_t info;
+ PyObject *obj = NULL, *dict, *ns;
+
+ if (!PyArg_ParseTuple(args, "s:get_clock_info", &name))
+ return NULL;
+
+#ifdef Py_DEBUG
+ info.implementation = NULL;
+ info.monotonic = -1;
+ info.adjustable = -1;
+ info.resolution = -1.0;
+#else
+ info.implementation = "";
+ info.monotonic = 0;
+ info.adjustable = 0;
+ info.resolution = 1.0;
+#endif
+
+ if (strcmp(name, "time") == 0)
+ obj = floattime(&info);
+#ifdef PYCLOCK
+ else if (strcmp(name, "clock") == 0)
+ obj = pyclock(&info);
+#endif
+#ifdef PYMONOTONIC
+ else if (strcmp(name, "monotonic") == 0)
+ obj = pymonotonic(&info);
+#endif
+ else if (strcmp(name, "perf_counter") == 0)
+ obj = perf_counter(&info);
+ else if (strcmp(name, "process_time") == 0)
+ obj = py_process_time(&info);
+ else {
+ PyErr_SetString(PyExc_ValueError, "unknown clock");
+ return NULL;
+ }
+ if (obj == NULL)
+ return NULL;
+ Py_DECREF(obj);
+
+ dict = PyDict_New();
+ if (dict == NULL)
+ return NULL;
+
+ assert(info.implementation != NULL);
+ obj = PyUnicode_FromString(info.implementation);
+ if (obj == NULL)
+ goto error;
+ if (PyDict_SetItemString(dict, "implementation", obj) == -1)
+ goto error;
+ Py_CLEAR(obj);
+
+ assert(info.monotonic != -1);
+ obj = PyBool_FromLong(info.monotonic);
+ if (obj == NULL)
+ goto error;
+ if (PyDict_SetItemString(dict, "monotonic", obj) == -1)
+ goto error;
+ Py_CLEAR(obj);
+
+ assert(info.adjustable != -1);
+ obj = PyBool_FromLong(info.adjustable);
+ if (obj == NULL)
+ goto error;
+ if (PyDict_SetItemString(dict, "adjustable", obj) == -1)
+ goto error;
+ Py_CLEAR(obj);
+
+ assert(info.resolution > 0.0);
+ assert(info.resolution <= 1.0);
+ obj = PyFloat_FromDouble(info.resolution);
+ if (obj == NULL)
+ goto error;
+ if (PyDict_SetItemString(dict, "resolution", obj) == -1)
+ goto error;
+ Py_CLEAR(obj);
+
+ ns = _PyNamespace_New(dict);
+ Py_DECREF(dict);
+ return ns;
+
+error:
+ Py_DECREF(dict);
+ Py_XDECREF(obj);
+ return NULL;
+}
+
+PyDoc_STRVAR(get_clock_info_doc,
+"get_clock_info(name: str) -> dict\n\
+\n\
+Get information of the specified clock.");
+
static void
PyInit_timezone(PyObject *m) {
/* This code moved from PyInit_time wholesale to allow calling it from
@@ -791,8 +1277,8 @@ PyInit_timezone(PyObject *m) {
#endif /* PYOS_OS2 */
#endif
PyModule_AddIntConstant(m, "daylight", daylight);
- otz0 = PyUnicode_DecodeFSDefaultAndSize(tzname[0], strlen(tzname[0]));
- otz1 = PyUnicode_DecodeFSDefaultAndSize(tzname[1], strlen(tzname[1]));
+ otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
+ otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
#ifdef HAVE_STRUCT_TM_TM_ZONE
@@ -843,14 +1329,38 @@ PyInit_timezone(PyObject *m) {
Py_BuildValue("(zz)", _tzname[0], _tzname[1]));
#endif /* __CYGWIN__ */
#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
+
+#if defined(HAVE_CLOCK_GETTIME)
+ PyModule_AddIntMacro(m, CLOCK_REALTIME);
+#ifdef CLOCK_MONOTONIC
+ PyModule_AddIntMacro(m, CLOCK_MONOTONIC);
+#endif
+#ifdef CLOCK_MONOTONIC_RAW
+ PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
+#endif
+#ifdef CLOCK_HIGHRES
+ PyModule_AddIntMacro(m, CLOCK_HIGHRES);
+#endif
+#ifdef CLOCK_PROCESS_CPUTIME_ID
+ PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
+#endif
+#ifdef CLOCK_THREAD_CPUTIME_ID
+ PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID);
+#endif
+#endif /* HAVE_CLOCK_GETTIME */
}
static PyMethodDef time_methods[] = {
{"time", time_time, METH_NOARGS, time_doc},
-#ifdef HAVE_CLOCK
+#ifdef PYCLOCK
{"clock", time_clock, METH_NOARGS, clock_doc},
#endif
+#ifdef HAVE_CLOCK_GETTIME
+ {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc},
+ {"clock_settime", time_clock_settime, METH_VARARGS, clock_settime_doc},
+ {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc},
+#endif
{"sleep", time_sleep, METH_VARARGS, sleep_doc},
{"gmtime", time_gmtime, METH_VARARGS, gmtime_doc},
{"localtime", time_localtime, METH_VARARGS, localtime_doc},
@@ -866,6 +1376,12 @@ static PyMethodDef time_methods[] = {
#ifdef HAVE_WORKING_TZSET
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
#endif
+#ifdef PYMONOTONIC
+ {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc},
+#endif
+ {"process_time", time_process_time, METH_NOARGS, process_time_doc},
+ {"perf_counter", time_perf_counter, METH_NOARGS, perf_counter_doc},
+ {"get_clock_info", time_get_clock_info, METH_VARARGS, get_clock_info_doc},
{NULL, NULL} /* sentinel */
};
@@ -881,7 +1397,7 @@ The actual value can be retrieved by calling gmtime(0).\n\
\n\
The other representation is a tuple of 9 integers giving local time.\n\
The tuple items are:\n\
- year (four digits, e.g. 1998)\n\
+ year (including century, e.g. 1998)\n\
month (1-12)\n\
day (1-31)\n\
hours (0-23)\n\
@@ -933,46 +1449,65 @@ PyMODINIT_FUNC
PyInit_time(void)
{
PyObject *m;
- char *p;
m = PyModule_Create(&timemodule);
if (m == NULL)
return NULL;
- /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
- p = Py_GETENV("PYTHONY2K");
- PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
- /* Squirrel away the module's dictionary for the y2k check */
- moddict = PyModule_GetDict(m);
- Py_INCREF(moddict);
-
/* Set, or reset, module variables like time.timezone */
PyInit_timezone(m);
-#ifdef MS_WINDOWS
- /* Helper to allow interrupts for Windows.
- If Ctrl+C event delivered while not sleeping
- it will be ignored.
- */
- main_thread = PyThread_get_thread_ident();
- hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
-#endif /* MS_WINDOWS */
if (!initialized) {
PyStructSequence_InitType(&StructTimeType,
&struct_time_type_desc);
+
+#ifdef MS_WINDOWS
+ winver.dwOSVersionInfoSize = sizeof(winver);
+ if (!GetVersionEx((OSVERSIONINFO*)&winver)) {
+ Py_DECREF(m);
+ PyErr_SetFromWindowsErr(0);
+ return NULL;
+ }
+#endif
}
Py_INCREF(&StructTimeType);
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11);
+#else
+ PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 9);
+#endif
PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);
initialized = 1;
return m;
}
-static double
-floattime(void)
+static PyObject*
+floattime(_Py_clock_info_t *info)
{
_PyTime_timeval t;
- _PyTime_gettimeofday(&t);
- return (double)t.tv_sec + t.tv_usec*0.000001;
+#ifdef HAVE_CLOCK_GETTIME
+ struct timespec tp;
+ int ret;
+
+ /* _PyTime_gettimeofday() does not use clock_gettime()
+ because it would require to link Python to the rt (real-time)
+ library, at least on Linux */
+ ret = clock_gettime(CLOCK_REALTIME, &tp);
+ if (ret == 0) {
+ if (info) {
+ struct timespec res;
+ info->implementation = "clock_gettime(CLOCK_REALTIME)";
+ info->monotonic = 0;
+ info->adjustable = 1;
+ if (clock_getres(CLOCK_REALTIME, &res) == 0)
+ info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
+ else
+ info->resolution = 1e-9;
+ }
+ return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
+ }
+#endif
+ _PyTime_gettimeofday_info(&t, info);
+ return PyFloat_FromDouble((double)t.tv_sec + t.tv_usec * 1e-6);
}
@@ -987,23 +1522,28 @@ floatsleep(double secs)
#if defined(HAVE_SELECT) && !defined(__EMX__)
struct timeval t;
double frac;
+ int err;
+
frac = fmod(secs, 1.0);
secs = floor(secs);
t.tv_sec = (long)secs;
t.tv_usec = (long)(frac*1000000.0);
Py_BEGIN_ALLOW_THREADS
- if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
+ err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
+ Py_END_ALLOW_THREADS
+ if (err != 0) {
#ifdef EINTR
- if (errno != EINTR) {
-#else
- if (1) {
+ if (errno == EINTR) {
+ if (PyErr_CheckSignals())
+ return -1;
+ }
+ else
#endif
- Py_BLOCK_THREADS
+ {
PyErr_SetFromErrno(PyExc_IOError);
return -1;
}
}
- Py_END_ALLOW_THREADS
#elif defined(__WATCOMC__) && !defined(__QNX__)
/* XXX Can't interrupt this sleep */
Py_BEGIN_ALLOW_THREADS
@@ -1024,18 +1564,14 @@ floatsleep(double secs)
* by Guido, only the main thread can be interrupted.
*/
ul_millis = (unsigned long)millisecs;
- if (ul_millis == 0 ||
- main_thread != PyThread_get_thread_ident())
+ if (ul_millis == 0 || !_PyOS_IsMainThread())
Sleep(ul_millis);
else {
DWORD rc;
+ HANDLE hInterruptEvent = _PyOS_SigintEvent();
ResetEvent(hInterruptEvent);
rc = WaitForSingleObject(hInterruptEvent, ul_millis);
if (rc == WAIT_OBJECT_0) {
- /* Yield to make sure real Python signal
- * handler called.
- */
- Sleep(1);
Py_BLOCK_THREADS
errno = EINTR;
PyErr_SetFromErrno(PyExc_IOError);
diff --git a/Modules/tkappinit.c b/Modules/tkappinit.c
index c1f97b0..2ed8594 100644
--- a/Modules/tkappinit.c
+++ b/Modules/tkappinit.c
@@ -26,7 +26,9 @@ static int tk_load_failed;
int
Tcl_AppInit(Tcl_Interp *interp)
{
+#ifdef WITH_MOREBUTTONS
Tk_Window main_window;
+#endif
const char *_tkinter_skip_tk_init;
#ifdef TKINTER_PROTECT_LOADTK
const char *_tkinter_tk_failed;
@@ -111,7 +113,11 @@ Tcl_AppInit(Tcl_Interp *interp)
return TCL_ERROR;
}
+#ifdef WITH_MOREBUTTONS
main_window = Tk_MainWindow(interp);
+#else
+ Tk_MainWindow(interp);
+#endif
#ifdef TK_AQUA
TkMacOSXInitAppleEvents(interp);
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 53e48df..d339f58 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -93,16 +93,13 @@ new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4)
static Py_UCS4 getuchar(PyUnicodeObject *obj)
{
- Py_UNICODE *v = PyUnicode_AS_UNICODE(obj);
-
- if (PyUnicode_GET_SIZE(obj) == 1)
- return *v;
-#ifndef Py_UNICODE_WIDE
- else if ((PyUnicode_GET_SIZE(obj) == 2) &&
- (0xD800 <= v[0] && v[0] <= 0xDBFF) &&
- (0xDC00 <= v[1] && v[1] <= 0xDFFF))
- return (((v[0] & 0x3FF)<<10) | (v[1] & 0x3FF)) + 0x10000;
-#endif
+ if (PyUnicode_READY(obj))
+ return (Py_UCS4)-1;
+ if (PyUnicode_GET_LENGTH(obj) == 1) {
+ if (PyUnicode_READY(obj))
+ return (Py_UCS4)-1;
+ return PyUnicode_READ_CHAR(obj, 0);
+ }
PyErr_SetString(PyExc_TypeError,
"need a single Unicode character as parameter");
return (Py_UCS4)-1;
@@ -443,7 +440,7 @@ unicodedata_decomposition(PyObject *self, PyObject *args)
from Tools/unicode/makeunicodedata.py, it should not be possible
to overflow decomp_prefix. */
prefix_index = decomp_data[index] & 255;
- assert(prefix_index < (sizeof(decomp_prefix)/sizeof(*decomp_prefix)));
+ assert(prefix_index < Py_ARRAY_LENGTH(decomp_prefix));
/* copy prefix */
i = strlen(decomp_prefix[prefix_index]);
@@ -498,36 +495,47 @@ static PyObject*
nfd_nfkd(PyObject *self, PyObject *input, int k)
{
PyObject *result;
- Py_UNICODE *i, *end, *o;
+ Py_UCS4 *output;
+ Py_ssize_t i, o, osize;
+ int kind;
+ void *data;
/* Longest decomposition in Unicode 3.2: U+FDFA */
- Py_UNICODE stack[20];
+ Py_UCS4 stack[20];
Py_ssize_t space, isize;
int index, prefix, count, stackptr;
unsigned char prev, cur;
stackptr = 0;
- isize = PyUnicode_GET_SIZE(input);
+ isize = PyUnicode_GET_LENGTH(input);
/* Overallocate atmost 10 characters. */
space = (isize > 10 ? 10 : isize) + isize;
- result = PyUnicode_FromUnicode(NULL, space);
- if (!result)
+ osize = space;
+ output = PyMem_Malloc(space * sizeof(Py_UCS4));
+ if (!output) {
+ PyErr_NoMemory();
return NULL;
- i = PyUnicode_AS_UNICODE(input);
- end = i + isize;
- o = PyUnicode_AS_UNICODE(result);
+ }
+ i = o = 0;
+ kind = PyUnicode_KIND(input);
+ data = PyUnicode_DATA(input);
- while (i < end) {
- stack[stackptr++] = *i++;
+ while (i < isize) {
+ stack[stackptr++] = PyUnicode_READ(kind, data, i++);
while(stackptr) {
- Py_UNICODE code = stack[--stackptr];
+ Py_UCS4 code = stack[--stackptr];
/* Hangul Decomposition adds three characters in
a single step, so we need atleast that much room. */
if (space < 3) {
- Py_ssize_t newsize = PyUnicode_GET_SIZE(result) + 10;
+ Py_UCS4 *new_output;
+ osize += 10;
space += 10;
- if (PyUnicode_Resize(&result, newsize) == -1)
+ new_output = PyMem_Realloc(output, osize*sizeof(Py_UCS4));
+ if (new_output == NULL) {
+ PyMem_Free(output);
+ PyErr_NoMemory();
return NULL;
- o = PyUnicode_AS_UNICODE(result) + newsize - space;
+ }
+ output = new_output;
}
/* Hangul Decomposition. */
if (SBase <= code && code < (SBase+SCount)) {
@@ -535,11 +543,11 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
int L = LBase + SIndex / NCount;
int V = VBase + (SIndex % NCount) / TCount;
int T = TBase + SIndex % TCount;
- *o++ = L;
- *o++ = V;
+ output[o++] = L;
+ output[o++] = V;
space -= 2;
if (T != TBase) {
- *o++ = T;
+ output[o++] = T;
space --;
}
continue;
@@ -559,7 +567,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
/* Copy character if it is not decomposable, or has a
compatibility decomposition, but we do NFD. */
if (!count || (prefix && !k)) {
- *o++ = code;
+ output[o++] = code;
space--;
continue;
}
@@ -572,15 +580,20 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
}
}
- /* Drop overallocation. Cannot fail. */
- PyUnicode_Resize(&result, PyUnicode_GET_SIZE(result) - space);
+ result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ output, o);
+ PyMem_Free(output);
+ if (!result)
+ return NULL;
+ /* result is guaranteed to be ready, as it is compact. */
+ kind = PyUnicode_KIND(result);
+ data = PyUnicode_DATA(result);
/* Sort canonically. */
- i = PyUnicode_AS_UNICODE(result);
- prev = _getrecord_ex(*i)->combining;
- end = i + PyUnicode_GET_SIZE(result);
- for (i++; i < end; i++) {
- cur = _getrecord_ex(*i)->combining;
+ i = 0;
+ prev = _getrecord_ex(PyUnicode_READ(kind, data, i))->combining;
+ for (i++; i < PyUnicode_GET_LENGTH(result); i++) {
+ cur = _getrecord_ex(PyUnicode_READ(kind, data, i))->combining;
if (prev == 0 || cur == 0 || prev <= cur) {
prev = cur;
continue;
@@ -588,31 +601,32 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
/* Non-canonical order. Need to switch *i with previous. */
o = i - 1;
while (1) {
- Py_UNICODE tmp = o[1];
- o[1] = o[0];
- o[0] = tmp;
+ Py_UCS4 tmp = PyUnicode_READ(kind, data, o+1);
+ PyUnicode_WRITE(kind, data, o+1,
+ PyUnicode_READ(kind, data, o));
+ PyUnicode_WRITE(kind, data, o, tmp);
o--;
- if (o < PyUnicode_AS_UNICODE(result))
+ if (o < 0)
break;
- prev = _getrecord_ex(*o)->combining;
+ prev = _getrecord_ex(PyUnicode_READ(kind, data, o))->combining;
if (prev == 0 || prev <= cur)
break;
}
- prev = _getrecord_ex(*i)->combining;
+ prev = _getrecord_ex(PyUnicode_READ(kind, data, i))->combining;
}
return result;
}
static int
-find_nfc_index(PyObject *self, struct reindex* nfc, Py_UNICODE code)
+find_nfc_index(PyObject *self, struct reindex* nfc, Py_UCS4 code)
{
- int index;
+ unsigned int index;
for (index = 0; nfc[index].start; index++) {
- int start = nfc[index].start;
+ unsigned int start = nfc[index].start;
if (code < start)
return -1;
if (code <= start + nfc[index].count) {
- int delta = code - start;
+ unsigned int delta = code - start;
return nfc[index].index + delta;
}
}
@@ -623,27 +637,36 @@ static PyObject*
nfc_nfkc(PyObject *self, PyObject *input, int k)
{
PyObject *result;
- Py_UNICODE *i, *i1, *o, *end;
+ int kind;
+ void *data;
+ Py_UCS4 *output;
+ Py_ssize_t i, i1, o, len;
int f,l,index,index1,comb;
- Py_UNICODE code;
- Py_UNICODE *skipped[20];
+ Py_UCS4 code;
+ Py_ssize_t skipped[20];
int cskipped = 0;
result = nfd_nfkd(self, input, k);
if (!result)
return NULL;
-
- /* We are going to modify result in-place.
- If nfd_nfkd is changed to sometimes return the input,
- this code needs to be reviewed. */
- assert(result != input);
-
- i = PyUnicode_AS_UNICODE(result);
- end = i + PyUnicode_GET_SIZE(result);
- o = PyUnicode_AS_UNICODE(result);
+ /* result will be "ready". */
+ kind = PyUnicode_KIND(result);
+ data = PyUnicode_DATA(result);
+ len = PyUnicode_GET_LENGTH(result);
+
+ /* We allocate a buffer for the output.
+ If we find that we made no changes, we still return
+ the NFD result. */
+ output = PyMem_Malloc(len * sizeof(Py_UCS4));
+ if (!output) {
+ PyErr_NoMemory();
+ Py_DECREF(result);
+ return 0;
+ }
+ i = o = 0;
again:
- while (i < end) {
+ while (i < len) {
for (index = 0; index < cskipped; index++) {
if (skipped[index] == i) {
/* *i character is skipped.
@@ -656,33 +679,41 @@ nfc_nfkc(PyObject *self, PyObject *input, int k)
}
/* Hangul Composition. We don't need to check for <LV,T>
pairs, since we always have decomposed data. */
- if (LBase <= *i && *i < (LBase+LCount) &&
- i + 1 < end &&
- VBase <= i[1] && i[1] <= (VBase+VCount)) {
+ code = PyUnicode_READ(kind, data, i);
+ if (LBase <= code && code < (LBase+LCount) &&
+ i + 1 < len &&
+ VBase <= PyUnicode_READ(kind, data, i+1) &&
+ PyUnicode_READ(kind, data, i+1) <= (VBase+VCount)) {
int LIndex, VIndex;
- LIndex = i[0] - LBase;
- VIndex = i[1] - VBase;
+ LIndex = code - LBase;
+ VIndex = PyUnicode_READ(kind, data, i+1) - VBase;
code = SBase + (LIndex*VCount+VIndex)*TCount;
i+=2;
- if (i < end &&
- TBase <= *i && *i <= (TBase+TCount)) {
- code += *i-TBase;
+ if (i < len &&
+ TBase <= PyUnicode_READ(kind, data, i) &&
+ PyUnicode_READ(kind, data, i) <= (TBase+TCount)) {
+ code += PyUnicode_READ(kind, data, i)-TBase;
i++;
}
- *o++ = code;
+ output[o++] = code;
continue;
}
- f = find_nfc_index(self, nfc_first, *i);
+ /* code is still input[i] here */
+ f = find_nfc_index(self, nfc_first, code);
if (f == -1) {
- *o++ = *i++;
+ output[o++] = code;
+ i++;
continue;
}
/* Find next unblocked character. */
i1 = i+1;
comb = 0;
- while (i1 < end) {
- int comb1 = _getrecord_ex(*i1)->combining;
+ /* output base character for now; might be updated later. */
+ output[o] = PyUnicode_READ(kind, data, i);
+ while (i1 < len) {
+ Py_UCS4 code1 = PyUnicode_READ(kind, data, i1);
+ int comb1 = _getrecord_ex(code1)->combining;
if (comb) {
if (comb1 == 0)
break;
@@ -692,8 +723,8 @@ nfc_nfkc(PyObject *self, PyObject *input, int k)
continue;
}
}
- l = find_nfc_index(self, nfc_last, *i1);
- /* *i1 cannot be combined with *i. If *i1
+ l = find_nfc_index(self, nfc_last, code1);
+ /* i1 cannot be combined with i. If i1
is a starter, we don't need to look further.
Otherwise, record the combining class. */
if (l == -1) {
@@ -712,19 +743,28 @@ nfc_nfkc(PyObject *self, PyObject *input, int k)
goto not_combinable;
/* Replace the original character. */
- *i = code;
+ output[o] = code;
/* Mark the second character unused. */
assert(cskipped < 20);
skipped[cskipped++] = i1;
i1++;
- f = find_nfc_index(self, nfc_first, *i);
+ f = find_nfc_index(self, nfc_first, output[o]);
if (f == -1)
break;
}
- *o++ = *i++;
+ /* Output character was already written.
+ Just advance the indices. */
+ o++; i++;
}
- if (o != end)
- PyUnicode_Resize(&result, o - PyUnicode_AS_UNICODE(result));
+ if (o == len) {
+ /* No changes. Return original string. */
+ PyMem_Free(output);
+ return result;
+ }
+ Py_DECREF(result);
+ result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ output, o);
+ PyMem_Free(output);
return result;
}
@@ -732,7 +772,9 @@ nfc_nfkc(PyObject *self, PyObject *input, int k)
static int
is_normalized(PyObject *self, PyObject *input, int nfc, int k)
{
- Py_UNICODE *i, *end;
+ Py_ssize_t i, len;
+ int kind;
+ void *data;
unsigned char prev_combining = 0, quickcheck_mask;
/* An older version of the database is requested, quickchecks must be
@@ -744,10 +786,13 @@ is_normalized(PyObject *self, PyObject *input, int nfc, int k)
as described in http://unicode.org/reports/tr15/#Annex8. */
quickcheck_mask = 3 << ((nfc ? 4 : 0) + (k ? 2 : 0));
- i = PyUnicode_AS_UNICODE(input);
- end = i + PyUnicode_GET_SIZE(input);
- while (i < end) {
- const _PyUnicode_DatabaseRecord *record = _getrecord_ex(*i++);
+ i = 0;
+ kind = PyUnicode_KIND(input);
+ data = PyUnicode_DATA(input);
+ len = PyUnicode_GET_LENGTH(input);
+ while (i < len) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i++);
+ const _PyUnicode_DatabaseRecord *record = _getrecord_ex(ch);
unsigned char combining = record->combining;
unsigned char quickcheck = record->normalization_quick_check;
@@ -776,7 +821,10 @@ unicodedata_normalize(PyObject *self, PyObject *args)
&form, &PyUnicode_Type, &input))
return NULL;
- if (PyUnicode_GetSize(input) == 0) {
+ if (PyUnicode_READY(input) == -1)
+ return NULL;
+
+ if (PyUnicode_GET_LENGTH(input) == 0) {
/* Special case empty input strings, since resizing
them later would cause internal errors. */
Py_INCREF(input);
@@ -876,15 +924,25 @@ is_unified_ideograph(Py_UCS4 code)
{
return
(0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */
- (0x4E00 <= code && code <= 0x9FCB) || /* CJK Ideograph */
+ (0x4E00 <= code && code <= 0x9FCC) || /* CJK Ideograph */
(0x20000 <= code && code <= 0x2A6D6) || /* CJK Ideograph Extension B */
(0x2A700 <= code && code <= 0x2B734) || /* CJK Ideograph Extension C */
(0x2B740 <= code && code <= 0x2B81D); /* CJK Ideograph Extension D */
}
+/* macros used to determine if the given codepoint is in the PUA range that
+ * we are using to store aliases and named sequences */
+#define IS_ALIAS(cp) ((cp >= aliases_start) && (cp < aliases_end))
+#define IS_NAMED_SEQ(cp) ((cp >= named_sequences_start) && \
+ (cp < named_sequences_end))
+
static int
-_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen)
+_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
+ int with_alias_and_seq)
{
+ /* Find the name associated with the given codepoint.
+ * If with_alias_and_seq is 1, check for names in the Private Use Area 15
+ * that we are using for aliases and named sequences. */
int offset;
int i;
int word;
@@ -893,8 +951,16 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen)
if (code >= 0x110000)
return 0;
+ /* XXX should we just skip all the codepoints in the PUAs here? */
+ if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code)))
+ return 0;
+
if (self && UCD_Check(self)) {
- const change_record *old = get_old_record(self, code);
+ /* in 3.2.0 there are no aliases and named sequences */
+ const change_record *old;
+ if (IS_ALIAS(code) || IS_NAMED_SEQ(code))
+ return 0;
+ old = get_old_record(self, code);
if (old->category_changed == 0) {
/* unassigned */
return 0;
@@ -978,7 +1044,7 @@ _cmpname(PyObject *self, int code, const char* name, int namelen)
/* check if code corresponds to the given name */
int i;
char buffer[NAME_MAXLEN];
- if (!_getucname(self, code, buffer, sizeof(buffer)))
+ if (!_getucname(self, code, buffer, sizeof(buffer), 1))
return 0;
for (i = 0; i < namelen; i++) {
if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i])
@@ -994,7 +1060,7 @@ find_syllable(const char *str, int *len, int *pos, int count, int column)
*len = -1;
for (i = 0; i < count; i++) {
char *s = hangul_syllables[i][column];
- len1 = strlen(s);
+ len1 = Py_SAFE_DOWNCAST(strlen(s), size_t, int);
if (len1 <= *len)
continue;
if (strncmp(str, s, len1) == 0) {
@@ -1008,8 +1074,28 @@ find_syllable(const char *str, int *len, int *pos, int count, int column)
}
static int
-_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code)
+_check_alias_and_seq(unsigned int cp, Py_UCS4* code, int with_named_seq)
+{
+ /* check if named sequences are allowed */
+ if (!with_named_seq && IS_NAMED_SEQ(cp))
+ return 0;
+ /* if the codepoint is in the PUA range that we use for aliases,
+ * convert it to obtain the right codepoint */
+ if (IS_ALIAS(cp))
+ *code = name_aliases[cp-aliases_start];
+ else
+ *code = cp;
+ return 1;
+}
+
+static int
+_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code,
+ int with_named_seq)
{
+ /* Return the codepoint associated with the given name.
+ * Named aliases are resolved too (unless self != NULL (i.e. we are using
+ * 3.2.0)). If with_named_seq is 1, returns the PUA codepoint that we are
+ * using for the named sequence, and the caller must then convert it. */
unsigned int h, v;
unsigned int mask = code_size-1;
unsigned int i, incr;
@@ -1065,10 +1151,8 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code)
v = code_hash[i];
if (!v)
return 0;
- if (_cmpname(self, v, name, namelen)) {
- *code = v;
- return 1;
- }
+ if (_cmpname(self, v, name, namelen))
+ return _check_alias_and_seq(v, code, with_named_seq);
incr = (h ^ (h >> 3)) & mask;
if (!incr)
incr = mask;
@@ -1077,10 +1161,8 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code)
v = code_hash[i];
if (!v)
return 0;
- if (_cmpname(self, v, name, namelen)) {
- *code = v;
- return 1;
- }
+ if (_cmpname(self, v, name, namelen))
+ return _check_alias_and_seq(v, code, with_named_seq);
incr = incr << 1;
if (incr > mask)
incr = incr ^ code_poly;
@@ -1118,7 +1200,7 @@ unicodedata_name(PyObject* self, PyObject* args)
if (c == (Py_UCS4)-1)
return NULL;
- if (!_getucname(self, c, name, sizeof(name))) {
+ if (!_getucname(self, c, name, sizeof(name), 0)) {
if (defobj == NULL) {
PyErr_SetString(PyExc_ValueError, "no such name");
return NULL;
@@ -1143,28 +1225,26 @@ static PyObject *
unicodedata_lookup(PyObject* self, PyObject* args)
{
Py_UCS4 code;
- Py_UNICODE str[2];
char* name;
int namelen;
+ unsigned int index;
if (!PyArg_ParseTuple(args, "s#:lookup", &name, &namelen))
return NULL;
- if (!_getcode(self, name, namelen, &code)) {
- PyErr_Format(PyExc_KeyError, "undefined character name '%s'",
- name);
+ if (!_getcode(self, name, namelen, &code, 1)) {
+ PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name);
return NULL;
}
-
-#ifndef Py_UNICODE_WIDE
- if (code >= 0x10000) {
- str[0] = 0xd800 + ((code - 0x10000) >> 10);
- str[1] = 0xdc00 + ((code - 0x10000) & 0x3ff);
- return PyUnicode_FromUnicode(str, 2);
+ /* check if code is in the PUA range that we use for named sequences
+ and convert it */
+ if (IS_NAMED_SEQ(code)) {
+ index = code-named_sequences_start;
+ return PyUnicode_FromKindAndData(PyUnicode_2BYTE_KIND,
+ named_sequences[index].seq,
+ named_sequences[index].seqlen);
}
-#endif
- str[0] = (Py_UNICODE) code;
- return PyUnicode_FromUnicode(str, 1);
+ return PyUnicode_FromOrdinal(code);
}
/* XXX Add doc strings. */
diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h
index 8e2e724..5d5dca8 100644
--- a/Modules/unicodedata_db.h
+++ b/Modules/unicodedata_db.h
@@ -1,6 +1,6 @@
/* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */
-#define UNIDATA_VERSION "6.0.0"
+#define UNIDATA_VERSION "6.1.0"
/* a list of unique database records */
const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{0, 0, 0, 0, 0, 0},
@@ -28,12 +28,12 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{26, 0, 19, 0, 4, 0},
{28, 0, 11, 0, 4, 0},
{30, 0, 19, 0, 3, 0},
- {30, 0, 19, 0, 4, 0},
{29, 0, 19, 0, 4, 136},
{30, 0, 19, 0, 5, 0},
- {2, 0, 1, 0, 4, 136},
+ {19, 0, 1, 0, 4, 136},
{24, 0, 19, 1, 5, 0},
{14, 0, 15, 0, 4, 0},
+ {30, 0, 19, 0, 4, 0},
{29, 0, 19, 0, 3, 136},
{30, 0, 11, 0, 4, 0},
{27, 0, 11, 0, 4, 0},
@@ -49,6 +49,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{2, 0, 1, 0, 5, 10},
{1, 0, 1, 0, 5, 0},
{1, 0, 1, 0, 4, 136},
+ {2, 0, 1, 0, 4, 136},
{2, 0, 1, 0, 5, 0},
{19, 0, 1, 0, 5, 0},
{1, 0, 1, 0, 5, 136},
@@ -87,6 +88,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{6, 0, 14, 0, 5, 0},
{26, 0, 1, 0, 5, 0},
{21, 0, 19, 0, 5, 0},
+ {28, 0, 11, 0, 5, 0},
{4, 220, 14, 0, 5, 0},
{4, 222, 14, 0, 5, 0},
{4, 228, 14, 0, 5, 0},
@@ -134,6 +136,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{19, 0, 5, 0, 5, 136},
{7, 0, 9, 0, 5, 0},
{30, 0, 5, 0, 5, 0},
+ {14, 0, 5, 0, 5, 0},
{4, 36, 14, 0, 5, 0},
{4, 0, 14, 0, 5, 0},
{7, 0, 4, 0, 5, 0},
@@ -148,7 +151,6 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{4, 7, 14, 0, 5, 0},
{5, 0, 1, 0, 5, 80},
{5, 0, 1, 0, 5, 10},
- {28, 0, 11, 0, 5, 0},
{9, 0, 1, 0, 5, 0},
{4, 0, 14, 0, 5, 80},
{4, 0, 14, 0, 5, 10},
@@ -175,7 +177,6 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{19, 0, 1, 0, 5, 80},
{10, 0, 18, 0, 5, 0},
{8, 0, 1, 0, 5, 0},
- {14, 0, 1, 0, 5, 0},
{5, 9, 1, 0, 5, 0},
{4, 1, 14, 0, 5, 0},
{4, 234, 14, 0, 5, 0},
@@ -190,6 +191,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{10, 0, 18, 0, 5, 170},
{10, 0, 18, 0, 5, 136},
{14, 0, 15, 0, 5, 0},
+ {14, 0, 1, 0, 5, 0},
{14, 0, 4, 0, 5, 0},
{21, 0, 19, 0, 4, 0},
{21, 0, 19, 0, 5, 136},
@@ -256,7 +258,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{4, 228, 14, 0, 2, 0},
{4, 232, 14, 0, 2, 0},
{4, 222, 14, 0, 2, 0},
- {4, 224, 14, 0, 2, 0},
+ {5, 224, 1, 0, 2, 0},
{8, 0, 1, 0, 2, 136},
{19, 0, 1, 0, 2, 10},
{4, 8, 14, 0, 2, 80},
@@ -266,7 +268,7 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{30, 0, 1, 0, 2, 0},
{9, 0, 1, 0, 2, 136},
{30, 0, 1, 0, 2, 136},
- {30, 0, 1, 0, 4, 0},
+ {9, 0, 1, 0, 4, 0},
{9, 0, 19, 0, 2, 136},
{29, 0, 1, 0, 5, 0},
{15, 0, 1, 0, 5, 0},
@@ -325,11 +327,12 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {
{27, 0, 1, 0, 5, 136},
{7, 0, 9, 0, 5, 136},
{30, 0, 1, 0, 5, 136},
+ {30, 0, 1, 0, 4, 0},
};
/* Reindexing of NFC first characters. */
-#define TOTAL_FIRST 370
-#define TOTAL_LAST 55
+#define TOTAL_FIRST 372
+#define TOTAL_LAST 56
struct reindex{int start;short count,index;};
static struct reindex nfc_first[] = {
{ 60, 2, 0},
@@ -538,6 +541,7 @@ static struct reindex nfc_first[] = {
{ 69785, 0, 367},
{ 69787, 0, 368},
{ 69797, 0, 369},
+ { 69937, 1, 370},
{0,0,0}
};
@@ -574,6 +578,7 @@ static struct reindex nfc_last[] = {
{ 6965, 0, 51},
{ 12441, 1, 52},
{ 69818, 0, 54},
+ { 69927, 0, 55},
{0,0,0}
};
@@ -671,515 +676,515 @@ static unsigned char index1[] = {
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 41, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
- 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 17, 84, 85, 86, 87, 88,
- 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 101, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 102,
- 103, 100, 100, 100, 100, 100, 100, 100, 100, 104, 41, 41, 105, 106, 107,
- 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 119,
- 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 122, 123, 124,
- 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 17, 137,
- 138, 139, 140, 141, 17, 17, 17, 17, 17, 17, 142, 17, 143, 17, 144, 17,
- 145, 17, 146, 17, 17, 17, 147, 17, 17, 17, 148, 149, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 41, 41, 150, 17, 151, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 41, 41, 41, 41, 41, 41, 41, 41, 152, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 153, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 154, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 78,
- 155, 156, 157, 158, 17, 159, 17, 160, 161, 162, 163, 164, 165, 166, 167,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 168, 169, 170, 171, 172,
- 17, 173, 174, 175, 176, 177, 178, 179, 180, 181, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 182, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
- 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 183, 100, 184, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 121,
- 121, 121, 121, 185, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 186, 17, 187,
- 188, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 189, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 102, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 103, 104, 101, 101, 101, 101, 101, 101, 101, 101, 105, 41, 41, 106, 107,
+ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 189,
+ 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 124,
+ 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 84,
+ 138, 139, 140, 141, 142, 84, 84, 84, 84, 84, 84, 143, 84, 144, 145, 146,
+ 84, 147, 84, 148, 84, 84, 84, 149, 84, 84, 84, 150, 151, 152, 153, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 154, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 41, 41, 41, 41, 41, 41, 155, 84, 156,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 41, 41, 41, 41, 41, 41, 41, 41, 157, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 41, 41, 41, 41, 158, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 159, 160, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 161, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 78, 162, 163, 164, 165, 84, 166, 84, 167, 168, 169, 170, 171, 172,
+ 173, 174, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 175, 176, 84, 84, 177, 178, 179,
+ 180, 181, 84, 182, 183, 184, 185, 186, 187, 188, 189, 190, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 191, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 192,
+ 101, 193, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 122, 122, 122, 122, 194, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 195, 84, 196, 197, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 198, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 198,
};
static unsigned short index2[] = {
@@ -1191,1401 +1196,1464 @@ static unsigned short index2[] = {
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 9, 16, 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 22, 8, 8, 23, 8, 24,
- 25, 26, 27, 28, 29, 16, 30, 25, 31, 32, 33, 34, 34, 26, 35, 25, 22, 26,
- 34, 28, 36, 37, 37, 37, 22, 38, 38, 38, 38, 38, 38, 39, 38, 38, 38, 38,
+ 22, 25, 26, 27, 28, 16, 29, 30, 31, 32, 33, 34, 34, 25, 35, 22, 22, 25,
+ 34, 27, 36, 37, 37, 37, 22, 38, 38, 38, 38, 38, 38, 39, 38, 38, 38, 38,
38, 38, 38, 38, 38, 39, 38, 38, 38, 38, 38, 38, 40, 39, 38, 38, 38, 38,
38, 39, 41, 42, 42, 43, 43, 43, 43, 41, 43, 42, 42, 42, 43, 42, 42, 43,
43, 41, 43, 42, 42, 43, 43, 43, 40, 41, 42, 42, 43, 42, 43, 41, 43, 38,
42, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 41, 38,
42, 38, 43, 38, 43, 38, 43, 38, 42, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 39, 41, 38, 43, 38, 42, 38, 43, 38, 43, 38, 41, 45, 28, 38, 43, 38,
- 43, 41, 38, 43, 38, 43, 38, 43, 45, 28, 39, 41, 38, 42, 38, 43, 38, 42,
- 28, 39, 41, 38, 42, 38, 43, 38, 43, 39, 41, 38, 43, 38, 43, 38, 43, 38,
+ 43, 39, 41, 38, 43, 38, 42, 38, 43, 38, 43, 38, 41, 45, 46, 38, 43, 38,
+ 43, 41, 38, 43, 38, 43, 38, 43, 45, 46, 39, 41, 38, 42, 38, 43, 38, 42,
+ 46, 39, 41, 38, 42, 38, 43, 38, 43, 39, 41, 38, 43, 38, 43, 38, 43, 38,
43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 39, 41, 38, 43, 38, 42, 38,
43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 38, 43, 38, 43, 38, 43,
- 35, 46, 44, 44, 46, 44, 46, 44, 44, 46, 44, 44, 44, 46, 46, 44, 44, 44,
- 44, 46, 44, 44, 46, 44, 44, 44, 46, 46, 46, 44, 44, 46, 44, 38, 43, 44,
- 46, 44, 46, 44, 44, 46, 44, 46, 46, 44, 46, 44, 38, 43, 44, 44, 44, 46,
- 44, 46, 44, 44, 46, 46, 47, 44, 46, 46, 46, 47, 47, 47, 47, 48, 49, 35,
- 48, 49, 35, 48, 49, 35, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42,
- 38, 42, 38, 42, 46, 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 43, 48, 49, 35, 38, 43, 44, 44, 38, 43, 38, 43, 38,
+ 35, 47, 44, 44, 47, 44, 47, 44, 44, 47, 44, 44, 44, 47, 47, 44, 44, 44,
+ 44, 47, 44, 44, 47, 44, 44, 44, 47, 47, 47, 44, 44, 47, 44, 38, 43, 44,
+ 47, 44, 47, 44, 44, 47, 44, 47, 47, 44, 47, 44, 38, 43, 44, 44, 44, 47,
+ 44, 47, 44, 44, 47, 47, 48, 44, 47, 47, 47, 48, 48, 48, 48, 49, 50, 35,
+ 49, 50, 35, 49, 50, 35, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42,
+ 38, 42, 38, 42, 47, 38, 43, 38, 43, 38, 43, 44, 47, 38, 43, 38, 43, 38,
+ 43, 38, 43, 38, 43, 43, 49, 50, 35, 38, 43, 44, 44, 38, 43, 38, 43, 38,
43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 44,
- 46, 44, 46, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 46, 46, 46, 46, 46, 46, 44, 44, 46, 44, 44, 46, 46, 44, 46, 44, 44,
- 44, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 41, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 41, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 47, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 52, 52, 52, 53,
- 53, 54, 53, 51, 55, 51, 55, 55, 55, 51, 55, 51, 51, 56, 52, 53, 53, 53,
- 53, 53, 53, 26, 26, 26, 26, 57, 26, 53, 54, 50, 50, 50, 50, 50, 53, 53,
- 53, 53, 53, 53, 53, 51, 53, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 58, 58, 58, 58, 58, 59, 58, 58, 58, 58, 58,
- 58, 58, 59, 59, 58, 59, 58, 59, 58, 58, 60, 61, 61, 61, 61, 60, 62, 61,
- 61, 61, 61, 61, 63, 63, 64, 64, 64, 64, 65, 65, 61, 61, 61, 61, 64, 64,
- 61, 64, 64, 61, 61, 66, 66, 66, 66, 67, 61, 61, 61, 61, 59, 59, 59, 68,
- 68, 58, 68, 68, 69, 59, 61, 61, 61, 59, 59, 59, 61, 61, 70, 59, 59, 59,
- 61, 61, 61, 61, 59, 60, 61, 61, 59, 71, 72, 72, 71, 72, 72, 71, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 44, 46, 44, 46, 73, 53, 44,
- 46, 0, 0, 50, 46, 46, 46, 74, 0, 0, 0, 0, 0, 57, 75, 38, 74, 38, 38, 38,
+ 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 47, 38, 43, 44,
+ 47, 44, 47, 44, 47, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
+ 43, 47, 47, 47, 47, 47, 47, 44, 44, 47, 44, 44, 47, 47, 44, 47, 44, 44,
+ 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 41, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 53, 53, 53, 54,
+ 54, 55, 54, 52, 56, 52, 56, 56, 56, 52, 56, 52, 52, 57, 53, 54, 54, 54,
+ 54, 54, 54, 25, 25, 25, 25, 58, 25, 54, 55, 51, 51, 51, 51, 51, 54, 54,
+ 54, 54, 54, 54, 54, 52, 54, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 59, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59,
+ 59, 59, 60, 60, 59, 60, 59, 60, 59, 59, 61, 62, 62, 62, 62, 61, 63, 62,
+ 62, 62, 62, 62, 64, 64, 65, 65, 65, 65, 66, 66, 62, 62, 62, 62, 65, 65,
+ 62, 65, 65, 62, 62, 67, 67, 67, 67, 68, 62, 62, 62, 62, 60, 60, 60, 69,
+ 69, 59, 69, 69, 70, 60, 62, 62, 62, 60, 60, 60, 62, 62, 71, 60, 60, 60,
+ 62, 62, 62, 62, 60, 61, 62, 62, 60, 72, 73, 73, 72, 73, 73, 72, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 44, 47, 44, 47, 74, 54, 44,
+ 47, 0, 0, 51, 47, 47, 47, 75, 0, 0, 0, 0, 0, 58, 76, 38, 75, 38, 38, 38,
0, 38, 0, 38, 38, 43, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
39, 39, 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 38, 38, 43, 43, 43, 43,
43, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 46, 41, 41, 41, 41, 41, 41, 41, 43, 43, 43, 43, 43, 44, 35, 35, 48, 76,
- 76, 35, 35, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 35, 35, 35, 46, 48, 35, 77, 44,
- 46, 48, 44, 46, 46, 44, 44, 44, 38, 78, 44, 38, 44, 44, 44, 38, 44, 44,
- 44, 44, 38, 38, 38, 44, 39, 39, 39, 39, 39, 39, 39, 39, 39, 78, 39, 39,
+ 47, 41, 41, 41, 41, 41, 41, 41, 43, 43, 43, 43, 43, 44, 35, 35, 49, 77,
+ 77, 35, 35, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 35, 35, 35, 47, 49, 35, 78, 44,
+ 47, 49, 44, 47, 47, 44, 44, 44, 38, 79, 44, 38, 44, 44, 44, 38, 44, 44,
+ 44, 44, 38, 38, 38, 44, 39, 39, 39, 39, 39, 39, 39, 39, 39, 79, 39, 39,
39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
39, 39, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41, 41, 41, 41, 41, 41,
41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 43, 42,
- 46, 43, 46, 46, 46, 43, 46, 46, 46, 46, 43, 43, 43, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 79, 80, 80, 80, 80, 80,
- 81, 81, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46,
- 38, 43, 38, 43, 44, 46, 38, 43, 44, 46, 38, 43, 38, 43, 38, 43, 44, 46,
- 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
- 38, 43, 44, 46, 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 0, 0, 0,
+ 47, 43, 47, 47, 47, 43, 47, 47, 47, 47, 43, 43, 43, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 38, 43, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 80, 81, 81, 81, 81, 81,
+ 82, 82, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 38, 43, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47,
+ 38, 43, 38, 43, 44, 47, 38, 43, 44, 47, 38, 43, 38, 43, 38, 43, 44, 47,
+ 38, 43, 38, 43, 38, 43, 44, 47, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 44, 47, 38, 43, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 0, 0, 0,
0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 0, 0, 52, 82, 82, 82, 82, 82, 82, 0, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 35,
- 0, 82, 83, 0, 0, 0, 0, 0, 0, 84, 80, 80, 80, 80, 84, 80, 80, 80, 85, 84,
- 80, 80, 80, 80, 80, 80, 84, 84, 84, 84, 84, 84, 80, 80, 84, 80, 80, 85,
- 86, 80, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101,
- 102, 103, 104, 102, 80, 84, 102, 95, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0,
- 105, 105, 105, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, 106,
- 106, 0, 0, 77, 77, 107, 108, 108, 109, 110, 111, 27, 27, 80, 80, 80, 80,
- 80, 80, 80, 80, 112, 113, 114, 111, 0, 0, 111, 111, 115, 115, 116, 116,
- 116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 117, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 118, 119, 120,
- 112, 113, 114, 121, 122, 123, 123, 124, 84, 80, 80, 80, 80, 80, 84, 80,
- 80, 84, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 108, 126, 126,
- 111, 115, 115, 127, 115, 115, 115, 115, 128, 128, 128, 128, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116,
- 115, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 116, 111, 115, 80, 80, 80, 80, 80, 80, 80, 106, 27,
- 80, 80, 80, 80, 84, 80, 117, 117, 80, 80, 27, 84, 80, 80, 84, 115, 115,
- 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 115, 115, 115, 130,
- 130, 115, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
- 111, 111, 0, 106, 115, 131, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 80, 84, 80, 80, 84, 80, 80, 84, 84,
- 84, 80, 84, 84, 80, 84, 80, 80, 80, 84, 80, 84, 80, 84, 80, 84, 80, 80,
- 0, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133,
- 133, 133, 133, 133, 133, 133, 133, 133, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 80, 80,
- 80, 80, 80, 80, 80, 84, 80, 134, 134, 27, 135, 135, 135, 134, 0, 0, 0, 0,
- 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 80, 80, 80, 80, 134, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 134, 80, 80, 80, 134, 80, 80, 80, 80, 80, 0, 0,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 84, 84, 84,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132,
- 132, 136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 137, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47, 137, 47, 47,
- 47, 47, 47, 132, 136, 138, 47, 136, 136, 136, 132, 132, 132, 132, 132,
- 132, 132, 132, 136, 136, 136, 136, 139, 136, 136, 47, 80, 84, 80, 80,
- 132, 132, 132, 140, 140, 140, 140, 140, 140, 140, 140, 47, 47, 132, 132,
- 82, 82, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 82, 52, 47, 47,
- 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 132, 136, 136, 0, 47,
- 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47,
- 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 47, 47, 47, 47, 0, 0, 142, 47,
- 143, 136, 136, 132, 132, 132, 132, 0, 0, 136, 136, 0, 0, 144, 144, 139,
- 47, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 140, 140, 0, 140, 47, 47,
- 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47,
- 145, 145, 146, 146, 146, 146, 146, 146, 79, 145, 0, 0, 0, 0, 0, 132, 132,
- 136, 0, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 140, 0, 47, 140, 0, 47, 47, 0, 0,
- 142, 0, 136, 136, 136, 132, 132, 0, 0, 0, 0, 132, 132, 0, 0, 132, 132,
- 139, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 47, 0, 140, 0, 0,
- 0, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 132,
- 132, 47, 47, 47, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 136, 0,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0,
- 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142,
- 47, 136, 136, 136, 132, 132, 132, 132, 132, 0, 132, 132, 136, 0, 136,
- 136, 139, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47,
- 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 145,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 136, 136, 0, 47, 47,
- 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47,
- 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142, 47, 143,
- 132, 136, 132, 132, 132, 132, 0, 0, 136, 144, 0, 0, 144, 144, 139, 0, 0,
- 0, 0, 0, 0, 0, 0, 147, 143, 0, 0, 0, 0, 140, 140, 0, 47, 47, 47, 132,
- 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 79, 47, 146,
- 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 47, 0, 47,
- 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 0, 47, 47, 137, 47, 0, 0, 0, 47,
- 47, 0, 47, 0, 47, 47, 0, 0, 0, 47, 47, 0, 0, 0, 47, 47, 47, 0, 0, 0, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 143, 136, 132,
- 136, 136, 0, 0, 0, 136, 136, 136, 0, 144, 144, 144, 139, 0, 0, 47, 0, 0,
- 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 141, 146, 146, 146, 27, 27, 27, 27, 27, 27,
- 145, 27, 0, 0, 0, 0, 0, 0, 136, 136, 136, 0, 47, 47, 47, 47, 47, 47, 47,
- 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 0, 47, 132, 132, 132, 136, 136,
- 136, 136, 0, 132, 132, 148, 0, 132, 132, 132, 139, 0, 0, 0, 0, 0, 0, 0,
- 149, 150, 0, 47, 47, 0, 0, 0, 0, 0, 0, 47, 47, 132, 132, 0, 0, 141, 141,
- 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 151, 151,
- 151, 151, 151, 151, 151, 79, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 142, 47, 136, 152, 144, 136,
- 143, 136, 136, 0, 152, 144, 144, 0, 144, 144, 132, 139, 0, 0, 0, 0, 0, 0,
- 0, 143, 143, 0, 0, 0, 0, 0, 0, 0, 47, 0, 47, 47, 132, 132, 0, 0, 141,
- 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 47, 47, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47, 47, 47,
- 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 44, 44, 44, 44, 44, 44, 0, 0, 53, 83, 83, 83, 83, 83, 83, 0, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 143, 136, 136, 132, 132,
- 132, 132, 0, 136, 136, 136, 0, 144, 144, 144, 139, 47, 0, 0, 0, 0, 0, 0,
- 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 132, 132, 0, 0, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 141, 146, 146, 146, 146, 146, 146, 0, 0, 0,
- 79, 47, 47, 47, 47, 47, 47, 0, 0, 136, 136, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 47, 47, 47,
- 47, 47, 47, 47, 0, 0, 0, 153, 0, 0, 0, 0, 143, 136, 136, 132, 132, 132,
- 0, 132, 0, 136, 136, 144, 136, 144, 144, 144, 143, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 132, 47, 154,
- 132, 132, 132, 132, 155, 155, 139, 0, 0, 0, 0, 145, 47, 47, 47, 47, 47,
- 47, 52, 132, 156, 156, 156, 156, 132, 132, 132, 82, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 82, 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, 0, 0, 0, 0, 0, 0,
- 0, 47, 47, 0, 47, 0, 0, 47, 47, 0, 47, 0, 0, 47, 0, 0, 0, 0, 0, 0, 47,
- 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 0, 47,
- 0, 0, 47, 47, 0, 47, 47, 47, 47, 132, 47, 154, 132, 132, 132, 132, 157,
- 157, 0, 132, 132, 47, 0, 0, 47, 47, 47, 47, 47, 0, 52, 0, 158, 158, 158,
- 158, 132, 132, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0,
- 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 79, 79, 82, 82, 82, 82,
- 82, 82, 82, 82, 159, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 84, 84,
- 79, 79, 79, 79, 79, 79, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 79, 84, 79, 84, 79,
- 160, 161, 162, 161, 162, 136, 136, 47, 47, 47, 140, 47, 47, 47, 47, 0,
- 47, 47, 47, 47, 140, 47, 47, 47, 47, 140, 47, 47, 47, 47, 140, 47, 47,
- 47, 47, 140, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 140, 47, 47,
- 47, 0, 0, 0, 0, 163, 164, 165, 166, 165, 165, 167, 165, 167, 164, 164,
- 164, 164, 132, 136, 164, 165, 80, 80, 139, 82, 80, 80, 47, 47, 47, 47,
- 47, 132, 132, 132, 132, 132, 132, 165, 132, 132, 132, 132, 0, 132, 132,
- 132, 132, 165, 132, 132, 132, 132, 165, 132, 132, 132, 132, 165, 132,
- 132, 132, 132, 165, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 165, 132, 132, 132, 0, 79, 79, 79, 79, 79, 79, 79, 79, 84, 79,
- 79, 79, 79, 79, 79, 0, 79, 79, 82, 82, 82, 82, 82, 79, 79, 79, 79, 82,
- 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, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47, 47, 47, 136,
- 136, 132, 147, 132, 132, 136, 132, 132, 132, 132, 132, 142, 136, 139,
- 139, 136, 136, 132, 132, 47, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 82, 82, 82, 82, 82, 82, 47, 47, 47, 47, 47, 47, 136, 136, 132, 132,
- 47, 47, 47, 47, 132, 132, 132, 47, 136, 136, 136, 47, 47, 136, 136, 136,
- 136, 136, 136, 136, 47, 47, 47, 132, 132, 132, 132, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 132, 136, 136, 132, 132, 136, 136, 136,
- 136, 136, 136, 84, 47, 136, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 136, 136, 136, 132, 79, 79, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 35,
+ 0, 83, 84, 0, 0, 0, 0, 85, 0, 86, 81, 81, 81, 81, 86, 81, 81, 81, 87, 86,
+ 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, 81, 81, 87,
+ 88, 81, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102,
+ 103, 104, 105, 106, 104, 81, 86, 104, 97, 0, 0, 0, 0, 0, 0, 0, 0, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0,
+ 0, 107, 107, 107, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108,
+ 108, 108, 108, 0, 78, 78, 109, 110, 110, 111, 112, 113, 26, 26, 81, 81,
+ 81, 81, 81, 81, 81, 81, 114, 115, 116, 113, 0, 0, 113, 113, 117, 117,
+ 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 119, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 120,
+ 121, 122, 114, 115, 116, 123, 124, 125, 125, 126, 86, 81, 81, 81, 81, 81,
+ 86, 81, 81, 86, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 110,
+ 128, 128, 113, 117, 117, 129, 117, 117, 117, 117, 130, 130, 130, 130,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 118, 117, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 118, 113, 117, 81, 81, 81, 81, 81, 81, 81,
+ 108, 26, 81, 81, 81, 81, 86, 81, 119, 119, 81, 81, 26, 86, 81, 81, 86,
+ 117, 117, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 117, 117,
+ 117, 132, 132, 117, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 0, 133, 117, 134, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 81, 86, 81, 81, 86, 81, 81,
+ 86, 86, 86, 81, 86, 86, 81, 86, 81, 81, 81, 86, 81, 86, 81, 86, 81, 86,
+ 81, 81, 0, 0, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 135, 135, 135, 135, 135, 135, 135,
+ 135, 135, 135, 135, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136,
+ 136, 136, 136, 136, 136, 136, 136, 136, 136, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 81,
+ 81, 81, 81, 81, 81, 81, 86, 81, 137, 137, 26, 138, 138, 138, 137, 0, 0,
+ 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, 81, 81, 81, 137, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 137, 81, 81, 81, 137, 81, 81, 81, 81, 81, 0,
+ 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 86, 86, 86,
+ 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 81, 86, 81, 81, 86, 81, 81, 81, 86, 86, 86, 120, 121, 122, 81, 81, 81,
+ 86, 81, 81, 86, 86, 81, 81, 81, 81, 0, 135, 135, 135, 139, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48,
+ 48, 48, 48, 48, 48, 48, 140, 48, 48, 140, 48, 48, 48, 48, 48, 135, 139,
+ 141, 48, 139, 139, 139, 135, 135, 135, 135, 135, 135, 135, 135, 139, 139,
+ 139, 139, 142, 139, 139, 48, 81, 86, 81, 81, 135, 135, 135, 143, 143,
+ 143, 143, 143, 143, 143, 143, 48, 48, 135, 135, 83, 83, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 83, 53, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 48, 48, 48, 48, 0, 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0,
+ 48, 0, 0, 0, 48, 48, 48, 48, 0, 0, 145, 48, 146, 139, 139, 135, 135, 135,
+ 135, 0, 0, 139, 139, 0, 0, 147, 147, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 146, 0, 0, 0, 0, 143, 143, 0, 143, 48, 48, 135, 135, 0, 0, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 48, 48, 85, 85, 148, 148, 148, 148,
+ 148, 148, 80, 85, 0, 0, 0, 0, 0, 135, 135, 139, 0, 48, 48, 48, 48, 48,
+ 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48,
+ 48, 0, 48, 143, 0, 48, 143, 0, 48, 48, 0, 0, 145, 0, 139, 139, 139, 135,
+ 135, 0, 0, 0, 0, 135, 135, 0, 0, 135, 135, 142, 0, 0, 0, 135, 0, 0, 0, 0,
+ 0, 0, 0, 143, 143, 143, 48, 0, 143, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 135, 135, 48, 48, 48, 135, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 0, 48, 48, 48, 48, 48, 0, 0, 145, 48, 139, 139, 139, 135, 135, 135,
+ 135, 135, 0, 135, 135, 139, 0, 139, 139, 142, 0, 0, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 83, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48,
+ 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48,
+ 48, 48, 48, 0, 0, 145, 48, 146, 135, 139, 135, 135, 135, 135, 0, 0, 139,
+ 147, 0, 0, 147, 147, 142, 0, 0, 0, 0, 0, 0, 0, 0, 149, 146, 0, 0, 0, 0,
+ 143, 143, 0, 48, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 80, 48, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48,
+ 0, 48, 48, 140, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, 0, 0, 48, 48,
+ 0, 0, 0, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 0, 0, 146, 139, 135, 139, 139, 0, 0, 0, 139, 139, 139, 0, 147,
+ 147, 147, 142, 0, 0, 48, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148,
+ 148, 148, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, 0, 0, 139, 139,
+ 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0,
+ 0, 0, 48, 135, 135, 135, 139, 139, 139, 139, 0, 135, 135, 150, 0, 135,
+ 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 151, 152, 0, 48, 48, 0, 0, 0, 0, 0,
+ 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 0, 0, 0, 0, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 80, 0, 0,
+ 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48,
+ 48, 0, 0, 145, 48, 139, 154, 147, 139, 146, 139, 139, 0, 154, 147, 147,
+ 0, 147, 147, 135, 142, 0, 0, 0, 0, 0, 0, 0, 146, 146, 0, 0, 0, 0, 0, 0,
+ 0, 48, 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139,
+ 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 48, 146, 139, 139, 135, 135, 135, 135, 0, 139, 139, 139, 0,
+ 147, 147, 147, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 148, 148, 148, 148, 148, 148, 0, 0, 0, 80, 48, 48, 48, 48, 48, 48,
+ 0, 0, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0,
+ 155, 0, 0, 0, 0, 146, 139, 139, 135, 135, 135, 0, 135, 0, 139, 139, 147,
+ 139, 147, 147, 147, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 139, 139, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 135, 48, 156, 135, 135, 135, 135, 157,
+ 157, 142, 0, 0, 0, 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 158, 158, 158,
+ 158, 135, 135, 135, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+ 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 0, 48, 48,
+ 0, 48, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48,
+ 48, 48, 0, 48, 48, 48, 0, 48, 0, 48, 0, 0, 48, 48, 0, 48, 48, 48, 48,
+ 135, 48, 156, 135, 135, 135, 135, 159, 159, 0, 135, 135, 48, 0, 0, 48,
+ 48, 48, 48, 48, 0, 53, 0, 160, 160, 160, 160, 135, 135, 0, 0, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 156, 156, 48, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 161, 83,
+ 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80,
+ 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 80, 86, 80, 86, 80, 162, 163, 164, 163,
+ 164, 139, 139, 48, 48, 48, 143, 48, 48, 48, 48, 0, 48, 48, 48, 48, 143,
+ 48, 48, 48, 48, 143, 48, 48, 48, 48, 143, 48, 48, 48, 48, 143, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 143, 48, 48, 48, 0, 0, 0, 0, 165,
+ 166, 167, 168, 167, 167, 169, 167, 169, 166, 166, 166, 166, 135, 139,
+ 166, 167, 81, 81, 142, 83, 81, 81, 48, 48, 48, 48, 48, 135, 135, 135,
+ 135, 135, 135, 167, 135, 135, 135, 135, 0, 135, 135, 135, 135, 167, 135,
+ 135, 135, 135, 167, 135, 135, 135, 135, 167, 135, 135, 135, 135, 167,
+ 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 167, 135,
+ 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, 80, 80, 80, 80, 80,
+ 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, 83, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 140, 48, 48, 48, 48, 139, 139, 135, 149, 135,
+ 135, 139, 135, 135, 135, 135, 135, 145, 139, 142, 142, 139, 139, 135,
+ 135, 48, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83, 83, 83,
+ 83, 83, 83, 48, 48, 48, 48, 48, 48, 139, 139, 135, 135, 48, 48, 48, 48,
+ 135, 135, 135, 48, 139, 139, 139, 48, 48, 139, 139, 139, 139, 139, 139,
+ 139, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 135, 139, 139, 135, 135, 139, 139, 139, 139, 139, 139,
+ 86, 48, 139, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 139, 139,
+ 139, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 82, 50, 0, 0, 0, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 47, 169, 169, 169, 169, 169, 169, 169, 169,
- 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 168, 168, 168, 168, 168, 169, 169, 169, 169,
- 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
- 169, 169, 169, 169, 169, 169, 169, 169, 169, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 168, 168, 168, 168, 168,
- 168, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0,
- 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0,
- 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0,
- 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 0, 0, 80, 80, 80, 79, 82, 82, 82, 82, 82, 82, 82, 82, 146, 146, 146, 146,
- 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 170, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 161,
- 162, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 82, 82, 82, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 0, 47, 47, 47, 47, 132, 132, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 132, 132, 139, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 132, 132, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 0, 47, 47, 47, 0, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 172, 172, 136,
- 132, 132, 132, 132, 132, 132, 132, 136, 136, 136, 136, 136, 136, 136,
- 136, 132, 136, 136, 132, 132, 132, 132, 132, 132, 132, 132, 132, 139,
- 132, 82, 82, 82, 52, 82, 82, 82, 145, 47, 80, 0, 0, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 151, 151, 151, 151, 151,
- 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 135,
- 83, 135, 135, 135, 135, 132, 132, 132, 170, 0, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 86, 47, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 0, 0, 0, 132, 132, 132, 136, 136, 136, 136, 132,
- 132, 136, 136, 136, 0, 0, 0, 0, 136, 136, 132, 136, 136, 136, 136, 136,
- 136, 85, 80, 84, 0, 0, 0, 0, 27, 0, 0, 0, 135, 135, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 0, 0, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136,
- 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 47, 47, 47, 47, 47, 47,
- 47, 136, 136, 0, 0, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 146, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 80, 84, 136, 136, 136, 0, 0, 82, 82,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136,
- 132, 136, 132, 132, 132, 132, 132, 132, 132, 0, 139, 136, 132, 136, 136,
- 132, 132, 132, 132, 132, 132, 132, 132, 136, 136, 136, 136, 136, 136,
- 132, 132, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 84, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82,
- 52, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 83, 51, 48, 48, 48, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 48, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 170, 170, 170, 170, 170, 170,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48,
+ 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0,
+ 81, 81, 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 163, 164, 0,
+ 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 83, 83, 83, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 48, 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135,
+ 142, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 139, 135, 135,
+ 135, 135, 135, 135, 135, 139, 139, 139, 139, 139, 139, 139, 139, 135,
+ 139, 139, 135, 135, 135, 135, 135, 135, 135, 135, 135, 142, 135, 83, 83,
+ 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 0, 0, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 84, 138, 138,
+ 138, 138, 135, 135, 135, 172, 0, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 88, 48,
+ 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 0, 0, 0, 135, 135, 135, 139, 139, 139, 139, 135, 135, 139, 139,
+ 139, 0, 0, 0, 0, 139, 139, 135, 139, 139, 139, 139, 139, 139, 87, 81, 86,
+ 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48,
+ 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 0, 0, 0, 0, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 48, 48, 48, 48, 48, 48, 48, 139, 139,
+ 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148,
+ 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 81, 86, 139, 139, 139, 0, 0, 83, 83, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 139, 135,
+ 135, 135, 135, 135, 135, 135, 0, 142, 139, 135, 139, 139, 135, 135, 135,
+ 135, 135, 135, 135, 135, 139, 139, 139, 139, 139, 139, 135, 135, 81, 81,
+ 81, 81, 81, 81, 81, 81, 0, 0, 86, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 144, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, 83,
+ 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 132,
- 132, 136, 47, 137, 47, 137, 47, 137, 47, 137, 47, 137, 47, 47, 47, 137,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 142, 143,
- 132, 132, 132, 132, 132, 144, 132, 144, 136, 136, 144, 144, 132, 144,
- 173, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 141, 82, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 80, 84, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 0, 0, 0, 132, 132, 136, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 136, 132, 132, 132, 132, 136, 136, 132, 132, 173, 0,
- 0, 0, 47, 47, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 139, 48, 140, 48,
+ 140, 48, 140, 48, 140, 48, 140, 48, 48, 48, 140, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 146, 135, 135, 135, 135, 135,
+ 147, 135, 147, 139, 139, 147, 147, 135, 147, 174, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83, 83,
+ 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 86, 81,
+ 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 135,
+ 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 135,
+ 135, 135, 139, 139, 135, 135, 174, 142, 139, 139, 48, 48, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145,
+ 139, 135, 135, 139, 139, 139, 135, 139, 135, 135, 135, 174, 174, 0, 0, 0,
+ 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 139, 139, 139, 139, 139,
+ 135, 135, 135, 135, 135, 135, 135, 135, 139, 139, 135, 145, 0, 0, 0, 83,
+ 83, 83, 83, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0,
+ 0, 48, 48, 48, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83,
+ 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 175, 86, 86, 86, 86, 86,
+ 81, 81, 86, 86, 86, 86, 81, 139, 175, 175, 175, 175, 175, 175, 175, 48,
+ 48, 48, 48, 86, 48, 48, 48, 48, 139, 139, 81, 48, 48, 0, 0, 0, 0, 0, 0,
0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 142, 136, 132, 132, 136, 136, 136, 132, 136, 132, 132,
- 132, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 53, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136, 136,
- 136, 136, 136, 136, 136, 132, 132, 132, 132, 132, 132, 132, 132, 136,
- 136, 132, 142, 0, 0, 0, 82, 82, 82, 82, 82, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 0, 0, 0, 47, 47, 47, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52,
- 52, 52, 52, 52, 52, 82, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 80, 82, 174,
- 84, 84, 84, 84, 84, 80, 80, 84, 84, 84, 84, 80, 136, 174, 174, 174, 174,
- 174, 174, 174, 47, 47, 47, 47, 84, 47, 47, 47, 47, 136, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 52, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 80,
- 80, 84, 80, 80, 80, 80, 80, 80, 80, 84, 80, 80, 175, 176, 84, 177, 80,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 81, 81, 86, 81,
+ 81, 81, 81, 81, 81, 81, 86, 81, 81, 176, 177, 86, 178, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 86,
+ 81, 86, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 180, 47, 47, 44, 47,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43,
+ 44, 47, 44, 47, 44, 47, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38,
+ 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0,
+ 0, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43,
+ 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43,
+ 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43,
+ 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38,
+ 38, 38, 38, 38, 38, 38, 38, 43, 181, 43, 181, 43, 181, 43, 181, 43, 181,
+ 43, 181, 43, 181, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182,
+ 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182,
+ 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 43, 43, 43, 182, 182, 182,
+ 182, 182, 182, 182, 182, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 183,
+ 182, 58, 181, 58, 58, 76, 43, 43, 43, 0, 43, 43, 38, 183, 38, 183, 182,
+ 76, 76, 76, 43, 43, 43, 181, 0, 0, 43, 43, 38, 38, 38, 183, 0, 76, 76,
+ 76, 43, 43, 43, 181, 43, 43, 43, 43, 38, 38, 38, 183, 38, 76, 184, 184,
+ 0, 0, 43, 43, 43, 0, 43, 43, 38, 183, 38, 183, 182, 184, 58, 0, 185, 185,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 188, 189,
+ 190, 191, 84, 190, 190, 190, 22, 192, 193, 194, 195, 196, 193, 194, 195,
+ 196, 22, 22, 22, 138, 197, 197, 197, 22, 198, 199, 200, 201, 202, 203,
+ 204, 21, 205, 110, 205, 206, 207, 22, 192, 192, 138, 28, 36, 22, 192,
+ 138, 197, 208, 208, 138, 138, 138, 209, 163, 164, 192, 192, 192, 138,
+ 138, 138, 138, 138, 138, 138, 138, 78, 138, 208, 138, 138, 192, 138, 138,
+ 138, 138, 138, 138, 138, 186, 187, 187, 187, 187, 187, 0, 0, 0, 0, 0,
+ 187, 187, 187, 187, 187, 187, 210, 51, 0, 0, 34, 210, 210, 210, 210, 210,
+ 211, 211, 212, 213, 214, 215, 210, 34, 34, 34, 34, 210, 210, 210, 210,
+ 210, 211, 211, 212, 213, 214, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 216, 217, 85, 85,
+ 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 175, 175, 81, 81,
+ 81, 81, 175, 175, 175, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, 175, 175,
+ 81, 86, 81, 175, 175, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 218, 218, 49, 219, 26, 219, 218, 49, 26, 219, 35, 49, 49,
+ 49, 35, 35, 49, 49, 49, 46, 26, 49, 219, 26, 78, 49, 49, 49, 49, 49, 26,
+ 26, 218, 219, 219, 26, 49, 26, 220, 26, 49, 26, 183, 220, 49, 49, 221,
+ 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 218, 35, 35, 49, 49,
+ 222, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 223,
+ 223, 223, 37, 37, 223, 223, 223, 223, 223, 223, 37, 37, 37, 37, 223, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225,
+ 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225,
+ 225, 225, 225, 173, 173, 173, 44, 47, 173, 173, 173, 173, 37, 0, 0, 0, 0,
+ 0, 0, 40, 40, 40, 40, 40, 30, 30, 30, 30, 30, 226, 226, 26, 26, 26, 26,
+ 78, 26, 26, 78, 26, 26, 78, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 226, 226, 26, 26, 40, 26, 40,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 40, 228, 229, 229, 230, 78, 78, 40, 229, 230,
+ 228, 229, 230, 228, 78, 40, 78, 229, 231, 232, 78, 229, 228, 78, 78, 78,
+ 229, 228, 228, 229, 40, 229, 229, 228, 228, 40, 230, 40, 230, 40, 40, 40,
+ 40, 229, 233, 222, 229, 222, 222, 228, 228, 228, 40, 40, 40, 40, 78, 228,
+ 78, 228, 229, 229, 228, 228, 228, 230, 228, 228, 230, 228, 228, 230, 229,
+ 230, 228, 228, 229, 78, 78, 78, 78, 78, 229, 228, 228, 228, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 228, 234, 40, 230, 78, 229, 229, 229, 229, 228,
+ 228, 229, 229, 78, 226, 234, 234, 230, 230, 228, 228, 230, 230, 228, 228,
+ 230, 230, 228, 228, 228, 228, 228, 228, 230, 230, 229, 229, 230, 230,
+ 229, 229, 230, 230, 228, 228, 228, 78, 78, 228, 228, 228, 228, 78, 78,
+ 40, 78, 78, 228, 40, 78, 78, 78, 78, 78, 78, 78, 78, 228, 228, 78, 40,
+ 228, 228, 228, 228, 228, 228, 230, 230, 230, 230, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 78, 78, 78, 78, 78, 228, 229, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 228, 228, 228, 228, 228, 78, 78, 228, 228, 78, 78,
+ 78, 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 230, 230, 230,
+ 230, 228, 228, 228, 228, 228, 228, 230, 230, 230, 230, 78, 78, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 26,
+ 26, 26, 26, 26, 26, 26, 26, 228, 228, 228, 228, 26, 26, 26, 26, 26, 26,
+ 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 228, 228, 26, 26,
+ 26, 26, 26, 26, 26, 235, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 178, 84, 80, 84, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 179, 46,
- 46, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38,
- 43, 38, 43, 44, 46, 44, 46, 44, 46, 43, 43, 43, 43, 43, 43, 43, 43, 38,
- 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38,
- 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38,
- 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43,
- 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43,
- 43, 43, 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43,
- 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 180, 43, 180, 43, 180, 43, 180,
- 43, 180, 43, 180, 43, 180, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 181,
- 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 43, 43, 43, 181,
- 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 43, 43, 43, 181,
- 181, 181, 181, 181, 181, 181, 181, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38,
- 38, 182, 181, 57, 180, 57, 57, 75, 43, 43, 43, 0, 43, 43, 38, 182, 38,
- 182, 181, 75, 75, 75, 43, 43, 43, 180, 0, 0, 43, 43, 38, 38, 38, 182, 0,
- 75, 75, 75, 43, 43, 43, 180, 43, 43, 43, 43, 38, 38, 38, 182, 38, 75,
- 183, 183, 0, 0, 43, 43, 43, 0, 43, 43, 38, 182, 38, 182, 181, 183, 57, 0,
- 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, 186, 186,
- 172, 187, 188, 189, 83, 188, 188, 188, 22, 190, 191, 192, 193, 194, 191,
- 192, 193, 194, 22, 22, 22, 135, 195, 195, 195, 22, 196, 197, 198, 199,
- 200, 201, 202, 21, 203, 108, 203, 204, 205, 22, 190, 190, 135, 29, 36,
- 22, 190, 135, 195, 206, 206, 135, 135, 135, 207, 161, 162, 190, 190, 190,
- 135, 135, 135, 135, 135, 135, 135, 135, 77, 135, 206, 135, 135, 190, 135,
- 135, 135, 135, 135, 135, 135, 185, 186, 186, 186, 186, 186, 0, 0, 0, 0,
- 0, 186, 186, 186, 186, 186, 186, 208, 50, 0, 0, 34, 208, 208, 208, 208,
- 208, 209, 209, 210, 211, 212, 213, 208, 34, 34, 34, 34, 208, 208, 208,
- 208, 208, 209, 209, 210, 211, 212, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 214,
- 215, 145, 145, 23, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
- 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 80, 80, 174, 174, 80, 80, 80, 80, 174, 174, 174, 80, 80, 81, 81, 81,
- 81, 80, 81, 81, 81, 174, 174, 80, 84, 80, 174, 174, 84, 84, 84, 84, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 48, 217, 27, 217,
- 216, 48, 27, 217, 35, 48, 48, 48, 35, 35, 48, 48, 48, 28, 27, 48, 217,
- 27, 77, 48, 48, 48, 48, 48, 27, 27, 216, 217, 217, 27, 48, 27, 218, 27,
- 48, 27, 182, 218, 48, 48, 219, 35, 48, 48, 44, 48, 35, 154, 154, 154,
- 154, 35, 27, 216, 35, 35, 48, 48, 220, 77, 77, 77, 77, 48, 35, 35, 35,
- 35, 27, 77, 27, 27, 46, 79, 221, 221, 221, 37, 37, 221, 221, 221, 221,
- 221, 221, 37, 37, 37, 37, 221, 222, 222, 222, 222, 222, 222, 222, 222,
- 222, 222, 222, 222, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222,
- 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 171, 171, 171, 44, 46,
- 171, 171, 171, 171, 37, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 25, 25, 25,
- 25, 25, 224, 224, 27, 27, 27, 27, 77, 27, 27, 77, 27, 27, 77, 27, 27, 27,
- 27, 27, 27, 27, 224, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 225,
- 224, 224, 27, 27, 40, 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 40, 226, 227,
- 227, 228, 77, 77, 40, 227, 228, 226, 227, 228, 226, 77, 40, 77, 227, 229,
- 230, 77, 227, 226, 77, 77, 77, 227, 226, 226, 227, 40, 227, 227, 226,
- 226, 40, 228, 40, 228, 40, 40, 40, 40, 227, 231, 220, 227, 220, 220, 226,
- 226, 226, 40, 40, 40, 40, 77, 226, 77, 226, 227, 227, 226, 226, 226, 228,
- 226, 226, 228, 226, 226, 228, 227, 228, 226, 226, 227, 77, 77, 77, 77,
- 77, 227, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 232, 40,
- 228, 77, 227, 227, 227, 227, 226, 226, 227, 227, 77, 224, 232, 232, 228,
- 228, 226, 226, 228, 228, 226, 226, 228, 228, 226, 226, 226, 226, 226,
- 226, 228, 228, 227, 227, 228, 228, 227, 227, 228, 228, 226, 226, 226, 77,
- 77, 226, 226, 226, 226, 77, 77, 40, 77, 77, 226, 40, 77, 77, 77, 77, 77,
- 77, 77, 77, 226, 226, 77, 40, 226, 226, 226, 226, 226, 226, 228, 228,
- 228, 228, 226, 226, 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77,
- 77, 226, 227, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226,
- 226, 77, 77, 226, 226, 77, 77, 77, 77, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 228, 228, 228, 228, 226, 226, 226, 226, 226, 226, 228,
- 228, 228, 228, 77, 77, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 27, 27, 27, 27, 27, 27, 27, 27, 226, 226,
- 226, 226, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 226, 226, 27, 27, 27, 27, 27, 27, 27, 233, 234, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 27, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27,
- 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77,
- 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 26, 78, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 80, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37,
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
- 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 221, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
- 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27,
- 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, 25, 25, 25, 25,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 25, 25,
- 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, 40, 27, 27,
- 27, 27, 25, 25, 27, 27, 25, 40, 27, 27, 27, 27, 25, 25, 25, 27, 27, 25,
- 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25,
- 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27,
- 27, 27, 27, 25, 25, 27, 27, 25, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27,
- 25, 25, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 27, 25, 25, 25, 25, 27, 25, 25,
- 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 27, 25, 27, 27, 27, 27, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 161, 162,
- 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 236, 236,
- 236, 236, 236, 236, 236, 236, 236, 236, 151, 151, 151, 151, 151, 151,
- 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 226, 77, 77, 226, 226, 161, 162, 77, 226,
- 226, 77, 0, 226, 0, 77, 77, 77, 77, 77, 226, 226, 226, 226, 77, 77, 77,
- 77, 77, 226, 226, 226, 77, 77, 77, 226, 226, 226, 226, 9, 10, 9, 10, 9,
- 10, 9, 10, 161, 162, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 161, 162, 9, 10, 161, 162, 161,
- 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161, 162, 161,
- 162, 77, 77, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77,
- 77, 226, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226, 226, 226, 77,
- 77, 77, 226, 77, 77, 77, 77, 226, 226, 226, 226, 226, 77, 226, 226, 77,
- 77, 161, 162, 161, 162, 226, 77, 77, 77, 77, 226, 77, 226, 226, 226, 77,
- 77, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 226, 226,
- 226, 226, 77, 77, 161, 162, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 226, 226, 220, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 77, 226, 226, 226, 226, 77, 77, 226, 77, 226,
- 77, 77, 226, 77, 226, 226, 226, 226, 77, 77, 77, 77, 77, 226, 226, 77,
- 77, 77, 77, 77, 77, 226, 226, 226, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 226, 226, 77, 77, 77, 77, 226,
- 226, 226, 226, 77, 226, 226, 77, 77, 226, 220, 210, 210, 77, 77, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 77,
- 77, 226, 226, 226, 226, 226, 226, 226, 226, 77, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226,
- 226, 226, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 237, 77, 226, 77,
- 77, 77, 226, 226, 226, 226, 226, 77, 77, 77, 77, 77, 226, 226, 226, 77,
- 77, 77, 77, 226, 77, 77, 77, 226, 226, 226, 226, 226, 77, 226, 77, 77,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 77,
- 77, 77, 77, 77, 77, 0, 0, 0, 27, 27, 27, 27, 27, 25, 25, 25, 25, 25, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 44, 46,
- 44, 44, 44, 46, 46, 44, 46, 44, 46, 44, 46, 44, 44, 44, 44, 46, 44, 46,
- 46, 44, 46, 46, 46, 46, 46, 46, 35, 50, 44, 44, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 46, 27, 27, 27, 27, 27, 27, 44, 46, 44, 46, 80, 80, 80,
- 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 151, 135, 135, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 82, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 139, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47,
- 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47,
- 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0,
- 47, 47, 47, 47, 47, 47, 47, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 223, 238, 238, 238, 238, 238,
+ 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+ 238, 238, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 30, 30, 26, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26,
+ 30, 30, 26, 26, 30, 40, 26, 26, 26, 26, 30, 30, 26, 26, 30, 40, 26, 26,
+ 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78,
+ 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26,
+ 26, 26, 30, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 30, 26,
+ 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26,
+ 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30,
+ 26, 30, 30, 30, 30, 26, 30, 30, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30,
+ 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30,
+ 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164,
+ 163, 164, 163, 164, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 228, 78, 78,
+ 228, 228, 163, 164, 78, 228, 228, 78, 228, 228, 228, 78, 78, 78, 78, 78,
+ 228, 228, 228, 228, 78, 78, 78, 78, 78, 228, 228, 228, 78, 78, 78, 228,
+ 228, 228, 228, 9, 10, 9, 10, 9, 10, 9, 10, 163, 164, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 135, 135, 29, 36, 29, 36, 135, 135, 135, 29, 36, 135, 29,
- 36, 135, 135, 135, 135, 135, 135, 135, 135, 135, 83, 135, 135, 83, 135,
- 29, 36, 135, 135, 29, 36, 161, 162, 161, 162, 161, 162, 161, 162, 135,
- 135, 135, 135, 135, 51, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 163, 164, 9, 10, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163,
+ 164, 163, 164, 163, 164, 163, 164, 78, 78, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 78, 78, 78, 78, 78, 78, 78, 78, 228, 78, 78, 78, 78, 78, 78, 78,
+ 228, 228, 228, 228, 228, 228, 78, 78, 78, 228, 78, 78, 78, 78, 228, 228,
+ 228, 228, 228, 78, 228, 228, 78, 78, 163, 164, 163, 164, 228, 78, 78, 78,
+ 78, 228, 78, 228, 228, 228, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 228, 228, 228, 228, 228, 228, 78, 78, 163, 164, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 228, 228, 222, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 78, 228, 228,
+ 228, 228, 78, 78, 228, 78, 228, 78, 78, 228, 78, 228, 228, 228, 228, 78,
+ 78, 78, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 228, 228, 228, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 228, 228, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 228, 228, 78, 78, 78, 78, 228, 228, 228, 228, 78, 228, 228, 78, 78, 228,
+ 222, 212, 212, 78, 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 78, 78, 228, 228, 228, 228, 228, 228, 228, 228,
+ 78, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 78, 78, 78,
+ 78, 78, 239, 78, 228, 78, 78, 78, 228, 228, 228, 228, 228, 78, 78, 78,
+ 78, 78, 228, 228, 228, 78, 78, 78, 78, 228, 78, 78, 78, 228, 228, 228,
+ 228, 228, 78, 228, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 26, 26, 78, 78, 78, 78, 78, 78, 0, 0, 0, 26, 26, 26, 26,
+ 26, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 0, 238, 238, 238, 238, 239, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 239, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 240, 241, 241, 241,
- 238, 242, 168, 243, 244, 245, 244, 245, 244, 245, 244, 245, 244, 245,
- 238, 238, 244, 245, 244, 245, 244, 245, 244, 245, 246, 247, 248, 248,
- 238, 243, 243, 243, 243, 243, 243, 243, 243, 243, 249, 250, 251, 252,
- 253, 253, 246, 242, 242, 242, 242, 242, 239, 238, 254, 254, 254, 242,
- 168, 241, 238, 27, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255,
- 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 168, 255, 168,
- 255, 168, 255, 168, 168, 168, 168, 168, 168, 255, 255, 168, 255, 255,
- 168, 255, 255, 168, 255, 255, 168, 255, 255, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 255, 168, 168, 0, 0, 256, 256, 257, 257, 242, 258, 259,
- 246, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 255, 168,
- 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168, 255, 168,
- 255, 168, 255, 168, 255, 168, 255, 168, 168, 255, 168, 255, 168, 255,
- 168, 168, 168, 168, 168, 168, 255, 255, 168, 255, 255, 168, 255, 255,
- 168, 255, 255, 168, 255, 255, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 255, 168, 168, 255, 255, 255, 255, 241, 242, 242, 258, 259, 0, 0, 0, 0,
- 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
- 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 0, 260, 260, 261, 261,
- 261, 261, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 239, 239, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261,
- 261, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, 239, 264, 264,
- 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 239,
- 239, 239, 260, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 264, 264, 264, 264,
- 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 239, 239, 239, 239, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 239, 239, 239,
- 239, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 239, 239, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 239, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 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, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 242, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238,
- 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 52, 52, 52, 52, 52,
- 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 135, 135,
- 135, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141,
- 141, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 47, 80, 81, 81, 81, 135, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 135, 51,
- 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46,
- 44, 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 80, 80, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0,
- 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 53, 44,
- 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 46, 44, 46, 44,
- 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44,
- 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44,
- 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44,
- 46, 44, 46, 44, 46, 50, 46, 46, 46, 46, 46, 46, 46, 46, 44, 46, 44, 46,
- 44, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 51, 265, 265, 44, 46, 44, 46,
- 0, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 46, 44, 46, 44,
- 46, 44, 46, 44, 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, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 47, 47, 47, 47, 47, 47,
- 132, 47, 47, 47, 139, 47, 47, 47, 47, 132, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136,
- 132, 132, 136, 27, 27, 27, 27, 0, 0, 0, 0, 146, 146, 146, 146, 146, 146,
- 79, 79, 145, 219, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0,
- 136, 136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136,
- 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
- 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 47, 47, 47, 47, 47, 47, 82, 82, 82,
- 47, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 132, 132, 132, 132, 132, 84, 84, 84, 82,
- 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 136, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 132, 132,
- 132, 136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 142, 136, 136, 132,
- 132, 132, 132, 136, 136, 132, 136, 136, 136, 173, 82, 82, 82, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 0, 52, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 141, 0, 0, 0, 0, 82, 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, 0, 0, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 132, 132, 132, 132, 132, 132, 136, 136, 132, 132, 136, 136, 132, 132,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 132, 47, 47, 47, 47, 47, 47, 47,
- 47, 132, 136, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0,
- 0, 82, 82, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 52, 47, 47, 47, 47, 47, 47, 79, 79, 79, 47, 136, 0, 0, 0, 0,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44,
+ 47, 44, 47, 44, 47, 44, 44, 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47,
+ 47, 47, 51, 51, 44, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26,
+ 26, 26, 26, 26, 26, 44, 47, 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0,
+ 138, 138, 138, 138, 153, 138, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 80, 47, 80, 80, 84, 47,
- 47, 80, 80, 47, 47, 47, 47, 47, 80, 80, 47, 80, 47, 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, 47, 52, 82, 82, 0,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 142, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48,
+ 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48,
+ 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48,
+ 48, 48, 48, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 138, 138, 28, 36, 28, 36, 138, 138, 138, 28, 36, 138, 28, 36, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 84, 138, 138, 84, 138, 28, 36, 138,
+ 138, 28, 36, 163, 164, 163, 164, 163, 164, 163, 164, 138, 138, 138, 138,
+ 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 0, 240, 240, 240, 240, 241, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 0, 0, 0, 0, 242, 243, 243, 243,
+ 240, 244, 170, 245, 246, 247, 246, 247, 246, 247, 246, 247, 246, 247,
+ 240, 240, 246, 247, 246, 247, 246, 247, 246, 247, 248, 249, 250, 250,
+ 240, 245, 245, 245, 245, 245, 245, 245, 245, 245, 251, 252, 253, 254,
+ 255, 255, 248, 244, 244, 244, 244, 244, 241, 240, 256, 256, 256, 244,
+ 170, 243, 240, 26, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257,
+ 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 170, 257, 170,
+ 257, 170, 257, 170, 170, 170, 170, 170, 170, 257, 257, 170, 257, 257,
+ 170, 257, 257, 170, 257, 257, 170, 257, 257, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 257, 170, 170, 0, 0, 258, 258, 259, 259, 244, 260, 261,
+ 248, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 257, 170,
+ 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170, 257, 170,
+ 257, 170, 257, 170, 257, 170, 257, 170, 170, 257, 170, 257, 170, 257,
+ 170, 170, 170, 170, 170, 170, 257, 257, 170, 257, 257, 170, 257, 257,
+ 170, 257, 257, 170, 257, 257, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 257, 170, 170, 257, 257, 257, 257, 243, 244, 244, 260, 261, 0, 0, 0, 0,
+ 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 262, 262, 263, 263,
+ 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 241, 241, 0, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, 265, 241, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 241,
+ 241, 241, 262, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 266, 266, 266, 266,
+ 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 241, 241, 241, 241, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 241, 241, 241,
+ 241, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 241, 241, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 241, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 244, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 0, 0, 0, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53,
+ 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 138, 138,
+ 138, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144,
+ 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 48, 81, 82, 82, 82, 138, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 138, 52, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 81, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 81, 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0,
+ 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47,
+ 44, 47, 44, 47, 44, 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44,
+ 47, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 52, 267, 267, 44, 47, 44,
+ 47, 0, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44,
+ 47, 44, 47, 44, 47, 44, 47, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 47, 48, 48, 48, 48,
+ 48, 48, 48, 135, 48, 48, 48, 142, 48, 48, 48, 48, 135, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 139, 139, 135, 135, 139, 26, 26, 26, 26, 0, 0, 0, 0, 148, 148, 148,
+ 148, 148, 148, 80, 80, 85, 221, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 138, 138, 138, 138, 0, 0, 0, 0,
+ 0, 0, 0, 0, 139, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 48, 48, 48, 48, 48, 48,
+ 83, 83, 83, 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 86,
+ 86, 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135,
+ 135, 135, 135, 135, 139, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0,
+ 0, 0, 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145,
+ 139, 139, 135, 135, 135, 135, 139, 139, 135, 139, 139, 139, 174, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 53, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47,
- 47, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47,
- 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 139, 139, 135, 135,
+ 139, 139, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 135, 48, 48,
+ 48, 48, 48, 48, 48, 48, 135, 139, 0, 0, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 80, 80, 80,
+ 48, 139, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81,
+ 48, 81, 81, 86, 48, 48, 81, 81, 48, 48, 48, 48, 48, 81, 81, 48, 81, 48,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135,
+ 135, 139, 139, 83, 83, 48, 53, 53, 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48,
+ 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0,
+ 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 136, 136, 132, 136, 136, 132,
- 136, 136, 82, 136, 139, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 0, 0, 0, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 168, 168, 268, 168, 268, 168, 168, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 168, 268, 168, 268, 168,
- 168, 268, 268, 168, 168, 168, 268, 268, 268, 268, 0, 0, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 139, 139, 135, 139, 139, 135, 139, 139, 83, 139,
+ 142, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0,
+ 0, 0, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 0, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 269, 270, 269,
- 271, 271, 271, 271, 271, 271, 271, 271, 271, 209, 269, 269, 269, 269,
- 269, 269, 269, 269, 269, 269, 269, 269, 269, 0, 269, 269, 269, 269, 269,
- 0, 269, 0, 269, 269, 0, 269, 269, 0, 269, 269, 269, 269, 269, 269, 269,
- 269, 269, 271, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
- 272, 272, 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 193, 273, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 274, 27, 0, 0, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 275, 275, 275, 275, 275, 275,
- 275, 276, 277, 275, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 275, 278, 278, 279, 279, 276, 277, 276, 277, 276,
- 277, 276, 277, 276, 277, 276, 277, 276, 277, 276, 277, 241, 241, 276,
- 277, 275, 275, 275, 275, 279, 279, 279, 280, 275, 280, 0, 275, 280, 275,
- 275, 278, 281, 282, 281, 282, 281, 282, 283, 275, 275, 284, 285, 286,
- 286, 287, 0, 275, 288, 283, 275, 0, 0, 0, 0, 128, 128, 128, 115, 128, 0,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 186, 0, 289, 289, 290,
- 291, 290, 289, 289, 292, 293, 289, 294, 295, 296, 295, 295, 297, 297,
- 297, 297, 297, 297, 297, 297, 297, 297, 295, 289, 298, 299, 298, 289,
- 289, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
- 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 292,
- 289, 293, 301, 302, 301, 303, 303, 303, 303, 303, 303, 303, 303, 303,
- 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
- 303, 303, 303, 292, 299, 293, 299, 292, 293, 304, 305, 306, 304, 304,
- 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 308, 307, 307, 307,
- 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
- 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
- 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
- 308, 308, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
- 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
- 307, 307, 307, 307, 307, 0, 0, 0, 307, 307, 307, 307, 307, 307, 0, 0,
- 307, 307, 307, 307, 307, 307, 0, 0, 307, 307, 307, 307, 307, 307, 0, 0,
- 307, 307, 307, 0, 0, 0, 291, 291, 299, 301, 309, 291, 291, 0, 310, 311,
- 311, 311, 311, 310, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 312, 312, 27,
- 25, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 82, 135, 79, 0, 0, 0, 0,
- 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 146, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 313, 313,
- 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
- 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
- 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
- 313, 313, 313, 313, 313, 313, 313, 313, 313, 151, 151, 151, 151, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 151, 0, 0, 0,
- 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 84, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0,
+ 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 170, 170, 270, 170, 270, 170, 170, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 170, 270, 170, 270, 170, 170, 270, 270, 170, 170,
+ 170, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 271, 272, 271, 273, 273, 273, 273,
+ 273, 273, 273, 273, 273, 211, 271, 271, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 0, 271, 271, 271, 271, 271, 0, 271, 0, 271, 271,
+ 0, 271, 271, 0, 271, 271, 271, 271, 271, 271, 271, 271, 271, 273, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 274,
+ 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 195, 275, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 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, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 276, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 277, 277, 277, 277, 277, 277, 277, 278, 279,
+ 277, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 277, 280, 280, 281, 281, 278, 279, 278, 279, 278, 279, 278, 279,
+ 278, 279, 278, 279, 278, 279, 278, 279, 243, 243, 278, 279, 277, 277,
+ 277, 277, 281, 281, 281, 282, 277, 282, 0, 277, 282, 277, 277, 280, 283,
+ 284, 283, 284, 283, 284, 285, 277, 277, 286, 287, 288, 288, 289, 0, 277,
+ 290, 285, 277, 0, 0, 0, 0, 130, 130, 130, 117, 130, 0, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 0, 0, 187, 0, 291, 291, 292, 293, 292, 291,
+ 291, 294, 295, 291, 296, 297, 298, 297, 297, 299, 299, 299, 299, 299,
+ 299, 299, 299, 299, 299, 297, 291, 300, 301, 300, 291, 291, 302, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 294, 291, 295, 303,
+ 304, 303, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305,
+ 294, 301, 295, 301, 294, 295, 306, 307, 308, 306, 306, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 310, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, 310, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 0, 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309,
+ 309, 309, 309, 0, 0, 309, 309, 309, 309, 309, 309, 0, 0, 309, 309, 309,
+ 0, 0, 0, 293, 293, 301, 303, 311, 293, 293, 0, 312, 313, 313, 313, 313,
+ 312, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, 314, 314, 26, 30, 0, 0, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 315, 315, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 153, 153, 153, 153, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 153, 0, 0, 0, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 146, 146, 146, 146, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 171, 47, 47, 47, 47, 47, 47, 47, 47, 171, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 86, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 148, 148, 148, 148, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 82, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0,
- 0, 47, 47, 47, 47, 47, 47, 47, 47, 82, 171, 171, 171, 171, 171, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 83, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48, 48, 83, 173, 173, 173, 173, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141,
- 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105,
- 105, 105, 0, 0, 105, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 0, 105, 105, 0, 0, 0, 105, 0, 0, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 0, 102, 314, 314, 314, 314, 314, 314,
- 314, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 314, 314, 314, 314, 314, 314, 0, 0, 0, 135, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 105, 132, 132, 132, 0, 132, 132, 0, 0, 0, 0, 0,
- 132, 84, 132, 80, 105, 105, 105, 105, 0, 105, 105, 105, 0, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 80, 174,
- 84, 0, 0, 0, 0, 139, 314, 314, 314, 314, 314, 314, 314, 314, 0, 0, 0, 0,
- 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0,
- 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 314, 314, 102, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 0, 0, 314, 314, 314, 314, 314, 314, 314, 314,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 314, 314, 314, 314, 314, 314,
- 314, 314, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 315, 315, 315, 315,
- 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
- 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 0, 136, 132,
- 136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 139, 82, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 151, 151, 151, 151, 151,
- 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
- 151, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 136, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47,
- 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 47, 47,
- 47, 47, 136, 136, 136, 132, 132, 132, 132, 136, 136, 139, 138, 82, 82,
- 172, 82, 82, 82, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107,
+ 107, 107, 0, 0, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 0, 104, 316, 316, 316, 316, 316, 316,
+ 316, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 316, 316, 316, 316, 316, 316, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 107, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0,
+ 135, 86, 135, 81, 107, 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 175,
+ 86, 0, 0, 0, 0, 142, 316, 316, 316, 316, 316, 316, 316, 316, 0, 0, 0, 0,
+ 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0,
+ 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 316, 316, 104, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 0, 0, 316, 316, 316, 316, 316, 316, 316, 316,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 316, 316, 316, 316, 316, 316,
+ 316, 316, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 0, 139, 135,
+ 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+ 142, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48,
+ 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 48,
+ 48, 48, 139, 139, 139, 135, 135, 135, 135, 139, 139, 142, 141, 83, 83,
+ 188, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 149, 135, 135, 135, 135,
+ 139, 135, 150, 150, 135, 135, 135, 142, 142, 0, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 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, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139,
+ 139, 135, 135, 135, 135, 135, 135, 135, 135, 135, 139, 174, 48, 48, 48,
+ 48, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 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, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 135, 139, 135, 139, 139, 135, 135, 135, 135, 135, 135,
+ 174, 145, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144,
+ 144, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 316, 316, 316, 316, 316,
- 316, 316, 317, 317, 174, 174, 174, 79, 79, 79, 318, 317, 317, 317, 317,
- 317, 186, 186, 186, 186, 186, 186, 186, 186, 84, 84, 84, 84, 84, 84, 84,
- 84, 79, 79, 80, 80, 80, 80, 80, 84, 84, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 316, 316, 316, 316, 316, 316, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 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, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 80, 80, 80, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 0, 48, 48, 0, 0, 48, 0, 0, 48,
- 48, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35,
- 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
- 0, 48, 48, 48, 48, 48, 48, 48, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48,
- 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 48, 48, 48, 48,
- 48, 48, 48, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83,
+ 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135,
+ 135, 135, 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 318, 318, 318, 318, 318, 318, 318, 319, 319,
+ 175, 175, 175, 80, 80, 80, 320, 319, 319, 319, 319, 319, 187, 187, 187,
+ 187, 187, 187, 187, 187, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81,
+ 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
+ 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 318, 318,
+ 318, 318, 318, 318, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 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, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81,
+ 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35,
+ 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49,
+ 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0,
+ 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49,
+ 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49,
+ 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49,
+ 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49,
+ 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 319, 35, 35, 35, 35, 35, 35, 35,
+ 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 319, 35, 35, 35,
+ 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222,
+ 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35,
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 220, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 319, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 220, 35, 35, 35, 35, 35, 35, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 319, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 220, 35, 35, 35, 35, 35,
- 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 319, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 220, 35,
- 35, 35, 35, 35, 35, 48, 35, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0,
- 0, 0, 0, 0, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 321, 0, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 235, 235, 263, 263, 263, 263, 263,
- 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
- 263, 263, 263, 263, 263, 263, 263, 0, 0, 0, 0, 0, 0, 263, 263, 263, 263,
- 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
- 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
- 235, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 79, 79, 262, 262, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
- 262, 262, 0, 0, 0, 0, 0, 262, 262, 262, 262, 262, 262, 262, 262, 262, 0,
- 0, 0, 0, 0, 0, 0, 262, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27,
- 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 0, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 0, 0, 0, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 0, 27, 0, 27, 0, 27,
- 0, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 0, 27, 0,
- 0, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0,
- 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268,
- 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
- 267, 267, 267, 0, 0,
+ 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 321,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222, 35, 35, 35, 35, 35, 35,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 321, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 222, 35, 35,
+ 35, 35, 35, 35, 49, 35, 0, 0, 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322,
+ 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 0, 130, 130, 0, 130, 0, 0, 130, 0, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 0, 130, 0,
+ 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 130, 0, 130, 0, 130, 0, 130, 130, 130, 0,
+ 130, 130, 0, 130, 0, 0, 130, 0, 130, 0, 130, 0, 130, 0, 130, 0, 130, 130,
+ 0, 130, 0, 0, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130,
+ 0, 130, 130, 130, 130, 0, 130, 130, 130, 130, 0, 130, 0, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 130,
+ 130, 130, 0, 130, 130, 130, 130, 130, 0, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 323, 0, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 218, 218, 0, 0, 0, 0, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 237, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 0, 0, 0,
+ 0, 0, 264, 264, 264, 264, 264, 264, 264, 264, 264, 0, 0, 0, 0, 0, 0, 0,
+ 264, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26,
+ 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0,
+ 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 0, 0, 0, 0, 0, 0, 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, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 0,
+ 0,
};
/* decomposition data */
@@ -3072,321 +3140,322 @@ static unsigned int decomp_data[] = {
50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52,
26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770,
50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49,
- 26085, 778, 103, 97, 108, 259, 42863, 256, 35912, 256, 26356, 256, 36554,
- 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, 40860, 256, 40860,
- 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, 25078, 256, 30313,
- 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, 37007, 256, 27138,
- 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, 37226, 256, 39409,
- 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, 34349, 256, 40478,
- 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, 25289, 256, 33240,
- 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, 29436, 256, 37070,
- 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, 27347, 256, 29200,
- 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, 36335, 256, 38706,
- 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, 32160, 256, 33737,
- 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, 24324, 256, 31840,
- 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, 38647, 256, 22744,
- 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, 32047, 256, 32311,
- 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, 20940, 256, 31260,
- 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, 25295, 256, 27138,
- 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, 29575, 256, 30064,
- 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, 19981, 256, 27852,
- 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, 30465, 256, 33865,
- 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, 25342, 256, 33509,
- 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, 20937, 256, 26753,
- 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, 21237, 256, 21570,
- 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, 31018, 256, 38317,
- 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, 26310, 256, 27511,
- 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, 25754, 256, 28451,
- 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, 32879, 256, 36646,
- 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, 21155, 256, 21693,
- 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, 24565, 256, 25467,
- 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, 22265, 256, 23527,
- 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, 32666, 256, 32838,
- 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, 20363, 256, 31150,
- 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, 20698, 256, 23534,
- 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, 30274, 256, 34044,
- 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, 21129, 256, 26491,
- 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, 30041, 256, 30827,
- 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, 38520, 256, 20523,
- 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, 24900, 256, 26647,
- 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, 23653, 256, 26131,
- 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, 30178, 256, 32633,
- 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, 21311, 256, 28346,
- 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, 38563, 256, 40023,
- 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, 31435, 256, 31520,
- 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, 20160, 256, 33590,
- 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, 31958, 256, 23429,
- 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, 38477, 256, 35211,
- 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, 26228, 256, 20958,
- 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, 31077, 256, 31119,
- 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, 35576, 256, 36920,
- 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, 40372, 256, 20398,
- 256, 20711, 256, 20813, 256, 21193, 256, 21220, 256, 21329, 256, 21917,
- 256, 22022, 256, 22120, 256, 22592, 256, 22696, 256, 23652, 256, 23662,
- 256, 24724, 256, 24936, 256, 24974, 256, 25074, 256, 25935, 256, 26082,
- 256, 26257, 256, 26757, 256, 28023, 256, 28186, 256, 28450, 256, 29038,
- 256, 29227, 256, 29730, 256, 30865, 256, 31038, 256, 31049, 256, 31048,
- 256, 31056, 256, 31062, 256, 31069, 256, 31117, 256, 31118, 256, 31296,
- 256, 31361, 256, 31680, 256, 32244, 256, 32265, 256, 32321, 256, 32626,
- 256, 32773, 256, 33261, 256, 33401, 256, 33401, 256, 33879, 256, 35088,
- 256, 35222, 256, 35585, 256, 35641, 256, 36051, 256, 36104, 256, 36790,
- 256, 36920, 256, 38627, 256, 38911, 256, 38971, 256, 24693, 256, 148206,
- 256, 33304, 256, 20006, 256, 20917, 256, 20840, 256, 20352, 256, 20805,
- 256, 20864, 256, 21191, 256, 21242, 256, 21917, 256, 21845, 256, 21913,
- 256, 21986, 256, 22618, 256, 22707, 256, 22852, 256, 22868, 256, 23138,
- 256, 23336, 256, 24274, 256, 24281, 256, 24425, 256, 24493, 256, 24792,
- 256, 24910, 256, 24840, 256, 24974, 256, 24928, 256, 25074, 256, 25140,
- 256, 25540, 256, 25628, 256, 25682, 256, 25942, 256, 26228, 256, 26391,
- 256, 26395, 256, 26454, 256, 27513, 256, 27578, 256, 27969, 256, 28379,
- 256, 28363, 256, 28450, 256, 28702, 256, 29038, 256, 30631, 256, 29237,
- 256, 29359, 256, 29482, 256, 29809, 256, 29958, 256, 30011, 256, 30237,
- 256, 30239, 256, 30410, 256, 30427, 256, 30452, 256, 30538, 256, 30528,
- 256, 30924, 256, 31409, 256, 31680, 256, 31867, 256, 32091, 256, 32244,
- 256, 32574, 256, 32773, 256, 33618, 256, 33775, 256, 34681, 256, 35137,
- 256, 35206, 256, 35222, 256, 35519, 256, 35576, 256, 35531, 256, 35585,
- 256, 35582, 256, 35565, 256, 35641, 256, 35722, 256, 36104, 256, 36664,
- 256, 36978, 256, 37273, 256, 37494, 256, 38524, 256, 38627, 256, 38742,
- 256, 38875, 256, 38911, 256, 38923, 256, 38971, 256, 39698, 256, 40860,
- 256, 141386, 256, 141380, 256, 144341, 256, 15261, 256, 16408, 256,
- 16441, 256, 152137, 256, 154832, 256, 163539, 256, 40771, 256, 40846,
- 514, 102, 102, 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, 770,
- 102, 102, 108, 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, 1396,
- 1381, 514, 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460,
- 512, 1522, 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499,
- 262, 1500, 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473,
- 512, 1513, 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, 1463,
- 512, 1488, 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512,
- 1491, 1468, 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496,
- 1468, 512, 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468,
- 512, 1502, 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512,
- 1508, 1468, 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513,
- 1468, 512, 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471,
- 512, 1508, 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268,
- 1659, 269, 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662,
- 267, 1664, 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269,
- 1658, 270, 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657,
- 268, 1657, 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270,
- 1700, 267, 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668,
- 269, 1668, 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267,
- 1670, 268, 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671,
- 270, 1671, 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268,
- 1678, 267, 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681,
- 267, 1705, 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269,
- 1711, 270, 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713,
- 268, 1713, 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268,
- 1723, 269, 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729,
- 269, 1729, 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267,
- 1746, 268, 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709,
- 270, 1709, 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268,
- 1736, 267, 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737,
- 268, 1737, 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270,
- 1609, 523, 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749,
- 523, 1574, 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523,
- 1574, 1734, 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574,
- 1744, 524, 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609,
- 525, 1574, 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574,
- 1580, 523, 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610,
- 523, 1576, 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523,
- 1576, 1609, 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578,
- 1582, 523, 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580,
- 523, 1579, 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523,
- 1580, 1605, 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582,
- 1581, 523, 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582,
- 523, 1587, 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523,
- 1590, 1581, 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591,
- 1605, 523, 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580,
- 523, 1594, 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523,
- 1601, 1605, 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602,
- 1605, 523, 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580,
- 523, 1603, 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523,
- 1603, 1609, 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604,
- 1582, 523, 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580,
- 523, 1605, 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523,
- 1605, 1610, 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606,
- 1605, 523, 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605,
- 523, 1607, 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523,
- 1610, 1582, 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584,
- 1648, 523, 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32,
- 1613, 1617, 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616,
- 1617, 779, 32, 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574,
- 1605, 524, 1574, 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585,
- 524, 1576, 1586, 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524,
- 1576, 1610, 524, 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578,
- 1606, 524, 1578, 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586,
- 524, 1579, 1605, 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524,
- 1601, 1609, 524, 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603,
- 1575, 524, 1603, 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610,
- 524, 1604, 1605, 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524,
- 1605, 1605, 524, 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606,
- 1606, 524, 1606, 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585,
- 524, 1610, 1586, 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524,
- 1610, 1610, 525, 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574,
- 1605, 525, 1574, 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582,
- 525, 1576, 1605, 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525,
- 1578, 1582, 525, 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580,
- 1581, 525, 1580, 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580,
- 525, 1582, 1605, 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525,
- 1587, 1605, 525, 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590,
- 1580, 525, 1590, 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581,
- 525, 1592, 1605, 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525,
- 1594, 1605, 525, 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601,
- 1605, 525, 1602, 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581,
- 525, 1603, 1582, 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525,
- 1604, 1581, 525, 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605,
- 1580, 525, 1605, 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580,
- 525, 1606, 1581, 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525,
- 1607, 1580, 525, 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610,
- 1581, 525, 1610, 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605,
- 526, 1574, 1607, 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526,
- 1578, 1607, 526, 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587,
- 1607, 526, 1588, 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605,
- 526, 1604, 1605, 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526,
- 1610, 1607, 782, 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600,
- 1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593,
- 1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610,
- 523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523,
- 1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589,
- 1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580,
- 523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523,
- 1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591,
- 1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610,
- 524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524,
- 1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582,
- 1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609,
- 524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524,
- 1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590,
- 1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605,
- 525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526,
- 1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588,
- 1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611,
- 781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781,
- 1578, 1581, 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781,
- 1578, 1605, 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781,
- 1580, 1605, 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781,
- 1587, 1581, 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780,
- 1587, 1605, 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780,
- 1587, 1605, 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781,
- 1589, 1581, 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781,
- 1588, 1581, 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781,
- 1588, 1605, 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780,
- 1590, 1581, 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780,
- 1591, 1605, 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780,
- 1591, 1605, 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781,
- 1593, 1605, 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780,
- 1594, 1605, 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781,
- 1601, 1582, 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780,
- 1604, 1581, 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781,
- 1604, 1580, 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781,
- 1604, 1582, 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781,
- 1605, 1581, 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781,
- 1605, 1580, 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781,
- 1605, 1582, 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781,
- 1607, 1605, 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780,
- 1606, 1580, 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780,
- 1606, 1605, 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781,
- 1610, 1605, 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780,
- 1578, 1580, 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780,
- 1578, 1605, 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780,
- 1580, 1581, 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780,
- 1589, 1581, 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780,
- 1604, 1580, 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780,
- 1610, 1580, 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780,
- 1602, 1605, 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781,
- 1604, 1581, 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781,
- 1606, 1580, 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780,
- 1603, 1605, 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780,
- 1580, 1581, 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780,
- 1601, 1605, 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781,
- 1593, 1580, 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780,
- 1606, 1580, 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035,
- 1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581,
- 1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604,
- 1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589,
- 1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593,
- 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580,
- 1604, 1575, 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265,
- 12289, 265, 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265,
- 12311, 265, 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265,
- 40, 265, 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265,
- 12305, 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265,
- 12301, 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254,
- 258, 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289,
- 271, 46, 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41,
- 271, 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42,
- 271, 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37,
- 271, 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613,
- 523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32,
- 1616, 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618,
- 526, 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571,
- 267, 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269,
- 1574, 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576,
- 270, 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270,
- 1578, 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580,
- 269, 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267,
- 1582, 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584,
- 268, 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268,
- 1587, 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588,
- 267, 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269,
- 1590, 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592,
- 268, 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270,
- 1593, 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601,
- 269, 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267,
- 1603, 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604,
- 270, 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268,
- 1606, 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607,
- 267, 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269,
- 1610, 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524,
- 1604, 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604,
- 1575, 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264,
- 40, 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264,
- 48, 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264,
- 56, 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264,
- 64, 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264,
- 72, 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264,
- 80, 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264,
- 88, 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264,
- 96, 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103,
- 264, 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110,
- 264, 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117,
- 264, 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124,
- 264, 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272,
- 12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272,
- 12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272,
- 12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272,
- 12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272,
- 12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272,
- 12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272,
- 12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272,
- 12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272,
- 12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272,
- 12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272,
- 12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272,
- 12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272,
- 12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272,
- 12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272,
- 12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272,
- 12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272,
- 12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272,
- 12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272,
- 12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264,
- 163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272,
- 8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 69785,
- 69818, 512, 69787, 69818, 512, 69797, 69818, 512, 119127, 119141, 512,
- 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135,
- 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141,
- 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512,
- 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68,
- 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76,
- 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84,
- 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98,
- 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262,
- 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262,
- 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262,
- 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69,
- 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77,
- 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85,
- 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99,
- 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107,
+ 26085, 778, 103, 97, 108, 259, 42863, 259, 294, 259, 339, 256, 35912,
+ 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477,
+ 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856,
+ 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064,
+ 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853,
+ 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211,
+ 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172,
+ 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010,
+ 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796,
+ 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396,
+ 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103,
+ 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751,
+ 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034,
+ 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431,
+ 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956,
+ 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712,
+ 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594,
+ 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489,
+ 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622,
+ 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784,
+ 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841,
+ 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327,
+ 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670,
+ 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147,
+ 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088,
+ 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244,
+ 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015,
+ 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265,
+ 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196,
+ 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801,
+ 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936,
+ 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102,
+ 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134,
+ 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446,
+ 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705,
+ 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134,
+ 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459,
+ 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519,
+ 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702,
+ 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626,
+ 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298,
+ 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256,
+ 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672,
+ 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299,
+ 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892,
+ 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618,
+ 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070,
+ 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322,
+ 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208,
+ 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813,
+ 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120,
+ 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936,
+ 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757,
+ 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730,
+ 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062,
+ 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680,
+ 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261,
+ 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585,
+ 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627,
+ 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006,
+ 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191,
+ 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618,
+ 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274,
+ 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840,
+ 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628,
+ 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454,
+ 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450,
+ 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482,
+ 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410,
+ 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409,
+ 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773,
+ 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222,
+ 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565,
+ 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273,
+ 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911,
+ 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380,
+ 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256,
+ 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102,
+ 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383,
+ 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387,
+ 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262,
+ 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501,
+ 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512,
+ 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512,
+ 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492,
+ 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468,
+ 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512,
+ 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510,
+ 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468,
+ 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514,
+ 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270,
+ 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664,
+ 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267,
+ 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657,
+ 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268,
+ 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668,
+ 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269,
+ 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677,
+ 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268,
+ 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705,
+ 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267,
+ 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713,
+ 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270,
+ 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729,
+ 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267,
+ 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735,
+ 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267,
+ 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744,
+ 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575,
+ 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524,
+ 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574,
+ 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744,
+ 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267,
+ 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581,
+ 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523,
+ 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576,
+ 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605,
+ 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523,
+ 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581,
+ 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605,
+ 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523,
+ 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590,
+ 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605,
+ 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523,
+ 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601,
+ 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609,
+ 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523,
+ 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603,
+ 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605,
+ 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523,
+ 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606,
+ 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609,
+ 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523,
+ 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610,
+ 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648,
+ 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614,
+ 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524,
+ 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574,
+ 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605,
+ 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524,
+ 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578,
+ 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606,
+ 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524,
+ 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603,
+ 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609,
+ 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524,
+ 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606,
+ 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605,
+ 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525,
+ 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576,
+ 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607,
+ 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525,
+ 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581,
+ 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580,
+ 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525,
+ 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590,
+ 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580,
+ 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525,
+ 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602,
+ 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604,
+ 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525,
+ 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605,
+ 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582,
+ 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525,
+ 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610,
+ 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605,
+ 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526,
+ 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588,
+ 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605,
+ 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617,
+ 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591,
+ 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610,
+ 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523,
+ 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582,
+ 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609,
+ 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523,
+ 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590,
+ 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610,
+ 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524,
+ 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580,
+ 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609,
+ 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524,
+ 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587,
+ 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581,
+ 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525,
+ 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588,
+ 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605,
+ 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581,
+ 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582,
+ 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605,
+ 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605,
+ 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580,
+ 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605,
+ 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605,
+ 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605,
+ 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580,
+ 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605,
+ 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582,
+ 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605,
+ 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580,
+ 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605,
+ 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605,
+ 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605,
+ 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581,
+ 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580,
+ 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605,
+ 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581,
+ 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580,
+ 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580,
+ 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581,
+ 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580,
+ 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605,
+ 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582,
+ 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582,
+ 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605,
+ 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605,
+ 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581,
+ 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605,
+ 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605,
+ 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581,
+ 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605,
+ 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582,
+ 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580,
+ 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580,
+ 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581,
+ 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605,
+ 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604,
+ 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575,
+ 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593,
+ 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035,
+ 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609,
+ 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587,
+ 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035,
+ 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265,
+ 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265,
+ 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125,
+ 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299,
+ 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303,
+ 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95,
+ 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271,
+ 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308,
+ 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271,
+ 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526,
+ 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614,
+ 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32,
+ 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267,
+ 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573,
+ 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268,
+ 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577,
+ 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269,
+ 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581,
+ 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270,
+ 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585,
+ 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267,
+ 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589,
+ 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268,
+ 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592,
+ 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269,
+ 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602,
+ 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270,
+ 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605,
+ 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267,
+ 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609,
+ 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570,
+ 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524,
+ 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35,
+ 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43,
+ 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51,
+ 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59,
+ 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67,
+ 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75,
+ 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83,
+ 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91,
+ 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99,
+ 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106,
+ 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113,
+ 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120,
+ 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629,
+ 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539,
+ 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457,
+ 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450,
+ 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461,
+ 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473,
+ 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486,
+ 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494,
+ 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510,
+ 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518,
+ 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525,
+ 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593,
+ 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599,
+ 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605,
+ 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611,
+ 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617,
+ 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623,
+ 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629,
+ 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635,
+ 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641,
+ 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166,
+ 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272,
+ 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512,
+ 69797, 69818, 512, 69937, 69927, 512, 69938, 69927, 512, 119127, 119141,
+ 512, 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512,
+ 119135, 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225,
+ 119141, 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150,
+ 512, 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262,
+ 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262,
+ 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262,
+ 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262,
+ 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105,
+ 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112,
+ 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119,
+ 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262,
+ 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262,
+ 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262,
+ 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262,
+ 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107,
262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114,
262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121,
262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71,
@@ -3510,20 +3579,42 @@ static unsigned int decomp_data[] = {
52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262,
50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262,
48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262,
- 56, 262, 57, 514, 48, 46, 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51,
- 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514,
- 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68,
- 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41,
- 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770,
- 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40,
- 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85,
- 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41,
- 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68,
- 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266,
- 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266,
- 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266,
- 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68,
- 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 522, 68, 74, 522, 12411,
+ 56, 262, 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262,
+ 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605,
+ 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262,
+ 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590,
+ 262, 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262,
+ 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604,
+ 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262,
+ 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594,
+ 262, 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262,
+ 1593, 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594,
+ 262, 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262,
+ 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593,
+ 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262,
+ 1582, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575,
+ 262, 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262,
+ 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587,
+ 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262,
+ 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594,
+ 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262,
+ 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593,
+ 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262,
+ 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46,
+ 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53,
+ 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41,
+ 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770,
+ 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40,
+ 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78,
+ 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41,
+ 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770,
+ 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770,
+ 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65,
+ 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73,
+ 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81,
+ 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89,
+ 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80,
+ 86, 522, 87, 67, 515, 77, 67, 515, 77, 68, 522, 68, 74, 522, 12411,
12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452,
266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132,
266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877,
@@ -3643,7 +3734,7 @@ static unsigned char decomp_index1[] = {
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 36, 37, 38, 39, 40,
- 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 7, 7, 7, 7, 7, 7,
+ 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
@@ -3651,9 +3742,9 @@ static unsigned char decomp_index1[] = {
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 7, 7, 44, 45,
- 46, 47, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 48, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 44, 7, 7, 45,
+ 46, 47, 48, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 49, 7, 7, 50, 51, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
@@ -3664,7 +3755,7 @@ static unsigned char decomp_index1[] = {
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 50, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 52, 53, 54, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
@@ -3813,7 +3904,7 @@ static unsigned char decomp_index1[] = {
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
static unsigned short decomp_index2[] = {
@@ -4282,761 +4373,789 @@ static unsigned short decomp_index2[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 6648, 6650, 6652, 6654, 6656, 6658, 6660, 6662,
- 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, 6686,
- 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, 6710,
- 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734,
- 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 6758,
- 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782,
- 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, 6806,
- 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830,
- 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, 6854,
- 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878,
- 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902,
- 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926,
- 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, 6950,
- 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974,
- 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, 6998,
- 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022,
- 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, 7046,
- 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070,
- 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, 7094,
- 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118,
- 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, 7142,
- 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166,
- 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 0, 0, 7188,
- 0, 7190, 0, 0, 7192, 7194, 7196, 7198, 7200, 7202, 7204, 7206, 7208,
- 7210, 0, 7212, 0, 7214, 0, 0, 7216, 7218, 0, 0, 0, 7220, 7222, 7224,
- 7226, 0, 0, 7228, 7230, 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246,
- 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270,
- 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294,
- 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318,
- 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342,
- 7344, 7346, 7348, 7350, 0, 0, 7352, 7354, 7356, 7358, 7360, 7362, 7364,
- 7366, 7368, 7370, 7372, 7374, 7376, 7378, 7380, 7382, 7384, 7386, 7388,
- 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, 7406, 7408, 7410, 7412,
- 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, 7432, 7434, 7436,
- 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, 7454, 7456, 7458, 7460,
- 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, 7480, 7482, 7484,
- 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, 7502, 7504, 7506, 7508,
- 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, 7528, 7530, 7532,
- 7534, 7536, 7538, 7540, 7542, 7544, 7546, 7548, 7550, 7552, 7554, 7556,
- 7558, 7560, 7562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7564, 7567,
- 7570, 7573, 7577, 7581, 7584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7587,
- 7590, 7593, 7596, 7599, 0, 0, 0, 0, 0, 7602, 0, 7605, 7608, 7610, 7612,
- 7614, 7616, 7618, 7620, 7622, 7624, 7626, 7628, 7631, 7634, 7637, 7640,
- 7643, 7646, 7649, 7652, 7655, 7658, 7661, 7664, 0, 7667, 7670, 7673,
- 7676, 7679, 0, 7682, 0, 7685, 7688, 0, 7691, 7694, 0, 7697, 7700, 7703,
- 7706, 7709, 7712, 7715, 7718, 7721, 7724, 7727, 7729, 7731, 7733, 7735,
- 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, 7757, 7759,
- 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781, 7783,
- 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807,
- 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831,
- 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855,
- 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879,
- 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903,
- 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7937, 7939, 7941,
- 7943, 7945, 7947, 7949, 7951, 7953, 7955, 7957, 7959, 7961, 7963, 7965,
- 7967, 7969, 7972, 7975, 7978, 7981, 7984, 7987, 7990, 7993, 7996, 7999,
- 8002, 8005, 8008, 8011, 8014, 8017, 8020, 8023, 8025, 8027, 8029, 8031,
- 8034, 8037, 8040, 8043, 8046, 8049, 8052, 8055, 8058, 8061, 8064, 8067,
- 8070, 8073, 8076, 8079, 8082, 8085, 8088, 8091, 8094, 8097, 8100, 8103,
- 8106, 8109, 8112, 8115, 8118, 8121, 8124, 8127, 8130, 8133, 8136, 8139,
- 8142, 8145, 8148, 8151, 8154, 8157, 8160, 8163, 8166, 8169, 8172, 8175,
- 8178, 8181, 8184, 8187, 8190, 8193, 8196, 8199, 8202, 8205, 8208, 8211,
- 8214, 8217, 8220, 8223, 8226, 8229, 8232, 8235, 8238, 8241, 8244, 8247,
- 8250, 8253, 8256, 8259, 8262, 8265, 8268, 8271, 8274, 8277, 8280, 8283,
- 8286, 8289, 8292, 8295, 8298, 8301, 8304, 8307, 8310, 8313, 8317, 8321,
- 8325, 8329, 8333, 8337, 8340, 8343, 8346, 8349, 8352, 8355, 8358, 8361,
- 8364, 8367, 8370, 8373, 8376, 8379, 8382, 8385, 8388, 8391, 8394, 8397,
- 8400, 8403, 8406, 8409, 8412, 8415, 8418, 8421, 8424, 8427, 8430, 8433,
- 8436, 8439, 8442, 8445, 8448, 8451, 8454, 8457, 8460, 8463, 8466, 8469,
- 8472, 8475, 8478, 8481, 8484, 8487, 8490, 8493, 8496, 8499, 8502, 8505,
- 8508, 8511, 8514, 8517, 8520, 8523, 8526, 8529, 8532, 8535, 8538, 8541,
- 8544, 8547, 8550, 8553, 8556, 8559, 8562, 8565, 8568, 8571, 8574, 8577,
- 8580, 8583, 8586, 8589, 8592, 8595, 8598, 8601, 8604, 8607, 8610, 8613,
- 8616, 8619, 8622, 8625, 8628, 8631, 8634, 8637, 8640, 8643, 8646, 8649,
- 8652, 8655, 8658, 8661, 8664, 8667, 8670, 8673, 8676, 8679, 8682, 8685,
- 8688, 8691, 8694, 8697, 8700, 8703, 8706, 8709, 8712, 8715, 8718, 8721,
- 8724, 8727, 8730, 8733, 8736, 8739, 8742, 8745, 8748, 8751, 8754, 8757,
- 8760, 8763, 8767, 8771, 8775, 8778, 8781, 8784, 8787, 8790, 8793, 8796,
- 8799, 8802, 8805, 8808, 8811, 8814, 8817, 8820, 8823, 8826, 8829, 8832,
- 8835, 8838, 8841, 8844, 8847, 8850, 8853, 8856, 8859, 8862, 8865, 8868,
- 8871, 8874, 8877, 8880, 8883, 8886, 8889, 8892, 8895, 8898, 8901, 8904,
- 8907, 8910, 8913, 8916, 8919, 8922, 8925, 8928, 8931, 8934, 8937, 8940,
- 8943, 8946, 8949, 8952, 8955, 8958, 8961, 8964, 8967, 8970, 8973, 8976,
- 8979, 8982, 8985, 8988, 8991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8994, 8998, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6648, 6650, 0, 0, 0, 0, 0, 0, 6652, 6654, 6656, 6658, 6660, 6662, 6664,
+ 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, 6686, 6688,
+ 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, 6710, 6712,
+ 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, 6736,
+ 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 6758, 6760,
+ 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782, 6784,
+ 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, 6806, 6808,
+ 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830, 6832,
+ 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, 6854, 6856,
+ 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878, 6880,
+ 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902, 6904,
+ 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926, 6928,
+ 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, 6950, 6952,
+ 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974, 6976,
+ 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, 6998, 7000,
+ 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022, 7024,
+ 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, 7046, 7048,
+ 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070, 7072,
+ 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, 7094, 7096,
+ 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118, 7120,
+ 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, 7142, 7144,
+ 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166, 7168,
+ 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 7188, 7190, 0, 0,
+ 7192, 0, 7194, 0, 0, 7196, 7198, 7200, 7202, 7204, 7206, 7208, 7210,
+ 7212, 7214, 0, 7216, 0, 7218, 0, 0, 7220, 7222, 0, 0, 0, 7224, 7226,
+ 7228, 7230, 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246, 7248, 7250,
+ 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, 7272, 7274,
+ 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, 7296, 7298,
+ 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318, 7320, 7322,
+ 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, 7344, 7346,
+ 7348, 7350, 7352, 7354, 7356, 7358, 0, 0, 7360, 7362, 7364, 7366, 7368,
+ 7370, 7372, 7374, 7376, 7378, 7380, 7382, 7384, 7386, 7388, 7390, 7392,
+ 7394, 7396, 7398, 7400, 7402, 7404, 7406, 7408, 7410, 7412, 7414, 7416,
+ 7418, 7420, 7422, 7424, 7426, 7428, 7430, 7432, 7434, 7436, 7438, 7440,
+ 7442, 7444, 7446, 7448, 7450, 7452, 7454, 7456, 7458, 7460, 7462, 7464,
+ 7466, 7468, 7470, 7472, 7474, 7476, 7478, 7480, 7482, 7484, 7486, 7488,
+ 7490, 7492, 7494, 7496, 7498, 7500, 7502, 7504, 7506, 7508, 7510, 7512,
+ 7514, 7516, 7518, 7520, 7522, 7524, 7526, 7528, 7530, 7532, 7534, 7536,
+ 7538, 7540, 7542, 7544, 7546, 7548, 7550, 7552, 7554, 7556, 7558, 7560,
+ 7562, 7564, 7566, 7568, 7570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7572, 7575, 7578, 7581, 7585, 7589, 7592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7595, 7598, 7601, 7604, 7607, 0, 0, 0, 0, 0, 7610, 0, 7613, 7616,
+ 7618, 7620, 7622, 7624, 7626, 7628, 7630, 7632, 7634, 7636, 7639, 7642,
+ 7645, 7648, 7651, 7654, 7657, 7660, 7663, 7666, 7669, 7672, 0, 7675,
+ 7678, 7681, 7684, 7687, 0, 7690, 0, 7693, 7696, 0, 7699, 7702, 0, 7705,
+ 7708, 7711, 7714, 7717, 7720, 7723, 7726, 7729, 7732, 7735, 7737, 7739,
+ 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, 7757, 7759, 7761, 7763,
+ 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781, 7783, 7785, 7787,
+ 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807, 7809, 7811,
+ 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831, 7833, 7835,
+ 7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859,
+ 7861, 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 7881, 7883,
+ 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907,
+ 7909, 7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925, 7927, 7929, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7931, 7933, 7935, 7937, 7939, 7941, 7943, 7945,
+ 7947, 7949, 7951, 7953, 7955, 7957, 7959, 7961, 7963, 7965, 7967, 7969,
+ 7971, 7973, 7975, 7977, 7980, 7983, 7986, 7989, 7992, 7995, 7998, 8001,
+ 8004, 8007, 8010, 8013, 8016, 8019, 8022, 8025, 8028, 8031, 8033, 8035,
+ 8037, 8039, 8042, 8045, 8048, 8051, 8054, 8057, 8060, 8063, 8066, 8069,
+ 8072, 8075, 8078, 8081, 8084, 8087, 8090, 8093, 8096, 8099, 8102, 8105,
+ 8108, 8111, 8114, 8117, 8120, 8123, 8126, 8129, 8132, 8135, 8138, 8141,
+ 8144, 8147, 8150, 8153, 8156, 8159, 8162, 8165, 8168, 8171, 8174, 8177,
+ 8180, 8183, 8186, 8189, 8192, 8195, 8198, 8201, 8204, 8207, 8210, 8213,
+ 8216, 8219, 8222, 8225, 8228, 8231, 8234, 8237, 8240, 8243, 8246, 8249,
+ 8252, 8255, 8258, 8261, 8264, 8267, 8270, 8273, 8276, 8279, 8282, 8285,
+ 8288, 8291, 8294, 8297, 8300, 8303, 8306, 8309, 8312, 8315, 8318, 8321,
+ 8325, 8329, 8333, 8337, 8341, 8345, 8348, 8351, 8354, 8357, 8360, 8363,
+ 8366, 8369, 8372, 8375, 8378, 8381, 8384, 8387, 8390, 8393, 8396, 8399,
+ 8402, 8405, 8408, 8411, 8414, 8417, 8420, 8423, 8426, 8429, 8432, 8435,
+ 8438, 8441, 8444, 8447, 8450, 8453, 8456, 8459, 8462, 8465, 8468, 8471,
+ 8474, 8477, 8480, 8483, 8486, 8489, 8492, 8495, 8498, 8501, 8504, 8507,
+ 8510, 8513, 8516, 8519, 8522, 8525, 8528, 8531, 8534, 8537, 8540, 8543,
+ 8546, 8549, 8552, 8555, 8558, 8561, 8564, 8567, 8570, 8573, 8576, 8579,
+ 8582, 8585, 8588, 8591, 8594, 8597, 8600, 8603, 8606, 8609, 8612, 8615,
+ 8618, 8621, 8624, 8627, 8630, 8633, 8636, 8639, 8642, 8645, 8648, 8651,
+ 8654, 8657, 8660, 8663, 8666, 8669, 8672, 8675, 8678, 8681, 8684, 8687,
+ 8690, 8693, 8696, 8699, 8702, 8705, 8708, 8711, 8714, 8717, 8720, 8723,
+ 8726, 8729, 8732, 8735, 8738, 8741, 8744, 8747, 8750, 8753, 8756, 8759,
+ 8762, 8765, 8768, 8771, 8775, 8779, 8783, 8786, 8789, 8792, 8795, 8798,
+ 8801, 8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, 8831, 8834,
+ 8837, 8840, 8843, 8846, 8849, 8852, 8855, 8858, 8861, 8864, 8867, 8870,
+ 8873, 8876, 8879, 8882, 8885, 8888, 8891, 8894, 8897, 8900, 8903, 8906,
+ 8909, 8912, 8915, 8918, 8921, 8924, 8927, 8930, 8933, 8936, 8939, 8942,
+ 8945, 8948, 8951, 8954, 8957, 8960, 8963, 8966, 8969, 8972, 8975, 8978,
+ 8981, 8984, 8987, 8990, 8993, 8996, 8999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030,
9034, 9038, 9042, 9046, 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078,
9082, 9086, 9090, 9094, 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126,
9130, 9134, 9138, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174,
9178, 9182, 9186, 9190, 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222,
- 9226, 9230, 9234, 9238, 9242, 9246, 0, 0, 9250, 9254, 9258, 9262, 9266,
+ 9226, 9230, 9234, 9238, 9242, 9246, 9250, 9254, 0, 0, 9258, 9262, 9266,
9270, 9274, 9278, 9282, 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314,
9318, 9322, 9326, 9330, 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362,
9366, 9370, 9374, 9378, 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410,
9414, 9418, 9422, 9426, 9430, 9434, 9438, 9442, 9446, 9450, 9454, 9458,
- 9462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9466, 9470, 9474,
- 9479, 9484, 9489, 9494, 9499, 9504, 9509, 9513, 9532, 9541, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9546, 9548, 9550, 9552,
- 9554, 9556, 9558, 9560, 9562, 9564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9566, 9568, 9570, 9572, 9574, 9576, 9578,
- 9580, 9582, 9584, 9586, 9588, 9590, 9592, 9594, 9596, 9598, 9600, 9602,
- 9604, 9606, 0, 0, 9608, 9610, 9612, 9614, 9616, 9618, 9620, 9622, 9624,
- 9626, 9628, 9630, 0, 9632, 9634, 9636, 9638, 9640, 9642, 9644, 9646,
- 9648, 9650, 9652, 9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 0,
- 9670, 9672, 9674, 9676, 0, 0, 0, 0, 9678, 9681, 9684, 0, 9687, 0, 9690,
- 9693, 9696, 9699, 9702, 9705, 9708, 9711, 9714, 9717, 9720, 9722, 9724,
- 9726, 9728, 9730, 9732, 9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748,
- 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772,
- 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796,
- 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820,
- 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, 9838, 9840, 9842, 9844,
- 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, 9862, 9864, 9866, 9868,
- 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, 9886, 9888, 9890, 9892,
- 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916,
- 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, 9934, 9936, 9938, 9940,
- 9942, 9944, 9946, 9948, 9950, 9952, 9954, 9957, 9960, 9963, 9966, 9969,
- 9972, 9975, 0, 0, 0, 0, 9978, 9980, 9982, 9984, 9986, 9988, 9990, 9992,
- 9994, 9996, 9998, 10000, 10002, 10004, 10006, 10008, 10010, 10012, 10014,
- 10016, 10018, 10020, 10022, 10024, 10026, 10028, 10030, 10032, 10034,
- 10036, 10038, 10040, 10042, 10044, 10046, 10048, 10050, 10052, 10054,
- 10056, 10058, 10060, 10062, 10064, 10066, 10068, 10070, 10072, 10074,
- 10076, 10078, 10080, 10082, 10084, 10086, 10088, 10090, 10092, 10094,
- 10096, 10098, 10100, 10102, 10104, 10106, 10108, 10110, 10112, 10114,
- 10116, 10118, 10120, 10122, 10124, 10126, 10128, 10130, 10132, 10134,
- 10136, 10138, 10140, 10142, 10144, 10146, 10148, 10150, 10152, 10154,
- 10156, 10158, 10160, 10162, 10164, 10166, 10168, 10170, 10172, 10174,
- 10176, 10178, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194,
- 10196, 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214,
- 10216, 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234,
- 10236, 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254,
- 10256, 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274,
- 10276, 10278, 10280, 10282, 10284, 10286, 10288, 10290, 10292, 10294,
- 10296, 10298, 10300, 10302, 10304, 10306, 10308, 10310, 10312, 10314,
- 10316, 10318, 10320, 10322, 10324, 10326, 10328, 10330, 10332, 10334,
- 10336, 10338, 10340, 10342, 10344, 10346, 10348, 10350, 10352, 10354,
- 10356, 0, 0, 0, 10358, 10360, 10362, 10364, 10366, 10368, 0, 0, 10370,
- 10372, 10374, 10376, 10378, 10380, 0, 0, 10382, 10384, 10386, 10388,
- 10390, 10392, 0, 0, 10394, 10396, 10398, 0, 0, 0, 10400, 10402, 10404,
- 10406, 10408, 10410, 10412, 0, 10414, 10416, 10418, 10420, 10422, 10424,
- 10426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10428, 0, 10431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 10434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10437, 10440, 10443, 10446, 10449,
- 10452, 10455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10458, 10461,
- 10464, 10467, 10470, 10473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 10476, 10478, 10480, 10482, 10484, 10486, 10488, 10490, 10492, 10494,
- 10496, 10498, 10500, 10502, 10504, 10506, 10508, 10510, 10512, 10514,
- 10516, 10518, 10520, 10522, 10524, 10526, 10528, 10530, 10532, 10534,
- 10536, 10538, 10540, 10542, 10544, 10546, 10548, 10550, 10552, 10554,
- 10556, 10558, 10560, 10562, 10564, 10566, 10568, 10570, 10572, 10574,
- 10576, 10578, 10580, 10582, 10584, 10586, 10588, 10590, 10592, 10594,
- 10596, 10598, 10600, 10602, 10604, 10606, 10608, 10610, 10612, 10614,
- 10616, 10618, 10620, 10622, 10624, 10626, 10628, 10630, 10632, 10634,
- 10636, 10638, 10640, 10642, 10644, 0, 10646, 10648, 10650, 10652, 10654,
- 10656, 10658, 10660, 10662, 10664, 10666, 10668, 10670, 10672, 10674,
- 10676, 10678, 10680, 10682, 10684, 10686, 10688, 10690, 10692, 10694,
- 10696, 10698, 10700, 10702, 10704, 10706, 10708, 10710, 10712, 10714,
- 10716, 10718, 10720, 10722, 10724, 10726, 10728, 10730, 10732, 10734,
- 10736, 10738, 10740, 10742, 10744, 10746, 10748, 10750, 10752, 10754,
- 10756, 10758, 10760, 10762, 10764, 10766, 10768, 10770, 10772, 10774,
- 10776, 10778, 10780, 10782, 10784, 10786, 0, 10788, 10790, 0, 0, 10792,
- 0, 0, 10794, 10796, 0, 0, 10798, 10800, 10802, 10804, 0, 10806, 10808,
- 10810, 10812, 10814, 10816, 10818, 10820, 10822, 10824, 10826, 10828, 0,
- 10830, 0, 10832, 10834, 10836, 10838, 10840, 10842, 10844, 0, 10846,
- 10848, 10850, 10852, 10854, 10856, 10858, 10860, 10862, 10864, 10866,
- 10868, 10870, 10872, 10874, 10876, 10878, 10880, 10882, 10884, 10886,
- 10888, 10890, 10892, 10894, 10896, 10898, 10900, 10902, 10904, 10906,
- 10908, 10910, 10912, 10914, 10916, 10918, 10920, 10922, 10924, 10926,
- 10928, 10930, 10932, 10934, 10936, 10938, 10940, 10942, 10944, 10946,
- 10948, 10950, 10952, 10954, 10956, 10958, 10960, 10962, 10964, 10966,
- 10968, 10970, 10972, 10974, 0, 10976, 10978, 10980, 10982, 0, 0, 10984,
- 10986, 10988, 10990, 10992, 10994, 10996, 10998, 0, 11000, 11002, 11004,
- 11006, 11008, 11010, 11012, 0, 11014, 11016, 11018, 11020, 11022, 11024,
- 11026, 11028, 11030, 11032, 11034, 11036, 11038, 11040, 11042, 11044,
- 11046, 11048, 11050, 11052, 11054, 11056, 11058, 11060, 11062, 11064,
- 11066, 11068, 0, 11070, 11072, 11074, 11076, 0, 11078, 11080, 11082,
- 11084, 11086, 0, 11088, 0, 0, 0, 11090, 11092, 11094, 11096, 11098,
- 11100, 11102, 0, 11104, 11106, 11108, 11110, 11112, 11114, 11116, 11118,
- 11120, 11122, 11124, 11126, 11128, 11130, 11132, 11134, 11136, 11138,
- 11140, 11142, 11144, 11146, 11148, 11150, 11152, 11154, 11156, 11158,
- 11160, 11162, 11164, 11166, 11168, 11170, 11172, 11174, 11176, 11178,
- 11180, 11182, 11184, 11186, 11188, 11190, 11192, 11194, 11196, 11198,
- 11200, 11202, 11204, 11206, 11208, 11210, 11212, 11214, 11216, 11218,
- 11220, 11222, 11224, 11226, 11228, 11230, 11232, 11234, 11236, 11238,
- 11240, 11242, 11244, 11246, 11248, 11250, 11252, 11254, 11256, 11258,
- 11260, 11262, 11264, 11266, 11268, 11270, 11272, 11274, 11276, 11278,
- 11280, 11282, 11284, 11286, 11288, 11290, 11292, 11294, 11296, 11298,
- 11300, 11302, 11304, 11306, 11308, 11310, 11312, 11314, 11316, 11318,
- 11320, 11322, 11324, 11326, 11328, 11330, 11332, 11334, 11336, 11338,
- 11340, 11342, 11344, 11346, 11348, 11350, 11352, 11354, 11356, 11358,
- 11360, 11362, 11364, 11366, 11368, 11370, 11372, 11374, 11376, 11378,
- 11380, 11382, 11384, 11386, 11388, 11390, 11392, 11394, 11396, 11398,
- 11400, 11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, 11418,
- 11420, 11422, 11424, 11426, 11428, 11430, 11432, 11434, 11436, 11438,
- 11440, 11442, 11444, 11446, 11448, 11450, 11452, 11454, 11456, 11458,
- 11460, 11462, 11464, 11466, 11468, 11470, 11472, 11474, 11476, 11478,
- 11480, 11482, 11484, 11486, 11488, 11490, 11492, 11494, 11496, 11498,
- 11500, 11502, 11504, 11506, 11508, 11510, 11512, 11514, 11516, 11518,
- 11520, 11522, 11524, 11526, 11528, 11530, 11532, 11534, 11536, 11538,
- 11540, 11542, 11544, 11546, 11548, 11550, 11552, 11554, 11556, 11558,
- 11560, 11562, 11564, 11566, 11568, 11570, 11572, 11574, 11576, 11578,
- 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, 11598,
- 11600, 11602, 11604, 11606, 11608, 11610, 11612, 11614, 11616, 11618,
- 11620, 11622, 11624, 11626, 11628, 11630, 11632, 11634, 11636, 11638,
- 11640, 11642, 11644, 11646, 11648, 11650, 11652, 11654, 11656, 11658,
- 11660, 11662, 11664, 11666, 11668, 11670, 11672, 11674, 11676, 11678,
- 11680, 11682, 11684, 11686, 11688, 11690, 11692, 11694, 11696, 11698,
- 11700, 11702, 11704, 11706, 11708, 11710, 11712, 11714, 11716, 11718,
- 11720, 11722, 11724, 11726, 11728, 11730, 11732, 11734, 11736, 11738,
- 11740, 11742, 11744, 11746, 11748, 11750, 11752, 11754, 11756, 11758,
- 11760, 11762, 11764, 11766, 11768, 11770, 11772, 11774, 11776, 11778,
- 11780, 11782, 0, 0, 11784, 11786, 11788, 11790, 11792, 11794, 11796,
- 11798, 11800, 11802, 11804, 11806, 11808, 11810, 11812, 11814, 11816,
- 11818, 11820, 11822, 11824, 11826, 11828, 11830, 11832, 11834, 11836,
- 11838, 11840, 11842, 11844, 11846, 11848, 11850, 11852, 11854, 11856,
- 11858, 11860, 11862, 11864, 11866, 11868, 11870, 11872, 11874, 11876,
- 11878, 11880, 11882, 11884, 11886, 11888, 11890, 11892, 11894, 11896,
- 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912, 11914, 11916,
- 11918, 11920, 11922, 11924, 11926, 11928, 11930, 11932, 11934, 11936,
- 11938, 11940, 11942, 11944, 11946, 11948, 11950, 11952, 11954, 11956,
- 11958, 11960, 11962, 11964, 11966, 11968, 11970, 11972, 11974, 11976,
- 11978, 11980, 11982, 11984, 11986, 11988, 11990, 11992, 11994, 11996,
- 11998, 12000, 12002, 12004, 12006, 12008, 12010, 12012, 12014, 12016,
- 12018, 12020, 12022, 12024, 12026, 12028, 12030, 12032, 12034, 12036,
- 12038, 12040, 12042, 12044, 12046, 12048, 12050, 12052, 12054, 12056,
- 12058, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074, 12076,
- 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094, 12096,
- 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114, 12116,
- 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134, 12136,
- 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154, 12156,
- 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174, 12176,
- 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194, 12196,
- 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214, 12216,
- 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234, 12236,
- 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254, 12256,
- 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274, 12276,
- 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294, 12296,
- 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314, 12316,
- 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334, 12336,
- 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354, 12356,
- 12358, 12360, 12362, 12364, 12366, 0, 0, 12368, 12370, 12372, 12374,
- 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, 12392, 12394,
- 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, 12412, 12414,
- 12416, 12418, 12420, 12422, 12424, 12426, 12428, 12430, 12432, 12434,
- 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, 12452, 12454,
- 12456, 12458, 12460, 12462, 12464, 12466, 12468, 12471, 12474, 12477,
- 12480, 12483, 12486, 12489, 12492, 12495, 12498, 0, 0, 0, 0, 0, 12501,
- 12505, 12509, 12513, 12517, 12521, 12525, 12529, 12533, 12537, 12541,
- 12545, 12549, 12553, 12557, 12561, 12565, 12569, 12573, 12577, 12581,
- 12585, 12589, 12593, 12597, 12601, 12605, 12609, 12611, 12613, 12616, 0,
- 12619, 12621, 12623, 12625, 12627, 12629, 12631, 12633, 12635, 12637,
- 12639, 12641, 12643, 12645, 12647, 12649, 12651, 12653, 12655, 12657,
- 12659, 12661, 12663, 12665, 12667, 12669, 12671, 12674, 12677, 12680,
- 12683, 12687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12690, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12693, 12696, 12699, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 12701, 12703, 12705, 12707, 12709, 12711,
- 12713, 12715, 12717, 12719, 12721, 12723, 12725, 12727, 12729, 12731,
- 12733, 12735, 12737, 12739, 12741, 12743, 12745, 12747, 12749, 12751,
- 12753, 12755, 12757, 12759, 12761, 12763, 12765, 12767, 12769, 12771,
- 12773, 12775, 12777, 12779, 12781, 12783, 12785, 0, 0, 0, 0, 0, 12787,
- 12791, 12795, 12799, 12803, 12807, 12811, 12815, 12819, 0, 0, 0, 0, 0, 0,
- 0, 12823, 12825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12827, 12829, 12831, 12833, 12835,
- 12837, 12839, 12841, 12843, 12845, 12847, 12849, 12851, 12853, 12855,
- 12857, 12859, 12861, 12863, 12865, 12867, 12869, 12871, 12873, 12875,
- 12877, 12879, 12881, 12883, 12885, 12887, 12889, 12891, 12893, 12895,
- 12897, 12899, 12901, 12903, 12905, 12907, 12909, 12911, 12913, 12915,
- 12917, 12919, 12921, 12923, 12925, 12927, 12929, 12931, 12933, 12935,
- 12937, 12939, 12941, 12943, 12945, 12947, 12949, 12951, 12953, 12955,
- 12957, 12959, 12961, 12963, 12965, 12967, 12969, 12971, 12973, 12975,
- 12977, 12979, 12981, 12983, 12985, 12987, 12989, 12991, 12993, 12995,
- 12997, 12999, 13001, 13003, 13005, 13007, 13009, 13011, 13013, 13015,
- 13017, 13019, 13021, 13023, 13025, 13027, 13029, 13031, 13033, 13035,
- 13037, 13039, 13041, 13043, 13045, 13047, 13049, 13051, 13053, 13055,
- 13057, 13059, 13061, 13063, 13065, 13067, 13069, 13071, 13073, 13075,
- 13077, 13079, 13081, 13083, 13085, 13087, 13089, 13091, 13093, 13095,
- 13097, 13099, 13101, 13103, 13105, 13107, 13109, 13111, 13113, 13115,
- 13117, 13119, 13121, 13123, 13125, 13127, 13129, 13131, 13133, 13135,
- 13137, 13139, 13141, 13143, 13145, 13147, 13149, 13151, 13153, 13155,
- 13157, 13159, 13161, 13163, 13165, 13167, 13169, 13171, 13173, 13175,
- 13177, 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, 13195,
- 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, 13215,
- 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, 13235,
- 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, 13255,
- 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, 13275,
- 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, 13295,
- 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, 13315,
- 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, 13335,
- 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, 13355,
- 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, 13375,
- 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, 13395,
- 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, 13415,
- 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, 13435,
- 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, 13455,
- 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, 13475,
- 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, 13495,
- 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, 13515,
- 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, 13535,
- 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, 13555,
- 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, 13575,
- 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, 13595,
- 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, 13615,
- 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, 13635,
- 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, 13655,
- 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, 13675,
- 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, 13695,
- 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, 13715,
- 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, 13735,
- 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, 13755,
- 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, 13775,
- 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, 13795,
- 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, 13815,
- 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, 13835,
- 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, 13855,
- 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875,
- 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, 13895,
- 13897, 13899, 13901, 13903, 13905, 13907, 13909, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,
+ 9462, 9466, 9470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9474,
+ 9478, 9482, 9487, 9492, 9497, 9502, 9507, 9512, 9517, 9521, 9540, 9549,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9554, 9556,
+ 9558, 9560, 9562, 9564, 9566, 9568, 9570, 9572, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9574, 9576, 9578, 9580, 9582,
+ 9584, 9586, 9588, 9590, 9592, 9594, 9596, 9598, 9600, 9602, 9604, 9606,
+ 9608, 9610, 9612, 9614, 0, 0, 9616, 9618, 9620, 9622, 9624, 9626, 9628,
+ 9630, 9632, 9634, 9636, 9638, 0, 9640, 9642, 9644, 9646, 9648, 9650,
+ 9652, 9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 9670, 9672, 9674,
+ 9676, 0, 9678, 9680, 9682, 9684, 0, 0, 0, 0, 9686, 9689, 9692, 0, 9695,
+ 0, 9698, 9701, 9704, 9707, 9710, 9713, 9716, 9719, 9722, 9725, 9728,
+ 9730, 9732, 9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748, 9750, 9752,
+ 9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772, 9774, 9776,
+ 9778, 9780, 9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796, 9798, 9800,
+ 9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820, 9822, 9824,
+ 9826, 9828, 9830, 9832, 9834, 9836, 9838, 9840, 9842, 9844, 9846, 9848,
+ 9850, 9852, 9854, 9856, 9858, 9860, 9862, 9864, 9866, 9868, 9870, 9872,
+ 9874, 9876, 9878, 9880, 9882, 9884, 9886, 9888, 9890, 9892, 9894, 9896,
+ 9898, 9900, 9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916, 9918, 9920,
+ 9922, 9924, 9926, 9928, 9930, 9932, 9934, 9936, 9938, 9940, 9942, 9944,
+ 9946, 9948, 9950, 9952, 9954, 9956, 9958, 9960, 9962, 9965, 9968, 9971,
+ 9974, 9977, 9980, 9983, 0, 0, 0, 0, 9986, 9988, 9990, 9992, 9994, 9996,
+ 9998, 10000, 10002, 10004, 10006, 10008, 10010, 10012, 10014, 10016,
+ 10018, 10020, 10022, 10024, 10026, 10028, 10030, 10032, 10034, 10036,
+ 10038, 10040, 10042, 10044, 10046, 10048, 10050, 10052, 10054, 10056,
+ 10058, 10060, 10062, 10064, 10066, 10068, 10070, 10072, 10074, 10076,
+ 10078, 10080, 10082, 10084, 10086, 10088, 10090, 10092, 10094, 10096,
+ 10098, 10100, 10102, 10104, 10106, 10108, 10110, 10112, 10114, 10116,
+ 10118, 10120, 10122, 10124, 10126, 10128, 10130, 10132, 10134, 10136,
+ 10138, 10140, 10142, 10144, 10146, 10148, 10150, 10152, 10154, 10156,
+ 10158, 10160, 10162, 10164, 10166, 10168, 10170, 10172, 10174, 10176,
+ 10178, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194, 10196,
+ 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214, 10216,
+ 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234, 10236,
+ 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254, 10256,
+ 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274, 10276,
+ 10278, 10280, 10282, 10284, 10286, 10288, 10290, 10292, 10294, 10296,
+ 10298, 10300, 10302, 10304, 10306, 10308, 10310, 10312, 10314, 10316,
+ 10318, 10320, 10322, 10324, 10326, 10328, 10330, 10332, 10334, 10336,
+ 10338, 10340, 10342, 10344, 10346, 10348, 10350, 10352, 10354, 10356,
+ 10358, 10360, 10362, 10364, 0, 0, 0, 10366, 10368, 10370, 10372, 10374,
+ 10376, 0, 0, 10378, 10380, 10382, 10384, 10386, 10388, 0, 0, 10390,
+ 10392, 10394, 10396, 10398, 10400, 0, 0, 10402, 10404, 10406, 0, 0, 0,
+ 10408, 10410, 10412, 10414, 10416, 10418, 10420, 0, 10422, 10424, 10426,
+ 10428, 10430, 10432, 10434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10436, 0, 10439, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 10442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10445, 10448, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10451, 10454, 10457, 10460, 10463,
+ 10466, 10469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10472, 10475,
+ 10478, 10481, 10484, 10487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10490, 10492, 10494, 10496, 10498, 10500, 10502, 10504, 10506, 10508,
+ 10510, 10512, 10514, 10516, 10518, 10520, 10522, 10524, 10526, 10528,
+ 10530, 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, 10548,
+ 10550, 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, 10568,
+ 10570, 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, 10588,
+ 10590, 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, 10608,
+ 10610, 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, 10628,
+ 10630, 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, 10648,
+ 10650, 10652, 10654, 10656, 10658, 0, 10660, 10662, 10664, 10666, 10668,
+ 10670, 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, 10688,
+ 10690, 10692, 10694, 10696, 10698, 10700, 10702, 10704, 10706, 10708,
+ 10710, 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, 10728,
+ 10730, 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, 10748,
+ 10750, 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, 10768,
+ 10770, 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10786, 10788,
+ 10790, 10792, 10794, 10796, 10798, 10800, 0, 10802, 10804, 0, 0, 10806,
+ 0, 0, 10808, 10810, 0, 0, 10812, 10814, 10816, 10818, 0, 10820, 10822,
+ 10824, 10826, 10828, 10830, 10832, 10834, 10836, 10838, 10840, 10842, 0,
+ 10844, 0, 10846, 10848, 10850, 10852, 10854, 10856, 10858, 0, 10860,
+ 10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, 10880,
+ 10882, 10884, 10886, 10888, 10890, 10892, 10894, 10896, 10898, 10900,
+ 10902, 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, 10920,
+ 10922, 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, 10940,
+ 10942, 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 10960,
+ 10962, 10964, 10966, 10968, 10970, 10972, 10974, 10976, 10978, 10980,
+ 10982, 10984, 10986, 10988, 0, 10990, 10992, 10994, 10996, 0, 0, 10998,
+ 11000, 11002, 11004, 11006, 11008, 11010, 11012, 0, 11014, 11016, 11018,
+ 11020, 11022, 11024, 11026, 0, 11028, 11030, 11032, 11034, 11036, 11038,
+ 11040, 11042, 11044, 11046, 11048, 11050, 11052, 11054, 11056, 11058,
+ 11060, 11062, 11064, 11066, 11068, 11070, 11072, 11074, 11076, 11078,
+ 11080, 11082, 0, 11084, 11086, 11088, 11090, 0, 11092, 11094, 11096,
+ 11098, 11100, 0, 11102, 0, 0, 0, 11104, 11106, 11108, 11110, 11112,
+ 11114, 11116, 0, 11118, 11120, 11122, 11124, 11126, 11128, 11130, 11132,
+ 11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 11152,
+ 11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172,
+ 11174, 11176, 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192,
+ 11194, 11196, 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212,
+ 11214, 11216, 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232,
+ 11234, 11236, 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252,
+ 11254, 11256, 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272,
+ 11274, 11276, 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292,
+ 11294, 11296, 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312,
+ 11314, 11316, 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332,
+ 11334, 11336, 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352,
+ 11354, 11356, 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372,
+ 11374, 11376, 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392,
+ 11394, 11396, 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412,
+ 11414, 11416, 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432,
+ 11434, 11436, 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452,
+ 11454, 11456, 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472,
+ 11474, 11476, 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492,
+ 11494, 11496, 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512,
+ 11514, 11516, 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532,
+ 11534, 11536, 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552,
+ 11554, 11556, 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572,
+ 11574, 11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592,
+ 11594, 11596, 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612,
+ 11614, 11616, 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632,
+ 11634, 11636, 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652,
+ 11654, 11656, 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672,
+ 11674, 11676, 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692,
+ 11694, 11696, 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712,
+ 11714, 11716, 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732,
+ 11734, 11736, 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752,
+ 11754, 11756, 11758, 11760, 11762, 11764, 11766, 11768, 11770, 11772,
+ 11774, 11776, 11778, 11780, 11782, 11784, 11786, 11788, 11790, 11792,
+ 11794, 11796, 0, 0, 11798, 11800, 11802, 11804, 11806, 11808, 11810,
+ 11812, 11814, 11816, 11818, 11820, 11822, 11824, 11826, 11828, 11830,
+ 11832, 11834, 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850,
+ 11852, 11854, 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870,
+ 11872, 11874, 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890,
+ 11892, 11894, 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910,
+ 11912, 11914, 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930,
+ 11932, 11934, 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950,
+ 11952, 11954, 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970,
+ 11972, 11974, 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990,
+ 11992, 11994, 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010,
+ 12012, 12014, 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030,
+ 12032, 12034, 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050,
+ 12052, 12054, 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070,
+ 12072, 12074, 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090,
+ 12092, 12094, 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110,
+ 12112, 12114, 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130,
+ 12132, 12134, 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150,
+ 12152, 12154, 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170,
+ 12172, 12174, 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190,
+ 12192, 12194, 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210,
+ 12212, 12214, 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230,
+ 12232, 12234, 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250,
+ 12252, 12254, 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270,
+ 12272, 12274, 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290,
+ 12292, 12294, 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310,
+ 12312, 12314, 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330,
+ 12332, 12334, 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350,
+ 12352, 12354, 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370,
+ 12372, 12374, 12376, 12378, 12380, 0, 0, 12382, 12384, 12386, 12388,
+ 12390, 12392, 12394, 12396, 12398, 12400, 12402, 12404, 12406, 12408,
+ 12410, 12412, 12414, 12416, 12418, 12420, 12422, 12424, 12426, 12428,
+ 12430, 12432, 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448,
+ 12450, 12452, 12454, 12456, 12458, 12460, 12462, 12464, 12466, 12468,
+ 12470, 12472, 12474, 12476, 12478, 12480, 12482, 12484, 12486, 12488, 0,
+ 12490, 12492, 12494, 12496, 12498, 12500, 12502, 12504, 12506, 12508,
+ 12510, 12512, 12514, 12516, 12518, 12520, 12522, 12524, 12526, 12528,
+ 12530, 12532, 12534, 12536, 12538, 12540, 12542, 0, 12544, 12546, 0,
+ 12548, 0, 0, 12550, 0, 12552, 12554, 12556, 12558, 12560, 12562, 12564,
+ 12566, 12568, 12570, 0, 12572, 12574, 12576, 12578, 0, 12580, 0, 12582,
+ 0, 0, 0, 0, 0, 0, 12584, 0, 0, 0, 0, 12586, 0, 12588, 0, 12590, 0, 12592,
+ 12594, 12596, 0, 12598, 12600, 0, 12602, 0, 0, 12604, 0, 12606, 0, 12608,
+ 0, 12610, 0, 12612, 0, 12614, 12616, 0, 12618, 0, 0, 12620, 12622, 12624,
+ 12626, 0, 12628, 12630, 12632, 12634, 12636, 12638, 12640, 0, 12642,
+ 12644, 12646, 12648, 0, 12650, 12652, 12654, 12656, 0, 12658, 0, 12660,
+ 12662, 12664, 12666, 12668, 12670, 12672, 12674, 12676, 12678, 0, 12680,
+ 12682, 12684, 12686, 12688, 12690, 12692, 12694, 12696, 12698, 12700,
+ 12702, 12704, 12706, 12708, 12710, 12712, 0, 0, 0, 0, 0, 12714, 12716,
+ 12718, 0, 12720, 12722, 12724, 12726, 12728, 0, 12730, 12732, 12734,
+ 12736, 12738, 12740, 12742, 12744, 12746, 12748, 12750, 12752, 12754,
+ 12756, 12758, 12760, 12762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12764, 12767, 12770, 12773, 12776, 12779, 12782, 12785,
+ 12788, 12791, 12794, 0, 0, 0, 0, 0, 12797, 12801, 12805, 12809, 12813,
+ 12817, 12821, 12825, 12829, 12833, 12837, 12841, 12845, 12849, 12853,
+ 12857, 12861, 12865, 12869, 12873, 12877, 12881, 12885, 12889, 12893,
+ 12897, 12901, 12905, 12907, 12909, 12912, 0, 12915, 12917, 12919, 12921,
+ 12923, 12925, 12927, 12929, 12931, 12933, 12935, 12937, 12939, 12941,
+ 12943, 12945, 12947, 12949, 12951, 12953, 12955, 12957, 12959, 12961,
+ 12963, 12965, 12967, 12970, 12973, 12976, 12979, 12983, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12986, 12989,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12995, 12998, 13001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 13003, 13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021,
+ 13023, 13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041,
+ 13043, 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061,
+ 13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081,
+ 13083, 13085, 13087, 0, 0, 0, 0, 0, 13089, 13093, 13097, 13101, 13105,
+ 13109, 13113, 13117, 13121, 0, 0, 0, 0, 0, 0, 0, 13125, 13127, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 13129, 13131, 13133, 13135, 13137, 13139, 13141, 13143, 13145,
+ 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, 13163, 13165,
+ 13167, 13169, 13171, 13173, 13175, 13177, 13179, 13181, 13183, 13185,
+ 13187, 13189, 13191, 13193, 13195, 13197, 13199, 13201, 13203, 13205,
+ 13207, 13209, 13211, 13213, 13215, 13217, 13219, 13221, 13223, 13225,
+ 13227, 13229, 13231, 13233, 13235, 13237, 13239, 13241, 13243, 13245,
+ 13247, 13249, 13251, 13253, 13255, 13257, 13259, 13261, 13263, 13265,
+ 13267, 13269, 13271, 13273, 13275, 13277, 13279, 13281, 13283, 13285,
+ 13287, 13289, 13291, 13293, 13295, 13297, 13299, 13301, 13303, 13305,
+ 13307, 13309, 13311, 13313, 13315, 13317, 13319, 13321, 13323, 13325,
+ 13327, 13329, 13331, 13333, 13335, 13337, 13339, 13341, 13343, 13345,
+ 13347, 13349, 13351, 13353, 13355, 13357, 13359, 13361, 13363, 13365,
+ 13367, 13369, 13371, 13373, 13375, 13377, 13379, 13381, 13383, 13385,
+ 13387, 13389, 13391, 13393, 13395, 13397, 13399, 13401, 13403, 13405,
+ 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13421, 13423, 13425,
+ 13427, 13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445,
+ 13447, 13449, 13451, 13453, 13455, 13457, 13459, 13461, 13463, 13465,
+ 13467, 13469, 13471, 13473, 13475, 13477, 13479, 13481, 13483, 13485,
+ 13487, 13489, 13491, 13493, 13495, 13497, 13499, 13501, 13503, 13505,
+ 13507, 13509, 13511, 13513, 13515, 13517, 13519, 13521, 13523, 13525,
+ 13527, 13529, 13531, 13533, 13535, 13537, 13539, 13541, 13543, 13545,
+ 13547, 13549, 13551, 13553, 13555, 13557, 13559, 13561, 13563, 13565,
+ 13567, 13569, 13571, 13573, 13575, 13577, 13579, 13581, 13583, 13585,
+ 13587, 13589, 13591, 13593, 13595, 13597, 13599, 13601, 13603, 13605,
+ 13607, 13609, 13611, 13613, 13615, 13617, 13619, 13621, 13623, 13625,
+ 13627, 13629, 13631, 13633, 13635, 13637, 13639, 13641, 13643, 13645,
+ 13647, 13649, 13651, 13653, 13655, 13657, 13659, 13661, 13663, 13665,
+ 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683, 13685,
+ 13687, 13689, 13691, 13693, 13695, 13697, 13699, 13701, 13703, 13705,
+ 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13721, 13723, 13725,
+ 13727, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13745,
+ 13747, 13749, 13751, 13753, 13755, 13757, 13759, 13761, 13763, 13765,
+ 13767, 13769, 13771, 13773, 13775, 13777, 13779, 13781, 13783, 13785,
+ 13787, 13789, 13791, 13793, 13795, 13797, 13799, 13801, 13803, 13805,
+ 13807, 13809, 13811, 13813, 13815, 13817, 13819, 13821, 13823, 13825,
+ 13827, 13829, 13831, 13833, 13835, 13837, 13839, 13841, 13843, 13845,
+ 13847, 13849, 13851, 13853, 13855, 13857, 13859, 13861, 13863, 13865,
+ 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881, 13883, 13885,
+ 13887, 13889, 13891, 13893, 13895, 13897, 13899, 13901, 13903, 13905,
+ 13907, 13909, 13911, 13913, 13915, 13917, 13919, 13921, 13923, 13925,
+ 13927, 13929, 13931, 13933, 13935, 13937, 13939, 13941, 13943, 13945,
+ 13947, 13949, 13951, 13953, 13955, 13957, 13959, 13961, 13963, 13965,
+ 13967, 13969, 13971, 13973, 13975, 13977, 13979, 13981, 13983, 13985,
+ 13987, 13989, 13991, 13993, 13995, 13997, 13999, 14001, 14003, 14005,
+ 14007, 14009, 14011, 14013, 14015, 14017, 14019, 14021, 14023, 14025,
+ 14027, 14029, 14031, 14033, 14035, 14037, 14039, 14041, 14043, 14045,
+ 14047, 14049, 14051, 14053, 14055, 14057, 14059, 14061, 14063, 14065,
+ 14067, 14069, 14071, 14073, 14075, 14077, 14079, 14081, 14083, 14085,
+ 14087, 14089, 14091, 14093, 14095, 14097, 14099, 14101, 14103, 14105,
+ 14107, 14109, 14111, 14113, 14115, 14117, 14119, 14121, 14123, 14125,
+ 14127, 14129, 14131, 14133, 14135, 14137, 14139, 14141, 14143, 14145,
+ 14147, 14149, 14151, 14153, 14155, 14157, 14159, 14161, 14163, 14165,
+ 14167, 14169, 14171, 14173, 14175, 14177, 14179, 14181, 14183, 14185,
+ 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201, 14203, 14205,
+ 14207, 14209, 14211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
/* NFC pairs */
#define COMP_SHIFT 2
static unsigned short comp_index[] = {
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, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 14,
- 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0,
- 0, 0, 0, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0,
- 35, 36, 37, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47,
- 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0,
- 50, 0, 51, 52, 53, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, 58, 59, 0, 0,
- 0, 0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 0,
- 66, 67, 68, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, 0,
- 0, 0, 76, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, 80, 81, 82,
- 83, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 89, 90, 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100,
- 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103,
- 104, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112,
- 0, 113, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 0, 124, 0, 0, 0, 0, 0, 0, 125,
- 126, 127, 128, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 131, 132, 133,
- 134, 0, 0, 0, 0, 0, 0, 0, 135, 136, 137, 138, 139, 140, 141, 0, 0, 0, 0,
- 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, 0,
- 147, 0, 0, 0, 0, 0, 0, 0, 0, 148, 149, 150, 151, 152, 153, 154, 0, 0, 0,
- 0, 0, 0, 0, 155, 156, 157, 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 162,
- 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 165, 166, 167, 0, 168,
- 0, 0, 0, 0, 0, 0, 169, 0, 0, 170, 171, 172, 173, 0, 0, 0, 0, 0, 0, 0,
- 174, 175, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 181,
- 182, 183, 0, 0, 0, 0, 0, 0, 184, 185, 186, 187, 188, 0, 189, 0, 0, 0, 0,
- 0, 0, 0, 190, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 194,
- 195, 196, 197, 198, 0, 0, 0, 0, 0, 0, 0, 199, 200, 201, 0, 202, 203, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0,
- 210, 211, 212, 213, 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0,
- 218, 0, 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, 222, 0, 223, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, 227, 0,
- 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 0, 232, 0, 233, 0, 0, 0,
- 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 237, 238, 239,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 248, 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 253, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 257, 0, 258, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 259, 260, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 266, 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 271, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 273, 274, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 279,
- 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, 283, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 302, 303, 0, 0, 304, 0, 0, 0,
- 0, 0, 0, 0, 0, 305, 306, 307, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309,
- 310, 311, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 314, 0, 315, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 326, 327, 0, 328, 329, 0, 0, 330, 0, 0, 0, 0, 0, 0, 331, 0,
- 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 335, 0, 0, 0, 336, 0,
- 0, 0, 0, 0, 337, 338, 339, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0,
- 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 345, 346, 347, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0,
- 350, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 354, 355, 356, 0, 357, 0,
- 0, 358, 359, 0, 0, 0, 0, 0, 360, 0, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 362, 0, 0, 363, 364, 0, 0, 365, 0, 0, 0, 0, 0, 0, 366, 367, 0, 368, 0, 0,
- 0, 369, 0, 0, 0, 0, 0, 370, 371, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 376, 377, 378, 0, 0,
- 379, 0, 0, 0, 0, 0, 0, 380, 0, 0, 381, 0, 0, 0, 382, 0, 0, 0, 0, 0, 383,
- 384, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 387, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 389, 390, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 392, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 395, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404,
- 405, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 414, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 418, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 422, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 455, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13,
+ 14, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 19, 20, 21, 0, 0,
+ 0, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34, 35, 36, 0, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 40, 41, 42, 43, 44,
+ 45, 46, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 0, 49, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, 0, 55, 56, 57,
+ 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62,
+ 63, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 67, 68, 69, 70, 71, 72, 0, 0, 0,
+ 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 76, 77,
+ 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 82, 83, 84, 0, 85, 86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 87, 88, 0, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94,
+ 95, 96, 97, 98, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 101, 102, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 107, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 109, 110, 111, 0, 112, 0, 113, 0, 0, 0, 0, 0, 0, 0, 114, 115, 116,
+ 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 121, 0, 122, 0, 0,
+ 0, 0, 0, 0, 0, 123, 124, 125, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,
+ 128, 0, 129, 130, 131, 0, 0, 0, 0, 0, 0, 0, 132, 133, 134, 135, 136, 137,
+ 138, 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 140, 141, 142, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, 0, 147,
+ 148, 149, 0, 0, 0, 0, 0, 0, 0, 150, 151, 152, 153, 154, 155, 156, 0, 0,
+ 0, 0, 0, 0, 0, 157, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 160,
+ 0, 161, 162, 163, 0, 0, 0, 0, 0, 0, 0, 164, 0, 165, 0, 166, 167, 168, 0,
+ 0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172,
+ 173, 174, 0, 175, 176, 177, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182,
+ 183, 0, 0, 0, 0, 0, 0, 0, 0, 184, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 186, 187, 188, 189, 190, 191, 192, 0, 0, 0, 0, 0, 0, 0, 193, 194, 195,
+ 0, 196, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 199, 0, 200, 201, 202, 0, 0,
+ 0, 0, 0, 0, 0, 203, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0,
+ 210, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 213, 214, 0, 215, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217,
+ 218, 219, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 222, 223, 0, 224, 0,
+ 225, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 0,
+ 228, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 235, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245,
+ 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 248, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0,
+ 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 264, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 266, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 269, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 283, 0, 284, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 287, 0,
+ 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 290, 0, 291, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 292, 0, 293, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, 0, 307,
+ 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 309, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 311, 0, 0, 312, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 314, 315, 0, 316,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 322, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0,
+ 0, 0, 0, 0, 328, 329, 0, 330, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 332, 0, 0,
+ 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 335, 0, 0, 0, 336, 0, 0, 0,
+ 0, 0, 0, 337, 338, 0, 339, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 341, 0, 0,
+ 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 344, 345, 0, 346, 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, 348, 0, 0, 349,
+ 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0,
+ 0, 0, 353, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 355, 0, 0, 0, 0, 0, 0, 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 362, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 366, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 376, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380,
+ 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 385, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 397, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 409, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 419, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0,
+ 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 442, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 450,
+ 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0,
+ 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0,
0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0,
- 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 477, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0,
- 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0,
- 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505,
- 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0,
- 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0,
- 518, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 521,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0,
- 0, 0, 529, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0,
- 532, 533, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0,
- 536, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0,
- 0, 543, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 546,
- 547, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 550, 0,
- 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 558, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0,
- 561, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, 0, 574, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 576, 0, 0, 0, 0, 0, 577, 578, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0,
+ 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0,
+ 0, 0, 474, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 481, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 484,
+ 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0,
+ 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0,
+ 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0,
+ 0, 0, 498, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0,
+ 0, 0, 507, 0, 0, 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0,
+ 0, 510, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0,
+ 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 520,
+ 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 523, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533, 0,
+ 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0,
+ 0, 538, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 560,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 578, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 580,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 640, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 663, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 665, 666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 667, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674,
+ 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 633,
};
static unsigned int comp_data[] = {
- 0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 8800, 0, 0, 8815, 0, 0, 0, 192, 193,
- 194, 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840,
- 0, 7680, 0, 0, 260, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 262,
- 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 7690, 0, 0, 0, 0,
- 270, 0, 0, 0, 0, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 0, 0, 0,
- 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0,
- 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 0, 7710, 0, 500, 284, 0,
- 7712, 286, 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 292, 0, 0, 0, 7714,
- 7718, 0, 0, 0, 542, 0, 0, 0, 0, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0,
- 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0,
- 0, 7882, 0, 0, 0, 0, 302, 0, 0, 7724, 0, 0, 0, 308, 0, 7728, 0, 0, 0, 0,
- 0, 488, 0, 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 0, 0, 0, 313, 0,
- 317, 0, 0, 0, 0, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, 0,
- 0, 7742, 0, 0, 0, 0, 7744, 0, 0, 7746, 0, 504, 323, 0, 209, 0, 0, 7748,
- 0, 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 0,
- 210, 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0,
- 0, 416, 7884, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 7764, 7766, 0, 0, 0, 0, 0,
- 340, 0, 0, 0, 0, 7768, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0,
- 0, 0, 7774, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0,
- 536, 350, 0, 0, 0, 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0,
- 7792, 0, 0, 7790, 0, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910,
- 366, 368, 467, 532, 534, 0, 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0,
- 7796, 7804, 0, 0, 0, 0, 0, 7806, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812,
- 0, 7816, 0, 0, 0, 7818, 7820, 0, 0, 0, 7922, 221, 374, 7928, 562, 0,
- 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 377, 7824, 0, 0, 0, 379, 381, 0,
- 0, 0, 0, 0, 7826, 0, 0, 0, 0, 7828, 224, 225, 226, 227, 257, 259, 551,
- 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0,
- 0, 7683, 0, 0, 7685, 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 263, 265, 0, 0, 0,
- 267, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 231, 0, 0, 0, 7691, 271, 0, 0, 0, 0,
- 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 232, 233, 234, 7869, 275,
- 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, 7865, 0, 0, 0, 553,
- 281, 7705, 0, 7707, 0, 0, 0, 7711, 0, 0, 0, 0, 0, 501, 285, 0, 7713, 287,
- 289, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 291, 0, 0, 0, 293, 0, 0, 0, 7715,
- 7719, 0, 0, 0, 543, 0, 0, 0, 0, 0, 7717, 0, 0, 0, 7721, 0, 0, 7723, 0,
- 7830, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, 521, 523, 0,
- 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 309, 0, 0, 0, 0, 496,
- 0, 0, 0, 0, 7729, 0, 489, 0, 0, 0, 0, 0, 7731, 0, 0, 0, 311, 7733, 0, 0,
- 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, 0, 7741, 0, 0,
- 7739, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 0, 0, 0, 505, 324, 0,
- 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755, 0, 0,
- 7753, 0, 0, 0, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337,
- 466, 525, 527, 0, 0, 417, 7885, 491, 0, 0, 0, 0, 0, 7765, 0, 0, 0, 0,
- 7767, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771,
- 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0,
- 353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 0, 0,
- 0, 0, 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 0, 0, 0, 249, 250,
- 251, 361, 363, 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432,
- 7909, 7795, 0, 0, 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 7805, 0, 7807, 0, 0,
- 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0,
- 0, 0, 7819, 7821, 0, 0, 0, 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927,
- 7833, 0, 0, 0, 7925, 0, 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0,
- 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 8173, 901, 0, 0, 0, 0, 0, 0, 8129, 0,
- 0, 7846, 7844, 0, 7850, 0, 0, 0, 0, 7848, 0, 0, 478, 0, 0, 0, 506, 0, 0,
- 508, 0, 0, 482, 0, 0, 0, 7688, 0, 7872, 7870, 0, 7876, 0, 0, 0, 0, 7874,
- 0, 0, 0, 7726, 0, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, 0, 0, 0, 7892, 0,
- 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 0, 554, 0, 0, 0, 510, 0, 0, 0,
- 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 0, 7847, 7845, 0, 7851, 0, 0,
- 0, 0, 7849, 0, 0, 479, 0, 0, 0, 507, 0, 0, 509, 0, 0, 483, 0, 0, 0, 7689,
- 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 0, 7727, 0, 0, 0, 0, 0,
- 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 0, 7757, 0, 0, 557, 0, 0,
- 7759, 0, 0, 0, 555, 0, 0, 0, 511, 0, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0,
- 0, 474, 0, 0, 0, 7856, 7854, 0, 7860, 0, 0, 0, 0, 7858, 0, 0, 7857, 7855,
- 0, 7861, 0, 0, 0, 0, 7859, 0, 0, 7700, 7702, 0, 0, 0, 0, 0, 7701, 7703,
- 0, 0, 0, 0, 0, 7760, 7762, 0, 7761, 7763, 0, 0, 0, 7780, 0, 0, 7781, 0,
- 0, 7782, 0, 0, 0, 0, 0, 0, 7783, 0, 7800, 0, 0, 7801, 0, 0, 0, 0, 7802,
- 0, 0, 7803, 0, 0, 0, 0, 0, 7835, 0, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0,
- 0, 0, 7902, 7906, 0, 0, 0, 0, 0, 7901, 7899, 0, 7905, 0, 0, 0, 0, 7903,
- 0, 0, 0, 0, 7907, 0, 7914, 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0,
- 7920, 0, 7915, 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 494, 0,
- 0, 0, 492, 0, 0, 493, 0, 0, 480, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 7708, 0,
- 0, 7709, 0, 560, 0, 0, 0, 0, 0, 0, 561, 0, 495, 0, 0, 0, 8122, 902, 0, 0,
- 8121, 8120, 0, 0, 0, 0, 7944, 7945, 0, 0, 0, 0, 0, 8124, 0, 8136, 904, 0,
- 0, 0, 0, 7960, 7961, 0, 0, 0, 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140,
- 0, 0, 0, 0, 0, 8154, 906, 0, 0, 8153, 8152, 0, 938, 0, 0, 7992, 7993, 0,
- 0, 0, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0, 0, 0, 0, 0, 8172, 0, 0, 0,
- 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 0, 8186, 911,
- 8040, 8041, 0, 0, 0, 0, 0, 8188, 0, 0, 8116, 0, 0, 8132, 0, 0, 0, 0, 0,
- 8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 0, 0, 0, 0, 8118,
- 8115, 0, 0, 0, 0, 0, 8050, 941, 7952, 7953, 0, 0, 0, 8052, 942, 0, 0, 0,
- 0, 7968, 7969, 0, 0, 0, 0, 8134, 8131, 0, 8054, 943, 0, 0, 8145, 8144, 0,
- 970, 0, 0, 7984, 7985, 8150, 0, 0, 0, 0, 0, 0, 8056, 972, 0, 0, 0, 0,
- 8000, 8001, 0, 8164, 8165, 0, 0, 0, 8058, 973, 0, 0, 8161, 8160, 0, 971,
- 0, 0, 0, 0, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, 0, 0, 8060, 974, 0, 0, 0,
- 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 0, 8146, 912, 0, 0, 0, 0, 0, 0,
- 8151, 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 8180, 0, 0, 979, 0, 0, 0, 0,
- 0, 980, 0, 0, 1031, 0, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 0, 1027, 0, 1024,
- 0, 0, 0, 0, 1238, 0, 1025, 1217, 0, 1244, 0, 0, 1246, 0, 0, 0, 1037, 0,
- 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 0, 1036, 0, 0, 0, 0, 1254, 0, 0, 0,
- 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 1272,
- 0, 0, 1260, 0, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 1107, 0, 1104, 0, 0,
- 0, 0, 1239, 0, 1105, 1218, 0, 1245, 0, 0, 1247, 0, 0, 0, 1117, 0, 0, 0,
- 1251, 1081, 0, 1253, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 1255, 0, 0, 0, 1263,
- 1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 1273, 0, 0,
- 1261, 0, 0, 1111, 0, 0, 0, 1142, 0, 0, 1143, 0, 0, 0, 0, 0, 1242, 0, 0,
- 1243, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 1259, 0, 1570, 1571, 1573, 0, 1572,
- 0, 0, 1574, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 1747, 0, 0, 1728, 0, 0, 0, 0,
- 2345, 0, 0, 2353, 0, 0, 2356, 0, 0, 0, 2507, 2508, 0, 0, 0, 2891, 2888,
- 2892, 2964, 0, 0, 0, 0, 0, 3018, 3020, 0, 3019, 0, 0, 0, 0, 3144, 0, 0,
- 0, 0, 3264, 0, 3274, 3271, 3272, 0, 3275, 0, 0, 0, 0, 3402, 3404, 0,
- 3403, 0, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 0, 3549, 0, 0, 0, 0, 0,
- 4134, 0, 0, 0, 6918, 0, 0, 6920, 0, 0, 6922, 0, 0, 6924, 0, 0, 0, 0, 0,
- 0, 6926, 0, 0, 6930, 0, 0, 6971, 0, 0, 6973, 0, 0, 0, 0, 0, 0, 6976, 0,
- 0, 6977, 0, 0, 6979, 0, 0, 0, 7736, 0, 0, 7737, 0, 0, 0, 0, 0, 0, 7772,
- 0, 0, 7773, 0, 0, 0, 0, 7784, 0, 0, 7785, 0, 0, 7852, 0, 0, 7862, 0, 0,
- 0, 7853, 0, 0, 7863, 0, 0, 0, 7878, 0, 0, 7879, 0, 0, 7896, 0, 0, 7897,
- 0, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 0, 7939, 7941, 0, 0, 7943,
- 8065, 0, 0, 8066, 0, 0, 0, 0, 0, 0, 8067, 0, 0, 8068, 0, 0, 8069, 0, 0,
- 8070, 0, 0, 0, 0, 0, 0, 8071, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 7947,
- 7949, 0, 0, 7951, 8073, 0, 0, 8074, 0, 0, 0, 0, 0, 0, 8075, 0, 0, 8076,
- 0, 0, 8077, 0, 0, 8078, 0, 0, 0, 0, 0, 0, 8079, 0, 7954, 7956, 0, 7955,
- 7957, 0, 0, 0, 0, 0, 7962, 7964, 0, 0, 0, 0, 0, 7963, 7965, 0, 7970,
- 7972, 0, 0, 7974, 8080, 0, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 8082, 0,
- 0, 0, 0, 0, 0, 8083, 0, 0, 8084, 0, 0, 8085, 0, 0, 8086, 0, 0, 0, 0, 0,
- 0, 8087, 0, 7978, 7980, 0, 0, 7982, 8088, 0, 7979, 7981, 0, 0, 7983,
- 8089, 0, 0, 8090, 0, 0, 0, 0, 0, 0, 8091, 0, 0, 8092, 0, 0, 8093, 0, 0,
- 8094, 0, 0, 0, 0, 0, 0, 8095, 0, 7986, 7988, 0, 0, 7990, 0, 0, 7987,
- 7989, 0, 0, 7991, 0, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 7998,
- 0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 8002, 8004, 0, 8003, 8005, 0, 0, 0,
- 0, 0, 8010, 8012, 0, 0, 0, 0, 0, 8011, 8013, 0, 8018, 8020, 0, 0, 8022,
- 0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 0, 0, 0, 8027, 8029, 0, 0, 0, 0,
- 0, 0, 8031, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 8035, 8037, 0, 0,
- 8039, 8097, 0, 0, 8098, 0, 0, 8099, 0, 0, 0, 0, 0, 0, 8100, 0, 0, 8101,
- 0, 0, 8102, 0, 0, 8103, 0, 0, 0, 0, 0, 8042, 8044, 0, 0, 8046, 8104, 0,
- 8043, 8045, 0, 0, 8047, 8105, 0, 0, 8106, 0, 0, 8107, 0, 0, 0, 0, 0, 0,
- 8108, 0, 0, 8109, 0, 0, 8110, 0, 0, 8111, 0, 0, 0, 0, 0, 0, 8114, 0, 0,
- 8130, 0, 0, 8178, 0, 0, 8119, 0, 0, 0, 0, 0, 8141, 8142, 0, 0, 8143, 0,
- 0, 0, 8135, 0, 0, 8183, 0, 0, 0, 0, 0, 8157, 8158, 0, 0, 0, 0, 0, 0,
- 8159, 0, 8602, 0, 0, 8603, 0, 0, 0, 0, 0, 0, 8622, 0, 0, 8653, 0, 0,
- 8655, 0, 0, 8654, 0, 0, 0, 0, 0, 0, 8708, 0, 0, 8713, 0, 0, 8716, 0, 0,
- 8740, 0, 0, 0, 0, 0, 0, 8742, 0, 0, 8769, 0, 0, 8772, 0, 0, 8775, 0, 0,
- 0, 0, 0, 0, 8777, 0, 0, 8813, 0, 0, 8802, 0, 0, 8816, 0, 0, 0, 0, 0, 0,
- 8817, 0, 0, 8820, 0, 0, 8821, 0, 0, 8824, 0, 0, 0, 0, 0, 0, 8825, 0, 0,
- 8832, 0, 0, 8833, 0, 0, 8928, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 8836, 0, 0,
- 8837, 0, 0, 8840, 0, 0, 0, 0, 0, 0, 8841, 0, 0, 8930, 0, 0, 8931, 0, 0,
- 8876, 0, 0, 0, 0, 0, 0, 8877, 0, 0, 8878, 0, 0, 8879, 0, 0, 8938, 0, 0,
- 0, 0, 0, 0, 8939, 0, 0, 8940, 0, 0, 8941, 0, 0, 0, 12436, 0, 0, 12364, 0,
- 0, 0, 0, 0, 0, 12366, 0, 0, 12368, 0, 0, 12370, 0, 0, 12372, 0, 0, 0, 0,
- 0, 0, 12374, 0, 0, 12376, 0, 0, 12378, 0, 0, 12380, 0, 0, 0, 0, 0, 0,
- 12382, 0, 0, 12384, 0, 0, 12386, 0, 0, 12389, 0, 0, 0, 0, 0, 0, 12391, 0,
- 0, 12393, 0, 0, 12400, 12401, 0, 12403, 12404, 0, 0, 0, 0, 0, 12406,
- 12407, 0, 0, 0, 0, 0, 12409, 12410, 0, 12412, 12413, 0, 12446, 0, 0, 0,
- 0, 0, 0, 12532, 0, 0, 12460, 0, 0, 12462, 0, 0, 12464, 0, 0, 0, 0, 0, 0,
- 12466, 0, 0, 12468, 0, 0, 12470, 0, 0, 12472, 0, 0, 0, 0, 0, 0, 12474, 0,
- 0, 12476, 0, 0, 12478, 0, 0, 12480, 0, 0, 0, 0, 0, 0, 12482, 0, 0, 12485,
- 0, 0, 12487, 0, 0, 12489, 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0,
- 12499, 12500, 0, 12502, 12503, 0, 12505, 12506, 0, 0, 0, 0, 0, 12508,
- 12509, 0, 0, 0, 0, 0, 12535, 0, 0, 12536, 0, 0, 12537, 0, 0, 0, 0, 0, 0,
- 12538, 0, 0, 12542, 0, 0, 0, 0, 69786, 0, 0, 69788, 0, 0, 69803,
+ 0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 0, 8800, 0, 0, 0, 8815, 192, 193, 194,
+ 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, 0,
+ 7680, 0, 0, 260, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 0, 262,
+ 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 0, 7690, 0, 0, 0, 0,
+ 270, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 200, 201, 202, 7868,
+ 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0, 0, 7864, 0, 0, 0,
+ 552, 280, 7704, 0, 7706, 0, 0, 0, 0, 7710, 0, 0, 500, 284, 0, 7712, 286,
+ 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 0, 292, 0, 0, 0, 7714, 7718, 0, 0,
+ 0, 542, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0, 0, 204, 205, 206, 296,
+ 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0, 0, 7882, 0, 0, 0, 0,
+ 302, 0, 0, 7724, 0, 0, 0, 0, 308, 0, 0, 7728, 0, 0, 0, 0, 0, 488, 0,
+ 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 313, 0, 0, 0, 0, 0, 317, 0,
+ 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 7742, 0, 0, 0, 0, 7744, 0,
+ 0, 7746, 0, 0, 504, 323, 0, 209, 0, 0, 7748, 0, 0, 0, 0, 327, 0, 7750, 0,
+ 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 210, 211, 212, 213, 332, 334, 558,
+ 214, 7886, 0, 336, 465, 524, 526, 0, 0, 416, 7884, 0, 0, 0, 0, 490, 0, 0,
+ 7764, 0, 0, 0, 0, 7766, 0, 0, 340, 0, 0, 0, 0, 7768, 0, 0, 0, 0, 344,
+ 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0, 0, 0, 7774, 0, 0, 346, 348,
+ 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, 536, 350, 0, 0, 0, 0,
+ 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0, 7792, 0, 0, 7790, 0,
+ 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, 467, 532, 534, 0,
+ 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, 7796, 0, 0, 0, 0, 0, 7804, 0,
+ 7806, 0, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812, 0, 7816, 0, 0, 0, 0,
+ 7818, 7820, 7922, 221, 374, 7928, 562, 0, 7822, 376, 7926, 0, 0, 0, 0,
+ 7924, 0, 0, 0, 377, 7824, 0, 0, 0, 379, 0, 0, 0, 0, 381, 0, 7826, 0, 0,
+ 0, 0, 7828, 0, 224, 225, 226, 227, 257, 259, 551, 228, 7843, 229, 0, 462,
+ 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0, 0, 0, 7683, 0, 0, 7685,
+ 0, 0, 0, 0, 7687, 0, 0, 263, 265, 0, 0, 0, 267, 0, 0, 0, 0, 269, 0, 231,
+ 0, 0, 0, 0, 7691, 0, 0, 0, 0, 271, 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0,
+ 7695, 0, 232, 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 283, 517,
+ 519, 0, 0, 0, 7865, 0, 0, 0, 553, 281, 7705, 0, 7707, 0, 0, 0, 0, 7711,
+ 0, 0, 501, 285, 0, 7713, 287, 289, 0, 0, 0, 0, 487, 0, 291, 0, 0, 0, 0,
+ 293, 0, 0, 0, 7715, 7719, 0, 0, 0, 543, 0, 7717, 0, 0, 0, 7721, 0, 0,
+ 7723, 0, 7830, 0, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464,
+ 521, 523, 0, 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 0, 309, 0,
+ 0, 0, 0, 496, 0, 7729, 0, 0, 0, 0, 0, 489, 0, 7731, 0, 0, 0, 311, 0, 0,
+ 0, 0, 7733, 0, 0, 314, 0, 0, 0, 0, 0, 318, 0, 7735, 0, 0, 0, 316, 0,
+ 7741, 0, 0, 7739, 0, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 505,
+ 324, 0, 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755,
+ 0, 0, 7753, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337, 466,
+ 525, 527, 0, 0, 417, 7885, 0, 0, 0, 0, 491, 0, 0, 7765, 0, 0, 0, 0, 7767,
+ 0, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, 0,
+ 0, 0, 343, 0, 0, 0, 0, 7775, 0, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0,
+ 353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0,
+ 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 249, 250, 251, 361, 363,
+ 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432, 7909, 7795, 0, 0,
+ 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 0, 7805, 0, 7807, 0, 0, 7809, 7811,
+ 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0, 0, 0, 0, 7819, 7821,
+ 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, 7833, 0, 0, 0, 7925, 0, 0,
+ 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0, 7827, 0, 0, 0, 0, 7829,
+ 0, 8173, 901, 0, 0, 8129, 0, 0, 0, 7846, 7844, 0, 7850, 7848, 0, 0, 0,
+ 478, 0, 0, 0, 0, 506, 0, 0, 0, 508, 0, 0, 482, 0, 0, 0, 0, 7688, 0, 0,
+ 7872, 7870, 0, 7876, 7874, 0, 0, 0, 0, 7726, 0, 0, 7890, 7888, 0, 7894,
+ 7892, 0, 0, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 554, 0, 0, 0, 0, 510, 0,
+ 0, 475, 471, 0, 0, 469, 0, 0, 0, 0, 0, 0, 473, 7847, 7845, 0, 7851, 7849,
+ 0, 0, 0, 479, 0, 0, 0, 0, 507, 0, 0, 0, 509, 0, 0, 483, 0, 0, 0, 0, 7689,
+ 0, 0, 7873, 7871, 0, 7877, 7875, 0, 0, 0, 0, 7727, 0, 0, 7891, 7889, 0,
+ 7895, 7893, 0, 0, 0, 0, 7757, 0, 0, 557, 0, 0, 7759, 555, 0, 0, 0, 0,
+ 511, 0, 0, 476, 472, 0, 0, 470, 0, 0, 0, 0, 0, 0, 474, 7856, 7854, 0,
+ 7860, 7858, 0, 0, 0, 7857, 7855, 0, 7861, 7859, 0, 0, 0, 7700, 7702, 0,
+ 0, 7701, 7703, 0, 0, 7760, 7762, 0, 0, 7761, 7763, 0, 0, 0, 0, 7780, 0,
+ 0, 0, 7781, 0, 0, 0, 7782, 0, 0, 0, 7783, 0, 0, 7800, 0, 0, 0, 7801, 0,
+ 0, 0, 0, 0, 7802, 0, 0, 0, 7803, 0, 0, 7835, 0, 7900, 7898, 0, 7904,
+ 7902, 0, 0, 0, 0, 7906, 0, 0, 7901, 7899, 0, 7905, 7903, 0, 0, 0, 0,
+ 7907, 0, 0, 7914, 7912, 0, 7918, 7916, 0, 0, 0, 0, 7920, 0, 0, 7915,
+ 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 0, 494, 492, 0, 0, 0,
+ 493, 0, 0, 0, 480, 0, 0, 0, 481, 0, 0, 0, 0, 7708, 0, 0, 0, 7709, 0, 0,
+ 560, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 495, 8122, 902, 0, 0, 8121, 8120, 0,
+ 0, 0, 0, 7944, 7945, 0, 8124, 0, 0, 8136, 904, 0, 0, 0, 0, 7960, 7961,
+ 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140, 0, 0, 8154, 906, 0, 0, 8153,
+ 8152, 0, 938, 0, 0, 7992, 7993, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0,
+ 0, 8172, 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 8186, 911,
+ 0, 0, 0, 0, 8040, 8041, 0, 8188, 0, 0, 0, 8116, 0, 0, 0, 8132, 0, 0,
+ 8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 8118, 8115, 0, 0,
+ 8050, 941, 0, 0, 0, 0, 7952, 7953, 8052, 942, 0, 0, 0, 0, 7968, 7969,
+ 8134, 8131, 0, 0, 8054, 943, 0, 0, 8145, 8144, 0, 970, 0, 0, 7984, 7985,
+ 8150, 0, 0, 0, 8056, 972, 0, 0, 0, 0, 8000, 8001, 0, 0, 8164, 8165, 8058,
+ 973, 0, 0, 8161, 8160, 0, 971, 0, 0, 8016, 8017, 8166, 0, 0, 0, 8060,
+ 974, 0, 0, 0, 0, 8032, 8033, 8182, 8179, 0, 0, 8146, 912, 0, 0, 8151, 0,
+ 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 0, 8180, 0, 0, 0, 979, 0, 0, 0, 0,
+ 0, 980, 0, 0, 0, 1031, 0, 1232, 0, 1234, 0, 1027, 0, 0, 1024, 0, 0, 0, 0,
+ 1238, 0, 1025, 0, 1217, 0, 1244, 0, 0, 0, 1246, 1037, 0, 0, 0, 1250,
+ 1049, 0, 1252, 0, 1036, 0, 0, 0, 0, 0, 1254, 1262, 1038, 0, 1264, 0, 0,
+ 1266, 0, 0, 0, 0, 1268, 0, 0, 0, 1272, 0, 0, 0, 1260, 0, 1233, 0, 1235,
+ 0, 1107, 0, 0, 1104, 0, 0, 0, 0, 1239, 0, 1105, 0, 1218, 0, 1245, 0, 0,
+ 0, 1247, 1117, 0, 0, 0, 1251, 1081, 0, 1253, 0, 1116, 0, 0, 0, 0, 0,
+ 1255, 1263, 1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 0, 1269, 0, 0, 0, 1273,
+ 0, 0, 0, 1261, 0, 0, 0, 1111, 1142, 0, 0, 0, 1143, 0, 0, 0, 0, 0, 0,
+ 1242, 0, 0, 0, 1243, 0, 0, 0, 1258, 0, 0, 0, 1259, 0, 0, 1570, 1571,
+ 1573, 0, 0, 0, 0, 0, 0, 1572, 0, 0, 0, 1574, 0, 0, 0, 1730, 0, 0, 0,
+ 1747, 0, 0, 0, 1728, 0, 2345, 0, 0, 0, 2353, 0, 0, 0, 2356, 0, 0, 0, 0,
+ 2507, 2508, 2891, 2888, 2892, 0, 2964, 0, 0, 0, 0, 0, 0, 3018, 3020, 0,
+ 0, 0, 0, 0, 0, 3019, 0, 3144, 0, 0, 0, 0, 0, 3264, 0, 0, 3274, 3271,
+ 3272, 0, 0, 0, 0, 0, 0, 3275, 0, 3402, 3404, 0, 0, 3403, 0, 0, 0, 0, 0,
+ 3546, 3548, 3550, 0, 0, 0, 0, 0, 3549, 0, 0, 4134, 0, 0, 0, 0, 6918, 0,
+ 0, 0, 6920, 0, 0, 0, 6922, 0, 0, 0, 6924, 0, 0, 0, 6926, 0, 0, 0, 6930,
+ 0, 0, 0, 6971, 0, 0, 0, 6973, 0, 0, 0, 6976, 0, 0, 0, 6977, 0, 0, 0,
+ 6979, 7736, 0, 0, 0, 7737, 0, 0, 0, 7772, 0, 0, 0, 7773, 0, 0, 0, 0, 0,
+ 7784, 0, 0, 0, 7785, 0, 0, 0, 7852, 0, 0, 7862, 0, 0, 0, 0, 7853, 0, 0,
+ 7863, 0, 0, 0, 0, 7878, 0, 0, 0, 7879, 0, 0, 0, 7896, 0, 0, 0, 7897, 0,
+ 7938, 7940, 0, 0, 7942, 8064, 0, 0, 7939, 7941, 0, 0, 7943, 8065, 0, 0,
+ 0, 8066, 0, 0, 0, 8067, 0, 0, 0, 8068, 0, 0, 0, 8069, 0, 0, 0, 8070, 0,
+ 0, 0, 8071, 0, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 0, 7947, 7949, 0, 0,
+ 7951, 8073, 0, 0, 0, 8074, 0, 0, 0, 8075, 0, 0, 0, 8076, 0, 0, 0, 8077,
+ 0, 0, 0, 8078, 0, 0, 0, 8079, 0, 0, 7954, 7956, 0, 0, 7955, 7957, 0, 0,
+ 7962, 7964, 0, 0, 7963, 7965, 0, 0, 7970, 7972, 0, 0, 7974, 8080, 0, 0,
+ 7971, 7973, 0, 0, 7975, 8081, 0, 0, 0, 8082, 0, 0, 0, 8083, 0, 0, 0,
+ 8084, 0, 0, 0, 8085, 0, 0, 0, 8086, 0, 0, 0, 8087, 0, 0, 7978, 7980, 0,
+ 0, 7982, 8088, 0, 0, 7979, 7981, 0, 0, 7983, 8089, 0, 0, 0, 8090, 0, 0,
+ 0, 8091, 0, 0, 0, 8092, 0, 0, 0, 8093, 0, 0, 0, 8094, 0, 0, 0, 8095, 0,
+ 0, 7986, 7988, 0, 0, 7990, 0, 0, 0, 7987, 7989, 0, 0, 7991, 0, 0, 0,
+ 7994, 7996, 0, 0, 7998, 0, 0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 0, 8002,
+ 8004, 0, 0, 8003, 8005, 0, 0, 8010, 8012, 0, 0, 8011, 8013, 0, 0, 8018,
+ 8020, 0, 0, 8022, 0, 0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 8027, 8029,
+ 0, 0, 8031, 0, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 0, 8035, 8037, 0,
+ 0, 8039, 8097, 0, 0, 0, 8098, 0, 0, 0, 8099, 0, 0, 0, 8100, 0, 0, 0,
+ 8101, 0, 0, 0, 8102, 0, 0, 0, 8103, 0, 0, 8042, 8044, 0, 0, 8046, 8104,
+ 0, 0, 8043, 8045, 0, 0, 8047, 8105, 0, 0, 0, 8106, 0, 0, 0, 8107, 0, 0,
+ 0, 8108, 0, 0, 0, 8109, 0, 0, 0, 8110, 0, 0, 0, 8111, 0, 0, 0, 8114, 0,
+ 0, 0, 8130, 0, 0, 0, 8178, 0, 0, 0, 8119, 0, 0, 8141, 8142, 0, 0, 8143,
+ 0, 0, 0, 0, 8135, 0, 0, 0, 8183, 0, 0, 8157, 8158, 0, 0, 8159, 0, 0, 0,
+ 0, 0, 0, 8602, 0, 0, 0, 8603, 0, 0, 0, 8622, 0, 0, 0, 8653, 0, 0, 0,
+ 8655, 0, 0, 0, 8654, 0, 0, 0, 8708, 0, 0, 0, 8713, 0, 0, 0, 8716, 0, 0,
+ 0, 8740, 0, 0, 0, 8742, 0, 0, 0, 8769, 0, 0, 0, 8772, 0, 0, 0, 8775, 0,
+ 0, 0, 8777, 0, 0, 0, 8813, 0, 0, 0, 8802, 0, 0, 0, 8816, 0, 0, 0, 8817,
+ 0, 0, 0, 8820, 0, 0, 0, 8821, 0, 0, 0, 8824, 0, 0, 0, 8825, 0, 0, 0,
+ 8832, 0, 0, 0, 8833, 0, 0, 0, 8928, 0, 0, 0, 8929, 0, 0, 0, 8836, 0, 0,
+ 0, 8837, 0, 0, 0, 8840, 0, 0, 0, 8841, 0, 0, 0, 8930, 0, 0, 0, 8931, 0,
+ 0, 0, 8876, 0, 0, 0, 8877, 0, 0, 0, 8878, 0, 0, 0, 8879, 0, 0, 0, 8938,
+ 0, 0, 0, 8939, 0, 0, 0, 8940, 0, 0, 0, 8941, 12436, 0, 0, 0, 12364, 0, 0,
+ 0, 12366, 0, 0, 0, 12368, 0, 0, 0, 12370, 0, 0, 0, 12372, 0, 0, 0, 12374,
+ 0, 0, 0, 12376, 0, 0, 0, 12378, 0, 0, 0, 12380, 0, 0, 0, 12382, 0, 0, 0,
+ 12384, 0, 0, 0, 12386, 0, 0, 0, 12389, 0, 0, 0, 12391, 0, 0, 0, 12393, 0,
+ 0, 0, 12400, 12401, 0, 0, 12403, 12404, 0, 0, 12406, 12407, 0, 0, 12409,
+ 12410, 0, 0, 12412, 12413, 0, 0, 12446, 0, 0, 0, 12532, 0, 0, 0, 12460,
+ 0, 0, 0, 12462, 0, 0, 0, 12464, 0, 0, 0, 12466, 0, 0, 0, 12468, 0, 0, 0,
+ 12470, 0, 0, 0, 12472, 0, 0, 0, 12474, 0, 0, 0, 12476, 0, 0, 0, 12478, 0,
+ 0, 0, 12480, 0, 0, 0, 12482, 0, 0, 0, 12485, 0, 0, 0, 12487, 0, 0, 0,
+ 12489, 0, 0, 0, 12496, 12497, 0, 0, 12499, 12500, 0, 0, 12502, 12503, 0,
+ 0, 12505, 12506, 0, 0, 12508, 12509, 0, 0, 12535, 0, 0, 0, 12536, 0, 0,
+ 0, 12537, 0, 0, 0, 12538, 0, 0, 0, 12542, 0, 0, 0, 0, 0, 69786, 0, 0, 0,
+ 69788, 0, 0, 0, 69803, 0, 0, 0, 0, 69934, 0, 0, 0, 69935,
};
static const change_record change_records_3_2_0[] = {
{ 255, 255, 255, 255, 0 },
{ 11, 255, 255, 255, 0 },
{ 10, 255, 255, 255, 0 },
+ { 255, 30, 255, 255, 0 },
+ { 255, 2, 255, 255, 0 },
{ 19, 21, 255, 255, 0 },
{ 255, 255, 2, 255, 0 },
{ 255, 255, 3, 255, 0 },
{ 255, 255, 1, 255, 0 },
{ 255, 0, 255, 255, 0 },
- { 255, 2, 255, 255, 0 },
{ 255, 29, 255, 255, 0 },
{ 255, 26, 255, 255, 0 },
{ 5, 255, 255, 255, 0 },
@@ -5058,7 +5177,7 @@ static const change_record change_records_3_2_0[] = {
{ 255, 7, 7, 255, 0 },
{ 255, 7, 8, 255, 0 },
{ 255, 7, 9, 255, 0 },
- { 255, 5, 255, 255, 0 },
+ { 1, 5, 255, 255, 0 },
{ 15, 14, 255, 255, 0 },
{ 255, 10, 255, 255, 0 },
{ 18, 255, 255, 255, 0 },
@@ -5070,12 +5189,12 @@ static const change_record change_records_3_2_0[] = {
{ 255, 255, 7, 255, 0 },
{ 255, 255, 8, 255, 0 },
{ 255, 255, 9, 255, 0 },
- { 255, 30, 255, 255, 0 },
{ 19, 30, 255, 255, 0 },
{ 255, 8, 255, 255, 0 },
{ 255, 22, 255, 255, 0 },
{ 255, 23, 255, 255, 0 },
{ 9, 255, 255, 255, 0 },
+ { 14, 4, 255, 255, 0 },
{ 255, 20, 255, 255, 0 },
{ 255, 255, 255, 255, 1e+16 },
{ 255, 255, 255, 255, 1e+20 },
@@ -5084,74 +5203,74 @@ static const change_record change_records_3_2_0[] = {
{ 1, 255, 255, 0, 0 },
};
static unsigned char changes_3_2_0_index[] = {
- 0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 2, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 2, 2, 2, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 2, 2, 2, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
- 49, 2, 50, 2, 2, 51, 52, 53, 54, 55, 2, 2, 56, 57, 58, 2, 2, 59, 60, 61,
- 62, 63, 63, 2, 2, 2, 2, 64, 2, 65, 66, 67, 68, 69, 2, 2, 2, 2, 70, 71,
- 72, 73, 74, 75, 76, 77, 78, 2, 2, 2, 2, 2, 2, 79, 2, 2, 2, 2, 2, 80, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 81, 2, 82, 2, 2, 2, 2, 2, 2, 2, 2, 83,
- 84, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 87,
+ 0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 2, 2, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 2, 2, 2, 37, 38, 2, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 2, 52, 2, 2, 53, 54, 55, 56, 57, 2, 2, 58, 59, 60, 2, 2, 61, 62, 63,
+ 64, 65, 65, 2, 2, 2, 2, 66, 2, 67, 68, 69, 70, 71, 2, 2, 2, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 2, 2, 2, 2, 2, 2, 82, 2, 2, 2, 2, 2, 83, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 84, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 86,
+ 87, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 90,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 93, 48, 48,
- 94, 95, 48, 96, 97, 98, 99, 100, 101, 102, 103, 104, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 92, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 96, 50, 50,
+ 97, 98, 50, 99, 100, 101, 102, 103, 104, 105, 106, 107, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 105, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 108, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 106, 107, 108, 109, 110, 111, 2, 2, 2, 112, 113, 2, 114, 115,
- 116, 117, 118, 119, 2, 120, 121, 122, 123, 124, 2, 2, 2, 2, 2, 2, 125, 2,
- 126, 2, 127, 2, 128, 2, 129, 2, 2, 2, 130, 2, 2, 2, 131, 132, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 48, 48, 48, 48, 48, 48, 133, 2, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48,
- 135, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 109, 110, 111, 112, 113, 114, 2, 2, 2, 115, 116, 2, 117, 118,
+ 119, 120, 121, 122, 2, 123, 124, 125, 126, 127, 2, 2, 2, 2, 2, 2, 128, 2,
+ 129, 130, 131, 2, 132, 2, 133, 2, 2, 2, 134, 2, 2, 2, 135, 136, 137, 138,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, 140, 2, 141, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, 50,
+ 50, 142, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 136, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 143, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 144, 145, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 146, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 137, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 147, 2, 148, 2, 149, 2, 2, 150, 2, 2, 2, 151, 152,
+ 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 154, 155,
+ 2, 2, 156, 157, 158, 159, 160, 2, 161, 162, 163, 164, 165, 166, 167, 148,
+ 168, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 169, 170, 93, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 82, 171, 2, 172, 173, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 138, 2, 139, 2, 140, 2, 2, 141, 2, 2, 2, 142, 143, 144, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 174, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 175, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 176, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 145,
- 146, 147, 148, 149, 2, 150, 151, 152, 153, 154, 155, 156, 139, 157, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 158, 159, 90, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 160, 2, 161, 162, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 163, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 164, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 165, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 177, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 166, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 167, 48, 168, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 178, 50, 179, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 163,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 174, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -5386,7 +5505,7 @@ static unsigned char changes_3_2_0_index[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 48, 169, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -5450,7 +5569,7 @@ static unsigned char changes_3_2_0_index[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
};
static unsigned char changes_3_2_0_data[] = {
@@ -5460,8 +5579,9 @@ static unsigned char changes_3_2_0_data[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 6, 7, 0, 0, 3, 0, 0, 8, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5470,848 +5590,906 @@ static unsigned char changes_3_2_0_data[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 10, 0, 9, 9, 0, 0, 0, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 9, 0, 7, 7, 0, 0, 0, 7, 7, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 7, 7, 7,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7,
- 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 14, 15, 16, 17, 18, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 19, 0, 0, 9,
+ 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0,
- 19, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9,
+ 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7,
- 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,
- 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7,
- 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0,
- 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7,
- 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 8, 0,
- 0, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, 8, 35, 6, 4, 5, 36, 37, 38, 39,
- 40, 41, 1, 1, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 43, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 0, 0, 37, 38, 39, 40,
+ 41, 42, 1, 1, 0, 0, 0, 4, 36, 8, 6, 7, 37, 38, 39, 40, 41, 42, 1, 1, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 44, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 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, 46, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 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,
+ 46, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, 7, 7, 0, 7, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 7, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
+ 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7,
+ 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0,
- 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0,
- 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,
+ 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0,
+ 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 20, 20, 20, 20, 20, 20, 0, 0, 0, 1, 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 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, 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, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 13, 13, 13, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7,
- 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0,
- 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
- 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 7,
- 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0,
+ 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0,
+ 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0,
+ 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9,
+ 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0,
+ 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 7, 7, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0,
+ 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9,
+ 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9,
+ 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0,
+ 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7,
- 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7,
- 7, 7, 0, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 0, 0, 7, 7, 7, 7, 0,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6319,25 +6497,25 @@ static unsigned char changes_3_2_0_data[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6346,24 +6524,24 @@ static unsigned char changes_3_2_0_data[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
};
static const change_record* get_change_3_2_0(Py_UCS4 n)
diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h
index 8830560..3838882 100644
--- a/Modules/unicodename_db.h
+++ b/Modules/unicodename_db.h
@@ -4,337 +4,428 @@
/* lexicon */
static unsigned char lexicon[] = {
- 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 77, 65, 76, 204, 83, 89,
- 76, 76, 65, 66, 76, 197, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204,
- 76, 65, 84, 73, 206, 89, 201, 67, 74, 203, 69, 71, 89, 80, 84, 73, 65,
- 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 65, 82, 65, 66, 73, 195,
- 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 77, 65, 84, 72, 69,
- 77, 65, 84, 73, 67, 65, 204, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89,
- 77, 66, 79, 204, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206,
- 83, 89, 76, 76, 65, 66, 73, 67, 211, 66, 65, 77, 85, 205, 68, 73, 71, 73,
- 212, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 65, 78, 196, 71, 82, 69,
- 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204,
- 69, 84, 72, 73, 79, 80, 73, 195, 84, 73, 77, 69, 211, 86, 79, 87, 69,
- 204, 70, 79, 210, 73, 84, 65, 76, 73, 195, 67, 89, 82, 73, 76, 76, 73,
+ 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 89, 76, 76, 65, 66, 76,
+ 197, 83, 77, 65, 76, 204, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204,
+ 76, 65, 84, 73, 206, 89, 201, 67, 74, 203, 65, 82, 65, 66, 73, 195, 77,
+ 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 69, 71, 89, 80, 84, 73, 65,
+ 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 67, 79, 77, 80, 65, 84, 73,
+ 66, 73, 76, 73, 84, 217, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89, 77,
+ 66, 79, 204, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, 83,
+ 89, 76, 76, 65, 66, 73, 67, 211, 66, 65, 77, 85, 205, 68, 73, 71, 73,
+ 212, 65, 78, 196, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 86, 79, 87,
+ 69, 204, 71, 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85,
+ 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, 73, 195, 84, 73, 77, 69,
+ 211, 70, 79, 210, 73, 84, 65, 76, 73, 195, 67, 89, 82, 73, 76, 76, 73,
195, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73,
- 198, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66, 73, 78, 73, 78, 199,
- 84, 65, 201, 86, 65, 201, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, 197,
- 76, 69, 70, 212, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76,
- 76, 197, 80, 65, 84, 84, 69, 82, 206, 82, 73, 71, 72, 212, 66, 89, 90,
- 65, 78, 84, 73, 78, 197, 73, 83, 79, 76, 65, 84, 69, 196, 65, 66, 79, 86,
- 69, 128, 78, 85, 77, 66, 69, 210, 68, 79, 85, 66, 76, 197, 83, 73, 71,
- 78, 128, 194, 66, 69, 76, 79, 87, 128, 75, 65, 84, 65, 75, 65, 78, 193,
- 75, 65, 78, 71, 88, 201, 76, 73, 78, 69, 65, 210, 77, 79, 68, 73, 70, 73,
- 69, 210, 84, 73, 66, 69, 84, 65, 206, 65, 128, 68, 79, 212, 77, 69, 69,
- 205, 77, 89, 65, 78, 77, 65, 210, 79, 198, 67, 65, 82, 82, 73, 69, 210,
- 87, 72, 73, 84, 197, 65, 82, 82, 79, 87, 128, 85, 128, 73, 78, 73, 84,
- 73, 65, 204, 86, 69, 82, 84, 73, 67, 65, 204, 73, 128, 89, 69, 200, 79,
- 128, 65, 82, 82, 79, 215, 77, 65, 82, 75, 128, 65, 66, 79, 86, 197, 67,
- 79, 80, 84, 73, 195, 80, 72, 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76,
- 73, 65, 206, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67,
- 203, 75, 72, 77, 69, 210, 84, 73, 76, 197, 80, 65, 82, 69, 78, 84, 72,
- 69, 83, 73, 90, 69, 196, 83, 89, 77, 66, 79, 76, 128, 84, 72, 65, 205,
- 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, 69, 128, 83, 81,
- 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, 82, 69, 215, 80, 76, 85,
- 211, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 68, 82, 65, 87, 73, 78, 71,
+ 198, 84, 65, 77, 73, 204, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66,
+ 73, 78, 73, 78, 199, 84, 65, 201, 70, 73, 78, 65, 204, 86, 65, 201, 83,
+ 81, 85, 65, 82, 197, 76, 69, 70, 212, 82, 73, 71, 72, 212, 86, 65, 82,
+ 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69,
+ 82, 206, 65, 66, 79, 86, 69, 128, 66, 89, 90, 65, 78, 84, 73, 78, 197,
+ 83, 73, 71, 78, 128, 66, 69, 76, 79, 87, 128, 68, 79, 85, 66, 76, 197,
+ 73, 83, 79, 76, 65, 84, 69, 196, 78, 85, 77, 66, 69, 210, 75, 65, 84, 65,
+ 75, 65, 78, 193, 194, 77, 79, 68, 73, 70, 73, 69, 210, 68, 79, 212, 75,
+ 65, 78, 71, 88, 201, 65, 128, 76, 73, 78, 69, 65, 210, 84, 73, 66, 69,
+ 84, 65, 206, 79, 198, 73, 78, 73, 84, 73, 65, 204, 77, 69, 69, 205, 86,
+ 69, 82, 84, 73, 67, 65, 204, 77, 89, 65, 78, 77, 65, 210, 75, 72, 77, 69,
+ 210, 85, 128, 87, 72, 73, 84, 197, 67, 65, 82, 82, 73, 69, 210, 73, 128,
+ 65, 82, 82, 79, 87, 128, 79, 128, 65, 66, 79, 86, 197, 77, 65, 82, 75,
+ 128, 89, 69, 200, 65, 82, 82, 79, 215, 67, 79, 80, 84, 73, 195, 80, 72,
+ 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 68, 69, 86, 65,
+ 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, 203, 84, 73, 76, 197, 83, 89,
+ 77, 66, 79, 76, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196,
+ 84, 72, 65, 205, 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75,
+ 69, 128, 83, 81, 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, 82, 69,
+ 215, 77, 73, 65, 207, 80, 76, 85, 211, 82, 73, 71, 72, 84, 87, 65, 82,
+ 68, 211, 71, 69, 79, 82, 71, 73, 65, 206, 68, 82, 65, 87, 73, 78, 71,
211, 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84,
- 200, 66, 65, 76, 73, 78, 69, 83, 197, 71, 69, 79, 82, 71, 73, 65, 206,
- 72, 79, 79, 75, 128, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69,
- 45, 196, 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 73, 195, 65, 76, 69, 198, 72, 69, 65, 86, 217, 84, 79, 128,
- 84, 87, 79, 128, 79, 86, 69, 210, 213, 66, 82, 65, 72, 77, 201, 83, 67,
- 82, 73, 80, 212, 85, 208, 76, 79, 215, 79, 78, 69, 128, 84, 87, 207, 68,
- 79, 87, 206, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, 65, 200, 79, 78,
- 197, 69, 81, 85, 65, 204, 72, 73, 71, 200, 66, 82, 65, 67, 75, 69, 84,
- 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 78, 85, 77, 69, 82, 73, 195,
- 70, 82, 65, 75, 84, 85, 210, 77, 65, 76, 65, 89, 65, 76, 65, 205, 80, 72,
- 65, 83, 69, 45, 195, 76, 69, 70, 84, 87, 65, 82, 68, 211, 84, 72, 82, 69,
- 197, 66, 65, 82, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 71, 76, 65,
- 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, 67, 84, 69, 210, 77, 69,
- 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 66, 69, 78, 71, 65, 76, 201,
- 65, 82, 77, 69, 78, 73, 65, 206, 72, 73, 82, 65, 71, 65, 78, 193, 73, 68,
- 69, 79, 71, 82, 65, 80, 200, 74, 65, 86, 65, 78, 69, 83, 197, 74, 69, 69,
- 205, 78, 69, 71, 65, 84, 73, 86, 197, 79, 82, 73, 89, 193, 87, 69, 83,
- 84, 45, 67, 82, 69, 197, 72, 65, 76, 198, 77, 65, 82, 203, 80, 72, 65,
- 83, 69, 45, 193, 84, 72, 65, 201, 75, 65, 78, 78, 65, 68, 193, 78, 69,
- 215, 67, 72, 69, 82, 79, 75, 69, 197, 72, 65, 128, 84, 79, 78, 197, 86,
- 79, 67, 65, 76, 73, 195, 67, 72, 65, 205, 70, 79, 85, 82, 128, 71, 85,
- 74, 65, 82, 65, 84, 201, 76, 85, 197, 84, 72, 82, 69, 69, 128, 82, 85,
- 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 84, 69, 84, 82, 65,
- 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, 212, 83, 73, 78, 72, 65, 76,
- 193, 71, 85, 82, 77, 85, 75, 72, 201, 78, 79, 84, 65, 84, 73, 79, 206,
- 83, 89, 82, 73, 65, 195, 68, 79, 84, 211, 76, 73, 71, 72, 212, 84, 65,
- 77, 73, 204, 65, 67, 85, 84, 69, 128, 70, 73, 86, 69, 128, 75, 65, 128,
- 76, 69, 80, 67, 72, 193, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, 89,
- 65, 128, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 77, 65,
- 128, 83, 73, 88, 128, 86, 73, 69, 212, 72, 65, 77, 90, 193, 80, 65, 128,
- 65, 80, 204, 69, 73, 71, 72, 84, 128, 70, 85, 78, 67, 84, 73, 79, 78, 65,
- 204, 83, 128, 83, 69, 86, 69, 78, 128, 72, 79, 82, 73, 90, 79, 78, 84,
- 65, 204, 78, 73, 78, 69, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 66,
- 79, 80, 79, 77, 79, 70, 207, 82, 65, 128, 78, 65, 128, 66, 65, 82, 194,
- 68, 65, 83, 73, 193, 75, 65, 73, 84, 72, 201, 76, 73, 77, 66, 213, 77,
- 65, 75, 83, 85, 82, 193, 84, 207, 90, 90, 89, 88, 128, 90, 90, 89, 84,
- 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128,
- 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90,
- 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 79, 88, 128,
- 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73,
- 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69,
- 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128,
- 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90,
- 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128,
- 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87,
- 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85,
- 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90,
- 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 82, 65, 128, 90,
- 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, 65, 128,
- 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90,
- 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, 82, 128, 90,
- 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73,
- 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72,
- 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89,
- 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90,
- 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85,
- 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79,
- 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128,
- 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72,
- 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72,
- 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, 69, 80, 128,
- 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, 65, 88, 128,
- 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72,
- 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90,
- 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128,
- 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 50,
- 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89,
- 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90,
- 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, 90, 65, 77, 88, 128, 90, 65,
- 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72,
- 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48, 49, 54,
- 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, 48, 49,
- 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, 90, 48,
- 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, 90, 48,
- 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, 128, 90,
- 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, 68, 128,
- 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, 53, 65,
- 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, 128, 90,
- 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, 48, 48,
- 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, 54, 128,
- 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, 65, 128,
- 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, 65, 128,
- 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, 67, 128,
- 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, 50, 128,
- 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89,
- 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, 128, 89,
- 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87,
- 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89,
- 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, 128, 89,
- 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 84, 128, 89,
- 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85,
- 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79,
- 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89,
- 85, 78, 128, 89, 85, 77, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89,
- 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69,
- 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85,
- 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69,
- 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65,
- 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82,
- 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75,
- 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73,
- 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 85, 84, 72, 70, 85, 76,
- 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 84, 128,
- 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89,
- 79, 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 72,
- 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 69,
- 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79,
- 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45,
- 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 128, 89, 207, 89, 73, 90, 69,
- 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73,
- 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 199, 89, 73, 69,
- 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128,
- 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89,
- 73, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70,
- 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, 69,
- 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, 69,
- 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, 128,
- 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79,
- 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83,
- 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69,
- 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69,
- 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73,
- 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72,
- 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85,
- 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78,
- 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128,
- 89, 69, 76, 76, 79, 215, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65,
- 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65,
- 90, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87,
- 128, 89, 65, 86, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65,
- 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128,
- 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 128, 89, 65, 210, 89,
- 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89,
- 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78,
- 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65,
- 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74,
- 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 72, 72, 128, 89,
- 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71,
- 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69,
- 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89,
- 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72,
- 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89,
- 65, 65, 68, 79, 128, 89, 65, 65, 128, 89, 65, 45, 89, 79, 128, 89, 65,
- 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55,
- 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89,
- 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48,
- 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128,
- 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128,
- 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 128, 88, 89, 69, 128,
- 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88,
- 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128,
- 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128,
- 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79,
- 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, 128, 88, 79, 65,
- 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206,
- 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69,
- 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, 128, 88, 69, 83, 84, 69,
- 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 78, 128, 88,
- 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128,
- 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88,
- 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88,
- 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48,
- 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 128,
- 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79,
- 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85,
- 76, 213, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78,
- 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 84,
- 73, 78, 199, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87,
- 82, 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79,
- 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82,
- 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79,
- 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69,
- 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69,
- 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65,
- 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76,
- 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, 73, 84, 72, 79, 85, 212, 87,
- 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 74, 65,
- 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87,
- 73, 78, 68, 85, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78,
- 128, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73,
- 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71,
- 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, 79, 76, 197, 87,
- 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84,
- 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73,
- 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84,
- 128, 87, 72, 65, 76, 69, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85,
- 88, 128, 87, 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 128, 87, 69, 83,
- 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, 76,
- 128, 87, 69, 73, 71, 72, 212, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69,
- 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 65,
- 82, 217, 87, 69, 65, 80, 79, 78, 128, 87, 67, 128, 87, 66, 128, 87, 65,
- 89, 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65,
- 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65,
- 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128,
- 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84,
- 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82,
- 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87,
- 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87,
- 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77,
- 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87,
- 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, 79, 81,
- 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, 65, 76,
- 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78,
- 71, 128, 87, 65, 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, 65,
- 65, 86, 85, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48,
- 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49,
- 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128,
- 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87,
- 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48,
- 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49,
- 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65,
- 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87,
- 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48,
- 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49,
- 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89,
- 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 65,
- 128, 86, 85, 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82,
- 128, 86, 85, 80, 128, 86, 85, 76, 71, 65, 210, 86, 85, 69, 81, 128, 86,
- 83, 128, 86, 82, 65, 67, 72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69,
- 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, 79, 87, 128, 86, 79, 85, 128,
- 86, 79, 84, 128, 86, 79, 80, 128, 86, 79, 79, 128, 86, 79, 77, 128, 86,
- 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, 197, 86, 79, 76, 67, 65, 78,
- 79, 128, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73,
- 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 76, 73,
- 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 88,
- 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, 76,
- 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, 73,
- 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, 71,
- 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71,
- 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82,
- 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 79,
- 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69,
- 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69,
- 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, 76, 65,
- 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73,
- 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86,
- 73, 69, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86,
+ 200, 66, 65, 76, 73, 78, 69, 83, 197, 72, 79, 79, 75, 128, 213, 84, 87,
+ 79, 128, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196,
+ 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 73, 195, 79, 78, 69, 128, 84, 79, 128, 65, 76, 69, 198, 84, 87, 207,
+ 72, 69, 65, 86, 217, 67, 79, 78, 83, 79, 78, 65, 78, 212, 79, 86, 69,
+ 210, 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79,
+ 215, 72, 65, 200, 79, 78, 197, 68, 79, 87, 206, 72, 73, 71, 200, 70, 85,
+ 76, 76, 87, 73, 68, 84, 200, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85,
+ 65, 204, 84, 65, 199, 66, 65, 82, 128, 68, 79, 77, 73, 78, 207, 78, 85,
+ 77, 69, 82, 73, 195, 70, 82, 65, 75, 84, 85, 210, 84, 72, 82, 69, 197,
+ 67, 72, 65, 82, 65, 67, 84, 69, 210, 77, 65, 76, 65, 89, 65, 76, 65, 205,
+ 80, 72, 65, 83, 69, 45, 195, 84, 79, 78, 197, 68, 79, 85, 66, 76, 69, 45,
+ 83, 84, 82, 85, 67, 203, 76, 69, 70, 84, 87, 65, 82, 68, 211, 72, 73, 82,
+ 65, 71, 65, 78, 193, 65, 67, 85, 84, 69, 128, 74, 85, 78, 71, 83, 69, 79,
+ 78, 199, 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 66, 69, 78, 71, 65, 76,
+ 201, 77, 69, 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 86, 79, 67, 65,
+ 76, 73, 195, 65, 82, 77, 69, 78, 73, 65, 206, 74, 69, 69, 205, 78, 69,
+ 71, 65, 84, 73, 86, 197, 73, 68, 69, 79, 71, 82, 65, 80, 200, 74, 65, 86,
+ 65, 78, 69, 83, 197, 79, 82, 73, 89, 193, 84, 72, 82, 69, 69, 128, 87,
+ 69, 83, 84, 45, 67, 82, 69, 197, 70, 79, 85, 82, 128, 72, 65, 128, 72,
+ 65, 76, 198, 77, 65, 82, 203, 75, 65, 78, 78, 65, 68, 193, 78, 69, 215,
+ 80, 72, 65, 83, 69, 45, 193, 84, 72, 65, 201, 67, 72, 69, 82, 79, 75, 69,
+ 197, 68, 79, 84, 211, 71, 85, 74, 65, 82, 65, 84, 201, 67, 72, 65, 205,
+ 76, 85, 197, 83, 72, 65, 82, 65, 68, 193, 83, 73, 78, 72, 65, 76, 193,
+ 75, 65, 128, 82, 85, 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, 82,
+ 193, 84, 69, 84, 82, 65, 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, 212,
+ 84, 73, 76, 68, 69, 128, 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 128,
+ 77, 65, 89, 69, 203, 77, 69, 69, 84, 69, 201, 78, 79, 84, 65, 84, 73, 79,
+ 206, 83, 89, 82, 73, 65, 195, 70, 73, 86, 69, 128, 80, 65, 128, 89, 65,
+ 128, 76, 73, 71, 72, 212, 83, 73, 88, 128, 69, 73, 71, 72, 84, 128, 76,
+ 69, 80, 67, 72, 193, 78, 65, 128, 83, 69, 86, 69, 78, 128, 76, 79, 78,
+ 199, 78, 73, 78, 69, 128, 84, 85, 82, 75, 73, 195, 72, 65, 77, 90, 193,
+ 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 79, 80, 69, 206, 82, 65, 128,
+ 83, 65, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 86, 73, 69, 212, 76,
+ 65, 207, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88,
+ 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 65, 128, 90,
+ 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 85,
+ 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, 89, 65, 128,
+ 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90,
+ 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128,
+ 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80,
+ 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90,
+ 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128,
+ 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90,
+ 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, 87, 78, 74,
+ 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, 65, 82, 65,
+ 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, 79, 88, 128,
+ 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, 85, 66, 85,
+ 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 83, 72, 65, 128, 90, 82, 65,
+ 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79,
+ 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69,
+ 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, 82,
+ 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128,
+ 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201,
+ 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90,
+ 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69,
+ 128, 90, 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90,
+ 72, 85, 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72,
+ 85, 79, 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72,
+ 85, 128, 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128,
+ 90, 72, 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128,
+ 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, 69,
+ 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, 65,
+ 88, 128, 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128,
+ 90, 72, 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72,
+ 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69,
+ 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90,
+ 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90,
+ 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65,
+ 128, 90, 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, 90, 65, 77, 88, 128,
+ 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90,
+ 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48,
+ 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90,
+ 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128,
+ 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128,
+ 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71,
+ 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53,
+ 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49,
+ 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51,
+ 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90,
+ 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48,
+ 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52,
+ 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51,
+ 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50,
+ 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48,
+ 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84,
+ 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69,
+ 128, 89, 89, 65, 65, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79,
+ 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69,
+ 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128,
+ 89, 85, 87, 79, 81, 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84,
+ 85, 128, 89, 85, 85, 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, 85, 211,
+ 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, 209, 89,
+ 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, 79, 80,
+ 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, 85, 77,
+ 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, 85, 68, 72, 128, 89, 85,
+ 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, 78, 128, 89, 85, 45, 89,
+ 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, 45, 85, 128, 89, 85, 45,
+ 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, 79, 128, 89, 85, 45, 69,
+ 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, 128, 89, 85, 128, 89, 213,
+ 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79,
+ 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80,
+ 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79,
+ 88, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85,
+ 84, 72, 70, 85, 204, 89, 79, 84, 128, 89, 79, 82, 73, 128, 89, 79, 81,
+ 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, 89, 79, 77, 79, 128,
+ 89, 79, 71, 72, 128, 89, 79, 68, 72, 128, 89, 79, 68, 128, 89, 79, 196,
+ 89, 79, 65, 128, 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, 69,
+ 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, 128, 89, 79, 45, 73, 128,
+ 89, 79, 45, 69, 79, 128, 89, 79, 45, 65, 69, 128, 89, 79, 45, 65, 128,
+ 89, 79, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, 73,
+ 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, 89,
+ 73, 73, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, 69, 84, 128, 89,
+ 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, 128, 89, 73, 68, 68,
+ 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 70, 69, 83, 73, 83,
+ 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, 69, 89, 128, 89, 69,
+ 87, 128, 89, 69, 85, 88, 128, 89, 69, 85, 82, 65, 69, 128, 89, 69, 85,
+ 81, 128, 89, 69, 85, 77, 128, 89, 69, 85, 65, 69, 84, 128, 89, 69, 85,
+ 65, 69, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69,
+ 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85,
+ 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78,
+ 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 72,
+ 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, 82, 85,
+ 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, 89, 69,
+ 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45,
+ 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, 89, 69,
+ 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, 69, 78, 128, 89, 69,
+ 206, 89, 69, 76, 76, 79, 87, 128, 89, 69, 76, 76, 79, 215, 89, 69, 72,
+ 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, 90, 90,
+ 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 65, 78, 78, 65,
+ 128, 89, 65, 89, 128, 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, 128,
+ 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, 65,
+ 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, 89,
+ 65, 82, 82, 128, 89, 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65,
+ 80, 128, 89, 65, 78, 83, 65, 89, 65, 128, 89, 65, 78, 71, 128, 89, 65,
+ 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75,
+ 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72,
+ 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128,
+ 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 73,
+ 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65,
+ 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, 71, 128, 89, 65, 70, 213,
+ 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, 128, 89, 65, 68, 72, 128,
+ 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65,
+ 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85,
+ 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, 65, 45, 89, 79,
+ 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, 128, 89,
+ 48, 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48,
+ 52, 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65,
+ 128, 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88,
+ 89, 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88,
+ 89, 80, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 128, 88,
+ 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87,
+ 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88,
+ 87, 65, 128, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, 88,
+ 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65,
+ 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, 128,
+ 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73,
+ 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128,
+ 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, 128, 88, 69,
+ 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65,
+ 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48,
+ 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48,
+ 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52,
+ 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128,
+ 88, 48, 48, 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206,
+ 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128,
+ 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85,
+ 128, 87, 85, 76, 213, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85,
+ 65, 69, 78, 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87,
+ 82, 73, 84, 73, 78, 199, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84,
+ 200, 87, 82, 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128,
+ 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 75, 69, 82, 128, 87, 79, 82, 75,
+ 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 87, 79,
+ 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, 76, 128, 87,
+ 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, 87, 79, 78,
+ 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, 206, 87, 79,
+ 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, 206, 87, 79,
+ 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, 79, 65, 128,
+ 87, 73, 84, 72, 79, 85, 212, 87, 73, 84, 72, 73, 78, 128, 87, 73, 78, 84,
+ 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 74, 65, 128, 87,
+ 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87, 73, 78,
+ 68, 85, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87,
+ 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, 68, 69, 45,
+ 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71, 87, 65, 65,
+ 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84,
+ 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87,
+ 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72,
+ 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, 72,
+ 65, 76, 69, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87,
+ 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69,
+ 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69,
+ 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, 82, 65, 83, 211, 87, 69, 69,
+ 78, 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 68,
+ 73, 78, 71, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, 79, 78, 128, 87,
+ 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, 87, 65, 88, 73, 78,
+ 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72,
+ 128, 87, 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, 65, 86, 73, 78,
+ 199, 87, 65, 86, 69, 83, 128, 87, 65, 86, 69, 128, 87, 65, 86, 197, 87,
+ 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79,
+ 78, 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, 210, 87, 65, 84, 67,
+ 72, 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, 71, 128, 87, 65, 83,
+ 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, 76,
+ 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65,
+ 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 80, 128, 87, 65, 78, 73, 78,
+ 199, 87, 65, 78, 71, 75, 85, 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82,
+ 128, 87, 65, 78, 128, 87, 65, 76, 76, 128, 87, 65, 76, 75, 128, 87, 65,
+ 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 128, 87, 65, 69,
+ 78, 128, 87, 65, 69, 128, 87, 65, 65, 86, 85, 128, 87, 48, 50, 53, 128,
+ 87, 48, 50, 52, 65, 128, 87, 48, 50, 52, 128, 87, 48, 50, 51, 128, 87,
+ 48, 50, 50, 128, 87, 48, 50, 49, 128, 87, 48, 50, 48, 128, 87, 48, 49,
+ 57, 128, 87, 48, 49, 56, 65, 128, 87, 48, 49, 56, 128, 87, 48, 49, 55,
+ 65, 128, 87, 48, 49, 55, 128, 87, 48, 49, 54, 128, 87, 48, 49, 53, 128,
+ 87, 48, 49, 52, 65, 128, 87, 48, 49, 52, 128, 87, 48, 49, 51, 128, 87,
+ 48, 49, 50, 128, 87, 48, 49, 49, 128, 87, 48, 49, 48, 65, 128, 87, 48,
+ 49, 48, 128, 87, 48, 48, 57, 65, 128, 87, 48, 48, 57, 128, 87, 48, 48,
+ 56, 128, 87, 48, 48, 55, 128, 87, 48, 48, 54, 128, 87, 48, 48, 53, 128,
+ 87, 48, 48, 52, 128, 87, 48, 48, 51, 65, 128, 87, 48, 48, 51, 128, 87,
+ 48, 48, 50, 128, 87, 48, 48, 49, 128, 86, 90, 77, 69, 84, 128, 86, 89,
+ 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, 128, 86, 89, 82, 128, 86, 89,
+ 80, 128, 86, 89, 128, 86, 87, 65, 128, 86, 85, 88, 128, 86, 85, 85, 128,
+ 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128,
+ 86, 85, 76, 71, 65, 210, 86, 85, 69, 81, 128, 86, 84, 83, 128, 86, 84,
+ 128, 86, 83, 57, 57, 128, 86, 83, 57, 56, 128, 86, 83, 57, 55, 128, 86,
+ 83, 57, 54, 128, 86, 83, 57, 53, 128, 86, 83, 57, 52, 128, 86, 83, 57,
+ 51, 128, 86, 83, 57, 50, 128, 86, 83, 57, 49, 128, 86, 83, 57, 48, 128,
+ 86, 83, 57, 128, 86, 83, 56, 57, 128, 86, 83, 56, 56, 128, 86, 83, 56,
+ 55, 128, 86, 83, 56, 54, 128, 86, 83, 56, 53, 128, 86, 83, 56, 52, 128,
+ 86, 83, 56, 51, 128, 86, 83, 56, 50, 128, 86, 83, 56, 49, 128, 86, 83,
+ 56, 48, 128, 86, 83, 56, 128, 86, 83, 55, 57, 128, 86, 83, 55, 56, 128,
+ 86, 83, 55, 55, 128, 86, 83, 55, 54, 128, 86, 83, 55, 53, 128, 86, 83,
+ 55, 52, 128, 86, 83, 55, 51, 128, 86, 83, 55, 50, 128, 86, 83, 55, 49,
+ 128, 86, 83, 55, 48, 128, 86, 83, 55, 128, 86, 83, 54, 57, 128, 86, 83,
+ 54, 56, 128, 86, 83, 54, 55, 128, 86, 83, 54, 54, 128, 86, 83, 54, 53,
+ 128, 86, 83, 54, 52, 128, 86, 83, 54, 51, 128, 86, 83, 54, 50, 128, 86,
+ 83, 54, 49, 128, 86, 83, 54, 48, 128, 86, 83, 54, 128, 86, 83, 53, 57,
+ 128, 86, 83, 53, 56, 128, 86, 83, 53, 55, 128, 86, 83, 53, 54, 128, 86,
+ 83, 53, 53, 128, 86, 83, 53, 52, 128, 86, 83, 53, 51, 128, 86, 83, 53,
+ 50, 128, 86, 83, 53, 49, 128, 86, 83, 53, 48, 128, 86, 83, 53, 128, 86,
+ 83, 52, 57, 128, 86, 83, 52, 56, 128, 86, 83, 52, 55, 128, 86, 83, 52,
+ 54, 128, 86, 83, 52, 53, 128, 86, 83, 52, 52, 128, 86, 83, 52, 51, 128,
+ 86, 83, 52, 50, 128, 86, 83, 52, 49, 128, 86, 83, 52, 48, 128, 86, 83,
+ 52, 128, 86, 83, 51, 57, 128, 86, 83, 51, 56, 128, 86, 83, 51, 55, 128,
+ 86, 83, 51, 54, 128, 86, 83, 51, 53, 128, 86, 83, 51, 52, 128, 86, 83,
+ 51, 51, 128, 86, 83, 51, 50, 128, 86, 83, 51, 49, 128, 86, 83, 51, 48,
+ 128, 86, 83, 51, 128, 86, 83, 50, 57, 128, 86, 83, 50, 56, 128, 86, 83,
+ 50, 55, 128, 86, 83, 50, 54, 128, 86, 83, 50, 53, 54, 128, 86, 83, 50,
+ 53, 53, 128, 86, 83, 50, 53, 52, 128, 86, 83, 50, 53, 51, 128, 86, 83,
+ 50, 53, 50, 128, 86, 83, 50, 53, 49, 128, 86, 83, 50, 53, 48, 128, 86,
+ 83, 50, 53, 128, 86, 83, 50, 52, 57, 128, 86, 83, 50, 52, 56, 128, 86,
+ 83, 50, 52, 55, 128, 86, 83, 50, 52, 54, 128, 86, 83, 50, 52, 53, 128,
+ 86, 83, 50, 52, 52, 128, 86, 83, 50, 52, 51, 128, 86, 83, 50, 52, 50,
+ 128, 86, 83, 50, 52, 49, 128, 86, 83, 50, 52, 48, 128, 86, 83, 50, 52,
+ 128, 86, 83, 50, 51, 57, 128, 86, 83, 50, 51, 56, 128, 86, 83, 50, 51,
+ 55, 128, 86, 83, 50, 51, 54, 128, 86, 83, 50, 51, 53, 128, 86, 83, 50,
+ 51, 52, 128, 86, 83, 50, 51, 51, 128, 86, 83, 50, 51, 50, 128, 86, 83,
+ 50, 51, 49, 128, 86, 83, 50, 51, 48, 128, 86, 83, 50, 51, 128, 86, 83,
+ 50, 50, 57, 128, 86, 83, 50, 50, 56, 128, 86, 83, 50, 50, 55, 128, 86,
+ 83, 50, 50, 54, 128, 86, 83, 50, 50, 53, 128, 86, 83, 50, 50, 52, 128,
+ 86, 83, 50, 50, 51, 128, 86, 83, 50, 50, 50, 128, 86, 83, 50, 50, 49,
+ 128, 86, 83, 50, 50, 48, 128, 86, 83, 50, 50, 128, 86, 83, 50, 49, 57,
+ 128, 86, 83, 50, 49, 56, 128, 86, 83, 50, 49, 55, 128, 86, 83, 50, 49,
+ 54, 128, 86, 83, 50, 49, 53, 128, 86, 83, 50, 49, 52, 128, 86, 83, 50,
+ 49, 51, 128, 86, 83, 50, 49, 50, 128, 86, 83, 50, 49, 49, 128, 86, 83,
+ 50, 49, 48, 128, 86, 83, 50, 49, 128, 86, 83, 50, 48, 57, 128, 86, 83,
+ 50, 48, 56, 128, 86, 83, 50, 48, 55, 128, 86, 83, 50, 48, 54, 128, 86,
+ 83, 50, 48, 53, 128, 86, 83, 50, 48, 52, 128, 86, 83, 50, 48, 51, 128,
+ 86, 83, 50, 48, 50, 128, 86, 83, 50, 48, 49, 128, 86, 83, 50, 48, 48,
+ 128, 86, 83, 50, 48, 128, 86, 83, 50, 128, 86, 83, 49, 57, 57, 128, 86,
+ 83, 49, 57, 56, 128, 86, 83, 49, 57, 55, 128, 86, 83, 49, 57, 54, 128,
+ 86, 83, 49, 57, 53, 128, 86, 83, 49, 57, 52, 128, 86, 83, 49, 57, 51,
+ 128, 86, 83, 49, 57, 50, 128, 86, 83, 49, 57, 49, 128, 86, 83, 49, 57,
+ 48, 128, 86, 83, 49, 57, 128, 86, 83, 49, 56, 57, 128, 86, 83, 49, 56,
+ 56, 128, 86, 83, 49, 56, 55, 128, 86, 83, 49, 56, 54, 128, 86, 83, 49,
+ 56, 53, 128, 86, 83, 49, 56, 52, 128, 86, 83, 49, 56, 51, 128, 86, 83,
+ 49, 56, 50, 128, 86, 83, 49, 56, 49, 128, 86, 83, 49, 56, 48, 128, 86,
+ 83, 49, 56, 128, 86, 83, 49, 55, 57, 128, 86, 83, 49, 55, 56, 128, 86,
+ 83, 49, 55, 55, 128, 86, 83, 49, 55, 54, 128, 86, 83, 49, 55, 53, 128,
+ 86, 83, 49, 55, 52, 128, 86, 83, 49, 55, 51, 128, 86, 83, 49, 55, 50,
+ 128, 86, 83, 49, 55, 49, 128, 86, 83, 49, 55, 48, 128, 86, 83, 49, 55,
+ 128, 86, 83, 49, 54, 57, 128, 86, 83, 49, 54, 56, 128, 86, 83, 49, 54,
+ 55, 128, 86, 83, 49, 54, 54, 128, 86, 83, 49, 54, 53, 128, 86, 83, 49,
+ 54, 52, 128, 86, 83, 49, 54, 51, 128, 86, 83, 49, 54, 50, 128, 86, 83,
+ 49, 54, 49, 128, 86, 83, 49, 54, 48, 128, 86, 83, 49, 54, 128, 86, 83,
+ 49, 53, 57, 128, 86, 83, 49, 53, 56, 128, 86, 83, 49, 53, 55, 128, 86,
+ 83, 49, 53, 54, 128, 86, 83, 49, 53, 53, 128, 86, 83, 49, 53, 52, 128,
+ 86, 83, 49, 53, 51, 128, 86, 83, 49, 53, 50, 128, 86, 83, 49, 53, 49,
+ 128, 86, 83, 49, 53, 48, 128, 86, 83, 49, 53, 128, 86, 83, 49, 52, 57,
+ 128, 86, 83, 49, 52, 56, 128, 86, 83, 49, 52, 55, 128, 86, 83, 49, 52,
+ 54, 128, 86, 83, 49, 52, 53, 128, 86, 83, 49, 52, 52, 128, 86, 83, 49,
+ 52, 51, 128, 86, 83, 49, 52, 50, 128, 86, 83, 49, 52, 49, 128, 86, 83,
+ 49, 52, 48, 128, 86, 83, 49, 52, 128, 86, 83, 49, 51, 57, 128, 86, 83,
+ 49, 51, 56, 128, 86, 83, 49, 51, 55, 128, 86, 83, 49, 51, 54, 128, 86,
+ 83, 49, 51, 53, 128, 86, 83, 49, 51, 52, 128, 86, 83, 49, 51, 51, 128,
+ 86, 83, 49, 51, 50, 128, 86, 83, 49, 51, 49, 128, 86, 83, 49, 51, 48,
+ 128, 86, 83, 49, 51, 128, 86, 83, 49, 50, 57, 128, 86, 83, 49, 50, 56,
+ 128, 86, 83, 49, 50, 55, 128, 86, 83, 49, 50, 54, 128, 86, 83, 49, 50,
+ 53, 128, 86, 83, 49, 50, 52, 128, 86, 83, 49, 50, 51, 128, 86, 83, 49,
+ 50, 50, 128, 86, 83, 49, 50, 49, 128, 86, 83, 49, 50, 48, 128, 86, 83,
+ 49, 50, 128, 86, 83, 49, 49, 57, 128, 86, 83, 49, 49, 56, 128, 86, 83,
+ 49, 49, 55, 128, 86, 83, 49, 49, 54, 128, 86, 83, 49, 49, 53, 128, 86,
+ 83, 49, 49, 52, 128, 86, 83, 49, 49, 51, 128, 86, 83, 49, 49, 50, 128,
+ 86, 83, 49, 49, 49, 128, 86, 83, 49, 49, 48, 128, 86, 83, 49, 49, 128,
+ 86, 83, 49, 48, 57, 128, 86, 83, 49, 48, 56, 128, 86, 83, 49, 48, 55,
+ 128, 86, 83, 49, 48, 54, 128, 86, 83, 49, 48, 53, 128, 86, 83, 49, 48,
+ 52, 128, 86, 83, 49, 48, 51, 128, 86, 83, 49, 48, 50, 128, 86, 83, 49,
+ 48, 49, 128, 86, 83, 49, 48, 48, 128, 86, 83, 49, 48, 128, 86, 83, 49,
+ 128, 86, 83, 128, 86, 82, 65, 67, 72, 89, 128, 86, 79, 88, 128, 86, 79,
+ 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, 79, 87, 128, 86, 79, 85,
+ 128, 86, 79, 84, 128, 86, 79, 80, 128, 86, 79, 79, 128, 86, 79, 77, 128,
+ 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, 197, 86, 79, 76, 67, 65,
+ 78, 79, 128, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79,
+ 73, 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 76,
+ 73, 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73,
+ 88, 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79,
+ 76, 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86,
+ 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82,
+ 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82,
+ 71, 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73,
+ 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73,
+ 79, 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78,
+ 69, 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78,
+ 69, 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, 76,
+ 65, 71, 69, 128, 86, 73, 73, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87,
+ 73, 78, 199, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86,
+ 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, 86, 73,
+ 68, 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86,
73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86,
- 73, 66, 82, 65, 84, 73, 79, 206, 86, 73, 128, 86, 69, 88, 128, 86, 69,
- 87, 128, 86, 69, 215, 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69,
- 85, 65, 69, 80, 69, 78, 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65,
- 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67,
- 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45,
- 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45,
- 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45,
- 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45,
- 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45,
- 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45,
- 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45,
- 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45,
- 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45,
- 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128,
- 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82,
- 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67,
- 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197,
- 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69,
- 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86, 69, 72, 73, 67,
- 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, 128, 86, 69, 197,
- 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, 89, 65, 78, 78, 65,
- 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, 86, 65, 84, 72, 89,
- 128, 86, 65, 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73,
- 83, 128, 86, 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82,
- 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, 86, 65,
- 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 80, 79, 85, 82, 83,
- 128, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 65, 71, 79, 77,
- 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, 65,
- 76, 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 48,
+ 73, 66, 82, 65, 84, 73, 79, 206, 86, 73, 128, 86, 70, 65, 128, 86, 69,
+ 88, 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 85, 88, 128, 86, 69, 85,
+ 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, 128, 86, 69, 85, 65, 69, 128,
+ 86, 69, 83, 84, 65, 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86,
+ 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76,
+ 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 54, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 54, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48,
+ 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 53, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 53, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48,
+ 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 52, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 52, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48,
+ 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 51, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 51, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48,
+ 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 51, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 50, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48,
+ 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 50, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 50, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48,
+ 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 49, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 49, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48,
+ 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84,
+ 73, 67, 65, 76, 45, 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65,
+ 76, 45, 48, 48, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48,
+ 48, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48,
+ 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86,
+ 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86,
+ 69, 82, 83, 197, 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73,
+ 83, 128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86,
+ 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69,
+ 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65,
+ 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214,
+ 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, 65, 83,
+ 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, 211, 86,
+ 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65,
+ 128, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69,
+ 73, 193, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, 128, 86, 65, 78,
+ 69, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 65, 128, 86, 65, 77, 65,
+ 71, 79, 77, 85, 75, 72, 193, 86, 65, 76, 76, 69, 89, 128, 86, 65, 73,
+ 128, 86, 65, 72, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 48,
52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51,
56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54,
128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128,
@@ -365,15 +456,16 @@ static unsigned char lexicon[] = {
85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, 83,
83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, 72,
85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, 83, 72, 50, 128,
- 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, 69, 128, 85, 82,
- 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, 85, 68,
- 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, 78, 69,
- 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, 83, 128,
- 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, 85, 80,
- 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, 65, 82,
- 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80,
- 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71,
- 72, 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, 65,
+ 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, 69, 45, 50, 128,
+ 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, 85, 82, 85, 218,
+ 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, 85, 68, 193, 85,
+ 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, 78, 69, 128, 85,
+ 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, 83, 128, 85, 82,
+ 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, 85, 80, 87, 65,
+ 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, 68,
+ 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, 83,
+ 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71, 72,
+ 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, 65,
128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, 85,
78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, 78, 75, 78, 79, 87,
78, 128, 85, 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128,
@@ -388,100 +480,104 @@ static unsigned char lexicon[] = {
128, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65,
82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65,
78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, 84, 73, 195,
- 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, 85, 71, 128,
- 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, 68, 65, 65, 84,
- 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, 73, 76, 73, 128,
- 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, 65, 128, 85, 66,
- 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85,
- 48, 52, 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51,
- 56, 128, 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128,
- 85, 48, 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85,
- 48, 51, 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50,
- 57, 65, 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55,
- 128, 85, 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85,
- 48, 50, 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48,
- 50, 49, 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56,
- 128, 85, 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85,
- 48, 49, 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49,
- 49, 128, 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128,
- 85, 48, 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128,
- 85, 48, 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48,
- 48, 51, 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 73, 45,
- 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 84, 90, 85, 128, 84, 90, 79,
- 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69,
- 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90,
- 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 182, 84,
- 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 179,
- 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84,
- 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 128, 84, 87,
- 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, 45, 84, 72, 73, 82,
- 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65,
- 68, 69, 196, 84, 87, 73, 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87,
- 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84,
- 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88,
- 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, 84, 87, 69, 78,
- 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 78, 73, 78, 69,
- 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, 87, 69, 78, 84,
- 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72,
- 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69,
- 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 76, 86, 69, 45, 84,
- 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, 86,
- 197, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, 82,
- 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 128, 84,
- 85, 85, 77, 85, 128, 84, 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83,
- 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128,
- 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83,
- 84, 73, 76, 69, 128, 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85,
- 82, 66, 65, 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88,
- 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85,
- 78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 65, 69,
- 128, 84, 85, 77, 128, 84, 85, 76, 73, 80, 128, 84, 85, 75, 87, 69, 78,
- 84, 73, 83, 128, 84, 85, 75, 128, 84, 85, 71, 82, 73, 203, 84, 85, 71,
- 50, 128, 84, 85, 71, 178, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80,
- 128, 84, 85, 65, 69, 128, 84, 213, 84, 84, 85, 68, 68, 65, 71, 128, 84,
- 84, 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65,
+ 85, 69, 89, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85,
+ 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193,
+ 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85,
+ 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65,
+ 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, 128, 85,
+ 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, 52,
+ 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, 128,
+ 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, 48,
+ 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, 51,
+ 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, 57,
+ 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, 85,
+ 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, 48,
+ 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, 48,
+ 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, 85,
+ 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, 49,
+ 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, 128,
+ 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, 48,
+ 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, 48,
+ 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, 50,
+ 128, 85, 48, 48, 49, 128, 85, 45, 73, 45, 73, 128, 85, 45, 69, 79, 45,
+ 69, 85, 128, 85, 45, 66, 82, 74, 71, 85, 128, 84, 90, 85, 128, 84, 90,
+ 79, 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90,
+ 69, 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84,
+ 90, 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 182,
+ 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45,
+ 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197,
+ 84, 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 128, 84,
+ 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, 45, 84, 72, 73,
+ 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69,
+ 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, 73, 83, 84, 69, 196,
+ 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87,
+ 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69,
+ 78, 84, 89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86,
+ 69, 78, 128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78,
+ 84, 89, 45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85,
+ 82, 128, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78,
+ 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73,
+ 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, 128, 84, 87, 69, 78, 84, 217,
+ 84, 87, 69, 76, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76,
+ 86, 69, 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 128, 84, 87, 65, 65,
+ 128, 84, 87, 65, 128, 84, 86, 82, 73, 68, 79, 128, 84, 86, 73, 77, 65,
+ 68, 85, 210, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128,
+ 84, 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85,
+ 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76,
+ 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69,
+ 128, 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, 82, 66, 65, 78,
+ 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, 85, 79,
+ 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, 89, 128,
+ 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 65, 69, 128, 84, 85, 77,
+ 128, 84, 85, 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128,
+ 84, 85, 75, 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85,
+ 71, 178, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, 128, 84, 85, 65,
+ 69, 128, 84, 213, 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128,
+ 84, 84, 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65,
128, 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84,
84, 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84,
- 83, 65, 128, 84, 84, 73, 128, 84, 84, 72, 87, 69, 128, 84, 84, 72, 85,
- 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 128,
- 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, 84, 84, 72, 65, 65, 128,
- 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, 84, 84, 69, 72, 69, 200,
- 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, 69, 69, 128, 84, 84, 65,
- 89, 65, 78, 78, 65, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83,
- 87, 69, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, 83, 69, 128,
- 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79,
- 79, 203, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72,
- 69, 199, 84, 83, 72, 69, 128, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69,
- 128, 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 65, 68,
- 73, 89, 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 82, 89, 66, 76, 73,
- 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85,
- 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 69,
- 128, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, 73, 67, 65, 204, 84, 82,
- 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, 71, 77,
- 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78,
- 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77,
- 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79,
- 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, 128, 84, 82,
- 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84,
- 201, 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72,
- 128, 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78,
- 128, 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69,
- 128, 84, 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82,
- 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 73, 83, 65, 80, 128,
- 84, 82, 73, 71, 82, 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84,
- 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83,
- 128, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84,
- 128, 84, 82, 73, 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128,
- 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69,
- 45, 82, 79, 85, 78, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65,
- 68, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71,
- 76, 197, 84, 82, 73, 65, 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, 76,
- 76, 79, 128, 84, 82, 69, 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, 69,
- 77, 79, 76, 79, 45, 51, 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84,
- 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69,
- 197, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, 128, 84, 82,
- 65, 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65,
- 204, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78,
+ 83, 65, 128, 84, 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128,
+ 84, 84, 72, 87, 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128,
+ 84, 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84,
+ 84, 72, 69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69,
+ 72, 69, 72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84,
+ 69, 200, 84, 84, 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84,
+ 84, 65, 85, 128, 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50,
+ 128, 84, 83, 87, 69, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83,
+ 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 72, 85, 71, 83, 128, 84, 83,
+ 72, 79, 79, 75, 128, 84, 83, 72, 79, 79, 203, 84, 83, 72, 69, 83, 128,
+ 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 128, 84,
+ 83, 72, 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 65, 68, 73, 128, 84,
+ 83, 65, 68, 201, 84, 83, 65, 65, 68, 73, 89, 128, 84, 83, 65, 65, 128,
+ 84, 83, 193, 84, 82, 89, 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128,
+ 84, 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85,
+ 77, 80, 69, 84, 128, 84, 82, 85, 69, 128, 84, 82, 85, 67, 75, 128, 84,
+ 82, 79, 80, 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77,
+ 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79,
+ 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80,
+ 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79,
+ 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76,
+ 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128,
+ 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, 69, 90, 69, 78, 73,
+ 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, 84, 79, 211, 84,
+ 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, 83, 73, 77, 79,
+ 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, 79, 68, 128,
+ 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 197, 84, 82, 73, 79,
+ 206, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, 77, 79,
+ 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, 78,
+ 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, 73,
+ 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78,
+ 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76,
+ 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82,
+ 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78,
+ 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65, 128,
+ 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69, 78, 68,
+ 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84,
+ 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49,
+ 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, 68, 73, 78,
+ 71, 128, 84, 82, 65, 89, 128, 84, 82, 65, 80, 69, 90, 73, 85, 77, 128,
+ 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79,
+ 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, 77, 73, 212, 84, 82, 65, 78,
83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83,
73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128, 84,
82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65,
@@ -493,16 +589,17 @@ static unsigned char lexicon[] = {
79, 82, 67, 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128,
84, 79, 80, 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196,
84, 79, 80, 128, 84, 79, 208, 84, 79, 79, 84, 72, 128, 84, 79, 79, 78,
- 128, 84, 79, 79, 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69,
- 128, 84, 79, 78, 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45,
- 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84,
- 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45,
- 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, 84, 79, 77, 80, 73,
- 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, 79, 78, 71, 128, 84, 79,
- 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82,
- 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128,
- 84, 79, 65, 128, 84, 78, 128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76,
- 79, 128, 84, 76, 73, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128,
+ 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78,
+ 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79,
+ 78, 69, 45, 55, 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53,
+ 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79,
+ 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128,
+ 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79,
+ 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76,
+ 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84,
+ 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 78,
+ 128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128,
+ 84, 76, 72, 89, 65, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128,
84, 76, 72, 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84,
76, 72, 69, 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76,
69, 69, 128, 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73,
@@ -513,121 +610,123 @@ static unsigned char lexicon[] = {
84, 73, 80, 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78,
89, 128, 84, 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84,
85, 82, 69, 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83,
- 128, 84, 73, 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 68, 69, 128,
- 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85,
- 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83,
- 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45,
- 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128,
- 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85,
- 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89,
- 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84,
- 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69,
- 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, 73, 128, 84, 73, 71, 72,
- 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, 73, 71,
- 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, 200, 84,
- 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 69,
- 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, 82, 65, 128,
- 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84,
- 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72,
- 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72,
- 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128,
- 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68,
- 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84,
- 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82,
- 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84,
- 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76,
- 73, 78, 197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128,
- 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128,
- 84, 72, 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79,
- 85, 128, 84, 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78,
- 71, 128, 84, 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128,
- 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78,
- 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84,
- 217, 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69,
- 206, 84, 72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73,
- 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128,
- 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89,
- 128, 84, 72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69,
- 84, 65, 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84,
- 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69,
- 211, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69,
- 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84,
- 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72,
- 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 197, 84, 72,
- 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, 72, 65,
- 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, 65, 76,
- 128, 84, 72, 65, 204, 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, 65, 78,
- 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, 197, 84, 69,
- 88, 84, 128, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84,
- 69, 85, 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84,
- 128, 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65,
- 69, 78, 128, 84, 69, 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85,
- 128, 84, 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76,
- 73, 128, 84, 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, 69, 84, 72,
- 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, 69, 84, 65,
- 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, 69, 212,
- 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, 83, 69, 82, 193, 84, 69, 83,
- 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79,
- 82, 128, 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85,
- 128, 84, 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, 128, 84,
- 69, 78, 211, 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78,
- 45, 84, 72, 73, 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69,
- 77, 80, 85, 211, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, 211, 84, 69,
- 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83,
- 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69,
- 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76,
- 69, 73, 65, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84,
- 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69,
- 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196,
- 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69,
- 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, 82, 45,
- 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, 128, 84, 67, 72,
- 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72,
- 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128,
- 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69,
- 212, 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 86, 73, 89, 65, 78,
- 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84,
- 65, 85, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84,
- 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84,
- 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82,
- 84, 65, 82, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80,
- 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65,
- 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 199, 84, 65, 78, 65, 66, 65,
- 84, 193, 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 128,
- 84, 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84,
- 65, 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78,
- 212, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 128, 84,
- 65, 75, 52, 128, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84,
- 65, 73, 76, 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84,
- 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, 193, 84, 65, 71,
- 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, 65, 67, 75, 128,
- 84, 65, 67, 203, 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66,
- 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, 65, 194, 84, 65,
- 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, 128, 84, 65, 65, 77, 128, 84,
- 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, 70, 128, 84,
- 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, 128, 84, 48,
- 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51,
- 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49,
- 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84,
- 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50,
- 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128,
- 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48,
- 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49,
- 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128,
- 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84,
- 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84,
- 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48,
- 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51,
- 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128,
- 84, 45, 83, 72, 73, 82, 84, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128,
- 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128,
- 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65,
- 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128,
- 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89,
- 82, 73, 78, 71, 69, 128, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79,
- 85, 87, 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83,
- 77, 79, 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65,
- 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 77, 77, 69, 84, 82, 89,
+ 128, 84, 73, 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 68, 197, 84,
+ 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85,
+ 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89,
+ 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73,
+ 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45,
+ 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77,
+ 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75,
+ 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67,
+ 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69,
+ 85, 212, 84, 73, 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73,
+ 71, 72, 212, 84, 73, 71, 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70,
+ 73, 78, 65, 71, 200, 84, 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73,
+ 197, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203,
+ 84, 73, 65, 82, 65, 128, 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84,
+ 72, 87, 79, 79, 128, 84, 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84,
+ 72, 87, 73, 128, 84, 72, 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84,
+ 72, 87, 65, 128, 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218,
+ 84, 72, 85, 78, 71, 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77,
+ 128, 84, 72, 85, 78, 68, 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84,
+ 72, 85, 77, 66, 211, 84, 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85,
+ 71, 72, 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72,
+ 73, 82, 84, 89, 128, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84,
+ 72, 82, 69, 69, 45, 76, 73, 78, 197, 84, 72, 82, 69, 69, 45, 69, 205, 84,
+ 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83,
+ 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 72, 79, 85, 83,
+ 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, 72,
+ 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, 72,
+ 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84,
+ 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 72, 73,
+ 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84, 217, 84, 72, 73, 82,
+ 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, 68,
+ 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 128, 84, 72, 73,
+ 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128, 84, 72, 73, 71, 72, 128,
+ 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, 69,
+ 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84,
+ 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128,
+ 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 68,
+ 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84,
+ 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79,
+ 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, 84, 72, 69, 72, 128,
+ 84, 72, 69, 200, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84,
+ 72, 65, 75, 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78,
+ 128, 84, 72, 65, 206, 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65,
+ 72, 65, 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128,
+ 84, 72, 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, 128, 84,
+ 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, 85, 84, 69,
+ 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, 128, 84, 69,
+ 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, 85, 128, 84,
+ 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77,
+ 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 70, 79,
+ 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84,
+ 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78,
+ 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84,
+ 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83,
+ 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 80, 128, 84,
+ 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, 69, 78, 213, 84, 69,
+ 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 211, 84, 69, 78, 78,
+ 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, 82, 84, 89,
+ 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, 84, 69, 76,
+ 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 76, 69, 210, 84, 69, 76,
+ 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76,
+ 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84,
+ 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76,
+ 69, 71, 82, 65, 80, 200, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72,
+ 128, 84, 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128,
+ 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75,
+ 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196,
+ 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65,
+ 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, 128, 84,
+ 69, 45, 50, 128, 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69,
+ 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128,
+ 84, 195, 84, 65, 89, 128, 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, 65,
+ 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, 128,
+ 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84,
+ 65, 85, 82, 85, 83, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128,
+ 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84,
+ 128, 84, 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, 50, 128,
+ 84, 65, 82, 84, 65, 82, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128,
+ 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69,
+ 196, 84, 65, 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 199, 84, 65,
+ 78, 65, 66, 65, 84, 193, 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128,
+ 84, 65, 77, 128, 84, 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73,
+ 78, 71, 128, 84, 65, 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128,
+ 84, 65, 76, 69, 78, 212, 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76,
+ 85, 83, 128, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, 128,
+ 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, 76, 69, 83, 211, 84, 65,
+ 73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71,
+ 66, 65, 78, 87, 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84,
+ 65, 69, 206, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, 66, 85, 76,
+ 65, 84, 73, 79, 78, 128, 84, 65, 66, 85, 76, 65, 84, 73, 79, 206, 84, 65,
+ 66, 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, 65, 194, 84,
+ 65, 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, 128, 84, 65, 65, 77, 128,
+ 84, 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, 70, 128,
+ 84, 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 65, 45, 50, 128, 84,
+ 48, 51, 54, 128, 84, 48, 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51,
+ 51, 65, 128, 84, 48, 51, 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51,
+ 50, 128, 84, 48, 51, 49, 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128,
+ 84, 48, 50, 56, 128, 84, 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48,
+ 50, 53, 128, 84, 48, 50, 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50,
+ 128, 84, 48, 50, 49, 128, 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84,
+ 48, 49, 56, 128, 84, 48, 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48,
+ 49, 54, 128, 84, 48, 49, 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51,
+ 128, 84, 48, 49, 50, 128, 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128,
+ 84, 48, 49, 48, 128, 84, 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84,
+ 48, 48, 56, 65, 128, 84, 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84,
+ 48, 48, 55, 128, 84, 48, 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48,
+ 52, 128, 84, 48, 48, 51, 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50,
+ 128, 84, 48, 48, 49, 128, 84, 45, 83, 72, 73, 82, 84, 128, 83, 90, 90,
+ 128, 83, 90, 87, 71, 128, 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90,
+ 79, 128, 83, 90, 73, 128, 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90,
+ 65, 65, 128, 83, 90, 65, 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84,
+ 128, 83, 89, 83, 84, 69, 205, 83, 89, 82, 88, 128, 83, 89, 82, 77, 65,
+ 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, 82, 73, 78, 71, 69,
+ 128, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, 83,
+ 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89,
+ 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 77, 193, 83, 89,
+ 78, 65, 70, 73, 128, 83, 89, 78, 128, 83, 89, 77, 77, 69, 84, 82, 89,
128, 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, 89, 77, 66, 79, 76, 83,
128, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56,
128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54,
@@ -654,223 +753,228 @@ static unsigned char lexicon[] = {
66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83,
89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49,
128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45,
- 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87,
- 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79,
- 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204,
- 83, 87, 73, 77, 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83,
- 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84,
- 128, 83, 87, 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212,
- 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65,
- 128, 83, 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65,
- 128, 83, 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83,
- 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73,
- 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 85,
- 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, 128, 83, 85, 82, 70, 65,
- 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82,
- 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78,
- 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82,
- 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83,
- 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83,
- 85, 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, 83, 85, 80,
- 128, 83, 85, 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85,
- 78, 83, 69, 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83,
- 197, 83, 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, 78, 71, 128,
- 83, 85, 78, 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, 78, 69, 83,
- 197, 83, 85, 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85,
- 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83,
- 85, 77, 65, 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128,
- 83, 85, 75, 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83,
- 85, 75, 213, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128,
- 83, 85, 72, 85, 82, 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85,
- 68, 128, 83, 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68,
- 211, 83, 85, 67, 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83,
- 85, 66, 85, 78, 73, 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79,
- 206, 83, 85, 66, 83, 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73,
- 84, 85, 84, 197, 83, 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212,
- 83, 85, 66, 83, 67, 82, 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73,
- 83, 128, 83, 85, 66, 76, 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65,
- 84, 73, 79, 78, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83,
- 85, 66, 76, 73, 77, 65, 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65,
- 84, 69, 128, 83, 85, 66, 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73,
- 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, 84, 79,
- 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, 85,
- 208, 83, 85, 65, 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69,
- 128, 83, 85, 65, 128, 83, 213, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89,
- 128, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 82, 79, 75, 69, 83,
- 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128,
- 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128,
- 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128,
- 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128,
- 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49,
- 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45,
- 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, 84,
- 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 68, 69,
- 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, 69,
- 196, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, 84, 72, 128, 83,
- 84, 82, 69, 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, 69, 82, 82, 89,
- 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77,
- 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83,
- 84, 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69,
- 83, 83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70,
- 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86,
- 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, 72,
- 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69,
- 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83,
- 84, 79, 67, 75, 128, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204,
- 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, 128,
- 83, 84, 69, 77, 128, 83, 84, 69, 205, 83, 84, 69, 65, 77, 73, 78, 199,
- 83, 84, 69, 65, 77, 128, 83, 84, 69, 65, 205, 83, 84, 65, 86, 82, 79, 85,
- 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 211, 83,
- 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, 73,
- 79, 78, 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 82, 212, 83,
- 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, 84, 65, 82, 75,
- 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84,
- 73, 76, 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, 68,
- 128, 83, 84, 65, 78, 128, 83, 84, 65, 76, 76, 73, 79, 78, 128, 83, 84,
- 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 67, 67, 65, 84, 79,
- 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50,
- 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, 128,
- 83, 83, 89, 82, 128, 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, 85,
- 88, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, 88, 128,
- 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 128, 83, 83, 73,
- 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, 80, 128, 83, 83, 73, 69, 88,
- 128, 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 73, 128, 83,
- 83, 72, 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, 69,
- 69, 128, 83, 83, 65, 88, 128, 83, 83, 65, 84, 128, 83, 83, 65, 80, 128,
- 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83,
- 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83,
- 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72,
- 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73,
- 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69,
- 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79,
- 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82,
- 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, 78, 71,
- 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83,
- 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, 73, 69,
- 85, 77, 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65,
- 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, 73, 69, 85, 72,
- 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, 69, 85, 72, 128,
- 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, 78, 71, 65, 82,
- 65, 69, 65, 128, 83, 83, 65, 65, 128, 83, 83, 65, 128, 83, 82, 128, 83,
- 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, 82, 69, 204, 83, 81, 85, 73, 71,
- 71, 76, 197, 83, 81, 85, 65, 212, 83, 81, 85, 65, 82, 69, 83, 128, 83,
- 81, 85, 65, 82, 69, 68, 128, 83, 81, 85, 65, 82, 69, 128, 83, 80, 87, 65,
- 128, 83, 80, 85, 78, 71, 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82,
- 73, 78, 71, 83, 128, 83, 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72,
- 71, 69, 83, 65, 78, 199, 83, 80, 79, 85, 84, 73, 78, 199, 83, 80, 79, 84,
- 128, 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83,
- 80, 76, 65, 83, 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80,
- 73, 82, 73, 84, 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84,
- 128, 83, 80, 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, 73,
- 68, 69, 82, 217, 83, 80, 73, 67, 69, 128, 83, 80, 72, 69, 82, 73, 67, 65,
- 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 69, 68, 66, 79, 65, 84,
- 128, 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69,
- 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82,
- 128, 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69,
- 86, 73, 204, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78,
- 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82,
- 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73,
- 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, 68, 197, 83, 80, 65, 67,
- 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 128, 83, 79, 89, 128, 83, 79,
- 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83,
- 79, 85, 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79,
- 85, 82, 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83,
- 79, 85, 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 81,
- 128, 83, 79, 79, 206, 83, 79, 79, 128, 83, 79, 78, 74, 65, 77, 128, 83,
- 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, 128, 83, 79, 76, 73, 68,
- 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 71, 68, 73, 65, 206,
- 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, 83,
- 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79,
- 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128,
- 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79,
- 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, 87,
- 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, 85, 84,
- 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83,
- 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75,
- 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78,
- 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83,
- 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85,
- 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 215, 83, 76, 79, 86,
- 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80,
- 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68, 73, 78, 71, 128, 83,
- 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, 69, 80, 217, 83,
- 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78, 73, 195, 83, 76, 65,
- 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, 200, 83, 76, 65,
- 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, 83, 75, 85, 76,
- 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73,
- 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196,
- 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84,
- 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84,
- 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88,
- 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84,
- 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88,
- 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 84, 72,
- 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, 88,
- 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73,
- 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 73, 78, 71,
- 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79,
- 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82,
- 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73,
- 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128,
- 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45,
- 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83,
- 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75,
- 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45,
- 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83,
- 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73,
- 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, 73, 78, 71, 128,
- 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128,
- 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78,
- 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70,
- 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65,
- 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85,
- 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75,
- 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69,
- 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128,
- 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 73,
- 128, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77,
- 193, 83, 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73,
- 71, 128, 83, 73, 69, 69, 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73,
- 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66,
- 197, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82,
- 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, 72, 89, 69, 128,
- 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, 89, 128, 83, 72,
- 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72,
- 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 65, 65, 128, 83, 72, 87,
- 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88,
- 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128,
- 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83,
- 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83,
- 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 50, 128,
- 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, 80, 73,
- 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82,
- 73, 77, 80, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79,
- 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, 72, 79, 84,
- 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79,
- 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83,
- 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84,
- 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73,
- 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83,
- 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72,
- 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84,
- 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45,
- 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45,
- 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82,
- 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128, 83, 72,
- 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128,
- 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, 79,
- 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65,
- 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72,
- 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72,
- 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78, 84,
- 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73,
- 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193,
- 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72,
- 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72,
- 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83,
- 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83,
- 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72,
- 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84,
+ 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 128, 83, 87, 90, 128, 83, 87,
+ 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, 128, 83,
+ 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, 83, 87, 73, 77,
+ 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, 73,
+ 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87,
+ 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, 65,
+ 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, 128, 83,
+ 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83,
+ 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84,
+ 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, 128,
+ 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, 85, 78,
+ 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, 128,
+ 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71,
+ 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82,
+ 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83,
+ 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85,
+ 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79,
+ 83, 69, 196, 83, 85, 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 69,
+ 210, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, 85, 79, 80, 128, 83, 85,
+ 79, 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, 82, 73, 83, 69, 128, 83,
+ 85, 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83,
+ 85, 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, 82, 128, 83, 85, 78,
+ 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, 84,
+ 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, 83,
+ 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, 85,
+ 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, 83,
+ 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, 85, 72, 85, 82,
+ 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67,
+ 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67,
+ 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84,
+ 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84,
+ 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85,
+ 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73,
+ 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73,
+ 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85,
+ 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84,
+ 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76,
+ 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74,
+ 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85,
+ 80, 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 66, 128, 83, 85, 65,
+ 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65,
+ 128, 83, 213, 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89,
+ 128, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, 128, 83, 84, 82,
+ 79, 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69,
+ 45, 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69,
+ 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69,
+ 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69,
+ 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69,
+ 45, 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79,
+ 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69,
+ 128, 83, 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82,
+ 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 68, 69, 128,
+ 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83,
+ 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69,
+ 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84,
+ 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84,
+ 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73,
+ 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 83,
+ 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70, 128, 83, 84, 82, 65,
+ 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86, 69, 128, 83, 84, 79,
+ 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80,
+ 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69, 128, 83, 84, 79, 80,
+ 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83, 84, 79, 67, 75, 128,
+ 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, 73, 76, 197,
+ 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, 128, 83, 84, 69, 77, 128,
+ 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, 69, 65,
+ 205, 83, 84, 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, 128,
+ 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65,
+ 84, 85, 197, 83, 84, 65, 84, 73, 79, 78, 128, 83, 84, 65, 84, 69, 82, 83,
+ 128, 83, 84, 65, 84, 69, 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 83,
+ 128, 83, 84, 65, 82, 82, 69, 196, 83, 84, 65, 82, 75, 128, 83, 84, 65,
+ 82, 128, 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128,
+ 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, 84, 65, 78,
+ 128, 83, 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83,
+ 84, 65, 70, 198, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, 65, 67, 67,
+ 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, 89, 88,
+ 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, 128, 83, 83, 89, 82, 128,
+ 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, 85, 88, 128, 83, 83, 85,
+ 85, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, 88, 128,
+ 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 79, 128, 83, 83,
+ 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, 80, 128,
+ 83, 83, 73, 73, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, 80, 128,
+ 83, 83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 72, 69, 128, 83, 83, 69,
+ 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, 83, 83, 65, 88, 128,
+ 83, 83, 65, 85, 128, 83, 83, 65, 84, 128, 83, 83, 65, 80, 128, 83, 83,
+ 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83, 83, 65,
+ 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65,
+ 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72, 73, 69,
+ 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73, 75, 69,
+ 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80,
+ 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128,
+ 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, 73, 69,
+ 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, 78, 71, 82, 73,
+ 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83, 83, 65,
+ 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, 73, 69, 85, 77,
+ 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71,
+ 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, 73, 69, 85, 72, 128, 83,
+ 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, 69, 85, 72, 128, 83, 83,
+ 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, 78, 71, 65, 82, 65, 69,
+ 65, 128, 83, 83, 65, 73, 128, 83, 83, 65, 65, 128, 83, 83, 51, 128, 83,
+ 83, 50, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, 82,
+ 82, 69, 204, 83, 81, 85, 73, 71, 71, 76, 197, 83, 81, 85, 65, 212, 83,
+ 81, 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, 128, 83, 81, 85,
+ 65, 82, 69, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, 211, 83, 80,
+ 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, 80, 82, 73, 78,
+ 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, 83, 80, 79, 85,
+ 84, 73, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, 80,
+ 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, 65, 83, 72, 73, 78, 199, 83, 80,
+ 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, 128, 83, 80, 73, 82, 73,
+ 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 82, 65, 76, 128, 83,
+ 80, 73, 82, 65, 204, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 67, 69,
+ 128, 83, 80, 72, 69, 82, 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76,
+ 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, 83, 80, 69, 69, 67, 72,
+ 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80,
+ 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, 128, 83, 80, 69, 65, 75, 69,
+ 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, 73, 204, 83, 80, 65, 84,
+ 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76,
+ 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76,
+ 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83,
+ 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67,
+ 197, 83, 80, 65, 128, 83, 79, 89, 128, 83, 79, 87, 73, 76, 207, 83, 79,
+ 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, 79, 85, 84, 72, 45, 83, 76,
+ 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, 69, 128, 83,
+ 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, 65, 80, 128,
+ 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 82, 193, 83, 79, 81, 128, 83,
+ 79, 79, 206, 83, 79, 78, 74, 65, 77, 128, 83, 79, 78, 71, 128, 83, 79,
+ 78, 128, 83, 79, 77, 80, 69, 78, 199, 83, 79, 77, 128, 83, 79, 76, 73,
+ 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 72, 128, 83, 79,
+ 71, 68, 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67,
+ 84, 73, 79, 206, 83, 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 212,
+ 83, 79, 198, 83, 79, 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210,
+ 83, 79, 65, 80, 128, 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, 65,
+ 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69,
+ 128, 83, 78, 79, 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87,
+ 128, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83,
+ 78, 65, 75, 69, 128, 83, 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83,
+ 78, 193, 83, 77, 79, 75, 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199,
+ 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82,
+ 128, 83, 77, 65, 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76,
+ 76, 128, 83, 76, 85, 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79,
+ 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78,
+ 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68,
+ 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76,
+ 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78,
+ 73, 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65,
+ 83, 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87,
+ 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82,
+ 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83,
+ 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69,
+ 128, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89,
+ 128, 83, 73, 88, 84, 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84,
+ 72, 211, 83, 73, 88, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83,
+ 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78,
+ 84, 200, 83, 73, 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206,
+ 83, 73, 88, 45, 84, 72, 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82,
+ 73, 78, 199, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76,
+ 73, 78, 197, 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83,
+ 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84,
+ 72, 128, 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83,
+ 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69,
+ 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73,
+ 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128,
+ 83, 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73,
+ 69, 85, 77, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83,
+ 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128,
+ 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73,
+ 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79,
+ 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75,
+ 73, 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 51,
+ 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73,
+ 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73,
+ 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, 83,
+ 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, 73, 69,
+ 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83,
+ 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, 83,
+ 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, 83,
+ 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, 83,
+ 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, 75,
+ 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, 128,
+ 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83,
+ 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128,
+ 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83,
+ 73, 67, 75, 76, 69, 128, 83, 73, 66, 197, 83, 201, 83, 72, 89, 88, 128,
+ 83, 72, 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83,
+ 72, 89, 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89,
+ 128, 83, 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79,
+ 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128,
+ 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 85, 88, 128, 83,
+ 72, 85, 85, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72,
+ 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85,
+ 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 70,
+ 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, 85, 69,
+ 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 50, 128, 83, 72, 85,
+ 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, 80, 73, 67, 128, 83,
+ 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80,
+ 128, 83, 72, 82, 73, 73, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128,
+ 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83,
+ 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211,
+ 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75,
+ 69, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72,
+ 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45,
+ 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71,
+ 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85,
+ 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72,
+ 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79,
+ 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79,
+ 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72,
+ 79, 82, 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128,
+ 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79,
+ 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72,
+ 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65,
+ 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83,
+ 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83,
+ 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78,
+ 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72,
+ 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77,
+ 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83,
+ 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83,
+ 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193,
+ 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128,
+ 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83,
+ 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84,
128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69,
83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50,
128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80,
@@ -880,376 +984,384 @@ static unsigned char lexicon[] = {
128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79,
65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, 128,
83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65,
- 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 84, 128, 83, 72,
- 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72,
- 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72,
- 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83,
- 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, 78, 71, 128,
- 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, 79, 67, 75,
- 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, 75, 84, 73,
- 128, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72,
- 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, 83,
- 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, 65,
- 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71,
- 79, 210, 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84,
- 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78,
- 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89,
- 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, 128, 83,
- 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206,
- 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, 69, 206,
- 83, 69, 85, 88, 128, 83, 69, 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69,
- 81, 128, 83, 69, 84, 70, 79, 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85,
- 211, 83, 69, 83, 81, 85, 73, 81, 85, 65, 68, 82, 65, 84, 69, 128, 83, 69,
- 83, 65, 77, 197, 83, 69, 82, 86, 73, 67, 197, 83, 69, 82, 73, 70, 83,
- 128, 83, 69, 82, 73, 70, 211, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128,
- 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79,
- 210, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 77, 85,
- 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, 128,
- 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83,
- 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 77, 73, 77, 73, 78,
- 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, 69, 77, 73, 67,
- 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, 69, 77, 73,
- 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, 82, 67, 76, 197,
- 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, 45, 86, 79, 73,
- 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57,
- 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57,
- 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57,
- 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57,
- 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 56,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 53,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 50,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 55, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 52, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 49, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 57, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 54, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 51, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 48, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51,
- 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51,
- 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51,
- 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 57,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 54,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 51, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53,
- 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52,
- 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 48, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51,
- 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 52, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
- 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 56, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
- 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 49,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
- 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 53,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 57,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 53, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48,
- 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 55, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 48,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 52,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 48, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 56,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 52, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55,
- 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54,
- 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 49, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53,
- 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 53, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 57, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 50,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 54,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69, 76, 69,
- 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
- 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 54, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50,
- 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 128, 83,
- 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69, 67, 84,
- 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49,
- 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 51, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83, 69, 76,
- 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82,
- 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 55, 128,
- 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
- 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128, 83, 69,
- 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79,
- 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 48,
- 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, 76, 69, 67,
- 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 73, 83,
- 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, 71, 79,
- 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, 128, 83,
- 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, 83, 69, 69,
- 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 83,
- 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, 84,
- 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, 67, 79, 78, 68, 128,
- 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76,
- 128, 83, 69, 65, 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 68, 128, 83,
- 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76,
- 128, 83, 67, 82, 73, 80, 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67,
- 82, 69, 69, 206, 83, 67, 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80,
- 73, 85, 83, 128, 83, 67, 79, 82, 69, 128, 83, 67, 73, 83, 83, 79, 82, 83,
- 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79,
- 69, 68, 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79,
- 204, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67,
- 69, 80, 84, 69, 210, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65,
- 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128,
- 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65,
- 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, 79, 78,
- 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, 128,
- 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, 73, 76,
- 128, 83, 65, 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85,
- 128, 83, 65, 84, 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84,
- 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 83, 72, 128, 83, 65, 83,
- 65, 75, 128, 83, 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83,
- 65, 81, 128, 83, 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, 71, 193, 83,
- 65, 78, 89, 65, 75, 193, 83, 65, 78, 84, 73, 73, 77, 85, 128, 83, 65, 78,
- 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, 78, 68, 65, 76,
- 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203,
- 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 77, 75,
- 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, 200, 83, 65,
- 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, 65, 77, 128,
- 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83,
- 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65,
- 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65,
- 205, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67,
- 128, 83, 65, 76, 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 69, 85, 65,
- 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, 65, 72, 128, 83, 65, 73, 76,
- 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, 83, 65, 73, 75, 85, 82, 85,
- 128, 83, 65, 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65,
- 128, 83, 65, 71, 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 68,
- 72, 69, 128, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65,
- 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68,
- 72, 85, 128, 83, 65, 45, 73, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53,
- 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83,
- 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51,
- 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65,
- 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83,
- 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50,
- 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66,
- 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128,
- 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48,
- 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56,
- 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128,
- 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128,
- 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48,
- 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56,
- 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128,
- 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48,
- 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87,
- 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128,
- 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128,
- 82, 89, 65, 128, 82, 87, 79, 79, 128, 82, 87, 79, 128, 82, 87, 73, 73,
- 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, 82, 87, 69, 128, 82, 87, 65,
- 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, 82,
- 85, 85, 66, 85, 82, 85, 128, 82, 85, 84, 128, 82, 85, 83, 73, 128, 82,
- 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, 80,
- 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, 82,
- 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, 199,
- 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85,
- 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, 69, 82, 128, 82,
- 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69, 128, 82,
- 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66,
- 217, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82, 84, 65,
- 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84,
- 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128,
- 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82,
- 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82,
- 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, 88, 128, 82, 82, 79, 84, 128,
- 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, 82, 69, 88, 128, 82, 82, 69,
- 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, 200, 82,
- 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, 128, 82, 79, 87, 66, 79,
- 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73,
- 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 69,
- 196, 82, 79, 83, 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83,
- 69, 128, 82, 79, 79, 84, 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79,
- 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, 77, 65, 206,
- 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, 196, 82, 79, 67, 75,
- 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128,
- 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, 128, 82, 79, 65, 128, 82,
- 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82,
- 78, 65, 205, 82, 74, 69, 211, 82, 74, 69, 128, 82, 74, 197, 82, 73, 86,
- 69, 82, 128, 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85,
- 128, 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72,
- 128, 82, 73, 82, 65, 128, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73,
- 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66,
- 65, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 73, 128, 82, 73, 71, 86,
- 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71,
- 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70,
- 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83,
- 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69,
- 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71,
- 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78,
- 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84,
- 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73,
- 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73,
- 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73,
- 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72,
- 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128,
- 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85,
- 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85,
- 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45,
- 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83,
- 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83,
- 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73,
- 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83,
- 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72,
- 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45,
- 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128,
- 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85,
- 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73,
- 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73,
- 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89,
- 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73,
- 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73,
- 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73,
- 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82,
- 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45,
- 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85,
- 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85,
- 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128,
- 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73,
- 66, 66, 79, 78, 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72,
- 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, 83, 128,
- 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 86, 73, 78,
- 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65,
- 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82,
- 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88,
- 128, 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84,
- 82, 79, 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79,
- 82, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82,
- 79, 79, 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84,
- 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69,
- 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84,
- 65, 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83,
- 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78,
- 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69,
- 77, 69, 78, 212, 82, 69, 80, 72, 128, 82, 69, 80, 69, 65, 84, 69, 196,
- 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65,
- 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78,
- 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, 69, 68, 89, 128, 82,
- 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69,
- 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69,
- 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78,
- 199, 82, 69, 73, 196, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69,
- 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128,
- 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71,
- 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71,
- 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 69, 82, 69, 78,
+ 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, 83, 72,
+ 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65,
+ 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65,
+ 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83,
+ 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83,
+ 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65,
+ 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83,
+ 72, 65, 75, 84, 73, 128, 83, 72, 65, 73, 128, 83, 72, 65, 68, 79, 87, 69,
+ 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65,
+ 68, 68, 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54,
+ 128, 83, 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 51, 128, 83,
+ 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71,
+ 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83,
+ 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 86, 69,
+ 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69,
+ 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69,
+ 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45,
+ 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, 69, 206, 83, 69, 85, 88, 128,
+ 83, 69, 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69, 81, 128, 83, 69, 84,
+ 70, 79, 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81,
+ 85, 73, 81, 85, 65, 68, 82, 65, 84, 69, 128, 83, 69, 83, 65, 77, 197, 83,
+ 69, 82, 86, 73, 67, 197, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70,
+ 211, 83, 69, 81, 85, 69, 78, 67, 197, 83, 69, 80, 84, 69, 77, 66, 69, 82,
+ 128, 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84,
+ 79, 210, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 77,
+ 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75,
+ 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70,
+ 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 77, 73, 77,
+ 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, 69, 77,
+ 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, 69,
+ 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, 82, 67,
+ 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, 45, 86,
+ 79, 73, 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55,
+ 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55,
+ 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55,
+ 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 57,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 54,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 51,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 48,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 51,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52,
+ 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51,
+ 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50,
+ 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
+ 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
+ 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50,
+ 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 53,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57,
+ 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 48,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 52,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54,
+ 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53,
+ 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52,
+ 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69,
+ 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79,
+ 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 54,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50,
+ 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69,
+ 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45,
+ 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49,
+ 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83,
+ 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84,
+ 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48,
+ 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82,
+ 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128,
+ 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, 67,
+ 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49,
+ 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, 76,
+ 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69,
+ 76, 69, 67, 84, 69, 196, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77,
+ 193, 83, 69, 72, 128, 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128,
+ 83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78,
+ 128, 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69,
+ 45, 78, 79, 45, 69, 86, 73, 204, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67,
+ 84, 73, 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84,
+ 128, 83, 69, 67, 79, 78, 68, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212,
+ 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, 71, 85, 76, 204,
+ 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, 82, 85,
+ 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, 84,
+ 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, 82,
+ 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, 79,
+ 82, 69, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83,
+ 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69,
+ 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67,
+ 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69,
+ 210, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, 78, 68, 73, 67,
+ 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, 83, 66, 85, 194,
+ 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65, 89, 65, 78, 78, 65,
+ 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, 79, 78, 69, 128, 83, 65,
+ 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, 128, 83, 65, 87, 128,
+ 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, 73, 76, 128, 83, 65, 84,
+ 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, 84,
+ 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 197, 83, 65, 84, 67,
+ 72, 69, 76, 128, 83, 65, 84, 65, 78, 71, 65, 128, 83, 65, 83, 72, 128,
+ 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, 83, 65, 82, 193, 83, 65,
+ 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, 83, 65, 78, 89, 79, 79,
+ 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, 84, 73, 73, 77, 85,
+ 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65,
+ 78, 68, 65, 76, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65,
+ 77, 89, 79, 203, 83, 65, 77, 86, 65, 84, 128, 83, 65, 77, 80, 73, 128,
+ 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69,
+ 75, 72, 128, 83, 65, 77, 69, 75, 200, 83, 65, 77, 66, 65, 128, 83, 65,
+ 77, 65, 82, 73, 84, 65, 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69,
+ 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, 76, 84, 45, 50, 128,
+ 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, 76, 65, 76, 76, 65, 72,
+ 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, 205, 83, 65, 76, 65, 128,
+ 83, 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83,
+ 65, 75, 79, 84, 128, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197,
+ 83, 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65,
+ 73, 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65,
+ 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71,
+ 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 68, 72, 69, 128, 83,
+ 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70,
+ 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128,
+ 83, 65, 45, 73, 128, 83, 65, 45, 50, 128, 83, 48, 52, 54, 128, 83, 48,
+ 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50,
+ 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83,
+ 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51,
+ 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51,
+ 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83,
+ 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50,
+ 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50,
+ 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128,
+ 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48,
+ 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49,
+ 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52,
+ 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128,
+ 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48,
+ 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48,
+ 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128,
+ 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83,
+ 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89,
+ 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89,
+ 80, 128, 82, 87, 79, 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82,
+ 87, 73, 128, 82, 87, 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65,
+ 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85,
+ 66, 85, 82, 85, 128, 82, 85, 85, 128, 82, 85, 84, 128, 82, 85, 83, 73,
+ 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82,
+ 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80,
+ 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73,
+ 78, 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 128, 82, 85, 77, 201,
+ 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, 69, 82,
+ 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69,
+ 128, 82, 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85,
+ 71, 66, 217, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82,
+ 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82,
+ 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89,
+ 80, 128, 82, 82, 85, 88, 128, 82, 82, 85, 85, 128, 82, 82, 85, 84, 128,
+ 82, 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, 128, 82,
+ 82, 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, 82, 79,
+ 88, 128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128,
+ 82, 82, 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88,
+ 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82,
+ 82, 69, 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128,
+ 82, 82, 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 82,
+ 65, 128, 82, 79, 87, 66, 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, 196,
+ 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, 68,
+ 65, 128, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, 82, 79, 83,
+ 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, 128, 82, 79,
+ 79, 83, 84, 69, 82, 128, 82, 79, 79, 75, 128, 82, 79, 79, 70, 128, 82,
+ 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, 72,
+ 73, 78, 71, 89, 193, 82, 79, 196, 82, 79, 67, 75, 69, 84, 128, 82, 79,
+ 67, 203, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84,
+ 69, 196, 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, 78, 89, 73, 78, 199,
+ 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 77,
+ 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, 82, 76, 69, 128, 82, 74, 69,
+ 211, 82, 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84,
+ 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73,
+ 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128,
+ 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 70, 79, 82, 90, 65, 78,
+ 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 75, 82,
+ 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65,
+ 82, 68, 83, 128, 82, 73, 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84,
+ 45, 84, 79, 45, 76, 69, 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197,
+ 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72,
+ 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78,
+ 84, 73, 78, 199, 82, 73, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73,
+ 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73,
+ 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73,
+ 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72,
+ 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89,
+ 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84,
+ 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45,
+ 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85,
+ 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69,
+ 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83,
+ 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128,
+ 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128,
+ 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80,
+ 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45,
+ 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80,
+ 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76,
+ 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76,
+ 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85,
+ 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82,
+ 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77,
+ 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73,
+ 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77,
+ 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77,
+ 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45,
+ 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45,
+ 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75,
+ 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69,
+ 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69,
+ 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76,
+ 128, 82, 73, 69, 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128,
+ 82, 73, 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, 73, 65, 204, 82, 72,
+ 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71,
+ 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82,
+ 69, 86, 79, 76, 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78,
+ 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69,
+ 82, 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82,
+ 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, 82, 69, 84, 85, 82, 78,
+ 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, 69, 216, 82,
+ 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, 128, 82, 69, 83, 85,
+ 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, 77, 128, 82, 69, 83,
+ 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, 82, 69, 83, 80, 79, 78,
+ 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, 82, 69, 83, 79, 76, 85,
+ 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, 78, 67, 69, 128, 82, 69,
+ 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 200, 82, 69, 82, 69, 78, 71,
+ 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, 128, 82, 69, 80, 82, 69, 83,
+ 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 82, 69, 80,
+ 72, 128, 82, 69, 80, 69, 84, 73, 84, 73, 79, 206, 82, 69, 80, 69, 65, 84,
+ 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69,
+ 80, 65, 89, 65, 128, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, 69, 78,
+ 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 206, 82, 69, 77, 85,
+ 128, 82, 69, 77, 69, 68, 89, 128, 82, 69, 76, 73, 71, 73, 79, 78, 128,
+ 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69,
+ 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, 82,
+ 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, 69,
+ 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128,
+ 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128,
+ 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82,
+ 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71,
+ 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, 70, 69, 82, 69, 78,
67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69,
67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67,
84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65,
@@ -1265,56 +1377,57 @@ static unsigned char lexicon[] = {
83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65,
128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71,
197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77,
- 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 73, 83, 73, 78,
- 199, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65,
- 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76,
- 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 73, 128, 82,
- 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 70, 69, 128, 82, 65, 69,
- 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79,
- 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196,
- 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 66, 66,
- 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73,
- 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, 48, 50, 57,
- 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82,
- 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50,
- 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128,
- 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82,
- 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49,
- 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65,
- 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82,
- 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48,
- 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48,
- 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49,
- 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89,
- 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89,
- 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89,
- 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69,
- 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85,
- 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85,
- 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128,
- 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84,
- 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85,
- 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, 69,
- 83, 83, 69, 78, 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77,
- 193, 81, 85, 73, 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85,
- 211, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81,
- 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84,
- 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78,
- 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128,
- 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83,
- 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128,
- 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65,
- 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65,
- 68, 82, 65, 78, 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65,
- 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80,
- 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79,
- 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78,
- 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73,
- 80, 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, 128, 81,
- 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, 128, 81,
- 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, 128, 81,
- 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81,
- 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128,
+ 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82,
+ 65, 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73,
+ 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, 65, 89,
+ 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, 128, 82, 65, 73, 68,
+ 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65,
+ 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, 69, 77, 128, 82, 65,
+ 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, 128, 82, 65, 68,
+ 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, 67, 81,
+ 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 66, 66, 73, 84, 128,
+ 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, 65,
+ 51, 128, 82, 65, 50, 128, 82, 65, 45, 50, 128, 82, 48, 50, 57, 128, 82,
+ 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82, 48, 50,
+ 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50, 50, 128,
+ 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128, 82, 48,
+ 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82, 48, 49,
+ 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49, 51, 128,
+ 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65, 128, 82,
+ 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82, 48, 48,
+ 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48, 52, 128,
+ 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48, 51, 128,
+ 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49, 128, 82,
+ 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89, 84, 128,
+ 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89, 79, 128,
+ 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89, 65, 65,
+ 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69, 69, 128,
+ 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85, 88, 128,
+ 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85, 84, 128,
+ 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128, 81, 85, 82,
+ 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84, 197, 81, 85,
+ 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85, 79, 80, 128,
+ 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78,
+ 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73,
+ 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73,
+ 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, 85, 70, 128, 81,
+ 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128,
+ 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 69,
+ 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, 81, 85, 65, 84, 69,
+ 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 65, 82,
+ 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, 81, 85, 65, 82, 84, 69,
+ 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76,
+ 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78,
+ 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, 128, 81, 85, 128,
+ 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, 72, 128, 81, 79,
+ 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, 81, 79, 207, 81, 79, 70,
+ 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, 81, 78, 128, 81, 73, 88,
+ 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, 81, 73, 80, 128, 81, 73,
+ 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128,
+ 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69,
+ 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128,
+ 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, 69, 128,
+ 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, 81, 71, 65, 128,
81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, 65, 85,
128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128,
81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81,
@@ -1328,297 +1441,307 @@ static unsigned char lexicon[] = {
87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, 73, 128, 80,
87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, 65, 65, 128,
80, 87, 128, 80, 86, 128, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85,
- 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85,
- 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65,
- 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83,
- 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 73, 84, 89, 128, 80, 85,
- 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, 85, 80, 128,
- 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, 78,
- 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84,
- 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77,
- 80, 128, 80, 85, 77, 128, 80, 85, 69, 128, 80, 85, 66, 76, 73, 195, 80,
- 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, 85, 128, 80,
- 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, 83, 73,
- 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, 70, 73,
- 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, 83, 73,
- 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73,
- 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, 79, 86, 69, 128,
- 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82,
- 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, 79, 80, 79,
- 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128,
- 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80,
- 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76,
- 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 73, 86, 69, 128, 80,
- 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 71, 82, 69, 83, 83,
- 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, 85, 67, 84,
- 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, 86, 65, 84, 69, 128, 80,
- 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83,
- 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 78, 67,
- 69, 83, 83, 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82,
- 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206,
- 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78,
- 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82,
- 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80,
- 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80,
- 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69,
- 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80,
- 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85,
- 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66,
- 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45,
- 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128,
- 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80,
- 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80,
- 79, 87, 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69,
- 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85,
- 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197,
- 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83,
- 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80,
- 79, 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 82, 82,
- 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, 80,
- 80, 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69,
- 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 76,
- 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76,
- 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79,
- 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79,
- 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80,
- 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80,
- 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128,
- 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85,
- 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83,
- 128, 80, 76, 85, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85,
- 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 79, 87, 128,
- 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76,
- 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78,
- 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75,
- 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69,
- 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65,
- 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, 87, 82,
- 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, 70, 79,
- 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, 83, 69,
- 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, 128,
- 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, 73, 78,
- 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65,
- 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204,
- 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 65,
- 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76, 197, 80,
- 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73, 75, 79,
- 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, 128, 80, 73, 69, 85,
- 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 83,
- 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83,
- 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83,
- 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79,
- 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83,
- 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83,
- 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76,
- 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69,
- 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80, 73, 69,
- 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75, 72, 73,
- 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67, 128, 80,
- 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69, 85, 208,
- 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84, 128, 80,
- 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73,
- 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82,
- 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80,
- 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80,
- 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83,
- 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80,
- 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84,
- 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73,
- 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73,
- 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128,
- 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69,
- 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80,
- 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72,
- 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, 89, 78,
- 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65,
- 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80,
- 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 72,
- 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84,
- 65, 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85,
- 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65,
- 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128,
- 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 69, 84, 193, 80,
- 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86,
- 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, 82, 83, 79, 78, 128,
- 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69,
- 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65,
- 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82,
- 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128,
- 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77,
- 73, 78, 199, 80, 69, 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67,
- 84, 65, 128, 80, 69, 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83,
- 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, 128,
- 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69,
- 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82,
- 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85,
- 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 73,
- 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, 76,
- 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73,
- 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79,
- 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69,
- 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69,
- 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69,
- 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83,
- 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68,
- 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 67, 72, 128, 80,
- 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 128, 80, 67, 128, 80,
- 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78,
- 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80,
- 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 84, 84, 69, 82, 78,
- 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 200, 80,
- 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, 128, 80, 65,
- 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, 65, 83, 83, 73, 86,
- 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65,
- 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85,
- 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69,
- 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 85, 77, 128, 80, 65, 82, 84,
- 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 65, 82, 84, 73, 65,
- 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 80, 65, 82, 84, 73, 65,
- 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, 212, 80, 65, 82, 73,
- 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206,
- 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73,
- 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, 65, 80,
- 72, 82, 65, 83, 197, 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77,
- 128, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 65, 82, 65, 76, 76, 69,
- 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, 128, 80, 65, 82, 65, 75,
- 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80,
- 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, 71, 82, 65,
- 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, 65, 128,
- 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67,
- 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80,
- 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85,
- 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71,
- 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128,
- 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83,
- 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128,
- 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78,
- 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65,
- 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78,
- 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78,
- 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71,
- 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193,
- 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77,
- 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65,
- 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, 80, 65,
- 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, 80, 65,
- 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, 77, 65,
- 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, 72, 75,
- 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76,
- 76, 65, 83, 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78,
- 199, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65,
- 76, 73, 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65,
- 75, 80, 65, 203, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82,
- 84, 72, 82, 65, 128, 80, 65, 73, 82, 69, 196, 80, 65, 72, 76, 65, 86,
- 201, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80,
- 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65,
- 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, 69, 78,
- 84, 79, 128, 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65,
- 65, 73, 128, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128,
- 80, 50, 128, 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57,
- 128, 80, 48, 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80,
- 48, 48, 53, 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48,
- 48, 51, 128, 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48,
- 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65,
- 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79,
- 88, 69, 73, 193, 79, 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76,
- 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65,
- 89, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76,
- 65, 73, 68, 128, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79,
- 86, 128, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69,
- 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73,
- 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79,
- 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79,
- 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 82, 84, 72, 79, 71,
- 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84,
- 197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78,
- 212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82,
- 73, 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65,
- 204, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84,
- 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73,
- 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79,
- 83, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72,
- 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84,
- 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, 128, 79,
- 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, 45, 72,
- 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45,
- 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, 79, 90, 69, 128, 79, 79,
- 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79,
- 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, 128, 79,
- 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, 78, 69,
- 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, 84, 72,
- 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 67, 79, 77,
- 73, 78, 199, 79, 78, 65, 80, 128, 79, 77, 73, 83, 83, 73, 79, 206, 79,
- 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71,
- 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73,
- 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207,
- 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65,
- 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, 77, 128, 79, 72,
- 205, 79, 72, 128, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79,
- 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82,
- 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70,
- 128, 79, 69, 75, 128, 79, 68, 69, 78, 128, 79, 68, 196, 79, 67, 84, 79,
- 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 210, 79, 67,
- 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, 128, 79, 66, 83,
- 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 79, 76, 211, 79, 66, 79,
- 204, 79, 66, 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79,
- 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83,
- 128, 79, 66, 128, 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65,
- 70, 73, 76, 73, 128, 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66,
- 128, 79, 48, 53, 48, 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128,
- 79, 48, 52, 56, 128, 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48,
- 52, 53, 128, 79, 48, 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50,
- 128, 79, 48, 52, 49, 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79,
- 48, 51, 56, 128, 79, 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48,
- 51, 54, 67, 128, 79, 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79,
- 48, 51, 54, 128, 79, 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51,
- 51, 65, 128, 79, 48, 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49,
- 128, 79, 48, 51, 48, 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65,
- 128, 79, 48, 50, 57, 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79,
- 48, 50, 54, 128, 79, 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48,
- 50, 52, 65, 128, 79, 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50,
- 50, 128, 79, 48, 50, 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48,
- 128, 79, 48, 49, 57, 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128,
- 79, 48, 49, 55, 128, 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48,
- 49, 52, 128, 79, 48, 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49,
- 128, 79, 48, 49, 48, 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48,
- 65, 128, 79, 48, 49, 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128,
- 79, 48, 48, 55, 128, 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128,
- 79, 48, 48, 54, 68, 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66,
- 128, 79, 48, 48, 54, 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65,
- 128, 79, 48, 48, 53, 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79,
- 48, 48, 50, 128, 79, 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45,
- 89, 69, 128, 79, 45, 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88,
- 128, 78, 90, 89, 84, 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128,
- 78, 90, 89, 80, 128, 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85,
- 82, 88, 128, 78, 90, 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80,
- 128, 78, 90, 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78,
- 90, 85, 128, 78, 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88,
- 128, 78, 90, 73, 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128,
- 78, 90, 73, 69, 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90,
- 69, 88, 128, 78, 90, 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88,
- 128, 78, 90, 65, 84, 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78,
- 90, 65, 128, 78, 90, 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78,
+ 85, 128, 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84,
+ 128, 80, 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80,
+ 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80,
+ 85, 82, 83, 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65,
+ 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85,
+ 82, 128, 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85,
+ 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85,
+ 78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78,
+ 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, 128,
+ 80, 85, 69, 128, 80, 85, 66, 76, 73, 195, 80, 85, 65, 81, 128, 80, 85,
+ 65, 69, 128, 80, 85, 50, 128, 80, 85, 49, 128, 80, 85, 128, 80, 84, 72,
+ 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, 83, 73, 70, 73,
+ 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84,
+ 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, 83, 73, 70, 73,
+ 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73, 83, 77,
+ 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82,
+ 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84,
+ 69, 67, 84, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78,
+ 73, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80,
+ 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79,
+ 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78,
+ 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69,
+ 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80,
+ 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, 79, 71, 82, 65, 205, 80, 82, 79,
+ 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68,
+ 85, 67, 212, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84,
+ 197, 80, 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65,
+ 84, 82, 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 128, 80,
+ 82, 73, 78, 212, 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 77, 69,
+ 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69,
+ 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82,
+ 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69,
+ 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 70,
+ 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69,
+ 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69,
+ 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69,
+ 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, 73, 73,
+ 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, 79, 89,
+ 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, 85, 79,
+ 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, 66, 69,
+ 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, 80, 82,
+ 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80, 65, 128,
+ 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, 79, 87,
+ 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, 82,
+ 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67,
+ 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80,
+ 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84,
+ 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79,
+ 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 82, 82, 69,
+ 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, 80, 80,
+ 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, 128,
+ 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 77, 77,
+ 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 73, 83, 72, 128, 80,
+ 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 76,
+ 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, 75, 79, 74, 73, 128,
+ 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79, 128, 80, 79, 73, 78, 84,
+ 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, 79, 73, 78, 84, 128, 80,
+ 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, 79, 69, 84, 73, 195, 80,
+ 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80,
+ 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 79, 128, 80, 76, 85, 83,
+ 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, 82, 65, 76,
+ 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128,
+ 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79,
+ 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, 68, 128,
+ 80, 76, 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76,
+ 65, 78, 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76,
+ 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76,
+ 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73,
+ 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73,
+ 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72,
+ 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73,
+ 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71,
+ 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80,
+ 73, 78, 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73,
+ 80, 65, 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69,
+ 204, 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73,
+ 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76,
+ 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73,
+ 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, 128, 80, 73,
+ 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45,
+ 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, 45, 83, 73,
+ 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 83, 73,
+ 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83,
+ 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 83, 73,
+ 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73,
+ 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69,
+ 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82,
+ 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80,
+ 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75,
+ 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67,
+ 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69,
+ 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84,
+ 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128,
+ 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84,
+ 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80,
+ 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85,
+ 210, 80, 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79,
+ 78, 69, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65,
+ 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73,
+ 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80,
+ 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84,
+ 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79,
+ 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72,
+ 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80,
+ 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128,
+ 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82,
+ 89, 78, 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80,
+ 72, 65, 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45,
+ 80, 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80,
+ 72, 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85,
+ 84, 65, 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79,
+ 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84,
+ 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79,
+ 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 69, 84, 193,
+ 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73,
+ 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, 82, 83, 79, 78,
+ 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82,
+ 83, 69, 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85,
+ 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80,
+ 69, 82, 77, 73, 84, 84, 69, 196, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80,
+ 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, 80, 69, 82, 73, 83, 80, 79,
+ 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77, 73, 78, 199, 80, 69, 82, 70,
+ 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, 69, 82, 70,
+ 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 69, 82,
+ 67, 69, 78, 212, 80, 69, 80, 69, 84, 128, 80, 69, 80, 69, 212, 80, 69,
+ 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, 128, 80, 69, 78, 84, 65, 83, 69,
+ 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, 78, 84, 65,
+ 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, 197,
+ 80, 69, 78, 78, 217, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73,
+ 78, 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, 69, 78, 69, 84, 82, 65, 84,
+ 73, 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, 80, 69, 76, 65, 83, 84, 79,
+ 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, 73, 84, 72, 128, 80,
+ 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, 69, 72, 128, 80, 69, 200,
+ 80, 69, 69, 90, 73, 128, 80, 69, 69, 83, 72, 73, 128, 80, 69, 69, 80,
+ 128, 80, 69, 69, 77, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82,
+ 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69,
+ 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68,
+ 65, 204, 80, 69, 65, 67, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, 65,
+ 67, 197, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82,
+ 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128,
+ 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 215, 80,
+ 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 128, 80, 65, 84, 84, 69, 82,
+ 78, 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 200,
+ 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, 128, 80,
+ 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, 65, 83, 83, 73,
+ 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80,
+ 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79,
+ 85, 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69,
+ 128, 80, 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65,
+ 82, 85, 77, 128, 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72,
+ 73, 208, 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76,
+ 69, 196, 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206,
+ 80, 65, 82, 212, 80, 65, 82, 73, 67, 72, 79, 78, 128, 80, 65, 82, 69, 83,
+ 84, 73, 71, 77, 69, 78, 79, 206, 80, 65, 82, 69, 82, 69, 78, 128, 80, 65,
+ 82, 69, 78, 84, 72, 69, 83, 73, 83, 128, 80, 65, 82, 69, 78, 84, 72, 69,
+ 83, 73, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, 82, 65, 76,
+ 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, 69, 76, 128,
+ 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75,
+ 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75,
+ 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128,
+ 80, 65, 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80,
+ 200, 80, 65, 82, 65, 128, 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83,
+ 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 210, 80,
+ 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128,
+ 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80,
+ 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128,
+ 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85,
+ 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78,
+ 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80,
+ 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128,
+ 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76,
+ 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, 128, 80, 65, 78, 71, 76, 65,
+ 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, 65,
+ 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, 80,
+ 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193, 80, 65, 78,
+ 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, 85, 78, 71,
+ 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 77, 83, 72,
+ 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, 80, 65, 77, 73, 78,
+ 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, 80, 65, 77, 69, 78,
+ 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, 77, 65, 65, 69, 72,
+ 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, 72, 75, 65, 128,
+ 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83,
+ 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80,
+ 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73,
+ 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80,
+ 65, 203, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72,
+ 82, 65, 128, 80, 65, 73, 82, 69, 196, 80, 65, 73, 128, 80, 65, 72, 76,
+ 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197,
+ 80, 65, 68, 77, 193, 80, 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80,
+ 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69,
+ 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80,
+ 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80,
+ 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, 80,
+ 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, 48,
+ 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, 128,
+ 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, 80,
+ 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, 89,
+ 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, 65,
+ 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, 88, 69, 73, 193, 79,
+ 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, 86,
+ 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, 69,
+ 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79,
+ 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79, 86, 128, 79, 85, 84,
+ 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, 128, 79, 85, 84, 69,
+ 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67,
+ 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193,
+ 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128,
+ 79, 83, 77, 65, 78, 89, 193, 79, 83, 67, 128, 79, 82, 84, 72, 79, 71, 79,
+ 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, 197,
+ 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, 212, 79,
+ 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73,
+ 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82,
+ 68, 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79,
+ 80, 84, 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83,
+ 83, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80,
+ 80, 79, 83, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85,
+ 67, 72, 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82,
+ 65, 84, 79, 210, 79, 80, 69, 82, 65, 84, 73, 78, 199, 79, 80, 69, 78, 73,
+ 78, 199, 79, 80, 69, 78, 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76,
+ 73, 78, 69, 196, 79, 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, 69,
+ 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, 85, 84, 80, 85, 212, 79, 79,
+ 90, 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79,
+ 77, 85, 128, 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128,
+ 79, 78, 85, 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65,
+ 82, 128, 79, 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217,
+ 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78,
+ 197, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, 77, 73,
+ 83, 83, 73, 79, 206, 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82,
+ 79, 206, 79, 77, 69, 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76,
+ 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76,
+ 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193,
+ 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128,
+ 79, 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69,
+ 75, 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73,
+ 67, 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197,
+ 79, 70, 70, 128, 79, 69, 89, 128, 79, 69, 75, 128, 79, 68, 69, 78, 128,
+ 79, 68, 196, 79, 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82,
+ 128, 79, 67, 84, 69, 212, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79,
+ 67, 67, 76, 85, 83, 73, 79, 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73,
+ 79, 78, 128, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73,
+ 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79,
+ 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79,
+ 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128,
+ 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48,
+ 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128,
+ 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48,
+ 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49,
+ 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79,
+ 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79,
+ 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79,
+ 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48,
+ 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48,
+ 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57,
+ 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79,
+ 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79,
+ 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50,
+ 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57,
+ 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128,
+ 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48,
+ 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48,
+ 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49,
+ 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128,
+ 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68,
+ 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54,
+ 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53,
+ 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79,
+ 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45,
+ 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84,
+ 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128,
+ 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90,
+ 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79,
+ 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90,
+ 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84,
+ 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80,
+ 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90,
+ 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84,
+ 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90,
+ 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 128, 78,
89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89,
85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 69, 128, 78, 89, 85,
128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78,
89, 79, 79, 128, 78, 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65,
128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89,
73, 211, 78, 89, 73, 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68,
- 79, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, 78, 89, 73,
- 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, 201, 78, 89,
- 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78,
- 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78,
- 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, 128, 78, 87, 79, 79, 128,
- 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, 73, 128, 78, 87, 69, 128,
- 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, 128, 78, 86, 128, 78, 85,
- 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85,
- 84, 128, 78, 85, 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80,
- 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85,
- 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78,
- 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85,
- 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78,
- 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66,
- 69, 82, 128, 78, 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78,
+ 79, 128, 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69,
+ 84, 128, 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128,
+ 78, 89, 201, 78, 89, 72, 65, 128, 78, 89, 69, 84, 128, 78, 89, 69, 212,
+ 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, 69,
+ 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, 85, 128, 78, 89, 65,
+ 73, 128, 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89,
+ 65, 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128,
+ 78, 87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128,
+ 78, 87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85,
+ 85, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212,
+ 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88,
+ 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, 78,
+ 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, 78,
+ 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69,
+ 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65,
+ 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78,
+ 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78,
85, 75, 84, 65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85,
66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48,
50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78,
@@ -1659,470 +1782,493 @@ static unsigned char lexicon[] = {
65, 66, 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78,
45, 66, 82, 69, 65, 75, 73, 78, 199, 78, 79, 77, 73, 78, 65, 204, 78, 79,
75, 72, 85, 75, 128, 78, 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45,
- 66, 82, 69, 65, 203, 78, 78, 79, 128, 78, 78, 78, 65, 128, 78, 78, 71,
+ 66, 82, 69, 65, 203, 78, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, 79,
+ 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, 128,
+ 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, 128,
+ 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, 78,
+ 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, 128,
+ 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, 78, 78, 71,
79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71,
73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, 128,
- 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76,
- 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128,
- 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52,
- 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49,
- 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48,
- 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76,
- 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128,
- 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49,
- 128, 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78,
- 75, 65, 65, 82, 65, 69, 128, 78, 74, 89, 88, 128, 78, 74, 89, 84, 128,
- 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, 89, 80, 128, 78,
- 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 85,
- 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79,
- 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 69, 81, 128, 78, 74, 85, 65,
- 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, 128, 78, 74, 79, 84, 128, 78,
- 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, 74, 79, 128, 78, 74, 73, 88,
- 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, 69, 88, 128,
- 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 69,
- 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 201, 78, 74, 69, 85,
- 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, 69, 85, 65, 69, 78, 65, 128,
- 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, 69, 69, 69, 128, 78, 74, 69,
- 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, 78, 74, 65, 81, 128, 78, 74,
- 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, 77, 128,
- 78, 74, 65, 65, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, 84, 82, 69,
- 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, 128, 78, 73, 80,
- 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, 128, 78, 73, 78,
- 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, 73, 78, 69, 84, 69,
- 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 78, 73, 78,
- 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, 73, 77,
- 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65,
- 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 73, 128, 78, 73, 72, 83,
- 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, 73,
- 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, 72,
- 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, 78,
- 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, 45,
- 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, 83,
- 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, 78,
- 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, 73,
- 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, 73,
- 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, 73,
- 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, 128,
- 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66,
- 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, 72, 74,
- 65, 128, 78, 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86,
- 69, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85,
- 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71,
- 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128,
- 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71,
- 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207,
- 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75,
- 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71,
- 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73,
- 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128,
- 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78,
- 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65,
- 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71,
- 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71,
- 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85,
- 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, 209, 78, 71,
- 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, 71, 85, 77,
- 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, 83, 72, 65,
- 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 128, 78, 71, 71, 79,
- 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, 85,
- 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, 71, 69, 85, 65, 69,
- 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, 78, 71, 71, 69, 69,
- 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, 69, 69, 128, 78,
- 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, 65, 65, 77, 65, 69,
- 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128,
- 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78,
- 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65,
- 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78,
- 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78,
- 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69,
- 88, 128, 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78,
- 69, 128, 78, 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84,
- 69, 82, 128, 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, 84, 69, 196, 78,
- 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80,
- 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69,
- 78, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206,
- 78, 69, 71, 65, 84, 69, 196, 78, 69, 69, 128, 78, 69, 67, 75, 84, 73, 69,
- 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 68, 85, 88,
- 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, 128,
- 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, 88,
- 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, 78,
- 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, 78,
- 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, 73,
- 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, 68,
- 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, 85,
- 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69,
- 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68,
- 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77,
- 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65,
- 128, 78, 68, 65, 193, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66,
- 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89,
- 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128,
- 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79,
- 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78,
- 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73,
- 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73,
- 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78,
- 66, 65, 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65,
- 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65,
- 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65,
- 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83,
- 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82,
- 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81,
- 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, 79, 128, 78, 65, 78, 68, 128,
- 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, 65, 77,
- 50, 128, 78, 65, 77, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65,
- 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71,
- 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65,
- 128, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73,
- 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 65, 128, 78, 65,
- 193, 78, 65, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48,
- 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55,
- 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65,
- 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128,
- 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78,
- 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50,
- 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65,
- 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78,
- 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49,
- 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49,
- 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128,
- 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48,
- 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56,
- 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78,
- 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48,
- 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128,
- 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77,
- 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 217, 77, 87, 79, 79, 128, 77,
- 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128,
- 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77,
- 215, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, 78,
- 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, 83,
- 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77,
- 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83,
- 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179,
- 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 82, 88, 128, 77, 85, 82,
- 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85,
- 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80,
- 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77,
- 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128,
- 77, 85, 78, 65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76,
- 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79,
- 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85,
- 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77,
- 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72,
- 82, 69, 78, 71, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85,
- 71, 128, 77, 85, 199, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67,
- 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 78, 128, 77, 85, 65, 69,
- 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77,
- 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73,
- 197, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, 128, 77, 79, 85, 84, 200,
- 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73,
- 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65,
- 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78,
- 196, 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, 128, 77, 79, 82, 84, 85,
- 85, 77, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79,
- 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128,
- 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79,
- 206, 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128,
- 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72,
- 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78,
- 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79,
- 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79,
- 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77,
- 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65,
- 210, 77, 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78,
- 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69,
- 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77,
- 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128,
- 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69,
- 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 207, 77, 78, 89, 65,
- 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76,
- 128, 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77,
- 73, 212, 77, 73, 83, 82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85,
- 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77,
- 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77,
- 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73,
- 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85,
- 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79,
- 78, 211, 77, 73, 76, 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76,
- 204, 77, 73, 76, 75, 217, 77, 73, 76, 128, 77, 73, 75, 85, 82, 79, 78,
- 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, 77, 73, 73, 78,
- 128, 77, 73, 73, 128, 77, 73, 199, 77, 73, 69, 88, 128, 77, 73, 69, 85,
- 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65,
- 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71,
- 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128,
- 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 77,
- 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 77, 73, 69, 85, 77, 45, 80,
- 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 78, 73, 69, 85, 78,
- 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, 85, 67, 128, 77, 73, 69, 85, 77,
- 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80,
- 128, 77, 73, 69, 69, 128, 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197,
- 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 197,
- 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, 67, 82,
- 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 207, 77, 72, 90, 128, 77,
- 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, 88,
- 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, 128,
- 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, 71,
- 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, 128,
- 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, 69,
- 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, 77,
- 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79,
- 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69,
- 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65,
- 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77,
- 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77,
- 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65,
- 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69,
- 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69,
- 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128,
- 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128,
- 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82,
- 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76,
- 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69,
- 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206,
- 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69,
- 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65,
- 78, 83, 128, 77, 69, 82, 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82,
- 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, 82, 217, 77, 69, 78, 68, 85, 84,
- 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, 66, 69, 82, 83,
- 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, 69, 210,
- 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, 69, 205, 77,
- 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, 69, 73, 90, 73,
- 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, 72, 79, 78, 69,
- 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, 128, 77,
- 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77,
- 69, 69, 77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 69, 128, 77, 69, 68,
- 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69,
- 128, 77, 69, 68, 73, 67, 65, 204, 77, 69, 65, 84, 128, 77, 69, 65, 212,
- 77, 69, 65, 83, 85, 82, 69, 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69,
- 65, 83, 85, 82, 197, 77, 68, 85, 206, 77, 67, 72, 213, 77, 67, 72, 65,
- 206, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128,
- 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79,
- 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73,
- 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77,
- 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69,
- 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66,
- 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89,
- 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84,
- 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128,
- 77, 66, 51, 128, 77, 66, 50, 128, 77, 66, 128, 77, 194, 77, 65, 89, 69,
- 203, 77, 65, 89, 65, 78, 78, 65, 128, 77, 65, 89, 128, 77, 65, 88, 73,
- 77, 65, 128, 77, 65, 88, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65,
- 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84,
- 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83,
- 65, 71, 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65,
- 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85,
- 76, 73, 78, 197, 77, 65, 82, 89, 128, 77, 65, 82, 85, 75, 85, 128, 77,
- 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, 199, 77, 65, 82,
- 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52,
- 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65,
- 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 128, 77,
- 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 77, 65,
- 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, 84, 69, 128, 77, 65,
- 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128,
- 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, 197, 77, 65,
- 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, 83, 89, 79,
- 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, 65, 218, 77,
- 65, 78, 78, 65, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 68,
- 65, 73, 76, 73, 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72,
- 213, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197,
- 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197,
- 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 73,
- 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73,
- 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78,
- 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216,
- 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 72,
- 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, 78,
- 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 65, 80, 82,
- 65, 65, 78, 193, 77, 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78,
- 199, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69,
- 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77,
- 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69,
- 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69,
- 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128,
- 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 200,
- 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45,
- 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69,
- 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82,
- 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, 69, 128,
- 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, 52, 52,
- 128, 77, 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, 128, 77,
- 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, 77, 48,
- 51, 56, 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, 51, 53,
- 128, 77, 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65,
- 128, 77, 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, 65, 128,
- 77, 48, 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, 77, 48,
- 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, 48, 50,
- 54, 128, 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52,
- 128, 77, 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128,
- 77, 48, 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, 77, 48,
- 49, 56, 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49,
- 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, 48, 49,
- 53, 128, 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, 50, 72,
- 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50,
- 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49,
- 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49,
- 49, 128, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 48, 57,
- 128, 77, 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, 128, 77,
- 48, 48, 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, 77, 48,
- 48, 51, 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, 48, 48,
- 49, 65, 128, 77, 48, 48, 49, 128, 76, 218, 76, 89, 89, 128, 76, 89, 88,
- 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80,
- 128, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76,
- 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128,
- 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128,
- 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88,
- 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85,
- 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76, 85, 76,
- 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72, 128, 76,
- 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, 65,
- 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85,
- 50, 128, 76, 85, 178, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69,
- 78, 71, 197, 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87,
- 69, 210, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128,
- 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217,
- 76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76,
- 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76,
- 79, 79, 84, 128, 76, 79, 79, 80, 128, 76, 79, 79, 78, 128, 76, 79, 79,
- 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65,
- 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45,
- 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204,
- 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78,
- 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45,
- 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45,
- 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79,
- 77, 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76,
- 76, 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71,
- 79, 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69,
- 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 203, 76,
- 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 206, 76, 79,
- 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, 128, 76, 74, 85, 68,
- 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 88, 128, 76, 73,
- 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 197, 76, 73, 84,
- 84, 69, 210, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76,
- 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83,
- 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76,
- 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211,
- 76, 73, 78, 69, 45, 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69,
- 45, 51, 128, 76, 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128,
- 76, 73, 77, 77, 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77,
- 213, 76, 73, 77, 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78,
- 128, 76, 73, 77, 73, 84, 128, 76, 73, 77, 69, 128, 76, 73, 76, 89, 128,
- 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, 73, 73, 128, 76, 73,
- 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69,
- 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128,
- 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73,
- 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82,
- 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128,
- 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65,
- 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69,
- 204, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, 65,
- 69, 77, 128, 76, 69, 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82,
- 128, 76, 69, 212, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72,
- 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76,
- 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85,
- 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 71, 84, 72, 69, 78, 69,
- 82, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78,
- 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76,
- 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65,
- 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, 73, 79,
- 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, 70, 84,
- 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72,
- 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, 73, 68,
- 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, 45, 80,
- 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196,
- 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73,
- 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76,
- 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128,
- 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, 198,
- 76, 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65,
- 196, 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76,
- 65, 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65,
- 87, 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218,
- 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69,
- 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71,
- 69, 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65,
- 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 80, 128,
- 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71,
- 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77,
- 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197,
- 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193,
- 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75,
- 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65,
- 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 71, 85, 83,
+ 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76,
+ 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128,
+ 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53,
+ 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49,
+ 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48,
+ 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76,
+ 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128,
+ 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50,
+ 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, 75, 79, 77, 128, 78, 75,
+ 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78,
+ 74, 89, 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74,
+ 89, 82, 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128,
+ 78, 74, 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128,
+ 78, 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78,
+ 74, 85, 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74,
+ 79, 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79,
+ 128, 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74,
+ 73, 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74,
+ 73, 69, 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74,
+ 73, 128, 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128,
+ 78, 74, 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78,
+ 74, 69, 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74,
+ 69, 128, 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77,
+ 76, 73, 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88,
+ 128, 78, 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85,
+ 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69,
+ 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78,
+ 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82,
+ 84, 89, 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78,
+ 68, 65, 178, 78, 73, 77, 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73,
+ 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73,
+ 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128,
+ 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73,
+ 71, 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88,
+ 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85,
+ 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73,
+ 79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69,
+ 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78,
+ 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128,
+ 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45,
+ 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67,
+ 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78,
+ 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78,
+ 72, 74, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128,
+ 78, 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128,
+ 78, 71, 85, 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69,
+ 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71,
+ 79, 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78,
+ 128, 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200,
+ 78, 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78,
+ 128, 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85,
+ 77, 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85,
+ 197, 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71,
+ 75, 69, 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85,
+ 65, 69, 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81,
+ 128, 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71,
+ 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71,
+ 73, 69, 128, 78, 71, 72, 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78,
+ 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79,
+ 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71,
+ 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84,
+ 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69,
+ 206, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128,
+ 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65,
+ 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78,
+ 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69,
+ 69, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65,
+ 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77,
+ 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85,
+ 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128,
+ 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85,
+ 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71,
+ 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71,
+ 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193,
+ 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65,
+ 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 87, 128, 78,
+ 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 128,
+ 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 81, 85, 68, 65, 65, 128,
+ 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 128, 78, 69, 79, 128, 78,
+ 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, 78, 69, 76, 128,
+ 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71,
+ 65, 84, 69, 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 66, 69, 78, 83,
+ 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, 78,
+ 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, 68,
+ 85, 78, 128, 78, 68, 213, 78, 68, 79, 88, 128, 78, 68, 79, 84, 128, 78,
+ 68, 79, 80, 128, 78, 68, 79, 79, 128, 78, 68, 79, 78, 128, 78, 68, 79,
+ 77, 66, 85, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73,
+ 84, 128, 78, 68, 73, 81, 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88,
+ 128, 78, 68, 73, 69, 128, 78, 68, 73, 68, 65, 128, 78, 68, 73, 65, 81,
+ 128, 78, 68, 69, 88, 128, 78, 68, 69, 85, 88, 128, 78, 68, 69, 85, 84,
+ 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, 128, 78, 68, 69, 80, 128, 78,
+ 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84,
+ 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, 128, 78, 68, 65, 65, 78, 71,
+ 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, 128, 78, 68, 65, 193, 78,
+ 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66,
+ 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128,
+ 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78,
+ 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84,
+ 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66,
+ 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73,
+ 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 72, 128, 78,
+ 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65,
+ 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65, 88, 73,
+ 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, 68,
+ 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204,
+ 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, 65, 76,
+ 73, 90, 65, 84, 73, 79, 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73,
+ 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78,
+ 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79,
+ 78, 84, 72, 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65,
+ 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 77, 128, 78,
+ 65, 75, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201,
+ 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65,
+ 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65,
+ 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65,
+ 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 193, 78, 65, 50, 128, 78, 65,
+ 45, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, 52, 48,
+ 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, 65, 128,
+ 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, 128, 78,
+ 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, 78, 48,
+ 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, 48, 51,
+ 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, 56, 128,
+ 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, 128, 78,
+ 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, 48, 50,
+ 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, 57, 128,
+ 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, 56, 128,
+ 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, 78, 48,
+ 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, 49, 49,
+ 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, 128, 78,
+ 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, 48, 48,
+ 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128,
+ 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, 89,
+ 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, 89, 65,
+ 128, 77, 89, 193, 77, 89, 128, 77, 217, 77, 87, 79, 79, 128, 77, 87, 79,
+ 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87,
+ 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77,
+ 86, 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65,
+ 69, 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85,
+ 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74,
+ 193, 77, 85, 85, 128, 77, 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85,
+ 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51,
+ 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85,
+ 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85,
+ 82, 68, 65, 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68,
+ 65, 77, 128, 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128,
+ 77, 85, 79, 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77,
+ 85, 78, 83, 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, 85, 76, 84, 73, 83,
+ 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76,
+ 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65,
+ 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79,
+ 67, 85, 76, 65, 210, 77, 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84,
+ 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, 85, 73, 78, 128, 77,
+ 85, 71, 83, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, 128, 77, 85,
+ 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65,
+ 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193,
+ 77, 213, 77, 83, 128, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79,
+ 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72,
+ 128, 77, 79, 85, 84, 200, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197,
+ 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78,
+ 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 77, 79, 85,
+ 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 72, 69, 82, 128, 77, 79,
+ 84, 128, 77, 79, 82, 84, 85, 85, 77, 128, 77, 79, 82, 84, 65, 82, 128,
+ 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 77, 79, 82, 78, 73,
+ 78, 71, 128, 77, 79, 80, 128, 77, 79, 79, 83, 69, 45, 67, 82, 69, 197,
+ 77, 79, 79, 78, 128, 77, 79, 79, 206, 77, 79, 79, 77, 80, 85, 81, 128,
+ 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69,
+ 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78,
+ 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78,
+ 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78,
+ 79, 71, 82, 65, 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77,
+ 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128,
+ 77, 79, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 75, 69, 89, 128, 77, 79,
+ 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69,
+ 81, 128, 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76,
+ 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79,
+ 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76,
+ 128, 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77,
+ 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 83, 80, 128, 77,
+ 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, 82, 65,
+ 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 83, 82, 65, 128, 77, 73,
+ 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68,
+ 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79,
+ 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84,
+ 69, 82, 128, 77, 73, 78, 73, 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67,
+ 128, 77, 73, 78, 73, 66, 85, 83, 128, 77, 73, 77, 69, 128, 77, 73, 77,
+ 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, 128, 77,
+ 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, 76, 128,
+ 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82,
+ 73, 128, 77, 73, 73, 78, 128, 77, 73, 73, 128, 77, 73, 199, 77, 73, 69,
+ 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, 73, 69,
+ 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77,
+ 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45,
+ 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 45,
+ 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 77,
+ 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77,
+ 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, 85, 67,
+ 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, 73, 69,
+ 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, 73, 69, 128, 77,
+ 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200,
+ 77, 73, 68, 68, 76, 197, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80,
+ 69, 128, 77, 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82,
+ 207, 77, 73, 67, 210, 77, 72, 90, 128, 77, 72, 65, 128, 77, 72, 128, 77,
+ 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, 88, 128, 77, 71,
+ 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, 128, 77, 71, 85,
+ 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, 71, 79, 88, 128,
+ 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, 128, 77, 71, 207,
+ 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, 69, 88, 128, 77,
+ 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, 77, 71, 66, 79,
+ 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, 128, 77, 71,
+ 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, 78, 128, 77,
+ 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, 83, 65, 81,
+ 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, 71, 65, 84,
+ 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, 70, 79, 78,
+ 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, 81, 128, 77,
+ 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, 85, 81, 128,
+ 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, 90, 90, 79,
+ 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, 77, 69, 85,
+ 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, 77, 69, 84,
+ 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, 73, 65,
+ 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, 85, 83,
+ 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, 84, 65,
+ 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, 77, 69,
+ 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, 197, 77, 69, 83, 79,
+ 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, 79, 73, 84,
+ 73, 195, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69,
+ 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, 128, 77, 69, 82, 71, 69,
+ 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, 82, 217, 77,
+ 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69,
+ 77, 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69,
+ 77, 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128,
+ 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77,
+ 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80,
+ 72, 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82,
+ 85, 128, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, 69, 69, 77,
+ 128, 77, 69, 69, 69, 69, 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, 68,
+ 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, 67, 65,
+ 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69,
+ 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77,
+ 68, 85, 206, 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77,
+ 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, 77, 66,
+ 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, 128, 77,
+ 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, 82, 73,
+ 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, 66, 69,
+ 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, 128,
+ 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, 69, 69,
+ 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, 73, 128,
+ 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, 128, 77, 66,
+ 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, 77, 66, 51,
+ 128, 77, 66, 50, 128, 77, 66, 128, 77, 194, 77, 65, 89, 65, 78, 78, 65,
+ 128, 77, 65, 89, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77,
+ 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, 82, 73, 88,
+ 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, 77, 65,
+ 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, 69,
+ 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 72, 70,
+ 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, 78,
+ 197, 77, 65, 82, 89, 128, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84,
+ 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, 199, 77, 65, 82, 82, 73, 65,
+ 71, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, 128, 77,
+ 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, 82, 75, 45,
+ 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 128, 77, 65, 82, 67,
+ 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65,
+ 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85,
+ 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81,
+ 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, 197, 77, 65, 80, 73, 81,
+ 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, 83, 89, 79, 78, 128, 77,
+ 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65,
+ 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 68, 65, 73, 76, 73,
+ 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65,
+ 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69,
+ 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, 77, 65, 76, 65,
+ 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 75, 83, 85, 82,
+ 193, 77, 65, 73, 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77,
+ 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73,
+ 77, 85, 65, 78, 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76,
+ 66, 79, 216, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78,
+ 128, 77, 65, 73, 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65,
+ 128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75,
+ 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128,
+ 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 69, 83, 73, 128, 77, 65,
+ 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86,
+ 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71,
+ 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65,
+ 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128,
+ 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85,
+ 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68,
+ 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, 67, 82,
+ 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 65, 67,
+ 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, 206,
+ 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, 77, 65,
+ 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, 52, 52, 128, 77,
+ 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, 128, 77, 48, 52,
+ 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, 77, 48, 51, 56,
+ 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, 51, 53, 128, 77,
+ 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77,
+ 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, 65, 128, 77, 48,
+ 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, 77, 48, 50, 56,
+ 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, 48, 50, 54, 128,
+ 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77,
+ 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48,
+ 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, 77, 48, 49, 56,
+ 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, 54, 65,
+ 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128,
+ 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, 50, 72, 128, 77,
+ 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128,
+ 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66,
+ 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 49, 128,
+ 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 48, 57, 128, 77,
+ 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, 128, 77, 48, 48,
+ 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51,
+ 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65,
+ 128, 77, 48, 48, 49, 128, 76, 218, 76, 89, 89, 128, 76, 89, 88, 128, 76,
+ 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80, 128, 76,
+ 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79,
+ 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87,
+ 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85,
+ 85, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85,
+ 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128,
+ 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76,
+ 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72,
+ 128, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85,
+ 71, 65, 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128,
+ 76, 85, 50, 128, 76, 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82,
+ 69, 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197,
+ 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76,
+ 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85,
+ 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84,
+ 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82,
+ 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84,
+ 128, 76, 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76,
+ 79, 79, 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85,
+ 77, 128, 76, 79, 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71,
+ 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, 82,
+ 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67,
+ 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77,
+ 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71,
+ 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, 76,
+ 79, 77, 77, 65, 69, 128, 76, 79, 77, 128, 76, 79, 205, 76, 79, 76, 76,
+ 73, 80, 79, 80, 128, 76, 79, 76, 76, 128, 76, 79, 71, 210, 76, 79, 71,
+ 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, 76, 79, 71, 128,
+ 76, 79, 68, 69, 83, 84, 79, 78, 69, 128, 76, 79, 67, 79, 77, 79, 84, 73,
+ 86, 69, 128, 76, 79, 67, 75, 73, 78, 71, 45, 83, 72, 73, 70, 212, 76, 79,
+ 67, 203, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79,
+ 206, 76, 79, 65, 128, 76, 78, 128, 76, 76, 85, 85, 128, 76, 76, 79, 79,
+ 128, 76, 76, 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, 79,
+ 128, 76, 76, 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, 128,
+ 76, 76, 76, 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, 128,
+ 76, 76, 76, 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, 128,
+ 76, 76, 76, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, 69, 128, 76,
+ 74, 128, 76, 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76,
+ 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76,
+ 73, 84, 128, 76, 73, 83, 213, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196,
+ 76, 73, 81, 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, 76, 73, 78, 75, 73,
+ 78, 199, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, 69,
+ 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, 57, 128, 76, 73, 78,
+ 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49,
+ 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73,
+ 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, 84, 69, 196, 76,
+ 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, 84, 128, 76, 73,
+ 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 76, 89, 128, 76, 73, 76, 73,
+ 84, 72, 128, 76, 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128,
+ 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76,
+ 73, 70, 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69,
+ 80, 128, 76, 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73,
+ 66, 82, 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, 73, 65, 66, 73, 76,
+ 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, 89, 65, 78, 73,
+ 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, 76, 69, 90, 72,
+ 128, 76, 69, 88, 128, 76, 69, 86, 69, 204, 76, 69, 85, 77, 128, 76, 69,
+ 85, 65, 69, 80, 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76,
+ 69, 213, 76, 69, 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, 128,
+ 76, 69, 212, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78,
+ 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76, 69, 79,
+ 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65,
+ 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82,
+ 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71,
+ 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69,
+ 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, 128,
+ 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, 73, 79, 78,
+ 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, 70, 84, 87,
+ 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, 212,
+ 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, 197,
+ 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, 79,
+ 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, 76,
+ 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78,
+ 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69,
+ 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, 76,
+ 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, 198, 76,
+ 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, 196,
+ 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65,
+ 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 87,
+ 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, 76,
+ 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, 82,
+ 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69,
+ 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, 82,
+ 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 80, 128, 76,
+ 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78,
+ 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, 69, 68, 128, 76,
+ 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, 76, 65, 77, 68,
+ 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, 76, 65, 77, 65,
+ 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, 75, 72, 65, 78,
+ 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, 78, 128, 76, 65,
+ 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 72, 128, 76, 65, 71, 85, 83,
128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76,
65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65,
69, 128, 76, 65, 68, 217, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, 76,
65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, 66,
- 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, 65,
- 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, 76,
- 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, 65, 128, 76, 48,
- 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69,
- 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75,
- 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89,
- 65, 84, 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87,
- 73, 128, 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65,
- 65, 128, 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88,
- 73, 128, 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75,
- 88, 65, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, 75, 87,
- 79, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75,
- 87, 69, 128, 75, 87, 65, 89, 128, 75, 87, 65, 69, 84, 128, 75, 87, 65,
- 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, 85, 85, 72,
- 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, 85, 50,
- 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, 128, 75,
- 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, 128, 75,
- 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, 128, 75,
- 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, 75, 85, 78, 71, 128,
- 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85,
- 204, 75, 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180,
- 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, 65, 128, 75, 83,
- 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, 79,
- 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79,
- 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75,
- 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80,
- 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128,
- 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75,
- 80, 65, 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85,
- 128, 75, 79, 84, 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79, 82, 79,
- 78, 73, 83, 128, 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73, 195,
- 75, 79, 81, 78, 68, 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79, 80,
- 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79,
- 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, 77,
- 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, 66,
- 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75, 128,
- 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71,
- 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, 79,
- 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78,
- 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76, 73,
- 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193,
- 75, 76, 65, 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, 75,
- 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, 75,
- 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85, 84,
- 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79,
- 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, 89,
- 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, 78,
- 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, 75,
- 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, 75,
- 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, 83,
- 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77,
- 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65,
- 76, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69,
- 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75,
- 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73,
- 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 68,
- 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73,
- 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75,
- 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75,
- 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, 85,
- 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 65, 84, 128,
- 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 128, 75, 72, 79,
- 77, 85, 84, 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, 73, 84, 128, 75,
- 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75, 72,
- 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69,
- 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75,
- 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72,
- 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, 84, 201, 75, 72,
- 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72,
+ 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 73, 65, 204, 76, 65,
+ 66, 65, 84, 128, 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76,
+ 65, 65, 77, 85, 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48,
+ 48, 54, 65, 128, 76, 48, 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76,
+ 45, 83, 72, 65, 80, 69, 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85,
+ 128, 75, 89, 79, 128, 75, 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128,
+ 75, 89, 69, 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 65, 65, 128, 75,
+ 89, 65, 128, 75, 88, 87, 73, 128, 75, 88, 87, 69, 69, 128, 75, 88, 87,
+ 69, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, 65, 128, 75, 88, 85, 128,
+ 75, 88, 79, 128, 75, 88, 73, 128, 75, 88, 69, 69, 128, 75, 88, 69, 128,
+ 75, 88, 65, 65, 128, 75, 88, 65, 128, 75, 87, 85, 51, 49, 56, 128, 75,
+ 87, 79, 79, 128, 75, 87, 79, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128,
+ 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 65, 89, 128, 75, 87, 65,
+ 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85,
+ 88, 128, 75, 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128,
+ 75, 85, 83, 72, 85, 50, 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69,
+ 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128,
+ 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75,
+ 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128,
+ 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85,
+ 76, 128, 75, 85, 204, 75, 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52,
+ 128, 75, 85, 180, 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83,
+ 85, 85, 128, 75, 83, 83, 85, 128, 75, 83, 83, 79, 79, 128, 75, 83, 83,
+ 79, 128, 75, 83, 83, 73, 73, 128, 75, 83, 83, 73, 128, 75, 83, 83, 69,
+ 69, 128, 75, 83, 83, 69, 128, 75, 83, 83, 65, 85, 128, 75, 83, 83, 65,
+ 73, 128, 75, 83, 83, 65, 65, 128, 75, 83, 83, 65, 128, 75, 83, 83, 128,
+ 75, 83, 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73,
+ 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79,
+ 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65,
+ 128, 75, 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128,
+ 75, 80, 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85,
+ 88, 128, 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81,
+ 128, 75, 80, 65, 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86,
+ 85, 85, 128, 75, 79, 84, 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79,
+ 82, 79, 78, 73, 83, 128, 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73,
+ 195, 75, 79, 81, 78, 68, 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79,
+ 80, 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75,
+ 79, 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86,
+ 77, 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77,
+ 66, 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75,
+ 128, 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79,
+ 71, 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75,
+ 79, 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75,
+ 78, 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76,
+ 73, 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77,
+ 193, 75, 76, 65, 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75,
+ 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75,
+ 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85,
+ 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69,
+ 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73,
+ 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45,
+ 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85,
+ 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128,
+ 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83,
+ 83, 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73,
+ 77, 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83,
+ 65, 76, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77,
+ 69, 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128,
+ 75, 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75,
+ 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78,
+ 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75,
+ 73, 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128,
+ 75, 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196,
+ 75, 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72,
+ 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, 77,
+ 128, 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75,
+ 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 128, 75, 72,
+ 207, 75, 72, 77, 213, 75, 72, 73, 84, 128, 75, 72, 73, 78, 89, 65, 128,
+ 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75,
+ 72, 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72,
+ 69, 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201,
+ 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75,
+ 72, 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, 84, 201, 75,
+ 72, 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72,
128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67,
65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68,
128, 75, 69, 88, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83,
@@ -2141,71 +2287,74 @@ static unsigned char lexicon[] = {
69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, 75, 67, 65, 76, 128,
75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128,
75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, 65, 86,
- 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 84,
- 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75,
- 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84, 65, 86, 193,
- 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 75,
- 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65,
- 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65, 76, 128, 75,
- 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72,
- 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 207, 75,
- 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78,
- 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, 85,
- 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, 75, 65,
- 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, 80, 89,
- 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, 75, 65,
- 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, 80, 65,
- 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78,
- 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52,
- 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65,
- 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 82,
- 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70,
- 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52,
- 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65,
- 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65,
- 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75,
- 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48,
- 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128,
- 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128,
- 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80,
- 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74,
- 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128,
- 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 79, 85,
- 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71,
- 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 69, 68,
- 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, 74, 74,
- 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128,
- 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74,
- 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74,
- 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84,
- 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74,
- 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73,
- 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73,
- 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76,
- 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, 128,
- 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, 65,
- 77, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76,
- 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128,
- 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69,
- 69, 77, 128, 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128,
- 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78,
- 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128,
- 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65,
- 68, 69, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128,
- 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 202,
- 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72,
- 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65,
- 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, 211, 73, 84,
- 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82,
- 128, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 69, 78, 45, 73, 83,
- 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65,
- 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78,
- 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78,
- 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, 73,
- 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, 72, 65,
- 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84,
- 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 83,
- 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73,
+ 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 85,
+ 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65,
+ 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84,
+ 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65,
+ 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65,
+ 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65,
+ 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75,
+ 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65,
+ 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65,
+ 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80,
+ 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76,
+ 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75,
+ 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65,
+ 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75,
+ 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193,
+ 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75,
+ 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79,
+ 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75,
+ 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65,
+ 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53,
+ 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65,
+ 68, 179, 75, 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65,
+ 66, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70,
+ 128, 75, 65, 50, 128, 75, 65, 178, 75, 48, 48, 56, 128, 75, 48, 48, 55,
+ 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75,
+ 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65,
+ 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67,
+ 65, 84, 73, 79, 78, 128, 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84,
+ 128, 74, 85, 79, 80, 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74,
+ 85, 76, 89, 128, 74, 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74,
+ 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200,
+ 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79,
+ 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74,
+ 79, 73, 78, 69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74,
+ 89, 88, 128, 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128,
+ 74, 74, 85, 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74,
+ 74, 85, 82, 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74,
+ 85, 79, 80, 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88,
+ 128, 74, 74, 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74,
+ 73, 88, 128, 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69,
+ 88, 128, 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73,
+ 69, 128, 74, 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74,
+ 65, 128, 74, 73, 76, 128, 74, 73, 73, 128, 74, 73, 72, 86, 65, 77, 85,
+ 76, 73, 89, 65, 128, 74, 73, 65, 128, 74, 72, 79, 128, 74, 72, 69, 72,
+ 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, 74,
+ 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, 128,
+ 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, 72,
+ 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, 128,
+ 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73,
+ 89, 65, 78, 73, 128, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65,
+ 78, 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89,
+ 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74,
+ 65, 73, 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, 45,
+ 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, 74, 45, 83, 73,
+ 77, 80, 76, 73, 70, 73, 69, 196, 202, 73, 90, 72, 73, 84, 83, 65, 128,
+ 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, 73, 90, 65, 75, 65, 89,
+ 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65,
+ 128, 73, 85, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73,
+ 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 78, 128, 73,
+ 83, 79, 206, 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73,
+ 193, 73, 83, 45, 80, 73, 76, 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65,
+ 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 73, 82, 79, 78, 45, 67, 79,
+ 80, 80, 69, 210, 73, 82, 79, 78, 128, 73, 79, 84, 73, 70, 73, 69, 196,
+ 73, 79, 84, 65, 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73,
+ 79, 82, 128, 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, 66,
+ 76, 197, 73, 78, 86, 69, 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, 69,
+ 196, 73, 78, 86, 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82,
+ 128, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73,
195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69,
82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73,
78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69,
@@ -2234,1226 +2383,1233 @@ static unsigned char lexicon[] = {
78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45,
65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82,
70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73,
- 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 73, 83, 69, 79, 211, 73, 77,
- 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70,
- 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73,
- 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78,
- 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76,
- 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84,
- 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128,
- 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128,
- 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89,
- 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83,
- 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84,
- 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85,
- 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85,
- 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69,
- 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73,
- 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45,
- 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85,
- 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69,
- 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65,
- 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57,
- 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67,
- 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53,
- 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55,
- 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53,
- 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70,
- 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56,
- 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50,
- 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72,
- 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69,
- 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69,
- 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49,
- 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49,
- 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48,
- 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70,
- 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70,
- 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69,
- 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69,
- 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68,
- 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68,
- 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67,
- 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66,
- 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66,
- 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65,
- 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65,
- 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57,
- 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57,
- 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56,
- 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56,
- 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55,
- 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54,
- 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54,
- 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53,
- 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53,
- 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52,
- 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52,
- 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51,
- 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50,
- 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50,
- 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49,
- 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49,
- 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48,
- 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48,
- 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70,
- 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70,
- 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69,
- 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68,
- 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68,
- 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67,
- 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67,
- 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66,
- 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66,
- 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65,
- 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57,
- 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57,
- 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56,
- 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56,
- 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55,
- 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55,
- 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54,
- 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54,
- 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53,
- 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52,
- 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52,
- 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51,
- 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51,
- 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50,
- 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50,
- 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49,
- 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48,
- 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
- 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
- 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48,
- 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128,
- 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68,
- 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79,
- 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82,
- 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
- 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65,
- 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 72, 79,
- 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83,
- 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67,
- 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65,
- 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73,
- 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48,
- 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48,
- 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54,
- 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128,
- 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45,
- 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89,
- 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45,
- 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85,
- 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73,
- 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90,
- 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90,
- 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72,
- 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78,
- 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128,
- 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, 71,
- 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79,
- 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128,
- 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73,
- 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69,
- 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128,
- 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65,
- 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72,
- 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 86, 128, 72, 85, 82, 65, 78,
+ 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 78, 128, 73, 77, 73, 83, 69,
+ 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206,
+ 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79,
+ 82, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65,
+ 82, 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65,
+ 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73,
+ 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85,
+ 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76,
+ 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73,
+ 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71,
+ 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69,
+ 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73,
+ 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73,
+ 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80,
+ 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72,
+ 128, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78,
+ 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73,
+ 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128,
+ 73, 69, 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68,
+ 73, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, 55,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 54, 68,
+ 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 51, 51, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 69, 56,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 50, 67, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 57,
+ 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 52,
+ 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 49,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 67,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 68, 68, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 65,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 56, 67, 128, 73,
+ 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65,
+ 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49,
+ 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 65, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 57, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 49, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 48, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48,
+ 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 56, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 55, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 70, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 69, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70,
+ 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 54, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 53, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 68, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 67, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69,
+ 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 52, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 51, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 66, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 65, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68,
+ 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 50, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 49, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 57, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 56, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67,
+ 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 48, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 70, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 55, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 54, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65,
+ 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 69, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 68, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 53, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 52, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57,
+ 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 67, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 66, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 51, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 50, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56,
+ 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 65, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 57, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 49, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 48, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55,
+ 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 56, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 55, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 70, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 69, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54,
+ 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 54, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 53, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 68, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 67, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53,
+ 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 52, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 51, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 66, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 65, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52,
+ 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 50, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 49, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 57, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 56, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51,
+ 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 48, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 70, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 55, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 54, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49,
+ 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 69, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 68, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 53, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 52, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48,
+ 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 67, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 66, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 51, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 50, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70,
+ 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 65, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 57, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 49, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 48, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69,
+ 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 56, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 55, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 70, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 69, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68,
+ 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 54, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 53, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 68, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 67, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67,
+ 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 52, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 51, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 66, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 65, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66,
+ 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 50, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 49, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 57, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 56, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65,
+ 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 48, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 70, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 55, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 54, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56,
+ 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 69, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 68, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56,
+ 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 53, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 52, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55,
+ 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 67, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 66, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55,
+ 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 51, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 50, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54,
+ 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 65, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 57, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54,
+ 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 49, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 48, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53,
+ 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 56, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 55, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53,
+ 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 70, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 69, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52,
+ 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 54, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 53, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51,
+ 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 68, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 67, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51,
+ 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 52, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 51, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50,
+ 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 66, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 65, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50,
+ 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 50, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 49, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49,
+ 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 57, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 56, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49,
+ 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 48, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 70, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48,
+ 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 55, 128,
+ 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 54, 128, 73, 68,
+ 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128, 73, 68, 69, 79,
+ 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, 69, 79, 71, 82,
+ 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80,
+ 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45,
+ 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70,
+ 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78,
+ 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 72, 79, 85, 128, 73,
+ 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, 73, 67, 72,
+ 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128,
+ 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, 128, 73, 48, 49, 53,
+ 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, 49, 50, 128, 73,
+ 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, 48, 65, 128, 73,
+ 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, 57, 128, 73, 48,
+ 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, 73, 48, 48, 53,
+ 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, 48, 48, 51, 128,
+ 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, 85, 128, 73, 45,
+ 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, 128, 73, 45, 89,
+ 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, 65, 128, 73, 45,
+ 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, 128, 73, 45, 66, 69,
+ 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, 45, 65, 128, 72, 90,
+ 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, 72, 90, 90,
+ 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, 72, 90, 71,
+ 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, 68, 73, 65,
+ 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, 79, 206, 72,
+ 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, 72, 69, 78,
+ 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, 71, 128, 72, 88, 85, 79, 88,
+ 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, 88, 85, 79,
+ 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, 80, 128, 72,
+ 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, 88, 73, 80,
+ 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69,
+ 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, 88, 128, 72,
+ 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, 88, 65, 84,
+ 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, 72, 87, 65,
+ 73, 82, 128, 72, 86, 128, 72, 85, 83, 72, 69, 196, 72, 85, 82, 65, 78,
128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78,
68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, 77,
65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, 66,
50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, 68,
- 79, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65,
- 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83,
- 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, 128, 72,
- 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, 79, 83,
- 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, 197,
- 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217,
- 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 54, 128, 72,
- 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 53, 128, 72, 79,
- 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 52, 128, 72, 79, 82,
- 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 51, 128, 72, 79, 82, 73,
- 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 50, 128, 72, 79, 82, 73, 90,
- 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79,
- 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78,
- 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84,
- 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65,
- 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76,
- 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
- 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
- 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53,
- 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45,
- 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48,
- 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 52,
- 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 51, 128,
- 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 50, 128, 72,
- 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 49, 128, 72, 79,
- 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 48, 128, 72, 79, 82,
- 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 54, 128, 72, 79, 82, 73,
- 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 53, 128, 72, 79, 82, 73, 90,
- 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79,
- 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78,
- 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84,
- 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65,
- 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76,
- 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
- 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
- 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50,
- 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45,
- 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48,
- 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 48,
- 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 54, 128,
- 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 53, 128, 72,
- 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 52, 128, 72, 79,
- 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 51, 128, 72, 79, 82,
- 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 50, 128, 72, 79, 82, 73,
- 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 49, 128, 72, 79, 82, 73, 90,
- 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79,
- 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78,
- 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84,
- 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65,
- 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76,
- 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
- 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
- 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 128, 72, 79,
- 82, 73, 128, 72, 79, 82, 193, 72, 79, 79, 82, 85, 128, 72, 79, 79, 80,
- 128, 72, 79, 79, 78, 128, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79,
- 78, 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79,
- 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78,
- 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128,
- 72, 79, 73, 128, 72, 79, 67, 72, 79, 128, 72, 78, 85, 84, 128, 72, 78,
- 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 79, 88, 128, 72, 78, 79,
- 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, 72, 78, 73, 84, 128,
- 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, 78, 73, 69, 84, 128,
- 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, 78, 73, 128, 72, 78,
- 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, 72, 78, 65, 88, 128,
- 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89,
- 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80,
- 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77,
- 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85,
- 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85,
- 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72,
- 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80,
- 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69,
- 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65,
- 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72,
- 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76,
- 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128,
- 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72,
- 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72,
- 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128,
- 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76,
- 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76,
- 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72,
- 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65,
- 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 83, 84, 79, 82, 73, 195,
- 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73,
- 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45,
- 72, 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83,
- 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73,
- 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73,
- 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73,
- 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69,
- 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72,
- 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, 73, 128, 72, 72, 69, 69, 128,
- 72, 72, 69, 128, 72, 72, 65, 65, 128, 72, 71, 128, 72, 69, 88, 73, 70,
- 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, 78,
- 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, 82, 77,
- 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 69, 82,
- 77, 69, 83, 128, 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72,
- 69, 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77,
- 69, 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73,
- 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, 128, 72,
- 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78,
- 76, 217, 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69,
- 65, 82, 84, 83, 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72,
- 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45,
- 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65,
- 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 72, 69,
- 65, 68, 73, 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72,
- 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128,
- 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128,
- 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65,
- 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82,
- 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78,
- 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83,
- 83, 128, 72, 65, 82, 196, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79,
- 207, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 128, 72, 65,
- 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69,
- 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78,
- 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69,
- 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77,
- 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79,
- 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76,
- 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 67, 85, 84,
- 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, 128,
- 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69,
- 71, 204, 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72,
- 65, 45, 72, 65, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48,
- 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48,
- 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128,
- 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89,
- 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89,
- 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87,
- 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87,
- 65, 65, 128, 71, 87, 65, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128,
- 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85,
- 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 205, 71, 85,
- 76, 128, 71, 85, 73, 84, 65, 82, 128, 71, 85, 199, 71, 85, 69, 72, 128,
- 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83,
- 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85,
- 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83,
- 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199,
- 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84,
- 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65,
- 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71,
- 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69,
- 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65,
- 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65,
- 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71,
- 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, 128,
- 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77,
- 197, 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 77, 77, 193, 71, 82, 65,
- 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69,
- 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73,
- 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73,
- 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 71, 79,
- 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, 71, 79,
- 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71,
- 79, 73, 78, 199, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71,
- 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86,
- 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 84, 84,
- 65, 204, 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71,
- 76, 69, 73, 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128,
- 71, 74, 69, 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128,
- 71, 73, 83, 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65,
- 128, 71, 73, 82, 76, 128, 71, 73, 82, 51, 128, 71, 73, 82, 179, 71, 73,
- 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, 128, 71, 73, 78, 73, 73, 128,
- 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, 204, 71, 73, 77, 128, 71, 73,
- 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66,
- 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71,
- 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72,
- 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83,
- 84, 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72,
- 69, 85, 88, 128, 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85,
- 65, 69, 77, 128, 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65,
- 69, 82, 65, 69, 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128,
- 71, 72, 69, 84, 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197,
- 71, 72, 65, 89, 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80,
- 128, 71, 72, 65, 78, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73,
- 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65,
- 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 72,
- 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69,
- 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128,
- 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71,
- 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128,
- 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71,
- 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69,
- 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88,
- 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71,
- 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, 84, 193, 71, 69, 83, 84,
- 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78,
- 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, 128, 71, 69, 82,
- 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83,
- 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65,
- 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, 69, 78, 84, 76,
- 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, 75, 201, 71,
- 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78,
- 65, 84, 73, 79, 206, 71, 69, 205, 71, 69, 68, 79, 76, 65, 128, 71, 69,
- 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, 71,
- 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, 67, 65, 206,
- 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, 66, 69, 85, 88, 128, 71,
- 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, 66, 65, 75, 85, 82, 85, 78,
- 69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65,
- 128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, 128, 71, 65, 85, 78,
- 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 65, 84,
- 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72, 65, 78,
- 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, 79, 78, 128, 71,
- 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, 128, 71, 65, 82, 51,
- 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71,
- 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71,
- 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65,
- 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, 71, 65, 77, 65, 78,
- 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65, 71, 128, 71,
- 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65,
- 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, 71, 65, 196, 71, 65, 66,
- 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71, 65, 178, 71, 48,
- 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128, 71, 48, 53, 49,
- 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48, 52, 56, 128, 71,
- 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53, 65, 128, 71, 48,
- 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65, 128, 71, 48, 52,
- 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71, 48, 52, 48, 128,
- 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51, 55, 65, 128, 71,
- 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51, 54, 128, 71, 48,
- 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128, 71, 48, 51, 50,
- 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48, 50, 57, 128, 71,
- 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54, 65, 128, 71, 48,
- 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128, 71, 48, 50, 51,
- 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48, 50, 48, 65, 128,
- 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49, 56, 128, 71, 48,
- 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128, 71, 48, 49, 52,
- 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48, 49, 49, 65, 128,
- 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48, 57, 128, 71, 48,
- 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55, 65, 128, 71, 48,
- 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54, 128, 71, 48, 48,
- 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71, 48, 48, 50, 128,
- 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128, 70, 89, 80, 128,
- 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, 70, 87, 69, 128,
- 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 85, 88, 128, 70, 85, 84, 128,
- 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, 70, 85, 80,
- 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128,
- 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 74, 73,
- 128, 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, 85, 69, 128, 70, 84, 72,
- 79, 82, 193, 70, 82, 79, 87, 78, 73, 78, 71, 128, 70, 82, 79, 87, 78, 73,
- 78, 199, 70, 82, 79, 87, 78, 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84,
- 69, 196, 70, 82, 79, 78, 84, 45, 70, 65, 67, 73, 78, 199, 70, 82, 79,
- 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, 73, 84, 85, 128, 70,
- 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 70, 82, 73, 67, 65, 84, 73, 86,
- 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67,
- 200, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82,
- 65, 77, 69, 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77,
- 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70,
- 79, 85, 82, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79,
- 85, 82, 45, 84, 72, 73, 82, 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82,
- 73, 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82,
- 45, 76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78,
- 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128,
+ 79, 128, 72, 84, 83, 128, 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193,
+ 72, 80, 87, 71, 128, 72, 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197,
+ 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83,
+ 211, 72, 79, 85, 82, 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72,
+ 79, 84, 65, 128, 72, 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69,
+ 128, 72, 79, 82, 83, 197, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90,
+ 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
+ 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
+ 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54,
+ 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45,
+ 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48,
+ 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49,
+ 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128,
+ 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72,
+ 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79,
+ 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82,
+ 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73,
+ 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90,
+ 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79,
+ 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78,
+ 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84,
+ 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65,
+ 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76,
+ 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
+ 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
+ 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52,
+ 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45,
+ 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48,
+ 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52,
+ 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128,
+ 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72,
+ 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79,
+ 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82,
+ 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73,
+ 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90,
+ 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79,
+ 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78,
+ 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84,
+ 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65,
+ 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76,
+ 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45,
+ 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48,
+ 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49,
+ 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45,
+ 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48,
+ 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48,
+ 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128,
+ 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72,
+ 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79,
+ 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82,
+ 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73,
+ 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90,
+ 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79,
+ 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, 193, 72, 79, 79,
+ 82, 85, 128, 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75,
+ 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, 69, 217, 72,
+ 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, 69, 84,
+ 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76,
+ 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 73, 128,
+ 72, 79, 67, 72, 79, 128, 72, 78, 85, 84, 128, 72, 78, 85, 79, 88, 128,
+ 72, 78, 85, 79, 128, 72, 78, 79, 88, 128, 72, 78, 79, 84, 128, 72, 78,
+ 79, 80, 128, 72, 78, 73, 88, 128, 72, 78, 73, 84, 128, 72, 78, 73, 80,
+ 128, 72, 78, 73, 69, 88, 128, 72, 78, 73, 69, 84, 128, 72, 78, 73, 69,
+ 80, 128, 72, 78, 73, 69, 128, 72, 78, 73, 128, 72, 78, 69, 88, 128, 72,
+ 78, 69, 80, 128, 72, 78, 69, 128, 72, 78, 65, 88, 128, 72, 78, 65, 84,
+ 128, 72, 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77,
+ 89, 82, 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89,
+ 128, 72, 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128,
+ 72, 77, 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72,
+ 77, 85, 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79,
+ 88, 128, 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72,
+ 77, 73, 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73,
+ 69, 88, 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73,
+ 128, 72, 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77,
+ 65, 80, 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128,
+ 72, 76, 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72,
+ 76, 89, 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82,
+ 88, 128, 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88,
+ 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72,
+ 76, 79, 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88,
+ 128, 72, 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128,
+ 72, 76, 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76,
+ 69, 88, 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128,
+ 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, 72, 75, 128,
+ 72, 73, 90, 66, 128, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81,
+ 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, 71, 72, 45, 82, 69,
+ 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69,
+ 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128,
+ 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45,
+ 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128,
+ 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72,
+ 73, 69, 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68,
+ 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66,
+ 73, 83, 67, 85, 83, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, 72, 72,
+ 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, 128, 72,
+ 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, 65, 71, 82, 65,
+ 205, 72, 69, 88, 65, 71, 79, 78, 128, 72, 69, 82, 85, 84, 85, 128, 72,
+ 69, 82, 85, 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73,
+ 79, 78, 73, 65, 206, 72, 69, 82, 77, 69, 83, 128, 72, 69, 82, 69, 128,
+ 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, 78, 71, 128,
+ 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, 72,
+ 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73, 67, 79, 80, 84, 69,
+ 82, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, 128, 72, 69, 73, 83, 69, 73,
+ 128, 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, 76, 217, 72, 69,
+ 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, 65, 82, 84, 83,
+ 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84,
+ 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73,
+ 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84,
+ 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, 65, 68, 73,
+ 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83,
+ 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128, 72, 65, 85,
+ 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128, 72, 65, 84,
+ 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65,
+ 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78,
+ 128, 72, 65, 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128,
+ 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72,
+ 65, 82, 196, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, 207, 72, 65,
+ 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 211,
+ 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78,
+ 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84,
+ 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77,
+ 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69,
+ 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70,
+ 45, 67, 73, 82, 67, 76, 197, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82,
+ 68, 128, 72, 65, 76, 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72,
+ 65, 73, 82, 67, 85, 84, 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65,
+ 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70,
+ 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 65, 82, 85, 128, 72, 65,
+ 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 48, 48, 56, 128,
+ 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, 128, 72,
+ 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, 48, 48,
+ 50, 128, 72, 48, 48, 49, 128, 72, 45, 84, 89, 80, 197, 71, 89, 85, 128,
+ 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, 89, 73, 128, 71, 89, 70, 213,
+ 71, 89, 69, 69, 128, 71, 89, 65, 83, 128, 71, 89, 65, 65, 128, 71, 89,
+ 65, 128, 71, 89, 128, 71, 87, 85, 128, 71, 87, 73, 128, 71, 87, 69, 69,
+ 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, 71, 87, 65, 128, 71, 86, 128,
+ 71, 85, 82, 85, 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77,
+ 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, 128, 71, 85,
+ 78, 213, 71, 85, 205, 71, 85, 76, 128, 71, 85, 73, 84, 65, 82, 128, 71,
+ 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85,
+ 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68,
+ 78, 69, 83, 83, 128, 71, 85, 65, 82, 68, 69, 196, 71, 85, 65, 82, 68,
+ 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69,
+ 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87,
+ 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83,
+ 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, 73, 77, 65,
+ 67, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69,
+ 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82,
+ 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206,
+ 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89,
+ 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82,
+ 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82,
+ 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71,
+ 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, 65, 80, 69, 83,
+ 128, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68,
+ 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, 197,
+ 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, 82, 84,
+ 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89,
+ 78, 84, 72, 69, 84, 79, 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71,
+ 73, 128, 71, 79, 82, 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71,
+ 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 66, 76,
+ 73, 78, 128, 71, 79, 65, 76, 128, 71, 79, 65, 204, 71, 79, 65, 128, 71,
+ 78, 89, 73, 83, 128, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79,
+ 87, 73, 78, 199, 71, 76, 79, 84, 84, 65, 204, 71, 76, 79, 66, 197, 71,
+ 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, 200, 71, 76, 65, 71,
+ 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, 71, 73, 88, 128, 71,
+ 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, 71, 73, 83, 65, 76,
+ 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, 128, 71, 73, 82,
+ 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73,
+ 80, 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77,
+ 69, 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 69, 84, 128, 71,
+ 73, 68, 73, 77, 128, 71, 73, 66, 66, 79, 85, 211, 71, 73, 66, 65, 128,
+ 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, 128, 71, 72, 87, 65, 128, 71,
+ 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, 78, 193, 71, 72, 85, 128, 71,
+ 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, 71, 72, 79, 128, 71, 72, 73,
+ 128, 71, 72, 72, 65, 128, 71, 72, 69, 85, 88, 128, 71, 72, 69, 85, 78,
+ 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, 69, 85, 71,
+ 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, 72, 69, 85,
+ 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, 72, 69, 69,
+ 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, 71, 72, 65,
+ 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, 78, 128, 71, 72, 65,
+ 77, 65, 76, 128, 71, 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128,
+ 71, 72, 65, 73, 206, 71, 72, 65, 68, 128, 71, 72, 65, 65, 77, 65, 69,
+ 128, 71, 72, 65, 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128,
+ 71, 71, 87, 69, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71,
+ 71, 85, 88, 128, 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71,
+ 85, 82, 128, 71, 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71,
+ 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79,
+ 84, 128, 71, 71, 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128,
+ 71, 71, 73, 69, 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128,
+ 71, 71, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71,
+ 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, 84, 193,
+ 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, 69, 83, 72,
+ 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, 128,
+ 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, 71, 69,
+ 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, 84, 82,
+ 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, 69, 78,
+ 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, 75,
+ 201, 71, 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, 69,
+ 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 205, 71, 69, 68, 79, 76, 65,
+ 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65,
+ 82, 128, 71, 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71,
+ 67, 65, 206, 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, 66, 69, 85,
+ 88, 128, 71, 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, 66, 65, 75,
+ 85, 82, 85, 78, 69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, 85, 75, 73,
+ 84, 84, 65, 128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, 128, 71,
+ 65, 85, 78, 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128,
+ 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72,
+ 65, 78, 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, 79, 78,
+ 128, 71, 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, 128, 71,
+ 65, 82, 51, 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, 78, 77,
+ 65, 128, 71, 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, 65, 78,
+ 50, 128, 71, 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, 76, 65,
+ 128, 71, 65, 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, 71, 65,
+ 77, 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65,
+ 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, 45, 80,
+ 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, 71, 65,
+ 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71,
+ 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128,
+ 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48,
+ 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53,
+ 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65,
+ 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71,
+ 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51,
+ 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51,
+ 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128,
+ 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48,
+ 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54,
+ 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128,
+ 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48,
+ 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49,
+ 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128,
+ 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48,
+ 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48,
+ 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55,
+ 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54,
+ 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71,
+ 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128,
+ 70, 89, 80, 128, 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128,
+ 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 86, 83, 51,
+ 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 128, 70, 85, 88, 128, 70, 85,
+ 84, 128, 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, 70,
+ 85, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78,
+ 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, 78, 69, 83,
+ 83, 128, 70, 85, 76, 204, 70, 85, 74, 73, 128, 70, 85, 69, 84, 128, 70,
+ 85, 69, 204, 70, 85, 69, 128, 70, 84, 72, 79, 82, 193, 70, 82, 79, 87,
+ 78, 73, 78, 71, 128, 70, 82, 79, 87, 78, 73, 78, 199, 70, 82, 79, 87, 78,
+ 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, 69, 196, 70, 82, 79, 78, 84,
+ 45, 70, 65, 67, 73, 78, 199, 70, 82, 79, 205, 70, 82, 79, 71, 128, 70,
+ 82, 79, 199, 70, 82, 73, 84, 85, 128, 70, 82, 73, 69, 83, 128, 70, 82,
+ 73, 69, 196, 70, 82, 73, 67, 65, 84, 73, 86, 69, 128, 70, 82, 69, 84, 66,
+ 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, 200, 70, 82, 69, 69, 128, 70,
+ 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 128, 70, 82, 65,
+ 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65,
+ 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, 79, 85, 82, 84, 69, 69, 78,
+ 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82,
+ 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82,
+ 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79,
+ 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 83, 84, 69, 82, 73,
+ 78, 71, 128, 70, 79, 82, 87, 65, 82, 68, 128, 70, 79, 82, 84, 89, 128,
70, 79, 82, 84, 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70,
79, 82, 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 75, 69, 196, 70, 79,
82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79,
@@ -3462,384 +3618,389 @@ static unsigned char lexicon[] = {
128, 70, 79, 79, 84, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79,
78, 71, 77, 65, 78, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70,
79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79,
- 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 77, 128, 70, 76, 89, 128,
- 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76,
- 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69,
- 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69,
- 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79,
- 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 69,
- 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 85, 82, 45, 68, 69,
- 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84,
- 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65,
- 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128,
- 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71,
- 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70,
- 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70,
- 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73,
- 78, 197, 70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73,
- 83, 84, 69, 196, 70, 73, 83, 84, 128, 70, 73, 83, 72, 73, 78, 199, 70,
- 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73,
- 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73,
- 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83,
- 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 128, 70, 73, 82,
- 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82,
- 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 65,
- 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69,
- 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73,
- 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50,
- 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 197, 70,
- 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, 84, 217, 70,
- 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, 70, 84, 69, 69,
- 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, 128, 70, 72,
- 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128,
- 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, 70, 69, 83, 84, 73, 86, 65, 76,
- 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77,
- 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69,
- 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, 78, 197, 70,
- 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, 76, 76, 79, 87,
- 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213, 70, 69, 72, 128,
- 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 68, 128, 70, 69, 69,
- 196, 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65,
- 84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78,
- 128, 70, 69, 65, 82, 70, 85, 204, 70, 69, 65, 82, 128, 70, 65, 89, 65,
- 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85,
- 69, 128, 70, 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65,
- 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84,
- 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 82, 83, 201,
- 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, 69,
- 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, 70,
- 65, 76, 76, 73, 78, 199, 70, 65, 76, 76, 69, 206, 70, 65, 73, 76, 85, 82,
- 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84,
- 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, 65, 67, 84, 79, 210, 70, 65,
- 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69,
- 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128,
- 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77,
- 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53,
- 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49,
- 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48,
- 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128,
- 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70,
- 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48,
- 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48,
- 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128,
- 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70,
- 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51,
- 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48,
- 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70,
- 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50,
- 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49,
- 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70,
- 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49,
- 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50,
- 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70,
- 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48,
- 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128,
- 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 200, 69, 90, 69,
- 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 69, 83, 128, 69, 89, 69,
- 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128,
- 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83,
- 84, 82, 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82,
- 65, 45, 72, 73, 71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88,
- 84, 69, 78, 68, 69, 196, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79,
- 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128,
- 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65,
- 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88,
- 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69,
- 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 82, 71, 82, 69, 69,
- 206, 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206,
- 69, 85, 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79,
- 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69,
- 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128,
- 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69,
- 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79,
- 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 83, 85, 75, 85, 85, 68, 79,
- 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84,
- 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72,
- 178, 69, 83, 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 45,
- 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, 82, 82,
- 128, 69, 82, 73, 78, 50, 128, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69,
- 81, 85, 73, 86, 65, 76, 69, 78, 212, 69, 81, 85, 73, 68, 128, 69, 81, 85,
- 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85,
- 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128,
- 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82,
- 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69,
- 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 79,
- 76, 72, 88, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76,
+ 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 207, 70, 77, 128, 70, 76,
+ 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69,
+ 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76,
+ 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69,
+ 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, 80, 217, 70,
+ 76, 79, 79, 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128,
+ 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 85, 82,
+ 45, 68, 69, 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70,
+ 76, 65, 84, 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212,
+ 70, 76, 65, 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45,
+ 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70,
+ 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76,
+ 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73,
+ 88, 128, 70, 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69,
+ 45, 76, 73, 78, 197, 70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84,
+ 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 84, 128, 70, 73, 83, 72, 73,
+ 78, 199, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79,
+ 203, 70, 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83,
+ 200, 70, 73, 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79,
+ 82, 75, 83, 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 128,
+ 70, 73, 82, 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78,
+ 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70,
+ 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73,
+ 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197,
+ 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82,
+ 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82,
+ 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, 84,
+ 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, 70,
+ 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68,
+ 128, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, 69,
+ 85, 88, 128, 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, 70, 69, 83, 84, 73,
+ 86, 65, 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70,
+ 69, 82, 77, 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79,
+ 200, 70, 69, 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73,
+ 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69,
+ 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213,
+ 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 68,
+ 128, 70, 69, 69, 196, 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89,
+ 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70,
+ 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, 204, 70, 69, 65, 82, 128,
+ 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, 128, 70, 65, 88, 128, 70,
+ 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, 65, 84, 72, 69, 82, 128,
+ 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, 65, 78, 128, 70, 65, 84,
+ 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, 70, 65, 84, 72, 193, 70,
+ 65, 84, 128, 70, 65, 82, 83, 201, 70, 65, 81, 128, 70, 65, 80, 128, 70,
+ 65, 78, 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128,
+ 70, 65, 77, 73, 76, 89, 128, 70, 65, 76, 76, 73, 78, 199, 70, 65, 76, 76,
+ 69, 206, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70,
+ 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, 89, 128,
+ 70, 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67,
+ 69, 45, 54, 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 52,
+ 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 50, 128, 70, 65,
+ 67, 69, 45, 49, 128, 70, 65, 65, 77, 65, 69, 128, 70, 65, 65, 73, 128,
+ 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, 70, 48, 53, 50, 128, 70,
+ 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, 53, 49, 65, 128,
+ 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, 57, 128, 70, 48,
+ 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, 128, 70, 48, 52,
+ 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, 128, 70, 48, 52,
+ 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, 48, 52, 50, 128,
+ 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, 57, 128, 70, 48,
+ 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, 65, 128, 70, 48,
+ 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, 70, 48, 51, 52,
+ 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, 51, 49, 65, 128,
+ 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, 57, 128, 70, 48,
+ 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, 70, 48, 50, 53,
+ 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, 50, 50, 128, 70,
+ 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, 48, 128, 70, 48,
+ 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, 70, 48, 49, 54,
+ 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, 49, 51, 65, 128,
+ 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, 49, 128, 70, 48,
+ 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, 70, 48, 48, 55,
+ 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, 48, 52, 128, 70,
+ 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, 65, 128, 70, 48,
+ 48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90,
+ 128, 69, 89, 69, 83, 128, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128,
+ 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, 128, 69,
+ 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 69, 88, 84,
+ 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, 69, 88,
+ 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88,
+ 80, 82, 69, 83, 83, 73, 79, 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69,
+ 78, 212, 69, 88, 79, 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, 69,
+ 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, 88,
+ 67, 76, 65, 77, 65, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84,
+ 73, 79, 206, 69, 88, 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, 83,
+ 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86,
+ 69, 82, 71, 82, 69, 69, 206, 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82,
+ 79, 80, 69, 65, 206, 69, 85, 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65,
+ 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, 85, 82,
+ 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, 128, 69,
+ 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, 128, 69,
+ 85, 45, 65, 128, 69, 84, 88, 128, 69, 84, 78, 65, 72, 84, 65, 128, 69,
+ 84, 72, 69, 204, 69, 84, 69, 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89,
+ 128, 69, 84, 66, 128, 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 83, 84,
+ 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, 83,
+ 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, 178, 69, 83, 72,
+ 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65,
+ 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69,
+ 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 128, 69, 82, 71, 128, 69, 82,
+ 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, 69, 78, 212, 69, 81, 85, 73, 68,
+ 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83,
+ 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73,
+ 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, 67, 72, 128,
+ 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69,
+ 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82,
+ 77, 65, 128, 69, 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128,
+ 69, 79, 76, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76,
79, 80, 69, 128, 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82,
65, 84, 73, 79, 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89,
45, 49, 128, 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84,
72, 85, 83, 73, 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69,
128, 69, 78, 84, 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78,
- 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 79, 211, 69, 78,
- 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73,
- 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78,
- 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128,
- 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85,
- 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, 128, 69,
- 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77,
- 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73,
- 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77,
- 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66,
- 69, 68, 68, 73, 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73,
- 83, 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69,
- 76, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69,
- 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128,
- 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69,
- 76, 69, 67, 84, 82, 73, 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83,
- 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73,
- 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212,
- 69, 73, 83, 128, 69, 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217,
- 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71,
- 72, 84, 72, 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84,
- 69, 69, 206, 69, 73, 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73,
- 69, 128, 69, 72, 87, 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67,
- 65, 204, 69, 71, 73, 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78,
- 65, 128, 69, 69, 75, 65, 65, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73,
- 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68,
- 68, 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206,
- 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128,
- 69, 65, 82, 84, 200, 69, 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65,
- 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65,
- 68, 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69,
- 48, 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51,
- 52, 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50,
- 128, 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69,
- 48, 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48,
- 50, 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51,
- 128, 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128,
- 69, 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48,
- 49, 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48,
- 49, 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51,
- 128, 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69,
- 48, 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69,
- 48, 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48,
- 53, 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128,
- 69, 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68,
- 90, 87, 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128,
- 68, 90, 73, 128, 68, 90, 72, 69, 128, 68, 90, 72, 65, 128, 68, 90, 69,
- 76, 79, 128, 68, 90, 69, 69, 128, 68, 90, 69, 128, 68, 90, 65, 65, 128,
- 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, 207, 68,
- 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, 87, 69, 128, 68,
- 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, 86, 68, 128, 68,
- 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83,
- 72, 69, 78, 78, 65, 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82,
- 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68,
- 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179,
- 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128,
- 68, 85, 66, 50, 128, 68, 85, 66, 128, 68, 85, 194, 68, 82, 89, 128, 68,
- 82, 217, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128,
- 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79,
- 87, 69, 196, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, 69,
- 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, 68,
- 82, 69, 83, 83, 128, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77,
- 128, 68, 82, 65, 71, 79, 78, 128, 68, 82, 65, 71, 79, 206, 68, 82, 65,
- 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67,
- 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82,
- 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 68, 79, 87, 78, 45, 80,
- 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, 78, 128, 68, 79, 86, 69, 128,
- 68, 79, 85, 71, 72, 78, 85, 84, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85,
- 66, 76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85,
- 66, 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79,
- 84, 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79,
- 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84,
- 69, 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128,
- 68, 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84,
- 83, 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83,
- 45, 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55,
- 56, 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56,
- 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54,
- 55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 128,
- 68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68,
- 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, 128, 68, 79,
- 84, 83, 45, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68,
- 79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 53, 56, 128, 68, 79,
- 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68,
- 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55,
- 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52,
- 53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, 45, 52,
- 128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 51, 55, 56,
- 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, 84, 83, 45, 51, 54, 56,
- 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 54,
- 55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 53, 56,
- 128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53,
- 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51,
- 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, 68, 79, 84,
- 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 128, 68, 79, 84, 83,
- 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84,
- 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, 68, 79,
- 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55,
- 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, 52, 53,
- 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45,
- 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, 68, 79,
- 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53,
- 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45,
- 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51,
- 128, 68, 79, 84, 83, 45, 50, 56, 128, 68, 79, 84, 83, 45, 50, 55, 56,
- 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56,
- 128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54,
- 55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 53, 56,
- 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53,
- 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50,
- 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84,
- 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83,
- 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, 84,
- 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79,
- 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55,
- 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53,
- 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45,
- 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79,
- 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53,
- 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45,
- 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50,
- 51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45,
- 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, 68, 79, 84, 83,
- 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68,
- 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128,
- 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51,
- 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83,
- 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55,
- 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51,
- 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50,
- 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84,
- 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55,
- 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45,
- 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79,
- 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52,
- 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84,
- 83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52,
- 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84,
- 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79,
- 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45, 50, 128, 68, 79, 84, 83, 45,
- 49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 49,
- 55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 54,
- 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49,
- 54, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 53,
- 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49,
- 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84,
- 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79,
- 84, 83, 45, 49, 53, 128, 68, 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84,
- 83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79,
- 84, 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56,
- 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52,
- 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49,
- 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84,
- 83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55,
- 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45,
- 49, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83,
- 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45,
- 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83,
- 45, 49, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68,
- 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 128,
- 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53,
- 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45,
- 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, 128,
- 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51,
- 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49,
- 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84,
- 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128,
- 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49,
- 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, 68, 79, 84,
- 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55,
- 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45,
- 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55,
- 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83,
- 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68,
- 79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 128, 68, 79,
- 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68,
- 79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 56, 128,
- 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50,
- 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49,
- 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84,
- 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, 128,
- 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49,
- 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 128, 68, 79, 84,
- 83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79,
- 84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55,
- 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49,
- 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68,
- 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53,
- 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83,
- 45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56,
- 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83,
- 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54,
- 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50,
- 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49,
- 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84,
- 83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55,
- 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45,
- 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79,
- 84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51,
- 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84,
- 83, 45, 49, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51,
- 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84,
- 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128,
- 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49,
- 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68,
- 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49,
- 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68,
- 79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50,
- 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 128,
- 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45,
- 49, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52,
- 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79,
- 84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52,
- 128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50,
- 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 76,
- 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79, 82, 128, 68, 79, 79, 78,
- 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 80,
- 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, 79, 76, 76, 65, 210, 68,
- 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84,
- 128, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, 211, 68, 79, 68, 69, 75,
- 65, 84, 65, 128, 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72,
- 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65,
- 128, 68, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76,
- 79, 128, 68, 76, 73, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76,
- 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128,
- 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 74, 128,
- 68, 73, 90, 90, 217, 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73,
- 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84,
- 73, 79, 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69,
- 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68,
- 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73,
- 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84,
- 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73,
- 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128,
- 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73,
- 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84,
- 73, 78, 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73,
- 78, 84, 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193,
- 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65,
- 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, 80,
- 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, 68,
- 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, 128,
- 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, 78,
- 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78,
- 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, 73,
- 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73,
- 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 76, 128, 68,
- 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, 200, 68, 73, 71, 82,
- 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, 193, 68, 73, 71, 82, 65,
- 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, 73, 71, 79, 82, 71, 79,
- 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84,
- 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70,
- 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83,
- 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70,
- 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83,
- 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, 128, 68, 73, 197, 68, 73,
- 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, 78, 73, 75,
- 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, 68, 83,
- 128, 68, 73, 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68,
- 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68,
- 73, 65, 76, 89, 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68,
- 73, 65, 71, 79, 78, 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73,
- 65, 69, 82, 69, 83, 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83,
- 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72,
- 79, 79, 128, 68, 72, 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68,
- 72, 72, 79, 79, 128, 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72,
- 72, 69, 69, 128, 68, 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69,
- 69, 128, 68, 72, 65, 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128,
- 68, 72, 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72,
- 69, 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200,
+ 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 81, 128, 69, 78,
+ 79, 211, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84,
+ 128, 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78,
+ 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69,
+ 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69,
+ 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199,
+ 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78,
+ 73, 79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69,
+ 77, 80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128,
+ 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69,
+ 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, 78, 71, 128, 69, 76, 84, 128,
+ 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69,
+ 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 69, 86, 69,
+ 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, 69, 76,
+ 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69,
+ 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82,
+ 73, 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84,
+ 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78,
+ 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, 69, 73, 83, 128, 69,
+ 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, 69, 73, 71, 72, 84, 72,
+ 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, 72, 84, 72, 128, 69,
+ 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 73,
+ 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, 69, 128, 69, 72, 87,
+ 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, 65, 204, 69, 71, 73,
+ 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, 65, 128, 69, 69, 75,
+ 65, 65, 128, 69, 69, 72, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128,
+ 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, 68,
+ 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206, 69,
+ 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, 69,
+ 65, 82, 84, 200, 69, 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65, 77,
+ 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, 68,
+ 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, 48,
+ 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, 52,
+ 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, 128,
+ 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, 48,
+ 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, 50,
+ 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, 128,
+ 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, 69,
+ 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, 49,
+ 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, 49,
+ 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, 128,
+ 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, 48,
+ 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, 48,
+ 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53,
+ 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69,
+ 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68, 90,
+ 90, 65, 128, 68, 90, 87, 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68,
+ 90, 74, 69, 128, 68, 90, 73, 128, 68, 90, 72, 69, 128, 68, 90, 72, 65,
+ 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, 69, 128, 68, 90, 69, 128, 68,
+ 90, 65, 65, 128, 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128,
+ 68, 89, 207, 68, 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68,
+ 87, 69, 128, 68, 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68,
+ 86, 68, 128, 68, 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 83, 75,
+ 128, 68, 85, 83, 72, 69, 78, 78, 65, 128, 68, 85, 82, 65, 84, 73, 79, 78,
+ 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85,
+ 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128,
+ 68, 85, 78, 179, 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85,
+ 71, 85, 68, 128, 68, 85, 66, 50, 128, 68, 85, 66, 128, 68, 85, 194, 68,
+ 82, 89, 128, 68, 82, 217, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82,
+ 79, 80, 83, 128, 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83,
+ 72, 65, 68, 79, 87, 69, 196, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82,
+ 73, 86, 69, 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82,
+ 73, 204, 68, 82, 69, 83, 83, 128, 68, 82, 65, 85, 71, 72, 84, 211, 68,
+ 82, 65, 77, 128, 68, 82, 65, 205, 68, 82, 65, 71, 79, 78, 128, 68, 82,
+ 65, 71, 79, 206, 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77,
+ 65, 83, 128, 68, 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, 67, 72, 77,
+ 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, 87, 65, 82,
+ 68, 211, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, 68, 79, 87,
+ 78, 128, 68, 79, 86, 69, 128, 68, 79, 85, 71, 72, 78, 85, 84, 128, 68,
+ 79, 85, 66, 84, 128, 68, 79, 85, 66, 76, 69, 196, 68, 79, 85, 66, 76, 69,
+ 45, 76, 73, 78, 197, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, 68,
+ 79, 85, 66, 76, 69, 128, 68, 79, 84, 84, 69, 68, 45, 80, 128, 68, 79, 84,
+ 84, 69, 68, 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 76, 128, 68, 79, 84,
+ 84, 69, 68, 128, 68, 79, 84, 84, 69, 196, 68, 79, 84, 83, 45, 56, 128,
+ 68, 79, 84, 83, 45, 55, 56, 128, 68, 79, 84, 83, 45, 55, 128, 68, 79, 84,
+ 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, 84, 83,
+ 45, 54, 55, 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 53, 56,
+ 128, 68, 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, 84, 83, 45, 53, 55,
+ 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55,
+ 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, 54,
+ 128, 68, 79, 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 52, 56, 128, 68,
+ 79, 84, 83, 45, 52, 55, 56, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79,
+ 84, 83, 45, 52, 54, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, 128, 68,
+ 79, 84, 83, 45, 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 128, 68, 79,
+ 84, 83, 45, 52, 53, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 56, 128, 68,
+ 79, 84, 83, 45, 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128,
+ 68, 79, 84, 83, 45, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53,
+ 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, 84, 83, 45, 52,
+ 53, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, 51, 56, 128,
+ 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, 79, 84, 83, 45, 51, 55, 128, 68,
+ 79, 84, 83, 45, 51, 54, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128,
+ 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68,
+ 79, 84, 83, 45, 51, 53, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128,
+ 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56,
+ 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51,
+ 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45,
+ 51, 53, 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51,
+ 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45,
+ 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79,
+ 84, 83, 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68,
+ 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55,
+ 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51,
+ 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68,
+ 79, 84, 83, 45, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53,
+ 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52,
+ 128, 68, 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 50, 56, 128, 68,
+ 79, 84, 83, 45, 50, 55, 56, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79,
+ 84, 83, 45, 50, 54, 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68,
+ 79, 84, 83, 45, 50, 54, 55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79,
+ 84, 83, 45, 50, 53, 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68,
+ 79, 84, 83, 45, 50, 53, 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128,
+ 68, 79, 84, 83, 45, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53,
+ 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50,
+ 53, 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52,
+ 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50,
+ 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84,
+ 83, 45, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79,
+ 84, 83, 45, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56,
+ 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52,
+ 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79,
+ 84, 83, 45, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54,
+ 128, 68, 79, 84, 83, 45, 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52,
+ 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55,
+ 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51,
+ 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83,
+ 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84,
+ 83, 45, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128,
+ 68, 79, 84, 83, 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53,
+ 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84,
+ 83, 45, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128,
+ 68, 79, 84, 83, 45, 50, 51, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56,
+ 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50,
+ 51, 52, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84,
+ 83, 45, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54,
+ 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50,
+ 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68,
+ 79, 84, 83, 45, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52,
+ 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68,
+ 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51,
+ 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83,
+ 45, 50, 51, 52, 128, 68, 79, 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45,
+ 50, 128, 68, 79, 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56,
+ 128, 68, 79, 84, 83, 45, 49, 55, 128, 68, 79, 84, 83, 45, 49, 54, 56,
+ 128, 68, 79, 84, 83, 45, 49, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 54,
+ 55, 128, 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 53, 56,
+ 128, 68, 79, 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53,
+ 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49,
+ 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 128, 68, 79, 84,
+ 83, 45, 49, 53, 54, 128, 68, 79, 84, 83, 45, 49, 53, 128, 68, 79, 84, 83,
+ 45, 49, 52, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, 79, 84,
+ 83, 45, 49, 52, 55, 128, 68, 79, 84, 83, 45, 49, 52, 54, 56, 128, 68, 79,
+ 84, 83, 45, 49, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55,
+ 128, 68, 79, 84, 83, 45, 49, 52, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53,
+ 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45,
+ 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 56, 128, 68, 79,
+ 84, 83, 45, 49, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53,
+ 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 128, 68, 79, 84, 83, 45,
+ 49, 52, 53, 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, 49,
+ 51, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, 45,
+ 49, 51, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, 128, 68, 79, 84, 83,
+ 45, 49, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 128, 68,
+ 79, 84, 83, 45, 49, 51, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, 128,
+ 68, 79, 84, 83, 45, 49, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51,
+ 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 56, 128, 68, 79, 84, 83,
+ 45, 49, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55,
+ 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51,
+ 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49,
+ 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, 84,
+ 83, 45, 49, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55,
+ 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45,
+ 49, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 56, 128, 68, 79,
+ 84, 83, 45, 49, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52,
+ 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 56, 128, 68, 79, 84,
+ 83, 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52,
+ 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 128, 68, 79, 84,
+ 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 128, 68, 79,
+ 84, 83, 45, 49, 51, 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, 79, 84,
+ 83, 45, 49, 50, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 128, 68, 79,
+ 84, 83, 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 56,
+ 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50,
+ 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 56, 128, 68, 79, 84, 83, 45, 49,
+ 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, 84,
+ 83, 45, 49, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55,
+ 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45,
+ 49, 50, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 128, 68, 79, 84, 83,
+ 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, 56, 128, 68,
+ 79, 84, 83, 45, 49, 50, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54,
+ 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83,
+ 45, 49, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 128, 68,
+ 79, 84, 83, 45, 49, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52,
+ 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 128, 68, 79, 84,
+ 83, 45, 49, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53,
+ 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 128, 68, 79,
+ 84, 83, 45, 49, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53,
+ 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51,
+ 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45,
+ 49, 50, 51, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 56, 128, 68, 79,
+ 84, 83, 45, 49, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51,
+ 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 128, 68, 79, 84, 83, 45,
+ 49, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 56, 128,
+ 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50,
+ 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 56, 128,
+ 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49,
+ 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, 84,
+ 83, 45, 49, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55,
+ 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45,
+ 49, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55,
+ 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83,
+ 45, 49, 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 56,
+ 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83,
+ 45, 49, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53,
+ 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, 68,
+ 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49,
+ 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 128, 68,
+ 79, 84, 83, 45, 49, 50, 51, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 128,
+ 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84,
+ 83, 128, 68, 79, 84, 76, 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79,
+ 82, 128, 68, 79, 79, 78, 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65,
+ 73, 206, 68, 79, 76, 80, 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68,
+ 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73,
+ 128, 68, 79, 73, 84, 128, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, 211,
+ 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 66, 82, 79, 128, 68, 79, 65,
+ 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77,
+ 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68,
+ 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, 72, 89, 65, 128,
+ 68, 76, 72, 65, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, 128,
+ 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, 68,
+ 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 73, 90, 90,
+ 217, 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128,
+ 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78,
+ 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 128,
+ 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, 73, 86, 73,
+ 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84,
+ 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78,
+ 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, 83, 83,
+ 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73,
+ 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73,
+ 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78,
+ 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84,
+ 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73,
+ 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68,
+ 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, 80, 76, 79, 85,
+ 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, 68, 73, 78, 71,
+ 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, 128, 68, 73, 77,
+ 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, 78, 85, 84, 73,
+ 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 49, 128,
+ 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, 73, 77, 73, 68,
+ 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, 77, 69, 78,
+ 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 76, 128, 68, 73, 71, 82,
+ 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, 200, 68, 73, 71, 82, 65, 77, 77,
+ 79, 211, 68, 73, 71, 82, 65, 77, 77, 193, 68, 73, 71, 82, 65, 205, 68,
+ 73, 71, 79, 82, 71, 79, 78, 128, 68, 73, 71, 79, 82, 71, 79, 206, 68, 73,
+ 71, 65, 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84, 79, 71, 71, 79,
+ 211, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, 73, 67, 85, 76,
+ 84, 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, 70,
+ 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, 69, 82, 69, 78,
+ 67, 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, 128, 68, 73,
+ 69, 83, 73, 211, 68, 73, 69, 80, 128, 68, 73, 197, 68, 73, 66, 128, 68,
+ 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, 78, 73, 75, 201, 68, 73,
+ 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, 68, 83, 128, 68, 73, 65,
+ 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, 73, 65, 77, 69, 84,
+ 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, 73, 65, 76, 89, 84,
+ 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 73, 65, 71, 79, 78,
+ 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, 65, 69, 82, 69, 83,
+ 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, 69,
+ 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72,
+ 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128,
+ 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68,
+ 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65,
+ 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, 84,
+ 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, 65,
+ 65, 76, 85, 128, 68, 72, 65, 65, 128, 68, 72, 65, 128, 68, 69, 90, 200,
68, 69, 89, 84, 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69,
88, 73, 65, 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77,
69, 78, 84, 128, 68, 69, 85, 78, 71, 128, 68, 69, 83, 203, 68, 69, 83,
@@ -3879,161 +4040,164 @@ static unsigned char lexicon[] = {
68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, 65, 84,
128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, 68, 68,
65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, 128, 68,
- 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217, 68, 65, 86,
- 73, 89, 65, 78, 73, 128, 68, 65, 86, 73, 68, 128, 68, 65, 84, 197, 68,
- 65, 83, 73, 65, 128, 68, 65, 83, 72, 69, 196, 68, 65, 83, 72, 128, 68,
- 65, 83, 200, 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, 84, 128, 68, 65,
- 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, 73, 78, 199, 68,
- 65, 82, 203, 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, 52, 128, 68, 65,
- 82, 65, 51, 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, 82, 65, 205, 68,
- 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45,
- 66, 85, 79, 206, 68, 65, 80, 45, 66, 69, 201, 68, 65, 208, 68, 65, 78,
- 84, 65, 74, 193, 68, 65, 78, 71, 79, 128, 68, 65, 78, 71, 128, 68, 65,
- 78, 199, 68, 65, 78, 68, 65, 128, 68, 65, 78, 67, 69, 82, 128, 68, 65,
- 77, 80, 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68,
- 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77,
- 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65,
- 76, 69, 84, 128, 68, 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65,
- 76, 65, 84, 72, 128, 68, 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128,
- 68, 65, 73, 82, 128, 68, 65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85,
- 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71,
- 83, 128, 68, 65, 71, 71, 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68,
- 65, 71, 69, 83, 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65,
- 71, 65, 218, 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69,
- 78, 71, 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65,
- 83, 85, 128, 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68,
- 48, 54, 55, 71, 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128,
- 68, 48, 54, 55, 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66,
- 128, 68, 48, 54, 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128,
- 68, 48, 54, 53, 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48,
- 54, 50, 128, 68, 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57,
- 128, 68, 48, 53, 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68,
- 48, 53, 53, 128, 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48,
- 53, 51, 128, 68, 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53,
- 49, 128, 68, 48, 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53,
- 48, 71, 128, 68, 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48,
- 53, 48, 68, 128, 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68,
- 48, 53, 48, 65, 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48,
- 52, 56, 65, 128, 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52,
- 54, 65, 128, 68, 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52,
- 128, 68, 48, 52, 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68,
- 48, 52, 48, 128, 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51,
- 55, 128, 68, 48, 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65,
- 128, 68, 48, 51, 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68,
- 48, 51, 49, 65, 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48,
- 50, 57, 128, 68, 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50,
- 55, 128, 68, 48, 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128,
- 68, 48, 50, 51, 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48,
- 50, 48, 128, 68, 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55,
- 128, 68, 48, 49, 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68,
- 48, 49, 51, 128, 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49,
- 48, 128, 68, 48, 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56,
- 128, 68, 48, 48, 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68,
- 48, 48, 52, 128, 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48,
- 49, 128, 67, 89, 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89,
- 82, 69, 78, 65, 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212,
- 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68,
- 82, 73, 67, 73, 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65,
- 128, 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73,
- 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128,
- 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 212, 67, 85, 83, 84, 79,
- 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, 65, 82, 68,
- 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82, 86,
- 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 82,
- 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, 212, 67,
- 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 128,
- 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205,
- 67, 85, 66, 69, 68, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76,
- 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 128, 67, 82, 89,
- 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67,
- 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 85, 67, 73,
- 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67,
- 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69,
- 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78,
- 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78,
- 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68,
- 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83,
- 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211,
- 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 67, 85, 211,
- 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 69, 83, 67, 69, 78, 84,
- 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82,
- 69, 65, 84, 73, 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 67, 75, 69,
- 82, 128, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, 69,
- 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, 67,
- 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82,
- 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67,
- 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128,
- 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78,
- 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128,
- 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82,
- 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89,
- 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, 82, 45,
- 50, 128, 67, 79, 80, 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, 79, 76,
- 128, 67, 79, 79, 75, 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, 128, 67,
- 79, 79, 75, 69, 196, 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, 71, 73, 78,
- 199, 67, 79, 78, 86, 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, 84, 82, 79,
- 76, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, 82, 73, 69,
- 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, 67, 79, 78,
- 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, 78, 84, 69,
- 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79,
- 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, 73, 78, 73,
- 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, 84, 128,
- 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, 84, 65,
- 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78,
- 67, 89, 128, 67, 79, 78, 83, 79, 78, 65, 78, 212, 67, 79, 78, 83, 69, 67,
- 85, 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67,
- 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199,
- 67, 79, 78, 73, 67, 65, 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79,
- 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 79,
- 85, 78, 68, 69, 196, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 70,
- 69, 84, 84, 201, 67, 79, 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67,
- 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128,
- 67, 79, 77, 80, 85, 84, 69, 82, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73,
- 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80,
- 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128,
- 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69,
- 78, 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206,
- 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 128, 67, 79,
- 77, 77, 193, 67, 79, 77, 69, 84, 128, 67, 79, 77, 66, 128, 67, 79, 76,
- 85, 77, 78, 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79,
- 206, 67, 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128,
- 67, 79, 69, 78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 67, 75, 84, 65, 73,
- 204, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 79, 128, 67,
- 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 83, 128,
- 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76,
- 85, 194, 67, 76, 79, 86, 69, 82, 128, 67, 76, 79, 85, 68, 128, 67, 76,
- 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, 79, 84, 72, 128,
- 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67,
- 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197, 67, 76, 79, 67, 75, 87, 73,
- 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86, 73, 83, 128, 67, 76, 73,
- 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75, 73, 78, 199, 67, 76, 73,
- 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70,
- 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76,
- 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69,
- 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67, 76, 65, 87, 128, 67, 76,
- 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, 67, 76, 65, 78,
- 128, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, 67, 73, 86,
- 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 197, 67, 73, 84,
- 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88,
- 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, 85, 76, 65,
- 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69,
- 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78,
- 69, 77, 65, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85,
- 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67,
- 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71,
- 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67,
- 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67,
- 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72,
- 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128, 67,
- 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67, 72,
- 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67, 72,
- 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, 72, 69,
- 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, 78, 79,
- 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, 82, 73,
- 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, 73, 83,
- 84, 77, 65, 211, 67, 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72, 79,
- 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67,
- 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65,
+ 67, 83, 128, 68, 67, 52, 128, 68, 67, 51, 128, 68, 67, 50, 128, 68, 67,
+ 49, 128, 68, 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217,
+ 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 65, 86, 73, 68, 128, 68, 65, 84,
+ 197, 68, 65, 83, 73, 65, 128, 68, 65, 83, 73, 193, 68, 65, 83, 72, 69,
+ 196, 68, 65, 83, 72, 128, 68, 65, 83, 200, 68, 65, 83, 69, 73, 65, 128,
+ 68, 65, 82, 84, 128, 68, 65, 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82,
+ 75, 69, 78, 73, 78, 199, 68, 65, 82, 203, 68, 65, 82, 71, 65, 128, 68,
+ 65, 82, 65, 52, 128, 68, 65, 82, 65, 51, 128, 68, 65, 82, 128, 68, 65,
+ 80, 45, 80, 82, 65, 205, 68, 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, 77,
+ 85, 79, 217, 68, 65, 80, 45, 66, 85, 79, 206, 68, 65, 80, 45, 66, 69,
+ 201, 68, 65, 208, 68, 65, 78, 84, 65, 74, 193, 68, 65, 78, 71, 79, 128,
+ 68, 65, 78, 71, 128, 68, 65, 78, 199, 68, 65, 78, 68, 65, 128, 68, 65,
+ 78, 67, 69, 82, 128, 68, 65, 77, 80, 128, 68, 65, 77, 208, 68, 65, 77,
+ 77, 65, 84, 65, 78, 128, 68, 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77,
+ 65, 128, 68, 65, 77, 77, 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76,
+ 69, 84, 72, 128, 68, 65, 76, 69, 84, 128, 68, 65, 76, 69, 212, 68, 65,
+ 76, 68, 65, 128, 68, 65, 76, 65, 84, 72, 128, 68, 65, 76, 65, 84, 200,
+ 68, 65, 76, 65, 84, 128, 68, 65, 73, 82, 128, 68, 65, 73, 78, 71, 128,
+ 68, 65, 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65,
+ 85, 83, 72, 128, 68, 65, 71, 83, 128, 68, 65, 71, 71, 69, 82, 128, 68,
+ 65, 71, 71, 69, 210, 68, 65, 71, 69, 83, 72, 128, 68, 65, 71, 69, 83,
+ 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, 71, 65, 218,
+ 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, 78, 71, 128,
+ 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, 128,
+ 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, 48, 54, 55, 71,
+ 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, 68, 48, 54, 55,
+ 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, 128, 68, 48, 54,
+ 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, 68, 48, 54, 53,
+ 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, 54, 50, 128, 68,
+ 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, 128, 68, 48, 53,
+ 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, 48, 53, 53, 128,
+ 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, 53, 51, 128, 68,
+ 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, 49, 128, 68, 48,
+ 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, 48, 71, 128, 68,
+ 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, 53, 48, 68, 128,
+ 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, 48, 53, 48, 65,
+ 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, 52, 56, 65, 128,
+ 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, 54, 65, 128, 68,
+ 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, 128, 68, 48, 52,
+ 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, 48, 52, 48, 128,
+ 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, 55, 128, 68, 48,
+ 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, 128, 68, 48, 51,
+ 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, 48, 51, 49, 65,
+ 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, 50, 57, 128, 68,
+ 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, 55, 128, 68, 48,
+ 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, 68, 48, 50, 51,
+ 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, 50, 48, 128, 68,
+ 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, 128, 68, 48, 49,
+ 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, 48, 49, 51, 128,
+ 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, 48, 128, 68, 48,
+ 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, 128, 68, 48, 48,
+ 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, 48, 48, 52, 128,
+ 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, 49, 128, 67, 89,
+ 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, 82, 69, 78, 65,
+ 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, 67, 89, 80, 69,
+ 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, 73, 67, 73,
+ 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65, 128, 67, 89,
+ 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73, 128, 67, 87,
+ 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128, 67, 87, 65,
+ 65, 128, 67, 85, 88, 128, 67, 85, 85, 128, 67, 85, 212, 67, 85, 83, 84,
+ 79, 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, 65, 82,
+ 68, 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82,
+ 86, 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82,
+ 83, 73, 86, 197, 67, 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, 128,
+ 67, 85, 82, 82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 128,
+ 67, 85, 82, 128, 67, 85, 80, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80,
+ 128, 67, 85, 79, 128, 67, 85, 205, 67, 85, 66, 69, 68, 128, 67, 85, 66,
+ 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76,
+ 76, 207, 67, 85, 128, 67, 83, 73, 128, 67, 82, 89, 83, 84, 65, 204, 67,
+ 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67, 82, 89, 73, 78, 199,
+ 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 85, 67, 73, 66, 76, 69, 45, 53,
+ 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, 82, 85, 67, 73, 66,
+ 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 50, 128, 67, 82,
+ 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, 128, 67, 82, 79, 83, 83,
+ 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72,
+ 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67,
+ 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 67,
+ 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, 82, 79, 80, 128, 67, 82,
+ 79, 73, 88, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76,
+ 69, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, 69, 83, 67, 69, 78,
+ 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, 84, 73, 86, 197, 67, 82,
+ 69, 65, 77, 128, 67, 82, 65, 67, 75, 69, 82, 128, 67, 82, 128, 67, 79,
+ 88, 128, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, 69, 82, 128, 67, 79,
+ 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, 67, 79, 85, 78, 84, 69,
+ 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, 66, 79, 82, 69, 128,
+ 67, 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67, 79, 82, 82, 69, 83, 80,
+ 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, 67, 79, 82, 80, 83, 69,
+ 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 82, 79, 78,
+ 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, 82,
+ 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128,
+ 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, 128, 67, 79, 80, 82,
+ 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, 82, 45, 50, 128, 67, 79, 80,
+ 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, 79, 76, 128, 67, 79, 79, 75,
+ 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, 128, 67, 79, 79, 75, 69, 196,
+ 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, 71, 73, 78, 199, 67, 79, 78, 86,
+ 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, 84, 82, 79, 76, 128, 67, 79, 78,
+ 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, 82, 73, 69, 84, 89, 128, 67, 79,
+ 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, 67, 79, 78, 84, 79, 85, 82, 69,
+ 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, 78, 84, 69, 78, 84, 73, 79, 78,
+ 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78,
+ 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 78,
+ 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, 84, 128, 67, 79, 78, 83, 84, 82,
+ 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, 84, 65, 78, 84, 128, 67, 79, 78,
+ 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 78,
+ 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79,
+ 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 74, 79, 73, 78,
+ 73, 78, 199, 67, 79, 78, 73, 67, 65, 204, 67, 79, 78, 71, 82, 85, 69, 78,
+ 212, 67, 79, 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 67, 79,
+ 78, 70, 85, 83, 69, 196, 67, 79, 78, 70, 79, 85, 78, 68, 69, 196, 67, 79,
+ 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 70, 69, 84, 84, 201, 67, 79, 78,
+ 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, 45,
+ 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, 67, 79, 77, 80, 85, 84, 69,
+ 82, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 67, 79, 77, 80,
+ 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, 76, 73, 65, 78, 67, 69, 128,
+ 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, 69, 84,
+ 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, 80,
+ 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, 67, 79, 77, 77, 69, 82, 67, 73,
+ 65, 204, 67, 79, 77, 77, 65, 78, 68, 128, 67, 79, 77, 77, 65, 128, 67,
+ 79, 77, 77, 193, 67, 79, 77, 69, 84, 128, 67, 79, 77, 66, 128, 67, 79,
+ 76, 85, 77, 78, 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73,
+ 79, 206, 67, 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78,
+ 128, 67, 79, 69, 78, 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, 65, 128,
+ 67, 79, 67, 75, 84, 65, 73, 204, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79,
+ 65, 128, 67, 79, 128, 67, 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210,
+ 67, 76, 85, 66, 83, 128, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67,
+ 76, 85, 66, 128, 67, 76, 85, 194, 67, 76, 79, 86, 69, 82, 128, 67, 76,
+ 79, 85, 68, 128, 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128,
+ 67, 76, 79, 84, 72, 128, 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69,
+ 78, 69, 83, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197,
+ 67, 76, 79, 67, 75, 87, 73, 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86,
+ 73, 83, 128, 67, 76, 73, 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75,
+ 73, 78, 199, 67, 76, 73, 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85,
+ 83, 128, 67, 76, 73, 70, 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69,
+ 70, 45, 50, 128, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67,
+ 76, 69, 198, 67, 76, 69, 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67,
+ 76, 65, 87, 128, 67, 76, 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69,
+ 210, 67, 76, 65, 78, 128, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73,
+ 88, 128, 67, 73, 86, 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65,
+ 80, 197, 67, 73, 84, 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85,
+ 77, 70, 76, 69, 88, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73,
+ 82, 67, 85, 76, 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67,
+ 73, 82, 67, 76, 69, 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82,
+ 128, 67, 73, 78, 69, 77, 65, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128,
+ 67, 73, 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67,
+ 73, 69, 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73,
+ 69, 85, 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73,
+ 69, 80, 128, 67, 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128,
+ 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67,
+ 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128,
+ 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67,
+ 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67,
+ 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, 72,
+ 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, 78,
+ 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, 82,
+ 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, 73,
+ 83, 84, 77, 65, 211, 67, 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72,
+ 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128,
+ 67, 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65,
128, 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83,
73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67,
73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128,
@@ -4051,9075 +4215,9608 @@ static unsigned char lexicon[] = {
211, 67, 72, 69, 82, 82, 217, 67, 72, 69, 82, 82, 73, 69, 83, 128, 67,
72, 69, 81, 85, 69, 82, 69, 196, 67, 72, 69, 80, 128, 67, 72, 69, 206,
67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, 73, 75, 72, 69, 73, 128, 67,
- 72, 69, 69, 82, 73, 78, 199, 67, 72, 69, 69, 128, 67, 72, 69, 67, 75,
- 128, 67, 72, 69, 67, 203, 67, 72, 197, 67, 72, 65, 88, 128, 67, 72, 65,
- 86, 73, 89, 65, 78, 73, 128, 67, 72, 65, 84, 84, 65, 87, 65, 128, 67, 72,
- 65, 84, 128, 67, 72, 65, 82, 84, 128, 67, 72, 65, 82, 212, 67, 72, 65,
- 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, 67, 72, 65, 82, 65, 67,
- 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, 67, 72, 65,
- 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78,
- 128, 67, 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128,
- 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73,
- 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65,
- 128, 67, 69, 88, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79,
- 78, 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67,
- 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78,
- 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83,
- 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73,
- 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85,
- 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77,
- 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67,
- 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 196, 67, 69,
- 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, 128, 67, 69,
- 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, 84, 73, 79, 78, 128,
- 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 69, 69,
- 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, 73, 76, 76, 193, 67,
- 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, 65, 75, 128, 67, 69,
- 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, 128, 67, 67, 79, 128,
- 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, 79, 128, 67, 67, 72,
- 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, 79, 128, 67, 67, 72,
- 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, 72, 72, 69, 128, 67,
- 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, 67, 67, 72, 69, 69,
+ 72, 69, 73, 75, 72, 65, 78, 128, 67, 72, 69, 69, 82, 73, 78, 199, 67, 72,
+ 69, 69, 128, 67, 72, 69, 67, 75, 128, 67, 72, 69, 67, 203, 67, 72, 197,
+ 67, 72, 65, 88, 128, 67, 72, 65, 86, 73, 89, 65, 78, 73, 128, 67, 72, 65,
+ 84, 84, 65, 87, 65, 128, 67, 72, 65, 84, 128, 67, 72, 65, 82, 84, 128,
+ 67, 72, 65, 82, 212, 67, 72, 65, 82, 73, 79, 84, 128, 67, 72, 65, 82, 73,
+ 79, 212, 67, 72, 65, 82, 65, 67, 84, 69, 82, 83, 128, 67, 72, 65, 82, 65,
+ 67, 84, 69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 128, 67, 72,
+ 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, 77, 75, 79, 128, 67,
+ 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 72,
+ 65, 75, 77, 193, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73, 78, 83, 128,
+ 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65, 128, 67, 71,
+ 74, 128, 67, 69, 88, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77,
+ 79, 78, 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128,
+ 67, 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65,
+ 78, 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77,
+ 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72,
+ 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69,
+ 85, 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85,
+ 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204,
+ 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 196, 67,
+ 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, 128, 67,
+ 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, 84, 73, 79, 78,
+ 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 69,
+ 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, 73, 76, 76, 193,
+ 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, 65, 75, 128, 67,
+ 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, 128, 67, 67, 79,
+ 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, 79, 128, 67, 67,
+ 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, 79, 128, 67, 67,
+ 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, 72, 72, 69, 128,
+ 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, 67, 67, 72, 69, 69,
128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128,
- 67, 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65,
- 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88,
- 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76,
- 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65,
- 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, 128, 67, 65,
- 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67,
- 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, 65,
- 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, 67,
- 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65,
- 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 68,
- 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, 128, 67, 65,
- 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, 67, 65, 80,
- 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79, 128, 67, 65, 80, 73, 84, 65,
- 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78,
- 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85,
- 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65,
- 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78,
- 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65,
- 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77,
- 69, 82, 65, 128, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67,
- 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76,
- 69, 78, 68, 65, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128,
- 67, 65, 75, 197, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69,
- 85, 83, 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66,
- 76, 69, 87, 65, 89, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69,
- 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50,
- 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128,
- 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48,
- 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52,
- 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67,
- 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48,
- 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53,
- 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128,
- 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128,
- 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67,
- 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72,
- 201, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65,
- 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69,
- 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128,
- 66, 85, 84, 84, 79, 78, 128, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85,
- 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 211, 66, 85, 82,
- 213, 66, 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79,
- 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77, 80, 217,
- 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76, 83, 69, 89,
- 69, 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76,
- 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66, 85, 75, 89,
- 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78,
- 71, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85,
- 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 67, 75, 76, 69, 128,
- 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, 66,
- 83, 68, 85, 211, 66, 82, 85, 83, 72, 128, 66, 82, 85, 83, 200, 66, 82,
- 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, 66, 82, 79, 65, 196, 66,
- 82, 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66,
- 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, 197, 66, 82, 73,
- 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 69, 86, 73, 83, 128, 66, 82,
- 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82,
- 69, 65, 84, 200, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66,
- 82, 69, 65, 68, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78,
- 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, 78, 67, 200, 66, 82, 65,
- 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67,
- 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 79, 89, 128, 66,
- 79, 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78,
- 71, 128, 66, 79, 87, 76, 128, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66,
- 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84,
- 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128,
- 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, 84, 84, 76,
- 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, 82, 65, 88,
- 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, 88, 128,
- 66, 79, 79, 84, 83, 128, 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65,
- 78, 71, 128, 66, 79, 79, 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75,
- 128, 66, 79, 79, 75, 77, 65, 82, 203, 66, 79, 78, 69, 128, 66, 79, 77,
- 66, 128, 66, 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, 66,
- 79, 65, 82, 128, 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 85, 197,
- 66, 76, 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 83, 83, 79, 77, 128, 66,
- 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 128, 66,
- 76, 69, 78, 68, 69, 196, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203,
- 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67,
- 75, 45, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84,
- 72, 69, 82, 69, 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73,
- 84, 84, 69, 82, 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 85, 84,
- 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, 80, 128,
- 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, 66, 73, 82,
- 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, 128, 66,
- 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67,
- 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128,
- 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73,
- 76, 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128,
- 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66,
- 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, 69, 83, 128,
- 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, 128, 66, 73, 66,
- 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, 72, 85, 128,
- 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, 72, 69, 84,
- 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, 84, 84, 73,
- 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 128, 66, 69, 89,
- 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128,
- 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84,
- 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83,
- 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210,
- 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66,
- 69, 78, 84, 207, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, 66, 69,
- 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69,
- 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, 69,
- 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, 66,
- 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, 78,
- 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73,
- 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69,
- 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69,
- 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69,
- 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66,
- 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, 65,
- 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, 66,
- 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, 84,
- 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, 128,
- 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 128,
- 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, 79,
- 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, 66,
- 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, 128,
- 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, 69,
- 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, 66,
- 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 66, 65,
- 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 84,
- 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77,
- 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, 66, 65, 84, 200, 66, 65, 84,
- 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, 83, 75, 69, 84, 66, 65, 76,
- 204, 66, 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69,
- 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82,
- 83, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, 72,
- 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, 69, 197, 66, 65, 82,
- 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79,
- 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, 65, 82, 65, 50, 128,
- 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 75, 78, 79, 84,
- 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65,
- 78, 65, 78, 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77,
- 66, 79, 79, 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65,
- 128, 66, 65, 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79,
- 75, 69, 196, 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 65, 71, 128,
- 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, 65,
- 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, 77,
- 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 71, 71, 65, 71,
- 197, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68,
- 71, 69, 82, 128, 66, 65, 68, 71, 69, 128, 66, 65, 68, 128, 66, 65, 67,
- 84, 82, 73, 65, 206, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67,
- 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65,
- 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66,
- 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, 66, 217,
- 66, 65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57,
- 128, 66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66,
- 50, 53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50,
- 128, 66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66,
- 50, 52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53,
- 128, 66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176,
- 66, 50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51,
- 50, 128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50,
- 50, 56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181,
- 66, 50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49,
- 57, 128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128,
- 66, 50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50,
- 49, 50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57,
- 128, 66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66,
- 50, 48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48,
- 50, 128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66,
- 49, 57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56,
- 52, 128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128,
- 66, 49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49,
- 55, 55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66,
- 49, 55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54,
- 57, 128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128,
- 66, 49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54,
- 178, 66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49,
- 53, 56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128,
- 66, 49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49,
- 53, 177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66,
- 49, 52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66,
- 49, 51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66,
- 49, 50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49,
- 50, 178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49,
- 48, 57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55,
- 205, 66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66,
- 49, 48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180,
- 66, 49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66,
- 48, 56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181,
- 66, 48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56,
- 176, 66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55,
- 182, 66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178,
- 66, 48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66,
- 48, 54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66,
- 48, 54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66,
- 48, 53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66,
- 48, 53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48,
- 53, 177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48,
- 52, 55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48,
- 52, 179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51,
- 185, 66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52,
- 128, 66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176,
- 66, 48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66,
- 48, 50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66,
- 48, 50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128,
- 66, 48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66,
- 48, 49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48,
- 48, 57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66,
- 48, 48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182,
- 66, 48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48,
- 48, 52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66,
- 48, 48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177,
- 65, 90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128,
- 65, 88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86,
- 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65,
- 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65,
- 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69,
- 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, 82, 65, 204,
- 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, 65, 77, 65,
- 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 45,
- 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78,
- 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73,
- 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, 128, 65,
- 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, 84, 69, 78,
- 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 79, 205, 65, 84, 78,
- 65, 200, 65, 84, 77, 65, 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84,
- 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195,
- 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 90, 128, 65, 83, 89, 85,
- 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83,
- 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, 79, 71,
- 73, 67, 65, 204, 65, 83, 84, 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69,
- 82, 73, 83, 77, 128, 65, 83, 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69,
- 82, 73, 83, 75, 128, 65, 83, 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82,
- 73, 83, 67, 85, 83, 128, 65, 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69,
- 82, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, 65, 83, 80,
- 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, 73, 65, 128,
- 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, 83, 72, 57,
- 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, 78,
- 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, 82, 85, 72, 85, 65, 128,
- 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, 84, 69, 196, 65,
- 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79,
- 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, 128, 65,
- 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 82, 82,
- 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 65,
- 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71,
- 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82,
- 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82,
- 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65,
- 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82,
- 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69,
- 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128,
- 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72,
- 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, 128, 65,
- 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 67, 72, 65, 73,
- 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73,
- 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65,
- 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128,
- 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65,
- 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65,
- 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73,
- 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 65, 72, 77, 65, 206,
- 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, 83,
- 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, 65,
- 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65,
- 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, 80,
- 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65,
- 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 79, 84, 72, 69, 83,
- 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80,
- 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83,
- 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80,
- 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76,
- 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 73, 78, 128, 65, 80, 69, 83,
- 207, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, 85,
- 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65,
- 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78,
- 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84,
- 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84,
- 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73,
- 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65,
- 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65,
- 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75,
- 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76,
- 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84,
- 69, 78, 78, 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65,
- 78, 83, 85, 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65,
- 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79,
- 206, 65, 78, 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 72, 85,
- 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 83, 84, 82, 79, 205,
- 65, 78, 71, 82, 217, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78,
- 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, 65, 78,
- 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, 82,
- 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, 80,
- 128, 65, 77, 80, 83, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65,
- 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, 65, 77, 69, 82,
- 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, 65, 77, 66,
- 193, 65, 77, 65, 82, 128, 65, 77, 65, 210, 65, 77, 65, 76, 71, 65, 77,
- 65, 84, 73, 79, 206, 65, 77, 65, 76, 71, 65, 77, 128, 65, 76, 86, 69, 79,
- 76, 65, 210, 65, 76, 85, 77, 128, 65, 76, 84, 69, 82, 78, 65, 84, 73, 86,
- 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 76, 84, 69, 82, 78,
- 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, 128, 65, 76, 80,
- 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, 76, 80, 65, 80, 82,
- 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, 83, 212, 65, 76,
- 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, 76, 76, 201, 65,
- 76, 76, 65, 200, 65, 76, 75, 65, 76, 73, 45, 50, 128, 65, 76, 75, 65, 76,
- 73, 128, 65, 76, 73, 71, 78, 69, 196, 65, 76, 73, 70, 85, 128, 65, 76,
- 73, 69, 78, 128, 65, 76, 73, 69, 206, 65, 76, 71, 73, 218, 65, 76, 70,
- 65, 128, 65, 76, 69, 85, 212, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77,
- 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65,
- 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, 76, 65, 80, 72, 128, 65,
- 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, 76, 83,
- 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195,
- 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, 65,
- 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, 79,
- 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, 73,
- 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, 128,
- 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 71, 71, 65,
- 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201,
- 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86,
- 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, 70,
- 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, 77,
- 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, 70,
- 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69, 89, 65, 78, 78, 65, 128, 65,
- 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83,
- 67, 128, 65, 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65,
- 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75,
- 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78,
- 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65,
- 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71,
- 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, 128, 65, 68,
- 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 82, 69, 83,
- 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 69, 45,
- 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69,
- 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, 85, 65, 76,
- 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, 72, 79, 78,
- 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, 67, 67, 85,
- 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, 212, 65, 67,
- 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, 65,
- 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, 212, 65,
- 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, 85, 78, 68,
- 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, 66, 66, 82,
- 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, 128, 65, 66,
- 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, 128,
- 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, 73,
- 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, 51,
- 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, 48,
- 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, 65,
- 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, 65,
- 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, 128,
- 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, 54,
- 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, 49,
- 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, 48,
- 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, 65,
- 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55,
- 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, 65, 48, 48,
- 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, 65, 65, 48,
- 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56,
- 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65,
- 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54,
- 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128,
- 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48,
- 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49,
- 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65,
- 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52, 53, 65, 128, 65, 48,
- 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51, 65, 128, 65, 48, 52,
- 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50, 128, 65, 48, 52, 49,
- 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 128,
- 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, 128, 65, 48,
- 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, 48, 51, 50,
- 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 48,
- 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, 128, 65, 45,
- 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, 72, 89, 85,
- 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, 67, 72, 65,
- 210, 45, 67, 72, 65, 76, 128,
+ 67, 67, 72, 128, 67, 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65,
+ 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65,
+ 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206,
+ 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 85,
+ 128, 67, 65, 84, 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65,
+ 83, 84, 76, 69, 128, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84,
+ 128, 67, 65, 82, 211, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80,
+ 69, 78, 84, 82, 217, 67, 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204,
+ 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67,
+ 65, 82, 73, 65, 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67,
+ 65, 82, 197, 67, 65, 82, 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82,
+ 196, 67, 65, 82, 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84,
+ 73, 86, 69, 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79,
+ 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84,
+ 73, 79, 206, 67, 65, 78, 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68,
+ 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68,
+ 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, 78,
+ 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65,
+ 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65,
+ 77, 78, 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, 77, 69, 76, 128,
+ 67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, 76, 88, 128, 67,
+ 65, 76, 76, 128, 67, 65, 76, 69, 78, 68, 65, 82, 128, 67, 65, 76, 67,
+ 128, 67, 65, 75, 82, 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65,
+ 72, 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83,
+ 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, 76, 69,
+ 87, 65, 89, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, 128, 67,
+ 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128,
+ 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48,
+ 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55,
+ 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67,
+ 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49,
+ 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56,
+ 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67,
+ 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48,
+ 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48,
+ 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51,
+ 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66,
+ 89, 84, 197, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75,
+ 82, 65, 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87,
+ 69, 69, 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83,
+ 72, 128, 66, 85, 84, 84, 79, 78, 128, 66, 85, 212, 66, 85, 83, 84, 211,
+ 66, 85, 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 211, 66,
+ 85, 82, 213, 66, 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66,
+ 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77,
+ 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76,
+ 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 69, 84, 128,
+ 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66,
+ 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76,
+ 68, 73, 78, 71, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83,
+ 197, 66, 85, 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 67, 75,
+ 76, 69, 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75,
+ 65, 173, 66, 83, 68, 85, 211, 66, 82, 85, 83, 72, 128, 66, 82, 85, 83,
+ 200, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, 66, 82, 79,
+ 65, 196, 66, 82, 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69,
+ 83, 211, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71,
+ 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 69, 86, 73,
+ 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 66, 82, 69,
+ 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85,
+ 71, 72, 128, 66, 82, 69, 65, 68, 128, 66, 82, 68, 193, 66, 82, 65, 78,
+ 67, 72, 73, 78, 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, 78, 67,
+ 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, 69,
+ 196, 66, 82, 65, 67, 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128,
+ 66, 80, 72, 128, 66, 79, 89, 128, 66, 79, 87, 84, 73, 69, 128, 66, 79,
+ 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, 79, 87, 76, 128,
+ 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, 79, 85, 81, 85, 69, 84, 128,
+ 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 76, 73, 71,
+ 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, 66, 79, 84, 84, 79, 205,
+ 66, 79, 84, 84, 76, 69, 128, 66, 79, 84, 84, 76, 197, 66, 79, 84, 200,
+ 66, 79, 82, 85, 84, 79, 128, 66, 79, 82, 65, 88, 45, 51, 128, 66, 79, 82,
+ 65, 88, 45, 50, 128, 66, 79, 82, 65, 88, 128, 66, 79, 80, 79, 77, 79, 70,
+ 207, 66, 79, 79, 84, 83, 128, 66, 79, 79, 84, 128, 66, 79, 79, 77, 69,
+ 82, 65, 78, 71, 128, 66, 79, 79, 75, 83, 128, 66, 79, 79, 75, 77, 65, 82,
+ 75, 128, 66, 79, 79, 75, 77, 65, 82, 203, 66, 79, 78, 69, 128, 66, 79,
+ 77, 66, 128, 66, 79, 77, 128, 66, 79, 76, 84, 128, 66, 79, 76, 212, 66,
+ 79, 72, 65, 73, 82, 73, 195, 66, 79, 68, 89, 128, 66, 79, 65, 82, 128,
+ 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87,
+ 70, 73, 83, 72, 128, 66, 76, 79, 83, 83, 79, 77, 128, 66, 76, 79, 79, 68,
+ 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 128, 66, 76, 69, 78, 68,
+ 69, 196, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68,
+ 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69,
+ 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69,
+ 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82,
+ 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 85, 84, 200, 66, 73, 83,
+ 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, 80, 128, 66, 73, 83, 69, 67,
+ 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, 66, 73, 82, 85, 128, 66, 73,
+ 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, 128, 66, 73, 82, 68, 128,
+ 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, 85, 76, 65, 210,
+ 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, 73, 78, 65, 82,
+ 217, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, 76, 65, 66, 73, 65,
+ 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, 73, 199, 66, 73,
+ 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 68, 65, 75, 85, 79,
+ 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, 69,
+ 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, 128,
+ 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66,
+ 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66,
+ 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65,
+ 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 65,
+ 128, 66, 72, 65, 128, 66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66,
+ 69, 86, 69, 82, 65, 71, 69, 128, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69,
+ 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69,
+ 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78,
+ 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195,
+ 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, 69, 78, 68, 69,
+ 128, 66, 69, 78, 68, 128, 66, 69, 206, 66, 69, 76, 84, 128, 66, 69, 76,
+ 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69,
+ 76, 71, 84, 72, 79, 210, 66, 69, 76, 128, 66, 69, 73, 84, 72, 128, 66,
+ 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, 66, 69, 72, 69, 200, 66,
+ 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, 78, 73, 78, 71, 128, 66,
+ 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, 206, 66, 69, 70, 79, 82,
+ 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, 84, 65, 128, 66, 69, 69,
+ 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, 69, 72, 128, 66, 69, 69,
+ 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 65, 86, 69, 210, 66, 69,
+ 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, 69, 65, 210, 66, 69, 65,
+ 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, 65, 68, 128, 66, 67, 65, 196,
+ 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, 66, 66, 89, 80, 128, 66, 66,
+ 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, 84, 128, 66, 66, 85, 82, 88,
+ 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, 128, 66, 66, 85, 79, 88, 128,
+ 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 128, 66, 66, 85, 128, 66, 66,
+ 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, 79, 80, 128, 66, 66, 79, 128,
+ 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66,
+ 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66,
+ 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 69,
+ 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, 66, 66, 65, 84, 128, 66, 66,
+ 65, 80, 128, 66, 66, 65, 65, 128, 66, 66, 65, 128, 66, 65, 89, 65, 78,
+ 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65,
+ 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66,
+ 65, 84, 72, 128, 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83,
+ 65, 128, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, 73,
+ 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 66, 65, 76, 76, 128, 66, 65,
+ 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 82, 73,
+ 69, 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69,
+ 128, 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65,
+ 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65,
+ 82, 66, 69, 210, 66, 65, 82, 194, 66, 65, 82, 65, 50, 128, 66, 65, 210,
+ 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 75, 78, 79, 84, 197, 66, 65, 78,
+ 75, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, 65,
+ 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83,
+ 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65,
+ 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196,
+ 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 65, 71, 128, 66, 65, 76,
+ 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, 65, 73, 77, 65,
+ 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, 77, 85, 75, 72,
+ 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 72, 128, 66, 65, 71, 71,
+ 65, 71, 197, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66,
+ 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, 69, 128, 66, 65, 68, 128, 66,
+ 65, 67, 84, 82, 73, 65, 206, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65,
+ 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128,
+ 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 72, 65, 78, 196, 66,
+ 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, 65, 67, 75, 128, 66, 65, 67,
+ 203, 66, 65, 66, 89, 128, 66, 65, 66, 217, 66, 65, 65, 82, 69, 82, 85,
+ 128, 66, 65, 45, 50, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57, 128, 66,
+ 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66, 50, 53,
+ 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50, 128, 66,
+ 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66, 50, 52,
+ 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53, 128, 66,
+ 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50,
+ 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51, 50, 128,
+ 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50, 50, 56,
+ 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181, 66, 50,
+ 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49, 57, 128,
+ 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128, 66, 50,
+ 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50, 49, 50,
+ 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57, 128, 66,
+ 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66, 50, 48,
+ 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48, 50, 128,
+ 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66, 49, 57,
+ 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56, 52, 128,
+ 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128, 66, 49,
+ 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49, 55, 55,
+ 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66, 49, 55,
+ 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54, 57, 128,
+ 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49,
+ 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66,
+ 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56,
+ 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49,
+ 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177,
+ 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52,
+ 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51,
+ 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50,
+ 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178,
+ 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57,
+ 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66,
+ 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48,
+ 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49,
+ 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56,
+ 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48,
+ 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66,
+ 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66,
+ 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48,
+ 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54,
+ 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54,
+ 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53,
+ 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53,
+ 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177,
+ 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55,
+ 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179,
+ 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66,
+ 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66,
+ 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48,
+ 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50,
+ 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50,
+ 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48,
+ 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49,
+ 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57,
+ 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48,
+ 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48,
+ 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52,
+ 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48,
+ 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90,
+ 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128, 65, 88,
+ 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86, 69, 82,
+ 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, 128, 65,
+ 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, 128, 65, 85,
+ 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69, 128, 65, 85,
+ 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, 82, 65, 204, 65, 85, 82, 73,
+ 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65,
+ 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 45, 50, 128, 65, 85,
+ 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, 128, 65, 85, 71, 85,
+ 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, 79, 206, 65, 85, 69,
+ 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, 128, 65, 84, 84, 73, 195, 65,
+ 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, 84, 69, 78, 84, 73, 79, 78, 128,
+ 65, 84, 84, 65, 203, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77,
+ 65, 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 72, 76, 69, 84, 73,
+ 195, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80,
+ 65, 83, 67, 65, 206, 65, 83, 90, 128, 65, 83, 89, 85, 82, 193, 65, 83,
+ 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, 84, 82, 79, 78,
+ 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, 79, 71, 73, 67, 65, 204,
+ 65, 83, 84, 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77,
+ 128, 65, 83, 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75,
+ 128, 65, 83, 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85,
+ 83, 128, 65, 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79,
+ 78, 128, 65, 83, 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82,
+ 65, 84, 69, 196, 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83,
+ 84, 82, 65, 76, 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69,
+ 83, 128, 65, 83, 72, 57, 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84,
+ 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65,
+ 82, 85, 72, 85, 65, 128, 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85,
+ 76, 65, 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83,
+ 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82,
+ 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69,
+ 65, 68, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45,
+ 84, 65, 73, 76, 128, 65, 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89,
+ 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78,
+ 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70,
+ 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82,
+ 77, 79, 85, 82, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75,
+ 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85,
+ 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82,
+ 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65,
+ 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, 128,
+ 65, 82, 69, 80, 65, 128, 65, 82, 69, 65, 128, 65, 82, 68, 72, 65, 86, 73,
+ 83, 65, 82, 71, 65, 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67,
+ 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65,
+ 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69,
+ 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73,
+ 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, 82, 65, 69, 65, 45, 69,
+ 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65, 68, 128, 65, 82, 65,
+ 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 65, 66, 73,
+ 65, 206, 65, 82, 45, 82, 65, 72, 77, 65, 206, 65, 82, 45, 82, 65, 72, 69,
+ 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, 83, 128, 65, 81, 85, 65, 70, 79,
+ 82, 84, 73, 83, 128, 65, 81, 85, 193, 65, 80, 85, 206, 65, 80, 82, 73,
+ 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, 65, 80, 80,
+ 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69,
+ 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, 80, 80, 76, 73, 67, 65, 84,
+ 73, 79, 78, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 206, 65, 80, 79,
+ 84, 72, 69, 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83,
+ 84, 82, 79, 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128,
+ 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70,
+ 79, 201, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77,
+ 193, 65, 80, 76, 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 204, 65, 80,
+ 73, 78, 128, 65, 80, 69, 83, 207, 65, 80, 67, 128, 65, 80, 65, 82, 84,
+ 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, 65,
+ 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82,
+ 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, 85, 68, 65, 84, 84,
+ 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65,
+ 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, 73, 77, 79, 78, 89,
+ 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, 77, 79, 78, 73, 65,
+ 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, 84, 73,
+ 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, 78, 84, 73, 70, 79,
+ 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 69, 45,
+ 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73,
+ 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84, 69, 78, 78, 193,
+ 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218,
+ 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78,
+ 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78,
+ 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, 72,
+ 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, 72, 69,
+ 196, 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 82, 217, 65, 78, 71,
+ 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, 71, 69, 210, 65, 78, 71, 69, 76,
+ 128, 65, 78, 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79,
+ 82, 65, 128, 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72,
+ 73, 83, 77, 65, 128, 65, 78, 65, 80, 128, 65, 77, 80, 83, 128, 65, 77,
+ 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 79, 85, 78, 212, 65, 77, 69, 82,
+ 73, 67, 65, 83, 128, 65, 77, 69, 82, 73, 67, 65, 206, 65, 77, 66, 85, 76,
+ 65, 78, 67, 69, 128, 65, 77, 66, 193, 65, 77, 65, 82, 128, 65, 77, 65,
+ 210, 65, 77, 65, 76, 71, 65, 77, 65, 84, 73, 79, 206, 65, 77, 65, 76, 71,
+ 65, 77, 128, 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 85, 77, 128, 65,
+ 76, 84, 69, 82, 78, 65, 84, 73, 86, 197, 65, 76, 84, 69, 82, 78, 65, 84,
+ 73, 79, 206, 65, 76, 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128,
+ 65, 76, 80, 72, 65, 128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65,
+ 78, 65, 128, 65, 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65,
+ 128, 65, 76, 77, 79, 83, 212, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65,
+ 78, 67, 69, 128, 65, 76, 76, 201, 65, 76, 76, 65, 200, 65, 76, 75, 65,
+ 76, 73, 45, 50, 128, 65, 76, 75, 65, 76, 73, 128, 65, 76, 73, 71, 78, 69,
+ 196, 65, 76, 73, 70, 85, 128, 65, 76, 73, 69, 78, 128, 65, 76, 73, 69,
+ 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, 85, 212, 65,
+ 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67,
+ 128, 65, 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89,
+ 72, 197, 65, 76, 65, 82, 205, 65, 76, 65, 80, 72, 128, 65, 76, 45, 76,
+ 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, 76, 83, 75, 65, 66,
+ 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66,
+ 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65,
+ 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, 79, 206, 65,
+ 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 213, 65, 73, 78, 78, 128,
+ 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83,
+ 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 78, 199,
+ 65, 72, 65, 71, 71, 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71,
+ 128, 65, 71, 79, 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78,
+ 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 128,
+ 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65,
+ 206, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70,
+ 71, 72, 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69,
+ 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80,
+ 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, 65, 69, 82, 73,
+ 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128,
+ 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, 65, 69, 71,
+ 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, 65, 69, 68,
+ 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, 128, 65,
+ 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65,
+ 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196,
+ 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203,
+ 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69,
+ 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197,
+ 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67,
+ 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71,
+ 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67,
+ 79, 85, 78, 212, 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45,
+ 83, 84, 65, 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67,
+ 67, 69, 78, 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65,
+ 204, 65, 66, 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73,
+ 65, 206, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70,
+ 73, 76, 73, 128, 65, 66, 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65,
+ 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66,
+ 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49,
+ 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50,
+ 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48,
+ 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65,
+ 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65,
+ 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128,
+ 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52,
+ 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49,
+ 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48,
+ 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128,
+ 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53,
+ 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48,
+ 50, 128, 65, 65, 48, 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57,
+ 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65,
+ 48, 54, 53, 128, 65, 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54,
+ 50, 128, 65, 48, 54, 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128,
+ 65, 48, 53, 56, 128, 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48,
+ 53, 53, 128, 65, 48, 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50,
+ 128, 65, 48, 53, 49, 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65,
+ 48, 52, 56, 128, 65, 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52,
+ 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51,
+ 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50,
+ 128, 65, 48, 52, 49, 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128,
+ 65, 48, 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48,
+ 51, 54, 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51,
+ 128, 65, 48, 51, 50, 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52,
+ 65, 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48,
+ 53, 65, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128,
+ 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85,
+ 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128,
};
static unsigned int lexicon_offset[] = {
- 0, 0, 6, 10, 15, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108,
- 113, 121, 130, 135, 140, 144, 150, 153, 158, 166, 173, 181, 186, 191,
- 194, 200, 208, 215, 225, 232, 241, 244, 247, 252, 258, 262, 271, 278,
- 285, 290, 299, 307, 313, 319, 325, 141, 330, 331, 337, 345, 351, 357,
- 365, 372, 374, 377, 381, 388, 390, 397, 402, 408, 410, 417, 425, 427,
- 311, 430, 432, 437, 442, 447, 453, 460, 469, 479, 484, 489, 493, 506,
- 513, 517, 526, 533, 540, 543, 549, 553, 563, 571, 579, 588, 596, 604,
- 609, 617, 624, 634, 645, 649, 654, 657, 661, 665, 666, 672, 678, 680,
- 683, 687, 344, 690, 694, 703, 706, 709, 714, 718, 726, 729, 735, 742,
- 749, 758, 765, 774, 779, 783, 792, 802, 811, 817, 823, 830, 838, 846,
- 855, 863, 867, 875, 880, 781, 511, 889, 893, 897, 904, 908, 915, 689,
- 918, 926, 929, 933, 940, 944, 949, 957, 960, 192, 966, 971, 981, 990,
- 997, 1004, 1012, 1020, 1026, 1030, 1035, 1040, 1046, 1051, 1054, 111,
- 1060, 1064, 1070, 1073, 1086, 1089, 1093, 22, 1097, 1102, 1105, 1108,
- 1114, 1124, 1126, 1132, 1142, 1147, 1156, 1164, 328, 1167, 1170, 1174,
- 1179, 1185, 1190, 1197, 1199, 1204, 1209, 1215, 1220, 1225, 1229, 1234,
- 1240, 1245, 1250, 1254, 1259, 1264, 1268, 1273, 1278, 1283, 1289, 1295,
- 1301, 1306, 1310, 1315, 1320, 1325, 1329, 1334, 1339, 1344, 1349, 1200,
- 1205, 1210, 1216, 1221, 1353, 1226, 1359, 1368, 1230, 1372, 1235, 1241,
- 1246, 1376, 1381, 1386, 1390, 1394, 1400, 1404, 1251, 1407, 1411, 1255,
- 1417, 1260, 1421, 1425, 1265, 1429, 1434, 1438, 1441, 1445, 1269, 1274,
- 1450, 1279, 1456, 1462, 1468, 1474, 1284, 1296, 1302, 1478, 1482, 1486,
- 1489, 1307, 1493, 1495, 1500, 1505, 1511, 1516, 1521, 1525, 1530, 1535,
- 1540, 1545, 1551, 1556, 1561, 1567, 1573, 1578, 1582, 1587, 1592, 1597,
- 1602, 1606, 1614, 1618, 1623, 1628, 1633, 1638, 1642, 1645, 1650, 1655,
- 1660, 1665, 1671, 1676, 1680, 1311, 1683, 1688, 1693, 1316, 1697, 1701,
- 1708, 1321, 1715, 1326, 1719, 1721, 1726, 1732, 1330, 1737, 1746, 1335,
- 1751, 1757, 1340, 1762, 1767, 1770, 1775, 1779, 1783, 1787, 1790, 1794,
- 1345, 1350, 1100, 1799, 1805, 1811, 1817, 1823, 1829, 1835, 1841, 1847,
- 1852, 1858, 1864, 1870, 1876, 1882, 1888, 1894, 1900, 1906, 1911, 1916,
- 1921, 1926, 1931, 1936, 1941, 1946, 1951, 1956, 1962, 1967, 1973, 1978,
- 1984, 1990, 1995, 2001, 2007, 2013, 2019, 2024, 2029, 2031, 2032, 2036,
- 2040, 2045, 2049, 2053, 2057, 2061, 2064, 2069, 2073, 2078, 2082, 2086,
- 2091, 2095, 2098, 2102, 2108, 2122, 2126, 2130, 2133, 2138, 2142, 2146,
- 2149, 2153, 2158, 2163, 2168, 2173, 2177, 2181, 2185, 2190, 2194, 2199,
- 2203, 2208, 2214, 2221, 2227, 2232, 2237, 2242, 2248, 2253, 2259, 2264,
- 2267, 1217, 2269, 2276, 2284, 2294, 2303, 2317, 2321, 2325, 2338, 2346,
- 2350, 2355, 2359, 2362, 2366, 2370, 2375, 2380, 2385, 2389, 2392, 2396,
- 2403, 2410, 2416, 2421, 2426, 2432, 2438, 2443, 2446, 1723, 2448, 2454,
- 2458, 2463, 2467, 2471, 1728, 1734, 2476, 2480, 2483, 2488, 2493, 2498,
- 2503, 2507, 2514, 2519, 2522, 2529, 2535, 2539, 2543, 2547, 2552, 2559,
- 2564, 2569, 2576, 2582, 2588, 2594, 2608, 2625, 2640, 2655, 2664, 2669,
- 2673, 2678, 2683, 2687, 2699, 2706, 2712, 2217, 2718, 2725, 2731, 2735,
- 2738, 2745, 2751, 2755, 2759, 2763, 2054, 2767, 2772, 2777, 2781, 2789,
- 2793, 2797, 2801, 2806, 2811, 2816, 2820, 2825, 2830, 2834, 2839, 2843,
- 2846, 2850, 2854, 2859, 2863, 2867, 2873, 2882, 2886, 2890, 2896, 2901,
- 2908, 2912, 2922, 2926, 2931, 2935, 2940, 2946, 2951, 2955, 2959, 2963,
- 2406, 2971, 2976, 2982, 2987, 2991, 2996, 3001, 3005, 3011, 3016, 3022,
- 3026, 3032, 3037, 3042, 3047, 3052, 3057, 3062, 3067, 3072, 3077, 3083,
- 3088, 1227, 80, 3094, 3098, 3102, 3106, 3111, 3115, 3119, 3123, 3127,
- 3132, 3136, 3141, 3145, 3148, 3152, 3157, 3161, 3166, 3170, 3174, 3178,
- 3183, 3187, 3190, 3203, 3207, 3211, 3215, 3219, 3223, 3226, 3230, 3234,
- 3239, 3243, 3248, 3253, 3258, 3262, 3265, 3268, 3274, 3278, 3282, 3285,
- 3289, 3293, 3296, 3302, 3307, 3312, 3318, 3323, 3328, 3334, 3340, 3345,
- 3350, 3355, 1091, 542, 3360, 3363, 3368, 3372, 3375, 3379, 3384, 3389,
- 3393, 3398, 3402, 3407, 3411, 3415, 3421, 3427, 3430, 3433, 3439, 3446,
- 3453, 3459, 3466, 3471, 3475, 3482, 3487, 3491, 3501, 3505, 3509, 3514,
- 3519, 3529, 2065, 3534, 3538, 3541, 3547, 3552, 3558, 3564, 3569, 3576,
- 3580, 3584, 658, 688, 3588, 3595, 3602, 3609, 3615, 3621, 3626, 3630,
- 3636, 3641, 3645, 2074, 3649, 3657, 583, 3663, 3674, 3678, 3688, 2079,
- 3694, 3699, 3714, 3720, 3727, 3737, 3743, 3748, 3754, 3760, 3763, 3767,
- 3772, 3779, 3784, 3788, 3792, 3796, 3800, 3805, 3811, 3153, 3816, 3828,
- 3836, 3841, 1527, 3848, 3851, 3854, 3858, 3861, 3867, 3871, 3885, 3889,
- 3892, 3896, 3902, 3908, 3913, 3917, 3921, 3927, 3938, 3944, 3949, 3955,
- 3959, 3967, 3977, 3983, 3988, 3997, 4005, 4012, 4016, 4022, 4031, 4040,
- 4044, 4049, 4054, 4058, 4066, 4070, 4075, 4079, 2087, 1369, 4085, 4090,
- 4096, 4101, 4106, 4111, 4116, 4121, 4126, 4132, 4137, 4143, 4148, 4153,
- 4158, 4164, 4169, 4174, 4179, 4184, 4190, 4195, 4201, 4206, 4211, 4216,
- 4221, 4226, 4231, 4237, 4242, 4247, 335, 436, 4252, 4258, 4262, 4266,
- 4271, 4275, 4279, 4282, 4286, 4290, 4294, 4299, 4303, 4307, 4313, 4082,
- 4318, 4321, 4328, 4332, 4345, 4349, 4353, 4357, 4361, 4365, 4369, 4375,
- 4382, 4390, 4394, 4402, 4411, 4417, 4429, 4434, 4437, 4441, 4451, 4459,
- 4467, 4473, 4477, 4487, 4497, 4505, 4512, 4519, 4525, 4531, 4538, 4542,
- 4549, 4559, 4569, 4577, 4584, 4589, 4593, 4601, 4606, 4613, 4621, 4626,
- 4631, 4635, 4649, 4654, 4659, 4666, 4675, 4678, 4682, 4686, 4689, 4694,
- 4699, 4708, 4714, 4720, 4726, 4730, 4741, 4751, 4766, 4781, 4796, 4811,
- 4826, 4841, 4856, 4871, 4886, 4901, 4916, 4931, 4946, 4961, 4976, 4991,
- 5006, 5021, 5036, 5051, 5066, 5081, 5096, 5111, 5126, 5141, 5156, 5171,
- 5186, 5201, 5216, 5231, 5246, 5261, 5276, 5291, 5306, 5321, 5336, 5351,
- 5366, 5381, 5396, 5411, 5426, 5441, 5456, 5471, 5486, 5495, 5504, 5509,
- 5515, 5525, 5529, 5534, 5539, 5547, 5551, 5554, 5558, 2917, 5561, 5566,
- 310, 445, 5572, 5580, 5584, 5588, 5591, 5597, 5601, 5609, 5615, 5620,
- 5627, 5634, 5640, 5645, 5652, 5658, 5666, 5670, 5675, 5687, 5698, 5705,
- 5711, 3175, 5715, 5721, 5726, 5731, 5736, 5742, 5747, 5752, 5757, 5762,
- 5768, 5773, 5778, 5784, 5789, 5795, 5800, 5806, 5811, 5817, 5822, 5827,
- 5832, 5837, 5842, 5848, 5853, 5858, 5863, 5869, 5875, 5881, 5887, 5893,
- 5899, 5905, 5911, 5917, 5923, 5929, 5935, 5940, 5945, 5950, 5955, 5960,
- 5965, 5970, 5975, 5981, 5987, 5992, 5998, 6004, 6010, 6015, 6020, 6025,
- 6030, 6036, 6042, 6047, 6052, 6057, 6062, 6067, 6073, 6078, 6084, 6090,
- 6096, 6102, 6108, 6114, 6120, 6126, 6132, 2096, 5590, 6137, 6141, 6145,
- 6148, 6155, 6158, 6166, 6171, 6176, 6167, 6181, 6168, 6185, 6191, 6197,
- 6202, 6207, 6214, 6222, 6227, 6231, 6234, 6238, 2127, 551, 6242, 6246,
- 6251, 6257, 6262, 6266, 6269, 6273, 6279, 6284, 6288, 6295, 6299, 6303,
- 6307, 946, 747, 6310, 6318, 6325, 6332, 6338, 6345, 6353, 6360, 6367,
- 6372, 6384, 1247, 1377, 1382, 6395, 1387, 6399, 6403, 6412, 6420, 6429,
- 6435, 6440, 6444, 6450, 6455, 6462, 6466, 6475, 6484, 6493, 6502, 6507,
- 6512, 6524, 6529, 6537, 2178, 6541, 6543, 6548, 6552, 6561, 6569, 1391,
- 133, 3403, 3408, 6575, 6579, 6588, 6594, 6599, 6602, 6611, 2652, 6617,
- 6625, 6629, 6633, 2191, 6637, 6642, 6649, 6655, 6661, 6664, 6666, 6669,
- 6677, 6685, 6693, 6696, 6701, 6178, 6704, 6706, 6711, 6716, 6721, 6726,
- 6731, 6736, 6741, 6746, 6751, 6756, 6762, 6767, 6772, 6777, 6783, 6788,
- 6793, 6798, 6803, 6808, 6813, 6819, 6824, 6829, 6834, 6839, 6844, 6849,
- 6854, 6859, 6864, 6869, 6874, 6879, 6884, 6889, 6894, 6899, 6904, 6910,
- 6916, 6921, 6926, 6931, 6936, 6941, 2215, 2222, 2228, 6946, 6952, 2254,
- 2260, 6960, 6964, 6969, 6973, 6977, 6981, 6986, 6990, 6995, 6999, 7002,
- 7005, 7011, 7017, 7023, 7029, 7035, 7041, 7047, 7051, 7055, 7059, 7063,
- 7067, 7072, 7079, 7090, 7098, 7108, 7115, 7120, 7124, 7135, 7148, 7159,
- 7172, 7183, 7195, 7207, 7219, 7232, 7245, 7252, 7258, 7272, 7279, 7285,
- 7289, 7294, 7298, 7305, 7313, 7317, 7323, 7329, 7339, 7343, 7348, 7353,
- 7360, 7366, 7376, 6340, 7382, 7386, 7393, 746, 7397, 7401, 7406, 7411,
- 7416, 7420, 7426, 7434, 7440, 7444, 7450, 7460, 7464, 7470, 7475, 7479,
- 7485, 7491, 2119, 7496, 7498, 7506, 7515, 7519, 7525, 7530, 7535, 7540,
- 7545, 7551, 7556, 3923, 7561, 7565, 7571, 7576, 7582, 7587, 7592, 7598,
- 7603, 7520, 7609, 7613, 7620, 7626, 7631, 7635, 4645, 7640, 7649, 6645,
- 6652, 7654, 2803, 7658, 7663, 7668, 7531, 7672, 7536, 7541, 7677, 7684,
- 7691, 7697, 7703, 7709, 7714, 7719, 7724, 7546, 7552, 7730, 7736, 7741,
- 7749, 7557, 7754, 1028, 7757, 7765, 7771, 7777, 7786, 7794, 7799, 7805,
- 7813, 7820, 7835, 7852, 7871, 7880, 7888, 7903, 7914, 7924, 7934, 7942,
- 7948, 7960, 7969, 7977, 7984, 7991, 7997, 8002, 8010, 8020, 8027, 8037,
- 8047, 8057, 8065, 8072, 8081, 8091, 8105, 8120, 8129, 8137, 8142, 8146,
- 8155, 8161, 8166, 8176, 8186, 8196, 8201, 8205, 8214, 8219, 8229, 8240,
- 8253, 8266, 8278, 8286, 8291, 8295, 8301, 8306, 8314, 8322, 8329, 8334,
- 8342, 8348, 8351, 8355, 8361, 8369, 8374, 8378, 8386, 8395, 8403, 8409,
- 8413, 8420, 8431, 8435, 8438, 8444, 8449, 8453, 8459, 8466, 8472, 8477,
- 8484, 8491, 8498, 8505, 8512, 8519, 8524, 7848, 8529, 8535, 8542, 8549,
- 8554, 8561, 8570, 8574, 8586, 8590, 8593, 8597, 8601, 8605, 8609, 8615,
- 8620, 8626, 8631, 8636, 8642, 8647, 8652, 7356, 8657, 8661, 8665, 8669,
- 8674, 8679, 8687, 8693, 8697, 8701, 8708, 8713, 8721, 8726, 8730, 8733,
- 8739, 8746, 8750, 8753, 8758, 8762, 3962, 8768, 8777, 36, 8785, 8791,
- 8796, 7371, 8801, 8807, 8812, 8816, 8819, 8834, 8853, 8865, 8878, 8891,
- 8904, 8918, 8931, 8946, 8953, 8959, 8963, 8977, 8982, 8988, 8993, 9001,
- 9006, 6471, 9011, 9014, 9021, 9026, 9030, 2808, 955, 9036, 9040, 9046,
- 9052, 9057, 9063, 9068, 7566, 9074, 9080, 9085, 9090, 9098, 9104, 9117,
- 9125, 9132, 7572, 9138, 9146, 9154, 9161, 9174, 9186, 9196, 9203, 9210,
- 9219, 9228, 9236, 9243, 9248, 9254, 7577, 9259, 9265, 7583, 9270, 9273,
- 9280, 9286, 9299, 7083, 9310, 9316, 9325, 9333, 9340, 9346, 9352, 9357,
- 9361, 9366, 8826, 9372, 7588, 9379, 9384, 9391, 9397, 9403, 9408, 9416,
- 9424, 9431, 9435, 9449, 9459, 9464, 9468, 9479, 9485, 9490, 9495, 7593,
- 7599, 9499, 9502, 9507, 9519, 9526, 9531, 9535, 9540, 9544, 9551, 9557,
- 7604, 7521, 9564, 2813, 8, 9571, 9576, 9580, 9586, 9594, 9604, 9609,
- 9614, 9621, 9628, 9632, 9643, 9653, 9662, 9674, 9679, 9683, 9691, 9705,
- 9709, 9712, 9720, 9727, 9735, 9739, 9750, 9754, 9761, 9766, 9770, 9776,
- 9781, 9785, 9791, 9796, 9807, 9811, 9814, 9820, 9825, 9831, 9837, 9844,
- 9855, 9865, 9875, 9884, 9891, 7614, 7621, 7627, 7632, 9897, 9903, 7636,
- 9909, 9912, 9919, 9924, 9939, 9955, 9970, 9978, 9984, 1043, 400, 9989,
- 9997, 10004, 10010, 10015, 10020, 7641, 10022, 10026, 10031, 10035,
- 10045, 10050, 10054, 10063, 10067, 10070, 10077, 10081, 10084, 10092,
- 10099, 10107, 10111, 10118, 10127, 10130, 10134, 10138, 10144, 10148,
- 10152, 10156, 10162, 10172, 10176, 10184, 10188, 10195, 10199, 10204,
- 10208, 10215, 10221, 10229, 10235, 10245, 10250, 10255, 10259, 10267,
- 3822, 10275, 10280, 10284, 10288, 10291, 10299, 10306, 10310, 4469,
- 10314, 10319, 10323, 10334, 10339, 10345, 10349, 10352, 10360, 10365,
- 10370, 10377, 10382, 7650, 10387, 10391, 1685, 4619, 10398, 10403, 10408,
- 10413, 10419, 10424, 10430, 10435, 10440, 10445, 10450, 10455, 10460,
- 10465, 10470, 10475, 10480, 10485, 10490, 10495, 10500, 10505, 10510,
- 10516, 10521, 10526, 10531, 10536, 10541, 10547, 10552, 10557, 10563,
- 10568, 10574, 10579, 10585, 10590, 10595, 10600, 10605, 10611, 10616,
- 10621, 10626, 724, 139, 10634, 10638, 10643, 10648, 10652, 10656, 10660,
- 10665, 10669, 10674, 10678, 10681, 10685, 10689, 10694, 10704, 10710,
- 10718, 10722, 10726, 10733, 10741, 10750, 10761, 10768, 10775, 10784,
- 10793, 10801, 10810, 10819, 10828, 10837, 10847, 10857, 10867, 10877,
- 10887, 10896, 10906, 10916, 10926, 10936, 10946, 10956, 10966, 10975,
- 10985, 10995, 11005, 11015, 11025, 11035, 11044, 11054, 11064, 11074,
- 11084, 11094, 11104, 11114, 11124, 11134, 11143, 11153, 11163, 11173,
- 11183, 11193, 11203, 11213, 11223, 11233, 11243, 11252, 11258, 11262,
- 11265, 11269, 11274, 11281, 11287, 11292, 11296, 11301, 11310, 11318,
- 11323, 11327, 11331, 11337, 11342, 11348, 7659, 11353, 11358, 11367,
- 7664, 11372, 11375, 11381, 11389, 7669, 11396, 11400, 11404, 11408,
- 11418, 11424, 11429, 11438, 11446, 11453, 11460, 11465, 11472, 11477,
- 11481, 11484, 11495, 11505, 11514, 11522, 11533, 11545, 11555, 11560,
- 11564, 11569, 11574, 11578, 11584, 11592, 11599, 11610, 11615, 11625,
- 11634, 11638, 11641, 11648, 11658, 11667, 11674, 11678, 11685, 11691,
- 11696, 11701, 11705, 11714, 11719, 11725, 11729, 11734, 11738, 11747,
- 11755, 11763, 11770, 11778, 11790, 11801, 11811, 11818, 11824, 11833,
- 11844, 11853, 11865, 11877, 11889, 11899, 11908, 11917, 11925, 11932,
- 11941, 11949, 11955, 11961, 11966, 6199, 11970, 11972, 11977, 11983,
- 11992, 12000, 12007, 12016, 12025, 12034, 12043, 12052, 12061, 12070,
- 12079, 12089, 12099, 12108, 12114, 12121, 12135, 12142, 12150, 12159,
- 12165, 12174, 12183, 12194, 12204, 12212, 12219, 12227, 12236, 12249,
- 12257, 12264, 12277, 12283, 12289, 12299, 12308, 12317, 12322, 12326,
- 12332, 12338, 12345, 7370, 12350, 12355, 12362, 12367, 12372, 12376,
- 12384, 12390, 12395, 12403, 12411, 12418, 12426, 12432, 12440, 12448,
- 12453, 12459, 12466, 12472, 12477, 12481, 12492, 12500, 12506, 12511,
- 12520, 12526, 12531, 12540, 12554, 3781, 12558, 12563, 12568, 12574,
- 12579, 12584, 12588, 12593, 12598, 6198, 12603, 12608, 12613, 12618,
- 12622, 12627, 12632, 12637, 12643, 12649, 12654, 12658, 12663, 12668,
- 12673, 7673, 12678, 12683, 12688, 12693, 12710, 12728, 12740, 12753,
- 12770, 12786, 12803, 12813, 12832, 12843, 12854, 12865, 12876, 12888,
- 12899, 12910, 12927, 12938, 12949, 12954, 2335, 12958, 12961, 12967,
- 12975, 12983, 12988, 12996, 13004, 13011, 13016, 13022, 13029, 13037,
- 13044, 13056, 13064, 13069, 9933, 13075, 13084, 13093, 13101, 13108,
- 13114, 13122, 13129, 13135, 13142, 13148, 13157, 13165, 13175, 13182,
- 13188, 13196, 13202, 13210, 13217, 13230, 13237, 13246, 13255, 13264,
- 13272, 13282, 13289, 13294, 3495, 13301, 13306, 13309, 12604, 13313,
- 13319, 13323, 13331, 13343, 13348, 13355, 13361, 13366, 13373, 12609,
- 13377, 13381, 12614, 13385, 13389, 13393, 13400, 13405, 13409, 13413,
- 13421, 13428, 13435, 13452, 13461, 13465, 13468, 13476, 13482, 13487,
- 3573, 13491, 13493, 13501, 13508, 13518, 13530, 13535, 13541, 13546,
- 13550, 13556, 13561, 13567, 13570, 13577, 13585, 13592, 13598, 13604,
- 13609, 13616, 13622, 13627, 13634, 13638, 13644, 13648, 13655, 13661,
- 13667, 13675, 13681, 13686, 13692, 13700, 13708, 13714, 13720, 13725,
- 13732, 13737, 13741, 13747, 13752, 13759, 13764, 13770, 13773, 13779,
- 13785, 13788, 13792, 13804, 13810, 13815, 13822, 13828, 13834, 13845,
- 13855, 13864, 13872, 13879, 13890, 13900, 13910, 13918, 13921, 12628,
- 13926, 13931, 12633, 12758, 13939, 13952, 13967, 13978, 12775, 13996,
- 14009, 14022, 14033, 8841, 14044, 14057, 14076, 14087, 14098, 14109,
- 2603, 14122, 14126, 14134, 14145, 14152, 14158, 14166, 14170, 14176,
- 14179, 14189, 14197, 14204, 14212, 14222, 14227, 14234, 14239, 14246,
- 14257, 14267, 14273, 14278, 14283, 14287, 14291, 14297, 14303, 14308,
- 14313, 14318, 14322, 12638, 12644, 14326, 12650, 14331, 14339, 14348,
- 14355, 7542, 14359, 14361, 14366, 14371, 14377, 14382, 14387, 14392,
- 14397, 14401, 14407, 14413, 14418, 14424, 14429, 14434, 14440, 14445,
- 14450, 14455, 14461, 14466, 14471, 14477, 14483, 14488, 14493, 14500,
- 14506, 14517, 14524, 14529, 14533, 14537, 14540, 14548, 14553, 14560,
- 14567, 14572, 14577, 14584, 14594, 14599, 14606, 14612, 14622, 14632,
- 14646, 14660, 14674, 14688, 14703, 14718, 14735, 14753, 14766, 14772,
- 14777, 14782, 14786, 14791, 14799, 14805, 14810, 14815, 14819, 14824,
- 14828, 14833, 14837, 14848, 14854, 14859, 14864, 14871, 14876, 14880,
- 14885, 14890, 14896, 14903, 14909, 14914, 14918, 14924, 14929, 14934,
- 14938, 14944, 14949, 14954, 14961, 14966, 11420, 14970, 14975, 14979,
- 14984, 14990, 14996, 15003, 15013, 15021, 15028, 15033, 15037, 15046,
- 15054, 15061, 15068, 15074, 15080, 15085, 15090, 15096, 15101, 15107,
- 15112, 15118, 15124, 15131, 15137, 15142, 15147, 7715, 15156, 15159,
- 15165, 15170, 15175, 15185, 15192, 15198, 15203, 15209, 15214, 15220,
- 15225, 15231, 15237, 15242, 15250, 15257, 15262, 15267, 15273, 15278,
- 15282, 15291, 15302, 15309, 15317, 15323, 15330, 15336, 15341, 15345,
- 15351, 15356, 15361, 15366, 7720, 6223, 2827, 15370, 15374, 15378, 15382,
- 15386, 15389, 15396, 15404, 12664, 15411, 15421, 15429, 15436, 15444,
- 15454, 15463, 15476, 15481, 15486, 15494, 15501, 11510, 11519, 15508,
- 15518, 15533, 15539, 15546, 15553, 15559, 15569, 15579, 12669, 15588,
- 15594, 15600, 15608, 15616, 15621, 15630, 15638, 15650, 15660, 15670,
- 15680, 15689, 15701, 15711, 15721, 15732, 15737, 15749, 15761, 15773,
- 15785, 15797, 15809, 15821, 15833, 15845, 15857, 15868, 15880, 15892,
- 15904, 15916, 15928, 15940, 15952, 15964, 15976, 15988, 15999, 16011,
- 16023, 16035, 16047, 16059, 16071, 16083, 16095, 16107, 16119, 16130,
- 16142, 16154, 16166, 16178, 16190, 16202, 16214, 16226, 16238, 16250,
- 16261, 16273, 16285, 16297, 16309, 16321, 16333, 16345, 16357, 16369,
- 16381, 16392, 16404, 16416, 16428, 16440, 16452, 16464, 16476, 16488,
- 16500, 16512, 16523, 16535, 16547, 16559, 16571, 16583, 16595, 16607,
- 16619, 16631, 16643, 16654, 16666, 16678, 16690, 16702, 16715, 16728,
- 16741, 16754, 16767, 16780, 16793, 16805, 16818, 16831, 16844, 16857,
- 16870, 16883, 16896, 16909, 16922, 16935, 16947, 16960, 16973, 16986,
- 16999, 17012, 17025, 17038, 17051, 17064, 17077, 17089, 17102, 17115,
- 17128, 17141, 17154, 17167, 17180, 17193, 17206, 17219, 17231, 17244,
- 17257, 17270, 17283, 17296, 17309, 17322, 17335, 17348, 17361, 17373,
- 17386, 17399, 17412, 17425, 17438, 17451, 17464, 17477, 17490, 17503,
- 17515, 17526, 17539, 17552, 17565, 17578, 17591, 17604, 17617, 17630,
- 17643, 17656, 17668, 17681, 17694, 17707, 17720, 17733, 17746, 17759,
- 17772, 17785, 17798, 17810, 17823, 17836, 17849, 17862, 17875, 17888,
- 17901, 17914, 17927, 17940, 17952, 17965, 17978, 17991, 18004, 18017,
- 18030, 18043, 18056, 18069, 18082, 18094, 18107, 18120, 18133, 18146,
- 18159, 18172, 18185, 18198, 18211, 18224, 18236, 18249, 18262, 18275,
- 18288, 18301, 18314, 18327, 18340, 18353, 18366, 18378, 18391, 18404,
- 18417, 18430, 18443, 18456, 18469, 18482, 18495, 18508, 18520, 18533,
- 18546, 18559, 18572, 18585, 18598, 18611, 18624, 18637, 18650, 18662,
- 18675, 18688, 18701, 18714, 18727, 18740, 18753, 18766, 18779, 18792,
- 18804, 18817, 18830, 18843, 18856, 18869, 18882, 18895, 18908, 18921,
- 18934, 18946, 18957, 18965, 18972, 18978, 18982, 18988, 18994, 19002,
- 19008, 19013, 19017, 19026, 7547, 19037, 19044, 19052, 19059, 19066,
- 9293, 19073, 19082, 19087, 19092, 6239, 19099, 19104, 19107, 19112,
- 19120, 19127, 19134, 19141, 19147, 19156, 19165, 19171, 19180, 19186,
- 19191, 19201, 19208, 19214, 19222, 19228, 19235, 19245, 19254, 19258,
- 19265, 19269, 19274, 19280, 19288, 19292, 19302, 12679, 19311, 19317,
- 19321, 19330, 19336, 19343, 19354, 19362, 19371, 7335, 19379, 19384,
- 19390, 19395, 19399, 19403, 19407, 8006, 19412, 19420, 19427, 19436,
- 19443, 19450, 9223, 19457, 19463, 19467, 19473, 19479, 19487, 19493,
- 19500, 19506, 19512, 19521, 19525, 19533, 19542, 19549, 19554, 19558,
- 19569, 19574, 19579, 19584, 19597, 6426, 19601, 19607, 19615, 19619,
- 19626, 19635, 19640, 19648, 19660, 19665, 19669, 19672, 19678, 19684,
- 19689, 19693, 19696, 19707, 19712, 7750, 19719, 7558, 7755, 19724, 19729,
- 19734, 19739, 19744, 19749, 19754, 19759, 19764, 19769, 19774, 19779,
- 19785, 19790, 19795, 19800, 19805, 19810, 19815, 19820, 19825, 19830,
- 19836, 19842, 19847, 19852, 19857, 19862, 19867, 19872, 19877, 19882,
- 19887, 19893, 19898, 19903, 19908, 19914, 19920, 19925, 19930, 19935,
- 19940, 19945, 19950, 19955, 19960, 19966, 19971, 19976, 19981, 19986,
- 19992, 19997, 20002, 20006, 129, 20014, 20018, 20022, 20026, 20031,
- 20035, 20039, 10781, 20043, 20048, 20052, 20057, 20061, 20066, 20070,
- 20076, 20081, 20085, 20089, 20097, 20101, 20106, 20111, 20115, 20121,
- 20126, 20130, 20135, 20140, 20144, 20151, 20158, 20165, 20169, 20173,
- 20178, 20182, 20185, 20191, 20204, 20209, 20218, 20223, 7795, 20228,
- 20231, 2666, 2671, 20235, 20241, 20247, 20252, 20257, 20262, 20268,
- 20273, 12190, 20278, 20283, 20288, 20294, 20299, 20304, 20310, 20315,
- 20319, 20324, 20329, 20334, 20338, 20343, 20348, 20353, 20358, 20362,
- 20366, 20371, 2836, 20320, 20375, 20383, 20390, 8100, 20402, 20410,
- 20325, 20417, 20422, 20430, 20330, 20435, 20440, 20448, 20453, 20458,
- 20462, 20467, 20471, 20477, 20480, 20487, 20491, 20495, 20501, 20508,
- 20513, 7362, 1690, 1695, 20517, 20523, 20529, 20534, 20538, 20542, 20546,
- 20549, 20555, 20562, 20570, 20576, 20582, 20587, 20592, 20596, 13039,
- 13896, 20601, 20613, 20616, 20623, 20630, 20634, 20642, 20653, 20662,
- 20675, 20685, 20699, 20711, 20725, 20737, 20747, 20759, 20765, 20780,
- 20804, 20822, 20841, 20854, 20868, 20886, 20902, 20919, 20937, 20948,
- 20967, 20984, 21004, 21022, 21034, 21048, 21062, 21074, 21091, 21110,
- 21128, 21140, 21158, 21177, 12818, 21190, 21210, 21222, 8872, 21234,
- 21239, 21244, 21249, 21255, 21260, 21264, 21271, 2352, 21275, 21281,
- 21285, 21288, 21292, 21300, 21306, 20339, 21310, 21319, 21330, 21336,
- 21342, 21351, 21359, 21366, 21371, 21378, 21384, 21393, 21401, 21408,
- 21418, 21427, 21437, 21442, 21451, 21460, 21471, 21482, 3880, 21492,
- 21496, 21506, 21514, 21524, 21535, 21540, 21548, 21555, 21561, 21566,
- 20349, 21570, 21579, 21583, 21586, 21591, 21598, 21607, 21615, 21623,
- 21633, 21642, 21648, 21654, 20354, 20359, 21658, 21668, 21678, 21688,
- 21696, 21703, 21713, 21721, 21729, 21735, 962, 21744, 13000, 537, 21758,
- 21767, 21775, 21786, 21797, 21807, 21816, 21828, 21837, 21846, 21852,
- 21861, 21870, 21880, 21888, 21896, 7727, 21902, 21905, 21909, 21914,
- 21919, 8215, 20367, 21927, 21933, 21939, 21944, 21949, 21953, 21961,
- 21967, 21973, 21977, 3467, 21985, 21990, 21995, 21999, 22003, 8287,
- 22010, 22018, 22025, 22031, 8296, 8302, 22039, 22047, 22054, 22059,
- 22064, 22070, 22074, 22085, 22090, 2555, 22095, 22106, 22112, 22117,
- 22121, 22125, 22128, 22135, 22142, 22149, 22155, 22159, 22164, 22168,
- 22172, 979, 22176, 22181, 22186, 22191, 22196, 22201, 22206, 22211,
- 22216, 22221, 22226, 22231, 22236, 22241, 22247, 22252, 22257, 22262,
- 22267, 22272, 22277, 22283, 22288, 22293, 22298, 22303, 22308, 22313,
- 22318, 22324, 22330, 22335, 22341, 22346, 22351, 5, 22357, 22361, 22365,
- 22369, 22374, 22378, 22382, 22386, 22390, 22395, 22399, 22404, 22408,
- 22411, 22415, 22420, 22424, 22429, 22433, 22437, 22441, 22446, 22450,
- 22454, 22464, 22469, 22473, 22477, 22482, 22487, 22496, 22501, 22506,
- 22510, 22514, 22527, 22539, 22548, 22557, 22563, 22568, 22572, 22576,
- 22586, 22595, 22603, 22609, 22614, 22618, 22625, 22635, 22644, 22652,
- 22660, 22667, 22675, 22684, 22693, 22701, 22706, 22710, 22714, 22717,
- 22719, 22723, 22727, 22732, 22737, 22741, 22745, 22748, 22752, 22755,
- 22759, 22762, 22765, 22769, 22775, 22779, 22783, 22787, 22792, 22797,
- 22802, 22806, 22809, 22814, 22820, 22825, 22831, 22836, 22840, 22844,
- 22848, 22853, 22857, 22862, 22866, 22873, 22877, 22880, 22884, 22890,
- 22896, 22900, 22904, 22909, 22916, 22922, 22926, 22935, 22939, 22943,
- 22946, 22952, 22957, 22963, 1452, 1754, 22968, 22973, 22978, 22983,
- 22988, 22993, 22998, 2106, 2148, 23003, 23006, 23010, 23014, 23019,
- 23023, 23027, 23030, 23035, 23040, 23044, 23047, 23052, 23056, 23061,
- 23065, 13012, 23070, 23073, 23076, 23080, 23085, 23098, 23102, 23105,
- 23113, 23122, 23129, 23134, 23140, 23146, 23153, 23160, 23164, 23168,
- 23172, 23177, 23182, 23186, 23194, 23199, 23211, 23222, 23227, 23231,
- 23235, 23241, 23246, 23251, 23255, 23258, 23264, 6346, 2270, 23268,
- 23273, 23289, 7842, 23309, 23318, 23334, 23338, 23341, 23347, 23357,
- 23363, 23378, 23390, 23401, 23409, 23418, 23424, 23433, 23443, 23454,
- 23465, 23474, 23483, 23491, 23498, 23506, 23519, 23526, 23532, 23537,
- 23546, 23552, 23557, 23565, 21516, 23577, 23589, 23603, 23611, 23618,
- 23630, 23639, 23648, 23656, 23664, 23672, 23679, 23688, 23696, 23706,
- 23715, 23725, 23734, 23743, 23751, 23756, 23760, 23763, 23767, 23771,
- 23775, 23779, 23783, 23789, 23795, 23803, 13057, 23810, 23815, 23822,
- 23828, 23835, 13065, 23842, 23845, 23857, 23865, 23871, 23876, 23880,
- 8245, 23891, 23901, 23910, 23917, 23921, 13070, 23924, 23931, 23935,
- 23941, 23944, 23951, 23957, 23961, 23966, 23970, 23979, 23986, 23992,
- 6387, 23999, 24007, 24014, 24020, 24025, 24031, 24037, 24045, 24049,
- 24052, 24054, 23768, 24063, 24069, 24079, 24084, 24091, 24097, 24102,
- 24107, 24112, 24117, 24124, 24133, 24140, 24149, 24155, 24160, 24166,
- 24171, 24178, 24189, 24194, 24198, 24208, 24214, 24218, 24223, 24233,
- 24242, 24246, 24253, 24261, 24268, 24274, 24279, 24287, 24294, 24306,
- 24315, 24319, 11362, 24327, 24337, 24341, 23109, 24352, 24357, 24361,
- 24368, 24375, 20117, 23693, 24380, 24384, 24387, 20954, 24392, 24406,
- 24422, 24440, 24459, 24476, 24494, 20973, 24511, 24531, 20990, 24543,
- 24555, 13983, 24567, 21010, 24581, 24593, 8885, 24607, 24612, 24617,
- 24622, 24628, 24634, 24640, 24644, 24651, 24656, 24666, 24672, 8532,
- 24678, 24680, 24685, 24693, 24697, 24120, 24703, 24710, 9869, 9879,
- 24717, 24727, 24732, 24736, 24739, 24745, 24753, 24765, 24775, 24791,
- 24804, 24818, 14001, 24832, 24839, 24843, 24846, 24851, 24855, 24862,
- 24869, 24879, 24884, 24889, 24894, 24902, 24910, 24919, 24924, 7939,
- 24928, 24931, 24934, 24939, 24946, 24951, 24967, 24975, 24983, 7790,
- 24991, 24996, 25000, 25006, 25012, 25015, 25021, 25033, 25041, 25048,
- 25054, 25061, 25072, 25086, 25099, 25108, 25120, 25131, 25141, 25150,
- 25159, 25167, 25178, 6369, 25185, 25191, 25196, 25202, 25209, 25219,
- 25229, 25238, 25244, 25251, 25256, 25263, 25271, 25279, 25291, 4704,
- 25298, 25307, 25315, 25321, 25327, 25332, 25336, 25339, 25345, 25352,
- 25357, 25362, 25366, 25378, 25389, 25398, 25406, 13197, 25411, 25417,
- 25423, 9862, 7049, 25428, 25431, 25434, 25440, 25448, 25456, 25460,
- 25464, 25469, 25472, 25481, 25489, 25500, 25504, 25510, 25516, 25520,
- 25526, 25534, 25556, 25580, 25587, 25594, 25600, 25606, 25611, 25622,
- 25640, 25647, 25655, 25659, 25668, 25681, 25689, 25701, 25712, 25722,
- 25736, 25745, 25753, 25765, 7859, 25776, 25787, 25799, 25809, 25818,
- 25823, 25827, 25835, 25845, 25850, 25854, 25857, 25860, 25868, 25876,
- 25885, 25895, 25904, 25910, 25924, 2617, 25946, 25957, 25966, 25976,
- 25988, 25997, 26007, 26015, 26023, 26032, 26037, 26048, 26053, 26064,
- 26068, 26078, 26087, 26095, 26105, 26115, 26123, 26132, 26139, 26147,
- 26154, 26163, 26167, 26175, 26182, 26190, 26197, 26208, 26223, 26230,
- 26236, 26246, 26255, 26261, 26268, 12312, 26274, 26278, 26283, 26287,
- 26291, 26299, 26307, 26313, 26322, 26329, 26334, 26339, 26349, 21568,
- 26353, 26356, 26361, 26366, 26371, 26376, 26381, 26386, 26391, 26396,
- 26402, 26407, 26412, 26418, 1223, 679, 26423, 26432, 2318, 26439, 26444,
- 26448, 26454, 1256, 541, 334, 26459, 26468, 26476, 26485, 26493, 26504,
- 26513, 26521, 26525, 26528, 26536, 26544, 26549, 13025, 26555, 26561,
- 26567, 4350, 26572, 26576, 26582, 26586, 26593, 1418, 26599, 7946, 26606,
- 26616, 26624, 26630, 26639, 26647, 26653, 26661, 26668, 9455, 26674,
- 26681, 26688, 1459, 2105, 26694, 26700, 26707, 26718, 26729, 26737,
- 26744, 26754, 26763, 26771, 26778, 26785, 26798, 26809, 26828, 1261,
- 26832, 26837, 26845, 3510, 26849, 26854, 26858, 1422, 22746, 26868,
- 26872, 26877, 26881, 3435, 26887, 26895, 26902, 26913, 26921, 26929,
- 3511, 269, 26934, 26942, 26950, 26957, 26963, 26968, 2170, 26975, 26981,
- 23962, 24184, 26987, 106, 26991, 26995, 27001, 606, 7695, 27006, 27013,
- 27019, 2281, 27023, 27027, 27030, 27033, 27038, 27045, 27051, 27056,
- 27064, 27071, 27077, 20455, 27081, 3581, 14826, 27085, 27090, 27093,
- 27101, 27109, 27112, 27119, 27129, 27141, 27146, 27150, 27158, 27165,
- 27171, 27178, 27185, 27188, 27192, 27196, 1426, 27206, 27208, 27213,
- 27219, 27225, 27230, 27235, 27240, 27245, 27250, 27255, 27260, 27265,
- 27270, 27275, 27280, 27285, 27290, 27295, 27301, 27307, 27313, 27319,
- 27324, 27329, 27334, 27340, 27345, 27350, 27355, 27361, 27366, 27372,
- 27377, 27382, 27387, 27392, 27398, 27403, 27409, 27414, 27419, 27424,
- 27429, 27435, 27440, 27446, 27451, 27456, 27461, 27466, 27471, 27476,
- 27481, 27486, 27491, 27497, 27503, 27509, 27514, 27519, 27524, 27529,
- 27535, 27541, 27547, 27553, 27559, 27565, 27570, 27576, 27581, 27586,
- 27591, 27596, 27602, 2397, 27607, 2404, 2411, 2708, 27612, 2417, 2427,
- 27618, 27622, 27627, 27632, 27638, 27643, 27648, 27652, 27657, 27663,
- 27668, 27673, 27678, 27684, 27689, 27693, 27697, 27702, 27707, 27712,
- 27717, 27722, 27728, 27734, 27739, 27743, 27748, 27754, 27758, 27763,
- 27768, 27773, 27778, 27782, 27785, 27790, 27795, 27800, 27805, 27811,
- 27817, 27822, 27827, 27831, 27836, 27841, 27846, 27851, 27856, 27860,
- 27865, 27870, 27875, 27879, 27883, 27887, 27892, 27900, 27906, 27912,
- 27918, 27923, 27927, 27930, 27935, 27939, 27944, 27948, 27953, 27957,
- 27960, 15489, 27965, 27973, 19439, 26603, 27978, 27983, 27987, 27992,
- 27996, 28000, 28005, 28009, 28012, 28015, 28019, 28024, 28032, 28036,
- 28039, 28044, 28048, 28052, 28057, 28062, 28066, 28072, 28077, 28082,
- 28089, 28096, 28100, 28103, 28109, 28118, 28125, 28133, 28140, 28144,
- 28149, 28153, 28159, 28165, 28169, 28175, 28180, 28185, 28192, 28198,
- 28204, 28210, 28216, 28223, 28229, 28235, 28241, 28247, 28253, 28259,
- 28265, 28272, 28278, 28285, 28291, 28297, 28303, 28309, 28315, 28321,
- 28327, 28333, 28339, 9763, 28345, 28350, 28355, 28358, 28366, 28371,
- 28380, 28386, 28391, 28396, 28401, 28405, 28410, 28415, 28420, 28425,
- 28430, 28437, 28444, 28450, 28456, 28461, 14510, 28468, 28474, 28481,
- 28487, 28493, 28498, 28506, 28511, 14294, 28515, 28520, 28525, 28531,
- 28536, 28541, 28545, 28550, 28555, 28561, 28566, 28571, 28575, 28580,
- 28585, 28589, 28594, 28599, 28604, 28608, 28613, 28618, 28623, 28627,
- 28631, 13531, 28635, 28644, 28650, 28656, 28665, 28673, 28682, 28690,
- 28695, 28699, 28706, 28712, 28716, 28719, 28724, 28733, 28741, 28746,
- 1458, 28752, 28755, 28759, 20524, 20530, 28765, 28769, 28780, 28791,
- 28802, 28814, 28821, 28828, 28833, 28837, 4387, 733, 19438, 28845, 28849,
- 28854, 28860, 28865, 28871, 28876, 28882, 28887, 8764, 2785, 3365, 28891,
- 28894, 28900, 28906, 28912, 28919, 28925, 28931, 28937, 28943, 28949,
- 28955, 28961, 28967, 28973, 28979, 28985, 28991, 28998, 29004, 29010,
- 29016, 29022, 29028, 29033, 29036, 29043, 29051, 29056, 29061, 29067,
- 29072, 29077, 29081, 29086, 29092, 29097, 29103, 29108, 29114, 29119,
- 29125, 29131, 29135, 29140, 29145, 29150, 29155, 29159, 29164, 29169,
- 29174, 29180, 29186, 29192, 29198, 29203, 29207, 29210, 29216, 29222,
- 29231, 29239, 29246, 29251, 29255, 29259, 29264, 13395, 29269, 29277,
- 29283, 3611, 29288, 29291, 29295, 6436, 29301, 29307, 29314, 6445, 29318,
- 29324, 29331, 29337, 29346, 29354, 29366, 29370, 29377, 29383, 29387,
- 29390, 29399, 29407, 29412, 29416, 29426, 29436, 29446, 29452, 29457,
- 29467, 29472, 29485, 29499, 29510, 29522, 29534, 29548, 29561, 29573,
- 29585, 12859, 29599, 29604, 29609, 29613, 29617, 29621, 1743, 25129,
- 29625, 29630, 29635, 29639, 29642, 29647, 29652, 29658, 29664, 8461,
- 29669, 29676, 13935, 29682, 29687, 29692, 29696, 29701, 29706, 28855,
- 29711, 29716, 29721, 29727, 28861, 29732, 29735, 29742, 29750, 29756,
- 29762, 29768, 29779, 29784, 29791, 29798, 29805, 29813, 29822, 29831,
- 29837, 29843, 29851, 28866, 29856, 29862, 29868, 28872, 29873, 29881,
- 29889, 29895, 29902, 29908, 29915, 29922, 29928, 29936, 29946, 29953,
- 29958, 29964, 29969, 29974, 29981, 29990, 29998, 30003, 30009, 30016,
- 30024, 30030, 30035, 30041, 30050, 25890, 30057, 30061, 30066, 30075,
- 30080, 30085, 10714, 30093, 30098, 30103, 30107, 30112, 30117, 30124,
- 30129, 30134, 28877, 28883, 30140, 2473, 239, 30143, 30146, 30150, 30154,
- 30164, 30172, 30176, 30183, 30190, 30194, 30197, 30203, 30211, 30219,
- 30223, 30227, 30230, 30237, 30241, 30248, 30256, 30263, 30267, 30275,
- 684, 297, 30287, 30292, 30297, 30303, 30308, 30313, 3632, 30318, 30321,
- 30326, 30331, 30336, 30341, 30346, 30353, 20609, 30358, 30363, 30368,
- 30373, 30378, 30384, 30389, 30395, 29039, 30401, 30406, 30412, 30418,
- 30428, 30433, 30438, 30442, 30447, 30452, 30457, 30462, 30475, 30480,
- 20406, 14906, 3638, 30484, 30489, 30494, 30500, 30505, 30510, 30514,
- 30519, 30524, 30530, 30535, 30540, 30544, 30549, 30554, 30559, 30563,
- 30568, 30573, 30578, 30584, 30590, 30595, 30599, 30604, 30609, 30614,
- 30618, 30626, 30630, 30636, 30640, 30647, 14699, 30653, 30660, 30668,
- 30675, 30681, 30693, 30699, 30703, 2727, 30707, 30711, 30232, 30720,
- 30731, 30736, 30741, 30746, 30750, 30755, 20535, 30759, 30764, 19459,
- 30768, 30773, 30779, 30784, 30788, 30792, 30795, 30799, 30805, 30816,
- 30828, 30833, 30837, 30840, 343, 30844, 30849, 30854, 30859, 30864,
- 30869, 30875, 30880, 30885, 30891, 30896, 30902, 30907, 30913, 30918,
- 30923, 30928, 30933, 30938, 30943, 30948, 30953, 30959, 30964, 30969,
- 30974, 30979, 30984, 30989, 30994, 31000, 31006, 31011, 31016, 31021,
- 31026, 31031, 31036, 31041, 31046, 31051, 31056, 31061, 31066, 31071,
- 31076, 31081, 31086, 31091, 31096, 31102, 26, 31107, 31111, 31115, 31123,
- 31127, 31131, 31134, 31137, 31139, 31144, 31148, 31153, 31157, 31162,
- 31166, 31171, 31175, 31178, 31180, 31185, 31189, 31200, 31203, 31205,
- 31209, 31221, 31230, 31234, 31240, 31245, 31254, 31260, 31265, 31270,
- 31274, 31279, 31286, 31291, 31297, 31302, 31306, 31313, 23701, 23711,
- 31317, 31322, 31327, 31332, 31339, 31343, 31350, 6544, 31356, 31365,
- 31373, 31388, 31402, 31410, 31421, 31430, 31435, 5681, 31445, 31450,
- 31455, 31459, 31462, 31466, 31471, 31475, 31482, 31487, 31492, 7320,
- 31502, 31504, 31507, 31511, 31517, 31521, 31526, 31531, 31537, 31542,
- 31548, 31553, 31563, 31572, 31580, 31585, 31591, 31596, 31603, 31607,
- 31615, 31622, 31635, 31643, 31647, 31657, 31662, 31666, 31674, 31682,
- 31686, 31695, 31701, 31706, 31714, 31724, 31733, 31742, 31751, 31762,
- 31770, 31781, 31790, 31797, 31803, 31808, 31819, 31824, 31828, 31831,
- 31835, 31843, 31849, 31857, 31864, 31870, 31875, 31881, 2372, 31885,
- 31887, 31892, 31897, 31900, 31902, 31906, 31909, 31916, 31920, 31924,
- 31927, 31933, 31943, 31948, 31954, 31958, 31963, 31976, 24074, 31982,
- 31991, 15654, 31998, 32007, 29432, 32015, 32020, 32024, 32032, 32039,
- 32044, 32048, 32053, 32057, 32065, 32071, 32077, 32082, 32086, 32089,
- 32094, 32107, 32123, 21080, 32140, 32152, 32169, 32181, 32195, 21097,
- 21116, 32207, 32219, 2634, 32233, 32238, 32243, 32248, 32252, 32259,
- 32271, 32277, 32280, 32291, 32302, 29848, 670, 32307, 32311, 32314,
- 32319, 32324, 32330, 32335, 32340, 32346, 32352, 32357, 32361, 32366,
- 32371, 32376, 32380, 32383, 32389, 32394, 32399, 32404, 32408, 32413,
- 32419, 32427, 24299, 32432, 32437, 32444, 32450, 32456, 32461, 32469,
- 20618, 32476, 32481, 32486, 32491, 32495, 32498, 32503, 32507, 32511,
- 32518, 32524, 32530, 32536, 32543, 32548, 32554, 31677, 32558, 32562,
- 32567, 32580, 32585, 32591, 32599, 32606, 32614, 32624, 32630, 32636,
- 32642, 32646, 32655, 32660, 32665, 8787, 32670, 32677, 32683, 32693,
- 32698, 32704, 32712, 3543, 32719, 32726, 3549, 32730, 32735, 32746,
- 32753, 32759, 32768, 32772, 3932, 32775, 32782, 32788, 32794, 32802,
- 32812, 26958, 32819, 32827, 32833, 32838, 32844, 32849, 32855, 32859,
- 32866, 32872, 32881, 24094, 32888, 32893, 32897, 32905, 32913, 7974,
- 4373, 32920, 32924, 32928, 32933, 32939, 32944, 32949, 32956, 30349,
- 32962, 32967, 32971, 32976, 32980, 32989, 32993, 32999, 33006, 33012,
- 33019, 33024, 33033, 33038, 33042, 33047, 33054, 33062, 33070, 33075,
- 19508, 33079, 33082, 33086, 33090, 33094, 33097, 33099, 33104, 33112,
- 33116, 33123, 33127, 33135, 33142, 33152, 33156, 33160, 33168, 33176,
- 33182, 33187, 33196, 11669, 33202, 33211, 33216, 33223, 33231, 33239,
- 33247, 33254, 33261, 33268, 33275, 33282, 33287, 33293, 33310, 33318,
- 33328, 33336, 33343, 385, 33347, 33353, 33357, 33362, 31426, 33368,
- 33371, 33375, 33383, 3554, 33391, 33397, 33403, 33412, 33422, 33429,
- 33435, 3560, 3566, 33444, 33451, 33459, 33464, 33468, 33475, 33483,
- 33489, 33498, 33508, 33514, 33522, 33531, 33538, 33546, 20175, 33553,
- 33560, 33566, 33576, 33585, 33596, 33600, 33610, 33616, 33623, 33631,
- 33640, 33649, 33659, 33670, 33677, 33682, 33689, 2967, 33697, 33703,
- 33708, 33714, 33720, 33725, 33738, 33751, 33764, 33771, 33777, 33785,
- 33790, 33794, 1432, 33798, 33803, 33808, 33813, 33818, 33824, 33829,
- 33834, 33839, 33844, 33849, 33854, 33859, 33865, 33871, 33876, 33881,
- 33887, 33892, 33897, 33902, 33908, 33913, 33918, 33923, 33928, 33934,
- 33939, 33944, 33950, 33955, 33960, 33965, 33970, 33975, 33981, 33986,
- 33992, 33997, 34003, 34008, 34013, 34018, 34024, 34030, 34036, 34042,
- 34048, 34054, 34060, 34066, 34071, 34076, 34082, 34087, 34092, 34097,
- 34102, 34107, 34112, 34117, 34123, 34128, 34133, 34139, 34145, 101,
- 34150, 34152, 34156, 34160, 34164, 34169, 34173, 7895, 34177, 34183,
- 4738, 34189, 34192, 34197, 34201, 34206, 34210, 34214, 34219, 8594,
- 34223, 34227, 34231, 13623, 34236, 34240, 34245, 34250, 34255, 34259,
- 34266, 24098, 34272, 34275, 34279, 34284, 34290, 34294, 34302, 34308,
- 34313, 34317, 34323, 34327, 34331, 3404, 3409, 27144, 34334, 34342,
- 34349, 34353, 34360, 34365, 333, 34370, 34374, 34380, 34392, 34398,
- 34404, 34408, 34414, 34423, 34427, 34431, 34436, 34441, 34446, 34450,
- 34454, 34461, 34467, 34472, 34487, 34502, 34517, 34533, 34551, 8544,
- 34565, 34572, 34576, 34579, 34588, 34593, 34597, 34605, 31628, 34613,
- 34617, 34627, 27114, 34638, 34642, 34651, 34659, 8152, 13163, 34663,
- 34666, 34669, 6557, 3802, 34674, 34682, 34686, 34689, 34693, 34698,
- 34703, 34709, 34715, 34720, 34724, 23946, 34728, 34732, 34738, 34742,
- 7446, 34751, 34758, 34762, 10210, 34769, 34775, 34780, 34787, 34794,
- 34801, 26480, 6480, 34808, 34815, 34822, 34828, 34833, 34840, 34851,
- 34857, 34862, 34867, 34874, 34878, 34882, 34892, 34903, 34909, 34914,
- 34919, 34924, 34929, 34934, 34938, 34942, 34948, 34956, 2273, 828, 8616,
- 8621, 8627, 34965, 8632, 8637, 8643, 34970, 34980, 34984, 8648, 34989,
- 34992, 34997, 35001, 35006, 35011, 35018, 35025, 35033, 8557, 35040,
- 35043, 35049, 35059, 4407, 35068, 35072, 35080, 35084, 35094, 35100,
- 35111, 35117, 35123, 35128, 35134, 35140, 35146, 35151, 35154, 35161,
- 35167, 35172, 35179, 35186, 35190, 35200, 35213, 35222, 35231, 35242,
- 35255, 35266, 35275, 35286, 35291, 35300, 35305, 8653, 35311, 35318,
- 35326, 35331, 35335, 35342, 35349, 3757, 21, 35353, 35358, 14958, 35362,
- 35365, 35368, 26001, 35372, 26489, 35380, 35384, 35388, 35391, 35397,
- 35403, 35411, 35417, 35424, 25993, 35428, 26178, 35432, 35441, 35447,
- 35453, 35458, 35462, 35468, 35472, 35475, 35483, 35491, 24156, 35497,
- 35504, 35510, 35515, 35520, 35524, 35530, 35535, 35541, 3973, 755, 35548,
- 35552, 35555, 13513, 35567, 33527, 35578, 35581, 35588, 35594, 35598,
- 35604, 35609, 35615, 35620, 35625, 35629, 35633, 35638, 35643, 35653,
- 35659, 35672, 35678, 35685, 35690, 35696, 35701, 14844, 1435, 1002,
- 28974, 28980, 35706, 28986, 28999, 29005, 29011, 35712, 29017, 29023,
- 35718, 35724, 14, 35732, 35739, 35743, 35747, 35755, 29737, 35759, 35763,
- 35770, 35775, 35779, 35784, 35790, 35795, 35801, 35806, 35810, 35814,
- 35818, 35823, 35827, 35832, 35836, 35843, 35848, 35852, 35857, 35861,
- 35866, 35870, 35875, 35881, 13733, 13738, 35886, 35890, 35893, 35897,
- 35902, 35906, 35912, 35919, 35924, 35934, 35939, 35947, 35951, 35954,
- 29752, 35958, 4026, 35963, 35968, 35972, 35977, 35981, 35986, 11687,
- 35997, 36001, 36004, 36009, 36013, 36017, 36020, 36024, 6576, 11703,
- 36027, 36030, 36035, 36039, 36048, 36064, 36080, 36090, 25900, 36097,
- 36101, 36106, 36111, 36115, 36119, 33644, 36125, 36130, 36134, 36141,
- 36146, 36150, 36154, 24958, 36160, 19603, 36165, 36172, 36180, 36186,
- 36193, 36201, 36207, 36211, 36217, 36225, 36229, 36238, 7876, 36246,
- 36250, 36258, 36265, 36270, 36275, 36279, 36282, 36286, 36289, 36293,
- 36300, 36305, 36311, 24377, 29034, 36315, 36322, 36328, 36334, 36339,
- 36342, 36344, 36351, 36358, 36364, 36368, 36371, 36375, 36379, 36383,
- 36388, 36392, 36396, 36399, 36403, 36417, 21146, 36436, 36449, 36462,
- 36475, 21164, 36490, 8846, 36505, 36511, 36515, 36519, 36526, 36531,
- 36535, 36542, 36548, 36553, 36559, 36569, 36581, 36592, 36597, 36604,
- 36608, 36612, 36615, 14129, 3605, 36623, 13760, 36636, 36643, 36647,
- 36651, 36656, 36661, 36667, 36671, 36675, 36678, 6188, 13771, 36683,
- 36687, 36693, 36702, 36707, 33504, 36713, 36718, 36722, 36727, 36734,
- 36738, 36741, 12824, 36746, 36753, 1009, 36757, 36762, 36767, 36773,
- 36778, 36783, 36787, 36797, 36802, 36808, 36813, 36819, 36824, 36830,
- 36840, 36845, 36850, 36854, 5683, 5695, 36859, 36862, 36869, 36875,
- 31793, 31800, 36884, 36888, 29800, 36896, 36907, 36915, 33692, 36922,
- 36927, 36932, 36943, 36950, 36961, 29824, 19609, 36969, 722, 36974,
- 36980, 25984, 36986, 36991, 37001, 37010, 37017, 37023, 37027, 37030,
- 37037, 37043, 37050, 37056, 37066, 37074, 37080, 37086, 37091, 37095,
- 37102, 37108, 37115, 36384, 530, 12112, 37121, 37126, 37129, 37135,
- 37143, 1364, 37148, 37152, 37157, 37164, 37170, 37174, 37179, 37188,
- 37195, 37205, 37211, 26019, 37228, 37237, 37245, 37251, 37256, 37263,
- 37269, 37277, 37286, 37294, 37298, 37303, 37311, 29833, 37317, 37336,
- 14062, 37350, 37366, 37380, 37386, 37391, 37396, 37401, 37407, 29839,
- 37412, 37419, 37424, 37428, 341, 2878, 37435, 37440, 37445, 25275, 37266,
- 37449, 37454, 37462, 37466, 37469, 37475, 37479, 26074, 37482, 37487,
- 37491, 37494, 37499, 37503, 37508, 37513, 37517, 37522, 37526, 37530,
- 19346, 19357, 37534, 37539, 37545, 24915, 37550, 37554, 19425, 14280,
- 37557, 37562, 37567, 37572, 37577, 37582, 37587, 37592, 440, 43, 29052,
- 29057, 29062, 29068, 29073, 29078, 37597, 29082, 37601, 37605, 29087,
- 29093, 37609, 29104, 29109, 37617, 37622, 29115, 37627, 37632, 37637,
- 37642, 37648, 37654, 37660, 29132, 37673, 37679, 29136, 37683, 29141,
- 37688, 29146, 29151, 37691, 37696, 37700, 28795, 37706, 11911, 37713,
- 37718, 29156, 37722, 37727, 37732, 37737, 37741, 37746, 37751, 37757,
- 37762, 37767, 37773, 37779, 37784, 37788, 37793, 37798, 37803, 37807,
- 37812, 37817, 37822, 37828, 37834, 37840, 37845, 37849, 37854, 37858,
- 29160, 29165, 29170, 37862, 37866, 29175, 29181, 29187, 29199, 37878,
- 23983, 37882, 37886, 37891, 37896, 37901, 37905, 37909, 37919, 37924,
- 37929, 37933, 37937, 37940, 37948, 29247, 37953, 1442, 37959, 37967,
- 37976, 37980, 37988, 37994, 38002, 38018, 38023, 38038, 29284, 1712,
- 10375, 38042, 2924, 38054, 38055, 38063, 38070, 38075, 38082, 38087,
- 7746, 1090, 8675, 38094, 38099, 38102, 38105, 38114, 1275, 38119, 36532,
- 38126, 38131, 20583, 2511, 38135, 9094, 38145, 38151, 2291, 2301, 38160,
- 38169, 38179, 38190, 3235, 31944, 8727, 3735, 14882, 1280, 38195, 38203,
- 38210, 38215, 38219, 38223, 21930, 8754, 38231, 38240, 38249, 38257,
- 38264, 38269, 38282, 38295, 38307, 38319, 38331, 38344, 38355, 38366,
- 38376, 38384, 38392, 38404, 38416, 38427, 38436, 38444, 38451, 38463,
- 38470, 38479, 38486, 38499, 38504, 38514, 38519, 38525, 38530, 34759,
- 38534, 38541, 38545, 38552, 38560, 2472, 38567, 38578, 38588, 38597,
- 38605, 38615, 38623, 38633, 38642, 38647, 38653, 38659, 38670, 38680,
- 38689, 38698, 38708, 38716, 38725, 38730, 38735, 38740, 1668, 37, 38748,
- 38756, 38767, 38778, 14563, 38788, 38795, 38801, 38806, 38810, 38821,
- 38831, 38840, 38851, 14931, 14936, 38856, 38865, 38870, 38880, 38885,
- 38893, 38901, 38908, 38914, 5536, 1038, 38918, 38924, 38929, 38932, 2075,
- 36648, 38940, 38944, 38947, 1475, 38953, 12261, 1285, 38958, 38971,
- 38985, 2597, 39003, 39015, 39027, 2611, 2628, 39041, 39054, 2643, 39068,
- 39080, 2658, 39094, 1291, 1297, 1303, 9012, 39099, 39104, 39109, 39113,
- 39128, 39143, 39158, 39173, 39188, 39203, 39218, 39233, 39248, 39263,
- 39278, 39293, 39308, 39323, 39338, 39353, 39368, 39383, 39398, 39413,
- 39428, 39443, 39458, 39473, 39488, 39503, 39518, 39533, 39548, 39563,
- 39578, 39593, 39608, 39623, 39638, 39653, 39668, 39683, 39698, 39713,
- 39728, 39743, 39758, 39773, 39788, 39803, 39818, 39833, 39848, 39863,
- 39878, 39893, 39908, 39923, 39938, 39953, 39968, 39983, 39998, 40013,
- 40028, 40043, 40058, 40073, 40088, 40103, 40118, 40133, 40148, 40163,
- 40178, 40193, 40208, 40223, 40238, 40253, 40268, 40283, 40298, 40313,
- 40328, 40343, 40358, 40373, 40388, 40403, 40418, 40433, 40448, 40463,
- 40478, 40493, 40508, 40523, 40538, 40553, 40568, 40583, 40598, 40613,
- 40628, 40643, 40658, 40673, 40688, 40703, 40718, 40733, 40748, 40763,
- 40778, 40793, 40808, 40823, 40838, 40853, 40868, 40883, 40898, 40913,
- 40928, 40943, 40958, 40973, 40988, 41003, 41018, 41033, 41048, 41063,
- 41078, 41093, 41108, 41123, 41138, 41153, 41168, 41183, 41198, 41213,
- 41228, 41243, 41258, 41273, 41288, 41303, 41318, 41333, 41348, 41363,
- 41378, 41393, 41408, 41423, 41438, 41453, 41468, 41483, 41498, 41513,
- 41528, 41543, 41558, 41573, 41588, 41603, 41618, 41633, 41648, 41663,
- 41678, 41693, 41708, 41723, 41738, 41753, 41768, 41783, 41798, 41813,
- 41828, 41843, 41858, 41873, 41888, 41903, 41918, 41933, 41948, 41963,
- 41978, 41993, 42008, 42023, 42038, 42053, 42068, 42083, 42098, 42113,
- 42128, 42143, 42158, 42173, 42188, 42203, 42218, 42233, 42248, 42263,
- 42278, 42293, 42308, 42323, 42338, 42353, 42368, 42383, 42398, 42413,
- 42428, 42443, 42458, 42473, 42488, 42503, 42518, 42533, 42548, 42563,
- 42578, 42593, 42608, 42623, 42638, 42653, 42668, 42683, 42698, 42713,
- 42728, 42743, 42758, 42773, 42788, 42803, 42818, 42833, 42848, 42863,
- 42878, 42893, 42908, 42923, 42938, 42953, 42968, 42983, 42998, 43013,
- 43028, 43043, 43058, 43073, 43088, 43103, 43118, 43133, 43148, 43163,
- 43178, 43193, 43208, 43223, 43238, 43253, 43268, 43283, 43298, 43313,
- 43328, 43343, 43358, 43373, 43388, 43403, 43418, 43433, 43448, 43463,
- 43478, 43493, 43508, 43523, 43538, 43553, 43568, 43583, 43598, 43613,
- 43628, 43643, 43658, 43673, 43688, 43703, 43718, 43733, 43748, 43763,
- 43778, 43793, 43808, 43823, 43838, 43853, 43868, 43883, 43898, 43913,
- 43928, 43943, 43958, 43973, 43988, 44003, 44018, 44033, 44048, 44063,
- 44078, 44093, 44108, 44123, 44138, 44153, 44168, 44183, 44198, 44213,
- 44228, 44243, 44258, 44273, 44288, 44303, 44318, 44333, 44348, 44363,
- 44378, 44393, 44408, 44423, 44438, 44453, 44468, 44483, 44498, 44513,
- 44528, 44543, 44558, 44573, 44588, 44603, 44618, 44633, 44648, 44663,
- 44678, 44693, 44708, 44723, 44738, 44753, 44768, 44783, 44798, 44813,
- 44828, 44843, 44858, 44873, 44888, 44903, 44918, 44933, 44948, 44963,
- 44978, 44993, 45008, 45023, 45038, 45053, 45068, 45083, 45098, 45113,
- 45128, 45143, 45158, 45173, 45188, 45203, 45218, 45233, 45248, 45263,
- 45278, 45293, 45308, 45323, 45338, 45353, 45368, 45383, 45398, 45413,
- 45428, 45443, 45458, 45473, 45488, 45503, 45518, 45533, 45548, 45563,
- 45578, 45593, 45608, 45623, 45638, 45653, 45668, 45683, 45698, 45713,
- 45728, 45743, 45758, 45773, 45788, 45803, 45818, 45833, 45848, 45863,
- 45878, 45893, 45908, 45923, 45938, 45953, 45968, 45983, 45998, 46013,
- 46028, 46043, 46058, 46073, 46088, 46103, 46118, 46133, 46148, 46163,
- 46178, 46193, 46208, 46223, 46238, 46253, 46268, 46283, 46298, 46313,
- 46328, 46343, 46358, 46373, 46388, 46403, 46418, 46433, 46448, 46463,
- 46478, 46493, 46508, 46523, 46538, 46553, 46568, 46583, 46598, 46613,
- 46628, 46643, 46658, 46673, 46688, 46703, 46718, 46733, 46748, 46763,
- 46778, 46793, 46808, 46823, 46838, 46853, 46868, 46883, 46899, 46915,
- 46931, 46947, 46963, 46979, 46995, 47011, 47027, 47043, 47059, 47075,
- 47091, 47107, 47123, 47139, 47155, 47171, 47187, 47203, 47219, 47235,
- 47251, 47267, 47283, 47299, 47315, 47331, 47347, 47363, 47379, 47395,
- 47411, 47427, 47443, 47459, 47475, 47491, 47507, 47523, 47539, 47555,
- 47571, 47587, 47603, 47619, 47635, 47651, 47667, 47683, 47699, 47715,
- 47731, 47747, 47763, 47779, 47795, 47811, 47827, 47843, 47859, 47875,
- 47891, 47907, 47923, 47939, 47955, 47971, 47987, 48003, 48019, 48035,
- 48051, 48067, 48083, 48099, 48115, 48131, 48147, 48163, 48179, 48195,
- 48211, 48227, 48243, 48259, 48275, 48291, 48307, 48323, 48339, 48355,
- 48371, 48387, 48403, 48419, 48435, 48451, 48467, 48483, 48499, 48515,
- 48531, 48547, 48563, 48579, 48595, 48611, 48627, 48643, 48659, 48675,
- 48691, 48707, 48723, 48739, 48755, 48771, 48787, 48803, 48819, 48835,
- 48851, 48867, 48883, 48899, 48915, 48931, 48947, 48963, 48979, 48995,
- 49011, 49027, 49043, 49059, 49075, 49091, 49107, 49123, 49139, 49155,
- 49171, 49187, 49203, 49219, 49235, 49251, 49267, 49283, 49299, 49315,
- 49331, 49347, 49363, 49379, 49395, 49411, 49427, 49443, 49459, 49475,
- 49491, 49507, 49523, 49539, 49555, 49571, 49587, 49603, 49619, 49635,
- 49651, 49667, 49683, 49699, 49715, 49731, 49747, 49763, 49779, 49795,
- 49811, 49827, 49843, 49859, 49875, 49891, 49907, 49923, 49939, 49955,
- 49971, 49987, 50003, 50019, 50035, 50051, 50067, 50083, 50099, 50115,
- 50131, 50147, 50163, 50179, 50195, 50211, 50227, 50243, 50259, 50275,
- 50291, 50307, 50323, 50339, 50355, 50371, 50387, 50403, 50419, 50435,
- 50451, 50467, 50483, 50499, 50515, 50531, 50547, 50563, 50579, 50595,
- 50611, 50627, 50643, 50659, 50675, 50691, 50707, 50723, 50739, 50755,
- 50771, 50787, 50803, 50819, 50835, 50851, 50867, 50883, 50899, 50915,
- 50931, 50947, 50963, 50979, 50995, 51011, 51027, 51043, 51059, 51075,
- 51091, 51107, 51123, 51139, 51155, 51171, 51187, 51203, 51219, 51235,
- 51251, 51267, 51283, 51299, 51315, 51331, 51347, 51363, 51379, 51395,
- 51411, 51427, 51443, 51459, 51475, 51491, 51507, 51523, 51539, 51555,
- 51571, 51587, 51603, 51619, 51635, 51651, 51667, 51683, 51699, 51715,
- 51731, 51747, 51763, 51779, 51795, 51811, 51827, 51843, 51859, 51875,
- 51891, 51907, 51923, 51939, 51955, 51971, 51987, 52003, 52019, 52035,
- 52051, 52067, 52083, 52099, 52115, 52131, 52147, 52163, 52179, 52195,
- 52211, 52227, 52243, 52259, 52275, 52291, 52307, 52323, 52339, 52355,
- 52371, 52387, 52403, 52419, 52435, 52451, 52467, 52483, 52499, 52515,
- 52531, 52547, 52563, 52579, 52595, 52611, 52627, 52643, 52659, 52675,
- 52691, 52707, 52723, 52739, 52755, 52771, 52787, 52803, 52819, 52835,
- 52851, 52867, 52883, 52899, 52915, 52931, 52947, 52963, 52979, 52995,
- 53011, 53027, 53043, 53059, 53075, 53091, 53107, 53123, 53139, 53155,
- 53171, 53187, 53203, 53219, 53235, 53251, 53267, 53283, 53299, 53315,
- 53331, 53347, 53363, 53379, 53395, 53411, 53427, 53443, 53459, 53475,
- 53491, 53507, 53523, 53539, 53555, 53571, 53587, 53603, 53619, 53635,
- 53651, 53667, 53683, 53699, 53715, 53731, 53747, 53763, 53779, 53795,
- 53811, 53827, 53843, 53859, 53875, 53891, 53907, 53923, 53939, 53955,
- 53971, 53987, 54003, 54019, 54035, 54051, 54067, 54083, 54099, 54115,
- 54131, 54147, 54163, 54179, 54195, 54211, 54227, 54243, 54259, 54275,
- 54291, 54307, 54323, 54339, 54355, 54371, 54387, 54403, 54419, 54435,
- 54451, 54467, 54483, 54499, 54515, 54531, 54547, 54563, 54579, 54595,
- 54611, 54627, 54643, 54659, 54675, 54691, 54707, 54723, 54739, 54755,
- 54771, 54787, 54803, 54819, 54835, 54851, 54867, 54883, 54899, 54915,
- 54931, 54947, 54963, 54979, 54995, 55011, 55027, 55043, 55059, 55075,
- 55091, 55107, 55123, 55139, 55155, 55171, 55187, 55203, 55219, 55235,
- 55251, 55267, 55283, 55299, 55315, 55331, 55347, 55363, 55379, 55395,
- 55411, 55427, 55443, 55459, 55475, 55491, 55507, 55523, 55539, 55555,
- 55570, 14963, 55579, 55585, 55591, 55601, 55609, 13144, 13683, 8319,
- 55622, 1483, 55630, 25385, 5637, 55636, 55641, 55646, 55651, 55656,
- 55662, 55667, 55673, 55678, 55684, 55689, 55694, 55699, 55704, 55710,
- 55715, 55720, 55725, 55730, 55735, 55740, 55745, 55751, 55756, 55762,
- 55769, 2515, 55774, 55780, 6948, 55784, 55789, 55796, 55804, 40, 55808,
- 55814, 55819, 55824, 55828, 55833, 55837, 55841, 9037, 55845, 55855,
- 55868, 55879, 55892, 55899, 55905, 55910, 55916, 55922, 55928, 55933,
- 55938, 55943, 55948, 55952, 55957, 55962, 55967, 55973, 55979, 55985,
- 55990, 55994, 55999, 56004, 56008, 56013, 56018, 56023, 56027, 9053,
- 9064, 9069, 1526, 56031, 1531, 56037, 56040, 1562, 56046, 1568, 1574,
- 9099, 56051, 56059, 56066, 56070, 56076, 56081, 28824, 56086, 56093,
- 56098, 56102, 56106, 1579, 14538, 14549, 56115, 56122, 56127, 56131,
- 14568, 1583, 34897, 56134, 56139, 56149, 56158, 56163, 56167, 56173,
- 1588, 36719, 56178, 56187, 56193, 56198, 9249, 9255, 56204, 56216, 56233,
- 56250, 56267, 56284, 56301, 56318, 56335, 56352, 56369, 56386, 56403,
- 56420, 56437, 56454, 56471, 56488, 56505, 56522, 56539, 56556, 56573,
- 56590, 56607, 56624, 56641, 56658, 56675, 56692, 56709, 56726, 56743,
- 56760, 56777, 56794, 56811, 56828, 56845, 56862, 56879, 56896, 56913,
- 56930, 56947, 56964, 56981, 56998, 57015, 57032, 57049, 57060, 57065,
- 1593, 57069, 57075, 57080, 7693, 1598, 57085, 57094, 25664, 57099, 57110,
- 57120, 57125, 57132, 57138, 57143, 57148, 14820, 57152, 9266, 1603, 9271,
- 57158, 57163, 57169, 57174, 57179, 57184, 57189, 57194, 57199, 57204,
- 57210, 57216, 57222, 57227, 57231, 57236, 57241, 57245, 57250, 57255,
- 57260, 57264, 57269, 57275, 57280, 57285, 57289, 57294, 57299, 57305,
- 57310, 57315, 57321, 57327, 57332, 57336, 57341, 57346, 57351, 57355,
- 57360, 57365, 57370, 57376, 57382, 57387, 57391, 57395, 57400, 57405,
- 57410, 27024, 57414, 57419, 57424, 57430, 57435, 57440, 57444, 57449,
- 57454, 57460, 57465, 57470, 57476, 57482, 57487, 57491, 57496, 57501,
- 57505, 57510, 57515, 57520, 57526, 57532, 57537, 57541, 57546, 57551,
- 57555, 57560, 57565, 57570, 57574, 57577, 29395, 57582, 57590, 14886,
- 14910, 9362, 57596, 57606, 57621, 9367, 57632, 57637, 57648, 57660,
- 57672, 57684, 2649, 57696, 57701, 57705, 57711, 57717, 57722, 1615, 1010,
- 57731, 57736, 36758, 57740, 57744, 57749, 57753, 14971, 57758, 57761,
- 57769, 57777, 1619, 9392, 9398, 1624, 57785, 57792, 57797, 57806, 57816,
- 57823, 57828, 1629, 57835, 57840, 15086, 57844, 57849, 57856, 57862,
- 57866, 57877, 57887, 15108, 7616, 7623, 1634, 57894, 57900, 57908, 57915,
- 57921, 57928, 57940, 57946, 57951, 57963, 57974, 57983, 57993, 3668,
- 28660, 28669, 15148, 1639, 1643, 58001, 58012, 58017, 1646, 58025, 58030,
- 58042, 58048, 58053, 58061, 1651, 58066, 58071, 58079, 58087, 58094,
- 58103, 58111, 58120, 1656, 58124, 1661, 58129, 58136, 15268, 58144,
- 58150, 58155, 58163, 58170, 58178, 20658, 58183, 9527, 58192, 58198,
- 58205, 58212, 58218, 58228, 58234, 58239, 58244, 58252, 9536, 9541,
- 58260, 58266, 58274, 3733, 36846, 58279, 58285, 58290, 58298, 58305,
- 10356, 58310, 58316, 1672, 58321, 58324, 1058, 58330, 58335, 58340,
- 58346, 58351, 58356, 58361, 58366, 58371, 58376, 1681, 9, 58382, 58386,
- 58391, 58395, 58399, 58403, 29643, 58408, 58413, 58418, 58422, 58425,
- 58429, 58433, 58438, 58442, 58447, 58451, 32315, 32320, 32325, 58454,
- 58461, 58467, 36585, 58477, 32331, 29891, 29653, 29659, 32347, 29665,
- 58482, 58487, 29924, 58491, 58494, 58498, 58505, 58508, 58513, 58517,
- 58521, 58524, 58534, 58546, 58553, 31282, 58556, 13936, 821, 58559,
- 58563, 58568, 58572, 58575, 11944, 58582, 58589, 58602, 58610, 58619,
- 58624, 58634, 58647, 58659, 58666, 58671, 58680, 58693, 33732, 58711,
- 58716, 58723, 58729, 58734, 58742, 58749, 25224, 613, 58755, 58761,
- 58771, 58777, 58782, 29683, 4481, 29697, 58786, 58796, 58801, 58811,
- 58826, 58832, 58838, 29707, 58843, 28856, 58847, 58852, 58857, 58861,
- 58866, 15151, 58873, 58878, 58882, 4522, 29733, 58886, 58892, 327, 58902,
- 58909, 58916, 58921, 58930, 56143, 58936, 58944, 58948, 58952, 58956,
- 58960, 58965, 58969, 58975, 58983, 58988, 58993, 58997, 59002, 59006,
- 59010, 59016, 59022, 59027, 59031, 29857, 59036, 29863, 29869, 59041,
- 59047, 59054, 59059, 59063, 28873, 14813, 59066, 59070, 59075, 59082,
- 59088, 59092, 59097, 36295, 59103, 59107, 59111, 59116, 59122, 59128,
- 59140, 59149, 59159, 59165, 59172, 59177, 59182, 59186, 59189, 59195,
- 59202, 59207, 59212, 59219, 59226, 59232, 59237, 59242, 59250, 59255,
- 2377, 59259, 59264, 59270, 59275, 59281, 59286, 59291, 59296, 59302,
- 29890, 59307, 59313, 59319, 59325, 29954, 59330, 59335, 59340, 29965,
- 59345, 59350, 59355, 59361, 59367, 29970, 59372, 59377, 59382, 30025,
- 30031, 59387, 59392, 30036, 59397, 25891, 30058, 30062, 59402, 59378,
- 59406, 59414, 59420, 59428, 59435, 59441, 59451, 59457, 59464, 8984,
- 30076, 59470, 59483, 59492, 59498, 59507, 59513, 21575, 59520, 59527,
- 59537, 30026, 59540, 59547, 59552, 59556, 59560, 59565, 4598, 59569,
- 59574, 59579, 32409, 32414, 59583, 32428, 59588, 32433, 59593, 59599,
- 32445, 32451, 32457, 59604, 59610, 20619, 59621, 59624, 59636, 59644,
- 30094, 59648, 59657, 59667, 59676, 30099, 59681, 59688, 59697, 59703,
- 59711, 59718, 4573, 4310, 59723, 30037, 59729, 59732, 59738, 59745,
- 59750, 59755, 21502, 59759, 59765, 59771, 59776, 59781, 59785, 59791,
- 59797, 31196, 826, 33406, 34304, 34310, 59802, 59806, 59810, 59813,
- 59826, 59832, 59836, 59839, 59844, 31495, 59848, 28878, 19446, 59854,
- 4502, 4510, 7472, 59857, 59862, 59867, 59872, 59877, 59882, 59887, 59892,
- 59897, 59902, 59908, 59913, 59918, 59924, 59929, 59934, 59939, 59944,
- 59949, 59954, 59960, 59965, 59971, 59976, 59981, 59986, 59991, 59996,
- 60001, 60006, 60011, 60016, 60021, 60027, 60032, 60037, 60042, 60047,
- 60052, 60057, 60063, 60068, 60073, 60078, 60083, 60088, 60093, 60098,
- 60103, 60108, 60114, 60119, 60124, 60129, 60134, 60140, 60146, 60151,
- 60157, 60162, 60167, 60172, 60177, 60182, 1476, 240, 60187, 60191, 60195,
- 60199, 23157, 60203, 60207, 60212, 60216, 60221, 60225, 60229, 60233,
- 60238, 60242, 11681, 60247, 60251, 60258, 13444, 60267, 60276, 60280,
- 60285, 60290, 60294, 22960, 2957, 60298, 60304, 60313, 60321, 60327,
- 60339, 60351, 60355, 60360, 60364, 60370, 60376, 60381, 60391, 60401,
- 60407, 60412, 60416, 60421, 60427, 60436, 60445, 60453, 13798, 60457,
- 60466, 60474, 60486, 60497, 60508, 60517, 60521, 60530, 60540, 60546,
- 60551, 60557, 60562, 98, 28772, 60573, 24228, 24238, 60579, 60586, 60592,
- 60596, 60606, 60617, 60625, 60634, 60639, 60644, 60648, 15504, 60656,
- 60660, 60666, 60676, 60683, 60689, 32508, 1162, 60695, 60698, 60702,
- 60712, 60718, 60725, 11618, 60732, 60738, 60747, 60756, 60762, 60768,
- 60774, 60779, 60786, 60793, 60799, 60812, 60821, 60830, 60835, 60839,
- 60845, 60852, 60859, 60866, 60873, 60880, 60885, 60889, 60893, 60896,
- 60906, 60910, 60922, 60931, 60935, 60940, 60944, 60950, 60955, 60962,
- 60971, 60979, 60987, 60992, 60996, 61001, 61006, 61016, 61024, 61029,
- 61033, 61037, 61043, 61055, 61063, 61073, 61080, 61086, 61091, 61095,
- 61099, 61103, 61112, 61121, 61130, 61136, 61142, 61148, 61153, 61160,
- 61166, 61174, 61181, 10772, 61187, 61193, 61197, 12523, 61201, 61206,
- 61216, 61225, 61231, 61237, 61245, 61252, 61256, 61260, 61266, 61274,
- 61281, 61287, 61298, 61302, 61306, 61310, 61313, 61319, 61324, 61328,
- 61332, 61341, 61349, 61356, 61362, 61369, 22087, 36337, 61374, 61382,
- 61386, 61389, 61397, 61404, 61410, 61419, 61427, 61433, 61438, 61442,
- 61447, 61451, 61455, 61460, 61469, 61473, 61480, 61487, 61493, 61501,
- 61507, 61518, 61526, 61532, 20753, 61541, 61548, 61555, 61562, 61569,
- 61576, 39288, 11456, 61583, 61590, 61595, 32544, 37484, 61601, 61606,
- 61611, 61617, 61623, 61629, 61634, 61639, 61644, 61649, 61655, 61660,
- 61666, 61671, 61677, 61682, 61687, 61692, 61697, 61702, 61707, 61712,
- 61718, 61723, 61729, 61734, 61739, 61744, 61749, 61754, 61759, 61765,
- 61770, 61775, 61780, 61785, 61790, 61795, 61800, 61805, 61810, 61815,
- 61821, 61826, 61831, 61836, 61841, 61846, 61851, 61856, 61861, 61867,
- 61872, 61877, 61882, 61887, 61892, 61897, 61902, 61907, 61912, 61917,
- 61922, 61927, 61933, 1797, 224, 34993, 61938, 61941, 61946, 61950, 61953,
- 61958, 60983, 61969, 61979, 61986, 62002, 62011, 62021, 62031, 62039,
- 62047, 62051, 62054, 62061, 62067, 62078, 62090, 62101, 62110, 62117,
- 1286, 21391, 62127, 2544, 62131, 62140, 1127, 15477, 35622, 62148, 62156,
- 62170, 62183, 62187, 62192, 62197, 62202, 62208, 62214, 62219, 6957,
- 62224, 62232, 9393, 62237, 62243, 1684, 9405, 723, 62252, 62261, 62271,
- 24992, 62280, 62286, 15063, 62292, 62296, 3881, 9736, 62302, 58007,
- 62309, 3905, 184, 12444, 62315, 62327, 62331, 62337, 25684, 62341, 9724,
- 2684, 4, 62346, 62356, 62362, 62373, 62380, 62386, 62392, 62400, 62407,
- 62413, 62423, 62433, 62443, 1298, 62452, 62458, 2707, 2713, 6954, 2218,
- 62462, 62466, 62475, 62483, 62494, 62502, 62510, 62516, 62521, 62532,
- 62543, 62551, 62557, 8061, 62562, 62570, 62574, 62578, 62590, 26060,
- 62597, 62607, 62613, 62619, 8163, 62629, 62640, 62650, 62659, 62663,
- 62670, 1129, 2537, 62680, 62685, 62693, 62701, 62712, 62719, 62733,
- 12369, 379, 62743, 62747, 62756, 62764, 62770, 62784, 62791, 62797,
- 62806, 62813, 62823, 62831, 3740, 189, 62839, 62850, 62854, 62866, 25882,
- 156, 62872, 62877, 62881, 62888, 62894, 62902, 62909, 7226, 62916, 62925,
- 62933, 3806, 62946, 15109, 62950, 2752, 428, 62955, 62968, 62973, 1796,
- 647, 62977, 3812, 62985, 62991, 963, 63001, 63010, 63015, 13178, 13185,
- 42620, 63019, 3750, 11350, 63027, 63034, 21618, 63038, 63045, 63051,
- 63056, 63061, 13198, 354, 63066, 63078, 63084, 63092, 2764, 1716, 63100,
- 63102, 63107, 63112, 63117, 63123, 63128, 63133, 63138, 63143, 63148,
- 63153, 63159, 63164, 63169, 63174, 63179, 63184, 63189, 63194, 63199,
- 63205, 63210, 63215, 63220, 63226, 63231, 63237, 63242, 63247, 63252,
- 63257, 63262, 63267, 63272, 63278, 63283, 63289, 63294, 63299, 63304,
- 63309, 63314, 63319, 63324, 63329, 63335, 63340, 63345, 63349, 63353,
- 63358, 63362, 63367, 63372, 63378, 63383, 63387, 63392, 63396, 63399,
- 63401, 63405, 63408, 63413, 63417, 63421, 63425, 63429, 63438, 63442,
- 30288, 63445, 30293, 63452, 63457, 30298, 63466, 63475, 30304, 63480,
- 30309, 63489, 63494, 9914, 63498, 63503, 63508, 30314, 63512, 37650,
- 63516, 63519, 63523, 6638, 63529, 63534, 63538, 3633, 30319, 63541,
- 63545, 63548, 63553, 63557, 63563, 63571, 63584, 63593, 63599, 63604,
- 63610, 63614, 63620, 63628, 63633, 63640, 63646, 63654, 63663, 63671,
- 30322, 63678, 63688, 63697, 63710, 63715, 63720, 63729, 63735, 63742,
- 63753, 63765, 63772, 63781, 63790, 63799, 63806, 63812, 63819, 63827,
- 63834, 63842, 63851, 63859, 63866, 63874, 63883, 63891, 63900, 63910,
- 63919, 63927, 63934, 63942, 63951, 63959, 63968, 63978, 63987, 63995,
- 64004, 64014, 64023, 64033, 64044, 64054, 64063, 64071, 64078, 64086,
- 64095, 64103, 64112, 64122, 64131, 64139, 64148, 64158, 64167, 64177,
- 64188, 64198, 64207, 64215, 64224, 64234, 64243, 64253, 64264, 64274,
- 64283, 64293, 64304, 64314, 64325, 64337, 64348, 64358, 64367, 64375,
- 64382, 64390, 64399, 64407, 64416, 64426, 64435, 64443, 64452, 64462,
- 64471, 64481, 64492, 64502, 64511, 64519, 64528, 64538, 64547, 64557,
- 64568, 64578, 64587, 64597, 64608, 64618, 64629, 64641, 64652, 64662,
- 64671, 64679, 64688, 64698, 64707, 64717, 64728, 64738, 64747, 64757,
- 64768, 64778, 64789, 64801, 64812, 64822, 64831, 64841, 64852, 64862,
- 64873, 64885, 64896, 64906, 64917, 64929, 64940, 64952, 64965, 64977,
- 64988, 64998, 65007, 65015, 65022, 65030, 65039, 65047, 65056, 65066,
- 65075, 65083, 65092, 65102, 65111, 65121, 65132, 65142, 65151, 65159,
- 65168, 65178, 65187, 65197, 65208, 65218, 65227, 65237, 65248, 65258,
- 65269, 65281, 65292, 65302, 65311, 65319, 65328, 65338, 65347, 65357,
- 65368, 65378, 65387, 65397, 65408, 65418, 65429, 65441, 65452, 65462,
- 65471, 65481, 65492, 65502, 65513, 65525, 65536, 65546, 65557, 65569,
- 65580, 65592, 65605, 65617, 65628, 65638, 65647, 65655, 65664, 65674,
- 65683, 65693, 65704, 65714, 65723, 65733, 65744, 65754, 65765, 65777,
- 65788, 65798, 65807, 65817, 65828, 65838, 65849, 65861, 65872, 65882,
- 65893, 65905, 65916, 65928, 65941, 65953, 65964, 65974, 65983, 65993,
- 66004, 66014, 66025, 66037, 66048, 66058, 66069, 66081, 66092, 66104,
- 66117, 66129, 66140, 66150, 66161, 66173, 66184, 66196, 66209, 66221,
- 66232, 66244, 66257, 66269, 66282, 66296, 66309, 66321, 66332, 66342,
- 66351, 66359, 66366, 66371, 6489, 66378, 30332, 66383, 66388, 30337,
- 66394, 19100, 30342, 66399, 66405, 66413, 66419, 66425, 66432, 66439,
- 66444, 66448, 66451, 66455, 66464, 66470, 66482, 66493, 66497, 3019,
- 6464, 66502, 66505, 66507, 66511, 66515, 66519, 23927, 66524, 66528,
- 66531, 66536, 66540, 66547, 66553, 66557, 66561, 66564, 30359, 66569,
- 66576, 66585, 66593, 66604, 66612, 66620, 66627, 66634, 66640, 66651,
- 30364, 66656, 66667, 66679, 66687, 66698, 66707, 66718, 66723, 66731,
- 2510, 66736, 32002, 66749, 66753, 66765, 66773, 66778, 66786, 15664,
- 66797, 66803, 66810, 66818, 66824, 30374, 66829, 3831, 55605, 66836,
- 66839, 66847, 66860, 66873, 66886, 66899, 66906, 66917, 66926, 39105,
- 39110, 66931, 66935, 66943, 66950, 66959, 66967, 66973, 66982, 66990,
- 66998, 67002, 67011, 67020, 67030, 67043, 67056, 67066, 30379, 67072,
- 67079, 67085, 30385, 67090, 67093, 67097, 67105, 67114, 38843, 67122,
- 67131, 67139, 67146, 67154, 67164, 67173, 67182, 67191, 67199, 67210,
- 67220, 7733, 19715, 67229, 67234, 67239, 67243, 67247, 67252, 67258,
- 67263, 67268, 67274, 67279, 67284, 19680, 67289, 67296, 67304, 67312,
- 67317, 67324, 67331, 67335, 67339, 67347, 67355, 30402, 67361, 67367,
- 67379, 67385, 67389, 67396, 67401, 67412, 67422, 67432, 67444, 67450,
- 67460, 67470, 30429, 67479, 67488, 67494, 67506, 67517, 67524, 67529,
- 67533, 67541, 67547, 67552, 67557, 67564, 67572, 67584, 67594, 67603,
- 67612, 67619, 31866, 21906, 67625, 67630, 67634, 67638, 67643, 67649,
- 67660, 67673, 67678, 67685, 30434, 67690, 67702, 67711, 67721, 67732,
- 67745, 67752, 67761, 67770, 67778, 67783, 67789, 1465, 67794, 67799,
- 67804, 67809, 67815, 67820, 67825, 67831, 67837, 67842, 67846, 67851,
- 67856, 67861, 56111, 67866, 67871, 67876, 67881, 67887, 67893, 67898,
- 67902, 67907, 67912, 67917, 67923, 67928, 67934, 67939, 67944, 67949,
- 67954, 67958, 67964, 67969, 67978, 67983, 67988, 67993, 67998, 68002,
- 68009, 68015, 15326, 15333, 42875, 68020, 67970, 68022, 68032, 30443,
- 68035, 68044, 68050, 4617, 30448, 68054, 68060, 68066, 68071, 68075,
- 68082, 68087, 68097, 68106, 68110, 68116, 68122, 68128, 68132, 68140,
- 68147, 68155, 68163, 30453, 68170, 68173, 68180, 68186, 68191, 68195,
- 68201, 68208, 68213, 68217, 68226, 68234, 68240, 68245, 30458, 68252,
- 68259, 68265, 68270, 68276, 68283, 68289, 19453, 25408, 68295, 68300,
- 68306, 68318, 68003, 68010, 68328, 68333, 68340, 68347, 68353, 68364,
- 68369, 7502, 68377, 68380, 68386, 68390, 68394, 68397, 68403, 30207,
- 4656, 913, 11731, 68410, 68416, 68422, 68428, 68434, 68440, 68446, 68452,
- 68458, 68463, 68468, 68473, 68478, 68483, 68488, 68493, 68498, 68503,
- 68508, 68513, 68518, 68523, 68529, 68534, 68539, 68545, 68550, 68555,
- 68561, 68567, 68573, 68579, 68585, 68591, 68597, 68603, 68609, 68614,
- 68619, 68625, 68630, 68635, 68641, 68646, 68651, 68656, 68661, 68666,
- 68671, 68676, 68681, 68686, 68691, 68696, 68701, 68707, 68712, 68717,
- 68722, 68728, 68733, 68738, 68743, 68748, 68754, 68759, 68764, 68769,
- 68774, 68779, 68784, 68789, 68794, 68799, 68804, 68809, 68814, 68819,
- 68824, 68829, 68834, 68839, 68844, 68849, 68855, 68860, 68865, 68870,
- 68875, 68880, 68885, 68890, 1827, 143, 68895, 68899, 68903, 68908, 68916,
- 68920, 68927, 68935, 68939, 68952, 68960, 68964, 68967, 68972, 68976,
- 68981, 68985, 68993, 68997, 19108, 69002, 58270, 69006, 69009, 69017,
- 69025, 69033, 69038, 69045, 69051, 69057, 69062, 69067, 69075, 62175,
- 69082, 69087, 69092, 69096, 9981, 69100, 69105, 69110, 69114, 69117,
- 69123, 69127, 69137, 69146, 69149, 69156, 69169, 69175, 69183, 69194,
- 69205, 69216, 69227, 69236, 69242, 69251, 69259, 69269, 69282, 69289,
- 69300, 69306, 69311, 69316, 69322, 69328, 69338, 69347, 67692, 69355,
- 69361, 69369, 69375, 69383, 69387, 69391, 69394, 69400, 69406, 69414,
- 69426, 69438, 69445, 69449, 69460, 69468, 69475, 69487, 69495, 69503,
- 69510, 69516, 69526, 69535, 69540, 69550, 69559, 38184, 69566, 69570,
- 69575, 69583, 69590, 69596, 69600, 69610, 69621, 69629, 69636, 69648,
- 69660, 69669, 66739, 69676, 69687, 69701, 69709, 69719, 69726, 69734,
- 69746, 69755, 69763, 69773, 69782, 69793, 69805, 69814, 69824, 69831,
- 69840, 69855, 69865, 69874, 69882, 69895, 69910, 69914, 69923, 69935,
- 69946, 69957, 69968, 69978, 69989, 69997, 70003, 70013, 70019, 26923,
- 70024, 70030, 70035, 70042, 8075, 15684, 70048, 70057, 70062, 70066,
- 70073, 70079, 70084, 70092, 70100, 70104, 70107, 70110, 70112, 70119,
- 70125, 70136, 70141, 70145, 70152, 70158, 70163, 70171, 62642, 62652,
- 70177, 70184, 70194, 8971, 70201, 70206, 27113, 70215, 70220, 70227,
- 70237, 70245, 70253, 70262, 70268, 70274, 70281, 70288, 70293, 70297,
- 70305, 70310, 70315, 70323, 70330, 70335, 70341, 70344, 70348, 70357,
- 68947, 70366, 70370, 70376, 70387, 70397, 15693, 70408, 70416, 15705,
- 70423, 70427, 70436, 25294, 70443, 70447, 70452, 70469, 70481, 8925,
- 70493, 70498, 70503, 70508, 70512, 70515, 70520, 70525, 70531, 70536,
- 4324, 19181, 70541, 70546, 70552, 70559, 70564, 70569, 70575, 70581,
- 70587, 70592, 70598, 70602, 70616, 70624, 70632, 70638, 70643, 70650,
- 70660, 70669, 70674, 70679, 70687, 70692, 70698, 70703, 70712, 57154,
- 70717, 70720, 70738, 70757, 70770, 70784, 70800, 70807, 70814, 70820,
- 70827, 70832, 70838, 70844, 70852, 70858, 70863, 70868, 70884, 8938,
- 70898, 70905, 70913, 70919, 70923, 70926, 70931, 70936, 70943, 70948,
- 70957, 70962, 70968, 70977, 70986, 70991, 70995, 71003, 10005, 71012,
- 71020, 71025, 71031, 10016, 71036, 71039, 71044, 71054, 71063, 71068,
- 71074, 71079, 71087, 71094, 71105, 71115, 71120, 62103, 71125, 71131,
- 71136, 71143, 71152, 71160, 71166, 71173, 71179, 71183, 15161, 2993,
- 71188, 71192, 71198, 71207, 71213, 71220, 71224, 71245, 71267, 71283,
- 71300, 71319, 71328, 71338, 71345, 71352, 25181, 71358, 71362, 71370,
- 71382, 71388, 71396, 71400, 71408, 71415, 71419, 71425, 71431, 71436,
- 3498, 39305, 71442, 71446, 71450, 71454, 71459, 71464, 71469, 71475,
- 71481, 71487, 71494, 71500, 71507, 71513, 71519, 71524, 71530, 71535,
- 71540, 71544, 71549, 39320, 71553, 71558, 71566, 71570, 71575, 71582,
- 71591, 71597, 71604, 71608, 71611, 71618, 71627, 71632, 71636, 71644,
- 71653, 71657, 71665, 71671, 71676, 71681, 71687, 71693, 71698, 71702,
- 71708, 71713, 71717, 71721, 71724, 71729, 71737, 71747, 71752, 36865,
- 71760, 71772, 71776, 71782, 71794, 71805, 71812, 71818, 71825, 71837,
- 71844, 71850, 19255, 71854, 71860, 71867, 71873, 71879, 71884, 71889,
- 71894, 71903, 5491, 71908, 14627, 71914, 71918, 71926, 71935, 71939,
- 71946, 71955, 71968, 71974, 71545, 27962, 71979, 71981, 71986, 71991,
- 71996, 72001, 72006, 72011, 72016, 72021, 72026, 72031, 72036, 72041,
- 72046, 72051, 72057, 72062, 72067, 72072, 72077, 72082, 72087, 72092,
- 72097, 72103, 72109, 72115, 72120, 72125, 72137, 72142, 1833, 67, 72147,
- 72152, 30485, 30490, 30495, 30501, 30506, 72156, 30511, 20226, 72178,
- 72182, 72186, 72191, 72195, 30515, 72199, 72207, 30520, 72214, 72217,
- 72222, 72226, 7910, 72235, 30525, 20092, 72238, 72242, 1396, 72247,
- 30536, 72250, 72255, 23720, 23730, 32940, 72260, 72265, 72270, 72275,
- 72281, 72286, 72295, 72300, 72307, 72313, 72318, 72323, 72328, 72338,
- 72347, 72352, 72360, 72364, 72372, 30350, 1188, 72379, 72385, 72390,
- 72395, 72400, 72406, 72411, 72418, 72424, 72429, 72437, 72447, 72457,
- 72463, 72468, 72474, 15715, 72481, 33745, 72494, 72499, 72505, 72518,
- 72524, 72528, 72537, 72544, 72550, 72558, 72567, 72574, 72580, 72583,
- 23861, 72587, 72594, 72600, 72608, 72613, 22035, 72619, 72622, 72630,
- 72638, 72652, 72659, 72665, 72672, 72678, 30550, 72682, 72689, 72697,
- 72705, 30555, 72711, 72717, 72722, 72732, 72738, 72747, 28677, 32415,
- 72755, 72760, 72765, 72770, 72774, 13170, 36878, 72779, 72784, 30560,
- 59554, 72788, 72793, 72797, 72806, 72814, 72820, 72825, 72831, 72838,
- 72844, 72849, 72854, 72863, 72875, 72890, 30801, 72896, 14746, 30564,
- 72900, 72907, 22145, 72913, 72920, 72929, 72936, 72945, 72951, 72956,
- 72964, 72970, 30574, 72975, 72984, 71800, 72993, 73000, 73006, 73012,
- 73022, 73030, 73037, 73041, 30579, 73044, 30585, 30591, 73049, 73057,
- 73067, 73076, 73084, 73091, 73101, 30596, 73105, 73107, 73111, 73116,
- 73120, 73124, 73130, 73135, 73139, 73150, 73155, 2998, 73159, 73166,
- 73170, 73179, 73187, 73194, 73199, 73204, 59600, 73208, 73211, 73217,
- 73225, 73231, 73235, 73240, 73247, 73252, 73258, 32446, 73263, 73266,
- 73271, 73275, 73280, 73285, 73289, 73297, 23739, 23748, 73303, 73309,
- 73315, 73320, 73324, 73327, 73337, 73346, 73351, 73357, 73364, 73370,
- 73374, 73382, 73387, 32452, 73391, 73399, 73405, 73412, 73417, 73421,
- 73426, 55791, 32458, 73432, 73437, 73441, 73446, 73451, 73456, 73460,
- 73465, 73470, 73476, 73481, 73486, 73492, 73498, 73503, 73507, 73512,
- 73517, 73522, 73526, 22144, 73531, 73536, 73542, 73548, 73554, 73559,
- 73563, 73568, 73573, 73578, 73582, 73587, 73592, 73597, 73602, 73606,
- 30600, 73614, 73618, 73626, 73634, 73645, 73650, 73654, 20497, 73659,
- 73665, 73675, 73682, 73687, 73696, 73701, 73705, 73710, 73718, 73726,
- 73733, 62321, 73739, 73747, 73754, 73765, 73771, 73777, 30610, 73780,
- 73787, 73795, 73800, 37069, 73804, 73809, 73816, 73821, 7389, 73825,
- 73833, 73840, 73847, 73853, 73867, 60629, 73875, 73881, 73885, 73888,
- 73896, 73903, 73908, 73921, 73928, 73935, 73940, 58174, 73945, 73948,
- 73955, 73961, 73965, 73973, 73983, 73993, 74002, 74010, 74021, 74026,
- 74030, 74035, 74039, 33071, 19509, 33080, 74047, 74052, 74057, 74062,
- 74067, 74072, 74077, 74081, 74086, 74091, 74096, 74101, 74106, 74111,
- 74115, 74120, 74125, 74129, 74133, 74137, 74141, 74146, 74151, 74155,
- 74160, 74164, 74168, 74173, 74178, 74183, 74188, 74192, 74197, 74202,
- 74206, 74211, 74216, 74221, 74226, 74231, 74236, 74241, 74246, 74251,
- 74256, 74261, 74266, 74271, 74276, 74281, 74286, 74291, 74296, 74301,
- 74306, 74310, 74315, 74320, 74325, 74330, 74335, 74340, 74345, 74350,
- 74355, 74360, 74365, 74369, 74374, 74378, 74383, 74388, 74393, 74398,
- 74403, 74408, 74413, 74418, 74423, 74427, 74431, 74436, 74441, 74445,
- 74450, 74455, 74459, 74464, 74469, 74474, 74479, 74483, 74488, 74493,
- 74497, 74502, 74506, 74510, 74514, 74518, 74523, 74527, 74531, 74535,
- 74539, 74543, 74547, 74551, 74555, 74559, 74564, 74569, 74574, 74579,
- 74584, 74589, 74594, 74599, 74604, 74609, 74613, 74617, 74621, 74625,
- 74629, 74633, 74638, 74642, 74647, 74651, 74656, 74661, 74665, 74669,
- 74674, 74678, 74682, 74686, 74690, 74694, 74698, 74702, 74706, 74710,
- 74714, 74718, 74722, 74726, 74730, 74735, 74740, 74744, 74748, 74752,
- 74756, 74760, 74764, 74769, 74773, 74777, 74781, 74785, 74789, 74793,
- 74798, 74802, 74807, 74811, 74815, 74819, 74823, 74827, 74831, 74835,
- 74839, 74843, 74847, 74851, 74856, 74860, 74864, 74868, 74872, 74876,
- 74880, 74884, 74888, 74892, 74896, 74900, 74905, 74909, 74913, 74918,
- 74923, 74927, 74931, 74935, 74939, 74943, 74947, 74951, 74955, 74960,
- 74964, 74969, 74973, 74978, 74982, 74987, 74991, 74997, 75002, 75006,
- 75011, 75015, 75020, 75024, 75029, 75033, 75038, 1484, 75042, 2778, 1722,
- 1727, 75046, 75050, 2782, 75054, 1365, 75059, 1331, 75063, 2794, 75067,
- 75074, 75081, 75095, 2798, 5589, 75104, 75112, 75119, 75130, 75139,
- 75146, 75158, 75171, 75184, 75195, 75200, 75207, 75219, 75223, 3918,
- 10082, 75233, 75238, 75247, 75257, 2802, 75262, 75266, 75271, 75278,
- 75284, 75292, 75304, 1336, 11351, 75314, 75318, 75324, 75338, 75350,
- 75362, 75372, 75381, 75390, 75399, 75407, 75418, 75426, 3968, 75436,
- 75445, 75451, 75466, 75473, 75479, 33197, 75484, 2826, 11355, 75488,
- 75495, 7334, 75504, 2831, 30105, 75510, 57923, 75517, 75523, 75534,
- 75540, 75547, 75553, 75561, 75568, 75574, 75584, 75593, 75604, 75611,
- 75617, 75627, 75635, 75641, 75656, 75662, 75667, 75674, 75677, 75683,
- 75690, 75696, 75704, 75713, 75721, 75727, 75736, 38845, 75750, 75755,
- 13007, 75761, 75774, 75783, 75791, 75798, 75802, 75806, 75809, 75816,
- 75823, 75831, 75839, 75848, 75856, 12943, 75864, 75869, 75873, 75885,
- 75892, 75901, 780, 75911, 75920, 75931, 2847, 75935, 75939, 75945, 75958,
- 75970, 75980, 75989, 24331, 76001, 76009, 76018, 76029, 76040, 76050,
- 76060, 76069, 76077, 9657, 76084, 76088, 76093, 76098, 76104, 1341,
- 10153, 76111, 76122, 76131, 76139, 76148, 76156, 76172, 76183, 76192,
- 76200, 76212, 76223, 76239, 76249, 76270, 76283, 76291, 76298, 13118,
- 76311, 76316, 76322, 4386, 76328, 76331, 76338, 76348, 6607, 76355,
- 76360, 76365, 76373, 76381, 8123, 8132, 76386, 76397, 76402, 76408, 2855,
- 2860, 76414, 9224, 76420, 76427, 76434, 76447, 2205, 50, 76452, 76457,
- 76467, 76473, 76482, 76490, 76500, 76504, 76509, 76513, 76525, 2883,
- 76533, 76541, 76546, 76557, 76568, 76577, 76582, 76588, 76593, 76603,
- 76613, 76618, 76624, 76629, 76638, 19562, 76642, 4045, 12, 76647, 76656,
- 76663, 76670, 76676, 76682, 827, 76687, 76692, 58240, 76697, 76702,
- 76708, 76716, 76721, 76728, 76734, 76739, 35573, 38743, 76745, 2887, 32,
- 76755, 76768, 76773, 76781, 76786, 76792, 2909, 26234, 76797, 76805,
- 76812, 76817, 56033, 59221, 76826, 1667, 1776, 76831, 76836, 76843, 1780,
- 242, 76850, 76856, 76861, 76868, 1784, 76873, 76879, 76884, 76896, 4597,
- 76906, 1791, 76912, 76917, 76924, 76931, 76946, 76953, 76964, 76972,
- 2572, 76976, 76988, 76993, 76997, 77003, 26059, 2210, 77007, 77018,
- 77022, 77026, 77032, 77036, 77045, 77049, 77060, 77064, 2256, 29944,
- 77068, 77078, 3018, 7738, 77086, 77091, 77095, 77104, 77111, 77117, 2988,
- 15343, 77121, 77134, 77152, 77157, 77165, 77173, 77183, 11457, 77195,
- 77208, 77215, 77222, 77238, 77245, 77251, 1024, 77258, 77265, 77275,
- 77284, 77296, 39709, 77304, 3002, 10350, 77307, 77315, 77319, 3006,
- 77323, 19358, 10366, 3684, 77327, 3012, 77331, 77341, 77347, 77353,
- 77359, 77365, 77371, 77377, 77383, 77389, 77395, 77401, 77407, 77413,
- 77419, 77425, 77431, 77437, 77443, 77449, 77455, 77461, 77467, 77473,
- 77479, 77485, 77491, 77498, 77505, 77511, 77517, 77523, 77529, 77535,
- 77541, 1346, 14270, 10388, 77547, 77552, 77557, 77562, 77567, 77572,
- 77577, 77582, 77587, 77592, 77597, 77602, 77607, 77612, 77617, 77622,
- 77627, 77632, 77637, 77642, 77647, 77652, 77657, 77662, 77667, 77672,
- 77678, 77683, 77688, 77694, 77699, 77705, 77710, 77715, 77721, 77726,
- 77731, 77736, 77741, 77746, 77751, 77756, 77761, 77342, 77348, 77354,
- 77360, 77366, 77372, 77378, 77384, 77390, 77396, 77402, 77408, 77414,
- 77420, 77426, 77767, 77432, 77438, 77444, 77773, 77450, 77456, 77462,
- 77468, 77474, 77480, 77486, 77506, 77779, 77785, 77512, 77791, 77518,
- 77524, 77530, 77536, 77542, 3033, 3038, 77797, 77802, 77805, 77811,
- 77817, 77824, 77829, 77834, 2261,
+ 0, 0, 6, 10, 18, 23, 27, 34, 39, 41, 44, 50, 62, 70, 80, 93, 102, 108,
+ 113, 121, 130, 135, 140, 143, 147, 153, 158, 163, 171, 178, 186, 191,
+ 194, 200, 208, 215, 225, 230, 237, 246, 249, 254, 257, 263, 267, 272,
+ 281, 288, 295, 301, 310, 315, 321, 327, 335, 144, 341, 349, 350, 358,
+ 361, 367, 369, 375, 382, 384, 391, 395, 403, 410, 415, 417, 422, 429,
+ 431, 299, 437, 439, 444, 449, 452, 457, 463, 470, 479, 489, 494, 498,
+ 505, 518, 522, 531, 538, 545, 548, 554, 558, 562, 572, 580, 588, 596,
+ 605, 613, 618, 619, 623, 631, 638, 648, 659, 663, 666, 670, 673, 348,
+ 678, 687, 691, 697, 703, 705, 708, 711, 714, 718, 722, 731, 739, 744,
+ 747, 751, 757, 764, 771, 776, 785, 794, 801, 805, 818, 827, 835, 841,
+ 557, 850, 860, 867, 873, 879, 886, 894, 898, 749, 906, 915, 503, 923,
+ 928, 934, 17, 943, 948, 951, 955, 959, 966, 969, 976, 980, 988, 992,
+ 1000, 1004, 1007, 1014, 1021, 192, 1024, 1029, 1039, 1048, 1055, 1061,
+ 1069, 1072, 1077, 1083, 1091, 1097, 1102, 1105, 1108, 111, 1113, 1117,
+ 1123, 1129, 1132, 1138, 1142, 1147, 1153, 1158, 1168, 1172, 1175, 1178,
+ 1187, 1191, 1194, 1199, 1204, 1210, 1215, 1220, 1225, 1229, 1234, 1240,
+ 1245, 1250, 1254, 1260, 1265, 1270, 1275, 1279, 1284, 1289, 1294, 1300,
+ 1306, 1312, 1317, 1321, 1326, 1331, 1336, 1340, 1345, 1350, 1355, 1360,
+ 1195, 1200, 1205, 1211, 1216, 1364, 1226, 1370, 1375, 1380, 1387, 1391,
+ 1400, 1230, 1404, 1235, 1241, 1246, 1408, 1413, 1418, 1422, 1426, 1432,
+ 1436, 1251, 1439, 1261, 1444, 1448, 1266, 1454, 1271, 1458, 1462, 1276,
+ 1466, 1471, 1475, 1478, 1482, 1280, 1285, 1487, 1290, 1493, 1499, 1505,
+ 1511, 1295, 1307, 1313, 1515, 1519, 1523, 1526, 1318, 1530, 1532, 1537,
+ 1542, 1548, 1553, 1558, 1562, 1567, 1572, 1577, 1582, 1588, 1593, 1598,
+ 1604, 1610, 1615, 1619, 1624, 1629, 1634, 1639, 1643, 1651, 1655, 1660,
+ 1665, 1670, 1675, 1679, 1682, 1687, 1692, 1697, 1702, 1708, 1713, 1717,
+ 1322, 1720, 1725, 1730, 1327, 1734, 1738, 1745, 1332, 1752, 1337, 1756,
+ 1758, 1763, 1769, 1341, 1774, 1783, 1346, 1788, 1794, 1351, 1799, 1804,
+ 1807, 1812, 1816, 1820, 1824, 1827, 1831, 1356, 1361, 1156, 1836, 1842,
+ 1848, 1854, 1860, 1866, 1872, 1878, 1884, 1889, 1895, 1901, 1907, 1913,
+ 1919, 1925, 1931, 1937, 1943, 1948, 1953, 1958, 1963, 1968, 1973, 1978,
+ 1983, 1988, 1993, 1999, 2004, 2010, 2015, 2021, 2027, 2032, 2038, 2044,
+ 2050, 2056, 2061, 2066, 2068, 2069, 2073, 2077, 2082, 2086, 2090, 2094,
+ 2099, 2103, 2106, 2111, 2115, 2120, 2124, 2128, 2133, 2137, 2140, 2144,
+ 2150, 2164, 2168, 2172, 2176, 2179, 2184, 2188, 2192, 2195, 2199, 2204,
+ 2209, 2214, 2219, 2223, 2227, 2231, 2236, 2240, 2245, 2249, 2254, 2260,
+ 2267, 2273, 2278, 2283, 2288, 2294, 2299, 2305, 2310, 2313, 1212, 2315,
+ 2322, 2330, 2340, 2349, 2363, 2367, 2371, 2384, 2392, 2396, 2401, 2405,
+ 2408, 2412, 2416, 2421, 2426, 2431, 2435, 2438, 2442, 2449, 2456, 2462,
+ 2467, 2472, 2478, 2484, 2489, 2492, 1760, 2494, 2500, 2504, 2509, 2513,
+ 2517, 1765, 1771, 2522, 2526, 2529, 2534, 2539, 2544, 2549, 2553, 2560,
+ 2565, 2568, 2575, 2581, 2585, 2589, 2593, 2598, 2605, 2610, 2615, 2622,
+ 2628, 2634, 2640, 2654, 2671, 2686, 2701, 2710, 2715, 2719, 2724, 2729,
+ 2733, 2745, 2752, 2758, 2263, 2764, 2771, 2777, 2781, 2784, 2791, 2797,
+ 2801, 2805, 2809, 2091, 2813, 2818, 2823, 2827, 2835, 2839, 2843, 2847,
+ 2851, 2856, 2861, 2866, 2870, 2875, 2880, 2884, 2889, 2893, 2896, 2900,
+ 2904, 2912, 2917, 2921, 2925, 2931, 2940, 2944, 2948, 2954, 2959, 2966,
+ 2970, 2980, 2984, 2988, 2993, 2997, 3002, 3008, 3013, 3017, 3021, 3025,
+ 2452, 3033, 3038, 3044, 3049, 3053, 3058, 3063, 3067, 3073, 3078, 2095,
+ 3084, 3090, 3095, 3100, 3105, 3110, 3115, 3120, 3125, 3130, 3135, 3141,
+ 3146, 1227, 92, 3152, 3156, 3160, 3164, 3169, 3173, 3177, 3181, 3185,
+ 3190, 3194, 3199, 3203, 3206, 3210, 3215, 3219, 3224, 3228, 3232, 3236,
+ 3241, 3245, 3248, 3261, 3265, 3269, 3273, 3277, 3281, 3284, 3288, 3292,
+ 3297, 3301, 3306, 3311, 3316, 3320, 3323, 3326, 3332, 3336, 3340, 3343,
+ 3347, 3351, 3354, 3360, 3365, 3370, 3376, 3381, 3386, 3392, 3398, 3403,
+ 3408, 3413, 1115, 547, 3418, 3421, 3426, 3430, 3433, 3437, 3442, 3447,
+ 3451, 3456, 3460, 3465, 3469, 3473, 3479, 3485, 3488, 3491, 3497, 3504,
+ 3511, 3517, 3524, 3529, 3533, 3540, 3547, 3552, 3556, 3566, 3570, 3574,
+ 3579, 3584, 3594, 2107, 3599, 3603, 3606, 3612, 3617, 3623, 3629, 3634,
+ 3641, 3645, 3649, 620, 671, 1388, 3653, 3660, 3667, 3674, 3681, 3687,
+ 3693, 3698, 3702, 3708, 3713, 3717, 2116, 3721, 3729, 600, 3735, 3746,
+ 3750, 3760, 2121, 3766, 3771, 3786, 3792, 3799, 3809, 3815, 3820, 3826,
+ 3832, 3835, 3839, 3844, 3851, 3856, 3860, 3864, 3868, 3872, 3877, 3883,
+ 3894, 3211, 3899, 3911, 3919, 3924, 1564, 3931, 3934, 3937, 3941, 3944,
+ 3950, 3954, 3968, 3972, 3975, 3979, 3985, 3991, 3996, 4000, 4004, 4010,
+ 4021, 4027, 4032, 4038, 4042, 4050, 4060, 4066, 4071, 4080, 4088, 4095,
+ 4099, 4105, 4114, 4123, 4127, 4132, 4137, 4141, 4149, 4153, 4158, 4162,
+ 2129, 1401, 4168, 4173, 4179, 4184, 4189, 4194, 4199, 4204, 4209, 4215,
+ 4220, 4226, 4231, 4236, 4241, 4247, 4252, 4257, 4262, 4267, 4273, 4278,
+ 4284, 4289, 4294, 4299, 4304, 4309, 4314, 4320, 4325, 4330, 319, 456,
+ 4335, 4341, 4345, 4349, 4354, 4358, 4362, 4365, 4369, 4373, 4377, 4381,
+ 4386, 4390, 4394, 4400, 4165, 4405, 4409, 4412, 4417, 4422, 4427, 4432,
+ 4437, 4442, 4447, 4452, 4457, 4462, 4466, 4471, 4476, 4481, 4486, 4491,
+ 4496, 4501, 4506, 4511, 4516, 4520, 4525, 4530, 4535, 4540, 4545, 4550,
+ 4555, 4560, 4565, 4570, 4574, 4579, 4584, 4589, 4594, 4599, 4604, 4609,
+ 4614, 4619, 4624, 4628, 4633, 4638, 4643, 4648, 4653, 4658, 4663, 4668,
+ 4673, 4678, 4682, 4687, 4692, 4697, 4702, 4707, 4712, 4717, 4722, 4727,
+ 4732, 4736, 4741, 4746, 4751, 4756, 4761, 4766, 4771, 4776, 4781, 4786,
+ 4790, 4795, 4800, 4805, 4810, 4816, 4822, 4828, 4834, 4840, 4846, 4852,
+ 4857, 4863, 4869, 4875, 4881, 4887, 4893, 4899, 4905, 4911, 4917, 4922,
+ 4928, 4934, 4940, 4946, 4952, 4958, 4964, 4970, 4976, 4982, 4987, 4993,
+ 4999, 5005, 5011, 5017, 5023, 5029, 5035, 5041, 5047, 5052, 5058, 5064,
+ 5070, 5076, 5082, 5088, 5094, 5100, 5106, 5112, 5117, 5123, 5129, 5135,
+ 5141, 5147, 5153, 5159, 5165, 5171, 5177, 5182, 5186, 5192, 5198, 5204,
+ 5210, 5216, 5222, 5228, 5234, 5240, 5246, 5251, 5257, 5263, 5269, 5275,
+ 5281, 5287, 5293, 5299, 5305, 5311, 5316, 5322, 5328, 5334, 5340, 5346,
+ 5352, 5358, 5364, 5370, 5376, 5381, 5387, 5393, 5399, 5405, 5411, 5417,
+ 5423, 5429, 5435, 5441, 5446, 5452, 5458, 5464, 5470, 5476, 5482, 5488,
+ 5494, 5500, 5506, 5511, 5517, 5523, 5529, 5535, 5541, 5547, 5553, 5559,
+ 5565, 5571, 5576, 5582, 5588, 5594, 5600, 5606, 5612, 5618, 5624, 5630,
+ 5636, 5641, 5647, 5653, 5659, 5665, 5671, 5677, 5683, 5689, 5695, 5701,
+ 5706, 5712, 5718, 5724, 5730, 5736, 5742, 5748, 5754, 5760, 5766, 5771,
+ 5777, 5783, 5789, 5795, 5801, 5807, 5813, 5819, 5825, 5831, 5836, 5840,
+ 5843, 5850, 5854, 5867, 5871, 5875, 5879, 5883, 5887, 5891, 5897, 5904,
+ 5912, 5916, 5924, 5933, 5939, 5951, 5956, 5959, 5963, 5973, 5981, 5989,
+ 5995, 5999, 6009, 6019, 6027, 6034, 6041, 6047, 6053, 6060, 6064, 6071,
+ 6081, 6091, 6099, 6106, 6111, 6115, 6123, 6127, 6132, 6139, 6147, 6152,
+ 6157, 6161, 6168, 6173, 6187, 6192, 6197, 6204, 6213, 6216, 6220, 6224,
+ 6228, 6231, 6236, 6241, 6250, 6256, 6262, 6268, 6272, 6283, 6293, 6308,
+ 6323, 6338, 6353, 6368, 6383, 6398, 6413, 6428, 6443, 6458, 6473, 6488,
+ 6503, 6518, 6533, 6548, 6563, 6578, 6593, 6608, 6623, 6638, 6653, 6668,
+ 6683, 6698, 6713, 6728, 6743, 6758, 6773, 6788, 6803, 6818, 6833, 6848,
+ 6863, 6878, 6893, 6908, 6923, 6938, 6953, 6968, 6983, 6998, 7013, 7028,
+ 7037, 7046, 7051, 7057, 7067, 7071, 7076, 7081, 7089, 7093, 7096, 7100,
+ 2975, 7103, 7108, 298, 442, 7114, 7122, 7126, 7130, 7133, 7137, 7143,
+ 7147, 7155, 7161, 7166, 7173, 7180, 7186, 7191, 7198, 7204, 7212, 7216,
+ 7221, 7233, 7244, 7251, 7255, 7259, 7265, 3233, 7269, 7275, 7280, 7285,
+ 7290, 7296, 7301, 7306, 7311, 7316, 7322, 7327, 7332, 7338, 7343, 7349,
+ 7354, 7360, 7365, 7371, 7376, 7381, 7386, 7391, 7396, 7402, 7407, 7412,
+ 7417, 7423, 7429, 7435, 7441, 7447, 7453, 7459, 7465, 7471, 7477, 7483,
+ 7489, 7494, 7499, 7504, 7509, 7514, 7519, 7524, 7529, 7535, 7541, 7546,
+ 7552, 7558, 7564, 7569, 7574, 7579, 7584, 7590, 7596, 7601, 7606, 7611,
+ 7616, 7621, 7627, 7632, 7638, 7644, 7650, 7656, 7662, 7668, 7674, 7680,
+ 7686, 2138, 7132, 7691, 7695, 7699, 7702, 7709, 7712, 7720, 7725, 7730,
+ 7721, 7735, 2165, 7739, 7745, 7751, 7756, 7761, 7768, 7776, 7781, 7785,
+ 7788, 7792, 7798, 7804, 7808, 2173, 560, 7811, 7815, 7820, 7826, 7831,
+ 7835, 7838, 7842, 7848, 7853, 7857, 7864, 7868, 7872, 7876, 945, 769,
+ 7879, 7887, 7894, 7901, 7907, 7914, 7922, 7929, 7936, 7941, 7953, 1247,
+ 1409, 1414, 7964, 1419, 7968, 7972, 7981, 7989, 7998, 8004, 8009, 8013,
+ 8019, 8024, 2706, 8031, 8035, 8044, 8053, 8062, 8071, 8076, 8081, 8093,
+ 8098, 8106, 2224, 8110, 8112, 8117, 8121, 8130, 8138, 1423, 133, 3461,
+ 3466, 8144, 8148, 8157, 8163, 8168, 8171, 8180, 2698, 8186, 8194, 8198,
+ 8202, 8206, 2237, 8210, 8215, 8222, 8228, 8234, 8237, 8239, 8242, 8250,
+ 8258, 8266, 8269, 8274, 2250, 8279, 7732, 8282, 8284, 8289, 8294, 8299,
+ 8304, 8309, 8314, 8319, 8324, 8329, 8334, 8340, 8345, 8350, 8355, 8361,
+ 8366, 8371, 8376, 8381, 8386, 8391, 8397, 8402, 8407, 8412, 8417, 8422,
+ 8427, 8432, 8437, 8442, 8447, 8452, 8457, 8462, 8467, 8472, 8477, 8482,
+ 8488, 8494, 8499, 8504, 8509, 8514, 8519, 2261, 2268, 2274, 8524, 8530,
+ 8538, 2300, 2306, 8546, 8550, 8555, 8559, 8563, 8567, 8572, 8576, 8581,
+ 8585, 8588, 8591, 8597, 8603, 8609, 8615, 8621, 8627, 8633, 8637, 8641,
+ 8645, 8649, 8653, 8658, 8665, 8676, 8684, 8694, 8700, 8707, 8712, 8716,
+ 8727, 8740, 8751, 8764, 8775, 8787, 8799, 8811, 8824, 8837, 8844, 8850,
+ 8864, 8871, 8877, 8881, 8886, 8890, 8897, 8905, 8909, 8915, 8919, 8925,
+ 8935, 8939, 8944, 8949, 8956, 8962, 8972, 7909, 8978, 8982, 8989, 768,
+ 8993, 8997, 9002, 9007, 9012, 9016, 9022, 9030, 9036, 9040, 9046, 9056,
+ 9060, 9066, 9071, 9075, 9081, 9087, 2161, 9092, 9094, 9099, 9107, 9116,
+ 9120, 9126, 9131, 9136, 9141, 9146, 9152, 9157, 9162, 4006, 9167, 9172,
+ 9176, 9182, 9187, 9193, 9198, 9203, 9209, 9214, 9121, 9220, 9224, 9231,
+ 9237, 9242, 9246, 6183, 9251, 9260, 9265, 9270, 8218, 8225, 9275, 2853,
+ 9279, 9284, 9289, 9132, 9293, 9298, 9137, 9142, 9303, 9310, 9317, 9323,
+ 9329, 9335, 9340, 9345, 9350, 9147, 9153, 9356, 9362, 9367, 9375, 9158,
+ 9380, 990, 9383, 9391, 9397, 9403, 9412, 9420, 9425, 9431, 9439, 9446,
+ 9461, 9478, 9497, 9506, 9514, 9529, 9540, 9550, 9560, 9568, 9574, 9586,
+ 9595, 9603, 9610, 9617, 9623, 9628, 9636, 9646, 9653, 9663, 9673, 9683,
+ 9691, 9698, 9707, 9717, 9731, 9746, 9755, 9763, 9768, 9772, 9781, 9787,
+ 9792, 9802, 9812, 9822, 9827, 9831, 9840, 9845, 9855, 9866, 9879, 9887,
+ 9900, 9912, 9920, 9925, 9929, 9935, 9940, 9948, 9956, 9963, 9968, 9976,
+ 9982, 9985, 9989, 9995, 10003, 10008, 10012, 10020, 10029, 10037, 10043,
+ 10047, 10054, 10065, 10069, 10072, 10078, 9163, 10083, 10089, 10096,
+ 10102, 10107, 10114, 10121, 10128, 10135, 10142, 10149, 10156, 10163,
+ 10168, 9474, 10173, 10179, 10186, 10193, 10198, 10205, 10214, 10218,
+ 10230, 8256, 10234, 10237, 10241, 10245, 10249, 10253, 10259, 10265,
+ 10270, 10276, 10281, 10286, 10292, 10297, 10302, 8952, 10307, 10311,
+ 10315, 10319, 10324, 10329, 10337, 10343, 10347, 10351, 10358, 10363,
+ 10371, 10376, 10380, 10383, 10389, 10396, 10400, 10403, 10408, 10412,
+ 4045, 10418, 10427, 36, 10435, 10441, 10446, 8967, 10451, 10456, 10460,
+ 10463, 10478, 10497, 10509, 10522, 10535, 10548, 10562, 10575, 10590,
+ 10597, 9168, 10603, 10617, 10622, 10628, 10633, 10641, 10646, 8040,
+ 10651, 10654, 10661, 10666, 10670, 2858, 998, 10676, 10680, 10686, 10692,
+ 10697, 10703, 10708, 9177, 10714, 10720, 10725, 10730, 10738, 10744,
+ 10757, 10765, 10772, 9183, 10778, 10786, 10794, 10801, 10814, 10826,
+ 10836, 10844, 10851, 10858, 10867, 10876, 10884, 10891, 10896, 10902,
+ 9188, 10907, 10913, 9194, 10918, 10921, 10928, 10934, 10947, 8669, 10958,
+ 10964, 10973, 10981, 10988, 10994, 11000, 11005, 11009, 11014, 10470,
+ 11020, 9199, 11027, 11032, 11039, 11045, 11051, 11056, 11064, 11072,
+ 11079, 11083, 11097, 11107, 11112, 11116, 11127, 11133, 11138, 11143,
+ 9204, 9210, 11147, 11150, 11155, 11167, 11174, 11179, 11183, 11188,
+ 11192, 11199, 11205, 9215, 9122, 11212, 2863, 8, 11219, 11224, 11228,
+ 11234, 11242, 11252, 11257, 11262, 11269, 11276, 11280, 11291, 11301,
+ 11310, 11322, 11327, 11331, 11339, 11353, 11357, 11360, 11368, 11375,
+ 11383, 11387, 11398, 11402, 11409, 11414, 11418, 11424, 11429, 11433,
+ 11439, 11444, 11455, 11459, 11462, 11468, 11473, 11479, 11485, 11492,
+ 11503, 11513, 11523, 11532, 11539, 11548, 9225, 9232, 9238, 9243, 11554,
+ 11560, 9247, 11566, 11569, 11576, 11581, 11596, 11612, 11627, 11635,
+ 11641, 11646, 838, 420, 11651, 11659, 11666, 11672, 11677, 11682, 9252,
+ 11684, 11688, 11693, 11697, 11707, 11712, 11716, 11725, 11729, 11732,
+ 9261, 11739, 11742, 11750, 11757, 11765, 11769, 11776, 11785, 11788,
+ 11792, 11796, 11802, 11806, 11810, 11814, 11820, 11830, 11834, 11842,
+ 11846, 11853, 11857, 11862, 11866, 11873, 11879, 11887, 11893, 11898,
+ 11908, 11913, 11918, 11922, 11930, 3905, 11938, 11943, 9266, 11947,
+ 11951, 11954, 11962, 11969, 11973, 5991, 11977, 11982, 11986, 11997,
+ 12007, 12012, 12018, 12022, 12025, 12033, 12038, 12043, 12050, 12055,
+ 9271, 12060, 12064, 12071, 1722, 6145, 12076, 12081, 12086, 12091, 12097,
+ 12102, 12108, 12113, 12118, 12123, 12128, 12133, 12138, 12143, 12148,
+ 12153, 12158, 12163, 12168, 12173, 12178, 12183, 12188, 12194, 12199,
+ 12204, 12209, 12214, 12219, 12225, 12230, 12235, 12241, 12246, 12252,
+ 12257, 12263, 12268, 12273, 12278, 12283, 12289, 12294, 12299, 12304,
+ 737, 139, 12312, 12316, 12321, 12326, 12330, 12334, 12338, 12343, 12347,
+ 12352, 12356, 12359, 12363, 12367, 12373, 12378, 12388, 12394, 12402,
+ 12406, 12410, 12417, 12425, 12434, 12445, 12452, 12459, 12463, 12472,
+ 12481, 12489, 12498, 12507, 12516, 12525, 12535, 12545, 12555, 12565,
+ 12575, 12584, 12594, 12604, 12614, 12624, 12634, 12644, 12654, 12663,
+ 12673, 12683, 12693, 12703, 12713, 12723, 12732, 12742, 12752, 12762,
+ 12772, 12782, 12792, 12802, 12812, 12822, 12831, 12841, 12851, 12861,
+ 12871, 12881, 12891, 12901, 12911, 12921, 12931, 12940, 1256, 12946,
+ 12949, 12953, 12958, 12965, 12971, 12976, 12980, 12985, 12994, 13002,
+ 13007, 13011, 13015, 13021, 13026, 13032, 9280, 13037, 13042, 13051,
+ 9285, 13056, 13059, 13065, 13073, 9290, 13080, 13084, 13088, 13092,
+ 13102, 13108, 13114, 13119, 13128, 13136, 13143, 13150, 13155, 13162,
+ 13167, 13171, 13174, 13185, 13195, 13204, 13212, 13223, 13235, 13245,
+ 13250, 13254, 13259, 13264, 13268, 13274, 13282, 13289, 13300, 13305,
+ 13315, 13319, 13322, 13329, 13339, 13348, 13355, 13359, 13366, 13372,
+ 13377, 13382, 13386, 13395, 13400, 13406, 13410, 13415, 13419, 13428,
+ 13436, 13444, 13451, 13459, 13471, 13482, 13492, 13499, 13505, 13514,
+ 13525, 13534, 13546, 13558, 13570, 13580, 13589, 13598, 13606, 13613,
+ 13622, 13630, 13634, 13640, 13646, 13651, 7753, 13655, 13657, 13661,
+ 13666, 13672, 13681, 13685, 13693, 13700, 13709, 13718, 13727, 13736,
+ 13745, 13754, 13763, 13772, 13782, 13792, 13801, 13807, 13814, 13821,
+ 13827, 13841, 13848, 13856, 13865, 13871, 13880, 13889, 13900, 13910,
+ 13918, 13925, 13933, 13942, 13955, 13963, 13970, 13983, 13989, 13995,
+ 14005, 14014, 14023, 14028, 14032, 14038, 14044, 14051, 8966, 14056,
+ 14061, 14068, 14073, 12369, 14078, 14086, 14092, 14097, 14105, 14113,
+ 14120, 14128, 14134, 14142, 14150, 14156, 14161, 14167, 14174, 14180,
+ 14185, 14189, 14200, 14208, 14214, 14219, 14228, 14234, 14239, 14248,
+ 14262, 3853, 14266, 14271, 14276, 14282, 14287, 14292, 14296, 14301,
+ 14306, 14311, 7752, 14316, 14321, 14326, 14331, 14336, 14340, 14345,
+ 14350, 14355, 14360, 14366, 14372, 14377, 14381, 14386, 14391, 14396,
+ 9294, 14401, 14406, 14411, 14416, 14421, 14438, 14456, 14468, 14481,
+ 14498, 14514, 14531, 14541, 14560, 14571, 14582, 14593, 14604, 14616,
+ 14627, 14638, 14655, 14666, 14677, 14682, 9299, 14687, 14691, 2381,
+ 14695, 14698, 14704, 14712, 14720, 14725, 14733, 14741, 14748, 14753,
+ 14759, 14766, 14774, 14781, 14793, 14801, 14806, 11590, 14812, 14821,
+ 14830, 14838, 14845, 14851, 14859, 14866, 14872, 14879, 14885, 14894,
+ 14902, 14912, 14919, 14925, 14933, 14939, 14947, 14954, 14967, 14974,
+ 14983, 14992, 15001, 15009, 15019, 15026, 15031, 3560, 15038, 15043,
+ 1372, 15047, 14317, 15051, 15057, 15061, 15069, 15081, 15086, 15093,
+ 15099, 15104, 15111, 14322, 15115, 15119, 15123, 14327, 15127, 14332,
+ 15131, 15138, 15143, 15147, 15154, 15158, 15166, 15173, 15177, 15184,
+ 15201, 15210, 15214, 15217, 15225, 15231, 15236, 3638, 15240, 15242,
+ 15250, 15257, 15267, 15279, 15284, 15290, 15295, 15299, 15305, 15310,
+ 15316, 15319, 15326, 15334, 15341, 15347, 15353, 15358, 15365, 15371,
+ 15376, 15383, 15387, 15393, 15397, 15404, 15410, 15416, 15424, 15430,
+ 15435, 15441, 15449, 15457, 15463, 15469, 15474, 15481, 15486, 15490,
+ 15496, 15501, 15508, 15513, 15519, 15522, 15528, 15534, 15537, 15541,
+ 15553, 15559, 15564, 15571, 15577, 15583, 15594, 15604, 15613, 15621,
+ 15628, 15639, 15649, 15659, 15667, 15670, 14346, 15675, 15680, 14351,
+ 14486, 15688, 15701, 15716, 15727, 14503, 15745, 15758, 15771, 15782,
+ 10485, 15793, 15806, 15825, 15836, 15847, 15858, 2649, 15871, 15875,
+ 15883, 15898, 15913, 15924, 15931, 15937, 15945, 15949, 15955, 15958,
+ 15968, 15976, 15983, 15991, 16001, 16006, 16013, 16018, 16025, 16036,
+ 16046, 16052, 16057, 16062, 14356, 16066, 16072, 16078, 16083, 16088,
+ 16093, 16097, 14361, 14367, 16101, 14373, 16106, 16114, 16123, 16130,
+ 9143, 16134, 16136, 16141, 16146, 16152, 16157, 16162, 16167, 16172,
+ 16176, 16182, 16188, 16193, 16199, 16204, 16209, 16215, 16220, 16225,
+ 16230, 16235, 16241, 16246, 16251, 16257, 16263, 16268, 16273, 16280,
+ 16286, 16297, 16304, 16309, 16313, 16317, 16320, 16328, 16333, 16340,
+ 16347, 16353, 16358, 16363, 16370, 16380, 16385, 16392, 16398, 16408,
+ 16418, 16432, 16446, 16460, 16474, 16489, 16504, 16521, 16539, 16552,
+ 16558, 16563, 16568, 16572, 16577, 16585, 16591, 16596, 16601, 16605,
+ 16610, 16614, 16619, 16623, 16634, 16640, 16645, 16650, 16657, 16662,
+ 16666, 16671, 16676, 16682, 16689, 16695, 16700, 16704, 16710, 16715,
+ 16720, 16724, 16730, 16735, 16740, 16747, 16752, 13104, 16756, 16761,
+ 16765, 16770, 16776, 16782, 16789, 16799, 16807, 16814, 16819, 16823,
+ 16832, 16840, 16847, 16854, 16860, 16866, 16871, 16876, 16882, 16887,
+ 16893, 16898, 16904, 16910, 16917, 16923, 16928, 16933, 9341, 16942,
+ 16945, 16951, 16956, 16961, 16971, 16978, 16984, 16989, 16994, 17000,
+ 17005, 17011, 17016, 17022, 17028, 17033, 17041, 17048, 17053, 17058,
+ 17064, 17069, 17073, 17082, 17093, 17100, 17105, 17113, 17119, 17126,
+ 17132, 17137, 17141, 17147, 17152, 17157, 17162, 1440, 7777, 2877, 17166,
+ 17170, 17174, 17178, 17182, 17186, 17189, 17196, 17204, 14387, 17211,
+ 17221, 17229, 17236, 17244, 17254, 17263, 17276, 17281, 17286, 17294,
+ 17301, 13200, 13209, 17308, 17318, 17333, 17339, 17346, 17353, 17359,
+ 17367, 17377, 17387, 14392, 17396, 17402, 17408, 17416, 17424, 17429,
+ 17438, 17446, 17458, 17468, 17478, 17488, 17497, 17509, 17519, 17529,
+ 17540, 17545, 17557, 17569, 17581, 17593, 17605, 17617, 17629, 17641,
+ 17653, 17665, 17676, 17688, 17700, 17712, 17724, 17736, 17748, 17760,
+ 17772, 17784, 17796, 17807, 17819, 17831, 17843, 17855, 17867, 17879,
+ 17891, 17903, 17915, 17927, 17938, 17950, 17962, 17974, 17986, 17998,
+ 18010, 18022, 18034, 18046, 18058, 18069, 18081, 18093, 18105, 18117,
+ 18129, 18141, 18153, 18165, 18177, 18189, 18200, 18212, 18224, 18236,
+ 18248, 18260, 18272, 18284, 18296, 18308, 18320, 18331, 18343, 18355,
+ 18367, 18379, 18391, 18403, 18415, 18427, 18439, 18451, 18462, 18474,
+ 18486, 18498, 18510, 18523, 18536, 18549, 18562, 18575, 18588, 18601,
+ 18613, 18626, 18639, 18652, 18665, 18678, 18691, 18704, 18717, 18730,
+ 18743, 18755, 18768, 18781, 18794, 18807, 18820, 18833, 18846, 18859,
+ 18872, 18885, 18897, 18910, 18923, 18936, 18949, 18962, 18975, 18988,
+ 19001, 19014, 19027, 19039, 19052, 19065, 19078, 19091, 19104, 19117,
+ 19130, 19143, 19156, 19169, 19181, 19194, 19207, 19220, 19233, 19246,
+ 19259, 19272, 19285, 19298, 19311, 19323, 19334, 19347, 19360, 19373,
+ 19386, 19399, 19412, 19425, 19438, 19451, 19464, 19476, 19489, 19502,
+ 19515, 19528, 19541, 19554, 19567, 19580, 19593, 19606, 19618, 19631,
+ 19644, 19657, 19670, 19683, 19696, 19709, 19722, 19735, 19748, 19760,
+ 19773, 19786, 19799, 19812, 19825, 19838, 19851, 19864, 19877, 19890,
+ 19902, 19915, 19928, 19941, 19954, 19967, 19980, 19993, 20006, 20019,
+ 20032, 20044, 20057, 20070, 20083, 20096, 20109, 20122, 20135, 20148,
+ 20161, 20174, 20186, 20199, 20212, 20225, 20238, 20251, 20264, 20277,
+ 20290, 20303, 20316, 20328, 20341, 20354, 20367, 20380, 20393, 20406,
+ 20419, 20432, 20445, 20458, 20470, 20483, 20496, 20509, 20522, 20535,
+ 20548, 20561, 20574, 20587, 20600, 20612, 20625, 20638, 20651, 20664,
+ 20677, 20690, 20703, 20716, 20729, 20742, 20754, 20765, 20773, 20781,
+ 20788, 20794, 20798, 20804, 20810, 20818, 20824, 20829, 20833, 20842,
+ 9148, 20853, 20860, 20868, 20875, 20882, 10941, 20889, 20898, 20903,
+ 20908, 7805, 20915, 20920, 20923, 20928, 20936, 20943, 20950, 20957,
+ 20963, 20972, 20981, 20987, 20996, 21000, 21006, 21011, 21021, 21028,
+ 21034, 21042, 21048, 21055, 21065, 21074, 21078, 21085, 21089, 21094,
+ 21100, 21108, 21112, 21122, 14402, 21131, 21137, 21141, 21150, 14407,
+ 21156, 21163, 21174, 21182, 21191, 21199, 8931, 21207, 21212, 21218,
+ 21223, 21227, 21231, 21235, 9632, 21240, 21248, 21255, 21264, 21271,
+ 21278, 10871, 21285, 21291, 21295, 21301, 21308, 21314, 21322, 21328,
+ 21335, 21341, 21347, 21356, 21360, 21368, 21377, 21384, 21389, 21393,
+ 21404, 21409, 21414, 21419, 21432, 7995, 21436, 21442, 21450, 21454,
+ 21461, 21470, 21475, 14678, 21483, 21487, 21499, 21504, 21508, 21511,
+ 21517, 21523, 21528, 21532, 21535, 21546, 21551, 9376, 21558, 21563,
+ 9381, 21568, 21573, 21578, 21583, 21588, 21593, 21598, 21603, 21608,
+ 21613, 21618, 21623, 21629, 21634, 21639, 21644, 21649, 21654, 21659,
+ 21664, 21669, 21674, 21680, 21686, 21691, 21696, 21701, 21706, 21711,
+ 21716, 21721, 21726, 21731, 21737, 21742, 21747, 21752, 21758, 21764,
+ 21769, 21774, 21779, 21784, 21789, 21794, 21799, 21804, 21810, 21815,
+ 21820, 21825, 21830, 21836, 21841, 21846, 21850, 1368, 129, 21858, 21862,
+ 21866, 21870, 21875, 21879, 13110, 12469, 21883, 21888, 21892, 21897,
+ 21901, 21906, 21910, 21916, 21921, 21925, 21929, 21937, 21941, 21945,
+ 21950, 21955, 21959, 21965, 21970, 21974, 21979, 21984, 21988, 21995,
+ 22002, 22009, 22013, 22017, 22022, 22026, 22029, 22035, 22048, 22053,
+ 22062, 22067, 9421, 22072, 22075, 2712, 2717, 22079, 22085, 22091, 7209,
+ 22096, 22101, 22106, 22112, 22117, 13896, 22122, 22127, 22132, 22137,
+ 22143, 22148, 22153, 22159, 22164, 22168, 22173, 22178, 22183, 22188,
+ 22192, 22197, 22201, 22206, 22211, 22216, 22221, 22225, 22230, 22234,
+ 22239, 22244, 22249, 22254, 2886, 22169, 22258, 22266, 22273, 9726,
+ 22285, 22293, 22174, 22300, 22305, 22313, 22179, 22318, 22323, 22331,
+ 22336, 22184, 22341, 22346, 22350, 22356, 22364, 22367, 22374, 22378,
+ 22382, 22388, 22395, 22400, 8958, 1727, 1732, 22404, 22410, 22416, 22421,
+ 22425, 22429, 22433, 22437, 22441, 22445, 22449, 22452, 22458, 22465,
+ 22473, 22479, 22485, 22490, 22495, 22499, 13816, 13823, 22504, 22516,
+ 22519, 22526, 16349, 22533, 22541, 22552, 22561, 22574, 22584, 22598,
+ 22610, 22624, 22636, 22646, 22658, 22664, 22679, 22703, 22721, 22740,
+ 22753, 22767, 22785, 22801, 22818, 22836, 22847, 22866, 22883, 22903,
+ 22921, 22933, 22947, 22961, 22973, 22990, 23009, 23027, 23039, 23057,
+ 23076, 14546, 23089, 23109, 23121, 10516, 23133, 23138, 23143, 23148,
+ 23154, 23159, 23163, 23170, 2398, 23174, 23180, 23184, 23187, 23191,
+ 23199, 23205, 22202, 23209, 23218, 23229, 23235, 23241, 23250, 23258,
+ 23265, 23270, 23274, 23281, 23287, 23296, 23304, 23311, 23321, 23330,
+ 23340, 23345, 23354, 23363, 23374, 23385, 3963, 23395, 23399, 23409,
+ 23417, 23427, 23438, 23443, 23453, 23461, 23468, 23474, 23481, 23486,
+ 22212, 23490, 23499, 23503, 23506, 23511, 23518, 23527, 23535, 23543,
+ 23553, 23562, 23568, 23574, 22217, 22222, 23578, 23588, 23598, 23608,
+ 23616, 23623, 23633, 23641, 23649, 23655, 23663, 930, 23672, 14737, 542,
+ 23686, 23695, 23703, 23714, 23725, 23735, 23744, 23756, 23765, 23774,
+ 23780, 23789, 23798, 23808, 23816, 23824, 9353, 23830, 23833, 23837,
+ 23842, 23847, 9841, 22235, 22240, 23855, 23861, 23867, 23872, 23877,
+ 23881, 23889, 23895, 23901, 23905, 3525, 23913, 23918, 23923, 23927,
+ 23931, 9921, 23938, 23946, 23960, 23967, 23973, 9930, 9936, 23981, 23989,
+ 23996, 24001, 24006, 22245, 24012, 24023, 24027, 24032, 2601, 24037,
+ 24048, 24054, 24059, 24063, 24067, 24070, 24077, 24084, 24091, 24097,
+ 24101, 22250, 24106, 24110, 24114, 1037, 24119, 24124, 24129, 24134,
+ 24139, 24144, 24149, 24154, 24159, 24164, 24169, 24174, 24179, 24184,
+ 24190, 24195, 24200, 24205, 24210, 24215, 24220, 24226, 24231, 24236,
+ 24241, 24246, 24251, 24256, 24261, 24267, 24273, 24278, 24284, 24289,
+ 24294, 5, 24300, 24304, 24308, 24312, 24317, 24321, 24325, 24329, 24333,
+ 24338, 24342, 24347, 24351, 24354, 24358, 24363, 24367, 24372, 24376,
+ 24380, 24384, 24389, 24393, 24397, 24407, 24412, 24416, 24420, 24425,
+ 24430, 24439, 24444, 24449, 24453, 24457, 24470, 24482, 24491, 24500,
+ 24506, 24511, 24515, 24519, 24529, 24538, 24546, 24552, 24557, 24561,
+ 24568, 24578, 24587, 24595, 24603, 24610, 24618, 24627, 24636, 24644,
+ 24649, 24653, 24657, 24660, 24662, 24666, 24670, 24675, 24680, 24684,
+ 24688, 24691, 24695, 24698, 24702, 24705, 24708, 24712, 24718, 24722,
+ 24726, 24730, 24735, 24740, 24745, 24749, 24752, 24757, 24763, 24768,
+ 24774, 24779, 24783, 24787, 24791, 24796, 24800, 24805, 24809, 24813,
+ 24820, 24824, 24827, 24831, 24837, 24843, 24847, 24851, 24856, 24863,
+ 24869, 24873, 24882, 24886, 24890, 24893, 24899, 24904, 24910, 1489,
+ 1791, 24915, 24920, 24925, 24930, 24935, 24940, 24945, 2148, 2194, 24950,
+ 24953, 24957, 24961, 24966, 24970, 24974, 24977, 24982, 24987, 24991,
+ 24994, 24999, 25003, 25008, 25012, 14749, 25017, 25020, 25023, 25027,
+ 25032, 25036, 25049, 25053, 25056, 25064, 25073, 25080, 25085, 25091,
+ 25097, 25105, 25112, 25119, 25123, 25127, 25131, 25136, 25141, 25145,
+ 25153, 25158, 25170, 25181, 25186, 25190, 25194, 25200, 25205, 25210,
+ 25214, 25218, 25221, 25227, 7915, 2316, 25231, 25236, 25252, 9468, 25272,
+ 25281, 25297, 25301, 25304, 25310, 25320, 25326, 25335, 25350, 25362,
+ 25373, 25381, 25390, 25396, 25405, 25415, 25426, 25437, 25446, 25453,
+ 25462, 25470, 25477, 25485, 25492, 25499, 25512, 25519, 25525, 25530,
+ 25539, 25545, 25550, 25558, 25565, 23419, 25577, 25589, 25603, 25611,
+ 25618, 25630, 25639, 25648, 25656, 25664, 25672, 25679, 25688, 25696,
+ 25706, 25715, 25725, 25734, 25743, 25751, 25756, 25760, 25763, 25767,
+ 25771, 25775, 25779, 25783, 25789, 25795, 25803, 14794, 25810, 25815,
+ 25822, 25828, 25835, 14802, 25842, 25845, 25857, 25865, 25871, 25876,
+ 25880, 9871, 25891, 25901, 25910, 25917, 25921, 14807, 25924, 25931,
+ 25935, 25941, 25944, 25951, 25957, 25964, 25970, 25974, 25979, 25983,
+ 25992, 25999, 26005, 7956, 26012, 26020, 26027, 26033, 26038, 26044,
+ 26050, 26058, 26062, 26065, 26067, 25768, 26076, 26082, 26092, 26097,
+ 26104, 26110, 26115, 26120, 26125, 26129, 26134, 26141, 26150, 26154,
+ 26161, 26170, 26176, 26181, 26187, 26192, 26199, 26210, 26215, 26219,
+ 26229, 26235, 26239, 26244, 26254, 26263, 26267, 26274, 26282, 26289,
+ 26295, 26300, 26308, 26315, 26327, 26336, 26340, 13046, 26348, 26358,
+ 26362, 25060, 26373, 26378, 26382, 26389, 26396, 21961, 25693, 26401,
+ 26405, 26408, 22853, 26413, 26427, 26443, 26461, 26480, 26497, 26515,
+ 22872, 26532, 26552, 22889, 26564, 26576, 15732, 26588, 22909, 26602,
+ 26614, 10529, 26628, 26633, 26638, 26643, 26649, 26655, 26661, 26665,
+ 26672, 26677, 26687, 26693, 10176, 26699, 26701, 26706, 26714, 26718,
+ 26137, 26724, 26731, 11517, 11527, 26738, 26748, 26753, 26757, 26760,
+ 26766, 26774, 26786, 26796, 26812, 26825, 26839, 15750, 26853, 26860,
+ 26864, 26867, 26872, 26876, 26883, 26890, 26900, 26905, 26910, 26915,
+ 26923, 26931, 26940, 26945, 9565, 26949, 26952, 26955, 26960, 26967,
+ 26972, 26988, 26996, 27004, 9416, 27012, 27017, 27021, 27027, 27033,
+ 27036, 27042, 27054, 27062, 27069, 27075, 27082, 27093, 27107, 27120,
+ 27129, 27138, 27150, 27161, 27171, 27180, 27189, 27197, 27208, 7938,
+ 27215, 27221, 27226, 27232, 27239, 27249, 27259, 27268, 27274, 27281,
+ 27286, 27293, 27301, 27309, 27321, 6246, 27328, 27337, 27345, 27351,
+ 27357, 27362, 27366, 27369, 27375, 27382, 27387, 27392, 27396, 27408,
+ 27419, 27428, 27436, 14934, 27441, 27447, 27453, 11510, 8635, 27458,
+ 27462, 27465, 27468, 27474, 27482, 27490, 27494, 27498, 27503, 27506,
+ 27515, 27519, 27527, 27538, 27542, 27548, 27554, 27558, 27564, 27572,
+ 27594, 27618, 27625, 27632, 27638, 27646, 27652, 27657, 27668, 27686,
+ 27693, 27701, 27705, 27714, 27727, 27735, 27747, 27758, 27768, 27782,
+ 27791, 27799, 27811, 9485, 27822, 27833, 27845, 27855, 27864, 27869,
+ 27873, 27881, 27891, 27896, 27900, 27903, 27906, 27914, 27922, 27931,
+ 27941, 27950, 27956, 27970, 2663, 27992, 28003, 28012, 28022, 28034,
+ 28043, 28052, 28062, 28070, 28078, 28087, 28092, 28103, 28108, 28119,
+ 28123, 28133, 28142, 28150, 28160, 28170, 28178, 28187, 28194, 28202,
+ 28209, 28218, 28222, 28230, 28237, 28245, 28252, 28263, 28278, 28285,
+ 28291, 28301, 28310, 28316, 28320, 28327, 28331, 14018, 28337, 28341,
+ 28346, 28353, 28357, 28361, 28369, 28377, 28383, 28392, 28399, 28404,
+ 28409, 28419, 23488, 28423, 28426, 28431, 28436, 28441, 28446, 28451,
+ 28456, 28461, 28466, 28472, 28477, 28482, 28488, 1218, 704, 28493, 28502,
+ 2364, 28509, 28514, 28518, 28524, 1267, 546, 318, 28529, 28538, 28546,
+ 28555, 28563, 28574, 28583, 28591, 28595, 28598, 28606, 28614, 28619,
+ 14762, 28625, 28631, 28637, 5872, 28642, 28646, 28652, 28656, 28663,
+ 1455, 28669, 28676, 9572, 28680, 28690, 28698, 28704, 28713, 28721,
+ 28727, 28735, 28742, 11103, 28748, 28755, 28760, 28767, 1496, 2147,
+ 28773, 28779, 28786, 28797, 28808, 28816, 28823, 28833, 28842, 28850,
+ 28859, 28866, 28873, 28886, 28897, 1272, 28916, 28921, 28929, 3575,
+ 28933, 28938, 28942, 1459, 24689, 28952, 28956, 28961, 28965, 3493,
+ 28971, 28979, 28986, 28997, 29005, 29013, 3576, 279, 29018, 29026, 29034,
+ 29041, 29047, 29052, 2216, 29059, 29065, 25975, 26205, 29071, 106, 29075,
+ 29079, 29085, 615, 9321, 29090, 29097, 29103, 2327, 29107, 29111, 15174,
+ 29114, 29119, 29126, 29132, 29137, 29145, 29152, 29158, 22338, 29162,
+ 29166, 3646, 16612, 29170, 29175, 29178, 29186, 29194, 29199, 29202,
+ 29209, 29219, 29231, 29236, 29240, 29248, 29255, 29261, 29268, 29275,
+ 29278, 29282, 29286, 1463, 29296, 29298, 29303, 29309, 29315, 29320,
+ 29325, 29330, 29335, 29340, 29345, 29350, 29355, 29360, 29365, 29370,
+ 29375, 29380, 29385, 29391, 29397, 29403, 29409, 29414, 29419, 29424,
+ 29430, 29435, 29440, 29445, 29451, 29456, 29462, 29467, 29472, 29477,
+ 29482, 29488, 29493, 29499, 29504, 29509, 29514, 29519, 29525, 29530,
+ 29536, 29541, 29546, 29551, 29556, 29561, 29566, 29571, 29576, 29581,
+ 29587, 29593, 29599, 29604, 29609, 29614, 29619, 29625, 29631, 29637,
+ 29643, 29649, 29655, 29660, 29666, 29671, 29676, 29681, 29686, 29692,
+ 2443, 29697, 2450, 2457, 2754, 29702, 2463, 2473, 29708, 29712, 29717,
+ 29722, 29728, 29733, 29738, 29742, 29747, 29753, 29758, 29763, 29768,
+ 29774, 29779, 29783, 29787, 29792, 29797, 29802, 29807, 29812, 29818,
+ 29824, 29829, 29833, 29838, 29844, 29848, 29853, 29858, 29863, 29868,
+ 29872, 29875, 29880, 29885, 29890, 29895, 29900, 29906, 29912, 29917,
+ 29922, 29926, 29931, 29936, 29941, 29946, 29951, 29955, 29960, 29965,
+ 29970, 29974, 29978, 29982, 29987, 29995, 30000, 30006, 30012, 30018,
+ 30023, 30027, 30030, 30035, 30040, 30044, 30049, 30053, 30058, 30062,
+ 30065, 30070, 17289, 30075, 30080, 30085, 30093, 21267, 28673, 9019,
+ 30098, 30103, 30107, 30112, 30116, 30120, 30125, 30129, 30132, 30135,
+ 30139, 30144, 30148, 30156, 30160, 30163, 30168, 30172, 30176, 30181,
+ 30186, 30190, 30196, 30201, 30206, 30213, 30220, 30224, 30227, 30233,
+ 30242, 30249, 30257, 30264, 30268, 30273, 30277, 30281, 30287, 30293,
+ 30297, 30303, 30308, 30313, 30320, 30326, 30332, 30338, 30344, 30351,
+ 30357, 30363, 30369, 30375, 30381, 30387, 30393, 30400, 30406, 30413,
+ 30419, 30425, 30431, 30437, 30443, 30449, 30455, 30461, 30467, 11411,
+ 30473, 30478, 30483, 30486, 30494, 30499, 30508, 30514, 30519, 30524,
+ 30529, 30533, 30538, 30543, 30548, 30553, 30558, 30565, 30572, 30578,
+ 30584, 30589, 16290, 30596, 30602, 30609, 30615, 30621, 30626, 30634,
+ 30639, 16069, 30643, 30648, 30653, 30659, 30664, 30669, 30673, 30678,
+ 30683, 30689, 30694, 30699, 30703, 30708, 30713, 30717, 30722, 30727,
+ 30732, 30736, 30741, 30746, 30751, 30755, 30759, 15280, 30763, 30772,
+ 30778, 30784, 30793, 30801, 30810, 30818, 30823, 30827, 30834, 30840,
+ 30844, 30847, 30852, 30861, 30869, 30874, 1495, 30880, 30883, 30887,
+ 22411, 22417, 30893, 30897, 30908, 30919, 30930, 30942, 30949, 30956,
+ 30961, 30965, 5909, 755, 21266, 30973, 30978, 30982, 30987, 30991, 30997,
+ 31002, 31008, 31013, 31019, 31024, 31030, 31035, 31041, 31047, 31053,
+ 31058, 31014, 31020, 31062, 31067, 31073, 31078, 31084, 31089, 31095,
+ 31100, 31025, 10414, 31104, 31036, 31042, 31048, 2831, 3423, 31110,
+ 31113, 31119, 31125, 31131, 31138, 31144, 31150, 31156, 31162, 31168,
+ 31174, 31180, 31186, 31192, 31198, 31204, 31210, 31217, 31223, 31229,
+ 31235, 31241, 31247, 31250, 31255, 31258, 31265, 31273, 31278, 31283,
+ 31289, 31294, 31299, 31303, 31308, 31314, 31319, 31325, 31330, 31336,
+ 31341, 31347, 31353, 31357, 31362, 31367, 31372, 31377, 31381, 31386,
+ 31391, 31396, 31402, 31408, 31414, 31420, 31425, 31429, 31432, 31438,
+ 31444, 31453, 31461, 31468, 31473, 31477, 31481, 31486, 15133, 31491,
+ 31499, 31505, 3683, 1377, 31510, 31514, 8005, 31520, 31526, 31533, 8014,
+ 31537, 31543, 31550, 31556, 31565, 31573, 31585, 31589, 31596, 31602,
+ 31606, 31609, 31618, 31626, 31015, 31631, 31641, 31651, 31661, 31667,
+ 31672, 31682, 31687, 31700, 31714, 31725, 31737, 31749, 31763, 31776,
+ 31788, 31800, 14587, 31814, 31819, 31824, 31828, 31832, 31836, 1780,
+ 27159, 31840, 31845, 31063, 31850, 31853, 31858, 31863, 31868, 31874,
+ 31880, 10091, 31885, 31892, 15684, 31898, 31903, 31908, 31912, 31917,
+ 31922, 31068, 31927, 31932, 31937, 31943, 31074, 31948, 31951, 31958,
+ 31966, 31972, 31978, 31984, 31995, 32000, 32007, 32014, 32021, 32029,
+ 32038, 32047, 32053, 32059, 32067, 31079, 32072, 32078, 32084, 31085,
+ 32089, 32094, 32102, 32110, 32116, 32123, 32129, 32136, 32143, 32149,
+ 32157, 32167, 32174, 32179, 32185, 32190, 32195, 32202, 32211, 32219,
+ 32224, 32230, 32237, 32245, 32251, 32256, 32262, 32271, 27936, 32278,
+ 32282, 32287, 32296, 32301, 32306, 32311, 12398, 32319, 32324, 32329,
+ 32334, 32338, 32343, 32348, 32355, 32360, 32365, 32370, 31090, 21203,
+ 32376, 2519, 244, 32379, 32382, 32386, 32390, 32400, 32408, 32412, 32419,
+ 32426, 32430, 32433, 32439, 32447, 32455, 32459, 32463, 32466, 32473,
+ 32477, 32481, 32488, 32496, 31026, 32503, 32511, 10151, 660, 308, 32523,
+ 32528, 32533, 32539, 32544, 32549, 3704, 32554, 32557, 32562, 32567,
+ 32572, 32577, 32582, 32589, 22512, 32594, 32599, 32604, 32609, 32614,
+ 32620, 32625, 32631, 31261, 32637, 32642, 32648, 32654, 32664, 32669,
+ 32674, 32678, 32683, 32688, 32693, 32698, 32711, 32716, 22289, 16692,
+ 3710, 32720, 32725, 32730, 32736, 32741, 32746, 32750, 32755, 32760,
+ 32766, 32771, 32776, 1382, 32780, 32785, 32790, 32795, 32799, 32804,
+ 32809, 32814, 32820, 32826, 32831, 32835, 32839, 32844, 32849, 32854,
+ 32858, 32866, 32870, 32876, 32880, 32887, 16485, 31037, 32893, 32900,
+ 32908, 32915, 32921, 32934, 32946, 32952, 32956, 2773, 32960, 32964,
+ 32468, 32973, 32984, 32989, 32994, 32999, 33003, 33008, 22422, 33012,
+ 33016, 33021, 31043, 21287, 33025, 33030, 33036, 33041, 33045, 33049,
+ 33052, 33056, 33062, 33073, 33085, 31049, 33090, 33093, 33097, 347,
+ 33102, 33107, 33112, 33117, 33122, 33127, 33133, 33138, 33143, 33149,
+ 33154, 33160, 33165, 33171, 33176, 33181, 33186, 33191, 33196, 33201,
+ 33206, 33211, 33217, 33222, 33227, 33232, 33237, 33242, 33247, 33252,
+ 33258, 33264, 33269, 33274, 33279, 33284, 33289, 33294, 33299, 33304,
+ 33309, 33314, 33319, 33324, 33329, 33334, 33339, 33344, 33349, 33354,
+ 33360, 313, 26, 33365, 33369, 33373, 33381, 33385, 33389, 33392, 33395,
+ 33397, 33402, 33406, 33411, 33415, 33420, 33424, 33429, 33433, 33436,
+ 33438, 33442, 33447, 33451, 33462, 33465, 33467, 33471, 33483, 33492,
+ 33496, 33500, 33506, 33511, 33520, 33526, 33531, 33536, 33540, 33545,
+ 33552, 33557, 33563, 33568, 33572, 33579, 25701, 25711, 33583, 33588,
+ 33593, 33598, 33605, 33609, 33616, 8113, 33622, 33631, 33639, 33654,
+ 33668, 33676, 33687, 33696, 33701, 7227, 33711, 33716, 33721, 33725,
+ 33728, 33732, 33737, 33741, 33748, 33753, 33758, 8912, 33768, 33770,
+ 33773, 33777, 33783, 33787, 33792, 33797, 33803, 33808, 33814, 33819,
+ 33829, 33838, 33846, 33851, 33857, 33862, 33869, 33873, 33881, 33888,
+ 33901, 33909, 33913, 33923, 33928, 33932, 33940, 33948, 33952, 33961,
+ 33967, 33972, 33980, 33990, 33999, 34008, 34017, 34028, 34036, 34047,
+ 34056, 34063, 34069, 34074, 34085, 34090, 34094, 34097, 34101, 34109,
+ 34115, 34123, 34130, 34136, 34141, 34147, 2418, 34151, 34153, 34158,
+ 34163, 34168, 34171, 34173, 34177, 34180, 34187, 34191, 9884, 34195,
+ 34201, 34211, 34216, 34222, 34226, 34231, 34244, 26087, 34250, 34259,
+ 17462, 34266, 34275, 31647, 34283, 34288, 34292, 34300, 34307, 34312,
+ 34316, 34321, 34325, 34333, 34339, 34345, 34350, 34354, 34357, 34362,
+ 34375, 34391, 22979, 34408, 34420, 34437, 34449, 34463, 22996, 23015,
+ 34475, 34487, 2680, 34501, 34506, 34511, 34516, 34520, 34527, 34539,
+ 34545, 34548, 34559, 34570, 34575, 32064, 695, 34579, 34583, 34587,
+ 34590, 34595, 34600, 34606, 34611, 34616, 34622, 34628, 34633, 34637,
+ 34642, 34647, 34652, 34656, 34659, 34665, 34670, 34675, 34680, 34684,
+ 34689, 34695, 34703, 26320, 34708, 34713, 34720, 34726, 34732, 34737,
+ 34745, 22521, 34752, 34757, 34762, 34767, 34771, 34774, 34779, 34783,
+ 34787, 34794, 34800, 34806, 34812, 34819, 34824, 34830, 33943, 34834,
+ 34838, 34843, 34856, 34861, 34867, 34875, 34882, 34890, 34900, 34906,
+ 34912, 34918, 34922, 34931, 34939, 34946, 34951, 34956, 10437, 34961,
+ 34969, 34976, 34982, 34992, 34997, 35003, 35011, 3608, 35018, 35025,
+ 3614, 35029, 35034, 35045, 35052, 35058, 35067, 35071, 4015, 35074,
+ 35081, 35087, 35093, 35101, 35111, 29042, 35118, 35126, 35131, 35137,
+ 35142, 25947, 35148, 35155, 35161, 35170, 23660, 35177, 35182, 35186,
+ 35194, 35202, 9600, 5895, 35209, 35213, 35215, 35219, 35224, 35226,
+ 35232, 35237, 35242, 35249, 32585, 35255, 35260, 35264, 35269, 35273,
+ 35282, 35286, 35292, 35299, 35305, 35312, 35317, 35326, 35331, 35335,
+ 35340, 35347, 35355, 35363, 35368, 21343, 35372, 35375, 35379, 35383,
+ 35387, 35390, 35392, 35400, 35404, 35411, 35415, 35419, 35427, 35434,
+ 35444, 35448, 35452, 35460, 35468, 35474, 35479, 35488, 13350, 35494,
+ 35503, 35508, 35515, 35523, 35531, 35539, 35546, 35553, 35560, 35567,
+ 35574, 35579, 35585, 35602, 35610, 35620, 35628, 35635, 407, 35639,
+ 35645, 35649, 35654, 33692, 35660, 35663, 35667, 35675, 3619, 35683,
+ 35689, 35695, 35704, 35714, 35721, 35727, 3625, 3631, 35736, 35743,
+ 35751, 35756, 35760, 35767, 35775, 35782, 35788, 35797, 35807, 35813,
+ 35821, 35830, 35837, 35845, 35852, 22019, 35856, 35863, 35869, 35879,
+ 35888, 35899, 35903, 35913, 35919, 35926, 35934, 35943, 35952, 35962,
+ 35973, 35980, 35985, 35992, 3029, 36000, 36006, 36011, 36017, 36023,
+ 36028, 36041, 36054, 36067, 36074, 36080, 36088, 36096, 36101, 36105,
+ 1469, 36109, 36114, 36119, 36124, 36129, 36135, 36140, 36145, 36150,
+ 36155, 36160, 36165, 36170, 36176, 36182, 36187, 36192, 36198, 36203,
+ 36208, 36213, 36219, 36224, 36229, 36234, 36239, 36245, 36250, 36255,
+ 36261, 36266, 36271, 36276, 36281, 36286, 36292, 36297, 36303, 36308,
+ 36314, 36319, 36324, 36329, 36335, 36341, 36347, 36353, 36359, 36365,
+ 36371, 36377, 36382, 36387, 36393, 36398, 36403, 36408, 36413, 36418,
+ 36423, 36428, 36434, 36439, 36444, 36450, 36456, 101, 36461, 36463,
+ 36467, 36471, 36475, 36480, 36484, 9521, 36488, 36494, 1741, 6280, 36500,
+ 36503, 36508, 36512, 36517, 36521, 36525, 36530, 10238, 36534, 36538,
+ 36542, 36546, 15372, 36551, 36555, 36560, 36565, 36570, 36574, 36581,
+ 26111, 36587, 36590, 36594, 36599, 36605, 36609, 36617, 36623, 36628,
+ 36632, 36638, 36642, 36646, 3462, 3467, 29234, 36649, 36653, 36657,
+ 36661, 36669, 36676, 36680, 36687, 36692, 317, 36697, 36701, 36707,
+ 36719, 36725, 36731, 36735, 36741, 36750, 36754, 36758, 36763, 36769,
+ 36774, 36778, 36783, 36787, 36791, 36798, 36804, 36809, 36824, 36839,
+ 36854, 36870, 36888, 10188, 36902, 36909, 36913, 36916, 36925, 36930,
+ 36934, 36942, 33894, 36950, 36954, 36964, 36975, 29204, 36988, 36992,
+ 37001, 37009, 9778, 14900, 37013, 22434, 37016, 30152, 37021, 9777,
+ 37026, 37032, 37037, 37043, 37048, 37054, 37059, 37065, 37070, 37076,
+ 37082, 37088, 37093, 37049, 37055, 37060, 37066, 37071, 37077, 37083,
+ 8126, 3874, 37097, 37105, 37109, 37112, 37116, 37121, 37126, 37132,
+ 37138, 37143, 37147, 25959, 37151, 37155, 37161, 37165, 9042, 37174,
+ 37181, 37185, 11868, 37192, 37198, 37203, 37210, 37217, 37224, 28550,
+ 8049, 37231, 37238, 37245, 37251, 37256, 37263, 37274, 37280, 37285,
+ 37290, 37295, 37302, 37050, 37306, 37316, 37327, 37333, 37338, 37343,
+ 37348, 37353, 37358, 37362, 37366, 37372, 37380, 2319, 865, 10254, 10266,
+ 10271, 10277, 37389, 10282, 10287, 10293, 37394, 37404, 37408, 10298,
+ 37413, 16890, 37416, 37421, 37425, 37430, 37435, 37442, 37449, 37453,
+ 37456, 37464, 10201, 37471, 37474, 37480, 37490, 5929, 37499, 37503,
+ 37511, 37515, 37525, 37531, 37542, 37548, 37554, 37559, 37565, 37571,
+ 37577, 37582, 37585, 37592, 37598, 37603, 37610, 37617, 37621, 37631,
+ 37644, 37653, 37662, 37673, 37686, 37697, 37706, 37717, 37722, 37731,
+ 37736, 10303, 37742, 37749, 37757, 37762, 37766, 37773, 37780, 3829, 16,
+ 37784, 37789, 16744, 37793, 37796, 37799, 28056, 37803, 28559, 37811,
+ 37815, 37819, 37822, 37828, 37072, 37834, 37842, 37848, 37855, 28039,
+ 37859, 28233, 37863, 37872, 37878, 37884, 37889, 37893, 37899, 37903,
+ 37911, 37919, 26177, 37925, 37932, 37938, 37943, 37948, 37952, 37958,
+ 37963, 37969, 4056, 791, 37976, 37980, 37983, 15262, 37995, 35826, 38006,
+ 38009, 38016, 38020, 38026, 38030, 38036, 38041, 38047, 38052, 38057,
+ 38061, 38065, 38070, 38075, 38085, 38091, 38104, 38110, 38116, 38123,
+ 38128, 38134, 38139, 16630, 1472, 1019, 31193, 31199, 38144, 31205,
+ 31218, 31224, 31230, 38150, 31236, 31242, 38156, 38162, 22, 38170, 38177,
+ 38181, 38185, 38193, 31953, 38197, 38201, 38208, 38213, 38217, 38222,
+ 38228, 38233, 38239, 38244, 38248, 38252, 38256, 38261, 38265, 38270,
+ 38274, 38281, 38286, 38290, 38295, 38299, 38304, 38308, 38313, 38319,
+ 15482, 15487, 38324, 38328, 38331, 38335, 21170, 38340, 38344, 38350,
+ 38357, 38362, 38372, 38377, 38385, 38389, 38392, 31968, 38396, 4109,
+ 38401, 38406, 38410, 38415, 38419, 38424, 13368, 38435, 38439, 38442,
+ 38447, 38451, 38455, 38458, 38462, 8145, 13384, 38465, 38468, 38474,
+ 38479, 38485, 38490, 38496, 38501, 38507, 38512, 38518, 38524, 38530,
+ 38535, 38539, 38543, 38552, 38568, 38584, 38594, 27946, 38601, 38605,
+ 38610, 38615, 38619, 38623, 35947, 38629, 38634, 38638, 38645, 38650,
+ 38654, 38658, 26979, 38664, 21438, 38669, 38676, 38684, 38690, 38697,
+ 38705, 38711, 38715, 38721, 38729, 38733, 38742, 9502, 38750, 38754,
+ 38762, 38769, 38774, 38779, 38783, 38786, 38790, 38793, 38797, 38804,
+ 38809, 38815, 26398, 31256, 38819, 38826, 38832, 38838, 38843, 38846,
+ 38848, 38855, 38862, 38868, 38872, 38875, 38879, 38883, 38887, 38892,
+ 38896, 38900, 38903, 38907, 38921, 23045, 38940, 38953, 38966, 38979,
+ 23063, 38994, 10490, 39009, 39015, 39019, 39023, 39030, 39035, 39039,
+ 39046, 39052, 39057, 39063, 39073, 39085, 39096, 39101, 39108, 39112,
+ 39116, 39119, 15878, 3677, 39127, 15509, 39140, 39147, 39151, 39155,
+ 39160, 39165, 39171, 39175, 39179, 39182, 7742, 15520, 39187, 39191,
+ 39197, 39206, 39211, 39218, 35803, 39224, 39229, 39233, 39238, 39245,
+ 39249, 39252, 39256, 39261, 14552, 39268, 39275, 1066, 39279, 39284,
+ 39289, 39295, 39300, 39305, 39309, 39319, 39324, 39330, 39335, 39341,
+ 39346, 39352, 39362, 39367, 39372, 39376, 7229, 7241, 39381, 39384,
+ 39391, 39397, 34059, 34066, 39406, 39410, 32016, 39418, 39429, 39437,
+ 35995, 39444, 39449, 39454, 39465, 39472, 39483, 32040, 21444, 39491,
+ 735, 39496, 39502, 28030, 39508, 39513, 39523, 39532, 39539, 39545,
+ 39549, 39552, 39559, 39565, 39572, 39578, 39588, 39596, 39602, 39608,
+ 39613, 39617, 39624, 39630, 39637, 38888, 535, 13805, 39643, 39648,
+ 39651, 39657, 39665, 1396, 39670, 39674, 39679, 39686, 39692, 39696,
+ 39700, 39705, 39714, 39721, 39731, 39737, 28074, 39754, 39763, 39771,
+ 39777, 39782, 39789, 39795, 39803, 39812, 39820, 39824, 39829, 39837,
+ 32049, 39843, 39862, 15811, 39876, 39892, 39906, 39912, 39917, 39922,
+ 39927, 39933, 32055, 39938, 39945, 39950, 39954, 345, 2936, 39961, 39966,
+ 39971, 27305, 39792, 39975, 39980, 39988, 39992, 39995, 40001, 40007,
+ 40011, 28129, 40014, 40019, 40023, 40026, 40031, 40035, 40040, 40045,
+ 40049, 40054, 40058, 40062, 21166, 21177, 40066, 40071, 40077, 26936,
+ 40082, 40086, 21253, 16059, 40089, 40094, 40099, 40104, 40109, 40114,
+ 40119, 40124, 447, 43, 31274, 31279, 31284, 31290, 31295, 31300, 40129,
+ 31304, 40133, 40137, 40141, 31309, 31315, 40155, 31326, 31331, 40163,
+ 40168, 31337, 40173, 40178, 40183, 40188, 40194, 40200, 40206, 31354,
+ 40219, 40225, 31358, 40229, 31363, 40234, 31368, 31373, 40237, 40242,
+ 40246, 30923, 40252, 13592, 40259, 40264, 31378, 40268, 40273, 40278,
+ 40283, 40287, 40292, 40297, 40303, 40308, 40313, 40319, 40325, 40330,
+ 40334, 40339, 40344, 40349, 40353, 40358, 40363, 40368, 40374, 40380,
+ 40386, 40391, 40395, 40400, 40404, 31382, 31387, 31392, 40408, 40412,
+ 40416, 31397, 31403, 31409, 31421, 40428, 25996, 40432, 40436, 40441,
+ 40446, 40451, 40456, 40460, 40464, 40474, 40479, 40484, 40488, 40492,
+ 40495, 40503, 31469, 40508, 1479, 40514, 40522, 40531, 40535, 40539,
+ 40547, 40553, 40561, 40577, 40581, 40585, 40590, 40605, 31506, 1749,
+ 12048, 40609, 1378, 40621, 40622, 40630, 40637, 40642, 40649, 40654,
+ 9372, 1114, 10325, 40661, 40666, 40669, 40672, 40681, 1286, 40686, 39036,
+ 40693, 40698, 22486, 2557, 40702, 10734, 40712, 40718, 2337, 2347, 40727,
+ 40736, 40746, 40757, 3293, 34212, 10377, 3807, 16668, 1291, 40762, 40770,
+ 40777, 40782, 40786, 40790, 23858, 10404, 40798, 40807, 40816, 40824,
+ 40831, 40842, 40847, 40860, 40873, 40885, 40897, 40909, 40922, 40933,
+ 40944, 40954, 40962, 40970, 40982, 40994, 41005, 41014, 41022, 41029,
+ 41041, 41048, 41057, 41064, 41077, 41082, 41092, 41097, 41103, 41108,
+ 37182, 41112, 41119, 41123, 41130, 41138, 2518, 41145, 41156, 41166,
+ 41175, 41183, 41193, 41201, 41211, 41220, 41225, 41231, 41237, 3709,
+ 41248, 41258, 41267, 41276, 41286, 41294, 41303, 41308, 41313, 41318,
+ 1705, 37, 41326, 41334, 41345, 41356, 16343, 41366, 41370, 41377, 41383,
+ 41388, 41392, 41403, 41413, 41422, 41433, 16717, 16722, 41438, 41447,
+ 41452, 41462, 41467, 41475, 41483, 41490, 41496, 7078, 228, 41500, 41506,
+ 41511, 41514, 2117, 39152, 41522, 41526, 41529, 1512, 41535, 13967, 1296,
+ 41540, 41553, 41567, 2643, 41585, 41597, 41609, 2657, 2674, 41623, 41636,
+ 2689, 41650, 41662, 2704, 41676, 1302, 1308, 1314, 10652, 41681, 41686,
+ 41691, 41695, 41710, 41725, 41740, 41755, 41770, 41785, 41800, 41815,
+ 41830, 41845, 41860, 41875, 41890, 41905, 41920, 41935, 41950, 41965,
+ 41980, 41995, 42010, 42025, 42040, 42055, 42070, 42085, 42100, 42115,
+ 42130, 42145, 42160, 42175, 42190, 42205, 42220, 42235, 42250, 42265,
+ 42280, 42295, 42310, 42325, 42340, 42355, 42370, 42385, 42400, 42415,
+ 42430, 42445, 42460, 42475, 42490, 42505, 42520, 42535, 42550, 42565,
+ 42580, 42595, 42610, 42625, 42640, 42655, 42670, 42685, 42700, 42715,
+ 42730, 42745, 42760, 42775, 42790, 42805, 42820, 42835, 42850, 42865,
+ 42880, 42895, 42910, 42925, 42940, 42955, 42970, 42985, 43000, 43015,
+ 43030, 43045, 43060, 43075, 43090, 43105, 43120, 43135, 43150, 43165,
+ 43180, 43195, 43210, 43225, 43240, 43255, 43270, 43285, 43300, 43315,
+ 43330, 43345, 43360, 43375, 43390, 43405, 43420, 43435, 43450, 43465,
+ 43480, 43495, 43510, 43525, 43540, 43555, 43570, 43585, 43600, 43615,
+ 43630, 43645, 43660, 43675, 43690, 43705, 43720, 43735, 43750, 43765,
+ 43780, 43795, 43810, 43825, 43840, 43855, 43870, 43885, 43900, 43915,
+ 43930, 43945, 43960, 43975, 43990, 44005, 44020, 44035, 44050, 44065,
+ 44080, 44095, 44110, 44125, 44140, 44155, 44170, 44185, 44200, 44215,
+ 44230, 44245, 44260, 44275, 44290, 44305, 44320, 44335, 44350, 44365,
+ 44380, 44395, 44410, 44425, 44440, 44455, 44470, 44485, 44500, 44515,
+ 44530, 44545, 44560, 44575, 44590, 44605, 44620, 44635, 44650, 44665,
+ 44680, 44695, 44710, 44725, 44740, 44755, 44770, 44785, 44800, 44815,
+ 44830, 44845, 44860, 44875, 44890, 44905, 44920, 44935, 44950, 44965,
+ 44980, 44995, 45010, 45025, 45040, 45055, 45070, 45085, 45100, 45115,
+ 45130, 45145, 45160, 45175, 45190, 45205, 45220, 45235, 45250, 45265,
+ 45280, 45295, 45310, 45325, 45340, 45355, 45370, 45385, 45400, 45415,
+ 45430, 45445, 45460, 45475, 45490, 45505, 45520, 45535, 45550, 45565,
+ 45580, 45595, 45610, 45625, 45640, 45655, 45670, 45685, 45700, 45715,
+ 45730, 45745, 45760, 45775, 45790, 45805, 45820, 45835, 45850, 45865,
+ 45880, 45895, 45910, 45925, 45940, 45955, 45970, 45985, 46000, 46015,
+ 46030, 46045, 46060, 46075, 46090, 46105, 46120, 46135, 46150, 46165,
+ 46180, 46195, 46210, 46225, 46240, 46255, 46270, 46285, 46300, 46315,
+ 46330, 46345, 46360, 46375, 46390, 46405, 46420, 46435, 46450, 46465,
+ 46480, 46495, 46510, 46525, 46540, 46555, 46570, 46585, 46600, 46615,
+ 46630, 46645, 46660, 46675, 46690, 46705, 46720, 46735, 46750, 46765,
+ 46780, 46795, 46810, 46825, 46840, 46855, 46870, 46885, 46900, 46915,
+ 46930, 46945, 46960, 46975, 46990, 47005, 47020, 47035, 47050, 47065,
+ 47080, 47095, 47110, 47125, 47140, 47155, 47170, 47185, 47200, 47215,
+ 47230, 47245, 47260, 47275, 47290, 47305, 47320, 47335, 47350, 47365,
+ 47380, 47395, 47410, 47425, 47440, 47455, 47470, 47485, 47500, 47515,
+ 47530, 47545, 47560, 47575, 47590, 47605, 47620, 47635, 47650, 47665,
+ 47680, 47695, 47710, 47725, 47740, 47755, 47770, 47785, 47800, 47815,
+ 47830, 47845, 47860, 47875, 47890, 47905, 47920, 47935, 47950, 47965,
+ 47980, 47995, 48010, 48025, 48040, 48055, 48070, 48085, 48100, 48115,
+ 48130, 48145, 48160, 48175, 48190, 48205, 48220, 48235, 48250, 48265,
+ 48280, 48295, 48310, 48325, 48340, 48355, 48370, 48385, 48400, 48415,
+ 48430, 48445, 48460, 48475, 48490, 48505, 48520, 48535, 48550, 48565,
+ 48580, 48595, 48610, 48625, 48640, 48655, 48670, 48685, 48700, 48715,
+ 48730, 48745, 48760, 48775, 48790, 48805, 48820, 48835, 48850, 48865,
+ 48880, 48895, 48910, 48925, 48940, 48955, 48970, 48985, 49000, 49015,
+ 49030, 49045, 49060, 49075, 49090, 49105, 49120, 49135, 49150, 49165,
+ 49180, 49195, 49210, 49225, 49240, 49255, 49270, 49285, 49300, 49315,
+ 49330, 49345, 49360, 49375, 49390, 49405, 49420, 49435, 49450, 49465,
+ 49480, 49495, 49511, 49527, 49543, 49559, 49575, 49591, 49607, 49623,
+ 49639, 49655, 49671, 49687, 49703, 49719, 49735, 49751, 49767, 49783,
+ 49799, 49815, 49831, 49847, 49863, 49879, 49895, 49911, 49927, 49943,
+ 49959, 49975, 49991, 50007, 50023, 50039, 50055, 50071, 50087, 50103,
+ 50119, 50135, 50151, 50167, 50183, 50199, 50215, 50231, 50247, 50263,
+ 50279, 50295, 50311, 50327, 50343, 50359, 50375, 50391, 50407, 50423,
+ 50439, 50455, 50471, 50487, 50503, 50519, 50535, 50551, 50567, 50583,
+ 50599, 50615, 50631, 50647, 50663, 50679, 50695, 50711, 50727, 50743,
+ 50759, 50775, 50791, 50807, 50823, 50839, 50855, 50871, 50887, 50903,
+ 50919, 50935, 50951, 50967, 50983, 50999, 51015, 51031, 51047, 51063,
+ 51079, 51095, 51111, 51127, 51143, 51159, 51175, 51191, 51207, 51223,
+ 51239, 51255, 51271, 51287, 51303, 51319, 51335, 51351, 51367, 51383,
+ 51399, 51415, 51431, 51447, 51463, 51479, 51495, 51511, 51527, 51543,
+ 51559, 51575, 51591, 51607, 51623, 51639, 51655, 51671, 51687, 51703,
+ 51719, 51735, 51751, 51767, 51783, 51799, 51815, 51831, 51847, 51863,
+ 51879, 51895, 51911, 51927, 51943, 51959, 51975, 51991, 52007, 52023,
+ 52039, 52055, 52071, 52087, 52103, 52119, 52135, 52151, 52167, 52183,
+ 52199, 52215, 52231, 52247, 52263, 52279, 52295, 52311, 52327, 52343,
+ 52359, 52375, 52391, 52407, 52423, 52439, 52455, 52471, 52487, 52503,
+ 52519, 52535, 52551, 52567, 52583, 52599, 52615, 52631, 52647, 52663,
+ 52679, 52695, 52711, 52727, 52743, 52759, 52775, 52791, 52807, 52823,
+ 52839, 52855, 52871, 52887, 52903, 52919, 52935, 52951, 52967, 52983,
+ 52999, 53015, 53031, 53047, 53063, 53079, 53095, 53111, 53127, 53143,
+ 53159, 53175, 53191, 53207, 53223, 53239, 53255, 53271, 53287, 53303,
+ 53319, 53335, 53351, 53367, 53383, 53399, 53415, 53431, 53447, 53463,
+ 53479, 53495, 53511, 53527, 53543, 53559, 53575, 53591, 53607, 53623,
+ 53639, 53655, 53671, 53687, 53703, 53719, 53735, 53751, 53767, 53783,
+ 53799, 53815, 53831, 53847, 53863, 53879, 53895, 53911, 53927, 53943,
+ 53959, 53975, 53991, 54007, 54023, 54039, 54055, 54071, 54087, 54103,
+ 54119, 54135, 54151, 54167, 54183, 54199, 54215, 54231, 54247, 54263,
+ 54279, 54295, 54311, 54327, 54343, 54359, 54375, 54391, 54407, 54423,
+ 54439, 54455, 54471, 54487, 54503, 54519, 54535, 54551, 54567, 54583,
+ 54599, 54615, 54631, 54647, 54663, 54679, 54695, 54711, 54727, 54743,
+ 54759, 54775, 54791, 54807, 54823, 54839, 54855, 54871, 54887, 54903,
+ 54919, 54935, 54951, 54967, 54983, 54999, 55015, 55031, 55047, 55063,
+ 55079, 55095, 55111, 55127, 55143, 55159, 55175, 55191, 55207, 55223,
+ 55239, 55255, 55271, 55287, 55303, 55319, 55335, 55351, 55367, 55383,
+ 55399, 55415, 55431, 55447, 55463, 55479, 55495, 55511, 55527, 55543,
+ 55559, 55575, 55591, 55607, 55623, 55639, 55655, 55671, 55687, 55703,
+ 55719, 55735, 55751, 55767, 55783, 55799, 55815, 55831, 55847, 55863,
+ 55879, 55895, 55911, 55927, 55943, 55959, 55975, 55991, 56007, 56023,
+ 56039, 56055, 56071, 56087, 56103, 56119, 56135, 56151, 56167, 56183,
+ 56199, 56215, 56231, 56247, 56263, 56279, 56295, 56311, 56327, 56343,
+ 56359, 56375, 56391, 56407, 56423, 56439, 56455, 56471, 56487, 56503,
+ 56519, 56535, 56551, 56567, 56583, 56599, 56615, 56631, 56647, 56663,
+ 56679, 56695, 56711, 56727, 56743, 56759, 56775, 56791, 56807, 56823,
+ 56839, 56855, 56871, 56887, 56903, 56919, 56935, 56951, 56967, 56983,
+ 56999, 57015, 57031, 57047, 57063, 57079, 57095, 57111, 57127, 57143,
+ 57159, 57175, 57191, 57207, 57223, 57239, 57255, 57271, 57287, 57303,
+ 57319, 57335, 57351, 57367, 57383, 57399, 57415, 57431, 57447, 57463,
+ 57479, 57495, 57511, 57527, 57543, 57559, 57575, 57591, 57607, 57623,
+ 57639, 57655, 57671, 57687, 57703, 57719, 57735, 57751, 57767, 57783,
+ 57799, 57815, 57831, 57847, 57863, 57879, 57895, 57911, 57927, 57943,
+ 57959, 57975, 57991, 58007, 58023, 58039, 58055, 58071, 58087, 58103,
+ 58119, 58135, 58151, 58167, 58182, 16749, 58191, 58197, 58203, 58213,
+ 58221, 14881, 15432, 9953, 58234, 1520, 58242, 3761, 27415, 7183, 58248,
+ 58253, 58258, 58263, 58268, 58274, 58279, 58285, 58290, 58296, 58301,
+ 58306, 58311, 58316, 58322, 58327, 58332, 58337, 58342, 58347, 58352,
+ 58357, 58363, 58368, 58374, 58381, 2561, 58386, 58392, 8526, 58396,
+ 58401, 58408, 58416, 40, 58420, 58426, 58431, 58436, 58440, 58445, 58449,
+ 58453, 10677, 58457, 58467, 58480, 58491, 58504, 58511, 58517, 58522,
+ 58528, 58534, 58540, 58545, 58550, 58555, 58560, 58564, 58569, 58574,
+ 58579, 58585, 58591, 58597, 58602, 58606, 58611, 58616, 58620, 58625,
+ 58630, 58635, 58639, 10693, 10704, 10709, 1563, 58643, 1568, 58649,
+ 16226, 58652, 58658, 1599, 58664, 1605, 1611, 10739, 58669, 58677, 58684,
+ 58688, 58694, 58699, 30952, 58704, 58711, 58716, 58720, 58724, 1616,
+ 16318, 58733, 58737, 16329, 1120, 58741, 58748, 58753, 58757, 16354,
+ 1620, 37321, 58760, 58765, 58775, 58784, 58789, 58793, 58799, 1625,
+ 39230, 58804, 58813, 58819, 58824, 10897, 10903, 58830, 58842, 58859,
+ 58876, 58893, 58910, 58927, 58944, 58961, 58978, 58995, 59012, 59029,
+ 59046, 59063, 59080, 59097, 59114, 59131, 59148, 59165, 59182, 59199,
+ 59216, 59233, 59250, 59267, 59284, 59301, 59318, 59335, 59352, 59369,
+ 59386, 59403, 59420, 59437, 59454, 59471, 59488, 59505, 59522, 59539,
+ 59556, 59573, 59590, 59607, 59624, 59641, 59658, 59675, 59686, 59691,
+ 1630, 59695, 59701, 59706, 59711, 9319, 1635, 59717, 59726, 27710, 59731,
+ 59742, 59752, 59757, 59764, 59770, 59775, 59780, 16606, 59784, 10914,
+ 1640, 10919, 59790, 59795, 59801, 59806, 59811, 59816, 59821, 59826,
+ 59831, 59836, 59842, 59848, 59854, 59859, 59863, 59868, 59873, 59877,
+ 59882, 59887, 59892, 59896, 59901, 59907, 59912, 59917, 59921, 59926,
+ 59931, 59937, 59942, 59947, 59953, 59959, 59964, 59968, 59973, 59978,
+ 59983, 59987, 59992, 59997, 60002, 60008, 60014, 60019, 60023, 60027,
+ 60032, 60037, 60042, 29108, 60046, 60051, 60056, 60062, 60067, 60072,
+ 60076, 60081, 60086, 60092, 60097, 60102, 60108, 60114, 60119, 60123,
+ 60128, 60133, 60137, 60142, 60147, 60152, 60158, 60164, 60169, 60173,
+ 60178, 60183, 60187, 60192, 60197, 60202, 60206, 60209, 31614, 60214,
+ 60222, 16672, 3663, 11010, 60228, 60238, 60253, 11015, 60264, 60269,
+ 60280, 60292, 60304, 60316, 2695, 60328, 60333, 60345, 60349, 60355,
+ 60361, 60366, 1652, 1067, 60375, 60380, 39280, 60384, 60388, 60393,
+ 60397, 16757, 60402, 60405, 60413, 60421, 1656, 11040, 11046, 1661,
+ 60429, 60436, 60441, 60450, 60460, 60467, 60472, 60477, 1666, 60484,
+ 60489, 16872, 60493, 60498, 60505, 60511, 60515, 60526, 60536, 16894,
+ 9227, 9234, 1671, 60543, 60549, 60557, 60564, 60570, 60577, 60589, 60595,
+ 60600, 60612, 60623, 60632, 60642, 3740, 30788, 30797, 16934, 1676, 1680,
+ 60650, 60661, 60666, 1683, 60674, 60679, 16985, 60691, 60697, 60702,
+ 60710, 1688, 60715, 60720, 60728, 60736, 60743, 60752, 60760, 60769,
+ 1693, 60773, 1698, 60778, 60785, 17059, 60793, 60799, 60804, 60812,
+ 60819, 60827, 22557, 60832, 11175, 60841, 60847, 60854, 60861, 60867,
+ 60877, 60883, 60888, 60899, 60904, 60912, 11184, 11189, 60920, 60926,
+ 60934, 3805, 17101, 39368, 60939, 60945, 60950, 60958, 60965, 12029,
+ 60970, 60976, 1709, 60981, 60984, 1127, 60990, 60995, 61000, 61006,
+ 61011, 61016, 61021, 61026, 61031, 61036, 1718, 9, 61042, 61046, 61051,
+ 61055, 61059, 61063, 31854, 61068, 61073, 61078, 61082, 61085, 61089,
+ 61093, 61098, 61102, 61107, 61111, 34591, 34596, 34601, 61114, 61121,
+ 61127, 39089, 61137, 34607, 32112, 31869, 31875, 34623, 31881, 61142,
+ 61147, 32145, 61151, 61154, 61158, 61165, 61168, 61173, 61177, 61181,
+ 61184, 61194, 61206, 61213, 61219, 61226, 33548, 61229, 8543, 877, 61232,
+ 61236, 61241, 3690, 61245, 61248, 13625, 61255, 61262, 61275, 61283,
+ 61292, 61301, 61306, 61316, 61329, 61341, 61348, 61353, 61362, 61375,
+ 36035, 61393, 61398, 61405, 61411, 652, 61416, 61424, 61431, 27254, 627,
+ 61437, 61443, 61453, 61459, 61464, 31899, 6003, 31913, 61468, 61478,
+ 61483, 61493, 61508, 61514, 61520, 31923, 61525, 31069, 61529, 61534,
+ 61539, 61543, 61548, 16937, 61555, 61560, 61564, 6044, 31949, 61568,
+ 61574, 312, 61584, 61591, 61598, 61603, 61612, 58769, 61618, 61626,
+ 61630, 61634, 61638, 61642, 61647, 61651, 61657, 61665, 61670, 61675,
+ 61679, 61684, 61688, 61692, 61698, 61704, 61709, 61713, 32073, 61718,
+ 32079, 32085, 61723, 61729, 61736, 61741, 61745, 31086, 16599, 61748,
+ 61752, 61757, 61764, 61770, 61774, 61779, 38799, 61785, 61789, 61793,
+ 61798, 61804, 61810, 61822, 61831, 61841, 61847, 61854, 61859, 61864,
+ 61868, 61871, 61877, 61884, 61889, 61894, 61901, 61908, 61914, 61919,
+ 61924, 61932, 32090, 2423, 61937, 61942, 61948, 61953, 61959, 61964,
+ 61969, 61974, 61980, 32111, 61985, 61991, 61997, 62003, 32175, 62008,
+ 62013, 62018, 32186, 62023, 62028, 62033, 62039, 62045, 32191, 62050,
+ 62055, 62060, 32246, 32252, 62065, 62070, 32257, 62075, 27937, 32279,
+ 32283, 62080, 62056, 62084, 62092, 62098, 62106, 62113, 62119, 62129,
+ 62135, 62142, 10624, 32297, 62148, 62161, 62170, 62176, 62185, 62191,
+ 23495, 62198, 62205, 62215, 32247, 62218, 62225, 62230, 62234, 62238,
+ 62243, 6120, 62247, 62252, 62257, 34685, 34690, 62261, 34704, 62266,
+ 34709, 62271, 62277, 34721, 34727, 34733, 62282, 62288, 22522, 62299,
+ 62302, 62314, 62322, 32320, 62326, 62335, 62345, 62354, 32330, 62359,
+ 62366, 62375, 62381, 62389, 62396, 6095, 4397, 62401, 32258, 62407,
+ 62410, 62416, 62423, 62428, 62433, 23405, 62437, 62443, 62449, 62454,
+ 62459, 62463, 62469, 62475, 33458, 863, 35698, 36619, 36625, 32366,
+ 62480, 62484, 62488, 62491, 62504, 62510, 62514, 62517, 62522, 33761,
+ 62526, 31091, 21274, 62532, 6024, 6032, 9068, 62535, 62540, 62545, 62550,
+ 62555, 62560, 62565, 62570, 62575, 62580, 62586, 62591, 62596, 62602,
+ 62607, 62612, 62617, 62622, 62627, 62632, 62638, 62643, 62649, 62654,
+ 62659, 62664, 62669, 62674, 62679, 62684, 62689, 62694, 62699, 62705,
+ 62710, 62715, 62720, 62725, 62730, 62735, 62741, 62746, 62751, 62756,
+ 62761, 62766, 62771, 62776, 62781, 62786, 62792, 62797, 62802, 62807,
+ 62812, 62818, 62824, 62829, 62835, 62840, 62845, 62850, 62855, 62860,
+ 1513, 245, 62865, 62869, 62873, 62877, 25116, 62881, 62885, 62890, 62894,
+ 62899, 62903, 62908, 62913, 62918, 62922, 62926, 62931, 62935, 13362,
+ 62940, 62944, 62951, 62961, 15193, 62970, 62979, 62983, 62988, 62993,
+ 62997, 24907, 3019, 63001, 17350, 63007, 63016, 63024, 63030, 63042,
+ 63054, 63058, 63063, 63067, 63073, 63079, 63084, 63094, 63104, 63110,
+ 63115, 63119, 63124, 63130, 63139, 63148, 63156, 15547, 63160, 63169,
+ 63177, 63189, 63200, 63211, 63220, 63224, 63233, 63243, 63251, 63257,
+ 63262, 63268, 63273, 98, 30900, 63284, 26249, 26259, 63290, 63297, 63303,
+ 63307, 63317, 63328, 63336, 63345, 63350, 63355, 63359, 17304, 63367,
+ 63371, 63377, 63387, 63394, 63400, 34784, 63406, 63408, 63411, 63415,
+ 63425, 63431, 63438, 13308, 63445, 63451, 63460, 63469, 63475, 63481,
+ 63487, 63492, 63499, 63506, 63512, 63525, 63534, 63543, 63548, 63552,
+ 63558, 63565, 63572, 63579, 63586, 63593, 63598, 63602, 63606, 63609,
+ 63619, 63623, 63635, 63644, 63648, 63653, 63657, 63663, 63668, 63675,
+ 63684, 63692, 63700, 63705, 63709, 63714, 63719, 63729, 63737, 63742,
+ 63746, 63750, 63756, 63768, 63776, 63786, 63793, 63799, 63804, 63808,
+ 63812, 63816, 63825, 63834, 63843, 63849, 63855, 63861, 63866, 63873,
+ 63879, 63887, 63894, 12456, 63900, 63906, 63910, 14231, 63914, 63919,
+ 63929, 63938, 63944, 63950, 63958, 63965, 63969, 63973, 63979, 63987,
+ 63994, 64000, 64011, 64015, 64019, 64023, 64026, 64032, 64037, 64041,
+ 64045, 64054, 64062, 64069, 64075, 64082, 24029, 38841, 64087, 64095,
+ 64099, 64103, 64106, 64114, 64121, 64127, 64136, 64144, 64150, 64155,
+ 64159, 64164, 64168, 64172, 64177, 64186, 64190, 64197, 64204, 64210,
+ 64218, 64224, 64235, 64243, 64249, 22652, 64258, 64265, 64272, 64279,
+ 64286, 64293, 41870, 13146, 64300, 64307, 64312, 34820, 6217, 64318,
+ 64323, 64328, 64334, 64340, 64346, 64351, 64356, 64361, 64366, 64372,
+ 64377, 64383, 64388, 64394, 64399, 64404, 64409, 64414, 64419, 64424,
+ 64429, 64435, 64440, 64446, 64451, 64456, 64461, 64466, 64471, 64476,
+ 64482, 64487, 64492, 64497, 64502, 64507, 64512, 64517, 64522, 64527,
+ 64532, 64538, 64543, 64548, 64553, 64558, 64563, 64568, 64573, 64578,
+ 64584, 64589, 64594, 64599, 64604, 64609, 64614, 64619, 64624, 64629,
+ 64634, 64639, 64644, 64650, 1834, 224, 37417, 64655, 64658, 64663, 64667,
+ 64670, 64675, 63696, 64686, 64696, 64703, 64719, 64728, 64738, 64748,
+ 64756, 64770, 64778, 64782, 64785, 64792, 64798, 64809, 64821, 64832,
+ 64841, 64848, 1297, 23294, 64858, 2590, 64862, 64871, 1133, 17277, 38054,
+ 64879, 64887, 64901, 64914, 64918, 64923, 64928, 64933, 64939, 64945,
+ 64950, 8535, 64955, 64959, 64967, 11041, 64972, 64978, 64987, 1721,
+ 11053, 736, 64991, 65000, 65010, 27013, 65019, 65025, 16849, 65031,
+ 65035, 3964, 11384, 65041, 65048, 60656, 65052, 65056, 3988, 189, 14146,
+ 65062, 65074, 65078, 65084, 27730, 65088, 11372, 2730, 4, 65093, 65103,
+ 65109, 65120, 65127, 65133, 65139, 65147, 65154, 65160, 65170, 65180,
+ 65190, 23482, 1309, 65199, 65203, 65207, 65213, 65217, 2753, 2759, 8532,
+ 2264, 65221, 65225, 65234, 65242, 65253, 65261, 65269, 65275, 65280,
+ 65291, 65302, 65310, 65316, 9687, 65321, 65329, 65333, 65337, 65341,
+ 65353, 28115, 65360, 65370, 65376, 65382, 9789, 65392, 65403, 65413,
+ 65422, 65426, 65433, 1135, 1170, 65443, 65448, 65456, 65464, 65475,
+ 65482, 65496, 14075, 393, 65506, 65510, 65518, 65527, 65535, 65541,
+ 65555, 65562, 65568, 65577, 65584, 65594, 65602, 3812, 156, 65610, 65621,
+ 65625, 65637, 27928, 161, 65643, 65648, 65652, 65659, 65665, 65673,
+ 65680, 8818, 65687, 65696, 65704, 3878, 65717, 8199, 65721, 2798, 450,
+ 65726, 65739, 65744, 1833, 668, 65748, 3895, 65756, 65762, 65766, 931,
+ 65776, 65785, 65790, 14915, 14922, 45232, 65794, 3822, 13034, 65802,
+ 65809, 23538, 65813, 65820, 65826, 65831, 65836, 14935, 372, 65841,
+ 65853, 65859, 65867, 2810, 1753, 65875, 65877, 65882, 65887, 65892,
+ 65898, 65903, 65908, 65913, 65918, 65923, 65928, 65934, 65939, 65944,
+ 65949, 65954, 65959, 65964, 65969, 65974, 65980, 65985, 65990, 65995,
+ 66001, 66006, 66012, 66017, 66022, 66027, 66032, 66037, 66042, 66047,
+ 66053, 66058, 66064, 66069, 66074, 66079, 66084, 66089, 66094, 66099,
+ 66104, 66110, 66115, 66120, 66125, 66129, 66133, 66138, 66142, 66147,
+ 66152, 66158, 66163, 66167, 66172, 66176, 66179, 66181, 66185, 66188,
+ 66193, 66197, 66201, 66205, 66209, 66218, 66222, 32524, 66225, 32529,
+ 66232, 66237, 32534, 66246, 66255, 32540, 66260, 32545, 66269, 66274,
+ 11571, 66278, 66283, 66288, 32550, 66292, 40196, 66296, 66299, 66303,
+ 8211, 66309, 66314, 66318, 3705, 32555, 66321, 66325, 66328, 66333,
+ 66337, 66343, 66351, 66364, 66373, 66379, 66384, 66390, 66394, 66400,
+ 66408, 66413, 66417, 66424, 66430, 66438, 66447, 66455, 32558, 66462,
+ 66472, 66481, 66494, 66499, 66504, 66513, 66519, 66526, 66537, 66549,
+ 66556, 66565, 66574, 66583, 66590, 66596, 66603, 66611, 66618, 66626,
+ 66635, 66643, 66650, 66658, 66667, 66675, 66684, 66694, 66703, 66711,
+ 66718, 66726, 66735, 66743, 66752, 66762, 66771, 66779, 66788, 66798,
+ 66807, 66817, 66828, 66838, 66847, 66855, 66862, 66870, 66879, 66887,
+ 66896, 66906, 66915, 66923, 66932, 66942, 66951, 66961, 66972, 66982,
+ 66991, 66999, 67008, 67018, 67027, 67037, 67048, 67058, 67067, 67077,
+ 67088, 67098, 67109, 67121, 67132, 67142, 67151, 67159, 67166, 67174,
+ 67183, 67191, 67200, 67210, 67219, 67227, 67236, 67246, 67255, 67265,
+ 67276, 67286, 67295, 67303, 67312, 67322, 67331, 67341, 67352, 67362,
+ 67371, 67381, 67392, 67402, 67413, 67425, 67436, 67446, 67455, 67463,
+ 67472, 67482, 67491, 67501, 67512, 67522, 67531, 67541, 67552, 67562,
+ 67573, 67585, 67596, 67606, 67615, 67625, 67636, 67646, 67657, 67669,
+ 67680, 67690, 67701, 67713, 67724, 67736, 67749, 67761, 67772, 67782,
+ 67791, 67799, 67806, 67814, 67823, 67831, 67840, 67850, 67859, 67867,
+ 67876, 67886, 67895, 67905, 67916, 67926, 67935, 67943, 67952, 67962,
+ 67971, 67981, 67992, 68002, 68011, 68021, 68032, 68042, 68053, 68065,
+ 68076, 68086, 68095, 68103, 68112, 68122, 68131, 68141, 68152, 68162,
+ 68171, 68181, 68192, 68202, 68213, 68225, 68236, 68246, 68255, 68265,
+ 68276, 68286, 68297, 68309, 68320, 68330, 68341, 68353, 68364, 68376,
+ 68389, 68401, 68412, 68422, 68431, 68439, 68448, 68458, 68467, 68477,
+ 68488, 68498, 68507, 68517, 68528, 68538, 68549, 68561, 68572, 68582,
+ 68591, 68601, 68612, 68622, 68633, 68645, 68656, 68666, 68677, 68689,
+ 68700, 68712, 68725, 68737, 68748, 68758, 68767, 68777, 68788, 68798,
+ 68809, 68821, 68832, 68842, 68853, 68865, 68876, 68888, 68901, 68913,
+ 68924, 68934, 68945, 68957, 68968, 68980, 68993, 69005, 69016, 69028,
+ 69041, 69053, 69066, 69080, 69093, 69105, 69116, 69126, 69135, 69143,
+ 69150, 69155, 8058, 69162, 32568, 69167, 69172, 32573, 69178, 20916,
+ 32578, 69183, 69189, 69197, 69203, 69209, 69216, 69223, 69228, 69232,
+ 69235, 69239, 69248, 69254, 69266, 69277, 69281, 3081, 8033, 69286,
+ 69289, 69291, 69295, 69299, 69303, 69309, 69314, 25927, 69319, 69323,
+ 69326, 69331, 69335, 69342, 69348, 69352, 6170, 69356, 32595, 69361,
+ 69368, 69377, 69385, 69396, 69404, 69412, 69419, 69426, 69432, 69443,
+ 32600, 69448, 69459, 69471, 69479, 69490, 69499, 69510, 69515, 69523,
+ 2556, 69528, 34270, 69541, 69545, 69557, 69565, 69570, 69578, 17472,
+ 69589, 69595, 69602, 69610, 69616, 32610, 69621, 3914, 58217, 69628,
+ 69631, 69639, 69652, 69665, 69678, 69691, 69698, 69709, 69718, 41687,
+ 41692, 69723, 69727, 69735, 69742, 69751, 69759, 69765, 69774, 69782,
+ 69790, 69794, 69803, 69812, 69822, 69835, 69848, 69858, 32615, 69864,
+ 69871, 69877, 32621, 69882, 69885, 69889, 69897, 69906, 41425, 69914,
+ 69923, 69931, 69938, 69946, 69956, 69965, 69974, 69983, 69991, 70002,
+ 70012, 9359, 21554, 70021, 70026, 70031, 70035, 70039, 70044, 70050,
+ 70055, 70060, 70066, 70071, 70076, 21519, 70081, 70088, 70096, 70104,
+ 70109, 70116, 70123, 70128, 70132, 70136, 70144, 70152, 32638, 70158,
+ 70164, 70176, 70182, 70186, 70193, 70198, 70209, 70219, 70229, 70241,
+ 70247, 70257, 70267, 32665, 70276, 70285, 70291, 70303, 70314, 70321,
+ 70326, 70330, 70338, 70344, 70349, 70354, 70361, 70369, 70381, 70391,
+ 70400, 70409, 70416, 34132, 23834, 70422, 70427, 70431, 70435, 70440,
+ 70446, 70457, 70470, 70475, 70482, 32670, 70487, 70499, 70508, 70518,
+ 70529, 70542, 70549, 70558, 70567, 70575, 70580, 70586, 1058, 70591,
+ 70596, 70601, 70606, 70612, 70617, 70622, 70628, 70634, 70639, 70643,
+ 70648, 70653, 70658, 58729, 70663, 70668, 70673, 70678, 70684, 70690,
+ 70695, 70699, 70704, 70709, 70714, 70720, 70725, 70731, 70736, 70741,
+ 70746, 70751, 70755, 70761, 70766, 70775, 70780, 70785, 70790, 70795,
+ 70799, 70806, 70812, 17122, 17129, 70817, 70821, 70825, 70829, 70833,
+ 45487, 70837, 70767, 70839, 70849, 32679, 70852, 70861, 70867, 6143,
+ 32684, 70871, 70877, 70882, 70888, 70893, 70897, 70904, 70909, 70919,
+ 70928, 70932, 70938, 70944, 70950, 70954, 70962, 70969, 70977, 70985,
+ 32689, 70992, 70995, 71002, 71008, 71013, 71017, 71023, 71030, 71035,
+ 71039, 71048, 71056, 71062, 71067, 32694, 71074, 71081, 71087, 71092,
+ 71098, 71105, 71111, 21281, 27438, 71117, 71122, 71128, 71140, 70800,
+ 70807, 21457, 71150, 71155, 71162, 71168, 71175, 71181, 71192, 71197,
+ 9103, 71205, 71208, 71214, 71218, 71222, 71225, 71231, 32443, 6194, 964,
+ 13412, 71238, 71244, 71250, 71256, 71262, 71268, 71274, 71280, 71286,
+ 71291, 71296, 71301, 71306, 71311, 71316, 71321, 71326, 71331, 71336,
+ 71341, 71346, 71351, 71357, 71362, 71367, 71373, 71378, 71383, 71389,
+ 71395, 71401, 71407, 71413, 71419, 71425, 71431, 71437, 71442, 71447,
+ 71453, 71458, 71463, 71469, 71474, 71479, 71484, 71489, 71494, 71499,
+ 71504, 71509, 71514, 71519, 71524, 71529, 71535, 71540, 71545, 71550,
+ 71556, 71561, 71566, 71571, 71576, 71582, 71587, 71592, 71597, 71602,
+ 71607, 71612, 71617, 71622, 71627, 71632, 71637, 71642, 71647, 71652,
+ 71657, 71662, 71667, 71672, 71677, 71683, 71688, 71693, 71698, 71703,
+ 71708, 71713, 71718, 1864, 142, 71723, 71727, 71731, 71736, 71744, 71748,
+ 71755, 71763, 71767, 71780, 71788, 71792, 71795, 71800, 71804, 71809,
+ 71813, 71821, 71825, 20924, 71830, 71834, 60930, 71838, 71841, 71849,
+ 71857, 71865, 71870, 71877, 71883, 71889, 71894, 71901, 71906, 71914,
+ 64906, 71921, 71926, 71931, 71935, 11638, 71939, 71944, 71949, 71953,
+ 71956, 71962, 71966, 71976, 71985, 71988, 71992, 71999, 72012, 72018,
+ 72026, 72037, 72048, 72059, 72070, 72079, 72085, 72094, 72102, 72112,
+ 72125, 72132, 72143, 72149, 72154, 72159, 72165, 72171, 72181, 72190,
+ 70489, 72198, 72204, 72212, 72218, 72226, 72229, 72233, 72237, 72240,
+ 72246, 72252, 72260, 72272, 72284, 72291, 72295, 72306, 72314, 72321,
+ 72333, 72341, 72349, 72356, 72362, 72372, 72381, 72386, 72396, 72405,
+ 40751, 72412, 72416, 72421, 72429, 72436, 72442, 72446, 72456, 72467,
+ 72475, 72482, 72494, 72506, 72515, 69531, 72522, 72533, 72547, 72555,
+ 72565, 72572, 72580, 72592, 72601, 72609, 72619, 72630, 72642, 72651,
+ 72661, 72668, 72677, 72692, 72700, 72710, 72719, 72727, 72740, 72755,
+ 72759, 72768, 72780, 72791, 72802, 72813, 72823, 72834, 72842, 72848,
+ 72858, 72866, 72872, 29007, 72877, 72883, 72888, 72895, 9701, 17492,
+ 72901, 72910, 72915, 72919, 72926, 72932, 72937, 72942, 72950, 72958,
+ 72962, 72965, 72968, 72970, 72977, 72983, 72994, 72999, 73003, 73010,
+ 73016, 73021, 73029, 65405, 65415, 73035, 73042, 73052, 10611, 73059,
+ 73064, 29203, 73073, 73078, 73085, 73095, 73103, 73111, 73120, 73126,
+ 73132, 73139, 73146, 73151, 73155, 73163, 73168, 73173, 73181, 73188,
+ 73193, 73199, 73202, 73206, 73215, 71775, 73224, 73228, 73234, 73245,
+ 73255, 17501, 73266, 73274, 17513, 73281, 73285, 73294, 27324, 73301,
+ 73305, 73310, 73327, 73339, 10569, 73351, 73356, 73361, 73366, 20997,
+ 73370, 73375, 73380, 73386, 73391, 5846, 21001, 73396, 73401, 73407,
+ 73414, 73419, 73424, 73430, 73436, 73442, 73447, 73453, 73457, 73471,
+ 73479, 73487, 73493, 73498, 73505, 73515, 73524, 73529, 73534, 73542,
+ 73547, 73553, 73558, 73567, 59786, 73572, 73575, 73593, 73612, 73625,
+ 73639, 73655, 73662, 73669, 73675, 73682, 73687, 73693, 73699, 73707,
+ 73713, 73718, 73723, 73739, 10582, 73753, 73760, 73768, 73774, 73778,
+ 73781, 73786, 73791, 73798, 73803, 73812, 73817, 73823, 73832, 73841,
+ 73846, 73850, 73858, 73867, 11667, 73876, 73884, 73889, 73895, 11678,
+ 73900, 73903, 73908, 73918, 73927, 73932, 73938, 73943, 73951, 73958,
+ 73969, 73979, 73984, 64834, 73989, 73995, 74000, 74007, 74016, 74024,
+ 74030, 74036, 74043, 74049, 74053, 16947, 3055, 74058, 74062, 74066,
+ 74072, 74081, 74087, 74094, 74098, 74119, 74141, 74157, 74174, 74193,
+ 74202, 74212, 74219, 74226, 27211, 74232, 74236, 74244, 74256, 74262,
+ 74270, 74274, 74282, 74289, 74293, 74299, 74305, 74310, 3563, 41887,
+ 74316, 74320, 74324, 74328, 74333, 74338, 74343, 74349, 74355, 74361,
+ 74368, 74374, 74381, 74387, 74393, 74398, 74404, 74409, 74413, 74418,
+ 74422, 74427, 41902, 74431, 74436, 74444, 74448, 74453, 74460, 74469,
+ 74475, 74479, 74486, 74490, 74493, 74500, 74509, 74514, 74518, 74526,
+ 74535, 74539, 74547, 74553, 74558, 74563, 74569, 74575, 74580, 74584,
+ 74590, 74595, 74599, 74603, 74606, 74611, 74619, 74629, 74634, 39387,
+ 74642, 74654, 74658, 74664, 74676, 74687, 74694, 74700, 74707, 74719,
+ 74726, 74732, 21075, 74736, 74742, 74749, 74755, 74761, 74766, 74771,
+ 74776, 74785, 7033, 74790, 16413, 74796, 74800, 74804, 74808, 74816,
+ 74825, 74829, 74836, 74845, 74858, 74864, 74423, 30067, 74869, 74871,
+ 74876, 74881, 74886, 74891, 74896, 74901, 74906, 74911, 74916, 74921,
+ 74926, 74931, 74936, 74941, 74947, 74952, 74957, 74962, 74967, 74972,
+ 74977, 74982, 74987, 74993, 74999, 75005, 75010, 75015, 75027, 75032,
+ 1870, 49, 75037, 75042, 32721, 75046, 32726, 32731, 32737, 32742, 75050,
+ 32747, 22070, 75072, 75076, 75080, 75085, 75089, 32751, 75093, 75101,
+ 32756, 75108, 75111, 75116, 75120, 9536, 75129, 32761, 21932, 75132,
+ 75136, 1428, 75141, 32772, 75144, 75149, 25720, 25730, 35233, 75154,
+ 75159, 75164, 75169, 75175, 75180, 75189, 75194, 75201, 75207, 75212,
+ 75217, 75222, 75232, 75241, 75246, 75254, 75258, 75266, 32586, 37288,
+ 75273, 75279, 75284, 75289, 12009, 75294, 75300, 75305, 75312, 75318,
+ 75323, 75331, 75341, 75351, 75357, 75362, 75368, 17523, 75375, 36048,
+ 75388, 75393, 75399, 30968, 75412, 75418, 75422, 75431, 75438, 75444,
+ 75452, 75461, 75468, 75474, 75477, 75481, 25861, 75485, 75492, 75498,
+ 75506, 75511, 23977, 75517, 75520, 75528, 75536, 75550, 75557, 75563,
+ 75570, 75576, 32786, 75580, 75587, 75595, 75603, 75609, 32791, 75617,
+ 75623, 75628, 75638, 75644, 75653, 30805, 34691, 75661, 75666, 75671,
+ 75675, 75680, 75684, 75692, 14907, 39400, 75697, 75702, 32796, 62232,
+ 75706, 75711, 75715, 75724, 75732, 75738, 75743, 75749, 75756, 75762,
+ 75767, 75772, 75781, 75793, 75808, 33058, 75814, 16532, 32800, 75818,
+ 75825, 24087, 75831, 75838, 75847, 75854, 75863, 75869, 75874, 75882,
+ 75888, 32810, 75893, 75902, 74682, 75911, 75918, 75924, 75930, 75940,
+ 75948, 75955, 75959, 32815, 75962, 32821, 32827, 75967, 75975, 75983,
+ 75993, 76002, 76010, 76017, 76027, 32832, 76031, 76033, 76037, 76042,
+ 76046, 76050, 76056, 76061, 76065, 76076, 76081, 76086, 3060, 76090,
+ 76097, 76101, 76110, 76118, 76125, 76130, 76135, 62278, 76139, 76142,
+ 76148, 76156, 76162, 76166, 76171, 76178, 76183, 76189, 34722, 76194,
+ 76197, 76202, 76206, 76211, 76216, 76220, 76228, 76232, 25739, 25748,
+ 76238, 76244, 76250, 76255, 76259, 76262, 76272, 76281, 76286, 76292,
+ 76299, 76305, 76309, 76317, 76322, 34728, 76326, 76334, 76340, 76347,
+ 76352, 76356, 76361, 58403, 34734, 76367, 76372, 76376, 76381, 76386,
+ 76391, 76395, 76400, 76405, 76411, 76416, 76421, 76427, 76433, 76438,
+ 76442, 76447, 76452, 76457, 76461, 24086, 76466, 76471, 76477, 76483,
+ 76489, 76494, 76498, 76503, 76508, 76513, 76517, 76522, 76527, 76532,
+ 76537, 76541, 32840, 76549, 76553, 76561, 76569, 76580, 76585, 76589,
+ 22384, 76594, 76600, 76610, 76617, 76622, 76631, 76636, 76640, 76645,
+ 76653, 76661, 76668, 65068, 76674, 76682, 76689, 76700, 76706, 76710,
+ 76716, 32850, 76719, 76726, 76734, 76739, 39591, 76743, 76748, 76755,
+ 76760, 8985, 76764, 76772, 76779, 76786, 76792, 76806, 63340, 76814,
+ 76820, 76824, 76827, 76835, 76842, 76847, 76860, 76867, 76871, 76878,
+ 76883, 60823, 76888, 76891, 76898, 76904, 76908, 76916, 76925, 76935,
+ 76945, 76954, 76962, 76973, 76978, 76982, 76987, 76991, 35364, 76999,
+ 21344, 35373, 77004, 77009, 77014, 77019, 77024, 77029, 77034, 77038,
+ 77043, 77048, 77053, 77058, 77063, 77068, 77072, 77077, 77082, 77086,
+ 77090, 77094, 77098, 77103, 77108, 77112, 77117, 77121, 77125, 77130,
+ 77135, 77140, 77145, 77149, 77154, 77159, 77163, 77168, 77173, 77178,
+ 77183, 77188, 77193, 77198, 77203, 77208, 77213, 77218, 77223, 77228,
+ 77233, 77238, 77243, 77248, 77253, 77258, 77263, 77267, 77272, 77277,
+ 77282, 77287, 77292, 77297, 77302, 77307, 77312, 77317, 77322, 77326,
+ 77331, 77335, 77340, 77345, 77350, 77355, 77360, 77365, 77370, 77375,
+ 77380, 77384, 77388, 77393, 77398, 77402, 77407, 77412, 77416, 77421,
+ 77426, 77431, 77436, 77440, 77445, 77450, 77454, 77459, 77463, 77467,
+ 77471, 77475, 77480, 77484, 77488, 77492, 77496, 77500, 77504, 77508,
+ 77512, 77516, 77521, 77526, 77531, 77536, 77541, 77546, 77551, 77556,
+ 77561, 77566, 77570, 77574, 77578, 77582, 77586, 77590, 77595, 77599,
+ 77604, 77608, 77613, 77618, 77622, 77626, 77631, 77635, 77639, 77643,
+ 77647, 77651, 77655, 77659, 77663, 77667, 77671, 77675, 77679, 77683,
+ 77687, 77692, 77697, 77701, 77705, 77709, 77713, 77717, 77721, 77726,
+ 77730, 77734, 77738, 77742, 77746, 77750, 77755, 77759, 77764, 77768,
+ 77772, 77776, 77780, 77784, 77788, 77792, 77796, 77800, 77804, 77808,
+ 77813, 77817, 77821, 77825, 77829, 77833, 77837, 77841, 77845, 77849,
+ 77853, 77857, 77862, 77866, 77870, 77875, 77880, 77884, 77888, 77892,
+ 77896, 77900, 77904, 77908, 77912, 77917, 77921, 77926, 77930, 77935,
+ 77939, 77944, 77948, 77954, 77959, 77963, 77968, 77972, 77977, 77981,
+ 77986, 77990, 77995, 1521, 77999, 2824, 1759, 1764, 78003, 78007, 2828,
+ 78011, 1397, 78016, 1342, 78020, 2840, 78024, 78031, 78038, 78052, 2844,
+ 7131, 78061, 78069, 78076, 78087, 78096, 78103, 78115, 78128, 78141,
+ 78152, 78157, 78164, 78176, 78180, 2848, 11740, 78190, 78195, 78204,
+ 78214, 2852, 78219, 78223, 78228, 78235, 78241, 78249, 78261, 1347,
+ 13035, 78271, 78275, 78281, 78295, 78307, 78319, 78329, 78338, 78347,
+ 78356, 78364, 78375, 78383, 4051, 78393, 78404, 78413, 78419, 78434,
+ 78441, 78447, 35489, 78452, 2876, 13039, 78456, 78463, 8930, 78472, 2881,
+ 32336, 78478, 60572, 78485, 78491, 78502, 78508, 78515, 78521, 78529,
+ 78536, 78542, 78552, 78561, 78572, 78579, 78585, 78595, 78603, 78609,
+ 78624, 78630, 78635, 78642, 78645, 78651, 78658, 78664, 78672, 78681,
+ 78689, 78695, 78704, 41427, 78718, 78723, 78729, 14744, 78734, 78747,
+ 78756, 78764, 78771, 78775, 78779, 78782, 78789, 78796, 78804, 78812,
+ 78821, 78829, 14671, 78837, 78842, 78846, 78858, 78865, 78874, 748,
+ 78884, 78893, 78904, 2897, 78908, 78912, 78918, 78931, 78943, 78953,
+ 78962, 78974, 26352, 78985, 78993, 79002, 79013, 79024, 79034, 79044,
+ 79053, 79061, 11305, 79068, 79072, 79075, 79080, 79085, 79089, 79095,
+ 1352, 11811, 79102, 79113, 79122, 79130, 79139, 79147, 79163, 79174,
+ 79183, 79191, 79203, 79214, 79230, 79240, 79261, 79274, 79282, 79289,
+ 14855, 79302, 79307, 79313, 5908, 79319, 79322, 79329, 79339, 8176,
+ 79346, 79351, 79356, 79361, 79369, 79378, 79386, 9749, 9758, 79391,
+ 79402, 79407, 79413, 2913, 2918, 79419, 10872, 79425, 79432, 79439,
+ 79452, 2251, 68, 79457, 79462, 79472, 79478, 79487, 79495, 79505, 79509,
+ 79514, 79518, 79530, 2941, 79538, 79546, 79551, 79562, 79573, 79582,
+ 79587, 79593, 79598, 79608, 79618, 79623, 79629, 79634, 79643, 21397,
+ 79647, 4128, 20, 79652, 79661, 79668, 79675, 79681, 79687, 864, 79692,
+ 79697, 60900, 79702, 79707, 79713, 79719, 79727, 79732, 79739, 79745,
+ 79750, 38001, 41321, 79756, 2945, 32, 79766, 79779, 79784, 79792, 79797,
+ 79803, 2967, 28289, 79808, 79816, 79823, 79828, 58645, 61903, 79837,
+ 79841, 1704, 1813, 79846, 79851, 79858, 1817, 247, 79865, 79871, 2989,
+ 79876, 79881, 79888, 1821, 79893, 79899, 79904, 79916, 6119, 79926, 1828,
+ 79932, 79937, 79944, 79951, 79966, 79973, 79984, 79992, 2618, 79996,
+ 80008, 80013, 80017, 80023, 28114, 2256, 80027, 80038, 80042, 80046,
+ 80052, 80056, 80065, 80069, 80080, 80084, 2302, 32165, 80088, 80098,
+ 3080, 9364, 80106, 80111, 80115, 80124, 80131, 80137, 3050, 17139, 80141,
+ 80154, 80172, 80177, 80185, 80193, 80203, 9978, 13147, 80215, 80228,
+ 80235, 80242, 80258, 80265, 80271, 1095, 80278, 80285, 80295, 80304,
+ 80316, 42291, 80324, 3064, 12023, 80327, 80335, 80339, 78231, 3068,
+ 80343, 21178, 12039, 3756, 80347, 3074, 80351, 80361, 80367, 80373,
+ 80379, 80385, 80391, 80397, 80403, 80409, 80415, 80421, 80427, 80433,
+ 80439, 80445, 80451, 80457, 80463, 80469, 80475, 80481, 80487, 80493,
+ 80499, 80505, 80511, 80518, 80525, 80531, 80537, 80543, 80549, 80555,
+ 80561, 1357, 16049, 12061, 80567, 80572, 80577, 80582, 80587, 80592,
+ 80597, 80602, 80607, 80612, 80617, 80622, 80627, 80632, 80637, 80642,
+ 80647, 80652, 80657, 80662, 80667, 80672, 80677, 80682, 80687, 80692,
+ 80698, 80703, 80708, 80714, 80719, 80725, 80730, 80735, 80741, 80746,
+ 80751, 80756, 80761, 80766, 80771, 80776, 80781, 80362, 80368, 80374,
+ 80380, 80386, 80392, 80398, 80404, 80410, 80416, 80422, 80428, 80434,
+ 80440, 80446, 80787, 80452, 80458, 80464, 80793, 80470, 80476, 80482,
+ 80488, 80494, 80500, 80506, 80526, 80799, 80805, 80532, 80811, 80538,
+ 80544, 80550, 80556, 80562, 3091, 3096, 80817, 80822, 80825, 80831,
+ 80837, 80844, 80849, 80854, 2307,
};
/* code->name phrasebook */
#define phrasebook_shift 7
-#define phrasebook_short 211
+#define phrasebook_short 209
static unsigned char phrasebook[] = {
- 0, 219, 206, 244, 254, 77, 224, 143, 77, 50, 52, 247, 86, 52, 226, 57,
- 52, 254, 35, 253, 226, 42, 226, 131, 46, 226, 131, 253, 132, 94, 52, 249,
- 157, 240, 159, 243, 200, 219, 69, 219, 231, 21, 212, 79, 21, 116, 21,
- 109, 21, 166, 21, 163, 21, 180, 21, 189, 21, 198, 21, 195, 21, 200, 249,
- 164, 221, 70, 233, 39, 52, 245, 61, 52, 242, 107, 52, 224, 158, 77, 249,
- 156, 253, 122, 7, 6, 1, 61, 7, 6, 1, 253, 74, 7, 6, 1, 250, 252, 7, 6, 1,
- 249, 3, 7, 6, 1, 74, 7, 6, 1, 244, 230, 7, 6, 1, 243, 177, 7, 6, 1, 242,
- 41, 7, 6, 1, 72, 7, 6, 1, 235, 142, 7, 6, 1, 235, 27, 7, 6, 1, 150, 7, 6,
- 1, 183, 7, 6, 1, 204, 7, 6, 1, 75, 7, 6, 1, 226, 229, 7, 6, 1, 224, 240,
- 7, 6, 1, 149, 7, 6, 1, 197, 7, 6, 1, 218, 99, 7, 6, 1, 69, 7, 6, 1, 215,
- 79, 7, 6, 1, 214, 82, 7, 6, 1, 213, 166, 7, 6, 1, 213, 105, 7, 6, 1, 212,
- 152, 42, 41, 125, 223, 203, 219, 231, 46, 41, 125, 249, 224, 254, 174,
- 115, 232, 242, 242, 114, 254, 174, 7, 3, 1, 61, 7, 3, 1, 253, 74, 7, 3,
- 1, 250, 252, 7, 3, 1, 249, 3, 7, 3, 1, 74, 7, 3, 1, 244, 230, 7, 3, 1,
- 243, 177, 7, 3, 1, 242, 41, 7, 3, 1, 72, 7, 3, 1, 235, 142, 7, 3, 1, 235,
- 27, 7, 3, 1, 150, 7, 3, 1, 183, 7, 3, 1, 204, 7, 3, 1, 75, 7, 3, 1, 226,
- 229, 7, 3, 1, 224, 240, 7, 3, 1, 149, 7, 3, 1, 197, 7, 3, 1, 218, 99, 7,
- 3, 1, 69, 7, 3, 1, 215, 79, 7, 3, 1, 214, 82, 7, 3, 1, 213, 166, 7, 3, 1,
- 213, 105, 7, 3, 1, 212, 152, 42, 249, 40, 125, 71, 232, 242, 46, 249, 40,
- 125, 217, 42, 228, 184, 219, 206, 235, 191, 244, 254, 77, 250, 110, 52,
- 225, 108, 52, 249, 39, 52, 213, 31, 52, 251, 63, 134, 222, 92, 52, 247,
- 209, 249, 102, 52, 244, 105, 227, 21, 235, 235, 233, 66, 51, 254, 19,
- 224, 143, 77, 228, 163, 52, 219, 236, 240, 160, 223, 252, 52, 232, 37,
- 248, 22, 52, 225, 155, 52, 218, 223, 109, 218, 223, 166, 254, 164, 254,
- 174, 231, 41, 52, 225, 200, 52, 231, 37, 247, 74, 250, 117, 218, 223,
- 116, 231, 211, 227, 21, 235, 235, 223, 144, 51, 254, 19, 224, 143, 77,
- 214, 97, 243, 228, 122, 224, 166, 214, 97, 243, 228, 122, 242, 9, 214,
- 97, 243, 228, 133, 224, 164, 235, 191, 224, 158, 77, 7, 6, 1, 118, 2,
- 242, 113, 7, 6, 1, 118, 2, 179, 7, 6, 1, 118, 2, 249, 223, 7, 6, 1, 118,
- 2, 217, 42, 7, 6, 1, 118, 2, 247, 209, 7, 6, 1, 118, 2, 223, 131, 49, 7,
- 6, 1, 254, 148, 7, 6, 1, 250, 253, 2, 250, 117, 7, 6, 1, 191, 2, 242,
- 113, 7, 6, 1, 191, 2, 179, 7, 6, 1, 191, 2, 249, 223, 7, 6, 1, 191, 2,
- 247, 209, 7, 6, 1, 240, 146, 2, 242, 113, 7, 6, 1, 240, 146, 2, 179, 7,
- 6, 1, 240, 146, 2, 249, 223, 7, 6, 1, 240, 146, 2, 247, 209, 7, 6, 1,
- 245, 25, 7, 6, 1, 230, 98, 2, 217, 42, 7, 6, 1, 157, 2, 242, 113, 7, 6,
- 1, 157, 2, 179, 7, 6, 1, 157, 2, 249, 223, 7, 6, 1, 157, 2, 217, 42, 7,
- 6, 1, 157, 2, 247, 209, 230, 154, 52, 7, 6, 1, 157, 2, 90, 7, 6, 1, 111,
- 2, 242, 113, 7, 6, 1, 111, 2, 179, 7, 6, 1, 111, 2, 249, 223, 7, 6, 1,
- 111, 2, 247, 209, 7, 6, 1, 213, 106, 2, 179, 7, 6, 1, 217, 104, 7, 3, 1,
- 220, 255, 197, 7, 3, 1, 118, 2, 242, 113, 7, 3, 1, 118, 2, 179, 7, 3, 1,
- 118, 2, 249, 223, 7, 3, 1, 118, 2, 217, 42, 7, 3, 1, 118, 2, 247, 209, 7,
- 3, 1, 118, 2, 223, 131, 49, 7, 3, 1, 254, 148, 7, 3, 1, 250, 253, 2, 250,
- 117, 7, 3, 1, 191, 2, 242, 113, 7, 3, 1, 191, 2, 179, 7, 3, 1, 191, 2,
- 249, 223, 7, 3, 1, 191, 2, 247, 209, 7, 3, 1, 240, 146, 2, 242, 113, 7,
- 3, 1, 240, 146, 2, 179, 7, 3, 1, 240, 146, 2, 249, 223, 7, 3, 1, 240,
- 146, 2, 247, 209, 7, 3, 1, 245, 25, 7, 3, 1, 230, 98, 2, 217, 42, 7, 3,
- 1, 157, 2, 242, 113, 7, 3, 1, 157, 2, 179, 7, 3, 1, 157, 2, 249, 223, 7,
- 3, 1, 157, 2, 217, 42, 7, 3, 1, 157, 2, 247, 209, 247, 121, 52, 7, 3, 1,
- 157, 2, 90, 7, 3, 1, 111, 2, 242, 113, 7, 3, 1, 111, 2, 179, 7, 3, 1,
- 111, 2, 249, 223, 7, 3, 1, 111, 2, 247, 209, 7, 3, 1, 213, 106, 2, 179,
- 7, 3, 1, 217, 104, 7, 3, 1, 213, 106, 2, 247, 209, 7, 6, 1, 118, 2, 232,
- 37, 7, 3, 1, 118, 2, 232, 37, 7, 6, 1, 118, 2, 251, 74, 7, 3, 1, 118, 2,
- 251, 74, 7, 6, 1, 118, 2, 227, 90, 7, 3, 1, 118, 2, 227, 90, 7, 6, 1,
- 250, 253, 2, 179, 7, 3, 1, 250, 253, 2, 179, 7, 6, 1, 250, 253, 2, 249,
- 223, 7, 3, 1, 250, 253, 2, 249, 223, 7, 6, 1, 250, 253, 2, 62, 49, 7, 3,
- 1, 250, 253, 2, 62, 49, 7, 6, 1, 250, 253, 2, 250, 166, 7, 3, 1, 250,
- 253, 2, 250, 166, 7, 6, 1, 249, 4, 2, 250, 166, 7, 3, 1, 249, 4, 2, 250,
- 166, 7, 6, 1, 249, 4, 2, 90, 7, 3, 1, 249, 4, 2, 90, 7, 6, 1, 191, 2,
- 232, 37, 7, 3, 1, 191, 2, 232, 37, 7, 6, 1, 191, 2, 251, 74, 7, 3, 1,
- 191, 2, 251, 74, 7, 6, 1, 191, 2, 62, 49, 7, 3, 1, 191, 2, 62, 49, 7, 6,
- 1, 191, 2, 227, 90, 7, 3, 1, 191, 2, 227, 90, 7, 6, 1, 191, 2, 250, 166,
- 7, 3, 1, 191, 2, 250, 166, 7, 6, 1, 243, 178, 2, 249, 223, 7, 3, 1, 243,
- 178, 2, 249, 223, 7, 6, 1, 243, 178, 2, 251, 74, 7, 3, 1, 243, 178, 2,
- 251, 74, 7, 6, 1, 243, 178, 2, 62, 49, 7, 3, 1, 243, 178, 2, 62, 49, 7,
- 6, 1, 243, 178, 2, 250, 117, 7, 3, 1, 243, 178, 2, 250, 117, 7, 6, 1,
- 242, 42, 2, 249, 223, 7, 3, 1, 242, 42, 2, 249, 223, 7, 6, 1, 242, 42, 2,
- 90, 7, 3, 1, 242, 42, 2, 90, 7, 6, 1, 240, 146, 2, 217, 42, 7, 3, 1, 240,
- 146, 2, 217, 42, 7, 6, 1, 240, 146, 2, 232, 37, 7, 3, 1, 240, 146, 2,
- 232, 37, 7, 6, 1, 240, 146, 2, 251, 74, 7, 3, 1, 240, 146, 2, 251, 74, 7,
- 6, 1, 240, 146, 2, 227, 90, 7, 3, 1, 240, 146, 2, 227, 90, 7, 6, 1, 240,
- 146, 2, 62, 49, 7, 3, 1, 247, 73, 72, 7, 6, 26, 236, 26, 7, 3, 26, 236,
- 26, 7, 6, 1, 235, 143, 2, 249, 223, 7, 3, 1, 235, 143, 2, 249, 223, 7, 6,
- 1, 235, 28, 2, 250, 117, 7, 3, 1, 235, 28, 2, 250, 117, 7, 3, 1, 233,
- 248, 7, 6, 1, 233, 171, 2, 179, 7, 3, 1, 233, 171, 2, 179, 7, 6, 1, 233,
- 171, 2, 250, 117, 7, 3, 1, 233, 171, 2, 250, 117, 7, 6, 1, 233, 171, 2,
- 250, 166, 7, 3, 1, 233, 171, 2, 250, 166, 7, 6, 1, 233, 171, 2, 231, 37,
- 247, 74, 7, 3, 1, 233, 171, 2, 231, 37, 247, 74, 7, 6, 1, 233, 171, 2,
- 90, 7, 3, 1, 233, 171, 2, 90, 7, 6, 1, 230, 98, 2, 179, 7, 3, 1, 230, 98,
- 2, 179, 7, 6, 1, 230, 98, 2, 250, 117, 7, 3, 1, 230, 98, 2, 250, 117, 7,
- 6, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230,
- 98, 225, 84, 251, 7, 253, 226, 7, 6, 1, 245, 96, 7, 3, 1, 245, 96, 7, 6,
- 1, 157, 2, 232, 37, 7, 3, 1, 157, 2, 232, 37, 7, 6, 1, 157, 2, 251, 74,
- 7, 3, 1, 157, 2, 251, 74, 7, 6, 1, 157, 2, 51, 179, 7, 3, 1, 157, 2, 51,
- 179, 7, 6, 26, 227, 99, 7, 3, 26, 227, 99, 7, 6, 1, 224, 113, 2, 179, 7,
- 3, 1, 224, 113, 2, 179, 7, 6, 1, 224, 113, 2, 250, 117, 7, 3, 1, 224,
- 113, 2, 250, 117, 7, 6, 1, 224, 113, 2, 250, 166, 7, 3, 1, 224, 113, 2,
- 250, 166, 7, 6, 1, 223, 4, 2, 179, 7, 3, 1, 223, 4, 2, 179, 7, 6, 1, 223,
- 4, 2, 249, 223, 7, 3, 1, 223, 4, 2, 249, 223, 7, 6, 1, 223, 4, 2, 250,
- 117, 7, 3, 1, 223, 4, 2, 250, 117, 7, 6, 1, 223, 4, 2, 250, 166, 7, 3, 1,
- 223, 4, 2, 250, 166, 7, 6, 1, 218, 100, 2, 250, 117, 7, 3, 1, 218, 100,
- 2, 250, 117, 7, 6, 1, 218, 100, 2, 250, 166, 7, 3, 1, 218, 100, 2, 250,
- 166, 7, 6, 1, 218, 100, 2, 90, 7, 3, 1, 218, 100, 2, 90, 7, 6, 1, 111, 2,
- 217, 42, 7, 3, 1, 111, 2, 217, 42, 7, 6, 1, 111, 2, 232, 37, 7, 3, 1,
- 111, 2, 232, 37, 7, 6, 1, 111, 2, 251, 74, 7, 3, 1, 111, 2, 251, 74, 7,
- 6, 1, 111, 2, 223, 131, 49, 7, 3, 1, 111, 2, 223, 131, 49, 7, 6, 1, 111,
- 2, 51, 179, 7, 3, 1, 111, 2, 51, 179, 7, 6, 1, 111, 2, 227, 90, 7, 3, 1,
- 111, 2, 227, 90, 7, 6, 1, 214, 83, 2, 249, 223, 7, 3, 1, 214, 83, 2, 249,
- 223, 7, 6, 1, 213, 106, 2, 249, 223, 7, 3, 1, 213, 106, 2, 249, 223, 7,
- 6, 1, 213, 106, 2, 247, 209, 7, 6, 1, 212, 153, 2, 179, 7, 3, 1, 212,
- 153, 2, 179, 7, 6, 1, 212, 153, 2, 62, 49, 7, 3, 1, 212, 153, 2, 62, 49,
- 7, 6, 1, 212, 153, 2, 250, 166, 7, 3, 1, 212, 153, 2, 250, 166, 7, 3, 1,
- 184, 197, 7, 3, 1, 54, 2, 90, 7, 6, 1, 54, 2, 101, 7, 6, 1, 54, 2, 216,
- 224, 7, 3, 1, 54, 2, 216, 224, 7, 6, 1, 160, 189, 7, 3, 1, 160, 189, 7,
- 6, 1, 227, 40, 75, 7, 6, 1, 250, 253, 2, 101, 7, 3, 1, 250, 253, 2, 101,
- 7, 6, 1, 254, 124, 249, 3, 7, 6, 1, 249, 4, 2, 101, 7, 6, 1, 249, 4, 2,
- 216, 224, 7, 3, 1, 249, 4, 2, 216, 224, 7, 3, 1, 216, 58, 248, 5, 7, 6,
- 1, 223, 202, 74, 7, 6, 1, 222, 113, 7, 6, 1, 227, 40, 74, 7, 6, 1, 244,
- 231, 2, 101, 7, 3, 1, 244, 231, 2, 101, 7, 6, 1, 243, 178, 2, 101, 7, 6,
- 1, 243, 83, 7, 3, 1, 240, 193, 7, 6, 1, 235, 183, 7, 6, 1, 240, 146, 2,
- 90, 7, 6, 1, 235, 28, 2, 101, 7, 3, 1, 235, 28, 2, 101, 7, 3, 1, 233,
- 171, 2, 134, 7, 3, 1, 233, 124, 2, 90, 7, 6, 1, 216, 58, 183, 7, 6, 1,
- 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 184, 46, 233, 60, 7, 6, 1, 157,
- 2, 231, 37, 217, 42, 7, 6, 1, 157, 2, 240, 235, 7, 3, 1, 157, 2, 240,
- 235, 7, 6, 1, 227, 85, 7, 3, 1, 227, 85, 7, 6, 1, 226, 230, 2, 101, 7, 3,
- 1, 226, 230, 2, 101, 7, 1, 212, 205, 7, 6, 1, 160, 109, 7, 3, 1, 160,
- 109, 7, 6, 1, 245, 40, 7, 1, 223, 202, 245, 41, 232, 177, 7, 3, 1, 218,
- 100, 2, 226, 193, 101, 7, 6, 1, 218, 100, 2, 101, 7, 3, 1, 218, 100, 2,
- 101, 7, 6, 1, 218, 100, 2, 223, 207, 101, 7, 6, 1, 111, 2, 240, 235, 7,
- 3, 1, 111, 2, 240, 235, 7, 6, 1, 215, 128, 7, 6, 1, 215, 80, 2, 101, 7,
- 6, 1, 213, 106, 2, 101, 7, 3, 1, 213, 106, 2, 101, 7, 6, 1, 212, 153, 2,
- 90, 7, 3, 1, 212, 153, 2, 90, 7, 6, 1, 244, 232, 7, 6, 1, 244, 233, 223,
- 201, 7, 3, 1, 244, 233, 223, 201, 7, 3, 1, 244, 233, 2, 218, 27, 7, 1,
- 117, 2, 90, 7, 6, 1, 160, 180, 7, 3, 1, 160, 180, 7, 1, 235, 191, 242,
- 156, 219, 70, 2, 90, 7, 1, 213, 169, 7, 1, 247, 254, 249, 204, 7, 1, 233,
- 100, 249, 204, 7, 1, 254, 46, 249, 204, 7, 1, 223, 207, 249, 204, 7, 6,
- 1, 245, 251, 2, 250, 166, 7, 6, 1, 249, 4, 2, 3, 1, 212, 153, 2, 250,
- 166, 7, 3, 1, 245, 251, 2, 250, 166, 7, 6, 1, 232, 217, 7, 6, 1, 233,
- 171, 2, 3, 1, 235, 142, 7, 3, 1, 232, 217, 7, 6, 1, 229, 17, 7, 6, 1,
- 230, 98, 2, 3, 1, 235, 142, 7, 3, 1, 229, 17, 7, 6, 1, 118, 2, 250, 166,
- 7, 3, 1, 118, 2, 250, 166, 7, 6, 1, 240, 146, 2, 250, 166, 7, 3, 1, 240,
- 146, 2, 250, 166, 7, 6, 1, 157, 2, 250, 166, 7, 3, 1, 157, 2, 250, 166,
- 7, 6, 1, 111, 2, 250, 166, 7, 3, 1, 111, 2, 250, 166, 7, 6, 1, 111, 2,
- 247, 210, 24, 232, 37, 7, 3, 1, 111, 2, 247, 210, 24, 232, 37, 7, 6, 1,
- 111, 2, 247, 210, 24, 179, 7, 3, 1, 111, 2, 247, 210, 24, 179, 7, 6, 1,
- 111, 2, 247, 210, 24, 250, 166, 7, 3, 1, 111, 2, 247, 210, 24, 250, 166,
- 7, 6, 1, 111, 2, 247, 210, 24, 242, 113, 7, 3, 1, 111, 2, 247, 210, 24,
- 242, 113, 7, 3, 1, 216, 58, 74, 7, 6, 1, 118, 2, 247, 210, 24, 232, 37,
- 7, 3, 1, 118, 2, 247, 210, 24, 232, 37, 7, 6, 1, 118, 2, 62, 78, 24, 232,
- 37, 7, 3, 1, 118, 2, 62, 78, 24, 232, 37, 7, 6, 1, 254, 149, 2, 232, 37,
- 7, 3, 1, 254, 149, 2, 232, 37, 7, 6, 1, 243, 178, 2, 90, 7, 3, 1, 243,
- 178, 2, 90, 7, 6, 1, 243, 178, 2, 250, 166, 7, 3, 1, 243, 178, 2, 250,
- 166, 7, 6, 1, 235, 28, 2, 250, 166, 7, 3, 1, 235, 28, 2, 250, 166, 7, 6,
- 1, 157, 2, 227, 90, 7, 3, 1, 157, 2, 227, 90, 7, 6, 1, 157, 2, 227, 91,
- 24, 232, 37, 7, 3, 1, 157, 2, 227, 91, 24, 232, 37, 7, 6, 1, 244, 233, 2,
- 250, 166, 7, 3, 1, 244, 233, 2, 250, 166, 7, 3, 1, 235, 143, 2, 250, 166,
- 7, 6, 1, 245, 250, 7, 6, 1, 249, 4, 2, 3, 1, 212, 152, 7, 3, 1, 245, 250,
- 7, 6, 1, 243, 178, 2, 179, 7, 3, 1, 243, 178, 2, 179, 7, 6, 1, 240, 191,
- 7, 6, 1, 213, 169, 7, 6, 1, 230, 98, 2, 242, 113, 7, 3, 1, 230, 98, 2,
- 242, 113, 7, 6, 1, 118, 2, 223, 131, 78, 24, 179, 7, 3, 1, 118, 2, 223,
- 131, 78, 24, 179, 7, 6, 1, 254, 149, 2, 179, 7, 3, 1, 254, 149, 2, 179,
- 7, 6, 1, 157, 2, 219, 45, 24, 179, 7, 3, 1, 157, 2, 219, 45, 24, 179, 7,
- 6, 1, 118, 2, 51, 242, 113, 7, 3, 1, 118, 2, 51, 242, 113, 7, 6, 1, 118,
- 2, 235, 191, 251, 74, 7, 3, 1, 118, 2, 235, 191, 251, 74, 7, 6, 1, 191,
- 2, 51, 242, 113, 7, 3, 1, 191, 2, 51, 242, 113, 7, 6, 1, 191, 2, 235,
- 191, 251, 74, 7, 3, 1, 191, 2, 235, 191, 251, 74, 7, 6, 1, 240, 146, 2,
- 51, 242, 113, 7, 3, 1, 240, 146, 2, 51, 242, 113, 7, 6, 1, 240, 146, 2,
- 235, 191, 251, 74, 7, 3, 1, 240, 146, 2, 235, 191, 251, 74, 7, 6, 1, 157,
- 2, 51, 242, 113, 7, 3, 1, 157, 2, 51, 242, 113, 7, 6, 1, 157, 2, 235,
- 191, 251, 74, 7, 3, 1, 157, 2, 235, 191, 251, 74, 7, 6, 1, 224, 113, 2,
- 51, 242, 113, 7, 3, 1, 224, 113, 2, 51, 242, 113, 7, 6, 1, 224, 113, 2,
- 235, 191, 251, 74, 7, 3, 1, 224, 113, 2, 235, 191, 251, 74, 7, 6, 1, 111,
- 2, 51, 242, 113, 7, 3, 1, 111, 2, 51, 242, 113, 7, 6, 1, 111, 2, 235,
- 191, 251, 74, 7, 3, 1, 111, 2, 235, 191, 251, 74, 7, 6, 1, 223, 4, 2,
- 249, 158, 55, 7, 3, 1, 223, 4, 2, 249, 158, 55, 7, 6, 1, 218, 100, 2,
- 249, 158, 55, 7, 3, 1, 218, 100, 2, 249, 158, 55, 7, 6, 1, 212, 222, 7,
- 3, 1, 212, 222, 7, 6, 1, 242, 42, 2, 250, 166, 7, 3, 1, 242, 42, 2, 250,
- 166, 7, 6, 1, 230, 98, 2, 184, 46, 233, 60, 7, 3, 1, 249, 4, 2, 249, 41,
- 7, 6, 1, 227, 2, 7, 3, 1, 227, 2, 7, 6, 1, 212, 153, 2, 101, 7, 3, 1,
- 212, 153, 2, 101, 7, 6, 1, 118, 2, 62, 49, 7, 3, 1, 118, 2, 62, 49, 7, 6,
- 1, 191, 2, 250, 117, 7, 3, 1, 191, 2, 250, 117, 7, 6, 1, 157, 2, 247,
- 210, 24, 232, 37, 7, 3, 1, 157, 2, 247, 210, 24, 232, 37, 7, 6, 1, 157,
- 2, 217, 43, 24, 232, 37, 7, 3, 1, 157, 2, 217, 43, 24, 232, 37, 7, 6, 1,
- 157, 2, 62, 49, 7, 3, 1, 157, 2, 62, 49, 7, 6, 1, 157, 2, 62, 78, 24,
- 232, 37, 7, 3, 1, 157, 2, 62, 78, 24, 232, 37, 7, 6, 1, 213, 106, 2, 232,
- 37, 7, 3, 1, 213, 106, 2, 232, 37, 7, 3, 1, 233, 171, 2, 249, 41, 7, 3,
- 1, 230, 98, 2, 249, 41, 7, 3, 1, 218, 100, 2, 249, 41, 7, 3, 1, 247, 73,
- 235, 142, 7, 3, 1, 248, 89, 247, 172, 7, 3, 1, 224, 176, 247, 172, 7, 6,
- 1, 118, 2, 90, 7, 6, 1, 250, 253, 2, 90, 7, 3, 1, 250, 253, 2, 90, 7, 6,
- 1, 233, 171, 2, 134, 7, 6, 1, 218, 100, 2, 247, 207, 90, 7, 3, 1, 223, 4,
- 2, 218, 195, 218, 27, 7, 3, 1, 212, 153, 2, 218, 195, 218, 27, 7, 6, 1,
- 242, 156, 219, 69, 7, 3, 1, 242, 156, 219, 69, 7, 6, 1, 54, 2, 90, 7, 6,
- 1, 111, 134, 7, 6, 1, 216, 58, 215, 79, 7, 6, 1, 191, 2, 90, 7, 3, 1,
- 191, 2, 90, 7, 6, 1, 235, 143, 2, 90, 7, 3, 1, 235, 143, 2, 90, 7, 6, 1,
- 3, 224, 241, 2, 241, 38, 218, 27, 7, 3, 1, 224, 241, 2, 241, 38, 218, 27,
- 7, 6, 1, 224, 113, 2, 90, 7, 3, 1, 224, 113, 2, 90, 7, 6, 1, 213, 106, 2,
- 90, 7, 3, 1, 213, 106, 2, 90, 7, 3, 1, 216, 58, 61, 7, 3, 1, 254, 52, 7,
- 3, 1, 216, 58, 254, 52, 7, 3, 1, 54, 2, 101, 7, 3, 1, 227, 40, 75, 7, 3,
- 1, 250, 253, 2, 249, 41, 7, 3, 1, 249, 4, 2, 218, 27, 7, 3, 1, 249, 4, 2,
- 101, 7, 3, 1, 223, 202, 74, 7, 3, 1, 222, 113, 7, 3, 1, 222, 114, 2, 101,
- 7, 3, 1, 227, 40, 74, 7, 3, 1, 223, 202, 227, 40, 74, 7, 3, 1, 223, 202,
- 227, 40, 191, 2, 101, 7, 3, 1, 249, 193, 223, 202, 227, 40, 74, 7, 3, 1,
- 247, 73, 235, 143, 2, 90, 7, 3, 1, 243, 178, 2, 101, 7, 3, 1, 113, 243,
- 177, 7, 1, 3, 6, 243, 177, 7, 3, 1, 243, 83, 7, 3, 1, 224, 43, 240, 235,
- 7, 3, 1, 216, 58, 242, 41, 7, 3, 1, 242, 42, 2, 101, 7, 3, 1, 241, 192,
- 2, 101, 7, 3, 1, 240, 146, 2, 90, 7, 3, 1, 235, 183, 7, 1, 3, 6, 72, 7,
- 3, 1, 233, 171, 2, 231, 37, 217, 42, 7, 3, 1, 233, 171, 2, 251, 218, 7,
- 3, 1, 233, 171, 2, 223, 207, 101, 7, 3, 1, 233, 27, 7, 3, 1, 216, 58,
- 183, 7, 3, 1, 216, 58, 232, 110, 2, 184, 233, 60, 7, 3, 1, 232, 110, 2,
- 101, 7, 3, 1, 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 223, 207, 101, 7,
- 1, 3, 6, 204, 7, 3, 1, 252, 54, 75, 7, 1, 3, 6, 227, 99, 7, 3, 1, 249,
- 193, 227, 67, 7, 3, 1, 226, 9, 7, 3, 1, 216, 58, 149, 7, 3, 1, 216, 58,
- 224, 113, 2, 184, 233, 60, 7, 3, 1, 216, 58, 224, 113, 2, 101, 7, 3, 1,
- 224, 113, 2, 184, 233, 60, 7, 3, 1, 224, 113, 2, 218, 27, 7, 3, 1, 224,
- 113, 2, 244, 56, 7, 3, 1, 223, 202, 224, 113, 2, 244, 56, 7, 1, 3, 6,
- 149, 7, 1, 3, 6, 235, 191, 149, 7, 3, 1, 223, 4, 2, 101, 7, 3, 1, 245,
- 40, 7, 3, 1, 247, 73, 235, 143, 2, 219, 45, 24, 101, 7, 3, 1, 219, 163,
- 223, 202, 245, 40, 7, 3, 1, 245, 41, 2, 249, 41, 7, 3, 1, 216, 58, 218,
- 99, 7, 3, 1, 218, 100, 2, 223, 207, 101, 7, 3, 1, 111, 134, 7, 3, 1, 215,
- 128, 7, 3, 1, 215, 80, 2, 101, 7, 3, 1, 216, 58, 215, 79, 7, 3, 1, 216,
- 58, 214, 82, 7, 3, 1, 216, 58, 213, 105, 7, 1, 3, 6, 213, 105, 7, 3, 1,
- 212, 153, 2, 223, 207, 101, 7, 3, 1, 212, 153, 2, 249, 41, 7, 3, 1, 244,
- 232, 7, 3, 1, 244, 233, 2, 249, 41, 7, 1, 242, 156, 219, 69, 7, 1, 226,
- 15, 214, 116, 243, 219, 7, 1, 235, 191, 242, 156, 219, 69, 7, 1, 219, 50,
- 250, 252, 7, 1, 251, 169, 249, 204, 7, 1, 3, 6, 253, 74, 7, 3, 1, 249,
- 193, 227, 40, 74, 7, 1, 3, 6, 243, 178, 2, 101, 7, 1, 3, 6, 242, 41, 7,
- 3, 1, 235, 143, 2, 249, 67, 7, 3, 1, 216, 58, 235, 27, 7, 1, 3, 6, 150,
- 7, 3, 1, 224, 241, 2, 101, 7, 1, 242, 156, 219, 70, 2, 90, 7, 1, 223,
- 202, 242, 156, 219, 70, 2, 90, 7, 3, 1, 245, 251, 247, 172, 7, 3, 1, 247,
- 233, 247, 172, 7, 3, 1, 245, 251, 247, 173, 2, 249, 41, 7, 3, 1, 216,
- 143, 247, 172, 7, 3, 1, 217, 188, 247, 172, 7, 3, 1, 217, 236, 247, 173,
- 2, 249, 41, 7, 3, 1, 244, 103, 247, 172, 7, 3, 1, 232, 158, 247, 172, 7,
- 3, 1, 232, 111, 247, 172, 7, 1, 251, 169, 226, 56, 7, 1, 251, 177, 226,
- 56, 7, 3, 1, 216, 58, 242, 42, 2, 244, 56, 7, 3, 1, 216, 58, 242, 42, 2,
- 244, 57, 24, 218, 27, 59, 1, 3, 242, 41, 59, 1, 3, 242, 42, 2, 101, 59,
- 1, 3, 235, 142, 59, 1, 3, 149, 59, 1, 3, 216, 58, 149, 59, 1, 3, 216, 58,
- 224, 113, 2, 101, 59, 1, 3, 6, 235, 191, 149, 59, 1, 3, 214, 82, 59, 1,
- 3, 213, 105, 59, 1, 225, 71, 59, 1, 51, 225, 71, 59, 1, 216, 58, 249,
- 157, 59, 1, 253, 226, 59, 1, 223, 202, 249, 157, 59, 1, 46, 151, 223,
- 130, 59, 1, 42, 151, 223, 130, 59, 1, 242, 156, 219, 69, 59, 1, 223, 202,
- 242, 156, 219, 69, 59, 1, 42, 253, 164, 59, 1, 46, 253, 164, 59, 1, 114,
- 253, 164, 59, 1, 119, 253, 164, 59, 1, 249, 224, 254, 174, 250, 166, 59,
- 1, 71, 232, 242, 59, 1, 232, 37, 59, 1, 254, 164, 254, 174, 59, 1, 242,
- 114, 254, 174, 59, 1, 115, 71, 232, 242, 59, 1, 115, 232, 37, 59, 1, 115,
- 242, 114, 254, 174, 59, 1, 115, 254, 164, 254, 174, 59, 1, 216, 180, 249,
- 164, 59, 1, 151, 216, 180, 249, 164, 59, 1, 250, 107, 46, 151, 223, 130,
- 59, 1, 250, 107, 42, 151, 223, 130, 59, 1, 114, 218, 36, 59, 1, 119, 218,
- 36, 59, 1, 94, 52, 59, 1, 230, 251, 52, 251, 74, 62, 49, 223, 131, 49,
- 227, 90, 3, 217, 42, 51, 254, 164, 254, 174, 59, 1, 223, 189, 101, 59, 1,
- 249, 71, 254, 174, 59, 1, 3, 243, 83, 59, 1, 3, 150, 59, 1, 3, 197, 59,
- 1, 3, 213, 166, 59, 1, 3, 223, 202, 242, 156, 219, 69, 59, 1, 244, 244,
- 160, 134, 59, 1, 124, 160, 134, 59, 1, 231, 38, 160, 134, 59, 1, 115,
- 160, 134, 59, 1, 244, 243, 160, 134, 59, 1, 212, 245, 247, 251, 160, 77,
- 59, 1, 213, 59, 247, 251, 160, 77, 59, 1, 214, 114, 59, 1, 215, 156, 59,
- 1, 51, 253, 226, 59, 1, 115, 119, 253, 164, 59, 1, 115, 114, 253, 164,
- 59, 1, 115, 42, 253, 164, 59, 1, 115, 46, 253, 164, 59, 1, 115, 223, 130,
- 59, 1, 231, 37, 242, 114, 254, 174, 59, 1, 231, 37, 51, 242, 114, 254,
- 174, 59, 1, 231, 37, 51, 254, 164, 254, 174, 59, 1, 115, 217, 42, 59, 1,
- 224, 48, 249, 164, 59, 1, 251, 234, 124, 216, 241, 59, 1, 245, 101, 124,
- 216, 241, 59, 1, 251, 234, 115, 216, 241, 59, 1, 245, 101, 115, 216, 241,
- 59, 1, 220, 234, 59, 1, 227, 40, 220, 234, 59, 1, 115, 42, 68, 37, 242,
- 114, 254, 174, 37, 254, 164, 254, 174, 37, 249, 224, 254, 174, 37, 217,
- 42, 37, 232, 37, 37, 226, 243, 37, 251, 74, 37, 62, 49, 37, 247, 209, 37,
- 241, 38, 49, 37, 223, 131, 49, 37, 51, 254, 164, 254, 174, 37, 250, 166,
- 37, 71, 232, 243, 49, 37, 51, 71, 232, 243, 49, 37, 51, 242, 114, 254,
- 174, 37, 250, 187, 37, 235, 191, 251, 74, 37, 216, 58, 249, 158, 49, 37,
- 249, 158, 49, 37, 223, 202, 249, 158, 49, 37, 249, 158, 78, 223, 148, 37,
- 242, 114, 254, 175, 55, 37, 254, 164, 254, 175, 55, 37, 42, 218, 37, 55,
- 37, 46, 218, 37, 55, 37, 42, 254, 19, 49, 37, 240, 235, 37, 42, 151, 223,
- 131, 55, 37, 114, 218, 37, 55, 37, 119, 218, 37, 55, 37, 94, 5, 55, 37,
- 230, 251, 5, 55, 37, 226, 191, 241, 38, 55, 37, 223, 207, 241, 38, 55,
- 37, 62, 55, 37, 247, 210, 55, 37, 223, 131, 55, 37, 249, 158, 55, 37,
- 250, 117, 37, 227, 90, 37, 71, 232, 243, 55, 37, 251, 68, 55, 37, 235,
- 191, 51, 253, 194, 55, 37, 250, 167, 55, 37, 249, 224, 254, 175, 55, 37,
- 251, 75, 55, 37, 235, 191, 251, 75, 55, 37, 217, 43, 55, 37, 232, 38, 55,
- 37, 115, 232, 242, 37, 51, 115, 232, 242, 37, 217, 43, 226, 244, 37, 220,
- 175, 219, 45, 226, 244, 37, 184, 219, 45, 226, 244, 37, 220, 175, 219,
- 232, 226, 244, 37, 184, 219, 232, 226, 244, 37, 46, 151, 223, 131, 55,
- 37, 235, 191, 251, 68, 55, 37, 41, 55, 37, 222, 99, 55, 37, 213, 167, 49,
- 37, 71, 217, 42, 37, 51, 226, 243, 37, 242, 114, 160, 77, 37, 254, 164,
- 160, 77, 37, 25, 226, 50, 37, 25, 234, 11, 37, 25, 247, 204, 216, 231,
- 37, 25, 212, 210, 37, 251, 68, 49, 37, 245, 61, 5, 55, 37, 51, 71, 232,
- 243, 55, 37, 42, 254, 19, 55, 37, 228, 163, 217, 43, 49, 37, 241, 44, 49,
- 37, 254, 57, 123, 211, 211, 49, 37, 42, 46, 76, 55, 37, 215, 124, 76, 55,
- 37, 242, 118, 235, 66, 37, 46, 253, 165, 49, 37, 42, 151, 223, 131, 49,
- 37, 244, 100, 37, 213, 167, 55, 37, 42, 253, 165, 55, 37, 46, 253, 165,
- 55, 37, 46, 253, 165, 24, 114, 253, 165, 55, 37, 46, 151, 223, 131, 49,
- 37, 62, 78, 223, 148, 37, 253, 133, 55, 37, 51, 223, 131, 55, 37, 212,
- 28, 49, 37, 51, 251, 75, 55, 37, 51, 251, 74, 37, 51, 232, 37, 37, 51,
- 232, 38, 55, 37, 51, 217, 42, 37, 51, 235, 191, 251, 74, 37, 51, 95, 76,
- 55, 37, 7, 3, 1, 61, 37, 7, 3, 1, 74, 37, 7, 3, 1, 72, 37, 7, 3, 1, 75,
- 37, 7, 3, 1, 69, 37, 7, 3, 1, 250, 252, 37, 7, 3, 1, 249, 3, 37, 7, 3, 1,
- 242, 41, 37, 7, 3, 1, 183, 37, 7, 3, 1, 149, 37, 7, 3, 1, 218, 99, 37, 7,
- 3, 1, 215, 79, 37, 7, 3, 1, 213, 166, 25, 6, 1, 241, 181, 25, 3, 1, 241,
- 181, 25, 6, 1, 253, 193, 222, 161, 25, 3, 1, 253, 193, 222, 161, 25, 228,
- 54, 52, 25, 232, 163, 228, 54, 52, 25, 6, 1, 226, 178, 247, 179, 25, 3,
- 1, 226, 178, 247, 179, 25, 212, 210, 25, 3, 223, 202, 232, 141, 220, 104,
- 87, 25, 3, 246, 72, 232, 141, 220, 104, 87, 25, 3, 223, 202, 246, 72,
- 232, 141, 220, 104, 87, 25, 224, 158, 77, 25, 216, 231, 25, 247, 204,
- 216, 231, 25, 6, 1, 254, 53, 2, 216, 231, 25, 254, 8, 217, 211, 25, 6, 1,
- 245, 64, 2, 216, 231, 25, 6, 1, 245, 29, 2, 216, 231, 25, 6, 1, 235, 184,
- 2, 216, 231, 25, 6, 1, 227, 66, 2, 216, 231, 25, 6, 1, 215, 129, 2, 216,
- 231, 25, 6, 1, 227, 68, 2, 216, 231, 25, 3, 1, 235, 184, 2, 247, 204, 24,
- 216, 231, 25, 6, 1, 254, 52, 25, 6, 1, 251, 203, 25, 6, 1, 243, 83, 25,
- 6, 1, 248, 5, 25, 6, 1, 245, 63, 25, 6, 1, 212, 78, 25, 6, 1, 245, 28,
- 25, 6, 1, 217, 132, 25, 6, 1, 235, 183, 25, 6, 1, 234, 227, 25, 6, 1,
- 233, 122, 25, 6, 1, 230, 172, 25, 6, 1, 228, 92, 25, 6, 1, 213, 145, 25,
- 6, 1, 227, 65, 25, 6, 1, 225, 240, 25, 6, 1, 223, 190, 25, 6, 1, 220,
- 103, 25, 6, 1, 217, 248, 25, 6, 1, 215, 128, 25, 6, 1, 226, 9, 25, 6, 1,
- 250, 47, 25, 6, 1, 225, 46, 25, 6, 1, 227, 67, 25, 6, 1, 235, 184, 2,
- 247, 203, 25, 6, 1, 215, 129, 2, 247, 203, 25, 3, 1, 254, 53, 2, 216,
- 231, 25, 3, 1, 245, 64, 2, 216, 231, 25, 3, 1, 245, 29, 2, 216, 231, 25,
- 3, 1, 235, 184, 2, 216, 231, 25, 3, 1, 215, 129, 2, 247, 204, 24, 216,
- 231, 25, 3, 1, 254, 52, 25, 3, 1, 251, 203, 25, 3, 1, 243, 83, 25, 3, 1,
- 248, 5, 25, 3, 1, 245, 63, 25, 3, 1, 212, 78, 25, 3, 1, 245, 28, 25, 3,
- 1, 217, 132, 25, 3, 1, 235, 183, 25, 3, 1, 234, 227, 25, 3, 1, 233, 122,
- 25, 3, 1, 230, 172, 25, 3, 1, 228, 92, 25, 3, 1, 213, 145, 25, 3, 1, 227,
- 65, 25, 3, 1, 225, 240, 25, 3, 1, 223, 190, 25, 3, 1, 40, 220, 103, 25,
- 3, 1, 220, 103, 25, 3, 1, 217, 248, 25, 3, 1, 215, 128, 25, 3, 1, 226, 9,
- 25, 3, 1, 250, 47, 25, 3, 1, 225, 46, 25, 3, 1, 227, 67, 25, 3, 1, 235,
- 184, 2, 247, 203, 25, 3, 1, 215, 129, 2, 247, 203, 25, 3, 1, 227, 66, 2,
- 216, 231, 25, 3, 1, 215, 129, 2, 216, 231, 25, 3, 1, 227, 68, 2, 216,
- 231, 25, 6, 234, 251, 87, 25, 251, 204, 87, 25, 217, 133, 87, 25, 215,
- 129, 2, 241, 38, 87, 25, 215, 129, 2, 254, 164, 24, 241, 38, 87, 25, 215,
- 129, 2, 247, 210, 24, 241, 38, 87, 25, 226, 10, 87, 25, 225, 241, 87, 25,
- 234, 251, 87, 25, 1, 253, 193, 234, 15, 25, 3, 1, 253, 193, 234, 15, 25,
- 1, 219, 77, 25, 3, 1, 219, 77, 25, 1, 247, 179, 25, 3, 1, 247, 179, 25,
- 1, 234, 15, 25, 3, 1, 234, 15, 25, 1, 222, 161, 25, 3, 1, 222, 161, 79,
- 6, 1, 220, 235, 79, 3, 1, 220, 235, 79, 6, 1, 244, 109, 79, 3, 1, 244,
- 109, 79, 6, 1, 234, 123, 79, 3, 1, 234, 123, 79, 6, 1, 241, 32, 79, 3, 1,
- 241, 32, 79, 6, 1, 243, 78, 79, 3, 1, 243, 78, 79, 6, 1, 220, 202, 79, 3,
- 1, 220, 202, 79, 6, 1, 248, 20, 79, 3, 1, 248, 20, 25, 234, 228, 87, 25,
- 223, 191, 87, 25, 232, 141, 220, 104, 87, 25, 1, 212, 215, 25, 6, 217,
- 133, 87, 25, 232, 141, 245, 64, 87, 25, 223, 202, 232, 141, 245, 64, 87,
- 25, 6, 1, 220, 187, 25, 3, 1, 220, 187, 25, 6, 232, 141, 220, 104, 87,
- 25, 6, 1, 222, 159, 25, 3, 1, 222, 159, 25, 223, 191, 2, 219, 45, 87, 25,
- 6, 223, 202, 232, 141, 220, 104, 87, 25, 6, 246, 72, 232, 141, 220, 104,
- 87, 25, 6, 223, 202, 246, 72, 232, 141, 220, 104, 87, 33, 6, 1, 236, 56,
- 2, 242, 113, 33, 6, 1, 235, 187, 33, 6, 1, 247, 114, 33, 6, 1, 242, 163,
- 33, 6, 1, 215, 172, 236, 55, 33, 6, 1, 245, 247, 33, 6, 1, 251, 5, 72,
- 33, 6, 1, 212, 255, 33, 6, 1, 235, 127, 33, 6, 1, 232, 216, 33, 6, 1,
- 229, 9, 33, 6, 1, 216, 132, 33, 6, 1, 234, 57, 33, 6, 1, 240, 146, 2,
- 242, 113, 33, 6, 1, 220, 175, 69, 33, 6, 1, 245, 243, 33, 6, 1, 61, 33,
- 6, 1, 251, 251, 33, 6, 1, 214, 232, 33, 6, 1, 242, 212, 33, 6, 1, 248,
- 41, 33, 6, 1, 236, 55, 33, 6, 1, 212, 67, 33, 6, 1, 212, 87, 33, 6, 1,
- 72, 33, 6, 1, 220, 175, 72, 33, 6, 1, 181, 33, 6, 1, 245, 131, 33, 6, 1,
- 245, 117, 33, 6, 1, 245, 108, 33, 6, 1, 75, 33, 6, 1, 226, 96, 33, 6, 1,
- 245, 55, 33, 6, 1, 245, 45, 33, 6, 1, 217, 229, 33, 6, 1, 69, 33, 6, 1,
- 245, 159, 33, 6, 1, 159, 33, 6, 1, 216, 136, 33, 6, 1, 250, 67, 33, 6, 1,
- 221, 24, 33, 6, 1, 220, 245, 33, 6, 1, 241, 242, 52, 33, 6, 1, 213, 18,
- 33, 6, 1, 219, 236, 52, 33, 6, 1, 74, 33, 6, 1, 212, 203, 33, 6, 1, 186,
- 33, 3, 1, 61, 33, 3, 1, 251, 251, 33, 3, 1, 214, 232, 33, 3, 1, 242, 212,
- 33, 3, 1, 248, 41, 33, 3, 1, 236, 55, 33, 3, 1, 212, 67, 33, 3, 1, 212,
- 87, 33, 3, 1, 72, 33, 3, 1, 220, 175, 72, 33, 3, 1, 181, 33, 3, 1, 245,
- 131, 33, 3, 1, 245, 117, 33, 3, 1, 245, 108, 33, 3, 1, 75, 33, 3, 1, 226,
- 96, 33, 3, 1, 245, 55, 33, 3, 1, 245, 45, 33, 3, 1, 217, 229, 33, 3, 1,
- 69, 33, 3, 1, 245, 159, 33, 3, 1, 159, 33, 3, 1, 216, 136, 33, 3, 1, 250,
- 67, 33, 3, 1, 221, 24, 33, 3, 1, 220, 245, 33, 3, 1, 241, 242, 52, 33, 3,
- 1, 213, 18, 33, 3, 1, 219, 236, 52, 33, 3, 1, 74, 33, 3, 1, 212, 203, 33,
- 3, 1, 186, 33, 3, 1, 236, 56, 2, 242, 113, 33, 3, 1, 235, 187, 33, 3, 1,
- 247, 114, 33, 3, 1, 242, 163, 33, 3, 1, 215, 172, 236, 55, 33, 3, 1, 245,
- 247, 33, 3, 1, 251, 5, 72, 33, 3, 1, 212, 255, 33, 3, 1, 235, 127, 33, 3,
- 1, 232, 216, 33, 3, 1, 229, 9, 33, 3, 1, 216, 132, 33, 3, 1, 234, 57, 33,
- 3, 1, 240, 146, 2, 242, 113, 33, 3, 1, 220, 175, 69, 33, 3, 1, 245, 243,
- 33, 6, 1, 227, 67, 33, 3, 1, 227, 67, 33, 6, 1, 213, 49, 33, 3, 1, 213,
- 49, 33, 6, 1, 235, 181, 74, 33, 3, 1, 235, 181, 74, 33, 6, 1, 232, 221,
- 212, 174, 33, 3, 1, 232, 221, 212, 174, 33, 6, 1, 235, 181, 232, 221,
- 212, 174, 33, 3, 1, 235, 181, 232, 221, 212, 174, 33, 6, 1, 251, 172,
- 212, 174, 33, 3, 1, 251, 172, 212, 174, 33, 6, 1, 235, 181, 251, 172,
- 212, 174, 33, 3, 1, 235, 181, 251, 172, 212, 174, 33, 6, 1, 233, 242, 33,
- 3, 1, 233, 242, 33, 6, 1, 225, 46, 33, 3, 1, 225, 46, 33, 6, 1, 244, 51,
- 33, 3, 1, 244, 51, 33, 6, 1, 235, 144, 33, 3, 1, 235, 144, 33, 6, 1, 235,
- 145, 2, 51, 242, 114, 254, 174, 33, 3, 1, 235, 145, 2, 51, 242, 114, 254,
- 174, 33, 6, 1, 215, 175, 33, 3, 1, 215, 175, 33, 6, 1, 223, 87, 227, 67,
- 33, 3, 1, 223, 87, 227, 67, 33, 6, 1, 227, 68, 2, 217, 18, 33, 3, 1, 227,
- 68, 2, 217, 18, 33, 6, 1, 227, 8, 33, 3, 1, 227, 8, 33, 6, 1, 234, 15,
- 33, 3, 1, 234, 15, 33, 217, 99, 52, 37, 33, 217, 18, 37, 33, 226, 192,
- 37, 33, 207, 225, 152, 37, 33, 225, 40, 225, 152, 37, 33, 225, 137, 37,
- 33, 240, 201, 217, 99, 52, 37, 33, 231, 4, 52, 33, 6, 1, 220, 175, 240,
- 146, 2, 218, 27, 33, 3, 1, 220, 175, 240, 146, 2, 218, 27, 33, 6, 1, 221,
- 66, 52, 33, 3, 1, 221, 66, 52, 33, 6, 1, 245, 56, 2, 217, 68, 33, 3, 1,
- 245, 56, 2, 217, 68, 33, 6, 1, 242, 213, 2, 215, 127, 33, 3, 1, 242, 213,
- 2, 215, 127, 33, 6, 1, 242, 213, 2, 90, 33, 3, 1, 242, 213, 2, 90, 33, 6,
- 1, 242, 213, 2, 231, 37, 101, 33, 3, 1, 242, 213, 2, 231, 37, 101, 33, 6,
- 1, 212, 68, 2, 247, 246, 33, 3, 1, 212, 68, 2, 247, 246, 33, 6, 1, 212,
- 88, 2, 247, 246, 33, 3, 1, 212, 88, 2, 247, 246, 33, 6, 1, 235, 17, 2,
- 247, 246, 33, 3, 1, 235, 17, 2, 247, 246, 33, 6, 1, 235, 17, 2, 71, 90,
- 33, 3, 1, 235, 17, 2, 71, 90, 33, 6, 1, 235, 17, 2, 90, 33, 3, 1, 235,
- 17, 2, 90, 33, 6, 1, 252, 44, 181, 33, 3, 1, 252, 44, 181, 33, 6, 1, 245,
- 109, 2, 247, 246, 33, 3, 1, 245, 109, 2, 247, 246, 33, 6, 26, 245, 109,
- 242, 212, 33, 3, 26, 245, 109, 242, 212, 33, 6, 1, 226, 97, 2, 231, 37,
- 101, 33, 3, 1, 226, 97, 2, 231, 37, 101, 33, 6, 1, 254, 180, 159, 33, 3,
- 1, 254, 180, 159, 33, 6, 1, 245, 46, 2, 247, 246, 33, 3, 1, 245, 46, 2,
- 247, 246, 33, 6, 1, 217, 230, 2, 247, 246, 33, 3, 1, 217, 230, 2, 247,
- 246, 33, 6, 1, 219, 61, 69, 33, 3, 1, 219, 61, 69, 33, 6, 1, 219, 61,
- 111, 2, 90, 33, 3, 1, 219, 61, 111, 2, 90, 33, 6, 1, 242, 30, 2, 247,
- 246, 33, 3, 1, 242, 30, 2, 247, 246, 33, 6, 26, 217, 230, 216, 136, 33,
- 3, 26, 217, 230, 216, 136, 33, 6, 1, 250, 68, 2, 247, 246, 33, 3, 1, 250,
- 68, 2, 247, 246, 33, 6, 1, 250, 68, 2, 71, 90, 33, 3, 1, 250, 68, 2, 71,
- 90, 33, 6, 1, 220, 213, 33, 3, 1, 220, 213, 33, 6, 1, 254, 180, 250, 67,
- 33, 3, 1, 254, 180, 250, 67, 33, 6, 1, 254, 180, 250, 68, 2, 247, 246,
- 33, 3, 1, 254, 180, 250, 68, 2, 247, 246, 33, 1, 226, 185, 33, 6, 1, 212,
- 68, 2, 251, 74, 33, 3, 1, 212, 68, 2, 251, 74, 33, 6, 1, 235, 17, 2, 101,
- 33, 3, 1, 235, 17, 2, 101, 33, 6, 1, 245, 132, 2, 218, 27, 33, 3, 1, 245,
- 132, 2, 218, 27, 33, 6, 1, 245, 109, 2, 101, 33, 3, 1, 245, 109, 2, 101,
- 33, 6, 1, 245, 109, 2, 218, 27, 33, 3, 1, 245, 109, 2, 218, 27, 33, 6, 1,
- 234, 133, 250, 67, 33, 3, 1, 234, 133, 250, 67, 33, 6, 1, 245, 118, 2,
- 218, 27, 33, 3, 1, 245, 118, 2, 218, 27, 33, 3, 1, 226, 185, 33, 6, 1,
- 118, 2, 251, 74, 33, 3, 1, 118, 2, 251, 74, 33, 6, 1, 118, 2, 247, 209,
- 33, 3, 1, 118, 2, 247, 209, 33, 6, 26, 118, 236, 55, 33, 3, 26, 118, 236,
- 55, 33, 6, 1, 236, 56, 2, 251, 74, 33, 3, 1, 236, 56, 2, 251, 74, 33, 6,
- 1, 222, 113, 33, 3, 1, 222, 113, 33, 6, 1, 222, 114, 2, 247, 209, 33, 3,
- 1, 222, 114, 2, 247, 209, 33, 6, 1, 212, 68, 2, 247, 209, 33, 3, 1, 212,
- 68, 2, 247, 209, 33, 6, 1, 212, 88, 2, 247, 209, 33, 3, 1, 212, 88, 2,
- 247, 209, 33, 6, 1, 254, 180, 245, 247, 33, 3, 1, 254, 180, 245, 247, 33,
- 6, 1, 240, 146, 2, 232, 37, 33, 3, 1, 240, 146, 2, 232, 37, 33, 6, 1,
- 240, 146, 2, 247, 209, 33, 3, 1, 240, 146, 2, 247, 209, 33, 6, 1, 157, 2,
- 247, 209, 33, 3, 1, 157, 2, 247, 209, 33, 6, 1, 252, 54, 75, 33, 3, 1,
- 252, 54, 75, 33, 6, 1, 252, 54, 157, 2, 247, 209, 33, 3, 1, 252, 54, 157,
- 2, 247, 209, 33, 6, 1, 191, 2, 247, 209, 33, 3, 1, 191, 2, 247, 209, 33,
- 6, 1, 111, 2, 232, 37, 33, 3, 1, 111, 2, 232, 37, 33, 6, 1, 111, 2, 247,
- 209, 33, 3, 1, 111, 2, 247, 209, 33, 6, 1, 111, 2, 51, 179, 33, 3, 1,
- 111, 2, 51, 179, 33, 6, 1, 250, 68, 2, 247, 209, 33, 3, 1, 250, 68, 2,
- 247, 209, 33, 6, 1, 242, 213, 2, 247, 246, 33, 3, 1, 242, 213, 2, 247,
- 246, 33, 6, 1, 213, 19, 2, 247, 209, 33, 3, 1, 213, 19, 2, 247, 209, 33,
- 6, 1, 242, 213, 2, 219, 45, 24, 101, 33, 3, 1, 242, 213, 2, 219, 45, 24,
- 101, 33, 6, 1, 242, 30, 2, 101, 33, 3, 1, 242, 30, 2, 101, 33, 6, 1, 242,
- 30, 2, 90, 33, 3, 1, 242, 30, 2, 90, 33, 6, 1, 234, 23, 248, 41, 33, 3,
- 1, 234, 23, 248, 41, 33, 6, 1, 234, 23, 247, 114, 33, 3, 1, 234, 23, 247,
- 114, 33, 6, 1, 234, 23, 212, 20, 33, 3, 1, 234, 23, 212, 20, 33, 6, 1,
- 234, 23, 245, 241, 33, 3, 1, 234, 23, 245, 241, 33, 6, 1, 234, 23, 232,
- 216, 33, 3, 1, 234, 23, 232, 216, 33, 6, 1, 234, 23, 229, 9, 33, 3, 1,
- 234, 23, 229, 9, 33, 6, 1, 234, 23, 220, 37, 33, 3, 1, 234, 23, 220, 37,
- 33, 6, 1, 234, 23, 217, 13, 33, 3, 1, 234, 23, 217, 13, 33, 6, 1, 223,
- 202, 212, 87, 33, 3, 1, 223, 202, 212, 87, 33, 6, 1, 245, 132, 2, 101,
- 33, 3, 1, 245, 132, 2, 101, 33, 6, 1, 233, 25, 33, 3, 1, 233, 25, 33, 6,
- 1, 223, 192, 33, 3, 1, 223, 192, 33, 6, 1, 213, 80, 33, 3, 1, 213, 80,
- 33, 6, 1, 224, 232, 33, 3, 1, 224, 232, 33, 6, 1, 214, 6, 33, 3, 1, 214,
- 6, 33, 6, 1, 254, 75, 181, 33, 3, 1, 254, 75, 181, 33, 6, 1, 245, 132, 2,
- 231, 37, 101, 33, 3, 1, 245, 132, 2, 231, 37, 101, 33, 6, 1, 245, 109, 2,
- 231, 37, 101, 33, 3, 1, 245, 109, 2, 231, 37, 101, 33, 6, 1, 226, 97, 2,
- 247, 246, 33, 3, 1, 226, 97, 2, 247, 246, 33, 6, 1, 220, 214, 2, 247,
- 246, 33, 3, 1, 220, 214, 2, 247, 246, 141, 6, 1, 253, 80, 141, 6, 1, 251,
- 216, 141, 6, 1, 242, 179, 141, 6, 1, 248, 164, 141, 6, 1, 245, 169, 141,
- 6, 1, 212, 109, 141, 6, 1, 245, 154, 141, 6, 1, 245, 30, 141, 6, 1, 108,
- 141, 6, 1, 212, 67, 141, 6, 1, 235, 224, 141, 6, 1, 232, 219, 141, 6, 1,
- 213, 148, 141, 6, 1, 250, 219, 141, 6, 1, 234, 171, 141, 6, 1, 241, 54,
- 141, 6, 1, 235, 139, 141, 6, 1, 242, 222, 141, 6, 1, 250, 62, 141, 6, 1,
- 231, 122, 141, 6, 1, 212, 255, 141, 6, 1, 228, 150, 141, 6, 1, 221, 24,
- 141, 6, 1, 214, 119, 141, 6, 1, 250, 92, 141, 6, 1, 226, 80, 141, 6, 1,
- 235, 112, 141, 6, 1, 203, 141, 6, 1, 222, 80, 141, 6, 1, 214, 156, 141,
- 6, 1, 217, 15, 141, 6, 1, 223, 245, 141, 6, 1, 249, 175, 141, 6, 1, 212,
- 240, 141, 6, 1, 225, 178, 141, 6, 1, 234, 182, 141, 6, 1, 227, 88, 141,
- 6, 1, 244, 111, 141, 59, 1, 42, 151, 223, 130, 141, 253, 226, 141, 245,
- 112, 77, 141, 244, 254, 77, 141, 249, 157, 141, 224, 158, 77, 141, 254,
- 181, 77, 141, 3, 1, 253, 80, 141, 3, 1, 251, 216, 141, 3, 1, 242, 179,
- 141, 3, 1, 248, 164, 141, 3, 1, 245, 169, 141, 3, 1, 212, 109, 141, 3, 1,
- 245, 154, 141, 3, 1, 245, 30, 141, 3, 1, 108, 141, 3, 1, 212, 67, 141, 3,
- 1, 235, 224, 141, 3, 1, 232, 219, 141, 3, 1, 213, 148, 141, 3, 1, 250,
- 219, 141, 3, 1, 234, 171, 141, 3, 1, 241, 54, 141, 3, 1, 235, 139, 141,
- 3, 1, 242, 222, 141, 3, 1, 250, 62, 141, 3, 1, 231, 122, 141, 3, 1, 212,
- 255, 141, 3, 1, 228, 150, 141, 3, 1, 221, 24, 141, 3, 1, 214, 119, 141,
- 3, 1, 250, 92, 141, 3, 1, 226, 80, 141, 3, 1, 235, 112, 141, 3, 1, 203,
- 141, 3, 1, 222, 80, 141, 3, 1, 214, 156, 141, 3, 1, 217, 15, 141, 3, 1,
- 223, 245, 141, 3, 1, 249, 175, 141, 3, 1, 212, 240, 141, 3, 1, 225, 178,
- 141, 3, 1, 234, 182, 141, 3, 1, 227, 88, 141, 3, 1, 244, 111, 141, 3, 26,
- 245, 170, 212, 240, 141, 243, 200, 219, 69, 141, 240, 160, 93, 254, 175,
- 245, 23, 93, 254, 175, 222, 81, 93, 254, 175, 221, 11, 93, 254, 175, 212,
- 97, 224, 215, 93, 254, 175, 212, 97, 243, 100, 93, 254, 175, 217, 28, 93,
- 254, 175, 223, 200, 93, 254, 175, 212, 96, 93, 254, 175, 226, 118, 93,
- 254, 175, 213, 11, 93, 254, 175, 217, 167, 93, 254, 175, 243, 17, 93,
- 254, 175, 243, 18, 230, 139, 93, 254, 175, 243, 15, 93, 254, 175, 224,
- 216, 226, 144, 93, 254, 175, 217, 206, 243, 32, 93, 254, 175, 226, 100,
- 93, 254, 175, 253, 116, 242, 22, 93, 254, 175, 230, 149, 93, 254, 175,
- 232, 13, 93, 254, 175, 231, 113, 93, 254, 175, 231, 114, 234, 183, 93,
- 254, 175, 248, 108, 93, 254, 175, 224, 227, 93, 254, 175, 217, 206, 224,
- 211, 93, 254, 175, 213, 21, 251, 217, 212, 221, 93, 254, 175, 227, 73,
- 93, 254, 175, 236, 14, 93, 254, 175, 248, 21, 93, 254, 175, 212, 26, 93,
- 152, 231, 206, 249, 228, 93, 225, 145, 220, 216, 93, 225, 145, 241, 233,
- 222, 81, 93, 225, 145, 241, 233, 226, 112, 93, 225, 145, 241, 233, 224,
- 220, 93, 225, 145, 241, 144, 93, 225, 145, 216, 134, 93, 225, 145, 222,
- 81, 93, 225, 145, 226, 112, 93, 225, 145, 224, 220, 93, 225, 145, 241,
- 47, 93, 225, 145, 241, 48, 241, 235, 31, 214, 236, 93, 225, 145, 224,
- 162, 93, 225, 145, 248, 151, 167, 231, 234, 93, 225, 145, 231, 105, 93,
- 225, 27, 231, 231, 93, 225, 145, 224, 59, 93, 225, 27, 226, 120, 93, 225,
- 145, 220, 201, 247, 74, 93, 225, 145, 220, 85, 247, 74, 93, 225, 27, 219,
- 237, 226, 114, 93, 152, 215, 131, 247, 74, 93, 152, 232, 163, 247, 74,
- 93, 225, 27, 228, 51, 242, 21, 93, 225, 145, 224, 221, 224, 215, 93, 1,
- 254, 78, 93, 1, 251, 205, 93, 1, 242, 177, 93, 1, 248, 134, 93, 1, 241,
- 222, 93, 1, 214, 236, 93, 1, 212, 90, 93, 1, 241, 182, 93, 1, 217, 183,
- 93, 1, 212, 224, 93, 1, 40, 234, 254, 93, 1, 234, 254, 93, 1, 233, 118,
- 93, 1, 40, 231, 129, 93, 1, 231, 129, 93, 1, 40, 228, 50, 93, 1, 228, 50,
- 93, 1, 222, 164, 93, 1, 253, 78, 93, 1, 40, 226, 96, 93, 1, 226, 96, 93,
- 1, 40, 216, 137, 93, 1, 216, 137, 93, 1, 224, 184, 93, 1, 223, 219, 93,
- 1, 220, 200, 93, 1, 217, 245, 93, 26, 212, 253, 51, 214, 236, 93, 26,
- 212, 253, 214, 237, 212, 224, 93, 26, 212, 253, 51, 212, 224, 93, 225,
- 27, 243, 17, 93, 225, 27, 243, 15, 12, 50, 52, 12, 5, 222, 158, 12, 243,
- 255, 231, 217, 12, 5, 222, 192, 253, 207, 249, 50, 223, 95, 253, 207,
- 243, 230, 223, 95, 12, 224, 27, 253, 207, 226, 58, 231, 6, 52, 253, 207,
- 226, 58, 217, 201, 217, 101, 52, 254, 126, 52, 12, 249, 157, 12, 248, 96,
- 221, 57, 12, 225, 147, 214, 218, 52, 12, 5, 230, 243, 12, 5, 222, 174,
- 254, 80, 214, 29, 12, 5, 254, 80, 253, 137, 12, 5, 224, 58, 254, 79, 12,
- 5, 224, 65, 254, 61, 254, 14, 12, 5, 218, 20, 12, 3, 124, 218, 29, 12, 3,
- 124, 26, 106, 2, 233, 127, 2, 213, 34, 12, 3, 124, 212, 101, 12, 3, 244,
- 133, 12, 3, 248, 129, 12, 3, 234, 210, 12, 221, 70, 12, 216, 169, 62,
- 225, 27, 77, 12, 224, 158, 77, 12, 1, 234, 214, 213, 34, 12, 1, 242, 2,
- 12, 1, 106, 2, 232, 33, 49, 12, 1, 106, 2, 192, 49, 12, 1, 214, 15, 2,
- 192, 49, 12, 1, 106, 2, 192, 55, 12, 1, 73, 2, 192, 49, 12, 1, 254, 78,
- 12, 1, 251, 230, 12, 1, 217, 216, 231, 227, 12, 1, 217, 215, 12, 1, 217,
- 145, 12, 1, 235, 124, 12, 1, 242, 18, 12, 1, 234, 135, 12, 1, 248, 140,
- 12, 1, 217, 155, 12, 1, 223, 245, 12, 1, 212, 101, 12, 1, 222, 85, 12, 1,
- 220, 239, 12, 1, 222, 195, 12, 1, 248, 159, 12, 1, 218, 29, 12, 1, 212,
- 104, 12, 1, 254, 103, 12, 1, 242, 220, 12, 1, 234, 181, 2, 117, 176, 49,
- 12, 1, 234, 181, 2, 133, 176, 55, 12, 1, 244, 136, 73, 2, 235, 191, 215,
- 79, 12, 1, 244, 136, 73, 2, 117, 176, 49, 12, 1, 244, 136, 73, 2, 133,
- 176, 49, 12, 217, 250, 12, 1, 244, 111, 12, 1, 224, 225, 12, 1, 234, 254,
- 12, 1, 233, 126, 12, 1, 231, 143, 12, 1, 228, 173, 12, 1, 241, 202, 12,
- 1, 214, 14, 12, 1, 106, 231, 255, 12, 1, 213, 34, 12, 244, 131, 12, 248,
- 127, 12, 234, 208, 12, 244, 133, 12, 248, 129, 12, 234, 210, 12, 221, 15,
- 12, 218, 246, 12, 232, 31, 49, 12, 192, 49, 12, 192, 55, 12, 219, 10,
- 254, 78, 12, 235, 191, 248, 129, 12, 152, 228, 174, 242, 194, 12, 211,
- 250, 12, 30, 5, 3, 215, 80, 49, 12, 30, 5, 235, 191, 3, 215, 80, 49, 12,
- 30, 5, 62, 55, 12, 223, 202, 248, 129, 12, 244, 134, 2, 117, 247, 72, 12,
- 214, 16, 192, 55, 253, 207, 21, 212, 79, 253, 207, 21, 116, 253, 207, 21,
- 109, 253, 207, 21, 166, 253, 207, 21, 163, 253, 207, 21, 180, 253, 207,
- 21, 189, 253, 207, 21, 198, 253, 207, 21, 195, 253, 207, 21, 200, 12,
- 226, 57, 52, 12, 248, 34, 221, 57, 12, 217, 99, 221, 57, 12, 244, 50,
- 225, 143, 219, 95, 12, 1, 247, 73, 251, 230, 12, 1, 247, 73, 224, 225,
- 12, 1, 218, 223, 254, 78, 12, 1, 106, 214, 30, 12, 1, 106, 2, 214, 16,
- 192, 49, 12, 1, 106, 2, 214, 16, 192, 55, 12, 1, 124, 242, 2, 12, 1, 124,
- 192, 254, 78, 12, 1, 124, 192, 214, 14, 12, 1, 111, 2, 192, 49, 12, 1,
- 124, 192, 213, 34, 12, 1, 216, 109, 12, 1, 216, 107, 12, 1, 251, 240, 12,
- 1, 217, 216, 2, 223, 130, 12, 1, 217, 216, 2, 133, 176, 78, 246, 57, 12,
- 1, 226, 80, 12, 1, 217, 213, 12, 1, 251, 228, 12, 1, 121, 2, 192, 49, 12,
- 1, 121, 2, 117, 176, 71, 49, 12, 1, 228, 14, 12, 1, 245, 254, 12, 1, 121,
- 2, 133, 176, 49, 12, 1, 217, 233, 12, 1, 217, 231, 12, 1, 248, 81, 12, 1,
- 248, 141, 2, 223, 130, 12, 1, 248, 141, 2, 62, 55, 12, 1, 248, 141, 2,
- 62, 251, 220, 24, 3, 218, 29, 12, 1, 248, 146, 12, 1, 248, 83, 12, 1,
- 246, 25, 12, 1, 248, 141, 2, 133, 176, 78, 246, 57, 12, 1, 248, 141, 2,
- 243, 237, 176, 49, 12, 1, 223, 77, 12, 1, 223, 246, 2, 3, 215, 79, 12, 1,
- 223, 246, 2, 223, 130, 12, 1, 223, 246, 2, 62, 55, 12, 1, 223, 246, 2, 3,
- 215, 80, 55, 12, 1, 223, 246, 2, 62, 251, 220, 24, 62, 49, 12, 1, 223,
- 246, 2, 117, 176, 49, 12, 1, 235, 121, 12, 1, 223, 246, 2, 243, 237, 176,
- 49, 12, 1, 222, 86, 2, 62, 251, 220, 24, 62, 49, 12, 1, 222, 86, 2, 133,
- 176, 55, 12, 1, 222, 86, 2, 133, 176, 251, 220, 24, 133, 176, 49, 12, 1,
- 222, 196, 2, 117, 176, 55, 12, 1, 222, 196, 2, 133, 176, 49, 12, 1, 218,
- 30, 2, 133, 176, 49, 12, 1, 254, 104, 2, 133, 176, 49, 12, 1, 247, 73,
- 244, 111, 12, 1, 244, 112, 2, 62, 230, 179, 55, 12, 1, 244, 112, 2, 62,
- 55, 12, 1, 214, 225, 12, 1, 244, 112, 2, 133, 176, 55, 12, 1, 226, 78,
- 12, 1, 224, 226, 2, 62, 49, 12, 1, 224, 226, 2, 133, 176, 49, 12, 1, 234,
- 180, 12, 1, 218, 195, 234, 254, 12, 1, 234, 255, 2, 223, 130, 12, 1, 234,
- 255, 2, 62, 49, 12, 1, 229, 161, 12, 1, 234, 255, 2, 133, 176, 55, 12, 1,
- 243, 97, 12, 1, 243, 98, 2, 223, 130, 12, 1, 229, 88, 12, 1, 243, 98, 2,
- 117, 176, 55, 12, 1, 242, 82, 12, 1, 243, 98, 2, 133, 176, 49, 12, 1,
- 233, 127, 2, 3, 215, 79, 12, 1, 233, 127, 2, 62, 49, 12, 1, 233, 127, 2,
- 133, 176, 49, 12, 1, 233, 127, 2, 133, 176, 55, 12, 1, 228, 174, 2, 62,
- 55, 12, 1, 228, 174, 242, 194, 12, 1, 223, 115, 12, 1, 228, 174, 2, 223,
- 130, 12, 1, 228, 174, 2, 133, 176, 49, 12, 1, 241, 203, 247, 95, 12, 1,
- 217, 234, 2, 62, 49, 12, 1, 241, 203, 2, 73, 49, 12, 1, 241, 203, 242,
- 147, 12, 1, 241, 203, 242, 148, 2, 192, 49, 12, 1, 217, 216, 231, 228,
- 242, 147, 12, 1, 214, 15, 2, 223, 130, 12, 1, 234, 82, 227, 99, 12, 1,
- 227, 99, 12, 1, 69, 12, 1, 212, 203, 12, 1, 234, 82, 212, 203, 12, 1,
- 214, 15, 2, 117, 176, 49, 12, 1, 214, 232, 12, 1, 244, 136, 213, 34, 12,
- 1, 73, 2, 218, 27, 12, 1, 73, 2, 3, 215, 79, 12, 1, 214, 15, 2, 62, 49,
- 12, 1, 74, 12, 1, 73, 2, 133, 176, 55, 12, 1, 73, 252, 52, 12, 1, 73,
- 252, 53, 2, 192, 49, 12, 243, 200, 219, 69, 12, 1, 254, 148, 12, 3, 124,
- 26, 222, 196, 2, 233, 127, 2, 106, 231, 255, 12, 3, 124, 26, 224, 226, 2,
- 233, 127, 2, 106, 231, 255, 12, 3, 124, 63, 70, 17, 12, 3, 124, 233, 127,
- 254, 78, 12, 3, 124, 235, 124, 12, 3, 124, 133, 247, 72, 12, 3, 124, 222,
- 85, 12, 245, 101, 65, 253, 82, 12, 219, 91, 65, 223, 49, 245, 132, 241,
- 141, 12, 3, 124, 223, 85, 212, 79, 12, 3, 124, 215, 130, 224, 8, 212, 79,
- 12, 3, 124, 247, 73, 241, 220, 65, 234, 135, 12, 3, 124, 63, 48, 17, 12,
- 3, 115, 222, 85, 12, 3, 124, 232, 32, 12, 3, 214, 14, 12, 3, 213, 34, 12,
- 3, 124, 213, 34, 12, 3, 124, 228, 173, 12, 225, 173, 65, 222, 184, 12,
- 245, 110, 250, 109, 115, 219, 69, 12, 245, 110, 250, 109, 124, 219, 69,
- 12, 223, 85, 124, 219, 70, 2, 244, 73, 250, 108, 12, 3, 115, 231, 143,
- 12, 1, 248, 141, 2, 235, 191, 215, 79, 12, 1, 223, 246, 2, 235, 191, 215,
- 79, 244, 246, 253, 207, 21, 212, 79, 244, 246, 253, 207, 21, 116, 244,
- 246, 253, 207, 21, 109, 244, 246, 253, 207, 21, 166, 244, 246, 253, 207,
- 21, 163, 244, 246, 253, 207, 21, 180, 244, 246, 253, 207, 21, 189, 244,
- 246, 253, 207, 21, 198, 244, 246, 253, 207, 21, 195, 244, 246, 253, 207,
- 21, 200, 12, 1, 220, 240, 2, 62, 55, 12, 1, 248, 160, 2, 62, 55, 12, 1,
- 242, 221, 2, 62, 55, 12, 5, 220, 84, 254, 35, 12, 5, 220, 84, 225, 115,
- 231, 122, 12, 1, 241, 203, 2, 235, 191, 215, 79, 175, 245, 101, 65, 226,
- 142, 175, 218, 219, 243, 200, 219, 69, 175, 219, 12, 243, 200, 219, 69,
- 175, 218, 219, 249, 164, 175, 219, 12, 249, 164, 175, 199, 249, 164, 175,
- 249, 165, 220, 34, 233, 70, 175, 249, 165, 220, 34, 223, 148, 175, 218,
- 219, 249, 165, 220, 34, 233, 70, 175, 219, 12, 249, 165, 220, 34, 223,
- 148, 175, 249, 119, 175, 241, 240, 227, 114, 175, 241, 240, 231, 103,
- 175, 241, 240, 253, 134, 175, 254, 181, 77, 175, 1, 254, 82, 175, 1, 218,
- 223, 254, 82, 175, 1, 251, 202, 175, 1, 243, 89, 175, 1, 243, 90, 243,
- 67, 175, 1, 248, 137, 175, 1, 247, 73, 248, 138, 223, 126, 175, 1, 241,
- 222, 175, 1, 214, 14, 175, 1, 212, 101, 175, 1, 241, 180, 175, 1, 217,
- 179, 175, 1, 217, 180, 243, 67, 175, 1, 212, 190, 175, 1, 212, 191, 241,
- 222, 175, 1, 234, 230, 175, 1, 233, 125, 175, 1, 231, 3, 175, 1, 228, 50,
- 175, 1, 221, 63, 175, 1, 40, 221, 63, 175, 1, 74, 175, 1, 226, 96, 175,
- 1, 223, 202, 226, 96, 175, 1, 222, 193, 175, 1, 224, 219, 175, 1, 223,
- 126, 175, 1, 220, 200, 175, 1, 217, 243, 175, 1, 226, 45, 251, 190, 175,
- 1, 226, 45, 242, 218, 175, 1, 226, 45, 247, 228, 175, 225, 36, 49, 175,
- 225, 36, 55, 175, 225, 36, 246, 71, 175, 212, 10, 49, 175, 212, 10, 55,
- 175, 212, 10, 246, 71, 175, 224, 24, 49, 175, 224, 24, 55, 175, 246, 72,
- 212, 17, 241, 31, 175, 246, 72, 212, 17, 254, 15, 175, 241, 225, 49, 175,
- 241, 225, 55, 175, 241, 224, 246, 71, 175, 245, 43, 49, 175, 245, 43, 55,
- 175, 223, 19, 175, 244, 105, 247, 74, 175, 224, 137, 175, 223, 45, 175,
- 117, 71, 176, 49, 175, 117, 71, 176, 55, 175, 133, 176, 49, 175, 133,
- 176, 55, 175, 227, 112, 232, 243, 49, 175, 227, 112, 232, 243, 55, 175,
- 230, 126, 175, 252, 51, 175, 1, 219, 233, 212, 73, 175, 1, 219, 233, 234,
- 128, 175, 1, 219, 233, 244, 123, 12, 1, 251, 231, 2, 133, 176, 240, 237,
- 55, 12, 1, 251, 231, 2, 62, 251, 220, 24, 133, 176, 49, 12, 1, 251, 231,
- 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 251, 231, 2, 133, 176, 225,
- 141, 215, 124, 251, 220, 24, 117, 176, 49, 12, 1, 251, 231, 2, 117, 176,
- 251, 220, 24, 62, 49, 12, 1, 251, 231, 2, 235, 191, 3, 215, 80, 55, 12,
- 1, 251, 231, 2, 3, 215, 79, 12, 1, 121, 2, 117, 176, 49, 12, 1, 121, 2,
- 133, 176, 225, 141, 215, 124, 55, 12, 1, 248, 141, 2, 117, 176, 214, 166,
- 251, 220, 24, 3, 218, 29, 12, 1, 248, 141, 2, 235, 191, 3, 215, 80, 55,
- 12, 1, 223, 246, 2, 90, 12, 1, 222, 86, 2, 243, 237, 176, 49, 12, 1, 254,
- 104, 2, 117, 176, 49, 12, 1, 254, 104, 2, 133, 176, 225, 141, 246, 58,
- 49, 12, 1, 254, 104, 2, 117, 176, 214, 166, 49, 12, 1, 244, 112, 2, 117,
- 176, 55, 12, 1, 244, 112, 2, 133, 176, 225, 141, 215, 124, 55, 12, 1,
- 234, 181, 2, 62, 49, 12, 1, 234, 181, 2, 133, 176, 49, 12, 1, 234, 181,
- 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 63, 2, 62, 49, 12, 1, 63, 2,
- 62, 55, 12, 1, 228, 174, 2, 117, 176, 55, 12, 1, 228, 174, 2, 3, 218, 29,
- 12, 1, 228, 174, 2, 3, 215, 79, 12, 1, 233, 127, 2, 134, 12, 1, 223, 246,
- 2, 117, 176, 214, 166, 49, 12, 1, 223, 246, 2, 192, 49, 12, 1, 222, 86,
- 2, 117, 176, 214, 166, 49, 12, 1, 121, 2, 3, 12, 1, 218, 30, 55, 12, 1,
- 121, 2, 3, 12, 1, 218, 30, 24, 117, 247, 72, 12, 1, 222, 86, 2, 3, 12, 1,
- 218, 30, 24, 117, 247, 72, 12, 1, 223, 246, 2, 3, 12, 1, 218, 30, 24,
- 117, 247, 72, 12, 1, 121, 2, 3, 12, 1, 218, 30, 49, 12, 1, 106, 2, 244,
- 246, 253, 207, 21, 117, 49, 12, 1, 106, 2, 244, 246, 253, 207, 21, 133,
- 49, 12, 1, 244, 136, 73, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 244,
- 136, 73, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1, 244, 136, 73, 2, 244,
- 246, 253, 207, 21, 243, 237, 55, 12, 1, 214, 15, 2, 244, 246, 253, 207,
- 21, 117, 49, 12, 1, 214, 15, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1,
- 73, 252, 53, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 73, 252, 53, 2,
- 244, 246, 253, 207, 21, 133, 49, 12, 1, 121, 2, 244, 246, 253, 207, 21,
- 243, 237, 55, 12, 1, 222, 86, 2, 244, 246, 253, 207, 21, 243, 237, 49,
- 12, 1, 222, 86, 2, 235, 191, 215, 79, 12, 1, 234, 255, 2, 117, 176, 49,
- 217, 158, 1, 242, 27, 217, 158, 1, 220, 248, 217, 158, 1, 228, 172, 217,
- 158, 1, 224, 74, 217, 158, 1, 252, 106, 217, 158, 1, 233, 22, 217, 158,
- 1, 235, 12, 217, 158, 1, 254, 68, 217, 158, 1, 214, 255, 217, 158, 1,
- 231, 142, 217, 158, 1, 244, 162, 217, 158, 1, 247, 231, 217, 158, 1, 217,
- 160, 217, 158, 1, 233, 153, 217, 158, 1, 243, 106, 217, 158, 1, 242, 153,
- 217, 158, 1, 222, 84, 217, 158, 1, 248, 94, 217, 158, 1, 212, 93, 217,
- 158, 1, 217, 244, 217, 158, 1, 213, 91, 217, 158, 1, 226, 107, 217, 158,
- 1, 235, 129, 217, 158, 1, 250, 70, 217, 158, 1, 216, 114, 217, 158, 1,
- 241, 173, 217, 158, 1, 234, 137, 217, 158, 1, 217, 159, 217, 158, 1, 212,
- 108, 217, 158, 1, 220, 238, 217, 158, 1, 222, 199, 217, 158, 1, 248, 162,
- 217, 158, 1, 108, 217, 158, 1, 212, 16, 217, 158, 1, 254, 101, 217, 158,
- 1, 242, 219, 217, 158, 1, 224, 229, 217, 158, 1, 214, 47, 217, 158, 254,
- 182, 217, 158, 254, 197, 217, 158, 240, 107, 217, 158, 245, 164, 217,
- 158, 215, 191, 217, 158, 227, 48, 217, 158, 245, 172, 217, 158, 244, 240,
- 217, 158, 227, 111, 217, 158, 227, 119, 217, 158, 218, 246, 217, 158, 1,
- 230, 43, 228, 224, 21, 212, 79, 228, 224, 21, 116, 228, 224, 21, 109,
- 228, 224, 21, 166, 228, 224, 21, 163, 228, 224, 21, 180, 228, 224, 21,
- 189, 228, 224, 21, 198, 228, 224, 21, 195, 228, 224, 21, 200, 228, 224,
- 1, 61, 228, 224, 1, 245, 165, 228, 224, 1, 72, 228, 224, 1, 74, 228, 224,
- 1, 69, 228, 224, 1, 227, 49, 228, 224, 1, 75, 228, 224, 1, 248, 152, 228,
- 224, 1, 204, 228, 224, 1, 252, 107, 228, 224, 1, 193, 228, 224, 1, 218,
- 52, 228, 224, 1, 235, 139, 228, 224, 1, 250, 92, 228, 224, 1, 248, 164,
- 228, 224, 1, 203, 228, 224, 1, 223, 81, 228, 224, 1, 222, 202, 228, 224,
- 1, 243, 55, 228, 224, 1, 244, 164, 228, 224, 1, 181, 228, 224, 1, 233,
- 157, 228, 224, 1, 230, 46, 213, 210, 228, 224, 1, 188, 228, 224, 1, 228,
- 23, 228, 224, 1, 205, 228, 224, 1, 159, 228, 224, 1, 214, 49, 228, 224,
- 1, 186, 228, 224, 1, 228, 24, 213, 210, 228, 224, 1, 235, 64, 235, 139,
- 228, 224, 1, 235, 64, 250, 92, 228, 224, 1, 235, 64, 203, 228, 224, 37,
- 220, 175, 124, 216, 241, 228, 224, 37, 220, 175, 115, 216, 241, 228, 224,
- 37, 220, 175, 223, 125, 216, 241, 228, 224, 37, 184, 247, 245, 216, 241,
- 228, 224, 37, 184, 124, 216, 241, 228, 224, 37, 184, 115, 216, 241, 228,
- 224, 37, 184, 223, 125, 216, 241, 228, 224, 37, 230, 13, 77, 228, 224,
- 37, 51, 62, 49, 228, 224, 124, 160, 253, 226, 228, 224, 115, 160, 253,
- 226, 228, 224, 16, 227, 50, 248, 1, 228, 224, 16, 243, 54, 228, 224, 249,
- 157, 228, 224, 244, 254, 77, 228, 224, 233, 132, 222, 167, 1, 254, 84,
- 222, 167, 1, 251, 151, 222, 167, 1, 243, 88, 222, 167, 1, 248, 139, 222,
- 167, 1, 235, 150, 222, 167, 1, 252, 106, 222, 167, 1, 212, 82, 222, 167,
- 1, 235, 158, 222, 167, 1, 217, 20, 222, 167, 1, 212, 173, 222, 167, 1,
- 235, 13, 222, 167, 1, 233, 150, 222, 167, 1, 231, 3, 222, 167, 1, 228,
- 50, 222, 167, 1, 220, 82, 222, 167, 1, 235, 251, 222, 167, 1, 244, 90,
- 222, 167, 1, 216, 139, 222, 167, 1, 224, 155, 222, 167, 1, 223, 126, 222,
- 167, 1, 221, 8, 222, 167, 1, 218, 48, 222, 167, 152, 235, 251, 222, 167,
- 152, 235, 250, 222, 167, 152, 227, 107, 222, 167, 152, 248, 150, 222,
- 167, 59, 1, 245, 68, 212, 173, 222, 167, 152, 245, 68, 212, 173, 222,
- 167, 30, 5, 184, 74, 222, 167, 30, 5, 74, 222, 167, 30, 5, 226, 242, 254,
- 232, 222, 167, 30, 5, 184, 254, 232, 222, 167, 30, 5, 254, 232, 222, 167,
- 30, 5, 226, 242, 61, 222, 167, 30, 5, 184, 61, 222, 167, 30, 5, 61, 222,
- 167, 59, 1, 220, 175, 61, 222, 167, 30, 5, 220, 175, 61, 222, 167, 30, 5,
- 184, 69, 222, 167, 30, 5, 69, 222, 167, 59, 1, 72, 222, 167, 30, 5, 184,
- 72, 222, 167, 30, 5, 72, 222, 167, 30, 5, 75, 222, 167, 30, 5, 218, 246,
- 222, 167, 152, 229, 174, 222, 167, 225, 27, 229, 174, 222, 167, 225, 27,
- 254, 123, 222, 167, 225, 27, 254, 23, 222, 167, 225, 27, 252, 34, 222,
- 167, 225, 27, 253, 117, 222, 167, 225, 27, 220, 188, 222, 167, 254, 181,
- 77, 222, 167, 225, 27, 231, 132, 224, 190, 222, 167, 225, 27, 212, 24,
- 222, 167, 225, 27, 224, 190, 222, 167, 225, 27, 212, 107, 222, 167, 225,
- 27, 216, 54, 222, 167, 225, 27, 253, 180, 222, 167, 225, 27, 219, 237,
- 231, 208, 222, 167, 225, 27, 254, 11, 231, 245, 1, 242, 7, 231, 245, 1,
- 254, 185, 231, 245, 1, 254, 121, 231, 245, 1, 254, 160, 231, 245, 1, 254,
- 114, 231, 245, 1, 215, 98, 231, 245, 1, 253, 76, 231, 245, 1, 235, 158,
- 231, 245, 1, 253, 114, 231, 245, 1, 254, 89, 231, 245, 1, 254, 94, 231,
- 245, 1, 254, 86, 231, 245, 1, 254, 45, 231, 245, 1, 254, 32, 231, 245, 1,
- 253, 152, 231, 245, 1, 235, 251, 231, 245, 1, 253, 239, 231, 245, 1, 253,
- 124, 231, 245, 1, 253, 215, 231, 245, 1, 253, 211, 231, 245, 1, 253, 146,
- 231, 245, 1, 253, 122, 231, 245, 1, 246, 10, 231, 245, 1, 235, 6, 231,
- 245, 1, 254, 103, 231, 245, 254, 127, 77, 231, 245, 214, 117, 77, 231,
- 245, 243, 29, 77, 231, 245, 225, 26, 82, 5, 235, 191, 250, 187, 82, 5,
- 250, 187, 82, 5, 253, 242, 82, 5, 214, 128, 82, 1, 220, 175, 61, 82, 1,
- 61, 82, 1, 254, 232, 82, 1, 72, 82, 1, 236, 28, 82, 1, 69, 82, 1, 215,
- 92, 82, 1, 161, 149, 82, 1, 161, 150, 82, 1, 250, 190, 74, 82, 1, 220,
- 175, 74, 82, 1, 74, 82, 1, 254, 108, 82, 1, 250, 190, 75, 82, 1, 220,
- 175, 75, 82, 1, 75, 82, 1, 253, 108, 82, 1, 181, 82, 1, 234, 138, 82, 1,
- 243, 110, 82, 1, 242, 225, 82, 1, 229, 159, 82, 1, 250, 219, 82, 1, 250,
- 92, 82, 1, 235, 139, 82, 1, 235, 115, 82, 1, 228, 23, 82, 1, 216, 115,
- 82, 1, 216, 105, 82, 1, 248, 86, 82, 1, 248, 70, 82, 1, 228, 198, 82, 1,
- 218, 52, 82, 1, 217, 161, 82, 1, 248, 164, 82, 1, 247, 232, 82, 1, 205,
- 82, 1, 228, 189, 82, 1, 193, 82, 1, 226, 23, 82, 1, 252, 107, 82, 1, 251,
- 195, 82, 1, 188, 82, 1, 186, 82, 1, 203, 82, 1, 223, 81, 82, 1, 233, 157,
- 82, 1, 232, 213, 82, 1, 232, 212, 82, 1, 215, 1, 82, 1, 221, 24, 82, 1,
- 219, 157, 82, 1, 222, 202, 82, 1, 159, 82, 30, 5, 227, 99, 82, 30, 5,
- 227, 47, 82, 5, 228, 60, 82, 5, 253, 91, 82, 30, 5, 254, 232, 82, 30, 5,
- 72, 82, 30, 5, 236, 28, 82, 30, 5, 69, 82, 30, 5, 215, 92, 82, 30, 5,
- 161, 149, 82, 30, 5, 161, 223, 82, 82, 30, 5, 250, 190, 74, 82, 30, 5,
- 220, 175, 74, 82, 30, 5, 74, 82, 30, 5, 254, 108, 82, 30, 5, 250, 190,
- 75, 82, 30, 5, 220, 175, 75, 82, 30, 5, 75, 82, 30, 5, 253, 108, 82, 5,
- 214, 133, 82, 30, 5, 225, 66, 74, 82, 30, 5, 253, 87, 82, 227, 70, 82,
- 219, 51, 5, 215, 185, 82, 219, 51, 5, 253, 244, 82, 242, 114, 254, 174,
- 82, 254, 164, 254, 174, 82, 30, 5, 250, 190, 184, 74, 82, 30, 5, 215,
- 183, 82, 30, 5, 215, 91, 82, 1, 224, 232, 82, 1, 234, 121, 82, 1, 242,
- 202, 82, 1, 212, 109, 82, 1, 248, 75, 82, 1, 223, 192, 82, 1, 244, 164,
- 82, 1, 212, 160, 82, 1, 161, 223, 82, 82, 1, 161, 232, 214, 82, 30, 5,
- 161, 150, 82, 30, 5, 161, 232, 214, 82, 248, 123, 82, 51, 248, 123, 82,
- 21, 212, 79, 82, 21, 116, 82, 21, 109, 82, 21, 166, 82, 21, 163, 82, 21,
- 180, 82, 21, 189, 82, 21, 198, 82, 21, 195, 82, 21, 200, 82, 254, 181,
- 52, 82, 5, 124, 219, 205, 247, 74, 82, 1, 250, 190, 61, 82, 1, 227, 99,
- 82, 1, 227, 47, 82, 1, 253, 87, 82, 1, 215, 183, 82, 1, 215, 91, 82, 1,
- 212, 75, 82, 1, 107, 186, 82, 1, 243, 5, 82, 1, 235, 99, 82, 1, 242, 156,
- 219, 69, 82, 1, 248, 76, 82, 1, 252, 31, 140, 5, 250, 187, 140, 5, 253,
- 242, 140, 5, 214, 128, 140, 1, 61, 140, 1, 254, 232, 140, 1, 72, 140, 1,
- 236, 28, 140, 1, 69, 140, 1, 215, 92, 140, 1, 161, 149, 140, 1, 161, 150,
- 140, 1, 74, 140, 1, 254, 108, 140, 1, 75, 140, 1, 253, 108, 140, 1, 181,
- 140, 1, 234, 138, 140, 1, 243, 110, 140, 1, 242, 225, 140, 1, 229, 159,
- 140, 1, 250, 219, 140, 1, 250, 92, 140, 1, 235, 139, 140, 1, 235, 115,
- 140, 1, 228, 23, 140, 1, 216, 115, 140, 1, 216, 105, 140, 1, 248, 86,
- 140, 1, 248, 70, 140, 1, 228, 198, 140, 1, 218, 52, 140, 1, 217, 161,
- 140, 1, 248, 164, 140, 1, 247, 232, 140, 1, 205, 140, 1, 193, 140, 1,
- 226, 23, 140, 1, 252, 107, 140, 1, 251, 195, 140, 1, 188, 140, 1, 186,
- 140, 1, 203, 140, 1, 233, 157, 140, 1, 221, 24, 140, 1, 219, 157, 140, 1,
- 222, 202, 140, 1, 159, 140, 5, 228, 60, 140, 5, 253, 91, 140, 30, 5, 254,
- 232, 140, 30, 5, 72, 140, 30, 5, 236, 28, 140, 30, 5, 69, 140, 30, 5,
- 215, 92, 140, 30, 5, 161, 149, 140, 30, 5, 161, 223, 82, 140, 30, 5, 74,
- 140, 30, 5, 254, 108, 140, 30, 5, 75, 140, 30, 5, 253, 108, 140, 5, 214,
- 133, 140, 1, 234, 130, 218, 52, 140, 253, 109, 233, 47, 77, 140, 1, 223,
- 81, 140, 1, 223, 192, 140, 1, 212, 160, 140, 1, 161, 223, 82, 140, 1,
- 161, 232, 214, 140, 30, 5, 161, 150, 140, 30, 5, 161, 232, 214, 140, 21,
- 212, 79, 140, 21, 116, 140, 21, 109, 140, 21, 166, 140, 21, 163, 140, 21,
- 180, 140, 21, 189, 140, 21, 198, 140, 21, 195, 140, 21, 200, 140, 1, 224,
- 77, 2, 231, 37, 247, 206, 140, 1, 224, 77, 2, 232, 163, 247, 206, 140,
- 223, 29, 77, 140, 223, 29, 52, 140, 249, 39, 228, 53, 116, 140, 249, 39,
- 228, 53, 109, 140, 249, 39, 228, 53, 166, 140, 249, 39, 228, 53, 163,
- 140, 249, 39, 228, 53, 122, 233, 40, 217, 154, 217, 149, 247, 255, 140,
- 249, 39, 248, 0, 220, 47, 140, 235, 159, 140, 243, 79, 77, 173, 5, 254,
- 159, 251, 166, 173, 5, 251, 166, 173, 5, 214, 128, 173, 1, 61, 173, 1,
- 254, 232, 173, 1, 72, 173, 1, 236, 28, 173, 1, 69, 173, 1, 215, 92, 173,
- 1, 245, 165, 173, 1, 254, 108, 173, 1, 227, 49, 173, 1, 253, 108, 173, 1,
- 181, 173, 1, 234, 138, 173, 1, 243, 110, 173, 1, 242, 225, 173, 1, 229,
- 159, 173, 1, 250, 219, 173, 1, 250, 92, 173, 1, 235, 139, 173, 1, 235,
- 115, 173, 1, 228, 23, 173, 1, 216, 115, 173, 1, 216, 105, 173, 1, 248,
- 86, 173, 1, 248, 70, 173, 1, 228, 198, 173, 1, 218, 52, 173, 1, 217, 161,
- 173, 1, 248, 164, 173, 1, 247, 232, 173, 1, 205, 173, 1, 193, 173, 1,
- 226, 23, 173, 1, 252, 107, 173, 1, 251, 195, 173, 1, 188, 173, 1, 186,
- 173, 1, 203, 173, 1, 233, 157, 173, 1, 232, 213, 173, 1, 215, 1, 173, 1,
- 221, 24, 173, 1, 222, 202, 173, 1, 159, 173, 5, 228, 60, 173, 30, 5, 254,
- 232, 173, 30, 5, 72, 173, 30, 5, 236, 28, 173, 30, 5, 69, 173, 30, 5,
- 215, 92, 173, 30, 5, 245, 165, 173, 30, 5, 254, 108, 173, 30, 5, 227, 49,
- 173, 30, 5, 253, 108, 173, 5, 214, 133, 173, 5, 215, 187, 173, 1, 234,
- 121, 173, 1, 242, 202, 173, 1, 212, 109, 173, 1, 223, 81, 173, 1, 244,
- 164, 173, 21, 212, 79, 173, 21, 116, 173, 21, 109, 173, 21, 166, 173, 21,
- 163, 173, 21, 180, 173, 21, 189, 173, 21, 198, 173, 21, 195, 173, 21,
- 200, 173, 217, 27, 173, 254, 158, 173, 235, 176, 173, 215, 117, 173, 245,
- 138, 227, 54, 173, 5, 213, 67, 164, 5, 250, 187, 164, 5, 253, 242, 164,
- 5, 214, 128, 164, 1, 61, 164, 1, 254, 232, 164, 1, 72, 164, 1, 236, 28,
- 164, 1, 69, 164, 1, 215, 92, 164, 1, 161, 149, 164, 1, 161, 150, 164, 30,
- 250, 190, 74, 164, 1, 74, 164, 1, 254, 108, 164, 30, 250, 190, 75, 164,
- 1, 75, 164, 1, 253, 108, 164, 1, 181, 164, 1, 234, 138, 164, 1, 243, 110,
- 164, 1, 242, 225, 164, 1, 229, 159, 164, 1, 250, 219, 164, 1, 250, 92,
- 164, 1, 235, 139, 164, 1, 235, 115, 164, 1, 228, 23, 164, 1, 216, 115,
- 164, 1, 216, 105, 164, 1, 248, 86, 164, 1, 248, 70, 164, 1, 228, 198,
- 164, 1, 218, 52, 164, 1, 217, 161, 164, 1, 248, 164, 164, 1, 247, 232,
- 164, 1, 205, 164, 1, 193, 164, 1, 226, 23, 164, 1, 252, 107, 164, 1, 251,
- 195, 164, 1, 188, 164, 1, 186, 164, 1, 203, 164, 1, 233, 157, 164, 1,
- 232, 213, 164, 1, 215, 1, 164, 1, 221, 24, 164, 1, 219, 157, 164, 1, 222,
- 202, 164, 1, 159, 164, 5, 228, 60, 164, 5, 253, 91, 164, 30, 5, 254, 232,
- 164, 30, 5, 72, 164, 30, 5, 236, 28, 164, 30, 5, 69, 164, 30, 5, 215, 92,
- 164, 30, 5, 161, 149, 164, 30, 5, 161, 223, 82, 164, 30, 5, 250, 190, 74,
- 164, 30, 5, 74, 164, 30, 5, 254, 108, 164, 30, 5, 250, 190, 75, 164, 30,
- 5, 75, 164, 30, 5, 253, 108, 164, 5, 214, 133, 164, 227, 70, 164, 1, 161,
- 223, 82, 164, 1, 161, 232, 214, 164, 30, 5, 161, 150, 164, 30, 5, 161,
- 232, 214, 164, 21, 212, 79, 164, 21, 116, 164, 21, 109, 164, 21, 166,
- 164, 21, 163, 164, 21, 180, 164, 21, 189, 164, 21, 198, 164, 21, 195,
- 164, 21, 200, 164, 223, 29, 52, 147, 5, 250, 187, 147, 5, 253, 242, 147,
- 5, 214, 128, 147, 1, 61, 147, 1, 254, 232, 147, 1, 72, 147, 1, 236, 28,
- 147, 1, 69, 147, 1, 215, 92, 147, 1, 161, 149, 147, 1, 161, 150, 147, 1,
- 74, 147, 1, 254, 108, 147, 1, 75, 147, 1, 253, 108, 147, 1, 181, 147, 1,
- 234, 138, 147, 1, 243, 110, 147, 1, 242, 225, 147, 1, 229, 159, 147, 1,
- 250, 219, 147, 1, 250, 92, 147, 1, 235, 139, 147, 1, 235, 115, 147, 1,
- 228, 23, 147, 1, 216, 115, 147, 1, 216, 105, 147, 1, 248, 86, 147, 1,
- 248, 70, 147, 1, 228, 198, 147, 1, 218, 52, 147, 1, 217, 161, 147, 1,
- 248, 164, 147, 1, 247, 232, 147, 1, 205, 147, 1, 193, 147, 1, 226, 23,
- 147, 1, 252, 107, 147, 1, 251, 195, 147, 1, 188, 147, 1, 186, 147, 1,
- 203, 147, 1, 233, 157, 147, 1, 232, 213, 147, 1, 215, 1, 147, 1, 221, 24,
- 147, 1, 219, 157, 147, 1, 222, 202, 147, 1, 159, 147, 5, 228, 60, 147, 5,
- 253, 91, 147, 30, 5, 254, 232, 147, 30, 5, 72, 147, 30, 5, 236, 28, 147,
- 30, 5, 69, 147, 30, 5, 215, 92, 147, 30, 5, 161, 149, 147, 30, 5, 161,
- 223, 82, 147, 30, 5, 74, 147, 30, 5, 254, 108, 147, 30, 5, 75, 147, 30,
- 5, 253, 108, 147, 5, 214, 133, 147, 254, 109, 233, 47, 77, 147, 253, 109,
- 233, 47, 77, 147, 1, 223, 81, 147, 1, 223, 192, 147, 1, 212, 160, 147, 1,
- 161, 223, 82, 147, 1, 161, 232, 214, 147, 30, 5, 161, 150, 147, 30, 5,
- 161, 232, 214, 147, 21, 212, 79, 147, 21, 116, 147, 21, 109, 147, 21,
- 166, 147, 21, 163, 147, 21, 180, 147, 21, 189, 147, 21, 198, 147, 21,
- 195, 147, 21, 200, 147, 235, 159, 147, 1, 214, 49, 147, 243, 228, 122,
- 224, 166, 147, 243, 228, 122, 242, 9, 147, 243, 228, 133, 224, 164, 147,
- 243, 228, 122, 220, 45, 147, 243, 228, 122, 245, 145, 147, 243, 228, 133,
- 220, 44, 178, 5, 253, 242, 178, 5, 214, 128, 178, 1, 61, 178, 1, 254,
- 232, 178, 1, 72, 178, 1, 236, 28, 178, 1, 69, 178, 1, 215, 92, 178, 1,
- 74, 178, 1, 245, 165, 178, 1, 254, 108, 178, 1, 75, 178, 1, 227, 49, 178,
- 1, 253, 108, 178, 1, 181, 178, 1, 229, 159, 178, 1, 250, 219, 178, 1,
- 235, 139, 178, 1, 228, 23, 178, 1, 216, 115, 178, 1, 228, 198, 178, 1,
- 218, 52, 178, 1, 205, 178, 1, 228, 189, 178, 1, 193, 178, 1, 188, 178, 1,
- 186, 178, 1, 203, 178, 1, 223, 81, 178, 1, 233, 157, 178, 1, 232, 213,
- 178, 1, 232, 212, 178, 1, 215, 1, 178, 1, 221, 24, 178, 1, 219, 157, 178,
- 1, 222, 202, 178, 1, 159, 178, 30, 5, 254, 232, 178, 30, 5, 72, 178, 30,
- 5, 236, 28, 178, 30, 5, 69, 178, 30, 5, 215, 92, 178, 30, 5, 74, 178, 30,
- 5, 245, 165, 178, 30, 5, 254, 108, 178, 30, 5, 75, 178, 30, 5, 227, 49,
- 178, 30, 5, 253, 108, 178, 5, 214, 133, 178, 227, 70, 178, 253, 109, 233,
- 47, 77, 178, 21, 212, 79, 178, 21, 116, 178, 21, 109, 178, 21, 166, 178,
- 21, 163, 178, 21, 180, 178, 21, 189, 178, 21, 198, 178, 21, 195, 178, 21,
- 200, 178, 50, 217, 200, 178, 50, 122, 240, 200, 178, 50, 122, 217, 100,
- 178, 248, 92, 52, 178, 230, 205, 52, 178, 213, 36, 52, 178, 248, 38, 52,
- 178, 249, 79, 52, 178, 253, 153, 78, 52, 178, 223, 29, 52, 178, 50, 52,
- 139, 5, 250, 187, 139, 5, 253, 242, 139, 5, 214, 128, 139, 1, 61, 139, 1,
- 254, 232, 139, 1, 72, 139, 1, 236, 28, 139, 1, 69, 139, 1, 215, 92, 139,
- 1, 161, 149, 139, 1, 161, 150, 139, 1, 74, 139, 1, 245, 165, 139, 1, 254,
- 108, 139, 1, 75, 139, 1, 227, 49, 139, 1, 253, 108, 139, 1, 181, 139, 1,
- 234, 138, 139, 1, 243, 110, 139, 1, 242, 225, 139, 1, 229, 159, 139, 1,
- 250, 219, 139, 1, 250, 92, 139, 1, 235, 139, 139, 1, 235, 115, 139, 1,
- 228, 23, 139, 1, 216, 115, 139, 1, 216, 105, 139, 1, 248, 86, 139, 1,
- 248, 70, 139, 1, 228, 198, 139, 1, 218, 52, 139, 1, 217, 161, 139, 1,
- 248, 164, 139, 1, 247, 232, 139, 1, 205, 139, 1, 193, 139, 1, 226, 23,
- 139, 1, 252, 107, 139, 1, 251, 195, 139, 1, 188, 139, 1, 186, 139, 1,
- 203, 139, 1, 223, 81, 139, 1, 233, 157, 139, 1, 232, 213, 139, 1, 215, 1,
- 139, 1, 221, 24, 139, 1, 219, 157, 139, 1, 222, 202, 139, 1, 159, 139, 5,
- 253, 91, 139, 30, 5, 254, 232, 139, 30, 5, 72, 139, 30, 5, 236, 28, 139,
- 30, 5, 69, 139, 30, 5, 215, 92, 139, 30, 5, 161, 149, 139, 30, 5, 161,
- 223, 82, 139, 30, 5, 74, 139, 30, 5, 245, 165, 139, 30, 5, 254, 108, 139,
- 30, 5, 75, 139, 30, 5, 227, 49, 139, 30, 5, 253, 108, 139, 5, 214, 133,
- 139, 233, 47, 77, 139, 254, 109, 233, 47, 77, 139, 1, 216, 141, 139, 1,
- 245, 249, 139, 1, 161, 223, 82, 139, 1, 161, 232, 214, 139, 30, 5, 161,
- 150, 139, 30, 5, 161, 232, 214, 139, 21, 212, 79, 139, 21, 116, 139, 21,
- 109, 139, 21, 166, 139, 21, 163, 139, 21, 180, 139, 21, 189, 139, 21,
- 198, 139, 21, 195, 139, 21, 200, 139, 243, 228, 21, 212, 80, 31, 227,
- 102, 225, 103, 65, 163, 139, 243, 228, 21, 122, 31, 227, 102, 225, 103,
- 65, 163, 139, 243, 228, 21, 117, 31, 227, 102, 225, 103, 65, 163, 139,
- 243, 228, 21, 133, 31, 227, 102, 225, 103, 65, 163, 139, 243, 228, 21,
- 122, 31, 245, 9, 225, 103, 65, 163, 139, 243, 228, 21, 117, 31, 245, 9,
- 225, 103, 65, 163, 139, 243, 228, 21, 133, 31, 245, 9, 225, 103, 65, 163,
- 139, 5, 216, 49, 155, 5, 253, 242, 155, 5, 214, 128, 155, 1, 61, 155, 1,
- 254, 232, 155, 1, 72, 155, 1, 236, 28, 155, 1, 69, 155, 1, 215, 92, 155,
- 1, 161, 149, 155, 1, 161, 150, 155, 1, 74, 155, 1, 245, 165, 155, 1, 254,
- 108, 155, 1, 75, 155, 1, 227, 49, 155, 1, 253, 108, 155, 1, 181, 155, 1,
- 234, 138, 155, 1, 243, 110, 155, 1, 242, 225, 155, 1, 229, 159, 155, 1,
- 250, 219, 155, 1, 250, 92, 155, 1, 235, 139, 155, 1, 235, 115, 155, 1,
- 228, 23, 155, 1, 216, 115, 155, 1, 216, 105, 155, 1, 248, 86, 155, 1,
- 248, 70, 155, 1, 228, 198, 155, 1, 218, 52, 155, 1, 217, 161, 155, 1,
- 248, 164, 155, 1, 247, 232, 155, 1, 205, 155, 1, 193, 155, 1, 226, 23,
- 155, 1, 252, 107, 155, 1, 251, 195, 155, 1, 188, 155, 1, 186, 155, 1,
- 203, 155, 1, 223, 81, 155, 1, 233, 157, 155, 1, 232, 213, 155, 1, 215, 1,
- 155, 1, 221, 24, 155, 1, 219, 157, 155, 1, 222, 202, 155, 1, 159, 155, 5,
- 228, 60, 155, 5, 253, 91, 155, 30, 5, 254, 232, 155, 30, 5, 72, 155, 30,
- 5, 236, 28, 155, 30, 5, 69, 155, 30, 5, 215, 92, 155, 30, 5, 161, 149,
- 155, 30, 5, 161, 223, 82, 155, 30, 5, 74, 155, 30, 5, 245, 165, 155, 30,
- 5, 254, 108, 155, 30, 5, 75, 155, 30, 5, 227, 49, 155, 30, 5, 253, 108,
- 155, 5, 214, 133, 155, 233, 47, 77, 155, 254, 109, 233, 47, 77, 155, 1,
- 244, 164, 155, 1, 161, 223, 82, 155, 1, 161, 232, 214, 155, 30, 5, 161,
- 150, 155, 30, 5, 161, 232, 214, 155, 21, 212, 79, 155, 21, 116, 155, 21,
- 109, 155, 21, 166, 155, 21, 163, 155, 21, 180, 155, 21, 189, 155, 21,
- 198, 155, 21, 195, 155, 21, 200, 155, 5, 235, 104, 155, 5, 215, 132, 130,
- 5, 253, 242, 130, 5, 214, 128, 130, 1, 61, 130, 1, 254, 232, 130, 1, 72,
- 130, 1, 236, 28, 130, 1, 69, 130, 1, 215, 92, 130, 1, 161, 149, 130, 1,
- 161, 150, 130, 1, 74, 130, 1, 245, 165, 130, 1, 254, 108, 130, 1, 75,
- 130, 1, 227, 49, 130, 1, 253, 108, 130, 1, 181, 130, 1, 234, 138, 130, 1,
- 243, 110, 130, 1, 242, 225, 130, 1, 229, 159, 130, 1, 250, 219, 130, 1,
- 250, 92, 130, 1, 235, 139, 130, 1, 235, 115, 130, 1, 228, 23, 130, 1,
- 216, 115, 130, 1, 216, 105, 130, 1, 248, 86, 130, 1, 248, 70, 130, 1,
- 228, 198, 130, 1, 218, 52, 130, 1, 217, 161, 130, 1, 248, 164, 130, 1,
- 247, 232, 130, 1, 205, 130, 1, 228, 189, 130, 1, 193, 130, 1, 226, 23,
- 130, 1, 252, 107, 130, 1, 251, 195, 130, 1, 188, 130, 1, 186, 130, 1,
- 203, 130, 1, 223, 81, 130, 1, 233, 157, 130, 1, 232, 213, 130, 1, 232,
- 212, 130, 1, 215, 1, 130, 1, 221, 24, 130, 1, 219, 157, 130, 1, 222, 202,
- 130, 1, 159, 130, 1, 216, 88, 130, 5, 253, 91, 130, 30, 5, 254, 232, 130,
- 30, 5, 72, 130, 30, 5, 236, 28, 130, 30, 5, 69, 130, 30, 5, 215, 92, 130,
- 30, 5, 161, 149, 130, 30, 5, 161, 223, 82, 130, 30, 5, 74, 130, 30, 5,
- 245, 165, 130, 30, 5, 254, 108, 130, 30, 5, 75, 130, 30, 5, 227, 49, 130,
- 30, 5, 253, 108, 130, 5, 214, 133, 130, 1, 62, 223, 225, 130, 253, 109,
- 233, 47, 77, 130, 1, 161, 223, 82, 130, 1, 161, 232, 214, 130, 30, 5,
- 161, 150, 130, 30, 5, 161, 232, 214, 130, 21, 212, 79, 130, 21, 116, 130,
- 21, 109, 130, 21, 166, 130, 21, 163, 130, 21, 180, 130, 21, 189, 130, 21,
- 198, 130, 21, 195, 130, 21, 200, 130, 50, 217, 200, 130, 50, 122, 240,
- 200, 130, 50, 122, 217, 100, 130, 243, 228, 122, 224, 166, 130, 243, 228,
- 122, 242, 9, 130, 243, 228, 133, 224, 164, 130, 248, 96, 77, 130, 1, 250,
- 36, 228, 199, 130, 1, 250, 36, 204, 130, 1, 250, 36, 223, 82, 130, 1,
- 250, 36, 150, 130, 1, 250, 36, 232, 214, 130, 1, 250, 36, 235, 27, 172,
- 5, 253, 241, 172, 5, 214, 127, 172, 1, 253, 81, 172, 1, 254, 187, 172, 1,
- 254, 128, 172, 1, 254, 143, 172, 1, 235, 149, 172, 1, 236, 27, 172, 1,
- 215, 84, 172, 1, 215, 86, 172, 1, 235, 171, 172, 1, 235, 172, 172, 1,
- 236, 13, 172, 1, 236, 15, 172, 1, 244, 241, 172, 1, 245, 161, 172, 1,
- 254, 96, 172, 1, 226, 232, 172, 1, 227, 43, 172, 1, 253, 94, 172, 1, 254,
- 55, 234, 193, 172, 1, 232, 14, 234, 193, 172, 1, 254, 55, 243, 58, 172,
- 1, 232, 14, 243, 58, 172, 1, 234, 234, 230, 40, 172, 1, 222, 152, 243,
- 58, 172, 1, 254, 55, 250, 149, 172, 1, 232, 14, 250, 149, 172, 1, 254,
- 55, 235, 128, 172, 1, 232, 14, 235, 128, 172, 1, 218, 46, 230, 40, 172,
- 1, 218, 46, 222, 151, 230, 41, 172, 1, 222, 152, 235, 128, 172, 1, 254,
- 55, 216, 113, 172, 1, 232, 14, 216, 113, 172, 1, 254, 55, 248, 77, 172,
- 1, 232, 14, 248, 77, 172, 1, 230, 124, 230, 2, 172, 1, 222, 152, 248, 77,
- 172, 1, 254, 55, 217, 237, 172, 1, 232, 14, 217, 237, 172, 1, 254, 55,
- 248, 90, 172, 1, 232, 14, 248, 90, 172, 1, 248, 119, 230, 2, 172, 1, 222,
- 152, 248, 90, 172, 1, 254, 55, 226, 102, 172, 1, 232, 14, 226, 102, 172,
- 1, 254, 55, 252, 32, 172, 1, 232, 14, 252, 32, 172, 1, 231, 195, 172, 1,
- 254, 40, 252, 32, 172, 1, 213, 42, 172, 1, 224, 26, 172, 1, 248, 119,
- 233, 91, 172, 1, 214, 234, 172, 1, 218, 46, 222, 128, 172, 1, 230, 124,
- 222, 128, 172, 1, 248, 119, 222, 128, 172, 1, 241, 226, 172, 1, 230, 124,
- 233, 91, 172, 1, 244, 125, 172, 5, 254, 85, 172, 30, 5, 254, 138, 172,
- 30, 5, 234, 161, 254, 145, 172, 30, 5, 247, 180, 254, 145, 172, 30, 5,
- 234, 161, 235, 168, 172, 30, 5, 247, 180, 235, 168, 172, 30, 5, 234, 161,
- 226, 212, 172, 30, 5, 247, 180, 226, 212, 172, 30, 5, 243, 99, 172, 30,
- 5, 234, 24, 172, 30, 5, 247, 180, 234, 24, 172, 30, 5, 234, 26, 248, 18,
- 172, 30, 5, 234, 25, 242, 28, 254, 138, 172, 30, 5, 234, 25, 242, 28,
- 247, 180, 254, 138, 172, 30, 5, 234, 25, 242, 28, 243, 57, 172, 30, 5,
- 243, 57, 172, 30, 5, 247, 180, 243, 99, 172, 30, 5, 247, 180, 243, 57,
- 172, 225, 27, 233, 228, 154, 137, 234, 38, 234, 250, 154, 137, 234, 114,
- 234, 134, 154, 137, 234, 114, 234, 107, 154, 137, 234, 114, 234, 104,
- 154, 137, 234, 114, 234, 111, 154, 137, 234, 114, 224, 46, 154, 137, 229,
- 91, 229, 78, 154, 137, 250, 24, 250, 83, 154, 137, 250, 24, 250, 32, 154,
- 137, 250, 24, 250, 82, 154, 137, 219, 243, 219, 242, 154, 137, 250, 24,
- 250, 20, 154, 137, 212, 236, 212, 243, 154, 137, 247, 100, 250, 89, 154,
- 137, 211, 211, 226, 111, 154, 137, 217, 110, 217, 153, 154, 137, 217,
- 110, 230, 21, 154, 137, 217, 110, 225, 243, 154, 137, 228, 186, 229, 180,
- 154, 137, 247, 100, 248, 19, 154, 137, 211, 211, 218, 6, 154, 137, 217,
- 110, 217, 85, 154, 137, 217, 110, 217, 157, 154, 137, 217, 110, 217, 107,
- 154, 137, 228, 186, 228, 92, 154, 137, 251, 129, 252, 83, 154, 137, 225,
- 151, 225, 174, 154, 137, 225, 254, 225, 245, 154, 137, 244, 13, 244, 164,
- 154, 137, 225, 254, 226, 17, 154, 137, 244, 13, 244, 141, 154, 137, 225,
- 254, 222, 162, 154, 137, 230, 232, 188, 154, 137, 212, 236, 213, 68, 154,
- 137, 223, 113, 223, 50, 154, 137, 223, 51, 154, 137, 232, 209, 232, 235,
- 154, 137, 232, 156, 154, 137, 213, 215, 214, 45, 154, 137, 219, 243, 222,
- 177, 154, 137, 219, 243, 223, 25, 154, 137, 219, 243, 219, 26, 154, 137,
- 241, 55, 241, 145, 154, 137, 232, 209, 250, 5, 154, 137, 157, 254, 24,
- 154, 137, 241, 55, 228, 181, 154, 137, 226, 195, 154, 137, 222, 146, 61,
- 154, 137, 232, 9, 242, 0, 154, 137, 222, 146, 254, 232, 154, 137, 222,
- 146, 254, 45, 154, 137, 222, 146, 72, 154, 137, 222, 146, 236, 28, 154,
- 137, 222, 146, 215, 183, 154, 137, 222, 146, 215, 181, 154, 137, 222,
- 146, 69, 154, 137, 222, 146, 215, 92, 154, 137, 226, 0, 154, 249, 39, 16,
- 252, 84, 154, 137, 222, 146, 74, 154, 137, 222, 146, 254, 148, 154, 137,
- 222, 146, 75, 154, 137, 222, 146, 254, 109, 232, 4, 154, 137, 222, 146,
- 254, 109, 232, 5, 154, 137, 233, 130, 154, 137, 232, 1, 154, 137, 232, 2,
- 154, 137, 232, 9, 245, 137, 154, 137, 232, 9, 217, 109, 154, 137, 232, 9,
- 216, 186, 154, 137, 232, 9, 250, 71, 154, 137, 217, 151, 154, 137, 229,
- 36, 154, 137, 213, 62, 154, 137, 244, 4, 154, 21, 212, 79, 154, 21, 116,
- 154, 21, 109, 154, 21, 166, 154, 21, 163, 154, 21, 180, 154, 21, 189,
- 154, 21, 198, 154, 21, 195, 154, 21, 200, 154, 137, 254, 20, 154, 137,
- 234, 112, 233, 112, 1, 234, 37, 233, 112, 1, 234, 114, 218, 235, 233,
- 112, 1, 234, 114, 218, 13, 233, 112, 1, 229, 90, 233, 112, 1, 249, 175,
- 233, 112, 1, 219, 243, 218, 13, 233, 112, 1, 227, 253, 233, 112, 1, 247,
- 99, 233, 112, 1, 108, 233, 112, 1, 217, 110, 218, 235, 233, 112, 1, 217,
- 110, 218, 13, 233, 112, 1, 228, 185, 233, 112, 1, 251, 128, 233, 112, 1,
- 225, 150, 233, 112, 1, 225, 254, 218, 235, 233, 112, 1, 244, 13, 218, 13,
- 233, 112, 1, 225, 254, 218, 13, 233, 112, 1, 244, 13, 218, 235, 233, 112,
- 1, 230, 231, 233, 112, 1, 212, 235, 233, 112, 1, 232, 209, 232, 235, 233,
- 112, 1, 232, 209, 232, 176, 233, 112, 1, 213, 214, 233, 112, 1, 219, 243,
- 218, 235, 233, 112, 1, 241, 55, 218, 235, 233, 112, 1, 75, 233, 112, 1,
- 241, 55, 218, 13, 233, 112, 245, 120, 233, 112, 30, 5, 61, 233, 112, 30,
- 5, 232, 9, 234, 239, 233, 112, 30, 5, 254, 232, 233, 112, 30, 5, 254, 45,
- 233, 112, 30, 5, 72, 233, 112, 30, 5, 236, 28, 233, 112, 30, 5, 213, 105,
- 233, 112, 30, 5, 212, 161, 233, 112, 30, 5, 69, 233, 112, 30, 5, 215, 92,
- 233, 112, 30, 5, 232, 9, 234, 22, 233, 112, 221, 65, 5, 232, 208, 233,
- 112, 221, 65, 5, 227, 253, 233, 112, 30, 5, 74, 233, 112, 30, 5, 245,
- 152, 233, 112, 30, 5, 75, 233, 112, 30, 5, 253, 83, 233, 112, 30, 5, 254,
- 108, 233, 112, 234, 38, 233, 157, 233, 112, 160, 232, 9, 245, 137, 233,
- 112, 160, 232, 9, 217, 109, 233, 112, 160, 232, 9, 217, 71, 233, 112,
- 160, 232, 9, 250, 155, 233, 112, 250, 192, 77, 233, 112, 229, 45, 233,
- 112, 21, 212, 79, 233, 112, 21, 116, 233, 112, 21, 109, 233, 112, 21,
- 166, 233, 112, 21, 163, 233, 112, 21, 180, 233, 112, 21, 189, 233, 112,
- 21, 198, 233, 112, 21, 195, 233, 112, 21, 200, 233, 112, 241, 55, 228,
- 185, 233, 112, 241, 55, 230, 231, 60, 4, 227, 70, 60, 152, 242, 94, 212,
- 247, 231, 59, 216, 147, 61, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62,
- 223, 117, 251, 253, 188, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62,
- 242, 94, 216, 131, 188, 60, 152, 70, 212, 247, 231, 59, 231, 158, 188,
- 60, 152, 249, 189, 212, 247, 231, 59, 221, 30, 188, 60, 152, 250, 171,
- 212, 247, 231, 59, 225, 244, 221, 18, 188, 60, 152, 212, 247, 231, 59,
- 216, 131, 221, 18, 188, 60, 152, 222, 126, 221, 17, 60, 152, 251, 57,
- 212, 247, 231, 58, 60, 152, 251, 146, 220, 183, 212, 247, 231, 58, 60,
- 152, 235, 194, 216, 130, 60, 152, 248, 12, 216, 131, 251, 56, 60, 152,
- 221, 17, 60, 152, 228, 2, 221, 17, 60, 152, 216, 131, 221, 17, 60, 152,
- 228, 2, 216, 131, 221, 17, 60, 152, 223, 133, 250, 59, 219, 168, 221, 17,
- 60, 152, 223, 195, 242, 122, 221, 17, 60, 152, 250, 171, 255, 66, 223,
- 55, 231, 157, 184, 250, 195, 60, 152, 242, 94, 216, 130, 60, 232, 197, 5,
- 250, 90, 223, 54, 60, 232, 197, 5, 233, 23, 223, 54, 60, 253, 128, 5,
- 221, 27, 243, 41, 255, 67, 223, 54, 60, 253, 128, 5, 255, 64, 193, 60,
- 253, 128, 5, 222, 101, 216, 126, 60, 5, 224, 23, 247, 111, 243, 40, 60,
- 5, 224, 23, 247, 111, 242, 152, 60, 5, 224, 23, 247, 111, 242, 95, 60, 5,
- 224, 23, 230, 37, 243, 40, 60, 5, 224, 23, 230, 37, 242, 152, 60, 5, 224,
- 23, 247, 111, 224, 23, 230, 36, 60, 21, 212, 79, 60, 21, 116, 60, 21,
- 109, 60, 21, 166, 60, 21, 163, 60, 21, 180, 60, 21, 189, 60, 21, 198, 60,
- 21, 195, 60, 21, 200, 60, 21, 151, 116, 60, 21, 151, 109, 60, 21, 151,
- 166, 60, 21, 151, 163, 60, 21, 151, 180, 60, 21, 151, 189, 60, 21, 151,
- 198, 60, 21, 151, 195, 60, 21, 151, 200, 60, 21, 151, 212, 79, 60, 152,
- 251, 59, 223, 54, 60, 152, 229, 151, 250, 254, 228, 11, 212, 18, 60, 152,
- 250, 171, 255, 66, 223, 55, 250, 255, 231, 15, 250, 195, 60, 152, 229,
- 151, 250, 254, 221, 28, 223, 54, 60, 152, 250, 68, 231, 58, 60, 152, 216,
- 142, 255, 63, 60, 152, 242, 81, 223, 55, 242, 44, 60, 152, 242, 81, 223,
- 55, 242, 50, 60, 152, 254, 25, 234, 129, 242, 44, 60, 152, 254, 25, 234,
- 129, 242, 50, 60, 5, 213, 55, 216, 129, 60, 5, 231, 230, 216, 129, 60, 1,
- 181, 60, 1, 234, 138, 60, 1, 243, 110, 60, 1, 242, 225, 60, 1, 229, 159,
- 60, 1, 250, 219, 60, 1, 250, 92, 60, 1, 235, 139, 60, 1, 228, 23, 60, 1,
- 216, 115, 60, 1, 216, 105, 60, 1, 248, 86, 60, 1, 248, 70, 60, 1, 228,
- 198, 60, 1, 218, 52, 60, 1, 217, 161, 60, 1, 248, 164, 60, 1, 247, 232,
- 60, 1, 205, 60, 1, 193, 60, 1, 226, 23, 60, 1, 252, 107, 60, 1, 251, 195,
- 60, 1, 188, 60, 1, 216, 141, 60, 1, 216, 133, 60, 1, 245, 249, 60, 1,
- 245, 244, 60, 1, 214, 49, 60, 1, 212, 75, 60, 1, 212, 109, 60, 1, 255,
- 69, 60, 1, 186, 60, 1, 203, 60, 1, 233, 157, 60, 1, 221, 24, 60, 1, 219,
- 157, 60, 1, 222, 202, 60, 1, 159, 60, 1, 61, 60, 1, 233, 241, 60, 1, 244,
- 46, 203, 60, 1, 234, 55, 60, 1, 223, 81, 60, 30, 5, 254, 232, 60, 30, 5,
- 72, 60, 30, 5, 236, 28, 60, 30, 5, 69, 60, 30, 5, 215, 92, 60, 30, 5,
- 161, 149, 60, 30, 5, 161, 223, 82, 60, 30, 5, 161, 150, 60, 30, 5, 161,
- 232, 214, 60, 30, 5, 74, 60, 30, 5, 245, 165, 60, 30, 5, 75, 60, 30, 5,
- 227, 49, 60, 5, 223, 118, 219, 28, 229, 160, 223, 112, 60, 5, 223, 117,
- 251, 252, 60, 30, 5, 223, 202, 72, 60, 30, 5, 223, 202, 236, 28, 60, 5,
- 228, 11, 212, 19, 230, 44, 248, 164, 60, 5, 219, 255, 233, 84, 60, 152,
- 242, 11, 60, 152, 226, 184, 60, 5, 233, 87, 223, 54, 60, 5, 213, 59, 223,
- 54, 60, 5, 233, 88, 216, 142, 250, 195, 60, 5, 231, 159, 250, 195, 60, 5,
- 242, 97, 250, 196, 223, 193, 60, 5, 242, 97, 231, 150, 223, 193, 60, 5,
- 235, 191, 231, 159, 250, 195, 60, 219, 18, 5, 233, 88, 216, 142, 250,
- 195, 60, 219, 18, 5, 231, 159, 250, 195, 60, 219, 18, 5, 235, 191, 231,
- 159, 250, 195, 60, 219, 18, 1, 181, 60, 219, 18, 1, 234, 138, 60, 219,
- 18, 1, 243, 110, 60, 219, 18, 1, 242, 225, 60, 219, 18, 1, 229, 159, 60,
- 219, 18, 1, 250, 219, 60, 219, 18, 1, 250, 92, 60, 219, 18, 1, 235, 139,
- 60, 219, 18, 1, 228, 23, 60, 219, 18, 1, 216, 115, 60, 219, 18, 1, 216,
- 105, 60, 219, 18, 1, 248, 86, 60, 219, 18, 1, 248, 70, 60, 219, 18, 1,
- 228, 198, 60, 219, 18, 1, 218, 52, 60, 219, 18, 1, 217, 161, 60, 219, 18,
- 1, 248, 164, 60, 219, 18, 1, 247, 232, 60, 219, 18, 1, 205, 60, 219, 18,
- 1, 193, 60, 219, 18, 1, 226, 23, 60, 219, 18, 1, 252, 107, 60, 219, 18,
- 1, 251, 195, 60, 219, 18, 1, 188, 60, 219, 18, 1, 216, 141, 60, 219, 18,
- 1, 216, 133, 60, 219, 18, 1, 245, 249, 60, 219, 18, 1, 245, 244, 60, 219,
- 18, 1, 214, 49, 60, 219, 18, 1, 212, 75, 60, 219, 18, 1, 212, 109, 60,
- 219, 18, 1, 255, 69, 60, 219, 18, 1, 186, 60, 219, 18, 1, 203, 60, 219,
- 18, 1, 233, 157, 60, 219, 18, 1, 221, 24, 60, 219, 18, 1, 219, 157, 60,
- 219, 18, 1, 222, 202, 60, 219, 18, 1, 159, 60, 219, 18, 1, 61, 60, 219,
- 18, 1, 233, 241, 60, 219, 18, 1, 244, 46, 214, 49, 60, 219, 18, 1, 244,
- 46, 186, 60, 219, 18, 1, 244, 46, 203, 60, 233, 239, 223, 52, 234, 138,
- 60, 233, 239, 223, 52, 234, 139, 250, 255, 231, 15, 250, 195, 60, 250,
- 184, 5, 107, 251, 246, 60, 250, 184, 5, 177, 251, 246, 60, 250, 184, 5,
- 250, 185, 217, 228, 60, 250, 184, 5, 222, 125, 255, 68, 60, 16, 246, 46,
- 251, 54, 60, 16, 224, 22, 223, 119, 60, 16, 226, 202, 243, 39, 60, 16,
- 224, 22, 223, 120, 223, 195, 242, 121, 60, 16, 225, 244, 193, 60, 16,
- 228, 170, 251, 54, 60, 16, 228, 170, 251, 55, 228, 2, 255, 65, 60, 16,
- 228, 170, 251, 55, 242, 96, 255, 65, 60, 16, 228, 170, 251, 55, 250, 255,
- 255, 65, 60, 5, 224, 23, 230, 37, 224, 23, 247, 110, 60, 5, 224, 23, 230,
- 37, 242, 95, 60, 152, 251, 58, 220, 183, 242, 191, 231, 59, 223, 194, 60,
- 152, 230, 233, 212, 247, 242, 191, 231, 59, 223, 194, 60, 152, 228, 2,
- 216, 130, 60, 152, 70, 251, 79, 223, 114, 212, 247, 231, 59, 231, 158,
- 188, 60, 152, 249, 189, 251, 79, 223, 114, 212, 247, 231, 59, 221, 30,
- 188, 223, 147, 218, 200, 52, 233, 69, 218, 200, 52, 223, 147, 218, 200,
- 5, 2, 247, 72, 233, 69, 218, 200, 5, 2, 247, 72, 60, 152, 233, 79, 231,
- 160, 223, 54, 60, 152, 216, 207, 231, 160, 223, 54, 64, 1, 181, 64, 1,
- 234, 138, 64, 1, 243, 110, 64, 1, 242, 225, 64, 1, 229, 159, 64, 1, 250,
- 219, 64, 1, 250, 92, 64, 1, 235, 139, 64, 1, 235, 115, 64, 1, 228, 23,
- 64, 1, 228, 187, 64, 1, 216, 115, 64, 1, 216, 105, 64, 1, 248, 86, 64, 1,
- 248, 70, 64, 1, 228, 198, 64, 1, 218, 52, 64, 1, 217, 161, 64, 1, 248,
- 164, 64, 1, 247, 232, 64, 1, 205, 64, 1, 193, 64, 1, 226, 23, 64, 1, 252,
- 107, 64, 1, 251, 195, 64, 1, 188, 64, 1, 186, 64, 1, 203, 64, 1, 233,
- 157, 64, 1, 214, 49, 64, 1, 222, 202, 64, 1, 159, 64, 1, 232, 213, 64, 1,
- 61, 64, 1, 221, 9, 61, 64, 1, 72, 64, 1, 236, 28, 64, 1, 69, 64, 1, 215,
- 92, 64, 1, 74, 64, 1, 230, 221, 74, 64, 1, 75, 64, 1, 253, 108, 64, 30,
- 5, 218, 15, 254, 232, 64, 30, 5, 254, 232, 64, 30, 5, 72, 64, 30, 5, 236,
- 28, 64, 30, 5, 69, 64, 30, 5, 215, 92, 64, 30, 5, 74, 64, 30, 5, 254,
- 108, 64, 30, 5, 230, 221, 236, 28, 64, 30, 5, 230, 221, 75, 64, 30, 5,
- 191, 49, 64, 5, 253, 242, 64, 5, 62, 55, 64, 5, 214, 128, 64, 5, 214,
- 133, 64, 5, 253, 150, 64, 249, 133, 5, 138, 186, 64, 249, 133, 5, 138,
- 203, 64, 249, 133, 5, 138, 214, 49, 64, 249, 133, 5, 138, 159, 64, 1,
- 242, 109, 222, 202, 64, 21, 212, 79, 64, 21, 116, 64, 21, 109, 64, 21,
- 166, 64, 21, 163, 64, 21, 180, 64, 21, 189, 64, 21, 198, 64, 21, 195, 64,
- 21, 200, 64, 5, 232, 221, 222, 91, 64, 5, 222, 91, 64, 16, 232, 205, 64,
- 16, 249, 152, 64, 16, 254, 125, 64, 16, 243, 24, 64, 1, 221, 24, 64, 1,
- 219, 157, 64, 1, 161, 149, 64, 1, 161, 223, 82, 64, 1, 161, 150, 64, 1,
- 161, 232, 214, 64, 30, 5, 161, 149, 64, 30, 5, 161, 223, 82, 64, 30, 5,
- 161, 150, 64, 30, 5, 161, 232, 214, 64, 1, 230, 221, 229, 159, 64, 1,
- 230, 221, 235, 115, 64, 1, 230, 221, 252, 31, 64, 1, 230, 221, 252, 26,
- 64, 249, 133, 5, 230, 221, 138, 205, 64, 249, 133, 5, 230, 221, 138, 188,
- 64, 249, 133, 5, 230, 221, 138, 233, 157, 64, 1, 221, 29, 234, 218, 221,
- 24, 64, 30, 5, 221, 29, 234, 218, 245, 22, 64, 160, 152, 221, 29, 234,
- 218, 241, 230, 64, 160, 152, 221, 29, 234, 218, 234, 189, 225, 253, 64,
- 1, 213, 248, 224, 252, 234, 218, 217, 161, 64, 1, 213, 248, 224, 252,
- 234, 218, 225, 2, 64, 30, 5, 213, 248, 224, 252, 234, 218, 245, 22, 64,
- 30, 5, 213, 248, 224, 252, 234, 218, 215, 183, 64, 5, 213, 248, 224, 252,
- 234, 218, 216, 240, 64, 5, 213, 248, 224, 252, 234, 218, 216, 239, 64, 5,
- 213, 248, 224, 252, 234, 218, 216, 238, 64, 5, 213, 248, 224, 252, 234,
- 218, 216, 237, 64, 5, 213, 248, 224, 252, 234, 218, 216, 236, 64, 1, 245,
- 175, 224, 252, 234, 218, 228, 198, 64, 1, 245, 175, 224, 252, 234, 218,
- 212, 168, 64, 1, 245, 175, 224, 252, 234, 218, 242, 193, 64, 30, 5, 243,
- 35, 234, 218, 72, 64, 30, 5, 234, 194, 227, 99, 64, 30, 5, 234, 194, 69,
- 64, 30, 5, 234, 194, 245, 165, 64, 1, 221, 9, 181, 64, 1, 221, 9, 234,
- 138, 64, 1, 221, 9, 243, 110, 64, 1, 221, 9, 250, 219, 64, 1, 221, 9,
- 212, 109, 64, 1, 221, 9, 228, 23, 64, 1, 221, 9, 248, 164, 64, 1, 221, 9,
- 205, 64, 1, 221, 9, 226, 23, 64, 1, 221, 9, 244, 164, 64, 1, 221, 9, 252,
- 107, 64, 1, 221, 9, 217, 161, 64, 1, 221, 9, 159, 64, 249, 133, 5, 221,
- 9, 138, 214, 49, 64, 30, 5, 221, 9, 254, 232, 64, 30, 5, 221, 9, 74, 64,
- 30, 5, 221, 9, 191, 49, 64, 30, 5, 221, 9, 40, 213, 105, 64, 5, 221, 9,
- 216, 239, 64, 5, 221, 9, 216, 238, 64, 5, 221, 9, 216, 236, 64, 5, 221,
- 9, 216, 235, 64, 5, 221, 9, 249, 91, 216, 239, 64, 5, 221, 9, 249, 91,
- 216, 238, 64, 5, 221, 9, 249, 91, 245, 111, 216, 241, 64, 1, 223, 39,
- 226, 190, 244, 164, 64, 5, 223, 39, 226, 190, 216, 236, 64, 221, 9, 21,
- 212, 79, 64, 221, 9, 21, 116, 64, 221, 9, 21, 109, 64, 221, 9, 21, 166,
- 64, 221, 9, 21, 163, 64, 221, 9, 21, 180, 64, 221, 9, 21, 189, 64, 221,
- 9, 21, 198, 64, 221, 9, 21, 195, 64, 221, 9, 21, 200, 64, 5, 234, 132,
- 216, 240, 64, 5, 234, 132, 216, 238, 64, 30, 5, 254, 98, 61, 64, 30, 5,
- 254, 98, 254, 108, 64, 16, 221, 9, 116, 64, 16, 221, 9, 244, 253, 100, 6,
- 1, 254, 32, 100, 6, 1, 252, 71, 100, 6, 1, 243, 82, 100, 6, 1, 247, 82,
- 100, 6, 1, 245, 108, 100, 6, 1, 214, 141, 100, 6, 1, 212, 82, 100, 6, 1,
- 218, 11, 100, 6, 1, 235, 251, 100, 6, 1, 234, 239, 100, 6, 1, 233, 104,
- 100, 6, 1, 231, 248, 100, 6, 1, 230, 15, 100, 6, 1, 227, 62, 100, 6, 1,
- 226, 145, 100, 6, 1, 212, 71, 100, 6, 1, 224, 61, 100, 6, 1, 222, 159,
- 100, 6, 1, 218, 1, 100, 6, 1, 215, 160, 100, 6, 1, 226, 16, 100, 6, 1,
- 234, 127, 100, 6, 1, 242, 217, 100, 6, 1, 224, 217, 100, 6, 1, 220, 200,
- 100, 6, 1, 250, 34, 100, 6, 1, 250, 195, 100, 6, 1, 235, 103, 100, 6, 1,
- 249, 233, 100, 6, 1, 250, 79, 100, 6, 1, 213, 151, 100, 6, 1, 235, 113,
- 100, 6, 1, 242, 24, 100, 6, 1, 241, 222, 100, 6, 1, 241, 160, 100, 6, 1,
- 214, 6, 100, 6, 1, 241, 243, 100, 6, 1, 241, 51, 100, 1, 254, 32, 100, 1,
- 252, 71, 100, 1, 243, 82, 100, 1, 247, 82, 100, 1, 245, 108, 100, 1, 214,
- 141, 100, 1, 212, 82, 100, 1, 218, 11, 100, 1, 235, 251, 100, 1, 234,
- 239, 100, 1, 233, 104, 100, 1, 231, 248, 100, 1, 230, 15, 100, 1, 227,
- 62, 100, 1, 226, 145, 100, 1, 212, 71, 100, 1, 224, 61, 100, 1, 222, 159,
- 100, 1, 218, 1, 100, 1, 215, 160, 100, 1, 226, 16, 100, 1, 234, 127, 100,
- 1, 242, 217, 100, 1, 224, 217, 100, 1, 220, 200, 100, 1, 250, 34, 100, 1,
- 250, 195, 100, 1, 235, 103, 100, 1, 249, 233, 100, 1, 250, 79, 100, 1,
- 213, 151, 100, 1, 235, 113, 100, 1, 242, 24, 100, 1, 241, 222, 100, 1,
- 241, 160, 100, 1, 214, 6, 100, 1, 241, 243, 100, 1, 241, 51, 100, 1, 244,
- 90, 100, 1, 212, 237, 100, 1, 245, 122, 100, 1, 216, 58, 243, 82, 100, 1,
- 254, 103, 100, 226, 143, 221, 57, 59, 1, 100, 230, 15, 23, 97, 234, 67,
- 23, 97, 219, 150, 23, 97, 229, 57, 23, 97, 217, 55, 23, 97, 219, 139, 23,
- 97, 223, 179, 23, 97, 231, 30, 23, 97, 225, 227, 23, 97, 219, 147, 23,
- 97, 220, 76, 23, 97, 219, 144, 23, 97, 236, 51, 23, 97, 249, 239, 23, 97,
- 219, 154, 23, 97, 250, 43, 23, 97, 234, 116, 23, 97, 217, 126, 23, 97,
- 226, 7, 23, 97, 241, 158, 23, 97, 229, 53, 23, 97, 219, 148, 23, 97, 229,
- 47, 23, 97, 229, 51, 23, 97, 217, 52, 23, 97, 223, 167, 23, 97, 219, 146,
- 23, 97, 223, 177, 23, 97, 234, 223, 23, 97, 231, 23, 23, 97, 234, 226,
- 23, 97, 225, 222, 23, 97, 225, 220, 23, 97, 225, 208, 23, 97, 225, 216,
- 23, 97, 225, 214, 23, 97, 225, 211, 23, 97, 225, 213, 23, 97, 225, 210,
- 23, 97, 225, 215, 23, 97, 225, 225, 23, 97, 225, 226, 23, 97, 225, 209,
- 23, 97, 225, 219, 23, 97, 234, 224, 23, 97, 234, 222, 23, 97, 220, 69,
- 23, 97, 220, 67, 23, 97, 220, 59, 23, 97, 220, 62, 23, 97, 220, 68, 23,
- 97, 220, 64, 23, 97, 220, 63, 23, 97, 220, 61, 23, 97, 220, 72, 23, 97,
- 220, 74, 23, 97, 220, 75, 23, 97, 220, 70, 23, 97, 220, 60, 23, 97, 220,
- 65, 23, 97, 220, 73, 23, 97, 250, 27, 23, 97, 250, 25, 23, 97, 250, 102,
- 23, 97, 250, 100, 23, 97, 226, 160, 23, 97, 236, 46, 23, 97, 236, 37, 23,
- 97, 236, 45, 23, 97, 236, 42, 23, 97, 236, 40, 23, 97, 236, 44, 23, 97,
- 219, 151, 23, 97, 236, 49, 23, 97, 236, 50, 23, 97, 236, 38, 23, 97, 236,
- 43, 23, 97, 213, 17, 23, 97, 249, 238, 23, 97, 250, 28, 23, 97, 250, 26,
- 23, 97, 250, 103, 23, 97, 250, 101, 23, 97, 250, 41, 23, 97, 250, 42, 23,
- 97, 250, 29, 23, 97, 250, 104, 23, 97, 226, 5, 23, 97, 234, 225, 23, 97,
- 219, 152, 23, 97, 213, 23, 23, 97, 234, 58, 23, 97, 229, 49, 23, 97, 229,
- 55, 23, 97, 229, 54, 23, 97, 217, 49, 23, 97, 244, 72, 23, 135, 244, 72,
- 23, 135, 61, 23, 135, 254, 148, 23, 135, 186, 23, 135, 213, 80, 23, 135,
- 245, 76, 23, 135, 74, 23, 135, 213, 27, 23, 135, 213, 38, 23, 135, 75,
- 23, 135, 214, 49, 23, 135, 214, 46, 23, 135, 227, 99, 23, 135, 212, 235,
- 23, 135, 69, 23, 135, 213, 252, 23, 135, 214, 6, 23, 135, 213, 235, 23,
- 135, 212, 203, 23, 135, 245, 22, 23, 135, 212, 255, 23, 135, 72, 23, 135,
- 255, 60, 23, 135, 255, 59, 23, 135, 213, 94, 23, 135, 213, 92, 23, 135,
- 245, 74, 23, 135, 245, 73, 23, 135, 245, 75, 23, 135, 213, 26, 23, 135,
- 213, 25, 23, 135, 227, 204, 23, 135, 227, 205, 23, 135, 227, 198, 23,
- 135, 227, 203, 23, 135, 227, 201, 23, 135, 212, 229, 23, 135, 212, 228,
- 23, 135, 212, 227, 23, 135, 212, 230, 23, 135, 212, 231, 23, 135, 215,
- 252, 23, 135, 215, 251, 23, 135, 215, 250, 23, 135, 215, 247, 23, 135,
- 215, 248, 23, 135, 212, 202, 23, 135, 212, 199, 23, 135, 212, 200, 23,
- 135, 212, 194, 23, 135, 212, 195, 23, 135, 212, 196, 23, 135, 212, 198,
- 23, 135, 245, 16, 23, 135, 245, 18, 23, 135, 212, 254, 23, 135, 240, 145,
- 23, 135, 240, 137, 23, 135, 240, 140, 23, 135, 240, 138, 23, 135, 240,
- 142, 23, 135, 240, 144, 23, 135, 253, 204, 23, 135, 253, 201, 23, 135,
- 253, 199, 23, 135, 253, 200, 23, 135, 219, 155, 23, 135, 255, 61, 23,
- 135, 213, 93, 23, 135, 213, 24, 23, 135, 227, 200, 23, 135, 227, 199, 23,
- 89, 234, 67, 23, 89, 219, 150, 23, 89, 234, 60, 23, 89, 229, 57, 23, 89,
- 229, 55, 23, 89, 229, 54, 23, 89, 217, 55, 23, 89, 223, 179, 23, 89, 223,
- 174, 23, 89, 223, 171, 23, 89, 223, 164, 23, 89, 223, 159, 23, 89, 223,
- 154, 23, 89, 223, 165, 23, 89, 223, 177, 23, 89, 231, 30, 23, 89, 225,
- 227, 23, 89, 225, 216, 23, 89, 220, 76, 23, 89, 219, 144, 23, 89, 236,
- 51, 23, 89, 249, 239, 23, 89, 250, 43, 23, 89, 234, 116, 23, 89, 217,
- 126, 23, 89, 226, 7, 23, 89, 241, 158, 23, 89, 234, 61, 23, 89, 234, 59,
- 23, 89, 229, 53, 23, 89, 229, 47, 23, 89, 229, 49, 23, 89, 229, 52, 23,
- 89, 229, 48, 23, 89, 217, 52, 23, 89, 217, 49, 23, 89, 223, 172, 23, 89,
- 223, 167, 23, 89, 223, 153, 23, 89, 223, 152, 23, 89, 219, 146, 23, 89,
- 223, 169, 23, 89, 223, 168, 23, 89, 223, 161, 23, 89, 223, 163, 23, 89,
- 223, 176, 23, 89, 223, 156, 23, 89, 223, 166, 23, 89, 223, 175, 23, 89,
- 223, 151, 23, 89, 231, 26, 23, 89, 231, 21, 23, 89, 231, 23, 23, 89, 231,
- 20, 23, 89, 231, 18, 23, 89, 231, 24, 23, 89, 231, 29, 23, 89, 231, 27,
- 23, 89, 234, 226, 23, 89, 225, 218, 23, 89, 225, 219, 23, 89, 225, 224,
- 23, 89, 234, 224, 23, 89, 220, 69, 23, 89, 220, 59, 23, 89, 220, 62, 23,
- 89, 220, 64, 23, 89, 226, 160, 23, 89, 236, 46, 23, 89, 236, 39, 23, 89,
- 219, 151, 23, 89, 236, 47, 23, 89, 213, 17, 23, 89, 213, 13, 23, 89, 213,
- 14, 23, 89, 226, 5, 23, 89, 234, 225, 23, 89, 241, 156, 23, 89, 241, 154,
- 23, 89, 241, 157, 23, 89, 241, 155, 23, 89, 213, 23, 23, 89, 234, 63, 23,
- 89, 234, 62, 23, 89, 234, 66, 23, 89, 234, 64, 23, 89, 234, 65, 23, 89,
- 219, 148, 28, 4, 159, 28, 4, 240, 212, 28, 4, 241, 165, 28, 4, 242, 27,
- 28, 4, 241, 204, 28, 4, 241, 222, 28, 4, 241, 54, 28, 4, 241, 53, 28, 4,
- 233, 157, 28, 4, 232, 156, 28, 4, 233, 13, 28, 4, 233, 156, 28, 4, 233,
- 74, 28, 4, 233, 82, 28, 4, 232, 208, 28, 4, 232, 129, 28, 4, 241, 174,
- 28, 4, 241, 168, 28, 4, 241, 170, 28, 4, 241, 173, 28, 4, 241, 171, 28,
- 4, 241, 172, 28, 4, 241, 169, 28, 4, 241, 167, 28, 4, 188, 28, 4, 230,
- 172, 28, 4, 231, 42, 28, 4, 232, 41, 28, 4, 231, 145, 28, 4, 231, 156,
- 28, 4, 230, 231, 28, 4, 230, 114, 28, 4, 218, 110, 28, 4, 218, 104, 28,
- 4, 218, 106, 28, 4, 218, 109, 28, 4, 218, 107, 28, 4, 218, 108, 28, 4,
- 218, 105, 28, 4, 218, 103, 28, 4, 203, 28, 4, 223, 51, 28, 4, 223, 188,
- 28, 4, 224, 74, 28, 4, 224, 1, 28, 4, 224, 21, 28, 4, 223, 112, 28, 4,
- 223, 21, 28, 4, 222, 202, 28, 4, 219, 27, 28, 4, 220, 117, 28, 4, 222,
- 200, 28, 4, 222, 89, 28, 4, 222, 100, 28, 4, 219, 242, 28, 4, 218, 198,
- 28, 4, 221, 24, 28, 4, 220, 150, 28, 4, 220, 212, 28, 4, 221, 20, 28, 4,
- 220, 241, 28, 4, 220, 243, 28, 4, 220, 187, 28, 4, 220, 134, 28, 4, 224,
- 232, 28, 4, 224, 175, 28, 4, 224, 198, 28, 4, 224, 231, 28, 4, 224, 212,
- 28, 4, 224, 213, 28, 4, 224, 187, 28, 4, 224, 186, 28, 4, 224, 131, 28,
- 4, 224, 127, 28, 4, 224, 130, 28, 4, 224, 128, 28, 4, 224, 129, 28, 4,
- 224, 210, 28, 4, 224, 204, 28, 4, 224, 206, 28, 4, 224, 209, 28, 4, 224,
- 207, 28, 4, 224, 208, 28, 4, 224, 205, 28, 4, 224, 203, 28, 4, 224, 199,
- 28, 4, 224, 202, 28, 4, 224, 200, 28, 4, 224, 201, 28, 4, 252, 107, 28,
- 4, 251, 54, 28, 4, 251, 184, 28, 4, 252, 106, 28, 4, 251, 242, 28, 4,
- 251, 251, 28, 4, 251, 128, 28, 4, 251, 12, 28, 4, 215, 1, 28, 4, 214, 99,
- 28, 4, 214, 154, 28, 4, 215, 0, 28, 4, 214, 227, 28, 4, 214, 232, 28, 4,
- 214, 119, 28, 4, 214, 91, 28, 4, 218, 52, 28, 4, 216, 82, 28, 4, 217, 71,
- 28, 4, 218, 49, 28, 4, 217, 219, 28, 4, 217, 229, 28, 4, 108, 28, 4, 216,
- 45, 28, 4, 250, 219, 28, 4, 249, 53, 28, 4, 249, 244, 28, 4, 250, 218,
- 28, 4, 250, 116, 28, 4, 250, 124, 28, 4, 249, 175, 28, 4, 249, 24, 28, 4,
- 213, 153, 28, 4, 213, 129, 28, 4, 213, 145, 28, 4, 213, 152, 28, 4, 213,
- 149, 28, 4, 213, 150, 28, 4, 213, 136, 28, 4, 213, 135, 28, 4, 213, 124,
- 28, 4, 213, 120, 28, 4, 213, 123, 28, 4, 213, 121, 28, 4, 213, 122, 28,
- 4, 205, 28, 4, 228, 92, 28, 4, 229, 64, 28, 4, 230, 43, 28, 4, 229, 184,
- 28, 4, 229, 187, 28, 4, 228, 185, 28, 4, 228, 31, 28, 4, 228, 23, 28, 4,
- 227, 247, 28, 4, 228, 10, 28, 4, 228, 22, 28, 4, 228, 16, 28, 4, 228, 17,
- 28, 4, 227, 253, 28, 4, 227, 239, 28, 4, 242, 156, 61, 28, 4, 242, 156,
- 69, 28, 4, 242, 156, 72, 28, 4, 242, 156, 254, 232, 28, 4, 242, 156, 245,
- 165, 28, 4, 242, 156, 74, 28, 4, 242, 156, 75, 28, 4, 242, 156, 214, 49,
- 28, 4, 181, 28, 4, 233, 238, 28, 4, 234, 101, 28, 4, 235, 14, 28, 4, 234,
- 187, 28, 4, 234, 188, 28, 4, 234, 37, 28, 4, 234, 36, 28, 4, 233, 204,
- 28, 4, 233, 198, 28, 4, 233, 203, 28, 4, 233, 199, 28, 4, 233, 200, 28,
- 4, 233, 193, 28, 4, 233, 187, 28, 4, 233, 189, 28, 4, 233, 192, 28, 4,
- 233, 190, 28, 4, 233, 191, 28, 4, 233, 188, 28, 4, 233, 186, 28, 4, 233,
- 182, 28, 4, 233, 185, 28, 4, 233, 183, 28, 4, 233, 184, 28, 4, 214, 49,
- 28, 4, 213, 183, 28, 4, 213, 235, 28, 4, 214, 48, 28, 4, 214, 1, 28, 4,
- 214, 6, 28, 4, 213, 214, 28, 4, 213, 213, 28, 4, 226, 15, 61, 28, 4, 226,
- 15, 69, 28, 4, 226, 15, 72, 28, 4, 226, 15, 254, 232, 28, 4, 226, 15,
- 245, 165, 28, 4, 226, 15, 74, 28, 4, 226, 15, 75, 28, 4, 212, 109, 28, 4,
- 212, 8, 28, 4, 212, 37, 28, 4, 212, 108, 28, 4, 212, 85, 28, 4, 212, 87,
- 28, 4, 212, 16, 28, 4, 211, 251, 28, 4, 212, 75, 28, 4, 212, 55, 28, 4,
- 212, 62, 28, 4, 212, 74, 28, 4, 212, 66, 28, 4, 212, 67, 28, 4, 212, 60,
- 28, 4, 212, 46, 28, 4, 186, 28, 4, 212, 203, 28, 4, 212, 255, 28, 4, 213,
- 91, 28, 4, 213, 35, 28, 4, 213, 38, 28, 4, 212, 235, 28, 4, 212, 226, 28,
- 4, 248, 164, 28, 4, 246, 33, 28, 4, 247, 211, 28, 4, 248, 163, 28, 4,
- 248, 28, 28, 4, 248, 41, 28, 4, 247, 99, 28, 4, 246, 2, 28, 4, 248, 86,
- 28, 4, 248, 51, 28, 4, 248, 63, 28, 4, 248, 85, 28, 4, 248, 73, 28, 4,
- 248, 74, 28, 4, 248, 56, 28, 4, 248, 42, 28, 4, 235, 139, 28, 4, 235, 54,
- 28, 4, 235, 110, 28, 4, 235, 138, 28, 4, 235, 125, 28, 4, 235, 127, 28,
- 4, 235, 71, 28, 4, 235, 35, 28, 4, 243, 110, 28, 4, 242, 92, 28, 4, 242,
- 190, 28, 4, 243, 107, 28, 4, 243, 31, 28, 4, 243, 38, 28, 4, 242, 150,
- 28, 4, 242, 149, 28, 4, 242, 59, 28, 4, 242, 55, 28, 4, 242, 58, 28, 4,
- 242, 56, 28, 4, 242, 57, 28, 4, 243, 5, 28, 4, 242, 241, 28, 4, 242, 251,
- 28, 4, 243, 4, 28, 4, 242, 255, 28, 4, 243, 0, 28, 4, 242, 245, 28, 4,
- 242, 230, 28, 4, 217, 161, 28, 4, 217, 90, 28, 4, 217, 128, 28, 4, 217,
- 160, 28, 4, 217, 147, 28, 4, 217, 148, 28, 4, 217, 109, 28, 4, 217, 82,
- 28, 4, 250, 92, 28, 4, 250, 6, 28, 4, 250, 47, 28, 4, 250, 91, 28, 4,
- 250, 64, 28, 4, 250, 67, 28, 4, 250, 23, 28, 4, 249, 251, 28, 4, 226, 23,
- 28, 4, 225, 246, 28, 4, 226, 9, 28, 4, 226, 22, 28, 4, 226, 11, 28, 4,
- 226, 12, 28, 4, 225, 253, 28, 4, 225, 242, 28, 4, 216, 141, 28, 4, 216,
- 122, 28, 4, 216, 125, 28, 4, 216, 140, 28, 4, 216, 135, 28, 4, 216, 136,
- 28, 4, 216, 124, 28, 4, 216, 120, 28, 4, 216, 5, 28, 4, 215, 253, 28, 4,
- 216, 1, 28, 4, 216, 4, 28, 4, 216, 2, 28, 4, 216, 3, 28, 4, 215, 255, 28,
- 4, 215, 254, 28, 4, 244, 164, 28, 4, 243, 205, 28, 4, 244, 90, 28, 4,
- 244, 163, 28, 4, 244, 116, 28, 4, 244, 123, 28, 4, 244, 12, 28, 4, 243,
- 188, 28, 4, 193, 28, 4, 225, 35, 28, 4, 225, 240, 28, 4, 226, 213, 28, 4,
- 226, 86, 28, 4, 226, 96, 28, 4, 225, 150, 28, 4, 225, 2, 28, 4, 223, 11,
- 28, 4, 230, 103, 28, 4, 243, 182, 28, 37, 243, 29, 24, 30, 233, 47, 77,
- 28, 37, 30, 233, 47, 77, 28, 37, 243, 29, 77, 28, 222, 92, 77, 28, 213,
- 195, 28, 243, 200, 219, 69, 28, 249, 157, 28, 221, 70, 28, 249, 164, 28,
- 225, 79, 249, 164, 28, 224, 158, 77, 28, 226, 143, 221, 57, 28, 21, 116,
- 28, 21, 109, 28, 21, 166, 28, 21, 163, 28, 21, 180, 28, 21, 189, 28, 21,
- 198, 28, 21, 195, 28, 21, 200, 28, 50, 217, 200, 28, 50, 216, 38, 28, 50,
- 217, 115, 28, 50, 243, 240, 28, 50, 244, 83, 28, 50, 220, 39, 28, 50,
- 221, 37, 28, 50, 245, 141, 28, 50, 229, 26, 28, 50, 240, 200, 28, 50,
- 217, 201, 217, 100, 28, 4, 222, 96, 230, 114, 28, 4, 230, 110, 28, 4,
- 230, 111, 28, 4, 230, 112, 28, 4, 222, 96, 251, 12, 28, 4, 251, 9, 28, 4,
- 251, 10, 28, 4, 251, 11, 28, 4, 222, 96, 243, 188, 28, 4, 243, 184, 28,
- 4, 243, 185, 28, 4, 243, 186, 28, 4, 222, 96, 225, 2, 28, 4, 224, 254,
- 28, 4, 224, 255, 28, 4, 225, 0, 28, 216, 242, 152, 212, 238, 28, 216,
- 242, 152, 247, 248, 28, 216, 242, 152, 223, 135, 28, 216, 242, 152, 220,
- 175, 223, 135, 28, 216, 242, 152, 247, 187, 28, 216, 242, 152, 234, 170,
- 28, 216, 242, 152, 250, 31, 28, 216, 242, 152, 241, 162, 28, 216, 242,
- 152, 247, 247, 28, 216, 242, 152, 233, 215, 158, 1, 61, 158, 1, 74, 158,
- 1, 72, 158, 1, 75, 158, 1, 69, 158, 1, 215, 79, 158, 1, 243, 110, 158, 1,
- 181, 158, 1, 243, 38, 158, 1, 242, 190, 158, 1, 242, 150, 158, 1, 242,
- 92, 158, 1, 242, 60, 158, 1, 159, 158, 1, 241, 222, 158, 1, 241, 165,
- 158, 1, 241, 54, 158, 1, 240, 212, 158, 1, 240, 193, 158, 1, 233, 157,
- 158, 1, 233, 82, 158, 1, 233, 13, 158, 1, 232, 208, 158, 1, 232, 156,
- 158, 1, 232, 130, 158, 1, 188, 158, 1, 231, 156, 158, 1, 231, 42, 158, 1,
- 230, 231, 158, 1, 230, 172, 158, 1, 205, 158, 1, 241, 76, 158, 1, 230,
- 31, 158, 1, 229, 187, 158, 1, 229, 64, 158, 1, 228, 185, 158, 1, 228, 92,
- 158, 1, 228, 33, 158, 1, 224, 174, 158, 1, 224, 161, 158, 1, 224, 154,
- 158, 1, 224, 146, 158, 1, 224, 135, 158, 1, 224, 133, 158, 1, 222, 202,
- 158, 1, 197, 158, 1, 222, 100, 158, 1, 220, 117, 158, 1, 219, 242, 158,
- 1, 219, 27, 158, 1, 218, 203, 158, 1, 248, 164, 158, 1, 218, 52, 158, 1,
- 248, 41, 158, 1, 217, 229, 158, 1, 247, 211, 158, 1, 217, 71, 158, 1,
- 247, 99, 158, 1, 246, 33, 158, 1, 246, 5, 158, 1, 247, 108, 158, 1, 217,
- 12, 158, 1, 217, 11, 158, 1, 217, 1, 158, 1, 217, 0, 158, 1, 216, 255,
- 158, 1, 216, 254, 158, 1, 216, 141, 158, 1, 216, 136, 158, 1, 216, 125,
- 158, 1, 216, 124, 158, 1, 216, 122, 158, 1, 216, 121, 158, 1, 214, 49,
- 158, 1, 214, 6, 158, 1, 213, 235, 158, 1, 213, 214, 158, 1, 213, 183,
- 158, 1, 213, 171, 158, 1, 186, 158, 1, 213, 38, 158, 1, 212, 255, 158, 1,
- 212, 235, 158, 1, 212, 203, 158, 1, 212, 169, 18, 19, 240, 160, 18, 19,
- 74, 18, 19, 254, 196, 18, 19, 72, 18, 19, 236, 28, 18, 19, 75, 18, 19,
- 227, 49, 18, 19, 213, 104, 227, 49, 18, 19, 66, 245, 165, 18, 19, 66, 72,
- 18, 19, 61, 18, 19, 254, 232, 18, 19, 214, 6, 18, 19, 148, 214, 6, 18,
- 19, 213, 235, 18, 19, 148, 213, 235, 18, 19, 213, 227, 18, 19, 148, 213,
- 227, 18, 19, 213, 214, 18, 19, 148, 213, 214, 18, 19, 213, 202, 18, 19,
- 148, 213, 202, 18, 19, 230, 11, 213, 202, 18, 19, 214, 49, 18, 19, 148,
- 214, 49, 18, 19, 214, 48, 18, 19, 148, 214, 48, 18, 19, 230, 11, 214, 48,
- 18, 19, 254, 108, 18, 19, 213, 104, 214, 82, 18, 19, 242, 156, 219, 69,
- 18, 19, 40, 179, 18, 19, 40, 242, 113, 18, 19, 40, 251, 101, 151, 223,
- 130, 18, 19, 40, 216, 227, 151, 223, 130, 18, 19, 40, 46, 151, 223, 130,
- 18, 19, 40, 223, 130, 18, 19, 40, 51, 179, 18, 19, 40, 51, 220, 175, 71,
- 219, 32, 18, 19, 40, 231, 37, 247, 74, 18, 19, 40, 220, 175, 199, 90, 18,
- 19, 40, 225, 156, 18, 19, 40, 119, 218, 36, 18, 19, 245, 108, 18, 19,
- 235, 251, 18, 19, 227, 62, 18, 19, 254, 32, 18, 19, 226, 96, 18, 19, 226,
- 211, 18, 19, 225, 240, 18, 19, 225, 203, 18, 19, 225, 150, 18, 19, 225,
- 129, 18, 19, 213, 104, 225, 129, 18, 19, 66, 241, 204, 18, 19, 66, 241,
- 165, 18, 19, 193, 18, 19, 226, 213, 18, 19, 225, 0, 18, 19, 148, 225, 0,
- 18, 19, 224, 254, 18, 19, 148, 224, 254, 18, 19, 224, 253, 18, 19, 148,
- 224, 253, 18, 19, 224, 251, 18, 19, 148, 224, 251, 18, 19, 224, 250, 18,
- 19, 148, 224, 250, 18, 19, 225, 2, 18, 19, 148, 225, 2, 18, 19, 225, 1,
- 18, 19, 148, 225, 1, 18, 19, 213, 104, 225, 1, 18, 19, 226, 229, 18, 19,
- 148, 226, 229, 18, 19, 66, 242, 41, 18, 19, 217, 229, 18, 19, 218, 47,
- 18, 19, 217, 71, 18, 19, 217, 57, 18, 19, 108, 18, 19, 216, 230, 18, 19,
- 213, 104, 216, 230, 18, 19, 66, 248, 28, 18, 19, 66, 247, 211, 18, 19,
- 218, 52, 18, 19, 218, 49, 18, 19, 216, 43, 18, 19, 148, 216, 43, 18, 19,
- 216, 27, 18, 19, 148, 216, 27, 18, 19, 216, 26, 18, 19, 148, 216, 26, 18,
- 19, 109, 18, 19, 148, 109, 18, 19, 216, 20, 18, 19, 148, 216, 20, 18, 19,
- 216, 45, 18, 19, 148, 216, 45, 18, 19, 216, 44, 18, 19, 148, 216, 44, 18,
- 19, 230, 11, 216, 44, 18, 19, 218, 99, 18, 19, 216, 112, 18, 19, 216, 96,
- 18, 19, 216, 95, 18, 19, 216, 115, 18, 19, 234, 188, 18, 19, 235, 11, 18,
- 19, 234, 101, 18, 19, 234, 92, 18, 19, 234, 37, 18, 19, 234, 19, 18, 19,
- 213, 104, 234, 19, 18, 19, 181, 18, 19, 235, 14, 18, 19, 233, 200, 18,
- 19, 148, 233, 200, 18, 19, 233, 198, 18, 19, 148, 233, 198, 18, 19, 233,
- 197, 18, 19, 148, 233, 197, 18, 19, 233, 196, 18, 19, 148, 233, 196, 18,
- 19, 233, 195, 18, 19, 148, 233, 195, 18, 19, 233, 204, 18, 19, 148, 233,
- 204, 18, 19, 233, 203, 18, 19, 148, 233, 203, 18, 19, 230, 11, 233, 203,
- 18, 19, 235, 27, 18, 19, 233, 205, 18, 19, 219, 214, 234, 182, 18, 19,
- 219, 214, 234, 93, 18, 19, 219, 214, 234, 32, 18, 19, 219, 214, 234, 252,
- 18, 19, 250, 124, 18, 19, 250, 217, 18, 19, 249, 244, 18, 19, 249, 234,
- 18, 19, 249, 175, 18, 19, 249, 113, 18, 19, 213, 104, 249, 113, 18, 19,
- 250, 219, 18, 19, 250, 218, 18, 19, 249, 22, 18, 19, 148, 249, 22, 18,
- 19, 249, 20, 18, 19, 148, 249, 20, 18, 19, 249, 19, 18, 19, 148, 249, 19,
- 18, 19, 249, 18, 18, 19, 148, 249, 18, 18, 19, 249, 17, 18, 19, 148, 249,
- 17, 18, 19, 249, 24, 18, 19, 148, 249, 24, 18, 19, 249, 23, 18, 19, 148,
- 249, 23, 18, 19, 230, 11, 249, 23, 18, 19, 250, 252, 18, 19, 222, 127,
- 217, 163, 18, 19, 231, 156, 18, 19, 232, 40, 18, 19, 231, 42, 18, 19,
- 231, 14, 18, 19, 230, 231, 18, 19, 230, 202, 18, 19, 213, 104, 230, 202,
- 18, 19, 188, 18, 19, 232, 41, 18, 19, 230, 112, 18, 19, 148, 230, 112,
- 18, 19, 230, 110, 18, 19, 148, 230, 110, 18, 19, 230, 109, 18, 19, 148,
- 230, 109, 18, 19, 230, 108, 18, 19, 148, 230, 108, 18, 19, 230, 107, 18,
- 19, 148, 230, 107, 18, 19, 230, 114, 18, 19, 148, 230, 114, 18, 19, 230,
- 113, 18, 19, 148, 230, 113, 18, 19, 230, 11, 230, 113, 18, 19, 183, 18,
- 19, 148, 183, 18, 19, 231, 45, 18, 19, 253, 121, 183, 18, 19, 222, 127,
- 183, 18, 19, 229, 187, 18, 19, 230, 42, 18, 19, 229, 64, 18, 19, 229, 39,
- 18, 19, 228, 185, 18, 19, 228, 175, 18, 19, 213, 104, 228, 175, 18, 19,
- 205, 18, 19, 230, 43, 18, 19, 228, 29, 18, 19, 148, 228, 29, 18, 19, 228,
- 31, 18, 19, 148, 228, 31, 18, 19, 228, 30, 18, 19, 148, 228, 30, 18, 19,
- 230, 11, 228, 30, 18, 19, 204, 18, 19, 66, 229, 161, 18, 19, 229, 69, 18,
- 19, 233, 82, 18, 19, 233, 155, 18, 19, 233, 13, 18, 19, 232, 255, 18, 19,
- 232, 208, 18, 19, 232, 180, 18, 19, 213, 104, 232, 180, 18, 19, 233, 157,
- 18, 19, 233, 156, 18, 19, 232, 127, 18, 19, 148, 232, 127, 18, 19, 232,
- 126, 18, 19, 148, 232, 126, 18, 19, 232, 125, 18, 19, 148, 232, 125, 18,
- 19, 232, 124, 18, 19, 148, 232, 124, 18, 19, 232, 123, 18, 19, 148, 232,
- 123, 18, 19, 232, 129, 18, 19, 148, 232, 129, 18, 19, 232, 128, 18, 19,
- 148, 232, 128, 18, 19, 150, 18, 19, 148, 150, 18, 19, 138, 150, 18, 19,
- 222, 100, 18, 19, 222, 198, 18, 19, 220, 117, 18, 19, 220, 101, 18, 19,
- 219, 242, 18, 19, 219, 226, 18, 19, 213, 104, 219, 226, 18, 19, 222, 202,
- 18, 19, 222, 200, 18, 19, 218, 194, 18, 19, 148, 218, 194, 18, 19, 218,
- 188, 18, 19, 148, 218, 188, 18, 19, 218, 187, 18, 19, 148, 218, 187, 18,
- 19, 218, 183, 18, 19, 148, 218, 183, 18, 19, 218, 182, 18, 19, 148, 218,
- 182, 18, 19, 218, 198, 18, 19, 148, 218, 198, 18, 19, 218, 197, 18, 19,
- 148, 218, 197, 18, 19, 230, 11, 218, 197, 18, 19, 197, 18, 19, 253, 121,
- 197, 18, 19, 218, 199, 18, 19, 251, 141, 197, 18, 19, 230, 197, 220, 36,
- 18, 19, 230, 11, 220, 27, 18, 19, 230, 11, 223, 2, 18, 19, 230, 11, 219,
- 167, 18, 19, 230, 11, 219, 29, 18, 19, 230, 11, 220, 26, 18, 19, 230, 11,
- 222, 103, 18, 19, 220, 243, 18, 19, 220, 212, 18, 19, 220, 207, 18, 19,
- 220, 187, 18, 19, 220, 181, 18, 19, 221, 24, 18, 19, 221, 20, 18, 19,
- 220, 132, 18, 19, 148, 220, 132, 18, 19, 220, 131, 18, 19, 148, 220, 131,
- 18, 19, 220, 130, 18, 19, 148, 220, 130, 18, 19, 220, 129, 18, 19, 148,
- 220, 129, 18, 19, 220, 128, 18, 19, 148, 220, 128, 18, 19, 220, 134, 18,
- 19, 148, 220, 134, 18, 19, 220, 133, 18, 19, 148, 220, 133, 18, 19, 221,
- 26, 18, 19, 213, 38, 18, 19, 213, 89, 18, 19, 212, 255, 18, 19, 212, 246,
- 18, 19, 212, 235, 18, 19, 212, 220, 18, 19, 213, 104, 212, 220, 18, 19,
- 186, 18, 19, 213, 91, 18, 19, 212, 166, 18, 19, 148, 212, 166, 18, 19,
- 212, 165, 18, 19, 148, 212, 165, 18, 19, 212, 164, 18, 19, 148, 212, 164,
- 18, 19, 212, 163, 18, 19, 148, 212, 163, 18, 19, 212, 162, 18, 19, 148,
- 212, 162, 18, 19, 212, 168, 18, 19, 148, 212, 168, 18, 19, 212, 167, 18,
- 19, 148, 212, 167, 18, 19, 230, 11, 212, 167, 18, 19, 213, 105, 18, 19,
- 251, 182, 213, 105, 18, 19, 148, 213, 105, 18, 19, 222, 127, 212, 255,
- 18, 19, 224, 21, 18, 19, 224, 112, 224, 21, 18, 19, 148, 233, 82, 18, 19,
- 224, 73, 18, 19, 223, 188, 18, 19, 223, 136, 18, 19, 223, 112, 18, 19,
- 223, 99, 18, 19, 148, 232, 208, 18, 19, 203, 18, 19, 224, 74, 18, 19,
- 148, 233, 157, 18, 19, 223, 20, 18, 19, 148, 223, 20, 18, 19, 149, 18,
- 19, 148, 149, 18, 19, 138, 149, 18, 19, 244, 123, 18, 19, 244, 161, 18,
- 19, 244, 90, 18, 19, 244, 77, 18, 19, 244, 12, 18, 19, 244, 3, 18, 19,
- 244, 164, 18, 19, 244, 163, 18, 19, 243, 187, 18, 19, 148, 243, 187, 18,
- 19, 244, 230, 18, 19, 217, 148, 18, 19, 230, 96, 217, 148, 18, 19, 217,
- 128, 18, 19, 230, 96, 217, 128, 18, 19, 217, 124, 18, 19, 230, 96, 217,
- 124, 18, 19, 217, 109, 18, 19, 217, 106, 18, 19, 217, 161, 18, 19, 217,
- 160, 18, 19, 217, 81, 18, 19, 148, 217, 81, 18, 19, 217, 163, 18, 19,
- 216, 103, 18, 19, 216, 101, 18, 19, 216, 100, 18, 19, 216, 105, 18, 19,
- 216, 106, 18, 19, 216, 18, 18, 19, 216, 17, 18, 19, 216, 16, 18, 19, 216,
- 19, 18, 19, 228, 49, 241, 222, 18, 19, 228, 49, 241, 165, 18, 19, 228,
- 49, 241, 147, 18, 19, 228, 49, 241, 54, 18, 19, 228, 49, 241, 39, 18, 19,
- 228, 49, 159, 18, 19, 228, 49, 242, 27, 18, 19, 228, 49, 242, 41, 18, 19,
- 228, 48, 242, 41, 18, 19, 241, 140, 18, 19, 224, 228, 18, 19, 224, 198,
- 18, 19, 224, 193, 18, 19, 224, 187, 18, 19, 224, 182, 18, 19, 224, 232,
- 18, 19, 224, 231, 18, 19, 224, 240, 18, 19, 217, 8, 18, 19, 217, 6, 18,
- 19, 217, 5, 18, 19, 217, 9, 18, 19, 148, 224, 21, 18, 19, 148, 223, 188,
- 18, 19, 148, 223, 112, 18, 19, 148, 203, 18, 19, 229, 157, 18, 19, 229,
- 113, 18, 19, 229, 109, 18, 19, 229, 90, 18, 19, 229, 85, 18, 19, 229,
- 159, 18, 19, 229, 158, 18, 19, 229, 161, 18, 19, 228, 196, 18, 19, 222,
- 127, 220, 243, 18, 19, 222, 127, 220, 212, 18, 19, 222, 127, 220, 187,
- 18, 19, 222, 127, 221, 24, 18, 19, 213, 200, 217, 148, 18, 19, 213, 200,
- 217, 128, 18, 19, 213, 200, 217, 109, 18, 19, 213, 200, 217, 161, 18, 19,
- 213, 200, 217, 163, 18, 19, 233, 19, 18, 19, 233, 18, 18, 19, 233, 17,
- 18, 19, 233, 16, 18, 19, 233, 25, 18, 19, 233, 24, 18, 19, 233, 26, 18,
- 19, 217, 162, 217, 148, 18, 19, 217, 162, 217, 128, 18, 19, 217, 162,
- 217, 124, 18, 19, 217, 162, 217, 109, 18, 19, 217, 162, 217, 106, 18, 19,
- 217, 162, 217, 161, 18, 19, 217, 162, 217, 160, 18, 19, 217, 162, 217,
- 163, 18, 19, 254, 97, 253, 74, 18, 19, 251, 141, 74, 18, 19, 251, 141,
- 72, 18, 19, 251, 141, 75, 18, 19, 251, 141, 61, 18, 19, 251, 141, 214, 6,
- 18, 19, 251, 141, 213, 235, 18, 19, 251, 141, 213, 214, 18, 19, 251, 141,
- 214, 49, 18, 19, 251, 141, 229, 187, 18, 19, 251, 141, 229, 64, 18, 19,
- 251, 141, 228, 185, 18, 19, 251, 141, 205, 18, 19, 251, 141, 234, 188,
- 18, 19, 251, 141, 234, 101, 18, 19, 251, 141, 234, 37, 18, 19, 251, 141,
- 181, 18, 19, 222, 127, 241, 222, 18, 19, 222, 127, 241, 165, 18, 19, 222,
- 127, 241, 54, 18, 19, 222, 127, 159, 18, 19, 66, 242, 196, 18, 19, 66,
- 242, 200, 18, 19, 66, 242, 212, 18, 19, 66, 242, 211, 18, 19, 66, 242,
- 201, 18, 19, 66, 242, 225, 18, 19, 66, 223, 51, 18, 19, 66, 223, 112, 18,
- 19, 66, 224, 21, 18, 19, 66, 224, 1, 18, 19, 66, 223, 188, 18, 19, 66,
- 203, 18, 19, 66, 213, 183, 18, 19, 66, 213, 214, 18, 19, 66, 214, 6, 18,
- 19, 66, 214, 1, 18, 19, 66, 213, 235, 18, 19, 66, 214, 49, 18, 19, 66,
- 240, 186, 18, 19, 66, 240, 187, 18, 19, 66, 240, 190, 18, 19, 66, 240,
- 189, 18, 19, 66, 240, 188, 18, 19, 66, 240, 192, 18, 19, 66, 217, 90, 18,
- 19, 66, 217, 109, 18, 19, 66, 217, 148, 18, 19, 66, 217, 147, 18, 19, 66,
- 217, 128, 18, 19, 66, 217, 161, 18, 19, 66, 216, 86, 18, 19, 66, 216, 95,
- 18, 19, 66, 216, 112, 18, 19, 66, 216, 111, 18, 19, 66, 216, 96, 18, 19,
- 66, 216, 115, 18, 19, 66, 225, 35, 18, 19, 66, 225, 150, 18, 19, 66, 226,
- 96, 18, 19, 66, 226, 86, 18, 19, 66, 225, 240, 18, 19, 66, 193, 18, 19,
- 66, 226, 229, 18, 19, 66, 242, 92, 18, 19, 66, 242, 150, 18, 19, 66, 243,
- 38, 18, 19, 66, 243, 31, 18, 19, 66, 242, 190, 18, 19, 66, 243, 110, 18,
- 19, 66, 234, 108, 18, 19, 66, 234, 113, 18, 19, 66, 234, 125, 18, 19, 66,
- 234, 124, 18, 19, 66, 234, 118, 18, 19, 66, 234, 138, 18, 19, 66, 234,
- 50, 18, 19, 66, 234, 51, 18, 19, 66, 234, 54, 18, 19, 66, 234, 53, 18,
- 19, 66, 234, 52, 18, 19, 66, 234, 55, 18, 19, 66, 234, 56, 18, 19, 66,
- 228, 92, 18, 19, 66, 228, 185, 18, 19, 66, 229, 187, 18, 19, 66, 229,
- 184, 18, 19, 66, 229, 64, 18, 19, 66, 205, 18, 19, 66, 230, 172, 18, 19,
- 66, 230, 231, 18, 19, 66, 231, 156, 18, 19, 66, 231, 145, 18, 19, 66,
- 231, 42, 18, 19, 66, 188, 18, 19, 66, 212, 203, 18, 19, 66, 212, 235, 18,
- 19, 66, 213, 38, 18, 19, 66, 213, 35, 18, 19, 66, 212, 255, 18, 19, 66,
- 186, 18, 19, 66, 235, 54, 18, 19, 222, 127, 235, 54, 18, 19, 66, 235, 71,
- 18, 19, 66, 235, 127, 18, 19, 66, 235, 125, 18, 19, 66, 235, 110, 18, 19,
- 222, 127, 235, 110, 18, 19, 66, 235, 139, 18, 19, 66, 235, 84, 18, 19,
- 66, 235, 88, 18, 19, 66, 235, 98, 18, 19, 66, 235, 97, 18, 19, 66, 235,
- 96, 18, 19, 66, 235, 99, 18, 19, 66, 232, 156, 18, 19, 66, 232, 208, 18,
- 19, 66, 233, 82, 18, 19, 66, 233, 74, 18, 19, 66, 233, 13, 18, 19, 66,
- 233, 157, 18, 19, 66, 247, 103, 18, 19, 66, 247, 104, 18, 19, 66, 247,
- 107, 18, 19, 66, 247, 106, 18, 19, 66, 247, 105, 18, 19, 66, 247, 108,
- 18, 19, 66, 233, 15, 18, 19, 66, 233, 17, 18, 19, 66, 233, 21, 18, 19,
- 66, 233, 20, 18, 19, 66, 233, 19, 18, 19, 66, 233, 25, 18, 19, 66, 217,
- 3, 18, 19, 66, 217, 5, 18, 19, 66, 217, 8, 18, 19, 66, 217, 7, 18, 19,
- 66, 217, 6, 18, 19, 66, 217, 9, 18, 19, 66, 216, 255, 18, 19, 66, 217, 0,
- 18, 19, 66, 217, 11, 18, 19, 66, 217, 10, 18, 19, 66, 217, 1, 18, 19, 66,
- 217, 12, 18, 19, 66, 212, 8, 18, 19, 66, 212, 16, 18, 19, 66, 212, 87,
- 18, 19, 66, 212, 85, 18, 19, 66, 212, 37, 18, 19, 66, 212, 109, 18, 19,
- 66, 212, 152, 18, 19, 66, 70, 212, 152, 18, 19, 66, 245, 239, 18, 19, 66,
- 245, 240, 18, 19, 66, 245, 247, 18, 19, 66, 245, 246, 18, 19, 66, 245,
- 242, 18, 19, 66, 245, 249, 18, 19, 66, 219, 27, 18, 19, 66, 219, 242, 18,
- 19, 66, 222, 100, 18, 19, 66, 222, 89, 18, 19, 66, 220, 117, 18, 19, 66,
- 222, 202, 18, 19, 66, 220, 150, 18, 19, 66, 220, 187, 18, 19, 66, 220,
- 243, 18, 19, 66, 220, 241, 18, 19, 66, 220, 212, 18, 19, 66, 221, 24, 18,
- 19, 66, 221, 26, 18, 19, 66, 216, 122, 18, 19, 66, 216, 124, 18, 19, 66,
- 216, 136, 18, 19, 66, 216, 135, 18, 19, 66, 216, 125, 18, 19, 66, 216,
- 141, 18, 19, 66, 250, 6, 18, 19, 66, 250, 23, 18, 19, 66, 250, 67, 18,
- 19, 66, 250, 64, 18, 19, 66, 250, 47, 18, 19, 66, 250, 92, 18, 19, 66,
- 216, 89, 18, 19, 66, 216, 90, 18, 19, 66, 216, 93, 18, 19, 66, 216, 92,
- 18, 19, 66, 216, 91, 18, 19, 66, 216, 94, 18, 19, 250, 48, 52, 18, 19,
- 243, 200, 219, 69, 18, 19, 224, 224, 18, 19, 229, 156, 18, 19, 228, 193,
- 18, 19, 228, 192, 18, 19, 228, 191, 18, 19, 228, 190, 18, 19, 228, 195,
- 18, 19, 228, 194, 18, 19, 213, 200, 217, 79, 18, 19, 213, 200, 217, 78,
- 18, 19, 213, 200, 217, 77, 18, 19, 213, 200, 217, 76, 18, 19, 213, 200,
- 217, 75, 18, 19, 213, 200, 217, 82, 18, 19, 213, 200, 217, 81, 18, 19,
- 213, 200, 40, 217, 163, 18, 19, 251, 141, 214, 82, 227, 92, 219, 207, 77,
- 227, 92, 1, 251, 224, 227, 92, 1, 232, 145, 227, 92, 1, 244, 120, 227,
- 92, 1, 222, 186, 227, 92, 1, 229, 24, 227, 92, 1, 215, 195, 227, 92, 1,
- 248, 142, 227, 92, 1, 217, 33, 227, 92, 1, 249, 167, 227, 92, 1, 250,
- 114, 227, 92, 1, 230, 161, 227, 92, 1, 242, 132, 227, 92, 1, 229, 147,
- 227, 92, 1, 219, 62, 227, 92, 1, 223, 46, 227, 92, 1, 254, 105, 227, 92,
- 1, 227, 53, 227, 92, 1, 215, 121, 227, 92, 1, 245, 187, 227, 92, 1, 235,
- 186, 227, 92, 1, 245, 188, 227, 92, 1, 227, 24, 227, 92, 1, 215, 176,
- 227, 92, 1, 236, 34, 227, 92, 1, 245, 185, 227, 92, 1, 226, 77, 227, 92,
- 244, 119, 77, 227, 92, 223, 202, 244, 119, 77, 168, 1, 244, 110, 244,
- 102, 244, 124, 244, 230, 168, 1, 215, 79, 168, 1, 215, 106, 215, 122, 69,
- 168, 1, 212, 205, 168, 1, 213, 105, 168, 1, 214, 82, 168, 1, 217, 84,
- 217, 83, 217, 104, 168, 1, 245, 25, 168, 1, 254, 4, 61, 168, 1, 227, 10,
- 75, 168, 1, 254, 177, 61, 168, 1, 254, 132, 168, 1, 232, 186, 75, 168, 1,
- 220, 168, 75, 168, 1, 75, 168, 1, 227, 99, 168, 1, 227, 62, 168, 1, 224,
- 55, 224, 67, 223, 244, 149, 168, 1, 234, 199, 168, 1, 250, 111, 168, 1,
- 234, 200, 235, 27, 168, 1, 243, 177, 168, 1, 245, 96, 168, 1, 243, 34,
- 242, 47, 243, 177, 168, 1, 243, 72, 168, 1, 213, 176, 213, 170, 214, 82,
- 168, 1, 242, 19, 242, 41, 168, 1, 242, 23, 242, 41, 168, 1, 232, 188,
- 242, 41, 168, 1, 220, 171, 242, 41, 168, 1, 230, 7, 228, 18, 230, 8, 204,
- 168, 1, 220, 169, 204, 168, 1, 246, 69, 168, 1, 235, 166, 235, 170, 235,
- 160, 72, 168, 1, 74, 168, 1, 235, 118, 235, 142, 168, 1, 243, 19, 168, 1,
- 232, 189, 254, 148, 168, 1, 220, 173, 61, 168, 1, 235, 152, 245, 72, 168,
- 1, 226, 40, 226, 61, 226, 229, 168, 1, 254, 72, 245, 71, 168, 1, 219,
- 211, 197, 168, 1, 220, 105, 232, 185, 197, 168, 1, 220, 167, 197, 168, 1,
- 250, 252, 168, 1, 212, 152, 168, 1, 217, 16, 217, 26, 216, 7, 218, 99,
- 168, 1, 220, 166, 218, 99, 168, 1, 249, 3, 168, 1, 251, 208, 251, 211,
- 251, 147, 253, 74, 168, 1, 220, 172, 253, 74, 168, 1, 246, 68, 168, 1,
- 227, 36, 168, 1, 245, 153, 245, 155, 74, 168, 1, 231, 241, 231, 249, 183,
- 168, 1, 232, 187, 183, 168, 1, 220, 170, 183, 168, 1, 233, 97, 233, 137,
- 232, 196, 150, 168, 1, 246, 70, 168, 1, 235, 227, 168, 1, 235, 228, 168,
- 1, 248, 153, 248, 158, 249, 3, 168, 1, 227, 6, 245, 24, 75, 168, 1, 245,
- 183, 168, 1, 235, 185, 168, 1, 249, 21, 168, 1, 250, 205, 168, 1, 250,
- 123, 168, 1, 219, 100, 168, 1, 232, 184, 168, 1, 220, 165, 168, 1, 240,
- 103, 168, 1, 224, 240, 168, 1, 213, 166, 168, 220, 81, 225, 26, 168, 230,
- 155, 225, 26, 168, 249, 71, 225, 26, 168, 253, 177, 87, 168, 216, 47, 87,
- 168, 251, 223, 87, 218, 32, 1, 61, 218, 32, 1, 72, 218, 32, 1, 69, 218,
- 32, 1, 181, 218, 32, 1, 243, 110, 218, 32, 1, 229, 159, 218, 32, 1, 218,
- 52, 218, 32, 1, 248, 164, 218, 32, 1, 205, 218, 32, 1, 193, 218, 32, 1,
- 252, 107, 218, 32, 1, 188, 218, 32, 1, 186, 218, 32, 1, 233, 157, 218,
- 32, 1, 214, 49, 218, 32, 1, 222, 202, 218, 32, 1, 159, 218, 32, 30, 5,
- 72, 218, 32, 30, 5, 69, 218, 32, 5, 214, 133, 241, 246, 1, 61, 241, 246,
- 1, 72, 241, 246, 1, 69, 241, 246, 1, 181, 241, 246, 1, 243, 110, 241,
- 246, 1, 229, 159, 241, 246, 1, 218, 52, 241, 246, 1, 248, 164, 241, 246,
- 1, 205, 241, 246, 1, 193, 241, 246, 1, 252, 107, 241, 246, 1, 188, 241,
- 246, 1, 186, 241, 246, 1, 203, 241, 246, 1, 233, 157, 241, 246, 1, 214,
- 49, 241, 246, 1, 222, 202, 241, 246, 1, 159, 241, 246, 30, 5, 72, 241,
- 246, 30, 5, 69, 241, 246, 5, 226, 176, 226, 2, 220, 81, 225, 26, 226, 2,
- 51, 225, 26, 251, 49, 1, 61, 251, 49, 1, 72, 251, 49, 1, 69, 251, 49, 1,
- 181, 251, 49, 1, 243, 110, 251, 49, 1, 229, 159, 251, 49, 1, 218, 52,
- 251, 49, 1, 248, 164, 251, 49, 1, 205, 251, 49, 1, 193, 251, 49, 1, 252,
- 107, 251, 49, 1, 188, 251, 49, 1, 186, 251, 49, 1, 203, 251, 49, 1, 233,
- 157, 251, 49, 1, 214, 49, 251, 49, 1, 222, 202, 251, 49, 1, 159, 251, 49,
- 30, 5, 72, 251, 49, 30, 5, 69, 218, 31, 1, 61, 218, 31, 1, 72, 218, 31,
- 1, 69, 218, 31, 1, 181, 218, 31, 1, 243, 110, 218, 31, 1, 229, 159, 218,
- 31, 1, 218, 52, 218, 31, 1, 248, 164, 218, 31, 1, 205, 218, 31, 1, 193,
- 218, 31, 1, 252, 107, 218, 31, 1, 188, 218, 31, 1, 186, 218, 31, 1, 233,
- 157, 218, 31, 1, 214, 49, 218, 31, 1, 222, 202, 218, 31, 30, 5, 72, 218,
- 31, 30, 5, 69, 84, 1, 181, 84, 1, 234, 138, 84, 1, 234, 37, 84, 1, 234,
- 113, 84, 1, 229, 90, 84, 1, 250, 219, 84, 1, 250, 92, 84, 1, 249, 175,
- 84, 1, 250, 23, 84, 1, 227, 253, 84, 1, 248, 164, 84, 1, 216, 105, 84, 1,
- 247, 99, 84, 1, 216, 100, 84, 1, 228, 188, 84, 1, 218, 52, 84, 1, 217,
- 161, 84, 1, 108, 84, 1, 217, 109, 84, 1, 228, 185, 84, 1, 252, 107, 84,
- 1, 226, 23, 84, 1, 225, 150, 84, 1, 225, 253, 84, 1, 230, 231, 84, 1,
- 212, 235, 84, 1, 223, 112, 84, 1, 232, 208, 84, 1, 214, 119, 84, 1, 221,
- 24, 84, 1, 219, 121, 84, 1, 222, 202, 84, 1, 159, 84, 1, 233, 157, 84, 1,
- 224, 232, 84, 235, 240, 30, 224, 218, 84, 235, 240, 30, 224, 231, 84,
- 235, 240, 30, 224, 198, 84, 235, 240, 30, 224, 193, 84, 235, 240, 30,
- 224, 175, 84, 235, 240, 30, 224, 147, 84, 235, 240, 30, 224, 135, 84,
- 235, 240, 30, 224, 134, 84, 235, 240, 30, 223, 12, 84, 235, 240, 30, 223,
- 5, 84, 235, 240, 30, 232, 121, 84, 235, 240, 30, 232, 112, 84, 235, 240,
- 30, 224, 213, 84, 235, 240, 30, 224, 224, 84, 235, 240, 30, 224, 183,
- 216, 15, 116, 84, 235, 240, 30, 224, 183, 216, 15, 109, 84, 235, 240, 30,
- 224, 214, 84, 30, 235, 226, 253, 215, 84, 30, 235, 226, 254, 232, 84, 30,
- 5, 254, 232, 84, 30, 5, 72, 84, 30, 5, 236, 28, 84, 30, 5, 213, 105, 84,
- 30, 5, 212, 161, 84, 30, 5, 69, 84, 30, 5, 215, 92, 84, 30, 5, 215, 196,
- 84, 30, 5, 227, 99, 84, 30, 5, 186, 84, 30, 5, 236, 55, 84, 30, 5, 74,
- 84, 30, 5, 254, 148, 84, 30, 5, 254, 108, 84, 30, 5, 227, 49, 84, 30, 5,
- 253, 108, 84, 5, 229, 37, 84, 5, 224, 19, 84, 5, 212, 172, 84, 5, 230,
- 123, 84, 5, 216, 171, 84, 5, 252, 62, 84, 5, 223, 107, 84, 5, 216, 251,
- 84, 5, 234, 246, 84, 5, 254, 110, 84, 5, 222, 160, 222, 154, 84, 5, 214,
- 130, 84, 5, 249, 170, 84, 5, 252, 37, 84, 5, 234, 131, 84, 5, 252, 57,
- 84, 5, 250, 197, 225, 204, 233, 209, 84, 5, 233, 54, 216, 230, 84, 5,
- 251, 197, 84, 5, 225, 255, 230, 169, 84, 5, 234, 18, 84, 249, 39, 16,
- 223, 181, 84, 5, 253, 90, 84, 5, 253, 111, 84, 21, 212, 79, 84, 21, 116,
- 84, 21, 109, 84, 21, 166, 84, 21, 163, 84, 21, 180, 84, 21, 189, 84, 21,
- 198, 84, 21, 195, 84, 21, 200, 84, 16, 233, 54, 253, 113, 219, 229, 84,
- 16, 233, 54, 253, 113, 230, 141, 84, 16, 233, 54, 253, 113, 225, 203, 84,
- 16, 233, 54, 253, 113, 251, 225, 84, 16, 233, 54, 253, 113, 251, 32, 84,
- 16, 233, 54, 253, 113, 225, 95, 84, 16, 233, 54, 253, 113, 225, 89, 84,
- 16, 233, 54, 253, 113, 225, 87, 84, 16, 233, 54, 253, 113, 225, 93, 84,
- 16, 233, 54, 253, 113, 225, 91, 81, 251, 159, 81, 245, 120, 81, 249, 157,
- 81, 243, 200, 219, 69, 81, 249, 164, 81, 243, 237, 247, 72, 81, 216, 250,
- 219, 236, 240, 160, 81, 220, 116, 4, 251, 98, 231, 217, 81, 231, 246,
- 249, 157, 81, 231, 246, 243, 200, 219, 69, 81, 229, 22, 81, 243, 223, 43,
- 222, 77, 116, 81, 243, 223, 43, 222, 77, 109, 81, 243, 223, 43, 222, 77,
- 166, 81, 30, 221, 57, 81, 21, 212, 79, 81, 21, 116, 81, 21, 109, 81, 21,
- 166, 81, 21, 163, 81, 21, 180, 81, 21, 189, 81, 21, 198, 81, 21, 195, 81,
- 21, 200, 81, 1, 61, 81, 1, 74, 81, 1, 72, 81, 1, 75, 81, 1, 69, 81, 1,
- 227, 99, 81, 1, 215, 183, 81, 1, 245, 165, 81, 1, 205, 81, 1, 254, 24,
- 81, 1, 252, 107, 81, 1, 193, 81, 1, 224, 232, 81, 1, 243, 110, 81, 1,
- 188, 81, 1, 233, 157, 81, 1, 222, 202, 81, 1, 221, 24, 81, 1, 218, 52,
- 81, 1, 248, 164, 81, 1, 250, 92, 81, 1, 235, 139, 81, 1, 186, 81, 1, 203,
- 81, 1, 214, 49, 81, 1, 244, 164, 81, 1, 181, 81, 1, 234, 138, 81, 1, 216,
- 141, 81, 1, 212, 109, 81, 1, 242, 27, 81, 1, 212, 9, 81, 1, 233, 25, 81,
- 1, 212, 62, 81, 1, 250, 47, 81, 1, 216, 250, 184, 30, 52, 81, 1, 216,
- 250, 74, 81, 1, 216, 250, 72, 81, 1, 216, 250, 75, 81, 1, 216, 250, 69,
- 81, 1, 216, 250, 227, 99, 81, 1, 216, 250, 215, 183, 81, 1, 216, 250,
- 254, 24, 81, 1, 216, 250, 252, 107, 81, 1, 216, 250, 193, 81, 1, 216,
- 250, 224, 232, 81, 1, 216, 250, 243, 110, 81, 1, 216, 250, 188, 81, 1,
- 216, 250, 218, 52, 81, 1, 216, 250, 248, 164, 81, 1, 216, 250, 250, 92,
- 81, 1, 216, 250, 235, 139, 81, 1, 216, 250, 216, 141, 81, 1, 216, 250,
- 186, 81, 1, 216, 250, 214, 49, 81, 1, 216, 250, 181, 81, 1, 216, 250,
- 243, 107, 81, 1, 216, 250, 242, 27, 81, 1, 216, 250, 235, 109, 81, 1,
- 216, 250, 229, 62, 81, 1, 216, 250, 245, 249, 81, 1, 220, 116, 74, 81, 1,
- 220, 116, 72, 81, 1, 220, 116, 235, 150, 81, 1, 220, 116, 215, 183, 81,
- 1, 220, 116, 69, 81, 1, 220, 116, 254, 24, 81, 1, 220, 116, 181, 81, 1,
- 220, 116, 243, 110, 81, 1, 220, 116, 159, 81, 1, 220, 116, 193, 81, 1,
- 220, 116, 221, 24, 81, 1, 220, 116, 218, 52, 81, 1, 220, 116, 248, 164,
- 81, 1, 220, 116, 235, 139, 81, 1, 220, 116, 244, 164, 81, 1, 220, 116,
- 243, 107, 81, 1, 220, 116, 242, 27, 81, 1, 220, 116, 216, 141, 81, 1,
- 220, 116, 212, 109, 81, 1, 220, 116, 224, 74, 81, 1, 220, 116, 250, 92,
- 81, 1, 220, 116, 212, 75, 81, 1, 231, 246, 72, 81, 1, 231, 246, 181, 81,
- 1, 231, 246, 203, 81, 1, 231, 246, 244, 164, 81, 1, 231, 246, 212, 75,
- 81, 1, 254, 71, 243, 92, 253, 243, 116, 81, 1, 254, 71, 243, 92, 214,
- 129, 116, 81, 1, 254, 71, 243, 92, 248, 131, 81, 1, 254, 71, 243, 92,
- 215, 193, 81, 1, 254, 71, 243, 92, 235, 191, 215, 193, 81, 1, 254, 71,
- 243, 92, 252, 74, 81, 1, 254, 71, 243, 92, 133, 252, 74, 81, 1, 254, 71,
- 243, 92, 61, 81, 1, 254, 71, 243, 92, 72, 81, 1, 254, 71, 243, 92, 181,
- 81, 1, 254, 71, 243, 92, 229, 159, 81, 1, 254, 71, 243, 92, 250, 219, 81,
- 1, 254, 71, 243, 92, 216, 115, 81, 1, 254, 71, 243, 92, 216, 105, 81, 1,
- 254, 71, 243, 92, 248, 86, 81, 1, 254, 71, 243, 92, 228, 198, 81, 1, 254,
- 71, 243, 92, 218, 52, 81, 1, 254, 71, 243, 92, 248, 164, 81, 1, 254, 71,
- 243, 92, 193, 81, 1, 254, 71, 243, 92, 226, 23, 81, 1, 254, 71, 243, 92,
- 219, 157, 81, 1, 254, 71, 243, 92, 212, 75, 81, 1, 254, 71, 243, 92, 212,
- 109, 81, 1, 254, 71, 243, 92, 254, 114, 81, 1, 216, 250, 254, 71, 243,
- 92, 218, 52, 81, 1, 216, 250, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246,
- 254, 71, 243, 92, 242, 225, 81, 1, 231, 246, 254, 71, 243, 92, 229, 159,
- 81, 1, 231, 246, 254, 71, 243, 92, 250, 219, 81, 1, 231, 246, 254, 71,
- 243, 92, 235, 115, 81, 1, 231, 246, 254, 71, 243, 92, 216, 115, 81, 1,
- 231, 246, 254, 71, 243, 92, 248, 70, 81, 1, 231, 246, 254, 71, 243, 92,
- 218, 52, 81, 1, 231, 246, 254, 71, 243, 92, 247, 232, 81, 1, 231, 246,
- 254, 71, 243, 92, 219, 157, 81, 1, 231, 246, 254, 71, 243, 92, 249, 15,
- 81, 1, 231, 246, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246, 254, 71,
- 243, 92, 212, 109, 81, 1, 254, 71, 243, 92, 151, 69, 81, 1, 254, 71, 243,
- 92, 151, 186, 81, 1, 231, 246, 254, 71, 243, 92, 251, 195, 81, 1, 254,
- 71, 243, 92, 248, 154, 81, 1, 231, 246, 254, 71, 243, 92, 233, 25, 18,
- 19, 226, 233, 18, 19, 253, 83, 18, 19, 254, 188, 18, 19, 214, 9, 18, 19,
- 225, 101, 18, 19, 226, 103, 18, 19, 224, 249, 18, 19, 217, 238, 18, 19,
- 234, 195, 18, 19, 233, 201, 18, 19, 231, 196, 18, 19, 228, 148, 18, 19,
- 230, 3, 18, 19, 233, 92, 18, 19, 219, 209, 18, 19, 222, 129, 18, 19, 220,
- 156, 18, 19, 220, 246, 18, 19, 220, 127, 18, 19, 212, 211, 18, 19, 213,
- 43, 18, 19, 224, 27, 18, 19, 228, 28, 18, 19, 227, 82, 228, 28, 18, 19,
- 228, 27, 18, 19, 227, 82, 228, 27, 18, 19, 228, 26, 18, 19, 227, 82, 228,
- 26, 18, 19, 228, 25, 18, 19, 227, 82, 228, 25, 18, 19, 223, 17, 18, 19,
- 223, 16, 18, 19, 223, 15, 18, 19, 223, 14, 18, 19, 223, 13, 18, 19, 223,
- 21, 18, 19, 227, 82, 226, 229, 18, 19, 227, 82, 218, 99, 18, 19, 227, 82,
- 235, 27, 18, 19, 227, 82, 250, 252, 18, 19, 227, 82, 183, 18, 19, 227,
- 82, 204, 18, 19, 227, 82, 197, 18, 19, 227, 82, 221, 26, 18, 19, 245,
- 175, 214, 82, 18, 19, 213, 248, 214, 82, 18, 19, 40, 3, 223, 130, 18, 19,
- 40, 224, 48, 247, 74, 18, 19, 224, 112, 223, 18, 18, 19, 148, 232, 180,
- 18, 19, 148, 233, 156, 18, 19, 217, 80, 18, 19, 217, 82, 18, 19, 216, 97,
- 18, 19, 216, 99, 18, 19, 216, 104, 18, 19, 217, 2, 18, 19, 217, 4, 18,
- 19, 222, 127, 220, 132, 18, 19, 222, 127, 220, 181, 18, 19, 222, 127,
- 241, 39, 18, 19, 66, 242, 54, 18, 19, 66, 248, 3, 243, 31, 18, 19, 66,
- 243, 107, 18, 19, 66, 242, 59, 18, 19, 222, 127, 235, 37, 18, 19, 66,
- 235, 35, 18, 19, 251, 244, 248, 3, 150, 18, 19, 251, 244, 248, 3, 149,
- 18, 19, 66, 247, 254, 197, 209, 214, 103, 233, 34, 209, 1, 181, 209, 1,
- 234, 138, 209, 1, 243, 110, 209, 1, 242, 225, 209, 1, 229, 159, 209, 1,
- 250, 219, 209, 1, 250, 92, 209, 1, 235, 139, 209, 1, 235, 115, 209, 1,
- 213, 60, 209, 1, 218, 52, 209, 1, 217, 161, 209, 1, 248, 164, 209, 1,
- 247, 232, 209, 1, 205, 209, 1, 193, 209, 1, 226, 23, 209, 1, 252, 107,
- 209, 1, 251, 195, 209, 1, 188, 209, 1, 186, 209, 1, 203, 209, 1, 233,
- 157, 209, 1, 214, 49, 209, 1, 221, 24, 209, 1, 219, 157, 209, 1, 222,
- 202, 209, 1, 159, 209, 30, 5, 61, 209, 30, 5, 72, 209, 30, 5, 69, 209,
- 30, 5, 245, 165, 209, 30, 5, 254, 108, 209, 30, 5, 227, 49, 209, 30, 5,
- 253, 108, 209, 30, 5, 74, 209, 30, 5, 75, 209, 219, 18, 1, 186, 209, 219,
- 18, 1, 203, 209, 219, 18, 1, 214, 49, 209, 3, 1, 181, 209, 3, 1, 229,
- 159, 209, 3, 1, 253, 242, 209, 3, 1, 218, 52, 209, 3, 1, 205, 209, 3, 1,
- 193, 209, 3, 1, 188, 209, 3, 1, 203, 209, 3, 1, 233, 157, 209, 5, 230,
- 159, 209, 5, 234, 177, 209, 5, 222, 201, 209, 5, 232, 180, 209, 244, 254,
- 77, 209, 224, 158, 77, 209, 21, 212, 79, 209, 21, 116, 209, 21, 109, 209,
- 21, 166, 209, 21, 163, 209, 21, 180, 209, 21, 189, 209, 21, 198, 209, 21,
- 195, 209, 21, 200, 38, 233, 83, 1, 181, 38, 233, 83, 1, 213, 153, 38,
- 233, 83, 1, 229, 159, 38, 233, 83, 1, 216, 141, 38, 233, 83, 1, 222, 202,
- 38, 233, 83, 1, 186, 38, 233, 83, 1, 218, 52, 38, 233, 83, 1, 217, 161,
- 38, 233, 83, 1, 233, 157, 38, 233, 83, 1, 193, 38, 233, 83, 1, 226, 23,
- 38, 233, 83, 1, 188, 38, 233, 83, 1, 244, 164, 38, 233, 83, 1, 215, 1,
- 38, 233, 83, 1, 159, 38, 233, 83, 1, 224, 232, 38, 233, 83, 1, 234, 138,
- 38, 233, 83, 1, 216, 133, 38, 233, 83, 1, 205, 38, 233, 83, 1, 61, 38,
- 233, 83, 1, 72, 38, 233, 83, 1, 245, 165, 38, 233, 83, 1, 245, 154, 38,
- 233, 83, 1, 69, 38, 233, 83, 1, 227, 49, 38, 233, 83, 1, 75, 38, 233, 83,
- 1, 215, 183, 38, 233, 83, 1, 74, 38, 233, 83, 1, 253, 106, 38, 233, 83,
- 1, 254, 108, 38, 233, 83, 1, 216, 239, 38, 233, 83, 1, 216, 238, 38, 233,
- 83, 1, 216, 237, 38, 233, 83, 1, 216, 236, 38, 233, 83, 1, 216, 235, 156,
- 38, 165, 1, 124, 224, 232, 156, 38, 165, 1, 115, 224, 232, 156, 38, 165,
- 1, 124, 181, 156, 38, 165, 1, 124, 213, 153, 156, 38, 165, 1, 124, 229,
- 159, 156, 38, 165, 1, 115, 181, 156, 38, 165, 1, 115, 213, 153, 156, 38,
- 165, 1, 115, 229, 159, 156, 38, 165, 1, 124, 216, 141, 156, 38, 165, 1,
- 124, 222, 202, 156, 38, 165, 1, 124, 186, 156, 38, 165, 1, 115, 216, 141,
- 156, 38, 165, 1, 115, 222, 202, 156, 38, 165, 1, 115, 186, 156, 38, 165,
- 1, 124, 218, 52, 156, 38, 165, 1, 124, 217, 161, 156, 38, 165, 1, 124,
- 205, 156, 38, 165, 1, 115, 218, 52, 156, 38, 165, 1, 115, 217, 161, 156,
- 38, 165, 1, 115, 205, 156, 38, 165, 1, 124, 193, 156, 38, 165, 1, 124,
- 226, 23, 156, 38, 165, 1, 124, 188, 156, 38, 165, 1, 115, 193, 156, 38,
- 165, 1, 115, 226, 23, 156, 38, 165, 1, 115, 188, 156, 38, 165, 1, 124,
- 244, 164, 156, 38, 165, 1, 124, 215, 1, 156, 38, 165, 1, 124, 233, 157,
- 156, 38, 165, 1, 115, 244, 164, 156, 38, 165, 1, 115, 215, 1, 156, 38,
- 165, 1, 115, 233, 157, 156, 38, 165, 1, 124, 159, 156, 38, 165, 1, 124,
- 248, 164, 156, 38, 165, 1, 124, 252, 107, 156, 38, 165, 1, 115, 159, 156,
- 38, 165, 1, 115, 248, 164, 156, 38, 165, 1, 115, 252, 107, 156, 38, 165,
- 1, 124, 233, 206, 156, 38, 165, 1, 124, 213, 126, 156, 38, 165, 1, 115,
- 233, 206, 156, 38, 165, 1, 115, 213, 126, 156, 38, 165, 1, 124, 219, 26,
- 156, 38, 165, 1, 115, 219, 26, 156, 38, 165, 30, 5, 30, 220, 163, 156,
- 38, 165, 30, 5, 254, 232, 156, 38, 165, 30, 5, 236, 28, 156, 38, 165, 30,
- 5, 69, 156, 38, 165, 30, 5, 215, 92, 156, 38, 165, 30, 5, 74, 156, 38,
- 165, 30, 5, 254, 148, 156, 38, 165, 30, 5, 75, 156, 38, 165, 30, 5, 227,
- 120, 156, 38, 165, 30, 5, 215, 183, 156, 38, 165, 30, 5, 253, 83, 156,
- 38, 165, 30, 5, 254, 188, 156, 38, 165, 30, 5, 215, 85, 156, 38, 165, 30,
- 5, 226, 233, 156, 38, 165, 30, 5, 227, 117, 156, 38, 165, 30, 5, 215,
- 180, 156, 38, 165, 30, 5, 235, 150, 156, 38, 165, 1, 40, 215, 79, 156,
- 38, 165, 1, 40, 229, 161, 156, 38, 165, 1, 40, 204, 156, 38, 165, 1, 40,
- 183, 156, 38, 165, 1, 40, 235, 27, 156, 38, 165, 1, 40, 249, 3, 156, 38,
- 165, 1, 40, 253, 74, 156, 38, 165, 160, 231, 221, 156, 38, 165, 160, 231,
- 220, 156, 38, 165, 21, 212, 79, 156, 38, 165, 21, 116, 156, 38, 165, 21,
- 109, 156, 38, 165, 21, 166, 156, 38, 165, 21, 163, 156, 38, 165, 21, 180,
- 156, 38, 165, 21, 189, 156, 38, 165, 21, 198, 156, 38, 165, 21, 195, 156,
- 38, 165, 21, 200, 156, 38, 165, 88, 21, 116, 156, 38, 165, 5, 233, 143,
- 156, 38, 165, 5, 233, 142, 84, 16, 226, 109, 84, 16, 230, 142, 234, 34,
- 84, 16, 225, 204, 234, 34, 84, 16, 251, 226, 234, 34, 84, 16, 251, 33,
- 234, 34, 84, 16, 225, 96, 234, 34, 84, 16, 225, 90, 234, 34, 84, 16, 225,
- 88, 234, 34, 84, 16, 225, 94, 234, 34, 84, 16, 225, 92, 234, 34, 84, 16,
- 248, 118, 234, 34, 84, 16, 248, 114, 234, 34, 84, 16, 248, 113, 234, 34,
- 84, 16, 248, 116, 234, 34, 84, 16, 248, 115, 234, 34, 84, 16, 248, 112,
- 234, 34, 84, 16, 216, 51, 84, 16, 230, 142, 223, 106, 84, 16, 225, 204,
- 223, 106, 84, 16, 251, 226, 223, 106, 84, 16, 251, 33, 223, 106, 84, 16,
- 225, 96, 223, 106, 84, 16, 225, 90, 223, 106, 84, 16, 225, 88, 223, 106,
- 84, 16, 225, 94, 223, 106, 84, 16, 225, 92, 223, 106, 84, 16, 248, 118,
- 223, 106, 84, 16, 248, 114, 223, 106, 84, 16, 248, 113, 223, 106, 84, 16,
- 248, 116, 223, 106, 84, 16, 248, 115, 223, 106, 84, 16, 248, 112, 223,
- 106, 251, 50, 1, 181, 251, 50, 1, 243, 110, 251, 50, 1, 229, 159, 251,
- 50, 1, 229, 108, 251, 50, 1, 193, 251, 50, 1, 252, 107, 251, 50, 1, 188,
- 251, 50, 1, 230, 175, 251, 50, 1, 218, 52, 251, 50, 1, 248, 164, 251, 50,
- 1, 205, 251, 50, 1, 228, 147, 251, 50, 1, 250, 219, 251, 50, 1, 235, 139,
- 251, 50, 1, 228, 23, 251, 50, 1, 228, 19, 251, 50, 1, 186, 251, 50, 1,
- 203, 251, 50, 1, 233, 157, 251, 50, 1, 215, 1, 251, 50, 1, 222, 202, 251,
- 50, 1, 61, 251, 50, 1, 159, 251, 50, 30, 5, 72, 251, 50, 30, 5, 69, 251,
- 50, 30, 5, 74, 251, 50, 30, 5, 75, 251, 50, 30, 5, 254, 148, 251, 50,
- 226, 187, 251, 50, 245, 101, 65, 222, 91, 38, 88, 1, 124, 181, 38, 88, 1,
- 124, 234, 138, 38, 88, 1, 124, 233, 193, 38, 88, 1, 115, 181, 38, 88, 1,
- 115, 233, 193, 38, 88, 1, 115, 234, 138, 38, 88, 1, 229, 159, 38, 88, 1,
- 124, 250, 219, 38, 88, 1, 124, 250, 92, 38, 88, 1, 115, 250, 219, 38, 88,
- 1, 115, 222, 202, 38, 88, 1, 115, 250, 92, 38, 88, 1, 228, 23, 38, 88, 1,
- 224, 32, 38, 88, 1, 124, 224, 30, 38, 88, 1, 248, 164, 38, 88, 1, 115,
- 224, 30, 38, 88, 1, 224, 41, 38, 88, 1, 124, 218, 52, 38, 88, 1, 124,
- 217, 161, 38, 88, 1, 115, 218, 52, 38, 88, 1, 115, 217, 161, 38, 88, 1,
- 205, 38, 88, 1, 252, 107, 38, 88, 1, 124, 193, 38, 88, 1, 124, 226, 23,
- 38, 88, 1, 124, 244, 164, 38, 88, 1, 115, 193, 38, 88, 1, 115, 244, 164,
- 38, 88, 1, 115, 226, 23, 38, 88, 1, 188, 38, 88, 1, 115, 186, 38, 88, 1,
- 124, 186, 38, 88, 1, 203, 38, 88, 1, 223, 48, 38, 88, 1, 233, 157, 38,
- 88, 1, 232, 151, 38, 88, 1, 214, 49, 38, 88, 1, 124, 221, 24, 38, 88, 1,
- 124, 219, 157, 38, 88, 1, 124, 222, 202, 38, 88, 1, 124, 159, 38, 88, 1,
- 232, 213, 38, 88, 1, 61, 38, 88, 1, 115, 159, 38, 88, 1, 72, 38, 88, 1,
- 236, 28, 38, 88, 1, 69, 38, 88, 1, 215, 92, 38, 88, 1, 245, 165, 38, 88,
- 1, 227, 49, 38, 88, 1, 233, 143, 38, 88, 1, 242, 109, 222, 202, 38, 88,
- 249, 133, 5, 138, 203, 38, 88, 249, 133, 5, 138, 233, 157, 38, 88, 249,
- 133, 5, 233, 158, 218, 9, 233, 133, 38, 88, 5, 232, 9, 234, 236, 233,
- 133, 38, 88, 249, 133, 5, 40, 229, 159, 38, 88, 249, 133, 5, 115, 193,
- 38, 88, 249, 133, 5, 124, 224, 31, 167, 115, 193, 38, 88, 249, 133, 5,
- 188, 38, 88, 249, 133, 5, 252, 107, 38, 88, 249, 133, 5, 222, 202, 38,
- 88, 5, 222, 181, 38, 88, 30, 5, 61, 38, 88, 30, 5, 232, 9, 222, 142, 38,
- 88, 30, 5, 254, 232, 38, 88, 30, 5, 218, 15, 254, 232, 38, 88, 30, 5, 72,
- 38, 88, 30, 5, 236, 28, 38, 88, 30, 5, 215, 183, 38, 88, 30, 5, 215, 91,
- 38, 88, 30, 5, 69, 38, 88, 30, 5, 215, 92, 38, 88, 30, 5, 75, 38, 88, 30,
- 5, 227, 121, 55, 38, 88, 30, 5, 226, 233, 38, 88, 30, 5, 74, 38, 88, 30,
- 5, 254, 148, 38, 88, 30, 5, 227, 49, 38, 88, 30, 5, 254, 108, 38, 88, 30,
- 5, 88, 254, 108, 38, 88, 30, 5, 227, 121, 49, 38, 88, 5, 232, 9, 234,
- 235, 38, 88, 5, 216, 240, 38, 88, 5, 216, 239, 38, 88, 5, 234, 106, 216,
- 238, 38, 88, 5, 234, 106, 216, 237, 38, 88, 5, 234, 106, 216, 236, 38,
- 88, 5, 224, 77, 242, 26, 38, 88, 5, 232, 9, 222, 168, 38, 88, 5, 234,
- 105, 234, 220, 38, 88, 37, 249, 55, 247, 74, 38, 88, 241, 33, 21, 212,
- 79, 38, 88, 241, 33, 21, 116, 38, 88, 241, 33, 21, 109, 38, 88, 241, 33,
- 21, 166, 38, 88, 241, 33, 21, 163, 38, 88, 241, 33, 21, 180, 38, 88, 241,
- 33, 21, 189, 38, 88, 241, 33, 21, 198, 38, 88, 241, 33, 21, 195, 38, 88,
- 241, 33, 21, 200, 38, 88, 88, 21, 212, 79, 38, 88, 88, 21, 116, 38, 88,
- 88, 21, 109, 38, 88, 88, 21, 166, 38, 88, 88, 21, 163, 38, 88, 88, 21,
- 180, 38, 88, 88, 21, 189, 38, 88, 88, 21, 198, 38, 88, 88, 21, 195, 38,
- 88, 88, 21, 200, 38, 88, 5, 213, 234, 38, 88, 5, 213, 233, 38, 88, 5,
- 222, 133, 38, 88, 5, 234, 166, 38, 88, 5, 240, 219, 38, 88, 5, 247, 88,
- 38, 88, 5, 223, 202, 223, 89, 224, 41, 38, 88, 5, 232, 9, 213, 61, 38,
- 88, 5, 235, 10, 38, 88, 5, 235, 9, 38, 88, 5, 222, 139, 38, 88, 5, 222,
- 138, 38, 88, 5, 241, 248, 38, 88, 5, 250, 216, 99, 5, 215, 170, 223, 183,
- 99, 5, 215, 170, 250, 189, 99, 5, 250, 120, 99, 5, 218, 215, 99, 5, 251,
- 156, 99, 1, 254, 92, 99, 1, 254, 93, 217, 221, 99, 1, 236, 24, 99, 1,
- 236, 25, 217, 221, 99, 1, 215, 173, 99, 1, 215, 174, 217, 221, 99, 1,
- 224, 77, 223, 229, 99, 1, 224, 77, 223, 230, 217, 221, 99, 1, 233, 158,
- 233, 48, 99, 1, 233, 158, 233, 49, 217, 221, 99, 1, 245, 136, 99, 1, 254,
- 106, 99, 1, 227, 78, 99, 1, 227, 79, 217, 221, 99, 1, 181, 99, 1, 235,
- 17, 232, 12, 99, 1, 243, 110, 99, 1, 243, 111, 242, 137, 99, 1, 229, 159,
- 99, 1, 250, 219, 99, 1, 250, 220, 233, 146, 99, 1, 235, 139, 99, 1, 235,
- 140, 235, 119, 99, 1, 228, 23, 99, 1, 218, 53, 233, 99, 99, 1, 218, 53,
- 230, 137, 232, 12, 99, 1, 248, 165, 230, 137, 254, 54, 99, 1, 248, 165,
- 230, 137, 232, 12, 99, 1, 230, 46, 224, 44, 99, 1, 218, 52, 99, 1, 218,
- 53, 217, 242, 99, 1, 248, 164, 99, 1, 248, 165, 232, 30, 99, 1, 205, 99,
- 1, 193, 99, 1, 226, 214, 234, 231, 99, 1, 252, 107, 99, 1, 252, 108, 234,
- 178, 99, 1, 188, 99, 1, 186, 99, 1, 203, 99, 1, 233, 157, 99, 1, 214, 49,
- 99, 1, 222, 203, 222, 189, 99, 1, 222, 203, 222, 149, 99, 1, 222, 202,
- 99, 1, 159, 99, 5, 223, 222, 99, 30, 5, 217, 221, 99, 30, 5, 215, 169,
- 99, 30, 5, 215, 170, 222, 145, 99, 30, 5, 218, 248, 99, 30, 5, 218, 249,
- 236, 16, 99, 30, 5, 224, 77, 223, 229, 99, 30, 5, 224, 77, 223, 230, 217,
- 221, 99, 30, 5, 233, 158, 233, 48, 99, 30, 5, 233, 158, 233, 49, 217,
- 221, 99, 30, 5, 218, 16, 99, 30, 5, 218, 17, 223, 229, 99, 30, 5, 218,
- 17, 217, 221, 99, 30, 5, 218, 17, 223, 230, 217, 221, 99, 30, 5, 226, 59,
- 99, 30, 5, 226, 60, 217, 221, 99, 254, 155, 254, 154, 99, 1, 234, 255,
- 222, 144, 99, 1, 234, 110, 222, 144, 99, 1, 216, 0, 222, 144, 99, 1, 245,
- 160, 222, 144, 99, 1, 214, 233, 222, 144, 99, 1, 212, 100, 222, 144, 99,
- 1, 253, 125, 222, 144, 99, 21, 212, 79, 99, 21, 116, 99, 21, 109, 99, 21,
- 166, 99, 21, 163, 99, 21, 180, 99, 21, 189, 99, 21, 198, 99, 21, 195, 99,
- 21, 200, 99, 226, 157, 99, 226, 182, 99, 213, 223, 99, 250, 168, 226,
- 175, 99, 250, 168, 220, 98, 99, 250, 168, 226, 130, 99, 226, 181, 99, 27,
- 16, 247, 80, 99, 27, 16, 248, 2, 99, 27, 16, 246, 19, 99, 27, 16, 248,
- 121, 99, 27, 16, 248, 122, 218, 215, 99, 27, 16, 247, 157, 99, 27, 16,
- 248, 157, 99, 27, 16, 247, 240, 99, 27, 16, 248, 143, 99, 27, 16, 248,
- 122, 243, 33, 99, 27, 16, 37, 217, 217, 99, 27, 16, 37, 245, 99, 99, 27,
- 16, 37, 234, 173, 99, 27, 16, 37, 234, 175, 99, 27, 16, 37, 235, 123, 99,
- 27, 16, 37, 234, 174, 2, 235, 123, 99, 27, 16, 37, 234, 176, 2, 235, 123,
- 99, 27, 16, 37, 251, 214, 99, 27, 16, 37, 242, 141, 99, 27, 16, 223, 146,
- 227, 40, 246, 29, 99, 27, 16, 223, 146, 227, 40, 248, 155, 99, 27, 16,
- 223, 146, 249, 193, 216, 75, 99, 27, 16, 223, 146, 249, 193, 218, 23, 99,
- 27, 16, 233, 68, 227, 40, 226, 170, 99, 27, 16, 233, 68, 227, 40, 225,
- 25, 99, 27, 16, 233, 68, 249, 193, 225, 170, 99, 27, 16, 233, 68, 249,
- 193, 225, 160, 99, 27, 16, 233, 68, 227, 40, 225, 193, 218, 237, 5, 226,
- 154, 218, 237, 5, 226, 166, 218, 237, 5, 226, 163, 218, 237, 1, 61, 218,
- 237, 1, 72, 218, 237, 1, 69, 218, 237, 1, 254, 148, 218, 237, 1, 75, 218,
- 237, 1, 74, 218, 237, 1, 245, 22, 218, 237, 1, 181, 218, 237, 1, 224,
- 232, 218, 237, 1, 243, 110, 218, 237, 1, 229, 159, 218, 237, 1, 250, 219,
- 218, 237, 1, 235, 139, 218, 237, 1, 212, 109, 218, 237, 1, 228, 23, 218,
- 237, 1, 218, 52, 218, 237, 1, 248, 164, 218, 237, 1, 205, 218, 237, 1,
- 193, 218, 237, 1, 244, 164, 218, 237, 1, 215, 1, 218, 237, 1, 252, 107,
- 218, 237, 1, 188, 218, 237, 1, 186, 218, 237, 1, 203, 218, 237, 1, 233,
- 157, 218, 237, 1, 214, 49, 218, 237, 1, 222, 202, 218, 237, 1, 213, 153,
- 218, 237, 1, 159, 218, 237, 249, 133, 5, 226, 179, 218, 237, 249, 133, 5,
- 226, 156, 218, 237, 249, 133, 5, 226, 153, 218, 237, 30, 5, 226, 169,
- 218, 237, 30, 5, 226, 152, 218, 237, 30, 5, 226, 173, 218, 237, 30, 5,
- 226, 162, 218, 237, 30, 5, 226, 180, 218, 237, 30, 5, 226, 171, 218, 237,
- 5, 226, 183, 218, 237, 1, 234, 138, 218, 237, 1, 218, 176, 218, 237, 21,
- 212, 79, 218, 237, 21, 116, 218, 237, 21, 109, 218, 237, 21, 166, 218,
- 237, 21, 163, 218, 237, 21, 180, 218, 237, 21, 189, 218, 237, 21, 198,
- 218, 237, 21, 195, 218, 237, 21, 200, 252, 40, 1, 61, 252, 40, 1, 220,
- 90, 61, 252, 40, 1, 159, 252, 40, 1, 220, 90, 159, 252, 40, 1, 231, 244,
- 159, 252, 40, 1, 252, 107, 252, 40, 1, 234, 217, 252, 107, 252, 40, 1,
- 193, 252, 40, 1, 220, 90, 193, 252, 40, 1, 205, 252, 40, 1, 231, 244,
- 205, 252, 40, 1, 214, 49, 252, 40, 1, 220, 90, 214, 49, 252, 40, 1, 226,
- 194, 214, 49, 252, 40, 1, 243, 110, 252, 40, 1, 220, 90, 243, 110, 252,
- 40, 1, 235, 139, 252, 40, 1, 248, 164, 252, 40, 1, 203, 252, 40, 1, 220,
- 90, 203, 252, 40, 1, 188, 252, 40, 1, 220, 90, 188, 252, 40, 1, 219, 213,
- 218, 52, 252, 40, 1, 228, 166, 218, 52, 252, 40, 1, 222, 202, 252, 40, 1,
- 220, 90, 222, 202, 252, 40, 1, 231, 244, 222, 202, 252, 40, 1, 186, 252,
- 40, 1, 220, 90, 186, 252, 40, 1, 229, 159, 252, 40, 1, 233, 157, 252, 40,
- 1, 220, 90, 233, 157, 252, 40, 1, 228, 23, 252, 40, 1, 250, 219, 252, 40,
- 1, 229, 228, 252, 40, 1, 231, 187, 252, 40, 1, 72, 252, 40, 1, 69, 252,
- 40, 5, 216, 244, 252, 40, 30, 5, 74, 252, 40, 30, 5, 226, 194, 74, 252,
- 40, 30, 5, 245, 165, 252, 40, 30, 5, 72, 252, 40, 30, 5, 234, 217, 72,
- 252, 40, 30, 5, 75, 252, 40, 30, 5, 234, 217, 75, 252, 40, 30, 5, 69,
- 252, 40, 30, 5, 111, 31, 220, 90, 222, 202, 252, 40, 249, 133, 5, 229,
- 161, 252, 40, 249, 133, 5, 242, 41, 252, 40, 226, 165, 252, 40, 226, 161,
- 252, 40, 16, 251, 164, 230, 46, 231, 104, 252, 40, 16, 251, 164, 225,
- 196, 252, 40, 16, 251, 164, 235, 51, 252, 40, 16, 251, 164, 226, 165,
- 182, 1, 181, 182, 1, 234, 48, 182, 1, 234, 138, 182, 1, 243, 110, 182, 1,
- 242, 162, 182, 1, 229, 159, 182, 1, 250, 219, 182, 1, 250, 92, 182, 1,
- 235, 139, 182, 1, 228, 23, 182, 1, 218, 52, 182, 1, 217, 161, 182, 1,
- 248, 164, 182, 1, 205, 182, 1, 193, 182, 1, 225, 174, 182, 1, 226, 23,
- 182, 1, 244, 164, 182, 1, 244, 44, 182, 1, 252, 107, 182, 1, 251, 145,
- 182, 1, 188, 182, 1, 230, 237, 182, 1, 216, 141, 182, 1, 216, 133, 182,
- 1, 245, 249, 182, 1, 186, 182, 1, 203, 182, 1, 233, 157, 182, 1, 159,
- 182, 1, 241, 139, 182, 1, 215, 1, 182, 1, 222, 202, 182, 1, 221, 24, 182,
- 1, 214, 49, 182, 1, 61, 182, 219, 18, 1, 186, 182, 219, 18, 1, 203, 182,
- 30, 5, 254, 232, 182, 30, 5, 72, 182, 30, 5, 75, 182, 30, 5, 227, 49,
- 182, 30, 5, 69, 182, 30, 5, 215, 92, 182, 30, 5, 74, 182, 249, 133, 5,
- 235, 27, 182, 249, 133, 5, 183, 182, 249, 133, 5, 150, 182, 249, 133, 5,
- 204, 182, 249, 133, 5, 226, 229, 182, 249, 133, 5, 149, 182, 249, 133, 5,
- 218, 99, 182, 249, 133, 5, 228, 5, 182, 249, 133, 5, 234, 235, 182, 5,
- 224, 42, 182, 5, 228, 60, 182, 225, 27, 218, 51, 182, 225, 27, 228, 13,
- 217, 74, 218, 51, 182, 225, 27, 250, 98, 182, 225, 27, 216, 128, 250, 98,
- 182, 225, 27, 216, 127, 182, 21, 212, 79, 182, 21, 116, 182, 21, 109,
- 182, 21, 166, 182, 21, 163, 182, 21, 180, 182, 21, 189, 182, 21, 198,
- 182, 21, 195, 182, 21, 200, 182, 1, 216, 115, 182, 1, 216, 105, 182, 1,
- 248, 86, 227, 76, 250, 40, 21, 212, 79, 227, 76, 250, 40, 21, 116, 227,
- 76, 250, 40, 21, 109, 227, 76, 250, 40, 21, 166, 227, 76, 250, 40, 21,
- 163, 227, 76, 250, 40, 21, 180, 227, 76, 250, 40, 21, 189, 227, 76, 250,
- 40, 21, 198, 227, 76, 250, 40, 21, 195, 227, 76, 250, 40, 21, 200, 227,
- 76, 250, 40, 1, 233, 157, 227, 76, 250, 40, 1, 253, 122, 227, 76, 250,
- 40, 1, 254, 121, 227, 76, 250, 40, 1, 254, 24, 227, 76, 250, 40, 1, 254,
- 86, 227, 76, 250, 40, 1, 233, 156, 227, 76, 250, 40, 1, 254, 194, 227,
- 76, 250, 40, 1, 254, 195, 227, 76, 250, 40, 1, 254, 193, 227, 76, 250,
- 40, 1, 254, 189, 227, 76, 250, 40, 1, 233, 13, 227, 76, 250, 40, 1, 235,
- 169, 227, 76, 250, 40, 1, 236, 29, 227, 76, 250, 40, 1, 235, 188, 227,
- 76, 250, 40, 1, 235, 177, 227, 76, 250, 40, 1, 232, 156, 227, 76, 250,
- 40, 1, 215, 190, 227, 76, 250, 40, 1, 215, 188, 227, 76, 250, 40, 1, 215,
- 139, 227, 76, 250, 40, 1, 215, 85, 227, 76, 250, 40, 1, 233, 82, 227, 76,
- 250, 40, 1, 245, 70, 227, 76, 250, 40, 1, 245, 168, 227, 76, 250, 40, 1,
- 245, 108, 227, 76, 250, 40, 1, 245, 49, 227, 76, 250, 40, 1, 232, 208,
- 227, 76, 250, 40, 1, 227, 5, 227, 76, 250, 40, 1, 227, 116, 227, 76, 250,
- 40, 1, 226, 249, 227, 76, 250, 40, 1, 227, 88, 227, 76, 250, 40, 230,
- 173, 216, 84, 227, 76, 250, 40, 243, 105, 216, 85, 227, 76, 250, 40, 230,
- 171, 216, 85, 227, 76, 250, 40, 223, 242, 227, 76, 250, 40, 226, 21, 227,
- 76, 250, 40, 254, 113, 227, 76, 250, 40, 225, 27, 230, 168, 227, 76, 250,
- 40, 225, 27, 51, 230, 168, 214, 229, 160, 234, 215, 214, 229, 160, 221,
- 0, 214, 229, 160, 225, 78, 214, 229, 5, 229, 40, 214, 229, 5, 213, 69,
- 231, 35, 218, 201, 214, 229, 160, 213, 69, 254, 118, 235, 240, 218, 201,
- 214, 229, 160, 213, 69, 235, 240, 218, 201, 214, 229, 160, 213, 69, 234,
- 203, 235, 240, 218, 201, 214, 229, 160, 250, 190, 55, 214, 229, 160, 213,
- 69, 234, 203, 235, 240, 218, 202, 222, 115, 214, 229, 160, 51, 218, 201,
- 214, 229, 160, 216, 169, 218, 201, 214, 229, 160, 234, 203, 253, 244,
- 214, 229, 160, 62, 55, 214, 229, 160, 117, 176, 55, 214, 229, 160, 133,
- 176, 55, 214, 229, 160, 223, 137, 234, 214, 235, 240, 218, 201, 214, 229,
- 160, 253, 120, 235, 240, 218, 201, 214, 229, 5, 214, 129, 218, 201, 214,
- 229, 5, 214, 129, 215, 185, 214, 229, 5, 223, 202, 214, 129, 215, 185,
- 214, 229, 5, 214, 129, 253, 244, 214, 229, 5, 223, 202, 214, 129, 253,
- 244, 214, 229, 5, 214, 129, 215, 186, 2, 218, 27, 214, 229, 5, 214, 129,
- 253, 245, 2, 218, 27, 214, 229, 5, 253, 243, 254, 2, 214, 229, 5, 253,
- 243, 252, 85, 214, 229, 5, 253, 243, 214, 252, 214, 229, 5, 253, 243,
- 214, 253, 2, 218, 27, 214, 229, 5, 217, 21, 214, 229, 5, 241, 176, 184,
- 253, 242, 214, 229, 5, 184, 253, 242, 214, 229, 5, 223, 53, 184, 253,
- 242, 214, 229, 5, 253, 243, 215, 192, 230, 160, 214, 229, 5, 253, 190, 7,
- 1, 3, 6, 61, 7, 1, 3, 6, 254, 148, 7, 3, 1, 216, 58, 254, 148, 7, 1, 3,
- 6, 252, 54, 253, 74, 7, 1, 3, 6, 250, 252, 7, 1, 3, 6, 249, 3, 7, 1, 3,
- 6, 245, 25, 7, 1, 3, 6, 74, 7, 3, 1, 216, 58, 227, 40, 74, 7, 3, 1, 216,
- 58, 72, 7, 1, 3, 6, 235, 142, 7, 1, 3, 6, 235, 27, 7, 1, 3, 6, 233, 171,
- 2, 90, 7, 1, 3, 6, 183, 7, 1, 3, 6, 223, 202, 204, 7, 1, 3, 6, 75, 7, 1,
- 3, 6, 227, 40, 75, 7, 3, 1, 220, 113, 75, 7, 3, 1, 220, 113, 227, 40, 75,
- 7, 3, 1, 220, 113, 157, 2, 90, 7, 3, 1, 216, 58, 227, 99, 7, 1, 3, 6,
- 227, 2, 7, 3, 1, 216, 227, 151, 75, 7, 3, 1, 251, 101, 151, 75, 7, 1, 3,
- 6, 226, 229, 7, 1, 3, 6, 223, 202, 149, 7, 1, 3, 6, 216, 58, 149, 7, 1,
- 3, 6, 218, 99, 7, 1, 3, 6, 69, 7, 3, 1, 220, 113, 69, 7, 3, 1, 220, 113,
- 247, 208, 69, 7, 3, 1, 220, 113, 216, 58, 183, 7, 1, 3, 6, 215, 79, 7, 1,
- 3, 6, 214, 82, 7, 1, 3, 6, 212, 152, 7, 1, 3, 6, 244, 232, 7, 1, 214,
- 116, 233, 105, 219, 182, 7, 1, 254, 103, 25, 1, 3, 6, 243, 83, 25, 1, 3,
- 6, 233, 122, 25, 1, 3, 6, 225, 240, 25, 1, 3, 6, 223, 190, 25, 1, 3, 6,
- 225, 46, 33, 1, 3, 6, 245, 131, 59, 1, 6, 61, 59, 1, 6, 254, 148, 59, 1,
- 6, 253, 74, 59, 1, 6, 252, 54, 253, 74, 59, 1, 6, 249, 3, 59, 1, 6, 74,
- 59, 1, 6, 223, 202, 74, 59, 1, 6, 243, 177, 59, 1, 6, 242, 41, 59, 1, 6,
- 72, 59, 1, 6, 235, 142, 59, 1, 6, 235, 27, 59, 1, 6, 150, 59, 1, 6, 183,
- 59, 1, 6, 204, 59, 1, 6, 223, 202, 204, 59, 1, 6, 75, 59, 1, 6, 227, 2,
- 59, 1, 6, 226, 229, 59, 1, 6, 149, 59, 1, 6, 218, 99, 59, 1, 6, 69, 59,
- 1, 6, 214, 82, 59, 1, 3, 61, 59, 1, 3, 216, 58, 61, 59, 1, 3, 254, 52,
- 59, 1, 3, 216, 58, 254, 148, 59, 1, 3, 253, 74, 59, 1, 3, 249, 3, 59, 1,
- 3, 74, 59, 1, 3, 222, 113, 59, 1, 3, 227, 40, 74, 59, 1, 3, 216, 58, 227,
- 40, 74, 59, 1, 3, 243, 177, 59, 1, 3, 216, 58, 72, 59, 1, 3, 235, 27, 59,
- 1, 3, 183, 59, 1, 3, 245, 96, 59, 1, 3, 75, 59, 1, 3, 227, 40, 75, 59, 1,
- 3, 216, 227, 151, 75, 59, 1, 3, 251, 101, 151, 75, 59, 1, 3, 226, 229,
- 59, 1, 3, 218, 99, 59, 1, 3, 69, 59, 1, 3, 220, 113, 69, 59, 1, 3, 216,
- 58, 183, 59, 1, 3, 215, 79, 59, 1, 3, 254, 103, 59, 1, 3, 251, 203, 59,
- 1, 3, 25, 243, 83, 59, 1, 3, 248, 5, 59, 1, 3, 25, 226, 9, 59, 1, 3, 250,
- 47, 7, 219, 10, 3, 1, 72, 7, 219, 10, 3, 1, 149, 7, 219, 10, 3, 1, 69, 7,
- 219, 10, 3, 1, 215, 79, 25, 219, 10, 3, 1, 251, 203, 25, 219, 10, 3, 1,
- 243, 83, 25, 219, 10, 3, 1, 223, 190, 25, 219, 10, 3, 1, 226, 9, 25, 219,
- 10, 3, 1, 250, 47, 7, 3, 1, 215, 183, 7, 3, 1, 54, 2, 231, 37, 217, 42,
- 7, 3, 1, 249, 4, 2, 231, 37, 217, 42, 7, 3, 1, 244, 231, 2, 231, 37, 217,
- 42, 7, 3, 1, 232, 110, 2, 231, 37, 217, 42, 7, 3, 1, 230, 98, 2, 231, 37,
- 217, 42, 7, 3, 1, 226, 230, 2, 231, 37, 217, 42, 7, 3, 1, 224, 113, 2,
- 231, 37, 217, 42, 7, 3, 1, 224, 113, 2, 244, 57, 24, 231, 37, 217, 42, 7,
- 3, 1, 223, 4, 2, 231, 37, 217, 42, 7, 3, 1, 218, 100, 2, 231, 37, 217,
- 42, 7, 3, 1, 212, 153, 2, 231, 37, 217, 42, 7, 3, 1, 216, 58, 243, 177,
- 59, 1, 33, 245, 108, 7, 3, 1, 235, 210, 243, 177, 7, 3, 1, 217, 164, 2,
- 219, 47, 7, 3, 6, 1, 240, 146, 2, 90, 7, 3, 1, 235, 184, 2, 90, 7, 3, 1,
- 226, 230, 2, 90, 7, 3, 6, 1, 111, 2, 90, 7, 3, 1, 215, 129, 2, 90, 7, 3,
- 1, 54, 2, 226, 193, 101, 7, 3, 1, 249, 4, 2, 226, 193, 101, 7, 3, 1, 244,
- 231, 2, 226, 193, 101, 7, 3, 1, 243, 178, 2, 226, 193, 101, 7, 3, 1, 235,
- 28, 2, 226, 193, 101, 7, 3, 1, 233, 171, 2, 226, 193, 101, 7, 3, 1, 232,
- 110, 2, 226, 193, 101, 7, 3, 1, 230, 98, 2, 226, 193, 101, 7, 3, 1, 226,
- 230, 2, 226, 193, 101, 7, 3, 1, 224, 113, 2, 226, 193, 101, 7, 3, 1, 223,
- 4, 2, 226, 193, 101, 7, 3, 1, 245, 41, 2, 226, 193, 101, 7, 3, 1, 215,
- 80, 2, 226, 193, 101, 7, 3, 1, 213, 167, 2, 226, 193, 101, 7, 3, 1, 212,
- 153, 2, 226, 193, 101, 7, 3, 1, 118, 2, 223, 207, 101, 7, 3, 1, 254, 53,
- 2, 223, 207, 101, 7, 3, 1, 249, 4, 2, 241, 38, 24, 218, 27, 7, 3, 1, 191,
- 2, 223, 207, 101, 7, 3, 1, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 223,
- 202, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 222, 114, 2, 223, 207, 101,
- 7, 3, 1, 240, 146, 2, 223, 207, 101, 7, 3, 1, 227, 40, 157, 2, 223, 207,
- 101, 7, 3, 1, 245, 41, 2, 223, 207, 101, 7, 3, 1, 111, 2, 223, 207, 101,
- 7, 3, 1, 244, 233, 2, 223, 207, 101, 59, 1, 3, 216, 58, 254, 52, 59, 1,
- 3, 250, 252, 59, 1, 3, 250, 253, 2, 249, 41, 59, 1, 3, 245, 25, 59, 1, 3,
- 223, 202, 227, 40, 74, 59, 1, 3, 244, 230, 59, 1, 3, 247, 73, 235, 143,
- 2, 90, 59, 1, 3, 113, 243, 177, 59, 1, 3, 216, 58, 242, 41, 59, 1, 3,
- 240, 146, 2, 90, 59, 1, 3, 235, 183, 59, 1, 3, 6, 72, 59, 1, 3, 6, 240,
- 146, 2, 90, 59, 1, 3, 235, 143, 2, 249, 67, 59, 1, 3, 233, 171, 2, 223,
- 207, 101, 59, 1, 3, 233, 171, 2, 226, 193, 101, 59, 1, 3, 6, 150, 59, 1,
- 3, 232, 110, 2, 101, 59, 1, 3, 216, 58, 232, 110, 2, 184, 233, 60, 59, 1,
- 3, 230, 98, 2, 42, 101, 59, 1, 3, 230, 98, 2, 223, 207, 101, 59, 1, 3, 6,
- 204, 59, 1, 3, 252, 54, 75, 59, 1, 3, 226, 9, 59, 1, 3, 223, 4, 2, 101,
- 59, 1, 3, 245, 40, 59, 1, 3, 218, 100, 2, 226, 193, 101, 59, 1, 3, 111,
- 134, 59, 1, 3, 215, 128, 59, 1, 3, 6, 69, 59, 1, 3, 215, 80, 2, 101, 59,
- 1, 3, 216, 58, 215, 79, 59, 1, 3, 212, 152, 59, 1, 3, 212, 153, 2, 223,
- 207, 101, 59, 1, 3, 212, 153, 2, 249, 41, 59, 1, 3, 244, 232, 59, 1, 3,
- 217, 132, 37, 246, 72, 242, 114, 254, 174, 37, 246, 72, 254, 164, 254,
- 174, 37, 219, 253, 55, 37, 218, 207, 77, 37, 232, 36, 37, 242, 111, 37,
- 232, 34, 37, 254, 162, 37, 242, 112, 37, 254, 163, 37, 7, 3, 1, 224, 113,
- 55, 37, 251, 73, 37, 232, 35, 37, 51, 249, 224, 49, 37, 227, 91, 49, 37,
- 212, 28, 55, 37, 235, 170, 55, 37, 215, 122, 49, 37, 215, 105, 49, 37, 7,
- 3, 1, 244, 32, 227, 40, 118, 49, 37, 7, 3, 1, 254, 148, 37, 7, 3, 1, 253,
- 240, 37, 7, 3, 1, 253, 92, 37, 7, 3, 1, 250, 253, 250, 117, 37, 7, 3, 1,
- 235, 210, 249, 3, 37, 7, 3, 1, 245, 25, 37, 7, 3, 1, 243, 177, 37, 7, 1,
- 3, 6, 243, 177, 37, 7, 3, 1, 235, 27, 37, 7, 3, 1, 150, 37, 7, 1, 3, 6,
- 150, 37, 7, 1, 3, 6, 183, 37, 7, 3, 1, 204, 37, 7, 1, 3, 6, 204, 37, 7,
- 1, 3, 6, 149, 37, 7, 3, 1, 224, 113, 223, 88, 37, 7, 3, 1, 197, 37, 7, 3,
- 1, 184, 197, 37, 7, 3, 1, 212, 152, 37, 51, 235, 191, 251, 75, 55, 37,
- 254, 57, 123, 211, 211, 55, 37, 42, 253, 165, 49, 37, 46, 253, 165, 24,
- 119, 253, 165, 55, 7, 6, 1, 118, 2, 223, 131, 55, 7, 3, 1, 118, 2, 223,
- 131, 55, 7, 6, 1, 54, 2, 62, 49, 7, 3, 1, 54, 2, 62, 49, 7, 6, 1, 54, 2,
- 62, 55, 7, 3, 1, 54, 2, 62, 55, 7, 6, 1, 54, 2, 232, 243, 55, 7, 3, 1,
- 54, 2, 232, 243, 55, 7, 6, 1, 250, 253, 2, 250, 118, 24, 179, 7, 3, 1,
- 250, 253, 2, 250, 118, 24, 179, 7, 6, 1, 249, 4, 2, 62, 49, 7, 3, 1, 249,
- 4, 2, 62, 49, 7, 6, 1, 249, 4, 2, 62, 55, 7, 3, 1, 249, 4, 2, 62, 55, 7,
- 6, 1, 249, 4, 2, 232, 243, 55, 7, 3, 1, 249, 4, 2, 232, 243, 55, 7, 6, 1,
- 249, 4, 2, 250, 117, 7, 3, 1, 249, 4, 2, 250, 117, 7, 6, 1, 249, 4, 2,
- 249, 224, 55, 7, 3, 1, 249, 4, 2, 249, 224, 55, 7, 6, 1, 191, 2, 232, 38,
- 24, 242, 113, 7, 3, 1, 191, 2, 232, 38, 24, 242, 113, 7, 6, 1, 191, 2,
- 232, 38, 24, 179, 7, 3, 1, 191, 2, 232, 38, 24, 179, 7, 6, 1, 191, 2,
- 249, 224, 55, 7, 3, 1, 191, 2, 249, 224, 55, 7, 6, 1, 191, 2, 217, 43,
- 55, 7, 3, 1, 191, 2, 217, 43, 55, 7, 6, 1, 191, 2, 250, 118, 24, 251, 74,
- 7, 3, 1, 191, 2, 250, 118, 24, 251, 74, 7, 6, 1, 244, 231, 2, 62, 49, 7,
- 3, 1, 244, 231, 2, 62, 49, 7, 6, 1, 243, 178, 2, 232, 37, 7, 3, 1, 243,
- 178, 2, 232, 37, 7, 6, 1, 242, 42, 2, 62, 49, 7, 3, 1, 242, 42, 2, 62,
- 49, 7, 6, 1, 242, 42, 2, 62, 55, 7, 3, 1, 242, 42, 2, 62, 55, 7, 6, 1,
- 242, 42, 2, 247, 209, 7, 3, 1, 242, 42, 2, 247, 209, 7, 6, 1, 242, 42, 2,
- 250, 117, 7, 3, 1, 242, 42, 2, 250, 117, 7, 6, 1, 242, 42, 2, 251, 75,
- 55, 7, 3, 1, 242, 42, 2, 251, 75, 55, 7, 6, 1, 240, 146, 2, 217, 43, 55,
- 7, 3, 1, 240, 146, 2, 217, 43, 55, 7, 6, 1, 240, 146, 2, 247, 210, 24,
- 179, 7, 3, 1, 240, 146, 2, 247, 210, 24, 179, 7, 6, 1, 235, 28, 2, 179,
- 7, 3, 1, 235, 28, 2, 179, 7, 6, 1, 235, 28, 2, 62, 55, 7, 3, 1, 235, 28,
- 2, 62, 55, 7, 6, 1, 235, 28, 2, 232, 243, 55, 7, 3, 1, 235, 28, 2, 232,
- 243, 55, 7, 6, 1, 233, 171, 2, 62, 55, 7, 3, 1, 233, 171, 2, 62, 55, 7,
- 6, 1, 233, 171, 2, 62, 251, 220, 24, 232, 37, 7, 3, 1, 233, 171, 2, 62,
- 251, 220, 24, 232, 37, 7, 6, 1, 233, 171, 2, 232, 243, 55, 7, 3, 1, 233,
- 171, 2, 232, 243, 55, 7, 6, 1, 233, 171, 2, 249, 224, 55, 7, 3, 1, 233,
- 171, 2, 249, 224, 55, 7, 6, 1, 232, 110, 2, 179, 7, 3, 1, 232, 110, 2,
- 179, 7, 6, 1, 232, 110, 2, 62, 49, 7, 3, 1, 232, 110, 2, 62, 49, 7, 6, 1,
- 232, 110, 2, 62, 55, 7, 3, 1, 232, 110, 2, 62, 55, 7, 6, 1, 230, 98, 2,
- 62, 49, 7, 3, 1, 230, 98, 2, 62, 49, 7, 6, 1, 230, 98, 2, 62, 55, 7, 3,
- 1, 230, 98, 2, 62, 55, 7, 6, 1, 230, 98, 2, 232, 243, 55, 7, 3, 1, 230,
- 98, 2, 232, 243, 55, 7, 6, 1, 230, 98, 2, 249, 224, 55, 7, 3, 1, 230, 98,
- 2, 249, 224, 55, 7, 6, 1, 157, 2, 217, 43, 24, 179, 7, 3, 1, 157, 2, 217,
- 43, 24, 179, 7, 6, 1, 157, 2, 217, 43, 24, 247, 209, 7, 3, 1, 157, 2,
- 217, 43, 24, 247, 209, 7, 6, 1, 157, 2, 232, 38, 24, 242, 113, 7, 3, 1,
- 157, 2, 232, 38, 24, 242, 113, 7, 6, 1, 157, 2, 232, 38, 24, 179, 7, 3,
- 1, 157, 2, 232, 38, 24, 179, 7, 6, 1, 226, 230, 2, 179, 7, 3, 1, 226,
- 230, 2, 179, 7, 6, 1, 226, 230, 2, 62, 49, 7, 3, 1, 226, 230, 2, 62, 49,
- 7, 6, 1, 224, 113, 2, 62, 49, 7, 3, 1, 224, 113, 2, 62, 49, 7, 6, 1, 224,
- 113, 2, 62, 55, 7, 3, 1, 224, 113, 2, 62, 55, 7, 6, 1, 224, 113, 2, 62,
- 251, 220, 24, 232, 37, 7, 3, 1, 224, 113, 2, 62, 251, 220, 24, 232, 37,
- 7, 6, 1, 224, 113, 2, 232, 243, 55, 7, 3, 1, 224, 113, 2, 232, 243, 55,
- 7, 6, 1, 223, 4, 2, 62, 49, 7, 3, 1, 223, 4, 2, 62, 49, 7, 6, 1, 223, 4,
- 2, 62, 55, 7, 3, 1, 223, 4, 2, 62, 55, 7, 6, 1, 223, 4, 2, 254, 164, 24,
- 62, 49, 7, 3, 1, 223, 4, 2, 254, 164, 24, 62, 49, 7, 6, 1, 223, 4, 2,
- 250, 167, 24, 62, 49, 7, 3, 1, 223, 4, 2, 250, 167, 24, 62, 49, 7, 6, 1,
- 223, 4, 2, 62, 251, 220, 24, 62, 49, 7, 3, 1, 223, 4, 2, 62, 251, 220,
- 24, 62, 49, 7, 6, 1, 218, 100, 2, 62, 49, 7, 3, 1, 218, 100, 2, 62, 49,
- 7, 6, 1, 218, 100, 2, 62, 55, 7, 3, 1, 218, 100, 2, 62, 55, 7, 6, 1, 218,
- 100, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2, 232, 243, 55, 7, 6, 1, 218,
- 100, 2, 249, 224, 55, 7, 3, 1, 218, 100, 2, 249, 224, 55, 7, 6, 1, 111,
- 2, 247, 210, 55, 7, 3, 1, 111, 2, 247, 210, 55, 7, 6, 1, 111, 2, 217, 43,
- 55, 7, 3, 1, 111, 2, 217, 43, 55, 7, 6, 1, 111, 2, 249, 224, 55, 7, 3, 1,
- 111, 2, 249, 224, 55, 7, 6, 1, 111, 2, 217, 43, 24, 179, 7, 3, 1, 111, 2,
- 217, 43, 24, 179, 7, 6, 1, 111, 2, 232, 38, 24, 247, 209, 7, 3, 1, 111,
- 2, 232, 38, 24, 247, 209, 7, 6, 1, 215, 80, 2, 217, 42, 7, 3, 1, 215, 80,
- 2, 217, 42, 7, 6, 1, 215, 80, 2, 62, 55, 7, 3, 1, 215, 80, 2, 62, 55, 7,
- 6, 1, 214, 83, 2, 242, 113, 7, 3, 1, 214, 83, 2, 242, 113, 7, 6, 1, 214,
- 83, 2, 179, 7, 3, 1, 214, 83, 2, 179, 7, 6, 1, 214, 83, 2, 247, 209, 7,
- 3, 1, 214, 83, 2, 247, 209, 7, 6, 1, 214, 83, 2, 62, 49, 7, 3, 1, 214,
- 83, 2, 62, 49, 7, 6, 1, 214, 83, 2, 62, 55, 7, 3, 1, 214, 83, 2, 62, 55,
- 7, 6, 1, 213, 167, 2, 62, 49, 7, 3, 1, 213, 167, 2, 62, 49, 7, 6, 1, 213,
- 167, 2, 247, 209, 7, 3, 1, 213, 167, 2, 247, 209, 7, 6, 1, 213, 106, 2,
- 62, 49, 7, 3, 1, 213, 106, 2, 62, 49, 7, 6, 1, 212, 153, 2, 249, 223, 7,
- 3, 1, 212, 153, 2, 249, 223, 7, 6, 1, 212, 153, 2, 62, 55, 7, 3, 1, 212,
- 153, 2, 62, 55, 7, 6, 1, 212, 153, 2, 232, 243, 55, 7, 3, 1, 212, 153, 2,
- 232, 243, 55, 7, 3, 1, 242, 42, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2,
- 247, 209, 7, 3, 1, 214, 83, 2, 223, 131, 49, 7, 3, 1, 213, 106, 2, 223,
- 131, 49, 7, 3, 1, 118, 2, 46, 151, 223, 130, 7, 3, 1, 184, 223, 4, 2, 62,
- 49, 7, 3, 1, 184, 223, 4, 2, 247, 207, 90, 7, 3, 1, 184, 223, 4, 2, 124,
- 90, 7, 6, 1, 220, 255, 197, 7, 3, 1, 248, 5, 7, 6, 1, 118, 2, 62, 55, 7,
- 3, 1, 118, 2, 62, 55, 7, 6, 1, 118, 2, 241, 38, 49, 7, 3, 1, 118, 2, 241,
- 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 179, 7, 3, 1, 118, 2, 249, 224,
- 24, 179, 7, 6, 1, 118, 2, 249, 224, 24, 242, 113, 7, 3, 1, 118, 2, 249,
- 224, 24, 242, 113, 7, 6, 1, 118, 2, 249, 224, 24, 241, 38, 49, 7, 3, 1,
- 118, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 217,
- 42, 7, 3, 1, 118, 2, 249, 224, 24, 217, 42, 7, 6, 1, 118, 2, 249, 224,
- 24, 62, 55, 7, 3, 1, 118, 2, 249, 224, 24, 62, 55, 7, 6, 1, 118, 2, 251,
- 75, 24, 179, 7, 3, 1, 118, 2, 251, 75, 24, 179, 7, 6, 1, 118, 2, 251, 75,
- 24, 242, 113, 7, 3, 1, 118, 2, 251, 75, 24, 242, 113, 7, 6, 1, 118, 2,
- 251, 75, 24, 241, 38, 49, 7, 3, 1, 118, 2, 251, 75, 24, 241, 38, 49, 7,
- 6, 1, 118, 2, 251, 75, 24, 217, 42, 7, 3, 1, 118, 2, 251, 75, 24, 217,
- 42, 7, 6, 1, 118, 2, 251, 75, 24, 62, 55, 7, 3, 1, 118, 2, 251, 75, 24,
- 62, 55, 7, 6, 1, 191, 2, 62, 55, 7, 3, 1, 191, 2, 62, 55, 7, 6, 1, 191,
- 2, 241, 38, 49, 7, 3, 1, 191, 2, 241, 38, 49, 7, 6, 1, 191, 2, 217, 42,
- 7, 3, 1, 191, 2, 217, 42, 7, 6, 1, 191, 2, 249, 224, 24, 179, 7, 3, 1,
- 191, 2, 249, 224, 24, 179, 7, 6, 1, 191, 2, 249, 224, 24, 242, 113, 7, 3,
- 1, 191, 2, 249, 224, 24, 242, 113, 7, 6, 1, 191, 2, 249, 224, 24, 241,
- 38, 49, 7, 3, 1, 191, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 191, 2, 249,
- 224, 24, 217, 42, 7, 3, 1, 191, 2, 249, 224, 24, 217, 42, 7, 6, 1, 191,
- 2, 249, 224, 24, 62, 55, 7, 3, 1, 191, 2, 249, 224, 24, 62, 55, 7, 6, 1,
- 240, 146, 2, 241, 38, 49, 7, 3, 1, 240, 146, 2, 241, 38, 49, 7, 6, 1,
- 240, 146, 2, 62, 55, 7, 3, 1, 240, 146, 2, 62, 55, 7, 6, 1, 157, 2, 62,
- 55, 7, 3, 1, 157, 2, 62, 55, 7, 6, 1, 157, 2, 241, 38, 49, 7, 3, 1, 157,
- 2, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 179, 7, 3, 1, 157, 2, 249,
- 224, 24, 179, 7, 6, 1, 157, 2, 249, 224, 24, 242, 113, 7, 3, 1, 157, 2,
- 249, 224, 24, 242, 113, 7, 6, 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 3,
- 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 217,
- 42, 7, 3, 1, 157, 2, 249, 224, 24, 217, 42, 7, 6, 1, 157, 2, 249, 224,
- 24, 62, 55, 7, 3, 1, 157, 2, 249, 224, 24, 62, 55, 7, 6, 1, 157, 2, 240,
- 236, 24, 179, 7, 3, 1, 157, 2, 240, 236, 24, 179, 7, 6, 1, 157, 2, 240,
- 236, 24, 242, 113, 7, 3, 1, 157, 2, 240, 236, 24, 242, 113, 7, 6, 1, 157,
- 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 157, 2, 240, 236, 24, 241, 38, 49,
- 7, 6, 1, 157, 2, 240, 236, 24, 217, 42, 7, 3, 1, 157, 2, 240, 236, 24,
- 217, 42, 7, 6, 1, 157, 2, 240, 236, 24, 62, 55, 7, 3, 1, 157, 2, 240,
- 236, 24, 62, 55, 7, 6, 1, 111, 2, 62, 55, 7, 3, 1, 111, 2, 62, 55, 7, 6,
- 1, 111, 2, 241, 38, 49, 7, 3, 1, 111, 2, 241, 38, 49, 7, 6, 1, 111, 2,
- 240, 236, 24, 179, 7, 3, 1, 111, 2, 240, 236, 24, 179, 7, 6, 1, 111, 2,
- 240, 236, 24, 242, 113, 7, 3, 1, 111, 2, 240, 236, 24, 242, 113, 7, 6, 1,
- 111, 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 111, 2, 240, 236, 24, 241,
- 38, 49, 7, 6, 1, 111, 2, 240, 236, 24, 217, 42, 7, 3, 1, 111, 2, 240,
- 236, 24, 217, 42, 7, 6, 1, 111, 2, 240, 236, 24, 62, 55, 7, 3, 1, 111, 2,
- 240, 236, 24, 62, 55, 7, 6, 1, 213, 106, 2, 242, 113, 7, 3, 1, 213, 106,
- 2, 242, 113, 7, 6, 1, 213, 106, 2, 62, 55, 7, 3, 1, 213, 106, 2, 62, 55,
- 7, 6, 1, 213, 106, 2, 241, 38, 49, 7, 3, 1, 213, 106, 2, 241, 38, 49, 7,
- 6, 1, 213, 106, 2, 217, 42, 7, 3, 1, 213, 106, 2, 217, 42, 7, 6, 1, 231,
- 36, 232, 214, 7, 3, 1, 231, 36, 232, 214, 7, 6, 1, 231, 36, 215, 79, 7,
- 3, 1, 231, 36, 215, 79, 7, 6, 1, 213, 106, 2, 232, 177, 7, 3, 1, 213,
- 106, 2, 232, 177, 25, 3, 1, 254, 53, 2, 225, 39, 25, 3, 1, 254, 53, 2,
- 248, 99, 25, 3, 1, 254, 53, 2, 225, 40, 24, 214, 245, 25, 3, 1, 254, 53,
- 2, 207, 24, 214, 245, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 234, 25, 3,
- 1, 254, 53, 2, 207, 24, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226,
- 50, 25, 3, 1, 254, 53, 2, 207, 24, 226, 50, 25, 6, 1, 254, 53, 2, 225,
- 39, 25, 6, 1, 254, 53, 2, 248, 99, 25, 6, 1, 254, 53, 2, 225, 40, 24,
- 214, 245, 25, 6, 1, 254, 53, 2, 207, 24, 214, 245, 25, 6, 1, 254, 53, 2,
- 225, 40, 24, 226, 234, 25, 6, 1, 254, 53, 2, 207, 24, 226, 234, 25, 6, 1,
- 254, 53, 2, 225, 40, 24, 226, 50, 25, 6, 1, 254, 53, 2, 207, 24, 226, 50,
- 25, 3, 1, 245, 64, 2, 225, 39, 25, 3, 1, 245, 64, 2, 248, 99, 25, 3, 1,
- 245, 64, 2, 225, 40, 24, 214, 245, 25, 3, 1, 245, 64, 2, 207, 24, 214,
- 245, 25, 3, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 3, 1, 245, 64, 2,
- 207, 24, 226, 234, 25, 6, 1, 245, 64, 2, 225, 39, 25, 6, 1, 245, 64, 2,
- 248, 99, 25, 6, 1, 245, 64, 2, 225, 40, 24, 214, 245, 25, 6, 1, 245, 64,
- 2, 207, 24, 214, 245, 25, 6, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 6,
- 1, 245, 64, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2, 225, 39, 25, 3,
- 1, 245, 29, 2, 248, 99, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214, 245, 25,
- 3, 1, 245, 29, 2, 207, 24, 214, 245, 25, 3, 1, 245, 29, 2, 225, 40, 24,
- 226, 234, 25, 3, 1, 245, 29, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2,
- 225, 40, 24, 226, 50, 25, 3, 1, 245, 29, 2, 207, 24, 226, 50, 25, 6, 1,
- 245, 29, 2, 225, 39, 25, 6, 1, 245, 29, 2, 248, 99, 25, 6, 1, 245, 29, 2,
- 225, 40, 24, 214, 245, 25, 6, 1, 245, 29, 2, 207, 24, 214, 245, 25, 6, 1,
- 245, 29, 2, 225, 40, 24, 226, 234, 25, 6, 1, 245, 29, 2, 207, 24, 226,
- 234, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226, 50, 25, 6, 1, 245, 29, 2,
- 207, 24, 226, 50, 25, 3, 1, 235, 184, 2, 225, 39, 25, 3, 1, 235, 184, 2,
- 248, 99, 25, 3, 1, 235, 184, 2, 225, 40, 24, 214, 245, 25, 3, 1, 235,
- 184, 2, 207, 24, 214, 245, 25, 3, 1, 235, 184, 2, 225, 40, 24, 226, 234,
- 25, 3, 1, 235, 184, 2, 207, 24, 226, 234, 25, 3, 1, 235, 184, 2, 225, 40,
- 24, 226, 50, 25, 3, 1, 235, 184, 2, 207, 24, 226, 50, 25, 6, 1, 235, 184,
- 2, 225, 39, 25, 6, 1, 235, 184, 2, 248, 99, 25, 6, 1, 235, 184, 2, 225,
- 40, 24, 214, 245, 25, 6, 1, 235, 184, 2, 207, 24, 214, 245, 25, 6, 1,
- 235, 184, 2, 225, 40, 24, 226, 234, 25, 6, 1, 235, 184, 2, 207, 24, 226,
- 234, 25, 6, 1, 235, 184, 2, 225, 40, 24, 226, 50, 25, 6, 1, 235, 184, 2,
- 207, 24, 226, 50, 25, 3, 1, 227, 66, 2, 225, 39, 25, 3, 1, 227, 66, 2,
- 248, 99, 25, 3, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25, 3, 1, 227, 66,
- 2, 207, 24, 214, 245, 25, 3, 1, 227, 66, 2, 225, 40, 24, 226, 234, 25, 3,
- 1, 227, 66, 2, 207, 24, 226, 234, 25, 6, 1, 227, 66, 2, 225, 39, 25, 6,
- 1, 227, 66, 2, 248, 99, 25, 6, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25,
- 6, 1, 227, 66, 2, 207, 24, 214, 245, 25, 6, 1, 227, 66, 2, 225, 40, 24,
- 226, 234, 25, 6, 1, 227, 66, 2, 207, 24, 226, 234, 25, 3, 1, 215, 129, 2,
- 225, 39, 25, 3, 1, 215, 129, 2, 248, 99, 25, 3, 1, 215, 129, 2, 225, 40,
- 24, 214, 245, 25, 3, 1, 215, 129, 2, 207, 24, 214, 245, 25, 3, 1, 215,
- 129, 2, 225, 40, 24, 226, 234, 25, 3, 1, 215, 129, 2, 207, 24, 226, 234,
- 25, 3, 1, 215, 129, 2, 225, 40, 24, 226, 50, 25, 3, 1, 215, 129, 2, 207,
- 24, 226, 50, 25, 6, 1, 215, 129, 2, 248, 99, 25, 6, 1, 215, 129, 2, 207,
- 24, 214, 245, 25, 6, 1, 215, 129, 2, 207, 24, 226, 234, 25, 6, 1, 215,
- 129, 2, 207, 24, 226, 50, 25, 3, 1, 227, 68, 2, 225, 39, 25, 3, 1, 227,
- 68, 2, 248, 99, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 245, 25, 3, 1,
- 227, 68, 2, 207, 24, 214, 245, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226,
- 234, 25, 3, 1, 227, 68, 2, 207, 24, 226, 234, 25, 3, 1, 227, 68, 2, 225,
- 40, 24, 226, 50, 25, 3, 1, 227, 68, 2, 207, 24, 226, 50, 25, 6, 1, 227,
- 68, 2, 225, 39, 25, 6, 1, 227, 68, 2, 248, 99, 25, 6, 1, 227, 68, 2, 225,
- 40, 24, 214, 245, 25, 6, 1, 227, 68, 2, 207, 24, 214, 245, 25, 6, 1, 227,
- 68, 2, 225, 40, 24, 226, 234, 25, 6, 1, 227, 68, 2, 207, 24, 226, 234,
- 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 50, 25, 6, 1, 227, 68, 2, 207,
- 24, 226, 50, 25, 3, 1, 254, 53, 2, 214, 245, 25, 3, 1, 254, 53, 2, 226,
- 234, 25, 3, 1, 245, 64, 2, 214, 245, 25, 3, 1, 245, 64, 2, 226, 234, 25,
- 3, 1, 245, 29, 2, 214, 245, 25, 3, 1, 245, 29, 2, 226, 234, 25, 3, 1,
- 235, 184, 2, 214, 245, 25, 3, 1, 235, 184, 2, 226, 234, 25, 3, 1, 227,
- 66, 2, 214, 245, 25, 3, 1, 227, 66, 2, 226, 234, 25, 3, 1, 215, 129, 2,
- 214, 245, 25, 3, 1, 215, 129, 2, 226, 234, 25, 3, 1, 227, 68, 2, 214,
- 245, 25, 3, 1, 227, 68, 2, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24,
- 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 212, 210, 25, 3, 1, 254, 53, 2,
- 225, 40, 24, 214, 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 214,
- 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 212,
- 210, 25, 3, 1, 254, 53, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1,
- 254, 53, 2, 225, 40, 24, 226, 51, 24, 212, 210, 25, 3, 1, 254, 53, 2,
- 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 225, 40, 24, 225,
- 51, 25, 6, 1, 254, 53, 2, 207, 24, 225, 51, 25, 6, 1, 254, 53, 2, 225,
- 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 214, 246,
- 24, 225, 51, 25, 6, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 225, 51,
- 25, 6, 1, 254, 53, 2, 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 254, 53,
- 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 226,
- 51, 24, 225, 51, 25, 3, 1, 245, 29, 2, 225, 40, 24, 212, 210, 25, 3, 1,
- 245, 29, 2, 207, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214,
- 246, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 214, 246, 24, 212, 210,
- 25, 3, 1, 245, 29, 2, 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245,
- 29, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40,
- 24, 226, 51, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 226, 51, 24,
- 212, 210, 25, 6, 1, 245, 29, 2, 225, 40, 24, 225, 51, 25, 6, 1, 245, 29,
- 2, 207, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 214, 246, 24,
- 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1,
- 245, 29, 2, 225, 40, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2,
- 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226,
- 51, 24, 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 226, 51, 24, 225, 51, 25,
- 3, 1, 227, 68, 2, 225, 40, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24,
- 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 212, 210, 25,
- 3, 1, 227, 68, 2, 207, 24, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2,
- 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24, 226,
- 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 212,
- 210, 25, 3, 1, 227, 68, 2, 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 227,
- 68, 2, 225, 40, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 225, 51, 25,
- 6, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68,
- 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68, 2, 225, 40, 24,
- 226, 235, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 226, 235, 24, 225,
- 51, 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1,
- 227, 68, 2, 207, 24, 226, 51, 24, 225, 51, 25, 3, 1, 254, 53, 2, 214,
- 101, 25, 3, 1, 254, 53, 2, 232, 37, 25, 3, 1, 254, 53, 2, 214, 246, 24,
- 212, 210, 25, 3, 1, 254, 53, 2, 212, 210, 25, 3, 1, 254, 53, 2, 226, 235,
- 24, 212, 210, 25, 3, 1, 254, 53, 2, 226, 50, 25, 3, 1, 254, 53, 2, 226,
- 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 214, 101, 25, 6, 1, 254, 53, 2,
- 232, 37, 25, 6, 1, 254, 53, 2, 214, 245, 25, 6, 1, 254, 53, 2, 226, 234,
- 25, 6, 1, 254, 53, 2, 225, 51, 25, 234, 11, 25, 225, 51, 25, 225, 39, 25,
- 226, 50, 25, 247, 204, 24, 226, 50, 25, 3, 1, 245, 29, 2, 214, 246, 24,
- 212, 210, 25, 3, 1, 245, 29, 2, 212, 210, 25, 3, 1, 245, 29, 2, 226, 235,
- 24, 212, 210, 25, 3, 1, 245, 29, 2, 226, 50, 25, 3, 1, 245, 29, 2, 226,
- 51, 24, 212, 210, 25, 6, 1, 245, 64, 2, 214, 245, 25, 6, 1, 245, 64, 2,
- 226, 234, 25, 6, 1, 245, 29, 2, 214, 245, 25, 6, 1, 245, 29, 2, 226, 234,
- 25, 6, 1, 245, 29, 2, 225, 51, 25, 225, 40, 24, 214, 245, 25, 225, 40,
- 24, 226, 234, 25, 225, 40, 24, 226, 50, 25, 3, 1, 235, 184, 2, 214, 101,
- 25, 3, 1, 235, 184, 2, 232, 37, 25, 3, 1, 235, 184, 2, 247, 204, 24, 214,
- 245, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 234, 25, 3, 1, 235, 184,
- 2, 226, 50, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 50, 25, 6, 1, 235,
- 184, 2, 214, 101, 25, 6, 1, 235, 184, 2, 232, 37, 25, 6, 1, 235, 184, 2,
- 214, 245, 25, 6, 1, 235, 184, 2, 226, 234, 25, 207, 24, 214, 245, 25,
- 207, 24, 226, 234, 25, 207, 24, 226, 50, 25, 3, 1, 215, 129, 2, 214, 101,
- 25, 3, 1, 215, 129, 2, 232, 37, 25, 3, 1, 215, 129, 2, 247, 204, 24, 214,
- 245, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 234, 25, 3, 1, 223, 191,
- 2, 225, 39, 25, 3, 1, 223, 191, 2, 248, 99, 25, 3, 1, 215, 129, 2, 226,
- 50, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 50, 25, 6, 1, 215, 129, 2,
- 214, 101, 25, 6, 1, 215, 129, 2, 232, 37, 25, 6, 1, 215, 129, 2, 214,
- 245, 25, 6, 1, 215, 129, 2, 226, 234, 25, 6, 1, 223, 191, 2, 248, 99, 25,
- 247, 204, 24, 214, 245, 25, 247, 204, 24, 226, 234, 25, 214, 245, 25, 3,
- 1, 227, 68, 2, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2, 212, 210,
- 25, 3, 1, 227, 68, 2, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 226,
- 50, 25, 3, 1, 227, 68, 2, 226, 51, 24, 212, 210, 25, 6, 1, 227, 66, 2,
- 214, 245, 25, 6, 1, 227, 66, 2, 226, 234, 25, 6, 1, 227, 68, 2, 214, 245,
- 25, 6, 1, 227, 68, 2, 226, 234, 25, 6, 1, 227, 68, 2, 225, 51, 25, 226,
- 234, 25, 248, 99, 245, 109, 224, 172, 245, 118, 224, 172, 245, 109, 219,
- 206, 245, 118, 219, 206, 217, 95, 219, 206, 243, 235, 219, 206, 220, 51,
- 219, 206, 244, 81, 219, 206, 225, 27, 219, 206, 217, 123, 219, 206, 242,
- 17, 219, 206, 212, 80, 213, 230, 219, 206, 212, 80, 213, 230, 228, 178,
- 212, 80, 213, 230, 235, 66, 233, 62, 77, 223, 140, 77, 240, 160, 228,
- 179, 240, 160, 244, 81, 248, 101, 245, 109, 248, 101, 245, 118, 248, 101,
- 199, 134, 51, 71, 232, 242, 51, 115, 232, 242, 42, 220, 81, 224, 143, 77,
- 46, 220, 81, 224, 143, 77, 220, 81, 232, 164, 224, 143, 77, 220, 81, 241,
- 149, 224, 143, 77, 42, 51, 224, 143, 77, 46, 51, 224, 143, 77, 51, 232,
- 164, 224, 143, 77, 51, 241, 149, 224, 143, 77, 248, 149, 51, 248, 149,
- 251, 42, 216, 180, 251, 42, 122, 62, 233, 80, 117, 62, 233, 80, 199, 245,
- 120, 240, 158, 225, 144, 232, 243, 221, 57, 226, 143, 221, 57, 233, 62,
- 245, 116, 223, 140, 245, 116, 225, 126, 247, 148, 243, 244, 233, 62, 226,
- 241, 223, 140, 226, 241, 230, 14, 228, 184, 219, 206, 226, 58, 231, 6,
- 52, 226, 58, 217, 201, 217, 101, 52, 225, 71, 51, 225, 71, 216, 169, 225,
- 71, 223, 202, 225, 71, 223, 202, 51, 225, 71, 223, 202, 216, 169, 225,
- 71, 250, 170, 220, 81, 233, 66, 254, 19, 224, 143, 77, 220, 81, 223, 144,
- 254, 19, 224, 143, 77, 224, 0, 77, 51, 244, 254, 77, 235, 198, 226, 243,
- 215, 150, 137, 217, 65, 250, 171, 235, 213, 225, 144, 253, 130, 240, 161,
- 251, 42, 243, 228, 220, 23, 42, 41, 251, 85, 2, 224, 152, 46, 41, 251,
- 85, 2, 224, 152, 51, 224, 158, 77, 224, 158, 244, 254, 77, 244, 254, 224,
- 158, 77, 217, 23, 5, 245, 30, 223, 202, 225, 200, 52, 83, 132, 251, 42,
- 83, 95, 251, 42, 115, 253, 132, 223, 202, 221, 70, 249, 194, 215, 134,
- 117, 253, 131, 254, 67, 214, 165, 249, 156, 230, 251, 52, 218, 179, 248,
- 101, 235, 191, 215, 150, 244, 21, 225, 27, 77, 133, 62, 225, 26, 224,
- 169, 225, 71, 243, 237, 62, 225, 26, 244, 50, 62, 225, 26, 117, 62, 225,
- 26, 243, 237, 62, 77, 246, 72, 249, 70, 216, 179, 71, 243, 237, 247, 72,
- 231, 147, 14, 219, 206, 213, 196, 235, 66, 243, 198, 253, 222, 235, 189,
- 217, 38, 235, 189, 221, 57, 235, 189, 225, 156, 235, 225, 218, 127, 218,
- 196, 254, 166, 218, 127, 218, 196, 235, 225, 12, 243, 245, 221, 3, 254,
- 166, 12, 243, 245, 221, 3, 230, 10, 21, 221, 4, 228, 180, 21, 221, 4,
- 218, 223, 212, 79, 218, 223, 7, 3, 1, 72, 218, 223, 163, 218, 223, 180,
- 218, 223, 189, 218, 223, 198, 218, 223, 195, 218, 223, 200, 218, 223, 94,
- 52, 218, 223, 230, 250, 218, 223, 245, 61, 52, 218, 223, 42, 226, 131,
- 218, 223, 46, 226, 131, 218, 223, 7, 3, 1, 204, 219, 10, 212, 79, 219,
- 10, 116, 219, 10, 109, 219, 10, 166, 219, 10, 163, 219, 10, 180, 219, 10,
- 189, 219, 10, 198, 219, 10, 195, 219, 10, 200, 219, 10, 94, 52, 219, 10,
- 230, 250, 219, 10, 245, 61, 52, 219, 10, 42, 226, 131, 219, 10, 46, 226,
- 131, 7, 219, 10, 3, 1, 61, 7, 219, 10, 3, 1, 74, 7, 219, 10, 3, 1, 75, 7,
- 219, 10, 3, 1, 213, 166, 7, 219, 10, 3, 1, 222, 113, 7, 219, 10, 3, 1,
- 242, 41, 7, 219, 10, 3, 1, 235, 27, 7, 219, 10, 3, 1, 150, 7, 219, 10, 3,
- 1, 183, 7, 219, 10, 3, 1, 204, 7, 219, 10, 3, 1, 226, 229, 7, 219, 10, 3,
- 1, 197, 7, 219, 10, 3, 1, 218, 99, 245, 13, 52, 249, 165, 52, 249, 57,
- 52, 243, 221, 243, 224, 52, 232, 227, 52, 231, 7, 52, 230, 29, 52, 226,
- 38, 52, 223, 29, 52, 213, 204, 52, 156, 220, 229, 52, 247, 81, 52, 245,
- 14, 52, 234, 85, 52, 216, 76, 52, 246, 55, 52, 243, 16, 226, 68, 52, 226,
- 36, 52, 242, 88, 52, 253, 98, 52, 240, 215, 52, 250, 119, 52, 232, 220,
- 216, 216, 52, 219, 188, 52, 217, 198, 52, 235, 238, 223, 29, 52, 37, 42,
- 241, 238, 49, 37, 46, 241, 238, 49, 37, 184, 71, 232, 243, 226, 244, 37,
- 220, 175, 71, 232, 243, 226, 244, 37, 253, 255, 76, 49, 37, 249, 195, 76,
- 49, 37, 42, 76, 49, 37, 46, 76, 49, 37, 223, 131, 226, 244, 37, 249, 195,
- 223, 131, 226, 244, 37, 253, 255, 223, 131, 226, 244, 37, 133, 176, 49,
- 37, 243, 237, 176, 49, 37, 245, 104, 249, 228, 37, 245, 104, 219, 166,
- 37, 245, 104, 247, 200, 37, 245, 104, 249, 229, 252, 97, 37, 42, 46, 76,
- 49, 37, 245, 104, 222, 107, 37, 245, 104, 234, 141, 37, 245, 104, 215,
- 126, 225, 141, 216, 183, 37, 223, 203, 219, 232, 226, 244, 37, 51, 71,
- 219, 45, 226, 244, 37, 254, 9, 87, 37, 216, 169, 215, 152, 37, 213, 232,
- 251, 68, 49, 37, 132, 76, 226, 244, 37, 184, 51, 219, 232, 226, 244, 37,
- 95, 241, 238, 2, 206, 246, 57, 37, 132, 241, 238, 2, 206, 246, 57, 37,
- 42, 76, 55, 37, 46, 76, 55, 37, 253, 133, 49, 254, 171, 227, 97, 254,
- 156, 211, 211, 217, 149, 219, 19, 187, 6, 250, 252, 248, 22, 250, 112,
- 250, 109, 232, 243, 87, 250, 172, 227, 97, 250, 212, 215, 159, 245, 15,
- 249, 130, 222, 104, 248, 22, 244, 147, 113, 3, 243, 177, 113, 6, 242, 41,
- 251, 142, 6, 242, 41, 187, 6, 242, 41, 225, 169, 249, 130, 225, 169, 249,
- 131, 110, 117, 225, 240, 113, 6, 72, 251, 142, 6, 72, 113, 6, 150, 113,
- 3, 150, 233, 171, 54, 252, 60, 87, 187, 6, 204, 228, 52, 52, 219, 218,
- 224, 12, 249, 101, 113, 6, 226, 229, 187, 6, 226, 229, 187, 6, 224, 240,
- 113, 6, 149, 251, 142, 6, 149, 187, 6, 149, 225, 76, 218, 21, 223, 214,
- 221, 53, 77, 217, 210, 52, 216, 210, 152, 52, 214, 217, 187, 6, 212, 152,
- 227, 1, 52, 227, 87, 52, 235, 191, 227, 87, 52, 251, 142, 6, 212, 152,
- 216, 58, 25, 3, 1, 235, 183, 234, 179, 52, 254, 16, 52, 113, 6, 253, 74,
- 251, 142, 6, 250, 252, 245, 33, 87, 113, 3, 74, 113, 6, 74, 113, 6, 244,
- 230, 216, 58, 6, 244, 230, 113, 6, 183, 113, 3, 75, 106, 87, 251, 206,
- 87, 242, 178, 87, 248, 135, 87, 235, 229, 219, 216, 223, 89, 6, 224, 240,
- 244, 150, 52, 187, 3, 225, 240, 187, 3, 243, 83, 187, 6, 243, 83, 187, 6,
- 225, 240, 187, 230, 97, 218, 241, 216, 58, 35, 6, 243, 177, 216, 58, 35,
- 6, 150, 223, 202, 35, 6, 150, 216, 58, 35, 6, 213, 105, 187, 32, 6, 249,
- 3, 187, 32, 3, 249, 3, 187, 32, 3, 74, 187, 32, 3, 72, 187, 32, 3, 235,
- 142, 225, 54, 232, 242, 216, 58, 254, 35, 226, 58, 52, 254, 88, 216, 58,
- 3, 244, 230, 16, 31, 222, 167, 219, 216, 214, 97, 243, 228, 122, 221, 39,
- 214, 97, 243, 228, 122, 229, 25, 214, 97, 243, 228, 122, 217, 194, 214,
- 97, 243, 228, 122, 217, 121, 214, 97, 243, 228, 117, 217, 119, 214, 97,
- 243, 228, 122, 244, 86, 214, 97, 243, 228, 117, 244, 85, 214, 97, 243,
- 228, 133, 244, 85, 214, 97, 243, 228, 243, 237, 244, 85, 214, 97, 243,
- 228, 122, 220, 43, 214, 97, 243, 228, 244, 50, 220, 41, 214, 97, 243,
- 228, 122, 245, 145, 214, 97, 243, 228, 133, 245, 143, 214, 97, 243, 228,
- 244, 50, 245, 143, 214, 97, 243, 228, 221, 43, 245, 143, 243, 228, 228,
- 53, 116, 223, 100, 228, 54, 116, 223, 100, 228, 54, 109, 223, 100, 228,
- 54, 166, 223, 100, 228, 54, 163, 223, 100, 228, 54, 180, 223, 100, 228,
- 54, 189, 223, 100, 228, 54, 198, 223, 100, 228, 54, 195, 223, 100, 228,
- 54, 200, 223, 100, 228, 54, 217, 200, 223, 100, 228, 54, 245, 124, 223,
- 100, 228, 54, 216, 41, 223, 100, 228, 54, 244, 83, 223, 100, 228, 54,
- 122, 240, 200, 223, 100, 228, 54, 244, 50, 240, 200, 223, 100, 228, 54,
- 122, 217, 100, 3, 223, 100, 228, 54, 116, 3, 223, 100, 228, 54, 109, 3,
- 223, 100, 228, 54, 166, 3, 223, 100, 228, 54, 163, 3, 223, 100, 228, 54,
- 180, 3, 223, 100, 228, 54, 189, 3, 223, 100, 228, 54, 198, 3, 223, 100,
- 228, 54, 195, 3, 223, 100, 228, 54, 200, 3, 223, 100, 228, 54, 217, 200,
- 3, 223, 100, 228, 54, 245, 124, 3, 223, 100, 228, 54, 216, 41, 3, 223,
- 100, 228, 54, 244, 83, 3, 223, 100, 228, 54, 122, 240, 200, 3, 223, 100,
- 228, 54, 244, 50, 240, 200, 3, 223, 100, 228, 54, 122, 217, 100, 223,
- 100, 228, 54, 122, 217, 101, 250, 253, 249, 3, 223, 100, 228, 54, 244,
- 50, 217, 100, 223, 100, 228, 54, 217, 201, 217, 100, 223, 100, 228, 54,
- 223, 202, 122, 240, 200, 7, 3, 1, 223, 202, 250, 252, 223, 100, 228, 54,
- 220, 53, 233, 101, 17, 223, 100, 228, 54, 244, 84, 245, 182, 17, 223,
- 100, 228, 54, 244, 84, 217, 100, 223, 100, 228, 54, 122, 240, 201, 217,
- 100, 214, 97, 243, 228, 212, 80, 217, 119, 132, 68, 215, 124, 68, 95, 68,
- 246, 58, 68, 42, 46, 68, 114, 119, 68, 228, 167, 213, 250, 68, 228, 167,
- 245, 176, 68, 219, 215, 245, 176, 68, 219, 215, 213, 250, 68, 132, 76, 2,
- 90, 95, 76, 2, 90, 132, 214, 20, 68, 95, 214, 20, 68, 132, 117, 241, 218,
- 68, 215, 124, 117, 241, 218, 68, 95, 117, 241, 218, 68, 246, 58, 117,
- 241, 218, 68, 132, 76, 2, 218, 27, 95, 76, 2, 218, 27, 132, 76, 243, 213,
- 134, 215, 124, 76, 243, 213, 134, 95, 76, 243, 213, 134, 246, 58, 76,
- 243, 213, 134, 114, 119, 76, 2, 252, 47, 132, 76, 2, 101, 95, 76, 2, 101,
- 132, 76, 2, 232, 177, 95, 76, 2, 232, 177, 42, 46, 214, 20, 68, 42, 46,
- 76, 2, 90, 246, 58, 212, 28, 68, 215, 124, 76, 2, 217, 30, 233, 61, 215,
- 124, 76, 2, 217, 30, 223, 138, 246, 58, 76, 2, 217, 30, 233, 61, 246, 58,
- 76, 2, 217, 30, 223, 138, 95, 76, 2, 249, 100, 246, 57, 246, 58, 76, 2,
- 249, 100, 233, 61, 253, 255, 216, 227, 221, 73, 68, 249, 195, 216, 227,
- 221, 73, 68, 228, 167, 213, 250, 76, 211, 211, 184, 134, 132, 76, 211,
- 211, 252, 60, 110, 95, 76, 211, 211, 134, 253, 255, 227, 40, 249, 229,
- 68, 249, 195, 227, 40, 249, 229, 68, 132, 241, 238, 2, 206, 215, 123,
- 132, 241, 238, 2, 206, 246, 57, 215, 124, 241, 238, 2, 206, 223, 138,
- 215, 124, 241, 238, 2, 206, 233, 61, 95, 241, 238, 2, 206, 215, 123, 95,
- 241, 238, 2, 206, 246, 57, 246, 58, 241, 238, 2, 206, 223, 138, 246, 58,
- 241, 238, 2, 206, 233, 61, 95, 76, 110, 132, 68, 215, 124, 76, 132, 65,
- 246, 58, 68, 132, 76, 110, 95, 68, 132, 226, 197, 253, 162, 215, 124,
- 226, 197, 253, 162, 95, 226, 197, 253, 162, 246, 58, 226, 197, 253, 162,
- 132, 241, 238, 110, 95, 241, 237, 95, 241, 238, 110, 132, 241, 237, 132,
- 51, 76, 2, 90, 42, 46, 51, 76, 2, 90, 95, 51, 76, 2, 90, 132, 51, 68,
- 215, 124, 51, 68, 95, 51, 68, 246, 58, 51, 68, 42, 46, 51, 68, 114, 119,
- 51, 68, 228, 167, 213, 250, 51, 68, 228, 167, 245, 176, 51, 68, 219, 215,
- 245, 176, 51, 68, 219, 215, 213, 250, 51, 68, 132, 216, 169, 68, 95, 216,
- 169, 68, 132, 219, 162, 68, 95, 219, 162, 68, 215, 124, 76, 2, 51, 90,
- 246, 58, 76, 2, 51, 90, 132, 248, 100, 68, 215, 124, 248, 100, 68, 95,
- 248, 100, 68, 246, 58, 248, 100, 68, 132, 76, 211, 211, 134, 95, 76, 211,
- 211, 134, 132, 67, 68, 215, 124, 67, 68, 95, 67, 68, 246, 58, 67, 68,
- 215, 124, 67, 76, 243, 213, 134, 215, 124, 67, 76, 227, 63, 226, 89, 215,
- 124, 67, 76, 227, 63, 226, 90, 2, 199, 134, 215, 124, 67, 76, 227, 63,
- 226, 90, 2, 71, 134, 215, 124, 67, 51, 68, 215, 124, 67, 51, 76, 227, 63,
- 226, 89, 95, 67, 76, 243, 213, 214, 40, 228, 167, 213, 250, 76, 211, 211,
- 249, 99, 219, 215, 245, 176, 76, 211, 211, 249, 99, 114, 119, 67, 68, 46,
- 76, 2, 3, 249, 228, 246, 58, 76, 132, 65, 215, 124, 68, 133, 95, 253,
- 162, 132, 76, 2, 71, 90, 95, 76, 2, 71, 90, 42, 46, 76, 2, 71, 90, 132,
- 76, 2, 51, 71, 90, 95, 76, 2, 51, 71, 90, 42, 46, 76, 2, 51, 71, 90, 132,
- 227, 38, 68, 95, 227, 38, 68, 42, 46, 227, 38, 68, 31, 254, 63, 249, 153,
- 226, 125, 247, 185, 217, 140, 244, 250, 217, 140, 247, 92, 228, 163, 244,
- 251, 245, 110, 221, 48, 235, 241, 230, 39, 245, 127, 227, 97, 228, 163,
- 254, 33, 245, 127, 227, 97, 3, 245, 127, 227, 97, 249, 125, 253, 153,
- 231, 126, 247, 92, 228, 163, 249, 127, 253, 153, 231, 126, 3, 249, 125,
- 253, 153, 231, 126, 245, 101, 65, 225, 56, 230, 97, 225, 63, 230, 97,
- 249, 104, 230, 97, 218, 241, 230, 251, 52, 230, 249, 52, 62, 225, 156,
- 247, 121, 220, 23, 221, 49, 230, 250, 253, 133, 227, 33, 223, 131, 227,
- 33, 251, 43, 227, 33, 41, 223, 95, 249, 50, 223, 95, 243, 230, 223, 95,
- 225, 52, 108, 235, 231, 46, 254, 18, 254, 18, 231, 153, 254, 18, 219,
- 187, 254, 18, 247, 123, 247, 92, 228, 163, 247, 126, 226, 136, 108, 228,
- 163, 226, 136, 108, 232, 199, 254, 27, 232, 199, 227, 24, 235, 195, 215,
- 146, 235, 208, 51, 235, 208, 216, 169, 235, 208, 249, 121, 235, 208, 218,
- 213, 235, 208, 214, 110, 235, 208, 249, 195, 235, 208, 249, 195, 249,
- 121, 235, 208, 253, 255, 249, 121, 235, 208, 217, 139, 251, 243, 224, 29,
- 225, 53, 62, 230, 250, 245, 0, 243, 22, 225, 53, 241, 43, 217, 43, 227,
- 33, 223, 202, 217, 42, 235, 191, 233, 89, 197, 220, 83, 214, 19, 213,
- 188, 225, 63, 228, 163, 217, 42, 230, 251, 217, 42, 253, 126, 123, 108,
- 228, 163, 253, 126, 123, 108, 253, 218, 123, 108, 253, 218, 251, 17, 228,
- 163, 254, 165, 123, 108, 229, 181, 253, 218, 228, 170, 254, 165, 123,
- 108, 254, 57, 123, 108, 228, 163, 254, 57, 123, 108, 254, 57, 123, 167,
- 123, 108, 216, 169, 217, 42, 254, 64, 123, 108, 245, 57, 108, 243, 21,
- 245, 57, 108, 247, 186, 251, 200, 253, 220, 217, 149, 232, 250, 243, 21,
- 123, 108, 253, 218, 123, 211, 211, 167, 217, 149, 236, 10, 227, 97, 236,
- 10, 65, 167, 253, 218, 123, 108, 249, 165, 245, 60, 245, 61, 249, 164,
- 223, 131, 235, 252, 123, 108, 223, 131, 123, 108, 249, 93, 108, 245, 32,
- 245, 59, 108, 219, 96, 245, 60, 248, 6, 123, 108, 123, 211, 211, 251, 7,
- 248, 23, 231, 153, 251, 6, 224, 156, 123, 108, 228, 163, 123, 108, 240,
- 97, 108, 228, 163, 240, 97, 108, 219, 49, 245, 57, 108, 233, 39, 167,
- 123, 108, 242, 107, 167, 123, 108, 233, 39, 110, 123, 108, 242, 107, 110,
- 123, 108, 233, 39, 251, 17, 228, 163, 123, 108, 242, 107, 251, 17, 228,
- 163, 123, 108, 230, 167, 233, 38, 230, 167, 242, 106, 251, 200, 228, 163,
- 245, 57, 108, 228, 163, 233, 38, 228, 163, 242, 106, 229, 181, 233, 39,
- 228, 170, 123, 108, 229, 181, 242, 107, 228, 170, 123, 108, 233, 39, 167,
- 245, 57, 108, 242, 107, 167, 245, 57, 108, 229, 181, 233, 39, 228, 170,
- 245, 57, 108, 229, 181, 242, 107, 228, 170, 245, 57, 108, 233, 39, 167,
- 242, 106, 242, 107, 167, 233, 38, 229, 181, 233, 39, 228, 170, 242, 106,
- 229, 181, 242, 107, 228, 170, 233, 38, 225, 82, 219, 0, 225, 83, 167,
- 123, 108, 219, 1, 167, 123, 108, 225, 83, 167, 245, 57, 108, 219, 1, 167,
- 245, 57, 108, 247, 92, 228, 163, 225, 85, 247, 92, 228, 163, 219, 2, 219,
- 9, 227, 97, 218, 222, 227, 97, 228, 163, 118, 219, 9, 227, 97, 228, 163,
- 118, 218, 222, 227, 97, 219, 9, 65, 167, 123, 108, 218, 222, 65, 167,
- 123, 108, 229, 181, 118, 219, 9, 65, 228, 170, 123, 108, 229, 181, 118,
- 218, 222, 65, 228, 170, 123, 108, 219, 9, 65, 2, 228, 163, 123, 108, 218,
- 222, 65, 2, 228, 163, 123, 108, 230, 151, 230, 152, 230, 153, 230, 152,
- 215, 146, 41, 236, 10, 227, 97, 41, 227, 17, 227, 97, 41, 236, 10, 65,
- 167, 123, 108, 41, 227, 17, 65, 167, 123, 108, 41, 250, 183, 41, 249, 43,
- 36, 225, 156, 36, 230, 250, 36, 217, 38, 36, 247, 121, 220, 23, 36, 62,
- 227, 33, 36, 223, 131, 227, 33, 36, 253, 133, 227, 33, 36, 245, 60, 36,
- 248, 101, 91, 225, 156, 91, 230, 250, 91, 217, 38, 91, 62, 227, 33, 46,
- 218, 36, 42, 218, 36, 119, 218, 36, 114, 218, 36, 253, 136, 230, 226,
- 216, 149, 243, 250, 216, 169, 71, 252, 60, 46, 216, 57, 51, 71, 252, 60,
- 51, 46, 216, 57, 247, 92, 228, 163, 225, 48, 228, 163, 216, 149, 247, 92,
- 228, 163, 243, 251, 229, 183, 51, 71, 252, 60, 51, 46, 216, 57, 225, 83,
- 215, 154, 223, 241, 219, 1, 215, 154, 223, 241, 228, 168, 219, 22, 227,
- 97, 249, 125, 253, 153, 228, 168, 219, 21, 228, 168, 219, 22, 65, 167,
- 123, 108, 249, 125, 253, 153, 228, 168, 219, 22, 167, 123, 108, 227, 17,
- 227, 97, 236, 10, 227, 97, 230, 157, 241, 185, 249, 136, 231, 200, 235,
- 205, 213, 133, 230, 22, 228, 169, 46, 254, 19, 2, 253, 195, 46, 216, 183,
- 230, 97, 232, 199, 254, 27, 230, 97, 232, 199, 227, 24, 230, 97, 235,
- 195, 230, 97, 215, 146, 247, 201, 227, 33, 62, 227, 33, 219, 96, 227, 33,
- 247, 121, 217, 38, 251, 90, 42, 228, 168, 244, 149, 221, 69, 225, 63, 46,
- 228, 168, 244, 149, 221, 69, 225, 63, 42, 221, 69, 225, 63, 46, 221, 69,
- 225, 63, 223, 202, 217, 43, 245, 60, 249, 40, 232, 199, 227, 24, 249, 40,
- 232, 199, 254, 27, 51, 219, 8, 51, 218, 221, 51, 235, 195, 51, 215, 146,
- 225, 179, 123, 24, 226, 136, 108, 233, 39, 2, 247, 74, 242, 107, 2, 247,
- 74, 214, 164, 230, 167, 233, 38, 214, 164, 230, 167, 242, 106, 233, 39,
- 123, 211, 211, 167, 242, 106, 242, 107, 123, 211, 211, 167, 233, 38, 123,
- 211, 211, 167, 233, 38, 123, 211, 211, 167, 242, 106, 123, 211, 211, 167,
- 225, 82, 123, 211, 211, 167, 219, 0, 247, 92, 228, 163, 225, 86, 167,
- 245, 62, 247, 92, 228, 163, 219, 3, 167, 245, 62, 228, 163, 41, 236, 10,
- 65, 167, 123, 108, 228, 163, 41, 227, 17, 65, 167, 123, 108, 41, 236, 10,
- 65, 167, 228, 163, 123, 108, 41, 227, 17, 65, 167, 228, 163, 123, 108,
- 233, 39, 251, 17, 228, 163, 245, 57, 108, 242, 107, 251, 17, 228, 163,
- 245, 57, 108, 225, 83, 251, 17, 228, 163, 245, 57, 108, 219, 1, 251, 17,
- 228, 163, 245, 57, 108, 228, 163, 228, 168, 219, 22, 227, 97, 247, 92,
- 228, 163, 249, 127, 253, 153, 228, 168, 219, 21, 228, 163, 228, 168, 219,
- 22, 65, 167, 123, 108, 247, 92, 228, 163, 249, 127, 253, 153, 228, 168,
- 219, 22, 167, 245, 62, 71, 245, 120, 231, 35, 199, 245, 120, 114, 46,
- 247, 207, 245, 120, 119, 46, 247, 207, 245, 120, 245, 127, 65, 2, 184,
- 199, 90, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90,
- 3, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, 245,
- 127, 65, 2, 62, 49, 245, 127, 65, 2, 226, 247, 3, 245, 127, 65, 2, 226,
- 247, 245, 127, 65, 2, 215, 153, 245, 127, 65, 2, 117, 199, 219, 32, 249,
- 125, 2, 184, 199, 90, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65,
- 199, 90, 3, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90,
- 249, 125, 2, 226, 247, 3, 249, 125, 2, 226, 247, 212, 153, 174, 252, 91,
- 231, 125, 247, 202, 52, 245, 129, 68, 240, 221, 114, 253, 164, 119, 253,
- 164, 225, 59, 226, 41, 214, 16, 232, 242, 42, 250, 115, 46, 250, 115, 42,
- 244, 26, 46, 244, 26, 251, 101, 46, 249, 72, 251, 101, 42, 249, 72, 216,
- 227, 46, 249, 72, 216, 227, 42, 249, 72, 223, 202, 228, 163, 52, 41, 232,
- 159, 253, 195, 222, 83, 222, 90, 217, 210, 224, 13, 225, 121, 235, 235,
- 214, 145, 219, 166, 225, 173, 65, 235, 204, 52, 216, 58, 228, 163, 52,
- 214, 26, 240, 223, 216, 227, 42, 249, 99, 216, 227, 46, 249, 99, 251,
- 101, 42, 249, 99, 251, 101, 46, 249, 99, 216, 227, 151, 235, 208, 251,
- 101, 151, 235, 208, 243, 210, 220, 3, 114, 253, 165, 251, 201, 117, 199,
- 252, 49, 227, 26, 234, 144, 245, 53, 211, 211, 217, 149, 223, 148, 213,
- 167, 235, 252, 118, 224, 10, 251, 89, 234, 143, 233, 66, 254, 19, 125,
- 223, 144, 254, 19, 125, 245, 53, 211, 211, 217, 149, 233, 70, 251, 212,
- 223, 130, 249, 13, 254, 64, 253, 172, 218, 126, 216, 217, 223, 34, 247,
- 167, 227, 18, 249, 138, 218, 3, 220, 14, 249, 90, 249, 89, 194, 196, 16,
- 240, 143, 194, 196, 16, 219, 160, 224, 172, 194, 196, 16, 224, 173, 245,
- 62, 194, 196, 16, 224, 173, 247, 126, 194, 196, 16, 224, 173, 247, 200,
- 194, 196, 16, 224, 173, 235, 59, 194, 196, 16, 224, 173, 249, 228, 194,
- 196, 16, 249, 229, 219, 75, 194, 196, 16, 249, 229, 235, 59, 194, 196,
- 16, 220, 24, 134, 194, 196, 16, 252, 98, 134, 194, 196, 16, 224, 173,
- 220, 23, 194, 196, 16, 224, 173, 252, 97, 194, 196, 16, 224, 173, 233,
- 38, 194, 196, 16, 224, 173, 242, 106, 194, 196, 16, 132, 214, 251, 194,
- 196, 16, 95, 214, 251, 194, 196, 16, 224, 173, 132, 68, 194, 196, 16,
- 224, 173, 95, 68, 194, 196, 16, 249, 229, 252, 97, 194, 196, 16, 119,
- 218, 37, 215, 153, 194, 196, 16, 248, 6, 219, 75, 194, 196, 16, 224, 173,
- 119, 250, 170, 194, 196, 16, 224, 173, 248, 5, 194, 196, 16, 119, 218,
- 37, 235, 59, 194, 196, 16, 215, 124, 214, 251, 194, 196, 16, 224, 173,
- 215, 124, 68, 194, 196, 16, 114, 218, 37, 226, 247, 194, 196, 16, 248,
- 17, 219, 75, 194, 196, 16, 224, 173, 114, 250, 170, 194, 196, 16, 224,
- 173, 248, 16, 194, 196, 16, 114, 218, 37, 235, 59, 194, 196, 16, 246, 58,
- 214, 251, 194, 196, 16, 224, 173, 246, 58, 68, 194, 196, 16, 224, 142,
- 215, 153, 194, 196, 16, 248, 6, 215, 153, 194, 196, 16, 247, 201, 215,
- 153, 194, 196, 16, 235, 60, 215, 153, 194, 196, 16, 249, 229, 215, 153,
- 194, 196, 16, 114, 220, 185, 235, 59, 194, 196, 16, 224, 142, 224, 172,
- 194, 196, 16, 249, 229, 219, 95, 194, 196, 16, 224, 173, 249, 164, 194,
- 196, 16, 114, 218, 37, 247, 209, 194, 196, 16, 248, 17, 247, 209, 194,
- 196, 16, 219, 96, 247, 209, 194, 196, 16, 235, 60, 247, 209, 194, 196,
- 16, 249, 229, 247, 209, 194, 196, 16, 119, 220, 185, 219, 75, 194, 196,
- 16, 42, 220, 185, 219, 75, 194, 196, 16, 217, 43, 247, 209, 194, 196, 16,
- 242, 107, 247, 209, 194, 196, 16, 249, 158, 134, 194, 196, 16, 248, 17,
- 217, 42, 194, 196, 16, 212, 27, 194, 196, 16, 219, 76, 217, 42, 194, 196,
- 16, 221, 71, 215, 153, 194, 196, 16, 224, 173, 228, 163, 245, 62, 194,
- 196, 16, 224, 173, 224, 157, 194, 196, 16, 119, 250, 171, 217, 42, 194,
- 196, 16, 114, 250, 171, 217, 42, 194, 196, 16, 235, 183, 194, 196, 16,
- 223, 190, 194, 196, 16, 227, 67, 194, 196, 16, 254, 53, 215, 153, 194,
- 196, 16, 245, 64, 215, 153, 194, 196, 16, 235, 184, 215, 153, 194, 196,
- 16, 227, 68, 215, 153, 194, 196, 16, 254, 52, 228, 163, 250, 66, 77, 46,
- 254, 19, 2, 246, 58, 212, 28, 68, 220, 159, 227, 40, 251, 89, 251, 222,
- 87, 71, 232, 243, 2, 231, 37, 247, 74, 235, 213, 87, 249, 122, 215, 151,
- 87, 247, 141, 215, 151, 87, 245, 112, 87, 249, 149, 87, 67, 41, 2, 250,
- 109, 71, 232, 242, 245, 89, 87, 254, 48, 234, 145, 87, 241, 197, 87, 36,
- 199, 252, 60, 2, 228, 161, 36, 216, 184, 246, 60, 251, 63, 249, 229, 2,
- 228, 165, 68, 215, 149, 87, 230, 207, 87, 240, 156, 87, 227, 39, 242, 40,
- 87, 227, 39, 233, 169, 87, 226, 117, 87, 226, 116, 87, 247, 149, 249, 38,
- 16, 243, 245, 109, 219, 234, 87, 194, 196, 16, 224, 172, 248, 34, 221,
- 58, 234, 145, 87, 225, 73, 226, 200, 229, 164, 226, 200, 225, 69, 222,
- 108, 87, 249, 210, 222, 108, 87, 42, 226, 132, 215, 131, 101, 42, 226,
- 132, 244, 245, 42, 226, 132, 232, 163, 101, 46, 226, 132, 215, 131, 101,
- 46, 226, 132, 244, 245, 46, 226, 132, 232, 163, 101, 42, 41, 251, 85,
- 215, 131, 249, 99, 42, 41, 251, 85, 244, 245, 42, 41, 251, 85, 232, 163,
- 249, 99, 46, 41, 251, 85, 215, 131, 249, 99, 46, 41, 251, 85, 244, 245,
- 46, 41, 251, 85, 232, 163, 249, 99, 42, 249, 40, 251, 85, 215, 131, 101,
- 42, 249, 40, 251, 85, 231, 37, 225, 233, 42, 249, 40, 251, 85, 232, 163,
- 101, 249, 40, 251, 85, 244, 245, 46, 249, 40, 251, 85, 215, 131, 101, 46,
- 249, 40, 251, 85, 231, 37, 225, 233, 46, 249, 40, 251, 85, 232, 163, 101,
- 235, 209, 244, 245, 199, 232, 243, 244, 245, 215, 131, 42, 167, 232, 163,
- 46, 249, 40, 251, 85, 222, 91, 215, 131, 46, 167, 232, 163, 42, 249, 40,
- 251, 85, 222, 91, 218, 242, 216, 226, 218, 242, 251, 100, 216, 227, 41,
- 125, 251, 101, 41, 125, 251, 101, 41, 251, 85, 110, 216, 227, 41, 125,
- 34, 16, 251, 100, 42, 71, 92, 232, 242, 46, 71, 92, 232, 242, 199, 222,
- 123, 232, 241, 199, 222, 123, 232, 240, 199, 222, 123, 232, 239, 199,
- 222, 123, 232, 238, 247, 253, 16, 177, 71, 24, 216, 227, 223, 148, 247,
- 253, 16, 177, 71, 24, 251, 101, 223, 148, 247, 253, 16, 177, 71, 2, 249,
- 228, 247, 253, 16, 177, 119, 24, 199, 2, 249, 228, 247, 253, 16, 177,
- 114, 24, 199, 2, 249, 228, 247, 253, 16, 177, 71, 2, 216, 183, 247, 253,
- 16, 177, 119, 24, 199, 2, 216, 183, 247, 253, 16, 177, 114, 24, 199, 2,
- 216, 183, 247, 253, 16, 177, 71, 24, 214, 19, 247, 253, 16, 177, 119, 24,
- 199, 2, 214, 19, 247, 253, 16, 177, 114, 24, 199, 2, 214, 19, 247, 253,
- 16, 177, 119, 24, 241, 31, 247, 253, 16, 177, 114, 24, 241, 31, 247, 253,
- 16, 177, 71, 24, 216, 227, 233, 70, 247, 253, 16, 177, 71, 24, 251, 101,
- 233, 70, 41, 244, 1, 223, 206, 87, 245, 139, 87, 71, 232, 243, 244, 245,
- 231, 100, 251, 74, 231, 100, 184, 110, 220, 174, 231, 100, 220, 175, 110,
- 232, 190, 231, 100, 184, 110, 117, 220, 161, 231, 100, 117, 220, 162,
- 110, 232, 190, 231, 100, 117, 220, 162, 235, 67, 231, 100, 216, 166, 231,
- 100, 217, 176, 231, 100, 226, 63, 245, 180, 242, 100, 243, 191, 216, 227,
- 226, 131, 251, 101, 226, 131, 216, 227, 249, 40, 125, 251, 101, 249, 40,
- 125, 216, 227, 216, 219, 220, 233, 125, 251, 101, 216, 219, 220, 233,
- 125, 67, 216, 197, 251, 212, 223, 131, 2, 249, 228, 219, 60, 244, 33,
- 254, 177, 249, 37, 245, 128, 235, 195, 248, 34, 244, 247, 87, 83, 223,
- 144, 51, 216, 183, 83, 233, 66, 51, 216, 183, 83, 215, 133, 51, 216, 183,
- 83, 246, 59, 51, 216, 183, 83, 223, 144, 51, 216, 184, 2, 71, 134, 83,
- 233, 66, 51, 216, 184, 2, 71, 134, 83, 223, 144, 216, 184, 2, 51, 71,
- 134, 254, 81, 249, 196, 219, 66, 217, 39, 249, 196, 240, 224, 2, 244, 19,
- 222, 157, 16, 31, 228, 58, 16, 31, 219, 91, 65, 241, 217, 16, 31, 219,
- 91, 65, 217, 165, 16, 31, 245, 101, 65, 217, 165, 16, 31, 245, 101, 65,
- 216, 200, 16, 31, 245, 91, 16, 31, 254, 168, 16, 31, 251, 221, 16, 31,
- 252, 96, 16, 31, 199, 218, 38, 16, 31, 232, 243, 244, 114, 16, 31, 71,
- 218, 38, 16, 31, 243, 245, 244, 114, 16, 31, 250, 162, 223, 205, 16, 31,
- 220, 208, 226, 254, 16, 31, 220, 208, 235, 251, 16, 31, 248, 97, 232,
- 233, 245, 42, 16, 31, 247, 238, 249, 117, 116, 16, 31, 247, 238, 249,
- 117, 109, 16, 31, 247, 238, 249, 117, 166, 16, 31, 247, 238, 249, 117,
- 163, 16, 31, 146, 254, 168, 16, 31, 218, 123, 236, 57, 16, 31, 245, 101,
- 65, 216, 201, 251, 136, 16, 31, 250, 193, 16, 31, 245, 101, 65, 231, 146,
- 16, 31, 219, 6, 16, 31, 245, 42, 16, 31, 244, 76, 221, 57, 16, 31, 242,
- 99, 221, 57, 16, 31, 224, 14, 221, 57, 16, 31, 215, 145, 221, 57, 16, 31,
- 219, 206, 16, 31, 248, 14, 251, 139, 87, 227, 40, 251, 89, 16, 31, 229,
- 167, 16, 31, 248, 15, 243, 245, 109, 16, 31, 219, 7, 243, 245, 109, 227,
- 105, 101, 227, 105, 250, 87, 227, 105, 243, 248, 227, 105, 235, 191, 243,
- 248, 227, 105, 251, 219, 251, 53, 227, 105, 251, 96, 217, 65, 227, 105,
- 251, 82, 252, 65, 240, 96, 227, 105, 254, 36, 65, 250, 65, 227, 105, 248,
- 101, 227, 105, 249, 29, 254, 171, 228, 56, 227, 105, 51, 252, 97, 36, 21,
- 116, 36, 21, 109, 36, 21, 166, 36, 21, 163, 36, 21, 180, 36, 21, 189, 36,
- 21, 198, 36, 21, 195, 36, 21, 200, 36, 50, 217, 200, 36, 50, 245, 124,
- 36, 50, 216, 41, 36, 50, 217, 117, 36, 50, 243, 231, 36, 50, 244, 87, 36,
- 50, 220, 47, 36, 50, 221, 40, 36, 50, 245, 147, 36, 50, 229, 28, 36, 50,
- 216, 38, 86, 21, 116, 86, 21, 109, 86, 21, 166, 86, 21, 163, 86, 21, 180,
- 86, 21, 189, 86, 21, 198, 86, 21, 195, 86, 21, 200, 86, 50, 217, 200, 86,
- 50, 245, 124, 86, 50, 216, 41, 86, 50, 217, 117, 86, 50, 243, 231, 86,
- 50, 244, 87, 86, 50, 220, 47, 86, 50, 221, 40, 86, 50, 245, 147, 86, 50,
- 229, 28, 86, 50, 216, 38, 21, 122, 243, 200, 219, 69, 21, 117, 243, 200,
- 219, 69, 21, 133, 243, 200, 219, 69, 21, 243, 237, 243, 200, 219, 69, 21,
- 244, 50, 243, 200, 219, 69, 21, 220, 53, 243, 200, 219, 69, 21, 221, 43,
- 243, 200, 219, 69, 21, 245, 150, 243, 200, 219, 69, 21, 229, 31, 243,
- 200, 219, 69, 50, 217, 201, 243, 200, 219, 69, 50, 245, 125, 243, 200,
- 219, 69, 50, 216, 42, 243, 200, 219, 69, 50, 217, 118, 243, 200, 219, 69,
- 50, 243, 232, 243, 200, 219, 69, 50, 244, 88, 243, 200, 219, 69, 50, 220,
- 48, 243, 200, 219, 69, 50, 221, 41, 243, 200, 219, 69, 50, 245, 148, 243,
- 200, 219, 69, 50, 229, 29, 243, 200, 219, 69, 50, 216, 39, 243, 200, 219,
- 69, 86, 7, 3, 1, 61, 86, 7, 3, 1, 253, 74, 86, 7, 3, 1, 250, 252, 86, 7,
- 3, 1, 249, 3, 86, 7, 3, 1, 74, 86, 7, 3, 1, 244, 230, 86, 7, 3, 1, 243,
- 177, 86, 7, 3, 1, 242, 41, 86, 7, 3, 1, 72, 86, 7, 3, 1, 235, 142, 86, 7,
- 3, 1, 235, 27, 86, 7, 3, 1, 150, 86, 7, 3, 1, 183, 86, 7, 3, 1, 204, 86,
- 7, 3, 1, 75, 86, 7, 3, 1, 226, 229, 86, 7, 3, 1, 224, 240, 86, 7, 3, 1,
- 149, 86, 7, 3, 1, 197, 86, 7, 3, 1, 218, 99, 86, 7, 3, 1, 69, 86, 7, 3,
- 1, 215, 79, 86, 7, 3, 1, 214, 82, 86, 7, 3, 1, 213, 166, 86, 7, 3, 1,
- 213, 105, 86, 7, 3, 1, 212, 152, 36, 7, 6, 1, 61, 36, 7, 6, 1, 253, 74,
- 36, 7, 6, 1, 250, 252, 36, 7, 6, 1, 249, 3, 36, 7, 6, 1, 74, 36, 7, 6, 1,
- 244, 230, 36, 7, 6, 1, 243, 177, 36, 7, 6, 1, 242, 41, 36, 7, 6, 1, 72,
- 36, 7, 6, 1, 235, 142, 36, 7, 6, 1, 235, 27, 36, 7, 6, 1, 150, 36, 7, 6,
- 1, 183, 36, 7, 6, 1, 204, 36, 7, 6, 1, 75, 36, 7, 6, 1, 226, 229, 36, 7,
- 6, 1, 224, 240, 36, 7, 6, 1, 149, 36, 7, 6, 1, 197, 36, 7, 6, 1, 218, 99,
- 36, 7, 6, 1, 69, 36, 7, 6, 1, 215, 79, 36, 7, 6, 1, 214, 82, 36, 7, 6, 1,
- 213, 166, 36, 7, 6, 1, 213, 105, 36, 7, 6, 1, 212, 152, 36, 7, 3, 1, 61,
- 36, 7, 3, 1, 253, 74, 36, 7, 3, 1, 250, 252, 36, 7, 3, 1, 249, 3, 36, 7,
- 3, 1, 74, 36, 7, 3, 1, 244, 230, 36, 7, 3, 1, 243, 177, 36, 7, 3, 1, 242,
- 41, 36, 7, 3, 1, 72, 36, 7, 3, 1, 235, 142, 36, 7, 3, 1, 235, 27, 36, 7,
- 3, 1, 150, 36, 7, 3, 1, 183, 36, 7, 3, 1, 204, 36, 7, 3, 1, 75, 36, 7, 3,
- 1, 226, 229, 36, 7, 3, 1, 224, 240, 36, 7, 3, 1, 149, 36, 7, 3, 1, 197,
- 36, 7, 3, 1, 218, 99, 36, 7, 3, 1, 69, 36, 7, 3, 1, 215, 79, 36, 7, 3, 1,
- 214, 82, 36, 7, 3, 1, 213, 166, 36, 7, 3, 1, 213, 105, 36, 7, 3, 1, 212,
- 152, 36, 21, 212, 79, 146, 36, 50, 245, 124, 146, 36, 50, 216, 41, 146,
- 36, 50, 217, 117, 146, 36, 50, 243, 231, 146, 36, 50, 244, 87, 146, 36,
- 50, 220, 47, 146, 36, 50, 221, 40, 146, 36, 50, 245, 147, 146, 36, 50,
- 229, 28, 146, 36, 50, 216, 38, 51, 36, 21, 116, 51, 36, 21, 109, 51, 36,
- 21, 166, 51, 36, 21, 163, 51, 36, 21, 180, 51, 36, 21, 189, 51, 36, 21,
- 198, 51, 36, 21, 195, 51, 36, 21, 200, 51, 36, 50, 217, 200, 146, 36, 21,
- 212, 79, 92, 96, 177, 241, 31, 92, 96, 107, 241, 31, 92, 96, 177, 214,
- 216, 92, 96, 107, 214, 216, 92, 96, 177, 216, 169, 248, 102, 241, 31, 92,
- 96, 107, 216, 169, 248, 102, 241, 31, 92, 96, 177, 216, 169, 248, 102,
- 214, 216, 92, 96, 107, 216, 169, 248, 102, 214, 216, 92, 96, 177, 224,
- 169, 248, 102, 241, 31, 92, 96, 107, 224, 169, 248, 102, 241, 31, 92, 96,
- 177, 224, 169, 248, 102, 214, 216, 92, 96, 107, 224, 169, 248, 102, 214,
- 216, 92, 96, 177, 119, 24, 223, 148, 92, 96, 119, 177, 24, 46, 241, 205,
- 92, 96, 119, 107, 24, 46, 233, 2, 92, 96, 107, 119, 24, 223, 148, 92, 96,
- 177, 119, 24, 233, 70, 92, 96, 119, 177, 24, 42, 241, 205, 92, 96, 119,
- 107, 24, 42, 233, 2, 92, 96, 107, 119, 24, 233, 70, 92, 96, 177, 114, 24,
- 223, 148, 92, 96, 114, 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46,
- 233, 2, 92, 96, 107, 114, 24, 223, 148, 92, 96, 177, 114, 24, 233, 70,
- 92, 96, 114, 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 233, 2, 92,
- 96, 107, 114, 24, 233, 70, 92, 96, 177, 71, 24, 223, 148, 92, 96, 71,
- 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46, 119, 233, 2, 92, 96,
- 119, 107, 24, 46, 114, 233, 2, 92, 96, 71, 107, 24, 46, 233, 2, 92, 96,
- 119, 177, 24, 46, 114, 241, 205, 92, 96, 114, 177, 24, 46, 119, 241, 205,
- 92, 96, 107, 71, 24, 223, 148, 92, 96, 177, 71, 24, 233, 70, 92, 96, 71,
- 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 119, 233, 2, 92, 96,
- 119, 107, 24, 42, 114, 233, 2, 92, 96, 71, 107, 24, 42, 233, 2, 92, 96,
- 119, 177, 24, 42, 114, 241, 205, 92, 96, 114, 177, 24, 42, 119, 241, 205,
- 92, 96, 107, 71, 24, 233, 70, 92, 96, 177, 119, 24, 241, 31, 92, 96, 42,
- 107, 24, 46, 119, 233, 2, 92, 96, 46, 107, 24, 42, 119, 233, 2, 92, 96,
- 119, 177, 24, 199, 241, 205, 92, 96, 119, 107, 24, 199, 233, 2, 92, 96,
- 46, 177, 24, 42, 119, 241, 205, 92, 96, 42, 177, 24, 46, 119, 241, 205,
- 92, 96, 107, 119, 24, 241, 31, 92, 96, 177, 114, 24, 241, 31, 92, 96, 42,
- 107, 24, 46, 114, 233, 2, 92, 96, 46, 107, 24, 42, 114, 233, 2, 92, 96,
- 114, 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 199, 233, 2, 92, 96,
- 46, 177, 24, 42, 114, 241, 205, 92, 96, 42, 177, 24, 46, 114, 241, 205,
- 92, 96, 107, 114, 24, 241, 31, 92, 96, 177, 71, 24, 241, 31, 92, 96, 42,
- 107, 24, 46, 71, 233, 2, 92, 96, 46, 107, 24, 42, 71, 233, 2, 92, 96, 71,
- 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 119, 199, 233, 2, 92, 96,
- 119, 107, 24, 114, 199, 233, 2, 92, 96, 71, 107, 24, 199, 233, 2, 92, 96,
- 42, 114, 107, 24, 46, 119, 233, 2, 92, 96, 46, 114, 107, 24, 42, 119,
- 233, 2, 92, 96, 42, 119, 107, 24, 46, 114, 233, 2, 92, 96, 46, 119, 107,
- 24, 42, 114, 233, 2, 92, 96, 119, 177, 24, 114, 199, 241, 205, 92, 96,
- 114, 177, 24, 119, 199, 241, 205, 92, 96, 46, 177, 24, 42, 71, 241, 205,
- 92, 96, 42, 177, 24, 46, 71, 241, 205, 92, 96, 107, 71, 24, 241, 31, 92,
- 96, 177, 51, 248, 102, 241, 31, 92, 96, 107, 51, 248, 102, 241, 31, 92,
- 96, 177, 51, 248, 102, 214, 216, 92, 96, 107, 51, 248, 102, 214, 216, 92,
- 96, 51, 241, 31, 92, 96, 51, 214, 216, 92, 96, 119, 220, 81, 24, 46, 246,
- 67, 92, 96, 119, 51, 24, 46, 220, 80, 92, 96, 51, 119, 24, 223, 148, 92,
- 96, 119, 220, 81, 24, 42, 246, 67, 92, 96, 119, 51, 24, 42, 220, 80, 92,
- 96, 51, 119, 24, 233, 70, 92, 96, 114, 220, 81, 24, 46, 246, 67, 92, 96,
- 114, 51, 24, 46, 220, 80, 92, 96, 51, 114, 24, 223, 148, 92, 96, 114,
- 220, 81, 24, 42, 246, 67, 92, 96, 114, 51, 24, 42, 220, 80, 92, 96, 51,
- 114, 24, 233, 70, 92, 96, 71, 220, 81, 24, 46, 246, 67, 92, 96, 71, 51,
- 24, 46, 220, 80, 92, 96, 51, 71, 24, 223, 148, 92, 96, 71, 220, 81, 24,
- 42, 246, 67, 92, 96, 71, 51, 24, 42, 220, 80, 92, 96, 51, 71, 24, 233,
- 70, 92, 96, 119, 220, 81, 24, 199, 246, 67, 92, 96, 119, 51, 24, 199,
- 220, 80, 92, 96, 51, 119, 24, 241, 31, 92, 96, 114, 220, 81, 24, 199,
- 246, 67, 92, 96, 114, 51, 24, 199, 220, 80, 92, 96, 51, 114, 24, 241, 31,
- 92, 96, 71, 220, 81, 24, 199, 246, 67, 92, 96, 71, 51, 24, 199, 220, 80,
- 92, 96, 51, 71, 24, 241, 31, 92, 96, 177, 253, 196, 119, 24, 223, 148,
- 92, 96, 177, 253, 196, 119, 24, 233, 70, 92, 96, 177, 253, 196, 114, 24,
- 233, 70, 92, 96, 177, 253, 196, 114, 24, 223, 148, 92, 96, 177, 247, 207,
- 215, 131, 46, 211, 211, 232, 163, 233, 70, 92, 96, 177, 247, 207, 215,
- 131, 42, 211, 211, 232, 163, 223, 148, 92, 96, 177, 247, 207, 249, 70,
- 92, 96, 177, 233, 70, 92, 96, 177, 215, 134, 92, 96, 177, 223, 148, 92,
- 96, 177, 246, 60, 92, 96, 107, 233, 70, 92, 96, 107, 215, 134, 92, 96,
- 107, 223, 148, 92, 96, 107, 246, 60, 92, 96, 177, 42, 24, 107, 223, 148,
- 92, 96, 177, 114, 24, 107, 246, 60, 92, 96, 107, 42, 24, 177, 223, 148,
- 92, 96, 107, 114, 24, 177, 246, 60, 215, 131, 151, 251, 136, 232, 163,
- 122, 245, 146, 251, 136, 232, 163, 122, 224, 167, 251, 136, 232, 163,
- 133, 245, 144, 251, 136, 232, 163, 151, 251, 136, 232, 163, 244, 50, 245,
- 144, 251, 136, 232, 163, 133, 224, 165, 251, 136, 232, 163, 221, 43, 245,
- 144, 251, 136, 243, 200, 251, 136, 42, 221, 43, 245, 144, 251, 136, 42,
- 133, 224, 165, 251, 136, 42, 244, 50, 245, 144, 251, 136, 42, 151, 251,
- 136, 42, 133, 245, 144, 251, 136, 42, 122, 224, 167, 251, 136, 42, 122,
- 245, 146, 251, 136, 46, 151, 251, 136, 177, 221, 14, 231, 147, 221, 14,
- 248, 107, 221, 14, 215, 131, 122, 245, 146, 251, 136, 46, 122, 245, 146,
- 251, 136, 224, 171, 232, 163, 233, 70, 224, 171, 232, 163, 223, 148, 224,
- 171, 215, 131, 233, 70, 224, 171, 215, 131, 42, 24, 232, 163, 42, 24,
- 232, 163, 223, 148, 224, 171, 215, 131, 42, 24, 232, 163, 223, 148, 224,
- 171, 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171,
- 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 223, 148, 224, 171, 215,
- 131, 223, 148, 224, 171, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171,
- 215, 131, 46, 24, 232, 163, 42, 24, 232, 163, 223, 148, 83, 219, 166, 67,
- 219, 166, 67, 41, 2, 223, 85, 249, 98, 67, 41, 249, 126, 83, 3, 219, 166,
- 41, 2, 199, 244, 74, 41, 2, 71, 244, 74, 41, 2, 227, 11, 249, 66, 244,
- 74, 41, 2, 215, 131, 42, 211, 211, 232, 163, 46, 244, 74, 41, 2, 215,
- 131, 46, 211, 211, 232, 163, 42, 244, 74, 41, 2, 247, 207, 249, 66, 244,
- 74, 83, 3, 219, 166, 67, 3, 219, 166, 83, 224, 9, 67, 224, 9, 83, 71,
- 224, 9, 67, 71, 224, 9, 83, 226, 134, 67, 226, 134, 83, 215, 133, 216,
- 183, 67, 215, 133, 216, 183, 83, 215, 133, 3, 216, 183, 67, 215, 133, 3,
- 216, 183, 83, 223, 144, 216, 183, 67, 223, 144, 216, 183, 83, 223, 144,
- 3, 216, 183, 67, 223, 144, 3, 216, 183, 83, 223, 144, 225, 142, 67, 223,
- 144, 225, 142, 83, 246, 59, 216, 183, 67, 246, 59, 216, 183, 83, 246, 59,
- 3, 216, 183, 67, 246, 59, 3, 216, 183, 83, 233, 66, 216, 183, 67, 233,
- 66, 216, 183, 83, 233, 66, 3, 216, 183, 67, 233, 66, 3, 216, 183, 83,
- 233, 66, 225, 142, 67, 233, 66, 225, 142, 83, 247, 200, 67, 247, 200, 67,
- 247, 201, 249, 126, 83, 3, 247, 200, 244, 58, 232, 159, 67, 249, 228,
- 246, 72, 249, 228, 249, 229, 2, 71, 244, 74, 251, 40, 83, 249, 228, 249,
- 229, 2, 42, 151, 251, 144, 249, 229, 2, 46, 151, 251, 144, 249, 229, 2,
- 232, 163, 151, 251, 144, 249, 229, 2, 215, 131, 151, 251, 144, 249, 229,
- 2, 215, 131, 46, 224, 171, 251, 144, 249, 229, 2, 254, 64, 251, 17, 215,
- 131, 42, 224, 171, 251, 144, 42, 151, 83, 249, 228, 46, 151, 83, 249,
- 228, 235, 192, 251, 42, 235, 192, 67, 249, 228, 215, 131, 151, 235, 192,
- 67, 249, 228, 232, 163, 151, 235, 192, 67, 249, 228, 215, 131, 42, 224,
- 171, 249, 226, 253, 195, 215, 131, 46, 224, 171, 249, 226, 253, 195, 232,
- 163, 46, 224, 171, 249, 226, 253, 195, 232, 163, 42, 224, 171, 249, 226,
- 253, 195, 215, 131, 151, 249, 228, 232, 163, 151, 249, 228, 83, 232, 163,
- 46, 216, 183, 83, 232, 163, 42, 216, 183, 83, 215, 131, 42, 216, 183, 83,
- 215, 131, 46, 216, 183, 67, 251, 42, 41, 2, 42, 151, 251, 144, 41, 2, 46,
- 151, 251, 144, 41, 2, 215, 131, 42, 247, 207, 151, 251, 144, 41, 2, 232,
- 163, 46, 247, 207, 151, 251, 144, 67, 41, 2, 71, 251, 155, 232, 242, 67,
- 215, 133, 216, 184, 2, 247, 74, 215, 133, 216, 184, 2, 42, 151, 251, 144,
- 215, 133, 216, 184, 2, 46, 151, 251, 144, 233, 108, 249, 228, 67, 41, 2,
- 215, 131, 42, 224, 170, 67, 41, 2, 232, 163, 42, 224, 170, 67, 41, 2,
- 232, 163, 46, 224, 170, 67, 41, 2, 215, 131, 46, 224, 170, 67, 249, 229,
- 2, 215, 131, 42, 224, 170, 67, 249, 229, 2, 232, 163, 42, 224, 170, 67,
- 249, 229, 2, 232, 163, 46, 224, 170, 67, 249, 229, 2, 215, 131, 46, 224,
- 170, 215, 131, 42, 216, 183, 215, 131, 46, 216, 183, 232, 163, 42, 216,
- 183, 67, 231, 147, 219, 166, 83, 231, 147, 219, 166, 67, 231, 147, 3,
- 219, 166, 83, 231, 147, 3, 219, 166, 232, 163, 46, 216, 183, 83, 218,
- 239, 2, 224, 25, 249, 184, 215, 164, 219, 244, 249, 160, 83, 219, 95, 67,
- 219, 95, 233, 0, 217, 86, 218, 238, 253, 149, 228, 182, 247, 245, 228,
- 182, 249, 135, 227, 29, 83, 217, 209, 67, 217, 209, 252, 75, 251, 89,
- 252, 75, 92, 2, 250, 65, 252, 75, 92, 2, 213, 166, 222, 169, 215, 165, 2,
- 224, 51, 246, 39, 240, 230, 251, 199, 67, 220, 182, 225, 233, 83, 220,
- 182, 225, 233, 221, 10, 223, 202, 223, 89, 244, 24, 241, 212, 251, 42,
- 83, 42, 225, 141, 235, 239, 83, 46, 225, 141, 235, 239, 67, 42, 225, 141,
- 235, 239, 67, 114, 225, 141, 235, 239, 67, 46, 225, 141, 235, 239, 67,
- 119, 225, 141, 235, 239, 220, 29, 24, 249, 69, 250, 152, 52, 224, 62, 52,
- 251, 162, 52, 250, 211, 254, 13, 227, 12, 249, 70, 250, 48, 223, 190,
- 249, 71, 65, 232, 173, 249, 71, 65, 235, 117, 219, 96, 24, 249, 76, 244,
- 136, 87, 254, 153, 221, 12, 242, 5, 24, 220, 115, 226, 95, 87, 212, 245,
- 213, 58, 216, 173, 31, 241, 207, 216, 173, 31, 233, 131, 216, 173, 31,
- 244, 65, 216, 173, 31, 217, 87, 216, 173, 31, 213, 224, 216, 173, 31,
- 214, 24, 216, 173, 31, 230, 185, 216, 173, 31, 245, 179, 213, 242, 65,
- 247, 226, 67, 243, 209, 244, 158, 67, 220, 2, 244, 158, 83, 220, 2, 244,
- 158, 67, 218, 239, 2, 224, 25, 244, 61, 224, 167, 230, 198, 233, 103,
- 224, 167, 230, 198, 231, 118, 244, 107, 52, 245, 179, 231, 253, 52, 235,
- 41, 222, 137, 215, 116, 229, 175, 225, 154, 253, 183, 217, 247, 243, 28,
- 250, 191, 233, 43, 214, 131, 233, 10, 222, 110, 222, 188, 250, 180, 253,
- 212, 225, 184, 67, 250, 54, 234, 87, 67, 250, 54, 224, 159, 67, 250, 54,
- 223, 97, 67, 250, 54, 251, 154, 67, 250, 54, 234, 39, 67, 250, 54, 226,
- 105, 83, 250, 54, 234, 87, 83, 250, 54, 224, 159, 83, 250, 54, 223, 97,
- 83, 250, 54, 251, 154, 83, 250, 54, 234, 39, 83, 250, 54, 226, 105, 83,
- 219, 204, 218, 251, 67, 241, 212, 218, 251, 67, 247, 201, 218, 251, 83,
- 249, 182, 218, 251, 67, 219, 204, 218, 251, 83, 241, 212, 218, 251, 83,
- 247, 201, 218, 251, 67, 249, 182, 218, 251, 240, 230, 219, 170, 224, 167,
- 228, 158, 245, 146, 228, 158, 251, 249, 245, 146, 228, 153, 251, 249,
- 220, 46, 228, 153, 230, 127, 244, 35, 52, 230, 127, 230, 9, 52, 230, 127,
- 220, 255, 52, 213, 250, 175, 249, 70, 245, 176, 175, 249, 70, 215, 142,
- 224, 5, 87, 224, 5, 16, 31, 216, 14, 225, 166, 224, 5, 16, 31, 216, 13,
- 225, 166, 224, 5, 16, 31, 216, 12, 225, 166, 224, 5, 16, 31, 216, 11,
- 225, 166, 224, 5, 16, 31, 216, 10, 225, 166, 224, 5, 16, 31, 216, 9, 225,
- 166, 224, 5, 16, 31, 216, 8, 225, 166, 224, 5, 16, 31, 243, 26, 231, 201,
- 83, 215, 142, 224, 5, 87, 224, 6, 226, 148, 87, 226, 124, 226, 148, 87,
- 226, 49, 226, 148, 52, 213, 240, 87, 247, 193, 244, 157, 247, 193, 244,
- 156, 247, 193, 244, 155, 247, 193, 244, 154, 247, 193, 244, 153, 247,
- 193, 244, 152, 67, 249, 229, 2, 62, 223, 148, 67, 249, 229, 2, 117, 247,
- 72, 83, 249, 229, 2, 67, 62, 223, 148, 83, 249, 229, 2, 117, 67, 247, 72,
- 230, 212, 31, 213, 58, 230, 212, 31, 212, 244, 247, 176, 31, 242, 108,
- 213, 58, 247, 176, 31, 233, 37, 212, 244, 247, 176, 31, 233, 37, 213, 58,
- 247, 176, 31, 242, 108, 212, 244, 67, 244, 42, 83, 244, 42, 242, 5, 24,
- 225, 236, 254, 29, 249, 68, 218, 180, 219, 103, 65, 254, 131, 222, 124,
- 254, 77, 244, 20, 243, 36, 219, 103, 65, 241, 187, 253, 115, 87, 244, 31,
- 226, 250, 67, 219, 95, 133, 232, 237, 249, 114, 223, 148, 133, 232, 237,
- 249, 114, 233, 70, 214, 34, 52, 124, 214, 111, 52, 246, 64, 244, 107, 52,
- 246, 64, 231, 253, 52, 235, 200, 244, 107, 24, 231, 253, 52, 231, 253,
- 24, 244, 107, 52, 231, 253, 2, 219, 45, 52, 231, 253, 2, 219, 45, 24,
- 231, 253, 24, 244, 107, 52, 71, 231, 253, 2, 219, 45, 52, 199, 231, 253,
- 2, 219, 45, 52, 231, 147, 67, 249, 228, 231, 147, 83, 249, 228, 231, 147,
- 3, 67, 249, 228, 231, 216, 87, 247, 119, 87, 215, 140, 226, 123, 87, 249,
- 169, 243, 196, 215, 112, 229, 170, 250, 95, 226, 188, 235, 47, 214, 162,
- 250, 30, 83, 230, 199, 232, 253, 221, 33, 221, 67, 224, 150, 221, 51,
- 219, 239, 252, 78, 252, 46, 91, 234, 144, 67, 246, 48, 231, 248, 67, 246,
- 48, 234, 87, 83, 246, 48, 231, 248, 83, 246, 48, 234, 87, 219, 245, 213,
- 216, 219, 248, 218, 239, 251, 227, 249, 184, 224, 50, 83, 219, 244, 217,
- 88, 249, 185, 24, 224, 50, 216, 58, 67, 220, 182, 225, 233, 216, 58, 83,
- 220, 182, 225, 233, 67, 247, 201, 235, 252, 219, 166, 249, 65, 233, 115,
- 247, 145, 250, 176, 227, 32, 225, 236, 250, 177, 220, 16, 241, 196, 2,
- 67, 249, 70, 36, 249, 65, 233, 115, 250, 88, 228, 186, 245, 83, 254, 50,
- 227, 57, 42, 214, 10, 216, 208, 83, 216, 21, 42, 214, 10, 216, 208, 67,
- 216, 21, 42, 214, 10, 216, 208, 83, 42, 233, 116, 231, 117, 67, 42, 233,
- 116, 231, 117, 246, 44, 220, 10, 52, 107, 67, 246, 59, 216, 183, 42, 249,
- 193, 245, 83, 91, 222, 169, 244, 143, 247, 207, 235, 252, 67, 249, 229,
- 235, 252, 83, 219, 166, 83, 216, 150, 223, 212, 42, 245, 82, 223, 212,
- 42, 245, 81, 253, 127, 16, 31, 215, 116, 107, 249, 229, 2, 219, 45, 24,
- 117, 176, 49, 226, 64, 223, 145, 235, 202, 226, 64, 233, 67, 235, 202,
- 226, 64, 235, 191, 226, 64, 83, 249, 71, 227, 63, 220, 209, 220, 197,
- 220, 154, 249, 254, 250, 158, 241, 143, 220, 54, 243, 37, 213, 216, 240,
- 210, 243, 37, 2, 241, 251, 231, 236, 16, 31, 233, 1, 230, 185, 215, 165,
- 227, 63, 242, 100, 243, 238, 244, 43, 235, 252, 241, 45, 244, 98, 222,
- 185, 41, 243, 237, 249, 98, 220, 32, 240, 105, 220, 35, 226, 44, 2, 252,
- 78, 217, 195, 235, 131, 252, 65, 87, 241, 215, 242, 110, 87, 243, 203,
- 225, 28, 249, 44, 227, 63, 83, 219, 166, 67, 244, 43, 2, 199, 231, 37,
- 83, 219, 46, 215, 131, 251, 140, 222, 112, 83, 222, 112, 232, 163, 251,
- 140, 222, 112, 67, 222, 112, 67, 107, 250, 66, 77, 217, 210, 232, 206,
- 52, 218, 4, 246, 43, 254, 99, 245, 78, 224, 48, 244, 54, 224, 48, 241,
- 254, 214, 152, 241, 254, 213, 186, 241, 254, 232, 163, 46, 226, 73, 226,
- 73, 215, 131, 46, 226, 73, 67, 229, 61, 83, 229, 61, 250, 66, 77, 107,
- 250, 66, 77, 230, 154, 213, 166, 107, 230, 154, 213, 166, 252, 75, 213,
- 166, 107, 252, 75, 213, 166, 226, 250, 25, 249, 70, 107, 25, 249, 70,
- 227, 40, 250, 109, 249, 70, 107, 227, 40, 250, 109, 249, 70, 7, 249, 70,
- 221, 13, 67, 7, 249, 70, 226, 250, 7, 249, 70, 231, 250, 249, 70, 219,
- 96, 65, 248, 95, 243, 237, 217, 223, 253, 132, 243, 237, 252, 76, 253,
- 132, 107, 243, 237, 252, 76, 253, 132, 243, 237, 249, 180, 253, 132, 83,
- 243, 237, 225, 143, 219, 95, 67, 243, 237, 225, 143, 219, 95, 219, 199,
- 219, 51, 226, 250, 67, 219, 95, 36, 67, 219, 95, 227, 40, 250, 109, 83,
- 219, 95, 83, 250, 109, 67, 219, 95, 226, 250, 83, 219, 95, 107, 226, 250,
- 83, 219, 95, 225, 192, 219, 95, 221, 13, 67, 219, 95, 107, 253, 132, 227,
- 40, 250, 109, 253, 132, 245, 150, 219, 176, 253, 132, 245, 150, 225, 143,
- 83, 219, 95, 245, 150, 225, 143, 225, 192, 219, 95, 220, 53, 225, 143,
- 83, 219, 95, 245, 150, 225, 143, 224, 7, 83, 219, 95, 107, 245, 150, 225,
- 143, 224, 7, 83, 219, 95, 216, 42, 225, 143, 83, 219, 95, 220, 48, 225,
- 143, 253, 132, 217, 223, 253, 132, 227, 40, 250, 109, 217, 223, 253, 132,
- 107, 217, 223, 253, 132, 220, 53, 226, 33, 83, 24, 67, 244, 23, 83, 244,
- 23, 67, 244, 23, 245, 150, 226, 33, 226, 250, 83, 244, 23, 36, 227, 40,
- 250, 109, 245, 150, 225, 143, 219, 95, 107, 217, 223, 225, 192, 253, 132,
- 219, 246, 217, 59, 216, 176, 219, 246, 107, 250, 51, 219, 246, 219, 201,
- 107, 219, 201, 252, 76, 253, 132, 245, 150, 217, 223, 225, 55, 253, 132,
- 107, 245, 150, 217, 223, 225, 55, 253, 132, 249, 71, 77, 221, 13, 67,
- 249, 228, 146, 91, 249, 71, 77, 232, 163, 46, 246, 41, 67, 219, 166, 215,
- 131, 46, 246, 41, 67, 219, 166, 232, 163, 46, 221, 13, 67, 219, 166, 215,
- 131, 46, 221, 13, 67, 219, 166, 83, 224, 158, 152, 227, 14, 67, 224, 158,
- 152, 227, 14, 67, 244, 254, 152, 227, 14, 83, 247, 201, 230, 251, 67,
- 213, 166, 107, 244, 254, 152, 87, 177, 71, 134, 231, 147, 71, 134, 107,
- 71, 134, 107, 220, 81, 216, 58, 249, 158, 224, 143, 152, 227, 14, 107,
- 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 51, 216, 58, 249, 158,
- 224, 143, 152, 227, 14, 107, 51, 249, 158, 224, 143, 152, 227, 14, 107,
- 115, 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 115, 51, 249, 158,
- 224, 143, 152, 227, 14, 249, 33, 219, 80, 226, 143, 5, 227, 14, 107, 244,
- 254, 152, 227, 14, 107, 241, 212, 244, 254, 152, 227, 14, 107, 83, 241,
- 211, 223, 89, 107, 83, 241, 212, 251, 42, 244, 24, 241, 211, 223, 89,
- 244, 24, 241, 212, 251, 42, 231, 147, 42, 226, 132, 227, 14, 231, 147,
- 46, 226, 132, 227, 14, 231, 147, 244, 32, 42, 226, 132, 227, 14, 231,
- 147, 244, 32, 46, 226, 132, 227, 14, 231, 147, 233, 66, 254, 19, 251, 85,
- 227, 14, 231, 147, 223, 144, 254, 19, 251, 85, 227, 14, 107, 233, 66,
- 254, 19, 224, 143, 152, 227, 14, 107, 223, 144, 254, 19, 224, 143, 152,
- 227, 14, 107, 233, 66, 254, 19, 251, 85, 227, 14, 107, 223, 144, 254, 19,
- 251, 85, 227, 14, 177, 42, 216, 219, 220, 233, 251, 85, 227, 14, 177, 46,
- 216, 219, 220, 233, 251, 85, 227, 14, 231, 147, 42, 249, 40, 251, 85,
- 227, 14, 231, 147, 46, 249, 40, 251, 85, 227, 14, 247, 156, 146, 36, 21,
- 116, 247, 156, 146, 36, 21, 109, 247, 156, 146, 36, 21, 166, 247, 156,
- 146, 36, 21, 163, 247, 156, 146, 36, 21, 180, 247, 156, 146, 36, 21, 189,
- 247, 156, 146, 36, 21, 198, 247, 156, 146, 36, 21, 195, 247, 156, 146,
- 36, 21, 200, 247, 156, 146, 36, 50, 217, 200, 247, 156, 36, 35, 21, 116,
- 247, 156, 36, 35, 21, 109, 247, 156, 36, 35, 21, 166, 247, 156, 36, 35,
- 21, 163, 247, 156, 36, 35, 21, 180, 247, 156, 36, 35, 21, 189, 247, 156,
- 36, 35, 21, 198, 247, 156, 36, 35, 21, 195, 247, 156, 36, 35, 21, 200,
- 247, 156, 36, 35, 50, 217, 200, 247, 156, 146, 36, 35, 21, 116, 247, 156,
- 146, 36, 35, 21, 109, 247, 156, 146, 36, 35, 21, 166, 247, 156, 146, 36,
- 35, 21, 163, 247, 156, 146, 36, 35, 21, 180, 247, 156, 146, 36, 35, 21,
- 189, 247, 156, 146, 36, 35, 21, 198, 247, 156, 146, 36, 35, 21, 195, 247,
- 156, 146, 36, 35, 21, 200, 247, 156, 146, 36, 35, 50, 217, 200, 107, 213,
- 231, 95, 68, 107, 94, 52, 107, 230, 251, 52, 107, 247, 121, 52, 107, 219,
- 215, 245, 176, 68, 107, 95, 68, 107, 228, 167, 245, 176, 68, 246, 52,
- 225, 145, 95, 68, 107, 223, 86, 95, 68, 216, 182, 95, 68, 107, 216, 182,
- 95, 68, 248, 100, 216, 182, 95, 68, 107, 248, 100, 216, 182, 95, 68, 83,
- 95, 68, 217, 97, 216, 225, 95, 253, 164, 217, 97, 251, 99, 95, 253, 164,
- 83, 95, 253, 164, 107, 83, 249, 33, 246, 58, 24, 95, 68, 107, 83, 249,
- 33, 215, 124, 24, 95, 68, 219, 163, 83, 95, 68, 107, 249, 145, 83, 95,
- 68, 223, 143, 67, 95, 68, 233, 65, 67, 95, 68, 252, 100, 221, 13, 67, 95,
- 68, 243, 211, 221, 13, 67, 95, 68, 107, 232, 163, 223, 142, 67, 95, 68,
- 107, 215, 131, 223, 142, 67, 95, 68, 228, 160, 232, 163, 223, 142, 67,
- 95, 68, 249, 40, 232, 177, 228, 160, 215, 131, 223, 142, 67, 95, 68, 36,
- 107, 67, 95, 68, 213, 237, 95, 68, 251, 143, 219, 215, 245, 176, 68, 251,
- 143, 95, 68, 251, 143, 228, 167, 245, 176, 68, 107, 251, 143, 219, 215,
- 245, 176, 68, 107, 251, 143, 95, 68, 107, 251, 143, 228, 167, 245, 176,
- 68, 217, 225, 95, 68, 107, 217, 224, 95, 68, 214, 2, 95, 68, 107, 214, 2,
- 95, 68, 227, 37, 95, 68, 51, 249, 40, 232, 177, 133, 247, 166, 254, 18,
- 67, 216, 184, 249, 126, 3, 67, 216, 183, 226, 47, 227, 40, 219, 8, 227,
- 40, 218, 221, 42, 223, 3, 252, 91, 248, 11, 46, 223, 3, 252, 91, 248, 11,
- 167, 2, 62, 235, 212, 223, 203, 219, 232, 225, 81, 219, 8, 218, 222, 225,
- 81, 219, 231, 71, 252, 60, 2, 199, 90, 184, 247, 120, 91, 232, 199, 254,
- 27, 91, 232, 199, 227, 24, 67, 247, 201, 2, 250, 107, 247, 74, 24, 2,
- 247, 74, 245, 127, 65, 227, 35, 215, 123, 232, 163, 46, 249, 100, 2, 247,
- 74, 215, 131, 42, 249, 100, 2, 247, 74, 42, 226, 252, 235, 69, 46, 226,
- 252, 235, 69, 243, 200, 226, 252, 235, 69, 233, 108, 114, 218, 36, 233,
- 108, 119, 218, 36, 42, 24, 46, 51, 216, 57, 42, 24, 46, 218, 36, 42, 230,
- 157, 184, 46, 218, 36, 184, 42, 218, 36, 114, 218, 37, 2, 249, 229, 49,
- 232, 160, 247, 125, 251, 7, 199, 223, 44, 67, 249, 144, 247, 200, 67,
- 249, 144, 247, 201, 2, 132, 217, 68, 67, 249, 144, 247, 201, 2, 95, 217,
- 68, 67, 41, 2, 132, 217, 68, 67, 41, 2, 95, 217, 68, 14, 42, 67, 41, 125,
- 14, 46, 67, 41, 125, 14, 42, 254, 19, 125, 14, 46, 254, 19, 125, 14, 42,
- 51, 254, 19, 125, 14, 46, 51, 254, 19, 125, 14, 42, 67, 216, 219, 220,
- 233, 125, 14, 46, 67, 216, 219, 220, 233, 125, 14, 42, 244, 32, 226, 131,
- 14, 46, 244, 32, 226, 131, 215, 124, 224, 169, 68, 246, 58, 224, 169, 68,
- 253, 255, 243, 74, 249, 229, 68, 249, 195, 243, 74, 249, 229, 68, 46, 76,
- 2, 36, 225, 156, 184, 132, 68, 184, 95, 68, 184, 42, 46, 68, 184, 132,
- 51, 68, 184, 95, 51, 68, 184, 42, 46, 51, 68, 184, 132, 76, 243, 213,
- 134, 184, 95, 76, 243, 213, 134, 184, 132, 51, 76, 243, 213, 134, 184,
- 95, 51, 76, 243, 213, 134, 184, 95, 219, 162, 68, 44, 45, 251, 138, 44,
- 45, 247, 71, 44, 45, 246, 199, 44, 45, 247, 70, 44, 45, 246, 135, 44, 45,
- 247, 6, 44, 45, 246, 198, 44, 45, 247, 69, 44, 45, 246, 103, 44, 45, 246,
- 230, 44, 45, 246, 166, 44, 45, 247, 37, 44, 45, 246, 134, 44, 45, 247, 5,
- 44, 45, 246, 197, 44, 45, 247, 68, 44, 45, 246, 87, 44, 45, 246, 214, 44,
- 45, 246, 150, 44, 45, 247, 21, 44, 45, 246, 118, 44, 45, 246, 245, 44,
- 45, 246, 181, 44, 45, 247, 52, 44, 45, 246, 102, 44, 45, 246, 229, 44,
- 45, 246, 165, 44, 45, 247, 36, 44, 45, 246, 133, 44, 45, 247, 4, 44, 45,
- 246, 196, 44, 45, 247, 67, 44, 45, 246, 79, 44, 45, 246, 206, 44, 45,
- 246, 142, 44, 45, 247, 13, 44, 45, 246, 110, 44, 45, 246, 237, 44, 45,
- 246, 173, 44, 45, 247, 44, 44, 45, 246, 94, 44, 45, 246, 221, 44, 45,
- 246, 157, 44, 45, 247, 28, 44, 45, 246, 125, 44, 45, 246, 252, 44, 45,
- 246, 188, 44, 45, 247, 59, 44, 45, 246, 86, 44, 45, 246, 213, 44, 45,
- 246, 149, 44, 45, 247, 20, 44, 45, 246, 117, 44, 45, 246, 244, 44, 45,
- 246, 180, 44, 45, 247, 51, 44, 45, 246, 101, 44, 45, 246, 228, 44, 45,
- 246, 164, 44, 45, 247, 35, 44, 45, 246, 132, 44, 45, 247, 3, 44, 45, 246,
- 195, 44, 45, 247, 66, 44, 45, 246, 75, 44, 45, 246, 202, 44, 45, 246,
- 138, 44, 45, 247, 9, 44, 45, 246, 106, 44, 45, 246, 233, 44, 45, 246,
- 169, 44, 45, 247, 40, 44, 45, 246, 90, 44, 45, 246, 217, 44, 45, 246,
- 153, 44, 45, 247, 24, 44, 45, 246, 121, 44, 45, 246, 248, 44, 45, 246,
- 184, 44, 45, 247, 55, 44, 45, 246, 82, 44, 45, 246, 209, 44, 45, 246,
- 145, 44, 45, 247, 16, 44, 45, 246, 113, 44, 45, 246, 240, 44, 45, 246,
- 176, 44, 45, 247, 47, 44, 45, 246, 97, 44, 45, 246, 224, 44, 45, 246,
- 160, 44, 45, 247, 31, 44, 45, 246, 128, 44, 45, 246, 255, 44, 45, 246,
- 191, 44, 45, 247, 62, 44, 45, 246, 78, 44, 45, 246, 205, 44, 45, 246,
- 141, 44, 45, 247, 12, 44, 45, 246, 109, 44, 45, 246, 236, 44, 45, 246,
- 172, 44, 45, 247, 43, 44, 45, 246, 93, 44, 45, 246, 220, 44, 45, 246,
- 156, 44, 45, 247, 27, 44, 45, 246, 124, 44, 45, 246, 251, 44, 45, 246,
- 187, 44, 45, 247, 58, 44, 45, 246, 85, 44, 45, 246, 212, 44, 45, 246,
- 148, 44, 45, 247, 19, 44, 45, 246, 116, 44, 45, 246, 243, 44, 45, 246,
- 179, 44, 45, 247, 50, 44, 45, 246, 100, 44, 45, 246, 227, 44, 45, 246,
- 163, 44, 45, 247, 34, 44, 45, 246, 131, 44, 45, 247, 2, 44, 45, 246, 194,
- 44, 45, 247, 65, 44, 45, 246, 73, 44, 45, 246, 200, 44, 45, 246, 136, 44,
- 45, 247, 7, 44, 45, 246, 104, 44, 45, 246, 231, 44, 45, 246, 167, 44, 45,
- 247, 38, 44, 45, 246, 88, 44, 45, 246, 215, 44, 45, 246, 151, 44, 45,
- 247, 22, 44, 45, 246, 119, 44, 45, 246, 246, 44, 45, 246, 182, 44, 45,
- 247, 53, 44, 45, 246, 80, 44, 45, 246, 207, 44, 45, 246, 143, 44, 45,
- 247, 14, 44, 45, 246, 111, 44, 45, 246, 238, 44, 45, 246, 174, 44, 45,
- 247, 45, 44, 45, 246, 95, 44, 45, 246, 222, 44, 45, 246, 158, 44, 45,
- 247, 29, 44, 45, 246, 126, 44, 45, 246, 253, 44, 45, 246, 189, 44, 45,
- 247, 60, 44, 45, 246, 76, 44, 45, 246, 203, 44, 45, 246, 139, 44, 45,
- 247, 10, 44, 45, 246, 107, 44, 45, 246, 234, 44, 45, 246, 170, 44, 45,
- 247, 41, 44, 45, 246, 91, 44, 45, 246, 218, 44, 45, 246, 154, 44, 45,
- 247, 25, 44, 45, 246, 122, 44, 45, 246, 249, 44, 45, 246, 185, 44, 45,
- 247, 56, 44, 45, 246, 83, 44, 45, 246, 210, 44, 45, 246, 146, 44, 45,
- 247, 17, 44, 45, 246, 114, 44, 45, 246, 241, 44, 45, 246, 177, 44, 45,
- 247, 48, 44, 45, 246, 98, 44, 45, 246, 225, 44, 45, 246, 161, 44, 45,
- 247, 32, 44, 45, 246, 129, 44, 45, 247, 0, 44, 45, 246, 192, 44, 45, 247,
- 63, 44, 45, 246, 74, 44, 45, 246, 201, 44, 45, 246, 137, 44, 45, 247, 8,
- 44, 45, 246, 105, 44, 45, 246, 232, 44, 45, 246, 168, 44, 45, 247, 39,
- 44, 45, 246, 89, 44, 45, 246, 216, 44, 45, 246, 152, 44, 45, 247, 23, 44,
- 45, 246, 120, 44, 45, 246, 247, 44, 45, 246, 183, 44, 45, 247, 54, 44,
- 45, 246, 81, 44, 45, 246, 208, 44, 45, 246, 144, 44, 45, 247, 15, 44, 45,
- 246, 112, 44, 45, 246, 239, 44, 45, 246, 175, 44, 45, 247, 46, 44, 45,
- 246, 96, 44, 45, 246, 223, 44, 45, 246, 159, 44, 45, 247, 30, 44, 45,
- 246, 127, 44, 45, 246, 254, 44, 45, 246, 190, 44, 45, 247, 61, 44, 45,
- 246, 77, 44, 45, 246, 204, 44, 45, 246, 140, 44, 45, 247, 11, 44, 45,
- 246, 108, 44, 45, 246, 235, 44, 45, 246, 171, 44, 45, 247, 42, 44, 45,
- 246, 92, 44, 45, 246, 219, 44, 45, 246, 155, 44, 45, 247, 26, 44, 45,
- 246, 123, 44, 45, 246, 250, 44, 45, 246, 186, 44, 45, 247, 57, 44, 45,
- 246, 84, 44, 45, 246, 211, 44, 45, 246, 147, 44, 45, 247, 18, 44, 45,
- 246, 115, 44, 45, 246, 242, 44, 45, 246, 178, 44, 45, 247, 49, 44, 45,
- 246, 99, 44, 45, 246, 226, 44, 45, 246, 162, 44, 45, 247, 33, 44, 45,
- 246, 130, 44, 45, 247, 1, 44, 45, 246, 193, 44, 45, 247, 64, 95, 216, 24,
- 76, 2, 71, 90, 95, 216, 24, 76, 2, 51, 71, 90, 132, 51, 76, 2, 71, 90,
- 95, 51, 76, 2, 71, 90, 42, 46, 51, 76, 2, 71, 90, 95, 216, 24, 76, 243,
- 213, 134, 132, 51, 76, 243, 213, 134, 95, 51, 76, 243, 213, 134, 246, 58,
- 76, 2, 199, 90, 215, 124, 76, 2, 199, 90, 215, 124, 216, 169, 68, 246,
- 58, 216, 169, 68, 132, 51, 248, 102, 68, 95, 51, 248, 102, 68, 132, 216,
- 169, 248, 102, 68, 95, 216, 169, 248, 102, 68, 95, 216, 24, 216, 169,
- 248, 102, 68, 95, 76, 2, 246, 72, 219, 79, 215, 124, 76, 211, 211, 134,
- 246, 58, 76, 211, 211, 134, 95, 76, 2, 218, 28, 2, 71, 90, 95, 76, 2,
- 218, 28, 2, 51, 71, 90, 95, 216, 24, 76, 2, 218, 27, 95, 216, 24, 76, 2,
- 218, 28, 2, 71, 90, 95, 216, 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 253,
- 166, 95, 253, 166, 132, 51, 253, 166, 95, 51, 253, 166, 132, 76, 211,
- 211, 83, 247, 200, 95, 76, 211, 211, 83, 247, 200, 132, 76, 243, 213,
- 252, 60, 211, 211, 83, 247, 200, 95, 76, 243, 213, 252, 60, 211, 211, 83,
- 247, 200, 228, 167, 213, 250, 24, 219, 215, 245, 176, 68, 228, 167, 245,
- 176, 24, 219, 215, 213, 250, 68, 228, 167, 213, 250, 76, 2, 101, 228,
- 167, 245, 176, 76, 2, 101, 219, 215, 245, 176, 76, 2, 101, 219, 215, 213,
- 250, 76, 2, 101, 228, 167, 213, 250, 76, 24, 228, 167, 245, 176, 68, 228,
- 167, 245, 176, 76, 24, 219, 215, 245, 176, 68, 219, 215, 245, 176, 76,
- 24, 219, 215, 213, 250, 68, 219, 215, 213, 250, 76, 24, 228, 167, 213,
- 250, 68, 223, 125, 247, 207, 249, 65, 244, 143, 247, 206, 244, 143, 247,
- 207, 249, 65, 223, 125, 247, 206, 219, 215, 245, 176, 76, 249, 65, 228,
- 167, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65, 219, 215, 245, 176,
- 68, 244, 143, 247, 207, 249, 65, 228, 167, 245, 176, 68, 223, 125, 247,
- 207, 249, 65, 219, 215, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65,
- 228, 167, 213, 250, 68, 228, 167, 213, 250, 76, 249, 65, 228, 167, 245,
- 176, 68, 214, 20, 76, 225, 141, 247, 147, 223, 148, 76, 225, 141, 95,
- 217, 141, 249, 32, 215, 123, 76, 225, 141, 95, 217, 141, 249, 32, 246,
- 57, 76, 225, 141, 246, 58, 217, 141, 249, 32, 233, 61, 76, 225, 141, 246,
- 58, 217, 141, 249, 32, 223, 138, 223, 141, 253, 196, 249, 195, 68, 233,
- 64, 253, 196, 253, 255, 68, 216, 227, 253, 196, 253, 255, 68, 251, 101,
- 253, 196, 253, 255, 68, 216, 227, 253, 196, 249, 195, 76, 2, 230, 250,
- 216, 227, 253, 196, 253, 255, 76, 2, 225, 156, 232, 163, 46, 221, 72,
- 249, 195, 68, 232, 163, 42, 221, 72, 253, 255, 68, 253, 255, 249, 193,
- 249, 229, 68, 249, 195, 249, 193, 249, 229, 68, 95, 76, 78, 220, 175,
- 132, 68, 132, 76, 78, 220, 175, 95, 68, 220, 175, 95, 76, 78, 132, 68,
- 95, 76, 2, 94, 55, 132, 76, 2, 94, 55, 95, 76, 217, 93, 213, 166, 42, 46,
- 76, 217, 93, 3, 249, 228, 215, 124, 216, 24, 76, 243, 213, 3, 249, 228,
- 42, 206, 114, 46, 206, 119, 241, 237, 42, 206, 119, 46, 206, 114, 241,
- 237, 114, 206, 46, 119, 206, 42, 241, 237, 114, 206, 42, 119, 206, 46,
- 241, 237, 42, 206, 114, 46, 206, 114, 241, 237, 114, 206, 46, 119, 206,
- 46, 241, 237, 42, 206, 119, 46, 206, 119, 241, 237, 114, 206, 42, 119,
- 206, 42, 241, 237, 132, 241, 238, 2, 206, 114, 211, 211, 134, 95, 241,
- 238, 2, 206, 114, 211, 211, 134, 215, 124, 241, 238, 2, 206, 46, 211,
- 211, 134, 246, 58, 241, 238, 2, 206, 46, 211, 211, 134, 132, 241, 238, 2,
- 206, 119, 211, 211, 134, 95, 241, 238, 2, 206, 119, 211, 211, 134, 215,
- 124, 241, 238, 2, 206, 42, 211, 211, 134, 246, 58, 241, 238, 2, 206, 42,
- 211, 211, 134, 132, 241, 238, 2, 206, 114, 243, 213, 134, 95, 241, 238,
- 2, 206, 114, 243, 213, 134, 215, 124, 241, 238, 2, 206, 46, 243, 213,
- 134, 246, 58, 241, 238, 2, 206, 46, 243, 213, 134, 132, 241, 238, 2, 206,
- 119, 243, 213, 134, 95, 241, 238, 2, 206, 119, 243, 213, 134, 215, 124,
- 241, 238, 2, 206, 42, 243, 213, 134, 246, 58, 241, 238, 2, 206, 42, 243,
- 213, 134, 132, 241, 238, 2, 206, 114, 78, 132, 241, 238, 2, 206, 246, 60,
- 215, 124, 241, 238, 2, 206, 42, 251, 207, 215, 124, 241, 238, 2, 206,
- 223, 148, 95, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 246, 60,
- 246, 58, 241, 238, 2, 206, 42, 251, 207, 246, 58, 241, 238, 2, 206, 223,
- 148, 132, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 215, 134, 132,
- 241, 238, 2, 206, 119, 78, 95, 241, 238, 2, 206, 246, 60, 95, 241, 238,
- 2, 206, 114, 78, 132, 241, 238, 2, 206, 215, 134, 95, 241, 238, 2, 206,
- 119, 78, 132, 241, 238, 2, 206, 246, 60, 132, 241, 238, 2, 206, 114, 78,
- 184, 248, 101, 132, 241, 238, 2, 206, 119, 251, 220, 184, 248, 101, 95,
- 241, 238, 2, 206, 114, 78, 184, 248, 101, 95, 241, 238, 2, 206, 119, 251,
- 220, 184, 248, 101, 215, 124, 241, 238, 2, 206, 42, 251, 207, 246, 58,
- 241, 238, 2, 206, 223, 148, 246, 58, 241, 238, 2, 206, 42, 251, 207, 215,
- 124, 241, 238, 2, 206, 223, 148, 46, 51, 76, 2, 223, 85, 241, 219, 245,
- 61, 5, 78, 95, 68, 217, 43, 227, 34, 78, 95, 68, 132, 76, 78, 217, 43,
- 227, 33, 95, 76, 78, 217, 43, 227, 33, 95, 76, 78, 254, 57, 123, 108,
- 233, 39, 78, 132, 68, 132, 76, 217, 93, 233, 38, 242, 107, 78, 95, 68,
- 219, 9, 78, 95, 68, 132, 76, 217, 93, 219, 8, 218, 222, 78, 132, 68, 42,
- 244, 60, 218, 27, 46, 244, 60, 218, 27, 114, 244, 60, 218, 27, 119, 244,
- 60, 218, 27, 216, 169, 71, 252, 60, 248, 11, 212, 153, 174, 219, 174,
- 212, 153, 174, 216, 15, 249, 164, 42, 67, 249, 40, 125, 46, 67, 249, 40,
- 125, 42, 67, 226, 131, 46, 67, 226, 131, 212, 153, 174, 42, 236, 10, 125,
- 212, 153, 174, 46, 236, 10, 125, 212, 153, 174, 42, 251, 165, 125, 212,
- 153, 174, 46, 251, 165, 125, 42, 41, 251, 85, 2, 215, 153, 46, 41, 251,
- 85, 2, 215, 153, 42, 41, 251, 85, 2, 217, 69, 235, 252, 216, 227, 249,
- 99, 46, 41, 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 42, 41,
- 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 46, 41, 251, 85, 2,
- 217, 69, 235, 252, 216, 227, 249, 99, 42, 254, 19, 251, 85, 2, 247, 74,
- 46, 254, 19, 251, 85, 2, 247, 74, 42, 253, 196, 233, 39, 125, 46, 253,
- 196, 242, 107, 125, 51, 42, 253, 196, 242, 107, 125, 51, 46, 253, 196,
- 233, 39, 125, 42, 83, 216, 219, 220, 233, 125, 46, 83, 216, 219, 220,
- 233, 125, 246, 72, 244, 104, 71, 212, 28, 232, 242, 231, 153, 254, 19,
- 227, 35, 233, 70, 46, 254, 19, 214, 244, 2, 219, 166, 231, 153, 46, 254,
- 19, 2, 247, 74, 254, 19, 2, 223, 4, 235, 212, 254, 164, 254, 18, 219,
- 187, 254, 19, 227, 35, 233, 70, 219, 187, 254, 19, 227, 35, 215, 134,
- 216, 58, 254, 18, 223, 202, 254, 18, 254, 19, 2, 215, 153, 223, 202, 254,
- 19, 2, 215, 153, 227, 112, 254, 19, 227, 35, 215, 134, 227, 112, 254, 19,
- 227, 35, 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235,
- 252, 76, 225, 141, 114, 24, 223, 148, 231, 153, 254, 19, 2, 227, 40, 253,
- 176, 245, 98, 235, 252, 76, 225, 141, 114, 24, 233, 70, 231, 153, 254,
- 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 119, 24, 223,
- 148, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225,
- 141, 119, 24, 233, 70, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98,
- 235, 252, 76, 225, 141, 46, 24, 215, 134, 231, 153, 254, 19, 2, 227, 40,
- 253, 176, 245, 98, 235, 252, 76, 225, 141, 42, 24, 215, 134, 231, 153,
- 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 46, 24,
- 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76,
- 225, 141, 42, 24, 246, 60, 223, 202, 245, 110, 221, 48, 245, 110, 221,
- 49, 2, 226, 247, 245, 110, 221, 49, 2, 3, 249, 229, 49, 245, 110, 221,
- 49, 2, 46, 76, 49, 245, 110, 221, 49, 2, 42, 76, 49, 249, 229, 2, 199,
- 134, 36, 71, 134, 36, 226, 135, 36, 223, 203, 219, 231, 36, 226, 47, 249,
- 229, 247, 125, 251, 7, 199, 252, 60, 24, 216, 227, 151, 247, 125, 251, 7,
- 71, 134, 249, 229, 2, 218, 224, 213, 166, 36, 253, 254, 247, 121, 52,
- 114, 76, 217, 93, 249, 228, 36, 67, 251, 42, 36, 251, 42, 36, 233, 38,
- 36, 242, 106, 249, 229, 2, 3, 249, 229, 211, 211, 217, 149, 223, 148,
- 249, 229, 2, 117, 199, 219, 33, 211, 211, 217, 149, 223, 148, 91, 223,
- 125, 247, 207, 220, 23, 91, 244, 143, 247, 207, 220, 23, 91, 253, 132,
- 91, 3, 249, 228, 91, 219, 166, 117, 235, 68, 219, 164, 216, 184, 2, 62,
- 49, 216, 184, 2, 215, 153, 223, 4, 235, 252, 216, 183, 216, 184, 2, 221,
- 55, 253, 123, 251, 100, 46, 216, 184, 78, 42, 216, 183, 42, 216, 184,
- 251, 207, 71, 134, 71, 252, 60, 251, 207, 46, 216, 183, 251, 91, 2, 42,
- 151, 251, 144, 251, 91, 2, 46, 151, 251, 144, 83, 251, 90, 29, 2, 42,
- 151, 251, 144, 29, 2, 46, 151, 251, 144, 67, 240, 223, 83, 240, 223, 42,
- 213, 229, 244, 104, 46, 213, 229, 244, 104, 42, 51, 213, 229, 244, 104,
- 46, 51, 213, 229, 244, 104, 235, 244, 235, 231, 217, 66, 110, 235, 231,
- 235, 232, 229, 183, 2, 71, 134, 246, 66, 230, 157, 41, 2, 249, 120, 226,
- 251, 235, 242, 253, 152, 220, 144, 225, 63, 245, 61, 5, 24, 220, 25, 226,
- 135, 245, 61, 5, 24, 220, 25, 226, 136, 2, 217, 43, 49, 240, 97, 211,
- 211, 24, 220, 25, 226, 135, 242, 159, 219, 94, 217, 138, 246, 59, 216,
- 184, 2, 42, 151, 251, 144, 246, 59, 216, 184, 2, 46, 151, 251, 144, 83,
- 247, 201, 2, 119, 68, 83, 232, 159, 67, 249, 229, 2, 119, 68, 83, 249,
- 229, 2, 119, 68, 245, 48, 67, 219, 166, 245, 48, 83, 219, 166, 245, 48,
- 67, 247, 200, 245, 48, 83, 247, 200, 245, 48, 67, 249, 228, 245, 48, 83,
- 249, 228, 223, 43, 223, 203, 219, 232, 227, 33, 219, 232, 2, 226, 247,
- 223, 203, 219, 232, 2, 199, 90, 251, 172, 219, 231, 251, 172, 223, 203,
- 219, 231, 51, 225, 156, 216, 169, 225, 156, 233, 66, 249, 33, 254, 19,
- 125, 223, 144, 249, 33, 254, 19, 125, 217, 31, 230, 248, 230, 97, 36, 62,
- 227, 33, 230, 97, 36, 94, 227, 33, 230, 97, 36, 29, 227, 33, 230, 97,
- 215, 147, 227, 34, 2, 247, 74, 230, 97, 215, 147, 227, 34, 2, 225, 156,
- 230, 97, 41, 235, 196, 227, 33, 230, 97, 41, 215, 147, 227, 33, 117, 232,
- 199, 24, 227, 33, 117, 232, 199, 167, 227, 33, 230, 97, 29, 227, 33, 230,
- 224, 117, 218, 244, 218, 242, 2, 235, 208, 224, 169, 235, 209, 227, 33,
- 244, 68, 226, 127, 235, 208, 235, 209, 2, 51, 90, 235, 209, 253, 89, 2,
- 220, 23, 249, 225, 243, 197, 253, 255, 235, 206, 232, 243, 235, 207, 2,
- 224, 8, 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 2, 221, 72,
- 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 228, 163, 235, 246,
- 217, 149, 225, 135, 235, 209, 253, 173, 118, 225, 145, 227, 33, 224, 163,
- 235, 209, 227, 33, 235, 209, 2, 132, 76, 2, 101, 235, 209, 2, 29, 52,
- 235, 209, 2, 235, 195, 235, 209, 2, 215, 146, 235, 209, 2, 226, 247, 235,
- 209, 2, 215, 153, 235, 69, 233, 108, 42, 216, 184, 227, 33, 212, 153,
- 174, 222, 119, 249, 148, 212, 153, 174, 222, 119, 225, 188, 212, 153,
- 174, 222, 119, 225, 60, 94, 5, 2, 3, 249, 229, 49, 94, 5, 2, 249, 224,
- 254, 175, 49, 94, 5, 2, 217, 43, 49, 94, 5, 2, 62, 55, 94, 5, 2, 217, 43,
- 55, 94, 5, 2, 219, 10, 109, 94, 5, 2, 83, 216, 183, 230, 251, 5, 2, 249,
- 158, 49, 230, 251, 5, 2, 62, 55, 230, 251, 5, 2, 244, 143, 247, 72, 230,
- 251, 5, 2, 223, 125, 247, 72, 94, 5, 235, 252, 42, 151, 249, 228, 94, 5,
- 235, 252, 46, 151, 249, 228, 214, 231, 167, 249, 71, 225, 63, 230, 154,
- 5, 2, 62, 49, 230, 154, 5, 2, 215, 153, 221, 69, 225, 64, 2, 251, 101,
- 249, 192, 220, 5, 225, 63, 230, 154, 5, 235, 252, 42, 151, 249, 228, 230,
- 154, 5, 235, 252, 46, 151, 249, 228, 36, 230, 154, 5, 2, 249, 224, 254,
- 174, 230, 154, 5, 235, 252, 51, 249, 228, 36, 247, 121, 52, 94, 5, 235,
- 252, 216, 183, 230, 251, 5, 235, 252, 216, 183, 230, 154, 5, 235, 252,
- 216, 183, 235, 203, 225, 63, 223, 139, 235, 203, 225, 63, 212, 153, 174,
- 223, 240, 249, 148, 254, 43, 167, 249, 104, 235, 196, 2, 247, 74, 215,
- 147, 2, 230, 251, 52, 215, 147, 2, 226, 247, 235, 196, 2, 226, 247, 235,
- 196, 2, 232, 199, 254, 27, 215, 147, 2, 232, 199, 227, 24, 215, 147, 78,
- 235, 195, 235, 196, 78, 215, 146, 215, 147, 78, 252, 60, 78, 235, 195,
- 235, 196, 78, 252, 60, 78, 215, 146, 215, 147, 251, 207, 24, 235, 68, 2,
- 215, 146, 235, 196, 251, 207, 24, 235, 68, 2, 235, 195, 249, 193, 215,
- 147, 2, 221, 54, 249, 193, 235, 196, 2, 221, 54, 51, 41, 235, 195, 51,
- 41, 215, 146, 249, 193, 215, 147, 2, 221, 55, 24, 220, 5, 225, 63, 232,
- 199, 24, 2, 62, 49, 232, 199, 167, 2, 62, 49, 51, 232, 199, 254, 27, 51,
- 232, 199, 227, 24, 117, 235, 197, 232, 199, 254, 27, 117, 235, 197, 232,
- 199, 227, 24, 220, 13, 233, 108, 227, 24, 220, 13, 233, 108, 254, 27,
- 232, 199, 167, 226, 245, 232, 199, 254, 27, 232, 199, 24, 2, 231, 37,
- 219, 79, 232, 199, 167, 2, 231, 37, 219, 79, 232, 199, 24, 2, 199, 248,
- 101, 232, 199, 167, 2, 199, 248, 101, 232, 199, 24, 2, 51, 226, 247, 232,
- 199, 24, 2, 215, 153, 232, 199, 24, 2, 51, 215, 153, 3, 214, 228, 2, 215,
- 153, 232, 199, 167, 2, 51, 226, 247, 232, 199, 167, 2, 51, 215, 153, 212,
- 153, 174, 247, 83, 253, 246, 212, 153, 174, 224, 40, 253, 246, 245, 61,
- 5, 2, 62, 55, 240, 97, 2, 62, 49, 216, 169, 199, 252, 60, 2, 51, 71, 90,
- 216, 169, 199, 252, 60, 2, 216, 169, 71, 90, 217, 43, 227, 34, 2, 62, 49,
- 217, 43, 227, 34, 2, 223, 125, 247, 72, 220, 88, 230, 251, 220, 87, 249,
- 139, 2, 62, 49, 245, 61, 2, 253, 132, 254, 57, 123, 211, 211, 2, 249,
- 224, 254, 174, 253, 218, 123, 167, 123, 108, 245, 61, 5, 78, 94, 52, 94,
- 5, 78, 245, 61, 52, 245, 61, 5, 78, 217, 43, 227, 33, 51, 249, 165, 245,
- 62, 117, 249, 134, 245, 61, 220, 102, 133, 249, 134, 245, 61, 220, 102,
- 245, 61, 5, 2, 117, 176, 78, 24, 117, 176, 55, 245, 57, 2, 243, 237, 176,
- 49, 233, 39, 2, 249, 229, 235, 212, 242, 107, 2, 249, 229, 235, 212, 233,
- 39, 2, 224, 158, 152, 49, 242, 107, 2, 224, 158, 152, 49, 233, 39, 167,
- 220, 25, 123, 108, 242, 107, 167, 220, 25, 123, 108, 233, 39, 167, 220,
- 25, 123, 211, 211, 2, 62, 235, 212, 242, 107, 167, 220, 25, 123, 211,
- 211, 2, 62, 235, 212, 233, 39, 167, 220, 25, 123, 211, 211, 2, 62, 49,
- 242, 107, 167, 220, 25, 123, 211, 211, 2, 62, 49, 233, 39, 167, 220, 25,
- 123, 211, 211, 2, 62, 78, 223, 148, 242, 107, 167, 220, 25, 123, 211,
- 211, 2, 62, 78, 233, 70, 233, 39, 167, 253, 219, 242, 107, 167, 253, 219,
- 233, 39, 24, 220, 79, 228, 163, 123, 108, 242, 107, 24, 220, 79, 228,
- 163, 123, 108, 233, 39, 24, 228, 163, 253, 219, 242, 107, 24, 228, 163,
- 253, 219, 233, 39, 78, 246, 65, 123, 78, 242, 106, 242, 107, 78, 246, 65,
- 123, 78, 233, 38, 233, 39, 78, 220, 88, 167, 245, 62, 242, 107, 78, 220,
- 88, 167, 245, 62, 233, 39, 78, 220, 88, 78, 242, 106, 242, 107, 78, 220,
- 88, 78, 233, 38, 233, 39, 78, 242, 107, 78, 246, 65, 245, 62, 242, 107,
- 78, 233, 39, 78, 246, 65, 245, 62, 233, 39, 78, 220, 25, 123, 78, 242,
- 107, 78, 220, 25, 245, 62, 242, 107, 78, 220, 25, 123, 78, 233, 39, 78,
- 220, 25, 245, 62, 220, 25, 123, 211, 211, 167, 233, 38, 220, 25, 123,
- 211, 211, 167, 242, 106, 220, 25, 123, 211, 211, 167, 233, 39, 2, 62,
- 235, 212, 220, 25, 123, 211, 211, 167, 242, 107, 2, 62, 235, 212, 246,
- 65, 123, 211, 211, 167, 233, 38, 246, 65, 123, 211, 211, 167, 242, 106,
- 246, 65, 220, 25, 123, 211, 211, 167, 233, 38, 246, 65, 220, 25, 123,
- 211, 211, 167, 242, 106, 220, 88, 167, 233, 38, 220, 88, 167, 242, 106,
- 220, 88, 78, 233, 39, 78, 245, 61, 52, 220, 88, 78, 242, 107, 78, 245,
- 61, 52, 51, 229, 173, 233, 38, 51, 229, 173, 242, 106, 51, 229, 173, 233,
- 39, 2, 215, 153, 242, 107, 226, 245, 233, 38, 242, 107, 251, 207, 233,
- 38, 233, 39, 249, 193, 251, 7, 249, 34, 242, 107, 249, 193, 251, 7, 249,
- 34, 233, 39, 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 242, 107,
- 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 220, 6, 217, 153, 233,
- 106, 217, 153, 220, 6, 217, 154, 167, 123, 108, 233, 106, 217, 154, 167,
- 123, 108, 245, 61, 5, 2, 251, 37, 49, 225, 83, 78, 220, 79, 245, 61, 52,
- 219, 1, 78, 220, 79, 245, 61, 52, 225, 83, 78, 220, 79, 228, 163, 123,
- 108, 219, 1, 78, 220, 79, 228, 163, 123, 108, 225, 83, 78, 245, 61, 52,
- 219, 1, 78, 245, 61, 52, 225, 83, 78, 228, 163, 123, 108, 219, 1, 78,
- 228, 163, 123, 108, 225, 83, 78, 254, 57, 123, 108, 219, 1, 78, 254, 57,
- 123, 108, 225, 83, 78, 228, 163, 254, 57, 123, 108, 219, 1, 78, 228, 163,
- 254, 57, 123, 108, 51, 225, 82, 51, 219, 0, 219, 9, 2, 247, 74, 218, 222,
- 2, 247, 74, 219, 9, 2, 94, 5, 55, 218, 222, 2, 94, 5, 55, 219, 9, 2, 230,
- 154, 5, 55, 218, 222, 2, 230, 154, 5, 55, 219, 9, 65, 167, 123, 211, 211,
- 2, 62, 49, 218, 222, 65, 167, 123, 211, 211, 2, 62, 49, 219, 9, 65, 78,
- 245, 61, 52, 218, 222, 65, 78, 245, 61, 52, 219, 9, 65, 78, 217, 43, 227,
- 33, 218, 222, 65, 78, 217, 43, 227, 33, 219, 9, 65, 78, 254, 57, 123,
- 108, 218, 222, 65, 78, 254, 57, 123, 108, 219, 9, 65, 78, 228, 163, 123,
- 108, 218, 222, 65, 78, 228, 163, 123, 108, 41, 42, 227, 40, 92, 227, 33,
- 41, 46, 227, 40, 92, 227, 33, 249, 193, 219, 8, 249, 193, 218, 221, 249,
- 193, 219, 9, 167, 123, 108, 249, 193, 218, 222, 167, 123, 108, 219, 9,
- 78, 218, 221, 218, 222, 78, 219, 8, 219, 9, 78, 219, 8, 218, 222, 78,
- 218, 221, 218, 222, 251, 207, 219, 8, 218, 222, 251, 207, 24, 235, 68,
- 251, 7, 248, 102, 2, 219, 8, 245, 127, 65, 227, 35, 246, 57, 225, 180, 2,
- 217, 220, 216, 226, 216, 198, 235, 195, 243, 246, 228, 176, 220, 175, 42,
- 218, 36, 220, 175, 119, 218, 36, 220, 175, 114, 218, 36, 226, 48, 2, 197,
- 71, 252, 60, 216, 169, 46, 216, 57, 51, 71, 252, 60, 42, 216, 57, 71,
- 252, 60, 51, 42, 216, 57, 51, 71, 252, 60, 51, 42, 216, 57, 184, 248,
- 102, 243, 213, 42, 231, 127, 65, 51, 214, 216, 220, 175, 119, 218, 37, 2,
- 226, 247, 220, 175, 114, 218, 37, 2, 215, 153, 220, 175, 114, 218, 37,
- 78, 220, 175, 119, 218, 36, 51, 119, 218, 36, 51, 114, 218, 36, 51, 219,
- 45, 228, 163, 52, 223, 202, 51, 219, 45, 228, 163, 52, 247, 92, 228, 163,
- 247, 127, 2, 223, 202, 229, 182, 220, 23, 71, 232, 243, 2, 249, 229, 49,
- 71, 232, 243, 2, 249, 229, 55, 119, 218, 37, 2, 249, 229, 55, 226, 136,
- 2, 199, 90, 226, 136, 2, 217, 43, 227, 33, 216, 169, 71, 252, 60, 251,
- 167, 223, 241, 216, 169, 71, 252, 60, 2, 199, 90, 216, 169, 249, 165,
- 227, 33, 216, 169, 229, 173, 233, 38, 216, 169, 229, 173, 242, 106, 246,
- 65, 220, 25, 233, 39, 167, 123, 108, 246, 65, 220, 25, 242, 107, 167,
- 123, 108, 216, 169, 219, 232, 251, 167, 223, 241, 233, 108, 216, 169, 71,
- 252, 60, 227, 33, 51, 219, 232, 227, 33, 67, 71, 134, 230, 97, 67, 71,
- 134, 228, 167, 245, 176, 67, 68, 228, 167, 213, 250, 67, 68, 219, 215,
- 245, 176, 67, 68, 219, 215, 213, 250, 67, 68, 42, 46, 67, 68, 132, 83,
- 68, 215, 124, 83, 68, 246, 58, 83, 68, 228, 167, 245, 176, 83, 68, 228,
- 167, 213, 250, 83, 68, 219, 215, 245, 176, 83, 68, 219, 215, 213, 250,
- 83, 68, 42, 46, 83, 68, 114, 119, 83, 68, 95, 76, 2, 217, 30, 246, 57,
- 95, 76, 2, 217, 30, 215, 123, 132, 76, 2, 217, 30, 246, 57, 132, 76, 2,
- 217, 30, 215, 123, 41, 2, 216, 227, 151, 251, 144, 41, 2, 251, 101, 151,
- 251, 144, 41, 2, 215, 131, 46, 247, 207, 151, 251, 144, 41, 2, 232, 163,
- 42, 247, 207, 151, 251, 144, 247, 201, 2, 42, 151, 251, 144, 247, 201, 2,
- 46, 151, 251, 144, 247, 201, 2, 216, 227, 151, 251, 144, 247, 201, 2,
- 251, 101, 151, 251, 144, 246, 72, 219, 166, 83, 233, 108, 219, 166, 67,
- 233, 108, 219, 166, 83, 214, 164, 3, 219, 166, 67, 214, 164, 3, 219, 166,
- 83, 226, 65, 67, 226, 65, 67, 241, 178, 83, 241, 178, 199, 83, 241, 178,
- 83, 233, 108, 249, 228, 83, 231, 147, 247, 200, 67, 231, 147, 247, 200,
- 83, 231, 147, 232, 159, 67, 231, 147, 232, 159, 83, 3, 247, 200, 83, 3,
- 232, 159, 67, 3, 232, 159, 83, 199, 245, 121, 67, 199, 245, 121, 83, 71,
- 245, 121, 67, 71, 245, 121, 42, 76, 2, 3, 249, 228, 133, 132, 253, 162,
- 42, 76, 2, 36, 225, 156, 184, 132, 219, 162, 68, 132, 216, 24, 76, 2, 71,
- 90, 132, 216, 24, 76, 2, 51, 71, 90, 132, 216, 24, 76, 243, 213, 134,
- 132, 216, 24, 216, 169, 248, 102, 68, 132, 76, 2, 246, 72, 219, 79, 132,
- 76, 2, 218, 28, 2, 71, 90, 132, 76, 2, 218, 28, 2, 51, 71, 90, 132, 216,
- 24, 76, 2, 218, 27, 132, 216, 24, 76, 2, 218, 28, 2, 71, 90, 132, 216,
- 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 76, 217, 93, 213, 166, 214, 20,
- 76, 225, 141, 247, 147, 233, 70, 245, 61, 5, 78, 132, 68, 223, 203, 217,
- 43, 227, 34, 78, 132, 68, 132, 76, 78, 223, 203, 254, 57, 123, 108, 95,
- 76, 217, 93, 242, 106, 95, 76, 217, 93, 218, 221, 132, 224, 169, 68, 95,
- 224, 169, 68, 223, 203, 217, 43, 227, 34, 78, 95, 68, 95, 76, 78, 223,
- 203, 254, 57, 123, 108, 217, 43, 227, 34, 78, 132, 68, 132, 76, 78, 254,
- 57, 123, 108, 132, 76, 78, 223, 203, 217, 43, 227, 33, 95, 76, 78, 223,
- 203, 217, 43, 227, 33, 67, 231, 147, 219, 95, 83, 3, 219, 95, 67, 3, 219,
- 95, 83, 223, 144, 226, 65, 67, 223, 144, 226, 65, 107, 233, 108, 249,
- 228, 107, 226, 248, 2, 226, 248, 235, 212, 107, 249, 229, 2, 249, 229,
- 235, 212, 107, 249, 228, 107, 36, 222, 169, 136, 6, 1, 253, 75, 136, 6,
- 1, 251, 46, 136, 6, 1, 214, 230, 136, 6, 1, 242, 161, 136, 6, 1, 247, 94,
- 136, 6, 1, 213, 12, 136, 6, 1, 212, 61, 136, 6, 1, 245, 245, 136, 6, 1,
- 212, 84, 136, 6, 1, 235, 146, 136, 6, 1, 70, 235, 146, 136, 6, 1, 72,
- 136, 6, 1, 247, 112, 136, 6, 1, 234, 245, 136, 6, 1, 232, 215, 136, 6, 1,
- 230, 101, 136, 6, 1, 230, 12, 136, 6, 1, 227, 51, 136, 6, 1, 225, 138,
- 136, 6, 1, 223, 124, 136, 6, 1, 220, 11, 136, 6, 1, 216, 46, 136, 6, 1,
- 215, 171, 136, 6, 1, 243, 216, 136, 6, 1, 241, 184, 136, 6, 1, 227, 3,
- 136, 6, 1, 226, 96, 136, 6, 1, 220, 153, 136, 6, 1, 216, 125, 136, 6, 1,
- 250, 12, 136, 6, 1, 221, 24, 136, 6, 1, 213, 18, 136, 6, 1, 213, 20, 136,
- 6, 1, 213, 47, 136, 6, 1, 219, 185, 159, 136, 6, 1, 212, 203, 136, 6, 1,
- 3, 212, 174, 136, 6, 1, 3, 212, 175, 2, 218, 27, 136, 6, 1, 212, 235,
- 136, 6, 1, 235, 182, 3, 212, 174, 136, 6, 1, 251, 172, 212, 174, 136, 6,
- 1, 235, 182, 251, 172, 212, 174, 136, 6, 1, 244, 51, 136, 6, 1, 235, 144,
- 136, 6, 1, 220, 152, 136, 6, 1, 216, 160, 61, 136, 6, 1, 233, 98, 230,
- 101, 136, 3, 1, 253, 75, 136, 3, 1, 251, 46, 136, 3, 1, 214, 230, 136, 3,
- 1, 242, 161, 136, 3, 1, 247, 94, 136, 3, 1, 213, 12, 136, 3, 1, 212, 61,
- 136, 3, 1, 245, 245, 136, 3, 1, 212, 84, 136, 3, 1, 235, 146, 136, 3, 1,
- 70, 235, 146, 136, 3, 1, 72, 136, 3, 1, 247, 112, 136, 3, 1, 234, 245,
- 136, 3, 1, 232, 215, 136, 3, 1, 230, 101, 136, 3, 1, 230, 12, 136, 3, 1,
- 227, 51, 136, 3, 1, 225, 138, 136, 3, 1, 223, 124, 136, 3, 1, 220, 11,
- 136, 3, 1, 216, 46, 136, 3, 1, 215, 171, 136, 3, 1, 243, 216, 136, 3, 1,
- 241, 184, 136, 3, 1, 227, 3, 136, 3, 1, 226, 96, 136, 3, 1, 220, 153,
- 136, 3, 1, 216, 125, 136, 3, 1, 250, 12, 136, 3, 1, 221, 24, 136, 3, 1,
- 213, 18, 136, 3, 1, 213, 20, 136, 3, 1, 213, 47, 136, 3, 1, 219, 185,
- 159, 136, 3, 1, 212, 203, 136, 3, 1, 3, 212, 174, 136, 3, 1, 3, 212, 175,
- 2, 218, 27, 136, 3, 1, 212, 235, 136, 3, 1, 235, 182, 3, 212, 174, 136,
- 3, 1, 251, 172, 212, 174, 136, 3, 1, 235, 182, 251, 172, 212, 174, 136,
- 3, 1, 244, 51, 136, 3, 1, 235, 144, 136, 3, 1, 220, 152, 136, 3, 1, 216,
- 160, 61, 136, 3, 1, 233, 98, 230, 101, 7, 6, 1, 233, 171, 2, 51, 134, 7,
- 3, 1, 233, 171, 2, 51, 134, 7, 6, 1, 233, 171, 2, 231, 37, 217, 42, 7, 6,
- 1, 226, 230, 2, 90, 7, 6, 1, 224, 113, 2, 218, 27, 7, 3, 1, 118, 2, 90,
- 7, 3, 1, 218, 100, 2, 247, 207, 90, 7, 6, 1, 242, 42, 2, 247, 246, 7, 3,
- 1, 242, 42, 2, 247, 246, 7, 6, 1, 235, 28, 2, 247, 246, 7, 3, 1, 235, 28,
- 2, 247, 246, 7, 6, 1, 212, 153, 2, 247, 246, 7, 3, 1, 212, 153, 2, 247,
- 246, 7, 6, 1, 254, 52, 7, 6, 1, 232, 110, 2, 101, 7, 6, 1, 216, 58, 61,
- 7, 6, 1, 216, 58, 254, 52, 7, 3, 1, 215, 80, 2, 46, 101, 7, 6, 1, 214,
- 83, 2, 101, 7, 3, 1, 214, 83, 2, 101, 7, 3, 1, 215, 80, 2, 249, 41, 7, 6,
- 1, 151, 242, 41, 7, 3, 1, 151, 242, 41, 7, 3, 1, 218, 25, 226, 9, 7, 3,
- 1, 191, 2, 228, 161, 7, 3, 1, 216, 58, 224, 113, 2, 218, 27, 7, 3, 1,
- 157, 2, 115, 223, 131, 235, 212, 7, 1, 3, 6, 216, 58, 74, 7, 219, 10, 3,
- 1, 235, 142, 59, 1, 6, 215, 79, 7, 6, 1, 223, 4, 2, 218, 195, 218, 27, 7,
- 6, 1, 212, 153, 2, 218, 195, 218, 27, 79, 6, 1, 254, 73, 79, 3, 1, 254,
- 73, 79, 6, 1, 214, 151, 79, 3, 1, 214, 151, 79, 6, 1, 243, 83, 79, 3, 1,
- 243, 83, 79, 6, 1, 248, 136, 79, 3, 1, 248, 136, 79, 6, 1, 245, 151, 79,
- 3, 1, 245, 151, 79, 6, 1, 219, 220, 79, 3, 1, 219, 220, 79, 6, 1, 212,
- 94, 79, 3, 1, 212, 94, 79, 6, 1, 241, 231, 79, 3, 1, 241, 231, 79, 6, 1,
- 217, 130, 79, 3, 1, 217, 130, 79, 6, 1, 240, 109, 79, 3, 1, 240, 109, 79,
- 6, 1, 234, 232, 79, 3, 1, 234, 232, 79, 6, 1, 233, 96, 79, 3, 1, 233, 96,
- 79, 6, 1, 231, 42, 79, 3, 1, 231, 42, 79, 6, 1, 229, 64, 79, 3, 1, 229,
- 64, 79, 6, 1, 233, 242, 79, 3, 1, 233, 242, 79, 6, 1, 75, 79, 3, 1, 75,
- 79, 6, 1, 225, 240, 79, 3, 1, 225, 240, 79, 6, 1, 223, 112, 79, 3, 1,
- 223, 112, 79, 6, 1, 220, 91, 79, 3, 1, 220, 91, 79, 6, 1, 217, 248, 79,
- 3, 1, 217, 248, 79, 6, 1, 215, 196, 79, 3, 1, 215, 196, 79, 6, 1, 244,
- 90, 79, 3, 1, 244, 90, 79, 6, 1, 234, 118, 79, 3, 1, 234, 118, 79, 6, 1,
- 225, 46, 79, 3, 1, 225, 46, 79, 6, 1, 227, 44, 79, 3, 1, 227, 44, 79, 6,
- 1, 247, 205, 254, 78, 79, 3, 1, 247, 205, 254, 78, 79, 6, 1, 53, 79, 254,
- 103, 79, 3, 1, 53, 79, 254, 103, 79, 6, 1, 249, 55, 245, 151, 79, 3, 1,
- 249, 55, 245, 151, 79, 6, 1, 247, 205, 234, 232, 79, 3, 1, 247, 205, 234,
- 232, 79, 6, 1, 247, 205, 229, 64, 79, 3, 1, 247, 205, 229, 64, 79, 6, 1,
- 249, 55, 229, 64, 79, 3, 1, 249, 55, 229, 64, 79, 6, 1, 53, 79, 227, 44,
- 79, 3, 1, 53, 79, 227, 44, 79, 6, 1, 222, 161, 79, 3, 1, 222, 161, 79, 6,
- 1, 249, 68, 220, 235, 79, 3, 1, 249, 68, 220, 235, 79, 6, 1, 53, 79, 220,
- 235, 79, 3, 1, 53, 79, 220, 235, 79, 6, 1, 53, 79, 245, 40, 79, 3, 1, 53,
- 79, 245, 40, 79, 6, 1, 254, 90, 234, 123, 79, 3, 1, 254, 90, 234, 123,
- 79, 6, 1, 247, 205, 241, 32, 79, 3, 1, 247, 205, 241, 32, 79, 6, 1, 53,
- 79, 241, 32, 79, 3, 1, 53, 79, 241, 32, 79, 6, 1, 53, 79, 159, 79, 3, 1,
- 53, 79, 159, 79, 6, 1, 233, 170, 159, 79, 3, 1, 233, 170, 159, 79, 6, 1,
- 53, 79, 241, 201, 79, 3, 1, 53, 79, 241, 201, 79, 6, 1, 53, 79, 241, 234,
- 79, 3, 1, 53, 79, 241, 234, 79, 6, 1, 53, 79, 243, 78, 79, 3, 1, 53, 79,
- 243, 78, 79, 6, 1, 53, 79, 247, 115, 79, 3, 1, 53, 79, 247, 115, 79, 6,
- 1, 53, 79, 220, 202, 79, 3, 1, 53, 79, 220, 202, 79, 6, 1, 53, 228, 63,
- 220, 202, 79, 3, 1, 53, 228, 63, 220, 202, 79, 6, 1, 53, 228, 63, 229,
- 113, 79, 3, 1, 53, 228, 63, 229, 113, 79, 6, 1, 53, 228, 63, 228, 10, 79,
- 3, 1, 53, 228, 63, 228, 10, 79, 6, 1, 53, 228, 63, 214, 21, 79, 3, 1, 53,
- 228, 63, 214, 21, 79, 16, 234, 250, 79, 16, 231, 43, 223, 112, 79, 16,
- 225, 241, 223, 112, 79, 16, 219, 87, 79, 16, 217, 249, 223, 112, 79, 16,
- 234, 119, 223, 112, 79, 16, 220, 203, 220, 91, 79, 6, 1, 249, 55, 220,
- 235, 79, 3, 1, 249, 55, 220, 235, 79, 6, 1, 249, 55, 243, 78, 79, 3, 1,
- 249, 55, 243, 78, 79, 37, 229, 65, 49, 79, 37, 219, 179, 253, 139, 79,
- 37, 219, 179, 233, 45, 79, 53, 228, 63, 243, 200, 219, 69, 79, 53, 228,
- 63, 247, 149, 224, 158, 77, 79, 53, 228, 63, 235, 234, 224, 158, 77, 79,
- 53, 228, 63, 214, 218, 247, 124, 79, 243, 228, 122, 242, 9, 79, 243, 200,
- 219, 69, 79, 230, 194, 247, 124, 100, 3, 1, 254, 32, 100, 3, 1, 252, 71,
- 100, 3, 1, 243, 82, 100, 3, 1, 247, 82, 100, 3, 1, 245, 108, 100, 3, 1,
- 214, 141, 100, 3, 1, 212, 82, 100, 3, 1, 218, 11, 100, 3, 1, 235, 251,
- 100, 3, 1, 234, 239, 100, 3, 1, 233, 104, 100, 3, 1, 231, 248, 100, 3, 1,
- 230, 15, 100, 3, 1, 227, 62, 100, 3, 1, 226, 145, 100, 3, 1, 212, 71,
- 100, 3, 1, 224, 61, 100, 3, 1, 222, 159, 100, 3, 1, 218, 1, 100, 3, 1,
- 215, 160, 100, 3, 1, 226, 16, 100, 3, 1, 234, 127, 100, 3, 1, 242, 217,
- 100, 3, 1, 224, 217, 100, 3, 1, 220, 200, 100, 3, 1, 250, 34, 100, 3, 1,
- 250, 195, 100, 3, 1, 235, 103, 100, 3, 1, 249, 233, 100, 3, 1, 250, 79,
- 100, 3, 1, 213, 151, 100, 3, 1, 235, 113, 100, 3, 1, 242, 24, 100, 3, 1,
- 241, 222, 100, 3, 1, 241, 160, 100, 3, 1, 214, 6, 100, 3, 1, 241, 243,
- 100, 3, 1, 241, 51, 217, 62, 1, 186, 217, 62, 1, 213, 87, 217, 62, 1,
- 213, 86, 217, 62, 1, 213, 76, 217, 62, 1, 213, 74, 217, 62, 1, 251, 209,
- 254, 176, 213, 70, 217, 62, 1, 213, 70, 217, 62, 1, 213, 84, 217, 62, 1,
- 213, 81, 217, 62, 1, 213, 83, 217, 62, 1, 213, 82, 217, 62, 1, 213, 3,
- 217, 62, 1, 213, 78, 217, 62, 1, 213, 68, 217, 62, 1, 216, 79, 213, 68,
- 217, 62, 1, 213, 65, 217, 62, 1, 213, 72, 217, 62, 1, 251, 209, 254, 176,
- 213, 72, 217, 62, 1, 216, 79, 213, 72, 217, 62, 1, 213, 71, 217, 62, 1,
- 213, 91, 217, 62, 1, 213, 66, 217, 62, 1, 216, 79, 213, 66, 217, 62, 1,
- 213, 56, 217, 62, 1, 216, 79, 213, 56, 217, 62, 1, 212, 255, 217, 62, 1,
- 213, 40, 217, 62, 1, 254, 112, 213, 40, 217, 62, 1, 216, 79, 213, 40,
- 217, 62, 1, 213, 64, 217, 62, 1, 213, 63, 217, 62, 1, 213, 60, 217, 62,
- 1, 216, 79, 213, 73, 217, 62, 1, 216, 79, 213, 58, 217, 62, 1, 213, 57,
- 217, 62, 1, 212, 203, 217, 62, 1, 213, 54, 217, 62, 1, 213, 53, 217, 62,
- 1, 213, 75, 217, 62, 1, 216, 79, 213, 75, 217, 62, 1, 253, 79, 213, 75,
- 217, 62, 1, 213, 52, 217, 62, 1, 213, 50, 217, 62, 1, 213, 51, 217, 62,
- 1, 213, 49, 217, 62, 1, 213, 48, 217, 62, 1, 213, 85, 217, 62, 1, 213,
- 46, 217, 62, 1, 213, 45, 217, 62, 1, 213, 44, 217, 62, 1, 213, 43, 217,
- 62, 1, 213, 41, 217, 62, 1, 217, 241, 213, 41, 217, 62, 1, 213, 39, 217,
- 62, 59, 1, 233, 149, 77, 217, 62, 221, 58, 77, 217, 62, 249, 133, 235,
- 66, 28, 4, 232, 207, 28, 4, 230, 230, 28, 4, 223, 110, 28, 4, 219, 241,
- 28, 4, 220, 186, 28, 4, 251, 127, 28, 4, 216, 252, 28, 4, 249, 174, 28,
- 4, 228, 183, 28, 4, 227, 252, 28, 4, 242, 156, 227, 120, 28, 4, 212, 15,
- 28, 4, 247, 97, 28, 4, 248, 55, 28, 4, 235, 70, 28, 4, 217, 108, 28, 4,
- 250, 22, 28, 4, 225, 252, 28, 4, 225, 149, 28, 4, 242, 231, 28, 4, 242,
- 227, 28, 4, 242, 228, 28, 4, 242, 229, 28, 4, 219, 157, 28, 4, 219, 117,
- 28, 4, 219, 128, 28, 4, 219, 156, 28, 4, 219, 132, 28, 4, 219, 133, 28,
- 4, 219, 121, 28, 4, 250, 146, 28, 4, 250, 126, 28, 4, 250, 128, 28, 4,
- 250, 145, 28, 4, 250, 143, 28, 4, 250, 144, 28, 4, 250, 127, 28, 4, 211,
- 242, 28, 4, 211, 222, 28, 4, 211, 233, 28, 4, 211, 241, 28, 4, 211, 236,
- 28, 4, 211, 237, 28, 4, 211, 225, 28, 4, 250, 142, 28, 4, 250, 129, 28,
- 4, 250, 131, 28, 4, 250, 141, 28, 4, 250, 139, 28, 4, 250, 140, 28, 4,
- 250, 130, 28, 4, 224, 125, 28, 4, 224, 115, 28, 4, 224, 121, 28, 4, 224,
- 124, 28, 4, 224, 122, 28, 4, 224, 123, 28, 4, 224, 120, 28, 4, 233, 181,
- 28, 4, 233, 173, 28, 4, 233, 176, 28, 4, 233, 180, 28, 4, 233, 177, 28,
- 4, 233, 178, 28, 4, 233, 174, 28, 4, 213, 118, 28, 4, 213, 108, 28, 4,
- 213, 114, 28, 4, 213, 117, 28, 4, 213, 115, 28, 4, 213, 116, 28, 4, 213,
- 113, 28, 4, 242, 52, 28, 4, 242, 43, 28, 4, 242, 46, 28, 4, 242, 51, 28,
- 4, 242, 48, 28, 4, 242, 49, 28, 4, 242, 45, 37, 33, 1, 251, 251, 37, 33,
- 1, 214, 232, 37, 33, 1, 242, 212, 37, 33, 1, 248, 41, 37, 33, 1, 212, 67,
- 37, 33, 1, 212, 87, 37, 33, 1, 181, 37, 33, 1, 245, 131, 37, 33, 1, 245,
- 117, 37, 33, 1, 245, 108, 37, 33, 1, 75, 37, 33, 1, 226, 96, 37, 33, 1,
- 245, 55, 37, 33, 1, 245, 45, 37, 33, 1, 217, 229, 37, 33, 1, 159, 37, 33,
- 1, 216, 136, 37, 33, 1, 250, 67, 37, 33, 1, 221, 24, 37, 33, 1, 220, 245,
- 37, 33, 1, 244, 51, 37, 33, 1, 245, 44, 37, 33, 1, 61, 37, 33, 1, 236,
- 55, 37, 33, 1, 247, 113, 37, 33, 1, 230, 210, 215, 175, 37, 33, 1, 213,
- 49, 37, 33, 1, 212, 203, 37, 33, 1, 235, 181, 61, 37, 33, 1, 232, 221,
- 212, 174, 37, 33, 1, 251, 172, 212, 174, 37, 33, 1, 235, 181, 251, 172,
- 212, 174, 46, 254, 19, 219, 5, 231, 217, 46, 254, 19, 246, 72, 219, 5,
- 231, 217, 42, 219, 5, 125, 46, 219, 5, 125, 42, 246, 72, 219, 5, 125, 46,
- 246, 72, 219, 5, 125, 224, 48, 235, 199, 231, 217, 224, 48, 246, 72, 235,
- 199, 231, 217, 246, 72, 216, 199, 231, 217, 42, 216, 199, 125, 46, 216,
- 199, 125, 224, 48, 219, 166, 42, 224, 48, 227, 64, 125, 46, 224, 48, 227,
- 64, 125, 245, 166, 249, 97, 226, 141, 243, 247, 226, 141, 223, 202, 243,
- 247, 226, 141, 240, 157, 246, 72, 227, 115, 246, 58, 254, 28, 215, 124,
- 254, 28, 246, 72, 223, 144, 254, 18, 51, 227, 112, 240, 160, 235, 191,
- 235, 198, 226, 186, 251, 81, 240, 161, 2, 247, 209, 217, 43, 2, 223, 131,
- 49, 42, 115, 226, 133, 125, 46, 115, 226, 133, 125, 217, 43, 2, 62, 49,
- 217, 43, 2, 62, 55, 42, 71, 252, 60, 2, 224, 152, 46, 71, 252, 60, 2,
- 224, 152, 216, 227, 42, 151, 125, 216, 227, 46, 151, 125, 251, 101, 42,
- 151, 125, 251, 101, 46, 151, 125, 42, 220, 113, 111, 125, 46, 220, 113,
- 111, 125, 42, 51, 226, 131, 46, 51, 226, 131, 117, 176, 110, 122, 62,
- 225, 26, 122, 62, 110, 117, 176, 225, 26, 91, 243, 237, 62, 225, 26, 244,
- 50, 62, 77, 223, 202, 224, 158, 77, 71, 217, 42, 223, 131, 225, 144, 213,
- 196, 221, 58, 231, 37, 247, 74, 9, 34, 223, 227, 9, 34, 249, 203, 9, 34,
- 222, 95, 116, 9, 34, 222, 95, 109, 9, 34, 222, 95, 166, 9, 34, 226, 43,
- 9, 34, 251, 89, 9, 34, 218, 40, 9, 34, 234, 42, 116, 9, 34, 234, 42, 109,
- 9, 34, 247, 122, 9, 34, 222, 98, 9, 34, 3, 116, 9, 34, 3, 109, 9, 34,
- 233, 121, 116, 9, 34, 233, 121, 109, 9, 34, 233, 121, 166, 9, 34, 233,
- 121, 163, 9, 34, 219, 252, 9, 34, 217, 98, 9, 34, 219, 250, 116, 9, 34,
- 219, 250, 109, 9, 34, 241, 212, 116, 9, 34, 241, 212, 109, 9, 34, 241,
- 254, 9, 34, 224, 39, 9, 34, 250, 19, 9, 34, 218, 238, 9, 34, 230, 198, 9,
- 34, 248, 39, 9, 34, 230, 190, 9, 34, 249, 218, 9, 34, 214, 25, 116, 9,
- 34, 214, 25, 109, 9, 34, 244, 65, 9, 34, 226, 106, 116, 9, 34, 226, 106,
- 109, 9, 34, 220, 86, 151, 216, 194, 216, 146, 9, 34, 249, 84, 9, 34, 247,
- 90, 9, 34, 235, 135, 9, 34, 251, 122, 65, 249, 187, 9, 34, 244, 239, 9,
- 34, 219, 181, 116, 9, 34, 219, 181, 109, 9, 34, 252, 73, 9, 34, 220, 93,
- 9, 34, 250, 249, 220, 93, 9, 34, 229, 172, 116, 9, 34, 229, 172, 109, 9,
- 34, 229, 172, 166, 9, 34, 229, 172, 163, 9, 34, 231, 111, 9, 34, 220,
- 237, 9, 34, 224, 45, 9, 34, 245, 4, 9, 34, 227, 75, 9, 34, 251, 61, 116,
- 9, 34, 251, 61, 109, 9, 34, 231, 151, 9, 34, 230, 193, 9, 34, 242, 117,
- 116, 9, 34, 242, 117, 109, 9, 34, 242, 117, 166, 9, 34, 217, 60, 9, 34,
- 249, 186, 9, 34, 213, 250, 116, 9, 34, 213, 250, 109, 9, 34, 250, 249,
- 222, 89, 9, 34, 220, 86, 240, 235, 9, 34, 240, 235, 9, 34, 250, 249, 219,
- 190, 9, 34, 250, 249, 220, 232, 9, 34, 244, 1, 9, 34, 250, 249, 250, 160,
- 9, 34, 220, 86, 214, 41, 9, 34, 214, 42, 116, 9, 34, 214, 42, 109, 9, 34,
- 249, 220, 9, 34, 250, 249, 242, 142, 9, 34, 184, 116, 9, 34, 184, 109, 9,
- 34, 250, 249, 232, 190, 9, 34, 250, 249, 243, 64, 9, 34, 230, 189, 116,
- 9, 34, 230, 189, 109, 9, 34, 224, 50, 9, 34, 251, 130, 9, 34, 250, 249,
- 218, 7, 233, 76, 9, 34, 250, 249, 233, 77, 9, 34, 250, 249, 213, 224, 9,
- 34, 250, 249, 244, 15, 9, 34, 245, 174, 116, 9, 34, 245, 174, 109, 9, 34,
- 245, 174, 166, 9, 34, 250, 249, 245, 173, 9, 34, 241, 219, 9, 34, 250,
- 249, 240, 232, 9, 34, 251, 119, 9, 34, 242, 198, 9, 34, 250, 249, 244,
- 59, 9, 34, 250, 249, 251, 160, 9, 34, 250, 249, 222, 172, 9, 34, 220, 86,
- 213, 243, 9, 34, 220, 86, 213, 32, 9, 34, 250, 249, 243, 214, 9, 34, 235,
- 141, 245, 8, 9, 34, 250, 249, 245, 8, 9, 34, 235, 141, 216, 228, 9, 34,
- 250, 249, 216, 228, 9, 34, 235, 141, 246, 50, 9, 34, 250, 249, 246, 50,
- 9, 34, 216, 55, 9, 34, 235, 141, 216, 55, 9, 34, 250, 249, 216, 55, 57,
- 34, 116, 57, 34, 232, 242, 57, 34, 247, 74, 57, 34, 220, 23, 57, 34, 222,
- 94, 57, 34, 101, 57, 34, 109, 57, 34, 233, 9, 57, 34, 231, 248, 57, 34,
- 233, 57, 57, 34, 245, 88, 57, 34, 195, 57, 34, 119, 251, 89, 57, 34, 249,
- 86, 57, 34, 240, 104, 57, 34, 218, 40, 57, 34, 227, 40, 251, 89, 57, 34,
- 234, 41, 57, 34, 225, 104, 57, 34, 213, 190, 57, 34, 219, 175, 57, 34,
- 46, 227, 40, 251, 89, 57, 34, 241, 161, 245, 103, 57, 34, 217, 200, 57,
- 34, 247, 122, 57, 34, 222, 98, 57, 34, 249, 203, 57, 34, 225, 65, 57, 34,
- 254, 120, 57, 34, 230, 180, 57, 34, 245, 103, 57, 34, 245, 179, 57, 34,
- 222, 118, 57, 34, 242, 150, 57, 34, 242, 151, 220, 9, 57, 34, 245, 7, 57,
- 34, 251, 171, 57, 34, 213, 208, 57, 34, 250, 38, 57, 34, 223, 98, 57, 34,
- 235, 247, 57, 34, 220, 7, 57, 34, 233, 120, 57, 34, 249, 95, 57, 34, 219,
- 169, 57, 34, 230, 185, 57, 34, 223, 121, 57, 34, 213, 193, 57, 34, 227,
- 56, 57, 34, 216, 61, 57, 34, 246, 35, 57, 34, 220, 175, 217, 98, 57, 34,
- 246, 72, 249, 203, 57, 34, 184, 219, 48, 57, 34, 117, 241, 249, 57, 34,
- 220, 180, 57, 34, 251, 95, 57, 34, 219, 249, 57, 34, 251, 65, 57, 34,
- 219, 78, 57, 34, 241, 211, 57, 34, 242, 10, 57, 34, 247, 77, 57, 34, 241,
- 254, 57, 34, 251, 81, 57, 34, 224, 39, 57, 34, 222, 106, 57, 34, 247,
- 151, 57, 34, 253, 84, 57, 34, 219, 166, 57, 34, 228, 162, 57, 34, 218,
- 238, 57, 34, 222, 129, 57, 34, 230, 198, 57, 34, 216, 193, 57, 34, 233,
- 145, 57, 34, 219, 69, 57, 34, 248, 39, 57, 34, 214, 5, 57, 34, 247, 100,
- 228, 162, 57, 34, 249, 154, 57, 34, 243, 194, 57, 34, 249, 214, 57, 34,
- 219, 82, 57, 34, 214, 24, 57, 34, 244, 65, 57, 34, 249, 211, 57, 34, 244,
- 129, 57, 34, 51, 213, 166, 57, 34, 151, 216, 194, 216, 146, 57, 34, 220,
- 17, 57, 34, 244, 139, 57, 34, 249, 84, 57, 34, 247, 90, 57, 34, 225, 62,
- 57, 34, 235, 135, 57, 34, 231, 131, 57, 34, 217, 41, 57, 34, 218, 190,
- 57, 34, 233, 3, 57, 34, 215, 103, 57, 34, 244, 89, 57, 34, 251, 122, 65,
- 249, 187, 57, 34, 220, 114, 57, 34, 246, 72, 217, 195, 57, 34, 213, 238,
- 57, 34, 220, 31, 57, 34, 247, 139, 57, 34, 244, 239, 57, 34, 219, 193,
- 57, 34, 68, 57, 34, 219, 71, 57, 34, 219, 180, 57, 34, 216, 212, 57, 34,
- 242, 123, 57, 34, 250, 151, 57, 34, 219, 99, 57, 34, 252, 73, 57, 34,
- 223, 184, 57, 34, 220, 93, 57, 34, 235, 130, 57, 34, 229, 171, 57, 34,
- 220, 237, 57, 34, 244, 118, 57, 34, 227, 75, 57, 34, 254, 27, 57, 34,
- 225, 162, 57, 34, 245, 183, 57, 34, 251, 60, 57, 34, 231, 151, 57, 34,
- 230, 252, 57, 34, 221, 76, 57, 34, 253, 167, 57, 34, 230, 193, 57, 34,
- 216, 232, 57, 34, 227, 31, 57, 34, 251, 124, 57, 34, 219, 67, 57, 34,
- 249, 163, 57, 34, 242, 116, 57, 34, 217, 60, 57, 34, 235, 214, 57, 34,
- 251, 134, 57, 34, 214, 42, 245, 103, 57, 34, 249, 186, 57, 34, 213, 249,
- 57, 34, 222, 89, 57, 34, 240, 235, 57, 34, 219, 190, 57, 34, 214, 254,
- 57, 34, 251, 248, 57, 34, 225, 205, 57, 34, 252, 92, 57, 34, 220, 232,
- 57, 34, 224, 3, 57, 34, 223, 37, 57, 34, 244, 1, 57, 34, 251, 123, 57,
- 34, 250, 160, 57, 34, 251, 149, 57, 34, 230, 195, 57, 34, 214, 41, 57,
- 34, 249, 220, 57, 34, 213, 221, 57, 34, 247, 132, 57, 34, 214, 142, 57,
- 34, 242, 142, 57, 34, 232, 190, 57, 34, 243, 64, 57, 34, 230, 188, 57,
- 34, 220, 22, 57, 34, 220, 175, 218, 26, 251, 160, 57, 34, 224, 50, 57,
- 34, 251, 130, 57, 34, 213, 185, 57, 34, 244, 158, 57, 34, 233, 76, 57,
- 34, 218, 7, 233, 76, 57, 34, 233, 72, 57, 34, 219, 217, 57, 34, 233, 77,
- 57, 34, 213, 224, 57, 34, 244, 15, 57, 34, 245, 173, 57, 34, 241, 219,
- 57, 34, 243, 226, 57, 34, 240, 232, 57, 34, 251, 119, 57, 34, 218, 14,
- 57, 34, 242, 16, 57, 34, 244, 82, 57, 34, 222, 197, 213, 221, 57, 34,
- 250, 153, 57, 34, 242, 198, 57, 34, 244, 59, 57, 34, 251, 160, 57, 34,
- 222, 172, 57, 34, 248, 25, 57, 34, 213, 243, 57, 34, 241, 194, 57, 34,
- 213, 32, 57, 34, 231, 5, 57, 34, 251, 144, 57, 34, 245, 113, 57, 34, 243,
- 214, 57, 34, 216, 167, 57, 34, 246, 37, 57, 34, 224, 33, 57, 34, 228,
- 164, 57, 34, 245, 8, 57, 34, 216, 228, 57, 34, 246, 50, 57, 34, 216, 55,
- 57, 34, 244, 17, 105, 247, 244, 137, 42, 211, 211, 223, 148, 105, 247,
- 244, 137, 78, 211, 211, 55, 105, 247, 244, 137, 42, 211, 211, 231, 37,
- 24, 223, 148, 105, 247, 244, 137, 78, 211, 211, 231, 37, 24, 55, 105,
- 247, 244, 137, 243, 200, 218, 210, 105, 247, 244, 137, 218, 211, 243,
- 213, 49, 105, 247, 244, 137, 218, 211, 243, 213, 55, 105, 247, 244, 137,
- 218, 211, 243, 213, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215,
- 131, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215, 131, 223, 148,
- 105, 247, 244, 137, 218, 211, 243, 213, 232, 163, 233, 70, 105, 247, 244,
- 137, 226, 246, 105, 219, 206, 105, 249, 157, 105, 243, 200, 219, 69, 247,
- 129, 77, 235, 131, 235, 233, 219, 98, 87, 105, 235, 156, 77, 105, 249,
- 189, 77, 105, 50, 212, 79, 42, 254, 19, 125, 46, 254, 19, 125, 42, 51,
- 254, 19, 125, 46, 51, 254, 19, 125, 42, 249, 100, 125, 46, 249, 100, 125,
- 42, 67, 249, 100, 125, 46, 67, 249, 100, 125, 42, 83, 233, 44, 125, 46,
- 83, 233, 44, 125, 225, 117, 77, 243, 8, 77, 42, 216, 219, 220, 233, 125,
- 46, 216, 219, 220, 233, 125, 42, 67, 233, 44, 125, 46, 67, 233, 44, 125,
- 42, 67, 216, 219, 220, 233, 125, 46, 67, 216, 219, 220, 233, 125, 42, 67,
- 41, 125, 46, 67, 41, 125, 214, 20, 248, 101, 223, 202, 51, 225, 72, 224,
- 143, 77, 51, 225, 72, 224, 143, 77, 115, 51, 225, 72, 224, 143, 77, 225,
- 117, 152, 244, 158, 241, 247, 228, 54, 116, 241, 247, 228, 54, 109, 241,
- 247, 228, 54, 166, 241, 247, 228, 54, 163, 241, 247, 228, 54, 180, 241,
- 247, 228, 54, 189, 241, 247, 228, 54, 198, 241, 247, 228, 54, 195, 241,
- 247, 228, 54, 200, 105, 233, 29, 160, 77, 105, 223, 125, 160, 77, 105,
- 247, 251, 160, 77, 105, 245, 87, 160, 77, 23, 220, 81, 62, 160, 77, 23,
- 51, 62, 160, 77, 214, 16, 248, 101, 71, 234, 238, 223, 228, 77, 71, 234,
- 238, 223, 228, 2, 214, 116, 219, 218, 77, 71, 234, 238, 223, 228, 152,
- 215, 131, 242, 9, 71, 234, 238, 223, 228, 2, 214, 116, 219, 218, 152,
- 215, 131, 242, 9, 71, 234, 238, 223, 228, 152, 232, 163, 242, 9, 36, 225,
- 117, 77, 105, 201, 232, 243, 244, 115, 221, 58, 87, 241, 247, 228, 54,
- 217, 200, 241, 247, 228, 54, 216, 38, 241, 247, 228, 54, 217, 115, 71,
- 105, 235, 156, 77, 231, 203, 77, 226, 127, 254, 49, 77, 105, 43, 235,
- 235, 105, 151, 244, 75, 219, 206, 142, 1, 3, 61, 142, 1, 61, 142, 1, 3,
- 72, 142, 1, 72, 142, 1, 3, 69, 142, 1, 69, 142, 1, 3, 74, 142, 1, 74,
- 142, 1, 3, 75, 142, 1, 75, 142, 1, 181, 142, 1, 243, 110, 142, 1, 234,
- 101, 142, 1, 242, 190, 142, 1, 233, 238, 142, 1, 242, 92, 142, 1, 234,
- 188, 142, 1, 243, 38, 142, 1, 234, 37, 142, 1, 242, 150, 142, 1, 222,
- 202, 142, 1, 212, 109, 142, 1, 220, 117, 142, 1, 212, 37, 142, 1, 219,
- 27, 142, 1, 212, 8, 142, 1, 222, 100, 142, 1, 212, 87, 142, 1, 219, 242,
- 142, 1, 212, 16, 142, 1, 218, 52, 142, 1, 248, 164, 142, 1, 217, 71, 142,
- 1, 247, 211, 142, 1, 3, 216, 82, 142, 1, 216, 82, 142, 1, 246, 33, 142,
- 1, 217, 229, 142, 1, 248, 41, 142, 1, 108, 142, 1, 247, 99, 142, 1, 205,
- 142, 1, 229, 64, 142, 1, 228, 92, 142, 1, 229, 187, 142, 1, 228, 185,
- 142, 1, 159, 142, 1, 252, 107, 142, 1, 193, 142, 1, 241, 165, 142, 1,
- 251, 184, 142, 1, 225, 240, 142, 1, 240, 212, 142, 1, 251, 54, 142, 1,
- 225, 35, 142, 1, 241, 222, 142, 1, 251, 251, 142, 1, 226, 96, 142, 1,
- 241, 54, 142, 1, 251, 128, 142, 1, 225, 150, 142, 1, 188, 142, 1, 231,
- 42, 142, 1, 230, 172, 142, 1, 231, 156, 142, 1, 230, 231, 142, 1, 3, 186,
- 142, 1, 186, 142, 1, 3, 212, 203, 142, 1, 212, 203, 142, 1, 3, 212, 235,
- 142, 1, 212, 235, 142, 1, 203, 142, 1, 223, 188, 142, 1, 223, 51, 142, 1,
- 224, 21, 142, 1, 223, 112, 142, 1, 3, 214, 49, 142, 1, 214, 49, 142, 1,
- 213, 235, 142, 1, 214, 6, 142, 1, 213, 214, 142, 1, 204, 142, 1, 214, 99,
- 142, 1, 3, 181, 142, 1, 3, 234, 188, 37, 234, 206, 214, 116, 219, 218,
- 77, 37, 234, 206, 221, 75, 219, 218, 77, 234, 206, 214, 116, 219, 218,
- 77, 234, 206, 221, 75, 219, 218, 77, 142, 235, 156, 77, 142, 214, 116,
- 235, 156, 77, 142, 247, 173, 212, 216, 234, 206, 51, 240, 160, 56, 1, 3,
- 61, 56, 1, 61, 56, 1, 3, 72, 56, 1, 72, 56, 1, 3, 69, 56, 1, 69, 56, 1,
- 3, 74, 56, 1, 74, 56, 1, 3, 75, 56, 1, 75, 56, 1, 181, 56, 1, 243, 110,
- 56, 1, 234, 101, 56, 1, 242, 190, 56, 1, 233, 238, 56, 1, 242, 92, 56, 1,
- 234, 188, 56, 1, 243, 38, 56, 1, 234, 37, 56, 1, 242, 150, 56, 1, 222,
- 202, 56, 1, 212, 109, 56, 1, 220, 117, 56, 1, 212, 37, 56, 1, 219, 27,
- 56, 1, 212, 8, 56, 1, 222, 100, 56, 1, 212, 87, 56, 1, 219, 242, 56, 1,
- 212, 16, 56, 1, 218, 52, 56, 1, 248, 164, 56, 1, 217, 71, 56, 1, 247,
- 211, 56, 1, 3, 216, 82, 56, 1, 216, 82, 56, 1, 246, 33, 56, 1, 217, 229,
- 56, 1, 248, 41, 56, 1, 108, 56, 1, 247, 99, 56, 1, 205, 56, 1, 229, 64,
- 56, 1, 228, 92, 56, 1, 229, 187, 56, 1, 228, 185, 56, 1, 159, 56, 1, 252,
- 107, 56, 1, 193, 56, 1, 241, 165, 56, 1, 251, 184, 56, 1, 225, 240, 56,
- 1, 240, 212, 56, 1, 251, 54, 56, 1, 225, 35, 56, 1, 241, 222, 56, 1, 251,
- 251, 56, 1, 226, 96, 56, 1, 241, 54, 56, 1, 251, 128, 56, 1, 225, 150,
- 56, 1, 188, 56, 1, 231, 42, 56, 1, 230, 172, 56, 1, 231, 156, 56, 1, 230,
- 231, 56, 1, 3, 186, 56, 1, 186, 56, 1, 3, 212, 203, 56, 1, 212, 203, 56,
- 1, 3, 212, 235, 56, 1, 212, 235, 56, 1, 203, 56, 1, 223, 188, 56, 1, 223,
- 51, 56, 1, 224, 21, 56, 1, 223, 112, 56, 1, 3, 214, 49, 56, 1, 214, 49,
- 56, 1, 213, 235, 56, 1, 214, 6, 56, 1, 213, 214, 56, 1, 204, 56, 1, 214,
- 99, 56, 1, 3, 181, 56, 1, 3, 234, 188, 56, 1, 215, 1, 56, 1, 214, 154,
- 56, 1, 214, 232, 56, 1, 214, 119, 56, 231, 37, 247, 74, 234, 206, 225,
- 57, 219, 218, 77, 56, 235, 156, 77, 56, 214, 116, 235, 156, 77, 56, 247,
- 173, 234, 8, 202, 1, 253, 74, 202, 1, 226, 229, 202, 1, 183, 202, 1, 244,
- 230, 202, 1, 249, 3, 202, 1, 218, 99, 202, 1, 204, 202, 1, 150, 202, 1,
- 243, 177, 202, 1, 235, 27, 202, 1, 242, 41, 202, 1, 235, 142, 202, 1,
- 224, 240, 202, 1, 213, 166, 202, 1, 212, 76, 202, 1, 250, 93, 202, 1,
- 221, 26, 202, 1, 149, 202, 1, 212, 152, 202, 1, 250, 252, 202, 1, 197,
- 202, 1, 61, 202, 1, 75, 202, 1, 74, 202, 1, 245, 154, 202, 1, 254, 108,
- 202, 1, 245, 152, 202, 1, 253, 108, 202, 1, 227, 2, 202, 1, 254, 32, 202,
- 1, 245, 108, 202, 1, 254, 24, 202, 1, 245, 96, 202, 1, 245, 55, 202, 1,
- 72, 202, 1, 69, 202, 1, 235, 154, 202, 1, 215, 79, 202, 1, 229, 161, 202,
- 1, 242, 154, 202, 1, 236, 29, 23, 1, 234, 67, 23, 1, 219, 150, 23, 1,
- 234, 60, 23, 1, 229, 57, 23, 1, 229, 55, 23, 1, 229, 54, 23, 1, 217, 55,
- 23, 1, 219, 139, 23, 1, 223, 179, 23, 1, 223, 174, 23, 1, 223, 171, 23,
- 1, 223, 164, 23, 1, 223, 159, 23, 1, 223, 154, 23, 1, 223, 165, 23, 1,
- 223, 177, 23, 1, 231, 30, 23, 1, 225, 227, 23, 1, 219, 147, 23, 1, 225,
- 216, 23, 1, 220, 76, 23, 1, 219, 144, 23, 1, 236, 51, 23, 1, 249, 239,
- 23, 1, 219, 154, 23, 1, 250, 43, 23, 1, 234, 116, 23, 1, 217, 126, 23, 1,
- 226, 7, 23, 1, 241, 158, 23, 1, 61, 23, 1, 254, 148, 23, 1, 186, 23, 1,
- 213, 80, 23, 1, 245, 76, 23, 1, 74, 23, 1, 213, 27, 23, 1, 213, 38, 23,
- 1, 75, 23, 1, 214, 49, 23, 1, 214, 46, 23, 1, 227, 99, 23, 1, 212, 235,
- 23, 1, 69, 23, 1, 213, 252, 23, 1, 214, 6, 23, 1, 213, 235, 23, 1, 212,
- 203, 23, 1, 245, 22, 23, 1, 212, 255, 23, 1, 72, 23, 244, 72, 23, 1, 219,
- 148, 23, 1, 229, 47, 23, 1, 229, 49, 23, 1, 229, 52, 23, 1, 223, 172, 23,
- 1, 223, 153, 23, 1, 223, 161, 23, 1, 223, 166, 23, 1, 223, 151, 23, 1,
- 231, 23, 23, 1, 231, 20, 23, 1, 231, 24, 23, 1, 234, 226, 23, 1, 225,
- 222, 23, 1, 225, 208, 23, 1, 225, 214, 23, 1, 225, 211, 23, 1, 225, 225,
- 23, 1, 225, 209, 23, 1, 234, 224, 23, 1, 234, 222, 23, 1, 220, 69, 23, 1,
- 220, 67, 23, 1, 220, 59, 23, 1, 220, 64, 23, 1, 220, 74, 23, 1, 226, 160,
- 23, 1, 219, 151, 23, 1, 213, 17, 23, 1, 213, 13, 23, 1, 213, 14, 23, 1,
- 234, 225, 23, 1, 219, 152, 23, 1, 213, 23, 23, 1, 212, 229, 23, 1, 212,
- 228, 23, 1, 212, 231, 23, 1, 212, 194, 23, 1, 212, 195, 23, 1, 212, 198,
- 23, 1, 253, 204, 23, 1, 253, 198, 105, 254, 10, 232, 232, 77, 105, 254,
- 10, 223, 203, 77, 105, 254, 10, 122, 77, 105, 254, 10, 117, 77, 105, 254,
- 10, 133, 77, 105, 254, 10, 243, 237, 77, 105, 254, 10, 216, 227, 77, 105,
- 254, 10, 231, 37, 77, 105, 254, 10, 251, 101, 77, 105, 254, 10, 244, 61,
- 77, 105, 254, 10, 222, 95, 77, 105, 254, 10, 217, 122, 77, 105, 254, 10,
- 243, 230, 77, 105, 254, 10, 241, 208, 77, 105, 254, 10, 245, 180, 77,
- 105, 254, 10, 231, 249, 77, 202, 1, 251, 54, 202, 1, 212, 37, 202, 1,
- 235, 110, 202, 1, 242, 92, 202, 1, 245, 165, 202, 1, 245, 93, 202, 1,
- 227, 49, 202, 1, 227, 53, 202, 1, 235, 177, 202, 1, 254, 12, 202, 1, 235,
- 221, 202, 1, 215, 139, 202, 1, 236, 11, 202, 1, 229, 142, 202, 1, 254,
- 102, 202, 1, 253, 103, 202, 1, 254, 45, 202, 1, 227, 70, 202, 1, 227, 55,
- 202, 1, 235, 218, 202, 40, 1, 226, 229, 202, 40, 1, 218, 99, 202, 40, 1,
- 235, 27, 202, 40, 1, 242, 41, 202, 1, 242, 226, 202, 1, 233, 26, 202, 1,
- 211, 249, 9, 219, 45, 218, 99, 9, 219, 45, 213, 245, 9, 219, 45, 213,
- 146, 9, 219, 45, 251, 8, 9, 219, 45, 218, 199, 9, 219, 45, 240, 150, 9,
- 219, 45, 240, 154, 9, 219, 45, 240, 218, 9, 219, 45, 240, 151, 9, 219,
- 45, 218, 102, 9, 219, 45, 240, 153, 9, 219, 45, 240, 149, 9, 219, 45,
- 240, 216, 9, 219, 45, 240, 152, 9, 219, 45, 240, 148, 9, 219, 45, 204, 9,
- 219, 45, 242, 41, 9, 219, 45, 197, 9, 219, 45, 226, 229, 9, 219, 45, 219,
- 208, 9, 219, 45, 249, 3, 9, 219, 45, 240, 155, 9, 219, 45, 241, 175, 9,
- 219, 45, 218, 111, 9, 219, 45, 218, 178, 9, 219, 45, 219, 107, 9, 219,
- 45, 221, 31, 9, 219, 45, 226, 98, 9, 219, 45, 224, 242, 9, 219, 45, 216,
- 253, 9, 219, 45, 218, 101, 9, 219, 45, 218, 189, 9, 219, 45, 240, 162, 9,
- 219, 45, 240, 147, 9, 219, 45, 226, 25, 9, 219, 45, 224, 240, 56, 1, 3,
- 233, 238, 56, 1, 3, 220, 117, 56, 1, 3, 219, 27, 56, 1, 3, 108, 56, 1, 3,
- 228, 92, 56, 1, 3, 159, 56, 1, 3, 241, 165, 56, 1, 3, 240, 212, 56, 1, 3,
- 241, 222, 56, 1, 3, 241, 54, 56, 1, 3, 230, 172, 56, 1, 3, 203, 56, 1, 3,
- 223, 188, 56, 1, 3, 223, 51, 56, 1, 3, 224, 21, 56, 1, 3, 223, 112, 86,
- 23, 234, 67, 86, 23, 229, 57, 86, 23, 217, 55, 86, 23, 223, 179, 86, 23,
- 231, 30, 86, 23, 225, 227, 86, 23, 220, 76, 86, 23, 236, 51, 86, 23, 249,
- 239, 86, 23, 250, 43, 86, 23, 234, 116, 86, 23, 217, 126, 86, 23, 226, 7,
- 86, 23, 241, 158, 86, 23, 234, 68, 61, 86, 23, 229, 58, 61, 86, 23, 217,
- 56, 61, 86, 23, 223, 180, 61, 86, 23, 231, 31, 61, 86, 23, 225, 228, 61,
- 86, 23, 220, 77, 61, 86, 23, 236, 52, 61, 86, 23, 249, 240, 61, 86, 23,
- 250, 44, 61, 86, 23, 234, 117, 61, 86, 23, 217, 127, 61, 86, 23, 226, 8,
- 61, 86, 23, 241, 159, 61, 86, 23, 249, 240, 69, 86, 234, 12, 137, 227,
- 83, 86, 234, 12, 137, 157, 240, 212, 86, 143, 116, 86, 143, 109, 86, 143,
- 166, 86, 143, 163, 86, 143, 180, 86, 143, 189, 86, 143, 198, 86, 143,
- 195, 86, 143, 200, 86, 143, 217, 200, 86, 143, 230, 198, 86, 143, 244,
- 65, 86, 143, 214, 24, 86, 143, 213, 201, 86, 143, 231, 106, 86, 143, 245,
- 179, 86, 143, 218, 238, 86, 143, 219, 72, 86, 143, 241, 228, 86, 143,
- 219, 238, 86, 143, 230, 24, 86, 143, 219, 192, 86, 143, 244, 71, 86, 143,
- 249, 140, 86, 143, 233, 148, 86, 143, 223, 223, 86, 143, 250, 203, 86,
- 143, 219, 30, 86, 143, 218, 220, 86, 143, 245, 86, 86, 143, 223, 215, 86,
- 143, 254, 59, 86, 143, 244, 97, 86, 143, 223, 213, 86, 143, 221, 76, 86,
- 143, 224, 20, 36, 143, 224, 157, 36, 143, 234, 89, 36, 143, 222, 116, 36,
- 143, 234, 8, 36, 50, 217, 201, 227, 63, 83, 219, 166, 36, 50, 216, 39,
- 227, 63, 83, 219, 166, 36, 50, 217, 116, 227, 63, 83, 219, 166, 36, 50,
- 243, 241, 227, 63, 83, 219, 166, 36, 50, 244, 84, 227, 63, 83, 219, 166,
- 36, 50, 220, 40, 227, 63, 83, 219, 166, 36, 50, 221, 38, 227, 63, 83,
- 219, 166, 36, 50, 245, 142, 227, 63, 83, 219, 166, 226, 123, 52, 36, 50,
- 216, 39, 116, 36, 50, 216, 39, 109, 36, 50, 216, 39, 166, 36, 50, 216,
- 39, 163, 36, 50, 216, 39, 180, 36, 50, 216, 39, 189, 36, 50, 216, 39,
- 198, 36, 50, 216, 39, 195, 36, 50, 216, 39, 200, 36, 50, 217, 115, 36,
- 50, 217, 116, 116, 36, 50, 217, 116, 109, 36, 50, 217, 116, 166, 36, 50,
- 217, 116, 163, 36, 50, 217, 116, 180, 36, 23, 234, 67, 36, 23, 229, 57,
- 36, 23, 217, 55, 36, 23, 223, 179, 36, 23, 231, 30, 36, 23, 225, 227, 36,
- 23, 220, 76, 36, 23, 236, 51, 36, 23, 249, 239, 36, 23, 250, 43, 36, 23,
- 234, 116, 36, 23, 217, 126, 36, 23, 226, 7, 36, 23, 241, 158, 36, 23,
- 234, 68, 61, 36, 23, 229, 58, 61, 36, 23, 217, 56, 61, 36, 23, 223, 180,
- 61, 36, 23, 231, 31, 61, 36, 23, 225, 228, 61, 36, 23, 220, 77, 61, 36,
- 23, 236, 52, 61, 36, 23, 249, 240, 61, 36, 23, 250, 44, 61, 36, 23, 234,
- 117, 61, 36, 23, 217, 127, 61, 36, 23, 226, 8, 61, 36, 23, 241, 159, 61,
- 36, 234, 12, 137, 250, 84, 36, 234, 12, 137, 235, 50, 36, 23, 236, 52,
- 69, 234, 12, 219, 98, 87, 36, 143, 116, 36, 143, 109, 36, 143, 166, 36,
- 143, 163, 36, 143, 180, 36, 143, 189, 36, 143, 198, 36, 143, 195, 36,
- 143, 200, 36, 143, 217, 200, 36, 143, 230, 198, 36, 143, 244, 65, 36,
- 143, 214, 24, 36, 143, 213, 201, 36, 143, 231, 106, 36, 143, 245, 179,
- 36, 143, 218, 238, 36, 143, 219, 72, 36, 143, 241, 228, 36, 143, 219,
- 238, 36, 143, 230, 24, 36, 143, 219, 192, 36, 143, 244, 71, 36, 143, 249,
- 140, 36, 143, 233, 148, 36, 143, 222, 93, 36, 143, 231, 252, 36, 143,
- 244, 106, 36, 143, 218, 250, 36, 143, 245, 1, 36, 143, 225, 68, 36, 143,
- 253, 112, 36, 143, 235, 157, 36, 143, 223, 213, 36, 143, 249, 103, 36,
- 143, 249, 94, 36, 143, 241, 151, 36, 143, 250, 108, 36, 143, 232, 165,
- 36, 143, 233, 70, 36, 143, 223, 148, 36, 143, 231, 148, 36, 143, 223,
- 237, 36, 143, 219, 30, 36, 143, 218, 220, 36, 143, 245, 86, 36, 143, 223,
- 215, 36, 143, 254, 59, 36, 143, 229, 43, 36, 50, 217, 116, 189, 36, 50,
- 217, 116, 198, 36, 50, 217, 116, 195, 36, 50, 217, 116, 200, 36, 50, 243,
- 240, 36, 50, 243, 241, 116, 36, 50, 243, 241, 109, 36, 50, 243, 241, 166,
- 36, 50, 243, 241, 163, 36, 50, 243, 241, 180, 36, 50, 243, 241, 189, 36,
- 50, 243, 241, 198, 36, 50, 243, 241, 195, 36, 50, 243, 241, 200, 36, 50,
- 244, 83, 105, 201, 16, 31, 235, 133, 105, 201, 16, 31, 244, 117, 105,
- 201, 16, 31, 231, 223, 105, 201, 16, 31, 253, 217, 105, 201, 16, 31, 231,
- 196, 105, 201, 16, 31, 235, 48, 105, 201, 16, 31, 235, 49, 105, 201, 16,
- 31, 253, 104, 105, 201, 16, 31, 221, 56, 105, 201, 16, 31, 227, 104, 105,
- 201, 16, 31, 228, 151, 105, 201, 16, 31, 248, 36, 41, 241, 175, 41, 245,
- 51, 41, 245, 10, 232, 248, 233, 12, 52, 36, 56, 61, 36, 56, 72, 36, 56,
- 69, 36, 56, 74, 36, 56, 75, 36, 56, 181, 36, 56, 234, 101, 36, 56, 233,
- 238, 36, 56, 234, 188, 36, 56, 234, 37, 36, 56, 222, 202, 36, 56, 220,
- 117, 36, 56, 219, 27, 36, 56, 222, 100, 36, 56, 219, 242, 36, 56, 218,
- 52, 36, 56, 217, 71, 36, 56, 216, 82, 36, 56, 217, 229, 36, 56, 108, 36,
- 56, 205, 36, 56, 229, 64, 36, 56, 228, 92, 36, 56, 229, 187, 36, 56, 228,
- 185, 36, 56, 159, 36, 56, 241, 165, 36, 56, 240, 212, 36, 56, 241, 222,
- 36, 56, 241, 54, 36, 56, 188, 36, 56, 231, 42, 36, 56, 230, 172, 36, 56,
- 231, 156, 36, 56, 230, 231, 36, 56, 186, 36, 56, 212, 203, 36, 56, 212,
- 235, 36, 56, 203, 36, 56, 223, 188, 36, 56, 223, 51, 36, 56, 224, 21, 36,
- 56, 223, 112, 36, 56, 214, 49, 36, 56, 213, 235, 36, 56, 214, 6, 36, 56,
- 213, 214, 41, 253, 238, 41, 253, 154, 41, 254, 6, 41, 254, 190, 41, 235,
- 223, 41, 235, 193, 41, 215, 137, 41, 245, 31, 41, 245, 163, 41, 227, 52,
- 41, 227, 46, 41, 234, 249, 41, 234, 219, 41, 234, 216, 41, 243, 68, 41,
- 243, 77, 41, 242, 180, 41, 242, 176, 41, 233, 172, 41, 242, 169, 41, 234,
- 81, 41, 234, 80, 41, 234, 79, 41, 234, 78, 41, 242, 67, 41, 242, 66, 41,
- 233, 214, 41, 233, 216, 41, 234, 184, 41, 234, 10, 41, 234, 17, 41, 222,
- 187, 41, 222, 153, 41, 220, 57, 41, 221, 61, 41, 221, 60, 41, 248, 161,
- 41, 247, 243, 41, 247, 75, 41, 216, 243, 41, 230, 20, 41, 228, 152, 41,
- 242, 14, 41, 226, 208, 41, 226, 207, 41, 252, 105, 41, 225, 237, 41, 225,
- 201, 41, 225, 202, 41, 251, 157, 41, 240, 211, 41, 240, 207, 41, 251, 20,
- 41, 240, 194, 41, 241, 199, 41, 226, 35, 41, 226, 69, 41, 241, 183, 41,
- 226, 66, 41, 226, 82, 41, 251, 237, 41, 225, 140, 41, 251, 106, 41, 241,
- 42, 41, 225, 130, 41, 241, 35, 41, 241, 37, 41, 232, 7, 41, 232, 3, 41,
- 232, 11, 41, 231, 213, 41, 231, 238, 41, 231, 10, 41, 230, 245, 41, 230,
- 244, 41, 231, 138, 41, 231, 135, 41, 231, 139, 41, 213, 90, 41, 213, 88,
- 41, 212, 192, 41, 223, 123, 41, 223, 127, 41, 223, 28, 41, 223, 23, 41,
- 223, 235, 41, 223, 232, 41, 214, 22, 105, 201, 16, 31, 240, 226, 212, 79,
- 105, 201, 16, 31, 240, 226, 116, 105, 201, 16, 31, 240, 226, 109, 105,
- 201, 16, 31, 240, 226, 166, 105, 201, 16, 31, 240, 226, 163, 105, 201,
- 16, 31, 240, 226, 180, 105, 201, 16, 31, 240, 226, 189, 105, 201, 16, 31,
- 240, 226, 198, 105, 201, 16, 31, 240, 226, 195, 105, 201, 16, 31, 240,
- 226, 200, 105, 201, 16, 31, 240, 226, 217, 200, 105, 201, 16, 31, 240,
- 226, 245, 124, 105, 201, 16, 31, 240, 226, 216, 41, 105, 201, 16, 31,
- 240, 226, 217, 117, 105, 201, 16, 31, 240, 226, 243, 231, 105, 201, 16,
- 31, 240, 226, 244, 87, 105, 201, 16, 31, 240, 226, 220, 47, 105, 201, 16,
- 31, 240, 226, 221, 40, 105, 201, 16, 31, 240, 226, 245, 147, 105, 201,
- 16, 31, 240, 226, 229, 28, 105, 201, 16, 31, 240, 226, 216, 38, 105, 201,
- 16, 31, 240, 226, 216, 32, 105, 201, 16, 31, 240, 226, 216, 28, 105, 201,
- 16, 31, 240, 226, 216, 29, 105, 201, 16, 31, 240, 226, 216, 34, 41, 240,
- 217, 41, 248, 164, 41, 253, 108, 41, 134, 41, 226, 249, 41, 226, 99, 41,
- 247, 101, 41, 247, 102, 219, 165, 41, 247, 102, 249, 49, 41, 235, 154,
- 41, 245, 54, 230, 25, 241, 200, 41, 245, 54, 230, 25, 218, 120, 41, 245,
- 54, 230, 25, 218, 24, 41, 245, 54, 230, 25, 231, 134, 41, 249, 96, 41,
- 226, 214, 254, 34, 41, 205, 41, 230, 173, 61, 41, 188, 41, 181, 41, 234,
- 191, 41, 231, 192, 41, 243, 56, 41, 250, 206, 41, 234, 190, 41, 226, 26,
- 41, 229, 163, 41, 230, 173, 244, 230, 41, 230, 173, 243, 177, 41, 231,
- 82, 41, 234, 140, 41, 240, 155, 41, 234, 103, 41, 231, 44, 41, 242, 192,
- 41, 217, 73, 41, 230, 173, 150, 41, 230, 238, 41, 247, 109, 41, 234, 49,
- 41, 244, 14, 41, 228, 200, 41, 230, 173, 183, 41, 230, 235, 41, 249, 176,
- 41, 234, 43, 41, 230, 236, 219, 165, 41, 249, 177, 219, 165, 41, 232,
- 110, 219, 165, 41, 234, 44, 219, 165, 41, 230, 236, 249, 49, 41, 249,
- 177, 249, 49, 41, 232, 110, 249, 49, 41, 234, 44, 249, 49, 41, 232, 110,
- 110, 197, 41, 232, 110, 110, 223, 4, 219, 165, 41, 193, 41, 234, 4, 41,
- 230, 175, 41, 242, 127, 41, 224, 66, 41, 224, 67, 110, 197, 41, 224, 67,
- 110, 223, 4, 219, 165, 41, 225, 47, 41, 228, 124, 41, 230, 173, 197, 41,
- 230, 174, 41, 225, 4, 41, 228, 33, 41, 230, 173, 215, 79, 41, 230, 120,
- 41, 233, 207, 41, 230, 121, 231, 138, 41, 225, 3, 41, 228, 32, 41, 230,
- 173, 214, 82, 41, 230, 115, 41, 233, 205, 41, 230, 116, 231, 138, 41,
- 235, 28, 227, 86, 41, 232, 110, 227, 86, 41, 254, 45, 41, 251, 87, 41,
- 250, 147, 41, 250, 125, 41, 250, 253, 110, 234, 140, 41, 249, 175, 41,
- 248, 88, 41, 242, 53, 41, 159, 41, 240, 218, 41, 235, 251, 41, 234, 56,
- 41, 234, 44, 250, 182, 41, 233, 240, 41, 232, 211, 41, 232, 210, 41, 232,
- 200, 41, 232, 122, 41, 231, 193, 220, 7, 41, 231, 9, 41, 230, 222, 41,
- 226, 24, 41, 225, 153, 41, 225, 99, 41, 225, 97, 41, 219, 159, 41, 218,
- 203, 41, 214, 8, 41, 215, 80, 110, 183, 41, 118, 110, 183, 105, 201, 16,
- 31, 248, 92, 116, 105, 201, 16, 31, 248, 92, 109, 105, 201, 16, 31, 248,
- 92, 166, 105, 201, 16, 31, 248, 92, 163, 105, 201, 16, 31, 248, 92, 180,
- 105, 201, 16, 31, 248, 92, 189, 105, 201, 16, 31, 248, 92, 198, 105, 201,
- 16, 31, 248, 92, 195, 105, 201, 16, 31, 248, 92, 200, 105, 201, 16, 31,
- 248, 92, 217, 200, 105, 201, 16, 31, 248, 92, 245, 124, 105, 201, 16, 31,
- 248, 92, 216, 41, 105, 201, 16, 31, 248, 92, 217, 117, 105, 201, 16, 31,
- 248, 92, 243, 231, 105, 201, 16, 31, 248, 92, 244, 87, 105, 201, 16, 31,
- 248, 92, 220, 47, 105, 201, 16, 31, 248, 92, 221, 40, 105, 201, 16, 31,
- 248, 92, 245, 147, 105, 201, 16, 31, 248, 92, 229, 28, 105, 201, 16, 31,
- 248, 92, 216, 38, 105, 201, 16, 31, 248, 92, 216, 32, 105, 201, 16, 31,
- 248, 92, 216, 28, 105, 201, 16, 31, 248, 92, 216, 29, 105, 201, 16, 31,
- 248, 92, 216, 34, 105, 201, 16, 31, 248, 92, 216, 35, 105, 201, 16, 31,
- 248, 92, 216, 30, 105, 201, 16, 31, 248, 92, 216, 31, 105, 201, 16, 31,
- 248, 92, 216, 37, 105, 201, 16, 31, 248, 92, 216, 33, 105, 201, 16, 31,
- 248, 92, 217, 115, 105, 201, 16, 31, 248, 92, 217, 114, 41, 243, 94, 241,
- 177, 31, 217, 149, 249, 80, 241, 207, 241, 177, 31, 217, 149, 224, 15,
- 245, 179, 241, 177, 31, 247, 183, 253, 123, 217, 149, 251, 232, 241, 177,
- 31, 212, 214, 244, 7, 241, 177, 31, 214, 43, 241, 177, 31, 249, 142, 241,
- 177, 31, 217, 149, 253, 174, 241, 177, 31, 241, 46, 216, 249, 241, 177,
- 31, 3, 218, 12, 241, 177, 31, 216, 195, 241, 177, 31, 226, 94, 241, 177,
- 31, 219, 97, 241, 177, 31, 244, 108, 241, 177, 31, 242, 109, 225, 120,
- 241, 177, 31, 230, 225, 241, 177, 31, 245, 85, 241, 177, 31, 244, 8, 241,
- 177, 31, 213, 194, 227, 63, 217, 149, 248, 37, 241, 177, 31, 253, 221,
- 241, 177, 31, 249, 124, 241, 177, 31, 251, 150, 217, 92, 241, 177, 31,
- 242, 125, 241, 177, 31, 219, 177, 253, 237, 241, 177, 31, 223, 205, 241,
- 177, 31, 235, 217, 241, 177, 31, 242, 109, 218, 12, 241, 177, 31, 230,
- 181, 249, 98, 241, 177, 31, 242, 109, 225, 77, 241, 177, 31, 217, 149,
- 254, 178, 214, 24, 241, 177, 31, 217, 149, 249, 201, 244, 65, 241, 177,
- 31, 235, 230, 241, 177, 31, 246, 12, 241, 177, 31, 223, 208, 241, 177,
- 31, 242, 109, 225, 104, 241, 177, 31, 225, 61, 241, 177, 31, 248, 106,
- 65, 217, 149, 233, 2, 241, 177, 31, 217, 149, 244, 142, 241, 177, 31,
- 227, 29, 241, 177, 31, 227, 108, 241, 177, 31, 248, 10, 241, 177, 31,
- 248, 30, 241, 177, 31, 235, 243, 241, 177, 31, 251, 77, 241, 177, 31,
- 249, 159, 211, 211, 231, 141, 241, 177, 31, 243, 63, 216, 249, 241, 177,
- 31, 225, 12, 215, 125, 241, 177, 31, 227, 28, 241, 177, 31, 217, 149,
- 213, 254, 241, 177, 31, 223, 198, 241, 177, 31, 217, 149, 250, 153, 241,
- 177, 31, 217, 149, 253, 170, 217, 87, 241, 177, 31, 217, 149, 234, 185,
- 219, 74, 230, 185, 241, 177, 31, 247, 239, 241, 177, 31, 217, 149, 231,
- 215, 232, 8, 241, 177, 31, 254, 179, 241, 177, 31, 217, 149, 214, 38,
- 241, 177, 31, 217, 149, 243, 23, 213, 224, 241, 177, 31, 217, 149, 235,
- 55, 233, 131, 241, 177, 31, 247, 136, 241, 177, 31, 232, 249, 241, 177,
- 31, 235, 220, 216, 145, 241, 177, 31, 3, 225, 77, 241, 177, 31, 254, 122,
- 249, 151, 241, 177, 31, 251, 235, 249, 151, 8, 4, 235, 158, 8, 4, 235,
- 151, 8, 4, 72, 8, 4, 235, 180, 8, 4, 236, 53, 8, 4, 236, 36, 8, 4, 236,
- 55, 8, 4, 236, 54, 8, 4, 253, 122, 8, 4, 253, 85, 8, 4, 61, 8, 4, 253,
- 239, 8, 4, 215, 135, 8, 4, 215, 138, 8, 4, 215, 136, 8, 4, 227, 8, 8, 4,
- 226, 238, 8, 4, 75, 8, 4, 227, 41, 8, 4, 245, 2, 8, 4, 74, 8, 4, 213,
- 183, 8, 4, 251, 151, 8, 4, 251, 148, 8, 4, 251, 184, 8, 4, 251, 161, 8,
- 4, 251, 174, 8, 4, 251, 173, 8, 4, 251, 176, 8, 4, 251, 175, 8, 4, 252,
- 41, 8, 4, 252, 33, 8, 4, 252, 107, 8, 4, 252, 61, 8, 4, 251, 30, 8, 4,
- 251, 34, 8, 4, 251, 31, 8, 4, 251, 105, 8, 4, 251, 89, 8, 4, 251, 128, 8,
- 4, 251, 110, 8, 4, 251, 198, 8, 4, 251, 251, 8, 4, 251, 210, 8, 4, 251,
- 16, 8, 4, 251, 13, 8, 4, 251, 54, 8, 4, 251, 29, 8, 4, 251, 23, 8, 4,
- 251, 27, 8, 4, 251, 1, 8, 4, 251, 0, 8, 4, 251, 6, 8, 4, 251, 4, 8, 4,
- 251, 2, 8, 4, 251, 3, 8, 4, 225, 181, 8, 4, 225, 177, 8, 4, 225, 240, 8,
- 4, 225, 191, 8, 4, 225, 207, 8, 4, 225, 234, 8, 4, 225, 230, 8, 4, 226,
- 113, 8, 4, 226, 104, 8, 4, 193, 8, 4, 226, 149, 8, 4, 225, 21, 8, 4, 225,
- 23, 8, 4, 225, 22, 8, 4, 225, 113, 8, 4, 225, 102, 8, 4, 225, 150, 8, 4,
- 225, 125, 8, 4, 225, 8, 8, 4, 225, 5, 8, 4, 225, 35, 8, 4, 225, 20, 8, 4,
- 225, 13, 8, 4, 225, 18, 8, 4, 224, 244, 8, 4, 224, 243, 8, 4, 224, 248,
- 8, 4, 224, 247, 8, 4, 224, 245, 8, 4, 224, 246, 8, 4, 252, 16, 8, 4, 252,
- 15, 8, 4, 252, 22, 8, 4, 252, 17, 8, 4, 252, 19, 8, 4, 252, 18, 8, 4,
- 252, 21, 8, 4, 252, 20, 8, 4, 252, 28, 8, 4, 252, 27, 8, 4, 252, 31, 8,
- 4, 252, 29, 8, 4, 252, 7, 8, 4, 252, 9, 8, 4, 252, 8, 8, 4, 252, 12, 8,
- 4, 252, 11, 8, 4, 252, 14, 8, 4, 252, 13, 8, 4, 252, 23, 8, 4, 252, 26,
- 8, 4, 252, 24, 8, 4, 252, 3, 8, 4, 252, 2, 8, 4, 252, 10, 8, 4, 252, 6,
- 8, 4, 252, 4, 8, 4, 252, 5, 8, 4, 251, 255, 8, 4, 251, 254, 8, 4, 252, 1,
- 8, 4, 252, 0, 8, 4, 229, 248, 8, 4, 229, 247, 8, 4, 229, 253, 8, 4, 229,
- 249, 8, 4, 229, 250, 8, 4, 229, 252, 8, 4, 229, 251, 8, 4, 229, 255, 8,
- 4, 229, 254, 8, 4, 230, 1, 8, 4, 230, 0, 8, 4, 229, 244, 8, 4, 229, 243,
- 8, 4, 229, 246, 8, 4, 229, 245, 8, 4, 229, 238, 8, 4, 229, 237, 8, 4,
- 229, 242, 8, 4, 229, 241, 8, 4, 229, 239, 8, 4, 229, 240, 8, 4, 229, 232,
- 8, 4, 229, 231, 8, 4, 229, 236, 8, 4, 229, 235, 8, 4, 229, 233, 8, 4,
- 229, 234, 8, 4, 241, 96, 8, 4, 241, 95, 8, 4, 241, 101, 8, 4, 241, 97, 8,
- 4, 241, 98, 8, 4, 241, 100, 8, 4, 241, 99, 8, 4, 241, 104, 8, 4, 241,
- 103, 8, 4, 241, 106, 8, 4, 241, 105, 8, 4, 241, 87, 8, 4, 241, 89, 8, 4,
- 241, 88, 8, 4, 241, 92, 8, 4, 241, 91, 8, 4, 241, 94, 8, 4, 241, 93, 8,
- 4, 241, 83, 8, 4, 241, 82, 8, 4, 241, 90, 8, 4, 241, 86, 8, 4, 241, 84,
- 8, 4, 241, 85, 8, 4, 241, 77, 8, 4, 241, 81, 8, 4, 241, 80, 8, 4, 241,
- 78, 8, 4, 241, 79, 8, 4, 230, 241, 8, 4, 230, 240, 8, 4, 231, 42, 8, 4,
- 230, 247, 8, 4, 231, 16, 8, 4, 231, 34, 8, 4, 231, 32, 8, 4, 231, 202, 8,
- 4, 231, 198, 8, 4, 188, 8, 4, 231, 235, 8, 4, 230, 144, 8, 4, 230, 143,
- 8, 4, 230, 147, 8, 4, 230, 145, 8, 4, 230, 191, 8, 4, 230, 177, 8, 4,
- 230, 231, 8, 4, 230, 196, 8, 4, 231, 93, 8, 4, 231, 156, 8, 4, 230, 125,
- 8, 4, 230, 122, 8, 4, 230, 172, 8, 4, 230, 140, 8, 4, 230, 133, 8, 4,
- 230, 138, 8, 4, 230, 100, 8, 4, 230, 99, 8, 4, 230, 105, 8, 4, 230, 102,
- 8, 4, 244, 52, 8, 4, 244, 47, 8, 4, 244, 90, 8, 4, 244, 67, 8, 4, 244,
- 135, 8, 4, 244, 126, 8, 4, 244, 164, 8, 4, 244, 138, 8, 4, 243, 229, 8,
- 4, 244, 12, 8, 4, 243, 252, 8, 4, 243, 190, 8, 4, 243, 189, 8, 4, 243,
- 205, 8, 4, 243, 195, 8, 4, 243, 193, 8, 4, 243, 194, 8, 4, 243, 180, 8,
- 4, 243, 179, 8, 4, 243, 183, 8, 4, 243, 181, 8, 4, 214, 125, 8, 4, 214,
- 120, 8, 4, 214, 154, 8, 4, 214, 134, 8, 4, 214, 146, 8, 4, 214, 143, 8,
- 4, 214, 148, 8, 4, 214, 147, 8, 4, 214, 239, 8, 4, 214, 235, 8, 4, 215,
- 1, 8, 4, 214, 250, 8, 4, 214, 106, 8, 4, 214, 102, 8, 4, 214, 119, 8, 4,
- 214, 107, 8, 4, 214, 155, 8, 4, 214, 221, 8, 4, 214, 93, 8, 4, 214, 92,
- 8, 4, 214, 99, 8, 4, 214, 96, 8, 4, 214, 94, 8, 4, 214, 95, 8, 4, 214,
- 86, 8, 4, 214, 85, 8, 4, 214, 90, 8, 4, 214, 89, 8, 4, 214, 87, 8, 4,
- 214, 88, 8, 4, 247, 130, 8, 4, 247, 118, 8, 4, 247, 211, 8, 4, 247, 155,
- 8, 4, 247, 188, 8, 4, 247, 192, 8, 4, 247, 191, 8, 4, 248, 98, 8, 4, 248,
- 93, 8, 4, 248, 164, 8, 4, 248, 117, 8, 4, 246, 17, 8, 4, 246, 18, 8, 4,
- 247, 74, 8, 4, 246, 56, 8, 4, 247, 99, 8, 4, 247, 76, 8, 4, 247, 237, 8,
- 4, 248, 41, 8, 4, 247, 252, 8, 4, 246, 8, 8, 4, 246, 6, 8, 4, 246, 33, 8,
- 4, 246, 16, 8, 4, 246, 11, 8, 4, 246, 14, 8, 4, 217, 20, 8, 4, 217, 14,
- 8, 4, 217, 71, 8, 4, 217, 29, 8, 4, 217, 63, 8, 4, 217, 65, 8, 4, 217,
- 64, 8, 4, 217, 253, 8, 4, 217, 240, 8, 4, 218, 52, 8, 4, 218, 5, 8, 4,
- 216, 66, 8, 4, 216, 65, 8, 4, 216, 68, 8, 4, 216, 67, 8, 4, 216, 218, 8,
- 4, 216, 214, 8, 4, 108, 8, 4, 216, 226, 8, 4, 217, 166, 8, 4, 217, 229,
- 8, 4, 217, 190, 8, 4, 216, 52, 8, 4, 216, 48, 8, 4, 216, 82, 8, 4, 216,
- 64, 8, 4, 216, 53, 8, 4, 216, 62, 8, 4, 248, 58, 8, 4, 248, 57, 8, 4,
- 248, 63, 8, 4, 248, 59, 8, 4, 248, 60, 8, 4, 248, 62, 8, 4, 248, 61, 8,
- 4, 248, 79, 8, 4, 248, 78, 8, 4, 248, 86, 8, 4, 248, 80, 8, 4, 248, 48,
- 8, 4, 248, 50, 8, 4, 248, 49, 8, 4, 248, 53, 8, 4, 248, 52, 8, 4, 248,
- 56, 8, 4, 248, 54, 8, 4, 248, 71, 8, 4, 248, 74, 8, 4, 248, 72, 8, 4,
- 248, 44, 8, 4, 248, 43, 8, 4, 248, 51, 8, 4, 248, 47, 8, 4, 248, 45, 8,
- 4, 248, 46, 8, 4, 229, 206, 8, 4, 229, 205, 8, 4, 229, 213, 8, 4, 229,
- 208, 8, 4, 229, 209, 8, 4, 229, 210, 8, 4, 229, 222, 8, 4, 229, 221, 8,
- 4, 229, 228, 8, 4, 229, 223, 8, 4, 229, 198, 8, 4, 229, 197, 8, 4, 229,
- 204, 8, 4, 229, 199, 8, 4, 229, 214, 8, 4, 229, 220, 8, 4, 229, 218, 8,
- 4, 229, 190, 8, 4, 229, 189, 8, 4, 229, 195, 8, 4, 229, 193, 8, 4, 229,
- 191, 8, 4, 229, 192, 8, 4, 241, 63, 8, 4, 241, 62, 8, 4, 241, 69, 8, 4,
- 241, 64, 8, 4, 241, 66, 8, 4, 241, 65, 8, 4, 241, 68, 8, 4, 241, 67, 8,
- 4, 241, 74, 8, 4, 241, 73, 8, 4, 241, 76, 8, 4, 241, 75, 8, 4, 241, 57,
- 8, 4, 241, 58, 8, 4, 241, 60, 8, 4, 241, 59, 8, 4, 241, 61, 8, 4, 241,
- 70, 8, 4, 241, 72, 8, 4, 241, 71, 8, 4, 241, 56, 8, 4, 229, 20, 8, 4,
- 229, 18, 8, 4, 229, 64, 8, 4, 229, 23, 8, 4, 229, 46, 8, 4, 229, 60, 8,
- 4, 229, 59, 8, 4, 230, 5, 8, 4, 205, 8, 4, 230, 17, 8, 4, 228, 42, 8, 4,
- 228, 44, 8, 4, 228, 43, 8, 4, 228, 162, 8, 4, 228, 149, 8, 4, 228, 185,
- 8, 4, 228, 171, 8, 4, 229, 165, 8, 4, 229, 187, 8, 4, 229, 176, 8, 4,
- 228, 37, 8, 4, 228, 34, 8, 4, 228, 92, 8, 4, 228, 41, 8, 4, 228, 39, 8,
- 4, 228, 40, 8, 4, 241, 127, 8, 4, 241, 126, 8, 4, 241, 132, 8, 4, 241,
- 128, 8, 4, 241, 129, 8, 4, 241, 131, 8, 4, 241, 130, 8, 4, 241, 137, 8,
- 4, 241, 136, 8, 4, 241, 139, 8, 4, 241, 138, 8, 4, 241, 119, 8, 4, 241,
- 121, 8, 4, 241, 120, 8, 4, 241, 123, 8, 4, 241, 125, 8, 4, 241, 124, 8,
- 4, 241, 133, 8, 4, 241, 135, 8, 4, 241, 134, 8, 4, 241, 115, 8, 4, 241,
- 114, 8, 4, 241, 122, 8, 4, 241, 118, 8, 4, 241, 116, 8, 4, 241, 117, 8,
- 4, 241, 109, 8, 4, 241, 108, 8, 4, 241, 113, 8, 4, 241, 112, 8, 4, 241,
- 110, 8, 4, 241, 111, 8, 4, 232, 224, 8, 4, 232, 218, 8, 4, 233, 13, 8, 4,
- 232, 231, 8, 4, 233, 5, 8, 4, 233, 4, 8, 4, 233, 8, 8, 4, 233, 6, 8, 4,
- 233, 102, 8, 4, 233, 93, 8, 4, 233, 157, 8, 4, 233, 111, 8, 4, 232, 137,
- 8, 4, 232, 136, 8, 4, 232, 139, 8, 4, 232, 138, 8, 4, 232, 171, 8, 4,
- 232, 161, 8, 4, 232, 208, 8, 4, 232, 175, 8, 4, 233, 28, 8, 4, 233, 82,
- 8, 4, 233, 41, 8, 4, 232, 132, 8, 4, 232, 131, 8, 4, 232, 156, 8, 4, 232,
- 135, 8, 4, 232, 133, 8, 4, 232, 134, 8, 4, 232, 114, 8, 4, 232, 113, 8,
- 4, 232, 121, 8, 4, 232, 117, 8, 4, 232, 115, 8, 4, 232, 116, 8, 4, 242,
- 165, 8, 4, 242, 164, 8, 4, 242, 190, 8, 4, 242, 175, 8, 4, 242, 182, 8,
- 4, 242, 181, 8, 4, 242, 184, 8, 4, 242, 183, 8, 4, 243, 65, 8, 4, 243,
- 60, 8, 4, 243, 110, 8, 4, 243, 75, 8, 4, 242, 72, 8, 4, 242, 71, 8, 4,
- 242, 74, 8, 4, 242, 73, 8, 4, 242, 130, 8, 4, 242, 128, 8, 4, 242, 150,
- 8, 4, 242, 138, 8, 4, 243, 9, 8, 4, 243, 7, 8, 4, 243, 38, 8, 4, 243, 20,
- 8, 4, 242, 62, 8, 4, 242, 61, 8, 4, 242, 92, 8, 4, 242, 70, 8, 4, 242,
- 63, 8, 4, 242, 69, 8, 4, 234, 70, 8, 4, 234, 69, 8, 4, 234, 101, 8, 4,
- 234, 84, 8, 4, 234, 94, 8, 4, 234, 97, 8, 4, 234, 95, 8, 4, 234, 207, 8,
- 4, 234, 196, 8, 4, 181, 8, 4, 234, 233, 8, 4, 233, 221, 8, 4, 233, 226,
- 8, 4, 233, 223, 8, 4, 234, 9, 8, 4, 234, 5, 8, 4, 234, 37, 8, 4, 234, 16,
- 8, 4, 234, 162, 8, 4, 234, 146, 8, 4, 234, 188, 8, 4, 234, 165, 8, 4,
- 233, 210, 8, 4, 233, 208, 8, 4, 233, 238, 8, 4, 233, 220, 8, 4, 233, 213,
- 8, 4, 233, 217, 8, 4, 242, 247, 8, 4, 242, 246, 8, 4, 242, 251, 8, 4,
- 242, 248, 8, 4, 242, 250, 8, 4, 242, 249, 8, 4, 243, 2, 8, 4, 243, 1, 8,
- 4, 243, 5, 8, 4, 243, 3, 8, 4, 242, 238, 8, 4, 242, 237, 8, 4, 242, 240,
- 8, 4, 242, 239, 8, 4, 242, 243, 8, 4, 242, 242, 8, 4, 242, 245, 8, 4,
- 242, 244, 8, 4, 242, 253, 8, 4, 242, 252, 8, 4, 243, 0, 8, 4, 242, 254,
- 8, 4, 242, 233, 8, 4, 242, 232, 8, 4, 242, 241, 8, 4, 242, 236, 8, 4,
- 242, 234, 8, 4, 242, 235, 8, 4, 231, 60, 8, 4, 231, 61, 8, 4, 231, 79, 8,
- 4, 231, 78, 8, 4, 231, 81, 8, 4, 231, 80, 8, 4, 231, 51, 8, 4, 231, 53,
- 8, 4, 231, 52, 8, 4, 231, 56, 8, 4, 231, 55, 8, 4, 231, 58, 8, 4, 231,
- 57, 8, 4, 231, 62, 8, 4, 231, 64, 8, 4, 231, 63, 8, 4, 231, 47, 8, 4,
- 231, 46, 8, 4, 231, 54, 8, 4, 231, 50, 8, 4, 231, 48, 8, 4, 231, 49, 8,
- 4, 240, 172, 8, 4, 240, 171, 8, 4, 240, 178, 8, 4, 240, 173, 8, 4, 240,
- 175, 8, 4, 240, 174, 8, 4, 240, 177, 8, 4, 240, 176, 8, 4, 240, 183, 8,
- 4, 240, 182, 8, 4, 240, 185, 8, 4, 240, 184, 8, 4, 240, 164, 8, 4, 240,
- 163, 8, 4, 240, 166, 8, 4, 240, 165, 8, 4, 240, 168, 8, 4, 240, 167, 8,
- 4, 240, 170, 8, 4, 240, 169, 8, 4, 240, 179, 8, 4, 240, 181, 8, 4, 240,
- 180, 8, 4, 229, 110, 8, 4, 229, 112, 8, 4, 229, 111, 8, 4, 229, 150, 8,
- 4, 229, 149, 8, 4, 229, 159, 8, 4, 229, 153, 8, 4, 229, 73, 8, 4, 229,
- 72, 8, 4, 229, 74, 8, 4, 229, 82, 8, 4, 229, 79, 8, 4, 229, 90, 8, 4,
- 229, 84, 8, 4, 229, 143, 8, 4, 229, 148, 8, 4, 229, 145, 8, 4, 241, 142,
- 8, 4, 241, 152, 8, 4, 241, 160, 8, 4, 241, 234, 8, 4, 241, 227, 8, 4,
- 159, 8, 4, 241, 245, 8, 4, 240, 196, 8, 4, 240, 195, 8, 4, 240, 198, 8,
- 4, 240, 197, 8, 4, 240, 229, 8, 4, 240, 220, 8, 4, 241, 54, 8, 4, 241,
- 34, 8, 4, 241, 179, 8, 4, 241, 222, 8, 4, 241, 190, 8, 4, 214, 27, 8, 4,
- 214, 12, 8, 4, 214, 49, 8, 4, 214, 35, 8, 4, 213, 173, 8, 4, 213, 175, 8,
- 4, 213, 174, 8, 4, 213, 191, 8, 4, 213, 214, 8, 4, 213, 197, 8, 4, 213,
- 246, 8, 4, 214, 6, 8, 4, 213, 251, 8, 4, 212, 23, 8, 4, 212, 22, 8, 4,
- 212, 37, 8, 4, 212, 25, 8, 4, 212, 30, 8, 4, 212, 32, 8, 4, 212, 31, 8,
- 4, 212, 95, 8, 4, 212, 92, 8, 4, 212, 109, 8, 4, 212, 98, 8, 4, 212, 1,
- 8, 4, 212, 3, 8, 4, 212, 2, 8, 4, 212, 12, 8, 4, 212, 11, 8, 4, 212, 16,
- 8, 4, 212, 13, 8, 4, 212, 77, 8, 4, 212, 87, 8, 4, 212, 81, 8, 4, 211,
- 253, 8, 4, 211, 252, 8, 4, 212, 8, 8, 4, 212, 0, 8, 4, 211, 254, 8, 4,
- 211, 255, 8, 4, 211, 244, 8, 4, 211, 243, 8, 4, 211, 249, 8, 4, 211, 247,
- 8, 4, 211, 245, 8, 4, 211, 246, 8, 4, 249, 221, 8, 4, 249, 217, 8, 4,
- 249, 244, 8, 4, 249, 230, 8, 4, 249, 241, 8, 4, 249, 235, 8, 4, 249, 243,
- 8, 4, 249, 242, 8, 4, 250, 156, 8, 4, 250, 150, 8, 4, 250, 219, 8, 4,
- 250, 183, 8, 4, 249, 45, 8, 4, 249, 47, 8, 4, 249, 46, 8, 4, 249, 92, 8,
- 4, 249, 83, 8, 4, 249, 175, 8, 4, 249, 108, 8, 4, 250, 94, 8, 4, 250,
- 124, 8, 4, 250, 99, 8, 4, 249, 26, 8, 4, 249, 25, 8, 4, 249, 53, 8, 4,
- 249, 43, 8, 4, 249, 31, 8, 4, 249, 42, 8, 4, 249, 6, 8, 4, 249, 5, 8, 4,
- 249, 16, 8, 4, 249, 12, 8, 4, 249, 7, 8, 4, 249, 9, 8, 4, 211, 227, 8, 4,
- 211, 226, 8, 4, 211, 233, 8, 4, 211, 228, 8, 4, 211, 230, 8, 4, 211, 229,
- 8, 4, 211, 232, 8, 4, 211, 231, 8, 4, 211, 239, 8, 4, 211, 238, 8, 4,
- 211, 242, 8, 4, 211, 240, 8, 4, 211, 223, 8, 4, 211, 225, 8, 4, 211, 224,
- 8, 4, 211, 234, 8, 4, 211, 237, 8, 4, 211, 235, 8, 4, 211, 218, 8, 4,
- 211, 222, 8, 4, 211, 221, 8, 4, 211, 219, 8, 4, 211, 220, 8, 4, 211, 213,
- 8, 4, 211, 212, 8, 4, 211, 217, 8, 4, 211, 216, 8, 4, 211, 214, 8, 4,
- 211, 215, 8, 4, 227, 224, 8, 4, 227, 223, 8, 4, 227, 229, 8, 4, 227, 225,
- 8, 4, 227, 226, 8, 4, 227, 228, 8, 4, 227, 227, 8, 4, 227, 234, 8, 4,
- 227, 233, 8, 4, 227, 237, 8, 4, 227, 236, 8, 4, 227, 217, 8, 4, 227, 218,
- 8, 4, 227, 221, 8, 4, 227, 222, 8, 4, 227, 230, 8, 4, 227, 232, 8, 4,
- 227, 212, 8, 4, 227, 220, 8, 4, 227, 216, 8, 4, 227, 213, 8, 4, 227, 214,
- 8, 4, 227, 207, 8, 4, 227, 206, 8, 4, 227, 211, 8, 4, 227, 210, 8, 4,
- 227, 208, 8, 4, 227, 209, 8, 4, 220, 55, 8, 4, 189, 8, 4, 220, 117, 8, 4,
- 220, 58, 8, 4, 220, 109, 8, 4, 220, 112, 8, 4, 220, 110, 8, 4, 222, 142,
- 8, 4, 222, 132, 8, 4, 222, 202, 8, 4, 222, 150, 8, 4, 218, 228, 8, 4,
- 218, 230, 8, 4, 218, 229, 8, 4, 219, 221, 8, 4, 219, 210, 8, 4, 219, 242,
- 8, 4, 219, 224, 8, 4, 221, 35, 8, 4, 222, 100, 8, 4, 221, 59, 8, 4, 218,
- 206, 8, 4, 218, 204, 8, 4, 219, 27, 8, 4, 218, 227, 8, 4, 218, 209, 8, 4,
- 218, 217, 8, 4, 218, 113, 8, 4, 218, 112, 8, 4, 218, 177, 8, 4, 218, 119,
- 8, 4, 218, 114, 8, 4, 218, 118, 8, 4, 219, 123, 8, 4, 219, 122, 8, 4,
- 219, 128, 8, 4, 219, 124, 8, 4, 219, 125, 8, 4, 219, 127, 8, 4, 219, 126,
- 8, 4, 219, 135, 8, 4, 219, 134, 8, 4, 219, 157, 8, 4, 219, 136, 8, 4,
- 219, 119, 8, 4, 219, 118, 8, 4, 219, 121, 8, 4, 219, 120, 8, 4, 219, 130,
- 8, 4, 219, 133, 8, 4, 219, 131, 8, 4, 219, 115, 8, 4, 219, 114, 8, 4,
- 219, 117, 8, 4, 219, 116, 8, 4, 219, 109, 8, 4, 219, 108, 8, 4, 219, 113,
- 8, 4, 219, 112, 8, 4, 219, 110, 8, 4, 219, 111, 8, 4, 212, 70, 8, 4, 212,
- 69, 8, 4, 212, 75, 8, 4, 212, 72, 8, 4, 212, 52, 8, 4, 212, 54, 8, 4,
- 212, 53, 8, 4, 212, 57, 8, 4, 212, 56, 8, 4, 212, 60, 8, 4, 212, 58, 8,
- 4, 212, 64, 8, 4, 212, 63, 8, 4, 212, 67, 8, 4, 212, 65, 8, 4, 212, 48,
- 8, 4, 212, 47, 8, 4, 212, 55, 8, 4, 212, 51, 8, 4, 212, 49, 8, 4, 212,
- 50, 8, 4, 212, 40, 8, 4, 212, 39, 8, 4, 212, 44, 8, 4, 212, 43, 8, 4,
- 212, 41, 8, 4, 212, 42, 8, 4, 250, 72, 8, 4, 250, 69, 8, 4, 250, 92, 8,
- 4, 250, 80, 8, 4, 250, 2, 8, 4, 250, 1, 8, 4, 250, 4, 8, 4, 250, 3, 8, 4,
- 250, 16, 8, 4, 250, 15, 8, 4, 250, 23, 8, 4, 250, 18, 8, 4, 250, 52, 8,
- 4, 250, 50, 8, 4, 250, 67, 8, 4, 250, 58, 8, 4, 249, 252, 8, 4, 250, 6,
- 8, 4, 250, 0, 8, 4, 249, 253, 8, 4, 249, 255, 8, 4, 249, 246, 8, 4, 249,
- 245, 8, 4, 249, 250, 8, 4, 249, 249, 8, 4, 249, 247, 8, 4, 249, 248, 8,
- 4, 223, 80, 8, 4, 223, 81, 8, 4, 223, 67, 8, 4, 223, 68, 8, 4, 223, 71,
- 8, 4, 223, 70, 8, 4, 223, 73, 8, 4, 223, 72, 8, 4, 223, 75, 8, 4, 223,
- 74, 8, 4, 223, 79, 8, 4, 223, 76, 8, 4, 223, 63, 8, 4, 223, 62, 8, 4,
- 223, 69, 8, 4, 223, 66, 8, 4, 223, 64, 8, 4, 223, 65, 8, 4, 223, 57, 8,
- 4, 223, 56, 8, 4, 223, 61, 8, 4, 223, 60, 8, 4, 223, 58, 8, 4, 223, 59,
- 8, 4, 228, 145, 8, 4, 228, 144, 8, 4, 228, 147, 8, 4, 228, 146, 8, 4,
- 228, 137, 8, 4, 228, 139, 8, 4, 228, 138, 8, 4, 228, 141, 8, 4, 228, 140,
- 8, 4, 228, 143, 8, 4, 228, 142, 8, 4, 228, 132, 8, 4, 228, 131, 8, 4,
- 228, 136, 8, 4, 228, 135, 8, 4, 228, 133, 8, 4, 228, 134, 8, 4, 228, 126,
- 8, 4, 228, 125, 8, 4, 228, 130, 8, 4, 228, 129, 8, 4, 228, 127, 8, 4,
- 228, 128, 8, 4, 220, 251, 8, 4, 220, 247, 8, 4, 221, 24, 8, 4, 221, 6, 8,
- 4, 220, 140, 8, 4, 220, 142, 8, 4, 220, 141, 8, 4, 220, 160, 8, 4, 220,
- 157, 8, 4, 220, 187, 8, 4, 220, 178, 8, 4, 220, 222, 8, 4, 220, 215, 8,
- 4, 220, 243, 8, 4, 220, 230, 8, 4, 220, 136, 8, 4, 220, 135, 8, 4, 220,
- 150, 8, 4, 220, 139, 8, 4, 220, 137, 8, 4, 220, 138, 8, 4, 220, 120, 8,
- 4, 220, 119, 8, 4, 220, 126, 8, 4, 220, 123, 8, 4, 220, 121, 8, 4, 220,
- 122, 8, 4, 224, 33, 8, 4, 224, 28, 8, 4, 203, 8, 4, 224, 39, 8, 4, 223,
- 31, 8, 4, 223, 33, 8, 4, 223, 32, 8, 4, 223, 90, 8, 4, 223, 83, 8, 4,
- 223, 112, 8, 4, 223, 94, 8, 4, 223, 196, 8, 4, 224, 21, 8, 4, 223, 231,
- 8, 4, 223, 24, 8, 4, 223, 22, 8, 4, 223, 51, 8, 4, 223, 30, 8, 4, 223,
- 26, 8, 4, 223, 27, 8, 4, 223, 7, 8, 4, 223, 6, 8, 4, 223, 12, 8, 4, 223,
- 10, 8, 4, 223, 8, 8, 4, 223, 9, 8, 4, 235, 101, 8, 4, 235, 100, 8, 4,
- 235, 110, 8, 4, 235, 102, 8, 4, 235, 106, 8, 4, 235, 105, 8, 4, 235, 108,
- 8, 4, 235, 107, 8, 4, 235, 44, 8, 4, 235, 43, 8, 4, 235, 46, 8, 4, 235,
- 45, 8, 4, 235, 59, 8, 4, 235, 57, 8, 4, 235, 71, 8, 4, 235, 61, 8, 4,
- 235, 38, 8, 4, 235, 36, 8, 4, 235, 54, 8, 4, 235, 42, 8, 4, 235, 39, 8,
- 4, 235, 40, 8, 4, 235, 30, 8, 4, 235, 29, 8, 4, 235, 34, 8, 4, 235, 33,
- 8, 4, 235, 31, 8, 4, 235, 32, 8, 4, 224, 191, 8, 4, 224, 189, 8, 4, 224,
- 198, 8, 4, 224, 192, 8, 4, 224, 195, 8, 4, 224, 194, 8, 4, 224, 197, 8,
- 4, 224, 196, 8, 4, 224, 144, 8, 4, 224, 141, 8, 4, 224, 146, 8, 4, 224,
- 145, 8, 4, 224, 178, 8, 4, 224, 177, 8, 4, 224, 187, 8, 4, 224, 181, 8,
- 4, 224, 136, 8, 4, 224, 132, 8, 4, 224, 175, 8, 4, 224, 140, 8, 4, 224,
- 138, 8, 4, 224, 139, 8, 4, 224, 116, 8, 4, 224, 114, 8, 4, 224, 126, 8,
- 4, 224, 119, 8, 4, 224, 117, 8, 4, 224, 118, 8, 4, 235, 90, 8, 4, 235,
- 89, 8, 4, 235, 96, 8, 4, 235, 91, 8, 4, 235, 93, 8, 4, 235, 92, 8, 4,
- 235, 95, 8, 4, 235, 94, 8, 4, 235, 81, 8, 4, 235, 83, 8, 4, 235, 82, 8,
- 4, 235, 86, 8, 4, 235, 85, 8, 4, 235, 88, 8, 4, 235, 87, 8, 4, 235, 77,
- 8, 4, 235, 76, 8, 4, 235, 84, 8, 4, 235, 80, 8, 4, 235, 78, 8, 4, 235,
- 79, 8, 4, 235, 73, 8, 4, 235, 72, 8, 4, 235, 75, 8, 4, 235, 74, 8, 4,
- 228, 249, 8, 4, 228, 248, 8, 4, 229, 0, 8, 4, 228, 250, 8, 4, 228, 252,
- 8, 4, 228, 251, 8, 4, 228, 255, 8, 4, 228, 253, 8, 4, 228, 238, 8, 4,
- 228, 239, 8, 4, 228, 244, 8, 4, 228, 243, 8, 4, 228, 247, 8, 4, 228, 245,
- 8, 4, 228, 233, 8, 4, 228, 242, 8, 4, 228, 237, 8, 4, 228, 234, 8, 4,
- 228, 235, 8, 4, 228, 228, 8, 4, 228, 227, 8, 4, 228, 232, 8, 4, 228, 231,
- 8, 4, 228, 229, 8, 4, 228, 230, 8, 4, 228, 0, 8, 4, 227, 255, 8, 4, 228,
- 10, 8, 4, 228, 4, 8, 4, 228, 7, 8, 4, 228, 6, 8, 4, 228, 9, 8, 4, 228, 8,
- 8, 4, 227, 243, 8, 4, 227, 245, 8, 4, 227, 244, 8, 4, 227, 249, 8, 4,
- 227, 248, 8, 4, 227, 253, 8, 4, 227, 250, 8, 4, 227, 241, 8, 4, 227, 240,
- 8, 4, 227, 247, 8, 4, 227, 242, 8, 4, 213, 138, 8, 4, 213, 137, 8, 4,
- 213, 145, 8, 4, 213, 140, 8, 4, 213, 142, 8, 4, 213, 141, 8, 4, 213, 144,
- 8, 4, 213, 143, 8, 4, 213, 127, 8, 4, 213, 128, 8, 4, 213, 132, 8, 4,
- 213, 131, 8, 4, 213, 136, 8, 4, 213, 134, 8, 4, 213, 109, 8, 4, 213, 107,
- 8, 4, 213, 119, 8, 4, 213, 112, 8, 4, 213, 110, 8, 4, 213, 111, 8, 4,
- 212, 241, 8, 4, 212, 239, 8, 4, 212, 255, 8, 4, 212, 242, 8, 4, 212, 249,
- 8, 4, 212, 248, 8, 4, 212, 252, 8, 4, 212, 250, 8, 4, 212, 182, 8, 4,
- 212, 181, 8, 4, 212, 185, 8, 4, 212, 183, 8, 4, 212, 215, 8, 4, 212, 212,
- 8, 4, 212, 235, 8, 4, 212, 219, 8, 4, 212, 173, 8, 4, 212, 170, 8, 4,
- 212, 203, 8, 4, 212, 180, 8, 4, 212, 176, 8, 4, 212, 177, 8, 4, 212, 155,
- 8, 4, 212, 154, 8, 4, 212, 161, 8, 4, 212, 158, 8, 4, 212, 156, 8, 4,
- 212, 157, 8, 34, 224, 178, 8, 34, 233, 13, 8, 34, 234, 70, 8, 34, 228, 4,
- 8, 34, 249, 12, 8, 34, 219, 128, 8, 34, 242, 244, 8, 34, 243, 20, 8, 34,
- 231, 42, 8, 34, 240, 172, 8, 34, 232, 116, 8, 34, 252, 3, 8, 34, 230,
- 196, 8, 34, 212, 235, 8, 34, 225, 8, 8, 34, 240, 166, 8, 34, 217, 253, 8,
- 34, 243, 110, 8, 34, 212, 0, 8, 34, 249, 6, 8, 34, 248, 46, 8, 34, 251,
- 27, 8, 34, 242, 240, 8, 34, 227, 250, 8, 34, 216, 82, 8, 34, 227, 41, 8,
- 34, 235, 77, 8, 34, 212, 12, 8, 34, 224, 244, 8, 34, 241, 94, 8, 34, 212,
- 241, 8, 34, 214, 95, 8, 34, 220, 126, 8, 34, 214, 221, 8, 34, 212, 109,
- 8, 34, 235, 71, 8, 34, 227, 216, 8, 34, 235, 75, 8, 34, 242, 130, 8, 34,
- 235, 95, 8, 34, 213, 214, 8, 34, 246, 33, 8, 34, 220, 138, 8, 34, 233, 8,
- 8, 34, 249, 16, 8, 34, 249, 46, 8, 34, 249, 230, 8, 34, 240, 169, 8, 34,
- 220, 251, 8, 34, 211, 255, 8, 34, 220, 178, 8, 34, 250, 67, 8, 34, 211,
- 230, 8, 34, 229, 252, 8, 34, 234, 188, 232, 225, 1, 252, 107, 232, 225,
- 1, 193, 232, 225, 1, 226, 23, 232, 225, 1, 248, 164, 232, 225, 1, 218,
- 52, 232, 225, 1, 217, 161, 232, 225, 1, 243, 110, 232, 225, 1, 181, 232,
- 225, 1, 234, 138, 232, 225, 1, 235, 139, 232, 225, 1, 250, 219, 232, 225,
- 1, 250, 92, 232, 225, 1, 245, 249, 232, 225, 1, 216, 141, 232, 225, 1,
- 216, 133, 232, 225, 1, 188, 232, 225, 1, 205, 232, 225, 1, 233, 157, 232,
- 225, 1, 222, 202, 232, 225, 1, 212, 75, 232, 225, 1, 212, 109, 232, 225,
- 1, 229, 159, 232, 225, 1, 159, 232, 225, 1, 213, 153, 232, 225, 1, 241,
- 174, 232, 225, 1, 244, 164, 232, 225, 1, 214, 49, 232, 225, 1, 221, 24,
- 232, 225, 1, 186, 232, 225, 1, 242, 225, 232, 225, 1, 61, 232, 225, 1,
- 254, 148, 232, 225, 1, 74, 232, 225, 1, 245, 22, 232, 225, 1, 72, 232,
- 225, 1, 75, 232, 225, 1, 69, 232, 225, 1, 215, 183, 232, 225, 1, 215,
- 178, 232, 225, 1, 227, 99, 232, 225, 1, 160, 230, 104, 217, 71, 232, 225,
- 1, 160, 230, 46, 225, 150, 232, 225, 1, 160, 230, 104, 249, 15, 232, 225,
- 1, 160, 230, 104, 251, 128, 232, 225, 1, 160, 230, 104, 205, 232, 225, 1,
- 160, 230, 104, 235, 116, 232, 225, 225, 27, 249, 157, 232, 225, 225, 27,
- 243, 200, 219, 69, 39, 4, 245, 165, 39, 4, 245, 162, 39, 4, 241, 204, 39,
- 4, 214, 1, 39, 4, 214, 0, 39, 4, 226, 86, 39, 4, 251, 191, 39, 4, 251,
- 242, 39, 4, 231, 179, 39, 4, 234, 0, 39, 4, 231, 73, 39, 4, 243, 51, 39,
- 4, 244, 116, 39, 4, 214, 227, 39, 4, 217, 219, 39, 4, 217, 147, 39, 4,
- 247, 224, 39, 4, 247, 221, 39, 4, 233, 74, 39, 4, 224, 1, 39, 4, 248, 28,
- 39, 4, 229, 219, 39, 4, 222, 89, 39, 4, 220, 241, 39, 4, 212, 85, 39, 4,
- 212, 66, 39, 4, 250, 116, 39, 4, 235, 125, 39, 4, 229, 7, 39, 4, 213, 35,
- 39, 4, 234, 187, 39, 4, 229, 136, 39, 4, 243, 31, 39, 4, 231, 145, 39, 4,
- 229, 184, 39, 4, 228, 16, 39, 4, 72, 39, 4, 235, 251, 39, 4, 241, 165,
- 39, 4, 241, 146, 39, 4, 213, 235, 39, 4, 213, 226, 39, 4, 225, 240, 39,
- 4, 251, 189, 39, 4, 251, 184, 39, 4, 231, 172, 39, 4, 233, 253, 39, 4,
- 231, 70, 39, 4, 243, 47, 39, 4, 244, 90, 39, 4, 214, 154, 39, 4, 217, 71,
- 39, 4, 217, 128, 39, 4, 247, 216, 39, 4, 247, 220, 39, 4, 233, 13, 39, 4,
- 223, 188, 39, 4, 247, 211, 39, 4, 229, 213, 39, 4, 220, 117, 39, 4, 220,
- 212, 39, 4, 212, 37, 39, 4, 212, 62, 39, 4, 249, 244, 39, 4, 235, 110,
- 39, 4, 229, 0, 39, 4, 212, 255, 39, 4, 234, 101, 39, 4, 229, 128, 39, 4,
- 242, 190, 39, 4, 231, 42, 39, 4, 229, 64, 39, 4, 228, 10, 39, 4, 61, 39,
- 4, 254, 32, 39, 4, 229, 155, 39, 4, 159, 39, 4, 242, 1, 39, 4, 214, 49,
- 39, 4, 214, 39, 39, 4, 193, 39, 4, 251, 195, 39, 4, 252, 107, 39, 4, 231,
- 187, 39, 4, 234, 4, 39, 4, 234, 3, 39, 4, 231, 77, 39, 4, 243, 55, 39, 4,
- 244, 164, 39, 4, 215, 1, 39, 4, 218, 52, 39, 4, 217, 161, 39, 4, 247,
- 232, 39, 4, 247, 223, 39, 4, 233, 157, 39, 4, 203, 39, 4, 248, 164, 39,
- 4, 229, 228, 39, 4, 222, 202, 39, 4, 221, 24, 39, 4, 212, 109, 39, 4,
- 212, 75, 39, 4, 250, 219, 39, 4, 235, 139, 39, 4, 229, 16, 39, 4, 186,
- 39, 4, 181, 39, 4, 234, 239, 39, 4, 229, 141, 39, 4, 243, 110, 39, 4,
- 188, 39, 4, 205, 39, 4, 228, 23, 39, 4, 227, 49, 39, 4, 227, 45, 39, 4,
- 241, 39, 39, 4, 213, 202, 39, 4, 213, 198, 39, 4, 225, 129, 39, 4, 251,
- 187, 39, 4, 251, 118, 39, 4, 231, 167, 39, 4, 233, 251, 39, 4, 231, 66,
- 39, 4, 243, 43, 39, 4, 244, 3, 39, 4, 214, 108, 39, 4, 216, 230, 39, 4,
- 217, 106, 39, 4, 247, 214, 39, 4, 247, 218, 39, 4, 232, 180, 39, 4, 223,
- 99, 39, 4, 247, 79, 39, 4, 229, 200, 39, 4, 219, 226, 39, 4, 220, 181,
- 39, 4, 212, 14, 39, 4, 212, 59, 39, 4, 249, 113, 39, 4, 235, 62, 39, 4,
- 228, 246, 39, 4, 212, 220, 39, 4, 234, 19, 39, 4, 229, 126, 39, 4, 242,
- 140, 39, 4, 230, 202, 39, 4, 228, 175, 39, 4, 227, 251, 39, 4, 69, 39, 4,
- 215, 160, 39, 4, 240, 212, 39, 4, 240, 202, 39, 4, 213, 183, 39, 4, 213,
- 177, 39, 4, 225, 35, 39, 4, 251, 186, 39, 4, 251, 54, 39, 4, 231, 166,
- 39, 4, 233, 249, 39, 4, 231, 65, 39, 4, 243, 42, 39, 4, 243, 205, 39, 4,
- 214, 99, 39, 4, 216, 82, 39, 4, 217, 90, 39, 4, 247, 212, 39, 4, 247,
- 217, 39, 4, 232, 156, 39, 4, 223, 51, 39, 4, 246, 33, 39, 4, 229, 195,
- 39, 4, 219, 27, 39, 4, 220, 150, 39, 4, 212, 8, 39, 4, 212, 55, 39, 4,
- 249, 53, 39, 4, 235, 54, 39, 4, 228, 242, 39, 4, 212, 203, 39, 4, 233,
- 238, 39, 4, 229, 125, 39, 4, 242, 92, 39, 4, 230, 172, 39, 4, 228, 92,
- 39, 4, 227, 247, 39, 4, 75, 39, 4, 227, 62, 39, 4, 229, 86, 39, 4, 241,
- 54, 39, 4, 241, 42, 39, 4, 213, 214, 39, 4, 213, 203, 39, 4, 225, 150,
- 39, 4, 251, 188, 39, 4, 251, 128, 39, 4, 231, 168, 39, 4, 233, 252, 39,
- 4, 231, 68, 39, 4, 243, 45, 39, 4, 243, 44, 39, 4, 244, 12, 39, 4, 214,
- 119, 39, 4, 108, 39, 4, 217, 109, 39, 4, 247, 215, 39, 4, 247, 219, 39,
- 4, 232, 208, 39, 4, 223, 112, 39, 4, 247, 99, 39, 4, 229, 204, 39, 4,
- 219, 242, 39, 4, 220, 187, 39, 4, 212, 16, 39, 4, 212, 60, 39, 4, 249,
- 175, 39, 4, 235, 71, 39, 4, 228, 247, 39, 4, 212, 235, 39, 4, 234, 37,
- 39, 4, 229, 127, 39, 4, 242, 150, 39, 4, 230, 231, 39, 4, 228, 185, 39,
- 4, 227, 253, 39, 4, 74, 39, 4, 245, 108, 39, 4, 229, 146, 39, 4, 241,
- 222, 39, 4, 241, 193, 39, 4, 214, 6, 39, 4, 213, 253, 39, 4, 226, 96, 39,
- 4, 251, 192, 39, 4, 251, 251, 39, 4, 231, 180, 39, 4, 234, 1, 39, 4, 233,
- 255, 39, 4, 231, 74, 39, 4, 243, 52, 39, 4, 243, 50, 39, 4, 244, 123, 39,
- 4, 214, 232, 39, 4, 217, 229, 39, 4, 217, 148, 39, 4, 247, 225, 39, 4,
- 247, 222, 39, 4, 233, 82, 39, 4, 224, 21, 39, 4, 248, 41, 39, 4, 229,
- 220, 39, 4, 222, 100, 39, 4, 220, 243, 39, 4, 212, 87, 39, 4, 212, 67,
- 39, 4, 250, 124, 39, 4, 235, 127, 39, 4, 229, 9, 39, 4, 213, 38, 39, 4,
- 234, 188, 39, 4, 229, 137, 39, 4, 229, 133, 39, 4, 243, 38, 39, 4, 243,
- 27, 39, 4, 231, 156, 39, 4, 229, 187, 39, 4, 228, 17, 39, 4, 229, 161,
- 39, 4, 233, 46, 39, 249, 157, 39, 243, 200, 219, 69, 39, 224, 158, 77,
- 39, 4, 229, 203, 244, 164, 39, 4, 229, 203, 181, 39, 4, 229, 203, 219,
- 226, 39, 16, 244, 113, 39, 16, 234, 186, 39, 16, 217, 34, 39, 16, 229,
- 39, 39, 16, 252, 66, 39, 16, 244, 163, 39, 16, 218, 49, 39, 16, 248, 121,
- 39, 16, 247, 78, 39, 16, 233, 227, 39, 16, 216, 234, 39, 16, 247, 98, 39,
- 16, 235, 63, 39, 21, 212, 79, 39, 21, 116, 39, 21, 109, 39, 21, 166, 39,
- 21, 163, 39, 21, 180, 39, 21, 189, 39, 21, 198, 39, 21, 195, 39, 21, 200,
- 39, 4, 229, 203, 188, 39, 4, 229, 203, 247, 99, 33, 6, 1, 212, 83, 33, 3,
- 1, 212, 83, 33, 6, 1, 245, 245, 33, 3, 1, 245, 245, 33, 6, 1, 223, 202,
- 245, 247, 33, 3, 1, 223, 202, 245, 247, 33, 6, 1, 235, 183, 33, 3, 1,
- 235, 183, 33, 6, 1, 247, 113, 33, 3, 1, 247, 113, 33, 6, 1, 230, 210,
- 215, 175, 33, 3, 1, 230, 210, 215, 175, 33, 6, 1, 251, 64, 227, 67, 33,
- 3, 1, 251, 64, 227, 67, 33, 6, 1, 229, 169, 213, 22, 33, 3, 1, 229, 169,
- 213, 22, 33, 6, 1, 213, 19, 2, 252, 102, 213, 22, 33, 3, 1, 213, 19, 2,
- 252, 102, 213, 22, 33, 6, 1, 235, 181, 213, 49, 33, 3, 1, 235, 181, 213,
- 49, 33, 6, 1, 223, 202, 212, 203, 33, 3, 1, 223, 202, 212, 203, 33, 6, 1,
- 235, 181, 61, 33, 3, 1, 235, 181, 61, 33, 6, 1, 249, 193, 232, 221, 212,
- 174, 33, 3, 1, 249, 193, 232, 221, 212, 174, 33, 6, 1, 251, 137, 212,
- 174, 33, 3, 1, 251, 137, 212, 174, 33, 6, 1, 235, 181, 249, 193, 232,
- 221, 212, 174, 33, 3, 1, 235, 181, 249, 193, 232, 221, 212, 174, 33, 6,
- 1, 212, 237, 33, 3, 1, 212, 237, 33, 6, 1, 223, 202, 216, 136, 33, 3, 1,
- 223, 202, 216, 136, 33, 6, 1, 219, 236, 248, 41, 33, 3, 1, 219, 236, 248,
- 41, 33, 6, 1, 219, 236, 245, 131, 33, 3, 1, 219, 236, 245, 131, 33, 6, 1,
- 219, 236, 245, 117, 33, 3, 1, 219, 236, 245, 117, 33, 6, 1, 230, 214, 75,
- 33, 3, 1, 230, 214, 75, 33, 6, 1, 251, 163, 75, 33, 3, 1, 251, 163, 75,
- 33, 6, 1, 51, 230, 214, 75, 33, 3, 1, 51, 230, 214, 75, 33, 1, 230, 156,
- 75, 37, 33, 214, 84, 37, 33, 217, 201, 231, 4, 52, 37, 33, 240, 201, 231,
- 4, 52, 37, 33, 217, 101, 231, 4, 52, 220, 21, 253, 132, 37, 33, 234, 198,
- 37, 33, 226, 101, 33, 234, 198, 33, 226, 101, 33, 6, 1, 246, 1, 33, 3, 1,
- 246, 1, 33, 6, 1, 245, 238, 33, 3, 1, 245, 238, 33, 6, 1, 212, 45, 33, 3,
- 1, 212, 45, 33, 6, 1, 250, 140, 33, 3, 1, 250, 140, 33, 6, 1, 245, 237,
- 33, 3, 1, 245, 237, 33, 6, 1, 217, 230, 2, 231, 37, 101, 33, 3, 1, 217,
- 230, 2, 231, 37, 101, 33, 6, 1, 216, 43, 33, 3, 1, 216, 43, 33, 6, 1,
- 216, 119, 33, 3, 1, 216, 119, 33, 6, 1, 216, 123, 33, 3, 1, 216, 123, 33,
- 6, 1, 217, 235, 33, 3, 1, 217, 235, 33, 6, 1, 240, 190, 33, 3, 1, 240,
- 190, 33, 6, 1, 220, 132, 33, 3, 1, 220, 132, 20, 1, 61, 20, 1, 181, 20,
- 1, 69, 20, 1, 233, 238, 20, 1, 245, 165, 20, 1, 224, 1, 20, 1, 218, 35,
- 20, 1, 75, 20, 1, 228, 10, 20, 1, 72, 20, 1, 233, 157, 20, 1, 193, 20, 1,
- 223, 136, 20, 1, 223, 182, 20, 1, 233, 73, 20, 1, 231, 144, 20, 1, 218,
- 49, 20, 1, 229, 226, 20, 1, 229, 14, 20, 1, 183, 20, 1, 218, 205, 20, 1,
- 230, 172, 20, 1, 220, 207, 20, 1, 220, 117, 20, 1, 220, 217, 20, 1, 221,
- 44, 20, 1, 233, 177, 20, 1, 234, 162, 20, 1, 228, 64, 20, 1, 228, 92, 20,
- 1, 228, 241, 20, 1, 212, 217, 20, 1, 220, 150, 20, 1, 212, 178, 20, 1,
- 186, 20, 1, 228, 120, 20, 1, 234, 148, 20, 1, 226, 27, 20, 1, 229, 7, 20,
- 1, 228, 101, 20, 1, 225, 30, 20, 1, 213, 180, 20, 1, 226, 86, 20, 1, 244,
- 116, 20, 1, 223, 51, 20, 1, 232, 156, 20, 1, 231, 42, 20, 1, 229, 64, 20,
- 1, 223, 204, 20, 1, 224, 61, 20, 1, 234, 171, 20, 1, 229, 93, 20, 1, 229,
- 141, 20, 1, 229, 159, 20, 1, 220, 187, 20, 1, 225, 33, 20, 1, 243, 205,
- 20, 1, 244, 6, 20, 1, 214, 49, 20, 1, 205, 20, 1, 233, 13, 20, 1, 225,
- 240, 20, 1, 232, 174, 20, 1, 234, 37, 20, 1, 231, 177, 20, 1, 223, 233,
- 20, 1, 231, 122, 20, 1, 188, 20, 1, 217, 71, 20, 1, 234, 101, 20, 1, 230,
- 231, 20, 1, 231, 185, 20, 1, 217, 183, 20, 1, 234, 4, 20, 1, 217, 200,
- 20, 1, 228, 93, 20, 1, 222, 166, 20, 1, 244, 160, 20, 1, 234, 6, 20, 1,
- 234, 33, 20, 37, 152, 234, 14, 20, 37, 152, 216, 74, 20, 229, 13, 20,
- 243, 200, 219, 69, 20, 249, 164, 20, 249, 157, 20, 221, 70, 20, 224, 158,
- 77, 59, 1, 250, 33, 160, 212, 245, 225, 193, 59, 1, 250, 33, 160, 213,
- 59, 225, 193, 59, 1, 250, 33, 160, 212, 245, 221, 7, 59, 1, 250, 33, 160,
- 213, 59, 221, 7, 59, 1, 250, 33, 160, 212, 245, 224, 175, 59, 1, 250, 33,
- 160, 213, 59, 224, 175, 59, 1, 250, 33, 160, 212, 245, 223, 51, 59, 1,
- 250, 33, 160, 213, 59, 223, 51, 59, 1, 244, 244, 246, 72, 160, 134, 59,
- 1, 124, 246, 72, 160, 134, 59, 1, 231, 38, 246, 72, 160, 134, 59, 1, 115,
- 246, 72, 160, 134, 59, 1, 244, 243, 246, 72, 160, 134, 59, 1, 244, 244,
- 246, 72, 233, 63, 160, 134, 59, 1, 124, 246, 72, 233, 63, 160, 134, 59,
- 1, 231, 38, 246, 72, 233, 63, 160, 134, 59, 1, 115, 246, 72, 233, 63,
- 160, 134, 59, 1, 244, 243, 246, 72, 233, 63, 160, 134, 59, 1, 244, 244,
- 233, 63, 160, 134, 59, 1, 124, 233, 63, 160, 134, 59, 1, 231, 38, 233,
- 63, 160, 134, 59, 1, 115, 233, 63, 160, 134, 59, 1, 244, 243, 233, 63,
- 160, 134, 59, 1, 62, 71, 134, 59, 1, 62, 220, 23, 59, 1, 62, 199, 134,
- 59, 1, 232, 163, 46, 249, 100, 254, 18, 59, 1, 224, 48, 114, 68, 59, 1,
- 224, 48, 119, 68, 59, 1, 224, 48, 244, 254, 77, 59, 1, 224, 48, 235, 191,
- 244, 254, 77, 59, 1, 115, 235, 191, 244, 254, 77, 59, 1, 219, 51, 24,
- 124, 216, 241, 59, 1, 219, 51, 24, 115, 216, 241, 7, 6, 1, 245, 156, 254,
- 78, 7, 3, 1, 245, 156, 254, 78, 7, 6, 1, 245, 156, 254, 103, 7, 3, 1,
- 245, 156, 254, 103, 7, 6, 1, 241, 191, 7, 3, 1, 241, 191, 7, 6, 1, 216,
- 6, 7, 3, 1, 216, 6, 7, 6, 1, 216, 187, 7, 3, 1, 216, 187, 7, 6, 1, 249,
- 51, 7, 3, 1, 249, 51, 7, 6, 1, 249, 52, 2, 249, 157, 7, 3, 1, 249, 52, 2,
- 249, 157, 7, 1, 3, 6, 244, 230, 7, 1, 3, 6, 197, 7, 6, 1, 254, 232, 7, 3,
- 1, 254, 232, 7, 6, 1, 253, 240, 7, 3, 1, 253, 240, 7, 6, 1, 253, 108, 7,
- 3, 1, 253, 108, 7, 6, 1, 253, 92, 7, 3, 1, 253, 92, 7, 6, 1, 253, 93, 2,
- 199, 134, 7, 3, 1, 253, 93, 2, 199, 134, 7, 6, 1, 253, 83, 7, 3, 1, 253,
- 83, 7, 6, 1, 223, 202, 250, 253, 2, 247, 74, 7, 3, 1, 223, 202, 250, 253,
- 2, 247, 74, 7, 6, 1, 235, 28, 2, 90, 7, 3, 1, 235, 28, 2, 90, 7, 6, 1,
- 235, 28, 2, 247, 207, 90, 7, 3, 1, 235, 28, 2, 247, 207, 90, 7, 6, 1,
- 235, 28, 2, 219, 45, 24, 247, 207, 90, 7, 3, 1, 235, 28, 2, 219, 45, 24,
- 247, 207, 90, 7, 6, 1, 251, 63, 150, 7, 3, 1, 251, 63, 150, 7, 6, 1, 233,
- 171, 2, 124, 90, 7, 3, 1, 233, 171, 2, 124, 90, 7, 6, 1, 157, 2, 184,
- 219, 45, 226, 244, 7, 3, 1, 157, 2, 184, 219, 45, 226, 244, 7, 6, 1, 157,
- 2, 232, 177, 7, 3, 1, 157, 2, 232, 177, 7, 6, 1, 227, 49, 7, 3, 1, 227,
- 49, 7, 6, 1, 226, 230, 2, 219, 45, 217, 93, 247, 246, 7, 3, 1, 226, 230,
- 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 226, 230, 2, 244, 22, 7, 3, 1,
- 226, 230, 2, 244, 22, 7, 6, 1, 226, 230, 2, 219, 161, 218, 27, 7, 3, 1,
- 226, 230, 2, 219, 161, 218, 27, 7, 6, 1, 224, 241, 2, 219, 45, 217, 93,
- 247, 246, 7, 3, 1, 224, 241, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 224,
- 241, 2, 247, 207, 90, 7, 3, 1, 224, 241, 2, 247, 207, 90, 7, 6, 1, 224,
- 113, 223, 88, 7, 3, 1, 224, 113, 223, 88, 7, 6, 1, 223, 41, 223, 88, 7,
- 3, 1, 223, 41, 223, 88, 7, 6, 1, 215, 80, 2, 247, 207, 90, 7, 3, 1, 215,
- 80, 2, 247, 207, 90, 7, 6, 1, 214, 90, 7, 3, 1, 214, 90, 7, 6, 1, 214,
- 126, 212, 152, 7, 3, 1, 214, 126, 212, 152, 7, 6, 1, 217, 105, 2, 90, 7,
- 3, 1, 217, 105, 2, 90, 7, 6, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246,
- 7, 3, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 214, 222, 7,
- 3, 1, 214, 222, 7, 6, 1, 245, 30, 7, 3, 1, 245, 30, 7, 6, 1, 235, 169, 7,
- 3, 1, 235, 169, 7, 6, 1, 249, 146, 7, 3, 1, 249, 146, 59, 1, 215, 104, 7,
- 3, 1, 246, 24, 7, 3, 1, 232, 142, 7, 3, 1, 230, 150, 7, 3, 1, 228, 57, 7,
- 3, 1, 223, 40, 7, 1, 3, 6, 223, 40, 7, 3, 1, 216, 72, 7, 3, 1, 215, 167,
- 7, 6, 1, 235, 210, 249, 3, 7, 3, 1, 235, 210, 249, 3, 7, 6, 1, 235, 210,
- 244, 230, 7, 3, 1, 235, 210, 244, 230, 7, 6, 1, 235, 210, 243, 177, 7, 6,
- 1, 216, 58, 235, 210, 243, 177, 7, 3, 1, 216, 58, 235, 210, 243, 177, 7,
- 6, 1, 216, 58, 150, 7, 3, 1, 216, 58, 150, 7, 6, 1, 235, 210, 149, 7, 3,
- 1, 235, 210, 149, 7, 6, 1, 235, 210, 197, 7, 3, 1, 235, 210, 197, 7, 6,
- 1, 235, 210, 218, 99, 7, 3, 1, 235, 210, 218, 99, 59, 1, 115, 249, 224,
- 254, 174, 59, 1, 249, 164, 59, 1, 220, 175, 245, 61, 52, 7, 6, 1, 222,
- 170, 7, 3, 1, 222, 170, 7, 6, 1, 216, 58, 242, 41, 7, 3, 1, 233, 171, 2,
- 223, 207, 241, 38, 24, 251, 218, 7, 6, 1, 230, 98, 2, 247, 246, 7, 3, 1,
- 230, 98, 2, 247, 246, 7, 6, 1, 243, 178, 2, 227, 112, 90, 7, 3, 1, 243,
- 178, 2, 227, 112, 90, 7, 6, 1, 235, 28, 2, 227, 112, 90, 7, 3, 1, 235,
- 28, 2, 227, 112, 90, 7, 6, 1, 230, 98, 2, 227, 112, 90, 7, 3, 1, 230, 98,
- 2, 227, 112, 90, 7, 6, 1, 224, 113, 2, 227, 112, 90, 7, 3, 1, 224, 113,
- 2, 227, 112, 90, 7, 6, 1, 223, 4, 2, 227, 112, 90, 7, 3, 1, 223, 4, 2,
- 227, 112, 90, 7, 1, 3, 6, 216, 58, 183, 7, 245, 66, 1, 223, 202, 244,
- 230, 7, 245, 66, 1, 223, 202, 226, 229, 7, 245, 66, 1, 235, 191, 183, 7,
- 245, 66, 1, 240, 146, 232, 182, 7, 245, 66, 1, 253, 193, 183, 218, 175,
- 230, 32, 1, 61, 218, 175, 230, 32, 1, 72, 218, 175, 230, 32, 5, 246, 3,
- 218, 175, 230, 32, 1, 69, 218, 175, 230, 32, 1, 74, 218, 175, 230, 32, 1,
- 75, 218, 175, 230, 32, 5, 241, 236, 218, 175, 230, 32, 1, 234, 37, 218,
- 175, 230, 32, 1, 234, 113, 218, 175, 230, 32, 1, 242, 150, 218, 175, 230,
- 32, 1, 242, 200, 218, 175, 230, 32, 5, 253, 242, 218, 175, 230, 32, 1,
- 249, 175, 218, 175, 230, 32, 1, 250, 23, 218, 175, 230, 32, 1, 235, 71,
- 218, 175, 230, 32, 1, 235, 111, 218, 175, 230, 32, 1, 216, 95, 218, 175,
- 230, 32, 1, 216, 100, 218, 175, 230, 32, 1, 248, 56, 218, 175, 230, 32,
- 1, 248, 65, 218, 175, 230, 32, 1, 108, 218, 175, 230, 32, 1, 217, 109,
- 218, 175, 230, 32, 1, 247, 99, 218, 175, 230, 32, 1, 247, 215, 218, 175,
- 230, 32, 1, 228, 185, 218, 175, 230, 32, 1, 225, 150, 218, 175, 230, 32,
- 1, 225, 253, 218, 175, 230, 32, 1, 251, 128, 218, 175, 230, 32, 1, 251,
- 188, 218, 175, 230, 32, 1, 230, 231, 218, 175, 230, 32, 1, 223, 112, 218,
- 175, 230, 32, 1, 232, 208, 218, 175, 230, 32, 1, 223, 73, 218, 175, 230,
- 32, 1, 219, 242, 218, 175, 230, 32, 1, 241, 54, 218, 175, 230, 32, 30, 5,
- 61, 218, 175, 230, 32, 30, 5, 72, 218, 175, 230, 32, 30, 5, 69, 218, 175,
- 230, 32, 30, 5, 74, 218, 175, 230, 32, 30, 5, 227, 49, 218, 175, 230, 32,
- 225, 146, 231, 221, 218, 175, 230, 32, 225, 146, 231, 220, 218, 175, 230,
- 32, 225, 146, 231, 219, 218, 175, 230, 32, 225, 146, 231, 218, 228, 167,
- 235, 237, 243, 228, 122, 224, 166, 228, 167, 235, 237, 243, 228, 122,
- 242, 9, 228, 167, 235, 237, 243, 228, 133, 224, 164, 228, 167, 235, 237,
- 243, 228, 122, 220, 45, 228, 167, 235, 237, 243, 228, 122, 245, 145, 228,
- 167, 235, 237, 243, 228, 133, 220, 44, 228, 167, 235, 237, 224, 167, 77,
- 228, 167, 235, 237, 225, 172, 77, 228, 167, 235, 237, 223, 29, 77, 228,
- 167, 235, 237, 224, 168, 77, 226, 20, 1, 181, 226, 20, 1, 234, 138, 226,
- 20, 1, 243, 110, 226, 20, 1, 229, 159, 226, 20, 1, 250, 219, 226, 20, 1,
- 250, 92, 226, 20, 1, 235, 139, 226, 20, 1, 228, 23, 226, 20, 1, 218, 52,
- 226, 20, 1, 217, 161, 226, 20, 1, 248, 164, 226, 20, 1, 205, 226, 20, 1,
- 193, 226, 20, 1, 226, 23, 226, 20, 1, 252, 107, 226, 20, 1, 188, 226, 20,
- 1, 216, 141, 226, 20, 1, 216, 133, 226, 20, 1, 245, 249, 226, 20, 1, 214,
- 49, 226, 20, 1, 212, 75, 226, 20, 1, 212, 109, 226, 20, 1, 3, 61, 226,
- 20, 1, 186, 226, 20, 1, 203, 226, 20, 1, 233, 157, 226, 20, 1, 221, 24,
- 226, 20, 1, 222, 202, 226, 20, 1, 159, 226, 20, 1, 61, 226, 20, 1, 72,
- 226, 20, 1, 69, 226, 20, 1, 74, 226, 20, 1, 75, 226, 20, 1, 224, 232,
- 226, 20, 1, 213, 153, 226, 20, 1, 244, 164, 226, 20, 1, 243, 5, 226, 20,
- 1, 245, 165, 226, 20, 219, 18, 1, 214, 49, 226, 20, 219, 18, 1, 186, 226,
- 20, 1, 216, 115, 226, 20, 1, 216, 105, 226, 20, 1, 248, 86, 226, 20, 1,
- 228, 198, 226, 20, 1, 254, 50, 186, 226, 20, 1, 214, 115, 221, 24, 226,
- 20, 1, 214, 116, 159, 226, 20, 1, 253, 138, 244, 164, 226, 20, 219, 18,
- 1, 203, 226, 20, 218, 225, 1, 203, 226, 20, 1, 250, 187, 226, 20, 220,
- 81, 241, 220, 77, 226, 20, 51, 241, 220, 77, 226, 20, 152, 221, 17, 226,
- 20, 152, 51, 221, 17, 169, 5, 253, 242, 169, 5, 214, 128, 169, 1, 61,
- 169, 1, 254, 232, 169, 1, 72, 169, 1, 236, 28, 169, 1, 69, 169, 1, 215,
- 92, 169, 1, 161, 149, 169, 1, 161, 223, 82, 169, 1, 161, 150, 169, 1,
- 161, 232, 214, 169, 1, 74, 169, 1, 245, 165, 169, 1, 254, 108, 169, 1,
- 75, 169, 1, 227, 49, 169, 1, 253, 108, 169, 1, 181, 169, 1, 234, 138,
- 169, 1, 243, 110, 169, 1, 242, 225, 169, 1, 229, 159, 169, 1, 250, 219,
- 169, 1, 250, 92, 169, 1, 235, 139, 169, 1, 235, 115, 169, 1, 228, 23,
- 169, 1, 216, 115, 169, 1, 216, 105, 169, 1, 248, 86, 169, 1, 248, 70,
- 169, 1, 228, 198, 169, 1, 218, 52, 169, 1, 217, 161, 169, 1, 248, 164,
- 169, 1, 247, 232, 169, 1, 205, 169, 1, 193, 169, 1, 226, 23, 169, 1, 252,
- 107, 169, 1, 251, 195, 169, 1, 188, 169, 1, 186, 169, 1, 203, 169, 1,
- 233, 157, 169, 1, 215, 1, 169, 1, 221, 24, 169, 1, 219, 157, 169, 1, 222,
- 202, 169, 1, 159, 169, 1, 232, 213, 169, 249, 133, 5, 242, 25, 169, 30,
- 5, 254, 232, 169, 30, 5, 72, 169, 30, 5, 236, 28, 169, 30, 5, 69, 169,
- 30, 5, 215, 92, 169, 30, 5, 161, 149, 169, 30, 5, 161, 223, 82, 169, 30,
- 5, 161, 150, 169, 30, 5, 161, 232, 214, 169, 30, 5, 74, 169, 30, 5, 245,
- 165, 169, 30, 5, 254, 108, 169, 30, 5, 75, 169, 30, 5, 227, 49, 169, 30,
- 5, 253, 108, 169, 5, 214, 133, 169, 248, 123, 169, 51, 248, 123, 169, 21,
- 212, 79, 169, 21, 116, 169, 21, 109, 169, 21, 166, 169, 21, 163, 169, 21,
- 180, 169, 21, 189, 169, 21, 198, 169, 21, 195, 169, 21, 200, 37, 82, 21,
- 212, 79, 37, 82, 21, 116, 37, 82, 21, 109, 37, 82, 21, 166, 37, 82, 21,
- 163, 37, 82, 21, 180, 37, 82, 21, 189, 37, 82, 21, 198, 37, 82, 21, 195,
- 37, 82, 21, 200, 37, 82, 1, 61, 37, 82, 1, 69, 37, 82, 1, 181, 37, 82, 1,
- 205, 37, 82, 1, 193, 37, 82, 1, 203, 37, 82, 1, 214, 154, 37, 82, 5, 253,
- 91, 82, 5, 219, 205, 250, 187, 82, 5, 250, 188, 214, 133, 82, 5, 51, 250,
- 188, 214, 133, 82, 5, 250, 188, 109, 82, 5, 250, 188, 166, 82, 5, 250,
- 188, 253, 91, 82, 5, 225, 11, 82, 243, 76, 244, 72, 82, 250, 170, 82,
- 241, 214, 234, 194, 233, 14, 21, 212, 79, 234, 194, 233, 14, 21, 116,
- 234, 194, 233, 14, 21, 109, 234, 194, 233, 14, 21, 166, 234, 194, 233,
- 14, 21, 163, 234, 194, 233, 14, 21, 180, 234, 194, 233, 14, 21, 189, 234,
- 194, 233, 14, 21, 198, 234, 194, 233, 14, 21, 195, 234, 194, 233, 14, 21,
- 200, 234, 194, 233, 14, 1, 181, 234, 194, 233, 14, 1, 234, 138, 234, 194,
- 233, 14, 1, 243, 110, 234, 194, 233, 14, 1, 229, 159, 234, 194, 233, 14,
- 1, 222, 202, 234, 194, 233, 14, 1, 221, 24, 234, 194, 233, 14, 1, 212,
- 109, 234, 194, 233, 14, 1, 228, 23, 234, 194, 233, 14, 1, 218, 52, 234,
- 194, 233, 14, 1, 240, 214, 234, 194, 233, 14, 1, 205, 234, 194, 233, 14,
- 1, 193, 234, 194, 233, 14, 1, 226, 23, 234, 194, 233, 14, 1, 188, 234,
- 194, 233, 14, 1, 248, 164, 234, 194, 233, 14, 1, 252, 107, 234, 194, 233,
- 14, 1, 203, 234, 194, 233, 14, 1, 186, 234, 194, 233, 14, 1, 233, 157,
- 234, 194, 233, 14, 1, 214, 49, 234, 194, 233, 14, 1, 217, 161, 234, 194,
- 233, 14, 1, 159, 234, 194, 233, 14, 1, 215, 1, 234, 194, 233, 14, 1, 250,
- 219, 234, 194, 233, 14, 1, 61, 234, 194, 233, 14, 1, 227, 99, 234, 194,
- 233, 14, 1, 72, 234, 194, 233, 14, 1, 227, 49, 234, 194, 233, 14, 30,
- 215, 183, 234, 194, 233, 14, 30, 74, 234, 194, 233, 14, 30, 69, 234, 194,
- 233, 14, 30, 245, 165, 234, 194, 233, 14, 30, 75, 234, 194, 233, 14, 160,
- 225, 163, 234, 194, 233, 14, 160, 250, 200, 234, 194, 233, 14, 160, 250,
- 201, 225, 163, 234, 194, 233, 14, 5, 249, 20, 234, 194, 233, 14, 5, 220,
- 125, 223, 243, 1, 181, 223, 243, 1, 243, 110, 223, 243, 1, 229, 159, 223,
- 243, 1, 218, 52, 223, 243, 1, 248, 164, 223, 243, 1, 205, 223, 243, 1,
- 193, 223, 243, 1, 252, 107, 223, 243, 1, 188, 223, 243, 1, 250, 219, 223,
- 243, 1, 235, 139, 223, 243, 1, 228, 23, 223, 243, 1, 222, 202, 223, 243,
- 1, 203, 223, 243, 1, 233, 157, 223, 243, 1, 186, 223, 243, 1, 214, 49,
- 223, 243, 1, 159, 223, 243, 1, 231, 187, 223, 243, 1, 229, 141, 223, 243,
- 1, 229, 228, 223, 243, 1, 227, 254, 223, 243, 1, 61, 223, 243, 30, 5, 72,
- 223, 243, 30, 5, 69, 223, 243, 30, 5, 74, 223, 243, 30, 5, 254, 108, 223,
- 243, 30, 5, 75, 223, 243, 30, 5, 253, 108, 223, 243, 30, 5, 245, 22, 223,
- 243, 30, 5, 245, 189, 223, 243, 249, 133, 5, 229, 161, 223, 243, 249,
- 133, 5, 204, 223, 243, 249, 133, 5, 149, 223, 243, 249, 133, 5, 242, 41,
- 223, 243, 214, 133, 223, 243, 222, 92, 77, 23, 97, 217, 51, 23, 97, 217,
- 50, 23, 97, 217, 48, 23, 97, 217, 53, 23, 97, 223, 174, 23, 97, 223, 158,
- 23, 97, 223, 153, 23, 97, 223, 155, 23, 97, 223, 171, 23, 97, 223, 164,
- 23, 97, 223, 157, 23, 97, 223, 176, 23, 97, 223, 159, 23, 97, 223, 178,
- 23, 97, 223, 175, 23, 97, 231, 26, 23, 97, 231, 17, 23, 97, 231, 20, 23,
- 97, 225, 212, 23, 97, 225, 223, 23, 97, 225, 224, 23, 97, 219, 142, 23,
- 97, 236, 41, 23, 97, 236, 48, 23, 97, 219, 153, 23, 97, 219, 140, 23, 97,
- 226, 6, 23, 97, 241, 153, 23, 97, 219, 137, 144, 5, 226, 155, 144, 5,
- 250, 121, 144, 5, 233, 90, 144, 5, 213, 228, 144, 1, 61, 144, 1, 240,
- 146, 234, 197, 144, 1, 72, 144, 1, 236, 28, 144, 1, 69, 144, 1, 226, 214,
- 250, 97, 144, 1, 229, 160, 233, 52, 144, 1, 229, 160, 233, 53, 224, 34,
- 144, 1, 74, 144, 1, 254, 108, 144, 1, 75, 144, 1, 181, 144, 1, 235, 17,
- 222, 144, 144, 1, 235, 17, 230, 136, 144, 1, 243, 110, 144, 1, 243, 111,
- 230, 136, 144, 1, 229, 159, 144, 1, 250, 219, 144, 1, 250, 220, 230, 136,
- 144, 1, 235, 139, 144, 1, 228, 24, 230, 136, 144, 1, 235, 140, 232, 12,
- 144, 1, 228, 23, 144, 1, 216, 115, 144, 1, 216, 116, 232, 12, 144, 1,
- 248, 86, 144, 1, 248, 87, 232, 12, 144, 1, 230, 46, 230, 136, 144, 1,
- 218, 52, 144, 1, 218, 53, 230, 136, 144, 1, 248, 164, 144, 1, 248, 165,
- 232, 12, 144, 1, 205, 144, 1, 193, 144, 1, 226, 214, 230, 136, 144, 1,
- 252, 107, 144, 1, 252, 108, 230, 136, 144, 1, 188, 144, 1, 186, 144, 1,
- 203, 144, 1, 224, 77, 254, 115, 144, 1, 233, 157, 144, 1, 214, 49, 144,
- 1, 222, 203, 230, 136, 144, 1, 222, 203, 232, 12, 144, 1, 222, 202, 144,
- 1, 159, 144, 5, 250, 122, 217, 203, 144, 30, 5, 217, 254, 144, 30, 5,
- 216, 246, 144, 30, 5, 213, 178, 144, 30, 5, 213, 179, 231, 133, 144, 30,
- 5, 218, 248, 144, 30, 5, 218, 249, 231, 121, 144, 30, 5, 218, 16, 144,
- 30, 5, 247, 146, 230, 135, 144, 30, 5, 226, 59, 144, 249, 133, 5, 234,
- 164, 144, 249, 133, 5, 226, 71, 144, 249, 133, 5, 250, 207, 144, 226,
- 167, 144, 42, 223, 221, 144, 46, 223, 221, 144, 226, 203, 254, 26, 144,
- 226, 203, 232, 29, 144, 226, 203, 232, 146, 144, 226, 203, 213, 223, 144,
- 226, 203, 226, 168, 144, 226, 203, 232, 234, 144, 226, 203, 232, 140,
- 144, 226, 203, 254, 154, 144, 226, 203, 254, 155, 254, 154, 144, 226,
- 203, 225, 183, 144, 216, 58, 226, 203, 225, 183, 144, 226, 164, 144, 21,
- 212, 79, 144, 21, 116, 144, 21, 109, 144, 21, 166, 144, 21, 163, 144, 21,
- 180, 144, 21, 189, 144, 21, 198, 144, 21, 195, 144, 21, 200, 144, 226,
- 203, 217, 22, 216, 70, 144, 226, 203, 235, 165, 162, 1, 61, 162, 1, 72,
- 162, 1, 69, 162, 1, 74, 162, 1, 254, 108, 162, 1, 75, 162, 1, 181, 162,
- 1, 234, 138, 162, 1, 243, 110, 162, 1, 242, 225, 162, 1, 229, 75, 162, 1,
- 229, 159, 162, 1, 250, 92, 162, 1, 250, 49, 162, 1, 235, 139, 162, 1,
- 235, 115, 162, 1, 229, 66, 162, 1, 229, 68, 162, 1, 229, 67, 162, 1, 218,
- 52, 162, 1, 217, 161, 162, 1, 248, 164, 162, 1, 247, 232, 162, 1, 228,
- 62, 162, 1, 205, 162, 1, 248, 86, 162, 1, 193, 162, 1, 225, 100, 162, 1,
- 226, 23, 162, 1, 252, 107, 162, 1, 251, 195, 162, 1, 230, 165, 162, 1,
- 188, 162, 1, 252, 31, 162, 1, 186, 162, 1, 203, 162, 1, 233, 157, 162, 1,
- 215, 1, 162, 1, 219, 157, 162, 1, 222, 202, 162, 1, 159, 162, 30, 5, 254,
- 232, 162, 30, 5, 72, 162, 30, 5, 236, 28, 162, 30, 5, 245, 152, 162, 30,
- 5, 69, 162, 30, 5, 227, 99, 162, 30, 5, 75, 162, 30, 5, 254, 108, 162,
- 30, 5, 253, 108, 162, 30, 5, 215, 183, 162, 249, 133, 5, 186, 162, 249,
- 133, 5, 203, 162, 249, 133, 5, 233, 157, 162, 249, 133, 5, 214, 49, 162,
- 1, 40, 235, 27, 162, 1, 40, 243, 177, 162, 1, 40, 229, 161, 162, 249,
- 133, 5, 40, 229, 161, 162, 1, 40, 250, 93, 162, 1, 40, 218, 99, 162, 1,
- 40, 204, 162, 1, 40, 226, 229, 162, 1, 40, 213, 105, 162, 1, 40, 149,
- 162, 1, 40, 150, 162, 1, 40, 219, 158, 162, 249, 133, 5, 40, 183, 162,
- 249, 133, 5, 40, 242, 41, 162, 21, 212, 79, 162, 21, 116, 162, 21, 109,
- 162, 21, 166, 162, 21, 163, 162, 21, 180, 162, 21, 189, 162, 21, 198,
- 162, 21, 195, 162, 21, 200, 162, 225, 27, 219, 183, 162, 225, 27, 248,
- 123, 162, 225, 27, 51, 248, 123, 162, 225, 27, 216, 169, 248, 123, 64, 1,
- 234, 132, 243, 110, 64, 1, 234, 132, 250, 219, 64, 1, 234, 132, 250, 92,
- 64, 1, 234, 132, 235, 139, 64, 1, 234, 132, 235, 115, 64, 1, 234, 132,
- 228, 23, 64, 1, 234, 132, 216, 115, 64, 1, 234, 132, 216, 105, 64, 1,
- 234, 132, 248, 86, 64, 1, 234, 132, 248, 70, 64, 1, 234, 132, 247, 232,
- 64, 1, 234, 132, 205, 64, 1, 234, 132, 222, 202, 64, 1, 234, 132, 159,
- 64, 1, 234, 132, 241, 174, 64, 1, 234, 132, 244, 164, 64, 59, 1, 234,
- 132, 224, 2, 64, 1, 234, 132, 213, 153, 64, 1, 234, 132, 212, 109, 64, 1,
- 234, 132, 203, 64, 232, 198, 234, 132, 227, 117, 64, 232, 198, 234, 132,
- 224, 188, 64, 232, 198, 234, 132, 241, 107, 64, 16, 254, 98, 244, 253,
- 64, 16, 254, 98, 116, 64, 16, 254, 98, 109, 64, 1, 254, 98, 203, 64, 5,
- 226, 151, 234, 218, 216, 241, 38, 190, 1, 115, 234, 37, 38, 190, 1, 124,
- 234, 37, 38, 190, 1, 115, 234, 113, 38, 190, 1, 124, 234, 113, 38, 190,
- 1, 115, 234, 120, 38, 190, 1, 124, 234, 120, 38, 190, 1, 115, 242, 150,
- 38, 190, 1, 124, 242, 150, 38, 190, 1, 115, 229, 90, 38, 190, 1, 124,
- 229, 90, 38, 190, 1, 115, 249, 175, 38, 190, 1, 124, 249, 175, 38, 190,
- 1, 115, 250, 23, 38, 190, 1, 124, 250, 23, 38, 190, 1, 115, 219, 242, 38,
- 190, 1, 124, 219, 242, 38, 190, 1, 115, 227, 253, 38, 190, 1, 124, 227,
- 253, 38, 190, 1, 115, 247, 99, 38, 190, 1, 124, 247, 99, 38, 190, 1, 115,
- 108, 38, 190, 1, 124, 108, 38, 190, 1, 115, 217, 109, 38, 190, 1, 124,
- 217, 109, 38, 190, 1, 115, 228, 185, 38, 190, 1, 124, 228, 185, 38, 190,
- 1, 115, 251, 128, 38, 190, 1, 124, 251, 128, 38, 190, 1, 115, 225, 150,
- 38, 190, 1, 124, 225, 150, 38, 190, 1, 115, 225, 253, 38, 190, 1, 124,
- 225, 253, 38, 190, 1, 115, 244, 12, 38, 190, 1, 124, 244, 12, 38, 190, 1,
- 115, 230, 231, 38, 190, 1, 124, 230, 231, 38, 190, 1, 115, 212, 235, 38,
- 190, 1, 124, 212, 235, 38, 190, 1, 115, 223, 112, 38, 190, 1, 124, 223,
- 112, 38, 190, 1, 115, 232, 208, 38, 190, 1, 124, 232, 208, 38, 190, 1,
- 115, 214, 119, 38, 190, 1, 124, 214, 119, 38, 190, 1, 115, 241, 54, 38,
- 190, 1, 124, 241, 54, 38, 190, 1, 115, 75, 38, 190, 1, 124, 75, 38, 190,
- 232, 9, 234, 235, 38, 190, 30, 254, 232, 38, 190, 30, 72, 38, 190, 30,
- 215, 183, 38, 190, 30, 69, 38, 190, 30, 74, 38, 190, 30, 75, 38, 190,
- 232, 9, 234, 115, 38, 190, 30, 240, 111, 38, 190, 30, 215, 182, 38, 190,
- 30, 215, 196, 38, 190, 30, 253, 106, 38, 190, 30, 253, 83, 38, 190, 30,
- 254, 32, 38, 190, 30, 254, 45, 38, 190, 160, 232, 9, 245, 137, 38, 190,
- 160, 232, 9, 228, 61, 38, 190, 160, 232, 9, 217, 109, 38, 190, 160, 232,
- 9, 219, 228, 38, 190, 16, 234, 22, 38, 190, 16, 228, 61, 38, 190, 16,
- 222, 168, 38, 190, 16, 241, 55, 241, 50, 38, 190, 16, 234, 31, 234, 30,
- 28, 4, 216, 98, 28, 4, 216, 101, 28, 4, 216, 104, 28, 4, 216, 102, 28, 4,
- 216, 103, 28, 4, 216, 100, 28, 4, 248, 64, 28, 4, 248, 66, 28, 4, 248,
- 69, 28, 4, 248, 67, 28, 4, 248, 68, 28, 4, 248, 65, 28, 4, 245, 239, 28,
- 4, 245, 242, 28, 4, 245, 248, 28, 4, 245, 246, 28, 4, 245, 247, 28, 4,
- 245, 240, 28, 4, 250, 138, 28, 4, 250, 132, 28, 4, 250, 134, 28, 4, 250,
- 137, 28, 4, 250, 135, 28, 4, 250, 136, 28, 4, 250, 133, 28, 4, 252, 31,
- 28, 4, 252, 10, 28, 4, 252, 22, 28, 4, 252, 30, 28, 4, 252, 25, 28, 4,
- 252, 26, 28, 4, 252, 14, 231, 140, 231, 194, 1, 234, 28, 231, 140, 231,
- 194, 1, 222, 168, 231, 140, 231, 194, 1, 233, 133, 231, 140, 231, 194, 1,
- 230, 241, 231, 140, 231, 194, 1, 193, 231, 140, 231, 194, 1, 205, 231,
- 140, 231, 194, 1, 250, 39, 231, 140, 231, 194, 1, 217, 44, 231, 140, 231,
- 194, 1, 234, 109, 231, 140, 231, 194, 1, 229, 80, 231, 140, 231, 194, 1,
- 217, 103, 231, 140, 231, 194, 1, 214, 44, 231, 140, 231, 194, 1, 213, 58,
- 231, 140, 231, 194, 1, 240, 206, 231, 140, 231, 194, 1, 215, 160, 231,
- 140, 231, 194, 1, 72, 231, 140, 231, 194, 1, 226, 18, 231, 140, 231, 194,
- 1, 253, 118, 231, 140, 231, 194, 1, 242, 143, 231, 140, 231, 194, 1, 235,
- 114, 231, 140, 231, 194, 1, 224, 57, 231, 140, 231, 194, 1, 252, 107,
- 231, 140, 231, 194, 1, 235, 103, 231, 140, 231, 194, 1, 247, 171, 231,
- 140, 231, 194, 1, 242, 197, 231, 140, 231, 194, 1, 247, 213, 231, 140,
- 231, 194, 1, 251, 194, 231, 140, 231, 194, 1, 234, 29, 232, 181, 231,
- 140, 231, 194, 1, 233, 134, 232, 181, 231, 140, 231, 194, 1, 230, 242,
- 232, 181, 231, 140, 231, 194, 1, 226, 214, 232, 181, 231, 140, 231, 194,
- 1, 230, 46, 232, 181, 231, 140, 231, 194, 1, 217, 45, 232, 181, 231, 140,
- 231, 194, 1, 229, 81, 232, 181, 231, 140, 231, 194, 1, 240, 146, 232,
- 181, 231, 140, 231, 194, 30, 5, 227, 61, 231, 140, 231, 194, 30, 5, 235,
- 249, 231, 140, 231, 194, 30, 5, 254, 31, 231, 140, 231, 194, 30, 5, 213,
- 29, 231, 140, 231, 194, 30, 5, 219, 219, 231, 140, 231, 194, 30, 5, 215,
- 157, 231, 140, 231, 194, 30, 5, 250, 60, 231, 140, 231, 194, 30, 5, 228,
- 47, 231, 140, 231, 194, 250, 61, 231, 140, 231, 194, 232, 143, 235, 148,
- 231, 140, 231, 194, 253, 216, 235, 148, 231, 140, 231, 194, 21, 212, 79,
- 231, 140, 231, 194, 21, 116, 231, 140, 231, 194, 21, 109, 231, 140, 231,
- 194, 21, 166, 231, 140, 231, 194, 21, 163, 231, 140, 231, 194, 21, 180,
- 231, 140, 231, 194, 21, 189, 231, 140, 231, 194, 21, 198, 231, 140, 231,
- 194, 21, 195, 231, 140, 231, 194, 21, 200, 23, 135, 227, 197, 23, 135,
- 227, 202, 23, 135, 212, 234, 23, 135, 212, 233, 23, 135, 212, 232, 23,
- 135, 215, 246, 23, 135, 215, 249, 23, 135, 212, 201, 23, 135, 212, 197,
- 23, 135, 245, 21, 23, 135, 245, 19, 23, 135, 245, 20, 23, 135, 245, 17,
- 23, 135, 240, 136, 23, 135, 240, 135, 23, 135, 240, 133, 23, 135, 240,
- 134, 23, 135, 240, 139, 23, 135, 240, 132, 23, 135, 240, 131, 23, 135,
- 240, 141, 23, 135, 253, 203, 23, 135, 253, 202, 23, 89, 229, 50, 23, 89,
- 229, 56, 23, 89, 219, 139, 23, 89, 219, 138, 23, 89, 217, 50, 23, 89,
- 217, 48, 23, 89, 217, 47, 23, 89, 217, 53, 23, 89, 217, 54, 23, 89, 217,
- 46, 23, 89, 223, 158, 23, 89, 223, 173, 23, 89, 219, 145, 23, 89, 223,
- 170, 23, 89, 223, 160, 23, 89, 223, 162, 23, 89, 223, 149, 23, 89, 223,
- 150, 23, 89, 234, 223, 23, 89, 231, 25, 23, 89, 231, 19, 23, 89, 219,
- 149, 23, 89, 231, 22, 23, 89, 231, 28, 23, 89, 225, 208, 23, 89, 225,
- 217, 23, 89, 225, 221, 23, 89, 219, 147, 23, 89, 225, 211, 23, 89, 225,
- 225, 23, 89, 225, 226, 23, 89, 220, 68, 23, 89, 220, 71, 23, 89, 219,
- 143, 23, 89, 219, 141, 23, 89, 220, 66, 23, 89, 220, 74, 23, 89, 220, 75,
- 23, 89, 220, 60, 23, 89, 220, 73, 23, 89, 226, 158, 23, 89, 226, 159, 23,
- 89, 213, 15, 23, 89, 213, 16, 23, 89, 249, 237, 23, 89, 249, 236, 23, 89,
- 219, 154, 23, 89, 226, 4, 23, 89, 226, 3, 9, 13, 238, 17, 9, 13, 238, 16,
- 9, 13, 238, 15, 9, 13, 238, 14, 9, 13, 238, 13, 9, 13, 238, 12, 9, 13,
- 238, 11, 9, 13, 238, 10, 9, 13, 238, 9, 9, 13, 238, 8, 9, 13, 238, 7, 9,
- 13, 238, 6, 9, 13, 238, 5, 9, 13, 238, 4, 9, 13, 238, 3, 9, 13, 238, 2,
- 9, 13, 238, 1, 9, 13, 238, 0, 9, 13, 237, 255, 9, 13, 237, 254, 9, 13,
- 237, 253, 9, 13, 237, 252, 9, 13, 237, 251, 9, 13, 237, 250, 9, 13, 237,
- 249, 9, 13, 237, 248, 9, 13, 237, 247, 9, 13, 237, 246, 9, 13, 237, 245,
- 9, 13, 237, 244, 9, 13, 237, 243, 9, 13, 237, 242, 9, 13, 237, 241, 9,
- 13, 237, 240, 9, 13, 237, 239, 9, 13, 237, 238, 9, 13, 237, 237, 9, 13,
- 237, 236, 9, 13, 237, 235, 9, 13, 237, 234, 9, 13, 237, 233, 9, 13, 237,
- 232, 9, 13, 237, 231, 9, 13, 237, 230, 9, 13, 237, 229, 9, 13, 237, 228,
- 9, 13, 237, 227, 9, 13, 237, 226, 9, 13, 237, 225, 9, 13, 237, 224, 9,
- 13, 237, 223, 9, 13, 237, 222, 9, 13, 237, 221, 9, 13, 237, 220, 9, 13,
- 237, 219, 9, 13, 237, 218, 9, 13, 237, 217, 9, 13, 237, 216, 9, 13, 237,
- 215, 9, 13, 237, 214, 9, 13, 237, 213, 9, 13, 237, 212, 9, 13, 237, 211,
- 9, 13, 237, 210, 9, 13, 237, 209, 9, 13, 237, 208, 9, 13, 237, 207, 9,
- 13, 237, 206, 9, 13, 237, 205, 9, 13, 237, 204, 9, 13, 237, 203, 9, 13,
- 237, 202, 9, 13, 237, 201, 9, 13, 237, 200, 9, 13, 237, 199, 9, 13, 237,
- 198, 9, 13, 237, 197, 9, 13, 237, 196, 9, 13, 237, 195, 9, 13, 237, 194,
- 9, 13, 237, 193, 9, 13, 237, 192, 9, 13, 237, 191, 9, 13, 237, 190, 9,
- 13, 237, 189, 9, 13, 237, 188, 9, 13, 237, 187, 9, 13, 237, 186, 9, 13,
- 237, 185, 9, 13, 237, 184, 9, 13, 237, 183, 9, 13, 237, 182, 9, 13, 237,
- 181, 9, 13, 237, 180, 9, 13, 237, 179, 9, 13, 237, 178, 9, 13, 237, 177,
- 9, 13, 237, 176, 9, 13, 237, 175, 9, 13, 237, 174, 9, 13, 237, 173, 9,
- 13, 237, 172, 9, 13, 237, 171, 9, 13, 237, 170, 9, 13, 237, 169, 9, 13,
- 237, 168, 9, 13, 237, 167, 9, 13, 237, 166, 9, 13, 237, 165, 9, 13, 237,
- 164, 9, 13, 237, 163, 9, 13, 237, 162, 9, 13, 237, 161, 9, 13, 237, 160,
- 9, 13, 237, 159, 9, 13, 237, 158, 9, 13, 237, 157, 9, 13, 237, 156, 9,
- 13, 237, 155, 9, 13, 237, 154, 9, 13, 237, 153, 9, 13, 237, 152, 9, 13,
- 237, 151, 9, 13, 237, 150, 9, 13, 237, 149, 9, 13, 237, 148, 9, 13, 237,
- 147, 9, 13, 237, 146, 9, 13, 237, 145, 9, 13, 237, 144, 9, 13, 237, 143,
- 9, 13, 237, 142, 9, 13, 237, 141, 9, 13, 237, 140, 9, 13, 237, 139, 9,
- 13, 237, 138, 9, 13, 237, 137, 9, 13, 237, 136, 9, 13, 237, 135, 9, 13,
- 237, 134, 9, 13, 237, 133, 9, 13, 237, 132, 9, 13, 237, 131, 9, 13, 237,
- 130, 9, 13, 237, 129, 9, 13, 237, 128, 9, 13, 237, 127, 9, 13, 237, 126,
- 9, 13, 237, 125, 9, 13, 237, 124, 9, 13, 237, 123, 9, 13, 237, 122, 9,
- 13, 237, 121, 9, 13, 237, 120, 9, 13, 237, 119, 9, 13, 237, 118, 9, 13,
- 237, 117, 9, 13, 237, 116, 9, 13, 237, 115, 9, 13, 237, 114, 9, 13, 237,
- 113, 9, 13, 237, 112, 9, 13, 237, 111, 9, 13, 237, 110, 9, 13, 237, 109,
- 9, 13, 237, 108, 9, 13, 237, 107, 9, 13, 237, 106, 9, 13, 237, 105, 9,
- 13, 237, 104, 9, 13, 237, 103, 9, 13, 237, 102, 9, 13, 237, 101, 9, 13,
- 237, 100, 9, 13, 237, 99, 9, 13, 237, 98, 9, 13, 237, 97, 9, 13, 237, 96,
- 9, 13, 237, 95, 9, 13, 237, 94, 9, 13, 237, 93, 9, 13, 237, 92, 9, 13,
- 237, 91, 9, 13, 237, 90, 9, 13, 237, 89, 9, 13, 237, 88, 9, 13, 237, 87,
- 9, 13, 237, 86, 9, 13, 237, 85, 9, 13, 237, 84, 9, 13, 237, 83, 9, 13,
- 237, 82, 9, 13, 237, 81, 9, 13, 237, 80, 9, 13, 237, 79, 9, 13, 237, 78,
- 9, 13, 237, 77, 9, 13, 237, 76, 9, 13, 237, 75, 9, 13, 237, 74, 9, 13,
- 237, 73, 9, 13, 237, 72, 9, 13, 237, 71, 9, 13, 237, 70, 9, 13, 237, 69,
- 9, 13, 237, 68, 9, 13, 237, 67, 9, 13, 237, 66, 9, 13, 237, 65, 9, 13,
- 237, 64, 9, 13, 237, 63, 9, 13, 237, 62, 9, 13, 237, 61, 9, 13, 237, 60,
- 9, 13, 237, 59, 9, 13, 237, 58, 9, 13, 237, 57, 9, 13, 237, 56, 9, 13,
- 237, 55, 9, 13, 237, 54, 9, 13, 237, 53, 9, 13, 237, 52, 9, 13, 237, 51,
- 9, 13, 237, 50, 9, 13, 237, 49, 9, 13, 237, 48, 9, 13, 237, 47, 9, 13,
- 237, 46, 9, 13, 237, 45, 9, 13, 237, 44, 9, 13, 237, 43, 9, 13, 237, 42,
- 9, 13, 237, 41, 9, 13, 237, 40, 9, 13, 237, 39, 9, 13, 237, 38, 9, 13,
- 237, 37, 9, 13, 237, 36, 9, 13, 237, 35, 9, 13, 237, 34, 9, 13, 237, 33,
- 9, 13, 237, 32, 9, 13, 237, 31, 9, 13, 237, 30, 9, 13, 237, 29, 9, 13,
- 237, 28, 9, 13, 237, 27, 9, 13, 237, 26, 9, 13, 237, 25, 9, 13, 237, 24,
- 9, 13, 237, 23, 9, 13, 237, 22, 9, 13, 237, 21, 9, 13, 237, 20, 9, 13,
- 237, 19, 9, 13, 237, 18, 9, 13, 237, 17, 9, 13, 237, 16, 9, 13, 237, 15,
- 9, 13, 237, 14, 9, 13, 237, 13, 9, 13, 237, 12, 9, 13, 237, 11, 9, 13,
- 237, 10, 9, 13, 237, 9, 9, 13, 237, 8, 9, 13, 237, 7, 9, 13, 237, 6, 9,
- 13, 237, 5, 9, 13, 237, 4, 9, 13, 237, 3, 9, 13, 237, 2, 9, 13, 237, 1,
- 9, 13, 237, 0, 9, 13, 236, 255, 9, 13, 236, 254, 9, 13, 236, 253, 9, 13,
- 236, 252, 9, 13, 236, 251, 9, 13, 236, 250, 9, 13, 236, 249, 9, 13, 236,
- 248, 9, 13, 236, 247, 9, 13, 236, 246, 9, 13, 236, 245, 9, 13, 236, 244,
- 9, 13, 236, 243, 9, 13, 236, 242, 9, 13, 236, 241, 9, 13, 236, 240, 9,
- 13, 236, 239, 9, 13, 236, 238, 9, 13, 236, 237, 9, 13, 236, 236, 9, 13,
- 236, 235, 9, 13, 236, 234, 9, 13, 236, 233, 9, 13, 236, 232, 9, 13, 236,
- 231, 9, 13, 236, 230, 9, 13, 236, 229, 9, 13, 236, 228, 9, 13, 236, 227,
- 9, 13, 236, 226, 9, 13, 236, 225, 9, 13, 236, 224, 9, 13, 236, 223, 9,
- 13, 236, 222, 9, 13, 236, 221, 9, 13, 236, 220, 9, 13, 236, 219, 9, 13,
- 236, 218, 9, 13, 236, 217, 9, 13, 236, 216, 9, 13, 236, 215, 9, 13, 236,
- 214, 9, 13, 236, 213, 9, 13, 236, 212, 9, 13, 236, 211, 9, 13, 236, 210,
- 9, 13, 236, 209, 9, 13, 236, 208, 9, 13, 236, 207, 9, 13, 236, 206, 9,
- 13, 236, 205, 9, 13, 236, 204, 9, 13, 236, 203, 9, 13, 236, 202, 9, 13,
- 236, 201, 9, 13, 236, 200, 9, 13, 236, 199, 9, 13, 236, 198, 9, 13, 236,
- 197, 9, 13, 236, 196, 9, 13, 236, 195, 9, 13, 236, 194, 9, 13, 236, 193,
- 9, 13, 236, 192, 9, 13, 236, 191, 9, 13, 236, 190, 9, 13, 236, 189, 9,
- 13, 236, 188, 9, 13, 236, 187, 9, 13, 236, 186, 9, 13, 236, 185, 9, 13,
- 236, 184, 9, 13, 236, 183, 9, 13, 236, 182, 9, 13, 236, 181, 9, 13, 236,
- 180, 9, 13, 236, 179, 9, 13, 236, 178, 9, 13, 236, 177, 9, 13, 236, 176,
- 9, 13, 236, 175, 9, 13, 236, 174, 9, 13, 236, 173, 9, 13, 236, 172, 9,
- 13, 236, 171, 9, 13, 236, 170, 9, 13, 236, 169, 9, 13, 236, 168, 9, 13,
- 236, 167, 9, 13, 236, 166, 9, 13, 236, 165, 9, 13, 236, 164, 9, 13, 236,
- 163, 9, 13, 236, 162, 9, 13, 236, 161, 9, 13, 236, 160, 9, 13, 236, 159,
- 9, 13, 236, 158, 9, 13, 236, 157, 9, 13, 236, 156, 9, 13, 236, 155, 9,
- 13, 236, 154, 9, 13, 236, 153, 9, 13, 236, 152, 9, 13, 236, 151, 9, 13,
- 236, 150, 9, 13, 236, 149, 9, 13, 236, 148, 9, 13, 236, 147, 9, 13, 236,
- 146, 9, 13, 236, 145, 9, 13, 236, 144, 9, 13, 236, 143, 9, 13, 236, 142,
- 9, 13, 236, 141, 9, 13, 236, 140, 9, 13, 236, 139, 9, 13, 236, 138, 9,
- 13, 236, 137, 9, 13, 236, 136, 9, 13, 236, 135, 9, 13, 236, 134, 9, 13,
- 236, 133, 9, 13, 236, 132, 9, 13, 236, 131, 9, 13, 236, 130, 9, 13, 236,
- 129, 9, 13, 236, 128, 9, 13, 236, 127, 9, 13, 236, 126, 9, 13, 236, 125,
- 9, 13, 236, 124, 9, 13, 236, 123, 9, 13, 236, 122, 9, 13, 236, 121, 9,
- 13, 236, 120, 9, 13, 236, 119, 9, 13, 236, 118, 9, 13, 236, 117, 9, 13,
- 236, 116, 9, 13, 236, 115, 9, 13, 236, 114, 9, 13, 236, 113, 9, 13, 236,
- 112, 9, 13, 236, 111, 9, 13, 236, 110, 9, 13, 236, 109, 9, 13, 236, 108,
- 9, 13, 236, 107, 9, 13, 236, 106, 9, 13, 236, 105, 9, 13, 236, 104, 9,
- 13, 236, 103, 9, 13, 236, 102, 9, 13, 236, 101, 9, 13, 236, 100, 9, 13,
- 236, 99, 9, 13, 236, 98, 9, 13, 236, 97, 9, 13, 236, 96, 9, 13, 236, 95,
- 9, 13, 236, 94, 9, 13, 236, 93, 9, 13, 236, 92, 9, 13, 236, 91, 9, 13,
- 236, 90, 9, 13, 236, 89, 9, 13, 236, 88, 9, 13, 236, 87, 9, 13, 236, 86,
- 9, 13, 236, 85, 9, 13, 236, 84, 9, 13, 236, 83, 9, 13, 236, 82, 9, 13,
- 236, 81, 9, 13, 236, 80, 9, 13, 236, 79, 9, 13, 236, 78, 9, 13, 236, 77,
- 9, 13, 236, 76, 9, 13, 236, 75, 9, 13, 236, 74, 9, 13, 236, 73, 9, 13,
- 236, 72, 9, 13, 236, 71, 9, 13, 236, 70, 9, 13, 236, 69, 9, 13, 236, 68,
- 9, 13, 236, 67, 9, 13, 236, 66, 9, 13, 236, 65, 9, 13, 236, 64, 9, 13,
- 236, 63, 9, 13, 236, 62, 9, 13, 236, 61, 9, 13, 236, 60, 7, 3, 26, 244,
- 94, 7, 3, 26, 244, 90, 7, 3, 26, 244, 45, 7, 3, 26, 244, 93, 7, 3, 26,
- 244, 92, 7, 3, 26, 184, 223, 4, 218, 99, 7, 3, 26, 219, 107, 141, 3, 26,
- 231, 123, 228, 150, 141, 3, 26, 231, 123, 245, 169, 141, 3, 26, 231, 123,
- 235, 224, 141, 3, 26, 214, 157, 228, 150, 141, 3, 26, 231, 123, 213, 148,
- 93, 1, 212, 225, 2, 241, 144, 93, 225, 145, 235, 53, 214, 243, 93, 26,
- 212, 253, 212, 225, 212, 225, 226, 112, 93, 1, 254, 48, 253, 78, 93, 1,
- 213, 232, 254, 78, 93, 1, 213, 232, 248, 134, 93, 1, 213, 232, 241, 222,
- 93, 1, 213, 232, 234, 254, 93, 1, 213, 232, 233, 118, 93, 1, 213, 232,
- 40, 231, 129, 93, 1, 213, 232, 223, 219, 93, 1, 213, 232, 217, 245, 93,
- 1, 254, 48, 94, 52, 93, 1, 220, 201, 2, 220, 201, 247, 74, 93, 1, 220,
- 201, 2, 220, 85, 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 201,
- 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 85, 247, 74, 93, 1, 106,
- 2, 226, 112, 93, 1, 106, 2, 224, 220, 93, 1, 106, 2, 231, 234, 93, 1,
- 251, 206, 2, 248, 150, 93, 1, 242, 178, 2, 248, 150, 93, 1, 248, 135, 2,
- 248, 150, 93, 1, 241, 223, 2, 231, 234, 93, 1, 214, 237, 2, 248, 150, 93,
- 1, 212, 91, 2, 248, 150, 93, 1, 217, 184, 2, 248, 150, 93, 1, 212, 225,
- 2, 248, 150, 93, 1, 40, 234, 255, 2, 248, 150, 93, 1, 234, 255, 2, 248,
- 150, 93, 1, 233, 119, 2, 248, 150, 93, 1, 231, 130, 2, 248, 150, 93, 1,
- 228, 51, 2, 248, 150, 93, 1, 222, 165, 2, 248, 150, 93, 1, 40, 226, 97,
- 2, 248, 150, 93, 1, 226, 97, 2, 248, 150, 93, 1, 216, 138, 2, 248, 150,
- 93, 1, 224, 185, 2, 248, 150, 93, 1, 223, 220, 2, 248, 150, 93, 1, 220,
- 201, 2, 248, 150, 93, 1, 217, 246, 2, 248, 150, 93, 1, 214, 237, 2, 241,
- 47, 93, 1, 251, 206, 2, 224, 59, 93, 1, 234, 255, 2, 224, 59, 93, 1, 226,
- 97, 2, 224, 59, 93, 26, 106, 233, 118, 12, 1, 106, 214, 31, 48, 17, 12,
- 1, 106, 214, 31, 40, 17, 12, 1, 251, 241, 48, 17, 12, 1, 251, 241, 40,
- 17, 12, 1, 251, 241, 70, 17, 12, 1, 251, 241, 138, 17, 12, 1, 226, 81,
- 48, 17, 12, 1, 226, 81, 40, 17, 12, 1, 226, 81, 70, 17, 12, 1, 226, 81,
- 138, 17, 12, 1, 251, 229, 48, 17, 12, 1, 251, 229, 40, 17, 12, 1, 251,
- 229, 70, 17, 12, 1, 251, 229, 138, 17, 12, 1, 216, 108, 48, 17, 12, 1,
- 216, 108, 40, 17, 12, 1, 216, 108, 70, 17, 12, 1, 216, 108, 138, 17, 12,
- 1, 217, 214, 48, 17, 12, 1, 217, 214, 40, 17, 12, 1, 217, 214, 70, 17,
- 12, 1, 217, 214, 138, 17, 12, 1, 216, 110, 48, 17, 12, 1, 216, 110, 40,
- 17, 12, 1, 216, 110, 70, 17, 12, 1, 216, 110, 138, 17, 12, 1, 214, 226,
- 48, 17, 12, 1, 214, 226, 40, 17, 12, 1, 214, 226, 70, 17, 12, 1, 214,
- 226, 138, 17, 12, 1, 226, 79, 48, 17, 12, 1, 226, 79, 40, 17, 12, 1, 226,
- 79, 70, 17, 12, 1, 226, 79, 138, 17, 12, 1, 245, 255, 48, 17, 12, 1, 245,
- 255, 40, 17, 12, 1, 245, 255, 70, 17, 12, 1, 245, 255, 138, 17, 12, 1,
- 228, 15, 48, 17, 12, 1, 228, 15, 40, 17, 12, 1, 228, 15, 70, 17, 12, 1,
- 228, 15, 138, 17, 12, 1, 217, 234, 48, 17, 12, 1, 217, 234, 40, 17, 12,
- 1, 217, 234, 70, 17, 12, 1, 217, 234, 138, 17, 12, 1, 217, 232, 48, 17,
- 12, 1, 217, 232, 40, 17, 12, 1, 217, 232, 70, 17, 12, 1, 217, 232, 138,
- 17, 12, 1, 248, 84, 48, 17, 12, 1, 248, 84, 40, 17, 12, 1, 248, 147, 48,
- 17, 12, 1, 248, 147, 40, 17, 12, 1, 246, 26, 48, 17, 12, 1, 246, 26, 40,
- 17, 12, 1, 248, 82, 48, 17, 12, 1, 248, 82, 40, 17, 12, 1, 235, 122, 48,
- 17, 12, 1, 235, 122, 40, 17, 12, 1, 223, 78, 48, 17, 12, 1, 223, 78, 40,
- 17, 12, 1, 234, 181, 48, 17, 12, 1, 234, 181, 40, 17, 12, 1, 234, 181,
- 70, 17, 12, 1, 234, 181, 138, 17, 12, 1, 243, 98, 48, 17, 12, 1, 243, 98,
- 40, 17, 12, 1, 243, 98, 70, 17, 12, 1, 243, 98, 138, 17, 12, 1, 242, 83,
- 48, 17, 12, 1, 242, 83, 40, 17, 12, 1, 242, 83, 70, 17, 12, 1, 242, 83,
- 138, 17, 12, 1, 229, 89, 48, 17, 12, 1, 229, 89, 40, 17, 12, 1, 229, 89,
- 70, 17, 12, 1, 229, 89, 138, 17, 12, 1, 228, 174, 242, 195, 48, 17, 12,
- 1, 228, 174, 242, 195, 40, 17, 12, 1, 223, 116, 48, 17, 12, 1, 223, 116,
- 40, 17, 12, 1, 223, 116, 70, 17, 12, 1, 223, 116, 138, 17, 12, 1, 241,
- 203, 2, 73, 78, 48, 17, 12, 1, 241, 203, 2, 73, 78, 40, 17, 12, 1, 241,
- 203, 242, 148, 48, 17, 12, 1, 241, 203, 242, 148, 40, 17, 12, 1, 241,
- 203, 242, 148, 70, 17, 12, 1, 241, 203, 242, 148, 138, 17, 12, 1, 241,
- 203, 247, 96, 48, 17, 12, 1, 241, 203, 247, 96, 40, 17, 12, 1, 241, 203,
- 247, 96, 70, 17, 12, 1, 241, 203, 247, 96, 138, 17, 12, 1, 73, 252, 53,
- 48, 17, 12, 1, 73, 252, 53, 40, 17, 12, 1, 73, 252, 53, 2, 192, 78, 48,
- 17, 12, 1, 73, 252, 53, 2, 192, 78, 40, 17, 12, 16, 62, 49, 12, 16, 62,
- 55, 12, 16, 117, 176, 49, 12, 16, 117, 176, 55, 12, 16, 133, 176, 49, 12,
- 16, 133, 176, 55, 12, 16, 133, 176, 225, 141, 246, 58, 49, 12, 16, 133,
- 176, 225, 141, 246, 58, 55, 12, 16, 243, 237, 176, 49, 12, 16, 243, 237,
- 176, 55, 12, 16, 51, 71, 252, 60, 55, 12, 16, 117, 176, 214, 166, 49, 12,
- 16, 117, 176, 214, 166, 55, 12, 16, 223, 130, 12, 16, 3, 218, 30, 49, 12,
- 16, 3, 218, 30, 55, 12, 1, 229, 162, 48, 17, 12, 1, 229, 162, 40, 17, 12,
- 1, 229, 162, 70, 17, 12, 1, 229, 162, 138, 17, 12, 1, 111, 48, 17, 12, 1,
- 111, 40, 17, 12, 1, 227, 100, 48, 17, 12, 1, 227, 100, 40, 17, 12, 1,
- 212, 204, 48, 17, 12, 1, 212, 204, 40, 17, 12, 1, 111, 2, 192, 78, 48,
- 17, 12, 1, 214, 233, 48, 17, 12, 1, 214, 233, 40, 17, 12, 1, 234, 82,
- 227, 100, 48, 17, 12, 1, 234, 82, 227, 100, 40, 17, 12, 1, 234, 82, 212,
- 204, 48, 17, 12, 1, 234, 82, 212, 204, 40, 17, 12, 1, 191, 48, 17, 12, 1,
- 191, 40, 17, 12, 1, 191, 70, 17, 12, 1, 191, 138, 17, 12, 1, 215, 177,
- 234, 192, 234, 82, 106, 210, 70, 17, 12, 1, 215, 177, 234, 192, 234, 82,
- 106, 210, 138, 17, 12, 26, 73, 2, 192, 78, 2, 106, 48, 17, 12, 26, 73, 2,
- 192, 78, 2, 106, 40, 17, 12, 26, 73, 2, 192, 78, 2, 254, 149, 48, 17, 12,
- 26, 73, 2, 192, 78, 2, 254, 149, 40, 17, 12, 26, 73, 2, 192, 78, 2, 214,
- 15, 48, 17, 12, 26, 73, 2, 192, 78, 2, 214, 15, 40, 17, 12, 26, 73, 2,
- 192, 78, 2, 111, 48, 17, 12, 26, 73, 2, 192, 78, 2, 111, 40, 17, 12, 26,
- 73, 2, 192, 78, 2, 227, 100, 48, 17, 12, 26, 73, 2, 192, 78, 2, 227, 100,
- 40, 17, 12, 26, 73, 2, 192, 78, 2, 212, 204, 48, 17, 12, 26, 73, 2, 192,
- 78, 2, 212, 204, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 48, 17, 12, 26,
- 73, 2, 192, 78, 2, 191, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 70, 17,
- 12, 26, 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26,
- 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 40, 17, 12, 26, 215, 177,
- 234, 82, 73, 2, 192, 78, 2, 106, 210, 70, 17, 12, 1, 244, 136, 73, 48,
- 17, 12, 1, 244, 136, 73, 40, 17, 12, 1, 244, 136, 73, 70, 17, 12, 1, 244,
- 136, 73, 138, 17, 12, 26, 73, 2, 192, 78, 2, 145, 48, 17, 12, 26, 73, 2,
- 192, 78, 2, 121, 48, 17, 12, 26, 73, 2, 192, 78, 2, 63, 48, 17, 12, 26,
- 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26, 73, 2, 192, 78, 2, 73, 48,
- 17, 12, 26, 251, 231, 2, 145, 48, 17, 12, 26, 251, 231, 2, 121, 48, 17,
- 12, 26, 251, 231, 2, 234, 136, 48, 17, 12, 26, 251, 231, 2, 63, 48, 17,
- 12, 26, 251, 231, 2, 106, 210, 48, 17, 12, 26, 251, 231, 2, 73, 48, 17,
- 12, 26, 217, 216, 2, 145, 48, 17, 12, 26, 217, 216, 2, 121, 48, 17, 12,
- 26, 217, 216, 2, 234, 136, 48, 17, 12, 26, 217, 216, 2, 63, 48, 17, 12,
- 26, 217, 216, 2, 106, 210, 48, 17, 12, 26, 217, 216, 2, 73, 48, 17, 12,
- 26, 217, 146, 2, 145, 48, 17, 12, 26, 217, 146, 2, 63, 48, 17, 12, 26,
- 217, 146, 2, 106, 210, 48, 17, 12, 26, 217, 146, 2, 73, 48, 17, 12, 26,
- 145, 2, 121, 48, 17, 12, 26, 145, 2, 63, 48, 17, 12, 26, 121, 2, 145, 48,
- 17, 12, 26, 121, 2, 63, 48, 17, 12, 26, 234, 136, 2, 145, 48, 17, 12, 26,
- 234, 136, 2, 121, 48, 17, 12, 26, 234, 136, 2, 63, 48, 17, 12, 26, 222,
- 86, 2, 145, 48, 17, 12, 26, 222, 86, 2, 121, 48, 17, 12, 26, 222, 86, 2,
- 234, 136, 48, 17, 12, 26, 222, 86, 2, 63, 48, 17, 12, 26, 222, 196, 2,
- 121, 48, 17, 12, 26, 222, 196, 2, 63, 48, 17, 12, 26, 248, 160, 2, 145,
- 48, 17, 12, 26, 248, 160, 2, 121, 48, 17, 12, 26, 248, 160, 2, 234, 136,
- 48, 17, 12, 26, 248, 160, 2, 63, 48, 17, 12, 26, 218, 30, 2, 121, 48, 17,
- 12, 26, 218, 30, 2, 63, 48, 17, 12, 26, 212, 105, 2, 63, 48, 17, 12, 26,
- 254, 104, 2, 145, 48, 17, 12, 26, 254, 104, 2, 63, 48, 17, 12, 26, 242,
- 221, 2, 145, 48, 17, 12, 26, 242, 221, 2, 63, 48, 17, 12, 26, 244, 112,
- 2, 145, 48, 17, 12, 26, 244, 112, 2, 121, 48, 17, 12, 26, 244, 112, 2,
- 234, 136, 48, 17, 12, 26, 244, 112, 2, 63, 48, 17, 12, 26, 244, 112, 2,
- 106, 210, 48, 17, 12, 26, 244, 112, 2, 73, 48, 17, 12, 26, 224, 226, 2,
- 121, 48, 17, 12, 26, 224, 226, 2, 63, 48, 17, 12, 26, 224, 226, 2, 106,
- 210, 48, 17, 12, 26, 224, 226, 2, 73, 48, 17, 12, 26, 234, 255, 2, 106,
- 48, 17, 12, 26, 234, 255, 2, 145, 48, 17, 12, 26, 234, 255, 2, 121, 48,
- 17, 12, 26, 234, 255, 2, 234, 136, 48, 17, 12, 26, 234, 255, 2, 233, 127,
- 48, 17, 12, 26, 234, 255, 2, 63, 48, 17, 12, 26, 234, 255, 2, 106, 210,
- 48, 17, 12, 26, 234, 255, 2, 73, 48, 17, 12, 26, 233, 127, 2, 145, 48,
- 17, 12, 26, 233, 127, 2, 121, 48, 17, 12, 26, 233, 127, 2, 234, 136, 48,
- 17, 12, 26, 233, 127, 2, 63, 48, 17, 12, 26, 233, 127, 2, 106, 210, 48,
- 17, 12, 26, 233, 127, 2, 73, 48, 17, 12, 26, 63, 2, 145, 48, 17, 12, 26,
- 63, 2, 121, 48, 17, 12, 26, 63, 2, 234, 136, 48, 17, 12, 26, 63, 2, 63,
- 48, 17, 12, 26, 63, 2, 106, 210, 48, 17, 12, 26, 63, 2, 73, 48, 17, 12,
- 26, 228, 174, 2, 145, 48, 17, 12, 26, 228, 174, 2, 121, 48, 17, 12, 26,
- 228, 174, 2, 234, 136, 48, 17, 12, 26, 228, 174, 2, 63, 48, 17, 12, 26,
- 228, 174, 2, 106, 210, 48, 17, 12, 26, 228, 174, 2, 73, 48, 17, 12, 26,
- 241, 203, 2, 145, 48, 17, 12, 26, 241, 203, 2, 63, 48, 17, 12, 26, 241,
- 203, 2, 106, 210, 48, 17, 12, 26, 241, 203, 2, 73, 48, 17, 12, 26, 73, 2,
- 145, 48, 17, 12, 26, 73, 2, 121, 48, 17, 12, 26, 73, 2, 234, 136, 48, 17,
- 12, 26, 73, 2, 63, 48, 17, 12, 26, 73, 2, 106, 210, 48, 17, 12, 26, 73,
- 2, 73, 48, 17, 12, 26, 217, 156, 2, 218, 223, 106, 48, 17, 12, 26, 223,
- 246, 2, 218, 223, 106, 48, 17, 12, 26, 106, 210, 2, 218, 223, 106, 48,
- 17, 12, 26, 221, 16, 2, 248, 128, 48, 17, 12, 26, 221, 16, 2, 234, 209,
- 48, 17, 12, 26, 221, 16, 2, 244, 134, 48, 17, 12, 26, 221, 16, 2, 248,
- 130, 48, 17, 12, 26, 221, 16, 2, 234, 211, 48, 17, 12, 26, 221, 16, 2,
- 218, 223, 106, 48, 17, 12, 26, 73, 2, 192, 78, 2, 223, 246, 40, 17, 12,
- 26, 73, 2, 192, 78, 2, 212, 102, 40, 17, 12, 26, 73, 2, 192, 78, 2, 63,
- 40, 17, 12, 26, 73, 2, 192, 78, 2, 228, 174, 40, 17, 12, 26, 73, 2, 192,
- 78, 2, 106, 210, 40, 17, 12, 26, 73, 2, 192, 78, 2, 73, 40, 17, 12, 26,
- 251, 231, 2, 223, 246, 40, 17, 12, 26, 251, 231, 2, 212, 102, 40, 17, 12,
- 26, 251, 231, 2, 63, 40, 17, 12, 26, 251, 231, 2, 228, 174, 40, 17, 12,
- 26, 251, 231, 2, 106, 210, 40, 17, 12, 26, 251, 231, 2, 73, 40, 17, 12,
- 26, 217, 216, 2, 223, 246, 40, 17, 12, 26, 217, 216, 2, 212, 102, 40, 17,
- 12, 26, 217, 216, 2, 63, 40, 17, 12, 26, 217, 216, 2, 228, 174, 40, 17,
- 12, 26, 217, 216, 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 73, 40, 17,
- 12, 26, 217, 146, 2, 223, 246, 40, 17, 12, 26, 217, 146, 2, 212, 102, 40,
- 17, 12, 26, 217, 146, 2, 63, 40, 17, 12, 26, 217, 146, 2, 228, 174, 40,
- 17, 12, 26, 217, 146, 2, 106, 210, 40, 17, 12, 26, 217, 146, 2, 73, 40,
- 17, 12, 26, 244, 112, 2, 106, 210, 40, 17, 12, 26, 244, 112, 2, 73, 40,
- 17, 12, 26, 224, 226, 2, 106, 210, 40, 17, 12, 26, 224, 226, 2, 73, 40,
- 17, 12, 26, 234, 255, 2, 106, 40, 17, 12, 26, 234, 255, 2, 233, 127, 40,
- 17, 12, 26, 234, 255, 2, 63, 40, 17, 12, 26, 234, 255, 2, 106, 210, 40,
- 17, 12, 26, 234, 255, 2, 73, 40, 17, 12, 26, 233, 127, 2, 63, 40, 17, 12,
- 26, 233, 127, 2, 106, 210, 40, 17, 12, 26, 233, 127, 2, 73, 40, 17, 12,
- 26, 63, 2, 106, 40, 17, 12, 26, 63, 2, 63, 40, 17, 12, 26, 228, 174, 2,
- 223, 246, 40, 17, 12, 26, 228, 174, 2, 212, 102, 40, 17, 12, 26, 228,
- 174, 2, 63, 40, 17, 12, 26, 228, 174, 2, 228, 174, 40, 17, 12, 26, 228,
- 174, 2, 106, 210, 40, 17, 12, 26, 228, 174, 2, 73, 40, 17, 12, 26, 106,
- 210, 2, 218, 223, 106, 40, 17, 12, 26, 73, 2, 223, 246, 40, 17, 12, 26,
- 73, 2, 212, 102, 40, 17, 12, 26, 73, 2, 63, 40, 17, 12, 26, 73, 2, 228,
- 174, 40, 17, 12, 26, 73, 2, 106, 210, 40, 17, 12, 26, 73, 2, 73, 40, 17,
- 12, 26, 73, 2, 192, 78, 2, 145, 70, 17, 12, 26, 73, 2, 192, 78, 2, 121,
- 70, 17, 12, 26, 73, 2, 192, 78, 2, 234, 136, 70, 17, 12, 26, 73, 2, 192,
- 78, 2, 63, 70, 17, 12, 26, 73, 2, 192, 78, 2, 241, 203, 70, 17, 12, 26,
- 251, 231, 2, 145, 70, 17, 12, 26, 251, 231, 2, 121, 70, 17, 12, 26, 251,
- 231, 2, 234, 136, 70, 17, 12, 26, 251, 231, 2, 63, 70, 17, 12, 26, 251,
- 231, 2, 241, 203, 70, 17, 12, 26, 217, 216, 2, 145, 70, 17, 12, 26, 217,
- 216, 2, 121, 70, 17, 12, 26, 217, 216, 2, 234, 136, 70, 17, 12, 26, 217,
- 216, 2, 63, 70, 17, 12, 26, 217, 216, 2, 241, 203, 70, 17, 12, 26, 217,
- 146, 2, 63, 70, 17, 12, 26, 145, 2, 121, 70, 17, 12, 26, 145, 2, 63, 70,
- 17, 12, 26, 121, 2, 145, 70, 17, 12, 26, 121, 2, 63, 70, 17, 12, 26, 234,
- 136, 2, 145, 70, 17, 12, 26, 234, 136, 2, 63, 70, 17, 12, 26, 222, 86, 2,
- 145, 70, 17, 12, 26, 222, 86, 2, 121, 70, 17, 12, 26, 222, 86, 2, 234,
- 136, 70, 17, 12, 26, 222, 86, 2, 63, 70, 17, 12, 26, 222, 196, 2, 121,
- 70, 17, 12, 26, 222, 196, 2, 234, 136, 70, 17, 12, 26, 222, 196, 2, 63,
- 70, 17, 12, 26, 248, 160, 2, 145, 70, 17, 12, 26, 248, 160, 2, 121, 70,
- 17, 12, 26, 248, 160, 2, 234, 136, 70, 17, 12, 26, 248, 160, 2, 63, 70,
- 17, 12, 26, 218, 30, 2, 121, 70, 17, 12, 26, 212, 105, 2, 63, 70, 17, 12,
- 26, 254, 104, 2, 145, 70, 17, 12, 26, 254, 104, 2, 63, 70, 17, 12, 26,
- 242, 221, 2, 145, 70, 17, 12, 26, 242, 221, 2, 63, 70, 17, 12, 26, 244,
- 112, 2, 145, 70, 17, 12, 26, 244, 112, 2, 121, 70, 17, 12, 26, 244, 112,
- 2, 234, 136, 70, 17, 12, 26, 244, 112, 2, 63, 70, 17, 12, 26, 224, 226,
- 2, 121, 70, 17, 12, 26, 224, 226, 2, 63, 70, 17, 12, 26, 234, 255, 2,
- 145, 70, 17, 12, 26, 234, 255, 2, 121, 70, 17, 12, 26, 234, 255, 2, 234,
- 136, 70, 17, 12, 26, 234, 255, 2, 233, 127, 70, 17, 12, 26, 234, 255, 2,
- 63, 70, 17, 12, 26, 233, 127, 2, 145, 70, 17, 12, 26, 233, 127, 2, 121,
- 70, 17, 12, 26, 233, 127, 2, 234, 136, 70, 17, 12, 26, 233, 127, 2, 63,
- 70, 17, 12, 26, 233, 127, 2, 241, 203, 70, 17, 12, 26, 63, 2, 145, 70,
- 17, 12, 26, 63, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 70, 17, 12, 26,
- 63, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 70, 17, 12, 26, 228, 174, 2,
- 121, 70, 17, 12, 26, 228, 174, 2, 234, 136, 70, 17, 12, 26, 228, 174, 2,
- 63, 70, 17, 12, 26, 228, 174, 2, 241, 203, 70, 17, 12, 26, 241, 203, 2,
- 145, 70, 17, 12, 26, 241, 203, 2, 63, 70, 17, 12, 26, 241, 203, 2, 218,
- 223, 106, 70, 17, 12, 26, 73, 2, 145, 70, 17, 12, 26, 73, 2, 121, 70, 17,
- 12, 26, 73, 2, 234, 136, 70, 17, 12, 26, 73, 2, 63, 70, 17, 12, 26, 73,
- 2, 241, 203, 70, 17, 12, 26, 73, 2, 192, 78, 2, 63, 138, 17, 12, 26, 73,
- 2, 192, 78, 2, 241, 203, 138, 17, 12, 26, 251, 231, 2, 63, 138, 17, 12,
- 26, 251, 231, 2, 241, 203, 138, 17, 12, 26, 217, 216, 2, 63, 138, 17, 12,
- 26, 217, 216, 2, 241, 203, 138, 17, 12, 26, 217, 146, 2, 63, 138, 17, 12,
- 26, 217, 146, 2, 241, 203, 138, 17, 12, 26, 222, 86, 2, 63, 138, 17, 12,
- 26, 222, 86, 2, 241, 203, 138, 17, 12, 26, 220, 240, 2, 63, 138, 17, 12,
- 26, 220, 240, 2, 241, 203, 138, 17, 12, 26, 234, 255, 2, 233, 127, 138,
- 17, 12, 26, 234, 255, 2, 63, 138, 17, 12, 26, 233, 127, 2, 63, 138, 17,
- 12, 26, 228, 174, 2, 63, 138, 17, 12, 26, 228, 174, 2, 241, 203, 138, 17,
- 12, 26, 73, 2, 63, 138, 17, 12, 26, 73, 2, 241, 203, 138, 17, 12, 26,
- 221, 16, 2, 244, 134, 138, 17, 12, 26, 221, 16, 2, 248, 130, 138, 17, 12,
- 26, 221, 16, 2, 234, 211, 138, 17, 12, 26, 218, 30, 2, 106, 210, 48, 17,
- 12, 26, 218, 30, 2, 73, 48, 17, 12, 26, 254, 104, 2, 106, 210, 48, 17,
- 12, 26, 254, 104, 2, 73, 48, 17, 12, 26, 242, 221, 2, 106, 210, 48, 17,
- 12, 26, 242, 221, 2, 73, 48, 17, 12, 26, 222, 86, 2, 106, 210, 48, 17,
- 12, 26, 222, 86, 2, 73, 48, 17, 12, 26, 220, 240, 2, 106, 210, 48, 17,
- 12, 26, 220, 240, 2, 73, 48, 17, 12, 26, 121, 2, 106, 210, 48, 17, 12,
- 26, 121, 2, 73, 48, 17, 12, 26, 145, 2, 106, 210, 48, 17, 12, 26, 145, 2,
- 73, 48, 17, 12, 26, 234, 136, 2, 106, 210, 48, 17, 12, 26, 234, 136, 2,
- 73, 48, 17, 12, 26, 222, 196, 2, 106, 210, 48, 17, 12, 26, 222, 196, 2,
- 73, 48, 17, 12, 26, 248, 160, 2, 106, 210, 48, 17, 12, 26, 248, 160, 2,
- 73, 48, 17, 12, 26, 220, 240, 2, 145, 48, 17, 12, 26, 220, 240, 2, 121,
- 48, 17, 12, 26, 220, 240, 2, 234, 136, 48, 17, 12, 26, 220, 240, 2, 63,
- 48, 17, 12, 26, 220, 240, 2, 223, 246, 48, 17, 12, 26, 222, 86, 2, 223,
- 246, 48, 17, 12, 26, 222, 196, 2, 223, 246, 48, 17, 12, 26, 248, 160, 2,
- 223, 246, 48, 17, 12, 26, 218, 30, 2, 106, 210, 40, 17, 12, 26, 218, 30,
- 2, 73, 40, 17, 12, 26, 254, 104, 2, 106, 210, 40, 17, 12, 26, 254, 104,
- 2, 73, 40, 17, 12, 26, 242, 221, 2, 106, 210, 40, 17, 12, 26, 242, 221,
- 2, 73, 40, 17, 12, 26, 222, 86, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2,
- 73, 40, 17, 12, 26, 220, 240, 2, 106, 210, 40, 17, 12, 26, 220, 240, 2,
- 73, 40, 17, 12, 26, 121, 2, 106, 210, 40, 17, 12, 26, 121, 2, 73, 40, 17,
- 12, 26, 145, 2, 106, 210, 40, 17, 12, 26, 145, 2, 73, 40, 17, 12, 26,
- 234, 136, 2, 106, 210, 40, 17, 12, 26, 234, 136, 2, 73, 40, 17, 12, 26,
- 222, 196, 2, 106, 210, 40, 17, 12, 26, 222, 196, 2, 73, 40, 17, 12, 26,
- 248, 160, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 73, 40, 17, 12, 26,
- 220, 240, 2, 145, 40, 17, 12, 26, 220, 240, 2, 121, 40, 17, 12, 26, 220,
- 240, 2, 234, 136, 40, 17, 12, 26, 220, 240, 2, 63, 40, 17, 12, 26, 220,
- 240, 2, 223, 246, 40, 17, 12, 26, 222, 86, 2, 223, 246, 40, 17, 12, 26,
- 222, 196, 2, 223, 246, 40, 17, 12, 26, 248, 160, 2, 223, 246, 40, 17, 12,
- 26, 220, 240, 2, 145, 70, 17, 12, 26, 220, 240, 2, 121, 70, 17, 12, 26,
- 220, 240, 2, 234, 136, 70, 17, 12, 26, 220, 240, 2, 63, 70, 17, 12, 26,
- 222, 86, 2, 241, 203, 70, 17, 12, 26, 220, 240, 2, 241, 203, 70, 17, 12,
- 26, 218, 30, 2, 63, 70, 17, 12, 26, 222, 86, 2, 145, 138, 17, 12, 26,
- 222, 86, 2, 121, 138, 17, 12, 26, 222, 86, 2, 234, 136, 138, 17, 12, 26,
- 220, 240, 2, 145, 138, 17, 12, 26, 220, 240, 2, 121, 138, 17, 12, 26,
- 220, 240, 2, 234, 136, 138, 17, 12, 26, 218, 30, 2, 63, 138, 17, 12, 26,
- 212, 105, 2, 63, 138, 17, 12, 26, 106, 2, 244, 132, 40, 17, 12, 26, 106,
- 2, 244, 132, 48, 17, 227, 13, 42, 226, 131, 227, 13, 46, 226, 131, 12,
- 26, 217, 216, 2, 145, 2, 63, 70, 17, 12, 26, 217, 216, 2, 121, 2, 145,
- 40, 17, 12, 26, 217, 216, 2, 121, 2, 145, 70, 17, 12, 26, 217, 216, 2,
- 121, 2, 63, 70, 17, 12, 26, 217, 216, 2, 234, 136, 2, 63, 70, 17, 12, 26,
- 217, 216, 2, 63, 2, 145, 70, 17, 12, 26, 217, 216, 2, 63, 2, 121, 70, 17,
- 12, 26, 217, 216, 2, 63, 2, 234, 136, 70, 17, 12, 26, 145, 2, 63, 2, 121,
- 40, 17, 12, 26, 145, 2, 63, 2, 121, 70, 17, 12, 26, 121, 2, 63, 2, 73,
- 40, 17, 12, 26, 121, 2, 63, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 121,
- 2, 145, 70, 17, 12, 26, 222, 86, 2, 145, 2, 121, 70, 17, 12, 26, 222, 86,
- 2, 145, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 63, 2, 121, 40, 17, 12,
- 26, 222, 86, 2, 63, 2, 121, 70, 17, 12, 26, 222, 86, 2, 63, 2, 145, 70,
- 17, 12, 26, 222, 86, 2, 63, 2, 63, 40, 17, 12, 26, 222, 86, 2, 63, 2, 63,
- 70, 17, 12, 26, 222, 196, 2, 121, 2, 121, 40, 17, 12, 26, 222, 196, 2,
- 121, 2, 121, 70, 17, 12, 26, 222, 196, 2, 63, 2, 63, 40, 17, 12, 26, 220,
- 240, 2, 121, 2, 63, 40, 17, 12, 26, 220, 240, 2, 121, 2, 63, 70, 17, 12,
- 26, 220, 240, 2, 145, 2, 73, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234,
- 136, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234, 136, 70, 17, 12, 26, 220,
- 240, 2, 63, 2, 63, 40, 17, 12, 26, 220, 240, 2, 63, 2, 63, 70, 17, 12,
- 26, 248, 160, 2, 121, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 234, 136,
- 2, 63, 40, 17, 12, 26, 248, 160, 2, 234, 136, 2, 63, 70, 17, 12, 26, 218,
- 30, 2, 63, 2, 121, 40, 17, 12, 26, 218, 30, 2, 63, 2, 121, 70, 17, 12,
- 26, 218, 30, 2, 63, 2, 63, 70, 17, 12, 26, 218, 30, 2, 63, 2, 73, 40, 17,
- 12, 26, 254, 104, 2, 145, 2, 63, 40, 17, 12, 26, 254, 104, 2, 63, 2, 63,
- 40, 17, 12, 26, 254, 104, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 63,
- 2, 106, 210, 40, 17, 12, 26, 242, 221, 2, 63, 2, 63, 40, 17, 12, 26, 242,
- 221, 2, 63, 2, 73, 40, 17, 12, 26, 242, 221, 2, 63, 2, 106, 210, 40, 17,
- 12, 26, 244, 112, 2, 234, 136, 2, 63, 40, 17, 12, 26, 244, 112, 2, 234,
- 136, 2, 63, 70, 17, 12, 26, 224, 226, 2, 63, 2, 121, 40, 17, 12, 26, 224,
- 226, 2, 63, 2, 63, 40, 17, 12, 26, 233, 127, 2, 121, 2, 63, 40, 17, 12,
- 26, 233, 127, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 121, 2, 106,
- 210, 40, 17, 12, 26, 233, 127, 2, 145, 2, 145, 70, 17, 12, 26, 233, 127,
- 2, 145, 2, 145, 40, 17, 12, 26, 233, 127, 2, 234, 136, 2, 63, 40, 17, 12,
- 26, 233, 127, 2, 234, 136, 2, 63, 70, 17, 12, 26, 233, 127, 2, 63, 2,
- 121, 40, 17, 12, 26, 233, 127, 2, 63, 2, 121, 70, 17, 12, 26, 63, 2, 121,
- 2, 145, 70, 17, 12, 26, 63, 2, 121, 2, 63, 70, 17, 12, 26, 63, 2, 121, 2,
- 73, 40, 17, 12, 26, 63, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 145, 2,
- 63, 70, 17, 12, 26, 63, 2, 234, 136, 2, 145, 70, 17, 12, 26, 63, 2, 234,
- 136, 2, 63, 70, 17, 12, 26, 63, 2, 145, 2, 234, 136, 70, 17, 12, 26, 241,
- 203, 2, 63, 2, 145, 70, 17, 12, 26, 241, 203, 2, 63, 2, 63, 70, 17, 12,
- 26, 228, 174, 2, 121, 2, 63, 70, 17, 12, 26, 228, 174, 2, 121, 2, 106,
- 210, 40, 17, 12, 26, 228, 174, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174,
- 2, 145, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 2, 106, 210, 40, 17, 12,
- 26, 228, 174, 2, 63, 2, 73, 40, 17, 12, 26, 228, 174, 2, 63, 2, 106, 210,
- 40, 17, 12, 26, 73, 2, 63, 2, 63, 40, 17, 12, 26, 73, 2, 63, 2, 63, 70,
- 17, 12, 26, 251, 231, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2,
- 145, 2, 73, 40, 17, 12, 26, 217, 216, 2, 145, 2, 106, 210, 40, 17, 12,
- 26, 217, 216, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2, 234, 136,
- 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 63, 2, 73, 40, 17, 12, 26, 217,
- 216, 2, 63, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 73, 40, 17, 12,
- 26, 145, 2, 121, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 106, 210,
- 40, 17, 12, 26, 222, 86, 2, 234, 136, 2, 106, 210, 40, 17, 12, 26, 222,
- 196, 2, 121, 2, 73, 40, 17, 12, 26, 220, 240, 2, 121, 2, 73, 40, 17, 12,
- 26, 248, 160, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 145, 2, 73, 40,
- 17, 12, 26, 233, 127, 2, 63, 2, 73, 40, 17, 12, 26, 73, 2, 121, 2, 73,
- 40, 17, 12, 26, 73, 2, 145, 2, 73, 40, 17, 12, 26, 73, 2, 63, 2, 73, 40,
- 17, 12, 26, 63, 2, 63, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2, 73, 40,
- 17, 12, 26, 228, 174, 2, 121, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2,
- 121, 70, 17, 12, 26, 233, 127, 2, 121, 2, 63, 70, 17, 12, 26, 254, 104,
- 2, 63, 2, 73, 40, 17, 12, 26, 234, 255, 2, 63, 2, 73, 40, 17, 12, 26,
- 228, 174, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 2, 73, 40, 17,
- 12, 26, 233, 127, 2, 145, 2, 63, 70, 17, 12, 26, 234, 255, 2, 63, 2, 63,
- 40, 17, 12, 26, 233, 127, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174, 2,
- 145, 2, 121, 40, 17, 12, 26, 145, 2, 121, 2, 73, 40, 17, 12, 26, 121, 2,
- 145, 2, 73, 40, 17, 12, 26, 63, 2, 145, 2, 73, 40, 17, 12, 26, 244, 112,
- 2, 63, 2, 73, 40, 17, 12, 26, 251, 231, 2, 121, 2, 73, 40, 17, 12, 26,
- 234, 255, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 145, 2, 63, 70, 17,
- 12, 26, 222, 196, 2, 63, 2, 63, 70, 17, 12, 26, 222, 86, 2, 234, 136, 2,
- 73, 40, 17, 12, 26, 228, 174, 2, 145, 2, 73, 40, 17, 12, 26, 222, 175,
- 215, 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 224, 222, 215,
- 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 254, 62, 48, 17, 12,
- 26, 254, 91, 48, 17, 12, 26, 230, 223, 48, 17, 12, 26, 222, 176, 48, 17,
- 12, 26, 224, 35, 48, 17, 12, 26, 254, 80, 48, 17, 12, 26, 214, 33, 48,
- 17, 12, 26, 222, 175, 48, 17, 12, 26, 222, 174, 254, 80, 214, 32, 12, 26,
- 235, 134, 223, 187, 52, 12, 26, 251, 153, 253, 209, 253, 210, 43, 222,
- 76, 43, 221, 221, 43, 221, 153, 43, 221, 142, 43, 221, 131, 43, 221, 120,
- 43, 221, 109, 43, 221, 98, 43, 221, 87, 43, 222, 75, 43, 222, 64, 43,
- 222, 53, 43, 222, 42, 43, 222, 31, 43, 222, 20, 43, 222, 9, 225, 74, 243,
- 245, 31, 71, 249, 157, 225, 74, 243, 245, 31, 71, 105, 249, 157, 225, 74,
- 243, 245, 31, 71, 105, 243, 200, 219, 69, 225, 74, 243, 245, 31, 71, 249,
- 164, 225, 74, 243, 245, 31, 71, 221, 70, 225, 74, 243, 245, 31, 71, 244,
- 254, 77, 225, 74, 243, 245, 31, 71, 224, 158, 77, 225, 74, 243, 245, 31,
- 71, 42, 67, 233, 44, 125, 225, 74, 243, 245, 31, 71, 46, 67, 233, 44,
- 251, 83, 225, 74, 243, 245, 31, 71, 199, 245, 120, 37, 26, 42, 242, 9,
- 37, 26, 46, 242, 9, 37, 51, 217, 43, 42, 242, 9, 37, 51, 217, 43, 46,
- 242, 9, 37, 232, 38, 42, 242, 9, 37, 232, 38, 46, 242, 9, 37, 249, 137,
- 232, 37, 225, 74, 243, 245, 31, 71, 117, 62, 233, 80, 225, 74, 243, 245,
- 31, 71, 245, 118, 248, 101, 225, 74, 243, 245, 31, 71, 245, 109, 248,
- 101, 225, 74, 243, 245, 31, 71, 115, 232, 242, 225, 74, 243, 245, 31, 71,
- 214, 16, 115, 232, 242, 225, 74, 243, 245, 31, 71, 42, 226, 131, 225, 74,
- 243, 245, 31, 71, 46, 226, 131, 225, 74, 243, 245, 31, 71, 42, 249, 40,
- 125, 225, 74, 243, 245, 31, 71, 46, 249, 40, 125, 225, 74, 243, 245, 31,
- 71, 42, 216, 219, 220, 233, 125, 225, 74, 243, 245, 31, 71, 46, 216, 219,
- 220, 233, 125, 225, 74, 243, 245, 31, 71, 42, 83, 233, 44, 125, 225, 74,
- 243, 245, 31, 71, 46, 83, 233, 44, 125, 225, 74, 243, 245, 31, 71, 42,
- 51, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46, 51, 254, 19, 125, 225,
- 74, 243, 245, 31, 71, 42, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46,
- 254, 19, 125, 225, 74, 243, 245, 31, 71, 42, 249, 100, 125, 225, 74, 243,
- 245, 31, 71, 46, 249, 100, 125, 225, 74, 243, 245, 31, 71, 42, 67, 249,
- 100, 125, 225, 74, 243, 245, 31, 71, 46, 67, 249, 100, 125, 221, 52, 247,
- 74, 67, 221, 52, 247, 74, 225, 74, 243, 245, 31, 71, 42, 41, 125, 225,
- 74, 243, 245, 31, 71, 46, 41, 125, 248, 100, 226, 243, 250, 106, 226,
- 243, 214, 16, 226, 243, 51, 214, 16, 226, 243, 248, 100, 115, 232, 242,
- 250, 106, 115, 232, 242, 214, 16, 115, 232, 242, 3, 249, 157, 3, 105,
- 249, 157, 3, 243, 200, 219, 69, 3, 221, 70, 3, 249, 164, 3, 224, 158, 77,
- 3, 244, 254, 77, 3, 245, 118, 248, 101, 3, 42, 226, 131, 3, 46, 226, 131,
- 3, 42, 249, 40, 125, 3, 46, 249, 40, 125, 3, 42, 216, 219, 220, 233, 125,
- 3, 46, 216, 219, 220, 233, 125, 3, 50, 52, 3, 254, 35, 3, 253, 132, 3,
- 94, 52, 3, 240, 159, 3, 233, 39, 52, 3, 242, 107, 52, 3, 245, 61, 52, 3,
- 223, 203, 219, 231, 3, 247, 86, 52, 3, 226, 57, 52, 3, 249, 156, 253,
- 122, 12, 244, 132, 48, 17, 12, 217, 251, 2, 244, 132, 49, 12, 248, 128,
- 48, 17, 12, 218, 28, 243, 227, 12, 234, 209, 48, 17, 12, 244, 134, 48,
- 17, 12, 244, 134, 138, 17, 12, 248, 130, 48, 17, 12, 248, 130, 138, 17,
- 12, 234, 211, 48, 17, 12, 234, 211, 138, 17, 12, 221, 16, 48, 17, 12,
- 221, 16, 138, 17, 12, 218, 247, 48, 17, 12, 218, 247, 138, 17, 12, 1,
- 192, 48, 17, 12, 1, 106, 2, 232, 33, 78, 48, 17, 12, 1, 106, 2, 232, 33,
- 78, 40, 17, 12, 1, 106, 2, 192, 78, 48, 17, 12, 1, 106, 2, 192, 78, 40,
- 17, 12, 1, 214, 15, 2, 192, 78, 48, 17, 12, 1, 214, 15, 2, 192, 78, 40,
- 17, 12, 1, 106, 2, 192, 251, 220, 48, 17, 12, 1, 106, 2, 192, 251, 220,
- 40, 17, 12, 1, 73, 2, 192, 78, 48, 17, 12, 1, 73, 2, 192, 78, 40, 17, 12,
- 1, 73, 2, 192, 78, 70, 17, 12, 1, 73, 2, 192, 78, 138, 17, 12, 1, 106,
- 48, 17, 12, 1, 106, 40, 17, 12, 1, 251, 231, 48, 17, 12, 1, 251, 231, 40,
- 17, 12, 1, 251, 231, 70, 17, 12, 1, 251, 231, 138, 17, 12, 1, 217, 216,
- 231, 228, 48, 17, 12, 1, 217, 216, 231, 228, 40, 17, 12, 1, 217, 216, 48,
- 17, 12, 1, 217, 216, 40, 17, 12, 1, 217, 216, 70, 17, 12, 1, 217, 216,
- 138, 17, 12, 1, 217, 146, 48, 17, 12, 1, 217, 146, 40, 17, 12, 1, 217,
- 146, 70, 17, 12, 1, 217, 146, 138, 17, 12, 1, 145, 48, 17, 12, 1, 145,
- 40, 17, 12, 1, 145, 70, 17, 12, 1, 145, 138, 17, 12, 1, 121, 48, 17, 12,
- 1, 121, 40, 17, 12, 1, 121, 70, 17, 12, 1, 121, 138, 17, 12, 1, 234, 136,
- 48, 17, 12, 1, 234, 136, 40, 17, 12, 1, 234, 136, 70, 17, 12, 1, 234,
- 136, 138, 17, 12, 1, 248, 141, 48, 17, 12, 1, 248, 141, 40, 17, 12, 1,
- 217, 156, 48, 17, 12, 1, 217, 156, 40, 17, 12, 1, 223, 246, 48, 17, 12,
- 1, 223, 246, 40, 17, 12, 1, 212, 102, 48, 17, 12, 1, 212, 102, 40, 17,
- 12, 1, 222, 86, 48, 17, 12, 1, 222, 86, 40, 17, 12, 1, 222, 86, 70, 17,
- 12, 1, 222, 86, 138, 17, 12, 1, 220, 240, 48, 17, 12, 1, 220, 240, 40,
- 17, 12, 1, 220, 240, 70, 17, 12, 1, 220, 240, 138, 17, 12, 1, 222, 196,
- 48, 17, 12, 1, 222, 196, 40, 17, 12, 1, 222, 196, 70, 17, 12, 1, 222,
- 196, 138, 17, 12, 1, 248, 160, 48, 17, 12, 1, 248, 160, 40, 17, 12, 1,
- 248, 160, 70, 17, 12, 1, 248, 160, 138, 17, 12, 1, 218, 30, 48, 17, 12,
- 1, 218, 30, 40, 17, 12, 1, 218, 30, 70, 17, 12, 1, 218, 30, 138, 17, 12,
- 1, 212, 105, 48, 17, 12, 1, 212, 105, 40, 17, 12, 1, 212, 105, 70, 17,
- 12, 1, 212, 105, 138, 17, 12, 1, 254, 104, 48, 17, 12, 1, 254, 104, 40,
- 17, 12, 1, 254, 104, 70, 17, 12, 1, 254, 104, 138, 17, 12, 1, 242, 221,
- 48, 17, 12, 1, 242, 221, 40, 17, 12, 1, 242, 221, 70, 17, 12, 1, 242,
- 221, 138, 17, 12, 1, 244, 112, 48, 17, 12, 1, 244, 112, 40, 17, 12, 1,
- 244, 112, 70, 17, 12, 1, 244, 112, 138, 17, 12, 1, 224, 226, 48, 17, 12,
- 1, 224, 226, 40, 17, 12, 1, 224, 226, 70, 17, 12, 1, 224, 226, 138, 17,
- 12, 1, 234, 255, 48, 17, 12, 1, 234, 255, 40, 17, 12, 1, 234, 255, 70,
- 17, 12, 1, 234, 255, 138, 17, 12, 1, 233, 127, 48, 17, 12, 1, 233, 127,
- 40, 17, 12, 1, 233, 127, 70, 17, 12, 1, 233, 127, 138, 17, 12, 1, 63, 48,
- 17, 12, 1, 63, 40, 17, 12, 1, 63, 70, 17, 12, 1, 63, 138, 17, 12, 1, 228,
- 174, 48, 17, 12, 1, 228, 174, 40, 17, 12, 1, 228, 174, 70, 17, 12, 1,
- 228, 174, 138, 17, 12, 1, 241, 203, 48, 17, 12, 1, 241, 203, 40, 17, 12,
- 1, 241, 203, 70, 17, 12, 1, 241, 203, 138, 17, 12, 1, 214, 15, 48, 17,
- 12, 1, 214, 15, 40, 17, 12, 1, 106, 210, 48, 17, 12, 1, 106, 210, 40, 17,
- 12, 1, 73, 48, 17, 12, 1, 73, 40, 17, 12, 1, 73, 70, 17, 12, 1, 73, 138,
- 17, 12, 26, 233, 127, 2, 106, 2, 232, 33, 78, 48, 17, 12, 26, 233, 127,
- 2, 106, 2, 232, 33, 78, 40, 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 48,
- 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 40, 17, 12, 26, 233, 127, 2,
- 106, 2, 192, 251, 220, 48, 17, 12, 26, 233, 127, 2, 106, 2, 192, 251,
- 220, 40, 17, 12, 26, 233, 127, 2, 106, 48, 17, 12, 26, 233, 127, 2, 106,
- 40, 17, 212, 80, 213, 230, 228, 184, 219, 206, 120, 244, 254, 77, 120,
- 224, 143, 77, 120, 50, 52, 120, 247, 86, 52, 120, 226, 57, 52, 120, 254,
- 35, 120, 253, 226, 120, 42, 226, 131, 120, 46, 226, 131, 120, 253, 132,
- 120, 94, 52, 120, 249, 157, 120, 240, 159, 120, 243, 200, 219, 69, 120,
- 219, 231, 120, 21, 212, 79, 120, 21, 116, 120, 21, 109, 120, 21, 166,
- 120, 21, 163, 120, 21, 180, 120, 21, 189, 120, 21, 198, 120, 21, 195,
- 120, 21, 200, 120, 249, 164, 120, 221, 70, 120, 233, 39, 52, 120, 245,
- 61, 52, 120, 242, 107, 52, 120, 224, 158, 77, 120, 249, 156, 253, 122,
- 120, 7, 6, 1, 61, 120, 7, 6, 1, 253, 74, 120, 7, 6, 1, 250, 252, 120, 7,
- 6, 1, 249, 3, 120, 7, 6, 1, 74, 120, 7, 6, 1, 244, 230, 120, 7, 6, 1,
- 243, 177, 120, 7, 6, 1, 242, 41, 120, 7, 6, 1, 72, 120, 7, 6, 1, 235,
- 142, 120, 7, 6, 1, 235, 27, 120, 7, 6, 1, 150, 120, 7, 6, 1, 183, 120, 7,
- 6, 1, 204, 120, 7, 6, 1, 75, 120, 7, 6, 1, 226, 229, 120, 7, 6, 1, 224,
- 240, 120, 7, 6, 1, 149, 120, 7, 6, 1, 197, 120, 7, 6, 1, 218, 99, 120, 7,
- 6, 1, 69, 120, 7, 6, 1, 215, 79, 120, 7, 6, 1, 214, 82, 120, 7, 6, 1,
- 213, 166, 120, 7, 6, 1, 213, 105, 120, 7, 6, 1, 212, 152, 120, 42, 41,
- 125, 120, 223, 203, 219, 231, 120, 46, 41, 125, 120, 249, 224, 254, 174,
- 120, 115, 232, 242, 120, 242, 114, 254, 174, 120, 7, 3, 1, 61, 120, 7, 3,
- 1, 253, 74, 120, 7, 3, 1, 250, 252, 120, 7, 3, 1, 249, 3, 120, 7, 3, 1,
- 74, 120, 7, 3, 1, 244, 230, 120, 7, 3, 1, 243, 177, 120, 7, 3, 1, 242,
- 41, 120, 7, 3, 1, 72, 120, 7, 3, 1, 235, 142, 120, 7, 3, 1, 235, 27, 120,
- 7, 3, 1, 150, 120, 7, 3, 1, 183, 120, 7, 3, 1, 204, 120, 7, 3, 1, 75,
- 120, 7, 3, 1, 226, 229, 120, 7, 3, 1, 224, 240, 120, 7, 3, 1, 149, 120,
- 7, 3, 1, 197, 120, 7, 3, 1, 218, 99, 120, 7, 3, 1, 69, 120, 7, 3, 1, 215,
- 79, 120, 7, 3, 1, 214, 82, 120, 7, 3, 1, 213, 166, 120, 7, 3, 1, 213,
- 105, 120, 7, 3, 1, 212, 152, 120, 42, 249, 40, 125, 120, 71, 232, 242,
- 120, 46, 249, 40, 125, 120, 217, 42, 120, 42, 67, 226, 131, 120, 46, 67,
- 226, 131, 98, 105, 243, 200, 219, 69, 98, 42, 249, 100, 125, 98, 46, 249,
- 100, 125, 98, 105, 249, 157, 98, 56, 231, 37, 247, 74, 98, 56, 1, 213,
- 214, 98, 56, 1, 3, 61, 98, 56, 1, 3, 72, 98, 56, 1, 3, 69, 98, 56, 1, 3,
- 74, 98, 56, 1, 3, 75, 98, 56, 1, 3, 186, 98, 56, 1, 3, 212, 203, 98, 56,
- 1, 3, 212, 235, 98, 56, 1, 3, 216, 82, 98, 234, 206, 225, 57, 219, 218,
- 77, 98, 56, 1, 61, 98, 56, 1, 72, 98, 56, 1, 69, 98, 56, 1, 74, 98, 56,
- 1, 75, 98, 56, 1, 181, 98, 56, 1, 234, 101, 98, 56, 1, 233, 238, 98, 56,
- 1, 234, 188, 98, 56, 1, 234, 37, 98, 56, 1, 222, 202, 98, 56, 1, 220,
- 117, 98, 56, 1, 219, 27, 98, 56, 1, 222, 100, 98, 56, 1, 219, 242, 98,
- 56, 1, 218, 52, 98, 56, 1, 217, 71, 98, 56, 1, 216, 82, 98, 56, 1, 217,
- 229, 98, 56, 1, 108, 98, 56, 1, 205, 98, 56, 1, 229, 64, 98, 56, 1, 228,
- 92, 98, 56, 1, 229, 187, 98, 56, 1, 228, 185, 98, 56, 1, 159, 98, 56, 1,
- 241, 165, 98, 56, 1, 240, 212, 98, 56, 1, 241, 222, 98, 56, 1, 241, 54,
- 98, 56, 1, 188, 98, 56, 1, 231, 42, 98, 56, 1, 230, 172, 98, 56, 1, 231,
- 156, 98, 56, 1, 230, 231, 98, 56, 1, 186, 98, 56, 1, 212, 203, 98, 56, 1,
- 212, 235, 98, 56, 1, 203, 98, 56, 1, 223, 188, 98, 56, 1, 223, 51, 98,
- 56, 1, 224, 21, 98, 56, 1, 223, 112, 98, 56, 1, 214, 49, 98, 56, 1, 204,
- 98, 56, 214, 116, 219, 218, 77, 98, 56, 221, 75, 219, 218, 77, 98, 23,
- 244, 72, 98, 23, 1, 234, 67, 98, 23, 1, 219, 150, 98, 23, 1, 234, 60, 98,
- 23, 1, 229, 57, 98, 23, 1, 229, 55, 98, 23, 1, 229, 54, 98, 23, 1, 217,
- 55, 98, 23, 1, 219, 139, 98, 23, 1, 223, 179, 98, 23, 1, 223, 174, 98,
- 23, 1, 223, 171, 98, 23, 1, 223, 164, 98, 23, 1, 223, 159, 98, 23, 1,
- 223, 154, 98, 23, 1, 223, 165, 98, 23, 1, 223, 177, 98, 23, 1, 231, 30,
- 98, 23, 1, 225, 227, 98, 23, 1, 219, 147, 98, 23, 1, 225, 216, 98, 23, 1,
- 220, 76, 98, 23, 1, 219, 144, 98, 23, 1, 236, 51, 98, 23, 1, 249, 239,
- 98, 23, 1, 219, 154, 98, 23, 1, 250, 43, 98, 23, 1, 234, 116, 98, 23, 1,
- 217, 126, 98, 23, 1, 226, 7, 98, 23, 1, 241, 158, 98, 23, 1, 61, 98, 23,
- 1, 254, 148, 98, 23, 1, 186, 98, 23, 1, 213, 80, 98, 23, 1, 245, 76, 98,
- 23, 1, 74, 98, 23, 1, 213, 27, 98, 23, 1, 213, 38, 98, 23, 1, 75, 98, 23,
- 1, 214, 49, 98, 23, 1, 214, 46, 98, 23, 1, 227, 99, 98, 23, 1, 212, 235,
- 98, 23, 1, 69, 98, 23, 1, 213, 252, 98, 23, 1, 214, 6, 98, 23, 1, 213,
- 235, 98, 23, 1, 212, 203, 98, 23, 1, 245, 22, 98, 23, 1, 212, 255, 98,
- 23, 1, 72, 120, 250, 110, 52, 120, 225, 108, 52, 120, 228, 163, 52, 120,
- 232, 37, 120, 251, 63, 134, 120, 213, 31, 52, 120, 213, 204, 52, 98, 243,
- 243, 177, 214, 216, 98, 132, 68, 98, 215, 124, 68, 98, 95, 68, 98, 246,
- 58, 68, 98, 83, 219, 166, 98, 67, 249, 228, 235, 201, 254, 10, 254, 29,
- 235, 201, 254, 10, 221, 57, 235, 201, 254, 10, 217, 189, 227, 113, 223,
- 224, 250, 78, 223, 224, 250, 78, 58, 54, 4, 253, 58, 61, 58, 54, 4, 253,
- 27, 74, 58, 54, 4, 253, 36, 72, 58, 54, 4, 253, 4, 75, 58, 54, 4, 253,
- 54, 69, 58, 54, 4, 253, 73, 248, 164, 58, 54, 4, 253, 20, 248, 41, 58,
- 54, 4, 253, 60, 247, 211, 58, 54, 4, 253, 50, 247, 99, 58, 54, 4, 253,
- 14, 246, 33, 58, 54, 4, 253, 8, 235, 139, 58, 54, 4, 253, 19, 235, 127,
- 58, 54, 4, 253, 29, 235, 71, 58, 54, 4, 253, 0, 235, 54, 58, 54, 4, 252,
- 244, 181, 58, 54, 4, 253, 21, 234, 188, 58, 54, 4, 252, 254, 234, 101,
- 58, 54, 4, 252, 251, 234, 37, 58, 54, 4, 252, 240, 233, 238, 58, 54, 4,
- 252, 241, 188, 58, 54, 4, 253, 51, 231, 156, 58, 54, 4, 252, 248, 231,
- 42, 58, 54, 4, 253, 49, 230, 231, 58, 54, 4, 253, 41, 230, 172, 58, 54,
- 4, 253, 62, 205, 58, 54, 4, 253, 40, 229, 187, 58, 54, 4, 253, 34, 229,
- 64, 58, 54, 4, 253, 13, 228, 185, 58, 54, 4, 253, 10, 228, 92, 58, 54, 4,
- 253, 69, 193, 58, 54, 4, 252, 249, 226, 96, 58, 54, 4, 253, 26, 225, 240,
- 58, 54, 4, 253, 53, 225, 150, 58, 54, 4, 253, 15, 225, 35, 58, 54, 4,
- 253, 48, 224, 232, 58, 54, 4, 252, 243, 224, 213, 58, 54, 4, 253, 43,
- 224, 198, 58, 54, 4, 253, 32, 224, 187, 58, 54, 4, 253, 5, 203, 58, 54,
- 4, 253, 37, 224, 21, 58, 54, 4, 253, 12, 223, 188, 58, 54, 4, 253, 71,
- 223, 112, 58, 54, 4, 253, 38, 223, 51, 58, 54, 4, 253, 33, 222, 202, 58,
- 54, 4, 253, 56, 222, 100, 58, 54, 4, 253, 24, 220, 117, 58, 54, 4, 253,
- 52, 219, 242, 58, 54, 4, 253, 7, 219, 27, 58, 54, 4, 253, 6, 218, 52, 58,
- 54, 4, 253, 67, 217, 229, 58, 54, 4, 253, 28, 217, 71, 58, 54, 4, 253,
- 65, 108, 58, 54, 4, 252, 252, 216, 82, 58, 54, 4, 253, 11, 214, 49, 58,
- 54, 4, 252, 246, 214, 6, 58, 54, 4, 253, 25, 213, 235, 58, 54, 4, 253,
- 23, 213, 214, 58, 54, 4, 253, 47, 212, 109, 58, 54, 4, 252, 247, 212, 87,
- 58, 54, 4, 253, 44, 212, 16, 58, 54, 4, 253, 39, 254, 234, 58, 54, 4,
- 253, 22, 254, 233, 58, 54, 4, 252, 237, 253, 108, 58, 54, 4, 252, 250,
- 246, 1, 58, 54, 4, 252, 233, 246, 0, 58, 54, 4, 253, 17, 228, 31, 58, 54,
- 4, 253, 35, 225, 34, 58, 54, 4, 253, 3, 225, 37, 58, 54, 4, 252, 245,
- 224, 76, 58, 54, 4, 253, 31, 224, 75, 58, 54, 4, 252, 253, 223, 111, 58,
- 54, 4, 252, 255, 218, 50, 58, 54, 4, 252, 235, 216, 43, 58, 54, 4, 252,
- 232, 109, 58, 54, 16, 253, 46, 58, 54, 16, 253, 45, 58, 54, 16, 253, 42,
- 58, 54, 16, 253, 30, 58, 54, 16, 253, 18, 58, 54, 16, 253, 16, 58, 54,
- 16, 253, 9, 58, 54, 16, 253, 2, 58, 54, 16, 253, 1, 58, 54, 16, 252, 242,
- 58, 54, 16, 252, 239, 58, 54, 16, 252, 238, 58, 54, 16, 252, 236, 58, 54,
- 16, 252, 234, 58, 54, 102, 252, 231, 231, 248, 58, 54, 102, 252, 230,
- 213, 208, 58, 54, 102, 252, 229, 248, 25, 58, 54, 102, 252, 228, 245, 58,
- 58, 54, 102, 252, 227, 231, 222, 58, 54, 102, 252, 226, 219, 101, 58, 54,
- 102, 252, 225, 245, 4, 58, 54, 102, 252, 224, 224, 45, 58, 54, 102, 252,
- 223, 220, 242, 58, 54, 102, 252, 222, 241, 221, 58, 54, 102, 252, 221,
- 219, 212, 58, 54, 102, 252, 220, 251, 126, 58, 54, 102, 252, 219, 249,
- 84, 58, 54, 102, 252, 218, 251, 44, 58, 54, 102, 252, 217, 213, 243, 58,
- 54, 102, 252, 216, 252, 56, 58, 54, 102, 252, 215, 227, 71, 58, 54, 102,
- 252, 214, 219, 186, 58, 54, 102, 252, 213, 249, 11, 58, 54, 230, 212,
- 252, 212, 234, 229, 58, 54, 230, 212, 252, 211, 234, 237, 58, 54, 102,
- 252, 210, 227, 84, 58, 54, 102, 252, 209, 213, 221, 58, 54, 102, 252,
- 208, 58, 54, 230, 212, 252, 207, 253, 188, 58, 54, 230, 212, 252, 206,
- 231, 116, 58, 54, 102, 252, 205, 251, 62, 58, 54, 102, 252, 204, 242,
- 142, 58, 54, 102, 252, 203, 58, 54, 102, 252, 202, 213, 199, 58, 54, 102,
- 252, 201, 58, 54, 102, 252, 200, 58, 54, 102, 252, 199, 240, 235, 58, 54,
- 102, 252, 198, 58, 54, 102, 252, 197, 58, 54, 102, 252, 196, 58, 54, 230,
- 212, 252, 194, 216, 56, 58, 54, 102, 252, 193, 58, 54, 102, 252, 192, 58,
- 54, 102, 252, 191, 249, 187, 58, 54, 102, 252, 190, 58, 54, 102, 252,
- 189, 58, 54, 102, 252, 188, 243, 69, 58, 54, 102, 252, 187, 253, 175, 58,
- 54, 102, 252, 186, 58, 54, 102, 252, 185, 58, 54, 102, 252, 184, 58, 54,
- 102, 252, 183, 58, 54, 102, 252, 182, 58, 54, 102, 252, 181, 58, 54, 102,
- 252, 180, 58, 54, 102, 252, 179, 58, 54, 102, 252, 178, 58, 54, 102, 252,
- 177, 230, 204, 58, 54, 102, 252, 176, 58, 54, 102, 252, 175, 216, 193,
- 58, 54, 102, 252, 174, 58, 54, 102, 252, 173, 58, 54, 102, 252, 172, 58,
- 54, 102, 252, 171, 58, 54, 102, 252, 170, 58, 54, 102, 252, 169, 58, 54,
- 102, 252, 168, 58, 54, 102, 252, 167, 58, 54, 102, 252, 166, 58, 54, 102,
- 252, 165, 58, 54, 102, 252, 164, 58, 54, 102, 252, 163, 241, 195, 58, 54,
- 102, 252, 142, 243, 253, 58, 54, 102, 252, 139, 252, 36, 58, 54, 102,
- 252, 134, 219, 193, 58, 54, 102, 252, 133, 68, 58, 54, 102, 252, 132, 58,
- 54, 102, 252, 131, 218, 181, 58, 54, 102, 252, 130, 58, 54, 102, 252,
- 129, 58, 54, 102, 252, 128, 213, 239, 250, 75, 58, 54, 102, 252, 127,
- 250, 75, 58, 54, 102, 252, 126, 250, 76, 243, 225, 58, 54, 102, 252, 125,
- 213, 241, 58, 54, 102, 252, 124, 58, 54, 102, 252, 123, 58, 54, 230, 212,
- 252, 122, 247, 150, 58, 54, 102, 252, 121, 58, 54, 102, 252, 120, 58, 54,
- 102, 252, 118, 58, 54, 102, 252, 117, 58, 54, 102, 252, 116, 58, 54, 102,
- 252, 115, 248, 104, 58, 54, 102, 252, 114, 58, 54, 102, 252, 113, 58, 54,
- 102, 252, 112, 58, 54, 102, 252, 111, 58, 54, 102, 252, 110, 58, 54, 102,
- 214, 163, 252, 195, 58, 54, 102, 214, 163, 252, 162, 58, 54, 102, 214,
- 163, 252, 161, 58, 54, 102, 214, 163, 252, 160, 58, 54, 102, 214, 163,
- 252, 159, 58, 54, 102, 214, 163, 252, 158, 58, 54, 102, 214, 163, 252,
- 157, 58, 54, 102, 214, 163, 252, 156, 58, 54, 102, 214, 163, 252, 155,
- 58, 54, 102, 214, 163, 252, 154, 58, 54, 102, 214, 163, 252, 153, 58, 54,
- 102, 214, 163, 252, 152, 58, 54, 102, 214, 163, 252, 151, 58, 54, 102,
- 214, 163, 252, 150, 58, 54, 102, 214, 163, 252, 149, 58, 54, 102, 214,
- 163, 252, 148, 58, 54, 102, 214, 163, 252, 147, 58, 54, 102, 214, 163,
- 252, 146, 58, 54, 102, 214, 163, 252, 145, 58, 54, 102, 214, 163, 252,
- 144, 58, 54, 102, 214, 163, 252, 143, 58, 54, 102, 214, 163, 252, 141,
- 58, 54, 102, 214, 163, 252, 140, 58, 54, 102, 214, 163, 252, 138, 58, 54,
- 102, 214, 163, 252, 137, 58, 54, 102, 214, 163, 252, 136, 58, 54, 102,
- 214, 163, 252, 135, 58, 54, 102, 214, 163, 252, 119, 58, 54, 102, 214,
- 163, 252, 109, 254, 141, 213, 196, 221, 58, 232, 242, 254, 141, 213, 196,
- 221, 58, 247, 74, 254, 141, 250, 66, 77, 254, 141, 50, 116, 254, 141, 50,
- 109, 254, 141, 50, 166, 254, 141, 50, 163, 254, 141, 50, 180, 254, 141,
- 50, 189, 254, 141, 50, 198, 254, 141, 50, 195, 254, 141, 50, 200, 254,
- 141, 50, 217, 200, 254, 141, 50, 216, 38, 254, 141, 50, 217, 115, 254,
- 141, 50, 243, 240, 254, 141, 50, 244, 83, 254, 141, 50, 220, 39, 254,
- 141, 50, 221, 37, 254, 141, 50, 245, 141, 254, 141, 50, 229, 26, 254,
- 141, 50, 122, 240, 200, 254, 141, 50, 117, 240, 200, 254, 141, 50, 133,
- 240, 200, 254, 141, 50, 243, 237, 240, 200, 254, 141, 50, 244, 50, 240,
- 200, 254, 141, 50, 220, 53, 240, 200, 254, 141, 50, 221, 43, 240, 200,
- 254, 141, 50, 245, 150, 240, 200, 254, 141, 50, 229, 31, 240, 200, 254,
- 141, 50, 122, 217, 100, 254, 141, 50, 117, 217, 100, 254, 141, 50, 133,
- 217, 100, 254, 141, 50, 243, 237, 217, 100, 254, 141, 50, 244, 50, 217,
- 100, 254, 141, 50, 220, 53, 217, 100, 254, 141, 50, 221, 43, 217, 100,
- 254, 141, 50, 245, 150, 217, 100, 254, 141, 50, 229, 31, 217, 100, 254,
- 141, 50, 217, 201, 217, 100, 254, 141, 50, 216, 39, 217, 100, 254, 141,
- 50, 217, 116, 217, 100, 254, 141, 50, 243, 241, 217, 100, 254, 141, 50,
- 244, 84, 217, 100, 254, 141, 50, 220, 40, 217, 100, 254, 141, 50, 221,
- 38, 217, 100, 254, 141, 50, 245, 142, 217, 100, 254, 141, 50, 229, 27,
- 217, 100, 254, 141, 213, 255, 252, 48, 215, 144, 254, 141, 213, 255, 244,
- 61, 219, 4, 254, 141, 213, 255, 222, 95, 219, 4, 254, 141, 213, 255, 217,
- 122, 219, 4, 254, 141, 213, 255, 243, 230, 219, 4, 254, 141, 246, 36,
- 231, 155, 244, 61, 219, 4, 254, 141, 232, 228, 231, 155, 244, 61, 219, 4,
- 254, 141, 231, 155, 222, 95, 219, 4, 254, 141, 231, 155, 217, 122, 219,
- 4, 25, 254, 167, 253, 110, 122, 224, 166, 25, 254, 167, 253, 110, 122,
- 242, 9, 25, 254, 167, 253, 110, 122, 246, 54, 25, 254, 167, 253, 110,
- 180, 25, 254, 167, 253, 110, 244, 83, 25, 254, 167, 253, 110, 244, 50,
- 240, 200, 25, 254, 167, 253, 110, 244, 50, 217, 100, 25, 254, 167, 253,
- 110, 244, 84, 217, 100, 25, 254, 167, 253, 110, 244, 50, 218, 18, 25,
- 254, 167, 253, 110, 217, 201, 218, 18, 25, 254, 167, 253, 110, 244, 84,
- 218, 18, 25, 254, 167, 253, 110, 122, 240, 201, 218, 18, 25, 254, 167,
- 253, 110, 244, 50, 240, 201, 218, 18, 25, 254, 167, 253, 110, 122, 217,
- 101, 218, 18, 25, 254, 167, 253, 110, 244, 50, 217, 101, 218, 18, 25,
- 254, 167, 253, 110, 244, 50, 219, 90, 25, 254, 167, 253, 110, 217, 201,
- 219, 90, 25, 254, 167, 253, 110, 244, 84, 219, 90, 25, 254, 167, 253,
- 110, 122, 240, 201, 219, 90, 25, 254, 167, 253, 110, 244, 50, 240, 201,
- 219, 90, 25, 254, 167, 253, 110, 122, 217, 101, 219, 90, 25, 254, 167,
- 253, 110, 217, 201, 217, 101, 219, 90, 25, 254, 167, 253, 110, 244, 84,
- 217, 101, 219, 90, 25, 254, 167, 253, 110, 217, 201, 230, 234, 25, 254,
- 167, 241, 189, 122, 225, 164, 25, 254, 167, 217, 134, 116, 25, 254, 167,
- 241, 186, 116, 25, 254, 167, 245, 67, 109, 25, 254, 167, 217, 134, 109,
- 25, 254, 167, 249, 8, 117, 246, 53, 25, 254, 167, 245, 67, 117, 246, 53,
- 25, 254, 167, 216, 161, 180, 25, 254, 167, 216, 161, 217, 200, 25, 254,
- 167, 216, 161, 217, 201, 254, 50, 17, 25, 254, 167, 241, 186, 217, 200,
- 25, 254, 167, 231, 108, 217, 200, 25, 254, 167, 217, 134, 217, 200, 25,
- 254, 167, 217, 134, 217, 115, 25, 254, 167, 216, 161, 244, 83, 25, 254,
- 167, 216, 161, 244, 84, 254, 50, 17, 25, 254, 167, 241, 186, 244, 83, 25,
- 254, 167, 217, 134, 244, 83, 25, 254, 167, 217, 134, 122, 240, 200, 25,
- 254, 167, 217, 134, 133, 240, 200, 25, 254, 167, 245, 67, 244, 50, 240,
- 200, 25, 254, 167, 216, 161, 244, 50, 240, 200, 25, 254, 167, 217, 134,
- 244, 50, 240, 200, 25, 254, 167, 250, 159, 244, 50, 240, 200, 25, 254,
- 167, 230, 4, 244, 50, 240, 200, 25, 254, 167, 217, 134, 122, 217, 100,
- 25, 254, 167, 217, 134, 244, 50, 217, 100, 25, 254, 167, 248, 8, 244, 50,
- 230, 234, 25, 254, 167, 219, 58, 244, 84, 230, 234, 25, 122, 151, 52, 25,
- 122, 151, 5, 254, 50, 17, 25, 117, 217, 120, 52, 25, 133, 224, 165, 52,
- 25, 213, 36, 52, 25, 218, 19, 52, 25, 246, 55, 52, 25, 227, 110, 52, 25,
- 117, 227, 109, 52, 25, 133, 227, 109, 52, 25, 243, 237, 227, 109, 52, 25,
- 244, 50, 227, 109, 52, 25, 231, 102, 52, 25, 233, 179, 252, 48, 52, 25,
- 232, 223, 52, 25, 226, 255, 52, 25, 213, 147, 52, 25, 253, 158, 52, 25,
- 253, 171, 52, 25, 242, 120, 52, 25, 216, 144, 252, 48, 52, 25, 212, 80,
- 52, 223, 100, 221, 34, 52, 223, 100, 215, 155, 52, 223, 100, 221, 62, 52,
- 223, 100, 221, 32, 52, 223, 100, 247, 165, 221, 32, 52, 223, 100, 220,
- 94, 52, 223, 100, 248, 4, 52, 223, 100, 224, 151, 52, 223, 100, 221, 50,
- 52, 223, 100, 246, 15, 52, 223, 100, 253, 153, 52, 223, 100, 250, 105,
- 52, 226, 19, 247, 143, 5, 226, 88, 226, 19, 247, 143, 5, 225, 158, 241,
- 219, 226, 19, 247, 143, 5, 217, 252, 241, 219, 226, 19, 247, 143, 5, 250,
- 179, 226, 19, 247, 143, 5, 250, 38, 226, 19, 247, 143, 5, 213, 208, 226,
- 19, 247, 143, 5, 241, 195, 226, 19, 247, 143, 5, 243, 61, 226, 19, 247,
- 143, 5, 217, 70, 226, 19, 247, 143, 5, 68, 226, 19, 247, 143, 5, 251, 95,
- 226, 19, 247, 143, 5, 220, 209, 226, 19, 247, 143, 5, 249, 181, 226, 19,
- 247, 143, 5, 231, 247, 226, 19, 247, 143, 5, 231, 199, 226, 19, 247, 143,
- 5, 222, 134, 226, 19, 247, 143, 5, 233, 9, 226, 19, 247, 143, 5, 251,
- 113, 226, 19, 247, 143, 5, 250, 163, 225, 167, 226, 19, 247, 143, 5, 247,
- 87, 226, 19, 247, 143, 5, 249, 161, 226, 19, 247, 143, 5, 220, 15, 226,
- 19, 247, 143, 5, 249, 162, 226, 19, 247, 143, 5, 251, 239, 226, 19, 247,
- 143, 5, 220, 196, 226, 19, 247, 143, 5, 240, 235, 226, 19, 247, 143, 5,
- 241, 163, 226, 19, 247, 143, 5, 251, 41, 233, 60, 226, 19, 247, 143, 5,
- 250, 156, 226, 19, 247, 143, 5, 224, 45, 226, 19, 247, 143, 5, 245, 186,
- 226, 19, 247, 143, 5, 246, 61, 226, 19, 247, 143, 5, 216, 69, 226, 19,
- 247, 143, 5, 251, 242, 226, 19, 247, 143, 5, 225, 168, 216, 193, 226, 19,
- 247, 143, 5, 214, 140, 226, 19, 247, 143, 5, 226, 146, 226, 19, 247, 143,
- 5, 223, 92, 226, 19, 247, 143, 5, 232, 252, 226, 19, 247, 143, 5, 226,
- 239, 252, 101, 226, 19, 247, 143, 5, 244, 17, 226, 19, 247, 143, 5, 242,
- 115, 226, 19, 247, 143, 5, 219, 59, 226, 19, 247, 143, 5, 3, 253, 84,
- 226, 19, 247, 143, 5, 214, 16, 252, 67, 226, 19, 247, 143, 5, 37, 227,
- 112, 90, 232, 120, 1, 61, 232, 120, 1, 74, 232, 120, 1, 253, 74, 232,
- 120, 1, 251, 196, 232, 120, 1, 243, 177, 232, 120, 1, 249, 3, 232, 120,
- 1, 72, 232, 120, 1, 214, 82, 232, 120, 1, 212, 152, 232, 120, 1, 217,
- 163, 232, 120, 1, 235, 142, 232, 120, 1, 235, 27, 232, 120, 1, 224, 240,
- 232, 120, 1, 150, 232, 120, 1, 183, 232, 120, 1, 204, 232, 120, 1, 230,
- 235, 232, 120, 1, 228, 199, 232, 120, 1, 69, 232, 120, 1, 226, 229, 232,
- 120, 1, 234, 56, 232, 120, 1, 149, 232, 120, 1, 197, 232, 120, 1, 218,
- 99, 232, 120, 1, 216, 118, 232, 120, 1, 254, 32, 232, 120, 1, 245, 108,
- 232, 120, 1, 242, 41, 232, 120, 1, 213, 166, 250, 169, 1, 61, 250, 169,
- 1, 226, 215, 250, 169, 1, 249, 3, 250, 169, 1, 150, 250, 169, 1, 215, 90,
- 250, 169, 1, 149, 250, 169, 1, 233, 86, 250, 169, 1, 254, 234, 250, 169,
- 1, 224, 240, 250, 169, 1, 253, 74, 250, 169, 1, 183, 250, 169, 1, 75,
- 250, 169, 1, 248, 166, 250, 169, 1, 218, 99, 250, 169, 1, 221, 26, 250,
- 169, 1, 221, 25, 250, 169, 1, 197, 250, 169, 1, 250, 251, 250, 169, 1,
- 69, 250, 169, 1, 228, 199, 250, 169, 1, 213, 166, 250, 169, 1, 204, 250,
- 169, 1, 216, 117, 250, 169, 1, 226, 229, 250, 169, 1, 219, 158, 250, 169,
- 1, 72, 250, 169, 1, 74, 250, 169, 1, 215, 87, 250, 169, 1, 235, 27, 250,
- 169, 1, 235, 18, 250, 169, 1, 229, 230, 250, 169, 1, 215, 92, 250, 169,
- 1, 243, 177, 250, 169, 1, 243, 112, 250, 169, 1, 219, 107, 250, 169, 1,
- 219, 106, 250, 169, 1, 229, 161, 250, 169, 1, 236, 28, 250, 169, 1, 250,
- 250, 250, 169, 1, 216, 118, 250, 169, 1, 215, 89, 250, 169, 1, 223, 82,
- 250, 169, 1, 231, 192, 250, 169, 1, 231, 191, 250, 169, 1, 231, 190, 250,
- 169, 1, 231, 189, 250, 169, 1, 233, 85, 250, 169, 1, 245, 190, 250, 169,
- 1, 215, 88, 53, 32, 1, 61, 53, 32, 1, 251, 251, 53, 32, 1, 234, 188, 53,
- 32, 1, 248, 41, 53, 32, 1, 74, 53, 32, 1, 214, 232, 53, 32, 1, 212, 87,
- 53, 32, 1, 241, 222, 53, 32, 1, 217, 148, 53, 32, 1, 72, 53, 32, 1, 181,
- 53, 32, 1, 245, 131, 53, 32, 1, 245, 117, 53, 32, 1, 245, 108, 53, 32, 1,
- 245, 40, 53, 32, 1, 75, 53, 32, 1, 226, 96, 53, 32, 1, 220, 243, 53, 32,
- 1, 233, 238, 53, 32, 1, 245, 55, 53, 32, 1, 245, 45, 53, 32, 1, 217, 229,
- 53, 32, 1, 69, 53, 32, 1, 245, 134, 53, 32, 1, 226, 12, 53, 32, 1, 234,
- 125, 53, 32, 1, 245, 159, 53, 32, 1, 245, 47, 53, 32, 1, 250, 67, 53, 32,
- 1, 236, 28, 53, 32, 1, 215, 92, 53, 32, 228, 54, 116, 53, 32, 228, 54,
- 180, 53, 32, 228, 54, 217, 200, 53, 32, 228, 54, 244, 83, 242, 129, 1,
- 254, 111, 242, 129, 1, 252, 82, 242, 129, 1, 242, 187, 242, 129, 1, 248,
- 148, 242, 129, 1, 254, 107, 242, 129, 1, 224, 223, 242, 129, 1, 235, 153,
- 242, 129, 1, 242, 20, 242, 129, 1, 217, 111, 242, 129, 1, 245, 140, 242,
- 129, 1, 233, 211, 242, 129, 1, 233, 136, 242, 129, 1, 231, 242, 242, 129,
- 1, 230, 6, 242, 129, 1, 235, 120, 242, 129, 1, 215, 107, 242, 129, 1,
- 226, 196, 242, 129, 1, 229, 26, 242, 129, 1, 224, 56, 242, 129, 1, 222,
- 136, 242, 129, 1, 217, 212, 242, 129, 1, 213, 219, 242, 129, 1, 244, 146,
- 242, 129, 1, 236, 32, 242, 129, 1, 240, 191, 242, 129, 1, 227, 7, 242,
- 129, 1, 229, 31, 240, 200, 215, 179, 1, 254, 56, 215, 179, 1, 251, 203,
- 215, 179, 1, 243, 84, 215, 179, 1, 234, 138, 215, 179, 1, 248, 5, 215,
- 179, 1, 241, 54, 215, 179, 1, 213, 214, 215, 179, 1, 212, 78, 215, 179,
- 1, 240, 228, 215, 179, 1, 217, 183, 215, 179, 1, 212, 224, 215, 179, 1,
- 234, 254, 215, 179, 1, 220, 200, 215, 179, 1, 233, 122, 215, 179, 1, 231,
- 129, 215, 179, 1, 247, 229, 215, 179, 1, 228, 50, 215, 179, 1, 212, 8,
- 215, 179, 1, 222, 163, 215, 179, 1, 254, 103, 215, 179, 1, 225, 35, 215,
- 179, 1, 222, 194, 215, 179, 1, 224, 180, 215, 179, 1, 224, 36, 215, 179,
- 1, 217, 152, 215, 179, 1, 242, 220, 215, 179, 1, 108, 215, 179, 1, 72,
- 215, 179, 1, 69, 215, 179, 1, 219, 117, 215, 179, 213, 196, 247, 124, 53,
- 226, 45, 5, 61, 53, 226, 45, 5, 72, 53, 226, 45, 5, 69, 53, 226, 45, 5,
- 181, 53, 226, 45, 5, 233, 238, 53, 226, 45, 5, 243, 110, 53, 226, 45, 5,
- 242, 92, 53, 226, 45, 5, 213, 153, 53, 226, 45, 5, 250, 219, 53, 226, 45,
- 5, 235, 139, 53, 226, 45, 5, 235, 110, 53, 226, 45, 5, 218, 52, 53, 226,
- 45, 5, 216, 82, 53, 226, 45, 5, 248, 164, 53, 226, 45, 5, 247, 211, 53,
- 226, 45, 5, 246, 33, 53, 226, 45, 5, 217, 161, 53, 226, 45, 5, 193, 53,
- 226, 45, 5, 252, 107, 53, 226, 45, 5, 244, 164, 53, 226, 45, 5, 205, 53,
- 226, 45, 5, 228, 92, 53, 226, 45, 5, 188, 53, 226, 45, 5, 231, 42, 53,
- 226, 45, 5, 230, 172, 53, 226, 45, 5, 186, 53, 226, 45, 5, 215, 1, 53,
- 226, 45, 5, 214, 154, 53, 226, 45, 5, 203, 53, 226, 45, 5, 223, 51, 53,
- 226, 45, 5, 233, 157, 53, 226, 45, 5, 222, 202, 53, 226, 45, 5, 212, 109,
- 53, 226, 45, 5, 221, 24, 53, 226, 45, 5, 219, 157, 53, 226, 45, 5, 159,
- 53, 226, 45, 5, 253, 102, 53, 226, 45, 5, 253, 101, 53, 226, 45, 5, 253,
- 100, 53, 226, 45, 5, 213, 130, 53, 226, 45, 5, 248, 145, 53, 226, 45, 5,
- 248, 144, 53, 226, 45, 5, 252, 88, 53, 226, 45, 5, 251, 14, 53, 226, 45,
- 213, 196, 247, 124, 53, 226, 45, 50, 116, 53, 226, 45, 50, 109, 53, 226,
- 45, 50, 217, 200, 53, 226, 45, 50, 216, 38, 53, 226, 45, 50, 240, 200,
- 171, 6, 1, 184, 72, 171, 6, 1, 184, 74, 171, 6, 1, 184, 61, 171, 6, 1,
- 184, 254, 114, 171, 6, 1, 184, 75, 171, 6, 1, 184, 227, 49, 171, 6, 1,
- 220, 175, 72, 171, 6, 1, 220, 175, 74, 171, 6, 1, 220, 175, 61, 171, 6,
- 1, 220, 175, 254, 114, 171, 6, 1, 220, 175, 75, 171, 6, 1, 220, 175, 227,
- 49, 171, 6, 1, 253, 83, 171, 6, 1, 226, 240, 171, 6, 1, 213, 183, 171, 6,
- 1, 213, 35, 171, 6, 1, 242, 41, 171, 6, 1, 226, 86, 171, 6, 1, 251, 242,
- 171, 6, 1, 217, 219, 171, 6, 1, 248, 28, 171, 6, 1, 250, 64, 171, 6, 1,
- 235, 125, 171, 6, 1, 234, 195, 171, 6, 1, 243, 59, 171, 6, 1, 245, 159,
- 171, 6, 1, 214, 227, 171, 6, 1, 245, 25, 171, 6, 1, 217, 147, 171, 6, 1,
- 245, 45, 171, 6, 1, 212, 85, 171, 6, 1, 245, 40, 171, 6, 1, 212, 66, 171,
- 6, 1, 245, 55, 171, 6, 1, 245, 131, 171, 6, 1, 245, 117, 171, 6, 1, 245,
- 108, 171, 6, 1, 245, 96, 171, 6, 1, 227, 85, 171, 6, 1, 245, 5, 171, 3,
- 1, 184, 72, 171, 3, 1, 184, 74, 171, 3, 1, 184, 61, 171, 3, 1, 184, 254,
- 114, 171, 3, 1, 184, 75, 171, 3, 1, 184, 227, 49, 171, 3, 1, 220, 175,
- 72, 171, 3, 1, 220, 175, 74, 171, 3, 1, 220, 175, 61, 171, 3, 1, 220,
- 175, 254, 114, 171, 3, 1, 220, 175, 75, 171, 3, 1, 220, 175, 227, 49,
- 171, 3, 1, 253, 83, 171, 3, 1, 226, 240, 171, 3, 1, 213, 183, 171, 3, 1,
- 213, 35, 171, 3, 1, 242, 41, 171, 3, 1, 226, 86, 171, 3, 1, 251, 242,
- 171, 3, 1, 217, 219, 171, 3, 1, 248, 28, 171, 3, 1, 250, 64, 171, 3, 1,
- 235, 125, 171, 3, 1, 234, 195, 171, 3, 1, 243, 59, 171, 3, 1, 245, 159,
- 171, 3, 1, 214, 227, 171, 3, 1, 245, 25, 171, 3, 1, 217, 147, 171, 3, 1,
- 245, 45, 171, 3, 1, 212, 85, 171, 3, 1, 245, 40, 171, 3, 1, 212, 66, 171,
- 3, 1, 245, 55, 171, 3, 1, 245, 131, 171, 3, 1, 245, 117, 171, 3, 1, 245,
- 108, 171, 3, 1, 245, 96, 171, 3, 1, 227, 85, 171, 3, 1, 245, 5, 220, 249,
- 1, 226, 84, 220, 249, 1, 216, 218, 220, 249, 1, 234, 100, 220, 249, 1,
- 244, 116, 220, 249, 1, 217, 125, 220, 249, 1, 219, 242, 220, 249, 1, 218,
- 214, 220, 249, 1, 249, 254, 220, 249, 1, 213, 37, 220, 249, 1, 240, 199,
- 220, 249, 1, 251, 183, 220, 249, 1, 248, 40, 220, 249, 1, 243, 96, 220,
- 249, 1, 214, 104, 220, 249, 1, 217, 129, 220, 249, 1, 212, 14, 220, 249,
- 1, 231, 154, 220, 249, 1, 235, 52, 220, 249, 1, 213, 212, 220, 249, 1,
- 242, 29, 220, 249, 1, 232, 195, 220, 249, 1, 231, 2, 220, 249, 1, 236,
- 35, 220, 249, 1, 245, 158, 220, 249, 1, 253, 146, 220, 249, 1, 254, 152,
- 220, 249, 1, 227, 62, 220, 249, 1, 213, 199, 220, 249, 1, 226, 254, 220,
- 249, 1, 254, 114, 220, 249, 1, 223, 109, 220, 249, 1, 228, 50, 220, 249,
- 1, 245, 173, 220, 249, 1, 254, 119, 220, 249, 1, 240, 104, 220, 249, 1,
- 215, 134, 220, 249, 1, 227, 118, 220, 249, 1, 227, 42, 220, 249, 1, 227,
- 84, 220, 249, 1, 253, 86, 220, 249, 1, 253, 189, 220, 249, 1, 227, 24,
- 220, 249, 1, 254, 100, 220, 249, 1, 245, 49, 220, 249, 1, 253, 168, 220,
- 249, 1, 245, 183, 220, 249, 1, 240, 110, 220, 249, 1, 213, 4, 227, 9, 1,
- 254, 78, 227, 9, 1, 252, 107, 227, 9, 1, 218, 52, 227, 9, 1, 235, 139,
- 227, 9, 1, 213, 153, 227, 9, 1, 234, 138, 227, 9, 1, 248, 27, 227, 9, 1,
- 203, 227, 9, 1, 222, 202, 227, 9, 1, 220, 206, 227, 9, 1, 247, 232, 227,
- 9, 1, 250, 148, 227, 9, 1, 243, 110, 227, 9, 1, 244, 164, 227, 9, 1, 224,
- 230, 227, 9, 1, 235, 13, 227, 9, 1, 233, 152, 227, 9, 1, 231, 13, 227, 9,
- 1, 228, 35, 227, 9, 1, 214, 14, 227, 9, 1, 159, 227, 9, 1, 186, 227, 9,
- 1, 61, 227, 9, 1, 74, 227, 9, 1, 72, 227, 9, 1, 75, 227, 9, 1, 69, 227,
- 9, 1, 254, 232, 227, 9, 1, 245, 165, 227, 9, 1, 227, 49, 227, 9, 21, 212,
- 79, 227, 9, 21, 116, 227, 9, 21, 109, 227, 9, 21, 166, 227, 9, 21, 163,
- 227, 9, 21, 180, 227, 9, 21, 189, 227, 9, 21, 198, 227, 9, 21, 195, 227,
- 9, 21, 200, 249, 10, 4, 61, 249, 10, 4, 74, 249, 10, 4, 72, 249, 10, 4,
- 75, 249, 10, 4, 69, 249, 10, 4, 235, 139, 249, 10, 4, 235, 71, 249, 10,
- 4, 181, 249, 10, 4, 234, 188, 249, 10, 4, 234, 101, 249, 10, 4, 234, 37,
- 249, 10, 4, 233, 238, 249, 10, 4, 233, 157, 249, 10, 4, 233, 82, 249, 10,
- 4, 233, 13, 249, 10, 4, 232, 208, 249, 10, 4, 232, 156, 249, 10, 4, 188,
- 249, 10, 4, 231, 156, 249, 10, 4, 231, 42, 249, 10, 4, 230, 231, 249, 10,
- 4, 230, 172, 249, 10, 4, 205, 249, 10, 4, 229, 187, 249, 10, 4, 229, 64,
- 249, 10, 4, 228, 185, 249, 10, 4, 228, 92, 249, 10, 4, 193, 249, 10, 4,
- 226, 96, 249, 10, 4, 225, 240, 249, 10, 4, 225, 150, 249, 10, 4, 225, 35,
- 249, 10, 4, 203, 249, 10, 4, 224, 21, 249, 10, 4, 223, 188, 249, 10, 4,
- 223, 112, 249, 10, 4, 223, 51, 249, 10, 4, 222, 202, 249, 10, 4, 222,
- 100, 249, 10, 4, 220, 117, 249, 10, 4, 219, 242, 249, 10, 4, 219, 27,
- 249, 10, 4, 218, 52, 249, 10, 4, 217, 229, 249, 10, 4, 217, 71, 249, 10,
- 4, 108, 249, 10, 4, 216, 82, 249, 10, 4, 214, 49, 249, 10, 4, 214, 6,
- 249, 10, 4, 213, 235, 249, 10, 4, 213, 214, 249, 10, 4, 213, 153, 249,
- 10, 4, 213, 150, 249, 10, 4, 212, 109, 249, 10, 4, 212, 16, 235, 253,
- 253, 197, 1, 254, 76, 235, 253, 253, 197, 1, 251, 202, 235, 253, 253,
- 197, 1, 242, 177, 235, 253, 253, 197, 1, 248, 133, 235, 253, 253, 197, 1,
- 241, 222, 235, 253, 253, 197, 1, 214, 14, 235, 253, 253, 197, 1, 212, 90,
- 235, 253, 253, 197, 1, 241, 180, 235, 253, 253, 197, 1, 217, 179, 235,
- 253, 253, 197, 1, 212, 223, 235, 253, 253, 197, 1, 234, 230, 235, 253,
- 253, 197, 1, 233, 117, 235, 253, 253, 197, 1, 231, 129, 235, 253, 253,
- 197, 1, 228, 50, 235, 253, 253, 197, 1, 222, 164, 235, 253, 253, 197, 1,
- 253, 78, 235, 253, 253, 197, 1, 226, 96, 235, 253, 253, 197, 1, 222, 193,
- 235, 253, 253, 197, 1, 224, 179, 235, 253, 253, 197, 1, 223, 219, 235,
- 253, 253, 197, 1, 220, 200, 235, 253, 253, 197, 1, 217, 243, 235, 253,
- 253, 197, 222, 92, 52, 235, 253, 253, 197, 50, 116, 235, 253, 253, 197,
- 50, 109, 235, 253, 253, 197, 50, 166, 235, 253, 253, 197, 50, 217, 200,
- 235, 253, 253, 197, 50, 216, 38, 235, 253, 253, 197, 50, 122, 240, 200,
- 235, 253, 253, 197, 50, 122, 217, 100, 235, 253, 253, 197, 50, 217, 201,
- 217, 100, 225, 251, 1, 254, 74, 225, 251, 1, 251, 205, 225, 251, 1, 243,
- 85, 225, 251, 1, 248, 7, 225, 251, 1, 241, 222, 225, 251, 1, 214, 21,
- 225, 251, 1, 212, 103, 225, 251, 1, 241, 182, 225, 251, 1, 217, 183, 225,
- 251, 1, 212, 224, 225, 251, 1, 234, 254, 225, 251, 1, 233, 123, 225, 251,
- 1, 231, 129, 225, 251, 1, 228, 50, 225, 251, 1, 221, 64, 225, 251, 1,
- 254, 103, 225, 251, 1, 226, 96, 225, 251, 1, 222, 194, 225, 251, 1, 224,
- 184, 225, 251, 1, 223, 91, 225, 251, 1, 220, 200, 225, 251, 1, 217, 248,
- 225, 251, 50, 116, 225, 251, 50, 217, 200, 225, 251, 50, 216, 38, 225,
- 251, 50, 122, 240, 200, 225, 251, 50, 109, 225, 251, 50, 166, 225, 251,
- 213, 196, 221, 57, 232, 119, 1, 61, 232, 119, 1, 253, 74, 232, 119, 1,
- 243, 177, 232, 119, 1, 249, 3, 232, 119, 1, 74, 232, 119, 1, 215, 79,
- 232, 119, 1, 72, 232, 119, 1, 213, 105, 232, 119, 1, 235, 27, 232, 119,
- 1, 150, 232, 119, 1, 183, 232, 119, 1, 204, 232, 119, 1, 75, 232, 119, 1,
- 149, 232, 119, 1, 219, 158, 232, 119, 1, 218, 99, 232, 119, 1, 69, 232,
- 119, 1, 244, 230, 232, 119, 1, 224, 240, 232, 119, 1, 197, 232, 119, 1,
- 216, 118, 232, 119, 1, 254, 32, 232, 119, 1, 245, 108, 232, 119, 1, 232,
- 121, 232, 119, 1, 228, 199, 232, 119, 1, 250, 252, 232, 119, 216, 180,
- 77, 234, 126, 1, 61, 234, 126, 30, 5, 72, 234, 126, 30, 5, 69, 234, 126,
- 30, 5, 161, 149, 234, 126, 30, 5, 74, 234, 126, 30, 5, 75, 234, 126, 30,
- 233, 47, 77, 234, 126, 5, 51, 223, 131, 55, 234, 126, 5, 253, 242, 234,
- 126, 5, 214, 128, 234, 126, 1, 181, 234, 126, 1, 234, 138, 234, 126, 1,
- 243, 110, 234, 126, 1, 242, 225, 234, 126, 1, 250, 219, 234, 126, 1, 250,
- 92, 234, 126, 1, 235, 139, 234, 126, 1, 228, 23, 234, 126, 1, 216, 115,
- 234, 126, 1, 216, 105, 234, 126, 1, 248, 86, 234, 126, 1, 248, 70, 234,
- 126, 1, 228, 198, 234, 126, 1, 218, 52, 234, 126, 1, 217, 161, 234, 126,
- 1, 248, 164, 234, 126, 1, 247, 232, 234, 126, 1, 205, 234, 126, 1, 193,
- 234, 126, 1, 226, 23, 234, 126, 1, 252, 107, 234, 126, 1, 251, 195, 234,
- 126, 1, 188, 234, 126, 1, 186, 234, 126, 1, 203, 234, 126, 1, 233, 157,
- 234, 126, 1, 215, 1, 234, 126, 1, 221, 24, 234, 126, 1, 219, 157, 234,
- 126, 1, 222, 202, 234, 126, 1, 212, 109, 234, 126, 1, 159, 234, 126, 1,
- 234, 55, 234, 126, 1, 216, 87, 234, 126, 5, 252, 60, 49, 234, 126, 5,
- 250, 154, 234, 126, 5, 62, 55, 234, 126, 214, 133, 234, 126, 21, 116,
- 234, 126, 21, 109, 234, 126, 21, 166, 234, 126, 21, 163, 234, 126, 50,
- 217, 200, 234, 126, 50, 216, 38, 234, 126, 50, 122, 240, 200, 234, 126,
- 50, 122, 217, 100, 234, 126, 225, 27, 247, 74, 234, 126, 225, 27, 3, 249,
- 228, 234, 126, 225, 27, 249, 228, 234, 126, 225, 27, 249, 77, 134, 234,
- 126, 225, 27, 231, 243, 234, 126, 225, 27, 232, 170, 234, 126, 225, 27,
- 248, 123, 234, 126, 225, 27, 51, 248, 123, 234, 126, 225, 27, 232, 236,
- 53, 219, 215, 253, 208, 1, 241, 222, 53, 219, 215, 253, 208, 1, 233, 117,
- 53, 219, 215, 253, 208, 1, 241, 180, 53, 219, 215, 253, 208, 1, 231, 129,
- 53, 219, 215, 253, 208, 1, 224, 179, 53, 219, 215, 253, 208, 1, 214, 14,
- 53, 219, 215, 253, 208, 1, 220, 200, 53, 219, 215, 253, 208, 1, 223, 219,
- 53, 219, 215, 253, 208, 1, 251, 202, 53, 219, 215, 253, 208, 1, 217, 243,
- 53, 219, 215, 253, 208, 1, 222, 142, 53, 219, 215, 253, 208, 1, 234, 230,
- 53, 219, 215, 253, 208, 1, 228, 50, 53, 219, 215, 253, 208, 1, 234, 122,
- 53, 219, 215, 253, 208, 1, 222, 193, 53, 219, 215, 253, 208, 1, 222, 164,
- 53, 219, 215, 253, 208, 1, 244, 123, 53, 219, 215, 253, 208, 1, 254, 78,
- 53, 219, 215, 253, 208, 1, 253, 77, 53, 219, 215, 253, 208, 1, 247, 230,
- 53, 219, 215, 253, 208, 1, 242, 177, 53, 219, 215, 253, 208, 1, 248, 133,
- 53, 219, 215, 253, 208, 1, 242, 214, 53, 219, 215, 253, 208, 1, 217, 179,
- 53, 219, 215, 253, 208, 1, 212, 89, 53, 219, 215, 253, 208, 1, 247, 227,
- 53, 219, 215, 253, 208, 1, 212, 223, 53, 219, 215, 253, 208, 1, 217, 150,
- 53, 219, 215, 253, 208, 1, 217, 131, 53, 219, 215, 253, 208, 50, 116, 53,
- 219, 215, 253, 208, 50, 244, 83, 53, 219, 215, 253, 208, 128, 235, 235,
- 253, 88, 1, 61, 253, 88, 1, 254, 232, 253, 88, 1, 253, 240, 253, 88, 1,
- 254, 191, 253, 88, 1, 254, 32, 253, 88, 1, 254, 192, 253, 88, 1, 254,
- 148, 253, 88, 1, 254, 144, 253, 88, 1, 74, 253, 88, 1, 245, 165, 253, 88,
- 1, 75, 253, 88, 1, 227, 49, 253, 88, 1, 72, 253, 88, 1, 236, 28, 253, 88,
- 1, 69, 253, 88, 1, 215, 92, 253, 88, 1, 234, 188, 253, 88, 1, 213, 150,
- 253, 88, 1, 213, 116, 253, 88, 1, 213, 125, 253, 88, 1, 243, 38, 253, 88,
- 1, 243, 0, 253, 88, 1, 242, 212, 253, 88, 1, 250, 124, 253, 88, 1, 235,
- 127, 253, 88, 1, 217, 229, 253, 88, 1, 217, 148, 253, 88, 1, 248, 41,
- 253, 88, 1, 247, 225, 253, 88, 1, 216, 112, 253, 88, 1, 226, 96, 253, 88,
- 1, 244, 123, 253, 88, 1, 251, 251, 253, 88, 1, 251, 192, 253, 88, 1, 229,
- 148, 253, 88, 1, 229, 70, 253, 88, 1, 229, 71, 253, 88, 1, 229, 187, 253,
- 88, 1, 228, 17, 253, 88, 1, 228, 197, 253, 88, 1, 231, 156, 253, 88, 1,
- 241, 102, 253, 88, 1, 212, 159, 253, 88, 1, 213, 38, 253, 88, 1, 214,
- 232, 253, 88, 1, 224, 21, 253, 88, 1, 233, 82, 253, 88, 1, 222, 100, 253,
- 88, 1, 212, 87, 253, 88, 1, 220, 243, 253, 88, 1, 212, 67, 253, 88, 1,
- 220, 124, 253, 88, 1, 219, 129, 253, 88, 1, 241, 222, 253, 88, 254, 181,
- 77, 217, 32, 117, 176, 110, 122, 62, 225, 26, 3, 117, 176, 110, 122, 62,
- 225, 26, 233, 108, 117, 176, 110, 122, 62, 225, 26, 233, 108, 122, 62,
- 110, 117, 176, 225, 26, 233, 108, 117, 223, 129, 110, 122, 223, 131, 225,
- 26, 233, 108, 122, 223, 131, 110, 117, 223, 129, 225, 26, 235, 215, 226,
- 126, 1, 254, 76, 235, 215, 226, 126, 1, 251, 202, 235, 215, 226, 126, 1,
- 242, 177, 235, 215, 226, 126, 1, 248, 133, 235, 215, 226, 126, 1, 241,
- 222, 235, 215, 226, 126, 1, 214, 14, 235, 215, 226, 126, 1, 212, 90, 235,
- 215, 226, 126, 1, 241, 180, 235, 215, 226, 126, 1, 217, 179, 235, 215,
- 226, 126, 1, 212, 223, 235, 215, 226, 126, 1, 234, 230, 235, 215, 226,
- 126, 1, 233, 117, 235, 215, 226, 126, 1, 231, 129, 235, 215, 226, 126, 1,
- 228, 50, 235, 215, 226, 126, 1, 222, 164, 235, 215, 226, 126, 1, 253, 78,
- 235, 215, 226, 126, 1, 226, 96, 235, 215, 226, 126, 1, 222, 193, 235,
- 215, 226, 126, 1, 224, 179, 235, 215, 226, 126, 1, 223, 219, 235, 215,
- 226, 126, 1, 220, 200, 235, 215, 226, 126, 1, 217, 243, 235, 215, 226,
- 126, 50, 116, 235, 215, 226, 126, 50, 109, 235, 215, 226, 126, 50, 166,
- 235, 215, 226, 126, 50, 163, 235, 215, 226, 126, 50, 217, 200, 235, 215,
- 226, 126, 50, 216, 38, 235, 215, 226, 126, 50, 122, 240, 200, 235, 215,
- 226, 126, 50, 122, 217, 100, 235, 215, 226, 198, 1, 254, 76, 235, 215,
- 226, 198, 1, 251, 202, 235, 215, 226, 198, 1, 242, 177, 235, 215, 226,
- 198, 1, 248, 133, 235, 215, 226, 198, 1, 241, 222, 235, 215, 226, 198, 1,
- 214, 13, 235, 215, 226, 198, 1, 212, 90, 235, 215, 226, 198, 1, 241, 180,
- 235, 215, 226, 198, 1, 217, 179, 235, 215, 226, 198, 1, 212, 223, 235,
- 215, 226, 198, 1, 234, 230, 235, 215, 226, 198, 1, 233, 117, 235, 215,
- 226, 198, 1, 231, 128, 235, 215, 226, 198, 1, 228, 50, 235, 215, 226,
- 198, 1, 222, 164, 235, 215, 226, 198, 1, 226, 96, 235, 215, 226, 198, 1,
- 222, 193, 235, 215, 226, 198, 1, 220, 200, 235, 215, 226, 198, 1, 217,
- 243, 235, 215, 226, 198, 50, 116, 235, 215, 226, 198, 50, 109, 235, 215,
- 226, 198, 50, 166, 235, 215, 226, 198, 50, 163, 235, 215, 226, 198, 50,
- 217, 200, 235, 215, 226, 198, 50, 216, 38, 235, 215, 226, 198, 50, 122,
- 240, 200, 235, 215, 226, 198, 50, 122, 217, 100, 53, 185, 1, 227, 16, 61,
- 53, 185, 1, 213, 28, 61, 53, 185, 1, 213, 28, 254, 148, 53, 185, 1, 227,
- 16, 72, 53, 185, 1, 213, 28, 72, 53, 185, 1, 213, 28, 74, 53, 185, 1,
- 227, 16, 75, 53, 185, 1, 227, 16, 227, 99, 53, 185, 1, 213, 28, 227, 99,
- 53, 185, 1, 227, 16, 254, 185, 53, 185, 1, 213, 28, 254, 185, 53, 185, 1,
- 227, 16, 254, 147, 53, 185, 1, 213, 28, 254, 147, 53, 185, 1, 227, 16,
- 254, 121, 53, 185, 1, 213, 28, 254, 121, 53, 185, 1, 227, 16, 254, 142,
- 53, 185, 1, 213, 28, 254, 142, 53, 185, 1, 227, 16, 254, 160, 53, 185, 1,
- 213, 28, 254, 160, 53, 185, 1, 227, 16, 254, 146, 53, 185, 1, 227, 16,
- 244, 236, 53, 185, 1, 213, 28, 244, 236, 53, 185, 1, 227, 16, 253, 83,
- 53, 185, 1, 213, 28, 253, 83, 53, 185, 1, 227, 16, 254, 129, 53, 185, 1,
- 213, 28, 254, 129, 53, 185, 1, 227, 16, 254, 140, 53, 185, 1, 213, 28,
- 254, 140, 53, 185, 1, 227, 16, 227, 98, 53, 185, 1, 213, 28, 227, 98, 53,
- 185, 1, 227, 16, 254, 86, 53, 185, 1, 213, 28, 254, 86, 53, 185, 1, 227,
- 16, 254, 139, 53, 185, 1, 227, 16, 245, 119, 53, 185, 1, 227, 16, 245,
- 117, 53, 185, 1, 227, 16, 254, 32, 53, 185, 1, 227, 16, 254, 137, 53,
- 185, 1, 213, 28, 254, 137, 53, 185, 1, 227, 16, 245, 90, 53, 185, 1, 213,
- 28, 245, 90, 53, 185, 1, 227, 16, 245, 105, 53, 185, 1, 213, 28, 245,
- 105, 53, 185, 1, 227, 16, 245, 77, 53, 185, 1, 213, 28, 245, 77, 53, 185,
- 1, 213, 28, 254, 24, 53, 185, 1, 227, 16, 245, 96, 53, 185, 1, 213, 28,
- 254, 136, 53, 185, 1, 227, 16, 245, 70, 53, 185, 1, 227, 16, 227, 41, 53,
- 185, 1, 227, 16, 240, 106, 53, 185, 1, 227, 16, 245, 171, 53, 185, 1,
- 213, 28, 245, 171, 53, 185, 1, 227, 16, 253, 215, 53, 185, 1, 213, 28,
- 253, 215, 53, 185, 1, 227, 16, 235, 179, 53, 185, 1, 213, 28, 235, 179,
- 53, 185, 1, 227, 16, 227, 25, 53, 185, 1, 213, 28, 227, 25, 53, 185, 1,
- 227, 16, 253, 211, 53, 185, 1, 213, 28, 253, 211, 53, 185, 1, 227, 16,
- 254, 135, 53, 185, 1, 227, 16, 253, 152, 53, 185, 1, 227, 16, 254, 133,
- 53, 185, 1, 227, 16, 253, 146, 53, 185, 1, 213, 28, 253, 146, 53, 185, 1,
- 227, 16, 245, 40, 53, 185, 1, 213, 28, 245, 40, 53, 185, 1, 227, 16, 253,
- 122, 53, 185, 1, 213, 28, 253, 122, 53, 185, 1, 227, 16, 254, 130, 53,
- 185, 1, 213, 28, 254, 130, 53, 185, 1, 227, 16, 227, 8, 53, 185, 1, 227,
- 16, 252, 45, 223, 38, 21, 116, 223, 38, 21, 109, 223, 38, 21, 166, 223,
- 38, 21, 163, 223, 38, 21, 180, 223, 38, 21, 189, 223, 38, 21, 198, 223,
- 38, 21, 195, 223, 38, 21, 200, 223, 38, 50, 217, 200, 223, 38, 50, 216,
- 38, 223, 38, 50, 217, 115, 223, 38, 50, 243, 240, 223, 38, 50, 244, 83,
- 223, 38, 50, 220, 39, 223, 38, 50, 221, 37, 223, 38, 50, 245, 141, 223,
- 38, 50, 229, 26, 223, 38, 50, 122, 240, 200, 223, 38, 50, 117, 240, 200,
- 223, 38, 50, 133, 240, 200, 223, 38, 50, 243, 237, 240, 200, 223, 38, 50,
- 244, 50, 240, 200, 223, 38, 50, 220, 53, 240, 200, 223, 38, 50, 221, 43,
- 240, 200, 223, 38, 50, 245, 150, 240, 200, 223, 38, 50, 229, 31, 240,
- 200, 223, 38, 243, 228, 122, 242, 9, 223, 38, 243, 228, 122, 224, 166,
- 223, 38, 243, 228, 122, 217, 121, 223, 38, 243, 228, 117, 217, 119, 112,
- 5, 250, 187, 112, 5, 253, 242, 112, 5, 214, 128, 112, 5, 235, 104, 112,
- 5, 215, 132, 112, 1, 61, 112, 1, 254, 232, 112, 1, 72, 112, 1, 236, 28,
- 112, 1, 69, 112, 1, 215, 92, 112, 1, 161, 149, 112, 1, 161, 223, 82, 112,
- 1, 161, 150, 112, 1, 161, 232, 214, 112, 1, 74, 112, 1, 254, 108, 112, 1,
- 75, 112, 1, 253, 108, 112, 1, 181, 112, 1, 234, 138, 112, 1, 243, 110,
- 112, 1, 242, 225, 112, 1, 229, 159, 112, 1, 250, 219, 112, 1, 250, 92,
- 112, 1, 235, 139, 112, 1, 235, 115, 112, 1, 228, 23, 112, 1, 216, 115,
- 112, 1, 216, 105, 112, 1, 248, 86, 112, 1, 248, 70, 112, 1, 228, 198,
- 112, 1, 218, 52, 112, 1, 217, 161, 112, 1, 248, 164, 112, 1, 247, 232,
- 112, 1, 205, 112, 1, 193, 112, 1, 226, 23, 112, 1, 252, 107, 112, 1, 251,
- 195, 112, 1, 188, 112, 1, 186, 112, 1, 203, 112, 1, 233, 157, 112, 1,
- 215, 1, 112, 1, 221, 24, 112, 1, 219, 157, 112, 1, 222, 202, 112, 1, 159,
- 112, 1, 232, 213, 112, 1, 53, 178, 232, 212, 112, 1, 53, 178, 223, 81,
- 112, 1, 53, 178, 228, 189, 112, 30, 5, 254, 232, 112, 30, 5, 251, 193,
- 254, 232, 112, 30, 5, 72, 112, 30, 5, 236, 28, 112, 30, 5, 69, 112, 30,
- 5, 215, 92, 112, 30, 5, 161, 149, 112, 30, 5, 161, 223, 82, 112, 30, 5,
- 161, 150, 112, 30, 5, 161, 232, 214, 112, 30, 5, 74, 112, 30, 5, 254,
- 108, 112, 30, 5, 75, 112, 30, 5, 253, 108, 112, 214, 133, 112, 248, 123,
- 112, 51, 248, 123, 112, 225, 27, 247, 74, 112, 225, 27, 51, 247, 74, 112,
- 225, 27, 232, 242, 112, 225, 27, 249, 77, 134, 112, 225, 27, 232, 170,
- 112, 50, 116, 112, 50, 109, 112, 50, 166, 112, 50, 163, 112, 50, 180,
- 112, 50, 189, 112, 50, 198, 112, 50, 195, 112, 50, 200, 112, 50, 217,
- 200, 112, 50, 216, 38, 112, 50, 217, 115, 112, 50, 243, 240, 112, 50,
- 244, 83, 112, 50, 220, 39, 112, 50, 221, 37, 112, 50, 245, 141, 112, 50,
- 229, 26, 112, 50, 122, 240, 200, 112, 50, 122, 217, 100, 112, 21, 212,
- 79, 112, 21, 116, 112, 21, 109, 112, 21, 166, 112, 21, 163, 112, 21, 180,
- 112, 21, 189, 112, 21, 198, 112, 21, 195, 112, 21, 200, 208, 5, 250, 187,
- 208, 5, 253, 242, 208, 5, 214, 128, 208, 1, 61, 208, 1, 254, 232, 208, 1,
- 72, 208, 1, 236, 28, 208, 1, 69, 208, 1, 215, 92, 208, 1, 74, 208, 1,
- 254, 108, 208, 1, 75, 208, 1, 253, 108, 208, 1, 181, 208, 1, 234, 138,
- 208, 1, 243, 110, 208, 1, 242, 225, 208, 1, 229, 159, 208, 1, 250, 219,
- 208, 1, 250, 92, 208, 1, 235, 139, 208, 1, 235, 115, 208, 1, 228, 23,
- 208, 1, 216, 115, 208, 1, 216, 105, 208, 1, 248, 86, 208, 1, 248, 75,
- 208, 1, 248, 70, 208, 1, 223, 192, 208, 1, 228, 198, 208, 1, 218, 52,
- 208, 1, 217, 161, 208, 1, 248, 164, 208, 1, 247, 232, 208, 1, 205, 208,
- 1, 193, 208, 1, 226, 23, 208, 1, 252, 107, 208, 1, 251, 195, 208, 1, 188,
- 208, 1, 186, 208, 1, 203, 208, 1, 233, 157, 208, 1, 215, 1, 208, 1, 221,
- 24, 208, 1, 219, 157, 208, 1, 222, 202, 208, 1, 159, 208, 30, 5, 254,
- 232, 208, 30, 5, 72, 208, 30, 5, 236, 28, 208, 30, 5, 69, 208, 30, 5,
- 215, 92, 208, 30, 5, 74, 208, 30, 5, 254, 108, 208, 30, 5, 75, 208, 30,
- 5, 253, 108, 208, 5, 214, 133, 208, 5, 228, 60, 208, 254, 181, 52, 208,
- 245, 80, 52, 208, 50, 52, 208, 222, 92, 77, 208, 51, 222, 92, 77, 208,
- 248, 123, 208, 51, 248, 123, 15, 5, 61, 15, 5, 118, 29, 61, 15, 5, 118,
- 29, 252, 94, 15, 5, 118, 29, 243, 81, 217, 192, 15, 5, 118, 29, 159, 15,
- 5, 118, 29, 236, 30, 15, 5, 118, 29, 233, 139, 242, 75, 15, 5, 118, 29,
- 230, 131, 15, 5, 118, 29, 222, 190, 15, 5, 254, 234, 15, 5, 254, 185, 15,
- 5, 254, 186, 29, 253, 144, 15, 5, 254, 186, 29, 246, 22, 242, 75, 15, 5,
- 254, 186, 29, 243, 94, 15, 5, 254, 186, 29, 243, 81, 217, 192, 15, 5,
- 254, 186, 29, 159, 15, 5, 254, 186, 29, 236, 31, 242, 75, 15, 5, 254,
- 186, 29, 236, 4, 15, 5, 254, 186, 29, 233, 140, 15, 5, 254, 186, 29, 220,
- 228, 15, 5, 254, 186, 29, 111, 94, 111, 94, 69, 15, 5, 254, 186, 242, 75,
- 15, 5, 254, 183, 15, 5, 254, 184, 29, 252, 79, 15, 5, 254, 184, 29, 243,
- 81, 217, 192, 15, 5, 254, 184, 29, 231, 157, 94, 245, 108, 15, 5, 254,
- 184, 29, 221, 22, 15, 5, 254, 184, 29, 218, 22, 15, 5, 254, 160, 15, 5,
- 254, 94, 15, 5, 254, 95, 29, 245, 50, 15, 5, 254, 95, 29, 220, 190, 94,
- 242, 166, 15, 5, 254, 86, 15, 5, 254, 87, 29, 254, 86, 15, 5, 254, 87,
- 29, 247, 168, 15, 5, 254, 87, 29, 242, 166, 15, 5, 254, 87, 29, 159, 15,
- 5, 254, 87, 29, 235, 3, 15, 5, 254, 87, 29, 234, 101, 15, 5, 254, 87, 29,
- 220, 243, 15, 5, 254, 87, 29, 215, 100, 15, 5, 254, 83, 15, 5, 254, 76,
- 15, 5, 254, 41, 15, 5, 254, 42, 29, 220, 243, 15, 5, 254, 32, 15, 5, 254,
- 33, 110, 254, 32, 15, 5, 254, 33, 133, 217, 38, 15, 5, 254, 33, 94, 230,
- 35, 227, 30, 254, 33, 94, 230, 34, 15, 5, 254, 33, 94, 230, 35, 219, 165,
- 15, 5, 254, 5, 15, 5, 253, 235, 15, 5, 253, 205, 15, 5, 253, 206, 29,
- 233, 217, 15, 5, 253, 179, 15, 5, 253, 151, 15, 5, 253, 146, 15, 5, 253,
- 147, 212, 33, 217, 192, 15, 5, 253, 147, 235, 7, 217, 192, 15, 5, 253,
- 147, 110, 253, 147, 216, 78, 110, 216, 78, 216, 78, 110, 216, 78, 226,
- 149, 15, 5, 253, 147, 110, 253, 147, 110, 253, 146, 15, 5, 253, 147, 110,
- 253, 147, 110, 253, 147, 249, 65, 253, 147, 110, 253, 147, 110, 253, 146,
- 15, 5, 253, 144, 15, 5, 253, 141, 15, 5, 252, 107, 15, 5, 252, 94, 15, 5,
- 252, 89, 15, 5, 252, 86, 15, 5, 252, 80, 15, 5, 252, 81, 110, 252, 80,
- 15, 5, 252, 79, 15, 5, 134, 15, 5, 252, 59, 15, 5, 251, 184, 15, 5, 251,
- 185, 29, 61, 15, 5, 251, 185, 29, 243, 72, 15, 5, 251, 185, 29, 236, 31,
- 242, 75, 15, 5, 251, 54, 15, 5, 251, 55, 110, 251, 55, 254, 185, 15, 5,
- 251, 55, 110, 251, 55, 215, 160, 15, 5, 251, 55, 249, 65, 251, 54, 15, 5,
- 251, 38, 15, 5, 251, 39, 110, 251, 38, 15, 5, 251, 27, 15, 5, 251, 26,
- 15, 5, 248, 164, 15, 5, 248, 155, 15, 5, 248, 156, 234, 75, 29, 118, 94,
- 231, 210, 15, 5, 248, 156, 234, 75, 29, 254, 41, 15, 5, 248, 156, 234,
- 75, 29, 252, 79, 15, 5, 248, 156, 234, 75, 29, 251, 184, 15, 5, 248, 156,
- 234, 75, 29, 243, 110, 15, 5, 248, 156, 234, 75, 29, 243, 111, 94, 231,
- 210, 15, 5, 248, 156, 234, 75, 29, 242, 190, 15, 5, 248, 156, 234, 75,
- 29, 242, 173, 15, 5, 248, 156, 234, 75, 29, 242, 84, 15, 5, 248, 156,
- 234, 75, 29, 159, 15, 5, 248, 156, 234, 75, 29, 235, 177, 15, 5, 248,
- 156, 234, 75, 29, 235, 178, 94, 232, 156, 15, 5, 248, 156, 234, 75, 29,
- 234, 247, 15, 5, 248, 156, 234, 75, 29, 233, 157, 15, 5, 248, 156, 234,
- 75, 29, 232, 156, 15, 5, 248, 156, 234, 75, 29, 232, 157, 94, 231, 209,
- 15, 5, 248, 156, 234, 75, 29, 232, 142, 15, 5, 248, 156, 234, 75, 29,
- 229, 187, 15, 5, 248, 156, 234, 75, 29, 226, 150, 94, 226, 149, 15, 5,
- 248, 156, 234, 75, 29, 220, 117, 15, 5, 248, 156, 234, 75, 29, 218, 22,
- 15, 5, 248, 156, 234, 75, 29, 215, 198, 94, 242, 173, 15, 5, 248, 156,
- 234, 75, 29, 215, 100, 15, 5, 248, 132, 15, 5, 248, 111, 15, 5, 248, 110,
- 15, 5, 248, 109, 15, 5, 247, 211, 15, 5, 247, 194, 15, 5, 247, 169, 15,
- 5, 247, 170, 29, 220, 243, 15, 5, 247, 168, 15, 5, 247, 158, 15, 5, 247,
- 159, 234, 213, 111, 242, 76, 247, 139, 15, 5, 247, 139, 15, 5, 246, 33,
- 15, 5, 246, 34, 110, 246, 33, 15, 5, 246, 34, 242, 75, 15, 5, 246, 34,
- 220, 225, 15, 5, 246, 31, 15, 5, 246, 32, 29, 245, 37, 15, 5, 246, 30,
- 15, 5, 246, 29, 15, 5, 246, 28, 15, 5, 246, 27, 15, 5, 246, 23, 15, 5,
- 246, 21, 15, 5, 246, 22, 242, 75, 15, 5, 246, 22, 242, 76, 242, 75, 15,
- 5, 246, 20, 15, 5, 246, 13, 15, 5, 74, 15, 5, 191, 29, 226, 149, 15, 5,
- 191, 110, 191, 228, 51, 110, 228, 50, 15, 5, 245, 190, 15, 5, 245, 191,
- 29, 118, 94, 242, 30, 94, 248, 164, 15, 5, 245, 191, 29, 243, 72, 15, 5,
- 245, 191, 29, 231, 42, 15, 5, 245, 191, 29, 222, 179, 15, 5, 245, 191,
- 29, 220, 243, 15, 5, 245, 191, 29, 69, 15, 5, 245, 167, 15, 5, 245, 157,
- 15, 5, 245, 131, 15, 5, 245, 108, 15, 5, 245, 109, 29, 243, 80, 15, 5,
- 245, 109, 29, 243, 81, 217, 192, 15, 5, 245, 109, 29, 231, 156, 15, 5,
- 245, 109, 249, 65, 245, 108, 15, 5, 245, 109, 227, 30, 245, 108, 15, 5,
- 245, 109, 219, 165, 15, 5, 245, 52, 15, 5, 245, 50, 15, 5, 245, 37, 15,
- 5, 244, 234, 15, 5, 244, 235, 29, 61, 15, 5, 244, 235, 29, 118, 94, 233,
- 128, 15, 5, 244, 235, 29, 118, 94, 233, 129, 29, 233, 128, 15, 5, 244,
- 235, 29, 254, 32, 15, 5, 244, 235, 29, 252, 94, 15, 5, 244, 235, 29, 246,
- 22, 242, 75, 15, 5, 244, 235, 29, 246, 22, 242, 76, 242, 75, 15, 5, 244,
- 235, 29, 159, 15, 5, 244, 235, 29, 242, 30, 242, 75, 15, 5, 244, 235, 29,
- 236, 31, 242, 75, 15, 5, 244, 235, 29, 234, 212, 15, 5, 244, 235, 29,
- 234, 213, 219, 165, 15, 5, 244, 235, 29, 233, 236, 15, 5, 244, 235, 29,
- 233, 157, 15, 5, 244, 235, 29, 233, 129, 29, 233, 128, 15, 5, 244, 235,
- 29, 233, 13, 15, 5, 244, 235, 29, 232, 156, 15, 5, 244, 235, 29, 215,
- 197, 15, 5, 244, 235, 29, 215, 188, 15, 5, 243, 110, 15, 5, 243, 111,
- 242, 75, 15, 5, 243, 108, 15, 5, 243, 109, 29, 118, 94, 248, 165, 94,
- 159, 15, 5, 243, 109, 29, 118, 94, 159, 15, 5, 243, 109, 29, 118, 94,
- 236, 30, 15, 5, 243, 109, 29, 254, 184, 217, 193, 94, 218, 41, 15, 5,
- 243, 109, 29, 254, 32, 15, 5, 243, 109, 29, 253, 146, 15, 5, 243, 109,
- 29, 253, 145, 94, 243, 94, 15, 5, 243, 109, 29, 252, 94, 15, 5, 243, 109,
- 29, 252, 60, 94, 203, 15, 5, 243, 109, 29, 251, 27, 15, 5, 243, 109, 29,
- 251, 28, 94, 203, 15, 5, 243, 109, 29, 248, 164, 15, 5, 243, 109, 29,
- 247, 211, 15, 5, 243, 109, 29, 247, 170, 29, 220, 243, 15, 5, 243, 109,
- 29, 246, 31, 15, 5, 243, 109, 29, 245, 131, 15, 5, 243, 109, 29, 245,
- 132, 94, 233, 157, 15, 5, 243, 109, 29, 245, 108, 15, 5, 243, 109, 29,
- 245, 109, 29, 243, 81, 217, 192, 15, 5, 243, 109, 29, 243, 81, 217, 192,
- 15, 5, 243, 109, 29, 243, 72, 15, 5, 243, 109, 29, 242, 190, 15, 5, 243,
- 109, 29, 242, 188, 15, 5, 243, 109, 29, 242, 189, 94, 61, 15, 5, 243,
- 109, 29, 242, 174, 94, 219, 27, 15, 5, 243, 109, 29, 242, 30, 94, 232,
- 157, 94, 245, 37, 15, 5, 243, 109, 29, 242, 12, 15, 5, 243, 109, 29, 242,
- 13, 94, 233, 157, 15, 5, 243, 109, 29, 241, 166, 94, 233, 13, 15, 5, 243,
- 109, 29, 240, 208, 15, 5, 243, 109, 29, 236, 31, 242, 75, 15, 5, 243,
- 109, 29, 235, 164, 94, 240, 213, 94, 253, 146, 15, 5, 243, 109, 29, 234,
- 247, 15, 5, 243, 109, 29, 234, 212, 15, 5, 243, 109, 29, 234, 98, 15, 5,
- 243, 109, 29, 234, 99, 94, 233, 128, 15, 5, 243, 109, 29, 233, 237, 94,
- 254, 32, 15, 5, 243, 109, 29, 233, 157, 15, 5, 243, 109, 29, 231, 157,
- 94, 245, 108, 15, 5, 243, 109, 29, 231, 42, 15, 5, 243, 109, 29, 228, 50,
- 15, 5, 243, 109, 29, 228, 51, 110, 228, 50, 15, 5, 243, 109, 29, 193, 15,
- 5, 243, 109, 29, 222, 179, 15, 5, 243, 109, 29, 222, 147, 15, 5, 243,
- 109, 29, 220, 243, 15, 5, 243, 109, 29, 220, 244, 94, 216, 62, 15, 5,
- 243, 109, 29, 220, 210, 15, 5, 243, 109, 29, 218, 244, 15, 5, 243, 109,
- 29, 218, 22, 15, 5, 243, 109, 29, 69, 15, 5, 243, 109, 29, 215, 188, 15,
- 5, 243, 109, 29, 215, 189, 94, 246, 33, 15, 5, 243, 109, 110, 243, 108,
- 15, 5, 243, 103, 15, 5, 243, 104, 249, 65, 243, 103, 15, 5, 243, 101, 15,
- 5, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 94, 15, 5,
- 243, 95, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 93,
- 15, 5, 243, 91, 15, 5, 243, 82, 15, 5, 243, 80, 15, 5, 243, 81, 217, 192,
- 15, 5, 243, 81, 110, 243, 80, 15, 5, 243, 81, 249, 65, 243, 80, 15, 5,
- 243, 72, 15, 5, 243, 71, 15, 5, 243, 66, 15, 5, 243, 12, 15, 5, 243, 13,
- 29, 233, 217, 15, 5, 242, 190, 15, 5, 242, 191, 29, 74, 15, 5, 242, 191,
- 29, 69, 15, 5, 242, 191, 249, 65, 242, 190, 15, 5, 242, 188, 15, 5, 242,
- 189, 110, 242, 188, 15, 5, 242, 189, 249, 65, 242, 188, 15, 5, 242, 185,
- 15, 5, 242, 173, 15, 5, 242, 174, 242, 75, 15, 5, 242, 171, 15, 5, 242,
- 172, 29, 118, 94, 236, 30, 15, 5, 242, 172, 29, 243, 81, 217, 192, 15, 5,
- 242, 172, 29, 236, 30, 15, 5, 242, 172, 29, 232, 157, 94, 236, 30, 15, 5,
- 242, 172, 29, 193, 15, 5, 242, 168, 15, 5, 242, 166, 15, 5, 242, 167,
- 249, 65, 242, 166, 15, 5, 242, 167, 29, 252, 94, 15, 5, 242, 167, 29,
- 218, 22, 15, 5, 242, 167, 217, 192, 15, 5, 242, 92, 15, 5, 242, 93, 249,
- 65, 242, 92, 15, 5, 242, 90, 15, 5, 242, 91, 29, 234, 247, 15, 5, 242,
- 91, 29, 234, 248, 29, 236, 31, 242, 75, 15, 5, 242, 91, 29, 228, 50, 15,
- 5, 242, 91, 29, 222, 180, 94, 216, 77, 15, 5, 242, 91, 242, 75, 15, 5,
- 242, 84, 15, 5, 242, 85, 29, 118, 94, 233, 217, 15, 5, 242, 85, 29, 233,
- 217, 15, 5, 242, 85, 110, 242, 85, 232, 149, 15, 5, 242, 79, 15, 5, 242,
- 77, 15, 5, 242, 78, 29, 220, 243, 15, 5, 242, 69, 15, 5, 242, 68, 15, 5,
- 242, 65, 15, 5, 242, 64, 15, 5, 159, 15, 5, 242, 30, 217, 192, 15, 5,
- 242, 30, 242, 75, 15, 5, 242, 12, 15, 5, 241, 165, 15, 5, 241, 166, 29,
- 253, 146, 15, 5, 241, 166, 29, 253, 144, 15, 5, 241, 166, 29, 252, 94,
- 15, 5, 241, 166, 29, 247, 139, 15, 5, 241, 166, 29, 243, 101, 15, 5, 241,
- 166, 29, 234, 90, 15, 5, 241, 166, 29, 228, 50, 15, 5, 241, 166, 29, 220,
- 243, 15, 5, 241, 166, 29, 69, 15, 5, 240, 212, 15, 5, 240, 208, 15, 5,
- 240, 209, 29, 254, 32, 15, 5, 240, 209, 29, 242, 12, 15, 5, 240, 209, 29,
- 234, 212, 15, 5, 240, 209, 29, 232, 226, 15, 5, 240, 209, 29, 215, 188,
- 15, 5, 240, 205, 15, 5, 72, 15, 5, 240, 146, 61, 15, 5, 240, 108, 15, 5,
- 236, 58, 15, 5, 236, 59, 110, 236, 59, 251, 27, 15, 5, 236, 59, 110, 236,
- 59, 219, 165, 15, 5, 236, 33, 15, 5, 236, 30, 15, 5, 236, 31, 247, 194,
- 15, 5, 236, 31, 223, 188, 15, 5, 236, 31, 110, 236, 31, 220, 194, 110,
- 220, 194, 215, 189, 110, 215, 188, 15, 5, 236, 31, 242, 75, 15, 5, 236,
- 22, 15, 5, 236, 23, 29, 243, 81, 217, 192, 15, 5, 236, 21, 15, 5, 236,
- 11, 15, 5, 236, 12, 29, 218, 22, 15, 5, 236, 12, 249, 65, 236, 11, 15, 5,
- 236, 12, 227, 30, 236, 11, 15, 5, 236, 12, 219, 165, 15, 5, 236, 4, 15,
- 5, 235, 251, 15, 5, 235, 177, 15, 5, 235, 163, 15, 5, 181, 15, 5, 235,
- 17, 29, 61, 15, 5, 235, 17, 29, 254, 160, 15, 5, 235, 17, 29, 254, 161,
- 94, 233, 236, 15, 5, 235, 17, 29, 253, 144, 15, 5, 235, 17, 29, 252, 94,
- 15, 5, 235, 17, 29, 252, 79, 15, 5, 235, 17, 29, 134, 15, 5, 235, 17, 29,
- 251, 184, 15, 5, 235, 17, 29, 245, 50, 15, 5, 235, 17, 29, 245, 37, 15,
- 5, 235, 17, 29, 243, 110, 15, 5, 235, 17, 29, 243, 94, 15, 5, 235, 17,
- 29, 243, 81, 217, 192, 15, 5, 235, 17, 29, 243, 72, 15, 5, 235, 17, 29,
- 243, 73, 94, 221, 23, 94, 61, 15, 5, 235, 17, 29, 242, 190, 15, 5, 235,
- 17, 29, 242, 173, 15, 5, 235, 17, 29, 242, 167, 94, 222, 147, 15, 5, 235,
- 17, 29, 242, 167, 249, 65, 242, 166, 15, 5, 235, 17, 29, 242, 92, 15, 5,
- 235, 17, 29, 242, 68, 15, 5, 235, 17, 29, 236, 30, 15, 5, 235, 17, 29,
- 236, 11, 15, 5, 235, 17, 29, 234, 247, 15, 5, 235, 17, 29, 234, 101, 15,
- 5, 235, 17, 29, 234, 98, 15, 5, 235, 17, 29, 233, 13, 15, 5, 235, 17, 29,
- 232, 156, 15, 5, 235, 17, 29, 231, 156, 15, 5, 235, 17, 29, 231, 157, 94,
- 246, 33, 15, 5, 235, 17, 29, 231, 157, 94, 242, 190, 15, 5, 235, 17, 29,
- 231, 157, 94, 217, 229, 15, 5, 235, 17, 29, 231, 42, 15, 5, 235, 17, 29,
- 231, 43, 94, 228, 45, 15, 5, 235, 17, 29, 229, 187, 15, 5, 235, 17, 29,
- 228, 50, 15, 5, 235, 17, 29, 225, 240, 15, 5, 235, 17, 29, 223, 51, 15,
- 5, 235, 17, 29, 222, 202, 15, 5, 235, 17, 29, 222, 147, 15, 5, 235, 17,
- 29, 221, 24, 15, 5, 235, 17, 29, 220, 243, 15, 5, 235, 17, 29, 220, 210,
- 15, 5, 235, 17, 29, 220, 150, 15, 5, 235, 17, 29, 220, 108, 15, 5, 235,
- 17, 29, 218, 252, 15, 5, 235, 17, 29, 218, 1, 15, 5, 235, 17, 29, 69, 15,
- 5, 235, 17, 29, 215, 197, 15, 5, 235, 17, 29, 215, 188, 15, 5, 235, 17,
- 29, 215, 163, 29, 193, 15, 5, 235, 17, 29, 215, 100, 15, 5, 235, 17, 29,
- 212, 37, 15, 5, 235, 15, 15, 5, 235, 16, 249, 65, 235, 15, 15, 5, 235, 8,
- 15, 5, 235, 5, 15, 5, 235, 3, 15, 5, 235, 2, 15, 5, 235, 0, 15, 5, 235,
- 1, 110, 235, 0, 15, 5, 234, 247, 15, 5, 234, 248, 29, 236, 31, 242, 75,
- 15, 5, 234, 243, 15, 5, 234, 244, 29, 252, 94, 15, 5, 234, 244, 249, 65,
- 234, 243, 15, 5, 234, 241, 15, 5, 234, 240, 15, 5, 234, 212, 15, 5, 234,
- 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 213, 110, 234,
- 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 163, 15, 5,
- 234, 101, 15, 5, 234, 102, 29, 252, 94, 15, 5, 234, 102, 29, 69, 15, 5,
- 234, 102, 29, 215, 188, 15, 5, 234, 98, 15, 5, 234, 90, 15, 5, 234, 77,
- 15, 5, 234, 76, 15, 5, 234, 74, 15, 5, 234, 75, 110, 234, 74, 15, 5, 233,
- 238, 15, 5, 233, 239, 110, 241, 166, 29, 253, 145, 233, 239, 110, 241,
- 166, 29, 253, 144, 15, 5, 233, 236, 15, 5, 233, 234, 15, 5, 233, 235,
- 214, 244, 17, 15, 5, 233, 233, 15, 5, 233, 230, 15, 5, 233, 231, 242, 75,
- 15, 5, 233, 229, 15, 5, 233, 217, 15, 5, 233, 218, 227, 30, 233, 217, 15,
- 5, 233, 212, 15, 5, 233, 194, 15, 5, 233, 157, 15, 5, 233, 140, 15, 5,
- 233, 141, 29, 61, 15, 5, 233, 141, 29, 118, 94, 248, 165, 94, 159, 15, 5,
- 233, 141, 29, 118, 94, 243, 72, 15, 5, 233, 141, 29, 118, 94, 233, 128,
- 15, 5, 233, 141, 29, 254, 86, 15, 5, 233, 141, 29, 254, 32, 15, 5, 233,
- 141, 29, 253, 147, 212, 33, 217, 192, 15, 5, 233, 141, 29, 252, 94, 15,
- 5, 233, 141, 29, 251, 184, 15, 5, 233, 141, 29, 248, 111, 15, 5, 233,
- 141, 29, 245, 108, 15, 5, 233, 141, 29, 243, 110, 15, 5, 233, 141, 29,
- 243, 72, 15, 5, 233, 141, 29, 242, 84, 15, 5, 233, 141, 29, 242, 85, 94,
- 242, 84, 15, 5, 233, 141, 29, 159, 15, 5, 233, 141, 29, 242, 12, 15, 5,
- 233, 141, 29, 241, 166, 29, 228, 50, 15, 5, 233, 141, 29, 236, 31, 242,
- 75, 15, 5, 233, 141, 29, 236, 11, 15, 5, 233, 141, 29, 236, 12, 94, 159,
- 15, 5, 233, 141, 29, 236, 12, 94, 232, 156, 15, 5, 233, 141, 29, 234,
- 101, 15, 5, 233, 141, 29, 234, 90, 15, 5, 233, 141, 29, 233, 236, 15, 5,
- 233, 141, 29, 233, 230, 15, 5, 233, 141, 29, 233, 231, 94, 241, 166, 94,
- 61, 15, 5, 233, 141, 29, 233, 140, 15, 5, 233, 141, 29, 232, 226, 15, 5,
- 233, 141, 29, 232, 156, 15, 5, 233, 141, 29, 232, 144, 15, 5, 233, 141,
- 29, 231, 156, 15, 5, 233, 141, 29, 231, 157, 94, 245, 108, 15, 5, 233,
- 141, 29, 230, 131, 15, 5, 233, 141, 29, 229, 187, 15, 5, 233, 141, 29,
- 220, 244, 94, 218, 244, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 94,
- 245, 50, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 217, 192, 15, 5,
- 233, 141, 29, 220, 148, 15, 5, 233, 141, 29, 220, 149, 94, 220, 148, 15,
- 5, 233, 141, 29, 218, 244, 15, 5, 233, 141, 29, 218, 33, 15, 5, 233, 141,
- 29, 218, 22, 15, 5, 233, 141, 29, 217, 230, 94, 118, 94, 219, 28, 94,
- 205, 15, 5, 233, 141, 29, 69, 15, 5, 233, 141, 29, 111, 94, 61, 15, 5,
- 233, 141, 29, 111, 94, 111, 94, 69, 15, 5, 233, 141, 29, 215, 198, 94,
- 253, 146, 15, 5, 233, 141, 29, 215, 188, 15, 5, 233, 141, 29, 215, 100,
- 15, 5, 233, 141, 219, 165, 15, 5, 233, 138, 15, 5, 233, 139, 29, 220,
- 243, 15, 5, 233, 139, 29, 220, 244, 94, 218, 244, 15, 5, 233, 139, 242,
- 75, 15, 5, 233, 139, 242, 76, 110, 233, 139, 242, 76, 220, 243, 15, 5,
- 233, 135, 15, 5, 233, 128, 15, 5, 233, 129, 29, 233, 128, 15, 5, 233,
- 126, 15, 5, 233, 127, 29, 233, 217, 15, 5, 233, 127, 29, 233, 218, 94,
- 223, 51, 15, 5, 233, 13, 15, 5, 232, 254, 15, 5, 232, 245, 15, 5, 232,
- 226, 15, 5, 232, 156, 15, 5, 232, 157, 29, 252, 94, 15, 5, 232, 154, 15,
- 5, 232, 155, 29, 254, 86, 15, 5, 232, 155, 29, 252, 94, 15, 5, 232, 155,
- 29, 245, 37, 15, 5, 232, 155, 29, 245, 38, 217, 192, 15, 5, 232, 155, 29,
- 243, 81, 217, 192, 15, 5, 232, 155, 29, 241, 166, 29, 252, 94, 15, 5,
- 232, 155, 29, 236, 11, 15, 5, 232, 155, 29, 235, 5, 15, 5, 232, 155, 29,
- 235, 3, 15, 5, 232, 155, 29, 235, 4, 94, 253, 146, 15, 5, 232, 155, 29,
- 234, 101, 15, 5, 232, 155, 29, 233, 158, 94, 253, 146, 15, 5, 232, 155,
- 29, 233, 140, 15, 5, 232, 155, 29, 231, 157, 94, 245, 108, 15, 5, 232,
- 155, 29, 229, 187, 15, 5, 232, 155, 29, 228, 92, 15, 5, 232, 155, 29,
- 220, 118, 94, 253, 146, 15, 5, 232, 155, 29, 220, 100, 94, 251, 54, 15,
- 5, 232, 155, 29, 216, 77, 15, 5, 232, 155, 217, 192, 15, 5, 232, 155,
- 249, 65, 232, 154, 15, 5, 232, 155, 227, 30, 232, 154, 15, 5, 232, 155,
- 219, 165, 15, 5, 232, 155, 220, 225, 15, 5, 232, 153, 15, 5, 232, 149,
- 15, 5, 232, 150, 110, 232, 149, 15, 5, 232, 150, 227, 30, 232, 149, 15,
- 5, 232, 150, 220, 225, 15, 5, 232, 147, 15, 5, 232, 144, 15, 5, 232, 142,
- 15, 5, 232, 143, 110, 232, 142, 15, 5, 232, 143, 110, 232, 143, 243, 73,
- 110, 243, 72, 15, 5, 188, 15, 5, 232, 43, 29, 218, 22, 15, 5, 232, 43,
- 242, 75, 15, 5, 232, 42, 15, 5, 232, 15, 15, 5, 231, 229, 15, 5, 231,
- 210, 15, 5, 231, 209, 15, 5, 231, 156, 15, 5, 231, 112, 15, 5, 231, 42,
- 15, 5, 231, 1, 15, 5, 230, 172, 15, 5, 230, 173, 110, 230, 172, 15, 5,
- 230, 163, 15, 5, 230, 164, 242, 75, 15, 5, 230, 148, 15, 5, 230, 134, 15,
- 5, 230, 131, 15, 5, 230, 132, 29, 61, 15, 5, 230, 132, 29, 233, 217, 15,
- 5, 230, 132, 29, 212, 109, 15, 5, 230, 132, 110, 230, 131, 15, 5, 230,
- 132, 110, 230, 132, 29, 118, 94, 205, 15, 5, 230, 132, 249, 65, 230, 131,
- 15, 5, 230, 129, 15, 5, 230, 130, 29, 61, 15, 5, 230, 130, 29, 118, 94,
- 247, 211, 15, 5, 230, 130, 29, 247, 211, 15, 5, 230, 130, 242, 75, 15, 5,
- 205, 15, 5, 230, 45, 15, 5, 230, 34, 15, 5, 230, 35, 235, 190, 15, 5,
- 230, 35, 29, 220, 151, 217, 192, 15, 5, 230, 35, 227, 30, 230, 34, 15, 5,
- 230, 33, 15, 5, 230, 28, 228, 36, 15, 5, 230, 27, 15, 5, 230, 26, 15, 5,
- 229, 187, 15, 5, 229, 188, 29, 61, 15, 5, 229, 188, 29, 215, 188, 15, 5,
- 229, 188, 220, 225, 15, 5, 229, 64, 15, 5, 229, 65, 29, 74, 15, 5, 229,
- 63, 15, 5, 229, 34, 15, 5, 229, 35, 29, 243, 81, 217, 192, 15, 5, 229,
- 35, 29, 243, 73, 94, 243, 81, 217, 192, 15, 5, 229, 32, 15, 5, 229, 33,
- 29, 254, 32, 15, 5, 229, 33, 29, 253, 146, 15, 5, 229, 33, 29, 253, 147,
- 94, 253, 146, 15, 5, 229, 33, 29, 242, 84, 15, 5, 229, 33, 29, 231, 157,
- 94, 243, 81, 217, 192, 15, 5, 229, 33, 29, 229, 187, 15, 5, 229, 33, 29,
- 228, 50, 15, 5, 229, 33, 29, 220, 243, 15, 5, 229, 33, 29, 220, 244, 94,
- 118, 254, 32, 15, 5, 229, 33, 29, 220, 244, 94, 253, 146, 15, 5, 229, 33,
- 29, 220, 244, 94, 253, 147, 94, 253, 146, 15, 5, 229, 33, 29, 215, 198,
- 94, 253, 146, 15, 5, 229, 33, 29, 215, 100, 15, 5, 229, 21, 15, 5, 228,
- 92, 15, 5, 228, 65, 15, 5, 228, 50, 15, 5, 228, 51, 233, 139, 29, 243,
- 72, 15, 5, 228, 51, 233, 139, 29, 231, 210, 15, 5, 228, 51, 233, 139, 29,
- 222, 179, 15, 5, 228, 51, 233, 139, 29, 222, 180, 110, 228, 51, 233, 139,
- 29, 222, 179, 15, 5, 228, 51, 233, 139, 29, 215, 100, 15, 5, 228, 51,
- 217, 192, 15, 5, 228, 51, 110, 228, 50, 15, 5, 228, 51, 249, 65, 228, 50,
- 15, 5, 228, 51, 249, 65, 228, 51, 233, 139, 110, 233, 138, 15, 5, 228,
- 45, 15, 5, 228, 46, 254, 184, 29, 253, 141, 15, 5, 228, 46, 254, 184, 29,
- 251, 184, 15, 5, 228, 46, 254, 184, 29, 246, 29, 15, 5, 228, 46, 254,
- 184, 29, 242, 84, 15, 5, 228, 46, 254, 184, 29, 236, 31, 242, 75, 15, 5,
- 228, 46, 254, 184, 29, 235, 3, 15, 5, 228, 46, 254, 184, 29, 233, 157,
- 15, 5, 228, 46, 254, 184, 29, 229, 187, 15, 5, 228, 46, 254, 184, 29,
- 220, 97, 15, 5, 228, 46, 254, 184, 29, 215, 197, 15, 5, 228, 46, 234, 75,
- 29, 251, 184, 15, 5, 228, 46, 234, 75, 29, 251, 185, 69, 15, 5, 193, 15,
- 5, 226, 204, 15, 5, 226, 174, 15, 5, 226, 149, 15, 5, 226, 37, 15, 5,
- 225, 240, 15, 5, 225, 241, 29, 61, 15, 5, 225, 241, 29, 254, 185, 15, 5,
- 225, 241, 29, 251, 184, 15, 5, 225, 241, 29, 251, 54, 15, 5, 225, 241,
- 29, 74, 15, 5, 225, 241, 29, 72, 15, 5, 225, 241, 29, 240, 108, 15, 5,
- 225, 241, 29, 69, 15, 5, 225, 241, 29, 215, 197, 15, 5, 225, 241, 249,
- 65, 225, 240, 15, 5, 225, 185, 15, 5, 225, 186, 29, 234, 243, 15, 5, 225,
- 186, 29, 215, 188, 15, 5, 225, 186, 29, 212, 109, 15, 5, 225, 186, 227,
- 30, 225, 185, 15, 5, 203, 15, 5, 224, 72, 15, 5, 223, 188, 15, 5, 223,
- 51, 15, 5, 222, 202, 15, 5, 222, 191, 228, 36, 15, 5, 222, 190, 15, 5,
- 222, 191, 29, 61, 15, 5, 222, 191, 29, 246, 33, 15, 5, 222, 191, 29, 246,
- 31, 15, 5, 222, 191, 29, 159, 15, 5, 222, 191, 29, 234, 247, 15, 5, 222,
- 191, 29, 233, 217, 15, 5, 222, 191, 29, 232, 142, 15, 5, 222, 191, 29,
- 231, 42, 15, 5, 222, 191, 29, 228, 50, 15, 5, 222, 191, 29, 222, 179, 15,
- 5, 222, 191, 29, 220, 210, 15, 5, 222, 191, 29, 218, 41, 15, 5, 222, 191,
- 29, 215, 197, 15, 5, 222, 191, 29, 215, 194, 15, 5, 222, 191, 29, 215,
- 167, 15, 5, 222, 191, 29, 215, 121, 15, 5, 222, 191, 29, 215, 100, 15, 5,
- 222, 191, 110, 222, 190, 15, 5, 222, 191, 242, 75, 15, 5, 222, 179, 15,
- 5, 222, 180, 233, 141, 29, 253, 144, 15, 5, 222, 155, 15, 5, 222, 147,
- 15, 5, 221, 24, 15, 5, 221, 22, 15, 5, 221, 23, 29, 61, 15, 5, 221, 23,
- 29, 252, 94, 15, 5, 221, 23, 29, 242, 166, 15, 5, 221, 23, 29, 229, 187,
- 15, 5, 221, 23, 29, 220, 148, 15, 5, 221, 23, 29, 216, 62, 15, 5, 221,
- 23, 29, 69, 15, 5, 221, 23, 29, 111, 94, 61, 15, 5, 221, 21, 15, 5, 221,
- 19, 15, 5, 221, 1, 15, 5, 220, 243, 15, 5, 220, 244, 240, 212, 15, 5,
- 220, 244, 110, 220, 244, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72,
- 15, 5, 220, 244, 110, 220, 244, 218, 42, 110, 218, 42, 243, 73, 110, 243,
- 72, 15, 5, 220, 236, 15, 5, 220, 231, 15, 5, 220, 228, 15, 5, 220, 227,
- 15, 5, 220, 224, 15, 5, 220, 210, 15, 5, 220, 211, 29, 61, 15, 5, 220,
- 211, 29, 236, 11, 15, 5, 220, 204, 15, 5, 220, 205, 29, 61, 15, 5, 220,
- 205, 29, 252, 80, 15, 5, 220, 205, 29, 251, 38, 15, 5, 220, 205, 29, 247,
- 158, 15, 5, 220, 205, 29, 243, 72, 15, 5, 220, 205, 29, 236, 30, 15, 5,
- 220, 205, 29, 236, 31, 242, 75, 15, 5, 220, 205, 29, 233, 212, 15, 5,
- 220, 205, 29, 232, 144, 15, 5, 220, 205, 29, 230, 163, 15, 5, 220, 205,
- 29, 222, 179, 15, 5, 220, 198, 15, 5, 220, 193, 15, 5, 220, 194, 217,
- 192, 15, 5, 220, 194, 110, 220, 194, 251, 28, 110, 251, 27, 15, 5, 220,
- 189, 15, 5, 220, 150, 15, 5, 220, 151, 110, 235, 191, 220, 150, 15, 5,
- 220, 148, 15, 5, 220, 147, 15, 5, 220, 117, 15, 5, 220, 118, 242, 75, 15,
- 5, 220, 108, 15, 5, 220, 106, 15, 5, 220, 107, 110, 220, 107, 220, 148,
- 15, 5, 220, 99, 15, 5, 220, 97, 15, 5, 219, 27, 15, 5, 219, 28, 110, 219,
- 27, 15, 5, 218, 255, 15, 5, 218, 254, 15, 5, 218, 252, 15, 5, 218, 244,
- 15, 5, 218, 243, 15, 5, 218, 217, 15, 5, 218, 216, 15, 5, 218, 52, 15, 5,
- 218, 53, 253, 132, 15, 5, 218, 53, 29, 241, 165, 15, 5, 218, 53, 29, 231,
- 42, 15, 5, 218, 53, 242, 75, 15, 5, 218, 41, 15, 5, 218, 42, 110, 218,
- 42, 229, 65, 110, 229, 65, 247, 140, 110, 247, 139, 15, 5, 218, 42, 219,
- 165, 15, 5, 218, 33, 15, 5, 126, 29, 251, 184, 15, 5, 126, 29, 242, 84,
- 15, 5, 126, 29, 220, 243, 15, 5, 126, 29, 220, 150, 15, 5, 126, 29, 216,
- 77, 15, 5, 126, 29, 215, 188, 15, 5, 218, 22, 15, 5, 218, 1, 15, 5, 217,
- 229, 15, 5, 217, 230, 242, 75, 15, 5, 217, 71, 15, 5, 217, 72, 217, 192,
- 15, 5, 217, 44, 15, 5, 217, 25, 15, 5, 217, 26, 29, 218, 22, 15, 5, 217,
- 26, 110, 217, 25, 15, 5, 217, 26, 110, 217, 26, 243, 102, 110, 243, 102,
- 243, 73, 110, 243, 72, 15, 5, 216, 82, 15, 5, 216, 77, 15, 5, 216, 75,
- 15, 5, 216, 72, 15, 5, 216, 62, 15, 5, 216, 63, 110, 216, 63, 212, 110,
- 110, 212, 109, 15, 5, 69, 15, 5, 111, 242, 84, 15, 5, 111, 111, 69, 15,
- 5, 111, 110, 111, 226, 214, 110, 226, 214, 243, 73, 110, 243, 72, 15, 5,
- 111, 110, 111, 218, 218, 110, 218, 217, 15, 5, 111, 110, 111, 111, 223,
- 202, 110, 111, 223, 201, 15, 5, 215, 197, 15, 5, 215, 194, 15, 5, 215,
- 188, 15, 5, 215, 189, 233, 212, 15, 5, 215, 189, 29, 252, 94, 15, 5, 215,
- 189, 29, 231, 42, 15, 5, 215, 189, 29, 111, 94, 111, 94, 69, 15, 5, 215,
- 189, 29, 111, 94, 111, 94, 111, 242, 75, 15, 5, 215, 189, 242, 75, 15, 5,
- 215, 189, 220, 225, 15, 5, 215, 189, 220, 226, 29, 252, 94, 15, 5, 215,
- 184, 15, 5, 215, 167, 15, 5, 215, 168, 29, 233, 140, 15, 5, 215, 168, 29,
- 231, 157, 94, 248, 164, 15, 5, 215, 168, 29, 221, 22, 15, 5, 215, 168,
- 29, 69, 15, 5, 215, 166, 15, 5, 215, 162, 15, 5, 215, 163, 29, 234, 212,
- 15, 5, 215, 163, 29, 193, 15, 5, 215, 160, 15, 5, 215, 161, 242, 75, 15,
- 5, 215, 121, 15, 5, 215, 122, 249, 65, 215, 121, 15, 5, 215, 122, 220,
- 225, 15, 5, 215, 119, 15, 5, 215, 120, 29, 118, 94, 159, 15, 5, 215, 120,
- 29, 118, 94, 205, 15, 5, 215, 120, 29, 254, 86, 15, 5, 215, 120, 29, 159,
- 15, 5, 215, 120, 29, 228, 50, 15, 5, 215, 120, 29, 215, 197, 15, 5, 215,
- 120, 29, 215, 198, 94, 253, 146, 15, 5, 215, 120, 29, 215, 198, 94, 251,
- 184, 15, 5, 215, 118, 15, 5, 215, 115, 15, 5, 215, 114, 15, 5, 215, 110,
- 15, 5, 215, 111, 29, 61, 15, 5, 215, 111, 29, 253, 141, 15, 5, 215, 111,
- 29, 134, 15, 5, 215, 111, 29, 246, 23, 15, 5, 215, 111, 29, 243, 110, 15,
- 5, 215, 111, 29, 243, 94, 15, 5, 215, 111, 29, 243, 81, 217, 192, 15, 5,
- 215, 111, 29, 243, 72, 15, 5, 215, 111, 29, 242, 92, 15, 5, 215, 111, 29,
- 159, 15, 5, 215, 111, 29, 236, 30, 15, 5, 215, 111, 29, 236, 11, 15, 5,
- 215, 111, 29, 235, 163, 15, 5, 215, 111, 29, 234, 101, 15, 5, 215, 111,
- 29, 232, 142, 15, 5, 215, 111, 29, 231, 1, 15, 5, 215, 111, 29, 193, 15,
- 5, 215, 111, 29, 220, 243, 15, 5, 215, 111, 29, 220, 106, 15, 5, 215,
- 111, 29, 216, 82, 15, 5, 215, 111, 29, 111, 94, 242, 84, 15, 5, 215, 111,
- 29, 215, 188, 15, 5, 215, 111, 29, 215, 108, 15, 5, 215, 108, 15, 5, 215,
- 109, 29, 69, 15, 5, 215, 100, 15, 5, 215, 101, 29, 61, 15, 5, 215, 101,
- 29, 233, 238, 15, 5, 215, 101, 29, 233, 217, 15, 5, 215, 101, 29, 218,
- 22, 15, 5, 215, 96, 15, 5, 215, 99, 15, 5, 215, 97, 15, 5, 215, 93, 15,
- 5, 215, 82, 15, 5, 215, 83, 29, 234, 212, 15, 5, 215, 81, 15, 5, 212,
- 109, 15, 5, 212, 110, 217, 192, 15, 5, 212, 110, 91, 29, 233, 217, 15, 5,
- 212, 106, 15, 5, 212, 99, 15, 5, 212, 86, 15, 5, 212, 37, 15, 5, 212, 38,
- 110, 212, 37, 15, 5, 212, 36, 15, 5, 212, 34, 15, 5, 212, 35, 235, 7,
- 217, 192, 15, 5, 212, 29, 15, 5, 212, 21, 15, 5, 212, 8, 15, 5, 212, 6,
- 15, 5, 212, 7, 29, 61, 15, 5, 212, 5, 15, 5, 212, 4, 15, 128, 5, 117,
- 253, 146, 15, 128, 5, 133, 253, 146, 15, 128, 5, 243, 237, 253, 146, 15,
- 128, 5, 244, 50, 253, 146, 15, 128, 5, 220, 53, 253, 146, 15, 128, 5,
- 221, 43, 253, 146, 15, 128, 5, 245, 150, 253, 146, 15, 128, 5, 229, 31,
- 253, 146, 15, 128, 5, 133, 247, 139, 15, 128, 5, 243, 237, 247, 139, 15,
- 128, 5, 244, 50, 247, 139, 15, 128, 5, 220, 53, 247, 139, 15, 128, 5,
- 221, 43, 247, 139, 15, 128, 5, 245, 150, 247, 139, 15, 128, 5, 229, 31,
- 247, 139, 15, 128, 5, 243, 237, 69, 15, 128, 5, 244, 50, 69, 15, 128, 5,
- 220, 53, 69, 15, 128, 5, 221, 43, 69, 15, 128, 5, 245, 150, 69, 15, 128,
- 5, 229, 31, 69, 15, 128, 5, 122, 243, 14, 15, 128, 5, 117, 243, 14, 15,
- 128, 5, 133, 243, 14, 15, 128, 5, 243, 237, 243, 14, 15, 128, 5, 244, 50,
- 243, 14, 15, 128, 5, 220, 53, 243, 14, 15, 128, 5, 221, 43, 243, 14, 15,
- 128, 5, 245, 150, 243, 14, 15, 128, 5, 229, 31, 243, 14, 15, 128, 5, 122,
- 243, 11, 15, 128, 5, 117, 243, 11, 15, 128, 5, 133, 243, 11, 15, 128, 5,
- 243, 237, 243, 11, 15, 128, 5, 244, 50, 243, 11, 15, 128, 5, 117, 221, 1,
- 15, 128, 5, 133, 221, 1, 15, 128, 5, 133, 221, 2, 214, 244, 17, 15, 128,
- 5, 243, 237, 221, 1, 15, 128, 5, 244, 50, 221, 1, 15, 128, 5, 220, 53,
- 221, 1, 15, 128, 5, 221, 43, 221, 1, 15, 128, 5, 245, 150, 221, 1, 15,
- 128, 5, 229, 31, 221, 1, 15, 128, 5, 122, 220, 252, 15, 128, 5, 117, 220,
- 252, 15, 128, 5, 133, 220, 252, 15, 128, 5, 133, 220, 253, 214, 244, 17,
- 15, 128, 5, 243, 237, 220, 252, 15, 128, 5, 244, 50, 220, 252, 15, 128,
- 5, 221, 2, 29, 243, 95, 94, 247, 139, 15, 128, 5, 221, 2, 29, 243, 95,
- 94, 231, 1, 15, 128, 5, 122, 251, 24, 15, 128, 5, 117, 251, 24, 15, 128,
- 5, 133, 251, 24, 15, 128, 5, 133, 251, 25, 214, 244, 17, 15, 128, 5, 243,
- 237, 251, 24, 15, 128, 5, 244, 50, 251, 24, 15, 128, 5, 133, 214, 244,
- 243, 245, 245, 39, 15, 128, 5, 133, 214, 244, 243, 245, 245, 36, 15, 128,
- 5, 243, 237, 214, 244, 243, 245, 232, 246, 15, 128, 5, 243, 237, 214,
- 244, 243, 245, 232, 244, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232,
- 247, 61, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232, 247, 253, 74, 15,
- 128, 5, 220, 53, 214, 244, 243, 245, 253, 143, 15, 128, 5, 221, 43, 214,
- 244, 243, 245, 236, 3, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5,
- 61, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5, 253, 74, 15, 128, 5,
- 245, 150, 214, 244, 243, 245, 215, 95, 15, 128, 5, 245, 150, 214, 244,
- 243, 245, 215, 94, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 19, 15,
- 128, 5, 229, 31, 214, 244, 243, 245, 236, 18, 15, 128, 5, 229, 31, 214,
- 244, 243, 245, 236, 17, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 20,
- 61, 15, 128, 5, 117, 253, 147, 217, 192, 15, 128, 5, 133, 253, 147, 217,
- 192, 15, 128, 5, 243, 237, 253, 147, 217, 192, 15, 128, 5, 244, 50, 253,
- 147, 217, 192, 15, 128, 5, 220, 53, 253, 147, 217, 192, 15, 128, 5, 122,
- 252, 69, 15, 128, 5, 117, 252, 69, 15, 128, 5, 133, 252, 69, 15, 128, 5,
- 243, 237, 252, 69, 15, 128, 5, 243, 237, 252, 70, 214, 244, 17, 15, 128,
- 5, 244, 50, 252, 69, 15, 128, 5, 244, 50, 252, 70, 214, 244, 17, 15, 128,
- 5, 229, 41, 15, 128, 5, 229, 42, 15, 128, 5, 122, 245, 35, 15, 128, 5,
- 117, 245, 35, 15, 128, 5, 122, 217, 122, 247, 139, 15, 128, 5, 117, 217,
- 120, 247, 139, 15, 128, 5, 244, 50, 220, 42, 247, 139, 15, 128, 5, 122,
- 217, 122, 214, 244, 243, 245, 61, 15, 128, 5, 117, 217, 120, 214, 244,
- 243, 245, 61, 15, 128, 5, 122, 245, 146, 253, 146, 15, 128, 5, 122, 224,
- 167, 253, 146, 15, 128, 5, 53, 253, 135, 122, 220, 43, 15, 128, 5, 53,
- 253, 135, 122, 224, 166, 15, 225, 27, 5, 53, 253, 135, 213, 196, 247,
- 124, 15, 225, 27, 5, 71, 249, 164, 15, 225, 27, 5, 247, 207, 249, 164,
- 15, 225, 27, 5, 247, 207, 216, 179, 10, 11, 255, 58, 10, 11, 255, 57, 10,
- 11, 255, 56, 10, 11, 255, 55, 10, 11, 255, 54, 10, 11, 255, 53, 10, 11,
- 255, 52, 10, 11, 255, 51, 10, 11, 255, 50, 10, 11, 255, 49, 10, 11, 255,
- 48, 10, 11, 255, 47, 10, 11, 255, 46, 10, 11, 255, 45, 10, 11, 255, 44,
- 10, 11, 255, 43, 10, 11, 255, 42, 10, 11, 255, 41, 10, 11, 255, 40, 10,
- 11, 255, 39, 10, 11, 255, 38, 10, 11, 255, 37, 10, 11, 255, 36, 10, 11,
- 255, 35, 10, 11, 255, 34, 10, 11, 255, 33, 10, 11, 255, 32, 10, 11, 255,
- 31, 10, 11, 255, 30, 10, 11, 255, 29, 10, 11, 255, 28, 10, 11, 255, 27,
- 10, 11, 255, 26, 10, 11, 255, 25, 10, 11, 255, 24, 10, 11, 255, 23, 10,
- 11, 255, 22, 10, 11, 255, 21, 10, 11, 255, 20, 10, 11, 255, 19, 10, 11,
- 255, 18, 10, 11, 255, 17, 10, 11, 255, 16, 10, 11, 255, 15, 10, 11, 255,
- 14, 10, 11, 255, 13, 10, 11, 255, 12, 10, 11, 255, 11, 10, 11, 255, 10,
- 10, 11, 255, 9, 10, 11, 255, 8, 10, 11, 255, 7, 10, 11, 255, 6, 10, 11,
- 255, 5, 10, 11, 255, 4, 10, 11, 255, 3, 10, 11, 255, 2, 10, 11, 255, 1,
- 10, 11, 255, 0, 10, 11, 254, 255, 10, 11, 254, 254, 10, 11, 254, 253, 10,
- 11, 254, 252, 10, 11, 254, 251, 10, 11, 254, 250, 10, 11, 254, 249, 10,
- 11, 254, 248, 10, 11, 254, 247, 10, 11, 254, 246, 10, 11, 254, 245, 10,
- 11, 254, 244, 10, 11, 254, 243, 10, 11, 254, 242, 10, 11, 254, 241, 10,
- 11, 254, 240, 10, 11, 254, 239, 10, 11, 254, 238, 10, 11, 254, 237, 10,
- 11, 254, 236, 10, 11, 254, 235, 10, 11, 253, 72, 10, 11, 253, 70, 10, 11,
- 253, 68, 10, 11, 253, 66, 10, 11, 253, 64, 10, 11, 253, 63, 10, 11, 253,
- 61, 10, 11, 253, 59, 10, 11, 253, 57, 10, 11, 253, 55, 10, 11, 250, 248,
- 10, 11, 250, 247, 10, 11, 250, 246, 10, 11, 250, 245, 10, 11, 250, 244,
- 10, 11, 250, 243, 10, 11, 250, 242, 10, 11, 250, 241, 10, 11, 250, 240,
- 10, 11, 250, 239, 10, 11, 250, 238, 10, 11, 250, 237, 10, 11, 250, 236,
- 10, 11, 250, 235, 10, 11, 250, 234, 10, 11, 250, 233, 10, 11, 250, 232,
- 10, 11, 250, 231, 10, 11, 250, 230, 10, 11, 250, 229, 10, 11, 250, 228,
- 10, 11, 250, 227, 10, 11, 250, 226, 10, 11, 250, 225, 10, 11, 250, 224,
- 10, 11, 250, 223, 10, 11, 250, 222, 10, 11, 250, 221, 10, 11, 249, 2, 10,
- 11, 249, 1, 10, 11, 249, 0, 10, 11, 248, 255, 10, 11, 248, 254, 10, 11,
- 248, 253, 10, 11, 248, 252, 10, 11, 248, 251, 10, 11, 248, 250, 10, 11,
- 248, 249, 10, 11, 248, 248, 10, 11, 248, 247, 10, 11, 248, 246, 10, 11,
- 248, 245, 10, 11, 248, 244, 10, 11, 248, 243, 10, 11, 248, 242, 10, 11,
- 248, 241, 10, 11, 248, 240, 10, 11, 248, 239, 10, 11, 248, 238, 10, 11,
- 248, 237, 10, 11, 248, 236, 10, 11, 248, 235, 10, 11, 248, 234, 10, 11,
- 248, 233, 10, 11, 248, 232, 10, 11, 248, 231, 10, 11, 248, 230, 10, 11,
- 248, 229, 10, 11, 248, 228, 10, 11, 248, 227, 10, 11, 248, 226, 10, 11,
- 248, 225, 10, 11, 248, 224, 10, 11, 248, 223, 10, 11, 248, 222, 10, 11,
- 248, 221, 10, 11, 248, 220, 10, 11, 248, 219, 10, 11, 248, 218, 10, 11,
- 248, 217, 10, 11, 248, 216, 10, 11, 248, 215, 10, 11, 248, 214, 10, 11,
- 248, 213, 10, 11, 248, 212, 10, 11, 248, 211, 10, 11, 248, 210, 10, 11,
- 248, 209, 10, 11, 248, 208, 10, 11, 248, 207, 10, 11, 248, 206, 10, 11,
- 248, 205, 10, 11, 248, 204, 10, 11, 248, 203, 10, 11, 248, 202, 10, 11,
- 248, 201, 10, 11, 248, 200, 10, 11, 248, 199, 10, 11, 248, 198, 10, 11,
- 248, 197, 10, 11, 248, 196, 10, 11, 248, 195, 10, 11, 248, 194, 10, 11,
- 248, 193, 10, 11, 248, 192, 10, 11, 248, 191, 10, 11, 248, 190, 10, 11,
- 248, 189, 10, 11, 248, 188, 10, 11, 248, 187, 10, 11, 248, 186, 10, 11,
- 248, 185, 10, 11, 248, 184, 10, 11, 248, 183, 10, 11, 248, 182, 10, 11,
- 248, 181, 10, 11, 248, 180, 10, 11, 248, 179, 10, 11, 248, 178, 10, 11,
- 248, 177, 10, 11, 248, 176, 10, 11, 248, 175, 10, 11, 248, 174, 10, 11,
- 248, 173, 10, 11, 248, 172, 10, 11, 248, 171, 10, 11, 248, 170, 10, 11,
- 248, 169, 10, 11, 248, 168, 10, 11, 248, 167, 10, 11, 245, 235, 10, 11,
- 245, 234, 10, 11, 245, 233, 10, 11, 245, 232, 10, 11, 245, 231, 10, 11,
- 245, 230, 10, 11, 245, 229, 10, 11, 245, 228, 10, 11, 245, 227, 10, 11,
- 245, 226, 10, 11, 245, 225, 10, 11, 245, 224, 10, 11, 245, 223, 10, 11,
- 245, 222, 10, 11, 245, 221, 10, 11, 245, 220, 10, 11, 245, 219, 10, 11,
- 245, 218, 10, 11, 245, 217, 10, 11, 245, 216, 10, 11, 245, 215, 10, 11,
- 245, 214, 10, 11, 245, 213, 10, 11, 245, 212, 10, 11, 245, 211, 10, 11,
- 245, 210, 10, 11, 245, 209, 10, 11, 245, 208, 10, 11, 245, 207, 10, 11,
- 245, 206, 10, 11, 245, 205, 10, 11, 245, 204, 10, 11, 245, 203, 10, 11,
- 245, 202, 10, 11, 245, 201, 10, 11, 245, 200, 10, 11, 245, 199, 10, 11,
- 245, 198, 10, 11, 245, 197, 10, 11, 245, 196, 10, 11, 245, 195, 10, 11,
- 245, 194, 10, 11, 245, 193, 10, 11, 245, 192, 10, 11, 244, 229, 10, 11,
- 244, 228, 10, 11, 244, 227, 10, 11, 244, 226, 10, 11, 244, 225, 10, 11,
- 244, 224, 10, 11, 244, 223, 10, 11, 244, 222, 10, 11, 244, 221, 10, 11,
- 244, 220, 10, 11, 244, 219, 10, 11, 244, 218, 10, 11, 244, 217, 10, 11,
- 244, 216, 10, 11, 244, 215, 10, 11, 244, 214, 10, 11, 244, 213, 10, 11,
- 244, 212, 10, 11, 244, 211, 10, 11, 244, 210, 10, 11, 244, 209, 10, 11,
- 244, 208, 10, 11, 244, 207, 10, 11, 244, 206, 10, 11, 244, 205, 10, 11,
- 244, 204, 10, 11, 244, 203, 10, 11, 244, 202, 10, 11, 244, 201, 10, 11,
- 244, 200, 10, 11, 244, 199, 10, 11, 244, 198, 10, 11, 244, 197, 10, 11,
- 244, 196, 10, 11, 244, 195, 10, 11, 244, 194, 10, 11, 244, 193, 10, 11,
- 244, 192, 10, 11, 244, 191, 10, 11, 244, 190, 10, 11, 244, 189, 10, 11,
- 244, 188, 10, 11, 244, 187, 10, 11, 244, 186, 10, 11, 244, 185, 10, 11,
- 244, 184, 10, 11, 244, 183, 10, 11, 244, 182, 10, 11, 244, 181, 10, 11,
- 244, 180, 10, 11, 244, 179, 10, 11, 244, 178, 10, 11, 244, 177, 10, 11,
- 244, 176, 10, 11, 244, 175, 10, 11, 244, 174, 10, 11, 244, 173, 10, 11,
- 244, 172, 10, 11, 244, 171, 10, 11, 244, 170, 10, 11, 244, 169, 10, 11,
- 244, 168, 10, 11, 244, 167, 10, 11, 244, 166, 10, 11, 244, 165, 10, 11,
- 243, 176, 10, 11, 243, 175, 10, 11, 243, 174, 10, 11, 243, 173, 10, 11,
- 243, 172, 10, 11, 243, 171, 10, 11, 243, 170, 10, 11, 243, 169, 10, 11,
- 243, 168, 10, 11, 243, 167, 10, 11, 243, 166, 10, 11, 243, 165, 10, 11,
- 243, 164, 10, 11, 243, 163, 10, 11, 243, 162, 10, 11, 243, 161, 10, 11,
- 243, 160, 10, 11, 243, 159, 10, 11, 243, 158, 10, 11, 243, 157, 10, 11,
- 243, 156, 10, 11, 243, 155, 10, 11, 243, 154, 10, 11, 243, 153, 10, 11,
- 243, 152, 10, 11, 243, 151, 10, 11, 243, 150, 10, 11, 243, 149, 10, 11,
- 243, 148, 10, 11, 243, 147, 10, 11, 243, 146, 10, 11, 243, 145, 10, 11,
- 243, 144, 10, 11, 243, 143, 10, 11, 243, 142, 10, 11, 243, 141, 10, 11,
- 243, 140, 10, 11, 243, 139, 10, 11, 243, 138, 10, 11, 243, 137, 10, 11,
- 243, 136, 10, 11, 243, 135, 10, 11, 243, 134, 10, 11, 243, 133, 10, 11,
- 243, 132, 10, 11, 243, 131, 10, 11, 243, 130, 10, 11, 243, 129, 10, 11,
- 243, 128, 10, 11, 243, 127, 10, 11, 243, 126, 10, 11, 243, 125, 10, 11,
- 243, 124, 10, 11, 243, 123, 10, 11, 243, 122, 10, 11, 243, 121, 10, 11,
- 243, 120, 10, 11, 243, 119, 10, 11, 243, 118, 10, 11, 243, 117, 10, 11,
- 243, 116, 10, 11, 243, 115, 10, 11, 243, 114, 10, 11, 243, 113, 10, 11,
- 242, 39, 10, 11, 242, 38, 10, 11, 242, 37, 10, 11, 242, 36, 10, 11, 242,
- 35, 10, 11, 242, 34, 10, 11, 242, 33, 10, 11, 242, 32, 10, 11, 242, 31,
- 10, 11, 240, 130, 10, 11, 240, 129, 10, 11, 240, 128, 10, 11, 240, 127,
- 10, 11, 240, 126, 10, 11, 240, 125, 10, 11, 240, 124, 10, 11, 240, 123,
- 10, 11, 240, 122, 10, 11, 240, 121, 10, 11, 240, 120, 10, 11, 240, 119,
- 10, 11, 240, 118, 10, 11, 240, 117, 10, 11, 240, 116, 10, 11, 240, 115,
- 10, 11, 240, 114, 10, 11, 240, 113, 10, 11, 240, 112, 10, 11, 235, 26,
- 10, 11, 235, 25, 10, 11, 235, 24, 10, 11, 235, 23, 10, 11, 235, 22, 10,
- 11, 235, 21, 10, 11, 235, 20, 10, 11, 235, 19, 10, 11, 233, 168, 10, 11,
- 233, 167, 10, 11, 233, 166, 10, 11, 233, 165, 10, 11, 233, 164, 10, 11,
- 233, 163, 10, 11, 233, 162, 10, 11, 233, 161, 10, 11, 233, 160, 10, 11,
- 233, 159, 10, 11, 232, 109, 10, 11, 232, 108, 10, 11, 232, 107, 10, 11,
- 232, 106, 10, 11, 232, 105, 10, 11, 232, 104, 10, 11, 232, 103, 10, 11,
- 232, 102, 10, 11, 232, 101, 10, 11, 232, 100, 10, 11, 232, 99, 10, 11,
- 232, 98, 10, 11, 232, 97, 10, 11, 232, 96, 10, 11, 232, 95, 10, 11, 232,
- 94, 10, 11, 232, 93, 10, 11, 232, 92, 10, 11, 232, 91, 10, 11, 232, 90,
- 10, 11, 232, 89, 10, 11, 232, 88, 10, 11, 232, 87, 10, 11, 232, 86, 10,
- 11, 232, 85, 10, 11, 232, 84, 10, 11, 232, 83, 10, 11, 232, 82, 10, 11,
- 232, 81, 10, 11, 232, 80, 10, 11, 232, 79, 10, 11, 232, 78, 10, 11, 232,
- 77, 10, 11, 232, 76, 10, 11, 232, 75, 10, 11, 232, 74, 10, 11, 232, 73,
- 10, 11, 232, 72, 10, 11, 232, 71, 10, 11, 232, 70, 10, 11, 232, 69, 10,
- 11, 232, 68, 10, 11, 232, 67, 10, 11, 232, 66, 10, 11, 232, 65, 10, 11,
- 232, 64, 10, 11, 232, 63, 10, 11, 232, 62, 10, 11, 232, 61, 10, 11, 232,
- 60, 10, 11, 232, 59, 10, 11, 232, 58, 10, 11, 232, 57, 10, 11, 232, 56,
- 10, 11, 232, 55, 10, 11, 232, 54, 10, 11, 232, 53, 10, 11, 232, 52, 10,
- 11, 232, 51, 10, 11, 232, 50, 10, 11, 232, 49, 10, 11, 232, 48, 10, 11,
- 232, 47, 10, 11, 232, 46, 10, 11, 232, 45, 10, 11, 232, 44, 10, 11, 230,
- 95, 10, 11, 230, 94, 10, 11, 230, 93, 10, 11, 230, 92, 10, 11, 230, 91,
- 10, 11, 230, 90, 10, 11, 230, 89, 10, 11, 230, 88, 10, 11, 230, 87, 10,
- 11, 230, 86, 10, 11, 230, 85, 10, 11, 230, 84, 10, 11, 230, 83, 10, 11,
- 230, 82, 10, 11, 230, 81, 10, 11, 230, 80, 10, 11, 230, 79, 10, 11, 230,
- 78, 10, 11, 230, 77, 10, 11, 230, 76, 10, 11, 230, 75, 10, 11, 230, 74,
- 10, 11, 230, 73, 10, 11, 230, 72, 10, 11, 230, 71, 10, 11, 230, 70, 10,
- 11, 230, 69, 10, 11, 230, 68, 10, 11, 230, 67, 10, 11, 230, 66, 10, 11,
- 230, 65, 10, 11, 230, 64, 10, 11, 230, 63, 10, 11, 230, 62, 10, 11, 230,
- 61, 10, 11, 230, 60, 10, 11, 230, 59, 10, 11, 230, 58, 10, 11, 230, 57,
- 10, 11, 230, 56, 10, 11, 230, 55, 10, 11, 230, 54, 10, 11, 230, 53, 10,
- 11, 230, 52, 10, 11, 230, 51, 10, 11, 230, 50, 10, 11, 230, 49, 10, 11,
- 230, 48, 10, 11, 230, 47, 10, 11, 228, 222, 10, 11, 228, 221, 10, 11,
- 228, 220, 10, 11, 228, 219, 10, 11, 228, 218, 10, 11, 228, 217, 10, 11,
- 228, 216, 10, 11, 228, 215, 10, 11, 228, 214, 10, 11, 228, 213, 10, 11,
- 228, 212, 10, 11, 228, 211, 10, 11, 228, 210, 10, 11, 228, 209, 10, 11,
- 228, 208, 10, 11, 228, 207, 10, 11, 228, 206, 10, 11, 228, 205, 10, 11,
- 228, 204, 10, 11, 228, 203, 10, 11, 228, 202, 10, 11, 228, 201, 10, 11,
- 228, 91, 10, 11, 228, 90, 10, 11, 228, 89, 10, 11, 228, 88, 10, 11, 228,
- 87, 10, 11, 228, 86, 10, 11, 228, 85, 10, 11, 228, 84, 10, 11, 228, 83,
- 10, 11, 228, 82, 10, 11, 228, 81, 10, 11, 228, 80, 10, 11, 228, 79, 10,
- 11, 228, 78, 10, 11, 228, 77, 10, 11, 228, 76, 10, 11, 228, 75, 10, 11,
- 228, 74, 10, 11, 228, 73, 10, 11, 228, 72, 10, 11, 228, 71, 10, 11, 228,
- 70, 10, 11, 228, 69, 10, 11, 228, 68, 10, 11, 228, 67, 10, 11, 228, 66,
- 10, 11, 227, 196, 10, 11, 227, 195, 10, 11, 227, 194, 10, 11, 227, 193,
- 10, 11, 227, 192, 10, 11, 227, 191, 10, 11, 227, 190, 10, 11, 227, 189,
- 10, 11, 227, 188, 10, 11, 227, 187, 10, 11, 227, 186, 10, 11, 227, 185,
- 10, 11, 227, 184, 10, 11, 227, 183, 10, 11, 227, 182, 10, 11, 227, 181,
- 10, 11, 227, 180, 10, 11, 227, 179, 10, 11, 227, 178, 10, 11, 227, 177,
- 10, 11, 227, 176, 10, 11, 227, 175, 10, 11, 227, 174, 10, 11, 227, 173,
- 10, 11, 227, 172, 10, 11, 227, 171, 10, 11, 227, 170, 10, 11, 227, 169,
- 10, 11, 227, 168, 10, 11, 227, 167, 10, 11, 227, 166, 10, 11, 227, 165,
- 10, 11, 227, 164, 10, 11, 227, 163, 10, 11, 227, 162, 10, 11, 227, 161,
- 10, 11, 227, 160, 10, 11, 227, 159, 10, 11, 227, 158, 10, 11, 227, 157,
- 10, 11, 227, 156, 10, 11, 227, 155, 10, 11, 227, 154, 10, 11, 227, 153,
- 10, 11, 227, 152, 10, 11, 227, 151, 10, 11, 227, 150, 10, 11, 227, 149,
- 10, 11, 227, 148, 10, 11, 227, 147, 10, 11, 227, 146, 10, 11, 227, 145,
- 10, 11, 227, 144, 10, 11, 227, 143, 10, 11, 227, 142, 10, 11, 227, 141,
- 10, 11, 227, 140, 10, 11, 227, 139, 10, 11, 227, 138, 10, 11, 227, 137,
- 10, 11, 227, 136, 10, 11, 227, 135, 10, 11, 227, 134, 10, 11, 227, 133,
- 10, 11, 227, 132, 10, 11, 227, 131, 10, 11, 227, 130, 10, 11, 227, 129,
- 10, 11, 227, 128, 10, 11, 227, 127, 10, 11, 227, 126, 10, 11, 227, 125,
- 10, 11, 227, 124, 10, 11, 227, 123, 10, 11, 227, 122, 10, 11, 226, 228,
- 10, 11, 226, 227, 10, 11, 226, 226, 10, 11, 226, 225, 10, 11, 226, 224,
- 10, 11, 226, 223, 10, 11, 226, 222, 10, 11, 226, 221, 10, 11, 226, 220,
- 10, 11, 226, 219, 10, 11, 226, 218, 10, 11, 226, 217, 10, 11, 226, 216,
- 10, 11, 224, 239, 10, 11, 224, 238, 10, 11, 224, 237, 10, 11, 224, 236,
- 10, 11, 224, 235, 10, 11, 224, 234, 10, 11, 224, 233, 10, 11, 224, 111,
- 10, 11, 224, 110, 10, 11, 224, 109, 10, 11, 224, 108, 10, 11, 224, 107,
- 10, 11, 224, 106, 10, 11, 224, 105, 10, 11, 224, 104, 10, 11, 224, 103,
- 10, 11, 224, 102, 10, 11, 224, 101, 10, 11, 224, 100, 10, 11, 224, 99,
- 10, 11, 224, 98, 10, 11, 224, 97, 10, 11, 224, 96, 10, 11, 224, 95, 10,
- 11, 224, 94, 10, 11, 224, 93, 10, 11, 224, 92, 10, 11, 224, 91, 10, 11,
- 224, 90, 10, 11, 224, 89, 10, 11, 224, 88, 10, 11, 224, 87, 10, 11, 224,
- 86, 10, 11, 224, 85, 10, 11, 224, 84, 10, 11, 224, 83, 10, 11, 224, 82,
- 10, 11, 224, 81, 10, 11, 224, 80, 10, 11, 224, 79, 10, 11, 224, 78, 10,
- 11, 223, 1, 10, 11, 223, 0, 10, 11, 222, 255, 10, 11, 222, 254, 10, 11,
- 222, 253, 10, 11, 222, 252, 10, 11, 222, 251, 10, 11, 222, 250, 10, 11,
- 222, 249, 10, 11, 222, 248, 10, 11, 222, 247, 10, 11, 222, 246, 10, 11,
- 222, 245, 10, 11, 222, 244, 10, 11, 222, 243, 10, 11, 222, 242, 10, 11,
- 222, 241, 10, 11, 222, 240, 10, 11, 222, 239, 10, 11, 222, 238, 10, 11,
- 222, 237, 10, 11, 222, 236, 10, 11, 222, 235, 10, 11, 222, 234, 10, 11,
- 222, 233, 10, 11, 222, 232, 10, 11, 222, 231, 10, 11, 222, 230, 10, 11,
- 222, 229, 10, 11, 222, 228, 10, 11, 222, 227, 10, 11, 222, 226, 10, 11,
- 222, 225, 10, 11, 222, 224, 10, 11, 222, 223, 10, 11, 222, 222, 10, 11,
- 222, 221, 10, 11, 222, 220, 10, 11, 222, 219, 10, 11, 222, 218, 10, 11,
- 222, 217, 10, 11, 222, 216, 10, 11, 222, 215, 10, 11, 222, 214, 10, 11,
- 222, 213, 10, 11, 222, 212, 10, 11, 222, 211, 10, 11, 222, 210, 10, 11,
- 222, 209, 10, 11, 222, 208, 10, 11, 222, 207, 10, 11, 222, 206, 10, 11,
- 222, 205, 10, 11, 222, 204, 10, 11, 218, 97, 10, 11, 218, 96, 10, 11,
- 218, 95, 10, 11, 218, 94, 10, 11, 218, 93, 10, 11, 218, 92, 10, 11, 218,
- 91, 10, 11, 218, 90, 10, 11, 218, 89, 10, 11, 218, 88, 10, 11, 218, 87,
- 10, 11, 218, 86, 10, 11, 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10,
- 11, 218, 82, 10, 11, 218, 81, 10, 11, 218, 80, 10, 11, 218, 79, 10, 11,
- 218, 78, 10, 11, 218, 77, 10, 11, 218, 76, 10, 11, 218, 75, 10, 11, 218,
- 74, 10, 11, 218, 73, 10, 11, 218, 72, 10, 11, 218, 71, 10, 11, 218, 70,
- 10, 11, 218, 69, 10, 11, 218, 68, 10, 11, 218, 67, 10, 11, 218, 66, 10,
- 11, 218, 65, 10, 11, 218, 64, 10, 11, 218, 63, 10, 11, 218, 62, 10, 11,
- 218, 61, 10, 11, 218, 60, 10, 11, 218, 59, 10, 11, 218, 58, 10, 11, 218,
- 57, 10, 11, 218, 56, 10, 11, 218, 55, 10, 11, 218, 54, 10, 11, 215, 245,
- 10, 11, 215, 244, 10, 11, 215, 243, 10, 11, 215, 242, 10, 11, 215, 241,
- 10, 11, 215, 240, 10, 11, 215, 239, 10, 11, 215, 238, 10, 11, 215, 237,
- 10, 11, 215, 236, 10, 11, 215, 235, 10, 11, 215, 234, 10, 11, 215, 233,
- 10, 11, 215, 232, 10, 11, 215, 231, 10, 11, 215, 230, 10, 11, 215, 229,
- 10, 11, 215, 228, 10, 11, 215, 227, 10, 11, 215, 226, 10, 11, 215, 225,
- 10, 11, 215, 224, 10, 11, 215, 223, 10, 11, 215, 222, 10, 11, 215, 221,
- 10, 11, 215, 220, 10, 11, 215, 219, 10, 11, 215, 218, 10, 11, 215, 217,
- 10, 11, 215, 216, 10, 11, 215, 215, 10, 11, 215, 214, 10, 11, 215, 213,
- 10, 11, 215, 212, 10, 11, 215, 211, 10, 11, 215, 210, 10, 11, 215, 209,
- 10, 11, 215, 208, 10, 11, 215, 207, 10, 11, 215, 206, 10, 11, 215, 205,
- 10, 11, 215, 204, 10, 11, 215, 203, 10, 11, 215, 202, 10, 11, 215, 201,
- 10, 11, 215, 200, 10, 11, 215, 199, 10, 11, 215, 78, 10, 11, 215, 77, 10,
- 11, 215, 76, 10, 11, 215, 75, 10, 11, 215, 74, 10, 11, 215, 73, 10, 11,
- 215, 72, 10, 11, 215, 71, 10, 11, 215, 70, 10, 11, 215, 69, 10, 11, 215,
- 68, 10, 11, 215, 67, 10, 11, 215, 66, 10, 11, 215, 65, 10, 11, 215, 64,
- 10, 11, 215, 63, 10, 11, 215, 62, 10, 11, 215, 61, 10, 11, 215, 60, 10,
- 11, 215, 59, 10, 11, 215, 58, 10, 11, 215, 57, 10, 11, 215, 56, 10, 11,
- 215, 55, 10, 11, 215, 54, 10, 11, 215, 53, 10, 11, 215, 52, 10, 11, 215,
- 51, 10, 11, 215, 50, 10, 11, 215, 49, 10, 11, 215, 48, 10, 11, 215, 47,
- 10, 11, 215, 46, 10, 11, 215, 45, 10, 11, 215, 44, 10, 11, 215, 43, 10,
- 11, 215, 42, 10, 11, 215, 41, 10, 11, 215, 40, 10, 11, 215, 39, 10, 11,
- 215, 38, 10, 11, 215, 37, 10, 11, 215, 36, 10, 11, 215, 35, 10, 11, 215,
- 34, 10, 11, 215, 33, 10, 11, 215, 32, 10, 11, 215, 31, 10, 11, 215, 30,
- 10, 11, 215, 29, 10, 11, 215, 28, 10, 11, 215, 27, 10, 11, 215, 26, 10,
- 11, 215, 25, 10, 11, 215, 24, 10, 11, 215, 23, 10, 11, 215, 22, 10, 11,
- 215, 21, 10, 11, 215, 20, 10, 11, 215, 19, 10, 11, 215, 18, 10, 11, 215,
- 17, 10, 11, 215, 16, 10, 11, 215, 15, 10, 11, 215, 14, 10, 11, 215, 13,
- 10, 11, 215, 12, 10, 11, 215, 11, 10, 11, 215, 10, 10, 11, 215, 9, 10,
- 11, 215, 8, 10, 11, 215, 7, 10, 11, 215, 6, 10, 11, 215, 5, 10, 11, 215,
- 4, 10, 11, 215, 3, 10, 11, 215, 2, 10, 11, 214, 81, 10, 11, 214, 80, 10,
- 11, 214, 79, 10, 11, 214, 78, 10, 11, 214, 77, 10, 11, 214, 76, 10, 11,
- 214, 75, 10, 11, 214, 74, 10, 11, 214, 73, 10, 11, 214, 72, 10, 11, 214,
- 71, 10, 11, 214, 70, 10, 11, 214, 69, 10, 11, 214, 68, 10, 11, 214, 67,
- 10, 11, 214, 66, 10, 11, 214, 65, 10, 11, 214, 64, 10, 11, 214, 63, 10,
- 11, 214, 62, 10, 11, 214, 61, 10, 11, 214, 60, 10, 11, 214, 59, 10, 11,
- 214, 58, 10, 11, 214, 57, 10, 11, 214, 56, 10, 11, 214, 55, 10, 11, 214,
- 54, 10, 11, 214, 53, 10, 11, 214, 52, 10, 11, 214, 51, 10, 11, 214, 50,
- 10, 11, 213, 165, 10, 11, 213, 164, 10, 11, 213, 163, 10, 11, 213, 162,
- 10, 11, 213, 161, 10, 11, 213, 160, 10, 11, 213, 159, 10, 11, 213, 158,
- 10, 11, 213, 157, 10, 11, 213, 156, 10, 11, 213, 155, 10, 11, 213, 154,
- 10, 11, 213, 103, 10, 11, 213, 102, 10, 11, 213, 101, 10, 11, 213, 100,
- 10, 11, 213, 99, 10, 11, 213, 98, 10, 11, 213, 97, 10, 11, 213, 96, 10,
- 11, 213, 95, 10, 11, 212, 151, 10, 11, 212, 150, 10, 11, 212, 149, 10,
- 11, 212, 148, 10, 11, 212, 147, 10, 11, 212, 146, 10, 11, 212, 145, 10,
- 11, 212, 144, 10, 11, 212, 143, 10, 11, 212, 142, 10, 11, 212, 141, 10,
- 11, 212, 140, 10, 11, 212, 139, 10, 11, 212, 138, 10, 11, 212, 137, 10,
- 11, 212, 136, 10, 11, 212, 135, 10, 11, 212, 134, 10, 11, 212, 133, 10,
- 11, 212, 132, 10, 11, 212, 131, 10, 11, 212, 130, 10, 11, 212, 129, 10,
- 11, 212, 128, 10, 11, 212, 127, 10, 11, 212, 126, 10, 11, 212, 125, 10,
- 11, 212, 124, 10, 11, 212, 123, 10, 11, 212, 122, 10, 11, 212, 121, 10,
- 11, 212, 120, 10, 11, 212, 119, 10, 11, 212, 118, 10, 11, 212, 117, 10,
- 11, 212, 116, 10, 11, 212, 115, 10, 11, 212, 114, 10, 11, 212, 113, 10,
- 11, 212, 112, 10, 11, 212, 111, 10, 11, 254, 231, 10, 11, 254, 230, 10,
- 11, 254, 229, 10, 11, 254, 228, 10, 11, 254, 227, 10, 11, 254, 226, 10,
- 11, 254, 225, 10, 11, 254, 224, 10, 11, 254, 223, 10, 11, 254, 222, 10,
- 11, 254, 221, 10, 11, 254, 220, 10, 11, 254, 219, 10, 11, 254, 218, 10,
- 11, 254, 217, 10, 11, 254, 216, 10, 11, 254, 215, 10, 11, 254, 214, 10,
- 11, 254, 213, 10, 11, 254, 212, 10, 11, 254, 211, 10, 11, 254, 210, 10,
- 11, 254, 209, 10, 11, 254, 208, 10, 11, 254, 207, 10, 11, 254, 206, 10,
- 11, 254, 205, 10, 11, 254, 204, 10, 11, 254, 203, 10, 11, 254, 202, 10,
- 11, 254, 201, 10, 11, 254, 200, 10, 11, 254, 199, 10, 11, 254, 198, 20,
- 1, 153, 229, 98, 231, 83, 20, 1, 153, 243, 46, 244, 5, 20, 1, 153, 225,
- 131, 231, 84, 225, 189, 20, 1, 153, 225, 131, 231, 84, 225, 190, 20, 1,
- 153, 230, 44, 231, 83, 20, 1, 153, 220, 146, 20, 1, 153, 217, 19, 231,
- 83, 20, 1, 153, 227, 238, 231, 83, 20, 1, 153, 220, 199, 226, 214, 229,
- 0, 20, 1, 153, 225, 131, 226, 214, 229, 1, 225, 189, 20, 1, 153, 225,
- 131, 226, 214, 229, 1, 225, 190, 20, 1, 153, 232, 23, 20, 1, 153, 216,
- 83, 232, 24, 20, 1, 153, 229, 154, 20, 1, 153, 232, 20, 20, 1, 153, 231,
- 239, 20, 1, 153, 230, 119, 20, 1, 153, 221, 45, 20, 1, 153, 228, 96, 20,
- 1, 153, 234, 155, 20, 1, 153, 228, 225, 20, 1, 153, 218, 205, 20, 1, 153,
- 229, 97, 20, 1, 153, 233, 110, 20, 1, 153, 233, 36, 233, 210, 20, 1, 153,
- 228, 103, 231, 91, 20, 1, 153, 232, 27, 20, 1, 153, 226, 119, 20, 1, 153,
- 242, 207, 20, 1, 153, 226, 177, 20, 1, 153, 230, 221, 229, 130, 20, 1,
- 153, 227, 219, 231, 94, 20, 1, 153, 111, 212, 179, 230, 38, 20, 1, 153,
- 242, 208, 20, 1, 153, 228, 103, 228, 104, 20, 1, 153, 220, 56, 20, 1,
- 153, 231, 76, 20, 1, 153, 231, 97, 20, 1, 153, 230, 200, 20, 1, 153, 234,
- 253, 20, 1, 153, 226, 214, 233, 71, 20, 1, 153, 229, 229, 233, 71, 20, 1,
- 153, 226, 34, 20, 1, 153, 232, 21, 20, 1, 153, 229, 38, 20, 1, 153, 225,
- 20, 20, 1, 153, 216, 80, 20, 1, 153, 232, 152, 20, 1, 153, 219, 227, 20,
- 1, 153, 217, 169, 20, 1, 153, 232, 18, 20, 1, 153, 234, 162, 20, 1, 153,
- 229, 225, 20, 1, 153, 233, 222, 20, 1, 153, 230, 201, 20, 1, 153, 220,
- 143, 20, 1, 153, 232, 191, 20, 1, 153, 244, 62, 20, 1, 153, 223, 101, 20,
- 1, 153, 233, 250, 20, 1, 153, 219, 223, 20, 1, 153, 231, 236, 225, 231,
- 20, 1, 153, 220, 192, 20, 1, 153, 228, 102, 20, 1, 153, 220, 177, 228,
- 113, 212, 187, 20, 1, 153, 228, 1, 230, 218, 20, 1, 153, 226, 209, 20, 1,
- 153, 228, 226, 20, 1, 153, 215, 141, 20, 1, 153, 229, 133, 20, 1, 153,
- 232, 17, 20, 1, 153, 229, 12, 20, 1, 153, 231, 182, 20, 1, 153, 228, 12,
- 20, 1, 153, 217, 173, 20, 1, 153, 219, 221, 20, 1, 153, 226, 210, 20, 1,
- 153, 228, 117, 20, 1, 153, 232, 25, 20, 1, 153, 228, 10, 20, 1, 153, 234,
- 221, 20, 1, 153, 228, 120, 20, 1, 153, 214, 227, 20, 1, 153, 232, 156,
- 20, 1, 153, 229, 180, 20, 1, 153, 230, 16, 20, 1, 153, 231, 181, 20, 1,
- 226, 14, 228, 115, 20, 1, 226, 14, 216, 83, 232, 22, 20, 1, 226, 14, 220,
- 111, 20, 1, 226, 14, 221, 49, 216, 82, 20, 1, 226, 14, 232, 193, 228, 99,
- 20, 1, 226, 14, 231, 188, 232, 26, 20, 1, 226, 14, 234, 96, 20, 1, 226,
- 14, 213, 6, 20, 1, 226, 14, 231, 183, 20, 1, 226, 14, 234, 242, 20, 1,
- 226, 14, 226, 83, 20, 1, 226, 14, 213, 77, 233, 71, 20, 1, 226, 14, 233,
- 127, 228, 113, 228, 20, 20, 1, 226, 14, 228, 97, 220, 218, 20, 1, 226,
- 14, 229, 196, 229, 15, 20, 1, 226, 14, 242, 205, 20, 1, 226, 14, 225,
- 181, 20, 1, 226, 14, 216, 83, 228, 111, 20, 1, 226, 14, 220, 223, 229,
- 10, 20, 1, 226, 14, 220, 219, 20, 1, 226, 14, 231, 84, 217, 172, 20, 1,
- 226, 14, 231, 170, 231, 184, 20, 1, 226, 14, 228, 11, 228, 99, 20, 1,
- 226, 14, 234, 151, 20, 1, 226, 14, 242, 206, 20, 1, 226, 14, 234, 147,
- 20, 1, 226, 14, 233, 151, 20, 1, 226, 14, 226, 121, 20, 1, 226, 14, 214,
- 159, 20, 1, 226, 14, 229, 99, 230, 117, 20, 1, 226, 14, 229, 132, 231,
- 166, 20, 1, 226, 14, 213, 181, 20, 1, 226, 14, 222, 182, 20, 1, 226, 14,
- 218, 45, 20, 1, 226, 14, 231, 96, 20, 1, 226, 14, 229, 117, 20, 1, 226,
- 14, 229, 118, 233, 107, 20, 1, 226, 14, 231, 86, 20, 1, 226, 14, 218,
- 253, 20, 1, 226, 14, 231, 174, 20, 1, 226, 14, 230, 203, 20, 1, 226, 14,
- 228, 21, 20, 1, 226, 14, 225, 24, 20, 1, 226, 14, 231, 95, 229, 134, 20,
- 1, 226, 14, 244, 95, 20, 1, 226, 14, 231, 161, 20, 1, 226, 14, 244, 116,
- 20, 1, 226, 14, 234, 159, 20, 1, 226, 14, 232, 43, 229, 4, 20, 1, 226,
- 14, 232, 43, 228, 236, 20, 1, 226, 14, 233, 35, 20, 1, 226, 14, 229, 140,
- 20, 1, 226, 14, 228, 122, 20, 1, 226, 14, 188, 20, 1, 226, 14, 234, 83,
- 20, 1, 226, 14, 229, 87, 20, 1, 131, 229, 98, 232, 24, 20, 1, 131, 227,
- 237, 20, 1, 131, 212, 187, 20, 1, 131, 214, 37, 20, 1, 131, 229, 133, 20,
- 1, 131, 229, 217, 20, 1, 131, 229, 105, 20, 1, 131, 242, 215, 20, 1, 131,
- 231, 178, 20, 1, 131, 243, 53, 20, 1, 131, 228, 3, 230, 239, 231, 98, 20,
- 1, 131, 228, 95, 231, 169, 20, 1, 131, 231, 175, 20, 1, 131, 225, 187,
- 20, 1, 131, 229, 202, 20, 1, 131, 231, 186, 250, 215, 20, 1, 131, 234,
- 149, 20, 1, 131, 242, 216, 20, 1, 131, 234, 156, 20, 1, 131, 212, 204,
- 230, 146, 20, 1, 131, 227, 231, 20, 1, 131, 231, 163, 20, 1, 131, 228,
- 121, 20, 1, 131, 231, 169, 20, 1, 131, 213, 7, 20, 1, 131, 234, 2, 20, 1,
- 131, 235, 14, 20, 1, 131, 221, 44, 20, 1, 131, 229, 211, 20, 1, 131, 218,
- 43, 20, 1, 131, 228, 240, 20, 1, 131, 217, 19, 212, 189, 20, 1, 131, 219,
- 23, 20, 1, 131, 229, 124, 228, 20, 20, 1, 131, 214, 158, 20, 1, 131, 230,
- 19, 20, 1, 131, 232, 43, 234, 158, 20, 1, 131, 228, 104, 20, 1, 131, 229,
- 119, 20, 1, 131, 233, 111, 20, 1, 131, 231, 171, 20, 1, 131, 231, 75, 20,
- 1, 131, 228, 98, 20, 1, 131, 217, 168, 20, 1, 131, 229, 121, 20, 1, 131,
- 243, 204, 20, 1, 131, 229, 216, 20, 1, 131, 228, 123, 20, 1, 131, 228,
- 119, 20, 1, 131, 251, 36, 20, 1, 131, 214, 160, 20, 1, 131, 231, 176, 20,
- 1, 131, 223, 51, 20, 1, 131, 229, 14, 20, 1, 131, 233, 126, 20, 1, 131,
- 217, 17, 20, 1, 131, 228, 105, 229, 87, 20, 1, 131, 229, 6, 20, 1, 131,
- 234, 162, 20, 1, 131, 229, 125, 20, 1, 131, 232, 17, 20, 1, 131, 231,
- 164, 20, 1, 131, 232, 156, 20, 1, 131, 233, 210, 20, 1, 131, 229, 12, 20,
- 1, 131, 229, 87, 20, 1, 131, 213, 172, 20, 1, 131, 229, 122, 20, 1, 131,
- 228, 108, 20, 1, 131, 228, 100, 20, 1, 131, 233, 224, 228, 226, 20, 1,
- 131, 228, 106, 20, 1, 131, 229, 224, 20, 1, 131, 232, 43, 228, 111, 20,
- 1, 131, 213, 91, 20, 1, 131, 229, 223, 20, 1, 131, 220, 145, 20, 1, 131,
- 221, 47, 20, 1, 131, 231, 172, 20, 1, 131, 232, 24, 20, 1, 131, 231, 182,
- 20, 1, 131, 234, 150, 20, 1, 131, 231, 173, 20, 1, 131, 234, 154, 20, 1,
- 131, 231, 186, 225, 235, 20, 1, 131, 212, 171, 20, 1, 131, 229, 2, 20, 1,
- 131, 231, 33, 20, 1, 131, 230, 170, 20, 1, 131, 220, 195, 20, 1, 131,
- 234, 172, 233, 94, 20, 1, 131, 234, 172, 244, 128, 20, 1, 131, 229, 152,
- 20, 1, 131, 230, 16, 20, 1, 131, 232, 229, 20, 1, 131, 225, 197, 20, 1,
- 131, 226, 74, 20, 1, 131, 217, 183, 20, 1, 103, 231, 162, 20, 1, 103,
- 214, 35, 20, 1, 103, 229, 0, 20, 1, 103, 231, 83, 20, 1, 103, 228, 254,
- 20, 1, 103, 233, 7, 20, 1, 103, 229, 3, 20, 1, 103, 228, 118, 20, 1, 103,
- 229, 139, 20, 1, 103, 228, 20, 20, 1, 103, 213, 182, 20, 1, 103, 229, 95,
- 20, 1, 103, 220, 241, 20, 1, 103, 229, 106, 20, 1, 103, 234, 157, 20, 1,
- 103, 217, 170, 20, 1, 103, 220, 221, 20, 1, 103, 229, 11, 20, 1, 103,
- 218, 253, 20, 1, 103, 234, 162, 20, 1, 103, 213, 79, 20, 1, 103, 233,
- 225, 20, 1, 103, 222, 150, 20, 1, 103, 231, 88, 20, 1, 103, 229, 215, 20,
- 1, 103, 231, 251, 20, 1, 103, 231, 94, 20, 1, 103, 221, 46, 20, 1, 103,
- 213, 30, 20, 1, 103, 229, 5, 20, 1, 103, 234, 153, 231, 165, 20, 1, 103,
- 229, 102, 20, 1, 103, 216, 82, 20, 1, 103, 242, 224, 20, 1, 103, 229, 92,
- 20, 1, 103, 244, 96, 20, 1, 103, 229, 219, 20, 1, 103, 231, 67, 20, 1,
- 103, 233, 31, 20, 1, 103, 229, 201, 20, 1, 103, 230, 217, 20, 1, 103,
- 231, 71, 20, 1, 103, 225, 6, 20, 1, 103, 231, 69, 20, 1, 103, 231, 85,
- 20, 1, 103, 232, 142, 20, 1, 103, 228, 110, 20, 1, 103, 231, 185, 20, 1,
- 103, 233, 202, 20, 1, 103, 228, 12, 20, 1, 103, 217, 173, 20, 1, 103,
- 219, 221, 20, 1, 103, 212, 171, 20, 1, 103, 234, 154, 20, 1, 103, 224,
- 60, 20, 1, 103, 217, 218, 20, 1, 103, 229, 103, 20, 1, 103, 231, 90, 20,
- 1, 103, 228, 109, 20, 1, 103, 234, 152, 20, 1, 103, 225, 191, 20, 1, 103,
- 226, 28, 20, 1, 103, 227, 246, 20, 1, 103, 233, 35, 20, 1, 103, 229, 140,
- 20, 1, 103, 231, 87, 20, 1, 103, 229, 114, 20, 1, 103, 212, 184, 20, 1,
- 103, 226, 149, 20, 1, 103, 212, 183, 20, 1, 103, 229, 224, 20, 1, 103,
- 228, 99, 20, 1, 103, 219, 25, 20, 1, 103, 233, 229, 20, 1, 103, 229, 129,
- 20, 1, 103, 229, 100, 20, 1, 103, 216, 66, 20, 1, 103, 231, 98, 20, 1,
- 103, 233, 219, 20, 1, 103, 228, 107, 20, 1, 103, 217, 171, 20, 1, 103,
- 232, 19, 20, 1, 103, 229, 138, 20, 1, 103, 233, 30, 20, 1, 103, 229, 120,
- 20, 1, 103, 228, 112, 20, 1, 103, 228, 240, 20, 1, 103, 242, 209, 20, 1,
- 103, 233, 238, 20, 1, 103, 223, 234, 227, 75, 20, 1, 103, 218, 35, 20, 1,
- 103, 216, 223, 20, 1, 103, 228, 10, 20, 1, 103, 223, 136, 20, 1, 103,
- 233, 73, 20, 1, 103, 231, 144, 20, 1, 103, 183, 20, 1, 103, 218, 205, 20,
- 1, 103, 230, 172, 20, 1, 103, 220, 207, 20, 1, 103, 220, 217, 20, 1, 103,
- 233, 177, 20, 1, 103, 228, 92, 20, 1, 103, 220, 150, 20, 1, 103, 228,
- 101, 20, 1, 103, 226, 86, 20, 1, 103, 229, 64, 20, 1, 103, 220, 176, 20,
- 1, 103, 225, 19, 20, 1, 103, 230, 117, 20, 1, 103, 232, 174, 20, 1, 103,
- 223, 234, 230, 166, 20, 1, 103, 217, 71, 20, 1, 103, 228, 93, 20, 1, 103,
- 231, 186, 198, 20, 1, 103, 222, 148, 20, 1, 103, 244, 163, 20, 1, 80,
- 229, 223, 20, 1, 80, 216, 229, 20, 1, 80, 231, 175, 20, 1, 80, 233, 111,
- 20, 1, 80, 214, 109, 20, 1, 80, 232, 178, 20, 1, 80, 226, 213, 20, 1, 80,
- 219, 230, 20, 1, 80, 224, 37, 20, 1, 80, 228, 114, 20, 1, 80, 229, 194,
- 20, 1, 80, 225, 33, 20, 1, 80, 218, 13, 20, 1, 80, 229, 108, 20, 1, 80,
- 233, 254, 20, 1, 80, 213, 175, 20, 1, 80, 222, 89, 20, 1, 80, 229, 130,
- 20, 1, 80, 226, 210, 20, 1, 80, 216, 230, 20, 1, 80, 233, 223, 20, 1, 80,
- 232, 192, 20, 1, 80, 228, 117, 20, 1, 80, 229, 84, 20, 1, 80, 232, 25,
- 20, 1, 80, 229, 101, 20, 1, 80, 229, 83, 20, 1, 80, 228, 116, 20, 1, 80,
- 223, 134, 20, 1, 80, 229, 2, 20, 1, 80, 226, 85, 20, 1, 80, 222, 200, 20,
- 1, 80, 229, 115, 20, 1, 80, 231, 77, 20, 1, 80, 242, 203, 20, 1, 80, 229,
- 104, 20, 1, 80, 229, 13, 20, 1, 80, 231, 235, 20, 1, 80, 232, 176, 20, 1,
- 80, 229, 135, 20, 1, 80, 229, 207, 20, 1, 80, 218, 34, 228, 99, 20, 1,
- 80, 221, 48, 20, 1, 80, 225, 29, 20, 1, 80, 229, 227, 219, 235, 20, 1,
- 80, 229, 123, 228, 20, 20, 1, 80, 212, 251, 20, 1, 80, 242, 204, 20, 1,
- 80, 216, 81, 20, 1, 80, 213, 10, 20, 1, 80, 225, 150, 20, 1, 80, 216, 71,
- 20, 1, 80, 234, 160, 20, 1, 80, 219, 24, 20, 1, 80, 217, 172, 20, 1, 80,
- 214, 161, 20, 1, 80, 213, 247, 20, 1, 80, 233, 154, 20, 1, 80, 225, 35,
- 20, 1, 80, 218, 44, 20, 1, 80, 242, 223, 20, 1, 80, 229, 144, 20, 1, 80,
- 220, 220, 20, 1, 80, 231, 72, 20, 1, 80, 231, 179, 20, 1, 80, 227, 235,
- 20, 1, 80, 228, 223, 20, 1, 80, 243, 49, 20, 1, 80, 216, 72, 20, 1, 80,
- 233, 232, 20, 1, 80, 213, 57, 20, 1, 80, 228, 11, 249, 209, 20, 1, 80,
- 212, 241, 20, 1, 80, 231, 89, 20, 1, 80, 229, 212, 20, 1, 80, 225, 232,
- 20, 1, 80, 212, 188, 20, 1, 80, 233, 32, 20, 1, 80, 243, 204, 20, 1, 80,
- 243, 48, 20, 1, 80, 229, 94, 20, 1, 80, 234, 162, 20, 1, 80, 232, 28, 20,
- 1, 80, 229, 107, 20, 1, 80, 242, 210, 20, 1, 80, 244, 164, 20, 1, 80,
- 228, 94, 20, 1, 80, 226, 29, 20, 1, 80, 213, 8, 20, 1, 80, 229, 131, 20,
- 1, 80, 228, 11, 251, 200, 20, 1, 80, 227, 215, 20, 1, 80, 225, 127, 20,
- 1, 80, 231, 33, 20, 1, 80, 243, 202, 20, 1, 80, 230, 38, 20, 1, 80, 230,
- 170, 20, 1, 80, 242, 209, 20, 1, 80, 243, 206, 72, 20, 1, 80, 230, 118,
- 20, 1, 80, 225, 32, 20, 1, 80, 229, 96, 20, 1, 80, 233, 210, 20, 1, 80,
- 225, 229, 20, 1, 80, 228, 102, 20, 1, 80, 213, 9, 20, 1, 80, 229, 116,
- 20, 1, 80, 226, 214, 226, 62, 20, 1, 80, 243, 206, 250, 203, 20, 1, 80,
- 244, 6, 20, 1, 80, 229, 7, 20, 1, 80, 61, 20, 1, 80, 216, 223, 20, 1, 80,
- 75, 20, 1, 80, 72, 20, 1, 80, 233, 109, 20, 1, 80, 226, 214, 225, 157,
- 20, 1, 80, 218, 49, 20, 1, 80, 218, 2, 20, 1, 80, 229, 227, 230, 106,
- 240, 221, 20, 1, 80, 220, 195, 20, 1, 80, 213, 5, 20, 1, 80, 229, 77, 20,
- 1, 80, 212, 193, 20, 1, 80, 212, 218, 218, 185, 20, 1, 80, 212, 218, 249,
- 86, 20, 1, 80, 212, 178, 20, 1, 80, 212, 186, 20, 1, 80, 234, 148, 20, 1,
- 80, 226, 27, 20, 1, 80, 229, 8, 245, 65, 20, 1, 80, 225, 30, 20, 1, 80,
- 213, 180, 20, 1, 80, 244, 116, 20, 1, 80, 214, 227, 20, 1, 80, 232, 156,
- 20, 1, 80, 231, 42, 20, 1, 80, 223, 204, 20, 1, 80, 224, 61, 20, 1, 80,
- 229, 76, 20, 1, 80, 229, 159, 20, 1, 80, 220, 187, 20, 1, 80, 220, 176,
- 20, 1, 80, 243, 206, 223, 236, 20, 1, 80, 205, 20, 1, 80, 225, 240, 20,
- 1, 80, 232, 174, 20, 1, 80, 234, 37, 20, 1, 80, 231, 122, 20, 1, 80, 188,
- 20, 1, 80, 231, 232, 20, 1, 80, 217, 174, 20, 1, 80, 234, 101, 20, 1, 80,
- 230, 220, 20, 1, 80, 217, 200, 20, 1, 80, 244, 137, 20, 1, 80, 242, 199,
- 20, 1, 226, 13, 181, 20, 1, 226, 13, 69, 20, 1, 226, 13, 233, 238, 20, 1,
- 226, 13, 245, 165, 20, 1, 226, 13, 224, 1, 20, 1, 226, 13, 218, 35, 20,
- 1, 226, 13, 228, 10, 20, 1, 226, 13, 233, 157, 20, 1, 226, 13, 223, 136,
- 20, 1, 226, 13, 223, 182, 20, 1, 226, 13, 231, 144, 20, 1, 226, 13, 218,
- 49, 20, 1, 226, 13, 229, 226, 20, 1, 226, 13, 229, 14, 20, 1, 226, 13,
- 183, 20, 1, 226, 13, 218, 205, 20, 1, 226, 13, 220, 207, 20, 1, 226, 13,
- 220, 117, 20, 1, 226, 13, 221, 44, 20, 1, 226, 13, 233, 177, 20, 1, 226,
- 13, 234, 162, 20, 1, 226, 13, 228, 64, 20, 1, 226, 13, 228, 92, 20, 1,
- 226, 13, 228, 241, 20, 1, 226, 13, 212, 217, 20, 1, 226, 13, 220, 150,
- 20, 1, 226, 13, 186, 20, 1, 226, 13, 228, 120, 20, 1, 226, 13, 226, 27,
- 20, 1, 226, 13, 228, 101, 20, 1, 226, 13, 213, 180, 20, 1, 226, 13, 226,
- 86, 20, 1, 226, 13, 223, 51, 20, 1, 226, 13, 229, 64, 20, 1, 226, 13,
- 223, 204, 20, 1, 226, 13, 234, 171, 20, 1, 226, 13, 229, 93, 20, 1, 226,
- 13, 229, 141, 20, 1, 226, 13, 220, 187, 20, 1, 226, 13, 225, 33, 20, 1,
- 226, 13, 244, 6, 20, 1, 226, 13, 214, 49, 20, 1, 226, 13, 233, 13, 20, 1,
- 226, 13, 232, 174, 20, 1, 226, 13, 234, 37, 20, 1, 226, 13, 231, 177, 20,
- 1, 226, 13, 223, 233, 20, 1, 226, 13, 188, 20, 1, 226, 13, 230, 231, 20,
- 1, 226, 13, 231, 185, 20, 1, 226, 13, 217, 183, 20, 1, 226, 13, 234, 4,
- 20, 1, 226, 13, 222, 166, 20, 1, 226, 13, 214, 98, 56, 1, 253, 193, 74,
- 142, 1, 253, 193, 213, 38, 47, 27, 16, 225, 39, 47, 27, 16, 248, 103, 47,
- 27, 16, 226, 50, 47, 27, 16, 226, 237, 245, 135, 47, 27, 16, 226, 237,
- 247, 153, 47, 27, 16, 214, 248, 245, 135, 47, 27, 16, 214, 248, 247, 153,
- 47, 27, 16, 234, 202, 47, 27, 16, 218, 115, 47, 27, 16, 226, 137, 47, 27,
- 16, 212, 208, 47, 27, 16, 212, 209, 247, 153, 47, 27, 16, 233, 243, 47,
- 27, 16, 253, 236, 245, 135, 47, 27, 16, 244, 249, 245, 135, 47, 27, 16,
- 217, 211, 47, 27, 16, 234, 167, 47, 27, 16, 253, 227, 47, 27, 16, 253,
- 228, 247, 153, 47, 27, 16, 218, 121, 47, 27, 16, 217, 112, 47, 27, 16,
- 227, 72, 253, 191, 47, 27, 16, 242, 135, 253, 191, 47, 27, 16, 225, 38,
- 47, 27, 16, 250, 85, 47, 27, 16, 214, 238, 47, 27, 16, 235, 162, 253,
- 191, 47, 27, 16, 234, 169, 253, 191, 47, 27, 16, 234, 168, 253, 191, 47,
- 27, 16, 222, 131, 47, 27, 16, 226, 128, 47, 27, 16, 219, 86, 253, 230,
- 47, 27, 16, 226, 236, 253, 191, 47, 27, 16, 214, 247, 253, 191, 47, 27,
- 16, 253, 231, 253, 191, 47, 27, 16, 253, 225, 47, 27, 16, 234, 46, 47,
- 27, 16, 223, 199, 47, 27, 16, 225, 238, 253, 191, 47, 27, 16, 217, 36,
- 47, 27, 16, 254, 30, 47, 27, 16, 222, 78, 47, 27, 16, 218, 124, 253, 191,
- 47, 27, 16, 218, 124, 231, 107, 219, 84, 47, 27, 16, 226, 231, 253, 191,
- 47, 27, 16, 217, 143, 47, 27, 16, 233, 51, 47, 27, 16, 245, 252, 47, 27,
- 16, 216, 185, 47, 27, 16, 217, 185, 47, 27, 16, 233, 246, 47, 27, 16,
- 253, 236, 244, 249, 229, 177, 47, 27, 16, 243, 207, 253, 191, 47, 27, 16,
- 236, 7, 47, 27, 16, 216, 157, 253, 191, 47, 27, 16, 234, 205, 216, 156,
- 47, 27, 16, 226, 75, 47, 27, 16, 225, 43, 47, 27, 16, 234, 20, 47, 27,
- 16, 250, 17, 253, 191, 47, 27, 16, 224, 38, 47, 27, 16, 226, 140, 253,
- 191, 47, 27, 16, 226, 138, 253, 191, 47, 27, 16, 240, 102, 47, 27, 16,
- 230, 23, 47, 27, 16, 226, 32, 47, 27, 16, 234, 21, 254, 58, 47, 27, 16,
- 216, 157, 254, 58, 47, 27, 16, 219, 63, 47, 27, 16, 242, 101, 47, 27, 16,
- 235, 162, 229, 177, 47, 27, 16, 227, 72, 229, 177, 47, 27, 16, 226, 237,
- 229, 177, 47, 27, 16, 226, 31, 47, 27, 16, 234, 7, 47, 27, 16, 226, 30,
- 47, 27, 16, 233, 245, 47, 27, 16, 226, 76, 229, 177, 47, 27, 16, 234,
- 168, 229, 178, 254, 7, 47, 27, 16, 234, 169, 229, 178, 254, 7, 47, 27,
- 16, 212, 206, 47, 27, 16, 253, 228, 229, 177, 47, 27, 16, 253, 229, 218,
- 122, 229, 177, 47, 27, 16, 212, 207, 47, 27, 16, 233, 244, 47, 27, 16,
- 245, 130, 47, 27, 16, 250, 86, 47, 27, 16, 231, 11, 235, 161, 47, 27, 16,
- 214, 248, 229, 177, 47, 27, 16, 225, 238, 229, 177, 47, 27, 16, 225, 44,
- 229, 177, 47, 27, 16, 227, 69, 47, 27, 16, 253, 251, 47, 27, 16, 232,
- 118, 47, 27, 16, 226, 138, 229, 177, 47, 27, 16, 226, 140, 229, 177, 47,
- 27, 16, 245, 26, 226, 139, 47, 27, 16, 233, 175, 47, 27, 16, 253, 252,
- 47, 27, 16, 216, 157, 229, 177, 47, 27, 16, 245, 133, 47, 27, 16, 218,
- 124, 229, 177, 47, 27, 16, 218, 116, 47, 27, 16, 250, 17, 229, 177, 47,
- 27, 16, 245, 69, 47, 27, 16, 222, 79, 229, 177, 47, 27, 16, 213, 139,
- 234, 46, 47, 27, 16, 216, 154, 47, 27, 16, 225, 45, 47, 27, 16, 216, 158,
- 47, 27, 16, 216, 155, 47, 27, 16, 225, 42, 47, 27, 16, 216, 153, 47, 27,
- 16, 225, 41, 47, 27, 16, 242, 134, 47, 27, 16, 253, 185, 47, 27, 16, 245,
- 26, 253, 185, 47, 27, 16, 226, 231, 229, 177, 47, 27, 16, 217, 142, 245,
- 34, 47, 27, 16, 217, 142, 244, 248, 47, 27, 16, 217, 144, 253, 232, 47,
- 27, 16, 217, 137, 234, 251, 253, 224, 47, 27, 16, 234, 204, 47, 27, 16,
- 245, 97, 47, 27, 16, 213, 2, 234, 201, 47, 27, 16, 213, 2, 254, 7, 47,
- 27, 16, 219, 85, 47, 27, 16, 234, 47, 254, 7, 47, 27, 16, 247, 154, 253,
- 191, 47, 27, 16, 233, 247, 253, 191, 47, 27, 16, 233, 247, 254, 58, 47,
- 27, 16, 233, 247, 229, 177, 47, 27, 16, 253, 231, 229, 177, 47, 27, 16,
- 253, 233, 47, 27, 16, 247, 153, 47, 27, 16, 216, 168, 47, 27, 16, 217,
- 177, 47, 27, 16, 234, 11, 47, 27, 16, 233, 56, 245, 92, 250, 8, 47, 27,
- 16, 233, 56, 245, 253, 250, 9, 47, 27, 16, 233, 56, 216, 170, 250, 9, 47,
- 27, 16, 233, 56, 217, 187, 250, 9, 47, 27, 16, 233, 56, 236, 2, 250, 8,
- 47, 27, 16, 242, 135, 229, 178, 254, 7, 47, 27, 16, 242, 135, 226, 129,
- 253, 181, 47, 27, 16, 242, 135, 226, 129, 247, 236, 47, 27, 16, 247, 177,
- 47, 27, 16, 247, 178, 226, 129, 253, 182, 234, 201, 47, 27, 16, 247, 178,
- 226, 129, 253, 182, 254, 7, 47, 27, 16, 247, 178, 226, 129, 247, 236, 47,
- 27, 16, 216, 174, 47, 27, 16, 253, 186, 47, 27, 16, 236, 9, 47, 27, 16,
- 247, 198, 47, 27, 16, 254, 116, 225, 134, 253, 187, 47, 27, 16, 254, 116,
- 253, 184, 47, 27, 16, 254, 116, 253, 187, 47, 27, 16, 254, 116, 231, 101,
- 47, 27, 16, 254, 116, 231, 110, 47, 27, 16, 254, 116, 242, 136, 47, 27,
- 16, 254, 116, 242, 133, 47, 27, 16, 254, 116, 225, 134, 242, 136, 47, 27,
- 16, 231, 214, 225, 50, 240, 100, 47, 27, 16, 231, 214, 254, 60, 225, 50,
- 240, 100, 47, 27, 16, 231, 214, 247, 235, 240, 100, 47, 27, 16, 231, 214,
- 254, 60, 247, 235, 240, 100, 47, 27, 16, 231, 214, 216, 163, 240, 100,
- 47, 27, 16, 231, 214, 216, 175, 47, 27, 16, 231, 214, 217, 181, 240, 100,
- 47, 27, 16, 231, 214, 217, 181, 233, 59, 240, 100, 47, 27, 16, 231, 214,
- 233, 59, 240, 100, 47, 27, 16, 231, 214, 225, 171, 240, 100, 47, 27, 16,
- 235, 167, 217, 204, 240, 101, 47, 27, 16, 253, 229, 217, 204, 240, 101,
- 47, 27, 16, 244, 140, 217, 178, 47, 27, 16, 244, 140, 230, 213, 47, 27,
- 16, 244, 140, 247, 182, 47, 27, 16, 231, 214, 214, 242, 240, 100, 47, 27,
- 16, 231, 214, 225, 49, 240, 100, 47, 27, 16, 231, 214, 225, 171, 217,
- 181, 240, 100, 47, 27, 16, 242, 131, 230, 98, 253, 232, 47, 27, 16, 242,
- 131, 230, 98, 247, 152, 47, 27, 16, 245, 106, 234, 251, 243, 207, 214,
- 105, 47, 27, 16, 236, 8, 47, 27, 16, 236, 6, 47, 27, 16, 243, 207, 253,
- 192, 247, 234, 240, 99, 47, 27, 16, 243, 207, 247, 196, 193, 47, 27, 16,
- 243, 207, 247, 196, 230, 23, 47, 27, 16, 243, 207, 230, 18, 240, 100, 47,
- 27, 16, 243, 207, 247, 196, 247, 211, 47, 27, 16, 243, 207, 220, 30, 247,
- 195, 247, 211, 47, 27, 16, 243, 207, 247, 196, 234, 188, 47, 27, 16, 243,
- 207, 247, 196, 212, 16, 47, 27, 16, 243, 207, 247, 196, 229, 65, 234,
- 201, 47, 27, 16, 243, 207, 247, 196, 229, 65, 254, 7, 47, 27, 16, 243,
- 207, 231, 254, 250, 10, 247, 182, 47, 27, 16, 243, 207, 231, 254, 250,
- 10, 230, 213, 47, 27, 16, 244, 91, 220, 30, 250, 10, 214, 241, 47, 27,
- 16, 243, 207, 220, 30, 250, 10, 218, 125, 47, 27, 16, 243, 207, 229, 179,
- 47, 27, 16, 250, 11, 211, 248, 47, 27, 16, 250, 11, 234, 45, 47, 27, 16,
- 250, 11, 219, 197, 47, 27, 16, 243, 207, 240, 146, 213, 1, 217, 182, 47,
- 27, 16, 243, 207, 245, 107, 253, 253, 47, 27, 16, 213, 1, 216, 164, 47,
- 27, 16, 247, 190, 216, 164, 47, 27, 16, 247, 190, 217, 182, 47, 27, 16,
- 247, 190, 253, 234, 245, 253, 247, 93, 47, 27, 16, 247, 190, 230, 211,
- 217, 186, 247, 93, 47, 27, 16, 247, 190, 247, 174, 245, 3, 247, 93, 47,
- 27, 16, 247, 190, 216, 172, 227, 77, 247, 93, 47, 27, 16, 213, 1, 253,
- 234, 245, 253, 247, 93, 47, 27, 16, 213, 1, 230, 211, 217, 186, 247, 93,
- 47, 27, 16, 213, 1, 247, 174, 245, 3, 247, 93, 47, 27, 16, 213, 1, 216,
- 172, 227, 77, 247, 93, 47, 27, 16, 243, 25, 247, 189, 47, 27, 16, 243,
- 25, 213, 0, 47, 27, 16, 247, 197, 253, 234, 231, 12, 47, 27, 16, 247,
- 197, 253, 234, 231, 137, 47, 27, 16, 247, 197, 247, 153, 47, 27, 16, 247,
- 197, 217, 135, 47, 27, 16, 220, 89, 217, 135, 47, 27, 16, 220, 89, 217,
- 136, 247, 138, 47, 27, 16, 220, 89, 217, 136, 216, 165, 47, 27, 16, 220,
- 89, 217, 136, 217, 175, 47, 27, 16, 220, 89, 253, 159, 47, 27, 16, 220,
- 89, 253, 160, 247, 138, 47, 27, 16, 220, 89, 253, 160, 216, 165, 47, 27,
- 16, 220, 89, 253, 160, 217, 175, 47, 27, 16, 247, 175, 243, 6, 47, 27,
- 16, 247, 181, 227, 2, 47, 27, 16, 219, 77, 47, 27, 16, 253, 178, 193, 47,
- 27, 16, 253, 178, 214, 105, 47, 27, 16, 253, 178, 243, 110, 47, 27, 16,
- 253, 178, 247, 211, 47, 27, 16, 253, 178, 234, 188, 47, 27, 16, 253, 178,
- 212, 16, 47, 27, 16, 253, 178, 229, 64, 47, 27, 16, 234, 168, 229, 178,
- 231, 109, 47, 27, 16, 234, 169, 229, 178, 231, 109, 47, 27, 16, 234, 168,
- 229, 178, 234, 201, 47, 27, 16, 234, 169, 229, 178, 234, 201, 47, 27, 16,
- 234, 47, 234, 201, 47, 27, 16, 242, 135, 229, 178, 234, 201, 27, 16, 220,
- 81, 252, 55, 27, 16, 51, 252, 55, 27, 16, 40, 252, 55, 27, 16, 223, 203,
- 40, 252, 55, 27, 16, 248, 100, 252, 55, 27, 16, 220, 175, 252, 55, 27,
- 16, 42, 223, 228, 52, 27, 16, 46, 223, 228, 52, 27, 16, 223, 228, 247,
- 72, 27, 16, 248, 141, 222, 82, 27, 16, 248, 165, 250, 181, 27, 16, 222,
- 82, 27, 16, 249, 171, 27, 16, 223, 226, 244, 80, 27, 16, 223, 226, 244,
- 79, 27, 16, 223, 226, 244, 78, 27, 16, 244, 100, 27, 16, 244, 101, 55,
- 27, 16, 251, 76, 77, 27, 16, 250, 210, 27, 16, 251, 86, 27, 16, 125, 27,
- 16, 227, 59, 219, 102, 27, 16, 216, 23, 219, 102, 27, 16, 217, 96, 219,
- 102, 27, 16, 243, 236, 219, 102, 27, 16, 244, 49, 219, 102, 27, 16, 220,
- 52, 219, 102, 27, 16, 220, 50, 243, 220, 27, 16, 243, 234, 243, 220, 27,
- 16, 243, 178, 249, 207, 27, 16, 243, 178, 249, 208, 227, 4, 254, 51, 27,
- 16, 243, 178, 249, 208, 227, 4, 252, 42, 27, 16, 250, 253, 249, 207, 27,
- 16, 244, 231, 249, 207, 27, 16, 244, 231, 249, 208, 227, 4, 254, 51, 27,
- 16, 244, 231, 249, 208, 227, 4, 252, 42, 27, 16, 246, 38, 249, 206, 27,
- 16, 246, 38, 249, 205, 27, 16, 230, 155, 231, 155, 223, 213, 27, 16, 51,
- 220, 254, 27, 16, 51, 244, 34, 27, 16, 244, 35, 215, 134, 27, 16, 244,
- 35, 246, 60, 27, 16, 230, 9, 215, 134, 27, 16, 230, 9, 246, 60, 27, 16,
- 220, 255, 215, 134, 27, 16, 220, 255, 246, 60, 27, 16, 224, 167, 160,
- 220, 254, 27, 16, 224, 167, 160, 244, 34, 27, 16, 249, 155, 217, 40, 27,
- 16, 249, 27, 217, 40, 27, 16, 227, 4, 254, 51, 27, 16, 227, 4, 252, 42,
- 27, 16, 224, 149, 254, 51, 27, 16, 224, 149, 252, 42, 27, 16, 230, 158,
- 223, 213, 27, 16, 213, 236, 223, 213, 27, 16, 151, 223, 213, 27, 16, 224,
- 167, 223, 213, 27, 16, 245, 146, 223, 213, 27, 16, 220, 46, 223, 213, 27,
- 16, 217, 113, 223, 213, 27, 16, 220, 38, 223, 213, 27, 16, 122, 240, 201,
- 216, 36, 223, 213, 27, 16, 213, 167, 228, 154, 27, 16, 94, 228, 154, 27,
- 16, 249, 229, 213, 167, 228, 154, 27, 16, 41, 228, 155, 213, 238, 27, 16,
- 41, 228, 155, 251, 144, 27, 16, 216, 184, 228, 155, 114, 213, 238, 27,
- 16, 216, 184, 228, 155, 114, 251, 144, 27, 16, 216, 184, 228, 155, 42,
- 213, 238, 27, 16, 216, 184, 228, 155, 42, 251, 144, 27, 16, 216, 184,
- 228, 155, 46, 213, 238, 27, 16, 216, 184, 228, 155, 46, 251, 144, 27, 16,
- 216, 184, 228, 155, 119, 213, 238, 27, 16, 216, 184, 228, 155, 119, 251,
- 144, 27, 16, 216, 184, 228, 155, 114, 46, 213, 238, 27, 16, 216, 184,
- 228, 155, 114, 46, 251, 144, 27, 16, 230, 199, 228, 155, 213, 238, 27,
- 16, 230, 199, 228, 155, 251, 144, 27, 16, 216, 181, 228, 155, 119, 213,
- 238, 27, 16, 216, 181, 228, 155, 119, 251, 144, 27, 16, 226, 132, 228,
- 154, 27, 16, 214, 113, 228, 154, 27, 16, 228, 155, 251, 144, 27, 16, 228,
- 59, 228, 154, 27, 16, 249, 178, 228, 155, 213, 238, 27, 16, 249, 178,
- 228, 155, 251, 144, 27, 16, 251, 74, 27, 16, 213, 236, 228, 158, 27, 16,
- 151, 228, 158, 27, 16, 224, 167, 228, 158, 27, 16, 245, 146, 228, 158,
- 27, 16, 220, 46, 228, 158, 27, 16, 217, 113, 228, 158, 27, 16, 220, 38,
- 228, 158, 27, 16, 122, 240, 201, 216, 36, 228, 158, 27, 16, 37, 219, 79,
- 27, 16, 37, 219, 172, 219, 79, 27, 16, 37, 216, 192, 27, 16, 37, 216,
- 191, 27, 16, 37, 216, 190, 27, 16, 244, 70, 216, 192, 27, 16, 244, 70,
- 216, 191, 27, 16, 244, 70, 216, 190, 27, 16, 37, 253, 105, 247, 74, 27,
- 16, 37, 244, 41, 27, 16, 37, 244, 40, 27, 16, 37, 244, 39, 27, 16, 37,
- 244, 38, 27, 16, 37, 244, 37, 27, 16, 251, 234, 251, 250, 27, 16, 245,
- 101, 251, 250, 27, 16, 251, 234, 217, 65, 27, 16, 245, 101, 217, 65, 27,
- 16, 251, 234, 220, 8, 27, 16, 245, 101, 220, 8, 27, 16, 251, 234, 225,
- 247, 27, 16, 245, 101, 225, 247, 27, 16, 37, 254, 174, 27, 16, 37, 219,
- 104, 27, 16, 37, 217, 191, 27, 16, 37, 219, 105, 27, 16, 37, 231, 225,
- 27, 16, 37, 231, 224, 27, 16, 37, 254, 173, 27, 16, 37, 232, 167, 27, 16,
- 253, 169, 215, 134, 27, 16, 253, 169, 246, 60, 27, 16, 37, 247, 89, 27,
- 16, 37, 223, 128, 27, 16, 37, 244, 27, 27, 16, 37, 220, 4, 27, 16, 37,
- 251, 215, 27, 16, 37, 51, 216, 232, 27, 16, 37, 216, 169, 216, 232, 27,
- 16, 223, 132, 27, 16, 219, 20, 27, 16, 212, 152, 27, 16, 225, 239, 27,
- 16, 231, 92, 27, 16, 243, 242, 27, 16, 249, 78, 27, 16, 248, 29, 27, 16,
- 242, 126, 228, 159, 220, 23, 27, 16, 242, 126, 228, 159, 228, 186, 220,
- 23, 27, 16, 216, 213, 27, 16, 216, 59, 27, 16, 235, 191, 216, 59, 27, 16,
- 216, 60, 220, 23, 27, 16, 216, 60, 215, 134, 27, 16, 227, 15, 219, 44,
- 27, 16, 227, 15, 219, 41, 27, 16, 227, 15, 219, 40, 27, 16, 227, 15, 219,
- 39, 27, 16, 227, 15, 219, 38, 27, 16, 227, 15, 219, 37, 27, 16, 227, 15,
- 219, 36, 27, 16, 227, 15, 219, 35, 27, 16, 227, 15, 219, 34, 27, 16, 227,
- 15, 219, 43, 27, 16, 227, 15, 219, 42, 27, 16, 241, 229, 27, 16, 229,
- 186, 27, 16, 245, 101, 65, 219, 73, 27, 16, 248, 22, 220, 23, 27, 16, 37,
- 119, 251, 95, 27, 16, 37, 114, 251, 95, 27, 16, 37, 241, 239, 27, 16, 37,
- 219, 251, 225, 175, 27, 16, 226, 91, 77, 27, 16, 226, 91, 114, 77, 27,
- 16, 151, 226, 91, 77, 27, 16, 242, 158, 215, 134, 27, 16, 242, 158, 246,
- 60, 27, 16, 2, 244, 69, 27, 16, 248, 125, 27, 16, 248, 126, 254, 63, 27,
- 16, 231, 197, 27, 16, 232, 182, 27, 16, 251, 71, 27, 16, 221, 74, 213,
- 238, 27, 16, 221, 74, 251, 144, 27, 16, 230, 253, 27, 16, 230, 254, 251,
- 144, 27, 16, 221, 68, 213, 238, 27, 16, 221, 68, 251, 144, 27, 16, 243,
- 192, 213, 238, 27, 16, 243, 192, 251, 144, 27, 16, 232, 183, 226, 55,
- 223, 213, 27, 16, 232, 183, 236, 0, 223, 213, 27, 16, 251, 72, 223, 213,
- 27, 16, 221, 74, 223, 213, 27, 16, 230, 254, 223, 213, 27, 16, 221, 68,
- 223, 213, 27, 16, 217, 202, 226, 53, 249, 48, 225, 58, 226, 54, 27, 16,
- 217, 202, 226, 53, 249, 48, 225, 58, 235, 255, 27, 16, 217, 202, 226, 53,
- 249, 48, 225, 58, 226, 55, 247, 163, 27, 16, 217, 202, 235, 254, 249, 48,
- 225, 58, 226, 54, 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 235, 255,
- 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 163, 27, 16,
- 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 162, 27, 16, 217, 202,
- 235, 254, 249, 48, 225, 58, 236, 0, 247, 161, 27, 16, 249, 73, 27, 16,
- 242, 103, 250, 253, 249, 207, 27, 16, 242, 103, 244, 231, 249, 207, 27,
- 16, 41, 253, 74, 27, 16, 214, 132, 27, 16, 225, 148, 27, 16, 249, 198,
- 27, 16, 222, 121, 27, 16, 249, 202, 27, 16, 216, 220, 27, 16, 225, 122,
- 27, 16, 225, 123, 244, 29, 27, 16, 222, 122, 244, 29, 27, 16, 216, 221,
- 223, 210, 27, 16, 226, 39, 219, 11, 25, 214, 118, 174, 218, 174, 25, 214,
- 118, 174, 218, 163, 25, 214, 118, 174, 218, 153, 25, 214, 118, 174, 218,
- 146, 25, 214, 118, 174, 218, 138, 25, 214, 118, 174, 218, 132, 25, 214,
- 118, 174, 218, 131, 25, 214, 118, 174, 218, 130, 25, 214, 118, 174, 218,
- 129, 25, 214, 118, 174, 218, 173, 25, 214, 118, 174, 218, 172, 25, 214,
- 118, 174, 218, 171, 25, 214, 118, 174, 218, 170, 25, 214, 118, 174, 218,
- 169, 25, 214, 118, 174, 218, 168, 25, 214, 118, 174, 218, 167, 25, 214,
- 118, 174, 218, 166, 25, 214, 118, 174, 218, 165, 25, 214, 118, 174, 218,
- 164, 25, 214, 118, 174, 218, 162, 25, 214, 118, 174, 218, 161, 25, 214,
- 118, 174, 218, 160, 25, 214, 118, 174, 218, 159, 25, 214, 118, 174, 218,
- 158, 25, 214, 118, 174, 218, 137, 25, 214, 118, 174, 218, 136, 25, 214,
- 118, 174, 218, 135, 25, 214, 118, 174, 218, 134, 25, 214, 118, 174, 218,
- 133, 25, 235, 211, 174, 218, 174, 25, 235, 211, 174, 218, 163, 25, 235,
- 211, 174, 218, 146, 25, 235, 211, 174, 218, 138, 25, 235, 211, 174, 218,
- 131, 25, 235, 211, 174, 218, 130, 25, 235, 211, 174, 218, 172, 25, 235,
- 211, 174, 218, 171, 25, 235, 211, 174, 218, 170, 25, 235, 211, 174, 218,
- 169, 25, 235, 211, 174, 218, 166, 25, 235, 211, 174, 218, 165, 25, 235,
- 211, 174, 218, 164, 25, 235, 211, 174, 218, 159, 25, 235, 211, 174, 218,
- 158, 25, 235, 211, 174, 218, 157, 25, 235, 211, 174, 218, 156, 25, 235,
- 211, 174, 218, 155, 25, 235, 211, 174, 218, 154, 25, 235, 211, 174, 218,
- 152, 25, 235, 211, 174, 218, 151, 25, 235, 211, 174, 218, 150, 25, 235,
- 211, 174, 218, 149, 25, 235, 211, 174, 218, 148, 25, 235, 211, 174, 218,
- 147, 25, 235, 211, 174, 218, 145, 25, 235, 211, 174, 218, 144, 25, 235,
- 211, 174, 218, 143, 25, 235, 211, 174, 218, 142, 25, 235, 211, 174, 218,
- 141, 25, 235, 211, 174, 218, 140, 25, 235, 211, 174, 218, 139, 25, 235,
- 211, 174, 218, 137, 25, 235, 211, 174, 218, 136, 25, 235, 211, 174, 218,
- 135, 25, 235, 211, 174, 218, 134, 25, 235, 211, 174, 218, 133, 37, 25,
- 27, 216, 166, 37, 25, 27, 217, 176, 37, 25, 27, 226, 63, 25, 27, 233, 55,
- 230, 212, 31, 245, 179, 247, 176, 31, 241, 206, 245, 179, 247, 176, 31,
- 240, 204, 245, 179, 247, 176, 31, 245, 178, 241, 207, 247, 176, 31, 245,
- 178, 240, 203, 247, 176, 31, 245, 179, 170, 31, 250, 108, 170, 31, 243,
- 200, 249, 228, 170, 31, 230, 246, 170, 31, 252, 50, 170, 31, 234, 185,
- 220, 7, 170, 31, 249, 118, 170, 31, 253, 148, 170, 31, 227, 29, 170, 31,
- 251, 80, 226, 254, 170, 31, 248, 24, 167, 247, 131, 170, 31, 247, 128,
- 170, 31, 212, 213, 170, 31, 235, 243, 170, 31, 226, 72, 170, 31, 224, 20,
- 170, 31, 249, 128, 170, 31, 241, 46, 252, 101, 170, 31, 214, 43, 170, 31,
- 244, 8, 170, 31, 254, 151, 170, 31, 223, 239, 170, 31, 223, 217, 170, 31,
- 245, 177, 170, 31, 235, 56, 170, 31, 249, 123, 170, 31, 245, 100, 170,
- 31, 246, 7, 170, 31, 250, 81, 170, 31, 248, 33, 170, 31, 22, 223, 216,
- 170, 31, 226, 205, 170, 31, 233, 58, 170, 31, 249, 191, 170, 31, 234, 86,
- 170, 31, 243, 62, 170, 31, 219, 52, 170, 31, 225, 16, 170, 31, 243, 199,
- 170, 31, 223, 218, 170, 31, 233, 95, 167, 230, 227, 170, 31, 223, 214,
- 170, 31, 242, 144, 211, 211, 231, 141, 170, 31, 245, 102, 170, 31, 219,
- 64, 170, 31, 242, 105, 170, 31, 245, 94, 170, 31, 226, 108, 170, 31, 223,
- 122, 170, 31, 244, 28, 170, 31, 214, 240, 167, 214, 28, 170, 31, 249,
- 132, 170, 31, 231, 154, 170, 31, 245, 27, 170, 31, 215, 143, 170, 31,
- 247, 164, 170, 31, 249, 193, 230, 180, 170, 31, 242, 87, 170, 31, 243,
- 63, 235, 251, 170, 31, 231, 204, 170, 31, 254, 170, 170, 31, 245, 115,
- 170, 31, 246, 63, 170, 31, 214, 26, 170, 31, 220, 78, 170, 31, 235, 219,
- 170, 31, 247, 249, 170, 31, 248, 105, 170, 31, 247, 160, 170, 31, 244,
- 252, 170, 31, 221, 36, 170, 31, 219, 68, 170, 31, 241, 241, 170, 31, 249,
- 151, 170, 31, 249, 188, 170, 31, 244, 145, 170, 31, 254, 117, 170, 31,
- 249, 150, 170, 31, 227, 63, 217, 149, 214, 219, 170, 31, 247, 184, 170,
- 31, 233, 147, 170, 31, 243, 239, 249, 88, 223, 103, 215, 145, 21, 116,
- 249, 88, 223, 103, 215, 145, 21, 109, 249, 88, 223, 103, 215, 145, 21,
- 166, 249, 88, 223, 103, 215, 145, 21, 163, 249, 88, 223, 103, 215, 145,
- 21, 180, 249, 88, 223, 103, 215, 145, 21, 189, 249, 88, 223, 103, 215,
- 145, 21, 198, 249, 88, 223, 103, 215, 145, 21, 195, 249, 88, 223, 103,
- 215, 145, 21, 200, 249, 88, 223, 103, 217, 196, 21, 116, 249, 88, 223,
- 103, 217, 196, 21, 109, 249, 88, 223, 103, 217, 196, 21, 166, 249, 88,
- 223, 103, 217, 196, 21, 163, 249, 88, 223, 103, 217, 196, 21, 180, 249,
- 88, 223, 103, 217, 196, 21, 189, 249, 88, 223, 103, 217, 196, 21, 198,
- 249, 88, 223, 103, 217, 196, 21, 195, 249, 88, 223, 103, 217, 196, 21,
- 200, 14, 22, 6, 61, 14, 22, 6, 253, 74, 14, 22, 6, 250, 252, 14, 22, 6,
- 249, 3, 14, 22, 6, 74, 14, 22, 6, 244, 230, 14, 22, 6, 243, 177, 14, 22,
- 6, 242, 41, 14, 22, 6, 72, 14, 22, 6, 235, 142, 14, 22, 6, 235, 27, 14,
- 22, 6, 150, 14, 22, 6, 183, 14, 22, 6, 204, 14, 22, 6, 75, 14, 22, 6,
- 226, 229, 14, 22, 6, 224, 240, 14, 22, 6, 149, 14, 22, 6, 197, 14, 22, 6,
- 218, 99, 14, 22, 6, 69, 14, 22, 6, 215, 79, 14, 22, 6, 214, 82, 14, 22,
- 6, 213, 166, 14, 22, 6, 213, 105, 14, 22, 6, 212, 152, 14, 22, 3, 61, 14,
- 22, 3, 253, 74, 14, 22, 3, 250, 252, 14, 22, 3, 249, 3, 14, 22, 3, 74,
- 14, 22, 3, 244, 230, 14, 22, 3, 243, 177, 14, 22, 3, 242, 41, 14, 22, 3,
- 72, 14, 22, 3, 235, 142, 14, 22, 3, 235, 27, 14, 22, 3, 150, 14, 22, 3,
- 183, 14, 22, 3, 204, 14, 22, 3, 75, 14, 22, 3, 226, 229, 14, 22, 3, 224,
- 240, 14, 22, 3, 149, 14, 22, 3, 197, 14, 22, 3, 218, 99, 14, 22, 3, 69,
- 14, 22, 3, 215, 79, 14, 22, 3, 214, 82, 14, 22, 3, 213, 166, 14, 22, 3,
- 213, 105, 14, 22, 3, 212, 152, 14, 32, 6, 61, 14, 32, 6, 253, 74, 14, 32,
- 6, 250, 252, 14, 32, 6, 249, 3, 14, 32, 6, 74, 14, 32, 6, 244, 230, 14,
- 32, 6, 243, 177, 14, 32, 6, 242, 41, 14, 32, 6, 72, 14, 32, 6, 235, 142,
- 14, 32, 6, 235, 27, 14, 32, 6, 150, 14, 32, 6, 183, 14, 32, 6, 204, 14,
- 32, 6, 75, 14, 32, 6, 226, 229, 14, 32, 6, 224, 240, 14, 32, 6, 149, 14,
- 32, 6, 197, 14, 32, 6, 218, 99, 14, 32, 6, 69, 14, 32, 6, 215, 79, 14,
- 32, 6, 214, 82, 14, 32, 6, 213, 166, 14, 32, 6, 213, 105, 14, 32, 6, 212,
- 152, 14, 32, 3, 61, 14, 32, 3, 253, 74, 14, 32, 3, 250, 252, 14, 32, 3,
- 249, 3, 14, 32, 3, 74, 14, 32, 3, 244, 230, 14, 32, 3, 243, 177, 14, 32,
- 3, 72, 14, 32, 3, 235, 142, 14, 32, 3, 235, 27, 14, 32, 3, 150, 14, 32,
- 3, 183, 14, 32, 3, 204, 14, 32, 3, 75, 14, 32, 3, 226, 229, 14, 32, 3,
- 224, 240, 14, 32, 3, 149, 14, 32, 3, 197, 14, 32, 3, 218, 99, 14, 32, 3,
- 69, 14, 32, 3, 215, 79, 14, 32, 3, 214, 82, 14, 32, 3, 213, 166, 14, 32,
- 3, 213, 105, 14, 32, 3, 212, 152, 14, 22, 32, 6, 61, 14, 22, 32, 6, 253,
- 74, 14, 22, 32, 6, 250, 252, 14, 22, 32, 6, 249, 3, 14, 22, 32, 6, 74,
- 14, 22, 32, 6, 244, 230, 14, 22, 32, 6, 243, 177, 14, 22, 32, 6, 242, 41,
- 14, 22, 32, 6, 72, 14, 22, 32, 6, 235, 142, 14, 22, 32, 6, 235, 27, 14,
- 22, 32, 6, 150, 14, 22, 32, 6, 183, 14, 22, 32, 6, 204, 14, 22, 32, 6,
- 75, 14, 22, 32, 6, 226, 229, 14, 22, 32, 6, 224, 240, 14, 22, 32, 6, 149,
- 14, 22, 32, 6, 197, 14, 22, 32, 6, 218, 99, 14, 22, 32, 6, 69, 14, 22,
- 32, 6, 215, 79, 14, 22, 32, 6, 214, 82, 14, 22, 32, 6, 213, 166, 14, 22,
- 32, 6, 213, 105, 14, 22, 32, 6, 212, 152, 14, 22, 32, 3, 61, 14, 22, 32,
- 3, 253, 74, 14, 22, 32, 3, 250, 252, 14, 22, 32, 3, 249, 3, 14, 22, 32,
- 3, 74, 14, 22, 32, 3, 244, 230, 14, 22, 32, 3, 243, 177, 14, 22, 32, 3,
- 242, 41, 14, 22, 32, 3, 72, 14, 22, 32, 3, 235, 142, 14, 22, 32, 3, 235,
- 27, 14, 22, 32, 3, 150, 14, 22, 32, 3, 183, 14, 22, 32, 3, 204, 14, 22,
- 32, 3, 75, 14, 22, 32, 3, 226, 229, 14, 22, 32, 3, 224, 240, 14, 22, 32,
- 3, 149, 14, 22, 32, 3, 197, 14, 22, 32, 3, 218, 99, 14, 22, 32, 3, 69,
- 14, 22, 32, 3, 215, 79, 14, 22, 32, 3, 214, 82, 14, 22, 32, 3, 213, 166,
- 14, 22, 32, 3, 213, 105, 14, 22, 32, 3, 212, 152, 14, 113, 6, 61, 14,
- 113, 6, 250, 252, 14, 113, 6, 249, 3, 14, 113, 6, 243, 177, 14, 113, 6,
- 235, 142, 14, 113, 6, 235, 27, 14, 113, 6, 204, 14, 113, 6, 75, 14, 113,
- 6, 226, 229, 14, 113, 6, 224, 240, 14, 113, 6, 197, 14, 113, 6, 218, 99,
- 14, 113, 6, 69, 14, 113, 6, 215, 79, 14, 113, 6, 214, 82, 14, 113, 6,
- 213, 166, 14, 113, 6, 213, 105, 14, 113, 6, 212, 152, 14, 113, 3, 61, 14,
- 113, 3, 253, 74, 14, 113, 3, 250, 252, 14, 113, 3, 249, 3, 14, 113, 3,
- 244, 230, 14, 113, 3, 242, 41, 14, 113, 3, 72, 14, 113, 3, 235, 142, 14,
- 113, 3, 235, 27, 14, 113, 3, 150, 14, 113, 3, 183, 14, 113, 3, 204, 14,
- 113, 3, 226, 229, 14, 113, 3, 224, 240, 14, 113, 3, 149, 14, 113, 3, 197,
- 14, 113, 3, 218, 99, 14, 113, 3, 69, 14, 113, 3, 215, 79, 14, 113, 3,
- 214, 82, 14, 113, 3, 213, 166, 14, 113, 3, 213, 105, 14, 113, 3, 212,
- 152, 14, 22, 113, 6, 61, 14, 22, 113, 6, 253, 74, 14, 22, 113, 6, 250,
- 252, 14, 22, 113, 6, 249, 3, 14, 22, 113, 6, 74, 14, 22, 113, 6, 244,
- 230, 14, 22, 113, 6, 243, 177, 14, 22, 113, 6, 242, 41, 14, 22, 113, 6,
- 72, 14, 22, 113, 6, 235, 142, 14, 22, 113, 6, 235, 27, 14, 22, 113, 6,
- 150, 14, 22, 113, 6, 183, 14, 22, 113, 6, 204, 14, 22, 113, 6, 75, 14,
- 22, 113, 6, 226, 229, 14, 22, 113, 6, 224, 240, 14, 22, 113, 6, 149, 14,
- 22, 113, 6, 197, 14, 22, 113, 6, 218, 99, 14, 22, 113, 6, 69, 14, 22,
- 113, 6, 215, 79, 14, 22, 113, 6, 214, 82, 14, 22, 113, 6, 213, 166, 14,
- 22, 113, 6, 213, 105, 14, 22, 113, 6, 212, 152, 14, 22, 113, 3, 61, 14,
- 22, 113, 3, 253, 74, 14, 22, 113, 3, 250, 252, 14, 22, 113, 3, 249, 3,
- 14, 22, 113, 3, 74, 14, 22, 113, 3, 244, 230, 14, 22, 113, 3, 243, 177,
- 14, 22, 113, 3, 242, 41, 14, 22, 113, 3, 72, 14, 22, 113, 3, 235, 142,
- 14, 22, 113, 3, 235, 27, 14, 22, 113, 3, 150, 14, 22, 113, 3, 183, 14,
- 22, 113, 3, 204, 14, 22, 113, 3, 75, 14, 22, 113, 3, 226, 229, 14, 22,
- 113, 3, 224, 240, 14, 22, 113, 3, 149, 14, 22, 113, 3, 197, 14, 22, 113,
- 3, 218, 99, 14, 22, 113, 3, 69, 14, 22, 113, 3, 215, 79, 14, 22, 113, 3,
- 214, 82, 14, 22, 113, 3, 213, 166, 14, 22, 113, 3, 213, 105, 14, 22, 113,
- 3, 212, 152, 14, 129, 6, 61, 14, 129, 6, 253, 74, 14, 129, 6, 249, 3, 14,
- 129, 6, 74, 14, 129, 6, 244, 230, 14, 129, 6, 243, 177, 14, 129, 6, 235,
- 142, 14, 129, 6, 235, 27, 14, 129, 6, 150, 14, 129, 6, 183, 14, 129, 6,
- 204, 14, 129, 6, 75, 14, 129, 6, 226, 229, 14, 129, 6, 224, 240, 14, 129,
- 6, 197, 14, 129, 6, 218, 99, 14, 129, 6, 69, 14, 129, 6, 215, 79, 14,
- 129, 6, 214, 82, 14, 129, 6, 213, 166, 14, 129, 6, 213, 105, 14, 129, 3,
- 61, 14, 129, 3, 253, 74, 14, 129, 3, 250, 252, 14, 129, 3, 249, 3, 14,
- 129, 3, 74, 14, 129, 3, 244, 230, 14, 129, 3, 243, 177, 14, 129, 3, 242,
- 41, 14, 129, 3, 72, 14, 129, 3, 235, 142, 14, 129, 3, 235, 27, 14, 129,
- 3, 150, 14, 129, 3, 183, 14, 129, 3, 204, 14, 129, 3, 75, 14, 129, 3,
- 226, 229, 14, 129, 3, 224, 240, 14, 129, 3, 149, 14, 129, 3, 197, 14,
- 129, 3, 218, 99, 14, 129, 3, 69, 14, 129, 3, 215, 79, 14, 129, 3, 214,
- 82, 14, 129, 3, 213, 166, 14, 129, 3, 213, 105, 14, 129, 3, 212, 152, 14,
- 187, 6, 61, 14, 187, 6, 253, 74, 14, 187, 6, 249, 3, 14, 187, 6, 74, 14,
- 187, 6, 244, 230, 14, 187, 6, 243, 177, 14, 187, 6, 72, 14, 187, 6, 235,
- 142, 14, 187, 6, 235, 27, 14, 187, 6, 150, 14, 187, 6, 183, 14, 187, 6,
- 75, 14, 187, 6, 197, 14, 187, 6, 218, 99, 14, 187, 6, 69, 14, 187, 6,
- 215, 79, 14, 187, 6, 214, 82, 14, 187, 6, 213, 166, 14, 187, 6, 213, 105,
- 14, 187, 3, 61, 14, 187, 3, 253, 74, 14, 187, 3, 250, 252, 14, 187, 3,
- 249, 3, 14, 187, 3, 74, 14, 187, 3, 244, 230, 14, 187, 3, 243, 177, 14,
- 187, 3, 242, 41, 14, 187, 3, 72, 14, 187, 3, 235, 142, 14, 187, 3, 235,
- 27, 14, 187, 3, 150, 14, 187, 3, 183, 14, 187, 3, 204, 14, 187, 3, 75,
- 14, 187, 3, 226, 229, 14, 187, 3, 224, 240, 14, 187, 3, 149, 14, 187, 3,
- 197, 14, 187, 3, 218, 99, 14, 187, 3, 69, 14, 187, 3, 215, 79, 14, 187,
- 3, 214, 82, 14, 187, 3, 213, 166, 14, 187, 3, 213, 105, 14, 187, 3, 212,
- 152, 14, 22, 129, 6, 61, 14, 22, 129, 6, 253, 74, 14, 22, 129, 6, 250,
- 252, 14, 22, 129, 6, 249, 3, 14, 22, 129, 6, 74, 14, 22, 129, 6, 244,
- 230, 14, 22, 129, 6, 243, 177, 14, 22, 129, 6, 242, 41, 14, 22, 129, 6,
- 72, 14, 22, 129, 6, 235, 142, 14, 22, 129, 6, 235, 27, 14, 22, 129, 6,
- 150, 14, 22, 129, 6, 183, 14, 22, 129, 6, 204, 14, 22, 129, 6, 75, 14,
- 22, 129, 6, 226, 229, 14, 22, 129, 6, 224, 240, 14, 22, 129, 6, 149, 14,
- 22, 129, 6, 197, 14, 22, 129, 6, 218, 99, 14, 22, 129, 6, 69, 14, 22,
- 129, 6, 215, 79, 14, 22, 129, 6, 214, 82, 14, 22, 129, 6, 213, 166, 14,
- 22, 129, 6, 213, 105, 14, 22, 129, 6, 212, 152, 14, 22, 129, 3, 61, 14,
- 22, 129, 3, 253, 74, 14, 22, 129, 3, 250, 252, 14, 22, 129, 3, 249, 3,
- 14, 22, 129, 3, 74, 14, 22, 129, 3, 244, 230, 14, 22, 129, 3, 243, 177,
- 14, 22, 129, 3, 242, 41, 14, 22, 129, 3, 72, 14, 22, 129, 3, 235, 142,
- 14, 22, 129, 3, 235, 27, 14, 22, 129, 3, 150, 14, 22, 129, 3, 183, 14,
- 22, 129, 3, 204, 14, 22, 129, 3, 75, 14, 22, 129, 3, 226, 229, 14, 22,
- 129, 3, 224, 240, 14, 22, 129, 3, 149, 14, 22, 129, 3, 197, 14, 22, 129,
- 3, 218, 99, 14, 22, 129, 3, 69, 14, 22, 129, 3, 215, 79, 14, 22, 129, 3,
- 214, 82, 14, 22, 129, 3, 213, 166, 14, 22, 129, 3, 213, 105, 14, 22, 129,
- 3, 212, 152, 14, 35, 6, 61, 14, 35, 6, 253, 74, 14, 35, 6, 250, 252, 14,
- 35, 6, 249, 3, 14, 35, 6, 74, 14, 35, 6, 244, 230, 14, 35, 6, 243, 177,
- 14, 35, 6, 242, 41, 14, 35, 6, 72, 14, 35, 6, 235, 142, 14, 35, 6, 235,
- 27, 14, 35, 6, 150, 14, 35, 6, 183, 14, 35, 6, 204, 14, 35, 6, 75, 14,
- 35, 6, 226, 229, 14, 35, 6, 224, 240, 14, 35, 6, 149, 14, 35, 6, 197, 14,
- 35, 6, 218, 99, 14, 35, 6, 69, 14, 35, 6, 215, 79, 14, 35, 6, 214, 82,
- 14, 35, 6, 213, 166, 14, 35, 6, 213, 105, 14, 35, 6, 212, 152, 14, 35, 3,
- 61, 14, 35, 3, 253, 74, 14, 35, 3, 250, 252, 14, 35, 3, 249, 3, 14, 35,
- 3, 74, 14, 35, 3, 244, 230, 14, 35, 3, 243, 177, 14, 35, 3, 242, 41, 14,
- 35, 3, 72, 14, 35, 3, 235, 142, 14, 35, 3, 235, 27, 14, 35, 3, 150, 14,
- 35, 3, 183, 14, 35, 3, 204, 14, 35, 3, 75, 14, 35, 3, 226, 229, 14, 35,
- 3, 224, 240, 14, 35, 3, 149, 14, 35, 3, 197, 14, 35, 3, 218, 99, 14, 35,
- 3, 69, 14, 35, 3, 215, 79, 14, 35, 3, 214, 82, 14, 35, 3, 213, 166, 14,
- 35, 3, 213, 105, 14, 35, 3, 212, 152, 14, 35, 22, 6, 61, 14, 35, 22, 6,
- 253, 74, 14, 35, 22, 6, 250, 252, 14, 35, 22, 6, 249, 3, 14, 35, 22, 6,
- 74, 14, 35, 22, 6, 244, 230, 14, 35, 22, 6, 243, 177, 14, 35, 22, 6, 242,
- 41, 14, 35, 22, 6, 72, 14, 35, 22, 6, 235, 142, 14, 35, 22, 6, 235, 27,
- 14, 35, 22, 6, 150, 14, 35, 22, 6, 183, 14, 35, 22, 6, 204, 14, 35, 22,
- 6, 75, 14, 35, 22, 6, 226, 229, 14, 35, 22, 6, 224, 240, 14, 35, 22, 6,
- 149, 14, 35, 22, 6, 197, 14, 35, 22, 6, 218, 99, 14, 35, 22, 6, 69, 14,
- 35, 22, 6, 215, 79, 14, 35, 22, 6, 214, 82, 14, 35, 22, 6, 213, 166, 14,
- 35, 22, 6, 213, 105, 14, 35, 22, 6, 212, 152, 14, 35, 22, 3, 61, 14, 35,
- 22, 3, 253, 74, 14, 35, 22, 3, 250, 252, 14, 35, 22, 3, 249, 3, 14, 35,
- 22, 3, 74, 14, 35, 22, 3, 244, 230, 14, 35, 22, 3, 243, 177, 14, 35, 22,
- 3, 242, 41, 14, 35, 22, 3, 72, 14, 35, 22, 3, 235, 142, 14, 35, 22, 3,
- 235, 27, 14, 35, 22, 3, 150, 14, 35, 22, 3, 183, 14, 35, 22, 3, 204, 14,
- 35, 22, 3, 75, 14, 35, 22, 3, 226, 229, 14, 35, 22, 3, 224, 240, 14, 35,
- 22, 3, 149, 14, 35, 22, 3, 197, 14, 35, 22, 3, 218, 99, 14, 35, 22, 3,
- 69, 14, 35, 22, 3, 215, 79, 14, 35, 22, 3, 214, 82, 14, 35, 22, 3, 213,
- 166, 14, 35, 22, 3, 213, 105, 14, 35, 22, 3, 212, 152, 14, 35, 32, 6, 61,
- 14, 35, 32, 6, 253, 74, 14, 35, 32, 6, 250, 252, 14, 35, 32, 6, 249, 3,
- 14, 35, 32, 6, 74, 14, 35, 32, 6, 244, 230, 14, 35, 32, 6, 243, 177, 14,
- 35, 32, 6, 242, 41, 14, 35, 32, 6, 72, 14, 35, 32, 6, 235, 142, 14, 35,
- 32, 6, 235, 27, 14, 35, 32, 6, 150, 14, 35, 32, 6, 183, 14, 35, 32, 6,
- 204, 14, 35, 32, 6, 75, 14, 35, 32, 6, 226, 229, 14, 35, 32, 6, 224, 240,
- 14, 35, 32, 6, 149, 14, 35, 32, 6, 197, 14, 35, 32, 6, 218, 99, 14, 35,
- 32, 6, 69, 14, 35, 32, 6, 215, 79, 14, 35, 32, 6, 214, 82, 14, 35, 32, 6,
- 213, 166, 14, 35, 32, 6, 213, 105, 14, 35, 32, 6, 212, 152, 14, 35, 32,
- 3, 61, 14, 35, 32, 3, 253, 74, 14, 35, 32, 3, 250, 252, 14, 35, 32, 3,
- 249, 3, 14, 35, 32, 3, 74, 14, 35, 32, 3, 244, 230, 14, 35, 32, 3, 243,
- 177, 14, 35, 32, 3, 242, 41, 14, 35, 32, 3, 72, 14, 35, 32, 3, 235, 142,
- 14, 35, 32, 3, 235, 27, 14, 35, 32, 3, 150, 14, 35, 32, 3, 183, 14, 35,
- 32, 3, 204, 14, 35, 32, 3, 75, 14, 35, 32, 3, 226, 229, 14, 35, 32, 3,
- 224, 240, 14, 35, 32, 3, 149, 14, 35, 32, 3, 197, 14, 35, 32, 3, 218, 99,
- 14, 35, 32, 3, 69, 14, 35, 32, 3, 215, 79, 14, 35, 32, 3, 214, 82, 14,
- 35, 32, 3, 213, 166, 14, 35, 32, 3, 213, 105, 14, 35, 32, 3, 212, 152,
- 14, 35, 22, 32, 6, 61, 14, 35, 22, 32, 6, 253, 74, 14, 35, 22, 32, 6,
- 250, 252, 14, 35, 22, 32, 6, 249, 3, 14, 35, 22, 32, 6, 74, 14, 35, 22,
- 32, 6, 244, 230, 14, 35, 22, 32, 6, 243, 177, 14, 35, 22, 32, 6, 242, 41,
- 14, 35, 22, 32, 6, 72, 14, 35, 22, 32, 6, 235, 142, 14, 35, 22, 32, 6,
- 235, 27, 14, 35, 22, 32, 6, 150, 14, 35, 22, 32, 6, 183, 14, 35, 22, 32,
- 6, 204, 14, 35, 22, 32, 6, 75, 14, 35, 22, 32, 6, 226, 229, 14, 35, 22,
- 32, 6, 224, 240, 14, 35, 22, 32, 6, 149, 14, 35, 22, 32, 6, 197, 14, 35,
- 22, 32, 6, 218, 99, 14, 35, 22, 32, 6, 69, 14, 35, 22, 32, 6, 215, 79,
- 14, 35, 22, 32, 6, 214, 82, 14, 35, 22, 32, 6, 213, 166, 14, 35, 22, 32,
- 6, 213, 105, 14, 35, 22, 32, 6, 212, 152, 14, 35, 22, 32, 3, 61, 14, 35,
- 22, 32, 3, 253, 74, 14, 35, 22, 32, 3, 250, 252, 14, 35, 22, 32, 3, 249,
- 3, 14, 35, 22, 32, 3, 74, 14, 35, 22, 32, 3, 244, 230, 14, 35, 22, 32, 3,
- 243, 177, 14, 35, 22, 32, 3, 242, 41, 14, 35, 22, 32, 3, 72, 14, 35, 22,
- 32, 3, 235, 142, 14, 35, 22, 32, 3, 235, 27, 14, 35, 22, 32, 3, 150, 14,
- 35, 22, 32, 3, 183, 14, 35, 22, 32, 3, 204, 14, 35, 22, 32, 3, 75, 14,
- 35, 22, 32, 3, 226, 229, 14, 35, 22, 32, 3, 224, 240, 14, 35, 22, 32, 3,
- 149, 14, 35, 22, 32, 3, 197, 14, 35, 22, 32, 3, 218, 99, 14, 35, 22, 32,
- 3, 69, 14, 35, 22, 32, 3, 215, 79, 14, 35, 22, 32, 3, 214, 82, 14, 35,
- 22, 32, 3, 213, 166, 14, 35, 22, 32, 3, 213, 105, 14, 35, 22, 32, 3, 212,
- 152, 14, 230, 208, 6, 61, 14, 230, 208, 6, 253, 74, 14, 230, 208, 6, 250,
- 252, 14, 230, 208, 6, 249, 3, 14, 230, 208, 6, 74, 14, 230, 208, 6, 244,
- 230, 14, 230, 208, 6, 243, 177, 14, 230, 208, 6, 242, 41, 14, 230, 208,
- 6, 72, 14, 230, 208, 6, 235, 142, 14, 230, 208, 6, 235, 27, 14, 230, 208,
- 6, 150, 14, 230, 208, 6, 183, 14, 230, 208, 6, 204, 14, 230, 208, 6, 75,
- 14, 230, 208, 6, 226, 229, 14, 230, 208, 6, 224, 240, 14, 230, 208, 6,
- 149, 14, 230, 208, 6, 197, 14, 230, 208, 6, 218, 99, 14, 230, 208, 6, 69,
- 14, 230, 208, 6, 215, 79, 14, 230, 208, 6, 214, 82, 14, 230, 208, 6, 213,
- 166, 14, 230, 208, 6, 213, 105, 14, 230, 208, 6, 212, 152, 14, 230, 208,
- 3, 61, 14, 230, 208, 3, 253, 74, 14, 230, 208, 3, 250, 252, 14, 230, 208,
- 3, 249, 3, 14, 230, 208, 3, 74, 14, 230, 208, 3, 244, 230, 14, 230, 208,
- 3, 243, 177, 14, 230, 208, 3, 242, 41, 14, 230, 208, 3, 72, 14, 230, 208,
- 3, 235, 142, 14, 230, 208, 3, 235, 27, 14, 230, 208, 3, 150, 14, 230,
- 208, 3, 183, 14, 230, 208, 3, 204, 14, 230, 208, 3, 75, 14, 230, 208, 3,
- 226, 229, 14, 230, 208, 3, 224, 240, 14, 230, 208, 3, 149, 14, 230, 208,
- 3, 197, 14, 230, 208, 3, 218, 99, 14, 230, 208, 3, 69, 14, 230, 208, 3,
- 215, 79, 14, 230, 208, 3, 214, 82, 14, 230, 208, 3, 213, 166, 14, 230,
- 208, 3, 213, 105, 14, 230, 208, 3, 212, 152, 14, 32, 3, 247, 73, 72, 14,
- 32, 3, 247, 73, 235, 142, 14, 22, 6, 254, 52, 14, 22, 6, 251, 203, 14,
- 22, 6, 243, 83, 14, 22, 6, 248, 5, 14, 22, 6, 245, 63, 14, 22, 6, 212,
- 78, 14, 22, 6, 245, 28, 14, 22, 6, 217, 132, 14, 22, 6, 235, 183, 14, 22,
- 6, 234, 227, 14, 22, 6, 233, 122, 14, 22, 6, 230, 172, 14, 22, 6, 228,
- 92, 14, 22, 6, 213, 145, 14, 22, 6, 227, 65, 14, 22, 6, 225, 240, 14, 22,
- 6, 223, 190, 14, 22, 6, 217, 133, 87, 14, 22, 6, 220, 103, 14, 22, 6,
- 217, 248, 14, 22, 6, 215, 128, 14, 22, 6, 226, 9, 14, 22, 6, 250, 47, 14,
- 22, 6, 225, 46, 14, 22, 6, 227, 67, 14, 22, 230, 39, 14, 22, 3, 254, 52,
- 14, 22, 3, 251, 203, 14, 22, 3, 243, 83, 14, 22, 3, 248, 5, 14, 22, 3,
- 245, 63, 14, 22, 3, 212, 78, 14, 22, 3, 245, 28, 14, 22, 3, 217, 132, 14,
- 22, 3, 235, 183, 14, 22, 3, 234, 227, 14, 22, 3, 233, 122, 14, 22, 3,
- 230, 172, 14, 22, 3, 228, 92, 14, 22, 3, 213, 145, 14, 22, 3, 227, 65,
- 14, 22, 3, 225, 240, 14, 22, 3, 223, 190, 14, 22, 3, 40, 220, 103, 14,
- 22, 3, 220, 103, 14, 22, 3, 217, 248, 14, 22, 3, 215, 128, 14, 22, 3,
- 226, 9, 14, 22, 3, 250, 47, 14, 22, 3, 225, 46, 14, 22, 3, 227, 67, 14,
- 22, 226, 125, 247, 185, 14, 22, 245, 64, 87, 14, 22, 217, 133, 87, 14,
- 22, 234, 228, 87, 14, 22, 226, 10, 87, 14, 22, 223, 191, 87, 14, 22, 225,
- 241, 87, 14, 32, 6, 254, 52, 14, 32, 6, 251, 203, 14, 32, 6, 243, 83, 14,
- 32, 6, 248, 5, 14, 32, 6, 245, 63, 14, 32, 6, 212, 78, 14, 32, 6, 245,
- 28, 14, 32, 6, 217, 132, 14, 32, 6, 235, 183, 14, 32, 6, 234, 227, 14,
- 32, 6, 233, 122, 14, 32, 6, 230, 172, 14, 32, 6, 228, 92, 14, 32, 6, 213,
- 145, 14, 32, 6, 227, 65, 14, 32, 6, 225, 240, 14, 32, 6, 223, 190, 14,
- 32, 6, 217, 133, 87, 14, 32, 6, 220, 103, 14, 32, 6, 217, 248, 14, 32, 6,
- 215, 128, 14, 32, 6, 226, 9, 14, 32, 6, 250, 47, 14, 32, 6, 225, 46, 14,
- 32, 6, 227, 67, 14, 32, 230, 39, 14, 32, 3, 254, 52, 14, 32, 3, 251, 203,
- 14, 32, 3, 243, 83, 14, 32, 3, 248, 5, 14, 32, 3, 245, 63, 14, 32, 3,
- 212, 78, 14, 32, 3, 245, 28, 14, 32, 3, 217, 132, 14, 32, 3, 235, 183,
- 14, 32, 3, 234, 227, 14, 32, 3, 233, 122, 14, 32, 3, 230, 172, 14, 32, 3,
- 228, 92, 14, 32, 3, 213, 145, 14, 32, 3, 227, 65, 14, 32, 3, 225, 240,
- 14, 32, 3, 223, 190, 14, 32, 3, 40, 220, 103, 14, 32, 3, 220, 103, 14,
- 32, 3, 217, 248, 14, 32, 3, 215, 128, 14, 32, 3, 226, 9, 14, 32, 3, 250,
- 47, 14, 32, 3, 225, 46, 14, 32, 3, 227, 67, 14, 32, 226, 125, 247, 185,
- 14, 32, 245, 64, 87, 14, 32, 217, 133, 87, 14, 32, 234, 228, 87, 14, 32,
- 226, 10, 87, 14, 32, 223, 191, 87, 14, 32, 225, 241, 87, 14, 22, 32, 6,
- 254, 52, 14, 22, 32, 6, 251, 203, 14, 22, 32, 6, 243, 83, 14, 22, 32, 6,
- 248, 5, 14, 22, 32, 6, 245, 63, 14, 22, 32, 6, 212, 78, 14, 22, 32, 6,
- 245, 28, 14, 22, 32, 6, 217, 132, 14, 22, 32, 6, 235, 183, 14, 22, 32, 6,
- 234, 227, 14, 22, 32, 6, 233, 122, 14, 22, 32, 6, 230, 172, 14, 22, 32,
- 6, 228, 92, 14, 22, 32, 6, 213, 145, 14, 22, 32, 6, 227, 65, 14, 22, 32,
- 6, 225, 240, 14, 22, 32, 6, 223, 190, 14, 22, 32, 6, 217, 133, 87, 14,
- 22, 32, 6, 220, 103, 14, 22, 32, 6, 217, 248, 14, 22, 32, 6, 215, 128,
- 14, 22, 32, 6, 226, 9, 14, 22, 32, 6, 250, 47, 14, 22, 32, 6, 225, 46,
- 14, 22, 32, 6, 227, 67, 14, 22, 32, 230, 39, 14, 22, 32, 3, 254, 52, 14,
- 22, 32, 3, 251, 203, 14, 22, 32, 3, 243, 83, 14, 22, 32, 3, 248, 5, 14,
- 22, 32, 3, 245, 63, 14, 22, 32, 3, 212, 78, 14, 22, 32, 3, 245, 28, 14,
- 22, 32, 3, 217, 132, 14, 22, 32, 3, 235, 183, 14, 22, 32, 3, 234, 227,
- 14, 22, 32, 3, 233, 122, 14, 22, 32, 3, 230, 172, 14, 22, 32, 3, 228, 92,
- 14, 22, 32, 3, 213, 145, 14, 22, 32, 3, 227, 65, 14, 22, 32, 3, 225, 240,
- 14, 22, 32, 3, 223, 190, 14, 22, 32, 3, 40, 220, 103, 14, 22, 32, 3, 220,
- 103, 14, 22, 32, 3, 217, 248, 14, 22, 32, 3, 215, 128, 14, 22, 32, 3,
- 226, 9, 14, 22, 32, 3, 250, 47, 14, 22, 32, 3, 225, 46, 14, 22, 32, 3,
- 227, 67, 14, 22, 32, 226, 125, 247, 185, 14, 22, 32, 245, 64, 87, 14, 22,
- 32, 217, 133, 87, 14, 22, 32, 234, 228, 87, 14, 22, 32, 226, 10, 87, 14,
- 22, 32, 223, 191, 87, 14, 22, 32, 225, 241, 87, 14, 35, 22, 6, 254, 52,
- 14, 35, 22, 6, 251, 203, 14, 35, 22, 6, 243, 83, 14, 35, 22, 6, 248, 5,
- 14, 35, 22, 6, 245, 63, 14, 35, 22, 6, 212, 78, 14, 35, 22, 6, 245, 28,
- 14, 35, 22, 6, 217, 132, 14, 35, 22, 6, 235, 183, 14, 35, 22, 6, 234,
- 227, 14, 35, 22, 6, 233, 122, 14, 35, 22, 6, 230, 172, 14, 35, 22, 6,
- 228, 92, 14, 35, 22, 6, 213, 145, 14, 35, 22, 6, 227, 65, 14, 35, 22, 6,
- 225, 240, 14, 35, 22, 6, 223, 190, 14, 35, 22, 6, 217, 133, 87, 14, 35,
- 22, 6, 220, 103, 14, 35, 22, 6, 217, 248, 14, 35, 22, 6, 215, 128, 14,
- 35, 22, 6, 226, 9, 14, 35, 22, 6, 250, 47, 14, 35, 22, 6, 225, 46, 14,
- 35, 22, 6, 227, 67, 14, 35, 22, 230, 39, 14, 35, 22, 3, 254, 52, 14, 35,
- 22, 3, 251, 203, 14, 35, 22, 3, 243, 83, 14, 35, 22, 3, 248, 5, 14, 35,
- 22, 3, 245, 63, 14, 35, 22, 3, 212, 78, 14, 35, 22, 3, 245, 28, 14, 35,
- 22, 3, 217, 132, 14, 35, 22, 3, 235, 183, 14, 35, 22, 3, 234, 227, 14,
- 35, 22, 3, 233, 122, 14, 35, 22, 3, 230, 172, 14, 35, 22, 3, 228, 92, 14,
- 35, 22, 3, 213, 145, 14, 35, 22, 3, 227, 65, 14, 35, 22, 3, 225, 240, 14,
- 35, 22, 3, 223, 190, 14, 35, 22, 3, 40, 220, 103, 14, 35, 22, 3, 220,
- 103, 14, 35, 22, 3, 217, 248, 14, 35, 22, 3, 215, 128, 14, 35, 22, 3,
- 226, 9, 14, 35, 22, 3, 250, 47, 14, 35, 22, 3, 225, 46, 14, 35, 22, 3,
- 227, 67, 14, 35, 22, 226, 125, 247, 185, 14, 35, 22, 245, 64, 87, 14, 35,
- 22, 217, 133, 87, 14, 35, 22, 234, 228, 87, 14, 35, 22, 226, 10, 87, 14,
- 35, 22, 223, 191, 87, 14, 35, 22, 225, 241, 87, 14, 35, 22, 32, 6, 254,
- 52, 14, 35, 22, 32, 6, 251, 203, 14, 35, 22, 32, 6, 243, 83, 14, 35, 22,
- 32, 6, 248, 5, 14, 35, 22, 32, 6, 245, 63, 14, 35, 22, 32, 6, 212, 78,
- 14, 35, 22, 32, 6, 245, 28, 14, 35, 22, 32, 6, 217, 132, 14, 35, 22, 32,
- 6, 235, 183, 14, 35, 22, 32, 6, 234, 227, 14, 35, 22, 32, 6, 233, 122,
- 14, 35, 22, 32, 6, 230, 172, 14, 35, 22, 32, 6, 228, 92, 14, 35, 22, 32,
- 6, 213, 145, 14, 35, 22, 32, 6, 227, 65, 14, 35, 22, 32, 6, 225, 240, 14,
- 35, 22, 32, 6, 223, 190, 14, 35, 22, 32, 6, 217, 133, 87, 14, 35, 22, 32,
- 6, 220, 103, 14, 35, 22, 32, 6, 217, 248, 14, 35, 22, 32, 6, 215, 128,
- 14, 35, 22, 32, 6, 226, 9, 14, 35, 22, 32, 6, 250, 47, 14, 35, 22, 32, 6,
- 225, 46, 14, 35, 22, 32, 6, 227, 67, 14, 35, 22, 32, 230, 39, 14, 35, 22,
- 32, 3, 254, 52, 14, 35, 22, 32, 3, 251, 203, 14, 35, 22, 32, 3, 243, 83,
- 14, 35, 22, 32, 3, 248, 5, 14, 35, 22, 32, 3, 245, 63, 14, 35, 22, 32, 3,
- 212, 78, 14, 35, 22, 32, 3, 245, 28, 14, 35, 22, 32, 3, 217, 132, 14, 35,
- 22, 32, 3, 235, 183, 14, 35, 22, 32, 3, 234, 227, 14, 35, 22, 32, 3, 233,
- 122, 14, 35, 22, 32, 3, 230, 172, 14, 35, 22, 32, 3, 228, 92, 14, 35, 22,
- 32, 3, 213, 145, 14, 35, 22, 32, 3, 227, 65, 14, 35, 22, 32, 3, 225, 240,
- 14, 35, 22, 32, 3, 223, 190, 14, 35, 22, 32, 3, 40, 220, 103, 14, 35, 22,
- 32, 3, 220, 103, 14, 35, 22, 32, 3, 217, 248, 14, 35, 22, 32, 3, 215,
- 128, 14, 35, 22, 32, 3, 226, 9, 14, 35, 22, 32, 3, 250, 47, 14, 35, 22,
- 32, 3, 225, 46, 14, 35, 22, 32, 3, 227, 67, 14, 35, 22, 32, 226, 125,
- 247, 185, 14, 35, 22, 32, 245, 64, 87, 14, 35, 22, 32, 217, 133, 87, 14,
- 35, 22, 32, 234, 228, 87, 14, 35, 22, 32, 226, 10, 87, 14, 35, 22, 32,
- 223, 191, 87, 14, 35, 22, 32, 225, 241, 87, 14, 22, 6, 247, 179, 14, 22,
- 3, 247, 179, 14, 22, 21, 212, 79, 14, 22, 21, 116, 14, 22, 21, 109, 14,
- 22, 21, 166, 14, 22, 21, 163, 14, 22, 21, 180, 14, 22, 21, 189, 14, 22,
- 21, 198, 14, 22, 21, 195, 14, 22, 21, 200, 14, 187, 21, 212, 79, 14, 187,
- 21, 116, 14, 187, 21, 109, 14, 187, 21, 166, 14, 187, 21, 163, 14, 187,
- 21, 180, 14, 187, 21, 189, 14, 187, 21, 198, 14, 187, 21, 195, 14, 187,
- 21, 200, 14, 35, 21, 212, 79, 14, 35, 21, 116, 14, 35, 21, 109, 14, 35,
- 21, 166, 14, 35, 21, 163, 14, 35, 21, 180, 14, 35, 21, 189, 14, 35, 21,
- 198, 14, 35, 21, 195, 14, 35, 21, 200, 14, 35, 22, 21, 212, 79, 14, 35,
- 22, 21, 116, 14, 35, 22, 21, 109, 14, 35, 22, 21, 166, 14, 35, 22, 21,
- 163, 14, 35, 22, 21, 180, 14, 35, 22, 21, 189, 14, 35, 22, 21, 198, 14,
- 35, 22, 21, 195, 14, 35, 22, 21, 200, 14, 230, 208, 21, 212, 79, 14, 230,
- 208, 21, 116, 14, 230, 208, 21, 109, 14, 230, 208, 21, 166, 14, 230, 208,
- 21, 163, 14, 230, 208, 21, 180, 14, 230, 208, 21, 189, 14, 230, 208, 21,
- 198, 14, 230, 208, 21, 195, 14, 230, 208, 21, 200, 232, 10, 85, 245, 176,
- 213, 224, 232, 10, 85, 219, 215, 213, 224, 232, 10, 85, 213, 250, 213,
- 224, 232, 10, 85, 228, 167, 213, 224, 232, 10, 85, 224, 4, 246, 50, 232,
- 10, 85, 242, 104, 246, 50, 232, 10, 85, 67, 246, 50, 232, 10, 85, 122,
- 65, 250, 77, 232, 10, 85, 117, 65, 250, 77, 232, 10, 85, 133, 65, 250,
- 77, 232, 10, 85, 243, 237, 65, 250, 77, 232, 10, 85, 244, 50, 65, 250,
- 77, 232, 10, 85, 220, 53, 65, 250, 77, 232, 10, 85, 221, 43, 65, 250, 77,
- 232, 10, 85, 245, 150, 65, 250, 77, 232, 10, 85, 229, 31, 65, 250, 77,
- 232, 10, 85, 122, 65, 252, 72, 232, 10, 85, 117, 65, 252, 72, 232, 10,
- 85, 133, 65, 252, 72, 232, 10, 85, 243, 237, 65, 252, 72, 232, 10, 85,
- 244, 50, 65, 252, 72, 232, 10, 85, 220, 53, 65, 252, 72, 232, 10, 85,
- 221, 43, 65, 252, 72, 232, 10, 85, 245, 150, 65, 252, 72, 232, 10, 85,
- 229, 31, 65, 252, 72, 232, 10, 85, 122, 65, 249, 227, 232, 10, 85, 117,
- 65, 249, 227, 232, 10, 85, 133, 65, 249, 227, 232, 10, 85, 243, 237, 65,
- 249, 227, 232, 10, 85, 244, 50, 65, 249, 227, 232, 10, 85, 220, 53, 65,
- 249, 227, 232, 10, 85, 221, 43, 65, 249, 227, 232, 10, 85, 245, 150, 65,
- 249, 227, 232, 10, 85, 229, 31, 65, 249, 227, 232, 10, 85, 225, 159, 232,
- 10, 85, 227, 22, 232, 10, 85, 252, 73, 232, 10, 85, 250, 7, 232, 10, 85,
- 219, 171, 232, 10, 85, 218, 240, 232, 10, 85, 253, 95, 232, 10, 85, 213,
- 217, 232, 10, 85, 235, 65, 232, 10, 85, 252, 101, 127, 85, 199, 252, 101,
- 127, 85, 241, 30, 127, 85, 241, 29, 127, 85, 241, 28, 127, 85, 241, 27,
- 127, 85, 241, 26, 127, 85, 241, 25, 127, 85, 241, 24, 127, 85, 241, 23,
- 127, 85, 241, 22, 127, 85, 241, 21, 127, 85, 241, 20, 127, 85, 241, 19,
- 127, 85, 241, 18, 127, 85, 241, 17, 127, 85, 241, 16, 127, 85, 241, 15,
- 127, 85, 241, 14, 127, 85, 241, 13, 127, 85, 241, 12, 127, 85, 241, 11,
- 127, 85, 241, 10, 127, 85, 241, 9, 127, 85, 241, 8, 127, 85, 241, 7, 127,
- 85, 241, 6, 127, 85, 241, 5, 127, 85, 241, 4, 127, 85, 241, 3, 127, 85,
- 241, 2, 127, 85, 241, 1, 127, 85, 241, 0, 127, 85, 240, 255, 127, 85,
- 240, 254, 127, 85, 240, 253, 127, 85, 240, 252, 127, 85, 240, 251, 127,
- 85, 240, 250, 127, 85, 240, 249, 127, 85, 240, 248, 127, 85, 240, 247,
- 127, 85, 240, 246, 127, 85, 240, 245, 127, 85, 240, 244, 127, 85, 240,
- 243, 127, 85, 240, 242, 127, 85, 240, 241, 127, 85, 240, 240, 127, 85,
- 240, 239, 127, 85, 240, 238, 127, 85, 71, 252, 101, 127, 85, 214, 215,
- 127, 85, 214, 214, 127, 85, 214, 213, 127, 85, 214, 212, 127, 85, 214,
- 211, 127, 85, 214, 210, 127, 85, 214, 209, 127, 85, 214, 208, 127, 85,
- 214, 207, 127, 85, 214, 206, 127, 85, 214, 205, 127, 85, 214, 204, 127,
- 85, 214, 203, 127, 85, 214, 202, 127, 85, 214, 201, 127, 85, 214, 200,
- 127, 85, 214, 199, 127, 85, 214, 198, 127, 85, 214, 197, 127, 85, 214,
- 196, 127, 85, 214, 195, 127, 85, 214, 194, 127, 85, 214, 193, 127, 85,
- 214, 192, 127, 85, 214, 191, 127, 85, 214, 190, 127, 85, 214, 189, 127,
- 85, 214, 188, 127, 85, 214, 187, 127, 85, 214, 186, 127, 85, 214, 185,
- 127, 85, 214, 184, 127, 85, 214, 183, 127, 85, 214, 182, 127, 85, 214,
- 181, 127, 85, 214, 180, 127, 85, 214, 179, 127, 85, 214, 178, 127, 85,
- 214, 177, 127, 85, 214, 176, 127, 85, 214, 175, 127, 85, 214, 174, 127,
- 85, 214, 173, 127, 85, 214, 172, 127, 85, 214, 171, 127, 85, 214, 170,
- 127, 85, 214, 169, 127, 85, 214, 168, 127, 85, 214, 167, 225, 165, 250,
- 175, 252, 101, 225, 165, 250, 175, 254, 169, 65, 219, 203, 225, 165, 250,
- 175, 117, 65, 219, 203, 225, 165, 250, 175, 133, 65, 219, 203, 225, 165,
- 250, 175, 243, 237, 65, 219, 203, 225, 165, 250, 175, 244, 50, 65, 219,
- 203, 225, 165, 250, 175, 220, 53, 65, 219, 203, 225, 165, 250, 175, 221,
- 43, 65, 219, 203, 225, 165, 250, 175, 245, 150, 65, 219, 203, 225, 165,
- 250, 175, 229, 31, 65, 219, 203, 225, 165, 250, 175, 217, 201, 65, 219,
- 203, 225, 165, 250, 175, 235, 137, 65, 219, 203, 225, 165, 250, 175, 234,
- 40, 65, 219, 203, 225, 165, 250, 175, 224, 160, 65, 219, 203, 225, 165,
- 250, 175, 234, 88, 65, 219, 203, 225, 165, 250, 175, 254, 169, 65, 241,
- 209, 225, 165, 250, 175, 117, 65, 241, 209, 225, 165, 250, 175, 133, 65,
- 241, 209, 225, 165, 250, 175, 243, 237, 65, 241, 209, 225, 165, 250, 175,
- 244, 50, 65, 241, 209, 225, 165, 250, 175, 220, 53, 65, 241, 209, 225,
- 165, 250, 175, 221, 43, 65, 241, 209, 225, 165, 250, 175, 245, 150, 65,
- 241, 209, 225, 165, 250, 175, 229, 31, 65, 241, 209, 225, 165, 250, 175,
- 217, 201, 65, 241, 209, 225, 165, 250, 175, 235, 137, 65, 241, 209, 225,
- 165, 250, 175, 234, 40, 65, 241, 209, 225, 165, 250, 175, 224, 160, 65,
- 241, 209, 225, 165, 250, 175, 234, 88, 65, 241, 209, 225, 165, 250, 175,
- 254, 169, 65, 247, 199, 225, 165, 250, 175, 117, 65, 247, 199, 225, 165,
- 250, 175, 133, 65, 247, 199, 225, 165, 250, 175, 243, 237, 65, 247, 199,
- 225, 165, 250, 175, 244, 50, 65, 247, 199, 225, 165, 250, 175, 220, 53,
- 65, 247, 199, 225, 165, 250, 175, 221, 43, 65, 247, 199, 225, 165, 250,
- 175, 245, 150, 65, 247, 199, 225, 165, 250, 175, 229, 31, 65, 247, 199,
- 225, 165, 250, 175, 217, 201, 65, 247, 199, 225, 165, 250, 175, 235, 137,
- 65, 247, 199, 225, 165, 250, 175, 234, 40, 65, 247, 199, 225, 165, 250,
- 175, 224, 160, 65, 247, 199, 225, 165, 250, 175, 234, 88, 65, 247, 199,
- 225, 165, 250, 175, 83, 235, 65, 225, 165, 250, 175, 254, 169, 65, 249,
- 179, 225, 165, 250, 175, 117, 65, 249, 179, 225, 165, 250, 175, 133, 65,
- 249, 179, 225, 165, 250, 175, 243, 237, 65, 249, 179, 225, 165, 250, 175,
- 244, 50, 65, 249, 179, 225, 165, 250, 175, 220, 53, 65, 249, 179, 225,
- 165, 250, 175, 221, 43, 65, 249, 179, 225, 165, 250, 175, 245, 150, 65,
- 249, 179, 225, 165, 250, 175, 229, 31, 65, 249, 179, 225, 165, 250, 175,
- 217, 201, 65, 249, 179, 225, 165, 250, 175, 235, 137, 65, 249, 179, 225,
- 165, 250, 175, 234, 40, 65, 249, 179, 225, 165, 250, 175, 224, 160, 65,
- 249, 179, 225, 165, 250, 175, 234, 88, 65, 249, 179, 225, 165, 250, 175,
- 67, 235, 65, 21, 212, 80, 243, 200, 219, 69, 21, 212, 80, 249, 157, 21,
- 122, 249, 157, 21, 117, 249, 157, 21, 133, 249, 157, 21, 243, 237, 249,
- 157, 21, 244, 50, 249, 157, 21, 220, 53, 249, 157, 21, 221, 43, 249, 157,
- 21, 245, 150, 249, 157, 21, 229, 31, 249, 157, 86, 7, 6, 1, 61, 86, 7, 6,
- 1, 253, 74, 86, 7, 6, 1, 250, 252, 86, 7, 6, 1, 249, 3, 86, 7, 6, 1, 74,
- 86, 7, 6, 1, 244, 230, 86, 7, 6, 1, 243, 177, 86, 7, 6, 1, 242, 41, 86,
- 7, 6, 1, 72, 86, 7, 6, 1, 235, 142, 86, 7, 6, 1, 235, 27, 86, 7, 6, 1,
- 150, 86, 7, 6, 1, 183, 86, 7, 6, 1, 204, 86, 7, 6, 1, 75, 86, 7, 6, 1,
- 226, 229, 86, 7, 6, 1, 224, 240, 86, 7, 6, 1, 149, 86, 7, 6, 1, 197, 86,
- 7, 6, 1, 218, 99, 86, 7, 6, 1, 69, 86, 7, 6, 1, 215, 79, 86, 7, 6, 1,
- 214, 82, 86, 7, 6, 1, 213, 166, 86, 7, 6, 1, 213, 105, 86, 7, 6, 1, 212,
- 152, 216, 219, 220, 233, 251, 84, 7, 6, 1, 197, 36, 32, 7, 6, 1, 250,
- 252, 36, 32, 7, 6, 1, 149, 36, 250, 125, 36, 213, 168, 91, 7, 6, 1, 61,
- 91, 7, 6, 1, 253, 74, 91, 7, 6, 1, 250, 252, 91, 7, 6, 1, 249, 3, 91, 7,
- 6, 1, 74, 91, 7, 6, 1, 244, 230, 91, 7, 6, 1, 243, 177, 91, 7, 6, 1, 242,
- 41, 91, 7, 6, 1, 72, 91, 7, 6, 1, 235, 142, 91, 7, 6, 1, 235, 27, 91, 7,
- 6, 1, 150, 91, 7, 6, 1, 183, 91, 7, 6, 1, 204, 91, 7, 6, 1, 75, 91, 7, 6,
- 1, 226, 229, 91, 7, 6, 1, 224, 240, 91, 7, 6, 1, 149, 91, 7, 6, 1, 197,
- 91, 7, 6, 1, 218, 99, 91, 7, 6, 1, 69, 91, 7, 6, 1, 215, 79, 91, 7, 6, 1,
- 214, 82, 91, 7, 6, 1, 213, 166, 91, 7, 6, 1, 213, 105, 91, 7, 6, 1, 212,
- 152, 91, 240, 193, 91, 230, 120, 91, 222, 102, 91, 219, 158, 91, 225, 98,
- 91, 214, 7, 146, 36, 7, 6, 1, 61, 146, 36, 7, 6, 1, 253, 74, 146, 36, 7,
- 6, 1, 250, 252, 146, 36, 7, 6, 1, 249, 3, 146, 36, 7, 6, 1, 74, 146, 36,
- 7, 6, 1, 244, 230, 146, 36, 7, 6, 1, 243, 177, 146, 36, 7, 6, 1, 242, 41,
- 146, 36, 7, 6, 1, 72, 146, 36, 7, 6, 1, 235, 142, 146, 36, 7, 6, 1, 235,
- 27, 146, 36, 7, 6, 1, 150, 146, 36, 7, 6, 1, 183, 146, 36, 7, 6, 1, 204,
- 146, 36, 7, 6, 1, 75, 146, 36, 7, 6, 1, 226, 229, 146, 36, 7, 6, 1, 224,
- 240, 146, 36, 7, 6, 1, 149, 146, 36, 7, 6, 1, 197, 146, 36, 7, 6, 1, 218,
- 99, 146, 36, 7, 6, 1, 69, 146, 36, 7, 6, 1, 215, 79, 146, 36, 7, 6, 1,
- 214, 82, 146, 36, 7, 6, 1, 213, 166, 146, 36, 7, 6, 1, 213, 105, 146, 36,
- 7, 6, 1, 212, 152, 146, 91, 7, 6, 1, 61, 146, 91, 7, 6, 1, 253, 74, 146,
- 91, 7, 6, 1, 250, 252, 146, 91, 7, 6, 1, 249, 3, 146, 91, 7, 6, 1, 74,
- 146, 91, 7, 6, 1, 244, 230, 146, 91, 7, 6, 1, 243, 177, 146, 91, 7, 6, 1,
- 242, 41, 146, 91, 7, 6, 1, 72, 146, 91, 7, 6, 1, 235, 142, 146, 91, 7, 6,
- 1, 235, 27, 146, 91, 7, 6, 1, 150, 146, 91, 7, 6, 1, 183, 146, 91, 7, 6,
- 1, 204, 146, 91, 7, 6, 1, 75, 146, 91, 7, 6, 1, 226, 229, 146, 91, 7, 6,
- 1, 224, 240, 146, 91, 7, 6, 1, 149, 146, 91, 7, 6, 1, 197, 146, 91, 7, 6,
- 1, 218, 99, 146, 91, 7, 6, 1, 69, 146, 91, 7, 6, 1, 215, 79, 146, 91, 7,
- 6, 1, 214, 82, 146, 91, 7, 6, 1, 213, 166, 146, 91, 7, 6, 1, 213, 105,
- 146, 91, 7, 6, 1, 212, 152, 249, 68, 146, 91, 7, 6, 1, 226, 229, 146, 91,
- 240, 106, 146, 91, 193, 146, 91, 222, 202, 146, 91, 254, 185, 146, 91,
- 214, 7, 41, 247, 116, 91, 249, 216, 91, 249, 109, 91, 243, 222, 91, 240,
- 98, 91, 229, 168, 91, 229, 161, 91, 227, 80, 91, 219, 222, 91, 114, 2,
- 244, 254, 77, 91, 214, 100, 223, 253, 235, 236, 16, 1, 61, 223, 253, 235,
- 236, 16, 1, 253, 74, 223, 253, 235, 236, 16, 1, 250, 252, 223, 253, 235,
- 236, 16, 1, 249, 3, 223, 253, 235, 236, 16, 1, 74, 223, 253, 235, 236,
- 16, 1, 244, 230, 223, 253, 235, 236, 16, 1, 243, 177, 223, 253, 235, 236,
- 16, 1, 242, 41, 223, 253, 235, 236, 16, 1, 72, 223, 253, 235, 236, 16, 1,
- 235, 142, 223, 253, 235, 236, 16, 1, 235, 27, 223, 253, 235, 236, 16, 1,
- 150, 223, 253, 235, 236, 16, 1, 183, 223, 253, 235, 236, 16, 1, 204, 223,
- 253, 235, 236, 16, 1, 75, 223, 253, 235, 236, 16, 1, 226, 229, 223, 253,
- 235, 236, 16, 1, 224, 240, 223, 253, 235, 236, 16, 1, 149, 223, 253, 235,
- 236, 16, 1, 197, 223, 253, 235, 236, 16, 1, 218, 99, 223, 253, 235, 236,
- 16, 1, 69, 223, 253, 235, 236, 16, 1, 215, 79, 223, 253, 235, 236, 16, 1,
- 214, 82, 223, 253, 235, 236, 16, 1, 213, 166, 223, 253, 235, 236, 16, 1,
- 213, 105, 223, 253, 235, 236, 16, 1, 212, 152, 41, 142, 241, 49, 91, 56,
- 234, 27, 91, 56, 222, 202, 91, 9, 215, 148, 238, 43, 91, 9, 215, 148,
- 238, 47, 91, 9, 215, 148, 238, 55, 91, 56, 248, 41, 91, 9, 215, 148, 238,
- 62, 91, 9, 215, 148, 238, 49, 91, 9, 215, 148, 238, 21, 91, 9, 215, 148,
- 238, 48, 91, 9, 215, 148, 238, 61, 91, 9, 215, 148, 238, 35, 91, 9, 215,
- 148, 238, 28, 91, 9, 215, 148, 238, 37, 91, 9, 215, 148, 238, 58, 91, 9,
- 215, 148, 238, 44, 91, 9, 215, 148, 238, 60, 91, 9, 215, 148, 238, 36,
- 91, 9, 215, 148, 238, 59, 91, 9, 215, 148, 238, 22, 91, 9, 215, 148, 238,
- 27, 91, 9, 215, 148, 238, 20, 91, 9, 215, 148, 238, 50, 91, 9, 215, 148,
- 238, 52, 91, 9, 215, 148, 238, 30, 91, 9, 215, 148, 238, 41, 91, 9, 215,
- 148, 238, 39, 91, 9, 215, 148, 238, 65, 91, 9, 215, 148, 238, 64, 91, 9,
- 215, 148, 238, 18, 91, 9, 215, 148, 238, 45, 91, 9, 215, 148, 238, 63,
- 91, 9, 215, 148, 238, 54, 91, 9, 215, 148, 238, 40, 91, 9, 215, 148, 238,
- 19, 91, 9, 215, 148, 238, 42, 91, 9, 215, 148, 238, 24, 91, 9, 215, 148,
- 238, 23, 91, 9, 215, 148, 238, 53, 91, 9, 215, 148, 238, 31, 91, 9, 215,
- 148, 238, 33, 91, 9, 215, 148, 238, 34, 91, 9, 215, 148, 238, 26, 91, 9,
- 215, 148, 238, 57, 91, 9, 215, 148, 238, 51, 216, 219, 220, 233, 251, 84,
- 9, 215, 148, 238, 32, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 64,
- 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 62, 216, 219, 220, 233,
- 251, 84, 9, 215, 148, 238, 46, 216, 219, 220, 233, 251, 84, 9, 215, 148,
- 238, 29, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 42, 216, 219,
- 220, 233, 251, 84, 9, 215, 148, 238, 25, 216, 219, 220, 233, 251, 84, 9,
- 215, 148, 238, 56, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 38, 36,
- 143, 254, 150, 36, 143, 254, 172, 249, 14, 244, 11, 249, 193, 215, 164,
- 229, 44, 2, 219, 92, 218, 233, 110, 230, 184, 218, 232, 249, 219, 253,
- 123, 246, 9, 218, 231, 110, 251, 47, 224, 49, 251, 68, 253, 123, 229, 43,
- 214, 25, 214, 19, 214, 112, 231, 8, 214, 9, 245, 180, 242, 157, 245, 12,
- 245, 180, 242, 157, 254, 37, 245, 180, 242, 157, 253, 140, 242, 157, 2,
- 231, 115, 156, 230, 199, 87, 214, 11, 249, 77, 230, 199, 87, 244, 61,
- 224, 167, 230, 199, 87, 214, 11, 242, 186, 230, 199, 87, 243, 200, 230,
- 199, 87, 214, 36, 242, 186, 230, 199, 87, 233, 103, 224, 167, 230, 199,
- 87, 214, 36, 249, 77, 230, 199, 87, 249, 77, 230, 198, 156, 230, 199, 2,
- 244, 158, 244, 61, 224, 167, 230, 199, 2, 244, 158, 233, 103, 224, 167,
- 230, 199, 2, 244, 158, 243, 200, 230, 199, 2, 244, 158, 218, 239, 2, 244,
- 158, 242, 155, 219, 95, 220, 179, 219, 95, 250, 53, 222, 87, 245, 6, 216,
- 193, 248, 35, 216, 193, 226, 186, 216, 193, 250, 213, 216, 73, 250, 55,
- 251, 133, 223, 93, 241, 164, 218, 236, 251, 133, 245, 184, 65, 232, 0,
- 245, 184, 65, 223, 184, 241, 188, 243, 237, 233, 78, 249, 183, 231, 233,
- 233, 77, 244, 144, 233, 77, 233, 78, 244, 16, 235, 252, 213, 224, 230,
- 128, 216, 245, 253, 107, 242, 119, 231, 131, 214, 23, 218, 8, 233, 50,
- 252, 68, 225, 194, 224, 4, 253, 223, 242, 104, 253, 223, 226, 92, 226,
- 93, 250, 56, 219, 54, 242, 6, 220, 18, 65, 225, 176, 231, 152, 227, 63,
- 251, 119, 225, 109, 233, 60, 223, 185, 249, 82, 223, 185, 252, 78, 249,
- 112, 223, 184, 249, 36, 24, 223, 184, 219, 81, 251, 93, 219, 202, 251,
- 78, 243, 221, 243, 217, 223, 108, 218, 191, 225, 111, 248, 120, 227, 101,
- 218, 208, 243, 218, 220, 155, 244, 60, 250, 209, 2, 218, 184, 247, 242,
- 219, 236, 240, 105, 249, 81, 220, 250, 240, 104, 240, 105, 249, 81, 246,
- 62, 249, 111, 250, 21, 134, 250, 186, 232, 194, 249, 30, 241, 41, 225,
- 113, 220, 164, 251, 213, 251, 89, 225, 114, 65, 244, 2, 249, 110, 243,
- 249, 24, 234, 41, 217, 227, 213, 216, 241, 252, 222, 183, 251, 103, 24,
- 249, 43, 213, 222, 242, 160, 249, 172, 242, 160, 216, 151, 246, 45, 251,
- 238, 230, 163, 249, 200, 251, 238, 230, 162, 252, 104, 251, 102, 223,
- 186, 213, 189, 225, 75, 251, 158, 250, 208, 235, 136, 250, 14, 216, 193,
- 244, 130, 250, 13, 244, 63, 244, 64, 219, 200, 252, 77, 226, 122, 225,
- 124, 249, 143, 252, 78, 218, 10, 216, 193, 249, 68, 244, 36, 225, 195,
- 248, 32, 235, 131, 247, 85, 250, 164, 219, 53, 213, 225, 250, 35, 230,
- 199, 214, 144, 250, 96, 222, 117, 222, 141, 242, 124, 250, 183, 250, 165,
- 240, 232, 244, 99, 213, 241, 223, 102, 249, 173, 244, 55, 225, 136, 24,
- 244, 59, 231, 40, 230, 178, 250, 198, 249, 232, 241, 216, 253, 156, 226,
- 189, 216, 227, 241, 234, 249, 222, 217, 195, 217, 67, 249, 213, 251, 125,
- 226, 52, 253, 155, 214, 150, 243, 86, 247, 149, 241, 142, 220, 12, 232,
- 39, 251, 168, 243, 87, 247, 192, 251, 92, 244, 21, 225, 165, 250, 173,
- 27, 228, 158, 230, 155, 27, 228, 153, 222, 130, 242, 80, 27, 234, 143,
- 216, 148, 214, 135, 27, 222, 111, 223, 35, 220, 191, 2, 222, 143, 217,
- 197, 224, 68, 24, 252, 78, 220, 33, 24, 220, 33, 251, 112, 252, 43, 24,
- 241, 36, 250, 57, 244, 42, 219, 247, 223, 36, 218, 212, 216, 152, 240,
- 233, 224, 69, 254, 38, 244, 0, 223, 47, 244, 0, 218, 186, 240, 222, 251,
- 48, 240, 222, 2, 243, 70, 227, 95, 251, 48, 235, 131, 225, 119, 227, 94,
- 245, 11, 225, 119, 227, 94, 240, 231, 252, 64, 253, 97, 217, 205, 232,
- 39, 240, 227, 232, 166, 240, 227, 249, 115, 219, 65, 222, 116, 247, 250,
- 219, 65, 244, 148, 235, 147, 233, 113, 235, 131, 250, 158, 245, 11, 250,
- 158, 224, 33, 230, 182, 226, 238, 214, 25, 251, 52, 249, 84, 217, 60,
- 233, 42, 224, 70, 250, 156, 246, 50, 249, 75, 213, 244, 219, 254, 219,
- 252, 240, 232, 224, 45, 242, 146, 220, 237, 230, 215, 223, 96, 250, 45,
- 247, 90, 225, 205, 251, 126, 245, 126, 227, 103, 219, 184, 220, 232, 251,
- 51, 254, 3, 241, 40, 233, 144, 251, 236, 244, 59, 216, 151, 244, 59, 251,
- 132, 216, 55, 241, 232, 250, 46, 252, 104, 250, 46, 243, 212, 252, 104,
- 250, 46, 251, 160, 226, 70, 234, 35, 225, 128, 246, 42, 250, 199, 252,
- 95, 250, 199, 247, 84, 230, 183, 244, 158, 249, 85, 244, 158, 217, 61,
- 244, 158, 224, 71, 244, 158, 250, 157, 244, 158, 246, 51, 244, 158, 219,
- 173, 213, 244, 240, 233, 244, 158, 230, 216, 244, 158, 247, 91, 244, 158,
- 225, 206, 244, 158, 243, 215, 244, 158, 242, 3, 244, 158, 213, 211, 244,
- 158, 251, 247, 244, 158, 226, 172, 244, 158, 225, 206, 228, 164, 226,
- 106, 225, 67, 244, 237, 245, 183, 228, 164, 230, 180, 216, 232, 67, 114,
- 225, 141, 252, 99, 235, 239, 67, 119, 225, 141, 252, 99, 235, 239, 67,
- 42, 225, 141, 252, 99, 235, 239, 67, 46, 225, 141, 252, 99, 235, 239,
- 244, 53, 241, 255, 52, 214, 17, 241, 255, 52, 227, 81, 241, 255, 52, 217,
- 89, 114, 52, 217, 89, 119, 52, 249, 212, 241, 250, 52, 227, 40, 241, 250,
- 52, 249, 63, 213, 207, 241, 234, 244, 238, 229, 185, 218, 98, 235, 126,
- 246, 47, 234, 91, 251, 170, 213, 207, 249, 186, 225, 14, 241, 253, 225,
- 110, 231, 240, 220, 184, 253, 119, 220, 184, 241, 150, 220, 184, 213,
- 207, 222, 156, 213, 207, 251, 111, 243, 254, 251, 19, 235, 252, 220, 95,
- 251, 18, 235, 252, 220, 95, 251, 88, 242, 170, 231, 248, 213, 208, 244,
- 142, 231, 249, 24, 213, 209, 241, 46, 241, 249, 117, 231, 123, 241, 46,
- 241, 249, 117, 213, 206, 241, 46, 241, 249, 225, 133, 227, 93, 213, 209,
- 2, 251, 35, 245, 181, 251, 69, 2, 214, 223, 226, 44, 2, 251, 135, 242,
- 16, 231, 249, 2, 242, 89, 225, 241, 231, 237, 231, 249, 2, 216, 61, 227,
- 74, 231, 248, 227, 74, 213, 208, 252, 103, 249, 129, 213, 192, 225, 70,
- 235, 131, 227, 89, 235, 131, 242, 145, 242, 198, 252, 104, 254, 22, 244,
- 242, 254, 69, 254, 70, 230, 206, 236, 1, 220, 28, 235, 229, 247, 241,
- 226, 43, 242, 86, 248, 124, 232, 230, 230, 30, 225, 132, 244, 159, 231,
- 205, 242, 15, 252, 58, 225, 135, 218, 117, 225, 198, 234, 73, 77, 232,
- 166, 233, 34, 223, 130, 243, 30, 219, 71, 234, 72, 251, 97, 249, 87, 2,
- 241, 211, 214, 3, 251, 245, 241, 211, 251, 63, 241, 211, 117, 241, 209,
- 219, 198, 241, 211, 242, 98, 241, 211, 241, 212, 2, 68, 251, 131, 241,
- 211, 242, 104, 241, 211, 213, 33, 241, 211, 225, 15, 241, 211, 241, 212,
- 2, 223, 186, 223, 197, 241, 209, 241, 212, 248, 32, 247, 201, 221, 5, 2,
- 118, 62, 235, 212, 245, 129, 177, 251, 45, 254, 21, 87, 251, 120, 220,
- 20, 87, 249, 166, 87, 219, 178, 218, 193, 87, 246, 40, 248, 102, 87, 225,
- 199, 65, 225, 129, 244, 30, 251, 181, 247, 117, 87, 219, 191, 252, 77,
- 217, 102, 252, 77, 67, 244, 20, 240, 201, 225, 139, 87, 230, 219, 252,
- 90, 249, 39, 244, 255, 107, 247, 86, 52, 249, 79, 250, 174, 252, 63, 2,
- 213, 31, 52, 252, 63, 2, 247, 86, 52, 252, 63, 2, 245, 14, 52, 252, 63,
- 2, 225, 108, 52, 230, 219, 2, 213, 220, 250, 74, 2, 215, 124, 216, 189,
- 24, 213, 31, 52, 222, 97, 226, 42, 249, 147, 251, 67, 230, 255, 244, 25,
- 247, 137, 227, 27, 247, 142, 246, 4, 244, 76, 244, 9, 227, 40, 244, 76,
- 244, 9, 226, 201, 2, 249, 41, 226, 201, 244, 151, 215, 134, 250, 204,
- 217, 226, 250, 204, 250, 175, 235, 239, 250, 74, 2, 215, 124, 216, 188,
- 250, 74, 2, 246, 58, 216, 188, 252, 60, 250, 73, 249, 199, 225, 10, 223,
- 87, 225, 10, 226, 147, 219, 61, 223, 42, 216, 180, 223, 42, 251, 116,
- 218, 39, 233, 75, 228, 156, 228, 157, 2, 248, 31, 249, 86, 249, 193, 251,
- 117, 227, 40, 251, 117, 242, 104, 251, 117, 251, 131, 251, 117, 227, 23,
- 251, 117, 251, 114, 230, 25, 252, 93, 222, 105, 231, 124, 217, 210, 224,
- 16, 226, 199, 244, 127, 232, 39, 222, 140, 254, 0, 225, 31, 254, 157,
- 232, 168, 250, 63, 231, 136, 226, 253, 216, 196, 235, 248, 216, 196, 226,
- 206, 245, 236, 87, 235, 245, 245, 78, 245, 79, 2, 246, 58, 76, 49, 249,
- 193, 232, 6, 2, 232, 162, 244, 42, 249, 193, 232, 6, 2, 224, 48, 244, 42,
- 227, 40, 232, 6, 2, 224, 48, 244, 42, 227, 40, 232, 6, 2, 232, 162, 244,
- 42, 225, 116, 225, 117, 240, 235, 229, 166, 230, 229, 225, 249, 230, 229,
- 225, 250, 2, 95, 76, 253, 123, 233, 70, 214, 153, 230, 228, 230, 229,
- 225, 250, 227, 96, 228, 186, 230, 229, 225, 248, 254, 1, 2, 252, 49, 250,
- 198, 214, 150, 250, 198, 217, 207, 224, 63, 214, 149, 216, 25, 95, 253,
- 162, 249, 195, 95, 24, 132, 227, 40, 249, 229, 253, 162, 249, 195, 95,
- 24, 132, 227, 40, 249, 229, 253, 163, 2, 36, 122, 226, 244, 249, 195,
- 246, 58, 24, 215, 124, 227, 40, 249, 229, 253, 162, 253, 255, 246, 58,
- 24, 215, 124, 227, 40, 249, 229, 253, 162, 115, 251, 66, 87, 124, 251,
- 66, 87, 219, 195, 2, 250, 192, 90, 219, 194, 219, 195, 2, 122, 219, 218,
- 214, 19, 219, 195, 2, 133, 219, 218, 214, 18, 252, 35, 245, 129, 225,
- 161, 233, 66, 232, 16, 242, 160, 223, 144, 232, 16, 242, 160, 232, 204,
- 2, 235, 222, 226, 74, 249, 193, 232, 204, 2, 234, 144, 234, 144, 232,
- 203, 227, 40, 232, 203, 251, 221, 251, 222, 2, 250, 192, 90, 251, 115,
- 232, 233, 87, 224, 64, 251, 15, 252, 102, 2, 132, 76, 49, 245, 101, 2,
- 132, 76, 49, 227, 63, 2, 244, 254, 152, 2, 42, 46, 76, 49, 219, 225, 2,
- 95, 76, 49, 216, 227, 2, 215, 124, 76, 49, 228, 186, 122, 215, 154, 245,
- 148, 87, 234, 142, 217, 200, 235, 216, 16, 31, 7, 6, 233, 33, 235, 216,
- 16, 31, 7, 3, 233, 33, 235, 216, 16, 31, 228, 55, 235, 216, 16, 31, 218,
- 128, 235, 216, 16, 31, 7, 233, 33, 244, 65, 245, 129, 216, 222, 213, 187,
- 242, 4, 228, 38, 24, 251, 121, 241, 52, 225, 182, 231, 39, 217, 208, 249,
- 54, 252, 78, 220, 53, 225, 143, 219, 96, 2, 231, 37, 247, 74, 235, 131,
- 16, 31, 251, 233, 216, 178, 245, 114, 83, 41, 251, 15, 67, 41, 251, 15,
- 233, 108, 224, 4, 249, 228, 233, 108, 251, 131, 249, 228, 233, 108, 227,
- 23, 247, 200, 233, 108, 251, 131, 247, 200, 3, 227, 23, 247, 200, 3, 251,
- 131, 247, 200, 215, 133, 224, 4, 216, 183, 246, 59, 224, 4, 216, 183,
- 215, 133, 3, 224, 4, 216, 183, 246, 59, 3, 224, 4, 216, 183, 249, 197,
- 244, 159, 122, 227, 106, 249, 197, 244, 159, 117, 227, 106, 249, 197,
- 244, 159, 133, 227, 106, 249, 197, 244, 159, 243, 237, 227, 106, 249,
- 197, 244, 159, 244, 50, 227, 106, 249, 197, 244, 159, 220, 53, 227, 106,
- 249, 197, 244, 159, 221, 43, 227, 106, 249, 197, 244, 159, 245, 150, 227,
- 106, 249, 197, 244, 159, 229, 31, 227, 106, 249, 197, 244, 159, 217, 201,
- 227, 106, 249, 197, 244, 159, 245, 125, 227, 106, 249, 197, 244, 159,
- 216, 42, 227, 106, 249, 197, 244, 159, 227, 58, 249, 197, 244, 159, 216,
- 22, 249, 197, 244, 159, 217, 94, 249, 197, 244, 159, 243, 233, 249, 197,
- 244, 159, 244, 48, 249, 197, 244, 159, 220, 49, 249, 197, 244, 159, 221,
- 42, 249, 197, 244, 159, 245, 149, 249, 197, 244, 159, 229, 30, 249, 197,
- 244, 159, 217, 199, 249, 197, 244, 159, 245, 123, 249, 197, 244, 159,
- 216, 40, 230, 187, 243, 201, 216, 247, 216, 215, 219, 88, 65, 233, 11,
- 220, 96, 65, 235, 132, 230, 176, 242, 102, 244, 159, 2, 220, 2, 244, 237,
- 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 244, 159, 2, 227, 40, 230,
- 180, 220, 2, 244, 159, 2, 227, 40, 230, 181, 24, 220, 2, 244, 237, 220,
- 2, 244, 159, 2, 227, 40, 230, 181, 24, 249, 168, 218, 192, 220, 2, 244,
- 159, 2, 227, 40, 230, 181, 24, 217, 58, 244, 237, 220, 2, 244, 159, 2,
- 242, 8, 220, 2, 244, 159, 2, 240, 234, 213, 218, 244, 158, 220, 2, 244,
- 159, 2, 220, 2, 244, 237, 244, 159, 222, 135, 248, 13, 244, 2, 223, 238,
- 244, 158, 220, 2, 244, 159, 2, 241, 210, 244, 237, 220, 2, 244, 159, 2,
- 218, 234, 220, 1, 244, 158, 229, 169, 244, 158, 215, 158, 244, 158, 244,
- 159, 2, 249, 168, 218, 192, 226, 67, 244, 158, 249, 141, 244, 158, 244,
- 159, 217, 91, 118, 234, 72, 234, 71, 244, 159, 2, 249, 193, 244, 237,
- 244, 159, 2, 219, 31, 216, 233, 24, 213, 218, 244, 239, 244, 159, 2, 219,
- 31, 216, 233, 24, 217, 58, 244, 237, 247, 144, 244, 158, 254, 17, 244,
- 158, 225, 107, 244, 158, 249, 56, 244, 158, 226, 46, 244, 158, 244, 159,
- 2, 232, 179, 65, 216, 162, 247, 144, 251, 17, 223, 238, 244, 158, 244,
- 121, 244, 158, 214, 4, 244, 158, 220, 19, 244, 158, 217, 24, 244, 158,
- 232, 169, 249, 56, 244, 158, 244, 159, 2, 227, 40, 230, 181, 24, 249,
- 168, 218, 192, 244, 159, 222, 109, 235, 252, 244, 122, 253, 129, 244,
- 158, 244, 18, 244, 158, 247, 117, 244, 158, 244, 159, 213, 216, 230, 180,
- 244, 159, 2, 231, 149, 231, 207, 242, 102, 250, 157, 244, 159, 2, 220, 2,
- 244, 237, 250, 157, 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 250, 157,
- 244, 159, 2, 227, 40, 230, 180, 220, 2, 250, 157, 244, 159, 2, 241, 210,
- 244, 237, 250, 157, 244, 159, 2, 213, 184, 220, 3, 234, 71, 250, 157,
- 244, 159, 2, 249, 193, 244, 237, 225, 107, 250, 157, 244, 158, 249, 56,
- 250, 157, 244, 158, 214, 4, 250, 157, 244, 158, 244, 159, 2, 228, 186,
- 242, 139, 243, 10, 244, 159, 2, 227, 81, 243, 10, 226, 44, 251, 94, 248,
- 26, 222, 88, 230, 215, 241, 213, 230, 215, 219, 196, 230, 215, 241, 244,
- 226, 44, 224, 47, 122, 241, 254, 226, 44, 224, 47, 251, 104, 241, 250,
- 235, 252, 250, 113, 226, 44, 243, 208, 226, 44, 2, 225, 107, 244, 158,
- 226, 44, 2, 244, 10, 241, 249, 223, 104, 241, 198, 219, 83, 232, 202,
- 224, 53, 250, 176, 241, 148, 216, 205, 241, 148, 216, 206, 2, 251, 43,
- 228, 164, 216, 205, 231, 99, 177, 224, 54, 219, 89, 216, 203, 216, 204,
- 250, 176, 251, 21, 227, 60, 251, 21, 216, 159, 251, 22, 219, 69, 231, 0,
- 254, 39, 244, 66, 245, 95, 225, 133, 250, 176, 227, 60, 225, 133, 250,
- 176, 217, 239, 227, 60, 217, 239, 253, 96, 227, 60, 253, 96, 224, 11,
- 214, 224, 248, 9, 216, 150, 253, 157, 232, 172, 216, 211, 230, 209, 230,
- 186, 224, 52, 218, 207, 224, 52, 230, 186, 250, 214, 254, 134, 216, 202,
- 220, 196, 223, 84, 219, 189, 199, 216, 209, 233, 2, 71, 216, 209, 233, 2,
- 249, 129, 52, 225, 133, 250, 161, 223, 197, 233, 2, 216, 180, 244, 43,
- 227, 63, 225, 118, 247, 77, 228, 186, 245, 84, 52, 220, 0, 87, 228, 186,
- 220, 0, 87, 225, 9, 232, 222, 235, 252, 235, 155, 225, 173, 87, 247, 100,
- 228, 163, 232, 222, 87, 225, 112, 214, 25, 87, 228, 177, 214, 25, 87,
- 251, 180, 228, 186, 251, 179, 251, 178, 230, 186, 251, 178, 226, 88, 228,
- 186, 226, 87, 250, 37, 249, 64, 231, 120, 87, 213, 205, 87, 223, 211,
- 252, 104, 87, 216, 248, 214, 25, 249, 190, 220, 158, 252, 38, 252, 36,
- 226, 115, 249, 116, 249, 28, 252, 87, 249, 215, 42, 232, 148, 104, 16,
- 31, 224, 148, 104, 16, 31, 254, 100, 104, 16, 31, 244, 65, 104, 16, 31,
- 245, 179, 104, 16, 31, 214, 24, 104, 16, 31, 253, 213, 104, 16, 31, 253,
- 214, 223, 255, 104, 16, 31, 253, 214, 223, 254, 104, 16, 31, 253, 214,
- 214, 124, 104, 16, 31, 253, 214, 214, 123, 104, 16, 31, 214, 138, 104,
- 16, 31, 214, 137, 104, 16, 31, 214, 136, 104, 16, 31, 218, 245, 104, 16,
- 31, 226, 1, 218, 245, 104, 16, 31, 83, 218, 245, 104, 16, 31, 231, 119,
- 219, 16, 104, 16, 31, 231, 119, 219, 15, 104, 16, 31, 231, 119, 219, 14,
- 104, 16, 31, 249, 231, 104, 16, 31, 222, 172, 104, 16, 31, 229, 19, 104,
- 16, 31, 214, 122, 104, 16, 31, 214, 121, 104, 16, 31, 223, 105, 222, 172,
- 104, 16, 31, 223, 105, 222, 171, 104, 16, 31, 242, 142, 104, 16, 31, 220,
- 92, 104, 16, 31, 235, 175, 227, 20, 104, 16, 31, 235, 175, 227, 19, 104,
- 16, 31, 249, 74, 65, 235, 174, 104, 16, 31, 223, 251, 65, 235, 174, 104,
- 16, 31, 249, 107, 227, 20, 104, 16, 31, 235, 173, 227, 20, 104, 16, 31,
- 219, 17, 65, 249, 106, 104, 16, 31, 249, 74, 65, 249, 106, 104, 16, 31,
- 249, 74, 65, 249, 105, 104, 16, 31, 249, 107, 253, 250, 104, 16, 31, 222,
- 173, 65, 249, 107, 253, 250, 104, 16, 31, 219, 17, 65, 222, 173, 65, 249,
- 106, 104, 16, 31, 214, 220, 104, 16, 31, 217, 37, 227, 20, 104, 16, 31,
- 233, 81, 227, 20, 104, 16, 31, 253, 249, 227, 20, 104, 16, 31, 219, 17,
- 65, 253, 248, 104, 16, 31, 222, 173, 65, 253, 248, 104, 16, 31, 219, 17,
- 65, 222, 173, 65, 253, 248, 104, 16, 31, 214, 139, 65, 253, 248, 104, 16,
- 31, 223, 251, 65, 253, 248, 104, 16, 31, 223, 251, 65, 253, 247, 104, 16,
- 31, 223, 250, 104, 16, 31, 223, 249, 104, 16, 31, 223, 248, 104, 16, 31,
- 223, 247, 104, 16, 31, 254, 66, 104, 16, 31, 254, 65, 104, 16, 31, 231,
- 226, 104, 16, 31, 222, 178, 104, 16, 31, 253, 161, 104, 16, 31, 224, 18,
- 104, 16, 31, 224, 17, 104, 16, 31, 253, 99, 104, 16, 31, 251, 152, 227,
- 20, 104, 16, 31, 218, 0, 104, 16, 31, 217, 255, 104, 16, 31, 224, 153,
- 232, 251, 104, 16, 31, 251, 109, 104, 16, 31, 251, 108, 104, 16, 31, 251,
- 107, 104, 16, 31, 254, 47, 104, 16, 31, 227, 84, 104, 16, 31, 219, 180,
- 104, 16, 31, 217, 35, 104, 16, 31, 242, 77, 104, 16, 31, 214, 12, 104,
- 16, 31, 225, 106, 104, 16, 31, 250, 202, 104, 16, 31, 216, 50, 104, 16,
- 31, 250, 178, 230, 192, 104, 16, 31, 222, 120, 65, 235, 58, 104, 16, 31,
- 250, 211, 104, 16, 31, 216, 177, 104, 16, 31, 219, 93, 216, 177, 104, 16,
- 31, 232, 201, 104, 16, 31, 219, 240, 104, 16, 31, 215, 113, 104, 16, 31,
- 240, 233, 246, 19, 104, 16, 31, 253, 142, 104, 16, 31, 225, 114, 253,
- 142, 104, 16, 31, 251, 70, 104, 16, 31, 225, 105, 251, 70, 104, 16, 31,
- 254, 44, 104, 16, 31, 219, 57, 218, 226, 219, 56, 104, 16, 31, 219, 57,
- 218, 226, 219, 55, 104, 16, 31, 219, 13, 104, 16, 31, 225, 80, 104, 16,
- 31, 247, 133, 104, 16, 31, 247, 135, 104, 16, 31, 247, 134, 104, 16, 31,
- 225, 17, 104, 16, 31, 225, 7, 104, 16, 31, 249, 62, 104, 16, 31, 249, 61,
- 104, 16, 31, 249, 60, 104, 16, 31, 249, 59, 104, 16, 31, 249, 58, 104,
- 16, 31, 254, 77, 104, 16, 31, 252, 39, 65, 231, 212, 104, 16, 31, 252,
- 39, 65, 214, 249, 104, 16, 31, 223, 209, 104, 16, 31, 240, 225, 104, 16,
- 31, 229, 43, 104, 16, 31, 248, 91, 104, 16, 31, 230, 204, 104, 16, 31,
- 151, 246, 49, 104, 16, 31, 151, 227, 0, 9, 13, 240, 95, 9, 13, 240, 94,
- 9, 13, 240, 93, 9, 13, 240, 92, 9, 13, 240, 91, 9, 13, 240, 90, 9, 13,
- 240, 89, 9, 13, 240, 88, 9, 13, 240, 87, 9, 13, 240, 86, 9, 13, 240, 85,
- 9, 13, 240, 84, 9, 13, 240, 83, 9, 13, 240, 82, 9, 13, 240, 81, 9, 13,
- 240, 80, 9, 13, 240, 79, 9, 13, 240, 78, 9, 13, 240, 77, 9, 13, 240, 76,
- 9, 13, 240, 75, 9, 13, 240, 74, 9, 13, 240, 73, 9, 13, 240, 72, 9, 13,
- 240, 71, 9, 13, 240, 70, 9, 13, 240, 69, 9, 13, 240, 68, 9, 13, 240, 67,
- 9, 13, 240, 66, 9, 13, 240, 65, 9, 13, 240, 64, 9, 13, 240, 63, 9, 13,
- 240, 62, 9, 13, 240, 61, 9, 13, 240, 60, 9, 13, 240, 59, 9, 13, 240, 58,
- 9, 13, 240, 57, 9, 13, 240, 56, 9, 13, 240, 55, 9, 13, 240, 54, 9, 13,
- 240, 53, 9, 13, 240, 52, 9, 13, 240, 51, 9, 13, 240, 50, 9, 13, 240, 49,
- 9, 13, 240, 48, 9, 13, 240, 47, 9, 13, 240, 46, 9, 13, 240, 45, 9, 13,
- 240, 44, 9, 13, 240, 43, 9, 13, 240, 42, 9, 13, 240, 41, 9, 13, 240, 40,
- 9, 13, 240, 39, 9, 13, 240, 38, 9, 13, 240, 37, 9, 13, 240, 36, 9, 13,
- 240, 35, 9, 13, 240, 34, 9, 13, 240, 33, 9, 13, 240, 32, 9, 13, 240, 31,
- 9, 13, 240, 30, 9, 13, 240, 29, 9, 13, 240, 28, 9, 13, 240, 27, 9, 13,
- 240, 26, 9, 13, 240, 25, 9, 13, 240, 24, 9, 13, 240, 23, 9, 13, 240, 22,
- 9, 13, 240, 21, 9, 13, 240, 20, 9, 13, 240, 19, 9, 13, 240, 18, 9, 13,
- 240, 17, 9, 13, 240, 16, 9, 13, 240, 15, 9, 13, 240, 14, 9, 13, 240, 13,
- 9, 13, 240, 12, 9, 13, 240, 11, 9, 13, 240, 10, 9, 13, 240, 9, 9, 13,
- 240, 8, 9, 13, 240, 7, 9, 13, 240, 6, 9, 13, 240, 5, 9, 13, 240, 4, 9,
- 13, 240, 3, 9, 13, 240, 2, 9, 13, 240, 1, 9, 13, 240, 0, 9, 13, 239, 255,
- 9, 13, 239, 254, 9, 13, 239, 253, 9, 13, 239, 252, 9, 13, 239, 251, 9,
- 13, 239, 250, 9, 13, 239, 249, 9, 13, 239, 248, 9, 13, 239, 247, 9, 13,
- 239, 246, 9, 13, 239, 245, 9, 13, 239, 244, 9, 13, 239, 243, 9, 13, 239,
- 242, 9, 13, 239, 241, 9, 13, 239, 240, 9, 13, 239, 239, 9, 13, 239, 238,
- 9, 13, 239, 237, 9, 13, 239, 236, 9, 13, 239, 235, 9, 13, 239, 234, 9,
- 13, 239, 233, 9, 13, 239, 232, 9, 13, 239, 231, 9, 13, 239, 230, 9, 13,
- 239, 229, 9, 13, 239, 228, 9, 13, 239, 227, 9, 13, 239, 226, 9, 13, 239,
- 225, 9, 13, 239, 224, 9, 13, 239, 223, 9, 13, 239, 222, 9, 13, 239, 221,
- 9, 13, 239, 220, 9, 13, 239, 219, 9, 13, 239, 218, 9, 13, 239, 217, 9,
- 13, 239, 216, 9, 13, 239, 215, 9, 13, 239, 214, 9, 13, 239, 213, 9, 13,
- 239, 212, 9, 13, 239, 211, 9, 13, 239, 210, 9, 13, 239, 209, 9, 13, 239,
- 208, 9, 13, 239, 207, 9, 13, 239, 206, 9, 13, 239, 205, 9, 13, 239, 204,
- 9, 13, 239, 203, 9, 13, 239, 202, 9, 13, 239, 201, 9, 13, 239, 200, 9,
- 13, 239, 199, 9, 13, 239, 198, 9, 13, 239, 197, 9, 13, 239, 196, 9, 13,
- 239, 195, 9, 13, 239, 194, 9, 13, 239, 193, 9, 13, 239, 192, 9, 13, 239,
- 191, 9, 13, 239, 190, 9, 13, 239, 189, 9, 13, 239, 188, 9, 13, 239, 187,
- 9, 13, 239, 186, 9, 13, 239, 185, 9, 13, 239, 184, 9, 13, 239, 183, 9,
- 13, 239, 182, 9, 13, 239, 181, 9, 13, 239, 180, 9, 13, 239, 179, 9, 13,
- 239, 178, 9, 13, 239, 177, 9, 13, 239, 176, 9, 13, 239, 175, 9, 13, 239,
- 174, 9, 13, 239, 173, 9, 13, 239, 172, 9, 13, 239, 171, 9, 13, 239, 170,
- 9, 13, 239, 169, 9, 13, 239, 168, 9, 13, 239, 167, 9, 13, 239, 166, 9,
- 13, 239, 165, 9, 13, 239, 164, 9, 13, 239, 163, 9, 13, 239, 162, 9, 13,
- 239, 161, 9, 13, 239, 160, 9, 13, 239, 159, 9, 13, 239, 158, 9, 13, 239,
- 157, 9, 13, 239, 156, 9, 13, 239, 155, 9, 13, 239, 154, 9, 13, 239, 153,
- 9, 13, 239, 152, 9, 13, 239, 151, 9, 13, 239, 150, 9, 13, 239, 149, 9,
- 13, 239, 148, 9, 13, 239, 147, 9, 13, 239, 146, 9, 13, 239, 145, 9, 13,
- 239, 144, 9, 13, 239, 143, 9, 13, 239, 142, 9, 13, 239, 141, 9, 13, 239,
- 140, 9, 13, 239, 139, 9, 13, 239, 138, 9, 13, 239, 137, 9, 13, 239, 136,
- 9, 13, 239, 135, 9, 13, 239, 134, 9, 13, 239, 133, 9, 13, 239, 132, 9,
- 13, 239, 131, 9, 13, 239, 130, 9, 13, 239, 129, 9, 13, 239, 128, 9, 13,
- 239, 127, 9, 13, 239, 126, 9, 13, 239, 125, 9, 13, 239, 124, 9, 13, 239,
- 123, 9, 13, 239, 122, 9, 13, 239, 121, 9, 13, 239, 120, 9, 13, 239, 119,
- 9, 13, 239, 118, 9, 13, 239, 117, 9, 13, 239, 116, 9, 13, 239, 115, 9,
- 13, 239, 114, 9, 13, 239, 113, 9, 13, 239, 112, 9, 13, 239, 111, 9, 13,
- 239, 110, 9, 13, 239, 109, 9, 13, 239, 108, 9, 13, 239, 107, 9, 13, 239,
- 106, 9, 13, 239, 105, 9, 13, 239, 104, 9, 13, 239, 103, 9, 13, 239, 102,
- 9, 13, 239, 101, 9, 13, 239, 100, 9, 13, 239, 99, 9, 13, 239, 98, 9, 13,
- 239, 97, 9, 13, 239, 96, 9, 13, 239, 95, 9, 13, 239, 94, 9, 13, 239, 93,
- 9, 13, 239, 92, 9, 13, 239, 91, 9, 13, 239, 90, 9, 13, 239, 89, 9, 13,
- 239, 88, 9, 13, 239, 87, 9, 13, 239, 86, 9, 13, 239, 85, 9, 13, 239, 84,
- 9, 13, 239, 83, 9, 13, 239, 82, 9, 13, 239, 81, 9, 13, 239, 80, 9, 13,
- 239, 79, 9, 13, 239, 78, 9, 13, 239, 77, 9, 13, 239, 76, 9, 13, 239, 75,
- 9, 13, 239, 74, 9, 13, 239, 73, 9, 13, 239, 72, 9, 13, 239, 71, 9, 13,
- 239, 70, 9, 13, 239, 69, 9, 13, 239, 68, 9, 13, 239, 67, 9, 13, 239, 66,
- 9, 13, 239, 65, 9, 13, 239, 64, 9, 13, 239, 63, 9, 13, 239, 62, 9, 13,
- 239, 61, 9, 13, 239, 60, 9, 13, 239, 59, 9, 13, 239, 58, 9, 13, 239, 57,
- 9, 13, 239, 56, 9, 13, 239, 55, 9, 13, 239, 54, 9, 13, 239, 53, 9, 13,
- 239, 52, 9, 13, 239, 51, 9, 13, 239, 50, 9, 13, 239, 49, 9, 13, 239, 48,
- 9, 13, 239, 47, 9, 13, 239, 46, 9, 13, 239, 45, 9, 13, 239, 44, 9, 13,
- 239, 43, 9, 13, 239, 42, 9, 13, 239, 41, 9, 13, 239, 40, 9, 13, 239, 39,
- 9, 13, 239, 38, 9, 13, 239, 37, 9, 13, 239, 36, 9, 13, 239, 35, 9, 13,
- 239, 34, 9, 13, 239, 33, 9, 13, 239, 32, 9, 13, 239, 31, 9, 13, 239, 30,
- 9, 13, 239, 29, 9, 13, 239, 28, 9, 13, 239, 27, 9, 13, 239, 26, 9, 13,
- 239, 25, 9, 13, 239, 24, 9, 13, 239, 23, 9, 13, 239, 22, 9, 13, 239, 21,
- 9, 13, 239, 20, 9, 13, 239, 19, 9, 13, 239, 18, 9, 13, 239, 17, 9, 13,
- 239, 16, 9, 13, 239, 15, 9, 13, 239, 14, 9, 13, 239, 13, 9, 13, 239, 12,
- 9, 13, 239, 11, 9, 13, 239, 10, 9, 13, 239, 9, 9, 13, 239, 8, 9, 13, 239,
- 7, 9, 13, 239, 6, 9, 13, 239, 5, 9, 13, 239, 4, 9, 13, 239, 3, 9, 13,
- 239, 2, 9, 13, 239, 1, 9, 13, 239, 0, 9, 13, 238, 255, 9, 13, 238, 254,
- 9, 13, 238, 253, 9, 13, 238, 252, 9, 13, 238, 251, 9, 13, 238, 250, 9,
- 13, 238, 249, 9, 13, 238, 248, 9, 13, 238, 247, 9, 13, 238, 246, 9, 13,
- 238, 245, 9, 13, 238, 244, 9, 13, 238, 243, 9, 13, 238, 242, 9, 13, 238,
- 241, 9, 13, 238, 240, 9, 13, 238, 239, 9, 13, 238, 238, 9, 13, 238, 237,
- 9, 13, 238, 236, 9, 13, 238, 235, 9, 13, 238, 234, 9, 13, 238, 233, 9,
- 13, 238, 232, 9, 13, 238, 231, 9, 13, 238, 230, 9, 13, 238, 229, 9, 13,
- 238, 228, 9, 13, 238, 227, 9, 13, 238, 226, 9, 13, 238, 225, 9, 13, 238,
- 224, 9, 13, 238, 223, 9, 13, 238, 222, 9, 13, 238, 221, 9, 13, 238, 220,
- 9, 13, 238, 219, 9, 13, 238, 218, 9, 13, 238, 217, 9, 13, 238, 216, 9,
- 13, 238, 215, 9, 13, 238, 214, 9, 13, 238, 213, 9, 13, 238, 212, 9, 13,
- 238, 211, 9, 13, 238, 210, 9, 13, 238, 209, 9, 13, 238, 208, 9, 13, 238,
- 207, 9, 13, 238, 206, 9, 13, 238, 205, 9, 13, 238, 204, 9, 13, 238, 203,
- 9, 13, 238, 202, 9, 13, 238, 201, 9, 13, 238, 200, 9, 13, 238, 199, 9,
- 13, 238, 198, 9, 13, 238, 197, 9, 13, 238, 196, 9, 13, 238, 195, 9, 13,
- 238, 194, 9, 13, 238, 193, 9, 13, 238, 192, 9, 13, 238, 191, 9, 13, 238,
- 190, 9, 13, 238, 189, 9, 13, 238, 188, 9, 13, 238, 187, 9, 13, 238, 186,
- 9, 13, 238, 185, 9, 13, 238, 184, 9, 13, 238, 183, 9, 13, 238, 182, 9,
- 13, 238, 181, 9, 13, 238, 180, 9, 13, 238, 179, 9, 13, 238, 178, 9, 13,
- 238, 177, 9, 13, 238, 176, 9, 13, 238, 175, 9, 13, 238, 174, 9, 13, 238,
- 173, 9, 13, 238, 172, 9, 13, 238, 171, 9, 13, 238, 170, 9, 13, 238, 169,
- 9, 13, 238, 168, 9, 13, 238, 167, 9, 13, 238, 166, 9, 13, 238, 165, 9,
- 13, 238, 164, 9, 13, 238, 163, 9, 13, 238, 162, 9, 13, 238, 161, 9, 13,
- 238, 160, 9, 13, 238, 159, 9, 13, 238, 158, 9, 13, 238, 157, 9, 13, 238,
- 156, 9, 13, 238, 155, 9, 13, 238, 154, 9, 13, 238, 153, 9, 13, 238, 152,
- 9, 13, 238, 151, 9, 13, 238, 150, 9, 13, 238, 149, 9, 13, 238, 148, 9,
- 13, 238, 147, 9, 13, 238, 146, 9, 13, 238, 145, 9, 13, 238, 144, 9, 13,
- 238, 143, 9, 13, 238, 142, 9, 13, 238, 141, 9, 13, 238, 140, 9, 13, 238,
- 139, 9, 13, 238, 138, 9, 13, 238, 137, 9, 13, 238, 136, 9, 13, 238, 135,
- 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, 13, 238, 131, 9,
- 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, 238, 127, 9, 13,
- 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, 123, 9, 13, 238,
- 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, 9, 13, 238, 118,
- 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, 13, 238, 114, 9,
- 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, 238, 110, 9, 13,
- 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, 106, 9, 13, 238,
- 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, 9, 13, 238, 101,
- 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, 238, 97, 9, 13,
- 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, 9, 13, 238, 92,
- 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, 238, 88, 9, 13,
- 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, 9, 13, 238, 83,
- 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, 238, 79, 9, 13,
- 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, 9, 13, 238, 74,
- 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, 238, 70, 9, 13,
- 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, 233, 114, 218,
- 33, 126, 219, 206, 126, 244, 254, 77, 126, 224, 143, 77, 126, 50, 52,
- 126, 247, 86, 52, 126, 226, 57, 52, 126, 254, 35, 126, 253, 226, 126, 42,
- 226, 131, 126, 46, 226, 131, 126, 253, 132, 126, 94, 52, 126, 249, 157,
- 126, 240, 159, 126, 243, 200, 219, 69, 126, 219, 231, 126, 21, 212, 79,
- 126, 21, 116, 126, 21, 109, 126, 21, 166, 126, 21, 163, 126, 21, 180,
- 126, 21, 189, 126, 21, 198, 126, 21, 195, 126, 21, 200, 126, 249, 164,
- 126, 221, 70, 126, 233, 39, 52, 126, 245, 61, 52, 126, 242, 107, 52, 126,
- 224, 158, 77, 126, 249, 156, 253, 122, 126, 7, 6, 1, 61, 126, 7, 6, 1,
- 253, 74, 126, 7, 6, 1, 250, 252, 126, 7, 6, 1, 249, 3, 126, 7, 6, 1, 74,
- 126, 7, 6, 1, 244, 230, 126, 7, 6, 1, 243, 177, 126, 7, 6, 1, 242, 41,
- 126, 7, 6, 1, 72, 126, 7, 6, 1, 235, 142, 126, 7, 6, 1, 235, 27, 126, 7,
- 6, 1, 150, 126, 7, 6, 1, 183, 126, 7, 6, 1, 204, 126, 7, 6, 1, 75, 126,
- 7, 6, 1, 226, 229, 126, 7, 6, 1, 224, 240, 126, 7, 6, 1, 149, 126, 7, 6,
- 1, 197, 126, 7, 6, 1, 218, 99, 126, 7, 6, 1, 69, 126, 7, 6, 1, 215, 79,
- 126, 7, 6, 1, 214, 82, 126, 7, 6, 1, 213, 166, 126, 7, 6, 1, 213, 105,
- 126, 7, 6, 1, 212, 152, 126, 42, 41, 125, 126, 223, 203, 219, 231, 126,
- 46, 41, 125, 126, 249, 224, 254, 174, 126, 115, 232, 242, 126, 242, 114,
- 254, 174, 126, 7, 3, 1, 61, 126, 7, 3, 1, 253, 74, 126, 7, 3, 1, 250,
- 252, 126, 7, 3, 1, 249, 3, 126, 7, 3, 1, 74, 126, 7, 3, 1, 244, 230, 126,
- 7, 3, 1, 243, 177, 126, 7, 3, 1, 242, 41, 126, 7, 3, 1, 72, 126, 7, 3, 1,
- 235, 142, 126, 7, 3, 1, 235, 27, 126, 7, 3, 1, 150, 126, 7, 3, 1, 183,
- 126, 7, 3, 1, 204, 126, 7, 3, 1, 75, 126, 7, 3, 1, 226, 229, 126, 7, 3,
- 1, 224, 240, 126, 7, 3, 1, 149, 126, 7, 3, 1, 197, 126, 7, 3, 1, 218, 99,
- 126, 7, 3, 1, 69, 126, 7, 3, 1, 215, 79, 126, 7, 3, 1, 214, 82, 126, 7,
- 3, 1, 213, 166, 126, 7, 3, 1, 213, 105, 126, 7, 3, 1, 212, 152, 126, 42,
- 249, 40, 125, 126, 71, 232, 242, 126, 46, 249, 40, 125, 126, 217, 42,
- 250, 194, 218, 33, 43, 221, 254, 43, 221, 243, 43, 221, 232, 43, 221,
- 220, 43, 221, 209, 43, 221, 198, 43, 221, 187, 43, 221, 176, 43, 221,
- 165, 43, 221, 157, 43, 221, 156, 43, 221, 155, 43, 221, 154, 43, 221,
- 152, 43, 221, 151, 43, 221, 150, 43, 221, 149, 43, 221, 148, 43, 221,
- 147, 43, 221, 146, 43, 221, 145, 43, 221, 144, 43, 221, 143, 43, 221,
- 141, 43, 221, 140, 43, 221, 139, 43, 221, 138, 43, 221, 137, 43, 221,
- 136, 43, 221, 135, 43, 221, 134, 43, 221, 133, 43, 221, 132, 43, 221,
- 130, 43, 221, 129, 43, 221, 128, 43, 221, 127, 43, 221, 126, 43, 221,
- 125, 43, 221, 124, 43, 221, 123, 43, 221, 122, 43, 221, 121, 43, 221,
- 119, 43, 221, 118, 43, 221, 117, 43, 221, 116, 43, 221, 115, 43, 221,
- 114, 43, 221, 113, 43, 221, 112, 43, 221, 111, 43, 221, 110, 43, 221,
- 108, 43, 221, 107, 43, 221, 106, 43, 221, 105, 43, 221, 104, 43, 221,
- 103, 43, 221, 102, 43, 221, 101, 43, 221, 100, 43, 221, 99, 43, 221, 97,
- 43, 221, 96, 43, 221, 95, 43, 221, 94, 43, 221, 93, 43, 221, 92, 43, 221,
- 91, 43, 221, 90, 43, 221, 89, 43, 221, 88, 43, 221, 86, 43, 221, 85, 43,
- 221, 84, 43, 221, 83, 43, 221, 82, 43, 221, 81, 43, 221, 80, 43, 221, 79,
- 43, 221, 78, 43, 221, 77, 43, 222, 74, 43, 222, 73, 43, 222, 72, 43, 222,
- 71, 43, 222, 70, 43, 222, 69, 43, 222, 68, 43, 222, 67, 43, 222, 66, 43,
- 222, 65, 43, 222, 63, 43, 222, 62, 43, 222, 61, 43, 222, 60, 43, 222, 59,
- 43, 222, 58, 43, 222, 57, 43, 222, 56, 43, 222, 55, 43, 222, 54, 43, 222,
- 52, 43, 222, 51, 43, 222, 50, 43, 222, 49, 43, 222, 48, 43, 222, 47, 43,
- 222, 46, 43, 222, 45, 43, 222, 44, 43, 222, 43, 43, 222, 41, 43, 222, 40,
- 43, 222, 39, 43, 222, 38, 43, 222, 37, 43, 222, 36, 43, 222, 35, 43, 222,
- 34, 43, 222, 33, 43, 222, 32, 43, 222, 30, 43, 222, 29, 43, 222, 28, 43,
- 222, 27, 43, 222, 26, 43, 222, 25, 43, 222, 24, 43, 222, 23, 43, 222, 22,
- 43, 222, 21, 43, 222, 19, 43, 222, 18, 43, 222, 17, 43, 222, 16, 43, 222,
- 15, 43, 222, 14, 43, 222, 13, 43, 222, 12, 43, 222, 11, 43, 222, 10, 43,
- 222, 8, 43, 222, 7, 43, 222, 6, 43, 222, 5, 43, 222, 4, 43, 222, 3, 43,
- 222, 2, 43, 222, 1, 43, 222, 0, 43, 221, 255, 43, 221, 253, 43, 221, 252,
- 43, 221, 251, 43, 221, 250, 43, 221, 249, 43, 221, 248, 43, 221, 247, 43,
- 221, 246, 43, 221, 245, 43, 221, 244, 43, 221, 242, 43, 221, 241, 43,
- 221, 240, 43, 221, 239, 43, 221, 238, 43, 221, 237, 43, 221, 236, 43,
- 221, 235, 43, 221, 234, 43, 221, 233, 43, 221, 231, 43, 221, 230, 43,
- 221, 229, 43, 221, 228, 43, 221, 227, 43, 221, 226, 43, 221, 225, 43,
- 221, 224, 43, 221, 223, 43, 221, 222, 43, 221, 219, 43, 221, 218, 43,
- 221, 217, 43, 221, 216, 43, 221, 215, 43, 221, 214, 43, 221, 213, 43,
- 221, 212, 43, 221, 211, 43, 221, 210, 43, 221, 208, 43, 221, 207, 43,
- 221, 206, 43, 221, 205, 43, 221, 204, 43, 221, 203, 43, 221, 202, 43,
- 221, 201, 43, 221, 200, 43, 221, 199, 43, 221, 197, 43, 221, 196, 43,
- 221, 195, 43, 221, 194, 43, 221, 193, 43, 221, 192, 43, 221, 191, 43,
- 221, 190, 43, 221, 189, 43, 221, 188, 43, 221, 186, 43, 221, 185, 43,
- 221, 184, 43, 221, 183, 43, 221, 182, 43, 221, 181, 43, 221, 180, 43,
- 221, 179, 43, 221, 178, 43, 221, 177, 43, 221, 175, 43, 221, 174, 43,
- 221, 173, 43, 221, 172, 43, 221, 171, 43, 221, 170, 43, 221, 169, 43,
- 221, 168, 43, 221, 167, 43, 221, 166, 43, 221, 164, 43, 221, 163, 43,
- 221, 162, 43, 221, 161, 43, 221, 160, 43, 221, 159, 43, 221, 158,
+ 0, 219, 18, 245, 31, 78, 223, 254, 78, 54, 50, 247, 132, 50, 225, 182,
+ 50, 254, 126, 254, 57, 43, 226, 3, 44, 226, 3, 253, 216, 96, 50, 249,
+ 219, 240, 167, 243, 229, 218, 129, 219, 46, 21, 210, 86, 21, 110, 21,
+ 105, 21, 158, 21, 161, 21, 189, 21, 194, 21, 198, 21, 195, 21, 200, 249,
+ 226, 220, 150, 233, 15, 50, 245, 98, 50, 242, 130, 50, 224, 13, 78, 249,
+ 217, 253, 206, 7, 6, 1, 61, 7, 6, 1, 253, 158, 7, 6, 1, 251, 66, 7, 6, 1,
+ 249, 60, 7, 6, 1, 75, 7, 6, 1, 245, 6, 7, 6, 1, 243, 202, 7, 6, 1, 242,
+ 60, 7, 6, 1, 73, 7, 6, 1, 235, 144, 7, 6, 1, 235, 23, 7, 6, 1, 156, 7, 6,
+ 1, 193, 7, 6, 1, 230, 25, 7, 6, 1, 76, 7, 6, 1, 226, 105, 7, 6, 1, 224,
+ 96, 7, 6, 1, 153, 7, 6, 1, 222, 91, 7, 6, 1, 217, 152, 7, 6, 1, 70, 7, 6,
+ 1, 214, 105, 7, 6, 1, 212, 98, 7, 6, 1, 211, 178, 7, 6, 1, 211, 117, 7,
+ 6, 1, 210, 159, 43, 42, 127, 223, 50, 219, 46, 44, 42, 127, 250, 31, 255,
+ 14, 121, 232, 213, 242, 137, 255, 14, 7, 4, 1, 61, 7, 4, 1, 253, 158, 7,
+ 4, 1, 251, 66, 7, 4, 1, 249, 60, 7, 4, 1, 75, 7, 4, 1, 245, 6, 7, 4, 1,
+ 243, 202, 7, 4, 1, 242, 60, 7, 4, 1, 73, 7, 4, 1, 235, 144, 7, 4, 1, 235,
+ 23, 7, 4, 1, 156, 7, 4, 1, 193, 7, 4, 1, 230, 25, 7, 4, 1, 76, 7, 4, 1,
+ 226, 105, 7, 4, 1, 224, 96, 7, 4, 1, 153, 7, 4, 1, 222, 91, 7, 4, 1, 217,
+ 152, 7, 4, 1, 70, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178,
+ 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 99, 127, 67, 232, 213, 44,
+ 249, 99, 127, 182, 228, 73, 219, 18, 235, 193, 245, 31, 78, 250, 176, 50,
+ 224, 228, 50, 249, 98, 50, 211, 40, 50, 251, 135, 130, 221, 173, 50, 248,
+ 1, 249, 163, 50, 244, 136, 226, 154, 235, 238, 233, 42, 52, 254, 110,
+ 223, 254, 78, 228, 52, 50, 219, 52, 240, 168, 223, 102, 50, 231, 232,
+ 248, 71, 50, 225, 21, 50, 218, 23, 105, 218, 23, 158, 255, 3, 255, 14,
+ 230, 228, 50, 225, 68, 50, 230, 224, 247, 120, 250, 183, 218, 23, 110,
+ 231, 148, 226, 154, 235, 238, 222, 247, 52, 254, 110, 223, 254, 78, 212,
+ 114, 244, 2, 123, 224, 21, 212, 114, 244, 2, 123, 242, 27, 212, 114, 244,
+ 2, 134, 224, 19, 235, 193, 224, 13, 78, 7, 6, 1, 115, 2, 242, 136, 7, 6,
+ 1, 115, 2, 142, 7, 6, 1, 115, 2, 250, 30, 7, 6, 1, 115, 2, 182, 7, 6, 1,
+ 115, 2, 248, 1, 7, 6, 1, 115, 2, 222, 234, 48, 7, 6, 1, 254, 243, 7, 6,
+ 1, 251, 67, 2, 250, 183, 7, 6, 1, 160, 2, 242, 136, 7, 6, 1, 160, 2, 142,
+ 7, 6, 1, 160, 2, 250, 30, 7, 6, 1, 160, 2, 248, 1, 7, 6, 1, 240, 154, 2,
+ 242, 136, 7, 6, 1, 240, 154, 2, 142, 7, 6, 1, 240, 154, 2, 250, 30, 7, 6,
+ 1, 240, 154, 2, 248, 1, 7, 6, 1, 245, 59, 7, 6, 1, 230, 26, 2, 182, 7, 6,
+ 1, 144, 2, 242, 136, 7, 6, 1, 144, 2, 142, 7, 6, 1, 144, 2, 250, 30, 7,
+ 6, 1, 144, 2, 182, 7, 6, 1, 144, 2, 248, 1, 230, 84, 50, 7, 6, 1, 144, 2,
+ 91, 7, 6, 1, 104, 2, 242, 136, 7, 6, 1, 104, 2, 142, 7, 6, 1, 104, 2,
+ 250, 30, 7, 6, 1, 104, 2, 248, 1, 7, 6, 1, 211, 118, 2, 142, 7, 6, 1,
+ 216, 151, 7, 4, 1, 220, 76, 222, 91, 7, 4, 1, 115, 2, 242, 136, 7, 4, 1,
+ 115, 2, 142, 7, 4, 1, 115, 2, 250, 30, 7, 4, 1, 115, 2, 182, 7, 4, 1,
+ 115, 2, 248, 1, 7, 4, 1, 115, 2, 222, 234, 48, 7, 4, 1, 254, 243, 7, 4,
+ 1, 251, 67, 2, 250, 183, 7, 4, 1, 160, 2, 242, 136, 7, 4, 1, 160, 2, 142,
+ 7, 4, 1, 160, 2, 250, 30, 7, 4, 1, 160, 2, 248, 1, 7, 4, 1, 240, 154, 2,
+ 242, 136, 7, 4, 1, 240, 154, 2, 142, 7, 4, 1, 240, 154, 2, 250, 30, 7, 4,
+ 1, 240, 154, 2, 248, 1, 7, 4, 1, 245, 59, 7, 4, 1, 230, 26, 2, 182, 7, 4,
+ 1, 144, 2, 242, 136, 7, 4, 1, 144, 2, 142, 7, 4, 1, 144, 2, 250, 30, 7,
+ 4, 1, 144, 2, 182, 7, 4, 1, 144, 2, 248, 1, 247, 169, 50, 7, 4, 1, 144,
+ 2, 91, 7, 4, 1, 104, 2, 242, 136, 7, 4, 1, 104, 2, 142, 7, 4, 1, 104, 2,
+ 250, 30, 7, 4, 1, 104, 2, 248, 1, 7, 4, 1, 211, 118, 2, 142, 7, 4, 1,
+ 216, 151, 7, 4, 1, 211, 118, 2, 248, 1, 7, 6, 1, 115, 2, 231, 232, 7, 4,
+ 1, 115, 2, 231, 232, 7, 6, 1, 115, 2, 251, 146, 7, 4, 1, 115, 2, 251,
+ 146, 7, 6, 1, 115, 2, 226, 224, 7, 4, 1, 115, 2, 226, 224, 7, 6, 1, 251,
+ 67, 2, 142, 7, 4, 1, 251, 67, 2, 142, 7, 6, 1, 251, 67, 2, 250, 30, 7, 4,
+ 1, 251, 67, 2, 250, 30, 7, 6, 1, 251, 67, 2, 59, 48, 7, 4, 1, 251, 67, 2,
+ 59, 48, 7, 6, 1, 251, 67, 2, 250, 234, 7, 4, 1, 251, 67, 2, 250, 234, 7,
+ 6, 1, 249, 61, 2, 250, 234, 7, 4, 1, 249, 61, 2, 250, 234, 7, 6, 1, 249,
+ 61, 2, 91, 7, 4, 1, 249, 61, 2, 91, 7, 6, 1, 160, 2, 231, 232, 7, 4, 1,
+ 160, 2, 231, 232, 7, 6, 1, 160, 2, 251, 146, 7, 4, 1, 160, 2, 251, 146,
+ 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, 1, 160, 2, 226,
+ 224, 7, 4, 1, 160, 2, 226, 224, 7, 6, 1, 160, 2, 250, 234, 7, 4, 1, 160,
+ 2, 250, 234, 7, 6, 1, 243, 203, 2, 250, 30, 7, 4, 1, 243, 203, 2, 250,
+ 30, 7, 6, 1, 243, 203, 2, 251, 146, 7, 4, 1, 243, 203, 2, 251, 146, 7, 6,
+ 1, 243, 203, 2, 59, 48, 7, 4, 1, 243, 203, 2, 59, 48, 7, 6, 1, 243, 203,
+ 2, 250, 183, 7, 4, 1, 243, 203, 2, 250, 183, 7, 6, 1, 242, 61, 2, 250,
+ 30, 7, 4, 1, 242, 61, 2, 250, 30, 7, 6, 1, 242, 61, 2, 91, 7, 4, 1, 242,
+ 61, 2, 91, 7, 6, 1, 240, 154, 2, 182, 7, 4, 1, 240, 154, 2, 182, 7, 6, 1,
+ 240, 154, 2, 231, 232, 7, 4, 1, 240, 154, 2, 231, 232, 7, 6, 1, 240, 154,
+ 2, 251, 146, 7, 4, 1, 240, 154, 2, 251, 146, 7, 6, 1, 240, 154, 2, 226,
+ 224, 7, 4, 1, 240, 154, 2, 226, 224, 7, 6, 1, 240, 154, 2, 59, 48, 7, 4,
+ 1, 247, 119, 73, 7, 6, 27, 236, 31, 7, 4, 27, 236, 31, 7, 6, 1, 235, 145,
+ 2, 250, 30, 7, 4, 1, 235, 145, 2, 250, 30, 7, 6, 1, 235, 24, 2, 250, 183,
+ 7, 4, 1, 235, 24, 2, 250, 183, 7, 4, 1, 233, 239, 7, 6, 1, 233, 149, 2,
+ 142, 7, 4, 1, 233, 149, 2, 142, 7, 6, 1, 233, 149, 2, 250, 183, 7, 4, 1,
+ 233, 149, 2, 250, 183, 7, 6, 1, 233, 149, 2, 250, 234, 7, 4, 1, 233, 149,
+ 2, 250, 234, 7, 6, 1, 233, 149, 2, 230, 224, 247, 120, 7, 4, 1, 233, 149,
+ 2, 230, 224, 247, 120, 7, 6, 1, 233, 149, 2, 91, 7, 4, 1, 233, 149, 2,
+ 91, 7, 6, 1, 230, 26, 2, 142, 7, 4, 1, 230, 26, 2, 142, 7, 6, 1, 230, 26,
+ 2, 250, 183, 7, 4, 1, 230, 26, 2, 250, 183, 7, 6, 1, 230, 26, 2, 250,
+ 234, 7, 4, 1, 230, 26, 2, 250, 234, 7, 4, 1, 230, 26, 224, 204, 251, 78,
+ 254, 57, 7, 6, 1, 245, 138, 7, 4, 1, 245, 138, 7, 6, 1, 144, 2, 231, 232,
+ 7, 4, 1, 144, 2, 231, 232, 7, 6, 1, 144, 2, 251, 146, 7, 4, 1, 144, 2,
+ 251, 146, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144, 2, 52, 142, 7, 6, 27,
+ 226, 234, 7, 4, 27, 226, 234, 7, 6, 1, 223, 224, 2, 142, 7, 4, 1, 223,
+ 224, 2, 142, 7, 6, 1, 223, 224, 2, 250, 183, 7, 4, 1, 223, 224, 2, 250,
+ 183, 7, 6, 1, 223, 224, 2, 250, 234, 7, 4, 1, 223, 224, 2, 250, 234, 7,
+ 6, 1, 222, 92, 2, 142, 7, 4, 1, 222, 92, 2, 142, 7, 6, 1, 222, 92, 2,
+ 250, 30, 7, 4, 1, 222, 92, 2, 250, 30, 7, 6, 1, 222, 92, 2, 250, 183, 7,
+ 4, 1, 222, 92, 2, 250, 183, 7, 6, 1, 222, 92, 2, 250, 234, 7, 4, 1, 222,
+ 92, 2, 250, 234, 7, 6, 1, 217, 153, 2, 250, 183, 7, 4, 1, 217, 153, 2,
+ 250, 183, 7, 6, 1, 217, 153, 2, 250, 234, 7, 4, 1, 217, 153, 2, 250, 234,
+ 7, 6, 1, 217, 153, 2, 91, 7, 4, 1, 217, 153, 2, 91, 7, 6, 1, 104, 2, 182,
+ 7, 4, 1, 104, 2, 182, 7, 6, 1, 104, 2, 231, 232, 7, 4, 1, 104, 2, 231,
+ 232, 7, 6, 1, 104, 2, 251, 146, 7, 4, 1, 104, 2, 251, 146, 7, 6, 1, 104,
+ 2, 222, 234, 48, 7, 4, 1, 104, 2, 222, 234, 48, 7, 6, 1, 104, 2, 52, 142,
+ 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 224, 7, 4, 1, 104, 2,
+ 226, 224, 7, 6, 1, 212, 99, 2, 250, 30, 7, 4, 1, 212, 99, 2, 250, 30, 7,
+ 6, 1, 211, 118, 2, 250, 30, 7, 4, 1, 211, 118, 2, 250, 30, 7, 6, 1, 211,
+ 118, 2, 248, 1, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210, 160, 2, 142, 7,
+ 6, 1, 210, 160, 2, 59, 48, 7, 4, 1, 210, 160, 2, 59, 48, 7, 6, 1, 210,
+ 160, 2, 250, 234, 7, 4, 1, 210, 160, 2, 250, 234, 7, 4, 1, 199, 222, 91,
+ 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2, 216, 11, 7, 4,
+ 1, 57, 2, 216, 11, 7, 6, 1, 138, 194, 7, 4, 1, 138, 194, 7, 6, 1, 204,
+ 76, 7, 6, 1, 251, 67, 2, 103, 7, 4, 1, 251, 67, 2, 103, 7, 6, 1, 254,
+ 219, 249, 60, 7, 6, 1, 249, 61, 2, 103, 7, 6, 1, 249, 61, 2, 216, 11, 7,
+ 4, 1, 249, 61, 2, 216, 11, 7, 4, 1, 215, 94, 248, 54, 7, 6, 1, 223, 49,
+ 75, 7, 6, 1, 221, 195, 7, 6, 1, 204, 75, 7, 6, 1, 245, 7, 2, 103, 7, 4,
+ 1, 245, 7, 2, 103, 7, 6, 1, 243, 203, 2, 103, 7, 6, 1, 243, 107, 7, 4, 1,
+ 240, 201, 7, 6, 1, 235, 185, 7, 6, 1, 240, 154, 2, 91, 7, 6, 1, 235, 24,
+ 2, 103, 7, 4, 1, 235, 24, 2, 103, 7, 4, 1, 233, 149, 2, 130, 7, 4, 1,
+ 233, 100, 2, 91, 7, 6, 1, 215, 94, 193, 7, 6, 1, 230, 26, 2, 43, 103, 7,
+ 4, 1, 230, 26, 2, 199, 44, 233, 36, 7, 6, 1, 144, 2, 230, 224, 182, 7, 6,
+ 1, 144, 2, 240, 248, 7, 4, 1, 144, 2, 240, 248, 7, 6, 1, 226, 219, 7, 4,
+ 1, 226, 219, 7, 6, 1, 226, 106, 2, 103, 7, 4, 1, 226, 106, 2, 103, 7, 1,
+ 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6, 1, 245, 75, 7, 1,
+ 223, 49, 245, 76, 232, 123, 7, 4, 1, 217, 153, 2, 226, 66, 103, 7, 6, 1,
+ 217, 153, 2, 103, 7, 4, 1, 217, 153, 2, 103, 7, 6, 1, 217, 153, 2, 223,
+ 55, 103, 7, 6, 1, 104, 2, 240, 248, 7, 4, 1, 104, 2, 240, 248, 7, 6, 1,
+ 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211, 118, 2, 103, 7, 4, 1,
+ 211, 118, 2, 103, 7, 6, 1, 210, 160, 2, 91, 7, 4, 1, 210, 160, 2, 91, 7,
+ 6, 1, 245, 8, 7, 6, 1, 245, 9, 223, 48, 7, 4, 1, 245, 9, 223, 48, 7, 4,
+ 1, 245, 9, 2, 217, 77, 7, 1, 113, 2, 91, 7, 6, 1, 138, 189, 7, 4, 1, 138,
+ 189, 7, 1, 235, 193, 242, 180, 218, 130, 2, 91, 7, 1, 211, 181, 7, 1,
+ 248, 47, 250, 11, 7, 1, 233, 77, 250, 11, 7, 1, 254, 137, 250, 11, 7, 1,
+ 223, 55, 250, 11, 7, 6, 1, 246, 40, 2, 250, 234, 7, 6, 1, 249, 61, 2, 4,
+ 1, 210, 160, 2, 250, 234, 7, 4, 1, 246, 40, 2, 250, 234, 7, 6, 1, 232,
+ 188, 7, 6, 1, 233, 149, 2, 4, 1, 235, 144, 7, 4, 1, 232, 188, 7, 6, 1,
+ 228, 186, 7, 6, 1, 230, 26, 2, 4, 1, 235, 144, 7, 4, 1, 228, 186, 7, 6,
+ 1, 115, 2, 250, 234, 7, 4, 1, 115, 2, 250, 234, 7, 6, 1, 240, 154, 2,
+ 250, 234, 7, 4, 1, 240, 154, 2, 250, 234, 7, 6, 1, 144, 2, 250, 234, 7,
+ 4, 1, 144, 2, 250, 234, 7, 6, 1, 104, 2, 250, 234, 7, 4, 1, 104, 2, 250,
+ 234, 7, 6, 1, 104, 2, 248, 2, 22, 231, 232, 7, 4, 1, 104, 2, 248, 2, 22,
+ 231, 232, 7, 6, 1, 104, 2, 248, 2, 22, 142, 7, 4, 1, 104, 2, 248, 2, 22,
+ 142, 7, 6, 1, 104, 2, 248, 2, 22, 250, 234, 7, 4, 1, 104, 2, 248, 2, 22,
+ 250, 234, 7, 6, 1, 104, 2, 248, 2, 22, 242, 136, 7, 4, 1, 104, 2, 248, 2,
+ 22, 242, 136, 7, 4, 1, 215, 94, 75, 7, 6, 1, 115, 2, 248, 2, 22, 231,
+ 232, 7, 4, 1, 115, 2, 248, 2, 22, 231, 232, 7, 6, 1, 115, 2, 59, 77, 22,
+ 231, 232, 7, 4, 1, 115, 2, 59, 77, 22, 231, 232, 7, 6, 1, 254, 244, 2,
+ 231, 232, 7, 4, 1, 254, 244, 2, 231, 232, 7, 6, 1, 243, 203, 2, 91, 7, 4,
+ 1, 243, 203, 2, 91, 7, 6, 1, 243, 203, 2, 250, 234, 7, 4, 1, 243, 203, 2,
+ 250, 234, 7, 6, 1, 235, 24, 2, 250, 234, 7, 4, 1, 235, 24, 2, 250, 234,
+ 7, 6, 1, 144, 2, 226, 224, 7, 4, 1, 144, 2, 226, 224, 7, 6, 1, 144, 2,
+ 226, 225, 22, 231, 232, 7, 4, 1, 144, 2, 226, 225, 22, 231, 232, 7, 6, 1,
+ 245, 9, 2, 250, 234, 7, 4, 1, 245, 9, 2, 250, 234, 7, 4, 1, 235, 145, 2,
+ 250, 234, 7, 6, 1, 246, 39, 7, 6, 1, 249, 61, 2, 4, 1, 210, 159, 7, 4, 1,
+ 246, 39, 7, 6, 1, 243, 203, 2, 142, 7, 4, 1, 243, 203, 2, 142, 7, 6, 1,
+ 240, 199, 7, 6, 1, 211, 181, 7, 6, 1, 230, 26, 2, 242, 136, 7, 4, 1, 230,
+ 26, 2, 242, 136, 7, 6, 1, 115, 2, 222, 234, 77, 22, 142, 7, 4, 1, 115, 2,
+ 222, 234, 77, 22, 142, 7, 6, 1, 254, 244, 2, 142, 7, 4, 1, 254, 244, 2,
+ 142, 7, 6, 1, 144, 2, 218, 103, 22, 142, 7, 4, 1, 144, 2, 218, 103, 22,
+ 142, 7, 6, 1, 115, 2, 52, 242, 136, 7, 4, 1, 115, 2, 52, 242, 136, 7, 6,
+ 1, 115, 2, 235, 193, 251, 146, 7, 4, 1, 115, 2, 235, 193, 251, 146, 7, 6,
+ 1, 160, 2, 52, 242, 136, 7, 4, 1, 160, 2, 52, 242, 136, 7, 6, 1, 160, 2,
+ 235, 193, 251, 146, 7, 4, 1, 160, 2, 235, 193, 251, 146, 7, 6, 1, 240,
+ 154, 2, 52, 242, 136, 7, 4, 1, 240, 154, 2, 52, 242, 136, 7, 6, 1, 240,
+ 154, 2, 235, 193, 251, 146, 7, 4, 1, 240, 154, 2, 235, 193, 251, 146, 7,
+ 6, 1, 144, 2, 52, 242, 136, 7, 4, 1, 144, 2, 52, 242, 136, 7, 6, 1, 144,
+ 2, 235, 193, 251, 146, 7, 4, 1, 144, 2, 235, 193, 251, 146, 7, 6, 1, 223,
+ 224, 2, 52, 242, 136, 7, 4, 1, 223, 224, 2, 52, 242, 136, 7, 6, 1, 223,
+ 224, 2, 235, 193, 251, 146, 7, 4, 1, 223, 224, 2, 235, 193, 251, 146, 7,
+ 6, 1, 104, 2, 52, 242, 136, 7, 4, 1, 104, 2, 52, 242, 136, 7, 6, 1, 104,
+ 2, 235, 193, 251, 146, 7, 4, 1, 104, 2, 235, 193, 251, 146, 7, 6, 1, 222,
+ 92, 2, 249, 220, 51, 7, 4, 1, 222, 92, 2, 249, 220, 51, 7, 6, 1, 217,
+ 153, 2, 249, 220, 51, 7, 4, 1, 217, 153, 2, 249, 220, 51, 7, 6, 1, 210,
+ 231, 7, 4, 1, 210, 231, 7, 6, 1, 242, 61, 2, 250, 234, 7, 4, 1, 242, 61,
+ 2, 250, 234, 7, 6, 1, 230, 26, 2, 199, 44, 233, 36, 7, 4, 1, 249, 61, 2,
+ 249, 100, 7, 6, 1, 226, 134, 7, 4, 1, 226, 134, 7, 6, 1, 210, 160, 2,
+ 103, 7, 4, 1, 210, 160, 2, 103, 7, 6, 1, 115, 2, 59, 48, 7, 4, 1, 115, 2,
+ 59, 48, 7, 6, 1, 160, 2, 250, 183, 7, 4, 1, 160, 2, 250, 183, 7, 6, 1,
+ 144, 2, 248, 2, 22, 231, 232, 7, 4, 1, 144, 2, 248, 2, 22, 231, 232, 7,
+ 6, 1, 144, 2, 216, 89, 22, 231, 232, 7, 4, 1, 144, 2, 216, 89, 22, 231,
+ 232, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1, 144, 2, 59, 48, 7, 6, 1, 144, 2,
+ 59, 77, 22, 231, 232, 7, 4, 1, 144, 2, 59, 77, 22, 231, 232, 7, 6, 1,
+ 211, 118, 2, 231, 232, 7, 4, 1, 211, 118, 2, 231, 232, 7, 4, 1, 233, 149,
+ 2, 249, 100, 7, 4, 1, 230, 26, 2, 249, 100, 7, 4, 1, 217, 153, 2, 249,
+ 100, 7, 4, 1, 247, 119, 235, 144, 7, 4, 1, 248, 143, 247, 220, 7, 4, 1,
+ 224, 31, 247, 220, 7, 6, 1, 115, 2, 91, 7, 6, 1, 251, 67, 2, 91, 7, 4, 1,
+ 251, 67, 2, 91, 7, 6, 1, 233, 149, 2, 130, 7, 6, 1, 217, 153, 2, 247,
+ 255, 91, 7, 4, 1, 222, 92, 2, 217, 250, 217, 77, 7, 4, 1, 210, 160, 2,
+ 217, 250, 217, 77, 7, 6, 1, 242, 180, 218, 129, 7, 4, 1, 242, 180, 218,
+ 129, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130, 7, 6, 1, 215, 94, 214, 105,
+ 7, 6, 1, 160, 2, 91, 7, 4, 1, 160, 2, 91, 7, 6, 1, 235, 145, 2, 91, 7, 4,
+ 1, 235, 145, 2, 91, 7, 6, 1, 4, 224, 97, 2, 241, 52, 217, 77, 7, 4, 1,
+ 224, 97, 2, 241, 52, 217, 77, 7, 6, 1, 223, 224, 2, 91, 7, 4, 1, 223,
+ 224, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1, 211, 118, 2, 91, 7, 4, 1,
+ 215, 94, 61, 7, 4, 1, 254, 143, 7, 4, 1, 215, 94, 254, 143, 7, 4, 1, 57,
+ 2, 103, 7, 4, 1, 204, 76, 7, 4, 1, 251, 67, 2, 249, 100, 7, 4, 1, 249,
+ 61, 2, 217, 77, 7, 4, 1, 249, 61, 2, 103, 7, 4, 1, 223, 49, 75, 7, 4, 1,
+ 221, 195, 7, 4, 1, 221, 196, 2, 103, 7, 4, 1, 204, 75, 7, 4, 1, 223, 49,
+ 204, 75, 7, 4, 1, 223, 49, 204, 160, 2, 103, 7, 4, 1, 250, 0, 223, 49,
+ 204, 75, 7, 4, 1, 247, 119, 235, 145, 2, 91, 7, 4, 1, 243, 203, 2, 103,
+ 7, 4, 1, 119, 243, 202, 7, 1, 4, 6, 243, 202, 7, 4, 1, 243, 107, 7, 4, 1,
+ 223, 151, 240, 248, 7, 4, 1, 215, 94, 242, 60, 7, 4, 1, 242, 61, 2, 103,
+ 7, 4, 1, 241, 208, 2, 103, 7, 4, 1, 240, 154, 2, 91, 7, 4, 1, 235, 185,
+ 7, 1, 4, 6, 73, 7, 4, 1, 233, 149, 2, 230, 224, 182, 7, 4, 1, 233, 149,
+ 2, 252, 41, 7, 4, 1, 233, 149, 2, 223, 55, 103, 7, 4, 1, 233, 1, 7, 4, 1,
+ 215, 94, 193, 7, 4, 1, 215, 94, 232, 50, 2, 199, 233, 36, 7, 4, 1, 232,
+ 50, 2, 103, 7, 4, 1, 230, 26, 2, 43, 103, 7, 4, 1, 230, 26, 2, 223, 55,
+ 103, 7, 1, 4, 6, 230, 25, 7, 4, 1, 252, 134, 76, 7, 1, 4, 6, 226, 234, 7,
+ 4, 1, 250, 0, 226, 201, 7, 4, 1, 225, 133, 7, 4, 1, 215, 94, 153, 7, 4,
+ 1, 215, 94, 223, 224, 2, 199, 233, 36, 7, 4, 1, 215, 94, 223, 224, 2,
+ 103, 7, 4, 1, 223, 224, 2, 199, 233, 36, 7, 4, 1, 223, 224, 2, 217, 77,
+ 7, 4, 1, 223, 224, 2, 244, 87, 7, 4, 1, 223, 49, 223, 224, 2, 244, 87, 7,
+ 1, 4, 6, 153, 7, 1, 4, 6, 235, 193, 153, 7, 4, 1, 222, 92, 2, 103, 7, 4,
+ 1, 245, 75, 7, 4, 1, 247, 119, 235, 145, 2, 218, 103, 22, 103, 7, 4, 1,
+ 218, 231, 223, 49, 245, 75, 7, 4, 1, 245, 76, 2, 249, 100, 7, 4, 1, 215,
+ 94, 217, 152, 7, 4, 1, 217, 153, 2, 223, 55, 103, 7, 4, 1, 104, 130, 7,
+ 4, 1, 214, 157, 7, 4, 1, 214, 106, 2, 103, 7, 4, 1, 215, 94, 214, 105, 7,
+ 4, 1, 215, 94, 212, 98, 7, 4, 1, 215, 94, 211, 117, 7, 1, 4, 6, 211, 117,
+ 7, 4, 1, 210, 160, 2, 223, 55, 103, 7, 4, 1, 210, 160, 2, 249, 100, 7, 4,
+ 1, 245, 8, 7, 4, 1, 245, 9, 2, 249, 100, 7, 1, 242, 180, 218, 129, 7, 1,
+ 225, 139, 213, 135, 243, 249, 7, 1, 235, 193, 242, 180, 218, 129, 7, 1,
+ 218, 110, 251, 66, 7, 1, 251, 246, 250, 11, 7, 1, 4, 6, 253, 158, 7, 4,
+ 1, 250, 0, 204, 75, 7, 1, 4, 6, 243, 203, 2, 103, 7, 1, 4, 6, 242, 60, 7,
+ 4, 1, 235, 145, 2, 249, 127, 7, 4, 1, 215, 94, 235, 23, 7, 1, 4, 6, 156,
+ 7, 4, 1, 224, 97, 2, 103, 7, 1, 242, 180, 218, 130, 2, 91, 7, 1, 223, 49,
+ 242, 180, 218, 130, 2, 91, 7, 4, 1, 246, 40, 247, 220, 7, 4, 1, 248, 26,
+ 247, 220, 7, 4, 1, 246, 40, 247, 221, 2, 249, 100, 7, 4, 1, 215, 185,
+ 247, 220, 7, 4, 1, 216, 235, 247, 220, 7, 4, 1, 217, 29, 247, 221, 2,
+ 249, 100, 7, 4, 1, 244, 134, 247, 220, 7, 4, 1, 232, 100, 247, 220, 7, 4,
+ 1, 232, 51, 247, 220, 7, 1, 251, 246, 225, 181, 7, 1, 251, 254, 225, 181,
+ 7, 4, 1, 215, 94, 242, 61, 2, 244, 87, 7, 4, 1, 215, 94, 242, 61, 2, 244,
+ 88, 22, 217, 77, 58, 1, 4, 242, 60, 58, 1, 4, 242, 61, 2, 103, 58, 1, 4,
+ 235, 144, 58, 1, 4, 153, 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223,
+ 224, 2, 103, 58, 1, 4, 6, 235, 193, 153, 58, 1, 4, 212, 98, 58, 1, 4,
+ 211, 117, 58, 1, 224, 190, 58, 1, 52, 224, 190, 58, 1, 215, 94, 249, 219,
+ 58, 1, 254, 57, 58, 1, 223, 49, 249, 219, 58, 1, 44, 163, 222, 233, 58,
+ 1, 43, 163, 222, 233, 58, 1, 242, 180, 218, 129, 58, 1, 223, 49, 242,
+ 180, 218, 129, 58, 1, 43, 253, 249, 58, 1, 44, 253, 249, 58, 1, 120, 253,
+ 249, 58, 1, 124, 253, 249, 58, 1, 250, 31, 255, 14, 250, 234, 58, 1, 67,
+ 232, 213, 58, 1, 231, 232, 58, 1, 255, 3, 255, 14, 58, 1, 242, 137, 255,
+ 14, 58, 1, 121, 67, 232, 213, 58, 1, 121, 231, 232, 58, 1, 121, 242, 137,
+ 255, 14, 58, 1, 121, 255, 3, 255, 14, 58, 1, 215, 222, 249, 226, 58, 1,
+ 163, 215, 222, 249, 226, 58, 1, 250, 173, 44, 163, 222, 233, 58, 1, 250,
+ 173, 43, 163, 222, 233, 58, 1, 120, 217, 87, 58, 1, 124, 217, 87, 58, 1,
+ 96, 50, 58, 1, 230, 182, 50, 251, 146, 59, 48, 222, 234, 48, 226, 224, 4,
+ 182, 52, 255, 3, 255, 14, 58, 1, 223, 36, 103, 58, 1, 249, 131, 255, 14,
+ 58, 1, 4, 243, 107, 58, 1, 4, 156, 58, 1, 4, 222, 91, 58, 1, 4, 211, 178,
+ 58, 1, 4, 223, 49, 242, 180, 218, 129, 58, 1, 245, 20, 138, 130, 58, 1,
+ 125, 138, 130, 58, 1, 230, 225, 138, 130, 58, 1, 121, 138, 130, 58, 1,
+ 245, 19, 138, 130, 58, 1, 210, 254, 248, 44, 138, 78, 58, 1, 211, 70,
+ 248, 44, 138, 78, 58, 1, 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 57,
+ 58, 1, 121, 124, 253, 249, 58, 1, 121, 120, 253, 249, 58, 1, 121, 43,
+ 253, 249, 58, 1, 121, 44, 253, 249, 58, 1, 121, 222, 233, 58, 1, 230,
+ 224, 242, 137, 255, 14, 58, 1, 230, 224, 52, 242, 137, 255, 14, 58, 1,
+ 230, 224, 52, 255, 3, 255, 14, 58, 1, 121, 182, 58, 1, 223, 157, 249,
+ 226, 58, 1, 252, 58, 125, 216, 30, 58, 1, 245, 143, 125, 216, 30, 58, 1,
+ 252, 58, 121, 216, 30, 58, 1, 245, 143, 121, 216, 30, 58, 1, 220, 54, 58,
+ 1, 204, 220, 54, 58, 1, 121, 43, 74, 38, 242, 137, 255, 14, 38, 255, 3,
+ 255, 14, 38, 250, 31, 255, 14, 38, 182, 38, 231, 232, 38, 226, 119, 38,
+ 251, 146, 38, 59, 48, 38, 248, 1, 38, 241, 52, 48, 38, 222, 234, 48, 38,
+ 52, 255, 3, 255, 14, 38, 250, 234, 38, 67, 232, 214, 48, 38, 52, 67, 232,
+ 214, 48, 38, 52, 242, 137, 255, 14, 38, 250, 255, 38, 235, 193, 251, 146,
+ 38, 215, 94, 249, 220, 48, 38, 249, 220, 48, 38, 223, 49, 249, 220, 48,
+ 38, 249, 220, 77, 222, 251, 38, 242, 137, 255, 15, 51, 38, 255, 3, 255,
+ 15, 51, 38, 43, 217, 88, 51, 38, 44, 217, 88, 51, 38, 43, 254, 110, 48,
+ 38, 240, 248, 38, 43, 163, 222, 234, 51, 38, 120, 217, 88, 51, 38, 124,
+ 217, 88, 51, 38, 96, 5, 51, 38, 230, 182, 5, 51, 38, 226, 64, 241, 52,
+ 51, 38, 223, 55, 241, 52, 51, 38, 59, 51, 38, 248, 2, 51, 38, 222, 234,
+ 51, 38, 249, 220, 51, 38, 250, 183, 38, 226, 224, 38, 67, 232, 214, 51,
+ 38, 251, 140, 51, 38, 235, 193, 52, 254, 24, 51, 38, 250, 235, 51, 38,
+ 250, 31, 255, 15, 51, 38, 251, 147, 51, 38, 235, 193, 251, 147, 51, 38,
+ 216, 89, 51, 38, 231, 233, 51, 38, 121, 232, 213, 38, 52, 121, 232, 213,
+ 38, 216, 89, 226, 120, 38, 219, 251, 218, 103, 226, 120, 38, 199, 218,
+ 103, 226, 120, 38, 219, 251, 219, 47, 226, 120, 38, 199, 219, 47, 226,
+ 120, 38, 44, 163, 222, 234, 51, 38, 235, 193, 251, 140, 51, 38, 42, 51,
+ 38, 221, 180, 51, 38, 211, 179, 48, 38, 67, 182, 38, 52, 226, 119, 38,
+ 242, 137, 138, 78, 38, 255, 3, 138, 78, 38, 26, 225, 175, 38, 26, 234, 2,
+ 38, 26, 247, 252, 216, 18, 38, 26, 210, 219, 38, 251, 140, 48, 38, 245,
+ 98, 5, 51, 38, 52, 67, 232, 214, 51, 38, 43, 254, 110, 51, 38, 228, 52,
+ 216, 89, 48, 38, 241, 58, 48, 38, 254, 148, 128, 216, 42, 48, 38, 43, 44,
+ 80, 51, 38, 214, 153, 80, 51, 38, 242, 142, 235, 63, 38, 44, 253, 250,
+ 48, 38, 43, 163, 222, 234, 48, 38, 244, 131, 38, 211, 179, 51, 38, 43,
+ 253, 250, 51, 38, 44, 253, 250, 51, 38, 44, 253, 250, 22, 120, 253, 250,
+ 51, 38, 44, 163, 222, 234, 48, 38, 59, 77, 222, 251, 38, 253, 217, 51,
+ 38, 52, 222, 234, 51, 38, 210, 35, 48, 38, 52, 251, 147, 51, 38, 52, 251,
+ 146, 38, 52, 231, 232, 38, 52, 231, 233, 51, 38, 52, 182, 38, 52, 235,
+ 193, 251, 146, 38, 52, 97, 80, 51, 38, 7, 4, 1, 61, 38, 7, 4, 1, 75, 38,
+ 7, 4, 1, 73, 38, 7, 4, 1, 76, 38, 7, 4, 1, 70, 38, 7, 4, 1, 251, 66, 38,
+ 7, 4, 1, 249, 60, 38, 7, 4, 1, 242, 60, 38, 7, 4, 1, 193, 38, 7, 4, 1,
+ 153, 38, 7, 4, 1, 217, 152, 38, 7, 4, 1, 214, 105, 38, 7, 4, 1, 211, 178,
+ 26, 6, 1, 241, 196, 26, 4, 1, 241, 196, 26, 6, 1, 254, 23, 221, 246, 26,
+ 4, 1, 254, 23, 221, 246, 26, 227, 198, 50, 26, 232, 108, 227, 198, 50,
+ 26, 6, 1, 226, 51, 247, 227, 26, 4, 1, 226, 51, 247, 227, 26, 210, 219,
+ 26, 4, 223, 49, 232, 83, 219, 178, 87, 26, 4, 246, 118, 232, 83, 219,
+ 178, 87, 26, 4, 223, 49, 246, 118, 232, 83, 219, 178, 87, 26, 224, 13,
+ 78, 26, 216, 18, 26, 247, 252, 216, 18, 26, 6, 1, 254, 144, 2, 216, 18,
+ 26, 254, 97, 217, 2, 26, 6, 1, 245, 101, 2, 216, 18, 26, 6, 1, 245, 64,
+ 2, 216, 18, 26, 6, 1, 235, 186, 2, 216, 18, 26, 6, 1, 226, 200, 2, 216,
+ 18, 26, 6, 1, 214, 158, 2, 216, 18, 26, 6, 1, 226, 202, 2, 216, 18, 26,
+ 4, 1, 235, 186, 2, 247, 252, 22, 216, 18, 26, 6, 1, 254, 143, 26, 6, 1,
+ 252, 26, 26, 6, 1, 243, 107, 26, 6, 1, 248, 54, 26, 6, 1, 245, 100, 26,
+ 6, 1, 210, 85, 26, 6, 1, 245, 63, 26, 6, 1, 216, 179, 26, 6, 1, 235, 185,
+ 26, 6, 1, 234, 222, 26, 6, 1, 233, 98, 26, 6, 1, 230, 102, 26, 6, 1, 227,
+ 237, 26, 6, 1, 211, 157, 26, 6, 1, 226, 199, 26, 6, 1, 225, 108, 26, 6,
+ 1, 223, 37, 26, 6, 1, 219, 177, 26, 6, 1, 217, 41, 26, 6, 1, 214, 157,
+ 26, 6, 1, 225, 133, 26, 6, 1, 250, 110, 26, 6, 1, 224, 161, 26, 6, 1,
+ 226, 201, 26, 6, 1, 235, 186, 2, 247, 251, 26, 6, 1, 214, 158, 2, 247,
+ 251, 26, 4, 1, 254, 144, 2, 216, 18, 26, 4, 1, 245, 101, 2, 216, 18, 26,
+ 4, 1, 245, 64, 2, 216, 18, 26, 4, 1, 235, 186, 2, 216, 18, 26, 4, 1, 214,
+ 158, 2, 247, 252, 22, 216, 18, 26, 4, 1, 254, 143, 26, 4, 1, 252, 26, 26,
+ 4, 1, 243, 107, 26, 4, 1, 248, 54, 26, 4, 1, 245, 100, 26, 4, 1, 210, 85,
+ 26, 4, 1, 245, 63, 26, 4, 1, 216, 179, 26, 4, 1, 235, 185, 26, 4, 1, 234,
+ 222, 26, 4, 1, 233, 98, 26, 4, 1, 230, 102, 26, 4, 1, 227, 237, 26, 4, 1,
+ 211, 157, 26, 4, 1, 226, 199, 26, 4, 1, 225, 108, 26, 4, 1, 223, 37, 26,
+ 4, 1, 40, 219, 177, 26, 4, 1, 219, 177, 26, 4, 1, 217, 41, 26, 4, 1, 214,
+ 157, 26, 4, 1, 225, 133, 26, 4, 1, 250, 110, 26, 4, 1, 224, 161, 26, 4,
+ 1, 226, 201, 26, 4, 1, 235, 186, 2, 247, 251, 26, 4, 1, 214, 158, 2, 247,
+ 251, 26, 4, 1, 226, 200, 2, 216, 18, 26, 4, 1, 214, 158, 2, 216, 18, 26,
+ 4, 1, 226, 202, 2, 216, 18, 26, 6, 234, 247, 87, 26, 252, 27, 87, 26,
+ 216, 180, 87, 26, 214, 158, 2, 241, 52, 87, 26, 214, 158, 2, 255, 3, 22,
+ 241, 52, 87, 26, 214, 158, 2, 248, 2, 22, 241, 52, 87, 26, 225, 134, 87,
+ 26, 225, 109, 87, 26, 234, 247, 87, 26, 1, 254, 23, 234, 6, 26, 4, 1,
+ 254, 23, 234, 6, 26, 1, 218, 137, 26, 4, 1, 218, 137, 26, 1, 247, 227,
+ 26, 4, 1, 247, 227, 26, 1, 234, 6, 26, 4, 1, 234, 6, 26, 1, 221, 246, 26,
+ 4, 1, 221, 246, 81, 6, 1, 220, 55, 81, 4, 1, 220, 55, 81, 6, 1, 244, 140,
+ 81, 4, 1, 244, 140, 81, 6, 1, 234, 117, 81, 4, 1, 234, 117, 81, 6, 1,
+ 241, 45, 81, 4, 1, 241, 45, 81, 6, 1, 243, 102, 81, 4, 1, 243, 102, 81,
+ 6, 1, 220, 22, 81, 4, 1, 220, 22, 81, 6, 1, 248, 69, 81, 4, 1, 248, 69,
+ 26, 234, 223, 87, 26, 223, 38, 87, 26, 232, 83, 219, 178, 87, 26, 1, 210,
+ 224, 26, 6, 216, 180, 87, 26, 232, 83, 245, 101, 87, 26, 223, 49, 232,
+ 83, 245, 101, 87, 26, 6, 1, 220, 7, 26, 4, 1, 220, 7, 26, 6, 232, 83,
+ 219, 178, 87, 26, 6, 1, 221, 243, 26, 4, 1, 221, 243, 26, 223, 38, 2,
+ 218, 103, 87, 26, 6, 223, 49, 232, 83, 219, 178, 87, 26, 6, 246, 118,
+ 232, 83, 219, 178, 87, 26, 6, 223, 49, 246, 118, 232, 83, 219, 178, 87,
+ 33, 6, 1, 236, 61, 2, 242, 136, 33, 6, 1, 235, 189, 33, 6, 1, 247, 162,
+ 33, 6, 1, 242, 187, 33, 6, 1, 214, 202, 236, 60, 33, 6, 1, 246, 36, 33,
+ 6, 1, 251, 76, 73, 33, 6, 1, 211, 8, 33, 6, 1, 235, 126, 33, 6, 1, 232,
+ 187, 33, 6, 1, 228, 178, 33, 6, 1, 215, 174, 33, 6, 1, 234, 48, 33, 6, 1,
+ 240, 154, 2, 242, 136, 33, 6, 1, 219, 251, 70, 33, 6, 1, 246, 32, 33, 6,
+ 1, 61, 33, 6, 1, 252, 75, 33, 6, 1, 213, 255, 33, 6, 1, 242, 236, 33, 6,
+ 1, 248, 90, 33, 6, 1, 236, 60, 33, 6, 1, 210, 74, 33, 6, 1, 210, 94, 33,
+ 6, 1, 73, 33, 6, 1, 219, 251, 73, 33, 6, 1, 176, 33, 6, 1, 245, 174, 33,
+ 6, 1, 245, 159, 33, 6, 1, 245, 150, 33, 6, 1, 76, 33, 6, 1, 225, 221, 33,
+ 6, 1, 245, 92, 33, 6, 1, 245, 82, 33, 6, 1, 217, 22, 33, 6, 1, 70, 33, 6,
+ 1, 245, 202, 33, 6, 1, 162, 33, 6, 1, 215, 178, 33, 6, 1, 250, 131, 33,
+ 6, 1, 220, 102, 33, 6, 1, 220, 65, 33, 6, 1, 242, 3, 50, 33, 6, 1, 211,
+ 27, 33, 6, 1, 219, 52, 50, 33, 6, 1, 75, 33, 6, 1, 210, 212, 33, 6, 1,
+ 191, 33, 4, 1, 61, 33, 4, 1, 252, 75, 33, 4, 1, 213, 255, 33, 4, 1, 242,
+ 236, 33, 4, 1, 248, 90, 33, 4, 1, 236, 60, 33, 4, 1, 210, 74, 33, 4, 1,
+ 210, 94, 33, 4, 1, 73, 33, 4, 1, 219, 251, 73, 33, 4, 1, 176, 33, 4, 1,
+ 245, 174, 33, 4, 1, 245, 159, 33, 4, 1, 245, 150, 33, 4, 1, 76, 33, 4, 1,
+ 225, 221, 33, 4, 1, 245, 92, 33, 4, 1, 245, 82, 33, 4, 1, 217, 22, 33, 4,
+ 1, 70, 33, 4, 1, 245, 202, 33, 4, 1, 162, 33, 4, 1, 215, 178, 33, 4, 1,
+ 250, 131, 33, 4, 1, 220, 102, 33, 4, 1, 220, 65, 33, 4, 1, 242, 3, 50,
+ 33, 4, 1, 211, 27, 33, 4, 1, 219, 52, 50, 33, 4, 1, 75, 33, 4, 1, 210,
+ 212, 33, 4, 1, 191, 33, 4, 1, 236, 61, 2, 242, 136, 33, 4, 1, 235, 189,
+ 33, 4, 1, 247, 162, 33, 4, 1, 242, 187, 33, 4, 1, 214, 202, 236, 60, 33,
+ 4, 1, 246, 36, 33, 4, 1, 251, 76, 73, 33, 4, 1, 211, 8, 33, 4, 1, 235,
+ 126, 33, 4, 1, 232, 187, 33, 4, 1, 228, 178, 33, 4, 1, 215, 174, 33, 4,
+ 1, 234, 48, 33, 4, 1, 240, 154, 2, 242, 136, 33, 4, 1, 219, 251, 70, 33,
+ 4, 1, 246, 32, 33, 6, 1, 226, 201, 33, 4, 1, 226, 201, 33, 6, 1, 211, 59,
+ 33, 4, 1, 211, 59, 33, 6, 1, 235, 183, 75, 33, 4, 1, 235, 183, 75, 33, 6,
+ 1, 232, 192, 210, 183, 33, 4, 1, 232, 192, 210, 183, 33, 6, 1, 235, 183,
+ 232, 192, 210, 183, 33, 4, 1, 235, 183, 232, 192, 210, 183, 33, 6, 1,
+ 251, 249, 210, 183, 33, 4, 1, 251, 249, 210, 183, 33, 6, 1, 235, 183,
+ 251, 249, 210, 183, 33, 4, 1, 235, 183, 251, 249, 210, 183, 33, 6, 1,
+ 233, 233, 33, 4, 1, 233, 233, 33, 6, 1, 224, 161, 33, 4, 1, 224, 161, 33,
+ 6, 1, 244, 82, 33, 4, 1, 244, 82, 33, 6, 1, 235, 146, 33, 4, 1, 235, 146,
+ 33, 6, 1, 235, 147, 2, 52, 242, 137, 255, 14, 33, 4, 1, 235, 147, 2, 52,
+ 242, 137, 255, 14, 33, 6, 1, 214, 205, 33, 4, 1, 214, 205, 33, 6, 1, 222,
+ 185, 226, 201, 33, 4, 1, 222, 185, 226, 201, 33, 6, 1, 226, 202, 2, 216,
+ 65, 33, 4, 1, 226, 202, 2, 216, 65, 33, 6, 1, 226, 140, 33, 4, 1, 226,
+ 140, 33, 6, 1, 234, 6, 33, 4, 1, 234, 6, 33, 216, 146, 50, 38, 33, 216,
+ 65, 38, 33, 226, 65, 38, 33, 248, 154, 225, 18, 38, 33, 224, 155, 225,
+ 18, 38, 33, 225, 3, 38, 33, 240, 211, 216, 146, 50, 38, 33, 230, 191, 50,
+ 33, 6, 1, 219, 251, 240, 154, 2, 217, 77, 33, 4, 1, 219, 251, 240, 154,
+ 2, 217, 77, 33, 6, 1, 220, 146, 50, 33, 4, 1, 220, 146, 50, 33, 6, 1,
+ 245, 93, 2, 216, 114, 33, 4, 1, 245, 93, 2, 216, 114, 33, 6, 1, 242, 237,
+ 2, 214, 156, 33, 4, 1, 242, 237, 2, 214, 156, 33, 6, 1, 242, 237, 2, 91,
+ 33, 4, 1, 242, 237, 2, 91, 33, 6, 1, 242, 237, 2, 230, 224, 103, 33, 4,
+ 1, 242, 237, 2, 230, 224, 103, 33, 6, 1, 210, 75, 2, 248, 39, 33, 4, 1,
+ 210, 75, 2, 248, 39, 33, 6, 1, 210, 95, 2, 248, 39, 33, 4, 1, 210, 95, 2,
+ 248, 39, 33, 6, 1, 235, 13, 2, 248, 39, 33, 4, 1, 235, 13, 2, 248, 39,
+ 33, 6, 1, 235, 13, 2, 67, 91, 33, 4, 1, 235, 13, 2, 67, 91, 33, 6, 1,
+ 235, 13, 2, 91, 33, 4, 1, 235, 13, 2, 91, 33, 6, 1, 252, 124, 176, 33, 4,
+ 1, 252, 124, 176, 33, 6, 1, 245, 151, 2, 248, 39, 33, 4, 1, 245, 151, 2,
+ 248, 39, 33, 6, 27, 245, 151, 242, 236, 33, 4, 27, 245, 151, 242, 236,
+ 33, 6, 1, 225, 222, 2, 230, 224, 103, 33, 4, 1, 225, 222, 2, 230, 224,
+ 103, 33, 6, 1, 255, 20, 162, 33, 4, 1, 255, 20, 162, 33, 6, 1, 245, 83,
+ 2, 248, 39, 33, 4, 1, 245, 83, 2, 248, 39, 33, 6, 1, 217, 23, 2, 248, 39,
+ 33, 4, 1, 217, 23, 2, 248, 39, 33, 6, 1, 218, 121, 70, 33, 4, 1, 218,
+ 121, 70, 33, 6, 1, 218, 121, 104, 2, 91, 33, 4, 1, 218, 121, 104, 2, 91,
+ 33, 6, 1, 242, 49, 2, 248, 39, 33, 4, 1, 242, 49, 2, 248, 39, 33, 6, 27,
+ 217, 23, 215, 178, 33, 4, 27, 217, 23, 215, 178, 33, 6, 1, 250, 132, 2,
+ 248, 39, 33, 4, 1, 250, 132, 2, 248, 39, 33, 6, 1, 250, 132, 2, 67, 91,
+ 33, 4, 1, 250, 132, 2, 67, 91, 33, 6, 1, 220, 33, 33, 4, 1, 220, 33, 33,
+ 6, 1, 255, 20, 250, 131, 33, 4, 1, 255, 20, 250, 131, 33, 6, 1, 255, 20,
+ 250, 132, 2, 248, 39, 33, 4, 1, 255, 20, 250, 132, 2, 248, 39, 33, 1,
+ 226, 58, 33, 6, 1, 210, 75, 2, 251, 146, 33, 4, 1, 210, 75, 2, 251, 146,
+ 33, 6, 1, 235, 13, 2, 103, 33, 4, 1, 235, 13, 2, 103, 33, 6, 1, 245, 175,
+ 2, 217, 77, 33, 4, 1, 245, 175, 2, 217, 77, 33, 6, 1, 245, 151, 2, 103,
+ 33, 4, 1, 245, 151, 2, 103, 33, 6, 1, 245, 151, 2, 217, 77, 33, 4, 1,
+ 245, 151, 2, 217, 77, 33, 6, 1, 234, 127, 250, 131, 33, 4, 1, 234, 127,
+ 250, 131, 33, 6, 1, 245, 160, 2, 217, 77, 33, 4, 1, 245, 160, 2, 217, 77,
+ 33, 4, 1, 226, 58, 33, 6, 1, 115, 2, 251, 146, 33, 4, 1, 115, 2, 251,
+ 146, 33, 6, 1, 115, 2, 248, 1, 33, 4, 1, 115, 2, 248, 1, 33, 6, 27, 115,
+ 236, 60, 33, 4, 27, 115, 236, 60, 33, 6, 1, 236, 61, 2, 251, 146, 33, 4,
+ 1, 236, 61, 2, 251, 146, 33, 6, 1, 221, 195, 33, 4, 1, 221, 195, 33, 6,
+ 1, 221, 196, 2, 248, 1, 33, 4, 1, 221, 196, 2, 248, 1, 33, 6, 1, 210, 75,
+ 2, 248, 1, 33, 4, 1, 210, 75, 2, 248, 1, 33, 6, 1, 210, 95, 2, 248, 1,
+ 33, 4, 1, 210, 95, 2, 248, 1, 33, 6, 1, 255, 20, 246, 36, 33, 4, 1, 255,
+ 20, 246, 36, 33, 6, 1, 240, 154, 2, 231, 232, 33, 4, 1, 240, 154, 2, 231,
+ 232, 33, 6, 1, 240, 154, 2, 248, 1, 33, 4, 1, 240, 154, 2, 248, 1, 33, 6,
+ 1, 144, 2, 248, 1, 33, 4, 1, 144, 2, 248, 1, 33, 6, 1, 252, 134, 76, 33,
+ 4, 1, 252, 134, 76, 33, 6, 1, 252, 134, 144, 2, 248, 1, 33, 4, 1, 252,
+ 134, 144, 2, 248, 1, 33, 6, 1, 160, 2, 248, 1, 33, 4, 1, 160, 2, 248, 1,
+ 33, 6, 1, 104, 2, 231, 232, 33, 4, 1, 104, 2, 231, 232, 33, 6, 1, 104, 2,
+ 248, 1, 33, 4, 1, 104, 2, 248, 1, 33, 6, 1, 104, 2, 52, 142, 33, 4, 1,
+ 104, 2, 52, 142, 33, 6, 1, 250, 132, 2, 248, 1, 33, 4, 1, 250, 132, 2,
+ 248, 1, 33, 6, 1, 242, 237, 2, 248, 39, 33, 4, 1, 242, 237, 2, 248, 39,
+ 33, 6, 1, 211, 28, 2, 248, 1, 33, 4, 1, 211, 28, 2, 248, 1, 33, 6, 1,
+ 242, 237, 2, 218, 103, 22, 103, 33, 4, 1, 242, 237, 2, 218, 103, 22, 103,
+ 33, 6, 1, 242, 49, 2, 103, 33, 4, 1, 242, 49, 2, 103, 33, 6, 1, 242, 49,
+ 2, 91, 33, 4, 1, 242, 49, 2, 91, 33, 6, 1, 234, 14, 248, 90, 33, 4, 1,
+ 234, 14, 248, 90, 33, 6, 1, 234, 14, 247, 162, 33, 4, 1, 234, 14, 247,
+ 162, 33, 6, 1, 234, 14, 210, 27, 33, 4, 1, 234, 14, 210, 27, 33, 6, 1,
+ 234, 14, 246, 30, 33, 4, 1, 234, 14, 246, 30, 33, 6, 1, 234, 14, 232,
+ 187, 33, 4, 1, 234, 14, 232, 187, 33, 6, 1, 234, 14, 228, 178, 33, 4, 1,
+ 234, 14, 228, 178, 33, 6, 1, 234, 14, 219, 109, 33, 4, 1, 234, 14, 219,
+ 109, 33, 6, 1, 234, 14, 216, 60, 33, 4, 1, 234, 14, 216, 60, 33, 6, 1,
+ 223, 49, 210, 94, 33, 4, 1, 223, 49, 210, 94, 33, 6, 1, 245, 175, 2, 103,
+ 33, 4, 1, 245, 175, 2, 103, 33, 6, 1, 232, 254, 33, 4, 1, 232, 254, 33,
+ 6, 1, 223, 39, 33, 4, 1, 223, 39, 33, 6, 1, 211, 92, 33, 4, 1, 211, 92,
+ 33, 6, 1, 224, 88, 33, 4, 1, 224, 88, 33, 6, 1, 212, 22, 33, 4, 1, 212,
+ 22, 33, 6, 1, 254, 166, 176, 33, 4, 1, 254, 166, 176, 33, 6, 1, 245, 175,
+ 2, 230, 224, 103, 33, 4, 1, 245, 175, 2, 230, 224, 103, 33, 6, 1, 245,
+ 151, 2, 230, 224, 103, 33, 4, 1, 245, 151, 2, 230, 224, 103, 33, 6, 1,
+ 225, 222, 2, 248, 39, 33, 4, 1, 225, 222, 2, 248, 39, 33, 6, 1, 220, 34,
+ 2, 248, 39, 33, 4, 1, 220, 34, 2, 248, 39, 150, 6, 1, 253, 164, 150, 6,
+ 1, 252, 39, 150, 6, 1, 242, 203, 150, 6, 1, 248, 221, 150, 6, 1, 245,
+ 213, 150, 6, 1, 210, 116, 150, 6, 1, 245, 197, 150, 6, 1, 245, 65, 150,
+ 6, 1, 111, 150, 6, 1, 210, 74, 150, 6, 1, 235, 227, 150, 6, 1, 232, 190,
+ 150, 6, 1, 211, 160, 150, 6, 1, 251, 33, 150, 6, 1, 234, 165, 150, 6, 1,
+ 241, 68, 150, 6, 1, 235, 141, 150, 6, 1, 242, 246, 150, 6, 1, 250, 126,
+ 150, 6, 1, 231, 58, 150, 6, 1, 211, 8, 150, 6, 1, 228, 39, 150, 6, 1,
+ 220, 102, 150, 6, 1, 213, 138, 150, 6, 1, 250, 157, 150, 6, 1, 225, 205,
+ 150, 6, 1, 235, 110, 150, 6, 1, 205, 150, 6, 1, 221, 161, 150, 6, 1, 213,
+ 179, 150, 6, 1, 216, 62, 150, 6, 1, 223, 95, 150, 6, 1, 249, 238, 150, 6,
+ 1, 210, 249, 150, 6, 1, 225, 46, 150, 6, 1, 234, 176, 150, 6, 1, 226,
+ 222, 150, 6, 1, 244, 142, 150, 58, 1, 43, 163, 222, 233, 150, 254, 57,
+ 150, 245, 154, 78, 150, 245, 31, 78, 150, 249, 219, 150, 224, 13, 78,
+ 150, 255, 21, 78, 150, 4, 1, 253, 164, 150, 4, 1, 252, 39, 150, 4, 1,
+ 242, 203, 150, 4, 1, 248, 221, 150, 4, 1, 245, 213, 150, 4, 1, 210, 116,
+ 150, 4, 1, 245, 197, 150, 4, 1, 245, 65, 150, 4, 1, 111, 150, 4, 1, 210,
+ 74, 150, 4, 1, 235, 227, 150, 4, 1, 232, 190, 150, 4, 1, 211, 160, 150,
+ 4, 1, 251, 33, 150, 4, 1, 234, 165, 150, 4, 1, 241, 68, 150, 4, 1, 235,
+ 141, 150, 4, 1, 242, 246, 150, 4, 1, 250, 126, 150, 4, 1, 231, 58, 150,
+ 4, 1, 211, 8, 150, 4, 1, 228, 39, 150, 4, 1, 220, 102, 150, 4, 1, 213,
+ 138, 150, 4, 1, 250, 157, 150, 4, 1, 225, 205, 150, 4, 1, 235, 110, 150,
+ 4, 1, 205, 150, 4, 1, 221, 161, 150, 4, 1, 213, 179, 150, 4, 1, 216, 62,
+ 150, 4, 1, 223, 95, 150, 4, 1, 249, 238, 150, 4, 1, 210, 249, 150, 4, 1,
+ 225, 46, 150, 4, 1, 234, 176, 150, 4, 1, 226, 222, 150, 4, 1, 244, 142,
+ 150, 4, 27, 245, 214, 210, 249, 150, 243, 229, 218, 129, 150, 240, 168,
+ 150, 246, 95, 50, 94, 255, 15, 245, 57, 94, 255, 15, 221, 162, 94, 255,
+ 15, 220, 88, 94, 255, 15, 210, 104, 224, 71, 94, 255, 15, 210, 104, 243,
+ 125, 94, 255, 15, 216, 75, 94, 255, 15, 223, 47, 94, 255, 15, 210, 103,
+ 94, 255, 15, 225, 245, 94, 255, 15, 211, 20, 94, 255, 15, 216, 214, 94,
+ 255, 15, 243, 41, 94, 255, 15, 243, 42, 230, 69, 94, 255, 15, 243, 39,
+ 94, 255, 15, 224, 72, 226, 16, 94, 255, 15, 216, 253, 243, 56, 94, 255,
+ 15, 225, 226, 94, 255, 15, 253, 200, 242, 41, 94, 255, 15, 230, 79, 94,
+ 255, 15, 231, 208, 94, 255, 15, 231, 49, 94, 255, 15, 231, 50, 234, 177,
+ 94, 255, 15, 248, 163, 94, 255, 15, 224, 83, 94, 255, 15, 216, 253, 224,
+ 67, 94, 255, 15, 211, 30, 252, 40, 210, 230, 94, 255, 15, 226, 207, 94,
+ 255, 15, 236, 19, 94, 255, 15, 248, 70, 94, 255, 15, 210, 33, 94, 164,
+ 231, 143, 250, 35, 94, 225, 11, 220, 36, 94, 225, 11, 241, 250, 221, 162,
+ 94, 225, 11, 241, 250, 225, 239, 94, 225, 11, 241, 250, 224, 76, 94, 225,
+ 11, 241, 158, 94, 225, 11, 215, 176, 94, 225, 11, 221, 162, 94, 225, 11,
+ 225, 239, 94, 225, 11, 224, 76, 94, 225, 11, 241, 61, 94, 225, 11, 241,
+ 62, 241, 252, 31, 214, 3, 94, 225, 11, 224, 17, 94, 225, 11, 248, 208,
+ 177, 231, 171, 94, 225, 11, 231, 38, 94, 224, 141, 231, 168, 94, 225, 11,
+ 223, 169, 94, 224, 141, 225, 247, 94, 225, 11, 220, 21, 247, 120, 94,
+ 225, 11, 219, 159, 247, 120, 94, 224, 141, 219, 53, 225, 241, 94, 164,
+ 214, 160, 247, 120, 94, 164, 232, 108, 247, 120, 94, 224, 141, 227, 195,
+ 242, 40, 94, 225, 11, 224, 77, 224, 71, 94, 1, 254, 170, 94, 1, 252, 28,
+ 94, 1, 242, 201, 94, 1, 248, 189, 94, 1, 241, 238, 94, 1, 214, 3, 94, 1,
+ 210, 97, 94, 1, 241, 197, 94, 1, 216, 230, 94, 1, 210, 233, 94, 1, 40,
+ 234, 250, 94, 1, 234, 250, 94, 1, 233, 94, 94, 1, 40, 231, 65, 94, 1,
+ 231, 65, 94, 1, 40, 227, 194, 94, 1, 227, 194, 94, 1, 221, 249, 94, 1,
+ 253, 162, 94, 1, 40, 225, 221, 94, 1, 225, 221, 94, 1, 40, 215, 179, 94,
+ 1, 215, 179, 94, 1, 224, 39, 94, 1, 223, 67, 94, 1, 220, 20, 94, 1, 217,
+ 38, 94, 27, 211, 6, 52, 214, 3, 94, 27, 211, 6, 214, 4, 210, 233, 94, 27,
+ 211, 6, 52, 210, 233, 94, 224, 141, 243, 41, 94, 224, 141, 243, 39, 10,
+ 54, 50, 10, 5, 221, 242, 10, 244, 30, 231, 154, 10, 5, 222, 23, 10, 5,
+ 221, 245, 254, 37, 249, 109, 222, 193, 254, 37, 244, 4, 222, 193, 10,
+ 223, 134, 254, 37, 225, 183, 230, 193, 50, 254, 37, 225, 183, 216, 248,
+ 216, 148, 50, 254, 221, 50, 10, 249, 219, 10, 248, 150, 220, 137, 10,
+ 225, 13, 213, 241, 50, 10, 5, 230, 174, 10, 5, 222, 3, 254, 172, 212, 45,
+ 10, 5, 254, 172, 253, 221, 10, 5, 223, 167, 254, 171, 10, 5, 223, 175,
+ 254, 152, 254, 104, 10, 5, 217, 70, 10, 4, 125, 217, 80, 10, 4, 125, 27,
+ 112, 2, 233, 103, 2, 211, 43, 10, 4, 125, 210, 108, 10, 4, 244, 165, 10,
+ 4, 248, 184, 10, 4, 234, 205, 10, 220, 150, 10, 215, 211, 59, 224, 141,
+ 78, 10, 224, 13, 78, 10, 1, 234, 209, 211, 43, 10, 1, 242, 19, 10, 1,
+ 112, 2, 231, 228, 48, 10, 1, 112, 2, 202, 48, 10, 1, 212, 31, 2, 202, 48,
+ 10, 1, 112, 2, 202, 51, 10, 1, 79, 2, 202, 48, 10, 1, 254, 170, 10, 1,
+ 252, 54, 10, 1, 217, 8, 231, 164, 10, 1, 217, 7, 10, 1, 216, 192, 10, 1,
+ 235, 123, 10, 1, 242, 37, 10, 1, 234, 129, 10, 1, 248, 195, 10, 1, 216,
+ 202, 10, 1, 223, 95, 10, 1, 210, 108, 10, 1, 221, 166, 10, 1, 220, 59,
+ 10, 1, 222, 26, 10, 1, 248, 216, 10, 1, 217, 80, 10, 1, 210, 111, 10, 1,
+ 254, 196, 10, 1, 242, 244, 10, 1, 234, 175, 2, 113, 170, 48, 10, 1, 234,
+ 175, 2, 134, 170, 51, 10, 1, 244, 168, 79, 2, 235, 193, 214, 105, 10, 1,
+ 244, 168, 79, 2, 113, 170, 48, 10, 1, 244, 168, 79, 2, 134, 170, 48, 10,
+ 217, 43, 10, 1, 244, 142, 10, 1, 224, 81, 10, 1, 234, 250, 10, 1, 233,
+ 102, 10, 1, 231, 78, 10, 1, 228, 62, 10, 1, 241, 218, 10, 1, 212, 30, 10,
+ 1, 112, 231, 192, 10, 1, 211, 43, 10, 244, 163, 10, 248, 182, 10, 234,
+ 203, 10, 244, 165, 10, 248, 184, 10, 234, 205, 10, 220, 93, 10, 218, 45,
+ 10, 231, 226, 48, 10, 202, 48, 10, 202, 51, 10, 218, 65, 254, 170, 10,
+ 235, 193, 248, 184, 10, 164, 228, 63, 242, 218, 10, 209, 255, 10, 25, 5,
+ 4, 214, 106, 48, 10, 25, 5, 235, 193, 4, 214, 106, 48, 10, 25, 5, 59, 51,
+ 10, 223, 49, 248, 184, 10, 244, 166, 2, 113, 247, 118, 10, 212, 32, 202,
+ 51, 254, 37, 21, 210, 86, 254, 37, 21, 110, 254, 37, 21, 105, 254, 37,
+ 21, 158, 254, 37, 21, 161, 254, 37, 21, 189, 254, 37, 21, 194, 254, 37,
+ 21, 198, 254, 37, 21, 195, 254, 37, 21, 200, 10, 225, 182, 50, 10, 248,
+ 83, 220, 137, 10, 216, 146, 220, 137, 10, 244, 81, 225, 9, 218, 156, 10,
+ 1, 247, 119, 252, 54, 10, 1, 247, 119, 224, 81, 10, 1, 218, 23, 254, 170,
+ 10, 1, 112, 212, 46, 10, 1, 112, 2, 212, 32, 202, 48, 10, 1, 112, 2, 212,
+ 32, 202, 51, 10, 1, 125, 242, 19, 10, 1, 125, 202, 254, 170, 10, 1, 125,
+ 202, 212, 30, 10, 1, 104, 2, 202, 48, 10, 1, 125, 202, 211, 43, 10, 1,
+ 215, 148, 10, 1, 215, 146, 10, 1, 252, 64, 10, 1, 217, 8, 2, 222, 233,
+ 10, 1, 217, 8, 2, 134, 170, 77, 246, 103, 10, 1, 225, 205, 10, 1, 217, 5,
+ 10, 1, 252, 52, 10, 1, 122, 2, 202, 48, 10, 1, 122, 2, 113, 170, 67, 48,
+ 10, 1, 227, 153, 10, 1, 246, 43, 10, 1, 122, 2, 134, 170, 48, 10, 1, 217,
+ 26, 10, 1, 217, 24, 10, 1, 248, 130, 10, 1, 248, 196, 2, 222, 233, 10, 1,
+ 248, 196, 2, 59, 51, 10, 1, 248, 196, 2, 59, 252, 43, 22, 4, 217, 80, 10,
+ 1, 248, 201, 10, 1, 248, 132, 10, 1, 246, 70, 10, 1, 248, 196, 2, 134,
+ 170, 77, 246, 103, 10, 1, 248, 196, 2, 244, 11, 170, 48, 10, 1, 222, 171,
+ 10, 1, 223, 96, 2, 4, 214, 105, 10, 1, 223, 96, 2, 222, 233, 10, 1, 223,
+ 96, 2, 59, 51, 10, 1, 223, 96, 2, 4, 214, 106, 51, 10, 1, 223, 96, 2, 59,
+ 252, 43, 22, 59, 48, 10, 1, 223, 96, 2, 113, 170, 48, 10, 1, 235, 120,
+ 10, 1, 223, 96, 2, 244, 11, 170, 48, 10, 1, 221, 167, 2, 59, 252, 43, 22,
+ 59, 48, 10, 1, 221, 167, 2, 134, 170, 51, 10, 1, 221, 167, 2, 134, 170,
+ 252, 43, 22, 134, 170, 48, 10, 1, 222, 27, 2, 113, 170, 51, 10, 1, 222,
+ 27, 2, 134, 170, 48, 10, 1, 217, 81, 2, 134, 170, 48, 10, 1, 254, 197, 2,
+ 134, 170, 48, 10, 1, 247, 119, 244, 142, 10, 1, 244, 143, 2, 59, 230,
+ 109, 51, 10, 1, 244, 143, 2, 59, 51, 10, 1, 213, 248, 10, 1, 244, 143, 2,
+ 134, 170, 51, 10, 1, 225, 203, 10, 1, 224, 82, 2, 59, 48, 10, 1, 224, 82,
+ 2, 134, 170, 48, 10, 1, 234, 174, 10, 1, 217, 250, 234, 250, 10, 1, 234,
+ 251, 2, 222, 233, 10, 1, 234, 251, 2, 59, 48, 10, 1, 229, 79, 10, 1, 234,
+ 251, 2, 134, 170, 51, 10, 1, 243, 122, 10, 1, 243, 123, 2, 222, 233, 10,
+ 1, 229, 2, 10, 1, 243, 123, 2, 113, 170, 51, 10, 1, 242, 101, 10, 1, 243,
+ 123, 2, 134, 170, 48, 10, 1, 233, 103, 2, 4, 214, 105, 10, 1, 233, 103,
+ 2, 59, 48, 10, 1, 233, 103, 2, 134, 170, 48, 10, 1, 233, 103, 2, 134,
+ 170, 51, 10, 1, 228, 63, 2, 59, 51, 10, 1, 228, 63, 242, 218, 10, 1, 222,
+ 214, 10, 1, 228, 63, 2, 222, 233, 10, 1, 228, 63, 2, 134, 170, 48, 10, 1,
+ 241, 219, 247, 141, 10, 1, 217, 27, 2, 59, 48, 10, 1, 241, 219, 2, 79,
+ 48, 10, 1, 241, 219, 242, 171, 10, 1, 241, 219, 242, 172, 2, 202, 48, 10,
+ 1, 217, 8, 231, 165, 242, 171, 10, 1, 212, 31, 2, 222, 233, 10, 1, 234,
+ 73, 226, 234, 10, 1, 226, 234, 10, 1, 70, 10, 1, 210, 212, 10, 1, 234,
+ 73, 210, 212, 10, 1, 212, 31, 2, 113, 170, 48, 10, 1, 213, 255, 10, 1,
+ 244, 168, 211, 43, 10, 1, 79, 2, 217, 77, 10, 1, 79, 2, 4, 214, 105, 10,
+ 1, 212, 31, 2, 59, 48, 10, 1, 75, 10, 1, 79, 2, 134, 170, 51, 10, 1, 79,
+ 252, 132, 10, 1, 79, 252, 133, 2, 202, 48, 10, 243, 229, 218, 129, 10, 1,
+ 254, 243, 10, 4, 125, 27, 222, 27, 2, 233, 103, 2, 112, 231, 192, 10, 4,
+ 125, 27, 224, 82, 2, 233, 103, 2, 112, 231, 192, 10, 4, 125, 66, 65, 17,
+ 10, 4, 125, 233, 103, 254, 170, 10, 4, 125, 235, 123, 10, 4, 125, 134,
+ 247, 118, 10, 4, 125, 221, 166, 10, 245, 143, 64, 253, 166, 10, 218, 152,
+ 64, 222, 138, 245, 175, 241, 155, 10, 4, 125, 222, 183, 210, 86, 10, 4,
+ 125, 214, 159, 223, 115, 210, 86, 10, 4, 125, 247, 119, 241, 236, 64,
+ 234, 129, 10, 4, 125, 66, 53, 17, 10, 4, 121, 221, 166, 10, 4, 125, 231,
+ 227, 10, 4, 212, 30, 10, 4, 211, 43, 10, 4, 125, 211, 43, 10, 4, 125,
+ 228, 62, 10, 225, 41, 64, 222, 13, 10, 245, 152, 250, 175, 121, 218, 129,
+ 10, 245, 152, 250, 175, 125, 218, 129, 10, 222, 183, 125, 218, 130, 2,
+ 244, 104, 250, 174, 10, 4, 121, 231, 78, 10, 1, 248, 196, 2, 235, 193,
+ 214, 105, 10, 1, 223, 96, 2, 235, 193, 214, 105, 245, 22, 254, 37, 21,
+ 210, 86, 245, 22, 254, 37, 21, 110, 245, 22, 254, 37, 21, 105, 245, 22,
+ 254, 37, 21, 158, 245, 22, 254, 37, 21, 161, 245, 22, 254, 37, 21, 189,
+ 245, 22, 254, 37, 21, 194, 245, 22, 254, 37, 21, 198, 245, 22, 254, 37,
+ 21, 195, 245, 22, 254, 37, 21, 200, 10, 1, 220, 60, 2, 59, 51, 10, 1,
+ 248, 217, 2, 59, 51, 10, 1, 242, 245, 2, 59, 51, 10, 5, 219, 158, 254,
+ 126, 10, 5, 219, 158, 224, 235, 231, 58, 10, 1, 241, 219, 2, 235, 193,
+ 214, 105, 188, 245, 143, 64, 226, 14, 188, 218, 19, 243, 229, 218, 129,
+ 188, 218, 67, 243, 229, 218, 129, 188, 218, 19, 249, 226, 188, 218, 67,
+ 249, 226, 188, 203, 249, 226, 188, 249, 227, 219, 106, 233, 46, 188, 249,
+ 227, 219, 106, 222, 251, 188, 218, 19, 249, 227, 219, 106, 233, 46, 188,
+ 218, 67, 249, 227, 219, 106, 222, 251, 188, 249, 180, 188, 242, 1, 226,
+ 250, 188, 242, 1, 231, 36, 188, 242, 1, 253, 218, 188, 255, 21, 78, 188,
+ 1, 254, 174, 188, 1, 218, 23, 254, 174, 188, 1, 252, 25, 188, 1, 243,
+ 113, 188, 1, 243, 114, 243, 91, 188, 1, 248, 192, 188, 1, 247, 119, 248,
+ 193, 222, 229, 188, 1, 241, 238, 188, 1, 212, 30, 188, 1, 210, 108, 188,
+ 1, 241, 195, 188, 1, 216, 226, 188, 1, 216, 227, 243, 91, 188, 1, 210,
+ 199, 188, 1, 210, 200, 241, 238, 188, 1, 234, 225, 188, 1, 233, 101, 188,
+ 1, 230, 190, 188, 1, 227, 194, 188, 1, 220, 143, 188, 1, 40, 220, 143,
+ 188, 1, 75, 188, 1, 225, 221, 188, 1, 223, 49, 225, 221, 188, 1, 222, 24,
+ 188, 1, 224, 75, 188, 1, 222, 229, 188, 1, 220, 20, 188, 1, 217, 36, 188,
+ 1, 225, 169, 252, 12, 188, 1, 225, 169, 242, 242, 188, 1, 225, 169, 248,
+ 20, 188, 224, 151, 48, 188, 224, 151, 51, 188, 224, 151, 246, 117, 188,
+ 210, 17, 48, 188, 210, 17, 51, 188, 210, 17, 246, 117, 188, 223, 131, 48,
+ 188, 223, 131, 51, 188, 246, 118, 210, 24, 241, 44, 188, 246, 118, 210,
+ 24, 254, 105, 188, 241, 241, 48, 188, 241, 241, 51, 188, 241, 240, 246,
+ 117, 188, 245, 79, 48, 188, 245, 79, 51, 188, 222, 107, 188, 244, 136,
+ 247, 120, 188, 223, 248, 188, 222, 134, 188, 113, 67, 170, 48, 188, 113,
+ 67, 170, 51, 188, 134, 170, 48, 188, 134, 170, 51, 188, 226, 248, 232,
+ 214, 48, 188, 226, 248, 232, 214, 51, 188, 230, 56, 188, 252, 131, 188,
+ 1, 219, 49, 210, 80, 188, 1, 219, 49, 234, 122, 188, 1, 219, 49, 244,
+ 154, 10, 1, 252, 55, 2, 134, 170, 240, 250, 51, 10, 1, 252, 55, 2, 59,
+ 252, 43, 22, 134, 170, 48, 10, 1, 252, 55, 2, 134, 170, 225, 7, 214, 153,
+ 51, 10, 1, 252, 55, 2, 134, 170, 225, 7, 214, 153, 252, 43, 22, 113, 170,
+ 48, 10, 1, 252, 55, 2, 113, 170, 252, 43, 22, 59, 48, 10, 1, 252, 55, 2,
+ 235, 193, 4, 214, 106, 51, 10, 1, 252, 55, 2, 4, 214, 105, 10, 1, 122, 2,
+ 113, 170, 48, 10, 1, 122, 2, 134, 170, 225, 7, 214, 153, 51, 10, 1, 248,
+ 196, 2, 113, 170, 213, 189, 252, 43, 22, 4, 217, 80, 10, 1, 248, 196, 2,
+ 235, 193, 4, 214, 106, 51, 10, 1, 223, 96, 2, 91, 10, 1, 221, 167, 2,
+ 244, 11, 170, 48, 10, 1, 254, 197, 2, 113, 170, 48, 10, 1, 254, 197, 2,
+ 134, 170, 225, 7, 246, 104, 48, 10, 1, 254, 197, 2, 113, 170, 213, 189,
+ 48, 10, 1, 244, 143, 2, 113, 170, 51, 10, 1, 244, 143, 2, 134, 170, 225,
+ 7, 214, 153, 51, 10, 1, 234, 175, 2, 59, 48, 10, 1, 234, 175, 2, 134,
+ 170, 48, 10, 1, 234, 175, 2, 134, 170, 225, 7, 214, 153, 51, 10, 1, 66,
+ 2, 59, 48, 10, 1, 66, 2, 59, 51, 10, 1, 228, 63, 2, 113, 170, 51, 10, 1,
+ 228, 63, 2, 4, 217, 80, 10, 1, 228, 63, 2, 4, 214, 105, 10, 1, 233, 103,
+ 2, 130, 10, 1, 223, 96, 2, 113, 170, 213, 189, 48, 10, 1, 223, 96, 2,
+ 202, 48, 10, 1, 221, 167, 2, 113, 170, 213, 189, 48, 10, 1, 122, 2, 4,
+ 10, 1, 217, 81, 51, 10, 1, 122, 2, 4, 10, 1, 217, 81, 22, 113, 247, 118,
+ 10, 1, 221, 167, 2, 4, 10, 1, 217, 81, 22, 113, 247, 118, 10, 1, 223, 96,
+ 2, 4, 10, 1, 217, 81, 22, 113, 247, 118, 10, 1, 122, 2, 4, 10, 1, 217,
+ 81, 48, 10, 1, 112, 2, 245, 22, 254, 37, 21, 113, 48, 10, 1, 112, 2, 245,
+ 22, 254, 37, 21, 134, 48, 10, 1, 244, 168, 79, 2, 245, 22, 254, 37, 21,
+ 113, 48, 10, 1, 244, 168, 79, 2, 245, 22, 254, 37, 21, 134, 48, 10, 1,
+ 244, 168, 79, 2, 245, 22, 254, 37, 21, 244, 11, 51, 10, 1, 212, 31, 2,
+ 245, 22, 254, 37, 21, 113, 48, 10, 1, 212, 31, 2, 245, 22, 254, 37, 21,
+ 134, 48, 10, 1, 79, 252, 133, 2, 245, 22, 254, 37, 21, 113, 48, 10, 1,
+ 79, 252, 133, 2, 245, 22, 254, 37, 21, 134, 48, 10, 1, 122, 2, 245, 22,
+ 254, 37, 21, 244, 11, 51, 10, 1, 221, 167, 2, 245, 22, 254, 37, 21, 244,
+ 11, 48, 10, 1, 221, 167, 2, 235, 193, 214, 105, 10, 1, 234, 251, 2, 113,
+ 170, 48, 216, 205, 1, 242, 46, 216, 205, 1, 220, 68, 216, 205, 1, 228,
+ 61, 216, 205, 1, 223, 184, 216, 205, 1, 252, 189, 216, 205, 1, 232, 251,
+ 216, 205, 1, 235, 8, 216, 205, 1, 254, 159, 216, 205, 1, 214, 25, 216,
+ 205, 1, 231, 77, 216, 205, 1, 244, 194, 216, 205, 1, 248, 23, 216, 205,
+ 1, 216, 207, 216, 205, 1, 233, 131, 216, 205, 1, 243, 131, 216, 205, 1,
+ 242, 177, 216, 205, 1, 221, 165, 216, 205, 1, 248, 148, 216, 205, 1, 210,
+ 100, 216, 205, 1, 217, 37, 216, 205, 1, 211, 103, 216, 205, 1, 225, 233,
+ 216, 205, 1, 235, 128, 216, 205, 1, 250, 134, 216, 205, 1, 215, 155, 216,
+ 205, 1, 241, 188, 216, 205, 1, 234, 131, 216, 205, 1, 216, 206, 216, 205,
+ 1, 210, 115, 216, 205, 1, 220, 58, 216, 205, 1, 222, 30, 216, 205, 1,
+ 248, 219, 216, 205, 1, 111, 216, 205, 1, 210, 23, 216, 205, 1, 254, 193,
+ 216, 205, 1, 242, 243, 216, 205, 1, 224, 85, 216, 205, 1, 212, 63, 216,
+ 205, 255, 22, 216, 205, 255, 38, 216, 205, 240, 114, 216, 205, 245, 208,
+ 216, 205, 214, 222, 216, 205, 226, 182, 216, 205, 245, 216, 216, 205,
+ 245, 16, 216, 205, 226, 247, 216, 205, 226, 255, 216, 205, 218, 45, 216,
+ 205, 1, 229, 225, 228, 137, 21, 210, 86, 228, 137, 21, 110, 228, 137, 21,
+ 105, 228, 137, 21, 158, 228, 137, 21, 161, 228, 137, 21, 189, 228, 137,
+ 21, 194, 228, 137, 21, 198, 228, 137, 21, 195, 228, 137, 21, 200, 228,
+ 137, 1, 61, 228, 137, 1, 245, 209, 228, 137, 1, 73, 228, 137, 1, 75, 228,
+ 137, 1, 70, 228, 137, 1, 226, 183, 228, 137, 1, 76, 228, 137, 1, 248,
+ 209, 228, 137, 1, 230, 25, 228, 137, 1, 252, 191, 228, 137, 1, 190, 228,
+ 137, 1, 217, 105, 228, 137, 1, 235, 141, 228, 137, 1, 250, 157, 228, 137,
+ 1, 248, 221, 228, 137, 1, 205, 228, 137, 1, 222, 179, 228, 137, 1, 206,
+ 228, 137, 1, 243, 79, 228, 137, 1, 244, 196, 228, 137, 1, 176, 228, 137,
+ 1, 233, 135, 228, 137, 1, 229, 229, 211, 223, 228, 137, 1, 184, 228, 137,
+ 1, 227, 165, 228, 137, 1, 197, 228, 137, 1, 162, 228, 137, 1, 212, 65,
+ 228, 137, 1, 191, 228, 137, 1, 227, 166, 211, 223, 228, 137, 1, 235, 61,
+ 235, 141, 228, 137, 1, 235, 61, 250, 157, 228, 137, 1, 235, 61, 205, 228,
+ 137, 38, 219, 251, 125, 216, 30, 228, 137, 38, 219, 251, 121, 216, 30,
+ 228, 137, 38, 219, 251, 222, 228, 216, 30, 228, 137, 38, 199, 248, 38,
+ 216, 30, 228, 137, 38, 199, 125, 216, 30, 228, 137, 38, 199, 121, 216,
+ 30, 228, 137, 38, 199, 222, 228, 216, 30, 228, 137, 38, 229, 193, 78,
+ 228, 137, 38, 52, 59, 48, 228, 137, 125, 138, 254, 57, 228, 137, 121,
+ 138, 254, 57, 228, 137, 16, 226, 184, 248, 50, 228, 137, 16, 243, 78,
+ 228, 137, 249, 219, 228, 137, 245, 31, 78, 228, 137, 233, 108, 221, 252,
+ 1, 254, 176, 221, 252, 1, 251, 228, 221, 252, 1, 243, 112, 221, 252, 1,
+ 248, 194, 221, 252, 1, 235, 152, 221, 252, 1, 252, 189, 221, 252, 1, 210,
+ 89, 221, 252, 1, 235, 160, 221, 252, 1, 216, 67, 221, 252, 1, 210, 182,
+ 221, 252, 1, 235, 9, 221, 252, 1, 233, 128, 221, 252, 1, 230, 190, 221,
+ 252, 1, 227, 194, 221, 252, 1, 219, 156, 221, 252, 1, 235, 255, 221, 252,
+ 1, 244, 121, 221, 252, 1, 215, 181, 221, 252, 1, 224, 10, 221, 252, 1,
+ 222, 229, 221, 252, 1, 220, 85, 221, 252, 1, 217, 100, 221, 252, 164,
+ 235, 255, 221, 252, 164, 235, 254, 221, 252, 164, 226, 243, 221, 252,
+ 164, 248, 207, 221, 252, 58, 1, 245, 105, 210, 182, 221, 252, 164, 245,
+ 105, 210, 182, 221, 252, 25, 5, 199, 75, 221, 252, 25, 5, 75, 221, 252,
+ 25, 5, 226, 118, 255, 73, 221, 252, 25, 5, 199, 255, 73, 221, 252, 25, 5,
+ 255, 73, 221, 252, 25, 5, 226, 118, 61, 221, 252, 25, 5, 199, 61, 221,
+ 252, 25, 5, 61, 221, 252, 58, 1, 219, 251, 61, 221, 252, 25, 5, 219, 251,
+ 61, 221, 252, 25, 5, 199, 70, 221, 252, 25, 5, 70, 221, 252, 58, 1, 73,
+ 221, 252, 25, 5, 199, 73, 221, 252, 25, 5, 73, 221, 252, 25, 5, 76, 221,
+ 252, 25, 5, 218, 45, 221, 252, 164, 229, 92, 221, 252, 224, 141, 229, 92,
+ 221, 252, 224, 141, 254, 218, 221, 252, 224, 141, 254, 114, 221, 252,
+ 224, 141, 252, 114, 221, 252, 224, 141, 253, 201, 221, 252, 224, 141,
+ 220, 8, 221, 252, 255, 21, 78, 221, 252, 224, 141, 231, 68, 224, 45, 221,
+ 252, 224, 141, 210, 31, 221, 252, 224, 141, 224, 45, 221, 252, 224, 141,
+ 210, 114, 221, 252, 224, 141, 215, 90, 221, 252, 224, 141, 254, 9, 221,
+ 252, 224, 141, 219, 53, 231, 145, 221, 252, 224, 141, 254, 100, 231, 182,
+ 1, 242, 24, 231, 182, 1, 255, 25, 231, 182, 1, 254, 216, 231, 182, 1,
+ 254, 255, 231, 182, 1, 254, 209, 231, 182, 1, 214, 124, 231, 182, 1, 253,
+ 160, 231, 182, 1, 235, 160, 231, 182, 1, 253, 198, 231, 182, 1, 254, 181,
+ 231, 182, 1, 254, 186, 231, 182, 1, 254, 178, 231, 182, 1, 254, 136, 231,
+ 182, 1, 254, 123, 231, 182, 1, 253, 237, 231, 182, 1, 235, 255, 231, 182,
+ 1, 254, 72, 231, 182, 1, 253, 208, 231, 182, 1, 254, 45, 231, 182, 1,
+ 254, 41, 231, 182, 1, 253, 231, 231, 182, 1, 253, 206, 231, 182, 1, 246,
+ 55, 231, 182, 1, 235, 2, 231, 182, 1, 254, 196, 231, 182, 254, 222, 78,
+ 231, 182, 213, 136, 78, 231, 182, 243, 53, 78, 231, 182, 224, 140, 10, 1,
+ 252, 55, 2, 4, 214, 106, 51, 10, 1, 151, 2, 113, 170, 48, 10, 1, 217, 81,
+ 2, 113, 170, 48, 10, 1, 244, 143, 2, 59, 252, 43, 22, 134, 170, 48, 10,
+ 1, 224, 82, 2, 59, 51, 10, 1, 233, 103, 2, 52, 130, 10, 1, 66, 2, 134,
+ 170, 48, 10, 1, 79, 2, 113, 170, 252, 43, 22, 202, 48, 10, 1, 79, 2, 113,
+ 170, 252, 43, 22, 59, 48, 10, 1, 223, 96, 2, 232, 123, 10, 1, 212, 31, 2,
+ 59, 211, 231, 10, 1, 222, 201, 211, 43, 10, 249, 99, 244, 165, 10, 249,
+ 99, 248, 184, 10, 249, 99, 234, 205, 10, 249, 99, 244, 163, 10, 249, 99,
+ 248, 182, 10, 249, 99, 234, 203, 10, 138, 123, 59, 48, 10, 138, 113, 170,
+ 48, 10, 138, 232, 124, 48, 10, 138, 123, 59, 51, 10, 138, 113, 170, 51,
+ 10, 138, 232, 124, 51, 10, 204, 244, 163, 10, 204, 248, 182, 10, 204,
+ 234, 203, 10, 4, 125, 212, 30, 10, 244, 166, 2, 222, 233, 10, 244, 166,
+ 2, 59, 48, 10, 234, 206, 2, 59, 51, 10, 43, 253, 250, 48, 10, 44, 253,
+ 250, 48, 10, 43, 253, 250, 51, 10, 44, 253, 250, 51, 10, 52, 44, 253,
+ 250, 48, 10, 52, 44, 253, 250, 77, 2, 247, 120, 10, 44, 253, 250, 77, 2,
+ 247, 120, 10, 248, 185, 2, 247, 120, 84, 5, 235, 193, 250, 255, 84, 5,
+ 250, 255, 84, 5, 254, 75, 84, 5, 213, 147, 84, 1, 219, 251, 61, 84, 1,
+ 61, 84, 1, 255, 73, 84, 1, 73, 84, 1, 236, 33, 84, 1, 70, 84, 1, 214,
+ 118, 84, 1, 149, 153, 84, 1, 149, 156, 84, 1, 251, 2, 75, 84, 1, 219,
+ 251, 75, 84, 1, 75, 84, 1, 254, 201, 84, 1, 251, 2, 76, 84, 1, 219, 251,
+ 76, 84, 1, 76, 84, 1, 253, 192, 84, 1, 176, 84, 1, 234, 132, 84, 1, 243,
+ 135, 84, 1, 242, 249, 84, 1, 229, 77, 84, 1, 251, 33, 84, 1, 250, 157,
+ 84, 1, 235, 141, 84, 1, 235, 114, 84, 1, 227, 165, 84, 1, 215, 156, 84,
+ 1, 215, 144, 84, 1, 248, 135, 84, 1, 248, 119, 84, 1, 228, 110, 84, 1,
+ 217, 105, 84, 1, 216, 208, 84, 1, 248, 221, 84, 1, 248, 25, 84, 1, 197,
+ 84, 1, 228, 92, 84, 1, 190, 84, 1, 225, 147, 84, 1, 252, 191, 84, 1, 252,
+ 18, 84, 1, 184, 84, 1, 191, 84, 1, 205, 84, 1, 222, 179, 84, 1, 233, 135,
+ 84, 1, 232, 184, 84, 1, 232, 175, 84, 1, 214, 27, 84, 1, 220, 102, 84, 1,
+ 218, 223, 84, 1, 206, 84, 1, 162, 84, 25, 5, 226, 234, 84, 25, 5, 226,
+ 181, 84, 5, 227, 205, 84, 5, 253, 175, 84, 25, 5, 255, 73, 84, 25, 5, 73,
+ 84, 25, 5, 236, 33, 84, 25, 5, 70, 84, 25, 5, 214, 118, 84, 25, 5, 149,
+ 153, 84, 25, 5, 149, 222, 180, 84, 25, 5, 251, 2, 75, 84, 25, 5, 219,
+ 251, 75, 84, 25, 5, 75, 84, 25, 5, 254, 201, 84, 25, 5, 251, 2, 76, 84,
+ 25, 5, 219, 251, 76, 84, 25, 5, 76, 84, 25, 5, 253, 192, 84, 5, 213, 152,
+ 84, 25, 5, 224, 185, 75, 84, 25, 5, 253, 171, 84, 226, 204, 84, 218, 111,
+ 5, 214, 216, 84, 218, 111, 5, 254, 77, 84, 242, 137, 255, 14, 84, 255, 3,
+ 255, 14, 84, 25, 5, 251, 2, 199, 75, 84, 25, 5, 214, 214, 84, 25, 5, 214,
+ 117, 84, 1, 224, 88, 84, 1, 234, 115, 84, 1, 242, 226, 84, 1, 210, 116,
+ 84, 1, 248, 124, 84, 1, 223, 39, 84, 1, 244, 196, 84, 1, 210, 168, 84, 1,
+ 149, 222, 180, 84, 1, 149, 232, 185, 84, 25, 5, 149, 156, 84, 25, 5, 149,
+ 232, 185, 84, 248, 178, 84, 52, 248, 178, 84, 21, 210, 86, 84, 21, 110,
+ 84, 21, 105, 84, 21, 158, 84, 21, 161, 84, 21, 189, 84, 21, 194, 84, 21,
+ 198, 84, 21, 195, 84, 21, 200, 84, 255, 21, 50, 84, 5, 125, 219, 17, 247,
+ 120, 84, 1, 251, 2, 61, 84, 1, 226, 234, 84, 1, 226, 181, 84, 1, 253,
+ 171, 84, 1, 214, 214, 84, 1, 214, 117, 84, 1, 210, 82, 84, 1, 114, 191,
+ 84, 1, 243, 29, 84, 1, 235, 96, 84, 1, 242, 180, 218, 129, 84, 1, 248,
+ 125, 84, 1, 252, 111, 146, 5, 250, 255, 146, 5, 254, 75, 146, 5, 213,
+ 147, 146, 1, 61, 146, 1, 255, 73, 146, 1, 73, 146, 1, 236, 33, 146, 1,
+ 70, 146, 1, 214, 118, 146, 1, 149, 153, 146, 1, 149, 156, 146, 1, 75,
+ 146, 1, 254, 201, 146, 1, 76, 146, 1, 253, 192, 146, 1, 176, 146, 1, 234,
+ 132, 146, 1, 243, 135, 146, 1, 242, 249, 146, 1, 229, 77, 146, 1, 251,
+ 33, 146, 1, 250, 157, 146, 1, 235, 141, 146, 1, 235, 114, 146, 1, 227,
+ 165, 146, 1, 215, 156, 146, 1, 215, 144, 146, 1, 248, 135, 146, 1, 248,
+ 119, 146, 1, 228, 110, 146, 1, 217, 105, 146, 1, 216, 208, 146, 1, 248,
+ 221, 146, 1, 248, 25, 146, 1, 197, 146, 1, 190, 146, 1, 225, 147, 146, 1,
+ 252, 191, 146, 1, 252, 18, 146, 1, 184, 146, 1, 191, 146, 1, 205, 146, 1,
+ 233, 135, 146, 1, 220, 102, 146, 1, 218, 223, 146, 1, 206, 146, 1, 162,
+ 146, 5, 227, 205, 146, 5, 253, 175, 146, 25, 5, 255, 73, 146, 25, 5, 73,
+ 146, 25, 5, 236, 33, 146, 25, 5, 70, 146, 25, 5, 214, 118, 146, 25, 5,
+ 149, 153, 146, 25, 5, 149, 222, 180, 146, 25, 5, 75, 146, 25, 5, 254,
+ 201, 146, 25, 5, 76, 146, 25, 5, 253, 192, 146, 5, 213, 152, 146, 1, 234,
+ 124, 217, 105, 146, 253, 193, 233, 23, 78, 146, 1, 222, 179, 146, 1, 223,
+ 39, 146, 1, 210, 168, 146, 1, 149, 222, 180, 146, 1, 149, 232, 185, 146,
+ 25, 5, 149, 156, 146, 25, 5, 149, 232, 185, 146, 21, 210, 86, 146, 21,
+ 110, 146, 21, 105, 146, 21, 158, 146, 21, 161, 146, 21, 189, 146, 21,
+ 194, 146, 21, 198, 146, 21, 195, 146, 21, 200, 146, 1, 223, 188, 2, 230,
+ 224, 247, 254, 146, 1, 223, 188, 2, 232, 108, 247, 254, 146, 222, 118,
+ 78, 146, 222, 118, 50, 146, 249, 98, 227, 197, 110, 146, 249, 98, 227,
+ 197, 105, 146, 249, 98, 227, 197, 158, 146, 249, 98, 227, 197, 161, 146,
+ 249, 98, 227, 197, 123, 233, 16, 216, 201, 216, 196, 248, 48, 146, 249,
+ 98, 248, 49, 219, 119, 146, 235, 161, 146, 243, 103, 78, 183, 5, 254,
+ 254, 251, 243, 183, 5, 251, 243, 183, 5, 213, 147, 183, 1, 61, 183, 1,
+ 255, 73, 183, 1, 73, 183, 1, 236, 33, 183, 1, 70, 183, 1, 214, 118, 183,
+ 1, 245, 209, 183, 1, 254, 201, 183, 1, 226, 183, 183, 1, 253, 192, 183,
+ 1, 176, 183, 1, 234, 132, 183, 1, 243, 135, 183, 1, 242, 249, 183, 1,
+ 229, 77, 183, 1, 251, 33, 183, 1, 250, 157, 183, 1, 235, 141, 183, 1,
+ 235, 114, 183, 1, 227, 165, 183, 1, 215, 156, 183, 1, 215, 144, 183, 1,
+ 248, 135, 183, 1, 248, 119, 183, 1, 228, 110, 183, 1, 217, 105, 183, 1,
+ 216, 208, 183, 1, 248, 221, 183, 1, 248, 25, 183, 1, 197, 183, 1, 190,
+ 183, 1, 225, 147, 183, 1, 252, 191, 183, 1, 252, 18, 183, 1, 184, 183, 1,
+ 191, 183, 1, 205, 183, 1, 233, 135, 183, 1, 232, 184, 183, 1, 214, 27,
+ 183, 1, 220, 102, 183, 1, 206, 183, 1, 162, 183, 5, 227, 205, 183, 25, 5,
+ 255, 73, 183, 25, 5, 73, 183, 25, 5, 236, 33, 183, 25, 5, 70, 183, 25, 5,
+ 214, 118, 183, 25, 5, 245, 209, 183, 25, 5, 254, 201, 183, 25, 5, 226,
+ 183, 183, 25, 5, 253, 192, 183, 5, 213, 152, 183, 5, 214, 218, 183, 1,
+ 234, 115, 183, 1, 242, 226, 183, 1, 210, 116, 183, 1, 222, 179, 183, 1,
+ 244, 196, 183, 21, 210, 86, 183, 21, 110, 183, 21, 105, 183, 21, 158,
+ 183, 21, 161, 183, 21, 189, 183, 21, 194, 183, 21, 198, 183, 21, 195,
+ 183, 21, 200, 183, 216, 74, 183, 254, 253, 183, 235, 178, 183, 214, 146,
+ 183, 245, 181, 226, 188, 183, 5, 211, 78, 171, 5, 250, 255, 171, 5, 254,
+ 75, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, 73, 171, 1, 73, 171, 1,
+ 236, 33, 171, 1, 70, 171, 1, 214, 118, 171, 1, 149, 153, 171, 1, 149,
+ 156, 171, 25, 251, 2, 75, 171, 1, 75, 171, 1, 254, 201, 171, 25, 251, 2,
+ 76, 171, 1, 76, 171, 1, 253, 192, 171, 1, 176, 171, 1, 234, 132, 171, 1,
+ 243, 135, 171, 1, 242, 249, 171, 1, 229, 77, 171, 1, 251, 33, 171, 1,
+ 250, 157, 171, 1, 235, 141, 171, 1, 235, 114, 171, 1, 227, 165, 171, 1,
+ 215, 156, 171, 1, 215, 144, 171, 1, 248, 135, 171, 1, 248, 119, 171, 1,
+ 228, 110, 171, 1, 217, 105, 171, 1, 216, 208, 171, 1, 248, 221, 171, 1,
+ 248, 25, 171, 1, 197, 171, 1, 190, 171, 1, 225, 147, 171, 1, 252, 191,
+ 171, 1, 252, 18, 171, 1, 184, 171, 1, 191, 171, 1, 205, 171, 1, 233, 135,
+ 171, 1, 232, 184, 171, 1, 214, 27, 171, 1, 220, 102, 171, 1, 218, 223,
+ 171, 1, 206, 171, 1, 162, 171, 5, 227, 205, 171, 5, 253, 175, 171, 25, 5,
+ 255, 73, 171, 25, 5, 73, 171, 25, 5, 236, 33, 171, 25, 5, 70, 171, 25, 5,
+ 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, 149, 222, 180, 171, 25, 5,
+ 251, 2, 75, 171, 25, 5, 75, 171, 25, 5, 254, 201, 171, 25, 5, 251, 2, 76,
+ 171, 25, 5, 76, 171, 25, 5, 253, 192, 171, 5, 213, 152, 171, 226, 204,
+ 171, 1, 149, 222, 180, 171, 1, 149, 232, 185, 171, 25, 5, 149, 156, 171,
+ 25, 5, 149, 232, 185, 171, 21, 210, 86, 171, 21, 110, 171, 21, 105, 171,
+ 21, 158, 171, 21, 161, 171, 21, 189, 171, 21, 194, 171, 21, 198, 171, 21,
+ 195, 171, 21, 200, 171, 255, 21, 50, 171, 222, 118, 50, 157, 5, 250, 255,
+ 157, 5, 254, 75, 157, 5, 213, 147, 157, 1, 61, 157, 1, 255, 73, 157, 1,
+ 73, 157, 1, 236, 33, 157, 1, 70, 157, 1, 214, 118, 157, 1, 149, 153, 157,
+ 1, 149, 156, 157, 1, 75, 157, 1, 254, 201, 157, 1, 76, 157, 1, 253, 192,
+ 157, 1, 176, 157, 1, 234, 132, 157, 1, 243, 135, 157, 1, 242, 249, 157,
+ 1, 229, 77, 157, 1, 251, 33, 157, 1, 250, 157, 157, 1, 235, 141, 157, 1,
+ 235, 114, 157, 1, 227, 165, 157, 1, 215, 156, 157, 1, 215, 144, 157, 1,
+ 248, 135, 157, 1, 248, 119, 157, 1, 228, 110, 157, 1, 217, 105, 157, 1,
+ 216, 208, 157, 1, 248, 221, 157, 1, 248, 25, 157, 1, 197, 157, 1, 190,
+ 157, 1, 225, 147, 157, 1, 252, 191, 157, 1, 252, 18, 157, 1, 184, 157, 1,
+ 191, 157, 1, 205, 157, 1, 233, 135, 157, 1, 232, 184, 157, 1, 214, 27,
+ 157, 1, 220, 102, 157, 1, 218, 223, 157, 1, 206, 157, 1, 162, 157, 5,
+ 227, 205, 157, 5, 253, 175, 157, 25, 5, 255, 73, 157, 25, 5, 73, 157, 25,
+ 5, 236, 33, 157, 25, 5, 70, 157, 25, 5, 214, 118, 157, 25, 5, 149, 153,
+ 157, 25, 5, 149, 222, 180, 157, 25, 5, 75, 157, 25, 5, 254, 201, 157, 25,
+ 5, 76, 157, 25, 5, 253, 192, 157, 5, 213, 152, 157, 254, 202, 233, 23,
+ 78, 157, 253, 193, 233, 23, 78, 157, 1, 222, 179, 157, 1, 223, 39, 157,
+ 1, 210, 168, 157, 1, 149, 222, 180, 157, 1, 149, 232, 185, 157, 25, 5,
+ 149, 156, 157, 25, 5, 149, 232, 185, 157, 21, 210, 86, 157, 21, 110, 157,
+ 21, 105, 157, 21, 158, 157, 21, 161, 157, 21, 189, 157, 21, 194, 157, 21,
+ 198, 157, 21, 195, 157, 21, 200, 157, 235, 161, 157, 1, 212, 65, 157,
+ 244, 2, 123, 224, 21, 157, 244, 2, 123, 242, 27, 157, 244, 2, 134, 224,
+ 19, 157, 244, 2, 123, 219, 117, 157, 244, 2, 123, 245, 188, 157, 244, 2,
+ 134, 219, 116, 36, 5, 254, 75, 36, 5, 213, 147, 36, 1, 61, 36, 1, 255,
+ 73, 36, 1, 73, 36, 1, 236, 33, 36, 1, 70, 36, 1, 214, 118, 36, 1, 75, 36,
+ 1, 245, 209, 36, 1, 254, 201, 36, 1, 76, 36, 1, 226, 183, 36, 1, 253,
+ 192, 36, 1, 176, 36, 1, 229, 77, 36, 1, 251, 33, 36, 1, 235, 141, 36, 1,
+ 227, 165, 36, 1, 215, 156, 36, 1, 228, 110, 36, 1, 217, 105, 36, 1, 197,
+ 36, 1, 228, 92, 36, 1, 190, 36, 1, 184, 36, 1, 191, 36, 1, 205, 36, 1,
+ 222, 179, 36, 1, 233, 135, 36, 1, 232, 184, 36, 1, 232, 175, 36, 1, 214,
+ 27, 36, 1, 220, 102, 36, 1, 218, 223, 36, 1, 206, 36, 1, 162, 36, 25, 5,
+ 255, 73, 36, 25, 5, 73, 36, 25, 5, 236, 33, 36, 25, 5, 70, 36, 25, 5,
+ 214, 118, 36, 25, 5, 75, 36, 25, 5, 245, 209, 36, 25, 5, 254, 201, 36,
+ 25, 5, 76, 36, 25, 5, 226, 183, 36, 25, 5, 253, 192, 36, 5, 213, 152, 36,
+ 226, 204, 36, 253, 193, 233, 23, 78, 36, 21, 210, 86, 36, 21, 110, 36,
+ 21, 105, 36, 21, 158, 36, 21, 161, 36, 21, 189, 36, 21, 194, 36, 21, 198,
+ 36, 21, 195, 36, 21, 200, 36, 54, 216, 247, 36, 54, 123, 240, 210, 36,
+ 54, 123, 216, 147, 36, 248, 146, 50, 36, 230, 135, 50, 36, 211, 45, 50,
+ 36, 248, 87, 50, 36, 249, 139, 50, 36, 253, 238, 77, 50, 36, 222, 118,
+ 50, 36, 54, 50, 148, 5, 250, 255, 148, 5, 254, 75, 148, 5, 213, 147, 148,
+ 1, 61, 148, 1, 255, 73, 148, 1, 73, 148, 1, 236, 33, 148, 1, 70, 148, 1,
+ 214, 118, 148, 1, 149, 153, 148, 1, 149, 156, 148, 1, 75, 148, 1, 245,
+ 209, 148, 1, 254, 201, 148, 1, 76, 148, 1, 226, 183, 148, 1, 253, 192,
+ 148, 1, 176, 148, 1, 234, 132, 148, 1, 243, 135, 148, 1, 242, 249, 148,
+ 1, 229, 77, 148, 1, 251, 33, 148, 1, 250, 157, 148, 1, 235, 141, 148, 1,
+ 235, 114, 148, 1, 227, 165, 148, 1, 215, 156, 148, 1, 215, 144, 148, 1,
+ 248, 135, 148, 1, 248, 119, 148, 1, 228, 110, 148, 1, 217, 105, 148, 1,
+ 216, 208, 148, 1, 248, 221, 148, 1, 248, 25, 148, 1, 197, 148, 1, 190,
+ 148, 1, 225, 147, 148, 1, 252, 191, 148, 1, 252, 18, 148, 1, 184, 148, 1,
+ 191, 148, 1, 205, 148, 1, 222, 179, 148, 1, 233, 135, 148, 1, 232, 184,
+ 148, 1, 214, 27, 148, 1, 220, 102, 148, 1, 218, 223, 148, 1, 206, 148, 1,
+ 162, 148, 5, 253, 175, 148, 25, 5, 255, 73, 148, 25, 5, 73, 148, 25, 5,
+ 236, 33, 148, 25, 5, 70, 148, 25, 5, 214, 118, 148, 25, 5, 149, 153, 148,
+ 25, 5, 149, 222, 180, 148, 25, 5, 75, 148, 25, 5, 245, 209, 148, 25, 5,
+ 254, 201, 148, 25, 5, 76, 148, 25, 5, 226, 183, 148, 25, 5, 253, 192,
+ 148, 5, 213, 152, 148, 233, 23, 78, 148, 254, 202, 233, 23, 78, 148, 1,
+ 215, 183, 148, 1, 246, 38, 148, 1, 149, 222, 180, 148, 1, 149, 232, 185,
+ 148, 25, 5, 149, 156, 148, 25, 5, 149, 232, 185, 148, 21, 210, 86, 148,
+ 21, 110, 148, 21, 105, 148, 21, 158, 148, 21, 161, 148, 21, 189, 148, 21,
+ 194, 148, 21, 198, 148, 21, 195, 148, 21, 200, 148, 244, 2, 21, 210, 87,
+ 31, 226, 237, 224, 223, 64, 161, 148, 244, 2, 21, 123, 31, 226, 237, 224,
+ 223, 64, 161, 148, 244, 2, 21, 113, 31, 226, 237, 224, 223, 64, 161, 148,
+ 244, 2, 21, 134, 31, 226, 237, 224, 223, 64, 161, 148, 244, 2, 21, 123,
+ 31, 245, 42, 224, 223, 64, 161, 148, 244, 2, 21, 113, 31, 245, 42, 224,
+ 223, 64, 161, 148, 244, 2, 21, 134, 31, 245, 42, 224, 223, 64, 161, 148,
+ 5, 215, 84, 165, 5, 254, 75, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255,
+ 73, 165, 1, 73, 165, 1, 236, 33, 165, 1, 70, 165, 1, 214, 118, 165, 1,
+ 149, 153, 165, 1, 149, 156, 165, 1, 75, 165, 1, 245, 209, 165, 1, 254,
+ 201, 165, 1, 76, 165, 1, 226, 183, 165, 1, 253, 192, 165, 1, 176, 165, 1,
+ 234, 132, 165, 1, 243, 135, 165, 1, 242, 249, 165, 1, 229, 77, 165, 1,
+ 251, 33, 165, 1, 250, 157, 165, 1, 235, 141, 165, 1, 235, 114, 165, 1,
+ 227, 165, 165, 1, 215, 156, 165, 1, 215, 144, 165, 1, 248, 135, 165, 1,
+ 248, 119, 165, 1, 228, 110, 165, 1, 217, 105, 165, 1, 216, 208, 165, 1,
+ 248, 221, 165, 1, 248, 25, 165, 1, 197, 165, 1, 190, 165, 1, 225, 147,
+ 165, 1, 252, 191, 165, 1, 252, 18, 165, 1, 184, 165, 1, 191, 165, 1, 205,
+ 165, 1, 222, 179, 165, 1, 233, 135, 165, 1, 232, 184, 165, 1, 214, 27,
+ 165, 1, 220, 102, 165, 1, 218, 223, 165, 1, 206, 165, 1, 162, 165, 5,
+ 227, 205, 165, 5, 253, 175, 165, 25, 5, 255, 73, 165, 25, 5, 73, 165, 25,
+ 5, 236, 33, 165, 25, 5, 70, 165, 25, 5, 214, 118, 165, 25, 5, 149, 153,
+ 165, 25, 5, 149, 222, 180, 165, 25, 5, 75, 165, 25, 5, 245, 209, 165, 25,
+ 5, 254, 201, 165, 25, 5, 76, 165, 25, 5, 226, 183, 165, 25, 5, 253, 192,
+ 165, 5, 213, 152, 165, 233, 23, 78, 165, 254, 202, 233, 23, 78, 165, 1,
+ 244, 196, 165, 1, 149, 222, 180, 165, 1, 149, 232, 185, 165, 25, 5, 149,
+ 156, 165, 25, 5, 149, 232, 185, 165, 21, 210, 86, 165, 21, 110, 165, 21,
+ 105, 165, 21, 158, 165, 21, 161, 165, 21, 189, 165, 21, 194, 165, 21,
+ 198, 165, 21, 195, 165, 21, 200, 165, 5, 235, 102, 165, 5, 214, 161, 136,
+ 5, 254, 75, 136, 5, 213, 147, 136, 1, 61, 136, 1, 255, 73, 136, 1, 73,
+ 136, 1, 236, 33, 136, 1, 70, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1,
+ 149, 156, 136, 1, 75, 136, 1, 245, 209, 136, 1, 254, 201, 136, 1, 76,
+ 136, 1, 226, 183, 136, 1, 253, 192, 136, 1, 176, 136, 1, 234, 132, 136,
+ 1, 243, 135, 136, 1, 242, 249, 136, 1, 229, 77, 136, 1, 251, 33, 136, 1,
+ 250, 157, 136, 1, 235, 141, 136, 1, 235, 114, 136, 1, 227, 165, 136, 1,
+ 215, 156, 136, 1, 215, 144, 136, 1, 248, 135, 136, 1, 248, 119, 136, 1,
+ 228, 110, 136, 1, 217, 105, 136, 1, 216, 208, 136, 1, 248, 221, 136, 1,
+ 248, 25, 136, 1, 197, 136, 1, 228, 92, 136, 1, 190, 136, 1, 225, 147,
+ 136, 1, 252, 191, 136, 1, 252, 18, 136, 1, 184, 136, 1, 191, 136, 1, 205,
+ 136, 1, 222, 179, 136, 1, 233, 135, 136, 1, 232, 184, 136, 1, 232, 175,
+ 136, 1, 214, 27, 136, 1, 220, 102, 136, 1, 218, 223, 136, 1, 206, 136, 1,
+ 162, 136, 1, 215, 125, 136, 5, 253, 175, 136, 25, 5, 255, 73, 136, 25, 5,
+ 73, 136, 25, 5, 236, 33, 136, 25, 5, 70, 136, 25, 5, 214, 118, 136, 25,
+ 5, 149, 153, 136, 25, 5, 149, 222, 180, 136, 25, 5, 75, 136, 25, 5, 245,
+ 209, 136, 25, 5, 254, 201, 136, 25, 5, 76, 136, 25, 5, 226, 183, 136, 25,
+ 5, 253, 192, 136, 5, 213, 152, 136, 1, 59, 223, 73, 136, 253, 193, 233,
+ 23, 78, 136, 1, 149, 222, 180, 136, 1, 149, 232, 185, 136, 25, 5, 149,
+ 156, 136, 25, 5, 149, 232, 185, 136, 21, 210, 86, 136, 21, 110, 136, 21,
+ 105, 136, 21, 158, 136, 21, 161, 136, 21, 189, 136, 21, 194, 136, 21,
+ 198, 136, 21, 195, 136, 21, 200, 136, 54, 216, 247, 136, 54, 123, 240,
+ 210, 136, 54, 123, 216, 147, 136, 244, 2, 123, 224, 21, 136, 244, 2, 123,
+ 242, 27, 136, 244, 2, 134, 224, 19, 136, 248, 150, 78, 136, 1, 250, 99,
+ 228, 111, 136, 1, 250, 99, 230, 25, 136, 1, 250, 99, 222, 180, 136, 1,
+ 250, 99, 156, 136, 1, 250, 99, 232, 185, 136, 1, 250, 99, 235, 23, 175,
+ 5, 254, 74, 175, 5, 213, 146, 175, 1, 253, 165, 175, 1, 255, 27, 175, 1,
+ 254, 223, 175, 1, 254, 238, 175, 1, 235, 151, 175, 1, 236, 32, 175, 1,
+ 214, 110, 175, 1, 214, 112, 175, 1, 235, 173, 175, 1, 235, 174, 175, 1,
+ 236, 18, 175, 1, 236, 20, 175, 1, 245, 17, 175, 1, 245, 204, 175, 1, 254,
+ 188, 175, 1, 226, 108, 175, 1, 226, 177, 175, 1, 253, 178, 175, 1, 254,
+ 146, 234, 187, 175, 1, 231, 209, 234, 187, 175, 1, 254, 146, 243, 82,
+ 175, 1, 231, 209, 243, 82, 175, 1, 234, 229, 229, 222, 175, 1, 221, 236,
+ 243, 82, 175, 1, 254, 146, 250, 216, 175, 1, 231, 209, 250, 216, 175, 1,
+ 254, 146, 235, 127, 175, 1, 231, 209, 235, 127, 175, 1, 217, 98, 229,
+ 222, 175, 1, 217, 98, 221, 235, 229, 223, 175, 1, 221, 236, 235, 127,
+ 175, 1, 254, 146, 215, 152, 175, 1, 231, 209, 215, 152, 175, 1, 254, 146,
+ 248, 126, 175, 1, 231, 209, 248, 126, 175, 1, 230, 53, 229, 180, 175, 1,
+ 221, 236, 248, 126, 175, 1, 254, 146, 217, 30, 175, 1, 231, 209, 217, 30,
+ 175, 1, 254, 146, 248, 144, 175, 1, 231, 209, 248, 144, 175, 1, 248, 174,
+ 229, 180, 175, 1, 221, 236, 248, 144, 175, 1, 254, 146, 225, 228, 175, 1,
+ 231, 209, 225, 228, 175, 1, 254, 146, 252, 112, 175, 1, 231, 209, 252,
+ 112, 175, 1, 231, 131, 175, 1, 254, 131, 252, 112, 175, 1, 211, 51, 175,
+ 1, 223, 133, 175, 1, 248, 174, 233, 67, 175, 1, 214, 1, 175, 1, 217, 98,
+ 221, 210, 175, 1, 230, 53, 221, 210, 175, 1, 248, 174, 221, 210, 175, 1,
+ 241, 242, 175, 1, 230, 53, 233, 67, 175, 1, 244, 156, 175, 5, 254, 177,
+ 175, 25, 5, 254, 233, 175, 25, 5, 234, 155, 254, 240, 175, 25, 5, 247,
+ 228, 254, 240, 175, 25, 5, 234, 155, 235, 170, 175, 25, 5, 247, 228, 235,
+ 170, 175, 25, 5, 234, 155, 226, 88, 175, 25, 5, 247, 228, 226, 88, 175,
+ 25, 5, 243, 124, 175, 25, 5, 234, 15, 175, 25, 5, 247, 228, 234, 15, 175,
+ 25, 5, 234, 17, 248, 67, 175, 25, 5, 234, 16, 242, 47, 254, 233, 175, 25,
+ 5, 234, 16, 242, 47, 247, 228, 254, 233, 175, 25, 5, 234, 16, 242, 47,
+ 243, 81, 175, 25, 5, 243, 81, 175, 25, 5, 247, 228, 243, 124, 175, 25, 5,
+ 247, 228, 243, 81, 175, 224, 141, 233, 207, 168, 135, 234, 29, 234, 246,
+ 168, 135, 234, 106, 234, 128, 168, 135, 234, 106, 234, 99, 168, 135, 234,
+ 106, 234, 95, 168, 135, 234, 106, 234, 103, 168, 135, 234, 106, 223, 154,
+ 168, 135, 229, 5, 228, 248, 168, 135, 250, 87, 250, 147, 168, 135, 250,
+ 87, 250, 95, 168, 135, 250, 87, 250, 146, 168, 135, 219, 59, 219, 58,
+ 168, 135, 250, 87, 250, 83, 168, 135, 210, 245, 210, 252, 168, 135, 247,
+ 146, 250, 154, 168, 135, 216, 42, 225, 238, 168, 135, 216, 157, 216, 200,
+ 168, 135, 216, 157, 229, 201, 168, 135, 216, 157, 225, 111, 168, 135,
+ 228, 75, 229, 98, 168, 135, 247, 146, 248, 68, 168, 135, 216, 42, 217,
+ 55, 168, 135, 216, 157, 216, 131, 168, 135, 216, 157, 216, 204, 168, 135,
+ 216, 157, 216, 154, 168, 135, 228, 75, 227, 237, 168, 135, 251, 206, 252,
+ 164, 168, 135, 225, 17, 225, 42, 168, 135, 225, 122, 225, 113, 168, 135,
+ 244, 44, 244, 196, 168, 135, 225, 122, 225, 141, 168, 135, 244, 44, 244,
+ 173, 168, 135, 225, 122, 221, 247, 168, 135, 230, 162, 184, 168, 135,
+ 210, 245, 211, 79, 168, 135, 222, 212, 222, 139, 168, 135, 222, 140, 168,
+ 135, 232, 157, 232, 206, 168, 135, 232, 98, 168, 135, 211, 228, 212, 61,
+ 168, 135, 219, 59, 222, 6, 168, 135, 219, 59, 222, 114, 168, 135, 219,
+ 59, 218, 82, 168, 135, 241, 69, 241, 159, 168, 135, 232, 157, 250, 68,
+ 168, 135, 144, 254, 115, 168, 135, 241, 69, 228, 70, 168, 135, 226, 68,
+ 168, 135, 221, 230, 61, 168, 135, 231, 204, 242, 17, 168, 135, 221, 230,
+ 255, 73, 168, 135, 221, 230, 254, 136, 168, 135, 221, 230, 73, 168, 135,
+ 221, 230, 236, 33, 168, 135, 221, 230, 214, 214, 168, 135, 221, 230, 214,
+ 212, 168, 135, 221, 230, 70, 168, 135, 221, 230, 214, 118, 168, 135, 225,
+ 124, 168, 249, 98, 16, 252, 165, 168, 135, 221, 230, 75, 168, 135, 221,
+ 230, 254, 243, 168, 135, 221, 230, 76, 168, 135, 221, 230, 254, 202, 231,
+ 198, 168, 135, 221, 230, 254, 202, 231, 199, 168, 135, 233, 106, 168,
+ 135, 231, 195, 168, 135, 231, 196, 168, 135, 231, 204, 245, 180, 168,
+ 135, 231, 204, 216, 156, 168, 135, 231, 204, 215, 228, 168, 135, 231,
+ 204, 250, 135, 168, 135, 216, 198, 168, 135, 228, 205, 168, 135, 211, 73,
+ 168, 135, 244, 35, 168, 21, 210, 86, 168, 21, 110, 168, 21, 105, 168, 21,
+ 158, 168, 21, 161, 168, 21, 189, 168, 21, 194, 168, 21, 198, 168, 21,
+ 195, 168, 21, 200, 168, 135, 254, 111, 168, 135, 234, 104, 209, 209, 1,
+ 234, 28, 209, 209, 1, 234, 106, 218, 35, 209, 209, 1, 234, 106, 217, 62,
+ 209, 209, 1, 229, 4, 209, 209, 1, 249, 238, 209, 209, 1, 219, 59, 217,
+ 62, 209, 209, 1, 227, 134, 209, 209, 1, 247, 145, 209, 209, 1, 111, 209,
+ 209, 1, 216, 157, 218, 35, 209, 209, 1, 216, 157, 217, 62, 209, 209, 1,
+ 228, 74, 209, 209, 1, 251, 205, 209, 209, 1, 225, 16, 209, 209, 1, 225,
+ 122, 218, 35, 209, 209, 1, 244, 44, 217, 62, 209, 209, 1, 225, 122, 217,
+ 62, 209, 209, 1, 244, 44, 218, 35, 209, 209, 1, 230, 161, 209, 209, 1,
+ 210, 244, 209, 209, 1, 232, 157, 232, 206, 209, 209, 1, 232, 157, 232,
+ 121, 209, 209, 1, 211, 227, 209, 209, 1, 219, 59, 218, 35, 209, 209, 1,
+ 241, 69, 218, 35, 209, 209, 1, 76, 209, 209, 1, 241, 69, 217, 62, 209,
+ 209, 245, 163, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 204, 234, 234,
+ 209, 209, 25, 5, 255, 73, 209, 209, 25, 5, 254, 136, 209, 209, 25, 5, 73,
+ 209, 209, 25, 5, 236, 33, 209, 209, 25, 5, 211, 117, 209, 209, 25, 5,
+ 210, 169, 209, 209, 25, 5, 70, 209, 209, 25, 5, 214, 118, 209, 209, 25,
+ 5, 231, 204, 234, 13, 209, 209, 220, 145, 5, 232, 156, 209, 209, 220,
+ 145, 5, 227, 134, 209, 209, 25, 5, 75, 209, 209, 25, 5, 245, 195, 209,
+ 209, 25, 5, 76, 209, 209, 25, 5, 253, 167, 209, 209, 25, 5, 254, 201,
+ 209, 209, 234, 29, 233, 135, 209, 209, 138, 231, 204, 245, 180, 209, 209,
+ 138, 231, 204, 216, 156, 209, 209, 138, 231, 204, 216, 117, 209, 209,
+ 138, 231, 204, 250, 223, 209, 209, 251, 4, 78, 209, 209, 228, 214, 209,
+ 209, 21, 210, 86, 209, 209, 21, 110, 209, 209, 21, 105, 209, 209, 21,
+ 158, 209, 209, 21, 161, 209, 209, 21, 189, 209, 209, 21, 194, 209, 209,
+ 21, 198, 209, 209, 21, 195, 209, 209, 21, 200, 209, 209, 241, 69, 228,
+ 74, 209, 209, 241, 69, 230, 161, 209, 209, 1, 234, 107, 242, 174, 209,
+ 209, 1, 234, 107, 227, 134, 63, 3, 226, 204, 63, 164, 242, 115, 211, 0,
+ 230, 248, 215, 189, 61, 63, 164, 242, 115, 211, 0, 230, 248, 255, 159,
+ 222, 216, 252, 77, 184, 63, 164, 242, 115, 211, 0, 230, 248, 255, 159,
+ 242, 115, 215, 173, 184, 63, 164, 65, 211, 0, 230, 248, 231, 93, 184, 63,
+ 164, 249, 252, 211, 0, 230, 248, 220, 109, 184, 63, 164, 250, 239, 211,
+ 0, 230, 248, 225, 112, 220, 96, 184, 63, 164, 211, 0, 230, 248, 215, 173,
+ 220, 96, 184, 63, 164, 221, 208, 220, 95, 63, 164, 251, 128, 211, 0, 230,
+ 247, 63, 164, 251, 223, 220, 3, 211, 0, 230, 247, 63, 164, 235, 197, 215,
+ 172, 63, 164, 248, 61, 215, 173, 251, 127, 63, 164, 220, 95, 63, 164,
+ 227, 139, 220, 95, 63, 164, 215, 173, 220, 95, 63, 164, 227, 139, 215,
+ 173, 220, 95, 63, 164, 222, 236, 250, 122, 218, 236, 220, 95, 63, 164,
+ 223, 42, 242, 146, 220, 95, 63, 164, 250, 239, 255, 163, 222, 144, 231,
+ 92, 199, 251, 7, 63, 164, 242, 115, 215, 172, 63, 232, 144, 5, 250, 155,
+ 222, 143, 63, 232, 144, 5, 232, 252, 222, 143, 63, 253, 212, 5, 220, 105,
+ 243, 65, 255, 164, 222, 143, 63, 253, 212, 5, 255, 161, 190, 63, 253,
+ 212, 5, 221, 182, 215, 168, 63, 5, 223, 130, 247, 159, 243, 64, 63, 5,
+ 223, 130, 247, 159, 242, 176, 63, 5, 223, 130, 247, 159, 242, 116, 63, 5,
+ 223, 130, 229, 219, 243, 64, 63, 5, 223, 130, 229, 219, 242, 176, 63, 5,
+ 223, 130, 247, 159, 223, 130, 229, 218, 63, 21, 210, 86, 63, 21, 110, 63,
+ 21, 105, 63, 21, 158, 63, 21, 161, 63, 21, 189, 63, 21, 194, 63, 21, 198,
+ 63, 21, 195, 63, 21, 200, 63, 21, 163, 110, 63, 21, 163, 105, 63, 21,
+ 163, 158, 63, 21, 163, 161, 63, 21, 163, 189, 63, 21, 163, 194, 63, 21,
+ 163, 198, 63, 21, 163, 195, 63, 21, 163, 200, 63, 21, 163, 210, 86, 63,
+ 164, 251, 130, 222, 143, 63, 164, 229, 68, 251, 68, 227, 149, 210, 25,
+ 63, 164, 250, 239, 255, 163, 222, 144, 251, 69, 230, 202, 251, 7, 63,
+ 164, 229, 68, 251, 68, 220, 106, 222, 143, 63, 164, 250, 132, 230, 247,
+ 63, 164, 215, 184, 255, 160, 63, 164, 242, 100, 222, 144, 242, 63, 63,
+ 164, 242, 100, 222, 144, 242, 69, 63, 164, 254, 116, 234, 123, 242, 63,
+ 63, 164, 254, 116, 234, 123, 242, 69, 63, 5, 211, 65, 215, 171, 63, 5,
+ 231, 167, 215, 171, 63, 1, 176, 63, 1, 234, 132, 63, 1, 243, 135, 63, 1,
+ 242, 249, 63, 1, 229, 77, 63, 1, 251, 33, 63, 1, 250, 157, 63, 1, 235,
+ 141, 63, 1, 227, 165, 63, 1, 215, 156, 63, 1, 215, 144, 63, 1, 248, 135,
+ 63, 1, 248, 119, 63, 1, 228, 110, 63, 1, 217, 105, 63, 1, 216, 208, 63,
+ 1, 248, 221, 63, 1, 248, 25, 63, 1, 197, 63, 1, 190, 63, 1, 225, 147, 63,
+ 1, 252, 191, 63, 1, 252, 18, 63, 1, 184, 63, 1, 215, 183, 63, 1, 215,
+ 175, 63, 1, 246, 38, 63, 1, 246, 33, 63, 1, 212, 65, 63, 1, 210, 82, 63,
+ 1, 210, 116, 63, 1, 255, 166, 63, 1, 191, 63, 1, 205, 63, 1, 233, 135,
+ 63, 1, 220, 102, 63, 1, 218, 223, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63,
+ 1, 233, 231, 63, 1, 244, 77, 205, 63, 1, 234, 46, 63, 1, 222, 179, 63,
+ 25, 5, 255, 73, 63, 25, 5, 73, 63, 25, 5, 236, 33, 63, 25, 5, 70, 63, 25,
+ 5, 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 180, 63, 25, 5,
+ 149, 156, 63, 25, 5, 149, 232, 185, 63, 25, 5, 75, 63, 25, 5, 245, 209,
+ 63, 25, 5, 76, 63, 25, 5, 226, 183, 63, 5, 222, 221, 218, 84, 229, 78,
+ 222, 211, 63, 5, 222, 216, 252, 76, 63, 25, 5, 223, 49, 73, 63, 25, 5,
+ 223, 49, 236, 33, 63, 5, 227, 149, 210, 26, 229, 226, 248, 221, 63, 5,
+ 219, 71, 233, 60, 63, 164, 242, 29, 63, 164, 226, 57, 63, 5, 233, 63,
+ 222, 143, 63, 5, 211, 70, 222, 143, 63, 5, 233, 64, 215, 184, 251, 7, 63,
+ 5, 231, 95, 251, 7, 63, 5, 242, 119, 251, 8, 223, 40, 63, 5, 242, 119,
+ 231, 85, 223, 40, 63, 5, 235, 193, 231, 95, 251, 7, 63, 218, 73, 5, 233,
+ 64, 215, 184, 251, 7, 63, 218, 73, 5, 231, 95, 251, 7, 63, 218, 73, 5,
+ 235, 193, 231, 95, 251, 7, 63, 218, 73, 1, 176, 63, 218, 73, 1, 234, 132,
+ 63, 218, 73, 1, 243, 135, 63, 218, 73, 1, 242, 249, 63, 218, 73, 1, 229,
+ 77, 63, 218, 73, 1, 251, 33, 63, 218, 73, 1, 250, 157, 63, 218, 73, 1,
+ 235, 141, 63, 218, 73, 1, 227, 165, 63, 218, 73, 1, 215, 156, 63, 218,
+ 73, 1, 215, 144, 63, 218, 73, 1, 248, 135, 63, 218, 73, 1, 248, 119, 63,
+ 218, 73, 1, 228, 110, 63, 218, 73, 1, 217, 105, 63, 218, 73, 1, 216, 208,
+ 63, 218, 73, 1, 248, 221, 63, 218, 73, 1, 248, 25, 63, 218, 73, 1, 197,
+ 63, 218, 73, 1, 190, 63, 218, 73, 1, 225, 147, 63, 218, 73, 1, 252, 191,
+ 63, 218, 73, 1, 252, 18, 63, 218, 73, 1, 184, 63, 218, 73, 1, 215, 183,
+ 63, 218, 73, 1, 215, 175, 63, 218, 73, 1, 246, 38, 63, 218, 73, 1, 246,
+ 33, 63, 218, 73, 1, 212, 65, 63, 218, 73, 1, 210, 82, 63, 218, 73, 1,
+ 210, 116, 63, 218, 73, 1, 255, 166, 63, 218, 73, 1, 191, 63, 218, 73, 1,
+ 205, 63, 218, 73, 1, 233, 135, 63, 218, 73, 1, 220, 102, 63, 218, 73, 1,
+ 218, 223, 63, 218, 73, 1, 206, 63, 218, 73, 1, 162, 63, 218, 73, 1, 61,
+ 63, 218, 73, 1, 233, 231, 63, 218, 73, 1, 244, 77, 212, 65, 63, 218, 73,
+ 1, 244, 77, 191, 63, 218, 73, 1, 244, 77, 205, 63, 233, 218, 222, 141,
+ 234, 132, 63, 233, 218, 222, 141, 234, 133, 251, 69, 230, 202, 251, 7,
+ 63, 250, 252, 5, 114, 252, 70, 63, 250, 252, 5, 192, 252, 70, 63, 250,
+ 252, 5, 250, 253, 217, 20, 63, 250, 252, 5, 221, 207, 255, 165, 63, 16,
+ 246, 91, 251, 125, 63, 16, 223, 129, 222, 222, 63, 16, 226, 77, 243, 63,
+ 63, 16, 223, 129, 222, 223, 223, 42, 242, 145, 63, 16, 225, 112, 190, 63,
+ 16, 228, 59, 251, 125, 63, 16, 228, 59, 251, 126, 227, 139, 255, 162, 63,
+ 16, 228, 59, 251, 126, 242, 117, 255, 162, 63, 16, 228, 59, 251, 126,
+ 251, 69, 255, 162, 63, 5, 223, 130, 229, 219, 223, 130, 247, 158, 63, 5,
+ 223, 130, 229, 219, 242, 116, 63, 164, 251, 129, 220, 3, 242, 215, 230,
+ 248, 223, 41, 63, 164, 230, 163, 211, 0, 242, 215, 230, 248, 223, 41, 63,
+ 164, 227, 139, 215, 172, 63, 164, 65, 251, 152, 222, 213, 211, 0, 230,
+ 248, 231, 93, 184, 63, 164, 249, 252, 251, 152, 222, 213, 211, 0, 230,
+ 248, 220, 109, 184, 222, 250, 217, 255, 50, 233, 45, 217, 255, 50, 222,
+ 250, 217, 255, 5, 2, 247, 118, 233, 45, 217, 255, 5, 2, 247, 118, 63,
+ 164, 233, 55, 231, 96, 222, 143, 63, 164, 215, 250, 231, 96, 222, 143,
+ 68, 1, 176, 68, 1, 234, 132, 68, 1, 243, 135, 68, 1, 242, 249, 68, 1,
+ 229, 77, 68, 1, 251, 33, 68, 1, 250, 157, 68, 1, 235, 141, 68, 1, 235,
+ 114, 68, 1, 227, 165, 68, 1, 228, 76, 68, 1, 215, 156, 68, 1, 215, 144,
+ 68, 1, 248, 135, 68, 1, 248, 119, 68, 1, 228, 110, 68, 1, 217, 105, 68,
+ 1, 216, 208, 68, 1, 248, 221, 68, 1, 248, 25, 68, 1, 197, 68, 1, 190, 68,
+ 1, 225, 147, 68, 1, 252, 191, 68, 1, 252, 18, 68, 1, 184, 68, 1, 191, 68,
+ 1, 205, 68, 1, 233, 135, 68, 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1,
+ 232, 184, 68, 1, 61, 68, 1, 220, 86, 61, 68, 1, 73, 68, 1, 236, 33, 68,
+ 1, 70, 68, 1, 214, 118, 68, 1, 75, 68, 1, 230, 151, 75, 68, 1, 76, 68, 1,
+ 253, 192, 68, 25, 5, 217, 64, 255, 73, 68, 25, 5, 255, 73, 68, 25, 5, 73,
+ 68, 25, 5, 236, 33, 68, 25, 5, 70, 68, 25, 5, 214, 118, 68, 25, 5, 75,
+ 68, 25, 5, 254, 201, 68, 25, 5, 230, 151, 236, 33, 68, 25, 5, 230, 151,
+ 76, 68, 25, 5, 160, 48, 68, 5, 254, 75, 68, 5, 59, 51, 68, 5, 213, 147,
+ 68, 5, 213, 152, 68, 5, 253, 235, 68, 116, 5, 147, 191, 68, 116, 5, 147,
+ 205, 68, 116, 5, 147, 212, 65, 68, 116, 5, 147, 162, 68, 1, 242, 132,
+ 206, 68, 21, 210, 86, 68, 21, 110, 68, 21, 105, 68, 21, 158, 68, 21, 161,
+ 68, 21, 189, 68, 21, 194, 68, 21, 198, 68, 21, 195, 68, 21, 200, 68, 5,
+ 232, 192, 221, 172, 68, 5, 221, 172, 68, 16, 232, 153, 68, 16, 249, 213,
+ 68, 16, 254, 220, 68, 16, 243, 48, 68, 1, 220, 102, 68, 1, 218, 223, 68,
+ 1, 149, 153, 68, 1, 149, 222, 180, 68, 1, 149, 156, 68, 1, 149, 232, 185,
+ 68, 25, 5, 149, 153, 68, 25, 5, 149, 222, 180, 68, 25, 5, 149, 156, 68,
+ 25, 5, 149, 232, 185, 68, 1, 230, 151, 229, 77, 68, 1, 230, 151, 235,
+ 114, 68, 1, 230, 151, 252, 111, 68, 1, 230, 151, 252, 106, 68, 116, 5,
+ 230, 151, 147, 197, 68, 116, 5, 230, 151, 147, 184, 68, 116, 5, 230, 151,
+ 147, 233, 135, 68, 1, 220, 108, 234, 213, 220, 102, 68, 25, 5, 220, 108,
+ 234, 213, 245, 55, 68, 138, 164, 220, 108, 234, 213, 241, 247, 68, 138,
+ 164, 220, 108, 234, 213, 234, 183, 225, 121, 68, 1, 212, 7, 224, 108,
+ 234, 213, 216, 208, 68, 1, 212, 7, 224, 108, 234, 213, 224, 114, 68, 25,
+ 5, 212, 7, 224, 108, 234, 213, 245, 55, 68, 25, 5, 212, 7, 224, 108, 234,
+ 213, 214, 214, 68, 5, 212, 7, 224, 108, 234, 213, 216, 29, 68, 5, 212, 7,
+ 224, 108, 234, 213, 216, 28, 68, 5, 212, 7, 224, 108, 234, 213, 216, 27,
+ 68, 5, 212, 7, 224, 108, 234, 213, 216, 26, 68, 5, 212, 7, 224, 108, 234,
+ 213, 216, 25, 68, 1, 245, 219, 224, 108, 234, 213, 228, 110, 68, 1, 245,
+ 219, 224, 108, 234, 213, 210, 176, 68, 1, 245, 219, 224, 108, 234, 213,
+ 242, 217, 68, 25, 5, 243, 59, 234, 213, 73, 68, 25, 5, 234, 188, 226,
+ 234, 68, 25, 5, 234, 188, 70, 68, 25, 5, 234, 188, 245, 209, 68, 1, 220,
+ 86, 176, 68, 1, 220, 86, 234, 132, 68, 1, 220, 86, 243, 135, 68, 1, 220,
+ 86, 251, 33, 68, 1, 220, 86, 210, 116, 68, 1, 220, 86, 227, 165, 68, 1,
+ 220, 86, 248, 221, 68, 1, 220, 86, 197, 68, 1, 220, 86, 225, 147, 68, 1,
+ 220, 86, 244, 196, 68, 1, 220, 86, 252, 191, 68, 1, 220, 86, 216, 208,
+ 68, 1, 220, 86, 162, 68, 116, 5, 220, 86, 147, 212, 65, 68, 25, 5, 220,
+ 86, 255, 73, 68, 25, 5, 220, 86, 75, 68, 25, 5, 220, 86, 160, 48, 68, 25,
+ 5, 220, 86, 40, 211, 117, 68, 5, 220, 86, 216, 28, 68, 5, 220, 86, 216,
+ 27, 68, 5, 220, 86, 216, 25, 68, 5, 220, 86, 216, 24, 68, 5, 220, 86,
+ 249, 152, 216, 28, 68, 5, 220, 86, 249, 152, 216, 27, 68, 5, 220, 86,
+ 249, 152, 245, 153, 216, 30, 68, 1, 222, 128, 226, 63, 244, 196, 68, 5,
+ 222, 128, 226, 63, 216, 25, 68, 220, 86, 21, 210, 86, 68, 220, 86, 21,
+ 110, 68, 220, 86, 21, 105, 68, 220, 86, 21, 158, 68, 220, 86, 21, 161,
+ 68, 220, 86, 21, 189, 68, 220, 86, 21, 194, 68, 220, 86, 21, 198, 68,
+ 220, 86, 21, 195, 68, 220, 86, 21, 200, 68, 5, 234, 126, 216, 29, 68, 5,
+ 234, 126, 216, 27, 68, 25, 5, 254, 190, 61, 68, 25, 5, 254, 190, 254,
+ 201, 68, 16, 220, 86, 110, 68, 16, 220, 86, 245, 30, 98, 6, 1, 254, 123,
+ 98, 6, 1, 252, 152, 98, 6, 1, 243, 106, 98, 6, 1, 247, 128, 98, 6, 1,
+ 245, 150, 98, 6, 1, 213, 160, 98, 6, 1, 210, 89, 98, 6, 1, 217, 60, 98,
+ 6, 1, 235, 255, 98, 6, 1, 234, 234, 98, 6, 1, 233, 81, 98, 6, 1, 231,
+ 185, 98, 6, 1, 229, 195, 98, 6, 1, 226, 196, 98, 6, 1, 226, 17, 98, 6, 1,
+ 210, 78, 98, 6, 1, 223, 171, 98, 6, 1, 221, 243, 98, 6, 1, 217, 50, 98,
+ 6, 1, 214, 190, 98, 6, 1, 225, 140, 98, 6, 1, 234, 121, 98, 6, 1, 242,
+ 241, 98, 6, 1, 224, 73, 98, 6, 1, 220, 20, 98, 6, 1, 250, 97, 98, 6, 1,
+ 251, 7, 98, 6, 1, 235, 100, 98, 6, 1, 250, 40, 98, 6, 1, 250, 143, 98, 6,
+ 1, 211, 163, 98, 6, 1, 235, 111, 98, 6, 1, 242, 43, 98, 6, 1, 241, 238,
+ 98, 6, 1, 241, 175, 98, 6, 1, 212, 22, 98, 6, 1, 242, 4, 98, 6, 1, 241,
+ 65, 98, 6, 1, 210, 246, 98, 6, 1, 254, 232, 98, 1, 254, 123, 98, 1, 252,
+ 152, 98, 1, 243, 106, 98, 1, 247, 128, 98, 1, 245, 150, 98, 1, 213, 160,
+ 98, 1, 210, 89, 98, 1, 217, 60, 98, 1, 235, 255, 98, 1, 234, 234, 98, 1,
+ 233, 81, 98, 1, 231, 185, 98, 1, 229, 195, 98, 1, 226, 196, 98, 1, 226,
+ 17, 98, 1, 210, 78, 98, 1, 223, 171, 98, 1, 221, 243, 98, 1, 217, 50, 98,
+ 1, 214, 190, 98, 1, 225, 140, 98, 1, 234, 121, 98, 1, 242, 241, 98, 1,
+ 224, 73, 98, 1, 220, 20, 98, 1, 250, 97, 98, 1, 251, 7, 98, 1, 235, 100,
+ 98, 1, 250, 40, 98, 1, 250, 143, 98, 1, 211, 163, 98, 1, 235, 111, 98, 1,
+ 242, 43, 98, 1, 241, 238, 98, 1, 241, 175, 98, 1, 212, 22, 98, 1, 242, 4,
+ 98, 1, 241, 65, 98, 1, 244, 121, 98, 1, 210, 246, 98, 1, 245, 165, 98, 1,
+ 215, 94, 243, 106, 98, 1, 254, 196, 98, 226, 15, 220, 137, 58, 1, 98,
+ 229, 195, 98, 1, 254, 232, 98, 1, 242, 3, 50, 98, 1, 233, 127, 50, 24,
+ 100, 234, 58, 24, 100, 218, 215, 24, 100, 228, 226, 24, 100, 216, 101,
+ 24, 100, 218, 204, 24, 100, 223, 26, 24, 100, 230, 217, 24, 100, 225, 95,
+ 24, 100, 218, 212, 24, 100, 219, 148, 24, 100, 218, 209, 24, 100, 236,
+ 56, 24, 100, 250, 46, 24, 100, 218, 219, 24, 100, 250, 106, 24, 100, 234,
+ 110, 24, 100, 216, 173, 24, 100, 225, 131, 24, 100, 241, 172, 24, 100,
+ 228, 222, 24, 100, 218, 213, 24, 100, 228, 216, 24, 100, 228, 220, 24,
+ 100, 216, 98, 24, 100, 223, 14, 24, 100, 218, 211, 24, 100, 223, 24, 24,
+ 100, 234, 218, 24, 100, 230, 210, 24, 100, 234, 221, 24, 100, 225, 90,
+ 24, 100, 225, 88, 24, 100, 225, 76, 24, 100, 225, 84, 24, 100, 225, 82,
+ 24, 100, 225, 79, 24, 100, 225, 81, 24, 100, 225, 78, 24, 100, 225, 83,
+ 24, 100, 225, 93, 24, 100, 225, 94, 24, 100, 225, 77, 24, 100, 225, 87,
+ 24, 100, 234, 219, 24, 100, 234, 217, 24, 100, 219, 141, 24, 100, 219,
+ 139, 24, 100, 219, 131, 24, 100, 219, 134, 24, 100, 219, 140, 24, 100,
+ 219, 136, 24, 100, 219, 135, 24, 100, 219, 133, 24, 100, 219, 144, 24,
+ 100, 219, 146, 24, 100, 219, 147, 24, 100, 219, 142, 24, 100, 219, 132,
+ 24, 100, 219, 137, 24, 100, 219, 145, 24, 100, 250, 90, 24, 100, 250, 88,
+ 24, 100, 250, 168, 24, 100, 250, 166, 24, 100, 226, 32, 24, 100, 236, 51,
+ 24, 100, 236, 42, 24, 100, 236, 50, 24, 100, 236, 47, 24, 100, 236, 45,
+ 24, 100, 236, 49, 24, 100, 218, 216, 24, 100, 236, 54, 24, 100, 236, 55,
+ 24, 100, 236, 43, 24, 100, 236, 48, 24, 100, 211, 26, 24, 100, 250, 45,
+ 24, 100, 250, 91, 24, 100, 250, 89, 24, 100, 250, 169, 24, 100, 250, 167,
+ 24, 100, 250, 104, 24, 100, 250, 105, 24, 100, 250, 92, 24, 100, 250,
+ 170, 24, 100, 225, 129, 24, 100, 234, 220, 24, 100, 218, 217, 24, 100,
+ 211, 32, 24, 100, 234, 49, 24, 100, 228, 218, 24, 100, 228, 224, 24, 100,
+ 228, 223, 24, 100, 216, 95, 24, 100, 244, 103, 24, 143, 244, 103, 24,
+ 143, 61, 24, 143, 254, 243, 24, 143, 191, 24, 143, 211, 92, 24, 143, 245,
+ 117, 24, 143, 75, 24, 143, 211, 36, 24, 143, 211, 47, 24, 143, 76, 24,
+ 143, 212, 65, 24, 143, 212, 62, 24, 143, 226, 234, 24, 143, 210, 244, 24,
+ 143, 70, 24, 143, 212, 11, 24, 143, 212, 22, 24, 143, 211, 250, 24, 143,
+ 210, 212, 24, 143, 245, 55, 24, 143, 211, 8, 24, 143, 73, 24, 143, 255,
+ 157, 24, 143, 255, 156, 24, 143, 211, 106, 24, 143, 211, 104, 24, 143,
+ 245, 115, 24, 143, 245, 114, 24, 143, 245, 116, 24, 143, 211, 35, 24,
+ 143, 211, 34, 24, 143, 227, 84, 24, 143, 227, 85, 24, 143, 227, 78, 24,
+ 143, 227, 83, 24, 143, 227, 81, 24, 143, 210, 238, 24, 143, 210, 237, 24,
+ 143, 210, 236, 24, 143, 210, 239, 24, 143, 210, 240, 24, 143, 215, 30,
+ 24, 143, 215, 29, 24, 143, 215, 27, 24, 143, 215, 24, 24, 143, 215, 25,
+ 24, 143, 210, 211, 24, 143, 210, 208, 24, 143, 210, 209, 24, 143, 210,
+ 203, 24, 143, 210, 204, 24, 143, 210, 205, 24, 143, 210, 207, 24, 143,
+ 245, 49, 24, 143, 245, 51, 24, 143, 211, 7, 24, 143, 240, 153, 24, 143,
+ 240, 145, 24, 143, 240, 148, 24, 143, 240, 146, 24, 143, 240, 150, 24,
+ 143, 240, 152, 24, 143, 254, 34, 24, 143, 254, 31, 24, 143, 254, 29, 24,
+ 143, 254, 30, 24, 143, 218, 220, 24, 143, 255, 158, 24, 143, 211, 105,
+ 24, 143, 211, 33, 24, 143, 227, 80, 24, 143, 227, 79, 24, 90, 234, 58,
+ 24, 90, 218, 215, 24, 90, 234, 51, 24, 90, 228, 226, 24, 90, 228, 224,
+ 24, 90, 228, 223, 24, 90, 216, 101, 24, 90, 223, 26, 24, 90, 223, 21, 24,
+ 90, 223, 18, 24, 90, 223, 11, 24, 90, 223, 6, 24, 90, 223, 1, 24, 90,
+ 223, 12, 24, 90, 223, 24, 24, 90, 230, 217, 24, 90, 225, 95, 24, 90, 225,
+ 84, 24, 90, 219, 148, 24, 90, 218, 209, 24, 90, 236, 56, 24, 90, 250, 46,
+ 24, 90, 250, 106, 24, 90, 234, 110, 24, 90, 216, 173, 24, 90, 225, 131,
+ 24, 90, 241, 172, 24, 90, 234, 52, 24, 90, 234, 50, 24, 90, 228, 222, 24,
+ 90, 228, 216, 24, 90, 228, 218, 24, 90, 228, 221, 24, 90, 228, 217, 24,
+ 90, 216, 98, 24, 90, 216, 95, 24, 90, 223, 19, 24, 90, 223, 14, 24, 90,
+ 223, 0, 24, 90, 222, 255, 24, 90, 218, 211, 24, 90, 223, 16, 24, 90, 223,
+ 15, 24, 90, 223, 8, 24, 90, 223, 10, 24, 90, 223, 23, 24, 90, 223, 3, 24,
+ 90, 223, 13, 24, 90, 223, 22, 24, 90, 222, 254, 24, 90, 230, 213, 24, 90,
+ 230, 208, 24, 90, 230, 210, 24, 90, 230, 207, 24, 90, 230, 205, 24, 90,
+ 230, 211, 24, 90, 230, 216, 24, 90, 230, 214, 24, 90, 234, 221, 24, 90,
+ 225, 86, 24, 90, 225, 87, 24, 90, 225, 92, 24, 90, 234, 219, 24, 90, 219,
+ 141, 24, 90, 219, 131, 24, 90, 219, 134, 24, 90, 219, 136, 24, 90, 226,
+ 32, 24, 90, 236, 51, 24, 90, 236, 44, 24, 90, 218, 216, 24, 90, 236, 52,
+ 24, 90, 211, 26, 24, 90, 211, 22, 24, 90, 211, 23, 24, 90, 225, 129, 24,
+ 90, 234, 220, 24, 90, 241, 170, 24, 90, 241, 168, 24, 90, 241, 171, 24,
+ 90, 241, 169, 24, 90, 211, 32, 24, 90, 234, 54, 24, 90, 234, 53, 24, 90,
+ 234, 57, 24, 90, 234, 55, 24, 90, 234, 56, 24, 90, 218, 213, 29, 3, 162,
+ 29, 3, 240, 222, 29, 3, 241, 180, 29, 3, 242, 46, 29, 3, 241, 220, 29, 3,
+ 241, 238, 29, 3, 241, 68, 29, 3, 241, 67, 29, 3, 233, 135, 29, 3, 232,
+ 98, 29, 3, 232, 241, 29, 3, 233, 134, 29, 3, 233, 50, 29, 3, 233, 58, 29,
+ 3, 232, 156, 29, 3, 232, 70, 29, 3, 241, 189, 29, 3, 241, 183, 29, 3,
+ 241, 185, 29, 3, 241, 188, 29, 3, 241, 186, 29, 3, 241, 187, 29, 3, 241,
+ 184, 29, 3, 241, 182, 29, 3, 184, 29, 3, 230, 102, 29, 3, 230, 230, 29,
+ 3, 231, 237, 29, 3, 231, 80, 29, 3, 231, 91, 29, 3, 230, 161, 29, 3, 230,
+ 42, 29, 3, 217, 163, 29, 3, 217, 157, 29, 3, 217, 159, 29, 3, 217, 162,
+ 29, 3, 217, 160, 29, 3, 217, 161, 29, 3, 217, 158, 29, 3, 217, 156, 29,
+ 3, 205, 29, 3, 222, 140, 29, 3, 223, 35, 29, 3, 223, 184, 29, 3, 223,
+ 108, 29, 3, 223, 128, 29, 3, 222, 211, 29, 3, 222, 109, 29, 3, 206, 29,
+ 3, 218, 83, 29, 3, 219, 191, 29, 3, 222, 31, 29, 3, 221, 170, 29, 3, 221,
+ 181, 29, 3, 219, 58, 29, 3, 217, 253, 29, 3, 220, 102, 29, 3, 219, 225,
+ 29, 3, 220, 32, 29, 3, 220, 98, 29, 3, 220, 61, 29, 3, 220, 63, 29, 3,
+ 220, 7, 29, 3, 219, 208, 29, 3, 224, 88, 29, 3, 224, 30, 29, 3, 224, 53,
+ 29, 3, 224, 87, 29, 3, 224, 68, 29, 3, 224, 69, 29, 3, 224, 42, 29, 3,
+ 224, 41, 29, 3, 223, 242, 29, 3, 223, 238, 29, 3, 223, 241, 29, 3, 223,
+ 239, 29, 3, 223, 240, 29, 3, 224, 65, 29, 3, 224, 59, 29, 3, 224, 61, 29,
+ 3, 224, 64, 29, 3, 224, 62, 29, 3, 224, 63, 29, 3, 224, 60, 29, 3, 224,
+ 58, 29, 3, 224, 54, 29, 3, 224, 57, 29, 3, 224, 55, 29, 3, 224, 56, 29,
+ 3, 252, 191, 29, 3, 251, 125, 29, 3, 252, 6, 29, 3, 252, 189, 29, 3, 252,
+ 66, 29, 3, 252, 75, 29, 3, 251, 205, 29, 3, 251, 83, 29, 3, 214, 27, 29,
+ 3, 212, 116, 29, 3, 213, 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3,
+ 213, 255, 29, 3, 213, 138, 29, 3, 212, 107, 29, 3, 217, 105, 29, 3, 215,
+ 118, 29, 3, 216, 117, 29, 3, 217, 101, 29, 3, 217, 11, 29, 3, 217, 22,
+ 29, 3, 111, 29, 3, 215, 80, 29, 3, 251, 33, 29, 3, 249, 112, 29, 3, 250,
+ 51, 29, 3, 251, 32, 29, 3, 250, 182, 29, 3, 250, 190, 29, 3, 249, 238,
+ 29, 3, 249, 81, 29, 3, 211, 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3,
+ 211, 164, 29, 3, 211, 161, 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211,
+ 147, 29, 3, 211, 136, 29, 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133,
+ 29, 3, 211, 134, 29, 3, 197, 29, 3, 227, 237, 29, 3, 228, 233, 29, 3,
+ 229, 225, 29, 3, 229, 103, 29, 3, 229, 107, 29, 3, 228, 74, 29, 3, 227,
+ 174, 29, 3, 227, 165, 29, 3, 227, 128, 29, 3, 227, 148, 29, 3, 227, 164,
+ 29, 3, 227, 155, 29, 3, 227, 156, 29, 3, 227, 134, 29, 3, 227, 119, 29,
+ 3, 242, 180, 61, 29, 3, 242, 180, 70, 29, 3, 242, 180, 73, 29, 3, 242,
+ 180, 255, 73, 29, 3, 242, 180, 245, 209, 29, 3, 242, 180, 75, 29, 3, 242,
+ 180, 76, 29, 3, 242, 180, 212, 65, 29, 3, 176, 29, 3, 233, 217, 29, 3,
+ 234, 92, 29, 3, 235, 10, 29, 3, 234, 181, 29, 3, 234, 182, 29, 3, 234,
+ 28, 29, 3, 234, 27, 29, 3, 233, 182, 29, 3, 233, 176, 29, 3, 233, 181,
+ 29, 3, 233, 177, 29, 3, 233, 178, 29, 3, 233, 171, 29, 3, 233, 165, 29,
+ 3, 233, 167, 29, 3, 233, 170, 29, 3, 233, 168, 29, 3, 233, 169, 29, 3,
+ 233, 166, 29, 3, 233, 164, 29, 3, 233, 160, 29, 3, 233, 163, 29, 3, 233,
+ 161, 29, 3, 233, 162, 29, 3, 212, 65, 29, 3, 211, 195, 29, 3, 211, 250,
+ 29, 3, 212, 64, 29, 3, 212, 17, 29, 3, 212, 22, 29, 3, 211, 227, 29, 3,
+ 211, 226, 29, 3, 225, 139, 61, 29, 3, 225, 139, 70, 29, 3, 225, 139, 73,
+ 29, 3, 225, 139, 255, 73, 29, 3, 225, 139, 245, 209, 29, 3, 225, 139, 75,
+ 29, 3, 225, 139, 76, 29, 3, 210, 116, 29, 3, 210, 13, 29, 3, 210, 44, 29,
+ 3, 210, 115, 29, 3, 210, 92, 29, 3, 210, 94, 29, 3, 210, 23, 29, 3, 210,
+ 0, 29, 3, 210, 82, 29, 3, 210, 62, 29, 3, 210, 69, 29, 3, 210, 81, 29, 3,
+ 210, 73, 29, 3, 210, 74, 29, 3, 210, 67, 29, 3, 210, 53, 29, 3, 191, 29,
+ 3, 210, 212, 29, 3, 211, 8, 29, 3, 211, 103, 29, 3, 211, 44, 29, 3, 211,
+ 47, 29, 3, 210, 244, 29, 3, 210, 235, 29, 3, 248, 221, 29, 3, 246, 78,
+ 29, 3, 248, 3, 29, 3, 248, 220, 29, 3, 248, 77, 29, 3, 248, 90, 29, 3,
+ 247, 145, 29, 3, 246, 47, 29, 3, 248, 135, 29, 3, 248, 100, 29, 3, 248,
+ 112, 29, 3, 248, 134, 29, 3, 248, 122, 29, 3, 248, 123, 29, 3, 248, 105,
+ 29, 3, 248, 91, 29, 3, 235, 141, 29, 3, 235, 51, 29, 3, 235, 108, 29, 3,
+ 235, 140, 29, 3, 235, 124, 29, 3, 235, 126, 29, 3, 235, 68, 29, 3, 235,
+ 31, 29, 3, 243, 135, 29, 3, 242, 113, 29, 3, 242, 214, 29, 3, 243, 132,
+ 29, 3, 243, 55, 29, 3, 243, 62, 29, 3, 242, 174, 29, 3, 242, 173, 29, 3,
+ 242, 78, 29, 3, 242, 74, 29, 3, 242, 77, 29, 3, 242, 75, 29, 3, 242, 76,
+ 29, 3, 243, 29, 29, 3, 243, 9, 29, 3, 243, 19, 29, 3, 243, 28, 29, 3,
+ 243, 23, 29, 3, 243, 24, 29, 3, 243, 13, 29, 3, 242, 254, 29, 3, 216,
+ 208, 29, 3, 216, 136, 29, 3, 216, 175, 29, 3, 216, 207, 29, 3, 216, 194,
+ 29, 3, 216, 195, 29, 3, 216, 156, 29, 3, 216, 128, 29, 3, 250, 157, 29,
+ 3, 250, 69, 29, 3, 250, 110, 29, 3, 250, 156, 29, 3, 250, 128, 29, 3,
+ 250, 131, 29, 3, 250, 86, 29, 3, 250, 58, 29, 3, 225, 147, 29, 3, 225,
+ 114, 29, 3, 225, 133, 29, 3, 225, 146, 29, 3, 225, 135, 29, 3, 225, 136,
+ 29, 3, 225, 121, 29, 3, 225, 110, 29, 3, 215, 183, 29, 3, 215, 163, 29,
+ 3, 215, 167, 29, 3, 215, 182, 29, 3, 215, 177, 29, 3, 215, 178, 29, 3,
+ 215, 166, 29, 3, 215, 161, 29, 3, 215, 39, 29, 3, 215, 31, 29, 3, 215,
+ 35, 29, 3, 215, 38, 29, 3, 215, 36, 29, 3, 215, 37, 29, 3, 215, 33, 29,
+ 3, 215, 32, 29, 3, 244, 196, 29, 3, 243, 234, 29, 3, 244, 121, 29, 3,
+ 244, 195, 29, 3, 244, 147, 29, 3, 244, 154, 29, 3, 244, 43, 29, 3, 243,
+ 213, 29, 3, 190, 29, 3, 224, 150, 29, 3, 225, 108, 29, 3, 226, 89, 29, 3,
+ 225, 211, 29, 3, 225, 221, 29, 3, 225, 16, 29, 3, 224, 114, 29, 3, 222,
+ 99, 29, 3, 230, 31, 29, 3, 243, 207, 29, 38, 243, 53, 22, 25, 233, 23,
+ 78, 29, 38, 25, 233, 23, 78, 29, 38, 243, 53, 78, 29, 221, 173, 78, 29,
+ 211, 208, 29, 243, 229, 218, 129, 29, 249, 219, 29, 220, 150, 29, 249,
+ 226, 29, 224, 199, 249, 226, 29, 224, 13, 78, 29, 226, 15, 220, 137, 29,
+ 21, 110, 29, 21, 105, 29, 21, 158, 29, 21, 161, 29, 21, 189, 29, 21, 194,
+ 29, 21, 198, 29, 21, 195, 29, 21, 200, 29, 54, 216, 247, 29, 54, 215, 73,
+ 29, 54, 216, 162, 29, 54, 244, 15, 29, 54, 244, 114, 29, 54, 219, 111,
+ 29, 54, 220, 116, 29, 54, 245, 184, 29, 54, 228, 195, 29, 54, 240, 210,
+ 29, 54, 216, 248, 216, 147, 29, 3, 221, 177, 230, 42, 29, 3, 230, 38, 29,
+ 3, 230, 39, 29, 3, 230, 40, 29, 3, 221, 177, 251, 83, 29, 3, 251, 80, 29,
+ 3, 251, 81, 29, 3, 251, 82, 29, 3, 221, 177, 243, 213, 29, 3, 243, 209,
+ 29, 3, 243, 210, 29, 3, 243, 211, 29, 3, 221, 177, 224, 114, 29, 3, 224,
+ 110, 29, 3, 224, 111, 29, 3, 224, 112, 29, 216, 31, 164, 210, 247, 29,
+ 216, 31, 164, 248, 41, 29, 216, 31, 164, 222, 238, 29, 216, 31, 164, 219,
+ 251, 222, 238, 29, 216, 31, 164, 247, 235, 29, 216, 31, 164, 234, 164,
+ 29, 216, 31, 164, 250, 94, 29, 216, 31, 164, 241, 177, 29, 216, 31, 164,
+ 248, 40, 29, 216, 31, 164, 233, 194, 169, 1, 61, 169, 1, 75, 169, 1, 73,
+ 169, 1, 76, 169, 1, 70, 169, 1, 214, 105, 169, 1, 243, 135, 169, 1, 176,
+ 169, 1, 243, 62, 169, 1, 242, 214, 169, 1, 242, 174, 169, 1, 242, 113,
+ 169, 1, 242, 79, 169, 1, 162, 169, 1, 241, 238, 169, 1, 241, 180, 169, 1,
+ 241, 68, 169, 1, 240, 222, 169, 1, 240, 201, 169, 1, 233, 135, 169, 1,
+ 233, 58, 169, 1, 232, 241, 169, 1, 232, 156, 169, 1, 232, 98, 169, 1,
+ 232, 71, 169, 1, 184, 169, 1, 231, 91, 169, 1, 230, 230, 169, 1, 230,
+ 161, 169, 1, 230, 102, 169, 1, 197, 169, 1, 241, 90, 169, 1, 229, 213,
+ 169, 1, 229, 107, 169, 1, 228, 233, 169, 1, 228, 74, 169, 1, 227, 237,
+ 169, 1, 227, 176, 169, 1, 224, 29, 169, 1, 224, 16, 169, 1, 224, 9, 169,
+ 1, 224, 1, 169, 1, 223, 246, 169, 1, 223, 244, 169, 1, 206, 169, 1, 222,
+ 91, 169, 1, 221, 181, 169, 1, 219, 191, 169, 1, 219, 58, 169, 1, 218, 83,
+ 169, 1, 218, 2, 169, 1, 248, 221, 169, 1, 217, 105, 169, 1, 248, 90, 169,
+ 1, 217, 22, 169, 1, 248, 3, 169, 1, 216, 117, 169, 1, 247, 145, 169, 1,
+ 246, 78, 169, 1, 246, 50, 169, 1, 247, 156, 169, 1, 216, 59, 169, 1, 216,
+ 58, 169, 1, 216, 47, 169, 1, 216, 46, 169, 1, 216, 45, 169, 1, 216, 44,
+ 169, 1, 215, 183, 169, 1, 215, 178, 169, 1, 215, 167, 169, 1, 215, 166,
+ 169, 1, 215, 163, 169, 1, 215, 162, 169, 1, 212, 65, 169, 1, 212, 22,
+ 169, 1, 211, 250, 169, 1, 211, 227, 169, 1, 211, 195, 169, 1, 211, 183,
+ 169, 1, 191, 169, 1, 211, 47, 169, 1, 211, 8, 169, 1, 210, 244, 169, 1,
+ 210, 212, 169, 1, 210, 177, 18, 19, 240, 168, 18, 19, 75, 18, 19, 255,
+ 37, 18, 19, 73, 18, 19, 236, 33, 18, 19, 76, 18, 19, 226, 183, 18, 19,
+ 211, 116, 226, 183, 18, 19, 72, 245, 209, 18, 19, 72, 73, 18, 19, 61, 18,
+ 19, 255, 73, 18, 19, 212, 22, 18, 19, 159, 212, 22, 18, 19, 211, 250, 18,
+ 19, 159, 211, 250, 18, 19, 211, 242, 18, 19, 159, 211, 242, 18, 19, 211,
+ 227, 18, 19, 159, 211, 227, 18, 19, 211, 215, 18, 19, 159, 211, 215, 18,
+ 19, 229, 190, 211, 215, 18, 19, 212, 65, 18, 19, 159, 212, 65, 18, 19,
+ 212, 64, 18, 19, 159, 212, 64, 18, 19, 229, 190, 212, 64, 18, 19, 254,
+ 201, 18, 19, 211, 116, 212, 98, 18, 19, 242, 180, 218, 129, 18, 19, 40,
+ 142, 18, 19, 40, 242, 136, 18, 19, 40, 251, 175, 163, 222, 233, 18, 19,
+ 40, 216, 14, 163, 222, 233, 18, 19, 40, 44, 163, 222, 233, 18, 19, 40,
+ 222, 233, 18, 19, 40, 52, 142, 18, 19, 40, 52, 219, 251, 67, 218, 90, 18,
+ 19, 40, 230, 224, 247, 120, 18, 19, 40, 219, 251, 203, 91, 18, 19, 40,
+ 225, 22, 18, 19, 40, 124, 217, 87, 18, 19, 245, 150, 18, 19, 235, 255,
+ 18, 19, 226, 196, 18, 19, 254, 123, 18, 19, 225, 221, 18, 19, 226, 87,
+ 18, 19, 225, 108, 18, 19, 225, 71, 18, 19, 225, 16, 18, 19, 224, 249, 18,
+ 19, 211, 116, 224, 249, 18, 19, 72, 241, 220, 18, 19, 72, 241, 180, 18,
+ 19, 190, 18, 19, 226, 89, 18, 19, 224, 112, 18, 19, 159, 224, 112, 18,
+ 19, 224, 110, 18, 19, 159, 224, 110, 18, 19, 224, 109, 18, 19, 159, 224,
+ 109, 18, 19, 224, 107, 18, 19, 159, 224, 107, 18, 19, 224, 106, 18, 19,
+ 159, 224, 106, 18, 19, 224, 114, 18, 19, 159, 224, 114, 18, 19, 224, 113,
+ 18, 19, 159, 224, 113, 18, 19, 211, 116, 224, 113, 18, 19, 226, 105, 18,
+ 19, 159, 226, 105, 18, 19, 72, 242, 60, 18, 19, 217, 22, 18, 19, 217, 99,
+ 18, 19, 216, 117, 18, 19, 216, 103, 18, 19, 111, 18, 19, 216, 17, 18, 19,
+ 211, 116, 216, 17, 18, 19, 72, 248, 77, 18, 19, 72, 248, 3, 18, 19, 217,
+ 105, 18, 19, 217, 101, 18, 19, 215, 78, 18, 19, 159, 215, 78, 18, 19,
+ 215, 62, 18, 19, 159, 215, 62, 18, 19, 215, 61, 18, 19, 159, 215, 61, 18,
+ 19, 105, 18, 19, 159, 105, 18, 19, 215, 54, 18, 19, 159, 215, 54, 18, 19,
+ 215, 80, 18, 19, 159, 215, 80, 18, 19, 215, 79, 18, 19, 159, 215, 79, 18,
+ 19, 229, 190, 215, 79, 18, 19, 217, 152, 18, 19, 215, 151, 18, 19, 215,
+ 135, 18, 19, 215, 133, 18, 19, 215, 156, 18, 19, 234, 182, 18, 19, 235,
+ 7, 18, 19, 234, 92, 18, 19, 234, 83, 18, 19, 234, 28, 18, 19, 234, 10,
+ 18, 19, 211, 116, 234, 10, 18, 19, 176, 18, 19, 235, 10, 18, 19, 233,
+ 178, 18, 19, 159, 233, 178, 18, 19, 233, 176, 18, 19, 159, 233, 176, 18,
+ 19, 233, 175, 18, 19, 159, 233, 175, 18, 19, 233, 174, 18, 19, 159, 233,
+ 174, 18, 19, 233, 173, 18, 19, 159, 233, 173, 18, 19, 233, 182, 18, 19,
+ 159, 233, 182, 18, 19, 233, 181, 18, 19, 159, 233, 181, 18, 19, 229, 190,
+ 233, 181, 18, 19, 235, 23, 18, 19, 233, 183, 18, 19, 219, 27, 234, 176,
+ 18, 19, 219, 27, 234, 84, 18, 19, 219, 27, 234, 23, 18, 19, 219, 27, 234,
+ 248, 18, 19, 250, 190, 18, 19, 251, 31, 18, 19, 250, 51, 18, 19, 250, 41,
+ 18, 19, 249, 238, 18, 19, 249, 174, 18, 19, 211, 116, 249, 174, 18, 19,
+ 251, 33, 18, 19, 251, 32, 18, 19, 249, 79, 18, 19, 159, 249, 79, 18, 19,
+ 249, 77, 18, 19, 159, 249, 77, 18, 19, 249, 76, 18, 19, 159, 249, 76, 18,
+ 19, 249, 75, 18, 19, 159, 249, 75, 18, 19, 249, 74, 18, 19, 159, 249, 74,
+ 18, 19, 249, 81, 18, 19, 159, 249, 81, 18, 19, 249, 80, 18, 19, 159, 249,
+ 80, 18, 19, 229, 190, 249, 80, 18, 19, 251, 66, 18, 19, 221, 209, 216,
+ 210, 18, 19, 231, 91, 18, 19, 231, 236, 18, 19, 230, 230, 18, 19, 230,
+ 201, 18, 19, 230, 161, 18, 19, 230, 132, 18, 19, 211, 116, 230, 132, 18,
+ 19, 184, 18, 19, 231, 237, 18, 19, 230, 40, 18, 19, 159, 230, 40, 18, 19,
+ 230, 38, 18, 19, 159, 230, 38, 18, 19, 230, 37, 18, 19, 159, 230, 37, 18,
+ 19, 230, 36, 18, 19, 159, 230, 36, 18, 19, 230, 35, 18, 19, 159, 230, 35,
+ 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 230, 41, 18, 19, 159, 230,
+ 41, 18, 19, 229, 190, 230, 41, 18, 19, 193, 18, 19, 159, 193, 18, 19,
+ 230, 234, 18, 19, 253, 205, 193, 18, 19, 221, 209, 193, 18, 19, 229, 107,
+ 18, 19, 229, 224, 18, 19, 228, 233, 18, 19, 228, 208, 18, 19, 228, 74,
+ 18, 19, 228, 64, 18, 19, 211, 116, 228, 64, 18, 19, 197, 18, 19, 229,
+ 225, 18, 19, 227, 172, 18, 19, 159, 227, 172, 18, 19, 227, 174, 18, 19,
+ 159, 227, 174, 18, 19, 227, 173, 18, 19, 159, 227, 173, 18, 19, 229, 190,
+ 227, 173, 18, 19, 230, 25, 18, 19, 72, 229, 79, 18, 19, 228, 238, 18, 19,
+ 233, 58, 18, 19, 233, 133, 18, 19, 232, 241, 18, 19, 232, 227, 18, 19,
+ 232, 156, 18, 19, 232, 127, 18, 19, 211, 116, 232, 127, 18, 19, 233, 135,
+ 18, 19, 233, 134, 18, 19, 232, 68, 18, 19, 159, 232, 68, 18, 19, 232, 67,
+ 18, 19, 159, 232, 67, 18, 19, 232, 66, 18, 19, 159, 232, 66, 18, 19, 232,
+ 65, 18, 19, 159, 232, 65, 18, 19, 232, 64, 18, 19, 159, 232, 64, 18, 19,
+ 232, 70, 18, 19, 159, 232, 70, 18, 19, 232, 69, 18, 19, 159, 232, 69, 18,
+ 19, 156, 18, 19, 159, 156, 18, 19, 147, 156, 18, 19, 221, 181, 18, 19,
+ 222, 29, 18, 19, 219, 191, 18, 19, 219, 175, 18, 19, 219, 58, 18, 19,
+ 219, 40, 18, 19, 211, 116, 219, 40, 18, 19, 206, 18, 19, 222, 31, 18, 19,
+ 217, 249, 18, 19, 159, 217, 249, 18, 19, 217, 243, 18, 19, 159, 217, 243,
+ 18, 19, 217, 242, 18, 19, 159, 217, 242, 18, 19, 217, 238, 18, 19, 159,
+ 217, 238, 18, 19, 217, 237, 18, 19, 159, 217, 237, 18, 19, 217, 253, 18,
+ 19, 159, 217, 253, 18, 19, 217, 252, 18, 19, 159, 217, 252, 18, 19, 229,
+ 190, 217, 252, 18, 19, 222, 91, 18, 19, 253, 205, 222, 91, 18, 19, 217,
+ 254, 18, 19, 251, 218, 222, 91, 18, 19, 230, 127, 219, 108, 18, 19, 229,
+ 190, 219, 99, 18, 19, 229, 190, 222, 89, 18, 19, 229, 190, 218, 235, 18,
+ 19, 229, 190, 218, 86, 18, 19, 229, 190, 219, 98, 18, 19, 229, 190, 221,
+ 184, 18, 19, 220, 63, 18, 19, 220, 32, 18, 19, 220, 27, 18, 19, 220, 7,
+ 18, 19, 220, 1, 18, 19, 220, 102, 18, 19, 220, 98, 18, 19, 219, 206, 18,
+ 19, 159, 219, 206, 18, 19, 219, 205, 18, 19, 159, 219, 205, 18, 19, 219,
+ 204, 18, 19, 159, 219, 204, 18, 19, 219, 203, 18, 19, 159, 219, 203, 18,
+ 19, 219, 202, 18, 19, 159, 219, 202, 18, 19, 219, 208, 18, 19, 159, 219,
+ 208, 18, 19, 219, 207, 18, 19, 159, 219, 207, 18, 19, 220, 104, 18, 19,
+ 211, 47, 18, 19, 211, 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210,
+ 244, 18, 19, 210, 229, 18, 19, 211, 116, 210, 229, 18, 19, 191, 18, 19,
+ 211, 103, 18, 19, 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18,
+ 19, 159, 210, 173, 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210,
+ 171, 18, 19, 159, 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18,
+ 19, 210, 176, 18, 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210,
+ 175, 18, 19, 229, 190, 210, 175, 18, 19, 211, 117, 18, 19, 252, 4, 211,
+ 117, 18, 19, 159, 211, 117, 18, 19, 221, 209, 211, 8, 18, 19, 223, 128,
+ 18, 19, 223, 223, 223, 128, 18, 19, 159, 233, 58, 18, 19, 223, 183, 18,
+ 19, 223, 35, 18, 19, 222, 239, 18, 19, 222, 211, 18, 19, 222, 197, 18,
+ 19, 159, 232, 156, 18, 19, 205, 18, 19, 223, 184, 18, 19, 159, 233, 135,
+ 18, 19, 222, 108, 18, 19, 159, 222, 108, 18, 19, 153, 18, 19, 159, 153,
+ 18, 19, 147, 153, 18, 19, 244, 154, 18, 19, 244, 193, 18, 19, 244, 121,
+ 18, 19, 244, 108, 18, 19, 244, 43, 18, 19, 244, 34, 18, 19, 244, 196, 18,
+ 19, 244, 195, 18, 19, 243, 212, 18, 19, 159, 243, 212, 18, 19, 245, 6,
+ 18, 19, 216, 195, 18, 19, 230, 23, 216, 195, 18, 19, 216, 175, 18, 19,
+ 230, 23, 216, 175, 18, 19, 216, 171, 18, 19, 230, 23, 216, 171, 18, 19,
+ 216, 156, 18, 19, 216, 153, 18, 19, 216, 208, 18, 19, 216, 207, 18, 19,
+ 216, 127, 18, 19, 159, 216, 127, 18, 19, 216, 210, 18, 19, 215, 142, 18,
+ 19, 215, 140, 18, 19, 215, 139, 18, 19, 215, 144, 18, 19, 215, 145, 18,
+ 19, 215, 52, 18, 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19,
+ 227, 193, 241, 238, 18, 19, 227, 193, 241, 180, 18, 19, 227, 193, 241,
+ 161, 18, 19, 227, 193, 241, 68, 18, 19, 227, 193, 241, 53, 18, 19, 227,
+ 193, 162, 18, 19, 227, 193, 242, 46, 18, 19, 227, 193, 242, 60, 18, 19,
+ 227, 192, 242, 60, 18, 19, 241, 154, 18, 19, 224, 84, 18, 19, 224, 53,
+ 18, 19, 224, 48, 18, 19, 224, 42, 18, 19, 224, 37, 18, 19, 224, 88, 18,
+ 19, 224, 87, 18, 19, 224, 96, 18, 19, 216, 55, 18, 19, 216, 53, 18, 19,
+ 216, 52, 18, 19, 216, 56, 18, 19, 159, 223, 128, 18, 19, 159, 223, 35,
+ 18, 19, 159, 222, 211, 18, 19, 159, 205, 18, 19, 229, 75, 18, 19, 229,
+ 27, 18, 19, 229, 23, 18, 19, 229, 4, 18, 19, 228, 255, 18, 19, 229, 77,
+ 18, 19, 229, 76, 18, 19, 229, 79, 18, 19, 228, 103, 18, 19, 221, 209,
+ 220, 63, 18, 19, 221, 209, 220, 32, 18, 19, 221, 209, 220, 7, 18, 19,
+ 221, 209, 220, 102, 18, 19, 211, 213, 216, 195, 18, 19, 211, 213, 216,
+ 175, 18, 19, 211, 213, 216, 156, 18, 19, 211, 213, 216, 208, 18, 19, 211,
+ 213, 216, 210, 18, 19, 232, 248, 18, 19, 232, 247, 18, 19, 232, 246, 18,
+ 19, 232, 245, 18, 19, 232, 254, 18, 19, 232, 253, 18, 19, 232, 255, 18,
+ 19, 216, 209, 216, 195, 18, 19, 216, 209, 216, 175, 18, 19, 216, 209,
+ 216, 171, 18, 19, 216, 209, 216, 156, 18, 19, 216, 209, 216, 153, 18, 19,
+ 216, 209, 216, 208, 18, 19, 216, 209, 216, 207, 18, 19, 216, 209, 216,
+ 210, 18, 19, 254, 189, 253, 158, 18, 19, 251, 218, 75, 18, 19, 251, 218,
+ 73, 18, 19, 251, 218, 76, 18, 19, 251, 218, 61, 18, 19, 251, 218, 212,
+ 22, 18, 19, 251, 218, 211, 250, 18, 19, 251, 218, 211, 227, 18, 19, 251,
+ 218, 212, 65, 18, 19, 251, 218, 229, 107, 18, 19, 251, 218, 228, 233, 18,
+ 19, 251, 218, 228, 74, 18, 19, 251, 218, 197, 18, 19, 251, 218, 234, 182,
+ 18, 19, 251, 218, 234, 92, 18, 19, 251, 218, 234, 28, 18, 19, 251, 218,
+ 176, 18, 19, 221, 209, 241, 238, 18, 19, 221, 209, 241, 180, 18, 19, 221,
+ 209, 241, 68, 18, 19, 221, 209, 162, 18, 19, 72, 242, 220, 18, 19, 72,
+ 242, 224, 18, 19, 72, 242, 236, 18, 19, 72, 242, 235, 18, 19, 72, 242,
+ 225, 18, 19, 72, 242, 249, 18, 19, 72, 222, 140, 18, 19, 72, 222, 211,
+ 18, 19, 72, 223, 128, 18, 19, 72, 223, 108, 18, 19, 72, 223, 35, 18, 19,
+ 72, 205, 18, 19, 72, 211, 195, 18, 19, 72, 211, 227, 18, 19, 72, 212, 22,
+ 18, 19, 72, 212, 17, 18, 19, 72, 211, 250, 18, 19, 72, 212, 65, 18, 19,
+ 72, 240, 194, 18, 19, 72, 240, 195, 18, 19, 72, 240, 198, 18, 19, 72,
+ 240, 197, 18, 19, 72, 240, 196, 18, 19, 72, 240, 200, 18, 19, 72, 216,
+ 136, 18, 19, 72, 216, 156, 18, 19, 72, 216, 195, 18, 19, 72, 216, 194,
+ 18, 19, 72, 216, 175, 18, 19, 72, 216, 208, 18, 19, 72, 215, 123, 18, 19,
+ 72, 215, 133, 18, 19, 72, 215, 151, 18, 19, 72, 215, 150, 18, 19, 72,
+ 215, 135, 18, 19, 72, 215, 156, 18, 19, 72, 224, 150, 18, 19, 72, 225,
+ 16, 18, 19, 72, 225, 221, 18, 19, 72, 225, 211, 18, 19, 72, 225, 108, 18,
+ 19, 72, 190, 18, 19, 72, 226, 105, 18, 19, 72, 242, 113, 18, 19, 72, 242,
+ 174, 18, 19, 72, 243, 62, 18, 19, 72, 243, 55, 18, 19, 72, 242, 214, 18,
+ 19, 72, 243, 135, 18, 19, 72, 234, 100, 18, 19, 72, 234, 105, 18, 19, 72,
+ 234, 119, 18, 19, 72, 234, 118, 18, 19, 72, 234, 112, 18, 19, 72, 234,
+ 132, 18, 19, 72, 234, 41, 18, 19, 72, 234, 42, 18, 19, 72, 234, 45, 18,
+ 19, 72, 234, 44, 18, 19, 72, 234, 43, 18, 19, 72, 234, 46, 18, 19, 72,
+ 234, 47, 18, 19, 72, 227, 237, 18, 19, 72, 228, 74, 18, 19, 72, 229, 107,
+ 18, 19, 72, 229, 103, 18, 19, 72, 228, 233, 18, 19, 72, 197, 18, 19, 72,
+ 230, 102, 18, 19, 72, 230, 161, 18, 19, 72, 231, 91, 18, 19, 72, 231, 80,
+ 18, 19, 72, 230, 230, 18, 19, 72, 184, 18, 19, 72, 210, 212, 18, 19, 72,
+ 210, 244, 18, 19, 72, 211, 47, 18, 19, 72, 211, 44, 18, 19, 72, 211, 8,
+ 18, 19, 72, 191, 18, 19, 72, 235, 51, 18, 19, 221, 209, 235, 51, 18, 19,
+ 72, 235, 68, 18, 19, 72, 235, 126, 18, 19, 72, 235, 124, 18, 19, 72, 235,
+ 108, 18, 19, 221, 209, 235, 108, 18, 19, 72, 235, 141, 18, 19, 72, 235,
+ 81, 18, 19, 72, 235, 85, 18, 19, 72, 235, 95, 18, 19, 72, 235, 94, 18,
+ 19, 72, 235, 93, 18, 19, 72, 235, 96, 18, 19, 72, 232, 98, 18, 19, 72,
+ 232, 156, 18, 19, 72, 233, 58, 18, 19, 72, 233, 50, 18, 19, 72, 232, 241,
+ 18, 19, 72, 233, 135, 18, 19, 72, 247, 149, 18, 19, 72, 247, 150, 18, 19,
+ 72, 247, 155, 18, 19, 72, 247, 154, 18, 19, 72, 247, 151, 18, 19, 72,
+ 247, 156, 18, 19, 72, 232, 244, 18, 19, 72, 232, 246, 18, 19, 72, 232,
+ 250, 18, 19, 72, 232, 249, 18, 19, 72, 232, 248, 18, 19, 72, 232, 254,
+ 18, 19, 72, 216, 50, 18, 19, 72, 216, 52, 18, 19, 72, 216, 55, 18, 19,
+ 72, 216, 54, 18, 19, 72, 216, 53, 18, 19, 72, 216, 56, 18, 19, 72, 216,
+ 45, 18, 19, 72, 216, 46, 18, 19, 72, 216, 58, 18, 19, 72, 216, 57, 18,
+ 19, 72, 216, 47, 18, 19, 72, 216, 59, 18, 19, 72, 210, 13, 18, 19, 72,
+ 210, 23, 18, 19, 72, 210, 94, 18, 19, 72, 210, 92, 18, 19, 72, 210, 44,
+ 18, 19, 72, 210, 116, 18, 19, 72, 210, 159, 18, 19, 72, 65, 210, 159, 18,
+ 19, 72, 246, 28, 18, 19, 72, 246, 29, 18, 19, 72, 246, 36, 18, 19, 72,
+ 246, 35, 18, 19, 72, 246, 31, 18, 19, 72, 246, 38, 18, 19, 72, 218, 83,
+ 18, 19, 72, 219, 58, 18, 19, 72, 221, 181, 18, 19, 72, 221, 170, 18, 19,
+ 72, 219, 191, 18, 19, 72, 206, 18, 19, 72, 219, 225, 18, 19, 72, 220, 7,
+ 18, 19, 72, 220, 63, 18, 19, 72, 220, 61, 18, 19, 72, 220, 32, 18, 19,
+ 72, 220, 102, 18, 19, 72, 220, 104, 18, 19, 72, 215, 163, 18, 19, 72,
+ 215, 166, 18, 19, 72, 215, 178, 18, 19, 72, 215, 177, 18, 19, 72, 215,
+ 167, 18, 19, 72, 215, 183, 18, 19, 72, 250, 69, 18, 19, 72, 250, 86, 18,
+ 19, 72, 250, 131, 18, 19, 72, 250, 128, 18, 19, 72, 250, 110, 18, 19, 72,
+ 250, 157, 18, 19, 72, 215, 126, 18, 19, 72, 215, 127, 18, 19, 72, 215,
+ 130, 18, 19, 72, 215, 129, 18, 19, 72, 215, 128, 18, 19, 72, 215, 131,
+ 18, 19, 250, 111, 50, 18, 19, 243, 229, 218, 129, 18, 19, 224, 80, 18,
+ 19, 229, 73, 18, 19, 228, 100, 18, 19, 228, 99, 18, 19, 228, 98, 18, 19,
+ 228, 97, 18, 19, 228, 102, 18, 19, 228, 101, 18, 19, 211, 213, 216, 125,
+ 18, 19, 211, 213, 216, 124, 18, 19, 211, 213, 216, 123, 18, 19, 211, 213,
+ 216, 122, 18, 19, 211, 213, 216, 121, 18, 19, 211, 213, 216, 128, 18, 19,
+ 211, 213, 216, 127, 18, 19, 211, 213, 40, 216, 210, 18, 19, 251, 218,
+ 212, 98, 226, 226, 219, 19, 78, 226, 226, 1, 252, 48, 226, 226, 1, 232,
+ 87, 226, 226, 1, 244, 151, 226, 226, 1, 222, 15, 226, 226, 1, 228, 193,
+ 226, 226, 1, 214, 226, 226, 226, 1, 248, 197, 226, 226, 1, 216, 80, 226,
+ 226, 1, 249, 229, 226, 226, 1, 250, 180, 226, 226, 1, 230, 91, 226, 226,
+ 1, 242, 156, 226, 226, 1, 229, 63, 226, 226, 1, 218, 122, 226, 226, 1,
+ 222, 135, 226, 226, 1, 254, 198, 226, 226, 1, 226, 187, 226, 226, 1, 214,
+ 150, 226, 226, 1, 245, 231, 226, 226, 1, 235, 188, 226, 226, 1, 245, 232,
+ 226, 226, 1, 226, 158, 226, 226, 1, 214, 206, 226, 226, 1, 236, 39, 226,
+ 226, 1, 245, 229, 226, 226, 1, 225, 202, 226, 226, 244, 150, 78, 226,
+ 226, 223, 49, 244, 150, 78, 178, 1, 244, 141, 244, 133, 244, 155, 245, 6,
+ 178, 1, 214, 105, 178, 1, 214, 135, 214, 151, 70, 178, 1, 210, 214, 178,
+ 1, 211, 117, 178, 1, 212, 98, 178, 1, 216, 130, 216, 129, 216, 151, 178,
+ 1, 245, 59, 178, 1, 254, 93, 61, 178, 1, 226, 143, 76, 178, 1, 255, 17,
+ 61, 178, 1, 254, 227, 178, 1, 232, 133, 76, 178, 1, 219, 244, 76, 178, 1,
+ 76, 178, 1, 226, 234, 178, 1, 226, 196, 178, 1, 223, 164, 223, 177, 223,
+ 94, 153, 178, 1, 234, 193, 178, 1, 250, 177, 178, 1, 234, 194, 235, 23,
+ 178, 1, 243, 202, 178, 1, 245, 138, 178, 1, 243, 58, 242, 66, 243, 202,
+ 178, 1, 243, 96, 178, 1, 211, 188, 211, 182, 212, 98, 178, 1, 242, 38,
+ 242, 60, 178, 1, 242, 42, 242, 60, 178, 1, 232, 135, 242, 60, 178, 1,
+ 219, 247, 242, 60, 178, 1, 229, 185, 227, 157, 229, 186, 230, 25, 178, 1,
+ 219, 245, 230, 25, 178, 1, 246, 115, 178, 1, 235, 168, 235, 172, 235,
+ 162, 73, 178, 1, 75, 178, 1, 235, 117, 235, 144, 178, 1, 243, 43, 178, 1,
+ 232, 136, 254, 243, 178, 1, 219, 249, 61, 178, 1, 235, 154, 245, 113,
+ 178, 1, 225, 164, 225, 186, 226, 105, 178, 1, 254, 163, 245, 111, 178, 1,
+ 219, 24, 222, 91, 178, 1, 219, 179, 232, 132, 222, 91, 178, 1, 219, 243,
+ 222, 91, 178, 1, 251, 66, 178, 1, 210, 159, 178, 1, 216, 63, 216, 73,
+ 215, 41, 217, 152, 178, 1, 219, 242, 217, 152, 178, 1, 249, 60, 178, 1,
+ 252, 31, 252, 34, 251, 224, 253, 158, 178, 1, 219, 248, 253, 158, 178, 1,
+ 246, 114, 178, 1, 226, 171, 178, 1, 245, 196, 245, 198, 75, 178, 1, 231,
+ 178, 231, 186, 193, 178, 1, 232, 134, 193, 178, 1, 219, 246, 193, 178, 1,
+ 233, 73, 233, 114, 232, 143, 156, 178, 1, 246, 116, 178, 1, 235, 230,
+ 178, 1, 235, 231, 178, 1, 248, 210, 248, 215, 249, 60, 178, 1, 226, 138,
+ 245, 58, 76, 178, 1, 245, 227, 178, 1, 235, 187, 178, 1, 249, 78, 178, 1,
+ 251, 17, 178, 1, 250, 189, 178, 1, 218, 161, 178, 1, 232, 131, 178, 1,
+ 219, 241, 178, 1, 240, 110, 178, 1, 224, 96, 178, 1, 211, 178, 178, 219,
+ 155, 224, 140, 178, 230, 85, 224, 140, 178, 249, 131, 224, 140, 178, 254,
+ 6, 87, 178, 215, 82, 87, 178, 252, 46, 87, 217, 83, 1, 61, 217, 83, 1,
+ 73, 217, 83, 1, 70, 217, 83, 1, 176, 217, 83, 1, 243, 135, 217, 83, 1,
+ 229, 77, 217, 83, 1, 217, 105, 217, 83, 1, 248, 221, 217, 83, 1, 197,
+ 217, 83, 1, 190, 217, 83, 1, 252, 191, 217, 83, 1, 184, 217, 83, 1, 191,
+ 217, 83, 1, 233, 135, 217, 83, 1, 212, 65, 217, 83, 1, 206, 217, 83, 1,
+ 162, 217, 83, 25, 5, 73, 217, 83, 25, 5, 70, 217, 83, 5, 213, 152, 242,
+ 7, 1, 61, 242, 7, 1, 73, 242, 7, 1, 70, 242, 7, 1, 176, 242, 7, 1, 243,
+ 135, 242, 7, 1, 229, 77, 242, 7, 1, 217, 105, 242, 7, 1, 248, 221, 242,
+ 7, 1, 197, 242, 7, 1, 190, 242, 7, 1, 252, 191, 242, 7, 1, 184, 242, 7,
+ 1, 191, 242, 7, 1, 205, 242, 7, 1, 233, 135, 242, 7, 1, 212, 65, 242, 7,
+ 1, 206, 242, 7, 1, 162, 242, 7, 25, 5, 73, 242, 7, 25, 5, 70, 242, 7, 5,
+ 226, 49, 225, 126, 219, 155, 224, 140, 225, 126, 52, 224, 140, 251, 120,
+ 1, 61, 251, 120, 1, 73, 251, 120, 1, 70, 251, 120, 1, 176, 251, 120, 1,
+ 243, 135, 251, 120, 1, 229, 77, 251, 120, 1, 217, 105, 251, 120, 1, 248,
+ 221, 251, 120, 1, 197, 251, 120, 1, 190, 251, 120, 1, 252, 191, 251, 120,
+ 1, 184, 251, 120, 1, 191, 251, 120, 1, 205, 251, 120, 1, 233, 135, 251,
+ 120, 1, 212, 65, 251, 120, 1, 206, 251, 120, 1, 162, 251, 120, 25, 5, 73,
+ 251, 120, 25, 5, 70, 217, 82, 1, 61, 217, 82, 1, 73, 217, 82, 1, 70, 217,
+ 82, 1, 176, 217, 82, 1, 243, 135, 217, 82, 1, 229, 77, 217, 82, 1, 217,
+ 105, 217, 82, 1, 248, 221, 217, 82, 1, 197, 217, 82, 1, 190, 217, 82, 1,
+ 252, 191, 217, 82, 1, 184, 217, 82, 1, 191, 217, 82, 1, 233, 135, 217,
+ 82, 1, 212, 65, 217, 82, 1, 206, 217, 82, 25, 5, 73, 217, 82, 25, 5, 70,
+ 69, 1, 176, 69, 1, 234, 132, 69, 1, 234, 28, 69, 1, 234, 105, 69, 1, 229,
+ 4, 69, 1, 251, 33, 69, 1, 250, 157, 69, 1, 249, 238, 69, 1, 250, 86, 69,
+ 1, 227, 134, 69, 1, 248, 221, 69, 1, 215, 144, 69, 1, 247, 145, 69, 1,
+ 215, 139, 69, 1, 228, 80, 69, 1, 217, 105, 69, 1, 216, 208, 69, 1, 111,
+ 69, 1, 216, 156, 69, 1, 228, 74, 69, 1, 252, 191, 69, 1, 225, 147, 69, 1,
+ 225, 16, 69, 1, 225, 121, 69, 1, 230, 161, 69, 1, 210, 244, 69, 1, 222,
+ 211, 69, 1, 232, 156, 69, 1, 213, 138, 69, 1, 220, 102, 69, 1, 218, 184,
+ 69, 1, 206, 69, 1, 162, 69, 1, 233, 135, 69, 1, 224, 88, 69, 235, 243,
+ 25, 224, 74, 69, 235, 243, 25, 224, 87, 69, 235, 243, 25, 224, 53, 69,
+ 235, 243, 25, 224, 48, 69, 235, 243, 25, 224, 30, 69, 235, 243, 25, 224,
+ 2, 69, 235, 243, 25, 223, 246, 69, 235, 243, 25, 223, 245, 69, 235, 243,
+ 25, 222, 100, 69, 235, 243, 25, 222, 93, 69, 235, 243, 25, 232, 62, 69,
+ 235, 243, 25, 232, 52, 69, 235, 243, 25, 224, 69, 69, 235, 243, 25, 224,
+ 80, 69, 235, 243, 25, 224, 38, 215, 49, 110, 69, 235, 243, 25, 224, 38,
+ 215, 49, 105, 69, 235, 243, 25, 224, 70, 69, 25, 235, 229, 254, 45, 69,
+ 25, 235, 229, 255, 73, 69, 25, 5, 255, 73, 69, 25, 5, 73, 69, 25, 5, 236,
+ 33, 69, 25, 5, 211, 117, 69, 25, 5, 210, 169, 69, 25, 5, 70, 69, 25, 5,
+ 214, 118, 69, 25, 5, 214, 229, 69, 25, 5, 226, 234, 69, 25, 5, 191, 69,
+ 25, 5, 236, 60, 69, 25, 5, 75, 69, 25, 5, 254, 243, 69, 25, 5, 254, 201,
+ 69, 25, 5, 226, 183, 69, 25, 5, 253, 192, 69, 5, 228, 206, 69, 5, 223,
+ 126, 69, 5, 210, 180, 69, 5, 230, 52, 69, 5, 215, 213, 69, 5, 252, 143,
+ 69, 5, 222, 206, 69, 5, 216, 40, 69, 5, 234, 241, 69, 5, 254, 203, 69, 5,
+ 221, 244, 221, 238, 69, 5, 213, 149, 69, 5, 249, 232, 69, 5, 252, 117,
+ 69, 5, 234, 125, 69, 5, 252, 137, 69, 5, 251, 9, 225, 72, 233, 187, 69,
+ 5, 233, 30, 216, 17, 69, 5, 252, 20, 69, 5, 225, 123, 230, 99, 69, 5,
+ 234, 9, 69, 249, 98, 16, 223, 28, 69, 5, 253, 174, 69, 5, 253, 195, 69,
+ 21, 210, 86, 69, 21, 110, 69, 21, 105, 69, 21, 158, 69, 21, 161, 69, 21,
+ 189, 69, 21, 194, 69, 21, 198, 69, 21, 195, 69, 21, 200, 69, 16, 233, 30,
+ 253, 197, 219, 43, 69, 16, 233, 30, 253, 197, 230, 71, 69, 16, 233, 30,
+ 253, 197, 225, 71, 69, 16, 233, 30, 253, 197, 252, 49, 69, 16, 233, 30,
+ 253, 197, 251, 103, 69, 16, 233, 30, 253, 197, 224, 215, 69, 16, 233, 30,
+ 253, 197, 224, 209, 69, 16, 233, 30, 253, 197, 224, 207, 69, 16, 233, 30,
+ 253, 197, 224, 213, 69, 16, 233, 30, 253, 197, 224, 211, 83, 251, 236,
+ 83, 245, 163, 83, 249, 219, 83, 243, 229, 218, 129, 83, 249, 226, 83,
+ 244, 11, 247, 118, 83, 216, 39, 219, 52, 240, 168, 83, 219, 190, 3, 251,
+ 172, 231, 154, 83, 231, 183, 249, 219, 83, 231, 183, 243, 229, 218, 129,
+ 83, 228, 191, 83, 243, 253, 45, 221, 157, 110, 83, 243, 253, 45, 221,
+ 157, 105, 83, 243, 253, 45, 221, 157, 158, 83, 25, 220, 137, 83, 21, 210,
+ 86, 83, 21, 110, 83, 21, 105, 83, 21, 158, 83, 21, 161, 83, 21, 189, 83,
+ 21, 194, 83, 21, 198, 83, 21, 195, 83, 21, 200, 83, 1, 61, 83, 1, 75, 83,
+ 1, 73, 83, 1, 76, 83, 1, 70, 83, 1, 226, 234, 83, 1, 214, 214, 83, 1,
+ 245, 209, 83, 1, 197, 83, 1, 254, 115, 83, 1, 252, 191, 83, 1, 190, 83,
+ 1, 224, 88, 83, 1, 243, 135, 83, 1, 184, 83, 1, 233, 135, 83, 1, 206, 83,
+ 1, 220, 102, 83, 1, 217, 105, 83, 1, 248, 221, 83, 1, 250, 157, 83, 1,
+ 235, 141, 83, 1, 191, 83, 1, 205, 83, 1, 212, 65, 83, 1, 244, 196, 83, 1,
+ 176, 83, 1, 234, 132, 83, 1, 215, 183, 83, 1, 210, 116, 83, 1, 242, 46,
+ 83, 1, 210, 16, 83, 1, 232, 254, 83, 1, 210, 69, 83, 1, 250, 110, 83, 1,
+ 216, 39, 199, 25, 50, 83, 1, 216, 39, 75, 83, 1, 216, 39, 73, 83, 1, 216,
+ 39, 76, 83, 1, 216, 39, 70, 83, 1, 216, 39, 226, 234, 83, 1, 216, 39,
+ 214, 214, 83, 1, 216, 39, 254, 115, 83, 1, 216, 39, 252, 191, 83, 1, 216,
+ 39, 190, 83, 1, 216, 39, 224, 88, 83, 1, 216, 39, 243, 135, 83, 1, 216,
+ 39, 184, 83, 1, 216, 39, 217, 105, 83, 1, 216, 39, 248, 221, 83, 1, 216,
+ 39, 250, 157, 83, 1, 216, 39, 235, 141, 83, 1, 216, 39, 215, 183, 83, 1,
+ 216, 39, 191, 83, 1, 216, 39, 212, 65, 83, 1, 216, 39, 176, 83, 1, 216,
+ 39, 243, 132, 83, 1, 216, 39, 242, 46, 83, 1, 216, 39, 235, 107, 83, 1,
+ 216, 39, 228, 231, 83, 1, 216, 39, 246, 38, 83, 1, 219, 190, 75, 83, 1,
+ 219, 190, 73, 83, 1, 219, 190, 235, 152, 83, 1, 219, 190, 214, 214, 83,
+ 1, 219, 190, 70, 83, 1, 219, 190, 254, 115, 83, 1, 219, 190, 176, 83, 1,
+ 219, 190, 243, 135, 83, 1, 219, 190, 162, 83, 1, 219, 190, 190, 83, 1,
+ 219, 190, 220, 102, 83, 1, 219, 190, 217, 105, 83, 1, 219, 190, 248, 221,
+ 83, 1, 219, 190, 235, 141, 83, 1, 219, 190, 244, 196, 83, 1, 219, 190,
+ 243, 132, 83, 1, 219, 190, 242, 46, 83, 1, 219, 190, 215, 183, 83, 1,
+ 219, 190, 210, 116, 83, 1, 219, 190, 223, 184, 83, 1, 219, 190, 250, 157,
+ 83, 1, 219, 190, 210, 82, 83, 1, 231, 183, 73, 83, 1, 231, 183, 176, 83,
+ 1, 231, 183, 205, 83, 1, 231, 183, 244, 196, 83, 1, 231, 183, 210, 82,
+ 83, 1, 254, 162, 243, 116, 254, 76, 110, 83, 1, 254, 162, 243, 116, 213,
+ 148, 110, 83, 1, 254, 162, 243, 116, 248, 186, 83, 1, 254, 162, 243, 116,
+ 214, 224, 83, 1, 254, 162, 243, 116, 235, 193, 214, 224, 83, 1, 254, 162,
+ 243, 116, 252, 155, 83, 1, 254, 162, 243, 116, 134, 252, 155, 83, 1, 254,
+ 162, 243, 116, 61, 83, 1, 254, 162, 243, 116, 73, 83, 1, 254, 162, 243,
+ 116, 176, 83, 1, 254, 162, 243, 116, 229, 77, 83, 1, 254, 162, 243, 116,
+ 251, 33, 83, 1, 254, 162, 243, 116, 215, 156, 83, 1, 254, 162, 243, 116,
+ 215, 144, 83, 1, 254, 162, 243, 116, 248, 135, 83, 1, 254, 162, 243, 116,
+ 228, 110, 83, 1, 254, 162, 243, 116, 217, 105, 83, 1, 254, 162, 243, 116,
+ 248, 221, 83, 1, 254, 162, 243, 116, 190, 83, 1, 254, 162, 243, 116, 225,
+ 147, 83, 1, 254, 162, 243, 116, 218, 223, 83, 1, 254, 162, 243, 116, 210,
+ 82, 83, 1, 254, 162, 243, 116, 210, 116, 83, 1, 254, 162, 243, 116, 254,
+ 209, 83, 1, 216, 39, 254, 162, 243, 116, 217, 105, 83, 1, 216, 39, 254,
+ 162, 243, 116, 210, 82, 83, 1, 231, 183, 254, 162, 243, 116, 242, 249,
+ 83, 1, 231, 183, 254, 162, 243, 116, 229, 77, 83, 1, 231, 183, 254, 162,
+ 243, 116, 251, 33, 83, 1, 231, 183, 254, 162, 243, 116, 235, 114, 83, 1,
+ 231, 183, 254, 162, 243, 116, 215, 156, 83, 1, 231, 183, 254, 162, 243,
+ 116, 248, 119, 83, 1, 231, 183, 254, 162, 243, 116, 217, 105, 83, 1, 231,
+ 183, 254, 162, 243, 116, 248, 25, 83, 1, 231, 183, 254, 162, 243, 116,
+ 218, 223, 83, 1, 231, 183, 254, 162, 243, 116, 249, 72, 83, 1, 231, 183,
+ 254, 162, 243, 116, 210, 82, 83, 1, 231, 183, 254, 162, 243, 116, 210,
+ 116, 83, 1, 254, 162, 243, 116, 163, 70, 83, 1, 254, 162, 243, 116, 163,
+ 191, 83, 1, 231, 183, 254, 162, 243, 116, 252, 18, 83, 1, 254, 162, 243,
+ 116, 248, 211, 83, 1, 231, 183, 254, 162, 243, 116, 232, 254, 18, 19,
+ 226, 109, 18, 19, 253, 167, 18, 19, 255, 28, 18, 19, 212, 25, 18, 19,
+ 224, 221, 18, 19, 225, 229, 18, 19, 224, 105, 18, 19, 217, 31, 18, 19,
+ 234, 189, 18, 19, 233, 179, 18, 19, 231, 132, 18, 19, 228, 37, 18, 19,
+ 229, 181, 18, 19, 233, 68, 18, 19, 219, 22, 18, 19, 221, 211, 18, 19,
+ 219, 232, 18, 19, 220, 66, 18, 19, 219, 201, 18, 19, 210, 220, 18, 19,
+ 211, 52, 18, 19, 223, 134, 18, 19, 227, 171, 18, 19, 226, 216, 227, 171,
+ 18, 19, 227, 170, 18, 19, 226, 216, 227, 170, 18, 19, 227, 169, 18, 19,
+ 226, 216, 227, 169, 18, 19, 227, 168, 18, 19, 226, 216, 227, 168, 18, 19,
+ 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19, 222, 102, 18, 19,
+ 222, 101, 18, 19, 222, 109, 18, 19, 226, 216, 226, 105, 18, 19, 226, 216,
+ 217, 152, 18, 19, 226, 216, 235, 23, 18, 19, 226, 216, 251, 66, 18, 19,
+ 226, 216, 193, 18, 19, 226, 216, 230, 25, 18, 19, 226, 216, 222, 91, 18,
+ 19, 226, 216, 220, 104, 18, 19, 245, 219, 212, 98, 18, 19, 212, 7, 212,
+ 98, 18, 19, 40, 4, 222, 233, 18, 19, 40, 223, 157, 247, 120, 18, 19, 223,
+ 223, 222, 106, 18, 19, 159, 232, 127, 18, 19, 159, 233, 134, 18, 19, 216,
+ 126, 18, 19, 216, 128, 18, 19, 215, 136, 18, 19, 215, 138, 18, 19, 215,
+ 143, 18, 19, 216, 49, 18, 19, 216, 51, 18, 19, 221, 209, 219, 206, 18,
+ 19, 221, 209, 220, 1, 18, 19, 221, 209, 241, 53, 18, 19, 72, 242, 73, 18,
+ 19, 72, 248, 52, 243, 55, 18, 19, 72, 243, 132, 18, 19, 72, 242, 78, 18,
+ 19, 221, 209, 235, 33, 18, 19, 72, 235, 31, 18, 19, 252, 68, 248, 52,
+ 156, 18, 19, 252, 68, 248, 52, 153, 18, 19, 72, 248, 47, 222, 91, 232,
+ 223, 213, 122, 233, 10, 232, 223, 1, 176, 232, 223, 1, 234, 132, 232,
+ 223, 1, 243, 135, 232, 223, 1, 242, 249, 232, 223, 1, 229, 77, 232, 223,
+ 1, 251, 33, 232, 223, 1, 250, 157, 232, 223, 1, 235, 141, 232, 223, 1,
+ 235, 114, 232, 223, 1, 211, 71, 232, 223, 1, 217, 105, 232, 223, 1, 216,
+ 208, 232, 223, 1, 248, 221, 232, 223, 1, 248, 25, 232, 223, 1, 197, 232,
+ 223, 1, 190, 232, 223, 1, 225, 147, 232, 223, 1, 252, 191, 232, 223, 1,
+ 252, 18, 232, 223, 1, 184, 232, 223, 1, 191, 232, 223, 1, 205, 232, 223,
+ 1, 233, 135, 232, 223, 1, 212, 65, 232, 223, 1, 220, 102, 232, 223, 1,
+ 218, 223, 232, 223, 1, 206, 232, 223, 1, 162, 232, 223, 25, 5, 61, 232,
+ 223, 25, 5, 73, 232, 223, 25, 5, 70, 232, 223, 25, 5, 245, 209, 232, 223,
+ 25, 5, 254, 201, 232, 223, 25, 5, 226, 183, 232, 223, 25, 5, 253, 192,
+ 232, 223, 25, 5, 75, 232, 223, 25, 5, 76, 232, 223, 218, 73, 1, 191, 232,
+ 223, 218, 73, 1, 205, 232, 223, 218, 73, 1, 212, 65, 232, 223, 4, 1, 176,
+ 232, 223, 4, 1, 229, 77, 232, 223, 4, 1, 254, 75, 232, 223, 4, 1, 217,
+ 105, 232, 223, 4, 1, 197, 232, 223, 4, 1, 190, 232, 223, 4, 1, 184, 232,
+ 223, 4, 1, 205, 232, 223, 4, 1, 233, 135, 232, 223, 5, 230, 89, 232, 223,
+ 5, 234, 171, 232, 223, 5, 222, 32, 232, 223, 5, 232, 127, 232, 223, 245,
+ 31, 78, 232, 223, 224, 13, 78, 232, 223, 21, 210, 86, 232, 223, 21, 110,
+ 232, 223, 21, 105, 232, 223, 21, 158, 232, 223, 21, 161, 232, 223, 21,
+ 189, 232, 223, 21, 194, 232, 223, 21, 198, 232, 223, 21, 195, 232, 223,
+ 21, 200, 39, 233, 59, 1, 176, 39, 233, 59, 1, 211, 165, 39, 233, 59, 1,
+ 229, 77, 39, 233, 59, 1, 215, 183, 39, 233, 59, 1, 206, 39, 233, 59, 1,
+ 191, 39, 233, 59, 1, 217, 105, 39, 233, 59, 1, 216, 208, 39, 233, 59, 1,
+ 233, 135, 39, 233, 59, 1, 190, 39, 233, 59, 1, 225, 147, 39, 233, 59, 1,
+ 184, 39, 233, 59, 1, 244, 196, 39, 233, 59, 1, 214, 27, 39, 233, 59, 1,
+ 162, 39, 233, 59, 1, 224, 88, 39, 233, 59, 1, 234, 132, 39, 233, 59, 1,
+ 215, 175, 39, 233, 59, 1, 197, 39, 233, 59, 1, 61, 39, 233, 59, 1, 73,
+ 39, 233, 59, 1, 245, 209, 39, 233, 59, 1, 245, 197, 39, 233, 59, 1, 70,
+ 39, 233, 59, 1, 226, 183, 39, 233, 59, 1, 76, 39, 233, 59, 1, 214, 214,
+ 39, 233, 59, 1, 75, 39, 233, 59, 1, 253, 190, 39, 233, 59, 1, 254, 201,
+ 39, 233, 59, 1, 216, 28, 39, 233, 59, 1, 216, 27, 39, 233, 59, 1, 216,
+ 26, 39, 233, 59, 1, 216, 25, 39, 233, 59, 1, 216, 24, 166, 39, 173, 1,
+ 125, 224, 88, 166, 39, 173, 1, 121, 224, 88, 166, 39, 173, 1, 125, 176,
+ 166, 39, 173, 1, 125, 211, 165, 166, 39, 173, 1, 125, 229, 77, 166, 39,
+ 173, 1, 121, 176, 166, 39, 173, 1, 121, 211, 165, 166, 39, 173, 1, 121,
+ 229, 77, 166, 39, 173, 1, 125, 215, 183, 166, 39, 173, 1, 125, 206, 166,
+ 39, 173, 1, 125, 191, 166, 39, 173, 1, 121, 215, 183, 166, 39, 173, 1,
+ 121, 206, 166, 39, 173, 1, 121, 191, 166, 39, 173, 1, 125, 217, 105, 166,
+ 39, 173, 1, 125, 216, 208, 166, 39, 173, 1, 125, 197, 166, 39, 173, 1,
+ 121, 217, 105, 166, 39, 173, 1, 121, 216, 208, 166, 39, 173, 1, 121, 197,
+ 166, 39, 173, 1, 125, 190, 166, 39, 173, 1, 125, 225, 147, 166, 39, 173,
+ 1, 125, 184, 166, 39, 173, 1, 121, 190, 166, 39, 173, 1, 121, 225, 147,
+ 166, 39, 173, 1, 121, 184, 166, 39, 173, 1, 125, 244, 196, 166, 39, 173,
+ 1, 125, 214, 27, 166, 39, 173, 1, 125, 233, 135, 166, 39, 173, 1, 121,
+ 244, 196, 166, 39, 173, 1, 121, 214, 27, 166, 39, 173, 1, 121, 233, 135,
+ 166, 39, 173, 1, 125, 162, 166, 39, 173, 1, 125, 248, 221, 166, 39, 173,
+ 1, 125, 252, 191, 166, 39, 173, 1, 121, 162, 166, 39, 173, 1, 121, 248,
+ 221, 166, 39, 173, 1, 121, 252, 191, 166, 39, 173, 1, 125, 233, 184, 166,
+ 39, 173, 1, 125, 211, 138, 166, 39, 173, 1, 121, 233, 184, 166, 39, 173,
+ 1, 121, 211, 138, 166, 39, 173, 1, 125, 218, 82, 166, 39, 173, 1, 121,
+ 218, 82, 166, 39, 173, 25, 5, 25, 219, 239, 166, 39, 173, 25, 5, 255, 73,
+ 166, 39, 173, 25, 5, 236, 33, 166, 39, 173, 25, 5, 70, 166, 39, 173, 25,
+ 5, 214, 118, 166, 39, 173, 25, 5, 75, 166, 39, 173, 25, 5, 254, 243, 166,
+ 39, 173, 25, 5, 76, 166, 39, 173, 25, 5, 227, 0, 166, 39, 173, 25, 5,
+ 214, 214, 166, 39, 173, 25, 5, 253, 167, 166, 39, 173, 25, 5, 255, 28,
+ 166, 39, 173, 25, 5, 214, 111, 166, 39, 173, 25, 5, 226, 109, 166, 39,
+ 173, 25, 5, 226, 253, 166, 39, 173, 25, 5, 214, 210, 166, 39, 173, 25, 5,
+ 235, 152, 166, 39, 173, 1, 40, 214, 105, 166, 39, 173, 1, 40, 229, 79,
+ 166, 39, 173, 1, 40, 230, 25, 166, 39, 173, 1, 40, 193, 166, 39, 173, 1,
+ 40, 235, 23, 166, 39, 173, 1, 40, 249, 60, 166, 39, 173, 1, 40, 253, 158,
+ 166, 39, 173, 138, 231, 158, 166, 39, 173, 138, 231, 157, 166, 39, 173,
+ 21, 210, 86, 166, 39, 173, 21, 110, 166, 39, 173, 21, 105, 166, 39, 173,
+ 21, 158, 166, 39, 173, 21, 161, 166, 39, 173, 21, 189, 166, 39, 173, 21,
+ 194, 166, 39, 173, 21, 198, 166, 39, 173, 21, 195, 166, 39, 173, 21, 200,
+ 166, 39, 173, 89, 21, 110, 166, 39, 173, 5, 233, 120, 166, 39, 173, 5,
+ 233, 119, 69, 16, 225, 236, 69, 16, 230, 72, 234, 25, 69, 16, 225, 72,
+ 234, 25, 69, 16, 252, 50, 234, 25, 69, 16, 251, 104, 234, 25, 69, 16,
+ 224, 216, 234, 25, 69, 16, 224, 210, 234, 25, 69, 16, 224, 208, 234, 25,
+ 69, 16, 224, 214, 234, 25, 69, 16, 224, 212, 234, 25, 69, 16, 248, 173,
+ 234, 25, 69, 16, 248, 169, 234, 25, 69, 16, 248, 168, 234, 25, 69, 16,
+ 248, 171, 234, 25, 69, 16, 248, 170, 234, 25, 69, 16, 248, 167, 234, 25,
+ 69, 16, 215, 87, 69, 16, 230, 72, 222, 205, 69, 16, 225, 72, 222, 205,
+ 69, 16, 252, 50, 222, 205, 69, 16, 251, 104, 222, 205, 69, 16, 224, 216,
+ 222, 205, 69, 16, 224, 210, 222, 205, 69, 16, 224, 208, 222, 205, 69, 16,
+ 224, 214, 222, 205, 69, 16, 224, 212, 222, 205, 69, 16, 248, 173, 222,
+ 205, 69, 16, 248, 169, 222, 205, 69, 16, 248, 168, 222, 205, 69, 16, 248,
+ 171, 222, 205, 69, 16, 248, 170, 222, 205, 69, 16, 248, 167, 222, 205,
+ 251, 121, 1, 176, 251, 121, 1, 243, 135, 251, 121, 1, 229, 77, 251, 121,
+ 1, 229, 22, 251, 121, 1, 190, 251, 121, 1, 252, 191, 251, 121, 1, 184,
+ 251, 121, 1, 230, 105, 251, 121, 1, 217, 105, 251, 121, 1, 248, 221, 251,
+ 121, 1, 197, 251, 121, 1, 228, 36, 251, 121, 1, 251, 33, 251, 121, 1,
+ 235, 141, 251, 121, 1, 227, 165, 251, 121, 1, 227, 158, 251, 121, 1, 191,
+ 251, 121, 1, 205, 251, 121, 1, 233, 135, 251, 121, 1, 214, 27, 251, 121,
+ 1, 206, 251, 121, 1, 61, 251, 121, 1, 162, 251, 121, 25, 5, 73, 251, 121,
+ 25, 5, 70, 251, 121, 25, 5, 75, 251, 121, 25, 5, 76, 251, 121, 25, 5,
+ 254, 243, 251, 121, 226, 60, 251, 121, 245, 143, 64, 221, 172, 39, 89, 1,
+ 125, 176, 39, 89, 1, 125, 234, 132, 39, 89, 1, 125, 233, 171, 39, 89, 1,
+ 121, 176, 39, 89, 1, 121, 233, 171, 39, 89, 1, 121, 234, 132, 39, 89, 1,
+ 229, 77, 39, 89, 1, 125, 251, 33, 39, 89, 1, 125, 250, 157, 39, 89, 1,
+ 121, 251, 33, 39, 89, 1, 121, 206, 39, 89, 1, 121, 250, 157, 39, 89, 1,
+ 227, 165, 39, 89, 1, 223, 140, 39, 89, 1, 125, 223, 138, 39, 89, 1, 248,
+ 221, 39, 89, 1, 121, 223, 138, 39, 89, 1, 223, 149, 39, 89, 1, 125, 217,
+ 105, 39, 89, 1, 125, 216, 208, 39, 89, 1, 121, 217, 105, 39, 89, 1, 121,
+ 216, 208, 39, 89, 1, 197, 39, 89, 1, 252, 191, 39, 89, 1, 125, 190, 39,
+ 89, 1, 125, 225, 147, 39, 89, 1, 125, 244, 196, 39, 89, 1, 121, 190, 39,
+ 89, 1, 121, 244, 196, 39, 89, 1, 121, 225, 147, 39, 89, 1, 184, 39, 89,
+ 1, 121, 191, 39, 89, 1, 125, 191, 39, 89, 1, 205, 39, 89, 1, 222, 137,
+ 39, 89, 1, 233, 135, 39, 89, 1, 232, 93, 39, 89, 1, 212, 65, 39, 89, 1,
+ 125, 220, 102, 39, 89, 1, 125, 218, 223, 39, 89, 1, 125, 206, 39, 89, 1,
+ 125, 162, 39, 89, 1, 232, 184, 39, 89, 1, 61, 39, 89, 1, 121, 162, 39,
+ 89, 1, 73, 39, 89, 1, 236, 33, 39, 89, 1, 70, 39, 89, 1, 214, 118, 39,
+ 89, 1, 245, 209, 39, 89, 1, 226, 183, 39, 89, 1, 233, 120, 39, 89, 1,
+ 242, 132, 206, 39, 89, 116, 5, 147, 205, 39, 89, 116, 5, 147, 233, 135,
+ 39, 89, 116, 5, 233, 136, 217, 58, 233, 109, 39, 89, 5, 231, 204, 234,
+ 231, 233, 109, 39, 89, 116, 5, 40, 229, 77, 39, 89, 116, 5, 121, 190, 39,
+ 89, 116, 5, 125, 223, 139, 177, 121, 190, 39, 89, 116, 5, 184, 39, 89,
+ 116, 5, 252, 191, 39, 89, 116, 5, 206, 39, 89, 5, 222, 10, 39, 89, 25, 5,
+ 61, 39, 89, 25, 5, 231, 204, 221, 226, 39, 89, 25, 5, 255, 73, 39, 89,
+ 25, 5, 217, 64, 255, 73, 39, 89, 25, 5, 73, 39, 89, 25, 5, 236, 33, 39,
+ 89, 25, 5, 214, 214, 39, 89, 25, 5, 214, 117, 39, 89, 25, 5, 70, 39, 89,
+ 25, 5, 214, 118, 39, 89, 25, 5, 76, 39, 89, 25, 5, 227, 1, 51, 39, 89,
+ 25, 5, 226, 109, 39, 89, 25, 5, 75, 39, 89, 25, 5, 254, 243, 39, 89, 25,
+ 5, 226, 183, 39, 89, 25, 5, 254, 201, 39, 89, 25, 5, 89, 254, 201, 39,
+ 89, 25, 5, 227, 1, 48, 39, 89, 5, 231, 204, 234, 230, 39, 89, 5, 216, 29,
+ 39, 89, 5, 216, 28, 39, 89, 5, 234, 97, 216, 27, 39, 89, 5, 234, 97, 216,
+ 26, 39, 89, 5, 234, 97, 216, 25, 39, 89, 5, 223, 188, 242, 45, 39, 89, 5,
+ 231, 204, 221, 253, 39, 89, 5, 234, 96, 234, 215, 39, 89, 38, 249, 115,
+ 247, 120, 39, 89, 241, 46, 21, 210, 86, 39, 89, 241, 46, 21, 110, 39, 89,
+ 241, 46, 21, 105, 39, 89, 241, 46, 21, 158, 39, 89, 241, 46, 21, 161, 39,
+ 89, 241, 46, 21, 189, 39, 89, 241, 46, 21, 194, 39, 89, 241, 46, 21, 198,
+ 39, 89, 241, 46, 21, 195, 39, 89, 241, 46, 21, 200, 39, 89, 89, 21, 210,
+ 86, 39, 89, 89, 21, 110, 39, 89, 89, 21, 105, 39, 89, 89, 21, 158, 39,
+ 89, 89, 21, 161, 39, 89, 89, 21, 189, 39, 89, 89, 21, 194, 39, 89, 89,
+ 21, 198, 39, 89, 89, 21, 195, 39, 89, 89, 21, 200, 39, 89, 5, 211, 249,
+ 39, 89, 5, 211, 248, 39, 89, 5, 221, 215, 39, 89, 5, 234, 160, 39, 89, 5,
+ 240, 232, 39, 89, 5, 247, 134, 39, 89, 5, 223, 49, 222, 187, 223, 149,
+ 39, 89, 5, 231, 204, 211, 72, 39, 89, 5, 235, 6, 39, 89, 5, 235, 5, 39,
+ 89, 5, 221, 222, 39, 89, 5, 221, 221, 39, 89, 5, 242, 9, 39, 89, 5, 251,
+ 30, 102, 5, 214, 200, 223, 30, 102, 5, 214, 200, 251, 1, 102, 5, 250,
+ 186, 102, 5, 218, 15, 102, 5, 251, 233, 102, 1, 254, 184, 102, 1, 254,
+ 185, 217, 13, 102, 1, 236, 29, 102, 1, 236, 30, 217, 13, 102, 1, 214,
+ 203, 102, 1, 214, 204, 217, 13, 102, 1, 223, 188, 223, 79, 102, 1, 223,
+ 188, 223, 80, 217, 13, 102, 1, 233, 136, 233, 24, 102, 1, 233, 136, 233,
+ 25, 217, 13, 102, 1, 245, 179, 102, 1, 254, 199, 102, 1, 226, 212, 102,
+ 1, 226, 213, 217, 13, 102, 1, 176, 102, 1, 235, 13, 231, 207, 102, 1,
+ 243, 135, 102, 1, 243, 136, 242, 161, 102, 1, 229, 77, 102, 1, 251, 33,
+ 102, 1, 251, 34, 233, 123, 102, 1, 235, 141, 102, 1, 235, 142, 235, 118,
+ 102, 1, 227, 165, 102, 1, 217, 106, 233, 76, 102, 1, 217, 106, 230, 67,
+ 231, 207, 102, 1, 248, 222, 230, 67, 254, 145, 102, 1, 248, 222, 230, 67,
+ 231, 207, 102, 1, 229, 229, 223, 152, 102, 1, 217, 105, 102, 1, 217, 106,
+ 217, 35, 102, 1, 248, 221, 102, 1, 248, 222, 231, 225, 102, 1, 197, 102,
+ 1, 190, 102, 1, 226, 90, 234, 226, 102, 1, 252, 191, 102, 1, 252, 192,
+ 234, 172, 102, 1, 184, 102, 1, 191, 102, 1, 205, 102, 1, 233, 135, 102,
+ 1, 212, 65, 102, 1, 222, 34, 222, 20, 102, 1, 222, 34, 221, 233, 102, 1,
+ 206, 102, 1, 162, 102, 5, 223, 70, 102, 25, 5, 217, 13, 102, 25, 5, 214,
+ 199, 102, 25, 5, 214, 200, 221, 229, 102, 25, 5, 218, 47, 102, 25, 5,
+ 218, 48, 236, 21, 102, 25, 5, 223, 188, 223, 79, 102, 25, 5, 223, 188,
+ 223, 80, 217, 13, 102, 25, 5, 233, 136, 233, 24, 102, 25, 5, 233, 136,
+ 233, 25, 217, 13, 102, 25, 5, 217, 65, 102, 25, 5, 217, 66, 223, 79, 102,
+ 25, 5, 217, 66, 217, 13, 102, 25, 5, 217, 66, 223, 80, 217, 13, 102, 25,
+ 5, 225, 184, 102, 25, 5, 225, 185, 217, 13, 102, 254, 250, 254, 249, 102,
+ 1, 234, 251, 221, 228, 102, 1, 234, 102, 221, 228, 102, 1, 215, 34, 221,
+ 228, 102, 1, 245, 203, 221, 228, 102, 1, 214, 0, 221, 228, 102, 1, 210,
+ 107, 221, 228, 102, 1, 253, 209, 221, 228, 102, 21, 210, 86, 102, 21,
+ 110, 102, 21, 105, 102, 21, 158, 102, 21, 161, 102, 21, 189, 102, 21,
+ 194, 102, 21, 198, 102, 21, 195, 102, 21, 200, 102, 226, 29, 102, 226,
+ 55, 102, 211, 238, 102, 250, 236, 226, 48, 102, 250, 236, 219, 172, 102,
+ 250, 236, 226, 2, 102, 226, 54, 102, 28, 16, 247, 126, 102, 28, 16, 248,
+ 51, 102, 28, 16, 246, 64, 102, 28, 16, 248, 176, 102, 28, 16, 248, 177,
+ 218, 15, 102, 28, 16, 247, 205, 102, 28, 16, 248, 214, 102, 28, 16, 248,
+ 33, 102, 28, 16, 248, 198, 102, 28, 16, 248, 177, 243, 57, 102, 28, 16,
+ 38, 217, 9, 102, 28, 16, 38, 245, 141, 102, 28, 16, 38, 234, 167, 102,
+ 28, 16, 38, 234, 169, 102, 28, 16, 38, 235, 122, 102, 28, 16, 38, 234,
+ 168, 2, 235, 122, 102, 28, 16, 38, 234, 170, 2, 235, 122, 102, 28, 16,
+ 38, 252, 37, 102, 28, 16, 38, 242, 165, 102, 28, 16, 222, 249, 204, 246,
+ 74, 102, 28, 16, 222, 249, 204, 248, 212, 102, 28, 16, 222, 249, 250, 0,
+ 215, 111, 102, 28, 16, 222, 249, 250, 0, 217, 73, 102, 28, 16, 233, 44,
+ 204, 226, 43, 102, 28, 16, 233, 44, 204, 224, 139, 102, 28, 16, 233, 44,
+ 250, 0, 225, 38, 102, 28, 16, 233, 44, 250, 0, 225, 26, 102, 28, 16, 233,
+ 44, 204, 225, 61, 207, 5, 226, 26, 207, 5, 226, 39, 207, 5, 226, 35, 207,
+ 1, 61, 207, 1, 73, 207, 1, 70, 207, 1, 254, 243, 207, 1, 76, 207, 1, 75,
+ 207, 1, 245, 55, 207, 1, 176, 207, 1, 224, 88, 207, 1, 243, 135, 207, 1,
+ 229, 77, 207, 1, 251, 33, 207, 1, 235, 141, 207, 1, 210, 116, 207, 1,
+ 227, 165, 207, 1, 217, 105, 207, 1, 248, 221, 207, 1, 197, 207, 1, 190,
+ 207, 1, 244, 196, 207, 1, 214, 27, 207, 1, 252, 191, 207, 1, 184, 207, 1,
+ 191, 207, 1, 205, 207, 1, 233, 135, 207, 1, 212, 65, 207, 1, 206, 207, 1,
+ 211, 165, 207, 1, 162, 207, 116, 5, 226, 52, 207, 116, 5, 226, 28, 207,
+ 116, 5, 226, 25, 207, 25, 5, 226, 42, 207, 25, 5, 226, 24, 207, 25, 5,
+ 226, 46, 207, 25, 5, 226, 34, 207, 25, 5, 226, 53, 207, 25, 5, 226, 44,
+ 207, 5, 226, 56, 207, 5, 213, 152, 207, 116, 5, 225, 248, 184, 207, 116,
+ 5, 225, 248, 212, 65, 207, 1, 234, 132, 207, 1, 217, 231, 207, 21, 210,
+ 86, 207, 21, 110, 207, 21, 105, 207, 21, 158, 207, 21, 161, 207, 21, 189,
+ 207, 21, 194, 207, 21, 198, 207, 21, 195, 207, 21, 200, 207, 253, 175,
+ 207, 1, 223, 52, 207, 1, 233, 7, 207, 1, 252, 18, 207, 1, 40, 235, 23,
+ 207, 1, 40, 193, 252, 120, 1, 61, 252, 120, 1, 219, 164, 61, 252, 120, 1,
+ 162, 252, 120, 1, 219, 164, 162, 252, 120, 1, 231, 181, 162, 252, 120, 1,
+ 252, 191, 252, 120, 1, 234, 212, 252, 191, 252, 120, 1, 190, 252, 120, 1,
+ 219, 164, 190, 252, 120, 1, 197, 252, 120, 1, 231, 181, 197, 252, 120, 1,
+ 212, 65, 252, 120, 1, 219, 164, 212, 65, 252, 120, 1, 226, 67, 212, 65,
+ 252, 120, 1, 243, 135, 252, 120, 1, 219, 164, 243, 135, 252, 120, 1, 235,
+ 141, 252, 120, 1, 248, 221, 252, 120, 1, 205, 252, 120, 1, 219, 164, 205,
+ 252, 120, 1, 184, 252, 120, 1, 219, 164, 184, 252, 120, 1, 219, 26, 217,
+ 105, 252, 120, 1, 228, 55, 217, 105, 252, 120, 1, 206, 252, 120, 1, 219,
+ 164, 206, 252, 120, 1, 231, 181, 206, 252, 120, 1, 191, 252, 120, 1, 219,
+ 164, 191, 252, 120, 1, 229, 77, 252, 120, 1, 233, 135, 252, 120, 1, 219,
+ 164, 233, 135, 252, 120, 1, 227, 165, 252, 120, 1, 251, 33, 252, 120, 1,
+ 229, 148, 252, 120, 1, 231, 124, 252, 120, 1, 73, 252, 120, 1, 70, 252,
+ 120, 5, 216, 33, 252, 120, 25, 5, 75, 252, 120, 25, 5, 226, 67, 75, 252,
+ 120, 25, 5, 245, 209, 252, 120, 25, 5, 73, 252, 120, 25, 5, 234, 212, 73,
+ 252, 120, 25, 5, 76, 252, 120, 25, 5, 234, 212, 76, 252, 120, 25, 5, 70,
+ 252, 120, 25, 5, 104, 31, 219, 164, 206, 252, 120, 116, 5, 229, 79, 252,
+ 120, 116, 5, 242, 60, 252, 120, 226, 37, 252, 120, 226, 33, 252, 120, 16,
+ 251, 241, 229, 229, 231, 37, 252, 120, 16, 251, 241, 225, 64, 252, 120,
+ 16, 251, 241, 235, 48, 252, 120, 16, 251, 241, 226, 37, 196, 1, 176, 196,
+ 1, 234, 39, 196, 1, 234, 132, 196, 1, 243, 135, 196, 1, 242, 186, 196, 1,
+ 229, 77, 196, 1, 251, 33, 196, 1, 250, 157, 196, 1, 235, 141, 196, 1,
+ 227, 165, 196, 1, 217, 105, 196, 1, 216, 208, 196, 1, 248, 221, 196, 1,
+ 197, 196, 1, 190, 196, 1, 225, 42, 196, 1, 225, 147, 196, 1, 244, 196,
+ 196, 1, 244, 75, 196, 1, 252, 191, 196, 1, 251, 222, 196, 1, 184, 196, 1,
+ 230, 168, 196, 1, 215, 183, 196, 1, 215, 175, 196, 1, 246, 38, 196, 1,
+ 191, 196, 1, 205, 196, 1, 233, 135, 196, 1, 162, 196, 1, 241, 153, 196,
+ 1, 214, 27, 196, 1, 206, 196, 1, 220, 102, 196, 1, 212, 65, 196, 1, 61,
+ 196, 218, 73, 1, 191, 196, 218, 73, 1, 205, 196, 25, 5, 255, 73, 196, 25,
+ 5, 73, 196, 25, 5, 76, 196, 25, 5, 226, 183, 196, 25, 5, 70, 196, 25, 5,
+ 214, 118, 196, 25, 5, 75, 196, 116, 5, 235, 23, 196, 116, 5, 193, 196,
+ 116, 5, 156, 196, 116, 5, 230, 25, 196, 116, 5, 226, 105, 196, 116, 5,
+ 153, 196, 116, 5, 217, 152, 196, 116, 5, 227, 142, 196, 116, 5, 234, 230,
+ 196, 5, 223, 150, 196, 5, 227, 205, 196, 224, 141, 217, 103, 196, 224,
+ 141, 227, 152, 216, 120, 217, 103, 196, 224, 141, 250, 164, 196, 224,
+ 141, 215, 170, 250, 164, 196, 224, 141, 215, 169, 196, 21, 210, 86, 196,
+ 21, 110, 196, 21, 105, 196, 21, 158, 196, 21, 161, 196, 21, 189, 196, 21,
+ 194, 196, 21, 198, 196, 21, 195, 196, 21, 200, 196, 1, 215, 156, 196, 1,
+ 215, 144, 196, 1, 248, 135, 226, 210, 250, 103, 21, 210, 86, 226, 210,
+ 250, 103, 21, 110, 226, 210, 250, 103, 21, 105, 226, 210, 250, 103, 21,
+ 158, 226, 210, 250, 103, 21, 161, 226, 210, 250, 103, 21, 189, 226, 210,
+ 250, 103, 21, 194, 226, 210, 250, 103, 21, 198, 226, 210, 250, 103, 21,
+ 195, 226, 210, 250, 103, 21, 200, 226, 210, 250, 103, 1, 233, 135, 226,
+ 210, 250, 103, 1, 253, 206, 226, 210, 250, 103, 1, 254, 216, 226, 210,
+ 250, 103, 1, 254, 115, 226, 210, 250, 103, 1, 254, 178, 226, 210, 250,
+ 103, 1, 233, 134, 226, 210, 250, 103, 1, 255, 35, 226, 210, 250, 103, 1,
+ 255, 36, 226, 210, 250, 103, 1, 255, 34, 226, 210, 250, 103, 1, 255, 29,
+ 226, 210, 250, 103, 1, 232, 241, 226, 210, 250, 103, 1, 235, 171, 226,
+ 210, 250, 103, 1, 236, 34, 226, 210, 250, 103, 1, 235, 190, 226, 210,
+ 250, 103, 1, 235, 179, 226, 210, 250, 103, 1, 232, 98, 226, 210, 250,
+ 103, 1, 214, 221, 226, 210, 250, 103, 1, 214, 219, 226, 210, 250, 103, 1,
+ 214, 168, 226, 210, 250, 103, 1, 214, 111, 226, 210, 250, 103, 1, 233,
+ 58, 226, 210, 250, 103, 1, 245, 108, 226, 210, 250, 103, 1, 245, 212,
+ 226, 210, 250, 103, 1, 245, 150, 226, 210, 250, 103, 1, 245, 86, 226,
+ 210, 250, 103, 1, 232, 156, 226, 210, 250, 103, 1, 226, 137, 226, 210,
+ 250, 103, 1, 226, 252, 226, 210, 250, 103, 1, 226, 125, 226, 210, 250,
+ 103, 1, 226, 222, 226, 210, 250, 103, 230, 103, 215, 121, 226, 210, 250,
+ 103, 243, 130, 215, 122, 226, 210, 250, 103, 230, 101, 215, 122, 226,
+ 210, 250, 103, 223, 92, 226, 210, 250, 103, 225, 145, 226, 210, 250, 103,
+ 254, 208, 226, 210, 250, 103, 224, 141, 230, 98, 226, 210, 250, 103, 224,
+ 141, 52, 230, 98, 207, 224, 141, 251, 241, 218, 8, 207, 224, 141, 251,
+ 241, 226, 38, 207, 224, 141, 251, 241, 224, 129, 207, 224, 141, 251, 241,
+ 251, 19, 207, 224, 141, 251, 241, 233, 8, 221, 225, 207, 224, 141, 251,
+ 241, 235, 13, 221, 225, 207, 224, 141, 251, 241, 248, 222, 221, 225, 207,
+ 224, 141, 251, 241, 252, 192, 221, 225, 213, 252, 138, 234, 210, 213,
+ 252, 138, 220, 77, 213, 252, 138, 224, 198, 213, 252, 5, 228, 209, 213,
+ 252, 5, 211, 80, 230, 222, 218, 0, 213, 252, 138, 211, 80, 254, 213, 235,
+ 243, 218, 0, 213, 252, 138, 211, 80, 235, 243, 218, 0, 213, 252, 138,
+ 211, 80, 234, 198, 235, 243, 218, 0, 213, 252, 138, 251, 2, 51, 213, 252,
+ 138, 211, 80, 234, 198, 235, 243, 218, 1, 221, 197, 213, 252, 138, 52,
+ 218, 0, 213, 252, 138, 215, 211, 218, 0, 213, 252, 138, 234, 198, 254,
+ 77, 213, 252, 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138,
+ 134, 170, 51, 213, 252, 138, 222, 240, 234, 209, 235, 243, 218, 0, 213,
+ 252, 138, 253, 204, 235, 243, 218, 0, 213, 252, 5, 213, 148, 218, 0, 213,
+ 252, 5, 213, 148, 214, 216, 213, 252, 5, 223, 49, 213, 148, 214, 216,
+ 213, 252, 5, 213, 148, 254, 77, 213, 252, 5, 223, 49, 213, 148, 254, 77,
+ 213, 252, 5, 213, 148, 214, 217, 2, 217, 77, 213, 252, 5, 213, 148, 254,
+ 78, 2, 217, 77, 213, 252, 5, 254, 76, 254, 91, 213, 252, 5, 254, 76, 252,
+ 166, 213, 252, 5, 254, 76, 214, 20, 213, 252, 5, 254, 76, 214, 21, 2,
+ 217, 77, 213, 252, 5, 216, 68, 213, 252, 5, 241, 191, 199, 254, 75, 213,
+ 252, 5, 199, 254, 75, 213, 252, 5, 222, 142, 199, 254, 75, 213, 252, 5,
+ 254, 76, 214, 223, 230, 90, 213, 252, 5, 254, 20, 213, 252, 5, 222, 187,
+ 254, 20, 213, 252, 138, 251, 2, 48, 213, 252, 5, 235, 102, 213, 252, 5,
+ 214, 161, 7, 1, 4, 6, 61, 7, 1, 4, 6, 254, 243, 7, 4, 1, 215, 94, 254,
+ 243, 7, 1, 4, 6, 252, 134, 253, 158, 7, 1, 4, 6, 251, 66, 7, 1, 4, 6,
+ 249, 60, 7, 1, 4, 6, 245, 59, 7, 1, 4, 6, 75, 7, 4, 1, 215, 94, 204, 75,
+ 7, 4, 1, 215, 94, 73, 7, 1, 4, 6, 235, 144, 7, 1, 4, 6, 235, 23, 7, 1, 4,
+ 6, 233, 149, 2, 91, 7, 1, 4, 6, 193, 7, 1, 4, 6, 223, 49, 230, 25, 7, 1,
+ 4, 6, 76, 7, 1, 4, 6, 204, 76, 7, 4, 1, 219, 187, 76, 7, 4, 1, 219, 187,
+ 204, 76, 7, 4, 1, 219, 187, 144, 2, 91, 7, 4, 1, 215, 94, 226, 234, 7, 1,
+ 4, 6, 226, 134, 7, 4, 1, 216, 14, 163, 76, 7, 4, 1, 251, 175, 163, 76, 7,
+ 1, 4, 6, 226, 105, 7, 1, 4, 6, 223, 49, 153, 7, 1, 4, 6, 215, 94, 153, 7,
+ 1, 4, 6, 217, 152, 7, 1, 4, 6, 70, 7, 4, 1, 219, 187, 70, 7, 4, 1, 219,
+ 187, 248, 0, 70, 7, 4, 1, 219, 187, 215, 94, 193, 7, 1, 4, 6, 214, 105,
+ 7, 1, 4, 6, 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 8, 7, 1, 213,
+ 135, 233, 82, 218, 250, 7, 1, 254, 196, 26, 1, 4, 6, 243, 107, 26, 1, 4,
+ 6, 233, 98, 26, 1, 4, 6, 225, 108, 26, 1, 4, 6, 223, 37, 26, 1, 4, 6,
+ 224, 161, 33, 1, 4, 6, 245, 174, 58, 1, 6, 61, 58, 1, 6, 254, 243, 58, 1,
+ 6, 253, 158, 58, 1, 6, 252, 134, 253, 158, 58, 1, 6, 249, 60, 58, 1, 6,
+ 75, 58, 1, 6, 223, 49, 75, 58, 1, 6, 243, 202, 58, 1, 6, 242, 60, 58, 1,
+ 6, 73, 58, 1, 6, 235, 144, 58, 1, 6, 235, 23, 58, 1, 6, 156, 58, 1, 6,
+ 193, 58, 1, 6, 230, 25, 58, 1, 6, 223, 49, 230, 25, 58, 1, 6, 76, 58, 1,
+ 6, 226, 134, 58, 1, 6, 226, 105, 58, 1, 6, 153, 58, 1, 6, 217, 152, 58,
+ 1, 6, 70, 58, 1, 6, 212, 98, 58, 1, 4, 61, 58, 1, 4, 215, 94, 61, 58, 1,
+ 4, 254, 143, 58, 1, 4, 215, 94, 254, 243, 58, 1, 4, 253, 158, 58, 1, 4,
+ 249, 60, 58, 1, 4, 75, 58, 1, 4, 221, 195, 58, 1, 4, 204, 75, 58, 1, 4,
+ 215, 94, 204, 75, 58, 1, 4, 243, 202, 58, 1, 4, 215, 94, 73, 58, 1, 4,
+ 235, 23, 58, 1, 4, 193, 58, 1, 4, 245, 138, 58, 1, 4, 76, 58, 1, 4, 204,
+ 76, 58, 1, 4, 216, 14, 163, 76, 58, 1, 4, 251, 175, 163, 76, 58, 1, 4,
+ 226, 105, 58, 1, 4, 217, 152, 58, 1, 4, 70, 58, 1, 4, 219, 187, 70, 58,
+ 1, 4, 215, 94, 193, 58, 1, 4, 214, 105, 58, 1, 4, 254, 196, 58, 1, 4,
+ 252, 26, 58, 1, 4, 26, 243, 107, 58, 1, 4, 248, 54, 58, 1, 4, 26, 225,
+ 133, 58, 1, 4, 250, 110, 7, 218, 65, 4, 1, 73, 7, 218, 65, 4, 1, 153, 7,
+ 218, 65, 4, 1, 70, 7, 218, 65, 4, 1, 214, 105, 26, 218, 65, 4, 1, 252,
+ 26, 26, 218, 65, 4, 1, 243, 107, 26, 218, 65, 4, 1, 223, 37, 26, 218, 65,
+ 4, 1, 225, 133, 26, 218, 65, 4, 1, 250, 110, 7, 4, 1, 214, 214, 7, 4, 1,
+ 57, 2, 230, 224, 182, 7, 4, 1, 249, 61, 2, 230, 224, 182, 7, 4, 1, 245,
+ 7, 2, 230, 224, 182, 7, 4, 1, 232, 50, 2, 230, 224, 182, 7, 4, 1, 230,
+ 26, 2, 230, 224, 182, 7, 4, 1, 226, 106, 2, 230, 224, 182, 7, 4, 1, 223,
+ 224, 2, 230, 224, 182, 7, 4, 1, 223, 224, 2, 244, 88, 22, 230, 224, 182,
+ 7, 4, 1, 222, 92, 2, 230, 224, 182, 7, 4, 1, 217, 153, 2, 230, 224, 182,
+ 7, 4, 1, 210, 160, 2, 230, 224, 182, 7, 4, 1, 215, 94, 243, 202, 58, 1,
+ 33, 245, 150, 7, 4, 1, 235, 213, 243, 202, 7, 4, 1, 216, 211, 2, 218,
+ 107, 7, 4, 6, 1, 240, 154, 2, 91, 7, 4, 1, 235, 186, 2, 91, 7, 4, 1, 226,
+ 106, 2, 91, 7, 4, 6, 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1,
+ 57, 2, 226, 66, 103, 7, 4, 1, 249, 61, 2, 226, 66, 103, 7, 4, 1, 245, 7,
+ 2, 226, 66, 103, 7, 4, 1, 243, 203, 2, 226, 66, 103, 7, 4, 1, 235, 24, 2,
+ 226, 66, 103, 7, 4, 1, 233, 149, 2, 226, 66, 103, 7, 4, 1, 232, 50, 2,
+ 226, 66, 103, 7, 4, 1, 230, 26, 2, 226, 66, 103, 7, 4, 1, 226, 106, 2,
+ 226, 66, 103, 7, 4, 1, 223, 224, 2, 226, 66, 103, 7, 4, 1, 222, 92, 2,
+ 226, 66, 103, 7, 4, 1, 245, 76, 2, 226, 66, 103, 7, 4, 1, 214, 106, 2,
+ 226, 66, 103, 7, 4, 1, 211, 179, 2, 226, 66, 103, 7, 4, 1, 210, 160, 2,
+ 226, 66, 103, 7, 4, 1, 115, 2, 223, 55, 103, 7, 4, 1, 254, 144, 2, 223,
+ 55, 103, 7, 4, 1, 249, 61, 2, 241, 52, 22, 217, 77, 7, 4, 1, 160, 2, 223,
+ 55, 103, 7, 4, 1, 204, 160, 2, 223, 55, 103, 7, 4, 1, 223, 49, 204, 160,
+ 2, 223, 55, 103, 7, 4, 1, 221, 196, 2, 223, 55, 103, 7, 4, 1, 240, 154,
+ 2, 223, 55, 103, 7, 4, 1, 204, 144, 2, 223, 55, 103, 7, 4, 1, 245, 76, 2,
+ 223, 55, 103, 7, 4, 1, 104, 2, 223, 55, 103, 7, 4, 1, 245, 9, 2, 223, 55,
+ 103, 58, 1, 4, 215, 94, 254, 143, 58, 1, 4, 251, 66, 58, 1, 4, 251, 67,
+ 2, 249, 100, 58, 1, 4, 245, 59, 58, 1, 4, 223, 49, 204, 75, 58, 1, 4,
+ 245, 6, 58, 1, 4, 247, 119, 235, 145, 2, 91, 58, 1, 4, 119, 243, 202, 58,
+ 1, 4, 215, 94, 242, 60, 58, 1, 4, 240, 154, 2, 91, 58, 1, 4, 235, 185,
+ 58, 1, 4, 6, 73, 58, 1, 4, 6, 240, 154, 2, 91, 58, 1, 4, 235, 145, 2,
+ 249, 127, 58, 1, 4, 233, 149, 2, 223, 55, 103, 58, 1, 4, 233, 149, 2,
+ 226, 66, 103, 58, 1, 4, 6, 156, 58, 1, 4, 232, 50, 2, 103, 58, 1, 4, 215,
+ 94, 232, 50, 2, 199, 233, 36, 58, 1, 4, 230, 26, 2, 43, 103, 58, 1, 4,
+ 230, 26, 2, 223, 55, 103, 58, 1, 4, 6, 230, 25, 58, 1, 4, 252, 134, 76,
+ 58, 1, 4, 225, 133, 58, 1, 4, 222, 92, 2, 103, 58, 1, 4, 245, 75, 58, 1,
+ 4, 217, 153, 2, 226, 66, 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58,
+ 1, 4, 6, 70, 58, 1, 4, 214, 106, 2, 103, 58, 1, 4, 215, 94, 214, 105, 58,
+ 1, 4, 210, 159, 58, 1, 4, 210, 160, 2, 223, 55, 103, 58, 1, 4, 210, 160,
+ 2, 249, 100, 58, 1, 4, 245, 8, 58, 1, 4, 216, 179, 38, 246, 118, 242,
+ 137, 255, 14, 38, 246, 118, 255, 3, 255, 14, 38, 219, 69, 51, 38, 218, 6,
+ 78, 38, 231, 231, 38, 242, 134, 38, 231, 229, 38, 255, 1, 38, 242, 135,
+ 38, 255, 2, 38, 7, 4, 1, 223, 224, 51, 38, 251, 145, 38, 231, 230, 38,
+ 52, 250, 31, 48, 38, 226, 225, 48, 38, 210, 35, 51, 38, 235, 172, 51, 38,
+ 214, 151, 48, 38, 214, 134, 48, 38, 7, 4, 1, 244, 63, 204, 115, 48, 38,
+ 7, 4, 1, 254, 243, 38, 7, 4, 1, 254, 73, 38, 7, 4, 1, 253, 176, 38, 7, 4,
+ 1, 251, 67, 250, 183, 38, 7, 4, 1, 235, 213, 249, 60, 38, 7, 4, 1, 245,
+ 59, 38, 7, 4, 1, 243, 202, 38, 7, 1, 4, 6, 243, 202, 38, 7, 4, 1, 235,
+ 23, 38, 7, 4, 1, 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 193, 38, 7, 4,
+ 1, 230, 25, 38, 7, 1, 4, 6, 230, 25, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1,
+ 223, 224, 222, 186, 38, 7, 4, 1, 222, 91, 38, 7, 4, 1, 199, 222, 91, 38,
+ 7, 4, 1, 210, 159, 38, 52, 235, 193, 251, 147, 51, 38, 254, 148, 128,
+ 216, 42, 51, 38, 43, 253, 250, 48, 38, 44, 253, 250, 22, 124, 253, 250,
+ 51, 7, 6, 1, 115, 2, 222, 234, 51, 7, 4, 1, 115, 2, 222, 234, 51, 7, 6,
+ 1, 57, 2, 59, 48, 7, 4, 1, 57, 2, 59, 48, 7, 6, 1, 57, 2, 59, 51, 7, 4,
+ 1, 57, 2, 59, 51, 7, 6, 1, 57, 2, 232, 214, 51, 7, 4, 1, 57, 2, 232, 214,
+ 51, 7, 6, 1, 251, 67, 2, 250, 184, 22, 142, 7, 4, 1, 251, 67, 2, 250,
+ 184, 22, 142, 7, 6, 1, 249, 61, 2, 59, 48, 7, 4, 1, 249, 61, 2, 59, 48,
+ 7, 6, 1, 249, 61, 2, 59, 51, 7, 4, 1, 249, 61, 2, 59, 51, 7, 6, 1, 249,
+ 61, 2, 232, 214, 51, 7, 4, 1, 249, 61, 2, 232, 214, 51, 7, 6, 1, 249, 61,
+ 2, 250, 183, 7, 4, 1, 249, 61, 2, 250, 183, 7, 6, 1, 249, 61, 2, 250, 31,
+ 51, 7, 4, 1, 249, 61, 2, 250, 31, 51, 7, 6, 1, 160, 2, 231, 233, 22, 242,
+ 136, 7, 4, 1, 160, 2, 231, 233, 22, 242, 136, 7, 6, 1, 160, 2, 231, 233,
+ 22, 142, 7, 4, 1, 160, 2, 231, 233, 22, 142, 7, 6, 1, 160, 2, 250, 31,
+ 51, 7, 4, 1, 160, 2, 250, 31, 51, 7, 6, 1, 160, 2, 216, 89, 51, 7, 4, 1,
+ 160, 2, 216, 89, 51, 7, 6, 1, 160, 2, 250, 184, 22, 251, 146, 7, 4, 1,
+ 160, 2, 250, 184, 22, 251, 146, 7, 6, 1, 245, 7, 2, 59, 48, 7, 4, 1, 245,
+ 7, 2, 59, 48, 7, 6, 1, 243, 203, 2, 231, 232, 7, 4, 1, 243, 203, 2, 231,
+ 232, 7, 6, 1, 242, 61, 2, 59, 48, 7, 4, 1, 242, 61, 2, 59, 48, 7, 6, 1,
+ 242, 61, 2, 59, 51, 7, 4, 1, 242, 61, 2, 59, 51, 7, 6, 1, 242, 61, 2,
+ 248, 1, 7, 4, 1, 242, 61, 2, 248, 1, 7, 6, 1, 242, 61, 2, 250, 183, 7, 4,
+ 1, 242, 61, 2, 250, 183, 7, 6, 1, 242, 61, 2, 251, 147, 51, 7, 4, 1, 242,
+ 61, 2, 251, 147, 51, 7, 6, 1, 240, 154, 2, 216, 89, 51, 7, 4, 1, 240,
+ 154, 2, 216, 89, 51, 7, 6, 1, 240, 154, 2, 248, 2, 22, 142, 7, 4, 1, 240,
+ 154, 2, 248, 2, 22, 142, 7, 6, 1, 235, 24, 2, 142, 7, 4, 1, 235, 24, 2,
+ 142, 7, 6, 1, 235, 24, 2, 59, 51, 7, 4, 1, 235, 24, 2, 59, 51, 7, 6, 1,
+ 235, 24, 2, 232, 214, 51, 7, 4, 1, 235, 24, 2, 232, 214, 51, 7, 6, 1,
+ 233, 149, 2, 59, 51, 7, 4, 1, 233, 149, 2, 59, 51, 7, 6, 1, 233, 149, 2,
+ 59, 252, 43, 22, 231, 232, 7, 4, 1, 233, 149, 2, 59, 252, 43, 22, 231,
+ 232, 7, 6, 1, 233, 149, 2, 232, 214, 51, 7, 4, 1, 233, 149, 2, 232, 214,
+ 51, 7, 6, 1, 233, 149, 2, 250, 31, 51, 7, 4, 1, 233, 149, 2, 250, 31, 51,
+ 7, 6, 1, 232, 50, 2, 142, 7, 4, 1, 232, 50, 2, 142, 7, 6, 1, 232, 50, 2,
+ 59, 48, 7, 4, 1, 232, 50, 2, 59, 48, 7, 6, 1, 232, 50, 2, 59, 51, 7, 4,
+ 1, 232, 50, 2, 59, 51, 7, 6, 1, 230, 26, 2, 59, 48, 7, 4, 1, 230, 26, 2,
+ 59, 48, 7, 6, 1, 230, 26, 2, 59, 51, 7, 4, 1, 230, 26, 2, 59, 51, 7, 6,
+ 1, 230, 26, 2, 232, 214, 51, 7, 4, 1, 230, 26, 2, 232, 214, 51, 7, 6, 1,
+ 230, 26, 2, 250, 31, 51, 7, 4, 1, 230, 26, 2, 250, 31, 51, 7, 6, 1, 144,
+ 2, 216, 89, 22, 142, 7, 4, 1, 144, 2, 216, 89, 22, 142, 7, 6, 1, 144, 2,
+ 216, 89, 22, 248, 1, 7, 4, 1, 144, 2, 216, 89, 22, 248, 1, 7, 6, 1, 144,
+ 2, 231, 233, 22, 242, 136, 7, 4, 1, 144, 2, 231, 233, 22, 242, 136, 7, 6,
+ 1, 144, 2, 231, 233, 22, 142, 7, 4, 1, 144, 2, 231, 233, 22, 142, 7, 6,
+ 1, 226, 106, 2, 142, 7, 4, 1, 226, 106, 2, 142, 7, 6, 1, 226, 106, 2, 59,
+ 48, 7, 4, 1, 226, 106, 2, 59, 48, 7, 6, 1, 223, 224, 2, 59, 48, 7, 4, 1,
+ 223, 224, 2, 59, 48, 7, 6, 1, 223, 224, 2, 59, 51, 7, 4, 1, 223, 224, 2,
+ 59, 51, 7, 6, 1, 223, 224, 2, 59, 252, 43, 22, 231, 232, 7, 4, 1, 223,
+ 224, 2, 59, 252, 43, 22, 231, 232, 7, 6, 1, 223, 224, 2, 232, 214, 51, 7,
+ 4, 1, 223, 224, 2, 232, 214, 51, 7, 6, 1, 222, 92, 2, 59, 48, 7, 4, 1,
+ 222, 92, 2, 59, 48, 7, 6, 1, 222, 92, 2, 59, 51, 7, 4, 1, 222, 92, 2, 59,
+ 51, 7, 6, 1, 222, 92, 2, 255, 3, 22, 59, 48, 7, 4, 1, 222, 92, 2, 255, 3,
+ 22, 59, 48, 7, 6, 1, 222, 92, 2, 250, 235, 22, 59, 48, 7, 4, 1, 222, 92,
+ 2, 250, 235, 22, 59, 48, 7, 6, 1, 222, 92, 2, 59, 252, 43, 22, 59, 48, 7,
+ 4, 1, 222, 92, 2, 59, 252, 43, 22, 59, 48, 7, 6, 1, 217, 153, 2, 59, 48,
+ 7, 4, 1, 217, 153, 2, 59, 48, 7, 6, 1, 217, 153, 2, 59, 51, 7, 4, 1, 217,
+ 153, 2, 59, 51, 7, 6, 1, 217, 153, 2, 232, 214, 51, 7, 4, 1, 217, 153, 2,
+ 232, 214, 51, 7, 6, 1, 217, 153, 2, 250, 31, 51, 7, 4, 1, 217, 153, 2,
+ 250, 31, 51, 7, 6, 1, 104, 2, 248, 2, 51, 7, 4, 1, 104, 2, 248, 2, 51, 7,
+ 6, 1, 104, 2, 216, 89, 51, 7, 4, 1, 104, 2, 216, 89, 51, 7, 6, 1, 104, 2,
+ 250, 31, 51, 7, 4, 1, 104, 2, 250, 31, 51, 7, 6, 1, 104, 2, 216, 89, 22,
+ 142, 7, 4, 1, 104, 2, 216, 89, 22, 142, 7, 6, 1, 104, 2, 231, 233, 22,
+ 248, 1, 7, 4, 1, 104, 2, 231, 233, 22, 248, 1, 7, 6, 1, 214, 106, 2, 182,
+ 7, 4, 1, 214, 106, 2, 182, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, 214,
+ 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 136, 7, 4, 1, 212, 99, 2, 242,
+ 136, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, 212,
+ 99, 2, 248, 1, 7, 4, 1, 212, 99, 2, 248, 1, 7, 6, 1, 212, 99, 2, 59, 48,
+ 7, 4, 1, 212, 99, 2, 59, 48, 7, 6, 1, 212, 99, 2, 59, 51, 7, 4, 1, 212,
+ 99, 2, 59, 51, 7, 6, 1, 211, 179, 2, 59, 48, 7, 4, 1, 211, 179, 2, 59,
+ 48, 7, 6, 1, 211, 179, 2, 248, 1, 7, 4, 1, 211, 179, 2, 248, 1, 7, 6, 1,
+ 211, 118, 2, 59, 48, 7, 4, 1, 211, 118, 2, 59, 48, 7, 6, 1, 210, 160, 2,
+ 250, 30, 7, 4, 1, 210, 160, 2, 250, 30, 7, 6, 1, 210, 160, 2, 59, 51, 7,
+ 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 214, 51, 7, 4, 1,
+ 210, 160, 2, 232, 214, 51, 7, 4, 1, 242, 61, 2, 232, 214, 51, 7, 4, 1,
+ 217, 153, 2, 248, 1, 7, 4, 1, 212, 99, 2, 222, 234, 48, 7, 4, 1, 211,
+ 118, 2, 222, 234, 48, 7, 4, 1, 115, 2, 44, 163, 222, 233, 7, 4, 1, 199,
+ 222, 92, 2, 59, 48, 7, 4, 1, 199, 222, 92, 2, 247, 255, 91, 7, 4, 1, 199,
+ 222, 92, 2, 125, 91, 7, 6, 1, 220, 76, 222, 91, 7, 4, 1, 248, 54, 7, 6,
+ 1, 115, 2, 59, 51, 7, 4, 1, 115, 2, 59, 51, 7, 6, 1, 115, 2, 241, 52, 48,
+ 7, 4, 1, 115, 2, 241, 52, 48, 7, 6, 1, 115, 2, 250, 31, 22, 142, 7, 4, 1,
+ 115, 2, 250, 31, 22, 142, 7, 6, 1, 115, 2, 250, 31, 22, 242, 136, 7, 4,
+ 1, 115, 2, 250, 31, 22, 242, 136, 7, 6, 1, 115, 2, 250, 31, 22, 241, 52,
+ 48, 7, 4, 1, 115, 2, 250, 31, 22, 241, 52, 48, 7, 6, 1, 115, 2, 250, 31,
+ 22, 182, 7, 4, 1, 115, 2, 250, 31, 22, 182, 7, 6, 1, 115, 2, 250, 31, 22,
+ 59, 51, 7, 4, 1, 115, 2, 250, 31, 22, 59, 51, 7, 6, 1, 115, 2, 251, 147,
+ 22, 142, 7, 4, 1, 115, 2, 251, 147, 22, 142, 7, 6, 1, 115, 2, 251, 147,
+ 22, 242, 136, 7, 4, 1, 115, 2, 251, 147, 22, 242, 136, 7, 6, 1, 115, 2,
+ 251, 147, 22, 241, 52, 48, 7, 4, 1, 115, 2, 251, 147, 22, 241, 52, 48, 7,
+ 6, 1, 115, 2, 251, 147, 22, 182, 7, 4, 1, 115, 2, 251, 147, 22, 182, 7,
+ 6, 1, 115, 2, 251, 147, 22, 59, 51, 7, 4, 1, 115, 2, 251, 147, 22, 59,
+ 51, 7, 6, 1, 160, 2, 59, 51, 7, 4, 1, 160, 2, 59, 51, 7, 6, 1, 160, 2,
+ 241, 52, 48, 7, 4, 1, 160, 2, 241, 52, 48, 7, 6, 1, 160, 2, 182, 7, 4, 1,
+ 160, 2, 182, 7, 6, 1, 160, 2, 250, 31, 22, 142, 7, 4, 1, 160, 2, 250, 31,
+ 22, 142, 7, 6, 1, 160, 2, 250, 31, 22, 242, 136, 7, 4, 1, 160, 2, 250,
+ 31, 22, 242, 136, 7, 6, 1, 160, 2, 250, 31, 22, 241, 52, 48, 7, 4, 1,
+ 160, 2, 250, 31, 22, 241, 52, 48, 7, 6, 1, 160, 2, 250, 31, 22, 182, 7,
+ 4, 1, 160, 2, 250, 31, 22, 182, 7, 6, 1, 160, 2, 250, 31, 22, 59, 51, 7,
+ 4, 1, 160, 2, 250, 31, 22, 59, 51, 7, 6, 1, 240, 154, 2, 241, 52, 48, 7,
+ 4, 1, 240, 154, 2, 241, 52, 48, 7, 6, 1, 240, 154, 2, 59, 51, 7, 4, 1,
+ 240, 154, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7,
+ 6, 1, 144, 2, 241, 52, 48, 7, 4, 1, 144, 2, 241, 52, 48, 7, 6, 1, 144, 2,
+ 250, 31, 22, 142, 7, 4, 1, 144, 2, 250, 31, 22, 142, 7, 6, 1, 144, 2,
+ 250, 31, 22, 242, 136, 7, 4, 1, 144, 2, 250, 31, 22, 242, 136, 7, 6, 1,
+ 144, 2, 250, 31, 22, 241, 52, 48, 7, 4, 1, 144, 2, 250, 31, 22, 241, 52,
+ 48, 7, 6, 1, 144, 2, 250, 31, 22, 182, 7, 4, 1, 144, 2, 250, 31, 22, 182,
+ 7, 6, 1, 144, 2, 250, 31, 22, 59, 51, 7, 4, 1, 144, 2, 250, 31, 22, 59,
+ 51, 7, 6, 1, 144, 2, 240, 249, 22, 142, 7, 4, 1, 144, 2, 240, 249, 22,
+ 142, 7, 6, 1, 144, 2, 240, 249, 22, 242, 136, 7, 4, 1, 144, 2, 240, 249,
+ 22, 242, 136, 7, 6, 1, 144, 2, 240, 249, 22, 241, 52, 48, 7, 4, 1, 144,
+ 2, 240, 249, 22, 241, 52, 48, 7, 6, 1, 144, 2, 240, 249, 22, 182, 7, 4,
+ 1, 144, 2, 240, 249, 22, 182, 7, 6, 1, 144, 2, 240, 249, 22, 59, 51, 7,
+ 4, 1, 144, 2, 240, 249, 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1,
+ 104, 2, 59, 51, 7, 6, 1, 104, 2, 241, 52, 48, 7, 4, 1, 104, 2, 241, 52,
+ 48, 7, 6, 1, 104, 2, 240, 249, 22, 142, 7, 4, 1, 104, 2, 240, 249, 22,
+ 142, 7, 6, 1, 104, 2, 240, 249, 22, 242, 136, 7, 4, 1, 104, 2, 240, 249,
+ 22, 242, 136, 7, 6, 1, 104, 2, 240, 249, 22, 241, 52, 48, 7, 4, 1, 104,
+ 2, 240, 249, 22, 241, 52, 48, 7, 6, 1, 104, 2, 240, 249, 22, 182, 7, 4,
+ 1, 104, 2, 240, 249, 22, 182, 7, 6, 1, 104, 2, 240, 249, 22, 59, 51, 7,
+ 4, 1, 104, 2, 240, 249, 22, 59, 51, 7, 6, 1, 211, 118, 2, 242, 136, 7, 4,
+ 1, 211, 118, 2, 242, 136, 7, 6, 1, 211, 118, 2, 59, 51, 7, 4, 1, 211,
+ 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 52, 48, 7, 4, 1, 211, 118, 2,
+ 241, 52, 48, 7, 6, 1, 211, 118, 2, 182, 7, 4, 1, 211, 118, 2, 182, 7, 6,
+ 1, 230, 223, 232, 185, 7, 4, 1, 230, 223, 232, 185, 7, 6, 1, 230, 223,
+ 214, 105, 7, 4, 1, 230, 223, 214, 105, 7, 6, 1, 211, 118, 2, 232, 123, 7,
+ 4, 1, 211, 118, 2, 232, 123, 26, 4, 1, 254, 144, 2, 224, 154, 26, 4, 1,
+ 254, 144, 2, 248, 153, 26, 4, 1, 254, 144, 2, 224, 155, 22, 214, 13, 26,
+ 4, 1, 254, 144, 2, 248, 154, 22, 214, 13, 26, 4, 1, 254, 144, 2, 224,
+ 155, 22, 226, 110, 26, 4, 1, 254, 144, 2, 248, 154, 22, 226, 110, 26, 4,
+ 1, 254, 144, 2, 224, 155, 22, 225, 175, 26, 4, 1, 254, 144, 2, 248, 154,
+ 22, 225, 175, 26, 6, 1, 254, 144, 2, 224, 154, 26, 6, 1, 254, 144, 2,
+ 248, 153, 26, 6, 1, 254, 144, 2, 224, 155, 22, 214, 13, 26, 6, 1, 254,
+ 144, 2, 248, 154, 22, 214, 13, 26, 6, 1, 254, 144, 2, 224, 155, 22, 226,
+ 110, 26, 6, 1, 254, 144, 2, 248, 154, 22, 226, 110, 26, 6, 1, 254, 144,
+ 2, 224, 155, 22, 225, 175, 26, 6, 1, 254, 144, 2, 248, 154, 22, 225, 175,
+ 26, 4, 1, 245, 101, 2, 224, 154, 26, 4, 1, 245, 101, 2, 248, 153, 26, 4,
+ 1, 245, 101, 2, 224, 155, 22, 214, 13, 26, 4, 1, 245, 101, 2, 248, 154,
+ 22, 214, 13, 26, 4, 1, 245, 101, 2, 224, 155, 22, 226, 110, 26, 4, 1,
+ 245, 101, 2, 248, 154, 22, 226, 110, 26, 6, 1, 245, 101, 2, 224, 154, 26,
+ 6, 1, 245, 101, 2, 248, 153, 26, 6, 1, 245, 101, 2, 224, 155, 22, 214,
+ 13, 26, 6, 1, 245, 101, 2, 248, 154, 22, 214, 13, 26, 6, 1, 245, 101, 2,
+ 224, 155, 22, 226, 110, 26, 6, 1, 245, 101, 2, 248, 154, 22, 226, 110,
+ 26, 4, 1, 245, 64, 2, 224, 154, 26, 4, 1, 245, 64, 2, 248, 153, 26, 4, 1,
+ 245, 64, 2, 224, 155, 22, 214, 13, 26, 4, 1, 245, 64, 2, 248, 154, 22,
+ 214, 13, 26, 4, 1, 245, 64, 2, 224, 155, 22, 226, 110, 26, 4, 1, 245, 64,
+ 2, 248, 154, 22, 226, 110, 26, 4, 1, 245, 64, 2, 224, 155, 22, 225, 175,
+ 26, 4, 1, 245, 64, 2, 248, 154, 22, 225, 175, 26, 6, 1, 245, 64, 2, 224,
+ 154, 26, 6, 1, 245, 64, 2, 248, 153, 26, 6, 1, 245, 64, 2, 224, 155, 22,
+ 214, 13, 26, 6, 1, 245, 64, 2, 248, 154, 22, 214, 13, 26, 6, 1, 245, 64,
+ 2, 224, 155, 22, 226, 110, 26, 6, 1, 245, 64, 2, 248, 154, 22, 226, 110,
+ 26, 6, 1, 245, 64, 2, 224, 155, 22, 225, 175, 26, 6, 1, 245, 64, 2, 248,
+ 154, 22, 225, 175, 26, 4, 1, 235, 186, 2, 224, 154, 26, 4, 1, 235, 186,
+ 2, 248, 153, 26, 4, 1, 235, 186, 2, 224, 155, 22, 214, 13, 26, 4, 1, 235,
+ 186, 2, 248, 154, 22, 214, 13, 26, 4, 1, 235, 186, 2, 224, 155, 22, 226,
+ 110, 26, 4, 1, 235, 186, 2, 248, 154, 22, 226, 110, 26, 4, 1, 235, 186,
+ 2, 224, 155, 22, 225, 175, 26, 4, 1, 235, 186, 2, 248, 154, 22, 225, 175,
+ 26, 6, 1, 235, 186, 2, 224, 154, 26, 6, 1, 235, 186, 2, 248, 153, 26, 6,
+ 1, 235, 186, 2, 224, 155, 22, 214, 13, 26, 6, 1, 235, 186, 2, 248, 154,
+ 22, 214, 13, 26, 6, 1, 235, 186, 2, 224, 155, 22, 226, 110, 26, 6, 1,
+ 235, 186, 2, 248, 154, 22, 226, 110, 26, 6, 1, 235, 186, 2, 224, 155, 22,
+ 225, 175, 26, 6, 1, 235, 186, 2, 248, 154, 22, 225, 175, 26, 4, 1, 226,
+ 200, 2, 224, 154, 26, 4, 1, 226, 200, 2, 248, 153, 26, 4, 1, 226, 200, 2,
+ 224, 155, 22, 214, 13, 26, 4, 1, 226, 200, 2, 248, 154, 22, 214, 13, 26,
+ 4, 1, 226, 200, 2, 224, 155, 22, 226, 110, 26, 4, 1, 226, 200, 2, 248,
+ 154, 22, 226, 110, 26, 6, 1, 226, 200, 2, 224, 154, 26, 6, 1, 226, 200,
+ 2, 248, 153, 26, 6, 1, 226, 200, 2, 224, 155, 22, 214, 13, 26, 6, 1, 226,
+ 200, 2, 248, 154, 22, 214, 13, 26, 6, 1, 226, 200, 2, 224, 155, 22, 226,
+ 110, 26, 6, 1, 226, 200, 2, 248, 154, 22, 226, 110, 26, 4, 1, 214, 158,
+ 2, 224, 154, 26, 4, 1, 214, 158, 2, 248, 153, 26, 4, 1, 214, 158, 2, 224,
+ 155, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 154, 22, 214, 13, 26, 4, 1,
+ 214, 158, 2, 224, 155, 22, 226, 110, 26, 4, 1, 214, 158, 2, 248, 154, 22,
+ 226, 110, 26, 4, 1, 214, 158, 2, 224, 155, 22, 225, 175, 26, 4, 1, 214,
+ 158, 2, 248, 154, 22, 225, 175, 26, 6, 1, 214, 158, 2, 248, 153, 26, 6,
+ 1, 214, 158, 2, 248, 154, 22, 214, 13, 26, 6, 1, 214, 158, 2, 248, 154,
+ 22, 226, 110, 26, 6, 1, 214, 158, 2, 248, 154, 22, 225, 175, 26, 4, 1,
+ 226, 202, 2, 224, 154, 26, 4, 1, 226, 202, 2, 248, 153, 26, 4, 1, 226,
+ 202, 2, 224, 155, 22, 214, 13, 26, 4, 1, 226, 202, 2, 248, 154, 22, 214,
+ 13, 26, 4, 1, 226, 202, 2, 224, 155, 22, 226, 110, 26, 4, 1, 226, 202, 2,
+ 248, 154, 22, 226, 110, 26, 4, 1, 226, 202, 2, 224, 155, 22, 225, 175,
+ 26, 4, 1, 226, 202, 2, 248, 154, 22, 225, 175, 26, 6, 1, 226, 202, 2,
+ 224, 154, 26, 6, 1, 226, 202, 2, 248, 153, 26, 6, 1, 226, 202, 2, 224,
+ 155, 22, 214, 13, 26, 6, 1, 226, 202, 2, 248, 154, 22, 214, 13, 26, 6, 1,
+ 226, 202, 2, 224, 155, 22, 226, 110, 26, 6, 1, 226, 202, 2, 248, 154, 22,
+ 226, 110, 26, 6, 1, 226, 202, 2, 224, 155, 22, 225, 175, 26, 6, 1, 226,
+ 202, 2, 248, 154, 22, 225, 175, 26, 4, 1, 254, 144, 2, 214, 13, 26, 4, 1,
+ 254, 144, 2, 226, 110, 26, 4, 1, 245, 101, 2, 214, 13, 26, 4, 1, 245,
+ 101, 2, 226, 110, 26, 4, 1, 245, 64, 2, 214, 13, 26, 4, 1, 245, 64, 2,
+ 226, 110, 26, 4, 1, 235, 186, 2, 214, 13, 26, 4, 1, 235, 186, 2, 226,
+ 110, 26, 4, 1, 226, 200, 2, 214, 13, 26, 4, 1, 226, 200, 2, 226, 110, 26,
+ 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, 158, 2, 226, 110, 26, 4, 1,
+ 226, 202, 2, 214, 13, 26, 4, 1, 226, 202, 2, 226, 110, 26, 4, 1, 254,
+ 144, 2, 224, 155, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154, 22, 210,
+ 219, 26, 4, 1, 254, 144, 2, 224, 155, 22, 214, 14, 22, 210, 219, 26, 4,
+ 1, 254, 144, 2, 248, 154, 22, 214, 14, 22, 210, 219, 26, 4, 1, 254, 144,
+ 2, 224, 155, 22, 226, 111, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154,
+ 22, 226, 111, 22, 210, 219, 26, 4, 1, 254, 144, 2, 224, 155, 22, 225,
+ 176, 22, 210, 219, 26, 4, 1, 254, 144, 2, 248, 154, 22, 225, 176, 22,
+ 210, 219, 26, 6, 1, 254, 144, 2, 224, 155, 22, 224, 167, 26, 6, 1, 254,
+ 144, 2, 248, 154, 22, 224, 167, 26, 6, 1, 254, 144, 2, 224, 155, 22, 214,
+ 14, 22, 224, 167, 26, 6, 1, 254, 144, 2, 248, 154, 22, 214, 14, 22, 224,
+ 167, 26, 6, 1, 254, 144, 2, 224, 155, 22, 226, 111, 22, 224, 167, 26, 6,
+ 1, 254, 144, 2, 248, 154, 22, 226, 111, 22, 224, 167, 26, 6, 1, 254, 144,
+ 2, 224, 155, 22, 225, 176, 22, 224, 167, 26, 6, 1, 254, 144, 2, 248, 154,
+ 22, 225, 176, 22, 224, 167, 26, 4, 1, 245, 64, 2, 224, 155, 22, 210, 219,
+ 26, 4, 1, 245, 64, 2, 248, 154, 22, 210, 219, 26, 4, 1, 245, 64, 2, 224,
+ 155, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 248, 154, 22, 214,
+ 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 224, 155, 22, 226, 111, 22, 210,
+ 219, 26, 4, 1, 245, 64, 2, 248, 154, 22, 226, 111, 22, 210, 219, 26, 4,
+ 1, 245, 64, 2, 224, 155, 22, 225, 176, 22, 210, 219, 26, 4, 1, 245, 64,
+ 2, 248, 154, 22, 225, 176, 22, 210, 219, 26, 6, 1, 245, 64, 2, 224, 155,
+ 22, 224, 167, 26, 6, 1, 245, 64, 2, 248, 154, 22, 224, 167, 26, 6, 1,
+ 245, 64, 2, 224, 155, 22, 214, 14, 22, 224, 167, 26, 6, 1, 245, 64, 2,
+ 248, 154, 22, 214, 14, 22, 224, 167, 26, 6, 1, 245, 64, 2, 224, 155, 22,
+ 226, 111, 22, 224, 167, 26, 6, 1, 245, 64, 2, 248, 154, 22, 226, 111, 22,
+ 224, 167, 26, 6, 1, 245, 64, 2, 224, 155, 22, 225, 176, 22, 224, 167, 26,
+ 6, 1, 245, 64, 2, 248, 154, 22, 225, 176, 22, 224, 167, 26, 4, 1, 226,
+ 202, 2, 224, 155, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154, 22, 210,
+ 219, 26, 4, 1, 226, 202, 2, 224, 155, 22, 214, 14, 22, 210, 219, 26, 4,
+ 1, 226, 202, 2, 248, 154, 22, 214, 14, 22, 210, 219, 26, 4, 1, 226, 202,
+ 2, 224, 155, 22, 226, 111, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154,
+ 22, 226, 111, 22, 210, 219, 26, 4, 1, 226, 202, 2, 224, 155, 22, 225,
+ 176, 22, 210, 219, 26, 4, 1, 226, 202, 2, 248, 154, 22, 225, 176, 22,
+ 210, 219, 26, 6, 1, 226, 202, 2, 224, 155, 22, 224, 167, 26, 6, 1, 226,
+ 202, 2, 248, 154, 22, 224, 167, 26, 6, 1, 226, 202, 2, 224, 155, 22, 214,
+ 14, 22, 224, 167, 26, 6, 1, 226, 202, 2, 248, 154, 22, 214, 14, 22, 224,
+ 167, 26, 6, 1, 226, 202, 2, 224, 155, 22, 226, 111, 22, 224, 167, 26, 6,
+ 1, 226, 202, 2, 248, 154, 22, 226, 111, 22, 224, 167, 26, 6, 1, 226, 202,
+ 2, 224, 155, 22, 225, 176, 22, 224, 167, 26, 6, 1, 226, 202, 2, 248, 154,
+ 22, 225, 176, 22, 224, 167, 26, 4, 1, 254, 144, 2, 213, 120, 26, 4, 1,
+ 254, 144, 2, 231, 232, 26, 4, 1, 254, 144, 2, 214, 14, 22, 210, 219, 26,
+ 4, 1, 254, 144, 2, 210, 219, 26, 4, 1, 254, 144, 2, 226, 111, 22, 210,
+ 219, 26, 4, 1, 254, 144, 2, 225, 175, 26, 4, 1, 254, 144, 2, 225, 176,
+ 22, 210, 219, 26, 6, 1, 254, 144, 2, 213, 120, 26, 6, 1, 254, 144, 2,
+ 231, 232, 26, 6, 1, 254, 144, 2, 214, 13, 26, 6, 1, 254, 144, 2, 226,
+ 110, 26, 6, 1, 254, 144, 2, 224, 167, 26, 234, 2, 26, 224, 167, 26, 224,
+ 154, 26, 225, 175, 26, 247, 252, 22, 225, 175, 26, 4, 1, 245, 64, 2, 214,
+ 14, 22, 210, 219, 26, 4, 1, 245, 64, 2, 210, 219, 26, 4, 1, 245, 64, 2,
+ 226, 111, 22, 210, 219, 26, 4, 1, 245, 64, 2, 225, 175, 26, 4, 1, 245,
+ 64, 2, 225, 176, 22, 210, 219, 26, 6, 1, 245, 101, 2, 214, 13, 26, 6, 1,
+ 245, 101, 2, 226, 110, 26, 6, 1, 245, 64, 2, 214, 13, 26, 6, 1, 245, 64,
+ 2, 226, 110, 26, 6, 1, 245, 64, 2, 224, 167, 26, 224, 155, 22, 214, 13,
+ 26, 224, 155, 22, 226, 110, 26, 224, 155, 22, 225, 175, 26, 4, 1, 235,
+ 186, 2, 213, 120, 26, 4, 1, 235, 186, 2, 231, 232, 26, 4, 1, 235, 186, 2,
+ 247, 252, 22, 214, 13, 26, 4, 1, 235, 186, 2, 247, 252, 22, 226, 110, 26,
+ 4, 1, 235, 186, 2, 225, 175, 26, 4, 1, 235, 186, 2, 247, 252, 22, 225,
+ 175, 26, 6, 1, 235, 186, 2, 213, 120, 26, 6, 1, 235, 186, 2, 231, 232,
+ 26, 6, 1, 235, 186, 2, 214, 13, 26, 6, 1, 235, 186, 2, 226, 110, 26, 248,
+ 154, 22, 214, 13, 26, 248, 154, 22, 226, 110, 26, 248, 154, 22, 225, 175,
+ 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 232, 26, 4,
+ 1, 214, 158, 2, 247, 252, 22, 214, 13, 26, 4, 1, 214, 158, 2, 247, 252,
+ 22, 226, 110, 26, 4, 1, 223, 38, 2, 224, 154, 26, 4, 1, 223, 38, 2, 248,
+ 153, 26, 4, 1, 214, 158, 2, 225, 175, 26, 4, 1, 214, 158, 2, 247, 252,
+ 22, 225, 175, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2,
+ 231, 232, 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226,
+ 110, 26, 6, 1, 223, 38, 2, 248, 153, 26, 247, 252, 22, 214, 13, 26, 247,
+ 252, 22, 226, 110, 26, 214, 13, 26, 4, 1, 226, 202, 2, 214, 14, 22, 210,
+ 219, 26, 4, 1, 226, 202, 2, 210, 219, 26, 4, 1, 226, 202, 2, 226, 111,
+ 22, 210, 219, 26, 4, 1, 226, 202, 2, 225, 175, 26, 4, 1, 226, 202, 2,
+ 225, 176, 22, 210, 219, 26, 6, 1, 226, 200, 2, 214, 13, 26, 6, 1, 226,
+ 200, 2, 226, 110, 26, 6, 1, 226, 202, 2, 214, 13, 26, 6, 1, 226, 202, 2,
+ 226, 110, 26, 6, 1, 226, 202, 2, 224, 167, 26, 226, 110, 26, 248, 153,
+ 245, 151, 224, 27, 245, 160, 224, 27, 245, 151, 219, 18, 245, 160, 219,
+ 18, 216, 141, 219, 18, 244, 9, 219, 18, 219, 123, 219, 18, 244, 112, 219,
+ 18, 224, 141, 219, 18, 216, 170, 219, 18, 242, 35, 219, 18, 210, 87, 211,
+ 245, 219, 18, 210, 87, 211, 245, 228, 67, 210, 87, 211, 245, 235, 63,
+ 233, 38, 78, 222, 243, 78, 240, 168, 228, 68, 240, 168, 244, 112, 248,
+ 156, 245, 151, 248, 156, 245, 160, 248, 156, 203, 130, 52, 67, 232, 213,
+ 52, 121, 232, 213, 43, 219, 155, 223, 254, 78, 44, 219, 155, 223, 254,
+ 78, 219, 155, 232, 109, 223, 254, 78, 219, 155, 241, 163, 223, 254, 78,
+ 43, 52, 223, 254, 78, 44, 52, 223, 254, 78, 52, 232, 109, 223, 254, 78,
+ 52, 241, 163, 223, 254, 78, 248, 205, 52, 248, 205, 251, 113, 215, 222,
+ 251, 113, 123, 59, 233, 56, 113, 59, 233, 56, 203, 245, 163, 240, 166,
+ 225, 10, 232, 214, 220, 137, 226, 15, 220, 137, 233, 38, 245, 158, 222,
+ 243, 245, 158, 224, 246, 247, 196, 244, 19, 233, 38, 226, 117, 222, 243,
+ 226, 117, 229, 194, 228, 73, 219, 18, 225, 183, 230, 193, 50, 225, 183,
+ 216, 248, 216, 148, 50, 224, 190, 52, 224, 190, 215, 211, 224, 190, 223,
+ 49, 224, 190, 223, 49, 52, 224, 190, 223, 49, 215, 211, 224, 190, 250,
+ 238, 219, 155, 233, 42, 254, 110, 223, 254, 78, 219, 155, 222, 247, 254,
+ 110, 223, 254, 78, 223, 107, 78, 52, 245, 31, 78, 235, 201, 226, 119,
+ 214, 180, 135, 216, 111, 250, 239, 235, 216, 225, 10, 253, 214, 240, 169,
+ 251, 113, 244, 2, 219, 95, 43, 42, 251, 158, 2, 224, 7, 44, 42, 251, 158,
+ 2, 224, 7, 52, 224, 13, 78, 224, 13, 245, 31, 78, 245, 31, 224, 13, 78,
+ 216, 70, 5, 245, 65, 223, 49, 225, 68, 50, 85, 140, 251, 113, 85, 97,
+ 251, 113, 121, 253, 216, 223, 49, 220, 150, 250, 1, 214, 163, 113, 253,
+ 215, 254, 158, 213, 188, 249, 217, 230, 182, 50, 217, 234, 248, 156, 235,
+ 193, 214, 180, 244, 52, 224, 141, 78, 134, 59, 224, 140, 224, 24, 224,
+ 190, 244, 11, 59, 224, 140, 244, 81, 59, 224, 140, 113, 59, 224, 140,
+ 244, 11, 59, 78, 246, 118, 249, 130, 215, 221, 67, 244, 11, 247, 118,
+ 231, 82, 11, 219, 18, 211, 209, 235, 63, 243, 227, 254, 52, 235, 191,
+ 216, 85, 235, 191, 220, 137, 235, 191, 225, 22, 235, 228, 217, 182, 217,
+ 251, 255, 5, 217, 182, 217, 251, 235, 228, 10, 244, 20, 220, 80, 255, 5,
+ 10, 244, 20, 220, 80, 229, 189, 21, 220, 81, 228, 69, 21, 220, 81, 218,
+ 23, 210, 86, 218, 23, 7, 4, 1, 73, 218, 23, 161, 218, 23, 189, 218, 23,
+ 194, 218, 23, 198, 218, 23, 195, 218, 23, 200, 218, 23, 96, 50, 218, 23,
+ 230, 181, 218, 23, 245, 98, 50, 218, 23, 43, 226, 3, 218, 23, 44, 226, 3,
+ 218, 23, 7, 4, 1, 230, 25, 218, 65, 210, 86, 218, 65, 110, 218, 65, 105,
+ 218, 65, 158, 218, 65, 161, 218, 65, 189, 218, 65, 194, 218, 65, 198,
+ 218, 65, 195, 218, 65, 200, 218, 65, 96, 50, 218, 65, 230, 181, 218, 65,
+ 245, 98, 50, 218, 65, 43, 226, 3, 218, 65, 44, 226, 3, 7, 218, 65, 4, 1,
+ 61, 7, 218, 65, 4, 1, 75, 7, 218, 65, 4, 1, 76, 7, 218, 65, 4, 1, 211,
+ 178, 7, 218, 65, 4, 1, 221, 195, 7, 218, 65, 4, 1, 242, 60, 7, 218, 65,
+ 4, 1, 235, 23, 7, 218, 65, 4, 1, 156, 7, 218, 65, 4, 1, 193, 7, 218, 65,
+ 4, 1, 230, 25, 7, 218, 65, 4, 1, 226, 105, 7, 218, 65, 4, 1, 222, 91, 7,
+ 218, 65, 4, 1, 217, 152, 245, 46, 50, 249, 227, 50, 249, 117, 50, 243,
+ 251, 243, 254, 50, 232, 198, 50, 230, 194, 50, 229, 210, 50, 225, 162,
+ 50, 222, 118, 50, 211, 217, 50, 166, 220, 49, 50, 247, 127, 50, 245, 47,
+ 50, 234, 76, 50, 215, 112, 50, 246, 101, 50, 243, 40, 225, 193, 50, 225,
+ 160, 50, 242, 109, 50, 253, 182, 50, 240, 228, 50, 250, 185, 50, 232,
+ 191, 216, 3, 50, 219, 0, 50, 216, 245, 50, 235, 241, 222, 118, 50, 38,
+ 43, 241, 255, 48, 38, 44, 241, 255, 48, 38, 199, 67, 232, 214, 226, 120,
+ 38, 219, 251, 67, 232, 214, 226, 120, 38, 254, 88, 80, 48, 38, 250, 2,
+ 80, 48, 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 234, 226, 120, 38, 250,
+ 2, 222, 234, 226, 120, 38, 254, 88, 222, 234, 226, 120, 38, 134, 170, 48,
+ 38, 244, 11, 170, 48, 38, 245, 146, 250, 35, 38, 245, 146, 218, 234, 38,
+ 245, 146, 247, 248, 38, 245, 146, 250, 36, 252, 180, 38, 43, 44, 80, 48,
+ 38, 245, 146, 221, 188, 38, 245, 146, 234, 135, 38, 245, 146, 214, 155,
+ 225, 7, 215, 225, 38, 223, 50, 219, 47, 226, 120, 38, 52, 67, 218, 103,
+ 226, 120, 38, 254, 98, 87, 38, 215, 211, 214, 182, 38, 211, 247, 251,
+ 140, 48, 38, 140, 80, 226, 120, 38, 199, 52, 219, 47, 226, 120, 38, 97,
+ 241, 255, 2, 252, 139, 246, 103, 38, 140, 241, 255, 2, 252, 139, 246,
+ 103, 38, 43, 80, 51, 38, 44, 80, 51, 38, 253, 217, 48, 255, 11, 226, 231,
+ 254, 251, 216, 42, 216, 196, 218, 74, 139, 6, 251, 66, 248, 71, 250, 178,
+ 250, 175, 232, 214, 87, 250, 240, 226, 231, 251, 26, 214, 189, 245, 48,
+ 249, 191, 221, 185, 248, 71, 244, 179, 119, 4, 243, 202, 119, 6, 242, 60,
+ 251, 219, 6, 242, 60, 139, 6, 242, 60, 225, 37, 249, 191, 225, 37, 249,
+ 192, 117, 113, 225, 108, 119, 6, 73, 251, 219, 6, 73, 119, 6, 156, 119,
+ 4, 156, 233, 149, 57, 252, 141, 87, 139, 6, 230, 25, 227, 196, 50, 219,
+ 31, 223, 119, 249, 162, 119, 6, 226, 105, 139, 6, 226, 105, 139, 6, 224,
+ 96, 119, 6, 153, 251, 219, 6, 153, 139, 6, 153, 224, 196, 217, 71, 223,
+ 62, 220, 132, 78, 217, 1, 50, 215, 253, 164, 50, 213, 240, 139, 6, 210,
+ 159, 226, 133, 50, 226, 221, 50, 235, 193, 226, 221, 50, 251, 219, 6,
+ 210, 159, 215, 94, 26, 4, 1, 235, 185, 234, 173, 50, 254, 107, 50, 119,
+ 6, 253, 158, 251, 219, 6, 251, 66, 245, 68, 87, 119, 4, 75, 119, 6, 75,
+ 119, 6, 245, 6, 215, 94, 6, 245, 6, 119, 6, 193, 119, 4, 76, 112, 87,
+ 252, 29, 87, 242, 202, 87, 248, 190, 87, 235, 232, 219, 29, 222, 187, 6,
+ 224, 96, 244, 182, 50, 139, 4, 225, 108, 139, 4, 243, 107, 139, 6, 243,
+ 107, 139, 6, 225, 108, 139, 230, 24, 218, 40, 215, 94, 35, 6, 243, 202,
+ 215, 94, 35, 6, 156, 223, 49, 35, 6, 156, 215, 94, 35, 6, 211, 117, 139,
+ 32, 6, 249, 60, 139, 32, 4, 249, 60, 139, 32, 4, 75, 139, 32, 4, 73, 139,
+ 32, 4, 235, 144, 224, 170, 232, 213, 215, 94, 254, 126, 225, 183, 50,
+ 254, 180, 215, 94, 4, 245, 6, 16, 31, 221, 252, 219, 29, 212, 114, 244,
+ 2, 123, 220, 118, 212, 114, 244, 2, 123, 228, 194, 212, 114, 244, 2, 123,
+ 216, 241, 212, 114, 244, 2, 123, 216, 168, 212, 114, 244, 2, 113, 216,
+ 166, 212, 114, 244, 2, 123, 244, 117, 212, 114, 244, 2, 113, 244, 116,
+ 212, 114, 244, 2, 134, 244, 116, 212, 114, 244, 2, 244, 11, 244, 116,
+ 212, 114, 244, 2, 123, 219, 115, 212, 114, 244, 2, 244, 81, 219, 113,
+ 212, 114, 244, 2, 123, 245, 188, 212, 114, 244, 2, 134, 245, 186, 212,
+ 114, 244, 2, 244, 81, 245, 186, 212, 114, 244, 2, 220, 122, 245, 186,
+ 244, 2, 227, 197, 110, 222, 198, 227, 198, 110, 222, 198, 227, 198, 105,
+ 222, 198, 227, 198, 158, 222, 198, 227, 198, 161, 222, 198, 227, 198,
+ 189, 222, 198, 227, 198, 194, 222, 198, 227, 198, 198, 222, 198, 227,
+ 198, 195, 222, 198, 227, 198, 200, 222, 198, 227, 198, 216, 247, 222,
+ 198, 227, 198, 245, 167, 222, 198, 227, 198, 215, 76, 222, 198, 227, 198,
+ 244, 114, 222, 198, 227, 198, 123, 240, 210, 222, 198, 227, 198, 244, 81,
+ 240, 210, 222, 198, 227, 198, 123, 216, 147, 4, 222, 198, 227, 198, 110,
+ 4, 222, 198, 227, 198, 105, 4, 222, 198, 227, 198, 158, 4, 222, 198, 227,
+ 198, 161, 4, 222, 198, 227, 198, 189, 4, 222, 198, 227, 198, 194, 4, 222,
+ 198, 227, 198, 198, 4, 222, 198, 227, 198, 195, 4, 222, 198, 227, 198,
+ 200, 4, 222, 198, 227, 198, 216, 247, 4, 222, 198, 227, 198, 245, 167, 4,
+ 222, 198, 227, 198, 215, 76, 4, 222, 198, 227, 198, 244, 114, 4, 222,
+ 198, 227, 198, 123, 240, 210, 4, 222, 198, 227, 198, 244, 81, 240, 210,
+ 4, 222, 198, 227, 198, 123, 216, 147, 222, 198, 227, 198, 123, 216, 148,
+ 251, 67, 249, 60, 222, 198, 227, 198, 244, 81, 216, 147, 222, 198, 227,
+ 198, 216, 248, 216, 147, 222, 198, 227, 198, 223, 49, 123, 240, 210, 7,
+ 4, 1, 223, 49, 251, 66, 222, 198, 227, 198, 219, 125, 233, 78, 17, 222,
+ 198, 227, 198, 244, 115, 245, 226, 17, 222, 198, 227, 198, 244, 115, 216,
+ 147, 222, 198, 227, 198, 123, 240, 211, 216, 147, 212, 114, 244, 2, 210,
+ 87, 216, 166, 140, 74, 214, 153, 74, 97, 74, 246, 104, 74, 43, 44, 74,
+ 120, 124, 74, 228, 56, 212, 9, 74, 228, 56, 245, 220, 74, 219, 28, 245,
+ 220, 74, 219, 28, 212, 9, 74, 140, 80, 2, 91, 97, 80, 2, 91, 140, 212,
+ 36, 74, 97, 212, 36, 74, 140, 113, 241, 234, 74, 214, 153, 113, 241, 234,
+ 74, 97, 113, 241, 234, 74, 246, 104, 113, 241, 234, 74, 140, 80, 2, 217,
+ 77, 97, 80, 2, 217, 77, 140, 80, 243, 243, 130, 214, 153, 80, 243, 243,
+ 130, 97, 80, 243, 243, 130, 246, 104, 80, 243, 243, 130, 120, 124, 80, 2,
+ 252, 127, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80, 2, 232, 123, 97, 80,
+ 2, 232, 123, 43, 44, 212, 36, 74, 43, 44, 80, 2, 91, 246, 104, 210, 35,
+ 74, 214, 153, 80, 2, 216, 77, 233, 37, 214, 153, 80, 2, 216, 77, 222,
+ 241, 246, 104, 80, 2, 216, 77, 233, 37, 246, 104, 80, 2, 216, 77, 222,
+ 241, 97, 80, 2, 249, 161, 246, 103, 246, 104, 80, 2, 249, 161, 233, 37,
+ 254, 88, 216, 14, 220, 153, 74, 250, 2, 216, 14, 220, 153, 74, 228, 56,
+ 212, 9, 80, 216, 42, 199, 130, 140, 80, 216, 42, 252, 141, 117, 97, 80,
+ 216, 42, 130, 254, 88, 204, 250, 36, 74, 250, 2, 204, 250, 36, 74, 140,
+ 241, 255, 2, 252, 139, 214, 152, 140, 241, 255, 2, 252, 139, 246, 103,
+ 214, 153, 241, 255, 2, 252, 139, 222, 241, 214, 153, 241, 255, 2, 252,
+ 139, 233, 37, 97, 241, 255, 2, 252, 139, 214, 152, 97, 241, 255, 2, 252,
+ 139, 246, 103, 246, 104, 241, 255, 2, 252, 139, 222, 241, 246, 104, 241,
+ 255, 2, 252, 139, 233, 37, 97, 80, 117, 140, 74, 214, 153, 80, 140, 64,
+ 246, 104, 74, 140, 80, 117, 97, 74, 140, 226, 70, 253, 247, 214, 153,
+ 226, 70, 253, 247, 97, 226, 70, 253, 247, 246, 104, 226, 70, 253, 247,
+ 140, 241, 255, 117, 97, 241, 254, 97, 241, 255, 117, 140, 241, 254, 140,
+ 52, 80, 2, 91, 43, 44, 52, 80, 2, 91, 97, 52, 80, 2, 91, 140, 52, 74,
+ 214, 153, 52, 74, 97, 52, 74, 246, 104, 52, 74, 43, 44, 52, 74, 120, 124,
+ 52, 74, 228, 56, 212, 9, 52, 74, 228, 56, 245, 220, 52, 74, 219, 28, 245,
+ 220, 52, 74, 219, 28, 212, 9, 52, 74, 140, 215, 211, 74, 97, 215, 211,
+ 74, 140, 218, 230, 74, 97, 218, 230, 74, 214, 153, 80, 2, 52, 91, 246,
+ 104, 80, 2, 52, 91, 140, 248, 155, 74, 214, 153, 248, 155, 74, 97, 248,
+ 155, 74, 246, 104, 248, 155, 74, 140, 80, 216, 42, 130, 97, 80, 216, 42,
+ 130, 140, 71, 74, 214, 153, 71, 74, 97, 71, 74, 246, 104, 71, 74, 214,
+ 153, 71, 80, 243, 243, 130, 214, 153, 71, 80, 226, 197, 225, 214, 214,
+ 153, 71, 80, 226, 197, 225, 215, 2, 203, 130, 214, 153, 71, 80, 226, 197,
+ 225, 215, 2, 67, 130, 214, 153, 71, 52, 74, 214, 153, 71, 52, 80, 226,
+ 197, 225, 214, 97, 71, 80, 243, 243, 212, 56, 228, 56, 212, 9, 80, 216,
+ 42, 249, 160, 219, 28, 245, 220, 80, 216, 42, 249, 160, 120, 124, 71, 74,
+ 44, 80, 2, 4, 250, 35, 246, 104, 80, 140, 64, 214, 153, 74, 134, 97, 253,
+ 247, 140, 80, 2, 67, 91, 97, 80, 2, 67, 91, 43, 44, 80, 2, 67, 91, 140,
+ 80, 2, 52, 67, 91, 97, 80, 2, 52, 67, 91, 43, 44, 80, 2, 52, 67, 91, 140,
+ 226, 173, 74, 97, 226, 173, 74, 43, 44, 226, 173, 74, 31, 254, 154, 249,
+ 214, 225, 253, 247, 233, 216, 187, 245, 27, 216, 187, 247, 138, 228, 52,
+ 245, 28, 245, 152, 220, 127, 235, 245, 229, 221, 245, 170, 226, 231, 228,
+ 52, 254, 124, 245, 170, 226, 231, 4, 245, 170, 226, 231, 249, 186, 253,
+ 238, 231, 62, 247, 138, 228, 52, 249, 188, 253, 238, 231, 62, 4, 249,
+ 186, 253, 238, 231, 62, 245, 143, 64, 224, 172, 230, 24, 224, 180, 230,
+ 24, 249, 165, 230, 24, 218, 40, 230, 182, 50, 230, 180, 50, 59, 225, 22,
+ 247, 169, 219, 95, 220, 128, 230, 181, 253, 217, 226, 167, 222, 234, 226,
+ 167, 251, 114, 226, 167, 42, 222, 193, 249, 109, 222, 193, 244, 4, 222,
+ 193, 224, 168, 111, 235, 234, 44, 254, 109, 254, 109, 231, 88, 254, 109,
+ 218, 255, 254, 109, 247, 171, 247, 138, 228, 52, 247, 174, 226, 8, 111,
+ 228, 52, 226, 8, 111, 232, 146, 254, 118, 232, 146, 226, 158, 235, 198,
+ 214, 175, 235, 211, 52, 235, 211, 215, 211, 235, 211, 249, 182, 235, 211,
+ 218, 13, 235, 211, 213, 129, 235, 211, 250, 2, 235, 211, 250, 2, 249,
+ 182, 235, 211, 254, 88, 249, 182, 235, 211, 216, 186, 252, 67, 223, 137,
+ 224, 169, 59, 230, 181, 245, 33, 243, 46, 224, 169, 241, 57, 216, 89,
+ 226, 167, 223, 49, 182, 235, 193, 233, 65, 222, 91, 219, 157, 212, 35,
+ 211, 200, 224, 180, 228, 52, 182, 230, 182, 182, 253, 210, 128, 111, 228,
+ 52, 253, 210, 128, 111, 254, 48, 128, 111, 254, 48, 251, 88, 228, 52,
+ 255, 4, 128, 111, 229, 100, 254, 48, 228, 59, 255, 4, 128, 111, 254, 148,
+ 128, 111, 228, 52, 254, 148, 128, 111, 254, 148, 128, 177, 128, 111, 215,
+ 211, 182, 254, 155, 128, 111, 245, 94, 111, 243, 45, 245, 94, 111, 247,
+ 234, 252, 23, 254, 50, 216, 196, 232, 221, 243, 45, 128, 111, 254, 48,
+ 128, 216, 42, 177, 216, 196, 236, 15, 226, 231, 236, 15, 64, 177, 254,
+ 48, 128, 111, 249, 227, 245, 97, 245, 98, 249, 226, 222, 234, 236, 0,
+ 128, 111, 222, 234, 128, 111, 249, 154, 111, 245, 67, 245, 96, 111, 218,
+ 157, 245, 97, 248, 55, 128, 111, 128, 216, 42, 251, 78, 248, 72, 231, 88,
+ 251, 77, 224, 11, 128, 111, 228, 52, 128, 111, 240, 104, 111, 228, 52,
+ 240, 104, 111, 218, 109, 245, 94, 111, 233, 15, 177, 128, 111, 242, 130,
+ 177, 128, 111, 233, 15, 117, 128, 111, 242, 130, 117, 128, 111, 233, 15,
+ 251, 88, 228, 52, 128, 111, 242, 130, 251, 88, 228, 52, 128, 111, 230,
+ 97, 233, 14, 230, 97, 242, 129, 252, 23, 228, 52, 245, 94, 111, 228, 52,
+ 233, 14, 228, 52, 242, 129, 229, 100, 233, 15, 228, 59, 128, 111, 229,
+ 100, 242, 130, 228, 59, 128, 111, 233, 15, 177, 245, 94, 111, 242, 130,
+ 177, 245, 94, 111, 229, 100, 233, 15, 228, 59, 245, 94, 111, 229, 100,
+ 242, 130, 228, 59, 245, 94, 111, 233, 15, 177, 242, 129, 242, 130, 177,
+ 233, 14, 229, 100, 233, 15, 228, 59, 242, 129, 229, 100, 242, 130, 228,
+ 59, 233, 14, 224, 202, 218, 55, 224, 203, 177, 128, 111, 218, 56, 177,
+ 128, 111, 224, 203, 177, 245, 94, 111, 218, 56, 177, 245, 94, 111, 247,
+ 138, 228, 52, 224, 205, 247, 138, 228, 52, 218, 57, 218, 64, 226, 231,
+ 218, 22, 226, 231, 228, 52, 115, 218, 64, 226, 231, 228, 52, 115, 218,
+ 22, 226, 231, 218, 64, 64, 177, 128, 111, 218, 22, 64, 177, 128, 111,
+ 229, 100, 115, 218, 64, 64, 228, 59, 128, 111, 229, 100, 115, 218, 22,
+ 64, 228, 59, 128, 111, 218, 64, 64, 2, 228, 52, 128, 111, 218, 22, 64, 2,
+ 228, 52, 128, 111, 230, 81, 230, 82, 230, 83, 230, 82, 214, 175, 42, 236,
+ 15, 226, 231, 42, 226, 150, 226, 231, 42, 236, 15, 64, 177, 128, 111, 42,
+ 226, 150, 64, 177, 128, 111, 42, 250, 251, 42, 249, 102, 37, 225, 22, 37,
+ 230, 181, 37, 216, 85, 37, 247, 169, 219, 95, 37, 59, 226, 167, 37, 222,
+ 234, 226, 167, 37, 253, 217, 226, 167, 37, 245, 97, 37, 248, 156, 92,
+ 225, 22, 92, 230, 181, 92, 216, 85, 92, 59, 226, 167, 44, 217, 87, 43,
+ 217, 87, 124, 217, 87, 120, 217, 87, 253, 220, 230, 156, 215, 191, 244,
+ 25, 215, 211, 67, 252, 141, 44, 215, 93, 52, 67, 252, 141, 52, 44, 215,
+ 93, 247, 138, 228, 52, 224, 163, 228, 52, 215, 191, 247, 138, 228, 52,
+ 244, 26, 229, 102, 52, 67, 252, 141, 52, 44, 215, 93, 224, 203, 214, 184,
+ 223, 91, 218, 56, 214, 184, 223, 91, 228, 57, 218, 77, 226, 231, 249,
+ 186, 253, 238, 228, 57, 218, 76, 228, 57, 218, 77, 64, 177, 128, 111,
+ 249, 186, 253, 238, 228, 57, 218, 77, 177, 128, 111, 226, 150, 226, 231,
+ 236, 15, 226, 231, 230, 87, 241, 200, 249, 196, 231, 137, 235, 208, 211,
+ 145, 229, 202, 228, 58, 44, 254, 110, 2, 254, 25, 44, 215, 225, 230, 24,
+ 232, 146, 254, 118, 230, 24, 232, 146, 226, 158, 230, 24, 235, 198, 230,
+ 24, 214, 175, 247, 249, 226, 167, 59, 226, 167, 218, 157, 226, 167, 247,
+ 169, 216, 85, 251, 164, 43, 228, 57, 244, 181, 220, 149, 224, 180, 44,
+ 228, 57, 244, 181, 220, 149, 224, 180, 43, 220, 149, 224, 180, 44, 220,
+ 149, 224, 180, 223, 49, 216, 89, 245, 97, 249, 99, 232, 146, 226, 158,
+ 249, 99, 232, 146, 254, 118, 52, 218, 63, 52, 218, 21, 52, 235, 198, 52,
+ 214, 175, 225, 47, 128, 22, 226, 8, 111, 233, 15, 2, 247, 120, 242, 130,
+ 2, 247, 120, 213, 187, 230, 97, 233, 14, 213, 187, 230, 97, 242, 129,
+ 233, 15, 128, 216, 42, 177, 242, 129, 242, 130, 128, 216, 42, 177, 233,
+ 14, 128, 216, 42, 177, 233, 14, 128, 216, 42, 177, 242, 129, 128, 216,
+ 42, 177, 224, 202, 128, 216, 42, 177, 218, 55, 247, 138, 228, 52, 224,
+ 206, 177, 245, 99, 247, 138, 228, 52, 218, 58, 177, 245, 99, 228, 52, 42,
+ 236, 15, 64, 177, 128, 111, 228, 52, 42, 226, 150, 64, 177, 128, 111, 42,
+ 236, 15, 64, 177, 228, 52, 128, 111, 42, 226, 150, 64, 177, 228, 52, 128,
+ 111, 233, 15, 251, 88, 228, 52, 245, 94, 111, 242, 130, 251, 88, 228, 52,
+ 245, 94, 111, 224, 203, 251, 88, 228, 52, 245, 94, 111, 218, 56, 251, 88,
+ 228, 52, 245, 94, 111, 228, 52, 228, 57, 218, 77, 226, 231, 247, 138,
+ 228, 52, 249, 188, 253, 238, 228, 57, 218, 76, 228, 52, 228, 57, 218, 77,
+ 64, 177, 128, 111, 247, 138, 228, 52, 249, 188, 253, 238, 228, 57, 218,
+ 77, 177, 245, 99, 67, 245, 163, 230, 222, 203, 245, 163, 120, 44, 247,
+ 255, 245, 163, 124, 44, 247, 255, 245, 163, 245, 170, 64, 2, 199, 203,
+ 91, 245, 170, 64, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 4,
+ 245, 170, 64, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 245, 170,
+ 64, 2, 59, 48, 245, 170, 64, 2, 226, 123, 4, 245, 170, 64, 2, 226, 123,
+ 245, 170, 64, 2, 214, 183, 245, 170, 64, 2, 113, 203, 218, 90, 249, 186,
+ 2, 199, 203, 91, 249, 186, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203,
+ 91, 4, 249, 186, 2, 67, 252, 141, 253, 207, 245, 143, 64, 203, 91, 249,
+ 186, 2, 226, 123, 4, 249, 186, 2, 226, 123, 210, 160, 187, 252, 173, 231,
+ 61, 247, 250, 50, 245, 172, 74, 240, 234, 120, 253, 249, 124, 253, 249,
+ 224, 175, 225, 165, 212, 32, 232, 213, 43, 250, 181, 44, 250, 181, 43,
+ 244, 57, 44, 244, 57, 251, 175, 44, 249, 132, 251, 175, 43, 249, 132,
+ 216, 14, 44, 249, 132, 216, 14, 43, 249, 132, 223, 49, 228, 52, 50, 42,
+ 232, 104, 254, 25, 221, 164, 221, 171, 217, 1, 223, 120, 224, 241, 235,
+ 238, 213, 165, 218, 234, 225, 41, 64, 235, 207, 50, 215, 94, 228, 52, 50,
+ 212, 42, 240, 236, 216, 14, 43, 249, 160, 216, 14, 44, 249, 160, 251,
+ 175, 43, 249, 160, 251, 175, 44, 249, 160, 216, 14, 163, 235, 211, 251,
+ 175, 163, 235, 211, 243, 240, 219, 75, 120, 253, 250, 252, 24, 113, 203,
+ 252, 129, 226, 160, 234, 138, 245, 90, 216, 42, 216, 196, 222, 251, 211,
+ 179, 236, 0, 115, 223, 117, 251, 163, 234, 137, 233, 42, 254, 110, 127,
+ 222, 247, 254, 110, 127, 245, 90, 216, 42, 216, 196, 233, 46, 252, 35,
+ 222, 233, 249, 70, 254, 155, 254, 1, 217, 181, 216, 4, 222, 123, 247,
+ 215, 226, 151, 249, 198, 217, 52, 219, 86, 249, 151, 249, 150, 254, 66,
+ 243, 225, 16, 240, 151, 254, 66, 243, 225, 16, 218, 228, 224, 27, 254,
+ 66, 243, 225, 16, 224, 28, 245, 99, 254, 66, 243, 225, 16, 224, 28, 247,
+ 174, 254, 66, 243, 225, 16, 224, 28, 247, 248, 254, 66, 243, 225, 16,
+ 224, 28, 235, 56, 254, 66, 243, 225, 16, 224, 28, 250, 35, 254, 66, 243,
+ 225, 16, 250, 36, 218, 135, 254, 66, 243, 225, 16, 250, 36, 235, 56, 254,
+ 66, 243, 225, 16, 219, 96, 130, 254, 66, 243, 225, 16, 252, 181, 130,
+ 254, 66, 243, 225, 16, 224, 28, 219, 95, 254, 66, 243, 225, 16, 224, 28,
+ 252, 180, 254, 66, 243, 225, 16, 224, 28, 233, 14, 254, 66, 243, 225, 16,
+ 224, 28, 242, 129, 254, 66, 243, 225, 16, 140, 214, 19, 254, 66, 243,
+ 225, 16, 97, 214, 19, 254, 66, 243, 225, 16, 224, 28, 140, 74, 254, 66,
+ 243, 225, 16, 224, 28, 97, 74, 254, 66, 243, 225, 16, 250, 36, 252, 180,
+ 254, 66, 243, 225, 16, 124, 217, 88, 214, 183, 254, 66, 243, 225, 16,
+ 248, 55, 218, 135, 254, 66, 243, 225, 16, 224, 28, 124, 250, 238, 254,
+ 66, 243, 225, 16, 224, 28, 248, 54, 254, 66, 243, 225, 16, 124, 217, 88,
+ 235, 56, 254, 66, 243, 225, 16, 214, 153, 214, 19, 254, 66, 243, 225, 16,
+ 224, 28, 214, 153, 74, 254, 66, 243, 225, 16, 120, 217, 88, 226, 123,
+ 254, 66, 243, 225, 16, 248, 66, 218, 135, 254, 66, 243, 225, 16, 224, 28,
+ 120, 250, 238, 254, 66, 243, 225, 16, 224, 28, 248, 65, 254, 66, 243,
+ 225, 16, 120, 217, 88, 235, 56, 254, 66, 243, 225, 16, 246, 104, 214, 19,
+ 254, 66, 243, 225, 16, 224, 28, 246, 104, 74, 254, 66, 243, 225, 16, 223,
+ 253, 214, 183, 254, 66, 243, 225, 16, 248, 55, 214, 183, 254, 66, 243,
+ 225, 16, 247, 249, 214, 183, 254, 66, 243, 225, 16, 235, 57, 214, 183,
+ 254, 66, 243, 225, 16, 250, 36, 214, 183, 254, 66, 243, 225, 16, 120,
+ 220, 5, 235, 56, 254, 66, 243, 225, 16, 223, 253, 224, 27, 254, 66, 243,
+ 225, 16, 250, 36, 218, 156, 254, 66, 243, 225, 16, 224, 28, 249, 226,
+ 254, 66, 243, 225, 16, 120, 217, 88, 248, 1, 254, 66, 243, 225, 16, 248,
+ 66, 248, 1, 254, 66, 243, 225, 16, 218, 157, 248, 1, 254, 66, 243, 225,
+ 16, 235, 57, 248, 1, 254, 66, 243, 225, 16, 250, 36, 248, 1, 254, 66,
+ 243, 225, 16, 124, 220, 5, 218, 135, 254, 66, 243, 225, 16, 43, 220, 5,
+ 218, 135, 254, 66, 243, 225, 16, 216, 89, 248, 1, 254, 66, 243, 225, 16,
+ 242, 130, 248, 1, 254, 66, 243, 225, 16, 249, 220, 130, 254, 66, 243,
+ 225, 16, 248, 66, 182, 254, 66, 243, 225, 16, 210, 34, 254, 66, 243, 225,
+ 16, 218, 136, 182, 254, 66, 243, 225, 16, 220, 151, 214, 183, 254, 66,
+ 243, 225, 16, 224, 28, 228, 52, 245, 99, 254, 66, 243, 225, 16, 224, 28,
+ 224, 12, 254, 66, 243, 225, 16, 124, 250, 239, 182, 254, 66, 243, 225,
+ 16, 120, 250, 239, 182, 254, 66, 243, 225, 16, 235, 185, 254, 66, 243,
+ 225, 16, 223, 37, 254, 66, 243, 225, 16, 226, 201, 254, 66, 243, 225, 16,
+ 254, 144, 214, 183, 254, 66, 243, 225, 16, 245, 101, 214, 183, 254, 66,
+ 243, 225, 16, 235, 186, 214, 183, 254, 66, 243, 225, 16, 226, 202, 214,
+ 183, 254, 66, 243, 225, 16, 254, 143, 228, 52, 250, 130, 78, 44, 254,
+ 110, 2, 246, 104, 210, 35, 74, 219, 235, 204, 251, 163, 252, 45, 87, 67,
+ 232, 214, 2, 230, 224, 247, 120, 235, 216, 87, 249, 183, 214, 181, 87,
+ 247, 189, 214, 181, 87, 245, 154, 87, 249, 210, 87, 71, 42, 2, 250, 175,
+ 67, 232, 213, 245, 130, 87, 254, 139, 234, 139, 87, 241, 213, 87, 37,
+ 203, 252, 141, 2, 228, 50, 37, 215, 226, 246, 106, 251, 135, 250, 36, 2,
+ 228, 54, 74, 214, 179, 87, 230, 137, 87, 240, 164, 87, 226, 174, 242, 59,
+ 87, 226, 174, 233, 147, 87, 225, 244, 87, 225, 243, 87, 247, 197, 249,
+ 97, 16, 244, 20, 105, 219, 50, 87, 254, 66, 243, 225, 16, 224, 27, 248,
+ 83, 220, 138, 234, 139, 87, 224, 192, 226, 75, 229, 82, 226, 75, 224,
+ 188, 221, 189, 87, 250, 17, 221, 189, 87, 43, 226, 4, 214, 160, 103, 43,
+ 226, 4, 245, 21, 43, 226, 4, 232, 108, 103, 44, 226, 4, 214, 160, 103,
+ 44, 226, 4, 245, 21, 44, 226, 4, 232, 108, 103, 43, 42, 251, 158, 214,
+ 160, 249, 160, 43, 42, 251, 158, 245, 21, 43, 42, 251, 158, 232, 108,
+ 249, 160, 44, 42, 251, 158, 214, 160, 249, 160, 44, 42, 251, 158, 245,
+ 21, 44, 42, 251, 158, 232, 108, 249, 160, 43, 249, 99, 251, 158, 214,
+ 160, 103, 43, 249, 99, 251, 158, 230, 224, 225, 101, 43, 249, 99, 251,
+ 158, 232, 108, 103, 249, 99, 251, 158, 245, 21, 44, 249, 99, 251, 158,
+ 214, 160, 103, 44, 249, 99, 251, 158, 230, 224, 225, 101, 44, 249, 99,
+ 251, 158, 232, 108, 103, 235, 212, 245, 21, 203, 232, 214, 245, 21, 214,
+ 160, 43, 177, 232, 108, 44, 249, 99, 251, 158, 221, 172, 214, 160, 44,
+ 177, 232, 108, 43, 249, 99, 251, 158, 221, 172, 218, 41, 216, 13, 218,
+ 41, 251, 174, 216, 14, 42, 127, 251, 175, 42, 127, 251, 175, 42, 251,
+ 158, 117, 216, 14, 42, 127, 34, 16, 251, 174, 43, 67, 93, 232, 213, 44,
+ 67, 93, 232, 213, 203, 221, 205, 232, 212, 203, 221, 205, 232, 211, 203,
+ 221, 205, 232, 210, 203, 221, 205, 232, 209, 248, 46, 16, 192, 67, 22,
+ 216, 14, 222, 251, 248, 46, 16, 192, 67, 22, 251, 175, 222, 251, 248, 46,
+ 16, 192, 67, 2, 250, 35, 248, 46, 16, 192, 124, 22, 203, 2, 250, 35, 248,
+ 46, 16, 192, 120, 22, 203, 2, 250, 35, 248, 46, 16, 192, 67, 2, 215, 225,
+ 248, 46, 16, 192, 124, 22, 203, 2, 215, 225, 248, 46, 16, 192, 120, 22,
+ 203, 2, 215, 225, 248, 46, 16, 192, 67, 22, 212, 35, 248, 46, 16, 192,
+ 124, 22, 203, 2, 212, 35, 248, 46, 16, 192, 120, 22, 203, 2, 212, 35,
+ 248, 46, 16, 192, 124, 22, 241, 44, 248, 46, 16, 192, 120, 22, 241, 44,
+ 248, 46, 16, 192, 67, 22, 216, 14, 233, 46, 248, 46, 16, 192, 67, 22,
+ 251, 175, 233, 46, 42, 244, 32, 223, 54, 87, 245, 182, 87, 67, 232, 214,
+ 245, 21, 231, 33, 251, 146, 231, 33, 199, 117, 219, 250, 231, 33, 219,
+ 251, 117, 232, 137, 231, 33, 199, 117, 113, 219, 237, 231, 33, 113, 219,
+ 238, 117, 232, 137, 231, 33, 113, 219, 238, 235, 64, 231, 33, 215, 208,
+ 231, 33, 216, 223, 231, 33, 225, 188, 245, 224, 242, 122, 243, 219, 216,
+ 14, 226, 3, 251, 175, 226, 3, 216, 14, 249, 99, 127, 251, 175, 249, 99,
+ 127, 216, 14, 216, 6, 220, 53, 127, 251, 175, 216, 6, 220, 53, 127, 71,
+ 215, 239, 252, 35, 222, 234, 2, 250, 35, 218, 120, 244, 64, 255, 17, 249,
+ 96, 245, 171, 235, 198, 248, 83, 245, 24, 87, 85, 222, 247, 52, 215, 225,
+ 85, 233, 42, 52, 215, 225, 85, 214, 162, 52, 215, 225, 85, 246, 105, 52,
+ 215, 225, 85, 222, 247, 52, 215, 226, 2, 67, 130, 85, 233, 42, 52, 215,
+ 226, 2, 67, 130, 85, 222, 247, 215, 226, 2, 52, 67, 130, 254, 173, 250,
+ 3, 218, 126, 216, 86, 250, 3, 240, 237, 2, 244, 50, 221, 241, 16, 31,
+ 227, 202, 16, 31, 218, 152, 64, 241, 233, 16, 31, 218, 152, 64, 216, 212,
+ 16, 31, 245, 143, 64, 216, 212, 16, 31, 245, 143, 64, 215, 243, 16, 31,
+ 245, 132, 16, 31, 255, 7, 16, 31, 252, 44, 16, 31, 252, 179, 16, 31, 203,
+ 217, 89, 16, 31, 232, 214, 244, 145, 16, 31, 67, 217, 89, 16, 31, 244,
+ 20, 244, 145, 16, 31, 250, 230, 223, 53, 16, 31, 220, 28, 226, 130, 16,
+ 31, 220, 28, 235, 255, 16, 31, 248, 151, 232, 204, 245, 77, 16, 31, 248,
+ 31, 249, 178, 110, 16, 31, 248, 31, 249, 178, 105, 16, 31, 248, 31, 249,
+ 178, 158, 16, 31, 248, 31, 249, 178, 161, 16, 31, 152, 255, 7, 16, 31,
+ 217, 177, 236, 62, 16, 31, 245, 143, 64, 215, 244, 251, 213, 16, 31, 251,
+ 5, 16, 31, 245, 143, 64, 231, 81, 16, 31, 218, 61, 16, 31, 245, 77, 16,
+ 31, 244, 107, 220, 137, 16, 31, 242, 121, 220, 137, 16, 31, 223, 121,
+ 220, 137, 16, 31, 214, 174, 220, 137, 16, 31, 219, 18, 16, 31, 248, 63,
+ 251, 216, 87, 204, 251, 163, 16, 31, 229, 85, 16, 31, 248, 64, 244, 20,
+ 105, 16, 31, 218, 62, 244, 20, 105, 226, 241, 103, 226, 241, 250, 152,
+ 226, 241, 244, 23, 226, 241, 235, 193, 244, 23, 226, 241, 252, 42, 251,
+ 124, 226, 241, 251, 170, 216, 111, 226, 241, 251, 155, 252, 146, 240,
+ 103, 226, 241, 254, 127, 64, 250, 129, 226, 241, 248, 156, 226, 241, 249,
+ 87, 255, 11, 227, 200, 226, 241, 52, 252, 180, 37, 21, 110, 37, 21, 105,
+ 37, 21, 158, 37, 21, 161, 37, 21, 189, 37, 21, 194, 37, 21, 198, 37, 21,
+ 195, 37, 21, 200, 37, 54, 216, 247, 37, 54, 245, 167, 37, 54, 215, 76,
+ 37, 54, 216, 164, 37, 54, 244, 5, 37, 54, 244, 118, 37, 54, 219, 119, 37,
+ 54, 220, 119, 37, 54, 245, 190, 37, 54, 228, 197, 37, 54, 215, 73, 88,
+ 21, 110, 88, 21, 105, 88, 21, 158, 88, 21, 161, 88, 21, 189, 88, 21, 194,
+ 88, 21, 198, 88, 21, 195, 88, 21, 200, 88, 54, 216, 247, 88, 54, 245,
+ 167, 88, 54, 215, 76, 88, 54, 216, 164, 88, 54, 244, 5, 88, 54, 244, 118,
+ 88, 54, 219, 119, 88, 54, 220, 119, 88, 54, 245, 190, 88, 54, 228, 197,
+ 88, 54, 215, 73, 21, 123, 243, 229, 218, 129, 21, 113, 243, 229, 218,
+ 129, 21, 134, 243, 229, 218, 129, 21, 244, 11, 243, 229, 218, 129, 21,
+ 244, 81, 243, 229, 218, 129, 21, 219, 125, 243, 229, 218, 129, 21, 220,
+ 122, 243, 229, 218, 129, 21, 245, 193, 243, 229, 218, 129, 21, 228, 200,
+ 243, 229, 218, 129, 54, 216, 248, 243, 229, 218, 129, 54, 245, 168, 243,
+ 229, 218, 129, 54, 215, 77, 243, 229, 218, 129, 54, 216, 165, 243, 229,
+ 218, 129, 54, 244, 6, 243, 229, 218, 129, 54, 244, 119, 243, 229, 218,
+ 129, 54, 219, 120, 243, 229, 218, 129, 54, 220, 120, 243, 229, 218, 129,
+ 54, 245, 191, 243, 229, 218, 129, 54, 228, 198, 243, 229, 218, 129, 54,
+ 215, 74, 243, 229, 218, 129, 88, 7, 4, 1, 61, 88, 7, 4, 1, 253, 158, 88,
+ 7, 4, 1, 251, 66, 88, 7, 4, 1, 249, 60, 88, 7, 4, 1, 75, 88, 7, 4, 1,
+ 245, 6, 88, 7, 4, 1, 243, 202, 88, 7, 4, 1, 242, 60, 88, 7, 4, 1, 73, 88,
+ 7, 4, 1, 235, 144, 88, 7, 4, 1, 235, 23, 88, 7, 4, 1, 156, 88, 7, 4, 1,
+ 193, 88, 7, 4, 1, 230, 25, 88, 7, 4, 1, 76, 88, 7, 4, 1, 226, 105, 88, 7,
+ 4, 1, 224, 96, 88, 7, 4, 1, 153, 88, 7, 4, 1, 222, 91, 88, 7, 4, 1, 217,
+ 152, 88, 7, 4, 1, 70, 88, 7, 4, 1, 214, 105, 88, 7, 4, 1, 212, 98, 88, 7,
+ 4, 1, 211, 178, 88, 7, 4, 1, 211, 117, 88, 7, 4, 1, 210, 159, 37, 7, 6,
+ 1, 61, 37, 7, 6, 1, 253, 158, 37, 7, 6, 1, 251, 66, 37, 7, 6, 1, 249, 60,
+ 37, 7, 6, 1, 75, 37, 7, 6, 1, 245, 6, 37, 7, 6, 1, 243, 202, 37, 7, 6, 1,
+ 242, 60, 37, 7, 6, 1, 73, 37, 7, 6, 1, 235, 144, 37, 7, 6, 1, 235, 23,
+ 37, 7, 6, 1, 156, 37, 7, 6, 1, 193, 37, 7, 6, 1, 230, 25, 37, 7, 6, 1,
+ 76, 37, 7, 6, 1, 226, 105, 37, 7, 6, 1, 224, 96, 37, 7, 6, 1, 153, 37, 7,
+ 6, 1, 222, 91, 37, 7, 6, 1, 217, 152, 37, 7, 6, 1, 70, 37, 7, 6, 1, 214,
+ 105, 37, 7, 6, 1, 212, 98, 37, 7, 6, 1, 211, 178, 37, 7, 6, 1, 211, 117,
+ 37, 7, 6, 1, 210, 159, 37, 7, 4, 1, 61, 37, 7, 4, 1, 253, 158, 37, 7, 4,
+ 1, 251, 66, 37, 7, 4, 1, 249, 60, 37, 7, 4, 1, 75, 37, 7, 4, 1, 245, 6,
+ 37, 7, 4, 1, 243, 202, 37, 7, 4, 1, 242, 60, 37, 7, 4, 1, 73, 37, 7, 4,
+ 1, 235, 144, 37, 7, 4, 1, 235, 23, 37, 7, 4, 1, 156, 37, 7, 4, 1, 193,
+ 37, 7, 4, 1, 230, 25, 37, 7, 4, 1, 76, 37, 7, 4, 1, 226, 105, 37, 7, 4,
+ 1, 224, 96, 37, 7, 4, 1, 153, 37, 7, 4, 1, 222, 91, 37, 7, 4, 1, 217,
+ 152, 37, 7, 4, 1, 70, 37, 7, 4, 1, 214, 105, 37, 7, 4, 1, 212, 98, 37, 7,
+ 4, 1, 211, 178, 37, 7, 4, 1, 211, 117, 37, 7, 4, 1, 210, 159, 37, 21,
+ 210, 86, 152, 37, 54, 245, 167, 152, 37, 54, 215, 76, 152, 37, 54, 216,
+ 164, 152, 37, 54, 244, 5, 152, 37, 54, 244, 118, 152, 37, 54, 219, 119,
+ 152, 37, 54, 220, 119, 152, 37, 54, 245, 190, 152, 37, 54, 228, 197, 152,
+ 37, 54, 215, 73, 52, 37, 21, 110, 52, 37, 21, 105, 52, 37, 21, 158, 52,
+ 37, 21, 161, 52, 37, 21, 189, 52, 37, 21, 194, 52, 37, 21, 198, 52, 37,
+ 21, 195, 52, 37, 21, 200, 52, 37, 54, 216, 247, 152, 37, 21, 210, 86, 93,
+ 99, 192, 241, 44, 93, 99, 114, 241, 44, 93, 99, 192, 213, 239, 93, 99,
+ 114, 213, 239, 93, 99, 192, 215, 211, 248, 157, 241, 44, 93, 99, 114,
+ 215, 211, 248, 157, 241, 44, 93, 99, 192, 215, 211, 248, 157, 213, 239,
+ 93, 99, 114, 215, 211, 248, 157, 213, 239, 93, 99, 192, 224, 24, 248,
+ 157, 241, 44, 93, 99, 114, 224, 24, 248, 157, 241, 44, 93, 99, 192, 224,
+ 24, 248, 157, 213, 239, 93, 99, 114, 224, 24, 248, 157, 213, 239, 93, 99,
+ 192, 124, 22, 222, 251, 93, 99, 124, 192, 22, 44, 241, 221, 93, 99, 124,
+ 114, 22, 44, 232, 230, 93, 99, 114, 124, 22, 222, 251, 93, 99, 192, 124,
+ 22, 233, 46, 93, 99, 124, 192, 22, 43, 241, 221, 93, 99, 124, 114, 22,
+ 43, 232, 230, 93, 99, 114, 124, 22, 233, 46, 93, 99, 192, 120, 22, 222,
+ 251, 93, 99, 120, 192, 22, 44, 241, 221, 93, 99, 120, 114, 22, 44, 232,
+ 230, 93, 99, 114, 120, 22, 222, 251, 93, 99, 192, 120, 22, 233, 46, 93,
+ 99, 120, 192, 22, 43, 241, 221, 93, 99, 120, 114, 22, 43, 232, 230, 93,
+ 99, 114, 120, 22, 233, 46, 93, 99, 192, 67, 22, 222, 251, 93, 99, 67,
+ 192, 22, 44, 241, 221, 93, 99, 120, 114, 22, 44, 124, 232, 230, 93, 99,
+ 124, 114, 22, 44, 120, 232, 230, 93, 99, 67, 114, 22, 44, 232, 230, 93,
+ 99, 124, 192, 22, 44, 120, 241, 221, 93, 99, 120, 192, 22, 44, 124, 241,
+ 221, 93, 99, 114, 67, 22, 222, 251, 93, 99, 192, 67, 22, 233, 46, 93, 99,
+ 67, 192, 22, 43, 241, 221, 93, 99, 120, 114, 22, 43, 124, 232, 230, 93,
+ 99, 124, 114, 22, 43, 120, 232, 230, 93, 99, 67, 114, 22, 43, 232, 230,
+ 93, 99, 124, 192, 22, 43, 120, 241, 221, 93, 99, 120, 192, 22, 43, 124,
+ 241, 221, 93, 99, 114, 67, 22, 233, 46, 93, 99, 192, 124, 22, 241, 44,
+ 93, 99, 43, 114, 22, 44, 124, 232, 230, 93, 99, 44, 114, 22, 43, 124,
+ 232, 230, 93, 99, 124, 192, 22, 203, 241, 221, 93, 99, 124, 114, 22, 203,
+ 232, 230, 93, 99, 44, 192, 22, 43, 124, 241, 221, 93, 99, 43, 192, 22,
+ 44, 124, 241, 221, 93, 99, 114, 124, 22, 241, 44, 93, 99, 192, 120, 22,
+ 241, 44, 93, 99, 43, 114, 22, 44, 120, 232, 230, 93, 99, 44, 114, 22, 43,
+ 120, 232, 230, 93, 99, 120, 192, 22, 203, 241, 221, 93, 99, 120, 114, 22,
+ 203, 232, 230, 93, 99, 44, 192, 22, 43, 120, 241, 221, 93, 99, 43, 192,
+ 22, 44, 120, 241, 221, 93, 99, 114, 120, 22, 241, 44, 93, 99, 192, 67,
+ 22, 241, 44, 93, 99, 43, 114, 22, 44, 67, 232, 230, 93, 99, 44, 114, 22,
+ 43, 67, 232, 230, 93, 99, 67, 192, 22, 203, 241, 221, 93, 99, 120, 114,
+ 22, 124, 203, 232, 230, 93, 99, 124, 114, 22, 120, 203, 232, 230, 93, 99,
+ 67, 114, 22, 203, 232, 230, 93, 99, 43, 120, 114, 22, 44, 124, 232, 230,
+ 93, 99, 44, 120, 114, 22, 43, 124, 232, 230, 93, 99, 43, 124, 114, 22,
+ 44, 120, 232, 230, 93, 99, 44, 124, 114, 22, 43, 120, 232, 230, 93, 99,
+ 124, 192, 22, 120, 203, 241, 221, 93, 99, 120, 192, 22, 124, 203, 241,
+ 221, 93, 99, 44, 192, 22, 43, 67, 241, 221, 93, 99, 43, 192, 22, 44, 67,
+ 241, 221, 93, 99, 114, 67, 22, 241, 44, 93, 99, 192, 52, 248, 157, 241,
+ 44, 93, 99, 114, 52, 248, 157, 241, 44, 93, 99, 192, 52, 248, 157, 213,
+ 239, 93, 99, 114, 52, 248, 157, 213, 239, 93, 99, 52, 241, 44, 93, 99,
+ 52, 213, 239, 93, 99, 124, 219, 155, 22, 44, 246, 113, 93, 99, 124, 52,
+ 22, 44, 219, 154, 93, 99, 52, 124, 22, 222, 251, 93, 99, 124, 219, 155,
+ 22, 43, 246, 113, 93, 99, 124, 52, 22, 43, 219, 154, 93, 99, 52, 124, 22,
+ 233, 46, 93, 99, 120, 219, 155, 22, 44, 246, 113, 93, 99, 120, 52, 22,
+ 44, 219, 154, 93, 99, 52, 120, 22, 222, 251, 93, 99, 120, 219, 155, 22,
+ 43, 246, 113, 93, 99, 120, 52, 22, 43, 219, 154, 93, 99, 52, 120, 22,
+ 233, 46, 93, 99, 67, 219, 155, 22, 44, 246, 113, 93, 99, 67, 52, 22, 44,
+ 219, 154, 93, 99, 52, 67, 22, 222, 251, 93, 99, 67, 219, 155, 22, 43,
+ 246, 113, 93, 99, 67, 52, 22, 43, 219, 154, 93, 99, 52, 67, 22, 233, 46,
+ 93, 99, 124, 219, 155, 22, 203, 246, 113, 93, 99, 124, 52, 22, 203, 219,
+ 154, 93, 99, 52, 124, 22, 241, 44, 93, 99, 120, 219, 155, 22, 203, 246,
+ 113, 93, 99, 120, 52, 22, 203, 219, 154, 93, 99, 52, 120, 22, 241, 44,
+ 93, 99, 67, 219, 155, 22, 203, 246, 113, 93, 99, 67, 52, 22, 203, 219,
+ 154, 93, 99, 52, 67, 22, 241, 44, 93, 99, 192, 254, 26, 124, 22, 222,
+ 251, 93, 99, 192, 254, 26, 124, 22, 233, 46, 93, 99, 192, 254, 26, 120,
+ 22, 233, 46, 93, 99, 192, 254, 26, 120, 22, 222, 251, 93, 99, 192, 247,
+ 255, 214, 160, 44, 216, 42, 232, 108, 233, 46, 93, 99, 192, 247, 255,
+ 214, 160, 43, 216, 42, 232, 108, 222, 251, 93, 99, 192, 247, 255, 249,
+ 130, 93, 99, 192, 233, 46, 93, 99, 192, 214, 163, 93, 99, 192, 222, 251,
+ 93, 99, 192, 246, 106, 93, 99, 114, 233, 46, 93, 99, 114, 214, 163, 93,
+ 99, 114, 222, 251, 93, 99, 114, 246, 106, 93, 99, 192, 43, 22, 114, 222,
+ 251, 93, 99, 192, 120, 22, 114, 246, 106, 93, 99, 114, 43, 22, 192, 222,
+ 251, 93, 99, 114, 120, 22, 192, 246, 106, 214, 160, 163, 251, 213, 232,
+ 108, 123, 245, 189, 251, 213, 232, 108, 123, 224, 22, 251, 213, 232, 108,
+ 134, 245, 187, 251, 213, 232, 108, 163, 251, 213, 232, 108, 244, 81, 245,
+ 187, 251, 213, 232, 108, 134, 224, 20, 251, 213, 232, 108, 220, 122, 245,
+ 187, 251, 213, 243, 229, 251, 213, 43, 220, 122, 245, 187, 251, 213, 43,
+ 134, 224, 20, 251, 213, 43, 244, 81, 245, 187, 251, 213, 43, 163, 251,
+ 213, 43, 134, 245, 187, 251, 213, 43, 123, 224, 22, 251, 213, 43, 123,
+ 245, 189, 251, 213, 44, 163, 251, 213, 192, 220, 92, 231, 82, 220, 92,
+ 248, 162, 220, 92, 214, 160, 123, 245, 189, 251, 213, 44, 123, 245, 189,
+ 251, 213, 224, 26, 232, 108, 233, 46, 224, 26, 232, 108, 222, 251, 224,
+ 26, 214, 160, 233, 46, 224, 26, 214, 160, 43, 22, 232, 108, 43, 22, 232,
+ 108, 222, 251, 224, 26, 214, 160, 43, 22, 232, 108, 222, 251, 224, 26,
+ 214, 160, 43, 22, 214, 160, 44, 22, 232, 108, 233, 46, 224, 26, 214, 160,
+ 43, 22, 214, 160, 44, 22, 232, 108, 222, 251, 224, 26, 214, 160, 222,
+ 251, 224, 26, 214, 160, 44, 22, 232, 108, 233, 46, 224, 26, 214, 160, 44,
+ 22, 232, 108, 43, 22, 232, 108, 222, 251, 85, 218, 234, 71, 218, 234, 71,
+ 42, 2, 222, 183, 249, 159, 71, 42, 249, 187, 85, 4, 218, 234, 42, 2, 203,
+ 244, 105, 42, 2, 67, 244, 105, 42, 2, 226, 144, 249, 126, 244, 105, 42,
+ 2, 214, 160, 43, 216, 42, 232, 108, 44, 244, 105, 42, 2, 214, 160, 44,
+ 216, 42, 232, 108, 43, 244, 105, 42, 2, 247, 255, 249, 126, 244, 105, 85,
+ 4, 218, 234, 71, 4, 218, 234, 85, 223, 116, 71, 223, 116, 85, 67, 223,
+ 116, 71, 67, 223, 116, 85, 226, 6, 71, 226, 6, 85, 214, 162, 215, 225,
+ 71, 214, 162, 215, 225, 85, 214, 162, 4, 215, 225, 71, 214, 162, 4, 215,
+ 225, 85, 222, 247, 215, 225, 71, 222, 247, 215, 225, 85, 222, 247, 4,
+ 215, 225, 71, 222, 247, 4, 215, 225, 85, 222, 247, 225, 8, 71, 222, 247,
+ 225, 8, 85, 246, 105, 215, 225, 71, 246, 105, 215, 225, 85, 246, 105, 4,
+ 215, 225, 71, 246, 105, 4, 215, 225, 85, 233, 42, 215, 225, 71, 233, 42,
+ 215, 225, 85, 233, 42, 4, 215, 225, 71, 233, 42, 4, 215, 225, 85, 233,
+ 42, 225, 8, 71, 233, 42, 225, 8, 85, 247, 248, 71, 247, 248, 71, 247,
+ 249, 249, 187, 85, 4, 247, 248, 244, 89, 232, 104, 71, 250, 35, 246, 118,
+ 250, 35, 250, 36, 2, 67, 244, 105, 251, 111, 85, 250, 35, 250, 36, 2, 43,
+ 163, 251, 221, 250, 36, 2, 44, 163, 251, 221, 250, 36, 2, 232, 108, 163,
+ 251, 221, 250, 36, 2, 214, 160, 163, 251, 221, 250, 36, 2, 214, 160, 44,
+ 224, 26, 251, 221, 250, 36, 2, 254, 155, 251, 88, 214, 160, 43, 224, 26,
+ 251, 221, 43, 163, 85, 250, 35, 44, 163, 85, 250, 35, 235, 194, 251, 113,
+ 235, 194, 71, 250, 35, 214, 160, 163, 235, 194, 71, 250, 35, 232, 108,
+ 163, 235, 194, 71, 250, 35, 214, 160, 43, 224, 26, 250, 33, 254, 25, 214,
+ 160, 44, 224, 26, 250, 33, 254, 25, 232, 108, 44, 224, 26, 250, 33, 254,
+ 25, 232, 108, 43, 224, 26, 250, 33, 254, 25, 214, 160, 163, 250, 35, 232,
+ 108, 163, 250, 35, 85, 232, 108, 44, 215, 225, 85, 232, 108, 43, 215,
+ 225, 85, 214, 160, 43, 215, 225, 85, 214, 160, 44, 215, 225, 71, 251,
+ 113, 42, 2, 43, 163, 251, 221, 42, 2, 44, 163, 251, 221, 42, 2, 214, 160,
+ 43, 247, 255, 163, 251, 221, 42, 2, 232, 108, 44, 247, 255, 163, 251,
+ 221, 71, 42, 2, 67, 251, 232, 232, 213, 71, 214, 162, 215, 226, 2, 247,
+ 120, 214, 162, 215, 226, 2, 43, 163, 251, 221, 214, 162, 215, 226, 2, 44,
+ 163, 251, 221, 233, 85, 250, 35, 71, 42, 2, 214, 160, 43, 224, 25, 71,
+ 42, 2, 232, 108, 43, 224, 25, 71, 42, 2, 232, 108, 44, 224, 25, 71, 42,
+ 2, 214, 160, 44, 224, 25, 71, 250, 36, 2, 214, 160, 43, 224, 25, 71, 250,
+ 36, 2, 232, 108, 43, 224, 25, 71, 250, 36, 2, 232, 108, 44, 224, 25, 71,
+ 250, 36, 2, 214, 160, 44, 224, 25, 214, 160, 43, 215, 225, 214, 160, 44,
+ 215, 225, 232, 108, 43, 215, 225, 71, 231, 82, 218, 234, 85, 231, 82,
+ 218, 234, 71, 231, 82, 4, 218, 234, 85, 231, 82, 4, 218, 234, 232, 108,
+ 44, 215, 225, 85, 218, 38, 2, 223, 132, 249, 247, 214, 194, 219, 60, 249,
+ 222, 85, 218, 156, 71, 218, 156, 232, 228, 216, 132, 218, 37, 253, 234,
+ 228, 71, 248, 38, 228, 71, 249, 195, 226, 163, 85, 217, 0, 71, 217, 0,
+ 252, 156, 251, 163, 252, 156, 93, 2, 250, 129, 252, 156, 93, 2, 211, 178,
+ 221, 254, 214, 195, 2, 223, 160, 246, 84, 240, 243, 252, 22, 71, 220, 2,
+ 225, 101, 85, 220, 2, 225, 101, 220, 87, 223, 49, 222, 187, 244, 55, 241,
+ 228, 251, 113, 85, 43, 225, 7, 235, 242, 85, 44, 225, 7, 235, 242, 71,
+ 43, 225, 7, 235, 242, 71, 120, 225, 7, 235, 242, 71, 44, 225, 7, 235,
+ 242, 71, 124, 225, 7, 235, 242, 219, 101, 22, 249, 129, 250, 219, 50,
+ 223, 172, 50, 251, 239, 50, 251, 25, 254, 102, 226, 145, 249, 130, 250,
+ 111, 223, 37, 249, 131, 64, 232, 118, 249, 131, 64, 235, 116, 218, 157,
+ 22, 249, 136, 244, 168, 87, 254, 248, 220, 89, 242, 22, 22, 219, 189,
+ 225, 220, 87, 210, 254, 211, 69, 215, 215, 31, 241, 223, 215, 215, 31,
+ 233, 107, 215, 215, 31, 244, 96, 215, 215, 31, 216, 133, 215, 215, 31,
+ 211, 239, 215, 215, 31, 212, 40, 215, 215, 31, 230, 115, 215, 215, 31,
+ 245, 223, 212, 1, 64, 248, 18, 71, 243, 239, 244, 190, 71, 219, 74, 244,
+ 190, 85, 219, 74, 244, 190, 71, 218, 38, 2, 223, 132, 244, 92, 224, 22,
+ 230, 128, 233, 80, 224, 22, 230, 128, 231, 54, 244, 138, 50, 245, 223,
+ 231, 190, 50, 235, 38, 221, 220, 214, 145, 229, 93, 225, 20, 254, 12,
+ 217, 40, 243, 52, 251, 3, 233, 19, 213, 150, 232, 238, 221, 191, 222, 19,
+ 250, 248, 254, 42, 225, 52, 71, 250, 117, 234, 78, 71, 250, 117, 224, 14,
+ 71, 250, 117, 222, 195, 71, 250, 117, 251, 231, 71, 250, 117, 234, 30,
+ 71, 250, 117, 225, 231, 85, 250, 117, 234, 78, 85, 250, 117, 224, 14, 85,
+ 250, 117, 222, 195, 85, 250, 117, 251, 231, 85, 250, 117, 234, 30, 85,
+ 250, 117, 225, 231, 85, 219, 16, 218, 50, 71, 241, 228, 218, 50, 71, 247,
+ 249, 218, 50, 85, 249, 245, 218, 50, 71, 219, 16, 218, 50, 85, 241, 228,
+ 218, 50, 85, 247, 249, 218, 50, 71, 249, 245, 218, 50, 240, 243, 218,
+ 238, 224, 22, 228, 47, 245, 189, 228, 47, 252, 73, 245, 189, 228, 42,
+ 252, 73, 219, 118, 228, 42, 230, 57, 244, 66, 50, 230, 57, 229, 188, 50,
+ 230, 57, 220, 76, 50, 212, 9, 188, 249, 130, 245, 220, 188, 249, 130,
+ 214, 171, 223, 112, 87, 223, 112, 16, 31, 215, 48, 225, 34, 223, 112, 16,
+ 31, 215, 47, 225, 34, 223, 112, 16, 31, 215, 46, 225, 34, 223, 112, 16,
+ 31, 215, 45, 225, 34, 223, 112, 16, 31, 215, 44, 225, 34, 223, 112, 16,
+ 31, 215, 43, 225, 34, 223, 112, 16, 31, 215, 42, 225, 34, 223, 112, 16,
+ 31, 243, 50, 231, 138, 85, 214, 171, 223, 112, 87, 223, 113, 226, 20, 87,
+ 225, 252, 226, 20, 87, 225, 174, 226, 20, 50, 211, 255, 87, 247, 241,
+ 244, 189, 247, 241, 244, 188, 247, 241, 244, 187, 247, 241, 244, 186,
+ 247, 241, 244, 185, 247, 241, 244, 184, 71, 250, 36, 2, 59, 222, 251, 71,
+ 250, 36, 2, 113, 247, 118, 85, 250, 36, 2, 71, 59, 222, 251, 85, 250, 36,
+ 2, 113, 71, 247, 118, 230, 142, 31, 211, 69, 230, 142, 31, 210, 253, 247,
+ 224, 31, 242, 131, 211, 69, 247, 224, 31, 233, 13, 210, 253, 247, 224,
+ 31, 233, 13, 211, 69, 247, 224, 31, 242, 131, 210, 253, 71, 244, 73, 85,
+ 244, 73, 242, 22, 22, 225, 104, 254, 120, 249, 128, 217, 235, 218, 164,
+ 64, 254, 226, 221, 206, 254, 169, 244, 51, 243, 60, 218, 164, 64, 241,
+ 202, 253, 199, 87, 244, 62, 226, 126, 71, 218, 156, 134, 232, 208, 249,
+ 175, 222, 251, 134, 232, 208, 249, 175, 233, 46, 212, 50, 50, 125, 213,
+ 130, 50, 246, 110, 244, 138, 50, 246, 110, 231, 190, 50, 235, 203, 244,
+ 138, 22, 231, 190, 50, 231, 190, 22, 244, 138, 50, 231, 190, 2, 218, 103,
+ 50, 231, 190, 2, 218, 103, 22, 231, 190, 22, 244, 138, 50, 67, 231, 190,
+ 2, 218, 103, 50, 203, 231, 190, 2, 218, 103, 50, 231, 82, 71, 250, 35,
+ 231, 82, 85, 250, 35, 231, 82, 4, 71, 250, 35, 231, 153, 87, 247, 167,
+ 87, 214, 169, 225, 251, 87, 249, 231, 243, 224, 214, 141, 229, 88, 250,
+ 161, 226, 61, 235, 44, 213, 185, 250, 93, 85, 230, 129, 232, 225, 220,
+ 112, 220, 147, 224, 5, 220, 130, 219, 55, 252, 159, 252, 126, 92, 234,
+ 138, 71, 246, 93, 231, 185, 71, 246, 93, 234, 78, 85, 246, 93, 231, 185,
+ 85, 246, 93, 234, 78, 219, 61, 211, 230, 219, 64, 218, 38, 252, 51, 249,
+ 247, 223, 159, 85, 219, 60, 216, 134, 249, 248, 22, 223, 159, 215, 94,
+ 71, 220, 2, 225, 101, 215, 94, 85, 220, 2, 225, 101, 71, 247, 249, 236,
+ 0, 218, 234, 249, 125, 233, 91, 247, 193, 250, 244, 226, 166, 225, 104,
+ 250, 245, 219, 88, 241, 212, 2, 71, 249, 130, 37, 249, 125, 233, 91, 250,
+ 153, 228, 75, 245, 124, 254, 141, 226, 191, 43, 212, 26, 215, 251, 85,
+ 215, 55, 43, 212, 26, 215, 251, 71, 215, 55, 43, 212, 26, 215, 251, 85,
+ 43, 233, 92, 231, 53, 71, 43, 233, 92, 231, 53, 246, 89, 219, 82, 50,
+ 114, 71, 246, 105, 215, 225, 43, 250, 0, 245, 124, 92, 221, 254, 244,
+ 175, 247, 255, 236, 0, 71, 250, 36, 236, 0, 85, 218, 234, 85, 215, 192,
+ 223, 60, 43, 245, 123, 223, 60, 43, 245, 122, 253, 211, 16, 31, 214, 145,
+ 114, 250, 36, 2, 218, 103, 22, 113, 170, 48, 225, 189, 222, 248, 235,
+ 205, 225, 189, 233, 43, 235, 205, 225, 189, 235, 193, 225, 189, 85, 249,
+ 131, 226, 197, 220, 29, 220, 17, 219, 229, 250, 61, 250, 226, 241, 157,
+ 219, 126, 243, 61, 211, 230, 240, 220, 243, 61, 2, 242, 12, 231, 173, 16,
+ 31, 232, 229, 230, 115, 214, 195, 226, 197, 242, 122, 244, 12, 244, 74,
+ 236, 0, 241, 59, 244, 129, 222, 14, 42, 244, 11, 249, 159, 219, 104, 240,
+ 112, 219, 107, 225, 168, 2, 252, 159, 216, 242, 235, 131, 252, 146, 87,
+ 241, 231, 242, 133, 87, 243, 232, 224, 142, 249, 103, 226, 197, 85, 218,
+ 234, 71, 244, 74, 2, 203, 230, 224, 85, 218, 104, 214, 160, 251, 217,
+ 221, 193, 85, 221, 193, 232, 108, 251, 217, 221, 193, 71, 221, 193, 71,
+ 114, 250, 130, 78, 217, 1, 232, 154, 50, 217, 53, 246, 88, 254, 191, 245,
+ 119, 223, 157, 244, 85, 223, 157, 242, 15, 213, 174, 242, 15, 211, 198,
+ 242, 15, 232, 108, 44, 225, 198, 225, 198, 214, 160, 44, 225, 198, 71,
+ 228, 230, 85, 228, 230, 250, 130, 78, 114, 250, 130, 78, 230, 84, 211,
+ 178, 114, 230, 84, 211, 178, 252, 156, 211, 178, 114, 252, 156, 211, 178,
+ 226, 126, 26, 249, 130, 114, 26, 249, 130, 204, 250, 175, 249, 130, 114,
+ 204, 250, 175, 249, 130, 7, 249, 130, 220, 91, 71, 7, 249, 130, 226, 126,
+ 7, 249, 130, 231, 187, 249, 130, 218, 157, 64, 248, 149, 244, 11, 217,
+ 15, 253, 216, 244, 11, 252, 157, 253, 216, 114, 244, 11, 252, 157, 253,
+ 216, 244, 11, 249, 243, 253, 216, 85, 244, 11, 225, 9, 218, 156, 71, 244,
+ 11, 225, 9, 218, 156, 219, 11, 218, 111, 226, 126, 71, 218, 156, 37, 71,
+ 218, 156, 204, 250, 175, 85, 218, 156, 85, 250, 175, 71, 218, 156, 226,
+ 126, 85, 218, 156, 114, 226, 126, 85, 218, 156, 225, 60, 218, 156, 220,
+ 91, 71, 218, 156, 114, 253, 216, 204, 250, 175, 253, 216, 245, 193, 218,
+ 244, 253, 216, 245, 193, 225, 9, 85, 218, 156, 245, 193, 225, 9, 225, 60,
+ 218, 156, 219, 125, 225, 9, 85, 218, 156, 245, 193, 225, 9, 223, 114, 85,
+ 218, 156, 114, 245, 193, 225, 9, 223, 114, 85, 218, 156, 215, 77, 225, 9,
+ 85, 218, 156, 219, 120, 225, 9, 253, 216, 217, 15, 253, 216, 204, 250,
+ 175, 217, 15, 253, 216, 114, 217, 15, 253, 216, 219, 125, 225, 157, 85,
+ 22, 71, 244, 54, 85, 244, 54, 71, 244, 54, 245, 193, 225, 157, 226, 126,
+ 85, 244, 54, 37, 204, 250, 175, 245, 193, 225, 9, 218, 156, 114, 217, 15,
+ 225, 60, 253, 216, 219, 62, 216, 105, 215, 218, 219, 62, 114, 250, 114,
+ 219, 62, 219, 13, 114, 219, 13, 252, 157, 253, 216, 245, 193, 217, 15,
+ 224, 171, 253, 216, 114, 245, 193, 217, 15, 224, 171, 253, 216, 249, 131,
+ 78, 220, 91, 71, 250, 35, 152, 92, 249, 131, 78, 232, 108, 44, 246, 86,
+ 71, 218, 234, 214, 160, 44, 246, 86, 71, 218, 234, 232, 108, 44, 220, 91,
+ 71, 218, 234, 214, 160, 44, 220, 91, 71, 218, 234, 85, 224, 13, 164, 226,
+ 147, 71, 224, 13, 164, 226, 147, 71, 245, 31, 164, 226, 147, 85, 247,
+ 249, 230, 182, 71, 211, 178, 114, 245, 31, 164, 87, 192, 67, 130, 231,
+ 82, 67, 130, 114, 67, 130, 114, 219, 155, 215, 94, 249, 220, 223, 254,
+ 164, 226, 147, 114, 219, 155, 249, 220, 223, 254, 164, 226, 147, 114, 52,
+ 215, 94, 249, 220, 223, 254, 164, 226, 147, 114, 52, 249, 220, 223, 254,
+ 164, 226, 147, 114, 121, 219, 155, 249, 220, 223, 254, 164, 226, 147,
+ 114, 121, 52, 249, 220, 223, 254, 164, 226, 147, 249, 91, 218, 140, 226,
+ 15, 5, 226, 147, 114, 245, 31, 164, 226, 147, 114, 241, 228, 245, 31,
+ 164, 226, 147, 114, 85, 241, 227, 222, 187, 114, 85, 241, 228, 251, 113,
+ 244, 55, 241, 227, 222, 187, 244, 55, 241, 228, 251, 113, 231, 82, 43,
+ 226, 4, 226, 147, 231, 82, 44, 226, 4, 226, 147, 231, 82, 244, 63, 43,
+ 226, 4, 226, 147, 231, 82, 244, 63, 44, 226, 4, 226, 147, 231, 82, 233,
+ 42, 254, 110, 251, 158, 226, 147, 231, 82, 222, 247, 254, 110, 251, 158,
+ 226, 147, 114, 233, 42, 254, 110, 223, 254, 164, 226, 147, 114, 222, 247,
+ 254, 110, 223, 254, 164, 226, 147, 114, 233, 42, 254, 110, 251, 158, 226,
+ 147, 114, 222, 247, 254, 110, 251, 158, 226, 147, 192, 43, 216, 6, 220,
+ 53, 251, 158, 226, 147, 192, 44, 216, 6, 220, 53, 251, 158, 226, 147,
+ 231, 82, 43, 249, 99, 251, 158, 226, 147, 231, 82, 44, 249, 99, 251, 158,
+ 226, 147, 247, 204, 152, 37, 21, 110, 247, 204, 152, 37, 21, 105, 247,
+ 204, 152, 37, 21, 158, 247, 204, 152, 37, 21, 161, 247, 204, 152, 37, 21,
+ 189, 247, 204, 152, 37, 21, 194, 247, 204, 152, 37, 21, 198, 247, 204,
+ 152, 37, 21, 195, 247, 204, 152, 37, 21, 200, 247, 204, 152, 37, 54, 216,
+ 247, 247, 204, 37, 35, 21, 110, 247, 204, 37, 35, 21, 105, 247, 204, 37,
+ 35, 21, 158, 247, 204, 37, 35, 21, 161, 247, 204, 37, 35, 21, 189, 247,
+ 204, 37, 35, 21, 194, 247, 204, 37, 35, 21, 198, 247, 204, 37, 35, 21,
+ 195, 247, 204, 37, 35, 21, 200, 247, 204, 37, 35, 54, 216, 247, 247, 204,
+ 152, 37, 35, 21, 110, 247, 204, 152, 37, 35, 21, 105, 247, 204, 152, 37,
+ 35, 21, 158, 247, 204, 152, 37, 35, 21, 161, 247, 204, 152, 37, 35, 21,
+ 189, 247, 204, 152, 37, 35, 21, 194, 247, 204, 152, 37, 35, 21, 198, 247,
+ 204, 152, 37, 35, 21, 195, 247, 204, 152, 37, 35, 21, 200, 247, 204, 152,
+ 37, 35, 54, 216, 247, 114, 211, 246, 97, 74, 114, 96, 50, 114, 230, 182,
+ 50, 114, 247, 169, 50, 114, 219, 28, 245, 220, 74, 114, 97, 74, 114, 228,
+ 56, 245, 220, 74, 246, 98, 225, 11, 97, 74, 114, 222, 184, 97, 74, 215,
+ 224, 97, 74, 114, 215, 224, 97, 74, 248, 155, 215, 224, 97, 74, 114, 248,
+ 155, 215, 224, 97, 74, 85, 97, 74, 216, 144, 216, 12, 97, 253, 249, 216,
+ 144, 251, 173, 97, 253, 249, 85, 97, 253, 249, 114, 85, 249, 91, 246,
+ 104, 22, 97, 74, 114, 85, 249, 91, 214, 153, 22, 97, 74, 218, 231, 85,
+ 97, 74, 114, 249, 206, 85, 97, 74, 222, 246, 71, 97, 74, 233, 41, 71, 97,
+ 74, 252, 183, 220, 91, 71, 97, 74, 243, 241, 220, 91, 71, 97, 74, 114,
+ 232, 108, 222, 245, 71, 97, 74, 114, 214, 160, 222, 245, 71, 97, 74, 228,
+ 49, 232, 108, 222, 245, 71, 97, 74, 249, 99, 232, 123, 228, 49, 214, 160,
+ 222, 245, 71, 97, 74, 37, 114, 71, 97, 74, 211, 252, 97, 74, 251, 220,
+ 219, 28, 245, 220, 74, 251, 220, 97, 74, 251, 220, 228, 56, 245, 220, 74,
+ 114, 251, 220, 219, 28, 245, 220, 74, 114, 251, 220, 97, 74, 114, 251,
+ 220, 228, 56, 245, 220, 74, 217, 17, 97, 74, 114, 217, 16, 97, 74, 212,
+ 18, 97, 74, 114, 212, 18, 97, 74, 226, 172, 97, 74, 52, 249, 99, 232,
+ 123, 134, 247, 214, 254, 109, 71, 215, 226, 249, 187, 4, 71, 215, 225,
+ 225, 171, 204, 218, 63, 204, 218, 21, 43, 222, 90, 252, 173, 248, 60, 44,
+ 222, 90, 252, 173, 248, 60, 177, 2, 59, 235, 215, 223, 50, 219, 47, 224,
+ 201, 218, 63, 218, 22, 224, 201, 219, 46, 67, 252, 141, 2, 203, 91, 11,
+ 222, 228, 247, 254, 199, 247, 168, 11, 244, 175, 247, 254, 92, 232, 146,
+ 254, 118, 92, 232, 146, 226, 158, 71, 247, 249, 2, 250, 173, 247, 120,
+ 22, 2, 247, 120, 245, 170, 64, 226, 170, 214, 152, 232, 108, 44, 249,
+ 161, 2, 247, 120, 214, 160, 43, 249, 161, 2, 247, 120, 43, 226, 128, 235,
+ 66, 44, 226, 128, 235, 66, 243, 229, 226, 128, 235, 66, 233, 85, 120,
+ 217, 87, 233, 85, 124, 217, 87, 43, 22, 44, 52, 215, 93, 43, 22, 44, 217,
+ 87, 43, 230, 87, 199, 44, 217, 87, 199, 43, 217, 87, 120, 217, 88, 2,
+ 250, 36, 48, 232, 105, 247, 173, 251, 78, 203, 222, 133, 71, 249, 205,
+ 247, 248, 71, 249, 205, 247, 249, 2, 140, 216, 114, 71, 249, 205, 247,
+ 249, 2, 97, 216, 114, 71, 42, 2, 140, 216, 114, 71, 42, 2, 97, 216, 114,
+ 11, 43, 71, 42, 127, 11, 44, 71, 42, 127, 11, 43, 254, 110, 127, 11, 44,
+ 254, 110, 127, 11, 43, 52, 254, 110, 127, 11, 44, 52, 254, 110, 127, 11,
+ 43, 71, 216, 6, 220, 53, 127, 11, 44, 71, 216, 6, 220, 53, 127, 11, 43,
+ 244, 63, 226, 3, 11, 44, 244, 63, 226, 3, 214, 153, 224, 24, 74, 246,
+ 104, 224, 24, 74, 254, 88, 243, 98, 250, 36, 74, 250, 2, 243, 98, 250,
+ 36, 74, 44, 80, 2, 37, 225, 22, 199, 140, 74, 199, 97, 74, 199, 43, 44,
+ 74, 199, 140, 52, 74, 199, 97, 52, 74, 199, 43, 44, 52, 74, 199, 140, 80,
+ 243, 243, 130, 199, 97, 80, 243, 243, 130, 199, 140, 52, 80, 243, 243,
+ 130, 199, 97, 52, 80, 243, 243, 130, 199, 97, 218, 230, 74, 46, 47, 251,
+ 215, 46, 47, 247, 117, 46, 47, 246, 245, 46, 47, 247, 116, 46, 47, 246,
+ 181, 46, 47, 247, 52, 46, 47, 246, 244, 46, 47, 247, 115, 46, 47, 246,
+ 149, 46, 47, 247, 20, 46, 47, 246, 212, 46, 47, 247, 83, 46, 47, 246,
+ 180, 46, 47, 247, 51, 46, 47, 246, 243, 46, 47, 247, 114, 46, 47, 246,
+ 133, 46, 47, 247, 4, 46, 47, 246, 196, 46, 47, 247, 67, 46, 47, 246, 164,
+ 46, 47, 247, 35, 46, 47, 246, 227, 46, 47, 247, 98, 46, 47, 246, 148, 46,
+ 47, 247, 19, 46, 47, 246, 211, 46, 47, 247, 82, 46, 47, 246, 179, 46, 47,
+ 247, 50, 46, 47, 246, 242, 46, 47, 247, 113, 46, 47, 246, 125, 46, 47,
+ 246, 252, 46, 47, 246, 188, 46, 47, 247, 59, 46, 47, 246, 156, 46, 47,
+ 247, 27, 46, 47, 246, 219, 46, 47, 247, 90, 46, 47, 246, 140, 46, 47,
+ 247, 11, 46, 47, 246, 203, 46, 47, 247, 74, 46, 47, 246, 171, 46, 47,
+ 247, 42, 46, 47, 246, 234, 46, 47, 247, 105, 46, 47, 246, 132, 46, 47,
+ 247, 3, 46, 47, 246, 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247,
+ 34, 46, 47, 246, 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18,
+ 46, 47, 246, 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46,
+ 47, 246, 241, 46, 47, 247, 112, 46, 47, 246, 121, 46, 47, 246, 248, 46,
+ 47, 246, 184, 46, 47, 247, 55, 46, 47, 246, 152, 46, 47, 247, 23, 46, 47,
+ 246, 215, 46, 47, 247, 86, 46, 47, 246, 136, 46, 47, 247, 7, 46, 47, 246,
+ 199, 46, 47, 247, 70, 46, 47, 246, 167, 46, 47, 247, 38, 46, 47, 246,
+ 230, 46, 47, 247, 101, 46, 47, 246, 128, 46, 47, 246, 255, 46, 47, 246,
+ 191, 46, 47, 247, 62, 46, 47, 246, 159, 46, 47, 247, 30, 46, 47, 246,
+ 222, 46, 47, 247, 93, 46, 47, 246, 143, 46, 47, 247, 14, 46, 47, 246,
+ 206, 46, 47, 247, 77, 46, 47, 246, 174, 46, 47, 247, 45, 46, 47, 246,
+ 237, 46, 47, 247, 108, 46, 47, 246, 124, 46, 47, 246, 251, 46, 47, 246,
+ 187, 46, 47, 247, 58, 46, 47, 246, 155, 46, 47, 247, 26, 46, 47, 246,
+ 218, 46, 47, 247, 89, 46, 47, 246, 139, 46, 47, 247, 10, 46, 47, 246,
+ 202, 46, 47, 247, 73, 46, 47, 246, 170, 46, 47, 247, 41, 46, 47, 246,
+ 233, 46, 47, 247, 104, 46, 47, 246, 131, 46, 47, 247, 2, 46, 47, 246,
+ 194, 46, 47, 247, 65, 46, 47, 246, 162, 46, 47, 247, 33, 46, 47, 246,
+ 225, 46, 47, 247, 96, 46, 47, 246, 146, 46, 47, 247, 17, 46, 47, 246,
+ 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47, 247, 48, 46, 47, 246,
+ 240, 46, 47, 247, 111, 46, 47, 246, 119, 46, 47, 246, 246, 46, 47, 246,
+ 182, 46, 47, 247, 53, 46, 47, 246, 150, 46, 47, 247, 21, 46, 47, 246,
+ 213, 46, 47, 247, 84, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47, 246, 197,
+ 46, 47, 247, 68, 46, 47, 246, 165, 46, 47, 247, 36, 46, 47, 246, 228, 46,
+ 47, 247, 99, 46, 47, 246, 126, 46, 47, 246, 253, 46, 47, 246, 189, 46,
+ 47, 247, 60, 46, 47, 246, 157, 46, 47, 247, 28, 46, 47, 246, 220, 46, 47,
+ 247, 91, 46, 47, 246, 141, 46, 47, 247, 12, 46, 47, 246, 204, 46, 47,
+ 247, 75, 46, 47, 246, 172, 46, 47, 247, 43, 46, 47, 246, 235, 46, 47,
+ 247, 106, 46, 47, 246, 122, 46, 47, 246, 249, 46, 47, 246, 185, 46, 47,
+ 247, 56, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47, 246, 216, 46, 47,
+ 247, 87, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, 246, 200, 46, 47, 247,
+ 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, 246, 231, 46, 47, 247,
+ 102, 46, 47, 246, 129, 46, 47, 247, 0, 46, 47, 246, 192, 46, 47, 247, 63,
+ 46, 47, 246, 160, 46, 47, 247, 31, 46, 47, 246, 223, 46, 47, 247, 94, 46,
+ 47, 246, 144, 46, 47, 247, 15, 46, 47, 246, 207, 46, 47, 247, 78, 46, 47,
+ 246, 175, 46, 47, 247, 46, 46, 47, 246, 238, 46, 47, 247, 109, 46, 47,
+ 246, 120, 46, 47, 246, 247, 46, 47, 246, 183, 46, 47, 247, 54, 46, 47,
+ 246, 151, 46, 47, 247, 22, 46, 47, 246, 214, 46, 47, 247, 85, 46, 47,
+ 246, 135, 46, 47, 247, 6, 46, 47, 246, 198, 46, 47, 247, 69, 46, 47, 246,
+ 166, 46, 47, 247, 37, 46, 47, 246, 229, 46, 47, 247, 100, 46, 47, 246,
+ 127, 46, 47, 246, 254, 46, 47, 246, 190, 46, 47, 247, 61, 46, 47, 246,
+ 158, 46, 47, 247, 29, 46, 47, 246, 221, 46, 47, 247, 92, 46, 47, 246,
+ 142, 46, 47, 247, 13, 46, 47, 246, 205, 46, 47, 247, 76, 46, 47, 246,
+ 173, 46, 47, 247, 44, 46, 47, 246, 236, 46, 47, 247, 107, 46, 47, 246,
+ 123, 46, 47, 246, 250, 46, 47, 246, 186, 46, 47, 247, 57, 46, 47, 246,
+ 154, 46, 47, 247, 25, 46, 47, 246, 217, 46, 47, 247, 88, 46, 47, 246,
+ 138, 46, 47, 247, 9, 46, 47, 246, 201, 46, 47, 247, 72, 46, 47, 246, 169,
+ 46, 47, 247, 40, 46, 47, 246, 232, 46, 47, 247, 103, 46, 47, 246, 130,
+ 46, 47, 247, 1, 46, 47, 246, 193, 46, 47, 247, 64, 46, 47, 246, 161, 46,
+ 47, 247, 32, 46, 47, 246, 224, 46, 47, 247, 95, 46, 47, 246, 145, 46, 47,
+ 247, 16, 46, 47, 246, 208, 46, 47, 247, 79, 46, 47, 246, 176, 46, 47,
+ 247, 47, 46, 47, 246, 239, 46, 47, 247, 110, 97, 215, 58, 80, 2, 67, 91,
+ 97, 215, 58, 80, 2, 52, 67, 91, 140, 52, 80, 2, 67, 91, 97, 52, 80, 2,
+ 67, 91, 43, 44, 52, 80, 2, 67, 91, 97, 215, 58, 80, 243, 243, 130, 140,
+ 52, 80, 243, 243, 130, 97, 52, 80, 243, 243, 130, 246, 104, 80, 2, 203,
+ 91, 214, 153, 80, 2, 203, 91, 214, 153, 215, 211, 74, 246, 104, 215, 211,
+ 74, 140, 52, 248, 157, 74, 97, 52, 248, 157, 74, 140, 215, 211, 248, 157,
+ 74, 97, 215, 211, 248, 157, 74, 97, 215, 58, 215, 211, 248, 157, 74, 97,
+ 80, 2, 246, 118, 218, 139, 214, 153, 80, 216, 42, 130, 246, 104, 80, 216,
+ 42, 130, 97, 80, 2, 217, 78, 2, 67, 91, 97, 80, 2, 217, 78, 2, 52, 67,
+ 91, 97, 215, 58, 80, 2, 217, 77, 97, 215, 58, 80, 2, 217, 78, 2, 67, 91,
+ 97, 215, 58, 80, 2, 217, 78, 2, 52, 67, 91, 140, 253, 251, 97, 253, 251,
+ 140, 52, 253, 251, 97, 52, 253, 251, 140, 80, 216, 42, 85, 247, 248, 97,
+ 80, 216, 42, 85, 247, 248, 140, 80, 243, 243, 252, 141, 216, 42, 85, 247,
+ 248, 97, 80, 243, 243, 252, 141, 216, 42, 85, 247, 248, 228, 56, 212, 9,
+ 22, 219, 28, 245, 220, 74, 228, 56, 245, 220, 22, 219, 28, 212, 9, 74,
+ 228, 56, 212, 9, 80, 2, 103, 228, 56, 245, 220, 80, 2, 103, 219, 28, 245,
+ 220, 80, 2, 103, 219, 28, 212, 9, 80, 2, 103, 228, 56, 212, 9, 80, 22,
+ 228, 56, 245, 220, 74, 228, 56, 245, 220, 80, 22, 219, 28, 245, 220, 74,
+ 219, 28, 245, 220, 80, 22, 219, 28, 212, 9, 74, 219, 28, 212, 9, 80, 22,
+ 228, 56, 212, 9, 74, 222, 228, 247, 255, 249, 125, 244, 175, 247, 254,
+ 244, 175, 247, 255, 249, 125, 222, 228, 247, 254, 219, 28, 245, 220, 80,
+ 249, 125, 228, 56, 245, 220, 74, 228, 56, 245, 220, 80, 249, 125, 219,
+ 28, 245, 220, 74, 244, 175, 247, 255, 249, 125, 228, 56, 245, 220, 74,
+ 222, 228, 247, 255, 249, 125, 219, 28, 245, 220, 74, 228, 56, 245, 220,
+ 80, 249, 125, 228, 56, 212, 9, 74, 228, 56, 212, 9, 80, 249, 125, 228,
+ 56, 245, 220, 74, 212, 36, 80, 225, 7, 247, 195, 222, 251, 80, 225, 7,
+ 97, 216, 188, 249, 90, 214, 152, 80, 225, 7, 97, 216, 188, 249, 90, 246,
+ 103, 80, 225, 7, 246, 104, 216, 188, 249, 90, 233, 37, 80, 225, 7, 246,
+ 104, 216, 188, 249, 90, 222, 241, 222, 244, 254, 26, 250, 2, 74, 233, 40,
+ 254, 26, 254, 88, 74, 216, 14, 254, 26, 254, 88, 74, 251, 175, 254, 26,
+ 254, 88, 74, 216, 14, 254, 26, 250, 2, 80, 2, 230, 181, 216, 14, 254, 26,
+ 254, 88, 80, 2, 225, 22, 232, 108, 44, 220, 152, 250, 2, 74, 232, 108,
+ 43, 220, 152, 254, 88, 74, 254, 88, 250, 0, 250, 36, 74, 250, 2, 250, 0,
+ 250, 36, 74, 97, 80, 77, 219, 251, 140, 74, 140, 80, 77, 219, 251, 97,
+ 74, 219, 251, 97, 80, 77, 140, 74, 97, 80, 2, 96, 51, 140, 80, 2, 96, 51,
+ 97, 80, 216, 139, 211, 178, 43, 44, 80, 216, 139, 4, 250, 35, 214, 153,
+ 215, 58, 80, 243, 243, 4, 250, 35, 43, 252, 139, 120, 44, 252, 139, 124,
+ 241, 254, 43, 252, 139, 124, 44, 252, 139, 120, 241, 254, 120, 252, 139,
+ 44, 124, 252, 139, 43, 241, 254, 120, 252, 139, 43, 124, 252, 139, 44,
+ 241, 254, 43, 252, 139, 120, 44, 252, 139, 120, 241, 254, 120, 252, 139,
+ 44, 124, 252, 139, 44, 241, 254, 43, 252, 139, 124, 44, 252, 139, 124,
+ 241, 254, 120, 252, 139, 43, 124, 252, 139, 43, 241, 254, 140, 241, 255,
+ 2, 252, 139, 120, 216, 42, 130, 97, 241, 255, 2, 252, 139, 120, 216, 42,
+ 130, 214, 153, 241, 255, 2, 252, 139, 44, 216, 42, 130, 246, 104, 241,
+ 255, 2, 252, 139, 44, 216, 42, 130, 140, 241, 255, 2, 252, 139, 124, 216,
+ 42, 130, 97, 241, 255, 2, 252, 139, 124, 216, 42, 130, 214, 153, 241,
+ 255, 2, 252, 139, 43, 216, 42, 130, 246, 104, 241, 255, 2, 252, 139, 43,
+ 216, 42, 130, 140, 241, 255, 2, 252, 139, 120, 243, 243, 130, 97, 241,
+ 255, 2, 252, 139, 120, 243, 243, 130, 214, 153, 241, 255, 2, 252, 139,
+ 44, 243, 243, 130, 246, 104, 241, 255, 2, 252, 139, 44, 243, 243, 130,
+ 140, 241, 255, 2, 252, 139, 124, 243, 243, 130, 97, 241, 255, 2, 252,
+ 139, 124, 243, 243, 130, 214, 153, 241, 255, 2, 252, 139, 43, 243, 243,
+ 130, 246, 104, 241, 255, 2, 252, 139, 43, 243, 243, 130, 140, 241, 255,
+ 2, 252, 139, 120, 77, 140, 241, 255, 2, 252, 139, 246, 106, 214, 153,
+ 241, 255, 2, 252, 139, 43, 252, 30, 214, 153, 241, 255, 2, 252, 139, 222,
+ 251, 97, 241, 255, 2, 252, 139, 120, 77, 97, 241, 255, 2, 252, 139, 246,
+ 106, 246, 104, 241, 255, 2, 252, 139, 43, 252, 30, 246, 104, 241, 255, 2,
+ 252, 139, 222, 251, 140, 241, 255, 2, 252, 139, 120, 77, 97, 241, 255, 2,
+ 252, 139, 214, 163, 140, 241, 255, 2, 252, 139, 124, 77, 97, 241, 255, 2,
+ 252, 139, 246, 106, 97, 241, 255, 2, 252, 139, 120, 77, 140, 241, 255, 2,
+ 252, 139, 214, 163, 97, 241, 255, 2, 252, 139, 124, 77, 140, 241, 255, 2,
+ 252, 139, 246, 106, 140, 241, 255, 2, 252, 139, 120, 77, 199, 248, 156,
+ 140, 241, 255, 2, 252, 139, 124, 252, 43, 199, 248, 156, 97, 241, 255, 2,
+ 252, 139, 120, 77, 199, 248, 156, 97, 241, 255, 2, 252, 139, 124, 252,
+ 43, 199, 248, 156, 214, 153, 241, 255, 2, 252, 139, 43, 252, 30, 246,
+ 104, 241, 255, 2, 252, 139, 222, 251, 246, 104, 241, 255, 2, 252, 139,
+ 43, 252, 30, 214, 153, 241, 255, 2, 252, 139, 222, 251, 44, 52, 80, 2,
+ 222, 183, 241, 235, 245, 98, 5, 77, 97, 74, 216, 89, 226, 168, 77, 97,
+ 74, 140, 80, 77, 216, 89, 226, 167, 97, 80, 77, 216, 89, 226, 167, 97,
+ 80, 77, 254, 148, 128, 111, 233, 15, 77, 140, 74, 140, 80, 216, 139, 233,
+ 14, 242, 130, 77, 97, 74, 218, 64, 77, 97, 74, 140, 80, 216, 139, 218,
+ 63, 218, 22, 77, 140, 74, 43, 244, 91, 217, 77, 44, 244, 91, 217, 77,
+ 120, 244, 91, 217, 77, 124, 244, 91, 217, 77, 215, 211, 67, 252, 141,
+ 248, 60, 210, 160, 187, 218, 242, 210, 160, 187, 215, 49, 249, 226, 43,
+ 71, 249, 99, 127, 44, 71, 249, 99, 127, 43, 71, 226, 3, 44, 71, 226, 3,
+ 210, 160, 187, 43, 236, 15, 127, 210, 160, 187, 44, 236, 15, 127, 210,
+ 160, 187, 43, 251, 242, 127, 210, 160, 187, 44, 251, 242, 127, 43, 42,
+ 251, 158, 2, 214, 183, 44, 42, 251, 158, 2, 214, 183, 43, 42, 251, 158,
+ 2, 216, 115, 236, 0, 216, 14, 249, 160, 44, 42, 251, 158, 2, 216, 115,
+ 236, 0, 251, 175, 249, 160, 43, 42, 251, 158, 2, 216, 115, 236, 0, 251,
+ 175, 249, 160, 44, 42, 251, 158, 2, 216, 115, 236, 0, 216, 14, 249, 160,
+ 43, 254, 110, 251, 158, 2, 247, 120, 44, 254, 110, 251, 158, 2, 247, 120,
+ 43, 254, 26, 233, 15, 127, 44, 254, 26, 242, 130, 127, 52, 43, 254, 26,
+ 242, 130, 127, 52, 44, 254, 26, 233, 15, 127, 43, 85, 216, 6, 220, 53,
+ 127, 44, 85, 216, 6, 220, 53, 127, 246, 118, 244, 135, 67, 210, 35, 232,
+ 213, 231, 88, 254, 110, 226, 170, 233, 46, 44, 254, 110, 214, 12, 2, 218,
+ 234, 231, 88, 44, 254, 110, 2, 247, 120, 254, 110, 2, 222, 92, 235, 215,
+ 255, 3, 254, 109, 218, 255, 254, 110, 226, 170, 233, 46, 218, 255, 254,
+ 110, 226, 170, 214, 163, 215, 94, 254, 109, 223, 49, 254, 109, 254, 110,
+ 2, 214, 183, 223, 49, 254, 110, 2, 214, 183, 226, 248, 254, 110, 226,
+ 170, 214, 163, 226, 248, 254, 110, 226, 170, 246, 106, 231, 88, 254, 110,
+ 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 120, 22, 222, 251, 231, 88,
+ 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 120, 22, 233, 46,
+ 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 124, 22,
+ 222, 251, 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225,
+ 7, 124, 22, 233, 46, 231, 88, 254, 110, 2, 204, 254, 5, 245, 140, 236, 0,
+ 80, 225, 7, 44, 22, 214, 163, 231, 88, 254, 110, 2, 204, 254, 5, 245,
+ 140, 236, 0, 80, 225, 7, 43, 22, 214, 163, 231, 88, 254, 110, 2, 204,
+ 254, 5, 245, 140, 236, 0, 80, 225, 7, 44, 22, 246, 106, 231, 88, 254,
+ 110, 2, 204, 254, 5, 245, 140, 236, 0, 80, 225, 7, 43, 22, 246, 106, 223,
+ 49, 245, 152, 220, 127, 245, 152, 220, 128, 2, 226, 123, 245, 152, 220,
+ 128, 2, 4, 250, 36, 48, 245, 152, 220, 128, 2, 44, 80, 48, 245, 152, 220,
+ 128, 2, 43, 80, 48, 250, 36, 2, 203, 130, 37, 67, 130, 37, 226, 7, 37,
+ 223, 50, 219, 46, 37, 225, 171, 250, 36, 247, 173, 251, 78, 203, 252,
+ 141, 22, 216, 14, 163, 247, 173, 251, 78, 67, 130, 250, 36, 2, 218, 24,
+ 211, 178, 37, 254, 87, 247, 169, 50, 120, 80, 216, 139, 250, 35, 37, 71,
+ 251, 113, 37, 251, 113, 37, 233, 14, 37, 242, 129, 250, 36, 2, 4, 250,
+ 36, 216, 42, 216, 196, 222, 251, 250, 36, 2, 113, 203, 218, 91, 216, 42,
+ 216, 196, 222, 251, 92, 222, 228, 247, 255, 219, 95, 92, 244, 175, 247,
+ 255, 219, 95, 92, 253, 216, 92, 4, 250, 35, 92, 218, 234, 113, 235, 65,
+ 218, 232, 215, 226, 2, 59, 48, 215, 226, 2, 214, 183, 222, 92, 236, 0,
+ 215, 225, 215, 226, 2, 220, 134, 253, 207, 251, 174, 44, 215, 226, 77,
+ 43, 215, 225, 43, 215, 226, 252, 30, 67, 130, 67, 252, 141, 252, 30, 44,
+ 215, 225, 251, 165, 2, 43, 163, 251, 221, 251, 165, 2, 44, 163, 251, 221,
+ 85, 251, 164, 30, 2, 43, 163, 251, 221, 30, 2, 44, 163, 251, 221, 71,
+ 240, 236, 85, 240, 236, 43, 211, 244, 244, 135, 44, 211, 244, 244, 135,
+ 43, 52, 211, 244, 244, 135, 44, 52, 211, 244, 244, 135, 235, 248, 235,
+ 234, 216, 112, 117, 235, 234, 235, 235, 229, 102, 2, 67, 130, 246, 112,
+ 230, 87, 42, 2, 249, 181, 226, 127, 235, 246, 253, 237, 219, 219, 224,
+ 180, 245, 98, 5, 22, 219, 97, 226, 7, 245, 98, 5, 22, 219, 97, 226, 8, 2,
+ 216, 89, 48, 240, 104, 216, 42, 22, 219, 97, 226, 7, 242, 183, 218, 155,
+ 216, 185, 246, 105, 215, 226, 2, 43, 163, 251, 221, 246, 105, 215, 226,
+ 2, 44, 163, 251, 221, 85, 247, 249, 2, 124, 74, 85, 232, 104, 71, 250,
+ 36, 2, 124, 74, 85, 250, 36, 2, 124, 74, 245, 85, 71, 218, 234, 245, 85,
+ 85, 218, 234, 245, 85, 71, 247, 248, 245, 85, 85, 247, 248, 245, 85, 71,
+ 250, 35, 245, 85, 85, 250, 35, 222, 132, 223, 50, 219, 47, 226, 167, 219,
+ 47, 2, 226, 123, 223, 50, 219, 47, 2, 203, 91, 251, 249, 219, 46, 251,
+ 249, 223, 50, 219, 46, 52, 225, 22, 215, 211, 225, 22, 233, 42, 249, 91,
+ 254, 110, 127, 222, 247, 249, 91, 254, 110, 127, 216, 78, 230, 179, 230,
+ 24, 37, 59, 226, 167, 230, 24, 37, 96, 226, 167, 230, 24, 37, 30, 226,
+ 167, 230, 24, 214, 176, 226, 168, 2, 247, 120, 230, 24, 214, 176, 226,
+ 168, 2, 225, 22, 230, 24, 42, 235, 199, 226, 167, 230, 24, 42, 214, 176,
+ 226, 167, 113, 232, 146, 22, 226, 167, 113, 232, 146, 177, 226, 167, 230,
+ 24, 30, 226, 167, 230, 154, 113, 218, 43, 218, 41, 2, 235, 211, 224, 24,
+ 235, 212, 226, 167, 244, 99, 225, 255, 235, 211, 235, 212, 2, 52, 91,
+ 235, 212, 253, 173, 2, 219, 95, 250, 32, 243, 226, 254, 88, 235, 209,
+ 232, 214, 235, 210, 2, 223, 115, 225, 237, 254, 2, 225, 1, 232, 214, 235,
+ 210, 2, 220, 152, 225, 237, 254, 2, 225, 1, 232, 214, 235, 210, 228, 52,
+ 235, 250, 216, 196, 225, 1, 235, 212, 254, 2, 115, 225, 11, 226, 167,
+ 224, 18, 235, 212, 226, 167, 235, 212, 2, 140, 80, 2, 103, 235, 212, 2,
+ 30, 50, 235, 212, 2, 235, 198, 235, 212, 2, 214, 175, 235, 212, 2, 226,
+ 123, 235, 212, 2, 214, 183, 235, 66, 233, 85, 43, 215, 226, 226, 167,
+ 210, 160, 187, 221, 201, 249, 209, 210, 160, 187, 221, 201, 225, 56, 210,
+ 160, 187, 221, 201, 224, 176, 96, 5, 2, 4, 250, 36, 48, 96, 5, 2, 250,
+ 31, 255, 15, 48, 96, 5, 2, 216, 89, 48, 96, 5, 2, 59, 51, 96, 5, 2, 216,
+ 89, 51, 96, 5, 2, 218, 65, 105, 96, 5, 2, 85, 215, 225, 230, 182, 5, 2,
+ 249, 220, 48, 230, 182, 5, 2, 59, 51, 230, 182, 5, 2, 244, 175, 247, 118,
+ 230, 182, 5, 2, 222, 228, 247, 118, 96, 5, 236, 0, 43, 163, 250, 35, 96,
+ 5, 236, 0, 44, 163, 250, 35, 213, 254, 177, 249, 131, 224, 180, 230, 84,
+ 5, 2, 59, 48, 230, 84, 5, 2, 214, 183, 220, 149, 224, 181, 2, 251, 175,
+ 249, 255, 219, 77, 224, 180, 230, 84, 5, 236, 0, 43, 163, 250, 35, 230,
+ 84, 5, 236, 0, 44, 163, 250, 35, 37, 230, 84, 5, 2, 250, 31, 255, 14,
+ 230, 84, 5, 236, 0, 52, 250, 35, 37, 247, 169, 50, 96, 5, 236, 0, 215,
+ 225, 230, 182, 5, 236, 0, 215, 225, 230, 84, 5, 236, 0, 215, 225, 235,
+ 206, 224, 180, 222, 242, 235, 206, 224, 180, 210, 160, 187, 223, 90, 249,
+ 209, 254, 134, 177, 249, 165, 235, 199, 2, 247, 120, 214, 176, 2, 230,
+ 182, 50, 214, 176, 2, 226, 123, 235, 199, 2, 226, 123, 235, 199, 2, 232,
+ 146, 254, 118, 214, 176, 2, 232, 146, 226, 158, 214, 176, 77, 235, 198,
+ 235, 199, 77, 214, 175, 214, 176, 77, 252, 141, 77, 235, 198, 235, 199,
+ 77, 252, 141, 77, 214, 175, 214, 176, 252, 30, 22, 235, 65, 2, 214, 175,
+ 235, 199, 252, 30, 22, 235, 65, 2, 235, 198, 250, 0, 214, 176, 2, 220,
+ 133, 250, 0, 235, 199, 2, 220, 133, 52, 42, 235, 198, 52, 42, 214, 175,
+ 250, 0, 214, 176, 2, 220, 134, 22, 219, 77, 224, 180, 232, 146, 22, 2,
+ 59, 48, 232, 146, 177, 2, 59, 48, 52, 232, 146, 254, 118, 52, 232, 146,
+ 226, 158, 113, 235, 200, 232, 146, 254, 118, 113, 235, 200, 232, 146,
+ 226, 158, 219, 85, 233, 85, 226, 158, 219, 85, 233, 85, 254, 118, 232,
+ 146, 177, 226, 121, 232, 146, 254, 118, 232, 146, 22, 2, 230, 224, 218,
+ 139, 232, 146, 177, 2, 230, 224, 218, 139, 232, 146, 22, 2, 203, 248,
+ 156, 232, 146, 177, 2, 203, 248, 156, 232, 146, 22, 2, 52, 226, 123, 232,
+ 146, 22, 2, 214, 183, 232, 146, 22, 2, 52, 214, 183, 4, 213, 251, 2, 214,
+ 183, 232, 146, 177, 2, 52, 226, 123, 232, 146, 177, 2, 52, 214, 183, 210,
+ 160, 187, 247, 129, 254, 79, 210, 160, 187, 223, 148, 254, 79, 245, 98,
+ 5, 2, 59, 51, 240, 104, 2, 59, 48, 215, 211, 203, 252, 141, 2, 52, 67,
+ 91, 215, 211, 203, 252, 141, 2, 215, 211, 67, 91, 216, 89, 226, 168, 2,
+ 59, 48, 216, 89, 226, 168, 2, 222, 228, 247, 118, 219, 162, 230, 182,
+ 219, 161, 249, 199, 2, 59, 48, 245, 98, 2, 253, 216, 254, 148, 128, 216,
+ 42, 2, 250, 31, 255, 14, 254, 48, 128, 177, 128, 111, 245, 98, 5, 77, 96,
+ 50, 96, 5, 77, 245, 98, 50, 245, 98, 5, 77, 216, 89, 226, 167, 52, 249,
+ 227, 245, 99, 113, 249, 194, 245, 98, 219, 176, 134, 249, 194, 245, 98,
+ 219, 176, 245, 98, 5, 2, 113, 170, 77, 22, 113, 170, 51, 245, 94, 2, 244,
+ 11, 170, 48, 233, 15, 2, 250, 36, 235, 215, 242, 130, 2, 250, 36, 235,
+ 215, 233, 15, 2, 224, 13, 164, 48, 242, 130, 2, 224, 13, 164, 48, 233,
+ 15, 177, 219, 97, 128, 111, 242, 130, 177, 219, 97, 128, 111, 233, 15,
+ 177, 219, 97, 128, 216, 42, 2, 59, 235, 215, 242, 130, 177, 219, 97, 128,
+ 216, 42, 2, 59, 235, 215, 233, 15, 177, 219, 97, 128, 216, 42, 2, 59, 48,
+ 242, 130, 177, 219, 97, 128, 216, 42, 2, 59, 48, 233, 15, 177, 219, 97,
+ 128, 216, 42, 2, 59, 77, 222, 251, 242, 130, 177, 219, 97, 128, 216, 42,
+ 2, 59, 77, 233, 46, 233, 15, 177, 254, 49, 242, 130, 177, 254, 49, 233,
+ 15, 22, 219, 153, 228, 52, 128, 111, 242, 130, 22, 219, 153, 228, 52,
+ 128, 111, 233, 15, 22, 228, 52, 254, 49, 242, 130, 22, 228, 52, 254, 49,
+ 233, 15, 77, 246, 111, 128, 77, 242, 129, 242, 130, 77, 246, 111, 128,
+ 77, 233, 14, 233, 15, 77, 219, 162, 177, 245, 99, 242, 130, 77, 219, 162,
+ 177, 245, 99, 233, 15, 77, 219, 162, 77, 242, 129, 242, 130, 77, 219,
+ 162, 77, 233, 14, 233, 15, 77, 242, 130, 77, 246, 111, 245, 99, 242, 130,
+ 77, 233, 15, 77, 246, 111, 245, 99, 233, 15, 77, 219, 97, 128, 77, 242,
+ 130, 77, 219, 97, 245, 99, 242, 130, 77, 219, 97, 128, 77, 233, 15, 77,
+ 219, 97, 245, 99, 219, 97, 128, 216, 42, 177, 233, 14, 219, 97, 128, 216,
+ 42, 177, 242, 129, 219, 97, 128, 216, 42, 177, 233, 15, 2, 59, 235, 215,
+ 219, 97, 128, 216, 42, 177, 242, 130, 2, 59, 235, 215, 246, 111, 128,
+ 216, 42, 177, 233, 14, 246, 111, 128, 216, 42, 177, 242, 129, 246, 111,
+ 219, 97, 128, 216, 42, 177, 233, 14, 246, 111, 219, 97, 128, 216, 42,
+ 177, 242, 129, 219, 162, 177, 233, 14, 219, 162, 177, 242, 129, 219, 162,
+ 77, 233, 15, 77, 245, 98, 50, 219, 162, 77, 242, 130, 77, 245, 98, 50,
+ 52, 229, 91, 233, 14, 52, 229, 91, 242, 129, 52, 229, 91, 233, 15, 2,
+ 214, 183, 242, 130, 226, 121, 233, 14, 242, 130, 252, 30, 233, 14, 233,
+ 15, 250, 0, 251, 78, 249, 92, 242, 130, 250, 0, 251, 78, 249, 92, 233,
+ 15, 250, 0, 251, 78, 249, 93, 77, 219, 97, 245, 99, 242, 130, 250, 0,
+ 251, 78, 249, 93, 77, 219, 97, 245, 99, 219, 78, 216, 200, 233, 83, 216,
+ 200, 219, 78, 216, 201, 177, 128, 111, 233, 83, 216, 201, 177, 128, 111,
+ 245, 98, 5, 2, 251, 108, 48, 224, 203, 77, 219, 153, 245, 98, 50, 218,
+ 56, 77, 219, 153, 245, 98, 50, 224, 203, 77, 219, 153, 228, 52, 128, 111,
+ 218, 56, 77, 219, 153, 228, 52, 128, 111, 224, 203, 77, 245, 98, 50, 218,
+ 56, 77, 245, 98, 50, 224, 203, 77, 228, 52, 128, 111, 218, 56, 77, 228,
+ 52, 128, 111, 224, 203, 77, 254, 148, 128, 111, 218, 56, 77, 254, 148,
+ 128, 111, 224, 203, 77, 228, 52, 254, 148, 128, 111, 218, 56, 77, 228,
+ 52, 254, 148, 128, 111, 52, 224, 202, 52, 218, 55, 218, 64, 2, 247, 120,
+ 218, 22, 2, 247, 120, 218, 64, 2, 96, 5, 51, 218, 22, 2, 96, 5, 51, 218,
+ 64, 2, 230, 84, 5, 51, 218, 22, 2, 230, 84, 5, 51, 218, 64, 64, 177, 128,
+ 216, 42, 2, 59, 48, 218, 22, 64, 177, 128, 216, 42, 2, 59, 48, 218, 64,
+ 64, 77, 245, 98, 50, 218, 22, 64, 77, 245, 98, 50, 218, 64, 64, 77, 216,
+ 89, 226, 167, 218, 22, 64, 77, 216, 89, 226, 167, 218, 64, 64, 77, 254,
+ 148, 128, 111, 218, 22, 64, 77, 254, 148, 128, 111, 218, 64, 64, 77, 228,
+ 52, 128, 111, 218, 22, 64, 77, 228, 52, 128, 111, 42, 43, 204, 93, 226,
+ 167, 42, 44, 204, 93, 226, 167, 250, 0, 218, 63, 250, 0, 218, 21, 250, 0,
+ 218, 64, 177, 128, 111, 250, 0, 218, 22, 177, 128, 111, 218, 64, 77, 218,
+ 21, 218, 22, 77, 218, 63, 218, 64, 77, 218, 63, 218, 22, 77, 218, 21,
+ 218, 22, 252, 30, 218, 63, 218, 22, 252, 30, 22, 235, 65, 251, 78, 248,
+ 157, 2, 218, 63, 245, 170, 64, 226, 170, 246, 103, 225, 48, 2, 217, 12,
+ 216, 13, 215, 240, 235, 198, 244, 21, 228, 65, 219, 251, 43, 217, 87,
+ 219, 251, 124, 217, 87, 219, 251, 120, 217, 87, 225, 172, 2, 222, 91, 67,
+ 252, 141, 215, 211, 44, 215, 93, 52, 67, 252, 141, 43, 215, 93, 67, 252,
+ 141, 52, 43, 215, 93, 52, 67, 252, 141, 52, 43, 215, 93, 199, 248, 157,
+ 243, 243, 43, 231, 63, 64, 52, 213, 239, 219, 251, 124, 217, 88, 2, 226,
+ 123, 219, 251, 120, 217, 88, 2, 214, 183, 219, 251, 120, 217, 88, 77,
+ 219, 251, 124, 217, 87, 52, 124, 217, 87, 52, 120, 217, 87, 52, 218, 103,
+ 228, 52, 50, 223, 49, 52, 218, 103, 228, 52, 50, 247, 138, 228, 52, 247,
+ 175, 2, 223, 49, 229, 101, 219, 95, 67, 232, 214, 2, 250, 36, 48, 67,
+ 232, 214, 2, 250, 36, 51, 124, 217, 88, 2, 250, 36, 51, 226, 8, 2, 203,
+ 91, 226, 8, 2, 216, 89, 226, 167, 215, 211, 67, 252, 141, 251, 244, 223,
+ 91, 215, 211, 67, 252, 141, 2, 203, 91, 215, 211, 249, 227, 226, 167,
+ 215, 211, 229, 91, 233, 14, 215, 211, 229, 91, 242, 129, 246, 111, 219,
+ 97, 233, 15, 177, 128, 111, 246, 111, 219, 97, 242, 130, 177, 128, 111,
+ 215, 211, 219, 47, 251, 244, 223, 91, 233, 85, 215, 211, 67, 252, 141,
+ 226, 167, 52, 219, 47, 226, 167, 71, 67, 130, 230, 24, 71, 67, 130, 228,
+ 56, 245, 220, 71, 74, 228, 56, 212, 9, 71, 74, 219, 28, 245, 220, 71, 74,
+ 219, 28, 212, 9, 71, 74, 43, 44, 71, 74, 140, 85, 74, 214, 153, 85, 74,
+ 246, 104, 85, 74, 228, 56, 245, 220, 85, 74, 228, 56, 212, 9, 85, 74,
+ 219, 28, 245, 220, 85, 74, 219, 28, 212, 9, 85, 74, 43, 44, 85, 74, 120,
+ 124, 85, 74, 97, 80, 2, 216, 77, 246, 103, 97, 80, 2, 216, 77, 214, 152,
+ 140, 80, 2, 216, 77, 246, 103, 140, 80, 2, 216, 77, 214, 152, 42, 2, 216,
+ 14, 163, 251, 221, 42, 2, 251, 175, 163, 251, 221, 42, 2, 214, 160, 44,
+ 247, 255, 163, 251, 221, 42, 2, 232, 108, 43, 247, 255, 163, 251, 221,
+ 247, 249, 2, 43, 163, 251, 221, 247, 249, 2, 44, 163, 251, 221, 247, 249,
+ 2, 216, 14, 163, 251, 221, 247, 249, 2, 251, 175, 163, 251, 221, 246,
+ 118, 218, 234, 85, 233, 85, 218, 234, 71, 233, 85, 218, 234, 85, 213,
+ 187, 4, 218, 234, 71, 213, 187, 4, 218, 234, 85, 225, 190, 71, 225, 190,
+ 71, 241, 193, 85, 241, 193, 203, 85, 241, 193, 85, 233, 85, 250, 35, 85,
+ 231, 82, 247, 248, 71, 231, 82, 247, 248, 85, 231, 82, 232, 104, 71, 231,
+ 82, 232, 104, 85, 4, 247, 248, 85, 4, 232, 104, 71, 4, 232, 104, 85, 203,
+ 245, 164, 71, 203, 245, 164, 85, 67, 245, 164, 71, 67, 245, 164, 43, 80,
+ 2, 4, 250, 35, 134, 140, 253, 247, 43, 80, 2, 37, 225, 22, 199, 140, 218,
+ 230, 74, 140, 215, 58, 80, 2, 67, 91, 140, 215, 58, 80, 2, 52, 67, 91,
+ 140, 215, 58, 80, 243, 243, 130, 140, 215, 58, 215, 211, 248, 157, 74,
+ 140, 80, 2, 246, 118, 218, 139, 140, 80, 2, 217, 78, 2, 67, 91, 140, 80,
+ 2, 217, 78, 2, 52, 67, 91, 140, 215, 58, 80, 2, 217, 77, 140, 215, 58,
+ 80, 2, 217, 78, 2, 67, 91, 140, 215, 58, 80, 2, 217, 78, 2, 52, 67, 91,
+ 140, 80, 216, 139, 211, 178, 212, 36, 80, 225, 7, 247, 195, 233, 46, 245,
+ 98, 5, 77, 140, 74, 223, 50, 216, 89, 226, 168, 77, 140, 74, 140, 80, 77,
+ 223, 50, 254, 148, 128, 111, 97, 80, 216, 139, 242, 129, 97, 80, 216,
+ 139, 218, 21, 140, 224, 24, 74, 97, 224, 24, 74, 223, 50, 216, 89, 226,
+ 168, 77, 97, 74, 97, 80, 77, 223, 50, 254, 148, 128, 111, 216, 89, 226,
+ 168, 77, 140, 74, 140, 80, 77, 254, 148, 128, 111, 140, 80, 77, 223, 50,
+ 216, 89, 226, 167, 97, 80, 77, 223, 50, 216, 89, 226, 167, 71, 231, 82,
+ 218, 156, 85, 4, 218, 156, 71, 4, 218, 156, 85, 222, 247, 225, 190, 71,
+ 222, 247, 225, 190, 114, 233, 85, 250, 35, 114, 226, 124, 2, 226, 124,
+ 235, 215, 114, 250, 36, 2, 250, 36, 235, 215, 114, 250, 35, 114, 37, 221,
+ 254, 145, 6, 1, 253, 159, 145, 6, 1, 251, 117, 145, 6, 1, 213, 253, 145,
+ 6, 1, 242, 185, 145, 6, 1, 247, 140, 145, 6, 1, 211, 21, 145, 6, 1, 210,
+ 68, 145, 6, 1, 246, 34, 145, 6, 1, 210, 91, 145, 6, 1, 235, 148, 145, 6,
+ 1, 65, 235, 148, 145, 6, 1, 73, 145, 6, 1, 247, 160, 145, 6, 1, 234, 240,
+ 145, 6, 1, 232, 186, 145, 6, 1, 230, 29, 145, 6, 1, 229, 191, 145, 6, 1,
+ 226, 185, 145, 6, 1, 225, 4, 145, 6, 1, 222, 227, 145, 6, 1, 219, 83,
+ 145, 6, 1, 215, 81, 145, 6, 1, 214, 201, 145, 6, 1, 243, 246, 145, 6, 1,
+ 241, 199, 145, 6, 1, 226, 135, 145, 6, 1, 225, 221, 145, 6, 1, 219, 228,
+ 145, 6, 1, 215, 167, 145, 6, 1, 250, 75, 145, 6, 1, 220, 102, 145, 6, 1,
+ 211, 27, 145, 6, 1, 211, 29, 145, 6, 1, 211, 57, 145, 6, 1, 218, 253,
+ 162, 145, 6, 1, 210, 212, 145, 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184,
+ 2, 217, 77, 145, 6, 1, 210, 244, 145, 6, 1, 235, 184, 4, 210, 183, 145,
+ 6, 1, 251, 249, 210, 183, 145, 6, 1, 235, 184, 251, 249, 210, 183, 145,
+ 6, 1, 244, 82, 145, 6, 1, 235, 146, 145, 6, 1, 219, 227, 145, 6, 1, 215,
+ 202, 61, 145, 6, 1, 233, 75, 230, 29, 145, 4, 1, 253, 159, 145, 4, 1,
+ 251, 117, 145, 4, 1, 213, 253, 145, 4, 1, 242, 185, 145, 4, 1, 247, 140,
+ 145, 4, 1, 211, 21, 145, 4, 1, 210, 68, 145, 4, 1, 246, 34, 145, 4, 1,
+ 210, 91, 145, 4, 1, 235, 148, 145, 4, 1, 65, 235, 148, 145, 4, 1, 73,
+ 145, 4, 1, 247, 160, 145, 4, 1, 234, 240, 145, 4, 1, 232, 186, 145, 4, 1,
+ 230, 29, 145, 4, 1, 229, 191, 145, 4, 1, 226, 185, 145, 4, 1, 225, 4,
+ 145, 4, 1, 222, 227, 145, 4, 1, 219, 83, 145, 4, 1, 215, 81, 145, 4, 1,
+ 214, 201, 145, 4, 1, 243, 246, 145, 4, 1, 241, 199, 145, 4, 1, 226, 135,
+ 145, 4, 1, 225, 221, 145, 4, 1, 219, 228, 145, 4, 1, 215, 167, 145, 4, 1,
+ 250, 75, 145, 4, 1, 220, 102, 145, 4, 1, 211, 27, 145, 4, 1, 211, 29,
+ 145, 4, 1, 211, 57, 145, 4, 1, 218, 253, 162, 145, 4, 1, 210, 212, 145,
+ 4, 1, 4, 210, 183, 145, 4, 1, 4, 210, 184, 2, 217, 77, 145, 4, 1, 210,
+ 244, 145, 4, 1, 235, 184, 4, 210, 183, 145, 4, 1, 251, 249, 210, 183,
+ 145, 4, 1, 235, 184, 251, 249, 210, 183, 145, 4, 1, 244, 82, 145, 4, 1,
+ 235, 146, 145, 4, 1, 219, 227, 145, 4, 1, 215, 202, 61, 145, 4, 1, 233,
+ 75, 230, 29, 7, 6, 1, 233, 149, 2, 52, 130, 7, 4, 1, 233, 149, 2, 52,
+ 130, 7, 6, 1, 233, 149, 2, 230, 224, 182, 7, 6, 1, 226, 106, 2, 91, 7, 6,
+ 1, 223, 224, 2, 217, 77, 7, 4, 1, 115, 2, 91, 7, 4, 1, 217, 153, 2, 247,
+ 255, 91, 7, 6, 1, 242, 61, 2, 248, 39, 7, 4, 1, 242, 61, 2, 248, 39, 7,
+ 6, 1, 235, 24, 2, 248, 39, 7, 4, 1, 235, 24, 2, 248, 39, 7, 6, 1, 210,
+ 160, 2, 248, 39, 7, 4, 1, 210, 160, 2, 248, 39, 7, 6, 1, 254, 143, 7, 6,
+ 1, 232, 50, 2, 103, 7, 6, 1, 215, 94, 61, 7, 6, 1, 215, 94, 254, 143, 7,
+ 4, 1, 214, 106, 2, 44, 103, 7, 6, 1, 212, 99, 2, 103, 7, 4, 1, 212, 99,
+ 2, 103, 7, 4, 1, 214, 106, 2, 249, 100, 7, 6, 1, 163, 242, 60, 7, 4, 1,
+ 163, 242, 60, 7, 4, 1, 217, 75, 225, 133, 7, 4, 1, 160, 2, 228, 50, 7, 4,
+ 1, 215, 94, 223, 224, 2, 217, 77, 7, 4, 1, 144, 2, 121, 222, 234, 235,
+ 215, 7, 1, 4, 6, 215, 94, 75, 7, 218, 65, 4, 1, 235, 144, 58, 1, 6, 214,
+ 105, 7, 6, 1, 222, 92, 2, 217, 250, 217, 77, 7, 6, 1, 210, 160, 2, 217,
+ 250, 217, 77, 81, 6, 1, 254, 164, 81, 4, 1, 254, 164, 81, 6, 1, 213, 173,
+ 81, 4, 1, 213, 173, 81, 6, 1, 243, 107, 81, 4, 1, 243, 107, 81, 6, 1,
+ 248, 191, 81, 4, 1, 248, 191, 81, 6, 1, 245, 194, 81, 4, 1, 245, 194, 81,
+ 6, 1, 219, 33, 81, 4, 1, 219, 33, 81, 6, 1, 210, 101, 81, 4, 1, 210, 101,
+ 81, 6, 1, 241, 248, 81, 4, 1, 241, 248, 81, 6, 1, 216, 177, 81, 4, 1,
+ 216, 177, 81, 6, 1, 240, 116, 81, 4, 1, 240, 116, 81, 6, 1, 234, 227, 81,
+ 4, 1, 234, 227, 81, 6, 1, 233, 72, 81, 4, 1, 233, 72, 81, 6, 1, 230, 230,
+ 81, 4, 1, 230, 230, 81, 6, 1, 228, 233, 81, 4, 1, 228, 233, 81, 6, 1,
+ 233, 233, 81, 4, 1, 233, 233, 81, 6, 1, 76, 81, 4, 1, 76, 81, 6, 1, 225,
+ 108, 81, 4, 1, 225, 108, 81, 6, 1, 222, 211, 81, 4, 1, 222, 211, 81, 6,
+ 1, 219, 165, 81, 4, 1, 219, 165, 81, 6, 1, 217, 41, 81, 4, 1, 217, 41,
+ 81, 6, 1, 214, 229, 81, 4, 1, 214, 229, 81, 6, 1, 244, 121, 81, 4, 1,
+ 244, 121, 81, 6, 1, 234, 112, 81, 4, 1, 234, 112, 81, 6, 1, 224, 161, 81,
+ 4, 1, 224, 161, 81, 6, 1, 226, 178, 81, 4, 1, 226, 178, 81, 6, 1, 247,
+ 253, 254, 170, 81, 4, 1, 247, 253, 254, 170, 81, 6, 1, 55, 81, 254, 196,
+ 81, 4, 1, 55, 81, 254, 196, 81, 6, 1, 249, 115, 245, 194, 81, 4, 1, 249,
+ 115, 245, 194, 81, 6, 1, 247, 253, 234, 227, 81, 4, 1, 247, 253, 234,
+ 227, 81, 6, 1, 247, 253, 228, 233, 81, 4, 1, 247, 253, 228, 233, 81, 6,
+ 1, 249, 115, 228, 233, 81, 4, 1, 249, 115, 228, 233, 81, 6, 1, 55, 81,
+ 226, 178, 81, 4, 1, 55, 81, 226, 178, 81, 6, 1, 221, 246, 81, 4, 1, 221,
+ 246, 81, 6, 1, 249, 128, 220, 55, 81, 4, 1, 249, 128, 220, 55, 81, 6, 1,
+ 55, 81, 220, 55, 81, 4, 1, 55, 81, 220, 55, 81, 6, 1, 55, 81, 245, 75,
+ 81, 4, 1, 55, 81, 245, 75, 81, 6, 1, 254, 182, 234, 117, 81, 4, 1, 254,
+ 182, 234, 117, 81, 6, 1, 247, 253, 241, 45, 81, 4, 1, 247, 253, 241, 45,
+ 81, 6, 1, 55, 81, 241, 45, 81, 4, 1, 55, 81, 241, 45, 81, 6, 1, 55, 81,
+ 162, 81, 4, 1, 55, 81, 162, 81, 6, 1, 233, 148, 162, 81, 4, 1, 233, 148,
+ 162, 81, 6, 1, 55, 81, 241, 217, 81, 4, 1, 55, 81, 241, 217, 81, 6, 1,
+ 55, 81, 241, 251, 81, 4, 1, 55, 81, 241, 251, 81, 6, 1, 55, 81, 243, 102,
+ 81, 4, 1, 55, 81, 243, 102, 81, 6, 1, 55, 81, 247, 163, 81, 4, 1, 55, 81,
+ 247, 163, 81, 6, 1, 55, 81, 220, 22, 81, 4, 1, 55, 81, 220, 22, 81, 6, 1,
+ 55, 227, 208, 220, 22, 81, 4, 1, 55, 227, 208, 220, 22, 81, 6, 1, 55,
+ 227, 208, 229, 27, 81, 4, 1, 55, 227, 208, 229, 27, 81, 6, 1, 55, 227,
+ 208, 227, 148, 81, 4, 1, 55, 227, 208, 227, 148, 81, 6, 1, 55, 227, 208,
+ 212, 37, 81, 4, 1, 55, 227, 208, 212, 37, 81, 16, 234, 246, 81, 16, 230,
+ 231, 222, 211, 81, 16, 225, 109, 222, 211, 81, 16, 218, 147, 81, 16, 217,
+ 42, 222, 211, 81, 16, 234, 113, 222, 211, 81, 16, 220, 23, 219, 165, 81,
+ 6, 1, 249, 115, 220, 55, 81, 4, 1, 249, 115, 220, 55, 81, 6, 1, 249, 115,
+ 243, 102, 81, 4, 1, 249, 115, 243, 102, 81, 38, 228, 234, 48, 81, 38,
+ 218, 247, 253, 224, 81, 38, 218, 247, 233, 21, 81, 6, 1, 251, 199, 234,
+ 117, 81, 4, 1, 251, 199, 234, 117, 81, 55, 227, 208, 243, 229, 218, 129,
+ 81, 55, 227, 208, 247, 197, 224, 13, 78, 81, 55, 227, 208, 235, 237, 224,
+ 13, 78, 81, 55, 227, 208, 213, 241, 247, 172, 81, 244, 2, 123, 242, 27,
+ 81, 243, 229, 218, 129, 81, 230, 124, 247, 172, 98, 4, 1, 254, 123, 98,
+ 4, 1, 252, 152, 98, 4, 1, 243, 106, 98, 4, 1, 247, 128, 98, 4, 1, 245,
+ 150, 98, 4, 1, 213, 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 60, 98, 4, 1,
+ 235, 255, 98, 4, 1, 234, 234, 98, 4, 1, 233, 81, 98, 4, 1, 231, 185, 98,
+ 4, 1, 229, 195, 98, 4, 1, 226, 196, 98, 4, 1, 226, 17, 98, 4, 1, 210, 78,
+ 98, 4, 1, 223, 171, 98, 4, 1, 221, 243, 98, 4, 1, 217, 50, 98, 4, 1, 214,
+ 190, 98, 4, 1, 225, 140, 98, 4, 1, 234, 121, 98, 4, 1, 242, 241, 98, 4,
+ 1, 224, 73, 98, 4, 1, 220, 20, 98, 4, 1, 250, 97, 98, 4, 1, 251, 7, 98,
+ 4, 1, 235, 100, 98, 4, 1, 250, 40, 98, 4, 1, 250, 143, 98, 4, 1, 211,
+ 163, 98, 4, 1, 235, 111, 98, 4, 1, 242, 43, 98, 4, 1, 241, 238, 98, 4, 1,
+ 241, 175, 98, 4, 1, 212, 22, 98, 4, 1, 242, 4, 98, 4, 1, 241, 65, 98, 4,
+ 1, 210, 246, 98, 4, 1, 254, 232, 216, 108, 1, 191, 216, 108, 1, 211, 99,
+ 216, 108, 1, 211, 98, 216, 108, 1, 211, 88, 216, 108, 1, 211, 86, 216,
+ 108, 1, 252, 32, 255, 16, 211, 81, 216, 108, 1, 211, 81, 216, 108, 1,
+ 211, 96, 216, 108, 1, 211, 93, 216, 108, 1, 211, 95, 216, 108, 1, 211,
+ 94, 216, 108, 1, 211, 12, 216, 108, 1, 211, 90, 216, 108, 1, 211, 79,
+ 216, 108, 1, 215, 115, 211, 79, 216, 108, 1, 211, 76, 216, 108, 1, 211,
+ 84, 216, 108, 1, 252, 32, 255, 16, 211, 84, 216, 108, 1, 215, 115, 211,
+ 84, 216, 108, 1, 211, 83, 216, 108, 1, 211, 103, 216, 108, 1, 211, 77,
+ 216, 108, 1, 215, 115, 211, 77, 216, 108, 1, 211, 66, 216, 108, 1, 215,
+ 115, 211, 66, 216, 108, 1, 211, 8, 216, 108, 1, 211, 49, 216, 108, 1,
+ 254, 207, 211, 49, 216, 108, 1, 215, 115, 211, 49, 216, 108, 1, 211, 75,
+ 216, 108, 1, 211, 74, 216, 108, 1, 211, 71, 216, 108, 1, 215, 115, 211,
+ 85, 216, 108, 1, 215, 115, 211, 69, 216, 108, 1, 211, 67, 216, 108, 1,
+ 210, 212, 216, 108, 1, 211, 64, 216, 108, 1, 211, 63, 216, 108, 1, 211,
+ 87, 216, 108, 1, 215, 115, 211, 87, 216, 108, 1, 253, 163, 211, 87, 216,
+ 108, 1, 211, 62, 216, 108, 1, 211, 60, 216, 108, 1, 211, 61, 216, 108, 1,
+ 211, 59, 216, 108, 1, 211, 58, 216, 108, 1, 211, 97, 216, 108, 1, 211,
+ 56, 216, 108, 1, 211, 54, 216, 108, 1, 211, 53, 216, 108, 1, 211, 52,
+ 216, 108, 1, 211, 50, 216, 108, 1, 217, 34, 211, 50, 216, 108, 1, 211,
+ 48, 216, 108, 1, 211, 47, 216, 108, 1, 210, 244, 216, 108, 58, 1, 233,
+ 126, 78, 216, 108, 220, 138, 78, 216, 108, 116, 235, 63, 29, 3, 232, 155,
+ 29, 3, 230, 160, 29, 3, 222, 209, 29, 3, 219, 57, 29, 3, 220, 6, 29, 3,
+ 251, 204, 29, 3, 216, 41, 29, 3, 249, 237, 29, 3, 228, 72, 29, 3, 227,
+ 133, 29, 3, 242, 180, 227, 0, 29, 3, 210, 22, 29, 3, 247, 143, 29, 3,
+ 248, 104, 29, 3, 235, 67, 29, 3, 216, 155, 29, 3, 250, 85, 29, 3, 225,
+ 120, 29, 3, 225, 15, 29, 3, 242, 255, 29, 3, 242, 251, 29, 3, 242, 252,
+ 29, 3, 242, 253, 29, 3, 218, 223, 29, 3, 218, 179, 29, 3, 218, 192, 29,
+ 3, 218, 222, 29, 3, 218, 196, 29, 3, 218, 197, 29, 3, 218, 184, 29, 3,
+ 250, 213, 29, 3, 250, 192, 29, 3, 250, 194, 29, 3, 250, 212, 29, 3, 250,
+ 210, 29, 3, 250, 211, 29, 3, 250, 193, 29, 3, 209, 243, 29, 3, 209, 221,
+ 29, 3, 209, 234, 29, 3, 209, 242, 29, 3, 209, 237, 29, 3, 209, 238, 29,
+ 3, 209, 226, 29, 3, 250, 208, 29, 3, 250, 195, 29, 3, 250, 197, 29, 3,
+ 250, 207, 29, 3, 250, 205, 29, 3, 250, 206, 29, 3, 250, 196, 29, 3, 223,
+ 236, 29, 3, 223, 226, 29, 3, 223, 232, 29, 3, 223, 235, 29, 3, 223, 233,
+ 29, 3, 223, 234, 29, 3, 223, 231, 29, 3, 233, 159, 29, 3, 233, 151, 29,
+ 3, 233, 154, 29, 3, 233, 158, 29, 3, 233, 155, 29, 3, 233, 156, 29, 3,
+ 233, 152, 29, 3, 211, 130, 29, 3, 211, 120, 29, 3, 211, 126, 29, 3, 211,
+ 129, 29, 3, 211, 127, 29, 3, 211, 128, 29, 3, 211, 125, 29, 3, 242, 71,
+ 29, 3, 242, 62, 29, 3, 242, 65, 29, 3, 242, 70, 29, 3, 242, 67, 29, 3,
+ 242, 68, 29, 3, 242, 64, 38, 33, 1, 252, 75, 38, 33, 1, 213, 255, 38, 33,
+ 1, 242, 236, 38, 33, 1, 248, 90, 38, 33, 1, 210, 74, 38, 33, 1, 210, 94,
+ 38, 33, 1, 176, 38, 33, 1, 245, 174, 38, 33, 1, 245, 159, 38, 33, 1, 245,
+ 150, 38, 33, 1, 76, 38, 33, 1, 225, 221, 38, 33, 1, 245, 92, 38, 33, 1,
+ 245, 82, 38, 33, 1, 217, 22, 38, 33, 1, 162, 38, 33, 1, 215, 178, 38, 33,
+ 1, 250, 131, 38, 33, 1, 220, 102, 38, 33, 1, 220, 65, 38, 33, 1, 244, 82,
+ 38, 33, 1, 245, 81, 38, 33, 1, 61, 38, 33, 1, 236, 60, 38, 33, 1, 247,
+ 161, 38, 33, 1, 230, 140, 214, 205, 38, 33, 1, 211, 59, 38, 33, 1, 210,
+ 212, 38, 33, 1, 235, 183, 61, 38, 33, 1, 232, 192, 210, 183, 38, 33, 1,
+ 251, 249, 210, 183, 38, 33, 1, 235, 183, 251, 249, 210, 183, 44, 254,
+ 110, 218, 60, 231, 154, 44, 254, 110, 246, 118, 218, 60, 231, 154, 43,
+ 218, 60, 127, 44, 218, 60, 127, 43, 246, 118, 218, 60, 127, 44, 246, 118,
+ 218, 60, 127, 223, 157, 235, 202, 231, 154, 223, 157, 246, 118, 235, 202,
+ 231, 154, 246, 118, 215, 241, 231, 154, 43, 215, 241, 127, 44, 215, 241,
+ 127, 223, 157, 218, 234, 43, 223, 157, 226, 198, 127, 44, 223, 157, 226,
+ 198, 127, 245, 210, 249, 158, 226, 13, 244, 22, 226, 13, 223, 49, 244,
+ 22, 226, 13, 240, 165, 246, 118, 226, 251, 246, 104, 254, 119, 214, 153,
+ 254, 119, 246, 118, 222, 247, 254, 109, 52, 226, 248, 240, 168, 235, 193,
+ 235, 201, 226, 59, 251, 154, 240, 169, 2, 248, 1, 216, 89, 2, 222, 234,
+ 48, 43, 121, 226, 5, 127, 44, 121, 226, 5, 127, 216, 89, 2, 59, 48, 216,
+ 89, 2, 59, 51, 43, 67, 252, 141, 2, 224, 7, 44, 67, 252, 141, 2, 224, 7,
+ 216, 14, 43, 163, 127, 216, 14, 44, 163, 127, 251, 175, 43, 163, 127,
+ 251, 175, 44, 163, 127, 43, 219, 187, 104, 127, 44, 219, 187, 104, 127,
+ 43, 52, 226, 3, 44, 52, 226, 3, 113, 170, 117, 123, 59, 224, 140, 123,
+ 59, 117, 113, 170, 224, 140, 92, 244, 11, 59, 224, 140, 244, 81, 59, 78,
+ 223, 49, 224, 13, 78, 67, 182, 222, 234, 225, 10, 211, 209, 220, 138,
+ 230, 224, 247, 120, 215, 94, 249, 219, 223, 157, 247, 120, 223, 157, 249,
+ 219, 215, 94, 220, 150, 248, 206, 2, 43, 242, 108, 248, 206, 2, 44, 242,
+ 108, 215, 94, 248, 205, 216, 14, 163, 221, 173, 50, 215, 59, 248, 156,
+ 216, 143, 248, 156, 9, 34, 223, 76, 9, 34, 250, 10, 9, 34, 221, 176, 110,
+ 9, 34, 221, 176, 105, 9, 34, 221, 176, 158, 9, 34, 225, 167, 9, 34, 251,
+ 163, 9, 34, 217, 92, 9, 34, 234, 33, 110, 9, 34, 234, 33, 105, 9, 34,
+ 247, 170, 9, 34, 221, 179, 9, 34, 4, 110, 9, 34, 4, 105, 9, 34, 233, 97,
+ 110, 9, 34, 233, 97, 105, 9, 34, 233, 97, 158, 9, 34, 233, 97, 161, 9,
+ 34, 219, 68, 9, 34, 216, 145, 9, 34, 219, 66, 110, 9, 34, 219, 66, 105,
+ 9, 34, 241, 228, 110, 9, 34, 241, 228, 105, 9, 34, 242, 15, 9, 34, 223,
+ 147, 9, 34, 250, 82, 9, 34, 218, 37, 9, 34, 230, 128, 9, 34, 248, 88, 9,
+ 34, 230, 120, 9, 34, 250, 25, 9, 34, 212, 41, 110, 9, 34, 212, 41, 105,
+ 9, 34, 244, 96, 9, 34, 225, 232, 110, 9, 34, 225, 232, 105, 9, 34, 219,
+ 160, 163, 215, 236, 215, 188, 9, 34, 249, 145, 9, 34, 247, 136, 9, 34,
+ 235, 137, 9, 34, 251, 198, 64, 249, 250, 9, 34, 245, 15, 9, 34, 218, 249,
+ 110, 9, 34, 218, 249, 105, 9, 34, 252, 154, 9, 34, 219, 167, 9, 34, 251,
+ 63, 219, 167, 9, 34, 229, 90, 110, 9, 34, 229, 90, 105, 9, 34, 229, 90,
+ 158, 9, 34, 229, 90, 161, 9, 34, 231, 46, 9, 34, 220, 57, 9, 34, 223,
+ 153, 9, 34, 245, 37, 9, 34, 226, 209, 9, 34, 251, 133, 110, 9, 34, 251,
+ 133, 105, 9, 34, 231, 86, 9, 34, 230, 123, 9, 34, 242, 140, 110, 9, 34,
+ 242, 140, 105, 9, 34, 242, 140, 158, 9, 34, 216, 106, 9, 34, 249, 249, 9,
+ 34, 212, 9, 110, 9, 34, 212, 9, 105, 9, 34, 251, 63, 221, 170, 9, 34,
+ 219, 160, 240, 248, 9, 34, 240, 248, 9, 34, 251, 63, 219, 2, 9, 34, 251,
+ 63, 220, 52, 9, 34, 244, 32, 9, 34, 251, 63, 250, 228, 9, 34, 219, 160,
+ 212, 57, 9, 34, 212, 58, 110, 9, 34, 212, 58, 105, 9, 34, 250, 27, 9, 34,
+ 251, 63, 242, 166, 9, 34, 199, 110, 9, 34, 199, 105, 9, 34, 251, 63, 232,
+ 137, 9, 34, 251, 63, 243, 88, 9, 34, 230, 119, 110, 9, 34, 230, 119, 105,
+ 9, 34, 223, 159, 9, 34, 251, 207, 9, 34, 251, 63, 217, 56, 233, 52, 9,
+ 34, 251, 63, 233, 53, 9, 34, 251, 63, 211, 239, 9, 34, 251, 63, 244, 46,
+ 9, 34, 245, 218, 110, 9, 34, 245, 218, 105, 9, 34, 245, 218, 158, 9, 34,
+ 251, 63, 245, 217, 9, 34, 241, 235, 9, 34, 251, 63, 240, 245, 9, 34, 251,
+ 194, 9, 34, 242, 222, 9, 34, 251, 63, 244, 90, 9, 34, 251, 63, 251, 237,
+ 9, 34, 251, 63, 222, 1, 9, 34, 219, 160, 212, 2, 9, 34, 219, 160, 211,
+ 41, 9, 34, 251, 63, 243, 244, 9, 34, 235, 143, 245, 41, 9, 34, 251, 63,
+ 245, 41, 9, 34, 235, 143, 216, 15, 9, 34, 251, 63, 216, 15, 9, 34, 235,
+ 143, 246, 96, 9, 34, 251, 63, 246, 96, 9, 34, 215, 91, 9, 34, 235, 143,
+ 215, 91, 9, 34, 251, 63, 215, 91, 60, 34, 110, 60, 34, 232, 213, 60, 34,
+ 247, 120, 60, 34, 219, 95, 60, 34, 221, 175, 60, 34, 103, 60, 34, 105,
+ 60, 34, 232, 237, 60, 34, 231, 185, 60, 34, 233, 33, 60, 34, 245, 129,
+ 60, 34, 195, 60, 34, 124, 251, 163, 60, 34, 249, 147, 60, 34, 240, 111,
+ 60, 34, 217, 92, 60, 34, 204, 251, 163, 60, 34, 234, 32, 60, 34, 224,
+ 224, 60, 34, 211, 202, 60, 34, 218, 243, 60, 34, 44, 204, 251, 163, 60,
+ 34, 241, 176, 245, 145, 60, 34, 216, 247, 60, 34, 247, 170, 60, 34, 221,
+ 179, 60, 34, 250, 10, 60, 34, 224, 182, 60, 34, 254, 215, 60, 34, 230,
+ 110, 60, 34, 245, 145, 60, 34, 245, 223, 60, 34, 221, 200, 60, 34, 242,
+ 174, 60, 34, 242, 175, 219, 81, 60, 34, 245, 40, 60, 34, 251, 248, 60,
+ 34, 211, 221, 60, 34, 250, 101, 60, 34, 222, 196, 60, 34, 235, 251, 60,
+ 34, 219, 79, 60, 34, 233, 96, 60, 34, 249, 156, 60, 34, 218, 237, 60, 34,
+ 230, 115, 60, 34, 222, 224, 60, 34, 211, 206, 60, 34, 226, 190, 60, 34,
+ 215, 97, 60, 34, 246, 80, 60, 34, 219, 251, 216, 145, 60, 34, 246, 118,
+ 250, 10, 60, 34, 199, 218, 108, 60, 34, 113, 242, 10, 60, 34, 220, 0, 60,
+ 34, 251, 169, 60, 34, 219, 65, 60, 34, 251, 137, 60, 34, 218, 138, 60,
+ 34, 241, 227, 60, 34, 242, 28, 60, 34, 247, 123, 60, 34, 242, 15, 60, 34,
+ 251, 154, 60, 34, 223, 147, 60, 34, 221, 187, 60, 34, 247, 199, 60, 34,
+ 253, 168, 60, 34, 218, 234, 60, 34, 228, 51, 60, 34, 218, 37, 60, 34,
+ 221, 211, 60, 34, 230, 128, 60, 34, 215, 235, 60, 34, 233, 122, 60, 34,
+ 218, 129, 60, 34, 248, 88, 60, 34, 212, 21, 60, 34, 247, 146, 228, 51,
+ 60, 34, 249, 215, 60, 34, 243, 222, 60, 34, 250, 21, 60, 34, 218, 142,
+ 60, 34, 212, 40, 60, 34, 244, 96, 60, 34, 250, 18, 60, 34, 244, 161, 60,
+ 34, 52, 211, 178, 60, 34, 163, 215, 236, 215, 188, 60, 34, 219, 89, 60,
+ 34, 244, 171, 60, 34, 249, 145, 60, 34, 247, 136, 60, 34, 224, 179, 60,
+ 34, 235, 137, 60, 34, 231, 67, 60, 34, 216, 88, 60, 34, 217, 245, 60, 34,
+ 232, 231, 60, 34, 214, 131, 60, 34, 244, 120, 60, 34, 251, 198, 64, 249,
+ 250, 60, 34, 219, 188, 60, 34, 246, 118, 216, 242, 60, 34, 211, 253, 60,
+ 34, 219, 103, 60, 34, 247, 187, 60, 34, 245, 15, 60, 34, 219, 5, 60, 34,
+ 74, 60, 34, 218, 131, 60, 34, 218, 248, 60, 34, 215, 255, 60, 34, 242,
+ 147, 60, 34, 250, 218, 60, 34, 218, 160, 60, 34, 252, 154, 60, 34, 223,
+ 31, 60, 34, 219, 167, 60, 34, 235, 130, 60, 34, 229, 89, 60, 34, 220, 57,
+ 60, 34, 244, 149, 60, 34, 226, 209, 60, 34, 254, 118, 60, 34, 225, 29,
+ 60, 34, 245, 227, 60, 34, 251, 132, 60, 34, 231, 86, 60, 34, 230, 183,
+ 60, 34, 220, 156, 60, 34, 253, 252, 60, 34, 230, 123, 60, 34, 216, 19,
+ 60, 34, 226, 165, 60, 34, 251, 201, 60, 34, 218, 127, 60, 34, 249, 225,
+ 60, 34, 242, 139, 60, 34, 216, 106, 60, 34, 235, 217, 60, 34, 251, 211,
+ 60, 34, 212, 58, 245, 145, 60, 34, 249, 249, 60, 34, 212, 8, 60, 34, 221,
+ 170, 60, 34, 240, 248, 60, 34, 219, 2, 60, 34, 214, 22, 60, 34, 252, 72,
+ 60, 34, 225, 73, 60, 34, 252, 174, 60, 34, 220, 52, 60, 34, 223, 110, 60,
+ 34, 222, 126, 60, 34, 244, 32, 60, 34, 251, 200, 60, 34, 250, 228, 60,
+ 34, 251, 226, 60, 34, 230, 125, 60, 34, 212, 57, 60, 34, 250, 27, 60, 34,
+ 211, 236, 60, 34, 247, 180, 60, 34, 213, 161, 60, 34, 242, 166, 60, 34,
+ 232, 137, 60, 34, 243, 88, 60, 34, 230, 118, 60, 34, 219, 94, 60, 34,
+ 219, 251, 217, 76, 251, 237, 60, 34, 223, 159, 60, 34, 251, 207, 60, 34,
+ 211, 197, 60, 34, 244, 190, 60, 34, 233, 52, 60, 34, 217, 56, 233, 52,
+ 60, 34, 233, 48, 60, 34, 219, 30, 60, 34, 233, 53, 60, 34, 211, 239, 60,
+ 34, 244, 46, 60, 34, 245, 217, 60, 34, 241, 235, 60, 34, 244, 0, 60, 34,
+ 240, 245, 60, 34, 251, 194, 60, 34, 217, 63, 60, 34, 242, 34, 60, 34,
+ 244, 113, 60, 34, 222, 28, 211, 236, 60, 34, 250, 220, 60, 34, 242, 222,
+ 60, 34, 244, 90, 60, 34, 251, 237, 60, 34, 222, 1, 60, 34, 248, 74, 60,
+ 34, 212, 2, 60, 34, 241, 210, 60, 34, 211, 41, 60, 34, 230, 192, 60, 34,
+ 251, 221, 60, 34, 245, 155, 60, 34, 243, 244, 60, 34, 215, 209, 60, 34,
+ 246, 82, 60, 34, 223, 141, 60, 34, 228, 53, 60, 34, 245, 41, 60, 34, 216,
+ 15, 60, 34, 246, 96, 60, 34, 215, 91, 60, 34, 244, 48, 109, 248, 37, 135,
+ 43, 216, 42, 222, 251, 109, 248, 37, 135, 77, 216, 42, 51, 109, 248, 37,
+ 135, 43, 216, 42, 230, 224, 22, 222, 251, 109, 248, 37, 135, 77, 216, 42,
+ 230, 224, 22, 51, 109, 248, 37, 135, 243, 229, 218, 10, 109, 248, 37,
+ 135, 218, 11, 243, 243, 48, 109, 248, 37, 135, 218, 11, 243, 243, 51,
+ 109, 248, 37, 135, 218, 11, 243, 243, 233, 46, 109, 248, 37, 135, 218,
+ 11, 243, 243, 214, 160, 233, 46, 109, 248, 37, 135, 218, 11, 243, 243,
+ 214, 160, 222, 251, 109, 248, 37, 135, 218, 11, 243, 243, 232, 108, 233,
+ 46, 109, 248, 37, 135, 226, 122, 109, 219, 18, 109, 249, 219, 109, 243,
+ 229, 218, 129, 247, 177, 78, 235, 131, 235, 236, 218, 159, 87, 109, 235,
+ 158, 78, 109, 249, 252, 78, 109, 54, 210, 86, 43, 254, 110, 127, 44, 254,
+ 110, 127, 43, 52, 254, 110, 127, 44, 52, 254, 110, 127, 43, 249, 161,
+ 127, 44, 249, 161, 127, 43, 71, 249, 161, 127, 44, 71, 249, 161, 127, 43,
+ 85, 233, 20, 127, 44, 85, 233, 20, 127, 224, 237, 78, 243, 32, 78, 43,
+ 216, 6, 220, 53, 127, 44, 216, 6, 220, 53, 127, 43, 71, 233, 20, 127, 44,
+ 71, 233, 20, 127, 43, 71, 216, 6, 220, 53, 127, 44, 71, 216, 6, 220, 53,
+ 127, 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 156, 223, 49, 52,
+ 224, 191, 223, 254, 78, 52, 224, 191, 223, 254, 78, 121, 52, 224, 191,
+ 223, 254, 78, 224, 237, 164, 244, 190, 242, 8, 227, 198, 110, 242, 8,
+ 227, 198, 105, 242, 8, 227, 198, 158, 242, 8, 227, 198, 161, 242, 8, 227,
+ 198, 189, 242, 8, 227, 198, 194, 242, 8, 227, 198, 198, 242, 8, 227, 198,
+ 195, 242, 8, 227, 198, 200, 109, 233, 3, 138, 78, 109, 222, 228, 138, 78,
+ 109, 248, 44, 138, 78, 109, 245, 128, 138, 78, 24, 219, 155, 59, 138, 78,
+ 24, 52, 59, 138, 78, 212, 32, 248, 156, 67, 234, 233, 223, 77, 78, 67,
+ 234, 233, 223, 77, 2, 213, 135, 219, 31, 78, 67, 234, 233, 223, 77, 164,
+ 214, 160, 242, 27, 67, 234, 233, 223, 77, 2, 213, 135, 219, 31, 164, 214,
+ 160, 242, 27, 67, 234, 233, 223, 77, 164, 232, 108, 242, 27, 37, 224,
+ 237, 78, 109, 217, 3, 232, 214, 244, 146, 220, 138, 87, 242, 8, 227, 198,
+ 216, 247, 242, 8, 227, 198, 215, 73, 242, 8, 227, 198, 216, 162, 67, 109,
+ 235, 158, 78, 231, 140, 78, 225, 255, 254, 140, 78, 109, 45, 235, 238,
+ 109, 163, 244, 106, 219, 18, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, 73,
+ 141, 1, 73, 141, 1, 4, 70, 141, 1, 70, 141, 1, 4, 75, 141, 1, 75, 141, 1,
+ 4, 76, 141, 1, 76, 141, 1, 176, 141, 1, 243, 135, 141, 1, 234, 92, 141,
+ 1, 242, 214, 141, 1, 233, 217, 141, 1, 242, 113, 141, 1, 234, 182, 141,
+ 1, 243, 62, 141, 1, 234, 28, 141, 1, 242, 174, 141, 1, 206, 141, 1, 210,
+ 116, 141, 1, 219, 191, 141, 1, 210, 44, 141, 1, 218, 83, 141, 1, 210, 13,
+ 141, 1, 221, 181, 141, 1, 210, 94, 141, 1, 219, 58, 141, 1, 210, 23, 141,
+ 1, 217, 105, 141, 1, 248, 221, 141, 1, 216, 117, 141, 1, 248, 3, 141, 1,
+ 4, 215, 118, 141, 1, 215, 118, 141, 1, 246, 78, 141, 1, 217, 22, 141, 1,
+ 248, 90, 141, 1, 111, 141, 1, 247, 145, 141, 1, 197, 141, 1, 228, 233,
+ 141, 1, 227, 237, 141, 1, 229, 107, 141, 1, 228, 74, 141, 1, 162, 141, 1,
+ 252, 191, 141, 1, 190, 141, 1, 241, 180, 141, 1, 252, 6, 141, 1, 225,
+ 108, 141, 1, 240, 222, 141, 1, 251, 125, 141, 1, 224, 150, 141, 1, 241,
+ 238, 141, 1, 252, 75, 141, 1, 225, 221, 141, 1, 241, 68, 141, 1, 251,
+ 205, 141, 1, 225, 16, 141, 1, 184, 141, 1, 230, 230, 141, 1, 230, 102,
+ 141, 1, 231, 91, 141, 1, 230, 161, 141, 1, 4, 191, 141, 1, 191, 141, 1,
+ 4, 210, 212, 141, 1, 210, 212, 141, 1, 4, 210, 244, 141, 1, 210, 244,
+ 141, 1, 205, 141, 1, 223, 35, 141, 1, 222, 140, 141, 1, 223, 128, 141, 1,
+ 222, 211, 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, 211, 250, 141, 1,
+ 212, 22, 141, 1, 211, 227, 141, 1, 230, 25, 141, 1, 212, 116, 141, 1, 4,
+ 176, 141, 1, 4, 234, 182, 38, 234, 201, 213, 135, 219, 31, 78, 38, 234,
+ 201, 220, 155, 219, 31, 78, 234, 201, 213, 135, 219, 31, 78, 234, 201,
+ 220, 155, 219, 31, 78, 141, 235, 158, 78, 141, 213, 135, 235, 158, 78,
+ 141, 247, 221, 210, 225, 234, 201, 52, 240, 168, 56, 1, 4, 61, 56, 1, 61,
+ 56, 1, 4, 73, 56, 1, 73, 56, 1, 4, 70, 56, 1, 70, 56, 1, 4, 75, 56, 1,
+ 75, 56, 1, 4, 76, 56, 1, 76, 56, 1, 176, 56, 1, 243, 135, 56, 1, 234, 92,
+ 56, 1, 242, 214, 56, 1, 233, 217, 56, 1, 242, 113, 56, 1, 234, 182, 56,
+ 1, 243, 62, 56, 1, 234, 28, 56, 1, 242, 174, 56, 1, 206, 56, 1, 210, 116,
+ 56, 1, 219, 191, 56, 1, 210, 44, 56, 1, 218, 83, 56, 1, 210, 13, 56, 1,
+ 221, 181, 56, 1, 210, 94, 56, 1, 219, 58, 56, 1, 210, 23, 56, 1, 217,
+ 105, 56, 1, 248, 221, 56, 1, 216, 117, 56, 1, 248, 3, 56, 1, 4, 215, 118,
+ 56, 1, 215, 118, 56, 1, 246, 78, 56, 1, 217, 22, 56, 1, 248, 90, 56, 1,
+ 111, 56, 1, 247, 145, 56, 1, 197, 56, 1, 228, 233, 56, 1, 227, 237, 56,
+ 1, 229, 107, 56, 1, 228, 74, 56, 1, 162, 56, 1, 252, 191, 56, 1, 190, 56,
+ 1, 241, 180, 56, 1, 252, 6, 56, 1, 225, 108, 56, 1, 240, 222, 56, 1, 251,
+ 125, 56, 1, 224, 150, 56, 1, 241, 238, 56, 1, 252, 75, 56, 1, 225, 221,
+ 56, 1, 241, 68, 56, 1, 251, 205, 56, 1, 225, 16, 56, 1, 184, 56, 1, 230,
+ 230, 56, 1, 230, 102, 56, 1, 231, 91, 56, 1, 230, 161, 56, 1, 4, 191, 56,
+ 1, 191, 56, 1, 4, 210, 212, 56, 1, 210, 212, 56, 1, 4, 210, 244, 56, 1,
+ 210, 244, 56, 1, 205, 56, 1, 223, 35, 56, 1, 222, 140, 56, 1, 223, 128,
+ 56, 1, 222, 211, 56, 1, 4, 212, 65, 56, 1, 212, 65, 56, 1, 211, 250, 56,
+ 1, 212, 22, 56, 1, 211, 227, 56, 1, 230, 25, 56, 1, 212, 116, 56, 1, 4,
+ 176, 56, 1, 4, 234, 182, 56, 1, 214, 27, 56, 1, 213, 176, 56, 1, 213,
+ 255, 56, 1, 213, 138, 56, 230, 224, 247, 120, 234, 201, 224, 173, 219,
+ 31, 78, 56, 235, 158, 78, 56, 213, 135, 235, 158, 78, 56, 247, 221, 233,
+ 255, 251, 184, 1, 253, 158, 251, 184, 1, 226, 105, 251, 184, 1, 193, 251,
+ 184, 1, 245, 6, 251, 184, 1, 249, 60, 251, 184, 1, 217, 152, 251, 184, 1,
+ 230, 25, 251, 184, 1, 156, 251, 184, 1, 243, 202, 251, 184, 1, 235, 23,
+ 251, 184, 1, 242, 60, 251, 184, 1, 235, 144, 251, 184, 1, 224, 96, 251,
+ 184, 1, 211, 178, 251, 184, 1, 210, 83, 251, 184, 1, 250, 158, 251, 184,
+ 1, 220, 104, 251, 184, 1, 153, 251, 184, 1, 210, 159, 251, 184, 1, 251,
+ 66, 251, 184, 1, 222, 91, 251, 184, 1, 61, 251, 184, 1, 76, 251, 184, 1,
+ 75, 251, 184, 1, 245, 197, 251, 184, 1, 254, 201, 251, 184, 1, 245, 195,
+ 251, 184, 1, 253, 192, 251, 184, 1, 226, 134, 251, 184, 1, 254, 123, 251,
+ 184, 1, 245, 150, 251, 184, 1, 254, 115, 251, 184, 1, 245, 138, 251, 184,
+ 1, 245, 92, 251, 184, 1, 73, 251, 184, 1, 70, 251, 184, 1, 235, 156, 251,
+ 184, 1, 214, 105, 251, 184, 1, 229, 79, 251, 184, 1, 242, 178, 251, 184,
+ 1, 236, 34, 24, 1, 234, 58, 24, 1, 218, 215, 24, 1, 234, 51, 24, 1, 228,
+ 226, 24, 1, 228, 224, 24, 1, 228, 223, 24, 1, 216, 101, 24, 1, 218, 204,
+ 24, 1, 223, 26, 24, 1, 223, 21, 24, 1, 223, 18, 24, 1, 223, 11, 24, 1,
+ 223, 6, 24, 1, 223, 1, 24, 1, 223, 12, 24, 1, 223, 24, 24, 1, 230, 217,
+ 24, 1, 225, 95, 24, 1, 218, 212, 24, 1, 225, 84, 24, 1, 219, 148, 24, 1,
+ 218, 209, 24, 1, 236, 56, 24, 1, 250, 46, 24, 1, 218, 219, 24, 1, 250,
+ 106, 24, 1, 234, 110, 24, 1, 216, 173, 24, 1, 225, 131, 24, 1, 241, 172,
+ 24, 1, 61, 24, 1, 254, 243, 24, 1, 191, 24, 1, 211, 92, 24, 1, 245, 117,
+ 24, 1, 75, 24, 1, 211, 36, 24, 1, 211, 47, 24, 1, 76, 24, 1, 212, 65, 24,
+ 1, 212, 62, 24, 1, 226, 234, 24, 1, 210, 244, 24, 1, 70, 24, 1, 212, 11,
+ 24, 1, 212, 22, 24, 1, 211, 250, 24, 1, 210, 212, 24, 1, 245, 55, 24, 1,
+ 211, 8, 24, 1, 73, 24, 244, 103, 24, 1, 218, 213, 24, 1, 228, 216, 24, 1,
+ 228, 218, 24, 1, 228, 221, 24, 1, 223, 19, 24, 1, 223, 0, 24, 1, 223, 8,
+ 24, 1, 223, 13, 24, 1, 222, 254, 24, 1, 230, 210, 24, 1, 230, 207, 24, 1,
+ 230, 211, 24, 1, 234, 221, 24, 1, 225, 90, 24, 1, 225, 76, 24, 1, 225,
+ 82, 24, 1, 225, 79, 24, 1, 225, 93, 24, 1, 225, 77, 24, 1, 234, 219, 24,
+ 1, 234, 217, 24, 1, 219, 141, 24, 1, 219, 139, 24, 1, 219, 131, 24, 1,
+ 219, 136, 24, 1, 219, 146, 24, 1, 226, 32, 24, 1, 218, 216, 24, 1, 211,
+ 26, 24, 1, 211, 22, 24, 1, 211, 23, 24, 1, 234, 220, 24, 1, 218, 217, 24,
+ 1, 211, 32, 24, 1, 210, 238, 24, 1, 210, 237, 24, 1, 210, 240, 24, 1,
+ 210, 203, 24, 1, 210, 204, 24, 1, 210, 207, 24, 1, 254, 34, 24, 1, 254,
+ 28, 109, 254, 99, 232, 203, 78, 109, 254, 99, 223, 50, 78, 109, 254, 99,
+ 123, 78, 109, 254, 99, 113, 78, 109, 254, 99, 134, 78, 109, 254, 99, 244,
+ 11, 78, 109, 254, 99, 216, 14, 78, 109, 254, 99, 230, 224, 78, 109, 254,
+ 99, 251, 175, 78, 109, 254, 99, 244, 92, 78, 109, 254, 99, 221, 176, 78,
+ 109, 254, 99, 216, 169, 78, 109, 254, 99, 244, 4, 78, 109, 254, 99, 241,
+ 224, 78, 109, 254, 99, 245, 224, 78, 109, 254, 99, 231, 186, 78, 251,
+ 184, 1, 251, 125, 251, 184, 1, 210, 44, 251, 184, 1, 235, 108, 251, 184,
+ 1, 242, 113, 251, 184, 1, 245, 209, 251, 184, 1, 245, 135, 251, 184, 1,
+ 226, 183, 251, 184, 1, 226, 187, 251, 184, 1, 235, 179, 251, 184, 1, 254,
+ 101, 251, 184, 1, 235, 224, 251, 184, 1, 214, 168, 251, 184, 1, 236, 16,
+ 251, 184, 1, 229, 57, 251, 184, 1, 254, 195, 251, 184, 1, 253, 187, 251,
+ 184, 1, 254, 136, 251, 184, 1, 226, 204, 251, 184, 1, 226, 189, 251, 184,
+ 1, 235, 221, 251, 184, 40, 1, 226, 105, 251, 184, 40, 1, 217, 152, 251,
+ 184, 40, 1, 235, 23, 251, 184, 40, 1, 242, 60, 251, 184, 1, 242, 250,
+ 251, 184, 1, 232, 255, 251, 184, 1, 209, 250, 9, 218, 103, 217, 152, 9,
+ 218, 103, 212, 4, 9, 218, 103, 211, 158, 9, 218, 103, 251, 79, 9, 218,
+ 103, 217, 254, 9, 218, 103, 240, 158, 9, 218, 103, 240, 162, 9, 218, 103,
+ 240, 231, 9, 218, 103, 240, 159, 9, 218, 103, 217, 155, 9, 218, 103, 240,
+ 161, 9, 218, 103, 240, 157, 9, 218, 103, 240, 229, 9, 218, 103, 240, 160,
+ 9, 218, 103, 240, 156, 9, 218, 103, 230, 25, 9, 218, 103, 242, 60, 9,
+ 218, 103, 222, 91, 9, 218, 103, 226, 105, 9, 218, 103, 219, 21, 9, 218,
+ 103, 249, 60, 9, 218, 103, 240, 163, 9, 218, 103, 241, 190, 9, 218, 103,
+ 217, 164, 9, 218, 103, 217, 233, 9, 218, 103, 218, 168, 9, 218, 103, 220,
+ 110, 9, 218, 103, 225, 224, 9, 218, 103, 224, 98, 9, 218, 103, 216, 43,
+ 9, 218, 103, 217, 154, 9, 218, 103, 217, 244, 9, 218, 103, 240, 170, 9,
+ 218, 103, 240, 155, 9, 218, 103, 225, 149, 9, 218, 103, 224, 96, 56, 1,
+ 4, 233, 217, 56, 1, 4, 219, 191, 56, 1, 4, 218, 83, 56, 1, 4, 111, 56, 1,
+ 4, 227, 237, 56, 1, 4, 162, 56, 1, 4, 241, 180, 56, 1, 4, 240, 222, 56,
+ 1, 4, 241, 238, 56, 1, 4, 241, 68, 56, 1, 4, 230, 102, 56, 1, 4, 205, 56,
+ 1, 4, 223, 35, 56, 1, 4, 222, 140, 56, 1, 4, 223, 128, 56, 1, 4, 222,
+ 211, 88, 24, 234, 58, 88, 24, 228, 226, 88, 24, 216, 101, 88, 24, 223,
+ 26, 88, 24, 230, 217, 88, 24, 225, 95, 88, 24, 219, 148, 88, 24, 236, 56,
+ 88, 24, 250, 46, 88, 24, 250, 106, 88, 24, 234, 110, 88, 24, 216, 173,
+ 88, 24, 225, 131, 88, 24, 241, 172, 88, 24, 234, 59, 61, 88, 24, 228,
+ 227, 61, 88, 24, 216, 102, 61, 88, 24, 223, 27, 61, 88, 24, 230, 218, 61,
+ 88, 24, 225, 96, 61, 88, 24, 219, 149, 61, 88, 24, 236, 57, 61, 88, 24,
+ 250, 47, 61, 88, 24, 250, 107, 61, 88, 24, 234, 111, 61, 88, 24, 216,
+ 174, 61, 88, 24, 225, 132, 61, 88, 24, 241, 173, 61, 88, 24, 250, 47, 70,
+ 88, 234, 3, 135, 226, 217, 88, 234, 3, 135, 144, 240, 222, 88, 154, 110,
+ 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, 154, 189, 88, 154, 194, 88,
+ 154, 198, 88, 154, 195, 88, 154, 200, 88, 154, 216, 247, 88, 154, 230,
+ 128, 88, 154, 244, 96, 88, 154, 212, 40, 88, 154, 211, 214, 88, 154, 231,
+ 39, 88, 154, 245, 223, 88, 154, 218, 37, 88, 154, 218, 132, 88, 154, 241,
+ 244, 88, 154, 219, 54, 88, 154, 229, 204, 88, 154, 219, 4, 88, 154, 244,
+ 102, 88, 154, 249, 200, 88, 154, 233, 125, 88, 154, 223, 71, 88, 154,
+ 251, 15, 88, 154, 218, 87, 88, 154, 218, 20, 88, 154, 245, 127, 88, 154,
+ 223, 63, 88, 154, 254, 150, 88, 154, 244, 128, 88, 154, 223, 61, 88, 154,
+ 220, 156, 88, 154, 223, 127, 37, 154, 224, 12, 37, 154, 234, 80, 37, 154,
+ 221, 198, 37, 154, 233, 255, 37, 54, 216, 248, 226, 197, 85, 218, 234,
+ 37, 54, 215, 74, 226, 197, 85, 218, 234, 37, 54, 216, 163, 226, 197, 85,
+ 218, 234, 37, 54, 244, 16, 226, 197, 85, 218, 234, 37, 54, 244, 115, 226,
+ 197, 85, 218, 234, 37, 54, 219, 112, 226, 197, 85, 218, 234, 37, 54, 220,
+ 117, 226, 197, 85, 218, 234, 37, 54, 245, 185, 226, 197, 85, 218, 234,
+ 225, 251, 50, 37, 54, 215, 74, 110, 37, 54, 215, 74, 105, 37, 54, 215,
+ 74, 158, 37, 54, 215, 74, 161, 37, 54, 215, 74, 189, 37, 54, 215, 74,
+ 194, 37, 54, 215, 74, 198, 37, 54, 215, 74, 195, 37, 54, 215, 74, 200,
+ 37, 54, 216, 162, 37, 54, 216, 163, 110, 37, 54, 216, 163, 105, 37, 54,
+ 216, 163, 158, 37, 54, 216, 163, 161, 37, 54, 216, 163, 189, 37, 24, 234,
+ 58, 37, 24, 228, 226, 37, 24, 216, 101, 37, 24, 223, 26, 37, 24, 230,
+ 217, 37, 24, 225, 95, 37, 24, 219, 148, 37, 24, 236, 56, 37, 24, 250, 46,
+ 37, 24, 250, 106, 37, 24, 234, 110, 37, 24, 216, 173, 37, 24, 225, 131,
+ 37, 24, 241, 172, 37, 24, 234, 59, 61, 37, 24, 228, 227, 61, 37, 24, 216,
+ 102, 61, 37, 24, 223, 27, 61, 37, 24, 230, 218, 61, 37, 24, 225, 96, 61,
+ 37, 24, 219, 149, 61, 37, 24, 236, 57, 61, 37, 24, 250, 47, 61, 37, 24,
+ 250, 107, 61, 37, 24, 234, 111, 61, 37, 24, 216, 174, 61, 37, 24, 225,
+ 132, 61, 37, 24, 241, 173, 61, 37, 234, 3, 135, 250, 148, 37, 234, 3,
+ 135, 235, 47, 37, 24, 236, 57, 70, 234, 3, 218, 159, 87, 37, 154, 110,
+ 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, 154, 189, 37, 154, 194, 37,
+ 154, 198, 37, 154, 195, 37, 154, 200, 37, 154, 216, 247, 37, 154, 230,
+ 128, 37, 154, 244, 96, 37, 154, 212, 40, 37, 154, 211, 214, 37, 154, 231,
+ 39, 37, 154, 245, 223, 37, 154, 218, 37, 37, 154, 218, 132, 37, 154, 241,
+ 244, 37, 154, 219, 54, 37, 154, 229, 204, 37, 154, 219, 4, 37, 154, 244,
+ 102, 37, 154, 249, 200, 37, 154, 233, 125, 37, 154, 221, 174, 37, 154,
+ 231, 189, 37, 154, 244, 137, 37, 154, 218, 49, 37, 154, 245, 34, 37, 154,
+ 224, 187, 37, 154, 253, 196, 37, 154, 235, 159, 37, 154, 223, 61, 37,
+ 154, 249, 164, 37, 154, 249, 155, 37, 154, 241, 165, 37, 154, 250, 174,
+ 37, 154, 232, 110, 37, 154, 233, 46, 37, 154, 222, 251, 37, 154, 231, 83,
+ 37, 154, 223, 87, 37, 154, 218, 87, 37, 154, 218, 20, 37, 154, 245, 127,
+ 37, 154, 223, 63, 37, 154, 254, 150, 37, 154, 228, 212, 37, 54, 216, 163,
+ 194, 37, 54, 216, 163, 198, 37, 54, 216, 163, 195, 37, 54, 216, 163, 200,
+ 37, 54, 244, 15, 37, 54, 244, 16, 110, 37, 54, 244, 16, 105, 37, 54, 244,
+ 16, 158, 37, 54, 244, 16, 161, 37, 54, 244, 16, 189, 37, 54, 244, 16,
+ 194, 37, 54, 244, 16, 198, 37, 54, 244, 16, 195, 37, 54, 244, 16, 200,
+ 37, 54, 244, 114, 109, 217, 3, 16, 31, 235, 133, 109, 217, 3, 16, 31,
+ 244, 148, 109, 217, 3, 16, 31, 231, 160, 109, 217, 3, 16, 31, 254, 47,
+ 109, 217, 3, 16, 31, 231, 132, 109, 217, 3, 16, 31, 235, 45, 109, 217, 3,
+ 16, 31, 235, 46, 109, 217, 3, 16, 31, 253, 188, 109, 217, 3, 16, 31, 220,
+ 136, 109, 217, 3, 16, 31, 226, 239, 109, 217, 3, 16, 31, 228, 40, 109,
+ 217, 3, 16, 31, 248, 85, 42, 241, 190, 42, 245, 88, 42, 245, 43, 232,
+ 219, 232, 240, 50, 37, 56, 61, 37, 56, 73, 37, 56, 70, 37, 56, 75, 37,
+ 56, 76, 37, 56, 176, 37, 56, 234, 92, 37, 56, 233, 217, 37, 56, 234, 182,
+ 37, 56, 234, 28, 37, 56, 206, 37, 56, 219, 191, 37, 56, 218, 83, 37, 56,
+ 221, 181, 37, 56, 219, 58, 37, 56, 217, 105, 37, 56, 216, 117, 37, 56,
+ 215, 118, 37, 56, 217, 22, 37, 56, 111, 37, 56, 197, 37, 56, 228, 233,
+ 37, 56, 227, 237, 37, 56, 229, 107, 37, 56, 228, 74, 37, 56, 162, 37, 56,
+ 241, 180, 37, 56, 240, 222, 37, 56, 241, 238, 37, 56, 241, 68, 37, 56,
+ 184, 37, 56, 230, 230, 37, 56, 230, 102, 37, 56, 231, 91, 37, 56, 230,
+ 161, 37, 56, 191, 37, 56, 210, 212, 37, 56, 210, 244, 37, 56, 205, 37,
+ 56, 223, 35, 37, 56, 222, 140, 37, 56, 223, 128, 37, 56, 222, 211, 37,
+ 56, 212, 65, 37, 56, 211, 250, 37, 56, 212, 22, 37, 56, 211, 227, 42,
+ 254, 71, 42, 253, 239, 42, 254, 95, 42, 255, 31, 42, 235, 226, 42, 235,
+ 196, 42, 214, 166, 42, 245, 66, 42, 245, 206, 42, 226, 186, 42, 226, 180,
+ 42, 234, 245, 42, 234, 214, 42, 234, 211, 42, 243, 92, 42, 243, 101, 42,
+ 242, 204, 42, 242, 200, 42, 233, 150, 42, 242, 193, 42, 234, 72, 42, 234,
+ 71, 42, 234, 70, 42, 234, 69, 42, 242, 86, 42, 242, 85, 42, 233, 193, 42,
+ 233, 195, 42, 234, 178, 42, 234, 1, 42, 234, 8, 42, 222, 16, 42, 221,
+ 237, 42, 219, 129, 42, 220, 141, 42, 220, 140, 42, 248, 218, 42, 248, 36,
+ 42, 247, 121, 42, 216, 32, 42, 229, 200, 42, 228, 41, 42, 242, 32, 42,
+ 226, 84, 42, 226, 83, 42, 252, 188, 42, 225, 105, 42, 225, 69, 42, 225,
+ 70, 42, 251, 234, 42, 240, 221, 42, 240, 217, 42, 251, 91, 42, 240, 204,
+ 42, 241, 215, 42, 225, 159, 42, 225, 194, 42, 241, 198, 42, 225, 191, 42,
+ 225, 207, 42, 252, 61, 42, 225, 6, 42, 251, 180, 42, 241, 56, 42, 224,
+ 250, 42, 241, 48, 42, 241, 50, 42, 231, 201, 42, 231, 197, 42, 231, 206,
+ 42, 231, 150, 42, 231, 175, 42, 230, 197, 42, 230, 176, 42, 230, 175, 42,
+ 231, 74, 42, 231, 71, 42, 231, 75, 42, 211, 102, 42, 211, 100, 42, 210,
+ 201, 42, 222, 226, 42, 222, 230, 42, 222, 117, 42, 222, 111, 42, 223, 85,
+ 42, 223, 82, 42, 212, 38, 109, 217, 3, 16, 31, 240, 239, 210, 86, 109,
+ 217, 3, 16, 31, 240, 239, 110, 109, 217, 3, 16, 31, 240, 239, 105, 109,
+ 217, 3, 16, 31, 240, 239, 158, 109, 217, 3, 16, 31, 240, 239, 161, 109,
+ 217, 3, 16, 31, 240, 239, 189, 109, 217, 3, 16, 31, 240, 239, 194, 109,
+ 217, 3, 16, 31, 240, 239, 198, 109, 217, 3, 16, 31, 240, 239, 195, 109,
+ 217, 3, 16, 31, 240, 239, 200, 109, 217, 3, 16, 31, 240, 239, 216, 247,
+ 109, 217, 3, 16, 31, 240, 239, 245, 167, 109, 217, 3, 16, 31, 240, 239,
+ 215, 76, 109, 217, 3, 16, 31, 240, 239, 216, 164, 109, 217, 3, 16, 31,
+ 240, 239, 244, 5, 109, 217, 3, 16, 31, 240, 239, 244, 118, 109, 217, 3,
+ 16, 31, 240, 239, 219, 119, 109, 217, 3, 16, 31, 240, 239, 220, 119, 109,
+ 217, 3, 16, 31, 240, 239, 245, 190, 109, 217, 3, 16, 31, 240, 239, 228,
+ 197, 109, 217, 3, 16, 31, 240, 239, 215, 73, 109, 217, 3, 16, 31, 240,
+ 239, 215, 67, 109, 217, 3, 16, 31, 240, 239, 215, 63, 109, 217, 3, 16,
+ 31, 240, 239, 215, 64, 109, 217, 3, 16, 31, 240, 239, 215, 69, 42, 240,
+ 230, 42, 248, 221, 42, 253, 192, 42, 130, 42, 226, 125, 42, 225, 225, 42,
+ 247, 147, 42, 247, 148, 218, 233, 42, 247, 148, 249, 108, 42, 235, 156,
+ 42, 245, 91, 229, 205, 241, 216, 42, 245, 91, 229, 205, 217, 174, 42,
+ 245, 91, 229, 205, 217, 74, 42, 245, 91, 229, 205, 231, 70, 42, 249, 157,
+ 42, 226, 90, 254, 125, 42, 197, 42, 230, 103, 61, 42, 184, 42, 176, 42,
+ 234, 185, 42, 231, 129, 42, 243, 80, 42, 251, 18, 42, 234, 184, 42, 225,
+ 150, 42, 229, 81, 42, 230, 103, 245, 6, 42, 230, 103, 243, 202, 42, 231,
+ 15, 42, 234, 134, 42, 240, 163, 42, 234, 94, 42, 230, 232, 42, 242, 216,
+ 42, 216, 119, 42, 230, 103, 156, 42, 230, 169, 42, 247, 157, 42, 234, 40,
+ 42, 244, 45, 42, 228, 112, 42, 230, 103, 193, 42, 230, 166, 42, 249, 239,
+ 42, 234, 34, 42, 230, 167, 218, 233, 42, 249, 240, 218, 233, 42, 232, 50,
+ 218, 233, 42, 234, 35, 218, 233, 42, 230, 167, 249, 108, 42, 249, 240,
+ 249, 108, 42, 232, 50, 249, 108, 42, 234, 35, 249, 108, 42, 232, 50, 117,
+ 222, 91, 42, 232, 50, 117, 222, 92, 218, 233, 42, 190, 42, 233, 251, 42,
+ 230, 105, 42, 242, 151, 42, 223, 176, 42, 223, 177, 117, 222, 91, 42,
+ 223, 177, 117, 222, 92, 218, 233, 42, 224, 162, 42, 228, 13, 42, 230,
+ 103, 222, 91, 42, 230, 104, 42, 224, 116, 42, 227, 176, 42, 230, 103,
+ 214, 105, 42, 230, 49, 42, 233, 185, 42, 230, 50, 231, 74, 42, 224, 115,
+ 42, 227, 175, 42, 230, 103, 212, 98, 42, 230, 43, 42, 233, 183, 42, 230,
+ 44, 231, 74, 42, 235, 24, 226, 220, 42, 232, 50, 226, 220, 42, 254, 136,
+ 42, 251, 160, 42, 250, 214, 42, 250, 191, 42, 251, 67, 117, 234, 134, 42,
+ 249, 238, 42, 248, 142, 42, 242, 72, 42, 162, 42, 240, 231, 42, 235, 255,
+ 42, 234, 47, 42, 234, 35, 250, 250, 42, 233, 219, 42, 232, 159, 42, 232,
+ 158, 42, 232, 147, 42, 232, 63, 42, 231, 130, 219, 79, 42, 230, 196, 42,
+ 230, 152, 42, 225, 148, 42, 225, 19, 42, 224, 219, 42, 224, 217, 42, 218,
+ 227, 42, 218, 2, 42, 212, 24, 42, 214, 106, 117, 193, 42, 115, 117, 193,
+ 109, 217, 3, 16, 31, 248, 146, 110, 109, 217, 3, 16, 31, 248, 146, 105,
+ 109, 217, 3, 16, 31, 248, 146, 158, 109, 217, 3, 16, 31, 248, 146, 161,
+ 109, 217, 3, 16, 31, 248, 146, 189, 109, 217, 3, 16, 31, 248, 146, 194,
+ 109, 217, 3, 16, 31, 248, 146, 198, 109, 217, 3, 16, 31, 248, 146, 195,
+ 109, 217, 3, 16, 31, 248, 146, 200, 109, 217, 3, 16, 31, 248, 146, 216,
+ 247, 109, 217, 3, 16, 31, 248, 146, 245, 167, 109, 217, 3, 16, 31, 248,
+ 146, 215, 76, 109, 217, 3, 16, 31, 248, 146, 216, 164, 109, 217, 3, 16,
+ 31, 248, 146, 244, 5, 109, 217, 3, 16, 31, 248, 146, 244, 118, 109, 217,
+ 3, 16, 31, 248, 146, 219, 119, 109, 217, 3, 16, 31, 248, 146, 220, 119,
+ 109, 217, 3, 16, 31, 248, 146, 245, 190, 109, 217, 3, 16, 31, 248, 146,
+ 228, 197, 109, 217, 3, 16, 31, 248, 146, 215, 73, 109, 217, 3, 16, 31,
+ 248, 146, 215, 67, 109, 217, 3, 16, 31, 248, 146, 215, 63, 109, 217, 3,
+ 16, 31, 248, 146, 215, 64, 109, 217, 3, 16, 31, 248, 146, 215, 69, 109,
+ 217, 3, 16, 31, 248, 146, 215, 70, 109, 217, 3, 16, 31, 248, 146, 215,
+ 65, 109, 217, 3, 16, 31, 248, 146, 215, 66, 109, 217, 3, 16, 31, 248,
+ 146, 215, 72, 109, 217, 3, 16, 31, 248, 146, 215, 68, 109, 217, 3, 16,
+ 31, 248, 146, 216, 162, 109, 217, 3, 16, 31, 248, 146, 216, 161, 42, 243,
+ 118, 241, 192, 31, 216, 196, 249, 140, 241, 223, 241, 192, 31, 216, 196,
+ 223, 122, 245, 223, 241, 192, 31, 247, 231, 253, 207, 216, 196, 252, 56,
+ 241, 192, 31, 210, 223, 244, 38, 241, 192, 31, 212, 59, 241, 192, 31,
+ 249, 203, 241, 192, 31, 216, 196, 254, 3, 241, 192, 31, 241, 60, 216, 38,
+ 241, 192, 31, 4, 217, 61, 241, 192, 31, 215, 237, 241, 192, 31, 225, 219,
+ 241, 192, 31, 218, 158, 241, 192, 31, 244, 139, 241, 192, 31, 242, 132,
+ 224, 240, 241, 192, 31, 230, 155, 241, 192, 31, 245, 126, 241, 192, 31,
+ 244, 39, 241, 192, 31, 211, 207, 226, 197, 216, 196, 248, 86, 241, 192,
+ 31, 254, 51, 241, 192, 31, 249, 185, 241, 192, 31, 251, 227, 216, 138,
+ 241, 192, 31, 242, 149, 241, 192, 31, 218, 245, 254, 70, 241, 192, 31,
+ 223, 53, 241, 192, 31, 235, 220, 241, 192, 31, 242, 132, 217, 61, 241,
+ 192, 31, 230, 111, 249, 159, 241, 192, 31, 242, 132, 224, 197, 241, 192,
+ 31, 216, 196, 255, 18, 212, 40, 241, 192, 31, 216, 196, 250, 8, 244, 96,
+ 241, 192, 31, 235, 233, 241, 192, 31, 246, 57, 241, 192, 31, 223, 56,
+ 241, 192, 31, 242, 132, 224, 224, 241, 192, 31, 224, 177, 241, 192, 31,
+ 248, 161, 64, 216, 196, 232, 230, 241, 192, 31, 216, 196, 244, 174, 241,
+ 192, 31, 226, 163, 241, 192, 31, 226, 244, 241, 192, 31, 248, 59, 241,
+ 192, 31, 248, 79, 241, 192, 31, 235, 247, 241, 192, 31, 251, 149, 241,
+ 192, 31, 249, 221, 216, 42, 231, 76, 241, 192, 31, 243, 87, 216, 38, 241,
+ 192, 31, 224, 125, 214, 154, 241, 192, 31, 226, 162, 241, 192, 31, 216,
+ 196, 212, 13, 241, 192, 31, 223, 45, 241, 192, 31, 216, 196, 250, 220,
+ 241, 192, 31, 216, 196, 253, 255, 216, 133, 241, 192, 31, 216, 196, 234,
+ 179, 218, 134, 230, 115, 241, 192, 31, 248, 32, 241, 192, 31, 216, 196,
+ 231, 152, 231, 202, 241, 192, 31, 255, 19, 241, 192, 31, 216, 196, 212,
+ 54, 241, 192, 31, 216, 196, 243, 47, 211, 239, 241, 192, 31, 216, 196,
+ 235, 52, 233, 107, 241, 192, 31, 247, 184, 241, 192, 31, 232, 220, 241,
+ 192, 31, 235, 223, 215, 187, 241, 192, 31, 4, 224, 197, 241, 192, 31,
+ 254, 217, 249, 212, 241, 192, 31, 252, 59, 249, 212, 8, 3, 235, 160, 8,
+ 3, 235, 153, 8, 3, 73, 8, 3, 235, 182, 8, 3, 236, 58, 8, 3, 236, 41, 8,
+ 3, 236, 60, 8, 3, 236, 59, 8, 3, 253, 206, 8, 3, 253, 169, 8, 3, 61, 8,
+ 3, 254, 72, 8, 3, 214, 164, 8, 3, 214, 167, 8, 3, 214, 165, 8, 3, 226,
+ 140, 8, 3, 226, 114, 8, 3, 76, 8, 3, 226, 175, 8, 3, 245, 35, 8, 3, 75,
+ 8, 3, 211, 195, 8, 3, 251, 228, 8, 3, 251, 225, 8, 3, 252, 6, 8, 3, 251,
+ 238, 8, 3, 251, 251, 8, 3, 251, 250, 8, 3, 251, 253, 8, 3, 251, 252, 8,
+ 3, 252, 121, 8, 3, 252, 113, 8, 3, 252, 191, 8, 3, 252, 142, 8, 3, 251,
+ 101, 8, 3, 251, 105, 8, 3, 251, 102, 8, 3, 251, 179, 8, 3, 251, 163, 8,
+ 3, 251, 205, 8, 3, 251, 185, 8, 3, 252, 21, 8, 3, 252, 75, 8, 3, 252, 33,
+ 8, 3, 251, 87, 8, 3, 251, 84, 8, 3, 251, 125, 8, 3, 251, 100, 8, 3, 251,
+ 94, 8, 3, 251, 98, 8, 3, 251, 72, 8, 3, 251, 70, 8, 3, 251, 77, 8, 3,
+ 251, 75, 8, 3, 251, 73, 8, 3, 251, 74, 8, 3, 225, 49, 8, 3, 225, 45, 8,
+ 3, 225, 108, 8, 3, 225, 59, 8, 3, 225, 75, 8, 3, 225, 102, 8, 3, 225, 98,
+ 8, 3, 225, 240, 8, 3, 225, 230, 8, 3, 190, 8, 3, 226, 21, 8, 3, 224, 135,
+ 8, 3, 224, 137, 8, 3, 224, 136, 8, 3, 224, 233, 8, 3, 224, 222, 8, 3,
+ 225, 16, 8, 3, 224, 245, 8, 3, 224, 121, 8, 3, 224, 117, 8, 3, 224, 150,
+ 8, 3, 224, 134, 8, 3, 224, 126, 8, 3, 224, 132, 8, 3, 224, 100, 8, 3,
+ 224, 99, 8, 3, 224, 104, 8, 3, 224, 103, 8, 3, 224, 101, 8, 3, 224, 102,
+ 8, 3, 252, 96, 8, 3, 252, 95, 8, 3, 252, 102, 8, 3, 252, 97, 8, 3, 252,
+ 99, 8, 3, 252, 98, 8, 3, 252, 101, 8, 3, 252, 100, 8, 3, 252, 108, 8, 3,
+ 252, 107, 8, 3, 252, 111, 8, 3, 252, 109, 8, 3, 252, 87, 8, 3, 252, 89,
+ 8, 3, 252, 88, 8, 3, 252, 92, 8, 3, 252, 91, 8, 3, 252, 94, 8, 3, 252,
+ 93, 8, 3, 252, 103, 8, 3, 252, 106, 8, 3, 252, 104, 8, 3, 252, 83, 8, 3,
+ 252, 82, 8, 3, 252, 90, 8, 3, 252, 86, 8, 3, 252, 84, 8, 3, 252, 85, 8,
+ 3, 252, 79, 8, 3, 252, 78, 8, 3, 252, 81, 8, 3, 252, 80, 8, 3, 229, 169,
+ 8, 3, 229, 168, 8, 3, 229, 174, 8, 3, 229, 170, 8, 3, 229, 171, 8, 3,
+ 229, 173, 8, 3, 229, 172, 8, 3, 229, 177, 8, 3, 229, 176, 8, 3, 229, 179,
+ 8, 3, 229, 178, 8, 3, 229, 165, 8, 3, 229, 164, 8, 3, 229, 167, 8, 3,
+ 229, 166, 8, 3, 229, 158, 8, 3, 229, 157, 8, 3, 229, 162, 8, 3, 229, 161,
+ 8, 3, 229, 159, 8, 3, 229, 160, 8, 3, 229, 152, 8, 3, 229, 151, 8, 3,
+ 229, 156, 8, 3, 229, 155, 8, 3, 229, 153, 8, 3, 229, 154, 8, 3, 241, 110,
+ 8, 3, 241, 109, 8, 3, 241, 115, 8, 3, 241, 111, 8, 3, 241, 112, 8, 3,
+ 241, 114, 8, 3, 241, 113, 8, 3, 241, 118, 8, 3, 241, 117, 8, 3, 241, 120,
+ 8, 3, 241, 119, 8, 3, 241, 101, 8, 3, 241, 103, 8, 3, 241, 102, 8, 3,
+ 241, 106, 8, 3, 241, 105, 8, 3, 241, 108, 8, 3, 241, 107, 8, 3, 241, 97,
+ 8, 3, 241, 96, 8, 3, 241, 104, 8, 3, 241, 100, 8, 3, 241, 98, 8, 3, 241,
+ 99, 8, 3, 241, 91, 8, 3, 241, 95, 8, 3, 241, 94, 8, 3, 241, 92, 8, 3,
+ 241, 93, 8, 3, 230, 172, 8, 3, 230, 171, 8, 3, 230, 230, 8, 3, 230, 178,
+ 8, 3, 230, 203, 8, 3, 230, 221, 8, 3, 230, 219, 8, 3, 231, 139, 8, 3,
+ 231, 134, 8, 3, 184, 8, 3, 231, 172, 8, 3, 230, 74, 8, 3, 230, 73, 8, 3,
+ 230, 77, 8, 3, 230, 75, 8, 3, 230, 121, 8, 3, 230, 107, 8, 3, 230, 161,
+ 8, 3, 230, 126, 8, 3, 231, 26, 8, 3, 231, 91, 8, 3, 230, 55, 8, 3, 230,
+ 51, 8, 3, 230, 102, 8, 3, 230, 70, 8, 3, 230, 63, 8, 3, 230, 68, 8, 3,
+ 230, 28, 8, 3, 230, 27, 8, 3, 230, 33, 8, 3, 230, 30, 8, 3, 244, 83, 8,
+ 3, 244, 78, 8, 3, 244, 121, 8, 3, 244, 98, 8, 3, 244, 167, 8, 3, 244,
+ 158, 8, 3, 244, 196, 8, 3, 244, 170, 8, 3, 244, 3, 8, 3, 244, 43, 8, 3,
+ 244, 27, 8, 3, 243, 218, 8, 3, 243, 217, 8, 3, 243, 234, 8, 3, 243, 223,
+ 8, 3, 243, 221, 8, 3, 243, 222, 8, 3, 243, 205, 8, 3, 243, 204, 8, 3,
+ 243, 208, 8, 3, 243, 206, 8, 3, 213, 144, 8, 3, 213, 139, 8, 3, 213, 176,
+ 8, 3, 213, 153, 8, 3, 213, 166, 8, 3, 213, 163, 8, 3, 213, 168, 8, 3,
+ 213, 167, 8, 3, 214, 7, 8, 3, 214, 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3,
+ 213, 125, 8, 3, 213, 121, 8, 3, 213, 138, 8, 3, 213, 126, 8, 3, 213, 178,
+ 8, 3, 213, 244, 8, 3, 212, 110, 8, 3, 212, 108, 8, 3, 212, 116, 8, 3,
+ 212, 113, 8, 3, 212, 111, 8, 3, 212, 112, 8, 3, 212, 102, 8, 3, 212, 101,
+ 8, 3, 212, 106, 8, 3, 212, 105, 8, 3, 212, 103, 8, 3, 212, 104, 8, 3,
+ 247, 178, 8, 3, 247, 166, 8, 3, 248, 3, 8, 3, 247, 203, 8, 3, 247, 236,
+ 8, 3, 247, 240, 8, 3, 247, 239, 8, 3, 248, 152, 8, 3, 248, 147, 8, 3,
+ 248, 221, 8, 3, 248, 172, 8, 3, 246, 62, 8, 3, 246, 63, 8, 3, 247, 120,
+ 8, 3, 246, 102, 8, 3, 247, 145, 8, 3, 247, 122, 8, 3, 248, 30, 8, 3, 248,
+ 90, 8, 3, 248, 45, 8, 3, 246, 53, 8, 3, 246, 51, 8, 3, 246, 78, 8, 3,
+ 246, 61, 8, 3, 246, 56, 8, 3, 246, 59, 8, 3, 216, 67, 8, 3, 216, 61, 8,
+ 3, 216, 117, 8, 3, 216, 76, 8, 3, 216, 109, 8, 3, 216, 111, 8, 3, 216,
+ 110, 8, 3, 217, 46, 8, 3, 217, 33, 8, 3, 217, 105, 8, 3, 217, 54, 8, 3,
+ 215, 102, 8, 3, 215, 101, 8, 3, 215, 104, 8, 3, 215, 103, 8, 3, 216, 5,
+ 8, 3, 216, 1, 8, 3, 111, 8, 3, 216, 13, 8, 3, 216, 213, 8, 3, 217, 22, 8,
+ 3, 216, 237, 8, 3, 215, 88, 8, 3, 215, 83, 8, 3, 215, 118, 8, 3, 215,
+ 100, 8, 3, 215, 89, 8, 3, 215, 98, 8, 3, 248, 107, 8, 3, 248, 106, 8, 3,
+ 248, 112, 8, 3, 248, 108, 8, 3, 248, 109, 8, 3, 248, 111, 8, 3, 248, 110,
+ 8, 3, 248, 128, 8, 3, 248, 127, 8, 3, 248, 135, 8, 3, 248, 129, 8, 3,
+ 248, 97, 8, 3, 248, 99, 8, 3, 248, 98, 8, 3, 248, 102, 8, 3, 248, 101, 8,
+ 3, 248, 105, 8, 3, 248, 103, 8, 3, 248, 120, 8, 3, 248, 123, 8, 3, 248,
+ 121, 8, 3, 248, 93, 8, 3, 248, 92, 8, 3, 248, 100, 8, 3, 248, 96, 8, 3,
+ 248, 94, 8, 3, 248, 95, 8, 3, 229, 126, 8, 3, 229, 125, 8, 3, 229, 133,
+ 8, 3, 229, 128, 8, 3, 229, 129, 8, 3, 229, 130, 8, 3, 229, 142, 8, 3,
+ 229, 141, 8, 3, 229, 148, 8, 3, 229, 143, 8, 3, 229, 118, 8, 3, 229, 117,
+ 8, 3, 229, 124, 8, 3, 229, 119, 8, 3, 229, 134, 8, 3, 229, 140, 8, 3,
+ 229, 138, 8, 3, 229, 110, 8, 3, 229, 109, 8, 3, 229, 115, 8, 3, 229, 113,
+ 8, 3, 229, 111, 8, 3, 229, 112, 8, 3, 241, 77, 8, 3, 241, 76, 8, 3, 241,
+ 83, 8, 3, 241, 78, 8, 3, 241, 80, 8, 3, 241, 79, 8, 3, 241, 82, 8, 3,
+ 241, 81, 8, 3, 241, 88, 8, 3, 241, 87, 8, 3, 241, 90, 8, 3, 241, 89, 8,
+ 3, 241, 71, 8, 3, 241, 72, 8, 3, 241, 74, 8, 3, 241, 73, 8, 3, 241, 75,
+ 8, 3, 241, 84, 8, 3, 241, 86, 8, 3, 241, 85, 8, 3, 241, 70, 8, 3, 228,
+ 189, 8, 3, 228, 187, 8, 3, 228, 233, 8, 3, 228, 192, 8, 3, 228, 215, 8,
+ 3, 228, 229, 8, 3, 228, 228, 8, 3, 229, 183, 8, 3, 197, 8, 3, 229, 197,
+ 8, 3, 227, 186, 8, 3, 227, 188, 8, 3, 227, 187, 8, 3, 228, 51, 8, 3, 228,
+ 38, 8, 3, 228, 74, 8, 3, 228, 60, 8, 3, 229, 83, 8, 3, 229, 107, 8, 3,
+ 229, 94, 8, 3, 227, 181, 8, 3, 227, 177, 8, 3, 227, 237, 8, 3, 227, 185,
+ 8, 3, 227, 183, 8, 3, 227, 184, 8, 3, 241, 141, 8, 3, 241, 140, 8, 3,
+ 241, 146, 8, 3, 241, 142, 8, 3, 241, 143, 8, 3, 241, 145, 8, 3, 241, 144,
+ 8, 3, 241, 151, 8, 3, 241, 150, 8, 3, 241, 153, 8, 3, 241, 152, 8, 3,
+ 241, 133, 8, 3, 241, 135, 8, 3, 241, 134, 8, 3, 241, 137, 8, 3, 241, 139,
+ 8, 3, 241, 138, 8, 3, 241, 147, 8, 3, 241, 149, 8, 3, 241, 148, 8, 3,
+ 241, 129, 8, 3, 241, 128, 8, 3, 241, 136, 8, 3, 241, 132, 8, 3, 241, 130,
+ 8, 3, 241, 131, 8, 3, 241, 123, 8, 3, 241, 122, 8, 3, 241, 127, 8, 3,
+ 241, 126, 8, 3, 241, 124, 8, 3, 241, 125, 8, 3, 232, 195, 8, 3, 232, 189,
+ 8, 3, 232, 241, 8, 3, 232, 202, 8, 3, 232, 233, 8, 3, 232, 232, 8, 3,
+ 232, 236, 8, 3, 232, 234, 8, 3, 233, 79, 8, 3, 233, 69, 8, 3, 233, 135,
+ 8, 3, 233, 88, 8, 3, 232, 79, 8, 3, 232, 78, 8, 3, 232, 81, 8, 3, 232,
+ 80, 8, 3, 232, 116, 8, 3, 232, 106, 8, 3, 232, 156, 8, 3, 232, 120, 8, 3,
+ 233, 2, 8, 3, 233, 58, 8, 3, 233, 17, 8, 3, 232, 74, 8, 3, 232, 72, 8, 3,
+ 232, 98, 8, 3, 232, 77, 8, 3, 232, 75, 8, 3, 232, 76, 8, 3, 232, 54, 8,
+ 3, 232, 53, 8, 3, 232, 62, 8, 3, 232, 57, 8, 3, 232, 55, 8, 3, 232, 56,
+ 8, 3, 242, 189, 8, 3, 242, 188, 8, 3, 242, 214, 8, 3, 242, 199, 8, 3,
+ 242, 206, 8, 3, 242, 205, 8, 3, 242, 208, 8, 3, 242, 207, 8, 3, 243, 89,
+ 8, 3, 243, 84, 8, 3, 243, 135, 8, 3, 243, 99, 8, 3, 242, 91, 8, 3, 242,
+ 90, 8, 3, 242, 93, 8, 3, 242, 92, 8, 3, 242, 154, 8, 3, 242, 152, 8, 3,
+ 242, 174, 8, 3, 242, 162, 8, 3, 243, 33, 8, 3, 243, 31, 8, 3, 243, 62, 8,
+ 3, 243, 44, 8, 3, 242, 81, 8, 3, 242, 80, 8, 3, 242, 113, 8, 3, 242, 89,
+ 8, 3, 242, 82, 8, 3, 242, 88, 8, 3, 234, 61, 8, 3, 234, 60, 8, 3, 234,
+ 92, 8, 3, 234, 75, 8, 3, 234, 85, 8, 3, 234, 88, 8, 3, 234, 86, 8, 3,
+ 234, 202, 8, 3, 234, 190, 8, 3, 176, 8, 3, 234, 228, 8, 3, 233, 200, 8,
+ 3, 233, 205, 8, 3, 233, 202, 8, 3, 234, 0, 8, 3, 233, 252, 8, 3, 234, 28,
+ 8, 3, 234, 7, 8, 3, 234, 156, 8, 3, 234, 140, 8, 3, 234, 182, 8, 3, 234,
+ 159, 8, 3, 233, 189, 8, 3, 233, 186, 8, 3, 233, 217, 8, 3, 233, 199, 8,
+ 3, 233, 192, 8, 3, 233, 196, 8, 3, 243, 15, 8, 3, 243, 14, 8, 3, 243, 19,
+ 8, 3, 243, 16, 8, 3, 243, 18, 8, 3, 243, 17, 8, 3, 243, 26, 8, 3, 243,
+ 25, 8, 3, 243, 29, 8, 3, 243, 27, 8, 3, 243, 6, 8, 3, 243, 5, 8, 3, 243,
+ 8, 8, 3, 243, 7, 8, 3, 243, 11, 8, 3, 243, 10, 8, 3, 243, 13, 8, 3, 243,
+ 12, 8, 3, 243, 21, 8, 3, 243, 20, 8, 3, 243, 24, 8, 3, 243, 22, 8, 3,
+ 243, 1, 8, 3, 243, 0, 8, 3, 243, 9, 8, 3, 243, 4, 8, 3, 243, 2, 8, 3,
+ 243, 3, 8, 3, 230, 249, 8, 3, 230, 250, 8, 3, 231, 12, 8, 3, 231, 11, 8,
+ 3, 231, 14, 8, 3, 231, 13, 8, 3, 230, 240, 8, 3, 230, 242, 8, 3, 230,
+ 241, 8, 3, 230, 245, 8, 3, 230, 244, 8, 3, 230, 247, 8, 3, 230, 246, 8,
+ 3, 230, 251, 8, 3, 230, 253, 8, 3, 230, 252, 8, 3, 230, 236, 8, 3, 230,
+ 235, 8, 3, 230, 243, 8, 3, 230, 239, 8, 3, 230, 237, 8, 3, 230, 238, 8,
+ 3, 240, 180, 8, 3, 240, 179, 8, 3, 240, 186, 8, 3, 240, 181, 8, 3, 240,
+ 183, 8, 3, 240, 182, 8, 3, 240, 185, 8, 3, 240, 184, 8, 3, 240, 191, 8,
+ 3, 240, 190, 8, 3, 240, 193, 8, 3, 240, 192, 8, 3, 240, 172, 8, 3, 240,
+ 171, 8, 3, 240, 174, 8, 3, 240, 173, 8, 3, 240, 176, 8, 3, 240, 175, 8,
+ 3, 240, 178, 8, 3, 240, 177, 8, 3, 240, 187, 8, 3, 240, 189, 8, 3, 240,
+ 188, 8, 3, 229, 24, 8, 3, 229, 26, 8, 3, 229, 25, 8, 3, 229, 67, 8, 3,
+ 229, 65, 8, 3, 229, 77, 8, 3, 229, 70, 8, 3, 228, 243, 8, 3, 228, 242, 8,
+ 3, 228, 244, 8, 3, 228, 252, 8, 3, 228, 249, 8, 3, 229, 4, 8, 3, 228,
+ 254, 8, 3, 229, 58, 8, 3, 229, 64, 8, 3, 229, 60, 8, 3, 241, 156, 8, 3,
+ 241, 166, 8, 3, 241, 175, 8, 3, 241, 251, 8, 3, 241, 243, 8, 3, 162, 8,
+ 3, 242, 6, 8, 3, 240, 206, 8, 3, 240, 205, 8, 3, 240, 208, 8, 3, 240,
+ 207, 8, 3, 240, 242, 8, 3, 240, 233, 8, 3, 241, 68, 8, 3, 241, 47, 8, 3,
+ 241, 194, 8, 3, 241, 238, 8, 3, 241, 206, 8, 3, 212, 43, 8, 3, 212, 28,
+ 8, 3, 212, 65, 8, 3, 212, 51, 8, 3, 211, 185, 8, 3, 211, 187, 8, 3, 211,
+ 186, 8, 3, 211, 203, 8, 3, 211, 227, 8, 3, 211, 210, 8, 3, 212, 5, 8, 3,
+ 212, 22, 8, 3, 212, 10, 8, 3, 210, 30, 8, 3, 210, 29, 8, 3, 210, 44, 8,
+ 3, 210, 32, 8, 3, 210, 37, 8, 3, 210, 39, 8, 3, 210, 38, 8, 3, 210, 102,
+ 8, 3, 210, 99, 8, 3, 210, 116, 8, 3, 210, 105, 8, 3, 210, 6, 8, 3, 210,
+ 8, 8, 3, 210, 7, 8, 3, 210, 19, 8, 3, 210, 18, 8, 3, 210, 23, 8, 3, 210,
+ 20, 8, 3, 210, 84, 8, 3, 210, 94, 8, 3, 210, 88, 8, 3, 210, 2, 8, 3, 210,
+ 1, 8, 3, 210, 13, 8, 3, 210, 5, 8, 3, 210, 3, 8, 3, 210, 4, 8, 3, 209,
+ 245, 8, 3, 209, 244, 8, 3, 209, 250, 8, 3, 209, 248, 8, 3, 209, 246, 8,
+ 3, 209, 247, 8, 3, 250, 28, 8, 3, 250, 24, 8, 3, 250, 51, 8, 3, 250, 37,
+ 8, 3, 250, 48, 8, 3, 250, 42, 8, 3, 250, 50, 8, 3, 250, 49, 8, 3, 250,
+ 224, 8, 3, 250, 217, 8, 3, 251, 33, 8, 3, 250, 251, 8, 3, 249, 104, 8, 3,
+ 249, 106, 8, 3, 249, 105, 8, 3, 249, 153, 8, 3, 249, 144, 8, 3, 249, 238,
+ 8, 3, 249, 169, 8, 3, 250, 160, 8, 3, 250, 190, 8, 3, 250, 165, 8, 3,
+ 249, 84, 8, 3, 249, 82, 8, 3, 249, 112, 8, 3, 249, 102, 8, 3, 249, 89, 8,
+ 3, 249, 101, 8, 3, 249, 63, 8, 3, 249, 62, 8, 3, 249, 73, 8, 3, 249, 69,
+ 8, 3, 249, 64, 8, 3, 249, 66, 8, 3, 209, 228, 8, 3, 209, 227, 8, 3, 209,
+ 234, 8, 3, 209, 229, 8, 3, 209, 231, 8, 3, 209, 230, 8, 3, 209, 233, 8,
+ 3, 209, 232, 8, 3, 209, 240, 8, 3, 209, 239, 8, 3, 209, 243, 8, 3, 209,
+ 241, 8, 3, 209, 224, 8, 3, 209, 226, 8, 3, 209, 225, 8, 3, 209, 235, 8,
+ 3, 209, 238, 8, 3, 209, 236, 8, 3, 209, 217, 8, 3, 209, 221, 8, 3, 209,
+ 220, 8, 3, 209, 218, 8, 3, 209, 219, 8, 3, 209, 211, 8, 3, 209, 210, 8,
+ 3, 209, 216, 8, 3, 209, 214, 8, 3, 209, 212, 8, 3, 209, 213, 8, 3, 227,
+ 104, 8, 3, 227, 103, 8, 3, 227, 109, 8, 3, 227, 105, 8, 3, 227, 106, 8,
+ 3, 227, 108, 8, 3, 227, 107, 8, 3, 227, 114, 8, 3, 227, 113, 8, 3, 227,
+ 117, 8, 3, 227, 116, 8, 3, 227, 97, 8, 3, 227, 98, 8, 3, 227, 101, 8, 3,
+ 227, 102, 8, 3, 227, 110, 8, 3, 227, 112, 8, 3, 227, 92, 8, 3, 227, 100,
+ 8, 3, 227, 96, 8, 3, 227, 93, 8, 3, 227, 94, 8, 3, 227, 87, 8, 3, 227,
+ 86, 8, 3, 227, 91, 8, 3, 227, 90, 8, 3, 227, 88, 8, 3, 227, 89, 8, 3,
+ 219, 127, 8, 3, 194, 8, 3, 219, 191, 8, 3, 219, 130, 8, 3, 219, 183, 8,
+ 3, 219, 186, 8, 3, 219, 184, 8, 3, 221, 226, 8, 3, 221, 214, 8, 3, 206,
+ 8, 3, 221, 234, 8, 3, 218, 28, 8, 3, 218, 30, 8, 3, 218, 29, 8, 3, 219,
+ 34, 8, 3, 219, 23, 8, 3, 219, 58, 8, 3, 219, 38, 8, 3, 220, 114, 8, 3,
+ 221, 181, 8, 3, 220, 139, 8, 3, 218, 5, 8, 3, 218, 3, 8, 3, 218, 83, 8,
+ 3, 218, 27, 8, 3, 218, 9, 8, 3, 218, 17, 8, 3, 217, 166, 8, 3, 217, 165,
+ 8, 3, 217, 232, 8, 3, 217, 173, 8, 3, 217, 168, 8, 3, 217, 172, 8, 3,
+ 218, 186, 8, 3, 218, 185, 8, 3, 218, 192, 8, 3, 218, 187, 8, 3, 218, 189,
+ 8, 3, 218, 191, 8, 3, 218, 190, 8, 3, 218, 200, 8, 3, 218, 198, 8, 3,
+ 218, 223, 8, 3, 218, 201, 8, 3, 218, 181, 8, 3, 218, 180, 8, 3, 218, 184,
+ 8, 3, 218, 182, 8, 3, 218, 194, 8, 3, 218, 197, 8, 3, 218, 195, 8, 3,
+ 218, 177, 8, 3, 218, 175, 8, 3, 218, 179, 8, 3, 218, 178, 8, 3, 218, 170,
+ 8, 3, 218, 169, 8, 3, 218, 174, 8, 3, 218, 173, 8, 3, 218, 171, 8, 3,
+ 218, 172, 8, 3, 210, 77, 8, 3, 210, 76, 8, 3, 210, 82, 8, 3, 210, 79, 8,
+ 3, 210, 59, 8, 3, 210, 61, 8, 3, 210, 60, 8, 3, 210, 64, 8, 3, 210, 63,
+ 8, 3, 210, 67, 8, 3, 210, 65, 8, 3, 210, 71, 8, 3, 210, 70, 8, 3, 210,
+ 74, 8, 3, 210, 72, 8, 3, 210, 55, 8, 3, 210, 54, 8, 3, 210, 62, 8, 3,
+ 210, 58, 8, 3, 210, 56, 8, 3, 210, 57, 8, 3, 210, 47, 8, 3, 210, 46, 8,
+ 3, 210, 51, 8, 3, 210, 50, 8, 3, 210, 48, 8, 3, 210, 49, 8, 3, 250, 136,
+ 8, 3, 250, 133, 8, 3, 250, 157, 8, 3, 250, 144, 8, 3, 250, 65, 8, 3, 250,
+ 64, 8, 3, 250, 67, 8, 3, 250, 66, 8, 3, 250, 79, 8, 3, 250, 78, 8, 3,
+ 250, 86, 8, 3, 250, 81, 8, 3, 250, 115, 8, 3, 250, 113, 8, 3, 250, 131,
+ 8, 3, 250, 121, 8, 3, 250, 59, 8, 3, 250, 69, 8, 3, 250, 63, 8, 3, 250,
+ 60, 8, 3, 250, 62, 8, 3, 250, 53, 8, 3, 250, 52, 8, 3, 250, 57, 8, 3,
+ 250, 56, 8, 3, 250, 54, 8, 3, 250, 55, 8, 3, 222, 175, 8, 3, 222, 179, 8,
+ 3, 222, 158, 8, 3, 222, 159, 8, 3, 222, 162, 8, 3, 222, 161, 8, 3, 222,
+ 165, 8, 3, 222, 163, 8, 3, 222, 169, 8, 3, 222, 168, 8, 3, 222, 174, 8,
+ 3, 222, 170, 8, 3, 222, 154, 8, 3, 222, 152, 8, 3, 222, 160, 8, 3, 222,
+ 157, 8, 3, 222, 155, 8, 3, 222, 156, 8, 3, 222, 147, 8, 3, 222, 146, 8,
+ 3, 222, 151, 8, 3, 222, 150, 8, 3, 222, 148, 8, 3, 222, 149, 8, 3, 228,
+ 34, 8, 3, 228, 33, 8, 3, 228, 36, 8, 3, 228, 35, 8, 3, 228, 26, 8, 3,
+ 228, 28, 8, 3, 228, 27, 8, 3, 228, 30, 8, 3, 228, 29, 8, 3, 228, 32, 8,
+ 3, 228, 31, 8, 3, 228, 21, 8, 3, 228, 20, 8, 3, 228, 25, 8, 3, 228, 24,
+ 8, 3, 228, 22, 8, 3, 228, 23, 8, 3, 228, 15, 8, 3, 228, 14, 8, 3, 228,
+ 19, 8, 3, 228, 18, 8, 3, 228, 16, 8, 3, 228, 17, 8, 3, 220, 72, 8, 3,
+ 220, 67, 8, 3, 220, 102, 8, 3, 220, 83, 8, 3, 219, 215, 8, 3, 219, 217,
+ 8, 3, 219, 216, 8, 3, 219, 236, 8, 3, 219, 233, 8, 3, 220, 7, 8, 3, 219,
+ 254, 8, 3, 220, 42, 8, 3, 220, 35, 8, 3, 220, 63, 8, 3, 220, 50, 8, 3,
+ 219, 211, 8, 3, 219, 209, 8, 3, 219, 225, 8, 3, 219, 214, 8, 3, 219, 212,
+ 8, 3, 219, 213, 8, 3, 219, 194, 8, 3, 219, 193, 8, 3, 219, 200, 8, 3,
+ 219, 197, 8, 3, 219, 195, 8, 3, 219, 196, 8, 3, 223, 141, 8, 3, 223, 135,
+ 8, 3, 205, 8, 3, 223, 147, 8, 3, 222, 120, 8, 3, 222, 122, 8, 3, 222,
+ 121, 8, 3, 222, 188, 8, 3, 222, 181, 8, 3, 222, 211, 8, 3, 222, 192, 8,
+ 3, 223, 43, 8, 3, 223, 128, 8, 3, 223, 81, 8, 3, 222, 113, 8, 3, 222,
+ 110, 8, 3, 222, 140, 8, 3, 222, 119, 8, 3, 222, 115, 8, 3, 222, 116, 8,
+ 3, 222, 95, 8, 3, 222, 94, 8, 3, 222, 100, 8, 3, 222, 98, 8, 3, 222, 96,
+ 8, 3, 222, 97, 8, 3, 235, 98, 8, 3, 235, 97, 8, 3, 235, 108, 8, 3, 235,
+ 99, 8, 3, 235, 104, 8, 3, 235, 103, 8, 3, 235, 106, 8, 3, 235, 105, 8, 3,
+ 235, 41, 8, 3, 235, 40, 8, 3, 235, 43, 8, 3, 235, 42, 8, 3, 235, 56, 8,
+ 3, 235, 54, 8, 3, 235, 68, 8, 3, 235, 58, 8, 3, 235, 34, 8, 3, 235, 32,
+ 8, 3, 235, 51, 8, 3, 235, 39, 8, 3, 235, 36, 8, 3, 235, 37, 8, 3, 235,
+ 26, 8, 3, 235, 25, 8, 3, 235, 30, 8, 3, 235, 29, 8, 3, 235, 27, 8, 3,
+ 235, 28, 8, 3, 224, 46, 8, 3, 224, 44, 8, 3, 224, 53, 8, 3, 224, 47, 8,
+ 3, 224, 50, 8, 3, 224, 49, 8, 3, 224, 52, 8, 3, 224, 51, 8, 3, 223, 255,
+ 8, 3, 223, 252, 8, 3, 224, 1, 8, 3, 224, 0, 8, 3, 224, 33, 8, 3, 224, 32,
+ 8, 3, 224, 42, 8, 3, 224, 36, 8, 3, 223, 247, 8, 3, 223, 243, 8, 3, 224,
+ 30, 8, 3, 223, 251, 8, 3, 223, 249, 8, 3, 223, 250, 8, 3, 223, 227, 8, 3,
+ 223, 225, 8, 3, 223, 237, 8, 3, 223, 230, 8, 3, 223, 228, 8, 3, 223, 229,
+ 8, 3, 235, 87, 8, 3, 235, 86, 8, 3, 235, 93, 8, 3, 235, 88, 8, 3, 235,
+ 90, 8, 3, 235, 89, 8, 3, 235, 92, 8, 3, 235, 91, 8, 3, 235, 78, 8, 3,
+ 235, 80, 8, 3, 235, 79, 8, 3, 235, 83, 8, 3, 235, 82, 8, 3, 235, 85, 8,
+ 3, 235, 84, 8, 3, 235, 74, 8, 3, 235, 73, 8, 3, 235, 81, 8, 3, 235, 77,
+ 8, 3, 235, 75, 8, 3, 235, 76, 8, 3, 235, 70, 8, 3, 235, 69, 8, 3, 235,
+ 72, 8, 3, 235, 71, 8, 3, 228, 162, 8, 3, 228, 161, 8, 3, 228, 169, 8, 3,
+ 228, 163, 8, 3, 228, 165, 8, 3, 228, 164, 8, 3, 228, 168, 8, 3, 228, 166,
+ 8, 3, 228, 151, 8, 3, 228, 152, 8, 3, 228, 157, 8, 3, 228, 156, 8, 3,
+ 228, 160, 8, 3, 228, 158, 8, 3, 228, 146, 8, 3, 228, 155, 8, 3, 228, 150,
+ 8, 3, 228, 147, 8, 3, 228, 148, 8, 3, 228, 141, 8, 3, 228, 140, 8, 3,
+ 228, 145, 8, 3, 228, 144, 8, 3, 228, 142, 8, 3, 228, 143, 8, 3, 227, 137,
+ 8, 3, 227, 136, 8, 3, 227, 148, 8, 3, 227, 141, 8, 3, 227, 145, 8, 3,
+ 227, 144, 8, 3, 227, 147, 8, 3, 227, 146, 8, 3, 227, 124, 8, 3, 227, 126,
+ 8, 3, 227, 125, 8, 3, 227, 130, 8, 3, 227, 129, 8, 3, 227, 134, 8, 3,
+ 227, 131, 8, 3, 227, 122, 8, 3, 227, 120, 8, 3, 227, 128, 8, 3, 227, 123,
+ 8, 3, 211, 150, 8, 3, 211, 149, 8, 3, 211, 157, 8, 3, 211, 152, 8, 3,
+ 211, 154, 8, 3, 211, 153, 8, 3, 211, 156, 8, 3, 211, 155, 8, 3, 211, 139,
+ 8, 3, 211, 140, 8, 3, 211, 144, 8, 3, 211, 143, 8, 3, 211, 148, 8, 3,
+ 211, 146, 8, 3, 211, 121, 8, 3, 211, 119, 8, 3, 211, 131, 8, 3, 211, 124,
+ 8, 3, 211, 122, 8, 3, 211, 123, 8, 3, 210, 250, 8, 3, 210, 248, 8, 3,
+ 211, 8, 8, 3, 210, 251, 8, 3, 211, 2, 8, 3, 211, 1, 8, 3, 211, 5, 8, 3,
+ 211, 3, 8, 3, 210, 191, 8, 3, 210, 190, 8, 3, 210, 194, 8, 3, 210, 192,
+ 8, 3, 210, 224, 8, 3, 210, 221, 8, 3, 210, 244, 8, 3, 210, 228, 8, 3,
+ 210, 182, 8, 3, 210, 178, 8, 3, 210, 212, 8, 3, 210, 189, 8, 3, 210, 185,
+ 8, 3, 210, 186, 8, 3, 210, 162, 8, 3, 210, 161, 8, 3, 210, 169, 8, 3,
+ 210, 165, 8, 3, 210, 163, 8, 3, 210, 164, 8, 34, 224, 33, 8, 34, 232,
+ 241, 8, 34, 234, 61, 8, 34, 227, 141, 8, 34, 249, 69, 8, 34, 218, 192, 8,
+ 34, 243, 12, 8, 34, 243, 44, 8, 34, 230, 230, 8, 34, 240, 180, 8, 34,
+ 232, 56, 8, 34, 252, 83, 8, 34, 230, 126, 8, 34, 210, 244, 8, 34, 224,
+ 121, 8, 34, 240, 174, 8, 34, 217, 46, 8, 34, 243, 135, 8, 34, 210, 5, 8,
+ 34, 249, 63, 8, 34, 248, 95, 8, 34, 251, 98, 8, 34, 243, 8, 8, 34, 227,
+ 131, 8, 34, 215, 118, 8, 34, 226, 175, 8, 34, 235, 74, 8, 34, 210, 19, 8,
+ 34, 224, 100, 8, 34, 241, 108, 8, 34, 210, 250, 8, 34, 212, 112, 8, 34,
+ 219, 200, 8, 34, 213, 244, 8, 34, 210, 116, 8, 34, 235, 68, 8, 34, 227,
+ 96, 8, 34, 235, 72, 8, 34, 242, 154, 8, 34, 235, 92, 8, 34, 211, 227, 8,
+ 34, 246, 78, 8, 34, 219, 213, 8, 34, 232, 236, 8, 34, 249, 73, 8, 34,
+ 249, 105, 8, 34, 250, 37, 8, 34, 240, 177, 8, 34, 220, 72, 8, 34, 210, 4,
+ 8, 34, 219, 254, 8, 34, 250, 131, 8, 34, 209, 231, 8, 34, 229, 173, 8,
+ 34, 234, 182, 232, 196, 1, 252, 191, 232, 196, 1, 190, 232, 196, 1, 225,
+ 147, 232, 196, 1, 248, 221, 232, 196, 1, 217, 105, 232, 196, 1, 216, 208,
+ 232, 196, 1, 243, 135, 232, 196, 1, 176, 232, 196, 1, 234, 132, 232, 196,
+ 1, 235, 141, 232, 196, 1, 251, 33, 232, 196, 1, 250, 157, 232, 196, 1,
+ 246, 38, 232, 196, 1, 215, 183, 232, 196, 1, 215, 175, 232, 196, 1, 184,
+ 232, 196, 1, 197, 232, 196, 1, 233, 135, 232, 196, 1, 206, 232, 196, 1,
+ 210, 82, 232, 196, 1, 210, 116, 232, 196, 1, 229, 77, 232, 196, 1, 162,
+ 232, 196, 1, 211, 165, 232, 196, 1, 241, 189, 232, 196, 1, 244, 196, 232,
+ 196, 1, 212, 65, 232, 196, 1, 220, 102, 232, 196, 1, 191, 232, 196, 1,
+ 242, 249, 232, 196, 1, 61, 232, 196, 1, 254, 243, 232, 196, 1, 75, 232,
+ 196, 1, 245, 55, 232, 196, 1, 73, 232, 196, 1, 76, 232, 196, 1, 70, 232,
+ 196, 1, 214, 214, 232, 196, 1, 214, 208, 232, 196, 1, 226, 234, 232, 196,
+ 1, 138, 230, 32, 216, 117, 232, 196, 1, 138, 229, 229, 225, 16, 232, 196,
+ 1, 138, 230, 32, 249, 72, 232, 196, 1, 138, 230, 32, 251, 205, 232, 196,
+ 1, 138, 230, 32, 197, 232, 196, 1, 138, 230, 32, 235, 115, 232, 196, 224,
+ 141, 249, 219, 232, 196, 224, 141, 243, 229, 218, 129, 41, 3, 245, 209,
+ 41, 3, 245, 205, 41, 3, 241, 220, 41, 3, 212, 17, 41, 3, 212, 16, 41, 3,
+ 225, 211, 41, 3, 252, 13, 41, 3, 252, 66, 41, 3, 231, 116, 41, 3, 233,
+ 247, 41, 3, 231, 6, 41, 3, 243, 75, 41, 3, 244, 147, 41, 3, 213, 250, 41,
+ 3, 217, 11, 41, 3, 216, 194, 41, 3, 248, 16, 41, 3, 248, 13, 41, 3, 233,
+ 50, 41, 3, 223, 108, 41, 3, 248, 77, 41, 3, 229, 139, 41, 3, 221, 170,
+ 41, 3, 220, 61, 41, 3, 210, 92, 41, 3, 210, 73, 41, 3, 250, 182, 41, 3,
+ 235, 124, 41, 3, 228, 176, 41, 3, 211, 44, 41, 3, 234, 181, 41, 3, 229,
+ 51, 41, 3, 243, 55, 41, 3, 231, 80, 41, 3, 229, 103, 41, 3, 227, 155, 41,
+ 3, 73, 41, 3, 235, 255, 41, 3, 241, 180, 41, 3, 241, 160, 41, 3, 211,
+ 250, 41, 3, 211, 241, 41, 3, 225, 108, 41, 3, 252, 11, 41, 3, 252, 6, 41,
+ 3, 231, 109, 41, 3, 233, 244, 41, 3, 231, 3, 41, 3, 243, 71, 41, 3, 244,
+ 121, 41, 3, 213, 176, 41, 3, 216, 117, 41, 3, 216, 175, 41, 3, 248, 8,
+ 41, 3, 248, 12, 41, 3, 232, 241, 41, 3, 223, 35, 41, 3, 248, 3, 41, 3,
+ 229, 133, 41, 3, 219, 191, 41, 3, 220, 32, 41, 3, 210, 44, 41, 3, 210,
+ 69, 41, 3, 250, 51, 41, 3, 235, 108, 41, 3, 228, 169, 41, 3, 211, 8, 41,
+ 3, 234, 92, 41, 3, 229, 43, 41, 3, 242, 214, 41, 3, 230, 230, 41, 3, 228,
+ 233, 41, 3, 227, 148, 41, 3, 61, 41, 3, 254, 123, 41, 3, 229, 72, 41, 3,
+ 162, 41, 3, 242, 18, 41, 3, 212, 65, 41, 3, 212, 55, 41, 3, 190, 41, 3,
+ 252, 18, 41, 3, 252, 191, 41, 3, 231, 124, 41, 3, 233, 251, 41, 3, 233,
+ 250, 41, 3, 231, 10, 41, 3, 243, 79, 41, 3, 244, 196, 41, 3, 214, 27, 41,
+ 3, 217, 105, 41, 3, 216, 208, 41, 3, 248, 25, 41, 3, 248, 15, 41, 3, 233,
+ 135, 41, 3, 205, 41, 3, 248, 221, 41, 3, 229, 148, 41, 3, 206, 41, 3,
+ 220, 102, 41, 3, 210, 116, 41, 3, 210, 82, 41, 3, 251, 33, 41, 3, 235,
+ 141, 41, 3, 228, 185, 41, 3, 191, 41, 3, 176, 41, 3, 234, 234, 41, 3,
+ 229, 56, 41, 3, 243, 135, 41, 3, 184, 41, 3, 197, 41, 3, 227, 165, 41, 3,
+ 226, 183, 41, 3, 226, 179, 41, 3, 241, 53, 41, 3, 211, 215, 41, 3, 211,
+ 211, 41, 3, 224, 249, 41, 3, 252, 9, 41, 3, 251, 193, 41, 3, 231, 104,
+ 41, 3, 233, 242, 41, 3, 230, 255, 41, 3, 243, 67, 41, 3, 244, 34, 41, 3,
+ 213, 127, 41, 3, 216, 17, 41, 3, 216, 153, 41, 3, 248, 6, 41, 3, 248, 10,
+ 41, 3, 232, 127, 41, 3, 222, 197, 41, 3, 247, 125, 41, 3, 229, 120, 41,
+ 3, 219, 40, 41, 3, 220, 1, 41, 3, 210, 21, 41, 3, 210, 66, 41, 3, 249,
+ 174, 41, 3, 235, 59, 41, 3, 228, 159, 41, 3, 210, 229, 41, 3, 234, 10,
+ 41, 3, 229, 41, 41, 3, 242, 164, 41, 3, 230, 132, 41, 3, 228, 64, 41, 3,
+ 227, 132, 41, 3, 70, 41, 3, 214, 190, 41, 3, 240, 222, 41, 3, 240, 212,
+ 41, 3, 211, 195, 41, 3, 211, 189, 41, 3, 224, 150, 41, 3, 252, 8, 41, 3,
+ 251, 125, 41, 3, 231, 103, 41, 3, 233, 240, 41, 3, 230, 254, 41, 3, 243,
+ 66, 41, 3, 243, 234, 41, 3, 212, 116, 41, 3, 215, 118, 41, 3, 216, 136,
+ 41, 3, 248, 4, 41, 3, 248, 9, 41, 3, 232, 98, 41, 3, 222, 140, 41, 3,
+ 246, 78, 41, 3, 229, 115, 41, 3, 218, 83, 41, 3, 219, 225, 41, 3, 210,
+ 13, 41, 3, 210, 62, 41, 3, 249, 112, 41, 3, 235, 51, 41, 3, 228, 155, 41,
+ 3, 210, 212, 41, 3, 233, 217, 41, 3, 229, 40, 41, 3, 242, 113, 41, 3,
+ 230, 102, 41, 3, 227, 237, 41, 3, 227, 128, 41, 3, 76, 41, 3, 226, 196,
+ 41, 3, 229, 0, 41, 3, 241, 68, 41, 3, 241, 56, 41, 3, 211, 227, 41, 3,
+ 211, 216, 41, 3, 225, 16, 41, 3, 252, 10, 41, 3, 251, 205, 41, 3, 231,
+ 105, 41, 3, 233, 243, 41, 3, 231, 1, 41, 3, 243, 69, 41, 3, 243, 68, 41,
+ 3, 244, 43, 41, 3, 213, 138, 41, 3, 111, 41, 3, 216, 156, 41, 3, 248, 7,
+ 41, 3, 248, 11, 41, 3, 232, 156, 41, 3, 222, 211, 41, 3, 247, 145, 41, 3,
+ 229, 124, 41, 3, 219, 58, 41, 3, 220, 7, 41, 3, 210, 23, 41, 3, 210, 67,
+ 41, 3, 249, 238, 41, 3, 235, 68, 41, 3, 228, 160, 41, 3, 210, 244, 41, 3,
+ 234, 28, 41, 3, 229, 42, 41, 3, 242, 174, 41, 3, 230, 161, 41, 3, 228,
+ 74, 41, 3, 227, 134, 41, 3, 75, 41, 3, 245, 150, 41, 3, 229, 61, 41, 3,
+ 241, 238, 41, 3, 241, 209, 41, 3, 212, 22, 41, 3, 212, 12, 41, 3, 225,
+ 221, 41, 3, 252, 14, 41, 3, 252, 75, 41, 3, 231, 117, 41, 3, 233, 248,
+ 41, 3, 233, 246, 41, 3, 231, 7, 41, 3, 243, 76, 41, 3, 243, 74, 41, 3,
+ 244, 154, 41, 3, 213, 255, 41, 3, 217, 22, 41, 3, 216, 195, 41, 3, 248,
+ 17, 41, 3, 248, 14, 41, 3, 233, 58, 41, 3, 223, 128, 41, 3, 248, 90, 41,
+ 3, 229, 140, 41, 3, 221, 181, 41, 3, 220, 63, 41, 3, 210, 94, 41, 3, 210,
+ 74, 41, 3, 250, 190, 41, 3, 235, 126, 41, 3, 228, 178, 41, 3, 211, 47,
+ 41, 3, 234, 182, 41, 3, 229, 52, 41, 3, 229, 48, 41, 3, 243, 62, 41, 3,
+ 243, 51, 41, 3, 231, 91, 41, 3, 229, 107, 41, 3, 227, 156, 41, 3, 229,
+ 79, 41, 3, 233, 22, 41, 249, 219, 41, 243, 229, 218, 129, 41, 224, 13,
+ 78, 41, 3, 229, 123, 244, 196, 41, 3, 229, 123, 176, 41, 3, 229, 123,
+ 219, 40, 41, 16, 244, 144, 41, 16, 234, 180, 41, 16, 216, 81, 41, 16,
+ 228, 208, 41, 16, 252, 147, 41, 16, 244, 195, 41, 16, 217, 101, 41, 16,
+ 248, 176, 41, 16, 247, 124, 41, 16, 233, 206, 41, 16, 216, 21, 41, 16,
+ 247, 144, 41, 16, 235, 60, 41, 21, 210, 86, 41, 21, 110, 41, 21, 105, 41,
+ 21, 158, 41, 21, 161, 41, 21, 189, 41, 21, 194, 41, 21, 198, 41, 21, 195,
+ 41, 21, 200, 41, 3, 229, 123, 184, 41, 3, 229, 123, 247, 145, 33, 6, 1,
+ 210, 90, 33, 4, 1, 210, 90, 33, 6, 1, 246, 34, 33, 4, 1, 246, 34, 33, 6,
+ 1, 223, 49, 246, 36, 33, 4, 1, 223, 49, 246, 36, 33, 6, 1, 235, 185, 33,
+ 4, 1, 235, 185, 33, 6, 1, 247, 161, 33, 4, 1, 247, 161, 33, 6, 1, 230,
+ 140, 214, 205, 33, 4, 1, 230, 140, 214, 205, 33, 6, 1, 251, 136, 226,
+ 201, 33, 4, 1, 251, 136, 226, 201, 33, 6, 1, 229, 87, 211, 31, 33, 4, 1,
+ 229, 87, 211, 31, 33, 6, 1, 211, 28, 2, 252, 185, 211, 31, 33, 4, 1, 211,
+ 28, 2, 252, 185, 211, 31, 33, 6, 1, 235, 183, 211, 59, 33, 4, 1, 235,
+ 183, 211, 59, 33, 6, 1, 223, 49, 210, 212, 33, 4, 1, 223, 49, 210, 212,
+ 33, 6, 1, 235, 183, 61, 33, 4, 1, 235, 183, 61, 33, 6, 1, 250, 0, 232,
+ 192, 210, 183, 33, 4, 1, 250, 0, 232, 192, 210, 183, 33, 6, 1, 251, 214,
+ 210, 183, 33, 4, 1, 251, 214, 210, 183, 33, 6, 1, 235, 183, 250, 0, 232,
+ 192, 210, 183, 33, 4, 1, 235, 183, 250, 0, 232, 192, 210, 183, 33, 6, 1,
+ 210, 246, 33, 4, 1, 210, 246, 33, 6, 1, 223, 49, 215, 178, 33, 4, 1, 223,
+ 49, 215, 178, 33, 6, 1, 219, 52, 248, 90, 33, 4, 1, 219, 52, 248, 90, 33,
+ 6, 1, 219, 52, 245, 174, 33, 4, 1, 219, 52, 245, 174, 33, 6, 1, 219, 52,
+ 245, 159, 33, 4, 1, 219, 52, 245, 159, 33, 6, 1, 230, 144, 76, 33, 4, 1,
+ 230, 144, 76, 33, 6, 1, 251, 240, 76, 33, 4, 1, 251, 240, 76, 33, 6, 1,
+ 52, 230, 144, 76, 33, 4, 1, 52, 230, 144, 76, 33, 1, 230, 86, 76, 38, 33,
+ 212, 100, 38, 33, 216, 248, 230, 191, 50, 38, 33, 240, 211, 230, 191, 50,
+ 38, 33, 216, 148, 230, 191, 50, 219, 93, 253, 216, 38, 33, 1, 214, 202,
+ 236, 60, 38, 33, 1, 73, 38, 33, 1, 211, 8, 38, 33, 1, 70, 38, 33, 1, 242,
+ 3, 50, 38, 33, 1, 211, 27, 38, 33, 1, 219, 52, 50, 38, 33, 1, 226, 201,
+ 38, 33, 234, 192, 38, 33, 225, 227, 33, 234, 192, 33, 225, 227, 33, 6, 1,
+ 246, 46, 33, 4, 1, 246, 46, 33, 6, 1, 246, 27, 33, 4, 1, 246, 27, 33, 6,
+ 1, 210, 52, 33, 4, 1, 210, 52, 33, 6, 1, 250, 206, 33, 4, 1, 250, 206,
+ 33, 6, 1, 246, 25, 33, 4, 1, 246, 25, 33, 6, 1, 217, 23, 2, 230, 224,
+ 103, 33, 4, 1, 217, 23, 2, 230, 224, 103, 33, 6, 1, 215, 78, 33, 4, 1,
+ 215, 78, 33, 6, 1, 215, 160, 33, 4, 1, 215, 160, 33, 6, 1, 215, 164, 33,
+ 4, 1, 215, 164, 33, 6, 1, 217, 28, 33, 4, 1, 217, 28, 33, 6, 1, 240, 198,
+ 33, 4, 1, 240, 198, 33, 6, 1, 219, 206, 33, 4, 1, 219, 206, 38, 33, 1,
+ 235, 183, 75, 20, 1, 61, 20, 1, 176, 20, 1, 70, 20, 1, 233, 217, 20, 1,
+ 245, 209, 20, 1, 223, 108, 20, 1, 217, 86, 20, 1, 76, 20, 1, 227, 148,
+ 20, 1, 73, 20, 1, 233, 135, 20, 1, 190, 20, 1, 222, 239, 20, 1, 223, 29,
+ 20, 1, 233, 49, 20, 1, 231, 79, 20, 1, 217, 101, 20, 1, 229, 146, 20, 1,
+ 228, 183, 20, 1, 193, 20, 1, 218, 4, 20, 1, 230, 102, 20, 1, 220, 27, 20,
+ 1, 219, 191, 20, 1, 220, 37, 20, 1, 220, 123, 20, 1, 233, 155, 20, 1,
+ 234, 156, 20, 1, 227, 209, 20, 1, 227, 237, 20, 1, 228, 154, 20, 1, 210,
+ 226, 20, 1, 219, 225, 20, 1, 210, 187, 20, 1, 191, 20, 1, 228, 9, 20, 1,
+ 234, 142, 20, 1, 225, 151, 20, 1, 228, 176, 20, 1, 227, 246, 20, 1, 224,
+ 144, 20, 1, 211, 192, 20, 1, 225, 211, 20, 1, 244, 147, 20, 1, 222, 140,
+ 20, 1, 232, 98, 20, 1, 230, 230, 20, 1, 228, 233, 20, 1, 223, 51, 20, 1,
+ 223, 171, 20, 1, 234, 165, 20, 1, 229, 7, 20, 1, 229, 56, 20, 1, 229, 77,
+ 20, 1, 220, 7, 20, 1, 224, 147, 20, 1, 243, 234, 20, 1, 244, 37, 20, 1,
+ 212, 65, 20, 1, 197, 20, 1, 232, 241, 20, 1, 225, 108, 20, 1, 232, 119,
+ 20, 1, 234, 28, 20, 1, 231, 114, 20, 1, 223, 83, 20, 1, 231, 58, 20, 1,
+ 184, 20, 1, 216, 117, 20, 1, 234, 92, 20, 1, 230, 161, 20, 1, 231, 122,
+ 20, 1, 216, 230, 20, 1, 233, 251, 20, 1, 216, 247, 20, 1, 227, 238, 20,
+ 1, 221, 251, 20, 1, 244, 192, 20, 1, 233, 253, 20, 1, 234, 24, 20, 38,
+ 164, 234, 5, 20, 38, 164, 215, 110, 20, 228, 182, 20, 243, 229, 218, 129,
+ 20, 249, 226, 20, 249, 219, 20, 220, 150, 20, 224, 13, 78, 58, 1, 250,
+ 96, 138, 210, 254, 225, 61, 58, 1, 250, 96, 138, 211, 70, 225, 61, 58, 1,
+ 250, 96, 138, 210, 254, 220, 84, 58, 1, 250, 96, 138, 211, 70, 220, 84,
+ 58, 1, 250, 96, 138, 210, 254, 224, 30, 58, 1, 250, 96, 138, 211, 70,
+ 224, 30, 58, 1, 250, 96, 138, 210, 254, 222, 140, 58, 1, 250, 96, 138,
+ 211, 70, 222, 140, 58, 1, 245, 20, 246, 118, 138, 130, 58, 1, 125, 246,
+ 118, 138, 130, 58, 1, 230, 225, 246, 118, 138, 130, 58, 1, 121, 246, 118,
+ 138, 130, 58, 1, 245, 19, 246, 118, 138, 130, 58, 1, 245, 20, 246, 118,
+ 233, 39, 138, 130, 58, 1, 125, 246, 118, 233, 39, 138, 130, 58, 1, 230,
+ 225, 246, 118, 233, 39, 138, 130, 58, 1, 121, 246, 118, 233, 39, 138,
+ 130, 58, 1, 245, 19, 246, 118, 233, 39, 138, 130, 58, 1, 245, 20, 233,
+ 39, 138, 130, 58, 1, 125, 233, 39, 138, 130, 58, 1, 230, 225, 233, 39,
+ 138, 130, 58, 1, 121, 233, 39, 138, 130, 58, 1, 245, 19, 233, 39, 138,
+ 130, 58, 1, 59, 67, 130, 58, 1, 59, 219, 95, 58, 1, 59, 203, 130, 58, 1,
+ 232, 108, 44, 249, 161, 254, 109, 58, 1, 223, 157, 120, 74, 58, 1, 223,
+ 157, 124, 74, 58, 1, 223, 157, 245, 31, 78, 58, 1, 223, 157, 235, 193,
+ 245, 31, 78, 58, 1, 121, 235, 193, 245, 31, 78, 58, 1, 218, 111, 22, 125,
+ 216, 30, 58, 1, 218, 111, 22, 121, 216, 30, 7, 6, 1, 245, 199, 254, 170,
+ 7, 4, 1, 245, 199, 254, 170, 7, 6, 1, 245, 199, 254, 196, 7, 4, 1, 245,
+ 199, 254, 196, 7, 6, 1, 241, 207, 7, 4, 1, 241, 207, 7, 6, 1, 215, 40, 7,
+ 4, 1, 215, 40, 7, 6, 1, 215, 229, 7, 4, 1, 215, 229, 7, 6, 1, 249, 110,
+ 7, 4, 1, 249, 110, 7, 6, 1, 249, 111, 2, 249, 219, 7, 4, 1, 249, 111, 2,
+ 249, 219, 7, 1, 4, 6, 245, 6, 7, 1, 4, 6, 222, 91, 7, 6, 1, 255, 73, 7,
+ 4, 1, 255, 73, 7, 6, 1, 254, 73, 7, 4, 1, 254, 73, 7, 6, 1, 253, 192, 7,
+ 4, 1, 253, 192, 7, 6, 1, 253, 176, 7, 4, 1, 253, 176, 7, 6, 1, 253, 177,
+ 2, 203, 130, 7, 4, 1, 253, 177, 2, 203, 130, 7, 6, 1, 253, 167, 7, 4, 1,
+ 253, 167, 7, 6, 1, 223, 49, 251, 67, 2, 247, 120, 7, 4, 1, 223, 49, 251,
+ 67, 2, 247, 120, 7, 6, 1, 235, 24, 2, 91, 7, 4, 1, 235, 24, 2, 91, 7, 6,
+ 1, 235, 24, 2, 247, 255, 91, 7, 4, 1, 235, 24, 2, 247, 255, 91, 7, 6, 1,
+ 235, 24, 2, 218, 103, 22, 247, 255, 91, 7, 4, 1, 235, 24, 2, 218, 103,
+ 22, 247, 255, 91, 7, 6, 1, 251, 135, 156, 7, 4, 1, 251, 135, 156, 7, 6,
+ 1, 233, 149, 2, 125, 91, 7, 4, 1, 233, 149, 2, 125, 91, 7, 6, 1, 144, 2,
+ 199, 218, 103, 226, 120, 7, 4, 1, 144, 2, 199, 218, 103, 226, 120, 7, 6,
+ 1, 144, 2, 232, 123, 7, 4, 1, 144, 2, 232, 123, 7, 6, 1, 226, 183, 7, 4,
+ 1, 226, 183, 7, 6, 1, 226, 106, 2, 218, 103, 216, 139, 248, 39, 7, 4, 1,
+ 226, 106, 2, 218, 103, 216, 139, 248, 39, 7, 6, 1, 226, 106, 2, 244, 53,
+ 7, 4, 1, 226, 106, 2, 244, 53, 7, 6, 1, 226, 106, 2, 218, 229, 217, 77,
+ 7, 4, 1, 226, 106, 2, 218, 229, 217, 77, 7, 6, 1, 224, 97, 2, 218, 103,
+ 216, 139, 248, 39, 7, 4, 1, 224, 97, 2, 218, 103, 216, 139, 248, 39, 7,
+ 6, 1, 224, 97, 2, 247, 255, 91, 7, 4, 1, 224, 97, 2, 247, 255, 91, 7, 6,
+ 1, 223, 224, 222, 186, 7, 4, 1, 223, 224, 222, 186, 7, 6, 1, 222, 130,
+ 222, 186, 7, 4, 1, 222, 130, 222, 186, 7, 6, 1, 214, 106, 2, 247, 255,
+ 91, 7, 4, 1, 214, 106, 2, 247, 255, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212,
+ 106, 7, 6, 1, 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1,
+ 216, 152, 2, 91, 7, 4, 1, 216, 152, 2, 91, 7, 6, 1, 216, 152, 2, 218,
+ 103, 216, 139, 248, 39, 7, 4, 1, 216, 152, 2, 218, 103, 216, 139, 248,
+ 39, 7, 6, 1, 213, 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 65, 7, 4, 1, 245,
+ 65, 7, 6, 1, 235, 171, 7, 4, 1, 235, 171, 7, 6, 1, 249, 207, 7, 4, 1,
+ 249, 207, 58, 1, 214, 133, 7, 4, 1, 246, 69, 7, 4, 1, 232, 84, 7, 4, 1,
+ 230, 80, 7, 4, 1, 227, 201, 7, 4, 1, 222, 129, 7, 1, 4, 6, 222, 129, 7,
+ 4, 1, 215, 108, 7, 4, 1, 214, 197, 7, 6, 1, 235, 213, 249, 60, 7, 4, 1,
+ 235, 213, 249, 60, 7, 6, 1, 235, 213, 245, 6, 7, 4, 1, 235, 213, 245, 6,
+ 7, 6, 1, 235, 213, 243, 202, 7, 6, 1, 215, 94, 235, 213, 243, 202, 7, 4,
+ 1, 215, 94, 235, 213, 243, 202, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94,
+ 156, 7, 6, 1, 235, 213, 153, 7, 4, 1, 235, 213, 153, 7, 6, 1, 235, 213,
+ 222, 91, 7, 4, 1, 235, 213, 222, 91, 7, 6, 1, 235, 213, 217, 152, 7, 4,
+ 1, 235, 213, 217, 152, 58, 1, 121, 250, 31, 255, 14, 58, 1, 249, 226, 58,
+ 1, 219, 251, 245, 98, 50, 7, 6, 1, 221, 255, 7, 4, 1, 221, 255, 7, 6, 1,
+ 215, 94, 242, 60, 7, 4, 1, 233, 149, 2, 223, 55, 241, 52, 22, 252, 41, 7,
+ 6, 1, 230, 26, 2, 248, 39, 7, 4, 1, 230, 26, 2, 248, 39, 7, 6, 1, 251,
+ 67, 2, 130, 7, 4, 1, 251, 67, 2, 130, 7, 6, 1, 243, 203, 2, 226, 248, 91,
+ 7, 4, 1, 243, 203, 2, 226, 248, 91, 7, 6, 1, 235, 24, 2, 226, 248, 91, 7,
+ 4, 1, 235, 24, 2, 226, 248, 91, 7, 6, 1, 230, 26, 2, 226, 248, 91, 7, 4,
+ 1, 230, 26, 2, 226, 248, 91, 7, 6, 1, 223, 224, 2, 226, 248, 91, 7, 4, 1,
+ 223, 224, 2, 226, 248, 91, 7, 6, 1, 222, 92, 2, 226, 248, 91, 7, 4, 1,
+ 222, 92, 2, 226, 248, 91, 7, 6, 1, 242, 61, 2, 103, 58, 1, 6, 242, 61, 2,
+ 91, 58, 1, 4, 27, 226, 234, 7, 1, 4, 6, 215, 94, 193, 7, 245, 103, 1,
+ 223, 49, 245, 6, 7, 245, 103, 1, 223, 49, 226, 105, 7, 245, 103, 1, 235,
+ 193, 193, 7, 245, 103, 1, 240, 154, 232, 129, 7, 245, 103, 1, 254, 23,
+ 193, 217, 230, 229, 214, 1, 61, 217, 230, 229, 214, 1, 73, 217, 230, 229,
+ 214, 5, 246, 48, 217, 230, 229, 214, 1, 70, 217, 230, 229, 214, 1, 75,
+ 217, 230, 229, 214, 1, 76, 217, 230, 229, 214, 5, 241, 253, 217, 230,
+ 229, 214, 1, 234, 28, 217, 230, 229, 214, 1, 234, 105, 217, 230, 229,
+ 214, 1, 242, 174, 217, 230, 229, 214, 1, 242, 224, 217, 230, 229, 214, 5,
+ 254, 75, 217, 230, 229, 214, 1, 249, 238, 217, 230, 229, 214, 1, 250, 86,
+ 217, 230, 229, 214, 1, 235, 68, 217, 230, 229, 214, 1, 235, 109, 217,
+ 230, 229, 214, 1, 215, 133, 217, 230, 229, 214, 1, 215, 139, 217, 230,
+ 229, 214, 1, 248, 105, 217, 230, 229, 214, 1, 248, 114, 217, 230, 229,
+ 214, 1, 111, 217, 230, 229, 214, 1, 216, 156, 217, 230, 229, 214, 1, 247,
+ 145, 217, 230, 229, 214, 1, 248, 7, 217, 230, 229, 214, 1, 228, 74, 217,
+ 230, 229, 214, 1, 225, 16, 217, 230, 229, 214, 1, 225, 121, 217, 230,
+ 229, 214, 1, 251, 205, 217, 230, 229, 214, 1, 252, 10, 217, 230, 229,
+ 214, 1, 230, 161, 217, 230, 229, 214, 1, 222, 211, 217, 230, 229, 214, 1,
+ 232, 156, 217, 230, 229, 214, 1, 222, 165, 217, 230, 229, 214, 1, 219,
+ 58, 217, 230, 229, 214, 1, 241, 68, 217, 230, 229, 214, 25, 5, 61, 217,
+ 230, 229, 214, 25, 5, 73, 217, 230, 229, 214, 25, 5, 70, 217, 230, 229,
+ 214, 25, 5, 75, 217, 230, 229, 214, 25, 5, 226, 183, 217, 230, 229, 214,
+ 225, 12, 231, 158, 217, 230, 229, 214, 225, 12, 231, 157, 217, 230, 229,
+ 214, 225, 12, 231, 156, 217, 230, 229, 214, 225, 12, 231, 155, 228, 56,
+ 235, 240, 244, 2, 123, 224, 21, 228, 56, 235, 240, 244, 2, 123, 242, 27,
+ 228, 56, 235, 240, 244, 2, 134, 224, 19, 228, 56, 235, 240, 244, 2, 123,
+ 219, 117, 228, 56, 235, 240, 244, 2, 123, 245, 188, 228, 56, 235, 240,
+ 244, 2, 134, 219, 116, 228, 56, 235, 240, 224, 22, 78, 228, 56, 235, 240,
+ 225, 40, 78, 228, 56, 235, 240, 222, 118, 78, 228, 56, 235, 240, 224, 23,
+ 78, 225, 144, 1, 176, 225, 144, 1, 234, 132, 225, 144, 1, 243, 135, 225,
+ 144, 1, 229, 77, 225, 144, 1, 251, 33, 225, 144, 1, 250, 157, 225, 144,
+ 1, 235, 141, 225, 144, 1, 227, 165, 225, 144, 1, 217, 105, 225, 144, 1,
+ 216, 208, 225, 144, 1, 248, 221, 225, 144, 1, 197, 225, 144, 1, 190, 225,
+ 144, 1, 225, 147, 225, 144, 1, 252, 191, 225, 144, 1, 184, 225, 144, 1,
+ 215, 183, 225, 144, 1, 215, 175, 225, 144, 1, 246, 38, 225, 144, 1, 212,
+ 65, 225, 144, 1, 210, 82, 225, 144, 1, 210, 116, 225, 144, 1, 4, 61, 225,
+ 144, 1, 191, 225, 144, 1, 205, 225, 144, 1, 233, 135, 225, 144, 1, 220,
+ 102, 225, 144, 1, 206, 225, 144, 1, 162, 225, 144, 1, 61, 225, 144, 1,
+ 73, 225, 144, 1, 70, 225, 144, 1, 75, 225, 144, 1, 76, 225, 144, 1, 224,
+ 88, 225, 144, 1, 211, 165, 225, 144, 1, 244, 196, 225, 144, 1, 243, 29,
+ 225, 144, 1, 245, 209, 225, 144, 218, 73, 1, 212, 65, 225, 144, 218, 73,
+ 1, 191, 225, 144, 1, 215, 156, 225, 144, 1, 215, 144, 225, 144, 1, 248,
+ 135, 225, 144, 1, 228, 110, 225, 144, 1, 254, 141, 191, 225, 144, 1, 213,
+ 134, 220, 102, 225, 144, 1, 213, 135, 162, 225, 144, 1, 253, 223, 244,
+ 196, 225, 144, 218, 73, 1, 205, 225, 144, 218, 25, 1, 205, 225, 144, 1,
+ 250, 255, 225, 144, 219, 155, 241, 236, 78, 225, 144, 52, 241, 236, 78,
+ 225, 144, 164, 220, 95, 225, 144, 164, 52, 220, 95, 179, 5, 254, 75, 179,
+ 5, 213, 147, 179, 1, 61, 179, 1, 255, 73, 179, 1, 73, 179, 1, 236, 33,
+ 179, 1, 70, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 180,
+ 179, 1, 149, 156, 179, 1, 149, 232, 185, 179, 1, 75, 179, 1, 245, 209,
+ 179, 1, 254, 201, 179, 1, 76, 179, 1, 226, 183, 179, 1, 253, 192, 179, 1,
+ 176, 179, 1, 234, 132, 179, 1, 243, 135, 179, 1, 242, 249, 179, 1, 229,
+ 77, 179, 1, 251, 33, 179, 1, 250, 157, 179, 1, 235, 141, 179, 1, 235,
+ 114, 179, 1, 227, 165, 179, 1, 215, 156, 179, 1, 215, 144, 179, 1, 248,
+ 135, 179, 1, 248, 119, 179, 1, 228, 110, 179, 1, 217, 105, 179, 1, 216,
+ 208, 179, 1, 248, 221, 179, 1, 248, 25, 179, 1, 197, 179, 1, 190, 179, 1,
+ 225, 147, 179, 1, 252, 191, 179, 1, 252, 18, 179, 1, 184, 179, 1, 191,
+ 179, 1, 205, 179, 1, 233, 135, 179, 1, 214, 27, 179, 1, 220, 102, 179, 1,
+ 218, 223, 179, 1, 206, 179, 1, 162, 179, 1, 232, 184, 179, 116, 5, 242,
+ 44, 179, 25, 5, 255, 73, 179, 25, 5, 73, 179, 25, 5, 236, 33, 179, 25, 5,
+ 70, 179, 25, 5, 214, 118, 179, 25, 5, 149, 153, 179, 25, 5, 149, 222,
+ 180, 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 185, 179, 25, 5, 75,
+ 179, 25, 5, 245, 209, 179, 25, 5, 254, 201, 179, 25, 5, 76, 179, 25, 5,
+ 226, 183, 179, 25, 5, 253, 192, 179, 5, 213, 152, 179, 248, 178, 179, 52,
+ 248, 178, 179, 21, 210, 86, 179, 21, 110, 179, 21, 105, 179, 21, 158,
+ 179, 21, 161, 179, 21, 189, 179, 21, 194, 179, 21, 198, 179, 21, 195,
+ 179, 21, 200, 38, 84, 21, 210, 86, 38, 84, 21, 110, 38, 84, 21, 105, 38,
+ 84, 21, 158, 38, 84, 21, 161, 38, 84, 21, 189, 38, 84, 21, 194, 38, 84,
+ 21, 198, 38, 84, 21, 195, 38, 84, 21, 200, 38, 84, 1, 61, 38, 84, 1, 70,
+ 38, 84, 1, 176, 38, 84, 1, 197, 38, 84, 1, 190, 38, 84, 1, 205, 38, 84,
+ 1, 213, 176, 38, 84, 5, 253, 175, 84, 5, 219, 17, 250, 255, 84, 5, 251,
+ 0, 213, 152, 84, 5, 52, 251, 0, 213, 152, 84, 5, 251, 0, 105, 84, 5, 251,
+ 0, 158, 84, 5, 251, 0, 253, 175, 84, 5, 224, 124, 84, 243, 100, 244, 103,
+ 84, 250, 238, 84, 241, 230, 234, 188, 232, 242, 21, 210, 86, 234, 188,
+ 232, 242, 21, 110, 234, 188, 232, 242, 21, 105, 234, 188, 232, 242, 21,
+ 158, 234, 188, 232, 242, 21, 161, 234, 188, 232, 242, 21, 189, 234, 188,
+ 232, 242, 21, 194, 234, 188, 232, 242, 21, 198, 234, 188, 232, 242, 21,
+ 195, 234, 188, 232, 242, 21, 200, 234, 188, 232, 242, 1, 176, 234, 188,
+ 232, 242, 1, 234, 132, 234, 188, 232, 242, 1, 243, 135, 234, 188, 232,
+ 242, 1, 229, 77, 234, 188, 232, 242, 1, 206, 234, 188, 232, 242, 1, 220,
+ 102, 234, 188, 232, 242, 1, 210, 116, 234, 188, 232, 242, 1, 227, 165,
+ 234, 188, 232, 242, 1, 217, 105, 234, 188, 232, 242, 1, 240, 226, 234,
+ 188, 232, 242, 1, 197, 234, 188, 232, 242, 1, 190, 234, 188, 232, 242, 1,
+ 225, 147, 234, 188, 232, 242, 1, 184, 234, 188, 232, 242, 1, 248, 221,
+ 234, 188, 232, 242, 1, 252, 191, 234, 188, 232, 242, 1, 205, 234, 188,
+ 232, 242, 1, 191, 234, 188, 232, 242, 1, 233, 135, 234, 188, 232, 242, 1,
+ 212, 65, 234, 188, 232, 242, 1, 216, 208, 234, 188, 232, 242, 1, 162,
+ 234, 188, 232, 242, 1, 214, 27, 234, 188, 232, 242, 1, 251, 33, 234, 188,
+ 232, 242, 1, 61, 234, 188, 232, 242, 1, 226, 234, 234, 188, 232, 242, 1,
+ 73, 234, 188, 232, 242, 1, 226, 183, 234, 188, 232, 242, 25, 214, 214,
+ 234, 188, 232, 242, 25, 75, 234, 188, 232, 242, 25, 70, 234, 188, 232,
+ 242, 25, 245, 209, 234, 188, 232, 242, 25, 76, 234, 188, 232, 242, 138,
+ 225, 30, 234, 188, 232, 242, 138, 251, 12, 234, 188, 232, 242, 138, 251,
+ 13, 225, 30, 234, 188, 232, 242, 5, 249, 77, 234, 188, 232, 242, 5, 219,
+ 199, 223, 93, 1, 176, 223, 93, 1, 243, 135, 223, 93, 1, 229, 77, 223, 93,
+ 1, 217, 105, 223, 93, 1, 248, 221, 223, 93, 1, 197, 223, 93, 1, 190, 223,
+ 93, 1, 252, 191, 223, 93, 1, 184, 223, 93, 1, 251, 33, 223, 93, 1, 235,
+ 141, 223, 93, 1, 227, 165, 223, 93, 1, 206, 223, 93, 1, 205, 223, 93, 1,
+ 233, 135, 223, 93, 1, 191, 223, 93, 1, 212, 65, 223, 93, 1, 162, 223, 93,
+ 1, 231, 124, 223, 93, 1, 229, 56, 223, 93, 1, 229, 148, 223, 93, 1, 227,
+ 135, 223, 93, 1, 61, 223, 93, 25, 5, 73, 223, 93, 25, 5, 70, 223, 93, 25,
+ 5, 75, 223, 93, 25, 5, 254, 201, 223, 93, 25, 5, 76, 223, 93, 25, 5, 253,
+ 192, 223, 93, 25, 5, 245, 55, 223, 93, 25, 5, 245, 233, 223, 93, 116, 5,
+ 229, 79, 223, 93, 116, 5, 230, 25, 223, 93, 116, 5, 153, 223, 93, 116, 5,
+ 242, 60, 223, 93, 213, 152, 223, 93, 221, 173, 78, 24, 100, 216, 97, 24,
+ 100, 216, 96, 24, 100, 216, 94, 24, 100, 216, 99, 24, 100, 223, 21, 24,
+ 100, 223, 5, 24, 100, 223, 0, 24, 100, 223, 2, 24, 100, 223, 18, 24, 100,
+ 223, 11, 24, 100, 223, 4, 24, 100, 223, 23, 24, 100, 223, 6, 24, 100,
+ 223, 25, 24, 100, 223, 22, 24, 100, 230, 213, 24, 100, 230, 204, 24, 100,
+ 230, 207, 24, 100, 225, 80, 24, 100, 225, 91, 24, 100, 225, 92, 24, 100,
+ 218, 207, 24, 100, 236, 46, 24, 100, 236, 53, 24, 100, 218, 218, 24, 100,
+ 218, 205, 24, 100, 225, 130, 24, 100, 241, 167, 24, 100, 218, 202, 155,
+ 5, 226, 27, 155, 5, 250, 187, 155, 5, 233, 66, 155, 5, 211, 243, 155, 1,
+ 61, 155, 1, 240, 154, 234, 191, 155, 1, 73, 155, 1, 236, 33, 155, 1, 70,
+ 155, 1, 226, 90, 250, 163, 155, 1, 229, 78, 233, 28, 155, 1, 229, 78,
+ 233, 29, 223, 142, 155, 1, 75, 155, 1, 254, 201, 155, 1, 76, 155, 1, 176,
+ 155, 1, 235, 13, 221, 228, 155, 1, 235, 13, 230, 66, 155, 1, 243, 135,
+ 155, 1, 243, 136, 230, 66, 155, 1, 229, 77, 155, 1, 251, 33, 155, 1, 251,
+ 34, 230, 66, 155, 1, 235, 141, 155, 1, 227, 166, 230, 66, 155, 1, 235,
+ 142, 231, 207, 155, 1, 227, 165, 155, 1, 215, 156, 155, 1, 215, 157, 231,
+ 207, 155, 1, 248, 135, 155, 1, 248, 136, 231, 207, 155, 1, 229, 229, 230,
+ 66, 155, 1, 217, 105, 155, 1, 217, 106, 230, 66, 155, 1, 248, 221, 155,
+ 1, 248, 222, 231, 207, 155, 1, 197, 155, 1, 190, 155, 1, 226, 90, 230,
+ 66, 155, 1, 252, 191, 155, 1, 252, 192, 230, 66, 155, 1, 184, 155, 1,
+ 191, 155, 1, 205, 155, 1, 223, 188, 254, 210, 155, 1, 233, 135, 155, 1,
+ 212, 65, 155, 1, 222, 34, 230, 66, 155, 1, 222, 34, 231, 207, 155, 1,
+ 206, 155, 1, 162, 155, 5, 250, 188, 216, 250, 155, 25, 5, 217, 47, 155,
+ 25, 5, 216, 35, 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 69, 155,
+ 25, 5, 218, 47, 155, 25, 5, 218, 48, 231, 57, 155, 25, 5, 217, 65, 155,
+ 25, 5, 247, 194, 230, 65, 155, 25, 5, 225, 184, 155, 116, 5, 234, 158,
+ 155, 116, 5, 225, 196, 155, 116, 5, 251, 19, 155, 226, 40, 155, 43, 223,
+ 69, 155, 44, 223, 69, 155, 226, 79, 254, 117, 155, 226, 79, 231, 224,
+ 155, 226, 79, 232, 88, 155, 226, 79, 211, 238, 155, 226, 79, 226, 41,
+ 155, 226, 79, 232, 205, 155, 226, 79, 232, 82, 155, 226, 79, 254, 249,
+ 155, 226, 79, 254, 250, 254, 249, 155, 226, 79, 225, 51, 155, 215, 94,
+ 226, 79, 225, 51, 155, 226, 36, 155, 21, 210, 86, 155, 21, 110, 155, 21,
+ 105, 155, 21, 158, 155, 21, 161, 155, 21, 189, 155, 21, 194, 155, 21,
+ 198, 155, 21, 195, 155, 21, 200, 155, 226, 79, 216, 69, 215, 106, 155,
+ 226, 79, 235, 167, 172, 1, 61, 172, 1, 73, 172, 1, 70, 172, 1, 75, 172,
+ 1, 254, 201, 172, 1, 76, 172, 1, 176, 172, 1, 234, 132, 172, 1, 243, 135,
+ 172, 1, 242, 249, 172, 1, 228, 245, 172, 1, 229, 77, 172, 1, 250, 157,
+ 172, 1, 250, 112, 172, 1, 235, 141, 172, 1, 235, 114, 172, 1, 228, 235,
+ 172, 1, 228, 237, 172, 1, 228, 236, 172, 1, 217, 105, 172, 1, 216, 208,
+ 172, 1, 248, 221, 172, 1, 248, 25, 172, 1, 227, 207, 172, 1, 197, 172, 1,
+ 248, 135, 172, 1, 190, 172, 1, 224, 220, 172, 1, 225, 147, 172, 1, 252,
+ 191, 172, 1, 252, 18, 172, 1, 230, 95, 172, 1, 184, 172, 1, 252, 111,
+ 172, 1, 191, 172, 1, 205, 172, 1, 233, 135, 172, 1, 214, 27, 172, 1, 218,
+ 223, 172, 1, 206, 172, 1, 162, 172, 25, 5, 255, 73, 172, 25, 5, 73, 172,
+ 25, 5, 236, 33, 172, 25, 5, 245, 195, 172, 25, 5, 70, 172, 25, 5, 226,
+ 234, 172, 25, 5, 76, 172, 25, 5, 254, 201, 172, 25, 5, 253, 192, 172, 25,
+ 5, 214, 214, 172, 116, 5, 191, 172, 116, 5, 205, 172, 116, 5, 233, 135,
+ 172, 116, 5, 212, 65, 172, 1, 40, 235, 23, 172, 1, 40, 243, 202, 172, 1,
+ 40, 229, 79, 172, 116, 5, 40, 229, 79, 172, 1, 40, 250, 158, 172, 1, 40,
+ 217, 152, 172, 1, 40, 230, 25, 172, 1, 40, 226, 105, 172, 1, 40, 211,
+ 117, 172, 1, 40, 153, 172, 1, 40, 156, 172, 1, 40, 218, 226, 172, 116, 5,
+ 40, 193, 172, 116, 5, 40, 242, 60, 172, 21, 210, 86, 172, 21, 110, 172,
+ 21, 105, 172, 21, 158, 172, 21, 161, 172, 21, 189, 172, 21, 194, 172, 21,
+ 198, 172, 21, 195, 172, 21, 200, 172, 224, 141, 218, 251, 172, 224, 141,
+ 248, 178, 172, 224, 141, 52, 248, 178, 172, 224, 141, 215, 211, 248, 178,
+ 68, 1, 234, 126, 243, 135, 68, 1, 234, 126, 251, 33, 68, 1, 234, 126,
+ 250, 157, 68, 1, 234, 126, 235, 141, 68, 1, 234, 126, 235, 114, 68, 1,
+ 234, 126, 227, 165, 68, 1, 234, 126, 215, 156, 68, 1, 234, 126, 215, 144,
+ 68, 1, 234, 126, 248, 135, 68, 1, 234, 126, 248, 119, 68, 1, 234, 126,
+ 248, 25, 68, 1, 234, 126, 197, 68, 1, 234, 126, 206, 68, 1, 234, 126,
+ 162, 68, 1, 234, 126, 241, 189, 68, 1, 234, 126, 244, 196, 68, 58, 1,
+ 234, 126, 223, 109, 68, 1, 234, 126, 211, 165, 68, 1, 234, 126, 210, 116,
+ 68, 1, 234, 126, 205, 68, 232, 145, 234, 126, 226, 253, 68, 232, 145,
+ 234, 126, 224, 43, 68, 232, 145, 234, 126, 241, 121, 68, 16, 254, 190,
+ 245, 30, 68, 16, 254, 190, 110, 68, 16, 254, 190, 105, 68, 1, 254, 190,
+ 205, 68, 5, 226, 23, 234, 213, 216, 30, 39, 208, 1, 121, 234, 28, 39,
+ 208, 1, 125, 234, 28, 39, 208, 1, 121, 234, 105, 39, 208, 1, 125, 234,
+ 105, 39, 208, 1, 121, 234, 114, 39, 208, 1, 125, 234, 114, 39, 208, 1,
+ 121, 242, 174, 39, 208, 1, 125, 242, 174, 39, 208, 1, 121, 229, 4, 39,
+ 208, 1, 125, 229, 4, 39, 208, 1, 121, 249, 238, 39, 208, 1, 125, 249,
+ 238, 39, 208, 1, 121, 250, 86, 39, 208, 1, 125, 250, 86, 39, 208, 1, 121,
+ 219, 58, 39, 208, 1, 125, 219, 58, 39, 208, 1, 121, 227, 134, 39, 208, 1,
+ 125, 227, 134, 39, 208, 1, 121, 247, 145, 39, 208, 1, 125, 247, 145, 39,
+ 208, 1, 121, 111, 39, 208, 1, 125, 111, 39, 208, 1, 121, 216, 156, 39,
+ 208, 1, 125, 216, 156, 39, 208, 1, 121, 228, 74, 39, 208, 1, 125, 228,
+ 74, 39, 208, 1, 121, 251, 205, 39, 208, 1, 125, 251, 205, 39, 208, 1,
+ 121, 225, 16, 39, 208, 1, 125, 225, 16, 39, 208, 1, 121, 225, 121, 39,
+ 208, 1, 125, 225, 121, 39, 208, 1, 121, 244, 43, 39, 208, 1, 125, 244,
+ 43, 39, 208, 1, 121, 230, 161, 39, 208, 1, 125, 230, 161, 39, 208, 1,
+ 121, 210, 244, 39, 208, 1, 125, 210, 244, 39, 208, 1, 121, 222, 211, 39,
+ 208, 1, 125, 222, 211, 39, 208, 1, 121, 232, 156, 39, 208, 1, 125, 232,
+ 156, 39, 208, 1, 121, 213, 138, 39, 208, 1, 125, 213, 138, 39, 208, 1,
+ 121, 241, 68, 39, 208, 1, 125, 241, 68, 39, 208, 1, 121, 76, 39, 208, 1,
+ 125, 76, 39, 208, 231, 204, 234, 230, 39, 208, 25, 255, 73, 39, 208, 25,
+ 73, 39, 208, 25, 214, 214, 39, 208, 25, 70, 39, 208, 25, 75, 39, 208, 25,
+ 76, 39, 208, 231, 204, 234, 108, 39, 208, 25, 240, 119, 39, 208, 25, 214,
+ 213, 39, 208, 25, 214, 229, 39, 208, 25, 253, 190, 39, 208, 25, 253, 167,
+ 39, 208, 25, 254, 123, 39, 208, 25, 254, 136, 39, 208, 138, 231, 204,
+ 245, 180, 39, 208, 138, 231, 204, 227, 206, 39, 208, 138, 231, 204, 216,
+ 156, 39, 208, 138, 231, 204, 219, 42, 39, 208, 16, 234, 13, 39, 208, 16,
+ 227, 206, 39, 208, 16, 221, 253, 39, 208, 16, 241, 69, 241, 64, 39, 208,
+ 16, 234, 22, 234, 21, 186, 185, 1, 75, 186, 185, 1, 76, 186, 185, 1, 250,
+ 157, 186, 185, 1, 227, 165, 186, 185, 1, 215, 156, 186, 185, 1, 215, 144,
+ 186, 185, 1, 248, 135, 186, 185, 1, 248, 119, 186, 185, 1, 228, 110, 186,
+ 185, 1, 220, 102, 186, 185, 1, 218, 223, 186, 185, 25, 5, 236, 33, 186,
+ 185, 25, 5, 214, 118, 186, 185, 25, 5, 255, 37, 186, 185, 25, 5, 253,
+ 192, 186, 185, 25, 5, 255, 30, 186, 185, 250, 125, 186, 185, 254, 206,
+ 234, 98, 186, 185, 254, 103, 186, 185, 3, 223, 74, 78, 186, 185, 211,
+ 209, 223, 74, 78, 186, 185, 25, 5, 213, 147, 186, 185, 213, 152, 29, 3,
+ 215, 137, 29, 3, 215, 140, 29, 3, 215, 143, 29, 3, 215, 141, 29, 3, 215,
+ 142, 29, 3, 215, 139, 29, 3, 248, 113, 29, 3, 248, 115, 29, 3, 248, 118,
+ 29, 3, 248, 116, 29, 3, 248, 117, 29, 3, 248, 114, 29, 3, 246, 28, 29, 3,
+ 246, 31, 29, 3, 246, 37, 29, 3, 246, 35, 29, 3, 246, 36, 29, 3, 246, 29,
+ 29, 3, 250, 204, 29, 3, 250, 198, 29, 3, 250, 200, 29, 3, 250, 203, 29,
+ 3, 250, 201, 29, 3, 250, 202, 29, 3, 250, 199, 29, 3, 252, 111, 29, 3,
+ 252, 90, 29, 3, 252, 102, 29, 3, 252, 110, 29, 3, 252, 105, 29, 3, 252,
+ 106, 29, 3, 252, 94, 186, 185, 1, 234, 19, 186, 185, 1, 221, 253, 186,
+ 185, 1, 233, 109, 186, 185, 1, 230, 172, 186, 185, 1, 190, 186, 185, 1,
+ 197, 186, 185, 1, 250, 102, 186, 185, 1, 216, 90, 186, 185, 1, 234, 101,
+ 186, 185, 1, 228, 250, 186, 185, 1, 216, 150, 186, 185, 1, 212, 60, 186,
+ 185, 1, 211, 69, 186, 185, 1, 240, 216, 186, 185, 1, 214, 190, 186, 185,
+ 1, 73, 186, 185, 1, 225, 142, 186, 185, 1, 253, 202, 186, 185, 1, 242,
+ 167, 186, 185, 1, 235, 112, 186, 185, 1, 223, 166, 186, 185, 1, 252, 191,
+ 186, 185, 1, 235, 100, 186, 185, 1, 247, 219, 186, 185, 1, 242, 221, 186,
+ 185, 1, 248, 5, 186, 185, 1, 252, 16, 186, 185, 1, 234, 20, 232, 128,
+ 186, 185, 1, 233, 110, 232, 128, 186, 185, 1, 230, 173, 232, 128, 186,
+ 185, 1, 226, 90, 232, 128, 186, 185, 1, 229, 229, 232, 128, 186, 185, 1,
+ 216, 91, 232, 128, 186, 185, 1, 228, 251, 232, 128, 186, 185, 1, 240,
+ 154, 232, 128, 186, 185, 25, 5, 226, 195, 186, 185, 25, 5, 235, 253, 186,
+ 185, 25, 5, 254, 122, 186, 185, 25, 5, 211, 38, 186, 185, 25, 5, 219, 32,
+ 186, 185, 25, 5, 214, 187, 186, 185, 25, 5, 250, 123, 186, 185, 25, 5,
+ 227, 191, 186, 185, 250, 124, 186, 185, 232, 85, 235, 150, 186, 185, 254,
+ 46, 235, 150, 186, 185, 21, 210, 86, 186, 185, 21, 110, 186, 185, 21,
+ 105, 186, 185, 21, 158, 186, 185, 21, 161, 186, 185, 21, 189, 186, 185,
+ 21, 194, 186, 185, 21, 198, 186, 185, 21, 195, 186, 185, 21, 200, 24,
+ 143, 227, 77, 24, 143, 227, 82, 24, 143, 210, 243, 24, 143, 210, 242, 24,
+ 143, 210, 241, 24, 143, 215, 23, 24, 143, 215, 26, 24, 143, 210, 210, 24,
+ 143, 210, 206, 24, 143, 245, 54, 24, 143, 245, 52, 24, 143, 245, 53, 24,
+ 143, 245, 50, 24, 143, 240, 144, 24, 143, 240, 143, 24, 143, 240, 141,
+ 24, 143, 240, 142, 24, 143, 240, 147, 24, 143, 240, 140, 24, 143, 240,
+ 139, 24, 143, 240, 149, 24, 143, 254, 33, 24, 143, 254, 32, 24, 90, 228,
+ 219, 24, 90, 228, 225, 24, 90, 218, 204, 24, 90, 218, 203, 24, 90, 216,
+ 96, 24, 90, 216, 94, 24, 90, 216, 93, 24, 90, 216, 99, 24, 90, 216, 100,
+ 24, 90, 216, 92, 24, 90, 223, 5, 24, 90, 223, 20, 24, 90, 218, 210, 24,
+ 90, 223, 17, 24, 90, 223, 7, 24, 90, 223, 9, 24, 90, 222, 252, 24, 90,
+ 222, 253, 24, 90, 234, 218, 24, 90, 230, 212, 24, 90, 230, 206, 24, 90,
+ 218, 214, 24, 90, 230, 209, 24, 90, 230, 215, 24, 90, 225, 76, 24, 90,
+ 225, 85, 24, 90, 225, 89, 24, 90, 218, 212, 24, 90, 225, 79, 24, 90, 225,
+ 93, 24, 90, 225, 94, 24, 90, 219, 140, 24, 90, 219, 143, 24, 90, 218,
+ 208, 24, 90, 218, 206, 24, 90, 219, 138, 24, 90, 219, 146, 24, 90, 219,
+ 147, 24, 90, 219, 132, 24, 90, 219, 145, 24, 90, 226, 30, 24, 90, 226,
+ 31, 24, 90, 211, 24, 24, 90, 211, 25, 24, 90, 250, 44, 24, 90, 250, 43,
+ 24, 90, 218, 219, 24, 90, 225, 128, 24, 90, 225, 127, 9, 14, 238, 24, 9,
+ 14, 238, 23, 9, 14, 238, 22, 9, 14, 238, 21, 9, 14, 238, 20, 9, 14, 238,
+ 19, 9, 14, 238, 18, 9, 14, 238, 17, 9, 14, 238, 16, 9, 14, 238, 15, 9,
+ 14, 238, 14, 9, 14, 238, 13, 9, 14, 238, 12, 9, 14, 238, 11, 9, 14, 238,
+ 10, 9, 14, 238, 9, 9, 14, 238, 8, 9, 14, 238, 7, 9, 14, 238, 6, 9, 14,
+ 238, 5, 9, 14, 238, 4, 9, 14, 238, 3, 9, 14, 238, 2, 9, 14, 238, 1, 9,
+ 14, 238, 0, 9, 14, 237, 255, 9, 14, 237, 254, 9, 14, 237, 253, 9, 14,
+ 237, 252, 9, 14, 237, 251, 9, 14, 237, 250, 9, 14, 237, 249, 9, 14, 237,
+ 248, 9, 14, 237, 247, 9, 14, 237, 246, 9, 14, 237, 245, 9, 14, 237, 244,
+ 9, 14, 237, 243, 9, 14, 237, 242, 9, 14, 237, 241, 9, 14, 237, 240, 9,
+ 14, 237, 239, 9, 14, 237, 238, 9, 14, 237, 237, 9, 14, 237, 236, 9, 14,
+ 237, 235, 9, 14, 237, 234, 9, 14, 237, 233, 9, 14, 237, 232, 9, 14, 237,
+ 231, 9, 14, 237, 230, 9, 14, 237, 229, 9, 14, 237, 228, 9, 14, 237, 227,
+ 9, 14, 237, 226, 9, 14, 237, 225, 9, 14, 237, 224, 9, 14, 237, 223, 9,
+ 14, 237, 222, 9, 14, 237, 221, 9, 14, 237, 220, 9, 14, 237, 219, 9, 14,
+ 237, 218, 9, 14, 237, 217, 9, 14, 237, 216, 9, 14, 237, 215, 9, 14, 237,
+ 214, 9, 14, 237, 213, 9, 14, 237, 212, 9, 14, 237, 211, 9, 14, 237, 210,
+ 9, 14, 237, 209, 9, 14, 237, 208, 9, 14, 237, 207, 9, 14, 237, 206, 9,
+ 14, 237, 205, 9, 14, 237, 204, 9, 14, 237, 203, 9, 14, 237, 202, 9, 14,
+ 237, 201, 9, 14, 237, 200, 9, 14, 237, 199, 9, 14, 237, 198, 9, 14, 237,
+ 197, 9, 14, 237, 196, 9, 14, 237, 195, 9, 14, 237, 194, 9, 14, 237, 193,
+ 9, 14, 237, 192, 9, 14, 237, 191, 9, 14, 237, 190, 9, 14, 237, 189, 9,
+ 14, 237, 188, 9, 14, 237, 187, 9, 14, 237, 186, 9, 14, 237, 185, 9, 14,
+ 237, 184, 9, 14, 237, 183, 9, 14, 237, 182, 9, 14, 237, 181, 9, 14, 237,
+ 180, 9, 14, 237, 179, 9, 14, 237, 178, 9, 14, 237, 177, 9, 14, 237, 176,
+ 9, 14, 237, 175, 9, 14, 237, 174, 9, 14, 237, 173, 9, 14, 237, 172, 9,
+ 14, 237, 171, 9, 14, 237, 170, 9, 14, 237, 169, 9, 14, 237, 168, 9, 14,
+ 237, 167, 9, 14, 237, 166, 9, 14, 237, 165, 9, 14, 237, 164, 9, 14, 237,
+ 163, 9, 14, 237, 162, 9, 14, 237, 161, 9, 14, 237, 160, 9, 14, 237, 159,
+ 9, 14, 237, 158, 9, 14, 237, 157, 9, 14, 237, 156, 9, 14, 237, 155, 9,
+ 14, 237, 154, 9, 14, 237, 153, 9, 14, 237, 152, 9, 14, 237, 151, 9, 14,
+ 237, 150, 9, 14, 237, 149, 9, 14, 237, 148, 9, 14, 237, 147, 9, 14, 237,
+ 146, 9, 14, 237, 145, 9, 14, 237, 144, 9, 14, 237, 143, 9, 14, 237, 142,
+ 9, 14, 237, 141, 9, 14, 237, 140, 9, 14, 237, 139, 9, 14, 237, 138, 9,
+ 14, 237, 137, 9, 14, 237, 136, 9, 14, 237, 135, 9, 14, 237, 134, 9, 14,
+ 237, 133, 9, 14, 237, 132, 9, 14, 237, 131, 9, 14, 237, 130, 9, 14, 237,
+ 129, 9, 14, 237, 128, 9, 14, 237, 127, 9, 14, 237, 126, 9, 14, 237, 125,
+ 9, 14, 237, 124, 9, 14, 237, 123, 9, 14, 237, 122, 9, 14, 237, 121, 9,
+ 14, 237, 120, 9, 14, 237, 119, 9, 14, 237, 118, 9, 14, 237, 117, 9, 14,
+ 237, 116, 9, 14, 237, 115, 9, 14, 237, 114, 9, 14, 237, 113, 9, 14, 237,
+ 112, 9, 14, 237, 111, 9, 14, 237, 110, 9, 14, 237, 109, 9, 14, 237, 108,
+ 9, 14, 237, 107, 9, 14, 237, 106, 9, 14, 237, 105, 9, 14, 237, 104, 9,
+ 14, 237, 103, 9, 14, 237, 102, 9, 14, 237, 101, 9, 14, 237, 100, 9, 14,
+ 237, 99, 9, 14, 237, 98, 9, 14, 237, 97, 9, 14, 237, 96, 9, 14, 237, 95,
+ 9, 14, 237, 94, 9, 14, 237, 93, 9, 14, 237, 92, 9, 14, 237, 91, 9, 14,
+ 237, 90, 9, 14, 237, 89, 9, 14, 237, 88, 9, 14, 237, 87, 9, 14, 237, 86,
+ 9, 14, 237, 85, 9, 14, 237, 84, 9, 14, 237, 83, 9, 14, 237, 82, 9, 14,
+ 237, 81, 9, 14, 237, 80, 9, 14, 237, 79, 9, 14, 237, 78, 9, 14, 237, 77,
+ 9, 14, 237, 76, 9, 14, 237, 75, 9, 14, 237, 74, 9, 14, 237, 73, 9, 14,
+ 237, 72, 9, 14, 237, 71, 9, 14, 237, 70, 9, 14, 237, 69, 9, 14, 237, 68,
+ 9, 14, 237, 67, 9, 14, 237, 66, 9, 14, 237, 65, 9, 14, 237, 64, 9, 14,
+ 237, 63, 9, 14, 237, 62, 9, 14, 237, 61, 9, 14, 237, 60, 9, 14, 237, 59,
+ 9, 14, 237, 58, 9, 14, 237, 57, 9, 14, 237, 56, 9, 14, 237, 55, 9, 14,
+ 237, 54, 9, 14, 237, 53, 9, 14, 237, 52, 9, 14, 237, 51, 9, 14, 237, 50,
+ 9, 14, 237, 49, 9, 14, 237, 48, 9, 14, 237, 47, 9, 14, 237, 46, 9, 14,
+ 237, 45, 9, 14, 237, 44, 9, 14, 237, 43, 9, 14, 237, 42, 9, 14, 237, 41,
+ 9, 14, 237, 40, 9, 14, 237, 39, 9, 14, 237, 38, 9, 14, 237, 37, 9, 14,
+ 237, 36, 9, 14, 237, 35, 9, 14, 237, 34, 9, 14, 237, 33, 9, 14, 237, 32,
+ 9, 14, 237, 31, 9, 14, 237, 30, 9, 14, 237, 29, 9, 14, 237, 28, 9, 14,
+ 237, 27, 9, 14, 237, 26, 9, 14, 237, 25, 9, 14, 237, 24, 9, 14, 237, 23,
+ 9, 14, 237, 22, 9, 14, 237, 21, 9, 14, 237, 20, 9, 14, 237, 19, 9, 14,
+ 237, 18, 9, 14, 237, 17, 9, 14, 237, 16, 9, 14, 237, 15, 9, 14, 237, 14,
+ 9, 14, 237, 13, 9, 14, 237, 12, 9, 14, 237, 11, 9, 14, 237, 10, 9, 14,
+ 237, 9, 9, 14, 237, 8, 9, 14, 237, 7, 9, 14, 237, 6, 9, 14, 237, 5, 9,
+ 14, 237, 4, 9, 14, 237, 3, 9, 14, 237, 2, 9, 14, 237, 1, 9, 14, 237, 0,
+ 9, 14, 236, 255, 9, 14, 236, 254, 9, 14, 236, 253, 9, 14, 236, 252, 9,
+ 14, 236, 251, 9, 14, 236, 250, 9, 14, 236, 249, 9, 14, 236, 248, 9, 14,
+ 236, 247, 9, 14, 236, 246, 9, 14, 236, 245, 9, 14, 236, 244, 9, 14, 236,
+ 243, 9, 14, 236, 242, 9, 14, 236, 241, 9, 14, 236, 240, 9, 14, 236, 239,
+ 9, 14, 236, 238, 9, 14, 236, 237, 9, 14, 236, 236, 9, 14, 236, 235, 9,
+ 14, 236, 234, 9, 14, 236, 233, 9, 14, 236, 232, 9, 14, 236, 231, 9, 14,
+ 236, 230, 9, 14, 236, 229, 9, 14, 236, 228, 9, 14, 236, 227, 9, 14, 236,
+ 226, 9, 14, 236, 225, 9, 14, 236, 224, 9, 14, 236, 223, 9, 14, 236, 222,
+ 9, 14, 236, 221, 9, 14, 236, 220, 9, 14, 236, 219, 9, 14, 236, 218, 9,
+ 14, 236, 217, 9, 14, 236, 216, 9, 14, 236, 215, 9, 14, 236, 214, 9, 14,
+ 236, 213, 9, 14, 236, 212, 9, 14, 236, 211, 9, 14, 236, 210, 9, 14, 236,
+ 209, 9, 14, 236, 208, 9, 14, 236, 207, 9, 14, 236, 206, 9, 14, 236, 205,
+ 9, 14, 236, 204, 9, 14, 236, 203, 9, 14, 236, 202, 9, 14, 236, 201, 9,
+ 14, 236, 200, 9, 14, 236, 199, 9, 14, 236, 198, 9, 14, 236, 197, 9, 14,
+ 236, 196, 9, 14, 236, 195, 9, 14, 236, 194, 9, 14, 236, 193, 9, 14, 236,
+ 192, 9, 14, 236, 191, 9, 14, 236, 190, 9, 14, 236, 189, 9, 14, 236, 188,
+ 9, 14, 236, 187, 9, 14, 236, 186, 9, 14, 236, 185, 9, 14, 236, 184, 9,
+ 14, 236, 183, 9, 14, 236, 182, 9, 14, 236, 181, 9, 14, 236, 180, 9, 14,
+ 236, 179, 9, 14, 236, 178, 9, 14, 236, 177, 9, 14, 236, 176, 9, 14, 236,
+ 175, 9, 14, 236, 174, 9, 14, 236, 173, 9, 14, 236, 172, 9, 14, 236, 171,
+ 9, 14, 236, 170, 9, 14, 236, 169, 9, 14, 236, 168, 9, 14, 236, 167, 9,
+ 14, 236, 166, 9, 14, 236, 165, 9, 14, 236, 164, 9, 14, 236, 163, 9, 14,
+ 236, 162, 9, 14, 236, 161, 9, 14, 236, 160, 9, 14, 236, 159, 9, 14, 236,
+ 158, 9, 14, 236, 157, 9, 14, 236, 156, 9, 14, 236, 155, 9, 14, 236, 154,
+ 9, 14, 236, 153, 9, 14, 236, 152, 9, 14, 236, 151, 9, 14, 236, 150, 9,
+ 14, 236, 149, 9, 14, 236, 148, 9, 14, 236, 147, 9, 14, 236, 146, 9, 14,
+ 236, 145, 9, 14, 236, 144, 9, 14, 236, 143, 9, 14, 236, 142, 9, 14, 236,
+ 141, 9, 14, 236, 140, 9, 14, 236, 139, 9, 14, 236, 138, 9, 14, 236, 137,
+ 9, 14, 236, 136, 9, 14, 236, 135, 9, 14, 236, 134, 9, 14, 236, 133, 9,
+ 14, 236, 132, 9, 14, 236, 131, 9, 14, 236, 130, 9, 14, 236, 129, 9, 14,
+ 236, 128, 9, 14, 236, 127, 9, 14, 236, 126, 9, 14, 236, 125, 9, 14, 236,
+ 124, 9, 14, 236, 123, 9, 14, 236, 122, 9, 14, 236, 121, 9, 14, 236, 120,
+ 9, 14, 236, 119, 9, 14, 236, 118, 9, 14, 236, 117, 9, 14, 236, 116, 9,
+ 14, 236, 115, 9, 14, 236, 114, 9, 14, 236, 113, 9, 14, 236, 112, 9, 14,
+ 236, 111, 9, 14, 236, 110, 9, 14, 236, 109, 9, 14, 236, 108, 9, 14, 236,
+ 107, 9, 14, 236, 106, 9, 14, 236, 105, 9, 14, 236, 104, 9, 14, 236, 103,
+ 9, 14, 236, 102, 9, 14, 236, 101, 9, 14, 236, 100, 9, 14, 236, 99, 9, 14,
+ 236, 98, 9, 14, 236, 97, 9, 14, 236, 96, 9, 14, 236, 95, 9, 14, 236, 94,
+ 9, 14, 236, 93, 9, 14, 236, 92, 9, 14, 236, 91, 9, 14, 236, 90, 9, 14,
+ 236, 89, 9, 14, 236, 88, 9, 14, 236, 87, 9, 14, 236, 86, 9, 14, 236, 85,
+ 9, 14, 236, 84, 9, 14, 236, 83, 9, 14, 236, 82, 9, 14, 236, 81, 9, 14,
+ 236, 80, 9, 14, 236, 79, 9, 14, 236, 78, 9, 14, 236, 77, 9, 14, 236, 76,
+ 9, 14, 236, 75, 9, 14, 236, 74, 9, 14, 236, 73, 9, 14, 236, 72, 9, 14,
+ 236, 71, 9, 14, 236, 70, 9, 14, 236, 69, 9, 14, 236, 68, 9, 14, 236, 67,
+ 9, 14, 236, 66, 9, 14, 236, 65, 7, 4, 27, 244, 125, 7, 4, 27, 244, 121,
+ 7, 4, 27, 244, 76, 7, 4, 27, 244, 124, 7, 4, 27, 244, 123, 7, 4, 27, 199,
+ 222, 92, 217, 152, 7, 4, 27, 218, 168, 150, 4, 27, 231, 59, 228, 39, 150,
+ 4, 27, 231, 59, 245, 213, 150, 4, 27, 231, 59, 235, 227, 150, 4, 27, 213,
+ 180, 228, 39, 150, 4, 27, 231, 59, 211, 160, 94, 1, 210, 234, 2, 241,
+ 158, 94, 225, 11, 235, 50, 214, 11, 94, 27, 211, 6, 210, 234, 210, 234,
+ 225, 239, 94, 1, 254, 139, 253, 162, 94, 1, 211, 247, 254, 170, 94, 1,
+ 211, 247, 248, 189, 94, 1, 211, 247, 241, 238, 94, 1, 211, 247, 234, 250,
+ 94, 1, 211, 247, 233, 94, 94, 1, 211, 247, 40, 231, 65, 94, 1, 211, 247,
+ 223, 67, 94, 1, 211, 247, 217, 38, 94, 1, 254, 139, 96, 50, 94, 1, 220,
+ 21, 2, 220, 21, 247, 120, 94, 1, 220, 21, 2, 219, 159, 247, 120, 94, 1,
+ 220, 21, 2, 248, 208, 22, 220, 21, 247, 120, 94, 1, 220, 21, 2, 248, 208,
+ 22, 219, 159, 247, 120, 94, 1, 112, 2, 225, 239, 94, 1, 112, 2, 224, 76,
+ 94, 1, 112, 2, 231, 171, 94, 1, 252, 29, 2, 248, 207, 94, 1, 242, 202, 2,
+ 248, 207, 94, 1, 248, 190, 2, 248, 207, 94, 1, 241, 239, 2, 231, 171, 94,
+ 1, 214, 4, 2, 248, 207, 94, 1, 210, 98, 2, 248, 207, 94, 1, 216, 231, 2,
+ 248, 207, 94, 1, 210, 234, 2, 248, 207, 94, 1, 40, 234, 251, 2, 248, 207,
+ 94, 1, 234, 251, 2, 248, 207, 94, 1, 233, 95, 2, 248, 207, 94, 1, 231,
+ 66, 2, 248, 207, 94, 1, 227, 195, 2, 248, 207, 94, 1, 221, 250, 2, 248,
+ 207, 94, 1, 40, 225, 222, 2, 248, 207, 94, 1, 225, 222, 2, 248, 207, 94,
+ 1, 215, 180, 2, 248, 207, 94, 1, 224, 40, 2, 248, 207, 94, 1, 223, 68, 2,
+ 248, 207, 94, 1, 220, 21, 2, 248, 207, 94, 1, 217, 39, 2, 248, 207, 94,
+ 1, 214, 4, 2, 241, 61, 94, 1, 252, 29, 2, 223, 169, 94, 1, 234, 251, 2,
+ 223, 169, 94, 1, 225, 222, 2, 223, 169, 94, 27, 112, 233, 94, 10, 1, 112,
+ 212, 47, 53, 17, 10, 1, 112, 212, 47, 40, 17, 10, 1, 252, 65, 53, 17, 10,
+ 1, 252, 65, 40, 17, 10, 1, 252, 65, 65, 17, 10, 1, 252, 65, 147, 17, 10,
+ 1, 225, 206, 53, 17, 10, 1, 225, 206, 40, 17, 10, 1, 225, 206, 65, 17,
+ 10, 1, 225, 206, 147, 17, 10, 1, 252, 53, 53, 17, 10, 1, 252, 53, 40, 17,
+ 10, 1, 252, 53, 65, 17, 10, 1, 252, 53, 147, 17, 10, 1, 215, 147, 53, 17,
+ 10, 1, 215, 147, 40, 17, 10, 1, 215, 147, 65, 17, 10, 1, 215, 147, 147,
+ 17, 10, 1, 217, 6, 53, 17, 10, 1, 217, 6, 40, 17, 10, 1, 217, 6, 65, 17,
+ 10, 1, 217, 6, 147, 17, 10, 1, 215, 149, 53, 17, 10, 1, 215, 149, 40, 17,
+ 10, 1, 215, 149, 65, 17, 10, 1, 215, 149, 147, 17, 10, 1, 213, 249, 53,
+ 17, 10, 1, 213, 249, 40, 17, 10, 1, 213, 249, 65, 17, 10, 1, 213, 249,
+ 147, 17, 10, 1, 225, 204, 53, 17, 10, 1, 225, 204, 40, 17, 10, 1, 225,
+ 204, 65, 17, 10, 1, 225, 204, 147, 17, 10, 1, 246, 44, 53, 17, 10, 1,
+ 246, 44, 40, 17, 10, 1, 246, 44, 65, 17, 10, 1, 246, 44, 147, 17, 10, 1,
+ 227, 154, 53, 17, 10, 1, 227, 154, 40, 17, 10, 1, 227, 154, 65, 17, 10,
+ 1, 227, 154, 147, 17, 10, 1, 217, 27, 53, 17, 10, 1, 217, 27, 40, 17, 10,
+ 1, 217, 27, 65, 17, 10, 1, 217, 27, 147, 17, 10, 1, 217, 25, 53, 17, 10,
+ 1, 217, 25, 40, 17, 10, 1, 217, 25, 65, 17, 10, 1, 217, 25, 147, 17, 10,
+ 1, 248, 133, 53, 17, 10, 1, 248, 133, 40, 17, 10, 1, 248, 202, 53, 17,
+ 10, 1, 248, 202, 40, 17, 10, 1, 246, 71, 53, 17, 10, 1, 246, 71, 40, 17,
+ 10, 1, 248, 131, 53, 17, 10, 1, 248, 131, 40, 17, 10, 1, 235, 121, 53,
+ 17, 10, 1, 235, 121, 40, 17, 10, 1, 222, 172, 53, 17, 10, 1, 222, 172,
+ 40, 17, 10, 1, 234, 175, 53, 17, 10, 1, 234, 175, 40, 17, 10, 1, 234,
+ 175, 65, 17, 10, 1, 234, 175, 147, 17, 10, 1, 243, 123, 53, 17, 10, 1,
+ 243, 123, 40, 17, 10, 1, 243, 123, 65, 17, 10, 1, 243, 123, 147, 17, 10,
+ 1, 242, 102, 53, 17, 10, 1, 242, 102, 40, 17, 10, 1, 242, 102, 65, 17,
+ 10, 1, 242, 102, 147, 17, 10, 1, 229, 3, 53, 17, 10, 1, 229, 3, 40, 17,
+ 10, 1, 229, 3, 65, 17, 10, 1, 229, 3, 147, 17, 10, 1, 228, 63, 242, 219,
+ 53, 17, 10, 1, 228, 63, 242, 219, 40, 17, 10, 1, 222, 215, 53, 17, 10, 1,
+ 222, 215, 40, 17, 10, 1, 222, 215, 65, 17, 10, 1, 222, 215, 147, 17, 10,
+ 1, 241, 219, 2, 79, 77, 53, 17, 10, 1, 241, 219, 2, 79, 77, 40, 17, 10,
+ 1, 241, 219, 242, 172, 53, 17, 10, 1, 241, 219, 242, 172, 40, 17, 10, 1,
+ 241, 219, 242, 172, 65, 17, 10, 1, 241, 219, 242, 172, 147, 17, 10, 1,
+ 241, 219, 247, 142, 53, 17, 10, 1, 241, 219, 247, 142, 40, 17, 10, 1,
+ 241, 219, 247, 142, 65, 17, 10, 1, 241, 219, 247, 142, 147, 17, 10, 1,
+ 79, 252, 133, 53, 17, 10, 1, 79, 252, 133, 40, 17, 10, 1, 79, 252, 133,
+ 2, 202, 77, 53, 17, 10, 1, 79, 252, 133, 2, 202, 77, 40, 17, 10, 16, 59,
+ 48, 10, 16, 59, 51, 10, 16, 113, 170, 48, 10, 16, 113, 170, 51, 10, 16,
+ 134, 170, 48, 10, 16, 134, 170, 51, 10, 16, 134, 170, 225, 7, 246, 104,
+ 48, 10, 16, 134, 170, 225, 7, 246, 104, 51, 10, 16, 244, 11, 170, 48, 10,
+ 16, 244, 11, 170, 51, 10, 16, 52, 67, 252, 141, 51, 10, 16, 113, 170,
+ 213, 189, 48, 10, 16, 113, 170, 213, 189, 51, 10, 16, 222, 233, 10, 16,
+ 4, 217, 81, 48, 10, 16, 4, 217, 81, 51, 10, 1, 229, 80, 53, 17, 10, 1,
+ 229, 80, 40, 17, 10, 1, 229, 80, 65, 17, 10, 1, 229, 80, 147, 17, 10, 1,
+ 104, 53, 17, 10, 1, 104, 40, 17, 10, 1, 226, 235, 53, 17, 10, 1, 226,
+ 235, 40, 17, 10, 1, 210, 213, 53, 17, 10, 1, 210, 213, 40, 17, 10, 1,
+ 104, 2, 202, 77, 53, 17, 10, 1, 214, 0, 53, 17, 10, 1, 214, 0, 40, 17,
+ 10, 1, 234, 73, 226, 235, 53, 17, 10, 1, 234, 73, 226, 235, 40, 17, 10,
+ 1, 234, 73, 210, 213, 53, 17, 10, 1, 234, 73, 210, 213, 40, 17, 10, 1,
+ 160, 53, 17, 10, 1, 160, 40, 17, 10, 1, 160, 65, 17, 10, 1, 160, 147, 17,
+ 10, 1, 214, 207, 234, 186, 234, 73, 112, 231, 193, 65, 17, 10, 1, 214,
+ 207, 234, 186, 234, 73, 112, 231, 193, 147, 17, 10, 27, 79, 2, 202, 77,
+ 2, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 112, 40, 17, 10, 27, 79, 2,
+ 202, 77, 2, 254, 244, 53, 17, 10, 27, 79, 2, 202, 77, 2, 254, 244, 40,
+ 17, 10, 27, 79, 2, 202, 77, 2, 212, 31, 53, 17, 10, 27, 79, 2, 202, 77,
+ 2, 212, 31, 40, 17, 10, 27, 79, 2, 202, 77, 2, 104, 53, 17, 10, 27, 79,
+ 2, 202, 77, 2, 104, 40, 17, 10, 27, 79, 2, 202, 77, 2, 226, 235, 53, 17,
+ 10, 27, 79, 2, 202, 77, 2, 226, 235, 40, 17, 10, 27, 79, 2, 202, 77, 2,
+ 210, 213, 53, 17, 10, 27, 79, 2, 202, 77, 2, 210, 213, 40, 17, 10, 27,
+ 79, 2, 202, 77, 2, 160, 53, 17, 10, 27, 79, 2, 202, 77, 2, 160, 40, 17,
+ 10, 27, 79, 2, 202, 77, 2, 160, 65, 17, 10, 27, 214, 207, 234, 73, 79, 2,
+ 202, 77, 2, 112, 231, 193, 53, 17, 10, 27, 214, 207, 234, 73, 79, 2, 202,
+ 77, 2, 112, 231, 193, 40, 17, 10, 27, 214, 207, 234, 73, 79, 2, 202, 77,
+ 2, 112, 231, 193, 65, 17, 10, 1, 244, 168, 79, 53, 17, 10, 1, 244, 168,
+ 79, 40, 17, 10, 1, 244, 168, 79, 65, 17, 10, 1, 244, 168, 79, 147, 17,
+ 10, 27, 79, 2, 202, 77, 2, 151, 53, 17, 10, 27, 79, 2, 202, 77, 2, 122,
+ 53, 17, 10, 27, 79, 2, 202, 77, 2, 66, 53, 17, 10, 27, 79, 2, 202, 77, 2,
+ 112, 231, 193, 53, 17, 10, 27, 79, 2, 202, 77, 2, 79, 53, 17, 10, 27,
+ 252, 55, 2, 151, 53, 17, 10, 27, 252, 55, 2, 122, 53, 17, 10, 27, 252,
+ 55, 2, 234, 130, 53, 17, 10, 27, 252, 55, 2, 66, 53, 17, 10, 27, 252, 55,
+ 2, 112, 231, 193, 53, 17, 10, 27, 252, 55, 2, 79, 53, 17, 10, 27, 217, 8,
+ 2, 151, 53, 17, 10, 27, 217, 8, 2, 122, 53, 17, 10, 27, 217, 8, 2, 234,
+ 130, 53, 17, 10, 27, 217, 8, 2, 66, 53, 17, 10, 27, 217, 8, 2, 112, 231,
+ 193, 53, 17, 10, 27, 217, 8, 2, 79, 53, 17, 10, 27, 216, 193, 2, 151, 53,
+ 17, 10, 27, 216, 193, 2, 66, 53, 17, 10, 27, 216, 193, 2, 112, 231, 193,
+ 53, 17, 10, 27, 216, 193, 2, 79, 53, 17, 10, 27, 151, 2, 122, 53, 17, 10,
+ 27, 151, 2, 66, 53, 17, 10, 27, 122, 2, 151, 53, 17, 10, 27, 122, 2, 66,
+ 53, 17, 10, 27, 234, 130, 2, 151, 53, 17, 10, 27, 234, 130, 2, 122, 53,
+ 17, 10, 27, 234, 130, 2, 66, 53, 17, 10, 27, 221, 167, 2, 151, 53, 17,
+ 10, 27, 221, 167, 2, 122, 53, 17, 10, 27, 221, 167, 2, 234, 130, 53, 17,
+ 10, 27, 221, 167, 2, 66, 53, 17, 10, 27, 222, 27, 2, 122, 53, 17, 10, 27,
+ 222, 27, 2, 66, 53, 17, 10, 27, 248, 217, 2, 151, 53, 17, 10, 27, 248,
+ 217, 2, 122, 53, 17, 10, 27, 248, 217, 2, 234, 130, 53, 17, 10, 27, 248,
+ 217, 2, 66, 53, 17, 10, 27, 217, 81, 2, 122, 53, 17, 10, 27, 217, 81, 2,
+ 66, 53, 17, 10, 27, 210, 112, 2, 66, 53, 17, 10, 27, 254, 197, 2, 151,
+ 53, 17, 10, 27, 254, 197, 2, 66, 53, 17, 10, 27, 242, 245, 2, 151, 53,
+ 17, 10, 27, 242, 245, 2, 66, 53, 17, 10, 27, 244, 143, 2, 151, 53, 17,
+ 10, 27, 244, 143, 2, 122, 53, 17, 10, 27, 244, 143, 2, 234, 130, 53, 17,
+ 10, 27, 244, 143, 2, 66, 53, 17, 10, 27, 244, 143, 2, 112, 231, 193, 53,
+ 17, 10, 27, 244, 143, 2, 79, 53, 17, 10, 27, 224, 82, 2, 122, 53, 17, 10,
+ 27, 224, 82, 2, 66, 53, 17, 10, 27, 224, 82, 2, 112, 231, 193, 53, 17,
+ 10, 27, 224, 82, 2, 79, 53, 17, 10, 27, 234, 251, 2, 112, 53, 17, 10, 27,
+ 234, 251, 2, 151, 53, 17, 10, 27, 234, 251, 2, 122, 53, 17, 10, 27, 234,
+ 251, 2, 234, 130, 53, 17, 10, 27, 234, 251, 2, 233, 103, 53, 17, 10, 27,
+ 234, 251, 2, 66, 53, 17, 10, 27, 234, 251, 2, 112, 231, 193, 53, 17, 10,
+ 27, 234, 251, 2, 79, 53, 17, 10, 27, 233, 103, 2, 151, 53, 17, 10, 27,
+ 233, 103, 2, 122, 53, 17, 10, 27, 233, 103, 2, 234, 130, 53, 17, 10, 27,
+ 233, 103, 2, 66, 53, 17, 10, 27, 233, 103, 2, 112, 231, 193, 53, 17, 10,
+ 27, 233, 103, 2, 79, 53, 17, 10, 27, 66, 2, 151, 53, 17, 10, 27, 66, 2,
+ 122, 53, 17, 10, 27, 66, 2, 234, 130, 53, 17, 10, 27, 66, 2, 66, 53, 17,
+ 10, 27, 66, 2, 112, 231, 193, 53, 17, 10, 27, 66, 2, 79, 53, 17, 10, 27,
+ 228, 63, 2, 151, 53, 17, 10, 27, 228, 63, 2, 122, 53, 17, 10, 27, 228,
+ 63, 2, 234, 130, 53, 17, 10, 27, 228, 63, 2, 66, 53, 17, 10, 27, 228, 63,
+ 2, 112, 231, 193, 53, 17, 10, 27, 228, 63, 2, 79, 53, 17, 10, 27, 241,
+ 219, 2, 151, 53, 17, 10, 27, 241, 219, 2, 66, 53, 17, 10, 27, 241, 219,
+ 2, 112, 231, 193, 53, 17, 10, 27, 241, 219, 2, 79, 53, 17, 10, 27, 79, 2,
+ 151, 53, 17, 10, 27, 79, 2, 122, 53, 17, 10, 27, 79, 2, 234, 130, 53, 17,
+ 10, 27, 79, 2, 66, 53, 17, 10, 27, 79, 2, 112, 231, 193, 53, 17, 10, 27,
+ 79, 2, 79, 53, 17, 10, 27, 216, 203, 2, 218, 23, 112, 53, 17, 10, 27,
+ 223, 96, 2, 218, 23, 112, 53, 17, 10, 27, 112, 231, 193, 2, 218, 23, 112,
+ 53, 17, 10, 27, 220, 94, 2, 248, 183, 53, 17, 10, 27, 220, 94, 2, 234,
+ 204, 53, 17, 10, 27, 220, 94, 2, 244, 166, 53, 17, 10, 27, 220, 94, 2,
+ 248, 185, 53, 17, 10, 27, 220, 94, 2, 234, 206, 53, 17, 10, 27, 220, 94,
+ 2, 218, 23, 112, 53, 17, 10, 27, 79, 2, 202, 77, 2, 223, 96, 40, 17, 10,
+ 27, 79, 2, 202, 77, 2, 210, 109, 40, 17, 10, 27, 79, 2, 202, 77, 2, 66,
+ 40, 17, 10, 27, 79, 2, 202, 77, 2, 228, 63, 40, 17, 10, 27, 79, 2, 202,
+ 77, 2, 112, 231, 193, 40, 17, 10, 27, 79, 2, 202, 77, 2, 79, 40, 17, 10,
+ 27, 252, 55, 2, 223, 96, 40, 17, 10, 27, 252, 55, 2, 210, 109, 40, 17,
+ 10, 27, 252, 55, 2, 66, 40, 17, 10, 27, 252, 55, 2, 228, 63, 40, 17, 10,
+ 27, 252, 55, 2, 112, 231, 193, 40, 17, 10, 27, 252, 55, 2, 79, 40, 17,
+ 10, 27, 217, 8, 2, 223, 96, 40, 17, 10, 27, 217, 8, 2, 210, 109, 40, 17,
+ 10, 27, 217, 8, 2, 66, 40, 17, 10, 27, 217, 8, 2, 228, 63, 40, 17, 10,
+ 27, 217, 8, 2, 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 79, 40, 17, 10,
+ 27, 216, 193, 2, 223, 96, 40, 17, 10, 27, 216, 193, 2, 210, 109, 40, 17,
+ 10, 27, 216, 193, 2, 66, 40, 17, 10, 27, 216, 193, 2, 228, 63, 40, 17,
+ 10, 27, 216, 193, 2, 112, 231, 193, 40, 17, 10, 27, 216, 193, 2, 79, 40,
+ 17, 10, 27, 244, 143, 2, 112, 231, 193, 40, 17, 10, 27, 244, 143, 2, 79,
+ 40, 17, 10, 27, 224, 82, 2, 112, 231, 193, 40, 17, 10, 27, 224, 82, 2,
+ 79, 40, 17, 10, 27, 234, 251, 2, 112, 40, 17, 10, 27, 234, 251, 2, 233,
+ 103, 40, 17, 10, 27, 234, 251, 2, 66, 40, 17, 10, 27, 234, 251, 2, 112,
+ 231, 193, 40, 17, 10, 27, 234, 251, 2, 79, 40, 17, 10, 27, 233, 103, 2,
+ 66, 40, 17, 10, 27, 233, 103, 2, 112, 231, 193, 40, 17, 10, 27, 233, 103,
+ 2, 79, 40, 17, 10, 27, 66, 2, 112, 40, 17, 10, 27, 66, 2, 66, 40, 17, 10,
+ 27, 228, 63, 2, 223, 96, 40, 17, 10, 27, 228, 63, 2, 210, 109, 40, 17,
+ 10, 27, 228, 63, 2, 66, 40, 17, 10, 27, 228, 63, 2, 228, 63, 40, 17, 10,
+ 27, 228, 63, 2, 112, 231, 193, 40, 17, 10, 27, 228, 63, 2, 79, 40, 17,
+ 10, 27, 112, 231, 193, 2, 218, 23, 112, 40, 17, 10, 27, 79, 2, 223, 96,
+ 40, 17, 10, 27, 79, 2, 210, 109, 40, 17, 10, 27, 79, 2, 66, 40, 17, 10,
+ 27, 79, 2, 228, 63, 40, 17, 10, 27, 79, 2, 112, 231, 193, 40, 17, 10, 27,
+ 79, 2, 79, 40, 17, 10, 27, 79, 2, 202, 77, 2, 151, 65, 17, 10, 27, 79, 2,
+ 202, 77, 2, 122, 65, 17, 10, 27, 79, 2, 202, 77, 2, 234, 130, 65, 17, 10,
+ 27, 79, 2, 202, 77, 2, 66, 65, 17, 10, 27, 79, 2, 202, 77, 2, 241, 219,
+ 65, 17, 10, 27, 252, 55, 2, 151, 65, 17, 10, 27, 252, 55, 2, 122, 65, 17,
+ 10, 27, 252, 55, 2, 234, 130, 65, 17, 10, 27, 252, 55, 2, 66, 65, 17, 10,
+ 27, 252, 55, 2, 241, 219, 65, 17, 10, 27, 217, 8, 2, 151, 65, 17, 10, 27,
+ 217, 8, 2, 122, 65, 17, 10, 27, 217, 8, 2, 234, 130, 65, 17, 10, 27, 217,
+ 8, 2, 66, 65, 17, 10, 27, 217, 8, 2, 241, 219, 65, 17, 10, 27, 216, 193,
+ 2, 66, 65, 17, 10, 27, 151, 2, 122, 65, 17, 10, 27, 151, 2, 66, 65, 17,
+ 10, 27, 122, 2, 151, 65, 17, 10, 27, 122, 2, 66, 65, 17, 10, 27, 234,
+ 130, 2, 151, 65, 17, 10, 27, 234, 130, 2, 66, 65, 17, 10, 27, 221, 167,
+ 2, 151, 65, 17, 10, 27, 221, 167, 2, 122, 65, 17, 10, 27, 221, 167, 2,
+ 234, 130, 65, 17, 10, 27, 221, 167, 2, 66, 65, 17, 10, 27, 222, 27, 2,
+ 122, 65, 17, 10, 27, 222, 27, 2, 234, 130, 65, 17, 10, 27, 222, 27, 2,
+ 66, 65, 17, 10, 27, 248, 217, 2, 151, 65, 17, 10, 27, 248, 217, 2, 122,
+ 65, 17, 10, 27, 248, 217, 2, 234, 130, 65, 17, 10, 27, 248, 217, 2, 66,
+ 65, 17, 10, 27, 217, 81, 2, 122, 65, 17, 10, 27, 210, 112, 2, 66, 65, 17,
+ 10, 27, 254, 197, 2, 151, 65, 17, 10, 27, 254, 197, 2, 66, 65, 17, 10,
+ 27, 242, 245, 2, 151, 65, 17, 10, 27, 242, 245, 2, 66, 65, 17, 10, 27,
+ 244, 143, 2, 151, 65, 17, 10, 27, 244, 143, 2, 122, 65, 17, 10, 27, 244,
+ 143, 2, 234, 130, 65, 17, 10, 27, 244, 143, 2, 66, 65, 17, 10, 27, 224,
+ 82, 2, 122, 65, 17, 10, 27, 224, 82, 2, 66, 65, 17, 10, 27, 234, 251, 2,
+ 151, 65, 17, 10, 27, 234, 251, 2, 122, 65, 17, 10, 27, 234, 251, 2, 234,
+ 130, 65, 17, 10, 27, 234, 251, 2, 233, 103, 65, 17, 10, 27, 234, 251, 2,
+ 66, 65, 17, 10, 27, 233, 103, 2, 151, 65, 17, 10, 27, 233, 103, 2, 122,
+ 65, 17, 10, 27, 233, 103, 2, 234, 130, 65, 17, 10, 27, 233, 103, 2, 66,
+ 65, 17, 10, 27, 233, 103, 2, 241, 219, 65, 17, 10, 27, 66, 2, 151, 65,
+ 17, 10, 27, 66, 2, 122, 65, 17, 10, 27, 66, 2, 234, 130, 65, 17, 10, 27,
+ 66, 2, 66, 65, 17, 10, 27, 228, 63, 2, 151, 65, 17, 10, 27, 228, 63, 2,
+ 122, 65, 17, 10, 27, 228, 63, 2, 234, 130, 65, 17, 10, 27, 228, 63, 2,
+ 66, 65, 17, 10, 27, 228, 63, 2, 241, 219, 65, 17, 10, 27, 241, 219, 2,
+ 151, 65, 17, 10, 27, 241, 219, 2, 66, 65, 17, 10, 27, 241, 219, 2, 218,
+ 23, 112, 65, 17, 10, 27, 79, 2, 151, 65, 17, 10, 27, 79, 2, 122, 65, 17,
+ 10, 27, 79, 2, 234, 130, 65, 17, 10, 27, 79, 2, 66, 65, 17, 10, 27, 79,
+ 2, 241, 219, 65, 17, 10, 27, 79, 2, 202, 77, 2, 66, 147, 17, 10, 27, 79,
+ 2, 202, 77, 2, 241, 219, 147, 17, 10, 27, 252, 55, 2, 66, 147, 17, 10,
+ 27, 252, 55, 2, 241, 219, 147, 17, 10, 27, 217, 8, 2, 66, 147, 17, 10,
+ 27, 217, 8, 2, 241, 219, 147, 17, 10, 27, 216, 193, 2, 66, 147, 17, 10,
+ 27, 216, 193, 2, 241, 219, 147, 17, 10, 27, 221, 167, 2, 66, 147, 17, 10,
+ 27, 221, 167, 2, 241, 219, 147, 17, 10, 27, 220, 60, 2, 66, 147, 17, 10,
+ 27, 220, 60, 2, 241, 219, 147, 17, 10, 27, 234, 251, 2, 233, 103, 147,
+ 17, 10, 27, 234, 251, 2, 66, 147, 17, 10, 27, 233, 103, 2, 66, 147, 17,
+ 10, 27, 228, 63, 2, 66, 147, 17, 10, 27, 228, 63, 2, 241, 219, 147, 17,
+ 10, 27, 79, 2, 66, 147, 17, 10, 27, 79, 2, 241, 219, 147, 17, 10, 27,
+ 220, 94, 2, 244, 166, 147, 17, 10, 27, 220, 94, 2, 248, 185, 147, 17, 10,
+ 27, 220, 94, 2, 234, 206, 147, 17, 10, 27, 217, 81, 2, 112, 231, 193, 53,
+ 17, 10, 27, 217, 81, 2, 79, 53, 17, 10, 27, 254, 197, 2, 112, 231, 193,
+ 53, 17, 10, 27, 254, 197, 2, 79, 53, 17, 10, 27, 242, 245, 2, 112, 231,
+ 193, 53, 17, 10, 27, 242, 245, 2, 79, 53, 17, 10, 27, 221, 167, 2, 112,
+ 231, 193, 53, 17, 10, 27, 221, 167, 2, 79, 53, 17, 10, 27, 220, 60, 2,
+ 112, 231, 193, 53, 17, 10, 27, 220, 60, 2, 79, 53, 17, 10, 27, 122, 2,
+ 112, 231, 193, 53, 17, 10, 27, 122, 2, 79, 53, 17, 10, 27, 151, 2, 112,
+ 231, 193, 53, 17, 10, 27, 151, 2, 79, 53, 17, 10, 27, 234, 130, 2, 112,
+ 231, 193, 53, 17, 10, 27, 234, 130, 2, 79, 53, 17, 10, 27, 222, 27, 2,
+ 112, 231, 193, 53, 17, 10, 27, 222, 27, 2, 79, 53, 17, 10, 27, 248, 217,
+ 2, 112, 231, 193, 53, 17, 10, 27, 248, 217, 2, 79, 53, 17, 10, 27, 220,
+ 60, 2, 151, 53, 17, 10, 27, 220, 60, 2, 122, 53, 17, 10, 27, 220, 60, 2,
+ 234, 130, 53, 17, 10, 27, 220, 60, 2, 66, 53, 17, 10, 27, 220, 60, 2,
+ 223, 96, 53, 17, 10, 27, 221, 167, 2, 223, 96, 53, 17, 10, 27, 222, 27,
+ 2, 223, 96, 53, 17, 10, 27, 248, 217, 2, 223, 96, 53, 17, 10, 27, 217,
+ 81, 2, 112, 231, 193, 40, 17, 10, 27, 217, 81, 2, 79, 40, 17, 10, 27,
+ 254, 197, 2, 112, 231, 193, 40, 17, 10, 27, 254, 197, 2, 79, 40, 17, 10,
+ 27, 242, 245, 2, 112, 231, 193, 40, 17, 10, 27, 242, 245, 2, 79, 40, 17,
+ 10, 27, 221, 167, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 79, 40,
+ 17, 10, 27, 220, 60, 2, 112, 231, 193, 40, 17, 10, 27, 220, 60, 2, 79,
+ 40, 17, 10, 27, 122, 2, 112, 231, 193, 40, 17, 10, 27, 122, 2, 79, 40,
+ 17, 10, 27, 151, 2, 112, 231, 193, 40, 17, 10, 27, 151, 2, 79, 40, 17,
+ 10, 27, 234, 130, 2, 112, 231, 193, 40, 17, 10, 27, 234, 130, 2, 79, 40,
+ 17, 10, 27, 222, 27, 2, 112, 231, 193, 40, 17, 10, 27, 222, 27, 2, 79,
+ 40, 17, 10, 27, 248, 217, 2, 112, 231, 193, 40, 17, 10, 27, 248, 217, 2,
+ 79, 40, 17, 10, 27, 220, 60, 2, 151, 40, 17, 10, 27, 220, 60, 2, 122, 40,
+ 17, 10, 27, 220, 60, 2, 234, 130, 40, 17, 10, 27, 220, 60, 2, 66, 40, 17,
+ 10, 27, 220, 60, 2, 223, 96, 40, 17, 10, 27, 221, 167, 2, 223, 96, 40,
+ 17, 10, 27, 222, 27, 2, 223, 96, 40, 17, 10, 27, 248, 217, 2, 223, 96,
+ 40, 17, 10, 27, 220, 60, 2, 151, 65, 17, 10, 27, 220, 60, 2, 122, 65, 17,
+ 10, 27, 220, 60, 2, 234, 130, 65, 17, 10, 27, 220, 60, 2, 66, 65, 17, 10,
+ 27, 221, 167, 2, 241, 219, 65, 17, 10, 27, 220, 60, 2, 241, 219, 65, 17,
+ 10, 27, 217, 81, 2, 66, 65, 17, 10, 27, 221, 167, 2, 151, 147, 17, 10,
+ 27, 221, 167, 2, 122, 147, 17, 10, 27, 221, 167, 2, 234, 130, 147, 17,
+ 10, 27, 220, 60, 2, 151, 147, 17, 10, 27, 220, 60, 2, 122, 147, 17, 10,
+ 27, 220, 60, 2, 234, 130, 147, 17, 10, 27, 217, 81, 2, 66, 147, 17, 10,
+ 27, 210, 112, 2, 66, 147, 17, 10, 27, 112, 2, 244, 164, 40, 17, 10, 27,
+ 112, 2, 244, 164, 53, 17, 226, 146, 43, 226, 3, 226, 146, 44, 226, 3, 10,
+ 27, 217, 8, 2, 151, 2, 66, 65, 17, 10, 27, 217, 8, 2, 122, 2, 151, 40,
+ 17, 10, 27, 217, 8, 2, 122, 2, 151, 65, 17, 10, 27, 217, 8, 2, 122, 2,
+ 66, 65, 17, 10, 27, 217, 8, 2, 234, 130, 2, 66, 65, 17, 10, 27, 217, 8,
+ 2, 66, 2, 151, 65, 17, 10, 27, 217, 8, 2, 66, 2, 122, 65, 17, 10, 27,
+ 217, 8, 2, 66, 2, 234, 130, 65, 17, 10, 27, 151, 2, 66, 2, 122, 40, 17,
+ 10, 27, 151, 2, 66, 2, 122, 65, 17, 10, 27, 122, 2, 66, 2, 79, 40, 17,
+ 10, 27, 122, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 122,
+ 2, 151, 65, 17, 10, 27, 221, 167, 2, 151, 2, 122, 65, 17, 10, 27, 221,
+ 167, 2, 151, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 66, 2, 122,
+ 40, 17, 10, 27, 221, 167, 2, 66, 2, 122, 65, 17, 10, 27, 221, 167, 2, 66,
+ 2, 151, 65, 17, 10, 27, 221, 167, 2, 66, 2, 66, 40, 17, 10, 27, 221, 167,
+ 2, 66, 2, 66, 65, 17, 10, 27, 222, 27, 2, 122, 2, 122, 40, 17, 10, 27,
+ 222, 27, 2, 122, 2, 122, 65, 17, 10, 27, 222, 27, 2, 66, 2, 66, 40, 17,
+ 10, 27, 220, 60, 2, 122, 2, 66, 40, 17, 10, 27, 220, 60, 2, 122, 2, 66,
+ 65, 17, 10, 27, 220, 60, 2, 151, 2, 79, 40, 17, 10, 27, 220, 60, 2, 66,
+ 2, 234, 130, 40, 17, 10, 27, 220, 60, 2, 66, 2, 234, 130, 65, 17, 10, 27,
+ 220, 60, 2, 66, 2, 66, 40, 17, 10, 27, 220, 60, 2, 66, 2, 66, 65, 17, 10,
+ 27, 248, 217, 2, 122, 2, 112, 231, 193, 40, 17, 10, 27, 248, 217, 2, 234,
+ 130, 2, 66, 40, 17, 10, 27, 248, 217, 2, 234, 130, 2, 66, 65, 17, 10, 27,
+ 217, 81, 2, 66, 2, 122, 40, 17, 10, 27, 217, 81, 2, 66, 2, 122, 65, 17,
+ 10, 27, 217, 81, 2, 66, 2, 66, 65, 17, 10, 27, 217, 81, 2, 66, 2, 79, 40,
+ 17, 10, 27, 254, 197, 2, 151, 2, 66, 40, 17, 10, 27, 254, 197, 2, 66, 2,
+ 66, 40, 17, 10, 27, 254, 197, 2, 66, 2, 66, 65, 17, 10, 27, 254, 197, 2,
+ 66, 2, 112, 231, 193, 40, 17, 10, 27, 242, 245, 2, 66, 2, 66, 40, 17, 10,
+ 27, 242, 245, 2, 66, 2, 79, 40, 17, 10, 27, 242, 245, 2, 66, 2, 112, 231,
+ 193, 40, 17, 10, 27, 244, 143, 2, 234, 130, 2, 66, 40, 17, 10, 27, 244,
+ 143, 2, 234, 130, 2, 66, 65, 17, 10, 27, 224, 82, 2, 66, 2, 122, 40, 17,
+ 10, 27, 224, 82, 2, 66, 2, 66, 40, 17, 10, 27, 233, 103, 2, 122, 2, 66,
+ 40, 17, 10, 27, 233, 103, 2, 122, 2, 79, 40, 17, 10, 27, 233, 103, 2,
+ 122, 2, 112, 231, 193, 40, 17, 10, 27, 233, 103, 2, 151, 2, 151, 65, 17,
+ 10, 27, 233, 103, 2, 151, 2, 151, 40, 17, 10, 27, 233, 103, 2, 234, 130,
+ 2, 66, 40, 17, 10, 27, 233, 103, 2, 234, 130, 2, 66, 65, 17, 10, 27, 233,
+ 103, 2, 66, 2, 122, 40, 17, 10, 27, 233, 103, 2, 66, 2, 122, 65, 17, 10,
+ 27, 66, 2, 122, 2, 151, 65, 17, 10, 27, 66, 2, 122, 2, 66, 65, 17, 10,
+ 27, 66, 2, 122, 2, 79, 40, 17, 10, 27, 66, 2, 151, 2, 122, 65, 17, 10,
+ 27, 66, 2, 151, 2, 66, 65, 17, 10, 27, 66, 2, 234, 130, 2, 151, 65, 17,
+ 10, 27, 66, 2, 234, 130, 2, 66, 65, 17, 10, 27, 66, 2, 151, 2, 234, 130,
+ 65, 17, 10, 27, 241, 219, 2, 66, 2, 151, 65, 17, 10, 27, 241, 219, 2, 66,
+ 2, 66, 65, 17, 10, 27, 228, 63, 2, 122, 2, 66, 65, 17, 10, 27, 228, 63,
+ 2, 122, 2, 112, 231, 193, 40, 17, 10, 27, 228, 63, 2, 151, 2, 66, 40, 17,
+ 10, 27, 228, 63, 2, 151, 2, 66, 65, 17, 10, 27, 228, 63, 2, 151, 2, 112,
+ 231, 193, 40, 17, 10, 27, 228, 63, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63,
+ 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 79, 2, 66, 2, 66, 40, 17, 10,
+ 27, 79, 2, 66, 2, 66, 65, 17, 10, 27, 252, 55, 2, 234, 130, 2, 79, 40,
+ 17, 10, 27, 217, 8, 2, 151, 2, 79, 40, 17, 10, 27, 217, 8, 2, 151, 2,
+ 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 234, 130, 2, 79, 40, 17, 10,
+ 27, 217, 8, 2, 234, 130, 2, 112, 231, 193, 40, 17, 10, 27, 217, 8, 2, 66,
+ 2, 79, 40, 17, 10, 27, 217, 8, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27,
+ 151, 2, 66, 2, 79, 40, 17, 10, 27, 151, 2, 122, 2, 112, 231, 193, 40, 17,
+ 10, 27, 151, 2, 66, 2, 112, 231, 193, 40, 17, 10, 27, 221, 167, 2, 234,
+ 130, 2, 112, 231, 193, 40, 17, 10, 27, 222, 27, 2, 122, 2, 79, 40, 17,
+ 10, 27, 220, 60, 2, 122, 2, 79, 40, 17, 10, 27, 248, 217, 2, 122, 2, 79,
+ 40, 17, 10, 27, 233, 103, 2, 151, 2, 79, 40, 17, 10, 27, 233, 103, 2, 66,
+ 2, 79, 40, 17, 10, 27, 79, 2, 122, 2, 79, 40, 17, 10, 27, 79, 2, 151, 2,
+ 79, 40, 17, 10, 27, 79, 2, 66, 2, 79, 40, 17, 10, 27, 66, 2, 66, 2, 79,
+ 40, 17, 10, 27, 224, 82, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63, 2, 122,
+ 2, 79, 40, 17, 10, 27, 224, 82, 2, 66, 2, 122, 65, 17, 10, 27, 233, 103,
+ 2, 122, 2, 66, 65, 17, 10, 27, 254, 197, 2, 66, 2, 79, 40, 17, 10, 27,
+ 234, 251, 2, 66, 2, 79, 40, 17, 10, 27, 228, 63, 2, 151, 2, 122, 65, 17,
+ 10, 27, 66, 2, 234, 130, 2, 79, 40, 17, 10, 27, 233, 103, 2, 151, 2, 66,
+ 65, 17, 10, 27, 234, 251, 2, 66, 2, 66, 40, 17, 10, 27, 233, 103, 2, 151,
+ 2, 66, 40, 17, 10, 27, 228, 63, 2, 151, 2, 122, 40, 17, 10, 27, 151, 2,
+ 122, 2, 79, 40, 17, 10, 27, 122, 2, 151, 2, 79, 40, 17, 10, 27, 66, 2,
+ 151, 2, 79, 40, 17, 10, 27, 244, 143, 2, 66, 2, 79, 40, 17, 10, 27, 252,
+ 55, 2, 122, 2, 79, 40, 17, 10, 27, 234, 251, 2, 66, 2, 66, 65, 17, 10,
+ 27, 254, 197, 2, 151, 2, 66, 65, 17, 10, 27, 222, 27, 2, 66, 2, 66, 65,
+ 17, 10, 27, 221, 167, 2, 234, 130, 2, 79, 40, 17, 10, 27, 228, 63, 2,
+ 151, 2, 79, 40, 17, 10, 27, 222, 4, 214, 128, 253, 238, 234, 4, 218, 130,
+ 5, 53, 17, 10, 27, 224, 78, 214, 128, 253, 238, 234, 4, 218, 130, 5, 53,
+ 17, 10, 27, 254, 153, 53, 17, 10, 27, 254, 183, 53, 17, 10, 27, 230, 153,
+ 53, 17, 10, 27, 222, 5, 53, 17, 10, 27, 223, 143, 53, 17, 10, 27, 254,
+ 172, 53, 17, 10, 27, 212, 49, 53, 17, 10, 27, 222, 4, 53, 17, 10, 27,
+ 222, 3, 254, 172, 212, 48, 10, 27, 235, 134, 223, 34, 50, 10, 27, 251,
+ 230, 254, 39, 254, 40, 45, 221, 156, 45, 221, 45, 45, 220, 233, 45, 220,
+ 222, 45, 220, 211, 45, 220, 200, 45, 220, 189, 45, 220, 178, 45, 220,
+ 167, 45, 221, 155, 45, 221, 144, 45, 221, 133, 45, 221, 122, 45, 221,
+ 111, 45, 221, 100, 45, 221, 89, 224, 194, 244, 20, 31, 67, 249, 219, 224,
+ 194, 244, 20, 31, 67, 109, 249, 219, 224, 194, 244, 20, 31, 67, 109, 243,
+ 229, 218, 129, 224, 194, 244, 20, 31, 67, 249, 226, 224, 194, 244, 20,
+ 31, 67, 220, 150, 224, 194, 244, 20, 31, 67, 245, 31, 78, 224, 194, 244,
+ 20, 31, 67, 224, 13, 78, 224, 194, 244, 20, 31, 67, 43, 71, 233, 20, 127,
+ 224, 194, 244, 20, 31, 67, 44, 71, 233, 20, 251, 156, 224, 194, 244, 20,
+ 31, 67, 203, 245, 163, 38, 27, 43, 242, 27, 38, 27, 44, 242, 27, 38, 52,
+ 216, 89, 43, 242, 27, 38, 52, 216, 89, 44, 242, 27, 38, 231, 233, 43,
+ 242, 27, 38, 231, 233, 44, 242, 27, 38, 249, 197, 231, 232, 224, 194,
+ 244, 20, 31, 67, 113, 59, 233, 56, 224, 194, 244, 20, 31, 67, 245, 160,
+ 248, 156, 224, 194, 244, 20, 31, 67, 245, 151, 248, 156, 224, 194, 244,
+ 20, 31, 67, 121, 232, 213, 224, 194, 244, 20, 31, 67, 212, 32, 121, 232,
+ 213, 224, 194, 244, 20, 31, 67, 43, 226, 3, 224, 194, 244, 20, 31, 67,
+ 44, 226, 3, 224, 194, 244, 20, 31, 67, 43, 249, 99, 127, 224, 194, 244,
+ 20, 31, 67, 44, 249, 99, 127, 224, 194, 244, 20, 31, 67, 43, 216, 6, 220,
+ 53, 127, 224, 194, 244, 20, 31, 67, 44, 216, 6, 220, 53, 127, 224, 194,
+ 244, 20, 31, 67, 43, 85, 233, 20, 127, 224, 194, 244, 20, 31, 67, 44, 85,
+ 233, 20, 127, 224, 194, 244, 20, 31, 67, 43, 52, 254, 110, 127, 224, 194,
+ 244, 20, 31, 67, 44, 52, 254, 110, 127, 224, 194, 244, 20, 31, 67, 43,
+ 254, 110, 127, 224, 194, 244, 20, 31, 67, 44, 254, 110, 127, 224, 194,
+ 244, 20, 31, 67, 43, 249, 161, 127, 224, 194, 244, 20, 31, 67, 44, 249,
+ 161, 127, 224, 194, 244, 20, 31, 67, 43, 71, 249, 161, 127, 224, 194,
+ 244, 20, 31, 67, 44, 71, 249, 161, 127, 220, 131, 247, 120, 71, 220, 131,
+ 247, 120, 224, 194, 244, 20, 31, 67, 43, 42, 127, 224, 194, 244, 20, 31,
+ 67, 44, 42, 127, 248, 155, 226, 119, 250, 172, 226, 119, 212, 32, 226,
+ 119, 52, 212, 32, 226, 119, 248, 155, 121, 232, 213, 250, 172, 121, 232,
+ 213, 212, 32, 121, 232, 213, 4, 249, 219, 4, 109, 249, 219, 4, 243, 229,
+ 218, 129, 4, 220, 150, 4, 249, 226, 4, 224, 13, 78, 4, 245, 31, 78, 4,
+ 245, 160, 248, 156, 4, 43, 226, 3, 4, 44, 226, 3, 4, 43, 249, 99, 127, 4,
+ 44, 249, 99, 127, 4, 43, 216, 6, 220, 53, 127, 4, 44, 216, 6, 220, 53,
+ 127, 4, 54, 50, 4, 254, 126, 4, 253, 216, 4, 96, 50, 4, 240, 167, 4, 233,
+ 15, 50, 4, 242, 130, 50, 4, 245, 98, 50, 4, 223, 50, 219, 46, 4, 247,
+ 132, 50, 4, 225, 182, 50, 4, 249, 217, 253, 206, 10, 244, 164, 53, 17,
+ 10, 217, 44, 2, 244, 164, 48, 10, 248, 183, 53, 17, 10, 217, 78, 244, 1,
+ 10, 234, 204, 53, 17, 10, 244, 166, 53, 17, 10, 244, 166, 147, 17, 10,
+ 248, 185, 53, 17, 10, 248, 185, 147, 17, 10, 234, 206, 53, 17, 10, 234,
+ 206, 147, 17, 10, 220, 94, 53, 17, 10, 220, 94, 147, 17, 10, 218, 46, 53,
+ 17, 10, 218, 46, 147, 17, 10, 1, 202, 53, 17, 10, 1, 112, 2, 231, 228,
+ 77, 53, 17, 10, 1, 112, 2, 231, 228, 77, 40, 17, 10, 1, 112, 2, 202, 77,
+ 53, 17, 10, 1, 112, 2, 202, 77, 40, 17, 10, 1, 212, 31, 2, 202, 77, 53,
+ 17, 10, 1, 212, 31, 2, 202, 77, 40, 17, 10, 1, 112, 2, 202, 252, 43, 53,
+ 17, 10, 1, 112, 2, 202, 252, 43, 40, 17, 10, 1, 79, 2, 202, 77, 53, 17,
+ 10, 1, 79, 2, 202, 77, 40, 17, 10, 1, 79, 2, 202, 77, 65, 17, 10, 1, 79,
+ 2, 202, 77, 147, 17, 10, 1, 112, 53, 17, 10, 1, 112, 40, 17, 10, 1, 252,
+ 55, 53, 17, 10, 1, 252, 55, 40, 17, 10, 1, 252, 55, 65, 17, 10, 1, 252,
+ 55, 147, 17, 10, 1, 217, 8, 231, 165, 53, 17, 10, 1, 217, 8, 231, 165,
+ 40, 17, 10, 1, 217, 8, 53, 17, 10, 1, 217, 8, 40, 17, 10, 1, 217, 8, 65,
+ 17, 10, 1, 217, 8, 147, 17, 10, 1, 216, 193, 53, 17, 10, 1, 216, 193, 40,
+ 17, 10, 1, 216, 193, 65, 17, 10, 1, 216, 193, 147, 17, 10, 1, 151, 53,
+ 17, 10, 1, 151, 40, 17, 10, 1, 151, 65, 17, 10, 1, 151, 147, 17, 10, 1,
+ 122, 53, 17, 10, 1, 122, 40, 17, 10, 1, 122, 65, 17, 10, 1, 122, 147, 17,
+ 10, 1, 234, 130, 53, 17, 10, 1, 234, 130, 40, 17, 10, 1, 234, 130, 65,
+ 17, 10, 1, 234, 130, 147, 17, 10, 1, 248, 196, 53, 17, 10, 1, 248, 196,
+ 40, 17, 10, 1, 216, 203, 53, 17, 10, 1, 216, 203, 40, 17, 10, 1, 223, 96,
+ 53, 17, 10, 1, 223, 96, 40, 17, 10, 1, 210, 109, 53, 17, 10, 1, 210, 109,
+ 40, 17, 10, 1, 221, 167, 53, 17, 10, 1, 221, 167, 40, 17, 10, 1, 221,
+ 167, 65, 17, 10, 1, 221, 167, 147, 17, 10, 1, 220, 60, 53, 17, 10, 1,
+ 220, 60, 40, 17, 10, 1, 220, 60, 65, 17, 10, 1, 220, 60, 147, 17, 10, 1,
+ 222, 27, 53, 17, 10, 1, 222, 27, 40, 17, 10, 1, 222, 27, 65, 17, 10, 1,
+ 222, 27, 147, 17, 10, 1, 248, 217, 53, 17, 10, 1, 248, 217, 40, 17, 10,
+ 1, 248, 217, 65, 17, 10, 1, 248, 217, 147, 17, 10, 1, 217, 81, 53, 17,
+ 10, 1, 217, 81, 40, 17, 10, 1, 217, 81, 65, 17, 10, 1, 217, 81, 147, 17,
+ 10, 1, 210, 112, 53, 17, 10, 1, 210, 112, 40, 17, 10, 1, 210, 112, 65,
+ 17, 10, 1, 210, 112, 147, 17, 10, 1, 254, 197, 53, 17, 10, 1, 254, 197,
+ 40, 17, 10, 1, 254, 197, 65, 17, 10, 1, 254, 197, 147, 17, 10, 1, 242,
+ 245, 53, 17, 10, 1, 242, 245, 40, 17, 10, 1, 242, 245, 65, 17, 10, 1,
+ 242, 245, 147, 17, 10, 1, 244, 143, 53, 17, 10, 1, 244, 143, 40, 17, 10,
+ 1, 244, 143, 65, 17, 10, 1, 244, 143, 147, 17, 10, 1, 224, 82, 53, 17,
+ 10, 1, 224, 82, 40, 17, 10, 1, 224, 82, 65, 17, 10, 1, 224, 82, 147, 17,
+ 10, 1, 234, 251, 53, 17, 10, 1, 234, 251, 40, 17, 10, 1, 234, 251, 65,
+ 17, 10, 1, 234, 251, 147, 17, 10, 1, 233, 103, 53, 17, 10, 1, 233, 103,
+ 40, 17, 10, 1, 233, 103, 65, 17, 10, 1, 233, 103, 147, 17, 10, 1, 66, 53,
+ 17, 10, 1, 66, 40, 17, 10, 1, 66, 65, 17, 10, 1, 66, 147, 17, 10, 1, 228,
+ 63, 53, 17, 10, 1, 228, 63, 40, 17, 10, 1, 228, 63, 65, 17, 10, 1, 228,
+ 63, 147, 17, 10, 1, 241, 219, 53, 17, 10, 1, 241, 219, 40, 17, 10, 1,
+ 241, 219, 65, 17, 10, 1, 241, 219, 147, 17, 10, 1, 212, 31, 53, 17, 10,
+ 1, 212, 31, 40, 17, 10, 1, 112, 231, 193, 53, 17, 10, 1, 112, 231, 193,
+ 40, 17, 10, 1, 79, 53, 17, 10, 1, 79, 40, 17, 10, 1, 79, 65, 17, 10, 1,
+ 79, 147, 17, 10, 27, 233, 103, 2, 112, 2, 231, 228, 77, 53, 17, 10, 27,
+ 233, 103, 2, 112, 2, 231, 228, 77, 40, 17, 10, 27, 233, 103, 2, 112, 2,
+ 202, 77, 53, 17, 10, 27, 233, 103, 2, 112, 2, 202, 77, 40, 17, 10, 27,
+ 233, 103, 2, 112, 2, 202, 252, 43, 53, 17, 10, 27, 233, 103, 2, 112, 2,
+ 202, 252, 43, 40, 17, 10, 27, 233, 103, 2, 112, 53, 17, 10, 27, 233, 103,
+ 2, 112, 40, 17, 210, 87, 211, 245, 228, 73, 219, 18, 126, 245, 31, 78,
+ 126, 223, 254, 78, 126, 54, 50, 126, 247, 132, 50, 126, 225, 182, 50,
+ 126, 254, 126, 126, 254, 57, 126, 43, 226, 3, 126, 44, 226, 3, 126, 253,
+ 216, 126, 96, 50, 126, 249, 219, 126, 240, 167, 126, 243, 229, 218, 129,
+ 126, 219, 46, 126, 21, 210, 86, 126, 21, 110, 126, 21, 105, 126, 21, 158,
+ 126, 21, 161, 126, 21, 189, 126, 21, 194, 126, 21, 198, 126, 21, 195,
+ 126, 21, 200, 126, 249, 226, 126, 220, 150, 126, 233, 15, 50, 126, 245,
+ 98, 50, 126, 242, 130, 50, 126, 224, 13, 78, 126, 249, 217, 253, 206,
+ 126, 7, 6, 1, 61, 126, 7, 6, 1, 253, 158, 126, 7, 6, 1, 251, 66, 126, 7,
+ 6, 1, 249, 60, 126, 7, 6, 1, 75, 126, 7, 6, 1, 245, 6, 126, 7, 6, 1, 243,
+ 202, 126, 7, 6, 1, 242, 60, 126, 7, 6, 1, 73, 126, 7, 6, 1, 235, 144,
+ 126, 7, 6, 1, 235, 23, 126, 7, 6, 1, 156, 126, 7, 6, 1, 193, 126, 7, 6,
+ 1, 230, 25, 126, 7, 6, 1, 76, 126, 7, 6, 1, 226, 105, 126, 7, 6, 1, 224,
+ 96, 126, 7, 6, 1, 153, 126, 7, 6, 1, 222, 91, 126, 7, 6, 1, 217, 152,
+ 126, 7, 6, 1, 70, 126, 7, 6, 1, 214, 105, 126, 7, 6, 1, 212, 98, 126, 7,
+ 6, 1, 211, 178, 126, 7, 6, 1, 211, 117, 126, 7, 6, 1, 210, 159, 126, 43,
+ 42, 127, 126, 223, 50, 219, 46, 126, 44, 42, 127, 126, 250, 31, 255, 14,
+ 126, 121, 232, 213, 126, 242, 137, 255, 14, 126, 7, 4, 1, 61, 126, 7, 4,
+ 1, 253, 158, 126, 7, 4, 1, 251, 66, 126, 7, 4, 1, 249, 60, 126, 7, 4, 1,
+ 75, 126, 7, 4, 1, 245, 6, 126, 7, 4, 1, 243, 202, 126, 7, 4, 1, 242, 60,
+ 126, 7, 4, 1, 73, 126, 7, 4, 1, 235, 144, 126, 7, 4, 1, 235, 23, 126, 7,
+ 4, 1, 156, 126, 7, 4, 1, 193, 126, 7, 4, 1, 230, 25, 126, 7, 4, 1, 76,
+ 126, 7, 4, 1, 226, 105, 126, 7, 4, 1, 224, 96, 126, 7, 4, 1, 153, 126, 7,
+ 4, 1, 222, 91, 126, 7, 4, 1, 217, 152, 126, 7, 4, 1, 70, 126, 7, 4, 1,
+ 214, 105, 126, 7, 4, 1, 212, 98, 126, 7, 4, 1, 211, 178, 126, 7, 4, 1,
+ 211, 117, 126, 7, 4, 1, 210, 159, 126, 43, 249, 99, 127, 126, 67, 232,
+ 213, 126, 44, 249, 99, 127, 126, 182, 126, 43, 71, 226, 3, 126, 44, 71,
+ 226, 3, 101, 109, 243, 229, 218, 129, 101, 43, 249, 161, 127, 101, 44,
+ 249, 161, 127, 101, 109, 249, 219, 101, 56, 230, 224, 247, 120, 101, 56,
+ 1, 211, 227, 101, 56, 1, 4, 61, 101, 56, 1, 4, 73, 101, 56, 1, 4, 70,
+ 101, 56, 1, 4, 75, 101, 56, 1, 4, 76, 101, 56, 1, 4, 191, 101, 56, 1, 4,
+ 210, 212, 101, 56, 1, 4, 210, 244, 101, 56, 1, 4, 215, 118, 101, 234,
+ 201, 224, 173, 219, 31, 78, 101, 56, 1, 61, 101, 56, 1, 73, 101, 56, 1,
+ 70, 101, 56, 1, 75, 101, 56, 1, 76, 101, 56, 1, 176, 101, 56, 1, 234, 92,
+ 101, 56, 1, 233, 217, 101, 56, 1, 234, 182, 101, 56, 1, 234, 28, 101, 56,
+ 1, 206, 101, 56, 1, 219, 191, 101, 56, 1, 218, 83, 101, 56, 1, 221, 181,
+ 101, 56, 1, 219, 58, 101, 56, 1, 217, 105, 101, 56, 1, 216, 117, 101, 56,
+ 1, 215, 118, 101, 56, 1, 217, 22, 101, 56, 1, 111, 101, 56, 1, 197, 101,
+ 56, 1, 228, 233, 101, 56, 1, 227, 237, 101, 56, 1, 229, 107, 101, 56, 1,
+ 228, 74, 101, 56, 1, 162, 101, 56, 1, 241, 180, 101, 56, 1, 240, 222,
+ 101, 56, 1, 241, 238, 101, 56, 1, 241, 68, 101, 56, 1, 184, 101, 56, 1,
+ 230, 230, 101, 56, 1, 230, 102, 101, 56, 1, 231, 91, 101, 56, 1, 230,
+ 161, 101, 56, 1, 191, 101, 56, 1, 210, 212, 101, 56, 1, 210, 244, 101,
+ 56, 1, 205, 101, 56, 1, 223, 35, 101, 56, 1, 222, 140, 101, 56, 1, 223,
+ 128, 101, 56, 1, 222, 211, 101, 56, 1, 212, 65, 101, 56, 1, 230, 25, 101,
+ 56, 213, 135, 219, 31, 78, 101, 56, 220, 155, 219, 31, 78, 101, 24, 244,
+ 103, 101, 24, 1, 234, 58, 101, 24, 1, 218, 215, 101, 24, 1, 234, 51, 101,
+ 24, 1, 228, 226, 101, 24, 1, 228, 224, 101, 24, 1, 228, 223, 101, 24, 1,
+ 216, 101, 101, 24, 1, 218, 204, 101, 24, 1, 223, 26, 101, 24, 1, 223, 21,
+ 101, 24, 1, 223, 18, 101, 24, 1, 223, 11, 101, 24, 1, 223, 6, 101, 24, 1,
+ 223, 1, 101, 24, 1, 223, 12, 101, 24, 1, 223, 24, 101, 24, 1, 230, 217,
+ 101, 24, 1, 225, 95, 101, 24, 1, 218, 212, 101, 24, 1, 225, 84, 101, 24,
+ 1, 219, 148, 101, 24, 1, 218, 209, 101, 24, 1, 236, 56, 101, 24, 1, 250,
+ 46, 101, 24, 1, 218, 219, 101, 24, 1, 250, 106, 101, 24, 1, 234, 110,
+ 101, 24, 1, 216, 173, 101, 24, 1, 225, 131, 101, 24, 1, 241, 172, 101,
+ 24, 1, 61, 101, 24, 1, 254, 243, 101, 24, 1, 191, 101, 24, 1, 211, 92,
+ 101, 24, 1, 245, 117, 101, 24, 1, 75, 101, 24, 1, 211, 36, 101, 24, 1,
+ 211, 47, 101, 24, 1, 76, 101, 24, 1, 212, 65, 101, 24, 1, 212, 62, 101,
+ 24, 1, 226, 234, 101, 24, 1, 210, 244, 101, 24, 1, 70, 101, 24, 1, 212,
+ 11, 101, 24, 1, 212, 22, 101, 24, 1, 211, 250, 101, 24, 1, 210, 212, 101,
+ 24, 1, 245, 55, 101, 24, 1, 211, 8, 101, 24, 1, 73, 126, 250, 176, 50,
+ 126, 224, 228, 50, 126, 228, 52, 50, 126, 231, 232, 126, 251, 135, 130,
+ 126, 211, 40, 50, 126, 211, 217, 50, 101, 244, 18, 192, 213, 239, 101,
+ 140, 74, 101, 214, 153, 74, 101, 97, 74, 101, 246, 104, 74, 101, 85, 218,
+ 234, 101, 71, 250, 35, 235, 204, 254, 99, 254, 120, 235, 204, 254, 99,
+ 220, 137, 235, 204, 254, 99, 216, 236, 226, 249, 223, 72, 250, 142, 223,
+ 72, 250, 142, 62, 57, 3, 253, 142, 61, 62, 57, 3, 253, 111, 75, 62, 57,
+ 3, 253, 120, 73, 62, 57, 3, 253, 88, 76, 62, 57, 3, 253, 138, 70, 62, 57,
+ 3, 253, 157, 248, 221, 62, 57, 3, 253, 104, 248, 90, 62, 57, 3, 253, 144,
+ 248, 3, 62, 57, 3, 253, 134, 247, 145, 62, 57, 3, 253, 98, 246, 78, 62,
+ 57, 3, 253, 92, 235, 141, 62, 57, 3, 253, 103, 235, 126, 62, 57, 3, 253,
+ 113, 235, 68, 62, 57, 3, 253, 84, 235, 51, 62, 57, 3, 253, 72, 176, 62,
+ 57, 3, 253, 105, 234, 182, 62, 57, 3, 253, 82, 234, 92, 62, 57, 3, 253,
+ 79, 234, 28, 62, 57, 3, 253, 68, 233, 217, 62, 57, 3, 253, 69, 184, 62,
+ 57, 3, 253, 135, 231, 91, 62, 57, 3, 253, 76, 230, 230, 62, 57, 3, 253,
+ 133, 230, 161, 62, 57, 3, 253, 125, 230, 102, 62, 57, 3, 253, 146, 197,
+ 62, 57, 3, 253, 124, 229, 107, 62, 57, 3, 253, 118, 228, 233, 62, 57, 3,
+ 253, 97, 228, 74, 62, 57, 3, 253, 94, 227, 237, 62, 57, 3, 253, 153, 190,
+ 62, 57, 3, 253, 77, 225, 221, 62, 57, 3, 253, 110, 225, 108, 62, 57, 3,
+ 253, 137, 225, 16, 62, 57, 3, 253, 99, 224, 150, 62, 57, 3, 253, 132,
+ 224, 88, 62, 57, 3, 253, 71, 224, 69, 62, 57, 3, 253, 127, 224, 53, 62,
+ 57, 3, 253, 116, 224, 42, 62, 57, 3, 253, 89, 205, 62, 57, 3, 253, 121,
+ 223, 128, 62, 57, 3, 253, 96, 223, 35, 62, 57, 3, 253, 155, 222, 211, 62,
+ 57, 3, 253, 122, 222, 140, 62, 57, 3, 253, 117, 206, 62, 57, 3, 253, 140,
+ 221, 181, 62, 57, 3, 253, 108, 219, 191, 62, 57, 3, 253, 136, 219, 58,
+ 62, 57, 3, 253, 91, 218, 83, 62, 57, 3, 253, 90, 217, 105, 62, 57, 3,
+ 253, 151, 217, 22, 62, 57, 3, 253, 112, 216, 117, 62, 57, 3, 253, 149,
+ 111, 62, 57, 3, 253, 80, 215, 118, 62, 57, 3, 253, 95, 212, 65, 62, 57,
+ 3, 253, 74, 212, 22, 62, 57, 3, 253, 109, 211, 250, 62, 57, 3, 253, 107,
+ 211, 227, 62, 57, 3, 253, 131, 210, 116, 62, 57, 3, 253, 75, 210, 94, 62,
+ 57, 3, 253, 128, 210, 23, 62, 57, 3, 253, 123, 255, 75, 62, 57, 3, 253,
+ 106, 255, 74, 62, 57, 3, 253, 65, 253, 192, 62, 57, 3, 253, 78, 246, 46,
+ 62, 57, 3, 253, 61, 246, 45, 62, 57, 3, 253, 101, 227, 174, 62, 57, 3,
+ 253, 119, 224, 148, 62, 57, 3, 253, 87, 224, 152, 62, 57, 3, 253, 73,
+ 223, 186, 62, 57, 3, 253, 115, 223, 185, 62, 57, 3, 253, 81, 222, 210,
+ 62, 57, 3, 253, 83, 217, 102, 62, 57, 3, 253, 63, 215, 78, 62, 57, 3,
+ 253, 60, 105, 62, 57, 16, 253, 130, 62, 57, 16, 253, 129, 62, 57, 16,
+ 253, 126, 62, 57, 16, 253, 114, 62, 57, 16, 253, 102, 62, 57, 16, 253,
+ 100, 62, 57, 16, 253, 93, 62, 57, 16, 253, 86, 62, 57, 16, 253, 85, 62,
+ 57, 16, 253, 70, 62, 57, 16, 253, 67, 62, 57, 16, 253, 66, 62, 57, 16,
+ 253, 64, 62, 57, 16, 253, 62, 62, 57, 106, 253, 59, 231, 185, 62, 57,
+ 106, 253, 58, 211, 221, 62, 57, 106, 253, 57, 248, 74, 62, 57, 106, 253,
+ 56, 245, 95, 62, 57, 106, 253, 55, 231, 159, 62, 57, 106, 253, 54, 218,
+ 162, 62, 57, 106, 253, 53, 245, 37, 62, 57, 106, 253, 52, 223, 153, 62,
+ 57, 106, 253, 51, 220, 62, 62, 57, 106, 253, 50, 241, 237, 62, 57, 106,
+ 253, 49, 219, 25, 62, 57, 106, 253, 48, 251, 203, 62, 57, 106, 253, 47,
+ 249, 145, 62, 57, 106, 253, 46, 251, 115, 62, 57, 106, 253, 45, 212, 2,
+ 62, 57, 106, 253, 44, 252, 136, 62, 57, 106, 253, 43, 226, 205, 62, 57,
+ 106, 253, 42, 218, 254, 62, 57, 106, 253, 41, 249, 68, 62, 57, 230, 142,
+ 253, 40, 234, 224, 62, 57, 230, 142, 253, 39, 234, 232, 62, 57, 106, 253,
+ 38, 226, 218, 62, 57, 106, 253, 37, 211, 236, 62, 57, 106, 253, 36, 62,
+ 57, 230, 142, 253, 35, 254, 17, 62, 57, 230, 142, 253, 34, 231, 52, 62,
+ 57, 106, 253, 33, 251, 134, 62, 57, 106, 253, 32, 242, 166, 62, 57, 106,
+ 253, 31, 62, 57, 106, 253, 30, 211, 212, 62, 57, 106, 253, 29, 62, 57,
+ 106, 253, 28, 62, 57, 106, 253, 27, 240, 248, 62, 57, 106, 253, 26, 62,
+ 57, 106, 253, 25, 62, 57, 106, 253, 24, 62, 57, 230, 142, 253, 22, 215,
+ 92, 62, 57, 106, 253, 21, 62, 57, 106, 253, 20, 62, 57, 106, 253, 19,
+ 249, 250, 62, 57, 106, 253, 18, 62, 57, 106, 253, 17, 62, 57, 106, 253,
+ 16, 243, 93, 62, 57, 106, 253, 15, 254, 4, 62, 57, 106, 253, 14, 62, 57,
+ 106, 253, 13, 62, 57, 106, 253, 12, 62, 57, 106, 253, 11, 62, 57, 106,
+ 253, 10, 62, 57, 106, 253, 9, 62, 57, 106, 253, 8, 62, 57, 106, 253, 7,
+ 62, 57, 106, 253, 6, 62, 57, 106, 253, 5, 230, 134, 62, 57, 106, 253, 4,
+ 62, 57, 106, 253, 3, 215, 235, 62, 57, 106, 253, 2, 62, 57, 106, 253, 1,
+ 62, 57, 106, 253, 0, 62, 57, 106, 252, 255, 62, 57, 106, 252, 254, 62,
+ 57, 106, 252, 253, 62, 57, 106, 252, 252, 62, 57, 106, 252, 251, 62, 57,
+ 106, 252, 250, 62, 57, 106, 252, 249, 62, 57, 106, 252, 248, 62, 57, 106,
+ 252, 247, 241, 211, 62, 57, 106, 252, 226, 244, 28, 62, 57, 106, 252,
+ 223, 252, 116, 62, 57, 106, 252, 218, 219, 5, 62, 57, 106, 252, 217, 74,
+ 62, 57, 106, 252, 216, 62, 57, 106, 252, 215, 217, 236, 62, 57, 106, 252,
+ 214, 62, 57, 106, 252, 213, 62, 57, 106, 252, 212, 211, 254, 250, 139,
+ 62, 57, 106, 252, 211, 250, 139, 62, 57, 106, 252, 210, 250, 140, 243,
+ 255, 62, 57, 106, 252, 209, 212, 0, 62, 57, 106, 252, 208, 62, 57, 106,
+ 252, 207, 62, 57, 230, 142, 252, 206, 247, 198, 62, 57, 106, 252, 205,
+ 62, 57, 106, 252, 204, 62, 57, 106, 252, 202, 62, 57, 106, 252, 201, 62,
+ 57, 106, 252, 200, 62, 57, 106, 252, 199, 248, 159, 62, 57, 106, 252,
+ 198, 62, 57, 106, 252, 197, 62, 57, 106, 252, 196, 62, 57, 106, 252, 195,
+ 62, 57, 106, 252, 194, 62, 57, 106, 213, 186, 253, 23, 62, 57, 106, 213,
+ 186, 252, 246, 62, 57, 106, 213, 186, 252, 245, 62, 57, 106, 213, 186,
+ 252, 244, 62, 57, 106, 213, 186, 252, 243, 62, 57, 106, 213, 186, 252,
+ 242, 62, 57, 106, 213, 186, 252, 241, 62, 57, 106, 213, 186, 252, 240,
+ 62, 57, 106, 213, 186, 252, 239, 62, 57, 106, 213, 186, 252, 238, 62, 57,
+ 106, 213, 186, 252, 237, 62, 57, 106, 213, 186, 252, 236, 62, 57, 106,
+ 213, 186, 252, 235, 62, 57, 106, 213, 186, 252, 234, 62, 57, 106, 213,
+ 186, 252, 233, 62, 57, 106, 213, 186, 252, 232, 62, 57, 106, 213, 186,
+ 252, 231, 62, 57, 106, 213, 186, 252, 230, 62, 57, 106, 213, 186, 252,
+ 229, 62, 57, 106, 213, 186, 252, 228, 62, 57, 106, 213, 186, 252, 227,
+ 62, 57, 106, 213, 186, 252, 225, 62, 57, 106, 213, 186, 252, 224, 62, 57,
+ 106, 213, 186, 252, 222, 62, 57, 106, 213, 186, 252, 221, 62, 57, 106,
+ 213, 186, 252, 220, 62, 57, 106, 213, 186, 252, 219, 62, 57, 106, 213,
+ 186, 252, 203, 62, 57, 106, 213, 186, 252, 193, 254, 236, 211, 209, 220,
+ 138, 232, 213, 254, 236, 211, 209, 220, 138, 247, 120, 254, 236, 250,
+ 130, 78, 254, 236, 54, 110, 254, 236, 54, 105, 254, 236, 54, 158, 254,
+ 236, 54, 161, 254, 236, 54, 189, 254, 236, 54, 194, 254, 236, 54, 198,
+ 254, 236, 54, 195, 254, 236, 54, 200, 254, 236, 54, 216, 247, 254, 236,
+ 54, 215, 73, 254, 236, 54, 216, 162, 254, 236, 54, 244, 15, 254, 236, 54,
+ 244, 114, 254, 236, 54, 219, 111, 254, 236, 54, 220, 116, 254, 236, 54,
+ 245, 184, 254, 236, 54, 228, 195, 254, 236, 54, 123, 240, 210, 254, 236,
+ 54, 113, 240, 210, 254, 236, 54, 134, 240, 210, 254, 236, 54, 244, 11,
+ 240, 210, 254, 236, 54, 244, 81, 240, 210, 254, 236, 54, 219, 125, 240,
+ 210, 254, 236, 54, 220, 122, 240, 210, 254, 236, 54, 245, 193, 240, 210,
+ 254, 236, 54, 228, 200, 240, 210, 254, 236, 54, 123, 216, 147, 254, 236,
+ 54, 113, 216, 147, 254, 236, 54, 134, 216, 147, 254, 236, 54, 244, 11,
+ 216, 147, 254, 236, 54, 244, 81, 216, 147, 254, 236, 54, 219, 125, 216,
+ 147, 254, 236, 54, 220, 122, 216, 147, 254, 236, 54, 245, 193, 216, 147,
+ 254, 236, 54, 228, 200, 216, 147, 254, 236, 54, 216, 248, 216, 147, 254,
+ 236, 54, 215, 74, 216, 147, 254, 236, 54, 216, 163, 216, 147, 254, 236,
+ 54, 244, 16, 216, 147, 254, 236, 54, 244, 115, 216, 147, 254, 236, 54,
+ 219, 112, 216, 147, 254, 236, 54, 220, 117, 216, 147, 254, 236, 54, 245,
+ 185, 216, 147, 254, 236, 54, 228, 196, 216, 147, 254, 236, 212, 14, 252,
+ 128, 214, 173, 254, 236, 212, 14, 244, 92, 218, 59, 254, 236, 212, 14,
+ 221, 176, 218, 59, 254, 236, 212, 14, 216, 169, 218, 59, 254, 236, 212,
+ 14, 244, 4, 218, 59, 254, 236, 246, 81, 231, 90, 244, 92, 218, 59, 254,
+ 236, 232, 199, 231, 90, 244, 92, 218, 59, 254, 236, 231, 90, 221, 176,
+ 218, 59, 254, 236, 231, 90, 216, 169, 218, 59, 26, 255, 6, 253, 194, 123,
+ 224, 21, 26, 255, 6, 253, 194, 123, 242, 27, 26, 255, 6, 253, 194, 123,
+ 246, 100, 26, 255, 6, 253, 194, 189, 26, 255, 6, 253, 194, 244, 114, 26,
+ 255, 6, 253, 194, 244, 81, 240, 210, 26, 255, 6, 253, 194, 244, 81, 216,
+ 147, 26, 255, 6, 253, 194, 244, 115, 216, 147, 26, 255, 6, 253, 194, 244,
+ 81, 217, 67, 26, 255, 6, 253, 194, 216, 248, 217, 67, 26, 255, 6, 253,
+ 194, 244, 115, 217, 67, 26, 255, 6, 253, 194, 123, 240, 211, 217, 67, 26,
+ 255, 6, 253, 194, 244, 81, 240, 211, 217, 67, 26, 255, 6, 253, 194, 123,
+ 216, 148, 217, 67, 26, 255, 6, 253, 194, 244, 81, 216, 148, 217, 67, 26,
+ 255, 6, 253, 194, 244, 81, 218, 150, 26, 255, 6, 253, 194, 216, 248, 218,
+ 150, 26, 255, 6, 253, 194, 244, 115, 218, 150, 26, 255, 6, 253, 194, 123,
+ 240, 211, 218, 150, 26, 255, 6, 253, 194, 244, 81, 240, 211, 218, 150,
+ 26, 255, 6, 253, 194, 123, 216, 148, 218, 150, 26, 255, 6, 253, 194, 216,
+ 248, 216, 148, 218, 150, 26, 255, 6, 253, 194, 244, 115, 216, 148, 218,
+ 150, 26, 255, 6, 253, 194, 216, 248, 230, 164, 26, 255, 6, 241, 205, 123,
+ 225, 31, 26, 255, 6, 216, 181, 110, 26, 255, 6, 241, 201, 110, 26, 255,
+ 6, 245, 104, 105, 26, 255, 6, 216, 181, 105, 26, 255, 6, 249, 65, 113,
+ 246, 99, 26, 255, 6, 245, 104, 113, 246, 99, 26, 255, 6, 215, 203, 189,
+ 26, 255, 6, 215, 203, 216, 247, 26, 255, 6, 215, 203, 216, 248, 254, 141,
+ 17, 26, 255, 6, 241, 201, 216, 247, 26, 255, 6, 231, 41, 216, 247, 26,
+ 255, 6, 216, 181, 216, 247, 26, 255, 6, 216, 181, 216, 162, 26, 255, 6,
+ 215, 203, 244, 114, 26, 255, 6, 215, 203, 244, 115, 254, 141, 17, 26,
+ 255, 6, 241, 201, 244, 114, 26, 255, 6, 216, 181, 244, 114, 26, 255, 6,
+ 216, 181, 123, 240, 210, 26, 255, 6, 216, 181, 134, 240, 210, 26, 255, 6,
+ 245, 104, 244, 81, 240, 210, 26, 255, 6, 215, 203, 244, 81, 240, 210, 26,
+ 255, 6, 216, 181, 244, 81, 240, 210, 26, 255, 6, 250, 227, 244, 81, 240,
+ 210, 26, 255, 6, 229, 182, 244, 81, 240, 210, 26, 255, 6, 216, 181, 123,
+ 216, 147, 26, 255, 6, 216, 181, 244, 81, 216, 147, 26, 255, 6, 248, 57,
+ 244, 81, 230, 164, 26, 255, 6, 218, 118, 244, 115, 230, 164, 26, 123,
+ 163, 50, 26, 123, 163, 5, 254, 141, 17, 26, 113, 216, 167, 50, 26, 134,
+ 224, 20, 50, 26, 211, 45, 50, 26, 217, 68, 50, 26, 246, 101, 50, 26, 226,
+ 246, 50, 26, 113, 226, 245, 50, 26, 134, 226, 245, 50, 26, 244, 11, 226,
+ 245, 50, 26, 244, 81, 226, 245, 50, 26, 231, 35, 50, 26, 233, 157, 252,
+ 128, 50, 26, 232, 194, 50, 26, 226, 131, 50, 26, 211, 159, 50, 26, 253,
+ 243, 50, 26, 254, 0, 50, 26, 242, 144, 50, 26, 215, 186, 252, 128, 50,
+ 26, 210, 87, 50, 222, 198, 220, 113, 50, 222, 198, 214, 185, 50, 222,
+ 198, 220, 142, 50, 222, 198, 220, 111, 50, 222, 198, 247, 213, 220, 111,
+ 50, 222, 198, 219, 168, 50, 222, 198, 248, 53, 50, 222, 198, 224, 6, 50,
+ 222, 198, 220, 129, 50, 222, 198, 246, 60, 50, 222, 198, 253, 238, 50,
+ 222, 198, 250, 171, 50, 225, 143, 247, 191, 5, 225, 213, 225, 143, 247,
+ 191, 5, 225, 24, 241, 235, 225, 143, 247, 191, 5, 217, 45, 241, 235, 225,
+ 143, 247, 191, 5, 250, 247, 225, 143, 247, 191, 5, 250, 101, 225, 143,
+ 247, 191, 5, 211, 221, 225, 143, 247, 191, 5, 241, 211, 225, 143, 247,
+ 191, 5, 243, 85, 225, 143, 247, 191, 5, 216, 116, 225, 143, 247, 191, 5,
+ 74, 225, 143, 247, 191, 5, 251, 169, 225, 143, 247, 191, 5, 220, 29, 225,
+ 143, 247, 191, 5, 249, 244, 225, 143, 247, 191, 5, 231, 184, 225, 143,
+ 247, 191, 5, 231, 136, 225, 143, 247, 191, 5, 221, 216, 225, 143, 247,
+ 191, 5, 232, 237, 225, 143, 247, 191, 5, 251, 188, 225, 143, 247, 191, 5,
+ 250, 231, 225, 35, 225, 143, 247, 191, 5, 247, 133, 225, 143, 247, 191,
+ 5, 249, 223, 225, 143, 247, 191, 5, 219, 87, 225, 143, 247, 191, 5, 249,
+ 224, 225, 143, 247, 191, 5, 252, 63, 225, 143, 247, 191, 5, 220, 16, 225,
+ 143, 247, 191, 5, 240, 248, 225, 143, 247, 191, 5, 241, 178, 225, 143,
+ 247, 191, 5, 251, 112, 233, 36, 225, 143, 247, 191, 5, 250, 224, 225,
+ 143, 247, 191, 5, 223, 153, 225, 143, 247, 191, 5, 245, 230, 225, 143,
+ 247, 191, 5, 246, 107, 225, 143, 247, 191, 5, 215, 105, 225, 143, 247,
+ 191, 5, 252, 66, 225, 143, 247, 191, 5, 225, 36, 215, 235, 225, 143, 247,
+ 191, 5, 213, 159, 225, 143, 247, 191, 5, 226, 18, 225, 143, 247, 191, 5,
+ 222, 190, 225, 143, 247, 191, 5, 232, 224, 225, 143, 247, 191, 5, 226,
+ 115, 252, 184, 225, 143, 247, 191, 5, 244, 48, 225, 143, 247, 191, 5,
+ 242, 138, 225, 143, 247, 191, 5, 218, 119, 225, 143, 247, 191, 5, 4, 253,
+ 168, 225, 143, 247, 191, 5, 212, 32, 252, 148, 225, 143, 247, 191, 5, 38,
+ 226, 248, 91, 232, 60, 1, 61, 232, 60, 1, 75, 232, 60, 1, 253, 158, 232,
+ 60, 1, 252, 19, 232, 60, 1, 243, 202, 232, 60, 1, 249, 60, 232, 60, 1,
+ 73, 232, 60, 1, 212, 98, 232, 60, 1, 210, 159, 232, 60, 1, 216, 210, 232,
+ 60, 1, 235, 144, 232, 60, 1, 235, 23, 232, 60, 1, 224, 96, 232, 60, 1,
+ 156, 232, 60, 1, 193, 232, 60, 1, 230, 25, 232, 60, 1, 230, 166, 232, 60,
+ 1, 228, 111, 232, 60, 1, 70, 232, 60, 1, 226, 105, 232, 60, 1, 234, 47,
+ 232, 60, 1, 153, 232, 60, 1, 222, 91, 232, 60, 1, 217, 152, 232, 60, 1,
+ 215, 159, 232, 60, 1, 254, 123, 232, 60, 1, 245, 150, 232, 60, 1, 242,
+ 60, 232, 60, 1, 211, 178, 250, 237, 1, 61, 250, 237, 1, 226, 91, 250,
+ 237, 1, 249, 60, 250, 237, 1, 156, 250, 237, 1, 214, 116, 250, 237, 1,
+ 153, 250, 237, 1, 233, 62, 250, 237, 1, 255, 75, 250, 237, 1, 224, 96,
+ 250, 237, 1, 253, 158, 250, 237, 1, 193, 250, 237, 1, 76, 250, 237, 1,
+ 248, 223, 250, 237, 1, 217, 152, 250, 237, 1, 220, 104, 250, 237, 1, 220,
+ 103, 250, 237, 1, 222, 91, 250, 237, 1, 251, 65, 250, 237, 1, 70, 250,
+ 237, 1, 228, 111, 250, 237, 1, 211, 178, 250, 237, 1, 230, 25, 250, 237,
+ 1, 215, 158, 250, 237, 1, 226, 105, 250, 237, 1, 218, 226, 250, 237, 1,
+ 73, 250, 237, 1, 75, 250, 237, 1, 214, 113, 250, 237, 1, 235, 23, 250,
+ 237, 1, 235, 14, 250, 237, 1, 229, 150, 250, 237, 1, 214, 118, 250, 237,
+ 1, 243, 202, 250, 237, 1, 243, 137, 250, 237, 1, 218, 168, 250, 237, 1,
+ 218, 167, 250, 237, 1, 229, 79, 250, 237, 1, 236, 33, 250, 237, 1, 251,
+ 64, 250, 237, 1, 215, 159, 250, 237, 1, 214, 115, 250, 237, 1, 222, 180,
+ 250, 237, 1, 231, 129, 250, 237, 1, 231, 128, 250, 237, 1, 231, 127, 250,
+ 237, 1, 231, 126, 250, 237, 1, 233, 61, 250, 237, 1, 245, 234, 250, 237,
+ 1, 214, 114, 55, 32, 1, 61, 55, 32, 1, 252, 75, 55, 32, 1, 234, 182, 55,
+ 32, 1, 248, 90, 55, 32, 1, 75, 55, 32, 1, 213, 255, 55, 32, 1, 210, 94,
+ 55, 32, 1, 241, 238, 55, 32, 1, 216, 195, 55, 32, 1, 73, 55, 32, 1, 176,
+ 55, 32, 1, 245, 174, 55, 32, 1, 245, 159, 55, 32, 1, 245, 150, 55, 32, 1,
+ 245, 75, 55, 32, 1, 76, 55, 32, 1, 225, 221, 55, 32, 1, 220, 63, 55, 32,
+ 1, 233, 217, 55, 32, 1, 245, 92, 55, 32, 1, 245, 82, 55, 32, 1, 217, 22,
+ 55, 32, 1, 70, 55, 32, 1, 245, 177, 55, 32, 1, 225, 136, 55, 32, 1, 234,
+ 119, 55, 32, 1, 245, 202, 55, 32, 1, 245, 84, 55, 32, 1, 250, 131, 55,
+ 32, 1, 236, 33, 55, 32, 1, 214, 118, 55, 32, 227, 198, 110, 55, 32, 227,
+ 198, 189, 55, 32, 227, 198, 216, 247, 55, 32, 227, 198, 244, 114, 242,
+ 153, 1, 254, 204, 242, 153, 1, 252, 163, 242, 153, 1, 242, 211, 242, 153,
+ 1, 248, 204, 242, 153, 1, 254, 200, 242, 153, 1, 224, 79, 242, 153, 1,
+ 235, 155, 242, 153, 1, 242, 39, 242, 153, 1, 216, 158, 242, 153, 1, 245,
+ 183, 242, 153, 1, 233, 190, 242, 153, 1, 233, 113, 242, 153, 1, 231, 179,
+ 242, 153, 1, 229, 184, 242, 153, 1, 235, 119, 242, 153, 1, 214, 136, 242,
+ 153, 1, 226, 69, 242, 153, 1, 228, 195, 242, 153, 1, 223, 165, 242, 153,
+ 1, 221, 218, 242, 153, 1, 217, 4, 242, 153, 1, 211, 234, 242, 153, 1,
+ 244, 178, 242, 153, 1, 236, 37, 242, 153, 1, 240, 199, 242, 153, 1, 226,
+ 139, 242, 153, 1, 228, 200, 240, 210, 214, 209, 1, 254, 147, 214, 209, 1,
+ 252, 26, 214, 209, 1, 243, 108, 214, 209, 1, 234, 132, 214, 209, 1, 248,
+ 54, 214, 209, 1, 241, 68, 214, 209, 1, 211, 227, 214, 209, 1, 210, 85,
+ 214, 209, 1, 240, 241, 214, 209, 1, 216, 230, 214, 209, 1, 210, 233, 214,
+ 209, 1, 234, 250, 214, 209, 1, 220, 20, 214, 209, 1, 233, 98, 214, 209,
+ 1, 231, 65, 214, 209, 1, 248, 21, 214, 209, 1, 227, 194, 214, 209, 1,
+ 210, 13, 214, 209, 1, 221, 248, 214, 209, 1, 254, 196, 214, 209, 1, 224,
+ 150, 214, 209, 1, 222, 25, 214, 209, 1, 224, 35, 214, 209, 1, 223, 144,
+ 214, 209, 1, 216, 199, 214, 209, 1, 242, 244, 214, 209, 1, 111, 214, 209,
+ 1, 73, 214, 209, 1, 70, 214, 209, 1, 218, 179, 214, 209, 211, 209, 247,
+ 172, 55, 225, 169, 5, 61, 55, 225, 169, 5, 73, 55, 225, 169, 5, 70, 55,
+ 225, 169, 5, 176, 55, 225, 169, 5, 233, 217, 55, 225, 169, 5, 243, 135,
+ 55, 225, 169, 5, 242, 113, 55, 225, 169, 5, 211, 165, 55, 225, 169, 5,
+ 251, 33, 55, 225, 169, 5, 235, 141, 55, 225, 169, 5, 235, 108, 55, 225,
+ 169, 5, 217, 105, 55, 225, 169, 5, 215, 118, 55, 225, 169, 5, 248, 221,
+ 55, 225, 169, 5, 248, 3, 55, 225, 169, 5, 246, 78, 55, 225, 169, 5, 216,
+ 208, 55, 225, 169, 5, 190, 55, 225, 169, 5, 252, 191, 55, 225, 169, 5,
+ 244, 196, 55, 225, 169, 5, 197, 55, 225, 169, 5, 227, 237, 55, 225, 169,
+ 5, 184, 55, 225, 169, 5, 230, 230, 55, 225, 169, 5, 230, 102, 55, 225,
+ 169, 5, 191, 55, 225, 169, 5, 214, 27, 55, 225, 169, 5, 213, 176, 55,
+ 225, 169, 5, 205, 55, 225, 169, 5, 222, 140, 55, 225, 169, 5, 233, 135,
+ 55, 225, 169, 5, 206, 55, 225, 169, 5, 210, 116, 55, 225, 169, 5, 220,
+ 102, 55, 225, 169, 5, 218, 223, 55, 225, 169, 5, 162, 55, 225, 169, 5,
+ 253, 186, 55, 225, 169, 5, 253, 185, 55, 225, 169, 5, 253, 184, 55, 225,
+ 169, 5, 211, 142, 55, 225, 169, 5, 248, 200, 55, 225, 169, 5, 248, 199,
+ 55, 225, 169, 5, 252, 170, 55, 225, 169, 5, 251, 85, 55, 225, 169, 211,
+ 209, 247, 172, 55, 225, 169, 54, 110, 55, 225, 169, 54, 105, 55, 225,
+ 169, 54, 216, 247, 55, 225, 169, 54, 215, 73, 55, 225, 169, 54, 240, 210,
+ 181, 6, 1, 199, 73, 181, 6, 1, 199, 75, 181, 6, 1, 199, 61, 181, 6, 1,
+ 199, 254, 209, 181, 6, 1, 199, 76, 181, 6, 1, 199, 226, 183, 181, 6, 1,
+ 219, 251, 73, 181, 6, 1, 219, 251, 75, 181, 6, 1, 219, 251, 61, 181, 6,
+ 1, 219, 251, 254, 209, 181, 6, 1, 219, 251, 76, 181, 6, 1, 219, 251, 226,
+ 183, 181, 6, 1, 253, 167, 181, 6, 1, 226, 116, 181, 6, 1, 211, 195, 181,
+ 6, 1, 211, 44, 181, 6, 1, 242, 60, 181, 6, 1, 225, 211, 181, 6, 1, 252,
+ 66, 181, 6, 1, 217, 11, 181, 6, 1, 248, 77, 181, 6, 1, 250, 128, 181, 6,
+ 1, 235, 124, 181, 6, 1, 234, 189, 181, 6, 1, 243, 83, 181, 6, 1, 245,
+ 202, 181, 6, 1, 213, 250, 181, 6, 1, 245, 59, 181, 6, 1, 216, 194, 181,
+ 6, 1, 245, 82, 181, 6, 1, 210, 92, 181, 6, 1, 245, 75, 181, 6, 1, 210,
+ 73, 181, 6, 1, 245, 92, 181, 6, 1, 245, 174, 181, 6, 1, 245, 159, 181, 6,
+ 1, 245, 150, 181, 6, 1, 245, 138, 181, 6, 1, 226, 219, 181, 6, 1, 245,
+ 38, 181, 4, 1, 199, 73, 181, 4, 1, 199, 75, 181, 4, 1, 199, 61, 181, 4,
+ 1, 199, 254, 209, 181, 4, 1, 199, 76, 181, 4, 1, 199, 226, 183, 181, 4,
+ 1, 219, 251, 73, 181, 4, 1, 219, 251, 75, 181, 4, 1, 219, 251, 61, 181,
+ 4, 1, 219, 251, 254, 209, 181, 4, 1, 219, 251, 76, 181, 4, 1, 219, 251,
+ 226, 183, 181, 4, 1, 253, 167, 181, 4, 1, 226, 116, 181, 4, 1, 211, 195,
+ 181, 4, 1, 211, 44, 181, 4, 1, 242, 60, 181, 4, 1, 225, 211, 181, 4, 1,
+ 252, 66, 181, 4, 1, 217, 11, 181, 4, 1, 248, 77, 181, 4, 1, 250, 128,
+ 181, 4, 1, 235, 124, 181, 4, 1, 234, 189, 181, 4, 1, 243, 83, 181, 4, 1,
+ 245, 202, 181, 4, 1, 213, 250, 181, 4, 1, 245, 59, 181, 4, 1, 216, 194,
+ 181, 4, 1, 245, 82, 181, 4, 1, 210, 92, 181, 4, 1, 245, 75, 181, 4, 1,
+ 210, 73, 181, 4, 1, 245, 92, 181, 4, 1, 245, 174, 181, 4, 1, 245, 159,
+ 181, 4, 1, 245, 150, 181, 4, 1, 245, 138, 181, 4, 1, 226, 219, 181, 4, 1,
+ 245, 38, 220, 69, 1, 225, 209, 220, 69, 1, 216, 5, 220, 69, 1, 234, 91,
+ 220, 69, 1, 244, 147, 220, 69, 1, 216, 172, 220, 69, 1, 219, 58, 220, 69,
+ 1, 218, 14, 220, 69, 1, 250, 61, 220, 69, 1, 211, 46, 220, 69, 1, 240,
+ 209, 220, 69, 1, 252, 5, 220, 69, 1, 248, 89, 220, 69, 1, 243, 121, 220,
+ 69, 1, 213, 123, 220, 69, 1, 216, 176, 220, 69, 1, 210, 21, 220, 69, 1,
+ 231, 89, 220, 69, 1, 235, 49, 220, 69, 1, 211, 225, 220, 69, 1, 242, 48,
+ 220, 69, 1, 232, 142, 220, 69, 1, 230, 189, 220, 69, 1, 236, 40, 220, 69,
+ 1, 245, 201, 220, 69, 1, 253, 231, 220, 69, 1, 254, 247, 220, 69, 1, 226,
+ 196, 220, 69, 1, 211, 212, 220, 69, 1, 226, 130, 220, 69, 1, 254, 209,
+ 220, 69, 1, 222, 208, 220, 69, 1, 227, 194, 220, 69, 1, 245, 217, 220,
+ 69, 1, 254, 214, 220, 69, 1, 240, 111, 220, 69, 1, 214, 163, 220, 69, 1,
+ 226, 254, 220, 69, 1, 226, 176, 220, 69, 1, 226, 218, 220, 69, 1, 253,
+ 170, 220, 69, 1, 254, 19, 220, 69, 1, 226, 158, 220, 69, 1, 254, 192,
+ 220, 69, 1, 245, 86, 220, 69, 1, 253, 253, 220, 69, 1, 245, 227, 220, 69,
+ 1, 240, 118, 220, 69, 1, 211, 13, 226, 141, 1, 254, 170, 226, 141, 1,
+ 252, 191, 226, 141, 1, 217, 105, 226, 141, 1, 235, 141, 226, 141, 1, 211,
+ 165, 226, 141, 1, 234, 132, 226, 141, 1, 248, 76, 226, 141, 1, 205, 226,
+ 141, 1, 206, 226, 141, 1, 220, 26, 226, 141, 1, 248, 25, 226, 141, 1,
+ 250, 215, 226, 141, 1, 243, 135, 226, 141, 1, 244, 196, 226, 141, 1, 224,
+ 86, 226, 141, 1, 235, 9, 226, 141, 1, 233, 130, 226, 141, 1, 230, 200,
+ 226, 141, 1, 227, 178, 226, 141, 1, 212, 30, 226, 141, 1, 162, 226, 141,
+ 1, 191, 226, 141, 1, 61, 226, 141, 1, 75, 226, 141, 1, 73, 226, 141, 1,
+ 76, 226, 141, 1, 70, 226, 141, 1, 255, 73, 226, 141, 1, 245, 209, 226,
+ 141, 1, 226, 183, 226, 141, 21, 210, 86, 226, 141, 21, 110, 226, 141, 21,
+ 105, 226, 141, 21, 158, 226, 141, 21, 161, 226, 141, 21, 189, 226, 141,
+ 21, 194, 226, 141, 21, 198, 226, 141, 21, 195, 226, 141, 21, 200, 249,
+ 67, 3, 61, 249, 67, 3, 75, 249, 67, 3, 73, 249, 67, 3, 76, 249, 67, 3,
+ 70, 249, 67, 3, 235, 141, 249, 67, 3, 235, 68, 249, 67, 3, 176, 249, 67,
+ 3, 234, 182, 249, 67, 3, 234, 92, 249, 67, 3, 234, 28, 249, 67, 3, 233,
+ 217, 249, 67, 3, 233, 135, 249, 67, 3, 233, 58, 249, 67, 3, 232, 241,
+ 249, 67, 3, 232, 156, 249, 67, 3, 232, 98, 249, 67, 3, 184, 249, 67, 3,
+ 231, 91, 249, 67, 3, 230, 230, 249, 67, 3, 230, 161, 249, 67, 3, 230,
+ 102, 249, 67, 3, 197, 249, 67, 3, 229, 107, 249, 67, 3, 228, 233, 249,
+ 67, 3, 228, 74, 249, 67, 3, 227, 237, 249, 67, 3, 190, 249, 67, 3, 225,
+ 221, 249, 67, 3, 225, 108, 249, 67, 3, 225, 16, 249, 67, 3, 224, 150,
+ 249, 67, 3, 205, 249, 67, 3, 223, 128, 249, 67, 3, 223, 35, 249, 67, 3,
+ 222, 211, 249, 67, 3, 222, 140, 249, 67, 3, 206, 249, 67, 3, 221, 181,
+ 249, 67, 3, 219, 191, 249, 67, 3, 219, 58, 249, 67, 3, 218, 83, 249, 67,
+ 3, 217, 105, 249, 67, 3, 217, 22, 249, 67, 3, 216, 117, 249, 67, 3, 111,
+ 249, 67, 3, 215, 118, 249, 67, 3, 212, 65, 249, 67, 3, 212, 22, 249, 67,
+ 3, 211, 250, 249, 67, 3, 211, 227, 249, 67, 3, 211, 165, 249, 67, 3, 211,
+ 162, 249, 67, 3, 210, 116, 249, 67, 3, 210, 23, 236, 1, 254, 27, 1, 254,
+ 168, 236, 1, 254, 27, 1, 252, 25, 236, 1, 254, 27, 1, 242, 201, 236, 1,
+ 254, 27, 1, 248, 188, 236, 1, 254, 27, 1, 241, 238, 236, 1, 254, 27, 1,
+ 212, 30, 236, 1, 254, 27, 1, 210, 97, 236, 1, 254, 27, 1, 241, 195, 236,
+ 1, 254, 27, 1, 216, 226, 236, 1, 254, 27, 1, 210, 232, 236, 1, 254, 27,
+ 1, 234, 225, 236, 1, 254, 27, 1, 233, 93, 236, 1, 254, 27, 1, 231, 65,
+ 236, 1, 254, 27, 1, 227, 194, 236, 1, 254, 27, 1, 221, 249, 236, 1, 254,
+ 27, 1, 253, 162, 236, 1, 254, 27, 1, 225, 221, 236, 1, 254, 27, 1, 222,
+ 24, 236, 1, 254, 27, 1, 224, 34, 236, 1, 254, 27, 1, 223, 67, 236, 1,
+ 254, 27, 1, 220, 20, 236, 1, 254, 27, 1, 217, 36, 236, 1, 254, 27, 221,
+ 173, 50, 236, 1, 254, 27, 54, 110, 236, 1, 254, 27, 54, 105, 236, 1, 254,
+ 27, 54, 158, 236, 1, 254, 27, 54, 216, 247, 236, 1, 254, 27, 54, 215, 73,
+ 236, 1, 254, 27, 54, 123, 240, 210, 236, 1, 254, 27, 54, 123, 216, 147,
+ 236, 1, 254, 27, 54, 216, 248, 216, 147, 225, 119, 1, 254, 165, 225, 119,
+ 1, 252, 28, 225, 119, 1, 243, 109, 225, 119, 1, 248, 56, 225, 119, 1,
+ 241, 238, 225, 119, 1, 212, 37, 225, 119, 1, 210, 110, 225, 119, 1, 241,
+ 197, 225, 119, 1, 216, 230, 225, 119, 1, 210, 233, 225, 119, 1, 234, 250,
+ 225, 119, 1, 233, 99, 225, 119, 1, 231, 65, 225, 119, 1, 227, 194, 225,
+ 119, 1, 220, 144, 225, 119, 1, 254, 196, 225, 119, 1, 225, 221, 225, 119,
+ 1, 222, 25, 225, 119, 1, 224, 39, 225, 119, 1, 222, 189, 225, 119, 1,
+ 220, 20, 225, 119, 1, 217, 41, 225, 119, 54, 110, 225, 119, 54, 216, 247,
+ 225, 119, 54, 215, 73, 225, 119, 54, 123, 240, 210, 225, 119, 54, 105,
+ 225, 119, 54, 158, 225, 119, 211, 209, 220, 137, 232, 59, 1, 61, 232, 59,
+ 1, 253, 158, 232, 59, 1, 243, 202, 232, 59, 1, 249, 60, 232, 59, 1, 75,
+ 232, 59, 1, 214, 105, 232, 59, 1, 73, 232, 59, 1, 211, 117, 232, 59, 1,
+ 235, 23, 232, 59, 1, 156, 232, 59, 1, 193, 232, 59, 1, 230, 25, 232, 59,
+ 1, 76, 232, 59, 1, 153, 232, 59, 1, 218, 226, 232, 59, 1, 217, 152, 232,
+ 59, 1, 70, 232, 59, 1, 245, 6, 232, 59, 1, 224, 96, 232, 59, 1, 222, 91,
+ 232, 59, 1, 215, 159, 232, 59, 1, 254, 123, 232, 59, 1, 245, 150, 232,
+ 59, 1, 232, 62, 232, 59, 1, 228, 111, 232, 59, 1, 251, 66, 232, 59, 215,
+ 222, 78, 231, 48, 241, 174, 1, 61, 231, 48, 241, 174, 1, 75, 231, 48,
+ 241, 174, 1, 73, 231, 48, 241, 174, 1, 76, 231, 48, 241, 174, 1, 191,
+ 231, 48, 241, 174, 1, 212, 65, 231, 48, 241, 174, 1, 252, 191, 231, 48,
+ 241, 174, 1, 252, 190, 231, 48, 241, 174, 1, 190, 231, 48, 241, 174, 1,
+ 184, 231, 48, 241, 174, 1, 197, 231, 48, 241, 174, 1, 229, 228, 231, 48,
+ 241, 174, 1, 229, 107, 231, 48, 241, 174, 1, 229, 106, 231, 48, 241, 174,
+ 1, 205, 231, 48, 241, 174, 1, 223, 187, 231, 48, 241, 174, 1, 233, 135,
+ 231, 48, 241, 174, 1, 234, 132, 231, 48, 241, 174, 1, 241, 189, 231, 48,
+ 241, 174, 1, 206, 231, 48, 241, 174, 1, 222, 33, 231, 48, 241, 174, 1,
+ 221, 181, 231, 48, 241, 174, 1, 176, 231, 48, 241, 174, 1, 224, 88, 231,
+ 48, 241, 174, 1, 217, 105, 231, 48, 241, 174, 1, 217, 104, 231, 48, 241,
+ 174, 1, 217, 22, 231, 48, 241, 174, 1, 217, 21, 231, 48, 241, 174, 1,
+ 111, 231, 48, 241, 174, 1, 248, 221, 231, 48, 241, 174, 16, 213, 170,
+ 231, 48, 241, 174, 16, 213, 169, 231, 48, 249, 94, 1, 61, 231, 48, 249,
+ 94, 1, 75, 231, 48, 249, 94, 1, 73, 231, 48, 249, 94, 1, 76, 231, 48,
+ 249, 94, 1, 191, 231, 48, 249, 94, 1, 212, 65, 231, 48, 249, 94, 1, 252,
+ 191, 231, 48, 249, 94, 1, 190, 231, 48, 249, 94, 1, 184, 231, 48, 249,
+ 94, 1, 197, 231, 48, 249, 94, 1, 229, 107, 231, 48, 249, 94, 1, 205, 231,
+ 48, 249, 94, 1, 233, 135, 231, 48, 249, 94, 1, 234, 132, 231, 48, 249,
+ 94, 1, 241, 189, 231, 48, 249, 94, 1, 206, 231, 48, 249, 94, 1, 254, 23,
+ 206, 231, 48, 249, 94, 1, 221, 181, 231, 48, 249, 94, 1, 176, 231, 48,
+ 249, 94, 1, 224, 88, 231, 48, 249, 94, 1, 217, 105, 231, 48, 249, 94, 1,
+ 217, 22, 231, 48, 249, 94, 1, 111, 231, 48, 249, 94, 1, 248, 221, 231,
+ 48, 249, 94, 232, 145, 222, 217, 231, 48, 249, 94, 232, 145, 236, 6, 234,
+ 120, 1, 61, 234, 120, 25, 5, 73, 234, 120, 25, 5, 70, 234, 120, 25, 5,
+ 149, 153, 234, 120, 25, 5, 75, 234, 120, 25, 5, 76, 234, 120, 25, 233,
+ 23, 78, 234, 120, 5, 52, 222, 234, 51, 234, 120, 5, 254, 75, 234, 120, 5,
+ 213, 147, 234, 120, 1, 176, 234, 120, 1, 234, 132, 234, 120, 1, 243, 135,
+ 234, 120, 1, 242, 249, 234, 120, 1, 251, 33, 234, 120, 1, 250, 157, 234,
+ 120, 1, 235, 141, 234, 120, 1, 227, 165, 234, 120, 1, 215, 156, 234, 120,
+ 1, 215, 144, 234, 120, 1, 248, 135, 234, 120, 1, 248, 119, 234, 120, 1,
+ 228, 110, 234, 120, 1, 217, 105, 234, 120, 1, 216, 208, 234, 120, 1, 248,
+ 221, 234, 120, 1, 248, 25, 234, 120, 1, 197, 234, 120, 1, 190, 234, 120,
+ 1, 225, 147, 234, 120, 1, 252, 191, 234, 120, 1, 252, 18, 234, 120, 1,
+ 184, 234, 120, 1, 191, 234, 120, 1, 205, 234, 120, 1, 233, 135, 234, 120,
+ 1, 214, 27, 234, 120, 1, 220, 102, 234, 120, 1, 218, 223, 234, 120, 1,
+ 206, 234, 120, 1, 210, 116, 234, 120, 1, 162, 234, 120, 1, 234, 46, 234,
+ 120, 1, 215, 124, 234, 120, 5, 252, 141, 48, 234, 120, 5, 250, 221, 234,
+ 120, 5, 59, 51, 234, 120, 213, 152, 234, 120, 21, 110, 234, 120, 21, 105,
+ 234, 120, 21, 158, 234, 120, 21, 161, 234, 120, 54, 216, 247, 234, 120,
+ 54, 215, 73, 234, 120, 54, 123, 240, 210, 234, 120, 54, 123, 216, 147,
+ 234, 120, 224, 141, 247, 120, 234, 120, 224, 141, 4, 250, 35, 234, 120,
+ 224, 141, 250, 35, 234, 120, 224, 141, 249, 137, 130, 234, 120, 224, 141,
+ 231, 180, 234, 120, 224, 141, 232, 115, 234, 120, 224, 141, 248, 178,
+ 234, 120, 224, 141, 52, 248, 178, 234, 120, 224, 141, 232, 207, 55, 219,
+ 28, 254, 38, 1, 241, 238, 55, 219, 28, 254, 38, 1, 233, 93, 55, 219, 28,
+ 254, 38, 1, 241, 195, 55, 219, 28, 254, 38, 1, 231, 65, 55, 219, 28, 254,
+ 38, 1, 224, 34, 55, 219, 28, 254, 38, 1, 212, 30, 55, 219, 28, 254, 38,
+ 1, 220, 20, 55, 219, 28, 254, 38, 1, 223, 67, 55, 219, 28, 254, 38, 1,
+ 252, 25, 55, 219, 28, 254, 38, 1, 217, 36, 55, 219, 28, 254, 38, 1, 221,
+ 226, 55, 219, 28, 254, 38, 1, 234, 225, 55, 219, 28, 254, 38, 1, 227,
+ 194, 55, 219, 28, 254, 38, 1, 234, 116, 55, 219, 28, 254, 38, 1, 222, 24,
+ 55, 219, 28, 254, 38, 1, 221, 249, 55, 219, 28, 254, 38, 1, 244, 154, 55,
+ 219, 28, 254, 38, 1, 254, 170, 55, 219, 28, 254, 38, 1, 253, 161, 55,
+ 219, 28, 254, 38, 1, 248, 22, 55, 219, 28, 254, 38, 1, 242, 201, 55, 219,
+ 28, 254, 38, 1, 248, 188, 55, 219, 28, 254, 38, 1, 242, 238, 55, 219, 28,
+ 254, 38, 1, 216, 226, 55, 219, 28, 254, 38, 1, 210, 96, 55, 219, 28, 254,
+ 38, 1, 248, 19, 55, 219, 28, 254, 38, 1, 210, 232, 55, 219, 28, 254, 38,
+ 1, 216, 197, 55, 219, 28, 254, 38, 1, 216, 178, 55, 219, 28, 254, 38, 54,
+ 110, 55, 219, 28, 254, 38, 54, 244, 114, 55, 219, 28, 254, 38, 132, 235,
+ 238, 253, 172, 1, 61, 253, 172, 1, 255, 73, 253, 172, 1, 254, 73, 253,
+ 172, 1, 255, 32, 253, 172, 1, 254, 123, 253, 172, 1, 255, 33, 253, 172,
+ 1, 254, 243, 253, 172, 1, 254, 239, 253, 172, 1, 75, 253, 172, 1, 245,
+ 209, 253, 172, 1, 76, 253, 172, 1, 226, 183, 253, 172, 1, 73, 253, 172,
+ 1, 236, 33, 253, 172, 1, 70, 253, 172, 1, 214, 118, 253, 172, 1, 234,
+ 182, 253, 172, 1, 211, 162, 253, 172, 1, 211, 128, 253, 172, 1, 211, 137,
+ 253, 172, 1, 243, 62, 253, 172, 1, 243, 24, 253, 172, 1, 242, 236, 253,
+ 172, 1, 250, 190, 253, 172, 1, 235, 126, 253, 172, 1, 217, 22, 253, 172,
+ 1, 216, 195, 253, 172, 1, 248, 90, 253, 172, 1, 248, 17, 253, 172, 1,
+ 215, 151, 253, 172, 1, 225, 221, 253, 172, 1, 244, 154, 253, 172, 1, 252,
+ 75, 253, 172, 1, 252, 14, 253, 172, 1, 229, 64, 253, 172, 1, 228, 239,
+ 253, 172, 1, 228, 240, 253, 172, 1, 229, 107, 253, 172, 1, 227, 156, 253,
+ 172, 1, 228, 105, 253, 172, 1, 231, 91, 253, 172, 1, 241, 116, 253, 172,
+ 1, 210, 166, 253, 172, 1, 211, 47, 253, 172, 1, 213, 255, 253, 172, 1,
+ 223, 128, 253, 172, 1, 233, 58, 253, 172, 1, 221, 181, 253, 172, 1, 210,
+ 94, 253, 172, 1, 220, 63, 253, 172, 1, 210, 74, 253, 172, 1, 219, 198,
+ 253, 172, 1, 218, 193, 253, 172, 1, 241, 238, 253, 172, 255, 21, 78, 216,
+ 79, 113, 170, 117, 123, 59, 224, 140, 4, 113, 170, 117, 123, 59, 224,
+ 140, 233, 85, 113, 170, 117, 123, 59, 224, 140, 233, 85, 123, 59, 117,
+ 113, 170, 224, 140, 233, 85, 113, 222, 232, 117, 123, 222, 234, 224, 140,
+ 233, 85, 123, 222, 234, 117, 113, 222, 232, 224, 140, 235, 218, 225, 254,
+ 1, 254, 168, 235, 218, 225, 254, 1, 252, 25, 235, 218, 225, 254, 1, 242,
+ 201, 235, 218, 225, 254, 1, 248, 188, 235, 218, 225, 254, 1, 241, 238,
+ 235, 218, 225, 254, 1, 212, 30, 235, 218, 225, 254, 1, 210, 97, 235, 218,
+ 225, 254, 1, 241, 195, 235, 218, 225, 254, 1, 216, 226, 235, 218, 225,
+ 254, 1, 210, 232, 235, 218, 225, 254, 1, 234, 225, 235, 218, 225, 254, 1,
+ 233, 93, 235, 218, 225, 254, 1, 231, 65, 235, 218, 225, 254, 1, 227, 194,
+ 235, 218, 225, 254, 1, 221, 249, 235, 218, 225, 254, 1, 253, 162, 235,
+ 218, 225, 254, 1, 225, 221, 235, 218, 225, 254, 1, 222, 24, 235, 218,
+ 225, 254, 1, 224, 34, 235, 218, 225, 254, 1, 223, 67, 235, 218, 225, 254,
+ 1, 220, 20, 235, 218, 225, 254, 1, 217, 36, 235, 218, 225, 254, 54, 110,
+ 235, 218, 225, 254, 54, 105, 235, 218, 225, 254, 54, 158, 235, 218, 225,
+ 254, 54, 161, 235, 218, 225, 254, 54, 216, 247, 235, 218, 225, 254, 54,
+ 215, 73, 235, 218, 225, 254, 54, 123, 240, 210, 235, 218, 225, 254, 54,
+ 123, 216, 147, 235, 218, 226, 72, 1, 254, 168, 235, 218, 226, 72, 1, 252,
+ 25, 235, 218, 226, 72, 1, 242, 201, 235, 218, 226, 72, 1, 248, 188, 235,
+ 218, 226, 72, 1, 241, 238, 235, 218, 226, 72, 1, 212, 29, 235, 218, 226,
+ 72, 1, 210, 97, 235, 218, 226, 72, 1, 241, 195, 235, 218, 226, 72, 1,
+ 216, 226, 235, 218, 226, 72, 1, 210, 232, 235, 218, 226, 72, 1, 234, 225,
+ 235, 218, 226, 72, 1, 233, 93, 235, 218, 226, 72, 1, 231, 64, 235, 218,
+ 226, 72, 1, 227, 194, 235, 218, 226, 72, 1, 221, 249, 235, 218, 226, 72,
+ 1, 225, 221, 235, 218, 226, 72, 1, 222, 24, 235, 218, 226, 72, 1, 220,
+ 20, 235, 218, 226, 72, 1, 217, 36, 235, 218, 226, 72, 54, 110, 235, 218,
+ 226, 72, 54, 105, 235, 218, 226, 72, 54, 158, 235, 218, 226, 72, 54, 161,
+ 235, 218, 226, 72, 54, 216, 247, 235, 218, 226, 72, 54, 215, 73, 235,
+ 218, 226, 72, 54, 123, 240, 210, 235, 218, 226, 72, 54, 123, 216, 147,
+ 55, 201, 1, 226, 149, 61, 55, 201, 1, 211, 37, 61, 55, 201, 1, 211, 37,
+ 254, 243, 55, 201, 1, 226, 149, 73, 55, 201, 1, 211, 37, 73, 55, 201, 1,
+ 211, 37, 75, 55, 201, 1, 226, 149, 76, 55, 201, 1, 226, 149, 226, 234,
+ 55, 201, 1, 211, 37, 226, 234, 55, 201, 1, 226, 149, 255, 25, 55, 201, 1,
+ 211, 37, 255, 25, 55, 201, 1, 226, 149, 254, 242, 55, 201, 1, 211, 37,
+ 254, 242, 55, 201, 1, 226, 149, 254, 216, 55, 201, 1, 211, 37, 254, 216,
+ 55, 201, 1, 226, 149, 254, 237, 55, 201, 1, 211, 37, 254, 237, 55, 201,
+ 1, 226, 149, 254, 255, 55, 201, 1, 211, 37, 254, 255, 55, 201, 1, 226,
+ 149, 254, 241, 55, 201, 1, 226, 149, 245, 12, 55, 201, 1, 211, 37, 245,
+ 12, 55, 201, 1, 226, 149, 253, 167, 55, 201, 1, 211, 37, 253, 167, 55,
+ 201, 1, 226, 149, 254, 224, 55, 201, 1, 211, 37, 254, 224, 55, 201, 1,
+ 226, 149, 254, 235, 55, 201, 1, 211, 37, 254, 235, 55, 201, 1, 226, 149,
+ 226, 233, 55, 201, 1, 211, 37, 226, 233, 55, 201, 1, 226, 149, 254, 178,
+ 55, 201, 1, 211, 37, 254, 178, 55, 201, 1, 226, 149, 254, 234, 55, 201,
+ 1, 226, 149, 245, 161, 55, 201, 1, 226, 149, 245, 159, 55, 201, 1, 226,
+ 149, 254, 123, 55, 201, 1, 226, 149, 254, 232, 55, 201, 1, 211, 37, 254,
+ 232, 55, 201, 1, 226, 149, 245, 131, 55, 201, 1, 211, 37, 245, 131, 55,
+ 201, 1, 226, 149, 245, 147, 55, 201, 1, 211, 37, 245, 147, 55, 201, 1,
+ 226, 149, 245, 118, 55, 201, 1, 211, 37, 245, 118, 55, 201, 1, 211, 37,
+ 254, 115, 55, 201, 1, 226, 149, 245, 138, 55, 201, 1, 211, 37, 254, 231,
+ 55, 201, 1, 226, 149, 245, 108, 55, 201, 1, 226, 149, 226, 175, 55, 201,
+ 1, 226, 149, 240, 113, 55, 201, 1, 226, 149, 245, 215, 55, 201, 1, 211,
+ 37, 245, 215, 55, 201, 1, 226, 149, 254, 45, 55, 201, 1, 211, 37, 254,
+ 45, 55, 201, 1, 226, 149, 235, 181, 55, 201, 1, 211, 37, 235, 181, 55,
+ 201, 1, 226, 149, 226, 159, 55, 201, 1, 211, 37, 226, 159, 55, 201, 1,
+ 226, 149, 254, 41, 55, 201, 1, 211, 37, 254, 41, 55, 201, 1, 226, 149,
+ 254, 230, 55, 201, 1, 226, 149, 253, 237, 55, 201, 1, 226, 149, 254, 228,
+ 55, 201, 1, 226, 149, 253, 231, 55, 201, 1, 211, 37, 253, 231, 55, 201,
+ 1, 226, 149, 245, 75, 55, 201, 1, 211, 37, 245, 75, 55, 201, 1, 226, 149,
+ 253, 206, 55, 201, 1, 211, 37, 253, 206, 55, 201, 1, 226, 149, 254, 225,
+ 55, 201, 1, 211, 37, 254, 225, 55, 201, 1, 226, 149, 226, 140, 55, 201,
+ 1, 226, 149, 252, 125, 222, 127, 21, 110, 222, 127, 21, 105, 222, 127,
+ 21, 158, 222, 127, 21, 161, 222, 127, 21, 189, 222, 127, 21, 194, 222,
+ 127, 21, 198, 222, 127, 21, 195, 222, 127, 21, 200, 222, 127, 54, 216,
+ 247, 222, 127, 54, 215, 73, 222, 127, 54, 216, 162, 222, 127, 54, 244,
+ 15, 222, 127, 54, 244, 114, 222, 127, 54, 219, 111, 222, 127, 54, 220,
+ 116, 222, 127, 54, 245, 184, 222, 127, 54, 228, 195, 222, 127, 54, 123,
+ 240, 210, 222, 127, 54, 113, 240, 210, 222, 127, 54, 134, 240, 210, 222,
+ 127, 54, 244, 11, 240, 210, 222, 127, 54, 244, 81, 240, 210, 222, 127,
+ 54, 219, 125, 240, 210, 222, 127, 54, 220, 122, 240, 210, 222, 127, 54,
+ 245, 193, 240, 210, 222, 127, 54, 228, 200, 240, 210, 222, 127, 244, 2,
+ 123, 242, 27, 222, 127, 244, 2, 123, 224, 21, 222, 127, 244, 2, 123, 216,
+ 168, 222, 127, 244, 2, 113, 216, 166, 118, 5, 250, 255, 118, 5, 254, 75,
+ 118, 5, 213, 147, 118, 5, 235, 102, 118, 5, 214, 161, 118, 1, 61, 118, 1,
+ 255, 73, 118, 1, 73, 118, 1, 236, 33, 118, 1, 70, 118, 1, 214, 118, 118,
+ 1, 149, 153, 118, 1, 149, 222, 180, 118, 1, 149, 156, 118, 1, 149, 232,
+ 185, 118, 1, 75, 118, 1, 254, 201, 118, 1, 76, 118, 1, 253, 192, 118, 1,
+ 176, 118, 1, 234, 132, 118, 1, 243, 135, 118, 1, 242, 249, 118, 1, 229,
+ 77, 118, 1, 251, 33, 118, 1, 250, 157, 118, 1, 235, 141, 118, 1, 235,
+ 114, 118, 1, 227, 165, 118, 1, 215, 156, 118, 1, 215, 144, 118, 1, 248,
+ 135, 118, 1, 248, 119, 118, 1, 228, 110, 118, 1, 217, 105, 118, 1, 216,
+ 208, 118, 1, 248, 221, 118, 1, 248, 25, 118, 1, 197, 118, 1, 190, 118, 1,
+ 225, 147, 118, 1, 252, 191, 118, 1, 252, 18, 118, 1, 184, 118, 1, 191,
+ 118, 1, 205, 118, 1, 233, 135, 118, 1, 214, 27, 118, 1, 220, 102, 118, 1,
+ 218, 223, 118, 1, 206, 118, 1, 162, 118, 1, 232, 184, 118, 1, 55, 36,
+ 232, 175, 118, 1, 55, 36, 222, 179, 118, 1, 55, 36, 228, 92, 118, 25, 5,
+ 255, 73, 118, 25, 5, 252, 15, 255, 73, 118, 25, 5, 73, 118, 25, 5, 236,
+ 33, 118, 25, 5, 70, 118, 25, 5, 214, 118, 118, 25, 5, 149, 153, 118, 25,
+ 5, 149, 222, 180, 118, 25, 5, 149, 156, 118, 25, 5, 149, 232, 185, 118,
+ 25, 5, 75, 118, 25, 5, 254, 201, 118, 25, 5, 76, 118, 25, 5, 253, 192,
+ 118, 213, 152, 118, 248, 178, 118, 52, 248, 178, 118, 224, 141, 247, 120,
+ 118, 224, 141, 52, 247, 120, 118, 224, 141, 232, 213, 118, 224, 141, 249,
+ 137, 130, 118, 224, 141, 232, 115, 118, 54, 110, 118, 54, 105, 118, 54,
+ 158, 118, 54, 161, 118, 54, 189, 118, 54, 194, 118, 54, 198, 118, 54,
+ 195, 118, 54, 200, 118, 54, 216, 247, 118, 54, 215, 73, 118, 54, 216,
+ 162, 118, 54, 244, 15, 118, 54, 244, 114, 118, 54, 219, 111, 118, 54,
+ 220, 116, 118, 54, 245, 184, 118, 54, 228, 195, 118, 54, 123, 240, 210,
+ 118, 54, 123, 216, 147, 118, 21, 210, 86, 118, 21, 110, 118, 21, 105,
+ 118, 21, 158, 118, 21, 161, 118, 21, 189, 118, 21, 194, 118, 21, 198,
+ 118, 21, 195, 118, 21, 200, 234, 244, 5, 250, 255, 234, 244, 5, 254, 75,
+ 234, 244, 5, 213, 147, 234, 244, 1, 61, 234, 244, 1, 255, 73, 234, 244,
+ 1, 73, 234, 244, 1, 236, 33, 234, 244, 1, 70, 234, 244, 1, 214, 118, 234,
+ 244, 1, 75, 234, 244, 1, 254, 201, 234, 244, 1, 76, 234, 244, 1, 253,
+ 192, 234, 244, 1, 176, 234, 244, 1, 234, 132, 234, 244, 1, 243, 135, 234,
+ 244, 1, 242, 249, 234, 244, 1, 229, 77, 234, 244, 1, 251, 33, 234, 244,
+ 1, 250, 157, 234, 244, 1, 235, 141, 234, 244, 1, 235, 114, 234, 244, 1,
+ 227, 165, 234, 244, 1, 215, 156, 234, 244, 1, 215, 144, 234, 244, 1, 248,
+ 135, 234, 244, 1, 248, 124, 234, 244, 1, 248, 119, 234, 244, 1, 223, 39,
+ 234, 244, 1, 228, 110, 234, 244, 1, 217, 105, 234, 244, 1, 216, 208, 234,
+ 244, 1, 248, 221, 234, 244, 1, 248, 25, 234, 244, 1, 197, 234, 244, 1,
+ 190, 234, 244, 1, 225, 147, 234, 244, 1, 252, 191, 234, 244, 1, 252, 18,
+ 234, 244, 1, 184, 234, 244, 1, 191, 234, 244, 1, 205, 234, 244, 1, 233,
+ 135, 234, 244, 1, 214, 27, 234, 244, 1, 220, 102, 234, 244, 1, 218, 223,
+ 234, 244, 1, 206, 234, 244, 1, 162, 234, 244, 25, 5, 255, 73, 234, 244,
+ 25, 5, 73, 234, 244, 25, 5, 236, 33, 234, 244, 25, 5, 70, 234, 244, 25,
+ 5, 214, 118, 234, 244, 25, 5, 75, 234, 244, 25, 5, 254, 201, 234, 244,
+ 25, 5, 76, 234, 244, 25, 5, 253, 192, 234, 244, 5, 213, 152, 234, 244, 5,
+ 227, 205, 234, 244, 255, 21, 50, 234, 244, 245, 121, 50, 234, 244, 54,
+ 50, 234, 244, 221, 173, 78, 234, 244, 52, 221, 173, 78, 234, 244, 248,
+ 178, 234, 244, 52, 248, 178, 219, 36, 219, 44, 1, 222, 18, 219, 36, 219,
+ 44, 1, 217, 80, 219, 36, 219, 44, 1, 252, 168, 219, 36, 219, 44, 1, 251,
+ 23, 219, 36, 219, 44, 1, 248, 203, 219, 36, 219, 44, 1, 243, 120, 219,
+ 36, 219, 44, 1, 231, 210, 219, 36, 219, 44, 1, 229, 74, 219, 36, 219, 44,
+ 1, 233, 112, 219, 36, 219, 44, 1, 229, 213, 219, 36, 219, 44, 1, 214, 24,
+ 219, 36, 219, 44, 1, 226, 73, 219, 36, 219, 44, 1, 211, 84, 219, 36, 219,
+ 44, 1, 223, 168, 219, 36, 219, 44, 1, 242, 37, 219, 36, 219, 44, 1, 234,
+ 248, 219, 36, 219, 44, 1, 235, 136, 219, 36, 219, 44, 1, 227, 162, 219,
+ 36, 219, 44, 1, 254, 209, 219, 36, 219, 44, 1, 245, 207, 219, 36, 219,
+ 44, 1, 236, 34, 219, 36, 219, 44, 1, 214, 208, 219, 36, 219, 44, 1, 226,
+ 222, 219, 36, 219, 44, 1, 245, 197, 219, 36, 219, 44, 1, 231, 223, 219,
+ 36, 219, 44, 21, 210, 86, 219, 36, 219, 44, 21, 110, 219, 36, 219, 44,
+ 21, 105, 219, 36, 219, 44, 21, 158, 219, 36, 219, 44, 21, 161, 219, 36,
+ 219, 44, 21, 189, 219, 36, 219, 44, 21, 194, 219, 36, 219, 44, 21, 198,
+ 219, 36, 219, 44, 21, 195, 219, 36, 219, 44, 21, 200, 250, 151, 5, 250,
+ 255, 250, 151, 5, 254, 75, 250, 151, 5, 213, 147, 250, 151, 1, 255, 73,
+ 250, 151, 1, 73, 250, 151, 1, 70, 250, 151, 1, 75, 250, 151, 1, 235, 10,
+ 250, 151, 1, 234, 131, 250, 151, 1, 243, 132, 250, 151, 1, 242, 248, 250,
+ 151, 1, 229, 76, 250, 151, 1, 251, 32, 250, 151, 1, 250, 156, 250, 151,
+ 1, 235, 140, 250, 151, 1, 235, 113, 250, 151, 1, 227, 164, 250, 151, 1,
+ 215, 155, 250, 151, 1, 215, 143, 250, 151, 1, 248, 134, 250, 151, 1, 248,
+ 118, 250, 151, 1, 228, 109, 250, 151, 1, 217, 101, 250, 151, 1, 216, 207,
+ 250, 151, 1, 248, 220, 250, 151, 1, 248, 24, 250, 151, 1, 229, 225, 250,
+ 151, 1, 226, 89, 250, 151, 1, 225, 146, 250, 151, 1, 252, 189, 250, 151,
+ 1, 252, 17, 250, 151, 1, 231, 237, 250, 151, 1, 210, 167, 250, 151, 1,
+ 211, 103, 250, 151, 1, 223, 184, 250, 151, 1, 233, 134, 250, 151, 1, 212,
+ 64, 250, 151, 1, 222, 31, 250, 151, 1, 242, 46, 250, 151, 25, 5, 61, 250,
+ 151, 25, 5, 73, 250, 151, 25, 5, 236, 33, 250, 151, 25, 5, 70, 250, 151,
+ 25, 5, 214, 118, 250, 151, 25, 5, 75, 250, 151, 25, 5, 254, 201, 250,
+ 151, 25, 5, 76, 250, 151, 25, 5, 253, 192, 250, 151, 25, 5, 226, 219,
+ 250, 151, 144, 78, 250, 151, 253, 193, 78, 250, 151, 213, 152, 250, 151,
+ 231, 235, 250, 151, 21, 210, 86, 250, 151, 21, 110, 250, 151, 21, 105,
+ 250, 151, 21, 158, 250, 151, 21, 161, 250, 151, 21, 189, 250, 151, 21,
+ 194, 250, 151, 21, 198, 250, 151, 21, 195, 250, 151, 21, 200, 250, 151,
+ 221, 173, 78, 250, 151, 248, 178, 250, 151, 52, 248, 178, 250, 151, 224,
+ 13, 78, 174, 5, 250, 255, 174, 5, 254, 75, 174, 5, 213, 147, 174, 1, 61,
+ 174, 1, 255, 73, 174, 1, 73, 174, 1, 236, 33, 174, 1, 70, 174, 1, 214,
+ 118, 174, 1, 149, 153, 174, 1, 149, 222, 180, 174, 1, 149, 156, 174, 1,
+ 149, 232, 185, 174, 1, 75, 174, 1, 254, 201, 174, 1, 76, 174, 1, 253,
+ 192, 174, 1, 176, 174, 1, 234, 132, 174, 1, 243, 135, 174, 1, 242, 249,
+ 174, 1, 229, 77, 174, 1, 251, 33, 174, 1, 250, 157, 174, 1, 235, 141,
+ 174, 1, 235, 114, 174, 1, 227, 165, 174, 1, 215, 156, 174, 1, 215, 144,
+ 174, 1, 248, 135, 174, 1, 248, 119, 174, 1, 228, 110, 174, 1, 217, 105,
+ 174, 1, 216, 208, 174, 1, 248, 221, 174, 1, 248, 25, 174, 1, 197, 174, 1,
+ 190, 174, 1, 225, 147, 174, 1, 252, 191, 174, 1, 252, 18, 174, 1, 184,
+ 174, 1, 191, 174, 1, 205, 174, 1, 233, 135, 174, 1, 232, 184, 174, 1,
+ 214, 27, 174, 1, 220, 102, 174, 1, 218, 223, 174, 1, 206, 174, 1, 162,
+ 174, 25, 5, 255, 73, 174, 25, 5, 73, 174, 25, 5, 236, 33, 174, 25, 5, 70,
+ 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, 5, 149, 222, 180,
+ 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 185, 174, 25, 5, 75, 174, 25,
+ 5, 254, 201, 174, 25, 5, 76, 174, 25, 5, 253, 192, 174, 5, 213, 152, 174,
+ 5, 253, 175, 174, 5, 235, 102, 174, 5, 214, 161, 174, 226, 204, 174, 248,
+ 178, 174, 52, 248, 178, 174, 255, 21, 50, 174, 220, 137, 174, 21, 210,
+ 86, 174, 21, 110, 174, 21, 105, 174, 21, 158, 174, 21, 161, 174, 21, 189,
+ 174, 21, 194, 174, 21, 198, 174, 21, 195, 174, 21, 200, 217, 69, 1, 61,
+ 217, 69, 1, 255, 73, 217, 69, 1, 73, 217, 69, 1, 236, 33, 217, 69, 1, 70,
+ 217, 69, 1, 214, 118, 217, 69, 1, 75, 217, 69, 1, 254, 201, 217, 69, 1,
+ 76, 217, 69, 1, 253, 192, 217, 69, 1, 176, 217, 69, 1, 234, 132, 217, 69,
+ 1, 243, 135, 217, 69, 1, 242, 249, 217, 69, 1, 229, 77, 217, 69, 1, 251,
+ 33, 217, 69, 1, 250, 157, 217, 69, 1, 235, 141, 217, 69, 1, 235, 114,
+ 217, 69, 1, 227, 165, 217, 69, 1, 215, 156, 217, 69, 1, 215, 144, 217,
+ 69, 1, 248, 135, 217, 69, 1, 248, 119, 217, 69, 1, 228, 110, 217, 69, 1,
+ 217, 105, 217, 69, 1, 216, 208, 217, 69, 1, 248, 221, 217, 69, 1, 248,
+ 25, 217, 69, 1, 197, 217, 69, 1, 190, 217, 69, 1, 225, 147, 217, 69, 1,
+ 252, 191, 217, 69, 1, 252, 18, 217, 69, 1, 184, 217, 69, 1, 191, 217, 69,
+ 1, 205, 217, 69, 1, 233, 135, 217, 69, 1, 214, 27, 217, 69, 1, 220, 102,
+ 217, 69, 1, 206, 217, 69, 1, 162, 217, 69, 1, 222, 179, 217, 69, 5, 254,
+ 75, 217, 69, 5, 213, 147, 217, 69, 25, 5, 255, 73, 217, 69, 25, 5, 73,
+ 217, 69, 25, 5, 236, 33, 217, 69, 25, 5, 70, 217, 69, 25, 5, 214, 118,
+ 217, 69, 25, 5, 75, 217, 69, 25, 5, 254, 201, 217, 69, 25, 5, 76, 217,
+ 69, 25, 5, 253, 192, 217, 69, 5, 213, 152, 217, 69, 5, 227, 205, 217, 69,
+ 21, 210, 86, 217, 69, 21, 110, 217, 69, 21, 105, 217, 69, 21, 158, 217,
+ 69, 21, 161, 217, 69, 21, 189, 217, 69, 21, 194, 217, 69, 21, 198, 217,
+ 69, 21, 195, 217, 69, 21, 200, 15, 5, 61, 15, 5, 115, 30, 61, 15, 5, 115,
+ 30, 252, 176, 15, 5, 115, 30, 243, 105, 216, 239, 15, 5, 115, 30, 162,
+ 15, 5, 115, 30, 236, 35, 15, 5, 115, 30, 233, 116, 242, 94, 15, 5, 115,
+ 30, 230, 61, 15, 5, 115, 30, 222, 21, 15, 5, 255, 75, 15, 5, 255, 25, 15,
+ 5, 255, 26, 30, 253, 229, 15, 5, 255, 26, 30, 246, 67, 242, 94, 15, 5,
+ 255, 26, 30, 243, 118, 15, 5, 255, 26, 30, 243, 105, 216, 239, 15, 5,
+ 255, 26, 30, 162, 15, 5, 255, 26, 30, 236, 36, 242, 94, 15, 5, 255, 26,
+ 30, 236, 9, 15, 5, 255, 26, 30, 233, 117, 15, 5, 255, 26, 30, 220, 48,
+ 15, 5, 255, 26, 30, 104, 96, 104, 96, 70, 15, 5, 255, 26, 242, 94, 15, 5,
+ 255, 23, 15, 5, 255, 24, 30, 252, 160, 15, 5, 255, 24, 30, 243, 105, 216,
+ 239, 15, 5, 255, 24, 30, 231, 92, 96, 245, 150, 15, 5, 255, 24, 30, 220,
+ 100, 15, 5, 255, 24, 30, 217, 72, 15, 5, 254, 255, 15, 5, 254, 186, 15,
+ 5, 254, 187, 30, 245, 87, 15, 5, 254, 187, 30, 220, 10, 96, 242, 190, 15,
+ 5, 254, 178, 15, 5, 254, 179, 30, 254, 178, 15, 5, 254, 179, 30, 247,
+ 216, 15, 5, 254, 179, 30, 242, 190, 15, 5, 254, 179, 30, 162, 15, 5, 254,
+ 179, 30, 234, 255, 15, 5, 254, 179, 30, 234, 92, 15, 5, 254, 179, 30,
+ 220, 63, 15, 5, 254, 179, 30, 214, 126, 15, 5, 254, 175, 15, 5, 254, 168,
+ 15, 5, 254, 132, 15, 5, 254, 133, 30, 220, 63, 15, 5, 254, 123, 15, 5,
+ 254, 124, 117, 254, 123, 15, 5, 254, 124, 134, 216, 85, 15, 5, 254, 124,
+ 96, 229, 217, 226, 164, 254, 124, 96, 229, 216, 15, 5, 254, 124, 96, 229,
+ 217, 218, 233, 15, 5, 254, 94, 15, 5, 254, 67, 15, 5, 254, 35, 15, 5,
+ 254, 36, 30, 233, 196, 15, 5, 254, 8, 15, 5, 253, 236, 15, 5, 253, 231,
+ 15, 5, 253, 232, 210, 40, 216, 239, 15, 5, 253, 232, 235, 3, 216, 239,
+ 15, 5, 253, 232, 117, 253, 232, 215, 114, 117, 215, 114, 215, 114, 117,
+ 215, 114, 226, 21, 15, 5, 253, 232, 117, 253, 232, 117, 253, 231, 15, 5,
+ 253, 232, 117, 253, 232, 117, 253, 232, 249, 125, 253, 232, 117, 253,
+ 232, 117, 253, 231, 15, 5, 253, 229, 15, 5, 253, 226, 15, 5, 252, 191,
+ 15, 5, 252, 176, 15, 5, 252, 171, 15, 5, 252, 167, 15, 5, 252, 161, 15,
+ 5, 252, 162, 117, 252, 161, 15, 5, 252, 160, 15, 5, 130, 15, 5, 252, 140,
+ 15, 5, 252, 6, 15, 5, 252, 7, 30, 61, 15, 5, 252, 7, 30, 243, 96, 15, 5,
+ 252, 7, 30, 236, 36, 242, 94, 15, 5, 251, 125, 15, 5, 251, 126, 117, 251,
+ 126, 255, 25, 15, 5, 251, 126, 117, 251, 126, 214, 190, 15, 5, 251, 126,
+ 249, 125, 251, 125, 15, 5, 251, 109, 15, 5, 251, 110, 117, 251, 109, 15,
+ 5, 251, 98, 15, 5, 251, 97, 15, 5, 248, 221, 15, 5, 248, 212, 15, 5, 248,
+ 213, 234, 66, 30, 115, 96, 231, 147, 15, 5, 248, 213, 234, 66, 30, 254,
+ 132, 15, 5, 248, 213, 234, 66, 30, 252, 160, 15, 5, 248, 213, 234, 66,
+ 30, 252, 6, 15, 5, 248, 213, 234, 66, 30, 243, 135, 15, 5, 248, 213, 234,
+ 66, 30, 243, 136, 96, 231, 147, 15, 5, 248, 213, 234, 66, 30, 242, 214,
+ 15, 5, 248, 213, 234, 66, 30, 242, 197, 15, 5, 248, 213, 234, 66, 30,
+ 242, 103, 15, 5, 248, 213, 234, 66, 30, 162, 15, 5, 248, 213, 234, 66,
+ 30, 235, 179, 15, 5, 248, 213, 234, 66, 30, 235, 180, 96, 232, 98, 15, 5,
+ 248, 213, 234, 66, 30, 234, 242, 15, 5, 248, 213, 234, 66, 30, 233, 135,
+ 15, 5, 248, 213, 234, 66, 30, 232, 98, 15, 5, 248, 213, 234, 66, 30, 232,
+ 99, 96, 231, 146, 15, 5, 248, 213, 234, 66, 30, 232, 84, 15, 5, 248, 213,
+ 234, 66, 30, 229, 107, 15, 5, 248, 213, 234, 66, 30, 226, 22, 96, 226,
+ 21, 15, 5, 248, 213, 234, 66, 30, 219, 191, 15, 5, 248, 213, 234, 66, 30,
+ 217, 72, 15, 5, 248, 213, 234, 66, 30, 214, 231, 96, 242, 197, 15, 5,
+ 248, 213, 234, 66, 30, 214, 126, 15, 5, 248, 187, 15, 5, 248, 166, 15, 5,
+ 248, 165, 15, 5, 248, 164, 15, 5, 248, 3, 15, 5, 247, 242, 15, 5, 247,
+ 217, 15, 5, 247, 218, 30, 220, 63, 15, 5, 247, 216, 15, 5, 247, 206, 15,
+ 5, 247, 207, 234, 208, 104, 242, 95, 247, 187, 15, 5, 247, 187, 15, 5,
+ 246, 78, 15, 5, 246, 79, 117, 246, 78, 15, 5, 246, 79, 242, 94, 15, 5,
+ 246, 79, 220, 45, 15, 5, 246, 76, 15, 5, 246, 77, 30, 245, 72, 15, 5,
+ 246, 75, 15, 5, 246, 74, 15, 5, 246, 73, 15, 5, 246, 72, 15, 5, 246, 68,
+ 15, 5, 246, 66, 15, 5, 246, 67, 242, 94, 15, 5, 246, 67, 242, 95, 242,
+ 94, 15, 5, 246, 65, 15, 5, 246, 58, 15, 5, 75, 15, 5, 160, 30, 226, 21,
+ 15, 5, 160, 117, 160, 227, 195, 117, 227, 194, 15, 5, 245, 234, 15, 5,
+ 245, 235, 30, 115, 96, 242, 49, 96, 248, 221, 15, 5, 245, 235, 30, 243,
+ 96, 15, 5, 245, 235, 30, 230, 230, 15, 5, 245, 235, 30, 222, 8, 15, 5,
+ 245, 235, 30, 220, 63, 15, 5, 245, 235, 30, 70, 15, 5, 245, 211, 15, 5,
+ 245, 200, 15, 5, 245, 174, 15, 5, 245, 150, 15, 5, 245, 151, 30, 243,
+ 104, 15, 5, 245, 151, 30, 243, 105, 216, 239, 15, 5, 245, 151, 30, 231,
+ 91, 15, 5, 245, 151, 249, 125, 245, 150, 15, 5, 245, 151, 226, 164, 245,
+ 150, 15, 5, 245, 151, 218, 233, 15, 5, 245, 89, 15, 5, 245, 87, 15, 5,
+ 245, 72, 15, 5, 245, 10, 15, 5, 245, 11, 30, 61, 15, 5, 245, 11, 30, 115,
+ 96, 233, 104, 15, 5, 245, 11, 30, 115, 96, 233, 105, 30, 233, 104, 15, 5,
+ 245, 11, 30, 254, 123, 15, 5, 245, 11, 30, 252, 176, 15, 5, 245, 11, 30,
+ 246, 67, 242, 94, 15, 5, 245, 11, 30, 246, 67, 242, 95, 242, 94, 15, 5,
+ 245, 11, 30, 162, 15, 5, 245, 11, 30, 242, 49, 242, 94, 15, 5, 245, 11,
+ 30, 236, 36, 242, 94, 15, 5, 245, 11, 30, 234, 207, 15, 5, 245, 11, 30,
+ 234, 208, 218, 233, 15, 5, 245, 11, 30, 233, 215, 15, 5, 245, 11, 30,
+ 233, 135, 15, 5, 245, 11, 30, 233, 105, 30, 233, 104, 15, 5, 245, 11, 30,
+ 232, 241, 15, 5, 245, 11, 30, 232, 98, 15, 5, 245, 11, 30, 214, 230, 15,
+ 5, 245, 11, 30, 214, 219, 15, 5, 243, 135, 15, 5, 243, 136, 242, 94, 15,
+ 5, 243, 133, 15, 5, 243, 134, 30, 115, 96, 248, 222, 96, 162, 15, 5, 243,
+ 134, 30, 115, 96, 162, 15, 5, 243, 134, 30, 115, 96, 236, 35, 15, 5, 243,
+ 134, 30, 255, 24, 216, 240, 96, 217, 93, 15, 5, 243, 134, 30, 254, 123,
+ 15, 5, 243, 134, 30, 253, 231, 15, 5, 243, 134, 30, 253, 230, 96, 243,
+ 118, 15, 5, 243, 134, 30, 252, 176, 15, 5, 243, 134, 30, 252, 141, 96,
+ 205, 15, 5, 243, 134, 30, 251, 98, 15, 5, 243, 134, 30, 251, 99, 96, 205,
+ 15, 5, 243, 134, 30, 248, 221, 15, 5, 243, 134, 30, 248, 3, 15, 5, 243,
+ 134, 30, 247, 218, 30, 220, 63, 15, 5, 243, 134, 30, 246, 76, 15, 5, 243,
+ 134, 30, 245, 174, 15, 5, 243, 134, 30, 245, 175, 96, 233, 135, 15, 5,
+ 243, 134, 30, 245, 150, 15, 5, 243, 134, 30, 245, 151, 30, 243, 105, 216,
+ 239, 15, 5, 243, 134, 30, 243, 105, 216, 239, 15, 5, 243, 134, 30, 243,
+ 96, 15, 5, 243, 134, 30, 242, 214, 15, 5, 243, 134, 30, 242, 212, 15, 5,
+ 243, 134, 30, 242, 213, 96, 61, 15, 5, 243, 134, 30, 242, 198, 96, 218,
+ 83, 15, 5, 243, 134, 30, 242, 49, 96, 232, 99, 96, 245, 72, 15, 5, 243,
+ 134, 30, 242, 30, 15, 5, 243, 134, 30, 242, 31, 96, 233, 135, 15, 5, 243,
+ 134, 30, 241, 181, 96, 232, 241, 15, 5, 243, 134, 30, 240, 218, 15, 5,
+ 243, 134, 30, 236, 36, 242, 94, 15, 5, 243, 134, 30, 235, 166, 96, 240,
+ 223, 96, 253, 231, 15, 5, 243, 134, 30, 234, 242, 15, 5, 243, 134, 30,
+ 234, 207, 15, 5, 243, 134, 30, 234, 89, 15, 5, 243, 134, 30, 234, 90, 96,
+ 233, 104, 15, 5, 243, 134, 30, 233, 216, 96, 254, 123, 15, 5, 243, 134,
+ 30, 233, 135, 15, 5, 243, 134, 30, 231, 92, 96, 245, 150, 15, 5, 243,
+ 134, 30, 230, 230, 15, 5, 243, 134, 30, 227, 194, 15, 5, 243, 134, 30,
+ 227, 195, 117, 227, 194, 15, 5, 243, 134, 30, 190, 15, 5, 243, 134, 30,
+ 222, 8, 15, 5, 243, 134, 30, 221, 231, 15, 5, 243, 134, 30, 220, 63, 15,
+ 5, 243, 134, 30, 220, 64, 96, 215, 98, 15, 5, 243, 134, 30, 220, 30, 15,
+ 5, 243, 134, 30, 218, 43, 15, 5, 243, 134, 30, 217, 72, 15, 5, 243, 134,
+ 30, 70, 15, 5, 243, 134, 30, 214, 219, 15, 5, 243, 134, 30, 214, 220, 96,
+ 246, 78, 15, 5, 243, 134, 117, 243, 133, 15, 5, 243, 128, 15, 5, 243,
+ 129, 249, 125, 243, 128, 15, 5, 243, 126, 15, 5, 243, 127, 117, 243, 127,
+ 243, 97, 117, 243, 96, 15, 5, 243, 118, 15, 5, 243, 119, 243, 127, 117,
+ 243, 127, 243, 97, 117, 243, 96, 15, 5, 243, 117, 15, 5, 243, 115, 15, 5,
+ 243, 106, 15, 5, 243, 104, 15, 5, 243, 105, 216, 239, 15, 5, 243, 105,
+ 117, 243, 104, 15, 5, 243, 105, 249, 125, 243, 104, 15, 5, 243, 96, 15,
+ 5, 243, 95, 15, 5, 243, 90, 15, 5, 243, 36, 15, 5, 243, 37, 30, 233, 196,
+ 15, 5, 242, 214, 15, 5, 242, 215, 30, 75, 15, 5, 242, 215, 30, 70, 15, 5,
+ 242, 215, 249, 125, 242, 214, 15, 5, 242, 212, 15, 5, 242, 213, 117, 242,
+ 212, 15, 5, 242, 213, 249, 125, 242, 212, 15, 5, 242, 209, 15, 5, 242,
+ 197, 15, 5, 242, 198, 242, 94, 15, 5, 242, 195, 15, 5, 242, 196, 30, 115,
+ 96, 236, 35, 15, 5, 242, 196, 30, 243, 105, 216, 239, 15, 5, 242, 196,
+ 30, 236, 35, 15, 5, 242, 196, 30, 232, 99, 96, 236, 35, 15, 5, 242, 196,
+ 30, 190, 15, 5, 242, 192, 15, 5, 242, 190, 15, 5, 242, 191, 249, 125,
+ 242, 190, 15, 5, 242, 191, 30, 252, 176, 15, 5, 242, 191, 30, 217, 72,
+ 15, 5, 242, 191, 216, 239, 15, 5, 242, 113, 15, 5, 242, 114, 249, 125,
+ 242, 113, 15, 5, 242, 111, 15, 5, 242, 112, 30, 234, 242, 15, 5, 242,
+ 112, 30, 234, 243, 30, 236, 36, 242, 94, 15, 5, 242, 112, 30, 227, 194,
+ 15, 5, 242, 112, 30, 222, 9, 96, 215, 113, 15, 5, 242, 112, 242, 94, 15,
+ 5, 242, 103, 15, 5, 242, 104, 30, 115, 96, 233, 196, 15, 5, 242, 104, 30,
+ 233, 196, 15, 5, 242, 104, 117, 242, 104, 232, 91, 15, 5, 242, 98, 15, 5,
+ 242, 96, 15, 5, 242, 97, 30, 220, 63, 15, 5, 242, 88, 15, 5, 242, 87, 15,
+ 5, 242, 84, 15, 5, 242, 83, 15, 5, 162, 15, 5, 242, 49, 216, 239, 15, 5,
+ 242, 49, 242, 94, 15, 5, 242, 30, 15, 5, 241, 180, 15, 5, 241, 181, 30,
+ 253, 231, 15, 5, 241, 181, 30, 253, 229, 15, 5, 241, 181, 30, 252, 176,
+ 15, 5, 241, 181, 30, 247, 187, 15, 5, 241, 181, 30, 243, 126, 15, 5, 241,
+ 181, 30, 234, 81, 15, 5, 241, 181, 30, 227, 194, 15, 5, 241, 181, 30,
+ 220, 63, 15, 5, 241, 181, 30, 70, 15, 5, 240, 222, 15, 5, 240, 218, 15,
+ 5, 240, 219, 30, 254, 123, 15, 5, 240, 219, 30, 242, 30, 15, 5, 240, 219,
+ 30, 234, 207, 15, 5, 240, 219, 30, 232, 197, 15, 5, 240, 219, 30, 214,
+ 219, 15, 5, 240, 215, 15, 5, 73, 15, 5, 240, 154, 61, 15, 5, 240, 115,
+ 15, 5, 236, 63, 15, 5, 236, 64, 117, 236, 64, 251, 98, 15, 5, 236, 64,
+ 117, 236, 64, 218, 233, 15, 5, 236, 38, 15, 5, 236, 35, 15, 5, 236, 36,
+ 247, 242, 15, 5, 236, 36, 223, 35, 15, 5, 236, 36, 117, 236, 36, 220, 14,
+ 117, 220, 14, 214, 220, 117, 214, 219, 15, 5, 236, 36, 242, 94, 15, 5,
+ 236, 27, 15, 5, 236, 28, 30, 243, 105, 216, 239, 15, 5, 236, 26, 15, 5,
+ 236, 16, 15, 5, 236, 17, 30, 217, 72, 15, 5, 236, 17, 249, 125, 236, 16,
+ 15, 5, 236, 17, 226, 164, 236, 16, 15, 5, 236, 17, 218, 233, 15, 5, 236,
+ 9, 15, 5, 235, 255, 15, 5, 235, 179, 15, 5, 235, 165, 15, 5, 176, 15, 5,
+ 235, 13, 30, 61, 15, 5, 235, 13, 30, 254, 255, 15, 5, 235, 13, 30, 255,
+ 0, 96, 233, 215, 15, 5, 235, 13, 30, 253, 229, 15, 5, 235, 13, 30, 252,
+ 176, 15, 5, 235, 13, 30, 252, 160, 15, 5, 235, 13, 30, 130, 15, 5, 235,
+ 13, 30, 252, 6, 15, 5, 235, 13, 30, 245, 87, 15, 5, 235, 13, 30, 245, 72,
+ 15, 5, 235, 13, 30, 243, 135, 15, 5, 235, 13, 30, 243, 118, 15, 5, 235,
+ 13, 30, 243, 105, 216, 239, 15, 5, 235, 13, 30, 243, 96, 15, 5, 235, 13,
+ 30, 243, 97, 96, 220, 101, 96, 61, 15, 5, 235, 13, 30, 242, 214, 15, 5,
+ 235, 13, 30, 242, 197, 15, 5, 235, 13, 30, 242, 191, 96, 221, 231, 15, 5,
+ 235, 13, 30, 242, 191, 249, 125, 242, 190, 15, 5, 235, 13, 30, 242, 113,
+ 15, 5, 235, 13, 30, 242, 87, 15, 5, 235, 13, 30, 236, 35, 15, 5, 235, 13,
+ 30, 236, 16, 15, 5, 235, 13, 30, 234, 242, 15, 5, 235, 13, 30, 234, 92,
+ 15, 5, 235, 13, 30, 234, 89, 15, 5, 235, 13, 30, 232, 241, 15, 5, 235,
+ 13, 30, 232, 98, 15, 5, 235, 13, 30, 231, 91, 15, 5, 235, 13, 30, 231,
+ 92, 96, 246, 78, 15, 5, 235, 13, 30, 231, 92, 96, 242, 214, 15, 5, 235,
+ 13, 30, 231, 92, 96, 217, 22, 15, 5, 235, 13, 30, 230, 230, 15, 5, 235,
+ 13, 30, 230, 231, 96, 227, 189, 15, 5, 235, 13, 30, 229, 107, 15, 5, 235,
+ 13, 30, 227, 194, 15, 5, 235, 13, 30, 225, 108, 15, 5, 235, 13, 30, 222,
+ 140, 15, 5, 235, 13, 30, 206, 15, 5, 235, 13, 30, 221, 231, 15, 5, 235,
+ 13, 30, 220, 102, 15, 5, 235, 13, 30, 220, 63, 15, 5, 235, 13, 30, 220,
+ 30, 15, 5, 235, 13, 30, 219, 225, 15, 5, 235, 13, 30, 219, 182, 15, 5,
+ 235, 13, 30, 218, 51, 15, 5, 235, 13, 30, 217, 50, 15, 5, 235, 13, 30,
+ 70, 15, 5, 235, 13, 30, 214, 230, 15, 5, 235, 13, 30, 214, 219, 15, 5,
+ 235, 13, 30, 214, 193, 30, 190, 15, 5, 235, 13, 30, 214, 126, 15, 5, 235,
+ 13, 30, 210, 44, 15, 5, 235, 11, 15, 5, 235, 12, 249, 125, 235, 11, 15,
+ 5, 235, 4, 15, 5, 235, 1, 15, 5, 234, 255, 15, 5, 234, 254, 15, 5, 234,
+ 252, 15, 5, 234, 253, 117, 234, 252, 15, 5, 234, 242, 15, 5, 234, 243,
+ 30, 236, 36, 242, 94, 15, 5, 234, 238, 15, 5, 234, 239, 30, 252, 176, 15,
+ 5, 234, 239, 249, 125, 234, 238, 15, 5, 234, 236, 15, 5, 234, 235, 15, 5,
+ 234, 207, 15, 5, 234, 208, 233, 118, 30, 104, 117, 233, 118, 30, 70, 15,
+ 5, 234, 208, 117, 234, 208, 233, 118, 30, 104, 117, 233, 118, 30, 70, 15,
+ 5, 234, 157, 15, 5, 234, 92, 15, 5, 234, 93, 30, 252, 176, 15, 5, 234,
+ 93, 30, 70, 15, 5, 234, 93, 30, 214, 219, 15, 5, 234, 89, 15, 5, 234, 81,
+ 15, 5, 234, 68, 15, 5, 234, 67, 15, 5, 234, 65, 15, 5, 234, 66, 117, 234,
+ 65, 15, 5, 233, 217, 15, 5, 233, 218, 117, 241, 181, 30, 253, 230, 233,
+ 218, 117, 241, 181, 30, 253, 229, 15, 5, 233, 215, 15, 5, 233, 213, 15,
+ 5, 233, 214, 214, 12, 17, 15, 5, 233, 212, 15, 5, 233, 209, 15, 5, 233,
+ 210, 242, 94, 15, 5, 233, 208, 15, 5, 233, 196, 15, 5, 233, 197, 226,
+ 164, 233, 196, 15, 5, 233, 191, 15, 5, 233, 172, 15, 5, 233, 135, 15, 5,
+ 233, 117, 15, 5, 233, 118, 30, 61, 15, 5, 233, 118, 30, 115, 96, 248,
+ 222, 96, 162, 15, 5, 233, 118, 30, 115, 96, 243, 96, 15, 5, 233, 118, 30,
+ 115, 96, 233, 104, 15, 5, 233, 118, 30, 254, 178, 15, 5, 233, 118, 30,
+ 254, 123, 15, 5, 233, 118, 30, 253, 232, 210, 40, 216, 239, 15, 5, 233,
+ 118, 30, 252, 176, 15, 5, 233, 118, 30, 252, 6, 15, 5, 233, 118, 30, 248,
+ 166, 15, 5, 233, 118, 30, 245, 150, 15, 5, 233, 118, 30, 243, 135, 15, 5,
+ 233, 118, 30, 243, 96, 15, 5, 233, 118, 30, 242, 103, 15, 5, 233, 118,
+ 30, 242, 104, 96, 242, 103, 15, 5, 233, 118, 30, 162, 15, 5, 233, 118,
+ 30, 242, 30, 15, 5, 233, 118, 30, 241, 181, 30, 227, 194, 15, 5, 233,
+ 118, 30, 236, 36, 242, 94, 15, 5, 233, 118, 30, 236, 16, 15, 5, 233, 118,
+ 30, 236, 17, 96, 162, 15, 5, 233, 118, 30, 236, 17, 96, 232, 98, 15, 5,
+ 233, 118, 30, 234, 92, 15, 5, 233, 118, 30, 234, 81, 15, 5, 233, 118, 30,
+ 233, 215, 15, 5, 233, 118, 30, 233, 209, 15, 5, 233, 118, 30, 233, 210,
+ 96, 241, 181, 96, 61, 15, 5, 233, 118, 30, 233, 117, 15, 5, 233, 118, 30,
+ 232, 197, 15, 5, 233, 118, 30, 232, 98, 15, 5, 233, 118, 30, 232, 86, 15,
+ 5, 233, 118, 30, 231, 91, 15, 5, 233, 118, 30, 231, 92, 96, 245, 150, 15,
+ 5, 233, 118, 30, 230, 61, 15, 5, 233, 118, 30, 229, 107, 15, 5, 233, 118,
+ 30, 220, 64, 96, 218, 43, 15, 5, 233, 118, 30, 220, 10, 96, 242, 191, 96,
+ 245, 87, 15, 5, 233, 118, 30, 220, 10, 96, 242, 191, 216, 239, 15, 5,
+ 233, 118, 30, 219, 223, 15, 5, 233, 118, 30, 219, 224, 96, 219, 223, 15,
+ 5, 233, 118, 30, 218, 43, 15, 5, 233, 118, 30, 217, 84, 15, 5, 233, 118,
+ 30, 217, 72, 15, 5, 233, 118, 30, 217, 23, 96, 115, 96, 218, 84, 96, 197,
+ 15, 5, 233, 118, 30, 70, 15, 5, 233, 118, 30, 104, 96, 61, 15, 5, 233,
+ 118, 30, 104, 96, 104, 96, 70, 15, 5, 233, 118, 30, 214, 231, 96, 253,
+ 231, 15, 5, 233, 118, 30, 214, 219, 15, 5, 233, 118, 30, 214, 126, 15, 5,
+ 233, 118, 218, 233, 15, 5, 233, 115, 15, 5, 233, 116, 30, 220, 63, 15, 5,
+ 233, 116, 30, 220, 64, 96, 218, 43, 15, 5, 233, 116, 242, 94, 15, 5, 233,
+ 116, 242, 95, 117, 233, 116, 242, 95, 220, 63, 15, 5, 233, 111, 15, 5,
+ 233, 104, 15, 5, 233, 105, 30, 233, 104, 15, 5, 233, 102, 15, 5, 233,
+ 103, 30, 233, 196, 15, 5, 233, 103, 30, 233, 197, 96, 222, 140, 15, 5,
+ 232, 241, 15, 5, 232, 226, 15, 5, 232, 216, 15, 5, 232, 197, 15, 5, 232,
+ 98, 15, 5, 232, 99, 30, 252, 176, 15, 5, 232, 96, 15, 5, 232, 97, 30,
+ 254, 178, 15, 5, 232, 97, 30, 252, 176, 15, 5, 232, 97, 30, 245, 72, 15,
+ 5, 232, 97, 30, 245, 73, 216, 239, 15, 5, 232, 97, 30, 243, 105, 216,
+ 239, 15, 5, 232, 97, 30, 241, 181, 30, 252, 176, 15, 5, 232, 97, 30, 236,
+ 16, 15, 5, 232, 97, 30, 235, 1, 15, 5, 232, 97, 30, 234, 255, 15, 5, 232,
+ 97, 30, 235, 0, 96, 253, 231, 15, 5, 232, 97, 30, 234, 92, 15, 5, 232,
+ 97, 30, 233, 136, 96, 253, 231, 15, 5, 232, 97, 30, 233, 117, 15, 5, 232,
+ 97, 30, 231, 92, 96, 245, 150, 15, 5, 232, 97, 30, 229, 107, 15, 5, 232,
+ 97, 30, 227, 237, 15, 5, 232, 97, 30, 219, 192, 96, 253, 231, 15, 5, 232,
+ 97, 30, 219, 174, 96, 251, 125, 15, 5, 232, 97, 30, 215, 113, 15, 5, 232,
+ 97, 216, 239, 15, 5, 232, 97, 249, 125, 232, 96, 15, 5, 232, 97, 226,
+ 164, 232, 96, 15, 5, 232, 97, 218, 233, 15, 5, 232, 97, 220, 45, 15, 5,
+ 232, 95, 15, 5, 232, 91, 15, 5, 232, 92, 117, 232, 91, 15, 5, 232, 92,
+ 226, 164, 232, 91, 15, 5, 232, 92, 220, 45, 15, 5, 232, 89, 15, 5, 232,
+ 86, 15, 5, 232, 84, 15, 5, 232, 85, 117, 232, 84, 15, 5, 232, 85, 117,
+ 232, 85, 243, 97, 117, 243, 96, 15, 5, 184, 15, 5, 231, 239, 30, 217, 72,
+ 15, 5, 231, 239, 242, 94, 15, 5, 231, 238, 15, 5, 231, 210, 15, 5, 231,
+ 166, 15, 5, 231, 147, 15, 5, 231, 146, 15, 5, 231, 91, 15, 5, 231, 47,
+ 15, 5, 230, 230, 15, 5, 230, 188, 15, 5, 230, 102, 15, 5, 230, 103, 117,
+ 230, 102, 15, 5, 230, 93, 15, 5, 230, 94, 242, 94, 15, 5, 230, 78, 15, 5,
+ 230, 64, 15, 5, 230, 61, 15, 5, 230, 62, 30, 61, 15, 5, 230, 62, 30, 233,
+ 196, 15, 5, 230, 62, 30, 210, 116, 15, 5, 230, 62, 117, 230, 61, 15, 5,
+ 230, 62, 117, 230, 62, 30, 115, 96, 197, 15, 5, 230, 62, 249, 125, 230,
+ 61, 15, 5, 230, 59, 15, 5, 230, 60, 30, 61, 15, 5, 230, 60, 30, 115, 96,
+ 248, 3, 15, 5, 230, 60, 30, 248, 3, 15, 5, 230, 60, 242, 94, 15, 5, 197,
+ 15, 5, 229, 227, 15, 5, 229, 216, 15, 5, 229, 217, 235, 192, 15, 5, 229,
+ 217, 30, 219, 226, 216, 239, 15, 5, 229, 217, 226, 164, 229, 216, 15, 5,
+ 229, 215, 15, 5, 229, 208, 227, 180, 15, 5, 229, 207, 15, 5, 229, 206,
+ 15, 5, 229, 107, 15, 5, 229, 108, 30, 61, 15, 5, 229, 108, 30, 214, 219,
+ 15, 5, 229, 108, 220, 45, 15, 5, 228, 233, 15, 5, 228, 234, 30, 75, 15,
+ 5, 228, 232, 15, 5, 228, 203, 15, 5, 228, 204, 30, 243, 105, 216, 239,
+ 15, 5, 228, 204, 30, 243, 97, 96, 243, 105, 216, 239, 15, 5, 228, 201,
+ 15, 5, 228, 202, 30, 254, 123, 15, 5, 228, 202, 30, 253, 231, 15, 5, 228,
+ 202, 30, 253, 232, 96, 253, 231, 15, 5, 228, 202, 30, 242, 103, 15, 5,
+ 228, 202, 30, 231, 92, 96, 243, 105, 216, 239, 15, 5, 228, 202, 30, 229,
+ 107, 15, 5, 228, 202, 30, 227, 194, 15, 5, 228, 202, 30, 220, 63, 15, 5,
+ 228, 202, 30, 220, 64, 96, 115, 254, 123, 15, 5, 228, 202, 30, 220, 64,
+ 96, 253, 231, 15, 5, 228, 202, 30, 220, 64, 96, 253, 232, 96, 253, 231,
+ 15, 5, 228, 202, 30, 214, 231, 96, 253, 231, 15, 5, 228, 202, 30, 214,
+ 126, 15, 5, 228, 190, 15, 5, 227, 237, 15, 5, 227, 210, 15, 5, 227, 194,
+ 15, 5, 227, 195, 233, 116, 30, 243, 96, 15, 5, 227, 195, 233, 116, 30,
+ 231, 147, 15, 5, 227, 195, 233, 116, 30, 222, 8, 15, 5, 227, 195, 233,
+ 116, 30, 222, 9, 117, 227, 195, 233, 116, 30, 222, 8, 15, 5, 227, 195,
+ 233, 116, 30, 214, 126, 15, 5, 227, 195, 216, 239, 15, 5, 227, 195, 117,
+ 227, 194, 15, 5, 227, 195, 249, 125, 227, 194, 15, 5, 227, 195, 249, 125,
+ 227, 195, 233, 116, 117, 233, 115, 15, 5, 227, 189, 15, 5, 227, 190, 255,
+ 24, 30, 253, 226, 15, 5, 227, 190, 255, 24, 30, 252, 6, 15, 5, 227, 190,
+ 255, 24, 30, 246, 74, 15, 5, 227, 190, 255, 24, 30, 242, 103, 15, 5, 227,
+ 190, 255, 24, 30, 236, 36, 242, 94, 15, 5, 227, 190, 255, 24, 30, 234,
+ 255, 15, 5, 227, 190, 255, 24, 30, 233, 135, 15, 5, 227, 190, 255, 24,
+ 30, 229, 107, 15, 5, 227, 190, 255, 24, 30, 219, 171, 15, 5, 227, 190,
+ 255, 24, 30, 214, 230, 15, 5, 227, 190, 234, 66, 30, 252, 6, 15, 5, 227,
+ 190, 234, 66, 30, 252, 7, 70, 15, 5, 190, 15, 5, 226, 80, 15, 5, 226, 47,
+ 15, 5, 226, 21, 15, 5, 225, 161, 15, 5, 225, 108, 15, 5, 225, 109, 30,
+ 61, 15, 5, 225, 109, 30, 255, 25, 15, 5, 225, 109, 30, 252, 6, 15, 5,
+ 225, 109, 30, 251, 125, 15, 5, 225, 109, 30, 75, 15, 5, 225, 109, 30, 73,
+ 15, 5, 225, 109, 30, 240, 115, 15, 5, 225, 109, 30, 70, 15, 5, 225, 109,
+ 30, 214, 230, 15, 5, 225, 109, 249, 125, 225, 108, 15, 5, 225, 53, 15, 5,
+ 225, 54, 30, 234, 238, 15, 5, 225, 54, 30, 214, 219, 15, 5, 225, 54, 30,
+ 210, 116, 15, 5, 225, 54, 226, 164, 225, 53, 15, 5, 205, 15, 5, 223, 182,
+ 15, 5, 223, 35, 15, 5, 222, 140, 15, 5, 206, 15, 5, 222, 22, 227, 180,
+ 15, 5, 222, 21, 15, 5, 222, 22, 30, 61, 15, 5, 222, 22, 30, 246, 78, 15,
+ 5, 222, 22, 30, 246, 76, 15, 5, 222, 22, 30, 162, 15, 5, 222, 22, 30,
+ 234, 242, 15, 5, 222, 22, 30, 233, 196, 15, 5, 222, 22, 30, 232, 84, 15,
+ 5, 222, 22, 30, 230, 230, 15, 5, 222, 22, 30, 227, 194, 15, 5, 222, 22,
+ 30, 222, 8, 15, 5, 222, 22, 30, 220, 30, 15, 5, 222, 22, 30, 217, 93, 15,
+ 5, 222, 22, 30, 214, 230, 15, 5, 222, 22, 30, 214, 225, 15, 5, 222, 22,
+ 30, 214, 197, 15, 5, 222, 22, 30, 214, 150, 15, 5, 222, 22, 30, 214, 126,
+ 15, 5, 222, 22, 117, 222, 21, 15, 5, 222, 22, 242, 94, 15, 5, 222, 8, 15,
+ 5, 222, 9, 233, 118, 30, 253, 229, 15, 5, 221, 239, 15, 5, 221, 231, 15,
+ 5, 220, 102, 15, 5, 220, 100, 15, 5, 220, 101, 30, 61, 15, 5, 220, 101,
+ 30, 252, 176, 15, 5, 220, 101, 30, 242, 190, 15, 5, 220, 101, 30, 229,
+ 107, 15, 5, 220, 101, 30, 219, 223, 15, 5, 220, 101, 30, 215, 98, 15, 5,
+ 220, 101, 30, 70, 15, 5, 220, 101, 30, 104, 96, 61, 15, 5, 220, 99, 15,
+ 5, 220, 97, 15, 5, 220, 78, 15, 5, 220, 63, 15, 5, 220, 64, 240, 222, 15,
+ 5, 220, 64, 117, 220, 64, 243, 127, 117, 243, 127, 243, 97, 117, 243, 96,
+ 15, 5, 220, 64, 117, 220, 64, 217, 94, 117, 217, 94, 243, 97, 117, 243,
+ 96, 15, 5, 220, 56, 15, 5, 220, 51, 15, 5, 220, 48, 15, 5, 220, 47, 15,
+ 5, 220, 44, 15, 5, 220, 30, 15, 5, 220, 31, 30, 61, 15, 5, 220, 31, 30,
+ 236, 16, 15, 5, 220, 24, 15, 5, 220, 25, 30, 61, 15, 5, 220, 25, 30, 252,
+ 161, 15, 5, 220, 25, 30, 251, 109, 15, 5, 220, 25, 30, 247, 206, 15, 5,
+ 220, 25, 30, 243, 96, 15, 5, 220, 25, 30, 236, 35, 15, 5, 220, 25, 30,
+ 236, 36, 242, 94, 15, 5, 220, 25, 30, 233, 191, 15, 5, 220, 25, 30, 232,
+ 86, 15, 5, 220, 25, 30, 230, 93, 15, 5, 220, 25, 30, 222, 8, 15, 5, 220,
+ 18, 15, 5, 220, 13, 15, 5, 220, 14, 216, 239, 15, 5, 220, 14, 117, 220,
+ 14, 251, 99, 117, 251, 98, 15, 5, 220, 9, 15, 5, 219, 225, 15, 5, 219,
+ 226, 117, 235, 193, 219, 225, 15, 5, 219, 223, 15, 5, 219, 222, 15, 5,
+ 219, 191, 15, 5, 219, 192, 242, 94, 15, 5, 219, 182, 15, 5, 219, 180, 15,
+ 5, 219, 181, 117, 219, 181, 219, 223, 15, 5, 219, 173, 15, 5, 219, 171,
+ 15, 5, 218, 83, 15, 5, 218, 84, 117, 218, 83, 15, 5, 218, 54, 15, 5, 218,
+ 53, 15, 5, 218, 51, 15, 5, 218, 43, 15, 5, 218, 42, 15, 5, 218, 17, 15,
+ 5, 218, 16, 15, 5, 217, 105, 15, 5, 217, 106, 253, 216, 15, 5, 217, 106,
+ 30, 241, 180, 15, 5, 217, 106, 30, 230, 230, 15, 5, 217, 106, 242, 94,
+ 15, 5, 217, 93, 15, 5, 217, 94, 117, 217, 94, 228, 234, 117, 228, 234,
+ 247, 188, 117, 247, 187, 15, 5, 217, 94, 218, 233, 15, 5, 217, 84, 15, 5,
+ 129, 30, 252, 6, 15, 5, 129, 30, 242, 103, 15, 5, 129, 30, 220, 63, 15,
+ 5, 129, 30, 219, 225, 15, 5, 129, 30, 215, 113, 15, 5, 129, 30, 214, 219,
+ 15, 5, 217, 72, 15, 5, 217, 50, 15, 5, 217, 22, 15, 5, 217, 23, 242, 94,
+ 15, 5, 216, 117, 15, 5, 216, 118, 216, 239, 15, 5, 216, 90, 15, 5, 216,
+ 72, 15, 5, 216, 73, 30, 217, 72, 15, 5, 216, 73, 117, 216, 72, 15, 5,
+ 216, 73, 117, 216, 73, 243, 127, 117, 243, 127, 243, 97, 117, 243, 96,
+ 15, 5, 215, 118, 15, 5, 215, 113, 15, 5, 215, 111, 15, 5, 215, 108, 15,
+ 5, 215, 98, 15, 5, 215, 99, 117, 215, 99, 210, 117, 117, 210, 116, 15, 5,
+ 70, 15, 5, 104, 242, 103, 15, 5, 104, 104, 70, 15, 5, 104, 117, 104, 226,
+ 90, 117, 226, 90, 243, 97, 117, 243, 96, 15, 5, 104, 117, 104, 218, 18,
+ 117, 218, 17, 15, 5, 104, 117, 104, 104, 223, 49, 117, 104, 223, 48, 15,
+ 5, 214, 230, 15, 5, 214, 225, 15, 5, 214, 219, 15, 5, 214, 220, 233, 191,
+ 15, 5, 214, 220, 30, 252, 176, 15, 5, 214, 220, 30, 230, 230, 15, 5, 214,
+ 220, 30, 104, 96, 104, 96, 70, 15, 5, 214, 220, 30, 104, 96, 104, 96,
+ 104, 242, 94, 15, 5, 214, 220, 242, 94, 15, 5, 214, 220, 220, 45, 15, 5,
+ 214, 220, 220, 46, 30, 252, 176, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5,
+ 214, 198, 30, 233, 117, 15, 5, 214, 198, 30, 231, 92, 96, 248, 221, 15,
+ 5, 214, 198, 30, 220, 100, 15, 5, 214, 198, 30, 70, 15, 5, 214, 196, 15,
+ 5, 214, 192, 15, 5, 214, 193, 30, 234, 207, 15, 5, 214, 193, 30, 190, 15,
+ 5, 214, 190, 15, 5, 214, 191, 242, 94, 15, 5, 214, 150, 15, 5, 214, 151,
+ 249, 125, 214, 150, 15, 5, 214, 151, 220, 45, 15, 5, 214, 148, 15, 5,
+ 214, 149, 30, 115, 96, 162, 15, 5, 214, 149, 30, 115, 96, 197, 15, 5,
+ 214, 149, 30, 254, 178, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30,
+ 227, 194, 15, 5, 214, 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231,
+ 96, 253, 231, 15, 5, 214, 149, 30, 214, 231, 96, 252, 6, 15, 5, 214, 147,
+ 15, 5, 214, 144, 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30,
+ 61, 15, 5, 214, 140, 30, 253, 226, 15, 5, 214, 140, 30, 130, 15, 5, 214,
+ 140, 30, 246, 68, 15, 5, 214, 140, 30, 243, 135, 15, 5, 214, 140, 30,
+ 243, 118, 15, 5, 214, 140, 30, 243, 105, 216, 239, 15, 5, 214, 140, 30,
+ 243, 96, 15, 5, 214, 140, 30, 242, 113, 15, 5, 214, 140, 30, 162, 15, 5,
+ 214, 140, 30, 236, 35, 15, 5, 214, 140, 30, 236, 16, 15, 5, 214, 140, 30,
+ 235, 165, 15, 5, 214, 140, 30, 234, 92, 15, 5, 214, 140, 30, 232, 84, 15,
+ 5, 214, 140, 30, 230, 188, 15, 5, 214, 140, 30, 190, 15, 5, 214, 140, 30,
+ 220, 63, 15, 5, 214, 140, 30, 219, 180, 15, 5, 214, 140, 30, 215, 118,
+ 15, 5, 214, 140, 30, 104, 96, 242, 103, 15, 5, 214, 140, 30, 214, 219,
+ 15, 5, 214, 140, 30, 214, 137, 15, 5, 214, 137, 15, 5, 214, 138, 30, 70,
+ 15, 5, 214, 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 217,
+ 15, 5, 214, 127, 30, 233, 196, 15, 5, 214, 127, 30, 217, 72, 15, 5, 214,
+ 122, 15, 5, 214, 125, 15, 5, 214, 123, 15, 5, 214, 119, 15, 5, 214, 108,
+ 15, 5, 214, 109, 30, 234, 207, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5,
+ 210, 117, 216, 239, 15, 5, 210, 117, 92, 30, 233, 196, 15, 5, 210, 113,
+ 15, 5, 210, 106, 15, 5, 210, 93, 15, 5, 210, 44, 15, 5, 210, 45, 117,
+ 210, 44, 15, 5, 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 3, 216,
+ 239, 15, 5, 210, 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15,
+ 5, 210, 12, 30, 61, 15, 5, 210, 10, 15, 5, 210, 9, 15, 132, 5, 113, 253,
+ 231, 15, 132, 5, 134, 253, 231, 15, 132, 5, 244, 11, 253, 231, 15, 132,
+ 5, 244, 81, 253, 231, 15, 132, 5, 219, 125, 253, 231, 15, 132, 5, 220,
+ 122, 253, 231, 15, 132, 5, 245, 193, 253, 231, 15, 132, 5, 228, 200, 253,
+ 231, 15, 132, 5, 134, 247, 187, 15, 132, 5, 244, 11, 247, 187, 15, 132,
+ 5, 244, 81, 247, 187, 15, 132, 5, 219, 125, 247, 187, 15, 132, 5, 220,
+ 122, 247, 187, 15, 132, 5, 245, 193, 247, 187, 15, 132, 5, 228, 200, 247,
+ 187, 15, 132, 5, 244, 11, 70, 15, 132, 5, 244, 81, 70, 15, 132, 5, 219,
+ 125, 70, 15, 132, 5, 220, 122, 70, 15, 132, 5, 245, 193, 70, 15, 132, 5,
+ 228, 200, 70, 15, 132, 5, 123, 243, 38, 15, 132, 5, 113, 243, 38, 15,
+ 132, 5, 134, 243, 38, 15, 132, 5, 244, 11, 243, 38, 15, 132, 5, 244, 81,
+ 243, 38, 15, 132, 5, 219, 125, 243, 38, 15, 132, 5, 220, 122, 243, 38,
+ 15, 132, 5, 245, 193, 243, 38, 15, 132, 5, 228, 200, 243, 38, 15, 132, 5,
+ 123, 243, 35, 15, 132, 5, 113, 243, 35, 15, 132, 5, 134, 243, 35, 15,
+ 132, 5, 244, 11, 243, 35, 15, 132, 5, 244, 81, 243, 35, 15, 132, 5, 113,
+ 220, 78, 15, 132, 5, 134, 220, 78, 15, 132, 5, 134, 220, 79, 214, 12, 17,
+ 15, 132, 5, 244, 11, 220, 78, 15, 132, 5, 244, 81, 220, 78, 15, 132, 5,
+ 219, 125, 220, 78, 15, 132, 5, 220, 122, 220, 78, 15, 132, 5, 245, 193,
+ 220, 78, 15, 132, 5, 228, 200, 220, 78, 15, 132, 5, 123, 220, 73, 15,
+ 132, 5, 113, 220, 73, 15, 132, 5, 134, 220, 73, 15, 132, 5, 134, 220, 74,
+ 214, 12, 17, 15, 132, 5, 244, 11, 220, 73, 15, 132, 5, 244, 81, 220, 73,
+ 15, 132, 5, 220, 79, 30, 243, 119, 96, 247, 187, 15, 132, 5, 220, 79, 30,
+ 243, 119, 96, 230, 188, 15, 132, 5, 123, 251, 95, 15, 132, 5, 113, 251,
+ 95, 15, 132, 5, 134, 251, 95, 15, 132, 5, 134, 251, 96, 214, 12, 17, 15,
+ 132, 5, 244, 11, 251, 95, 15, 132, 5, 244, 81, 251, 95, 15, 132, 5, 134,
+ 214, 12, 244, 20, 245, 74, 15, 132, 5, 134, 214, 12, 244, 20, 245, 71,
+ 15, 132, 5, 244, 11, 214, 12, 244, 20, 232, 217, 15, 132, 5, 244, 11,
+ 214, 12, 244, 20, 232, 215, 15, 132, 5, 244, 11, 214, 12, 244, 20, 232,
+ 218, 61, 15, 132, 5, 244, 11, 214, 12, 244, 20, 232, 218, 253, 158, 15,
+ 132, 5, 219, 125, 214, 12, 244, 20, 253, 228, 15, 132, 5, 220, 122, 214,
+ 12, 244, 20, 236, 8, 15, 132, 5, 220, 122, 214, 12, 244, 20, 236, 10, 61,
+ 15, 132, 5, 220, 122, 214, 12, 244, 20, 236, 10, 253, 158, 15, 132, 5,
+ 245, 193, 214, 12, 244, 20, 214, 121, 15, 132, 5, 245, 193, 214, 12, 244,
+ 20, 214, 120, 15, 132, 5, 228, 200, 214, 12, 244, 20, 236, 24, 15, 132,
+ 5, 228, 200, 214, 12, 244, 20, 236, 23, 15, 132, 5, 228, 200, 214, 12,
+ 244, 20, 236, 22, 15, 132, 5, 228, 200, 214, 12, 244, 20, 236, 25, 61,
+ 15, 132, 5, 113, 253, 232, 216, 239, 15, 132, 5, 134, 253, 232, 216, 239,
+ 15, 132, 5, 244, 11, 253, 232, 216, 239, 15, 132, 5, 244, 81, 253, 232,
+ 216, 239, 15, 132, 5, 219, 125, 253, 232, 216, 239, 15, 132, 5, 123, 252,
+ 150, 15, 132, 5, 113, 252, 150, 15, 132, 5, 134, 252, 150, 15, 132, 5,
+ 244, 11, 252, 150, 15, 132, 5, 244, 11, 252, 151, 214, 12, 17, 15, 132,
+ 5, 244, 81, 252, 150, 15, 132, 5, 244, 81, 252, 151, 214, 12, 17, 15,
+ 132, 5, 228, 210, 15, 132, 5, 228, 211, 15, 132, 5, 123, 245, 70, 15,
+ 132, 5, 113, 245, 70, 15, 132, 5, 123, 216, 169, 247, 187, 15, 132, 5,
+ 113, 216, 167, 247, 187, 15, 132, 5, 244, 81, 219, 114, 247, 187, 15,
+ 132, 5, 123, 216, 169, 214, 12, 244, 20, 61, 15, 132, 5, 113, 216, 167,
+ 214, 12, 244, 20, 61, 15, 132, 5, 123, 245, 189, 253, 231, 15, 132, 5,
+ 123, 224, 22, 253, 231, 15, 132, 5, 55, 253, 219, 123, 219, 115, 15, 132,
+ 5, 55, 253, 219, 123, 224, 21, 15, 224, 141, 5, 55, 253, 219, 211, 209,
+ 247, 172, 15, 224, 141, 5, 67, 249, 226, 15, 224, 141, 5, 247, 255, 249,
+ 226, 15, 224, 141, 5, 247, 255, 215, 221, 12, 13, 255, 155, 12, 13, 255,
+ 154, 12, 13, 255, 153, 12, 13, 255, 152, 12, 13, 255, 151, 12, 13, 255,
+ 150, 12, 13, 255, 149, 12, 13, 255, 148, 12, 13, 255, 147, 12, 13, 255,
+ 146, 12, 13, 255, 145, 12, 13, 255, 144, 12, 13, 255, 143, 12, 13, 255,
+ 142, 12, 13, 255, 141, 12, 13, 255, 140, 12, 13, 255, 139, 12, 13, 255,
+ 138, 12, 13, 255, 137, 12, 13, 255, 136, 12, 13, 255, 135, 12, 13, 255,
+ 134, 12, 13, 255, 133, 12, 13, 255, 132, 12, 13, 255, 131, 12, 13, 255,
+ 130, 12, 13, 255, 129, 12, 13, 255, 128, 12, 13, 255, 127, 12, 13, 255,
+ 126, 12, 13, 255, 125, 12, 13, 255, 124, 12, 13, 255, 123, 12, 13, 255,
+ 122, 12, 13, 255, 121, 12, 13, 255, 120, 12, 13, 255, 119, 12, 13, 255,
+ 118, 12, 13, 255, 117, 12, 13, 255, 116, 12, 13, 255, 115, 12, 13, 255,
+ 114, 12, 13, 255, 113, 12, 13, 255, 112, 12, 13, 255, 111, 12, 13, 255,
+ 110, 12, 13, 255, 109, 12, 13, 255, 108, 12, 13, 255, 107, 12, 13, 255,
+ 106, 12, 13, 255, 105, 12, 13, 255, 104, 12, 13, 255, 103, 12, 13, 255,
+ 102, 12, 13, 255, 101, 12, 13, 255, 100, 12, 13, 255, 99, 12, 13, 255,
+ 98, 12, 13, 255, 97, 12, 13, 255, 96, 12, 13, 255, 95, 12, 13, 255, 94,
+ 12, 13, 255, 93, 12, 13, 255, 92, 12, 13, 255, 91, 12, 13, 255, 90, 12,
+ 13, 255, 89, 12, 13, 255, 88, 12, 13, 255, 87, 12, 13, 255, 86, 12, 13,
+ 255, 85, 12, 13, 255, 84, 12, 13, 255, 83, 12, 13, 255, 82, 12, 13, 255,
+ 81, 12, 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78, 12, 13, 255, 77,
+ 12, 13, 255, 76, 12, 13, 253, 156, 12, 13, 253, 154, 12, 13, 253, 152,
+ 12, 13, 253, 150, 12, 13, 253, 148, 12, 13, 253, 147, 12, 13, 253, 145,
+ 12, 13, 253, 143, 12, 13, 253, 141, 12, 13, 253, 139, 12, 13, 251, 62,
+ 12, 13, 251, 61, 12, 13, 251, 60, 12, 13, 251, 59, 12, 13, 251, 58, 12,
+ 13, 251, 57, 12, 13, 251, 56, 12, 13, 251, 55, 12, 13, 251, 54, 12, 13,
+ 251, 53, 12, 13, 251, 52, 12, 13, 251, 51, 12, 13, 251, 50, 12, 13, 251,
+ 49, 12, 13, 251, 48, 12, 13, 251, 47, 12, 13, 251, 46, 12, 13, 251, 45,
+ 12, 13, 251, 44, 12, 13, 251, 43, 12, 13, 251, 42, 12, 13, 251, 41, 12,
+ 13, 251, 40, 12, 13, 251, 39, 12, 13, 251, 38, 12, 13, 251, 37, 12, 13,
+ 251, 36, 12, 13, 251, 35, 12, 13, 249, 59, 12, 13, 249, 58, 12, 13, 249,
+ 57, 12, 13, 249, 56, 12, 13, 249, 55, 12, 13, 249, 54, 12, 13, 249, 53,
+ 12, 13, 249, 52, 12, 13, 249, 51, 12, 13, 249, 50, 12, 13, 249, 49, 12,
+ 13, 249, 48, 12, 13, 249, 47, 12, 13, 249, 46, 12, 13, 249, 45, 12, 13,
+ 249, 44, 12, 13, 249, 43, 12, 13, 249, 42, 12, 13, 249, 41, 12, 13, 249,
+ 40, 12, 13, 249, 39, 12, 13, 249, 38, 12, 13, 249, 37, 12, 13, 249, 36,
+ 12, 13, 249, 35, 12, 13, 249, 34, 12, 13, 249, 33, 12, 13, 249, 32, 12,
+ 13, 249, 31, 12, 13, 249, 30, 12, 13, 249, 29, 12, 13, 249, 28, 12, 13,
+ 249, 27, 12, 13, 249, 26, 12, 13, 249, 25, 12, 13, 249, 24, 12, 13, 249,
+ 23, 12, 13, 249, 22, 12, 13, 249, 21, 12, 13, 249, 20, 12, 13, 249, 19,
+ 12, 13, 249, 18, 12, 13, 249, 17, 12, 13, 249, 16, 12, 13, 249, 15, 12,
+ 13, 249, 14, 12, 13, 249, 13, 12, 13, 249, 12, 12, 13, 249, 11, 12, 13,
+ 249, 10, 12, 13, 249, 9, 12, 13, 249, 8, 12, 13, 249, 7, 12, 13, 249, 6,
+ 12, 13, 249, 5, 12, 13, 249, 4, 12, 13, 249, 3, 12, 13, 249, 2, 12, 13,
+ 249, 1, 12, 13, 249, 0, 12, 13, 248, 255, 12, 13, 248, 254, 12, 13, 248,
+ 253, 12, 13, 248, 252, 12, 13, 248, 251, 12, 13, 248, 250, 12, 13, 248,
+ 249, 12, 13, 248, 248, 12, 13, 248, 247, 12, 13, 248, 246, 12, 13, 248,
+ 245, 12, 13, 248, 244, 12, 13, 248, 243, 12, 13, 248, 242, 12, 13, 248,
+ 241, 12, 13, 248, 240, 12, 13, 248, 239, 12, 13, 248, 238, 12, 13, 248,
+ 237, 12, 13, 248, 236, 12, 13, 248, 235, 12, 13, 248, 234, 12, 13, 248,
+ 233, 12, 13, 248, 232, 12, 13, 248, 231, 12, 13, 248, 230, 12, 13, 248,
+ 229, 12, 13, 248, 228, 12, 13, 248, 227, 12, 13, 248, 226, 12, 13, 248,
+ 225, 12, 13, 248, 224, 12, 13, 246, 23, 12, 13, 246, 22, 12, 13, 246, 21,
+ 12, 13, 246, 20, 12, 13, 246, 19, 12, 13, 246, 18, 12, 13, 246, 17, 12,
+ 13, 246, 16, 12, 13, 246, 15, 12, 13, 246, 14, 12, 13, 246, 13, 12, 13,
+ 246, 12, 12, 13, 246, 11, 12, 13, 246, 10, 12, 13, 246, 9, 12, 13, 246,
+ 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, 13, 246, 5, 12, 13, 246, 4, 12,
+ 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, 1, 12, 13, 246, 0, 12, 13, 245,
+ 255, 12, 13, 245, 254, 12, 13, 245, 253, 12, 13, 245, 252, 12, 13, 245,
+ 251, 12, 13, 245, 250, 12, 13, 245, 249, 12, 13, 245, 248, 12, 13, 245,
+ 247, 12, 13, 245, 246, 12, 13, 245, 245, 12, 13, 245, 244, 12, 13, 245,
+ 243, 12, 13, 245, 242, 12, 13, 245, 241, 12, 13, 245, 240, 12, 13, 245,
+ 239, 12, 13, 245, 238, 12, 13, 245, 237, 12, 13, 245, 236, 12, 13, 245,
+ 5, 12, 13, 245, 4, 12, 13, 245, 3, 12, 13, 245, 2, 12, 13, 245, 1, 12,
+ 13, 245, 0, 12, 13, 244, 255, 12, 13, 244, 254, 12, 13, 244, 253, 12, 13,
+ 244, 252, 12, 13, 244, 251, 12, 13, 244, 250, 12, 13, 244, 249, 12, 13,
+ 244, 248, 12, 13, 244, 247, 12, 13, 244, 246, 12, 13, 244, 245, 12, 13,
+ 244, 244, 12, 13, 244, 243, 12, 13, 244, 242, 12, 13, 244, 241, 12, 13,
+ 244, 240, 12, 13, 244, 239, 12, 13, 244, 238, 12, 13, 244, 237, 12, 13,
+ 244, 236, 12, 13, 244, 235, 12, 13, 244, 234, 12, 13, 244, 233, 12, 13,
+ 244, 232, 12, 13, 244, 231, 12, 13, 244, 230, 12, 13, 244, 229, 12, 13,
+ 244, 228, 12, 13, 244, 227, 12, 13, 244, 226, 12, 13, 244, 225, 12, 13,
+ 244, 224, 12, 13, 244, 223, 12, 13, 244, 222, 12, 13, 244, 221, 12, 13,
+ 244, 220, 12, 13, 244, 219, 12, 13, 244, 218, 12, 13, 244, 217, 12, 13,
+ 244, 216, 12, 13, 244, 215, 12, 13, 244, 214, 12, 13, 244, 213, 12, 13,
+ 244, 212, 12, 13, 244, 211, 12, 13, 244, 210, 12, 13, 244, 209, 12, 13,
+ 244, 208, 12, 13, 244, 207, 12, 13, 244, 206, 12, 13, 244, 205, 12, 13,
+ 244, 204, 12, 13, 244, 203, 12, 13, 244, 202, 12, 13, 244, 201, 12, 13,
+ 244, 200, 12, 13, 244, 199, 12, 13, 244, 198, 12, 13, 244, 197, 12, 13,
+ 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13, 243, 198, 12, 13,
+ 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13, 243, 194, 12, 13,
+ 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13, 243, 190, 12, 13,
+ 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13, 243, 186, 12, 13,
+ 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13, 243, 182, 12, 13,
+ 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13, 243, 178, 12, 13,
+ 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13, 243, 174, 12, 13,
+ 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13, 243, 170, 12, 13,
+ 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13, 243, 166, 12, 13,
+ 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13, 243, 162, 12, 13,
+ 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13, 243, 158, 12, 13,
+ 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13, 243, 154, 12, 13,
+ 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13, 243, 150, 12, 13,
+ 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13, 243, 146, 12, 13,
+ 243, 145, 12, 13, 243, 144, 12, 13, 243, 143, 12, 13, 243, 142, 12, 13,
+ 243, 141, 12, 13, 243, 140, 12, 13, 243, 139, 12, 13, 243, 138, 12, 13,
+ 242, 58, 12, 13, 242, 57, 12, 13, 242, 56, 12, 13, 242, 55, 12, 13, 242,
+ 54, 12, 13, 242, 53, 12, 13, 242, 52, 12, 13, 242, 51, 12, 13, 242, 50,
+ 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136, 12, 13, 240, 135,
+ 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132, 12, 13, 240, 131,
+ 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128, 12, 13, 240, 127,
+ 12, 13, 240, 126, 12, 13, 240, 125, 12, 13, 240, 124, 12, 13, 240, 123,
+ 12, 13, 240, 122, 12, 13, 240, 121, 12, 13, 240, 120, 12, 13, 235, 22,
+ 12, 13, 235, 21, 12, 13, 235, 20, 12, 13, 235, 19, 12, 13, 235, 18, 12,
+ 13, 235, 17, 12, 13, 235, 16, 12, 13, 235, 15, 12, 13, 233, 146, 12, 13,
+ 233, 145, 12, 13, 233, 144, 12, 13, 233, 143, 12, 13, 233, 142, 12, 13,
+ 233, 141, 12, 13, 233, 140, 12, 13, 233, 139, 12, 13, 233, 138, 12, 13,
+ 233, 137, 12, 13, 232, 49, 12, 13, 232, 48, 12, 13, 232, 47, 12, 13, 232,
+ 46, 12, 13, 232, 45, 12, 13, 232, 44, 12, 13, 232, 43, 12, 13, 232, 42,
+ 12, 13, 232, 41, 12, 13, 232, 40, 12, 13, 232, 39, 12, 13, 232, 38, 12,
+ 13, 232, 37, 12, 13, 232, 36, 12, 13, 232, 35, 12, 13, 232, 34, 12, 13,
+ 232, 33, 12, 13, 232, 32, 12, 13, 232, 31, 12, 13, 232, 30, 12, 13, 232,
+ 29, 12, 13, 232, 28, 12, 13, 232, 27, 12, 13, 232, 26, 12, 13, 232, 25,
+ 12, 13, 232, 24, 12, 13, 232, 23, 12, 13, 232, 22, 12, 13, 232, 21, 12,
+ 13, 232, 20, 12, 13, 232, 19, 12, 13, 232, 18, 12, 13, 232, 17, 12, 13,
+ 232, 16, 12, 13, 232, 15, 12, 13, 232, 14, 12, 13, 232, 13, 12, 13, 232,
+ 12, 12, 13, 232, 11, 12, 13, 232, 10, 12, 13, 232, 9, 12, 13, 232, 8, 12,
+ 13, 232, 7, 12, 13, 232, 6, 12, 13, 232, 5, 12, 13, 232, 4, 12, 13, 232,
+ 3, 12, 13, 232, 2, 12, 13, 232, 1, 12, 13, 232, 0, 12, 13, 231, 255, 12,
+ 13, 231, 254, 12, 13, 231, 253, 12, 13, 231, 252, 12, 13, 231, 251, 12,
+ 13, 231, 250, 12, 13, 231, 249, 12, 13, 231, 248, 12, 13, 231, 247, 12,
+ 13, 231, 246, 12, 13, 231, 245, 12, 13, 231, 244, 12, 13, 231, 243, 12,
+ 13, 231, 242, 12, 13, 231, 241, 12, 13, 231, 240, 12, 13, 230, 22, 12,
+ 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, 19, 12, 13, 230, 18, 12, 13,
+ 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, 12, 13, 230, 14, 12, 13, 230,
+ 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, 13, 230, 10, 12, 13, 230, 9,
+ 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, 6, 12, 13, 230, 5, 12, 13,
+ 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, 13, 230, 1, 12, 13, 230, 0,
+ 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, 229, 253, 12, 13, 229, 252,
+ 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, 229, 249, 12, 13, 229, 248,
+ 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, 229, 245, 12, 13, 229, 244,
+ 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, 229, 241, 12, 13, 229, 240,
+ 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, 229, 237, 12, 13, 229, 236,
+ 12, 13, 229, 235, 12, 13, 229, 234, 12, 13, 229, 233, 12, 13, 229, 232,
+ 12, 13, 229, 231, 12, 13, 229, 230, 12, 13, 228, 134, 12, 13, 228, 133,
+ 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, 228, 130, 12, 13, 228, 129,
+ 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, 228, 126, 12, 13, 228, 125,
+ 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, 228, 122, 12, 13, 228, 121,
+ 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, 228, 118, 12, 13, 228, 117,
+ 12, 13, 228, 116, 12, 13, 228, 115, 12, 13, 228, 114, 12, 13, 228, 113,
+ 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, 227, 234, 12, 13, 227, 233,
+ 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, 227, 230, 12, 13, 227, 229,
+ 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, 227, 226, 12, 13, 227, 225,
+ 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, 227, 222, 12, 13, 227, 221,
+ 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, 227, 218, 12, 13, 227, 217,
+ 12, 13, 227, 216, 12, 13, 227, 215, 12, 13, 227, 214, 12, 13, 227, 213,
+ 12, 13, 227, 212, 12, 13, 227, 211, 12, 13, 227, 76, 12, 13, 227, 75, 12,
+ 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13, 227, 71, 12, 13,
+ 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227, 67, 12, 13, 227,
+ 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63, 12, 13, 227, 62,
+ 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12, 13, 227, 58, 12,
+ 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13, 227, 54, 12, 13,
+ 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227, 50, 12, 13, 227,
+ 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46, 12, 13, 227, 45,
+ 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12, 13, 227, 41, 12,
+ 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13, 227, 37, 12, 13,
+ 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227, 33, 12, 13, 227,
+ 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29, 12, 13, 227, 28,
+ 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12, 13, 227, 24, 12,
+ 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13, 227, 20, 12, 13,
+ 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227, 16, 12, 13, 227,
+ 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12, 12, 13, 227, 11,
+ 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13, 227, 7, 12, 13,
+ 227, 6, 12, 13, 227, 5, 12, 13, 227, 4, 12, 13, 227, 3, 12, 13, 227, 2,
+ 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102, 12, 13, 226, 101,
+ 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12, 13, 226, 97, 12,
+ 13, 226, 96, 12, 13, 226, 95, 12, 13, 226, 94, 12, 13, 226, 93, 12, 13,
+ 226, 92, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224, 93, 12, 13, 224,
+ 92, 12, 13, 224, 91, 12, 13, 224, 90, 12, 13, 224, 89, 12, 13, 223, 222,
+ 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219, 12, 13, 223, 218,
+ 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215, 12, 13, 223, 214,
+ 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, 12, 13, 223, 210,
+ 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, 12, 13, 223, 206,
+ 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, 12, 13, 223, 202,
+ 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, 12, 13, 223, 198,
+ 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, 12, 13, 223, 194,
+ 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 223, 191, 12, 13, 223, 190,
+ 12, 13, 223, 189, 12, 13, 222, 88, 12, 13, 222, 87, 12, 13, 222, 86, 12,
+ 13, 222, 85, 12, 13, 222, 84, 12, 13, 222, 83, 12, 13, 222, 82, 12, 13,
+ 222, 81, 12, 13, 222, 80, 12, 13, 222, 79, 12, 13, 222, 78, 12, 13, 222,
+ 77, 12, 13, 222, 76, 12, 13, 222, 75, 12, 13, 222, 74, 12, 13, 222, 73,
+ 12, 13, 222, 72, 12, 13, 222, 71, 12, 13, 222, 70, 12, 13, 222, 69, 12,
+ 13, 222, 68, 12, 13, 222, 67, 12, 13, 222, 66, 12, 13, 222, 65, 12, 13,
+ 222, 64, 12, 13, 222, 63, 12, 13, 222, 62, 12, 13, 222, 61, 12, 13, 222,
+ 60, 12, 13, 222, 59, 12, 13, 222, 58, 12, 13, 222, 57, 12, 13, 222, 56,
+ 12, 13, 222, 55, 12, 13, 222, 54, 12, 13, 222, 53, 12, 13, 222, 52, 12,
+ 13, 222, 51, 12, 13, 222, 50, 12, 13, 222, 49, 12, 13, 222, 48, 12, 13,
+ 222, 47, 12, 13, 222, 46, 12, 13, 222, 45, 12, 13, 222, 44, 12, 13, 222,
+ 43, 12, 13, 222, 42, 12, 13, 222, 41, 12, 13, 222, 40, 12, 13, 222, 39,
+ 12, 13, 222, 38, 12, 13, 222, 37, 12, 13, 222, 36, 12, 13, 222, 35, 12,
+ 13, 217, 150, 12, 13, 217, 149, 12, 13, 217, 148, 12, 13, 217, 147, 12,
+ 13, 217, 146, 12, 13, 217, 145, 12, 13, 217, 144, 12, 13, 217, 143, 12,
+ 13, 217, 142, 12, 13, 217, 141, 12, 13, 217, 140, 12, 13, 217, 139, 12,
+ 13, 217, 138, 12, 13, 217, 137, 12, 13, 217, 136, 12, 13, 217, 135, 12,
+ 13, 217, 134, 12, 13, 217, 133, 12, 13, 217, 132, 12, 13, 217, 131, 12,
+ 13, 217, 130, 12, 13, 217, 129, 12, 13, 217, 128, 12, 13, 217, 127, 12,
+ 13, 217, 126, 12, 13, 217, 125, 12, 13, 217, 124, 12, 13, 217, 123, 12,
+ 13, 217, 122, 12, 13, 217, 121, 12, 13, 217, 120, 12, 13, 217, 119, 12,
+ 13, 217, 118, 12, 13, 217, 117, 12, 13, 217, 116, 12, 13, 217, 115, 12,
+ 13, 217, 114, 12, 13, 217, 113, 12, 13, 217, 112, 12, 13, 217, 111, 12,
+ 13, 217, 110, 12, 13, 217, 109, 12, 13, 217, 108, 12, 13, 217, 107, 12,
+ 13, 215, 22, 12, 13, 215, 21, 12, 13, 215, 20, 12, 13, 215, 19, 12, 13,
+ 215, 18, 12, 13, 215, 17, 12, 13, 215, 16, 12, 13, 215, 15, 12, 13, 215,
+ 14, 12, 13, 215, 13, 12, 13, 215, 12, 12, 13, 215, 11, 12, 13, 215, 10,
+ 12, 13, 215, 9, 12, 13, 215, 8, 12, 13, 215, 7, 12, 13, 215, 6, 12, 13,
+ 215, 5, 12, 13, 215, 4, 12, 13, 215, 3, 12, 13, 215, 2, 12, 13, 215, 1,
+ 12, 13, 215, 0, 12, 13, 214, 255, 12, 13, 214, 254, 12, 13, 214, 253, 12,
+ 13, 214, 252, 12, 13, 214, 251, 12, 13, 214, 250, 12, 13, 214, 249, 12,
+ 13, 214, 248, 12, 13, 214, 247, 12, 13, 214, 246, 12, 13, 214, 245, 12,
+ 13, 214, 244, 12, 13, 214, 243, 12, 13, 214, 242, 12, 13, 214, 241, 12,
+ 13, 214, 240, 12, 13, 214, 239, 12, 13, 214, 238, 12, 13, 214, 237, 12,
+ 13, 214, 236, 12, 13, 214, 235, 12, 13, 214, 234, 12, 13, 214, 233, 12,
+ 13, 214, 232, 12, 13, 214, 104, 12, 13, 214, 103, 12, 13, 214, 102, 12,
+ 13, 214, 101, 12, 13, 214, 100, 12, 13, 214, 99, 12, 13, 214, 98, 12, 13,
+ 214, 97, 12, 13, 214, 96, 12, 13, 214, 95, 12, 13, 214, 94, 12, 13, 214,
+ 93, 12, 13, 214, 92, 12, 13, 214, 91, 12, 13, 214, 90, 12, 13, 214, 89,
+ 12, 13, 214, 88, 12, 13, 214, 87, 12, 13, 214, 86, 12, 13, 214, 85, 12,
+ 13, 214, 84, 12, 13, 214, 83, 12, 13, 214, 82, 12, 13, 214, 81, 12, 13,
+ 214, 80, 12, 13, 214, 79, 12, 13, 214, 78, 12, 13, 214, 77, 12, 13, 214,
+ 76, 12, 13, 214, 75, 12, 13, 214, 74, 12, 13, 214, 73, 12, 13, 214, 72,
+ 12, 13, 214, 71, 12, 13, 214, 70, 12, 13, 214, 69, 12, 13, 214, 68, 12,
+ 13, 214, 67, 12, 13, 214, 66, 12, 13, 214, 65, 12, 13, 214, 64, 12, 13,
+ 214, 63, 12, 13, 214, 62, 12, 13, 214, 61, 12, 13, 214, 60, 12, 13, 214,
+ 59, 12, 13, 214, 58, 12, 13, 214, 57, 12, 13, 214, 56, 12, 13, 214, 55,
+ 12, 13, 214, 54, 12, 13, 214, 53, 12, 13, 214, 52, 12, 13, 214, 51, 12,
+ 13, 214, 50, 12, 13, 214, 49, 12, 13, 214, 48, 12, 13, 214, 47, 12, 13,
+ 214, 46, 12, 13, 214, 45, 12, 13, 214, 44, 12, 13, 214, 43, 12, 13, 214,
+ 42, 12, 13, 214, 41, 12, 13, 214, 40, 12, 13, 214, 39, 12, 13, 214, 38,
+ 12, 13, 214, 37, 12, 13, 214, 36, 12, 13, 214, 35, 12, 13, 214, 34, 12,
+ 13, 214, 33, 12, 13, 214, 32, 12, 13, 214, 31, 12, 13, 214, 30, 12, 13,
+ 214, 29, 12, 13, 214, 28, 12, 13, 212, 97, 12, 13, 212, 96, 12, 13, 212,
+ 95, 12, 13, 212, 94, 12, 13, 212, 93, 12, 13, 212, 92, 12, 13, 212, 91,
+ 12, 13, 212, 90, 12, 13, 212, 89, 12, 13, 212, 88, 12, 13, 212, 87, 12,
+ 13, 212, 86, 12, 13, 212, 85, 12, 13, 212, 84, 12, 13, 212, 83, 12, 13,
+ 212, 82, 12, 13, 212, 81, 12, 13, 212, 80, 12, 13, 212, 79, 12, 13, 212,
+ 78, 12, 13, 212, 77, 12, 13, 212, 76, 12, 13, 212, 75, 12, 13, 212, 74,
+ 12, 13, 212, 73, 12, 13, 212, 72, 12, 13, 212, 71, 12, 13, 212, 70, 12,
+ 13, 212, 69, 12, 13, 212, 68, 12, 13, 212, 67, 12, 13, 212, 66, 12, 13,
+ 211, 177, 12, 13, 211, 176, 12, 13, 211, 175, 12, 13, 211, 174, 12, 13,
+ 211, 173, 12, 13, 211, 172, 12, 13, 211, 171, 12, 13, 211, 170, 12, 13,
+ 211, 169, 12, 13, 211, 168, 12, 13, 211, 167, 12, 13, 211, 166, 12, 13,
+ 211, 115, 12, 13, 211, 114, 12, 13, 211, 113, 12, 13, 211, 112, 12, 13,
+ 211, 111, 12, 13, 211, 110, 12, 13, 211, 109, 12, 13, 211, 108, 12, 13,
+ 211, 107, 12, 13, 210, 158, 12, 13, 210, 157, 12, 13, 210, 156, 12, 13,
+ 210, 155, 12, 13, 210, 154, 12, 13, 210, 153, 12, 13, 210, 152, 12, 13,
+ 210, 151, 12, 13, 210, 150, 12, 13, 210, 149, 12, 13, 210, 148, 12, 13,
+ 210, 147, 12, 13, 210, 146, 12, 13, 210, 145, 12, 13, 210, 144, 12, 13,
+ 210, 143, 12, 13, 210, 142, 12, 13, 210, 141, 12, 13, 210, 140, 12, 13,
+ 210, 139, 12, 13, 210, 138, 12, 13, 210, 137, 12, 13, 210, 136, 12, 13,
+ 210, 135, 12, 13, 210, 134, 12, 13, 210, 133, 12, 13, 210, 132, 12, 13,
+ 210, 131, 12, 13, 210, 130, 12, 13, 210, 129, 12, 13, 210, 128, 12, 13,
+ 210, 127, 12, 13, 210, 126, 12, 13, 210, 125, 12, 13, 210, 124, 12, 13,
+ 210, 123, 12, 13, 210, 122, 12, 13, 210, 121, 12, 13, 210, 120, 12, 13,
+ 210, 119, 12, 13, 210, 118, 12, 13, 255, 72, 12, 13, 255, 71, 12, 13,
+ 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, 12, 13, 255, 67, 12, 13, 255,
+ 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, 13, 255, 63, 12, 13, 255, 62,
+ 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, 255, 59, 12, 13, 255, 58, 12,
+ 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, 55, 12, 13, 255, 54, 12, 13,
+ 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, 12, 13, 255, 50, 12, 13, 255,
+ 49, 12, 13, 255, 48, 12, 13, 255, 47, 12, 13, 255, 46, 12, 13, 255, 45,
+ 12, 13, 255, 44, 12, 13, 255, 43, 12, 13, 255, 42, 12, 13, 255, 41, 12,
+ 13, 255, 40, 12, 13, 255, 39, 20, 1, 167, 229, 12, 231, 16, 20, 1, 167,
+ 243, 70, 244, 36, 20, 1, 167, 224, 251, 231, 17, 225, 57, 20, 1, 167,
+ 224, 251, 231, 17, 225, 58, 20, 1, 167, 229, 226, 231, 16, 20, 1, 167,
+ 219, 221, 20, 1, 167, 216, 66, 231, 16, 20, 1, 167, 227, 118, 231, 16,
+ 20, 1, 167, 220, 19, 226, 90, 228, 169, 20, 1, 167, 224, 251, 226, 90,
+ 228, 170, 225, 57, 20, 1, 167, 224, 251, 226, 90, 228, 170, 225, 58, 20,
+ 1, 167, 231, 218, 20, 1, 167, 215, 119, 231, 219, 20, 1, 167, 229, 71,
+ 20, 1, 167, 231, 215, 20, 1, 167, 231, 176, 20, 1, 167, 230, 48, 20, 1,
+ 167, 220, 124, 20, 1, 167, 227, 241, 20, 1, 167, 234, 149, 20, 1, 167,
+ 228, 138, 20, 1, 167, 218, 4, 20, 1, 167, 229, 11, 20, 1, 167, 233, 87,
+ 20, 1, 167, 233, 12, 233, 189, 20, 1, 167, 227, 248, 231, 24, 20, 1, 167,
+ 231, 222, 20, 1, 167, 225, 246, 20, 1, 167, 242, 231, 20, 1, 167, 226,
+ 50, 20, 1, 167, 230, 151, 229, 45, 20, 1, 167, 227, 99, 231, 27, 20, 1,
+ 167, 104, 210, 188, 229, 220, 20, 1, 167, 242, 232, 20, 1, 167, 227, 248,
+ 227, 249, 20, 1, 167, 219, 128, 20, 1, 167, 231, 9, 20, 1, 167, 231, 30,
+ 20, 1, 167, 230, 130, 20, 1, 167, 234, 249, 20, 1, 167, 226, 90, 233, 47,
+ 20, 1, 167, 229, 149, 233, 47, 20, 1, 167, 225, 158, 20, 1, 167, 231,
+ 216, 20, 1, 167, 228, 207, 20, 1, 167, 224, 134, 20, 1, 167, 215, 116,
+ 20, 1, 167, 232, 94, 20, 1, 167, 219, 41, 20, 1, 167, 216, 216, 20, 1,
+ 167, 231, 213, 20, 1, 167, 234, 156, 20, 1, 167, 229, 145, 20, 1, 167,
+ 233, 201, 20, 1, 167, 230, 131, 20, 1, 167, 219, 218, 20, 1, 167, 232,
+ 138, 20, 1, 167, 244, 93, 20, 1, 167, 222, 199, 20, 1, 167, 233, 241, 20,
+ 1, 167, 219, 37, 20, 1, 167, 231, 173, 225, 99, 20, 1, 167, 220, 12, 20,
+ 1, 167, 227, 247, 20, 1, 167, 219, 253, 228, 2, 210, 196, 20, 1, 167,
+ 227, 138, 230, 148, 20, 1, 167, 226, 85, 20, 1, 167, 228, 139, 20, 1,
+ 167, 214, 170, 20, 1, 167, 229, 48, 20, 1, 167, 231, 212, 20, 1, 167,
+ 228, 181, 20, 1, 167, 231, 119, 20, 1, 167, 227, 151, 20, 1, 167, 216,
+ 220, 20, 1, 167, 219, 34, 20, 1, 167, 226, 86, 20, 1, 167, 228, 6, 20, 1,
+ 167, 231, 220, 20, 1, 167, 227, 148, 20, 1, 167, 234, 216, 20, 1, 167,
+ 228, 9, 20, 1, 167, 213, 250, 20, 1, 167, 232, 98, 20, 1, 167, 229, 98,
+ 20, 1, 167, 229, 196, 20, 1, 167, 231, 118, 20, 1, 225, 138, 228, 4, 20,
+ 1, 225, 138, 215, 119, 231, 217, 20, 1, 225, 138, 219, 185, 20, 1, 225,
+ 138, 220, 128, 215, 118, 20, 1, 225, 138, 232, 140, 227, 244, 20, 1, 225,
+ 138, 231, 125, 231, 221, 20, 1, 225, 138, 234, 87, 20, 1, 225, 138, 211,
+ 15, 20, 1, 225, 138, 231, 120, 20, 1, 225, 138, 234, 237, 20, 1, 225,
+ 138, 225, 208, 20, 1, 225, 138, 211, 89, 233, 47, 20, 1, 225, 138, 233,
+ 103, 228, 2, 227, 160, 20, 1, 225, 138, 227, 242, 220, 38, 20, 1, 225,
+ 138, 229, 116, 228, 184, 20, 1, 225, 138, 242, 229, 20, 1, 225, 138, 225,
+ 49, 20, 1, 225, 138, 215, 119, 228, 0, 20, 1, 225, 138, 220, 43, 228,
+ 179, 20, 1, 225, 138, 220, 39, 20, 1, 225, 138, 231, 17, 216, 219, 20, 1,
+ 225, 138, 231, 107, 231, 121, 20, 1, 225, 138, 227, 149, 227, 244, 20, 1,
+ 225, 138, 234, 145, 20, 1, 225, 138, 242, 230, 20, 1, 225, 138, 234, 141,
+ 20, 1, 225, 138, 233, 129, 20, 1, 225, 138, 225, 249, 20, 1, 225, 138,
+ 213, 182, 20, 1, 225, 138, 229, 13, 230, 46, 20, 1, 225, 138, 229, 47,
+ 231, 103, 20, 1, 225, 138, 211, 193, 20, 1, 225, 138, 222, 11, 20, 1,
+ 225, 138, 217, 97, 20, 1, 225, 138, 231, 29, 20, 1, 225, 138, 229, 32,
+ 20, 1, 225, 138, 229, 33, 233, 84, 20, 1, 225, 138, 231, 19, 20, 1, 225,
+ 138, 218, 52, 20, 1, 225, 138, 231, 111, 20, 1, 225, 138, 230, 133, 20,
+ 1, 225, 138, 227, 163, 20, 1, 225, 138, 224, 138, 20, 1, 225, 138, 231,
+ 28, 229, 49, 20, 1, 225, 138, 244, 126, 20, 1, 225, 138, 231, 98, 20, 1,
+ 225, 138, 244, 147, 20, 1, 225, 138, 234, 153, 20, 1, 225, 138, 231, 239,
+ 228, 173, 20, 1, 225, 138, 231, 239, 228, 149, 20, 1, 225, 138, 233, 11,
+ 20, 1, 225, 138, 229, 55, 20, 1, 225, 138, 228, 11, 20, 1, 225, 138, 184,
+ 20, 1, 225, 138, 234, 74, 20, 1, 225, 138, 229, 1, 20, 1, 137, 229, 12,
+ 231, 219, 20, 1, 137, 227, 117, 20, 1, 137, 210, 196, 20, 1, 137, 212,
+ 53, 20, 1, 137, 229, 48, 20, 1, 137, 229, 137, 20, 1, 137, 229, 19, 20,
+ 1, 137, 242, 239, 20, 1, 137, 231, 115, 20, 1, 137, 243, 77, 20, 1, 137,
+ 227, 140, 230, 170, 231, 31, 20, 1, 137, 227, 240, 231, 106, 20, 1, 137,
+ 231, 112, 20, 1, 137, 225, 55, 20, 1, 137, 229, 122, 20, 1, 137, 231,
+ 123, 251, 29, 20, 1, 137, 234, 143, 20, 1, 137, 242, 240, 20, 1, 137,
+ 234, 150, 20, 1, 137, 210, 213, 230, 76, 20, 1, 137, 227, 111, 20, 1,
+ 137, 231, 100, 20, 1, 137, 228, 10, 20, 1, 137, 231, 106, 20, 1, 137,
+ 211, 16, 20, 1, 137, 233, 249, 20, 1, 137, 235, 10, 20, 1, 137, 220, 123,
+ 20, 1, 137, 229, 131, 20, 1, 137, 217, 95, 20, 1, 137, 228, 153, 20, 1,
+ 137, 216, 66, 210, 198, 20, 1, 137, 218, 79, 20, 1, 137, 229, 39, 227,
+ 160, 20, 1, 137, 213, 181, 20, 1, 137, 229, 199, 20, 1, 137, 231, 239,
+ 234, 152, 20, 1, 137, 227, 249, 20, 1, 137, 229, 34, 20, 1, 137, 233, 88,
+ 20, 1, 137, 231, 108, 20, 1, 137, 231, 8, 20, 1, 137, 227, 243, 20, 1,
+ 137, 216, 215, 20, 1, 137, 229, 36, 20, 1, 137, 243, 233, 20, 1, 137,
+ 229, 136, 20, 1, 137, 228, 12, 20, 1, 137, 228, 8, 20, 1, 137, 251, 107,
+ 20, 1, 137, 213, 183, 20, 1, 137, 231, 113, 20, 1, 137, 222, 140, 20, 1,
+ 137, 228, 183, 20, 1, 137, 233, 102, 20, 1, 137, 216, 64, 20, 1, 137,
+ 227, 250, 229, 1, 20, 1, 137, 228, 175, 20, 1, 137, 234, 156, 20, 1, 137,
+ 229, 40, 20, 1, 137, 231, 212, 20, 1, 137, 231, 101, 20, 1, 137, 232, 98,
+ 20, 1, 137, 233, 189, 20, 1, 137, 228, 181, 20, 1, 137, 229, 1, 20, 1,
+ 137, 211, 184, 20, 1, 137, 229, 37, 20, 1, 137, 227, 253, 20, 1, 137,
+ 227, 245, 20, 1, 137, 233, 203, 228, 139, 20, 1, 137, 227, 251, 20, 1,
+ 137, 229, 144, 20, 1, 137, 231, 239, 228, 0, 20, 1, 137, 211, 103, 20, 1,
+ 137, 229, 143, 20, 1, 137, 219, 220, 20, 1, 137, 220, 126, 20, 1, 137,
+ 231, 109, 20, 1, 137, 231, 219, 20, 1, 137, 231, 119, 20, 1, 137, 234,
+ 144, 20, 1, 137, 231, 110, 20, 1, 137, 234, 148, 20, 1, 137, 231, 123,
+ 225, 103, 20, 1, 137, 210, 179, 20, 1, 137, 228, 171, 20, 1, 137, 230,
+ 220, 20, 1, 137, 230, 100, 20, 1, 137, 220, 15, 20, 1, 137, 234, 166,
+ 233, 70, 20, 1, 137, 234, 166, 244, 160, 20, 1, 137, 229, 69, 20, 1, 137,
+ 229, 196, 20, 1, 137, 232, 200, 20, 1, 137, 225, 65, 20, 1, 137, 225,
+ 199, 20, 1, 137, 216, 230, 20, 1, 107, 231, 99, 20, 1, 107, 212, 51, 20,
+ 1, 107, 228, 169, 20, 1, 107, 231, 16, 20, 1, 107, 228, 167, 20, 1, 107,
+ 232, 235, 20, 1, 107, 228, 172, 20, 1, 107, 228, 7, 20, 1, 107, 229, 54,
+ 20, 1, 107, 227, 160, 20, 1, 107, 211, 194, 20, 1, 107, 229, 9, 20, 1,
+ 107, 220, 61, 20, 1, 107, 229, 20, 20, 1, 107, 234, 151, 20, 1, 107, 216,
+ 217, 20, 1, 107, 220, 41, 20, 1, 107, 228, 180, 20, 1, 107, 218, 52, 20,
+ 1, 107, 234, 156, 20, 1, 107, 211, 91, 20, 1, 107, 233, 204, 20, 1, 107,
+ 221, 234, 20, 1, 107, 231, 21, 20, 1, 107, 229, 135, 20, 1, 107, 231,
+ 188, 20, 1, 107, 231, 27, 20, 1, 107, 220, 125, 20, 1, 107, 211, 39, 20,
+ 1, 107, 228, 174, 20, 1, 107, 234, 147, 231, 102, 20, 1, 107, 229, 16,
+ 20, 1, 107, 215, 118, 20, 1, 107, 242, 248, 20, 1, 107, 229, 6, 20, 1,
+ 107, 244, 127, 20, 1, 107, 229, 139, 20, 1, 107, 231, 0, 20, 1, 107, 233,
+ 5, 20, 1, 107, 229, 121, 20, 1, 107, 230, 147, 20, 1, 107, 231, 4, 20, 1,
+ 107, 224, 118, 20, 1, 107, 231, 2, 20, 1, 107, 231, 18, 20, 1, 107, 232,
+ 84, 20, 1, 107, 227, 255, 20, 1, 107, 231, 122, 20, 1, 107, 233, 180, 20,
+ 1, 107, 227, 151, 20, 1, 107, 216, 220, 20, 1, 107, 219, 34, 20, 1, 107,
+ 210, 179, 20, 1, 107, 234, 148, 20, 1, 107, 223, 170, 20, 1, 107, 217,
+ 10, 20, 1, 107, 229, 17, 20, 1, 107, 231, 23, 20, 1, 107, 227, 254, 20,
+ 1, 107, 234, 146, 20, 1, 107, 225, 59, 20, 1, 107, 225, 152, 20, 1, 107,
+ 227, 127, 20, 1, 107, 233, 11, 20, 1, 107, 229, 55, 20, 1, 107, 231, 20,
+ 20, 1, 107, 229, 29, 20, 1, 107, 210, 193, 20, 1, 107, 226, 21, 20, 1,
+ 107, 210, 192, 20, 1, 107, 229, 144, 20, 1, 107, 227, 244, 20, 1, 107,
+ 218, 81, 20, 1, 107, 233, 208, 20, 1, 107, 229, 44, 20, 1, 107, 229, 14,
+ 20, 1, 107, 215, 102, 20, 1, 107, 231, 31, 20, 1, 107, 233, 198, 20, 1,
+ 107, 227, 252, 20, 1, 107, 216, 218, 20, 1, 107, 231, 214, 20, 1, 107,
+ 229, 53, 20, 1, 107, 233, 4, 20, 1, 107, 229, 35, 20, 1, 107, 228, 1, 20,
+ 1, 107, 228, 153, 20, 1, 107, 242, 233, 20, 1, 107, 233, 217, 20, 1, 107,
+ 223, 84, 226, 209, 20, 1, 107, 217, 86, 20, 1, 107, 216, 10, 20, 1, 107,
+ 227, 148, 20, 1, 107, 222, 239, 20, 1, 107, 233, 49, 20, 1, 107, 231, 79,
+ 20, 1, 107, 193, 20, 1, 107, 218, 4, 20, 1, 107, 230, 102, 20, 1, 107,
+ 220, 27, 20, 1, 107, 220, 37, 20, 1, 107, 233, 155, 20, 1, 107, 227, 237,
+ 20, 1, 107, 219, 225, 20, 1, 107, 227, 246, 20, 1, 107, 225, 211, 20, 1,
+ 107, 228, 233, 20, 1, 107, 219, 252, 20, 1, 107, 224, 133, 20, 1, 107,
+ 230, 46, 20, 1, 107, 232, 119, 20, 1, 107, 223, 84, 230, 96, 20, 1, 107,
+ 216, 117, 20, 1, 107, 227, 238, 20, 1, 107, 231, 123, 198, 20, 1, 107,
+ 221, 232, 20, 1, 107, 244, 195, 20, 1, 82, 229, 143, 20, 1, 82, 216, 16,
+ 20, 1, 82, 231, 112, 20, 1, 82, 233, 88, 20, 1, 82, 213, 128, 20, 1, 82,
+ 232, 125, 20, 1, 82, 226, 89, 20, 1, 82, 219, 45, 20, 1, 82, 223, 145,
+ 20, 1, 82, 228, 3, 20, 1, 82, 229, 114, 20, 1, 82, 224, 147, 20, 1, 82,
+ 217, 62, 20, 1, 82, 229, 22, 20, 1, 82, 233, 245, 20, 1, 82, 211, 187,
+ 20, 1, 82, 221, 170, 20, 1, 82, 229, 45, 20, 1, 82, 226, 86, 20, 1, 82,
+ 216, 17, 20, 1, 82, 233, 202, 20, 1, 82, 232, 139, 20, 1, 82, 228, 6, 20,
+ 1, 82, 228, 254, 20, 1, 82, 231, 220, 20, 1, 82, 229, 15, 20, 1, 82, 228,
+ 253, 20, 1, 82, 228, 5, 20, 1, 82, 222, 237, 20, 1, 82, 228, 171, 20, 1,
+ 82, 225, 210, 20, 1, 82, 222, 31, 20, 1, 82, 229, 30, 20, 1, 82, 231, 10,
+ 20, 1, 82, 242, 227, 20, 1, 82, 229, 18, 20, 1, 82, 228, 182, 20, 1, 82,
+ 231, 172, 20, 1, 82, 232, 121, 20, 1, 82, 229, 50, 20, 1, 82, 229, 127,
+ 20, 1, 82, 217, 85, 227, 244, 20, 1, 82, 220, 127, 20, 1, 82, 224, 143,
+ 20, 1, 82, 229, 147, 219, 51, 20, 1, 82, 229, 38, 227, 160, 20, 1, 82,
+ 211, 4, 20, 1, 82, 242, 228, 20, 1, 82, 215, 117, 20, 1, 82, 211, 19, 20,
+ 1, 82, 225, 16, 20, 1, 82, 215, 107, 20, 1, 82, 234, 154, 20, 1, 82, 218,
+ 80, 20, 1, 82, 216, 219, 20, 1, 82, 213, 184, 20, 1, 82, 212, 6, 20, 1,
+ 82, 233, 132, 20, 1, 82, 224, 150, 20, 1, 82, 217, 96, 20, 1, 82, 242,
+ 247, 20, 1, 82, 229, 59, 20, 1, 82, 220, 40, 20, 1, 82, 231, 5, 20, 1,
+ 82, 231, 116, 20, 1, 82, 227, 115, 20, 1, 82, 228, 136, 20, 1, 82, 243,
+ 73, 20, 1, 82, 215, 108, 20, 1, 82, 233, 211, 20, 1, 82, 211, 67, 20, 1,
+ 82, 227, 149, 250, 16, 20, 1, 82, 210, 250, 20, 1, 82, 231, 22, 20, 1,
+ 82, 229, 132, 20, 1, 82, 225, 100, 20, 1, 82, 210, 197, 20, 1, 82, 233,
+ 6, 20, 1, 82, 243, 233, 20, 1, 82, 243, 72, 20, 1, 82, 229, 8, 20, 1, 82,
+ 234, 156, 20, 1, 82, 231, 223, 20, 1, 82, 229, 21, 20, 1, 82, 242, 234,
+ 20, 1, 82, 244, 196, 20, 1, 82, 227, 239, 20, 1, 82, 225, 153, 20, 1, 82,
+ 211, 17, 20, 1, 82, 229, 46, 20, 1, 82, 227, 149, 252, 23, 20, 1, 82,
+ 227, 95, 20, 1, 82, 224, 247, 20, 1, 82, 230, 220, 20, 1, 82, 243, 231,
+ 20, 1, 82, 229, 220, 20, 1, 82, 230, 100, 20, 1, 82, 242, 233, 20, 1, 82,
+ 243, 235, 73, 20, 1, 82, 230, 47, 20, 1, 82, 224, 146, 20, 1, 82, 229,
+ 10, 20, 1, 82, 233, 189, 20, 1, 82, 225, 97, 20, 1, 82, 227, 247, 20, 1,
+ 82, 211, 18, 20, 1, 82, 229, 31, 20, 1, 82, 226, 90, 225, 187, 20, 1, 82,
+ 243, 235, 251, 15, 20, 1, 82, 244, 37, 20, 1, 82, 228, 176, 20, 1, 82,
+ 61, 20, 1, 82, 216, 10, 20, 1, 82, 76, 20, 1, 82, 73, 20, 1, 82, 233, 86,
+ 20, 1, 82, 226, 90, 225, 23, 20, 1, 82, 217, 101, 20, 1, 82, 217, 51, 20,
+ 1, 82, 229, 147, 230, 34, 240, 234, 20, 1, 82, 220, 15, 20, 1, 82, 211,
+ 14, 20, 1, 82, 228, 247, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217,
+ 240, 20, 1, 82, 210, 227, 249, 147, 20, 1, 82, 210, 187, 20, 1, 82, 210,
+ 195, 20, 1, 82, 234, 142, 20, 1, 82, 225, 151, 20, 1, 82, 228, 177, 245,
+ 102, 20, 1, 82, 224, 144, 20, 1, 82, 211, 192, 20, 1, 82, 244, 147, 20,
+ 1, 82, 213, 250, 20, 1, 82, 232, 98, 20, 1, 82, 230, 230, 20, 1, 82, 223,
+ 51, 20, 1, 82, 223, 171, 20, 1, 82, 228, 246, 20, 1, 82, 229, 77, 20, 1,
+ 82, 220, 7, 20, 1, 82, 219, 252, 20, 1, 82, 243, 235, 223, 86, 20, 1, 82,
+ 197, 20, 1, 82, 225, 108, 20, 1, 82, 232, 119, 20, 1, 82, 234, 28, 20, 1,
+ 82, 231, 58, 20, 1, 82, 184, 20, 1, 82, 231, 169, 20, 1, 82, 216, 221,
+ 20, 1, 82, 234, 92, 20, 1, 82, 230, 150, 20, 1, 82, 216, 247, 20, 1, 82,
+ 244, 169, 20, 1, 82, 242, 223, 20, 1, 225, 137, 176, 20, 1, 225, 137, 70,
+ 20, 1, 225, 137, 233, 217, 20, 1, 225, 137, 245, 209, 20, 1, 225, 137,
+ 223, 108, 20, 1, 225, 137, 217, 86, 20, 1, 225, 137, 227, 148, 20, 1,
+ 225, 137, 233, 135, 20, 1, 225, 137, 222, 239, 20, 1, 225, 137, 223, 29,
+ 20, 1, 225, 137, 231, 79, 20, 1, 225, 137, 217, 101, 20, 1, 225, 137,
+ 229, 146, 20, 1, 225, 137, 228, 183, 20, 1, 225, 137, 193, 20, 1, 225,
+ 137, 218, 4, 20, 1, 225, 137, 220, 27, 20, 1, 225, 137, 219, 191, 20, 1,
+ 225, 137, 220, 123, 20, 1, 225, 137, 233, 155, 20, 1, 225, 137, 234, 156,
+ 20, 1, 225, 137, 227, 209, 20, 1, 225, 137, 227, 237, 20, 1, 225, 137,
+ 228, 154, 20, 1, 225, 137, 210, 226, 20, 1, 225, 137, 219, 225, 20, 1,
+ 225, 137, 191, 20, 1, 225, 137, 228, 9, 20, 1, 225, 137, 225, 151, 20, 1,
+ 225, 137, 227, 246, 20, 1, 225, 137, 211, 192, 20, 1, 225, 137, 225, 211,
+ 20, 1, 225, 137, 222, 140, 20, 1, 225, 137, 228, 233, 20, 1, 225, 137,
+ 223, 51, 20, 1, 225, 137, 234, 165, 20, 1, 225, 137, 229, 7, 20, 1, 225,
+ 137, 229, 56, 20, 1, 225, 137, 220, 7, 20, 1, 225, 137, 224, 147, 20, 1,
+ 225, 137, 244, 37, 20, 1, 225, 137, 212, 65, 20, 1, 225, 137, 232, 241,
+ 20, 1, 225, 137, 232, 119, 20, 1, 225, 137, 234, 28, 20, 1, 225, 137,
+ 231, 114, 20, 1, 225, 137, 223, 83, 20, 1, 225, 137, 184, 20, 1, 225,
+ 137, 230, 161, 20, 1, 225, 137, 231, 122, 20, 1, 225, 137, 216, 230, 20,
+ 1, 225, 137, 233, 251, 20, 1, 225, 137, 221, 251, 20, 1, 225, 137, 212,
+ 115, 95, 1, 190, 95, 1, 252, 191, 95, 1, 8, 190, 95, 1, 225, 42, 95, 1,
+ 184, 95, 1, 230, 233, 95, 1, 254, 23, 184, 95, 1, 244, 196, 95, 1, 214,
+ 27, 95, 1, 213, 177, 95, 1, 217, 105, 95, 1, 248, 221, 95, 1, 8, 215,
+ 156, 95, 1, 8, 217, 105, 95, 1, 215, 156, 95, 1, 248, 135, 95, 1, 197,
+ 95, 1, 228, 237, 95, 1, 8, 228, 110, 95, 1, 254, 23, 197, 95, 1, 228,
+ 110, 95, 1, 228, 96, 95, 1, 233, 135, 95, 1, 232, 61, 95, 1, 232, 254,
+ 95, 1, 232, 243, 95, 1, 216, 56, 95, 1, 247, 153, 95, 1, 216, 48, 95, 1,
+ 247, 152, 95, 1, 176, 95, 1, 243, 135, 95, 1, 8, 176, 95, 1, 224, 88, 95,
+ 1, 224, 66, 95, 1, 229, 77, 95, 1, 229, 28, 95, 1, 254, 23, 229, 77, 95,
+ 1, 162, 95, 1, 211, 165, 95, 1, 242, 249, 95, 1, 242, 226, 95, 1, 215,
+ 165, 95, 1, 246, 26, 95, 1, 227, 165, 95, 1, 227, 150, 95, 1, 215, 175,
+ 95, 1, 246, 33, 95, 1, 8, 215, 175, 95, 1, 8, 246, 33, 95, 1, 223, 106,
+ 215, 175, 95, 1, 220, 102, 95, 1, 218, 223, 95, 1, 210, 82, 95, 1, 210,
+ 14, 95, 1, 215, 183, 95, 1, 246, 38, 95, 1, 8, 215, 183, 95, 1, 206, 95,
+ 1, 210, 116, 95, 1, 210, 15, 95, 1, 209, 243, 95, 1, 209, 223, 95, 1,
+ 254, 23, 209, 243, 95, 1, 209, 215, 95, 1, 209, 222, 95, 1, 212, 65, 95,
+ 1, 254, 209, 95, 1, 241, 189, 95, 1, 229, 192, 95, 5, 253, 222, 95, 5,
+ 223, 106, 213, 133, 95, 5, 223, 106, 253, 222, 95, 25, 5, 61, 95, 25, 5,
+ 255, 73, 95, 25, 5, 254, 205, 95, 25, 5, 254, 123, 95, 25, 5, 254, 115,
+ 95, 25, 5, 76, 95, 25, 5, 226, 183, 95, 25, 5, 211, 227, 95, 25, 5, 212,
+ 98, 95, 25, 5, 75, 95, 25, 5, 245, 150, 95, 25, 5, 245, 138, 95, 25, 5,
+ 226, 232, 95, 25, 5, 73, 95, 25, 5, 240, 119, 95, 25, 5, 240, 118, 95,
+ 25, 5, 240, 117, 95, 25, 5, 235, 189, 95, 25, 5, 236, 60, 95, 25, 5, 236,
+ 33, 95, 25, 5, 235, 156, 95, 25, 5, 235, 231, 95, 25, 5, 70, 95, 25, 5,
+ 214, 229, 95, 25, 5, 214, 228, 95, 25, 5, 214, 227, 95, 25, 5, 214, 118,
+ 95, 25, 5, 214, 211, 95, 25, 5, 214, 178, 95, 25, 5, 211, 117, 95, 25, 5,
+ 211, 8, 95, 25, 5, 254, 243, 95, 25, 5, 254, 239, 95, 25, 5, 245, 86, 95,
+ 25, 5, 222, 183, 245, 86, 95, 25, 5, 245, 92, 95, 25, 5, 222, 183, 245,
+ 92, 95, 25, 5, 254, 201, 95, 25, 5, 245, 195, 95, 25, 5, 253, 192, 95,
+ 25, 5, 226, 134, 95, 25, 5, 230, 25, 95, 25, 5, 229, 79, 95, 138, 222,
+ 251, 95, 138, 216, 14, 222, 251, 95, 138, 48, 95, 138, 51, 95, 1, 216,
+ 28, 95, 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95, 1, 216, 24, 95,
+ 1, 216, 23, 95, 1, 216, 22, 95, 1, 223, 106, 216, 29, 95, 1, 223, 106,
+ 216, 28, 95, 1, 223, 106, 216, 26, 95, 1, 223, 106, 216, 25, 95, 1, 223,
+ 106, 216, 24, 95, 1, 223, 106, 216, 22, 56, 1, 254, 23, 75, 141, 1, 254,
+ 23, 211, 47, 49, 28, 16, 224, 154, 49, 28, 16, 248, 158, 49, 28, 16, 225,
+ 175, 49, 28, 16, 226, 113, 245, 178, 49, 28, 16, 226, 113, 247, 201, 49,
+ 28, 16, 214, 16, 245, 178, 49, 28, 16, 214, 16, 247, 201, 49, 28, 16,
+ 234, 197, 49, 28, 16, 217, 169, 49, 28, 16, 226, 9, 49, 28, 16, 210, 217,
+ 49, 28, 16, 210, 218, 247, 201, 49, 28, 16, 233, 234, 49, 28, 16, 254,
+ 68, 245, 178, 49, 28, 16, 245, 26, 245, 178, 49, 28, 16, 217, 2, 49, 28,
+ 16, 234, 161, 49, 28, 16, 254, 58, 49, 28, 16, 254, 59, 247, 201, 49, 28,
+ 16, 217, 175, 49, 28, 16, 216, 159, 49, 28, 16, 226, 206, 254, 21, 49,
+ 28, 16, 242, 159, 254, 21, 49, 28, 16, 224, 153, 49, 28, 16, 250, 149,
+ 49, 28, 16, 214, 6, 49, 28, 16, 235, 164, 254, 21, 49, 28, 16, 234, 163,
+ 254, 21, 49, 28, 16, 234, 162, 254, 21, 49, 28, 16, 221, 213, 49, 28, 16,
+ 226, 0, 49, 28, 16, 218, 146, 254, 61, 49, 28, 16, 226, 112, 254, 21, 49,
+ 28, 16, 214, 15, 254, 21, 49, 28, 16, 254, 62, 254, 21, 49, 28, 16, 254,
+ 56, 49, 28, 16, 234, 37, 49, 28, 16, 223, 46, 49, 28, 16, 225, 106, 254,
+ 21, 49, 28, 16, 216, 83, 49, 28, 16, 254, 121, 49, 28, 16, 221, 159, 49,
+ 28, 16, 217, 178, 254, 21, 49, 28, 16, 217, 178, 231, 40, 218, 144, 49,
+ 28, 16, 226, 107, 254, 21, 49, 28, 16, 216, 190, 49, 28, 16, 233, 27, 49,
+ 28, 16, 246, 41, 49, 28, 16, 215, 227, 49, 28, 16, 216, 232, 49, 28, 16,
+ 233, 237, 49, 28, 16, 254, 68, 245, 26, 229, 95, 49, 28, 16, 243, 236,
+ 254, 21, 49, 28, 16, 236, 12, 49, 28, 16, 215, 199, 254, 21, 49, 28, 16,
+ 234, 200, 215, 198, 49, 28, 16, 225, 200, 49, 28, 16, 224, 158, 49, 28,
+ 16, 234, 11, 49, 28, 16, 250, 80, 254, 21, 49, 28, 16, 223, 146, 49, 28,
+ 16, 226, 12, 254, 21, 49, 28, 16, 226, 10, 254, 21, 49, 28, 16, 240, 109,
+ 49, 28, 16, 229, 203, 49, 28, 16, 225, 156, 49, 28, 16, 234, 12, 254,
+ 149, 49, 28, 16, 215, 199, 254, 149, 49, 28, 16, 218, 123, 49, 28, 16,
+ 242, 123, 49, 28, 16, 235, 164, 229, 95, 49, 28, 16, 226, 206, 229, 95,
+ 49, 28, 16, 226, 113, 229, 95, 49, 28, 16, 225, 155, 49, 28, 16, 233,
+ 254, 49, 28, 16, 225, 154, 49, 28, 16, 233, 236, 49, 28, 16, 225, 201,
+ 229, 95, 49, 28, 16, 234, 162, 229, 96, 254, 96, 49, 28, 16, 234, 163,
+ 229, 96, 254, 96, 49, 28, 16, 210, 215, 49, 28, 16, 254, 59, 229, 95, 49,
+ 28, 16, 254, 60, 217, 176, 229, 95, 49, 28, 16, 210, 216, 49, 28, 16,
+ 233, 235, 49, 28, 16, 245, 173, 49, 28, 16, 250, 150, 49, 28, 16, 230,
+ 198, 235, 163, 49, 28, 16, 214, 16, 229, 95, 49, 28, 16, 225, 106, 229,
+ 95, 49, 28, 16, 224, 159, 229, 95, 49, 28, 16, 226, 203, 49, 28, 16, 254,
+ 84, 49, 28, 16, 232, 58, 49, 28, 16, 226, 10, 229, 95, 49, 28, 16, 226,
+ 12, 229, 95, 49, 28, 16, 245, 60, 226, 11, 49, 28, 16, 233, 153, 49, 28,
+ 16, 254, 85, 49, 28, 16, 215, 199, 229, 95, 49, 28, 16, 245, 176, 49, 28,
+ 16, 217, 178, 229, 95, 49, 28, 16, 217, 170, 49, 28, 16, 250, 80, 229,
+ 95, 49, 28, 16, 245, 106, 49, 28, 16, 221, 160, 229, 95, 49, 28, 16, 211,
+ 151, 234, 37, 49, 28, 16, 215, 196, 49, 28, 16, 224, 160, 49, 28, 16,
+ 215, 200, 49, 28, 16, 215, 197, 49, 28, 16, 224, 157, 49, 28, 16, 215,
+ 195, 49, 28, 16, 224, 156, 49, 28, 16, 242, 158, 49, 28, 16, 254, 14, 49,
+ 28, 16, 245, 60, 254, 14, 49, 28, 16, 226, 107, 229, 95, 49, 28, 16, 216,
+ 189, 245, 69, 49, 28, 16, 216, 189, 245, 25, 49, 28, 16, 216, 191, 254,
+ 63, 49, 28, 16, 216, 184, 234, 247, 254, 55, 49, 28, 16, 234, 199, 49,
+ 28, 16, 245, 139, 49, 28, 16, 211, 11, 234, 196, 49, 28, 16, 211, 11,
+ 254, 96, 49, 28, 16, 218, 145, 49, 28, 16, 234, 38, 254, 96, 49, 28, 16,
+ 247, 202, 254, 21, 49, 28, 16, 233, 238, 254, 21, 49, 28, 16, 233, 238,
+ 254, 149, 49, 28, 16, 233, 238, 229, 95, 49, 28, 16, 254, 62, 229, 95,
+ 49, 28, 16, 254, 64, 49, 28, 16, 247, 201, 49, 28, 16, 215, 210, 49, 28,
+ 16, 216, 224, 49, 28, 16, 234, 2, 49, 28, 16, 233, 32, 245, 134, 250, 71,
+ 49, 28, 16, 233, 32, 246, 42, 250, 72, 49, 28, 16, 233, 32, 215, 212,
+ 250, 72, 49, 28, 16, 233, 32, 216, 234, 250, 72, 49, 28, 16, 233, 32,
+ 236, 7, 250, 71, 49, 28, 16, 242, 159, 229, 96, 254, 96, 49, 28, 16, 242,
+ 159, 226, 1, 254, 10, 49, 28, 16, 242, 159, 226, 1, 248, 29, 49, 28, 16,
+ 247, 225, 49, 28, 16, 247, 226, 226, 1, 254, 11, 234, 196, 49, 28, 16,
+ 247, 226, 226, 1, 254, 11, 254, 96, 49, 28, 16, 247, 226, 226, 1, 248,
+ 29, 49, 28, 16, 215, 216, 49, 28, 16, 254, 15, 49, 28, 16, 236, 14, 49,
+ 28, 16, 247, 246, 49, 28, 16, 254, 211, 225, 0, 254, 16, 49, 28, 16, 254,
+ 211, 254, 13, 49, 28, 16, 254, 211, 254, 16, 49, 28, 16, 254, 211, 231,
+ 34, 49, 28, 16, 254, 211, 231, 45, 49, 28, 16, 254, 211, 242, 160, 49,
+ 28, 16, 254, 211, 242, 157, 49, 28, 16, 254, 211, 225, 0, 242, 160, 49,
+ 28, 16, 231, 151, 224, 165, 240, 107, 49, 28, 16, 231, 151, 254, 151,
+ 224, 165, 240, 107, 49, 28, 16, 231, 151, 248, 28, 240, 107, 49, 28, 16,
+ 231, 151, 254, 151, 248, 28, 240, 107, 49, 28, 16, 231, 151, 215, 205,
+ 240, 107, 49, 28, 16, 231, 151, 215, 217, 49, 28, 16, 231, 151, 216, 228,
+ 240, 107, 49, 28, 16, 231, 151, 216, 228, 233, 35, 240, 107, 49, 28, 16,
+ 231, 151, 233, 35, 240, 107, 49, 28, 16, 231, 151, 225, 39, 240, 107, 49,
+ 28, 16, 235, 169, 216, 251, 240, 108, 49, 28, 16, 254, 60, 216, 251, 240,
+ 108, 49, 28, 16, 244, 172, 216, 225, 49, 28, 16, 244, 172, 230, 143, 49,
+ 28, 16, 244, 172, 247, 230, 49, 28, 16, 231, 151, 214, 10, 240, 107, 49,
+ 28, 16, 231, 151, 224, 164, 240, 107, 49, 28, 16, 231, 151, 225, 39, 216,
+ 228, 240, 107, 49, 28, 16, 242, 155, 230, 26, 254, 63, 49, 28, 16, 242,
+ 155, 230, 26, 247, 200, 49, 28, 16, 245, 148, 234, 247, 243, 236, 213,
+ 124, 49, 28, 16, 236, 13, 49, 28, 16, 236, 11, 49, 28, 16, 243, 236, 254,
+ 22, 248, 27, 240, 106, 49, 28, 16, 243, 236, 247, 244, 190, 49, 28, 16,
+ 243, 236, 247, 244, 229, 203, 49, 28, 16, 243, 236, 229, 198, 240, 107,
+ 49, 28, 16, 243, 236, 247, 244, 248, 3, 49, 28, 16, 243, 236, 219, 102,
+ 247, 243, 248, 3, 49, 28, 16, 243, 236, 247, 244, 234, 182, 49, 28, 16,
+ 243, 236, 247, 244, 210, 23, 49, 28, 16, 243, 236, 247, 244, 228, 234,
+ 234, 196, 49, 28, 16, 243, 236, 247, 244, 228, 234, 254, 96, 49, 28, 16,
+ 243, 236, 231, 191, 250, 73, 247, 230, 49, 28, 16, 243, 236, 231, 191,
+ 250, 73, 230, 143, 49, 28, 16, 244, 122, 219, 102, 250, 73, 214, 9, 49,
+ 28, 16, 243, 236, 219, 102, 250, 73, 217, 179, 49, 28, 16, 243, 236, 229,
+ 97, 49, 28, 16, 250, 74, 209, 249, 49, 28, 16, 250, 74, 234, 36, 49, 28,
+ 16, 250, 74, 219, 9, 49, 28, 16, 243, 236, 240, 154, 211, 10, 216, 229,
+ 49, 28, 16, 243, 236, 245, 149, 254, 86, 49, 28, 16, 211, 10, 215, 206,
+ 49, 28, 16, 247, 238, 215, 206, 49, 28, 16, 247, 238, 216, 229, 49, 28,
+ 16, 247, 238, 254, 65, 246, 42, 247, 139, 49, 28, 16, 247, 238, 230, 141,
+ 216, 233, 247, 139, 49, 28, 16, 247, 238, 247, 222, 245, 36, 247, 139,
+ 49, 28, 16, 247, 238, 215, 214, 226, 211, 247, 139, 49, 28, 16, 211, 10,
+ 254, 65, 246, 42, 247, 139, 49, 28, 16, 211, 10, 230, 141, 216, 233, 247,
+ 139, 49, 28, 16, 211, 10, 247, 222, 245, 36, 247, 139, 49, 28, 16, 211,
+ 10, 215, 214, 226, 211, 247, 139, 49, 28, 16, 243, 49, 247, 237, 49, 28,
+ 16, 243, 49, 211, 9, 49, 28, 16, 247, 245, 254, 65, 230, 199, 49, 28, 16,
+ 247, 245, 254, 65, 231, 73, 49, 28, 16, 247, 245, 247, 201, 49, 28, 16,
+ 247, 245, 216, 182, 49, 28, 16, 219, 163, 216, 182, 49, 28, 16, 219, 163,
+ 216, 183, 247, 186, 49, 28, 16, 219, 163, 216, 183, 215, 207, 49, 28, 16,
+ 219, 163, 216, 183, 216, 222, 49, 28, 16, 219, 163, 253, 244, 49, 28, 16,
+ 219, 163, 253, 245, 247, 186, 49, 28, 16, 219, 163, 253, 245, 215, 207,
+ 49, 28, 16, 219, 163, 253, 245, 216, 222, 49, 28, 16, 247, 223, 243, 30,
+ 49, 28, 16, 247, 229, 226, 134, 49, 28, 16, 218, 137, 49, 28, 16, 254, 7,
+ 190, 49, 28, 16, 254, 7, 213, 124, 49, 28, 16, 254, 7, 243, 135, 49, 28,
+ 16, 254, 7, 248, 3, 49, 28, 16, 254, 7, 234, 182, 49, 28, 16, 254, 7,
+ 210, 23, 49, 28, 16, 254, 7, 228, 233, 49, 28, 16, 234, 162, 229, 96,
+ 231, 44, 49, 28, 16, 234, 163, 229, 96, 231, 44, 49, 28, 16, 234, 162,
+ 229, 96, 234, 196, 49, 28, 16, 234, 163, 229, 96, 234, 196, 49, 28, 16,
+ 234, 38, 234, 196, 49, 28, 16, 242, 159, 229, 96, 234, 196, 28, 16, 219,
+ 155, 252, 135, 28, 16, 52, 252, 135, 28, 16, 40, 252, 135, 28, 16, 223,
+ 50, 40, 252, 135, 28, 16, 248, 155, 252, 135, 28, 16, 219, 251, 252, 135,
+ 28, 16, 43, 223, 77, 50, 28, 16, 44, 223, 77, 50, 28, 16, 223, 77, 247,
+ 118, 28, 16, 248, 196, 221, 163, 28, 16, 248, 222, 250, 249, 28, 16, 221,
+ 163, 28, 16, 249, 234, 28, 16, 223, 75, 244, 111, 28, 16, 223, 75, 244,
+ 110, 28, 16, 223, 75, 244, 109, 28, 16, 244, 131, 28, 16, 244, 132, 51,
+ 28, 16, 251, 148, 78, 28, 16, 251, 24, 28, 16, 251, 159, 28, 16, 127, 28,
+ 16, 226, 193, 218, 163, 28, 16, 215, 57, 218, 163, 28, 16, 216, 142, 218,
+ 163, 28, 16, 244, 10, 218, 163, 28, 16, 244, 80, 218, 163, 28, 16, 219,
+ 124, 218, 163, 28, 16, 219, 122, 243, 250, 28, 16, 244, 8, 243, 250, 28,
+ 16, 243, 203, 250, 14, 28, 16, 243, 203, 250, 15, 226, 136, 254, 142, 28,
+ 16, 243, 203, 250, 15, 226, 136, 252, 122, 28, 16, 251, 67, 250, 14, 28,
+ 16, 245, 7, 250, 14, 28, 16, 245, 7, 250, 15, 226, 136, 254, 142, 28, 16,
+ 245, 7, 250, 15, 226, 136, 252, 122, 28, 16, 246, 83, 250, 13, 28, 16,
+ 246, 83, 250, 12, 28, 16, 230, 85, 231, 90, 223, 61, 28, 16, 52, 220, 75,
+ 28, 16, 52, 244, 65, 28, 16, 244, 66, 214, 163, 28, 16, 244, 66, 246,
+ 106, 28, 16, 229, 188, 214, 163, 28, 16, 229, 188, 246, 106, 28, 16, 220,
+ 76, 214, 163, 28, 16, 220, 76, 246, 106, 28, 16, 224, 22, 138, 220, 75,
+ 28, 16, 224, 22, 138, 244, 65, 28, 16, 249, 216, 216, 87, 28, 16, 249,
+ 85, 216, 87, 28, 16, 226, 136, 254, 142, 28, 16, 226, 136, 252, 122, 28,
+ 16, 224, 4, 254, 142, 28, 16, 224, 4, 252, 122, 28, 16, 230, 88, 223, 61,
+ 28, 16, 211, 251, 223, 61, 28, 16, 163, 223, 61, 28, 16, 224, 22, 223,
+ 61, 28, 16, 245, 189, 223, 61, 28, 16, 219, 118, 223, 61, 28, 16, 216,
+ 160, 223, 61, 28, 16, 219, 110, 223, 61, 28, 16, 123, 240, 211, 215, 71,
+ 223, 61, 28, 16, 211, 179, 228, 43, 28, 16, 96, 228, 43, 28, 16, 250, 36,
+ 211, 179, 228, 43, 28, 16, 42, 228, 44, 211, 253, 28, 16, 42, 228, 44,
+ 251, 221, 28, 16, 215, 226, 228, 44, 120, 211, 253, 28, 16, 215, 226,
+ 228, 44, 120, 251, 221, 28, 16, 215, 226, 228, 44, 43, 211, 253, 28, 16,
+ 215, 226, 228, 44, 43, 251, 221, 28, 16, 215, 226, 228, 44, 44, 211, 253,
+ 28, 16, 215, 226, 228, 44, 44, 251, 221, 28, 16, 215, 226, 228, 44, 124,
+ 211, 253, 28, 16, 215, 226, 228, 44, 124, 251, 221, 28, 16, 215, 226,
+ 228, 44, 120, 44, 211, 253, 28, 16, 215, 226, 228, 44, 120, 44, 251, 221,
+ 28, 16, 230, 129, 228, 44, 211, 253, 28, 16, 230, 129, 228, 44, 251, 221,
+ 28, 16, 215, 223, 228, 44, 124, 211, 253, 28, 16, 215, 223, 228, 44, 124,
+ 251, 221, 28, 16, 226, 4, 228, 43, 28, 16, 213, 132, 228, 43, 28, 16,
+ 228, 44, 251, 221, 28, 16, 227, 203, 228, 43, 28, 16, 249, 241, 228, 44,
+ 211, 253, 28, 16, 249, 241, 228, 44, 251, 221, 28, 16, 251, 146, 28, 16,
+ 211, 251, 228, 47, 28, 16, 163, 228, 47, 28, 16, 224, 22, 228, 47, 28,
+ 16, 245, 189, 228, 47, 28, 16, 219, 118, 228, 47, 28, 16, 216, 160, 228,
+ 47, 28, 16, 219, 110, 228, 47, 28, 16, 123, 240, 211, 215, 71, 228, 47,
+ 28, 16, 38, 218, 139, 28, 16, 38, 218, 240, 218, 139, 28, 16, 38, 215,
+ 234, 28, 16, 38, 215, 233, 28, 16, 38, 215, 232, 28, 16, 244, 101, 215,
+ 234, 28, 16, 244, 101, 215, 233, 28, 16, 244, 101, 215, 232, 28, 16, 38,
+ 253, 189, 247, 120, 28, 16, 38, 244, 72, 28, 16, 38, 244, 71, 28, 16, 38,
+ 244, 70, 28, 16, 38, 244, 69, 28, 16, 38, 244, 68, 28, 16, 252, 58, 252,
+ 74, 28, 16, 245, 143, 252, 74, 28, 16, 252, 58, 216, 111, 28, 16, 245,
+ 143, 216, 111, 28, 16, 252, 58, 219, 80, 28, 16, 245, 143, 219, 80, 28,
+ 16, 252, 58, 225, 115, 28, 16, 245, 143, 225, 115, 28, 16, 38, 255, 14,
+ 28, 16, 38, 218, 165, 28, 16, 38, 216, 238, 28, 16, 38, 218, 166, 28, 16,
+ 38, 231, 162, 28, 16, 38, 231, 161, 28, 16, 38, 255, 13, 28, 16, 38, 232,
+ 112, 28, 16, 253, 254, 214, 163, 28, 16, 253, 254, 246, 106, 28, 16, 38,
+ 247, 135, 28, 16, 38, 222, 231, 28, 16, 38, 244, 58, 28, 16, 38, 219, 76,
+ 28, 16, 38, 252, 38, 28, 16, 38, 52, 216, 19, 28, 16, 38, 215, 211, 216,
+ 19, 28, 16, 222, 235, 28, 16, 218, 75, 28, 16, 210, 159, 28, 16, 225,
+ 107, 28, 16, 231, 25, 28, 16, 244, 17, 28, 16, 249, 138, 28, 16, 248, 78,
+ 28, 16, 242, 150, 228, 48, 219, 95, 28, 16, 242, 150, 228, 48, 228, 75,
+ 219, 95, 28, 16, 216, 0, 28, 16, 215, 95, 28, 16, 235, 193, 215, 95, 28,
+ 16, 215, 96, 219, 95, 28, 16, 215, 96, 214, 163, 28, 16, 226, 148, 218,
+ 102, 28, 16, 226, 148, 218, 99, 28, 16, 226, 148, 218, 98, 28, 16, 226,
+ 148, 218, 97, 28, 16, 226, 148, 218, 96, 28, 16, 226, 148, 218, 95, 28,
+ 16, 226, 148, 218, 94, 28, 16, 226, 148, 218, 93, 28, 16, 226, 148, 218,
+ 92, 28, 16, 226, 148, 218, 101, 28, 16, 226, 148, 218, 100, 28, 16, 241,
+ 245, 28, 16, 229, 105, 28, 16, 245, 143, 64, 218, 133, 28, 16, 248, 71,
+ 219, 95, 28, 16, 38, 124, 251, 169, 28, 16, 38, 120, 251, 169, 28, 16,
+ 38, 242, 0, 28, 16, 38, 219, 67, 225, 43, 28, 16, 225, 216, 78, 28, 16,
+ 225, 216, 120, 78, 28, 16, 163, 225, 216, 78, 28, 16, 242, 182, 214, 163,
+ 28, 16, 242, 182, 246, 106, 28, 16, 2, 244, 100, 28, 16, 248, 180, 28,
+ 16, 248, 181, 254, 154, 28, 16, 231, 133, 28, 16, 232, 129, 28, 16, 251,
+ 143, 28, 16, 220, 154, 211, 253, 28, 16, 220, 154, 251, 221, 28, 16, 230,
+ 184, 28, 16, 230, 185, 251, 221, 28, 16, 220, 148, 211, 253, 28, 16, 220,
+ 148, 251, 221, 28, 16, 243, 220, 211, 253, 28, 16, 243, 220, 251, 221,
+ 28, 16, 232, 130, 225, 180, 223, 61, 28, 16, 232, 130, 236, 4, 223, 61,
+ 28, 16, 251, 144, 223, 61, 28, 16, 220, 154, 223, 61, 28, 16, 230, 185,
+ 223, 61, 28, 16, 220, 148, 223, 61, 28, 16, 216, 249, 225, 178, 249, 107,
+ 224, 174, 225, 179, 28, 16, 216, 249, 225, 178, 249, 107, 224, 174, 236,
+ 3, 28, 16, 216, 249, 225, 178, 249, 107, 224, 174, 225, 180, 247, 211,
+ 28, 16, 216, 249, 236, 2, 249, 107, 224, 174, 225, 179, 28, 16, 216, 249,
+ 236, 2, 249, 107, 224, 174, 236, 3, 28, 16, 216, 249, 236, 2, 249, 107,
+ 224, 174, 236, 4, 247, 211, 28, 16, 216, 249, 236, 2, 249, 107, 224, 174,
+ 236, 4, 247, 210, 28, 16, 216, 249, 236, 2, 249, 107, 224, 174, 236, 4,
+ 247, 209, 28, 16, 249, 133, 28, 16, 242, 126, 251, 67, 250, 14, 28, 16,
+ 242, 126, 245, 7, 250, 14, 28, 16, 42, 253, 158, 28, 16, 213, 151, 28,
+ 16, 225, 14, 28, 16, 250, 5, 28, 16, 221, 203, 28, 16, 250, 9, 28, 16,
+ 216, 7, 28, 16, 224, 242, 28, 16, 224, 243, 244, 60, 28, 16, 221, 204,
+ 244, 60, 28, 16, 216, 8, 223, 58, 28, 16, 225, 163, 218, 66, 26, 213,
+ 137, 187, 217, 229, 26, 213, 137, 187, 217, 218, 26, 213, 137, 187, 217,
+ 208, 26, 213, 137, 187, 217, 201, 26, 213, 137, 187, 217, 193, 26, 213,
+ 137, 187, 217, 187, 26, 213, 137, 187, 217, 186, 26, 213, 137, 187, 217,
+ 185, 26, 213, 137, 187, 217, 184, 26, 213, 137, 187, 217, 228, 26, 213,
+ 137, 187, 217, 227, 26, 213, 137, 187, 217, 226, 26, 213, 137, 187, 217,
+ 225, 26, 213, 137, 187, 217, 224, 26, 213, 137, 187, 217, 223, 26, 213,
+ 137, 187, 217, 222, 26, 213, 137, 187, 217, 221, 26, 213, 137, 187, 217,
+ 220, 26, 213, 137, 187, 217, 219, 26, 213, 137, 187, 217, 217, 26, 213,
+ 137, 187, 217, 216, 26, 213, 137, 187, 217, 215, 26, 213, 137, 187, 217,
+ 214, 26, 213, 137, 187, 217, 213, 26, 213, 137, 187, 217, 192, 26, 213,
+ 137, 187, 217, 191, 26, 213, 137, 187, 217, 190, 26, 213, 137, 187, 217,
+ 189, 26, 213, 137, 187, 217, 188, 26, 235, 214, 187, 217, 229, 26, 235,
+ 214, 187, 217, 218, 26, 235, 214, 187, 217, 201, 26, 235, 214, 187, 217,
+ 193, 26, 235, 214, 187, 217, 186, 26, 235, 214, 187, 217, 185, 26, 235,
+ 214, 187, 217, 227, 26, 235, 214, 187, 217, 226, 26, 235, 214, 187, 217,
+ 225, 26, 235, 214, 187, 217, 224, 26, 235, 214, 187, 217, 221, 26, 235,
+ 214, 187, 217, 220, 26, 235, 214, 187, 217, 219, 26, 235, 214, 187, 217,
+ 214, 26, 235, 214, 187, 217, 213, 26, 235, 214, 187, 217, 212, 26, 235,
+ 214, 187, 217, 211, 26, 235, 214, 187, 217, 210, 26, 235, 214, 187, 217,
+ 209, 26, 235, 214, 187, 217, 207, 26, 235, 214, 187, 217, 206, 26, 235,
+ 214, 187, 217, 205, 26, 235, 214, 187, 217, 204, 26, 235, 214, 187, 217,
+ 203, 26, 235, 214, 187, 217, 202, 26, 235, 214, 187, 217, 200, 26, 235,
+ 214, 187, 217, 199, 26, 235, 214, 187, 217, 198, 26, 235, 214, 187, 217,
+ 197, 26, 235, 214, 187, 217, 196, 26, 235, 214, 187, 217, 195, 26, 235,
+ 214, 187, 217, 194, 26, 235, 214, 187, 217, 192, 26, 235, 214, 187, 217,
+ 191, 26, 235, 214, 187, 217, 190, 26, 235, 214, 187, 217, 189, 26, 235,
+ 214, 187, 217, 188, 38, 26, 28, 215, 208, 38, 26, 28, 216, 223, 38, 26,
+ 28, 225, 188, 26, 28, 233, 31, 230, 142, 31, 245, 223, 247, 224, 31, 241,
+ 222, 245, 223, 247, 224, 31, 240, 214, 245, 223, 247, 224, 31, 245, 222,
+ 241, 223, 247, 224, 31, 245, 222, 240, 213, 247, 224, 31, 245, 223, 180,
+ 31, 250, 174, 180, 31, 243, 229, 250, 35, 180, 31, 230, 177, 180, 31,
+ 252, 130, 180, 31, 234, 179, 219, 79, 180, 31, 249, 179, 180, 31, 253,
+ 233, 180, 31, 226, 163, 180, 31, 251, 153, 226, 130, 180, 31, 248, 73,
+ 177, 247, 179, 180, 31, 247, 176, 180, 31, 210, 222, 180, 31, 235, 247,
+ 180, 31, 225, 197, 180, 31, 223, 127, 180, 31, 249, 189, 180, 31, 241,
+ 60, 252, 184, 180, 31, 212, 59, 180, 31, 244, 39, 180, 31, 254, 246, 180,
+ 31, 223, 89, 180, 31, 223, 65, 180, 31, 245, 221, 180, 31, 235, 53, 180,
+ 31, 249, 184, 180, 31, 245, 142, 180, 31, 246, 52, 180, 31, 250, 145,
+ 180, 31, 248, 82, 180, 31, 23, 223, 64, 180, 31, 226, 81, 180, 31, 233,
+ 34, 180, 31, 249, 254, 180, 31, 234, 77, 180, 31, 243, 86, 180, 31, 218,
+ 112, 180, 31, 224, 130, 180, 31, 243, 228, 180, 31, 223, 66, 180, 31,
+ 233, 71, 177, 230, 157, 180, 31, 223, 62, 180, 31, 242, 168, 216, 42,
+ 231, 76, 180, 31, 245, 144, 180, 31, 218, 124, 180, 31, 242, 128, 180,
+ 31, 245, 136, 180, 31, 225, 235, 180, 31, 222, 225, 180, 31, 244, 59,
+ 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 193, 180, 31, 231, 89, 180,
+ 31, 245, 61, 180, 31, 214, 172, 180, 31, 247, 212, 180, 31, 250, 0, 230,
+ 110, 180, 31, 242, 106, 180, 31, 243, 87, 235, 255, 180, 31, 231, 141,
+ 180, 31, 255, 10, 180, 31, 245, 157, 180, 31, 246, 109, 180, 31, 212, 42,
+ 180, 31, 219, 150, 180, 31, 235, 222, 180, 31, 248, 42, 180, 31, 248,
+ 160, 180, 31, 247, 208, 180, 31, 245, 29, 180, 31, 220, 115, 180, 31,
+ 218, 128, 180, 31, 242, 2, 180, 31, 249, 212, 180, 31, 249, 251, 180, 31,
+ 244, 177, 180, 31, 254, 212, 180, 31, 249, 211, 180, 31, 226, 197, 216,
+ 196, 213, 242, 180, 31, 247, 232, 180, 31, 233, 124, 180, 31, 244, 13,
+ 249, 149, 222, 202, 214, 174, 21, 110, 249, 149, 222, 202, 214, 174, 21,
+ 105, 249, 149, 222, 202, 214, 174, 21, 158, 249, 149, 222, 202, 214, 174,
+ 21, 161, 249, 149, 222, 202, 214, 174, 21, 189, 249, 149, 222, 202, 214,
+ 174, 21, 194, 249, 149, 222, 202, 214, 174, 21, 198, 249, 149, 222, 202,
+ 214, 174, 21, 195, 249, 149, 222, 202, 214, 174, 21, 200, 249, 149, 222,
+ 202, 216, 243, 21, 110, 249, 149, 222, 202, 216, 243, 21, 105, 249, 149,
+ 222, 202, 216, 243, 21, 158, 249, 149, 222, 202, 216, 243, 21, 161, 249,
+ 149, 222, 202, 216, 243, 21, 189, 249, 149, 222, 202, 216, 243, 21, 194,
+ 249, 149, 222, 202, 216, 243, 21, 198, 249, 149, 222, 202, 216, 243, 21,
+ 195, 249, 149, 222, 202, 216, 243, 21, 200, 11, 23, 6, 61, 11, 23, 6,
+ 253, 158, 11, 23, 6, 251, 66, 11, 23, 6, 249, 60, 11, 23, 6, 75, 11, 23,
+ 6, 245, 6, 11, 23, 6, 243, 202, 11, 23, 6, 242, 60, 11, 23, 6, 73, 11,
+ 23, 6, 235, 144, 11, 23, 6, 235, 23, 11, 23, 6, 156, 11, 23, 6, 193, 11,
+ 23, 6, 230, 25, 11, 23, 6, 76, 11, 23, 6, 226, 105, 11, 23, 6, 224, 96,
+ 11, 23, 6, 153, 11, 23, 6, 222, 91, 11, 23, 6, 217, 152, 11, 23, 6, 70,
+ 11, 23, 6, 214, 105, 11, 23, 6, 212, 98, 11, 23, 6, 211, 178, 11, 23, 6,
+ 211, 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 158, 11,
+ 23, 4, 251, 66, 11, 23, 4, 249, 60, 11, 23, 4, 75, 11, 23, 4, 245, 6, 11,
+ 23, 4, 243, 202, 11, 23, 4, 242, 60, 11, 23, 4, 73, 11, 23, 4, 235, 144,
+ 11, 23, 4, 235, 23, 11, 23, 4, 156, 11, 23, 4, 193, 11, 23, 4, 230, 25,
+ 11, 23, 4, 76, 11, 23, 4, 226, 105, 11, 23, 4, 224, 96, 11, 23, 4, 153,
+ 11, 23, 4, 222, 91, 11, 23, 4, 217, 152, 11, 23, 4, 70, 11, 23, 4, 214,
+ 105, 11, 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11,
+ 23, 4, 210, 159, 11, 32, 6, 61, 11, 32, 6, 253, 158, 11, 32, 6, 251, 66,
+ 11, 32, 6, 249, 60, 11, 32, 6, 75, 11, 32, 6, 245, 6, 11, 32, 6, 243,
+ 202, 11, 32, 6, 242, 60, 11, 32, 6, 73, 11, 32, 6, 235, 144, 11, 32, 6,
+ 235, 23, 11, 32, 6, 156, 11, 32, 6, 193, 11, 32, 6, 230, 25, 11, 32, 6,
+ 76, 11, 32, 6, 226, 105, 11, 32, 6, 224, 96, 11, 32, 6, 153, 11, 32, 6,
+ 222, 91, 11, 32, 6, 217, 152, 11, 32, 6, 70, 11, 32, 6, 214, 105, 11, 32,
+ 6, 212, 98, 11, 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210,
+ 159, 11, 32, 4, 61, 11, 32, 4, 253, 158, 11, 32, 4, 251, 66, 11, 32, 4,
+ 249, 60, 11, 32, 4, 75, 11, 32, 4, 245, 6, 11, 32, 4, 243, 202, 11, 32,
+ 4, 73, 11, 32, 4, 235, 144, 11, 32, 4, 235, 23, 11, 32, 4, 156, 11, 32,
+ 4, 193, 11, 32, 4, 230, 25, 11, 32, 4, 76, 11, 32, 4, 226, 105, 11, 32,
+ 4, 224, 96, 11, 32, 4, 153, 11, 32, 4, 222, 91, 11, 32, 4, 217, 152, 11,
+ 32, 4, 70, 11, 32, 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178,
+ 11, 32, 4, 211, 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32,
+ 6, 253, 158, 11, 23, 32, 6, 251, 66, 11, 23, 32, 6, 249, 60, 11, 23, 32,
+ 6, 75, 11, 23, 32, 6, 245, 6, 11, 23, 32, 6, 243, 202, 11, 23, 32, 6,
+ 242, 60, 11, 23, 32, 6, 73, 11, 23, 32, 6, 235, 144, 11, 23, 32, 6, 235,
+ 23, 11, 23, 32, 6, 156, 11, 23, 32, 6, 193, 11, 23, 32, 6, 230, 25, 11,
+ 23, 32, 6, 76, 11, 23, 32, 6, 226, 105, 11, 23, 32, 6, 224, 96, 11, 23,
+ 32, 6, 153, 11, 23, 32, 6, 222, 91, 11, 23, 32, 6, 217, 152, 11, 23, 32,
+ 6, 70, 11, 23, 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6,
+ 211, 178, 11, 23, 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32,
+ 4, 61, 11, 23, 32, 4, 253, 158, 11, 23, 32, 4, 251, 66, 11, 23, 32, 4,
+ 249, 60, 11, 23, 32, 4, 75, 11, 23, 32, 4, 245, 6, 11, 23, 32, 4, 243,
+ 202, 11, 23, 32, 4, 242, 60, 11, 23, 32, 4, 73, 11, 23, 32, 4, 235, 144,
+ 11, 23, 32, 4, 235, 23, 11, 23, 32, 4, 156, 11, 23, 32, 4, 193, 11, 23,
+ 32, 4, 230, 25, 11, 23, 32, 4, 76, 11, 23, 32, 4, 226, 105, 11, 23, 32,
+ 4, 224, 96, 11, 23, 32, 4, 153, 11, 23, 32, 4, 222, 91, 11, 23, 32, 4,
+ 217, 152, 11, 23, 32, 4, 70, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212,
+ 98, 11, 23, 32, 4, 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210,
+ 159, 11, 119, 6, 61, 11, 119, 6, 251, 66, 11, 119, 6, 249, 60, 11, 119,
+ 6, 243, 202, 11, 119, 6, 235, 144, 11, 119, 6, 235, 23, 11, 119, 6, 230,
+ 25, 11, 119, 6, 76, 11, 119, 6, 226, 105, 11, 119, 6, 224, 96, 11, 119,
+ 6, 222, 91, 11, 119, 6, 217, 152, 11, 119, 6, 70, 11, 119, 6, 214, 105,
+ 11, 119, 6, 212, 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119,
+ 6, 210, 159, 11, 119, 4, 61, 11, 119, 4, 253, 158, 11, 119, 4, 251, 66,
+ 11, 119, 4, 249, 60, 11, 119, 4, 245, 6, 11, 119, 4, 242, 60, 11, 119, 4,
+ 73, 11, 119, 4, 235, 144, 11, 119, 4, 235, 23, 11, 119, 4, 156, 11, 119,
+ 4, 193, 11, 119, 4, 230, 25, 11, 119, 4, 226, 105, 11, 119, 4, 224, 96,
+ 11, 119, 4, 153, 11, 119, 4, 222, 91, 11, 119, 4, 217, 152, 11, 119, 4,
+ 70, 11, 119, 4, 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11,
+ 119, 4, 211, 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119,
+ 6, 253, 158, 11, 23, 119, 6, 251, 66, 11, 23, 119, 6, 249, 60, 11, 23,
+ 119, 6, 75, 11, 23, 119, 6, 245, 6, 11, 23, 119, 6, 243, 202, 11, 23,
+ 119, 6, 242, 60, 11, 23, 119, 6, 73, 11, 23, 119, 6, 235, 144, 11, 23,
+ 119, 6, 235, 23, 11, 23, 119, 6, 156, 11, 23, 119, 6, 193, 11, 23, 119,
+ 6, 230, 25, 11, 23, 119, 6, 76, 11, 23, 119, 6, 226, 105, 11, 23, 119, 6,
+ 224, 96, 11, 23, 119, 6, 153, 11, 23, 119, 6, 222, 91, 11, 23, 119, 6,
+ 217, 152, 11, 23, 119, 6, 70, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6,
+ 212, 98, 11, 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119,
+ 6, 210, 159, 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 158, 11, 23, 119,
+ 4, 251, 66, 11, 23, 119, 4, 249, 60, 11, 23, 119, 4, 75, 11, 23, 119, 4,
+ 245, 6, 11, 23, 119, 4, 243, 202, 11, 23, 119, 4, 242, 60, 11, 23, 119,
+ 4, 73, 11, 23, 119, 4, 235, 144, 11, 23, 119, 4, 235, 23, 11, 23, 119, 4,
+ 156, 11, 23, 119, 4, 193, 11, 23, 119, 4, 230, 25, 11, 23, 119, 4, 76,
+ 11, 23, 119, 4, 226, 105, 11, 23, 119, 4, 224, 96, 11, 23, 119, 4, 153,
+ 11, 23, 119, 4, 222, 91, 11, 23, 119, 4, 217, 152, 11, 23, 119, 4, 70,
+ 11, 23, 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211,
+ 178, 11, 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61,
+ 11, 133, 6, 253, 158, 11, 133, 6, 249, 60, 11, 133, 6, 75, 11, 133, 6,
+ 245, 6, 11, 133, 6, 243, 202, 11, 133, 6, 235, 144, 11, 133, 6, 235, 23,
+ 11, 133, 6, 156, 11, 133, 6, 193, 11, 133, 6, 230, 25, 11, 133, 6, 76,
+ 11, 133, 6, 226, 105, 11, 133, 6, 224, 96, 11, 133, 6, 222, 91, 11, 133,
+ 6, 217, 152, 11, 133, 6, 70, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98,
+ 11, 133, 6, 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4,
+ 253, 158, 11, 133, 4, 251, 66, 11, 133, 4, 249, 60, 11, 133, 4, 75, 11,
+ 133, 4, 245, 6, 11, 133, 4, 243, 202, 11, 133, 4, 242, 60, 11, 133, 4,
+ 73, 11, 133, 4, 235, 144, 11, 133, 4, 235, 23, 11, 133, 4, 156, 11, 133,
+ 4, 193, 11, 133, 4, 230, 25, 11, 133, 4, 76, 11, 133, 4, 226, 105, 11,
+ 133, 4, 224, 96, 11, 133, 4, 153, 11, 133, 4, 222, 91, 11, 133, 4, 217,
+ 152, 11, 133, 4, 70, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133,
+ 4, 211, 178, 11, 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61,
+ 11, 139, 6, 253, 158, 11, 139, 6, 249, 60, 11, 139, 6, 75, 11, 139, 6,
+ 245, 6, 11, 139, 6, 243, 202, 11, 139, 6, 73, 11, 139, 6, 235, 144, 11,
+ 139, 6, 235, 23, 11, 139, 6, 156, 11, 139, 6, 193, 11, 139, 6, 76, 11,
+ 139, 6, 222, 91, 11, 139, 6, 217, 152, 11, 139, 6, 70, 11, 139, 6, 214,
+ 105, 11, 139, 6, 212, 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11,
+ 139, 4, 61, 11, 139, 4, 253, 158, 11, 139, 4, 251, 66, 11, 139, 4, 249,
+ 60, 11, 139, 4, 75, 11, 139, 4, 245, 6, 11, 139, 4, 243, 202, 11, 139, 4,
+ 242, 60, 11, 139, 4, 73, 11, 139, 4, 235, 144, 11, 139, 4, 235, 23, 11,
+ 139, 4, 156, 11, 139, 4, 193, 11, 139, 4, 230, 25, 11, 139, 4, 76, 11,
+ 139, 4, 226, 105, 11, 139, 4, 224, 96, 11, 139, 4, 153, 11, 139, 4, 222,
+ 91, 11, 139, 4, 217, 152, 11, 139, 4, 70, 11, 139, 4, 214, 105, 11, 139,
+ 4, 212, 98, 11, 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, 210,
+ 159, 11, 23, 133, 6, 61, 11, 23, 133, 6, 253, 158, 11, 23, 133, 6, 251,
+ 66, 11, 23, 133, 6, 249, 60, 11, 23, 133, 6, 75, 11, 23, 133, 6, 245, 6,
+ 11, 23, 133, 6, 243, 202, 11, 23, 133, 6, 242, 60, 11, 23, 133, 6, 73,
+ 11, 23, 133, 6, 235, 144, 11, 23, 133, 6, 235, 23, 11, 23, 133, 6, 156,
+ 11, 23, 133, 6, 193, 11, 23, 133, 6, 230, 25, 11, 23, 133, 6, 76, 11, 23,
+ 133, 6, 226, 105, 11, 23, 133, 6, 224, 96, 11, 23, 133, 6, 153, 11, 23,
+ 133, 6, 222, 91, 11, 23, 133, 6, 217, 152, 11, 23, 133, 6, 70, 11, 23,
+ 133, 6, 214, 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, 178, 11,
+ 23, 133, 6, 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, 61, 11,
+ 23, 133, 4, 253, 158, 11, 23, 133, 4, 251, 66, 11, 23, 133, 4, 249, 60,
+ 11, 23, 133, 4, 75, 11, 23, 133, 4, 245, 6, 11, 23, 133, 4, 243, 202, 11,
+ 23, 133, 4, 242, 60, 11, 23, 133, 4, 73, 11, 23, 133, 4, 235, 144, 11,
+ 23, 133, 4, 235, 23, 11, 23, 133, 4, 156, 11, 23, 133, 4, 193, 11, 23,
+ 133, 4, 230, 25, 11, 23, 133, 4, 76, 11, 23, 133, 4, 226, 105, 11, 23,
+ 133, 4, 224, 96, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, 91, 11, 23,
+ 133, 4, 217, 152, 11, 23, 133, 4, 70, 11, 23, 133, 4, 214, 105, 11, 23,
+ 133, 4, 212, 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, 211, 117, 11,
+ 23, 133, 4, 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 158, 11, 35, 6, 251,
+ 66, 11, 35, 6, 249, 60, 11, 35, 6, 75, 11, 35, 6, 245, 6, 11, 35, 6, 243,
+ 202, 11, 35, 6, 242, 60, 11, 35, 6, 73, 11, 35, 6, 235, 144, 11, 35, 6,
+ 235, 23, 11, 35, 6, 156, 11, 35, 6, 193, 11, 35, 6, 230, 25, 11, 35, 6,
+ 76, 11, 35, 6, 226, 105, 11, 35, 6, 224, 96, 11, 35, 6, 153, 11, 35, 6,
+ 222, 91, 11, 35, 6, 217, 152, 11, 35, 6, 70, 11, 35, 6, 214, 105, 11, 35,
+ 6, 212, 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, 117, 11, 35, 6, 210,
+ 159, 11, 35, 4, 61, 11, 35, 4, 253, 158, 11, 35, 4, 251, 66, 11, 35, 4,
+ 249, 60, 11, 35, 4, 75, 11, 35, 4, 245, 6, 11, 35, 4, 243, 202, 11, 35,
+ 4, 242, 60, 11, 35, 4, 73, 11, 35, 4, 235, 144, 11, 35, 4, 235, 23, 11,
+ 35, 4, 156, 11, 35, 4, 193, 11, 35, 4, 230, 25, 11, 35, 4, 76, 11, 35, 4,
+ 226, 105, 11, 35, 4, 224, 96, 11, 35, 4, 153, 11, 35, 4, 222, 91, 11, 35,
+ 4, 217, 152, 11, 35, 4, 70, 11, 35, 4, 214, 105, 11, 35, 4, 212, 98, 11,
+ 35, 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, 210, 159, 11, 35, 23, 6,
+ 61, 11, 35, 23, 6, 253, 158, 11, 35, 23, 6, 251, 66, 11, 35, 23, 6, 249,
+ 60, 11, 35, 23, 6, 75, 11, 35, 23, 6, 245, 6, 11, 35, 23, 6, 243, 202,
+ 11, 35, 23, 6, 242, 60, 11, 35, 23, 6, 73, 11, 35, 23, 6, 235, 144, 11,
+ 35, 23, 6, 235, 23, 11, 35, 23, 6, 156, 11, 35, 23, 6, 193, 11, 35, 23,
+ 6, 230, 25, 11, 35, 23, 6, 76, 11, 35, 23, 6, 226, 105, 11, 35, 23, 6,
+ 224, 96, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, 91, 11, 35, 23, 6, 217,
+ 152, 11, 35, 23, 6, 70, 11, 35, 23, 6, 214, 105, 11, 35, 23, 6, 212, 98,
+ 11, 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, 11, 35, 23, 6, 210,
+ 159, 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 158, 11, 35, 23, 4, 251, 66,
+ 11, 35, 23, 4, 249, 60, 11, 35, 23, 4, 75, 11, 35, 23, 4, 245, 6, 11, 35,
+ 23, 4, 243, 202, 11, 35, 23, 4, 242, 60, 11, 35, 23, 4, 73, 11, 35, 23,
+ 4, 235, 144, 11, 35, 23, 4, 235, 23, 11, 35, 23, 4, 156, 11, 35, 23, 4,
+ 193, 11, 35, 23, 4, 230, 25, 11, 35, 23, 4, 76, 11, 35, 23, 4, 226, 105,
+ 11, 35, 23, 4, 224, 96, 11, 35, 23, 4, 153, 11, 35, 23, 4, 222, 91, 11,
+ 35, 23, 4, 217, 152, 11, 35, 23, 4, 70, 11, 35, 23, 4, 214, 105, 11, 35,
+ 23, 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, 23, 4, 211, 117, 11, 35,
+ 23, 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, 6, 253, 158, 11, 35, 32,
+ 6, 251, 66, 11, 35, 32, 6, 249, 60, 11, 35, 32, 6, 75, 11, 35, 32, 6,
+ 245, 6, 11, 35, 32, 6, 243, 202, 11, 35, 32, 6, 242, 60, 11, 35, 32, 6,
+ 73, 11, 35, 32, 6, 235, 144, 11, 35, 32, 6, 235, 23, 11, 35, 32, 6, 156,
+ 11, 35, 32, 6, 193, 11, 35, 32, 6, 230, 25, 11, 35, 32, 6, 76, 11, 35,
+ 32, 6, 226, 105, 11, 35, 32, 6, 224, 96, 11, 35, 32, 6, 153, 11, 35, 32,
+ 6, 222, 91, 11, 35, 32, 6, 217, 152, 11, 35, 32, 6, 70, 11, 35, 32, 6,
+ 214, 105, 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, 211, 178, 11, 35, 32, 6,
+ 211, 117, 11, 35, 32, 6, 210, 159, 11, 35, 32, 4, 61, 11, 35, 32, 4, 253,
+ 158, 11, 35, 32, 4, 251, 66, 11, 35, 32, 4, 249, 60, 11, 35, 32, 4, 75,
+ 11, 35, 32, 4, 245, 6, 11, 35, 32, 4, 243, 202, 11, 35, 32, 4, 242, 60,
+ 11, 35, 32, 4, 73, 11, 35, 32, 4, 235, 144, 11, 35, 32, 4, 235, 23, 11,
+ 35, 32, 4, 156, 11, 35, 32, 4, 193, 11, 35, 32, 4, 230, 25, 11, 35, 32,
+ 4, 76, 11, 35, 32, 4, 226, 105, 11, 35, 32, 4, 224, 96, 11, 35, 32, 4,
+ 153, 11, 35, 32, 4, 222, 91, 11, 35, 32, 4, 217, 152, 11, 35, 32, 4, 70,
+ 11, 35, 32, 4, 214, 105, 11, 35, 32, 4, 212, 98, 11, 35, 32, 4, 211, 178,
+ 11, 35, 32, 4, 211, 117, 11, 35, 32, 4, 210, 159, 11, 35, 23, 32, 6, 61,
+ 11, 35, 23, 32, 6, 253, 158, 11, 35, 23, 32, 6, 251, 66, 11, 35, 23, 32,
+ 6, 249, 60, 11, 35, 23, 32, 6, 75, 11, 35, 23, 32, 6, 245, 6, 11, 35, 23,
+ 32, 6, 243, 202, 11, 35, 23, 32, 6, 242, 60, 11, 35, 23, 32, 6, 73, 11,
+ 35, 23, 32, 6, 235, 144, 11, 35, 23, 32, 6, 235, 23, 11, 35, 23, 32, 6,
+ 156, 11, 35, 23, 32, 6, 193, 11, 35, 23, 32, 6, 230, 25, 11, 35, 23, 32,
+ 6, 76, 11, 35, 23, 32, 6, 226, 105, 11, 35, 23, 32, 6, 224, 96, 11, 35,
+ 23, 32, 6, 153, 11, 35, 23, 32, 6, 222, 91, 11, 35, 23, 32, 6, 217, 152,
+ 11, 35, 23, 32, 6, 70, 11, 35, 23, 32, 6, 214, 105, 11, 35, 23, 32, 6,
+ 212, 98, 11, 35, 23, 32, 6, 211, 178, 11, 35, 23, 32, 6, 211, 117, 11,
+ 35, 23, 32, 6, 210, 159, 11, 35, 23, 32, 4, 61, 11, 35, 23, 32, 4, 253,
+ 158, 11, 35, 23, 32, 4, 251, 66, 11, 35, 23, 32, 4, 249, 60, 11, 35, 23,
+ 32, 4, 75, 11, 35, 23, 32, 4, 245, 6, 11, 35, 23, 32, 4, 243, 202, 11,
+ 35, 23, 32, 4, 242, 60, 11, 35, 23, 32, 4, 73, 11, 35, 23, 32, 4, 235,
+ 144, 11, 35, 23, 32, 4, 235, 23, 11, 35, 23, 32, 4, 156, 11, 35, 23, 32,
+ 4, 193, 11, 35, 23, 32, 4, 230, 25, 11, 35, 23, 32, 4, 76, 11, 35, 23,
+ 32, 4, 226, 105, 11, 35, 23, 32, 4, 224, 96, 11, 35, 23, 32, 4, 153, 11,
+ 35, 23, 32, 4, 222, 91, 11, 35, 23, 32, 4, 217, 152, 11, 35, 23, 32, 4,
+ 70, 11, 35, 23, 32, 4, 214, 105, 11, 35, 23, 32, 4, 212, 98, 11, 35, 23,
+ 32, 4, 211, 178, 11, 35, 23, 32, 4, 211, 117, 11, 35, 23, 32, 4, 210,
+ 159, 11, 230, 138, 6, 61, 11, 230, 138, 6, 253, 158, 11, 230, 138, 6,
+ 251, 66, 11, 230, 138, 6, 249, 60, 11, 230, 138, 6, 75, 11, 230, 138, 6,
+ 245, 6, 11, 230, 138, 6, 243, 202, 11, 230, 138, 6, 242, 60, 11, 230,
+ 138, 6, 73, 11, 230, 138, 6, 235, 144, 11, 230, 138, 6, 235, 23, 11, 230,
+ 138, 6, 156, 11, 230, 138, 6, 193, 11, 230, 138, 6, 230, 25, 11, 230,
+ 138, 6, 76, 11, 230, 138, 6, 226, 105, 11, 230, 138, 6, 224, 96, 11, 230,
+ 138, 6, 153, 11, 230, 138, 6, 222, 91, 11, 230, 138, 6, 217, 152, 11,
+ 230, 138, 6, 70, 11, 230, 138, 6, 214, 105, 11, 230, 138, 6, 212, 98, 11,
+ 230, 138, 6, 211, 178, 11, 230, 138, 6, 211, 117, 11, 230, 138, 6, 210,
+ 159, 11, 230, 138, 4, 61, 11, 230, 138, 4, 253, 158, 11, 230, 138, 4,
+ 251, 66, 11, 230, 138, 4, 249, 60, 11, 230, 138, 4, 75, 11, 230, 138, 4,
+ 245, 6, 11, 230, 138, 4, 243, 202, 11, 230, 138, 4, 242, 60, 11, 230,
+ 138, 4, 73, 11, 230, 138, 4, 235, 144, 11, 230, 138, 4, 235, 23, 11, 230,
+ 138, 4, 156, 11, 230, 138, 4, 193, 11, 230, 138, 4, 230, 25, 11, 230,
+ 138, 4, 76, 11, 230, 138, 4, 226, 105, 11, 230, 138, 4, 224, 96, 11, 230,
+ 138, 4, 153, 11, 230, 138, 4, 222, 91, 11, 230, 138, 4, 217, 152, 11,
+ 230, 138, 4, 70, 11, 230, 138, 4, 214, 105, 11, 230, 138, 4, 212, 98, 11,
+ 230, 138, 4, 211, 178, 11, 230, 138, 4, 211, 117, 11, 230, 138, 4, 210,
+ 159, 11, 32, 4, 247, 119, 73, 11, 32, 4, 247, 119, 235, 144, 11, 23, 6,
+ 254, 143, 11, 23, 6, 252, 26, 11, 23, 6, 243, 107, 11, 23, 6, 248, 54,
+ 11, 23, 6, 245, 100, 11, 23, 6, 210, 85, 11, 23, 6, 245, 63, 11, 23, 6,
+ 216, 179, 11, 23, 6, 235, 185, 11, 23, 6, 234, 222, 11, 23, 6, 233, 98,
+ 11, 23, 6, 230, 102, 11, 23, 6, 227, 237, 11, 23, 6, 211, 157, 11, 23, 6,
+ 226, 199, 11, 23, 6, 225, 108, 11, 23, 6, 223, 37, 11, 23, 6, 216, 180,
+ 87, 11, 23, 6, 219, 177, 11, 23, 6, 217, 41, 11, 23, 6, 214, 157, 11, 23,
+ 6, 225, 133, 11, 23, 6, 250, 110, 11, 23, 6, 224, 161, 11, 23, 6, 226,
+ 201, 11, 23, 229, 221, 11, 23, 4, 254, 143, 11, 23, 4, 252, 26, 11, 23,
+ 4, 243, 107, 11, 23, 4, 248, 54, 11, 23, 4, 245, 100, 11, 23, 4, 210, 85,
+ 11, 23, 4, 245, 63, 11, 23, 4, 216, 179, 11, 23, 4, 235, 185, 11, 23, 4,
+ 234, 222, 11, 23, 4, 233, 98, 11, 23, 4, 230, 102, 11, 23, 4, 227, 237,
+ 11, 23, 4, 211, 157, 11, 23, 4, 226, 199, 11, 23, 4, 225, 108, 11, 23, 4,
+ 223, 37, 11, 23, 4, 40, 219, 177, 11, 23, 4, 219, 177, 11, 23, 4, 217,
+ 41, 11, 23, 4, 214, 157, 11, 23, 4, 225, 133, 11, 23, 4, 250, 110, 11,
+ 23, 4, 224, 161, 11, 23, 4, 226, 201, 11, 23, 225, 253, 247, 233, 11, 23,
+ 245, 101, 87, 11, 23, 216, 180, 87, 11, 23, 234, 223, 87, 11, 23, 225,
+ 134, 87, 11, 23, 223, 38, 87, 11, 23, 225, 109, 87, 11, 32, 6, 254, 143,
+ 11, 32, 6, 252, 26, 11, 32, 6, 243, 107, 11, 32, 6, 248, 54, 11, 32, 6,
+ 245, 100, 11, 32, 6, 210, 85, 11, 32, 6, 245, 63, 11, 32, 6, 216, 179,
+ 11, 32, 6, 235, 185, 11, 32, 6, 234, 222, 11, 32, 6, 233, 98, 11, 32, 6,
+ 230, 102, 11, 32, 6, 227, 237, 11, 32, 6, 211, 157, 11, 32, 6, 226, 199,
+ 11, 32, 6, 225, 108, 11, 32, 6, 223, 37, 11, 32, 6, 216, 180, 87, 11, 32,
+ 6, 219, 177, 11, 32, 6, 217, 41, 11, 32, 6, 214, 157, 11, 32, 6, 225,
+ 133, 11, 32, 6, 250, 110, 11, 32, 6, 224, 161, 11, 32, 6, 226, 201, 11,
+ 32, 229, 221, 11, 32, 4, 254, 143, 11, 32, 4, 252, 26, 11, 32, 4, 243,
+ 107, 11, 32, 4, 248, 54, 11, 32, 4, 245, 100, 11, 32, 4, 210, 85, 11, 32,
+ 4, 245, 63, 11, 32, 4, 216, 179, 11, 32, 4, 235, 185, 11, 32, 4, 234,
+ 222, 11, 32, 4, 233, 98, 11, 32, 4, 230, 102, 11, 32, 4, 227, 237, 11,
+ 32, 4, 211, 157, 11, 32, 4, 226, 199, 11, 32, 4, 225, 108, 11, 32, 4,
+ 223, 37, 11, 32, 4, 40, 219, 177, 11, 32, 4, 219, 177, 11, 32, 4, 217,
+ 41, 11, 32, 4, 214, 157, 11, 32, 4, 225, 133, 11, 32, 4, 250, 110, 11,
+ 32, 4, 224, 161, 11, 32, 4, 226, 201, 11, 32, 225, 253, 247, 233, 11, 32,
+ 245, 101, 87, 11, 32, 216, 180, 87, 11, 32, 234, 223, 87, 11, 32, 225,
+ 134, 87, 11, 32, 223, 38, 87, 11, 32, 225, 109, 87, 11, 23, 32, 6, 254,
+ 143, 11, 23, 32, 6, 252, 26, 11, 23, 32, 6, 243, 107, 11, 23, 32, 6, 248,
+ 54, 11, 23, 32, 6, 245, 100, 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, 245,
+ 63, 11, 23, 32, 6, 216, 179, 11, 23, 32, 6, 235, 185, 11, 23, 32, 6, 234,
+ 222, 11, 23, 32, 6, 233, 98, 11, 23, 32, 6, 230, 102, 11, 23, 32, 6, 227,
+ 237, 11, 23, 32, 6, 211, 157, 11, 23, 32, 6, 226, 199, 11, 23, 32, 6,
+ 225, 108, 11, 23, 32, 6, 223, 37, 11, 23, 32, 6, 216, 180, 87, 11, 23,
+ 32, 6, 219, 177, 11, 23, 32, 6, 217, 41, 11, 23, 32, 6, 214, 157, 11, 23,
+ 32, 6, 225, 133, 11, 23, 32, 6, 250, 110, 11, 23, 32, 6, 224, 161, 11,
+ 23, 32, 6, 226, 201, 11, 23, 32, 229, 221, 11, 23, 32, 4, 254, 143, 11,
+ 23, 32, 4, 252, 26, 11, 23, 32, 4, 243, 107, 11, 23, 32, 4, 248, 54, 11,
+ 23, 32, 4, 245, 100, 11, 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 63, 11,
+ 23, 32, 4, 216, 179, 11, 23, 32, 4, 235, 185, 11, 23, 32, 4, 234, 222,
+ 11, 23, 32, 4, 233, 98, 11, 23, 32, 4, 230, 102, 11, 23, 32, 4, 227, 237,
+ 11, 23, 32, 4, 211, 157, 11, 23, 32, 4, 226, 199, 11, 23, 32, 4, 225,
+ 108, 11, 23, 32, 4, 223, 37, 11, 23, 32, 4, 40, 219, 177, 11, 23, 32, 4,
+ 219, 177, 11, 23, 32, 4, 217, 41, 11, 23, 32, 4, 214, 157, 11, 23, 32, 4,
+ 225, 133, 11, 23, 32, 4, 250, 110, 11, 23, 32, 4, 224, 161, 11, 23, 32,
+ 4, 226, 201, 11, 23, 32, 225, 253, 247, 233, 11, 23, 32, 245, 101, 87,
+ 11, 23, 32, 216, 180, 87, 11, 23, 32, 234, 223, 87, 11, 23, 32, 225, 134,
+ 87, 11, 23, 32, 223, 38, 87, 11, 23, 32, 225, 109, 87, 11, 35, 23, 6,
+ 254, 143, 11, 35, 23, 6, 252, 26, 11, 35, 23, 6, 243, 107, 11, 35, 23, 6,
+ 248, 54, 11, 35, 23, 6, 245, 100, 11, 35, 23, 6, 210, 85, 11, 35, 23, 6,
+ 245, 63, 11, 35, 23, 6, 216, 179, 11, 35, 23, 6, 235, 185, 11, 35, 23, 6,
+ 234, 222, 11, 35, 23, 6, 233, 98, 11, 35, 23, 6, 230, 102, 11, 35, 23, 6,
+ 227, 237, 11, 35, 23, 6, 211, 157, 11, 35, 23, 6, 226, 199, 11, 35, 23,
+ 6, 225, 108, 11, 35, 23, 6, 223, 37, 11, 35, 23, 6, 216, 180, 87, 11, 35,
+ 23, 6, 219, 177, 11, 35, 23, 6, 217, 41, 11, 35, 23, 6, 214, 157, 11, 35,
+ 23, 6, 225, 133, 11, 35, 23, 6, 250, 110, 11, 35, 23, 6, 224, 161, 11,
+ 35, 23, 6, 226, 201, 11, 35, 23, 229, 221, 11, 35, 23, 4, 254, 143, 11,
+ 35, 23, 4, 252, 26, 11, 35, 23, 4, 243, 107, 11, 35, 23, 4, 248, 54, 11,
+ 35, 23, 4, 245, 100, 11, 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, 63, 11,
+ 35, 23, 4, 216, 179, 11, 35, 23, 4, 235, 185, 11, 35, 23, 4, 234, 222,
+ 11, 35, 23, 4, 233, 98, 11, 35, 23, 4, 230, 102, 11, 35, 23, 4, 227, 237,
+ 11, 35, 23, 4, 211, 157, 11, 35, 23, 4, 226, 199, 11, 35, 23, 4, 225,
+ 108, 11, 35, 23, 4, 223, 37, 11, 35, 23, 4, 40, 219, 177, 11, 35, 23, 4,
+ 219, 177, 11, 35, 23, 4, 217, 41, 11, 35, 23, 4, 214, 157, 11, 35, 23, 4,
+ 225, 133, 11, 35, 23, 4, 250, 110, 11, 35, 23, 4, 224, 161, 11, 35, 23,
+ 4, 226, 201, 11, 35, 23, 225, 253, 247, 233, 11, 35, 23, 245, 101, 87,
+ 11, 35, 23, 216, 180, 87, 11, 35, 23, 234, 223, 87, 11, 35, 23, 225, 134,
+ 87, 11, 35, 23, 223, 38, 87, 11, 35, 23, 225, 109, 87, 11, 35, 23, 32, 6,
+ 254, 143, 11, 35, 23, 32, 6, 252, 26, 11, 35, 23, 32, 6, 243, 107, 11,
+ 35, 23, 32, 6, 248, 54, 11, 35, 23, 32, 6, 245, 100, 11, 35, 23, 32, 6,
+ 210, 85, 11, 35, 23, 32, 6, 245, 63, 11, 35, 23, 32, 6, 216, 179, 11, 35,
+ 23, 32, 6, 235, 185, 11, 35, 23, 32, 6, 234, 222, 11, 35, 23, 32, 6, 233,
+ 98, 11, 35, 23, 32, 6, 230, 102, 11, 35, 23, 32, 6, 227, 237, 11, 35, 23,
+ 32, 6, 211, 157, 11, 35, 23, 32, 6, 226, 199, 11, 35, 23, 32, 6, 225,
+ 108, 11, 35, 23, 32, 6, 223, 37, 11, 35, 23, 32, 6, 216, 180, 87, 11, 35,
+ 23, 32, 6, 219, 177, 11, 35, 23, 32, 6, 217, 41, 11, 35, 23, 32, 6, 214,
+ 157, 11, 35, 23, 32, 6, 225, 133, 11, 35, 23, 32, 6, 250, 110, 11, 35,
+ 23, 32, 6, 224, 161, 11, 35, 23, 32, 6, 226, 201, 11, 35, 23, 32, 229,
+ 221, 11, 35, 23, 32, 4, 254, 143, 11, 35, 23, 32, 4, 252, 26, 11, 35, 23,
+ 32, 4, 243, 107, 11, 35, 23, 32, 4, 248, 54, 11, 35, 23, 32, 4, 245, 100,
+ 11, 35, 23, 32, 4, 210, 85, 11, 35, 23, 32, 4, 245, 63, 11, 35, 23, 32,
+ 4, 216, 179, 11, 35, 23, 32, 4, 235, 185, 11, 35, 23, 32, 4, 234, 222,
+ 11, 35, 23, 32, 4, 233, 98, 11, 35, 23, 32, 4, 230, 102, 11, 35, 23, 32,
+ 4, 227, 237, 11, 35, 23, 32, 4, 211, 157, 11, 35, 23, 32, 4, 226, 199,
+ 11, 35, 23, 32, 4, 225, 108, 11, 35, 23, 32, 4, 223, 37, 11, 35, 23, 32,
+ 4, 40, 219, 177, 11, 35, 23, 32, 4, 219, 177, 11, 35, 23, 32, 4, 217, 41,
+ 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32, 4, 225, 133, 11, 35, 23, 32,
+ 4, 250, 110, 11, 35, 23, 32, 4, 224, 161, 11, 35, 23, 32, 4, 226, 201,
+ 11, 35, 23, 32, 225, 253, 247, 233, 11, 35, 23, 32, 245, 101, 87, 11, 35,
+ 23, 32, 216, 180, 87, 11, 35, 23, 32, 234, 223, 87, 11, 35, 23, 32, 225,
+ 134, 87, 11, 35, 23, 32, 223, 38, 87, 11, 35, 23, 32, 225, 109, 87, 11,
+ 23, 6, 247, 227, 11, 23, 4, 247, 227, 11, 23, 21, 210, 86, 11, 23, 21,
+ 110, 11, 23, 21, 105, 11, 23, 21, 158, 11, 23, 21, 161, 11, 23, 21, 189,
+ 11, 23, 21, 194, 11, 23, 21, 198, 11, 23, 21, 195, 11, 23, 21, 200, 11,
+ 139, 21, 210, 86, 11, 139, 21, 110, 11, 139, 21, 105, 11, 139, 21, 158,
+ 11, 139, 21, 161, 11, 139, 21, 189, 11, 139, 21, 194, 11, 139, 21, 198,
+ 11, 139, 21, 195, 11, 139, 21, 200, 11, 35, 21, 210, 86, 11, 35, 21, 110,
+ 11, 35, 21, 105, 11, 35, 21, 158, 11, 35, 21, 161, 11, 35, 21, 189, 11,
+ 35, 21, 194, 11, 35, 21, 198, 11, 35, 21, 195, 11, 35, 21, 200, 11, 35,
+ 23, 21, 210, 86, 11, 35, 23, 21, 110, 11, 35, 23, 21, 105, 11, 35, 23,
+ 21, 158, 11, 35, 23, 21, 161, 11, 35, 23, 21, 189, 11, 35, 23, 21, 194,
+ 11, 35, 23, 21, 198, 11, 35, 23, 21, 195, 11, 35, 23, 21, 200, 11, 230,
+ 138, 21, 210, 86, 11, 230, 138, 21, 110, 11, 230, 138, 21, 105, 11, 230,
+ 138, 21, 158, 11, 230, 138, 21, 161, 11, 230, 138, 21, 189, 11, 230, 138,
+ 21, 194, 11, 230, 138, 21, 198, 11, 230, 138, 21, 195, 11, 230, 138, 21,
+ 200, 10, 11, 254, 170, 10, 11, 252, 54, 10, 11, 235, 123, 10, 11, 248,
+ 195, 10, 11, 212, 30, 10, 11, 210, 108, 10, 11, 242, 37, 10, 11, 217, 80,
+ 10, 11, 211, 43, 10, 11, 234, 250, 10, 11, 233, 102, 10, 11, 231, 78, 10,
+ 11, 228, 62, 10, 11, 221, 166, 10, 11, 254, 196, 10, 11, 244, 142, 10,
+ 11, 222, 26, 10, 11, 224, 81, 10, 11, 223, 95, 10, 11, 220, 59, 10, 11,
+ 217, 7, 10, 11, 216, 192, 10, 11, 234, 129, 10, 11, 216, 202, 10, 11,
+ 248, 216, 10, 11, 210, 111, 10, 11, 242, 244, 10, 11, 247, 119, 252, 54,
+ 10, 11, 247, 119, 228, 62, 10, 11, 247, 119, 244, 142, 10, 11, 247, 119,
+ 224, 81, 10, 11, 65, 252, 54, 10, 11, 65, 235, 123, 10, 11, 65, 241, 218,
+ 10, 11, 65, 242, 37, 10, 11, 65, 211, 43, 10, 11, 65, 234, 250, 10, 11,
+ 65, 233, 102, 10, 11, 65, 231, 78, 10, 11, 65, 228, 62, 10, 11, 65, 221,
+ 166, 10, 11, 65, 254, 196, 10, 11, 65, 244, 142, 10, 11, 65, 222, 26, 10,
+ 11, 65, 224, 81, 10, 11, 65, 220, 59, 10, 11, 65, 217, 7, 10, 11, 65,
+ 216, 192, 10, 11, 65, 234, 129, 10, 11, 65, 248, 216, 10, 11, 65, 242,
+ 244, 10, 11, 217, 76, 235, 123, 10, 11, 217, 76, 242, 37, 10, 11, 217,
+ 76, 211, 43, 10, 11, 217, 76, 233, 102, 10, 11, 217, 76, 228, 62, 10, 11,
+ 217, 76, 221, 166, 10, 11, 217, 76, 254, 196, 10, 11, 217, 76, 222, 26,
+ 10, 11, 217, 76, 224, 81, 10, 11, 217, 76, 220, 59, 10, 11, 217, 76, 234,
+ 129, 10, 11, 217, 76, 248, 216, 10, 11, 217, 76, 242, 244, 10, 11, 217,
+ 76, 247, 119, 228, 62, 10, 11, 217, 76, 247, 119, 224, 81, 10, 11, 218,
+ 110, 252, 54, 10, 11, 218, 110, 235, 123, 10, 11, 218, 110, 241, 218, 10,
+ 11, 218, 110, 242, 37, 10, 11, 218, 110, 217, 80, 10, 11, 218, 110, 211,
+ 43, 10, 11, 218, 110, 234, 250, 10, 11, 218, 110, 231, 78, 10, 11, 218,
+ 110, 228, 62, 10, 11, 218, 110, 221, 166, 10, 11, 218, 110, 254, 196, 10,
+ 11, 218, 110, 244, 142, 10, 11, 218, 110, 222, 26, 10, 11, 218, 110, 224,
+ 81, 10, 11, 218, 110, 220, 59, 10, 11, 218, 110, 217, 7, 10, 11, 218,
+ 110, 216, 192, 10, 11, 218, 110, 234, 129, 10, 11, 218, 110, 248, 216,
+ 10, 11, 218, 110, 210, 111, 10, 11, 218, 110, 242, 244, 10, 11, 218, 110,
+ 247, 119, 252, 54, 10, 11, 218, 110, 247, 119, 244, 142, 10, 11, 232,
+ 122, 254, 170, 10, 11, 232, 122, 252, 54, 10, 11, 232, 122, 235, 123, 10,
+ 11, 232, 122, 248, 195, 10, 11, 232, 122, 241, 218, 10, 11, 232, 122,
+ 212, 30, 10, 11, 232, 122, 210, 108, 10, 11, 232, 122, 242, 37, 10, 11,
+ 232, 122, 217, 80, 10, 11, 232, 122, 211, 43, 10, 11, 232, 122, 233, 102,
+ 10, 11, 232, 122, 231, 78, 10, 11, 232, 122, 228, 62, 10, 11, 232, 122,
+ 221, 166, 10, 11, 232, 122, 254, 196, 10, 11, 232, 122, 244, 142, 10, 11,
+ 232, 122, 222, 26, 10, 11, 232, 122, 224, 81, 10, 11, 232, 122, 223, 95,
+ 10, 11, 232, 122, 220, 59, 10, 11, 232, 122, 217, 7, 10, 11, 232, 122,
+ 216, 192, 10, 11, 232, 122, 234, 129, 10, 11, 232, 122, 216, 202, 10, 11,
+ 232, 122, 248, 216, 10, 11, 232, 122, 210, 111, 10, 11, 232, 122, 242,
+ 244, 10, 11, 139, 252, 54, 10, 11, 139, 235, 123, 10, 11, 139, 248, 195,
+ 10, 11, 139, 212, 30, 10, 11, 139, 210, 108, 10, 11, 139, 242, 37, 10,
+ 11, 139, 217, 80, 10, 11, 139, 211, 43, 10, 11, 139, 233, 102, 10, 11,
+ 139, 231, 78, 10, 11, 139, 228, 62, 10, 11, 139, 221, 166, 10, 11, 139,
+ 254, 196, 10, 11, 139, 244, 142, 10, 11, 139, 222, 26, 10, 11, 139, 224,
+ 81, 10, 11, 139, 223, 95, 10, 11, 139, 220, 59, 10, 11, 139, 217, 7, 10,
+ 11, 139, 216, 192, 10, 11, 139, 234, 129, 10, 11, 139, 216, 202, 10, 11,
+ 139, 248, 216, 10, 11, 139, 210, 111, 10, 11, 139, 242, 244, 10, 11, 226,
+ 168, 66, 2, 122, 2, 217, 43, 10, 11, 226, 168, 122, 2, 248, 195, 231,
+ 205, 86, 245, 220, 211, 239, 231, 205, 86, 219, 28, 211, 239, 231, 205,
+ 86, 212, 9, 211, 239, 231, 205, 86, 228, 56, 211, 239, 231, 205, 86, 223,
+ 111, 246, 96, 231, 205, 86, 242, 127, 246, 96, 231, 205, 86, 71, 246, 96,
+ 231, 205, 86, 123, 64, 250, 141, 231, 205, 86, 113, 64, 250, 141, 231,
+ 205, 86, 134, 64, 250, 141, 231, 205, 86, 244, 11, 64, 250, 141, 231,
+ 205, 86, 244, 81, 64, 250, 141, 231, 205, 86, 219, 125, 64, 250, 141,
+ 231, 205, 86, 220, 122, 64, 250, 141, 231, 205, 86, 245, 193, 64, 250,
+ 141, 231, 205, 86, 228, 200, 64, 250, 141, 231, 205, 86, 123, 64, 252,
+ 153, 231, 205, 86, 113, 64, 252, 153, 231, 205, 86, 134, 64, 252, 153,
+ 231, 205, 86, 244, 11, 64, 252, 153, 231, 205, 86, 244, 81, 64, 252, 153,
+ 231, 205, 86, 219, 125, 64, 252, 153, 231, 205, 86, 220, 122, 64, 252,
+ 153, 231, 205, 86, 245, 193, 64, 252, 153, 231, 205, 86, 228, 200, 64,
+ 252, 153, 231, 205, 86, 123, 64, 250, 34, 231, 205, 86, 113, 64, 250, 34,
+ 231, 205, 86, 134, 64, 250, 34, 231, 205, 86, 244, 11, 64, 250, 34, 231,
+ 205, 86, 244, 81, 64, 250, 34, 231, 205, 86, 219, 125, 64, 250, 34, 231,
+ 205, 86, 220, 122, 64, 250, 34, 231, 205, 86, 245, 193, 64, 250, 34, 231,
+ 205, 86, 228, 200, 64, 250, 34, 231, 205, 86, 225, 25, 231, 205, 86, 226,
+ 156, 231, 205, 86, 252, 154, 231, 205, 86, 250, 70, 231, 205, 86, 218,
+ 239, 231, 205, 86, 218, 39, 231, 205, 86, 253, 179, 231, 205, 86, 211,
+ 232, 231, 205, 86, 235, 62, 231, 205, 86, 252, 184, 131, 86, 203, 252,
+ 184, 131, 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, 131, 86, 241,
+ 40, 131, 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, 131, 86, 241,
+ 36, 131, 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, 131, 86, 241,
+ 32, 131, 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, 131, 86, 241,
+ 28, 131, 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, 131, 86, 241,
+ 24, 131, 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, 131, 86, 241,
+ 20, 131, 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, 131, 86, 241,
+ 16, 131, 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, 131, 86, 241,
+ 12, 131, 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, 131, 86, 241, 8,
+ 131, 86, 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, 86, 241, 4, 131,
+ 86, 241, 3, 131, 86, 241, 2, 131, 86, 241, 1, 131, 86, 241, 0, 131, 86,
+ 240, 255, 131, 86, 240, 254, 131, 86, 240, 253, 131, 86, 240, 252, 131,
+ 86, 240, 251, 131, 86, 67, 252, 184, 131, 86, 213, 238, 131, 86, 213,
+ 237, 131, 86, 213, 236, 131, 86, 213, 235, 131, 86, 213, 234, 131, 86,
+ 213, 233, 131, 86, 213, 232, 131, 86, 213, 231, 131, 86, 213, 230, 131,
+ 86, 213, 229, 131, 86, 213, 228, 131, 86, 213, 227, 131, 86, 213, 226,
+ 131, 86, 213, 225, 131, 86, 213, 224, 131, 86, 213, 223, 131, 86, 213,
+ 222, 131, 86, 213, 221, 131, 86, 213, 220, 131, 86, 213, 219, 131, 86,
+ 213, 218, 131, 86, 213, 217, 131, 86, 213, 216, 131, 86, 213, 215, 131,
+ 86, 213, 214, 131, 86, 213, 213, 131, 86, 213, 212, 131, 86, 213, 211,
+ 131, 86, 213, 210, 131, 86, 213, 209, 131, 86, 213, 208, 131, 86, 213,
+ 207, 131, 86, 213, 206, 131, 86, 213, 205, 131, 86, 213, 204, 131, 86,
+ 213, 203, 131, 86, 213, 202, 131, 86, 213, 201, 131, 86, 213, 200, 131,
+ 86, 213, 199, 131, 86, 213, 198, 131, 86, 213, 197, 131, 86, 213, 196,
+ 131, 86, 213, 195, 131, 86, 213, 194, 131, 86, 213, 193, 131, 86, 213,
+ 192, 131, 86, 213, 191, 131, 86, 213, 190, 225, 33, 250, 243, 252, 184,
+ 225, 33, 250, 243, 255, 9, 64, 219, 15, 225, 33, 250, 243, 113, 64, 219,
+ 15, 225, 33, 250, 243, 134, 64, 219, 15, 225, 33, 250, 243, 244, 11, 64,
+ 219, 15, 225, 33, 250, 243, 244, 81, 64, 219, 15, 225, 33, 250, 243, 219,
+ 125, 64, 219, 15, 225, 33, 250, 243, 220, 122, 64, 219, 15, 225, 33, 250,
+ 243, 245, 193, 64, 219, 15, 225, 33, 250, 243, 228, 200, 64, 219, 15,
+ 225, 33, 250, 243, 216, 248, 64, 219, 15, 225, 33, 250, 243, 235, 139,
+ 64, 219, 15, 225, 33, 250, 243, 234, 31, 64, 219, 15, 225, 33, 250, 243,
+ 224, 15, 64, 219, 15, 225, 33, 250, 243, 234, 79, 64, 219, 15, 225, 33,
+ 250, 243, 255, 9, 64, 241, 225, 225, 33, 250, 243, 113, 64, 241, 225,
+ 225, 33, 250, 243, 134, 64, 241, 225, 225, 33, 250, 243, 244, 11, 64,
+ 241, 225, 225, 33, 250, 243, 244, 81, 64, 241, 225, 225, 33, 250, 243,
+ 219, 125, 64, 241, 225, 225, 33, 250, 243, 220, 122, 64, 241, 225, 225,
+ 33, 250, 243, 245, 193, 64, 241, 225, 225, 33, 250, 243, 228, 200, 64,
+ 241, 225, 225, 33, 250, 243, 216, 248, 64, 241, 225, 225, 33, 250, 243,
+ 235, 139, 64, 241, 225, 225, 33, 250, 243, 234, 31, 64, 241, 225, 225,
+ 33, 250, 243, 224, 15, 64, 241, 225, 225, 33, 250, 243, 234, 79, 64, 241,
+ 225, 225, 33, 250, 243, 255, 9, 64, 247, 247, 225, 33, 250, 243, 113, 64,
+ 247, 247, 225, 33, 250, 243, 134, 64, 247, 247, 225, 33, 250, 243, 244,
+ 11, 64, 247, 247, 225, 33, 250, 243, 244, 81, 64, 247, 247, 225, 33, 250,
+ 243, 219, 125, 64, 247, 247, 225, 33, 250, 243, 220, 122, 64, 247, 247,
+ 225, 33, 250, 243, 245, 193, 64, 247, 247, 225, 33, 250, 243, 228, 200,
+ 64, 247, 247, 225, 33, 250, 243, 216, 248, 64, 247, 247, 225, 33, 250,
+ 243, 235, 139, 64, 247, 247, 225, 33, 250, 243, 234, 31, 64, 247, 247,
+ 225, 33, 250, 243, 224, 15, 64, 247, 247, 225, 33, 250, 243, 234, 79, 64,
+ 247, 247, 225, 33, 250, 243, 85, 235, 62, 225, 33, 250, 243, 255, 9, 64,
+ 249, 242, 225, 33, 250, 243, 113, 64, 249, 242, 225, 33, 250, 243, 134,
+ 64, 249, 242, 225, 33, 250, 243, 244, 11, 64, 249, 242, 225, 33, 250,
+ 243, 244, 81, 64, 249, 242, 225, 33, 250, 243, 219, 125, 64, 249, 242,
+ 225, 33, 250, 243, 220, 122, 64, 249, 242, 225, 33, 250, 243, 245, 193,
+ 64, 249, 242, 225, 33, 250, 243, 228, 200, 64, 249, 242, 225, 33, 250,
+ 243, 216, 248, 64, 249, 242, 225, 33, 250, 243, 235, 139, 64, 249, 242,
+ 225, 33, 250, 243, 234, 31, 64, 249, 242, 225, 33, 250, 243, 224, 15, 64,
+ 249, 242, 225, 33, 250, 243, 234, 79, 64, 249, 242, 225, 33, 250, 243,
+ 71, 235, 62, 21, 210, 87, 243, 229, 218, 129, 21, 210, 87, 249, 219, 21,
+ 123, 249, 219, 21, 113, 249, 219, 21, 134, 249, 219, 21, 244, 11, 249,
+ 219, 21, 244, 81, 249, 219, 21, 219, 125, 249, 219, 21, 220, 122, 249,
+ 219, 21, 245, 193, 249, 219, 21, 228, 200, 249, 219, 88, 7, 6, 1, 61, 88,
+ 7, 6, 1, 253, 158, 88, 7, 6, 1, 251, 66, 88, 7, 6, 1, 249, 60, 88, 7, 6,
+ 1, 75, 88, 7, 6, 1, 245, 6, 88, 7, 6, 1, 243, 202, 88, 7, 6, 1, 242, 60,
+ 88, 7, 6, 1, 73, 88, 7, 6, 1, 235, 144, 88, 7, 6, 1, 235, 23, 88, 7, 6,
+ 1, 156, 88, 7, 6, 1, 193, 88, 7, 6, 1, 230, 25, 88, 7, 6, 1, 76, 88, 7,
+ 6, 1, 226, 105, 88, 7, 6, 1, 224, 96, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222,
+ 91, 88, 7, 6, 1, 217, 152, 88, 7, 6, 1, 70, 88, 7, 6, 1, 214, 105, 88, 7,
+ 6, 1, 212, 98, 88, 7, 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1,
+ 210, 159, 216, 6, 220, 53, 251, 157, 7, 6, 1, 222, 91, 37, 32, 7, 6, 1,
+ 251, 66, 37, 32, 7, 6, 1, 153, 37, 250, 191, 37, 211, 180, 92, 7, 6, 1,
+ 61, 92, 7, 6, 1, 253, 158, 92, 7, 6, 1, 251, 66, 92, 7, 6, 1, 249, 60,
+ 92, 7, 6, 1, 75, 92, 7, 6, 1, 245, 6, 92, 7, 6, 1, 243, 202, 92, 7, 6, 1,
+ 242, 60, 92, 7, 6, 1, 73, 92, 7, 6, 1, 235, 144, 92, 7, 6, 1, 235, 23,
+ 92, 7, 6, 1, 156, 92, 7, 6, 1, 193, 92, 7, 6, 1, 230, 25, 92, 7, 6, 1,
+ 76, 92, 7, 6, 1, 226, 105, 92, 7, 6, 1, 224, 96, 92, 7, 6, 1, 153, 92, 7,
+ 6, 1, 222, 91, 92, 7, 6, 1, 217, 152, 92, 7, 6, 1, 70, 92, 7, 6, 1, 214,
+ 105, 92, 7, 6, 1, 212, 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117,
+ 92, 7, 6, 1, 210, 159, 92, 240, 201, 92, 230, 49, 92, 221, 183, 92, 218,
+ 226, 92, 224, 218, 92, 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1,
+ 253, 158, 152, 37, 7, 6, 1, 251, 66, 152, 37, 7, 6, 1, 249, 60, 152, 37,
+ 7, 6, 1, 75, 152, 37, 7, 6, 1, 245, 6, 152, 37, 7, 6, 1, 243, 202, 152,
+ 37, 7, 6, 1, 242, 60, 152, 37, 7, 6, 1, 73, 152, 37, 7, 6, 1, 235, 144,
+ 152, 37, 7, 6, 1, 235, 23, 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 193,
+ 152, 37, 7, 6, 1, 230, 25, 152, 37, 7, 6, 1, 76, 152, 37, 7, 6, 1, 226,
+ 105, 152, 37, 7, 6, 1, 224, 96, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1,
+ 222, 91, 152, 37, 7, 6, 1, 217, 152, 152, 37, 7, 6, 1, 70, 152, 37, 7, 6,
+ 1, 214, 105, 152, 37, 7, 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152,
+ 37, 7, 6, 1, 211, 117, 152, 37, 7, 6, 1, 210, 159, 223, 157, 231, 97, 50,
+ 223, 157, 231, 94, 50, 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 158,
+ 152, 92, 7, 6, 1, 251, 66, 152, 92, 7, 6, 1, 249, 60, 152, 92, 7, 6, 1,
+ 75, 152, 92, 7, 6, 1, 245, 6, 152, 92, 7, 6, 1, 243, 202, 152, 92, 7, 6,
+ 1, 242, 60, 152, 92, 7, 6, 1, 73, 152, 92, 7, 6, 1, 235, 144, 152, 92, 7,
+ 6, 1, 235, 23, 152, 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 193, 152, 92, 7,
+ 6, 1, 230, 25, 152, 92, 7, 6, 1, 76, 152, 92, 7, 6, 1, 226, 105, 152, 92,
+ 7, 6, 1, 224, 96, 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 91, 152,
+ 92, 7, 6, 1, 217, 152, 152, 92, 7, 6, 1, 70, 152, 92, 7, 6, 1, 214, 105,
+ 152, 92, 7, 6, 1, 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1,
+ 211, 117, 152, 92, 7, 6, 1, 210, 159, 249, 128, 152, 92, 7, 6, 1, 226,
+ 105, 152, 92, 240, 113, 152, 92, 190, 152, 92, 206, 152, 92, 255, 25,
+ 152, 92, 212, 23, 42, 247, 164, 92, 250, 23, 92, 249, 170, 92, 243, 252,
+ 92, 240, 105, 92, 229, 86, 92, 229, 79, 92, 226, 214, 92, 219, 35, 92,
+ 120, 2, 245, 31, 78, 92, 213, 119, 223, 103, 235, 239, 16, 1, 61, 223,
+ 103, 235, 239, 16, 1, 253, 158, 223, 103, 235, 239, 16, 1, 251, 66, 223,
+ 103, 235, 239, 16, 1, 249, 60, 223, 103, 235, 239, 16, 1, 75, 223, 103,
+ 235, 239, 16, 1, 245, 6, 223, 103, 235, 239, 16, 1, 243, 202, 223, 103,
+ 235, 239, 16, 1, 242, 60, 223, 103, 235, 239, 16, 1, 73, 223, 103, 235,
+ 239, 16, 1, 235, 144, 223, 103, 235, 239, 16, 1, 235, 23, 223, 103, 235,
+ 239, 16, 1, 156, 223, 103, 235, 239, 16, 1, 193, 223, 103, 235, 239, 16,
+ 1, 230, 25, 223, 103, 235, 239, 16, 1, 76, 223, 103, 235, 239, 16, 1,
+ 226, 105, 223, 103, 235, 239, 16, 1, 224, 96, 223, 103, 235, 239, 16, 1,
+ 153, 223, 103, 235, 239, 16, 1, 222, 91, 223, 103, 235, 239, 16, 1, 217,
+ 152, 223, 103, 235, 239, 16, 1, 70, 223, 103, 235, 239, 16, 1, 214, 105,
+ 223, 103, 235, 239, 16, 1, 212, 98, 223, 103, 235, 239, 16, 1, 211, 178,
+ 223, 103, 235, 239, 16, 1, 211, 117, 223, 103, 235, 239, 16, 1, 210, 159,
+ 42, 141, 241, 63, 92, 56, 234, 18, 92, 56, 206, 92, 9, 214, 177, 238, 50,
+ 92, 9, 214, 177, 238, 54, 92, 9, 214, 177, 238, 62, 92, 56, 248, 90, 92,
+ 9, 214, 177, 238, 69, 92, 9, 214, 177, 238, 56, 92, 9, 214, 177, 238, 28,
+ 92, 9, 214, 177, 238, 55, 92, 9, 214, 177, 238, 68, 92, 9, 214, 177, 238,
+ 42, 92, 9, 214, 177, 238, 35, 92, 9, 214, 177, 238, 44, 92, 9, 214, 177,
+ 238, 65, 92, 9, 214, 177, 238, 51, 92, 9, 214, 177, 238, 67, 92, 9, 214,
+ 177, 238, 43, 92, 9, 214, 177, 238, 66, 92, 9, 214, 177, 238, 29, 92, 9,
+ 214, 177, 238, 34, 92, 9, 214, 177, 238, 27, 92, 9, 214, 177, 238, 57,
+ 92, 9, 214, 177, 238, 59, 92, 9, 214, 177, 238, 37, 92, 9, 214, 177, 238,
+ 48, 92, 9, 214, 177, 238, 46, 92, 9, 214, 177, 238, 72, 92, 9, 214, 177,
+ 238, 71, 92, 9, 214, 177, 238, 25, 92, 9, 214, 177, 238, 52, 92, 9, 214,
+ 177, 238, 70, 92, 9, 214, 177, 238, 61, 92, 9, 214, 177, 238, 47, 92, 9,
+ 214, 177, 238, 26, 92, 9, 214, 177, 238, 49, 92, 9, 214, 177, 238, 31,
+ 92, 9, 214, 177, 238, 30, 92, 9, 214, 177, 238, 60, 92, 9, 214, 177, 238,
+ 38, 92, 9, 214, 177, 238, 40, 92, 9, 214, 177, 238, 41, 92, 9, 214, 177,
+ 238, 33, 92, 9, 214, 177, 238, 64, 92, 9, 214, 177, 238, 58, 216, 6, 220,
+ 53, 251, 157, 9, 214, 177, 238, 39, 216, 6, 220, 53, 251, 157, 9, 214,
+ 177, 238, 71, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 69, 216, 6,
+ 220, 53, 251, 157, 9, 214, 177, 238, 53, 216, 6, 220, 53, 251, 157, 9,
+ 214, 177, 238, 36, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 49, 216,
+ 6, 220, 53, 251, 157, 9, 214, 177, 238, 32, 216, 6, 220, 53, 251, 157, 9,
+ 214, 177, 238, 63, 216, 6, 220, 53, 251, 157, 9, 214, 177, 238, 45, 37,
+ 154, 254, 245, 37, 154, 255, 12, 249, 71, 244, 42, 250, 0, 214, 194, 228,
+ 213, 2, 218, 153, 218, 33, 117, 230, 114, 218, 32, 250, 26, 253, 207,
+ 246, 54, 218, 31, 117, 251, 118, 223, 158, 251, 140, 253, 207, 228, 212,
+ 212, 41, 212, 35, 213, 131, 230, 195, 212, 25, 245, 224, 242, 181, 245,
+ 45, 245, 224, 242, 181, 254, 128, 245, 224, 242, 181, 253, 225, 242, 181,
+ 2, 231, 51, 166, 230, 129, 87, 212, 27, 249, 137, 230, 129, 87, 244, 92,
+ 224, 22, 230, 129, 87, 212, 27, 242, 210, 230, 129, 87, 243, 229, 230,
+ 129, 87, 212, 52, 242, 210, 230, 129, 87, 233, 80, 224, 22, 230, 129, 87,
+ 212, 52, 249, 137, 230, 129, 87, 249, 137, 230, 128, 166, 230, 129, 2,
+ 244, 190, 244, 92, 224, 22, 230, 129, 2, 244, 190, 233, 80, 224, 22, 230,
+ 129, 2, 244, 190, 243, 229, 230, 129, 2, 244, 190, 218, 38, 2, 244, 190,
+ 242, 179, 218, 156, 219, 255, 218, 156, 250, 116, 221, 168, 245, 39, 215,
+ 235, 248, 84, 215, 235, 226, 59, 215, 235, 251, 27, 215, 109, 250, 118,
+ 251, 210, 222, 191, 241, 179, 218, 36, 251, 210, 245, 228, 64, 231, 194,
+ 245, 228, 64, 223, 31, 241, 204, 244, 11, 233, 54, 249, 246, 231, 170,
+ 233, 53, 244, 176, 233, 53, 233, 54, 244, 47, 236, 0, 211, 239, 230, 58,
+ 216, 34, 253, 191, 242, 143, 231, 67, 212, 39, 217, 57, 233, 26, 252,
+ 149, 225, 62, 223, 111, 254, 54, 242, 127, 254, 54, 225, 217, 225, 218,
+ 250, 119, 218, 114, 242, 23, 219, 90, 64, 225, 44, 231, 87, 226, 197,
+ 251, 194, 224, 229, 233, 36, 223, 32, 249, 142, 223, 32, 252, 159, 249,
+ 173, 223, 31, 249, 95, 22, 223, 31, 218, 141, 251, 167, 219, 14, 251,
+ 151, 243, 251, 243, 247, 222, 207, 217, 246, 224, 231, 248, 175, 226,
+ 236, 218, 7, 243, 248, 219, 230, 244, 91, 251, 21, 2, 217, 239, 248, 35,
+ 219, 52, 240, 112, 249, 141, 220, 70, 240, 111, 240, 112, 249, 141, 246,
+ 108, 249, 172, 250, 84, 130, 250, 254, 232, 141, 249, 88, 241, 55, 224,
+ 233, 219, 240, 252, 36, 251, 163, 224, 234, 64, 244, 33, 249, 171, 244,
+ 24, 22, 234, 32, 217, 19, 211, 230, 242, 13, 222, 12, 251, 177, 22, 249,
+ 102, 211, 237, 242, 184, 249, 235, 242, 184, 215, 193, 246, 90, 252, 62,
+ 230, 93, 250, 7, 252, 62, 230, 92, 252, 187, 251, 176, 223, 33, 211, 201,
+ 224, 195, 251, 235, 251, 20, 235, 138, 250, 77, 215, 235, 244, 162, 250,
+ 76, 244, 94, 244, 95, 219, 12, 252, 158, 225, 250, 224, 244, 249, 204,
+ 252, 159, 217, 59, 215, 235, 249, 128, 244, 67, 225, 63, 248, 81, 235,
+ 131, 247, 131, 250, 232, 218, 113, 211, 240, 250, 98, 230, 129, 213, 164,
+ 250, 162, 221, 199, 221, 224, 242, 148, 250, 251, 250, 233, 240, 245,
+ 244, 130, 212, 0, 222, 200, 249, 236, 244, 86, 225, 2, 22, 244, 90, 230,
+ 227, 230, 108, 251, 10, 250, 39, 241, 232, 253, 241, 226, 62, 216, 14,
+ 241, 251, 250, 29, 216, 242, 216, 113, 250, 20, 251, 202, 225, 177, 253,
+ 240, 213, 172, 243, 110, 247, 197, 241, 156, 219, 84, 231, 234, 251, 245,
+ 243, 111, 247, 240, 251, 166, 244, 52, 225, 33, 250, 241, 28, 228, 47,
+ 230, 85, 28, 228, 42, 221, 212, 242, 99, 28, 234, 137, 215, 190, 213,
+ 154, 28, 221, 192, 222, 124, 220, 11, 2, 221, 227, 216, 244, 223, 178,
+ 22, 252, 159, 219, 105, 22, 219, 105, 251, 187, 252, 123, 22, 241, 49,
+ 250, 120, 244, 73, 219, 63, 222, 125, 218, 12, 215, 194, 240, 246, 223,
+ 179, 254, 129, 244, 31, 222, 136, 244, 31, 217, 241, 240, 235, 251, 119,
+ 240, 235, 2, 243, 94, 226, 229, 251, 119, 235, 131, 224, 239, 226, 228,
+ 245, 44, 224, 239, 226, 228, 240, 244, 252, 145, 253, 181, 216, 252, 231,
+ 234, 240, 240, 232, 111, 240, 240, 249, 176, 218, 125, 221, 198, 248, 43,
+ 218, 125, 244, 180, 235, 149, 233, 89, 235, 131, 250, 226, 245, 44, 250,
+ 226, 223, 141, 230, 112, 226, 114, 212, 41, 251, 123, 249, 145, 216, 106,
+ 233, 18, 223, 180, 250, 224, 246, 96, 249, 135, 212, 3, 219, 70, 219, 68,
+ 240, 245, 223, 153, 242, 170, 220, 57, 230, 145, 222, 194, 250, 108, 247,
+ 136, 225, 73, 251, 203, 245, 169, 226, 238, 218, 252, 220, 52, 251, 122,
+ 254, 92, 241, 54, 233, 121, 252, 60, 244, 90, 215, 193, 244, 90, 251,
+ 209, 215, 91, 241, 249, 250, 109, 252, 187, 250, 109, 243, 242, 252, 187,
+ 250, 109, 251, 237, 225, 195, 234, 26, 224, 248, 246, 87, 251, 11, 252,
+ 177, 251, 11, 247, 130, 230, 113, 244, 190, 249, 146, 244, 190, 216, 107,
+ 244, 190, 223, 181, 244, 190, 250, 225, 244, 190, 246, 97, 244, 190, 218,
+ 241, 212, 3, 240, 246, 244, 190, 230, 146, 244, 190, 247, 137, 244, 190,
+ 225, 74, 244, 190, 243, 245, 244, 190, 242, 20, 244, 190, 211, 224, 244,
+ 190, 252, 71, 244, 190, 226, 45, 244, 190, 225, 74, 228, 53, 225, 232,
+ 224, 186, 245, 13, 245, 227, 228, 53, 230, 110, 216, 19, 71, 120, 225, 7,
+ 252, 182, 235, 242, 71, 124, 225, 7, 252, 182, 235, 242, 71, 43, 225, 7,
+ 252, 182, 235, 242, 71, 44, 225, 7, 252, 182, 235, 242, 244, 84, 242, 16,
+ 50, 212, 33, 242, 16, 50, 226, 215, 242, 16, 50, 216, 135, 120, 50, 216,
+ 135, 124, 50, 250, 19, 242, 11, 50, 204, 242, 11, 50, 249, 123, 211, 220,
+ 241, 251, 245, 14, 229, 104, 217, 151, 235, 125, 246, 92, 234, 82, 251,
+ 247, 211, 220, 249, 249, 224, 127, 242, 14, 224, 230, 231, 177, 220, 4,
+ 253, 203, 220, 4, 241, 164, 220, 4, 211, 220, 221, 240, 211, 220, 251,
+ 186, 244, 29, 251, 90, 236, 0, 219, 169, 251, 89, 236, 0, 219, 169, 251,
+ 162, 242, 194, 231, 185, 211, 221, 244, 174, 231, 186, 22, 211, 222, 241,
+ 60, 242, 10, 113, 231, 59, 241, 60, 242, 10, 113, 211, 219, 241, 60, 242,
+ 10, 224, 255, 226, 227, 211, 222, 2, 251, 106, 245, 225, 251, 141, 2,
+ 213, 246, 225, 168, 2, 251, 212, 242, 34, 231, 186, 2, 242, 110, 225,
+ 109, 231, 174, 231, 186, 2, 215, 97, 226, 208, 231, 185, 226, 208, 211,
+ 221, 252, 186, 249, 190, 211, 205, 224, 189, 235, 131, 226, 223, 235,
+ 131, 242, 169, 242, 222, 252, 187, 254, 113, 245, 18, 254, 160, 254, 161,
+ 230, 136, 236, 5, 219, 100, 235, 232, 248, 34, 225, 167, 242, 105, 248,
+ 179, 232, 201, 229, 211, 224, 254, 244, 191, 231, 142, 242, 33, 252, 138,
+ 225, 1, 217, 171, 225, 66, 234, 64, 78, 232, 111, 233, 10, 222, 233, 243,
+ 54, 218, 131, 234, 63, 251, 171, 249, 148, 2, 241, 227, 212, 19, 252, 69,
+ 241, 227, 251, 135, 241, 227, 113, 241, 225, 219, 10, 241, 227, 242, 120,
+ 241, 227, 241, 228, 2, 74, 251, 208, 241, 227, 242, 127, 241, 227, 211,
+ 42, 241, 227, 224, 128, 241, 227, 241, 228, 2, 223, 33, 223, 44, 241,
+ 225, 241, 228, 248, 81, 247, 249, 220, 82, 2, 115, 59, 235, 215, 245,
+ 172, 192, 251, 116, 254, 112, 87, 251, 195, 219, 92, 87, 249, 228, 87,
+ 218, 246, 217, 248, 87, 246, 85, 248, 157, 87, 225, 67, 64, 224, 249,
+ 244, 61, 252, 3, 247, 165, 87, 219, 3, 252, 158, 216, 149, 252, 158, 71,
+ 244, 51, 240, 211, 225, 5, 87, 230, 149, 252, 172, 249, 98, 245, 32, 114,
+ 247, 132, 50, 249, 139, 250, 242, 252, 144, 2, 211, 40, 50, 252, 144, 2,
+ 247, 132, 50, 252, 144, 2, 245, 47, 50, 252, 144, 2, 224, 228, 50, 230,
+ 149, 2, 211, 235, 250, 138, 2, 214, 153, 215, 231, 22, 211, 40, 50, 221,
+ 178, 225, 166, 249, 208, 251, 139, 230, 186, 244, 56, 247, 185, 226, 161,
+ 247, 190, 246, 49, 244, 107, 244, 40, 204, 244, 107, 244, 40, 226, 76, 2,
+ 249, 100, 226, 76, 244, 183, 214, 163, 251, 16, 217, 18, 251, 16, 250,
+ 243, 235, 242, 250, 138, 2, 214, 153, 215, 230, 250, 138, 2, 246, 104,
+ 215, 230, 252, 141, 250, 137, 250, 6, 224, 123, 222, 185, 224, 123, 226,
+ 19, 218, 121, 222, 131, 215, 222, 222, 131, 251, 191, 217, 91, 233, 51,
+ 228, 45, 228, 46, 2, 248, 80, 249, 147, 250, 0, 251, 192, 204, 251, 192,
+ 242, 127, 251, 192, 251, 208, 251, 192, 226, 157, 251, 192, 251, 189,
+ 229, 205, 252, 175, 221, 186, 231, 60, 217, 1, 223, 123, 226, 74, 244,
+ 159, 231, 234, 221, 223, 254, 89, 224, 145, 254, 252, 232, 113, 250, 127,
+ 231, 72, 226, 129, 215, 238, 235, 252, 215, 238, 226, 82, 246, 24, 87,
+ 235, 249, 245, 119, 245, 120, 2, 246, 104, 80, 48, 250, 0, 231, 200, 2,
+ 232, 107, 244, 73, 250, 0, 231, 200, 2, 223, 157, 244, 73, 204, 231, 200,
+ 2, 223, 157, 244, 73, 204, 231, 200, 2, 232, 107, 244, 73, 224, 236, 224,
+ 237, 240, 248, 229, 84, 230, 159, 225, 117, 230, 159, 225, 118, 2, 97,
+ 80, 253, 207, 233, 46, 213, 175, 230, 158, 230, 159, 225, 118, 226, 230,
+ 228, 75, 230, 159, 225, 116, 254, 90, 2, 252, 129, 251, 10, 213, 172,
+ 251, 10, 216, 254, 223, 173, 213, 171, 215, 60, 97, 253, 247, 250, 2, 97,
+ 22, 140, 204, 250, 36, 253, 247, 250, 2, 97, 22, 140, 204, 250, 36, 253,
+ 248, 2, 37, 123, 226, 120, 250, 2, 246, 104, 22, 214, 153, 204, 250, 36,
+ 253, 247, 254, 88, 246, 104, 22, 214, 153, 204, 250, 36, 253, 247, 121,
+ 251, 138, 87, 125, 251, 138, 87, 219, 7, 2, 251, 4, 91, 219, 6, 219, 7,
+ 2, 123, 219, 31, 212, 35, 219, 7, 2, 134, 219, 31, 212, 34, 252, 115,
+ 245, 172, 225, 27, 233, 42, 231, 211, 242, 184, 222, 247, 231, 211, 242,
+ 184, 232, 152, 2, 235, 225, 225, 199, 250, 0, 232, 152, 2, 234, 138, 234,
+ 138, 232, 151, 204, 232, 151, 252, 44, 252, 45, 2, 251, 4, 91, 251, 190,
+ 232, 204, 87, 223, 174, 251, 86, 252, 185, 2, 140, 80, 48, 245, 143, 2,
+ 140, 80, 48, 226, 197, 2, 245, 31, 164, 2, 43, 44, 80, 48, 219, 39, 2,
+ 97, 80, 48, 216, 14, 2, 214, 153, 80, 48, 228, 75, 123, 214, 184, 245,
+ 191, 87, 234, 136, 216, 247, 235, 219, 16, 31, 7, 6, 233, 9, 235, 219,
+ 16, 31, 7, 4, 233, 9, 235, 219, 16, 31, 227, 199, 235, 219, 16, 31, 217,
+ 183, 235, 219, 16, 31, 7, 233, 9, 244, 96, 245, 172, 216, 9, 211, 199,
+ 242, 21, 227, 182, 22, 251, 197, 241, 66, 225, 50, 230, 226, 216, 255,
+ 249, 114, 252, 159, 219, 125, 225, 9, 218, 157, 2, 230, 224, 247, 120,
+ 235, 131, 16, 31, 252, 57, 215, 220, 245, 156, 85, 42, 251, 86, 71, 42,
+ 251, 86, 233, 85, 223, 111, 250, 35, 233, 85, 251, 208, 250, 35, 233, 85,
+ 226, 157, 247, 248, 233, 85, 251, 208, 247, 248, 4, 226, 157, 247, 248,
+ 4, 251, 208, 247, 248, 214, 162, 223, 111, 215, 225, 246, 105, 223, 111,
+ 215, 225, 214, 162, 4, 223, 111, 215, 225, 246, 105, 4, 223, 111, 215,
+ 225, 37, 249, 131, 224, 252, 249, 131, 224, 253, 2, 242, 26, 51, 249,
+ 131, 224, 252, 228, 49, 43, 220, 153, 2, 134, 247, 118, 250, 4, 244, 191,
+ 123, 226, 242, 250, 4, 244, 191, 113, 226, 242, 250, 4, 244, 191, 134,
+ 226, 242, 250, 4, 244, 191, 244, 11, 226, 242, 250, 4, 244, 191, 244, 81,
+ 226, 242, 250, 4, 244, 191, 219, 125, 226, 242, 250, 4, 244, 191, 220,
+ 122, 226, 242, 250, 4, 244, 191, 245, 193, 226, 242, 250, 4, 244, 191,
+ 228, 200, 226, 242, 250, 4, 244, 191, 216, 248, 226, 242, 250, 4, 244,
+ 191, 245, 168, 226, 242, 250, 4, 244, 191, 215, 77, 226, 242, 250, 4,
+ 244, 191, 226, 192, 250, 4, 244, 191, 215, 56, 250, 4, 244, 191, 216,
+ 140, 250, 4, 244, 191, 244, 7, 250, 4, 244, 191, 244, 79, 250, 4, 244,
+ 191, 219, 121, 250, 4, 244, 191, 220, 121, 250, 4, 244, 191, 245, 192,
+ 250, 4, 244, 191, 228, 199, 250, 4, 244, 191, 216, 246, 250, 4, 244, 191,
+ 245, 166, 250, 4, 244, 191, 215, 75, 230, 117, 243, 230, 216, 36, 216, 2,
+ 218, 148, 64, 232, 239, 219, 170, 64, 235, 132, 230, 106, 242, 124, 244,
+ 190, 242, 124, 244, 191, 2, 219, 74, 245, 13, 244, 191, 2, 217, 14, 64,
+ 235, 53, 219, 74, 244, 191, 2, 204, 230, 110, 219, 74, 244, 191, 2, 204,
+ 230, 111, 22, 219, 74, 245, 13, 219, 74, 244, 191, 2, 204, 230, 111, 22,
+ 249, 230, 217, 247, 219, 74, 244, 191, 2, 204, 230, 111, 22, 216, 104,
+ 245, 13, 219, 74, 244, 191, 2, 242, 25, 219, 74, 244, 191, 2, 240, 247,
+ 211, 233, 244, 190, 219, 74, 244, 191, 2, 219, 74, 245, 13, 244, 191,
+ 221, 217, 248, 62, 244, 33, 223, 88, 244, 190, 219, 74, 244, 191, 2, 241,
+ 226, 245, 13, 219, 74, 244, 191, 2, 218, 34, 219, 73, 244, 190, 229, 87,
+ 244, 190, 245, 23, 244, 190, 214, 188, 244, 190, 244, 191, 2, 249, 230,
+ 217, 247, 225, 192, 244, 190, 249, 201, 244, 190, 249, 202, 244, 190,
+ 234, 62, 244, 190, 244, 191, 216, 137, 115, 234, 63, 234, 62, 244, 191,
+ 2, 219, 74, 245, 13, 234, 62, 244, 191, 2, 250, 0, 245, 13, 244, 191, 2,
+ 218, 88, 216, 19, 244, 191, 2, 218, 88, 216, 20, 22, 211, 233, 245, 15,
+ 244, 191, 2, 218, 88, 216, 20, 22, 216, 104, 245, 13, 247, 192, 244, 190,
+ 211, 204, 244, 190, 254, 108, 244, 190, 224, 227, 244, 190, 249, 116,
+ 244, 190, 225, 170, 244, 190, 244, 191, 2, 232, 126, 64, 215, 204, 247,
+ 192, 251, 88, 223, 88, 244, 190, 243, 239, 244, 191, 2, 204, 230, 110,
+ 254, 106, 244, 190, 244, 152, 244, 190, 212, 20, 244, 190, 219, 91, 244,
+ 190, 216, 71, 244, 190, 242, 125, 244, 190, 232, 114, 249, 116, 244, 190,
+ 244, 191, 2, 204, 230, 110, 240, 203, 244, 190, 244, 191, 2, 204, 230,
+ 111, 22, 249, 230, 217, 247, 244, 191, 221, 190, 236, 0, 244, 153, 253,
+ 213, 244, 190, 244, 49, 244, 190, 219, 92, 244, 190, 247, 165, 244, 190,
+ 244, 191, 211, 230, 230, 110, 244, 191, 2, 231, 84, 231, 144, 242, 124,
+ 250, 225, 244, 191, 2, 219, 74, 245, 13, 250, 225, 244, 191, 2, 217, 14,
+ 64, 235, 53, 219, 74, 250, 225, 244, 191, 2, 204, 230, 110, 219, 74, 250,
+ 225, 244, 191, 2, 241, 226, 245, 13, 250, 225, 244, 191, 2, 211, 196,
+ 219, 75, 234, 62, 250, 225, 244, 191, 2, 250, 0, 245, 13, 224, 227, 250,
+ 225, 244, 190, 249, 116, 250, 225, 244, 190, 212, 20, 250, 225, 244, 190,
+ 244, 191, 2, 228, 75, 242, 163, 243, 34, 244, 191, 2, 226, 215, 243, 34,
+ 225, 168, 251, 168, 248, 75, 221, 169, 230, 145, 241, 229, 230, 145, 219,
+ 8, 230, 145, 242, 5, 225, 168, 223, 156, 123, 242, 15, 225, 168, 223,
+ 156, 251, 178, 242, 11, 236, 0, 250, 179, 225, 168, 243, 238, 225, 168,
+ 2, 224, 227, 244, 190, 225, 168, 2, 244, 41, 242, 10, 222, 203, 241, 214,
+ 218, 143, 232, 149, 223, 162, 250, 244, 241, 162, 215, 248, 241, 162,
+ 215, 249, 2, 251, 114, 228, 53, 215, 248, 231, 32, 192, 223, 163, 218,
+ 149, 215, 246, 215, 247, 250, 244, 251, 92, 226, 194, 251, 92, 215, 201,
+ 251, 93, 218, 129, 230, 187, 254, 130, 244, 97, 245, 137, 224, 255, 250,
+ 244, 226, 194, 224, 255, 250, 244, 217, 32, 226, 194, 217, 32, 253, 180,
+ 226, 194, 253, 180, 223, 118, 213, 247, 248, 58, 215, 192, 253, 242, 232,
+ 117, 215, 254, 230, 139, 230, 116, 223, 161, 218, 6, 223, 161, 230, 116,
+ 251, 28, 254, 229, 215, 245, 220, 16, 222, 182, 219, 1, 203, 215, 252,
+ 232, 230, 67, 215, 252, 232, 230, 249, 190, 50, 224, 255, 250, 229, 223,
+ 44, 232, 230, 215, 222, 244, 74, 226, 197, 224, 238, 247, 123, 228, 75,
+ 245, 125, 50, 219, 72, 87, 228, 75, 219, 72, 87, 224, 122, 232, 193, 236,
+ 0, 235, 157, 225, 41, 87, 247, 146, 228, 52, 232, 193, 87, 224, 232, 212,
+ 41, 87, 228, 66, 212, 41, 87, 252, 2, 228, 75, 252, 1, 252, 0, 230, 116,
+ 252, 0, 225, 213, 228, 75, 225, 212, 250, 100, 249, 124, 231, 56, 87,
+ 211, 218, 87, 223, 59, 252, 187, 87, 216, 37, 212, 41, 249, 253, 219,
+ 234, 252, 118, 252, 116, 225, 242, 249, 177, 249, 86, 252, 169, 250, 22,
+ 43, 232, 90, 108, 16, 31, 224, 3, 108, 16, 31, 254, 192, 108, 16, 31,
+ 244, 96, 108, 16, 31, 245, 223, 108, 16, 31, 212, 40, 108, 16, 31, 254,
+ 43, 108, 16, 31, 254, 44, 223, 105, 108, 16, 31, 254, 44, 223, 104, 108,
+ 16, 31, 254, 44, 213, 143, 108, 16, 31, 254, 44, 213, 142, 108, 16, 31,
+ 213, 157, 108, 16, 31, 213, 156, 108, 16, 31, 213, 155, 108, 16, 31, 218,
+ 44, 108, 16, 31, 225, 125, 218, 44, 108, 16, 31, 85, 218, 44, 108, 16,
+ 31, 231, 55, 218, 71, 108, 16, 31, 231, 55, 218, 70, 108, 16, 31, 231,
+ 55, 218, 69, 108, 16, 31, 250, 38, 108, 16, 31, 222, 1, 108, 16, 31, 228,
+ 188, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 204,
+ 222, 1, 108, 16, 31, 222, 204, 222, 0, 108, 16, 31, 242, 166, 108, 16,
+ 31, 219, 166, 108, 16, 31, 235, 177, 226, 153, 108, 16, 31, 235, 177,
+ 226, 152, 108, 16, 31, 249, 134, 64, 235, 176, 108, 16, 31, 223, 101, 64,
+ 235, 176, 108, 16, 31, 249, 168, 226, 153, 108, 16, 31, 235, 175, 226,
+ 153, 108, 16, 31, 218, 72, 64, 249, 167, 108, 16, 31, 249, 134, 64, 249,
+ 167, 108, 16, 31, 249, 134, 64, 249, 166, 108, 16, 31, 249, 168, 254, 83,
+ 108, 16, 31, 222, 2, 64, 249, 168, 254, 83, 108, 16, 31, 218, 72, 64,
+ 222, 2, 64, 249, 167, 108, 16, 31, 213, 243, 108, 16, 31, 216, 84, 226,
+ 153, 108, 16, 31, 233, 57, 226, 153, 108, 16, 31, 254, 82, 226, 153, 108,
+ 16, 31, 218, 72, 64, 254, 81, 108, 16, 31, 222, 2, 64, 254, 81, 108, 16,
+ 31, 218, 72, 64, 222, 2, 64, 254, 81, 108, 16, 31, 213, 158, 64, 254, 81,
+ 108, 16, 31, 223, 101, 64, 254, 81, 108, 16, 31, 223, 101, 64, 254, 80,
+ 108, 16, 31, 223, 100, 108, 16, 31, 223, 99, 108, 16, 31, 223, 98, 108,
+ 16, 31, 223, 97, 108, 16, 31, 254, 157, 108, 16, 31, 254, 156, 108, 16,
+ 31, 231, 163, 108, 16, 31, 222, 7, 108, 16, 31, 253, 246, 108, 16, 31,
+ 223, 125, 108, 16, 31, 223, 124, 108, 16, 31, 253, 183, 108, 16, 31, 251,
+ 229, 226, 153, 108, 16, 31, 217, 49, 108, 16, 31, 217, 48, 108, 16, 31,
+ 224, 8, 232, 222, 108, 16, 31, 251, 183, 108, 16, 31, 251, 182, 108, 16,
+ 31, 251, 181, 108, 16, 31, 254, 138, 108, 16, 31, 226, 218, 108, 16, 31,
+ 218, 248, 108, 16, 31, 216, 82, 108, 16, 31, 242, 96, 108, 16, 31, 212,
+ 28, 108, 16, 31, 224, 226, 108, 16, 31, 251, 14, 108, 16, 31, 215, 86,
+ 108, 16, 31, 250, 246, 230, 122, 108, 16, 31, 221, 202, 64, 235, 55, 108,
+ 16, 31, 251, 25, 108, 16, 31, 215, 219, 108, 16, 31, 218, 154, 215, 219,
+ 108, 16, 31, 232, 148, 108, 16, 31, 219, 56, 108, 16, 31, 214, 142, 108,
+ 16, 31, 240, 246, 246, 64, 108, 16, 31, 253, 227, 108, 16, 31, 224, 234,
+ 253, 227, 108, 16, 31, 251, 142, 108, 16, 31, 224, 225, 251, 142, 108,
+ 16, 31, 254, 135, 108, 16, 31, 218, 117, 218, 26, 218, 116, 108, 16, 31,
+ 218, 117, 218, 26, 218, 115, 108, 16, 31, 218, 68, 108, 16, 31, 224, 200,
+ 108, 16, 31, 247, 181, 108, 16, 31, 247, 183, 108, 16, 31, 247, 182, 108,
+ 16, 31, 224, 131, 108, 16, 31, 224, 120, 108, 16, 31, 249, 122, 108, 16,
+ 31, 249, 121, 108, 16, 31, 249, 120, 108, 16, 31, 249, 119, 108, 16, 31,
+ 249, 118, 108, 16, 31, 254, 169, 108, 16, 31, 252, 119, 64, 231, 149,
+ 108, 16, 31, 252, 119, 64, 214, 17, 108, 16, 31, 223, 57, 108, 16, 31,
+ 240, 238, 108, 16, 31, 228, 212, 108, 16, 31, 248, 145, 108, 16, 31, 230,
+ 134, 108, 16, 31, 163, 246, 94, 108, 16, 31, 163, 226, 132, 9, 14, 240,
+ 102, 9, 14, 240, 101, 9, 14, 240, 100, 9, 14, 240, 99, 9, 14, 240, 98, 9,
+ 14, 240, 97, 9, 14, 240, 96, 9, 14, 240, 95, 9, 14, 240, 94, 9, 14, 240,
+ 93, 9, 14, 240, 92, 9, 14, 240, 91, 9, 14, 240, 90, 9, 14, 240, 89, 9,
+ 14, 240, 88, 9, 14, 240, 87, 9, 14, 240, 86, 9, 14, 240, 85, 9, 14, 240,
+ 84, 9, 14, 240, 83, 9, 14, 240, 82, 9, 14, 240, 81, 9, 14, 240, 80, 9,
+ 14, 240, 79, 9, 14, 240, 78, 9, 14, 240, 77, 9, 14, 240, 76, 9, 14, 240,
+ 75, 9, 14, 240, 74, 9, 14, 240, 73, 9, 14, 240, 72, 9, 14, 240, 71, 9,
+ 14, 240, 70, 9, 14, 240, 69, 9, 14, 240, 68, 9, 14, 240, 67, 9, 14, 240,
+ 66, 9, 14, 240, 65, 9, 14, 240, 64, 9, 14, 240, 63, 9, 14, 240, 62, 9,
+ 14, 240, 61, 9, 14, 240, 60, 9, 14, 240, 59, 9, 14, 240, 58, 9, 14, 240,
+ 57, 9, 14, 240, 56, 9, 14, 240, 55, 9, 14, 240, 54, 9, 14, 240, 53, 9,
+ 14, 240, 52, 9, 14, 240, 51, 9, 14, 240, 50, 9, 14, 240, 49, 9, 14, 240,
+ 48, 9, 14, 240, 47, 9, 14, 240, 46, 9, 14, 240, 45, 9, 14, 240, 44, 9,
+ 14, 240, 43, 9, 14, 240, 42, 9, 14, 240, 41, 9, 14, 240, 40, 9, 14, 240,
+ 39, 9, 14, 240, 38, 9, 14, 240, 37, 9, 14, 240, 36, 9, 14, 240, 35, 9,
+ 14, 240, 34, 9, 14, 240, 33, 9, 14, 240, 32, 9, 14, 240, 31, 9, 14, 240,
+ 30, 9, 14, 240, 29, 9, 14, 240, 28, 9, 14, 240, 27, 9, 14, 240, 26, 9,
+ 14, 240, 25, 9, 14, 240, 24, 9, 14, 240, 23, 9, 14, 240, 22, 9, 14, 240,
+ 21, 9, 14, 240, 20, 9, 14, 240, 19, 9, 14, 240, 18, 9, 14, 240, 17, 9,
+ 14, 240, 16, 9, 14, 240, 15, 9, 14, 240, 14, 9, 14, 240, 13, 9, 14, 240,
+ 12, 9, 14, 240, 11, 9, 14, 240, 10, 9, 14, 240, 9, 9, 14, 240, 8, 9, 14,
+ 240, 7, 9, 14, 240, 6, 9, 14, 240, 5, 9, 14, 240, 4, 9, 14, 240, 3, 9,
+ 14, 240, 2, 9, 14, 240, 1, 9, 14, 240, 0, 9, 14, 239, 255, 9, 14, 239,
+ 254, 9, 14, 239, 253, 9, 14, 239, 252, 9, 14, 239, 251, 9, 14, 239, 250,
+ 9, 14, 239, 249, 9, 14, 239, 248, 9, 14, 239, 247, 9, 14, 239, 246, 9,
+ 14, 239, 245, 9, 14, 239, 244, 9, 14, 239, 243, 9, 14, 239, 242, 9, 14,
+ 239, 241, 9, 14, 239, 240, 9, 14, 239, 239, 9, 14, 239, 238, 9, 14, 239,
+ 237, 9, 14, 239, 236, 9, 14, 239, 235, 9, 14, 239, 234, 9, 14, 239, 233,
+ 9, 14, 239, 232, 9, 14, 239, 231, 9, 14, 239, 230, 9, 14, 239, 229, 9,
+ 14, 239, 228, 9, 14, 239, 227, 9, 14, 239, 226, 9, 14, 239, 225, 9, 14,
+ 239, 224, 9, 14, 239, 223, 9, 14, 239, 222, 9, 14, 239, 221, 9, 14, 239,
+ 220, 9, 14, 239, 219, 9, 14, 239, 218, 9, 14, 239, 217, 9, 14, 239, 216,
+ 9, 14, 239, 215, 9, 14, 239, 214, 9, 14, 239, 213, 9, 14, 239, 212, 9,
+ 14, 239, 211, 9, 14, 239, 210, 9, 14, 239, 209, 9, 14, 239, 208, 9, 14,
+ 239, 207, 9, 14, 239, 206, 9, 14, 239, 205, 9, 14, 239, 204, 9, 14, 239,
+ 203, 9, 14, 239, 202, 9, 14, 239, 201, 9, 14, 239, 200, 9, 14, 239, 199,
+ 9, 14, 239, 198, 9, 14, 239, 197, 9, 14, 239, 196, 9, 14, 239, 195, 9,
+ 14, 239, 194, 9, 14, 239, 193, 9, 14, 239, 192, 9, 14, 239, 191, 9, 14,
+ 239, 190, 9, 14, 239, 189, 9, 14, 239, 188, 9, 14, 239, 187, 9, 14, 239,
+ 186, 9, 14, 239, 185, 9, 14, 239, 184, 9, 14, 239, 183, 9, 14, 239, 182,
+ 9, 14, 239, 181, 9, 14, 239, 180, 9, 14, 239, 179, 9, 14, 239, 178, 9,
+ 14, 239, 177, 9, 14, 239, 176, 9, 14, 239, 175, 9, 14, 239, 174, 9, 14,
+ 239, 173, 9, 14, 239, 172, 9, 14, 239, 171, 9, 14, 239, 170, 9, 14, 239,
+ 169, 9, 14, 239, 168, 9, 14, 239, 167, 9, 14, 239, 166, 9, 14, 239, 165,
+ 9, 14, 239, 164, 9, 14, 239, 163, 9, 14, 239, 162, 9, 14, 239, 161, 9,
+ 14, 239, 160, 9, 14, 239, 159, 9, 14, 239, 158, 9, 14, 239, 157, 9, 14,
+ 239, 156, 9, 14, 239, 155, 9, 14, 239, 154, 9, 14, 239, 153, 9, 14, 239,
+ 152, 9, 14, 239, 151, 9, 14, 239, 150, 9, 14, 239, 149, 9, 14, 239, 148,
+ 9, 14, 239, 147, 9, 14, 239, 146, 9, 14, 239, 145, 9, 14, 239, 144, 9,
+ 14, 239, 143, 9, 14, 239, 142, 9, 14, 239, 141, 9, 14, 239, 140, 9, 14,
+ 239, 139, 9, 14, 239, 138, 9, 14, 239, 137, 9, 14, 239, 136, 9, 14, 239,
+ 135, 9, 14, 239, 134, 9, 14, 239, 133, 9, 14, 239, 132, 9, 14, 239, 131,
+ 9, 14, 239, 130, 9, 14, 239, 129, 9, 14, 239, 128, 9, 14, 239, 127, 9,
+ 14, 239, 126, 9, 14, 239, 125, 9, 14, 239, 124, 9, 14, 239, 123, 9, 14,
+ 239, 122, 9, 14, 239, 121, 9, 14, 239, 120, 9, 14, 239, 119, 9, 14, 239,
+ 118, 9, 14, 239, 117, 9, 14, 239, 116, 9, 14, 239, 115, 9, 14, 239, 114,
+ 9, 14, 239, 113, 9, 14, 239, 112, 9, 14, 239, 111, 9, 14, 239, 110, 9,
+ 14, 239, 109, 9, 14, 239, 108, 9, 14, 239, 107, 9, 14, 239, 106, 9, 14,
+ 239, 105, 9, 14, 239, 104, 9, 14, 239, 103, 9, 14, 239, 102, 9, 14, 239,
+ 101, 9, 14, 239, 100, 9, 14, 239, 99, 9, 14, 239, 98, 9, 14, 239, 97, 9,
+ 14, 239, 96, 9, 14, 239, 95, 9, 14, 239, 94, 9, 14, 239, 93, 9, 14, 239,
+ 92, 9, 14, 239, 91, 9, 14, 239, 90, 9, 14, 239, 89, 9, 14, 239, 88, 9,
+ 14, 239, 87, 9, 14, 239, 86, 9, 14, 239, 85, 9, 14, 239, 84, 9, 14, 239,
+ 83, 9, 14, 239, 82, 9, 14, 239, 81, 9, 14, 239, 80, 9, 14, 239, 79, 9,
+ 14, 239, 78, 9, 14, 239, 77, 9, 14, 239, 76, 9, 14, 239, 75, 9, 14, 239,
+ 74, 9, 14, 239, 73, 9, 14, 239, 72, 9, 14, 239, 71, 9, 14, 239, 70, 9,
+ 14, 239, 69, 9, 14, 239, 68, 9, 14, 239, 67, 9, 14, 239, 66, 9, 14, 239,
+ 65, 9, 14, 239, 64, 9, 14, 239, 63, 9, 14, 239, 62, 9, 14, 239, 61, 9,
+ 14, 239, 60, 9, 14, 239, 59, 9, 14, 239, 58, 9, 14, 239, 57, 9, 14, 239,
+ 56, 9, 14, 239, 55, 9, 14, 239, 54, 9, 14, 239, 53, 9, 14, 239, 52, 9,
+ 14, 239, 51, 9, 14, 239, 50, 9, 14, 239, 49, 9, 14, 239, 48, 9, 14, 239,
+ 47, 9, 14, 239, 46, 9, 14, 239, 45, 9, 14, 239, 44, 9, 14, 239, 43, 9,
+ 14, 239, 42, 9, 14, 239, 41, 9, 14, 239, 40, 9, 14, 239, 39, 9, 14, 239,
+ 38, 9, 14, 239, 37, 9, 14, 239, 36, 9, 14, 239, 35, 9, 14, 239, 34, 9,
+ 14, 239, 33, 9, 14, 239, 32, 9, 14, 239, 31, 9, 14, 239, 30, 9, 14, 239,
+ 29, 9, 14, 239, 28, 9, 14, 239, 27, 9, 14, 239, 26, 9, 14, 239, 25, 9,
+ 14, 239, 24, 9, 14, 239, 23, 9, 14, 239, 22, 9, 14, 239, 21, 9, 14, 239,
+ 20, 9, 14, 239, 19, 9, 14, 239, 18, 9, 14, 239, 17, 9, 14, 239, 16, 9,
+ 14, 239, 15, 9, 14, 239, 14, 9, 14, 239, 13, 9, 14, 239, 12, 9, 14, 239,
+ 11, 9, 14, 239, 10, 9, 14, 239, 9, 9, 14, 239, 8, 9, 14, 239, 7, 9, 14,
+ 239, 6, 9, 14, 239, 5, 9, 14, 239, 4, 9, 14, 239, 3, 9, 14, 239, 2, 9,
+ 14, 239, 1, 9, 14, 239, 0, 9, 14, 238, 255, 9, 14, 238, 254, 9, 14, 238,
+ 253, 9, 14, 238, 252, 9, 14, 238, 251, 9, 14, 238, 250, 9, 14, 238, 249,
+ 9, 14, 238, 248, 9, 14, 238, 247, 9, 14, 238, 246, 9, 14, 238, 245, 9,
+ 14, 238, 244, 9, 14, 238, 243, 9, 14, 238, 242, 9, 14, 238, 241, 9, 14,
+ 238, 240, 9, 14, 238, 239, 9, 14, 238, 238, 9, 14, 238, 237, 9, 14, 238,
+ 236, 9, 14, 238, 235, 9, 14, 238, 234, 9, 14, 238, 233, 9, 14, 238, 232,
+ 9, 14, 238, 231, 9, 14, 238, 230, 9, 14, 238, 229, 9, 14, 238, 228, 9,
+ 14, 238, 227, 9, 14, 238, 226, 9, 14, 238, 225, 9, 14, 238, 224, 9, 14,
+ 238, 223, 9, 14, 238, 222, 9, 14, 238, 221, 9, 14, 238, 220, 9, 14, 238,
+ 219, 9, 14, 238, 218, 9, 14, 238, 217, 9, 14, 238, 216, 9, 14, 238, 215,
+ 9, 14, 238, 214, 9, 14, 238, 213, 9, 14, 238, 212, 9, 14, 238, 211, 9,
+ 14, 238, 210, 9, 14, 238, 209, 9, 14, 238, 208, 9, 14, 238, 207, 9, 14,
+ 238, 206, 9, 14, 238, 205, 9, 14, 238, 204, 9, 14, 238, 203, 9, 14, 238,
+ 202, 9, 14, 238, 201, 9, 14, 238, 200, 9, 14, 238, 199, 9, 14, 238, 198,
+ 9, 14, 238, 197, 9, 14, 238, 196, 9, 14, 238, 195, 9, 14, 238, 194, 9,
+ 14, 238, 193, 9, 14, 238, 192, 9, 14, 238, 191, 9, 14, 238, 190, 9, 14,
+ 238, 189, 9, 14, 238, 188, 9, 14, 238, 187, 9, 14, 238, 186, 9, 14, 238,
+ 185, 9, 14, 238, 184, 9, 14, 238, 183, 9, 14, 238, 182, 9, 14, 238, 181,
+ 9, 14, 238, 180, 9, 14, 238, 179, 9, 14, 238, 178, 9, 14, 238, 177, 9,
+ 14, 238, 176, 9, 14, 238, 175, 9, 14, 238, 174, 9, 14, 238, 173, 9, 14,
+ 238, 172, 9, 14, 238, 171, 9, 14, 238, 170, 9, 14, 238, 169, 9, 14, 238,
+ 168, 9, 14, 238, 167, 9, 14, 238, 166, 9, 14, 238, 165, 9, 14, 238, 164,
+ 9, 14, 238, 163, 9, 14, 238, 162, 9, 14, 238, 161, 9, 14, 238, 160, 9,
+ 14, 238, 159, 9, 14, 238, 158, 9, 14, 238, 157, 9, 14, 238, 156, 9, 14,
+ 238, 155, 9, 14, 238, 154, 9, 14, 238, 153, 9, 14, 238, 152, 9, 14, 238,
+ 151, 9, 14, 238, 150, 9, 14, 238, 149, 9, 14, 238, 148, 9, 14, 238, 147,
+ 9, 14, 238, 146, 9, 14, 238, 145, 9, 14, 238, 144, 9, 14, 238, 143, 9,
+ 14, 238, 142, 9, 14, 238, 141, 9, 14, 238, 140, 9, 14, 238, 139, 9, 14,
+ 238, 138, 9, 14, 238, 137, 9, 14, 238, 136, 9, 14, 238, 135, 9, 14, 238,
+ 134, 9, 14, 238, 133, 9, 14, 238, 132, 9, 14, 238, 131, 9, 14, 238, 130,
+ 9, 14, 238, 129, 9, 14, 238, 128, 9, 14, 238, 127, 9, 14, 238, 126, 9,
+ 14, 238, 125, 9, 14, 238, 124, 9, 14, 238, 123, 9, 14, 238, 122, 9, 14,
+ 238, 121, 9, 14, 238, 120, 9, 14, 238, 119, 9, 14, 238, 118, 9, 14, 238,
+ 117, 9, 14, 238, 116, 9, 14, 238, 115, 9, 14, 238, 114, 9, 14, 238, 113,
+ 9, 14, 238, 112, 9, 14, 238, 111, 9, 14, 238, 110, 9, 14, 238, 109, 9,
+ 14, 238, 108, 9, 14, 238, 107, 9, 14, 238, 106, 9, 14, 238, 105, 9, 14,
+ 238, 104, 9, 14, 238, 103, 9, 14, 238, 102, 9, 14, 238, 101, 9, 14, 238,
+ 100, 9, 14, 238, 99, 9, 14, 238, 98, 9, 14, 238, 97, 9, 14, 238, 96, 9,
+ 14, 238, 95, 9, 14, 238, 94, 9, 14, 238, 93, 9, 14, 238, 92, 9, 14, 238,
+ 91, 9, 14, 238, 90, 9, 14, 238, 89, 9, 14, 238, 88, 9, 14, 238, 87, 9,
+ 14, 238, 86, 9, 14, 238, 85, 9, 14, 238, 84, 9, 14, 238, 83, 9, 14, 238,
+ 82, 9, 14, 238, 81, 9, 14, 238, 80, 9, 14, 238, 79, 9, 14, 238, 78, 9,
+ 14, 238, 77, 9, 14, 238, 76, 9, 14, 238, 75, 9, 14, 238, 74, 9, 14, 238,
+ 73, 233, 90, 217, 84, 129, 219, 18, 129, 245, 31, 78, 129, 223, 254, 78,
+ 129, 54, 50, 129, 247, 132, 50, 129, 225, 182, 50, 129, 254, 126, 129,
+ 254, 57, 129, 43, 226, 3, 129, 44, 226, 3, 129, 253, 216, 129, 96, 50,
+ 129, 249, 219, 129, 240, 167, 129, 243, 229, 218, 129, 129, 219, 46, 129,
+ 21, 210, 86, 129, 21, 110, 129, 21, 105, 129, 21, 158, 129, 21, 161, 129,
+ 21, 189, 129, 21, 194, 129, 21, 198, 129, 21, 195, 129, 21, 200, 129,
+ 249, 226, 129, 220, 150, 129, 233, 15, 50, 129, 245, 98, 50, 129, 242,
+ 130, 50, 129, 224, 13, 78, 129, 249, 217, 253, 206, 129, 7, 6, 1, 61,
+ 129, 7, 6, 1, 253, 158, 129, 7, 6, 1, 251, 66, 129, 7, 6, 1, 249, 60,
+ 129, 7, 6, 1, 75, 129, 7, 6, 1, 245, 6, 129, 7, 6, 1, 243, 202, 129, 7,
+ 6, 1, 242, 60, 129, 7, 6, 1, 73, 129, 7, 6, 1, 235, 144, 129, 7, 6, 1,
+ 235, 23, 129, 7, 6, 1, 156, 129, 7, 6, 1, 193, 129, 7, 6, 1, 230, 25,
+ 129, 7, 6, 1, 76, 129, 7, 6, 1, 226, 105, 129, 7, 6, 1, 224, 96, 129, 7,
+ 6, 1, 153, 129, 7, 6, 1, 222, 91, 129, 7, 6, 1, 217, 152, 129, 7, 6, 1,
+ 70, 129, 7, 6, 1, 214, 105, 129, 7, 6, 1, 212, 98, 129, 7, 6, 1, 211,
+ 178, 129, 7, 6, 1, 211, 117, 129, 7, 6, 1, 210, 159, 129, 43, 42, 127,
+ 129, 223, 50, 219, 46, 129, 44, 42, 127, 129, 250, 31, 255, 14, 129, 121,
+ 232, 213, 129, 242, 137, 255, 14, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253,
+ 158, 129, 7, 4, 1, 251, 66, 129, 7, 4, 1, 249, 60, 129, 7, 4, 1, 75, 129,
+ 7, 4, 1, 245, 6, 129, 7, 4, 1, 243, 202, 129, 7, 4, 1, 242, 60, 129, 7,
+ 4, 1, 73, 129, 7, 4, 1, 235, 144, 129, 7, 4, 1, 235, 23, 129, 7, 4, 1,
+ 156, 129, 7, 4, 1, 193, 129, 7, 4, 1, 230, 25, 129, 7, 4, 1, 76, 129, 7,
+ 4, 1, 226, 105, 129, 7, 4, 1, 224, 96, 129, 7, 4, 1, 153, 129, 7, 4, 1,
+ 222, 91, 129, 7, 4, 1, 217, 152, 129, 7, 4, 1, 70, 129, 7, 4, 1, 214,
+ 105, 129, 7, 4, 1, 212, 98, 129, 7, 4, 1, 211, 178, 129, 7, 4, 1, 211,
+ 117, 129, 7, 4, 1, 210, 159, 129, 43, 249, 99, 127, 129, 67, 232, 213,
+ 129, 44, 249, 99, 127, 129, 182, 251, 6, 217, 84, 45, 221, 78, 45, 221,
+ 67, 45, 221, 56, 45, 221, 44, 45, 221, 33, 45, 221, 22, 45, 221, 11, 45,
+ 221, 0, 45, 220, 245, 45, 220, 237, 45, 220, 236, 45, 220, 235, 45, 220,
+ 234, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220, 229, 45, 220,
+ 228, 45, 220, 227, 45, 220, 226, 45, 220, 225, 45, 220, 224, 45, 220,
+ 223, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220, 218, 45, 220,
+ 217, 45, 220, 216, 45, 220, 215, 45, 220, 214, 45, 220, 213, 45, 220,
+ 212, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220, 207, 45, 220,
+ 206, 45, 220, 205, 45, 220, 204, 45, 220, 203, 45, 220, 202, 45, 220,
+ 201, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220, 196, 45, 220,
+ 195, 45, 220, 194, 45, 220, 193, 45, 220, 192, 45, 220, 191, 45, 220,
+ 190, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220, 185, 45, 220,
+ 184, 45, 220, 183, 45, 220, 182, 45, 220, 181, 45, 220, 180, 45, 220,
+ 179, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220, 174, 45, 220,
+ 173, 45, 220, 172, 45, 220, 171, 45, 220, 170, 45, 220, 169, 45, 220,
+ 168, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220, 163, 45, 220,
+ 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 220, 158, 45, 220,
+ 157, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221, 151, 45, 221,
+ 150, 45, 221, 149, 45, 221, 148, 45, 221, 147, 45, 221, 146, 45, 221,
+ 145, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221, 140, 45, 221,
+ 139, 45, 221, 138, 45, 221, 137, 45, 221, 136, 45, 221, 135, 45, 221,
+ 134, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221, 129, 45, 221,
+ 128, 45, 221, 127, 45, 221, 126, 45, 221, 125, 45, 221, 124, 45, 221,
+ 123, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221, 118, 45, 221,
+ 117, 45, 221, 116, 45, 221, 115, 45, 221, 114, 45, 221, 113, 45, 221,
+ 112, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221, 107, 45, 221,
+ 106, 45, 221, 105, 45, 221, 104, 45, 221, 103, 45, 221, 102, 45, 221,
+ 101, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96, 45, 221, 95, 45,
+ 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 91, 45, 221, 90, 45, 221, 88,
+ 45, 221, 87, 45, 221, 86, 45, 221, 85, 45, 221, 84, 45, 221, 83, 45, 221,
+ 82, 45, 221, 81, 45, 221, 80, 45, 221, 79, 45, 221, 77, 45, 221, 76, 45,
+ 221, 75, 45, 221, 74, 45, 221, 73, 45, 221, 72, 45, 221, 71, 45, 221, 70,
+ 45, 221, 69, 45, 221, 68, 45, 221, 66, 45, 221, 65, 45, 221, 64, 45, 221,
+ 63, 45, 221, 62, 45, 221, 61, 45, 221, 60, 45, 221, 59, 45, 221, 58, 45,
+ 221, 57, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221, 52, 45, 221, 51,
+ 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 47, 45, 221, 46, 45, 221,
+ 43, 45, 221, 42, 45, 221, 41, 45, 221, 40, 45, 221, 39, 45, 221, 38, 45,
+ 221, 37, 45, 221, 36, 45, 221, 35, 45, 221, 34, 45, 221, 32, 45, 221, 31,
+ 45, 221, 30, 45, 221, 29, 45, 221, 28, 45, 221, 27, 45, 221, 26, 45, 221,
+ 25, 45, 221, 24, 45, 221, 23, 45, 221, 21, 45, 221, 20, 45, 221, 19, 45,
+ 221, 18, 45, 221, 17, 45, 221, 16, 45, 221, 15, 45, 221, 14, 45, 221, 13,
+ 45, 221, 12, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45, 221, 7, 45, 221, 6,
+ 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 2, 45, 221, 1, 45, 220, 255,
+ 45, 220, 254, 45, 220, 253, 45, 220, 252, 45, 220, 251, 45, 220, 250, 45,
+ 220, 249, 45, 220, 248, 45, 220, 247, 45, 220, 246, 45, 220, 244, 45,
+ 220, 243, 45, 220, 242, 45, 220, 241, 45, 220, 240, 45, 220, 239, 45,
+ 220, 238, 227, 202, 227, 204, 218, 152, 64, 241, 233, 219, 48, 218, 152,
+ 64, 216, 212, 218, 85, 245, 143, 64, 216, 212, 245, 56, 245, 143, 64,
+ 215, 243, 245, 109, 245, 132, 245, 133, 255, 7, 255, 8, 254, 167, 252,
+ 47, 252, 179, 251, 131, 135, 217, 89, 203, 217, 89, 240, 227, 217, 93,
+ 232, 214, 244, 145, 166, 232, 213, 245, 143, 64, 232, 213, 233, 0, 228,
+ 135, 245, 112, 232, 214, 217, 89, 67, 217, 89, 212, 118, 244, 20, 244,
+ 145, 244, 125, 250, 230, 223, 53, 249, 143, 220, 28, 226, 130, 232, 150,
+ 110, 219, 58, 220, 28, 235, 255, 232, 150, 210, 86, 219, 191, 248, 151,
+ 232, 204, 245, 77, 247, 155, 248, 31, 249, 178, 110, 248, 141, 248, 31,
+ 249, 178, 105, 248, 140, 248, 31, 249, 178, 158, 248, 139, 248, 31, 249,
+ 178, 161, 248, 138, 152, 255, 7, 229, 209, 217, 177, 236, 62, 217, 180,
+ 245, 143, 64, 215, 244, 251, 213, 245, 62, 251, 5, 251, 7, 245, 143, 64,
+ 231, 81, 245, 110, 218, 61, 218, 78, 245, 77, 245, 78, 235, 232, 220,
+ 138, 161, 244, 107, 220, 137, 243, 237, 235, 232, 220, 138, 158, 242,
+ 121, 220, 137, 242, 118, 235, 232, 220, 138, 105, 223, 121, 220, 137,
+ 222, 145, 235, 232, 220, 138, 110, 214, 174, 220, 137, 214, 133, 219, 21,
+ 248, 63, 248, 65, 226, 78, 250, 142, 226, 80, 125, 226, 240, 224, 193,
+ 241, 47, 251, 150, 225, 173, 241, 203, 251, 161, 228, 75, 251, 150, 241,
+ 203, 229, 175, 235, 242, 235, 244, 229, 82, 232, 213, 229, 99, 218, 152,
+ 64, 221, 158, 254, 18, 218, 223, 245, 143, 64, 221, 158, 254, 18, 245,
+ 80, 135, 217, 90, 220, 127, 203, 217, 90, 220, 127, 240, 224, 135, 217,
+ 90, 2, 235, 35, 203, 217, 90, 2, 235, 35, 240, 225, 232, 214, 217, 90,
+ 220, 127, 67, 217, 90, 220, 127, 212, 117, 225, 253, 232, 214, 244, 14,
+ 225, 253, 232, 214, 246, 106, 225, 32, 225, 253, 232, 214, 252, 178, 225,
+ 253, 232, 214, 214, 163, 225, 28, 223, 50, 232, 214, 244, 145, 223, 50,
+ 235, 242, 223, 35, 219, 155, 220, 28, 105, 219, 152, 218, 225, 219, 155,
+ 220, 28, 158, 219, 151, 218, 224, 248, 31, 249, 178, 218, 105, 248, 137,
+ 224, 183, 214, 132, 110, 224, 183, 214, 130, 224, 149, 224, 183, 214,
+ 132, 105, 224, 183, 214, 129, 224, 148, 220, 128, 215, 242, 218, 151,
+ 218, 89, 251, 6, 250, 142, 250, 209, 231, 43, 212, 59, 230, 43, 218, 152,
+ 64, 242, 107, 254, 18, 218, 152, 64, 224, 166, 254, 18, 219, 20, 245,
+ 143, 64, 242, 107, 254, 18, 245, 143, 64, 224, 166, 254, 18, 245, 107,
+ 218, 152, 64, 218, 105, 219, 35, 219, 155, 242, 141, 135, 235, 195, 220,
+ 107, 219, 155, 135, 235, 195, 221, 194, 249, 178, 220, 135, 235, 195,
+ 249, 113, 218, 106, 216, 236, 218, 168, 226, 169, 217, 167, 249, 218,
+ 226, 142, 224, 184, 231, 42, 225, 19, 254, 53, 224, 178, 249, 218, 254,
+ 69, 229, 163, 219, 200, 7, 6, 1, 242, 249, 7, 4, 1, 242, 249, 250, 159,
+ 165, 1, 232, 175, 209, 209, 1, 244, 44, 244, 36, 209, 209, 1, 244, 44,
+ 244, 157, 209, 209, 1, 222, 211, 209, 209, 1, 232, 156, 63, 164, 251,
+ 223, 220, 3, 242, 215, 230, 248, 223, 41, 243, 216, 243, 215, 243, 214,
+ 230, 45, 209, 251, 209, 252, 209, 254, 232, 102, 222, 219, 232, 103, 222,
+ 220, 225, 223, 232, 101, 222, 218, 228, 106, 230, 165, 211, 229, 212, 15,
+ 245, 162, 243, 226, 230, 229, 226, 197, 214, 134, 87, 230, 229, 248, 157,
+ 87, 8, 3, 235, 158, 78, 224, 194, 244, 20, 31, 67, 44, 71, 233, 20, 127,
+ 213, 118, 213, 7, 212, 195, 212, 184, 212, 173, 212, 162, 212, 151, 212,
+ 140, 212, 129, 213, 117, 213, 106, 213, 95, 213, 84, 213, 73, 213, 62,
+ 213, 51, 251, 71, 226, 155, 78, 251, 196, 209, 253, 49, 28, 16, 243, 236,
+ 219, 102, 250, 73, 214, 9, 213, 40, 213, 29, 213, 18, 213, 6, 212, 251,
+ 212, 240, 212, 229, 212, 218, 212, 207, 212, 199, 212, 198, 212, 197,
+ 212, 196, 212, 194, 212, 193, 212, 192, 212, 191, 212, 190, 212, 189,
+ 212, 188, 212, 187, 212, 186, 212, 185, 212, 183, 212, 182, 212, 181,
+ 212, 180, 212, 179, 212, 178, 212, 177, 212, 176, 212, 175, 212, 174,
+ 212, 172, 212, 171, 212, 170, 212, 169, 212, 168, 212, 167, 212, 166,
+ 212, 165, 212, 164, 212, 163, 212, 161, 212, 160, 212, 159, 212, 158,
+ 212, 157, 212, 156, 212, 155, 212, 154, 212, 153, 212, 152, 212, 150,
+ 212, 149, 212, 148, 212, 147, 212, 146, 212, 145, 212, 144, 212, 143,
+ 212, 142, 212, 141, 212, 139, 212, 138, 212, 137, 212, 136, 212, 135,
+ 212, 134, 212, 133, 212, 132, 212, 131, 212, 130, 212, 128, 212, 127,
+ 212, 126, 212, 125, 212, 124, 212, 123, 212, 122, 212, 121, 212, 120,
+ 212, 119, 213, 116, 213, 115, 213, 114, 213, 113, 213, 112, 213, 111,
+ 213, 110, 213, 109, 213, 108, 213, 107, 213, 105, 213, 104, 213, 103,
+ 213, 102, 213, 101, 213, 100, 213, 99, 213, 98, 213, 97, 213, 96, 213,
+ 94, 213, 93, 213, 92, 213, 91, 213, 90, 213, 89, 213, 88, 213, 87, 213,
+ 86, 213, 85, 213, 83, 213, 82, 213, 81, 213, 80, 213, 79, 213, 78, 213,
+ 77, 213, 76, 213, 75, 213, 74, 213, 72, 213, 71, 213, 70, 213, 69, 213,
+ 68, 213, 67, 213, 66, 213, 65, 213, 64, 213, 63, 213, 61, 213, 60, 213,
+ 59, 213, 58, 213, 57, 213, 56, 213, 55, 213, 54, 213, 53, 213, 52, 213,
+ 50, 213, 49, 213, 48, 213, 47, 213, 46, 213, 45, 213, 44, 213, 43, 213,
+ 42, 213, 41, 213, 39, 213, 38, 213, 37, 213, 36, 213, 35, 213, 34, 213,
+ 33, 213, 32, 213, 31, 213, 30, 213, 28, 213, 27, 213, 26, 213, 25, 213,
+ 24, 213, 23, 213, 22, 213, 21, 213, 20, 213, 19, 213, 17, 213, 16, 213,
+ 15, 213, 14, 213, 13, 213, 12, 213, 11, 213, 10, 213, 9, 213, 8, 213, 5,
+ 213, 4, 213, 3, 213, 2, 213, 1, 213, 0, 212, 255, 212, 254, 212, 253,
+ 212, 252, 212, 250, 212, 249, 212, 248, 212, 247, 212, 246, 212, 245,
+ 212, 244, 212, 243, 212, 242, 212, 241, 212, 239, 212, 238, 212, 237,
+ 212, 236, 212, 235, 212, 234, 212, 233, 212, 232, 212, 231, 212, 230,
+ 212, 228, 212, 227, 212, 226, 212, 225, 212, 224, 212, 223, 212, 222,
+ 212, 221, 212, 220, 212, 219, 212, 217, 212, 216, 212, 215, 212, 214,
+ 212, 213, 212, 212, 212, 211, 212, 210, 212, 209, 212, 208, 212, 206,
+ 212, 205, 212, 204, 212, 203, 212, 202, 212, 201, 212, 200, 7, 6, 1, 115,
+ 2, 231, 233, 22, 242, 136, 7, 4, 1, 115, 2, 231, 233, 22, 242, 136, 7, 6,
+ 1, 160, 2, 67, 232, 214, 51, 7, 4, 1, 160, 2, 67, 232, 214, 51, 7, 6, 1,
+ 160, 2, 67, 232, 214, 252, 43, 22, 242, 136, 7, 4, 1, 160, 2, 67, 232,
+ 214, 252, 43, 22, 242, 136, 7, 6, 1, 160, 2, 67, 232, 214, 252, 43, 22,
+ 142, 7, 4, 1, 160, 2, 67, 232, 214, 252, 43, 22, 142, 7, 6, 1, 160, 2,
+ 250, 31, 22, 231, 232, 7, 4, 1, 160, 2, 250, 31, 22, 231, 232, 7, 6, 1,
+ 160, 2, 250, 31, 22, 250, 234, 7, 4, 1, 160, 2, 250, 31, 22, 250, 234, 7,
+ 6, 1, 240, 154, 2, 231, 233, 22, 242, 136, 7, 4, 1, 240, 154, 2, 231,
+ 233, 22, 242, 136, 7, 4, 1, 240, 154, 2, 59, 77, 22, 142, 7, 4, 1, 229,
+ 80, 2, 216, 89, 48, 7, 6, 1, 144, 2, 67, 232, 214, 51, 7, 4, 1, 144, 2,
+ 67, 232, 214, 51, 7, 6, 1, 144, 2, 67, 232, 214, 252, 43, 22, 242, 136,
+ 7, 4, 1, 144, 2, 67, 232, 214, 252, 43, 22, 242, 136, 7, 6, 1, 144, 2,
+ 67, 232, 214, 252, 43, 22, 142, 7, 4, 1, 144, 2, 67, 232, 214, 252, 43,
+ 22, 142, 7, 6, 1, 222, 92, 2, 67, 232, 214, 51, 7, 4, 1, 222, 92, 2, 67,
+ 232, 214, 51, 7, 6, 1, 104, 2, 231, 233, 22, 242, 136, 7, 4, 1, 104, 2,
+ 231, 233, 22, 242, 136, 7, 6, 1, 115, 2, 226, 225, 22, 142, 7, 4, 1, 115,
+ 2, 226, 225, 22, 142, 7, 6, 1, 115, 2, 226, 225, 22, 182, 7, 4, 1, 115,
+ 2, 226, 225, 22, 182, 7, 6, 1, 160, 2, 226, 225, 22, 142, 7, 4, 1, 160,
+ 2, 226, 225, 22, 142, 7, 6, 1, 160, 2, 226, 225, 22, 182, 7, 4, 1, 160,
+ 2, 226, 225, 22, 182, 7, 6, 1, 160, 2, 59, 77, 22, 142, 7, 4, 1, 160, 2,
+ 59, 77, 22, 142, 7, 6, 1, 160, 2, 59, 77, 22, 182, 7, 4, 1, 160, 2, 59,
+ 77, 22, 182, 7, 4, 1, 240, 154, 2, 59, 77, 22, 242, 136, 7, 4, 1, 240,
+ 154, 2, 59, 77, 22, 182, 7, 6, 1, 240, 154, 2, 226, 225, 22, 142, 7, 4,
+ 1, 240, 154, 2, 226, 225, 22, 59, 77, 22, 142, 7, 6, 1, 240, 154, 2, 226,
+ 225, 22, 182, 7, 4, 1, 240, 154, 2, 226, 225, 22, 59, 77, 22, 182, 7, 6,
+ 1, 235, 145, 2, 182, 7, 4, 1, 235, 145, 2, 59, 77, 22, 182, 7, 6, 1, 233,
+ 149, 2, 182, 7, 4, 1, 233, 149, 2, 182, 7, 6, 1, 232, 50, 2, 182, 7, 4,
+ 1, 232, 50, 2, 182, 7, 6, 1, 223, 224, 2, 182, 7, 4, 1, 223, 224, 2, 182,
+ 7, 6, 1, 104, 2, 226, 225, 22, 142, 7, 4, 1, 104, 2, 226, 225, 22, 142,
+ 7, 6, 1, 104, 2, 226, 225, 22, 182, 7, 4, 1, 104, 2, 226, 225, 22, 182,
+ 7, 6, 1, 104, 2, 231, 233, 22, 142, 7, 4, 1, 104, 2, 231, 233, 22, 142,
+ 7, 6, 1, 104, 2, 231, 233, 22, 182, 7, 4, 1, 104, 2, 231, 233, 22, 182,
+ 7, 4, 1, 254, 244, 2, 242, 136, 7, 4, 1, 204, 144, 2, 242, 136, 7, 4, 1,
+ 204, 144, 2, 142, 7, 4, 1, 215, 94, 214, 106, 2, 242, 136, 7, 4, 1, 215,
+ 94, 214, 106, 2, 142, 7, 4, 1, 221, 196, 2, 242, 136, 7, 4, 1, 221, 196,
+ 2, 142, 7, 4, 1, 241, 51, 221, 196, 2, 242, 136, 7, 4, 1, 241, 51, 221,
+ 196, 2, 142, 146, 1, 234, 109, 36, 116, 235, 23, 36, 116, 229, 79, 36,
+ 116, 251, 66, 36, 116, 227, 167, 36, 116, 215, 159, 36, 116, 228, 111,
+ 36, 116, 217, 152, 36, 116, 230, 25, 36, 116, 226, 105, 36, 116, 193, 36,
+ 116, 211, 117, 36, 116, 153, 36, 116, 156, 36, 116, 214, 105, 36, 116,
+ 232, 176, 36, 116, 232, 185, 36, 116, 222, 180, 36, 116, 228, 93, 36,
+ 116, 235, 144, 36, 116, 220, 104, 36, 116, 218, 226, 36, 116, 222, 91,
+ 36, 116, 242, 60, 36, 116, 233, 232, 36, 3, 235, 10, 36, 3, 234, 92, 36,
+ 3, 234, 83, 36, 3, 233, 217, 36, 3, 233, 188, 36, 3, 234, 182, 36, 3,
+ 234, 181, 36, 3, 234, 246, 36, 3, 234, 28, 36, 3, 234, 10, 36, 3, 234,
+ 195, 36, 3, 229, 76, 36, 3, 229, 27, 36, 3, 229, 23, 36, 3, 228, 248, 36,
+ 3, 228, 241, 36, 3, 229, 64, 36, 3, 229, 62, 36, 3, 229, 73, 36, 3, 229,
+ 4, 36, 3, 228, 255, 36, 3, 229, 66, 36, 3, 251, 32, 36, 3, 250, 51, 36,
+ 3, 250, 41, 36, 3, 249, 112, 36, 3, 249, 83, 36, 3, 250, 190, 36, 3, 250,
+ 182, 36, 3, 251, 22, 36, 3, 249, 238, 36, 3, 249, 174, 36, 3, 250, 222,
+ 36, 3, 227, 164, 36, 3, 227, 148, 36, 3, 227, 143, 36, 3, 227, 128, 36,
+ 3, 227, 121, 36, 3, 227, 156, 36, 3, 227, 155, 36, 3, 227, 161, 36, 3,
+ 227, 134, 36, 3, 227, 132, 36, 3, 227, 159, 36, 3, 215, 155, 36, 3, 215,
+ 135, 36, 3, 215, 134, 36, 3, 215, 123, 36, 3, 215, 120, 36, 3, 215, 151,
+ 36, 3, 215, 150, 36, 3, 215, 154, 36, 3, 215, 133, 36, 3, 215, 132, 36,
+ 3, 215, 153, 36, 3, 228, 109, 36, 3, 228, 95, 36, 3, 228, 94, 36, 3, 228,
+ 78, 36, 3, 228, 77, 36, 3, 228, 105, 36, 3, 228, 104, 36, 3, 228, 108,
+ 36, 3, 228, 80, 36, 3, 228, 79, 36, 3, 228, 107, 36, 3, 217, 101, 36, 3,
+ 216, 117, 36, 3, 216, 103, 36, 3, 215, 118, 36, 3, 215, 85, 36, 3, 217,
+ 22, 36, 3, 217, 11, 36, 3, 217, 79, 36, 3, 111, 36, 3, 216, 17, 36, 3,
+ 217, 41, 36, 3, 229, 225, 36, 3, 228, 233, 36, 3, 228, 208, 36, 3, 227,
+ 237, 36, 3, 227, 179, 36, 3, 229, 107, 36, 3, 229, 103, 36, 3, 229, 212,
+ 36, 3, 228, 74, 36, 3, 228, 64, 36, 3, 229, 187, 36, 3, 226, 89, 36, 3,
+ 225, 108, 36, 3, 225, 71, 36, 3, 224, 150, 36, 3, 224, 119, 36, 3, 225,
+ 221, 36, 3, 225, 211, 36, 3, 226, 71, 36, 3, 225, 16, 36, 3, 224, 249,
+ 36, 3, 225, 234, 36, 3, 231, 237, 36, 3, 230, 230, 36, 3, 230, 201, 36,
+ 3, 230, 102, 36, 3, 230, 54, 36, 3, 231, 91, 36, 3, 231, 80, 36, 3, 231,
+ 203, 36, 3, 230, 161, 36, 3, 230, 132, 36, 3, 231, 135, 36, 3, 211, 103,
+ 36, 3, 211, 8, 36, 3, 210, 255, 36, 3, 210, 212, 36, 3, 210, 181, 36, 3,
+ 211, 47, 36, 3, 211, 44, 36, 3, 211, 82, 36, 3, 210, 244, 36, 3, 210,
+ 229, 36, 3, 211, 55, 36, 3, 223, 184, 36, 3, 223, 35, 36, 3, 222, 239,
+ 36, 3, 222, 140, 36, 3, 222, 112, 36, 3, 223, 128, 36, 3, 223, 108, 36,
+ 3, 223, 166, 36, 3, 222, 211, 36, 3, 222, 197, 36, 3, 223, 136, 36, 3,
+ 233, 134, 36, 3, 232, 241, 36, 3, 232, 227, 36, 3, 232, 98, 36, 3, 232,
+ 73, 36, 3, 233, 58, 36, 3, 233, 50, 36, 3, 233, 109, 36, 3, 232, 156, 36,
+ 3, 232, 127, 36, 3, 233, 74, 36, 3, 214, 26, 36, 3, 213, 176, 36, 3, 213,
+ 162, 36, 3, 212, 116, 36, 3, 212, 109, 36, 3, 213, 255, 36, 3, 213, 250,
+ 36, 3, 214, 23, 36, 3, 213, 138, 36, 3, 213, 127, 36, 3, 214, 5, 36, 3,
+ 232, 174, 36, 3, 232, 169, 36, 3, 232, 168, 36, 3, 232, 165, 36, 3, 232,
+ 164, 36, 3, 232, 171, 36, 3, 232, 170, 36, 3, 232, 173, 36, 3, 232, 167,
+ 36, 3, 232, 166, 36, 3, 232, 172, 36, 3, 232, 183, 36, 3, 232, 178, 36,
+ 3, 232, 177, 36, 3, 232, 161, 36, 3, 232, 160, 36, 3, 232, 180, 36, 3,
+ 232, 179, 36, 3, 232, 182, 36, 3, 232, 163, 36, 3, 232, 162, 36, 3, 232,
+ 181, 36, 3, 222, 178, 36, 3, 222, 167, 36, 3, 222, 166, 36, 3, 222, 160,
+ 36, 3, 222, 153, 36, 3, 222, 174, 36, 3, 222, 173, 36, 3, 222, 177, 36,
+ 3, 222, 165, 36, 3, 222, 164, 36, 3, 222, 176, 36, 3, 228, 91, 36, 3,
+ 228, 86, 36, 3, 228, 85, 36, 3, 228, 82, 36, 3, 228, 81, 36, 3, 228, 88,
+ 36, 3, 228, 87, 36, 3, 228, 90, 36, 3, 228, 84, 36, 3, 228, 83, 36, 3,
+ 228, 89, 36, 3, 235, 140, 36, 3, 235, 108, 36, 3, 235, 101, 36, 3, 235,
+ 51, 36, 3, 235, 33, 36, 3, 235, 126, 36, 3, 235, 124, 36, 3, 235, 135,
+ 36, 3, 235, 68, 36, 3, 235, 59, 36, 3, 235, 129, 36, 3, 220, 98, 36, 3,
+ 220, 32, 36, 3, 220, 27, 36, 3, 219, 225, 36, 3, 219, 210, 36, 3, 220,
+ 63, 36, 3, 220, 61, 36, 3, 220, 90, 36, 3, 220, 7, 36, 3, 220, 1, 36, 3,
+ 220, 71, 36, 3, 218, 222, 36, 3, 218, 192, 36, 3, 218, 188, 36, 3, 218,
+ 179, 36, 3, 218, 176, 36, 3, 218, 197, 36, 3, 218, 196, 36, 3, 218, 221,
+ 36, 3, 218, 184, 36, 3, 218, 183, 36, 3, 218, 199, 36, 3, 222, 31, 36, 3,
+ 219, 191, 36, 3, 219, 175, 36, 3, 218, 83, 36, 3, 218, 4, 36, 3, 221,
+ 181, 36, 3, 221, 170, 36, 3, 222, 17, 36, 3, 219, 58, 36, 3, 219, 40, 36,
+ 3, 221, 219, 36, 3, 242, 46, 36, 3, 241, 180, 36, 3, 241, 161, 36, 3,
+ 240, 222, 36, 3, 240, 202, 36, 3, 241, 238, 36, 3, 241, 220, 36, 3, 242,
+ 36, 36, 3, 241, 68, 36, 3, 241, 53, 36, 3, 241, 246, 36, 3, 233, 231, 36,
+ 3, 233, 230, 36, 3, 233, 225, 36, 3, 233, 224, 36, 3, 233, 221, 36, 3,
+ 233, 220, 36, 3, 233, 227, 36, 3, 233, 226, 36, 3, 233, 229, 36, 3, 233,
+ 223, 36, 3, 233, 222, 36, 3, 233, 228, 36, 3, 219, 231, 175, 116, 5, 211,
+ 68, 175, 116, 5, 223, 155, 175, 116, 5, 223, 78, 98, 1, 215, 28, 69, 116,
+ 5, 249, 233, 176, 69, 116, 5, 249, 233, 234, 132, 69, 116, 5, 249, 233,
+ 234, 28, 69, 116, 5, 249, 233, 234, 105, 69, 116, 5, 249, 233, 229, 4,
+ 69, 116, 5, 249, 233, 251, 33, 69, 116, 5, 249, 233, 250, 157, 69, 116,
+ 5, 249, 233, 249, 238, 69, 116, 5, 249, 233, 250, 86, 69, 116, 5, 249,
+ 233, 227, 134, 69, 116, 5, 249, 233, 248, 221, 69, 116, 5, 249, 233, 215,
+ 144, 69, 116, 5, 249, 233, 247, 145, 69, 116, 5, 249, 233, 215, 139, 69,
+ 116, 5, 249, 233, 197, 69, 116, 5, 249, 233, 217, 105, 69, 116, 5, 249,
+ 233, 216, 208, 69, 116, 5, 249, 233, 111, 69, 116, 5, 249, 233, 216, 156,
+ 69, 116, 5, 249, 233, 228, 74, 69, 116, 5, 249, 233, 252, 191, 69, 116,
+ 5, 249, 233, 225, 147, 69, 116, 5, 249, 233, 225, 16, 69, 116, 5, 249,
+ 233, 225, 121, 69, 116, 5, 249, 233, 230, 161, 69, 116, 5, 249, 233, 210,
+ 244, 69, 116, 5, 249, 233, 222, 211, 69, 116, 5, 249, 233, 232, 156, 69,
+ 116, 5, 249, 233, 213, 138, 69, 116, 5, 249, 233, 220, 102, 69, 116, 5,
+ 249, 233, 218, 223, 69, 116, 5, 249, 233, 206, 69, 116, 5, 249, 233, 162,
+ 69, 116, 5, 249, 233, 233, 135, 69, 25, 5, 249, 233, 224, 88, 69, 235,
+ 243, 25, 5, 249, 233, 224, 30, 69, 235, 243, 25, 5, 249, 233, 222, 100,
+ 69, 235, 243, 25, 5, 249, 233, 222, 93, 69, 235, 243, 25, 5, 249, 233,
+ 224, 69, 69, 25, 5, 226, 204, 69, 25, 5, 255, 34, 141, 1, 251, 255, 229,
+ 77, 141, 1, 251, 255, 229, 27, 141, 1, 251, 255, 228, 248, 141, 1, 251,
+ 255, 229, 64, 141, 1, 251, 255, 229, 4, 56, 1, 251, 255, 229, 77, 56, 1,
+ 251, 255, 229, 27, 56, 1, 251, 255, 228, 248, 56, 1, 251, 255, 229, 64,
+ 56, 1, 251, 255, 229, 4, 56, 1, 254, 194, 250, 190, 56, 1, 254, 194, 215,
+ 118, 56, 1, 254, 194, 111, 56, 1, 254, 194, 226, 105, 58, 1, 245, 20,
+ 245, 19, 249, 182, 138, 130, 58, 1, 245, 19, 245, 20, 249, 182, 138, 130,
};
static unsigned char phrasebook_offset1[] = {
@@ -13127,487 +13824,488 @@ static unsigned char phrasebook_offset1[] = {
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 17, 87, 88, 89, 90, 91,
- 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 103, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 104, 105, 106, 107, 108,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 128, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 129, 130,
- 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
- 145, 146, 17, 147, 148, 149, 150, 151, 17, 17, 17, 17, 17, 17, 152, 17,
- 153, 17, 154, 17, 155, 17, 156, 17, 17, 17, 157, 17, 17, 17, 158, 159,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 160, 161, 162, 163, 164,
- 165, 166, 17, 167, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 168, 169, 170, 171, 172, 173,
- 174, 175, 176, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 177,
- 178, 179, 180, 181, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 182, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 183, 184, 185, 186, 187, 17, 188,
- 17, 189, 190, 191, 192, 193, 194, 195, 196, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 197, 198, 199, 200, 201, 17, 202, 203, 204, 205, 206,
- 207, 208, 209, 210, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 211, 212, 213,
- 214, 215, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 216, 17, 217, 218, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 104, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
+ 124, 125, 126, 127, 128, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 129, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 130, 131,
+ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
+ 146, 147, 87, 148, 149, 150, 151, 152, 87, 87, 87, 87, 87, 87, 153, 87,
+ 154, 155, 156, 87, 157, 87, 158, 87, 87, 87, 159, 87, 87, 87, 160, 161,
+ 162, 163, 87, 87, 87, 87, 87, 87, 87, 87, 87, 164, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 165, 166, 167, 168,
+ 169, 170, 171, 87, 172, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 173, 174, 175, 176, 177, 178,
+ 179, 180, 181, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 182,
+ 183, 184, 185, 186, 87, 87, 87, 87, 87, 87, 87, 87, 87, 187, 188, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 189, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 190, 191, 192, 193, 194, 87, 195,
+ 87, 196, 197, 198, 199, 200, 201, 202, 203, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 204, 205, 87, 87, 206, 207, 208, 209, 210, 87, 211, 212, 213, 214,
+ 215, 216, 217, 218, 219, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 220, 221,
+ 222, 223, 224, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 225, 87, 226, 227,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 228, 229, 230, 231, 232, 233, 234, 235, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87,
};
static unsigned int phrasebook_offset2[] = {
@@ -13615,2803 +14313,3015 @@ static unsigned int phrasebook_offset2[] = {
0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 9, 11, 14, 17, 19, 21, 24, 27, 29, 31,
33, 35, 39, 41, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 69, 72,
75, 78, 82, 86, 91, 96, 101, 105, 110, 115, 120, 124, 129, 134, 138, 142,
- 146, 150, 155, 160, 164, 168, 173, 177, 182, 187, 192, 197, 202, 205,
- 209, 212, 216, 219, 223, 227, 232, 237, 242, 246, 251, 256, 261, 265,
- 270, 275, 279, 283, 287, 291, 296, 301, 305, 309, 314, 318, 323, 328,
- 333, 338, 343, 347, 350, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 360, 365,
- 368, 371, 374, 377, 380, 383, 385, 388, 394, 402, 405, 409, 412, 414,
- 417, 420, 423, 426, 430, 433, 436, 440, 442, 445, 451, 459, 466, 473,
- 480, 485, 492, 498, 505, 512, 519, 527, 532, 540, 547, 553, 560, 567,
- 575, 582, 590, 598, 603, 611, 618, 624, 631, 638, 645, 648, 654, 661,
- 667, 674, 681, 688, 693, 699, 706, 712, 719, 726, 733, 741, 746, 754,
- 761, 767, 774, 781, 789, 796, 804, 812, 817, 825, 832, 838, 845, 852,
- 859, 862, 868, 875, 881, 888, 895, 902, 907, 915, 922, 929, 936, 943,
- 950, 957, 964, 971, 979, 987, 995, 1003, 1011, 1019, 1027, 1035, 1042,
- 1049, 1056, 1063, 1070, 1077, 1084, 1091, 1098, 1105, 1112, 1119, 1127,
- 1135, 1143, 1151, 1159, 1167, 1175, 1183, 1191, 1199, 1206, 1213, 1221,
- 1229, 1237, 1245, 1253, 1261, 1269, 1277, 1285, 1291, 1296, 1301, 1309,
- 1317, 1325, 1333, 1338, 1345, 1352, 1360, 1368, 1376, 1384, 1394, 1404,
- 1411, 1418, 1425, 1432, 1440, 1448, 1456, 1464, 1475, 1480, 1485, 1492,
- 1499, 1506, 1513, 1520, 1527, 1532, 1537, 1544, 1551, 1559, 1567, 1575,
- 1583, 1590, 1597, 1605, 1613, 1621, 1629, 1637, 1645, 1653, 1661, 1669,
- 1677, 1684, 1691, 1698, 1705, 1712, 1719, 1726, 1733, 1741, 1749, 1756,
- 1763, 1770, 1777, 1785, 1793, 1801, 1809, 1817, 1824, 1831, 1839, 1847,
- 1855, 1863, 1868, 1874, 1880, 1887, 1894, 1899, 1904, 1910, 1917, 1924,
- 1931, 1938, 1946, 1954, 1961, 1967, 1972, 1978, 1985, 1992, 1999, 2004,
- 2009, 2014, 2021, 2028, 2035, 2042, 2049, 2055, 2063, 2073, 2082, 2089,
- 2096, 2101, 2106, 2113, 2120, 2124, 2129, 2134, 2139, 2147, 2156, 2163,
- 2170, 2179, 2186, 2193, 2198, 2205, 2212, 2219, 2226, 2233, 2238, 2245,
- 2252, 2260, 2265, 2270, 2275, 2285, 2289, 2295, 2301, 2307, 2313, 2321,
- 2334, 2342, 2347, 2357, 2362, 2367, 2377, 2382, 2389, 2396, 2404, 2412,
- 2419, 2426, 2433, 2440, 2450, 2460, 2469, 2478, 2488, 2498, 2508, 2518,
- 2524, 2534, 2544, 2554, 2564, 2572, 2580, 2587, 2594, 2602, 2610, 2618,
- 2626, 2633, 2640, 2650, 2660, 2668, 2676, 2684, 2689, 2699, 2704, 2711,
- 2718, 2723, 2728, 2736, 2744, 2754, 2764, 2771, 2778, 2787, 2796, 2804,
- 2812, 2821, 2830, 2838, 2846, 2855, 2864, 2873, 2882, 2892, 2902, 2910,
- 2918, 2927, 2936, 2945, 2954, 2964, 2974, 2982, 2990, 2999, 3008, 3017,
- 3026, 3035, 3044, 3049, 3054, 3062, 3070, 3080, 3088, 3093, 3098, 3105,
- 3112, 3119, 3126, 3133, 3140, 3150, 3160, 3170, 3180, 3187, 3194, 3204,
- 3214, 3222, 3230, 3238, 3246, 3254, 3261, 3268, 3275, 3281, 3288, 3295,
- 3302, 3311, 3321, 3331, 3338, 3345, 3351, 3356, 3363, 3369, 3375, 3382,
- 3389, 3400, 3410, 3417, 3424, 3431, 3438, 3444, 3449, 3456, 3462, 3468,
- 3476, 3484, 3491, 3497, 3502, 3509, 3515, 3523, 3533, 3543, 3552, 3559,
- 3565, 3571, 3576, 3583, 3590, 3597, 3604, 3611, 3616, 3621, 3631, 3639,
- 3648, 3653, 3659, 3670, 3677, 3685, 3694, 3699, 3705, 3711, 3718, 3723,
- 3729, 3740, 3749, 3758, 3766, 3774, 3784, 3789, 3796, 3803, 3808, 3820,
- 3829, 3837, 3844, 3853, 3858, 3863, 3870, 3877, 3884, 3891, 3897, 3906,
- 3914, 3919, 3927, 3933, 3941, 3949, 3955, 3961, 3967, 3975, 3983, 3989,
- 3997, 4004, 4009, 4016, 4024, 4034, 4041, 4048, 4058, 4065, 4072, 4082,
- 4089, 4096, 4103, 4109, 4115, 4125, 4138, 4143, 4150, 4155, 4159, 4165,
- 4174, 4181, 4186, 4191, 4195, 4200, 4206, 4210, 4216, 4222, 4228, 4234,
- 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297,
- 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366,
- 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4405, 4410, 4419,
- 4425, 4430, 4436, 4441, 4447, 4455, 4463, 4467, 4471, 4476, 4482, 4488,
- 4494, 4500, 4505, 4513, 4522, 4531, 4536, 4542, 4549, 4556, 4563, 4570,
- 4574, 4580, 4585, 4590, 4595, 4600, 4603, 4606, 4609, 4612, 4615, 4618,
- 4622, 4626, 4632, 4635, 4640, 4646, 4652, 4655, 4660, 4666, 4670, 4676,
- 4682, 4688, 4694, 4699, 4704, 4709, 4712, 4718, 4723, 4728, 4732, 4737,
- 4743, 4749, 4752, 4756, 4760, 4764, 4767, 4770, 4775, 4779, 4786, 4790,
- 4796, 4800, 4806, 4810, 4814, 4818, 4823, 4828, 4835, 4841, 4848, 4854,
- 4860, 4866, 4869, 4873, 4877, 4881, 4885, 4890, 4895, 4899, 4903, 4909,
- 4913, 4917, 4922, 4928, 4933, 4939, 4943, 4950, 4955, 4960, 4965, 4970,
- 4976, 4979, 4983, 4988, 4993, 5002, 5008, 5013, 5017, 5022, 5026, 5031,
- 5035, 5039, 5044, 5048, 5054, 5059, 5064, 5069, 5074, 5079, 5084, 5090,
- 5096, 5102, 5107, 5112, 5118, 5124, 5130, 5135, 5140, 5147, 5154, 5158,
- 5164, 5171, 0, 0, 5178, 5181, 5190, 5199, 5210, 0, 0, 0, 0, 0, 5214,
- 5217, 5222, 5230, 5235, 5243, 5251, 0, 5259, 0, 5267, 5275, 5283, 5294,
- 5299, 5304, 5309, 5314, 5319, 5324, 5329, 5334, 5339, 5344, 5349, 5354,
- 5359, 5364, 5369, 5374, 0, 5379, 5384, 5389, 5394, 5399, 5404, 5409,
- 5414, 5422, 5430, 5438, 5446, 5454, 5462, 5473, 5478, 5483, 5488, 5493,
- 5498, 5503, 5508, 5513, 5518, 5523, 5528, 5533, 5538, 5543, 5548, 5553,
- 5558, 5564, 5569, 5574, 5579, 5584, 5589, 5594, 5599, 5607, 5615, 5623,
- 5631, 5639, 5644, 5648, 5652, 5659, 5669, 5679, 5683, 5687, 5691, 5697,
- 5704, 5708, 5713, 5717, 5722, 5726, 5731, 5735, 5740, 5745, 5750, 5755,
- 5760, 5765, 5770, 5775, 5780, 5785, 5790, 5795, 5800, 5805, 5810, 5814,
- 5818, 5824, 5828, 5833, 5839, 5847, 5852, 5857, 5864, 5869, 5874, 5881,
- 5890, 5899, 5910, 5918, 5923, 5928, 5933, 5940, 5945, 5951, 5956, 5961,
- 5966, 5971, 5976, 5981, 5989, 5995, 6000, 6004, 6009, 6014, 6019, 6024,
- 6029, 6034, 6039, 6043, 6049, 6053, 6058, 6063, 6068, 6072, 6077, 6082,
- 6087, 6092, 6096, 6101, 6105, 6110, 6115, 6120, 6125, 6131, 6136, 6142,
- 6146, 6151, 6155, 6159, 6164, 6169, 6174, 6179, 6184, 6189, 6194, 6198,
- 6204, 6208, 6213, 6218, 6223, 6227, 6232, 6237, 6242, 6247, 6251, 6256,
- 6260, 6265, 6270, 6275, 6280, 6286, 6291, 6297, 6301, 6306, 6310, 6318,
- 6323, 6328, 6333, 6340, 6345, 6351, 6356, 6361, 6366, 6371, 6376, 6381,
- 6389, 6395, 6400, 6405, 6410, 6415, 6420, 6426, 6432, 6439, 6446, 6455,
- 6464, 6471, 6478, 6487, 6496, 6501, 6506, 6511, 6516, 6521, 6526, 6531,
- 6536, 6547, 6558, 6563, 6568, 6575, 6582, 6590, 6598, 6603, 6608, 6613,
- 6618, 6622, 6626, 6630, 6635, 6641, 6645, 6652, 6657, 6667, 6677, 6683,
- 6689, 6697, 6705, 6713, 6721, 6728, 6735, 6744, 6753, 6761, 6769, 6777,
- 6785, 6793, 6801, 6809, 6817, 6824, 6831, 6837, 6843, 6851, 6859, 6866,
- 6873, 6882, 6891, 6897, 6903, 6911, 6919, 6927, 6935, 6941, 6947, 6955,
- 6963, 6971, 6979, 6986, 6993, 7001, 7009, 7017, 7025, 7030, 7035, 7042,
- 7049, 7059, 7069, 7073, 7081, 7089, 7096, 7103, 7111, 7119, 7126, 7133,
- 7141, 7149, 7156, 7163, 7171, 7179, 7184, 7191, 7198, 7205, 7212, 7218,
- 7224, 7232, 7240, 7245, 7250, 7258, 7266, 7274, 7282, 7290, 7298, 7305,
- 7312, 7320, 7328, 7336, 7344, 7351, 7358, 7364, 7370, 7379, 7388, 7395,
- 7402, 7409, 7416, 7423, 7430, 7437, 7444, 7452, 7460, 7468, 7476, 7484,
- 7492, 7502, 7512, 7519, 7526, 7533, 7540, 7547, 7554, 7561, 7568, 7575,
- 7582, 7589, 7596, 7603, 7610, 7617, 7624, 7631, 7638, 7645, 7652, 7659,
- 7666, 7673, 7680, 7685, 7690, 7695, 7700, 7705, 7710, 7715, 7720, 7725,
- 7730, 7736, 7742, 7751, 7760, 7769, 7778, 7786, 7794, 7802, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 7810, 7815, 7820, 7825, 7830, 7835, 7840, 7845, 7850,
- 7854, 7859, 7864, 7869, 7874, 7879, 7884, 7889, 7894, 7899, 7904, 7909,
- 7914, 7919, 7924, 7929, 7934, 7939, 7944, 7948, 7953, 7958, 7963, 7968,
- 7973, 7978, 7983, 7988, 7993, 0, 0, 7998, 8005, 8008, 8012, 8016, 8019,
- 8023, 0, 8027, 8032, 8037, 8042, 8047, 8052, 8057, 8062, 8067, 8071,
- 8076, 8081, 8086, 8091, 8096, 8101, 8106, 8111, 8116, 8121, 8126, 8131,
- 8136, 8141, 8146, 8151, 8156, 8161, 8165, 8170, 8175, 8180, 8185, 8190,
- 8195, 8200, 8205, 8210, 8215, 0, 8222, 8227, 0, 0, 0, 0, 0, 0, 8230,
- 8235, 8240, 8245, 8252, 8259, 8264, 8269, 8274, 8279, 8284, 8289, 8294,
- 8301, 8306, 8313, 8320, 8325, 8332, 8337, 8342, 8347, 8354, 8359, 8364,
- 8371, 8380, 8385, 8390, 8395, 8400, 8406, 8411, 8418, 8425, 8432, 8437,
- 8442, 8447, 8452, 8457, 8462, 8472, 8477, 8485, 8490, 8495, 8500, 8505,
- 8512, 8519, 8526, 8532, 8538, 8545, 0, 0, 0, 0, 0, 0, 0, 0, 8552, 8556,
- 8560, 8564, 8568, 8572, 8576, 8580, 8584, 8588, 8592, 8597, 8601, 8605,
- 8610, 8614, 8619, 8623, 8627, 8631, 8636, 8640, 8645, 8649, 8653, 8657,
- 8661, 0, 0, 0, 0, 0, 8665, 8672, 8680, 8687, 8692, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8697, 8700, 8704, 8709, 0, 0, 8713, 8719, 8725, 8728, 8735,
- 8744, 8747, 8750, 8755, 8761, 8765, 8773, 8779, 8785, 8793, 8797, 8802,
- 8813, 8818, 8822, 8826, 8830, 0, 0, 8833, 8840, 8844, 8850, 8854, 8861,
- 8867, 8874, 8880, 8886, 8890, 8894, 8900, 8904, 8908, 8912, 8916, 8920,
- 8924, 8928, 8932, 8936, 8940, 8944, 8948, 8952, 8956, 8960, 8964, 8968,
- 8976, 8984, 8994, 9003, 9012, 9015, 9019, 9023, 9027, 9031, 9035, 9039,
- 9043, 9047, 9052, 9056, 9059, 9062, 9065, 9068, 9071, 9074, 9077, 9080,
- 9084, 9087, 9090, 9095, 9100, 9106, 9109, 9116, 9125, 9130, 9135, 9142,
- 9147, 9152, 9156, 9160, 9164, 9168, 9172, 9176, 9180, 9184, 9188, 9192,
- 9197, 9202, 9209, 9215, 9221, 9227, 9232, 9240, 9248, 9253, 9259, 9265,
- 9271, 9277, 9281, 9285, 9289, 9296, 9306, 9310, 9314, 9318, 9324, 9332,
- 9336, 9340, 9347, 9351, 9355, 9359, 9366, 9373, 9385, 9389, 9393, 9397,
- 9407, 9416, 9420, 9428, 9435, 9442, 9451, 9462, 9470, 9474, 9483, 9494,
- 9502, 9515, 9523, 9531, 9539, 9547, 9553, 9562, 9569, 9573, 9581, 9585,
- 9592, 9600, 9604, 9610, 9617, 9624, 9628, 9636, 9640, 9647, 9651, 9659,
- 9663, 9671, 9679, 9686, 9694, 9702, 9709, 9715, 9719, 9726, 9734, 9740,
- 9747, 9754, 9760, 9769, 9777, 9784, 9790, 9794, 9797, 9801, 9807, 9815,
- 9819, 9825, 9831, 9838, 9845, 9848, 9855, 9860, 9868, 9873, 9877, 9890,
- 9903, 9909, 9916, 9921, 9927, 9932, 9938, 9948, 9955, 9964, 9974, 9980,
- 9985, 9990, 9994, 9998, 10003, 10008, 10014, 10022, 10030, 10041, 10046,
- 10055, 10064, 10071, 10077, 10083, 10089, 10095, 10101, 10107, 10113,
- 10119, 10125, 10132, 10139, 10146, 10152, 10160, 10169, 10175, 10182,
- 10189, 10194, 10199, 10203, 10210, 10217, 10226, 10235, 10238, 10243,
- 10248, 0, 10253, 10257, 10261, 10267, 10271, 10275, 10281, 10285, 10293,
- 10297, 10301, 10305, 10309, 10313, 10319, 10323, 10329, 10333, 10337,
- 10341, 10345, 10349, 10354, 10357, 10361, 10367, 10371, 10375, 10379,
- 10383, 10387, 10393, 10399, 10405, 10409, 10413, 10418, 10422, 10426,
- 10431, 10435, 10439, 10446, 10453, 10457, 10461, 10466, 10470, 10474,
- 10477, 10482, 10485, 10488, 10493, 10498, 10502, 10506, 10512, 10518,
- 10521, 0, 0, 10524, 10530, 10536, 10542, 10552, 10564, 10576, 10593,
- 10605, 10616, 10624, 10631, 10642, 10657, 10668, 10674, 10683, 10691,
- 10703, 10713, 10721, 10733, 10740, 10748, 10760, 10766, 10772, 10780,
- 10788, 10796, 10802, 10812, 10819, 10829, 10839, 10852, 10866, 10880,
- 10890, 10901, 10912, 10925, 10938, 10952, 10964, 10976, 10989, 11002,
- 11014, 11027, 11036, 11044, 11049, 11054, 11059, 11064, 11069, 11074,
- 11079, 11084, 11089, 11094, 11099, 11104, 11109, 11114, 11119, 11124,
- 11129, 11134, 11139, 11144, 11149, 11154, 11159, 11164, 11169, 11174,
- 11179, 11184, 11189, 11194, 11199, 11204, 11208, 11213, 11218, 11223,
- 11228, 11233, 11237, 11241, 11245, 11249, 11253, 11257, 11261, 11265,
- 11269, 11273, 11277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11282,
- 11287, 11291, 11295, 11299, 11303, 11307, 11311, 11315, 11319, 11323,
- 11327, 11332, 11336, 11340, 11344, 11349, 11353, 11358, 11362, 11367,
- 11371, 11376, 11381, 11386, 11391, 11395, 11400, 11405, 11410, 11415,
- 11419, 11424, 11431, 11435, 11440, 11444, 11448, 11453, 11457, 11464,
- 11471, 11478, 11484, 11492, 11500, 11509, 11517, 11524, 11531, 11539,
- 11545, 11551, 11557, 11563, 11570, 11575, 11579, 11584, 0, 0, 0, 0, 0,
- 11588, 11593, 11598, 11603, 11608, 11613, 11618, 11623, 11628, 11633,
- 11638, 11643, 11648, 11653, 11658, 11663, 11668, 11673, 11678, 11683,
- 11688, 11693, 11698, 11703, 11708, 11713, 11718, 11726, 11733, 11739,
- 11744, 11752, 11759, 11765, 11772, 11778, 11783, 11790, 11797, 11803,
- 11808, 11813, 11819, 11824, 11829, 11835, 0, 0, 11840, 11846, 11852,
- 11858, 11864, 11870, 11876, 11881, 11889, 11895, 11901, 11907, 11913,
- 11919, 11927, 0, 11933, 11938, 11943, 11948, 11953, 11958, 11963, 11968,
- 11973, 11978, 11983, 11988, 11993, 11998, 12003, 12008, 12013, 12018,
- 12023, 12028, 12033, 12038, 12043, 12048, 12053, 12058, 12063, 12068, 0,
- 0, 12073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 147, 151, 156, 161, 165, 170, 175, 179, 184, 189, 194, 199, 204, 207,
+ 211, 214, 218, 221, 225, 229, 234, 239, 244, 248, 253, 258, 263, 267,
+ 272, 277, 281, 285, 290, 294, 299, 304, 308, 313, 318, 322, 327, 332,
+ 337, 342, 347, 351, 354, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 363, 368,
+ 371, 374, 377, 380, 383, 386, 388, 391, 397, 405, 408, 412, 415, 417,
+ 420, 423, 426, 429, 433, 436, 439, 443, 445, 448, 454, 462, 469, 476,
+ 483, 488, 495, 501, 508, 514, 521, 529, 534, 542, 549, 555, 562, 569,
+ 577, 584, 592, 600, 605, 612, 619, 625, 632, 638, 645, 648, 654, 661,
+ 667, 674, 681, 688, 693, 700, 707, 713, 720, 726, 733, 741, 746, 754,
+ 761, 767, 774, 781, 789, 796, 804, 812, 817, 824, 831, 837, 844, 850,
+ 857, 860, 866, 873, 879, 886, 893, 900, 905, 913, 920, 927, 934, 941,
+ 948, 955, 962, 969, 977, 985, 993, 1001, 1009, 1017, 1025, 1033, 1040,
+ 1047, 1054, 1061, 1068, 1075, 1082, 1089, 1096, 1103, 1110, 1117, 1125,
+ 1133, 1141, 1149, 1157, 1165, 1173, 1181, 1189, 1197, 1204, 1211, 1218,
+ 1225, 1233, 1241, 1249, 1257, 1265, 1273, 1281, 1287, 1292, 1297, 1305,
+ 1313, 1321, 1329, 1334, 1341, 1348, 1356, 1364, 1372, 1380, 1390, 1400,
+ 1407, 1414, 1421, 1428, 1436, 1444, 1452, 1460, 1471, 1476, 1481, 1488,
+ 1495, 1502, 1509, 1516, 1523, 1528, 1533, 1540, 1547, 1555, 1563, 1571,
+ 1579, 1586, 1593, 1601, 1609, 1617, 1625, 1633, 1641, 1649, 1657, 1665,
+ 1673, 1680, 1687, 1693, 1699, 1706, 1713, 1720, 1727, 1735, 1743, 1750,
+ 1757, 1764, 1771, 1779, 1787, 1795, 1803, 1811, 1818, 1825, 1833, 1841,
+ 1849, 1857, 1863, 1869, 1875, 1882, 1889, 1894, 1899, 1904, 1911, 1918,
+ 1925, 1932, 1940, 1948, 1955, 1961, 1966, 1971, 1978, 1985, 1992, 1997,
+ 2002, 2007, 2014, 2021, 2028, 2035, 2042, 2048, 2056, 2066, 2074, 2081,
+ 2088, 2093, 2098, 2105, 2112, 2116, 2121, 2126, 2131, 2139, 2148, 2155,
+ 2162, 2171, 2178, 2185, 2190, 2197, 2204, 2211, 2218, 2225, 2230, 2237,
+ 2244, 2252, 2257, 2262, 2267, 2277, 2281, 2287, 2293, 2299, 2305, 2313,
+ 2326, 2334, 2339, 2349, 2354, 2359, 2369, 2374, 2381, 2388, 2396, 2404,
+ 2411, 2418, 2425, 2432, 2442, 2452, 2461, 2470, 2480, 2490, 2500, 2510,
+ 2516, 2526, 2536, 2546, 2556, 2564, 2572, 2579, 2586, 2594, 2602, 2610,
+ 2618, 2625, 2632, 2642, 2652, 2660, 2668, 2676, 2681, 2691, 2696, 2703,
+ 2710, 2715, 2720, 2728, 2736, 2746, 2756, 2763, 2770, 2779, 2788, 2796,
+ 2804, 2813, 2822, 2830, 2838, 2847, 2856, 2865, 2874, 2884, 2894, 2902,
+ 2910, 2919, 2928, 2937, 2946, 2956, 2966, 2974, 2982, 2991, 3000, 3009,
+ 3018, 3027, 3036, 3041, 3046, 3054, 3062, 3072, 3080, 3085, 3090, 3097,
+ 3104, 3111, 3118, 3125, 3132, 3142, 3152, 3162, 3172, 3179, 3186, 3196,
+ 3206, 3214, 3222, 3230, 3238, 3246, 3253, 3260, 3267, 3273, 3280, 3287,
+ 3294, 3303, 3313, 3323, 3330, 3337, 3343, 3348, 3355, 3361, 3367, 3374,
+ 3381, 3392, 3402, 3409, 3416, 3423, 3430, 3436, 3441, 3448, 3454, 3459,
+ 3467, 3475, 3482, 3488, 3493, 3500, 3505, 3512, 3521, 3530, 3539, 3546,
+ 3552, 3558, 3563, 3570, 3577, 3584, 3591, 3598, 3603, 3608, 3617, 3625,
+ 3634, 3639, 3645, 3656, 3663, 3671, 3680, 3686, 3692, 3698, 3705, 3710,
+ 3716, 3727, 3736, 3745, 3753, 3761, 3771, 3776, 3783, 3790, 3795, 3807,
+ 3816, 3824, 3831, 3840, 3845, 3850, 3857, 3864, 3871, 3878, 3884, 3893,
+ 3901, 3906, 3914, 3920, 3928, 3936, 3942, 3948, 3954, 3961, 3969, 3975,
+ 3983, 3990, 3995, 4002, 4010, 4020, 4027, 4034, 4044, 4051, 4058, 4068,
+ 4075, 4082, 4089, 4095, 4101, 4111, 4124, 4129, 4136, 4141, 4145, 4151,
+ 4160, 4167, 4172, 4177, 4181, 4186, 4192, 4196, 4202, 4208, 4214, 4220,
+ 4228, 4233, 4238, 4243, 4248, 4254, 4256, 4261, 4265, 4271, 4277, 4283,
+ 4288, 4295, 4302, 4308, 4315, 4323, 4331, 4336, 4341, 4345, 4350, 4352,
+ 4354, 4357, 4359, 4361, 4366, 4371, 4377, 4382, 4386, 4391, 4396, 4405,
+ 4411, 4416, 4422, 4427, 4433, 4441, 4449, 4453, 4457, 4462, 4468, 4474,
+ 4480, 4486, 4491, 4499, 4508, 4517, 4521, 4527, 4534, 4541, 4548, 4555,
+ 4559, 4564, 4569, 4574, 4579, 4584, 4586, 4589, 4592, 4595, 4598, 4601,
+ 4605, 4609, 4615, 4618, 4623, 4629, 4635, 4638, 4643, 4649, 4653, 4659,
+ 4665, 4671, 4677, 4682, 4687, 4692, 4695, 4701, 4706, 4711, 4715, 4720,
+ 4726, 4732, 4735, 4739, 4743, 4747, 4750, 4753, 4758, 4762, 4769, 4773,
+ 4779, 4783, 4789, 4793, 4797, 4801, 4806, 4811, 4818, 4824, 4831, 4837,
+ 4843, 4849, 4852, 4856, 4860, 4863, 4867, 4872, 4877, 4881, 4885, 4891,
+ 4895, 4899, 4904, 4910, 4915, 4921, 4925, 4932, 4937, 4942, 4947, 4952,
+ 4958, 4961, 4965, 4970, 4975, 4984, 4990, 4995, 4999, 5004, 5008, 5013,
+ 5017, 5021, 5026, 5029, 5035, 5040, 5045, 5050, 5055, 5060, 5065, 5071,
+ 5077, 5083, 5088, 5093, 5099, 5105, 5111, 5116, 5121, 5128, 5135, 5139,
+ 5145, 5152, 0, 0, 5159, 5162, 5171, 5180, 5191, 0, 0, 0, 0, 0, 5195,
+ 5198, 5203, 5211, 5216, 5224, 5232, 0, 5240, 0, 5248, 5256, 5264, 5275,
+ 5280, 5285, 5290, 5295, 5300, 5305, 5310, 5315, 5320, 5325, 5330, 5335,
+ 5340, 5345, 5350, 5355, 0, 5360, 5365, 5370, 5375, 5380, 5385, 5390,
+ 5395, 5403, 5411, 5419, 5427, 5435, 5443, 5454, 5459, 5464, 5469, 5474,
+ 5479, 5484, 5489, 5494, 5499, 5504, 5509, 5514, 5519, 5524, 5529, 5534,
+ 5539, 5545, 5550, 5555, 5560, 5565, 5570, 5575, 5580, 5588, 5596, 5604,
+ 5612, 5620, 5625, 5629, 5633, 5640, 5650, 5660, 5664, 5668, 5672, 5678,
+ 5685, 5689, 5694, 5698, 5703, 5707, 5712, 5716, 5721, 5726, 5731, 5736,
+ 5741, 5746, 5751, 5756, 5761, 5766, 5771, 5776, 5781, 5786, 5791, 5795,
+ 5799, 5805, 5809, 5814, 5820, 5828, 5833, 5838, 5845, 5850, 5855, 5862,
+ 5871, 5880, 5891, 5899, 5904, 5909, 5914, 5921, 5926, 5932, 5937, 5942,
+ 5947, 5952, 5957, 5962, 5970, 5976, 5981, 5985, 5990, 5995, 6000, 6005,
+ 6010, 6015, 6020, 6024, 6030, 6034, 6039, 6044, 6049, 6053, 6058, 6063,
+ 6068, 6073, 6077, 6082, 6086, 6091, 6096, 6101, 6106, 6112, 6117, 6123,
+ 6127, 6132, 6136, 6140, 6145, 6150, 6155, 6160, 6165, 6170, 6175, 6179,
+ 6185, 6189, 6194, 6199, 6204, 6208, 6213, 6218, 6223, 6228, 6232, 6237,
+ 6241, 6246, 6251, 6256, 6261, 6267, 6272, 6278, 6282, 6287, 6291, 6299,
+ 6304, 6309, 6314, 6321, 6326, 6332, 6337, 6342, 6347, 6352, 6357, 6362,
+ 6370, 6376, 6381, 6386, 6391, 6396, 6401, 6407, 6413, 6420, 6427, 6436,
+ 6445, 6452, 6459, 6468, 6477, 6482, 6487, 6492, 6497, 6502, 6507, 6512,
+ 6517, 6528, 6539, 6544, 6549, 6556, 6563, 6571, 6579, 6584, 6589, 6594,
+ 6599, 6603, 6607, 6611, 6617, 6623, 6627, 6634, 6639, 6649, 6659, 6665,
+ 6671, 6679, 6687, 6695, 6703, 6710, 6717, 6726, 6735, 6743, 6751, 6759,
+ 6767, 6775, 6783, 6791, 6799, 6806, 6813, 6819, 6825, 6833, 6841, 6848,
+ 6855, 6864, 6873, 6879, 6885, 6893, 6901, 6909, 6917, 6923, 6929, 6937,
+ 6945, 6953, 6961, 6968, 6975, 6983, 6991, 6999, 7007, 7012, 7017, 7024,
+ 7031, 7041, 7051, 7055, 7063, 7071, 7078, 7085, 7093, 7101, 7108, 7115,
+ 7123, 7131, 7138, 7145, 7153, 7161, 7166, 7173, 7180, 7187, 7194, 7200,
+ 7206, 7214, 7222, 7227, 7232, 7240, 7248, 7256, 7264, 7272, 7280, 7287,
+ 7294, 7302, 7310, 7318, 7326, 7333, 7340, 7346, 7352, 7361, 7370, 7377,
+ 7384, 7391, 7398, 7405, 7412, 7419, 7426, 7434, 7442, 7450, 7458, 7466,
+ 7474, 7484, 7494, 7501, 7508, 7515, 7522, 7529, 7536, 7543, 7550, 7557,
+ 7564, 7571, 7578, 7585, 7592, 7599, 7606, 7613, 7620, 7627, 7634, 7641,
+ 7648, 7655, 7662, 7667, 7672, 7677, 7682, 7687, 7692, 7697, 7702, 7707,
+ 7712, 7718, 7724, 7733, 7742, 7751, 7760, 7768, 7776, 7784, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 7792, 7797, 7802, 7807, 7812, 7817, 7822, 7827, 7832,
+ 7836, 7841, 7846, 7851, 7856, 7861, 7866, 7871, 7876, 7881, 7886, 7891,
+ 7896, 7901, 7906, 7911, 7916, 7921, 7926, 7930, 7935, 7940, 7945, 7950,
+ 7955, 7960, 7965, 7970, 7975, 0, 0, 7980, 7987, 7990, 7994, 7998, 8001,
+ 8005, 0, 8009, 8014, 8019, 8024, 8029, 8034, 8039, 8044, 8049, 8053,
+ 8058, 8063, 8068, 8073, 8078, 8083, 8088, 8093, 8098, 8103, 8108, 8113,
+ 8118, 8123, 8128, 8133, 8138, 8143, 8147, 8152, 8157, 8162, 8167, 8172,
+ 8177, 8182, 8187, 8192, 8197, 0, 8204, 8209, 0, 0, 0, 0, 8212, 0, 8216,
+ 8221, 8226, 8231, 8238, 8245, 8250, 8255, 8260, 8265, 8270, 8275, 8280,
+ 8287, 8292, 8299, 8306, 8311, 8318, 8323, 8328, 8333, 8340, 8345, 8350,
+ 8357, 8366, 8371, 8376, 8381, 8386, 8392, 8397, 8404, 8411, 8418, 8423,
+ 8428, 8433, 8438, 8443, 8448, 8458, 8463, 8471, 8476, 8481, 8486, 8491,
+ 8498, 8505, 8512, 8518, 8524, 8531, 0, 0, 0, 0, 0, 0, 0, 0, 8538, 8542,
+ 8546, 8550, 8554, 8558, 8562, 8566, 8570, 8574, 8578, 8583, 8587, 8591,
+ 8596, 8600, 8605, 8609, 8613, 8617, 8622, 8626, 8631, 8635, 8639, 8643,
+ 8647, 0, 0, 0, 0, 0, 8651, 8658, 8666, 8673, 8678, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8683, 8686, 8690, 8695, 8699, 0, 8703, 8709, 8715, 8718,
+ 8725, 8734, 8737, 8740, 8745, 8751, 8755, 8763, 8769, 8775, 8783, 8787,
+ 8792, 8803, 8808, 8812, 8816, 8820, 0, 0, 8823, 8830, 8834, 8840, 8844,
+ 8851, 8857, 8864, 8870, 8876, 8880, 8884, 8890, 8894, 8898, 8902, 8906,
+ 8910, 8914, 8918, 8922, 8926, 8930, 8934, 8938, 8942, 8946, 8950, 8954,
+ 8958, 8966, 8974, 8984, 8993, 9002, 9005, 9009, 9013, 9017, 9021, 9025,
+ 9029, 9033, 9037, 9042, 9046, 9049, 9052, 9055, 9058, 9061, 9064, 9067,
+ 9070, 9074, 9077, 9080, 9085, 9090, 9096, 9099, 9106, 9115, 9120, 9125,
+ 9132, 9137, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, 9178,
+ 9182, 9187, 9192, 9199, 9205, 9211, 9217, 9222, 9230, 9238, 9243, 9249,
+ 9255, 9261, 9267, 9271, 9275, 9279, 9286, 9296, 9300, 9304, 9308, 9314,
+ 9322, 9326, 9330, 9337, 9341, 9345, 9349, 9356, 9363, 9375, 9379, 9383,
+ 9387, 9397, 9406, 9410, 9418, 9425, 9432, 9441, 9452, 9460, 9464, 9473,
+ 9484, 9492, 9505, 9513, 9521, 9529, 9537, 9543, 9552, 9559, 9563, 9571,
+ 9575, 9582, 9590, 9594, 9600, 9607, 9614, 9618, 9626, 9630, 9637, 9641,
+ 9649, 9653, 9661, 9669, 9676, 9684, 9692, 9699, 9705, 9709, 9716, 9724,
+ 9730, 9737, 9744, 9750, 9759, 9767, 9774, 9780, 9784, 9787, 9791, 9797,
+ 9805, 9809, 9815, 9821, 9828, 9835, 9838, 9845, 9850, 9858, 9863, 9867,
+ 9880, 9893, 9899, 9906, 9911, 9917, 9922, 9928, 9938, 9945, 9954, 9964,
+ 9970, 9975, 9980, 9984, 9988, 9993, 9998, 10004, 10012, 10020, 10031,
+ 10036, 10045, 10054, 10061, 10067, 10073, 10079, 10085, 10091, 10097,
+ 10103, 10109, 10115, 10122, 10129, 10136, 10142, 10150, 10159, 10165,
+ 10172, 10179, 10184, 10189, 10193, 10200, 10207, 10216, 10225, 10228,
+ 10233, 10238, 0, 10243, 10247, 10251, 10257, 10261, 10265, 10271, 10275,
+ 10283, 10287, 10291, 10295, 10299, 10303, 10309, 10313, 10319, 10323,
+ 10327, 10331, 10335, 10339, 10344, 10347, 10351, 10357, 10361, 10365,
+ 10369, 10373, 10377, 10383, 10389, 10395, 10399, 10403, 10408, 10412,
+ 10416, 10421, 10425, 10429, 10436, 10443, 10447, 10451, 10456, 10460,
+ 10464, 10467, 10472, 10475, 10478, 10483, 10488, 10492, 10496, 10502,
+ 10508, 10511, 0, 0, 10514, 10520, 10526, 10532, 10542, 10554, 10566,
+ 10583, 10595, 10606, 10614, 10621, 10632, 10647, 10658, 10664, 10673,
+ 10681, 10693, 10703, 10711, 10723, 10730, 10738, 10750, 10756, 10762,
+ 10770, 10778, 10786, 10792, 10802, 10809, 10819, 10829, 10842, 10856,
+ 10870, 10880, 10891, 10902, 10915, 10928, 10942, 10954, 10966, 10979,
+ 10992, 11004, 11017, 11026, 11034, 11039, 11044, 11049, 11054, 11059,
+ 11064, 11069, 11074, 11079, 11084, 11089, 11094, 11099, 11104, 11109,
+ 11114, 11119, 11124, 11129, 11134, 11139, 11144, 11149, 11154, 11159,
+ 11164, 11169, 11174, 11179, 11184, 11189, 11194, 11198, 11203, 11208,
+ 11213, 11218, 11223, 11227, 11231, 11235, 11239, 11243, 11247, 11251,
+ 11255, 11259, 11263, 11267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11272, 11277, 11281, 11285, 11289, 11293, 11297, 11301, 11305, 11309,
+ 11313, 11317, 11322, 11326, 11330, 11334, 11339, 11343, 11348, 11353,
+ 11358, 11362, 11367, 11372, 11377, 11382, 11386, 11391, 11395, 11400,
+ 11405, 11409, 11414, 11421, 11425, 11430, 11434, 11438, 11443, 11447,
+ 11454, 11461, 11468, 11474, 11482, 11490, 11499, 11507, 11514, 11521,
+ 11529, 11535, 11541, 11547, 11553, 11560, 11565, 11569, 11574, 0, 0, 0,
+ 0, 0, 11578, 11583, 11588, 11593, 11598, 11603, 11608, 11613, 11618,
+ 11623, 11628, 11633, 11638, 11643, 11648, 11653, 11658, 11663, 11668,
+ 11673, 11678, 11683, 11688, 11693, 11698, 11703, 11708, 11716, 11723,
+ 11729, 11734, 11742, 11749, 11755, 11762, 11768, 11773, 11780, 11787,
+ 11793, 11798, 11803, 11809, 11814, 11819, 11825, 0, 0, 11830, 11836,
+ 11842, 11848, 11854, 11860, 11866, 11871, 11879, 11885, 11891, 11897,
+ 11903, 11909, 11917, 0, 11923, 11928, 11933, 11938, 11943, 11948, 11953,
+ 11958, 11963, 11968, 11973, 11978, 11983, 11988, 11993, 11998, 12003,
+ 12008, 12013, 12018, 12023, 12028, 12033, 12038, 12043, 12048, 12053,
+ 12058, 0, 0, 12063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 12067, 0, 12076, 12083, 12091, 12103, 12110, 12117, 12124, 12135, 12146,
+ 12153, 12161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12167, 12172, 12177, 12182, 12187,
+ 12192, 12197, 12202, 12207, 12212, 12217, 12222, 12227, 12231, 12235,
+ 12239, 12244, 12250, 12256, 12262, 12267, 12272, 12277, 12282, 12288,
+ 12297, 12305, 0, 12311, 12317, 12321, 12325, 12329, 12334, 12337, 12341,
+ 12344, 12348, 12351, 12355, 12359, 12363, 12368, 12373, 12376, 12380,
+ 12385, 12390, 12393, 12397, 12400, 12404, 12408, 12412, 12416, 12420,
+ 12424, 12428, 12432, 12436, 12440, 12444, 12448, 12452, 12456, 12460,
+ 12464, 12468, 12472, 12475, 12479, 12482, 12486, 12490, 12494, 12497,
+ 12500, 12503, 12507, 12511, 12515, 12519, 12523, 12527, 12531, 12534,
+ 12537, 12542, 12547, 12551, 12555, 12560, 12564, 12569, 12573, 12578,
+ 12583, 12589, 12595, 12601, 12605, 12610, 12616, 12622, 12626, 12631,
+ 12635, 12641, 12646, 12649, 12655, 12661, 12666, 12671, 12678, 12683,
+ 12688, 12692, 12696, 12700, 12704, 12708, 12712, 12716, 12720, 12725,
+ 12730, 12735, 12741, 12744, 12748, 12752, 12755, 12758, 12761, 12764,
+ 12767, 12770, 12773, 12776, 12779, 12783, 12790, 12795, 12799, 12803,
+ 12807, 12811, 0, 12815, 12819, 12823, 12827, 12831, 12837, 12841, 0,
+ 12845, 12849, 12853, 0, 12857, 12860, 12864, 12867, 12871, 12874, 12878,
+ 12882, 0, 0, 12886, 12889, 0, 0, 12893, 12896, 12900, 12903, 12907,
+ 12911, 12915, 12919, 12923, 12927, 12931, 12935, 12939, 12943, 12947,
+ 12951, 12955, 12959, 12963, 12967, 12971, 12975, 0, 12978, 12981, 12985,
+ 12989, 12993, 12996, 12999, 0, 13002, 0, 0, 0, 13006, 13010, 13014,
+ 13017, 0, 0, 13020, 13024, 13028, 13033, 13037, 13042, 13046, 13051,
+ 13056, 0, 0, 13062, 13066, 0, 0, 13071, 13075, 13080, 13084, 0, 0, 0, 0,
+ 0, 0, 0, 0, 13090, 0, 0, 0, 0, 13096, 13100, 0, 13104, 13108, 13113,
+ 13118, 13123, 0, 0, 13129, 13133, 13136, 13139, 13142, 13145, 13148,
+ 13151, 13154, 13157, 13160, 13169, 13178, 13182, 13186, 13192, 13198,
+ 13204, 13210, 13224, 13231, 13234, 0, 0, 0, 0, 0, 13238, 13244, 13248, 0,
+ 13252, 13255, 13259, 13262, 13266, 13269, 0, 0, 0, 0, 13273, 13277, 0, 0,
+ 13281, 13285, 13289, 13292, 13296, 13300, 13304, 13308, 13312, 13316,
+ 13320, 13324, 13328, 13332, 13336, 13340, 13344, 13348, 13352, 13356,
+ 13360, 13364, 0, 13367, 13370, 13374, 13378, 13382, 13385, 13388, 0,
+ 13391, 13395, 0, 13399, 13403, 0, 13407, 13410, 0, 0, 13413, 0, 13417,
+ 13422, 13426, 13431, 13435, 0, 0, 0, 0, 13440, 13445, 0, 0, 13450, 13455,
+ 13460, 0, 0, 0, 13464, 0, 0, 0, 0, 0, 0, 0, 13468, 13472, 13476, 13480,
+ 0, 13484, 0, 0, 0, 0, 0, 0, 0, 13488, 13492, 13495, 13498, 13501, 13504,
+ 13507, 13510, 13513, 13516, 13519, 13522, 13525, 13528, 13531, 13536, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13540, 13544, 13548, 0, 13552, 13555,
+ 13559, 13562, 13566, 13569, 13573, 13577, 13581, 0, 13586, 13589, 13593,
+ 0, 13598, 13601, 13605, 13608, 13612, 13616, 13620, 13624, 13628, 13632,
+ 13636, 13640, 13644, 13648, 13652, 13656, 13660, 13664, 13668, 13672,
+ 13676, 13680, 0, 13683, 13686, 13690, 13694, 13698, 13701, 13704, 0,
+ 13707, 13711, 0, 13715, 13719, 13723, 13727, 13730, 0, 0, 13733, 13737,
+ 13741, 13746, 13750, 13755, 13759, 13764, 13769, 13775, 0, 13781, 13785,
+ 13790, 0, 13796, 13800, 13805, 0, 0, 13809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 13812, 13817, 13822, 13827, 0, 0, 13833, 13837, 13840,
+ 13843, 13846, 13849, 13852, 13855, 13858, 13861, 13864, 13868, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13872, 13876, 13880, 0, 13884, 13887,
+ 13891, 13894, 13898, 13901, 13905, 13909, 0, 0, 13913, 13916, 0, 0,
+ 13920, 13923, 13927, 13930, 13934, 13938, 13942, 13946, 13950, 13954,
+ 13958, 13962, 13966, 13970, 13974, 13978, 13982, 13986, 13990, 13994,
+ 13998, 14002, 0, 14005, 14008, 14012, 14016, 14020, 14023, 14026, 0,
+ 14029, 14033, 0, 14037, 14041, 14045, 14049, 14052, 0, 0, 14055, 14059,
+ 14063, 14068, 14072, 14077, 14081, 14086, 14091, 0, 0, 14097, 14101, 0,
+ 0, 14106, 14110, 14115, 0, 0, 0, 0, 0, 0, 0, 0, 14119, 14125, 0, 0, 0, 0,
+ 14131, 14135, 0, 14139, 14143, 14148, 14153, 14158, 0, 0, 14164, 14168,
+ 14171, 14174, 14177, 14180, 14183, 14186, 14189, 14192, 14195, 14198,
+ 14202, 14208, 14214, 14220, 14226, 14232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 14238, 14242, 0, 14246, 14249, 14253, 14256, 14260, 14263, 0, 0, 0,
+ 14267, 14270, 14274, 0, 14278, 14281, 14285, 14289, 0, 0, 0, 14292,
+ 14296, 0, 14300, 0, 14304, 14308, 0, 0, 0, 14312, 14316, 0, 0, 0, 14320,
+ 14323, 14327, 0, 0, 0, 14330, 14333, 14336, 14339, 14343, 14347, 14351,
+ 14355, 14359, 14363, 14367, 14370, 0, 0, 0, 0, 14373, 14378, 14382,
+ 14387, 14391, 0, 0, 0, 14396, 14400, 14405, 0, 14410, 14414, 14419,
+ 14424, 0, 0, 14428, 0, 0, 0, 0, 0, 0, 14431, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 14437, 14441, 14444, 14447, 14450, 14453, 14456, 14459,
+ 14462, 14465, 14468, 14472, 14477, 14482, 14486, 14490, 14494, 14498,
+ 14502, 14507, 14511, 0, 0, 0, 0, 0, 0, 14514, 14518, 14522, 0, 14526,
+ 14529, 14533, 14536, 14540, 14543, 14547, 14551, 0, 14555, 14558, 14562,
+ 0, 14566, 14569, 14573, 14577, 14580, 14584, 14588, 14592, 14596, 14600,
+ 14604, 14608, 14612, 14616, 14620, 14624, 14628, 14632, 14636, 14640,
+ 14644, 14648, 14652, 0, 14655, 14658, 14662, 14666, 14670, 14673, 14676,
+ 14679, 14683, 14687, 0, 14691, 14695, 14699, 14703, 14706, 0, 0, 0,
+ 14709, 14713, 14718, 14722, 14727, 14731, 14736, 14741, 0, 14747, 14751,
+ 14756, 0, 14761, 14765, 14770, 14775, 0, 0, 0, 0, 0, 0, 0, 14779, 14783,
+ 0, 14789, 14793, 0, 0, 0, 0, 0, 0, 14797, 14802, 14807, 14812, 0, 0,
+ 14818, 14822, 14825, 14828, 14831, 14834, 14837, 14840, 14843, 14846, 0,
+ 0, 0, 0, 0, 0, 0, 0, 14849, 14862, 14874, 14886, 14898, 14910, 14922,
+ 14934, 0, 0, 14938, 14942, 0, 14946, 14949, 14953, 14956, 14960, 14963,
+ 14967, 14971, 0, 14975, 14978, 14982, 0, 14986, 14989, 14993, 14997,
+ 15000, 15004, 15008, 15012, 15016, 15020, 15024, 15028, 15032, 15036,
+ 15040, 15044, 15048, 15052, 15056, 15060, 15064, 15068, 15072, 0, 15075,
+ 15078, 15082, 15086, 15090, 15093, 15096, 15099, 15103, 15107, 0, 15111,
+ 15115, 15119, 15123, 15126, 0, 0, 15129, 15133, 15137, 15142, 15146,
+ 15151, 15155, 15160, 15165, 0, 15171, 15175, 15180, 0, 15185, 15189,
+ 15194, 15199, 0, 0, 0, 0, 0, 0, 0, 15203, 15207, 0, 0, 0, 0, 0, 0, 0,
+ 15213, 0, 15217, 15222, 15227, 15232, 0, 0, 15238, 15242, 15245, 15248,
+ 15251, 15254, 15257, 15260, 15263, 15266, 0, 15269, 15273, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15277, 15281, 0, 15285, 15288, 15292,
+ 15295, 15299, 15302, 15306, 15310, 0, 15314, 15317, 15321, 0, 15325,
+ 15328, 15332, 15336, 15339, 15343, 15347, 15351, 15355, 15359, 15363,
+ 15367, 15371, 15375, 15379, 15383, 15387, 15391, 15395, 15399, 15403,
+ 15407, 15411, 15414, 15418, 15421, 15425, 15429, 15433, 15436, 15439,
+ 15442, 15446, 15450, 15454, 15458, 15462, 15466, 15470, 15473, 15476, 0,
+ 0, 15480, 15484, 15489, 15493, 15498, 15502, 15507, 15512, 0, 15518,
+ 15522, 15527, 0, 15532, 15536, 15541, 15546, 15550, 0, 0, 0, 0, 0, 0, 0,
+ 0, 15555, 0, 0, 0, 0, 0, 0, 0, 0, 15561, 15566, 15571, 15576, 0, 0,
+ 15582, 15586, 15589, 15592, 15595, 15598, 15601, 15604, 15607, 15610,
+ 15613, 15617, 15622, 15627, 15633, 15639, 0, 0, 0, 15645, 15649, 15655,
+ 15661, 15667, 15672, 15678, 0, 0, 15684, 15688, 0, 15692, 15696, 15700,
+ 15704, 15708, 15712, 15716, 15720, 15724, 15728, 15732, 15736, 15740,
+ 15744, 15748, 15752, 15756, 15760, 0, 0, 0, 15764, 15770, 15776, 15782,
+ 15788, 15794, 15800, 15806, 15812, 15818, 15824, 15830, 15838, 15844,
+ 15850, 15856, 15862, 15868, 15874, 15880, 15886, 15892, 15898, 15904, 0,
+ 15910, 15916, 15922, 15928, 15934, 15940, 15944, 15950, 15954, 0, 15958,
+ 0, 0, 15964, 15968, 15974, 15980, 15986, 15990, 15996, 0, 0, 0, 16000, 0,
+ 0, 0, 0, 16004, 16009, 16016, 16023, 16030, 16037, 0, 16044, 0, 16051,
+ 16056, 16061, 16068, 16075, 16084, 16095, 16104, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16109, 16116, 16123, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 16128, 16134, 16140, 16146, 16152, 16158, 16164, 16170,
+ 16176, 16182, 16188, 16194, 16200, 16206, 16212, 16218, 16224, 16230,
+ 16236, 16242, 16248, 16254, 16260, 16266, 16272, 16278, 16284, 16290,
+ 16296, 16302, 16308, 16314, 16320, 16325, 16331, 16337, 16341, 16347,
+ 16351, 16357, 16363, 16369, 16375, 16381, 16387, 16392, 16398, 16402,
+ 16407, 16413, 16419, 16425, 16430, 16436, 16442, 16448, 16453, 16459, 0,
+ 0, 0, 0, 16463, 16469, 16474, 16480, 16485, 16493, 16501, 16505, 16509,
+ 16513, 16519, 16525, 16531, 16537, 16541, 16545, 16549, 16553, 16557,
+ 16560, 16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16588, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16592, 16597, 0, 16604, 0, 0, 16611,
+ 16616, 0, 16621, 0, 0, 16628, 0, 0, 0, 0, 0, 0, 16633, 16638, 16642,
+ 16649, 0, 16656, 16661, 16666, 16671, 16678, 16685, 16692, 0, 16699,
+ 16704, 16709, 0, 16716, 0, 16723, 0, 0, 16728, 16735, 0, 16742, 16746,
+ 16753, 16757, 16762, 16770, 16776, 16782, 16787, 16793, 16799, 16805,
+ 16810, 0, 16816, 16824, 16831, 0, 0, 16838, 16843, 16849, 16854, 16860,
+ 0, 16866, 0, 16872, 16879, 16886, 16893, 16900, 16905, 0, 0, 16909,
+ 16914, 16918, 16922, 16926, 16930, 16934, 16938, 16942, 16946, 0, 0,
+ 16950, 16956, 16962, 16969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16976, 16980, 16991,
+ 17006, 17021, 17031, 17042, 17055, 17066, 17072, 17080, 17090, 17096,
+ 17104, 17108, 17114, 17120, 17128, 17138, 17146, 17159, 17165, 17173,
+ 17181, 17193, 17200, 17208, 17216, 17224, 17232, 17240, 17248, 17258,
+ 17262, 17265, 17268, 17271, 17274, 17277, 17280, 17283, 17286, 17289,
+ 17293, 17297, 17301, 17305, 17309, 17313, 17317, 17321, 17325, 17330,
+ 17336, 17346, 17360, 17370, 17376, 17382, 17390, 17398, 17406, 17414,
+ 17420, 17426, 17429, 17433, 17437, 17441, 17445, 17449, 17453, 0, 17457,
+ 17461, 17465, 17469, 17473, 17477, 17481, 17485, 17489, 17493, 17497,
+ 17500, 17503, 17507, 17511, 17515, 17518, 17522, 17526, 17530, 17534,
+ 17538, 17542, 17546, 17550, 17553, 17556, 17560, 17564, 17568, 17571,
+ 17574, 17577, 17581, 17586, 17590, 0, 0, 0, 0, 17594, 17599, 17603,
+ 17608, 17612, 17617, 17622, 17628, 17633, 17639, 17643, 17648, 17652,
+ 17657, 17667, 17673, 17679, 17686, 17696, 17702, 17706, 17710, 17716,
+ 17722, 17730, 17736, 17744, 17752, 17760, 17770, 17778, 17788, 17793,
+ 17799, 17805, 17811, 17817, 17823, 17829, 0, 17835, 17841, 17847, 17853,
+ 17859, 17865, 17871, 17877, 17883, 17889, 17895, 17900, 17905, 17911,
+ 17917, 17923, 17928, 17934, 17940, 17946, 17952, 17958, 17964, 17970,
+ 17976, 17981, 17986, 17992, 17998, 18004, 18009, 18014, 18019, 18025,
+ 18033, 18040, 0, 18047, 18054, 18067, 18074, 18081, 18089, 18097, 18103,
+ 18109, 18115, 18125, 18130, 18136, 18146, 18156, 0, 18166, 18176, 18184,
+ 18196, 18208, 18214, 18228, 18243, 18248, 18253, 18261, 18269, 18277, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18285, 18288, 18292, 18296, 18300,
+ 18304, 18308, 18312, 18316, 18320, 18324, 18328, 18332, 18336, 18340,
+ 18344, 18348, 18352, 18356, 18360, 18364, 18367, 18370, 18374, 18378,
+ 18382, 18385, 18388, 18391, 18395, 18399, 18402, 18405, 18409, 18412,
+ 18417, 18420, 18424, 18427, 18431, 18434, 18439, 18442, 18446, 18453,
+ 18458, 18462, 18467, 18471, 18476, 18480, 18485, 18492, 18498, 18503,
+ 18507, 18511, 18515, 18519, 18523, 18528, 18533, 18539, 18544, 18549,
+ 18553, 18556, 18559, 18562, 18565, 18568, 18571, 18574, 18577, 18580,
+ 18586, 18590, 18594, 18598, 18602, 18606, 18610, 18614, 18618, 18623,
+ 18627, 18632, 18637, 18643, 18648, 18654, 18660, 18666, 18672, 18678,
+ 18685, 18692, 18700, 18708, 18717, 18726, 18737, 18747, 18757, 18768,
+ 18779, 18789, 18799, 18809, 18819, 18829, 18839, 18849, 18859, 18867,
+ 18874, 18880, 18887, 18892, 18898, 18904, 18910, 18916, 18922, 18928,
+ 18933, 18939, 18945, 18951, 18957, 18962, 18970, 18977, 18983, 18990,
+ 18998, 19004, 19010, 19016, 19022, 19030, 19038, 19048, 19056, 19064,
+ 19070, 19075, 19080, 19085, 19090, 19095, 19100, 19105, 19110, 19115,
+ 19121, 19127, 19133, 19140, 19145, 19151, 19156, 19161, 19166, 19171,
+ 19176, 19181, 19186, 19191, 19196, 19201, 19206, 19211, 19216, 19221,
+ 19226, 19231, 19236, 19241, 19246, 19251, 19256, 19261, 19266, 19271,
+ 19276, 19281, 19286, 19291, 19296, 19301, 19306, 19311, 19316, 19321,
+ 19326, 19331, 19336, 0, 19341, 0, 0, 0, 0, 0, 19346, 0, 0, 19351, 19355,
+ 19359, 19363, 19367, 19371, 19375, 19379, 19383, 19387, 19391, 19395,
+ 19399, 19403, 19407, 19411, 19415, 19419, 19423, 19427, 19431, 19435,
+ 19439, 19443, 19447, 19451, 19455, 19459, 19463, 19467, 19471, 19475,
+ 19479, 19483, 19487, 19491, 19495, 19499, 19503, 19507, 19511, 19515,
+ 19521, 19525, 19530, 19535, 19539, 19544, 19549, 19553, 19557, 19561,
+ 19565, 19569, 19573, 19577, 19581, 19585, 19589, 19593, 19597, 19601,
+ 19605, 19609, 19613, 19617, 19621, 19625, 19629, 19633, 19637, 19641,
+ 19645, 19649, 19653, 19657, 19661, 19665, 19669, 19673, 19677, 19681,
+ 19685, 19689, 19693, 19697, 19701, 19705, 19709, 19713, 19717, 19721,
+ 19725, 19729, 19733, 19737, 19741, 19745, 19749, 19753, 19757, 19761,
+ 19765, 19769, 19773, 19777, 19781, 19785, 19789, 19793, 19797, 19801,
+ 19805, 19809, 19813, 19817, 19821, 19825, 19829, 19833, 19837, 19841,
+ 19845, 19849, 19853, 19857, 19861, 19865, 19869, 19873, 19877, 19881,
+ 19885, 19889, 19893, 19897, 19901, 19905, 19909, 19913, 19917, 19921,
+ 19925, 19929, 19933, 19937, 19940, 19944, 19947, 19951, 19955, 19958,
+ 19962, 19966, 19969, 19973, 19977, 19981, 19985, 19988, 19992, 19996,
+ 20000, 20004, 20008, 20012, 20015, 20019, 20023, 20027, 20031, 20035,
+ 20039, 20043, 20047, 20051, 20055, 20059, 20063, 20067, 20071, 20075,
+ 20079, 20083, 20087, 20091, 20095, 20099, 20103, 20107, 20111, 20115,
+ 20119, 20123, 20127, 20131, 20135, 20139, 20143, 20147, 20151, 20155,
+ 20159, 20163, 20167, 20171, 20175, 20179, 20183, 20187, 20191, 20195,
+ 20199, 20203, 20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235,
+ 20239, 20243, 20247, 20251, 20255, 20259, 20263, 20267, 20271, 20275,
+ 20279, 20283, 20287, 20291, 20295, 20299, 20303, 20307, 20311, 20315,
+ 20319, 20323, 20327, 20331, 20335, 20339, 20343, 20347, 20351, 20355,
+ 20359, 20363, 20367, 20371, 20375, 20379, 20383, 20387, 20391, 20395,
+ 20399, 20403, 20407, 20411, 20415, 20419, 20423, 20427, 20431, 20435,
+ 20439, 20443, 20447, 20451, 20455, 20459, 20463, 20467, 20471, 20475,
+ 20479, 20483, 20487, 20491, 20495, 20499, 20503, 20507, 20511, 20515,
+ 20519, 20523, 20527, 20531, 20535, 20539, 20543, 20547, 20551, 20555,
+ 20559, 20563, 20567, 20570, 20574, 20578, 20582, 20586, 20590, 20594,
+ 20598, 20602, 20606, 20610, 20614, 20618, 20622, 20626, 20630, 20634,
+ 20638, 20642, 20646, 20650, 20654, 20658, 20662, 20665, 20669, 20673,
+ 20677, 20681, 20685, 20689, 20693, 20697, 20701, 20705, 20709, 20713,
+ 20717, 20721, 20725, 20728, 20732, 20736, 20740, 20744, 20748, 20752,
+ 20756, 20759, 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791,
+ 20795, 20799, 20803, 20807, 20811, 20815, 20819, 20823, 20827, 20831,
+ 20835, 20839, 20843, 20847, 20851, 0, 20855, 20859, 20863, 20867, 0, 0,
+ 20871, 20875, 20879, 20883, 20887, 20891, 20895, 0, 20899, 0, 20903,
+ 20907, 20911, 20915, 0, 0, 20919, 20923, 20927, 20931, 20935, 20939,
+ 20943, 20947, 20951, 20955, 20959, 20963, 20967, 20971, 20975, 20979,
+ 20983, 20987, 20991, 20995, 20999, 21003, 21007, 21010, 21014, 21018,
+ 21022, 21026, 21030, 21034, 21038, 21042, 21046, 21050, 21054, 21058,
+ 21062, 21066, 21070, 21074, 21078, 0, 21082, 21086, 21090, 21094, 0, 0,
+ 21098, 21101, 21105, 21109, 21113, 21117, 21121, 21125, 21129, 21133,
+ 21137, 21141, 21145, 21149, 21153, 21157, 21161, 21166, 21171, 21176,
+ 21182, 21188, 21193, 21198, 21204, 21207, 21211, 21215, 21219, 21223,
+ 21227, 21231, 21235, 0, 21239, 21243, 21247, 21251, 0, 0, 21255, 21259,
+ 21263, 21267, 21271, 21275, 21279, 0, 21283, 0, 21287, 21291, 21295,
+ 21299, 0, 0, 21303, 21307, 21311, 21315, 21319, 21323, 21327, 21331,
+ 21335, 21340, 21345, 21350, 21356, 21362, 21367, 0, 21372, 21376, 21380,
+ 21384, 21388, 21392, 21396, 21400, 21404, 21408, 21412, 21416, 21420,
+ 21424, 21428, 21432, 21436, 21439, 21443, 21447, 21451, 21455, 21459,
+ 21463, 21467, 21471, 21475, 21479, 21483, 21487, 21491, 21495, 21499,
+ 21503, 21507, 21511, 21515, 21519, 21523, 21527, 21531, 21535, 21539,
+ 21543, 21547, 21551, 21555, 21559, 21563, 21567, 21571, 21575, 21579,
+ 21583, 21587, 21591, 21595, 0, 21599, 21603, 21607, 21611, 0, 0, 21615,
+ 21619, 21623, 21627, 21631, 21635, 21639, 21643, 21647, 21651, 21655,
+ 21659, 21663, 21667, 21671, 21675, 21679, 21683, 21687, 21691, 21695,
+ 21699, 21703, 21707, 21711, 21715, 21719, 21723, 21727, 21731, 21735,
+ 21739, 21743, 21747, 21751, 21755, 21759, 21763, 21767, 21771, 21775,
+ 21779, 21783, 21787, 21791, 21795, 21799, 21803, 21807, 21811, 21815,
+ 21819, 21823, 21827, 21831, 21835, 21839, 21842, 21846, 21850, 21854,
+ 21858, 21862, 21866, 21870, 21874, 21878, 0, 0, 21882, 21891, 21897,
+ 21902, 21906, 21909, 21914, 21917, 21920, 21923, 21928, 21932, 21937,
+ 21940, 21943, 21946, 21949, 21952, 21955, 21958, 21961, 21964, 21968,
+ 21972, 21976, 21980, 21984, 21988, 21992, 21996, 22000, 22004, 0, 0, 0,
+ 22010, 22016, 22020, 22024, 22028, 22034, 22038, 22042, 22046, 22052,
+ 22056, 22060, 22064, 22070, 22074, 22078, 22082, 22088, 22094, 22100,
+ 22108, 22114, 22120, 22126, 22132, 22138, 0, 0, 0, 0, 0, 0, 22144, 22147,
+ 22150, 22153, 22156, 22159, 22163, 22167, 22170, 22174, 22178, 22182,
+ 22186, 22190, 22193, 22197, 22201, 22205, 22209, 22213, 22217, 22221,
+ 22225, 22229, 22233, 22237, 22240, 22244, 22248, 22252, 22256, 22259,
+ 22263, 22267, 22271, 22275, 22279, 22283, 22287, 22291, 22295, 22299,
+ 22303, 22307, 22311, 22314, 22318, 22322, 22326, 22330, 22334, 22338,
+ 22342, 22346, 22350, 22354, 22358, 22362, 22366, 22370, 22374, 22378,
+ 22382, 22386, 22390, 22394, 22398, 22402, 22406, 22410, 22414, 22418,
+ 22422, 22426, 22430, 22434, 22438, 22442, 22446, 22450, 22453, 22457,
+ 22461, 22465, 22469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22473, 22477,
+ 22480, 22484, 22487, 22491, 22494, 22498, 22504, 22509, 22513, 22516,
+ 22520, 22524, 22529, 22533, 22538, 22542, 22547, 22551, 22556, 22560,
+ 22565, 22571, 22575, 22580, 22584, 22589, 22595, 22599, 22605, 22611,
+ 22615, 22620, 22628, 22636, 22643, 22648, 22653, 22662, 22669, 22676,
+ 22681, 22687, 22691, 22695, 22699, 22703, 22707, 22711, 22715, 22719,
+ 22723, 22727, 22733, 22738, 22743, 22746, 22750, 22754, 22759, 22763,
+ 22768, 22772, 22777, 22781, 22786, 22790, 22795, 22799, 22804, 22808,
+ 22813, 22819, 22823, 22828, 22833, 22837, 22841, 22845, 22849, 22852,
+ 22856, 22862, 22867, 22872, 22876, 22880, 22884, 22889, 22893, 22898,
+ 22902, 22907, 22910, 22914, 22918, 22923, 22927, 22932, 22936, 22941,
+ 22947, 22951, 22955, 22959, 22963, 22967, 22971, 22975, 22979, 22983,
+ 22987, 22991, 22997, 23000, 23004, 23008, 23013, 23017, 23022, 23026,
+ 23031, 23035, 23040, 23044, 23049, 23053, 23058, 23062, 23067, 23073,
+ 23077, 23081, 23087, 23093, 23099, 23105, 23109, 23113, 23117, 23121,
+ 23125, 23129, 23135, 23139, 23143, 23147, 23152, 23156, 23161, 23165,
+ 23170, 23174, 23179, 23183, 23188, 23192, 23197, 23201, 23206, 23212,
+ 23216, 23222, 23226, 23230, 23234, 23238, 23242, 23246, 23252, 23255,
+ 23259, 23263, 23268, 23272, 23277, 23281, 23286, 23290, 23295, 23299,
+ 23304, 23308, 23313, 23317, 23322, 23328, 23331, 23335, 23339, 23344,
+ 23349, 23353, 23357, 23361, 23365, 23369, 23373, 23379, 23382, 23386,
+ 23390, 23395, 23399, 23404, 23408, 23413, 23419, 23423, 23428, 23432,
+ 23436, 23440, 23444, 23448, 23452, 23456, 23462, 23466, 23470, 23474,
+ 23479, 23483, 23488, 23492, 23497, 23501, 23506, 23510, 23515, 23519,
+ 23524, 23528, 23533, 23536, 23540, 23544, 23548, 23552, 23556, 23560,
+ 23564, 23568, 23574, 23577, 23581, 23585, 23590, 23594, 23599, 23603,
+ 23608, 23612, 23617, 23621, 23626, 23630, 23635, 23639, 23644, 23650,
+ 23654, 23660, 23664, 23670, 23676, 23682, 23688, 23694, 23700, 23706,
+ 23712, 23716, 23720, 23724, 23728, 23732, 23736, 23740, 23744, 23749,
+ 23753, 23758, 23762, 23767, 23771, 23776, 23780, 23785, 23789, 23794,
+ 23798, 23803, 23807, 23811, 23815, 23819, 23823, 23827, 23831, 23837,
+ 23840, 23844, 23848, 23853, 23857, 23862, 23866, 23871, 23875, 23880,
+ 23884, 23889, 23893, 23898, 23902, 23907, 23913, 23917, 23923, 23928,
+ 23934, 23938, 23944, 23949, 23953, 23957, 23961, 23965, 23969, 23974,
+ 23977, 23981, 23986, 23990, 23995, 23998, 24002, 24006, 24010, 24014,
+ 24018, 24022, 24026, 24030, 24034, 24038, 24042, 24047, 24051, 24055,
+ 24061, 24065, 24071, 24075, 24081, 24085, 24089, 24093, 24097, 24101,
+ 24106, 24110, 24114, 24118, 24122, 24126, 24130, 24134, 24138, 24142,
+ 24146, 24152, 24158, 24164, 24170, 24176, 24181, 24187, 24193, 24199,
+ 24203, 24207, 24211, 24215, 24219, 24223, 24227, 24231, 24235, 24239,
+ 24243, 24247, 24251, 24256, 24261, 24266, 24270, 24274, 24278, 24282,
+ 24286, 24290, 24294, 24298, 24302, 24306, 24312, 24318, 24324, 24330,
+ 24336, 24342, 24348, 24354, 24360, 24364, 24368, 24372, 24376, 24380,
+ 24384, 24388, 24394, 24400, 24406, 24412, 24418, 24424, 24430, 24436,
+ 24442, 24447, 24452, 24457, 24462, 24468, 24474, 24480, 24486, 24492,
+ 24498, 24504, 24509, 24515, 24521, 24527, 24532, 24538, 24544, 24550,
+ 24555, 24560, 24565, 24570, 24575, 24580, 24585, 24590, 24595, 24600,
+ 24605, 24610, 24614, 24619, 24624, 24629, 24634, 24639, 24644, 24649,
+ 24654, 24659, 24664, 24669, 24674, 24679, 24684, 24689, 24694, 24699,
+ 24704, 24709, 24714, 24719, 24724, 24729, 24734, 24739, 24744, 24749,
+ 24754, 24759, 24763, 24768, 24773, 24778, 24783, 24788, 24793, 24798,
+ 24803, 24808, 24813, 24818, 24823, 24828, 24833, 24838, 24843, 24848,
+ 24853, 24858, 24863, 24868, 24873, 24878, 24883, 24888, 24892, 24897,
+ 24902, 24907, 24912, 24917, 24921, 24926, 24931, 24936, 24941, 24946,
+ 24950, 24955, 24961, 24966, 24971, 24976, 24981, 24987, 24992, 24997,
+ 25002, 25007, 25012, 25017, 25022, 25027, 25032, 25037, 25042, 25047,
+ 25052, 25057, 25062, 25067, 25072, 25077, 25082, 25087, 25092, 25097,
+ 25102, 25107, 25112, 25117, 25122, 25127, 25132, 25137, 25142, 25147,
+ 25152, 25157, 25162, 25167, 25172, 25177, 25182, 25187, 25192, 25197,
+ 25202, 25207, 25213, 25218, 25223, 25228, 25233, 25238, 25243, 25248,
+ 25253, 25258, 25263, 25268, 25272, 25277, 25282, 25287, 25292, 25297,
+ 25302, 25307, 25312, 25317, 25322, 25327, 25332, 25337, 25342, 25347,
+ 25352, 25357, 25362, 25367, 25372, 25377, 25382, 25387, 25392, 25397,
+ 25402, 25408, 25412, 25416, 25420, 25424, 25428, 25432, 25436, 25440,
+ 25446, 25452, 25458, 25464, 25470, 25476, 25482, 25489, 25495, 25500,
+ 25505, 25510, 25515, 25520, 25525, 25530, 25535, 25540, 25545, 25550,
+ 25555, 25560, 25565, 25570, 25575, 25580, 25585, 25590, 25595, 25600,
+ 25605, 25610, 25615, 25620, 25625, 25630, 25635, 0, 0, 0, 25642, 25652,
+ 25656, 25663, 25667, 25671, 25675, 25683, 25687, 25692, 25697, 25702,
+ 25706, 25711, 25716, 25719, 25723, 25727, 25736, 25740, 25744, 25750,
+ 25754, 25758, 25766, 25770, 25778, 25784, 25790, 25796, 25802, 25812,
+ 25818, 25822, 25831, 25834, 25840, 25844, 25850, 25855, 25861, 25869,
+ 25875, 25881, 25889, 25895, 25899, 25903, 25913, 25919, 25923, 25933,
+ 25939, 25943, 25947, 25954, 25961, 25966, 25971, 25980, 25984, 25988,
+ 25992, 26000, 26007, 26011, 26015, 26019, 26023, 26027, 26031, 26035,
+ 26039, 26043, 26047, 26051, 26056, 26061, 26066, 26070, 26074, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26078, 26082, 26086, 26090, 26094,
+ 26099, 26104, 26109, 26114, 26118, 26122, 26127, 26131, 0, 26135, 26140,
+ 26145, 26149, 26153, 26158, 26163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 26168, 26172, 26176, 26180, 26184, 26189, 26194, 26199, 26204, 26208,
+ 26212, 26217, 26221, 26225, 26229, 26234, 26239, 26243, 26247, 26252,
+ 26257, 26262, 26268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26273, 26277, 26281,
+ 26285, 26289, 26294, 26299, 26304, 26309, 26313, 26317, 26322, 26326,
+ 26330, 26334, 26339, 26344, 26348, 26352, 26357, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 26362, 26366, 26370, 26374, 26378, 26383, 26388, 26393,
+ 26398, 26402, 26406, 26411, 26415, 0, 26419, 26424, 26429, 0, 26433,
+ 26438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26443, 26446, 26450, 26454,
+ 26458, 26462, 26466, 26470, 26474, 26478, 26482, 26486, 26490, 26494,
+ 26498, 26502, 26506, 26510, 26513, 26517, 26521, 26525, 26529, 26533,
+ 26537, 26541, 26545, 26549, 26553, 26557, 26561, 26565, 26568, 26571,
+ 26575, 26579, 26585, 26591, 26597, 26603, 26609, 26615, 26621, 26627,
+ 26633, 26639, 26645, 26651, 26657, 26663, 26672, 26681, 26687, 26693,
+ 26699, 26704, 26708, 26713, 26718, 26723, 26727, 26732, 26737, 26742,
+ 26746, 26751, 26755, 26760, 26765, 26770, 26775, 26779, 26783, 26787,
+ 26791, 26795, 26799, 26803, 26807, 26811, 26815, 26821, 26825, 26829,
+ 26833, 26837, 26841, 26849, 26855, 26859, 26865, 26869, 26875, 26879, 0,
+ 0, 26883, 26887, 26890, 26893, 26896, 26899, 26902, 26905, 26908, 26911,
+ 0, 0, 0, 0, 0, 0, 26914, 26922, 26930, 26938, 26946, 26954, 26962, 26970,
+ 26978, 26986, 0, 0, 0, 0, 0, 0, 26994, 26997, 27000, 27003, 27008, 27011,
+ 27016, 27023, 27031, 27036, 27043, 27046, 27053, 27060, 27067, 0, 27071,
+ 27075, 27078, 27081, 27084, 27087, 27090, 27093, 27096, 27099, 0, 0, 0,
+ 0, 0, 0, 27102, 27105, 27108, 27111, 27114, 27117, 27121, 27125, 27129,
+ 27132, 27136, 27140, 27143, 27147, 27151, 27154, 27158, 27161, 27165,
+ 27169, 27173, 27177, 27181, 27184, 27187, 27191, 27195, 27198, 27202,
+ 27206, 27210, 27214, 27218, 27222, 27226, 27230, 27237, 27242, 27247,
+ 27252, 27257, 27263, 27269, 27275, 27281, 27286, 27292, 27298, 27303,
+ 27309, 27315, 27321, 27327, 27333, 27338, 27344, 27349, 27355, 27361,
+ 27367, 27373, 27379, 27384, 27389, 27395, 27401, 27406, 27412, 27417,
+ 27423, 27428, 27433, 27439, 27445, 27451, 27457, 27463, 27469, 27475,
+ 27481, 27487, 27493, 27499, 27505, 27510, 27515, 27520, 27526, 0, 0, 0,
+ 0, 0, 0, 0, 0, 27532, 27541, 27550, 27558, 27566, 27576, 27584, 27593,
+ 27600, 27607, 27614, 27622, 27630, 27638, 27646, 27654, 27662, 27670,
+ 27678, 27685, 27693, 27701, 27709, 27717, 27725, 27735, 27745, 27755,
+ 27765, 27775, 27785, 27795, 27805, 27815, 27825, 27835, 27845, 27855,
+ 27865, 27873, 27881, 27891, 27899, 0, 0, 0, 0, 0, 27909, 27913, 27917,
+ 27921, 27925, 27929, 27933, 27937, 27941, 27945, 27949, 27953, 27957,
+ 27961, 27965, 27969, 27973, 27977, 27981, 27985, 27989, 27993, 27997,
+ 28001, 28007, 28011, 28017, 28021, 28027, 28031, 28037, 28041, 28045,
+ 28049, 28053, 28057, 28061, 28067, 28073, 28079, 28085, 28090, 28096,
+ 28102, 28108, 28114, 28120, 28126, 28133, 28139, 28144, 28149, 28153,
+ 28157, 28161, 28165, 28169, 28173, 28177, 28183, 28189, 28195, 28200,
+ 28207, 28212, 28217, 28223, 28228, 28235, 28242, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 28249, 28255, 28259, 28264, 28269, 28274, 28279, 28284, 28289,
+ 28294, 28299, 28304, 28309, 28314, 28319, 28324, 28328, 28332, 28337,
+ 28342, 28347, 28351, 28355, 28359, 28364, 28369, 28374, 28379, 28383, 0,
+ 0, 0, 28387, 28392, 28397, 28402, 28408, 28414, 28420, 28426, 28431,
+ 28436, 28442, 28448, 0, 0, 0, 0, 28455, 28460, 28466, 28472, 28478,
+ 28483, 28488, 28493, 28498, 28504, 28509, 28514, 0, 0, 0, 0, 28519, 0, 0,
+ 0, 28524, 28529, 28534, 28539, 28543, 28547, 28551, 28555, 28559, 28563,
+ 28567, 28571, 28575, 28580, 28586, 28592, 28598, 28603, 28608, 28614,
+ 28620, 28626, 28631, 28637, 28642, 28648, 28654, 28659, 28665, 28671,
+ 28677, 28682, 28687, 28692, 28698, 28704, 28709, 28715, 28720, 28726,
+ 28731, 28737, 0, 0, 28743, 28749, 28755, 28761, 28767, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 28773, 28780, 28787, 28793, 28800, 28807, 28813, 28820,
+ 28827, 28834, 28840, 28846, 28853, 28859, 28865, 28872, 28879, 28885,
+ 28892, 28899, 28905, 28911, 28918, 28924, 28930, 28937, 28943, 28950,
+ 28957, 28964, 28971, 28978, 28985, 28991, 28998, 29005, 29011, 29018,
+ 29025, 29032, 29039, 29046, 29053, 29060, 0, 0, 0, 0, 29067, 29075,
+ 29082, 29089, 29095, 29102, 29108, 29115, 29121, 29128, 29135, 29142,
+ 29149, 29156, 29163, 29170, 29177, 29184, 29191, 29198, 29205, 29211,
+ 29218, 29225, 29232, 29238, 0, 0, 0, 0, 0, 0, 29244, 29250, 29255, 29260,
+ 29265, 29270, 29275, 29280, 29285, 29290, 29295, 0, 0, 0, 29301, 29307,
+ 29313, 29317, 29323, 29329, 29335, 29341, 29347, 29353, 29359, 29365,
+ 29371, 29377, 29383, 29389, 29395, 29401, 29407, 29411, 29417, 29423,
+ 29429, 29435, 29441, 29447, 29453, 29459, 29465, 29471, 29477, 29483,
+ 29489, 29495, 29501, 29505, 29510, 29515, 29520, 29524, 29529, 29533,
+ 29538, 29543, 29548, 29552, 29557, 29562, 29567, 29572, 29577, 29581,
+ 29585, 29590, 29595, 29599, 29603, 29607, 29612, 29617, 29622, 29627, 0,
+ 0, 29633, 29637, 29644, 29649, 29655, 29661, 29666, 29672, 29678, 29683,
+ 29689, 29695, 29701, 29706, 29712, 29717, 29722, 29728, 29733, 29739,
+ 29744, 29750, 29756, 29762, 29768, 29772, 29777, 29782, 29788, 29794,
+ 29799, 29805, 29811, 29815, 29820, 29825, 29829, 29834, 29839, 29844,
+ 29849, 29855, 29861, 29866, 29871, 29876, 29880, 29885, 29889, 29894,
+ 29898, 29903, 29908, 29913, 29918, 29924, 29930, 29937, 29947, 29956,
+ 29963, 29969, 29979, 29984, 29990, 0, 29995, 30000, 30005, 30013, 30019,
+ 30027, 30032, 30038, 30044, 30050, 30055, 30061, 30066, 30073, 30079,
+ 30084, 30090, 30096, 30102, 30109, 30116, 30123, 30128, 30133, 30140,
+ 30147, 30154, 30161, 30168, 0, 0, 30175, 30182, 30189, 30195, 30201,
+ 30207, 30213, 30219, 30225, 30231, 30237, 0, 0, 0, 0, 0, 0, 30243, 30249,
+ 30254, 30259, 30264, 30269, 30274, 30279, 30284, 30289, 0, 0, 0, 0, 0, 0,
+ 30294, 30299, 30304, 30309, 30314, 30319, 30324, 30333, 30340, 30345,
+ 30350, 30355, 30360, 30365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12077, 12083,
- 12087, 12091, 12095, 12100, 12103, 12107, 12110, 12114, 12117, 12121,
- 12125, 12129, 12134, 12139, 12142, 12146, 12151, 12156, 12159, 12163,
- 12166, 12170, 12174, 12178, 12182, 12186, 12190, 12194, 12198, 12202,
- 12206, 12210, 12214, 12218, 12222, 12226, 12230, 12234, 12238, 12241,
- 12245, 12248, 12252, 12256, 12260, 12263, 12266, 12269, 12273, 12277,
- 12281, 12285, 12289, 12293, 12297, 12301, 12304, 12309, 12314, 12318,
- 12322, 12327, 12331, 12336, 12340, 12345, 12350, 12356, 12362, 12368,
- 12372, 12377, 12383, 12389, 12393, 12398, 12402, 12408, 12413, 12416,
- 12422, 12428, 12433, 12438, 12445, 12450, 12455, 12459, 12463, 12467,
- 12471, 12475, 12479, 12483, 12487, 12492, 12497, 12502, 12508, 12511,
- 12515, 12519, 12522, 12525, 12528, 12531, 12534, 12537, 12540, 12543,
- 12546, 12550, 12557, 12562, 12566, 12570, 12574, 12578, 0, 12582, 12586,
- 12590, 12594, 12598, 12604, 12608, 0, 12612, 12616, 12620, 0, 12624,
- 12627, 12631, 12634, 12638, 12641, 12645, 12649, 0, 0, 12653, 12656, 0,
- 0, 12660, 12663, 12667, 12670, 12674, 12678, 12682, 12686, 12690, 12694,
- 12698, 12702, 12706, 12710, 12714, 12718, 12722, 12726, 12730, 12734,
- 12738, 12742, 0, 12745, 12748, 12752, 12756, 12760, 12763, 12766, 0,
- 12769, 0, 0, 0, 12773, 12777, 12781, 12785, 0, 0, 12788, 12792, 12796,
- 12801, 12805, 12810, 12814, 12819, 12824, 0, 0, 12830, 12834, 0, 0,
- 12839, 12843, 12848, 12852, 0, 0, 0, 0, 0, 0, 0, 0, 12858, 0, 0, 0, 0,
- 12864, 12868, 0, 12872, 12876, 12881, 12886, 12891, 0, 0, 12897, 12901,
- 12904, 12907, 12910, 12913, 12916, 12919, 12922, 12925, 12928, 12937,
- 12946, 12950, 12954, 12960, 12966, 12972, 12978, 12992, 12999, 13002, 0,
- 0, 0, 0, 0, 13006, 13012, 13016, 0, 13020, 13023, 13027, 13030, 13034,
- 13037, 0, 0, 0, 0, 13041, 13045, 0, 0, 13049, 13053, 13057, 13060, 13064,
- 13068, 13072, 13076, 13080, 13084, 13088, 13092, 13096, 13100, 13104,
- 13108, 13112, 13116, 13120, 13124, 13128, 13132, 0, 13135, 13138, 13142,
- 13146, 13150, 13153, 13156, 0, 13159, 13163, 0, 13167, 13171, 0, 13175,
- 13179, 0, 0, 13182, 0, 13186, 13191, 13195, 13200, 13204, 0, 0, 0, 0,
- 13209, 13214, 0, 0, 13219, 13224, 13229, 0, 0, 0, 13233, 0, 0, 0, 0, 0,
- 0, 0, 13237, 13241, 13245, 13249, 0, 13253, 0, 0, 0, 0, 0, 0, 0, 13257,
- 13261, 13264, 13267, 13270, 13273, 13276, 13279, 13282, 13285, 13288,
- 13291, 13294, 13297, 13300, 13305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13309, 13313, 13317, 0, 13321, 13324, 13328, 13331, 13335, 13338, 13342,
- 13346, 13350, 0, 13355, 13358, 13362, 0, 13367, 13370, 13374, 13377,
- 13381, 13385, 13389, 13393, 13397, 13401, 13405, 13409, 13413, 13417,
- 13421, 13425, 13429, 13433, 13437, 13441, 13445, 13449, 0, 13452, 13455,
- 13459, 13463, 13467, 13470, 13473, 0, 13476, 13480, 0, 13484, 13488,
- 13492, 13496, 13500, 0, 0, 13503, 13507, 13511, 13516, 13520, 13525,
- 13529, 13534, 13539, 13545, 0, 13551, 13555, 13560, 0, 13566, 13570,
- 13575, 0, 0, 13579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13582,
- 13587, 13592, 13597, 0, 0, 13603, 13607, 13610, 13613, 13616, 13619,
- 13622, 13625, 13628, 13631, 0, 13634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 13638, 13642, 13646, 0, 13650, 13653, 13657, 13660, 13664,
- 13667, 13671, 13675, 0, 0, 13679, 13682, 0, 0, 13686, 13689, 13693,
- 13696, 13700, 13704, 13708, 13712, 13716, 13720, 13724, 13728, 13732,
- 13736, 13740, 13744, 13748, 13752, 13756, 13760, 13764, 13768, 0, 13771,
- 13774, 13778, 13782, 13786, 13789, 13792, 0, 13795, 13799, 0, 13803,
- 13807, 13811, 13815, 13819, 0, 0, 13822, 13826, 13830, 13835, 13839,
- 13844, 13848, 13853, 13858, 0, 0, 13864, 13868, 0, 0, 13873, 13877,
- 13882, 0, 0, 0, 0, 0, 0, 0, 0, 13886, 13892, 0, 0, 0, 0, 13898, 13902, 0,
- 13906, 13910, 13915, 13920, 13925, 0, 0, 13931, 13935, 13938, 13941,
- 13944, 13947, 13950, 13953, 13956, 13959, 13962, 13965, 13969, 13975,
- 13981, 13987, 13993, 13999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14005, 14009,
- 0, 14013, 14016, 14020, 14023, 14027, 14030, 0, 0, 0, 14034, 14037,
- 14041, 0, 14045, 14048, 14052, 14056, 0, 0, 0, 14059, 14063, 0, 14067, 0,
- 14071, 14075, 0, 0, 0, 14079, 14083, 0, 0, 0, 14087, 14090, 14094, 0, 0,
- 0, 14097, 14100, 14103, 14106, 14110, 14114, 14118, 14122, 14126, 14130,
- 14134, 14138, 0, 0, 0, 0, 14141, 14146, 14150, 14155, 14159, 0, 0, 0,
- 14164, 14168, 14173, 0, 14178, 14182, 14187, 14192, 0, 0, 14196, 0, 0, 0,
- 0, 0, 0, 14199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14205, 14209,
- 14212, 14215, 14218, 14221, 14224, 14227, 14230, 14233, 14236, 14240,
- 14245, 14250, 14254, 14258, 14262, 14266, 14270, 14275, 14279, 0, 0, 0,
- 0, 0, 0, 14282, 14286, 14290, 0, 14294, 14297, 14301, 14304, 14308,
- 14311, 14315, 14319, 0, 14323, 14326, 14330, 0, 14334, 14337, 14341,
- 14345, 14348, 14352, 14356, 14360, 14364, 14368, 14372, 14376, 14380,
- 14384, 14388, 14392, 14396, 14400, 14404, 14408, 14412, 14416, 14420, 0,
- 14423, 14426, 14430, 14434, 14438, 14441, 14444, 14447, 14451, 14455, 0,
- 14459, 14463, 14467, 14471, 14475, 0, 0, 0, 14478, 14482, 14487, 14491,
- 14496, 14500, 14505, 14510, 0, 14516, 14520, 14525, 0, 14530, 14534,
- 14539, 14544, 0, 0, 0, 0, 0, 0, 0, 14548, 14552, 0, 14558, 14562, 0, 0,
- 0, 0, 0, 0, 14566, 14571, 14576, 14581, 0, 0, 14587, 14591, 14594, 14597,
- 14600, 14603, 14606, 14609, 14612, 14615, 0, 0, 0, 0, 0, 0, 0, 0, 14618,
- 14631, 14643, 14655, 14667, 14679, 14691, 14703, 0, 0, 14707, 14711, 0,
- 14715, 14718, 14722, 14725, 14729, 14732, 14736, 14740, 0, 14744, 14747,
- 14751, 0, 14755, 14758, 14762, 14766, 14769, 14773, 14777, 14781, 14785,
- 14789, 14793, 14797, 14801, 14805, 14809, 14813, 14817, 14821, 14825,
- 14829, 14833, 14837, 14841, 0, 14844, 14847, 14851, 14855, 14859, 14862,
- 14865, 14868, 14872, 14876, 0, 14880, 14884, 14888, 14892, 14896, 0, 0,
- 14899, 14903, 14907, 14912, 14916, 14921, 14925, 14930, 14935, 0, 14941,
- 14945, 14950, 0, 14955, 14959, 14964, 14969, 0, 0, 0, 0, 0, 0, 0, 14973,
- 14977, 0, 0, 0, 0, 0, 0, 0, 14983, 0, 14987, 14992, 14997, 15002, 0, 0,
- 15008, 15012, 15015, 15018, 15021, 15024, 15027, 15030, 15033, 15036, 0,
- 15039, 15043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15047, 15051,
- 0, 15055, 15058, 15062, 15065, 15069, 15072, 15076, 15080, 0, 15084,
- 15087, 15091, 0, 15095, 15098, 15102, 15106, 15109, 15113, 15117, 15121,
- 15125, 15129, 15133, 15137, 15141, 15145, 15149, 15153, 15157, 15161,
- 15165, 15169, 15173, 15177, 15181, 15184, 15188, 15191, 15195, 15199,
- 15203, 15206, 15209, 15212, 15216, 15220, 15224, 15228, 15232, 15236,
- 15240, 15244, 15247, 0, 0, 15251, 15255, 15260, 15264, 15269, 15273,
- 15278, 15283, 0, 15289, 15293, 15298, 0, 15303, 15307, 15312, 15317,
- 15321, 0, 0, 0, 0, 0, 0, 0, 0, 15326, 0, 0, 0, 0, 0, 0, 0, 0, 15332,
- 15337, 15342, 15347, 0, 0, 15353, 15357, 15360, 15363, 15366, 15369,
- 15372, 15375, 15378, 15381, 15384, 15388, 15393, 15398, 15404, 15410, 0,
- 0, 0, 15416, 15420, 15426, 15431, 15437, 15442, 15448, 0, 0, 15454,
- 15458, 0, 15462, 15466, 15470, 15474, 15478, 15482, 15486, 15490, 15494,
- 15498, 15502, 15506, 15510, 15514, 15518, 15522, 15526, 15530, 0, 0, 0,
- 15534, 15540, 15546, 15552, 15558, 15564, 15570, 15576, 15582, 15588,
- 15594, 15600, 15608, 15614, 15620, 15626, 15632, 15638, 15644, 15650,
- 15656, 15662, 15668, 15674, 0, 15680, 15686, 15692, 15698, 15704, 15710,
- 15714, 15720, 15724, 0, 15728, 0, 0, 15734, 15738, 15744, 15750, 15756,
- 15760, 15766, 0, 0, 0, 15770, 0, 0, 0, 0, 15774, 15779, 15786, 15793,
- 15800, 15807, 0, 15814, 0, 15821, 15826, 15831, 15838, 15845, 15854,
- 15865, 15874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15879, 15886, 15893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15898, 15904,
- 15910, 15916, 15922, 15928, 15934, 15940, 15946, 15952, 15958, 15964,
- 15970, 15976, 15982, 15988, 15994, 16000, 16006, 16012, 16018, 16024,
- 16030, 16036, 16042, 16048, 16054, 16060, 16066, 16072, 16078, 16084,
- 16090, 16095, 16101, 16107, 16111, 16117, 16121, 16127, 16133, 16139,
- 16145, 16151, 16157, 16162, 16168, 16172, 16177, 16183, 16189, 16195,
- 16200, 16206, 16212, 16218, 16223, 16229, 0, 0, 0, 0, 16233, 16239,
- 16244, 16250, 16255, 16263, 16271, 16275, 16279, 16283, 16289, 16295,
- 16301, 16307, 16311, 16315, 16319, 16323, 16327, 16330, 16333, 16336,
- 16339, 16342, 16345, 16348, 16351, 16354, 16358, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30370, 30376,
+ 30382, 30386, 30390, 30394, 30398, 30404, 30408, 30414, 30418, 30424,
+ 30430, 30438, 30444, 30452, 30456, 30460, 30464, 30470, 30473, 30479,
+ 30483, 30489, 30493, 30497, 30503, 30507, 30513, 30517, 30523, 30531,
+ 30539, 30547, 30553, 30557, 30563, 30567, 30573, 30576, 30579, 30585,
+ 30589, 30595, 30598, 30601, 30604, 30608, 30612, 30618, 30624, 30627,
+ 30630, 30634, 30639, 30644, 30651, 30656, 30663, 30670, 30679, 30686,
+ 30695, 30700, 30707, 30714, 30723, 30728, 30735, 30740, 30746, 30752,
+ 30758, 30764, 30770, 30776, 0, 0, 0, 0, 30782, 30786, 30789, 30792,
+ 30795, 30798, 30801, 30804, 30807, 30810, 30813, 30816, 30819, 30822,
+ 30827, 30832, 30837, 30840, 30845, 30850, 30855, 30860, 30867, 30872,
+ 30877, 30882, 30887, 30894, 30900, 30906, 30912, 30918, 30924, 30933,
+ 30942, 30948, 30954, 30962, 30970, 30979, 30988, 30996, 31004, 31013,
+ 31022, 0, 0, 0, 31030, 31034, 31038, 31042, 31045, 31048, 31051, 31055,
+ 31058, 31061, 31065, 31068, 31072, 31076, 31080, 31084, 31088, 31092,
+ 31096, 31100, 31104, 31107, 31110, 31114, 31118, 31122, 31125, 31128,
+ 31131, 31135, 31139, 31142, 31146, 31149, 31154, 31159, 31164, 31169,
+ 31174, 31179, 31184, 31189, 31194, 31198, 31202, 31208, 31215, 31219,
+ 31223, 31227, 31230, 31233, 31236, 31239, 31242, 31245, 31248, 31251,
+ 31254, 31257, 31261, 31265, 31269, 31274, 31278, 31282, 31288, 31292,
+ 31298, 31304, 31309, 31316, 31320, 31326, 31330, 31336, 31341, 31348,
+ 31355, 31360, 31367, 31372, 31377, 31381, 31387, 31391, 31397, 31404,
+ 31411, 31415, 31421, 31427, 31431, 31437, 31442, 31447, 31454, 31459,
+ 31464, 31469, 31474, 31478, 31482, 31487, 31492, 31499, 31505, 31510,
+ 31517, 31522, 31529, 31534, 31543, 31549, 31555, 31559, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31563, 31572, 31579, 31586, 31593, 31596, 31600, 31604, 31608,
+ 31612, 31616, 31620, 31624, 31628, 31632, 31636, 31640, 31644, 31647,
+ 31650, 31654, 31658, 31662, 31666, 31670, 31674, 31677, 31681, 31685,
+ 31689, 31693, 31696, 31699, 31703, 31706, 31710, 31714, 31717, 31721,
+ 31725, 31728, 31733, 31738, 31743, 31747, 31751, 31756, 31760, 31765,
+ 31769, 31774, 31778, 31782, 31787, 31792, 31796, 31801, 31806, 31811,
+ 31815, 0, 0, 0, 31819, 31824, 31833, 31838, 31845, 31850, 31854, 31857,
+ 31860, 31863, 31866, 31869, 31872, 31875, 31878, 0, 0, 0, 31881, 31885,
+ 31889, 31893, 31900, 31906, 31912, 31918, 31924, 31930, 31936, 31942,
+ 31948, 31954, 31961, 31968, 31975, 31982, 31989, 31996, 32003, 32010,
+ 32017, 32024, 32031, 32038, 32045, 32052, 32059, 32066, 32073, 32080,
+ 32087, 32094, 32101, 32108, 32115, 32122, 32129, 32136, 32143, 32150,
+ 32157, 32164, 32172, 32180, 32188, 32194, 32200, 32206, 32214, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 16362, 16367, 0, 16374, 0, 0, 16381, 16386, 0, 16391, 0,
- 0, 16398, 0, 0, 0, 0, 0, 0, 16403, 16408, 16412, 16419, 0, 16426, 16431,
- 16436, 16441, 16448, 16455, 16462, 0, 16469, 16474, 16479, 0, 16486, 0,
- 16493, 0, 0, 16498, 16505, 0, 16512, 16516, 16523, 16527, 16532, 16540,
- 16546, 16552, 16557, 16563, 16569, 16575, 16580, 0, 16586, 16594, 16601,
- 0, 0, 16608, 16613, 16619, 16624, 16630, 0, 16636, 0, 16642, 16649,
- 16656, 16663, 16670, 16675, 0, 0, 16679, 16684, 16688, 16692, 16696,
- 16700, 16704, 16708, 16712, 16716, 0, 0, 16720, 16726, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16732, 16736, 16747, 16762, 16777, 16787, 16798, 16811,
- 16822, 16828, 16836, 16846, 16852, 16860, 16864, 16870, 16876, 16884,
- 16894, 16902, 16915, 16921, 16929, 16937, 16949, 16956, 16964, 16972,
- 16980, 16988, 16996, 17004, 17014, 17018, 17021, 17024, 17027, 17030,
- 17033, 17036, 17039, 17042, 17045, 17049, 17053, 17057, 17061, 17065,
- 17069, 17073, 17077, 17081, 17086, 17092, 17102, 17116, 17126, 17132,
- 17138, 17146, 17154, 17162, 17170, 17176, 17182, 17185, 17189, 17193,
- 17197, 17201, 17205, 17209, 0, 17213, 17217, 17221, 17225, 17229, 17233,
- 17237, 17241, 17245, 17249, 17253, 17256, 17259, 17263, 17267, 17271,
- 17274, 17278, 17282, 17286, 17290, 17294, 17298, 17302, 17306, 17309,
- 17312, 17316, 17320, 17324, 17328, 17331, 17334, 17338, 17343, 17347, 0,
- 0, 0, 0, 17351, 17356, 17360, 17365, 17369, 17374, 17379, 17385, 17390,
- 17396, 17400, 17405, 17409, 17414, 17424, 17430, 17436, 17443, 17453,
- 17459, 17463, 17467, 17473, 17479, 17487, 17493, 17501, 17509, 17517,
- 17527, 17535, 17545, 17550, 17556, 17562, 17568, 17574, 17580, 17586, 0,
- 17592, 17598, 17604, 17610, 17616, 17622, 17628, 17634, 17640, 17646,
- 17652, 17657, 17662, 17668, 17674, 17680, 17685, 17691, 17697, 17703,
- 17709, 17715, 17721, 17727, 17733, 17738, 17743, 17749, 17755, 17761,
- 17767, 17772, 17777, 17783, 17791, 17798, 0, 17805, 17812, 17825, 17832,
- 17839, 17847, 17855, 17861, 17867, 17873, 17883, 17888, 17894, 17904,
- 17914, 0, 17924, 17934, 17942, 17954, 17966, 17972, 17986, 18001, 18006,
- 18011, 18019, 18027, 18035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18043,
- 18046, 18050, 18054, 18058, 18062, 18066, 18070, 18074, 18078, 18082,
- 18086, 18090, 18094, 18098, 18102, 18106, 18110, 18114, 18118, 18122,
- 18125, 18128, 18132, 18136, 18140, 18143, 18146, 18149, 18153, 18157,
- 18161, 18164, 18168, 18171, 18176, 18179, 18183, 18186, 18190, 18193,
- 18198, 18201, 18205, 18212, 18217, 18221, 18226, 18230, 18235, 18239,
- 18244, 18251, 18257, 18262, 18266, 18270, 18274, 18278, 18282, 18288,
- 18294, 18301, 18307, 18313, 18317, 18320, 18323, 18326, 18329, 18332,
- 18335, 18338, 18341, 18344, 18350, 18354, 18358, 18362, 18366, 18370,
- 18374, 18378, 18382, 18387, 18391, 18396, 18401, 18407, 18412, 18418,
- 18424, 18430, 18436, 18442, 18450, 18458, 18467, 18475, 18484, 18493,
- 18504, 18514, 18524, 18535, 18546, 18556, 18566, 18576, 18586, 18596,
- 18606, 18616, 18626, 18634, 18641, 18647, 18654, 18659, 18665, 18671,
- 18677, 18683, 18689, 18695, 18700, 18706, 18712, 18718, 18724, 18729,
- 18738, 18745, 18751, 18758, 18766, 18772, 18778, 18784, 18790, 18798,
- 18806, 18816, 18824, 18832, 18838, 18843, 18848, 18853, 18858, 18863,
- 18868, 18873, 18878, 18883, 18889, 18895, 18901, 18908, 18913, 18919,
- 18924, 18929, 18934, 18939, 18944, 18949, 18954, 18959, 18964, 18969,
- 18974, 18979, 18984, 18989, 18994, 18999, 19004, 19009, 19014, 19019,
- 19024, 19029, 19034, 19039, 19044, 19049, 19054, 19059, 19064, 19069,
- 19074, 19079, 19084, 19089, 19094, 19099, 19104, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 19109, 19113, 19117, 19121, 19125, 19129, 19133, 19137, 19141,
- 19145, 19149, 19153, 19157, 19161, 19165, 19169, 19173, 19177, 19181,
- 19185, 19189, 19193, 19197, 19201, 19205, 19209, 19213, 19217, 19221,
- 19225, 19229, 19233, 19237, 19241, 19245, 19249, 19253, 19257, 19261,
- 19265, 19269, 19273, 19279, 19283, 19288, 0, 0, 0, 19293, 19297, 19301,
- 19305, 19309, 19313, 19317, 19321, 19325, 19329, 19333, 19337, 19341,
- 19345, 19349, 19353, 19357, 19361, 19365, 19369, 19373, 19377, 19381,
- 19385, 19389, 19393, 19397, 19401, 19405, 19409, 19413, 19417, 19421,
- 19425, 19429, 19433, 19437, 19441, 19445, 19449, 19453, 19457, 19461,
- 19465, 19469, 19473, 19477, 19481, 19485, 19489, 19493, 19497, 19501,
- 19505, 19509, 19513, 19517, 19521, 19525, 19529, 19533, 19537, 19541,
- 19545, 19549, 19553, 19557, 19561, 19565, 19569, 19573, 19577, 19581,
- 19585, 19589, 19593, 19597, 19601, 19605, 19609, 19613, 19617, 19621,
- 19625, 19629, 19633, 19637, 19641, 19645, 19649, 19653, 19657, 19661,
- 19665, 19669, 19673, 19677, 19681, 19684, 19688, 19691, 19695, 19699,
- 19702, 19706, 19710, 19713, 19717, 19721, 19725, 19729, 19732, 19736,
- 19740, 19744, 19748, 19752, 19756, 19759, 19763, 19767, 19771, 19775,
- 19779, 19783, 19787, 19791, 19795, 19799, 19803, 19807, 19811, 19815,
- 19819, 19823, 19827, 19831, 19835, 19839, 19843, 19847, 19851, 19855,
- 19859, 19863, 19867, 19871, 19875, 19879, 19883, 19887, 19891, 19895,
- 19899, 19903, 19907, 19911, 19915, 19919, 19923, 19927, 19931, 19935,
- 19939, 19943, 19947, 19951, 19955, 19959, 19963, 19967, 19971, 19975,
- 19979, 19983, 19987, 19991, 19995, 19999, 20003, 20007, 20011, 20015,
- 20019, 20023, 20027, 20031, 20035, 20039, 20043, 20047, 20051, 20055,
- 20059, 20063, 20067, 20071, 20075, 20079, 20083, 20087, 20091, 20095,
- 20099, 20103, 20107, 20111, 20115, 20119, 20123, 20127, 20131, 20135,
- 20139, 20143, 20147, 20151, 20155, 20159, 20163, 20167, 20171, 20175,
- 20179, 20183, 20187, 20191, 20195, 20199, 20203, 20207, 20211, 20215,
- 20219, 20223, 20227, 20231, 20235, 20239, 20243, 20247, 20251, 20255,
- 20259, 20263, 20267, 20271, 20275, 20279, 20283, 20287, 20291, 20295,
- 20299, 20303, 20307, 20311, 20314, 20318, 20322, 20326, 20330, 20334,
- 20338, 20342, 20346, 20350, 20354, 20358, 20362, 20366, 20370, 20374,
- 20378, 20382, 20386, 20390, 20394, 20398, 20402, 20406, 20409, 20413,
- 20417, 20421, 20425, 20429, 20433, 20437, 20441, 20445, 20449, 20453,
- 20457, 20461, 20465, 20469, 20472, 20476, 20480, 20484, 20488, 20492,
- 20496, 20500, 20504, 20508, 20512, 20516, 20520, 20524, 20528, 20532,
- 20536, 20540, 20544, 20548, 20552, 20556, 20560, 20564, 20568, 20572,
- 20576, 20580, 20584, 20588, 20592, 20596, 0, 20600, 20604, 20608, 20612,
- 0, 0, 20616, 20620, 20624, 20628, 20632, 20636, 20640, 0, 20644, 0,
- 20648, 20652, 20656, 20660, 0, 0, 20664, 20668, 20672, 20676, 20680,
- 20684, 20688, 20692, 20696, 20700, 20704, 20708, 20712, 20716, 20720,
- 20724, 20728, 20732, 20736, 20740, 20744, 20748, 20752, 20755, 20759,
- 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799,
- 20803, 20807, 20811, 20815, 20819, 20823, 0, 20827, 20831, 20835, 20839,
- 0, 0, 20843, 20846, 20850, 20854, 20858, 20862, 20866, 20870, 20874,
- 20878, 20882, 20886, 20890, 20894, 20898, 20902, 20906, 20911, 20916,
- 20921, 20927, 20933, 20938, 20943, 20949, 20952, 20956, 20960, 20964,
- 20968, 20972, 20976, 20980, 0, 20984, 20988, 20992, 20996, 0, 0, 21000,
- 21004, 21008, 21012, 21016, 21020, 21024, 0, 21028, 0, 21032, 21036,
- 21040, 21044, 0, 0, 21048, 21052, 21056, 21060, 21064, 21068, 21072,
- 21076, 21080, 21085, 21090, 21095, 21101, 21107, 21112, 0, 21117, 21121,
- 21125, 21129, 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161,
- 21165, 21169, 21173, 21177, 21181, 21184, 21188, 21192, 21196, 21200,
- 21204, 21208, 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240,
- 21244, 21248, 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280,
- 21284, 21288, 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320,
- 21324, 21328, 21332, 21336, 21340, 0, 21344, 21348, 21352, 21356, 0, 0,
- 21360, 21364, 21368, 21372, 21376, 21380, 21384, 21388, 21392, 21396,
- 21400, 21404, 21408, 21412, 21416, 21420, 21424, 21428, 21432, 21436,
- 21440, 21444, 21448, 21452, 21456, 21460, 21464, 21468, 21472, 21476,
- 21480, 21484, 21488, 21492, 21496, 21500, 21504, 21508, 21512, 21516,
- 21520, 21524, 21528, 21532, 21536, 21540, 21544, 21548, 21552, 21556,
- 21560, 21564, 21568, 21572, 21576, 21580, 21584, 21587, 21591, 21595,
- 21599, 21603, 21607, 21611, 21615, 21619, 21623, 0, 0, 21627, 21636,
- 21642, 21647, 21651, 21654, 21659, 21662, 21665, 21668, 21673, 21677,
- 21682, 21685, 21688, 21691, 21694, 21697, 21700, 21703, 21706, 21709,
- 21713, 21717, 21721, 21725, 21729, 21733, 21737, 21741, 21745, 21749, 0,
- 0, 0, 21755, 21761, 21765, 21769, 21773, 21779, 21783, 21787, 21791,
- 21797, 21801, 21805, 21809, 21815, 21819, 21823, 21827, 21833, 21839,
- 21845, 21853, 21859, 21865, 21871, 21877, 21883, 0, 0, 0, 0, 0, 0, 21889,
- 21892, 21895, 21898, 21901, 21904, 21908, 21912, 21915, 21919, 21923,
- 21927, 21931, 21935, 21938, 21942, 21946, 21950, 21954, 21958, 21962,
- 21966, 21970, 21974, 21978, 21982, 21985, 21989, 21993, 21997, 22001,
- 22004, 22008, 22012, 22016, 22020, 22024, 22028, 22032, 22036, 22040,
- 22044, 22048, 22052, 22056, 22060, 22063, 22067, 22071, 22075, 22079,
- 22083, 22087, 22091, 22095, 22099, 22103, 22107, 22111, 22115, 22119,
- 22123, 22127, 22131, 22135, 22139, 22143, 22147, 22151, 22155, 22159,
- 22163, 22167, 22171, 22175, 22179, 22183, 22187, 22191, 22195, 22198,
- 22202, 22206, 22210, 22214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22218,
- 22222, 22225, 22229, 22232, 22236, 22239, 22243, 22249, 22254, 22258,
- 22261, 22265, 22269, 22274, 22278, 22283, 22287, 22292, 22296, 22301,
- 22305, 22310, 22316, 22320, 22325, 22329, 22334, 22340, 22344, 22350,
- 22356, 22360, 22365, 22373, 22381, 22388, 22393, 22398, 22407, 22414,
- 22421, 22426, 22432, 22436, 22440, 22444, 22448, 22452, 22456, 22460,
- 22464, 22468, 22472, 22478, 22483, 22488, 22491, 22495, 22499, 22504,
- 22508, 22513, 22517, 22522, 22526, 22531, 22535, 22540, 22544, 22549,
- 22553, 22558, 22564, 22568, 22573, 22578, 22582, 22586, 22590, 22594,
- 22597, 22601, 22607, 22612, 22617, 22621, 22625, 22629, 22634, 22638,
- 22643, 22647, 22652, 22655, 22659, 22663, 22668, 22672, 22677, 22681,
- 22686, 22692, 22696, 22700, 22704, 22708, 22712, 22716, 22720, 22724,
- 22728, 22732, 22736, 22742, 22745, 22749, 22753, 22758, 22762, 22767,
- 22771, 22776, 22780, 22785, 22789, 22794, 22798, 22803, 22807, 22812,
- 22818, 22822, 22826, 22832, 22838, 22844, 22850, 22854, 22858, 22862,
- 22866, 22870, 22874, 22880, 22884, 22888, 22892, 22897, 22901, 22906,
- 22910, 22915, 22919, 22924, 22928, 22933, 22937, 22942, 22946, 22951,
- 22957, 22961, 22967, 22971, 22975, 22979, 22983, 22987, 22991, 22997,
- 23000, 23004, 23008, 23013, 23017, 23022, 23026, 23031, 23035, 23040,
- 23044, 23049, 23053, 23058, 23062, 23067, 23073, 23076, 23080, 23084,
- 23089, 23094, 23098, 23102, 23106, 23110, 23114, 23118, 23124, 23127,
- 23131, 23135, 23140, 23144, 23149, 23153, 23158, 23164, 23167, 23172,
- 23176, 23180, 23184, 23188, 23192, 23196, 23200, 23206, 23210, 23214,
- 23218, 23223, 23227, 23232, 23236, 23241, 23245, 23250, 23254, 23259,
- 23263, 23268, 23272, 23277, 23280, 23284, 23288, 23292, 23296, 23300,
- 23304, 23308, 23312, 23318, 23322, 23326, 23330, 23335, 23339, 23344,
- 23348, 23353, 23357, 23362, 23366, 23371, 23375, 23380, 23384, 23389,
- 23395, 23398, 23403, 23407, 23412, 23418, 23424, 23430, 23436, 23442,
- 23448, 23454, 23458, 23462, 23466, 23470, 23474, 23478, 23482, 23486,
- 23491, 23495, 23500, 23504, 23509, 23513, 23518, 23522, 23527, 23531,
- 23536, 23540, 23545, 23549, 23553, 23557, 23561, 23565, 23569, 23573,
- 23579, 23582, 23586, 23590, 23595, 23599, 23604, 23608, 23613, 23617,
- 23622, 23626, 23631, 23635, 23640, 23644, 23649, 23655, 23659, 23665,
- 23670, 23676, 23680, 23686, 23691, 23695, 23699, 23703, 23707, 23711,
- 23716, 23719, 23723, 23728, 23732, 23737, 23740, 23744, 23748, 23752,
- 23756, 23760, 23764, 23768, 23772, 23776, 23780, 23784, 23789, 23793,
- 23797, 23803, 23807, 23813, 23817, 23823, 23827, 23831, 23835, 23839,
- 23843, 23848, 23852, 23856, 23860, 23864, 23868, 23872, 23876, 23880,
- 23884, 23888, 23894, 23900, 23906, 23912, 23918, 23923, 23929, 23935,
- 23941, 23945, 23949, 23953, 23957, 23961, 23965, 23969, 23973, 23977,
- 23981, 23985, 23989, 23993, 23998, 24003, 24008, 24012, 24016, 24020,
- 24024, 24028, 24032, 24036, 24040, 24044, 24048, 24054, 24060, 24066,
- 24072, 24078, 24084, 24090, 24096, 24102, 24106, 24110, 24114, 24118,
- 24122, 24126, 24130, 24136, 24142, 24148, 24154, 24160, 24166, 24172,
- 24178, 24184, 24189, 24194, 24199, 24204, 24210, 24216, 24222, 24228,
- 24234, 24240, 24246, 24251, 24257, 24263, 24269, 24274, 24280, 24286,
- 24292, 24297, 24302, 24307, 24312, 24317, 24322, 24327, 24332, 24337,
- 24342, 24347, 24352, 24356, 24361, 24366, 24371, 24376, 24381, 24386,
- 24391, 24396, 24401, 24406, 24411, 24416, 24421, 24426, 24431, 24436,
- 24441, 24446, 24451, 24456, 24461, 24466, 24471, 24476, 24481, 24486,
- 24491, 24496, 24501, 24505, 24510, 24515, 24520, 24525, 24530, 24535,
- 24540, 24545, 24550, 24555, 24560, 24565, 24570, 24575, 24580, 24585,
- 24590, 24595, 24600, 24605, 24610, 24615, 24620, 24625, 24630, 24634,
- 24639, 24644, 24649, 24654, 24659, 24663, 24668, 24673, 24678, 24683,
- 24688, 24692, 24697, 24703, 24708, 24713, 24718, 24723, 24729, 24734,
- 24739, 24744, 24749, 24754, 24759, 24764, 24769, 24774, 24779, 24784,
- 24789, 24794, 24799, 24804, 24809, 24814, 24819, 24824, 24829, 24834,
- 24839, 24844, 24849, 24854, 24859, 24864, 24869, 24874, 24879, 24884,
- 24889, 24894, 24899, 24904, 24909, 24914, 24919, 24924, 24929, 24934,
- 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24975, 24980, 24985,
- 24990, 24995, 25000, 25005, 25010, 25015, 25020, 25025, 25030, 25035,
- 25040, 25045, 25050, 25055, 25060, 25065, 25070, 25075, 25080, 25085,
- 25090, 25095, 25100, 25105, 25110, 25115, 25120, 25125, 25130, 25135,
- 25140, 25145, 25151, 25155, 25159, 25163, 25167, 25171, 25175, 25179,
- 25183, 25189, 25195, 25201, 25207, 25213, 25219, 25225, 25232, 25238,
- 25243, 25248, 25253, 25258, 25263, 25268, 25273, 25278, 25283, 25288,
- 25293, 25298, 25303, 25308, 25313, 25318, 25323, 25328, 25333, 25338,
- 25343, 25348, 25353, 25358, 25363, 25368, 25373, 25378, 0, 0, 0, 25385,
- 25395, 25399, 25406, 25410, 25414, 25418, 25426, 25430, 25435, 25440,
- 25445, 25449, 25454, 25459, 25462, 25466, 25470, 25479, 25483, 25487,
- 25493, 25497, 25501, 25509, 25513, 25521, 25527, 25533, 25539, 25545,
- 25554, 25559, 25563, 25572, 25575, 25581, 25585, 25591, 25596, 25602,
- 25610, 25616, 25621, 25628, 25633, 25637, 25641, 25651, 25657, 25661,
- 25671, 25677, 25681, 25685, 25692, 25699, 25704, 25709, 25718, 25722,
- 25726, 25730, 25738, 25745, 25749, 25753, 25757, 25761, 25765, 25769,
- 25773, 25777, 25781, 25785, 25789, 25794, 25799, 25804, 25808, 25812, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25816, 25820, 25824, 25828,
- 25832, 25837, 25842, 25847, 25852, 25856, 25860, 25865, 25869, 0, 25873,
- 25878, 25883, 25888, 25892, 25897, 25902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 25907, 25911, 25915, 25919, 25923, 25928, 25933, 25938, 25943, 25947,
- 25951, 25956, 25960, 25964, 25968, 25973, 25978, 25983, 25987, 25992,
- 25997, 26002, 26008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26013, 26017, 26021,
- 26025, 26029, 26034, 26039, 26044, 26049, 26053, 26057, 26062, 26066,
- 26070, 26074, 26079, 26084, 26089, 26093, 26098, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 26103, 26107, 26111, 26115, 26119, 26124, 26129, 26134,
- 26139, 26143, 26147, 26152, 26156, 0, 26160, 26165, 26170, 0, 26175,
- 26180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26185, 26188, 26192, 26196,
- 26200, 26204, 26208, 26212, 26216, 26220, 26224, 26228, 26232, 26236,
- 26240, 26244, 26248, 26252, 26255, 26259, 26263, 26267, 26271, 26275,
- 26279, 26283, 26287, 26291, 26295, 26299, 26303, 26307, 26311, 26314,
- 26318, 26322, 26328, 26334, 26340, 26346, 26352, 26358, 26364, 26370,
- 26376, 26382, 26388, 26394, 26400, 26406, 26415, 26424, 26430, 26436,
- 26442, 26447, 26451, 26456, 26461, 26466, 26470, 26475, 26480, 26485,
- 26489, 26494, 26498, 26503, 26508, 26513, 26518, 26522, 26526, 26530,
- 26534, 26538, 26542, 26546, 26550, 26554, 26558, 26564, 26568, 26572,
- 26576, 26580, 26584, 26592, 26598, 26602, 26608, 26612, 26618, 26622, 0,
- 0, 26626, 26630, 26633, 26636, 26639, 26642, 26645, 26648, 26651, 26654,
- 0, 0, 0, 0, 0, 0, 26657, 26665, 26673, 26681, 26689, 26697, 26705, 26713,
- 26721, 26729, 0, 0, 0, 0, 0, 0, 26737, 26740, 26743, 26746, 26751, 26754,
- 26759, 26766, 26774, 26779, 26786, 26789, 26796, 26803, 26810, 0, 26814,
- 26818, 26821, 26824, 26827, 26830, 26833, 26836, 26839, 26842, 0, 0, 0,
- 0, 0, 0, 26845, 26848, 26851, 26854, 26857, 26860, 26864, 26868, 26872,
- 26875, 26879, 26883, 26886, 26890, 26894, 26897, 26901, 26905, 26909,
- 26913, 26917, 26921, 26925, 26928, 26931, 26935, 26939, 26942, 26946,
- 26950, 26954, 26958, 26962, 26966, 26970, 26974, 26981, 26986, 26991,
- 26996, 27001, 27007, 27013, 27019, 27025, 27030, 27036, 27042, 27047,
- 27053, 27059, 27065, 27071, 27077, 27082, 27088, 27093, 27099, 27105,
- 27111, 27117, 27123, 27128, 27133, 27139, 27145, 27150, 27156, 27161,
- 27167, 27172, 27177, 27183, 27189, 27195, 27201, 27207, 27213, 27219,
- 27225, 27231, 27237, 27243, 27249, 27254, 27259, 27264, 27270, 0, 0, 0,
- 0, 0, 0, 0, 0, 27276, 27285, 27294, 27302, 27310, 27320, 27328, 27337,
- 27344, 27351, 27358, 27366, 27374, 27382, 27390, 27398, 27406, 27414,
- 27422, 27429, 27437, 27445, 27453, 27461, 27469, 27479, 27489, 27499,
- 27509, 27519, 27529, 27539, 27549, 27559, 27569, 27579, 27589, 27599,
- 27609, 27617, 27625, 27635, 27643, 0, 0, 0, 0, 0, 27653, 27657, 27661,
- 27665, 27669, 27673, 27677, 27681, 27685, 27689, 27693, 27697, 27701,
- 27705, 27709, 27713, 27717, 27721, 27725, 27729, 27733, 27737, 27741,
- 27745, 27751, 27755, 27761, 27765, 27771, 27775, 27781, 27785, 27789,
- 27793, 27797, 27801, 27805, 27811, 27817, 27823, 27829, 27834, 27839,
- 27844, 27850, 27856, 27862, 27868, 27875, 27881, 27886, 27891, 27895,
- 27899, 27903, 27907, 27911, 27915, 27919, 27925, 27931, 27937, 27942,
- 27949, 27954, 27959, 27965, 27970, 27977, 27984, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 27990, 27995, 27998, 28002, 28006, 28010, 28014, 28018, 28022,
- 28026, 28030, 28034, 28038, 28042, 28046, 28050, 28053, 28056, 28060,
- 28064, 28068, 28071, 28074, 28077, 28081, 28085, 28089, 28093, 28097, 0,
- 0, 0, 28100, 28104, 28108, 28112, 28117, 28122, 28127, 28132, 28136,
- 28140, 28145, 28150, 0, 0, 0, 0, 28156, 28160, 28165, 28170, 28175,
- 28179, 28183, 28187, 28191, 28196, 28200, 28204, 0, 0, 0, 0, 28208, 0, 0,
- 0, 28212, 28216, 28220, 28224, 28227, 28230, 28233, 28236, 28239, 28242,
- 28245, 28248, 28251, 28256, 28262, 28268, 28274, 28280, 28285, 28291,
- 28297, 28303, 28308, 28314, 28319, 28325, 28331, 28336, 28342, 28348,
- 28354, 28359, 28364, 28369, 28375, 28381, 28386, 28392, 28397, 28403,
- 28408, 28414, 0, 0, 28420, 28426, 28432, 28438, 28444, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 28450, 28457, 28464, 28470, 28477, 28484, 28490, 28497,
- 28504, 28511, 28518, 28524, 28531, 28538, 28544, 28551, 28558, 28564,
- 28571, 28578, 28584, 28590, 28597, 28603, 28609, 28616, 28622, 28629,
- 28636, 28643, 28650, 28657, 28664, 28670, 28677, 28684, 28690, 28697,
- 28704, 28711, 28718, 28725, 28732, 28739, 0, 0, 0, 0, 28746, 28754,
- 28761, 28768, 28774, 28781, 28787, 28794, 28800, 28807, 28814, 28821,
- 28828, 28835, 28842, 28849, 28856, 28863, 28870, 28877, 28883, 28889,
- 28896, 28903, 28910, 28916, 0, 0, 0, 0, 0, 0, 28922, 28928, 28933, 28938,
- 28943, 28948, 28953, 28958, 28963, 28968, 28973, 0, 0, 0, 28979, 28985,
- 28991, 28995, 29001, 29007, 29013, 29019, 29025, 29031, 29037, 29043,
- 29049, 29055, 29061, 29067, 29073, 29079, 29085, 29089, 29095, 29101,
- 29107, 29113, 29119, 29125, 29131, 29137, 29143, 29149, 29155, 29161,
- 29167, 29173, 29179, 29183, 29188, 29193, 29198, 29202, 29207, 29211,
- 29216, 29221, 29226, 29230, 29235, 29240, 29245, 29250, 29255, 29259,
- 29263, 29268, 29273, 29278, 29282, 29286, 29291, 29296, 29301, 29306, 0,
- 0, 29312, 29316, 29323, 29328, 29334, 29340, 29345, 29351, 29357, 29362,
- 29368, 29374, 29380, 29386, 29392, 29397, 29402, 29408, 29413, 29419,
- 29424, 29430, 29436, 29442, 29448, 29452, 29457, 29462, 29468, 29474,
- 29479, 29485, 29491, 29495, 29500, 29505, 29509, 29514, 29519, 29524,
- 29529, 29535, 29541, 29547, 29552, 29557, 29561, 29566, 29570, 29575,
- 29579, 29584, 29589, 29594, 29599, 29606, 29613, 29621, 29632, 29641,
- 29649, 29656, 29667, 29673, 29680, 0, 29687, 29692, 29697, 29705, 29711,
- 29719, 29724, 29730, 29736, 29742, 29747, 29753, 29758, 29765, 29771,
- 29776, 29782, 29788, 29794, 29801, 29808, 29815, 29820, 29825, 29832,
- 29839, 29846, 29853, 29860, 0, 0, 29867, 29874, 29881, 29887, 29893,
- 29899, 29905, 29911, 29917, 29923, 29929, 0, 0, 0, 0, 0, 0, 29935, 29941,
- 29946, 29951, 29956, 29961, 29966, 29971, 29976, 29981, 0, 0, 0, 0, 0, 0,
- 29986, 29991, 29996, 30001, 30006, 30011, 30016, 30025, 30032, 30037,
- 30042, 30047, 30052, 30057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32223, 32230, 32237, 32244, 32251,
+ 32260, 32269, 32278, 0, 0, 0, 0, 0, 0, 0, 0, 32287, 32292, 32297, 32302,
+ 32307, 32316, 32327, 32336, 32347, 32353, 32366, 32372, 32379, 32386,
+ 32391, 32397, 32403, 32414, 32423, 32430, 32437, 32446, 32453, 32462,
+ 32472, 32482, 32489, 32496, 32503, 32513, 32518, 32526, 32532, 32540,
+ 32549, 32554, 32561, 32567, 32572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32577,
+ 32582, 32588, 32595, 32603, 32609, 32615, 32621, 32626, 32633, 32639,
+ 32645, 32651, 32659, 32664, 32672, 32677, 32683, 32689, 32696, 32704,
+ 32711, 32717, 32724, 32731, 32737, 32744, 32751, 32757, 32762, 32768,
+ 32776, 32784, 32790, 32796, 32802, 32808, 32816, 32820, 32826, 32832,
+ 32838, 32844, 32850, 32856, 32860, 32865, 32870, 32877, 32882, 32886,
+ 32892, 32897, 32902, 32906, 32911, 32916, 32920, 32924, 32929, 32936,
+ 32940, 32945, 32950, 32954, 32959, 32963, 32968, 32972, 32978, 32983,
+ 32990, 32995, 33000, 33004, 33009, 33014, 33021, 33026, 33032, 33037,
+ 33041, 33046, 33050, 33055, 33062, 33069, 33074, 33079, 33083, 33089,
+ 33095, 33100, 33105, 33110, 33116, 33121, 33127, 33132, 33138, 33144,
+ 33150, 33157, 33164, 33171, 33178, 33185, 33192, 33197, 33205, 33214,
+ 33223, 33232, 33241, 33250, 33259, 33271, 33280, 33289, 33298, 33305,
+ 33310, 33317, 33325, 33333, 33340, 33347, 33354, 33361, 33369, 33378,
+ 33387, 33396, 33405, 33414, 33423, 33432, 33441, 33450, 33459, 33468,
+ 33477, 33486, 33495, 33503, 33512, 33523, 33531, 33540, 33551, 33560,
+ 33569, 33578, 33587, 33595, 33604, 33611, 33616, 33624, 33629, 33636,
+ 33641, 33650, 33656, 33663, 33670, 33675, 33680, 33688, 33696, 33705,
+ 33714, 33719, 33726, 33737, 33745, 33754, 33760, 33766, 33771, 33778,
+ 33783, 33792, 33797, 33802, 33807, 33814, 33821, 33826, 33835, 33843,
+ 33848, 33853, 33860, 33867, 33871, 33875, 33878, 33881, 33884, 33887,
+ 33890, 33893, 33900, 33903, 33906, 33911, 33915, 33919, 33923, 33927,
+ 33931, 33940, 33946, 33952, 33958, 33966, 33974, 33980, 33986, 33993,
+ 33999, 34004, 34010, 34016, 34022, 34029, 34035, 34043, 34049, 34056, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34062, 34069,
+ 34076, 34081, 34090, 34098, 34106, 34113, 34120, 34127, 34134, 34142,
+ 34150, 34160, 34170, 34178, 34186, 34194, 34202, 34211, 34220, 34228,
+ 34236, 34245, 34254, 34264, 34274, 34283, 34292, 34300, 34308, 34316,
+ 34324, 34334, 34344, 34352, 34360, 34368, 34376, 34384, 34392, 34400,
+ 34408, 34416, 34424, 34432, 34440, 34449, 34458, 34467, 34476, 34486,
+ 34496, 34503, 34510, 34518, 34526, 34535, 34544, 34552, 34560, 34572,
+ 34584, 34593, 34602, 34611, 34620, 34627, 34634, 34642, 34650, 34658,
+ 34666, 34674, 34682, 34690, 34698, 34707, 34716, 34725, 34734, 34743,
+ 34752, 34762, 34772, 34782, 34792, 34801, 34810, 34817, 34824, 34832,
+ 34840, 34848, 34856, 34864, 34872, 34884, 34896, 34905, 34914, 34922,
+ 34930, 34938, 34946, 34957, 34968, 34979, 34990, 35002, 35014, 35022,
+ 35030, 35038, 35046, 35055, 35064, 35073, 35082, 35090, 35098, 35106,
+ 35114, 35122, 35130, 35139, 35148, 35158, 35168, 35175, 35182, 35190,
+ 35198, 35206, 35214, 35221, 35228, 35236, 35244, 35252, 35260, 35268,
+ 35276, 35284, 35292, 35300, 35308, 35316, 35324, 35332, 35340, 35348,
+ 35356, 35365, 35374, 35383, 35391, 35400, 35409, 35418, 35427, 35437,
+ 35446, 35453, 35458, 35465, 35472, 35480, 35488, 35497, 35506, 35516,
+ 35526, 35537, 35548, 35557, 35566, 35576, 35586, 35595, 35604, 35614,
+ 35624, 35635, 35646, 35655, 35664, 35674, 35684, 35691, 35698, 35706,
+ 35714, 35720, 35726, 35735, 35744, 35754, 35764, 35775, 35786, 35795,
+ 35804, 35814, 35824, 35833, 35842, 35850, 35858, 35865, 35872, 35880,
+ 35888, 35897, 35906, 35916, 35926, 35937, 35948, 35957, 35966, 35976,
+ 35986, 35995, 36004, 36014, 36024, 36035, 36046, 36055, 36064, 36074,
+ 36084, 36091, 36098, 36106, 36114, 36123, 36132, 36142, 36152, 36163,
+ 36174, 36183, 36192, 36202, 36212, 36220, 36228, 36236, 36244, 36253,
+ 36262, 36269, 36276, 36283, 36290, 36297, 36304, 36312, 36320, 36328,
+ 36336, 36347, 36358, 36369, 36380, 36391, 36402, 36410, 36418, 36429,
+ 36440, 36451, 36462, 36473, 36484, 36492, 36500, 36511, 36522, 36533, 0,
+ 0, 36544, 36552, 36560, 36571, 36582, 36593, 0, 0, 36604, 36612, 36620,
+ 36631, 36642, 36653, 36664, 36675, 36686, 36694, 36702, 36713, 36724,
+ 36735, 36746, 36757, 36768, 36776, 36784, 36795, 36806, 36817, 36828,
+ 36839, 36850, 36858, 36866, 36877, 36888, 36899, 36910, 36921, 36932,
+ 36940, 36948, 36959, 36970, 36981, 0, 0, 36992, 37000, 37008, 37019,
+ 37030, 37041, 0, 0, 37052, 37060, 37068, 37079, 37090, 37101, 37112,
+ 37123, 0, 37134, 0, 37142, 0, 37153, 0, 37164, 37175, 37183, 37191,
+ 37202, 37213, 37224, 37235, 37246, 37257, 37265, 37273, 37284, 37295,
+ 37306, 37317, 37328, 37339, 37347, 37355, 37363, 37371, 37379, 37387,
+ 37395, 37403, 37411, 37419, 37427, 37435, 37443, 0, 0, 37451, 37462,
+ 37473, 37487, 37501, 37515, 37529, 37543, 37557, 37568, 37579, 37593,
+ 37607, 37621, 37635, 37649, 37663, 37674, 37685, 37699, 37713, 37727,
+ 37741, 37755, 37769, 37780, 37791, 37805, 37819, 37833, 37847, 37861,
+ 37875, 37886, 37897, 37911, 37925, 37939, 37953, 37967, 37981, 37992,
+ 38003, 38017, 38031, 38045, 38059, 38073, 38087, 38095, 38103, 38114,
+ 38122, 0, 38133, 38141, 38152, 38160, 38168, 38176, 38184, 38192, 38195,
+ 38198, 38201, 38204, 38210, 38221, 38229, 0, 38240, 38248, 38259, 38267,
+ 38275, 38283, 38291, 38299, 38305, 38311, 38317, 38325, 38333, 38344, 0,
+ 0, 38355, 38363, 38374, 38382, 38390, 38398, 0, 38406, 38412, 38418,
+ 38424, 38432, 38440, 38451, 38462, 38470, 38478, 38486, 38497, 38505,
+ 38513, 38521, 38529, 38537, 38543, 38549, 0, 0, 38552, 38563, 38571, 0,
+ 38582, 38590, 38601, 38609, 38617, 38625, 38633, 38641, 38644, 0, 38647,
+ 38651, 38655, 38659, 38663, 38667, 38671, 38675, 38679, 38683, 38687,
+ 38691, 38697, 38703, 38709, 38712, 38715, 38717, 38721, 38725, 38729,
+ 38733, 38735, 38739, 38743, 38749, 38755, 38762, 38769, 38774, 38779,
+ 38785, 38791, 38793, 38796, 38798, 38802, 38806, 38810, 38813, 38817,
+ 38821, 38825, 38829, 38833, 38839, 38843, 38847, 38853, 38858, 38865,
+ 38867, 38870, 38874, 38878, 38883, 38889, 38891, 38900, 38909, 38912,
+ 38916, 38918, 38920, 38922, 38925, 38931, 38933, 38937, 38941, 38948,
+ 38955, 38959, 38964, 38969, 38974, 38979, 38983, 38987, 38990, 38994,
+ 38998, 39005, 39010, 39014, 39018, 39023, 39027, 39031, 39036, 39041,
+ 39045, 39049, 39053, 39055, 39060, 39065, 39069, 39073, 39077, 39081, 0,
+ 0, 0, 0, 0, 39085, 39091, 39097, 39104, 39111, 39116, 39121, 39125, 0, 0,
+ 39131, 39134, 39137, 39140, 39143, 39146, 39149, 39153, 39157, 39162,
+ 39167, 39172, 39179, 39183, 39186, 39189, 39192, 39195, 39198, 39201,
+ 39204, 39207, 39210, 39214, 39218, 39223, 39228, 0, 39233, 39239, 39245,
+ 39251, 39258, 39265, 39272, 39279, 39285, 39291, 39298, 39305, 39312, 0,
+ 0, 0, 39319, 39322, 39325, 39328, 39333, 39336, 39339, 39342, 39345,
+ 39348, 39351, 39355, 39358, 39361, 39364, 39367, 39370, 39375, 39378,
+ 39381, 39384, 39387, 39390, 39395, 39398, 39401, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39406, 39411, 39416, 39423,
+ 39431, 39436, 39441, 39445, 39449, 39454, 39461, 39468, 39472, 39477,
+ 39482, 39487, 39492, 39499, 39504, 39509, 39514, 39523, 39530, 39537,
+ 39541, 39546, 39552, 39557, 39564, 39573, 39582, 39586, 39590, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39594, 39598, 39606, 39610, 39614,
+ 39619, 39623, 39627, 39631, 39633, 39637, 39641, 39645, 39650, 39654,
+ 39658, 39666, 39669, 39673, 39676, 39679, 39685, 39689, 39692, 39698,
+ 39702, 39706, 39710, 39713, 39717, 39720, 39724, 39726, 39729, 39732,
+ 39736, 39738, 39742, 39745, 39748, 39753, 39758, 39765, 39768, 39771,
+ 39775, 39780, 39783, 39786, 39789, 39793, 39798, 39801, 39804, 39806,
+ 39809, 39812, 39815, 39819, 39824, 39827, 39831, 39835, 39839, 39843,
+ 39848, 39854, 39859, 39864, 39870, 39875, 39880, 39884, 39888, 39893,
+ 39897, 39901, 39904, 39906, 39911, 39917, 39924, 39931, 39938, 39945,
+ 39952, 39959, 39966, 39973, 39981, 39988, 39996, 40003, 40010, 40018,
+ 40026, 40031, 40036, 40041, 40046, 40051, 40056, 40061, 40066, 40071,
+ 40076, 40082, 40088, 40094, 40100, 40107, 40115, 40122, 40128, 40134,
+ 40140, 40146, 40152, 40158, 40164, 40170, 40176, 40183, 40190, 40197,
+ 40204, 40212, 40221, 40229, 40240, 40248, 40256, 40265, 40272, 40281,
+ 40290, 40298, 40307, 0, 0, 0, 0, 0, 0, 40315, 40317, 40320, 40322, 40325,
+ 40328, 40331, 40336, 40341, 40346, 40351, 40355, 40359, 40363, 40367,
+ 40372, 40378, 40383, 40389, 40394, 40399, 40404, 40410, 40415, 40421,
+ 40427, 40431, 40435, 40440, 40445, 40450, 40455, 40460, 40468, 40476,
+ 40484, 40492, 40499, 40507, 40514, 40521, 40530, 40542, 40548, 40554,
+ 40562, 40570, 40579, 40588, 40596, 40604, 40613, 40622, 40627, 40635,
+ 40640, 40645, 40651, 40656, 40662, 40669, 40676, 40681, 40687, 40692,
+ 40695, 40699, 40702, 40706, 40710, 40714, 40720, 40726, 40732, 40738,
+ 40742, 40746, 40750, 40754, 40760, 40766, 40770, 40775, 40779, 40784,
+ 40789, 40794, 40797, 40801, 40804, 40808, 40815, 40823, 40834, 40845,
+ 40850, 40859, 40866, 40875, 40884, 40888, 40894, 40902, 40906, 40911,
+ 40916, 40922, 40928, 40934, 40941, 40945, 40949, 40954, 40957, 40959,
+ 40963, 40967, 40975, 40979, 40981, 40983, 40987, 40995, 41000, 41006,
+ 41016, 41023, 41028, 41032, 41036, 41040, 41043, 41046, 41049, 41053,
+ 41057, 41061, 41065, 41069, 41072, 41076, 41080, 41083, 41085, 41088,
+ 41090, 41094, 41098, 41100, 41106, 41109, 41114, 41118, 41122, 41124,
+ 41126, 41128, 41131, 41135, 41139, 41143, 41147, 41151, 41157, 41163,
+ 41165, 41167, 41169, 41171, 41174, 41176, 41180, 41182, 41186, 41189,
+ 41195, 41199, 41203, 41206, 41209, 41213, 41219, 41223, 41233, 41243,
+ 41247, 41253, 41259, 41262, 41266, 41269, 41274, 41278, 41284, 41288,
+ 41300, 41308, 41312, 41316, 41322, 41326, 41329, 41331, 41334, 41338,
+ 41342, 41349, 41353, 41357, 41361, 41364, 41369, 41374, 41379, 41384,
+ 41389, 41394, 41402, 41410, 41414, 41418, 41420, 41425, 41429, 41433,
+ 41441, 41449, 41455, 41461, 41470, 41479, 41484, 41489, 41497, 41505,
+ 41507, 41509, 41514, 41519, 41525, 41531, 41537, 41543, 41547, 41551,
+ 41558, 41565, 41571, 41577, 41587, 41597, 41605, 41613, 41615, 41619,
+ 41623, 41628, 41633, 41640, 41647, 41650, 41653, 41656, 41659, 41662,
+ 41667, 41671, 41676, 41681, 41684, 41687, 41690, 41693, 41696, 41700,
+ 41703, 41706, 41709, 41712, 41714, 41716, 41718, 41720, 41728, 41736,
+ 41742, 41746, 41752, 41762, 41768, 41774, 41780, 41788, 41796, 41807,
+ 41811, 41815, 41817, 41823, 41825, 41827, 41829, 41831, 41837, 41840,
+ 41846, 41852, 41856, 41860, 41864, 41867, 41871, 41875, 41877, 41886,
+ 41895, 41900, 41905, 41911, 41917, 41923, 41926, 41929, 41932, 41935,
+ 41937, 41942, 41947, 41952, 41958, 41964, 41972, 41980, 41986, 41992,
+ 41998, 42004, 42013, 42022, 42031, 42040, 42049, 42058, 42067, 42076,
+ 42085, 42094, 42102, 42114, 42124, 42139, 42142, 42147, 42153, 42159,
+ 42166, 42180, 42195, 42201, 42207, 42214, 42220, 42228, 42234, 42247,
+ 42261, 42266, 42272, 42279, 42282, 42285, 42287, 42290, 42293, 42295,
+ 42297, 42301, 42304, 42307, 42310, 42313, 42318, 42323, 42328, 42333,
+ 42338, 42341, 42343, 42345, 42347, 42351, 42355, 42359, 42365, 42370,
+ 42372, 42374, 42379, 42384, 42389, 42394, 42399, 42404, 42406, 42408,
+ 42417, 42421, 42429, 42438, 42440, 42445, 42450, 42458, 42462, 42464,
+ 42468, 42470, 42474, 42478, 42482, 42484, 42486, 42488, 42495, 42504,
+ 42513, 42522, 42531, 42540, 42549, 42558, 42567, 42575, 42583, 42592,
+ 42601, 42610, 42619, 42627, 42635, 42644, 42653, 42662, 42672, 42681,
+ 42691, 42700, 42710, 42719, 42729, 42739, 42748, 42758, 42767, 42777,
+ 42786, 42796, 42805, 42814, 42823, 42832, 42841, 42851, 42860, 42869,
+ 42878, 42888, 42897, 42906, 42915, 42924, 42934, 42944, 42953, 42962,
+ 42970, 42978, 42985, 42993, 43002, 43013, 43022, 43031, 43040, 43047,
+ 43054, 43061, 43070, 43079, 43088, 43097, 43104, 43109, 43118, 43123,
+ 43126, 43134, 43137, 43142, 43147, 43150, 43153, 43161, 43164, 43169,
+ 43172, 43179, 43184, 43192, 43195, 43198, 43201, 43206, 43211, 43214,
+ 43217, 43225, 43228, 43235, 43242, 43246, 43250, 43255, 43260, 43266,
+ 43271, 43277, 43283, 43288, 43294, 43302, 43308, 43316, 43324, 43330,
+ 43338, 43346, 43355, 43363, 43369, 43377, 43386, 43394, 43398, 43403,
+ 43416, 43429, 43433, 43437, 43441, 43445, 43455, 43459, 43464, 43469,
+ 43474, 43479, 43484, 43489, 43499, 43509, 43517, 43527, 43537, 43545,
+ 43555, 43565, 43573, 43583, 43593, 43601, 43609, 43619, 43629, 43632,
+ 43635, 43638, 43643, 43647, 43653, 43660, 43667, 43675, 43682, 43686,
+ 43690, 43694, 43698, 43700, 43704, 43708, 43713, 43718, 43725, 43732,
+ 43735, 43742, 43744, 43746, 43750, 43754, 43759, 43765, 43771, 43777,
+ 43783, 43792, 43801, 43810, 43814, 43816, 43820, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43827, 43831, 43838, 43845, 43852, 43859, 43863, 43867,
+ 43871, 43875, 43880, 43886, 43891, 43897, 43903, 43909, 43915, 43923,
+ 43930, 43937, 43944, 43951, 43956, 43962, 43971, 43975, 43982, 43986,
+ 43990, 43996, 44002, 44008, 44014, 44018, 44022, 44025, 44028, 44032,
+ 44039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 44046, 44049, 44053, 44057, 44063, 44069, 44075, 44083, 44090,
+ 44094, 44102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 44107, 44110, 44113, 44116, 44119, 44122, 44125, 44128, 44131, 44134,
+ 44138, 44142, 44146, 44150, 44154, 44158, 44162, 44166, 44170, 44174,
+ 44178, 44181, 44184, 44187, 44190, 44193, 44196, 44199, 44202, 44205,
+ 44209, 44213, 44217, 44221, 44225, 44229, 44233, 44237, 44241, 44245,
+ 44249, 44255, 44261, 44267, 44274, 44281, 44288, 44295, 44302, 44309,
+ 44316, 44323, 44330, 44337, 44344, 44351, 44358, 44365, 44372, 44379,
+ 44386, 44391, 44397, 44403, 44409, 44414, 44420, 44426, 44432, 44437,
+ 44443, 44449, 44454, 44459, 44465, 44470, 44476, 44482, 44487, 44493,
+ 44499, 44504, 44510, 44516, 44522, 44528, 44534, 44539, 44545, 44551,
+ 44557, 44562, 44568, 44574, 44580, 44585, 44591, 44597, 44602, 44607,
+ 44613, 44618, 44624, 44630, 44635, 44641, 44647, 44652, 44658, 44664,
+ 44670, 44676, 44682, 44687, 44693, 44699, 44705, 44710, 44716, 44722,
+ 44728, 44733, 44739, 44745, 44750, 44755, 44761, 44766, 44772, 44778,
+ 44783, 44789, 44795, 44800, 44806, 44812, 44818, 44824, 44830, 44834,
+ 44839, 44844, 44849, 44854, 44859, 44864, 44869, 44874, 44879, 44884,
+ 44888, 44892, 44896, 44900, 44904, 44908, 44912, 44916, 44920, 44925,
+ 44930, 44935, 44940, 44945, 44950, 44959, 44968, 44977, 44986, 44995,
+ 45004, 45013, 45022, 45029, 45037, 45045, 45052, 45059, 45067, 45075,
+ 45082, 45089, 45097, 45105, 45112, 45119, 45127, 45135, 45142, 45149,
+ 45157, 45166, 45175, 45183, 45192, 45201, 45208, 45215, 45223, 45232,
+ 45241, 45249, 45258, 45267, 45274, 45281, 45290, 45299, 45307, 45315,
+ 45324, 45333, 45340, 45347, 45356, 45365, 45373, 45381, 45390, 45399,
+ 45406, 45413, 45422, 45431, 45439, 45448, 45457, 45465, 45475, 45485,
+ 45495, 45505, 45514, 45523, 45532, 45541, 45548, 45556, 45564, 45572,
+ 45580, 45585, 45590, 45599, 45607, 45614, 45623, 45631, 45638, 45647,
+ 45655, 45662, 45671, 45679, 45686, 45695, 45703, 45710, 45719, 45727,
+ 45734, 45743, 45751, 45758, 45767, 45775, 45782, 45791, 45799, 45806,
+ 45815, 45824, 45833, 45842, 45856, 45870, 45877, 45882, 45887, 45892,
+ 45897, 45902, 45907, 45912, 45917, 45925, 45933, 45941, 45949, 45954,
+ 45961, 45968, 45975, 45980, 45988, 45995, 46003, 46007, 46014, 46020,
+ 46027, 46031, 46037, 46043, 46049, 46053, 46056, 46060, 46064, 46071,
+ 46077, 46083, 46089, 46095, 46109, 46119, 46133, 46147, 46153, 46163,
+ 46177, 46180, 46183, 46190, 46198, 46203, 46208, 46216, 46228, 46240,
+ 46248, 46252, 46256, 46259, 46262, 46266, 46270, 46273, 46276, 46281,
+ 46286, 46292, 46298, 46303, 46308, 46314, 46320, 46325, 46330, 46335,
+ 46340, 46346, 46352, 46357, 46362, 46368, 46374, 46379, 46384, 46387,
+ 46390, 46399, 46401, 46403, 46406, 46410, 46416, 46418, 46421, 46428,
+ 46435, 46443, 46451, 46461, 46475, 46480, 46485, 46489, 46494, 46502,
+ 46510, 46519, 46528, 46537, 46546, 46551, 46556, 46562, 46568, 46574,
+ 46580, 46583, 46589, 46595, 46605, 46615, 46623, 46631, 46640, 46649,
+ 46653, 46661, 46669, 46677, 46685, 46694, 46703, 46712, 46721, 46726,
+ 46731, 46736, 46741, 46746, 46752, 46758, 46763, 46769, 46771, 46773,
+ 46775, 46777, 46780, 46783, 46785, 46787, 46789, 46793, 46797, 46799,
+ 46801, 46804, 46807, 46811, 46817, 46823, 46825, 46832, 46836, 46841,
+ 46846, 46848, 46858, 46864, 46870, 46876, 46882, 46888, 46894, 46899,
+ 46902, 46905, 46908, 46910, 46912, 46916, 46920, 46925, 46930, 46935,
+ 46938, 46942, 46947, 46950, 46954, 46959, 46964, 46969, 46974, 46979,
+ 46984, 46989, 46994, 46999, 47004, 47009, 47014, 47020, 47026, 47032,
+ 47034, 47037, 47039, 47042, 47044, 47046, 47048, 47050, 47052, 47054,
+ 47056, 47058, 47060, 47062, 47064, 47066, 47068, 47070, 47072, 47074,
+ 47076, 47081, 47086, 47091, 47096, 47101, 47106, 47111, 47116, 47121,
+ 47126, 47131, 47136, 47141, 47146, 47151, 47156, 47161, 47166, 47171,
+ 47176, 47180, 47184, 47188, 47194, 47200, 47205, 47210, 47215, 47220,
+ 47225, 47230, 47238, 47246, 47254, 47262, 47270, 47278, 47286, 47294,
+ 47300, 47305, 47310, 47315, 47318, 47322, 47326, 47330, 47334, 47338,
+ 47342, 47349, 47356, 47364, 47372, 47377, 47382, 47389, 47396, 47403,
+ 47410, 47413, 47416, 47421, 47423, 47427, 47432, 47434, 47436, 47438,
+ 47440, 47445, 47448, 47450, 47455, 47462, 47469, 47472, 47476, 47481,
+ 47486, 47494, 47500, 47506, 47518, 47525, 47532, 47537, 47542, 47548,
+ 47551, 47554, 47559, 47561, 47565, 47567, 47569, 47571, 47573, 47575,
+ 47577, 47582, 47584, 47586, 47588, 47590, 47594, 47596, 47599, 47604,
+ 47609, 47614, 47619, 47625, 47631, 47633, 47636, 47643, 47650, 47657,
+ 47664, 47668, 47672, 47674, 47676, 47680, 47686, 47691, 47693, 47697,
+ 47706, 47714, 47722, 47728, 47734, 47739, 47745, 47750, 47753, 47767,
+ 47770, 47775, 47780, 47786, 47796, 47798, 47804, 47810, 47814, 47821,
+ 47825, 47827, 47829, 47833, 47839, 47844, 47850, 47852, 47858, 47860,
+ 47866, 47868, 47870, 47875, 47877, 47881, 47886, 47888, 47893, 47898,
+ 47902, 47909, 0, 47919, 47925, 47928, 47934, 47937, 47942, 47947, 47951,
+ 47953, 47955, 47959, 47963, 47967, 47971, 47976, 47978, 47983, 47986,
+ 47989, 47992, 47996, 48000, 48005, 48009, 48014, 48019, 48023, 48028,
+ 48034, 48037, 48043, 48048, 48052, 48057, 48063, 48069, 48076, 48082,
+ 48089, 48096, 48098, 48105, 48109, 48115, 48121, 48126, 48132, 48136,
+ 48141, 48144, 48149, 48155, 48162, 48170, 48177, 48186, 48196, 48203,
+ 48209, 48213, 48220, 48225, 48234, 48237, 48240, 48249, 48259, 48266,
+ 48268, 48274, 48279, 48281, 48284, 48288, 48296, 48305, 48308, 48313,
+ 48318, 48326, 48334, 48342, 48350, 48356, 48362, 48368, 48376, 48381,
+ 48384, 48388, 48391, 48403, 48413, 48424, 48433, 48444, 48454, 48463,
+ 48469, 48477, 48481, 48489, 48493, 48501, 48508, 48515, 48524, 48533,
+ 48543, 48553, 48563, 48573, 48582, 48591, 48601, 48611, 48620, 48629,
+ 48635, 48641, 48647, 48653, 48659, 48665, 48671, 48677, 48683, 48690,
+ 48696, 48702, 48708, 48714, 48720, 48726, 48732, 48738, 48744, 48751,
+ 48758, 48765, 48772, 48779, 48786, 48793, 48800, 48807, 48814, 48822,
+ 48827, 48830, 48834, 48838, 48844, 48847, 48853, 48859, 48864, 48868,
+ 48873, 48879, 48886, 48889, 48896, 48903, 48907, 48916, 48925, 48930,
+ 48936, 48941, 48946, 48953, 48960, 48968, 48976, 48985, 48989, 48998,
+ 49003, 49007, 49014, 49018, 49025, 49033, 49038, 49046, 49050, 49055,
+ 49059, 49064, 49068, 49073, 49078, 49087, 49089, 49092, 49095, 49102,
+ 49109, 49114, 49122, 49128, 49134, 49139, 49142, 49147, 49152, 49157,
+ 49165, 49169, 49176, 49184, 49192, 49197, 49202, 49208, 49213, 49218,
+ 49224, 49229, 49232, 49236, 49240, 49247, 49256, 49261, 49270, 49279,
+ 49285, 49291, 49296, 49301, 49306, 49311, 49317, 49323, 49331, 49339,
+ 49345, 49351, 49356, 49361, 49368, 49375, 49381, 49384, 49387, 49391,
+ 49395, 49399, 49404, 49410, 49416, 49423, 49430, 49435, 49439, 49443,
+ 49447, 49451, 49455, 49459, 49463, 49467, 49471, 49475, 49479, 49483,
+ 49487, 49491, 49495, 49499, 49503, 49507, 49511, 49515, 49519, 49523,
+ 49527, 49531, 49535, 49539, 49543, 49547, 49551, 49555, 49559, 49563,
+ 49567, 49571, 49575, 49579, 49583, 49587, 49591, 49595, 49599, 49603,
+ 49607, 49611, 49615, 49619, 49623, 49627, 49631, 49635, 49639, 49643,
+ 49647, 49651, 49655, 49659, 49663, 49667, 49671, 49675, 49679, 49683,
+ 49687, 49691, 49695, 49699, 49703, 49707, 49711, 49715, 49719, 49723,
+ 49727, 49731, 49735, 49739, 49743, 49747, 49751, 49755, 49759, 49763,
+ 49767, 49771, 49775, 49779, 49783, 49787, 49791, 49795, 49799, 49803,
+ 49807, 49811, 49815, 49819, 49823, 49827, 49831, 49835, 49839, 49843,
+ 49847, 49851, 49855, 49859, 49863, 49867, 49871, 49875, 49879, 49883,
+ 49887, 49891, 49895, 49899, 49903, 49907, 49911, 49915, 49919, 49923,
+ 49927, 49931, 49935, 49939, 49943, 49947, 49951, 49955, 49959, 49963,
+ 49967, 49971, 49975, 49979, 49983, 49987, 49991, 49995, 49999, 50003,
+ 50007, 50011, 50015, 50019, 50023, 50027, 50031, 50035, 50039, 50043,
+ 50047, 50051, 50055, 50059, 50063, 50067, 50071, 50075, 50079, 50083,
+ 50087, 50091, 50095, 50099, 50103, 50107, 50111, 50115, 50119, 50123,
+ 50127, 50131, 50135, 50139, 50143, 50147, 50151, 50155, 50159, 50163,
+ 50167, 50171, 50175, 50179, 50183, 50187, 50191, 50195, 50199, 50203,
+ 50207, 50211, 50215, 50219, 50223, 50227, 50231, 50235, 50239, 50243,
+ 50247, 50251, 50255, 50259, 50263, 50267, 50271, 50275, 50279, 50283,
+ 50287, 50291, 50295, 50299, 50303, 50307, 50311, 50315, 50319, 50323,
+ 50327, 50331, 50335, 50339, 50343, 50347, 50351, 50355, 50359, 50363,
+ 50367, 50371, 50375, 50379, 50383, 50387, 50391, 50395, 50399, 50403,
+ 50407, 50411, 50415, 50419, 50423, 50427, 50431, 50435, 50439, 50443,
+ 50447, 50451, 50455, 50459, 50466, 50474, 50480, 50486, 50493, 50500,
+ 50506, 50512, 50518, 50524, 50529, 50534, 50539, 50544, 50550, 50556,
+ 50564, 50571, 50577, 50583, 50591, 50600, 50607, 50617, 50628, 50631,
+ 50634, 50638, 50642, 50649, 50656, 50667, 50678, 50688, 50698, 50705,
+ 50712, 50719, 50726, 50737, 50748, 50759, 50770, 50780, 50790, 50802,
+ 50814, 50825, 50836, 50848, 50860, 50869, 50879, 50889, 50900, 50911,
+ 50918, 50925, 50932, 50939, 50949, 50959, 50967, 50975, 50982, 50989,
+ 50996, 51003, 51010, 51015, 51020, 51026, 51034, 51044, 51054, 51064,
+ 51074, 51084, 51094, 51104, 51114, 51124, 51134, 51144, 51155, 51166,
+ 51176, 51186, 51197, 51208, 51218, 51228, 51239, 51250, 51260, 51270,
+ 51281, 51292, 51308, 51327, 51343, 51362, 51378, 51394, 51410, 51426,
+ 51437, 51449, 51460, 51472, 51491, 51510, 51518, 51524, 51531, 51538,
+ 51545, 51552, 51557, 51563, 51568, 51573, 51579, 51584, 51589, 51594,
+ 51599, 51604, 51611, 51616, 51623, 51628, 51633, 51637, 51641, 51648,
+ 51655, 51662, 51669, 51676, 51683, 51696, 51709, 51722, 51735, 51743,
+ 51751, 51757, 51763, 51770, 51777, 51784, 51791, 51795, 51800, 51808,
+ 51816, 51824, 51831, 51835, 51843, 51851, 51855, 51859, 51864, 51871,
+ 51879, 51887, 51906, 51925, 51944, 51963, 51982, 52001, 52020, 52039,
+ 52045, 52052, 52061, 52069, 52077, 52082, 52085, 52088, 52093, 52096,
+ 52115, 52122, 52128, 52134, 52138, 52141, 52144, 52147, 52159, 52172,
+ 52179, 52186, 52189, 52193, 52196, 52201, 52206, 52211, 52217, 52226,
+ 52233, 52240, 52248, 52255, 52262, 52265, 52271, 52277, 52280, 52283,
+ 52288, 52293, 52299, 52305, 52309, 52314, 52321, 52325, 52331, 52335,
+ 52339, 52347, 52359, 52368, 52372, 52374, 52383, 52392, 52398, 52401,
+ 52407, 52413, 52418, 52423, 52428, 52433, 52438, 52443, 52445, 52451,
+ 52456, 52463, 52467, 52473, 52476, 52480, 52487, 52494, 52496, 52498,
+ 52504, 52510, 52516, 52525, 52534, 52541, 52548, 52554, 52560, 52565,
+ 52570, 52575, 52581, 52587, 52592, 52599, 52603, 52607, 52620, 52633,
+ 52645, 52654, 52660, 52667, 52672, 52677, 52682, 52687, 52692, 52694,
+ 52701, 52708, 52715, 52722, 52729, 52737, 52743, 52748, 52754, 52760,
+ 52766, 52773, 52779, 52787, 52795, 52803, 52811, 52818, 52824, 52830,
+ 52839, 52843, 52852, 52861, 52870, 52878, 52882, 52888, 52895, 52902,
+ 52906, 52912, 52919, 52924, 52929, 52935, 52940, 52945, 52952, 52959,
+ 52964, 52969, 52977, 52985, 52995, 53005, 53012, 53019, 53023, 53027,
+ 53039, 53045, 53051, 53056, 53061, 53068, 53075, 53081, 53087, 53096,
+ 53104, 53112, 53119, 53126, 53133, 53139, 53146, 53152, 53159, 53166,
+ 53173, 53180, 53186, 53191, 53200, 53210, 53217, 53226, 53232, 53237,
+ 53242, 53252, 53258, 53264, 53270, 53278, 53283, 53290, 53297, 53308,
+ 53315, 53322, 53329, 53336, 53343, 53350, 53357, 53369, 53381, 53392,
+ 53403, 53416, 53429, 53434, 53439, 53448, 53457, 53464, 53471, 53480,
+ 53489, 53497, 53505, 53513, 53521, 53531, 53541, 53555, 53569, 53577,
+ 53585, 53597, 53609, 53617, 53625, 53635, 53645, 53650, 53655, 53664,
+ 53673, 53678, 53683, 53691, 53697, 53703, 53711, 53719, 53732, 53745,
+ 53749, 53753, 53760, 53767, 53774, 53782, 53790, 53799, 53808, 53814,
+ 53820, 53827, 53834, 53841, 53848, 53857, 53866, 53869, 53872, 53877,
+ 53882, 53888, 53894, 53901, 53908, 53918, 53928, 53935, 53942, 53950,
+ 53958, 53966, 53974, 53982, 53990, 53996, 54002, 54006, 54010, 54017,
+ 54024, 54029, 54034, 54039, 54044, 54050, 54064, 54071, 54078, 54082,
+ 54084, 54086, 54091, 54096, 54101, 54106, 54114, 54121, 54128, 54136,
+ 54148, 54156, 54164, 54175, 54179, 54183, 54189, 54197, 54210, 54217,
+ 54224, 54231, 54236, 54243, 54252, 54260, 54266, 54272, 54278, 54287,
+ 54296, 54304, 54313, 54318, 54321, 54326, 54332, 54338, 54344, 54350,
+ 54354, 54357, 54361, 54365, 54371, 54377, 54383, 54389, 54393, 54397,
+ 54404, 54411, 54418, 54425, 54432, 54439, 54449, 54459, 54466, 54473,
+ 54481, 54489, 54493, 54498, 54503, 54509, 54515, 54518, 54521, 54524,
+ 54527, 54531, 54536, 54541, 54546, 54551, 54556, 54560, 54564, 54568,
+ 54572, 54576, 54580, 54584, 54590, 54594, 54600, 54605, 54612, 54620,
+ 54627, 54635, 54642, 54650, 54659, 54666, 54676, 54687, 54693, 54702,
+ 54708, 54717, 54726, 54732, 54738, 54742, 54746, 54755, 54764, 54771,
+ 54778, 54787, 0, 0, 0, 54796, 54801, 54805, 54809, 54814, 54819, 54824,
+ 54832, 54840, 54843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30062, 30068,
- 30074, 30078, 30082, 30086, 30090, 30096, 30100, 30106, 30110, 30116,
- 30122, 30130, 30136, 30144, 30148, 30152, 30156, 30162, 30165, 30171,
- 30175, 30181, 30185, 30189, 30195, 30199, 30205, 30209, 30215, 30223,
- 30231, 30239, 30245, 30249, 30255, 30259, 30265, 30268, 30271, 30277,
- 30281, 30287, 30290, 30293, 30296, 30300, 30304, 30310, 30316, 30320,
- 30323, 30327, 30332, 30337, 30344, 30349, 30356, 30363, 30372, 30379,
- 30388, 30393, 30400, 30407, 30416, 30421, 30428, 30433, 30439, 30445,
- 30451, 30457, 30463, 30469, 0, 0, 0, 0, 30475, 30479, 30482, 30485,
- 30488, 30491, 30494, 30497, 30500, 30503, 30506, 30509, 30512, 30515,
- 30520, 30525, 30530, 30533, 30538, 30543, 30548, 30553, 30560, 30565,
- 30570, 30575, 30580, 30587, 30593, 30599, 30605, 30611, 30617, 30626,
- 30635, 30641, 30647, 30656, 30665, 30674, 30683, 30692, 30701, 30710,
- 30719, 0, 0, 0, 30728, 30733, 30738, 30743, 30747, 30751, 30755, 30760,
- 30764, 30768, 30773, 30777, 30782, 30787, 30792, 30797, 30802, 30807,
- 30812, 30817, 30822, 30826, 30830, 30835, 30840, 30845, 30849, 30853,
- 30857, 30862, 30867, 30872, 30877, 30881, 30888, 30895, 30902, 30908,
- 30914, 30920, 30926, 30932, 30938, 0, 0, 0, 30943, 30948, 30953, 30958,
- 30962, 30966, 30970, 30974, 30978, 30982, 30986, 30990, 0, 0, 0, 0, 0, 0,
- 30994, 30998, 31004, 31008, 31014, 31020, 31025, 31032, 31036, 31042,
- 31046, 31052, 31057, 31064, 31071, 31076, 31083, 31088, 31093, 31097,
- 31103, 31107, 31113, 31120, 31127, 31132, 31139, 31146, 31150, 31156,
- 31161, 31166, 31173, 31178, 31183, 31188, 31193, 31197, 31201, 31206,
- 31211, 31218, 31224, 31229, 31236, 31241, 31248, 31253, 31263, 31270,
- 31277, 31281, 0, 0, 0, 0, 0, 0, 0, 0, 31285, 31294, 31301, 31308, 31315,
- 31318, 31322, 31326, 31330, 31334, 31338, 31342, 31346, 31350, 31354,
- 31358, 31362, 31366, 31369, 31372, 31376, 31380, 31384, 31388, 31392,
- 31396, 31399, 31403, 31407, 31411, 31415, 31418, 31421, 31425, 31428,
- 31432, 31436, 31440, 31444, 31448, 31451, 31456, 31461, 31466, 31470,
- 31474, 31479, 31483, 31488, 31492, 31498, 31503, 31508, 31513, 31519,
- 31524, 31530, 31536, 31542, 31546, 0, 0, 0, 31550, 31555, 31564, 31569,
- 31576, 31581, 31585, 31588, 31591, 31594, 31597, 31600, 31603, 31606,
- 31609, 0, 0, 0, 31612, 31616, 31620, 31624, 31631, 31637, 31643, 31649,
- 31655, 31661, 31667, 31673, 31679, 31685, 31692, 31699, 31706, 31713,
- 31720, 31727, 31734, 31741, 31748, 31755, 31762, 31769, 31776, 31783,
- 31790, 31797, 31804, 31811, 31818, 31825, 31832, 31839, 31846, 31853,
- 31860, 31867, 31874, 31881, 31888, 31895, 31903, 31911, 31919, 31925,
- 31931, 31937, 31945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31954, 31959, 31964, 31969,
- 31974, 31983, 31994, 32003, 32014, 32020, 32033, 32039, 32046, 32053,
- 32058, 32064, 32070, 32081, 32090, 32097, 32104, 32113, 32120, 32129,
- 32139, 32149, 32156, 32163, 32170, 32180, 32185, 32193, 32199, 32207,
- 32216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32221, 32226, 32232, 32239,
- 32247, 32253, 32259, 32265, 32270, 32278, 32284, 32290, 32296, 32304,
- 32309, 32316, 32321, 32328, 32334, 32342, 32350, 32357, 32363, 32370,
- 32377, 32383, 32390, 32397, 32403, 32408, 32414, 32422, 32430, 32436,
- 32442, 32448, 32454, 32462, 32466, 32472, 32478, 32484, 32490, 32496,
- 32502, 32506, 32511, 32516, 32523, 32528, 32532, 32538, 32543, 32548,
- 32552, 32557, 32562, 32566, 32570, 32574, 32580, 32584, 32589, 32594,
- 32598, 32603, 32607, 32612, 32616, 32622, 32627, 32634, 32639, 32644,
- 32648, 32653, 32659, 32667, 32672, 32678, 32683, 32687, 32692, 32696,
- 32702, 32709, 32716, 32721, 32726, 32730, 32736, 32742, 32747, 32752,
- 32757, 32763, 32768, 32774, 32779, 32785, 32791, 32797, 32804, 32811,
- 32818, 32825, 32832, 32839, 32844, 32853, 32863, 32873, 32883, 32893,
- 32903, 32913, 32926, 32936, 32946, 32956, 32963, 32968, 32975, 32983,
- 32991, 32998, 33005, 33012, 33019, 33027, 33036, 33045, 33054, 33063,
- 33072, 33081, 33090, 33099, 33108, 33117, 33126, 33135, 33144, 33153,
- 33161, 33170, 33181, 33189, 33199, 33211, 33220, 33229, 33239, 33248,
- 33256, 33265, 33272, 33277, 33285, 33290, 33298, 33303, 33312, 33318,
- 33325, 33332, 33337, 33342, 33350, 33358, 33367, 33376, 33381, 33388,
- 33399, 33407, 33416, 33421, 33427, 33432, 33439, 33444, 33453, 33458,
- 33463, 33468, 33475, 33482, 33487, 33496, 33504, 33509, 33514, 33521,
- 33528, 33532, 33536, 33539, 33542, 33545, 33548, 33551, 33554, 33561,
- 33564, 33567, 33572, 33576, 33580, 33584, 33588, 33592, 33602, 33608,
- 33614, 33620, 33628, 33636, 33642, 33648, 33655, 33661, 33666, 33672,
- 33678, 33683, 33689, 33695, 33703, 33708, 33714, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33720, 33727, 33734, 33739, 33748,
- 33756, 33764, 33771, 33778, 33785, 33792, 33800, 33808, 33818, 33828,
- 33836, 33844, 33852, 33860, 33869, 33878, 33886, 33894, 33903, 33912,
- 33922, 33932, 33941, 33950, 33958, 33966, 33974, 33982, 33992, 34002,
- 34010, 34018, 34026, 34034, 34042, 34050, 34058, 34066, 34074, 34082,
- 34090, 34098, 34107, 34116, 34125, 34134, 34144, 34154, 34161, 34168,
- 34176, 34184, 34193, 34202, 34210, 34218, 34230, 34242, 34251, 34260,
- 34269, 34278, 34285, 34292, 34300, 34308, 34316, 34324, 34332, 34340,
- 34348, 34356, 34365, 34374, 34383, 34392, 34401, 34410, 34420, 34430,
- 34440, 34450, 34459, 34468, 34475, 34482, 34490, 34498, 34506, 34514,
- 34522, 34530, 34542, 34554, 34563, 34572, 34580, 34588, 34596, 34604,
- 34615, 34626, 34637, 34648, 34660, 34672, 34680, 34688, 34696, 34704,
- 34713, 34722, 34731, 34740, 34748, 34756, 34764, 34772, 34780, 34788,
- 34797, 34806, 34816, 34826, 34834, 34842, 34850, 34858, 34866, 34874,
- 34881, 34888, 34896, 34904, 34912, 34920, 34928, 34936, 34944, 34952,
- 34960, 34968, 34976, 34984, 34992, 35000, 35008, 35016, 35025, 35034,
- 35043, 35051, 35060, 35069, 35078, 35087, 35097, 35106, 35112, 35117,
- 35124, 35131, 35139, 35147, 35156, 35165, 35175, 35185, 35196, 35207,
- 35217, 35227, 35237, 35247, 35256, 35265, 35275, 35285, 35296, 35307,
- 35317, 35327, 35337, 35347, 35354, 35361, 35369, 35377, 35384, 35391,
- 35400, 35409, 35419, 35429, 35440, 35451, 35461, 35471, 35481, 35491,
- 35500, 35509, 35517, 35525, 35532, 35539, 35547, 35555, 35564, 35573,
- 35583, 35593, 35604, 35615, 35625, 35635, 35645, 35655, 35664, 35673,
- 35683, 35693, 35704, 35715, 35725, 35735, 35745, 35755, 35762, 35769,
- 35777, 35785, 35794, 35803, 35813, 35823, 35834, 35845, 35855, 35865,
- 35875, 35885, 35893, 35901, 35909, 35917, 35926, 35935, 35943, 35951,
- 35958, 35965, 35972, 35979, 35987, 35995, 36003, 36011, 36022, 36032,
- 36043, 36053, 36064, 36074, 36082, 36090, 36101, 36111, 36122, 36132,
- 36143, 36153, 36161, 36169, 36180, 36190, 36201, 0, 0, 36211, 36219,
- 36227, 36238, 36248, 36259, 0, 0, 36269, 36277, 36285, 36296, 36306,
- 36317, 36327, 36338, 36348, 36356, 36364, 36375, 36385, 36396, 36406,
- 36417, 36427, 36435, 36443, 36454, 36464, 36475, 36485, 36496, 36506,
- 36514, 36522, 36533, 36543, 36554, 36564, 36575, 36585, 36593, 36601,
- 36612, 36622, 36633, 0, 0, 36643, 36651, 36659, 36670, 36680, 36691, 0,
- 0, 36701, 36709, 36717, 36728, 36738, 36749, 36759, 36770, 0, 36780, 0,
- 36788, 0, 36798, 0, 36808, 36818, 36826, 36834, 36845, 36855, 36866,
- 36876, 36887, 36897, 36905, 36913, 36924, 36934, 36945, 36955, 36966,
- 36976, 36984, 36992, 37000, 37008, 37016, 37024, 37032, 37040, 37048,
- 37056, 37064, 37072, 37080, 0, 0, 37088, 37099, 37109, 37123, 37136,
- 37150, 37163, 37177, 37190, 37201, 37211, 37225, 37238, 37252, 37265,
- 37279, 37292, 37303, 37313, 37327, 37340, 37354, 37367, 37381, 37394,
- 37405, 37415, 37429, 37442, 37456, 37469, 37483, 37496, 37507, 37517,
- 37531, 37544, 37558, 37571, 37585, 37598, 37609, 37619, 37633, 37646,
- 37660, 37673, 37687, 37700, 37708, 37716, 37727, 37735, 0, 37746, 37754,
- 37765, 37773, 37781, 37789, 37797, 37805, 37808, 37811, 37814, 37817,
- 37823, 37834, 37842, 0, 37853, 37861, 37872, 37880, 37888, 37896, 37904,
- 37912, 37918, 37924, 37930, 37938, 37946, 37957, 0, 0, 37968, 37976,
- 37987, 37995, 38003, 38011, 0, 38019, 38024, 38029, 38034, 38042, 38050,
- 38061, 38072, 38080, 38088, 38096, 38107, 38115, 38123, 38131, 38139,
- 38147, 38153, 38159, 0, 0, 38162, 38173, 38181, 0, 38192, 38200, 38211,
- 38219, 38227, 38235, 38243, 38251, 38254, 0, 38257, 38261, 38265, 38269,
- 38273, 38277, 38281, 38285, 38289, 38293, 38297, 38301, 38307, 38313,
- 38319, 38322, 38325, 38327, 38331, 38335, 38339, 38343, 38345, 38349,
- 38353, 38359, 38365, 38372, 38379, 38384, 38389, 38395, 38401, 38403,
- 38406, 38408, 38412, 38416, 38420, 38423, 38427, 38431, 38435, 38439,
- 38443, 38449, 38453, 38457, 38463, 38468, 38475, 38477, 38480, 38484,
- 38488, 38493, 38499, 38501, 38510, 38519, 38522, 38526, 38528, 38530,
- 38532, 38535, 38541, 38543, 38547, 38551, 38558, 38565, 38569, 38574,
- 38579, 38584, 38589, 38593, 38597, 38600, 38604, 38608, 38615, 38620,
- 38624, 38628, 38633, 38637, 38641, 38646, 38651, 38655, 38659, 38663,
- 38665, 38670, 38675, 38679, 38683, 38687, 38691, 0, 0, 0, 0, 0, 38695,
- 38701, 38707, 38714, 38721, 38726, 38731, 38735, 0, 0, 38741, 38744,
- 38747, 38750, 38753, 38756, 38759, 38763, 38767, 38772, 38777, 38782,
- 38788, 38792, 38795, 38798, 38801, 38804, 38807, 38810, 38813, 38816,
- 38819, 38823, 38827, 38832, 38837, 0, 38842, 38848, 38854, 38860, 38867,
- 38874, 38881, 38888, 38894, 38900, 38906, 38913, 38919, 0, 0, 0, 38926,
- 38929, 38932, 38935, 38940, 38943, 38946, 38949, 38952, 38955, 38958,
- 38962, 38965, 38968, 38971, 38974, 38977, 38982, 38985, 38988, 38991,
- 38994, 38997, 39002, 39005, 39008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 39013, 39018, 39023, 39030, 39038, 39043,
- 39048, 39052, 39056, 39061, 39068, 39075, 39079, 39084, 39089, 39094,
- 39099, 39106, 39111, 39116, 39121, 39130, 39137, 39144, 39148, 39153,
- 39159, 39164, 39171, 39179, 39187, 39191, 39195, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 39199, 39203, 39211, 39215, 39219, 39224, 39228,
- 39232, 39236, 39238, 39242, 39246, 39250, 39255, 39259, 39263, 39271,
- 39274, 39278, 39281, 39284, 39290, 39293, 39296, 39302, 39306, 39310,
- 39314, 39317, 39321, 39324, 39328, 39330, 39333, 39336, 39340, 39342,
- 39346, 39349, 39352, 39357, 39362, 39369, 39372, 39375, 39379, 39384,
- 39387, 39390, 39393, 39397, 39402, 39405, 39408, 39410, 39413, 39416,
- 39419, 39423, 39428, 39431, 39435, 39439, 39443, 39447, 39452, 39458,
- 39463, 39468, 39474, 39479, 39484, 39488, 39492, 39497, 39501, 39505,
- 39508, 39510, 39515, 39521, 39528, 39535, 39542, 39549, 39556, 39563,
- 39570, 39577, 39585, 39592, 39600, 39607, 39614, 39622, 39630, 39635,
- 39640, 39645, 39650, 39655, 39660, 39665, 39670, 39675, 39680, 39686,
- 39692, 39698, 39704, 39711, 39719, 39726, 39732, 39738, 39744, 39750,
- 39756, 39762, 39768, 39774, 39780, 39787, 39794, 39801, 39808, 39816,
- 39825, 39833, 39844, 39852, 39860, 39869, 39876, 39885, 39894, 39902,
- 39911, 0, 0, 0, 0, 0, 0, 39919, 39921, 39924, 39926, 39929, 39932, 39935,
- 39940, 39945, 39950, 39955, 39959, 39963, 39967, 39971, 39976, 39982,
- 39987, 39993, 39998, 40003, 40008, 40014, 40019, 40025, 40031, 40035,
- 40039, 40044, 40049, 40054, 40059, 40064, 40072, 40080, 40088, 40096,
- 40103, 40111, 40118, 40125, 40134, 40146, 40153, 40160, 40167, 40174,
- 40182, 40190, 40197, 40204, 40212, 40220, 40225, 40233, 40238, 40243,
- 40249, 40254, 40260, 40267, 40274, 40279, 40285, 40290, 40293, 40297,
- 40300, 40304, 40308, 40312, 40318, 40324, 40330, 40336, 40340, 40344,
- 40348, 40352, 40358, 40364, 40368, 40373, 40377, 40382, 40387, 40392,
- 40395, 40399, 40402, 40406, 40413, 40421, 40432, 40443, 40448, 40457,
- 40464, 40473, 40482, 40486, 40492, 40500, 40504, 40509, 40514, 40520,
- 40526, 40532, 40539, 40543, 40547, 40552, 40555, 40557, 40561, 40565,
- 40573, 40577, 40579, 40581, 40585, 40593, 40598, 40604, 40614, 40621,
- 40626, 40630, 40634, 40638, 40641, 40644, 40647, 40651, 40655, 40659,
- 40663, 40667, 40670, 40674, 40678, 40681, 40683, 40686, 40688, 40692,
- 40696, 40698, 40704, 40707, 40712, 40716, 40720, 40722, 40724, 40726,
- 40729, 40733, 40737, 40741, 40745, 40749, 40755, 40761, 40763, 40765,
- 40767, 40769, 40772, 40774, 40778, 40780, 40784, 40788, 40793, 40797,
- 40801, 40805, 40809, 40813, 40819, 40823, 40833, 40843, 40847, 40853,
- 40859, 40863, 40867, 40870, 40875, 40879, 40885, 40889, 40901, 40909,
- 40913, 40917, 40923, 40927, 40930, 40932, 40935, 40939, 40943, 40950,
- 40954, 40958, 40962, 40965, 40970, 40975, 40980, 40985, 40990, 40995,
- 41003, 41011, 41015, 41019, 41021, 41026, 41030, 41034, 41042, 41050,
- 41056, 41062, 41071, 41080, 41085, 41090, 41098, 41106, 41108, 41110,
- 41115, 41120, 41126, 41132, 41138, 41144, 41148, 41152, 41159, 41166,
- 41172, 41178, 41188, 41198, 41206, 41214, 41216, 41220, 41224, 41229,
- 41234, 41241, 41248, 41251, 41254, 41257, 41260, 41263, 41268, 41272,
- 41277, 41282, 41285, 41288, 41291, 41294, 41297, 41301, 41304, 41307,
- 41310, 41313, 41315, 41317, 41319, 41321, 41329, 41337, 41343, 41347,
- 41353, 41363, 41369, 41375, 41381, 41389, 41397, 41408, 41412, 41416,
- 41418, 41424, 41426, 41428, 41430, 41432, 41438, 41441, 41447, 41453,
- 41457, 41461, 41465, 41468, 41472, 41476, 41478, 41487, 41496, 41501,
- 41506, 41512, 41518, 41524, 41527, 41530, 41533, 41536, 41538, 41543,
- 41548, 41553, 41559, 41565, 41573, 41581, 41587, 41593, 41599, 41605,
- 41614, 41623, 41632, 41641, 41650, 41659, 41668, 41677, 41686, 41695,
- 41703, 41715, 41725, 41740, 41743, 41748, 41754, 41760, 41767, 41781,
- 41796, 41802, 41808, 41815, 41821, 41829, 41835, 41848, 41862, 41867,
- 41873, 41880, 41883, 41886, 41888, 41891, 41894, 41896, 41898, 41902,
- 41905, 41908, 41911, 41914, 41919, 41924, 41929, 41934, 41939, 41942,
- 41944, 41946, 41948, 41952, 41956, 41960, 41966, 41971, 41973, 41975,
- 41980, 41985, 41990, 41995, 42000, 42005, 42007, 42009, 42018, 42022,
- 42030, 42039, 42041, 42046, 42051, 42059, 42063, 42065, 42069, 42071,
- 42075, 42079, 42083, 42085, 42087, 42089, 42094, 42101, 42108, 42115,
- 42122, 42129, 42136, 42143, 42150, 42156, 42162, 42169, 42176, 42183,
- 42190, 42196, 42202, 42209, 42216, 42223, 42231, 42238, 42246, 42253,
- 42261, 42268, 42276, 42284, 42291, 42299, 42306, 42314, 42321, 42329,
- 42336, 42343, 42350, 42357, 42364, 42372, 42379, 42386, 42393, 42401,
- 42408, 42415, 42422, 42429, 42437, 42445, 42452, 42459, 42465, 42472,
- 42477, 42484, 42491, 42500, 42507, 42515, 42523, 42528, 42533, 42538,
- 42545, 42552, 42559, 42566, 42571, 42576, 42585, 42591, 42594, 42602,
- 42605, 42610, 42615, 42618, 42621, 42629, 42632, 42637, 42640, 42647,
- 42652, 42660, 42663, 42666, 42669, 42674, 42679, 42682, 42685, 42693,
- 42696, 42701, 42708, 42712, 42716, 42721, 42726, 42732, 42737, 42743,
- 42749, 42754, 42760, 42768, 42774, 42782, 42790, 42796, 42804, 42812,
- 42821, 42829, 42835, 42843, 42852, 42860, 42864, 42869, 42882, 42895,
- 42899, 42903, 42907, 42911, 42921, 42925, 42930, 42935, 42940, 42945,
- 42950, 42955, 42965, 42975, 42983, 42993, 43003, 43011, 43021, 43031,
- 43039, 43049, 43059, 43067, 43075, 43085, 43095, 43098, 43101, 43104,
- 43109, 43113, 43119, 43126, 43133, 43141, 43148, 43152, 43156, 43160,
- 43164, 43166, 43170, 43174, 43179, 43184, 43191, 43198, 43201, 43208,
- 43210, 43212, 43216, 43220, 43225, 43231, 43237, 43243, 43249, 43258,
- 43267, 43276, 43280, 43282, 43286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 43293, 43297, 43304, 43311, 43318, 43325, 43329, 43333, 43337, 43341,
- 43346, 43352, 43357, 43363, 43369, 43375, 43381, 43389, 43396, 43403,
- 43410, 43417, 43422, 43428, 43437, 43441, 43448, 43452, 43456, 43462,
- 43468, 43474, 43480, 43484, 43488, 43491, 43495, 43499, 43506, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43513,
- 43516, 43520, 43524, 43530, 43536, 43542, 43550, 43557, 43561, 43569, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43574, 43577,
- 43580, 43583, 43586, 43589, 43592, 43595, 43598, 43601, 43605, 43609,
- 43613, 43617, 43621, 43625, 43629, 43633, 43637, 43641, 43645, 43648,
- 43651, 43654, 43657, 43660, 43663, 43666, 43669, 43672, 43676, 43680,
- 43684, 43688, 43692, 43696, 43700, 43704, 43708, 43712, 43716, 43722,
- 43728, 43734, 43741, 43748, 43755, 43762, 43769, 43776, 43783, 43790,
- 43797, 43804, 43811, 43818, 43825, 43832, 43839, 43846, 43853, 43858,
- 43864, 43870, 43876, 43881, 43887, 43893, 43899, 43904, 43910, 43916,
- 43921, 43926, 43931, 43936, 43942, 43948, 43953, 43958, 43964, 43969,
- 43975, 43981, 43987, 43993, 43999, 44004, 44010, 44016, 44022, 44027,
- 44033, 44039, 44045, 44050, 44056, 44062, 44067, 44072, 44077, 44082,
- 44088, 44094, 44099, 44104, 44110, 44115, 44121, 44127, 44133, 44139,
- 44145, 44150, 44156, 44162, 44168, 44173, 44179, 44185, 44191, 44196,
- 44202, 44208, 44213, 44218, 44223, 44228, 44234, 44240, 44245, 44250,
- 44256, 44261, 44267, 44273, 44279, 44285, 44291, 44295, 44300, 44305,
- 44310, 44315, 44320, 44325, 44330, 44335, 44340, 44345, 44349, 44353,
- 44357, 44361, 44365, 44369, 44373, 44377, 44381, 44386, 44391, 44396,
- 44401, 44406, 44411, 44420, 44429, 44438, 44447, 44456, 44465, 44474,
- 44483, 44490, 44498, 44506, 44513, 44520, 44528, 44536, 44543, 44550,
- 44558, 44566, 44573, 44580, 44588, 44596, 44603, 44610, 44618, 44627,
- 44636, 44644, 44653, 44662, 44669, 44676, 44684, 44693, 44702, 44710,
- 44719, 44728, 44735, 44742, 44751, 44760, 44768, 44776, 44785, 44794,
- 44801, 44808, 44817, 44826, 44834, 44842, 44851, 44860, 44867, 44874,
- 44883, 44892, 44900, 44909, 44918, 44926, 44936, 44946, 44956, 44966,
- 44975, 44984, 44993, 45002, 45009, 45017, 45025, 45033, 45041, 45046,
- 45051, 45060, 45068, 45075, 45084, 45092, 45099, 45108, 45116, 45123,
- 45132, 45140, 45147, 45156, 45164, 45171, 45180, 45188, 45195, 45204,
- 45212, 45219, 45228, 45236, 45243, 45252, 45260, 45267, 45276, 45285,
- 45294, 45303, 45317, 45331, 45338, 45343, 45348, 45353, 45358, 45363,
- 45368, 45373, 45378, 45386, 45394, 45402, 45410, 45415, 45422, 45429,
- 45436, 45441, 45449, 45456, 45464, 45468, 45475, 45481, 45488, 45492,
- 45498, 45504, 45510, 45514, 45517, 45521, 45525, 45532, 45538, 45544,
- 45550, 45556, 45570, 45580, 45594, 45608, 45614, 45624, 45638, 45641,
- 45644, 45651, 45659, 45664, 45669, 45677, 45689, 45701, 45709, 45713,
- 45717, 45720, 45723, 45727, 45731, 45734, 45737, 45742, 45747, 45753,
- 45759, 45764, 45769, 45775, 45781, 45786, 45791, 45796, 45801, 45807,
- 45813, 45818, 45823, 45829, 45835, 45840, 45845, 45848, 45851, 45860,
- 45862, 45864, 45867, 45871, 45877, 45879, 45882, 45889, 45896, 45904,
- 45912, 45922, 45936, 45941, 45946, 45950, 45955, 45963, 45971, 45980,
- 45989, 45998, 46007, 46012, 46017, 46023, 46029, 46035, 46041, 46044,
- 46050, 46056, 46066, 46076, 46084, 46092, 46101, 46110, 46114, 46122,
- 46130, 46138, 46146, 46155, 46164, 46173, 46182, 46187, 46192, 46197,
- 46202, 46207, 46213, 46219, 46224, 46230, 46232, 46234, 46236, 46238,
- 46241, 46244, 46246, 46248, 46250, 46254, 46258, 46260, 46262, 46265,
- 46268, 46272, 46278, 46284, 46286, 46293, 46297, 46302, 46307, 46309,
- 46319, 46325, 46331, 46337, 46343, 46349, 46355, 46360, 46363, 46366,
- 46369, 46371, 46373, 46377, 46381, 46386, 46391, 46396, 46399, 46403,
- 46408, 46411, 46415, 46420, 46425, 46430, 46435, 46440, 46445, 46450,
- 46455, 46460, 46465, 46470, 46475, 46481, 46487, 46493, 46495, 46498,
- 46500, 46503, 46505, 46507, 46509, 46511, 46513, 46515, 46517, 46519,
- 46521, 46523, 46525, 46527, 46529, 46531, 46533, 46535, 46537, 46542,
- 46547, 46552, 46557, 46562, 46567, 46572, 46577, 46582, 46587, 46592,
- 46597, 46602, 46607, 46612, 46617, 46622, 46627, 46632, 46637, 46641,
- 46645, 46649, 46655, 46661, 46666, 46671, 46676, 46681, 46686, 46691,
- 46699, 46707, 46715, 46723, 46731, 46739, 46747, 46755, 46761, 46766,
- 46771, 46776, 46779, 46783, 46787, 46791, 46795, 46799, 46803, 46810,
- 46817, 46825, 46833, 46838, 46843, 46850, 46857, 46864, 46871, 46874,
- 46877, 46882, 46884, 46888, 46893, 46895, 46897, 46899, 46901, 46906,
- 46909, 46911, 46916, 46923, 46930, 46933, 46937, 46942, 46947, 46955,
- 46961, 46967, 46979, 46986, 46993, 46998, 47003, 47009, 47012, 47015,
- 47020, 47022, 47026, 47028, 47030, 47032, 47034, 47036, 47038, 47043,
- 47045, 47047, 47049, 47051, 47055, 47057, 47060, 47065, 47070, 47075,
- 47080, 47086, 47092, 47094, 47097, 47104, 47111, 47118, 47125, 47129,
- 47133, 47135, 47137, 47141, 47147, 47152, 47154, 47158, 47167, 47175,
- 47183, 47189, 47195, 47200, 47206, 47211, 47214, 47228, 47231, 47236,
- 47241, 47247, 47257, 47259, 47265, 47271, 47275, 47282, 47286, 47288,
- 47290, 47294, 47300, 47305, 47311, 47313, 47319, 47321, 47327, 47329,
- 47331, 47336, 47338, 47342, 47347, 47349, 47354, 47359, 47363, 47370, 0,
- 47380, 47386, 47389, 47395, 47398, 47403, 47408, 47412, 47414, 47416,
- 47420, 47424, 47428, 47432, 47437, 47439, 47444, 47447, 47450, 47453,
- 47457, 47461, 47466, 47470, 47475, 47480, 47484, 47490, 47497, 47500,
- 47506, 47511, 47515, 47520, 47526, 47532, 47539, 47545, 47552, 47559,
- 47561, 47568, 47572, 47579, 47585, 47590, 47596, 47600, 47605, 47608,
- 47614, 47620, 47627, 47635, 47642, 47651, 47661, 47668, 47674, 47678,
- 47686, 47691, 47700, 47703, 47706, 47715, 47726, 47733, 47735, 47741,
- 47746, 47748, 47751, 47755, 47763, 47772, 47775, 47780, 47785, 47793,
- 47801, 47809, 47817, 47823, 47829, 47835, 47843, 47848, 47851, 47855,
- 47858, 47870, 47880, 47891, 47900, 47911, 47921, 47930, 47936, 47944,
- 47948, 47956, 47960, 47968, 47975, 47982, 47991, 48000, 48010, 48020,
- 48030, 48040, 48049, 48058, 48068, 48078, 48087, 48096, 48102, 48108,
- 48114, 48120, 48126, 48132, 48138, 48144, 48150, 48157, 48163, 48169,
- 48175, 48181, 48187, 48193, 48199, 48205, 48211, 48218, 48225, 48232,
- 48239, 48246, 48253, 48260, 48267, 48274, 48281, 48289, 48294, 48297,
- 48301, 48305, 48311, 48314, 48320, 48326, 48331, 48335, 48340, 48346,
- 48353, 48356, 48363, 48370, 48374, 48383, 48392, 48397, 48403, 48408,
- 48413, 48420, 48427, 48435, 48443, 48452, 48456, 48465, 48470, 48474,
- 48481, 48485, 48492, 48500, 48505, 48513, 48517, 48522, 48526, 48531,
- 48535, 48540, 48545, 48554, 48556, 48560, 48564, 48571, 48578, 48583,
- 48591, 48597, 0, 48603, 0, 48606, 48611, 48616, 48624, 48628, 48635,
- 48643, 48651, 48656, 48661, 48667, 48672, 48677, 48683, 48688, 48691,
- 48695, 48699, 48706, 48715, 48720, 48729, 48738, 48744, 48750, 48755,
- 48760, 48765, 48770, 48776, 48782, 48790, 48798, 48804, 48810, 48815,
- 48820, 48827, 48834, 48840, 48843, 48846, 48850, 48854, 48858, 48863,
- 48869, 48875, 48882, 48889, 48894, 48898, 48902, 48906, 48910, 48914,
- 48918, 48922, 48926, 48930, 48934, 48938, 48942, 48946, 48950, 48954,
- 48958, 48962, 48966, 48970, 48974, 48978, 48982, 48986, 48990, 48994,
- 48998, 49002, 49006, 49010, 49014, 49018, 49022, 49026, 49030, 49034,
- 49038, 49042, 49046, 49050, 49054, 49058, 49062, 49066, 49070, 49074,
- 49078, 49082, 49086, 49090, 49094, 49098, 49102, 49106, 49110, 49114,
- 49118, 49122, 49126, 49130, 49134, 49138, 49142, 49146, 49150, 49154,
- 49158, 49162, 49166, 49170, 49174, 49178, 49182, 49186, 49190, 49194,
- 49198, 49202, 49206, 49210, 49214, 49218, 49222, 49226, 49230, 49234,
- 49238, 49242, 49246, 49250, 49254, 49258, 49262, 49266, 49270, 49274,
- 49278, 49282, 49286, 49290, 49294, 49298, 49302, 49306, 49310, 49314,
- 49318, 49322, 49326, 49330, 49334, 49338, 49342, 49346, 49350, 49354,
- 49358, 49362, 49366, 49370, 49374, 49378, 49382, 49386, 49390, 49394,
- 49398, 49402, 49406, 49410, 49414, 49418, 49422, 49426, 49430, 49434,
- 49438, 49442, 49446, 49450, 49454, 49458, 49462, 49466, 49470, 49474,
- 49478, 49482, 49486, 49490, 49494, 49498, 49502, 49506, 49510, 49514,
- 49518, 49522, 49526, 49530, 49534, 49538, 49542, 49546, 49550, 49554,
- 49558, 49562, 49566, 49570, 49574, 49578, 49582, 49586, 49590, 49594,
- 49598, 49602, 49606, 49610, 49614, 49618, 49622, 49626, 49630, 49634,
- 49638, 49642, 49646, 49650, 49654, 49658, 49662, 49666, 49670, 49674,
- 49678, 49682, 49686, 49690, 49694, 49698, 49702, 49706, 49710, 49714,
- 49718, 49722, 49726, 49730, 49734, 49738, 49742, 49746, 49750, 49754,
- 49758, 49762, 49766, 49770, 49774, 49778, 49782, 49786, 49790, 49794,
- 49798, 49802, 49806, 49810, 49814, 49818, 49822, 49826, 49830, 49834,
- 49838, 49842, 49846, 49850, 49854, 49858, 49862, 49866, 49870, 49874,
- 49878, 49882, 49886, 49890, 49894, 49898, 49902, 49906, 49910, 49914,
- 49918, 49925, 49933, 49939, 49945, 49952, 49959, 49965, 49971, 49977,
- 49983, 49988, 49993, 49998, 50003, 50009, 50015, 50023, 50030, 50036,
- 50042, 50050, 50059, 50066, 50076, 50087, 50090, 50093, 50097, 50101,
- 50108, 50115, 50126, 50137, 50147, 50157, 50164, 50171, 50178, 50185,
- 50196, 50207, 50218, 50229, 50239, 50249, 50261, 50273, 50284, 50295,
- 50307, 50319, 50328, 50338, 50348, 50359, 50370, 50377, 50384, 50391,
- 50398, 50408, 50418, 50426, 50434, 50441, 50448, 50455, 50462, 50469,
- 50474, 50479, 50485, 50493, 50503, 50511, 50519, 50527, 50535, 50543,
- 50551, 50559, 50567, 50576, 50585, 50595, 50605, 50614, 50623, 50633,
- 50643, 50652, 50661, 50671, 50681, 50690, 50699, 50709, 50719, 50733,
- 50750, 50764, 50781, 50795, 50809, 50823, 50837, 50847, 50858, 50868,
- 50879, 50896, 50913, 50921, 50927, 50934, 50941, 50948, 50955, 50960,
- 50966, 50971, 50976, 50982, 50987, 50992, 50997, 51002, 51007, 51014,
- 51019, 51026, 51031, 51036, 51040, 51044, 51051, 51058, 51065, 51072,
- 51079, 51086, 51099, 51112, 51125, 51138, 51146, 51154, 51160, 51166,
- 51173, 51180, 51187, 51194, 51198, 51203, 51211, 51219, 51227, 51234,
- 51238, 51246, 51254, 51258, 51262, 51267, 51274, 51282, 51290, 51310,
- 51330, 51350, 51370, 51390, 51410, 51430, 51450, 51456, 51463, 51472,
- 51480, 51488, 51493, 51496, 51499, 51504, 51507, 51526, 51533, 51539,
- 51545, 51549, 51552, 51555, 51558, 51570, 51583, 51590, 51597, 51600,
- 51604, 51607, 51612, 51617, 51622, 51628, 51637, 51644, 51651, 51659,
- 51666, 51673, 51676, 51682, 51688, 51691, 51694, 51699, 51704, 51710,
- 51716, 51720, 51725, 51732, 51736, 51742, 51746, 51750, 51758, 51770,
- 51779, 51783, 51785, 51794, 51803, 51809, 51812, 51818, 51824, 51829,
- 51834, 51839, 51844, 51849, 51854, 51856, 51862, 51867, 51874, 51878,
- 51884, 51887, 51891, 51898, 51905, 51907, 51909, 51915, 51921, 51927,
- 51936, 51945, 51952, 51959, 51965, 51971, 51976, 51981, 51986, 51992,
- 51998, 52003, 52010, 52014, 52018, 52031, 52044, 52056, 52065, 52071,
- 52078, 52083, 52088, 52093, 52098, 52103, 52105, 52112, 52119, 52126,
- 52133, 52140, 52148, 52154, 52159, 52165, 52171, 52177, 52184, 52190,
- 52198, 52206, 52214, 52222, 52229, 52235, 52241, 52250, 52254, 52263,
- 52272, 52281, 52289, 52293, 52299, 52306, 52313, 52317, 52323, 52330,
- 52335, 52340, 52346, 52351, 52356, 52363, 52370, 52375, 52380, 52388,
- 52396, 52406, 52416, 52423, 52430, 52434, 52438, 52450, 52456, 52462,
- 52467, 52472, 52479, 52486, 52492, 52498, 52507, 52515, 52523, 52530,
- 52537, 52544, 52550, 52557, 52563, 52570, 52577, 52584, 52591, 52597,
- 52602, 52611, 52621, 52628, 52637, 52643, 52648, 52653, 52663, 52669,
- 52675, 52681, 52689, 52694, 52701, 52708, 52719, 52726, 52733, 52740,
- 52747, 52754, 52761, 52768, 52780, 52792, 52803, 52814, 52827, 52840,
- 52845, 52850, 52859, 52868, 52875, 52882, 52891, 52900, 52908, 52916,
- 52924, 52932, 52942, 52952, 52966, 52980, 52988, 52996, 53008, 53020,
- 53028, 53036, 53046, 53056, 53061, 53066, 53075, 53084, 53089, 53094,
- 53102, 53108, 53114, 53122, 53130, 53143, 53156, 53160, 53164, 53171,
- 53178, 53185, 53193, 53201, 53210, 53219, 53225, 53231, 53238, 53245,
- 53252, 53259, 53268, 53277, 53280, 53283, 53288, 53293, 53299, 53305,
- 53312, 53319, 53329, 53339, 53346, 53353, 53361, 53369, 53377, 53385,
- 53393, 53401, 53408, 53415, 53419, 53423, 53430, 53437, 53442, 53447,
- 53452, 53457, 53463, 53477, 53484, 53491, 53495, 53497, 53499, 53504,
- 53509, 53514, 53518, 53526, 53533, 53540, 53548, 53560, 53568, 53576,
- 53587, 53591, 53595, 53601, 53609, 53622, 53629, 53636, 53643, 53648,
- 53655, 53664, 53672, 53678, 53684, 53690, 53699, 53708, 53716, 53725,
- 53730, 53733, 53738, 53744, 53750, 53756, 53762, 53766, 53769, 53773,
- 53777, 53783, 53789, 53795, 53801, 53805, 53809, 53816, 53823, 53830,
- 53837, 53844, 53851, 53861, 53871, 53878, 53885, 53893, 53901, 53905,
- 53910, 53915, 53921, 53927, 53930, 53933, 53936, 53939, 53943, 53948,
- 53953, 53958, 53963, 53968, 53972, 53976, 53980, 53984, 53988, 53992,
- 53996, 54002, 54006, 54012, 54017, 54024, 54032, 54039, 54047, 54054,
- 54062, 54071, 54078, 54088, 54099, 54105, 54114, 54120, 54129, 54138,
- 54144, 54150, 54154, 54158, 54167, 54176, 54183, 54190, 54199, 0, 0, 0,
- 54208, 54213, 54217, 54221, 54226, 54231, 54236, 54244, 54252, 54255, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54259, 54264, 54269, 54274, 54279,
- 54284, 54289, 54294, 54299, 54304, 54309, 54315, 54319, 54324, 54329,
- 54334, 54339, 54344, 54349, 54354, 54359, 54364, 54369, 54374, 54379,
- 54384, 54389, 54394, 54399, 54404, 54409, 54414, 54419, 54424, 54429,
- 54435, 54440, 54446, 54455, 54460, 54468, 54475, 54484, 54489, 54494,
- 54499, 54505, 0, 54512, 54517, 54522, 54527, 54532, 54537, 54542, 54547,
- 54552, 54557, 54562, 54568, 54572, 54577, 54582, 54587, 54592, 54597,
- 54602, 54607, 54612, 54617, 54622, 54627, 54632, 54637, 54642, 54647,
- 54652, 54657, 54662, 54667, 54672, 54677, 54682, 54688, 54693, 54699,
- 54708, 54713, 54721, 54728, 54737, 54742, 54747, 54752, 54758, 0, 54765,
- 54773, 54781, 54791, 54798, 54806, 54812, 54821, 54829, 54837, 54845,
- 54853, 54861, 54869, 54874, 54881, 54887, 54894, 54902, 54909, 54916,
- 54924, 54930, 54936, 54943, 54950, 54960, 54970, 54977, 54984, 54989,
- 54999, 55009, 55014, 55019, 55024, 55029, 55034, 55039, 55044, 55049,
- 55054, 55059, 55064, 55069, 55074, 55079, 55084, 55089, 55094, 55099,
- 55104, 55109, 55114, 55119, 55124, 55129, 55134, 55139, 55144, 55149,
- 55154, 55159, 55163, 55167, 55172, 55177, 55182, 55187, 55192, 55197,
- 55202, 55207, 55212, 55217, 55222, 55227, 55232, 55237, 55242, 55247,
- 55252, 55257, 55264, 55271, 55278, 55285, 55292, 55299, 55306, 55313,
- 55320, 55327, 55334, 55341, 55348, 55355, 55360, 55365, 55372, 55379,
- 55386, 55393, 55400, 55407, 55414, 55421, 55428, 55435, 55442, 55449,
- 55455, 55461, 55467, 55473, 55480, 55487, 55494, 55501, 55508, 55515,
- 55522, 55529, 55536, 55543, 55551, 55559, 55567, 55575, 55583, 55591,
- 55599, 55607, 55611, 55617, 55623, 55627, 55633, 55639, 55645, 55652,
- 55659, 55666, 55673, 55678, 55684, 0, 0, 0, 0, 0, 0, 0, 55690, 55698,
- 55707, 55716, 55724, 55730, 55735, 55740, 55745, 55750, 55755, 55760,
- 55765, 55770, 55775, 55780, 55785, 55790, 55795, 55800, 55805, 55810,
- 55815, 55820, 55825, 55830, 55835, 55840, 55845, 55850, 55855, 55860,
- 55865, 55870, 55875, 55880, 55885, 55890, 55895, 55900, 55905, 55910,
- 55915, 55920, 55925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55930, 55934, 55939,
- 55944, 55949, 55954, 55963, 55968, 55973, 55978, 55983, 55988, 55993,
- 55998, 56003, 56010, 56015, 56020, 56029, 56036, 56041, 56046, 56051,
- 56058, 56063, 56070, 56075, 56080, 56087, 56094, 56099, 56104, 56109,
- 56116, 56123, 56128, 56133, 56138, 56143, 56148, 56155, 56162, 56167,
- 56172, 56177, 56182, 56187, 56192, 56197, 56202, 56207, 56212, 56217,
- 56224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56229, 56236, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56241, 56247, 56251, 56255, 56259, 56263, 56267, 56271,
- 56275, 56279, 56283, 56287, 56293, 56297, 56301, 56305, 56309, 56313,
- 56317, 56321, 56325, 56329, 56333, 56337, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56341, 56345, 56349, 56353, 56357, 56361, 56365, 0, 56369, 56373, 56377,
- 56381, 56385, 56389, 56393, 0, 56397, 56401, 56405, 56409, 56413, 56417,
- 56421, 0, 56425, 56429, 56433, 56437, 56441, 56445, 56449, 0, 56453,
- 56457, 56461, 56465, 56469, 56473, 56477, 0, 56481, 56485, 56489, 56493,
- 56497, 56501, 56505, 0, 56509, 56513, 56517, 56521, 56525, 56529, 56533,
- 0, 56537, 56541, 56545, 56549, 56553, 56557, 56561, 0, 56565, 56570,
- 56575, 56580, 56585, 56590, 56595, 56599, 56604, 56609, 56614, 56618,
- 56623, 56628, 56633, 56638, 56642, 56647, 56652, 56657, 56662, 56667,
- 56672, 56676, 56681, 56686, 56693, 56698, 56703, 56709, 56716, 56723,
- 56732, 56739, 56748, 56752, 56756, 56762, 56768, 56774, 56782, 56788,
- 56792, 56796, 56800, 56806, 56812, 56816, 56818, 56822, 56828, 56830,
- 56834, 56838, 56842, 56848, 56853, 56857, 56861, 56866, 56872, 56877,
- 56882, 56887, 56892, 56899, 56906, 56911, 56916, 56921, 56926, 56931,
- 56936, 56940, 56944, 56951, 56958, 56964, 56968, 56973, 56976, 56980, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 54847, 54852, 54857, 54862, 54867, 54872, 54877, 54882,
+ 54887, 54892, 54897, 54903, 54907, 54912, 54917, 54922, 54927, 54932,
+ 54937, 54942, 54947, 54952, 54957, 54962, 54967, 54972, 54977, 54982,
+ 54987, 54992, 54997, 55002, 55007, 55012, 55017, 55023, 55028, 55034,
+ 55043, 55048, 55056, 55063, 55072, 55077, 55082, 55087, 55093, 0, 55100,
+ 55105, 55110, 55115, 55120, 55125, 55130, 55135, 55140, 55145, 55150,
+ 55156, 55160, 55165, 55170, 55175, 55180, 55185, 55190, 55195, 55200,
+ 55205, 55210, 55215, 55220, 55225, 55230, 55235, 55240, 55245, 55250,
+ 55255, 55260, 55265, 55270, 55276, 55281, 55287, 55296, 55301, 55309,
+ 55316, 55325, 55330, 55335, 55340, 55346, 0, 55353, 55361, 55369, 55378,
+ 55385, 55393, 55399, 55408, 55416, 55424, 55432, 55440, 55448, 55456,
+ 55461, 55468, 55474, 55481, 55489, 55496, 55503, 55511, 55517, 55523,
+ 55530, 55537, 55547, 55557, 55564, 55571, 55576, 55586, 55596, 55601,
+ 55606, 55611, 55616, 55621, 55626, 55631, 55636, 55641, 55646, 55651,
+ 55656, 55661, 55666, 55671, 55676, 55681, 55686, 55691, 55696, 55701,
+ 55706, 55711, 55716, 55721, 55726, 55731, 55736, 55741, 55746, 55750,
+ 55754, 55759, 55764, 55769, 55774, 55779, 55784, 55789, 55794, 55799,
+ 55804, 55809, 55814, 55819, 55824, 55829, 55834, 55839, 55844, 55851,
+ 55858, 55865, 55872, 55879, 55886, 55893, 55900, 55907, 55914, 55921,
+ 55928, 55935, 55942, 55947, 55952, 55959, 55966, 55973, 55980, 55987,
+ 55994, 56001, 56008, 56015, 56022, 56029, 56036, 56042, 56048, 56054,
+ 56060, 56067, 56074, 56081, 56088, 56095, 56102, 56109, 56116, 56123,
+ 56130, 56138, 56146, 56154, 56162, 56170, 56178, 56186, 56194, 56198,
+ 56204, 56210, 56214, 56220, 56226, 56232, 56239, 56246, 56253, 56260,
+ 56265, 56271, 56277, 56284, 0, 0, 0, 0, 0, 56291, 56299, 56308, 56317,
+ 56325, 56331, 56336, 56341, 56346, 56351, 56356, 56361, 56366, 56371,
+ 56376, 56381, 56386, 56391, 56396, 56401, 56406, 56411, 56416, 56421,
+ 56426, 56431, 56436, 56441, 56446, 56451, 56456, 56461, 56466, 56471,
+ 56476, 56481, 56486, 56491, 56496, 56501, 56506, 56511, 56516, 56521,
+ 56526, 0, 56531, 0, 0, 0, 0, 0, 56536, 0, 0, 56541, 56545, 56550, 56555,
+ 56560, 56565, 56574, 56579, 56584, 56589, 56594, 56599, 56604, 56609,
+ 56614, 56621, 56626, 56631, 56640, 56647, 56652, 56657, 56662, 56669,
+ 56674, 56681, 56686, 56691, 56698, 56705, 56710, 56715, 56720, 56727,
+ 56734, 56739, 56744, 56749, 56754, 56759, 56766, 56773, 56778, 56783,
+ 56788, 56793, 56798, 56803, 56808, 56813, 56818, 56823, 56828, 56835,
+ 56840, 56845, 0, 0, 0, 0, 0, 0, 0, 56850, 56857, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 56862, 56867, 56871, 56875, 56879, 56883, 56887, 56891,
+ 56895, 56899, 56903, 56907, 56913, 56917, 56921, 56925, 56929, 56933,
+ 56937, 56941, 56945, 56949, 56953, 56957, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56961, 56965, 56969, 56973, 56977, 56981, 56985, 0, 56989, 56993, 56997,
+ 57001, 57005, 57009, 57013, 0, 57017, 57021, 57025, 57029, 57033, 57037,
+ 57041, 0, 57045, 57049, 57053, 57057, 57061, 57065, 57069, 0, 57073,
+ 57077, 57081, 57085, 57089, 57093, 57097, 0, 57101, 57105, 57109, 57113,
+ 57117, 57121, 57125, 0, 57129, 57133, 57137, 57141, 57145, 57149, 57153,
+ 0, 57157, 57161, 57165, 57169, 57173, 57177, 57181, 0, 57185, 57190,
+ 57195, 57200, 57205, 57210, 57215, 57219, 57224, 57229, 57234, 57238,
+ 57243, 57248, 57253, 57258, 57262, 57267, 57272, 57277, 57282, 57287,
+ 57292, 57296, 57301, 57306, 57313, 57318, 57323, 57329, 57336, 57343,
+ 57352, 57359, 57368, 57372, 57376, 57382, 57388, 57394, 57402, 57408,
+ 57412, 57416, 57420, 57426, 57432, 57436, 57438, 57442, 57448, 57450,
+ 57454, 57458, 57462, 57468, 57473, 57477, 57481, 57486, 57492, 57497,
+ 57502, 57507, 57512, 57519, 57526, 57531, 57536, 57541, 57546, 57551,
+ 57556, 57560, 57564, 57571, 57578, 57584, 57588, 57593, 57595, 57599,
+ 57607, 57611, 57615, 57619, 57623, 57629, 57635, 57639, 57645, 57649, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 56988, 56992, 56996, 57001, 57006, 57011, 57015, 57019,
- 57023, 57028, 57033, 57037, 57041, 57045, 57049, 57054, 57059, 57064,
- 57069, 57073, 57077, 57082, 57087, 57092, 57097, 57101, 0, 57105, 57109,
- 57113, 57117, 57121, 57125, 57129, 57134, 57139, 57143, 57148, 57153,
- 57162, 57166, 57170, 57174, 57181, 57185, 57190, 57195, 57199, 57203,
- 57209, 57214, 57219, 57224, 57229, 57233, 57237, 57241, 57245, 57249,
- 57254, 57259, 57263, 57267, 57272, 57277, 57282, 57286, 57290, 57295,
- 57300, 57306, 57312, 57316, 57322, 57328, 57332, 57338, 57344, 57349,
- 57354, 57358, 57364, 57368, 57372, 57378, 57384, 57389, 57394, 57398,
- 57402, 57410, 57416, 57422, 57428, 57433, 57438, 57443, 57449, 57453,
- 57459, 57463, 57467, 57473, 57479, 57485, 57491, 57497, 57503, 57509,
- 57515, 57521, 57527, 57533, 57539, 57543, 57549, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 57555, 57558, 57562, 57566, 57570, 57574, 57577, 57580,
- 57584, 57588, 57592, 57596, 57599, 57604, 57608, 57612, 57616, 57622,
- 57626, 57630, 57634, 57638, 57645, 57651, 57655, 57659, 57663, 57667,
- 57671, 57675, 57679, 57683, 57687, 57691, 57695, 57701, 57705, 57709,
- 57713, 57717, 57721, 57725, 57729, 57733, 57737, 57741, 57745, 57749,
- 57753, 57757, 57761, 57765, 57771, 57777, 57782, 57787, 57791, 57795,
- 57799, 57803, 57807, 57811, 57815, 57819, 57823, 57827, 57831, 57835,
- 57839, 57843, 57847, 57851, 57855, 57859, 57863, 57867, 57871, 57875,
- 57879, 57883, 57889, 57893, 57897, 57901, 57905, 57909, 57913, 57917,
- 57921, 57926, 57933, 57937, 57941, 57945, 57949, 57953, 57957, 57961,
- 57965, 57969, 57973, 57977, 57981, 57988, 57992, 57998, 58002, 58006,
- 58010, 58014, 58018, 58021, 58025, 58029, 58033, 58037, 58041, 58045,
- 58049, 58053, 58057, 58061, 58065, 58069, 58073, 58077, 58081, 58085,
- 58089, 58093, 58097, 58101, 58105, 58109, 58113, 58117, 58121, 58125,
- 58129, 58133, 58137, 58141, 58145, 58149, 58155, 58159, 58163, 58167,
- 58171, 58175, 58179, 58183, 58187, 58191, 58195, 58199, 58203, 58207,
- 58211, 58215, 58219, 58223, 58227, 58231, 58235, 58239, 58243, 58247,
- 58251, 58255, 58259, 58263, 58271, 58275, 58279, 58283, 58287, 58291,
- 58297, 58301, 58305, 58309, 58313, 58317, 58321, 58325, 58329, 58333,
- 58337, 58341, 58345, 58349, 58355, 58359, 58363, 58367, 58371, 58375,
- 58379, 58383, 58387, 58391, 58395, 58399, 58403, 58407, 58411, 58415,
- 58419, 58423, 58427, 58431, 58435, 58439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58443, 58452, 58460,
- 58472, 58483, 58491, 58500, 58509, 58519, 58531, 58543, 58555, 0, 0, 0,
- 0, 58561, 58564, 58567, 58572, 58575, 58582, 58586, 58590, 58594, 58598,
- 58602, 58607, 58612, 58616, 58620, 58625, 58630, 58635, 58640, 58643,
- 58646, 58652, 58658, 58663, 58668, 58675, 58682, 58686, 58690, 58694,
- 58702, 58708, 58715, 58720, 58725, 58730, 58735, 58740, 58745, 58750,
- 58755, 58760, 58765, 58770, 58775, 58780, 58785, 58791, 58796, 58800,
- 58806, 58817, 58827, 58842, 58852, 58856, 58865, 58871, 58877, 58883,
- 58888, 58891, 58896, 58900, 0, 58906, 58910, 58913, 58917, 58920, 58924,
- 58927, 58931, 58934, 58938, 58941, 58944, 58948, 58952, 58956, 58960,
- 58964, 58968, 58972, 58976, 58980, 58984, 58988, 58992, 58996, 59000,
- 59004, 59008, 59012, 59016, 59020, 59024, 59028, 59032, 59036, 59041,
- 59045, 59049, 59053, 59057, 59060, 59064, 59067, 59071, 59075, 59079,
- 59083, 59086, 59090, 59093, 59097, 59101, 59105, 59109, 59113, 59117,
- 59121, 59125, 59129, 59133, 59137, 59141, 59144, 59148, 59152, 59156,
- 59160, 59164, 59167, 59172, 59176, 59181, 59185, 59188, 59192, 59196,
- 59200, 59204, 59209, 59213, 59217, 59221, 59225, 59228, 59232, 59236, 0,
- 0, 59241, 59249, 59257, 59264, 59271, 59275, 59281, 59286, 59291, 59295,
- 59298, 59302, 59305, 59309, 59312, 59316, 59319, 59323, 59326, 59329,
- 59333, 59337, 59341, 59345, 59349, 59353, 59357, 59361, 59365, 59369,
- 59373, 59377, 59381, 59385, 59389, 59393, 59397, 59401, 59405, 59409,
- 59413, 59417, 59421, 59426, 59430, 59434, 59438, 59442, 59445, 59449,
- 59452, 59456, 59460, 59464, 59468, 59471, 59475, 59478, 59482, 59486,
- 59490, 59494, 59498, 59502, 59506, 59510, 59514, 59518, 59522, 59526,
- 59529, 59533, 59537, 59541, 59545, 59549, 59552, 59557, 59561, 59566,
- 59570, 59573, 59577, 59581, 59585, 59589, 59594, 59598, 59602, 59606,
- 59610, 59613, 59617, 59621, 59626, 59630, 59634, 59638, 59642, 59647,
- 59654, 59658, 59664, 0, 0, 0, 0, 0, 59669, 59673, 59677, 59680, 59684,
- 59688, 59692, 59695, 59698, 59702, 59706, 59710, 59714, 59718, 59722,
- 59726, 59730, 59734, 59737, 59741, 59745, 59748, 59751, 59754, 59757,
- 59761, 59765, 59769, 59773, 59777, 59781, 59785, 59789, 59793, 59797,
- 59800, 59803, 59807, 59811, 59815, 59819, 0, 0, 0, 59823, 59827, 59831,
- 59835, 59839, 59843, 59847, 59851, 59855, 59859, 59863, 59867, 59871,
- 59875, 59879, 59883, 59887, 59891, 59895, 59899, 59903, 59907, 59911,
- 59915, 59919, 59923, 59927, 59931, 59935, 59939, 59943, 59946, 59950,
- 59953, 59957, 59961, 59964, 59968, 59972, 59975, 59979, 59983, 59987,
- 59991, 59994, 59998, 60002, 60006, 60010, 60014, 60018, 60021, 60024,
- 60028, 60032, 60036, 60040, 60044, 60048, 60052, 60056, 60060, 60064,
- 60068, 60072, 60076, 60080, 60084, 60088, 60092, 60096, 60100, 60104,
- 60108, 60112, 60116, 60120, 60124, 60128, 60132, 60136, 60140, 60144,
- 60148, 60152, 60156, 60160, 60164, 60168, 60172, 60176, 60180, 60184,
- 60188, 0, 60192, 60198, 60204, 60209, 60214, 60219, 60225, 60231, 60237,
- 60243, 60249, 60255, 60261, 60267, 60273, 60279, 60285, 60289, 60293,
- 60297, 60301, 60305, 60309, 60313, 60317, 60321, 60325, 60329, 60333,
- 60337, 60341, 60345, 60349, 60353, 60357, 60361, 60365, 60370, 60375,
- 60380, 60385, 60389, 60393, 0, 0, 0, 0, 0, 60397, 60402, 60407, 60412,
- 60417, 60422, 60427, 60432, 60437, 60442, 60447, 60452, 60457, 60462,
- 60467, 60472, 60476, 60481, 60485, 60490, 60495, 60500, 60505, 60510,
- 60515, 60520, 60525, 60530, 60535, 60540, 60545, 60550, 60555, 60560,
- 60565, 60570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60575, 60580, 60585,
- 60590, 60594, 60599, 60603, 60608, 60613, 60618, 60623, 60628, 60632,
- 60637, 60642, 60647, 60652, 60656, 60660, 60664, 60668, 60672, 60676,
- 60680, 60684, 60688, 60692, 60696, 60700, 60704, 60708, 60713, 60718,
- 60723, 60728, 60733, 60738, 60743, 60748, 60753, 60758, 60763, 60768,
- 60773, 60778, 60783, 60789, 0, 60796, 60799, 60802, 60805, 60808, 60811,
- 60814, 60817, 60820, 60823, 60827, 60831, 60835, 60839, 60843, 60847,
- 60851, 60855, 60859, 60863, 60867, 60871, 60875, 60879, 60883, 60887,
- 60891, 60895, 60899, 60903, 60907, 60911, 60915, 60919, 60923, 60927,
- 60931, 60935, 60939, 60943, 60947, 60956, 60965, 60974, 60983, 60992,
- 61001, 61010, 61019, 61022, 61027, 61032, 61037, 61042, 61047, 61052,
- 61057, 61062, 61067, 61071, 61076, 61081, 61086, 61091, 61096, 61100,
- 61104, 61108, 61112, 61116, 61120, 61124, 61128, 61132, 61136, 61140,
- 61144, 61148, 61152, 61157, 61162, 61167, 61172, 61177, 61182, 61187,
- 61192, 61197, 61202, 61207, 61212, 61217, 61222, 61228, 61234, 61239,
- 61244, 61247, 61250, 61253, 61256, 61259, 61262, 61265, 61268, 61271,
- 61275, 61279, 61283, 61287, 61291, 61295, 61299, 61303, 61307, 61311,
- 61315, 61319, 61323, 61327, 61331, 61335, 61339, 61343, 61347, 61351,
- 61355, 61359, 61363, 61367, 61371, 61375, 61379, 61383, 61387, 61391,
- 61395, 61399, 61403, 61407, 61411, 61415, 61419, 61423, 61427, 61431,
- 61436, 61441, 61446, 61451, 61455, 61460, 61465, 61470, 61475, 61480,
- 61485, 61490, 61495, 61500, 61504, 61510, 61516, 61522, 61528, 61534,
- 61540, 61546, 61552, 61558, 61564, 61570, 61576, 61579, 61582, 61585,
- 61590, 61593, 61596, 61599, 61602, 61605, 61608, 61612, 61616, 61620,
- 61624, 61628, 61632, 61636, 61640, 61644, 61648, 61652, 61656, 61660,
- 61663, 61666, 61670, 61674, 61678, 61682, 61685, 61689, 61693, 61697,
- 61701, 61704, 61708, 61712, 61716, 61720, 61723, 61727, 61731, 61734,
- 61738, 61742, 61746, 61750, 61754, 61758, 61762, 0, 61766, 61769, 61772,
- 61775, 61778, 61781, 61784, 61787, 61790, 61793, 61796, 61799, 61802,
- 61805, 61808, 61811, 61814, 61817, 61820, 61823, 61826, 61829, 61832,
- 61835, 61838, 61841, 61844, 61847, 61850, 61853, 61856, 61859, 61862,
- 61865, 61868, 61871, 61874, 61877, 61880, 61883, 61886, 61889, 61892,
- 61895, 61898, 61901, 61904, 61907, 61910, 61913, 61916, 61919, 61922,
- 61925, 61928, 61931, 61934, 61937, 61940, 61943, 61946, 61949, 61952,
- 61955, 61958, 61961, 61964, 61967, 61970, 61973, 61976, 61979, 61982,
- 61985, 61988, 61991, 61994, 61997, 62000, 62003, 62006, 62009, 62012,
- 62015, 62018, 62021, 62024, 62027, 62030, 62038, 62045, 62052, 62059,
- 62066, 62073, 62080, 62087, 62094, 62101, 62109, 62117, 62125, 62133,
- 62141, 62149, 62157, 62165, 62173, 62181, 62189, 62197, 62205, 62213,
- 62221, 62224, 62227, 62230, 62232, 62235, 62238, 62241, 62246, 62251,
- 62254, 62261, 62268, 62275, 62282, 62285, 62290, 62292, 62296, 62298,
- 62300, 62303, 62306, 62309, 62312, 62315, 62318, 62321, 62326, 62331,
- 62334, 62337, 62340, 62343, 62346, 62349, 62352, 62356, 62359, 62362,
- 62365, 62368, 62371, 62375, 62378, 62381, 62384, 62389, 62394, 62399,
- 62404, 62409, 62414, 62419, 62424, 62429, 62437, 62439, 62442, 62445,
- 62448, 62451, 62456, 62464, 62467, 62470, 62474, 62477, 62480, 62483,
- 62488, 62491, 62494, 62499, 62502, 62505, 62510, 62513, 62516, 62521,
- 62526, 62531, 62534, 62537, 62540, 62543, 62549, 62552, 62555, 62558,
- 62560, 62563, 62566, 62569, 62574, 62577, 62580, 62583, 62586, 62589,
- 62594, 62597, 62600, 62603, 62606, 62609, 62612, 62615, 62618, 62621,
- 62626, 62630, 62637, 62644, 62651, 62658, 62665, 62672, 62679, 62686,
- 62693, 62701, 62709, 62717, 62725, 62733, 62741, 62749, 62757, 62765,
- 62773, 62781, 62789, 62797, 62805, 62813, 62821, 62829, 62837, 62845,
- 62853, 62861, 62869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57653, 57657,
+ 57661, 57666, 57671, 57676, 57680, 57684, 57688, 57693, 57698, 57702,
+ 57706, 57710, 57714, 57719, 57724, 57729, 57734, 57738, 57742, 57747,
+ 57752, 57757, 57762, 57766, 0, 57770, 57774, 57778, 57782, 57786, 57790,
+ 57794, 57799, 57804, 57808, 57813, 57818, 57827, 57831, 57835, 57839,
+ 57846, 57850, 57855, 57860, 57864, 57868, 57874, 57879, 57884, 57889,
+ 57894, 57898, 57902, 57906, 57910, 57914, 57919, 57924, 57928, 57932,
+ 57937, 57942, 57947, 57951, 57955, 57960, 57965, 57971, 57977, 57981,
+ 57987, 57993, 57997, 58003, 58009, 58014, 58019, 58023, 58029, 58033,
+ 58037, 58043, 58049, 58054, 58059, 58063, 58067, 58075, 58081, 58087,
+ 58093, 58098, 58103, 58108, 58114, 58118, 58124, 58128, 58132, 58138,
+ 58144, 58150, 58156, 58162, 58168, 58174, 58180, 58186, 58192, 58198,
+ 58204, 58208, 58214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58220, 58223,
+ 58227, 58231, 58235, 58239, 58242, 58245, 58249, 58253, 58257, 58261,
+ 58264, 58269, 58273, 58277, 58281, 58286, 58290, 58294, 58298, 58302,
+ 58308, 58314, 58318, 58322, 58326, 58330, 58334, 58338, 58342, 58346,
+ 58350, 58354, 58358, 58364, 58368, 58372, 58376, 58380, 58384, 58388,
+ 58392, 58396, 58400, 58404, 58408, 58412, 58416, 58420, 58424, 58428,
+ 58434, 58440, 58445, 58450, 58454, 58458, 58462, 58466, 58470, 58474,
+ 58478, 58482, 58486, 58490, 58494, 58498, 58502, 58506, 58510, 58514,
+ 58518, 58522, 58526, 58530, 58534, 58538, 58542, 58546, 58552, 58556,
+ 58560, 58564, 58568, 58572, 58576, 58580, 58584, 58589, 58596, 58600,
+ 58604, 58608, 58612, 58616, 58620, 58624, 58628, 58632, 58636, 58640,
+ 58644, 58651, 58655, 58661, 58665, 58669, 58673, 58677, 58681, 58684,
+ 58688, 58692, 58696, 58700, 58704, 58708, 58712, 58716, 58720, 58724,
+ 58728, 58732, 58736, 58740, 58744, 58748, 58752, 58756, 58760, 58764,
+ 58768, 58772, 58776, 58780, 58784, 58788, 58792, 58796, 58800, 58804,
+ 58808, 58812, 58818, 58822, 58826, 58830, 58834, 58838, 58842, 58846,
+ 58850, 58854, 58858, 58862, 58866, 58870, 58874, 58878, 58882, 58886,
+ 58890, 58894, 58898, 58902, 58906, 58910, 58914, 58918, 58922, 58926,
+ 58934, 58938, 58942, 58946, 58950, 58954, 58960, 58964, 58968, 58972,
+ 58976, 58980, 58984, 58988, 58992, 58996, 59000, 59004, 59008, 59012,
+ 59018, 59022, 59026, 59030, 59034, 59038, 59042, 59046, 59050, 59054,
+ 59058, 59062, 59066, 59070, 59074, 59078, 59082, 59086, 59090, 59094,
+ 59098, 59102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59106, 59115, 59123, 59135, 59146, 59154, 59163, 59172,
+ 59182, 59194, 59206, 59218, 0, 0, 0, 0, 59224, 59227, 59230, 59235,
+ 59238, 59245, 59249, 59253, 59257, 59261, 59265, 59270, 59275, 59279,
+ 59283, 59288, 59293, 59298, 59303, 59306, 59309, 59315, 59321, 59326,
+ 59331, 59338, 59345, 59349, 59353, 59357, 59365, 59371, 59378, 59383,
+ 59388, 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433,
+ 59438, 59443, 59448, 59454, 59459, 59463, 59469, 59480, 59490, 59505,
+ 59515, 59519, 59529, 59535, 59541, 59547, 59552, 59555, 59560, 59564, 0,
+ 59570, 59574, 59577, 59581, 59584, 59588, 59591, 59595, 59598, 59602,
+ 59605, 59608, 59612, 59616, 59620, 59624, 59628, 59632, 59636, 59640,
+ 59644, 59647, 59651, 59655, 59659, 59663, 59667, 59671, 59675, 59679,
+ 59683, 59687, 59691, 59695, 59699, 59704, 59708, 59712, 59716, 59720,
+ 59723, 59727, 59730, 59734, 59738, 59742, 59746, 59749, 59753, 59756,
+ 59760, 59764, 59768, 59772, 59776, 59780, 59784, 59788, 59792, 59796,
+ 59800, 59804, 59807, 59811, 59815, 59819, 59823, 59827, 59830, 59835,
+ 59839, 59844, 59848, 59851, 59855, 59859, 59863, 59867, 59872, 59876,
+ 59880, 59884, 59888, 59892, 59896, 59900, 0, 0, 59905, 59913, 59921,
+ 59928, 59935, 59939, 59945, 59950, 59955, 59959, 59962, 59966, 59969,
+ 59973, 59976, 59980, 59983, 59987, 59990, 59993, 59997, 60001, 60005,
+ 60009, 60013, 60017, 60021, 60025, 60029, 60032, 60036, 60040, 60044,
+ 60048, 60052, 60056, 60060, 60064, 60068, 60072, 60076, 60080, 60084,
+ 60089, 60093, 60097, 60101, 60105, 60108, 60112, 60115, 60119, 60123,
+ 60127, 60131, 60134, 60138, 60141, 60145, 60149, 60153, 60157, 60161,
+ 60165, 60169, 60173, 60177, 60181, 60185, 60189, 60192, 60196, 60200,
+ 60204, 60208, 60212, 60215, 60220, 60224, 60229, 60233, 60236, 60240,
+ 60244, 60248, 60252, 60257, 60261, 60265, 60269, 60273, 60277, 60281,
+ 60285, 60290, 60294, 60298, 60302, 60306, 60311, 60318, 60322, 60328, 0,
+ 0, 0, 0, 0, 60333, 60338, 60343, 60347, 60352, 60357, 60362, 60367,
+ 60371, 60376, 60381, 60386, 60391, 60396, 60401, 60406, 60411, 60416,
+ 60420, 60425, 60430, 60435, 60439, 60443, 60447, 60452, 60457, 60462,
+ 60467, 60472, 60477, 60482, 60487, 60492, 60497, 60501, 60505, 60510,
+ 60515, 60520, 60525, 0, 0, 0, 60530, 60534, 60538, 60542, 60546, 60550,
+ 60554, 60558, 60562, 60566, 60570, 60574, 60578, 60582, 60586, 60590,
+ 60594, 60598, 60602, 60606, 60610, 60614, 60618, 60622, 60626, 60630,
+ 60634, 60638, 60642, 60646, 60650, 60653, 60657, 60660, 60664, 60668,
+ 60671, 60675, 60679, 60682, 60686, 60690, 60694, 60698, 60701, 60705,
+ 60709, 60713, 60717, 60721, 60725, 60728, 60731, 60735, 60739, 60743,
+ 60747, 60751, 60755, 60759, 60763, 60767, 60771, 60775, 60779, 60783,
+ 60787, 60791, 60795, 60799, 60803, 60807, 60811, 60815, 60819, 60823,
+ 60827, 60831, 60835, 60839, 60843, 60847, 60851, 60855, 60859, 60863,
+ 60867, 60871, 60875, 60879, 60883, 60887, 60891, 60895, 0, 60899, 60905,
+ 60911, 60916, 60921, 60926, 60932, 60938, 60944, 60950, 60956, 60962,
+ 60968, 60974, 60980, 60986, 60992, 60997, 61002, 61007, 61012, 61017,
+ 61022, 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61062, 61067,
+ 61072, 61077, 61082, 61087, 61092, 61098, 61104, 61110, 61116, 61121,
+ 61126, 0, 0, 0, 0, 0, 61131, 61136, 61141, 61146, 61151, 61156, 61161,
+ 61166, 61171, 61176, 61181, 61186, 61191, 61196, 61201, 61206, 61211,
+ 61216, 61221, 61226, 61231, 61236, 61241, 61246, 61251, 61256, 61261,
+ 61266, 61271, 61276, 61281, 61286, 61291, 61296, 61301, 61306, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 61311, 61316, 61321, 61326, 61330, 61335,
+ 61339, 61344, 61349, 61354, 61359, 61364, 61368, 61373, 61378, 61383,
+ 61388, 61392, 61396, 61400, 61404, 61408, 61412, 61416, 61420, 61424,
+ 61428, 61432, 61436, 61440, 61444, 61449, 61454, 61459, 61464, 61469,
+ 61474, 61479, 61484, 61489, 61494, 61499, 61504, 61509, 61514, 61519,
+ 61525, 0, 61532, 61535, 61538, 61541, 61544, 61547, 61550, 61553, 61556,
+ 61559, 61563, 61567, 61571, 61575, 61579, 61583, 61587, 61591, 61595,
+ 61599, 61603, 61607, 61611, 61615, 61619, 61623, 61627, 61631, 61635,
+ 61639, 61643, 61647, 61651, 61655, 61659, 61663, 61667, 61671, 61675,
+ 61679, 61683, 61692, 61701, 61710, 61719, 61728, 61737, 61746, 61755,
+ 61758, 61763, 61768, 61773, 61778, 61783, 61788, 61793, 61798, 61803,
+ 61807, 61812, 61817, 61822, 61827, 61832, 61836, 61840, 61844, 61848,
+ 61852, 61856, 61860, 61864, 61868, 61872, 61876, 61880, 61884, 61888,
+ 61893, 61898, 61903, 61908, 61913, 61918, 61923, 61928, 61933, 61938,
+ 61943, 61948, 61953, 61958, 61964, 61970, 61975, 61980, 61983, 61986,
+ 61989, 61992, 61995, 61998, 62001, 62004, 62007, 62011, 62015, 62019,
+ 62023, 62027, 62031, 62035, 62039, 62043, 62047, 62051, 62055, 62059,
+ 62063, 62067, 62071, 62075, 62079, 62083, 62087, 62091, 62095, 62099,
+ 62103, 62107, 62111, 62115, 62119, 62123, 62127, 62131, 62135, 62139,
+ 62143, 62147, 62151, 62155, 62159, 62163, 62167, 62172, 62177, 62182,
+ 62187, 62191, 62196, 62201, 62206, 62211, 62216, 62221, 62226, 62231,
+ 62236, 62240, 62247, 62254, 62261, 62268, 62275, 62282, 62289, 62296,
+ 62303, 62310, 62317, 62324, 62327, 62330, 62333, 62338, 62341, 62344,
+ 62347, 62350, 62353, 62356, 62360, 62364, 62368, 62372, 62375, 62379,
+ 62383, 62387, 62391, 62395, 62399, 62403, 62407, 62410, 62413, 62417,
+ 62421, 62425, 62429, 62432, 62436, 62440, 62444, 62448, 62451, 62455,
+ 62459, 62463, 62467, 62470, 62474, 62478, 62481, 62485, 62489, 62493,
+ 62497, 62501, 62505, 62509, 0, 62513, 62516, 62519, 62522, 62525, 62528,
+ 62531, 62534, 62537, 62540, 62543, 62546, 62549, 62552, 62555, 62558,
+ 62561, 62564, 62567, 62570, 62573, 62576, 62579, 62582, 62585, 62588,
+ 62591, 62594, 62597, 62600, 62603, 62606, 62609, 62612, 62615, 62618,
+ 62621, 62624, 62627, 62630, 62633, 62636, 62639, 62642, 62645, 62648,
+ 62651, 62654, 62657, 62660, 62663, 62666, 62669, 62672, 62675, 62678,
+ 62681, 62684, 62687, 62690, 62693, 62696, 62699, 62702, 62705, 62708,
+ 62711, 62714, 62717, 62720, 62723, 62726, 62729, 62732, 62735, 62738,
+ 62741, 62744, 62747, 62750, 62753, 62756, 62759, 62762, 62765, 62768,
+ 62771, 62774, 62777, 62786, 62794, 62802, 62810, 62818, 62826, 62834,
+ 62842, 62850, 62858, 62867, 62876, 62885, 62894, 62903, 62912, 62921,
+ 62930, 62939, 62948, 62957, 62966, 62975, 62984, 62993, 62996, 62999,
+ 63002, 63004, 63007, 63010, 63013, 63018, 63023, 63026, 63033, 63040,
+ 63047, 63054, 63057, 63062, 63064, 63068, 63070, 63072, 63075, 63078,
+ 63081, 63084, 63087, 63090, 63093, 63098, 63103, 63106, 63109, 63112,
+ 63115, 63118, 63121, 63124, 63128, 63131, 63134, 63137, 63140, 63143,
+ 63147, 63150, 63153, 63156, 63161, 63166, 63171, 63176, 63181, 63186,
+ 63191, 63196, 63202, 63210, 63212, 63215, 63218, 63221, 63224, 63230,
+ 63238, 63241, 63244, 63249, 63252, 63255, 63258, 63263, 63266, 63269,
+ 63274, 63277, 63280, 63285, 63288, 63291, 63296, 63301, 63306, 63309,
+ 63312, 63315, 63318, 63324, 63327, 63330, 63333, 63335, 63338, 63341,
+ 63344, 63349, 63352, 63355, 63358, 63361, 63364, 63369, 63372, 63375,
+ 63378, 63381, 63384, 63387, 63390, 63393, 63396, 63401, 63405, 63413,
+ 63421, 63429, 63437, 63445, 63453, 63461, 63469, 63477, 63486, 63495,
+ 63504, 63513, 63522, 63531, 63540, 63549, 63558, 63567, 63576, 63585,
+ 63594, 63603, 63612, 63621, 63630, 63639, 63648, 63657, 63666, 63675, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63678, 63687, 63696, 63707,
+ 63714, 63719, 63724, 63731, 63738, 63744, 63749, 63754, 63759, 63764,
+ 63771, 63776, 63781, 63786, 63797, 63802, 63807, 63814, 63819, 63826,
+ 63831, 63836, 63843, 63850, 63857, 63866, 63875, 63880, 63885, 63890,
+ 63897, 63902, 63912, 63919, 63924, 63929, 63934, 63939, 63944, 63949,
+ 63958, 63965, 63972, 63977, 63984, 63989, 63996, 64005, 64016, 64021,
+ 64030, 64035, 64042, 64051, 64060, 64065, 64070, 64077, 64083, 64090,
+ 64097, 64101, 64105, 64108, 64112, 64116, 64120, 64124, 64128, 64132,
+ 64136, 64139, 64143, 64147, 64151, 64155, 64159, 64163, 64166, 64170,
+ 64174, 64177, 64181, 64185, 64189, 64193, 64197, 64201, 64205, 64209,
+ 64213, 64217, 64221, 64225, 64229, 64233, 64237, 64241, 64245, 64249,
+ 64253, 64257, 64261, 64265, 64269, 64273, 64277, 64281, 64285, 64289,
+ 64293, 64297, 64301, 64305, 64309, 64313, 64317, 64321, 64325, 64329,
+ 64333, 64337, 64341, 64345, 64349, 64353, 64356, 64360, 64364, 64368,
+ 64372, 64376, 64380, 64384, 64388, 64392, 64396, 64400, 64404, 64408,
+ 64412, 64416, 64420, 64424, 64428, 64432, 64436, 64440, 64444, 64448,
+ 64452, 64456, 64460, 64464, 64468, 64472, 64476, 64480, 64484, 64488,
+ 64492, 64496, 64500, 64504, 64508, 64512, 64516, 64520, 64524, 64528,
+ 64532, 64536, 64540, 64544, 64548, 64552, 64556, 64560, 64564, 64568,
+ 64572, 64576, 64580, 64584, 64588, 64592, 64596, 64600, 64604, 64608,
+ 64612, 64616, 64620, 64624, 64628, 64632, 64636, 64640, 64644, 64648,
+ 64652, 64656, 64660, 64664, 64668, 64672, 64676, 64680, 64684, 64688,
+ 64692, 64696, 64700, 64704, 64708, 64712, 64716, 64720, 64724, 64728,
+ 64732, 64736, 64740, 64744, 64748, 64752, 64756, 64760, 64764, 64768,
+ 64772, 64776, 64780, 64784, 64788, 64792, 64796, 64800, 64804, 64808,
+ 64812, 64816, 64820, 64824, 64827, 64831, 64835, 64839, 64843, 64847,
+ 64851, 64855, 64859, 64863, 64867, 64871, 64875, 64879, 64883, 64887,
+ 64891, 64895, 64899, 64903, 64907, 64911, 64915, 64919, 64923, 64927,
+ 64931, 64935, 64939, 64943, 64947, 64951, 64955, 64959, 64963, 64967,
+ 64971, 64975, 64979, 64983, 64987, 64991, 64995, 64999, 65003, 65007,
+ 65011, 65015, 65019, 65023, 65027, 65031, 65035, 65039, 65043, 65047,
+ 65051, 65055, 65059, 65063, 65067, 65071, 65075, 65079, 65083, 65087,
+ 65091, 65095, 65099, 65103, 65107, 65111, 65115, 65119, 65123, 65127,
+ 65131, 65135, 65139, 65143, 65147, 65151, 65155, 65159, 65163, 65167,
+ 65171, 65175, 65179, 65183, 65187, 65191, 65195, 65199, 65203, 65207,
+ 65211, 65215, 65219, 65223, 65227, 65231, 65235, 65239, 65243, 65247,
+ 65251, 65255, 65259, 65263, 65267, 65271, 65275, 65279, 65283, 65287,
+ 65290, 65294, 65298, 65302, 65306, 65310, 65314, 65318, 65322, 65326,
+ 65330, 65334, 65338, 65342, 65346, 65350, 65354, 65358, 65362, 65366,
+ 65370, 65374, 65378, 65382, 65386, 65390, 65394, 65398, 65402, 65406,
+ 65410, 65414, 65418, 65422, 65426, 65430, 65434, 65438, 65442, 65446,
+ 65450, 65454, 65458, 65462, 65466, 65470, 65474, 65478, 65482, 65486,
+ 65490, 65494, 65498, 65502, 65506, 65510, 65514, 65518, 65522, 65526,
+ 65530, 65534, 65538, 65542, 65546, 65550, 65554, 65558, 65562, 65566,
+ 65570, 65574, 65578, 65582, 65586, 65590, 65594, 65598, 65602, 65606,
+ 65610, 65614, 65618, 65622, 65626, 65630, 65634, 65638, 65642, 65646,
+ 65649, 65653, 65657, 65661, 65665, 65669, 65673, 65677, 65681, 65685,
+ 65689, 65693, 65697, 65701, 65705, 65709, 65713, 65717, 65721, 65725,
+ 65729, 65733, 65737, 65741, 65745, 65749, 65753, 65757, 65761, 65765,
+ 65769, 65773, 65777, 65781, 65785, 65789, 65793, 65797, 65801, 65805,
+ 65809, 65813, 65817, 65821, 65825, 65829, 65833, 65837, 65841, 65845,
+ 65849, 65853, 65857, 65861, 65865, 65869, 65873, 65877, 65881, 65885,
+ 65889, 65893, 65897, 65901, 65905, 65909, 65913, 65917, 65921, 65925,
+ 65929, 65933, 65937, 65941, 65945, 65949, 65953, 65957, 65961, 65965,
+ 65969, 65973, 65977, 65981, 65985, 65989, 65993, 65997, 66001, 66005,
+ 66009, 66013, 66017, 66021, 66025, 66029, 66033, 66037, 66041, 66045,
+ 66049, 66053, 66057, 66061, 66065, 66069, 66073, 66077, 66081, 66085,
+ 66089, 66093, 66097, 66101, 66105, 66109, 66113, 66117, 66121, 66125,
+ 66129, 66133, 66137, 66141, 66144, 66148, 66152, 66156, 66160, 66164,
+ 66168, 66172, 66176, 66180, 66184, 66188, 66192, 66196, 66200, 66204,
+ 66208, 66212, 66216, 66220, 66224, 66228, 66232, 66236, 66240, 66244,
+ 66248, 66252, 66256, 66260, 66264, 66268, 66272, 66276, 66280, 66284,
+ 66288, 66292, 66296, 66300, 66304, 66308, 66312, 66316, 66320, 66324,
+ 66328, 66332, 66336, 66340, 66344, 66348, 66352, 66356, 66360, 66364,
+ 66368, 66372, 66376, 66380, 66384, 66388, 66392, 66396, 66400, 66404,
+ 66408, 66412, 66416, 66420, 66424, 66428, 66432, 66436, 66440, 66444,
+ 66448, 66452, 66456, 66460, 66464, 66468, 66472, 66476, 66480, 66484,
+ 66488, 66492, 66496, 66500, 66504, 66508, 66512, 66516, 66520, 66524,
+ 66528, 66532, 66536, 66540, 66544, 66548, 66552, 66556, 66560, 66564,
+ 66568, 66572, 66576, 66580, 66584, 66588, 66592, 66596, 66599, 66603,
+ 66607, 66611, 66615, 66619, 66623, 66627, 66631, 66635, 66639, 66643,
+ 66647, 66651, 66655, 66659, 66663, 66667, 66671, 66675, 66679, 66683,
+ 66687, 66691, 66695, 66699, 66703, 66707, 66711, 66715, 66719, 66723,
+ 66727, 66731, 66735, 66739, 66743, 66747, 66751, 66755, 66759, 66763,
+ 66767, 66771, 66775, 66779, 66783, 66787, 66791, 66795, 66799, 66803,
+ 66807, 66811, 66815, 66819, 66823, 66827, 66831, 66835, 66839, 66843,
+ 66847, 66851, 66855, 66859, 66863, 66867, 66871, 66875, 66879, 66883,
+ 66887, 66891, 66895, 66899, 66903, 66907, 66911, 66915, 66919, 66923,
+ 66927, 66931, 66935, 66939, 66943, 66947, 66951, 66955, 66959, 66963,
+ 66967, 66971, 66975, 66979, 66983, 66987, 66991, 66995, 66999, 67003,
+ 67007, 67011, 67015, 67019, 67023, 67027, 67031, 67035, 67039, 67043,
+ 67047, 67051, 67055, 67059, 67063, 67067, 67071, 67075, 67079, 67083,
+ 67087, 67091, 67095, 67099, 67103, 67107, 67111, 67115, 67119, 67123,
+ 67127, 67131, 67135, 67139, 67143, 67147, 67151, 67155, 67159, 67163,
+ 67167, 67171, 67175, 67179, 67183, 67187, 67191, 67195, 67199, 67202,
+ 67206, 67210, 67214, 67218, 67222, 67226, 67230, 67233, 67237, 67241,
+ 67245, 67249, 67253, 67257, 67261, 67265, 67269, 67273, 67277, 67281,
+ 67285, 67289, 67293, 67297, 67301, 67305, 67309, 67313, 67317, 67321,
+ 67325, 67329, 67333, 67337, 67341, 67345, 67349, 67353, 67357, 67361,
+ 67365, 67369, 67373, 67377, 67381, 67385, 67389, 67393, 67397, 67401,
+ 67405, 67409, 67413, 67417, 67421, 67425, 67429, 67433, 67437, 67441,
+ 67445, 67449, 67453, 67457, 67461, 67465, 67469, 67473, 67477, 67481,
+ 67485, 67489, 67493, 67497, 67501, 67505, 67509, 67513, 67517, 67521,
+ 67525, 67529, 67533, 67537, 67541, 67545, 67549, 67553, 67557, 67561,
+ 67565, 67569, 67573, 67577, 67581, 67585, 67589, 67593, 67597, 67601,
+ 67605, 67609, 67613, 67617, 67621, 67625, 67629, 67633, 67637, 67641,
+ 67645, 67649, 67653, 67657, 67661, 67665, 67669, 67673, 67677, 67681,
+ 67685, 67689, 67693, 67697, 67701, 67705, 67709, 67713, 67717, 67721,
+ 67725, 67729, 67733, 67737, 67741, 67745, 67749, 67753, 67757, 67761,
+ 67765, 67769, 67773, 67777, 67781, 67785, 67789, 67793, 67797, 67801,
+ 67805, 67809, 67813, 67817, 67821, 67825, 67829, 67833, 67837, 67841,
+ 67845, 67849, 67853, 67857, 67861, 67865, 67869, 67873, 67877, 67881,
+ 67885, 67889, 67893, 67897, 67901, 67905, 67909, 67913, 67917, 67921,
+ 67925, 67929, 67933, 67937, 67941, 67945, 67949, 67953, 67957, 67960,
+ 67964, 67968, 67972, 67976, 67980, 67984, 67988, 67992, 67996, 68000,
+ 68004, 68008, 68012, 68016, 68020, 68024, 68028, 68032, 68036, 68040,
+ 68044, 68048, 68052, 68056, 68060, 68064, 68068, 68072, 68076, 68080,
+ 68084, 68088, 68092, 68096, 68100, 68104, 68108, 68112, 68116, 68120,
+ 68124, 68128, 68132, 68136, 68140, 68144, 68148, 68152, 68156, 68160,
+ 68164, 68168, 68172, 68176, 68180, 68184, 68188, 68192, 68196, 68200,
+ 68204, 68208, 68212, 68216, 68220, 68224, 68228, 68232, 68236, 68240,
+ 68244, 68248, 68252, 68256, 68260, 68264, 68268, 68272, 68276, 68280,
+ 68284, 68288, 68292, 68296, 68300, 68304, 68308, 68312, 68316, 68320,
+ 68324, 68328, 68332, 68336, 68340, 68344, 68348, 68352, 68356, 68360,
+ 68364, 68368, 68372, 68376, 68380, 68384, 68388, 68392, 68396, 68400,
+ 68404, 68408, 68412, 68416, 68420, 68424, 68428, 68432, 68436, 68440,
+ 68444, 68448, 68452, 68456, 68460, 68464, 68468, 68472, 68476, 68480,
+ 68484, 68488, 68492, 68496, 68500, 68504, 68508, 68512, 68516, 68520,
+ 68524, 68528, 68532, 68536, 68540, 68544, 68548, 68552, 68556, 68560,
+ 68564, 68568, 68572, 68576, 68580, 68584, 68588, 68592, 68596, 68600,
+ 68604, 68608, 68612, 68616, 68620, 68624, 68628, 68632, 68636, 68640,
+ 68644, 68648, 68652, 68656, 68660, 68664, 68668, 68672, 68676, 68680,
+ 68684, 68688, 68692, 68696, 68700, 68704, 68708, 68712, 68716, 68720,
+ 68724, 68728, 68732, 68736, 68740, 0, 0, 0, 68744, 68748, 68752, 68756,
+ 68760, 68764, 68768, 68772, 68776, 68780, 68784, 68788, 68792, 68796,
+ 68800, 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836,
+ 68840, 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876,
+ 68880, 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916,
+ 68920, 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956,
+ 68960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68964, 68969, 68973, 68978, 68983,
+ 68988, 68993, 68998, 69002, 69007, 69012, 69017, 69022, 69027, 69032,
+ 69037, 69041, 69045, 69050, 69054, 69059, 69064, 69069, 69073, 69078,
+ 69083, 69088, 69093, 69098, 69102, 69107, 69111, 69116, 69120, 69125,
+ 69129, 69133, 69137, 69142, 69147, 69152, 69160, 69168, 69176, 69184,
+ 69191, 69199, 69205, 69213, 69217, 69221, 69225, 69229, 69233, 69237,
+ 69241, 69245, 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277,
+ 69281, 69285, 69289, 69293, 69297, 69301, 69305, 69309, 69313, 69317,
+ 69321, 69325, 69329, 69333, 69337, 69341, 69345, 69349, 69353, 69357,
+ 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396,
+ 69400, 69404, 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436,
+ 69440, 69444, 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476,
+ 69480, 69484, 69488, 69492, 69496, 69500, 69504, 69507, 69511, 69515,
+ 69518, 69522, 69526, 69530, 69533, 69537, 69541, 69545, 69549, 69553,
+ 69557, 69561, 69565, 69569, 69573, 69577, 69581, 69585, 69589, 69592,
+ 69596, 69600, 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69630,
+ 69633, 69637, 69641, 69645, 69648, 69651, 69655, 69659, 69663, 69667,
+ 69671, 69675, 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707,
+ 69711, 69715, 69719, 69723, 69727, 69731, 69735, 69739, 69743, 69747,
+ 69751, 69755, 69759, 69763, 69767, 69771, 69775, 69779, 69783, 69787,
+ 69791, 69795, 69799, 69802, 69806, 69810, 69814, 69818, 69822, 69826,
+ 69830, 69834, 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866,
+ 69870, 69874, 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906,
+ 69910, 69914, 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946,
+ 69949, 69953, 69957, 69961, 69965, 69969, 69973, 69977, 69981, 69985,
+ 69989, 69993, 69997, 70001, 70005, 70009, 70013, 70016, 70020, 70024,
+ 70028, 70032, 70036, 70040, 70044, 70048, 70052, 70056, 70060, 70064,
+ 70068, 70072, 70076, 70080, 70084, 70088, 70092, 70096, 70100, 70103,
+ 70107, 70111, 70115, 70119, 70123, 70127, 70131, 70135, 70139, 70143,
+ 70147, 70151, 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183,
+ 70187, 70191, 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223,
+ 70227, 70231, 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263,
+ 70267, 70271, 70275, 70278, 70283, 70287, 70293, 70298, 70304, 70308,
+ 70312, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70348,
+ 70352, 70356, 70360, 70363, 70366, 70369, 70372, 70375, 70378, 70381,
+ 70384, 70387, 70392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 70398, 70403, 70408, 70413, 70418, 70425, 70432, 70437, 70442,
+ 70447, 70452, 70459, 70466, 70473, 70480, 70487, 70494, 70504, 70514,
+ 70521, 70528, 70535, 70542, 70548, 70554, 70563, 70572, 70579, 70586,
+ 70597, 70608, 70613, 70618, 70625, 70632, 70639, 70646, 70653, 70660,
+ 70667, 70674, 70680, 70686, 70692, 70698, 70705, 70712, 70717, 70721,
+ 70728, 70735, 70742, 70746, 70753, 70757, 70762, 70766, 70772, 70777,
+ 70783, 70788, 70792, 70796, 70799, 70802, 70807, 70812, 70817, 70822,
+ 70827, 70832, 70837, 70842, 70847, 70852, 70861, 70870, 70875, 70880,
+ 70885, 70890, 70895, 70900, 70905, 70910, 70915, 70920, 70925, 0, 0, 0,
+ 0, 0, 0, 0, 70930, 70936, 70939, 70942, 70945, 70949, 70953, 70957,
+ 70961, 70964, 70968, 70971, 70975, 70978, 70982, 70986, 70990, 70994,
+ 70998, 71002, 71006, 71009, 71013, 71017, 71021, 71025, 71029, 71033,
+ 71037, 71041, 71045, 71049, 71053, 71057, 71061, 71065, 71068, 71072,
+ 71076, 71080, 71084, 71088, 71092, 71096, 71100, 71104, 71108, 71112,
+ 71116, 71120, 71124, 71128, 71132, 71136, 71140, 71144, 71148, 71152,
+ 71156, 71160, 71164, 71167, 71171, 71175, 71179, 71183, 71187, 71191,
+ 71195, 71198, 71202, 71206, 71210, 71214, 71218, 71222, 71226, 71230,
+ 71234, 71238, 71242, 71246, 71251, 71256, 71259, 71264, 71267, 71270,
+ 71273, 0, 0, 0, 0, 0, 0, 0, 0, 71277, 71286, 71295, 71304, 71313, 71322,
+ 71331, 71340, 71349, 71357, 71364, 71372, 71379, 71387, 71397, 71406,
+ 71416, 71425, 71435, 71443, 71450, 71458, 71465, 71473, 71478, 71483,
+ 71488, 71497, 71503, 71509, 71516, 71525, 71533, 71541, 71549, 71556,
+ 71563, 71570, 71577, 71582, 71587, 71592, 71597, 71602, 71607, 71612,
+ 71617, 71625, 71633, 71639, 71645, 71650, 71655, 71660, 71665, 71670,
+ 71675, 71680, 71685, 71693, 71701, 71706, 71711, 71721, 71731, 71738,
+ 71745, 71754, 71763, 71775, 71787, 71793, 71799, 71807, 71815, 71825,
+ 71835, 71842, 71849, 71854, 71859, 71871, 71883, 71891, 71899, 71909,
+ 71919, 71931, 71943, 71952, 71961, 71968, 71975, 71982, 71989, 71998,
+ 72007, 72012, 72017, 72024, 72031, 72038, 72045, 72057, 72069, 72074,
+ 72079, 72084, 72089, 72094, 72099, 72104, 72109, 72113, 72118, 72123,
+ 72128, 72133, 72138, 72144, 72149, 72154, 72161, 72168, 72175, 72182,
+ 72189, 72198, 72207, 72213, 72219, 72225, 72231, 72238, 72245, 72252,
+ 72259, 72266, 72270, 72277, 72282, 72287, 72294, 0, 72307, 72315, 72323,
+ 72330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72337, 72346, 72355, 72364,
+ 72373, 72382, 72391, 72400, 72409, 72418, 72427, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72434,
+ 72441, 72447, 72454, 72462, 72470, 72477, 72485, 72492, 72498, 72504,
+ 72511, 72517, 72523, 72529, 72536, 72543, 72550, 72557, 72564, 72571,
+ 72578, 72585, 72592, 72599, 72606, 72613, 72620, 72627, 72633, 72640,
+ 72647, 72654, 72661, 72668, 72675, 72682, 72689, 72696, 72703, 72710,
+ 72717, 72724, 72731, 72738, 72745, 72752, 72759, 72767, 72775, 72783,
+ 72791, 0, 0, 0, 0, 72799, 72808, 72817, 72826, 72835, 72844, 72853,
+ 72860, 72867, 72874, 0, 0, 0, 0, 0, 0, 72881, 72885, 72890, 72895, 72900,
+ 72905, 72910, 72915, 72920, 72925, 72930, 72935, 72939, 72943, 72948,
+ 72953, 72957, 72962, 72967, 72972, 72977, 72982, 72987, 72992, 72996,
+ 73000, 73005, 73010, 73014, 73018, 73022, 73026, 73030, 73034, 73038,
+ 73043, 73048, 73053, 73058, 73063, 73070, 73076, 73081, 73086, 73091,
+ 73096, 73102, 73109, 73115, 73122, 73128, 73134, 73139, 73146, 73152,
+ 73157, 0, 0, 0, 0, 0, 0, 0, 0, 73163, 73167, 73171, 73174, 73178, 73181,
+ 73185, 73188, 73192, 73196, 73201, 73205, 73210, 73213, 73217, 73221,
+ 73224, 73228, 73232, 73235, 73239, 73243, 73247, 73251, 73255, 73259,
+ 73263, 73267, 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299,
+ 73303, 73307, 73310, 73313, 73317, 73321, 73325, 73328, 73331, 73334,
+ 73338, 73342, 73346, 73350, 73353, 73356, 73360, 73365, 73370, 73374,
+ 73379, 73383, 73388, 73393, 73399, 73404, 73410, 73414, 73419, 73424,
+ 73428, 73433, 73438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73442, 73445, 73449,
+ 73453, 73456, 73459, 73462, 73465, 73468, 73471, 73474, 73477, 0, 0, 0,
+ 0, 0, 0, 73480, 73485, 73489, 73493, 73497, 73501, 73505, 73509, 73513,
+ 73517, 73521, 73525, 73529, 73533, 73537, 73541, 73545, 73550, 73555,
+ 73561, 73567, 73574, 73579, 73584, 73590, 73594, 73599, 73602, 0, 0, 0,
+ 0, 73605, 73612, 73618, 73624, 73630, 73636, 73642, 73648, 73654, 73660,
+ 73666, 73672, 73679, 73686, 73693, 73699, 73706, 73713, 73720, 73727,
+ 73734, 73740, 73746, 73753, 73759, 73766, 73773, 73779, 73785, 73792,
+ 73799, 73806, 73812, 73819, 73826, 73832, 73839, 73845, 73852, 73859,
+ 73865, 73871, 73878, 73884, 73891, 73898, 73907, 73914, 73921, 73925,
+ 73930, 73935, 73940, 73945, 73949, 73953, 73958, 73962, 73967, 73972,
+ 73977, 73981, 73985, 73990, 73994, 73999, 74003, 74008, 74013, 74018,
+ 74023, 74027, 74032, 74037, 74042, 74048, 74053, 74059, 74065, 74071,
+ 74077, 74083, 74088, 74094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74098,
+ 74103, 74107, 74111, 74115, 74119, 74123, 74127, 74131, 74135, 74139,
+ 74143, 74147, 74151, 74155, 74159, 74163, 74167, 74171, 74175, 74179,
+ 74183, 74187, 74191, 74195, 74199, 74203, 74207, 74211, 74215, 0, 0, 0,
+ 74219, 74223, 74227, 74231, 74235, 74238, 74244, 74247, 74251, 74254,
+ 74260, 74266, 74274, 74277, 74281, 74284, 74287, 74293, 74299, 74303,
+ 74309, 74313, 74317, 74323, 74327, 74333, 74339, 74343, 74347, 74353,
+ 74357, 74363, 74369, 74373, 74379, 74383, 74389, 74392, 74395, 74401,
+ 74405, 74411, 74414, 74417, 74420, 74426, 74430, 74434, 74440, 74446,
+ 74449, 74452, 74458, 74463, 74468, 74473, 74480, 74485, 74492, 74497,
+ 74504, 74509, 74514, 74519, 74524, 74527, 74531, 74535, 74540, 74545,
+ 74550, 74555, 74560, 74565, 74570, 74575, 74582, 74587, 0, 74594, 74597,
+ 74601, 74604, 74607, 74610, 74613, 74616, 74619, 74622, 74625, 0, 0, 0,
+ 0, 74628, 74635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74640, 74643, 74646, 74649, 74652,
+ 74656, 74659, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690,
+ 74694, 74698, 74702, 74706, 74710, 74714, 74718, 74722, 74726, 74730,
+ 74733, 74737, 74740, 74744, 74748, 74752, 74756, 74760, 74763, 74767,
+ 74770, 74773, 74777, 74781, 74785, 74788, 74791, 74796, 74800, 74805,
+ 74810, 74814, 74819, 74823, 74828, 74833, 74838, 74842, 74846, 74851, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 74856, 74861, 74866, 74871, 74877, 74882, 74887,
+ 74892, 74897, 74902, 74906, 74910, 74915, 74920, 0, 0, 74926, 74930,
+ 74933, 74936, 74939, 74942, 74945, 74948, 74951, 74954, 0, 0, 74957,
+ 74962, 74967, 74973, 74980, 74986, 74992, 74998, 75004, 75010, 75016,
+ 75022, 75028, 75034, 75040, 75046, 75051, 75056, 75061, 75067, 75073,
+ 75080, 75086, 75092, 75097, 75104, 75111, 75118, 75124, 75129, 75134,
+ 75139, 0, 0, 0, 0, 75147, 75153, 75159, 75165, 75171, 75177, 75183,
+ 75189, 75195, 75201, 75207, 75213, 75219, 75225, 75231, 75237, 75243,
+ 75249, 75255, 75261, 75267, 75272, 75277, 75283, 75289, 75295, 75301,
+ 75307, 75313, 75319, 75325, 75331, 75337, 75343, 75349, 75355, 75361,
+ 75367, 75373, 75379, 75385, 75391, 75397, 75403, 75409, 75415, 75421,
+ 75426, 75431, 75437, 75442, 75446, 75451, 75455, 75459, 75463, 75469,
+ 75474, 75479, 75484, 75489, 75494, 75499, 75504, 75511, 75518, 75525, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62872, 62881, 62890, 62901, 62908, 62913, 62918, 62925, 62932, 62938,
- 62943, 62948, 62953, 62958, 62965, 62970, 62975, 62980, 62991, 62996,
- 63001, 63008, 63013, 63020, 63025, 63030, 63037, 63044, 63051, 63060,
- 63069, 63074, 63079, 63084, 63091, 63096, 63106, 63113, 63118, 63123,
- 63128, 63133, 63138, 63143, 63152, 63159, 63166, 63171, 63178, 63183,
- 63190, 63199, 63210, 63215, 63224, 63229, 63236, 63245, 63254, 63259,
- 63264, 63271, 63277, 63284, 63291, 63295, 63299, 63302, 63306, 63310,
- 63314, 63318, 63322, 63326, 63330, 63333, 63337, 63341, 63345, 63349,
- 63353, 63357, 63360, 63364, 63368, 63371, 63375, 63379, 63383, 63387,
- 63391, 63395, 63399, 63403, 63407, 63411, 63415, 63419, 63423, 63427,
- 63431, 63435, 63439, 63443, 63447, 63451, 63455, 63459, 63463, 63467,
- 63471, 63475, 63479, 63483, 63487, 63491, 63495, 63499, 63503, 63507,
- 63511, 63515, 63519, 63523, 63527, 63531, 63535, 63539, 63543, 63547,
- 63550, 63554, 63558, 63562, 63566, 63570, 63574, 63578, 63582, 63586,
- 63590, 63594, 63598, 63602, 63606, 63610, 63614, 63618, 63622, 63626,
- 63630, 63634, 63638, 63642, 63646, 63650, 63654, 63658, 63662, 63666,
- 63670, 63674, 63678, 63682, 63686, 63690, 63694, 63698, 63702, 63706,
- 63710, 63714, 63718, 63722, 63726, 63730, 63734, 63738, 63742, 63746,
- 63750, 63754, 63758, 63762, 63766, 63770, 63774, 63778, 63782, 63786,
- 63790, 63794, 63798, 63802, 63806, 63810, 63814, 63818, 63822, 63826,
- 63830, 63834, 63838, 63842, 63846, 63850, 63854, 63858, 63862, 63866,
- 63870, 63874, 63878, 63882, 63886, 63890, 63894, 63898, 63902, 63906,
- 63910, 63914, 63918, 63922, 63926, 63930, 63934, 63938, 63942, 63946,
- 63950, 63954, 63958, 63962, 63966, 63970, 63974, 63978, 63982, 63986,
- 63990, 63994, 63998, 64002, 64006, 64010, 64014, 64018, 64021, 64025,
- 64029, 64033, 64037, 64041, 64045, 64049, 64053, 64057, 64061, 64065,
- 64069, 64073, 64077, 64081, 64085, 64089, 64093, 64097, 64101, 64105,
- 64109, 64113, 64117, 64121, 64125, 64129, 64133, 64137, 64141, 64145,
- 64149, 64153, 64157, 64161, 64165, 64169, 64173, 64177, 64181, 64185,
- 64189, 64193, 64197, 64201, 64205, 64209, 64213, 64217, 64221, 64225,
- 64229, 64233, 64237, 64241, 64245, 64249, 64253, 64257, 64261, 64265,
- 64269, 64273, 64277, 64281, 64285, 64289, 64293, 64297, 64301, 64305,
- 64309, 64313, 64317, 64321, 64325, 64329, 64333, 64337, 64341, 64345,
- 64349, 64353, 64357, 64361, 64365, 64369, 64373, 64377, 64381, 64385,
- 64389, 64393, 64397, 64401, 64405, 64409, 64413, 64417, 64421, 64425,
- 64429, 64433, 64437, 64441, 64445, 64449, 64453, 64457, 64461, 64465,
- 64469, 64473, 64477, 64481, 64484, 64488, 64492, 64496, 64500, 64504,
- 64508, 64512, 64516, 64520, 64524, 64528, 64532, 64536, 64540, 64544,
- 64548, 64552, 64556, 64560, 64564, 64568, 64572, 64576, 64580, 64584,
- 64588, 64592, 64596, 64600, 64604, 64608, 64612, 64616, 64620, 64624,
- 64628, 64632, 64636, 64640, 64644, 64648, 64652, 64656, 64660, 64664,
- 64668, 64672, 64676, 64680, 64684, 64688, 64692, 64696, 64700, 64704,
- 64708, 64712, 64716, 64720, 64724, 64728, 64732, 64736, 64740, 64744,
- 64748, 64752, 64756, 64760, 64764, 64768, 64772, 64776, 64780, 64784,
- 64788, 64792, 64796, 64800, 64804, 64808, 64812, 64816, 64820, 64824,
- 64828, 64832, 64836, 64840, 64843, 64847, 64851, 64855, 64859, 64863,
- 64867, 64871, 64875, 64879, 64883, 64887, 64891, 64895, 64899, 64903,
- 64907, 64911, 64915, 64919, 64923, 64927, 64931, 64935, 64939, 64943,
- 64947, 64951, 64955, 64959, 64963, 64967, 64971, 64975, 64979, 64983,
- 64987, 64991, 64995, 64999, 65003, 65007, 65011, 65015, 65019, 65023,
- 65027, 65031, 65035, 65039, 65043, 65047, 65051, 65055, 65059, 65063,
- 65067, 65071, 65075, 65079, 65083, 65087, 65091, 65095, 65099, 65103,
- 65107, 65111, 65115, 65119, 65123, 65127, 65131, 65135, 65139, 65143,
- 65147, 65151, 65155, 65159, 65163, 65167, 65171, 65175, 65179, 65183,
- 65187, 65191, 65195, 65199, 65203, 65207, 65211, 65215, 65219, 65223,
- 65227, 65231, 65235, 65239, 65243, 65247, 65251, 65255, 65259, 65263,
- 65267, 65271, 65275, 65279, 65283, 65287, 65291, 65295, 65299, 65303,
- 65307, 65311, 65315, 65319, 65323, 65327, 65331, 65335, 65338, 65342,
- 65346, 65350, 65354, 65358, 65362, 65366, 65370, 65374, 65378, 65382,
- 65386, 65390, 65394, 65398, 65402, 65406, 65410, 65414, 65418, 65422,
- 65426, 65430, 65434, 65438, 65442, 65446, 65450, 65454, 65458, 65462,
- 65466, 65470, 65474, 65478, 65482, 65486, 65490, 65494, 65498, 65502,
- 65506, 65510, 65514, 65518, 65522, 65526, 65530, 65534, 65538, 65542,
- 65546, 65550, 65554, 65558, 65562, 65566, 65570, 65574, 65578, 65582,
- 65586, 65590, 65594, 65598, 65602, 65606, 65610, 65614, 65618, 65622,
- 65626, 65630, 65634, 65638, 65642, 65646, 65650, 65654, 65658, 65662,
- 65666, 65670, 65674, 65678, 65682, 65686, 65690, 65694, 65698, 65702,
- 65706, 65710, 65714, 65718, 65722, 65726, 65730, 65734, 65738, 65742,
- 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65778, 65782,
- 65786, 65790, 65793, 65797, 65801, 65805, 65809, 65813, 65817, 65821,
- 65825, 65829, 65833, 65837, 65841, 65845, 65849, 65853, 65857, 65861,
- 65865, 65869, 65873, 65877, 65881, 65885, 65889, 65893, 65897, 65901,
- 65905, 65909, 65913, 65917, 65921, 65925, 65929, 65933, 65937, 65941,
- 65945, 65949, 65953, 65957, 65961, 65965, 65969, 65973, 65977, 65981,
- 65985, 65989, 65993, 65997, 66001, 66005, 66009, 66013, 66017, 66021,
- 66025, 66029, 66033, 66037, 66041, 66045, 66049, 66053, 66057, 66061,
- 66065, 66069, 66073, 66077, 66081, 66085, 66089, 66093, 66097, 66101,
- 66105, 66109, 66113, 66117, 66121, 66125, 66129, 66133, 66137, 66141,
- 66145, 66149, 66153, 66157, 66161, 66165, 66169, 66173, 66177, 66181,
- 66185, 66189, 66193, 66197, 66201, 66205, 66209, 66213, 66217, 66221,
- 66225, 66229, 66233, 66237, 66241, 66245, 66249, 66253, 66257, 66261,
- 66265, 66269, 66273, 66277, 66281, 66285, 66289, 66293, 66297, 66301,
- 66305, 66309, 66313, 66317, 66321, 66325, 66329, 66333, 66337, 66341,
- 66345, 66349, 66353, 66357, 66361, 66365, 66369, 66373, 66377, 66381,
- 66385, 66389, 66393, 66396, 66400, 66404, 66408, 66412, 66416, 66420,
- 66424, 66428, 66432, 66436, 66440, 66444, 66448, 66452, 66456, 66460,
- 66464, 66468, 66472, 66476, 66480, 66484, 66488, 66492, 66496, 66500,
- 66504, 66508, 66512, 66516, 66520, 66524, 66528, 66532, 66536, 66540,
- 66544, 66548, 66552, 66556, 66560, 66564, 66568, 66572, 66576, 66580,
- 66584, 66588, 66592, 66596, 66600, 66604, 66608, 66612, 66616, 66620,
- 66624, 66628, 66632, 66636, 66640, 66644, 66648, 66652, 66656, 66660,
- 66664, 66668, 66672, 66676, 66680, 66684, 66688, 66692, 66696, 66700,
- 66704, 66708, 66712, 66716, 66720, 66724, 66728, 66732, 66736, 66740,
- 66744, 66748, 66752, 66756, 66760, 66764, 66768, 66772, 66776, 66780,
- 66784, 66788, 66792, 66796, 66800, 66804, 66808, 66812, 66816, 66820,
- 66824, 66828, 66832, 66836, 66840, 66844, 66848, 66852, 66856, 66860,
- 66864, 66868, 66872, 66876, 66880, 66884, 66888, 66892, 66896, 66900,
- 66904, 66908, 66912, 66916, 66920, 66924, 66928, 66932, 66936, 66940,
- 66944, 66948, 66952, 66956, 66960, 66964, 66968, 66972, 66976, 66980,
- 66984, 66988, 66992, 66996, 67000, 67004, 67008, 67012, 67016, 67020,
- 67024, 67028, 67032, 67036, 67040, 67044, 67048, 67052, 67056, 67060,
- 67064, 67068, 67072, 67076, 67080, 67084, 67088, 67092, 67096, 67100,
- 67104, 67108, 67112, 67116, 67120, 67124, 67128, 67132, 67136, 67140,
- 67144, 67148, 67152, 67155, 67159, 67163, 67167, 67171, 67175, 67179,
- 67183, 67187, 67191, 67195, 67199, 67203, 67207, 67211, 67215, 67219,
- 67223, 67227, 67231, 67235, 67239, 67243, 67247, 67251, 67255, 67259,
- 67263, 67267, 67271, 67275, 67279, 67283, 67287, 67291, 67295, 67299,
- 67303, 67307, 67311, 67315, 67319, 67323, 67327, 67331, 67335, 67339,
- 67343, 67347, 67351, 67355, 67359, 67363, 67367, 67371, 67375, 67379,
- 67383, 67387, 67391, 67395, 67399, 67403, 67407, 67411, 67415, 67419,
- 67423, 67427, 67431, 67435, 67439, 67443, 67447, 67451, 67455, 67459,
- 67463, 67467, 67471, 67475, 67479, 67483, 67487, 67491, 67495, 67499,
- 67503, 67507, 67511, 67515, 67519, 67523, 67527, 67531, 67535, 67539,
- 67543, 67547, 67551, 67555, 67559, 67563, 67567, 67571, 67575, 67579,
- 67583, 67587, 67591, 67595, 67599, 67603, 67607, 67611, 67615, 67619,
- 67623, 67627, 67631, 67635, 67639, 67643, 67647, 67651, 67655, 67659,
- 67663, 67667, 67671, 67675, 67679, 67683, 67687, 67691, 67695, 67699,
- 67703, 67707, 67711, 67715, 67719, 67723, 67727, 67731, 67735, 67739,
- 67743, 67747, 67751, 67755, 67759, 67763, 67767, 67771, 67775, 67779,
- 67783, 67787, 67791, 67795, 67799, 67803, 67807, 67811, 67815, 67819,
- 67823, 67827, 67831, 67835, 67839, 67843, 67847, 67851, 67855, 67859,
- 67863, 67867, 67871, 67875, 67879, 67883, 67887, 67891, 67895, 67899,
- 67903, 67907, 67911, 67915, 67919, 67923, 67927, 67931, 67935, 0, 0, 0,
- 67939, 67943, 67947, 67951, 67955, 67959, 67963, 67967, 67971, 67975,
- 67979, 67983, 67987, 67991, 67995, 67999, 68003, 68007, 68011, 68015,
- 68019, 68023, 68027, 68031, 68035, 68039, 68043, 68047, 68051, 68055,
- 68059, 68063, 68067, 68071, 68075, 68079, 68083, 68087, 68091, 68095,
- 68099, 68103, 68107, 68111, 68115, 68119, 68123, 68127, 68131, 68135,
- 68139, 68143, 68147, 68151, 68155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68159,
- 68164, 68168, 68173, 68178, 68183, 68188, 68193, 68197, 68202, 68207,
- 68212, 68217, 68222, 68227, 68232, 68236, 68240, 68245, 68250, 68255,
- 68260, 68265, 68269, 68274, 68279, 68284, 68289, 68294, 68298, 68303,
- 68307, 68312, 68316, 68321, 68325, 68329, 68333, 68338, 68343, 68348,
- 68356, 68364, 68372, 68380, 68387, 68395, 68401, 68409, 68413, 68417,
- 68421, 68425, 68429, 68433, 68437, 68441, 68445, 68449, 68453, 68457,
- 68461, 68465, 68469, 68473, 68477, 68481, 68485, 68489, 68493, 68497,
- 68501, 68505, 68509, 68513, 68517, 68521, 68525, 68529, 68533, 68537,
- 68541, 68545, 68549, 68553, 68556, 68560, 68564, 68568, 68572, 68576,
- 68580, 68584, 68588, 68592, 68596, 68600, 68604, 68608, 68612, 68616,
- 68620, 68624, 68628, 68632, 68636, 68640, 68644, 68648, 68652, 68656,
- 68660, 68664, 68668, 68672, 68676, 68680, 68684, 68688, 68692, 68696,
- 68700, 68703, 68707, 68711, 68714, 68718, 68722, 68726, 68729, 68733,
- 68737, 68741, 68745, 68749, 68753, 68757, 68761, 68765, 68769, 68773,
- 68777, 68781, 68785, 68788, 68792, 68796, 68800, 68804, 68808, 68812,
- 68816, 68820, 68824, 68827, 68830, 68834, 68838, 68842, 68845, 68848,
- 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, 68884, 68888,
- 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, 68924, 68928,
- 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, 68964, 68968,
- 68972, 68976, 68980, 68984, 68988, 68992, 68996, 68999, 69003, 69007,
- 69011, 69015, 69019, 69023, 69027, 69031, 69035, 69039, 69043, 69047,
- 69051, 69055, 69059, 69063, 69067, 69071, 69075, 69079, 69083, 69087,
- 69091, 69095, 69099, 69103, 69107, 69111, 69115, 69119, 69123, 69127,
- 69131, 69135, 69139, 69143, 69146, 69150, 69154, 69158, 69162, 69166,
- 69170, 69174, 69178, 69182, 69186, 69190, 69194, 69198, 69202, 69206,
- 69210, 69213, 69217, 69221, 69225, 69229, 69233, 69237, 69241, 69245,
- 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277, 69281, 69285,
- 69289, 69293, 69297, 69300, 69304, 69308, 69312, 69316, 69320, 69324,
- 69328, 69332, 69336, 69340, 69344, 69348, 69352, 69356, 69360, 69364,
- 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396, 69400, 69404,
- 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, 69440, 69444,
- 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69475, 69480, 69484,
- 69490, 69495, 69501, 69505, 69509, 69513, 69517, 69521, 69525, 69529,
- 69533, 69537, 69541, 69545, 69549, 69553, 69557, 69560, 69563, 69566,
- 69569, 69572, 69575, 69578, 69581, 69584, 69589, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69595, 69600, 69605, 69610, 69615,
- 69622, 69629, 69634, 69639, 69644, 69649, 69656, 69663, 69670, 69677,
- 69684, 69691, 69701, 69711, 69718, 69725, 69732, 69739, 69745, 69751,
- 69760, 69769, 69776, 69783, 69794, 69805, 69810, 69815, 69822, 69829,
- 69836, 69843, 69850, 69857, 69864, 69871, 69877, 69883, 69889, 69895,
- 69902, 69909, 69914, 69918, 69925, 69932, 69939, 0, 0, 0, 0, 0, 0, 0, 0,
- 69943, 69947, 69951, 69954, 69957, 69962, 69967, 69972, 69977, 69982,
- 69987, 69992, 69997, 70002, 70007, 70016, 70025, 70030, 70035, 70040,
- 70045, 70050, 70055, 70060, 70065, 70070, 70075, 70080, 0, 0, 0, 0, 0, 0,
- 0, 0, 70085, 70088, 70091, 70094, 70098, 70102, 70106, 70110, 70113,
- 70117, 70120, 70124, 70127, 70131, 70135, 70139, 70143, 70147, 70151,
- 70155, 70158, 70162, 70166, 70170, 70174, 70178, 70182, 70186, 70190,
- 70194, 70198, 70202, 70206, 70210, 70214, 70217, 70221, 70225, 70229,
- 70233, 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269,
- 70273, 70277, 70281, 70285, 70289, 70293, 70297, 70301, 70305, 70309,
- 70313, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70347,
- 70351, 70355, 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387,
- 70391, 70395, 70400, 70405, 70408, 70413, 70416, 70419, 70422, 0, 0, 0,
- 0, 0, 0, 0, 0, 70426, 70435, 70444, 70453, 70462, 70471, 70480, 70489,
- 70498, 70506, 70513, 70521, 70528, 70536, 70546, 70555, 70565, 70574,
- 70584, 70592, 70599, 70607, 70614, 70622, 70627, 70632, 70637, 70646,
- 70652, 70658, 70665, 70674, 70682, 70690, 70698, 70705, 70712, 70719,
- 70726, 70731, 70736, 70741, 70746, 70751, 70756, 70761, 70766, 70774,
- 70782, 70788, 70793, 70798, 70803, 70808, 70813, 70818, 70823, 70828,
- 70833, 70841, 70849, 70854, 70859, 70869, 70879, 70886, 70893, 70902,
- 70911, 70923, 70935, 70941, 70947, 70955, 70963, 70973, 70983, 70990,
- 70997, 71002, 71007, 71019, 71031, 71039, 71047, 71057, 71067, 71079,
- 71091, 71100, 71109, 71116, 71123, 71130, 71137, 71146, 71155, 71160,
- 71165, 71172, 71179, 71186, 71193, 71205, 71217, 71222, 71227, 71232,
- 71237, 71242, 71247, 71252, 71257, 71261, 71266, 71271, 71276, 71281,
- 71286, 71292, 71297, 71302, 71309, 71316, 71323, 71330, 71337, 71346,
- 71355, 71361, 71367, 71373, 71379, 71385, 71391, 71398, 71405, 71412,
- 71416, 71423, 71428, 71433, 71440, 0, 71453, 71461, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 71469, 71478, 71487, 71496, 71505, 71514, 71523,
- 71532, 71541, 71550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 75532, 75537, 75542, 75547, 75554, 75561, 75565, 75569, 75574, 75579,
+ 75584, 75589, 75594, 75599, 75604, 75609, 75614, 75620, 75626, 75632,
+ 75638, 75644, 75648, 75654, 75658, 75664, 75671, 75677, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 75681, 75685, 75689, 75693, 75697, 75701, 0, 0, 75705, 75709,
+ 75713, 75717, 75721, 75725, 0, 0, 75729, 75733, 75737, 75741, 75745,
+ 75749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75753, 75757, 75761, 75765, 75769,
+ 75773, 75777, 0, 75781, 75785, 75789, 75793, 75797, 75801, 75805, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71559, 71566, 71574, 71582,
- 71589, 71597, 71604, 71610, 71616, 71623, 71629, 71635, 71641, 71648,
- 71655, 71662, 71669, 71676, 71683, 71690, 71697, 71704, 71711, 71718,
- 71725, 71732, 71739, 71745, 71752, 71759, 71766, 71773, 71780, 71787,
- 71794, 71801, 71808, 71815, 71822, 71829, 71836, 71843, 71850, 71857,
- 71864, 71871, 71879, 71887, 71895, 71903, 0, 0, 0, 0, 71911, 71920,
- 71929, 71938, 71947, 71956, 71965, 71972, 71979, 71986, 0, 0, 0, 0, 0, 0,
- 71993, 71997, 72002, 72007, 72012, 72017, 72022, 72027, 72032, 72037,
- 72042, 72047, 72051, 72055, 72060, 72065, 72069, 72074, 72079, 72084,
- 72089, 72094, 72099, 72104, 72108, 72112, 72117, 72122, 72127, 72131,
- 72135, 72139, 72143, 72147, 72151, 72156, 72161, 72166, 72171, 72176,
- 72183, 72189, 72194, 72199, 72204, 72209, 72215, 72222, 72228, 72235,
- 72241, 72247, 72252, 72259, 72265, 72270, 0, 0, 0, 0, 0, 0, 0, 0, 72276,
- 72280, 72284, 72287, 72291, 72294, 72298, 72301, 72305, 72309, 72314,
- 72318, 72323, 72326, 72330, 72334, 72337, 72341, 72345, 72348, 72352,
- 72356, 72360, 72364, 72368, 72372, 72376, 72380, 72384, 72388, 72392,
- 72396, 72400, 72404, 72408, 72412, 72416, 72420, 72423, 72426, 72430,
- 72434, 72438, 72441, 72444, 72447, 72451, 72455, 72459, 72463, 72467,
- 72470, 72474, 72480, 72485, 72489, 72494, 72498, 72503, 72508, 72514,
- 72519, 72525, 72529, 72534, 72539, 72543, 72548, 72553, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 72557, 72560, 72564, 72568, 72571, 72574, 72577, 72580, 72583,
- 72586, 72589, 72592, 0, 0, 0, 0, 0, 0, 72595, 72600, 72604, 72608, 72612,
- 72616, 72620, 72624, 72628, 72632, 72636, 72640, 72644, 72648, 72652,
- 72656, 72660, 72665, 72670, 72676, 72682, 72689, 72694, 72699, 72705,
- 72709, 72714, 72717, 0, 0, 0, 0, 72720, 72727, 72733, 72739, 72745,
- 72751, 72757, 72763, 72769, 72775, 72781, 72787, 72794, 72801, 72808,
- 72815, 72822, 72829, 72836, 72843, 72850, 72856, 72862, 72869, 72875,
- 72882, 72889, 72895, 72901, 72908, 72915, 72922, 72928, 72935, 72942,
- 72948, 72955, 72961, 72968, 72975, 72981, 72987, 72994, 73000, 73007,
- 73014, 73023, 73030, 73037, 73041, 73046, 73051, 73056, 73061, 73065,
- 73069, 73074, 73078, 73083, 73088, 73093, 73098, 73102, 73107, 73111,
- 73116, 73120, 73125, 73130, 73135, 73140, 73144, 73149, 73154, 73159,
- 73165, 73170, 73176, 73182, 73188, 73195, 73201, 73207, 73214, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73218, 73223, 73227, 73231, 73235, 73239, 73243,
- 73247, 73251, 73255, 73259, 73263, 73267, 73271, 73275, 73279, 73283,
- 73287, 73291, 73295, 73299, 73303, 73307, 73311, 73315, 73319, 73323,
- 73327, 73331, 73335, 0, 0, 0, 73339, 73343, 73347, 73351, 73355, 73358,
- 73364, 73367, 73371, 73374, 73380, 73386, 73394, 73397, 73401, 73404,
- 73407, 73413, 73419, 73423, 73429, 73433, 73437, 73443, 73447, 73453,
- 73459, 73463, 73467, 73473, 73477, 73483, 73489, 73493, 73499, 73503,
- 73509, 73512, 73515, 73521, 73525, 73531, 73534, 73537, 73540, 73546,
- 73550, 73554, 73560, 73566, 73570, 73573, 73579, 73584, 73589, 73594,
- 73601, 73606, 73613, 73618, 73625, 73630, 73636, 73642, 73648, 73651,
- 73655, 73659, 73664, 73669, 73674, 73679, 73684, 73689, 73694, 73699,
- 73706, 73711, 0, 73718, 73721, 73725, 73728, 73731, 73734, 73737, 73740,
- 73743, 73746, 73749, 0, 0, 0, 0, 73752, 73759, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 73764, 73767, 73770, 73773, 73776, 73780, 73783, 73786, 73790, 73794,
- 73798, 73802, 73806, 73810, 73814, 73818, 73822, 73826, 73830, 73834,
- 73838, 73842, 73846, 73850, 73854, 73857, 73861, 73864, 73868, 73872,
- 73876, 73880, 73884, 73887, 73891, 73894, 73897, 73901, 73905, 73909,
- 73913, 73916, 73921, 73925, 73930, 73935, 73939, 73944, 73948, 73953,
- 73958, 73963, 73968, 73973, 73979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73985,
- 73990, 73995, 74000, 74007, 74012, 74017, 74021, 74026, 74031, 74035,
- 74039, 74044, 74050, 0, 0, 74057, 74061, 74064, 74067, 74070, 74073,
- 74076, 74079, 74082, 74085, 0, 0, 74088, 74093, 74098, 74104, 74111,
- 74117, 74123, 74129, 74135, 74141, 74147, 74153, 74159, 74165, 74171,
- 74177, 74182, 74188, 74193, 74199, 74205, 74212, 74218, 74224, 74229,
- 74236, 74243, 74250, 74256, 74261, 74266, 74271, 0, 0, 0, 0, 74279,
- 74285, 74291, 74297, 74303, 74309, 74315, 74321, 74327, 74333, 74339,
- 74345, 74351, 74357, 74363, 74369, 74375, 74381, 74387, 74393, 74399,
- 74404, 74409, 74415, 74421, 74427, 74433, 74439, 74445, 74451, 74457,
- 74463, 74469, 74475, 74481, 74487, 74493, 74499, 74505, 74511, 74517,
- 74523, 74529, 74535, 74541, 74547, 74553, 74558, 74563, 74569, 74574,
- 74578, 74583, 74587, 74591, 74595, 74601, 74606, 74611, 74616, 74621,
- 74626, 74631, 74636, 74643, 74650, 74657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74664, 74669, 74674, 74679,
- 74686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74693, 74697, 74701, 74705, 74709,
- 74713, 0, 0, 74717, 74721, 74725, 74729, 74733, 74737, 0, 0, 74741,
- 74745, 74749, 74753, 74757, 74761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74765,
- 74769, 74773, 74777, 74781, 74785, 74789, 0, 74793, 74797, 74801, 74805,
- 74809, 74813, 74817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 75809, 75814, 75819, 75824, 75829, 75833, 75837, 75842, 75847, 75852,
+ 75857, 75862, 75867, 75872, 75877, 75882, 75886, 75891, 75896, 75901,
+ 75906, 75911, 75916, 75921, 75926, 75931, 75936, 75941, 75948, 75955,
+ 75962, 75969, 75976, 75983, 75990, 75997, 76003, 76009, 76015, 76021,
+ 76027, 76033, 76039, 76045, 76049, 76055, 0, 0, 76061, 76066, 76070,
+ 76074, 76078, 76082, 76086, 76090, 76094, 76098, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76102,
+ 76106, 76110, 76114, 76118, 76122, 76126, 76130, 76134, 76138, 76142,
+ 76146, 76150, 76154, 76158, 76162, 76166, 76170, 76174, 76178, 76182,
+ 76186, 76190, 0, 0, 0, 0, 76194, 76198, 76202, 76206, 76210, 76214,
+ 76218, 76222, 76226, 76230, 76234, 76238, 76242, 76246, 76250, 76254,
+ 76258, 76262, 76266, 76270, 76274, 76278, 76282, 76286, 76290, 76294,
+ 76298, 76302, 76306, 76310, 76314, 76318, 76322, 76326, 76330, 76334,
+ 76338, 76342, 76346, 76350, 76354, 76358, 76362, 76366, 76370, 76374,
+ 76378, 76382, 76386, 0, 0, 0, 0, 76390, 76394, 76398, 76402, 76406,
+ 76410, 76414, 76418, 76422, 76426, 76430, 76434, 76438, 76442, 76446,
+ 76450, 76454, 76458, 76462, 76466, 76470, 76474, 76478, 76482, 76486,
+ 76490, 76494, 76498, 76502, 76506, 76510, 76514, 76518, 76522, 76526,
+ 76530, 76534, 76538, 76542, 76546, 76550, 76554, 76558, 76562, 76566,
+ 76570, 76574, 76578, 76582, 76586, 76590, 76594, 76598, 76602, 76606,
+ 76610, 76614, 76618, 76622, 76626, 76630, 76634, 76638, 76642, 76646,
+ 76650, 76654, 76658, 76662, 76666, 76670, 76674, 76678, 76682, 76686,
+ 76690, 76694, 76698, 76702, 76706, 76710, 76714, 76718, 76722, 76726,
+ 76730, 76734, 76738, 76742, 76746, 76750, 76754, 76758, 76762, 76766,
+ 76770, 76774, 76778, 76782, 76786, 76790, 76794, 76798, 76802, 76806,
+ 76810, 76814, 76818, 76822, 76826, 76830, 76834, 76838, 76842, 76846,
+ 76850, 76854, 76858, 76862, 76866, 76870, 76874, 76878, 76882, 76886,
+ 76890, 76894, 76898, 76902, 76906, 76910, 76914, 76918, 76922, 76926,
+ 76930, 76934, 76938, 76942, 76946, 76950, 76954, 76958, 76962, 76966,
+ 76970, 76974, 76978, 76982, 76986, 76990, 76994, 76998, 77002, 77006,
+ 77010, 77014, 77018, 77022, 77026, 77030, 77034, 77038, 77042, 77046,
+ 77050, 77054, 77058, 77062, 77066, 77070, 77074, 77078, 77082, 77086,
+ 77090, 77094, 77098, 77102, 77106, 77110, 77114, 77118, 77122, 77126,
+ 77130, 77134, 77138, 77142, 77146, 77150, 77154, 77158, 77162, 77166,
+ 77170, 77174, 77178, 77182, 77186, 77190, 77194, 77198, 77202, 77206,
+ 77210, 77214, 77218, 77222, 77226, 77230, 77234, 77238, 77242, 77246,
+ 77250, 77254, 77258, 77262, 77266, 77270, 77274, 77278, 77282, 77286,
+ 77290, 77294, 77298, 77302, 77306, 77310, 77314, 77318, 77322, 77326,
+ 77330, 77334, 77338, 77342, 77346, 77350, 77354, 77358, 77362, 77366,
+ 77370, 77374, 77378, 77382, 77386, 77390, 77394, 77398, 77402, 77406,
+ 77410, 77414, 77418, 77422, 77426, 77430, 77434, 77438, 77442, 77446,
+ 77450, 77454, 77458, 77462, 77466, 77470, 77474, 77478, 77482, 77486,
+ 77490, 77494, 77498, 77502, 77506, 77510, 77514, 77518, 77522, 77526,
+ 77530, 77534, 77538, 77542, 77546, 77550, 77554, 77558, 77562, 77566,
+ 77570, 77574, 77578, 77582, 77586, 77590, 77594, 77598, 77602, 77606,
+ 77610, 77614, 77618, 77622, 77626, 77630, 77634, 77638, 77642, 77646,
+ 77650, 77654, 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686,
+ 77690, 77694, 77698, 77702, 77706, 77710, 77714, 77718, 77722, 77726,
+ 77730, 77734, 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77766,
+ 77770, 77774, 77778, 77782, 77786, 77790, 77794, 77798, 77802, 77806,
+ 77810, 77814, 77818, 77822, 77826, 77830, 77834, 77838, 77842, 77846,
+ 77850, 0, 0, 77854, 77858, 77862, 77866, 77870, 77874, 77878, 77882,
+ 77886, 77890, 77894, 77898, 77902, 77906, 77910, 77914, 77918, 77922,
+ 77926, 77930, 77934, 77938, 77942, 77946, 77950, 77954, 77958, 77962,
+ 77966, 77970, 77974, 77978, 77982, 77986, 77990, 77994, 77998, 78002,
+ 78006, 78010, 78014, 78018, 78022, 78026, 78030, 78034, 78038, 78042,
+ 78046, 78050, 78054, 78058, 78062, 78066, 78070, 78074, 78078, 78082,
+ 78086, 78090, 78094, 78098, 78102, 78106, 78110, 78114, 78118, 78122,
+ 78126, 78130, 78134, 78138, 78142, 78146, 78150, 78154, 78158, 78162,
+ 78166, 78170, 78174, 78178, 78182, 78186, 78190, 78194, 78198, 78202,
+ 78206, 78210, 78214, 78218, 78222, 78226, 78230, 78234, 78238, 78242,
+ 78246, 78250, 78254, 78258, 78262, 78266, 78270, 78274, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78278, 78283, 78288, 78293, 78298, 78303, 78311,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78316, 78323, 78330, 78337, 78344, 0,
+ 0, 0, 0, 0, 78351, 78358, 78365, 78375, 78381, 78387, 78393, 78399,
+ 78405, 78411, 78418, 78424, 78430, 78436, 78445, 78454, 78466, 78478,
+ 78484, 78490, 78496, 78503, 78510, 78517, 78524, 78531, 0, 78538, 78545,
+ 78552, 78560, 78567, 0, 78574, 0, 78581, 78588, 0, 78595, 78603, 0,
+ 78610, 78617, 78624, 78631, 78638, 78645, 78652, 78659, 78666, 78673,
+ 78678, 78685, 78692, 78698, 78704, 78710, 78716, 78722, 78728, 78734,
+ 78740, 78746, 78752, 78758, 78764, 78770, 78776, 78782, 78788, 78794,
+ 78800, 78806, 78812, 78818, 78824, 78830, 78836, 78842, 78848, 78854,
+ 78860, 78866, 78872, 78878, 78884, 78890, 78896, 78902, 78908, 78914,
+ 78920, 78926, 78932, 78938, 78944, 78950, 78956, 78962, 78968, 78974,
+ 78980, 78986, 78992, 78998, 79004, 79010, 79016, 79022, 79028, 79034,
+ 79040, 79046, 79052, 79058, 79064, 79070, 79076, 79082, 79088, 79094,
+ 79100, 79106, 79112, 79118, 79124, 79130, 79136, 79142, 79148, 79156,
+ 79164, 79170, 79176, 79182, 79188, 79197, 79206, 79214, 79222, 79230,
+ 79238, 79246, 79254, 79262, 79270, 79277, 79284, 79294, 79304, 79308,
+ 79312, 79317, 79322, 79327, 79332, 79341, 79350, 79356, 79362, 79369,
+ 79376, 79383, 79387, 79393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 79399, 79405, 79411, 79417, 79423, 79428, 79433, 79439, 79445,
+ 79451, 79457, 79465, 79471, 79477, 79485, 79493, 79501, 79509, 79514,
+ 79519, 79524, 79529, 79542, 79555, 79565, 79575, 79586, 79597, 79608,
+ 79619, 79629, 79639, 79650, 79661, 79672, 79683, 79693, 79703, 79713,
+ 79729, 79745, 79761, 79768, 79775, 79782, 79789, 79799, 79809, 79819,
+ 79831, 79841, 79849, 79857, 79866, 79874, 79884, 79892, 79900, 79908,
+ 79917, 79925, 79935, 79943, 79951, 79959, 79969, 79977, 79984, 79991,
+ 79998, 80005, 80013, 80021, 80029, 80037, 80045, 80054, 80062, 80070,
+ 80078, 80086, 80094, 80103, 80111, 80119, 80127, 80135, 80143, 80151,
+ 80159, 80167, 80175, 80183, 80192, 80200, 80210, 80218, 80226, 80234,
+ 80244, 80252, 80260, 80268, 80276, 80285, 80294, 80302, 80312, 80320,
+ 80328, 80336, 80345, 80353, 80363, 80371, 80378, 80385, 80393, 80400,
+ 80409, 80416, 80424, 80432, 80441, 80449, 80459, 80467, 80475, 80483,
+ 80493, 80501, 80508, 80515, 80523, 80530, 80539, 80546, 80556, 80566,
+ 80577, 80586, 80595, 80604, 80613, 80622, 80632, 80643, 80654, 80664,
+ 80675, 80687, 80697, 80706, 80715, 80723, 80732, 80742, 80750, 80759,
+ 80768, 80776, 80785, 80795, 80803, 80812, 80821, 80829, 80838, 80848,
+ 80856, 80866, 80874, 80884, 80892, 80900, 80909, 80917, 80927, 80935,
+ 80943, 80953, 80961, 80968, 80975, 80984, 80993, 81001, 81010, 81020,
+ 81028, 81039, 81047, 81055, 81062, 81070, 81079, 81086, 81096, 81106,
+ 81117, 81127, 81138, 81146, 81154, 81163, 81171, 81180, 81188, 81196,
+ 81205, 81213, 81222, 81230, 81237, 81244, 81251, 81258, 81266, 81274,
+ 81282, 81290, 81299, 81307, 81315, 81324, 81332, 81340, 81348, 81357,
+ 81365, 81373, 81381, 81389, 81397, 81405, 81413, 81421, 81429, 81438,
+ 81446, 81454, 81462, 81470, 81478, 81487, 81496, 81504, 81512, 81520,
+ 81529, 81537, 81546, 81553, 81560, 81568, 81575, 81583, 81591, 81600,
+ 81608, 81617, 81625, 81633, 81643, 81650, 81657, 81665, 81672, 81680,
+ 81690, 81701, 81709, 81718, 81726, 81735, 81743, 81752, 81760, 81769,
+ 81777, 81786, 81795, 81803, 81811, 81819, 81828, 81835, 81843, 81852,
+ 81861, 81870, 81880, 81888, 81898, 81906, 81916, 81924, 81934, 81942,
+ 81952, 81960, 81969, 81976, 81985, 81992, 82002, 82010, 82020, 82028,
+ 82038, 82046, 82054, 82062, 82071, 82079, 82088, 82097, 82106, 82115,
+ 82125, 82133, 82143, 82151, 82161, 82169, 82179, 82187, 82197, 82205,
+ 82214, 82221, 82230, 82237, 82247, 82255, 82265, 82273, 82283, 82291,
+ 82299, 82307, 82316, 82324, 82333, 82342, 82351, 82360, 82368, 82376,
+ 82385, 82393, 82402, 82411, 82419, 82427, 82435, 82444, 82452, 82460,
+ 82469, 82477, 82485, 82493, 82501, 82506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 82511, 82521, 82531, 82541, 82551, 82562, 82572, 82582,
+ 82593, 82602, 82611, 82620, 82631, 82641, 82651, 82663, 82673, 82683,
+ 82693, 82703, 82713, 82723, 82733, 82743, 82753, 82763, 82773, 82784,
+ 82795, 82805, 82815, 82827, 82838, 82849, 82859, 82869, 82879, 82889,
+ 82899, 82909, 82919, 82931, 82941, 82951, 82963, 82974, 82985, 82995,
+ 83005, 83015, 83025, 83037, 83047, 83057, 83068, 83079, 83089, 83099,
+ 83108, 83117, 83126, 83135, 83144, 83154, 0, 0, 83164, 83174, 83184,
+ 83194, 83204, 83216, 83226, 83236, 83248, 83258, 83270, 83279, 83288,
+ 83299, 83309, 83321, 83332, 83345, 83355, 83367, 83376, 83387, 83398,
+ 83411, 83421, 83431, 83441, 83451, 83461, 83470, 83479, 83488, 83497,
+ 83507, 83517, 83527, 83537, 83547, 83557, 83567, 83577, 83587, 83597,
+ 83607, 83617, 83626, 83635, 83644, 83654, 83664, 83674, 83684, 83694,
+ 83705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83715, 83730,
+ 83745, 83751, 83757, 83763, 83769, 83775, 83781, 83787, 83793, 83801,
+ 83805, 83808, 0, 0, 83816, 83819, 83822, 83825, 83828, 83831, 83834,
+ 83837, 83840, 83843, 83846, 83849, 83852, 83855, 83858, 83861, 83864,
+ 83872, 83881, 83892, 83900, 83908, 83917, 83926, 83937, 83949, 0, 0, 0,
+ 0, 0, 0, 83958, 83963, 83968, 83975, 83982, 83988, 83994, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83999, 84009, 84019, 84029, 84038, 84049, 84058, 84067,
+ 84077, 84087, 84099, 84111, 84122, 84133, 84144, 84155, 84165, 84175,
+ 84185, 84195, 84206, 84217, 84221, 84226, 84235, 84244, 84248, 84252,
+ 84256, 84261, 84266, 84271, 84276, 84279, 84283, 0, 84288, 84291, 84294,
+ 84298, 84302, 84307, 84311, 84315, 84320, 84325, 84332, 84339, 84342,
+ 84345, 84348, 84351, 84354, 84358, 84362, 0, 84366, 84371, 84375, 84379,
+ 0, 0, 0, 0, 84384, 84389, 84396, 84401, 84406, 0, 84411, 84416, 84421,
+ 84426, 84431, 84436, 84441, 84446, 84451, 84456, 84461, 84466, 84475,
+ 84484, 84492, 84500, 84509, 84518, 84527, 84536, 84544, 84552, 84560,
+ 84568, 84573, 84578, 84584, 84590, 84596, 84602, 84610, 84618, 84624,
+ 84630, 84636, 84642, 84648, 84654, 84660, 84666, 84671, 84676, 84681,
+ 84686, 84691, 84696, 84701, 84706, 84712, 84718, 84724, 84730, 84736,
+ 84742, 84748, 84754, 84760, 84766, 84772, 84778, 84784, 84790, 84796,
+ 84802, 84808, 84814, 84820, 84826, 84832, 84838, 84844, 84850, 84856,
+ 84862, 84868, 84874, 84880, 84886, 84892, 84898, 84904, 84910, 84916,
+ 84922, 84928, 84934, 84940, 84946, 84952, 84958, 84964, 84970, 84976,
+ 84982, 84988, 84994, 85000, 85006, 85012, 85018, 85024, 85030, 85036,
+ 85042, 85048, 85054, 85060, 85066, 85071, 85076, 85081, 85086, 85092,
+ 85098, 85104, 85110, 85116, 85122, 85128, 85134, 85140, 85146, 85153,
+ 85160, 85165, 85170, 85175, 85180, 85192, 85204, 85215, 85226, 85238,
+ 85250, 85258, 0, 0, 85266, 0, 85274, 85278, 85282, 85285, 85289, 85293,
+ 85296, 85299, 85303, 85307, 85310, 85313, 85316, 85319, 85324, 85327,
+ 85331, 85334, 85337, 85340, 85343, 85346, 85349, 85352, 85355, 85358,
+ 85361, 85364, 85368, 85372, 85376, 85380, 85385, 85390, 85396, 85402,
+ 85408, 85413, 85419, 85425, 85431, 85436, 85442, 85448, 85453, 85458,
+ 85464, 85469, 85475, 85481, 85486, 85492, 85498, 85503, 85509, 85515,
+ 85521, 85527, 85533, 85537, 85542, 85546, 85551, 85555, 85560, 85565,
+ 85571, 85577, 85583, 85588, 85594, 85600, 85606, 85611, 85617, 85623,
+ 85628, 85633, 85639, 85644, 85650, 85656, 85661, 85667, 85673, 85678,
+ 85684, 85690, 85696, 85702, 85708, 85713, 85717, 85722, 85724, 85729,
+ 85734, 85740, 85745, 85750, 85754, 85760, 85765, 85770, 85775, 85780,
+ 85785, 85790, 85795, 85801, 85807, 85813, 85821, 85825, 85829, 85833,
+ 85837, 85841, 85845, 85850, 85855, 85860, 85865, 85869, 85874, 85879,
+ 85884, 85889, 85894, 85899, 85904, 85909, 85913, 85917, 85922, 85927,
+ 85932, 85937, 85941, 85946, 85951, 85956, 85961, 85965, 85970, 85975,
+ 85980, 85985, 85989, 85994, 85999, 86003, 86008, 86013, 86018, 86023,
+ 86028, 86033, 86040, 86047, 86051, 86056, 86061, 86066, 86071, 86076,
+ 86081, 86086, 86091, 86096, 86101, 86106, 86111, 86116, 86121, 86126,
+ 86131, 86136, 86141, 86146, 86151, 86156, 86161, 86166, 86171, 86176,
+ 86181, 86186, 86191, 86196, 0, 0, 0, 86201, 86205, 86210, 86214, 86219,
+ 86224, 0, 0, 86228, 86233, 86238, 86242, 86247, 86252, 0, 0, 86257,
+ 86262, 86266, 86271, 86276, 86281, 0, 0, 86286, 86291, 86296, 0, 0, 0,
+ 86300, 86304, 86308, 86312, 86315, 86319, 86323, 0, 86327, 86333, 86336,
+ 86340, 86343, 86347, 86351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86355, 86361,
+ 86367, 86373, 86379, 0, 0, 86383, 86389, 86395, 86401, 86407, 86413,
+ 86420, 86427, 86434, 86441, 86448, 86455, 0, 86462, 86469, 86476, 86482,
+ 86489, 86496, 86503, 86510, 86516, 86523, 86530, 86537, 86544, 86550,
+ 86557, 86564, 86571, 86578, 86584, 86591, 86598, 86605, 86612, 86619,
+ 86626, 86633, 0, 86640, 86646, 86653, 86660, 86667, 86674, 86680, 86687,
+ 86694, 86701, 86708, 86715, 86722, 86729, 86735, 86742, 86749, 86756,
+ 86763, 0, 86770, 86777, 0, 86784, 86791, 86798, 86805, 86812, 86819,
+ 86826, 86833, 86840, 86847, 86854, 86861, 86868, 86875, 86882, 0, 0,
+ 86888, 86893, 86898, 86903, 86908, 86913, 86918, 86923, 86928, 86933,
+ 86938, 86943, 86948, 86953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86958, 86965,
+ 86972, 86979, 86986, 86993, 87000, 87007, 87014, 87021, 87028, 87035,
+ 87042, 87049, 87056, 87063, 87070, 87077, 87084, 87091, 87099, 87107,
+ 87114, 87121, 87126, 87134, 87142, 87149, 87156, 87161, 87168, 87173,
+ 87178, 87185, 87190, 87195, 87200, 87208, 87213, 87218, 87225, 87230,
+ 87235, 87242, 87249, 87254, 87259, 87264, 87269, 87274, 87279, 87284,
+ 87289, 87294, 87301, 87306, 87313, 87318, 87323, 87328, 87333, 87338,
+ 87343, 87348, 87353, 87358, 87363, 87368, 87375, 87382, 87389, 87396,
+ 87402, 87407, 87414, 87419, 87424, 87433, 87440, 87449, 87456, 87461,
+ 87466, 87474, 87479, 87484, 87489, 87494, 87499, 87506, 87511, 87516,
+ 87521, 87526, 87531, 87538, 87545, 87552, 87559, 87566, 87573, 87580,
+ 87587, 87594, 87601, 87608, 87615, 87622, 87629, 87636, 87643, 87650,
+ 87657, 87664, 87671, 87678, 87685, 87692, 87699, 87706, 87713, 87720,
+ 87727, 0, 0, 0, 0, 0, 87734, 87742, 87750, 0, 0, 0, 0, 87755, 87759,
+ 87763, 87767, 87771, 87775, 87779, 87783, 87787, 87791, 87796, 87801,
+ 87806, 87811, 87816, 87821, 87826, 87831, 87836, 87842, 87848, 87854,
+ 87861, 87868, 87875, 87882, 87889, 87896, 87902, 87908, 87914, 87921,
+ 87928, 87935, 87942, 87949, 87956, 87963, 87970, 87977, 87984, 87991,
+ 87998, 88005, 88012, 0, 0, 0, 88019, 88027, 88035, 88043, 88051, 88059,
+ 88069, 88079, 88087, 88095, 88103, 88111, 88119, 88125, 88132, 88141,
+ 88150, 88159, 88168, 88177, 88186, 88196, 88207, 88217, 88228, 88237,
+ 88246, 88255, 88265, 88276, 88286, 88297, 88308, 88317, 88325, 88331,
+ 88337, 88343, 88349, 88357, 88365, 88371, 88378, 88388, 88395, 88402,
+ 88409, 88416, 88423, 88433, 88440, 88447, 88455, 88463, 88472, 88481,
+ 88490, 88499, 88508, 88516, 88525, 88534, 88543, 88547, 88554, 88559,
+ 88564, 88568, 88572, 88576, 88580, 88585, 88590, 88596, 88602, 88606,
+ 88612, 88616, 88620, 88624, 88628, 88632, 88636, 88642, 0, 0, 0, 0, 0,
+ 88646, 88651, 88656, 88661, 88666, 88673, 88678, 88683, 88688, 88693,
+ 88698, 88703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88708, 88715, 88724, 88733, 88740, 88747, 88754,
+ 88761, 88768, 88775, 88781, 88788, 88795, 88802, 88809, 88816, 88823,
+ 88830, 88837, 88846, 88853, 88860, 88867, 88874, 88881, 88888, 88895,
+ 88902, 88911, 88918, 88925, 88932, 88939, 88946, 88953, 88962, 88969,
+ 88976, 88983, 88990, 88999, 89006, 89013, 89020, 89028, 89037, 0, 0,
+ 89046, 89050, 89054, 89059, 89064, 89069, 89074, 89078, 89083, 89088,
+ 89093, 89098, 89103, 89108, 89112, 89116, 89121, 89126, 89131, 89135,
+ 89140, 89145, 89149, 89154, 89159, 89164, 89169, 89174, 89179, 0, 0, 0,
+ 89184, 89188, 89193, 89198, 89202, 89207, 89211, 89216, 89221, 89226,
+ 89231, 89235, 89239, 89244, 89249, 89254, 89259, 89264, 89269, 89273,
+ 89278, 89283, 89288, 89293, 89298, 89303, 89307, 89311, 89316, 89321,
+ 89326, 89331, 89336, 89341, 89346, 89351, 89356, 89361, 89366, 89371,
+ 89376, 89381, 89386, 89391, 89396, 89401, 89406, 89411, 89416, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89421, 89425,
+ 89430, 89435, 89440, 89444, 89449, 89454, 89459, 89464, 89468, 89472,
+ 89477, 89482, 89487, 89492, 89496, 89501, 89506, 89511, 89516, 89521,
+ 89526, 89530, 89535, 89540, 89545, 89550, 89555, 89560, 89565, 0, 89570,
+ 89575, 89580, 89586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89592, 89597,
+ 89602, 89607, 89612, 89617, 89622, 89627, 89632, 89637, 89642, 89647,
+ 89652, 89657, 89662, 89667, 89672, 89677, 89682, 89687, 89692, 89697,
+ 89702, 89707, 89712, 89717, 89722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89729, 89734, 89739,
+ 89744, 89749, 89754, 89759, 89764, 89769, 89774, 89779, 89784, 89789,
+ 89794, 89799, 89804, 89809, 89814, 89819, 89824, 89829, 89834, 89839,
+ 89844, 89849, 89854, 89859, 89863, 89867, 89871, 0, 89876, 89882, 89887,
+ 89892, 89897, 89902, 89908, 89914, 89920, 89926, 89932, 89938, 89944,
+ 89950, 89956, 89962, 89968, 89974, 89980, 89985, 89991, 89997, 90002,
+ 90008, 90013, 90019, 90025, 90030, 90036, 90042, 90047, 90053, 90059,
+ 90064, 90070, 90076, 90082, 0, 0, 0, 0, 90087, 90093, 90099, 90105,
+ 90111, 90117, 90123, 90129, 90135, 90142, 90147, 90152, 90158, 90164, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90170, 90175, 90180,
+ 90185, 90191, 90196, 90202, 90208, 90214, 90220, 90227, 90233, 90240,
+ 90245, 90250, 90255, 90260, 90265, 90270, 90275, 90280, 90285, 90290,
+ 90295, 90300, 90305, 90310, 90315, 90320, 90325, 90330, 90335, 90340,
+ 90345, 90350, 90355, 90360, 90365, 90370, 90375, 90380, 90385, 90390,
+ 90395, 90401, 90406, 90412, 90418, 90424, 90430, 90437, 90443, 90450,
+ 90455, 90460, 90465, 90470, 90475, 90480, 90485, 90490, 90495, 90500,
+ 90505, 90510, 90515, 90520, 90525, 90530, 90535, 90540, 90545, 90550,
+ 90555, 90560, 90565, 90570, 90575, 90580, 90585, 90590, 90595, 90600,
+ 90605, 90610, 90615, 90620, 90625, 90630, 90635, 90640, 90645, 90650,
+ 90655, 90660, 90665, 90670, 90675, 90680, 90685, 90690, 90695, 90700,
+ 90705, 90710, 90715, 90720, 90725, 90730, 90735, 90740, 90745, 90750,
+ 90755, 90760, 90765, 90770, 90775, 90780, 90785, 90790, 90795, 90800,
+ 90805, 90810, 90815, 90820, 90825, 90830, 90835, 90840, 90845, 90850,
+ 90855, 90860, 90865, 90869, 90873, 90878, 90883, 90888, 90893, 90898,
+ 90903, 90908, 90913, 90918, 90923, 90928, 90932, 90936, 90940, 90944,
+ 90948, 90952, 90956, 90961, 90966, 0, 0, 90971, 90976, 90980, 90984,
+ 90988, 90992, 90996, 91000, 91004, 91008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 74821, 74828, 74835, 74842, 74849, 74855, 74861,
- 74868, 74875, 74882, 74889, 74896, 74903, 74910, 74917, 74924, 74930,
- 74937, 74944, 74951, 74958, 74965, 74972, 74979, 74986, 74993, 75000,
- 75007, 75016, 75025, 75034, 75043, 75052, 75061, 75070, 75079, 75087,
- 75095, 75103, 75111, 75119, 75127, 75135, 75143, 75149, 75157, 0, 0,
- 75165, 75172, 75178, 75184, 75190, 75196, 75202, 75208, 75214, 75220, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 75226, 75230, 75234, 75238, 75242, 75246, 75250, 75254,
- 75258, 75262, 75266, 75270, 75274, 75278, 75282, 75286, 75290, 75294,
- 75298, 75302, 75306, 75310, 75314, 0, 0, 0, 0, 75318, 75322, 75326,
- 75330, 75334, 75338, 75342, 75346, 75350, 75354, 75358, 75362, 75366,
- 75370, 75374, 75378, 75382, 75386, 75390, 75394, 75398, 75402, 75406,
- 75410, 75414, 75418, 75422, 75426, 75430, 75434, 75438, 75442, 75446,
- 75450, 75454, 75458, 75462, 75466, 75470, 75474, 75478, 75482, 75486,
- 75490, 75494, 75498, 75502, 75506, 75510, 0, 0, 0, 0, 75514, 75518,
- 75522, 75526, 75530, 75534, 75538, 75542, 75546, 75550, 75554, 75558,
- 75562, 75566, 75570, 75574, 75578, 75582, 75586, 75590, 75594, 75598,
- 75602, 75606, 75610, 75614, 75618, 75622, 75626, 75630, 75634, 75638,
- 75642, 75646, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678,
- 75682, 75686, 75690, 75694, 75698, 75702, 75706, 75710, 75714, 75718,
- 75722, 75726, 75730, 75734, 75738, 75742, 75746, 75750, 75754, 75758,
- 75762, 75766, 75770, 75774, 75778, 75782, 75786, 75790, 75794, 75798,
- 75802, 75806, 75810, 75814, 75818, 75822, 75826, 75830, 75834, 75838,
- 75842, 75846, 75850, 75854, 75858, 75862, 75866, 75870, 75874, 75878,
- 75882, 75886, 75890, 75894, 75898, 75902, 75906, 75910, 75914, 75918,
- 75922, 75926, 75930, 75934, 75938, 75942, 75946, 75950, 75954, 75958,
- 75962, 75966, 75970, 75974, 75978, 75982, 75986, 75990, 75994, 75998,
- 76002, 76006, 76010, 76014, 76018, 76022, 76026, 76030, 76034, 76038,
- 76042, 76046, 76050, 76054, 76058, 76062, 76066, 76070, 76074, 76078,
- 76082, 76086, 76090, 76094, 76098, 76102, 76106, 76110, 76114, 76118,
- 76122, 76126, 76130, 76134, 76138, 76142, 76146, 76150, 76154, 76158,
- 76162, 76166, 76170, 76174, 76178, 76182, 76186, 76190, 76194, 76198,
- 76202, 76206, 76210, 76214, 76218, 76222, 76226, 76230, 76234, 76238,
- 76242, 76246, 76250, 76254, 76258, 76262, 76266, 76270, 76274, 76278,
- 76282, 76286, 76290, 76294, 76298, 76302, 76306, 76310, 76314, 76318,
- 76322, 76326, 76330, 76334, 76338, 76342, 76346, 76350, 76354, 76358,
- 76362, 76366, 76370, 76374, 76378, 76382, 76386, 76390, 76394, 76398,
- 76402, 76406, 76410, 76414, 76418, 76422, 76426, 76430, 76434, 76438,
- 76442, 76446, 76450, 76454, 76458, 76462, 76466, 76470, 76474, 76478,
- 76482, 76486, 76490, 76494, 76498, 76502, 76506, 76510, 76514, 76518,
- 76522, 76526, 76530, 76534, 76538, 76542, 76546, 76550, 76554, 76558,
- 76562, 76566, 76570, 76574, 76578, 76582, 76586, 76590, 76594, 76598,
- 76602, 76606, 76610, 76614, 76618, 76622, 76626, 76630, 76634, 76638,
- 76642, 76646, 76650, 76654, 76658, 76662, 76666, 76670, 76674, 76678,
- 76682, 76686, 76690, 76694, 76698, 76702, 76706, 76710, 76714, 76718, 0,
- 0, 76722, 76726, 76730, 76734, 76738, 76742, 76746, 76750, 76754, 76758,
- 76762, 76766, 76770, 76774, 76778, 76782, 76786, 76790, 76794, 76798,
- 76802, 76806, 76810, 76814, 76818, 76822, 76826, 76830, 76834, 76838,
- 76842, 76846, 76850, 76854, 76858, 76862, 76866, 76870, 76874, 76878,
- 76882, 76886, 76890, 76894, 76898, 76902, 76906, 76910, 76914, 76918,
- 76922, 76926, 76930, 76934, 76938, 76942, 76946, 76950, 76954, 76958,
- 76962, 76966, 0, 0, 76970, 76974, 76978, 76982, 76986, 76990, 76994,
- 76998, 77002, 77006, 77010, 77014, 77018, 77022, 77026, 77030, 77034,
- 77038, 77042, 77046, 77050, 77054, 77058, 77062, 77066, 77070, 77074,
- 77078, 77082, 77086, 77090, 77094, 77098, 77102, 77106, 77110, 77114,
- 77118, 77122, 77126, 77130, 77134, 77138, 77142, 77146, 77150, 77154,
- 77158, 77162, 77166, 77170, 77174, 77178, 77182, 77186, 77190, 77194,
- 77198, 77202, 77206, 77210, 77214, 77218, 77222, 77226, 77230, 77234,
- 77238, 77242, 77246, 77250, 77254, 77258, 77262, 77266, 77270, 77274,
- 77278, 77282, 77286, 77290, 77294, 77298, 77302, 77306, 77310, 77314,
- 77318, 77322, 77326, 77330, 77334, 77338, 77342, 77346, 77350, 77354,
- 77358, 77362, 77366, 77370, 77374, 77378, 77382, 77386, 77390, 0, 0, 0,
+ 0, 0, 0, 0, 91012, 91016, 91020, 91024, 91028, 91032, 0, 0, 91037, 0,
+ 91042, 91046, 91051, 91056, 91061, 91066, 91071, 91076, 91081, 91086,
+ 91091, 91095, 91100, 91105, 91110, 91115, 91119, 91124, 91129, 91134,
+ 91139, 91143, 91148, 91153, 91158, 91163, 91167, 91172, 91177, 91182,
+ 91187, 91191, 91196, 91201, 91206, 91211, 91216, 91221, 91226, 91230,
+ 91235, 91240, 91245, 91250, 0, 91255, 91260, 0, 0, 0, 91265, 0, 0, 91270,
+ 91275, 91282, 91289, 91296, 91303, 91310, 91317, 91324, 91331, 91338,
+ 91345, 91352, 91359, 91366, 91373, 91380, 91387, 91394, 91401, 91408,
+ 91415, 91422, 0, 91429, 91436, 91442, 91448, 91454, 91461, 91468, 91476,
+ 91484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91493, 91498, 91503, 91508, 91513, 91518,
+ 91523, 91528, 91533, 91538, 91543, 91548, 91553, 91558, 91563, 91568,
+ 91573, 91578, 91583, 91588, 91593, 91598, 91603, 91607, 91612, 91617,
+ 91623, 91627, 0, 0, 0, 91631, 91637, 91641, 91646, 91651, 91656, 91660,
+ 91665, 91669, 91674, 91679, 91683, 91687, 91692, 91696, 91700, 91705,
+ 91710, 91714, 91719, 91724, 91729, 91734, 91739, 91744, 91749, 91754, 0,
+ 0, 0, 0, 0, 91759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77394, 77399, 77404, 77409, 77414,
- 77419, 77427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77432, 77439, 77446,
- 77453, 77460, 0, 0, 0, 0, 0, 77467, 77474, 77481, 77491, 77497, 77503,
- 77509, 77515, 77521, 77527, 77534, 77540, 77546, 77552, 77561, 77570,
- 77582, 77594, 77600, 77606, 77612, 77619, 77626, 77633, 77640, 77647, 0,
- 77654, 77661, 77668, 77676, 77683, 0, 77690, 0, 77697, 77704, 0, 77711,
- 77719, 0, 77726, 77733, 77740, 77747, 77754, 77761, 77768, 77775, 77782,
- 77789, 77794, 77801, 77808, 77814, 77820, 77826, 77832, 77838, 77844,
- 77850, 77856, 77862, 77868, 77874, 77880, 77886, 77892, 77898, 77904,
- 77910, 77916, 77922, 77928, 77934, 77940, 77946, 77952, 77958, 77964,
- 77970, 77976, 77982, 77988, 77994, 78000, 78006, 78012, 78018, 78024,
- 78030, 78036, 78042, 78048, 78054, 78060, 78066, 78072, 78078, 78084,
- 78090, 78096, 78102, 78108, 78114, 78120, 78126, 78132, 78138, 78144,
- 78150, 78156, 78162, 78168, 78174, 78180, 78186, 78192, 78198, 78204,
- 78210, 78216, 78222, 78228, 78234, 78240, 78246, 78252, 78258, 78264,
- 78272, 78280, 78286, 78292, 78298, 78304, 78313, 78322, 78330, 78338,
- 78346, 78354, 78362, 78370, 78378, 78386, 78393, 78400, 78410, 78420,
- 78424, 78428, 78433, 78438, 78443, 78448, 78457, 78466, 78472, 78478,
- 78485, 78492, 78499, 78503, 78509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 78515, 78521, 78527, 78533, 78539, 78544, 78549, 78555,
- 78561, 78567, 78573, 78581, 78587, 78593, 78601, 78609, 78617, 78625,
- 78630, 78635, 78640, 78645, 78657, 78669, 78679, 78689, 78700, 78711,
- 78722, 78733, 78743, 78753, 78764, 78775, 78786, 78797, 78807, 78817,
- 78827, 78842, 78857, 78872, 78879, 78886, 78893, 78900, 78910, 78920,
- 78930, 78941, 78951, 78959, 78967, 78976, 78984, 78993, 79001, 79009,
- 79017, 79026, 79034, 79043, 79051, 79059, 79067, 79076, 79084, 79091,
- 79098, 79105, 79112, 79120, 79128, 79136, 79144, 79152, 79161, 79169,
- 79177, 79185, 79193, 79201, 79210, 79218, 79226, 79234, 79242, 79250,
- 79258, 79266, 79274, 79282, 79290, 79299, 79307, 79316, 79324, 79332,
- 79340, 79349, 79357, 79365, 79373, 79381, 79390, 79399, 79407, 79416,
- 79424, 79432, 79440, 79449, 79457, 79466, 79474, 79481, 79488, 79496,
- 79503, 79511, 79518, 79526, 79534, 79543, 79551, 79560, 79568, 79576,
- 79584, 79593, 79601, 79608, 79615, 79623, 79630, 79638, 79645, 79655,
- 79665, 79675, 79684, 79693, 79702, 79711, 79720, 79730, 79741, 79752,
- 79762, 79773, 79784, 79794, 79803, 79812, 79820, 79829, 79838, 79846,
- 79855, 79864, 79872, 79881, 79890, 79898, 79907, 79916, 79924, 79933,
- 79942, 79950, 79959, 79967, 79976, 79984, 79992, 80001, 80009, 80018,
- 80026, 80034, 80043, 80051, 80058, 80065, 80074, 80083, 80091, 80100,
- 80109, 80117, 80127, 80135, 80143, 80150, 80158, 80166, 80173, 80183,
- 80193, 80204, 80214, 80225, 80233, 80241, 80250, 80258, 80267, 80275,
- 80283, 80292, 80300, 80309, 80317, 80324, 80331, 80338, 80345, 80353,
- 80361, 80369, 80377, 80386, 80394, 80402, 80411, 80419, 80427, 80435,
- 80444, 80452, 80460, 80468, 80476, 80484, 80492, 80500, 80508, 80516,
- 80525, 80533, 80541, 80549, 80557, 80565, 80574, 80583, 80591, 80599,
- 80607, 80616, 80624, 80633, 80640, 80647, 80655, 80662, 80670, 80678,
- 80687, 80695, 80704, 80712, 80720, 80730, 80737, 80744, 80752, 80759,
- 80767, 80777, 80788, 80796, 80805, 80813, 80822, 80830, 80839, 80847,
- 80856, 80864, 80873, 80882, 80890, 80898, 80906, 80915, 80922, 80930,
- 80939, 80948, 80957, 80966, 80974, 80983, 80991, 81000, 81008, 81017,
- 81025, 81034, 81042, 81050, 81057, 81065, 81072, 81081, 81089, 81098,
- 81106, 81115, 81123, 81131, 81139, 81148, 81156, 81165, 81174, 81183,
- 81192, 81201, 81209, 81218, 81226, 81235, 81243, 81252, 81260, 81269,
- 81277, 81285, 81292, 81300, 81307, 81316, 81324, 81333, 81341, 81350,
- 81358, 81366, 81374, 81383, 81391, 81400, 81409, 81418, 81427, 81435,
- 81443, 81452, 81460, 81469, 81478, 81486, 81494, 81502, 81511, 81519,
- 81527, 81536, 81544, 81552, 81560, 81568, 81573, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 81578, 81588, 81598, 81608, 81618, 81629, 81639,
- 81649, 81660, 81669, 81678, 81687, 81697, 81707, 81717, 81728, 81738,
- 81748, 81758, 81768, 81778, 81788, 81798, 81808, 81818, 81828, 81838,
- 81849, 81860, 81870, 81880, 81891, 81902, 81913, 81923, 81933, 81943,
- 81953, 81963, 81973, 81983, 81994, 82004, 82014, 82025, 82036, 82047,
- 82057, 82067, 82077, 82087, 82098, 82108, 82118, 82129, 82140, 82150,
- 82160, 82169, 82178, 82187, 82196, 82205, 82215, 0, 0, 82225, 82235,
- 82245, 82255, 82265, 82276, 82286, 82296, 82307, 82317, 82328, 82337,
- 82346, 82357, 82367, 82378, 82389, 82401, 82411, 82422, 82431, 82441,
- 82451, 82463, 82473, 82483, 82493, 82503, 82513, 82522, 82531, 82540,
- 82549, 82559, 82569, 82579, 82589, 82599, 82609, 82619, 82629, 82639,
- 82649, 82659, 82669, 82678, 82687, 82696, 82706, 82716, 82726, 82736,
- 82746, 82757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82767, 82782,
- 82797, 82803, 82809, 82815, 82821, 82827, 82833, 82839, 82845, 82853,
- 82857, 82860, 0, 0, 82868, 82871, 82874, 82877, 82880, 82883, 82886,
- 82889, 82892, 82895, 82898, 82901, 82904, 82907, 82910, 82913, 82916,
- 82924, 82933, 82944, 82952, 82960, 82969, 82978, 82989, 83001, 0, 0, 0,
- 0, 0, 0, 83010, 83015, 83020, 83027, 83034, 83040, 83046, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 83051, 83061, 83071, 83081, 83090, 83101, 83110, 83119,
- 83129, 83139, 83151, 83163, 83174, 83185, 83196, 83207, 83217, 83227,
- 83237, 83247, 83258, 83269, 83273, 83278, 83287, 83296, 83300, 83304,
- 83308, 83313, 83318, 83323, 83328, 83331, 83335, 0, 83340, 83343, 83346,
- 83350, 83354, 83359, 83363, 83367, 83372, 83377, 83384, 83391, 83394,
- 83397, 83400, 83403, 83406, 83410, 83414, 0, 83418, 83423, 83427, 83431,
- 0, 0, 0, 0, 83436, 83441, 83448, 83453, 83458, 0, 83463, 83468, 83473,
- 83478, 83483, 83488, 83493, 83498, 83503, 83508, 83513, 83518, 83527,
- 83536, 83544, 83552, 83561, 83570, 83579, 83588, 83596, 83604, 83612,
- 83620, 83625, 83630, 83636, 83642, 83648, 83654, 83662, 83670, 83676,
- 83682, 83688, 83694, 83700, 83706, 83712, 83718, 83723, 83728, 83733,
- 83738, 83743, 83748, 83753, 83758, 83764, 83770, 83776, 83782, 83788,
- 83794, 83800, 83806, 83812, 83818, 83824, 83830, 83836, 83842, 83848,
- 83854, 83860, 83866, 83872, 83878, 83884, 83890, 83896, 83902, 83908,
- 83914, 83920, 83926, 83932, 83938, 83944, 83950, 83956, 83962, 83968,
- 83974, 83980, 83986, 83992, 83998, 84004, 84010, 84016, 84022, 84028,
- 84034, 84040, 84046, 84052, 84058, 84064, 84070, 84076, 84082, 84088,
- 84094, 84100, 84106, 84112, 84118, 84123, 84128, 84133, 84138, 84144,
- 84150, 84156, 84162, 84168, 84174, 84180, 84186, 84192, 84198, 84204,
- 84210, 84215, 84220, 84225, 84230, 84242, 84254, 84265, 84276, 84288,
- 84300, 84308, 0, 0, 84316, 0, 84324, 84328, 84332, 84335, 84339, 84343,
- 84346, 84349, 84353, 84357, 84360, 84363, 84366, 84369, 84374, 84377,
- 84381, 84384, 84387, 84390, 84393, 84396, 84399, 84402, 84405, 84408,
- 84411, 84414, 84418, 84422, 84426, 84430, 84435, 84440, 84446, 84452,
- 84458, 84463, 84469, 84475, 84481, 84486, 84492, 84498, 84503, 84508,
- 84513, 84518, 84524, 84530, 84535, 84540, 84546, 84551, 84557, 84563,
- 84569, 84575, 84581, 84585, 84590, 84594, 84599, 84603, 84608, 84613,
- 84619, 84625, 84631, 84636, 84642, 84648, 84654, 84659, 84665, 84671,
- 84676, 84681, 84686, 84691, 84697, 84703, 84708, 84713, 84719, 84724,
- 84730, 84736, 84742, 84748, 84754, 84759, 84763, 84768, 84771, 84776,
- 84781, 84787, 84792, 84797, 84801, 84807, 84812, 84817, 84822, 84827,
- 84832, 84837, 84842, 84848, 84854, 84860, 84868, 84872, 84876, 84880,
- 84884, 84888, 84892, 84897, 84902, 84907, 84912, 84917, 84922, 84927,
- 84932, 84937, 84942, 84947, 84952, 84957, 84961, 84965, 84970, 84975,
- 84980, 84985, 84989, 84994, 84999, 85004, 85009, 85013, 85018, 85023,
- 85028, 85033, 85037, 85042, 85047, 85051, 85056, 85061, 85066, 85071,
- 85076, 85080, 85087, 85094, 85098, 85103, 85108, 85113, 85118, 85123,
- 85128, 85133, 85138, 85143, 85148, 85153, 85158, 85163, 85168, 85173,
- 85178, 85183, 85188, 85193, 85198, 85203, 85208, 85213, 85218, 85223,
- 85228, 85233, 85238, 85243, 0, 0, 0, 85248, 85252, 85257, 85261, 85266,
- 85271, 0, 0, 85275, 85280, 85285, 85289, 85294, 85299, 0, 0, 85304,
- 85309, 85313, 85318, 85323, 85328, 0, 0, 85333, 85338, 85343, 0, 0, 0,
- 85347, 85351, 85355, 85359, 85362, 85366, 85370, 0, 85374, 85380, 85383,
- 85387, 85390, 85394, 85398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85402, 85408,
- 85414, 85420, 85426, 0, 0, 85430, 85436, 85442, 85448, 85454, 85460,
- 85467, 85474, 85481, 85488, 85495, 85502, 0, 85509, 85516, 85523, 85529,
- 85536, 85543, 85550, 85557, 85563, 85570, 85577, 85584, 85591, 85597,
- 85604, 85611, 85618, 85625, 85631, 85638, 85645, 85652, 85659, 85666,
- 85673, 85680, 0, 85687, 85693, 85700, 85707, 85714, 85721, 85728, 85735,
- 85742, 85749, 85756, 85763, 85770, 85777, 85783, 85790, 85797, 85804,
- 85811, 0, 85818, 85825, 0, 85832, 85839, 85846, 85853, 85860, 85867,
- 85874, 85881, 85888, 85895, 85902, 85909, 85916, 85923, 85930, 0, 0,
- 85936, 85941, 85946, 85951, 85956, 85961, 85966, 85971, 85976, 85981,
- 85986, 85991, 85996, 86001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86006, 86013,
- 86020, 86027, 86034, 86041, 86048, 86055, 86062, 86069, 86076, 86083,
- 86090, 86097, 86104, 86111, 86118, 86125, 86132, 86139, 86147, 86155,
- 86162, 86169, 86174, 86182, 86190, 86197, 86204, 86209, 86216, 86221,
- 86226, 86233, 86238, 86243, 86248, 86256, 86261, 86266, 86273, 86278,
- 86283, 86290, 86297, 86302, 86307, 86312, 86317, 86322, 86327, 86332,
- 86337, 86342, 86349, 86354, 86361, 86366, 86371, 86376, 86381, 86386,
- 86391, 86396, 86401, 86406, 86411, 86416, 86423, 86430, 86437, 86444,
- 86450, 86455, 86462, 86467, 86472, 86481, 86488, 86497, 86504, 86509,
- 86514, 86522, 86527, 86532, 86537, 86542, 86547, 86554, 86559, 86564,
- 86569, 86574, 86579, 86586, 86593, 86600, 86607, 86614, 86621, 86628,
- 86635, 86642, 86649, 86656, 86663, 86670, 86677, 86684, 86691, 86698,
- 86705, 86712, 86719, 86726, 86733, 86740, 86747, 86754, 86761, 86768,
- 86775, 0, 0, 0, 0, 0, 86782, 86790, 86798, 0, 0, 0, 0, 86803, 86807,
- 86811, 86815, 86819, 86823, 86827, 86831, 86835, 86839, 86844, 86849,
- 86854, 86859, 86864, 86869, 86874, 86879, 86884, 86890, 86896, 86902,
- 86909, 86916, 86923, 86930, 86937, 86944, 86950, 86956, 86962, 86969,
- 86976, 86983, 86990, 86997, 87004, 87011, 87018, 87025, 87032, 87039,
- 87046, 87053, 87060, 0, 0, 0, 87067, 87075, 87083, 87091, 87099, 87107,
- 87117, 87127, 87135, 87143, 87151, 87159, 87167, 87173, 87180, 87189,
- 87198, 87207, 87216, 87225, 87234, 87244, 87255, 87265, 87276, 87285,
- 87294, 87303, 87313, 87324, 87334, 87345, 87356, 87365, 87373, 87379,
- 87385, 87391, 87397, 87405, 87413, 87419, 87426, 87436, 87443, 87450,
- 87457, 87464, 87471, 87481, 87488, 87495, 87503, 87511, 87520, 87529,
- 87538, 87547, 87556, 87564, 87573, 87582, 87591, 87595, 87602, 87607,
- 87612, 87616, 87620, 87624, 87628, 87633, 87638, 87644, 87650, 87654,
- 87660, 87664, 87668, 87672, 87676, 87680, 87684, 87690, 0, 0, 0, 0, 0,
- 87694, 87699, 87704, 87709, 87714, 87721, 87726, 87731, 87736, 87741,
- 87746, 87751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91764,
+ 91770, 91776, 91782, 91788, 91794, 91801, 91808, 91815, 91821, 91827,
+ 91833, 91840, 91847, 91854, 91860, 91867, 91874, 91881, 91888, 91894,
+ 91901, 91908, 91914, 91921, 91928, 91935, 91942, 91949, 91955, 91962,
+ 91969, 91976, 91982, 91988, 91994, 92000, 92006, 92013, 92020, 92026,
+ 92032, 92038, 92045, 92051, 92058, 92065, 92072, 92078, 92086, 92093,
+ 92099, 92106, 92113, 92120, 92126, 0, 0, 0, 0, 0, 0, 92133, 92141, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 87756, 87763, 87772, 87781, 87788, 87795, 87802,
- 87809, 87816, 87823, 87829, 87836, 87843, 87850, 87857, 87864, 87871,
- 87878, 87885, 87894, 87901, 87908, 87915, 87922, 87929, 87936, 87943,
- 87950, 87959, 87966, 87973, 87980, 87987, 87994, 88001, 88010, 88017,
- 88024, 88031, 88038, 88047, 88054, 88061, 88068, 88076, 88085, 0, 0,
- 88094, 88098, 88102, 88107, 88112, 88117, 88122, 88126, 88131, 88136,
- 88141, 88146, 88151, 88156, 88160, 88164, 88168, 88173, 88178, 88182,
- 88187, 88192, 88196, 88200, 88205, 88210, 88215, 88220, 88225, 0, 0, 0,
- 88230, 88234, 88239, 88244, 88248, 88253, 88257, 88262, 88267, 88272,
- 88277, 88281, 88285, 88290, 88295, 88300, 88305, 88309, 88314, 88318,
- 88323, 88328, 88332, 88337, 88342, 88347, 88351, 88355, 88360, 88365,
- 88370, 88375, 88380, 88385, 88390, 88395, 88400, 88405, 88410, 88415,
- 88420, 88425, 88430, 88435, 88440, 88445, 88450, 88455, 88460, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88465, 88469,
- 88474, 88479, 88484, 88488, 88493, 88498, 88503, 88508, 88512, 88516,
- 88521, 88526, 88531, 88536, 88540, 88545, 88550, 88555, 88560, 88565,
- 88570, 88574, 88579, 88584, 88589, 88594, 88599, 88604, 88609, 0, 88614,
- 88619, 88624, 88630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88636, 88641,
- 88646, 88651, 88656, 88661, 88666, 88671, 88676, 88681, 88686, 88691,
- 88696, 88701, 88706, 88711, 88716, 88721, 88726, 88731, 88736, 88741,
- 88746, 88751, 88756, 88761, 88766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92149, 92153, 92158, 92163, 0,
+ 92169, 92174, 0, 0, 0, 0, 0, 92179, 92185, 92192, 92197, 92202, 92206,
+ 92211, 92216, 0, 92221, 92226, 92231, 0, 92236, 92241, 92246, 92251,
+ 92256, 92261, 92266, 92271, 92276, 92281, 92286, 92290, 92294, 92299,
+ 92304, 92309, 92313, 92317, 92321, 92326, 92331, 92336, 92341, 92345,
+ 92350, 92354, 92359, 0, 0, 0, 0, 92364, 92370, 92375, 0, 0, 0, 0, 92380,
+ 92384, 92388, 92392, 92396, 92400, 92405, 92410, 92416, 0, 0, 0, 0, 0, 0,
+ 0, 0, 92422, 92428, 92435, 92441, 92448, 92454, 92460, 92466, 92473, 0,
+ 0, 0, 0, 0, 0, 0, 92479, 92487, 92495, 92503, 92511, 92519, 92527, 92535,
+ 92543, 92551, 92559, 92567, 92575, 92583, 92591, 92599, 92607, 92615,
+ 92623, 92631, 92639, 92647, 92655, 92663, 92671, 92679, 92687, 92695,
+ 92703, 92711, 92718, 92726, 92734, 92738, 92743, 92748, 92753, 92758,
+ 92763, 92768, 92773, 92777, 92782, 92786, 92791, 92795, 92800, 92804,
+ 92809, 92814, 92819, 92824, 92829, 92834, 92839, 92844, 92849, 92854,
+ 92859, 92864, 92869, 92874, 92879, 92884, 92889, 92894, 92899, 92904,
+ 92909, 92914, 92919, 92924, 92929, 92934, 92939, 92944, 92949, 92954,
+ 92959, 92964, 92969, 92974, 92979, 92984, 92989, 92994, 0, 0, 0, 92999,
+ 93004, 93013, 93021, 93030, 93039, 93050, 93061, 93068, 93075, 93082,
+ 93089, 93096, 93103, 93110, 93117, 93124, 93131, 93138, 93145, 93152,
+ 93159, 93166, 93173, 93180, 93187, 93194, 93201, 93208, 0, 0, 93215,
+ 93221, 93227, 93233, 93239, 93246, 93253, 93261, 93269, 93276, 93283,
+ 93290, 93297, 93304, 93311, 93318, 93325, 93332, 93339, 93346, 93353,
+ 93360, 93367, 93374, 93381, 93388, 93395, 0, 0, 0, 0, 0, 93402, 93408,
+ 93414, 93420, 93426, 93433, 93440, 93448, 93456, 93462, 93468, 93475,
+ 93481, 93487, 93493, 93499, 93506, 93513, 93520, 93527, 93534, 93541,
+ 93548, 93555, 93562, 93569, 93576, 93583, 93590, 93597, 93604, 93611,
+ 93618, 93625, 93632, 93639, 93646, 93653, 93660, 93667, 93674, 93681,
+ 93688, 93695, 93702, 93709, 93716, 93723, 93730, 93737, 93744, 93751,
+ 93758, 93765, 93772, 93779, 93786, 93793, 93800, 93807, 93814, 93821,
+ 93828, 93835, 93842, 93849, 93856, 93863, 93870, 93877, 93884, 93891,
+ 93898, 93905, 93912, 93919, 93926, 93933, 93940, 93947, 93954, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88773, 88778, 88783,
- 88788, 88793, 88798, 88803, 88808, 88813, 88818, 88823, 88828, 88833,
- 88838, 88843, 88848, 88853, 88858, 88863, 88868, 88873, 88878, 88883,
- 88888, 88893, 88898, 88903, 88907, 88911, 88915, 0, 88920, 88926, 88931,
- 88936, 88941, 88946, 88952, 88958, 88964, 88970, 88976, 88982, 88988,
- 88994, 89000, 89006, 89012, 89018, 89024, 89029, 89035, 89041, 89046,
- 89052, 89057, 89063, 89069, 89074, 89080, 89086, 89091, 89097, 89103,
- 89109, 89115, 89121, 89127, 0, 0, 0, 0, 89132, 89138, 89144, 89150,
- 89156, 89162, 89168, 89174, 89180, 89187, 89192, 89197, 89203, 89209, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89215, 89220, 89225,
- 89230, 89236, 89241, 89247, 89253, 89259, 89265, 89272, 89278, 89285,
- 89290, 89295, 89300, 89305, 89310, 89315, 89320, 89325, 89330, 89335,
- 89340, 89345, 89350, 89355, 89360, 89365, 89370, 89375, 89380, 89385,
- 89390, 89395, 89400, 89405, 89410, 89415, 89420, 89425, 89430, 89435,
- 89440, 89446, 89451, 89457, 89463, 89469, 89475, 89482, 89488, 89495,
- 89500, 89505, 89510, 89515, 89520, 89525, 89530, 89535, 89540, 89545,
- 89550, 89555, 89560, 89565, 89570, 89575, 89580, 89585, 89590, 89595,
- 89600, 89605, 89610, 89615, 89620, 89625, 89630, 89635, 89640, 89645,
- 89650, 89655, 89660, 89665, 89670, 89675, 89680, 89685, 89690, 89695,
- 89700, 89705, 89710, 89715, 89720, 89725, 89730, 89735, 89740, 89745,
- 89750, 89755, 89760, 89765, 89770, 89775, 89780, 89785, 89790, 89795,
- 89800, 89805, 89810, 89815, 89820, 89825, 89830, 89835, 89840, 89845,
- 89850, 89855, 89860, 89865, 89870, 89875, 89880, 89885, 89890, 89895,
- 89900, 89905, 89910, 89914, 89919, 89924, 89929, 89934, 89939, 89944,
- 89949, 89954, 89959, 89964, 89969, 89974, 89978, 89982, 89986, 89990,
- 89994, 89998, 90002, 90007, 90012, 0, 0, 90017, 90022, 90026, 90030,
- 90034, 90038, 90042, 90046, 90050, 90054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 90058, 90062, 90066, 90070, 90074, 90078, 0, 0, 90083, 0,
- 90088, 90092, 90097, 90102, 90107, 90112, 90117, 90122, 90127, 90132,
- 90137, 90141, 90146, 90151, 90156, 90161, 90165, 90170, 90175, 90180,
- 90185, 90189, 90194, 90199, 90204, 90209, 90213, 90218, 90223, 90228,
- 90233, 90238, 90243, 90248, 90253, 90258, 90263, 90268, 90273, 90277,
- 90282, 90287, 90292, 90297, 0, 90302, 90307, 0, 0, 0, 90312, 0, 0, 90317,
- 90322, 90329, 90336, 90343, 90350, 90357, 90364, 90371, 90378, 90385,
- 90392, 90399, 90406, 90413, 90420, 90427, 90434, 90441, 90448, 90455,
- 90462, 90469, 0, 90476, 90483, 90489, 90495, 90501, 90508, 90515, 90523,
- 90531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90540, 90545, 90550, 90555, 90560, 90565,
- 90570, 90575, 90580, 90585, 90590, 90595, 90600, 90605, 90610, 90615,
- 90620, 90625, 90630, 90635, 90640, 90645, 90650, 90654, 90659, 90664,
- 90670, 90674, 0, 0, 0, 90678, 90684, 90688, 90693, 90698, 90703, 90707,
- 90712, 90716, 90721, 90726, 90730, 90734, 90738, 90742, 90746, 90751,
- 90756, 90760, 90765, 90770, 90774, 90779, 90784, 90789, 90794, 90799, 0,
- 0, 0, 0, 0, 90804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90809,
- 90813, 90818, 90823, 0, 90829, 90834, 0, 0, 0, 0, 0, 90839, 90845, 90852,
- 90857, 90862, 90866, 90871, 90876, 0, 90881, 90886, 90891, 0, 90896,
- 90901, 90906, 90911, 90916, 90921, 90926, 90931, 90936, 90941, 90946,
- 90950, 90954, 90959, 90964, 90969, 90973, 90977, 90981, 90986, 90991,
- 90996, 91001, 91006, 91011, 91015, 91020, 0, 0, 0, 0, 91025, 91031,
- 91036, 0, 0, 0, 0, 91041, 91045, 91049, 91053, 91057, 91061, 91066,
- 91071, 91077, 0, 0, 0, 0, 0, 0, 0, 0, 91083, 91089, 91096, 91102, 91109,
- 91115, 91121, 91127, 91134, 0, 0, 0, 0, 0, 0, 0, 91140, 91148, 91156,
- 91164, 91172, 91180, 91188, 91196, 91204, 91212, 91220, 91228, 91236,
- 91244, 91252, 91260, 91268, 91276, 91284, 91292, 91300, 91308, 91316,
- 91324, 91332, 91340, 91348, 91356, 91364, 91372, 91379, 91387, 91395,
- 91399, 91404, 91409, 91414, 91419, 91424, 91429, 91434, 91438, 91443,
- 91447, 91452, 91456, 91461, 91465, 91470, 91475, 91480, 91485, 91490,
- 91495, 91500, 91505, 91510, 91515, 91520, 91525, 91530, 91535, 91540,
- 91545, 91550, 91555, 91560, 91565, 91570, 91575, 91580, 91585, 91590,
- 91595, 91600, 91605, 91610, 91615, 91620, 91625, 91630, 91635, 91640,
- 91645, 91650, 91655, 0, 0, 0, 91660, 91665, 91674, 91682, 91691, 91700,
- 91711, 91722, 91729, 91736, 91743, 91750, 91757, 91764, 91771, 91778,
- 91785, 91792, 91799, 91806, 91813, 91820, 91827, 91834, 91841, 91848,
- 91855, 91862, 91869, 0, 0, 91876, 91882, 91888, 91894, 91900, 91907,
- 91914, 91922, 91930, 91937, 91944, 91951, 91958, 91965, 91972, 91979,
- 91986, 91993, 92000, 92007, 92014, 92021, 92028, 92035, 92042, 92049,
- 92056, 0, 0, 0, 0, 0, 92063, 92069, 92075, 92081, 92087, 92094, 92101,
- 92109, 92117, 92123, 92129, 92136, 92142, 92148, 92154, 92160, 92167,
- 92174, 92181, 92188, 92195, 92202, 92209, 92216, 92223, 92230, 92237,
- 92244, 92251, 92258, 92265, 92272, 92279, 92286, 92293, 92300, 92307,
- 92314, 92321, 92328, 92335, 92342, 92349, 92356, 92363, 92370, 92377,
- 92384, 92391, 92398, 92405, 92412, 92419, 92426, 92433, 92440, 92447,
- 92454, 92461, 92468, 92475, 92482, 92489, 92496, 92503, 92510, 92517,
- 92524, 92531, 92538, 92545, 92552, 92559, 92566, 92573, 92580, 92587,
- 92594, 92601, 92608, 92615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 93961, 93965, 93969, 93973, 93977, 93981, 93985, 93989,
+ 93993, 93997, 94002, 94007, 94012, 94017, 94022, 94027, 94032, 94037,
+ 94042, 94048, 94054, 94060, 94067, 94074, 94081, 94088, 94095, 94102,
+ 94109, 94116, 94123, 0, 94130, 94134, 94138, 94142, 94146, 94150, 94153,
+ 94157, 94160, 94164, 94167, 94171, 94175, 94180, 94184, 94189, 94192,
+ 94196, 94199, 94203, 94206, 94210, 94214, 94218, 94222, 94226, 94230,
+ 94234, 94238, 94242, 94246, 94250, 94254, 94258, 94262, 94266, 94270,
+ 94274, 94278, 94281, 94284, 94288, 94292, 94296, 94299, 94302, 94305,
+ 94309, 94313, 94317, 94321, 94324, 94327, 94331, 94337, 94343, 94349,
+ 94354, 94361, 94365, 94370, 94374, 94379, 94384, 94390, 94395, 94401,
+ 94405, 94410, 94414, 94419, 94422, 94425, 94429, 94434, 94440, 94445,
+ 94451, 0, 0, 0, 0, 94456, 94459, 94462, 94465, 94468, 94471, 94474,
+ 94477, 94480, 94483, 94487, 94491, 94495, 94499, 94503, 94507, 94511,
+ 94515, 94519, 94524, 94529, 94533, 94536, 94539, 94542, 94545, 94548,
+ 94551, 94554, 94557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 94560, 94565, 94570, 94575, 94579, 94584, 94588, 94593, 94597, 94602,
+ 94606, 94611, 94615, 94620, 94624, 94629, 94634, 94639, 94644, 94649,
+ 94654, 94659, 94664, 94669, 94674, 94679, 94684, 94689, 94694, 94699,
+ 94704, 94709, 94714, 94719, 94724, 94728, 94732, 94737, 94742, 94747,
+ 94751, 94755, 94759, 94764, 94769, 94774, 94779, 94783, 94787, 94793,
+ 94798, 94804, 94809, 94815, 94820, 94826, 94831, 94837, 94842, 94847,
+ 94852, 94857, 94861, 94866, 94872, 94876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 94881, 94888, 94895, 94902, 94909, 94916, 94923, 94930,
+ 94937, 94944, 94951, 94958, 94965, 94972, 94979, 94986, 94993, 95000,
+ 95007, 95014, 95021, 95028, 95035, 95042, 95049, 0, 0, 0, 0, 0, 0, 0,
+ 95056, 95063, 95069, 95075, 95081, 95087, 95093, 95099, 95105, 95111, 0,
+ 0, 0, 0, 0, 0, 95117, 95122, 95127, 95132, 95137, 95141, 95145, 95149,
+ 95154, 95159, 95164, 95169, 95174, 95179, 95184, 95189, 95194, 95199,
+ 95204, 95209, 95214, 95219, 95224, 95229, 95234, 95239, 95244, 95249,
+ 95254, 95259, 95264, 95269, 95274, 95279, 95284, 95289, 95294, 95299,
+ 95304, 95309, 95314, 95319, 95325, 95330, 95336, 95341, 95347, 95352,
+ 95358, 95364, 95368, 95373, 95377, 0, 95381, 95386, 95390, 95394, 95398,
+ 95402, 95406, 95410, 95414, 95418, 95422, 95427, 95431, 95436, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 95441, 95445, 95449, 95453, 95456, 95460,
+ 95463, 95467, 95470, 95474, 95478, 95483, 95487, 95492, 95495, 95499,
+ 95502, 95506, 95509, 95513, 95517, 95521, 95525, 95529, 95533, 95537,
+ 95541, 95545, 95549, 95553, 95557, 95561, 95565, 95569, 95573, 95577,
+ 95581, 95584, 95587, 95591, 95595, 95599, 95602, 95605, 95608, 95612,
+ 95616, 95620, 95624, 95628, 95631, 95634, 95639, 95643, 95648, 95652,
+ 95657, 95662, 95668, 95673, 95679, 95683, 95688, 95692, 95697, 95701,
+ 95705, 95709, 95713, 95716, 95719, 95723, 95727, 0, 0, 0, 0, 0, 0, 0,
+ 95730, 95734, 95737, 95740, 95743, 95746, 95749, 95752, 95755, 95758, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95761, 95765, 95770, 95774, 95779,
+ 95783, 95788, 95792, 95797, 95801, 95806, 95810, 95815, 95820, 95825,
+ 95830, 95835, 95840, 95845, 95850, 95855, 95860, 95865, 95870, 95875,
+ 95880, 95885, 95890, 95895, 95900, 95904, 95908, 95913, 95918, 95923,
+ 95927, 95931, 95935, 95940, 95945, 95950, 95954, 95958, 95963, 95968,
+ 95973, 95979, 95984, 95990, 95995, 96001, 96006, 96012, 96017, 96023,
+ 96028, 0, 0, 0, 0, 0, 0, 0, 0, 96033, 96038, 96042, 96046, 96050, 96054,
+ 96058, 96062, 96066, 96070, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96074, 96077, 96082, 96088,
+ 96096, 96101, 96107, 96115, 96121, 96127, 96131, 96135, 96142, 96151,
+ 96158, 96167, 96173, 96182, 96189, 96196, 96203, 96213, 96219, 96223,
+ 96230, 96239, 96249, 96256, 96263, 96267, 96271, 96278, 96288, 96292,
+ 96299, 96306, 96313, 96319, 96326, 96333, 96340, 96347, 96351, 96355,
+ 96359, 96366, 96370, 96377, 96384, 96398, 96407, 96411, 96415, 96419,
+ 96426, 96430, 96434, 96438, 96446, 96454, 96473, 96483, 96503, 96507,
+ 96511, 96515, 96519, 96523, 96527, 96531, 96538, 96542, 96545, 96549,
+ 96553, 96559, 96566, 96575, 96579, 96588, 96597, 96605, 96609, 96616,
+ 96620, 96624, 96628, 96632, 96643, 96652, 96661, 96670, 96679, 96691,
+ 96700, 96709, 96718, 96726, 96735, 96747, 96756, 96765, 96774, 96786,
+ 96795, 96804, 96816, 96825, 96834, 96846, 96855, 96859, 96863, 96867,
+ 96871, 96875, 96879, 96883, 96890, 96894, 96898, 96909, 96913, 96917,
+ 96924, 96930, 96936, 96940, 96947, 96951, 96955, 96959, 96963, 96967,
+ 96971, 96977, 96985, 96989, 96993, 96996, 97002, 97012, 97016, 97028,
+ 97035, 97042, 97049, 97056, 97062, 97066, 97070, 97074, 97078, 97085,
+ 97094, 97101, 97109, 97117, 97123, 97127, 97131, 97135, 97139, 97145,
+ 97154, 97166, 97173, 97180, 97189, 97200, 97206, 97215, 97224, 97231,
+ 97240, 97247, 97254, 97264, 97271, 97278, 97285, 97292, 97296, 97302,
+ 97306, 97317, 97325, 97334, 97346, 97353, 97360, 97370, 97377, 97386,
+ 97393, 97402, 97409, 97416, 97426, 97433, 97440, 97450, 97457, 97469,
+ 97478, 97485, 97492, 97499, 97508, 97518, 97531, 97538, 97548, 97558,
+ 97565, 97574, 97587, 97594, 97601, 97608, 97618, 97628, 97635, 97645,
+ 97652, 97659, 97669, 97675, 97682, 97689, 97696, 97706, 97713, 97720,
+ 97727, 97733, 97740, 97750, 97757, 97761, 97769, 97773, 97785, 97789,
+ 97803, 97807, 97811, 97815, 97819, 97825, 97832, 97840, 97844, 97848,
+ 97852, 97856, 97863, 97867, 97873, 97879, 97887, 97891, 97898, 97906,
+ 97910, 97914, 97920, 97924, 97933, 97942, 97949, 97959, 97965, 97969,
+ 97973, 97981, 97988, 97995, 98001, 98005, 98013, 98017, 98024, 98036,
+ 98043, 98053, 98059, 98063, 98072, 98079, 98088, 98092, 98096, 98103,
+ 98107, 98111, 98115, 98119, 98122, 98128, 98134, 98138, 98142, 98149,
+ 98156, 98163, 98170, 98177, 98184, 98191, 98198, 98204, 98208, 98212,
+ 98219, 98226, 98233, 98240, 98247, 98251, 98254, 98259, 98263, 98267,
+ 98276, 98285, 98289, 98293, 98299, 98305, 98322, 98328, 98332, 98341,
+ 98345, 98349, 98356, 98364, 98372, 98378, 98382, 98386, 98390, 98394,
+ 98397, 98403, 98410, 98420, 98427, 98434, 98441, 98447, 98454, 98461,
+ 98468, 98475, 98482, 98491, 98498, 98510, 98517, 98524, 98534, 98545,
+ 98552, 98559, 98566, 98573, 98580, 98587, 98594, 98601, 98608, 98615,
+ 98625, 98635, 98645, 98652, 98662, 98669, 98676, 98683, 98690, 98696,
+ 98703, 98710, 98717, 98724, 98731, 98738, 98745, 98752, 98758, 98765,
+ 98772, 98781, 98788, 98795, 98799, 98807, 98811, 98815, 98819, 98823,
+ 98827, 98834, 98838, 98847, 98851, 98858, 98866, 98870, 98874, 98878,
+ 98891, 98907, 98911, 98915, 98922, 98928, 98935, 98939, 98943, 98947,
+ 98951, 98955, 98962, 98966, 98984, 98988, 98992, 98999, 99003, 99007,
+ 99013, 99017, 99021, 99029, 99033, 99037, 99041, 99045, 99051, 99062,
+ 99071, 99080, 99087, 99094, 99105, 99112, 99119, 99126, 99133, 99140,
+ 99147, 99154, 99164, 99170, 99177, 99187, 99196, 99203, 99212, 99222,
+ 99229, 99236, 99243, 99250, 99262, 99269, 99276, 99283, 99290, 99297,
+ 99307, 99314, 99321, 99331, 99344, 99356, 99363, 99373, 99380, 99387,
+ 99394, 99408, 99414, 99422, 99432, 99442, 99449, 99456, 99462, 99466,
+ 99473, 99483, 99489, 99502, 99506, 99510, 99517, 99521, 99528, 99538,
+ 99542, 99546, 99550, 99554, 99558, 99565, 99569, 99576, 99583, 99590,
+ 99599, 99608, 99618, 99625, 99632, 99639, 99649, 99656, 99666, 99673,
+ 99683, 99690, 99697, 99707, 99717, 99724, 99730, 99738, 99746, 99752,
+ 99758, 99762, 99766, 99773, 99781, 99787, 99791, 99795, 99799, 99806,
+ 99818, 99821, 99828, 99834, 99838, 99842, 99846, 99850, 99854, 99858,
+ 99862, 99866, 99870, 99874, 99881, 99885, 99891, 99895, 99899, 99903,
+ 99909, 99916, 99923, 99930, 99941, 99949, 99953, 99959, 99968, 99975,
+ 99981, 99984, 99988, 99992, 99998, 100007, 100015, 100019, 100025,
+ 100029, 100033, 100037, 100043, 100050, 100056, 100060, 100066, 100070,
+ 100074, 100083, 100095, 100099, 100106, 100113, 100123, 100130, 100142,
+ 100149, 100156, 100163, 100174, 100184, 100197, 100207, 100214, 100218,
+ 100222, 100226, 100230, 100239, 100248, 100257, 100274, 100283, 100289,
+ 100296, 100304, 100317, 100321, 100330, 100339, 100348, 100357, 100368,
+ 100377, 100386, 100395, 100404, 100413, 100422, 100432, 100435, 100439,
+ 100443, 100447, 100451, 100455, 100461, 100468, 100475, 100482, 100488,
+ 100494, 100501, 100507, 100514, 100522, 100526, 100533, 100540, 100547,
+ 100555, 100558, 100562, 100566, 100570, 100573, 100579, 100583, 100589,
+ 100596, 100603, 100609, 100616, 100623, 100630, 100637, 100644, 100651,
+ 100658, 100665, 100672, 100679, 100686, 100693, 100700, 100707, 100713,
+ 100717, 100726, 100730, 100734, 100738, 100742, 100748, 100755, 100762,
+ 100769, 100776, 100783, 100789, 100797, 100801, 100805, 100809, 100813,
+ 100819, 100836, 100853, 100857, 100861, 100865, 100869, 100873, 100877,
+ 100883, 100890, 100894, 100900, 100907, 100914, 100921, 100928, 100935,
+ 100944, 100951, 100958, 100965, 100972, 100976, 100980, 100986, 100998,
+ 101002, 101006, 101015, 101019, 101023, 101027, 101033, 101037, 101041,
+ 101050, 101054, 101058, 101062, 101069, 101073, 101077, 101081, 101085,
+ 101089, 101093, 101097, 101101, 101107, 101114, 101121, 101127, 101131,
+ 101148, 101154, 101158, 101164, 101170, 101176, 101182, 101188, 101194,
+ 101198, 101202, 101206, 101212, 101216, 101222, 101226, 101230, 101237,
+ 101244, 101261, 101265, 101269, 101273, 101277, 101281, 101293, 101296,
+ 101301, 101306, 101321, 101331, 101343, 101347, 101351, 101355, 101361,
+ 101368, 101375, 101385, 101397, 101403, 101409, 101418, 101422, 101426,
+ 101433, 101443, 101450, 101456, 101460, 101464, 101471, 101477, 101481,
+ 101487, 101491, 101499, 101505, 101509, 101517, 101525, 101532, 101538,
+ 101545, 101552, 101562, 101572, 101576, 101580, 101584, 101588, 101594,
+ 101601, 101607, 101614, 101621, 101628, 101637, 101644, 101651, 101657,
+ 101664, 101671, 101678, 101685, 101692, 101699, 101705, 101712, 101719,
+ 101726, 101735, 101742, 101749, 101753, 101759, 101763, 101769, 101776,
+ 101783, 101790, 101794, 101798, 101802, 101806, 101810, 101817, 101821,
+ 101825, 101831, 101839, 101843, 101847, 101851, 101855, 101862, 101866,
+ 101870, 101878, 101882, 101886, 101890, 101894, 101900, 101904, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101908, 101914, 101920, 101927,
+ 101934, 101941, 101948, 101955, 101962, 101968, 101975, 101982, 101989,
+ 101996, 102003, 102010, 102016, 102022, 102028, 102034, 102040, 102046,
+ 102052, 102058, 102064, 102071, 102078, 102085, 102092, 102099, 102106,
+ 102112, 102118, 102124, 102131, 102138, 102144, 102150, 102159, 102166,
+ 102173, 102180, 102187, 102194, 102201, 102207, 102213, 102219, 102228,
+ 102235, 102242, 102253, 102264, 102270, 102276, 102282, 102291, 102298,
+ 102305, 102315, 102325, 102336, 102347, 102359, 102372, 102383, 102394,
+ 102406, 102419, 102430, 102441, 102452, 102463, 102474, 102486, 102494,
+ 102502, 102511, 102520, 102529, 102535, 102541, 102547, 102554, 102564,
+ 102571, 102581, 102586, 102591, 102597, 102603, 102611, 102619, 102628,
+ 102639, 102650, 102658, 102666, 102675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 102684, 102695, 102702, 102710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 102718, 102722, 102726, 102730, 102734, 102738, 102742, 102746, 102750,
+ 102754, 102758, 102762, 102766, 102770, 102774, 102778, 102782, 102786,
+ 102790, 102794, 102798, 102802, 102806, 102810, 102814, 102818, 102822,
+ 102826, 102830, 102834, 102838, 102842, 102846, 102850, 102854, 102858,
+ 102862, 102866, 102870, 102874, 102878, 102882, 102886, 102890, 102894,
+ 102898, 102902, 102906, 102910, 102914, 102918, 102922, 102926, 102930,
+ 102934, 102938, 102942, 102946, 102950, 102954, 102958, 102962, 102966,
+ 102970, 102974, 102978, 102982, 102986, 102990, 102994, 102998, 103002,
+ 103006, 103010, 103014, 103018, 103022, 103026, 103030, 103034, 103038,
+ 103042, 103046, 103050, 103054, 103058, 103062, 103066, 103070, 103074,
+ 103078, 103082, 103086, 103090, 103094, 103098, 103102, 103106, 103110,
+ 103114, 103118, 103122, 103126, 103130, 103134, 103138, 103142, 103146,
+ 103150, 103154, 103158, 103162, 103166, 103170, 103174, 103178, 103182,
+ 103186, 103190, 103194, 103198, 103202, 103206, 103210, 103214, 103218,
+ 103222, 103226, 103230, 103234, 103238, 103242, 103246, 103250, 103254,
+ 103258, 103262, 103266, 103270, 103274, 103278, 103282, 103286, 103290,
+ 103294, 103298, 103302, 103306, 103310, 103314, 103318, 103322, 103326,
+ 103330, 103334, 103338, 103342, 103346, 103350, 103354, 103358, 103362,
+ 103366, 103370, 103374, 103378, 103382, 103386, 103390, 103394, 103398,
+ 103402, 103406, 103410, 103414, 103418, 103422, 103426, 103430, 103434,
+ 103438, 103442, 103446, 103450, 103454, 103458, 103462, 103466, 103470,
+ 103474, 103478, 103482, 103486, 103490, 103494, 103498, 103502, 103506,
+ 103510, 103514, 103518, 103522, 103526, 103530, 103534, 103538, 103542,
+ 103546, 103550, 103554, 103558, 103562, 103566, 103570, 103574, 103578,
+ 103582, 103586, 103590, 103594, 103598, 103602, 103606, 103610, 103614,
+ 103618, 103622, 103626, 103630, 103634, 103638, 103642, 103646, 103650,
+ 103654, 103658, 103662, 103666, 103670, 103674, 103678, 103682, 103686,
+ 103690, 103694, 103698, 103702, 103706, 103710, 103714, 103718, 103722,
+ 103726, 103730, 103734, 103738, 103742, 103746, 103750, 103754, 103758,
+ 103762, 103766, 103770, 103774, 103778, 103782, 103786, 103790, 103794,
+ 103798, 103802, 103806, 103810, 103814, 103818, 103822, 103826, 103830,
+ 103834, 103838, 103842, 103846, 103850, 103854, 103858, 103862, 103866,
+ 103870, 103874, 103878, 103882, 103886, 103890, 103894, 103898, 103902,
+ 103906, 103910, 103914, 103918, 103922, 103926, 103930, 103934, 103938,
+ 103942, 103946, 103950, 103954, 103958, 103962, 103966, 103970, 103974,
+ 103978, 103982, 103986, 103990, 103994, 103998, 104002, 104006, 104010,
+ 104014, 104018, 104022, 104026, 104030, 104034, 104038, 104042, 104046,
+ 104050, 104054, 104058, 104062, 104066, 104070, 104074, 104078, 104082,
+ 104086, 104090, 104094, 104098, 104102, 104106, 104110, 104114, 104118,
+ 104122, 104126, 104130, 104134, 104138, 104142, 104146, 104150, 104154,
+ 104158, 104162, 104166, 104170, 104174, 104178, 104182, 104186, 104190,
+ 104194, 104198, 104202, 104206, 104210, 104214, 104218, 104222, 104226,
+ 104230, 104234, 104238, 104242, 104246, 104250, 104254, 104258, 104262,
+ 104266, 104270, 104274, 104278, 104282, 104286, 104290, 104294, 104298,
+ 104302, 104306, 104310, 104314, 104318, 104322, 104326, 104330, 104334,
+ 104338, 104342, 104346, 104350, 104354, 104358, 104362, 104366, 104370,
+ 104374, 104378, 104382, 104386, 104390, 104394, 104398, 104402, 104406,
+ 104410, 104414, 104418, 104422, 104426, 104430, 104434, 104438, 104442,
+ 104446, 104450, 104454, 104458, 104462, 104466, 104470, 104474, 104478,
+ 104482, 104486, 104490, 104494, 104498, 104502, 104506, 104510, 104514,
+ 104518, 104522, 104526, 104530, 104534, 104538, 104542, 104546, 104550,
+ 104554, 104558, 104562, 104566, 104570, 104574, 104578, 104582, 104586,
+ 104590, 104594, 104598, 104602, 104606, 104610, 104614, 104618, 104622,
+ 104626, 104630, 104634, 104638, 104642, 104646, 104650, 104654, 104658,
+ 104662, 104666, 104670, 104674, 104678, 104682, 104686, 104690, 104694,
+ 104698, 104702, 104706, 104710, 104714, 104718, 104722, 104726, 104730,
+ 104734, 104738, 104742, 104746, 104750, 104754, 104758, 104762, 104766,
+ 104770, 104774, 104778, 104782, 104786, 104790, 104794, 104798, 104802,
+ 104806, 104810, 104814, 104818, 104822, 104826, 104830, 104834, 104838,
+ 104842, 104846, 104850, 104854, 104858, 104862, 104866, 104870, 104874,
+ 104878, 104882, 104886, 104890, 104894, 104898, 104902, 104906, 104910,
+ 104914, 104918, 104922, 104926, 104930, 104934, 104938, 104942, 104946,
+ 104950, 104954, 104958, 104962, 104966, 104970, 104974, 104978, 104982,
+ 104986, 104990, 104994, 104998, 105002, 105006, 105010, 105014, 105018,
+ 105022, 105026, 105030, 105034, 105038, 105042, 105046, 105050, 105054,
+ 105058, 105062, 105066, 105070, 105074, 105078, 105082, 105086, 105090,
+ 105094, 105098, 105102, 105106, 105110, 105114, 105118, 105122, 105126,
+ 105130, 105134, 105138, 105142, 105146, 105150, 105154, 105158, 105162,
+ 105166, 105170, 105174, 105178, 105182, 105186, 105190, 105194, 105198,
+ 105202, 105206, 105210, 105214, 105218, 105222, 105226, 105230, 105234,
+ 105238, 105242, 105246, 105250, 105254, 105258, 105262, 105266, 105270,
+ 105274, 105278, 105282, 105286, 105290, 105294, 105298, 105302, 105306,
+ 105310, 105314, 105318, 105322, 105326, 105330, 105334, 105338, 105342,
+ 105346, 105350, 105354, 105358, 105362, 105366, 105370, 105374, 105378,
+ 105382, 105386, 105390, 105394, 105398, 105402, 105406, 105410, 105414,
+ 105418, 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450,
+ 105454, 105458, 105462, 105466, 105470, 105474, 105478, 105482, 105486,
+ 105490, 105494, 105498, 105502, 105506, 105510, 105514, 105518, 105522,
+ 105526, 105530, 105534, 105538, 105542, 105546, 105550, 105554, 105558,
+ 105562, 105566, 105570, 105574, 105578, 105582, 105586, 105590, 105594,
+ 105598, 105602, 105606, 105610, 105614, 105618, 105622, 105626, 105630,
+ 105634, 105638, 105642, 105646, 105650, 105654, 105658, 105662, 105666,
+ 105670, 105674, 105678, 105682, 105686, 105690, 105694, 105698, 105702,
+ 105706, 105710, 105714, 105718, 105722, 105726, 105730, 105734, 105738,
+ 105742, 105746, 105750, 105754, 105758, 105762, 105766, 105770, 105774,
+ 105778, 105782, 105786, 105790, 105794, 105798, 105802, 105806, 105810,
+ 105814, 105818, 105822, 105826, 105830, 105834, 105838, 105842, 105846,
+ 105850, 105854, 105858, 105862, 105866, 105870, 105874, 105878, 105882,
+ 105886, 105890, 105894, 105898, 105902, 105906, 105910, 105914, 105918,
+ 105922, 105926, 105930, 105934, 105938, 105942, 105946, 105950, 105954,
+ 105958, 105962, 105966, 105970, 105974, 105978, 105982, 105986, 105990,
+ 105994, 105998, 106002, 106006, 106010, 106014, 106018, 106022, 106026,
+ 106030, 106034, 106038, 106042, 106046, 106050, 106054, 106058, 106062,
+ 106066, 106070, 106074, 106078, 106082, 106086, 106090, 106094, 106098,
+ 106102, 106106, 106110, 106114, 106118, 106122, 106126, 106130, 106134,
+ 106138, 106142, 106146, 106150, 106154, 106158, 106162, 106166, 106170,
+ 106174, 106178, 106182, 106186, 106190, 106194, 106198, 106202, 106206,
+ 106210, 106214, 106218, 106222, 106226, 106230, 106234, 106238, 106242,
+ 106246, 106250, 106254, 106258, 106262, 106266, 106270, 106274, 106278,
+ 106282, 106286, 106290, 106294, 106298, 106302, 106306, 106310, 106314,
+ 106318, 106322, 106326, 106330, 106334, 106338, 106342, 106346, 106350,
+ 106354, 106358, 106362, 106366, 106370, 106374, 106378, 106382, 106386,
+ 106390, 106394, 106398, 106402, 106406, 106410, 106414, 106418, 106422,
+ 106426, 106430, 106434, 106438, 106442, 106446, 106450, 106454, 106458,
+ 106462, 106466, 106470, 106474, 106478, 106482, 106486, 106490, 106494,
+ 106498, 106502, 106506, 106510, 106514, 106518, 106522, 106526, 106530,
+ 106534, 106538, 106542, 106546, 106550, 106554, 106558, 106562, 106566,
+ 106570, 106574, 106578, 106582, 106586, 106590, 106594, 106598, 106602,
+ 106606, 106610, 106614, 106618, 106622, 106626, 106630, 106634, 106638,
+ 106642, 106646, 106650, 106654, 106658, 106662, 106666, 106670, 106674,
+ 106678, 106682, 106686, 106690, 106694, 106698, 106702, 106706, 106710,
+ 106714, 106718, 106722, 106726, 106730, 106734, 106738, 106742, 106746,
+ 106750, 106754, 106758, 106762, 106766, 106770, 106774, 106778, 106782,
+ 106786, 106790, 106794, 106798, 106802, 106806, 106810, 106814, 106818,
+ 106822, 106826, 106830, 106834, 106838, 106842, 106846, 106850, 106854,
+ 106858, 106862, 106866, 106870, 106874, 106878, 106882, 106886, 106890,
+ 106894, 106898, 106902, 106906, 106910, 106914, 106918, 106922, 106926,
+ 106930, 106934, 106938, 106942, 106946, 106950, 106954, 106958, 106962,
+ 106966, 106970, 106974, 106978, 106982, 106986, 106990, 106994, 106998,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92622, 92626, 92630,
- 92634, 92638, 92642, 92646, 92650, 92654, 92658, 92663, 92668, 92673,
- 92678, 92683, 92688, 92693, 92698, 92703, 92709, 92715, 92721, 92728,
- 92735, 92742, 92749, 92756, 92763, 92770, 92777, 92784, 0, 92791, 92795,
- 92799, 92803, 92807, 92811, 92814, 92818, 92821, 92825, 92828, 92832,
- 92836, 92841, 92845, 92850, 92853, 92857, 92860, 92864, 92867, 92871,
- 92875, 92879, 92883, 92887, 92891, 92895, 92899, 92903, 92907, 92911,
- 92915, 92919, 92923, 92927, 92931, 92935, 92939, 92942, 92945, 92949,
- 92953, 92957, 92960, 92963, 92966, 92970, 92974, 92978, 92982, 92986,
- 92989, 92993, 92999, 93005, 93011, 93016, 93023, 93027, 93032, 93036,
- 93041, 93046, 93052, 93057, 93063, 93067, 93072, 93076, 93081, 93084,
- 93087, 93091, 93096, 93102, 93107, 93113, 0, 0, 0, 0, 93118, 93121,
- 93124, 93127, 93130, 93133, 93136, 93139, 93142, 93145, 93149, 93153,
- 93157, 93161, 93165, 93169, 93173, 93177, 93181, 93186, 93191, 93195,
- 93198, 93201, 93204, 93207, 93210, 93213, 93216, 93219, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93222, 93226, 93230, 93234, 93237, 93241,
- 93244, 93248, 93251, 93255, 93258, 93262, 93265, 93269, 93272, 93276,
- 93280, 93284, 93288, 93292, 93296, 93300, 93304, 93308, 93312, 93316,
- 93320, 93324, 93328, 93332, 93336, 93340, 93344, 93348, 93352, 93355,
- 93358, 93362, 93366, 93370, 93373, 93376, 93379, 93383, 93387, 93391,
- 93395, 93399, 93402, 93407, 93411, 93416, 93420, 93425, 93429, 93434,
- 93438, 93443, 93447, 93451, 93455, 93459, 93462, 93466, 93471, 93474, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93478, 93481, 93486, 93492, 93500,
- 93505, 93511, 93519, 93525, 93531, 93535, 93539, 93546, 93555, 93562,
- 93571, 93577, 93586, 93593, 93600, 93607, 93617, 93623, 93627, 93634,
- 93643, 93653, 93660, 93667, 93671, 93675, 93682, 93692, 93696, 93703,
- 93710, 93717, 93723, 93730, 93737, 93744, 93751, 93755, 93759, 93763,
- 93770, 93774, 93781, 93788, 93802, 93811, 93815, 93819, 93823, 93830,
- 93834, 93838, 93842, 93850, 93858, 93877, 93887, 93907, 93911, 93915,
- 93919, 93923, 93927, 93931, 93935, 93942, 93946, 93949, 93953, 93957,
- 93963, 93970, 93979, 93983, 93992, 94001, 94009, 94013, 94020, 94024,
- 94028, 94032, 94036, 94047, 94056, 94065, 94074, 94083, 94095, 94104,
- 94113, 94122, 94130, 94139, 94151, 94160, 94169, 94178, 94190, 94199,
- 94208, 94220, 94229, 94238, 94250, 94259, 94263, 94267, 94271, 94275,
- 94279, 94283, 94287, 94294, 94298, 94302, 94313, 94317, 94321, 94328,
- 94334, 94340, 94344, 94351, 94355, 94359, 94363, 94367, 94371, 94375,
- 94381, 94389, 94393, 94397, 94400, 94406, 94416, 94420, 94432, 94439,
- 94446, 94453, 94460, 94466, 94470, 94474, 94478, 94482, 94489, 94498,
- 94505, 94513, 94521, 94527, 94531, 94535, 94539, 94543, 94549, 94558,
- 94570, 94577, 94584, 94593, 94604, 94610, 94619, 94628, 94635, 94644,
- 94651, 94658, 94668, 94675, 94682, 94689, 94696, 94700, 94706, 94710,
- 94721, 94729, 94738, 94750, 94757, 94764, 94774, 94781, 94790, 94797,
- 94806, 94813, 94820, 94830, 94837, 94844, 94854, 94861, 94873, 94882,
- 94889, 94896, 94903, 94912, 94922, 94935, 94942, 94952, 94962, 94969,
- 94978, 94991, 94998, 95005, 95012, 95022, 95032, 95039, 95049, 95056,
- 95063, 95073, 95079, 95086, 95093, 95100, 95110, 95117, 95124, 95131,
- 95137, 95144, 95154, 95161, 95165, 95173, 95177, 95189, 95193, 95207,
- 95211, 95215, 95219, 95223, 95229, 95236, 95244, 95248, 95252, 95256,
- 95260, 95267, 95271, 95277, 95283, 95291, 95295, 95302, 95310, 95314,
- 95318, 95324, 95328, 95337, 95346, 95353, 95363, 95369, 95373, 95377,
- 95385, 95392, 95399, 95405, 95409, 95417, 95421, 95428, 95440, 95447,
- 95457, 95463, 95467, 95476, 95483, 95492, 95496, 95500, 95507, 95511,
- 95515, 95519, 95523, 95526, 95532, 95538, 95542, 95546, 95553, 95560,
- 95567, 95574, 95581, 95588, 95595, 95602, 95608, 95612, 95616, 95623,
- 95630, 95637, 95644, 95651, 95655, 95658, 95663, 95667, 95671, 95680,
- 95689, 95693, 95697, 95703, 95709, 95726, 95732, 95736, 95745, 95749,
- 95753, 95760, 95768, 95776, 95782, 95786, 95790, 95794, 95798, 95801,
- 95807, 95814, 95824, 95831, 95838, 95845, 95851, 95858, 95865, 95872,
- 95879, 95886, 95895, 95902, 95914, 95921, 95928, 95938, 95949, 95956,
- 95963, 95970, 95977, 95984, 95991, 95998, 96005, 96012, 96019, 96029,
- 96039, 96049, 96056, 96066, 96073, 96080, 96087, 96094, 96101, 96108,
- 96115, 96122, 96129, 96136, 96143, 96150, 96157, 96163, 96170, 96177,
- 96186, 96193, 96200, 96204, 96212, 96216, 96220, 96224, 96228, 96232,
- 96239, 96243, 96252, 96256, 96263, 96271, 96275, 96279, 96283, 96296,
- 96312, 96316, 96320, 96327, 96333, 96340, 96344, 96348, 96352, 96356,
- 96360, 96367, 96371, 96389, 96393, 96397, 96404, 96408, 96412, 96418,
- 96422, 96426, 96434, 96438, 96442, 96446, 96450, 96456, 96467, 96476,
- 96485, 96492, 96499, 96510, 96517, 96524, 96531, 96538, 96545, 96552,
- 96559, 96569, 96575, 96582, 96592, 96601, 96608, 96617, 96627, 96634,
- 96641, 96648, 96655, 96667, 96674, 96681, 96688, 96695, 96702, 96712,
- 96719, 96726, 96736, 96749, 96761, 96768, 96778, 96785, 96792, 96799,
- 96813, 96819, 96827, 96837, 96847, 96854, 96861, 96867, 96871, 96878,
- 96888, 96894, 96907, 96911, 96915, 96922, 96926, 96933, 96943, 96947,
- 96951, 96955, 96959, 96963, 96970, 96974, 96981, 96988, 96995, 97004,
- 97013, 97023, 97030, 97037, 97044, 97054, 97061, 97071, 97078, 97088,
- 97095, 97102, 97112, 97122, 97129, 97135, 97143, 97151, 97157, 97163,
- 97167, 97171, 97178, 97186, 97192, 97196, 97200, 97204, 97211, 97223,
- 97226, 97233, 97239, 97243, 97247, 97251, 97255, 97259, 97263, 97267,
- 97271, 97275, 97279, 97286, 97290, 97296, 97300, 97304, 97308, 97314,
- 97321, 97328, 97335, 97346, 97354, 97358, 97364, 97373, 97380, 97386,
- 97389, 97393, 97397, 97403, 97412, 97420, 97424, 97430, 97434, 97438,
- 97442, 97448, 97455, 97461, 97465, 97471, 97475, 97479, 97488, 97500,
- 97504, 97511, 97518, 97528, 97535, 97547, 97554, 97561, 97568, 97579,
- 97589, 97602, 97612, 97619, 97623, 97627, 97631, 97635, 97644, 97653,
- 97662, 97679, 97688, 97694, 97701, 97709, 97722, 97726, 97735, 97744,
- 97753, 97762, 97773, 97782, 97791, 97800, 97809, 97818, 97827, 97837,
- 97840, 97844, 97848, 97852, 97856, 97860, 97866, 97873, 97880, 97887,
- 97893, 97899, 97906, 97912, 97919, 97927, 97931, 97938, 97945, 97952,
- 97960, 97963, 97967, 97971, 97975, 97979, 97985, 97989, 97995, 98002,
- 98009, 98015, 98022, 98029, 98036, 98043, 98050, 98057, 98064, 98071,
- 98078, 98085, 98092, 98099, 98106, 98113, 98119, 98123, 98132, 98136,
- 98140, 98144, 98148, 98154, 98161, 98168, 98175, 98182, 98189, 98195,
- 98203, 98207, 98211, 98215, 98219, 98225, 98242, 98259, 98263, 98267,
- 98271, 98275, 98279, 98283, 98289, 98296, 98300, 98306, 98313, 98320,
- 98327, 98334, 98341, 98350, 98357, 98364, 98371, 98378, 98382, 98386,
- 98392, 98404, 98408, 98412, 98421, 98425, 98429, 98433, 98439, 98443,
- 98447, 98456, 98460, 98464, 98468, 98475, 98479, 98483, 98487, 98491,
- 98495, 98499, 98503, 98507, 98513, 98520, 98527, 98533, 98537, 98554,
- 98560, 98564, 98570, 98576, 98582, 98588, 98594, 98600, 98604, 98608,
- 98612, 98618, 98622, 98628, 98632, 98636, 98643, 98650, 98667, 98671,
- 98675, 98679, 98683, 98687, 98699, 98702, 98707, 98712, 98727, 98737,
- 98749, 98753, 98757, 98761, 98767, 98774, 98781, 98791, 98803, 98809,
- 98815, 98824, 98828, 98832, 98839, 98849, 98856, 98862, 98866, 98870,
- 98877, 98883, 98887, 98893, 98897, 98905, 98911, 98915, 98923, 98931,
- 98938, 98944, 98951, 98958, 98968, 98978, 98982, 98986, 98990, 98994,
- 99000, 99007, 99013, 99020, 99027, 99034, 99043, 99050, 99057, 99063,
- 99070, 99077, 99084, 99091, 99098, 99105, 99111, 99118, 99125, 99132,
- 99141, 99148, 99155, 99159, 99165, 99169, 99175, 99182, 99189, 99196,
- 99200, 99204, 99208, 99212, 99216, 99223, 99227, 99231, 99237, 99245,
- 99249, 99253, 99257, 99261, 99268, 99272, 99276, 99284, 99288, 99292,
- 99296, 99300, 99306, 99310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 99314, 99320, 99326, 99333, 99340, 99347, 99354, 99361, 99368,
- 99374, 99381, 99388, 99395, 99402, 99409, 99416, 99422, 99428, 99434,
- 99440, 99446, 99452, 99458, 99464, 99470, 99477, 99484, 99491, 99498,
- 99505, 99512, 99518, 99524, 99530, 99537, 99544, 99550, 99556, 99565,
- 99572, 99579, 99586, 99593, 99600, 99607, 99613, 99619, 99625, 99634,
- 99641, 99648, 99659, 99670, 99676, 99682, 99688, 99697, 99704, 99711,
- 99721, 99731, 99742, 99753, 99765, 99778, 99789, 99800, 99812, 99825,
- 99836, 99847, 99858, 99869, 99880, 99892, 99900, 99908, 99917, 99926,
- 99935, 99941, 99947, 99953, 99960, 99970, 99977, 99987, 99992, 99997,
- 100003, 100009, 100017, 100025, 100034, 100045, 100056, 100064, 100072,
- 100081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100090, 100101, 100108,
- 100116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100124, 100128, 100132,
- 100136, 100140, 100144, 100148, 100152, 100156, 100160, 100164, 100168,
- 100172, 100176, 100180, 100184, 100188, 100192, 100196, 100200, 100204,
- 100208, 100212, 100216, 100220, 100224, 100228, 100232, 100236, 100240,
- 100244, 100248, 100252, 100256, 100260, 100264, 100268, 100272, 100276,
- 100280, 100284, 100288, 100292, 100296, 100300, 100304, 100308, 100312,
- 100316, 100320, 100324, 100328, 100332, 100336, 100340, 100344, 100348,
- 100352, 100356, 100360, 100364, 100368, 100372, 100376, 100380, 100384,
- 100388, 100392, 100396, 100400, 100404, 100408, 100412, 100416, 100420,
- 100424, 100428, 100432, 100436, 100440, 100444, 100448, 100452, 100456,
- 100460, 100464, 100468, 100472, 100476, 100480, 100484, 100488, 100492,
- 100496, 100500, 100504, 100508, 100512, 100516, 100520, 100524, 100528,
- 100532, 100536, 100540, 100544, 100548, 100552, 100556, 100560, 100564,
- 100568, 100572, 100576, 100580, 100584, 100588, 100592, 100596, 100600,
- 100604, 100608, 100612, 100616, 100620, 100624, 100628, 100632, 100636,
- 100640, 100644, 100648, 100652, 100656, 100660, 100664, 100668, 100672,
- 100676, 100680, 100684, 100688, 100692, 100696, 100700, 100704, 100708,
- 100712, 100716, 100720, 100724, 100728, 100732, 100736, 100740, 100744,
- 100748, 100752, 100756, 100760, 100764, 100768, 100772, 100776, 100780,
- 100784, 100788, 100792, 100796, 100800, 100804, 100808, 100812, 100816,
- 100820, 100824, 100828, 100832, 100836, 100840, 100844, 100848, 100852,
- 100856, 100860, 100864, 100868, 100872, 100876, 100880, 100884, 100888,
- 100892, 100896, 100900, 100904, 100908, 100912, 100916, 100920, 100924,
- 100928, 100932, 100936, 100940, 100944, 100948, 100952, 100956, 100960,
- 100964, 100968, 100972, 100976, 100980, 100984, 100988, 100992, 100996,
- 101000, 101004, 101008, 101012, 101016, 101020, 101024, 101028, 101032,
- 101036, 101040, 101044, 101048, 101052, 101056, 101060, 101064, 101068,
- 101072, 101076, 101080, 101084, 101088, 101092, 101096, 101100, 101104,
- 101108, 101112, 101116, 101120, 101124, 101128, 101132, 101136, 101140,
- 101144, 101148, 101152, 101156, 101160, 101164, 101168, 101172, 101176,
- 101180, 101184, 101188, 101192, 101196, 101200, 101204, 101208, 101212,
- 101216, 101220, 101224, 101228, 101232, 101236, 101240, 101244, 101248,
- 101252, 101256, 101260, 101264, 101268, 101272, 101276, 101280, 101284,
- 101288, 101292, 101296, 101300, 101304, 101308, 101312, 101316, 101320,
- 101324, 101328, 101332, 101336, 101340, 101344, 101348, 101352, 101356,
- 101360, 101364, 101368, 101372, 101376, 101380, 101384, 101388, 101392,
- 101396, 101400, 101404, 101408, 101412, 101416, 101420, 101424, 101428,
- 101432, 101436, 101440, 101444, 101448, 101452, 101456, 101460, 101464,
- 101468, 101472, 101476, 101480, 101484, 101488, 101492, 101496, 101500,
- 101504, 101508, 101512, 101516, 101520, 101524, 101528, 101532, 101536,
- 101540, 101544, 101548, 101552, 101556, 101560, 101564, 101568, 101572,
- 101576, 101580, 101584, 101588, 101592, 101596, 101600, 101604, 101608,
- 101612, 101616, 101620, 101624, 101628, 101632, 101636, 101640, 101644,
- 101648, 101652, 101656, 101660, 101664, 101668, 101672, 101676, 101680,
- 101684, 101688, 101692, 101696, 101700, 101704, 101708, 101712, 101716,
- 101720, 101724, 101728, 101732, 101736, 101740, 101744, 101748, 101752,
- 101756, 101760, 101764, 101768, 101772, 101776, 101780, 101784, 101788,
- 101792, 101796, 101800, 101804, 101808, 101812, 101816, 101820, 101824,
- 101828, 101832, 101836, 101840, 101844, 101848, 101852, 101856, 101860,
- 101864, 101868, 101872, 101876, 101880, 101884, 101888, 101892, 101896,
- 101900, 101904, 101908, 101912, 101916, 101920, 101924, 101928, 101932,
- 101936, 101940, 101944, 101948, 101952, 101956, 101960, 101964, 101968,
- 101972, 101976, 101980, 101984, 101988, 101992, 101996, 102000, 102004,
- 102008, 102012, 102016, 102020, 102024, 102028, 102032, 102036, 102040,
- 102044, 102048, 102052, 102056, 102060, 102064, 102068, 102072, 102076,
- 102080, 102084, 102088, 102092, 102096, 102100, 102104, 102108, 102112,
- 102116, 102120, 102124, 102128, 102132, 102136, 102140, 102144, 102148,
- 102152, 102156, 102160, 102164, 102168, 102172, 102176, 102180, 102184,
- 102188, 102192, 102196, 102200, 102204, 102208, 102212, 102216, 102220,
- 102224, 102228, 102232, 102236, 102240, 102244, 102248, 102252, 102256,
- 102260, 102264, 102268, 102272, 102276, 102280, 102284, 102288, 102292,
- 102296, 102300, 102304, 102308, 102312, 102316, 102320, 102324, 102328,
- 102332, 102336, 102340, 102344, 102348, 102352, 102356, 102360, 102364,
- 102368, 102372, 102376, 102380, 102384, 102388, 102392, 102396, 102400,
- 102404, 102408, 102412, 102416, 102420, 102424, 102428, 102432, 102436,
- 102440, 102444, 102448, 102452, 102456, 102460, 102464, 102468, 102472,
- 102476, 102480, 102484, 102488, 102492, 102496, 102500, 102504, 102508,
- 102512, 102516, 102520, 102524, 102528, 102532, 102536, 102540, 102544,
- 102548, 102552, 102556, 102560, 102564, 102568, 102572, 102576, 102580,
- 102584, 102588, 102592, 102596, 102600, 102604, 102608, 102612, 102616,
- 102620, 102624, 102628, 102632, 102636, 102640, 102644, 102648, 102652,
- 102656, 102660, 102664, 102668, 102672, 102676, 102680, 102684, 102688,
- 102692, 102696, 102700, 102704, 102708, 102712, 102716, 102720, 102724,
- 102728, 102732, 102736, 102740, 102744, 102748, 102752, 102756, 102760,
- 102764, 102768, 102772, 102776, 102780, 102784, 102788, 102792, 102796,
- 102800, 102804, 102808, 102812, 102816, 102820, 102824, 102828, 102832,
- 102836, 102840, 102844, 102848, 102852, 102856, 102860, 102864, 102868,
- 102872, 102876, 102880, 102884, 102888, 102892, 102896, 102900, 102904,
- 102908, 102912, 102916, 102920, 102924, 102928, 102932, 102936, 102940,
- 102944, 102948, 102952, 102956, 102960, 102964, 102968, 102972, 102976,
- 102980, 102984, 102988, 102992, 102996, 103000, 103004, 103008, 103012,
- 103016, 103020, 103024, 103028, 103032, 103036, 103040, 103044, 103048,
- 103052, 103056, 103060, 103064, 103068, 103072, 103076, 103080, 103084,
- 103088, 103092, 103096, 103100, 103104, 103108, 103112, 103116, 103120,
- 103124, 103128, 103132, 103136, 103140, 103144, 103148, 103152, 103156,
- 103160, 103164, 103168, 103172, 103176, 103180, 103184, 103188, 103192,
- 103196, 103200, 103204, 103208, 103212, 103216, 103220, 103224, 103228,
- 103232, 103236, 103240, 103244, 103248, 103252, 103256, 103260, 103264,
- 103268, 103272, 103276, 103280, 103284, 103288, 103292, 103296, 103300,
- 103304, 103308, 103312, 103316, 103320, 103324, 103328, 103332, 103336,
- 103340, 103344, 103348, 103352, 103356, 103360, 103364, 103368, 103372,
- 103376, 103380, 103384, 103388, 103392, 103396, 103400, 103404, 103408,
- 103412, 103416, 103420, 103424, 103428, 103432, 103436, 103440, 103444,
- 103448, 103452, 103456, 103460, 103464, 103468, 103472, 103476, 103480,
- 103484, 103488, 103492, 103496, 103500, 103504, 103508, 103512, 103516,
- 103520, 103524, 103528, 103532, 103536, 103540, 103544, 103548, 103552,
- 103556, 103560, 103564, 103568, 103572, 103576, 103580, 103584, 103588,
- 103592, 103596, 103600, 103604, 103608, 103612, 103616, 103620, 103624,
- 103628, 103632, 103636, 103640, 103644, 103648, 103652, 103656, 103660,
- 103664, 103668, 103672, 103676, 103680, 103684, 103688, 103692, 103696,
- 103700, 103704, 103708, 103712, 103716, 103720, 103724, 103728, 103732,
- 103736, 103740, 103744, 103748, 103752, 103756, 103760, 103764, 103768,
- 103772, 103776, 103780, 103784, 103788, 103792, 103796, 103800, 103804,
- 103808, 103812, 103816, 103820, 103824, 103828, 103832, 103836, 103840,
- 103844, 103848, 103852, 103856, 103860, 103864, 103868, 103872, 103876,
- 103880, 103884, 103888, 103892, 103896, 103900, 103904, 103908, 103912,
- 103916, 103920, 103924, 103928, 103932, 103936, 103940, 103944, 103948,
- 103952, 103956, 103960, 103964, 103968, 103972, 103976, 103980, 103984,
- 103988, 103992, 103996, 104000, 104004, 104008, 104012, 104016, 104020,
- 104024, 104028, 104032, 104036, 104040, 104044, 104048, 104052, 104056,
- 104060, 104064, 104068, 104072, 104076, 104080, 104084, 104088, 104092,
- 104096, 104100, 104104, 104108, 104112, 104116, 104120, 104124, 104128,
- 104132, 104136, 104140, 104144, 104148, 104152, 104156, 104160, 104164,
- 104168, 104172, 104176, 104180, 104184, 104188, 104192, 104196, 104200,
- 104204, 104208, 104212, 104216, 104220, 104224, 104228, 104232, 104236,
- 104240, 104244, 104248, 104252, 104256, 104260, 104264, 104268, 104272,
- 104276, 104280, 104284, 104288, 104292, 104296, 104300, 104304, 104308,
- 104312, 104316, 104320, 104324, 104328, 104332, 104336, 104340, 104344,
- 104348, 104352, 104356, 104360, 104364, 104368, 104372, 104376, 104380,
- 104384, 104388, 104392, 104396, 104400, 104404, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 107002, 107009, 107016, 107025, 107034,
+ 107041, 107046, 107053, 107060, 107069, 107080, 107091, 107096, 107103,
+ 107108, 107113, 107118, 107123, 107128, 107133, 107138, 107143, 107148,
+ 107153, 107158, 107165, 107172, 107177, 107182, 107187, 107192, 107199,
+ 107206, 107214, 107219, 107226, 107231, 107236, 107241, 107246, 107251,
+ 107258, 107265, 107270, 107275, 107280, 107285, 107290, 107295, 107300,
+ 107305, 107310, 107315, 107320, 107325, 107330, 107335, 107340, 107345,
+ 107350, 107355, 107360, 107367, 107372, 107377, 107386, 107393, 107398,
+ 107403, 107408, 107413, 107418, 107423, 107428, 107433, 107438, 107443,
+ 107448, 107453, 107458, 107463, 107468, 107473, 107478, 107483, 107488,
+ 107493, 107498, 107504, 107512, 107518, 107526, 107534, 107542, 107548,
+ 107554, 107560, 107566, 107572, 107580, 107590, 107598, 107606, 107612,
+ 107618, 107626, 107634, 107640, 107648, 107656, 107664, 107670, 107676,
+ 107682, 107688, 107694, 107700, 107708, 107716, 107722, 107728, 107734,
+ 107740, 107746, 107754, 107760, 107766, 107772, 107778, 107784, 107790,
+ 107798, 107804, 107810, 107816, 107822, 107830, 107838, 107844, 107850,
+ 107856, 107861, 107867, 107873, 107880, 107885, 107890, 107895, 107900,
+ 107905, 107910, 107915, 107920, 107925, 107934, 107941, 107946, 107951,
+ 107956, 107963, 107968, 107973, 107978, 107985, 107990, 107995, 108000,
+ 108005, 108010, 108015, 108020, 108025, 108030, 108035, 108040, 108047,
+ 108052, 108059, 108064, 108069, 108076, 108081, 108086, 108091, 108096,
+ 108101, 108106, 108111, 108116, 108121, 108126, 108131, 108136, 108141,
+ 108146, 108151, 108156, 108161, 108166, 108171, 108178, 108183, 108188,
+ 108193, 108198, 108203, 108208, 108213, 108218, 108223, 108228, 108233,
+ 108238, 108243, 108250, 108255, 108260, 108267, 108272, 108277, 108282,
+ 108287, 108292, 108297, 108302, 108307, 108312, 108317, 108324, 108329,
+ 108334, 108339, 108344, 108349, 108356, 108363, 108368, 108373, 108378,
+ 108383, 108388, 108393, 108398, 108403, 108408, 108413, 108418, 108423,
+ 108428, 108433, 108438, 108443, 108448, 108453, 108458, 108463, 108468,
+ 108473, 108478, 108483, 108488, 108493, 108498, 108503, 108508, 108513,
+ 108518, 108523, 108528, 108533, 108538, 108543, 108550, 108555, 108560,
+ 108565, 108570, 108575, 108580, 108585, 108590, 108595, 108600, 108605,
+ 108610, 108615, 108620, 108625, 108630, 108635, 108640, 108645, 108650,
+ 108655, 108660, 108665, 108670, 108675, 108680, 108685, 108690, 108695,
+ 108700, 108705, 108710, 108715, 108720, 108725, 108730, 108735, 108740,
+ 108745, 108750, 108755, 108760, 108765, 108770, 108775, 108780, 108785,
+ 108790, 108795, 108800, 108805, 108810, 108815, 108820, 108825, 108830,
+ 108835, 108840, 108847, 108852, 108857, 108862, 108867, 108872, 108877,
+ 108881, 108886, 108891, 108896, 108901, 108906, 108911, 108916, 108921,
+ 108926, 108931, 108936, 108941, 108946, 108951, 108958, 108963, 108968,
+ 108974, 108979, 108984, 108989, 108994, 108999, 109004, 109009, 109014,
+ 109019, 109024, 109029, 109034, 109039, 109044, 109049, 109054, 109059,
+ 109064, 109069, 109074, 109079, 109084, 109089, 109094, 109099, 109104,
+ 109109, 109114, 109119, 109124, 109129, 109134, 109139, 109144, 109149,
+ 109154, 109159, 109164, 109169, 109174, 109179, 109184, 109189, 109196,
+ 109201, 109206, 109213, 109220, 109225, 109230, 109235, 109240, 109245,
+ 109250, 109255, 109260, 109265, 109270, 109275, 109280, 109285, 109290,
+ 109295, 109300, 109305, 109310, 109315, 109320, 109325, 109330, 109335,
+ 109340, 109345, 109352, 109357, 109362, 109367, 109372, 109377, 109382,
+ 109387, 109392, 109397, 109402, 109407, 109412, 109417, 109422, 109427,
+ 109432, 109437, 109442, 109449, 109454, 109459, 109464, 109469, 109474,
+ 109479, 109484, 109490, 109495, 109500, 109505, 109510, 109515, 109520,
+ 109525, 109530, 109537, 109544, 109549, 109554, 109558, 109563, 109567,
+ 109571, 109576, 109583, 109588, 109593, 109602, 109607, 109612, 109617,
+ 109622, 109629, 109636, 109641, 109646, 109651, 109656, 109663, 109668,
+ 109673, 109678, 109683, 109688, 109693, 109698, 109703, 109708, 109713,
+ 109718, 109723, 109730, 109734, 109739, 109744, 109749, 109754, 109758,
+ 109763, 109768, 109773, 109778, 109783, 109788, 109793, 109798, 109803,
+ 109809, 109815, 109821, 109827, 109833, 109839, 109845, 109851, 109857,
+ 109863, 109869, 109875, 109880, 109886, 109892, 109898, 109904, 109910,
+ 109916, 109922, 109928, 109934, 109940, 109946, 109951, 109957, 109963,
+ 109969, 109975, 109981, 109987, 109993, 109999, 110005, 110011, 110017,
+ 110023, 110029, 110035, 110041, 110047, 110053, 110059, 110065, 110071,
+ 110076, 110082, 110088, 110094, 110100, 110106, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110112, 110115, 110119,
+ 110123, 110127, 110130, 110134, 110139, 110143, 110147, 110151, 110155,
+ 110159, 110164, 110169, 110173, 110177, 110180, 110184, 110189, 110194,
+ 110198, 110202, 110206, 110210, 110214, 110218, 110222, 110226, 110230,
+ 110234, 110237, 110241, 110245, 110249, 110253, 110257, 110261, 110267,
+ 110270, 110274, 110278, 110282, 110286, 110290, 110294, 110298, 110302,
+ 110306, 110311, 110316, 110322, 110326, 110330, 110334, 110338, 110342,
+ 110346, 110351, 110354, 110358, 110362, 110366, 110370, 110376, 110380,
+ 110384, 110388, 110392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110396, 110400,
+ 110404, 110410, 110416, 110420, 110425, 110430, 110435, 110440, 110444,
+ 110449, 110454, 110459, 110463, 110468, 110473, 110478, 110482, 110487,
+ 110492, 110497, 110502, 110507, 110512, 110517, 110522, 110526, 110531,
+ 110536, 110541, 110546, 110551, 110556, 110561, 110566, 110571, 110576,
+ 110581, 110588, 110593, 110600, 110605, 110610, 110615, 110620, 110625,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110630, 110634, 110640,
+ 110643, 110646, 110650, 110654, 110658, 110662, 110666, 110670, 110674,
+ 110680, 110686, 110692, 110698, 110704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 104408, 104415, 104422, 104431, 104440, 104447, 104452, 104459,
- 104466, 104475, 104486, 104497, 104502, 104509, 104514, 104519, 104524,
- 104529, 104534, 104539, 104544, 104549, 104554, 104559, 104564, 104571,
- 104578, 104583, 104588, 104593, 104598, 104605, 104612, 104620, 104625,
- 104632, 104637, 104642, 104647, 104652, 104657, 104664, 104671, 104676,
- 104681, 104686, 104691, 104696, 104701, 104706, 104711, 104716, 104721,
- 104726, 104731, 104736, 104741, 104746, 104751, 104756, 104761, 104766,
- 104773, 104778, 104783, 104792, 104799, 104804, 104809, 104814, 104819,
- 104824, 104829, 104834, 104839, 104844, 104849, 104854, 104859, 104864,
- 104869, 104874, 104879, 104884, 104889, 104894, 104899, 104904, 104910,
- 104918, 104924, 104932, 104940, 104948, 104954, 104960, 104966, 104972,
- 104978, 104986, 104996, 105004, 105012, 105018, 105024, 105032, 105040,
- 105046, 105054, 105062, 105070, 105076, 105082, 105088, 105094, 105100,
- 105106, 105114, 105122, 105128, 105134, 105140, 105146, 105152, 105160,
- 105166, 105172, 105178, 105184, 105190, 105196, 105204, 105210, 105216,
- 105222, 105228, 105236, 105244, 105250, 105256, 105262, 105267, 105273,
- 105279, 105286, 105291, 105296, 105301, 105306, 105311, 105316, 105321,
- 105326, 105331, 105340, 105347, 105352, 105357, 105362, 105369, 105374,
- 105379, 105384, 105391, 105396, 105401, 105406, 105411, 105416, 105421,
- 105426, 105431, 105436, 105441, 105446, 105453, 105458, 105465, 105470,
- 105475, 105482, 105487, 105492, 105497, 105502, 105507, 105512, 105517,
- 105522, 105527, 105532, 105537, 105542, 105547, 105552, 105557, 105562,
- 105567, 105572, 105577, 105584, 105589, 105594, 105599, 105604, 105609,
- 105614, 105619, 105624, 105629, 105634, 105639, 105644, 105649, 105656,
- 105661, 105666, 105673, 105678, 105683, 105688, 105693, 105698, 105703,
- 105708, 105713, 105718, 105723, 105730, 105735, 105740, 105745, 105750,
- 105755, 105762, 105769, 105774, 105779, 105784, 105789, 105794, 105799,
- 105804, 105809, 105814, 105819, 105824, 105829, 105834, 105839, 105844,
- 105849, 105854, 105859, 105864, 105869, 105874, 105879, 105884, 105889,
- 105894, 105899, 105904, 105909, 105914, 105919, 105924, 105929, 105934,
- 105939, 105944, 105949, 105956, 105961, 105966, 105971, 105976, 105981,
- 105986, 105991, 105996, 106001, 106006, 106011, 106016, 106021, 106026,
- 106031, 106036, 106041, 106046, 106051, 106056, 106061, 106066, 106071,
- 106076, 106081, 106086, 106091, 106096, 106101, 106106, 106111, 106116,
- 106121, 106126, 106131, 106136, 106141, 106146, 106151, 106156, 106161,
- 106166, 106171, 106176, 106181, 106186, 106191, 106196, 106201, 106206,
- 106211, 106216, 106221, 106226, 106231, 106236, 106241, 106246, 106253,
- 106258, 106263, 106268, 106273, 106278, 106283, 106287, 106292, 106297,
- 106302, 106307, 106312, 106317, 106322, 106327, 106332, 106337, 106342,
- 106347, 106352, 106357, 106364, 106369, 106374, 106380, 106385, 106390,
- 106395, 106400, 106405, 106410, 106415, 106420, 106425, 106430, 106435,
- 106440, 106445, 106450, 106455, 106460, 106465, 106470, 106475, 106480,
- 106485, 106490, 106495, 106500, 106505, 106510, 106515, 106520, 106525,
- 106530, 106535, 106540, 106545, 106550, 106555, 106560, 106565, 106570,
- 106575, 106580, 106585, 106590, 106595, 106602, 106607, 106612, 106619,
- 106626, 106631, 106636, 106641, 106646, 106651, 106656, 106661, 106666,
- 106671, 106676, 106681, 106686, 106691, 106696, 106701, 106706, 106711,
- 106716, 106721, 106726, 106731, 106736, 106741, 106746, 106751, 106758,
- 106763, 106768, 106773, 106778, 106783, 106788, 106793, 106798, 106803,
- 106808, 106813, 106818, 106823, 106828, 106833, 106838, 106843, 106848,
- 106855, 106860, 106865, 106870, 106875, 106880, 106885, 106890, 106896,
- 106901, 106906, 106911, 106916, 106921, 106926, 106931, 106936, 106943,
- 106950, 106955, 106960, 106964, 106969, 106973, 106977, 106982, 106989,
- 106994, 106999, 107008, 107013, 107018, 107023, 107028, 107035, 107042,
- 107047, 107052, 107057, 107062, 107069, 107074, 107079, 107084, 107089,
- 107094, 107099, 107104, 107109, 107114, 107119, 107124, 107129, 107136,
- 107140, 107145, 107150, 107155, 107160, 107164, 107169, 107174, 107179,
- 107184, 107189, 107194, 107199, 107204, 107209, 107215, 107221, 107227,
- 107233, 107239, 107245, 107251, 107257, 107263, 107269, 107275, 107281,
- 107286, 107292, 107298, 107304, 107310, 107316, 107322, 107328, 107334,
- 107340, 107346, 107352, 107357, 107363, 107369, 107375, 107381, 107387,
- 107393, 107399, 107405, 107411, 107417, 107423, 107429, 107435, 107441,
- 107447, 107453, 107459, 107465, 107471, 107477, 107482, 107488, 107494,
- 107500, 107506, 107512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 107518, 107523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110710, 110715, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107529, 107534,
- 107539, 107544, 107551, 107558, 107565, 107572, 107577, 107582, 107587,
- 107592, 107599, 107604, 107611, 107618, 107623, 107628, 107633, 107640,
- 107645, 107650, 107657, 107664, 107669, 107674, 107679, 107686, 107693,
- 107700, 107705, 107710, 107717, 107724, 107731, 107738, 107743, 107748,
- 107753, 107760, 107765, 107770, 107775, 107782, 107791, 107798, 107803,
- 107808, 107813, 107818, 107823, 107828, 107837, 107844, 107849, 107856,
- 107863, 107868, 107873, 107878, 107885, 107890, 107897, 107904, 107909,
- 107914, 107919, 107926, 107933, 107938, 107943, 107950, 107957, 107964,
- 107969, 107974, 107979, 107984, 107991, 108000, 108009, 108014, 108021,
- 108030, 108035, 108040, 108045, 108050, 108057, 108064, 108071, 108078,
- 108083, 108088, 108093, 108100, 108107, 108114, 108119, 108124, 108131,
- 108136, 108143, 108148, 108155, 108160, 108167, 108174, 108179, 108184,
- 108189, 108194, 108199, 108204, 108209, 108214, 108219, 108226, 108233,
- 108240, 108247, 108254, 108263, 108268, 108273, 108280, 108287, 108292,
- 108299, 108306, 108313, 108320, 108327, 108334, 108339, 108344, 108349,
- 108354, 108359, 108368, 108377, 108386, 108395, 108404, 108413, 108422,
- 108431, 108436, 108447, 108458, 108467, 108472, 108477, 108482, 108487,
- 108496, 108503, 108510, 108517, 108524, 108531, 108538, 108547, 108556,
- 108567, 108576, 108587, 108596, 108603, 108612, 108623, 108632, 108641,
- 108650, 108659, 108666, 108673, 108680, 108689, 108698, 108709, 108718,
- 108727, 108738, 108743, 108748, 108759, 108767, 108776, 108785, 108794,
- 108805, 108814, 108823, 108834, 108845, 108856, 108867, 108878, 108889,
- 108896, 108903, 108910, 108917, 108928, 108937, 108944, 108951, 108958,
- 108969, 108980, 108991, 109002, 109013, 109024, 109035, 109046, 109053,
- 109060, 109069, 109078, 109085, 109092, 109099, 109108, 109117, 109126,
- 109133, 109142, 109151, 109160, 109167, 109174, 109179, 109185, 109192,
- 109199, 109206, 109213, 109220, 109227, 109236, 109245, 109254, 109263,
- 109270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109279, 109285, 109290, 109295,
- 109302, 109308, 109314, 109320, 109326, 109332, 109338, 109344, 109348,
- 109352, 109358, 109364, 109370, 109374, 109379, 109384, 109388, 109392,
- 109395, 109401, 109407, 109413, 109419, 109425, 109431, 109437, 109443,
- 109449, 109459, 109469, 109475, 109481, 109491, 109501, 109507, 0, 0,
- 109513, 109521, 109526, 109531, 109537, 109543, 109549, 109555, 109561,
- 109567, 109574, 109581, 109587, 109593, 109599, 109605, 109611, 109617,
- 109623, 109629, 109634, 109640, 109646, 109652, 109658, 109664, 109673,
- 109679, 109684, 109692, 109699, 109706, 109715, 109724, 109733, 109742,
- 109751, 109760, 109769, 109778, 109788, 109798, 109806, 109814, 109823,
- 109832, 109838, 109844, 109850, 109856, 109864, 109872, 109876, 109882,
- 109887, 109893, 109899, 109905, 109911, 109917, 109926, 109931, 109938,
- 109943, 109948, 109953, 109959, 109965, 109971, 109978, 109983, 109988,
- 109993, 109998, 110003, 110009, 110015, 110021, 110027, 110033, 110039,
- 110045, 110051, 110056, 110061, 110066, 110071, 110076, 110081, 110086,
- 110091, 110097, 110103, 110108, 110113, 110118, 110123, 110128, 110134,
- 110141, 110145, 110149, 110153, 110157, 110161, 110165, 110169, 110173,
- 110181, 110191, 110195, 110199, 110205, 110211, 110217, 110223, 110229,
- 110235, 110241, 110247, 110253, 110259, 110265, 110271, 110277, 110283,
- 110287, 110291, 110298, 110304, 110310, 110316, 110321, 110328, 110333,
- 110339, 110345, 110351, 110357, 110362, 110366, 110372, 110376, 110380,
- 110384, 110390, 110396, 110400, 110406, 110412, 110418, 110424, 110430,
- 110438, 110446, 110452, 110458, 110464, 110470, 110482, 110494, 110508,
- 110520, 110532, 110546, 110560, 110574, 110578, 110586, 110594, 110599,
- 110603, 110607, 110611, 110615, 110619, 110623, 110627, 110633, 110639,
- 110645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110651, 110657, 110663, 110669,
- 110675, 110681, 110687, 110693, 110699, 110705, 110711, 110717, 110723,
- 110729, 110735, 110741, 110747, 110753, 110759, 110765, 110771, 110777,
- 110783, 110789, 110795, 110801, 110807, 110813, 110819, 110825, 110831,
- 110837, 110843, 110849, 110855, 110861, 110867, 110873, 110879, 110885,
- 110891, 110897, 110903, 110909, 110915, 110921, 110927, 110933, 110939,
- 110945, 110951, 110957, 110963, 110969, 110975, 110981, 110987, 110993,
- 110999, 111005, 111011, 111017, 111023, 111029, 111035, 111041, 111047,
- 111052, 111057, 111062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111066, 111071,
- 111078, 111085, 111092, 111099, 111104, 111108, 111114, 111118, 111122,
- 111128, 111132, 111136, 111140, 111146, 111153, 111157, 111161, 111165,
- 111169, 111173, 111177, 111183, 111187, 111191, 111195, 111199, 111203,
- 111207, 111211, 111215, 111219, 111223, 111227, 111231, 111236, 111240,
- 111244, 111248, 111252, 111256, 111260, 111264, 111268, 111272, 111279,
- 111283, 111291, 111295, 111299, 111303, 111307, 111311, 111315, 111319,
- 111326, 111330, 111334, 111338, 111342, 111346, 111352, 111356, 111362,
- 111366, 111370, 111374, 111378, 111382, 111386, 111390, 111394, 111398,
- 111402, 111406, 111410, 111414, 111418, 111422, 111426, 111430, 111434,
- 111438, 111446, 111450, 111454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111458,
- 111466, 111474, 111482, 111490, 111498, 111506, 111514, 111522, 111530,
- 111538, 111546, 111554, 111562, 111570, 111578, 111586, 111594, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111602, 111606, 111611, 111616, 111621,
- 111625, 111630, 111635, 111640, 111644, 111649, 111654, 111658, 111662,
- 111666, 111670, 111675, 111680, 111684, 111688, 111693, 111697, 111702,
- 111707, 111712, 111717, 111722, 111726, 111731, 111736, 111741, 111745,
- 111750, 111755, 111760, 111764, 111769, 111774, 111778, 111782, 111786,
- 111790, 111795, 111800, 111804, 111808, 111813, 111817, 111822, 111827,
- 111832, 111837, 111842, 111846, 111851, 111856, 111861, 111865, 111870,
- 111875, 111880, 111884, 111889, 111894, 111898, 111902, 111906, 111910,
- 111915, 111920, 111924, 111928, 111933, 111937, 111942, 111947, 111952,
- 111957, 111962, 111966, 111971, 111976, 111981, 111985, 111990, 0,
- 111995, 111999, 112004, 112009, 112013, 112017, 112021, 112025, 112030,
- 112035, 112039, 112043, 112048, 112052, 112057, 112062, 112067, 112072,
- 112077, 112082, 112088, 112094, 112100, 112105, 112111, 112117, 112123,
- 112128, 112134, 112140, 112145, 112150, 112155, 112160, 112166, 112172,
- 112177, 112182, 112188, 112193, 112199, 112205, 112211, 112217, 112223,
- 112228, 112234, 112240, 112246, 112251, 112257, 112263, 112269, 112274,
- 112280, 112286, 112291, 112296, 112301, 112306, 112312, 112318, 112323,
- 112328, 112334, 112339, 112345, 112351, 112357, 112363, 112369, 0,
- 112373, 112378, 0, 0, 112383, 0, 0, 112388, 112393, 0, 0, 112398, 112402,
- 112406, 112411, 0, 112416, 112420, 112425, 112429, 112434, 112439,
- 112444, 112449, 112454, 112458, 112463, 112468, 0, 112473, 0, 112478,
- 112483, 112487, 112492, 112497, 112501, 112505, 0, 112509, 112514,
- 112519, 112523, 112527, 112532, 112536, 112541, 112546, 112551, 112556,
- 112561, 112566, 112572, 112578, 112584, 112589, 112595, 112601, 112607,
- 112612, 112618, 112624, 112629, 112634, 112639, 112644, 112650, 112656,
- 112661, 112666, 112672, 112677, 112683, 112689, 112695, 112701, 112707,
- 112712, 112718, 112724, 112730, 112735, 112741, 112747, 112753, 112758,
- 112764, 112770, 112775, 112780, 112785, 112790, 112796, 112802, 112807,
- 112812, 112818, 112823, 112829, 112835, 112841, 112847, 112853, 112857,
- 0, 112862, 112867, 112871, 112876, 0, 0, 112881, 112886, 112891, 112895,
- 112899, 112903, 112907, 112912, 0, 112917, 112921, 112926, 112930,
- 112935, 112940, 112945, 0, 112950, 112954, 112959, 112964, 112969,
- 112973, 112978, 112983, 112988, 112992, 112997, 113002, 113006, 113010,
- 113014, 113018, 113023, 113028, 113032, 113036, 113041, 113045, 113050,
- 113055, 113060, 113065, 113070, 113074, 0, 113079, 113084, 113088,
- 113093, 0, 113098, 113102, 113107, 113112, 113116, 0, 113120, 0, 0, 0,
- 113124, 113128, 113133, 113137, 113142, 113147, 113152, 0, 113157,
- 113161, 113166, 113171, 113176, 113180, 113185, 113190, 113195, 113199,
- 113204, 113209, 113213, 113217, 113221, 113225, 113230, 113235, 113239,
- 113243, 113248, 113252, 113257, 113262, 113267, 113272, 113277, 113282,
- 113288, 113294, 113300, 113305, 113311, 113317, 113323, 113328, 113334,
- 113340, 113345, 113350, 113355, 113360, 113366, 113372, 113377, 113382,
- 113388, 113393, 113399, 113405, 113411, 113417, 113423, 113428, 113434,
- 113440, 113446, 113451, 113457, 113463, 113469, 113474, 113480, 113486,
- 113491, 113496, 113501, 113506, 113512, 113518, 113523, 113528, 113534,
- 113539, 113545, 113551, 113557, 113563, 113569, 113573, 113578, 113583,
- 113588, 113592, 113597, 113602, 113607, 113611, 113616, 113621, 113625,
- 113629, 113633, 113637, 113642, 113647, 113651, 113655, 113660, 113664,
- 113669, 113674, 113679, 113684, 113689, 113693, 113698, 113703, 113708,
- 113712, 113717, 113722, 113727, 113731, 113736, 113741, 113745, 113749,
- 113753, 113757, 113762, 113767, 113771, 113775, 113780, 113784, 113789,
- 113794, 113799, 113804, 113809, 113814, 113820, 113826, 113832, 113837,
- 113843, 113849, 113855, 113860, 113866, 113872, 113877, 113882, 113887,
- 113892, 113898, 113904, 113909, 113914, 113920, 113925, 113931, 113937,
- 113943, 113949, 113955, 113960, 113966, 113972, 113978, 113983, 113989,
- 113995, 114001, 114006, 114012, 114018, 114023, 114028, 114033, 114038,
- 114044, 114050, 114055, 114060, 114066, 114071, 114077, 114083, 114089,
- 114095, 114101, 114106, 114112, 114118, 114124, 114129, 114135, 114141,
- 114147, 114152, 114158, 114164, 114169, 114174, 114179, 114184, 114190,
- 114196, 114201, 114206, 114212, 114217, 114223, 114229, 114235, 114241,
- 114247, 114252, 114258, 114264, 114270, 114275, 114281, 114287, 114293,
- 114298, 114304, 114310, 114315, 114320, 114325, 114330, 114336, 114342,
- 114347, 114352, 114358, 114363, 114369, 114375, 114381, 114387, 114393,
- 114399, 114406, 114413, 114420, 114426, 114433, 114440, 114447, 114453,
- 114460, 114467, 114473, 114479, 114485, 114491, 114498, 114505, 114511,
- 114517, 114524, 114530, 114537, 114544, 114551, 114558, 114565, 114571,
- 114578, 114585, 114592, 114598, 114605, 114612, 114619, 114625, 114632,
- 114639, 114645, 114651, 114657, 114663, 114670, 114677, 114683, 114689,
- 114696, 114702, 114709, 114716, 114723, 114730, 114737, 114742, 114748,
- 114754, 114760, 114765, 114771, 114777, 114783, 114788, 114794, 114800,
- 114805, 114810, 114815, 114820, 114826, 114832, 114837, 114842, 114848,
- 114853, 114859, 114865, 114871, 114877, 114883, 114888, 114894, 114900,
- 114906, 114911, 114917, 114923, 114929, 114934, 114940, 114946, 114951,
- 114956, 114961, 114966, 114972, 114978, 114983, 114988, 114994, 114999,
- 115005, 115011, 115017, 115023, 115029, 115035, 0, 0, 115042, 115047,
- 115052, 115057, 115062, 115067, 115072, 115077, 115082, 115087, 115092,
- 115097, 115102, 115107, 115112, 115117, 115122, 115127, 115133, 115138,
- 115143, 115148, 115153, 115158, 115163, 115168, 115172, 115177, 115182,
- 115187, 115192, 115197, 115202, 115207, 115212, 115217, 115222, 115227,
- 115232, 115237, 115242, 115247, 115252, 115257, 115263, 115268, 115273,
- 115278, 115283, 115288, 115293, 115298, 115304, 115309, 115314, 115319,
- 115324, 115329, 115334, 115339, 115344, 115349, 115354, 115359, 115364,
- 115369, 115374, 115379, 115384, 115389, 115394, 115399, 115404, 115409,
- 115414, 115419, 115425, 115430, 115435, 115440, 115445, 115450, 115455,
- 115460, 115464, 115469, 115474, 115479, 115484, 115489, 115494, 115499,
- 115504, 115509, 115514, 115519, 115524, 115529, 115534, 115539, 115544,
- 115549, 115555, 115560, 115565, 115570, 115575, 115580, 115585, 115590,
- 115596, 115601, 115606, 115611, 115616, 115621, 115626, 115632, 115638,
- 115644, 115650, 115656, 115662, 115668, 115674, 115680, 115686, 115692,
- 115698, 115704, 115710, 115716, 115722, 115728, 115735, 115741, 115747,
- 115753, 115759, 115765, 115771, 115777, 115782, 115788, 115794, 115800,
- 115806, 115812, 115818, 115824, 115830, 115836, 115842, 115848, 115854,
- 115860, 115866, 115872, 115878, 115884, 115891, 115897, 115903, 115909,
- 115915, 115921, 115927, 115933, 115940, 115946, 115952, 115958, 115964,
- 115970, 115976, 115982, 115988, 115994, 116000, 116006, 116012, 116018,
- 116024, 116030, 116036, 116042, 116048, 116054, 116060, 116066, 116072,
- 116078, 116085, 116091, 116097, 116103, 116109, 116115, 116121, 116127,
- 116132, 116138, 116144, 116150, 116156, 116162, 116168, 116174, 116180,
- 116186, 116192, 116198, 116204, 116210, 116216, 116222, 116228, 116234,
- 116241, 116247, 116253, 116259, 116265, 116271, 116277, 116283, 116290,
- 116296, 116302, 116308, 116314, 116320, 116326, 116333, 116340, 116347,
- 116354, 116361, 116368, 116375, 116382, 116389, 116396, 116403, 116410,
- 116417, 116424, 116431, 116438, 116445, 116453, 116460, 116467, 116474,
- 116481, 116488, 116495, 116502, 116508, 116515, 116522, 116529, 116536,
- 116543, 116550, 116557, 116564, 116571, 116578, 116585, 116592, 116599,
- 116606, 116613, 116620, 116627, 116635, 116642, 116649, 116656, 116663,
- 116670, 116677, 116684, 116692, 116699, 116706, 116713, 116720, 116727,
- 116734, 116739, 0, 0, 116744, 116749, 116753, 116757, 116761, 116765,
- 116769, 116773, 116777, 116781, 116785, 116790, 116794, 116798, 116802,
- 116806, 116810, 116814, 116818, 116822, 116826, 116831, 116835, 116839,
- 116843, 116847, 116851, 116855, 116859, 116863, 116867, 116873, 116878,
- 116883, 116888, 116893, 116898, 116903, 116908, 116913, 116918, 116924,
- 116929, 116934, 116939, 116944, 116949, 116954, 116959, 116964, 116969,
- 116976, 116983, 116990, 116997, 117004, 117011, 117017, 117024, 117031,
- 117038, 117046, 117054, 117062, 117070, 117078, 117086, 117093, 117100,
- 117107, 117115, 117123, 117131, 117139, 117147, 117155, 117162, 117169,
- 117176, 117184, 117192, 117200, 117208, 117216, 117224, 117229, 117234,
- 117239, 117244, 117249, 117254, 117259, 117264, 117269, 0, 0, 0, 0,
- 117274, 117279, 117283, 117287, 117291, 117295, 117299, 117303, 117307,
- 117311, 117315, 117319, 117323, 117327, 117331, 117335, 117339, 117343,
- 117347, 117351, 117355, 117359, 117363, 117367, 117371, 117375, 117379,
- 117383, 117387, 117391, 117395, 117399, 117403, 117407, 117411, 117415,
- 117419, 117423, 117427, 117431, 117435, 117439, 117443, 117447, 117451,
- 117455, 117459, 117463, 117467, 117471, 117475, 117480, 117484, 117488,
- 117492, 117496, 117500, 117504, 117508, 117512, 117516, 117520, 117524,
- 117528, 117532, 117536, 117540, 117544, 117548, 117552, 117556, 117560,
- 117564, 117568, 117572, 117576, 117580, 117584, 117588, 117592, 117596,
- 117600, 117604, 117608, 117612, 117616, 117620, 117624, 117628, 117632,
- 117636, 117640, 117644, 117648, 117652, 117656, 117660, 117664, 117668,
- 117672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117676, 117682, 117691,
- 117699, 117707, 117716, 117725, 117734, 117743, 117752, 117761, 117770,
- 117779, 117788, 117797, 0, 0, 117806, 117815, 117823, 117831, 117840,
- 117849, 117858, 117867, 117876, 117885, 117894, 117903, 117912, 117921,
- 0, 0, 117930, 117939, 117947, 117955, 117964, 117973, 117982, 117991,
- 118000, 118009, 118018, 118027, 118036, 118045, 118054, 0, 118061,
- 118070, 118078, 118086, 118095, 118104, 118113, 118122, 118131, 118140,
- 118149, 118158, 118167, 118176, 118185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118192,
- 118199, 118204, 118208, 118212, 118216, 118221, 118226, 118231, 118236,
- 118241, 0, 0, 0, 0, 0, 118246, 118251, 118257, 118263, 118269, 118274,
- 118280, 118286, 118292, 118297, 118303, 118309, 118314, 118319, 118324,
- 118329, 118335, 118341, 118346, 118351, 118357, 118362, 118368, 118374,
- 118380, 118386, 118392, 118402, 118409, 118415, 118418, 0, 118421,
- 118426, 118432, 118438, 118444, 118449, 118455, 118461, 118467, 118472,
- 118478, 118484, 118489, 118494, 118499, 118504, 118510, 118516, 118521,
- 118526, 118532, 118537, 118543, 118549, 118555, 118561, 118567, 118570,
- 118573, 118576, 118579, 118582, 118585, 118591, 118598, 118605, 118612,
- 118618, 118625, 118632, 118639, 118645, 118652, 118659, 118665, 118671,
- 118677, 118683, 118690, 118697, 118703, 118709, 118716, 118722, 118729,
- 118736, 118743, 118750, 0, 0, 0, 0, 0, 0, 118757, 118763, 118770, 118777,
- 118784, 118790, 118797, 118804, 118811, 118817, 118824, 118831, 118837,
- 118843, 118849, 118855, 118862, 118869, 118875, 118881, 118888, 118894,
- 118901, 118908, 118915, 118922, 118929, 118938, 118942, 118945, 118949,
- 118953, 118957, 118960, 118963, 118966, 118969, 118972, 118975, 118978,
- 118981, 118984, 118990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 110721, 110726, 110731, 110736, 110743, 110750, 110757, 110764, 110769,
+ 110774, 110779, 110784, 110791, 110796, 110803, 110810, 110815, 110820,
+ 110825, 110832, 110837, 110842, 110849, 110856, 110861, 110866, 110871,
+ 110878, 110885, 110892, 110897, 110902, 110909, 110916, 110923, 110930,
+ 110935, 110940, 110945, 110952, 110957, 110962, 110967, 110974, 110983,
+ 110990, 110995, 111000, 111005, 111010, 111015, 111020, 111029, 111036,
+ 111041, 111048, 111055, 111060, 111065, 111070, 111077, 111082, 111089,
+ 111096, 111101, 111106, 111111, 111118, 111125, 111130, 111135, 111142,
+ 111149, 111156, 111161, 111166, 111171, 111176, 111183, 111192, 111201,
+ 111206, 111213, 111222, 111227, 111232, 111237, 111242, 111249, 111256,
+ 111263, 111270, 111275, 111280, 111285, 111292, 111299, 111306, 111311,
+ 111316, 111323, 111328, 111335, 111340, 111347, 111352, 111359, 111366,
+ 111371, 111376, 111381, 111386, 111391, 111396, 111401, 111406, 111411,
+ 111418, 111425, 111432, 111439, 111446, 111455, 111460, 111465, 111472,
+ 111479, 111484, 111491, 111498, 111505, 111512, 111519, 111526, 111531,
+ 111536, 111541, 111546, 111551, 111560, 111569, 111578, 111587, 111596,
+ 111605, 111614, 111623, 111628, 111639, 111650, 111659, 111664, 111669,
+ 111674, 111679, 111688, 111695, 111702, 111709, 111716, 111723, 111730,
+ 111739, 111748, 111759, 111768, 111779, 111788, 111795, 111804, 111815,
+ 111824, 111833, 111842, 111851, 111858, 111865, 111872, 111881, 111890,
+ 111901, 111910, 111919, 111930, 111935, 111940, 111951, 111959, 111968,
+ 111977, 111986, 111997, 112006, 112015, 112026, 112037, 112048, 112059,
+ 112070, 112081, 112088, 112095, 112102, 112109, 112120, 112129, 112136,
+ 112143, 112150, 112161, 112172, 112183, 112194, 112205, 112216, 112227,
+ 112238, 112245, 112252, 112261, 112270, 112277, 112284, 112291, 112300,
+ 112309, 112318, 112325, 112334, 112343, 112352, 112359, 112366, 112371,
+ 112377, 112384, 112391, 112398, 112405, 112412, 112419, 112428, 112437,
+ 112446, 112455, 112462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112471, 112477,
+ 112482, 112487, 112494, 112500, 112506, 112512, 112518, 112524, 112530,
+ 112536, 112540, 112544, 112550, 112556, 112562, 112566, 112571, 112576,
+ 112580, 112584, 112587, 112593, 112599, 112605, 112611, 112617, 112623,
+ 112629, 112635, 112641, 112651, 112661, 112667, 112673, 112683, 112693,
+ 112699, 0, 0, 112705, 112713, 112718, 112723, 112729, 112735, 112741,
+ 112747, 112753, 112759, 112766, 112773, 112779, 112785, 112791, 112797,
+ 112803, 112809, 112815, 112821, 112826, 112832, 112838, 112844, 112850,
+ 112856, 112865, 112871, 112876, 112884, 112891, 112898, 112907, 112916,
+ 112925, 112934, 112943, 112952, 112961, 112970, 112980, 112990, 112998,
+ 113006, 113015, 113024, 113030, 113036, 113042, 113048, 113056, 113064,
+ 113068, 113074, 113079, 113085, 113091, 113097, 113103, 113109, 113118,
+ 113123, 113130, 113135, 113140, 113145, 113151, 113157, 113163, 113170,
+ 113175, 113180, 113185, 113190, 113195, 113201, 113207, 113213, 113219,
+ 113225, 113231, 113237, 113243, 113248, 113253, 113258, 113263, 113268,
+ 113273, 113278, 113283, 113289, 113295, 113300, 113305, 113310, 113315,
+ 113320, 113326, 113333, 113337, 113341, 113345, 113349, 113353, 113357,
+ 113361, 113365, 113373, 113383, 113387, 113391, 113397, 113403, 113409,
+ 113415, 113421, 113427, 113433, 113439, 113445, 113451, 113457, 113463,
+ 113469, 113475, 113479, 113483, 113490, 113496, 113502, 113508, 113513,
+ 113520, 113525, 113531, 113537, 113543, 113549, 113554, 113558, 113564,
+ 113568, 113572, 113576, 113582, 113588, 113592, 113598, 113604, 113610,
+ 113616, 113622, 113630, 113638, 113644, 113650, 113656, 113662, 113674,
+ 113686, 113700, 113712, 113724, 113738, 113752, 113766, 113770, 113778,
+ 113786, 113791, 113795, 113799, 113803, 113807, 113811, 113815, 113819,
+ 113825, 113831, 113837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113843, 113849,
+ 113855, 113861, 113867, 113873, 113879, 113885, 113891, 113897, 113903,
+ 113909, 113915, 113921, 113927, 113933, 113939, 113945, 113951, 113957,
+ 113963, 113969, 113975, 113981, 113987, 113993, 113999, 114005, 114011,
+ 114017, 114023, 114029, 114035, 114041, 114047, 114053, 114059, 114065,
+ 114071, 114077, 114083, 114089, 114095, 114101, 114107, 114113, 114119,
+ 114125, 114131, 114137, 114143, 114149, 114155, 114161, 114167, 114173,
+ 114179, 114185, 114191, 114197, 114203, 114209, 114215, 114221, 114227,
+ 114233, 114239, 114244, 114249, 114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 114258, 114263, 114270, 114277, 114284, 114291, 114296, 114300, 114306,
+ 114310, 114314, 114320, 114324, 114328, 114332, 114338, 114345, 114349,
+ 114353, 114357, 114361, 114365, 114369, 114375, 114379, 114383, 114387,
+ 114391, 114395, 114399, 114403, 114407, 114411, 114415, 114419, 114423,
+ 114428, 114432, 114436, 114440, 114444, 114448, 114452, 114456, 114460,
+ 114464, 114471, 114475, 114483, 114487, 114491, 114495, 114499, 114503,
+ 114507, 114511, 114518, 114522, 114526, 114530, 114534, 114538, 114544,
+ 114548, 114554, 114558, 114562, 114566, 114570, 114574, 114578, 114582,
+ 114586, 114590, 114594, 114598, 114602, 114606, 114610, 114614, 114618,
+ 114622, 114626, 114630, 114638, 114642, 114646, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 114650, 114658, 114666, 114674, 114682, 114690, 114698, 114706,
+ 114714, 114722, 114730, 114738, 114746, 114754, 114762, 114770, 114778,
+ 114786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114794, 114798, 114803,
+ 114808, 114813, 114817, 114822, 114827, 114832, 114836, 114841, 114846,
+ 114850, 114854, 114859, 114863, 114868, 114873, 114877, 114882, 114887,
+ 114891, 114896, 114901, 114906, 114911, 114916, 114920, 114925, 114930,
+ 114935, 114939, 114944, 114949, 114954, 114958, 114963, 114968, 114972,
+ 114976, 114981, 114985, 114990, 114995, 114999, 115004, 115009, 115013,
+ 115018, 115023, 115028, 115033, 115038, 115042, 115047, 115052, 115057,
+ 115061, 115066, 115071, 115076, 115080, 115085, 115090, 115094, 115098,
+ 115103, 115107, 115112, 115117, 115121, 115126, 115131, 115135, 115140,
+ 115145, 115150, 115155, 115160, 115164, 115169, 115174, 115179, 115183,
+ 115188, 0, 115193, 115197, 115202, 115207, 115211, 115215, 115220,
+ 115224, 115229, 115234, 115238, 115243, 115248, 115252, 115257, 115262,
+ 115267, 115272, 115277, 115282, 115288, 115294, 115300, 115305, 115311,
+ 115317, 115323, 115328, 115334, 115340, 115345, 115350, 115356, 115361,
+ 115367, 115373, 115378, 115384, 115390, 115395, 115401, 115407, 115413,
+ 115419, 115425, 115430, 115436, 115442, 115448, 115453, 115459, 115465,
+ 115471, 115476, 115482, 115488, 115493, 115498, 115504, 115509, 115515,
+ 115521, 115526, 115532, 115538, 115543, 115549, 115555, 115561, 115567,
+ 115573, 0, 115577, 115582, 0, 0, 115587, 0, 0, 115592, 115597, 0, 0,
+ 115602, 115607, 115611, 115616, 0, 115621, 115626, 115631, 115635,
+ 115640, 115645, 115650, 115655, 115660, 115664, 115669, 115674, 0,
+ 115679, 0, 115684, 115689, 115693, 115698, 115703, 115707, 115711, 0,
+ 115716, 115721, 115726, 115730, 115735, 115740, 115744, 115749, 115754,
+ 115759, 115764, 115769, 115774, 115780, 115786, 115792, 115797, 115803,
+ 115809, 115815, 115820, 115826, 115832, 115837, 115842, 115848, 115853,
+ 115859, 115865, 115870, 115876, 115882, 115887, 115893, 115899, 115905,
+ 115911, 115917, 115922, 115928, 115934, 115940, 115945, 115951, 115957,
+ 115963, 115968, 115974, 115980, 115985, 115990, 115996, 116001, 116007,
+ 116013, 116018, 116024, 116030, 116035, 116041, 116047, 116053, 116059,
+ 116065, 116069, 0, 116074, 116079, 116083, 116088, 0, 0, 116093, 116098,
+ 116103, 116107, 116111, 116116, 116120, 116125, 0, 116130, 116135,
+ 116140, 116144, 116149, 116154, 116159, 0, 116164, 116168, 116173,
+ 116178, 116183, 116187, 116192, 116197, 116202, 116206, 116211, 116216,
+ 116220, 116224, 116229, 116233, 116238, 116243, 116247, 116252, 116257,
+ 116261, 116266, 116271, 116276, 116281, 116286, 116290, 0, 116295,
+ 116300, 116304, 116309, 0, 116314, 116318, 116323, 116328, 116332, 0,
+ 116336, 0, 0, 0, 116340, 116345, 116350, 116354, 116359, 116364, 116369,
+ 0, 116374, 116378, 116383, 116388, 116393, 116397, 116402, 116407,
+ 116412, 116416, 116421, 116426, 116430, 116434, 116439, 116443, 116448,
+ 116453, 116457, 116462, 116467, 116471, 116476, 116481, 116486, 116491,
+ 116496, 116501, 116507, 116513, 116519, 116524, 116530, 116536, 116542,
+ 116547, 116553, 116559, 116564, 116569, 116575, 116580, 116586, 116592,
+ 116597, 116603, 116609, 116614, 116620, 116626, 116632, 116638, 116644,
+ 116649, 116655, 116661, 116667, 116672, 116678, 116684, 116690, 116695,
+ 116701, 116707, 116712, 116717, 116723, 116728, 116734, 116740, 116745,
+ 116751, 116757, 116762, 116768, 116774, 116780, 116786, 116792, 116796,
+ 116801, 116806, 116811, 116815, 116820, 116825, 116830, 116834, 116839,
+ 116844, 116848, 116852, 116857, 116861, 116866, 116871, 116875, 116880,
+ 116885, 116889, 116894, 116899, 116904, 116909, 116914, 116918, 116923,
+ 116928, 116933, 116937, 116942, 116947, 116952, 116956, 116961, 116966,
+ 116970, 116974, 116979, 116983, 116988, 116993, 116997, 117002, 117007,
+ 117011, 117016, 117021, 117026, 117031, 117036, 117041, 117047, 117053,
+ 117059, 117064, 117070, 117076, 117082, 117087, 117093, 117099, 117104,
+ 117109, 117115, 117120, 117126, 117132, 117137, 117143, 117149, 117154,
+ 117160, 117166, 117172, 117178, 117184, 117189, 117195, 117201, 117207,
+ 117212, 117218, 117224, 117230, 117235, 117241, 117247, 117252, 117257,
+ 117263, 117268, 117274, 117280, 117285, 117291, 117297, 117302, 117308,
+ 117314, 117320, 117326, 117332, 117337, 117343, 117349, 117355, 117360,
+ 117366, 117372, 117378, 117383, 117389, 117395, 117400, 117405, 117411,
+ 117416, 117422, 117428, 117433, 117439, 117445, 117450, 117456, 117462,
+ 117468, 117474, 117480, 117485, 117491, 117497, 117503, 117508, 117514,
+ 117520, 117526, 117531, 117537, 117543, 117548, 117553, 117559, 117564,
+ 117570, 117576, 117581, 117587, 117593, 117598, 117604, 117610, 117616,
+ 117622, 117628, 117634, 117641, 117648, 117655, 117661, 117668, 117675,
+ 117682, 117688, 117695, 117702, 117708, 117714, 117721, 117727, 117734,
+ 117741, 117747, 117754, 117761, 117767, 117774, 117781, 117788, 117795,
+ 117802, 117808, 117815, 117822, 117829, 117835, 117842, 117849, 117856,
+ 117862, 117869, 117876, 117882, 117888, 117895, 117901, 117908, 117915,
+ 117921, 117928, 117935, 117941, 117948, 117955, 117962, 117969, 117976,
+ 117981, 117987, 117993, 117999, 118004, 118010, 118016, 118022, 118027,
+ 118033, 118039, 118044, 118049, 118055, 118060, 118066, 118072, 118077,
+ 118083, 118089, 118094, 118100, 118106, 118112, 118118, 118124, 118129,
+ 118135, 118141, 118147, 118152, 118158, 118164, 118170, 118175, 118181,
+ 118187, 118192, 118197, 118203, 118208, 118214, 118220, 118225, 118231,
+ 118237, 118242, 118248, 118254, 118260, 118266, 118272, 118278, 0, 0,
+ 118285, 118290, 118295, 118300, 118305, 118310, 118315, 118320, 118325,
+ 118330, 118335, 118340, 118345, 118350, 118355, 118360, 118365, 118370,
+ 118376, 118381, 118386, 118391, 118396, 118401, 118406, 118411, 118415,
+ 118420, 118425, 118430, 118435, 118440, 118445, 118450, 118455, 118460,
+ 118465, 118470, 118475, 118480, 118485, 118490, 118495, 118500, 118506,
+ 118511, 118516, 118521, 118526, 118531, 118536, 118541, 118547, 118552,
+ 118557, 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597,
+ 118602, 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642,
+ 118647, 118652, 118657, 118662, 118668, 118673, 118678, 118683, 118688,
+ 118693, 118698, 118703, 118707, 118712, 118717, 118722, 118727, 118732,
+ 118737, 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777,
+ 118782, 118787, 118792, 118798, 118803, 118808, 118813, 118818, 118823,
+ 118828, 118833, 118839, 118844, 118849, 118854, 118859, 118864, 118869,
+ 118875, 118881, 118887, 118893, 118899, 118905, 118911, 118917, 118923,
+ 118929, 118935, 118941, 118947, 118953, 118959, 118965, 118971, 118978,
+ 118984, 118990, 118996, 119002, 119008, 119014, 119020, 119025, 119031,
+ 119037, 119043, 119049, 119055, 119061, 119067, 119073, 119079, 119085,
+ 119091, 119097, 119103, 119109, 119115, 119121, 119127, 119134, 119140,
+ 119146, 119152, 119158, 119164, 119170, 119176, 119183, 119189, 119195,
+ 119201, 119207, 119213, 119219, 119225, 119231, 119237, 119243, 119249,
+ 119255, 119261, 119267, 119273, 119279, 119285, 119291, 119297, 119303,
+ 119309, 119315, 119321, 119328, 119334, 119340, 119346, 119352, 119358,
+ 119364, 119370, 119375, 119381, 119387, 119393, 119399, 119405, 119411,
+ 119417, 119423, 119429, 119435, 119441, 119447, 119453, 119459, 119465,
+ 119471, 119477, 119484, 119490, 119496, 119502, 119508, 119514, 119520,
+ 119526, 119533, 119539, 119545, 119551, 119557, 119563, 119569, 119576,
+ 119583, 119590, 119597, 119604, 119611, 119618, 119625, 119632, 119639,
+ 119646, 119653, 119660, 119667, 119674, 119681, 119688, 119696, 119703,
+ 119710, 119717, 119724, 119731, 119738, 119745, 119751, 119758, 119765,
+ 119772, 119779, 119786, 119793, 119800, 119807, 119814, 119821, 119828,
+ 119835, 119842, 119849, 119856, 119863, 119870, 119878, 119885, 119892,
+ 119899, 119906, 119913, 119920, 119927, 119935, 119942, 119949, 119956,
+ 119963, 119970, 119977, 119982, 0, 0, 119987, 119992, 119996, 120000,
+ 120004, 120008, 120012, 120016, 120020, 120024, 120028, 120033, 120037,
+ 120041, 120045, 120049, 120053, 120057, 120061, 120065, 120069, 120074,
+ 120078, 120082, 120086, 120090, 120094, 120098, 120102, 120106, 120110,
+ 120116, 120121, 120126, 120131, 120136, 120141, 120146, 120151, 120156,
+ 120161, 120167, 120172, 120177, 120182, 120187, 120192, 120197, 120202,
+ 120207, 120212, 120216, 120220, 120224, 0, 120228, 120232, 120236,
+ 120240, 120244, 120248, 120252, 120256, 120260, 120264, 120268, 120272,
+ 120276, 120280, 120284, 120288, 120292, 120296, 120300, 120304, 120308,
+ 120312, 120316, 120320, 120326, 120332, 120338, 0, 120344, 120349, 0,
+ 120354, 0, 0, 120359, 0, 120364, 120369, 120374, 120379, 120384, 120389,
+ 120394, 120399, 120404, 120409, 0, 120414, 120419, 120424, 120429, 0,
+ 120434, 0, 120439, 0, 0, 0, 0, 0, 0, 120444, 0, 0, 0, 0, 120450, 0,
+ 120456, 0, 120462, 0, 120468, 120474, 120480, 0, 120486, 120492, 0,
+ 120498, 0, 0, 120504, 0, 120510, 0, 120516, 0, 120522, 0, 120530, 0,
+ 120538, 120544, 0, 120550, 0, 0, 120556, 120562, 120568, 120574, 0,
+ 120580, 120586, 120592, 120598, 120604, 120610, 120616, 0, 120622,
+ 120628, 120634, 120640, 0, 120646, 120652, 120658, 120664, 0, 120672, 0,
+ 120680, 120686, 120692, 120698, 120704, 120710, 120716, 120722, 120728,
+ 120734, 0, 120740, 120746, 120752, 120758, 120764, 120770, 120776,
+ 120782, 120788, 120794, 120800, 120806, 120812, 120818, 120824, 120830,
+ 120836, 0, 0, 0, 0, 0, 120842, 120847, 120852, 0, 120857, 120862, 120867,
+ 120872, 120877, 0, 120882, 120887, 120892, 120897, 120902, 120907,
+ 120912, 120917, 120922, 120927, 120932, 120937, 120942, 120947, 120952,
+ 120957, 120962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 120967, 120977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 120985, 120992, 120999, 121006, 121013, 121020, 121027,
+ 121033, 121040, 121047, 121054, 121062, 121070, 121078, 121086, 121094,
+ 121102, 121109, 121116, 121123, 121131, 121139, 121147, 121155, 121163,
+ 121171, 121178, 121185, 121192, 121200, 121208, 121216, 121224, 121232,
+ 121240, 121245, 121250, 121255, 121260, 121265, 121270, 121275, 121280,
+ 121285, 0, 0, 0, 0, 121290, 121295, 121299, 121303, 121307, 121311,
+ 121315, 121319, 121323, 121327, 121331, 121335, 121339, 121343, 121347,
+ 121351, 121355, 121359, 121363, 121367, 121371, 121375, 121379, 121383,
+ 121387, 121391, 121395, 121399, 121403, 121407, 121411, 121415, 121419,
+ 121423, 121427, 121431, 121435, 121439, 121443, 121447, 121451, 121455,
+ 121459, 121463, 121467, 121471, 121475, 121479, 121483, 121487, 121491,
+ 121496, 121500, 121504, 121508, 121512, 121516, 121520, 121524, 121528,
+ 121532, 121536, 121540, 121544, 121548, 121552, 121556, 121560, 121564,
+ 121568, 121572, 121576, 121580, 121584, 121588, 121592, 121596, 121600,
+ 121604, 121608, 121612, 121616, 121620, 121624, 121628, 121632, 121636,
+ 121640, 121644, 121648, 121652, 121656, 121660, 121664, 121668, 121672,
+ 121676, 121680, 121684, 121688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 121692, 121698, 121707, 121715, 121723, 121732, 121741, 121750, 121759,
+ 121768, 121777, 121786, 121795, 121804, 121813, 0, 0, 121822, 121831,
+ 121839, 121847, 121856, 121865, 121874, 121883, 121892, 121901, 121910,
+ 121919, 121928, 121937, 0, 0, 121946, 121955, 121963, 121971, 121980,
+ 121989, 121998, 122007, 122016, 122025, 122034, 122043, 122052, 122061,
+ 122070, 0, 122077, 122086, 122094, 122102, 122111, 122120, 122129,
+ 122138, 122147, 122156, 122165, 122174, 122183, 122192, 122201, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 122208, 122215, 122220, 122224, 122228, 122232, 122237,
+ 122242, 122247, 122252, 122257, 0, 0, 0, 0, 0, 122262, 122267, 122273,
+ 122279, 122285, 122290, 122296, 122302, 122308, 122313, 122319, 122325,
+ 122330, 122335, 122341, 122346, 122352, 122358, 122363, 122369, 122375,
+ 122380, 122386, 122392, 122398, 122404, 122410, 122421, 122428, 122434,
+ 122437, 0, 122440, 122445, 122451, 122457, 122463, 122468, 122474,
+ 122480, 122486, 122491, 122497, 122503, 122508, 122513, 122519, 122524,
+ 122530, 122536, 122541, 122547, 122553, 122558, 122564, 122570, 122576,
+ 122582, 122588, 122591, 122594, 122597, 122600, 122603, 122606, 122612,
+ 122619, 122626, 122633, 122639, 122646, 122653, 122660, 122666, 122673,
+ 122680, 122686, 122692, 122699, 122705, 122712, 122719, 122725, 122732,
+ 122739, 122745, 122752, 122759, 122766, 122773, 122780, 122785, 0, 0, 0,
+ 0, 122790, 122796, 122803, 122810, 122817, 122823, 122830, 122837,
+ 122844, 122850, 122857, 122864, 122870, 122876, 122883, 122889, 122896,
+ 122903, 122909, 122916, 122923, 122929, 122936, 122943, 122950, 122957,
+ 122964, 122973, 122977, 122980, 122983, 122987, 122991, 122994, 122997,
+ 123000, 123003, 123006, 123009, 123012, 123015, 123018, 123024, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118993, 119000, 119008, 119016, 119024,
- 119031, 119039, 119047, 119055, 119062, 119070, 119078, 119085, 119092,
- 119099, 119106, 119114, 119122, 119129, 119136, 119144, 119151, 119159,
- 119167, 119175, 119183, 119191, 119195, 119199, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 119203, 119209, 119215, 119221, 119225, 119231, 119237,
- 119243, 119249, 119255, 119261, 119267, 119273, 119279, 119285, 119291,
- 119297, 119303, 119309, 119315, 119321, 119327, 119333, 119339, 119345,
- 119351, 119357, 119363, 119369, 119375, 119381, 119387, 119393, 119399,
- 119405, 119411, 119417, 119423, 119429, 119435, 119441, 119447, 119453,
- 0, 0, 0, 0, 0, 119459, 119470, 119481, 119492, 119503, 119514, 119525,
- 119536, 119547, 0, 0, 0, 0, 0, 0, 0, 119558, 119562, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119566, 119568, 119570,
- 119574, 119579, 119584, 119586, 119592, 119597, 119599, 119605, 119609,
- 119611, 119615, 119621, 119627, 119633, 119638, 119642, 119649, 119656,
- 119663, 119668, 119675, 119682, 119689, 119693, 119699, 119708, 119717,
- 119724, 119729, 119733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 119737, 119739, 119741, 119745, 119749, 119753, 0, 119755, 119757,
- 119761, 119763, 119765, 119767, 119769, 119774, 119779, 119781, 119787,
- 119791, 119795, 119803, 119805, 119807, 119809, 119811, 119813, 119815,
- 119817, 119819, 119821, 119823, 119827, 119831, 119833, 119835, 119837,
- 119839, 119841, 119846, 119852, 119856, 119860, 119864, 119868, 119873,
- 119877, 119879, 119881, 119885, 119891, 119893, 119895, 119897, 119901,
- 119910, 119916, 119920, 119924, 119926, 119928, 119931, 119933, 119935,
- 119937, 119941, 119943, 119947, 119952, 119954, 119959, 119965, 119972,
- 119976, 119980, 119984, 119988, 119994, 0, 0, 0, 119998, 120000, 120004,
- 120008, 120010, 120014, 120018, 120020, 120024, 120026, 120030, 120034,
- 120038, 120042, 120046, 120050, 120054, 120058, 120064, 120068, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 120072, 120076, 120080, 120084, 120091,
- 120093, 120097, 120099, 120101, 120105, 120109, 120113, 120115, 120119,
- 120123, 120127, 120131, 120135, 120137, 120141, 120143, 120149, 120152,
- 120157, 120159, 120161, 120164, 120166, 120168, 120171, 120178, 120185,
- 120192, 120197, 120201, 120203, 120205, 0, 120207, 120209, 120213,
- 120217, 120221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 120223, 120227, 120232, 120236, 120242, 120248, 120250, 120252,
- 120258, 120260, 120264, 120268, 120270, 120274, 120276, 120280, 120284,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120288, 120290, 120292,
- 120294, 120298, 120300, 120302, 120304, 120306, 120308, 120310, 120312,
- 120314, 120316, 120318, 120320, 120322, 120324, 120326, 120328, 120330,
- 120332, 120334, 120336, 120338, 120340, 120342, 120346, 120348, 120350,
- 120352, 120356, 120358, 120362, 120364, 120366, 120370, 120374, 120380,
- 120382, 120384, 120386, 120388, 120392, 120396, 120398, 120402, 120406,
- 120410, 120414, 120418, 120422, 120426, 120430, 120434, 120438, 120442,
- 120446, 120450, 120454, 120458, 120462, 120466, 0, 120470, 0, 120472,
- 120474, 120476, 120478, 120480, 120488, 120496, 120504, 120512, 120517,
- 120522, 120527, 120531, 120535, 120540, 120545, 120547, 120551, 120553,
- 120555, 120557, 120559, 120561, 120563, 120565, 120569, 120571, 120573,
- 120575, 120579, 120583, 120587, 120591, 120595, 120597, 120603, 120609,
- 120611, 120613, 120615, 120617, 120619, 120628, 120635, 120642, 120646,
- 120653, 120658, 120665, 120674, 120679, 120683, 120687, 120689, 120693,
- 120695, 120699, 120703, 120705, 120709, 120713, 120717, 120719, 120721,
- 120727, 120729, 120731, 120733, 120737, 120741, 120743, 120747, 120749,
- 120751, 120754, 120758, 120760, 120764, 120766, 120768, 120773, 120775,
- 120779, 120783, 120786, 120790, 120794, 120798, 120802, 120806, 120810,
- 120814, 120819, 120823, 120827, 120836, 120841, 120844, 120846, 120849,
- 120852, 120857, 120859, 120862, 120867, 120871, 120874, 120878, 120882,
- 120885, 120890, 120894, 120898, 120902, 120906, 120912, 120918, 120924,
- 120930, 120935, 120946, 120948, 120952, 120954, 120956, 120960, 120964,
- 120966, 120970, 120976, 120981, 120987, 120989, 120993, 120997, 121004,
- 121011, 121015, 121017, 121019, 121023, 121025, 121029, 121033, 121037,
- 121039, 121041, 121048, 121052, 121056, 121060, 121064, 121068, 121070,
- 121074, 121076, 121078, 121082, 121084, 121088, 121092, 121098, 121102,
- 121106, 121110, 121112, 121115, 121119, 121126, 121135, 121144, 121153,
- 121162, 121164, 121168, 121170, 121174, 121185, 121189, 121195, 121201,
- 121206, 0, 121208, 121212, 121214, 121216, 0, 0, 0, 121218, 121223,
- 121234, 121250, 121263, 121276, 121280, 121284, 121290, 121292, 121300,
- 121308, 121310, 121314, 121320, 121326, 121333, 121340, 121342, 121344,
- 121348, 121350, 121356, 121358, 121361, 121365, 121371, 121377, 121388,
- 121394, 121401, 121409, 121413, 121421, 121429, 121435, 121441, 121448,
- 121450, 121454, 121456, 121458, 121463, 121465, 121467, 121469, 121471,
- 121475, 121486, 121492, 121496, 121500, 121504, 121510, 121516, 121522,
- 121528, 121533, 121538, 121544, 121550, 121557, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121564, 121571, 121578, 121585, 121593,
- 121601, 121609, 121617, 121625, 121633, 121641, 121649, 121657, 121663,
- 121669, 121675, 121681, 121687, 121693, 121699, 121705, 121711, 121717,
- 121723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 123027, 123034, 123042, 123050, 123058, 123065, 123073, 123081, 123089,
+ 123096, 123104, 123112, 123119, 123126, 123134, 123141, 123149, 123157,
+ 123164, 123172, 123180, 123187, 123195, 123203, 123211, 123219, 123227,
+ 123231, 123235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123238, 123244,
+ 123250, 123256, 123260, 123266, 123272, 123278, 123284, 123290, 123296,
+ 123302, 123308, 123314, 123320, 123326, 123332, 123338, 123344, 123350,
+ 123356, 123362, 123368, 123374, 123380, 123386, 123392, 123398, 123404,
+ 123410, 123416, 123422, 123428, 123434, 123440, 123446, 123452, 123458,
+ 123464, 123470, 123476, 123482, 123488, 0, 0, 0, 0, 0, 123494, 123505,
+ 123516, 123527, 123538, 123549, 123560, 123571, 123582, 0, 0, 0, 0, 0, 0,
+ 0, 123593, 123597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 123601, 123603, 123605, 123609, 123614, 123619, 123621,
+ 123627, 123632, 123634, 123640, 123644, 123646, 123650, 123656, 123662,
+ 123668, 123673, 123677, 123684, 123691, 123698, 123703, 123710, 123717,
+ 123724, 123728, 123734, 123743, 123752, 123759, 123764, 123768, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123772, 123774, 123776, 123780,
+ 123784, 123788, 0, 123790, 123792, 123796, 123798, 123800, 123802,
+ 123804, 123809, 123814, 123816, 123822, 123826, 123830, 123838, 123840,
+ 123842, 123844, 123846, 123848, 123850, 123852, 123854, 123856, 123858,
+ 123862, 123866, 123868, 123870, 123872, 123874, 123876, 123881, 123887,
+ 123891, 123895, 123899, 123903, 123908, 123912, 123914, 123916, 123920,
+ 123926, 123928, 123930, 123932, 123936, 123945, 123951, 123955, 123959,
+ 123961, 123963, 123966, 123968, 123970, 123972, 123976, 123978, 123982,
+ 123987, 123989, 123994, 124000, 124007, 124011, 124015, 124019, 124023,
+ 124029, 0, 0, 0, 124033, 124035, 124039, 124043, 124045, 124049, 124053,
+ 124055, 124059, 124061, 124065, 124069, 124073, 124077, 124081, 124085,
+ 124089, 124093, 124099, 124103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 124107, 124111, 124115, 124119, 124126, 124128, 124132, 124134, 124136,
+ 124140, 124144, 124148, 124150, 124154, 124158, 124162, 124166, 124170,
+ 124172, 124176, 124178, 124184, 124187, 124192, 124194, 124196, 124199,
+ 124201, 124203, 124206, 124213, 124220, 124227, 124232, 124236, 124238,
+ 124240, 0, 124242, 124244, 124248, 124252, 124256, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124258, 124262, 124267, 124271,
+ 124277, 124283, 124285, 124287, 124293, 124295, 124299, 124303, 124305,
+ 124309, 124311, 124315, 124319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 124323, 124325, 124327, 124329, 124333, 124335, 124337, 124339,
+ 124341, 124343, 124345, 124347, 124349, 124351, 124353, 124355, 124357,
+ 124359, 124361, 124363, 124365, 124367, 124369, 124371, 124373, 124375,
+ 124377, 124381, 124383, 124385, 124387, 124391, 124393, 124397, 124399,
+ 124401, 124405, 124409, 124415, 124417, 124419, 124421, 124423, 124427,
+ 124431, 124433, 124437, 124441, 124445, 124449, 124453, 124457, 124461,
+ 124465, 124469, 124473, 124477, 124481, 124485, 124489, 124493, 124497,
+ 124501, 0, 124505, 0, 124507, 124509, 124511, 124513, 124515, 124523,
+ 124531, 124539, 124547, 124552, 124557, 124562, 124566, 124570, 124575,
+ 124579, 124581, 124585, 124587, 124589, 124591, 124593, 124595, 124597,
+ 124599, 124603, 124605, 124607, 124609, 124613, 124617, 124621, 124625,
+ 124629, 124631, 124637, 124643, 124645, 124647, 124649, 124651, 124653,
+ 124662, 124669, 124676, 124680, 124687, 124692, 124699, 124708, 124713,
+ 124717, 124721, 124723, 124727, 124729, 124733, 124737, 124739, 124743,
+ 124747, 124751, 124753, 124755, 124761, 124763, 124765, 124767, 124771,
+ 124775, 124777, 124781, 124783, 124785, 124788, 124792, 124794, 124798,
+ 124800, 124802, 124807, 124809, 124813, 124817, 124820, 124824, 124828,
+ 124832, 124836, 124840, 124844, 124848, 124853, 124857, 124861, 124870,
+ 124875, 124878, 124880, 124883, 124886, 124891, 124893, 124896, 124901,
+ 124905, 124908, 124912, 124916, 124919, 124924, 124928, 124932, 124936,
+ 124940, 124946, 124952, 124958, 124964, 124969, 124980, 124982, 124986,
+ 124988, 124990, 124994, 124998, 125000, 125004, 125009, 125014, 125020,
+ 125022, 125026, 125030, 125037, 125044, 125048, 125050, 125052, 125056,
+ 125058, 125062, 125066, 125070, 125072, 125074, 125081, 125085, 125088,
+ 125092, 125096, 125100, 125102, 125106, 125108, 125110, 125114, 125116,
+ 125120, 125124, 125130, 125134, 125138, 125142, 125144, 125147, 125151,
+ 125158, 125167, 125176, 125184, 125192, 125194, 125198, 125200, 125204,
+ 125215, 125219, 125225, 125231, 125236, 0, 125238, 125242, 125244,
+ 125246, 0, 0, 0, 125248, 125253, 125263, 125278, 125290, 125302, 125306,
+ 125310, 125316, 125318, 125326, 125334, 125336, 125340, 125346, 125352,
+ 125359, 125366, 125368, 125370, 125373, 125375, 125381, 125383, 125386,
+ 125390, 125396, 125402, 125413, 125419, 125426, 125434, 125438, 125446,
+ 125454, 125460, 125466, 125473, 125475, 125479, 125481, 125483, 125488,
+ 125490, 125492, 125494, 125496, 125500, 125511, 125517, 125521, 125525,
+ 125529, 125535, 125541, 125547, 125553, 125558, 125563, 125569, 125575,
+ 125582, 0, 0, 125589, 125594, 125602, 125606, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 125615, 125622, 125629, 125636, 125644, 125652, 125660, 125668,
+ 125676, 125684, 125692, 125700, 125708, 125714, 125720, 125726, 125732,
+ 125738, 125744, 125750, 125756, 125762, 125768, 125774, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 121729, 121733, 121737, 121742, 121747, 0, 121749, 121758,
- 121766, 121775, 121789, 121803, 121817, 121824, 121831, 121835, 121844,
- 121852, 121856, 121865, 121872, 121876, 0, 121880, 121884, 121891, 0,
- 121895, 0, 121899, 0, 121906, 0, 121915, 121927, 121939, 0, 121943,
- 121947, 121951, 121955, 121959, 121967, 0, 0, 121975, 121979, 121983,
- 121987, 0, 121991, 0, 0, 121997, 122009, 122017, 122021, 0, 122025,
- 122029, 122035, 122042, 122053, 122063, 122074, 122085, 122094, 122105,
- 122111, 122117, 0, 0, 0, 0, 122123, 122132, 122139, 122145, 122149,
- 122153, 122157, 122166, 122178, 122182, 122189, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122196, 122198, 122200,
- 122204, 122208, 122212, 122221, 122223, 122225, 122228, 122230, 122232,
- 122236, 122238, 122242, 122244, 122248, 122250, 122252, 122256, 122260,
- 122266, 122268, 122272, 122274, 122278, 122282, 122286, 122290, 122292,
- 122294, 122298, 122302, 122306, 122310, 122312, 122314, 122316, 122321,
- 122326, 122329, 122337, 122345, 122347, 122352, 122355, 122360, 122371,
- 122378, 122383, 122388, 122390, 122394, 122396, 122400, 122402, 122406,
- 122410, 122413, 122416, 122418, 122421, 122423, 122427, 122429, 122431,
- 122433, 122437, 122439, 122443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122446,
- 122451, 122456, 122461, 122466, 122471, 122476, 122483, 122490, 122497,
- 122504, 122509, 122514, 122519, 122524, 122531, 122537, 122544, 122551,
- 122558, 122563, 122568, 122573, 122578, 122583, 122590, 122597, 122602,
- 122607, 122614, 122621, 122629, 122637, 122644, 122651, 122659, 122667,
- 122675, 122682, 122692, 122703, 122708, 122715, 122722, 122729, 122737,
- 122745, 122756, 122764, 122772, 122780, 122785, 122790, 122795, 122800,
- 122805, 122810, 122815, 122820, 122825, 122830, 122835, 122840, 122847,
- 122852, 122857, 122864, 122869, 122874, 122879, 122884, 122889, 122894,
- 122899, 122904, 122909, 122914, 122919, 122924, 122931, 122939, 122944,
- 122949, 122956, 122961, 122966, 122971, 122978, 122983, 122990, 122995,
- 123002, 123007, 123016, 123025, 123030, 123035, 123040, 123045, 123050,
- 123055, 123060, 123065, 123070, 123075, 123080, 123085, 123090, 123098,
- 123106, 123111, 123116, 123121, 123126, 123131, 123137, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 123143, 123147, 123151, 123155, 123159, 123163, 123167,
- 123171, 123175, 123179, 123183, 123187, 123191, 123195, 123199, 123203,
- 123207, 123211, 123215, 123219, 123223, 123227, 123231, 123235, 123239,
- 123243, 123247, 123251, 123255, 123259, 123263, 123267, 123271, 123275,
- 123279, 123283, 123287, 123291, 123295, 123299, 123303, 123307, 123311,
- 123315, 123319, 123323, 123327, 123331, 123335, 123339, 123343, 123347,
- 123351, 123355, 123359, 123363, 123367, 123371, 123375, 123379, 123383,
- 123387, 123391, 123395, 123399, 123403, 123407, 123411, 123415, 123419,
- 123423, 123427, 123431, 123435, 123439, 123443, 123447, 123451, 123455,
- 123459, 123463, 123467, 123471, 123475, 123479, 123483, 123487, 123491,
- 123495, 123499, 123503, 123507, 123511, 123515, 123519, 123523, 123527,
- 123531, 123535, 123539, 123543, 123547, 123551, 123555, 123559, 123563,
- 123567, 123571, 123575, 123579, 123583, 123587, 123591, 123595, 123599,
- 123603, 123607, 123611, 123615, 123619, 123623, 123627, 123631, 123635,
- 123639, 123643, 123647, 123651, 123655, 123659, 123663, 123667, 123671,
- 123675, 123679, 123683, 123687, 123691, 123695, 123699, 123703, 123707,
- 123711, 123715, 123719, 123723, 123727, 123731, 123735, 123739, 123743,
- 123747, 123751, 123755, 123759, 123763, 123767, 123771, 123775, 123779,
- 123783, 123787, 123791, 123795, 123799, 123803, 123807, 123811, 123815,
- 123819, 123823, 123827, 123831, 123835, 123839, 123843, 123847, 123851,
- 123855, 123859, 123863, 123867, 123871, 123875, 123879, 123883, 123887,
- 123891, 123895, 123899, 123903, 123907, 123911, 123915, 123919, 123923,
- 123927, 123931, 123935, 123939, 123943, 123947, 123951, 123955, 123959,
- 123963, 123967, 123971, 123975, 123979, 123983, 123987, 123991, 123995,
- 123999, 124003, 124007, 124011, 124015, 124019, 124023, 124027, 124031,
- 124035, 124039, 124043, 124047, 124051, 124055, 124059, 124063, 124067,
- 124071, 124075, 124079, 124083, 124087, 124091, 124095, 124099, 124103,
- 124107, 124111, 124115, 124119, 124123, 124127, 124131, 124135, 124139,
- 124143, 124147, 124151, 124155, 124159, 124163, 124167, 124171, 124175,
- 124179, 124183, 124187, 124191, 124195, 124199, 124203, 124207, 124211,
- 124215, 124219, 124223, 124227, 124231, 124235, 124239, 124243, 124247,
- 124251, 124255, 124259, 124263, 124267, 124271, 124275, 124279, 124283,
- 124287, 124291, 124295, 124299, 124303, 124307, 124311, 124315, 124319,
- 124323, 124327, 124331, 124335, 124339, 124343, 124347, 124351, 124355,
- 124359, 124363, 124367, 124371, 124375, 124379, 124383, 124387, 124391,
- 124395, 124399, 124403, 124407, 124411, 124415, 124419, 124423, 124427,
- 124431, 124435, 124439, 124443, 124447, 124451, 124455, 124459, 124463,
- 124467, 124471, 124475, 124479, 124483, 124487, 124491, 124495, 124499,
- 124503, 124507, 124511, 124515, 124519, 124523, 124527, 124531, 124535,
- 124539, 124543, 124547, 124551, 124555, 124559, 124563, 124567, 124571,
- 124575, 124579, 124583, 124587, 124591, 124595, 124599, 124603, 124607,
- 124611, 124615, 124619, 124623, 124627, 124631, 124635, 124639, 124643,
- 124647, 124651, 124655, 124659, 124663, 124667, 124671, 124675, 124679,
- 124683, 124687, 124691, 124695, 124699, 124703, 124707, 124711, 124715,
- 124719, 124723, 124727, 124731, 124735, 124739, 124743, 124747, 124751,
- 124755, 124759, 124763, 124767, 124771, 124775, 124779, 124783, 124787,
- 124791, 124795, 124799, 124803, 124807, 124811, 124815, 124819, 124823,
- 124827, 124831, 124835, 124839, 124843, 124847, 124851, 124855, 124859,
- 124863, 124867, 124871, 124875, 124879, 124883, 124887, 124891, 124895,
- 124899, 124903, 124907, 124911, 124915, 124919, 124923, 124927, 124931,
- 124935, 124939, 124943, 124947, 124951, 124955, 124959, 124963, 124967,
- 124971, 124975, 124979, 124983, 124987, 124991, 124995, 124999, 125003,
- 125007, 125011, 125015, 125019, 125023, 125027, 125031, 125035, 125039,
- 125043, 125047, 125051, 125055, 125059, 125063, 125067, 125071, 125075,
- 125079, 125083, 125087, 125091, 125095, 125099, 125103, 125107, 125111,
- 125115, 125119, 125123, 125127, 125131, 125135, 125139, 125143, 125147,
- 125151, 125155, 125159, 125163, 125167, 125171, 125175, 125179, 125183,
- 125187, 125191, 125195, 125199, 125203, 125207, 125211, 125215, 125219,
- 125223, 125227, 125231, 125235, 125239, 125243, 125247, 125251, 125255,
- 125259, 125263, 125267, 125271, 125275, 125279, 125283, 125287, 125291,
- 125295, 125299, 125303, 125307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125780,
+ 125784, 125788, 125793, 125798, 125800, 125804, 125813, 125821, 125829,
+ 125842, 125855, 125868, 125875, 125882, 125886, 125895, 125903, 125907,
+ 125916, 125923, 125927, 125931, 125935, 125939, 125946, 125950, 125954,
+ 125958, 125962, 125969, 125978, 125987, 125994, 126006, 126018, 126022,
+ 126026, 126030, 126034, 126038, 126042, 126050, 126058, 126066, 126070,
+ 126074, 126078, 126082, 126086, 126090, 126096, 126102, 126106, 126117,
+ 126125, 126129, 126133, 126137, 126141, 126147, 126154, 126165, 126175,
+ 126185, 126196, 126205, 126216, 126222, 126228, 0, 0, 0, 0, 126234,
+ 126243, 126250, 126256, 126260, 126264, 126268, 126277, 126289, 126293,
+ 126300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 126307, 126309, 126311, 126315, 126319, 126323, 126332, 126334,
+ 126336, 126339, 126341, 126343, 126347, 126349, 126353, 126355, 126359,
+ 126361, 126363, 126367, 126371, 126377, 126379, 126383, 126385, 126389,
+ 126393, 126397, 126401, 126403, 126405, 126409, 126413, 126417, 126421,
+ 126423, 126425, 126427, 126432, 126437, 126440, 126448, 126456, 126458,
+ 126463, 126466, 126471, 126482, 126489, 126494, 126499, 126501, 126505,
+ 126507, 126511, 126513, 126517, 126521, 126524, 126527, 126529, 126532,
+ 126534, 126538, 126540, 126542, 126544, 126548, 126550, 126554, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125311, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125315,
- 125318, 125322, 125326, 125329, 125333, 125337, 125340, 125343, 125347,
- 125351, 125354, 125357, 125360, 125363, 125368, 125371, 125375, 125378,
- 125381, 125384, 125387, 125390, 125393, 125396, 125399, 125402, 125405,
- 125408, 125412, 125416, 125420, 125424, 125429, 125434, 125440, 125446,
- 125452, 125457, 125463, 125469, 125475, 125480, 125486, 125492, 125497,
- 125502, 125507, 125512, 125518, 125524, 125529, 125534, 125540, 125545,
- 125551, 125557, 125563, 125569, 125575, 125579, 125584, 125588, 125593,
- 125597, 125602, 125607, 125613, 125619, 125625, 125630, 125636, 125642,
- 125648, 125653, 125659, 125665, 125670, 125675, 125680, 125685, 125691,
- 125697, 125702, 125707, 125713, 125718, 125724, 125730, 125736, 125742,
- 125748, 125753, 125757, 125762, 125765, 125769, 125772, 125775, 125778,
- 125781, 125784, 125787, 125790, 125793, 125796, 125799, 125802, 125805,
- 125808, 125811, 125814, 125817, 125820, 125823, 125826, 125829, 125832,
- 125835, 125838, 125841, 125844, 125847, 125850, 125853, 125856, 125859,
- 125862, 125865, 125868, 125871, 125874, 125877, 125880, 125883, 125886,
- 125889, 125892, 125895, 125898, 125901, 125904, 125907, 125910, 125913,
- 125916, 125919, 125922, 125925, 125928, 125931, 125934, 125937, 125940,
- 125943, 125946, 125949, 125952, 125955, 125958, 125961, 125964, 125967,
- 125970, 125973, 125976, 125979, 125982, 125985, 125988, 125991, 125994,
- 125997, 126000, 126003, 126006, 126009, 126012, 126015, 126018, 126021,
- 126024, 126027, 126030, 126033, 126036, 126039, 126042, 126045, 126048,
- 126051, 126054, 126057, 126060, 126063, 126066, 126069, 126072, 126075,
- 126078, 126081, 126084, 126087, 126090, 126093, 126096, 126099, 126102,
- 126105, 126108, 126111, 126114, 126117, 126120, 126123, 126126, 126129,
- 126132, 126135, 126138, 126141, 126144, 126147, 126150, 126153, 126156,
- 126159, 126162, 126165, 126168, 126171, 126174, 126177, 126180, 126183,
- 126186, 126189, 126192, 126195, 126198, 126201, 126204, 126207, 126210,
- 126213, 126216, 126219, 126222, 126225, 126228, 126231, 126234, 126237,
- 126240, 126243, 126246, 126249, 126252, 126255, 126258, 126261, 126264,
- 126267, 126270, 126273, 126276, 126279, 126282, 126285, 126288, 126291,
- 126294, 126297, 126300, 126303, 126306, 126309, 126312, 126315, 126318,
- 126321, 126324, 126327, 126330, 126333, 126336, 126339, 126342, 126345,
- 126348, 126351, 126354, 126357, 126360, 126363, 126366, 126369, 126372,
- 126375, 126378, 126381, 126384, 126387, 126390, 126393, 126396, 126399,
- 126402, 126405, 126408, 126411, 126414, 126417, 126420, 126423, 126426,
- 126429, 126432, 126435, 126438, 126441, 126444, 126447, 126450, 126453,
- 126456, 126459, 126462, 126465, 126468, 126471, 126474, 126477, 126480,
- 126483, 126486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 126557, 126562, 126567, 126572, 126577, 126582,
+ 126587, 126594, 126601, 126608, 126615, 126620, 126625, 126630, 126635,
+ 126642, 126648, 126655, 126662, 126669, 126674, 126679, 126684, 126689,
+ 126694, 126701, 126708, 126713, 126718, 126725, 126732, 126740, 126748,
+ 126755, 126762, 126770, 126778, 126786, 126793, 126803, 126814, 126819,
+ 126826, 126833, 126840, 126848, 126856, 126867, 126875, 126883, 126891,
+ 126896, 126901, 126906, 126911, 126916, 126921, 126926, 126931, 126936,
+ 126941, 126946, 126951, 126958, 126963, 126968, 126975, 126980, 126985,
+ 126990, 126995, 127000, 127005, 127010, 127015, 127020, 127025, 127030,
+ 127035, 127042, 127050, 127055, 127060, 127067, 127072, 127077, 127082,
+ 127089, 127094, 127101, 127106, 127113, 127118, 127127, 127136, 127141,
+ 127146, 127151, 127156, 127161, 127166, 127171, 127176, 127181, 127186,
+ 127191, 127196, 127201, 127209, 127217, 127222, 127227, 127232, 127237,
+ 127242, 127248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127254, 127258,
+ 127262, 127266, 127270, 127274, 127278, 127282, 127286, 127290, 127294,
+ 127298, 127302, 127306, 127310, 127314, 127318, 127322, 127326, 127330,
+ 127334, 127338, 127342, 127346, 127350, 127354, 127358, 127362, 127366,
+ 127370, 127374, 127378, 127382, 127386, 127390, 127394, 127398, 127402,
+ 127406, 127410, 127414, 127418, 127422, 127426, 127430, 127434, 127438,
+ 127442, 127446, 127450, 127454, 127458, 127462, 127466, 127470, 127474,
+ 127478, 127482, 127486, 127490, 127494, 127498, 127502, 127506, 127510,
+ 127514, 127518, 127522, 127526, 127530, 127534, 127538, 127542, 127546,
+ 127550, 127554, 127558, 127562, 127566, 127570, 127574, 127578, 127582,
+ 127586, 127590, 127594, 127598, 127602, 127606, 127610, 127614, 127618,
+ 127622, 127626, 127630, 127634, 127638, 127642, 127646, 127650, 127654,
+ 127658, 127662, 127666, 127670, 127674, 127678, 127682, 127686, 127690,
+ 127694, 127698, 127702, 127706, 127710, 127714, 127718, 127722, 127726,
+ 127730, 127734, 127738, 127742, 127746, 127750, 127754, 127758, 127762,
+ 127766, 127770, 127774, 127778, 127782, 127786, 127790, 127794, 127798,
+ 127802, 127806, 127810, 127814, 127818, 127822, 127826, 127830, 127834,
+ 127838, 127842, 127846, 127850, 127854, 127858, 127862, 127866, 127870,
+ 127874, 127878, 127882, 127886, 127890, 127894, 127898, 127902, 127906,
+ 127910, 127914, 127918, 127922, 127926, 127930, 127934, 127938, 127942,
+ 127946, 127950, 127954, 127958, 127962, 127966, 127970, 127974, 127978,
+ 127982, 127986, 127990, 127994, 127998, 128002, 128006, 128010, 128014,
+ 128018, 128022, 128026, 128030, 128034, 128038, 128042, 128046, 128050,
+ 128054, 128058, 128062, 128066, 128070, 128074, 128078, 128082, 128086,
+ 128090, 128094, 128098, 128102, 128106, 128110, 128114, 128118, 128122,
+ 128126, 128130, 128134, 128138, 128142, 128146, 128150, 128154, 128158,
+ 128162, 128166, 128170, 128174, 128178, 128182, 128186, 128190, 128194,
+ 128198, 128202, 128206, 128210, 128214, 128218, 128222, 128226, 128230,
+ 128234, 128238, 128242, 128246, 128250, 128254, 128258, 128262, 128266,
+ 128270, 128274, 128278, 128282, 128286, 128290, 128294, 128298, 128302,
+ 128306, 128310, 128314, 128318, 128322, 128326, 128330, 128334, 128338,
+ 128342, 128346, 128350, 128354, 128358, 128362, 128366, 128370, 128374,
+ 128378, 128382, 128386, 128390, 128394, 128398, 128402, 128406, 128410,
+ 128414, 128418, 128422, 128426, 128430, 128434, 128438, 128442, 128446,
+ 128450, 128454, 128458, 128462, 128466, 128470, 128474, 128478, 128482,
+ 128486, 128490, 128494, 128498, 128502, 128506, 128510, 128514, 128518,
+ 128522, 128526, 128530, 128534, 128538, 128542, 128546, 128550, 128554,
+ 128558, 128562, 128566, 128570, 128574, 128578, 128582, 128586, 128590,
+ 128594, 128598, 128602, 128606, 128610, 128614, 128618, 128622, 128626,
+ 128630, 128634, 128638, 128642, 128646, 128650, 128654, 128658, 128662,
+ 128666, 128670, 128674, 128678, 128682, 128686, 128690, 128694, 128698,
+ 128702, 128706, 128710, 128714, 128718, 128722, 128726, 128730, 128734,
+ 128738, 128742, 128746, 128750, 128754, 128758, 128762, 128766, 128770,
+ 128774, 128778, 128782, 128786, 128790, 128794, 128798, 128802, 128806,
+ 128810, 128814, 128818, 128822, 128826, 128830, 128834, 128838, 128842,
+ 128846, 128850, 128854, 128858, 128862, 128866, 128870, 128874, 128878,
+ 128882, 128886, 128890, 128894, 128898, 128902, 128906, 128910, 128914,
+ 128918, 128922, 128926, 128930, 128934, 128938, 128942, 128946, 128950,
+ 128954, 128958, 128962, 128966, 128970, 128974, 128978, 128982, 128986,
+ 128990, 128994, 128998, 129002, 129006, 129010, 129014, 129018, 129022,
+ 129026, 129030, 129034, 129038, 129042, 129046, 129050, 129054, 129058,
+ 129062, 129066, 129070, 129074, 129078, 129082, 129086, 129090, 129094,
+ 129098, 129102, 129106, 129110, 129114, 129118, 129122, 129126, 129130,
+ 129134, 129138, 129142, 129146, 129150, 129154, 129158, 129162, 129166,
+ 129170, 129174, 129178, 129182, 129186, 129190, 129194, 129198, 129202,
+ 129206, 129210, 129214, 129218, 129222, 129226, 129230, 129234, 129238,
+ 129242, 129246, 129250, 129254, 129258, 129262, 129266, 129270, 129274,
+ 129278, 129282, 129286, 129290, 129294, 129298, 129302, 129306, 129310,
+ 129314, 129318, 129322, 129326, 129330, 129334, 129338, 129342, 129346,
+ 129350, 129354, 129358, 129362, 129366, 129370, 129374, 129378, 129382,
+ 129386, 129390, 129394, 129398, 129402, 129406, 129410, 129414, 129418,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 129422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129426, 129429, 129433, 129437, 129440,
+ 129444, 129448, 129451, 129454, 129458, 129462, 129465, 129468, 129471,
+ 129474, 129479, 129482, 129486, 129489, 129492, 129495, 129498, 129501,
+ 129504, 129507, 129510, 129513, 129516, 129519, 129523, 129527, 129531,
+ 129535, 129540, 129545, 129551, 129557, 129563, 129568, 129574, 129580,
+ 129586, 129591, 129597, 129603, 129608, 129613, 129619, 129624, 129630,
+ 129636, 129641, 129647, 129653, 129658, 129664, 129670, 129676, 129682,
+ 129688, 129692, 129697, 129701, 129706, 129710, 129715, 129720, 129726,
+ 129732, 129738, 129743, 129749, 129755, 129761, 129766, 129772, 129778,
+ 129783, 129788, 129794, 129799, 129805, 129811, 129816, 129822, 129828,
+ 129833, 129839, 129845, 129851, 129857, 129863, 129868, 129872, 129877,
+ 129879, 129883, 129886, 129889, 129892, 129895, 129898, 129901, 129904,
+ 129907, 129910, 129913, 129916, 129919, 129922, 129925, 129928, 129931,
+ 129934, 129937, 129940, 129943, 129946, 129949, 129952, 129955, 129958,
+ 129961, 129964, 129967, 129970, 129973, 129976, 129979, 129982, 129985,
+ 129988, 129991, 129994, 129997, 130000, 130003, 130006, 130009, 130012,
+ 130015, 130018, 130021, 130024, 130027, 130030, 130033, 130036, 130039,
+ 130042, 130045, 130048, 130051, 130054, 130057, 130060, 130063, 130066,
+ 130069, 130072, 130075, 130078, 130081, 130084, 130087, 130090, 130093,
+ 130096, 130099, 130102, 130105, 130108, 130111, 130114, 130117, 130120,
+ 130123, 130126, 130129, 130132, 130135, 130138, 130141, 130144, 130147,
+ 130150, 130153, 130156, 130159, 130162, 130165, 130168, 130171, 130174,
+ 130177, 130180, 130183, 130186, 130189, 130192, 130195, 130198, 130201,
+ 130204, 130207, 130210, 130213, 130216, 130219, 130222, 130225, 130228,
+ 130231, 130234, 130237, 130240, 130243, 130246, 130249, 130252, 130255,
+ 130258, 130261, 130264, 130267, 130270, 130273, 130276, 130279, 130282,
+ 130285, 130288, 130291, 130294, 130297, 130300, 130303, 130306, 130309,
+ 130312, 130315, 130318, 130321, 130324, 130327, 130330, 130333, 130336,
+ 130339, 130342, 130345, 130348, 130351, 130354, 130357, 130360, 130363,
+ 130366, 130369, 130372, 130375, 130378, 130381, 130384, 130387, 130390,
+ 130393, 130396, 130399, 130402, 130405, 130408, 130411, 130414, 130417,
+ 130420, 130423, 130426, 130429, 130432, 130435, 130438, 130441, 130444,
+ 130447, 130450, 130453, 130456, 130459, 130462, 130465, 130468, 130471,
+ 130474, 130477, 130480, 130483, 130486, 130489, 130492, 130495, 130498,
+ 130501, 130504, 130507, 130510, 130513, 130516, 130519, 130522, 130525,
+ 130528, 130531, 130534, 130537, 130540, 130543, 130546, 130549, 130552,
+ 130555, 130558, 130561, 130564, 130567, 130570, 130573, 130576, 130579,
+ 130582, 130585, 130588, 130591, 130594, 130597, 130600, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130603, 130605, 130607, 130612, 130614,
+ 130619, 130621, 130626, 130628, 130633, 130635, 130637, 130639, 130641,
+ 130643, 130645, 130647, 130649, 130651, 130654, 130657, 130659, 130661,
+ 130665, 130668, 130673, 130675, 130677, 130679, 130683, 130686, 130688,
+ 130692, 130694, 130698, 130700, 130704, 130707, 130709, 130713, 130717,
+ 130719, 130725, 130727, 130732, 130734, 130739, 130741, 130746, 130748,
+ 130753, 130755, 130758, 130760, 130764, 130766, 130773, 130775, 130777,
+ 130779, 130784, 130786, 130788, 130790, 130792, 130794, 130799, 130803,
+ 130805, 130810, 130814, 130816, 130821, 130825, 130827, 130832, 130836,
+ 130838, 130840, 130842, 130844, 130848, 130850, 130855, 130857, 130863,
+ 130865, 130871, 130873, 130875, 130877, 130881, 130883, 130890, 130892,
+ 130899, 130901, 130906, 130911, 130913, 130919, 130925, 130927, 130933,
+ 130938, 130940, 130946, 130952, 130954, 130960, 130966, 130968, 130974,
+ 130978, 130980, 130985, 130987, 130989, 130994, 130996, 130998, 131004,
+ 131006, 131011, 131015, 131017, 131022, 131026, 131028, 131034, 131036,
+ 131040, 131042, 131046, 131048, 131055, 131062, 131064, 131071, 131078,
+ 131080, 131085, 131087, 131094, 131096, 131101, 131103, 131109, 131111,
+ 131115, 131117, 131123, 131125, 131129, 131131, 131137, 131139, 131141,
+ 131143, 131148, 131153, 131155, 131159, 131166, 131173, 131178, 131183,
+ 131195, 131197, 131199, 131201, 131203, 131205, 131207, 131209, 131211,
+ 131213, 131215, 131217, 131219, 131221, 131223, 131225, 131227, 131229,
+ 131235, 131242, 131247, 131252, 131263, 131265, 131267, 131269, 131271,
+ 131273, 131275, 131277, 131279, 131281, 131283, 131285, 131287, 131289,
+ 131291, 131293, 131295, 131300, 131302, 131304, 131315, 131317, 131319,
+ 131321, 131323, 131325, 131327, 131329, 131331, 131333, 131335, 131337,
+ 131339, 131341, 131343, 131345, 131347, 131349, 131351, 131353, 131355,
+ 131357, 131359, 131361, 131363, 131365, 131367, 131369, 131371, 131373,
+ 131375, 131377, 131379, 131381, 131383, 131385, 131387, 131389, 131391,
+ 131393, 131395, 131397, 131399, 131401, 131403, 131405, 131407, 131409,
+ 131411, 131413, 131415, 131417, 131419, 131421, 131423, 131425, 131427,
+ 131429, 131431, 131433, 131435, 131437, 131439, 131441, 131443, 131445,
+ 131447, 131449, 131451, 131453, 131455, 131457, 131459, 131461, 131463,
+ 131465, 131467, 131469, 131471, 131473, 131475, 131477, 131479, 131481,
+ 131483, 131485, 131487, 131489, 131491, 131493, 131495, 131497, 131499,
+ 131501, 131503, 131505, 131507, 131509, 131511, 131513, 131515, 131517,
+ 131519, 131521, 131523, 131525, 131527, 131529, 131531, 131533, 131535,
+ 131537, 131539, 131541, 131543, 131545, 131547, 131549, 131551, 131553,
+ 131555, 131557, 131559, 131561, 131563, 131565, 131567, 131569, 131571,
+ 131573, 131575, 131577, 131579, 131581, 131583, 131585, 131587, 131589,
+ 131591, 131593, 131595, 131597, 131599, 131601, 131603, 131605, 131607,
+ 131609, 131611, 131613, 131615, 131617, 131619, 131621, 131623, 131625,
+ 131627, 131629, 131631, 131633, 131635, 131637, 131639, 131641, 131643,
+ 131645, 131647, 131649, 131651, 131653, 131655, 131657, 131659, 131661,
+ 131663, 131665, 131667, 131669, 131671, 131673, 131675, 131677, 131679,
+ 131681, 131683, 131685, 131687, 131689, 131691, 131693, 131695, 131697,
+ 131699, 131701, 131703, 131705, 131707, 131709, 131711, 131713, 131715,
+ 131717, 131719, 131721, 131723, 131725, 131727, 131729, 131731, 131733,
+ 131735, 131737, 131739, 131741, 131743, 131745, 131747, 131749, 131751,
+ 131753, 131755, 131757, 131759, 131761, 131763, 131765, 131767, 131769,
+ 131771, 131773, 131775, 131777, 131779, 131781, 131783, 131785, 131787,
+ 131789, 131791, 131793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 131795, 131805, 131815, 131824, 131833, 131846, 131859, 131871, 131883,
+ 131893, 131903, 131913, 131923, 131934, 131945, 131955, 131964, 131973,
+ 131982, 131995, 132008, 132020, 132032, 132042, 132052, 132062, 132072,
+ 132081, 132090, 132099, 132108, 132117, 132126, 132135, 132144, 132153,
+ 132162, 132171, 132180, 132191, 132201, 132211, 132224, 132234, 132247,
+ 132254, 132264, 132271, 132278, 132285, 132292, 132299, 132306, 132315,
+ 132324, 132333, 132342, 132351, 132360, 132369, 132378, 132386, 132394,
+ 132401, 132411, 132420, 132428, 132435, 132445, 132454, 132458, 132462,
+ 132466, 132470, 132474, 132478, 132482, 132486, 132490, 132494, 132497,
+ 132501, 132504, 132507, 132511, 132515, 132519, 132523, 132527, 132531,
+ 132535, 132539, 132543, 132547, 132551, 132555, 132559, 132563, 132567,
+ 132571, 132575, 132579, 132583, 132587, 132591, 132595, 132599, 132603,
+ 132607, 132611, 132615, 132619, 132623, 132627, 132631, 132635, 132639,
+ 132643, 132647, 132651, 132655, 132659, 132663, 132667, 132671, 132675,
+ 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, 132711,
+ 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, 132747,
+ 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, 132783,
+ 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, 132819,
+ 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132850, 132854,
+ 132858, 132862, 132866, 132870, 132874, 132878, 132882, 132886, 132890,
+ 132894, 132898, 132902, 132906, 132910, 132914, 132918, 132922, 132926,
+ 132930, 132934, 132938, 132942, 132946, 132950, 132954, 132958, 132962,
+ 132966, 132970, 132974, 132978, 132982, 132986, 132990, 132994, 132998,
+ 133002, 133006, 133010, 133014, 133018, 133022, 133026, 133030, 133034,
+ 133038, 133042, 133046, 133050, 133054, 133058, 133062, 133066, 133070,
+ 133074, 133078, 133082, 133086, 133090, 133094, 133098, 133102, 133106,
+ 133110, 133114, 133118, 133122, 133126, 133130, 133134, 133138, 133142,
+ 133146, 133150, 133154, 133158, 133162, 133166, 133170, 133174, 133178,
+ 133182, 133186, 133190, 133194, 133198, 133202, 133206, 133210, 133214,
+ 133218, 133222, 133226, 133230, 133234, 133238, 133242, 133246, 133250,
+ 133254, 133258, 133262, 133266, 133270, 133274, 133278, 133282, 133286,
+ 133290, 133294, 133298, 133302, 133306, 133310, 133314, 133318, 133322,
+ 133326, 133330, 133334, 133338, 133342, 133346, 133350, 133354, 133358,
+ 133362, 133366, 133370, 133374, 133378, 133382, 133386, 133390, 133394,
+ 133398, 133402, 133406, 133410, 133414, 133418, 133422, 133426, 133430,
+ 133434, 133438, 133442, 133446, 133450, 133454, 133458, 133462, 133466,
+ 133470, 133474, 133478, 133482, 133486, 133490, 133494, 133498, 133502,
+ 133506, 133510, 133514, 133518, 133522, 133526, 133530, 133534, 133538,
+ 133542, 133546, 133550, 133554, 133558, 133562, 133566, 133570, 133574,
+ 133578, 133582, 133586, 133590, 133594, 133598, 133602, 133606, 133610,
+ 133614, 133619, 133624, 133629, 133633, 133639, 133646, 133653, 133660,
+ 133667, 133674, 133681, 133688, 133695, 133702, 133709, 133716, 133723,
+ 133730, 133736, 133743, 133750, 133756, 133763, 133770, 133777, 133784,
+ 133791, 133798, 133805, 133812, 133819, 133826, 133833, 133840, 133847,
+ 133853, 133859, 133866, 133873, 133882, 133891, 133900, 133909, 133914,
+ 133919, 133925, 133931, 133937, 133943, 133949, 133955, 133961, 133967,
+ 133973, 133979, 133985, 133991, 133996, 134002, 134012, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
/* name->code dictionary */
static unsigned int code_hash[] = {
74224, 4851, 0, 78156, 78499, 128685, 7929, 0, 194682, 127766, 78500,
- 66480, 0, 42833, 74529, 12064, 0, 596, 0, 128103, 13192, 8651, 0, 0,
+ 66480, 0, 42833, 74529, 12064, 0, 596, 983812, 69850, 13192, 8651, 0, 0,
120218, 12995, 64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 42897,
4233, 4234, 4232, 917836, 74415, 120210, 6384, 917840, 78108, 8851, 0,
- 128553, 0, 41601, 8874, 0, 7748, 0, 0, 0, 127939, 41603, 9784, 0, 9188,
- 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0, 3404,
- 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 0, 127764, 65859,
- 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 0, 65288, 0, 11398, 0,
- 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824, 3350, 120817,
- 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830, 78573, 0,
- 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562, 2121,
- 64138, 4043, 8712, 64134, 64133, 11297, 0, 0, 11966, 64128, 128587, 0, 0,
- 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 66002, 10167, 9471, 0,
- 66021, 0, 0, 5457, 5440, 8857, 128771, 65282, 2843, 5355, 127928, 0, 0,
- 5194, 11657, 43984, 128292, 0, 0, 0, 0, 127027, 10717, 64570, 5630,
- 74350, 64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631,
- 64146, 64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353,
- 6960, 0, 0, 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109,
- 64108, 8090, 0, 74401, 917811, 587, 0, 128131, 0, 0, 0, 78214, 2750,
- 74218, 556, 64158, 64157, 0, 12213, 194678, 2760, 0, 0, 0, 194794, 64156,
- 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, 11093, 64153, 64152,
- 0, 0, 4839, 0, 0, 1874, 119016, 0, 6577, 64125, 64124, 64123, 0, 127531,
- 92534, 7007, 7590, 65443, 9036, 92550, 64122, 74422, 66609, 0, 64117,
- 64116, 6287, 64114, 2725, 64120, 64119, 43981, 42128, 127842, 1177,
- 65601, 12322, 64106, 69640, 127306, 64102, 7859, 1945, 64099, 0, 10453,
- 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, 9571, 528, 128671,
- 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, 64313, 6188, 120019,
- 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, 7233, 92212, 0, 41904,
- 6639, 64064, 0, 128344, 0, 1176, 118959, 127930, 8162, 128667, 0, 0,
- 120519, 66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0,
- 7714, 66222, 0, 7768, 0, 4199, 64708, 0, 0, 0, 8708, 9560, 64077, 64076,
- 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 0, 0, 64615, 41915, 0,
- 12075, 92211, 0, 5174, 0, 0, 127557, 3123, 0, 12685, 127904, 8408, 64704,
- 0, 0, 9223, 0, 41616, 0, 73797, 0, 1116, 128204, 43049, 7136, 43050,
- 8548, 120485, 0, 119061, 917999, 0, 13115, 43675, 64091, 9322, 0, 120595,
- 64095, 64094, 8111, 66247, 42332, 64089, 64088, 6199, 0, 0, 11434, 64083,
- 64082, 11329, 7737, 64087, 64086, 64085, 64084, 194817, 9927, 41335,
- 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114, 0, 42627, 0,
- 32, 6187, 119052, 11495, 11459, 3665, 0, 42871, 0, 19923, 74335, 0,
- 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0, 0, 65758, 12750, 4181,
- 8544, 0, 120199, 917897, 120198, 69809, 6181, 65014, 0, 0, 0, 3639,
- 119588, 0, 0, 118904, 10073, 120206, 128862, 127186, 68409, 42844, 7498,
- 1098, 92565, 120205, 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0,
- 65058, 0, 0, 0, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 118907,
- 0, 66238, 12844, 0, 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0,
- 64405, 41337, 0, 41631, 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408,
- 6579, 0, 64618, 0, 120147, 2138, 6583, 7761, 127010, 120504, 194828, 0,
- 5058, 41010, 9992, 128299, 5057, 0, 0, 74538, 5054, 118951, 194971,
- 78606, 0, 1437, 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 0, 0,
- 0, 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0,
- 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 0, 127524, 0, 0, 0, 0,
- 195083, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, 67854,
- 8125, 120545, 6743, 119175, 917940, 2369, 0, 0, 0, 119235, 74092, 73936,
- 7008, 43660, 0, 0, 0, 2367, 127827, 0, 264, 2375, 8060, 6194, 119858,
- 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839, 0, 8800, 0, 42862, 4463,
- 65581, 6192, 194676, 42771, 0, 92333, 725, 65042, 118797, 120800, 0,
- 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, 0, 0, 5074, 5073, 128790, 8983,
- 118981, 74493, 0, 5072, 128071, 6198, 11614, 0, 196, 0, 0, 0, 4929,
- 120342, 0, 0, 0, 0, 42847, 0, 0, 0, 4934, 0, 41323, 9758, 0, 92289,
- 127917, 42584, 0, 4329, 41321, 4979, 3048, 7752, 41320, 0, 74418, 12819,
- 0, 5071, 0, 3642, 0, 5070, 10042, 118835, 3987, 5068, 0, 8909, 78650,
- 78649, 0, 10636, 73981, 11806, 43167, 4531, 1245, 9105, 66463, 4921,
- 120219, 4926, 65544, 73884, 194619, 0, 0, 64709, 0, 194620, 78880, 4922,
- 325, 992, 119568, 4925, 0, 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0,
- 92175, 120275, 4933, 0, 0, 118985, 4928, 0, 0, 74770, 120194, 0, 722,
- 194934, 19908, 12637, 127485, 119855, 8753, 1509, 0, 5468, 9511, 127474,
- 127477, 1672, 6205, 10864, 74586, 127480, 92310, 127466, 78555, 127468,
- 73863, 127470, 127473, 41607, 120115, 1679, 120116, 120180, 120113,
- 127462, 7005, 41609, 9580, 0, 401, 0, 43779, 6968, 5761, 342, 8553, 0,
- 8143, 127115, 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478,
- 0, 5076, 0, 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 92523,
- 120102, 7138, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080,
- 64775, 5036, 5035, 120590, 42604, 0, 0, 8074, 275, 13291, 1907, 78838,
+ 128553, 0, 41601, 8874, 983774, 7748, 0, 0, 0, 127939, 41603, 9784, 0,
+ 9188, 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0,
+ 3404, 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 94014,
+ 127764, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983851,
+ 65288, 0, 11398, 0, 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824,
+ 3350, 120817, 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830,
+ 78573, 0, 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562,
+ 2121, 64138, 4043, 8712, 64134, 64133, 11297, 983679, 983152, 11966,
+ 64128, 128587, 0, 0, 64132, 10867, 64130, 64129, 983835, 43374, 9779,
+ 2764, 66002, 10167, 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 93981, 65282,
+ 2843, 5355, 127928, 983956, 0, 5194, 11657, 43984, 128292, 0, 983620, 0,
+ 0, 127027, 10717, 64570, 5630, 5396, 64143, 10682, 0, 10602, 800, 42499,
+ 66186, 0, 0, 64930, 11631, 64146, 64145, 64144, 762, 13172, 118859,
+ 194661, 64468, 10906, 1353, 6960, 0, 0, 5828, 8724, 917806, 8933, 1601,
+ 42244, 858, 7080, 64109, 64108, 8090, 0, 74401, 917811, 587, 0, 128131,
+ 0, 0, 0, 78214, 2750, 74218, 556, 64158, 64157, 983940, 12213, 194678,
+ 2760, 0, 0, 0, 194794, 64156, 64155, 42496, 0, 64151, 64150, 12679,
+ 10053, 10421, 11093, 64153, 64152, 0, 0, 4839, 0, 0, 1874, 119016, 0,
+ 6577, 64125, 64124, 64123, 0, 127531, 92534, 7007, 7590, 65443, 9036,
+ 92550, 64122, 74422, 66609, 0, 64117, 64116, 6287, 64114, 2725, 64120,
+ 64119, 43981, 42128, 127842, 1177, 65601, 12322, 64106, 69640, 127306,
+ 64102, 7859, 1945, 64099, 0, 10453, 64104, 7188, 7997, 0, 7389, 983161,
+ 8705, 64097, 64096, 9571, 528, 128671, 44017, 11429, 71347, 0, 983077,
+ 917990, 73841, 0, 0, 9056, 64313, 6188, 120019, 6155, 64068, 1823, 64066,
+ 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, 6639, 64064, 983766,
+ 128344, 0, 1176, 118959, 127930, 8162, 128667, 983822, 0, 120519, 66376,
+ 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222,
+ 69902, 7768, 0, 4199, 64708, 983413, 0, 0, 8708, 9560, 64077, 64076,
+ 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 126570, 0, 64615, 41915,
+ 0, 12075, 70062, 0, 5174, 983215, 0, 127557, 3123, 0, 12685, 127904,
+ 8408, 64704, 0, 0, 9223, 0, 41616, 67999, 73797, 0, 1116, 128204, 43049,
+ 7136, 43050, 8548, 120485, 0, 119061, 917999, 0, 13115, 43675, 64091,
+ 9322, 0, 120595, 64095, 64094, 8111, 66247, 42332, 64089, 64088, 6199, 0,
+ 0, 11434, 64083, 64082, 11329, 7737, 64087, 64086, 64085, 64084, 194817,
+ 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114,
+ 0, 42627, 0, 32, 6187, 119052, 11495, 11459, 3665, 983600, 42871, 0,
+ 19923, 74335, 0, 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0,
+ 983458, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181,
+ 65014, 0, 0, 983196, 3639, 119588, 0, 0, 118904, 10073, 120206, 128862,
+ 127186, 68409, 42844, 7498, 1098, 92565, 120205, 0, 983118, 10207, 8789,
+ 983223, 0, 0, 983464, 9234, 0, 6182, 983466, 65058, 0, 983470, 983467, 0,
+ 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 94072, 0, 66238, 12844, 0,
+ 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, 41337, 0,
+ 41631, 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408, 6579, 0, 64618,
+ 0, 120147, 2138, 6583, 7761, 127010, 120504, 194828, 0, 5058, 41010,
+ 9992, 128299, 5057, 0, 0, 74538, 5054, 118951, 194971, 78606, 0, 1437,
+ 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 127878, 0, 128529,
+ 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0,
+ 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 983947, 127524, 0, 0, 0,
+ 0, 195083, 0, 983834, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668,
+ 67854, 8125, 120545, 6743, 119175, 917940, 2369, 0, 983963, 983964,
+ 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 127827, 983848, 264,
+ 2375, 8060, 6194, 119858, 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839,
+ 0, 8800, 0, 42862, 4463, 65581, 6192, 194676, 42771, 0, 92333, 725,
+ 65042, 118797, 120800, 983040, 12892, 0, 0, 0, 0, 0, 0, 127261, 120707,
+ 983128, 0, 5074, 5073, 128790, 8983, 118981, 74493, 983561, 5072, 93977,
+ 6198, 11614, 0, 196, 0, 0, 0, 4929, 120342, 0, 0, 0, 0, 42847, 0, 0, 0,
+ 4934, 0, 41323, 9758, 0, 92289, 127917, 42584, 0, 4329, 41321, 4979,
+ 3048, 7752, 41320, 983042, 74418, 12819, 0, 5071, 0, 3642, 0, 5070,
+ 10042, 118835, 3987, 5068, 0, 8909, 78650, 78649, 69917, 10636, 73981,
+ 11806, 43167, 4531, 1245, 9105, 66463, 4921, 120219, 4926, 65544, 73884,
+ 194619, 0, 0, 64709, 0, 194620, 78880, 4922, 325, 992, 119568, 4925, 0,
+ 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0, 92175, 120275, 4933, 120211,
+ 0, 118985, 4928, 0, 0, 74770, 120194, 126548, 722, 194934, 19908, 12637,
+ 127485, 119855, 8753, 1509, 0, 5468, 9511, 127474, 127477, 1672, 6205,
+ 10864, 74586, 127480, 70103, 127466, 78555, 127468, 73863, 126577,
+ 126503, 41607, 120115, 1679, 120116, 120180, 120113, 127462, 7005, 41609,
+ 9580, 0, 401, 69949, 43779, 6968, 5761, 342, 8553, 0, 8143, 127115,
+ 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, 0, 5076, 0,
+ 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 92523, 120102,
+ 7138, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, 64775,
+ 5036, 5035, 120590, 42604, 983647, 0, 8074, 275, 13291, 1907, 78838,
4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546,
127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409,
127256, 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0,
- 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 0, 5030, 0, 0,
- 0, 73869, 9622, 0, 0, 6787, 0, 0, 0, 0, 10544, 12919, 0, 92218, 0, 0, 0,
- 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, 7613, 92562,
- 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, 43567,
- 74056, 917910, 118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395,
- 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 0, 74141, 8880,
- 7685, 66459, 120173, 65540, 119618, 625, 8187, 42861, 1113, 7236, 7915,
- 3630, 120176, 8179, 74264, 67886, 9316, 10980, 2489, 65624, 8150, 1359,
- 67652, 127329, 127330, 73756, 5042, 5041, 42769, 12084, 127324, 127321,
- 92279, 127319, 127320, 127317, 127318, 127315, 12283, 1616, 3795, 0,
- 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, 127311, 0, 0, 8431,
- 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, 0, 0, 0, 78420, 0,
- 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, 64648, 0, 9359, 78416, 0,
- 128770, 65157, 6662, 0, 0, 3863, 73909, 4835, 55266, 43432, 127822, 4309,
- 7127, 194569, 0, 194568, 1301, 0, 42589, 569, 0, 73813, 711, 4389, 7133,
- 0, 73880, 11610, 11368, 0, 194570, 41331, 1006, 74240, 0, 1550, 8201,
- 73737, 7627, 5499, 5031, 77908, 42738, 65784, 77907, 65267, 3758, 0,
- 65781, 64734, 0, 2440, 65780, 77913, 8449, 0, 5008, 0, 2118, 0, 12121,
- 8255, 5512, 73875, 2128, 2130, 2131, 2126, 2133, 1119, 127068, 2114,
- 2116, 2455, 0, 2122, 2123, 2124, 2125, 0, 8714, 0, 2113, 0, 2115, 128177,
- 127907, 43713, 5052, 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429,
- 42647, 5050, 302, 388, 41115, 735, 6637, 5907, 65088, 0, 12726, 74594,
- 9117, 0, 12003, 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470,
+ 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 983177, 5030, 0,
+ 0, 0, 73869, 9622, 0, 69944, 6787, 0, 0, 0, 983583, 10544, 12919, 0,
+ 92218, 0, 0, 69906, 120789, 0, 947, 119835, 194586, 194585, 10969,
+ 119935, 7613, 92562, 119936, 4795, 119930, 7018, 7376, 120181, 120192,
+ 120268, 0, 43567, 74056, 917910, 11833, 119919, 7216, 65232, 7217, 251,
+ 7218, 7895, 4395, 43538, 119926, 119929, 119928, 7213, 119922, 7214,
+ 7215, 983827, 74141, 8880, 7685, 66459, 120173, 65540, 119618, 625, 8187,
+ 42861, 1113, 7236, 7915, 3630, 120176, 8179, 74264, 67886, 9316, 10980,
+ 2489, 65624, 8150, 1359, 67652, 127329, 127330, 73756, 5042, 5041, 42769,
+ 12084, 127324, 127321, 92279, 127319, 127320, 127317, 127318, 127315,
+ 12283, 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0,
+ 3239, 127311, 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073,
+ 5040, 0, 0, 983435, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184,
+ 74293, 0, 64648, 0, 9359, 78416, 0, 128770, 65157, 6662, 0, 0, 3863,
+ 73909, 4835, 55266, 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301,
+ 0, 42589, 569, 0, 73813, 711, 4389, 7133, 0, 73880, 11610, 11368, 0,
+ 194570, 41331, 1006, 74240, 0, 1550, 8201, 73737, 7627, 5499, 5031,
+ 77908, 42738, 65784, 77907, 65267, 3758, 0, 65781, 64734, 70073, 2440,
+ 65780, 77913, 8449, 0, 5008, 983572, 2118, 0, 12121, 8255, 5512, 73875,
+ 2128, 2130, 2131, 2126, 2133, 1119, 127068, 2114, 2116, 2455, 0, 2122,
+ 2123, 2124, 2125, 127486, 8714, 983811, 2113, 0, 2115, 128177, 127907,
+ 43713, 5052, 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, 42647,
+ 5050, 302, 388, 41115, 735, 6637, 5907, 65088, 0, 12726, 74594, 9117,
+ 983181, 12003, 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470,
78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, 0, 0, 92313, 0, 74497,
- 92395, 8089, 6929, 639, 0, 68179, 64442, 0, 92348, 4599, 41402, 6674,
- 43397, 43294, 1476, 648, 0, 65819, 3233, 0, 41782, 6951, 0, 0, 3530,
- 9750, 128317, 0, 6656, 92367, 0, 5046, 8512, 65856, 74261, 8967, 0, 5045,
- 0, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0, 7853, 74068, 74004,
- 9669, 12341, 12703, 8402, 0, 119070, 917600, 41750, 3586, 64508, 43148,
- 0, 0, 119606, 0, 13296, 517, 0, 128534, 194946, 41528, 123, 65454, 0, 0,
- 74478, 10531, 7784, 41526, 10829, 73991, 8057, 1126, 73895, 0, 194591, 0,
- 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, 120441, 120452, 43151, 0,
- 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, 7623,
- 118925, 194853, 9235, 12760, 74176, 69662, 66445, 43540, 10062, 3743,
- 11514, 11078, 0, 12136, 0, 0, 120435, 0, 7726, 0, 19922, 267, 3393,
- 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, 10652, 41612,
- 41077, 3402, 9050, 3398, 0, 0, 0, 3391, 41075, 2476, 0, 128017, 0, 10625,
- 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, 13013, 0, 6673, 0,
- 0, 0, 12438, 0, 0, 0, 0, 0, 9053, 13015, 74523, 0, 704, 66215, 6195, 0,
- 6660, 78758, 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0,
- 127940, 0, 74547, 0, 65448, 78100, 12948, 119001, 195002, 119238, 195004,
- 78099, 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0,
- 42533, 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, 3653, 0, 791,
- 9162, 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 119303, 0, 7557,
- 119339, 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925,
- 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449,
- 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864,
- 8729, 78456, 0, 7845, 917917, 78692, 4408, 4122, 6772, 11039, 8723,
- 194990, 127833, 119302, 731, 119304, 92286, 2438, 64855, 119300, 119299,
- 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0, 0, 0, 41952, 0,
- 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277,
- 12963, 127864, 6189, 4125, 1314, 12133, 0, 118873, 1271, 0, 0, 66024,
- 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0,
- 41390, 5384, 41882, 67647, 92548, 5759, 0, 0, 41388, 92362, 41392, 64288,
- 41387, 0, 8706, 5552, 0, 700, 0, 5553, 0, 7088, 5356, 7499, 78110, 66596,
- 0, 0, 10263, 5554, 0, 12344, 10311, 78113, 6665, 0, 0, 7618, 8517, 11455,
- 78440, 64632, 64447, 5555, 78088, 78093, 78091, 0, 42803, 65033, 9143,
- 6668, 195067, 195066, 195069, 656, 195071, 65037, 4577, 64624, 0, 0, 0,
- 0, 4269, 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895,
- 66683, 10554, 917778, 119121, 0, 5098, 917770, 0, 119099, 5097, 4935,
- 9848, 10381, 0, 128870, 0, 3651, 0, 194610, 127556, 5102, 5101, 10269,
- 12983, 8138, 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, 5099,
- 78373, 1441, 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, 9031,
- 120790, 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 0, 0, 2676,
- 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, 9857, 7014, 9856, 195033,
+ 92395, 8089, 6929, 639, 983563, 68179, 64442, 0, 92348, 4599, 41402,
+ 6674, 43397, 43294, 1476, 648, 0, 65819, 3233, 0, 41782, 6951, 94017,
+ 983967, 3530, 9750, 128317, 0, 6656, 42618, 0, 5046, 8512, 65856, 74261,
+ 8967, 0, 5045, 42026, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0,
+ 7853, 74068, 74004, 9669, 12341, 12703, 8402, 0, 119070, 917600, 41750,
+ 3586, 64508, 43148, 0, 0, 119606, 67983, 13296, 517, 0, 128534, 194946,
+ 41528, 123, 65454, 0, 0, 74478, 10531, 7784, 41526, 10829, 73991, 8057,
+ 1126, 73895, 0, 194591, 0, 3925, 4251, 8069, 10517, 120439, 489, 0, 4250,
+ 120441, 120452, 43151, 983178, 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711,
+ 6183, 0, 0, 0, 120448, 7623, 118925, 118889, 9235, 12760, 74176, 69662,
+ 66445, 43540, 10062, 3743, 11514, 11078, 0, 12136, 0, 126597, 120435, 0,
+ 7726, 0, 19922, 267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0,
+ 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 0, 983340, 0, 3391,
+ 41075, 2476, 0, 128017, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934,
+ 127537, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 983334, 0, 983871,
+ 126638, 9053, 13015, 74523, 0, 704, 66215, 6195, 983819, 6660, 78758,
+ 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983333,
+ 74547, 126585, 65448, 78100, 12948, 119001, 195002, 119238, 195004,
+ 78099, 127085, 0, 128320, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816,
+ 0, 42533, 168, 42845, 4898, 64298, 983141, 0, 4901, 1821, 0, 578, 3653,
+ 0, 791, 9162, 6977, 0, 78889, 74561, 0, 73731, 8354, 43590, 119303,
+ 983441, 7557, 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996,
+ 12811, 65925, 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276,
+ 74599, 78449, 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452,
+ 78083, 128824, 8729, 78456, 0, 7845, 917917, 71302, 4408, 4122, 6772,
+ 11039, 8723, 194990, 71310, 119302, 731, 119304, 92286, 2438, 64855,
+ 119300, 119299, 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0,
+ 0, 0, 41952, 0, 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291,
+ 19915, 5277, 12963, 127864, 6189, 4125, 1314, 12133, 120340, 118873,
+ 1271, 983631, 0, 66024, 41482, 3864, 74539, 0, 3879, 0, 12978, 4166,
+ 4574, 0, 7567, 7459, 983160, 41390, 5384, 41882, 67647, 92548, 5759,
+ 983903, 0, 41388, 64446, 41392, 64288, 41387, 0, 8706, 5552, 983187, 700,
+ 0, 5553, 0, 7088, 5356, 7499, 68007, 66596, 74066, 0, 10263, 5554, 0,
+ 12344, 10311, 78113, 6665, 92626, 0, 7618, 8517, 11455, 78440, 64632,
+ 64447, 5555, 78088, 78093, 78091, 0, 42803, 65033, 9143, 6668, 195067,
+ 67995, 195069, 656, 195071, 65037, 4577, 64624, 0, 0, 0, 983640, 4269,
+ 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895, 66683, 10554,
+ 917778, 119121, 0, 5098, 917770, 0, 119099, 5097, 4935, 9848, 10381, 0,
+ 128870, 983692, 3651, 0, 120730, 127556, 5102, 5101, 10269, 12983, 8138,
+ 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, 5099, 78373, 1441,
+ 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, 9031, 120790,
+ 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 126543, 0, 2676, 2277,
+ 0, 73812, 6190, 8599, 195053, 69918, 10795, 9857, 7014, 9856, 195033,
92620, 12129, 0, 8481, 0, 6202, 195035, 10920, 128237, 5203, 195039,
195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, 74772, 0, 12613, 5284,
- 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 0, 5103, 127861,
- 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, 11438, 0, 0,
- 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 195030,
- 69720, 6476, 5104, 0, 304, 3176, 0, 0, 932, 128663, 6567, 238, 69656,
- 195011, 194595, 19905, 120577, 195015, 78870, 41044, 67640, 194902,
- 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, 309,
- 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 10814, 43275, 6950,
- 9712, 68680, 43970, 0, 65165, 92725, 0, 66466, 0, 0, 0, 66725, 6191,
- 11351, 10437, 11316, 67634, 0, 0, 41754, 67635, 9370, 2720, 194975,
- 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732,
- 0, 917547, 92682, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, 12077,
- 0, 64586, 917620, 42396, 55255, 3475, 128035, 2479, 0, 3632, 120728,
- 10698, 8376, 3648, 194960, 74844, 67639, 3636, 67894, 3650, 8837, 65229,
- 1843, 42283, 43250, 41562, 9100, 74548, 917630, 3640, 127190, 42321,
- 7284, 194974, 194973, 194950, 194949, 194952, 194951, 0, 194953, 42080,
- 2529, 0, 0, 0, 42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634,
- 92380, 9988, 0, 41068, 0, 0, 65264, 0, 0, 92545, 0, 785, 8236, 128647,
- 9027, 68160, 67623, 64383, 128821, 925, 127156, 0, 41985, 41071, 9586, 0,
- 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 0, 0, 381, 0, 0, 42077, 0,
- 127483, 5184, 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, 0,
- 0, 812, 3615, 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605,
- 10692, 1166, 64429, 42639, 924, 0, 67631, 0, 120670, 2442, 10703, 78789,
- 67632, 917924, 12771, 12736, 12753, 0, 73933, 67626, 42401, 0, 0, 127373,
- 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626, 3883,
- 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, 2715,
- 806, 65208, 41884, 917883, 1318, 64731, 0, 0, 0, 66325, 3465, 2405, 9240,
- 0, 12756, 65259, 0, 0, 12752, 5833, 1432, 0, 41883, 73912, 9799, 0,
- 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0, 194587, 0, 1211, 0,
- 0, 0, 118832, 12318, 0, 0, 0, 10622, 0, 0, 78654, 6566, 78659, 0, 73780,
- 0, 64864, 0, 78660, 0, 8284, 13081, 0, 3589, 42051, 4035, 6492, 92236,
- 4265, 6642, 3977, 74186, 41778, 836, 119216, 2488, 0, 4582, 0, 0, 41777,
- 12926, 0, 7528, 10550, 0, 92706, 0, 11439, 0, 1374, 64878, 119014, 0,
- 42389, 41374, 0, 0, 78492, 41377, 127909, 0, 400, 12597, 120586, 0, 0,
- 6661, 0, 64827, 0, 73817, 390, 0, 74755, 0, 3473, 7718, 0, 0, 0, 55285,
- 0, 0, 0, 11969, 0, 127841, 6365, 1887, 6763, 0, 8080, 7006, 0, 0, 6757,
- 64351, 1544, 0, 6766, 64677, 120716, 0, 6146, 0, 771, 0, 0, 12812, 13168,
- 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0, 11491, 9724,
- 10341, 0, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0, 471, 7484, 7482,
- 6753, 7480, 7479, 7478, 7477, 6501, 7475, 6918, 7473, 7472, 2474, 7470,
- 7468, 10232, 10615, 10213, 127288, 92357, 10049, 78884, 3544, 0, 6017,
- 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 0, 120544, 0, 0,
- 92660, 0, 0, 0, 19961, 2472, 42665, 92341, 0, 2139, 4256, 120776, 74380,
- 0, 42675, 42658, 12845, 0, 0, 65138, 119355, 67862, 0, 65671, 120000,
- 120008, 8066, 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, 445, 120566,
- 128308, 0, 0, 8330, 0, 0, 42797, 0, 120215, 0, 3902, 0, 1770, 0, 128866,
- 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866, 118928, 1118, 92209,
- 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 0, 4903, 0, 41386, 5162, 119189,
- 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334, 6324, 41975, 64777,
- 10674, 12308, 12186, 0, 0, 0, 12715, 128349, 0, 0, 2018, 66672, 41979,
- 66685, 119157, 0, 92464, 0, 126984, 0, 9334, 92705, 92315, 0, 7975, 0,
- 77957, 0, 66621, 4884, 66597, 69732, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345,
- 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 0, 0, 42279, 194577, 0,
- 78415, 0, 195008, 0, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482,
- 1471, 0, 0, 42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, 0, 2460, 0,
- 11944, 12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024,
- 127180, 0, 0, 539, 0, 127765, 0, 3853, 65180, 127923, 120796, 120245,
- 92324, 0, 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, 4162, 0, 4260,
- 12953, 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310,
- 5000, 0, 0, 0, 69672, 8213, 74017, 7771, 6161, 0, 6709, 0, 78885, 0,
- 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0, 0, 0,
- 0, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 0, 0, 12210, 7221,
- 42147, 0, 74550, 74465, 64747, 118841, 0, 12516, 4444, 0, 92271, 74537,
- 10892, 8231, 0, 6473, 41968, 78388, 41973, 3591, 41969, 0, 2453, 128549,
- 92666, 64705, 0, 0, 10349, 10413, 43591, 41962, 3202, 74353, 0, 8316, 0,
- 0, 0, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883, 285, 4723, 77927,
- 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0, 42323, 0, 9743,
- 120232, 13134, 0, 0, 0, 0, 0, 42634, 0, 43437, 3081, 11463, 120154, 0, 0,
- 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, 0, 120236, 65221, 63883,
- 43334, 64852, 0, 120235, 66201, 0, 66578, 5001, 41879, 74427, 4121, 5003,
- 884, 66700, 63879, 4943, 5150, 73889, 74182, 127915, 643, 3086, 0, 42448,
- 42299, 58, 0, 917952, 120083, 63873, 8491, 0, 0, 0, 4530, 42409, 7126,
- 194575, 2721, 120074, 119096, 19929, 0, 194574, 0, 4242, 4264, 120077,
- 128132, 66179, 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102,
- 4437, 73948, 128692, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026,
- 4306, 41380, 68432, 92586, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0,
- 5088, 6948, 0, 8524, 0, 0, 12385, 0, 0, 69646, 1386, 64580, 11480, 6116,
- 65039, 65038, 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710,
- 77999, 11663, 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0,
- 63896, 12061, 42096, 43621, 3362, 12377, 0, 0, 68449, 7461, 73901, 1244,
- 331, 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818,
- 41964, 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220,
- 13032, 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 2935, 8698, 12665, 0,
- 1930, 0, 78229, 12427, 66514, 0, 13031, 0, 63901, 0, 3657, 128572, 65202,
+ 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 78786, 5103,
+ 127861, 64348, 41368, 43974, 488, 69811, 0, 71339, 10157, 0, 43034,
+ 11438, 64674, 0, 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813,
+ 41367, 5105, 127509, 69720, 6476, 5104, 983740, 304, 3176, 119010, 0,
+ 932, 120633, 6567, 238, 69656, 195011, 194595, 19905, 120577, 195015,
+ 78870, 41044, 67640, 194902, 42055, 9912, 65939, 10670, 74093, 13273, 0,
+ 12552, 195019, 8803, 309, 6622, 8151, 10858, 78706, 67636, 0, 12568, 0,
+ 12553, 10814, 43275, 6950, 9712, 68680, 43970, 983198, 65165, 92725, 0,
+ 66466, 0, 0, 0, 66725, 6191, 11351, 10437, 11316, 67634, 43763, 0, 41754,
+ 67635, 9370, 2720, 194975, 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663,
+ 0, 0, 10834, 0, 0, 65732, 94095, 917547, 92682, 67679, 195020, 0, 7781,
+ 41383, 64568, 0, 120738, 12077, 0, 64586, 917620, 42396, 55255, 3475,
+ 128035, 2479, 0, 3632, 120728, 10698, 8376, 3648, 194960, 74844, 67639,
+ 3636, 67894, 3650, 8837, 65229, 1843, 42283, 43250, 41562, 9100, 74548,
+ 917630, 3640, 127190, 42321, 7284, 194974, 194973, 194950, 194949,
+ 194952, 194951, 126649, 194953, 42080, 2529, 0, 0, 0, 42083, 120678,
+ 68398, 194957, 67619, 66367, 194958, 9634, 92380, 9988, 0, 41068, 0,
+ 4295, 65264, 68006, 0, 92545, 0, 785, 8236, 128647, 9027, 68160, 67623,
+ 64383, 120265, 925, 127156, 0, 41985, 41071, 9586, 0, 41984, 9217, 0, 0,
+ 0, 9186, 2067, 4016, 983794, 0, 381, 12936, 0, 42077, 0, 69880, 5184,
+ 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, 0, 0, 812, 3615,
+ 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605, 10692, 1166,
+ 64429, 42639, 924, 0, 67631, 42616, 120670, 2442, 10703, 78789, 67632,
+ 917924, 12771, 12736, 12753, 66708, 73933, 67626, 42401, 0, 69872,
+ 127373, 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626,
+ 3883, 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585,
+ 2715, 806, 65208, 41884, 917883, 1318, 64731, 126578, 0, 0, 66325, 3465,
+ 2405, 9240, 0, 12756, 65259, 0, 983772, 12752, 5833, 1432, 0, 41883,
+ 73912, 9799, 0, 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0,
+ 194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, 0, 68005, 10622, 983770, 0,
+ 78654, 6566, 78659, 0, 73780, 119196, 64864, 0, 78660, 0, 8284, 13081, 0,
+ 3589, 42051, 4035, 6492, 92236, 4265, 6642, 3977, 74186, 41778, 836,
+ 119216, 2488, 0, 4582, 0, 0, 41777, 12926, 983369, 7528, 10550, 0, 92706,
+ 0, 10961, 0, 1374, 64878, 119014, 0, 42389, 41374, 2286, 0, 78492, 41377,
+ 127909, 0, 400, 12597, 120586, 0, 0, 6661, 983145, 64827, 0, 73817, 390,
+ 0, 71301, 983853, 3473, 7718, 0, 0, 0, 55285, 0, 0, 0, 11969, 983382,
+ 127841, 6365, 1887, 6763, 983362, 8080, 7006, 0, 983363, 6757, 64351,
+ 1544, 0, 6766, 64677, 120716, 983364, 6146, 0, 771, 983365, 0, 12812,
+ 13168, 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0,
+ 11491, 9724, 10341, 983764, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0,
+ 471, 7484, 7482, 6753, 7480, 5764, 7478, 7477, 6501, 7475, 6918, 7473,
+ 7472, 2474, 7470, 7468, 10232, 10615, 10213, 127288, 92357, 10049, 11834,
+ 3544, 0, 6017, 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 0,
+ 120544, 0, 0, 92660, 0, 0, 0, 19961, 2472, 42665, 92341, 0, 2139, 4256,
+ 120776, 74380, 0, 42675, 42658, 12845, 0, 0, 65138, 119355, 67862, 0,
+ 65671, 7083, 120008, 8066, 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0,
+ 445, 120566, 128308, 0, 0, 8330, 0, 0, 42797, 983150, 120215, 0, 3902, 0,
+ 1770, 0, 128866, 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866,
+ 118928, 1118, 71334, 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 69921, 4903,
+ 0, 41386, 5162, 119189, 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334,
+ 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, 983732, 12715, 68002,
+ 983471, 126630, 2018, 66672, 41979, 66685, 119157, 68000, 92464, 0,
+ 126984, 68001, 9334, 92705, 92315, 70101, 7975, 0, 77957, 0, 66621, 4884,
+ 66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, 0, 2345, 43697, 463, 0, 0,
+ 119607, 3117, 5460, 0, 0, 983379, 0, 42279, 194577, 0, 78415, 0, 195008,
+ 983376, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 1471, 0, 0,
+ 42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, 983685, 2460, 0, 11944,
+ 12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024, 127180, 0,
+ 0, 539, 0, 127765, 94052, 3853, 65180, 127923, 120796, 120245, 92324, 0,
+ 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, 4162, 0, 4260, 12953,
+ 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310, 5000,
+ 0, 983579, 0, 69672, 8213, 74017, 7771, 6161, 68018, 6709, 0, 78885,
+ 983699, 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0,
+ 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 983256, 0,
+ 12210, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, 12516, 4444, 0,
+ 92271, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, 3591, 41969, 0,
+ 2453, 128549, 92666, 64705, 0, 0, 10349, 10413, 43591, 41962, 3202,
+ 74353, 0, 8316, 0, 0, 94060, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883,
+ 285, 4723, 70099, 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0,
+ 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, 983335, 43437,
+ 3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, 2614, 9125, 119023, 1729,
+ 0, 120236, 65221, 63883, 43334, 64852, 0, 65194, 66201, 0, 66578, 5001,
+ 41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, 73889, 74182,
+ 127915, 643, 3086, 0, 42448, 42299, 58, 0, 917952, 120083, 63873, 8491,
+ 0, 0, 0, 4530, 42409, 7126, 194575, 2721, 120074, 119096, 19929, 0,
+ 194574, 0, 4242, 4264, 120077, 120530, 66179, 42412, 65941, 13114, 64522,
+ 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, 983232, 55280, 42174,
+ 194925, 42430, 0, 0, 42355, 66026, 4306, 41380, 68432, 92586, 0, 66667,
+ 127309, 0, 126521, 42200, 42566, 0, 0, 5088, 6948, 0, 8524, 0, 0, 12385,
+ 0, 0, 69646, 1386, 64580, 11480, 6116, 65039, 65038, 12392, 65036, 8064,
+ 0, 12101, 5822, 119004, 2080, 710, 77999, 11663, 1666, 42091, 119657,
+ 12383, 43671, 42092, 68418, 4289, 0, 63896, 12061, 42096, 43621, 3362,
+ 12377, 983823, 983825, 68449, 7461, 73901, 1244, 331, 73786, 12683,
+ 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, 41964, 42208, 63843,
+ 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, 13032, 0, 584,
+ 12933, 43177, 12373, 69855, 13000, 1351, 2935, 8698, 12665, 0, 1930, 0,
+ 78229, 12427, 66514, 69859, 13031, 0, 63901, 0, 3657, 128572, 65202,
6000, 119206, 12426, 127181, 0, 41740, 12428, 41283, 41916, 119210, 0, 0,
12429, 6727, 0, 7562, 0, 5170, 0, 41755, 676, 0, 66704, 66664, 9978,
66491, 3536, 0, 9752, 92397, 6162, 0, 69228, 10113, 41829, 65886, 5159,
@@ -16421,706 +17331,731 @@ static unsigned int code_hash[] = {
0, 63867, 4133, 11371, 210, 4600, 0, 74560, 4137, 8082, 78506, 119062,
78504, 6704, 4591, 128029, 0, 0, 9680, 0, 120623, 561, 12159, 195, 78508,
41501, 0, 42031, 5719, 7172, 42687, 8368, 0, 41499, 0, 0, 42242, 41498,
- 917794, 42025, 78567, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213,
+ 917794, 42025, 78565, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213,
73941, 0, 42330, 917784, 3969, 0, 0, 7169, 1992, 9652, 73977, 7246,
- 42086, 917790, 917789, 0, 0, 128801, 0, 0, 327, 0, 9042, 917777, 917776,
- 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 0, 917782,
- 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0, 128014,
- 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436, 0, 42021, 0,
- 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, 11348, 0, 78037, 9194,
- 0, 0, 19914, 12179, 0, 9648, 194923, 63836, 63832, 917773, 10967, 63816,
- 2594, 3444, 63817, 64651, 0, 41503, 127478, 11265, 0, 120756, 194922, 0,
- 5664, 3972, 0, 0, 0, 128508, 12416, 917764, 119608, 10816, 917769,
- 917768, 12418, 74111, 3882, 8532, 917771, 1573, 128648, 119847, 4596,
- 66339, 12417, 66001, 65343, 194782, 12414, 8287, 68219, 195017, 68108,
- 1143, 119169, 119846, 12415, 6626, 42763, 0, 118884, 9021, 120783, 0,
- 11724, 0, 0, 127104, 128526, 0, 0, 8027, 10997, 9171, 12741, 11400,
- 74197, 194799, 0, 128239, 0, 128881, 119604, 127523, 120190, 194773,
- 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514, 68651, 0, 0,
- 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, 8521, 5083,
- 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 120715, 0, 120183,
- 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, 8407, 0,
- 10805, 8518, 10779, 120188, 0, 0, 12367, 42170, 0, 92557, 629, 1924, 0,
- 12037, 74366, 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369,
- 10649, 0, 5077, 127108, 10880, 63927, 5075, 917881, 0, 65075, 0, 11007,
- 0, 66659, 92607, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, 5272,
- 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0,
- 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, 0, 66461, 5177,
- 41324, 12055, 8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, 8948,
- 41325, 0, 721, 10182, 9108, 0, 0, 119185, 42229, 194912, 0, 5998, 0,
- 42353, 74825, 0, 12587, 0, 78571, 0, 0, 194562, 41576, 42215, 78570,
- 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, 63949, 64767,
- 2670, 4167, 0, 11723, 0, 74120, 0, 65076, 938, 43414, 73854, 11737, 9721,
- 0, 0, 0, 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, 10793, 5250,
- 12407, 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0,
- 42002, 12404, 0, 0, 4940, 12410, 7683, 1167, 73729, 4983, 0, 861, 0, 0,
- 0, 0, 65577, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, 12816, 74583,
+ 42086, 126615, 2219, 0, 0, 128801, 194837, 0, 327, 0, 9042, 917777,
+ 917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 983826,
+ 917782, 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0,
+ 128014, 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436,
+ 983239, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197,
+ 11348, 0, 78037, 9194, 983184, 0, 19914, 12179, 983803, 2296, 194923,
+ 63836, 63832, 917773, 10967, 63816, 2594, 3444, 63817, 64651, 0, 41503,
+ 127478, 11265, 0, 120756, 194922, 0, 5664, 3972, 0, 0, 0, 128508, 12416,
+ 917764, 119608, 10816, 917769, 917768, 12418, 74111, 3882, 8532, 917771,
+ 1573, 128648, 119847, 4596, 66339, 12417, 66001, 65343, 126491, 12414,
+ 8287, 68219, 195017, 68108, 1143, 119169, 119846, 12415, 6626, 42763, 0,
+ 118884, 9021, 120783, 0, 11724, 0, 0, 127104, 126619, 0, 0, 8027, 10997,
+ 9171, 12741, 11400, 71305, 194799, 0, 128239, 0, 128881, 119604, 127523,
+ 120190, 194773, 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514,
+ 68651, 0, 983886, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809,
+ 3889, 8521, 5083, 5082, 119859, 120184, 8519, 983235, 3014, 5081, 65853,
+ 120715, 0, 68014, 69951, 5079, 64802, 42210, 4597, 65532, 11828, 120185,
+ 12371, 0, 8407, 0, 10805, 8518, 10779, 120188, 71303, 983924, 12367,
+ 42170, 0, 92557, 629, 1924, 0, 12037, 74366, 5987, 8462, 8005, 12365,
+ 63933, 69735, 120815, 12369, 10649, 67981, 5077, 120174, 10880, 63927,
+ 5075, 917881, 0, 65075, 0, 11007, 983696, 66659, 92607, 0, 66684, 0,
+ 3434, 4954, 1904, 0, 5266, 126980, 5272, 10499, 4507, 9578, 63923,
+ 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, 4504, 1505, 0, 6325,
+ 5276, 43021, 120488, 0, 55236, 0, 66461, 5177, 41324, 12055, 8722, 0,
+ 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, 41325, 0, 721, 10182, 9108,
+ 71311, 0, 119185, 42229, 194912, 0, 5998, 0, 42353, 74825, 0, 12587,
+ 94104, 78571, 0, 71328, 194562, 41576, 42215, 78570, 119207, 0, 8578,
+ 5995, 7573, 41575, 74789, 74752, 63944, 63949, 64767, 2670, 4167, 194796,
+ 11723, 0, 74120, 0, 65076, 938, 43414, 73854, 11737, 9721, 0, 0, 0,
+ 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, 10793, 5250, 12407,
+ 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0, 42002,
+ 12404, 983553, 0, 4940, 12410, 7683, 1167, 73729, 4983, 120507, 861, 0,
+ 0, 0, 0, 43757, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, 12816, 43759,
42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 195044, 0, 12577,
- 0, 0, 853, 42693, 195014, 0, 0, 5016, 43535, 63893, 42835, 9491, 917913,
- 0, 917914, 0, 12712, 7105, 127807, 65060, 120797, 9900, 0, 0, 194919, 0,
- 127830, 0, 64778, 12585, 10565, 128151, 12177, 0, 0, 0, 77824, 0, 4900,
- 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593, 43113, 9702, 78594,
- 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710, 12397, 77827, 0,
- 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, 5010, 1680, 10507,
- 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 128181, 5993, 2819, 0,
- 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, 63997, 63910,
- 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 128313, 0, 43339, 0, 9836,
- 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, 1664, 1850,
- 128841, 3079, 11340, 42408, 42447, 127140, 120020, 42307, 12386, 42304,
- 917555, 0, 12389, 0, 92366, 41996, 11526, 63985, 5864, 1147, 63992,
- 42887, 1987, 92718, 5480, 7858, 11653, 4116, 12391, 66193, 0, 4939,
- 12384, 0, 0, 41686, 63905, 119601, 194688, 0, 0, 12649, 0, 0, 8247, 507,
- 91, 2042, 120775, 43643, 194689, 66028, 10036, 41844, 119813, 774,
- 119831, 0, 119815, 5994, 12539, 0, 78375, 120597, 119833, 0, 119600, 0,
- 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, 41073, 9687, 41681,
- 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, 42379, 0, 7534,
- 12219, 0, 127528, 42810, 10492, 0, 0, 0, 43119, 0, 120753, 12403, 2500,
- 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103, 19946, 74112, 77851,
- 13112, 0, 195012, 12859, 0, 120148, 66369, 5861, 127758, 11999, 12400, 0,
- 0, 12645, 5146, 11320, 68410, 6748, 65040, 0, 64184, 12974, 64183, 67613,
- 120645, 5147, 0, 0, 74524, 0, 1928, 0, 67649, 5991, 3445, 67609, 4976,
- 64176, 0, 67610, 8241, 0, 77868, 4206, 0, 0, 0, 128298, 0, 10138, 0, 0,
- 8897, 0, 0, 8357, 4124, 77862, 65836, 120641, 127926, 77859, 0, 0, 1123,
- 963, 41553, 10120, 12405, 120150, 92664, 398, 13278, 9723, 6366, 120311,
- 7945, 0, 4402, 9970, 12402, 0, 42392, 1305, 12408, 0, 44007, 0, 0, 41464,
- 12411, 12969, 120824, 41465, 0, 8528, 1575, 0, 63955, 165, 3024, 41467,
- 119163, 0, 9093, 0, 9147, 0, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750,
- 195018, 0, 9594, 0, 0, 43527, 0, 727, 194703, 0, 5805, 0, 6726, 0, 42176,
- 12370, 11655, 119095, 10591, 12364, 0, 12372, 120642, 120307, 0, 92343,
- 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803,
- 4132, 120306, 68474, 92473, 0, 0, 74837, 120155, 1499, 0, 8055, 42740,
+ 0, 983875, 853, 42693, 195014, 0, 983638, 5016, 43535, 63893, 42835,
+ 9491, 917913, 0, 917914, 0, 12712, 7105, 127807, 65060, 120797, 9900,
+ 7750, 0, 194919, 0, 127830, 0, 64778, 12585, 10565, 128151, 12177, 0, 0,
+ 0, 77824, 0, 4900, 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593,
+ 43113, 9702, 78594, 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710,
+ 12397, 77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0,
+ 5010, 1680, 10507, 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 128181,
+ 5993, 2819, 0, 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0,
+ 63997, 63910, 63996, 3077, 0, 0, 1512, 69929, 12589, 41479, 128313, 0,
+ 43339, 0, 9836, 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817,
+ 1664, 1850, 128841, 3079, 11340, 42408, 42447, 127140, 120020, 42307,
+ 12386, 42304, 917555, 0, 12389, 0, 92366, 41996, 11526, 63985, 5864,
+ 1147, 63992, 42887, 1987, 92718, 5480, 7858, 11653, 4116, 12391, 66193,
+ 0, 4939, 12384, 0, 0, 41686, 63905, 119601, 194688, 983190, 0, 12649, 0,
+ 0, 8247, 507, 91, 2042, 120775, 43643, 194689, 66028, 10036, 41844,
+ 119813, 774, 119829, 0, 119815, 5994, 12539, 0, 78375, 120597, 119833,
+ 983105, 119600, 0, 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219,
+ 41073, 9687, 41681, 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681,
+ 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, 983652, 0, 43119, 0,
+ 120753, 12403, 2500, 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103,
+ 19946, 74112, 77851, 13112, 0, 195012, 12859, 70087, 120148, 66369, 5861,
+ 127758, 11999, 12400, 0, 983830, 12645, 5146, 11320, 68410, 6748, 65040,
+ 0, 64184, 12974, 64183, 67613, 120645, 5147, 0, 0, 74524, 0, 1928, 0,
+ 67649, 5991, 3445, 67609, 4976, 64176, 0, 67610, 8241, 0, 77868, 4206, 0,
+ 0, 0, 128298, 0, 10138, 0, 0, 8897, 120234, 0, 8357, 4124, 77862, 65836,
+ 120641, 127926, 77859, 0, 0, 1123, 963, 41553, 10120, 12405, 120150,
+ 92664, 398, 13278, 9723, 6366, 120311, 7945, 0, 4402, 9970, 12402,
+ 983136, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, 12969, 120824,
+ 41465, 983565, 8528, 1575, 0, 63955, 165, 3024, 41467, 119163, 0, 9093,
+ 0, 9147, 128787, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750, 195018, 0,
+ 9594, 0, 0, 43527, 0, 727, 194703, 195023, 5805, 0, 6726, 0, 42176,
+ 12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, 120307, 0, 92343, 0,
+ 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, 4132,
+ 120306, 68474, 92473, 0, 983305, 74837, 120155, 1499, 0, 8055, 42740,
63965, 0, 63962, 74042, 8924, 43123, 5988, 3660, 63969, 11781, 42718,
8788, 1357, 64851, 65743, 0, 8774, 0, 127086, 9941, 120172, 0, 1933,
69655, 9564, 0, 92435, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615,
- 0, 78302, 12220, 67616, 120598, 127475, 0, 68200, 6675, 128144, 0, 67592,
- 120685, 0, 64771, 1198, 9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101,
- 1398, 0, 92554, 74034, 41569, 92684, 11406, 8167, 12127, 0, 840, 0, 0, 0,
- 6967, 0, 0, 9796, 0, 333, 0, 0, 8144, 2117, 0, 0, 12406, 0, 19931,
- 119089, 6678, 7769, 0, 12621, 0, 127366, 10227, 4764, 43101, 9981, 0,
- 40986, 4127, 66487, 0, 42202, 12754, 195022, 0, 0, 0, 67594, 2048, 12944,
- 4050, 67595, 917967, 43102, 10581, 12985, 4533, 195021, 74003, 6490, 0,
- 12038, 0, 0, 120704, 65461, 9798, 69704, 0, 1948, 119007, 0, 952, 128235,
- 0, 0, 120802, 6449, 9494, 120313, 0, 43098, 4843, 8142, 64160, 4098,
- 64170, 0, 0, 3436, 119973, 0, 12817, 67597, 6676, 3930, 66708, 0, 0,
- 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, 0, 8500, 42222, 120142,
- 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, 67606, 119083, 0, 42217,
- 13102, 0, 66003, 6672, 0, 0, 0, 0, 63841, 9613, 9001, 4526, 11274, 67601,
- 64520, 64210, 6664, 78704, 42056, 10228, 64957, 11281, 0, 64213, 1469,
- 66640, 65381, 42197, 4988, 42372, 0, 9598, 904, 352, 42225, 1451, 8061,
- 8453, 4134, 0, 74847, 66576, 127916, 0, 10520, 8575, 9960, 1201, 127289,
- 12846, 127291, 127292, 11919, 64962, 127287, 43739, 127281, 8511, 9460,
- 823, 11587, 12305, 0, 64695, 127305, 12387, 1253, 13183, 65766, 500,
- 42783, 65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702,
- 66498, 9821, 64304, 0, 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323,
- 120062, 92669, 0, 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0,
- 5260, 43143, 0, 326, 120131, 68423, 0, 10771, 2876, 74074, 92530, 194924,
- 41398, 7382, 9802, 127077, 127076, 453, 41396, 120524, 42720, 12140,
- 9572, 0, 7003, 194883, 42334, 7704, 0, 194885, 43144, 4123, 8494, 43146,
- 9977, 0, 0, 65759, 10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521,
- 9589, 64755, 0, 64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024,
- 128072, 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 0,
- 64005, 4058, 119019, 0, 64660, 0, 119050, 0, 0, 1139, 43298, 64027,
- 64029, 8970, 0, 9934, 0, 10774, 128020, 42201, 12421, 128216, 0, 1852,
- 3057, 128113, 73744, 64034, 64039, 0, 0, 0, 0, 92322, 7645, 12854, 74338,
- 3496, 0, 0, 0, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419, 13309,
- 11570, 127811, 19960, 11696, 0, 1018, 118970, 194909, 194897, 1682,
- 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, 6768, 10728,
- 194830, 119010, 118863, 43311, 64966, 11577, 0, 43040, 1833, 11576, 0,
- 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, 120387,
+ 70081, 78302, 12220, 67616, 120598, 127475, 0, 68200, 6675, 128144, 0,
+ 67592, 120685, 0, 64771, 1198, 9132, 0, 64619, 510, 64663, 0, 0, 4561,
+ 2101, 1398, 0, 92554, 74034, 41569, 92684, 11406, 8167, 12127, 0, 840, 0,
+ 126518, 7101, 6967, 0, 194898, 9796, 0, 333, 69891, 0, 8144, 2117, 0,
+ 983595, 12406, 0, 19931, 119089, 6678, 7769, 0, 12621, 0, 127366, 10227,
+ 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, 42202, 12754, 195022, 0, 0,
+ 94097, 67594, 2048, 12944, 4050, 67595, 917967, 43102, 10581, 12985,
+ 4533, 195021, 74003, 6490, 0, 12038, 0, 0, 120704, 65461, 9798, 69704, 0,
+ 1948, 69841, 0, 952, 128235, 0, 0, 120802, 6449, 9494, 120313, 0, 43098,
+ 4843, 8142, 64160, 4098, 64170, 0, 0, 3436, 119973, 0, 12817, 67597,
+ 6676, 3930, 42615, 0, 0, 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0,
+ 0, 8500, 42222, 120142, 73743, 120400, 4317, 11543, 67676, 64676, 0, 0,
+ 67606, 119083, 0, 42217, 13102, 0, 66003, 6672, 0, 0, 0, 983738, 63841,
+ 9613, 9001, 4526, 11274, 67601, 64520, 64210, 6664, 78704, 42056, 10228,
+ 64957, 11281, 0, 3807, 1469, 66640, 65381, 42197, 4988, 42372, 0, 9598,
+ 904, 352, 42225, 1451, 8061, 8453, 4134, 0, 74847, 66576, 127916, 0,
+ 10520, 8575, 9960, 1201, 127289, 12846, 127291, 127292, 11919, 64962,
+ 127287, 43739, 127281, 8511, 9460, 823, 11587, 12305, 0, 64695, 127305,
+ 12387, 1253, 13183, 65766, 500, 42783, 65765, 64208, 64369, 65760, 65761,
+ 119585, 11606, 64784, 11702, 66498, 9821, 64304, 0, 5152, 11048, 7533,
+ 68366, 64410, 92305, 0, 4323, 120062, 92669, 71332, 127052, 42587, 42214,
+ 41394, 0, 4763, 4112, 118935, 0, 5260, 43143, 94038, 326, 120131, 68423,
+ 0, 10771, 2876, 74074, 92530, 194924, 41398, 7382, 9802, 127077, 127076,
+ 453, 41396, 120524, 42720, 12140, 9572, 0, 7003, 194883, 42334, 7704,
+ 126490, 194885, 43144, 4123, 8494, 43146, 9977, 0, 0, 65759, 10765,
+ 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, 9589, 64755, 0, 64020,
+ 126604, 10464, 0, 0, 194869, 64514, 11528, 64024, 128072, 679, 64013, 0,
+ 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 983567, 64005, 4058,
+ 119019, 126487, 64660, 0, 119050, 0, 983069, 1139, 43298, 64027, 64029,
+ 8970, 0, 9934, 983094, 10774, 128020, 42201, 12421, 128216, 0, 1852,
+ 3057, 64046, 73744, 64034, 64039, 0, 0, 0, 194899, 92322, 7645, 12854,
+ 74338, 3496, 0, 0, 0, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419,
+ 13309, 11570, 127811, 19960, 11696, 0, 1018, 118970, 194909, 194897,
+ 1682, 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, 6768,
+ 10728, 194830, 71316, 118863, 43311, 64966, 11577, 0, 43040, 1833, 11576,
+ 0, 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, 120387,
9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, 65693, 0, 0,
- 0, 69695, 42240, 0, 0, 42864, 0, 64667, 41868, 1184, 0, 815, 11484,
- 127535, 67840, 0, 0, 128793, 0, 10986, 64683, 0, 0, 194709, 0, 0, 9879,
- 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, 5142, 2407,
- 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 92390,
- 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, 2652,
- 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562,
+ 0, 69695, 42240, 0, 126651, 42864, 126498, 64667, 41868, 1184, 0, 815,
+ 11484, 127535, 67840, 983642, 0, 66197, 0, 10986, 64683, 983776, 0, 3455,
+ 0, 0, 9879, 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0,
+ 5142, 2407, 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0,
+ 0, 92390, 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0,
+ 2652, 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562,
917505, 1828, 74474, 120327, 78620, 8531, 12499, 6280, 12324, 118854,
65238, 68374, 4832, 65573, 0, 6279, 12508, 12904, 12502, 9161, 0, 1620,
- 64436, 3601, 195094, 128073, 0, 609, 11555, 0, 12496, 127839, 74181,
- 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, 0,
- 43565, 127082, 0, 12696, 128256, 0, 194796, 12929, 0, 712, 0, 4197, 0,
- 42818, 128688, 0, 120490, 0, 119137, 1506, 43562, 0, 0, 0, 12651, 0,
- 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592, 118844, 0,
- 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178, 0, 69760,
- 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0, 9080, 127000,
- 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488, 65166, 119112,
- 0, 0, 0, 0, 128208, 0, 5265, 69235, 0, 11487, 67858, 12464, 0, 43045, 0,
- 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0, 43346, 8116,
- 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, 0, 120811, 0,
- 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, 55257, 73771, 1766,
- 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, 64595, 127294, 0,
- 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, 0, 0, 119060,
- 64953, 5406, 19920, 92216, 66510, 3590, 0, 1130, 0, 0, 42016, 11823,
- 43023, 0, 118896, 7742, 0, 13280, 0, 9326, 73826, 5310, 74812, 78584,
- 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, 0,
- 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, 0, 0,
- 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, 0, 118990,
- 10491, 0, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981,
- 12382, 42133, 120755, 9706, 69738, 0, 66610, 10461, 12103, 0, 8642, 0,
- 42766, 0, 66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, 8041,
- 1461, 910, 119133, 0, 6749, 3658, 0, 120525, 0, 7617, 194841, 12888, 0,
- 67668, 13143, 0, 9193, 11097, 5703, 0, 41517, 41504, 41519, 10016, 64305,
- 0, 65864, 623, 781, 670, 10660, 5769, 613, 7543, 120279, 477, 41083,
- 92521, 0, 592, 1578, 12459, 43449, 0, 0, 8225, 0, 654, 11345, 653, 652,
- 0, 647, 0, 633, 120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, 120529,
- 74199, 12482, 0, 12489, 0, 3195, 5550, 0, 7897, 0, 1203, 74396, 1813,
- 64544, 41311, 12090, 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, 10595, 0,
- 119077, 0, 0, 0, 0, 0, 43244, 0, 0, 0, 119561, 0, 0, 194921, 128160,
- 9939, 0, 0, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0, 74038,
- 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, 9282, 66489,
- 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0, 10732,
- 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, 68627, 0, 11544, 10203,
- 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311, 777, 120187,
- 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 0, 9454, 63778, 8658,
- 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 0,
- 2701, 0, 0, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 0, 63745, 1748,
- 63770, 0, 0, 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, 6096,
- 0, 7694, 0, 7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, 1591, 0,
- 6386, 63783, 0, 0, 127173, 0, 0, 0, 74575, 0, 65719, 13083, 64574, 65012,
- 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, 1922, 0, 12498, 10987,
- 0, 0, 3894, 65543, 0, 194842, 0, 493, 0, 43197, 1717, 4228, 479, 10303,
- 74020, 0, 917935, 10335, 3520, 917932, 12490, 64315, 0, 127039, 12493,
- 6233, 42681, 1002, 12491, 0, 64911, 92615, 2096, 65120, 0, 0, 0, 11611,
- 11632, 127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216,
- 8507, 66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 0, 7909,
- 66234, 11605, 63759, 0, 66208, 73999, 63799, 63803, 244, 11542, 12898,
- 12494, 73761, 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882, 13040,
- 0, 8612, 4885, 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0, 63797,
- 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, 470,
- 78038, 78035, 78036, 0, 78034, 4579, 128090, 0, 12511, 74453, 12514, 0,
- 74579, 7239, 7001, 8623, 0, 128052, 128048, 7378, 12512, 11615, 6104, 0,
- 0, 659, 6098, 0, 12234, 127307, 127067, 8311, 12510, 41803, 13039,
- 127072, 12513, 10202, 12471, 0, 8747, 0, 0, 0, 2323, 0, 2319, 77917,
- 12477, 77916, 2311, 0, 4415, 237, 6281, 127280, 0, 0, 2309, 1312, 8173,
- 128871, 12469, 0, 78505, 64335, 10609, 0, 128111, 9397, 11524, 9395,
- 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, 9383,
- 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, 128167,
- 7948, 9236, 0, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082,
- 10924, 3147, 0, 120684, 12524, 119081, 2310, 11818, 9381, 9382, 9379,
- 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 12444, 0, 0, 13016,
- 8210, 0, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 0, 4155, 0, 0,
- 42030, 5007, 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, 0,
- 12525, 0, 12016, 65770, 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0,
- 92567, 65691, 63998, 1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0,
- 12231, 0, 12500, 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047,
- 120321, 78395, 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0,
- 9076, 8862, 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782,
- 128817, 8546, 11553, 63995, 13177, 9043, 6303, 0, 498, 64471, 120324,
+ 64436, 3601, 195094, 128073, 983562, 609, 11555, 983099, 12496, 127839,
+ 74181, 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0,
+ 0, 43565, 71306, 126493, 12696, 128256, 0, 94062, 12929, 0, 712, 0, 4197,
+ 983204, 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 0,
+ 12651, 0, 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592,
+ 118844, 0, 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178,
+ 0, 69760, 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0,
+ 9080, 127000, 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488,
+ 65166, 119112, 0, 0, 0, 0, 71313, 0, 5265, 69235, 0, 11487, 67858, 12464,
+ 0, 43045, 0, 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0,
+ 43346, 8116, 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334,
+ 983602, 120811, 0, 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855,
+ 55257, 73771, 1766, 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665,
+ 64595, 127294, 0, 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0,
+ 0, 0, 119060, 64953, 5406, 19920, 69897, 66510, 3590, 194864, 1130, 0, 0,
+ 42016, 11823, 43023, 0, 118896, 7742, 0, 13280, 71323, 9326, 73826, 5310,
+ 74812, 78584, 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816,
+ 120803, 983839, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519,
+ 127182, 0, 73917, 7843, 69783, 11689, 5410, 5783, 10468, 8403, 5400,
+ 11594, 128247, 0, 118990, 10491, 69842, 64412, 0, 0, 5587, 42865, 64404,
+ 8268, 4923, 65086, 8981, 12382, 42133, 120755, 9706, 69738, 0, 66610,
+ 10461, 12103, 0, 8642, 0, 42766, 983857, 2210, 9983, 0, 94009, 0, 0, 0,
+ 7398, 41515, 0, 11802, 8041, 1461, 910, 119133, 0, 6749, 3658, 93964,
+ 120525, 0, 7617, 194841, 12888, 127983, 67668, 13143, 0, 9193, 11097,
+ 5703, 0, 41517, 41504, 41519, 10016, 64305, 0, 65864, 623, 781, 670,
+ 10660, 5769, 613, 7543, 120279, 477, 41083, 92521, 0, 592, 1578, 12459,
+ 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, 0, 647, 0, 633, 120744, 0,
+ 126472, 12480, 43243, 0, 39, 12487, 0, 120529, 74199, 12482, 0, 12489, 0,
+ 3195, 5550, 983554, 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, 0,
+ 2877, 0, 0, 1675, 69840, 0, 0, 0, 10070, 10595, 0, 119077, 194777,
+ 983611, 0, 0, 0, 43244, 0, 0, 983907, 119561, 983078, 0, 194921, 128160,
+ 9939, 0, 983151, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0,
+ 74038, 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, 9282,
+ 66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0,
+ 10732, 68640, 850, 4972, 0, 12890, 2909, 68619, 44008, 68627, 983709,
+ 11544, 10203, 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311,
+ 777, 120187, 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 983230,
+ 9454, 63778, 8658, 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765,
+ 42502, 8280, 74520, 2701, 0, 127002, 5767, 0, 0, 9809, 8353, 63747,
+ 66701, 63772, 983805, 63745, 1748, 63770, 0, 0, 0, 65542, 63766, 55244,
+ 3061, 0, 63764, 63787, 9067, 6096, 0, 7694, 0, 7257, 63768, 3485, 12987,
+ 0, 127522, 120628, 63807, 1591, 0, 6386, 63783, 0, 0, 92535, 0, 0, 0,
+ 74575, 0, 65719, 13083, 64574, 65012, 0, 1640, 12495, 66691, 7624, 3138,
+ 10996, 92247, 1922, 0, 12498, 10987, 69936, 69939, 3894, 65543, 0,
+ 194842, 983588, 493, 0, 43197, 1717, 4228, 479, 10303, 74020, 0, 917935,
+ 10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002,
+ 12491, 0, 64911, 92615, 2096, 65120, 0, 78219, 983081, 11611, 11632,
+ 127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, 8507,
+ 66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 983552, 7909,
+ 66234, 11605, 63759, 983645, 66208, 73999, 63799, 63803, 244, 11542,
+ 12898, 12494, 73761, 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882,
+ 13040, 0, 8612, 4885, 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0,
+ 63797, 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040,
+ 470, 78038, 78035, 78036, 70028, 78034, 4579, 128090, 0, 12511, 74453,
+ 12514, 0, 74579, 7239, 7001, 8623, 94011, 128052, 128048, 7378, 12512,
+ 11615, 6104, 0, 0, 659, 6098, 0, 12234, 127307, 127067, 8311, 12510,
+ 41803, 13039, 127072, 12513, 10202, 12471, 0, 8747, 983911, 0, 0, 2323,
+ 0, 2319, 77917, 12477, 77916, 2311, 0, 4415, 237, 6281, 127280, 0, 0,
+ 2309, 1312, 8173, 128871, 12469, 0, 78505, 64335, 10609, 0, 128111, 9397,
+ 11524, 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932,
+ 9386, 9383, 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659,
+ 2313, 128167, 7948, 9236, 92571, 0, 0, 10570, 43473, 6289, 10484, 0, 0,
+ 11998, 12082, 10924, 3147, 0, 120684, 12524, 119081, 2310, 11818, 9381,
+ 9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 983769, 9372,
+ 12444, 0, 0, 13016, 8210, 983949, 42029, 11079, 12331, 43451, 42032,
+ 8744, 726, 0, 983828, 4155, 0, 0, 42030, 5007, 12522, 43088, 0, 4951,
+ 127805, 127240, 0, 9922, 43309, 983832, 12525, 983463, 12016, 65770,
+ 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 92567, 65691, 63998,
+ 1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0, 12231, 0, 12500,
+ 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, 78395,
+ 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, 9076, 8862,
+ 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, 126514,
+ 8546, 11553, 63995, 13177, 9043, 6303, 983938, 498, 64471, 120324,
128567, 12529, 8042, 0, 2344, 12528, 8031, 2414, 0, 69719, 3231, 0, 6422,
66512, 69653, 12530, 2537, 78405, 41429, 12658, 13036, 65772, 0, 78738,
41433, 4719, 469, 0, 4363, 3313, 41428, 78407, 2023, 1772, 78224, 78225,
65706, 10051, 64812, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363,
9607, 0, 9663, 0, 119634, 6503, 41110, 0, 1491, 0, 0, 127304, 41061, 0,
- 0, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, 41108, 9738,
- 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717, 127776,
- 9940, 127299, 7692, 0, 8008, 41131, 330, 8566, 65083, 41133, 9816,
- 128074, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139,
+ 194838, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, 41108,
+ 9738, 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717,
+ 127776, 9940, 127299, 7692, 983824, 8008, 41131, 330, 8566, 65083, 41133,
+ 9816, 126517, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139,
78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, 0, 64136, 12536,
- 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, 128810, 0, 65599,
- 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207, 0, 6117,
- 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, 127286,
- 12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 128571, 73766, 0,
- 6295, 901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, 78560,
- 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, 74031,
- 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, 6762,
- 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 0, 0,
- 9325, 6818, 6283, 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 194752,
- 0, 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737,
- 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 10024, 194764, 194767,
- 74340, 69681, 0, 64945, 8029, 0, 0, 0, 3335, 0, 0, 9776, 120526, 194748,
- 5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, 78581,
- 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 74542, 3337,
- 4537, 67895, 11736, 0, 68608, 6482, 4214, 73790, 11945, 0, 13046, 8838,
- 425, 4025, 10709, 78595, 2108, 2392, 13047, 0, 0, 6819, 13049, 6499,
- 92243, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 127919, 0, 128069,
- 3277, 8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, 64626, 66034,
- 7751, 194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, 12420, 4024,
- 194730, 41054, 1078, 9757, 69736, 41057, 0, 0, 0, 0, 0, 92210, 92411, 0,
- 41496, 0, 9165, 1572, 11911, 0, 118842, 2346, 13270, 8958, 0, 9646, 3773,
- 43183, 6401, 5831, 0, 0, 13043, 8056, 92494, 65681, 208, 127382, 41514,
- 0, 0, 0, 10699, 6408, 92227, 7825, 5661, 0, 120630, 3603, 41109, 2398,
- 3548, 0, 0, 119933, 0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876,
- 65804, 0, 0, 43468, 0, 41558, 41471, 73950, 8158, 9944, 41472, 120298,
- 13051, 78689, 3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680,
- 5665, 0, 119071, 7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310,
- 5662, 42382, 194686, 73924, 1121, 194665, 63959, 0, 9942, 13231, 0,
- 64752, 4732, 194666, 11596, 119931, 65187, 1626, 63983, 10110, 64772,
- 42024, 6420, 42028, 0, 10509, 2795, 4910, 194728, 69231, 64753, 6275,
- 917808, 118830, 63978, 11044, 3229, 6423, 42774, 0, 0, 0, 12823, 2331,
- 917810, 42026, 6137, 0, 7524, 0, 917809, 8346, 0, 8338, 128315, 65043, 0,
- 822, 127984, 9903, 64721, 42722, 194656, 194659, 78655, 78661, 194660,
- 78662, 41265, 5311, 1795, 965, 118791, 10587, 78055, 11278, 78632,
- 194640, 0, 12946, 194641, 119341, 120349, 6294, 3144, 194648, 194647,
- 65019, 194649, 73990, 0, 0, 748, 41067, 2330, 535, 3148, 12375, 194652,
- 194629, 10556, 2475, 12388, 4889, 8968, 67863, 3593, 0, 0, 2342, 0,
- 194634, 65206, 4894, 194635, 4890, 194637, 917804, 581, 4893, 0, 6571,
- 65545, 4888, 4157, 78048, 78049, 78046, 78047, 0, 10119, 6415, 42893, 0,
- 69702, 0, 0, 11375, 64746, 2332, 78063, 412, 78061, 64932, 42880, 43587,
- 0, 0, 0, 0, 65197, 78066, 12203, 78064, 78065, 8913, 65854, 4875, 65811,
- 120381, 120389, 118888, 9344, 8826, 120386, 120395, 13104, 74781, 11997,
- 120393, 78075, 0, 3134, 0, 65696, 92331, 0, 66217, 0, 8334, 119344, 0,
- 3449, 0, 0, 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328,
- 10734, 127014, 0, 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367,
- 0, 78054, 4917, 74516, 74208, 64285, 4912, 5464, 127836, 118893, 2361,
- 7971, 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312,
- 40977, 10960, 40962, 8305, 12573, 0, 40980, 0, 13202, 0, 12582, 78282, 0,
- 0, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658,
- 74045, 120165, 0, 0, 4913, 0, 0, 0, 42326, 128194, 12728, 92685, 42478,
- 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, 6153, 2867, 194708,
- 66312, 698, 128007, 194606, 10356, 74075, 194713, 651, 12641, 0, 0, 0, 0,
- 41552, 65115, 78465, 78467, 78463, 78464, 128851, 78461, 194697, 74356,
- 92626, 4716, 43277, 0, 78474, 12340, 120568, 0, 194700, 55264, 41211,
- 120676, 8703, 5462, 917629, 0, 10101, 0, 0, 8479, 4151, 41933, 0, 0,
- 66254, 120821, 0, 0, 128654, 0, 119194, 74050, 92701, 0, 0, 0, 0, 0,
- 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, 0, 2699, 0, 73845, 2985,
- 92568, 0, 917845, 12192, 119314, 0, 119312, 9827, 119310, 119311, 119308,
- 119309, 119306, 11481, 41210, 119305, 0, 35, 78481, 78482, 66694, 68479,
- 78477, 78478, 43596, 6090, 64257, 7812, 10534, 0, 78485, 73848, 78483,
- 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, 0, 64497, 12138,
- 7930, 0, 43303, 68216, 0, 917826, 5244, 4189, 127098, 67596, 127504,
- 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, 917827, 65555, 12574, 0, 0,
- 0, 74490, 127099, 43657, 0, 0, 0, 42682, 12578, 12720, 0, 41227, 0,
- 12346, 127101, 64848, 0, 0, 7251, 0, 0, 118850, 119141, 128546, 66015, 0,
- 959, 8885, 12564, 66457, 78808, 9469, 9632, 92323, 74761, 64323, 0, 0, 0,
- 0, 310, 0, 41281, 10976, 0, 92190, 0, 74266, 10054, 6497, 8574, 0, 9012,
- 19958, 74420, 65089, 13215, 12730, 65163, 74044, 374, 43195, 816, 0, 0,
- 0, 41934, 7465, 0, 128168, 0, 4715, 6101, 0, 41936, 0, 4879, 0, 65446, 0,
- 307, 127147, 9585, 5374, 0, 128059, 0, 0, 0, 0, 0, 65567, 120614, 1929,
- 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, 5378, 78791,
- 128679, 41421, 0, 4462, 0, 0, 128092, 821, 0, 2498, 5800, 120157, 0,
- 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, 43597,
- 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, 0,
- 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, 1810,
- 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592,
- 78092, 74357, 194597, 4748, 92228, 194598, 194601, 42260, 5871, 119075,
- 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, 8775, 127945, 0, 2963,
- 0, 8410, 4454, 723, 127882, 966, 4449, 92330, 92238, 0, 7819, 2320,
- 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634,
- 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, 0, 1584, 66645, 6045,
- 6729, 120640, 65218, 78777, 0, 78062, 7537, 0, 11370, 0, 10330, 0, 10394,
- 0, 74194, 0, 127929, 9780, 0, 13092, 194576, 119605, 194578, 7074, 92648,
- 194579, 194582, 11414, 128868, 2531, 13034, 0, 0, 4211, 1259, 7517, 0, 0,
- 194561, 40996, 13037, 7092, 641, 5219, 194567, 194566, 11064, 41129, 0,
- 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, 65793, 4535, 194573,
- 4271, 78417, 128357, 6769, 41410, 0, 64262, 6767, 41407, 0, 0, 6755,
- 118864, 9046, 127934, 0, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, 2563, 13033,
- 247, 118915, 0, 12338, 4651, 0, 11270, 0, 0, 11933, 0, 0, 41903, 43447,
- 11001, 0, 42255, 0, 92661, 69821, 41905, 0, 0, 10775, 9793, 5009, 0,
- 42269, 64587, 0, 42535, 69812, 64529, 41408, 42853, 3877, 120795, 42674,
- 8147, 43566, 119021, 0, 10236, 65918, 43782, 0, 0, 64506, 69652, 118921,
- 4747, 128058, 0, 43200, 5832, 0, 0, 5141, 42600, 0, 43203, 0, 0, 43286,
- 0, 128211, 43778, 0, 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0,
- 0, 0, 6059, 126985, 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 0,
- 120786, 42233, 64140, 9946, 63885, 0, 11822, 0, 43189, 0, 0, 1788, 1579,
- 120482, 917817, 0, 0, 0, 9028, 119571, 69234, 0, 0, 1285, 64882, 41242,
- 0, 0, 12640, 0, 7401, 0, 12625, 68198, 0, 92254, 3940, 41597, 55260,
- 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516,
- 120523, 0, 8815, 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142,
- 68454, 42485, 118837, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673,
+ 2350, 13029, 78233, 0, 983103, 13030, 6702, 4527, 0, 12538, 128810,
+ 983636, 65599, 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207,
+ 0, 6117, 65930, 8412, 0, 7438, 1296, 2325, 41511, 126625, 10149, 74118,
+ 0, 127286, 12481, 0, 12488, 66713, 0, 41556, 64414, 118802, 2354, 42619,
+ 73766, 0, 6295, 901, 41510, 7953, 0, 65032, 41513, 983166, 11927, 66584,
+ 78559, 78560, 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338,
+ 69922, 74031, 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 67973,
+ 0, 13026, 6762, 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0,
+ 1343, 983814, 0, 9325, 6818, 6283, 11738, 0, 983925, 0, 11741, 0, 0,
+ 9216, 8263, 11279, 194752, 983816, 194754, 13021, 64494, 3136, 194758,
+ 194757, 194760, 13022, 42737, 9956, 0, 0, 74552, 10014, 0, 41260, 119340,
+ 13020, 10024, 194764, 74583, 74340, 69681, 0, 43001, 8029, 0, 0, 983771,
+ 3335, 0, 0, 9776, 120526, 194748, 5215, 42644, 3333, 1632, 194751, 64849,
+ 3342, 78582, 5363, 12957, 78581, 4156, 0, 0, 6421, 78591, 1611, 78589,
+ 13018, 74257, 78588, 74542, 3337, 4537, 67895, 11736, 0, 68608, 6482,
+ 4214, 73790, 11945, 0, 13046, 8838, 425, 4025, 10709, 78595, 2108, 2392,
+ 13047, 0, 0, 6819, 13049, 6499, 92243, 12424, 68614, 73944, 13050, 9924,
+ 194745, 6507, 127919, 94073, 128069, 3277, 8929, 4947, 41055, 0, 194722,
+ 194721, 194724, 13045, 64626, 66034, 7751, 194727, 8371, 194729, 3997,
+ 12806, 8768, 13044, 0, 12420, 4024, 194730, 41054, 1078, 9757, 69736,
+ 41057, 0, 0, 0, 0, 983782, 92210, 92411, 0, 41496, 0, 9165, 1572, 11911,
+ 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, 43183, 6401, 5831, 0, 0,
+ 13043, 8056, 92494, 65681, 208, 127382, 41514, 0, 0, 0, 10699, 6408,
+ 92227, 7825, 5661, 0, 120630, 3603, 41109, 2398, 3548, 126596, 0, 119933,
+ 0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468,
+ 983266, 41558, 41471, 73950, 8158, 9944, 41472, 120298, 13051, 78689,
+ 3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680, 5665, 0, 119071,
+ 7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382,
+ 194686, 73924, 1121, 78319, 63959, 0, 9942, 13231, 0, 64752, 4732,
+ 194666, 11596, 119931, 65187, 1626, 63983, 10110, 64772, 42024, 6420,
+ 42028, 0, 10509, 2795, 4910, 194728, 69231, 64753, 6275, 93957, 118830,
+ 63978, 11044, 3229, 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 7085,
+ 6137, 0, 7524, 0, 917809, 8346, 0, 8338, 128315, 65043, 0, 822, 127984,
+ 9903, 64721, 42722, 69877, 194659, 78655, 78661, 194660, 78662, 41265,
+ 5311, 1795, 965, 118791, 10587, 78055, 11278, 78632, 194640, 0, 12946,
+ 194641, 119341, 120349, 6294, 3144, 194648, 194647, 65019, 194649, 73990,
+ 0, 983951, 748, 41067, 2330, 535, 3148, 12375, 78799, 194629, 10556,
+ 2475, 12388, 4889, 8968, 67863, 3593, 0, 0, 2342, 0, 194634, 65206, 4894,
+ 194635, 4890, 194637, 917804, 581, 4893, 983616, 6571, 65545, 4888, 4157,
+ 78048, 78049, 78046, 78047, 0, 10119, 6415, 42893, 0, 69702, 0, 0, 11375,
+ 64746, 2332, 78063, 412, 78061, 64932, 42880, 43587, 0, 0, 0, 0, 65197,
+ 78066, 12203, 78064, 78065, 8913, 65854, 4875, 65811, 120381, 120389,
+ 118888, 9344, 8826, 120386, 120395, 13104, 74781, 11997, 120393, 78075,
+ 0, 3134, 0, 65696, 92331, 0, 66217, 0, 8334, 119344, 0, 3449, 0, 0,
+ 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, 10734,
+ 127014, 0, 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367, 0,
+ 78054, 4917, 74516, 74208, 64285, 4912, 5464, 127836, 118893, 2361, 7971,
+ 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, 40977,
+ 10960, 40962, 8305, 12573, 983608, 40980, 983955, 13202, 0, 12582, 78282,
+ 983048, 69856, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891,
+ 7698, 5658, 74045, 70039, 0, 0, 4913, 0, 983950, 71333, 42326, 128194,
+ 12728, 92685, 42478, 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821,
+ 6153, 2867, 194708, 66312, 698, 128007, 194606, 10356, 70017, 194713,
+ 651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851,
+ 78461, 194697, 74356, 64945, 4716, 43277, 0, 78474, 12340, 120568, 0,
+ 194700, 55264, 41211, 120676, 8703, 5462, 917629, 983487, 10101, 0,
+ 70049, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 128654, 0, 119194,
+ 74050, 92701, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0,
+ 0, 2699, 0, 73845, 2985, 92568, 126475, 917845, 12192, 119314, 0, 119312,
+ 9827, 119310, 119311, 119308, 119309, 119306, 11481, 41210, 119305, 0,
+ 35, 78481, 78482, 66694, 68479, 78477, 78478, 43596, 6090, 64257, 7812,
+ 10534, 0, 78485, 73848, 67975, 4272, 0, 40967, 40964, 917825, 12704,
+ 78487, 43306, 0, 64497, 12138, 7930, 0, 2292, 68216, 0, 917826, 5244,
+ 4189, 94108, 67596, 127504, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 2279,
+ 0, 917827, 65555, 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682,
+ 12578, 12720, 0, 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0,
+ 118850, 119141, 128546, 66015, 0, 959, 8885, 12564, 66457, 78808, 9469,
+ 9632, 92323, 74761, 64323, 127335, 0, 0, 0, 310, 0, 41281, 10976, 0,
+ 71325, 0, 74266, 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215,
+ 12730, 65163, 74044, 374, 43195, 816, 120161, 0, 0, 41934, 7465, 0,
+ 128168, 983260, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307,
+ 127147, 9585, 5374, 983259, 128059, 0, 0, 126618, 120390, 0, 65567,
+ 120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623,
+ 5378, 78791, 128679, 41421, 0, 4462, 0, 126599, 128092, 821, 0, 2498,
+ 5800, 120157, 983115, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757,
+ 1185, 0, 78770, 43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634,
+ 10942, 7713, 2348, 0, 64374, 4380, 194608, 119044, 9982, 64324, 41240,
+ 862, 65626, 78462, 1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566,
+ 64688, 194593, 194592, 78092, 74357, 194597, 4748, 92228, 194598, 194601,
+ 42260, 5871, 119075, 0, 74576, 44019, 0, 128189, 3967, 194604, 13137,
+ 8775, 127945, 0, 2963, 0, 8410, 4454, 723, 127882, 966, 4449, 92330,
+ 92238, 0, 7819, 2320, 194589, 339, 4968, 194590, 120399, 8075, 55276, 0,
+ 8047, 0, 78827, 12634, 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452,
+ 983754, 1584, 66645, 6045, 6729, 120640, 65218, 11559, 0, 78062, 7537, 0,
+ 11370, 0, 10330, 0, 10394, 0, 74194, 0, 127929, 9780, 0, 13092, 194576,
+ 77950, 194578, 7074, 92648, 194579, 194582, 11414, 128868, 2531, 13034,
+ 0, 0, 4211, 1259, 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219,
+ 94034, 194566, 11064, 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153,
+ 0, 64098, 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 983444,
+ 64262, 6767, 41407, 0, 0, 6755, 118864, 9046, 127934, 126608, 0, 0, 0, 0,
+ 67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, 12338, 4651, 69895,
+ 11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821,
+ 41905, 0, 0, 10775, 9793, 5009, 0, 42269, 64587, 983063, 42535, 69812,
+ 64529, 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 983767,
+ 10236, 65918, 43782, 0, 0, 64506, 69652, 118921, 4747, 128058, 69844,
+ 43200, 5832, 0, 0, 5141, 42600, 0, 43203, 0, 983790, 43286, 0, 128211,
+ 43778, 0, 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0, 0, 0, 6059,
+ 126985, 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 120481, 120786,
+ 42233, 64140, 9946, 63885, 194792, 11822, 0, 43189, 983889, 0, 1788,
+ 1579, 120482, 71298, 0, 0, 0, 9028, 119571, 69234, 94055, 0, 1285, 64882,
+ 41242, 70086, 0, 12640, 0, 7401, 0, 12625, 68198, 0, 70082, 3940, 41597,
+ 43754, 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166,
+ 120516, 118989, 0, 8815, 66673, 65046, 9285, 913, 42259, 119317, 119318,
+ 2142, 68454, 42485, 94012, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673,
12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419,
- 42777, 10139, 980, 43698, 65386, 0, 0, 43701, 43198, 7184, 120673,
+ 42777, 10139, 980, 43698, 65386, 2208, 0, 43701, 43198, 7184, 120673,
194797, 917819, 10085, 119992, 0, 119993, 6634, 92373, 0, 119323, 8072,
119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, 12395, 0,
- 126977, 120565, 9914, 127011, 917854, 73975, 6367, 6351, 66688, 0, 78107,
+ 126977, 120565, 9914, 2217, 917854, 73975, 6367, 6351, 66688, 0, 78107,
0, 64735, 41243, 92199, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, 0,
120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, 9741,
78329, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 128225, 13213,
- 42452, 78331, 0, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, 41132,
- 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, 12632,
- 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, 1091,
- 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, 10494,
- 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0,
- 120462, 74106, 12413, 194829, 917994, 0, 917995, 5570, 1881, 7210, 0,
- 1012, 66630, 0, 120709, 7208, 66442, 5569, 0, 42339, 0, 6063, 0, 0,
- 119594, 6053, 65602, 0, 92201, 64727, 9160, 194827, 0, 0, 92180, 10503,
- 118810, 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326,
- 92204, 0, 0, 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571,
- 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870,
- 120101, 589, 7050, 0, 43281, 10233, 41263, 66251, 65729, 66253, 0, 74099,
- 42645, 0, 194815, 8583, 0, 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204,
- 917962, 19966, 77856, 42561, 120626, 0, 0, 8120, 120701, 0, 0, 128012,
- 41063, 0, 10664, 0, 8369, 0, 4551, 194964, 3369, 0, 0, 9673, 66334,
- 65580, 10478, 118960, 12517, 557, 9457, 12034, 0, 6355, 12519, 41004, 0,
- 195025, 74094, 0, 0, 77970, 0, 0, 128175, 12111, 3927, 0, 12515, 1474,
- 67893, 5492, 6923, 128099, 10441, 73836, 0, 43990, 5493, 0, 74319, 0,
- 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, 917959, 5853, 13063,
- 10363, 0, 12956, 128169, 120729, 11314, 917582, 12060, 0, 78392, 12826,
- 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697,
- 43420, 78396, 127057, 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693,
- 12125, 12766, 0, 1164, 0, 0, 41918, 0, 127542, 8687, 66009, 12178, 7053,
- 128001, 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873,
- 41126, 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053,
- 42843, 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0,
- 8922, 128068, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891,
- 13262, 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373,
- 5295, 917569, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603,
- 41413, 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846,
- 8070, 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189,
- 0, 67648, 120499, 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0,
- 77949, 0, 68135, 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971,
- 78453, 92556, 73898, 11979, 0, 118900, 917894, 0, 9635, 12600, 8871, 0,
- 0, 0, 6469, 74227, 0, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0,
- 0, 0, 42916, 0, 0, 0, 7282, 78728, 65733, 4445, 127138, 128082, 3494,
- 74606, 6555, 0, 77976, 0, 0, 78566, 0, 0, 65898, 0, 65312, 5447, 0,
+ 42452, 78331, 120664, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988,
+ 41132, 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0,
+ 12632, 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123,
+ 1091, 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 983146, 126613, 0,
+ 11693, 126513, 10494, 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0,
+ 73794, 0, 8022, 0, 120462, 74106, 12413, 94069, 917994, 917993, 917995,
+ 5570, 1881, 7210, 0, 1012, 43752, 0, 120709, 7208, 66442, 5569, 983236,
+ 42339, 0, 6063, 0, 78383, 119594, 6053, 65602, 0, 92201, 64727, 9160,
+ 194827, 0, 0, 92180, 10503, 118810, 6055, 3870, 4279, 8490, 120114, 4319,
+ 64786, 8602, 120110, 11326, 92204, 983116, 0, 120119, 78333, 120117,
+ 120118, 120099, 120100, 65087, 5571, 3674, 9740, 9121, 5568, 120107,
+ 120108, 42085, 10107, 42159, 42870, 120101, 589, 7050, 983791, 43281,
+ 10233, 41263, 66251, 65729, 66253, 126497, 74099, 42645, 0, 194815, 8583,
+ 0, 5847, 6928, 128074, 0, 0, 0, 0, 66592, 12204, 917962, 19966, 77856,
+ 42561, 120626, 983245, 0, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0,
+ 8369, 0, 4551, 194964, 3369, 0, 0, 9673, 66334, 65580, 10478, 118960,
+ 12517, 557, 9457, 12034, 983662, 6355, 12519, 41004, 0, 195025, 74094, 0,
+ 0, 77970, 983560, 0, 128175, 12111, 3927, 0, 12515, 1474, 67893, 5492,
+ 6923, 92281, 10441, 73836, 0, 43990, 5493, 0, 74319, 0, 66635, 12019, 0,
+ 1618, 0, 120474, 9645, 10430, 917959, 5853, 13063, 10363, 0, 12956,
+ 128169, 120729, 11314, 917582, 12060, 0, 78392, 12826, 6329, 0, 10514,
+ 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, 43420, 78396,
+ 127057, 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693, 12125, 12766, 0,
+ 1164, 128817, 0, 41918, 983168, 127542, 8687, 66009, 12178, 7053, 128001,
+ 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, 41126,
+ 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, 42843,
+ 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, 8922,
+ 128068, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, 13262,
+ 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, 5295,
+ 917569, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, 41413,
+ 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, 8070,
+ 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0,
+ 67648, 120499, 94001, 4257, 12104, 77942, 6220, 9004, 65561, 0, 77949, 0,
+ 68135, 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971, 78453, 92556,
+ 73898, 11979, 70051, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469,
+ 74227, 0, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0,
+ 42916, 0, 0, 0, 7282, 78728, 65733, 4445, 127138, 128082, 3494, 74606,
+ 6555, 0, 77976, 0, 0, 78566, 0, 983189, 65898, 983238, 65312, 5447, 0,
12895, 65593, 4010, 0, 41106, 0, 64448, 0, 41105, 0, 65820, 6232, 0,
128280, 0, 43608, 119091, 0, 6538, 4335, 78364, 3941, 41122, 11061,
- 78363, 64892, 9113, 1954, 12155, 0, 42878, 11500, 0, 0, 74578, 0, 65832,
- 0, 0, 0, 77975, 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307, 0, 0,
- 5133, 0, 0, 9500, 0, 4957, 64741, 2422, 9354, 0, 0, 0, 2496, 11516, 944,
- 118851, 3890, 12168, 1438, 0, 0, 0, 41947, 1220, 120828, 128555, 0, 0,
- 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, 0, 0, 78120,
- 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120, 65121, 10862,
- 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986, 11532, 74073, 0,
- 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, 11428, 1730, 2457, 0,
- 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 92491, 0, 6129, 0, 0, 128268,
- 0, 7874, 8681, 119092, 0, 13136, 0, 0, 74278, 63886, 118881, 9605, 73892,
- 13220, 128776, 120274, 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, 3096,
- 0, 0, 0, 66676, 65873, 0, 0, 0, 9501, 0, 1272, 64536, 65465, 64654, 7467,
- 0, 1467, 10158, 10040, 0, 9519, 0, 917812, 0, 118899, 12193, 0, 0, 0, 0,
- 0, 19935, 0, 92162, 69676, 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880,
- 11471, 43554, 65862, 11474, 66332, 66603, 128138, 2426, 12042, 92194, 0,
- 9537, 3961, 12115, 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876,
- 11667, 42686, 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0,
- 68215, 0, 8541, 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 10060,
- 41940, 8299, 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493,
- 0, 41699, 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012,
- 10395, 0, 43633, 65447, 0, 0, 11004, 695, 739, 696, 7611, 0, 42755,
- 74802, 9227, 7506, 7510, 92281, 691, 738, 7511, 7512, 7515, 3868, 688,
- 41847, 690, 2548, 737, 974, 8003, 7406, 917911, 0, 0, 3985, 917912,
- 65860, 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, 92505, 10879,
- 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, 41958, 119176,
- 917908, 0, 0, 42657, 92468, 7643, 42373, 11714, 67587, 43568, 0, 11717,
- 7650, 10594, 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0,
- 0, 2337, 1735, 74324, 67860, 2363, 0, 0, 43561, 0, 0, 74146, 1860, 7495,
- 7580, 5812, 7497, 7584, 119140, 127853, 0, 120347, 7727, 0, 8498, 69818,
- 8949, 3065, 42719, 7135, 1569, 92375, 12534, 12124, 7690, 0, 12533, 0,
- 6418, 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 128650, 0, 63894, 120760,
- 12282, 66192, 0, 74592, 8850, 74275, 9238, 10617, 917545, 0, 92625, 0,
- 12791, 0, 0, 0, 4447, 73732, 12793, 12900, 92377, 10950, 0, 78087, 12790,
- 41400, 119128, 66607, 12792, 42232, 194938, 1744, 12789, 10366, 12317,
- 41310, 0, 41399, 0, 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, 2974,
- 9010, 11315, 0, 278, 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0,
- 0, 6002, 0, 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646,
- 0, 77829, 0, 0, 6413, 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678,
- 10044, 0, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0,
+ 78363, 64892, 9113, 1954, 12155, 983665, 42878, 11500, 0, 0, 74578, 0,
+ 65832, 0, 0, 0, 77975, 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307,
+ 0, 0, 5133, 0, 0, 9500, 0, 4957, 64741, 2422, 2212, 983080, 0, 0, 2496,
+ 11516, 944, 118851, 3890, 12168, 1438, 0, 983117, 0, 41947, 1220, 120828,
+ 128555, 0, 0, 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980,
+ 983935, 0, 78120, 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120,
+ 65121, 10862, 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986,
+ 11532, 74073, 127338, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115,
+ 11428, 1730, 2457, 917808, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0,
+ 92230, 0, 6129, 0, 128528, 128268, 0, 7874, 8681, 119092, 0, 13136, 0, 0,
+ 70102, 63886, 118881, 9605, 71308, 13220, 128776, 120274, 5514, 0, 9228,
+ 0, 0, 0, 5240, 9811, 10012, 3096, 0, 0, 983343, 66676, 65873, 0, 0, 0,
+ 9501, 0, 1272, 64536, 65465, 64654, 7467, 0, 1467, 10158, 10040, 0, 9519,
+ 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, 983345, 19935, 0, 92162, 69676,
+ 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, 11471, 43554, 65862, 11474,
+ 66332, 66603, 128138, 2426, 12042, 92194, 983902, 9537, 3961, 12115,
+ 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, 42686, 77973,
+ 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, 68215, 917904, 8541,
+ 78298, 70034, 41866, 0, 0, 0, 0, 69924, 43555, 2823, 9559, 10060, 41940,
+ 8299, 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0,
+ 41699, 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 6274, 4494, 0, 4012,
+ 10395, 983591, 43633, 65447, 126511, 0, 11004, 695, 739, 696, 7611, 0,
+ 42755, 74802, 9227, 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 3868,
+ 688, 41847, 690, 2548, 737, 974, 8003, 7406, 917911, 0, 128688, 3985,
+ 917912, 65860, 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685,
+ 92505, 10879, 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0,
+ 41958, 119176, 917908, 0, 0, 42657, 92468, 7643, 42373, 11714, 67587,
+ 43568, 983175, 11717, 7650, 10594, 64951, 7647, 7649, 128155, 7646, 0,
+ 78082, 9651, 0, 3891, 0, 0, 2337, 1735, 74324, 67860, 2363, 983135, 0,
+ 43561, 0, 0, 74146, 1860, 7495, 7580, 5812, 7497, 7584, 119140, 127853,
+ 0, 120347, 7727, 0, 8498, 69818, 8949, 3065, 42719, 7135, 1569, 92375,
+ 12534, 12124, 7690, 0, 12533, 983870, 6418, 4543, 78086, 6969, 0, 74800,
+ 0, 67974, 11980, 128650, 983792, 63894, 120760, 12282, 66192, 0, 74592,
+ 8850, 74275, 9238, 10617, 917545, 0, 92625, 0, 12791, 0, 0, 127843, 4447,
+ 73732, 12793, 12900, 92377, 10950, 0, 78087, 12790, 41400, 119128, 66607,
+ 12792, 42232, 194938, 1744, 12789, 10366, 12317, 41310, 983860, 41399, 0,
+ 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, 2974, 9010, 11315, 0,
+ 278, 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, 0, 6002, 0,
+ 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, 983186,
+ 77829, 71360, 0, 6413, 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678,
+ 10044, 128322, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0,
10297, 0, 3742, 0, 3959, 0, 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0,
- 63845, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361,
- 11540, 43546, 6692, 0, 41060, 0, 0, 9083, 0, 0, 78144, 1559, 63831, 9677,
- 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716,
+ 43758, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361,
+ 11540, 43546, 6692, 0, 41060, 0, 4668, 9083, 0, 0, 78144, 1559, 63831,
+ 9677, 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716,
128236, 0, 120472, 5516, 2845, 7717, 8036, 41717, 73827, 544, 12045,
- 6278, 0, 5515, 0, 0, 0, 65339, 43221, 65194, 0, 5517, 0, 0, 74841, 67884,
- 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, 1902,
- 67887, 9638, 12976, 0, 12483, 12368, 41769, 42726, 41765, 128819, 6667,
- 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311, 917966,
- 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949, 78162, 0,
- 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, 41796, 1269,
- 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, 128675, 41834,
- 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, 0, 0, 6428,
- 42270, 0, 0, 43059, 42666, 5256, 1067, 255, 12131, 0, 9493, 0, 41014,
- 11793, 0, 0, 74394, 43460, 10653, 42723, 0, 119632, 0, 6560, 7016, 74274,
- 0, 43556, 3929, 73900, 6614, 2768, 92504, 9746, 5135, 11811, 12796,
- 11953, 0, 69761, 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552,
- 127753, 74315, 74361, 8253, 8817, 1136, 0, 43563, 92232, 0, 194750, 7392,
- 8230, 9365, 0, 0, 0, 0, 0, 4041, 0, 2357, 43240, 12786, 229, 119885,
- 119884, 44004, 7142, 119881, 12350, 65554, 119882, 119877, 119876, 12785,
- 63863, 43795, 7770, 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352,
- 10470, 0, 11059, 10791, 917944, 450, 0, 0, 10432, 12097, 5450, 64691,
- 1233, 0, 44009, 78284, 66338, 0, 0, 1839, 118799, 0, 10927, 1701, 0,
+ 6278, 0, 5515, 0, 0, 983051, 65339, 43221, 2211, 0, 5517, 0, 0, 74841,
+ 67884, 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, 127188,
+ 1902, 67887, 9638, 12976, 126546, 12483, 12368, 41769, 42726, 41765,
+ 7361, 6667, 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311,
+ 917966, 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949,
+ 78162, 0, 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0,
+ 41796, 1269, 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331,
+ 983720, 128675, 41834, 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165,
+ 66036, 0, 0, 6428, 42270, 0, 983596, 43059, 42666, 5256, 1067, 255,
+ 12131, 983713, 9493, 983959, 41014, 11793, 194920, 0, 74394, 43460,
+ 10653, 42723, 983845, 119632, 0, 6560, 7016, 74274, 983615, 43556, 3929,
+ 67977, 6614, 2768, 92504, 9746, 5135, 11811, 12796, 11953, 0, 69761,
+ 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, 127753, 74315, 74361,
+ 8253, 8817, 1136, 0, 43563, 92232, 0, 194750, 7392, 8230, 9365, 0, 0,
+ 983607, 0, 0, 4041, 0, 2357, 43240, 12786, 229, 119885, 119884, 44004,
+ 7142, 119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 43795,
+ 7770, 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, 10470, 0,
+ 11059, 10791, 917944, 450, 119328, 0, 10432, 12097, 5450, 64691, 1233, 0,
+ 44009, 78284, 66338, 0, 0, 1839, 118799, 983217, 10927, 1701, 983655,
2388, 41749, 41761, 5453, 8361, 119865, 41758, 5444, 41763, 64889, 7143,
- 92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 0, 0, 65812,
- 917831, 0, 41824, 0, 120203, 194800, 194803, 42700, 194805, 127980,
+ 92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 983044, 0, 65812,
+ 917831, 0, 41824, 67985, 120203, 194800, 194803, 42700, 194805, 127980,
194807, 78676, 92356, 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826,
- 119325, 194811, 42439, 64638, 42327, 43528, 4489, 194791, 0, 194793,
- 1912, 42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821,
- 1410, 92671, 0, 118878, 0, 0, 9919, 0, 559, 128157, 41825, 127975, 78188,
- 4892, 74016, 194781, 6542, 41957, 128865, 5777, 0, 759, 65749, 2079,
- 65248, 12788, 64487, 64552, 0, 10223, 42062, 0, 0, 0, 3668, 65754, 43560,
- 12226, 0, 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747,
- 10937, 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, 42714, 9951,
- 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359, 41820, 43038,
- 2395, 0, 9976, 120043, 120050, 120058, 68220, 128143, 42809, 42807, 0,
- 120046, 10198, 4150, 64371, 8318, 41790, 0, 41898, 2360, 41794, 917942,
- 0, 127818, 0, 0, 2418, 0, 2411, 11336, 799, 63823, 10276, 10308, 10372,
- 917541, 41772, 42813, 2317, 10260, 118980, 55284, 92203, 0, 10384, 0, 0,
- 0, 7753, 2351, 6655, 64489, 0, 0, 77872, 4443, 42779, 230, 0, 0, 43549,
- 4855, 42150, 65739, 5441, 41896, 10288, 10320, 0, 855, 7046, 6109, 65045,
- 63839, 78198, 2049, 10098, 0, 74145, 127943, 10264, 10280, 9184, 10376,
- 7013, 4467, 0, 0, 0, 41887, 0, 4862, 9735, 6537, 120591, 74286, 3914,
- 92178, 0, 9065, 12961, 0, 0, 92253, 0, 289, 0, 4694, 11420, 4690, 0,
- 120514, 917978, 4693, 0, 42724, 0, 4688, 120454, 0, 0, 119629, 8238,
- 3110, 120162, 0, 120163, 6528, 127553, 43035, 120161, 218, 0, 1520, 0,
- 4786, 0, 43225, 4602, 0, 78167, 10088, 6548, 0, 120156, 43978, 8988,
- 8888, 0, 0, 0, 0, 10666, 0, 73902, 69740, 0, 0, 9975, 0, 119902, 4689,
- 8932, 0, 65560, 119209, 74441, 78810, 0, 0, 0, 0, 0, 0, 0, 0, 10065,
- 8207, 0, 92613, 128011, 0, 662, 0, 9244, 194863, 0, 119261, 0, 0, 0, 0,
- 41929, 0, 0, 66674, 41926, 120408, 120443, 10513, 64637, 194862, 0, 52,
- 13118, 6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 0, 74085, 0, 3978,
- 0, 917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 0, 69782,
+ 119325, 194811, 42439, 64638, 42327, 43528, 4489, 71331, 0, 194793, 1912,
+ 42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410,
+ 92671, 983244, 118878, 0, 0, 9919, 120528, 559, 128157, 41825, 127975,
+ 78188, 4892, 74016, 194781, 6542, 41957, 128865, 5777, 0, 759, 65749,
+ 2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, 0, 0, 126573, 3668,
+ 65754, 43560, 12226, 67991, 65149, 2340, 41959, 194786, 194785, 194788,
+ 43618, 65747, 10937, 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0,
+ 42714, 9951, 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359,
+ 41820, 2300, 2395, 128563, 9976, 120043, 120050, 120058, 68220, 128143,
+ 42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, 67976, 41898,
+ 2360, 41794, 917942, 71314, 127818, 0, 0, 2418, 983098, 2411, 11336, 799,
+ 63823, 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980,
+ 55284, 92203, 0, 10384, 983218, 0, 0, 7753, 2351, 6655, 64489, 69931, 0,
+ 77872, 4443, 42779, 230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896,
+ 10288, 10320, 0, 855, 7046, 6109, 65045, 63839, 78198, 2049, 10098, 0,
+ 74145, 127943, 10264, 10280, 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0,
+ 4862, 9735, 6537, 120591, 74286, 3914, 92178, 93976, 9065, 12961, 0, 0,
+ 92253, 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 73893,
+ 42724, 0, 4688, 120454, 0, 0, 67994, 8238, 3110, 120162, 983899, 120163,
+ 6528, 127553, 43035, 69898, 218, 0, 1520, 0, 4786, 0, 43225, 4602, 0,
+ 78167, 10088, 6548, 0, 120156, 43978, 8988, 8888, 0, 0, 0, 0, 10666, 0,
+ 73902, 69740, 0, 0, 9975, 128039, 119902, 4689, 8932, 0, 65560, 119209,
+ 74441, 78810, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 92613,
+ 128011, 0, 662, 0, 9244, 194863, 0, 119261, 983420, 0, 0, 0, 41929, 0, 0,
+ 66674, 41926, 120408, 120443, 10513, 64637, 194862, 68013, 52, 13118,
+ 6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 67992, 74085, 0, 3978, 0,
+ 917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 93961, 69782,
128557, 194860, 11765, 65258, 10369, 0, 1585, 7192, 10249, 422, 1500,
2036, 986, 194859, 64394, 5781, 5599, 64294, 2494, 120450, 4861, 74021,
- 64334, 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 917933,
+ 64334, 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 74191,
120410, 0, 120453, 64821, 9478, 2508, 92683, 0, 202, 128246, 74131, 1242,
65514, 0, 63940, 128706, 64533, 120129, 0, 67842, 11990, 92430, 63939,
- 43375, 65440, 2504, 0, 78671, 64829, 0, 6943, 917934, 5859, 0, 2858, 0,
- 74294, 0, 69239, 0, 119027, 12992, 2753, 1936, 74491, 92574, 2751, 12662,
- 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, 74128,
- 2856, 119910, 47, 119911, 126986, 65858, 0, 0, 0, 7899, 0, 8417, 43798,
- 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, 0,
- 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155,
- 8505, 68379, 12062, 0, 0, 65487, 92189, 41837, 120611, 120432, 0, 0, 0,
- 120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426, 0, 194948, 0, 0,
- 65664, 6693, 9843, 0, 8674, 119887, 128812, 92715, 0, 12624, 0, 1673,
- 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928, 119598, 9820, 0,
- 12187, 0, 0, 5984, 0, 43308, 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0,
- 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605, 92483, 7514, 0, 0,
- 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588,
- 74433, 41635, 43241, 9688, 7147, 9535, 0, 0, 0, 64530, 0, 64610, 11804,
- 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895, 5253, 0, 5458, 0, 2866, 0,
- 127860, 65111, 68433, 6700, 120484, 0, 0, 0, 8962, 77960, 9641, 43694,
- 7059, 0, 0, 9604, 78700, 7441, 63826, 78706, 118941, 64392, 194735, 0,
- 2844, 0, 41974, 0, 12139, 0, 0, 0, 3358, 65295, 0, 3104, 194734, 0,
- 194765, 0, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 0, 0, 3268, 66591, 0,
- 6552, 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528,
- 65903, 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163,
- 65270, 0, 0, 0, 9112, 74431, 863, 9490, 119898, 917837, 43323, 120513,
- 119897, 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993,
- 119899, 66587, 195098, 0, 92401, 0, 11006, 12927, 7807, 8073, 0, 10629,
- 0, 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969,
- 43193, 10737, 3463, 0, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0,
- 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, 6561, 19939,
- 0, 0, 0, 119906, 0, 0, 0, 0, 0, 119907, 64612, 11991, 0, 0, 0, 1502, 0,
- 0, 9107, 127316, 5702, 3655, 67661, 8430, 0, 74132, 120758, 0, 74057,
- 9603, 0, 5254, 120742, 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579,
- 5614, 5893, 92280, 11720, 92496, 11721, 0, 4798, 0, 119316, 66038, 4793,
- 67851, 11726, 127541, 74204, 68610, 0, 68626, 894, 300, 917813, 12306,
- 66235, 8004, 0, 0, 2562, 0, 0, 42503, 0, 11652, 0, 0, 119241, 92649, 0,
- 5096, 5095, 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0,
- 10832, 5093, 0, 0, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104,
- 78599, 78601, 1215, 42712, 5744, 12272, 9832, 11777, 0, 127371, 42881, 0,
+ 43375, 65440, 2504, 0, 78671, 64829, 983901, 6943, 917934, 5859, 0, 2858,
+ 983353, 74294, 983905, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574,
+ 2751, 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0,
+ 63920, 74128, 2856, 119910, 47, 69908, 126986, 65858, 0, 0, 0, 7899, 0,
+ 8417, 43798, 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903,
+ 12320, 0, 0, 194563, 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828,
+ 0, 0, 9531, 13155, 8505, 68379, 12062, 0, 0, 65487, 92189, 41837, 120611,
+ 120432, 0, 0, 0, 120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426,
+ 0, 194948, 0, 0, 65664, 6693, 9843, 0, 8674, 119887, 128812, 92715, 0,
+ 12624, 0, 1673, 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928,
+ 119598, 9820, 0, 12187, 0, 0, 5984, 0, 43308, 4393, 67650, 0, 0, 0, 0,
+ 74826, 64733, 0, 0, 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605,
+ 92483, 7514, 983359, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610,
+ 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, 7147, 9535, 0, 93991,
+ 0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895,
+ 5253, 70025, 5458, 0, 2866, 0, 127860, 65111, 68433, 6700, 120484, 0,
+ 120583, 0, 8962, 77960, 9641, 43694, 7059, 983668, 0, 9604, 78700, 7441,
+ 63826, 67970, 118941, 64392, 194735, 983678, 2844, 983932, 41974, 0,
+ 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983227,
+ 5308, 0, 290, 0, 0, 2862, 2792, 195088, 983070, 0, 3268, 66591, 0, 6552,
+ 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528, 65903,
+ 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163, 65270, 0,
+ 77932, 0, 9112, 74431, 863, 9490, 119898, 128349, 43323, 120513, 119897,
+ 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, 119899,
+ 66587, 195098, 0, 92401, 983885, 11006, 12927, 7807, 8073, 0, 10629, 0,
+ 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969,
+ 43193, 10737, 3463, 983065, 0, 66633, 8695, 4815, 11322, 5811, 12345,
+ 7049, 119911, 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0,
+ 6561, 19939, 0, 0, 128535, 119906, 0, 0, 983097, 0, 983658, 119907,
+ 64612, 11991, 0, 0, 0, 1502, 917568, 0, 9107, 127316, 5702, 3655, 67661,
+ 8430, 0, 74132, 120758, 0, 74057, 9603, 0, 5254, 120742, 7724, 74388,
+ 68375, 10796, 5129, 0, 0, 590, 7579, 5614, 5893, 92280, 11720, 92496,
+ 11721, 0, 4798, 0, 119316, 66038, 4793, 67851, 11726, 127541, 74204,
+ 68610, 0, 68626, 894, 300, 917813, 12306, 66235, 8004, 0, 0, 2562,
+ 126555, 0, 42503, 0, 11652, 0, 0, 119241, 64699, 126569, 5096, 5095,
+ 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0, 10832, 5093,
+ 0, 69852, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, 78599,
+ 78601, 1215, 42712, 5744, 12272, 9832, 11777, 71299, 127371, 42881, 0,
8980, 118988, 67861, 8844, 7209, 0, 0, 4278, 0, 0, 194789, 0, 9074, 4348,
- 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 0, 586,
- 74414, 64359, 1267, 0, 65468, 0, 65731, 0, 127179, 3621, 120473, 66666,
- 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, 74406,
- 127831, 0, 0, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, 0, 10291,
- 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999, 92164, 12206,
- 5839, 1702, 1240, 74065, 6286, 0, 0, 65833, 77848, 0, 1765, 0, 0, 65588,
- 0, 0, 0, 8401, 0, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 0,
- 128586, 917951, 6963, 0, 12667, 64540, 74786, 10147, 12935, 127568, 0, 0,
- 0, 0, 78757, 0, 0, 0, 0, 9994, 12467, 2864, 64719, 1148, 10435, 11462,
- 41675, 0, 2765, 0, 0, 0, 120719, 128188, 92516, 66662, 0, 78133, 9364,
- 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 0, 77986,
- 0, 6931, 69722, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, 42020,
- 0, 6806, 6992, 42019, 0, 41290, 0, 750, 0, 0, 10163, 63913, 74066, 7032,
- 5954, 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891,
- 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938,
- 92222, 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712,
- 66045, 41470, 64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 92667, 7796,
- 69669, 43254, 73831, 0, 10293, 5952, 1281, 0, 0, 0, 10677, 604, 41097,
- 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202, 0, 0,
- 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374, 917956,
- 0, 2822, 68122, 4436, 92519, 0, 73752, 0, 64872, 92340, 1331, 0, 0, 0,
- 12708, 0, 5090, 5089, 0, 0, 119109, 0, 128681, 319, 118847, 43479, 9477,
- 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0, 5085, 64286, 92665, 0,
- 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 0, 0, 127165, 127241,
- 6677, 7601, 0, 591, 64419, 118953, 92262, 0, 118923, 73734, 0, 10939,
- 6106, 6933, 41271, 6760, 119903, 4534, 41270, 128876, 0, 65574, 0, 9224,
- 0, 3671, 8976, 0, 0, 41275, 6372, 128084, 55261, 7963, 6371, 0, 568, 0,
- 41273, 0, 0, 6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42,
- 0, 43688, 0, 0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254,
- 42721, 66336, 8045, 11550, 0, 0, 0, 42858, 11789, 65868, 5557, 10133,
- 9737, 13109, 0, 9467, 5558, 8878, 128136, 195036, 7451, 6706, 10146, 0,
- 9086, 64566, 0, 64584, 7437, 7454, 12594, 128690, 68362, 4546, 7731, 0,
- 119909, 74243, 0, 3805, 0, 194565, 44001, 41008, 0, 6307, 19949, 0, 7544,
- 0, 43469, 0, 0, 10152, 64422, 65091, 119113, 7602, 64729, 0, 43521, 0,
- 42302, 43711, 43523, 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011,
- 9630, 92633, 0, 0, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792,
- 8889, 0, 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 0, 74365, 7552, 0,
- 0, 65384, 7223, 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077,
- 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 0, 0, 0,
- 4357, 0, 119837, 0, 74233, 9967, 119852, 42860, 119838, 10941, 65721,
- 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224, 92267, 128536,
- 11974, 92213, 42772, 127518, 11650, 5013, 92663, 128677, 66210, 118914,
- 6613, 92476, 0, 43819, 0, 0, 64714, 0, 0, 12162, 12120, 43476, 0, 11024,
- 74811, 66228, 10563, 0, 127196, 43522, 2462, 0, 1837, 0, 63972, 6957, 0,
- 120559, 4952, 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005,
- 127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 127924,
- 3483, 119593, 1989, 0, 69678, 9104, 3503, 65375, 92509, 6694, 42633,
- 1864, 0, 74306, 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705,
- 74124, 8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106,
- 127862, 1403, 128839, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654,
- 0, 0, 0, 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549,
- 10861, 0, 63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221,
- 0, 0, 8823, 128697, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039,
- 0, 7446, 1684, 63979, 10974, 458, 120620, 0, 69791, 127161, 11916, 65016,
- 0, 69671, 42115, 0, 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199,
- 13080, 0, 65808, 6610, 6030, 8059, 7508, 13131, 0, 0, 0, 8794, 41278,
- 41629, 12154, 128192, 41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0,
- 0, 65371, 7078, 0, 833, 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0,
- 19916, 6913, 933, 1341, 9842, 6720, 65744, 0, 0, 128295, 0, 7405, 10105,
- 65810, 0, 41632, 7493, 55290, 0, 41622, 0, 0, 119556, 74584, 7632, 9716,
- 19954, 9805, 5990, 900, 0, 63957, 0, 0, 3612, 0, 64376, 0, 5389, 92597,
- 0, 65938, 2839, 9621, 582, 0, 74368, 3749, 6949, 7569, 74061, 0, 0, 6956,
- 4403, 19962, 65559, 3299, 0, 917566, 119127, 9002, 0, 74372, 74236, 8478,
- 7598, 546, 42469, 65569, 1918, 9542, 472, 7716, 10319, 10383, 6996, 0,
- 63952, 8425, 3602, 8328, 11764, 118894, 0, 69796, 41183, 12907, 10271,
- 10287, 684, 43525, 0, 2854, 119586, 4592, 65755, 0, 92256, 11963, 43620,
- 0, 78889, 0, 0, 128809, 9881, 43115, 65757, 3415, 0, 0, 8648, 0, 6741,
- 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, 10391, 41752,
- 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, 41751,
- 69776, 8941, 0, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, 11437, 43741,
- 92163, 120700, 63967, 0, 41206, 120724, 9049, 41185, 43166, 0, 11680,
- 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0, 92183, 64523, 10343,
- 10407, 0, 66671, 11466, 0, 128003, 42890, 0, 12050, 68201, 2860, 0, 0, 0,
- 42792, 5743, 10424, 12065, 42872, 0, 92342, 0, 8875, 0, 0, 917991, 7531,
- 12847, 2413, 0, 78635, 962, 0, 12855, 41196, 42564, 0, 1582, 0, 5508, 0,
- 0, 0, 10801, 0, 92354, 0, 7173, 496, 10439, 4313, 64607, 69638, 7860, 0,
- 906, 42793, 2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153,
- 92173, 64788, 0, 8054, 9174, 128652, 917976, 9964, 0, 41611, 4642, 66574,
- 11556, 917982, 0, 78857, 42089, 78855, 9008, 0, 0, 195096, 42079, 917981,
- 77924, 42513, 0, 42842, 73985, 65285, 118974, 127003, 0, 0, 0, 0, 11335,
- 64069, 42093, 3920, 0, 0, 0, 0, 4580, 41967, 0, 64384, 92167, 119158,
- 3021, 42004, 0, 0, 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0,
- 68113, 42690, 9880, 42010, 74824, 64589, 10111, 64875, 127880, 68399,
- 43998, 11360, 0, 0, 0, 118826, 42149, 0, 0, 0, 64941, 77919, 120421,
- 128077, 0, 55247, 4110, 66005, 6959, 10929, 119110, 0, 66703, 77921,
- 8617, 41982, 6025, 69242, 0, 0, 0, 0, 9597, 42099, 43172, 0, 10117, 0,
+ 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 71345, 586,
+ 74414, 64359, 1267, 128269, 65468, 0, 65731, 0, 127179, 3621, 120473,
+ 66666, 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714,
+ 74406, 127831, 0, 983912, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694,
+ 0, 10291, 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999,
+ 92164, 12206, 5839, 1702, 1240, 74065, 6286, 0, 983960, 65833, 77848, 0,
+ 1765, 0, 0, 65588, 0, 0, 0, 8401, 0, 42014, 0, 7030, 194704, 10479,
+ 64959, 2852, 0, 0, 0, 0, 128586, 917951, 6963, 0, 12667, 64540, 74786,
+ 10147, 12935, 127568, 126483, 0, 0, 0, 78757, 0, 0, 0, 0, 9994, 12467,
+ 2864, 64719, 1148, 10435, 11462, 41675, 7084, 2765, 0, 43382, 0, 120719,
+ 128188, 92516, 66662, 0, 78133, 9364, 194685, 74416, 0, 0, 77988, 263,
+ 10449, 41288, 0, 41839, 78387, 983733, 77986, 0, 6931, 69722, 64355,
+ 7177, 70105, 0, 0, 0, 4262, 10285, 10722, 42020, 126575, 6806, 6992,
+ 42019, 0, 41290, 983707, 750, 0, 71304, 10163, 63913, 71300, 7032, 5954,
+ 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891, 13165,
+ 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, 70026,
+ 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712, 66045,
+ 41470, 64805, 0, 0, 128215, 64801, 0, 497, 12100, 5953, 92667, 7796,
+ 69669, 43254, 73831, 0, 10293, 5952, 1281, 43747, 0, 0, 10677, 604,
+ 41097, 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202,
+ 0, 0, 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374,
+ 917956, 0, 2822, 68122, 4436, 92519, 983714, 73752, 0, 64872, 92340,
+ 1331, 0, 0, 0, 12708, 0, 5090, 5089, 127977, 0, 119109, 0, 128681, 319,
+ 118847, 43479, 9477, 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0,
+ 5085, 64286, 92665, 0, 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0,
+ 126587, 0, 127165, 127241, 6677, 7601, 0, 591, 64419, 118953, 92262, 0,
+ 118923, 70084, 0, 10939, 6106, 6933, 41271, 6760, 71343, 4534, 41270,
+ 128876, 0, 65574, 0, 9224, 69853, 3671, 8976, 126474, 0, 41275, 6372,
+ 128084, 55261, 7963, 6371, 0, 568, 0, 41273, 983721, 0, 6728, 0, 9715, 0,
+ 8258, 11753, 74820, 0, 9602, 118919, 42, 0, 43688, 0, 0, 7458, 0, 0,
+ 65385, 119900, 0, 11958, 0, 917822, 0, 6254, 42721, 66336, 8045, 11550,
+ 0, 0, 983597, 42858, 11789, 65868, 5557, 10133, 9737, 13109, 0, 9467,
+ 5558, 8878, 128136, 195036, 7451, 6706, 10146, 0, 9086, 64566, 0, 64584,
+ 7437, 7454, 12594, 128690, 68362, 4546, 7731, 0, 70048, 74243, 0, 3805,
+ 0, 194565, 44001, 41008, 0, 6307, 19949, 983781, 7544, 983045, 43469, 0,
+ 0, 10152, 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, 42302, 43711,
+ 43523, 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, 9630, 92633, 0,
+ 93998, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0,
+ 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 983796, 74365, 7552, 0, 0,
+ 65384, 7223, 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077,
+ 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 983285,
+ 983783, 0, 4357, 0, 119837, 917863, 74233, 9967, 78884, 42860, 119838,
+ 10941, 65721, 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224,
+ 92267, 128536, 11974, 92213, 42772, 127518, 11650, 5013, 92663, 126583,
+ 66210, 118914, 6613, 92476, 0, 43819, 983761, 0, 64714, 0, 0, 12162,
+ 12120, 43476, 983757, 11024, 74811, 66228, 10563, 0, 127196, 43522, 2462,
+ 0, 1837, 0, 63972, 6957, 0, 120559, 4952, 65718, 65827, 5504, 65720,
+ 65714, 65715, 65716, 0, 127005, 127119, 3109, 63975, 74028, 0, 8107,
+ 119234, 1127, 455, 0, 63968, 127924, 3483, 119593, 1989, 0, 69678, 9104,
+ 3503, 65375, 92509, 6694, 42633, 1864, 0, 74306, 41446, 2540, 7736, 0,
+ 74064, 0, 10521, 0, 42173, 9705, 74124, 8604, 6955, 10916, 43684, 6149,
+ 3887, 19956, 1411, 2824, 0, 10106, 127862, 1403, 128839, 1347, 9631,
+ 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, 0, 0, 0, 43314, 0, 0, 4042, 11478,
+ 2873, 63977, 11522, 41668, 8549, 10861, 0, 63976, 0, 68623, 0, 74585,
+ 41391, 0, 917903, 376, 6987, 9221, 0, 0, 8823, 128697, 12943, 65185,
+ 41869, 12619, 0, 10154, 983043, 74439, 2039, 0, 7446, 1684, 63979, 10974,
+ 458, 120620, 0, 69791, 127161, 11916, 65016, 0, 69671, 42115, 983133,
+ 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, 13080, 0, 65808, 6610,
+ 6030, 8059, 7508, 13131, 0, 983423, 0, 8794, 41278, 41629, 12154, 128192,
+ 41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0, 0, 65371, 7078, 0, 833,
+ 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, 19916, 6913, 933, 1341,
+ 9842, 6720, 65744, 0, 983592, 128295, 0, 7405, 10105, 65810, 0, 41632,
+ 7493, 55290, 0, 41622, 0, 0, 119556, 74584, 7632, 9716, 19954, 9805,
+ 5990, 900, 0, 63957, 0, 0, 3612, 0, 64376, 93987, 5389, 92597, 0, 65938,
+ 2839, 9621, 582, 0, 74368, 3749, 6949, 7569, 74061, 0, 0, 6956, 4403,
+ 19962, 65559, 3299, 0, 917566, 119127, 9002, 0, 74372, 74236, 8478, 7598,
+ 546, 42469, 65569, 1918, 9542, 472, 7716, 10319, 10383, 6996, 0, 63952,
+ 8425, 3602, 8328, 11764, 118894, 0, 69796, 41183, 12907, 10271, 10287,
+ 684, 43525, 0, 2854, 119586, 4592, 65755, 0, 92256, 11963, 43620, 0,
+ 78249, 0, 128551, 128809, 9881, 43115, 65757, 3415, 119131, 0, 8648, 0,
+ 6741, 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, 10391,
+ 41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849,
+ 41751, 69776, 8941, 983556, 4554, 0, 9023, 11685, 0, 9928, 78617, 0,
+ 11437, 43741, 92163, 120700, 63967, 983475, 41206, 120724, 9049, 41185,
+ 43166, 0, 11680, 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0,
+ 92183, 64523, 10343, 10407, 0, 66671, 11466, 0, 128003, 42890, 74013,
+ 12050, 68201, 2860, 0, 0, 0, 42792, 5743, 10424, 12065, 42872, 0, 92342,
+ 0, 8875, 0, 0, 917991, 7531, 12847, 2413, 0, 78635, 962, 0, 12855, 41196,
+ 42564, 0, 1582, 983706, 5508, 0, 0, 0, 10801, 69876, 92354, 0, 7173, 496,
+ 10439, 4313, 64607, 69638, 7860, 0, 906, 42793, 2842, 6405, 64722, 13132,
+ 798, 64694, 12801, 8406, 1153, 92173, 64788, 0, 8054, 9174, 128652,
+ 917976, 9964, 74409, 41611, 4642, 66574, 11556, 917982, 0, 78857, 42089,
+ 78855, 9008, 0, 126592, 195096, 42079, 917981, 77924, 42513, 77927,
+ 42842, 73985, 65285, 118974, 127003, 983693, 0, 0, 0, 11335, 64069,
+ 42093, 3920, 0, 0, 0, 0, 4580, 41967, 983723, 64384, 92167, 93984, 3021,
+ 42004, 0, 0, 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0, 68113,
+ 42690, 9880, 42010, 74824, 64589, 10111, 64875, 127880, 68399, 43998,
+ 11360, 0, 0, 0, 118826, 42149, 0, 0, 0, 64941, 77919, 120421, 128077, 0,
+ 55247, 4110, 66005, 6959, 10929, 119110, 0, 66703, 77921, 8617, 41982,
+ 6025, 69242, 983176, 0, 0, 0, 9597, 42099, 43172, 983368, 10117, 983169,
92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0,
- 127517, 0, 8964, 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160,
- 10081, 13226, 42121, 42475, 42663, 128210, 41766, 0, 65882, 78849, 41760,
- 1189, 905, 480, 10985, 41733, 67859, 9629, 6742, 1745, 43625, 73835,
- 7888, 0, 3980, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867,
- 69218, 6236, 0, 0, 10505, 0, 12851, 118948, 348, 5474, 128843, 3103, 0,
- 41753, 128540, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756,
- 43347, 42560, 5391, 41746, 119147, 92591, 41259, 5561, 74360, 2691, 0,
- 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846, 41251, 0,
- 0, 3979, 0, 0, 74813, 0, 0, 0, 0, 92524, 41266, 0, 0, 128836, 10585,
- 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0,
- 6434, 0, 6939, 7766, 6432, 128106, 0, 916, 769, 41742, 11968, 74805,
- 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, 0, 4497, 3754, 127056,
- 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, 0, 0, 74260, 0, 42854,
- 43219, 128709, 0, 12185, 128879, 0, 68355, 68357, 0, 42856, 8634, 0, 0,
- 4209, 120702, 0, 65879, 41538, 65612, 127543, 669, 5679, 0, 69786, 92540,
- 0, 0, 5678, 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, 78050, 119022,
- 0, 0, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0,
- 128079, 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 0, 0, 78119, 1549, 0,
- 0, 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, 0, 69768, 1449,
- 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 0, 5567,
- 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 0, 128026, 0, 65708, 65709,
- 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468,
+ 127517, 0, 8964, 65676, 7775, 0, 41948, 0, 0, 0, 41942, 65449, 3160,
+ 10081, 13226, 42121, 42475, 42663, 128210, 41766, 119114, 65882, 78849,
+ 41760, 1189, 905, 480, 10985, 41733, 67859, 9629, 6742, 1745, 43625,
+ 73835, 7888, 0, 3980, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651,
+ 7867, 69218, 6236, 983134, 0, 10505, 0, 12851, 118948, 348, 5474, 128843,
+ 3103, 0, 41753, 128540, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931,
+ 41756, 43347, 42560, 5391, 41746, 119147, 92591, 41259, 5561, 69930,
+ 2691, 0, 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846,
+ 41251, 0, 0, 3979, 0, 0, 74813, 983730, 0, 0, 0, 92524, 41266, 0, 66566,
+ 128836, 10585, 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126,
+ 10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 128106, 69932, 916, 769,
+ 41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, 4994, 487,
+ 126537, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, 41615,
+ 0, 0, 74260, 0, 42854, 43219, 128709, 983452, 12185, 128879, 70072,
+ 68355, 68357, 0, 42856, 8634, 0, 983389, 4209, 120702, 0, 65879, 41538,
+ 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983456, 5678, 11821, 0,
+ 6711, 460, 0, 0, 983453, 0, 120747, 0, 0, 78050, 119022, 0, 983454, 0,
+ 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 128079,
+ 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983384, 0, 78119, 1549, 0, 0,
+ 120398, 5682, 6206, 8670, 10256, 5680, 69935, 10001, 128512, 69768, 1449,
+ 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 68030, 5567,
+ 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983248, 128026, 0, 65708,
+ 65709, 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468,
120561, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647,
- 78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 0, 8802, 78710,
+ 78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 119903, 8802, 78710,
65130, 11747, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, 65694,
64485, 43534, 10457, 0, 11961, 78725, 78722, 78723, 78720, 78721, 0,
- 65515, 9499, 10035, 13069, 0, 0, 9889, 68184, 42806, 0, 7256, 0, 0, 1667,
- 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, 0,
- 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, 10875,
- 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0, 3874, 0,
- 0, 0, 0, 0, 0, 65603, 0, 65687, 0, 41038, 74009, 119570, 42239, 8536,
- 78740, 0, 78726, 74432, 724, 0, 1455, 78749, 7183, 64583, 78747, 68443,
- 4175, 78741, 43614, 69801, 939, 0, 43520, 68613, 74569, 917958, 0, 78763,
- 78764, 78760, 10788, 6088, 78759, 78755, 190, 0, 12593, 0, 8188, 64408,
- 0, 4417, 0, 92261, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 128205, 0, 0,
- 74382, 73781, 7918, 73988, 0, 0, 917884, 1728, 0, 120710, 178, 12972,
- 92679, 0, 917887, 92563, 0, 0, 78327, 120405, 65690, 0, 0, 119054, 0,
- 9252, 917889, 4652, 68371, 0, 0, 0, 13065, 9923, 10806, 0, 11763, 0,
- 120688, 6723, 78187, 0, 6993, 0, 0, 8333, 0, 0, 11390, 0, 74464, 0,
- 92320, 74080, 0, 0, 11910, 92559, 8278, 8963, 4034, 128560, 0, 65344,
- 120517, 41747, 0, 0, 8677, 0, 12707, 9350, 66037, 128180, 8836, 12315,
- 12747, 8300, 0, 0, 7491, 8856, 128064, 0, 43150, 127768, 120404, 65389,
- 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, 6536, 120238,
- 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, 9588, 120248,
- 1596, 120383, 41994, 65801, 128808, 0, 66572, 0, 0, 10613, 6697, 12805,
- 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, 65940,
- 43259, 0, 6107, 0, 119177, 0, 78401, 128641, 11783, 335, 120227, 64689,
- 438, 4510, 5765, 8721, 120233, 119227, 6092, 12840, 43112, 8876, 120231,
- 8096, 10284, 128515, 0, 0, 10380, 8733, 0, 128240, 41602, 0, 92308,
- 74831, 917901, 0, 73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541,
- 0, 917898, 2065, 41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159,
- 1953, 9579, 41938, 1256, 3910, 9407, 6242, 0, 0, 41257, 41900, 8675,
- 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 0, 0, 0, 73882, 499, 0,
- 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 0, 0, 11967, 1775, 0, 0, 0,
- 0, 128009, 9458, 0, 6470, 9180, 120380, 43176, 0, 0, 42782, 0, 0, 0,
- 128309, 74777, 120669, 9414, 120382, 73782, 73969, 565, 42484, 5794, 201,
- 2662, 42292, 0, 8254, 0, 10975, 0, 120625, 74763, 1022, 4108, 3880,
- 74247, 0, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0,
- 65029, 65024, 0, 12473, 6534, 0, 99, 98, 97, 120571, 67584, 4049, 74163,
- 127065, 7090, 0, 7892, 917969, 10777, 917803, 65310, 65562, 66599, 66722,
- 0, 8039, 3363, 66594, 43434, 0, 0, 12596, 66595, 42258, 42570, 5593,
- 119148, 120711, 92425, 10100, 6061, 64854, 119, 118, 117, 116, 12998,
- 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, 102, 101,
- 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 77931, 1536, 64093,
- 73970, 77930, 127157, 0, 6020, 12716, 127112, 12744, 475, 120394, 13266,
- 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 0, 8134, 128028, 2913,
- 73870, 127113, 1866, 0, 195095, 0, 8923, 1645, 12059, 66585, 78786, 3196,
- 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859, 7916, 9861, 9860, 5258,
- 1882, 1892, 6731, 10882, 405, 11454, 73911, 0, 128781, 41169, 8939,
- 41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0, 41172, 7855, 0, 0,
- 10480, 0, 0, 77936, 8264, 12610, 0, 645, 0, 7609, 40973, 0, 73833, 78249,
- 5824, 984, 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369,
- 0, 128140, 68415, 0, 4538, 120406, 43141, 0, 0, 74214, 73886, 0, 0,
- 118902, 43005, 78448, 9552, 0, 0, 0, 12997, 0, 0, 0, 0, 2381, 12883,
- 10994, 10529, 41906, 0, 0, 0, 12425, 10661, 10856, 9614, 2428, 41478,
- 8582, 10064, 73930, 0, 0, 0, 64896, 119162, 1952, 92181, 8455, 10082,
- 11575, 0, 119566, 0, 12808, 12183, 6145, 118955, 64929, 92433, 0, 0,
- 43186, 42509, 0, 3922, 9187, 0, 0, 10191, 119057, 11752, 3353, 9358, 0,
- 917957, 66680, 120090, 8248, 7931, 8558, 9795, 68380, 0, 0, 120082,
- 120081, 120084, 41027, 120086, 0, 120088, 120087, 7019, 120073, 0, 11751,
- 120078, 78294, 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072,
- 120071, 0, 0, 43154, 41029, 0, 11332, 65380, 7728, 0, 11294, 0, 66665,
- 7851, 0, 8375, 8699, 0, 42524, 0, 9085, 0, 7504, 9327, 6160, 128095, 0,
- 0, 8088, 0, 74012, 92500, 0, 4439, 6926, 0, 12924, 128227, 42369, 0,
- 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 0, 0, 0, 65825, 9577,
- 68199, 0, 64670, 0, 78056, 6793, 11295, 0, 78053, 73872, 0, 0, 10902, 0,
- 0, 78070, 78068, 10472, 2995, 0, 0, 64682, 2371, 78069, 120808, 259,
- 1009, 92171, 2402, 2333, 6440, 0, 0, 65125, 41244, 0, 13271, 9103, 41180,
- 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, 127070, 41261, 119362, 43640, 8613,
- 0, 118989, 6736, 195092, 41492, 12005, 127889, 0, 1890, 120056, 0, 0, 0,
- 7293, 7991, 0, 10578, 0, 78076, 194738, 78077, 0, 0, 78800, 92653, 64445,
- 42668, 6635, 0, 6164, 65170, 0, 0, 7676, 11664, 0, 0, 69707, 0, 118812,
- 0, 0, 128045, 9175, 11925, 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 0,
- 127835, 4985, 13288, 672, 8098, 43196, 194746, 0, 128126, 0, 74043,
- 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0,
- 128584, 12622, 0, 0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0,
- 126983, 42731, 92205, 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250,
- 43991, 69687, 66649, 9510, 66237, 0, 0, 41066, 64673, 917963, 917964, 0,
- 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882,
- 6686, 119584, 11613, 120772, 42754, 0, 0, 92696, 0, 0, 0, 128523, 3225,
+ 65515, 9499, 10035, 13069, 71309, 0, 9889, 68184, 42806, 0, 7256, 0, 0,
+ 1667, 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101,
+ 3610, 983199, 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549,
+ 10875, 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0,
+ 3874, 0, 0, 983619, 120331, 0, 0, 65603, 0, 65687, 0, 41038, 74009,
+ 119570, 42239, 8536, 78740, 78324, 78726, 74432, 724, 0, 1455, 78749,
+ 7183, 64583, 78747, 68443, 4175, 78741, 43614, 69801, 939, 0, 43520,
+ 68613, 74569, 917958, 0, 78763, 78764, 78760, 10788, 6088, 78759, 78755,
+ 190, 0, 12593, 0, 8188, 64408, 0, 4417, 983211, 92261, 6370, 0, 7827,
+ 68441, 6965, 0, 0, 13201, 128205, 69896, 0, 74382, 73781, 7918, 73988, 0,
+ 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983373,
+ 0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, 0,
+ 0, 0, 13065, 9923, 10806, 0, 11763, 70016, 120688, 6723, 78187, 0, 6993,
+ 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983307, 69911, 11910,
+ 92559, 8278, 8963, 4034, 128560, 0, 65344, 120517, 41747, 0, 0, 8677, 0,
+ 12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 983741, 0, 7491,
+ 8856, 71361, 0, 43150, 127768, 120404, 65389, 120402, 120403, 10813,
+ 2592, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, 12321,
+ 120391, 120388, 55287, 10007, 120246, 9588, 120248, 1596, 120383, 41994,
+ 65801, 128808, 0, 66572, 0, 0, 10613, 6697, 12805, 41928, 40981, 78403,
+ 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, 65940, 43259, 0, 6107, 0,
+ 119177, 0, 78401, 128641, 11783, 335, 120227, 64689, 438, 4510, 5765,
+ 8721, 120233, 119227, 6092, 12840, 43112, 8876, 120231, 8096, 10284,
+ 128515, 0, 0, 10380, 8733, 983072, 128240, 41602, 0, 92308, 74831,
+ 917901, 0, 73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, 0,
+ 917898, 2065, 41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159, 1953,
+ 9579, 41938, 1256, 3910, 9407, 6242, 0, 983100, 41257, 41900, 8675,
+ 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 983197, 0, 0, 73882, 499,
+ 983049, 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 983104, 0, 11967,
+ 1775, 0, 0, 0, 0, 128009, 9458, 0, 6470, 9180, 120380, 43176, 0, 0,
+ 42782, 0, 0, 0, 128309, 74777, 120669, 9414, 120382, 73782, 73969, 565,
+ 42484, 5794, 201, 2662, 42292, 0, 8254, 0, 10975, 0, 120625, 74763, 1022,
+ 4108, 3880, 74247, 0, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961,
+ 1636, 0, 65029, 65024, 0, 12473, 6534, 0, 99, 98, 97, 120571, 67584,
+ 4049, 74163, 127065, 7090, 0, 7892, 917969, 10777, 917803, 65310, 65562,
+ 66599, 66722, 0, 8039, 3363, 66594, 43434, 0, 0, 12596, 66595, 42258,
+ 42570, 5593, 119148, 120711, 92425, 10100, 6061, 64854, 119, 118, 117,
+ 116, 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103,
+ 102, 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 77931, 1536,
+ 64093, 73970, 77930, 127157, 0, 6020, 12716, 127112, 12744, 475, 120394,
+ 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983299, 8134,
+ 128028, 2913, 73870, 127113, 1866, 0, 195095, 0, 8923, 1645, 12059,
+ 66585, 71297, 3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859,
+ 7916, 9861, 9860, 5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0,
+ 128781, 41169, 8939, 41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0,
+ 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983300, 645, 126616,
+ 7609, 40973, 69943, 73833, 69948, 5824, 984, 77918, 10688, 5851, 0, 7729,
+ 73982, 120518, 0, 195086, 43369, 0, 128140, 68415, 983093, 4538, 120406,
+ 43141, 0, 983208, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0,
+ 983159, 12997, 0, 0, 0, 0, 2381, 12883, 10994, 10529, 41906, 0, 0, 0,
+ 12425, 10661, 10856, 9614, 2428, 41478, 8582, 10064, 73930, 0, 0, 0,
+ 64896, 119162, 1952, 92181, 8455, 10082, 11575, 983482, 119566, 0, 12808,
+ 12183, 6145, 118955, 64929, 92433, 0, 983193, 43186, 42509, 0, 3922,
+ 9187, 983614, 0, 10191, 119057, 11752, 3353, 9358, 0, 71366, 66680,
+ 120090, 8248, 7931, 8558, 9795, 68380, 983289, 0, 120082, 120081, 120084,
+ 41027, 120086, 0, 120088, 7366, 7019, 120073, 0, 11751, 120078, 78294,
+ 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0,
+ 43154, 41029, 0, 11332, 65380, 7728, 94077, 11294, 0, 66665, 7851, 0,
+ 8375, 8699, 0, 42524, 0, 9085, 94041, 7504, 9327, 6160, 128095, 983855,
+ 0, 8088, 0, 74012, 92500, 0, 4439, 6926, 983047, 12924, 128227, 42369,
+ 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983275, 0, 0,
+ 65825, 9577, 68199, 0, 64670, 983121, 78056, 6793, 11295, 0, 78053,
+ 73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, 2371,
+ 78069, 120808, 259, 1009, 92171, 2402, 2333, 6440, 194741, 0, 65125,
+ 41244, 0, 13271, 9103, 2278, 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178,
+ 127070, 41261, 119362, 43640, 8613, 0, 94049, 6736, 195092, 41492, 12005,
+ 69927, 0, 1890, 120056, 0, 0, 0, 7293, 7991, 0, 10578, 0, 78076, 194738,
+ 78077, 69928, 0, 78800, 92653, 64445, 42668, 6635, 0, 6164, 65170, 0, 0,
+ 7676, 11664, 0, 983649, 69707, 0, 118812, 0, 0, 128045, 9175, 11925,
+ 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 127177, 127835, 4985, 13288,
+ 672, 8098, 43196, 194746, 983096, 128126, 42655, 74043, 65072, 1577,
+ 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, 128584, 12622, 0,
+ 0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0, 126983, 42731, 67972,
+ 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, 43991, 69687, 66649,
+ 9510, 66237, 983294, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707,
+ 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, 6686,
+ 119584, 11613, 120772, 42754, 0, 983298, 92696, 0, 0, 0, 128523, 3225,
917996, 4433, 41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757,
64879, 917949, 917950, 127848, 13227, 0, 10021, 5160, 1387, 0, 917953,
41418, 0, 65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158,
- 119257, 4274, 0, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, 0,
- 41252, 66682, 0, 119637, 41249, 1366, 64635, 65047, 12466, 0, 0, 4397,
+ 119257, 4274, 983292, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232,
+ 0, 41252, 66682, 0, 119637, 41249, 1366, 64635, 65047, 12466, 0, 0, 4397,
128037, 128336, 41296, 9545, 41291, 128049, 0, 41485, 3511, 41282, 5923,
10400, 0, 128818, 760, 0, 12088, 5786, 0, 42256, 119869, 119860, 417,
- 41474, 119562, 41565, 0, 5934, 119867, 66583, 119231, 64877, 0, 64481,
+ 41474, 119562, 41565, 0, 5934, 119867, 66583, 119231, 64877, 2284, 64481,
78614, 66013, 41956, 43455, 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0,
- 0, 0, 65910, 127747, 10246, 120816, 0, 1237, 10274, 4552, 119576, 0, 0,
- 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 74192, 120794, 7840,
- 0, 43630, 10252, 0, 128104, 43185, 0, 4396, 0, 119880, 10769, 9676,
- 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, 6072, 43025, 10299, 0, 0,
- 120608, 66326, 0, 0, 0, 43811, 9330, 0, 7222, 10283, 10315, 10379, 4996,
- 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, 0, 0, 7565, 66363, 12952,
- 64806, 43180, 77928, 68096, 77929, 43982, 74288, 622, 74023, 885, 43405,
- 1602, 0, 0, 852, 0, 12160, 0, 10212, 65435, 0, 12071, 9609, 12156,
- 917983, 917984, 43586, 11035, 10411, 917988, 10255, 6710, 10279, 4194,
- 10375, 917993, 0, 4315, 12644, 127516, 77937, 43639, 43343, 0, 917998,
- 11501, 41177, 128689, 0, 917792, 0, 92413, 8715, 0, 41179, 0, 43313, 0,
- 41176, 0, 994, 0, 8452, 127103, 73966, 0, 0, 5921, 0, 2597, 0, 5922,
- 118903, 77943, 4186, 92531, 127106, 127105, 6718, 0, 4406, 74601, 8480,
- 9192, 9747, 128699, 4413, 92196, 42268, 3198, 5924, 5920, 92469, 6921,
- 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, 10772,
- 65276, 5937, 1914, 2553, 11682, 6756, 128590, 128646, 8363, 0, 2993,
- 7772, 3916, 0, 120494, 1141, 42407, 8159, 718, 7572, 973, 0, 120718,
- 3235, 2415, 43164, 0, 8018, 42333, 74756, 10675, 6937, 42486, 43381,
- 65390, 10067, 0, 1202, 0, 0, 65863, 0, 0, 0, 78182, 64542, 3260, 73829,
- 65388, 9945, 8419, 78042, 6738, 0, 43681, 69728, 2059, 0, 0, 55237, 1431,
- 0, 66565, 10821, 0, 12804, 128076, 8229, 1235, 3307, 11472, 78089, 78184,
- 4544, 0, 0, 0, 1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102,
- 0, 10141, 0, 63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106,
- 78103, 78104, 0, 119572, 10665, 64616, 41572, 0, 127160, 0, 41573, 0,
- 3931, 120295, 74143, 0, 0, 0, 0, 11982, 0, 0, 0, 128016, 64484, 0, 41167,
- 0, 41735, 0, 717, 10754, 0, 0, 127979, 0, 63767, 0, 1780, 6936, 0, 0,
- 819, 10611, 9694, 126978, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 6578, 7009,
+ 126643, 0, 65910, 127747, 10246, 120816, 65785, 1237, 10274, 4552,
+ 119576, 0, 0, 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 69845,
+ 120794, 7840, 0, 43630, 10252, 0, 128104, 43185, 0, 4396, 0, 119880,
+ 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, 6072, 43025,
+ 10299, 0, 0, 120608, 66326, 983439, 127794, 0, 43811, 9330, 120596, 7222,
+ 10283, 10315, 10379, 4996, 983773, 13281, 66517, 7865, 10087, 78343, 0,
+ 78347, 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 7414, 77929, 43982,
+ 74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212,
+ 65435, 0, 12071, 9609, 12156, 917983, 917984, 43586, 11035, 10411,
+ 917988, 10255, 6710, 10279, 4194, 10375, 73900, 0, 4315, 12644, 127516,
+ 77937, 43639, 43343, 78777, 917998, 11501, 41177, 128689, 0, 917792, 0,
+ 92413, 8715, 0, 41179, 0, 43313, 0, 41176, 0, 994, 0, 8452, 127103,
+ 73966, 0, 0, 5921, 0, 2597, 0, 5922, 118903, 77943, 4186, 92531, 127106,
+ 127105, 6718, 0, 4406, 74601, 8480, 9192, 9747, 126530, 4413, 92196,
+ 42268, 3198, 5924, 5920, 92469, 6921, 78081, 74007, 42869, 8418, 11681,
+ 43169, 10176, 0, 742, 0, 2893, 10772, 65276, 5937, 1914, 2553, 11682,
+ 6756, 128590, 128646, 8363, 0, 2993, 7772, 3916, 4301, 120494, 1141,
+ 42407, 8159, 718, 7572, 973, 0, 120718, 3235, 2415, 43164, 0, 8018,
+ 42333, 74756, 10675, 6937, 42486, 43381, 65390, 10067, 0, 1202, 0, 0,
+ 65863, 0, 0, 94013, 78182, 64542, 3260, 73829, 65388, 9945, 8419, 78042,
+ 6738, 0, 43681, 69728, 2059, 0, 0, 55237, 1431, 0, 66565, 10821, 0,
+ 12804, 128076, 8229, 1235, 3307, 11472, 78089, 78184, 4544, 0, 0, 0,
+ 1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102, 0, 10141, 0,
+ 63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106, 78103, 78104,
+ 0, 119572, 10665, 64616, 41572, 0, 127160, 0, 41573, 0, 3931, 120295,
+ 74143, 0, 0, 0, 78460, 11982, 0, 0, 0, 128016, 64484, 0, 41167, 0, 41735,
+ 94019, 717, 10754, 0, 0, 127979, 0, 63767, 0, 1780, 6936, 0, 92254, 819,
+ 10611, 9694, 126978, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 6578, 7009,
7523, 6922, 8348, 8347, 7525, 3346, 8339, 128165, 128338, 575, 268,
78111, 8563, 5754, 120343, 41541, 65565, 8336, 5936, 7290, 78117, 8337,
8341, 308, 11388, 7522, 120721, 78123, 65466, 11090, 6953, 0, 120346, 0,
@@ -17128,1686 +18063,2642 @@ static unsigned int code_hash[] = {
7830, 11651, 13093, 64002, 0, 65742, 12874, 119597, 11590, 0, 74048,
128350, 8595, 0, 917947, 43703, 13097, 0, 64643, 13283, 12697, 0, 12381,
3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, 119153, 1955, 0, 5349,
- 42538, 0, 0, 65308, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 0, 7638,
- 41642, 42764, 0, 43109, 7637, 5752, 120600, 0, 73832, 128827, 120635,
- 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 0, 291, 0, 0, 2027, 66230,
- 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431,
+ 42538, 0, 0, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983219, 7638,
+ 41642, 42764, 0, 43109, 7637, 5752, 74037, 0, 73832, 128827, 120635,
+ 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 120798, 291, 0, 0, 2027,
+ 66230, 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431,
120430, 0, 128351, 127489, 127148, 0, 92499, 0, 119094, 74213, 7824, 0,
0, 41274, 5778, 6302, 0, 0, 12680, 119130, 1417, 77889, 194914, 9452, 0,
- 74393, 11552, 0, 127855, 0, 65391, 0, 10172, 65453, 63789, 41264, 78658,
- 6426, 4641, 9179, 64819, 55278, 41255, 42036, 41469, 41269, 120412,
- 41267, 4646, 120425, 865, 42034, 78274, 78273, 4645, 42033, 78270,
- 127982, 0, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671, 195089, 6069,
- 9219, 195090, 1661, 13120, 63784, 69819, 10140, 9713, 119143, 0, 0, 0,
- 2306, 10485, 118943, 6068, 10612, 195099, 119567, 195101, 92561, 41462,
- 120470, 195079, 5422, 128234, 0, 0, 0, 10229, 10635, 826, 128081, 195082,
- 195085, 195084, 195087, 6483, 0, 1808, 7848, 0, 8100, 78227, 78669,
- 78670, 13301, 78667, 9667, 78665, 78872, 0, 11003, 9904, 0, 0, 120690,
- 9144, 10921, 0, 78680, 9840, 65131, 78678, 77841, 10313, 0, 0, 64320,
- 10265, 78686, 10962, 78684, 43008, 8945, 78683, 0, 41, 195072, 1792,
- 120515, 195073, 8655, 195075, 92544, 77951, 12066, 0, 385, 4152, 2585,
- 127804, 119068, 3126, 0, 74136, 10957, 0, 43258, 0, 127873, 13157, 0, 0,
- 3570, 0, 7443, 0, 44006, 6997, 0, 0, 7879, 8739, 11075, 0, 65216, 0,
- 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, 119912, 9691, 4411,
- 78802, 0, 0, 43442, 78799, 65254, 10066, 0, 0, 0, 0, 13061, 8016, 78687,
- 19932, 64831, 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 0, 119925,
- 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452,
- 917544, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969,
- 0, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, 5209, 297,
- 5810, 8522, 8415, 119937, 78429, 78428, 7077, 2497, 128651, 960, 74156,
- 6981, 92374, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875, 127505,
- 78876, 2503, 73778, 1762, 69794, 2495, 78873, 5844, 78874, 118838, 0,
- 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0,
- 92339, 0, 0, 5782, 420, 0, 0, 43796, 10797, 63794, 0, 0, 64814, 63796,
- 77965, 0, 66581, 119204, 41608, 0, 0, 63792, 4659, 120788, 0, 43676, 0,
- 69673, 0, 0, 0, 329, 77968, 92707, 917548, 7399, 0, 41188, 13244, 120466,
- 42167, 7435, 78193, 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0,
- 65684, 0, 5601, 65192, 42765, 63752, 0, 7987, 0, 1172, 69799, 6786,
- 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0, 65347, 65346, 65345,
- 0, 127384, 5347, 69802, 0, 73868, 118944, 10588, 0, 0, 63755, 0, 5343,
- 78422, 0, 4555, 5341, 0, 0, 128670, 5351, 0, 43104, 65244, 917892, 64541,
- 42519, 74472, 0, 0, 74765, 917888, 194892, 6638, 0, 65113, 271, 74180,
- 65370, 8835, 65368, 12653, 65366, 42172, 41086, 65363, 65362, 65361,
- 11912, 43410, 11323, 65357, 11800, 65355, 5345, 65353, 65352, 65351, 761,
- 65349, 19959, 69718, 63856, 0, 2423, 77958, 64647, 77959, 11957, 4699, 0,
- 0, 0, 0, 64605, 0, 0, 0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773,
- 13167, 12918, 41096, 73980, 69245, 78254, 917893, 10684, 0, 917896, 0,
- 7946, 12541, 8182, 67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0,
- 0, 8847, 0, 65876, 5535, 8329, 74590, 0, 92609, 0, 0, 3127, 2595, 65713,
- 42013, 0, 5607, 41089, 0, 0, 74256, 2665, 11304, 0, 74200, 4970, 8764,
+ 74393, 11552, 0, 127855, 128217, 65391, 0, 10172, 65453, 63789, 41264,
+ 78658, 6426, 4641, 9179, 64819, 55278, 41255, 42036, 41469, 41269,
+ 120412, 41267, 4646, 120425, 865, 42034, 78274, 78273, 4645, 42033,
+ 78270, 127982, 983172, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671,
+ 195089, 6069, 9219, 128558, 1661, 13120, 63784, 69819, 10140, 9713,
+ 119143, 0, 0, 94050, 2306, 10485, 118943, 6068, 10612, 195099, 119567,
+ 195101, 92561, 41462, 120470, 195079, 5422, 128234, 0, 0, 0, 10229,
+ 10635, 826, 128081, 195082, 195085, 195084, 195087, 6483, 92211, 1808,
+ 7848, 0, 8100, 78227, 78669, 78670, 13301, 78667, 9667, 78665, 78872, 0,
+ 11003, 9904, 0, 0, 120690, 9144, 10921, 0, 78680, 9840, 65131, 78678,
+ 77841, 10313, 0, 0, 64320, 10265, 78686, 10962, 78684, 43008, 8945,
+ 78683, 0, 41, 195072, 1792, 120515, 195073, 8655, 195075, 92544, 77951,
+ 12066, 0, 385, 4152, 2585, 127804, 119068, 3126, 0, 74136, 10957, 983694,
+ 43258, 119116, 127873, 13157, 0, 917544, 3570, 0, 7443, 0, 44006, 6997,
+ 68004, 126631, 7879, 8739, 11075, 0, 65216, 0, 69795, 2593, 8463, 7810,
+ 917862, 7839, 119913, 78806, 119912, 9691, 4411, 78802, 0, 0, 43442,
+ 69851, 65254, 10066, 983880, 0, 0, 0, 13061, 8016, 78687, 19932, 64831,
+ 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 983574, 119925, 0,
+ 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452,
+ 194709, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969,
+ 120767, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, 5209,
+ 297, 5810, 8522, 8415, 119937, 78429, 78428, 7077, 2497, 128651, 960,
+ 74156, 6981, 92374, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875,
+ 127505, 78876, 2503, 73778, 1762, 69794, 2495, 78873, 5844, 68031,
+ 118838, 0, 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0,
+ 8892, 0, 92339, 0, 983073, 5782, 420, 0, 0, 43796, 10797, 63794, 0, 0,
+ 64814, 63796, 77965, 0, 66581, 119204, 41608, 0, 0, 63792, 4659, 120788,
+ 0, 43676, 0, 69673, 0, 0, 0, 329, 77968, 92707, 917548, 7399, 0, 41188,
+ 13244, 120466, 42167, 7435, 78193, 5380, 119086, 69225, 1155, 11365,
+ 43126, 77972, 0, 65684, 0, 5601, 65192, 42765, 63752, 0, 7987, 128543,
+ 1172, 69799, 6786, 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0,
+ 65347, 65346, 65345, 0, 127384, 5347, 69802, 983623, 73868, 118944,
+ 10588, 0, 0, 63755, 0, 5343, 78422, 120661, 4555, 5341, 0, 70071, 128670,
+ 5351, 78675, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, 74765,
+ 917888, 127510, 6638, 0, 65113, 271, 74180, 65370, 8835, 65368, 12653,
+ 65366, 42172, 41086, 65363, 65362, 65361, 11912, 43410, 11323, 65357,
+ 11800, 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, 69718, 63856,
+ 126635, 2423, 77958, 64647, 77959, 11957, 4699, 0, 0, 0, 0, 64605, 0, 0,
+ 0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096,
+ 73980, 69245, 78254, 917893, 10684, 0, 917896, 0, 7946, 12541, 8182,
+ 67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0, 68011, 8847, 0,
+ 65876, 5535, 8329, 74590, 983206, 92609, 0, 0, 3127, 2595, 65713, 42013,
+ 983849, 5607, 41089, 0, 0, 74256, 2665, 11304, 43751, 74200, 4970, 8764,
120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254,
- 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 0, 3572, 10023, 4959,
- 13079, 0, 0, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, 13304,
- 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 0, 972, 41453, 0, 0,
- 73883, 92408, 73945, 0, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, 11396,
- 0, 11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 64446, 0, 10696,
- 0, 6073, 9838, 118920, 0, 6075, 128563, 282, 0, 6437, 74078, 128000,
- 9801, 0, 0, 0, 0, 3474, 118787, 0, 120655, 6081, 0, 127843, 74076, 78879,
- 0, 0, 0, 0, 0, 8751, 11499, 120273, 7816, 12636, 4665, 12628, 4670,
- 92608, 120272, 0, 9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0,
- 4669, 0, 68099, 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0,
- 917875, 8664, 9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251,
- 9772, 7255, 8886, 1389, 127932, 120257, 120258, 120259, 12941, 42661,
- 92381, 120255, 120256, 12301, 120266, 69820, 41102, 66604, 120262,
- 120263, 120264, 1017, 66600, 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789,
- 120613, 128704, 0, 119196, 11307, 66707, 917871, 127751, 11745, 7919, 0,
- 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, 6744, 128355, 1699, 74191, 74843, 0,
- 0, 6306, 10169, 0, 119251, 10068, 3766, 2389, 120456, 120455, 6611, 257,
- 43170, 13153, 0, 42386, 0, 9436, 2599, 0, 6496, 9449, 5930, 11476, 11033,
- 11447, 10541, 5622, 120436, 8477, 3760, 1718, 9442, 66433, 3776, 0,
- 41435, 4352, 0, 2435, 120809, 5621, 120385, 4201, 3778, 4203, 4202, 4205,
- 4204, 120447, 3768, 68142, 765, 41440, 3764, 8473, 6373, 8469, 120438,
- 12947, 4564, 0, 0, 74271, 73753, 8374, 0, 0, 6829, 5225, 128807, 127385,
- 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 0, 127236, 128019, 0, 5353,
- 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 0, 6952, 0, 120752,
- 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471, 120038, 120027,
- 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400, 5627, 120017,
- 120018, 120023, 64275, 120021, 10961, 0, 203, 0, 0, 0, 0, 78350, 0,
- 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, 127878,
- 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, 3047, 10317, 175, 0, 0,
- 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118, 128024,
- 1129, 0, 0, 65900, 1986, 7846, 78804, 8661, 917772, 65255, 0, 3845, 4490,
- 118969, 6649, 74400, 1456, 7530, 11977, 7249, 8366, 0, 7756, 12342,
- 128568, 51, 41516, 0, 8570, 9568, 917863, 456, 7026, 8145, 1168, 9251,
- 9082, 119964, 64055, 42781, 3866, 12323, 41512, 73805, 68121, 0, 41494,
- 92316, 4660, 0, 10405, 0, 78803, 0, 0, 42040, 73918, 119627, 7944, 41454,
- 12605, 0, 42205, 41455, 236, 64051, 78867, 8214, 0, 0, 0, 41457, 0,
- 119589, 1969, 2384, 8097, 917864, 0, 127380, 78029, 8766, 0, 78079, 5854,
- 127974, 10583, 0, 119989, 0, 10416, 917869, 3872, 917868, 0, 8429, 0,
- 118806, 2838, 128802, 0, 917866, 0, 0, 0, 0, 0, 11096, 120813, 10553,
- 1662, 8483, 120396, 43605, 5892, 43418, 0, 73742, 66, 65, 68, 67, 70, 69,
- 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87,
- 90, 89, 119862, 10357, 7385, 8170, 1704, 8556, 0, 9659, 0, 0, 0, 9556, 0,
- 4503, 11353, 9647, 0, 78185, 0, 0, 92713, 78886, 0, 0, 74229, 66593,
- 6438, 917979, 9109, 78882, 1289, 64599, 0, 0, 0, 65507, 2447, 0, 0,
- 128042, 0, 0, 0, 6334, 0, 0, 19937, 0, 92368, 0, 5675, 254, 0, 0, 69686,
- 42425, 8918, 64003, 5716, 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0,
- 92645, 74796, 64400, 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 0,
- 11785, 0, 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7775,
- 128293, 0, 74588, 120748, 3140, 128854, 7960, 43271, 0, 12518, 10909,
- 127508, 1428, 12472, 0, 128787, 7699, 12393, 0, 0, 0, 74518, 8223, 0,
- 4261, 0, 0, 0, 0, 0, 128302, 0, 128046, 43419, 0, 64554, 10574, 3878, 0,
- 42352, 1752, 73785, 0, 42506, 128541, 10199, 0, 0, 0, 65919, 0, 6695,
- 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0,
- 64041, 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 0, 0,
- 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, 65608, 3714, 0, 0, 0,
+ 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 68019, 3572, 10023, 4959,
+ 13079, 0, 983268, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450,
+ 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983301, 972,
+ 41453, 983434, 0, 73883, 68022, 73945, 983726, 2288, 19955, 9538, 0,
+ 69807, 0, 0, 0, 0, 11396, 983432, 11019, 0, 0, 0, 68020, 41078, 71365,
+ 261, 5927, 7791, 0, 7362, 0, 10696, 0, 6073, 9838, 118920, 0, 6075,
+ 93995, 282, 126510, 6437, 74078, 128000, 9801, 0, 74177, 0, 0, 3474,
+ 118787, 0, 120655, 6081, 0, 78874, 74076, 78879, 0, 0, 0, 0, 0, 8751,
+ 11499, 120273, 7816, 12636, 4665, 12628, 4670, 92608, 120272, 68017,
+ 9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0, 4669, 0, 68099,
+ 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, 917875, 8664,
+ 9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251, 9772, 7255, 8886,
+ 1389, 127932, 120257, 120258, 120259, 12941, 42661, 92381, 120255,
+ 120256, 12301, 120266, 69820, 41102, 64428, 120262, 120263, 120264, 1017,
+ 66600, 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, 120613, 128704, 0,
+ 73855, 11307, 66707, 917871, 127751, 11745, 7919, 0, 1641, 0, 0, 8966, 0,
+ 0, 5908, 0, 0, 6744, 128355, 1699, 69861, 74843, 917933, 0, 6306, 10169,
+ 71324, 119251, 10068, 3766, 2389, 120456, 120455, 6611, 257, 43170,
+ 13153, 0, 42386, 0, 9436, 2599, 0, 6496, 9449, 5930, 11476, 11033, 11447,
+ 10541, 5622, 120436, 8477, 3760, 1718, 9442, 66433, 3776, 0, 41435, 4352,
+ 983610, 2435, 120809, 5621, 120385, 4201, 3778, 4203, 4202, 4205, 4204,
+ 120447, 3768, 68142, 765, 41440, 3764, 8473, 6373, 8469, 120438, 12947,
+ 4564, 0, 0, 74271, 73753, 8374, 983156, 0, 6829, 5225, 128807, 127385, 0,
+ 0, 119615, 0, 74793, 5626, 73807, 11771, 74075, 127236, 128019, 42614,
+ 5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 69942, 6952,
+ 983264, 120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471,
+ 120038, 120027, 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400,
+ 5627, 120017, 120018, 120023, 64275, 120021, 8786, 0, 203, 0, 0, 0, 0,
+ 78350, 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065,
+ 126464, 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, 3047, 10317, 175, 0,
+ 0, 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118,
+ 128024, 1129, 126574, 0, 65900, 1986, 7846, 78804, 8661, 917772, 65255,
+ 0, 3845, 4490, 118969, 6649, 74400, 1456, 7530, 11977, 7249, 8366, 0,
+ 7756, 12342, 128568, 51, 41516, 0, 8570, 9568, 71318, 456, 7026, 8145,
+ 1168, 9251, 9082, 119964, 64055, 42781, 3866, 12323, 41512, 73805, 68121,
+ 0, 41494, 92316, 4660, 0, 10405, 0, 78803, 0, 0, 42040, 73918, 119627,
+ 7944, 41454, 12605, 0, 42205, 41455, 236, 64051, 78867, 8214, 0, 0, 0,
+ 41457, 983961, 119589, 1969, 2384, 8097, 917864, 7413, 68012, 78029,
+ 8766, 0, 78079, 5854, 127974, 10583, 0, 119989, 0, 10416, 917869, 3872,
+ 917868, 0, 8429, 0, 118806, 2838, 128802, 0, 917866, 0, 0, 0, 983958,
+ 94005, 11096, 120813, 10553, 1662, 8483, 120396, 43605, 5892, 43418, 0,
+ 73742, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79,
+ 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 119862, 10357, 7385, 8170, 1704,
+ 8556, 0, 9659, 0, 0, 0, 9556, 0, 4503, 11353, 9647, 0, 78185, 0, 0,
+ 92713, 78886, 0, 0, 74229, 66593, 6438, 917979, 9109, 78882, 1289, 64599,
+ 0, 68009, 0, 65507, 2447, 0, 0, 128042, 126545, 983137, 0, 6334, 0, 0,
+ 19937, 0, 92368, 0, 5675, 254, 0, 0, 69686, 42425, 8918, 64003, 5716,
+ 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0, 92645, 74796, 64400,
+ 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 68008, 11785, 7412,
+ 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7103, 128293, 7102,
+ 74588, 120748, 3140, 128854, 7960, 43271, 0, 12518, 10909, 127508, 1428,
+ 12472, 0, 69864, 7699, 12393, 0, 0, 0, 74518, 8223, 0, 4261, 0, 0, 0, 0,
+ 0, 128302, 0, 128046, 43419, 0, 64554, 10574, 3878, 0, 42352, 1752,
+ 73785, 0, 42506, 128541, 10199, 0, 0, 68021, 65919, 0, 6695, 720, 324, 0,
+ 0, 43406, 983727, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, 64041,
+ 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 119134, 0, 0,
+ 5204, 74774, 43404, 11835, 0, 3995, 68360, 65608, 3714, 92190, 0, 0,
10999, 11750, 0, 43251, 68660, 43301, 0, 120557, 8130, 8672, 10845,
- 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 468, 612, 0,
- 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, 74564, 119017,
- 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, 64684,
- 126992, 3359, 7800, 128644, 65177, 6226, 353, 12396, 0, 119612, 64742,
- 128682, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418,
- 0, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0,
- 12409, 0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 0, 0,
- 118986, 0, 4788, 0, 0, 65734, 0, 43790, 0, 13075, 74429, 0, 64569, 43532,
- 10837, 2492, 127197, 118901, 68637, 41136, 43785, 11813, 9649, 41154,
- 119617, 5128, 4038, 41143, 65604, 64859, 41592, 6771, 1648, 5435, 0,
- 6734, 41343, 119848, 65439, 12709, 6986, 92364, 0, 0, 41349, 119123,
- 12581, 10374, 5175, 0, 73806, 10254, 0, 10278, 10262, 77950, 41346, 0,
- 607, 0, 119853, 128846, 12923, 10314, 10282, 65477, 10378, 120297, 40976,
- 8265, 0, 119834, 40975, 5840, 42838, 0, 40978, 0, 119840, 0, 0, 0, 66444,
- 10538, 0, 2550, 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619,
- 65822, 0, 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0,
- 120551, 42380, 64895, 43693, 66451, 808, 5455, 11347, 0, 1026, 5620,
- 194887, 0, 11350, 5617, 0, 9225, 64639, 127073, 9145, 128060, 1338,
- 120581, 0, 12739, 4603, 3084, 0, 92484, 9858, 6037, 0, 3974, 78213,
- 10290, 0, 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, 0, 41032,
- 42388, 0, 64700, 10011, 1445, 40961, 0, 194893, 0, 40960, 0, 194891, 0,
- 40963, 64952, 10402, 0, 0, 92304, 10603, 0, 0, 0, 0, 6714, 10083, 127069,
- 194895, 78367, 127377, 0, 0, 9073, 42585, 64302, 10704, 65030, 4787, 0,
- 74829, 0, 65423, 0, 128118, 9570, 0, 9525, 2689, 917626, 65426, 0,
- 917624, 43740, 0, 40966, 917623, 13286, 3998, 42598, 42596, 503, 74237,
+ 11964, 0, 983185, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 126629, 0, 468,
+ 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 983163, 12280, 0, 540,
+ 74564, 119017, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667,
+ 0, 64684, 126992, 3359, 7800, 69934, 65177, 6226, 353, 12396, 0, 119612,
+ 64742, 128682, 120282, 0, 983442, 12412, 19941, 0, 120277, 78847, 1884,
+ 9481, 42418, 70059, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0,
+ 41328, 42344, 0, 12409, 0, 4360, 127009, 9739, 128550, 69933, 73921, 0,
+ 42521, 8539, 983716, 0, 118986, 0, 4788, 0, 68023, 65734, 983447, 43790,
+ 0, 13075, 74429, 94063, 64569, 43532, 10837, 2492, 127197, 118901, 68637,
+ 41136, 43785, 11813, 9649, 41154, 119617, 5128, 4038, 41143, 65604,
+ 64859, 41592, 6771, 1648, 5435, 917837, 6734, 41343, 119848, 65439,
+ 12709, 6986, 92364, 68015, 0, 41349, 70021, 12581, 10374, 5175, 0, 73806,
+ 10254, 0, 10278, 10262, 69858, 41346, 0, 607, 0, 119852, 128846, 12923,
+ 10314, 10282, 65477, 10378, 120297, 40976, 8265, 0, 119834, 40975, 5840,
+ 42838, 0, 40978, 983888, 119840, 0, 983071, 0, 66444, 10538, 0, 2550,
+ 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619, 65822, 126567,
+ 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0, 120551, 42380,
+ 64895, 43693, 66451, 808, 5455, 11347, 0, 1026, 5620, 194887, 0, 11350,
+ 5617, 0, 9225, 64639, 127073, 9145, 128060, 1338, 120581, 983158, 12739,
+ 4603, 3084, 983155, 92484, 9858, 6037, 0, 3974, 78213, 10290, 983695,
+ 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0,
+ 64700, 10011, 1445, 40961, 0, 119105, 0, 40960, 0, 194891, 0, 40963,
+ 64952, 10402, 0, 0, 92304, 10603, 0, 0, 983113, 0, 6714, 10083, 127069,
+ 194895, 78367, 127377, 0, 93963, 9073, 42585, 64302, 10704, 65030, 4787,
+ 0, 74829, 0, 65423, 0, 128118, 9570, 55260, 9525, 2689, 917626, 65426, 0,
+ 917624, 43740, 0, 40966, 917622, 13286, 3998, 42598, 42596, 503, 74237,
8735, 2690, 66488, 42836, 127150, 41954, 917617, 1652, 772, 6688, 8310,
65428, 3487, 43416, 3585, 10194, 43320, 119159, 128183, 194874, 6468,
- 41976, 9720, 917606, 11767, 41970, 0, 5836, 12358, 0, 4355, 9048, 12180,
- 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362, 12435,
- 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0, 3638,
- 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 0, 119182, 69244, 0, 0, 11759,
- 194903, 6368, 74823, 0, 41423, 8078, 10504, 0, 41698, 42237, 0, 7002, 0,
- 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, 10466, 13099, 0, 0, 0,
- 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625, 78157, 41409, 0, 69639,
- 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0, 41424, 917598, 120546, 0,
- 128212, 0, 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 0, 78251,
- 0, 42290, 3275, 92472, 42329, 74759, 0, 0, 0, 92388, 69649, 10989, 74234,
- 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, 74603, 64504, 19928, 0, 0,
- 3917, 0, 11732, 0, 0, 41448, 41461, 128823, 0, 127912, 0, 8819, 12663, 0,
- 41184, 74014, 232, 74835, 120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758,
- 68425, 0, 1064, 42467, 128044, 10115, 19924, 92711, 0, 7862, 64551,
- 13224, 8516, 41862, 66650, 7561, 78618, 69793, 1878, 0, 0, 2911, 0,
- 41178, 5427, 64823, 0, 0, 3787, 41174, 0, 41458, 0, 41463, 42413, 11292,
- 2406, 775, 0, 65584, 0, 6074, 9618, 128668, 0, 43440, 0, 194901, 41436,
- 3656, 0, 194899, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456,
- 12598, 0, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 0,
+ 41976, 9720, 917606, 11767, 41970, 194596, 5836, 12358, 0, 4355, 9048,
+ 12180, 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362,
+ 12435, 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0,
+ 3638, 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 983736, 119182, 69244, 0,
+ 0, 11759, 194903, 6368, 74823, 0, 41423, 8078, 10504, 127558, 41698,
+ 42237, 0, 7002, 983669, 41430, 42267, 41051, 41484, 0, 0, 41050, 41473,
+ 10466, 13099, 0, 0, 0, 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625,
+ 78157, 41409, 0, 69639, 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0,
+ 41424, 917598, 120546, 0, 128212, 0, 41417, 1261, 0, 0, 12102, 119662,
+ 41401, 0, 127538, 0, 78251, 0, 42290, 3275, 92472, 42329, 74759, 0, 0, 0,
+ 92388, 69649, 10989, 74234, 983140, 10598, 7410, 2669, 903, 0, 2920, 0,
+ 127232, 74603, 64504, 19928, 0, 0, 3917, 0, 11732, 0, 983180, 41448,
+ 41461, 128823, 0, 127912, 0, 8819, 12663, 0, 41184, 74014, 232, 74835,
+ 120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467,
+ 128044, 10115, 19924, 92711, 0, 7862, 64551, 13224, 8516, 41862, 66650,
+ 7561, 78618, 69793, 1878, 0, 983261, 2911, 0, 41178, 5427, 64823, 0, 0,
+ 3787, 41174, 0, 41458, 0, 41463, 42413, 11292, 2406, 775, 0, 65584,
+ 69923, 6074, 9618, 128668, 983943, 43440, 0, 194901, 41436, 3656, 0,
+ 120600, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, 12598,
+ 983191, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 70029,
9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, 11497, 64687,
74008, 42592, 3871, 0, 128305, 9111, 5741, 0, 194846, 120366, 119111,
120745, 0, 120368, 0, 11648, 0, 194873, 120364, 41587, 120365, 0, 74322,
42113, 0, 127155, 12172, 0, 74530, 65298, 65723, 194840, 73871, 65724,
- 7928, 120354, 0, 41595, 73730, 0, 42118, 73830, 66042, 10355, 0, 7875, 0,
- 41598, 3993, 0, 1545, 40971, 536, 128521, 43029, 0, 0, 65173, 65286, 0,
- 0, 0, 0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 0, 0, 78194, 64326,
- 40969, 10526, 78753, 8323, 40968, 1339, 11731, 78756, 0, 65460, 12242,
- 128513, 8020, 10843, 11554, 0, 0, 8266, 41006, 65722, 0, 10710, 0,
- 118942, 67667, 64567, 119155, 195091, 0, 119636, 67857, 120687, 0, 0,
- 11755, 66305, 0, 0, 10917, 120767, 0, 11272, 2040, 41247, 41326, 195060,
- 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, 1984, 194621,
- 0, 92293, 40984, 128306, 9373, 0, 12916, 6284, 0, 41663, 0, 0, 0, 9237,
- 9385, 41648, 0, 0, 0, 41666, 1830, 73783, 2056, 41287, 92610, 0, 0,
- 42219, 128257, 0, 41987, 41676, 0, 120823, 0, 41670, 0, 92590, 2796,
- 55291, 11683, 9902, 74521, 0, 11451, 0, 128822, 42631, 2359, 0, 67844,
- 74164, 41238, 548, 11405, 13133, 64368, 0, 128795, 0, 397, 43622, 42139,
- 9547, 9590, 128238, 1614, 43661, 64356, 66307, 6651, 1358, 0, 428, 9620,
- 1466, 78112, 10982, 118831, 1333, 7104, 407, 6425, 128834, 74253, 0, 0,
- 0, 5804, 11976, 8554, 92721, 0, 0, 9057, 42294, 41218, 0, 0, 78137, 1883,
- 10952, 8048, 78142, 41225, 92621, 42915, 0, 128684, 0, 4407, 0, 65809,
- 119074, 194821, 8448, 7141, 74183, 0, 12675, 12659, 0, 42363, 120624,
- 194824, 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585,
- 120500, 0, 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042,
- 8709, 128283, 0, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897,
- 577, 0, 0, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414,
- 42643, 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317,
- 917612, 66315, 2106, 120222, 11273, 0, 43004, 7541, 0, 0, 961, 64307,
- 66324, 64906, 128591, 3106, 65917, 41284, 1696, 0, 891, 12105, 0, 42624,
- 12802, 3264, 8824, 13268, 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322,
- 120371, 0, 11449, 128187, 42868, 41285, 3547, 0, 0, 0, 0, 43216, 6089,
- 78682, 0, 120578, 4170, 1029, 127761, 127036, 119224, 42374, 0, 744, 0,
- 0, 0, 65823, 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 0, 65136,
- 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, 78648,
- 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177,
- 9020, 78652, 78653, 6178, 120249, 120242, 128027, 67673, 7518, 8754, 0,
- 120237, 2137, 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0,
- 74149, 0, 2318, 0, 66361, 8198, 0, 64360, 12601, 42536, 65266, 120827,
- 74307, 0, 6970, 5404, 43332, 3667, 7936, 12925, 126989, 6385, 0, 0,
- 118949, 10874, 65505, 128083, 0, 42053, 2075, 42057, 11083, 42052, 0, 0,
- 67651, 0, 9665, 92300, 0, 13181, 0, 0, 0, 0, 74148, 0, 0, 120225, 120229,
- 120224, 74172, 41145, 0, 0, 0, 41148, 8683, 7594, 127519, 0, 119090,
- 10869, 43458, 41146, 92407, 11441, 0, 3512, 119633, 0, 8103, 0, 0, 65184,
- 11780, 41563, 42796, 0, 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0,
- 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 0, 0, 0, 3804, 13070,
- 11557, 42044, 0, 1095, 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346,
- 66697, 0, 11684, 0, 92486, 0, 0, 42043, 43232, 66677, 0, 42046, 78241,
- 4036, 0, 0, 128213, 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441,
- 92722, 0, 0, 127772, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492,
- 41190, 3973, 119365, 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792,
- 0, 118968, 6417, 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0,
- 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 0, 1617, 8050,
- 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0,
- 7555, 13103, 5408, 2817, 1214, 0, 92335, 0, 0, 0, 0, 127195, 7957, 8689,
- 64723, 1056, 42896, 74147, 194813, 0, 55286, 7073, 65850, 12327, 0,
- 119028, 0, 0, 0, 2341, 8450, 8484, 8474, 0, 0, 0, 8461, 128102, 12153,
- 12799, 0, 43709, 43708, 9451, 7571, 13073, 0, 0, 681, 0, 703, 0, 3272,
- 8781, 12894, 0, 11709, 92288, 74446, 0, 92532, 0, 11338, 120768, 3276, 0,
- 0, 65928, 0, 0, 65021, 64795, 74574, 0, 10047, 78814, 3262, 78811, 42711,
- 0, 0, 68478, 163, 576, 9895, 1655, 78817, 74591, 78815, 78816, 0, 0, 0,
- 0, 10039, 0, 0, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0,
- 0, 0, 67848, 0, 0, 0, 8887, 0, 7295, 11031, 0, 43157, 0, 8946, 10348,
- 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 0, 8810, 74499, 686, 0,
- 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, 65118, 0,
- 119151, 74205, 92651, 0, 2401, 68144, 8792, 0, 0, 65455, 0, 92246, 0,
- 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, 10396, 74135, 0,
- 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 128672, 0, 0,
- 11479, 0, 0, 6350, 12864, 69674, 78114, 1061, 64780, 2001, 43111, 55230,
- 128686, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, 43707, 74127, 0,
- 0, 8486, 0, 73758, 2335, 4362, 0, 0, 69221, 1025, 0, 42625, 917627,
- 78084, 41443, 0, 128206, 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567,
- 41442, 3988, 0, 78237, 118910, 0, 65274, 8564, 78199, 78238, 127515, 0,
- 0, 43446, 0, 66513, 6256, 0, 579, 55218, 10206, 0, 6375, 2673, 0, 11814,
- 0, 4488, 0, 127336, 68451, 10444, 118846, 127334, 11799, 74407, 68466,
- 4487, 127849, 42832, 1032, 120267, 43450, 78257, 7203, 0, 614, 78191,
- 127325, 120615, 0, 78262, 128669, 127323, 0, 43121, 0, 0, 92513, 1050,
- 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 127313, 0, 66504, 0, 0,
- 2307, 0, 64333, 127312, 128547, 73873, 0, 0, 0, 127973, 128708, 0, 10360,
- 6746, 0, 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 0, 66447, 8046,
- 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 0, 10487, 0,
- 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771, 0, 0, 5237,
- 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 5764, 0, 0, 3008, 4896, 0,
- 12087, 0, 55231, 41103, 0, 64565, 4773, 0, 92717, 0, 4770, 0, 917567,
- 8731, 65378, 127362, 120619, 9122, 128033, 0, 4774, 3019, 9997, 12834, 0,
- 9456, 10215, 120547, 0, 0, 0, 0, 74776, 4281, 4768, 0, 41535, 4099, 9017,
- 0, 0, 78095, 0, 78096, 0, 0, 0, 78098, 0, 42814, 880, 0, 0, 128021, 2134,
- 0, 10116, 9877, 92329, 0, 0, 7095, 0, 74116, 6778, 0, 78090, 8243, 2427,
- 128141, 7093, 0, 11585, 195003, 9962, 0, 12223, 0, 0, 1434, 120254, 5637,
- 11573, 0, 0, 0, 19951, 0, 78121, 0, 0, 55283, 0, 0, 74437, 1156, 8740,
- 92415, 3782, 64331, 0, 41370, 1014, 8261, 0, 0, 10835, 0, 65536, 0,
- 120463, 0, 7702, 118824, 0, 43010, 65779, 65783, 1150, 10547, 5700, 0,
- 120603, 65383, 2339, 42594, 5697, 118788, 0, 128576, 0, 42257, 5696,
- 92677, 120465, 3862, 9643, 0, 0, 7634, 65167, 9845, 0, 0, 5701, 9722,
- 41490, 0, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 78067, 0,
- 78818, 92719, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712,
- 10744, 0, 990, 5647, 0, 7387, 78734, 41114, 11477, 5646, 12879, 11018, 0,
- 3945, 92589, 0, 0, 0, 0, 78212, 127746, 1020, 73763, 0, 78731, 5648,
- 64748, 194910, 0, 10205, 3545, 0, 6984, 0, 74051, 0, 43242, 120458, 2667,
- 0, 0, 0, 9911, 0, 65020, 10097, 119166, 127145, 0, 118836, 0, 78427,
- 1140, 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0,
- 3267, 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0,
+ 7928, 120354, 983095, 41595, 73730, 0, 42118, 73830, 66042, 10355,
+ 983110, 7875, 0, 41598, 3993, 0, 1545, 40971, 536, 128521, 43029, 0, 0,
+ 65173, 65286, 0, 0, 0, 0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 917817,
+ 0, 78194, 64326, 40969, 10526, 78753, 8323, 40968, 1339, 11731, 78756, 0,
+ 65460, 12242, 128513, 8020, 10843, 11554, 0, 0, 8266, 41006, 65722, 0,
+ 10710, 0, 118942, 67667, 64567, 119155, 195091, 0, 119636, 67857, 120687,
+ 0, 983066, 11755, 66305, 0, 0, 10917, 93979, 0, 11272, 2040, 41247,
+ 41326, 195060, 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0,
+ 1984, 11830, 0, 92293, 40984, 128306, 9373, 0, 12916, 6284, 0, 41663, 0,
+ 0, 0, 9237, 9385, 41648, 0, 194580, 2299, 41666, 1830, 73783, 2056,
+ 41287, 92610, 0, 0, 42219, 128257, 0, 41987, 41676, 983059, 120823,
+ 983144, 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 67988, 11451,
+ 983111, 128822, 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133,
+ 64368, 983233, 128795, 0, 397, 43622, 42139, 9547, 9590, 128238, 1614,
+ 43661, 64356, 66307, 6651, 1358, 0, 428, 9620, 1466, 78112, 10982,
+ 118831, 1333, 7104, 407, 6425, 128834, 74253, 0, 0, 0, 5804, 11976, 8554,
+ 92721, 0, 0, 9057, 42294, 41218, 0, 0, 78137, 1883, 10952, 8048, 78142,
+ 41225, 92621, 42915, 983667, 128684, 0, 4407, 0, 65809, 119074, 194821,
+ 8448, 7141, 74183, 0, 12675, 12659, 0, 42363, 120624, 194824, 55273,
+ 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, 120500, 119158,
+ 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, 8709, 128283,
+ 126477, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897, 577, 0,
+ 983751, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414, 42643,
+ 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 69945,
+ 66315, 2106, 120222, 11273, 0, 43004, 7541, 0, 0, 961, 64307, 66324,
+ 64906, 128591, 3106, 65917, 41284, 1696, 0, 891, 12105, 0, 42624, 12802,
+ 3264, 8824, 13268, 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322, 120371,
+ 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983390, 43216,
+ 6089, 78682, 0, 120578, 4170, 1029, 127761, 127036, 119224, 42374, 0,
+ 744, 0, 0, 0, 65823, 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 983162,
+ 65136, 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778,
+ 78648, 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0,
+ 6177, 9020, 78652, 78653, 6178, 120249, 120242, 128027, 67673, 2214,
+ 8754, 0, 120237, 2137, 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974,
+ 2308, 0, 74149, 0, 2318, 983183, 66361, 8198, 0, 64360, 12601, 42536,
+ 65266, 120827, 74307, 92462, 6970, 5404, 43332, 3667, 7936, 12925,
+ 126989, 6385, 0, 0, 118949, 10874, 65505, 128083, 0, 42053, 2075, 42057,
+ 11083, 42052, 0, 0, 67651, 0, 9665, 92300, 983657, 13181, 0, 0, 0, 70088,
+ 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 94096, 983937,
+ 41148, 8683, 7594, 127519, 0, 119090, 10869, 43458, 41146, 92407, 11441,
+ 0, 3512, 119633, 983700, 8103, 0, 0, 65184, 11780, 41563, 42796, 0,
+ 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0, 118908, 7988, 10436, 74273,
+ 3271, 73804, 64711, 0, 94064, 0, 0, 3804, 13070, 11557, 42044, 0, 1095,
+ 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, 66697, 0, 11684, 0,
+ 92486, 917603, 0, 42043, 43232, 66677, 0, 42046, 78241, 4036, 126481, 0,
+ 128213, 194861, 0, 11954, 93978, 1450, 12986, 1340, 0, 65441, 92722, 0,
+ 0, 127772, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, 41190,
+ 3973, 119365, 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792, 0,
+ 118968, 6417, 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 128556, 7755,
+ 0, 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 983659,
+ 1617, 8050, 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768,
+ 6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, 69919, 92335, 983125, 0,
+ 0, 0, 127195, 7957, 8689, 64723, 1056, 42896, 74147, 194813, 0, 55286,
+ 7073, 65850, 12327, 983939, 119028, 0, 0, 0, 2341, 8450, 8484, 8474,
+ 983252, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451,
+ 7571, 13073, 0, 0, 681, 983246, 703, 0, 3272, 8781, 12894, 70077, 11709,
+ 92288, 74446, 0, 92532, 0, 11338, 120768, 3276, 0, 0, 65928, 0, 0, 65021,
+ 64795, 74574, 0, 10047, 78814, 3262, 78811, 42711, 0, 0, 68478, 163, 576,
+ 9895, 1655, 78817, 74591, 78815, 78816, 983122, 0, 0, 0, 10039, 0,
+ 983936, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, 0, 0,
+ 67848, 0, 0, 0, 8887, 127521, 7295, 11031, 0, 43157, 0, 8946, 10348,
+ 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 983702, 8810, 74499, 686,
+ 0, 71362, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128,
+ 65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983639, 0, 65455,
+ 0, 92246, 0, 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161,
+ 10396, 74135, 983445, 118945, 78118, 73851, 3010, 6441, 78122, 1458,
+ 41475, 128672, 93975, 0, 11479, 0, 120356, 6350, 12864, 69674, 78114,
+ 1061, 64780, 2001, 43111, 55230, 128686, 4052, 0, 7626, 0, 0, 1045, 0,
+ 5631, 41113, 0, 0, 43707, 74127, 0, 0, 8486, 0, 73758, 2335, 4362,
+ 983195, 126561, 69221, 1025, 0, 42625, 917627, 78084, 41443, 0, 128206,
+ 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567, 41442, 3988, 0, 78237,
+ 118910, 0, 65274, 8564, 78199, 78238, 127515, 0, 0, 43446, 0, 66513,
+ 6256, 0, 579, 55218, 10206, 983075, 6375, 2673, 0, 11814, 0, 4488, 0,
+ 127336, 68451, 10444, 118846, 127334, 11799, 74407, 68466, 4487, 127849,
+ 42832, 1032, 120267, 43450, 78257, 7203, 0, 614, 78191, 127325, 120615,
+ 0, 78262, 128669, 127323, 0, 43121, 0, 0, 92513, 1050, 7549, 0, 0, 9314,
+ 0, 0, 120616, 0, 10057, 0, 127313, 0, 66504, 983171, 0, 2307, 0, 64333,
+ 127312, 128547, 73873, 0, 94035, 0, 127973, 128708, 0, 10360, 6746, 0,
+ 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 128285, 66447, 8046,
+ 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 93965, 10487,
+ 69878, 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771,
+ 983229, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283,
+ 983231, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0,
+ 92717, 70074, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033,
+ 126600, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0,
+ 74776, 4281, 4768, 0, 41535, 4099, 9017, 0, 0, 78095, 0, 78096, 0, 0, 0,
+ 78098, 0, 42814, 880, 0, 0, 128021, 2134, 0, 10116, 9877, 92329, 0, 0,
+ 7095, 0, 74116, 6778, 0, 78090, 8243, 2427, 128141, 7093, 0, 11585,
+ 195003, 9962, 0, 12223, 0, 0, 1434, 120254, 5637, 11573, 0, 0, 0, 19951,
+ 0, 78121, 0, 0, 55283, 0, 0, 74437, 1156, 8740, 92415, 3782, 64331, 0,
+ 41370, 1014, 8261, 0, 0, 10835, 0, 65536, 0, 120463, 0, 7702, 118824, 0,
+ 43010, 65779, 65783, 1150, 10547, 5700, 0, 120603, 65383, 2339, 42594,
+ 5697, 118788, 0, 128576, 0, 42257, 5696, 92677, 120465, 3862, 9643, 0, 0,
+ 7634, 65167, 9845, 0, 0, 5701, 9722, 41490, 983153, 1426, 68217, 0,
+ 68447, 42204, 55270, 8571, 194991, 78067, 0, 78818, 92719, 43182, 12184,
+ 0, 42022, 0, 10281, 0, 5650, 43194, 64712, 10744, 0, 990, 5647, 0, 7387,
+ 78734, 41114, 11477, 5646, 12879, 11018, 983921, 3945, 92589, 0, 0, 0, 0,
+ 78212, 127746, 1020, 73763, 0, 78731, 5648, 64748, 194910, 78733, 10205,
+ 3545, 983585, 6984, 0, 74051, 983646, 43242, 120458, 2667, 0, 0, 0, 9911,
+ 0, 65020, 10097, 119166, 127145, 983653, 118836, 983739, 78427, 1140,
+ 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267,
+ 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0,
128347, 0, 0, 0, 19938, 65906, 127819, 0, 0, 3298, 5375, 10142, 0, 8215,
- 0, 6134, 41246, 64402, 0, 128215, 0, 0, 0, 41382, 0, 128653, 5173, 65348,
+ 0, 6134, 41246, 64402, 0, 69899, 0, 0, 0, 41382, 0, 128653, 5173, 65348,
527, 0, 0, 92612, 128250, 78797, 11915, 0, 0, 10072, 0, 42695, 2329,
- 42250, 0, 128864, 69667, 12245, 1568, 0, 0, 0, 128120, 0, 74328, 92708,
- 74769, 0, 119087, 9069, 6144, 0, 0, 73822, 0, 128010, 64917, 41521,
- 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, 0, 0, 0,
- 0, 66449, 13263, 74281, 69217, 13171, 127796, 0, 0, 92294, 0, 1044,
- 41276, 0, 0, 0, 42068, 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526, 917847,
- 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 0, 0, 0, 0, 1057, 566,
- 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472, 92510, 3006,
- 4620, 127237, 0, 0, 0, 64659, 0, 127749, 55253, 6357, 6362, 8626, 0, 0,
- 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, 43813, 1053, 0, 78269,
- 0, 0, 1052, 1051, 459, 1060, 74349, 66479, 0, 0, 0, 0, 42490, 689, 6508,
- 4163, 42298, 8639, 66641, 4246, 0, 0, 12130, 0, 42337, 64596, 64375,
- 66481, 127850, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, 6361,
- 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069, 5830, 0, 43685, 0, 0, 0,
- 0, 8693, 78611, 119565, 0, 120413, 0, 127257, 65894, 0, 0, 0, 0, 0, 0,
- 119187, 2135, 78868, 0, 0, 78869, 42313, 5579, 92412, 0, 0, 0, 0, 5578,
- 41774, 128115, 42023, 6234, 5669, 92275, 0, 0, 0, 127506, 68202, 5583, 0,
- 0, 42426, 5580, 42276, 2923, 892, 5582, 42465, 41330, 194987, 5795,
- 65512, 119006, 65702, 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370,
- 0, 2931, 1638, 10966, 10188, 65878, 118848, 0, 69694, 0, 128830, 8172,
- 42017, 0, 10844, 0, 128195, 92424, 6374, 0, 0, 286, 78023, 1062, 0,
- 119999, 0, 7395, 0, 1070, 64900, 7153, 6095, 41865, 0, 3015, 128023,
- 917763, 5211, 0, 6400, 0, 194983, 0, 8189, 11276, 0, 0, 372, 128829, 0,
- 118874, 42102, 41585, 128202, 0, 42101, 276, 78402, 0, 33, 74226, 127303,
- 9007, 118796, 41588, 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257,
- 0, 42104, 0, 0, 2328, 92409, 1071, 0, 0, 74848, 0, 0, 0, 1047, 0, 0,
- 64790, 0, 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, 12098,
- 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611,
- 41623, 195001, 5715, 69654, 0, 0, 5712, 2761, 41620, 68124, 3074, 5722,
- 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, 6479,
- 0, 0, 0, 78607, 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010,
- 0, 8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, 0, 0, 0,
- 64946, 10992, 0, 120009, 0, 0, 9318, 120661, 13249, 65679, 73808, 0,
- 65457, 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0,
- 0, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0,
- 9218, 1731, 0, 0, 0, 195010, 0, 0, 0, 120001, 127018, 92492, 5155, 0,
- 5358, 0, 0, 917767, 64424, 0, 3840, 64314, 41432, 0, 0, 68430, 119116,
- 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, 11580, 0, 64601,
- 12205, 0, 0, 64507, 8868, 399, 0, 74842, 0, 0, 12149, 13088, 551, 0,
- 10156, 12119, 92572, 0, 2544, 65074, 119211, 0, 0, 78011, 351, 119149, 0,
- 0, 55229, 0, 74268, 0, 0, 0, 42377, 0, 0, 0, 0, 0, 9013, 4054, 0, 0, 0,
- 0, 73960, 5585, 65881, 2549, 74469, 0, 0, 5584, 8358, 0, 74411, 92219,
- 10919, 0, 7980, 0, 0, 0, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0,
- 11356, 0, 0, 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 92535, 8135,
- 6450, 10055, 77996, 0, 0, 0, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939,
- 92573, 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0,
- 74509, 0, 5659, 0, 127510, 66729, 5655, 0, 42168, 0, 1055, 917628,
- 127792, 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272,
- 10304, 10368, 42518, 594, 10244, 10248, 7407, 0, 64870, 0, 3467, 0, 0,
- 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 0, 69696,
- 69769, 64656, 0, 0, 194837, 0, 5666, 65227, 5318, 63994, 0, 9091, 10798,
- 0, 128166, 10186, 0, 7732, 0, 64556, 0, 0, 5668, 74445, 0, 0, 5670, 0,
- 127297, 11820, 2992, 7826, 5667, 19952, 120807, 0, 12749, 74551, 0, 0,
- 66496, 4361, 119260, 1306, 9286, 1497, 0, 0, 0, 0, 3571, 13247, 0, 7973,
- 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, 0, 128554,
- 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, 119927, 0, 0,
- 0, 64905, 0, 9512, 120671, 12742, 6443, 0, 0, 9135, 0, 41564, 0, 55219,
- 128832, 0, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0,
- 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 0,
- 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 0, 5635, 3373,
- 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, 1657,
- 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 0, 78300, 42227, 0,
- 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, 5642, 0,
- 5486, 0, 4356, 11710, 0, 12051, 0, 0, 5641, 8259, 0, 1058, 0, 67630, 0,
- 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 65322, 0, 5645, 64964,
- 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621, 119934, 9000,
- 0, 0, 92673, 1865, 0, 5613, 74267, 0, 0, 5610, 0, 0, 65826, 2069, 0,
- 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 65376, 2412, 0,
- 8186, 9807, 74269, 0, 13130, 65874, 0, 5807, 0, 10030, 5306, 12936, 0, 0,
- 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, 9710, 0, 0, 0, 413, 65623,
- 7118, 0, 9133, 74262, 0, 1042, 0, 64779, 12171, 119240, 6185, 64776,
- 4984, 0, 708, 11391, 0, 12241, 92720, 0, 1308, 0, 2534, 810, 0, 0, 0, 0,
- 0, 1917, 3000, 0, 0, 120739, 2364, 92443, 74470, 66618, 65680, 0, 10027,
- 0, 128154, 12337, 120722, 127368, 0, 2980, 755, 69774, 931, 13124, 68182,
- 6363, 2748, 0, 0, 65041, 0, 44011, 8730, 0, 127854, 78312, 7274, 119250,
- 0, 7275, 78304, 935, 0, 65840, 377, 42325, 11649, 127363, 65253, 64301,
- 128835, 78308, 42341, 65284, 2417, 0, 12884, 19912, 7907, 10768, 0,
- 194998, 0, 10673, 119217, 7248, 0, 128346, 1781, 5496, 3627, 62, 1649, 0,
- 964, 0, 127876, 78226, 128775, 127512, 0, 0, 0, 0, 43689, 127911, 13142,
- 78812, 42415, 66575, 4542, 74037, 43547, 0, 0, 7677, 2991, 4946, 42454,
- 0, 7949, 0, 0, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724,
- 6478, 9898, 43673, 65237, 6241, 7106, 4877, 0, 6238, 0, 10548, 127049,
- 4409, 0, 0, 64798, 0, 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231,
+ 42250, 0, 128864, 69667, 12245, 1568, 94033, 0, 0, 128120, 0, 74328,
+ 92708, 74769, 0, 119087, 9069, 6144, 0, 0, 73822, 0, 128010, 64917,
+ 41521, 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740,
+ 73734, 0, 0, 0, 66449, 13263, 74281, 69217, 13171, 127796, 0, 0, 92294,
+ 0, 1044, 41276, 0, 0, 0, 42068, 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526,
+ 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983446, 7098, 0,
+ 0, 1057, 566, 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472,
+ 92510, 3006, 4620, 127237, 983578, 0, 0, 64659, 0, 127749, 55253, 6357,
+ 6362, 8626, 71337, 2216, 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0,
+ 43813, 1053, 0, 78269, 0, 126586, 1052, 1051, 459, 1060, 74349, 66479, 0,
+ 0, 0, 0, 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 0, 12130,
+ 0, 42337, 64596, 64375, 66481, 127850, 0, 0, 6359, 0, 43471, 983759, 0,
+ 0, 127274, 0, 6358, 6361, 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069,
+ 5830, 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 983799, 120413, 0,
+ 127257, 65894, 0, 0, 0, 983914, 0, 0, 119187, 2135, 78868, 0, 0, 78869,
+ 42313, 5579, 92412, 0, 983082, 94002, 0, 5578, 41774, 128115, 42023,
+ 6234, 5669, 92275, 0, 0, 0, 127506, 68202, 5583, 0, 0, 42426, 5580,
+ 42276, 2923, 892, 2220, 42465, 41330, 194987, 5795, 65512, 119006, 65702,
+ 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370, 0, 2931, 1638, 10966,
+ 10188, 65878, 118848, 0, 69694, 69879, 128830, 8172, 42017, 0, 10844, 0,
+ 128195, 92424, 6374, 0, 0, 286, 78023, 1062, 0, 119999, 0, 7395, 0, 1070,
+ 64900, 7153, 6095, 41865, 0, 3015, 128023, 126465, 5211, 983083, 6400, 0,
+ 194983, 70054, 8189, 11276, 0, 0, 372, 128829, 0, 118874, 42102, 41585,
+ 128202, 0, 42101, 276, 78402, 0, 33, 74226, 127303, 9007, 118796, 41588,
+ 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257, 0, 42104, 0, 983971,
+ 2328, 92409, 1071, 42899, 0, 74848, 0, 983580, 0, 1047, 0, 0, 64790, 0,
+ 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, 12098, 65571, 9166,
+ 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611, 41623, 195001,
+ 5715, 69654, 0, 0, 5712, 2761, 41620, 68124, 3074, 5722, 0, 8643, 73768,
+ 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, 6479, 0, 0, 0, 78607,
+ 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, 0, 8701, 68130,
+ 119616, 120522, 0, 42477, 194994, 12123, 4495, 43569, 0, 0, 0, 64946,
+ 10992, 0, 120009, 0, 0, 9318, 93986, 13249, 65679, 73808, 0, 65457,
+ 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 983957,
+ 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, 9218,
+ 1731, 0, 983737, 0, 67990, 0, 0, 0, 120001, 127018, 92492, 5155, 120000,
+ 5358, 983735, 0, 917767, 64424, 983225, 3840, 64314, 41432, 0, 78315,
+ 68430, 67980, 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109,
+ 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983276,
+ 983712, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074,
+ 119211, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, 0, 42377,
+ 0, 0, 0, 983915, 0, 9013, 4054, 0, 983570, 0, 0, 73960, 5585, 65881,
+ 2549, 74469, 0, 0, 5584, 8358, 0, 64215, 92219, 10919, 0, 7980, 126601,
+ 983775, 2218, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0,
+ 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 74392, 8135, 6450, 10055,
+ 77996, 0, 0, 119225, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 92573,
+ 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509,
+ 983843, 5659, 0, 78692, 66729, 5655, 0, 42168, 0, 1055, 917628, 127792,
+ 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, 10304,
+ 10368, 42518, 594, 10244, 10248, 7407, 983878, 64870, 0, 3467, 983882, 0,
+ 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 70036,
+ 69696, 69769, 64656, 983717, 0, 94020, 70056, 5666, 65227, 5318, 63994,
+ 0, 9091, 10798, 0, 128166, 10186, 0, 7732, 983715, 64556, 0, 0, 5668,
+ 74445, 0, 128663, 5670, 126610, 127297, 11820, 2992, 7826, 5667, 19952,
+ 120807, 0, 12749, 74551, 0, 0, 66496, 4361, 119260, 1306, 9286, 1497,
+ 128286, 94004, 0, 0, 3571, 13247, 0, 7973, 66353, 68435, 78278, 67896,
+ 43192, 0, 78265, 553, 120653, 0, 128554, 5829, 0, 4587, 78285, 65912, 0,
+ 12746, 0, 0, 119924, 5633, 119927, 94101, 94102, 94099, 64905, 94105,
+ 9512, 94103, 12742, 6443, 983797, 0, 9135, 0, 41564, 0, 55219, 128832,
+ 983842, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, 127270,
+ 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 983800,
+ 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 43760, 5635,
+ 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0,
+ 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 983676, 78300,
+ 42227, 0, 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705,
+ 5642, 0, 5486, 0, 4356, 11710, 0, 12051, 69938, 0, 5641, 8259, 0, 1058,
+ 0, 67630, 0, 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 2800, 0,
+ 5645, 64964, 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621,
+ 119934, 9000, 0, 0, 92673, 1865, 0, 5613, 69950, 0, 0, 5610, 0, 0, 65826,
+ 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 65376,
+ 2412, 0, 8186, 9807, 74269, 92547, 13130, 65874, 0, 5807, 0, 10030, 5306,
+ 12364, 128064, 0, 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, 9710, 0, 0,
+ 0, 413, 65623, 7118, 0, 9133, 74262, 0, 1042, 0, 64779, 12171, 119240,
+ 6185, 64776, 4984, 0, 708, 11391, 0, 12241, 92720, 983890, 1308, 0, 2534,
+ 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, 2364, 92443, 74470, 66618,
+ 65680, 120779, 10027, 0, 128154, 12337, 120722, 127368, 983167, 2980,
+ 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 92276, 44011,
+ 8730, 983067, 127854, 78312, 7274, 119250, 0, 7275, 78304, 935, 0, 65840,
+ 377, 42325, 11649, 127363, 65253, 64301, 128835, 78308, 42341, 65284,
+ 2417, 0, 12884, 19912, 7907, 10768, 0, 194998, 0, 10673, 119217, 7248, 0,
+ 128346, 1781, 5496, 3627, 62, 1649, 0, 964, 0, 127876, 78226, 128775,
+ 127512, 0, 0, 0, 0, 43689, 127911, 13142, 78812, 42415, 66575, 4542,
+ 69909, 43547, 0, 0, 7677, 2991, 4946, 42454, 11565, 7949, 0, 983909,
+ 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, 6478, 9898,
+ 43673, 65237, 6241, 7106, 4877, 983786, 6238, 0, 10548, 127049, 4409, 0,
+ 0, 64798, 0, 5346, 0, 94047, 6237, 4874, 0, 9176, 0, 126553, 65231,
65884, 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685,
0, 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, 43635,
- 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 0, 0, 10938, 0,
+ 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 126470, 0, 10938, 0,
118790, 1182, 2542, 4826, 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790,
- 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 0, 11376,
+ 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 983929, 11376,
74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305,
- 0, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, 41871, 41338,
- 3734, 7734, 43683, 8750, 66605, 66011, 0, 40965, 127937, 0, 5161, 10572,
- 0, 0, 0, 64349, 7287, 42162, 127552, 0, 0, 11948, 69220, 12359, 43429,
- 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031, 0, 9870, 68645,
- 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, 0, 43677, 41583, 0,
- 65799, 92623, 0, 0, 0, 78169, 66199, 0, 3609, 68624, 0, 832, 120693,
- 120770, 78473, 66007, 78471, 65703, 0, 0, 42732, 5180, 92699, 41395,
- 41530, 11691, 64773, 92214, 74002, 0, 0, 128645, 6348, 243, 13200, 0,
- 6024, 92309, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195,
- 0, 4230, 0, 13307, 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0,
- 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 128277, 2603, 0,
- 0, 0, 0, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0,
- 41121, 3885, 92, 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453,
- 128128, 0, 74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 92358,
- 66637, 7995, 8759, 43421, 78277, 12449, 128552, 0, 0, 8752, 3197, 4720,
- 10165, 0, 119249, 0, 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934,
- 1946, 741, 0, 5494, 4639, 0, 1990, 66589, 4498, 78664, 119183, 0, 0,
- 69734, 2960, 73779, 0, 8969, 128117, 43424, 127059, 0, 2950, 119579,
- 6210, 65753, 370, 0, 0, 0, 4953, 0, 0, 0, 0, 69230, 0, 0, 65688, 0, 5063,
- 3517, 2964, 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729,
- 66016, 78253, 0, 0, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215,
- 0, 65883, 0, 917774, 120602, 3761, 0, 0, 0, 0, 12912, 119012, 3850,
- 128191, 0, 0, 0, 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978,
- 120540, 119135, 41586, 10527, 0, 917848, 3848, 78739, 194937, 127536,
- 65241, 5336, 0, 128786, 663, 0, 10780, 0, 0, 78767, 0, 127163, 68193,
- 347, 0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143,
+ 120183, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, 41871,
+ 41338, 3734, 7734, 43683, 8750, 66605, 66011, 92514, 40965, 127937, 0,
+ 5161, 10572, 0, 0, 0, 64349, 7287, 42162, 127552, 0, 126605, 11948,
+ 69220, 12359, 43429, 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031,
+ 0, 9870, 68645, 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, 0,
+ 43677, 41583, 0, 65799, 92623, 0, 0, 983927, 78169, 66199, 0, 3609,
+ 68624, 0, 832, 120693, 120770, 78473, 66007, 78471, 65703, 0, 0, 42732,
+ 5180, 92699, 41395, 41530, 11691, 64773, 92214, 74002, 0, 0, 128645,
+ 6348, 243, 13200, 983804, 6024, 92309, 9979, 10037, 41529, 10648, 8538,
+ 43687, 0, 0, 4285, 66195, 0, 4230, 0, 7367, 43256, 92353, 7563, 42376, 0,
+ 68442, 120512, 0, 0, 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311,
+ 65589, 128277, 2603, 0, 0, 0, 70047, 0, 6022, 0, 2884, 0, 11620, 0, 43,
+ 0, 66453, 1016, 41107, 0, 41121, 3885, 92, 65456, 64608, 0, 74801, 0,
+ 2074, 0, 78283, 0, 12453, 128128, 983817, 74241, 126568, 6791, 12457,
+ 78268, 0, 0, 0, 78279, 0, 0, 92358, 66637, 7995, 8759, 43421, 78277,
+ 12449, 128552, 0, 0, 8752, 3197, 4720, 10165, 0, 119249, 0, 11595, 64893,
+ 0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, 4639, 983147,
+ 1990, 66589, 4498, 78664, 119183, 0, 0, 69734, 2960, 73779, 0, 8969,
+ 128117, 43424, 127059, 0, 2950, 119579, 6210, 65753, 370, 0, 0, 0, 4953,
+ 983673, 0, 0, 0, 69230, 0, 0, 65688, 983240, 5063, 3517, 2964, 43663,
+ 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, 66016, 78253, 0,
+ 71317, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, 0, 65883, 0,
+ 917774, 120602, 3761, 0, 0, 70068, 0, 12912, 119012, 3850, 128191, 0, 0,
+ 0, 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978, 120540, 119135,
+ 41586, 10527, 0, 917848, 3848, 78739, 194937, 127536, 65241, 5336,
+ 983251, 128786, 663, 0, 10780, 0, 0, 78767, 983249, 127163, 68193, 347,
+ 0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143,
69657, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681,
- 0, 0, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609,
- 10434, 0, 11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172,
- 41728, 41721, 0, 0, 0, 41203, 0, 13110, 41726, 0, 0, 1000, 69651, 0,
- 41140, 1209, 73978, 0, 73750, 1073, 6321, 77878, 41138, 0, 68213, 0,
- 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237, 78787, 66314,
- 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0, 64398, 0,
- 119970, 12311, 0, 78796, 78798, 78794, 78795, 68434, 78793, 66670, 0, 0,
- 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131, 0, 9627, 78536,
- 78542, 78535, 0, 1944, 1248, 10148, 127755, 119990, 119991, 12701, 78376,
- 11308, 119995, 0, 119997, 119998, 65305, 65100, 4031, 42794, 120003,
- 7075, 8154, 119985, 120007, 41817, 73934, 42275, 120011, 120012, 78526,
- 120014, 120015, 6041, 0, 41899, 0, 8002, 0, 4364, 0, 0, 64332, 0, 7813,
- 9064, 119986, 10124, 7526, 8601, 7281, 78455, 7279, 12041, 1418, 10885,
- 12673, 0, 0, 9660, 0, 13012, 4571, 0, 0, 0, 12078, 2970, 0, 10933, 0,
- 77870, 0, 0, 0, 41599, 0, 128831, 0, 12950, 92160, 3486, 0, 78311, 4239,
- 0, 127799, 66511, 0, 2637, 64629, 8460, 127053, 8476, 0, 0, 0, 0, 65673,
- 1019, 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 0, 5412, 66243, 9935, 0,
- 73864, 0, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120,
- 41736, 92546, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539,
- 127284, 0, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272,
- 7115, 66030, 73932, 5498, 73942, 41536, 0, 68204, 92587, 3459, 8997, 0,
- 0, 0, 0, 92512, 0, 66377, 69781, 0, 0, 78511, 3161, 295, 120207, 0,
- 92223, 127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0,
- 73972, 2952, 78765, 11038, 10901, 63900, 63899, 63898, 0, 667, 12332,
- 63887, 6086, 41722, 0, 5172, 0, 0, 4159, 0, 0, 9815, 63884, 19934, 63882,
- 41198, 8555, 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0,
- 41723, 63875, 63874, 11460, 7432, 1913, 41913, 63852, 0, 0, 42348, 0,
+ 0, 983686, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518,
+ 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983212, 0, 73847, 78761,
+ 65172, 41728, 41721, 0, 0, 0, 41203, 917612, 13110, 41726, 983846, 0,
+ 1000, 69651, 0, 41140, 1209, 73978, 0, 73750, 1073, 6321, 77878, 41138,
+ 0, 68213, 0, 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237,
+ 78787, 66314, 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0,
+ 64398, 0, 119970, 12311, 983718, 78796, 78798, 78794, 78795, 68434,
+ 78793, 66670, 0, 0, 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131,
+ 0, 9627, 78536, 78542, 78535, 983210, 1944, 1248, 10148, 127755, 119990,
+ 119991, 12701, 78376, 11308, 119995, 0, 119997, 119998, 65305, 65100,
+ 4031, 42794, 120003, 7075, 8154, 119985, 120007, 41817, 73934, 42275,
+ 120011, 120012, 78526, 120014, 120015, 6041, 0, 41899, 0, 8002, 0, 4364,
+ 0, 0, 64332, 0, 7813, 9064, 119986, 10124, 7526, 8601, 7281, 78455, 7279,
+ 12041, 1418, 10885, 12673, 0, 0, 9660, 983272, 13012, 4571, 0, 0, 120164,
+ 12078, 2970, 0, 10933, 0, 77870, 0, 127015, 0, 41599, 0, 128831, 0,
+ 12950, 92160, 3486, 0, 78311, 4239, 0, 127799, 66511, 0, 2637, 64629,
+ 8460, 127053, 8476, 983966, 0, 0, 0, 65673, 1019, 78495, 4148, 0, 12289,
+ 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983201, 41734,
+ 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120, 41736, 92546,
+ 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, 127284, 0, 73963,
+ 41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272, 7115, 66030,
+ 73932, 5498, 73942, 41536, 0, 68204, 92587, 3459, 8997, 0, 0, 0, 0,
+ 92512, 0, 66377, 69781, 0, 983690, 78511, 3161, 295, 120207, 0, 92223,
+ 127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0, 70063, 2952,
+ 78765, 11038, 10901, 63900, 63899, 63898, 94043, 667, 12332, 63887, 6086,
+ 41722, 0, 5172, 0, 0, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198, 8555,
+ 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0, 41723,
+ 63875, 63874, 11460, 7432, 1913, 41913, 63852, 126636, 0, 42348, 73892,
6752, 446, 41911, 127906, 63851, 63850, 41910, 0, 63846, 2972, 12932,
7262, 0, 63849, 63848, 63847, 128070, 6570, 8302, 7259, 63842, 4178,
10746, 7250, 13214, 10041, 8105, 63892, 0, 118983, 1105, 4180, 0, 12094,
9497, 0, 63891, 63890, 63889, 63888, 5538, 9987, 0, 118932, 1678, 13274,
552, 120654, 44010, 10785, 0, 119170, 4557, 74459, 9159, 10171, 13125,
63860, 5540, 63858, 63865, 281, 13242, 63862, 74154, 0, 5536, 65568,
- 63857, 1388, 74169, 0, 1077, 0, 65099, 11531, 5834, 0, 0, 0, 0, 42773, 0,
- 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, 0, 5334, 65081, 43249,
- 74778, 127968, 11077, 0, 6509, 0, 5327, 0, 19907, 63869, 3478, 7583,
- 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, 1915, 4846, 0,
- 66371, 118984, 42105, 2990, 120128, 805, 69238, 64438, 12070, 8760, 1117,
- 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, 78240, 12225,
- 63838, 63837, 0, 0, 63833, 6042, 66360, 8083, 0, 0, 63821, 63820, 63819,
- 63818, 0, 5227, 9047, 63822, 127162, 6091, 0, 10691, 560, 5643, 8226,
- 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, 63813, 6047,
- 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, 1093,
- 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605, 77934, 9806, 43472,
- 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, 4618, 42209,
- 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, 1084, 1085,
- 63829, 1083, 10131, 7283, 0, 63970, 128358, 1092, 4754, 7273, 5252,
- 44016, 43627, 127921, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089,
- 4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0, 74494, 12463,
- 2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938, 74343, 0, 0, 660,
- 10127, 666, 9022, 5532, 43667, 5533, 77941, 78507, 6118, 222, 979, 3884,
- 0, 74151, 92652, 6502, 0, 127118, 128695, 63951, 12465, 0, 0, 128782,
- 63946, 1707, 63924, 12461, 63950, 63897, 63948, 63947, 63945, 6038,
- 63943, 63942, 64685, 63895, 65838, 0, 7776, 0, 0, 127773, 120444, 69730,
- 801, 43165, 1690, 63919, 63918, 63917, 13277, 43659, 12951, 120638, 9906,
- 2054, 2334, 78515, 63916, 5483, 63914, 69737, 63911, 5484, 63909, 63908,
- 2539, 0, 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0,
- 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0, 128816, 0, 10474,
- 43426, 13257, 42354, 0, 0, 0, 195065, 0, 8413, 0, 0, 5693, 7272, 0,
- 13209, 64470, 65831, 78460, 195063, 0, 0, 0, 0, 0, 0, 0, 128133, 127767,
- 66608, 3111, 41863, 8804, 42913, 92187, 7270, 0, 66606, 6628, 1076, 7433,
- 1436, 73844, 55226, 128353, 63982, 7393, 12807, 43413, 63906, 1598,
- 63904, 0, 0, 41729, 4423, 1307, 0, 10515, 41589, 128698, 0, 6218, 0,
- 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, 74032, 11549, 10735,
- 41743, 73937, 6801, 0, 4518, 10990, 65073, 5167, 4481, 3771, 0, 2710, 0,
- 69243, 41724, 0, 43073, 41690, 12479, 0, 0, 0, 0, 119659, 1628, 127149,
- 0, 0, 65262, 6333, 10783, 42315, 0, 63855, 120683, 0, 0, 5339, 74323, 0,
- 13004, 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, 68464,
- 12633, 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, 74251, 0,
- 120647, 0, 50, 10558, 9871, 0, 43655, 0, 0, 0, 66468, 0, 13259, 4448, 0,
- 0, 0, 0, 67853, 0, 10640, 11539, 1151, 0, 917607, 127544, 127079, 195050,
- 127852, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, 11538, 8673,
- 12650, 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0, 0, 0, 4636,
- 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284, 12277, 194627,
- 11995, 92553, 0, 12158, 0, 8741, 10197, 0, 92426, 0, 6531, 0, 127846,
- 473, 43415, 0, 0, 1873, 1087, 0, 0, 0, 78527, 66439, 43218, 0, 194716,
- 7237, 12504, 74282, 0, 0, 0, 9489, 0, 0, 4384, 74220, 195055, 2058,
- 128863, 13295, 43191, 128030, 0, 1154, 3857, 1205, 0, 0, 13100, 12958,
- 120706, 74168, 0, 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0,
- 6347, 0, 7654, 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290,
- 119180, 4997, 64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0,
- 8044, 74834, 194643, 41789, 128142, 10809, 0, 0, 0, 1779, 6600, 6601,
- 41543, 5325, 642, 64187, 13058, 120449, 12875, 0, 92186, 13229, 0, 10575,
- 43399, 0, 0, 41791, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428,
- 6569, 0, 0, 0, 0, 6783, 0, 12993, 8049, 41548, 44021, 6458, 0, 128882,
- 4761, 63828, 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313,
- 6322, 10483, 0, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0,
- 8503, 5122, 41527, 0, 66320, 0, 0, 0, 0, 41537, 69683, 8303, 8282, 11817,
- 73857, 10003, 73859, 65904, 194663, 1686, 0, 78406, 11467, 3664, 65921,
- 64299, 194664, 0, 0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744,
- 194636, 74277, 74302, 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0,
- 0, 4762, 1103, 0, 0, 4765, 0, 13078, 0, 4760, 63827, 2050, 10871, 43199,
- 1102, 0, 42236, 128867, 194667, 11546, 74794, 337, 0, 42591, 8627, 12279,
- 1111, 0, 92161, 4707, 68206, 10143, 7883, 127081, 7880, 4522, 8645, 5704,
- 13010, 0, 8304, 917561, 0, 119575, 0, 0, 66654, 0, 92676, 0, 13008, 0,
- 4385, 0, 13011, 0, 92569, 119161, 13009, 160, 2677, 0, 0, 41793, 65763,
- 74221, 120141, 41792, 42770, 0, 65762, 118829, 43821, 5709, 0, 127177,
- 43816, 0, 0, 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, 5705, 8791,
- 4005, 0, 10237, 10991, 0, 43459, 9173, 917581, 917580, 13170, 12540,
- 917577, 42605, 120765, 917570, 68647, 917572, 10058, 0, 74867, 194654,
- 127078, 3339, 11448, 1106, 917591, 917590, 917593, 3340, 917587, 917586,
- 917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, 92226, 13246,
- 864, 0, 118926, 8972, 0, 7849, 120092, 92533, 13240, 195068, 5192, 4338,
- 0, 10948, 917601, 13199, 92575, 1236, 13208, 13261, 13189, 13188, 120164,
- 0, 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780,
- 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 0, 92168, 0, 917858,
- 11354, 0, 0, 42795, 0, 119195, 11394, 194646, 13236, 13272, 13194, 1334,
- 0, 4479, 1178, 65586, 120663, 66681, 119193, 4601, 0, 0, 0, 0, 0, 194658,
- 0, 6809, 63786, 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153,
- 754, 10192, 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 0,
- 0, 41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757,
- 43145, 12217, 63754, 41532, 1349, 63750, 63749, 0, 0, 0, 63753, 63802,
- 41084, 120622, 68133, 41930, 63805, 63804, 43632, 63801, 41082, 8140,
- 63798, 6260, 0, 0, 119225, 63793, 11988, 3898, 128241, 10201, 12238,
- 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945,
- 0, 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, 0,
- 0, 63769, 9530, 0, 12232, 13135, 8596, 5681, 63762, 4595, 63760, 792, 0,
- 64803, 0, 8742, 0, 11053, 128796, 63744, 128107, 0, 7588, 63748, 1693,
- 63746, 43204, 5055, 68426, 917853, 1090, 120679, 128356, 11665, 74133,
- 4558, 65685, 9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, 63773,
- 13191, 12170, 3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, 64433,
- 0, 0, 941, 0, 0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 0, 0, 92455,
- 7386, 0, 64444, 0, 119863, 43603, 0, 65397, 288, 0, 0, 0, 10025, 917916,
- 2918, 0, 65300, 119871, 9883, 64726, 2790, 65395, 3793, 0, 127829, 65393,
- 0, 74138, 0, 0, 0, 74139, 92712, 65394, 11548, 5270, 0, 65396, 0, 65813,
- 13256, 1282, 120771, 0, 0, 10888, 0, 65242, 0, 3330, 0, 0, 0, 0, 0,
- 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794,
- 0, 43094, 0, 43650, 0, 0, 9035, 0, 0, 128005, 0, 92207, 68125, 0, 164, 0,
- 0, 0, 6958, 0, 43116, 0, 0, 13245, 0, 0, 127376, 0, 73893, 127756, 12666,
- 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0, 65509, 0, 7449,
- 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0, 65195, 10164,
- 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882, 13275, 128161,
- 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, 12229, 41523, 0,
- 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, 64958, 0, 0, 73989,
- 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, 4796, 12292, 0,
- 65479, 0, 41781, 10486, 41480, 43002, 9899, 0, 0, 404, 12821, 3741, 0,
- 5788, 8092, 68212, 41222, 1831, 66020, 3982, 0, 4388, 0, 746, 120784, 0,
- 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, 119357, 0, 74430,
- 0, 11700, 4374, 0, 128179, 1364, 0, 8038, 0, 917597, 12868, 69814, 0,
- 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, 7841, 0,
- 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 12617, 64172, 13173, 4372,
- 119354, 0, 0, 0, 0, 92402, 128062, 12965, 384, 64512, 10404, 10340,
- 119352, 1556, 5274, 13210, 120125, 10017, 9733, 41787, 0, 126994, 41373,
- 78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703,
- 119883, 12861, 4398, 8543, 65618, 128018, 1096, 0, 0, 42688, 12441,
- 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 0,
- 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, 0,
- 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 128123,
- 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, 73849, 0, 43638, 78537,
- 128287, 6261, 119342, 43147, 66570, 1957, 10420, 982, 2756, 13292, 13206,
- 128828, 0, 2925, 73809, 13056, 127559, 13212, 43238, 0, 13190, 13187,
- 92541, 13198, 118793, 0, 5242, 119179, 64476, 1694, 8216, 0, 6770, 43331,
- 0, 65620, 0, 43544, 0, 0, 41444, 65621, 120325, 9197, 5246, 119106,
- 13185, 9709, 120323, 120322, 12314, 65616, 5238, 119333, 0, 119337, 5236,
- 40979, 0, 74201, 8286, 0, 3936, 119331, 11699, 41347, 127249, 13235,
- 8842, 41248, 0, 4379, 13239, 12692, 7969, 127266, 7219, 127250, 0,
- 120509, 0, 66224, 734, 2979, 120303, 65619, 9872, 957, 64921, 1846,
- 66631, 41477, 119256, 120310, 74511, 41770, 1670, 6442, 120317, 42446,
- 5379, 120318, 41163, 74832, 120315, 120314, 128025, 0, 42841, 13267, 0,
- 0, 41775, 0, 7130, 41773, 0, 10663, 0, 0, 0, 6151, 12110, 42673, 65572,
- 65293, 65250, 13265, 13264, 64518, 0, 6100, 0, 92647, 5808, 65922, 0,
- 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, 128524, 11965, 0, 68358, 0,
- 69789, 0, 92260, 68102, 9698, 7814, 74476, 119651, 128514, 0, 41921,
- 118858, 9756, 6985, 119258, 78490, 74219, 0, 0, 118997, 8012, 5674,
- 12353, 0, 12361, 5677, 5588, 0, 41925, 128124, 41920, 5673, 120534, 5676,
- 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, 1727, 120725,
- 42436, 0, 0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826,
- 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0,
- 119592, 5793, 0, 5866, 5797, 41011, 5865, 120091, 7956, 598, 0, 64649,
- 5806, 42398, 0, 9037, 5671, 120041, 0, 0, 0, 128855, 0, 847, 128242,
- 9529, 0, 66657, 6980, 0, 120035, 78484, 0, 0, 120033, 78486, 0, 0,
- 120039, 42683, 0, 0, 7114, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0,
- 5651, 2929, 6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546,
- 69727, 68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 0, 41013,
- 10568, 0, 0, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0,
+ 63857, 1388, 74169, 0, 1077, 983577, 65099, 11531, 5834, 0, 0, 0, 0,
+ 42773, 0, 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, 0, 5334, 65081,
+ 43249, 74778, 127968, 11077, 0, 6509, 0, 5327, 0, 19907, 63869, 3478,
+ 7583, 7679, 2903, 0, 3001, 1158, 8745, 43746, 73748, 63866, 78626, 1915,
+ 4846, 0, 66371, 118984, 42105, 2990, 120128, 805, 69238, 64438, 12070,
+ 8760, 1117, 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, 78240,
+ 12225, 63838, 63837, 983844, 983795, 63833, 6042, 66360, 8083, 0, 0,
+ 63821, 63820, 63819, 63818, 983895, 5227, 9047, 63822, 127162, 6091, 0,
+ 10691, 560, 5643, 8226, 119578, 63812, 63811, 63810, 63809, 2289, 63815,
+ 63814, 63813, 6047, 1597, 120143, 780, 206, 77925, 4936, 65147, 8168,
+ 63930, 2076, 1093, 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605,
+ 77934, 9806, 43472, 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287,
+ 0, 4618, 42209, 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268,
+ 1084, 1085, 63829, 1083, 10131, 7283, 0, 63970, 128358, 1092, 4754, 7273,
+ 5252, 44016, 43627, 127921, 0, 7408, 11809, 917618, 0, 0, 2965, 7258,
+ 8808, 0, 1089, 4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0,
+ 74494, 12463, 2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938,
+ 74343, 0, 0, 660, 10127, 666, 9022, 5532, 43667, 5533, 77941, 78507,
+ 6118, 222, 979, 3884, 0, 74151, 92652, 6502, 0, 127118, 128695, 63951,
+ 12465, 0, 0, 128782, 63946, 1707, 63924, 12461, 63950, 63897, 63948,
+ 63947, 63945, 6038, 63943, 63942, 64685, 63895, 65838, 2276, 7776, 94076,
+ 0, 127773, 120444, 69730, 801, 43165, 1690, 63919, 63918, 63917, 13277,
+ 43659, 12951, 120638, 9906, 2054, 2334, 78515, 63916, 5483, 63914, 69737,
+ 63911, 5484, 63909, 63908, 2539, 0, 43980, 5485, 0, 42697, 9061, 5534,
+ 10672, 4502, 0, 253, 0, 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0,
+ 118907, 0, 10474, 43426, 13257, 42354, 128099, 983689, 70044, 195065, 0,
+ 8413, 983807, 0, 5693, 7272, 0, 13209, 64470, 65831, 74350, 195063, 0, 0,
+ 0, 126639, 0, 0, 94078, 128133, 127767, 66608, 3111, 41863, 8804, 42913,
+ 92187, 7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, 55226, 128353,
+ 63982, 7393, 12807, 43413, 63906, 1598, 63904, 0, 0, 41729, 4423, 1307,
+ 0, 10515, 41589, 128698, 0, 6218, 0, 1430, 0, 0, 120606, 78754, 5413,
+ 7619, 3255, 3493, 74032, 11549, 10735, 41743, 73937, 6801, 983624, 4518,
+ 10990, 65073, 5167, 4481, 3771, 120158, 2710, 0, 69243, 41724, 0, 43073,
+ 41690, 12479, 983626, 0, 0, 983809, 70046, 1628, 127149, 983479, 983722,
+ 65262, 6333, 10783, 42315, 0, 63855, 94056, 0, 0, 5339, 74323, 0, 13004,
+ 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, 68464, 12633,
+ 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, 74251, 0, 120647,
+ 0, 50, 10558, 9871, 42612, 43655, 0, 0, 0, 66468, 0, 13259, 4448, 0,
+ 983836, 0, 70043, 67853, 0, 10640, 11539, 1151, 0, 917607, 127544,
+ 127079, 195050, 127852, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0,
+ 11538, 8673, 12650, 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0,
+ 0, 0, 4636, 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284,
+ 12277, 194627, 11995, 92553, 0, 12158, 0, 8741, 10197, 0, 92426, 0, 6531,
+ 0, 127846, 473, 43415, 0, 983641, 1873, 1087, 0, 0, 0, 78527, 66439,
+ 43218, 983123, 194716, 7237, 12504, 74282, 0, 983571, 0, 9489, 0, 0,
+ 4384, 74220, 63845, 2058, 128863, 13295, 43191, 128030, 0, 1154, 3857,
+ 1205, 0, 0, 13100, 12958, 120706, 74168, 0, 0, 4421, 10592, 0, 495,
+ 119007, 41712, 7983, 0, 93997, 0, 6347, 120165, 7654, 41710, 4196, 0,
+ 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, 64306, 0, 0, 4999,
+ 194642, 0, 126582, 4711, 120769, 0, 2739, 0, 8044, 74834, 194643, 41789,
+ 128142, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, 642, 64187, 13058,
+ 120449, 12875, 0, 92186, 13229, 0, 10575, 43399, 0, 0, 41791, 1104, 0, 0,
+ 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, 69849, 6783, 0,
+ 12993, 8049, 41548, 44021, 6458, 983798, 128882, 4761, 63828, 4766,
+ 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, 983603,
+ 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, 5122, 41527,
+ 0, 66320, 983802, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, 73857, 10003,
+ 73859, 65904, 7363, 1686, 0, 78406, 11467, 3664, 65921, 64299, 194664, 0,
+ 0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744, 194636, 74277, 74302,
+ 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, 0, 4762, 1103, 0, 0,
+ 4765, 983484, 13078, 0, 4760, 63827, 2050, 10871, 43199, 1102, 0, 42236,
+ 128867, 194667, 11546, 74794, 337, 0, 42591, 8627, 12279, 1111, 0, 92161,
+ 4707, 68206, 10143, 7883, 127081, 7880, 4522, 8645, 5704, 13010, 0, 8304,
+ 917561, 0, 119575, 2293, 0, 66654, 0, 92676, 0, 13008, 0, 4385, 0, 13011,
+ 0, 92569, 119161, 13009, 160, 2677, 0, 0, 41793, 65763, 74221, 120141,
+ 41792, 42770, 94054, 65762, 118829, 43821, 5709, 0, 94053, 43816, 0, 0,
+ 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, 5705, 8791, 4005, 0, 10237,
+ 10991, 128816, 43459, 9173, 917581, 917580, 13170, 12540, 917577, 42605,
+ 120765, 126617, 68647, 917572, 10058, 0, 74867, 194654, 127078, 3339,
+ 11448, 1106, 917591, 917590, 917593, 3340, 917587, 917586, 917589,
+ 917588, 120541, 10605, 1309, 63966, 120743, 1754, 92226, 13246, 864, 0,
+ 118926, 8972, 0, 7849, 120092, 92533, 13240, 195068, 5192, 4338, 67982,
+ 10948, 917601, 13199, 92575, 1236, 13208, 13261, 13189, 13188, 93993, 0,
+ 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780,
+ 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 983906, 92168,
+ 983763, 917858, 11354, 94071, 0, 42795, 0, 119195, 11394, 194646, 13236,
+ 13272, 13194, 1334, 69926, 4479, 1178, 65586, 120663, 66681, 119193,
+ 4601, 0, 0, 983756, 0, 0, 194658, 0, 6809, 63786, 6031, 0, 63791, 63790,
+ 1145, 63788, 7910, 63785, 43153, 754, 10192, 13105, 8183, 120741, 2037,
+ 0, 0, 10747, 125, 0, 64890, 0, 983131, 0, 41719, 63758, 3523, 1074,
+ 13258, 9536, 74077, 0, 4427, 74242, 63757, 43145, 12217, 63754, 41532,
+ 1349, 63750, 63749, 0, 0, 0, 63753, 63802, 41084, 120622, 68133, 41930,
+ 63805, 63804, 43632, 63801, 41082, 8140, 63798, 6260, 0, 0, 94074, 63793,
+ 11988, 3898, 128241, 10201, 12238, 63795, 42194, 10367, 12521, 10431,
+ 42114, 41932, 1068, 0, 12523, 12945, 983321, 42203, 7950, 10804, 63771,
+ 42787, 4386, 12224, 6973, 2793, 12475, 0, 0, 63769, 9530, 983119, 12232,
+ 13135, 8596, 5681, 63762, 4595, 63760, 792, 0, 64803, 0, 8742, 0, 11053,
+ 128796, 63744, 128107, 0, 7588, 63748, 1693, 63746, 43204, 5055, 68426,
+ 917853, 1090, 120679, 128356, 11665, 74133, 4558, 65685, 9523, 0, 0,
+ 78681, 11513, 0, 6157, 63775, 63774, 63773, 13191, 12170, 3500, 3139, 0,
+ 3170, 12485, 0, 10872, 78271, 13006, 64433, 0, 0, 941, 0, 0, 0, 65541,
+ 11063, 0, 8228, 0, 42065, 0, 0, 94039, 0, 92455, 7386, 0, 64444, 0,
+ 119863, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 69915, 2918, 0, 65300,
+ 119871, 9883, 64726, 2790, 65395, 3793, 0, 127829, 65393, 0, 74138, 0, 0,
+ 0, 74139, 92712, 65394, 11548, 5270, 0, 65396, 0, 65813, 13256, 1282,
+ 120771, 0, 0, 10888, 983604, 65242, 0, 3330, 0, 0, 983965, 0, 0, 74259,
+ 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, 0,
+ 43094, 70023, 43650, 94037, 0, 9035, 0, 0, 128005, 0, 92207, 68125, 0,
+ 164, 0, 94067, 94000, 6958, 0, 43116, 0, 70019, 13245, 0, 0, 127376, 0,
+ 70031, 127756, 12666, 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0,
+ 65509, 0, 7449, 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0,
+ 65195, 10164, 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882,
+ 13275, 128161, 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0,
+ 12229, 41523, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932,
+ 64958, 0, 0, 73989, 68192, 0, 69847, 369, 0, 41784, 0, 64163, 0, 0, 0,
+ 65474, 4796, 12292, 126595, 65479, 0, 41781, 10486, 41480, 43002, 9899,
+ 0, 0, 404, 12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 3982,
+ 0, 4388, 0, 746, 120784, 0, 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708,
+ 3799, 74292, 119357, 0, 74430, 0, 11700, 4374, 0, 128179, 1364, 0, 8038,
+ 0, 917597, 12868, 69814, 0, 6735, 73979, 13174, 73968, 13225, 0, 69808,
+ 65835, 0, 2365, 7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785,
+ 12617, 64172, 13173, 4372, 119354, 0, 983568, 0, 0, 92402, 128062, 12965,
+ 384, 64512, 10404, 10340, 119352, 1556, 5274, 13210, 120125, 10017, 9733,
+ 41787, 983237, 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863,
+ 41371, 11656, 0, 120703, 119883, 12861, 4398, 8543, 65618, 128018, 1096,
+ 0, 0, 42688, 12441, 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243,
+ 13237, 12719, 126646, 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864,
+ 0, 120785, 119874, 94107, 13195, 41452, 64961, 7722, 0, 10459, 119878, 0,
+ 119879, 66590, 128123, 41533, 66337, 0, 92184, 0, 4965, 43445, 917536,
+ 73849, 0, 43638, 78537, 128287, 6261, 119342, 43147, 66570, 1957, 10420,
+ 982, 2756, 13292, 13206, 128828, 0, 2925, 73809, 13056, 127559, 13212,
+ 43238, 0, 13190, 13187, 92541, 13198, 118793, 0, 5242, 119179, 64476,
+ 1694, 8216, 71369, 6770, 43331, 0, 65620, 983719, 43544, 126466, 0,
+ 41444, 65621, 69955, 9197, 5246, 119106, 13185, 9709, 120323, 120322,
+ 12314, 65616, 5238, 119333, 0, 119337, 5236, 40979, 0, 74201, 8286,
+ 128537, 3936, 119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379,
+ 13239, 12692, 7969, 127266, 7219, 127250, 128251, 120509, 0, 66224, 734,
+ 2979, 120303, 65619, 9872, 957, 64921, 1846, 66631, 41477, 119256,
+ 120310, 74511, 41770, 1670, 6442, 120317, 42446, 5379, 120318, 41163,
+ 74832, 120315, 120314, 11506, 0, 42841, 13267, 0, 0, 41775, 0, 7130,
+ 41773, 0, 10663, 0, 0, 0, 6151, 12110, 42673, 65572, 65293, 65250, 13265,
+ 13264, 64518, 0, 6100, 0, 92647, 5808, 65922, 0, 12967, 66041, 5612,
+ 4583, 0, 0, 68097, 64575, 126637, 11965, 0, 68358, 0, 69789, 0, 92260,
+ 68102, 9698, 7814, 74476, 119651, 128514, 0, 41921, 118858, 9756, 6985,
+ 119258, 78490, 74219, 0, 0, 118997, 8012, 5674, 12353, 0, 12361, 5677,
+ 5588, 0, 41925, 128124, 41920, 5673, 120534, 5676, 41923, 12694, 118978,
+ 5672, 1294, 0, 78059, 0, 42511, 1727, 120725, 42436, 0, 0, 0, 74222,
+ 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826, 55232, 5813, 0, 120712,
+ 5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0, 119592, 5793, 0, 5866,
+ 5797, 41011, 5865, 120091, 7956, 598, 0, 64649, 5806, 42398, 0, 9037,
+ 5671, 120041, 0, 0, 0, 128855, 0, 847, 128242, 9529, 0, 66657, 6980,
+ 78483, 120035, 78484, 983483, 0, 120033, 78486, 0, 0, 120039, 42683, 0,
+ 983055, 7114, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929,
+ 6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69727,
+ 68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 94100, 41013,
+ 10568, 0, 983618, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0,
42608, 78469, 9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908,
1609, 902, 0, 63936, 128875, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028,
- 2554, 5158, 5714, 127015, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553,
- 0, 42155, 0, 41356, 74110, 118801, 0, 0, 8676, 0, 0, 11066, 451, 63941,
- 5798, 9349, 42018, 127858, 0, 0, 43609, 5906, 120553, 1440, 0, 128853,
- 120016, 74283, 11005, 0, 66656, 66044, 0, 194698, 0, 0, 43393, 10094, 0,
- 11529, 10857, 120643, 66436, 6546, 93, 8102, 0, 68405, 0, 0, 8171, 0,
- 119097, 127064, 917543, 383, 7154, 41656, 92634, 0, 0, 5187, 0, 127277,
- 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 0, 8292, 195074,
- 4980, 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, 10631, 66031,
- 7972, 0, 78785, 0, 7900, 0, 11309, 78319, 4198, 42725, 0, 67656, 9995, 0,
- 92552, 0, 12931, 0, 42684, 74285, 2088, 0, 64366, 65156, 8814, 42238,
- 74771, 0, 0, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0,
- 65865, 0, 194650, 127144, 0, 9342, 120464, 0, 64516, 0, 78792, 10129,
- 41007, 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, 40992, 92264,
- 127153, 68653, 43558, 5522, 0, 61, 0, 74105, 3633, 0, 65162, 41234,
- 12089, 78281, 9771, 0, 13251, 128701, 0, 6262, 2784, 42743, 0, 8126,
- 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, 43266, 7108, 194779,
- 10890, 74481, 65834, 8324, 119103, 64417, 74817, 127465, 64737, 0, 0,
- 8930, 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0,
- 0, 77904, 92640, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, 10338,
- 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, 43064, 41025, 911, 7539,
- 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0,
- 12326, 0, 0, 42808, 128337, 9348, 64901, 0, 0, 0, 0, 0, 0, 917584, 43702,
- 0, 5857, 65342, 92727, 119120, 120079, 8644, 0, 0, 0, 74296, 41909, 0,
- 120332, 2791, 69663, 1891, 69824, 0, 41907, 66647, 118939, 8761, 12942,
- 5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 127185,
- 63931, 0, 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, 0, 0, 0, 73860,
- 0, 0, 64345, 0, 9201, 128314, 194940, 0, 0, 43679, 917585, 65117, 92270,
- 0, 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783,
- 194935, 0, 0, 0, 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933,
- 74250, 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 0, 9839,
- 0, 12891, 0, 0, 63999, 2016, 41917, 9788, 63928, 0, 1862, 65800, 9155,
- 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0, 66017, 4508, 64883,
- 92456, 92522, 127814, 0, 64592, 74276, 120080, 6784, 78788, 68181, 0, 0,
- 0, 127534, 12147, 9024, 66378, 66472, 0, 64289, 65289, 78151, 66658,
- 194929, 64509, 78152, 0, 0, 11051, 0, 0, 11355, 65885, 0, 128310, 41214,
- 0, 12299, 0, 7500, 4506, 7773, 0, 0, 9963, 68649, 0, 4040, 120570, 6167,
- 0, 63922, 6594, 0, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988,
- 41955, 0, 63993, 10440, 9611, 0, 6803, 0, 7738, 63986, 11446, 63984,
- 92641, 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748,
- 42742, 9517, 11518, 0, 78790, 0, 194777, 63956, 42458, 63954, 63953,
- 63960, 9591, 4516, 10217, 68370, 11469, 69697, 42306, 2723, 118947, 0, 0,
- 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, 4270, 0,
- 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0,
- 0, 0, 415, 63964, 63963, 42345, 0, 5183, 1877, 42498, 0, 2927, 0, 63961,
- 4472, 0, 0, 78159, 69699, 917936, 42340, 4756, 128078, 7081, 10730, 7691,
- 10331, 63830, 119625, 194945, 42103, 8628, 9813, 0, 42453, 1604, 9565,
- 10539, 69701, 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992,
- 0, 0, 63980, 11801, 3622, 0, 64336, 12017, 10463, 63981, 4967, 64189,
- 1966, 43628, 0, 0, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973,
- 402, 0, 13147, 0, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, 0,
- 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0,
- 92359, 64942, 0, 194733, 0, 194732, 0, 74301, 0, 11280, 0, 69784, 74060,
- 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379, 194669, 7402,
- 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 0, 0, 5405, 127875,
- 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, 64690, 3254, 0, 0,
- 0, 42390, 43678, 194725, 0, 65077, 0, 6388, 3355, 9508, 9867, 5723,
- 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, 0, 42691, 917886, 127198,
- 74767, 0, 127075, 1379, 246, 0, 0, 3788, 0, 11041, 92549, 66304, 0, 0,
- 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, 65214, 119242, 42567,
- 92217, 13163, 0, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755,
- 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483,
- 74510, 0, 74485, 42442, 65470, 0, 64202, 13160, 7759, 42482, 485, 128006,
- 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0,
- 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, 120633, 43539, 5411,
- 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, 10643,
- 55271, 0, 12166, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, 74310,
+ 2554, 5158, 5714, 2213, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, 0,
+ 42155, 0, 41356, 74110, 118801, 126614, 0, 8676, 983283, 0, 5582, 451,
+ 63941, 5798, 9349, 42018, 127858, 0, 0, 43609, 5906, 120553, 1440, 0,
+ 128853, 120016, 74283, 11005, 0, 66656, 66044, 0, 194698, 0, 0, 43393,
+ 10094, 0, 11529, 10857, 120643, 66436, 6546, 93, 8102, 0, 68405, 0, 0,
+ 8171, 0, 119097, 127064, 917543, 383, 7154, 41656, 92634, 94040, 0, 5187,
+ 71296, 127277, 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0,
+ 983818, 8292, 195074, 4980, 8860, 73947, 10028, 65291, 7076, 13182,
+ 194705, 0, 0, 10631, 66031, 7972, 0, 78785, 0, 7900, 0, 11309, 3806,
+ 4198, 42725, 0, 67656, 9995, 0, 92552, 0, 12931, 0, 42684, 74285, 2088,
+ 64213, 64366, 65156, 8814, 42238, 74771, 0, 0, 12836, 0, 0, 74342, 8593,
+ 0, 0, 68445, 13255, 0, 0, 7464, 0, 65865, 0, 194650, 127144, 0, 9342,
+ 120464, 0, 64516, 0, 78792, 10129, 41007, 74375, 0, 40995, 12209, 41012,
+ 119136, 0, 0, 69724, 40992, 92264, 127153, 68653, 43558, 5522, 0, 61, 0,
+ 74105, 3633, 983891, 65162, 41234, 12089, 78281, 9771, 983896, 13251,
+ 128701, 0, 6262, 2784, 42743, 0, 8126, 66483, 0, 0, 441, 42621, 0, 0,
+ 41002, 40999, 119623, 43266, 7108, 194779, 10890, 74481, 65834, 8324,
+ 119103, 64417, 74817, 127465, 64737, 0, 983650, 8930, 66678, 74249, 1193,
+ 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0, 0, 77904, 92640, 77905,
+ 9034, 6039, 0, 10075, 0, 41018, 65683, 10338, 66469, 0, 0, 0, 42815, 0,
+ 41966, 0, 127471, 0, 11792, 43064, 41025, 911, 7539, 0, 0, 120339, 65159,
+ 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, 12326, 983847, 0, 42808,
+ 128337, 9348, 64901, 983852, 0, 0, 0, 0, 0, 917584, 43702, 983576, 5857,
+ 65342, 92727, 119120, 120079, 8644, 0, 0, 0, 74296, 41909, 0, 120332,
+ 2791, 69663, 1891, 69824, 0, 41907, 66647, 118939, 8761, 12942, 5748, 0,
+ 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 127185, 63931, 0,
+ 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, 0, 983651, 0, 73860, 0, 0,
+ 64345, 0, 9201, 128314, 194940, 0, 0, 43679, 917585, 65117, 92270, 0,
+ 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783,
+ 194935, 0, 0, 983064, 194720, 65056, 3620, 41180, 68378, 4556, 0, 0,
+ 194933, 74250, 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902,
+ 93958, 9839, 0, 12891, 983746, 983627, 63999, 2016, 41917, 9788, 63928,
+ 0, 1862, 65800, 9155, 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0,
+ 66017, 4508, 64883, 92456, 92522, 127814, 0, 64592, 74276, 120080, 6784,
+ 78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, 66472, 983920, 64289,
+ 65289, 78151, 66658, 194929, 64509, 78152, 0, 126505, 11051, 983288, 0,
+ 11355, 65885, 0, 128310, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0,
+ 9963, 68649, 126609, 4040, 120570, 6167, 0, 63922, 6594, 983731, 0, 0,
+ 3624, 43036, 0, 6387, 63990, 19947, 63988, 41955, 0, 63993, 10440, 9611,
+ 65605, 6803, 0, 7738, 63986, 11446, 63984, 92641, 3435, 78164, 43814,
+ 43810, 7029, 64258, 41292, 118898, 12748, 42742, 9517, 11518, 0, 78790,
+ 0, 67993, 63956, 42458, 63954, 63953, 63960, 9591, 4516, 10217, 68370,
+ 11469, 69697, 42306, 2723, 118947, 0, 0, 0, 0, 0, 11397, 2880, 0, 0,
+ 2872, 0, 0, 3498, 4378, 917539, 4270, 0, 65551, 68205, 6633, 43387, 0,
+ 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0, 0, 126479, 415, 63964, 63963,
+ 42345, 92310, 5183, 1877, 42498, 0, 2927, 0, 63961, 4472, 0, 0, 78159,
+ 69699, 917936, 42340, 4756, 128078, 7081, 10730, 7691, 10331, 63830,
+ 119625, 42922, 42103, 8628, 9813, 0, 42453, 1604, 9565, 10539, 69701,
+ 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, 0, 0, 63980,
+ 11801, 3622, 983124, 64336, 12017, 10463, 63981, 4967, 64189, 1966,
+ 43628, 0, 983284, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973,
+ 402, 0, 13147, 128692, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805,
+ 0, 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0,
+ 92359, 64942, 983559, 194733, 983677, 194732, 0, 74301, 0, 11280, 0,
+ 69784, 74060, 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379,
+ 194669, 7402, 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 983910, 0,
+ 5405, 127875, 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723,
+ 64690, 3254, 0, 0, 128207, 42390, 43678, 194725, 983900, 65077, 0, 6388,
+ 3355, 9508, 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0,
+ 983753, 42691, 917886, 127198, 74767, 0, 127075, 1379, 246, 0, 983752,
+ 3788, 983106, 11041, 92549, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0,
+ 983688, 10656, 0, 65214, 119242, 42567, 92217, 13163, 983202, 120831,
+ 74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755, 74244, 194621, 11443, 0,
+ 66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483, 74510, 0, 74485,
+ 42442, 65470, 983898, 64202, 13160, 7759, 42482, 485, 128006, 0, 9828, 0,
+ 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0, 119631,
+ 11002, 42470, 0, 118946, 0, 0, 74041, 0, 70045, 43539, 5411, 42196, 0, 0,
+ 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, 10643, 55271,
+ 983179, 12166, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, 74310,
6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, 92560, 2713, 0, 9650, 43330,
0, 194675, 1406, 0, 0, 92659, 0, 68223, 4143, 194677, 0, 65748, 4141,
9682, 65287, 1508, 127013, 8779, 10569, 8725, 13299, 66638, 65750, 42263,
4145, 6380, 65751, 66613, 43994, 65738, 55250, 9185, 9550, 0, 43403, 0,
- 0, 0, 65736, 41951, 64816, 65756, 0, 12955, 10596, 2888, 0, 0, 0, 9657,
- 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 43552, 7501, 6328, 0,
- 10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986, 0, 10632,
- 11934, 11452, 1332, 0, 0, 0, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0,
- 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512, 7289, 74055, 0, 8854,
- 64162, 5858, 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868,
- 128813, 13158, 92166, 7211, 0, 9371, 73973, 0, 6828, 1625, 92302, 0,
- 1342, 68440, 64171, 0, 10903, 0, 0, 0, 0, 0, 4482, 41606, 0, 128569, 0,
- 0, 64381, 0, 0, 0, 42245, 0, 41972, 0, 444, 0, 9127, 66687, 66619, 0,
- 78025, 0, 11349, 40991, 0, 0, 119599, 120830, 0, 1197, 128282, 1149,
- 194970, 0, 0, 40990, 0, 0, 3492, 0, 127942, 0, 0, 0, 12838, 0, 19948, 0,
- 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, 41309, 0, 0, 8152, 0, 64428,
- 12227, 0, 0, 12828, 127511, 0, 0, 120708, 0, 0, 10386, 119574, 0, 0,
- 92680, 0, 68154, 0, 1743, 0, 0, 92239, 65186, 0, 0, 9606, 0, 0, 64439, 0,
- 0, 92686, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0,
- 0, 41091, 3426, 1344, 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 0,
- 74818, 5396, 0, 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0,
- 11929, 0, 7170, 9596, 6130, 128826, 43629, 11579, 194741, 0, 194740,
- 128691, 92185, 66699, 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0,
- 68414, 0, 43619, 43382, 11300, 43304, 9686, 5890, 11776, 7558, 127158,
- 65627, 0, 10718, 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628,
- 78019, 0, 0, 41708, 12860, 2641, 12069, 10838, 5403, 10352, 73917, 10061,
- 43237, 0, 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0,
- 10899, 65469, 0, 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232,
- 0, 119253, 0, 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 0,
- 4224, 1336, 41518, 0, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0,
- 0, 0, 272, 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, 1190, 4109,
- 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, 5120, 2409,
- 7799, 0, 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0,
- 0, 64914, 917787, 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625,
- 10842, 41354, 42123, 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0,
- 0, 9972, 73865, 4519, 6114, 10898, 43072, 0, 0, 128858, 0, 0, 10695, 0,
- 7540, 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321,
- 8359, 0, 12689, 0, 194594, 0, 0, 0, 68183, 0, 0, 1287, 5436, 0, 0, 74142,
- 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 0, 0, 0, 0, 0,
- 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, 1489, 0, 0, 0,
- 3899, 1007, 42124, 0, 42122, 92337, 0, 0, 11985, 1345, 78600, 0, 0, 8956,
- 43083, 119830, 42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603,
- 78612, 78613, 65942, 492, 8685, 0, 0, 0, 78622, 43712, 2582, 11470,
- 64538, 7444, 78615, 78616, 41550, 0, 73837, 119823, 2527, 119824, 197,
- 2799, 92594, 41944, 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0,
- 119827, 119817, 119828, 78633, 10896, 0, 1799, 120497, 6971, 74336,
- 128342, 0, 65340, 118979, 41551, 2434, 0, 0, 120579, 0, 4631, 0, 0, 6407,
- 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 0,
- 3171, 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, 64603, 0,
- 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, 8994, 10944,
- 41208, 0, 41168, 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634,
- 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0,
- 8017, 0, 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 0,
+ 0, 0, 65736, 41951, 64816, 65756, 983203, 12955, 10596, 2888, 194645, 0,
+ 0, 9657, 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 43552, 7501,
+ 6328, 0, 10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986,
+ 126542, 10632, 11934, 11452, 1332, 0, 0, 126647, 0, 118887, 1791, 5191,
+ 9288, 64822, 2892, 0, 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512,
+ 7289, 74055, 64161, 8854, 64162, 5858, 41927, 10582, 0, 1784, 1361,
+ 195047, 0, 7905, 0, 64868, 128813, 13158, 92166, 7211, 0, 9371, 73973,
+ 917553, 6828, 1625, 92302, 0, 1342, 68440, 64171, 126704, 10903, 983486,
+ 0, 0, 0, 0, 4482, 41606, 0, 128569, 983112, 0, 64381, 0, 0, 195090,
+ 42245, 126467, 41972, 0, 444, 0, 9127, 66687, 66619, 126489, 78025, 0,
+ 11349, 40991, 917570, 0, 119599, 120830, 0, 1197, 128282, 1149, 194970,
+ 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, 0, 12838, 983969, 19948, 0,
+ 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, 41309, 0, 0, 8152, 0, 41550,
+ 12227, 983613, 0, 12828, 127511, 0, 0, 120708, 0, 0, 10386, 119574, 0, 0,
+ 92680, 983780, 68154, 0, 1743, 0, 0, 92239, 65186, 917571, 0, 9606, 0, 0,
+ 64439, 0, 0, 92686, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362,
+ 64830, 0, 126557, 41091, 3426, 1344, 8870, 0, 0, 4735, 127017, 6119,
+ 12822, 42699, 0, 983815, 74818, 1423, 0, 42637, 41080, 0, 12039, 10559,
+ 0, 118892, 0, 9472, 0, 11929, 0, 7170, 9596, 6130, 128826, 43629, 11579,
+ 78713, 0, 194740, 128691, 92185, 66699, 64440, 1004, 92584, 194737,
+ 43234, 66008, 12627, 0, 68414, 0, 43619, 43303, 11300, 43304, 9686, 5890,
+ 11776, 7558, 127158, 65627, 0, 10718, 13154, 3461, 9139, 0, 0, 0, 0,
+ 65365, 73877, 65628, 78019, 120319, 0, 41708, 12860, 2641, 12069, 10838,
+ 5403, 10352, 70085, 10061, 43237, 0, 5140, 209, 128847, 41704, 41056,
+ 43078, 128125, 118809, 0, 10899, 65469, 92362, 0, 0, 2410, 993, 0,
+ 120589, 120689, 78693, 0, 0, 7232, 0, 119253, 0, 7110, 74462, 2066,
+ 10489, 42166, 43463, 10659, 3600, 0, 4224, 1336, 41518, 0, 0, 0, 0,
+ 41139, 64820, 92538, 12966, 41134, 0, 0, 0, 0, 272, 4263, 8793, 0, 0,
+ 41502, 0, 983, 12549, 0, 0, 1190, 4109, 1335, 841, 5888, 41358, 64863,
+ 9544, 43481, 0, 194806, 70027, 2099, 5120, 2409, 7799, 0, 74424, 0, 0,
+ 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, 0, 64914, 917787,
+ 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, 10842, 41354, 42123,
+ 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, 0, 9972, 73865, 4519,
+ 6114, 10898, 43072, 0, 0, 93960, 983314, 126581, 10695, 0, 7540, 0, 881,
+ 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, 12689,
+ 0, 194594, 0, 983304, 983872, 68183, 0, 983306, 1287, 5436, 0, 983309,
+ 74142, 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 983315, 0,
+ 127242, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0,
+ 1489, 0, 0, 0, 3899, 1007, 42124, 983557, 42122, 92337, 92367, 0, 11985,
+ 1345, 78600, 0, 0, 8956, 43083, 94057, 42138, 78610, 0, 12151, 78608,
+ 78604, 78605, 6285, 78603, 78612, 78613, 65942, 492, 8685, 0, 983750, 0,
+ 78622, 43712, 2582, 11470, 64538, 7444, 78615, 78616, 2297, 0, 73837,
+ 119823, 2527, 119824, 197, 2799, 92594, 41944, 120276, 9933, 0, 66515,
+ 767, 5524, 7028, 0, 0, 119827, 119817, 119828, 78633, 10896, 0, 1799,
+ 120497, 6971, 74336, 128342, 0, 65340, 118979, 41551, 2434, 94018, 0,
+ 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414,
+ 0, 93983, 0, 0, 0, 9164, 66612, 93959, 3171, 6623, 4961, 68396, 886,
+ 55216, 8654, 78832, 9993, 74390, 64603, 70066, 69241, 9599, 78629, 43084,
+ 78627, 78628, 78625, 2399, 69693, 8994, 10944, 41208, 983704, 41168,
+ 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634, 1947, 0, 0,
+ 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, 8017, 119831,
+ 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 983325,
69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0,
- 5398, 0, 127386, 0, 0, 0, 119015, 0, 0, 9476, 0, 0, 12763, 0, 3629, 0,
- 13005, 0, 3628, 0, 0, 92502, 3469, 42107, 42116, 917578, 64809, 2928,
- 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, 0, 42583, 9315, 4822, 4906,
- 3852, 2847, 119821, 3236, 11317, 1251, 7777, 41852, 11410, 10964, 0,
- 43222, 12646, 120269, 10259, 9865, 65821, 0, 6018, 92290, 0, 12276, 0,
- 68372, 0, 92259, 119244, 0, 0, 10467, 0, 2443, 10918, 78217, 119825,
- 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0, 118828, 120271, 65678,
- 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, 518, 65857, 0, 128674,
- 13204, 4387, 857, 0, 65369, 0, 92336, 43125, 120592, 0, 0, 0, 0, 5136,
- 1968, 0, 195023, 1337, 64967, 1629, 0, 796, 66506, 0, 74123, 12877, 0,
- 42314, 43388, 0, 74403, 6120, 478, 65151, 68128, 128147, 43082, 6016, 0,
- 42284, 128507, 4276, 1206, 3619, 41638, 69691, 3843, 12011, 8853, 3361,
- 0, 490, 10715, 7578, 68384, 0, 65350, 10530, 12348, 8653, 74314, 42435,
- 6154, 9551, 65354, 78522, 784, 42397, 334, 0, 42416, 65356, 65273, 77987,
- 69666, 4442, 10364, 0, 778, 41626, 42455, 7989, 74063, 3227, 0, 127275,
- 73983, 2915, 11502, 41022, 41702, 10309, 127035, 78320, 0, 6975, 0, 5415,
- 12176, 0, 74193, 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, 78324,
- 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051,
- 10460, 43364, 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703,
- 43152, 42489, 42112, 0, 1875, 10808, 42109, 120284, 41860, 64862, 13305,
- 64907, 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 0,
- 0, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759,
- 43100, 74449, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, 65178,
- 4684, 78701, 119653, 0, 0, 0, 6048, 74460, 42110, 73965, 10870, 8557,
- 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, 6035, 0,
- 7651, 10296, 64443, 0, 0, 917987, 0, 118966, 74144, 40997, 0, 10392,
- 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 119131, 41000, 0, 119239,
- 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200,
- 128583, 4425, 0, 0, 0, 43074, 73799, 0, 78147, 0, 12173, 78545, 0, 0,
- 65338, 0, 0, 119582, 4474, 0, 43093, 0, 1587, 0, 127372, 64475, 128098,
- 1369, 0, 9959, 7927, 0, 4560, 0, 0, 92277, 0, 64948, 4430, 74347, 42601,
- 4514, 66434, 0, 8194, 65462, 10626, 10965, 0, 8893, 0, 12542, 0, 65341,
- 0, 65829, 7925, 119822, 10475, 0, 0, 1352, 11069, 7707, 127560, 0, 65279,
- 127102, 68207, 127100, 65605, 6040, 127097, 10071, 0, 9336, 128824, 0,
- 8899, 7798, 64474, 64259, 0, 65188, 7820, 43018, 0, 0, 7746, 1492, 78551,
- 10884, 77982, 0, 5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849,
- 5730, 2999, 6342, 68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0,
- 6323, 194684, 8224, 0, 8938, 6043, 12738, 0, 0, 5321, 0, 194798, 0, 2589,
- 74332, 1689, 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516,
- 128163, 74513, 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 0, 5731,
- 1381, 2387, 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668,
- 9766, 0, 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0,
- 3526, 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895,
+ 5398, 0, 127386, 93953, 0, 0, 119015, 0, 0, 9476, 0, 983768, 12763,
+ 126603, 3629, 0, 13005, 0, 3628, 0, 0, 92502, 3469, 42107, 42116, 917578,
+ 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, 0, 42583,
+ 9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, 1251, 7777, 41852,
+ 11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, 65821, 0, 6018,
+ 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 983224, 10467, 0, 2443,
+ 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0,
+ 118828, 120271, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904,
+ 518, 65857, 0, 128674, 13204, 4387, 857, 0, 65369, 0, 92336, 43125,
+ 120592, 0, 0, 0, 0, 5136, 1968, 983041, 126627, 1337, 64967, 1629, 0,
+ 796, 66506, 0, 74123, 12877, 120649, 42314, 43388, 0, 74403, 6120, 478,
+ 65151, 68128, 128147, 43082, 6016, 0, 42284, 128507, 4276, 1206, 3619,
+ 41638, 69691, 3843, 12011, 8853, 3361, 0, 490, 10715, 7578, 68384, 0,
+ 65350, 10530, 12348, 8653, 74314, 42435, 6154, 9551, 65354, 78522, 784,
+ 42397, 334, 0, 42416, 65356, 65273, 77987, 69666, 4442, 10364, 0, 778,
+ 41626, 42455, 7989, 74063, 3227, 69907, 127275, 73983, 2915, 11502,
+ 41022, 41702, 10309, 127035, 78320, 0, 6975, 0, 5415, 12176, 0, 74193,
+ 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, 70057, 127254, 8114,
+ 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, 10460, 43364,
+ 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489,
+ 42112, 127978, 1875, 10808, 42109, 120284, 41860, 64862, 13305, 64907,
+ 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983269,
+ 119830, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151,
+ 73759, 43100, 69888, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753,
+ 65178, 4684, 78701, 119653, 0, 126551, 0, 6048, 74460, 42110, 73965,
+ 10870, 8557, 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731,
+ 6035, 0, 7651, 10296, 64443, 0, 983287, 917987, 0, 118966, 74144, 40997,
+ 0, 10392, 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 13307, 41000, 0,
+ 119239, 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505,
+ 41200, 128583, 4425, 0, 0, 0, 43074, 73799, 983200, 78147, 0, 12173,
+ 78545, 0, 127011, 65338, 0, 0, 119582, 4474, 0, 43093, 128644, 1587, 0,
+ 127372, 64475, 128098, 1369, 983663, 9959, 7927, 0, 4560, 0, 0, 92277, 0,
+ 64948, 4430, 74347, 42601, 4514, 66434, 93955, 8194, 65462, 10626, 10965,
+ 0, 8893, 983293, 12542, 0, 65341, 0, 65829, 7925, 119822, 10475, 0, 0,
+ 1352, 11069, 7707, 127560, 126486, 65279, 127102, 68207, 127100, 7099,
+ 6040, 127097, 10071, 0, 9336, 43750, 0, 8899, 7798, 64474, 64259, 69873,
+ 65188, 7820, 43018, 127082, 0, 7746, 1492, 78551, 10884, 77982, 0, 5127,
+ 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, 68636,
+ 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, 194684, 8224, 0,
+ 8938, 6043, 12738, 0, 983076, 5321, 0, 194798, 0, 2589, 74332, 1689,
+ 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, 128163, 74513,
+ 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 71312, 5731, 1381, 2387,
+ 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668, 9766, 0,
+ 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0, 3526,
+ 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895,
43155, 0, 119849, 3146, 10959, 9483, 0, 77893, 10981, 166, 917841, 8635,
- 0, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, 12717, 0, 7607,
- 10639, 66713, 0, 0, 41643, 74134, 0, 8713, 41640, 10221, 41645, 66712,
- 6645, 646, 66726, 66711, 42129, 0, 77901, 3472, 8697, 0, 0, 0, 0, 0, 0,
- 5809, 1950, 119356, 92432, 74572, 0, 42136, 0, 0, 0, 0, 3247, 119854,
- 65017, 0, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, 0, 0, 194624, 0,
- 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 92592, 0, 41727, 0,
- 42848, 2396, 917766, 0, 74018, 917538, 64940, 7027, 3886, 0, 42457,
- 119008, 0, 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939,
- 92454, 92460, 127801, 917592, 128359, 8534, 127154, 40983, 0, 0, 0, 7201,
- 12561, 0, 42371, 12558, 0, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0,
- 917559, 0, 0, 1563, 128034, 9619, 0, 0, 0, 127872, 0, 5803, 7797, 6070,
- 10006, 0, 2922, 6082, 0, 65009, 0, 12567, 128703, 0, 41412, 0, 0, 3607,
- 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0,
- 43085, 6057, 508, 128585, 128015, 120265, 0, 92405, 0, 0, 638, 6083,
- 119072, 0, 0, 2305, 78348, 0, 0, 6056, 6659, 0, 0, 6085, 0, 0, 3915,
- 41634, 0, 41639, 63912, 11941, 0, 4028, 1787, 42180, 43096, 92690, 3249,
- 1768, 0, 12328, 501, 127074, 10601, 0, 583, 0, 41977, 0, 66004, 119350,
- 6505, 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, 73764, 0,
- 92376, 12745, 9678, 0, 120587, 9869, 128815, 1771, 0, 8936, 0, 0, 4208,
- 78341, 119115, 78342, 0, 0, 74101, 0, 11762, 0, 92422, 77997, 128788,
- 66475, 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739,
- 5026, 0, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138,
- 119361, 0, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, 3440,
- 78215, 1562, 128656, 127175, 119358, 1716, 0, 10600, 917867, 620, 41001,
- 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, 128269, 0, 0,
- 119328, 0, 65557, 0, 74541, 0, 11599, 128209, 11602, 6243, 11574, 11581,
- 11597, 11598, 6253, 6105, 11584, 74195, 11569, 65275, 8906, 127096, 5755,
- 2636, 0, 10815, 11619, 78717, 41540, 7815, 11616, 6979, 12080, 7721,
- 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, 829, 0, 92406, 19950, 0,
- 128217, 6616, 0, 118875, 10953, 391, 0, 69785, 482, 42296, 11588, 0,
- 43606, 0, 68397, 66370, 74506, 42335, 0, 0, 0, 7538, 5315, 120644, 42491,
- 0, 42061, 128088, 4576, 0, 68417, 43809, 4277, 0, 4039, 64472, 42338,
- 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, 3958, 12132, 1849,
- 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, 78338,
- 0, 43300, 5156, 92629, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, 66435,
- 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, 42578, 128794, 41661,
- 78715, 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 0, 42476, 7730, 0,
- 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627,
- 917923, 8763, 128304, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0,
- 6915, 42310, 4377, 8559, 0, 120234, 0, 13193, 64350, 11666, 8679, 41924,
- 1576, 7735, 92398, 0, 73840, 0, 11374, 78043, 10889, 43461, 7757, 42462,
- 120226, 10029, 66493, 2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0,
- 77948, 363, 11015, 77947, 77944, 64296, 127090, 66692, 120826, 0, 66492,
- 6593, 64625, 41963, 92177, 119329, 0, 10013, 64434, 92520, 127095, 9492,
- 11782, 64382, 12833, 77830, 0, 1297, 41630, 630, 127094, 0, 120774,
- 92465, 1043, 43652, 66223, 10090, 0, 128664, 313, 917563, 41881, 0,
- 42311, 7445, 0, 5750, 10759, 9419, 55222, 9405, 11268, 42919, 9398, 8526,
- 9399, 9422, 0, 66495, 0, 0, 127239, 41718, 10707, 1603, 0, 119003, 0,
- 631, 77952, 69703, 13161, 65272, 0, 10546, 74210, 78101, 11600, 77961,
- 2797, 73821, 42427, 306, 714, 3058, 42381, 77962, 127080, 12351, 42395,
- 0, 11607, 0, 42282, 77971, 77967, 9157, 73765, 66364, 42433, 77964, 7603,
- 12803, 180, 42141, 0, 120612, 66494, 12674, 8244, 362, 92439, 0, 8037,
- 43777, 11535, 0, 74845, 5185, 7165, 5521, 10334, 2093, 77983, 10302,
- 128112, 10104, 1027, 5181, 0, 0, 10523, 1446, 42320, 41646, 991, 5189,
- 42472, 41647, 120105, 1722, 5581, 77979, 3405, 0, 194644, 5523, 0, 42620,
- 92447, 0, 9549, 0, 10549, 55282, 9661, 43682, 0, 77910, 120026, 78708, 0,
- 77911, 0, 41991, 0, 0, 7630, 9846, 7684, 10350, 0, 1174, 77981, 42733,
- 77978, 77980, 66485, 77977, 42277, 77974, 42456, 65667, 127037, 12330,
- 128272, 0, 42417, 42383, 0, 41344, 6293, 0, 66252, 77984, 74443, 0,
- 10209, 8313, 4195, 74435, 1316, 66690, 120032, 6332, 64894, 0, 65871,
- 78060, 1736, 0, 3901, 12228, 120151, 65200, 3383, 10446, 78841, 693,
- 9130, 314, 64149, 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, 64154,
- 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, 12824, 0,
- 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0,
- 0, 0, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 0,
- 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 0, 1023,
- 474, 0, 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 92518, 9835,
- 66499, 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133,
- 128008, 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 92695,
- 42182, 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583, 65802, 0,
- 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, 0, 0, 41835,
- 4047, 41842, 0, 64107, 0, 0, 11017, 0, 0, 293, 77966, 92169, 64791,
- 41827, 42466, 43422, 10579, 8560, 0, 65413, 77963, 4803, 12964, 1739,
- 1941, 3900, 0, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098,
- 64105, 128080, 42481, 11716, 66473, 7179, 42289, 0, 64103, 969, 0, 9352,
- 0, 6165, 64100, 0, 6632, 73861, 42402, 74327, 7806, 0, 8914, 0, 0, 3183,
- 1435, 64876, 2969, 6046, 64441, 6208, 67849, 5746, 73749, 0, 64416,
- 42422, 0, 0, 7082, 73775, 338, 5059, 194719, 0, 42328, 10767, 0, 8115, 0,
- 74758, 0, 8227, 2073, 1218, 0, 0, 65848, 0, 0, 0, 0, 126987, 4486, 0, 0,
- 0, 10925, 0, 0, 0, 0, 42309, 10257, 65191, 10273, 0, 10305, 42461, 0,
- 42349, 8832, 78051, 64127, 10644, 42662, 78828, 42278, 74451, 126988,
- 917857, 7794, 0, 42429, 6377, 42316, 119026, 3669, 3968, 42468, 0, 69658,
- 0, 65402, 119581, 0, 0, 64933, 0, 41960, 6699, 0, 0, 128354, 6823, 42391,
- 1588, 65400, 8409, 78223, 19967, 65398, 787, 0, 917939, 127744, 6115,
- 2078, 41654, 42480, 0, 92650, 41655, 65401, 43975, 0, 0, 0, 644, 65500,
- 41657, 10778, 3659, 9533, 184, 1553, 13107, 65484, 69648, 10502, 74457,
- 0, 0, 41554, 0, 8220, 917943, 41557, 0, 0, 11070, 119221, 5157, 4020,
- 73858, 41555, 9514, 64818, 65103, 64641, 64303, 78131, 7520, 0, 74377,
- 11029, 66651, 0, 0, 118930, 64527, 0, 7877, 73803, 0, 127348, 120096,
- 74602, 9955, 119557, 4055, 42817, 0, 65212, 11715, 12190, 12319, 78630,
- 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 127357,
- 78835, 92410, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290,
- 10477, 0, 8636, 0, 8315, 65444, 0, 0, 74595, 6152, 0, 0, 6629, 128251,
+ 983606, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, 12717, 0,
+ 7607, 10639, 43396, 0, 0, 41643, 74134, 983054, 8713, 41640, 10221,
+ 41645, 66712, 6645, 646, 66726, 66711, 42129, 93994, 77901, 3472, 8697,
+ 0, 0, 983806, 0, 0, 0, 5809, 1950, 119356, 92432, 74572, 0, 42136, 0, 0,
+ 0, 0, 3247, 119854, 65017, 983944, 68428, 66668, 0, 0, 10983, 0, 0, 0,
+ 41567, 0, 0, 0, 194624, 119853, 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0,
+ 40988, 92592, 74809, 41727, 0, 42848, 2396, 917766, 0, 74018, 917538,
+ 64940, 7027, 3886, 0, 42457, 119008, 0, 996, 68123, 94058, 4249, 0,
+ 917594, 11707, 8222, 0, 7939, 92454, 92460, 127801, 917592, 128359, 8534,
+ 127154, 40983, 0, 983234, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549,
+ 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 128034, 9619,
+ 983931, 0, 0, 127872, 71363, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0,
+ 65009, 983933, 12567, 128703, 0, 41412, 0, 0, 3607, 9200, 10046, 9612,
+ 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0, 43085, 6057, 508,
+ 93968, 128015, 67968, 0, 92405, 0, 0, 638, 6083, 119072, 0, 0, 2305,
+ 78348, 68096, 0, 6056, 6659, 67969, 0, 6085, 0, 0, 3915, 41634, 0, 41639,
+ 63912, 11941, 0, 4028, 1787, 42180, 43096, 43753, 3249, 1768, 93982,
+ 12328, 501, 93985, 10601, 0, 583, 0, 41977, 0, 66004, 119350, 6505,
+ 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, 73764, 0, 92376,
+ 12745, 9678, 0, 120587, 9869, 128815, 1771, 0, 8936, 0, 0, 4208, 78341,
+ 78567, 78342, 0, 983448, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475,
+ 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026,
+ 983247, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138,
+ 119361, 983564, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0,
+ 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983670, 10600, 917867,
+ 620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025,
+ 69892, 983207, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209,
+ 11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569,
+ 65275, 8906, 127096, 5755, 2636, 0, 10815, 11619, 2301, 41540, 7815,
+ 11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048,
+ 917763, 829, 0, 92406, 19950, 0, 126482, 6616, 0, 118875, 10953, 391, 0,
+ 69785, 482, 42296, 11588, 0, 43606, 0, 68397, 66370, 74506, 42335,
+ 983188, 0, 0, 7538, 5315, 120644, 42491, 0, 42061, 128088, 4576, 0,
+ 68417, 43809, 4277, 0, 4039, 64472, 42338, 368, 42058, 3960, 11043,
+ 11337, 78209, 917820, 63989, 3958, 12132, 1849, 0, 9921, 42451, 4253,
+ 41147, 42064, 11959, 42404, 41160, 0, 3618, 78338, 0, 43300, 5156, 92629,
+ 0, 929, 6827, 42035, 42437, 1555, 0, 8691, 66435, 2215, 41662, 94010, 0,
+ 0, 0, 93952, 4578, 64513, 41664, 983725, 42578, 128794, 41661, 78715,
+ 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 983127, 42476, 7730,
+ 983850, 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525,
+ 41627, 917923, 8763, 128304, 41628, 533, 11931, 65225, 8321, 42504,
+ 42581, 0, 6915, 42310, 4377, 8559, 0, 74360, 0, 13193, 64350, 11666,
+ 8679, 41924, 1576, 7735, 92398, 0, 73840, 983092, 11374, 78043, 10889,
+ 43461, 7757, 42462, 120226, 10029, 66493, 2718, 4168, 73842, 13308,
+ 120112, 0, 1179, 4440, 0, 77948, 363, 11015, 77947, 77944, 64296, 127090,
+ 66692, 120826, 0, 66492, 6593, 64625, 41963, 92177, 119329, 0, 10013,
+ 64434, 92520, 127095, 9492, 11782, 64382, 12833, 77830, 0, 1297, 41630,
+ 630, 127094, 0, 120774, 92465, 1043, 43652, 66223, 10090, 0, 128664, 313,
+ 917563, 41881, 0, 42311, 7445, 0, 5750, 10759, 9419, 55222, 9405, 11268,
+ 42919, 9398, 8526, 9399, 9422, 0, 66495, 0, 0, 127239, 41718, 10707,
+ 1603, 0, 119003, 0, 631, 77952, 69703, 13161, 65272, 0, 10546, 74210,
+ 78101, 11600, 77961, 2797, 73821, 42427, 306, 714, 3058, 42381, 77962,
+ 127080, 12351, 42395, 0, 11607, 0, 42282, 77971, 77967, 9157, 73765,
+ 66364, 42433, 77964, 7603, 12803, 180, 42141, 0, 120612, 66494, 12674,
+ 8244, 362, 92439, 0, 8037, 43777, 11535, 0, 74845, 5185, 7165, 5521,
+ 10334, 2093, 71329, 10302, 128112, 10104, 1027, 5181, 0, 0, 10523, 1446,
+ 42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, 5581, 42898, 3405,
+ 0, 194644, 5523, 0, 42620, 92447, 983810, 9549, 0, 10549, 55282, 9661,
+ 43682, 0, 77910, 120026, 78708, 0, 77911, 0, 41991, 983884, 0, 7630,
+ 9846, 7684, 10350, 0, 1174, 77981, 42733, 77978, 77980, 66485, 77977,
+ 42277, 77974, 42456, 65667, 127037, 12330, 128272, 0, 42417, 42383,
+ 66630, 41344, 6293, 0, 66252, 77984, 74443, 0, 10209, 8313, 4195, 74435,
+ 1316, 66690, 120032, 6332, 64894, 0, 65871, 78060, 1736, 983675, 3901,
+ 12228, 120151, 65200, 3383, 10446, 78841, 693, 9130, 314, 64149, 42420,
+ 11949, 983660, 120152, 11026, 128788, 5332, 6940, 64154, 12635, 127007,
+ 42706, 1751, 273, 8165, 13166, 120763, 78840, 71368, 12824, 0, 4528,
+ 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0, 0, 0,
+ 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 983859,
+ 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 983862,
+ 1023, 474, 0, 119818, 0, 0, 42487, 65556, 0, 127866, 42295, 0, 0, 71322,
+ 92518, 9835, 66499, 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251,
+ 10118, 3133, 128008, 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868,
+ 0, 92695, 42182, 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583,
+ 65802, 93970, 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937,
+ 983742, 0, 41835, 4047, 41842, 0, 64107, 0, 0, 11017, 120601, 0, 293,
+ 77966, 92169, 64791, 41827, 42466, 43422, 10579, 8560, 71350, 65413,
+ 77963, 4803, 12964, 1739, 1941, 3900, 0, 1713, 77969, 0, 73957, 11407,
+ 42441, 41971, 6297, 120098, 64105, 128080, 42481, 11716, 66473, 7179,
+ 42289, 0, 64103, 969, 0, 9352, 0, 6165, 64100, 0, 6632, 73861, 42402,
+ 74327, 7806, 0, 8914, 0, 0, 3183, 1435, 64876, 2969, 6046, 64441, 6208,
+ 67849, 5746, 73749, 0, 64416, 42422, 0, 983046, 7082, 73775, 338, 5059,
+ 194719, 0, 42328, 10767, 0, 8115, 0, 74758, 0, 8227, 2073, 1218, 917790,
+ 0, 65848, 0, 0, 69863, 0, 126987, 4486, 0, 0, 0, 10925, 0, 0, 0, 983586,
+ 42309, 10257, 65191, 10273, 0, 10305, 42461, 0, 42349, 8832, 78051,
+ 64127, 10644, 42662, 78828, 42278, 74451, 126988, 69874, 7794, 0, 42429,
+ 6377, 42316, 119026, 3669, 3968, 42468, 71319, 69658, 0, 65402, 119581,
+ 0, 0, 64933, 0, 41960, 6699, 0, 0, 128354, 6823, 42391, 1588, 65400,
+ 8409, 78223, 19967, 65398, 787, 71315, 917939, 127744, 6115, 2078, 41654,
+ 42480, 0, 92650, 41655, 65401, 43975, 0, 0, 0, 644, 65500, 41657, 10778,
+ 3659, 9533, 184, 1553, 13107, 65484, 69648, 10502, 74457, 0, 0, 41554, 0,
+ 8220, 917943, 41557, 0, 0, 11070, 119221, 5157, 4020, 73858, 41555, 9514,
+ 64818, 65103, 64641, 64303, 78131, 7520, 0, 74377, 11029, 66651, 983068,
+ 0, 118930, 64527, 0, 7877, 73803, 983789, 127348, 120096, 74602, 9955,
+ 119557, 4055, 42817, 0, 65212, 11715, 12190, 12319, 78630, 0, 78631,
+ 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 127357, 78835, 92410,
+ 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, 10477, 0,
+ 8636, 983918, 8315, 65444, 983784, 0, 74595, 6152, 0, 0, 6629, 127108,
120171, 0, 74589, 43993, 0, 69790, 64435, 0, 43690, 11046, 11490, 42730,
4485, 127107, 0, 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0,
12825, 0, 0, 12725, 0, 0, 78642, 223, 0, 69675, 120166, 42444, 0, 64499,
65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, 78619,
120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, 1213,
- 0, 64075, 797, 64074, 8734, 4212, 0, 64387, 4115, 0, 5005, 64070, 64073,
- 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0, 2120,
- 43302, 1224, 0, 65576, 120158, 10701, 1764, 3101, 127815, 12858, 120159,
- 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, 9222,
- 0, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, 0, 0,
- 1293, 7947, 2132, 0, 74593, 120308, 2454, 42717, 3613, 128837, 0, 0,
- 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304, 0, 8822, 0,
- 1157, 64903, 8638, 0, 0, 0, 0, 120319, 8235, 120316, 4405, 10086, 120247,
- 0, 69216, 0, 65430, 74013, 6079, 6817, 10764, 127910, 64291, 128051, 998,
- 120312, 11062, 1317, 64327, 1558, 0, 1991, 7882, 42254, 0, 41700, 530, 0,
- 10428, 119335, 12002, 119336, 5742, 43076, 4692, 64630, 41823, 4007,
- 5004, 119334, 7896, 751, 6595, 6596, 0, 66373, 0, 0, 64908, 92691, 6311,
- 0, 12004, 119192, 12049, 43108, 120326, 0, 41705, 92188, 6598, 0, 6599,
- 120334, 0, 42148, 118825, 66027, 0, 6597, 9412, 8340, 11824, 64745, 0, 0,
- 0, 1988, 5407, 67865, 2430, 41678, 0, 120243, 2336, 0, 0, 78871, 120442,
- 0, 1921, 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, 43789, 12841,
- 9229, 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, 8325, 0,
- 65403, 0, 1854, 10794, 0, 67660, 0, 0, 78359, 5280, 0, 4344, 12905,
- 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, 12934,
- 41682, 65432, 41693, 0, 6071, 65434, 127467, 4804, 4053, 0, 127469,
- 194653, 41696, 467, 69823, 127463, 69797, 0, 0, 8421, 127472, 69682,
- 43705, 502, 0, 65431, 119056, 0, 12043, 1303, 316, 92462, 2029, 2136,
- 119246, 11533, 64365, 43480, 92639, 4860, 194645, 127877, 42488, 0, 9583,
- 128849, 5546, 8019, 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543,
- 77989, 63751, 12137, 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352,
- 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410,
- 0, 0, 78016, 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621,
- 92709, 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474,
- 10545, 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716,
- 92363, 9996, 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493,
- 545, 9575, 41379, 10050, 12718, 0, 8859, 6820, 74345, 65110, 120740, 0,
- 0, 9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021,
- 78022, 410, 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396,
- 10126, 12116, 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412,
- 41345, 120362, 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104,
- 64858, 361, 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919,
- 4569, 74130, 0, 43487, 194630, 611, 74129, 64871, 118891, 65629, 0,
- 194858, 0, 0, 127545, 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921,
- 0, 0, 74054, 127754, 195029, 0, 839, 0, 7695, 8769, 65246, 4829, 0, 4859,
- 64467, 0, 0, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, 0,
- 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468, 74245,
- 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224, 119229,
- 11049, 0, 92697, 43239, 8482, 92440, 0, 5032, 69677, 11940, 67888, 664,
- 120437, 5034, 0, 0, 127525, 42702, 73888, 0, 13294, 67873, 64869, 6032,
- 0, 9115, 7430, 120377, 0, 120819, 68387, 120168, 73913, 120170, 41161,
- 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434, 41437, 1905, 6034,
- 41164, 64744, 9528, 118867, 128800, 524, 0, 74029, 788, 74027, 0, 194638,
- 0, 1663, 10419, 74025, 42636, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0,
- 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, 0, 10855, 5445,
- 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, 4962, 69772,
- 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 92299, 0, 120427, 10451, 0,
- 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, 8367, 0, 120146,
- 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, 6217, 5896, 0,
- 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, 74402, 118860, 0,
- 120419, 92497, 74052, 0, 0, 120549, 119082, 64295, 120418, 0, 64765,
- 73923, 120417, 120662, 120730, 194702, 6216, 0, 10755, 9455, 0, 8124,
- 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638, 0, 0, 0,
- 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, 19936,
- 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0, 0, 0,
- 0, 0, 41199, 10121, 2028, 0, 0, 69715, 0, 3062, 0, 74447, 12608, 0,
- 66440, 7545, 9700, 12580, 0, 120777, 120502, 41155, 0, 74071, 0, 0,
- 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040, 64594, 2456, 231, 0, 74167,
- 542, 0, 118786, 0, 0, 1230, 0, 0, 3597, 4446, 10584, 74235, 92215, 4037,
- 127938, 8352, 0, 5687, 0, 64515, 0, 194801, 55265, 67846, 78434, 9704, 0,
- 0, 74284, 128285, 0, 8660, 0, 0, 0, 78773, 74482, 4483, 1709, 69721,
- 9909, 6080, 0, 120358, 1746, 1315, 8667, 0, 0, 13140, 65899, 10604, 0,
- 4480, 11266, 128152, 1226, 6930, 0, 0, 6360, 10897, 41230, 605, 0, 74785,
- 120356, 0, 0, 41500, 0, 311, 11453, 6221, 10608, 64943, 74280, 10877,
- 118868, 64885, 74272, 0, 0, 0, 120736, 74312, 345, 0, 74456, 64606, 9917,
- 0, 92231, 5037, 0, 1776, 8422, 0, 118814, 41508, 41201, 323, 43328, 0,
- 42698, 1295, 0, 4625, 0, 4630, 13117, 0, 128772, 65123, 11293, 2668,
- 11288, 0, 42640, 65666, 2519, 92369, 65420, 92479, 0, 4252, 5049, 42659,
- 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, 66702, 0,
- 12670, 1013, 0, 64919, 705, 0, 65422, 127803, 1183, 0, 7017, 42852, 0,
- 8157, 9736, 64503, 65418, 0, 0, 74035, 0, 11913, 73874, 6696, 0, 8920, 0,
- 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, 1857, 0,
- 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, 119173, 0, 0,
- 7805, 0, 0, 6935, 92292, 78325, 78326, 78323, 43327, 43989, 119046, 8492,
- 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543, 78335, 78332, 77832,
- 65849, 77831, 0, 0, 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0,
- 195062, 9949, 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108,
- 120617, 74397, 41468, 0, 0, 5292, 55272, 0, 1939, 5302, 3970, 917879,
- 12455, 1793, 0, 0, 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923,
- 0, 13219, 9569, 0, 74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0,
- 78340, 43631, 5324, 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324,
- 3360, 78344, 11523, 0, 92488, 9926, 7197, 0, 68429, 42894, 41821, 1249,
- 78360, 78361, 78356, 78358, 78353, 64899, 64763, 41149, 41807, 43162,
- 41815, 41150, 0, 10571, 10096, 0, 0, 78074, 6947, 41152, 887, 9249, 6565,
- 78510, 41990, 78509, 41811, 74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0,
- 10168, 0, 9781, 128655, 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670,
- 127383, 315, 12813, 0, 78432, 78256, 78351, 78352, 0, 0, 0, 0, 1378,
- 9509, 0, 0, 74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379,
- 194616, 41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366,
- 42088, 0, 195061, 7176, 128833, 10137, 6121, 10995, 78259, 74534, 8119,
- 64874, 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0,
- 74515, 0, 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0,
- 119100, 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657,
- 194600, 0, 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635,
- 65080, 0, 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366,
- 42790, 42006, 0, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320,
- 65335, 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128,
- 118885, 42073, 6785, 64590, 0, 4371, 7196, 65318, 2035, 65316, 4106,
- 65314, 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533,
- 78459, 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695,
- 127752, 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762,
- 66455, 64738, 3219, 68654, 0, 0, 1037, 0, 2025, 128263, 13098, 78442,
- 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0,
- 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 92327, 0, 0, 120593,
- 13071, 0, 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0,
- 64703, 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187,
- 0, 42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065,
- 5323, 8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288,
- 127295, 8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300,
- 92296, 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751,
- 11403, 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 0, 0, 0,
+ 0, 64075, 797, 64074, 8734, 4212, 127369, 64387, 4115, 0, 5005, 64070,
+ 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0,
+ 2120, 43302, 1224, 0, 65576, 74192, 10701, 1764, 3101, 127815, 12858,
+ 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0,
+ 9222, 983729, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935,
+ 0, 0, 1293, 7947, 2132, 983758, 74593, 120308, 2454, 42717, 3613, 128837,
+ 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304,
+ 983114, 8822, 0, 1157, 64903, 8638, 0, 0, 0, 0, 69848, 8235, 120316,
+ 4405, 10086, 120247, 0, 69216, 0, 65430, 71321, 6079, 6817, 10764,
+ 127910, 64291, 128051, 998, 120312, 11062, 1317, 64327, 1558, 0, 1991,
+ 7882, 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, 43076,
+ 4692, 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, 120325,
+ 66373, 0, 0, 64908, 92691, 6311, 0, 12004, 119192, 12049, 43108, 120326,
+ 0, 41705, 92188, 6598, 0, 6599, 120334, 0, 42148, 118825, 66027, 0, 6597,
+ 9412, 8340, 11824, 64745, 2281, 69904, 0, 1988, 5407, 67865, 2430, 41678,
+ 0, 120243, 2336, 983894, 0, 78871, 120442, 983760, 1921, 10947, 19927, 0,
+ 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, 9229, 10956, 42285, 41674,
+ 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, 65403, 983089, 1854, 10794,
+ 0, 67660, 69846, 0, 78359, 5280, 0, 4344, 12905, 65433, 6076, 64793,
+ 41610, 768, 12074, 442, 0, 68162, 64081, 12934, 41682, 65432, 41693, 0,
+ 6071, 65434, 127467, 4804, 4053, 0, 127469, 194653, 41696, 467, 69823,
+ 127463, 69797, 194652, 127473, 8421, 127472, 69682, 43705, 502, 0, 65431,
+ 119056, 69954, 12043, 1303, 316, 7364, 2029, 2136, 119246, 11533, 64365,
+ 43480, 92639, 4860, 126648, 127877, 42488, 0, 9583, 128849, 5546, 8019,
+ 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543, 77989, 63751, 12137,
+ 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352, 65452, 0, 11301,
+ 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410, 0, 0, 78016,
+ 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621, 92709,
+ 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, 10545,
+ 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, 92363, 9996,
+ 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493, 545, 9575,
+ 41379, 10050, 12718, 69854, 8859, 6820, 74345, 65110, 120740, 0, 0, 9119,
+ 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, 78022, 410,
+ 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, 10126, 12116,
+ 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, 41345, 120362,
+ 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, 64858, 361,
+ 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919, 4569, 74130, 0,
+ 43487, 194630, 611, 74129, 64871, 118891, 65629, 0, 194858, 0, 0, 127545,
+ 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, 0, 983581, 74054,
+ 127754, 195029, 0, 839, 983311, 7695, 8769, 65246, 4829, 194663, 4859,
+ 64467, 0, 983954, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210,
+ 983854, 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468,
+ 74245, 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224,
+ 119229, 11049, 0, 92697, 43239, 8482, 92440, 0, 5032, 69677, 11940,
+ 67888, 664, 120437, 5034, 0, 0, 127525, 42702, 73888, 983149, 13294,
+ 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, 120819, 68387, 120168,
+ 73913, 120170, 41161, 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434,
+ 41437, 1905, 6034, 41164, 64744, 9528, 118867, 128800, 524, 0, 74029,
+ 788, 74027, 0, 194638, 0, 1663, 10419, 74025, 42636, 0, 69725, 0, 120656,
+ 0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0,
+ 0, 10855, 5445, 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191,
+ 4962, 69772, 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 92299, 0,
+ 120427, 10451, 0, 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873,
+ 8367, 0, 120146, 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062,
+ 6217, 5896, 0, 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0,
+ 74402, 118860, 0, 120419, 92497, 74052, 0, 92378, 120549, 119082, 64295,
+ 120418, 0, 64765, 73923, 120417, 120662, 69920, 194702, 6216, 0, 10755,
+ 9455, 0, 8124, 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638,
+ 0, 0, 0, 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562,
+ 19936, 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0,
+ 0, 9354, 983164, 128833, 41199, 10121, 2028, 0, 983194, 69715, 0, 3062,
+ 0, 74447, 12608, 0, 66440, 7545, 9700, 12580, 92205, 120777, 120502,
+ 41155, 0, 74071, 0, 983449, 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040,
+ 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, 983970, 1230, 0, 0, 3597,
+ 4446, 10584, 74235, 92215, 4037, 127938, 8352, 0, 5687, 0, 64515, 0,
+ 194801, 55265, 67846, 78434, 9704, 0, 0, 70080, 71338, 0, 8660, 126495,
+ 0, 0, 78773, 74482, 4483, 1709, 69721, 9909, 6080, 0, 120358, 1746, 1315,
+ 8667, 0, 0, 13140, 65899, 10604, 0, 4480, 11266, 128152, 1226, 6930,
+ 67979, 983681, 6360, 10897, 41230, 605, 0, 74785, 69875, 0, 0, 41500, 0,
+ 311, 11453, 6221, 10608, 64943, 74280, 10877, 118868, 64885, 74272, 0, 0,
+ 128559, 120736, 74312, 345, 0, 74456, 64606, 9917, 0, 92231, 5037, 0,
+ 1776, 8422, 0, 118814, 41508, 41201, 323, 43328, 0, 42698, 1295, 194853,
+ 4625, 0, 4630, 13117, 0, 128772, 65123, 11293, 2668, 11288, 0, 42640,
+ 65666, 2519, 92369, 65420, 92479, 0, 4252, 5049, 42659, 119011, 706,
+ 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, 66702, 0, 12670, 1013,
+ 0, 64919, 705, 0, 65422, 127803, 1183, 126519, 7017, 42852, 0, 8157,
+ 9736, 64503, 65418, 0, 983869, 74035, 0, 11913, 73874, 6696, 0, 8920,
+ 119298, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777,
+ 1857, 194657, 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818,
+ 119173, 0, 0, 7805, 0, 94007, 6935, 92292, 78325, 78326, 78323, 43327,
+ 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543,
+ 78335, 78332, 77832, 65849, 77831, 983952, 0, 12451, 0, 8684, 0, 6102, 0,
+ 5298, 0, 5294, 0, 0, 983451, 195062, 9949, 119826, 43617, 119215, 0,
+ 12073, 0, 0, 77863, 13108, 120617, 11439, 41468, 983748, 0, 5292, 55272,
+ 983874, 1939, 5302, 3970, 917879, 12455, 1793, 0, 0, 0, 6643, 92477,
+ 65263, 0, 78330, 41293, 78328, 65923, 0, 13219, 9569, 0, 74383, 0, 74197,
+ 0, 5500, 8813, 0, 0, 74566, 5322, 0, 78340, 43631, 5324, 66443, 3784,
+ 41614, 65269, 6230, 78349, 78345, 43324, 3360, 78344, 11523, 0, 92488,
+ 9926, 7197, 0, 68429, 42894, 41821, 1249, 78360, 78361, 78356, 78358,
+ 78353, 64899, 64763, 41149, 41807, 43162, 41815, 41150, 0, 10571, 10096,
+ 0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, 41811,
+ 74466, 93966, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, 128655,
+ 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 69860, 315, 12813,
+ 983450, 78432, 78256, 78351, 78352, 0, 983648, 0, 0, 1378, 9509, 0, 0,
+ 74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379, 194616,
+ 41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366, 42088, 0,
+ 195061, 7176, 43756, 10137, 6121, 10995, 78259, 74534, 8119, 64874,
+ 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0, 74515, 0,
+ 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, 119100,
+ 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657, 194600, 0,
+ 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, 65080, 0,
+ 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366, 42790, 42006,
+ 119115, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335,
+ 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, 94045,
+ 42073, 6785, 64590, 983821, 4371, 7196, 65318, 2035, 65316, 4106, 65314,
+ 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533, 78459,
+ 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695, 127752,
+ 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762, 66455, 64738,
+ 3219, 68654, 983778, 0, 1037, 0, 2025, 128263, 13098, 78442, 10637, 4568,
+ 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, 12606, 78433,
+ 2825, 0, 10825, 8079, 2821, 41046, 92327, 7365, 983744, 120593, 13071, 0,
+ 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, 64703,
+ 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, 983377,
+ 42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065, 5323,
+ 8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, 127295,
+ 8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300, 92296,
+ 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, 11403,
+ 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 983913, 0, 0,
64857, 128105, 2855, 127828, 66308, 41621, 68214, 127283, 127817, 10654,
0, 119226, 12164, 3246, 7906, 43972, 65847, 7182, 0, 13024, 194822,
- 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466, 0,
- 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0, 64634,
- 128279, 0, 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, 5286,
- 119297, 0, 0, 64925, 120283, 194584, 118982, 194583, 7705, 11942, 11305,
- 194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, 0,
- 66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491,
- 66010, 119552, 6078, 9954, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062,
- 0, 0, 3256, 128640, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0, 0,
- 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635,
- 64337, 0, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613,
- 77909, 92420, 73997, 0, 0, 119218, 7984, 8600, 74434, 127770, 4176, 0,
- 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649,
- 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402,
- 42146, 120134, 74238, 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812,
- 65379, 68386, 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0, 41680, 0,
- 128203, 11534, 1514, 11668, 67891, 9313, 7015, 0, 67877, 0, 12989, 66474,
- 9368, 12848, 1624, 43270, 0, 194563, 10818, 128207, 9953, 0, 78421, 1194,
- 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551, 2798, 65176, 4958,
- 42752, 119025, 0, 67875, 120301, 3495, 66648, 194768, 0, 68364, 0, 4891,
- 0, 10641, 0, 73746, 0, 68352, 0, 73787, 0, 194633, 7199, 64955, 0, 0, 0,
- 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0, 5271, 92318, 92517, 118882,
- 1362, 13297, 0, 128094, 0, 0, 73789, 0, 6658, 4426, 0, 92628, 0, 92319,
- 7276, 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, 0, 127977, 0, 0,
- 3223, 65492, 1284, 194771, 4549, 0, 0, 0, 127763, 10807, 9558, 194613, 0,
- 8515, 8688, 12866, 0, 3294, 0, 8529, 128101, 43385, 7564, 0, 43329, 0,
- 92458, 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198,
- 3215, 0, 7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228,
- 66354, 1501, 0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196,
- 7476, 74399, 0, 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474,
- 92571, 0, 0, 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330,
- 6805, 8631, 2545, 120672, 127166, 0, 74190, 0, 0, 0, 42762, 0, 42914,
- 1650, 262, 1637, 0, 7901, 3238, 128173, 41861, 0, 0, 65158, 10860, 0,
- 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 0, 0, 119810, 7194, 5291,
- 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620,
- 0, 0, 0, 0, 179, 65896, 0, 64756, 2853, 78443, 118813, 0, 118996, 119009,
- 2850, 8084, 0, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072,
- 119843, 119842, 10398, 0, 0, 8377, 127116, 8245, 68401, 3158, 92396,
- 3983, 43656, 923, 119857, 119856, 292, 13002, 119845, 119844, 3221, 1763,
- 92463, 4612, 119851, 119850, 7253, 127110, 68391, 0, 10782, 3637, 12996,
- 43542, 0, 64578, 0, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585,
- 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, 0,
- 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, 74775, 0,
- 0, 92389, 74072, 55269, 0, 0, 0, 2033, 78577, 78576, 195026, 55254, 7740,
- 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, 74006, 64909, 6646,
- 11790, 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, 7230,
- 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903,
- 66721, 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, 10723, 967,
- 0, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 43526, 0, 0, 1886, 42342, 10089,
- 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879, 43692,
- 4563, 0, 0, 7591, 65887, 867, 9520, 872, 0, 868, 873, 7642, 0, 869, 874,
- 7644, 0, 875, 790, 128303, 0, 0, 0, 66182, 0, 5429, 0, 66180, 0, 66181,
- 68452, 0, 0, 42067, 0, 5433, 10657, 7911, 194622, 1547, 66176, 42012,
- 120576, 5425, 4977, 9999, 5317, 5423, 4611, 0, 67637, 0, 9679, 74122, 0,
- 0, 0, 66194, 4418, 66184, 4628, 4245, 119648, 0, 0, 1851, 0, 127189,
- 11908, 0, 9360, 118897, 0, 42776, 66187, 12837, 8829, 7711, 92714, 0,
- 92321, 43318, 0, 8809, 119974, 0, 0, 120604, 0, 0, 0, 0, 0, 0, 7427,
- 9958, 4588, 43680, 0, 74484, 0, 2433, 0, 119622, 3352, 74363, 0, 0, 793,
- 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, 118877, 0,
- 7837, 917625, 818, 5337, 917622, 917621, 41376, 119978, 917618, 120594,
- 74086, 917615, 917614, 917613, 10973, 66359, 1372, 127172, 917608, 4969,
- 1254, 917605, 917604, 917603, 917602, 65228, 78221, 0, 0, 2840, 0,
- 119982, 0, 0, 3245, 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 128528, 0,
- 917611, 127026, 128883, 0, 0, 43648, 120812, 0, 43322, 92662, 0, 0,
- 64372, 92698, 3226, 655, 752, 7457, 7456, 7452, 3285, 128779, 127821,
- 119988, 65610, 2391, 0, 92248, 671, 250, 7434, 618, 668, 610, 42800,
- 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 0, 128266,
- 64749, 67850, 2107, 0, 0, 4605, 128174, 0, 43372, 65945, 128838, 0,
- 119590, 0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0,
- 128297, 0, 0, 0, 0, 11334, 43326, 12609, 11519, 11503, 5530, 5210, 0,
- 4627, 0, 5208, 0, 128842, 10332, 5218, 7976, 9156, 0, 3244, 5529, 69647,
- 73894, 128852, 5432, 64965, 5527, 74033, 10516, 7790, 5528, 0, 42140,
- 120281, 0, 0, 43545, 9887, 0, 4000, 7429, 7428, 665, 7424, 3206, 120278,
- 7884, 0, 128566, 917989, 128666, 211, 2509, 0, 120573, 68672, 3220,
- 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, 127258, 5852, 0,
- 0, 127259, 1708, 0, 0, 2623, 11943, 0, 69226, 0, 4698, 66509, 1066,
- 119921, 4701, 0, 120285, 74225, 119114, 8267, 0, 127265, 0, 7516, 0,
- 2625, 0, 8034, 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, 0, 43384,
- 12660, 0, 0, 0, 74850, 41069, 0, 128156, 12099, 4310, 10032, 6252, 713,
- 7990, 0, 3990, 0, 0, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800,
- 0, 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650,
- 94, 1880, 74766, 0, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, 0,
- 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 0, 64785, 7394, 3641, 5419,
- 128055, 0, 127883, 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299,
- 936, 13289, 127521, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 119108,
- 0, 12913, 74206, 7529, 0, 0, 0, 120782, 4113, 0, 2372, 336, 0, 7509,
- 12152, 0, 682, 66458, 41505, 0, 64743, 10593, 1703, 0, 0, 8033, 0, 0,
- 9810, 127269, 0, 12970, 0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0,
- 74291, 1965, 7069, 43312, 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0,
- 0, 74239, 41317, 92614, 2091, 74545, 2090, 0, 9353, 7117, 2077, 77886, 0,
- 10498, 2083, 77888, 0, 0, 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0,
- 9654, 12856, 6924, 0, 7066, 0, 0, 128135, 41037, 42692, 7786, 12959,
- 41039, 0, 0, 680, 6274, 128200, 1181, 7056, 3174, 0, 0, 92668, 65665,
- 127375, 0, 6920, 0, 92295, 0, 118965, 0, 64644, 126981, 0, 0, 41028, 0,
- 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, 0, 0, 40987, 4667, 0,
- 0, 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, 4744, 0,
- 12702, 242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, 74505, 43274,
- 5313, 951, 0, 0, 0, 7604, 0, 4009, 127816, 0, 120562, 0, 0, 64860,
- 119138, 119069, 0, 127370, 4048, 0, 0, 120596, 1646, 77890, 64534, 73995,
- 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894,
- 2975, 74442, 9822, 0, 55220, 10084, 73943, 118840, 0, 917562, 0, 3399,
- 9851, 0, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 0, 0, 0, 1777, 9151,
- 1137, 69767, 749, 42366, 0, 5385, 128574, 128218, 0, 0, 5989, 0, 0,
- 128091, 0, 41685, 69223, 0, 9769, 41684, 0, 519, 0, 11740, 5766, 0, 0,
- 2600, 8848, 120138, 41297, 0, 3666, 74473, 41300, 74468, 65160, 0, 69688,
- 69771, 74479, 0, 6558, 0, 0, 69765, 120750, 252, 0, 41302, 0, 0, 0,
- 69763, 0, 11729, 8719, 9060, 0, 120139, 10761, 0, 0, 0, 118792, 11734, 0,
- 11730, 0, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, 7764, 0,
- 11094, 120825, 0, 0, 4282, 8298, 0, 0, 0, 0, 0, 64449, 0, 127509, 63854,
- 8456, 0, 74783, 65670, 0, 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0,
- 120764, 0, 10019, 74762, 0, 3458, 4365, 0, 0, 3647, 0, 2602, 128341, 0,
- 194707, 41135, 0, 0, 0, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545,
- 0, 92193, 7597, 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363,
- 9062, 119252, 0, 0, 0, 64479, 9232, 92596, 0, 0, 194712, 10900, 41531,
- 1263, 3720, 12048, 0, 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354,
- 127345, 299, 0, 8525, 127347, 3524, 917565, 8831, 127349, 92564, 3075,
- 67867, 127352, 0, 66362, 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200,
- 65114, 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680,
- 7204, 0, 2588, 2914, 7011, 55281, 0, 2471, 194631, 2883, 2749, 119563,
+ 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466,
+ 983575, 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0,
+ 64634, 128279, 0, 11612, 0, 67600, 2374, 94066, 8475, 11609, 66313, 0, 0,
+ 5286, 119297, 0, 0, 64925, 120283, 194584, 118982, 194583, 7705, 11942,
+ 11305, 194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096,
+ 0, 66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491,
+ 66010, 119552, 6078, 9954, 0, 1475, 119247, 9938, 6084, 917546, 41064,
+ 41062, 0, 0, 3256, 10189, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0,
+ 0, 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 71351, 0,
+ 3635, 64337, 983273, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0,
+ 65613, 77909, 92420, 73997, 0, 0, 119218, 7984, 8600, 74434, 127770,
+ 4176, 70050, 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860,
+ 78596, 0, 3649, 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124,
+ 7866, 0, 11402, 42146, 94032, 74238, 42664, 2849, 127034, 0, 7938, 12960,
+ 1761, 11812, 65379, 68386, 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0,
+ 41680, 0, 128203, 11534, 1514, 11668, 67891, 9313, 7015, 0, 67877,
+ 194567, 12989, 66474, 9368, 12848, 1624, 43270, 0, 74278, 10818, 126644,
+ 9953, 0, 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551,
+ 2798, 65176, 4958, 42752, 119025, 0, 67875, 120301, 3495, 66648, 194768,
+ 0, 68364, 983222, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 194829,
+ 194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0,
+ 5271, 92318, 92517, 118882, 1362, 13297, 0, 128094, 0, 983323, 73789, 0,
+ 6658, 4426, 0, 92628, 983833, 92319, 7276, 42163, 5220, 0, 0, 983322,
+ 2416, 3310, 42703, 0, 379, 0, 43755, 0, 0, 3223, 65492, 1284, 194771,
+ 4549, 0, 0, 983154, 127763, 10807, 9558, 194613, 0, 8515, 8688, 12866,
+ 65308, 3294, 983324, 8529, 128101, 43385, 7564, 0, 43329, 0, 92458,
+ 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198, 3215, 0,
+ 7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, 66354, 1501,
+ 0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, 7476, 74399, 0,
+ 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, 77979, 0, 126507,
+ 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, 6805, 8631,
+ 2545, 70052, 127166, 0, 74190, 0, 0, 983777, 42762, 0, 42914, 1650, 262,
+ 1637, 0, 7901, 3238, 128173, 41861, 0, 128585, 65158, 10860, 94059,
+ 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 93989, 0, 119810, 7194,
+ 5291, 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912,
+ 2620, 0, 0, 0, 983866, 179, 65896, 0, 64756, 2853, 78443, 118813, 983881,
+ 118996, 119009, 2850, 8084, 983085, 73850, 2801, 92284, 42069, 119839,
+ 74754, 119841, 42072, 119843, 119842, 10398, 983056, 0, 8377, 127116,
+ 8245, 68401, 3158, 92396, 3983, 43656, 923, 119857, 119856, 292, 13002,
+ 119845, 119844, 3221, 1763, 92463, 4612, 119851, 119850, 7253, 127110,
+ 68391, 0, 10782, 3637, 12996, 43542, 0, 64578, 983666, 3228, 69636, 8783,
+ 0, 119614, 2731, 0, 0, 78585, 4102, 7696, 73878, 0, 0, 78586, 43316,
+ 4177, 11283, 9089, 0, 73996, 983173, 64500, 43674, 0, 64947, 1856, 0, 0,
+ 6379, 0, 0, 0, 3208, 12975, 74775, 127380, 983922, 92389, 74072, 55269,
+ 0, 0, 983674, 2033, 78577, 78576, 195026, 55254, 7740, 0, 0, 0, 73964, 0,
+ 93988, 67612, 65674, 128244, 94110, 41689, 0, 74006, 64909, 6646, 11790,
+ 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, 7230, 8257, 0,
+ 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903, 66721,
+ 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, 10723, 967, 983942,
+ 126469, 11946, 0, 3257, 0, 12307, 1845, 983157, 43526, 0, 0, 1886, 42342,
+ 10089, 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879,
+ 43692, 4563, 0, 0, 7591, 65887, 867, 9520, 872, 126607, 868, 873, 7642,
+ 0, 869, 874, 7644, 120674, 875, 790, 128303, 0, 0, 0, 66182, 983250,
+ 5429, 195055, 66180, 126480, 66181, 68452, 983281, 983242, 42067, 0,
+ 5433, 10657, 7911, 194622, 1547, 66176, 42012, 120576, 5425, 4977, 9999,
+ 5317, 5423, 4611, 0, 67637, 0, 9679, 74122, 0, 0, 0, 66194, 4418, 66184,
+ 4628, 4245, 119648, 0, 0, 1851, 0, 127189, 11908, 0, 9360, 118897,
+ 983270, 42776, 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809,
+ 69881, 0, 983142, 120604, 983052, 983873, 0, 983262, 0, 0, 7427, 9958,
+ 4588, 43680, 0, 74484, 194968, 2433, 0, 119622, 3352, 74363, 983876, 0,
+ 793, 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647,
+ 118877, 0, 7837, 917625, 818, 5337, 194628, 917621, 41376, 119978,
+ 126576, 120594, 74086, 917615, 917614, 917613, 10973, 66359, 1372,
+ 127172, 917608, 4969, 1254, 917605, 917604, 93967, 917602, 65228, 78221,
+ 126612, 0, 2840, 0, 119982, 983930, 0, 3245, 9068, 68194, 64725, 0, 0,
+ 12991, 0, 2651, 68016, 983257, 917611, 127026, 128883, 0, 0, 43648,
+ 120812, 0, 43322, 92662, 0, 0, 64372, 92698, 3226, 655, 752, 7457, 7456,
+ 7452, 3285, 128779, 127821, 119988, 65610, 2391, 0, 92248, 671, 250,
+ 7434, 618, 668, 610, 42800, 7431, 1152, 42801, 640, 120666, 7448, 7439,
+ 628, 3905, 73810, 0, 128266, 64749, 67850, 2107, 0, 0, 4605, 128174,
+ 983192, 43372, 65945, 128838, 0, 119590, 0, 0, 0, 987, 6927, 11572,
+ 42261, 11464, 3365, 9971, 0, 0, 128297, 0, 0, 0, 0, 11334, 43326, 12609,
+ 11519, 11503, 5530, 5210, 0, 4627, 983883, 5208, 0, 128842, 10332, 5218,
+ 7976, 9156, 0, 3244, 5529, 69647, 73894, 128852, 5432, 64965, 5527,
+ 74033, 10516, 7790, 5528, 0, 42140, 120281, 0, 0, 43545, 9887, 0, 4000,
+ 7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 128566, 917989, 128666,
+ 211, 2509, 128858, 120573, 68672, 3220, 42235, 0, 10690, 8951, 5214,
+ 42474, 8118, 0, 7048, 4590, 127258, 5852, 0, 0, 127259, 1708, 0, 983165,
+ 2623, 11943, 0, 69226, 0, 4698, 66509, 1066, 119921, 4701, 983867,
+ 120285, 74225, 94111, 8267, 0, 127265, 0, 7516, 0, 2625, 983968, 8034,
+ 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, 0, 43384, 12660, 0, 0,
+ 0, 74850, 41069, 0, 128156, 12099, 4310, 10032, 6252, 713, 7990, 0, 3990,
+ 0, 983254, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, 983120,
+ 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94,
+ 1880, 74766, 983829, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0,
+ 126572, 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 120335, 64785, 7394,
+ 3641, 5419, 128055, 0, 127883, 0, 120344, 43988, 0, 8610, 43062, 7592,
+ 856, 74299, 936, 13289, 69894, 43171, 1459, 0, 65243, 78638, 19953, 0,
+ 1504, 70064, 0, 12913, 74206, 7529, 0, 128699, 983948, 120782, 4113, 0,
+ 2372, 336, 0, 7509, 12152, 0, 682, 66458, 41505, 0, 64743, 10593, 1703,
+ 0, 983946, 8033, 69953, 0, 9810, 127269, 0, 12970, 0, 42351, 10109,
+ 917623, 0, 194693, 0, 92690, 0, 0, 74291, 1965, 7069, 43312, 0, 73887, 0,
+ 2087, 64370, 6314, 41714, 8501, 0, 0, 74239, 41317, 92614, 2091, 74545,
+ 2090, 0, 9353, 7117, 2077, 77886, 0, 10498, 2083, 77888, 0, 0, 119236,
+ 634, 0, 0, 0, 69779, 4165, 8746, 0, 9654, 12856, 6924, 0, 7066, 983710,
+ 0, 128135, 41037, 42692, 7786, 12959, 41039, 127483, 0, 680, 2302,
+ 128200, 1181, 7056, 3174, 126516, 0, 92668, 65665, 127375, 126506, 6920,
+ 0, 92295, 0, 118965, 0, 64644, 126981, 74119, 0, 41028, 0, 6231, 2613,
+ 65302, 40989, 0, 194696, 0, 42760, 0, 983566, 0, 40987, 4667, 0, 983923,
+ 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, 4744, 0, 12702,
+ 242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, 74505, 43274, 5313,
+ 951, 0, 0, 983858, 7604, 983282, 4009, 127816, 983701, 120562, 0, 983711,
+ 64860, 119138, 119069, 0, 127370, 4048, 983598, 0, 70024, 1646, 77890,
+ 64534, 73995, 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107,
+ 3441, 119894, 2975, 74442, 9822, 983926, 55220, 10084, 73943, 118840, 0,
+ 917562, 194610, 3399, 9851, 983708, 11909, 9059, 0, 7687, 0, 6789, 0, 0,
+ 0, 71367, 0, 0, 1777, 9151, 1137, 69767, 749, 42366, 0, 5385, 128574,
+ 128218, 0, 0, 5989, 0, 0, 128091, 0, 41685, 69223, 0, 9769, 41684,
+ 983214, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, 41297, 0, 3666,
+ 74473, 41300, 74468, 65160, 0, 69688, 69771, 74479, 0, 6558, 0, 0, 69765,
+ 120750, 252, 0, 41302, 0, 0, 0, 69763, 0, 11729, 8719, 9060, 0, 120139,
+ 10761, 0, 0, 0, 118792, 11734, 983221, 11730, 0, 9593, 5757, 2403, 64808,
+ 55275, 0, 11728, 43572, 0, 0, 7764, 983705, 11094, 120825, 0, 0, 4282,
+ 8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 63854, 8456, 0, 74783, 65670, 0,
+ 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0,
+ 3458, 4365, 70053, 983703, 3647, 0, 2602, 128341, 0, 194707, 41135, 0, 0,
+ 0, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, 126476, 92193, 7597,
+ 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, 9062, 119252, 0,
+ 0, 0, 64479, 9232, 92596, 0, 0, 194712, 10900, 41531, 1263, 3720, 12048,
+ 0, 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354, 127345, 299,
+ 917957, 8525, 127347, 3524, 917565, 8831, 127349, 92564, 3075, 67867,
+ 127352, 0, 66362, 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200, 65114,
+ 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680, 7204,
+ 70065, 2588, 2914, 7011, 55281, 0, 2471, 194631, 2883, 2749, 119563,
73774, 10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232,
- 10928, 0, 41153, 41229, 118967, 0, 3738, 127369, 0, 12711, 3181, 66212,
- 74289, 68472, 42857, 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047,
- 0, 0, 64674, 0, 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 0,
- 74461, 3218, 120471, 74290, 120469, 64562, 120475, 8569, 11404, 11932,
- 73728, 3214, 120461, 120468, 12128, 3207, 65486, 78729, 1901, 78727,
- 127326, 120460, 7425, 3205, 0, 78737, 78736, 78735, 43383, 78733, 65459,
- 2606, 78730, 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 0, 120737, 0,
- 0, 0, 378, 2610, 0, 65079, 0, 65695, 0, 37, 7068, 0, 120480, 120479,
- 3209, 120477, 0, 10638, 9768, 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 0,
- 5233, 0, 64792, 0, 0, 0, 0, 7060, 9847, 120144, 1685, 595, 0, 73971,
- 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243, 9014,
- 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 0, 8203, 78488, 0, 8458,
- 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465, 0, 8193, 55279,
- 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0, 92414, 8982, 0, 0, 0,
- 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548, 68650, 0, 1832, 5604,
- 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 0, 3869,
- 11937, 5725, 127539, 1783, 68648, 5728, 0, 0, 0, 11918, 66567, 5724, 0,
- 5727, 78521, 0, 0, 764, 0, 128116, 43531, 0, 9033, 0, 42532, 6223, 11042,
- 120749, 11423, 0, 119861, 0, 43465, 0, 128267, 6559, 64557, 0, 0, 120648,
- 43019, 43477, 10238, 0, 0, 43377, 92282, 0, 1478, 9783, 11825, 2607,
- 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 0, 41144, 0, 92438,
- 43537, 6761, 10093, 4369, 917791, 0, 0, 8820, 3947, 0, 0, 11515, 526, 0,
- 41295, 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0,
- 0, 1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357,
- 11794, 42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870,
- 6553, 7055, 0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, 12990, 1160, 42084,
- 119650, 41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 0,
- 41216, 7844, 2616, 119190, 68461, 65234, 0, 13076, 3135, 0, 78143,
- 119139, 3142, 92451, 0, 10819, 119580, 10183, 0, 2608, 1470, 73967, 0,
- 6227, 0, 0, 69741, 0, 6163, 0, 0, 127314, 0, 0, 8603, 0, 119866, 3306,
- 10876, 43392, 119573, 127931, 5751, 0, 6222, 0, 0, 12086, 7403, 1600,
- 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0,
- 43110, 0, 1234, 6540, 6974, 0, 0, 0, 5002, 0, 41286, 0, 127019, 0, 43585,
- 0, 6551, 0, 128229, 0, 41289, 0, 194602, 0, 8977, 602, 120814, 0, 128778,
- 128661, 0, 0, 41279, 0, 0, 0, 11081, 43615, 0, 0, 0, 0, 12727, 0, 0,
- 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, 7831, 0, 194571, 0,
- 73915, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 43584, 0, 13113,
- 0, 127757, 2393, 7058, 9087, 74067, 68673, 41574, 78337, 0, 74058, 6376,
- 0, 0, 0, 0, 9854, 127748, 64696, 0, 128220, 0, 6994, 0, 1720, 0, 0, 0,
- 6529, 7063, 0, 3751, 9120, 0, 0, 1798, 709, 0, 1354, 1876, 13152, 6557,
- 12430, 8137, 0, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 0, 6136,
- 917609, 65677, 8682, 41235, 92595, 42045, 9804, 0, 432, 3595, 0, 65437,
- 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052,
- 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, 0, 64640, 0, 119104, 0,
- 74137, 0, 10063, 12652, 12199, 92480, 0, 2566, 11971, 0, 0, 1065, 0, 0,
- 43400, 2576, 66696, 0, 0, 43604, 0, 0, 74082, 514, 74502, 0, 2921, 43215,
- 64493, 5772, 12968, 0, 194944, 74580, 43398, 2580, 0, 41341, 41223, 6564,
- 1463, 41342, 0, 5293, 0, 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0,
- 13091, 0, 0, 0, 917915, 0, 127025, 0, 74821, 0, 0, 119042, 0, 127865,
- 13090, 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, 42569, 127824, 0,
- 64761, 0, 41021, 8510, 42432, 0, 0, 0, 0, 64496, 74109, 0, 9915, 0, 0,
- 7061, 41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067,
- 68221, 0, 0, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0,
- 74792, 2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976,
- 78116, 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0,
- 12107, 44002, 10905, 65010, 194986, 697, 66018, 9284, 4244, 0, 0, 92644,
- 13121, 120036, 0, 12010, 128573, 128221, 0, 0, 0, 127193, 65816, 68111,
- 0, 127933, 65668, 92257, 6618, 118784, 66365, 0, 42234, 12648, 128039,
- 7123, 0, 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365,
- 128258, 0, 0, 0, 13122, 0, 191, 74119, 8585, 8000, 64411, 120652, 42889,
+ 10928, 0, 41153, 41229, 118967, 0, 3738, 94016, 0, 12711, 3181, 66212,
+ 74289, 68472, 42857, 8262, 983371, 0, 983220, 0, 42347, 12092, 9615,
+ 7234, 74047, 983088, 0, 43744, 0, 0, 73846, 2934, 12722, 120762, 922,
+ 43983, 74507, 983126, 74461, 3218, 120471, 74290, 120469, 64562, 120475,
+ 8569, 11404, 11932, 73728, 3214, 120461, 120468, 12128, 3207, 65486,
+ 78729, 1901, 78727, 127326, 120460, 7425, 3205, 68003, 78737, 78736,
+ 78735, 43383, 69940, 65459, 2606, 78730, 73897, 0, 11496, 1173, 0, 41272,
+ 119661, 0, 0, 983313, 120737, 0, 983962, 983312, 378, 2610, 0, 65079,
+ 983317, 65695, 126559, 37, 7068, 0, 120480, 120479, 3209, 120477, 0,
+ 10638, 9768, 69952, 119909, 983391, 0, 0, 0, 0, 65510, 0, 0, 5233,
+ 983327, 64792, 983326, 0, 126633, 0, 7060, 9847, 120144, 1685, 595, 0,
+ 73971, 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243,
+ 9014, 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 128132, 8203, 78488,
+ 983090, 8458, 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465,
+ 69901, 8193, 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0,
+ 92414, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548,
+ 68650, 92507, 1832, 5604, 5735, 41141, 119020, 4376, 0, 11787, 3745, 0,
+ 0, 42888, 65712, 983296, 3869, 11937, 5725, 127539, 1783, 68648, 5728, 0,
+ 0, 0, 11918, 66567, 5724, 0, 5727, 78521, 0, 0, 764, 0, 128116, 43531, 0,
+ 9033, 0, 42532, 6223, 11042, 120749, 11423, 0, 119861, 71344, 43465, 0,
+ 128267, 6559, 64557, 71348, 92649, 120648, 43019, 43477, 10238, 74491, 0,
+ 43377, 92282, 71346, 1478, 9783, 11825, 2607, 64740, 0, 7739, 74543, 0,
+ 0, 0, 6132, 0, 63765, 0, 70058, 41144, 0, 92438, 43537, 6761, 10093,
+ 4369, 917791, 0, 983148, 8820, 3947, 0, 0, 11515, 526, 128103, 41295,
+ 194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 983374,
+ 1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357, 11794,
+ 42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870, 6553, 7055,
+ 0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, 12990, 1160, 42084, 119650,
+ 41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 983170,
+ 41216, 7844, 2616, 119190, 68461, 65234, 983286, 13076, 3135, 983279,
+ 78143, 119139, 3142, 92451, 94068, 10819, 119580, 10183, 0, 2608, 1470,
+ 73967, 94008, 6227, 0, 127173, 69741, 983582, 6163, 983558, 0, 127314, 0,
+ 0, 8603, 0, 119866, 3306, 10876, 43392, 119573, 127931, 5751, 0, 6222, 0,
+ 0, 12086, 7403, 1600, 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0,
+ 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, 6974, 0, 0, 983209, 5002, 0,
+ 41286, 69946, 127019, 0, 43585, 0, 6551, 983953, 128229, 0, 41289, 0,
+ 194602, 0, 8977, 602, 120814, 0, 128778, 128661, 0, 983367, 41279, 0, 0,
+ 0, 11081, 43615, 0, 0, 0, 983612, 12727, 0, 0, 78397, 9475, 7112, 65105,
+ 0, 9633, 10886, 43592, 7831, 983820, 194571, 0, 73915, 8076, 43048, 8290,
+ 8291, 43051, 92570, 0, 2596, 43584, 0, 13113, 0, 127757, 2393, 7058,
+ 9087, 74067, 68673, 41574, 78337, 0, 74058, 6376, 0, 0, 0, 0, 9854,
+ 127748, 64696, 0, 128220, 0, 6994, 0, 1720, 0, 0, 0, 6529, 7063, 983182,
+ 3751, 9120, 983477, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, 12430,
+ 8137, 94098, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 94046,
+ 6136, 917609, 65677, 8682, 41235, 92595, 42045, 9804, 118963, 432, 3595,
+ 194945, 65437, 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894,
+ 8797, 0, 9052, 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, 0, 64640,
+ 0, 94109, 0, 74137, 70035, 10063, 12652, 12199, 92480, 0, 2566, 11971,
+ 983728, 0, 1065, 0, 0, 43400, 2576, 66696, 93999, 0, 43604, 0, 0, 74082,
+ 514, 74502, 70032, 2921, 43215, 64493, 5772, 12968, 70055, 194944, 74580,
+ 43398, 2580, 983801, 41341, 41223, 6564, 1463, 41342, 0, 5293, 70020, 0,
+ 3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0,
+ 127025, 0, 74821, 0, 983724, 119042, 0, 127865, 13090, 66643, 0, 1270,
+ 1132, 42360, 0, 74096, 66655, 42569, 127824, 0, 64761, 0, 41021, 8510,
+ 42432, 0, 0, 194782, 0, 64496, 74109, 70030, 9915, 0, 983216, 7061,
+ 41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067, 68221, 0,
+ 127383, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0, 74792,
+ 2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976, 11066,
+ 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0, 12107,
+ 7100, 10905, 65010, 194986, 697, 66018, 9284, 4244, 0, 0, 92644, 13121,
+ 120036, 0, 12010, 128573, 128221, 0, 0, 0, 127193, 65816, 68111, 0,
+ 127933, 65668, 92257, 6618, 118784, 66365, 0, 42234, 12648, 78110, 7123,
+ 70038, 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365,
+ 128258, 0, 0, 0, 13122, 0, 191, 70060, 8585, 8000, 64411, 120652, 42889,
64850, 41072, 41578, 0, 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683,
396, 41580, 68146, 0, 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0,
- 4743, 0, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 92514,
- 0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 0, 1778, 3956, 0,
- 42070, 6563, 43075, 9018, 0, 0, 12067, 41312, 0, 5547, 74531, 127969, 0,
- 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750,
- 0, 4394, 68368, 1807, 0, 92298, 0, 5889, 0, 7180, 0, 119145, 0, 917558,
- 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, 65230,
- 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, 3975, 0, 74087, 0,
- 12672, 3798, 2703, 0, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 2932,
- 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 128230,
- 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 128032, 0, 42531, 0,
- 1510, 0, 8256, 0, 11393, 0, 8879, 128075, 92474, 8770, 0, 0, 78377, 1910,
- 8671, 78374, 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0,
- 65106, 42761, 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0,
- 0, 1733, 4392, 2568, 10786, 69661, 0, 8184, 41486, 0, 7396, 7116, 0,
- 69788, 0, 7185, 7965, 0, 0, 92347, 0, 41350, 9129, 0, 0, 0, 0, 92489, 0,
- 10481, 0, 127486, 7171, 0, 340, 92498, 0, 0, 0, 92200, 0, 0, 6764,
- 127487, 0, 0, 0, 0, 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 0, 0, 0,
- 127970, 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 128244,
- 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253,
- 120535, 0, 8630, 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 0, 0,
- 0, 0, 64293, 68098, 2635, 0, 0, 0, 0, 0, 7835, 0, 0, 194988, 92285,
- 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 0, 0, 0, 0, 4011, 917616,
- 68101, 0, 7864, 4254, 65095, 0, 5600, 3903, 127083, 10447, 5598, 1207,
- 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, 194778, 194772,
- 9321, 0, 0, 0, 0, 1719, 68356, 68354, 9671, 1125, 4399, 127479, 917610,
- 0, 7631, 5488, 7128, 120532, 0, 5491, 0, 8937, 43044, 2604, 74187, 5490,
- 43046, 5489, 7212, 11768, 43043, 6300, 0, 7122, 0, 4390, 454, 41397, 0,
- 9875, 7593, 194792, 92274, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746,
- 11016, 65752, 120037, 0, 43423, 128683, 11989, 0, 0, 0, 0, 0, 8249,
- 128172, 0, 78531, 6640, 74806, 2598, 513, 0, 6586, 8656, 0, 127002,
- 65008, 0, 194784, 194989, 194795, 0, 92515, 68475, 0, 0, 0, 78637, 12647,
- 0, 128043, 0, 1036, 0, 92419, 1723, 128056, 0, 0, 41579, 2444, 0, 10705,
- 73876, 0, 74486, 0, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459,
- 68437, 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263,
- 11907, 195000, 5690, 92255, 0, 0, 43181, 13095, 0, 127857, 64498, 0,
- 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, 0, 0, 0,
- 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, 5226,
- 12602, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725,
+ 4743, 0, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 71349,
+ 0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 128113, 1778, 3956, 0,
+ 42070, 6563, 43075, 9018, 94006, 983388, 12067, 41312, 0, 5547, 74531,
+ 127969, 0, 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703,
+ 118822, 1750, 0, 4394, 68368, 1807, 983879, 92298, 0, 5889, 0, 7180, 0,
+ 119145, 0, 917558, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583,
+ 4512, 119360, 65230, 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416,
+ 3975, 0, 74087, 0, 12672, 3798, 2703, 983599, 0, 2109, 9774, 1275, 0, 0,
+ 41095, 3962, 0, 2932, 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468,
+ 0, 0, 41851, 128230, 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0,
+ 128032, 0, 42531, 119108, 1510, 0, 8256, 0, 11393, 0, 8879, 128075,
+ 92474, 8770, 0, 0, 78377, 1910, 8671, 78374, 4283, 0, 127117, 68361,
+ 78318, 2654, 7893, 195007, 0, 0, 0, 65106, 42761, 12857, 4581, 8411,
+ 78372, 78371, 78370, 78369, 78368, 0, 0, 0, 1733, 4392, 2568, 10786,
+ 69661, 0, 8184, 41486, 0, 7396, 7116, 0, 69788, 0, 7185, 7965, 0, 0,
+ 92347, 983087, 41350, 9129, 0, 0, 2294, 0, 92489, 0, 10481, 0, 70022,
+ 7171, 0, 340, 92498, 93972, 0, 0, 92200, 0, 0, 6764, 127487, 0, 0, 0, 0,
+ 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 118795, 0, 0, 127970,
+ 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 126642, 3675, 5207,
+ 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, 120535, 0, 8630,
+ 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 71336, 0, 0, 0, 64293,
+ 68098, 2635, 0, 0, 983837, 0, 983632, 7835, 70040, 0, 194988, 92285,
+ 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 983102, 0, 0, 70033, 4011,
+ 917616, 68101, 0, 7864, 4254, 65095, 983488, 5600, 3903, 127083, 10447,
+ 5598, 1207, 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597,
+ 194778, 194772, 9321, 983476, 983473, 983474, 0, 1719, 68356, 68354,
+ 9671, 1125, 4399, 127479, 917610, 983480, 7631, 5488, 7128, 120532, 0,
+ 5491, 0, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, 11768, 43043,
+ 6300, 0, 7122, 0, 4390, 454, 41397, 0, 9875, 7593, 194791, 92274, 118913,
+ 7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, 120037, 0, 43423,
+ 128683, 11989, 0, 0, 0, 0, 0, 8249, 128172, 0, 78531, 6640, 74806, 2598,
+ 513, 0, 6586, 8656, 0, 120710, 65008, 0, 194784, 194989, 194795, 983465,
+ 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983469,
+ 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983461,
+ 74486, 983459, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437,
+ 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, 11907,
+ 195000, 5690, 92255, 93992, 0, 43181, 13095, 0, 127857, 64498, 0, 9506,
+ 6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, 0, 0, 0, 0,
+ 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, 5226,
+ 12602, 94044, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725,
69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233,
- 127490, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, 41175, 0,
- 0, 0, 5296, 0, 42492, 43402, 92466, 3302, 0, 0, 6516, 6515, 6514, 6513,
- 6512, 0, 7856, 8690, 0, 0, 12122, 119602, 43976, 0, 1785, 92507, 68622,
- 65153, 194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322,
- 4643, 5132, 0, 6389, 0, 5143, 0, 8790, 128694, 0, 194802, 0, 8869,
- 120601, 0, 42060, 0, 0, 194804, 127012, 10270, 10286, 10318, 10382,
- 43529, 66477, 0, 0, 74170, 0, 3234, 0, 0, 74376, 43139, 118815, 127084,
- 120627, 8767, 0, 74489, 9695, 120746, 5201, 0, 6215, 12714, 6214, 13101,
- 0, 194999, 65268, 0, 0, 0, 11027, 0, 10059, 10511, 42075, 9767, 789,
- 1749, 78890, 127071, 0, 320, 0, 8647, 0, 3049, 0, 6471, 42071, 43156,
- 9925, 127356, 127355, 66478, 4960, 5549, 127359, 127346, 8485, 4671,
- 5418, 127350, 3351, 127006, 127351, 10610, 5414, 3064, 6212, 4286, 5421,
- 127344, 9554, 0, 127794, 127109, 6653, 128811, 0, 64510, 6213, 12885, 0,
- 119045, 64720, 0, 120759, 73741, 12603, 7131, 11430, 4566, 7843, 9317,
- 3801, 10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, 9183,
- 127361, 74458, 73825, 395, 5482, 5198, 8786, 10390, 74202, 5196, 43224,
- 6113, 42009, 5205, 0, 43307, 0, 118973, 0, 12134, 0, 0, 118843, 9126,
- 435, 0, 12014, 10377, 8093, 9079, 3203, 192, 65109, 3385, 0, 64430, 5383,
- 10294, 10326, 128178, 5738, 0, 3336, 78355, 5361, 3623, 41159, 0, 68112,
- 7872, 8581, 0, 1260, 3149, 5359, 0, 0, 7914, 5357, 92170, 128659, 2624,
- 5364, 0, 11431, 120030, 9101, 11058, 78288, 0, 78293, 42271, 78289,
- 42917, 120793, 0, 65566, 6717, 10619, 43360, 78385, 78384, 78383, 78382,
- 78381, 78380, 78379, 9319, 7097, 119055, 77906, 3232, 73824, 74581,
- 120632, 0, 0, 41889, 92453, 0, 1161, 41895, 74103, 9701, 8622, 0, 0,
- 73819, 120588, 5012, 77912, 41362, 0, 78296, 11921, 0, 11769, 0, 68609,
- 41364, 0, 74228, 41352, 41361, 0, 41366, 0, 3356, 0, 917, 68422, 119915,
- 7134, 8199, 78389, 119917, 677, 119916, 0, 119932, 127169, 0, 0, 0, 3349,
- 74125, 7022, 8927, 4739, 0, 5802, 0, 8615, 0, 0, 491, 0, 10190, 120698,
- 65837, 128820, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305, 10852, 0,
- 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 7124, 0, 0, 5815, 5171,
- 65539, 68612, 6932, 78315, 42394, 41878, 74849, 120621, 0, 5169, 11935,
- 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, 78287, 0, 9833,
- 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411, 3662, 9413,
- 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423, 5165, 5126,
- 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 7119, 9403, 9404, 3507,
- 9406, 7629, 0, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, 41130,
- 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, 64825,
- 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, 917922,
- 77825, 73828, 5448, 41058, 5446, 69709, 41322, 42211, 5442, 4190, 77834,
- 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, 65867,
- 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, 7111,
- 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, 9862,
- 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, 7125,
- 9819, 41357, 8011, 42885, 5507, 12044, 92636, 0, 10026, 5472, 7109, 1191,
- 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, 42876,
- 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, 0,
- 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 69731, 64633,
- 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 7137, 0,
- 128296, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199,
- 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, 5894,
- 0, 0, 41171, 92511, 74313, 0, 13162, 0, 3334, 0, 118803, 77881, 66022, 0,
- 0, 1651, 0, 8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, 0, 4002, 43626,
- 10442, 10676, 3344, 0, 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0,
- 0, 78853, 0, 78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858,
- 120359, 11012, 0, 78856, 92400, 77879, 4973, 8784, 77877, 74804, 77874,
- 77869, 77871, 42440, 0, 43118, 0, 42364, 6774, 6773, 917560, 120369,
- 10346, 10410, 78859, 9243, 2464, 74263, 6108, 3372, 0, 6247, 43117,
- 74526, 7121, 74166, 0, 120355, 92537, 0, 0, 195034, 0, 0, 0, 74217, 3354,
- 195037, 4192, 9289, 118999, 41191, 3876, 0, 127983, 120660, 43696, 43380,
- 0, 0, 0, 0, 11603, 0, 0, 6589, 128588, 194679, 0, 0, 0, 0, 0, 42572,
- 128264, 10630, 74827, 1963, 118889, 127978, 11654, 0, 7550, 10686, 5903,
- 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 0, 11013, 127927,
- 128300, 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 0, 43367, 64579,
+ 127490, 983433, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524,
+ 41175, 983440, 983437, 983438, 5296, 983436, 42492, 43402, 92466, 3302,
+ 0, 0, 6516, 6515, 6514, 6513, 6512, 0, 7856, 8690, 0, 0, 12122, 119602,
+ 43976, 0, 1785, 69925, 68622, 65153, 194810, 5138, 0, 0, 118869, 0, 4540,
+ 41181, 0, 6200, 0, 5134, 0, 322, 4643, 5132, 0, 6389, 128533, 5143, 0,
+ 8790, 128694, 0, 194802, 0, 8869, 69916, 0, 42060, 71326, 9648, 194804,
+ 127012, 10270, 10286, 10318, 10382, 43529, 66477, 0, 0, 74170, 0, 3234,
+ 0, 0, 74376, 43139, 118815, 127084, 120627, 8767, 0, 74489, 9695, 120746,
+ 5201, 0, 6215, 12714, 6214, 13101, 0, 194999, 65268, 0, 0, 0, 11027, 0,
+ 10059, 10511, 42075, 9767, 789, 1749, 78890, 127071, 983661, 320, 0,
+ 8647, 0, 3049, 0, 6471, 42071, 43156, 9925, 127356, 127355, 66478, 4960,
+ 5549, 127359, 127346, 8485, 4671, 5418, 127350, 3351, 127006, 127351,
+ 10610, 5414, 3064, 6212, 4286, 5421, 127344, 9554, 0, 94048, 127109,
+ 6653, 128811, 0, 64510, 6213, 12885, 0, 119045, 64720, 0, 120759, 73741,
+ 12603, 7131, 11430, 4566, 7518, 9317, 3801, 10342, 10406, 0, 119259,
+ 42576, 0, 5200, 126611, 917948, 0, 9183, 127361, 74458, 73825, 395, 5482,
+ 5198, 4349, 10390, 74202, 5196, 43224, 6113, 42009, 5205, 0, 43307, 0,
+ 118973, 0, 12134, 0, 0, 118843, 9126, 435, 0, 12014, 10377, 8093, 9079,
+ 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, 128178, 5738,
+ 983213, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260,
+ 3149, 5359, 120134, 0, 7914, 5357, 92170, 128659, 2624, 5364, 0, 11431,
+ 120030, 9101, 11058, 78288, 0, 78293, 42271, 78289, 42917, 120793, 0,
+ 65566, 6717, 10619, 43360, 78385, 78384, 11832, 78382, 78381, 78380,
+ 78379, 9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0,
+ 41889, 92453, 0, 1161, 41895, 74103, 9701, 8622, 0, 0, 73819, 120588,
+ 5012, 77912, 41362, 69862, 78296, 11921, 0, 11769, 0, 68609, 41364, 0,
+ 74228, 41352, 41361, 0, 41366, 0, 3356, 0, 917, 68422, 119915, 7134,
+ 8199, 78389, 119917, 677, 119916, 0, 119932, 127169, 0, 0, 0, 3349,
+ 74125, 7022, 8927, 4739, 0, 5802, 0, 8615, 0, 0, 491, 128819, 10190,
+ 120698, 65837, 128820, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305,
+ 10852, 0, 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 7124, 0, 0,
+ 5815, 5171, 65539, 68612, 6932, 74267, 42394, 41878, 74849, 120621, 0,
+ 5169, 11935, 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871,
+ 78287, 0, 9833, 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411,
+ 3662, 9413, 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423,
+ 5165, 5126, 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 7119, 9403,
+ 9404, 3507, 9406, 7629, 983617, 19925, 42669, 68463, 183, 43985, 2631, 0,
+ 10627, 41130, 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580,
+ 4332, 64825, 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0,
+ 574, 917922, 77825, 73828, 5448, 41058, 5446, 69709, 41322, 42211, 5442,
+ 4190, 77834, 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836,
+ 10859, 65867, 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839,
+ 2060, 0, 7111, 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351,
+ 119076, 0, 9862, 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503,
+ 8021, 0, 7125, 9819, 41357, 8011, 42885, 5507, 12044, 92636, 0, 10026,
+ 5472, 7109, 1191, 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267,
+ 42874, 8550, 42876, 5592, 2919, 0, 2675, 5595, 78411, 43762, 4367, 0, 0,
+ 5478, 5904, 5594, 0, 74150, 7291, 5590, 43761, 13067, 118909, 120372,
+ 983108, 9731, 69731, 64633, 77857, 77854, 77855, 77852, 77853, 77850,
+ 10750, 43714, 77858, 7137, 0, 128296, 12887, 10551, 194564, 77866, 77867,
+ 77864, 77865, 9929, 5199, 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839,
+ 55252, 73972, 1442, 0, 5894, 70069, 0, 41171, 92511, 74313, 0, 13162, 0,
+ 3334, 195010, 118803, 77881, 66022, 0, 0, 1651, 128771, 8861, 0, 0, 1142,
+ 0, 8271, 0, 983058, 126645, 12903, 0, 4002, 43626, 10442, 10676, 3344, 0,
+ 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, 78854,
+ 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, 120359, 11012, 0, 78856,
+ 92400, 77879, 4973, 8784, 77877, 74804, 77874, 77869, 77871, 42440, 0,
+ 43118, 0, 42364, 6774, 6773, 917560, 120369, 10346, 10410, 78859, 9243,
+ 2464, 74263, 6108, 3372, 0, 6247, 43117, 74526, 7121, 74166, 0, 120355,
+ 92537, 0, 0, 195034, 0, 0, 0, 70083, 3354, 195037, 4192, 9289, 118999,
+ 41191, 3876, 0, 70067, 120660, 43696, 43380, 0, 983091, 0, 0, 11603,
+ 983945, 0, 6589, 128588, 194679, 0, 0, 983691, 0, 0, 42572, 128264,
+ 10630, 74827, 1963, 11622, 127098, 11654, 0, 7550, 10686, 5903, 0, 78009,
+ 41329, 9662, 917937, 64698, 3366, 10399, 0, 5542, 11013, 127927, 128300,
+ 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 983664, 43367, 64579,
917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416,
- 12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 0, 9532,
- 66355, 0, 0, 917925, 64343, 195032, 128281, 195031, 0, 0, 195057, 11445,
- 0, 2112, 195056, 128814, 10185, 1021, 128130, 9507, 10210, 74544, 8023,
- 1200, 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493, 3343, 4424,
- 11047, 1885, 43268, 3896, 78626, 66497, 2947, 392, 7894, 4391, 68139, 0,
- 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0,
- 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 0, 8221,
- 78307, 41864, 0, 0, 0, 0, 167, 0, 78301, 0, 74211, 41897, 68477, 0,
- 917583, 0, 0, 2493, 0, 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385,
- 0, 92450, 0, 917573, 43030, 42027, 12114, 0, 917579, 64936, 194695, 0,
- 120629, 10561, 0, 8365, 120539, 0, 65841, 120787, 11601, 0, 74121, 0,
- 917575, 7834, 74159, 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0,
- 74157, 6327, 6724, 0, 128086, 92566, 0, 4817, 78446, 194759, 92536, 7043,
- 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761,
- 12343, 657, 195054, 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, 0, 0,
- 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 0, 917595, 65550, 260, 4816,
- 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, 195048, 41403, 119977, 0,
- 0, 41406, 43273, 74160, 119983, 73939, 92638, 119984, 119979, 41404,
- 1165, 119980, 4451, 13087, 0, 11284, 119987, 73855, 65155, 43014, 5439,
- 9363, 127558, 3375, 128869, 5900, 0, 7889, 2722, 42262, 0, 0, 128774, 0,
- 0, 0, 127810, 11401, 0, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, 127887, 0,
- 127381, 4868, 119967, 119966, 118798, 0, 0, 43161, 0, 92360, 0, 5182, 0,
- 120542, 0, 0, 4226, 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0,
- 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, 786, 0, 43174,
- 64340, 0, 0, 120723, 43026, 7612, 10132, 64413, 65025, 0, 0, 0, 0, 0,
- 68444, 0, 92437, 0, 119160, 10204, 92656, 0, 127809, 0, 1399, 0, 65217,
- 0, 8852, 0, 241, 128780, 4907, 0, 0, 7932, 9727, 128873, 74255, 8748, 0,
- 0, 0, 0, 42780, 0, 0, 0, 4217, 0, 8650, 0, 0, 0, 0, 118872, 43099, 3965,
- 119119, 6719, 0, 13300, 78439, 128261, 43057, 66588, 118991, 0, 0, 73815,
- 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, 43188,
- 2626, 7762, 0, 0, 0, 92601, 42825, 41854, 5304, 0, 78516, 6919, 8619,
- 119655, 10038, 66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0,
- 74311, 78497, 0, 10181, 0, 43624, 0, 7779, 0, 10195, 9479, 6029, 0,
- 92268, 9689, 0, 0, 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237,
- 69787, 2030, 0, 6027, 8370, 4322, 0, 65207, 0, 0, 0, 0, 0, 2735, 42831,
- 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, 0, 9576,
- 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, 7709, 41112,
- 0, 66560, 42041, 4572, 12876, 66561, 0, 6758, 0, 1615, 5855, 809, 0,
- 92283, 128316, 128004, 5799, 0, 0, 0, 7260, 0, 43031, 64425, 65128,
- 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, 0, 0, 0,
- 127060, 65828, 0, 283, 68665, 78813, 532, 78663, 0, 0, 120609, 0, 3370,
- 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 0, 0, 0, 65495, 64706,
- 0, 43344, 0, 7144, 9466, 78866, 9824, 0, 0, 0, 0, 915, 43425, 0, 0, 0, 0,
- 127178, 43264, 0, 0, 0, 0, 78864, 6730, 78862, 68161, 64550, 5186, 12890,
- 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, 77826, 0,
- 42562, 0, 0, 0, 128520, 11485, 6103, 127123, 0, 11718, 0, 12889, 92657,
- 127137, 0, 0, 0, 55245, 0, 1630, 128232, 65483, 0, 12565, 0, 65476,
- 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, 0, 64593, 512, 3376,
- 68210, 0, 0, 77892, 632, 12940, 77891, 42529, 78587, 0, 5957, 110593,
- 8926, 0, 0, 128273, 10745, 10174, 7379, 64581, 5386, 120686, 11713,
- 10633, 69708, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 0, 128038,
- 0, 0, 127174, 64278, 92370, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835,
- 119029, 0, 73823, 0, 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883,
- 0, 0, 128570, 12106, 0, 74207, 1755, 10482, 12863, 77898, 1163, 2951,
- 9522, 74079, 78266, 120674, 0, 3384, 69227, 10702, 830, 77902, 77899,
+ 12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 983605,
+ 9532, 66355, 0, 983228, 917925, 64343, 195032, 128281, 195031, 0, 195030,
+ 195057, 11445, 0, 2112, 195056, 128814, 10185, 1021, 128130, 9507, 10210,
+ 74544, 8023, 1200, 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493,
+ 3343, 4424, 11047, 1885, 43268, 3896, 78444, 66497, 2947, 392, 7894,
+ 4391, 68139, 983062, 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 64757,
+ 0, 3913, 0, 0, 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239,
+ 11791, 0, 0, 8221, 78307, 41864, 0, 0, 0, 0, 167, 983897, 78301, 983644,
+ 74211, 41897, 68477, 0, 917583, 983625, 94065, 2493, 0, 118811, 0, 0,
+ 64354, 0, 8777, 0, 406, 8884, 2385, 0, 92450, 0, 917573, 43030, 42027,
+ 12114, 0, 917579, 64936, 194695, 0, 120629, 10561, 0, 8365, 120539,
+ 983765, 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0,
+ 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0,
+ 128086, 92566, 69910, 4817, 78446, 194759, 92536, 7043, 9600, 11022, 0,
+ 0, 0, 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761, 12343, 657,
+ 195054, 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, 0, 0, 0, 4456,
+ 5206, 10720, 0, 42523, 127520, 0, 0, 917595, 65550, 260, 4816, 67658,
+ 10687, 0, 4821, 4466, 0, 195043, 4818, 195048, 41403, 119977, 0, 0,
+ 41406, 43273, 74160, 119983, 73939, 92638, 119984, 119979, 41404, 1165,
+ 119980, 4451, 13087, 0, 11284, 119987, 70097, 65155, 43014, 5439, 9363,
+ 70070, 3375, 128869, 5900, 93990, 7889, 2722, 42262, 0, 0, 128774, 0,
+ 2282, 0, 127810, 11401, 983813, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280,
+ 127887, 0, 127381, 4868, 119967, 119966, 118798, 0, 0, 43161, 0, 92360,
+ 0, 5182, 0, 120542, 0, 0, 4226, 119243, 12135, 5732, 4464, 0, 71330, 977,
+ 4458, 0, 0, 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0,
+ 786, 0, 43174, 64340, 0, 194767, 120723, 43026, 7612, 10132, 64413,
+ 65025, 0, 0, 0, 93956, 0, 68444, 0, 92437, 0, 119160, 10204, 92656, 0,
+ 127809, 983635, 1399, 983643, 65217, 0, 8852, 128571, 241, 128780, 4907,
+ 0, 983630, 7932, 9727, 128873, 74255, 8748, 0, 0, 983634, 0, 42780, 0, 0,
+ 0, 4217, 0, 8650, 0, 0, 0, 69900, 118872, 43099, 3965, 119119, 6719, 0,
+ 13300, 78439, 93971, 43057, 66588, 118991, 0, 0, 73815, 4420, 0, 6410,
+ 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, 43188, 2626, 7762, 0,
+ 0, 0, 92601, 42825, 41854, 5304, 0, 78516, 6919, 8619, 119655, 10038,
+ 66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0, 74311, 78497, 0,
+ 10181, 0, 43624, 0, 7779, 0, 10195, 9479, 6029, 0, 92268, 9689, 0, 65577,
+ 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, 69787, 2030, 0,
+ 6027, 8370, 4322, 0, 65207, 0, 983331, 983330, 983329, 983328, 2735,
+ 42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140,
+ 983919, 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063,
+ 7709, 41112, 983132, 66560, 42041, 4572, 12876, 66561, 983749, 6758,
+ 983917, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983320, 70100,
+ 983318, 7260, 983316, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616,
+ 120607, 9347, 128067, 6532, 0, 0, 0, 127060, 65828, 0, 283, 68665, 78813,
+ 532, 78663, 0, 983787, 120609, 0, 3370, 0, 11361, 5443, 78778, 8153,
+ 73767, 0, 10741, 0, 2298, 0, 983908, 65495, 64706, 983310, 43344, 983308,
+ 7144, 9466, 78866, 9824, 983303, 983302, 0, 0, 915, 43425, 0, 0, 0, 0,
+ 127178, 43264, 70096, 0, 0, 43038, 78864, 6730, 78862, 68161, 64550,
+ 5186, 7360, 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107,
+ 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983297,
+ 11718, 983295, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232,
+ 65483, 0, 12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690,
+ 65499, 0, 64593, 512, 3376, 68210, 0, 128677, 77892, 632, 12940, 77891,
+ 42529, 78587, 0, 5957, 110593, 8926, 983291, 983290, 128273, 10745,
+ 10174, 7379, 64581, 5386, 120686, 11713, 10633, 69708, 5056, 0, 0, 0,
+ 120773, 0, 9812, 0, 4460, 0, 0, 71307, 128038, 0, 0, 127174, 64278,
+ 92370, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, 119029, 0, 73823, 0,
+ 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 983278, 983277,
+ 128570, 12106, 983274, 74207, 1755, 10482, 12863, 77898, 1163, 2951,
+ 9522, 74079, 78266, 66604, 0, 3384, 69227, 10702, 830, 77902, 77899,
77900, 8451, 0, 0, 0, 69739, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0,
- 12239, 0, 0, 4441, 0, 0, 73940, 64352, 127513, 0, 411, 0, 9199, 0, 4056,
- 118992, 41890, 0, 2730, 41604, 0, 5428, 194743, 3364, 42265, 64437,
- 127935, 118816, 194742, 9684, 216, 0, 1401, 128053, 44012, 0, 0, 92585,
- 9158, 77842, 120664, 5768, 0, 0, 0, 484, 194739, 0, 0, 65895, 0, 0, 3338,
- 73935, 572, 7041, 2736, 67605, 0, 128680, 2794, 8807, 64491, 77847, 5438,
- 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, 77846, 194747, 9534, 0, 0,
- 0, 3430, 0, 0, 0, 0, 981, 0, 4330, 73929, 120536, 1824, 10908, 0, 7034,
- 41683, 64617, 0, 73754, 3957, 64358, 64547, 128259, 674, 63991, 0, 2946,
- 5354, 5251, 5328, 5307, 3759, 11411, 8364, 5123, 119628, 5281, 5469,
- 5121, 119245, 118993, 0, 5130, 0, 0, 77990, 0, 120726, 1221, 2733, 11746,
- 77991, 5216, 0, 0, 0, 0, 3468, 7033, 9230, 5939, 195052, 0, 0, 120677,
- 68400, 7278, 10321, 10289, 64613, 10385, 41706, 0, 0, 0, 0, 11739, 0,
- 41981, 0, 5938, 0, 0, 12448, 7576, 10401, 10337, 73852, 0, 13057, 0,
- 126976, 0, 10009, 0, 41703, 0, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0,
- 0, 0, 92457, 0, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 128340, 0,
- 0, 0, 10970, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 92345, 11468,
- 64636, 7575, 0, 2724, 0, 0, 12313, 110592, 515, 119947, 42791, 63987,
- 78286, 119943, 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629,
- 9141, 0, 78850, 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606,
- 3303, 41372, 11786, 9473, 66203, 66177, 92446, 11593, 43007, 4478, 66178,
- 0, 0, 2744, 0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961,
- 66198, 41880, 66188, 66197, 78148, 11955, 66190, 66191, 41111, 66189,
- 73788, 7788, 4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430,
- 78160, 55259, 78158, 128036, 5278, 4945, 42883, 4950, 0, 68625, 0, 7269,
- 0, 5964, 12908, 0, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0,
- 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931,
- 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, 41304, 824,
- 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, 119820, 119819,
- 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 119829, 119832, 4677,
- 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166,
- 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024, 1855, 0,
- 68669, 0, 92445, 127554, 0, 0, 119652, 2745, 11797, 0, 128159, 9202,
- 4654, 0, 0, 68638, 73993, 10525, 4649, 65209, 0, 0, 4648, 43080, 0, 0, 0,
- 6246, 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384,
- 43187, 8669, 0, 6821, 65093, 0, 78881, 2716, 0, 0, 0, 0, 68369, 120054,
+ 12239, 0, 0, 4441, 0, 983271, 73940, 64352, 127513, 983267, 411, 983265,
+ 9199, 983263, 4056, 118992, 41890, 0, 2730, 41604, 983928, 5428, 194743,
+ 3364, 42265, 64437, 127935, 118816, 194742, 9684, 216, 0, 1401, 128053,
+ 44012, 0, 0, 92585, 9158, 77842, 69905, 5768, 0, 0, 0, 484, 194739, 0, 0,
+ 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983255, 93962, 2794,
+ 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509,
+ 77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 78717, 0, 981, 0, 4330, 73929,
+ 120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547,
+ 128259, 674, 63991, 983243, 2946, 5354, 5251, 5328, 5307, 3759, 11411,
+ 8364, 5123, 119628, 5281, 5469, 5121, 119245, 118993, 0, 5130, 0, 0,
+ 77990, 0, 120726, 1221, 2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033,
+ 9230, 5939, 195052, 0, 0, 120677, 68400, 7278, 10321, 10289, 64613,
+ 10385, 41706, 0, 0, 983405, 0, 11739, 983418, 41981, 0, 5938, 0, 43766,
+ 12448, 7576, 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0,
+ 41703, 983629, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 92457, 0,
+ 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 128340, 0, 0, 0, 10970,
+ 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 92345, 11468, 64636, 7575, 0,
+ 2724, 0, 0, 12313, 110592, 515, 119947, 42791, 63987, 78286, 119943,
+ 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629, 9141, 0, 78850,
+ 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, 3303, 41372,
+ 11786, 9473, 66203, 66177, 92446, 11593, 43007, 4478, 66178, 0, 0, 2744,
+ 0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, 66198, 41880,
+ 66188, 11623, 78148, 11955, 66190, 66191, 41111, 66189, 73788, 7788,
+ 4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259,
+ 78158, 128036, 5278, 4945, 42883, 4950, 983430, 68625, 983428, 7269, 0,
+ 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983421, 443,
+ 983419, 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0,
+ 194931, 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, 41304,
+ 824, 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, 119820,
+ 119819, 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 69947, 119832,
+ 4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170,
+ 78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024,
+ 1855, 983404, 68669, 983402, 92445, 127554, 0, 127339, 119652, 2745,
+ 11797, 983410, 128159, 9202, 4654, 983406, 983408, 68638, 73993, 10525,
+ 4649, 65209, 983409, 0, 4648, 43080, 983398, 983399, 983396, 6246, 64950,
+ 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, 43187, 8669,
+ 983407, 6821, 65093, 0, 78881, 2716, 0, 983060, 983411, 0, 68369, 120054,
11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, 4662, 78033, 78032,
9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, 10130, 68450, 7811,
- 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 0, 0, 0,
- 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054, 194956,
- 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, 0, 9045, 78888, 4225, 19926,
- 78887, 12880, 65307, 4617, 78883, 0, 41732, 4616, 10518, 10423, 10359, 0,
- 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, 0, 41313, 522, 5368, 0,
- 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 4638, 0,
- 1790, 78242, 5965, 64363, 66569, 68646, 194968, 5376, 1835, 5335, 194966,
+ 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 983403,
+ 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054,
+ 194956, 9744, 78860, 7605, 4622, 119656, 983387, 94070, 983385, 983386,
+ 983383, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883,
+ 983378, 41732, 4616, 10518, 10423, 10359, 983372, 5958, 0, 983425, 4215,
+ 9789, 917941, 4321, 4621, 983381, 41313, 522, 5368, 0, 65803, 0, 5366,
+ 12201, 5372, 0, 983401, 0, 7720, 7390, 2696, 983392, 0, 4638, 983397,
+ 1790, 78242, 5965, 64363, 66569, 68646, 127833, 5376, 1835, 5335, 194966,
128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, 42094,
- 5331, 4634, 11928, 0, 5338, 4637, 128170, 5971, 42414, 0, 1268, 65097,
- 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, 0,
- 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, 74384, 0,
- 68377, 6248, 0, 0, 0, 42318, 92582, 5229, 4757, 0, 0, 2728, 4752, 64563,
- 65235, 5234, 0, 128145, 0, 10713, 7166, 0, 2622, 7460, 127302, 0, 0,
- 8954, 74760, 65189, 2632, 92230, 10108, 1011, 5574, 1853, 2709, 65139,
- 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, 5316, 0, 5314, 6451, 5572,
- 0, 5312, 0, 5525, 5330, 5319, 0, 0, 194907, 44003, 0, 0, 0, 120498,
- 127851, 195009, 0, 74022, 0, 64609, 68643, 120634, 0, 5721, 0, 5519,
- 8632, 66465, 11267, 73961, 92278, 5720, 0, 1692, 4219, 4610, 8696, 4305,
- 0, 4609, 43478, 4614, 541, 0, 5287, 5309, 5285, 68389, 5961, 4647, 56,
- 4216, 10577, 41381, 601, 4613, 0, 0, 92276, 4608, 64260, 41124, 5190,
- 67628, 0, 68145, 7086, 0, 119243, 67620, 0, 2734, 11074, 0, 67627, 43593,
- 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114, 119939, 0,
- 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392, 6239, 119956,
- 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254, 128047, 43291,
- 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724, 7193, 68137, 0,
- 5739, 41024, 4866, 0, 73904, 0, 4869, 120563, 0, 4223, 128201, 6650, 0,
- 0, 0, 127890, 4870, 120445, 68661, 6716, 78176, 68667, 68382, 68676,
- 127925, 10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, 2732, 42734, 745,
- 0, 195097, 92195, 4777, 7821, 0, 68631, 42775, 0, 194954, 0, 3097, 0,
- 5966, 0, 4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, 8577, 128562, 68196,
- 43285, 10216, 4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776,
- 73818, 11492, 8700, 0, 13176, 68363, 10426, 0, 917599, 10362, 194706,
- 1715, 4849, 8242, 9561, 73922, 43278, 42635, 0, 0, 5963, 917926, 0, 0,
- 4850, 0, 1607, 466, 4853, 118995, 4854, 127918, 5164, 0, 1350, 5124,
- 64420, 1993, 5362, 8471, 2708, 92471, 12445, 3785, 234, 3199, 0, 41268,
- 4848, 2530, 917909, 2068, 1964, 0, 73762, 10458, 0, 8576, 78543, 0, 2704,
- 4794, 0, 68211, 8322, 4797, 5753, 0, 2694, 4792, 0, 2439, 65104, 69804,
- 0, 303, 0, 92622, 0, 2437, 0, 4221, 4844, 118869, 0, 0, 0, 0, 0, 43292,
- 0, 2441, 10739, 65090, 0, 119327, 0, 2451, 2714, 119326, 0, 43379, 4937,
+ 5331, 4634, 11928, 983594, 5338, 4637, 128170, 5971, 42414, 0, 1268,
+ 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758,
+ 983366, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231,
+ 74384, 983370, 68377, 6248, 983354, 983355, 983352, 42318, 92582, 5229,
+ 4757, 0, 0, 2728, 4752, 64563, 65235, 5234, 0, 128145, 0, 10713, 7166, 0,
+ 2622, 7460, 127302, 0, 0, 8954, 74760, 65189, 2632, 42617, 10108, 1011,
+ 5574, 1853, 2709, 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 42177,
+ 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983412,
+ 983863, 194907, 44003, 0, 983472, 983415, 120498, 127851, 195009, 983856,
+ 74022, 983414, 64609, 68643, 120634, 983481, 5721, 983393, 5519, 8632,
+ 66465, 11267, 73961, 92278, 5720, 983344, 1692, 4219, 4610, 8696, 4305,
+ 0, 4609, 43478, 4614, 541, 983347, 5287, 5309, 5285, 68389, 5961, 4647,
+ 56, 4216, 10577, 41381, 601, 4613, 983341, 983338, 77849, 4608, 64260,
+ 41124, 5190, 67628, 0, 68145, 7086, 0, 67998, 67620, 0, 2734, 11074, 0,
+ 67627, 43593, 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114,
+ 119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392,
+ 6239, 119956, 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254,
+ 128047, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724,
+ 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 983831, 4869, 120563, 0,
+ 4223, 128201, 6650, 126509, 0, 983455, 127890, 4870, 120445, 68661, 6716,
+ 78176, 68667, 68382, 68676, 127925, 10122, 4864, 66568, 4144, 7937, 0,
+ 6245, 68652, 2732, 42734, 745, 0, 195097, 92195, 4777, 7821, 0, 68631,
+ 42775, 0, 194954, 0, 3097, 0, 5966, 983478, 4778, 0, 10863, 0, 4781, 0,
+ 64407, 0, 128323, 8577, 128562, 68196, 43285, 10216, 4782, 0, 0, 120757,
+ 68618, 12325, 43056, 8717, 0, 0, 4776, 73818, 11492, 8700, 0, 13176,
+ 68363, 10426, 0, 917599, 10362, 194706, 1715, 4849, 8242, 9561, 73922,
+ 43278, 42635, 0, 0, 5963, 917926, 0, 0, 4850, 0, 1607, 466, 4853, 118995,
+ 4854, 127918, 5164, 983861, 1350, 5124, 64420, 1993, 5362, 8471, 2708,
+ 92471, 12445, 3785, 234, 3199, 0, 41268, 4848, 2530, 917909, 2068, 1964,
+ 0, 73762, 10458, 0, 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, 4797,
+ 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 983416, 303, 983101, 92622,
+ 983417, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441,
+ 10739, 65090, 0, 119327, 126541, 2451, 2714, 119326, 0, 43379, 4937,
43376, 753, 5849, 10597, 43089, 11722, 9248, 92555, 42879, 11725, 0, 0,
2726, 3107, 73958, 4941, 64937, 119233, 9140, 1408, 5261, 4607, 0, 181,
- 0, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, 0, 0, 4964,
- 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873,
- 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0,
- 9830, 43642, 389, 10893, 7521, 127879, 4872, 5463, 0, 3125, 9567, 0,
- 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, 11494, 0, 9563, 10865,
- 74570, 43279, 64186, 0, 78714, 64191, 64190, 8898, 64188, 0, 41030,
- 78836, 0, 917835, 78820, 917834, 0, 78805, 41031, 78801, 11960, 6745,
- 3082, 0, 78539, 73919, 10573, 41744, 7079, 5856, 127043, 5163, 78809,
- 128162, 1817, 66724, 78538, 0, 10564, 7763, 13077, 41813, 4400, 41745,
- 64207, 10275, 8925, 10371, 10307, 41814, 4248, 0, 0, 4541, 6299, 64204,
- 64203, 64201, 64200, 64199, 64198, 0, 42156, 78688, 0, 64193, 64192,
- 65223, 9943, 64197, 64196, 64195, 64194, 13282, 64175, 64174, 64173,
- 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, 12163, 3108, 9745, 64167,
- 64166, 64165, 64164, 2110, 92176, 64169, 64168, 64949, 10972, 10251,
- 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, 120378, 0, 11352,
- 550, 9910, 0, 0, 66579, 11551, 0, 195080, 9504, 7187, 0, 10373, 0,
- 120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552, 65222, 6998,
- 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, 1146, 5065,
- 78196, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, 0, 78200,
- 78201, 5062, 1264, 64817, 13254, 11697, 0, 9785, 64716, 0, 3933, 74559,
- 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 0, 42130, 0, 5151,
- 917829, 917823, 0, 0, 0, 7620, 3800, 65122, 0, 0, 8355, 7854, 0, 954,
- 64927, 4185, 41045, 127141, 41438, 41439, 68666, 10711, 4593, 127745,
- 120584, 0, 64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, 5166, 9888,
- 127800, 5148, 42834, 0, 78205, 78206, 43787, 78204, 64131, 3119, 917814,
- 0, 3060, 64135, 9986, 0, 77876, 636, 11698, 0, 0, 9916, 11701, 7836,
- 42741, 64137, 8320, 78640, 8863, 92431, 119960, 1477, 43289, 0, 74358,
- 8618, 0, 9908, 0, 0, 0, 3937, 12312, 0, 0, 0, 64781, 912, 6349, 4536,
- 119963, 74532, 0, 6244, 0, 194580, 3935, 120665, 0, 0, 11950, 5392,
- 42248, 65129, 68656, 5397, 0, 12046, 12599, 0, 0, 5395, 0, 5393, 354,
- 68615, 119948, 78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780,
- 0, 0, 128874, 0, 0, 43297, 0, 4311, 4644, 8818, 0, 128186, 0, 7145, 3918,
- 66452, 3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, 813,
- 119945, 68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, 42117,
- 92287, 128224, 0, 0, 74046, 120583, 4911, 988, 917807, 0, 0, 43061, 7054,
+ 983422, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257,
+ 983601, 0, 4964, 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180,
+ 64179, 9482, 4873, 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500,
+ 0, 119024, 78028, 92408, 9830, 43642, 389, 10893, 7521, 127879, 4872,
+ 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0,
+ 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983431, 78714, 64191,
+ 64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805,
+ 41031, 78801, 11960, 6745, 3082, 983429, 78539, 73919, 10573, 41744,
+ 7079, 5856, 127043, 5163, 78809, 128162, 1817, 66724, 78538, 0, 10564,
+ 7763, 13077, 41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, 41814,
+ 4248, 0, 0, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 126471,
+ 42156, 78688, 0, 64193, 64192, 65223, 9943, 64197, 64196, 64195, 64194,
+ 13282, 64175, 64174, 64173, 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543,
+ 12163, 3108, 9745, 64167, 64166, 64165, 64164, 2110, 92176, 64169, 64168,
+ 64949, 10972, 10251, 10247, 42768, 715, 2295, 43299, 9453, 5348, 10943,
+ 120378, 0, 11352, 550, 9910, 126705, 0, 66579, 11551, 0, 195080, 9504,
+ 7187, 0, 10373, 0, 120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552,
+ 65222, 6998, 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827,
+ 1146, 5065, 69890, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809,
+ 0, 78200, 78201, 5062, 1264, 64817, 13254, 11697, 126598, 9785, 64716, 0,
+ 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983864,
+ 42130, 0, 5151, 917829, 917823, 0, 93980, 0, 7620, 3800, 65122, 0, 0,
+ 8355, 7854, 0, 954, 64927, 4185, 41045, 127141, 41438, 41439, 68666,
+ 10711, 4593, 127745, 120584, 983400, 64774, 8053, 10532, 66727, 0, 0, 0,
+ 64759, 6381, 5166, 9888, 127800, 5148, 42834, 0, 78205, 78206, 43787,
+ 78204, 64131, 3119, 917814, 0, 3060, 64135, 9986, 0, 77876, 636, 11698,
+ 0, 983443, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431,
+ 119960, 1477, 43289, 0, 74358, 8618, 983394, 9908, 983972, 0, 0, 3937,
+ 12312, 0, 983395, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244,
+ 92209, 71341, 3935, 120665, 983468, 0, 11950, 5392, 42248, 65129, 68656,
+ 5397, 0, 12046, 12599, 0, 128261, 5395, 0, 5393, 354, 68615, 119948,
+ 78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 0, 128874,
+ 0, 0, 43297, 983079, 4311, 4644, 8818, 0, 128186, 0, 7145, 3918, 66452,
+ 3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, 813, 119945,
+ 68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, 42117, 92287,
+ 128224, 0, 0, 74046, 43745, 4911, 988, 917807, 0, 983460, 43061, 7054,
64147, 0, 64920, 68195, 6698, 118933, 92506, 0, 120006, 11981, 12202, 0,
11032, 67654, 6093, 11608, 975, 68662, 65843, 170, 0, 0, 4169, 0, 41859,
6058, 120401, 13203, 120657, 0, 0, 68657, 9818, 10178, 10324, 42106,
5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, 4742, 120564, 92391,
- 73736, 0, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, 42108,
- 0, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, 0, 127331,
- 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, 3928, 917870, 43378,
- 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, 4171, 12008, 6251, 3923,
- 1490, 0, 119591, 0, 40972, 5245, 0, 10114, 42001, 41888, 4845, 8332,
- 40974, 64347, 4840, 9077, 78346, 1747, 917849, 4825, 69240, 917852,
- 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, 1472, 917859, 6687, 1274,
- 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, 119559, 4830, 9134,
- 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, 10614, 120390, 0, 1888,
- 1960, 7861, 917856, 78524, 41836, 43012, 6052, 6064, 54, 43009, 12214, 0,
- 6211, 0, 358, 41997, 41833, 11442, 10758, 65774, 0, 120384, 64115, 92221,
- 0, 0, 0, 119053, 0, 12765, 64118, 126998, 12962, 0, 0, 4017, 12827, 5241,
- 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844,
- 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, 0, 66202, 8957, 4139,
- 0, 0, 0, 0, 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 0, 4726,
- 0, 0, 0, 917904, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0,
- 128294, 64212, 41020, 1382, 64209, 64216, 64215, 64214, 1656, 41831, 0,
+ 73736, 983356, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741,
+ 42108, 983346, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620,
+ 917916, 127331, 65549, 9496, 64598, 118866, 983358, 7876, 68132, 917872,
+ 3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0,
+ 4171, 12008, 6251, 3923, 1490, 0, 119591, 126512, 40972, 5245, 0, 10114,
+ 42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849,
+ 4825, 69240, 917852, 68655, 0, 983380, 0, 0, 68628, 983339, 9850, 118937,
+ 367, 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261,
+ 11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 126626, 64101, 0, 0,
+ 4824, 10614, 119659, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012,
+ 6052, 6064, 54, 43009, 12214, 0, 6211, 0, 358, 41997, 41833, 11442,
+ 10758, 65774, 0, 120384, 64115, 92221, 70018, 0, 0, 119053, 0, 12765,
+ 64118, 126998, 12962, 0, 126580, 4017, 12827, 5241, 120392, 0, 41118,
+ 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, 917564, 0, 11363,
+ 12057, 11917, 1567, 74000, 4721, 126641, 66202, 8957, 4139, 0, 0, 0, 0,
+ 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983375, 4726, 0,
+ 194892, 0, 128321, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0,
+ 128294, 64212, 41020, 1382, 64209, 64216, 44002, 64214, 1656, 41831, 0,
0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, 41845,
3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, 0,
- 7935, 2420, 0, 1114, 92599, 67585, 78675, 120053, 92350, 120051, 3938,
+ 7935, 2420, 0, 1114, 92599, 67585, 70104, 120053, 92350, 120051, 3938,
120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955,
6452, 4713, 128196, 66249, 917885, 917890, 917891, 65152, 719, 120044,
78623, 120042, 6713, 4532, 65412, 69822, 10868, 4717, 2349, 5902, 66450,
4712, 917902, 917899, 917900, 65416, 8155, 4718, 3942, 4714, 9625, 0,
- 6383, 194744, 12006, 128565, 0, 0, 0, 0, 65414, 6454, 1229, 0, 66437,
- 66025, 78699, 0, 42500, 120508, 4809, 9623, 917874, 78694, 917880,
+ 6383, 194744, 12006, 128565, 0, 0, 0, 0, 65414, 6454, 1229, 126606,
+ 66437, 66025, 78699, 0, 42500, 120508, 4809, 9623, 917874, 78694, 917880,
917877, 917878, 65405, 68159, 12893, 917882, 5365, 4545, 8901, 92421,
119555, 4813, 128262, 0, 5925, 4808, 64330, 0, 65475, 118940, 195028,
- 4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 0, 414, 65404, 0, 195027,
+ 4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 71335, 414, 65404, 0, 195027,
6456, 73820, 0, 6691, 42193, 92225, 128171, 0, 74495, 0, 0, 0, 118820,
9751, 65407, 128085, 11770, 3919, 0, 0, 65061, 0, 0, 0, 12235, 0, 0,
- 127233, 64092, 0, 64080, 0, 64090, 0, 0, 10162, 10310, 0, 8454, 127888,
- 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732, 0, 0, 0,
- 0, 0, 8896, 0, 375, 6976, 66582, 119005, 0, 0, 0, 119202, 119203, 12526,
- 43120, 2315, 0, 1938, 119197, 0, 4529, 119200, 119201, 119198, 119199,
- 69692, 0, 69698, 13150, 64492, 0, 0, 0, 12902, 0, 42891, 66327, 74298, 0,
- 10799, 69690, 2587, 66372, 0, 4193, 92250, 4241, 0, 7998, 0, 0, 0, 0,
- 2316, 118821, 0, 0, 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 0, 3762,
- 10015, 127335, 119232, 0, 41590, 0, 92378, 3780, 7485, 5779, 0, 42037, 0,
- 3906, 12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0,
- 0, 0, 0, 0, 0, 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478,
- 43310, 7231, 0, 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 0, 119237,
- 0, 128805, 4470, 119613, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756,
- 127143, 0, 5377, 120585, 68143, 1688, 78245, 0, 69685, 0, 0, 0, 44020,
- 6808, 41319, 1300, 10650, 41692, 64505, 4668, 0, 119624, 1465, 10850,
+ 127233, 64092, 983462, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454,
+ 127888, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732,
+ 78116, 0, 983139, 0, 983074, 8896, 0, 375, 6976, 66582, 119005, 983865,
+ 0, 983426, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529,
+ 119200, 119201, 119198, 119199, 69692, 983424, 69698, 13150, 64492, 0, 0,
+ 2291, 12902, 0, 42891, 66327, 74298, 917857, 10799, 69690, 2587, 66372,
+ 0, 4193, 92250, 4241, 983057, 7998, 0, 0, 0, 126640, 2316, 118821, 0, 0,
+ 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 983877, 3762, 10015, 120672,
+ 119232, 0, 41590, 0, 70098, 3780, 7485, 5779, 0, 42037, 0, 3906, 12349,
+ 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, 0, 0, 0, 0, 0,
+ 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0,
+ 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 983743, 119237, 0, 128805,
+ 4470, 11826, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0,
+ 5377, 120585, 68143, 1688, 78245, 983348, 69685, 983747, 0, 0, 44020,
+ 6808, 41319, 1300, 10650, 41692, 64505, 2290, 0, 119624, 1465, 10850,
3943, 0, 41205, 41315, 118961, 0, 0, 5352, 0, 0, 8839, 41314, 7384, 7785,
41204, 127322, 41209, 69637, 92241, 43607, 0, 0, 5420, 3897, 10134, 0,
74417, 4018, 7150, 68127, 0, 0, 0, 0, 127526, 2561, 68621, 3542, 7148,
12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, 78751, 7146, 0, 65150,
- 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 0, 69641, 10753,
+ 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 983427, 69641, 10753,
10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028,
- 0, 0, 0, 2020, 0, 4022, 128783, 0, 77923, 0, 41691, 0, 0, 74329, 0,
- 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, 0,
- 128198, 0, 118931, 119630, 13123, 10846, 3450, 127360, 7397, 118807, 0,
- 42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 69634, 9367,
- 593, 41085, 3999, 65226, 41713, 12764, 0, 64409, 3596, 0, 0, 9763,
+ 0, 0, 67996, 2020, 0, 4022, 128783, 0, 77923, 126593, 41691, 0, 0, 74329,
+ 0, 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904,
+ 0, 128198, 0, 118931, 119630, 13123, 10846, 3450, 127360, 7397, 118807,
+ 0, 42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 69634,
+ 9367, 593, 41085, 3999, 65226, 41713, 12764, 0, 64409, 3596, 0, 0, 9763,
120280, 92192, 12347, 124, 12981, 41127, 2092, 92687, 0, 0, 0, 10820,
- 43987, 0, 0, 1769, 41715, 2463, 78489, 0, 12770, 0, 1538, 0, 43124, 0,
- 195058, 7795, 120300, 0, 4828, 1258, 127802, 2006, 0, 0, 9498, 127032,
+ 43987, 0, 0, 1769, 41715, 2463, 78489, 0, 12770, 126500, 1538, 0, 43124,
+ 0, 195058, 7795, 120300, 0, 4828, 1258, 127802, 2006, 0, 0, 9498, 127032,
127033, 120289, 120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650,
4491, 1961, 42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 0,
68675, 128054, 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0,
0, 65292, 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879,
- 55223, 0, 0, 41826, 8865, 6402, 0, 13279, 7917, 120340, 0, 7733, 0, 4998,
- 0, 92332, 41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, 2014,
- 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949, 0, 0, 0, 2015,
- 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 10135, 65909,
- 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833, 0, 119351,
- 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078, 0, 0, 4837,
- 127061, 770, 0, 811, 0, 41042, 917551, 41318, 64427, 0, 0, 78848, 3895,
- 0, 74341, 3976, 0, 42859, 10193, 3116, 7747, 0, 0, 0, 0, 0, 43686, 78846,
- 41877, 0, 2871, 64614, 128785, 999, 0, 6345, 41876, 2663, 2017, 0, 0,
- 11040, 10150, 0, 64308, 1522, 597, 4775, 12555, 12571, 12550, 12583,
- 12560, 2019, 12556, 12584, 3092, 0, 12562, 4783, 12566, 12569, 12554, 0,
- 10812, 78851, 0, 0, 3078, 1402, 0, 128275, 0, 0, 119248, 394, 3088, 0,
- 92172, 0, 3991, 64391, 0, 0, 424, 66328, 1999, 69659, 73914, 0, 0, 0, 0,
- 42231, 8246, 0, 0, 0, 41840, 0, 2377, 1298, 64011, 12572, 11318, 12557,
- 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, 48, 0, 9480, 481, 0,
- 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, 9430, 9431, 9432, 9433,
- 9434, 9435, 3984, 9437, 0, 0, 9424, 9425, 9426, 9427, 9428, 9429, 64758,
- 2362, 9655, 0, 2004, 9096, 9782, 128848, 9172, 128545, 19965, 0, 5955,
- 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 92448, 65210, 8798, 0, 92165,
- 1392, 0, 0, 127364, 10606, 8065, 118805, 10353, 10417, 0, 0, 64524,
- 92418, 4019, 0, 0, 43280, 8219, 68402, 1812, 0, 0, 0, 0, 42410, 74448,
- 119132, 6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 0,
- 68678, 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775,
- 64760, 11766, 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733,
- 36, 0, 5153, 41805, 0, 73735, 763, 41808, 64910, 0, 2009, 0, 0, 127142,
- 9640, 119951, 0, 120695, 8621, 0, 12852, 3031, 0, 64361, 0, 182, 194718,
- 92716, 92598, 119950, 0, 9058, 366, 0, 9892, 5969, 11754, 10848, 4570,
- 65301, 44013, 4255, 0, 10102, 41189, 4003, 41026, 68109, 13293, 41192,
- 69635, 0, 42251, 0, 42534, 65179, 11287, 6128, 0, 11034, 10923, 64423, 0,
- 65506, 0, 65861, 74083, 92600, 9932, 0, 92423, 119955, 0, 9817, 0,
- 120140, 0, 12117, 66586, 4183, 10540, 66250, 9063, 127045, 0, 119954, 0,
- 12897, 3792, 2011, 0, 6065, 43160, 0, 194715, 8692, 41186, 41816, 41023,
- 41818, 41187, 11659, 7922, 12614, 2005, 8523, 78002, 0, 7513, 1863, 4710,
- 0, 5956, 7621, 78006, 92624, 4705, 716, 78004, 0, 4704, 120040, 120270,
- 42241, 161, 43977, 74546, 66214, 4706, 0, 0, 42672, 4709, 10680, 0,
- 43293, 119944, 0, 119164, 120328, 92467, 0, 1700, 119223, 0, 0, 128119,
- 4004, 0, 10968, 43296, 0, 8506, 0, 0, 126996, 1005, 937, 78216, 4734,
- 2870, 0, 78218, 0, 7463, 4729, 0, 235, 1384, 4728, 0, 120420, 92490,
- 120331, 8109, 43105, 0, 4730, 447, 13186, 1513, 4733, 120415, 0, 0,
- 42527, 12911, 43427, 1383, 8565, 2469, 120024, 6690, 6156, 68117, 43439,
- 7993, 4288, 120416, 2674, 13238, 11922, 0, 120330, 3510, 13234, 0,
- 120407, 5605, 42095, 11364, 0, 1380, 65617, 120253, 120261, 13196, 13197,
- 120309, 120682, 9495, 119346, 0, 5959, 0, 73976, 120305, 43371, 6941,
- 119349, 13205, 13211, 5801, 12769, 65905, 41697, 1283, 120302, 4779, 0,
- 3719, 4006, 0, 19957, 128773, 2021, 119332, 120699, 119150, 43028, 65493,
- 41838, 3875, 5962, 64341, 92616, 9814, 43457, 5827, 3314, 7787, 78234,
- 65494, 68153, 0, 0, 120636, 64531, 120692, 194626, 0, 0, 66316, 65467,
- 5771, 41298, 0, 9742, 521, 0, 10800, 0, 8404, 194625, 483, 7096, 7089,
- 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 0, 65782, 9841,
- 8843, 12145, 92470, 10074, 78548, 0, 3769, 0, 0, 0, 0, 9573, 0, 65290,
- 8849, 0, 65855, 65112, 1796, 120505, 0, 69665, 8164, 41301, 3502, 0,
- 7388, 10621, 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608,
- 10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639,
- 1390, 0, 0, 421, 43536, 5846, 120120, 4130, 127775, 7595, 42588, 7600,
- 120121, 66035, 0, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 0,
- 2370, 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 92547, 6290,
+ 55223, 0, 128071, 41826, 8865, 6402, 0, 13279, 7917, 74755, 0, 7733, 0,
+ 4998, 983887, 92332, 41950, 0, 4268, 0, 0, 70061, 4013, 0, 10881, 0, 0,
+ 0, 74788, 2014, 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949,
+ 0, 0, 0, 2015, 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094,
+ 10135, 65909, 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833,
+ 983053, 119351, 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078,
+ 0, 0, 4837, 127061, 770, 0, 811, 0, 41042, 917551, 41318, 64427, 0,
+ 128208, 78848, 3895, 0, 74341, 3976, 0, 42859, 10193, 3116, 7747, 0, 0,
+ 0, 0, 0, 43686, 78846, 41877, 0, 2871, 64614, 128785, 999, 0, 6345,
+ 41876, 2663, 2017, 0, 0, 11040, 10150, 0, 64308, 1522, 597, 4775, 12555,
+ 12571, 12550, 12583, 12560, 2019, 12556, 12584, 3092, 0, 12562, 4783,
+ 12566, 12569, 12554, 0, 10812, 78851, 0, 0, 3078, 1402, 0, 128275, 0, 0,
+ 119248, 394, 3088, 0, 92172, 0, 3991, 64391, 0, 128524, 424, 66328, 1999,
+ 69659, 73914, 0, 0, 0, 0, 42231, 8246, 0, 0, 0, 41840, 983609, 2377,
+ 1298, 64011, 12572, 11318, 12557, 12559, 12570, 7479, 1003, 2373, 9446,
+ 7481, 9448, 48, 0, 9480, 481, 0, 9438, 9439, 9440, 9441, 8465, 9443,
+ 9444, 9445, 9430, 9431, 9432, 9433, 9434, 9435, 3984, 9437, 0, 0, 9424,
+ 9425, 9426, 9427, 9428, 9429, 64758, 2362, 9655, 0, 2004, 9096, 9782,
+ 128848, 9172, 128545, 19965, 0, 5955, 67666, 1108, 0, 74773, 0, 0, 64782,
+ 3926, 92448, 65210, 8798, 0, 92165, 1392, 0, 0, 127364, 10606, 8065,
+ 118805, 10353, 10417, 0, 0, 64524, 92418, 4019, 0, 983280, 43280, 8219,
+ 68402, 1812, 119963, 983683, 0, 126488, 42410, 74448, 119132, 6054,
+ 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983253, 68678,
+ 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775, 64760,
+ 11766, 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, 36, 0,
+ 5153, 41805, 0, 73735, 763, 41808, 64910, 983130, 2009, 0, 0, 127142,
+ 9640, 119951, 0, 120695, 8621, 120523, 12852, 3031, 983050, 64361, 0,
+ 182, 194718, 92716, 92598, 119950, 42613, 9058, 366, 0, 9892, 5969,
+ 11754, 10848, 4570, 65301, 44013, 4255, 127889, 10102, 41189, 4003,
+ 41026, 68109, 13293, 41192, 69635, 0, 42251, 0, 42534, 65179, 11287,
+ 6128, 0, 11034, 10923, 64423, 0, 65506, 0, 65861, 74083, 92600, 9932, 0,
+ 92423, 119955, 0, 9817, 0, 120140, 0, 12117, 66586, 4183, 10540, 66250,
+ 9063, 127045, 0, 119954, 0, 12897, 3792, 2011, 0, 6065, 43160, 0, 194715,
+ 8692, 41186, 41816, 41023, 41818, 41187, 11659, 7922, 12614, 2005, 8523,
+ 78002, 0, 7513, 1863, 4710, 0, 5956, 7621, 78006, 92624, 4705, 716,
+ 78004, 0, 4704, 120040, 120270, 42241, 161, 43977, 74546, 66214, 4706, 0,
+ 69914, 42672, 4709, 10680, 119065, 43293, 119944, 0, 119164, 120328,
+ 92467, 10187, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983633,
+ 8506, 0, 0, 126996, 1005, 937, 78216, 4734, 2870, 0, 78218, 983109, 7463,
+ 4729, 0, 235, 1384, 4728, 0, 120420, 92490, 74449, 8109, 43105, 983174,
+ 4730, 447, 13186, 1513, 4733, 120415, 0, 0, 42527, 12911, 43427, 1383,
+ 8565, 2469, 120024, 6690, 6156, 68117, 43439, 7993, 4288, 120416, 2674,
+ 13238, 11922, 0, 120330, 3510, 13234, 0, 120407, 5605, 42095, 11364, 0,
+ 1380, 65617, 120253, 120261, 13196, 13197, 120309, 120682, 9495, 119346,
+ 0, 5959, 67984, 73976, 120305, 43371, 6941, 119349, 13205, 13211, 5801,
+ 12769, 65905, 41697, 1283, 120302, 4779, 0, 3719, 4006, 983569, 19957,
+ 128773, 2021, 119332, 120699, 119150, 43028, 65493, 41838, 3875, 5962,
+ 64341, 92616, 9814, 43457, 5827, 3314, 7787, 78234, 65494, 68153, 0, 0,
+ 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, 5771, 41298, 983785,
+ 9742, 521, 0, 10800, 92222, 8404, 194625, 483, 7096, 7089, 66323, 928, 0,
+ 0, 119018, 10599, 11586, 3989, 10971, 43748, 65782, 9841, 8843, 12145,
+ 92470, 10074, 78548, 0, 3769, 0, 0, 0, 983107, 9573, 0, 65290, 8849, 0,
+ 65855, 65112, 1796, 120505, 0, 69665, 8164, 41301, 3502, 0, 7388, 10621,
+ 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608, 10354, 10418,
+ 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639, 1390, 0, 0, 421,
+ 43536, 5846, 120120, 4130, 127775, 7595, 42588, 7600, 120121, 66035,
+ 983904, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 11831, 2370,
+ 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 69843, 6290,
65374, 120451, 2390, 3944, 66628, 120434, 0, 6135, 3118, 74265, 119093,
- 120446, 0, 0, 8127, 8975, 64739, 7943, 0, 0, 10618, 2584, 0, 0, 0, 9998,
- 0, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 74809, 120130, 4267,
- 1631, 42206, 127866, 0, 195046, 65700, 66562, 0, 64645, 0, 0, 0, 12586,
- 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 0, 7793, 78275, 9328, 0,
- 78393, 12604, 0, 6615, 67650, 92344, 3986, 44025, 0, 8912, 64555, 7409,
- 0, 0, 9541, 78276, 0, 11275, 8540, 11498, 0, 0, 41040, 2459, 0, 13060,
- 41041, 74413, 0, 0, 0, 68427, 10450, 12551, 41043, 7020, 120353, 3765, 0,
- 0, 1606, 120348, 120351, 3093, 68436, 0, 0, 120649, 0, 0, 4312, 74091,
- 120337, 120336, 11923, 4023, 120333, 5763, 120335, 4827, 10894, 12810,
- 64406, 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 0, 11973,
+ 120446, 0, 0, 8127, 8975, 64739, 7943, 983734, 0, 10618, 2584, 0, 0, 0,
+ 9998, 128564, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 70075,
+ 120130, 4267, 1631, 42206, 77983, 0, 195046, 65700, 66562, 0, 64645, 0,
+ 0, 126588, 12586, 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 983788,
+ 7793, 78275, 9328, 119104, 78393, 12604, 0, 6615, 2285, 92344, 3986,
+ 44025, 0, 8912, 64555, 7409, 0, 983350, 9541, 78276, 0, 11275, 8540,
+ 11498, 0, 983349, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0,
+ 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983342, 0, 1606, 120348,
+ 120351, 3093, 68436, 0, 983061, 119613, 0, 0, 4312, 74091, 120337,
+ 120336, 11923, 4023, 120333, 5763, 94015, 4827, 10894, 12810, 64406,
+ 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 118837, 11973,
13089, 4293, 120329, 42224, 42758, 12196, 42837, 42226, 119319, 0,
- 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 0, 0, 4895,
- 65358, 0, 4359, 585, 2383, 3509, 194920, 486, 4290, 5758, 127546, 0, 0,
- 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 0, 2376, 0, 119320, 0,
- 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0,
- 0, 0, 0, 0, 0, 74188, 120241, 0, 0, 120047, 128575, 0, 0, 120049, 0,
- 1847, 0, 10339, 0, 42384, 0, 4227, 74158, 0, 92501, 43032, 0, 42365, 0,
- 12671, 11384, 0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064,
- 120650, 42137, 9893, 2754, 12664, 120063, 0, 7377, 127867, 41799, 65530,
- 1711, 12984, 43039, 3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0,
- 120055, 0, 43175, 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088,
- 0, 520, 4200, 12699, 8331, 0, 3091, 41034, 127353, 0, 8360, 0, 78044,
- 321, 4229, 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195,
- 92386, 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660,
- 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 0, 743, 4414,
+ 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 126485, 0, 4895,
+ 65358, 0, 4359, 585, 2383, 3509, 70037, 486, 4290, 5758, 127546, 0, 0,
+ 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 93996, 2376, 0, 119320,
+ 0, 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0,
+ 0, 0, 983084, 0, 0, 0, 74188, 71342, 983086, 983573, 120047, 128575, 0,
+ 0, 120049, 0, 1847, 0, 10339, 983357, 42384, 0, 4227, 74158, 0, 92501,
+ 43032, 0, 42365, 0, 12671, 11384, 0, 983457, 0, 64797, 983337, 5820,
+ 983336, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664,
+ 120063, 0, 7377, 127867, 41799, 65530, 1711, 12984, 43039, 3114, 6255,
+ 983332, 118938, 0, 10853, 926, 983361, 74184, 983360, 120055, 0, 43175,
+ 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, 119605, 520, 4200,
+ 12699, 8331, 0, 3091, 41034, 127353, 983672, 8360, 0, 78044, 321, 4229,
+ 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, 92386,
+ 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660, 8209,
+ 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 0, 743, 4414,
120766, 0, 42632, 917973, 65161, 73896, 128589, 0, 1405, 119063, 43220,
43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, 43342,
119064, 65529, 65364, 128197, 0, 6485, 1397, 0, 41986, 92678, 0, 0,
- 74097, 0, 7471, 12079, 0, 12682, 43287, 92317, 0, 0, 0, 0, 0, 1099,
- 10490, 0, 10501, 65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346,
- 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812, 19911, 4218,
- 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 0, 74359, 12626, 9106, 0,
- 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, 0, 43530,
- 2752, 0, 0, 0, 59, 0, 0, 0, 92371, 77873, 41810, 0, 7010, 0, 41809,
- 41495, 119364, 0, 42252, 42213, 8009, 3305, 43033, 511, 92700, 66255,
- 13127, 120067, 0, 0, 0, 917977, 65915, 1400, 41812, 10685, 194870, 2103,
- 10387, 4453, 43276, 917783, 13159, 0, 6481, 41213, 0, 0, 0, 0, 41983,
- 74198, 6617, 9116, 119654, 0, 462, 68110, 10493, 0, 8129, 0, 0, 74471,
- 6644, 11658, 0, 128245, 3452, 11906, 9581, 1385, 3098, 0, 119013, 43340,
- 0, 41033, 6493, 42626, 0, 0, 11426, 77887, 1681, 118789, 1204, 3755,
- 64661, 7235, 10170, 3966, 8911, 0, 41841, 43338, 0, 0, 5726, 64915,
- 42175, 0, 0, 41497, 65044, 120109, 2851, 43017, 0, 0, 4373, 78058, 0,
- 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 0, 64922, 0, 8190,
- 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 0, 119125, 3439, 1825,
- 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, 8990, 2848, 0, 128223,
- 92528, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, 68178, 995, 0, 0,
- 64826, 0, 917798, 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 0,
- 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, 2102, 65445,
- 78258, 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, 12446, 43295, 0,
- 41894, 0, 6277, 41672, 41893, 10010, 128678, 3540, 128649, 835, 0, 69816,
+ 74097, 0, 7471, 12079, 67997, 12682, 43287, 92317, 0, 983143, 983698, 0,
+ 0, 1099, 10490, 0, 10501, 65181, 74463, 0, 464, 41624, 65283, 67663,
+ 78222, 1346, 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812,
+ 19911, 4218, 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 983893,
+ 74359, 12626, 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265,
+ 41795, 64666, 126508, 43530, 2752, 0, 0, 983485, 59, 0, 983593, 0, 92371,
+ 77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, 8009,
+ 3305, 43033, 511, 92700, 66255, 13127, 120067, 0, 74397, 120235, 917977,
+ 65915, 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783,
+ 13159, 0, 6481, 41213, 0, 0, 0, 0, 41983, 74198, 6617, 9116, 119654, 0,
+ 462, 68110, 10493, 0, 8129, 0, 0, 74471, 6644, 11658, 0, 128245, 3452,
+ 11906, 9581, 1385, 3098, 0, 119013, 43340, 0, 41033, 6493, 42626, 0, 0,
+ 11426, 77887, 1681, 118789, 1204, 3755, 64661, 7235, 10170, 3966, 8911,
+ 0, 41841, 43338, 0, 0, 5726, 64915, 42175, 0, 0, 41497, 65044, 120109,
+ 2851, 43017, 983589, 0, 4373, 78058, 0, 9587, 1789, 6671, 128840, 3100,
+ 0, 65360, 0, 92365, 917789, 64922, 0, 8190, 12083, 0, 0, 6506, 64312,
+ 74374, 2368, 0, 4419, 983838, 119125, 3439, 1825, 1192, 120106, 8891,
+ 3080, 120228, 2347, 5430, 0, 8990, 2848, 0, 128223, 92528, 249, 0, 0, 0,
+ 120658, 0, 0, 8883, 917802, 728, 68178, 995, 0, 0, 64826, 0, 917798,
+ 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 983841, 12112, 69912, 0,
+ 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, 2102, 65445, 78258,
+ 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, 12446, 43295, 0, 41894, 0,
+ 6277, 41672, 41893, 10010, 128678, 3540, 128649, 835, 71340, 69816,
119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 128127, 8283, 0, 5434,
- 0, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464, 6486,
- 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 0, 431, 0, 0,
- 128182, 128096, 68167, 0, 13096, 128643, 0, 43408, 9516, 128538, 5268,
- 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356, 3477, 227,
- 10488, 68203, 382, 11418, 0, 0, 0, 0, 0, 0, 6484, 2541, 66039, 0, 78718,
- 92723, 3549, 0, 9110, 119665, 2743, 0, 43290, 194812, 9097, 0, 43015,
- 8782, 0, 776, 2524, 42707, 8573, 0, 0, 0, 0, 42694, 64944, 8952, 3856,
- 118818, 0, 5872, 6495, 0, 0, 0, 92543, 0, 120733, 12849, 3953, 1897, 0,
- 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 0, 68473, 74104, 5228,
- 128804, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, 1162, 0, 2671, 0,
- 0, 92632, 92631, 118865, 4553, 73811, 0, 195005, 0, 0, 19921, 74331,
- 11424, 195006, 4567, 41891, 0, 0, 55249, 4820, 65239, 194662, 0, 0,
- 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, 1753,
- 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, 0,
- 1898, 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, 64789,
- 9169, 838, 127092, 120697, 844, 5014, 0, 256, 0, 9990, 0, 42739, 917851,
- 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, 78712,
- 11761, 194655, 0, 41094, 0, 0, 0, 0, 92689, 6196, 6945, 194628, 194890,
- 128184, 120491, 11816, 194943, 5733, 2930, 0, 0, 41098, 0, 41093, 0,
- 66626, 588, 9760, 0, 194717, 1238, 200, 0, 1660, 73916, 0, 118905, 74362,
- 0, 92485, 194651, 0, 0, 3394, 194894, 120668, 0, 0, 127358, 66219,
- 127183, 43284, 194657, 7817, 1841, 11055, 120533, 194979, 194982, 1669,
- 10776, 194981, 7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611,
- 127530, 41768, 6491, 0, 65324, 914, 65323, 8071, 3538, 0, 78713, 65328,
- 92441, 74367, 7614, 0, 11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841,
- 43430, 5301, 0, 92618, 5734, 8960, 0, 92527, 65317, 77880, 0, 0, 0,
- 12304, 0, 0, 65315, 92670, 128511, 0, 0, 0, 119621, 92529, 74536, 12447,
- 64486, 127374, 0, 0, 0, 0, 0, 42767, 10915, 0, 12007, 43695, 120520,
- 11975, 194878, 0, 92604, 2555, 8629, 0, 43168, 41872, 43706, 4496,
- 194879, 128148, 0, 0, 0, 0, 0, 64730, 0, 66714, 68222, 0, 0, 65596,
- 92306, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 127242, 67871, 74386,
- 0, 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, 0, 1473,
- 42820, 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 0,
- 3406, 1054, 119065, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765,
- 128705, 0, 0, 9693, 41943, 0, 41931, 41759, 12757, 4353, 0, 1059, 9790,
- 8995, 128286, 0, 65937, 0, 41764, 10646, 0, 118833, 92372, 0, 74830,
- 78569, 12743, 0, 6480, 917761, 41779, 42580, 66601, 12207, 119619, 6335,
- 66602, 11312, 64807, 0, 0, 41767, 0, 0, 43020, 128271, 3955, 74254, 0, 0,
- 917861, 0, 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786,
- 127093, 12797, 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755,
- 128061, 78574, 0, 0, 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924,
- 43812, 42144, 65015, 0, 563, 0, 0, 12798, 11271, 57, 0, 0, 917860,
- 119043, 0, 119134, 43137, 694, 0, 9876, 0, 119168, 0, 78822, 64537, 0,
- 277, 74385, 7229, 12761, 0, 0, 13025, 64811, 8757, 78824, 0, 1574, 7381,
- 0, 2525, 4852, 5749, 68465, 13027, 42824, 120574, 1039, 7151, 10155,
- 5745, 188, 41858, 11592, 0, 74015, 9055, 41853, 4858, 917780, 0, 436,
- 4771, 0, 2786, 0, 4856, 8051, 0, 119609, 0, 9644, 0, 0, 0, 194916,
- 120732, 66710, 118834, 0, 73906, 0, 127114, 0, 10234, 5843, 11939, 0,
- 42157, 0, 3157, 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029,
- 10226, 65142, 0, 3594, 42424, 194959, 40, 12657, 0, 0, 386, 0, 8834, 0,
- 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 77932, 4304,
- 74503, 8160, 78707, 194753, 0, 0, 0, 1348, 92349, 78597, 0, 13303, 0,
- 92392, 194755, 7599, 1278, 43616, 13269, 0, 0, 74387, 78179, 78598,
- 74492, 6097, 7568, 8780, 4982, 127464, 74501, 194763, 78592, 194762,
- 2672, 3735, 127471, 13138, 42266, 9484, 10724, 41202, 119024, 0, 43742,
- 0, 9487, 119959, 119117, 3842, 128768, 78668, 12442, 6193, 9791, 127976,
- 0, 42516, 7228, 7559, 74803, 78468, 7873, 11399, 119219, 194691, 194855,
- 194690, 194857, 3604, 0, 119188, 128877, 78540, 78541, 42507, 1962,
- 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173, 5437, 74174,
- 10669, 8702, 7964, 92352, 0, 199, 194843, 4105, 194845, 194699, 194847,
- 194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070, 6472, 65814,
- 73954, 0, 4724, 0, 0, 9191, 0, 64432, 0, 0, 195024, 10196, 7886, 0, 6585,
- 0, 6680, 195042, 0, 195051, 6679, 74412, 92251, 194866, 74421, 11382, 0,
- 0, 127891, 127484, 194833, 194832, 6681, 127482, 12693, 194836, 42727,
- 194838, 128252, 78195, 65442, 119610, 69733, 9989, 43248, 66248, 194816,
- 0, 194818, 128845, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825,
- 73927, 92444, 194736, 65746, 127476, 74409, 74389, 128696, 4342, 42839,
- 194831, 1677, 0, 0, 194806, 917855, 11091, 11011, 2719, 0, 0, 119595,
- 10160, 0, 0, 7585, 65169, 2052, 4308, 92174, 74177, 7505, 543, 64916,
- 64736, 0, 0, 64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0,
- 127170, 0, 0, 0, 0, 12994, 92728, 10828, 0, 6228, 4307, 3482, 128527, 0,
- 0, 0, 506, 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 0, 8841, 0,
- 516, 0, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182,
- 74520, 74308, 12001, 120178, 10242, 64564, 120179, 120174, 6584, 7749,
- 11037, 0, 1758, 0, 10667, 10560, 120197, 92593, 1935, 11517, 120193,
+ 983590, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464,
+ 6486, 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 128539,
+ 431, 0, 0, 128182, 128096, 68167, 983654, 13096, 128643, 0, 43408, 9516,
+ 128538, 5268, 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356,
+ 3477, 227, 10488, 68203, 382, 11418, 0, 195066, 0, 0, 0, 0, 6484, 2541,
+ 66039, 0, 78718, 92723, 3549, 0, 9110, 119665, 2743, 0, 43290, 194812,
+ 9097, 0, 43015, 8782, 0, 776, 2524, 42707, 8573, 0, 126494, 0, 0, 42694,
+ 64944, 8952, 3856, 118818, 0, 5872, 6495, 0, 0, 0, 92543, 0, 120733,
+ 12849, 3953, 1897, 0, 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 0,
+ 68473, 74104, 5228, 128804, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0,
+ 1162, 917847, 2671, 0, 0, 92632, 92631, 118865, 4553, 73811, 0, 195005,
+ 0, 0, 19921, 74331, 11424, 195006, 4567, 41891, 0, 983779, 55249, 4820,
+ 65239, 194662, 0, 194665, 43042, 119212, 1377, 12869, 4897, 42821, 9250,
+ 0, 4438, 64385, 0, 1753, 11331, 6147, 194941, 43282, 8833, 0, 0, 6504,
+ 78408, 126979, 10719, 0, 1898, 1413, 42443, 0, 802, 12141, 0, 194671,
+ 6648, 10671, 2528, 0, 64789, 9169, 838, 120087, 120697, 844, 5014, 0,
+ 256, 0, 9990, 0, 42739, 917851, 7542, 65464, 9726, 0, 6489, 10048, 74326,
+ 78719, 66573, 0, 78724, 78712, 11761, 194655, 0, 41094, 0, 0, 194893, 0,
+ 92689, 6196, 6945, 93969, 194890, 128184, 120491, 11816, 194943, 5733,
+ 2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, 194717, 1238, 200,
+ 983205, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983697, 3394,
+ 194894, 120668, 0, 0, 127358, 66219, 127183, 43284, 194656, 7817, 1841,
+ 11055, 120533, 194979, 194982, 1669, 10776, 194981, 7701, 194980, 0,
+ 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, 0, 65324, 914,
+ 65323, 8071, 3538, 0, 2287, 65328, 92441, 74367, 7614, 0, 11819, 0,
+ 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 92618, 5734,
+ 8960, 0, 92527, 65317, 77880, 0, 0, 0, 12304, 0, 0, 65315, 92670, 128511,
+ 0, 0, 0, 119621, 92529, 74536, 12447, 64486, 127374, 126562, 983129, 0,
+ 0, 983793, 42767, 10915, 0, 12007, 43695, 120520, 11975, 194878, 0,
+ 92604, 2555, 8629, 128640, 43168, 41872, 43706, 4496, 194879, 128148,
+ 120241, 0, 0, 0, 0, 64730, 70041, 66714, 68222, 0, 70076, 65596, 92306,
+ 11416, 4280, 67655, 8765, 12784, 7792, 1393, 126473, 67871, 74386, 0,
+ 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, 0, 1473, 42820,
+ 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 94003, 3406,
+ 1054, 71320, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765,
+ 128705, 0, 983684, 9693, 41943, 126564, 41931, 41759, 12757, 4353, 0,
+ 1059, 9790, 8995, 119974, 983687, 65937, 0, 41764, 10646, 0, 118833,
+ 92372, 0, 74830, 78569, 12743, 983680, 6480, 917761, 41779, 42580, 66601,
+ 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, 41767, 119629, 983755,
+ 43020, 128271, 3955, 74254, 0, 983745, 917861, 0, 77926, 9770, 9246,
+ 12230, 0, 0, 0, 10448, 41783, 41786, 127093, 12797, 2755, 64571, 78578,
+ 194927, 4857, 0, 4428, 12794, 73755, 128061, 78574, 0, 74284, 0, 5747,
+ 78825, 0, 7978, 41092, 74571, 0, 11924, 43812, 42144, 65015, 0, 563, 0,
+ 983682, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 94051, 43137, 694, 0,
+ 9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, 7229, 12761, 0, 0,
+ 13025, 64811, 8757, 78824, 126478, 1574, 7381, 0, 2525, 4852, 5749,
+ 68465, 13027, 42824, 120574, 1039, 7151, 10155, 5745, 188, 41858, 11592,
+ 0, 74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, 0, 4856,
+ 8051, 0, 119609, 71327, 9644, 0, 0, 0, 194916, 120732, 66710, 118834,
+ 983351, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157,
+ 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, 10226, 65142,
+ 128025, 3594, 42424, 194959, 40, 12657, 983656, 0, 386, 0, 8834, 0,
+ 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 65322, 4304,
+ 74503, 8160, 78707, 194753, 0, 0, 128526, 1348, 92349, 78597, 126539,
+ 13303, 0, 92392, 194755, 7599, 1278, 43616, 13269, 0, 0, 74387, 78179,
+ 78598, 74492, 6097, 7568, 8780, 4982, 127464, 74501, 194763, 78592,
+ 194762, 2672, 3735, 127470, 13138, 42266, 9484, 10724, 41202, 71364, 0,
+ 43742, 0, 9487, 119959, 119117, 3842, 128768, 78668, 12442, 6193, 9791,
+ 127976, 0, 42516, 7228, 7559, 74803, 78468, 7873, 11399, 119219, 194691,
+ 194855, 194690, 194857, 3604, 120683, 119188, 128877, 78540, 78541,
+ 42507, 1962, 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173,
+ 5437, 74174, 10669, 8702, 7964, 92352, 0, 199, 194843, 4105, 194845,
+ 194699, 194847, 194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070,
+ 6472, 65814, 73954, 0, 4724, 0, 0, 9191, 0, 64432, 983808, 983241,
+ 195024, 10196, 7886, 0, 6585, 0, 6680, 195042, 0, 195051, 6679, 74412,
+ 92251, 194866, 74421, 11382, 983622, 983628, 127891, 127484, 194833,
+ 194832, 6681, 127482, 12693, 194836, 42727, 78196, 128252, 78195, 65442,
+ 119610, 69733, 9989, 43248, 66248, 194816, 0, 194818, 128845, 194820,
+ 194819, 5297, 7042, 13284, 6112, 7968, 194825, 73927, 92444, 194736,
+ 65746, 127476, 69889, 74389, 128696, 4342, 42839, 194831, 1677, 0, 0,
+ 126590, 917855, 11091, 11011, 2719, 0, 0, 119595, 10160, 0, 0, 7585,
+ 65169, 2052, 4308, 92174, 43000, 7505, 543, 64916, 64736, 0, 0, 64655, 0,
+ 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 127170, 0, 0, 0, 0,
+ 12994, 92728, 10828, 983934, 6228, 4307, 3482, 128527, 0, 0, 0, 506,
+ 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 983671, 8841, 0, 516,
+ 93974, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182,
+ 11827, 74308, 12001, 120178, 10242, 64564, 120179, 67986, 6584, 7749,
+ 11037, 0, 1758, 127092, 10667, 10560, 120197, 92593, 1935, 11517, 120193,
120196, 120195, 1931, 120189, 74839, 120191, 1217, 64702, 12643, 825,
127838, 194905, 12294, 92428, 78834, 9138, 78831, 78833, 12631, 78829,
11080, 74554, 64000, 5591, 1239, 0, 11313, 0, 3403, 0, 0, 64364, 92269,
- 0, 74582, 8998, 12988, 0, 9152, 0, 0, 194898, 67589, 41850, 64290, 3433,
- 92393, 12615, 1594, 42192, 6914, 67603, 0, 119569, 74565, 41353, 67602,
- 67611, 4337, 0, 127296, 918, 65035, 41351, 7681, 194900, 42577, 41393,
- 12668, 194904, 2477, 127285, 0, 127301, 0, 67604, 194880, 127235, 573,
- 127282, 194884, 11417, 194886, 119814, 194888, 67599, 0, 194889, 67607,
- 11482, 0, 3981, 3357, 0, 42223, 4207, 1288, 78842, 78839, 68419, 78837,
- 11589, 42195, 194872, 194599, 127263, 64602, 67618, 92539, 0, 42788,
- 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, 997, 0, 0,
- 92577, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 127760,
- 73796, 0, 119228, 12035, 0, 2818, 0, 0, 73793, 0, 4172, 0, 0, 8373,
+ 0, 74582, 8998, 12988, 0, 9152, 983840, 0, 126484, 67589, 41850, 64290,
+ 3433, 92393, 12615, 1594, 42192, 6914, 67603, 0, 119569, 74565, 41353,
+ 67602, 67611, 4337, 0, 127296, 918, 65035, 41351, 7681, 194900, 42577,
+ 41393, 12668, 194904, 2477, 127285, 0, 127301, 0, 67604, 194880, 127235,
+ 573, 127282, 194884, 11417, 194886, 119814, 194888, 67599, 0, 194889,
+ 67607, 11482, 0, 3981, 3357, 0, 42223, 4207, 1288, 78842, 78839, 68419,
+ 78837, 11589, 42195, 194872, 194599, 127263, 64602, 67618, 92539, 0,
+ 42788, 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, 997, 0,
+ 0, 92577, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 127760,
+ 73796, 0, 119228, 12035, 0, 2818, 0, 74411, 73793, 0, 4172, 0, 0, 8373,
10873, 12197, 0, 0, 92265, 69706, 0, 78210, 0, 128110, 194865, 126982,
74563, 64828, 11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617,
- 3274, 127365, 0, 0, 0, 74522, 41989, 0, 0, 128798, 3263, 0, 65672, 0,
- 3270, 64539, 11489, 0, 0, 0, 0, 9505, 65518, 194776, 756, 194605, 0, 0,
- 0, 7261, 0, 186, 0, 119156, 5770, 13179, 65830, 12612, 12949, 64856,
- 12800, 0, 74203, 64718, 0, 0, 92434, 118929, 0, 11578, 0, 119296, 0, 0,
- 0, 0, 74568, 9254, 0, 1794, 120217, 64521, 5624, 120220, 120221, 119958,
- 120223, 3617, 66636, 64886, 120211, 120212, 120213, 120214, 1872, 66508,
- 120467, 41079, 10748, 5502, 119330, 4452, 0, 0, 92526, 4511, 0, 0, 64678,
- 11425, 0, 43245, 1231, 194783, 0, 0, 9003, 8192, 0, 5305, 9653, 10616,
- 8694, 9546, 0, 0, 120478, 120200, 65205, 120202, 64063, 9878, 74780,
- 119626, 78202, 64058, 8799, 42131, 0, 64062, 1028, 64060, 64059, 837,
- 10567, 0, 43103, 0, 120754, 11427, 2902, 64043, 64042, 66464, 10756, 0,
- 42606, 64045, 64044, 43979, 10076, 64040, 43060, 194942, 1034, 3392,
- 127771, 43091, 64033, 64032, 42735, 64038, 64037, 64036, 64035, 4291,
- 194928, 64015, 64014, 64681, 194930, 0, 78145, 0, 43090, 0, 3476, 8973,
- 64012, 42473, 64010, 64008, 64007, 2003, 7706, 64517, 78153, 2538, 64009,
- 204, 0, 4802, 4111, 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 0,
- 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, 64052, 43453, 64050,
- 41340, 118975, 194835, 10005, 12329, 41333, 0, 8489, 1942, 0, 194834,
- 42520, 128249, 0, 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025,
- 9167, 42151, 78244, 0, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582,
- 78252, 78248, 77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920,
- 7532, 41414, 78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454,
- 10751, 9051, 120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030,
- 294, 41874, 0, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788,
- 194844, 0, 118795, 6343, 43247, 119888, 0, 119886, 119891, 119892,
- 119889, 11433, 119895, 119896, 0, 7801, 65578, 194839, 12915, 43968,
- 3297, 9699, 194955, 1135, 0, 0, 128525, 1995, 6722, 0, 0, 2552, 41546,
- 60, 68394, 8649, 41549, 78496, 0, 0, 6682, 0, 78679, 64710, 41547, 0,
- 2013, 128291, 78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537,
- 119908, 9137, 7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0,
- 2002, 2000, 120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628,
- 68446, 12081, 9826, 64502, 1767, 0, 0, 0, 120201, 0, 0, 0, 3059, 44024,
- 120204, 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, 3592,
- 10078, 0, 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, 9281,
- 3296, 12865, 1997, 1895,
+ 3274, 127365, 126523, 94042, 983941, 74522, 41989, 0, 0, 128798, 3263, 0,
+ 65672, 0, 3270, 64539, 11489, 0, 0, 0, 0, 9505, 65518, 194776, 756,
+ 194605, 0, 0, 0, 7261, 0, 186, 0, 119156, 5770, 13179, 65830, 12612,
+ 12949, 64856, 12800, 983892, 74203, 64718, 11507, 0, 92434, 118929, 0,
+ 11578, 0, 119296, 0, 0, 0, 0, 74568, 9254, 0, 1794, 120217, 64521, 5624,
+ 120220, 120221, 119958, 120223, 3617, 66636, 64886, 94061, 120212,
+ 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, 4452, 0,
+ 983762, 92526, 4511, 0, 983868, 64678, 11425, 0, 43245, 1231, 194783,
+ 69903, 0, 9003, 8192, 0, 5305, 9653, 10616, 8694, 9546, 0, 0, 120478,
+ 120200, 65205, 120202, 64063, 9878, 74780, 119626, 78202, 64058, 8799,
+ 42131, 0, 64062, 1028, 64060, 64059, 837, 10567, 0, 43103, 0, 120754,
+ 11427, 2902, 64043, 64042, 43749, 10756, 64047, 42606, 64045, 64044,
+ 43979, 10076, 64040, 43060, 194942, 1034, 3392, 127771, 43091, 64033,
+ 64032, 42735, 64038, 64037, 64036, 64035, 4291, 194928, 64015, 64014,
+ 64681, 194930, 0, 78145, 0, 43090, 0, 3476, 8973, 64012, 42473, 64010,
+ 64008, 64007, 2003, 7706, 64517, 78153, 2538, 64009, 204, 0, 4802, 4111,
+ 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 983258, 0, 4767, 9343,
+ 64049, 64048, 120034, 1133, 64053, 64052, 43453, 64050, 41340, 118975,
+ 194835, 10005, 12329, 41333, 0, 8489, 1942, 0, 194834, 42520, 128249, 0,
+ 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, 9167, 42151, 78244,
+ 983226, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, 78248,
+ 77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920, 7532, 41414,
+ 78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454, 10751, 9051,
+ 120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030, 294, 41874, 0,
+ 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, 0, 4351,
+ 6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, 119895,
+ 119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, 1135,
+ 0, 0, 128525, 1995, 6722, 983916, 0, 2552, 41546, 60, 68394, 8649, 41549,
+ 78496, 983319, 0, 6682, 0, 78679, 64710, 41547, 983621, 2013, 128291,
+ 78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537, 119908, 9137,
+ 7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, 2002, 2000,
+ 120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628, 68446, 12081,
+ 9826, 64502, 1767, 0, 0, 0, 120201, 983637, 0, 0, 3059, 44024, 120204,
+ 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, 3592, 10078, 0,
+ 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, 9281, 3296,
+ 12865, 1997, 1895,
};
#define code_magic 47
#define code_size 32768
#define code_poly 32771
+
+static const unsigned int aliases_start = 0xf0000;
+static const unsigned int aliases_end = 0xf01c1;
+static const unsigned int name_aliases[] = {
+ 0x0000,
+ 0x0000,
+ 0x0001,
+ 0x0001,
+ 0x0002,
+ 0x0002,
+ 0x0003,
+ 0x0003,
+ 0x0004,
+ 0x0004,
+ 0x0005,
+ 0x0005,
+ 0x0006,
+ 0x0006,
+ 0x0007,
+ 0x0007,
+ 0x0008,
+ 0x0008,
+ 0x0009,
+ 0x0009,
+ 0x0009,
+ 0x0009,
+ 0x000A,
+ 0x000A,
+ 0x000A,
+ 0x000A,
+ 0x000A,
+ 0x000A,
+ 0x000B,
+ 0x000B,
+ 0x000B,
+ 0x000C,
+ 0x000C,
+ 0x000D,
+ 0x000D,
+ 0x000E,
+ 0x000E,
+ 0x000E,
+ 0x000F,
+ 0x000F,
+ 0x000F,
+ 0x0010,
+ 0x0010,
+ 0x0011,
+ 0x0011,
+ 0x0012,
+ 0x0012,
+ 0x0013,
+ 0x0013,
+ 0x0014,
+ 0x0014,
+ 0x0015,
+ 0x0015,
+ 0x0016,
+ 0x0016,
+ 0x0017,
+ 0x0017,
+ 0x0018,
+ 0x0018,
+ 0x0019,
+ 0x0019,
+ 0x001A,
+ 0x001A,
+ 0x001B,
+ 0x001B,
+ 0x001C,
+ 0x001C,
+ 0x001C,
+ 0x001D,
+ 0x001D,
+ 0x001D,
+ 0x001E,
+ 0x001E,
+ 0x001E,
+ 0x001F,
+ 0x001F,
+ 0x001F,
+ 0x0020,
+ 0x007F,
+ 0x007F,
+ 0x0080,
+ 0x0080,
+ 0x0081,
+ 0x0081,
+ 0x0082,
+ 0x0082,
+ 0x0083,
+ 0x0083,
+ 0x0084,
+ 0x0084,
+ 0x0085,
+ 0x0085,
+ 0x0086,
+ 0x0086,
+ 0x0087,
+ 0x0087,
+ 0x0088,
+ 0x0088,
+ 0x0088,
+ 0x0089,
+ 0x0089,
+ 0x0089,
+ 0x008A,
+ 0x008A,
+ 0x008A,
+ 0x008B,
+ 0x008B,
+ 0x008B,
+ 0x008C,
+ 0x008C,
+ 0x008C,
+ 0x008D,
+ 0x008D,
+ 0x008D,
+ 0x008E,
+ 0x008E,
+ 0x008E,
+ 0x008F,
+ 0x008F,
+ 0x008F,
+ 0x0090,
+ 0x0090,
+ 0x0091,
+ 0x0091,
+ 0x0091,
+ 0x0092,
+ 0x0092,
+ 0x0092,
+ 0x0093,
+ 0x0093,
+ 0x0094,
+ 0x0094,
+ 0x0095,
+ 0x0095,
+ 0x0096,
+ 0x0096,
+ 0x0096,
+ 0x0097,
+ 0x0097,
+ 0x0097,
+ 0x0098,
+ 0x0098,
+ 0x0099,
+ 0x0099,
+ 0x009A,
+ 0x009A,
+ 0x009B,
+ 0x009B,
+ 0x009C,
+ 0x009C,
+ 0x009D,
+ 0x009D,
+ 0x009E,
+ 0x009E,
+ 0x009F,
+ 0x009F,
+ 0x00A0,
+ 0x00AD,
+ 0x01A2,
+ 0x01A3,
+ 0x034F,
+ 0x0CDE,
+ 0x0E9D,
+ 0x0E9F,
+ 0x0EA3,
+ 0x0EA5,
+ 0x0FD0,
+ 0x180B,
+ 0x180C,
+ 0x180D,
+ 0x180E,
+ 0x200B,
+ 0x200C,
+ 0x200D,
+ 0x200E,
+ 0x200F,
+ 0x202A,
+ 0x202B,
+ 0x202C,
+ 0x202D,
+ 0x202E,
+ 0x202F,
+ 0x205F,
+ 0x2060,
+ 0x2118,
+ 0x2448,
+ 0x2449,
+ 0xA015,
+ 0xFE18,
+ 0xFE00,
+ 0xFE01,
+ 0xFE02,
+ 0xFE03,
+ 0xFE04,
+ 0xFE05,
+ 0xFE06,
+ 0xFE07,
+ 0xFE08,
+ 0xFE09,
+ 0xFE0A,
+ 0xFE0B,
+ 0xFE0C,
+ 0xFE0D,
+ 0xFE0E,
+ 0xFE0F,
+ 0xFEFF,
+ 0xFEFF,
+ 0xFEFF,
+ 0x1D0C5,
+ 0xE0100,
+ 0xE0101,
+ 0xE0102,
+ 0xE0103,
+ 0xE0104,
+ 0xE0105,
+ 0xE0106,
+ 0xE0107,
+ 0xE0108,
+ 0xE0109,
+ 0xE010A,
+ 0xE010B,
+ 0xE010C,
+ 0xE010D,
+ 0xE010E,
+ 0xE010F,
+ 0xE0110,
+ 0xE0111,
+ 0xE0112,
+ 0xE0113,
+ 0xE0114,
+ 0xE0115,
+ 0xE0116,
+ 0xE0117,
+ 0xE0118,
+ 0xE0119,
+ 0xE011A,
+ 0xE011B,
+ 0xE011C,
+ 0xE011D,
+ 0xE011E,
+ 0xE011F,
+ 0xE0120,
+ 0xE0121,
+ 0xE0122,
+ 0xE0123,
+ 0xE0124,
+ 0xE0125,
+ 0xE0126,
+ 0xE0127,
+ 0xE0128,
+ 0xE0129,
+ 0xE012A,
+ 0xE012B,
+ 0xE012C,
+ 0xE012D,
+ 0xE012E,
+ 0xE012F,
+ 0xE0130,
+ 0xE0131,
+ 0xE0132,
+ 0xE0133,
+ 0xE0134,
+ 0xE0135,
+ 0xE0136,
+ 0xE0137,
+ 0xE0138,
+ 0xE0139,
+ 0xE013A,
+ 0xE013B,
+ 0xE013C,
+ 0xE013D,
+ 0xE013E,
+ 0xE013F,
+ 0xE0140,
+ 0xE0141,
+ 0xE0142,
+ 0xE0143,
+ 0xE0144,
+ 0xE0145,
+ 0xE0146,
+ 0xE0147,
+ 0xE0148,
+ 0xE0149,
+ 0xE014A,
+ 0xE014B,
+ 0xE014C,
+ 0xE014D,
+ 0xE014E,
+ 0xE014F,
+ 0xE0150,
+ 0xE0151,
+ 0xE0152,
+ 0xE0153,
+ 0xE0154,
+ 0xE0155,
+ 0xE0156,
+ 0xE0157,
+ 0xE0158,
+ 0xE0159,
+ 0xE015A,
+ 0xE015B,
+ 0xE015C,
+ 0xE015D,
+ 0xE015E,
+ 0xE015F,
+ 0xE0160,
+ 0xE0161,
+ 0xE0162,
+ 0xE0163,
+ 0xE0164,
+ 0xE0165,
+ 0xE0166,
+ 0xE0167,
+ 0xE0168,
+ 0xE0169,
+ 0xE016A,
+ 0xE016B,
+ 0xE016C,
+ 0xE016D,
+ 0xE016E,
+ 0xE016F,
+ 0xE0170,
+ 0xE0171,
+ 0xE0172,
+ 0xE0173,
+ 0xE0174,
+ 0xE0175,
+ 0xE0176,
+ 0xE0177,
+ 0xE0178,
+ 0xE0179,
+ 0xE017A,
+ 0xE017B,
+ 0xE017C,
+ 0xE017D,
+ 0xE017E,
+ 0xE017F,
+ 0xE0180,
+ 0xE0181,
+ 0xE0182,
+ 0xE0183,
+ 0xE0184,
+ 0xE0185,
+ 0xE0186,
+ 0xE0187,
+ 0xE0188,
+ 0xE0189,
+ 0xE018A,
+ 0xE018B,
+ 0xE018C,
+ 0xE018D,
+ 0xE018E,
+ 0xE018F,
+ 0xE0190,
+ 0xE0191,
+ 0xE0192,
+ 0xE0193,
+ 0xE0194,
+ 0xE0195,
+ 0xE0196,
+ 0xE0197,
+ 0xE0198,
+ 0xE0199,
+ 0xE019A,
+ 0xE019B,
+ 0xE019C,
+ 0xE019D,
+ 0xE019E,
+ 0xE019F,
+ 0xE01A0,
+ 0xE01A1,
+ 0xE01A2,
+ 0xE01A3,
+ 0xE01A4,
+ 0xE01A5,
+ 0xE01A6,
+ 0xE01A7,
+ 0xE01A8,
+ 0xE01A9,
+ 0xE01AA,
+ 0xE01AB,
+ 0xE01AC,
+ 0xE01AD,
+ 0xE01AE,
+ 0xE01AF,
+ 0xE01B0,
+ 0xE01B1,
+ 0xE01B2,
+ 0xE01B3,
+ 0xE01B4,
+ 0xE01B5,
+ 0xE01B6,
+ 0xE01B7,
+ 0xE01B8,
+ 0xE01B9,
+ 0xE01BA,
+ 0xE01BB,
+ 0xE01BC,
+ 0xE01BD,
+ 0xE01BE,
+ 0xE01BF,
+ 0xE01C0,
+ 0xE01C1,
+ 0xE01C2,
+ 0xE01C3,
+ 0xE01C4,
+ 0xE01C5,
+ 0xE01C6,
+ 0xE01C7,
+ 0xE01C8,
+ 0xE01C9,
+ 0xE01CA,
+ 0xE01CB,
+ 0xE01CC,
+ 0xE01CD,
+ 0xE01CE,
+ 0xE01CF,
+ 0xE01D0,
+ 0xE01D1,
+ 0xE01D2,
+ 0xE01D3,
+ 0xE01D4,
+ 0xE01D5,
+ 0xE01D6,
+ 0xE01D7,
+ 0xE01D8,
+ 0xE01D9,
+ 0xE01DA,
+ 0xE01DB,
+ 0xE01DC,
+ 0xE01DD,
+ 0xE01DE,
+ 0xE01DF,
+ 0xE01E0,
+ 0xE01E1,
+ 0xE01E2,
+ 0xE01E3,
+ 0xE01E4,
+ 0xE01E5,
+ 0xE01E6,
+ 0xE01E7,
+ 0xE01E8,
+ 0xE01E9,
+ 0xE01EA,
+ 0xE01EB,
+ 0xE01EC,
+ 0xE01ED,
+ 0xE01EE,
+ 0xE01EF,
+};
+
+typedef struct NamedSequence {
+ int seqlen;
+ Py_UCS2 seq[4];
+} named_sequence;
+
+static const unsigned int named_sequences_start = 0xf0200;
+static const unsigned int named_sequences_end = 0xf03a5;
+static const named_sequence named_sequences[] = {
+ {2, {0x0100, 0x0300}},
+ {2, {0x0101, 0x0300}},
+ {2, {0x0045, 0x0329}},
+ {2, {0x0065, 0x0329}},
+ {2, {0x00C8, 0x0329}},
+ {2, {0x00E8, 0x0329}},
+ {2, {0x00C9, 0x0329}},
+ {2, {0x00E9, 0x0329}},
+ {2, {0x00CA, 0x0304}},
+ {2, {0x00EA, 0x0304}},
+ {2, {0x00CA, 0x030C}},
+ {2, {0x00EA, 0x030C}},
+ {2, {0x012A, 0x0300}},
+ {2, {0x012B, 0x0300}},
+ {3, {0x0069, 0x0307, 0x0301}},
+ {3, {0x006E, 0x0360, 0x0067}},
+ {2, {0x004F, 0x0329}},
+ {2, {0x006F, 0x0329}},
+ {2, {0x00D2, 0x0329}},
+ {2, {0x00F2, 0x0329}},
+ {2, {0x00D3, 0x0329}},
+ {2, {0x00F3, 0x0329}},
+ {2, {0x0053, 0x0329}},
+ {2, {0x0073, 0x0329}},
+ {2, {0x016A, 0x0300}},
+ {2, {0x016B, 0x0300}},
+ {2, {0x0104, 0x0301}},
+ {2, {0x0105, 0x0301}},
+ {2, {0x0104, 0x0303}},
+ {2, {0x0105, 0x0303}},
+ {2, {0x0118, 0x0301}},
+ {2, {0x0119, 0x0301}},
+ {2, {0x0118, 0x0303}},
+ {2, {0x0119, 0x0303}},
+ {2, {0x0116, 0x0301}},
+ {2, {0x0117, 0x0301}},
+ {2, {0x0116, 0x0303}},
+ {2, {0x0117, 0x0303}},
+ {3, {0x0069, 0x0307, 0x0300}},
+ {3, {0x0069, 0x0307, 0x0303}},
+ {2, {0x012E, 0x0301}},
+ {3, {0x012F, 0x0307, 0x0301}},
+ {2, {0x012E, 0x0303}},
+ {3, {0x012F, 0x0307, 0x0303}},
+ {2, {0x004A, 0x0303}},
+ {3, {0x006A, 0x0307, 0x0303}},
+ {2, {0x004C, 0x0303}},
+ {2, {0x006C, 0x0303}},
+ {2, {0x004D, 0x0303}},
+ {2, {0x006D, 0x0303}},
+ {2, {0x0052, 0x0303}},
+ {2, {0x0072, 0x0303}},
+ {2, {0x0172, 0x0301}},
+ {2, {0x0173, 0x0301}},
+ {2, {0x0172, 0x0303}},
+ {2, {0x0173, 0x0303}},
+ {2, {0x016A, 0x0301}},
+ {2, {0x016B, 0x0301}},
+ {2, {0x016A, 0x0303}},
+ {2, {0x016B, 0x0303}},
+ {2, {0x00E6, 0x0300}},
+ {2, {0x0254, 0x0300}},
+ {2, {0x0254, 0x0301}},
+ {2, {0x028C, 0x0300}},
+ {2, {0x028C, 0x0301}},
+ {2, {0x0259, 0x0300}},
+ {2, {0x0259, 0x0301}},
+ {2, {0x025A, 0x0300}},
+ {2, {0x025A, 0x0301}},
+ {3, {0x0995, 0x09CD, 0x09B7}},
+ {2, {0x0B95, 0x0BCD}},
+ {2, {0x0B99, 0x0BCD}},
+ {2, {0x0B9A, 0x0BCD}},
+ {2, {0x0B9E, 0x0BCD}},
+ {2, {0x0B9F, 0x0BCD}},
+ {2, {0x0BA3, 0x0BCD}},
+ {2, {0x0BA4, 0x0BCD}},
+ {2, {0x0BA8, 0x0BCD}},
+ {2, {0x0BAA, 0x0BCD}},
+ {2, {0x0BAE, 0x0BCD}},
+ {2, {0x0BAF, 0x0BCD}},
+ {2, {0x0BB0, 0x0BCD}},
+ {2, {0x0BB2, 0x0BCD}},
+ {2, {0x0BB5, 0x0BCD}},
+ {2, {0x0BB4, 0x0BCD}},
+ {2, {0x0BB3, 0x0BCD}},
+ {2, {0x0BB1, 0x0BCD}},
+ {2, {0x0BA9, 0x0BCD}},
+ {2, {0x0B9C, 0x0BCD}},
+ {2, {0x0BB6, 0x0BCD}},
+ {2, {0x0BB7, 0x0BCD}},
+ {2, {0x0BB8, 0x0BCD}},
+ {2, {0x0BB9, 0x0BCD}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCD}},
+ {2, {0x0B95, 0x0BBE}},
+ {2, {0x0B95, 0x0BBF}},
+ {2, {0x0B95, 0x0BC0}},
+ {2, {0x0B95, 0x0BC1}},
+ {2, {0x0B95, 0x0BC2}},
+ {2, {0x0B95, 0x0BC6}},
+ {2, {0x0B95, 0x0BC7}},
+ {2, {0x0B95, 0x0BC8}},
+ {2, {0x0B95, 0x0BCA}},
+ {2, {0x0B95, 0x0BCB}},
+ {2, {0x0B95, 0x0BCC}},
+ {2, {0x0B99, 0x0BBE}},
+ {2, {0x0B99, 0x0BBF}},
+ {2, {0x0B99, 0x0BC0}},
+ {2, {0x0B99, 0x0BC1}},
+ {2, {0x0B99, 0x0BC2}},
+ {2, {0x0B99, 0x0BC6}},
+ {2, {0x0B99, 0x0BC7}},
+ {2, {0x0B99, 0x0BC8}},
+ {2, {0x0B99, 0x0BCA}},
+ {2, {0x0B99, 0x0BCB}},
+ {2, {0x0B99, 0x0BCC}},
+ {2, {0x0B9A, 0x0BBE}},
+ {2, {0x0B9A, 0x0BBF}},
+ {2, {0x0B9A, 0x0BC0}},
+ {2, {0x0B9A, 0x0BC1}},
+ {2, {0x0B9A, 0x0BC2}},
+ {2, {0x0B9A, 0x0BC6}},
+ {2, {0x0B9A, 0x0BC7}},
+ {2, {0x0B9A, 0x0BC8}},
+ {2, {0x0B9A, 0x0BCA}},
+ {2, {0x0B9A, 0x0BCB}},
+ {2, {0x0B9A, 0x0BCC}},
+ {2, {0x0B9E, 0x0BBE}},
+ {2, {0x0B9E, 0x0BBF}},
+ {2, {0x0B9E, 0x0BC0}},
+ {2, {0x0B9E, 0x0BC1}},
+ {2, {0x0B9E, 0x0BC2}},
+ {2, {0x0B9E, 0x0BC6}},
+ {2, {0x0B9E, 0x0BC7}},
+ {2, {0x0B9E, 0x0BC8}},
+ {2, {0x0B9E, 0x0BCA}},
+ {2, {0x0B9E, 0x0BCB}},
+ {2, {0x0B9E, 0x0BCC}},
+ {2, {0x0B9F, 0x0BBE}},
+ {2, {0x0B9F, 0x0BBF}},
+ {2, {0x0B9F, 0x0BC0}},
+ {2, {0x0B9F, 0x0BC1}},
+ {2, {0x0B9F, 0x0BC2}},
+ {2, {0x0B9F, 0x0BC6}},
+ {2, {0x0B9F, 0x0BC7}},
+ {2, {0x0B9F, 0x0BC8}},
+ {2, {0x0B9F, 0x0BCA}},
+ {2, {0x0B9F, 0x0BCB}},
+ {2, {0x0B9F, 0x0BCC}},
+ {2, {0x0BA3, 0x0BBE}},
+ {2, {0x0BA3, 0x0BBF}},
+ {2, {0x0BA3, 0x0BC0}},
+ {2, {0x0BA3, 0x0BC1}},
+ {2, {0x0BA3, 0x0BC2}},
+ {2, {0x0BA3, 0x0BC6}},
+ {2, {0x0BA3, 0x0BC7}},
+ {2, {0x0BA3, 0x0BC8}},
+ {2, {0x0BA3, 0x0BCA}},
+ {2, {0x0BA3, 0x0BCB}},
+ {2, {0x0BA3, 0x0BCC}},
+ {2, {0x0BA4, 0x0BBE}},
+ {2, {0x0BA4, 0x0BBF}},
+ {2, {0x0BA4, 0x0BC0}},
+ {2, {0x0BA4, 0x0BC1}},
+ {2, {0x0BA4, 0x0BC2}},
+ {2, {0x0BA4, 0x0BC6}},
+ {2, {0x0BA4, 0x0BC7}},
+ {2, {0x0BA4, 0x0BC8}},
+ {2, {0x0BA4, 0x0BCA}},
+ {2, {0x0BA4, 0x0BCB}},
+ {2, {0x0BA4, 0x0BCC}},
+ {2, {0x0BA8, 0x0BBE}},
+ {2, {0x0BA8, 0x0BBF}},
+ {2, {0x0BA8, 0x0BC0}},
+ {2, {0x0BA8, 0x0BC1}},
+ {2, {0x0BA8, 0x0BC2}},
+ {2, {0x0BA8, 0x0BC6}},
+ {2, {0x0BA8, 0x0BC7}},
+ {2, {0x0BA8, 0x0BC8}},
+ {2, {0x0BA8, 0x0BCA}},
+ {2, {0x0BA8, 0x0BCB}},
+ {2, {0x0BA8, 0x0BCC}},
+ {2, {0x0BAA, 0x0BBE}},
+ {2, {0x0BAA, 0x0BBF}},
+ {2, {0x0BAA, 0x0BC0}},
+ {2, {0x0BAA, 0x0BC1}},
+ {2, {0x0BAA, 0x0BC2}},
+ {2, {0x0BAA, 0x0BC6}},
+ {2, {0x0BAA, 0x0BC7}},
+ {2, {0x0BAA, 0x0BC8}},
+ {2, {0x0BAA, 0x0BCA}},
+ {2, {0x0BAA, 0x0BCB}},
+ {2, {0x0BAA, 0x0BCC}},
+ {2, {0x0BAE, 0x0BBE}},
+ {2, {0x0BAE, 0x0BBF}},
+ {2, {0x0BAE, 0x0BC0}},
+ {2, {0x0BAE, 0x0BC1}},
+ {2, {0x0BAE, 0x0BC2}},
+ {2, {0x0BAE, 0x0BC6}},
+ {2, {0x0BAE, 0x0BC7}},
+ {2, {0x0BAE, 0x0BC8}},
+ {2, {0x0BAE, 0x0BCA}},
+ {2, {0x0BAE, 0x0BCB}},
+ {2, {0x0BAE, 0x0BCC}},
+ {2, {0x0BAF, 0x0BBE}},
+ {2, {0x0BAF, 0x0BBF}},
+ {2, {0x0BAF, 0x0BC0}},
+ {2, {0x0BAF, 0x0BC1}},
+ {2, {0x0BAF, 0x0BC2}},
+ {2, {0x0BAF, 0x0BC6}},
+ {2, {0x0BAF, 0x0BC7}},
+ {2, {0x0BAF, 0x0BC8}},
+ {2, {0x0BAF, 0x0BCA}},
+ {2, {0x0BAF, 0x0BCB}},
+ {2, {0x0BAF, 0x0BCC}},
+ {2, {0x0BB0, 0x0BBE}},
+ {2, {0x0BB0, 0x0BBF}},
+ {2, {0x0BB0, 0x0BC0}},
+ {2, {0x0BB0, 0x0BC1}},
+ {2, {0x0BB0, 0x0BC2}},
+ {2, {0x0BB0, 0x0BC6}},
+ {2, {0x0BB0, 0x0BC7}},
+ {2, {0x0BB0, 0x0BC8}},
+ {2, {0x0BB0, 0x0BCA}},
+ {2, {0x0BB0, 0x0BCB}},
+ {2, {0x0BB0, 0x0BCC}},
+ {2, {0x0BB2, 0x0BBE}},
+ {2, {0x0BB2, 0x0BBF}},
+ {2, {0x0BB2, 0x0BC0}},
+ {2, {0x0BB2, 0x0BC1}},
+ {2, {0x0BB2, 0x0BC2}},
+ {2, {0x0BB2, 0x0BC6}},
+ {2, {0x0BB2, 0x0BC7}},
+ {2, {0x0BB2, 0x0BC8}},
+ {2, {0x0BB2, 0x0BCA}},
+ {2, {0x0BB2, 0x0BCB}},
+ {2, {0x0BB2, 0x0BCC}},
+ {2, {0x0BB5, 0x0BBE}},
+ {2, {0x0BB5, 0x0BBF}},
+ {2, {0x0BB5, 0x0BC0}},
+ {2, {0x0BB5, 0x0BC1}},
+ {2, {0x0BB5, 0x0BC2}},
+ {2, {0x0BB5, 0x0BC6}},
+ {2, {0x0BB5, 0x0BC7}},
+ {2, {0x0BB5, 0x0BC8}},
+ {2, {0x0BB5, 0x0BCA}},
+ {2, {0x0BB5, 0x0BCB}},
+ {2, {0x0BB5, 0x0BCC}},
+ {2, {0x0BB4, 0x0BBE}},
+ {2, {0x0BB4, 0x0BBF}},
+ {2, {0x0BB4, 0x0BC0}},
+ {2, {0x0BB4, 0x0BC1}},
+ {2, {0x0BB4, 0x0BC2}},
+ {2, {0x0BB4, 0x0BC6}},
+ {2, {0x0BB4, 0x0BC7}},
+ {2, {0x0BB4, 0x0BC8}},
+ {2, {0x0BB4, 0x0BCA}},
+ {2, {0x0BB4, 0x0BCB}},
+ {2, {0x0BB4, 0x0BCC}},
+ {2, {0x0BB3, 0x0BBE}},
+ {2, {0x0BB3, 0x0BBF}},
+ {2, {0x0BB3, 0x0BC0}},
+ {2, {0x0BB3, 0x0BC1}},
+ {2, {0x0BB3, 0x0BC2}},
+ {2, {0x0BB3, 0x0BC6}},
+ {2, {0x0BB3, 0x0BC7}},
+ {2, {0x0BB3, 0x0BC8}},
+ {2, {0x0BB3, 0x0BCA}},
+ {2, {0x0BB3, 0x0BCB}},
+ {2, {0x0BB3, 0x0BCC}},
+ {2, {0x0BB1, 0x0BBE}},
+ {2, {0x0BB1, 0x0BBF}},
+ {2, {0x0BB1, 0x0BC0}},
+ {2, {0x0BB1, 0x0BC1}},
+ {2, {0x0BB1, 0x0BC2}},
+ {2, {0x0BB1, 0x0BC6}},
+ {2, {0x0BB1, 0x0BC7}},
+ {2, {0x0BB1, 0x0BC8}},
+ {2, {0x0BB1, 0x0BCA}},
+ {2, {0x0BB1, 0x0BCB}},
+ {2, {0x0BB1, 0x0BCC}},
+ {2, {0x0BA9, 0x0BBE}},
+ {2, {0x0BA9, 0x0BBF}},
+ {2, {0x0BA9, 0x0BC0}},
+ {2, {0x0BA9, 0x0BC1}},
+ {2, {0x0BA9, 0x0BC2}},
+ {2, {0x0BA9, 0x0BC6}},
+ {2, {0x0BA9, 0x0BC7}},
+ {2, {0x0BA9, 0x0BC8}},
+ {2, {0x0BA9, 0x0BCA}},
+ {2, {0x0BA9, 0x0BCB}},
+ {2, {0x0BA9, 0x0BCC}},
+ {2, {0x0B9C, 0x0BBE}},
+ {2, {0x0B9C, 0x0BBF}},
+ {2, {0x0B9C, 0x0BC0}},
+ {2, {0x0B9C, 0x0BC1}},
+ {2, {0x0B9C, 0x0BC2}},
+ {2, {0x0B9C, 0x0BC6}},
+ {2, {0x0B9C, 0x0BC7}},
+ {2, {0x0B9C, 0x0BC8}},
+ {2, {0x0B9C, 0x0BCA}},
+ {2, {0x0B9C, 0x0BCB}},
+ {2, {0x0B9C, 0x0BCC}},
+ {2, {0x0BB6, 0x0BBE}},
+ {2, {0x0BB6, 0x0BBF}},
+ {2, {0x0BB6, 0x0BC0}},
+ {2, {0x0BB6, 0x0BC1}},
+ {2, {0x0BB6, 0x0BC2}},
+ {2, {0x0BB6, 0x0BC6}},
+ {2, {0x0BB6, 0x0BC7}},
+ {2, {0x0BB6, 0x0BC8}},
+ {2, {0x0BB6, 0x0BCA}},
+ {2, {0x0BB6, 0x0BCB}},
+ {2, {0x0BB6, 0x0BCC}},
+ {2, {0x0BB7, 0x0BBE}},
+ {2, {0x0BB7, 0x0BBF}},
+ {2, {0x0BB7, 0x0BC0}},
+ {2, {0x0BB7, 0x0BC1}},
+ {2, {0x0BB7, 0x0BC2}},
+ {2, {0x0BB7, 0x0BC6}},
+ {2, {0x0BB7, 0x0BC7}},
+ {2, {0x0BB7, 0x0BC8}},
+ {2, {0x0BB7, 0x0BCA}},
+ {2, {0x0BB7, 0x0BCB}},
+ {2, {0x0BB7, 0x0BCC}},
+ {2, {0x0BB8, 0x0BBE}},
+ {2, {0x0BB8, 0x0BBF}},
+ {2, {0x0BB8, 0x0BC0}},
+ {2, {0x0BB8, 0x0BC1}},
+ {2, {0x0BB8, 0x0BC2}},
+ {2, {0x0BB8, 0x0BC6}},
+ {2, {0x0BB8, 0x0BC7}},
+ {2, {0x0BB8, 0x0BC8}},
+ {2, {0x0BB8, 0x0BCA}},
+ {2, {0x0BB8, 0x0BCB}},
+ {2, {0x0BB8, 0x0BCC}},
+ {2, {0x0BB9, 0x0BBE}},
+ {2, {0x0BB9, 0x0BBF}},
+ {2, {0x0BB9, 0x0BC0}},
+ {2, {0x0BB9, 0x0BC1}},
+ {2, {0x0BB9, 0x0BC2}},
+ {2, {0x0BB9, 0x0BC6}},
+ {2, {0x0BB9, 0x0BC7}},
+ {2, {0x0BB9, 0x0BC8}},
+ {2, {0x0BB9, 0x0BCA}},
+ {2, {0x0BB9, 0x0BCB}},
+ {2, {0x0BB9, 0x0BCC}},
+ {3, {0x0B95, 0x0BCD, 0x0BB7}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BBE}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BBF}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC0}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC1}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC2}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC6}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC7}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC8}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCA}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCB}},
+ {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCC}},
+ {4, {0x0BB6, 0x0BCD, 0x0BB0, 0x0BC0}},
+ {3, {0x0DCA, 0x200D, 0x0DBA}},
+ {3, {0x0DCA, 0x200D, 0x0DBB}},
+ {3, {0x0DBB, 0x0DCA, 0x200D}},
+ {2, {0x10E3, 0x0302}},
+ {2, {0x17D2, 0x1780}},
+ {2, {0x17D2, 0x1781}},
+ {2, {0x17D2, 0x1782}},
+ {2, {0x17D2, 0x1783}},
+ {2, {0x17D2, 0x1784}},
+ {2, {0x17D2, 0x1785}},
+ {2, {0x17D2, 0x1786}},
+ {2, {0x17D2, 0x1787}},
+ {2, {0x17D2, 0x1788}},
+ {2, {0x17D2, 0x1789}},
+ {2, {0x17D2, 0x178A}},
+ {2, {0x17D2, 0x178B}},
+ {2, {0x17D2, 0x178C}},
+ {2, {0x17D2, 0x178D}},
+ {2, {0x17D2, 0x178E}},
+ {2, {0x17D2, 0x178F}},
+ {2, {0x17D2, 0x1790}},
+ {2, {0x17D2, 0x1791}},
+ {2, {0x17D2, 0x1792}},
+ {2, {0x17D2, 0x1793}},
+ {2, {0x17D2, 0x1794}},
+ {2, {0x17D2, 0x1795}},
+ {2, {0x17D2, 0x1796}},
+ {2, {0x17D2, 0x1797}},
+ {2, {0x17D2, 0x1798}},
+ {2, {0x17D2, 0x1799}},
+ {2, {0x17D2, 0x179A}},
+ {2, {0x17D2, 0x179B}},
+ {2, {0x17D2, 0x179C}},
+ {2, {0x17D2, 0x179D}},
+ {2, {0x17D2, 0x179E}},
+ {2, {0x17D2, 0x179F}},
+ {2, {0x17D2, 0x17A0}},
+ {2, {0x17D2, 0x17A1}},
+ {2, {0x17D2, 0x17A2}},
+ {2, {0x17D2, 0x17A7}},
+ {2, {0x17D2, 0x17AB}},
+ {2, {0x17D2, 0x17AC}},
+ {2, {0x17D2, 0x17AF}},
+ {2, {0x17BB, 0x17C6}},
+ {2, {0x17B6, 0x17C6}},
+ {2, {0x304B, 0x309A}},
+ {2, {0x304D, 0x309A}},
+ {2, {0x304F, 0x309A}},
+ {2, {0x3051, 0x309A}},
+ {2, {0x3053, 0x309A}},
+ {2, {0x30AB, 0x309A}},
+ {2, {0x30AD, 0x309A}},
+ {2, {0x30AF, 0x309A}},
+ {2, {0x30B1, 0x309A}},
+ {2, {0x30B3, 0x309A}},
+ {2, {0x30BB, 0x309A}},
+ {2, {0x30C4, 0x309A}},
+ {2, {0x30C8, 0x309A}},
+ {2, {0x31F7, 0x309A}},
+ {2, {0x02E5, 0x02E9}},
+ {2, {0x02E9, 0x02E5}},
+};
diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c
index ec924f2..661b6e2 100644
--- a/Modules/xxlimited.c
+++ b/Modules/xxlimited.c
@@ -187,8 +187,7 @@ static PyType_Spec Str_Type_spec = {
static PyObject *
null_richcompare(PyObject *self, PyObject *other, int op)
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyType_Slot Null_Type_slots[] = {
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index 7ae4f0a..2feb2a8 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -49,7 +49,7 @@ static PyObject *zip_directory_cache = NULL;
/* forward decls */
static PyObject *read_directory(PyObject *archive);
static PyObject *get_data(PyObject *archive, PyObject *toc_entry);
-static PyObject *get_module_code(ZipImporter *self, char *fullname,
+static PyObject *get_module_code(ZipImporter *self, PyObject *fullname,
int *p_ispackage, PyObject **p_modpath);
@@ -63,109 +63,109 @@ static PyObject *get_module_code(ZipImporter *self, char *fullname,
static int
zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)
{
- PyObject *pathobj, *files;
- Py_UNICODE *path, *p, *prefix, buf[MAXPATHLEN+2];
- Py_ssize_t len;
+ PyObject *path, *files, *tmp;
+ PyObject *filename = NULL;
+ Py_ssize_t len, flen;
+#ifdef ALTSEP
+ _Py_IDENTIFIER(replace);
+#endif
if (!_PyArg_NoKeywords("zipimporter()", kwds))
return -1;
if (!PyArg_ParseTuple(args, "O&:zipimporter",
- PyUnicode_FSDecoder, &pathobj))
+ PyUnicode_FSDecoder, &path))
+ return -1;
+
+ if (PyUnicode_READY(path) == -1)
return -1;
- /* copy path to buf */
- len = PyUnicode_GET_SIZE(pathobj);
+ len = PyUnicode_GET_LENGTH(path);
if (len == 0) {
PyErr_SetString(ZipImportError, "archive path is empty");
goto error;
}
- if (len >= MAXPATHLEN) {
- PyErr_SetString(ZipImportError,
- "archive path too long");
- goto error;
- }
- Py_UNICODE_strcpy(buf, PyUnicode_AS_UNICODE(pathobj));
#ifdef ALTSEP
- for (p = buf; *p; p++) {
- if (*p == ALTSEP)
- *p = SEP;
- }
+ tmp = _PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP);
+ if (!tmp)
+ goto error;
+ Py_DECREF(path);
+ path = tmp;
#endif
- path = NULL;
- prefix = NULL;
+ filename = path;
+ Py_INCREF(filename);
+ flen = len;
for (;;) {
struct stat statbuf;
int rv;
- if (pathobj == NULL) {
- pathobj = PyUnicode_FromUnicode(buf, len);
- if (pathobj == NULL)
- goto error;
- }
- rv = _Py_stat(pathobj, &statbuf);
+ rv = _Py_stat(filename, &statbuf);
+ if (rv == -2)
+ goto error;
if (rv == 0) {
/* it exists */
- if (S_ISREG(statbuf.st_mode))
- /* it's a file */
- path = buf;
+ if (!S_ISREG(statbuf.st_mode))
+ /* it's a not file */
+ Py_CLEAR(filename);
break;
}
- else if (PyErr_Occurred())
- goto error;
+ Py_CLEAR(filename);
/* back up one path element */
- p = Py_UNICODE_strrchr(buf, SEP);
- if (prefix != NULL)
- *prefix = SEP;
- if (p == NULL)
+ flen = PyUnicode_FindChar(path, SEP, 0, flen, -1);
+ if (flen == -1)
break;
- *p = '\0';
- len = p - buf;
- prefix = p;
- Py_CLEAR(pathobj);
+ filename = PyUnicode_Substring(path, 0, flen);
}
- if (path == NULL) {
+ if (filename == NULL) {
PyErr_SetString(ZipImportError, "not a Zip file");
goto error;
}
- files = PyDict_GetItem(zip_directory_cache, pathobj);
+ if (PyUnicode_READY(filename) < 0)
+ goto error;
+
+ files = PyDict_GetItem(zip_directory_cache, filename);
if (files == NULL) {
- files = read_directory(pathobj);
+ files = read_directory(filename);
if (files == NULL)
goto error;
- if (PyDict_SetItem(zip_directory_cache, pathobj, files) != 0)
+ if (PyDict_SetItem(zip_directory_cache, filename, files) != 0)
goto error;
}
else
Py_INCREF(files);
self->files = files;
- self->archive = pathobj;
- pathobj = NULL;
+ /* Transfer reference */
+ self->archive = filename;
+ filename = NULL;
- if (prefix != NULL) {
- prefix++;
- len = Py_UNICODE_strlen(prefix);
- if (prefix[len-1] != SEP) {
+ /* Check if there is a prefix directory following the filename. */
+ if (flen != len) {
+ tmp = PyUnicode_Substring(path, flen+1,
+ PyUnicode_GET_LENGTH(path));
+ if (tmp == NULL)
+ goto error;
+ self->prefix = tmp;
+ if (PyUnicode_READ_CHAR(path, len-1) != SEP) {
/* add trailing SEP */
- prefix[len] = SEP;
- prefix[len + 1] = '\0';
- len++;
+ tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP);
+ if (tmp == NULL)
+ goto error;
+ Py_DECREF(self->prefix);
+ self->prefix = tmp;
}
}
else
- len = 0;
- self->prefix = PyUnicode_FromUnicode(prefix, len);
- if (self->prefix == NULL)
- goto error;
-
+ self->prefix = PyUnicode_New(0, 0);
+ Py_DECREF(path);
return 0;
error:
- Py_XDECREF(pathobj);
+ Py_DECREF(path);
+ Py_XDECREF(filename);
return -1;
}
@@ -193,7 +193,7 @@ zipimporter_repr(ZipImporter *self)
{
if (self->archive == NULL)
return PyUnicode_FromString("<zipimporter object \"???\">");
- else if (self->prefix != NULL && PyUnicode_GET_SIZE(self->prefix) != 0)
+ else if (self->prefix != NULL && PyUnicode_GET_LENGTH(self->prefix) != 0)
return PyUnicode_FromFormat("<zipimporter object \"%U%c%U\">",
self->archive, SEP, self->prefix);
else
@@ -202,49 +202,58 @@ zipimporter_repr(ZipImporter *self)
}
/* return fullname.split(".")[-1] */
-static char *
-get_subname(char *fullname)
+static PyObject *
+get_subname(PyObject *fullname)
{
- char *subname = strrchr(fullname, '.');
- if (subname == NULL)
- subname = fullname;
- else
- subname++;
- return subname;
+ Py_ssize_t len, dot;
+ if (PyUnicode_READY(fullname) < 0)
+ return NULL;
+ len = PyUnicode_GET_LENGTH(fullname);
+ dot = PyUnicode_FindChar(fullname, '.', 0, len, -1);
+ if (dot == -1) {
+ Py_INCREF(fullname);
+ return fullname;
+ } else
+ return PyUnicode_Substring(fullname, dot+1, len);
}
/* Given a (sub)modulename, write the potential file path in the
archive (without extension) to the path buffer. Return the
- length of the resulting string. */
-static int
-make_filename(PyObject *prefix_obj, char *name, char *path, size_t pathsize)
-{
- size_t len;
- char *p;
- PyObject *prefix;
+ length of the resulting string.
- prefix = PyUnicode_EncodeFSDefault(prefix_obj);
- if (prefix == NULL)
- return -1;
- len = PyBytes_GET_SIZE(prefix);
+ return self.prefix + name.replace('.', os.sep) */
+static PyObject*
+make_filename(PyObject *prefix, PyObject *name)
+{
+ PyObject *pathobj;
+ Py_UCS4 *p, *buf;
+ Py_ssize_t len;
- /* self.prefix + name [+ SEP + "__init__"] + ".py[co]" */
- if (len + strlen(name) + 13 >= pathsize - 1) {
- PyErr_SetString(ZipImportError, "path too long");
- Py_DECREF(prefix);
- return -1;
+ len = PyUnicode_GET_LENGTH(prefix) + PyUnicode_GET_LENGTH(name) + 1;
+ p = buf = PyMem_Malloc(sizeof(Py_UCS4) * len);
+ if (buf == NULL) {
+ PyErr_NoMemory();
+ return NULL;
}
- strcpy(path, PyBytes_AS_STRING(prefix));
- Py_DECREF(prefix);
- strcpy(path + len, name);
- for (p = path + len; *p; p++) {
+ if (!PyUnicode_AsUCS4(prefix, p, len, 0)) {
+ PyMem_Free(buf);
+ return NULL;
+ }
+ p += PyUnicode_GET_LENGTH(prefix);
+ len -= PyUnicode_GET_LENGTH(prefix);
+ if (!PyUnicode_AsUCS4(name, p, len, 1)) {
+ PyMem_Free(buf);
+ return NULL;
+ }
+ for (; *p; p++) {
if (*p == '.')
*p = SEP;
}
- len += strlen(name);
- assert(len < INT_MAX);
- return (int)len;
+ pathobj = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ buf, p-buf);
+ PyMem_Free(buf);
+ return pathobj;
}
enum zi_module_info {
@@ -254,32 +263,113 @@ enum zi_module_info {
MI_PACKAGE
};
+/* Does this path represent a directory?
+ on error, return < 0
+ if not a dir, return 0
+ if a dir, return 1
+*/
+static int
+check_is_directory(ZipImporter *self, PyObject* prefix, PyObject *path)
+{
+ PyObject *dirpath;
+ int res;
+
+ /* See if this is a "directory". If so, it's eligible to be part
+ of a namespace package. We test by seeing if the name, with an
+ appended path separator, exists. */
+ dirpath = PyUnicode_FromFormat("%U%U%c", prefix, path, SEP);
+ if (dirpath == NULL)
+ return -1;
+ /* If dirpath is present in self->files, we have a directory. */
+ res = PyDict_Contains(self->files, dirpath);
+ Py_DECREF(dirpath);
+ return res;
+}
+
/* Return some information about a module. */
static enum zi_module_info
-get_module_info(ZipImporter *self, char *fullname)
+get_module_info(ZipImporter *self, PyObject *fullname)
{
- char *subname, path[MAXPATHLEN + 1];
- int len;
+ PyObject *subname;
+ PyObject *path, *fullpath, *item;
struct st_zip_searchorder *zso;
subname = get_subname(fullname);
+ if (subname == NULL)
+ return MI_ERROR;
- len = make_filename(self->prefix, subname, path, sizeof(path));
- if (len < 0)
+ path = make_filename(self->prefix, subname);
+ Py_DECREF(subname);
+ if (path == NULL)
return MI_ERROR;
for (zso = zip_searchorder; *zso->suffix; zso++) {
- strcpy(path + len, zso->suffix);
- if (PyDict_GetItemString(self->files, path) != NULL) {
+ fullpath = PyUnicode_FromFormat("%U%s", path, zso->suffix);
+ if (fullpath == NULL) {
+ Py_DECREF(path);
+ return MI_ERROR;
+ }
+ item = PyDict_GetItem(self->files, fullpath);
+ Py_DECREF(fullpath);
+ if (item != NULL) {
+ Py_DECREF(path);
if (zso->type & IS_PACKAGE)
return MI_PACKAGE;
else
return MI_MODULE;
}
}
+ Py_DECREF(path);
return MI_NOT_FOUND;
}
+typedef enum {
+ FL_ERROR,
+ FL_NOT_FOUND,
+ FL_MODULE_FOUND,
+ FL_NS_FOUND
+} find_loader_result;
+
+/* The guts of "find_loader" and "find_module". Return values:
+ -1: error
+ 0: no loader or namespace portions found
+ 1: module/package found
+ 2: namespace portion found: *namespace_portion will point to the name
+*/
+static find_loader_result
+find_loader(ZipImporter *self, PyObject *fullname, PyObject **namespace_portion)
+{
+ enum zi_module_info mi;
+
+ *namespace_portion = NULL;
+
+ mi = get_module_info(self, fullname);
+ if (mi == MI_ERROR)
+ return FL_ERROR;
+ if (mi == MI_NOT_FOUND) {
+ /* Not a module or regular package. See if this is a directory, and
+ therefore possibly a portion of a namespace package. */
+ int is_dir = check_is_directory(self, self->prefix, fullname);
+ if (is_dir < 0)
+ return -1;
+ if (is_dir) {
+ /* This is possibly a portion of a namespace
+ package. Return the string representing its path,
+ without a trailing separator. */
+ *namespace_portion = PyUnicode_FromFormat("%U%c%U%U",
+ self->archive, SEP,
+ self->prefix, fullname);
+ if (*namespace_portion == NULL)
+ return FL_ERROR;
+ return FL_NS_FOUND;
+ }
+ return FL_NOT_FOUND;
+ }
+ /* This is a module or package. */
+ return FL_MODULE_FOUND;
+}
+
+
/* Check whether we can satisfy the import of the module named by
'fullname'. Return self if we can, None if we can't. */
static PyObject *
@@ -287,22 +377,64 @@ zipimporter_find_module(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
PyObject *path = NULL;
- char *fullname;
- enum zi_module_info mi;
+ PyObject *fullname;
+ PyObject *namespace_portion = NULL;
+ PyObject *result = NULL;
- if (!PyArg_ParseTuple(args, "s|O:zipimporter.find_module",
- &fullname, &path))
+ if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module", &fullname, &path))
return NULL;
- mi = get_module_info(self, fullname);
- if (mi == MI_ERROR)
+ switch (find_loader(self, fullname, &namespace_portion)) {
+ case FL_ERROR:
return NULL;
- if (mi == MI_NOT_FOUND) {
- Py_INCREF(Py_None);
- return Py_None;
+ case FL_NS_FOUND:
+ /* A namespace portion is not allowed via find_module, so return None. */
+ Py_DECREF(namespace_portion);
+ /* FALL THROUGH */
+ case FL_NOT_FOUND:
+ result = Py_None;
+ break;
+ case FL_MODULE_FOUND:
+ result = (PyObject *)self;
+ break;
}
- Py_INCREF(self);
- return (PyObject *)self;
+ Py_INCREF(result);
+ return result;
+}
+
+
+/* Check whether we can satisfy the import of the module named by
+ 'fullname', or whether it could be a portion of a namespace
+ package. Return self if we can load it, a string containing the
+ full path if it's a possible namespace portion, None if we
+ can't load it. */
+static PyObject *
+zipimporter_find_loader(PyObject *obj, PyObject *args)
+{
+ ZipImporter *self = (ZipImporter *)obj;
+ PyObject *path = NULL;
+ PyObject *fullname;
+ PyObject *result = NULL;
+ PyObject *namespace_portion = NULL;
+
+ if (!PyArg_ParseTuple(args, "U|O:zipimporter.find_module", &fullname, &path))
+ return NULL;
+
+ switch (find_loader(self, fullname, &namespace_portion)) {
+ case FL_ERROR:
+ return NULL;
+ case FL_NOT_FOUND: /* Not found, return (None, []) */
+ result = Py_BuildValue("O[]", Py_None);
+ break;
+ case FL_MODULE_FOUND: /* Return (self, []) */
+ result = Py_BuildValue("O[]", self);
+ break;
+ case FL_NS_FOUND: /* Return (None, [namespace_portion]) */
+ result = Py_BuildValue("O[O]", Py_None, namespace_portion);
+ Py_DECREF(namespace_portion);
+ return result;
+ }
+ return result;
}
/* Load and return the module named by 'fullname'. */
@@ -311,19 +443,21 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
PyObject *code = NULL, *mod, *dict;
- char *fullname;
- PyObject *modpath = NULL, *modpath_bytes;
+ PyObject *fullname;
+ PyObject *modpath = NULL;
int ispackage;
- if (!PyArg_ParseTuple(args, "s:zipimporter.load_module",
+ if (!PyArg_ParseTuple(args, "U:zipimporter.load_module",
&fullname))
return NULL;
+ if (PyUnicode_READY(fullname) == -1)
+ return NULL;
code = get_module_code(self, fullname, &ispackage, &modpath);
if (code == NULL)
goto error;
- mod = PyImport_AddModule(fullname);
+ mod = PyImport_AddModuleObject(fullname);
if (mod == NULL)
goto error;
dict = PyModule_GetDict(mod);
@@ -336,17 +470,17 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
/* add __path__ to the module *before* the code gets
executed */
PyObject *pkgpath, *fullpath;
- char *subname = get_subname(fullname);
+ PyObject *subname = get_subname(fullname);
int err;
- fullpath = PyUnicode_FromFormat("%U%c%U%s",
+ fullpath = PyUnicode_FromFormat("%U%c%U%U",
self->archive, SEP,
self->prefix, subname);
+ Py_DECREF(subname);
if (fullpath == NULL)
goto error;
- pkgpath = Py_BuildValue("[O]", fullpath);
- Py_DECREF(fullpath);
+ pkgpath = Py_BuildValue("[N]", fullpath);
if (pkgpath == NULL)
goto error;
err = PyDict_SetItemString(dict, "__path__", pkgpath);
@@ -354,18 +488,13 @@ zipimporter_load_module(PyObject *obj, PyObject *args)
if (err != 0)
goto error;
}
- modpath_bytes = PyUnicode_EncodeFSDefault(modpath);
- if (modpath_bytes == NULL)
- goto error;
- mod = PyImport_ExecCodeModuleEx(fullname, code,
- PyBytes_AS_STRING(modpath_bytes));
- Py_DECREF(modpath_bytes);
+ mod = PyImport_ExecCodeModuleObject(fullname, code, modpath, NULL);
Py_CLEAR(code);
if (mod == NULL)
goto error;
if (Py_VerboseFlag)
- PySys_FormatStderr("import %s # loaded from Zip %U\n",
+ PySys_FormatStderr("import %U # loaded from Zip %U\n",
fullname, modpath);
Py_DECREF(modpath);
return mod;
@@ -380,12 +509,10 @@ static PyObject *
zipimporter_get_filename(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
- PyObject *code;
- char *fullname;
- PyObject *modpath;
+ PyObject *fullname, *code, *modpath;
int ispackage;
- if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename",
+ if (!PyArg_ParseTuple(args, "U:zipimporter.get_filename",
&fullname))
return NULL;
@@ -404,10 +531,10 @@ static PyObject *
zipimporter_is_package(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
- char *fullname;
+ PyObject *fullname;
enum zi_module_info mi;
- if (!PyArg_ParseTuple(args, "s:zipimporter.is_package",
+ if (!PyArg_ParseTuple(args, "U:zipimporter.is_package",
&fullname))
return NULL;
@@ -415,71 +542,70 @@ zipimporter_is_package(PyObject *obj, PyObject *args)
if (mi == MI_ERROR)
return NULL;
if (mi == MI_NOT_FOUND) {
- PyErr_Format(ZipImportError, "can't find module '%s'", fullname);
+ PyErr_Format(ZipImportError, "can't find module %R", fullname);
return NULL;
}
return PyBool_FromLong(mi == MI_PACKAGE);
}
+
static PyObject *
zipimporter_get_data(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
- PyObject *pathobj, *key;
- const Py_UNICODE *path;
+ PyObject *path, *key;
#ifdef ALTSEP
- Py_UNICODE *p, buf[MAXPATHLEN + 1];
+ _Py_IDENTIFIER(replace);
#endif
- Py_UNICODE *archive;
PyObject *toc_entry;
- Py_ssize_t path_len, len;
+ Py_ssize_t path_start, path_len, len;
- if (!PyArg_ParseTuple(args, "U:zipimporter.get_data", &pathobj))
+ if (!PyArg_ParseTuple(args, "U:zipimporter.get_data", &path))
return NULL;
- path_len = PyUnicode_GET_SIZE(pathobj);
- path = PyUnicode_AS_UNICODE(pathobj);
#ifdef ALTSEP
- if (path_len >= MAXPATHLEN) {
- PyErr_SetString(ZipImportError, "path too long");
+ path = _PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP);
+ if (!path)
return NULL;
- }
- Py_UNICODE_strcpy(buf, path);
- for (p = buf; *p; p++) {
- if (*p == ALTSEP)
- *p = SEP;
- }
- path = buf;
+#else
+ Py_INCREF(path);
#endif
- archive = PyUnicode_AS_UNICODE(self->archive);
- len = PyUnicode_GET_SIZE(self->archive);
- if ((size_t)len < Py_UNICODE_strlen(path) &&
- Py_UNICODE_strncmp(path, archive, len) == 0 &&
- path[len] == SEP) {
- path += len + 1;
- path_len -= len + 1;
+ if (PyUnicode_READY(path) == -1)
+ goto error;
+
+ path_len = PyUnicode_GET_LENGTH(path);
+
+ len = PyUnicode_GET_LENGTH(self->archive);
+ path_start = 0;
+ if (PyUnicode_Tailmatch(path, self->archive, 0, len, -1)
+ && PyUnicode_READ_CHAR(path, len) == SEP) {
+ path_start = len + 1;
}
- key = PyUnicode_FromUnicode(path, path_len);
+ key = PyUnicode_Substring(path, path_start, path_len);
if (key == NULL)
- return NULL;
+ goto error;
toc_entry = PyDict_GetItem(self->files, key);
if (toc_entry == NULL) {
PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, key);
Py_DECREF(key);
- return NULL;
+ goto error;
}
Py_DECREF(key);
+ Py_DECREF(path);
return get_data(self->archive, toc_entry);
+ error:
+ Py_DECREF(path);
+ return NULL;
}
static PyObject *
zipimporter_get_code(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
- char *fullname;
+ PyObject *fullname;
- if (!PyArg_ParseTuple(args, "s:zipimporter.get_code", &fullname))
+ if (!PyArg_ParseTuple(args, "U:zipimporter.get_code", &fullname))
return NULL;
return get_module_code(self, fullname, NULL, NULL);
@@ -490,34 +616,39 @@ zipimporter_get_source(PyObject *obj, PyObject *args)
{
ZipImporter *self = (ZipImporter *)obj;
PyObject *toc_entry;
- char *fullname, *subname, path[MAXPATHLEN+1];
- int len;
+ PyObject *fullname, *subname, *path, *fullpath;
enum zi_module_info mi;
- if (!PyArg_ParseTuple(args, "s:zipimporter.get_source", &fullname))
+ if (!PyArg_ParseTuple(args, "U:zipimporter.get_source", &fullname))
return NULL;
mi = get_module_info(self, fullname);
if (mi == MI_ERROR)
return NULL;
if (mi == MI_NOT_FOUND) {
- PyErr_Format(ZipImportError, "can't find module '%s'", fullname);
+ PyErr_Format(ZipImportError, "can't find module %R", fullname);
return NULL;
}
+
subname = get_subname(fullname);
+ if (subname == NULL)
+ return NULL;
- len = make_filename(self->prefix, subname, path, sizeof(path));
- if (len < 0)
+ path = make_filename(self->prefix, subname);
+ Py_DECREF(subname);
+ if (path == NULL)
return NULL;
- if (mi == MI_PACKAGE) {
- path[len] = SEP;
- strcpy(path + len + 1, "__init__.py");
- }
+ if (mi == MI_PACKAGE)
+ fullpath = PyUnicode_FromFormat("%U%c__init__.py", path, SEP);
else
- strcpy(path + len, ".py");
+ fullpath = PyUnicode_FromFormat("%U.py", path);
+ Py_DECREF(path);
+ if (fullpath == NULL)
+ return NULL;
- toc_entry = PyDict_GetItemString(self->files, path);
+ toc_entry = PyDict_GetItem(self->files, fullpath);
+ Py_DECREF(fullpath);
if (toc_entry != NULL) {
PyObject *res, *bytes;
bytes = get_data(self->archive, toc_entry);
@@ -543,6 +674,16 @@ instance itself if the module was found, or None if it wasn't.\n\
The optional 'path' argument is ignored -- it's there for compatibility\n\
with the importer protocol.");
+PyDoc_STRVAR(doc_find_loader,
+"find_loader(fullname, path=None) -> self, str or None.\n\
+\n\
+Search for a module specified by 'fullname'. 'fullname' must be the\n\
+fully qualified (dotted) module name. It returns the zipimporter\n\
+instance itself if the module was found, a string containing the\n\
+full path name if it's possibly a portion of a namespace package,\n\
+or None otherwise. The optional 'path' argument is ignored -- it's\n\
+ there for compatibility with the importer protocol.");
+
PyDoc_STRVAR(doc_load_module,
"load_module(fullname) -> module.\n\
\n\
@@ -584,6 +725,8 @@ Return the filename for the specified module.");
static PyMethodDef zipimporter_methods[] = {
{"find_module", zipimporter_find_module, METH_VARARGS,
doc_find_module},
+ {"find_loader", zipimporter_find_loader, METH_VARARGS,
+ doc_find_loader},
{"load_module", zipimporter_load_module, METH_VARARGS,
doc_load_module},
{"get_data", zipimporter_get_data, METH_VARARGS,
@@ -708,55 +851,46 @@ get_long(unsigned char *buf) {
data_size and file_offset are 0.
*/
static PyObject *
-read_directory(PyObject *archive_obj)
+read_directory(PyObject *archive)
{
- /* FIXME: work on Py_UNICODE* instead of char* */
PyObject *files = NULL;
FILE *fp;
unsigned short flags;
short compress, time, date, name_size;
long crc, data_size, file_size, header_size;
Py_ssize_t file_offset, header_position, header_offset;
- long i, l, count;
- size_t length;
- Py_UNICODE path[MAXPATHLEN + 5];
+ long l, count;
+ Py_ssize_t i;
char name[MAXPATHLEN + 5];
PyObject *nameobj = NULL;
char *p, endof_central_dir[22];
Py_ssize_t arc_offset; /* Absolute offset to start of the zip-archive. */
- PyObject *pathobj;
+ PyObject *path;
const char *charset;
int bootstrap;
- if (PyUnicode_GET_SIZE(archive_obj) > MAXPATHLEN) {
- PyErr_SetString(PyExc_OverflowError,
- "Zip path name is too long");
- return NULL;
- }
- Py_UNICODE_strcpy(path, PyUnicode_AS_UNICODE(archive_obj));
-
- fp = _Py_fopen(archive_obj, "rb");
+ fp = _Py_fopen(archive, "rb");
if (fp == NULL) {
if (!PyErr_Occurred())
- PyErr_Format(ZipImportError, "can't open Zip file: '%U'", archive_obj);
+ PyErr_Format(ZipImportError, "can't open Zip file: %R", archive);
return NULL;
}
if (fseek(fp, -22, SEEK_END) == -1) {
fclose(fp);
- PyErr_Format(ZipImportError, "can't read Zip file: %U", archive_obj);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
}
header_position = ftell(fp);
if (fread(endof_central_dir, 1, 22, fp) != 22) {
fclose(fp);
- PyErr_Format(ZipImportError, "can't read Zip file: '%U'", archive_obj);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
}
if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) {
/* Bad: End of Central Dir signature */
fclose(fp);
- PyErr_Format(ZipImportError, "not a Zip file: '%U'", archive_obj);
+ PyErr_Format(ZipImportError, "not a Zip file: %R", archive);
return NULL;
}
@@ -769,9 +903,6 @@ read_directory(PyObject *archive_obj)
if (files == NULL)
goto error;
- length = Py_UNICODE_strlen(path);
- path[length] = SEP;
-
/* Start of Central Directory */
count = 0;
for (;;) {
@@ -803,7 +934,7 @@ read_directory(PyObject *archive_obj)
name_size = MAXPATHLEN;
p = name;
- for (i = 0; i < name_size; i++) {
+ for (i = 0; i < (Py_ssize_t)name_size; i++) {
*p = (char)getc(fp);
if (*p == '/')
*p = SEP;
@@ -836,12 +967,12 @@ read_directory(PyObject *archive_obj)
PY_MAJOR_VERSION, PY_MINOR_VERSION);
goto error;
}
- Py_UNICODE_strncpy(path + length + 1, PyUnicode_AS_UNICODE(nameobj), MAXPATHLEN - length - 1);
-
- pathobj = PyUnicode_FromUnicode(path, Py_UNICODE_strlen(path));
- if (pathobj == NULL)
+ if (PyUnicode_READY(nameobj) == -1)
+ goto error;
+ path = PyUnicode_FromFormat("%U%c%U", archive, SEP, nameobj);
+ if (path == NULL)
goto error;
- t = Py_BuildValue("Nhllnhhl", pathobj, compress, data_size,
+ t = Py_BuildValue("Nhllnhhl", path, compress, data_size,
file_size, file_offset, time, date, crc);
if (t == NULL)
goto error;
@@ -854,14 +985,14 @@ read_directory(PyObject *archive_obj)
}
fclose(fp);
if (Py_VerboseFlag)
- PySys_FormatStderr("# zipimport: found %ld names in %U\n",
- count, archive_obj);
+ PySys_FormatStderr("# zipimport: found %ld names in %R\n",
+ count, archive);
return files;
fseek_error:
fclose(fp);
Py_XDECREF(files);
Py_XDECREF(nameobj);
- PyErr_Format(ZipImportError, "can't read Zip file: %U", archive_obj);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
error:
fclose(fp);
@@ -879,6 +1010,7 @@ get_decompress_func(void)
static int importing_zlib = 0;
PyObject *zlib;
PyObject *decompress;
+ _Py_IDENTIFIER(decompress);
if (importing_zlib != 0)
/* Someone has a zlib.py[co] in their Zip file;
@@ -888,8 +1020,8 @@ get_decompress_func(void)
zlib = PyImport_ImportModuleNoBlock("zlib");
importing_zlib = 0;
if (zlib != NULL) {
- decompress = PyObject_GetAttrString(zlib,
- "decompress");
+ decompress = _PyObject_GetAttrId(zlib,
+ &PyId_decompress);
Py_DECREF(zlib);
}
else {
@@ -934,7 +1066,7 @@ get_data(PyObject *archive, PyObject *toc_entry)
/* Check to make sure the local file header is correct */
if (fseek(fp, file_offset, 0) == -1) {
fclose(fp);
- PyErr_Format(ZipImportError, "can't read Zip file: %U", archive);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
}
@@ -949,7 +1081,7 @@ get_data(PyObject *archive, PyObject *toc_entry)
}
if (fseek(fp, file_offset + 26, 0) == -1) {
fclose(fp);
- PyErr_Format(ZipImportError, "can't read Zip file: %U", archive);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
}
@@ -973,7 +1105,7 @@ get_data(PyObject *archive, PyObject *toc_entry)
bytes_read = fread(buf, 1, data_size, fp);
} else {
fclose(fp);
- PyErr_Format(ZipImportError, "can't read Zip file: %U", archive);
+ PyErr_Format(ZipImportError, "can't read Zip file: %R", archive);
return NULL;
}
fclose(fp);
@@ -1030,7 +1162,7 @@ eq_mtime(time_t t1, time_t t2)
to .py if available and we don't want to mask other errors).
Returns a new reference. */
static PyObject *
-unmarshal_code(char *pathname, PyObject *data, time_t mtime)
+unmarshal_code(PyObject *pathname, PyObject *data, time_t mtime)
{
PyObject *code;
char *buf = PyBytes_AsString(data);
@@ -1044,8 +1176,8 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime)
if (get_long((unsigned char *)buf) != PyImport_GetMagicNumber()) {
if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad magic\n",
- pathname);
+ PySys_FormatStderr("# %R has bad magic\n",
+ pathname);
Py_INCREF(Py_None);
return Py_None; /* signal caller to try alternative */
}
@@ -1053,19 +1185,21 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime)
if (mtime != 0 && !eq_mtime(get_long((unsigned char *)buf + 4),
mtime)) {
if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad mtime\n",
- pathname);
+ PySys_FormatStderr("# %R has bad mtime\n",
+ pathname);
Py_INCREF(Py_None);
return Py_None; /* signal caller to try alternative */
}
- code = PyMarshal_ReadObjectFromString(buf + 8, size - 8);
+ /* XXX the pyc's size field is ignored; timestamp collisions are probably
+ unimportant with zip files. */
+ code = PyMarshal_ReadObjectFromString(buf + 12, size - 12);
if (code == NULL)
return NULL;
if (!PyCode_Check(code)) {
Py_DECREF(code);
PyErr_Format(PyExc_TypeError,
- "compiled module %s is not a code object",
+ "compiled module %R is not a code object",
pathname);
return NULL;
}
@@ -1079,11 +1213,12 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime)
static PyObject *
normalize_line_endings(PyObject *source)
{
- char *buf, *q, *p = PyBytes_AsString(source);
+ char *buf, *q, *p;
PyObject *fixed_source;
int len = 0;
- if (!p) {
+ p = PyBytes_AsString(source);
+ if (p == NULL) {
return PyBytes_FromStringAndSize("\n\0", 2);
}
@@ -1116,16 +1251,24 @@ normalize_line_endings(PyObject *source)
/* Given a string buffer containing Python source code, compile it
return and return a code object as a new reference. */
static PyObject *
-compile_source(char *pathname, PyObject *source)
+compile_source(PyObject *pathname, PyObject *source)
{
- PyObject *code, *fixed_source;
+ PyObject *code, *fixed_source, *pathbytes;
+
+ pathbytes = PyUnicode_EncodeFSDefault(pathname);
+ if (pathbytes == NULL)
+ return NULL;
fixed_source = normalize_line_endings(source);
- if (fixed_source == NULL)
+ if (fixed_source == NULL) {
+ Py_DECREF(pathbytes);
return NULL;
+ }
- code = Py_CompileString(PyBytes_AsString(fixed_source), pathname,
+ code = Py_CompileString(PyBytes_AsString(fixed_source),
+ PyBytes_AsString(pathbytes),
Py_file_input);
+ Py_DECREF(pathbytes);
Py_DECREF(fixed_source);
return code;
}
@@ -1154,14 +1297,22 @@ parse_dostime(int dostime, int dosdate)
modification time of the matching .py file, or 0 if no source
is available. */
static time_t
-get_mtime_of_source(ZipImporter *self, char *path)
+get_mtime_of_source(ZipImporter *self, PyObject *path)
{
- PyObject *toc_entry;
- time_t mtime = 0;
- Py_ssize_t lastchar = strlen(path) - 1;
- char savechar = path[lastchar];
- path[lastchar] = '\0'; /* strip 'c' or 'o' from *.py[co] */
- toc_entry = PyDict_GetItemString(self->files, path);
+ PyObject *toc_entry, *stripped;
+ time_t mtime;
+
+ /* strip 'c' or 'o' from *.py[co] */
+ if (PyUnicode_READY(path) == -1)
+ return (time_t)-1;
+ stripped = PyUnicode_FromKindAndData(PyUnicode_KIND(path),
+ PyUnicode_DATA(path),
+ PyUnicode_GET_LENGTH(path) - 1);
+ if (stripped == NULL)
+ return (time_t)-1;
+
+ toc_entry = PyDict_GetItem(self->files, stripped);
+ Py_DECREF(stripped);
if (toc_entry != NULL && PyTuple_Check(toc_entry) &&
PyTuple_Size(toc_entry) == 8) {
/* fetch the time stamp of the .py file for comparison
@@ -1170,8 +1321,8 @@ get_mtime_of_source(ZipImporter *self, char *path)
time = PyLong_AsLong(PyTuple_GetItem(toc_entry, 5));
date = PyLong_AsLong(PyTuple_GetItem(toc_entry, 6));
mtime = parse_dostime(time, date);
- }
- path[lastchar] = savechar;
+ } else
+ mtime = 0;
return mtime;
}
@@ -1181,24 +1332,17 @@ static PyObject *
get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,
time_t mtime, PyObject *toc_entry)
{
- PyObject *data, *code;
- PyObject *modpath;
+ PyObject *data, *modpath, *code;
data = get_data(self->archive, toc_entry);
if (data == NULL)
return NULL;
- modpath = PyUnicode_EncodeFSDefault(PyTuple_GetItem(toc_entry, 0));
- if (modpath == NULL) {
- Py_DECREF(data);
- return NULL;
- }
-
+ modpath = PyTuple_GetItem(toc_entry, 0);
if (isbytecode)
- code = unmarshal_code(PyBytes_AS_STRING(modpath), data, mtime);
+ code = unmarshal_code(modpath, data, mtime);
else
- code = compile_source(PyBytes_AS_STRING(modpath), data);
- Py_DECREF(modpath);
+ code = compile_source(modpath, data);
Py_DECREF(data);
return code;
}
@@ -1206,35 +1350,45 @@ get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,
/* Get the code object associated with the module specified by
'fullname'. */
static PyObject *
-get_module_code(ZipImporter *self, char *fullname,
+get_module_code(ZipImporter *self, PyObject *fullname,
int *p_ispackage, PyObject **p_modpath)
{
- PyObject *toc_entry;
- char *subname, path[MAXPATHLEN + 1];
- int len;
+ PyObject *code = NULL, *toc_entry, *subname;
+ PyObject *path, *fullpath = NULL;
struct st_zip_searchorder *zso;
subname = get_subname(fullname);
+ if (subname == NULL)
+ return NULL;
- len = make_filename(self->prefix, subname, path, sizeof(path));
- if (len < 0)
+ path = make_filename(self->prefix, subname);
+ Py_DECREF(subname);
+ if (path == NULL)
return NULL;
for (zso = zip_searchorder; *zso->suffix; zso++) {
- PyObject *code = NULL;
+ code = NULL;
+
+ fullpath = PyUnicode_FromFormat("%U%s", path, zso->suffix);
+ if (fullpath == NULL)
+ goto exit;
- strcpy(path + len, zso->suffix);
if (Py_VerboseFlag > 1)
- PySys_FormatStderr("# trying %U%c%s\n",
- self->archive, (int)SEP, path);
- toc_entry = PyDict_GetItemString(self->files, path);
+ PySys_FormatStderr("# trying %U%c%U\n",
+ self->archive, (int)SEP, fullpath);
+ toc_entry = PyDict_GetItem(self->files, fullpath);
if (toc_entry != NULL) {
time_t mtime = 0;
int ispackage = zso->type & IS_PACKAGE;
int isbytecode = zso->type & IS_BYTECODE;
- if (isbytecode)
- mtime = get_mtime_of_source(self, path);
+ if (isbytecode) {
+ mtime = get_mtime_of_source(self, fullpath);
+ if (mtime == (time_t)-1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ }
+ Py_CLEAR(fullpath);
if (p_ispackage != NULL)
*p_ispackage = ispackage;
code = get_code_from_data(self, ispackage,
@@ -1250,11 +1404,16 @@ get_module_code(ZipImporter *self, char *fullname,
*p_modpath = PyTuple_GetItem(toc_entry, 0);
Py_INCREF(*p_modpath);
}
- return code;
+ goto exit;
}
+ else
+ Py_CLEAR(fullpath);
}
- PyErr_Format(ZipImportError, "can't find module '%s'", fullname);
- return NULL;
+ PyErr_Format(ZipImportError, "can't find module %R", fullname);
+exit:
+ Py_DECREF(path);
+ Py_XDECREF(fullpath);
+ return code;
}
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 7734ba6..888ef53 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -43,7 +43,9 @@ typedef struct
z_stream zst;
PyObject *unused_data;
PyObject *unconsumed_tail;
+ char eof;
int is_initialised;
+ PyObject *zdict;
#ifdef WITH_THREAD
PyThread_type_lock lock;
#endif
@@ -79,14 +81,34 @@ zlib_error(z_stream zst, int err, char *msg)
}
PyDoc_STRVAR(compressobj__doc__,
-"compressobj([level]) -- Return a compressor object.\n"
+"compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8,\n"
+" strategy=Z_DEFAULT_STRATEGY[, zdict])\n"
+" -- Return a compressor object.\n"
"\n"
-"Optional arg level is the compression level, in 1-9.");
+"level is the compression level (an integer in the range 0-9; default is 6).\n"
+"Higher compression levels are slower, but produce smaller results.\n"
+"\n"
+"method is the compression algorithm. If given, this must be DEFLATED.\n"
+"\n"
+"wbits is the base two logarithm of the window size (range: 8..15).\n"
+"\n"
+"memlevel controls the amount of memory used for internal compression state.\n"
+"Valid values range from 1 to 9. Higher values result in higher memory usage,\n"
+"faster compression, and smaller output.\n"
+"\n"
+"strategy is used to tune the compression algorithm. Possible values are\n"
+"Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY.\n"
+"\n"
+"zdict is the predefined compression dictionary - a sequence of bytes\n"
+"containing subsequences that are likely to occur in the input data.");
PyDoc_STRVAR(decompressobj__doc__,
-"decompressobj([wbits]) -- Return a decompressor object.\n"
+"decompressobj([wbits[, zdict]]) -- Return a decompressor object.\n"
+"\n"
+"Optional arg wbits is the window buffer size.\n"
"\n"
-"Optional arg wbits is the window buffer size.");
+"Optional arg zdict is the predefined compression dictionary. This must be\n"
+"the same dictionary as used by the compressor that produced the input data.");
static compobject *
newcompobject(PyTypeObject *type)
@@ -95,7 +117,9 @@ newcompobject(PyTypeObject *type)
self = PyObject_New(compobject, type);
if (self == NULL)
return NULL;
+ self->eof = 0;
self->is_initialised = 0;
+ self->zdict = NULL;
self->unused_data = PyBytes_FromStringAndSize("", 0);
if (self->unused_data == NULL) {
Py_DECREF(self);
@@ -297,7 +321,7 @@ PyZlib_decompress(PyObject *self, PyObject *args)
err = inflateEnd(&zst);
if (err != Z_OK) {
- zlib_error(zst, err, "while finishing data decompression");
+ zlib_error(zst, err, "while finishing decompression");
goto error;
}
@@ -314,19 +338,24 @@ PyZlib_decompress(PyObject *self, PyObject *args)
}
static PyObject *
-PyZlib_compressobj(PyObject *selfptr, PyObject *args)
+PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
{
compobject *self;
int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
-
- if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
- &memLevel, &strategy))
+ Py_buffer zdict;
+ static char *kwlist[] = {"level", "method", "wbits",
+ "memLevel", "strategy", "zdict", NULL};
+
+ zdict.buf = NULL; /* Sentinel, so we can tell whether zdict was supplied. */
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiy*:compressobj",
+ kwlist, &level, &method, &wbits,
+ &memLevel, &strategy, &zdict))
return NULL;
self = newcompobject(&Comptype);
if (self==NULL)
- return(NULL);
+ goto error;
self->zst.zalloc = (alloc_func)NULL;
self->zst.zfree = (free_func)Z_NULL;
self->zst.next_in = NULL;
@@ -335,30 +364,58 @@ PyZlib_compressobj(PyObject *selfptr, PyObject *args)
switch(err) {
case (Z_OK):
self->is_initialised = 1;
- return (PyObject*)self;
+ if (zdict.buf == NULL) {
+ goto success;
+ } else {
+ err = deflateSetDictionary(&self->zst, zdict.buf, zdict.len);
+ switch (err) {
+ case (Z_OK):
+ goto success;
+ case (Z_STREAM_ERROR):
+ PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
+ goto error;
+ default:
+ PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
+ goto error;
+ }
+ }
case (Z_MEM_ERROR):
- Py_DECREF(self);
PyErr_SetString(PyExc_MemoryError,
"Can't allocate memory for compression object");
- return NULL;
+ goto error;
case(Z_STREAM_ERROR):
- Py_DECREF(self);
PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
- return NULL;
+ goto error;
default:
zlib_error(self->zst, err, "while creating compression object");
- Py_DECREF(self);
- return NULL;
+ goto error;
}
+
+ error:
+ Py_XDECREF(self);
+ self = NULL;
+ success:
+ if (zdict.buf != NULL)
+ PyBuffer_Release(&zdict);
+ return (PyObject*)self;
}
static PyObject *
-PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
+PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
{
+ static char *kwlist[] = {"wbits", "zdict", NULL};
int wbits=DEF_WBITS, err;
compobject *self;
- if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
+ PyObject *zdict=NULL;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:decompressobj",
+ kwlist, &wbits, &zdict))
+ return NULL;
+ if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
+ PyErr_SetString(PyExc_TypeError,
+ "zdict argument must support the buffer protocol");
return NULL;
+ }
self = newcompobject(&Decomptype);
if (self == NULL)
@@ -367,6 +424,10 @@ PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
self->zst.zfree = (free_func)Z_NULL;
self->zst.next_in = NULL;
self->zst.avail_in = 0;
+ if (zdict != NULL) {
+ Py_INCREF(zdict);
+ self->zdict = zdict;
+ }
err = inflateInit2(&self->zst, wbits);
switch(err) {
case (Z_OK):
@@ -396,6 +457,7 @@ Dealloc(compobject *self)
#endif
Py_XDECREF(self->unused_data);
Py_XDECREF(self->unconsumed_tail);
+ Py_XDECREF(self->zdict);
PyObject_Del(self);
}
@@ -482,7 +544,7 @@ PyZlib_objcompress(compobject *self, PyObject *args)
*/
if (err != Z_OK && err != Z_BUF_ERROR) {
- zlib_error(self->zst, err, "while compressing");
+ zlib_error(self->zst, err, "while compressing data");
Py_DECREF(RetVal);
RetVal = NULL;
goto error;
@@ -555,6 +617,27 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
err = inflate(&(self->zst), Z_SYNC_FLUSH);
Py_END_ALLOW_THREADS
+ if (err == Z_NEED_DICT && self->zdict != NULL) {
+ Py_buffer zdict_buf;
+ if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
+ Py_DECREF(RetVal);
+ RetVal = NULL;
+ goto error;
+ }
+ err = inflateSetDictionary(&(self->zst), zdict_buf.buf, zdict_buf.len);
+ PyBuffer_Release(&zdict_buf);
+ if (err != Z_OK) {
+ zlib_error(self->zst, err, "while decompressing data");
+ Py_DECREF(RetVal);
+ RetVal = NULL;
+ goto error;
+ }
+ /* Repeat the call to inflate. */
+ Py_BEGIN_ALLOW_THREADS
+ err = inflate(&(self->zst), Z_SYNC_FLUSH);
+ Py_END_ALLOW_THREADS
+ }
+
/* While Z_OK and the output buffer is full, there might be more output.
So extend the output buffer and try again.
*/
@@ -634,12 +717,13 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
Py_DECREF(self->unused_data);
self->unused_data = new_data;
}
+ self->eof = 1;
/* We will only get Z_BUF_ERROR if the output buffer was full
but there wasn't more output when we tried again, so it is
not an error condition.
*/
} else if (err != Z_OK && err != Z_BUF_ERROR) {
- zlib_error(self->zst, err, "while decompressing");
+ zlib_error(self->zst, err, "while decompressing data");
Py_DECREF(RetVal);
RetVal = NULL;
goto error;
@@ -720,7 +804,7 @@ PyZlib_flush(compobject *self, PyObject *args)
if (err == Z_STREAM_END && flushmode == Z_FINISH) {
err = deflateEnd(&(self->zst));
if (err != Z_OK) {
- zlib_error(self->zst, err, "from deflateEnd()");
+ zlib_error(self->zst, err, "while finishing compression");
Py_DECREF(RetVal);
RetVal = NULL;
goto error;
@@ -784,10 +868,14 @@ PyZlib_copy(compobject *self)
}
Py_INCREF(self->unused_data);
Py_INCREF(self->unconsumed_tail);
+ Py_XINCREF(self->zdict);
Py_XDECREF(retval->unused_data);
Py_XDECREF(retval->unconsumed_tail);
+ Py_XDECREF(retval->zdict);
retval->unused_data = self->unused_data;
retval->unconsumed_tail = self->unconsumed_tail;
+ retval->zdict = self->zdict;
+ retval->eof = self->eof;
/* Mark it as being initialized */
retval->is_initialised = 1;
@@ -835,10 +923,14 @@ PyZlib_uncopy(compobject *self)
Py_INCREF(self->unused_data);
Py_INCREF(self->unconsumed_tail);
+ Py_XINCREF(self->zdict);
Py_XDECREF(retval->unused_data);
Py_XDECREF(retval->unconsumed_tail);
+ Py_XDECREF(retval->zdict);
retval->unused_data = self->unused_data;
retval->unconsumed_tail = self->unconsumed_tail;
+ retval->zdict = self->zdict;
+ retval->eof = self->eof;
/* Mark it as being initialized */
retval->is_initialised = 1;
@@ -904,14 +996,13 @@ PyZlib_unflush(compobject *self, PyObject *args)
Py_END_ALLOW_THREADS
}
- /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
- various data structures. Note we should only get Z_STREAM_END when
- flushmode is Z_FINISH */
+ /* If at end of stream, clean up any memory allocated by zlib. */
if (err == Z_STREAM_END) {
- err = inflateEnd(&(self->zst));
+ self->eof = 1;
self->is_initialised = 0;
+ err = inflateEnd(&(self->zst));
if (err != Z_OK) {
- zlib_error(self->zst, err, "from inflateEnd()");
+ zlib_error(self->zst, err, "while finishing decompression");
Py_DECREF(retval);
retval = NULL;
goto error;
@@ -959,6 +1050,7 @@ static PyMethodDef Decomp_methods[] =
static PyMemberDef Decomp_members[] = {
{"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
{"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
+ {"eof", T_BOOL, COMP_OFF(eof), READONLY},
{NULL},
};
@@ -1044,13 +1136,13 @@ static PyMethodDef zlib_methods[] =
adler32__doc__},
{"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
compress__doc__},
- {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
+ {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
compressobj__doc__},
{"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
crc32__doc__},
{"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
decompress__doc__},
- {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
+ {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
decompressobj__doc__},
{NULL, NULL}
};
@@ -1124,10 +1216,10 @@ PyDoc_STRVAR(zlib_module_documentation,
"\n"
"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
-"compressobj([level]) -- Return a compressor object.\n"
+"compressobj([level[, ...]]) -- Return a compressor object.\n"
"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
-"decompressobj([wbits]) -- Return a decompressor object.\n"
+"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
"\n"
"'wbits' is window buffer size.\n"
"Compressor objects support compress() and flush() methods; decompressor\n"
@@ -1181,6 +1273,10 @@ PyInit_zlib(void)
if (ver != NULL)
PyModule_AddObject(m, "ZLIB_VERSION", ver);
+ ver = PyUnicode_FromString(zlibVersion());
+ if (ver != NULL)
+ PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
+
PyModule_AddStringConstant(m, "__version__", "1.0");
return m;
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 7705d05..a2737dd 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -74,7 +74,7 @@ PyObject_Length(PyObject *o)
Py_ssize_t
_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
{
- static PyObject *hintstrobj = NULL;
+ _Py_IDENTIFIER(__length_hint__);
PyObject *ro, *hintmeth;
Py_ssize_t rv;
@@ -89,7 +89,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
}
/* try o.__length_hint__() */
- hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
+ hintmeth = _PyObject_LookupSpecial(o, &PyId___length_hint__);
if (hintmeth == NULL) {
if (PyErr_Occurred())
return -1;
@@ -237,7 +237,8 @@ PyObject_AsCharBuffer(PyObject *obj,
pb = obj->ob_type->tp_as_buffer;
if (pb == NULL || pb->bf_getbuffer == NULL) {
PyErr_SetString(PyExc_TypeError,
- "expected an object with the buffer interface");
+ "expected bytes, bytearray "
+ "or buffer compatible object");
return -1;
}
if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
@@ -331,7 +332,7 @@ PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
{
if (!PyObject_CheckBuffer(obj)) {
PyErr_Format(PyExc_TypeError,
- "'%100s' does not support the buffer interface",
+ "'%.100s' does not support the buffer interface",
Py_TYPE(obj)->tp_name);
return -1;
}
@@ -339,7 +340,7 @@ PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
}
static int
-_IsFortranContiguous(Py_buffer *view)
+_IsFortranContiguous(const Py_buffer *view)
{
Py_ssize_t sd, dim;
int i;
@@ -360,7 +361,7 @@ _IsFortranContiguous(Py_buffer *view)
}
static int
-_IsCContiguous(Py_buffer *view)
+_IsCContiguous(const Py_buffer *view)
{
Py_ssize_t sd, dim;
int i;
@@ -381,16 +382,16 @@ _IsCContiguous(Py_buffer *view)
}
int
-PyBuffer_IsContiguous(Py_buffer *view, char fort)
+PyBuffer_IsContiguous(const Py_buffer *view, char order)
{
if (view->suboffsets != NULL) return 0;
- if (fort == 'C')
+ if (order == 'C')
return _IsCContiguous(view);
- else if (fort == 'F')
+ else if (order == 'F')
return _IsFortranContiguous(view);
- else if (fort == 'A')
+ else if (order == 'A')
return (_IsCContiguous(view) || _IsFortranContiguous(view));
return 0;
}
@@ -444,62 +445,6 @@ _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
}
}
- /* view is not checked for consistency in either of these. It is
- assumed that the size of the buffer is view->len in
- view->len / view->itemsize elements.
- */
-
-int
-PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
-{
- int k;
- void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
- Py_ssize_t *indices, elements;
- char *dest, *ptr;
-
- if (len > view->len) {
- len = view->len;
- }
-
- if (PyBuffer_IsContiguous(view, fort)) {
- /* simplest copy is all that is needed */
- memcpy(buf, view->buf, len);
- return 0;
- }
-
- /* Otherwise a more elaborate scheme is needed */
-
- /* XXX(nnorwitz): need to check for overflow! */
- indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
- if (indices == NULL) {
- PyErr_NoMemory();
- return -1;
- }
- for (k=0; k<view->ndim;k++) {
- indices[k] = 0;
- }
-
- if (fort == 'F') {
- addone = _Py_add_one_to_index_F;
- }
- else {
- addone = _Py_add_one_to_index_C;
- }
- dest = buf;
- /* XXX : This is not going to be the fastest code in the world
- several optimizations are possible.
- */
- elements = len / view->itemsize;
- while (elements--) {
- addone(view->ndim, indices, view->shape);
- ptr = PyBuffer_GetPointer(view, indices);
- memcpy(dest, ptr, view->itemsize);
- dest += view->itemsize;
- }
- PyMem_Free(indices);
- return 0;
-}
-
int
PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
{
@@ -648,9 +593,9 @@ PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
int
PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
- int readonly, int flags)
+ int readonly, int flags)
{
- if (view == NULL) return 0;
+ if (view == NULL) return 0; /* XXX why not -1? */
if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
(readonly == 1)) {
PyErr_SetString(PyExc_BufferError,
@@ -696,16 +641,16 @@ PyObject_Format(PyObject *obj, PyObject *format_spec)
PyObject *meth;
PyObject *empty = NULL;
PyObject *result = NULL;
- static PyObject *format_cache = NULL;
+ _Py_IDENTIFIER(__format__);
/* If no format_spec is provided, use an empty string */
if (format_spec == NULL) {
- empty = PyUnicode_FromUnicode(NULL, 0);
+ empty = PyUnicode_New(0, 0);
format_spec = empty;
}
/* Find the (unbound!) __format__ method (a borrowed reference) */
- meth = _PyObject_LookupSpecial(obj, "__format__", &format_cache);
+ meth = _PyObject_LookupSpecial(obj, &PyId___format__);
if (meth == NULL) {
if (!PyErr_Occurred())
PyErr_Format(PyExc_TypeError,
@@ -792,8 +737,7 @@ binary_op1(PyObject *v, PyObject *w, const int op_slot)
return x;
Py_DECREF(x); /* can't do it */
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
@@ -1268,37 +1212,31 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err)
}
-PyObject *
-_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
-{
- static PyObject *int_name = NULL;
- if (int_name == NULL) {
- int_name = PyUnicode_InternFromString("__int__");
- if (int_name == NULL)
- return NULL;
- }
-
- if (integral && !PyLong_Check(integral)) {
- /* Don't go through tp_as_number->nb_int to avoid
- hitting the classic class fallback to __trunc__. */
- PyObject *int_func = PyObject_GetAttr(integral, int_name);
- if (int_func == NULL) {
- PyErr_Clear(); /* Raise a different error. */
- goto non_integral_error;
- }
- Py_DECREF(integral);
- integral = PyEval_CallObject(int_func, NULL);
- Py_DECREF(int_func);
- if (integral && !PyLong_Check(integral)) {
- goto non_integral_error;
+/*
+ Returns the Integral instance converted to an int. The instance is expected
+ to be an int or have an __int__ method. Steals integral's
+ reference. error_format will be used to create the TypeError if integral
+ isn't actually an Integral instance. error_format should be a format string
+ that can accept a char* naming integral's type.
+*/
+static PyObject *
+convert_integral_to_int(PyObject *integral, const char *error_format)
+{
+ PyNumberMethods *nb;
+ if (PyLong_Check(integral))
+ return integral;
+ nb = Py_TYPE(integral)->tp_as_number;
+ if (nb->nb_int) {
+ PyObject *as_int = nb->nb_int(integral);
+ if (!as_int || PyLong_Check(as_int)) {
+ Py_DECREF(integral);
+ return as_int;
}
+ Py_DECREF(as_int);
}
- return integral;
-
-non_integral_error:
PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
Py_DECREF(integral);
- return NULL;
+ return NULL;
}
@@ -1325,16 +1263,10 @@ PyObject *
PyNumber_Long(PyObject *o)
{
PyNumberMethods *m;
- static PyObject *trunc_name = NULL;
PyObject *trunc_func;
const char *buffer;
Py_ssize_t buffer_len;
-
- if (trunc_name == NULL) {
- trunc_name = PyUnicode_InternFromString("__trunc__");
- if (trunc_name == NULL)
- return NULL;
- }
+ _Py_IDENTIFIER(__trunc__);
if (o == NULL)
return null_error();
@@ -1356,32 +1288,30 @@ PyNumber_Long(PyObject *o)
}
if (PyLong_Check(o)) /* An int subclass without nb_int */
return _PyLong_Copy((PyLongObject *)o);
- trunc_func = PyObject_GetAttr(o, trunc_name);
+ trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
if (trunc_func) {
PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
PyObject *int_instance;
Py_DECREF(trunc_func);
/* __trunc__ is specified to return an Integral type,
- but long() needs to return a long. */
- int_instance = _PyNumber_ConvertIntegralToInt(
- truncated,
+ but int() needs to return a int. */
+ int_instance = convert_integral_to_int(truncated,
"__trunc__ returned non-Integral (type %.200s)");
return int_instance;
}
- PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
+ if (PyErr_Occurred())
+ return NULL;
if (PyBytes_Check(o))
/* need to do extra error checking that PyLong_FromString()
- * doesn't do. In particular long('9.5') must raise an
+ * doesn't do. In particular int('9.5') must raise an
* exception, not truncate the float.
*/
return long_from_string(PyBytes_AS_STRING(o),
PyBytes_GET_SIZE(o));
if (PyUnicode_Check(o))
/* The above check is done in PyLong_FromUnicode(). */
- return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
- PyUnicode_GET_SIZE(o),
- 10);
+ return PyLong_FromUnicodeObject(o, 10);
if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
return long_from_string(buffer, buffer_len);
@@ -1986,7 +1916,7 @@ PySequence_Index(PyObject *s, PyObject *o)
int
PyMapping_Check(PyObject *o)
{
- return o && o->ob_type->tp_as_mapping &&
+ return o && o->ob_type->tp_as_mapping &&
o->ob_type->tp_as_mapping->mp_subscript;
}
@@ -2084,10 +2014,11 @@ PyMapping_Keys(PyObject *o)
{
PyObject *keys;
PyObject *fast;
+ _Py_IDENTIFIER(keys);
if (PyDict_CheckExact(o))
return PyDict_Keys(o);
- keys = PyObject_CallMethod(o, "keys", NULL);
+ keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
if (keys == NULL)
return NULL;
fast = PySequence_Fast(keys, "o.keys() are not iterable");
@@ -2100,10 +2031,11 @@ PyMapping_Items(PyObject *o)
{
PyObject *items;
PyObject *fast;
+ _Py_IDENTIFIER(items);
if (PyDict_CheckExact(o))
return PyDict_Items(o);
- items = PyObject_CallMethod(o, "items", NULL);
+ items = _PyObject_CallMethodId(o, &PyId_items, NULL);
if (items == NULL)
return NULL;
fast = PySequence_Fast(items, "o.items() are not iterable");
@@ -2116,10 +2048,11 @@ PyMapping_Values(PyObject *o)
{
PyObject *values;
PyObject *fast;
+ _Py_IDENTIFIER(values);
if (PyDict_CheckExact(o))
return PyDict_Values(o);
- values = PyObject_CallMethod(o, "values", NULL);
+ values = _PyObject_CallMethodId(o, &PyId_values, NULL);
if (values == NULL)
return NULL;
fast = PySequence_Fast(values, "o.values() are not iterable");
@@ -2225,22 +2158,11 @@ _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
return call_function_tail(callable, args);
}
-PyObject *
-PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
+static PyObject*
+callmethod(PyObject* func, char *format, va_list va, int is_size_t)
{
- va_list va;
- PyObject *args;
- PyObject *func = NULL;
PyObject *retval = NULL;
-
- if (o == NULL || name == NULL)
- return null_error();
-
- func = PyObject_GetAttrString(o, name);
- if (func == NULL) {
- PyErr_SetString(PyExc_AttributeError, name);
- return 0;
- }
+ PyObject *args;
if (!PyCallable_Check(func)) {
type_error("attribute of type '%.200s' is not callable", func);
@@ -2248,9 +2170,10 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
}
if (format && *format) {
- va_start(va, format);
- args = Py_VaBuildValue(format, va);
- va_end(va);
+ if (is_size_t)
+ args = _Py_VaBuildValue_SizeT(format, va);
+ else
+ args = Py_VaBuildValue(format, va);
}
else
args = PyTuple_New(0);
@@ -2265,10 +2188,9 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
}
PyObject *
-_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
+PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
{
va_list va;
- PyObject *args;
PyObject *func = NULL;
PyObject *retval = NULL;
@@ -2277,32 +2199,75 @@ _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
func = PyObject_GetAttrString(o, name);
if (func == NULL) {
- PyErr_SetString(PyExc_AttributeError, name);
return 0;
}
- if (!PyCallable_Check(func)) {
- type_error("attribute of type '%.200s' is not callable", func);
- goto exit;
- }
+ va_start(va, format);
+ retval = callmethod(func, format, va, 0);
+ va_end(va);
+ return retval;
+}
- if (format && *format) {
- va_start(va, format);
- args = _Py_VaBuildValue_SizeT(format, va);
- va_end(va);
+PyObject *
+_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...)
+{
+ va_list va;
+ PyObject *func = NULL;
+ PyObject *retval = NULL;
+
+ if (o == NULL || name == NULL)
+ return null_error();
+
+ func = _PyObject_GetAttrId(o, name);
+ if (func == NULL) {
+ return 0;
}
- else
- args = PyTuple_New(0);
- retval = call_function_tail(func, args);
+ va_start(va, format);
+ retval = callmethod(func, format, va, 0);
+ va_end(va);
+ return retval;
+}
- exit:
- /* args gets consumed in call_function_tail */
- Py_XDECREF(func);
+PyObject *
+_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
+{
+ va_list va;
+ PyObject *func = NULL;
+ PyObject *retval;
+ if (o == NULL || name == NULL)
+ return null_error();
+
+ func = PyObject_GetAttrString(o, name);
+ if (func == NULL) {
+ return 0;
+ }
+ va_start(va, format);
+ retval = callmethod(func, format, va, 1);
+ va_end(va);
return retval;
}
+PyObject *
+_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name, char *format, ...)
+{
+ va_list va;
+ PyObject *func = NULL;
+ PyObject *retval;
+
+ if (o == NULL || name == NULL)
+ return null_error();
+
+ func = _PyObject_GetAttrId(o, name);
+ if (func == NULL) {
+ return NULL;
+ }
+ va_start(va, format);
+ retval = callmethod(func, format, va, 1);
+ va_end(va);
+ return retval;
+}
static PyObject *
objargs_mktuple(va_list va)
@@ -2355,6 +2320,35 @@ PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
}
PyObject *
+_PyObject_CallMethodObjIdArgs(PyObject *callable,
+ struct _Py_Identifier *name, ...)
+{
+ PyObject *args, *tmp;
+ va_list vargs;
+
+ if (callable == NULL || name == NULL)
+ return null_error();
+
+ callable = _PyObject_GetAttrId(callable, name);
+ if (callable == NULL)
+ return NULL;
+
+ /* count the args */
+ va_start(vargs, name);
+ args = objargs_mktuple(vargs);
+ va_end(vargs);
+ if (args == NULL) {
+ Py_DECREF(callable);
+ return NULL;
+ }
+ tmp = PyObject_Call(callable, args, NULL);
+ Py_DECREF(args);
+ Py_DECREF(callable);
+
+ return tmp;
+}
+
+PyObject *
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
{
PyObject *args, *tmp;
@@ -2378,10 +2372,8 @@ PyObject_CallFunctionObjArgs(PyObject *callable, ...)
/* isinstance(), issubclass() */
-/* abstract_get_bases() has logically 4 return states, with a sort of 0th
- * state that will almost never happen.
+/* abstract_get_bases() has logically 4 return states:
*
- * 0. creating the __bases__ static string could get a MemoryError
* 1. getattr(cls, '__bases__') could raise an AttributeError
* 2. getattr(cls, '__bases__') could raise some other exception
* 3. getattr(cls, '__bases__') could return a tuple
@@ -2407,16 +2399,11 @@ PyObject_CallFunctionObjArgs(PyObject *callable, ...)
static PyObject *
abstract_get_bases(PyObject *cls)
{
- static PyObject *__bases__ = NULL;
+ _Py_IDENTIFIER(__bases__);
PyObject *bases;
- if (__bases__ == NULL) {
- __bases__ = PyUnicode_InternFromString("__bases__");
- if (__bases__ == NULL)
- return NULL;
- }
Py_ALLOW_RECURSION
- bases = PyObject_GetAttr(cls, __bases__);
+ bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Py_END_ALLOW_RECURSION
if (bases == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
@@ -2486,19 +2473,13 @@ static int
recursive_isinstance(PyObject *inst, PyObject *cls)
{
PyObject *icls;
- static PyObject *__class__ = NULL;
int retval = 0;
-
- if (__class__ == NULL) {
- __class__ = PyUnicode_InternFromString("__class__");
- if (__class__ == NULL)
- return -1;
- }
+ _Py_IDENTIFIER(__class__);
if (PyType_Check(cls)) {
retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
if (retval == 0) {
- PyObject *c = PyObject_GetAttr(inst, __class__);
+ PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
if (c == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -2519,7 +2500,7 @@ recursive_isinstance(PyObject *inst, PyObject *cls)
if (!check_class(cls,
"isinstance() arg 2 must be a type or tuple of types"))
return -1;
- icls = PyObject_GetAttr(inst, __class__);
+ icls = _PyObject_GetAttrId(inst, &PyId___class__);
if (icls == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -2538,7 +2519,7 @@ recursive_isinstance(PyObject *inst, PyObject *cls)
int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
- static PyObject *name = NULL;
+ _Py_IDENTIFIER(__instancecheck__);
PyObject *checker;
/* Quick test for an exact match */
@@ -2564,7 +2545,7 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
return r;
}
- checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
+ checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
if (checker != NULL) {
PyObject *res;
int ok = -1;
@@ -2607,7 +2588,7 @@ recursive_issubclass(PyObject *derived, PyObject *cls)
int
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
{
- static PyObject *name = NULL;
+ _Py_IDENTIFIER(__subclasscheck__);
PyObject *checker;
if (PyTuple_Check(cls)) {
@@ -2629,7 +2610,7 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
return r;
}
- checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
+ checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
if (checker != NULL) {
PyObject *res;
int ok = -1;
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 7d5dbd0..9f1cf0a 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -139,7 +139,7 @@ PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size)
}
else {
alloc = size + 1;
- new->ob_bytes = PyMem_Malloc(alloc);
+ new->ob_bytes = PyObject_Malloc(alloc);
if (new->ob_bytes == NULL) {
Py_DECREF(new);
return PyErr_NoMemory();
@@ -209,7 +209,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t size)
alloc = size + 1;
}
- sval = PyMem_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc);
+ sval = PyObject_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc);
if (sval == NULL) {
PyErr_NoMemory();
return -1;
@@ -795,7 +795,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
size = view.len;
if (PyByteArray_Resize((PyObject *)self, size) < 0) goto fail;
if (PyBuffer_ToContiguous(self->ob_bytes, &view, size, 'C') < 0)
- goto fail;
+ goto fail;
PyBuffer_Release(&view);
return 0;
fail:
@@ -856,87 +856,82 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
static PyObject *
bytearray_repr(PyByteArrayObject *self)
{
- static const char *hexdigits = "0123456789abcdef";
const char *quote_prefix = "bytearray(b";
const char *quote_postfix = ")";
Py_ssize_t length = Py_SIZE(self);
- /* 14 == strlen(quote_prefix) + 2 + strlen(quote_postfix) */
+ /* 15 == strlen(quote_prefix) + 2 + strlen(quote_postfix) + 1 */
size_t newsize;
PyObject *v;
- if (length > (PY_SSIZE_T_MAX - 14) / 4) {
+ register Py_ssize_t i;
+ register char c;
+ register char *p;
+ int quote;
+ char *test, *start;
+ char *buffer;
+
+ if (length > (PY_SSIZE_T_MAX - 15) / 4) {
PyErr_SetString(PyExc_OverflowError,
"bytearray object is too large to make repr");
return NULL;
}
- newsize = 14 + 4 * length;
- v = PyUnicode_FromUnicode(NULL, newsize);
- if (v == NULL) {
+
+ newsize = 15 + length * 4;
+ buffer = PyObject_Malloc(newsize);
+ if (buffer == NULL) {
+ PyErr_NoMemory();
return NULL;
}
- else {
- register Py_ssize_t i;
- register Py_UNICODE c;
- register Py_UNICODE *p;
- int quote;
-
- /* Figure out which quote to use; single is preferred */
- quote = '\'';
- {
- char *test, *start;
- start = PyByteArray_AS_STRING(self);
- for (test = start; test < start+length; ++test) {
- if (*test == '"') {
- quote = '\''; /* back to single */
- goto decided;
- }
- else if (*test == '\'')
- quote = '"';
- }
- decided:
- ;
- }
- p = PyUnicode_AS_UNICODE(v);
- while (*quote_prefix)
- *p++ = *quote_prefix++;
- *p++ = quote;
-
- for (i = 0; i < length; i++) {
- /* There's at least enough room for a hex escape
- and a closing quote. */
- assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
- c = self->ob_bytes[i];
- if (c == '\'' || c == '\\')
- *p++ = '\\', *p++ = c;
- else if (c == '\t')
- *p++ = '\\', *p++ = 't';
- else if (c == '\n')
- *p++ = '\\', *p++ = 'n';
- else if (c == '\r')
- *p++ = '\\', *p++ = 'r';
- else if (c == 0)
- *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
- else if (c < ' ' || c >= 0x7f) {
- *p++ = '\\';
- *p++ = 'x';
- *p++ = hexdigits[(c & 0xf0) >> 4];
- *p++ = hexdigits[c & 0xf];
- }
- else
- *p++ = c;
- }
- assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 1);
- *p++ = quote;
- while (*quote_postfix) {
- *p++ = *quote_postfix++;
+ /* Figure out which quote to use; single is preferred */
+ quote = '\'';
+ start = PyByteArray_AS_STRING(self);
+ for (test = start; test < start+length; ++test) {
+ if (*test == '"') {
+ quote = '\''; /* back to single */
+ break;
}
- *p = '\0';
- if (PyUnicode_Resize(&v, (p - PyUnicode_AS_UNICODE(v)))) {
- Py_DECREF(v);
- return NULL;
+ else if (*test == '\'')
+ quote = '"';
+ }
+
+ p = buffer;
+ while (*quote_prefix)
+ *p++ = *quote_prefix++;
+ *p++ = quote;
+
+ for (i = 0; i < length; i++) {
+ /* There's at least enough room for a hex escape
+ and a closing quote. */
+ assert(newsize - (p - buffer) >= 5);
+ c = self->ob_bytes[i];
+ if (c == '\'' || c == '\\')
+ *p++ = '\\', *p++ = c;
+ else if (c == '\t')
+ *p++ = '\\', *p++ = 't';
+ else if (c == '\n')
+ *p++ = '\\', *p++ = 'n';
+ else if (c == '\r')
+ *p++ = '\\', *p++ = 'r';
+ else if (c == 0)
+ *p++ = '\\', *p++ = 'x', *p++ = '0', *p++ = '0';
+ else if (c < ' ' || c >= 0x7f) {
+ *p++ = '\\';
+ *p++ = 'x';
+ *p++ = Py_hexdigits[(c & 0xf0) >> 4];
+ *p++ = Py_hexdigits[c & 0xf];
}
- return v;
+ else
+ *p++ = c;
+ }
+ assert(newsize - (p - buffer) >= 1);
+ *p++ = quote;
+ while (*quote_postfix) {
+ *p++ = *quote_postfix++;
}
+
+ v = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
+ PyObject_Free(buffer);
+ return v;
}
static PyObject *
@@ -970,23 +965,20 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op)
return NULL;
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
self_size = _getbuffer(self, &self_bytes);
if (self_size < 0) {
PyErr_Clear();
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
other_size = _getbuffer(other, &other_bytes);
if (other_size < 0) {
PyErr_Clear();
PyBuffer_Release(&self_bytes);
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
if (self_size != other_size && (op == Py_EQ || op == Py_NE)) {
@@ -1034,7 +1026,7 @@ bytearray_dealloc(PyByteArrayObject *self)
PyErr_Print();
}
if (self->ob_bytes != 0) {
- PyMem_Free(self->ob_bytes);
+ PyObject_Free(self->ob_bytes);
}
Py_TYPE(self)->tp_free((PyObject *)self);
}
@@ -1043,6 +1035,8 @@ bytearray_dealloc(PyByteArrayObject *self)
/* -------------------------------------------------------------------- */
/* Methods */
+#define FASTSEARCH fastsearch
+#define STRINGLIB(F) stringlib_##F
#define STRINGLIB_CHAR char
#define STRINGLIB_LEN PyByteArray_GET_SIZE
#define STRINGLIB_STR PyByteArray_AS_STRING
@@ -1083,24 +1077,41 @@ Py_LOCAL_INLINE(Py_ssize_t)
bytearray_find_internal(PyByteArrayObject *self, PyObject *args, int dir)
{
PyObject *subobj;
+ char byte;
Py_buffer subbuf;
+ const char *sub;
+ Py_ssize_t sub_len;
Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
Py_ssize_t res;
- if (!stringlib_parse_args_finds("find/rfind/index/rindex",
- args, &subobj, &start, &end))
- return -2;
- if (_getbuffer(subobj, &subbuf) < 0)
+ if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex",
+ args, &subobj, &byte, &start, &end))
return -2;
+
+ if (subobj) {
+ if (_getbuffer(subobj, &subbuf) < 0)
+ return -2;
+
+ sub = subbuf.buf;
+ sub_len = subbuf.len;
+ }
+ else {
+ sub = &byte;
+ sub_len = 1;
+ }
+
if (dir > 0)
res = stringlib_find_slice(
PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
- subbuf.buf, subbuf.len, start, end);
+ sub, sub_len, start, end);
else
res = stringlib_rfind_slice(
PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self),
- subbuf.buf, subbuf.len, start, end);
- PyBuffer_Release(&subbuf);
+ sub, sub_len, start, end);
+
+ if (subobj)
+ PyBuffer_Release(&subbuf);
+
return res;
}
@@ -1133,26 +1144,66 @@ static PyObject *
bytearray_count(PyByteArrayObject *self, PyObject *args)
{
PyObject *sub_obj;
- const char *str = PyByteArray_AS_STRING(self);
+ const char *str = PyByteArray_AS_STRING(self), *sub;
+ Py_ssize_t sub_len;
+ char byte;
Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
+
Py_buffer vsub;
PyObject *count_obj;
- if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end))
+ if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte,
+ &start, &end))
return NULL;
- if (_getbuffer(sub_obj, &vsub) < 0)
- return NULL;
+ if (sub_obj) {
+ if (_getbuffer(sub_obj, &vsub) < 0)
+ return NULL;
+
+ sub = vsub.buf;
+ sub_len = vsub.len;
+ }
+ else {
+ sub = &byte;
+ sub_len = 1;
+ }
ADJUST_INDICES(start, end, PyByteArray_GET_SIZE(self));
count_obj = PyLong_FromSsize_t(
- stringlib_count(str + start, end - start, vsub.buf, vsub.len, PY_SSIZE_T_MAX)
+ stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX)
);
- PyBuffer_Release(&vsub);
+
+ if (sub_obj)
+ PyBuffer_Release(&vsub);
+
return count_obj;
}
+PyDoc_STRVAR(clear__doc__,
+"B.clear() -> None\n\
+\n\
+Remove all items from B.");
+
+static PyObject *
+bytearray_clear(PyByteArrayObject *self)
+{
+ if (PyByteArray_Resize((PyObject *)self, 0) < 0)
+ return NULL;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(copy__doc__,
+"B.copy() -> bytearray\n\
+\n\
+Return a copy of B.");
+
+static PyObject *
+bytearray_copy(PyByteArrayObject *self)
+{
+ return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self),
+ PyByteArray_GET_SIZE(self));
+}
PyDoc_STRVAR(index__doc__,
"B.index(sub[, start[, end]]) -> int\n\
@@ -1994,7 +2045,7 @@ bytearray_replace(PyByteArrayObject *self, PyObject *args)
}
PyDoc_STRVAR(split__doc__,
-"B.split([sep[, maxsplit]]) -> list of bytearrays\n\
+"B.split(sep=None, maxsplit=-1) -> list of bytearrays\n\
\n\
Return a list of the sections in B, using sep as the delimiter.\n\
If sep is not given, B is split on ASCII whitespace characters\n\
@@ -2002,15 +2053,17 @@ If sep is not given, B is split on ASCII whitespace characters\n\
If maxsplit is given, at most maxsplit splits are done.");
static PyObject *
-bytearray_split(PyByteArrayObject *self, PyObject *args)
+bytearray_split(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Py_ssize_t maxsplit = -1;
const char *s = PyByteArray_AS_STRING(self), *sub;
PyObject *list, *subobj = Py_None;
Py_buffer vsub;
- if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split",
+ kwlist, &subobj, &maxsplit))
return NULL;
if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX;
@@ -2086,7 +2139,7 @@ bytearray_rpartition(PyByteArrayObject *self, PyObject *sep_obj)
}
PyDoc_STRVAR(rsplit__doc__,
-"B.rsplit(sep[, maxsplit]) -> list of bytearrays\n\
+"B.rsplit(sep=None, maxsplit=-1) -> list of bytearrays\n\
\n\
Return a list of the sections in B, using sep as the delimiter,\n\
starting at the end of B and working to the front.\n\
@@ -2095,15 +2148,17 @@ If sep is not given, B is split on ASCII whitespace characters\n\
If maxsplit is given, at most maxsplit splits are done.");
static PyObject *
-bytearray_rsplit(PyByteArrayObject *self, PyObject *args)
+bytearray_rsplit(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
Py_ssize_t len = PyByteArray_GET_SIZE(self), n;
Py_ssize_t maxsplit = -1;
const char *s = PyByteArray_AS_STRING(self), *sub;
PyObject *list, *subobj = Py_None;
Py_buffer vsub;
- if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit",
+ kwlist, &subobj, &maxsplit))
return NULL;
if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX;
@@ -2454,7 +2509,7 @@ If the argument is omitted, strip trailing ASCII whitespace.");
static PyObject *
bytearray_rstrip(PyByteArrayObject *self, PyObject *args)
{
- Py_ssize_t left, right, mysize, argsize;
+ Py_ssize_t right, mysize, argsize;
void *myptr, *argptr;
PyObject *arg = Py_None;
Py_buffer varg;
@@ -2472,11 +2527,10 @@ bytearray_rstrip(PyByteArrayObject *self, PyObject *args)
}
myptr = self->ob_bytes;
mysize = Py_SIZE(self);
- left = 0;
right = rstrip_helper(myptr, mysize, argptr, argsize);
if (arg != Py_None)
PyBuffer_Release(&varg);
- return PyByteArray_FromStringAndSize(self->ob_bytes + left, right - left);
+ return PyByteArray_FromStringAndSize(self->ob_bytes, right);
}
PyDoc_STRVAR(decode_doc,
@@ -2598,11 +2652,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
-bytearray_splitlines(PyObject *self, PyObject *args)
+bytearray_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"keepends", 0};
int keepends = 0;
- if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
+ kwlist, &keepends))
return NULL;
return stringlib_splitlines(
@@ -2619,7 +2675,7 @@ Spaces between two numbers are accepted.\n\
Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef').");
static int
-hex_digit_to_int(Py_UNICODE c)
+hex_digit_to_int(Py_UCS4 c)
{
if (c >= 128)
return -1;
@@ -2639,15 +2695,20 @@ bytearray_fromhex(PyObject *cls, PyObject *args)
{
PyObject *newbytes, *hexobj;
char *buf;
- Py_UNICODE *hex;
Py_ssize_t hexlen, byteslen, i, j;
int top, bot;
+ void *data;
+ unsigned int kind;
if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj))
return NULL;
assert(PyUnicode_Check(hexobj));
- hexlen = PyUnicode_GET_SIZE(hexobj);
- hex = PyUnicode_AS_UNICODE(hexobj);
+ if (PyUnicode_READY(hexobj))
+ return NULL;
+ kind = PyUnicode_KIND(hexobj);
+ data = PyUnicode_DATA(hexobj);
+ hexlen = PyUnicode_GET_LENGTH(hexobj);
+
byteslen = hexlen/2; /* This overestimates if there are spaces */
newbytes = PyByteArray_FromStringAndSize(NULL, byteslen);
if (!newbytes)
@@ -2655,12 +2716,12 @@ bytearray_fromhex(PyObject *cls, PyObject *args)
buf = PyByteArray_AS_STRING(newbytes);
for (i = j = 0; i < hexlen; i += 2) {
/* skip over spaces in the input */
- while (hex[i] == ' ')
+ while (PyUnicode_READ(kind, data, i) == ' ')
i++;
if (i >= hexlen)
break;
- top = hex_digit_to_int(hex[i]);
- bot = hex_digit_to_int(hex[i+1]);
+ top = hex_digit_to_int(PyUnicode_READ(kind, data, i));
+ bot = hex_digit_to_int(PyUnicode_READ(kind, data, i+1));
if (top == -1 || bot == -1) {
PyErr_Format(PyExc_ValueError,
"non-hexadecimal number found in "
@@ -2678,26 +2739,59 @@ bytearray_fromhex(PyObject *cls, PyObject *args)
return NULL;
}
-PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
static PyObject *
-bytearray_reduce(PyByteArrayObject *self)
+_common_reduce(PyByteArrayObject *self, int proto)
{
- PyObject *latin1, *dict;
- if (self->ob_bytes)
- latin1 = PyUnicode_DecodeLatin1(self->ob_bytes,
- Py_SIZE(self), NULL);
- else
- latin1 = PyUnicode_FromString("");
+ PyObject *dict;
+ _Py_IDENTIFIER(__dict__);
- dict = PyObject_GetAttrString((PyObject *)self, "__dict__");
+ dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
if (dict == NULL) {
PyErr_Clear();
dict = Py_None;
Py_INCREF(dict);
}
- return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
+ if (proto < 3) {
+ /* use str based reduction for backwards compatibility with Python 2.x */
+ PyObject *latin1;
+ if (self->ob_bytes)
+ latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, Py_SIZE(self), NULL);
+ else
+ latin1 = PyUnicode_FromString("");
+ return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict);
+ }
+ else {
+ /* use more efficient byte based reduction */
+ if (self->ob_bytes) {
+ return Py_BuildValue("(O(y#)N)", Py_TYPE(self), self->ob_bytes, Py_SIZE(self), dict);
+ }
+ else {
+ return Py_BuildValue("(O()N)", Py_TYPE(self), dict);
+ }
+ }
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+bytearray_reduce(PyByteArrayObject *self)
+{
+ return _common_reduce(self, 2);
+}
+
+PyDoc_STRVAR(reduce_ex_doc, "Return state information for pickling.");
+
+static PyObject *
+bytearray_reduce_ex(PyByteArrayObject *self, PyObject *args)
+{
+ int proto = 0;
+
+ if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
+ return NULL;
+
+ return _common_reduce(self, proto);
}
PyDoc_STRVAR(sizeof_doc,
@@ -2741,11 +2835,14 @@ static PyMethodDef
bytearray_methods[] = {
{"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc},
{"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, reduce_doc},
+ {"__reduce_ex__", (PyCFunction)bytearray_reduce_ex, METH_VARARGS, reduce_ex_doc},
{"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, sizeof_doc},
{"append", (PyCFunction)bytearray_append, METH_O, append__doc__},
{"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
_Py_capitalize__doc__},
{"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
+ {"clear", (PyCFunction)bytearray_clear, METH_NOARGS, clear__doc__},
+ {"copy", (PyCFunction)bytearray_copy, METH_NOARGS, copy__doc__},
{"count", (PyCFunction)bytearray_count, METH_VARARGS, count__doc__},
{"decode", (PyCFunction)bytearray_decode, METH_VARARGS | METH_KEYWORDS, decode_doc},
{"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, endswith__doc__},
@@ -2786,11 +2883,11 @@ bytearray_methods[] = {
{"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, rindex__doc__},
{"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
{"rpartition", (PyCFunction)bytearray_rpartition, METH_O, rpartition__doc__},
- {"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS, rsplit__doc__},
+ {"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__},
{"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, rstrip__doc__},
- {"split", (PyCFunction)bytearray_split, METH_VARARGS, split__doc__},
- {"splitlines", (PyCFunction)bytearray_splitlines, METH_VARARGS,
- splitlines__doc__},
+ {"split", (PyCFunction)bytearray_split, METH_VARARGS | METH_KEYWORDS, split__doc__},
+ {"splitlines", (PyCFunction)bytearray_splitlines,
+ METH_VARARGS | METH_KEYWORDS, splitlines__doc__},
{"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
startswith__doc__},
{"strip", (PyCFunction)bytearray_strip, METH_VARARGS, strip__doc__},
@@ -2912,7 +3009,7 @@ bytearrayiter_next(bytesiterobject *it)
}
static PyObject *
-bytesarrayiter_length_hint(bytesiterobject *it)
+bytearrayiter_length_hint(bytesiterobject *it)
{
Py_ssize_t len = 0;
if (it->it_seq)
@@ -2923,9 +3020,41 @@ bytesarrayiter_length_hint(bytesiterobject *it)
PyDoc_STRVAR(length_hint_doc,
"Private method returning an estimate of len(list(it)).");
+static PyObject *
+bytearrayiter_reduce(bytesiterobject *it)
+{
+ if (it->it_seq != NULL) {
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ } else {
+ PyObject *u = PyUnicode_FromUnicode(NULL, 0);
+ if (u == NULL)
+ return NULL;
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
+ }
+}
+
+static PyObject *
+bytearrayiter_setstate(bytesiterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (index < 0)
+ index = 0;
+ it->it_index = index;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef bytearrayiter_methods[] = {
- {"__length_hint__", (PyCFunction)bytesarrayiter_length_hint, METH_NOARGS,
+ {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c
index 7233cea..ef3c2f7 100644
--- a/Objects/bytes_methods.c
+++ b/Objects/bytes_methods.c
@@ -248,12 +248,8 @@ _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len)
{
Py_ssize_t i;
- Py_MEMCPY(result, cptr, len);
-
for (i = 0; i < len; i++) {
- int c = Py_CHARMASK(result[i]);
- if (Py_ISUPPER(c))
- result[i] = Py_TOLOWER(c);
+ result[i] = Py_TOLOWER((unsigned char) cptr[i]);
}
}
@@ -268,12 +264,8 @@ _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len)
{
Py_ssize_t i;
- Py_MEMCPY(result, cptr, len);
-
for (i = 0; i < len; i++) {
- int c = Py_CHARMASK(result[i]);
- if (Py_ISLOWER(c))
- result[i] = Py_TOUPPER(c);
+ result[i] = Py_TOUPPER((unsigned char) cptr[i]);
}
}
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 796e400..bf9259f 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -41,10 +41,6 @@ static PyBytesObject *nullstring;
#define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1)
/*
- For both PyBytes_FromString() and PyBytes_FromStringAndSize(), the
- parameter `size' denotes number of characters to allocate, not counting any
- null terminating character.
-
For PyBytes_FromString(), the parameter `str' points to a null-terminated
string containing exactly `size' bytes.
@@ -61,8 +57,8 @@ static PyBytesObject *nullstring;
The PyObject member `op->ob_size', which denotes the number of "extra
items" in a variable-size object, will contain the number of bytes
- allocated for string data, not counting the null terminating character. It
- is therefore equal to the equal to the `size' parameter (for
+ allocated for string data, not counting the null terminating character.
+ It is therefore equal to the `size' parameter (for
PyBytes_FromStringAndSize()) or the length of the string in the `str'
parameter (for PyBytes_FromString()).
*/
@@ -568,76 +564,70 @@ PyBytes_AsStringAndSize(register PyObject *obj,
PyObject *
PyBytes_Repr(PyObject *obj, int smartquotes)
{
- static const char *hexdigits = "0123456789abcdef";
register PyBytesObject* op = (PyBytesObject*) obj;
- Py_ssize_t length = Py_SIZE(op);
- size_t newsize;
+ Py_ssize_t i, length = Py_SIZE(op);
+ size_t newsize, squotes, dquotes;
PyObject *v;
- if (length > (PY_SSIZE_T_MAX - 3) / 4) {
+ unsigned char quote, *s, *p;
+
+ /* Compute size of output string */
+ squotes = dquotes = 0;
+ newsize = 3; /* b'' */
+ s = (unsigned char*)op->ob_sval;
+ for (i = 0; i < length; i++) {
+ switch(s[i]) {
+ case '\'': squotes++; newsize++; break;
+ case '"': dquotes++; newsize++; break;
+ case '\\': case '\t': case '\n': case '\r':
+ newsize += 2; break; /* \C */
+ default:
+ if (s[i] < ' ' || s[i] >= 0x7f)
+ newsize += 4; /* \xHH */
+ else
+ newsize++;
+ }
+ }
+ quote = '\'';
+ if (smartquotes && squotes && !dquotes)
+ quote = '"';
+ if (squotes && quote == '\'')
+ newsize += squotes;
+
+ if (newsize > (PY_SSIZE_T_MAX - sizeof(PyUnicodeObject) - 1)) {
PyErr_SetString(PyExc_OverflowError,
"bytes object is too large to make repr");
return NULL;
}
- newsize = 3 + 4 * length;
- v = PyUnicode_FromUnicode(NULL, newsize);
+
+ v = PyUnicode_New(newsize, 127);
if (v == NULL) {
return NULL;
}
- else {
- register Py_ssize_t i;
- register Py_UNICODE c;
- register Py_UNICODE *p = PyUnicode_AS_UNICODE(v);
- int quote;
-
- /* Figure out which quote to use; single is preferred */
- quote = '\'';
- if (smartquotes) {
- char *test, *start;
- start = PyBytes_AS_STRING(op);
- for (test = start; test < start+length; ++test) {
- if (*test == '"') {
- quote = '\''; /* back to single */
- goto decided;
- }
- else if (*test == '\'')
- quote = '"';
- }
- decided:
- ;
- }
-
- *p++ = 'b', *p++ = quote;
- for (i = 0; i < length; i++) {
- /* There's at least enough room for a hex escape
- and a closing quote. */
- assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 5);
- c = op->ob_sval[i];
- if (c == quote || c == '\\')
- *p++ = '\\', *p++ = c;
- else if (c == '\t')
- *p++ = '\\', *p++ = 't';
- else if (c == '\n')
- *p++ = '\\', *p++ = 'n';
- else if (c == '\r')
- *p++ = '\\', *p++ = 'r';
- else if (c < ' ' || c >= 0x7f) {
- *p++ = '\\';
- *p++ = 'x';
- *p++ = hexdigits[(c & 0xf0) >> 4];
- *p++ = hexdigits[c & 0xf];
- }
- else
- *p++ = c;
- }
- assert(newsize - (p - PyUnicode_AS_UNICODE(v)) >= 1);
- *p++ = quote;
- *p = '\0';
- if (PyUnicode_Resize(&v, (p - PyUnicode_AS_UNICODE(v)))) {
- Py_DECREF(v);
- return NULL;
+ p = PyUnicode_1BYTE_DATA(v);
+
+ *p++ = 'b', *p++ = quote;
+ for (i = 0; i < length; i++) {
+ unsigned char c = op->ob_sval[i];
+ if (c == quote || c == '\\')
+ *p++ = '\\', *p++ = c;
+ else if (c == '\t')
+ *p++ = '\\', *p++ = 't';
+ else if (c == '\n')
+ *p++ = '\\', *p++ = 'n';
+ else if (c == '\r')
+ *p++ = '\\', *p++ = 'r';
+ else if (c < ' ' || c >= 0x7f) {
+ *p++ = '\\';
+ *p++ = 'x';
+ *p++ = Py_hexdigits[(c & 0xf0) >> 4];
+ *p++ = Py_hexdigits[c & 0xf];
}
- return v;
+ else
+ *p++ = c;
}
+ *p++ = quote;
+ assert(_PyUnicode_CheckConsistency(v, 1));
+ return v;
}
static PyObject *
@@ -871,35 +861,11 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
static Py_hash_t
bytes_hash(PyBytesObject *a)
{
- register Py_ssize_t len;
- register unsigned char *p;
- register Py_hash_t x;
-
-#ifdef Py_DEBUG
- assert(_Py_HashSecret_Initialized);
-#endif
- if (a->ob_shash != -1)
- return a->ob_shash;
- len = Py_SIZE(a);
- /*
- We make the hash of the empty string be 0, rather than using
- (prefix ^ suffix), since this slightly obfuscates the hash secret
- */
- if (len == 0) {
- a->ob_shash = 0;
- return 0;
- }
- p = (unsigned char *) a->ob_sval;
- x = _Py_HashSecret.prefix;
- x ^= *p << 7;
- while (--len >= 0)
- x = (_PyHASH_MULTIPLIER*x) ^ *p++;
- x ^= Py_SIZE(a);
- x ^= _Py_HashSecret.suffix;
- if (x == -1)
- x = -2;
- a->ob_shash = x;
- return x;
+ if (a->ob_shash == -1) {
+ /* Can't fail */
+ a->ob_shash = _Py_HashBytes((unsigned char *) a->ob_sval, Py_SIZE(a));
+ }
+ return a->ob_shash;
}
static PyObject*
@@ -1007,7 +973,7 @@ static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"};
#define STRIPNAME(i) (stripformat[i]+3)
PyDoc_STRVAR(split__doc__,
-"B.split([sep[, maxsplit]]) -> list of bytes\n\
+"B.split(sep=None, maxsplit=-1) -> list of bytes\n\
\n\
Return a list of the sections in B, using sep as the delimiter.\n\
If sep is not specified or is None, B is split on ASCII whitespace\n\
@@ -1015,15 +981,17 @@ characters (space, tab, return, newline, formfeed, vertical tab).\n\
If maxsplit is given, at most maxsplit splits are done.");
static PyObject *
-bytes_split(PyBytesObject *self, PyObject *args)
+bytes_split(PyBytesObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Py_ssize_t maxsplit = -1;
const char *s = PyBytes_AS_STRING(self), *sub;
Py_buffer vsub;
PyObject *list, *subobj = Py_None;
- if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split",
+ kwlist, &subobj, &maxsplit))
return NULL;
if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX;
@@ -1095,7 +1063,7 @@ bytes_rpartition(PyBytesObject *self, PyObject *sep_obj)
}
PyDoc_STRVAR(rsplit__doc__,
-"B.rsplit([sep[, maxsplit]]) -> list of bytes\n\
+"B.rsplit(sep=None, maxsplit=-1) -> list of bytes\n\
\n\
Return a list of the sections in B, using sep as the delimiter,\n\
starting at the end of B and working to the front.\n\
@@ -1105,15 +1073,17 @@ If maxsplit is given, at most maxsplit splits are done.");
static PyObject *
-bytes_rsplit(PyBytesObject *self, PyObject *args)
+bytes_rsplit(PyBytesObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
Py_ssize_t len = PyBytes_GET_SIZE(self), n;
Py_ssize_t maxsplit = -1;
const char *s = PyBytes_AS_STRING(self), *sub;
Py_buffer vsub;
PyObject *list, *subobj = Py_None;
- if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit",
+ kwlist, &subobj, &maxsplit))
return NULL;
if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX;
@@ -1254,31 +1224,42 @@ Py_LOCAL_INLINE(Py_ssize_t)
bytes_find_internal(PyBytesObject *self, PyObject *args, int dir)
{
PyObject *subobj;
+ char byte;
+ Py_buffer subbuf;
const char *sub;
Py_ssize_t sub_len;
Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
+ Py_ssize_t res;
- if (!stringlib_parse_args_finds("find/rfind/index/rindex",
- args, &subobj, &start, &end))
+ if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex",
+ args, &subobj, &byte, &start, &end))
return -2;
- if (PyBytes_Check(subobj)) {
- sub = PyBytes_AS_STRING(subobj);
- sub_len = PyBytes_GET_SIZE(subobj);
+ if (subobj) {
+ if (_getbuffer(subobj, &subbuf) < 0)
+ return -2;
+
+ sub = subbuf.buf;
+ sub_len = subbuf.len;
+ }
+ else {
+ sub = &byte;
+ sub_len = 1;
}
- else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len))
- /* XXX - the "expected a character buffer object" is pretty
- confusing for a non-expert. remap to something else ? */
- return -2;
if (dir > 0)
- return stringlib_find_slice(
+ res = stringlib_find_slice(
PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
sub, sub_len, start, end);
else
- return stringlib_rfind_slice(
+ res = stringlib_rfind_slice(
PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self),
sub, sub_len, start, end);
+
+ if (subobj)
+ PyBuffer_Release(&subbuf);
+
+ return res;
}
@@ -1504,23 +1485,38 @@ bytes_count(PyBytesObject *self, PyObject *args)
PyObject *sub_obj;
const char *str = PyBytes_AS_STRING(self), *sub;
Py_ssize_t sub_len;
+ char byte;
Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
- if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end))
+ Py_buffer vsub;
+ PyObject *count_obj;
+
+ if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte,
+ &start, &end))
return NULL;
- if (PyBytes_Check(sub_obj)) {
- sub = PyBytes_AS_STRING(sub_obj);
- sub_len = PyBytes_GET_SIZE(sub_obj);
+ if (sub_obj) {
+ if (_getbuffer(sub_obj, &vsub) < 0)
+ return NULL;
+
+ sub = vsub.buf;
+ sub_len = vsub.len;
+ }
+ else {
+ sub = &byte;
+ sub_len = 1;
}
- else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len))
- return NULL;
ADJUST_INDICES(start, end, PyBytes_GET_SIZE(self));
- return PyLong_FromSsize_t(
+ count_obj = PyLong_FromSsize_t(
stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX)
);
+
+ if (sub_obj)
+ PyBuffer_Release(&vsub);
+
+ return count_obj;
}
@@ -2329,11 +2325,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
-bytes_splitlines(PyObject *self, PyObject *args)
+bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"keepends", 0};
int keepends = 0;
- if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
+ kwlist, &keepends))
return NULL;
return stringlib_splitlines(
@@ -2351,7 +2349,7 @@ Spaces between two numbers are accepted.\n\
Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'.");
static int
-hex_digit_to_int(Py_UNICODE c)
+hex_digit_to_int(Py_UCS4 c)
{
if (c >= 128)
return -1;
@@ -2371,15 +2369,20 @@ bytes_fromhex(PyObject *cls, PyObject *args)
{
PyObject *newstring, *hexobj;
char *buf;
- Py_UNICODE *hex;
Py_ssize_t hexlen, byteslen, i, j;
int top, bot;
+ void *data;
+ unsigned int kind;
if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj))
return NULL;
assert(PyUnicode_Check(hexobj));
- hexlen = PyUnicode_GET_SIZE(hexobj);
- hex = PyUnicode_AS_UNICODE(hexobj);
+ if (PyUnicode_READY(hexobj))
+ return NULL;
+ kind = PyUnicode_KIND(hexobj);
+ data = PyUnicode_DATA(hexobj);
+ hexlen = PyUnicode_GET_LENGTH(hexobj);
+
byteslen = hexlen/2; /* This overestimates if there are spaces */
newstring = PyBytes_FromStringAndSize(NULL, byteslen);
if (!newstring)
@@ -2387,12 +2390,12 @@ bytes_fromhex(PyObject *cls, PyObject *args)
buf = PyBytes_AS_STRING(newstring);
for (i = j = 0; i < hexlen; i += 2) {
/* skip over spaces in the input */
- while (hex[i] == ' ')
+ while (PyUnicode_READ(kind, data, i) == ' ')
i++;
if (i >= hexlen)
break;
- top = hex_digit_to_int(hex[i]);
- bot = hex_digit_to_int(hex[i+1]);
+ top = hex_digit_to_int(PyUnicode_READ(kind, data, i));
+ bot = hex_digit_to_int(PyUnicode_READ(kind, data, i+1));
if (top == -1 || bot == -1) {
PyErr_Format(PyExc_ValueError,
"non-hexadecimal number found in "
@@ -2472,10 +2475,10 @@ bytes_methods[] = {
{"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
{"rpartition", (PyCFunction)bytes_rpartition, METH_O,
rpartition__doc__},
- {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
+ {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__},
{"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
- {"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
- {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS,
+ {"split", (PyCFunction)bytes_split, METH_VARARGS | METH_KEYWORDS, split__doc__},
+ {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS | METH_KEYWORDS,
splitlines__doc__},
{"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
startswith__doc__},
@@ -2574,6 +2577,12 @@ PyBytes_FromObject(PyObject *x)
PyErr_BadInternalCall();
return NULL;
}
+
+ if (PyBytes_CheckExact(x)) {
+ Py_INCREF(x);
+ return x;
+ }
+
/* Use the modern buffer interface */
if (PyObject_CheckBuffer(x)) {
Py_buffer view;
@@ -2582,7 +2591,6 @@ PyBytes_FromObject(PyObject *x)
new = PyBytes_FromStringAndSize(NULL, view.len);
if (!new)
goto fail;
- /* XXX(brett.cannon): Better way to get to internal buffer? */
if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval,
&view, view.len, 'C') < 0)
goto fail;
@@ -2857,149 +2865,6 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
return 0;
}
-/* _PyBytes_FormatLong emulates the format codes d, u, o, x and X, and
- * the F_ALT flag, for Python's long (unbounded) ints. It's not used for
- * Python's regular ints.
- * Return value: a new PyBytes*, or NULL if error.
- * . *pbuf is set to point into it,
- * *plen set to the # of chars following that.
- * Caller must decref it when done using pbuf.
- * The string starting at *pbuf is of the form
- * "-"? ("0x" | "0X")? digit+
- * "0x"/"0X" are present only for x and X conversions, with F_ALT
- * set in flags. The case of hex digits will be correct,
- * There will be at least prec digits, zero-filled on the left if
- * necessary to get that many.
- * val object to be converted
- * flags bitmask of format flags; only F_ALT is looked at
- * prec minimum number of digits; 0-fill on left if needed
- * type a character in [duoxX]; u acts the same as d
- *
- * CAUTION: o, x and X conversions on regular ints can never
- * produce a '-' sign, but can for Python's unbounded ints.
- */
-PyObject*
-_PyBytes_FormatLong(PyObject *val, int flags, int prec, int type,
- char **pbuf, int *plen)
-{
- PyObject *result = NULL;
- char *buf;
- Py_ssize_t i;
- int sign; /* 1 if '-', else 0 */
- int len; /* number of characters */
- Py_ssize_t llen;
- int numdigits; /* len == numnondigits + numdigits */
- int numnondigits = 0;
-
- /* Avoid exceeding SSIZE_T_MAX */
- if (prec > INT_MAX-3) {
- PyErr_SetString(PyExc_OverflowError,
- "precision too large");
- return NULL;
- }
-
- switch (type) {
- case 'd':
- case 'u':
- /* Special-case boolean: we want 0/1 */
- if (PyBool_Check(val))
- result = PyNumber_ToBase(val, 10);
- else
- result = Py_TYPE(val)->tp_str(val);
- break;
- case 'o':
- numnondigits = 2;
- result = PyNumber_ToBase(val, 8);
- break;
- case 'x':
- case 'X':
- numnondigits = 2;
- result = PyNumber_ToBase(val, 16);
- break;
- default:
- assert(!"'type' not in [duoxX]");
- }
- if (!result)
- return NULL;
-
- buf = _PyUnicode_AsString(result);
- if (!buf) {
- Py_DECREF(result);
- return NULL;
- }
-
- /* To modify the string in-place, there can only be one reference. */
- if (Py_REFCNT(result) != 1) {
- PyErr_BadInternalCall();
- return NULL;
- }
- llen = PyUnicode_GetSize(result);
- if (llen > INT_MAX) {
- PyErr_SetString(PyExc_ValueError,
- "string too large in _PyBytes_FormatLong");
- return NULL;
- }
- len = (int)llen;
- if (buf[len-1] == 'L') {
- --len;
- buf[len] = '\0';
- }
- sign = buf[0] == '-';
- numnondigits += sign;
- numdigits = len - numnondigits;
- assert(numdigits > 0);
-
- /* Get rid of base marker unless F_ALT */
- if (((flags & F_ALT) == 0 &&
- (type == 'o' || type == 'x' || type == 'X'))) {
- assert(buf[sign] == '0');
- assert(buf[sign+1] == 'x' || buf[sign+1] == 'X' ||
- buf[sign+1] == 'o');
- numnondigits -= 2;
- buf += 2;
- len -= 2;
- if (sign)
- buf[0] = '-';
- assert(len == numnondigits + numdigits);
- assert(numdigits > 0);
- }
-
- /* Fill with leading zeroes to meet minimum width. */
- if (prec > numdigits) {
- PyObject *r1 = PyBytes_FromStringAndSize(NULL,
- numnondigits + prec);
- char *b1;
- if (!r1) {
- Py_DECREF(result);
- return NULL;
- }
- b1 = PyBytes_AS_STRING(r1);
- for (i = 0; i < numnondigits; ++i)
- *b1++ = *buf++;
- for (i = 0; i < prec - numdigits; i++)
- *b1++ = '0';
- for (i = 0; i < numdigits; i++)
- *b1++ = *buf++;
- *b1 = '\0';
- Py_DECREF(result);
- result = r1;
- buf = PyBytes_AS_STRING(result);
- len = numnondigits + prec;
- }
-
- /* Fix up case for hex conversions. */
- if (type == 'X') {
- /* Need to convert all lower case letters to upper case.
- and need to convert 0x to 0X (and -0x to -0X). */
- for (i = 0; i < len; i++)
- if (buf[i] >= 'a' && buf[i] <= 'x')
- buf[i] -= 'a'-'A';
- }
- *pbuf = buf;
- *plen = len;
- return result;
-}
-
void
PyBytes_Fini(void)
{
@@ -3072,9 +2937,43 @@ striter_len(striterobject *it)
PyDoc_STRVAR(length_hint_doc,
"Private method returning an estimate of len(list(it)).");
+static PyObject *
+striter_reduce(striterobject *it)
+{
+ if (it->it_seq != NULL) {
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ } else {
+ PyObject *u = PyUnicode_FromUnicode(NULL, 0);
+ if (u == NULL)
+ return NULL;
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
+ }
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+striter_setstate(striterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (index < 0)
+ index = 0;
+ it->it_index = index;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef striter_methods[] = {
{"__length_hint__", (PyCFunction)striter_len, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)striter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)striter_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/classobject.c b/Objects/classobject.c
index f956852..cdc9b1c 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -14,6 +14,8 @@ static int numfree = 0;
#define PyMethod_MAXFREELIST 256
#endif
+_Py_IDENTIFIER(__name__);
+
PyObject *
PyMethod_Function(PyObject *im)
{
@@ -190,8 +192,7 @@ method_richcompare(PyObject *self, PyObject *other, int op)
!PyMethod_Check(self) ||
!PyMethod_Check(other))
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
a = (PyMethodObject *)self;
b = (PyMethodObject *)other;
@@ -228,7 +229,7 @@ method_repr(PyMethodObject *a)
}
klass = (PyObject*)Py_TYPE(self);
- funcname = PyObject_GetAttrString(func, "__name__");
+ funcname = _PyObject_GetAttrId(func, &PyId___name__);
if (funcname == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return NULL;
@@ -242,7 +243,7 @@ method_repr(PyMethodObject *a)
if (klass == NULL)
klassname = NULL;
else {
- klassname = PyObject_GetAttrString(klass, "__name__");
+ klassname = _PyObject_GetAttrId(klass, &PyId___name__);
if (klassname == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
Py_XDECREF(funcname);
@@ -402,6 +403,15 @@ PyMethod_Fini(void)
(void)PyMethod_ClearFreeList();
}
+/* Print summary info about the state of the optimized allocator */
+void
+_PyMethod_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PyMethodObject",
+ numfree, sizeof(PyMethodObject));
+}
+
/* ------------------------------------------------------------------------
* instance method
*/
@@ -519,8 +529,7 @@ instancemethod_richcompare(PyObject *self, PyObject *other, int op)
!PyInstanceMethod_Check(self) ||
!PyInstanceMethod_Check(other))
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
a = (PyInstanceMethodObject *)self;
b = (PyInstanceMethodObject *)other;
@@ -547,7 +556,7 @@ instancemethod_repr(PyObject *self)
return NULL;
}
- funcname = PyObject_GetAttrString(func, "__name__");
+ funcname = _PyObject_GetAttrId(func, &PyId___name__);
if (funcname == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return NULL;
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index bb938ea..9713f61 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -8,19 +8,24 @@
/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
static int
-all_name_chars(Py_UNICODE *s)
+all_name_chars(PyObject *o)
{
static char ok_name_char[256];
static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
+ PyUnicodeObject *u = (PyUnicodeObject *)o;
+ const unsigned char *s;
+
+ if (!PyUnicode_Check(o) || PyUnicode_READY(u) == -1 ||
+ PyUnicode_MAX_CHAR_VALUE(u) >= 128)
+ return 0;
if (ok_name_char[*name_chars] == 0) {
unsigned char *p;
for (p = name_chars; *p; p++)
ok_name_char[*p] = 1;
}
+ s = PyUnicode_1BYTE_DATA(u);
while (*s) {
- if (*s >= 128)
- return 0;
if (ok_name_char[*s++] == 0)
return 0;
}
@@ -51,7 +56,8 @@ PyCode_New(int argcount, int kwonlyargcount,
PyObject *lnotab)
{
PyCodeObject *co;
- Py_ssize_t i;
+ unsigned char *cell2arg = NULL;
+ Py_ssize_t i, n_cellvars;
/* Check argument types */
if (argcount < 0 || kwonlyargcount < 0 || nlocals < 0 ||
@@ -68,48 +74,79 @@ PyCode_New(int argcount, int kwonlyargcount,
PyErr_BadInternalCall();
return NULL;
}
+ n_cellvars = PyTuple_GET_SIZE(cellvars);
intern_strings(names);
intern_strings(varnames);
intern_strings(freevars);
intern_strings(cellvars);
/* Intern selected string constants */
- for (i = PyTuple_Size(consts); --i >= 0; ) {
+ for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) {
PyObject *v = PyTuple_GetItem(consts, i);
- if (!PyUnicode_Check(v))
- continue;
- if (!all_name_chars(PyUnicode_AS_UNICODE(v)))
+ if (!all_name_chars(v))
continue;
PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i));
}
+ /* Create mapping between cells and arguments if needed. */
+ if (n_cellvars) {
+ Py_ssize_t total_args = argcount + kwonlyargcount +
+ ((flags & CO_VARARGS) != 0) + ((flags & CO_VARKEYWORDS) != 0);
+ Py_ssize_t alloc_size = sizeof(unsigned char) * n_cellvars;
+ int used_cell2arg = 0;
+ cell2arg = PyMem_MALLOC(alloc_size);
+ if (cell2arg == NULL)
+ return NULL;
+ memset(cell2arg, CO_CELL_NOT_AN_ARG, alloc_size);
+ /* Find cells which are also arguments. */
+ for (i = 0; i < n_cellvars; i++) {
+ Py_ssize_t j;
+ PyObject *cell = PyTuple_GET_ITEM(cellvars, i);
+ for (j = 0; j < total_args; j++) {
+ PyObject *arg = PyTuple_GET_ITEM(varnames, j);
+ if (!PyUnicode_Compare(cell, arg)) {
+ cell2arg[i] = j;
+ used_cell2arg = 1;
+ break;
+ }
+ }
+ }
+ if (!used_cell2arg) {
+ PyMem_FREE(cell2arg);
+ cell2arg = NULL;
+ }
+ }
co = PyObject_NEW(PyCodeObject, &PyCode_Type);
- if (co != NULL) {
- co->co_argcount = argcount;
- co->co_kwonlyargcount = kwonlyargcount;
- co->co_nlocals = nlocals;
- co->co_stacksize = stacksize;
- co->co_flags = flags;
- Py_INCREF(code);
- co->co_code = code;
- Py_INCREF(consts);
- co->co_consts = consts;
- Py_INCREF(names);
- co->co_names = names;
- Py_INCREF(varnames);
- co->co_varnames = varnames;
- Py_INCREF(freevars);
- co->co_freevars = freevars;
- Py_INCREF(cellvars);
- co->co_cellvars = cellvars;
- Py_INCREF(filename);
- co->co_filename = filename;
- Py_INCREF(name);
- co->co_name = name;
- co->co_firstlineno = firstlineno;
- Py_INCREF(lnotab);
- co->co_lnotab = lnotab;
- co->co_zombieframe = NULL;
- co->co_weakreflist = NULL;
+ if (co == NULL) {
+ if (cell2arg)
+ PyMem_FREE(cell2arg);
+ return NULL;
}
+ co->co_argcount = argcount;
+ co->co_kwonlyargcount = kwonlyargcount;
+ co->co_nlocals = nlocals;
+ co->co_stacksize = stacksize;
+ co->co_flags = flags;
+ Py_INCREF(code);
+ co->co_code = code;
+ Py_INCREF(consts);
+ co->co_consts = consts;
+ Py_INCREF(names);
+ co->co_names = names;
+ Py_INCREF(varnames);
+ co->co_varnames = varnames;
+ Py_INCREF(freevars);
+ co->co_freevars = freevars;
+ Py_INCREF(cellvars);
+ co->co_cellvars = cellvars;
+ co->co_cell2arg = cell2arg;
+ Py_INCREF(filename);
+ co->co_filename = filename;
+ Py_INCREF(name);
+ co->co_name = name;
+ co->co_firstlineno = firstlineno;
+ Py_INCREF(lnotab);
+ co->co_lnotab = lnotab;
+ co->co_zombieframe = NULL;
+ co->co_weakreflist = NULL;
return co;
}
@@ -212,9 +249,7 @@ validate_and_copy_tuple(PyObject *tup)
return NULL;
}
else {
- item = PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(item),
- PyUnicode_GET_SIZE(item));
+ item = _PyUnicode_Copy(item);
if (item == NULL) {
Py_DECREF(newtuple);
return NULL;
@@ -330,6 +365,8 @@ code_dealloc(PyCodeObject *co)
Py_XDECREF(co->co_filename);
Py_XDECREF(co->co_name);
Py_XDECREF(co->co_lnotab);
+ if (co->co_cell2arg != NULL)
+ PyMem_FREE(co->co_cell2arg);
if (co->co_zombieframe != NULL)
PyObject_GC_Del(co->co_zombieframe);
if (co->co_weakreflist != NULL)
@@ -338,6 +375,17 @@ code_dealloc(PyCodeObject *co)
}
static PyObject *
+code_sizeof(PyCodeObject *co, void *unused)
+{
+ Py_ssize_t res;
+
+ res = sizeof(PyCodeObject);
+ if (co->co_cell2arg != NULL && co->co_cellvars != NULL)
+ res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(unsigned char);
+ return PyLong_FromSsize_t(res);
+}
+
+static PyObject *
code_repr(PyCodeObject *co)
{
int lineno;
@@ -366,8 +414,7 @@ code_richcompare(PyObject *self, PyObject *other, int op)
if ((op != Py_EQ && op != Py_NE) ||
!PyCode_Check(self) ||
!PyCode_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
co = (PyCodeObject *)self;
@@ -444,6 +491,11 @@ code_hash(PyCodeObject *co)
/* XXX code objects need to participate in GC? */
+static struct PyMethodDef code_methods[] = {
+ {"__sizeof__", (PyCFunction)code_sizeof, METH_NOARGS},
+ {NULL, NULL} /* sentinel */
+};
+
PyTypeObject PyCode_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"code",
@@ -472,7 +524,7 @@ PyTypeObject PyCode_Type = {
offsetof(PyCodeObject, co_weakreflist), /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
- 0, /* tp_methods */
+ code_methods, /* tp_methods */
code_memberlist, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index e247ba9..403c60c 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -265,9 +265,9 @@ PyComplex_ImagAsDouble(PyObject *op)
static PyObject *
try_complex_special_method(PyObject *op) {
PyObject *f;
- static PyObject *complexstr;
+ _Py_IDENTIFIER(__complex__);
- f = _PyObject_LookupSpecial(op, "__complex__", &complexstr);
+ f = _PyObject_LookupSpecial(op, &PyId___complex__);
if (f) {
PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
Py_DECREF(f);
@@ -330,12 +330,10 @@ complex_repr(PyComplexObject *v)
int precision = 0;
char format_code = 'r';
PyObject *result = NULL;
- Py_ssize_t len;
/* If these are non-NULL, they'll need to be freed. */
char *pre = NULL;
char *im = NULL;
- char *buf = NULL;
/* These do not need to be freed. re is either an alias
for pre or a pointer to a constant. lead and tail
@@ -374,20 +372,10 @@ complex_repr(PyComplexObject *v)
lead = "(";
tail = ")";
}
- /* Alloc the final buffer. Add one for the "j" in the format string,
- and one for the trailing zero byte. */
- len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
- buf = PyMem_Malloc(len);
- if (!buf) {
- PyErr_NoMemory();
- goto done;
- }
- PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
- result = PyUnicode_FromString(buf);
+ result = PyUnicode_FromFormat("%s%s%sj%s", lead, re, im, tail);
done:
PyMem_Free(im);
PyMem_Free(pre);
- PyMem_Free(buf);
return result;
}
@@ -662,8 +650,7 @@ complex_richcompare(PyObject *v, PyObject *w, int op)
return res;
Unimplemented:
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
@@ -712,12 +699,22 @@ static PyObject *
complex__format__(PyObject* self, PyObject* args)
{
PyObject *format_spec;
+ _PyUnicodeWriter writer;
+ int ret;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
- return NULL;
- return _PyComplex_FormatAdvanced(self,
- PyUnicode_AS_UNICODE(format_spec),
- PyUnicode_GET_SIZE(format_spec));
+ return NULL;
+
+ _PyUnicodeWriter_Init(&writer, 0);
+ ret = _PyComplex_FormatAdvancedWriter(
+ &writer,
+ self,
+ format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
+ if (ret == -1) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
}
#if 0
@@ -768,20 +765,10 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Py_ssize_t len;
if (PyUnicode_Check(v)) {
- Py_ssize_t i, buflen = PyUnicode_GET_SIZE(v);
- Py_UNICODE *bufptr;
- s_buffer = PyUnicode_TransformDecimalToASCII(
- PyUnicode_AS_UNICODE(v), buflen);
+ s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
if (s_buffer == NULL)
return NULL;
- /* Replace non-ASCII whitespace with ' ' */
- bufptr = PyUnicode_AS_UNICODE(s_buffer);
- for (i = 0; i < buflen; i++) {
- Py_UNICODE ch = bufptr[i];
- if (ch > 127 && Py_UNICODE_ISSPACE(ch))
- bufptr[i] = ' ';
- }
- s = _PyUnicode_AsStringAndSize(s_buffer, &len);
+ s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
if (s == NULL)
goto error;
}
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 9934f23..abcc002 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -9,6 +9,7 @@ descr_dealloc(PyDescrObject *descr)
_PyObject_GC_UNTRACK(descr);
Py_XDECREF(descr->d_type);
Py_XDECREF(descr->d_name);
+ Py_XDECREF(descr->d_qualname);
PyObject_GC_Del(descr);
}
@@ -359,6 +360,44 @@ method_get_doc(PyMethodDescrObject *descr, void *closure)
return PyUnicode_FromString(descr->d_method->ml_doc);
}
+static PyObject *
+calculate_qualname(PyDescrObject *descr)
+{
+ PyObject *type_qualname, *res;
+ _Py_IDENTIFIER(__qualname__);
+
+ if (descr->d_name == NULL || !PyUnicode_Check(descr->d_name)) {
+ PyErr_SetString(PyExc_TypeError,
+ "<descriptor>.__name__ is not a unicode object");
+ return NULL;
+ }
+
+ type_qualname = _PyObject_GetAttrId((PyObject *)descr->d_type,
+ &PyId___qualname__);
+ if (type_qualname == NULL)
+ return NULL;
+
+ if (!PyUnicode_Check(type_qualname)) {
+ PyErr_SetString(PyExc_TypeError, "<descriptor>.__objclass__."
+ "__qualname__ is not a unicode object");
+ Py_XDECREF(type_qualname);
+ return NULL;
+ }
+
+ res = PyUnicode_FromFormat("%S.%S", type_qualname, descr->d_name);
+ Py_DECREF(type_qualname);
+ return res;
+}
+
+static PyObject *
+descr_get_qualname(PyDescrObject *descr)
+{
+ if (descr->d_qualname == NULL)
+ descr->d_qualname = calculate_qualname(descr);
+ Py_XINCREF(descr->d_qualname);
+ return descr->d_qualname;
+}
+
static PyMemberDef descr_members[] = {
{"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
{"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
@@ -367,6 +406,7 @@ static PyMemberDef descr_members[] = {
static PyGetSetDef method_getset[] = {
{"__doc__", (getter)method_get_doc},
+ {"__qualname__", (getter)descr_get_qualname},
{0}
};
@@ -382,6 +422,7 @@ member_get_doc(PyMemberDescrObject *descr, void *closure)
static PyGetSetDef member_getset[] = {
{"__doc__", (getter)member_get_doc},
+ {"__qualname__", (getter)descr_get_qualname},
{0}
};
@@ -397,6 +438,7 @@ getset_get_doc(PyGetSetDescrObject *descr, void *closure)
static PyGetSetDef getset_getset[] = {
{"__doc__", (getter)getset_get_doc},
+ {"__qualname__", (getter)descr_get_qualname},
{0}
};
@@ -412,6 +454,7 @@ wrapperdescr_get_doc(PyWrapperDescrObject *descr, void *closure)
static PyGetSetDef wrapperdescr_getset[] = {
{"__doc__", (getter)wrapperdescr_get_doc},
+ {"__qualname__", (getter)descr_get_qualname},
{0}
};
@@ -623,6 +666,9 @@ descr_new(PyTypeObject *descrtype, PyTypeObject *type, const char *name)
Py_DECREF(descr);
descr = NULL;
}
+ else {
+ descr->d_qualname = NULL;
+ }
}
return descr;
}
@@ -690,41 +736,44 @@ PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)
}
-/* --- Readonly proxy for dictionaries (actually any mapping) --- */
+/* --- mappingproxy: read-only proxy for mappings --- */
/* This has no reason to be in this file except that adding new files is a
bit of a pain */
typedef struct {
PyObject_HEAD
- PyObject *dict;
-} proxyobject;
+ PyObject *mapping;
+} mappingproxyobject;
static Py_ssize_t
-proxy_len(proxyobject *pp)
+mappingproxy_len(mappingproxyobject *pp)
{
- return PyObject_Size(pp->dict);
+ return PyObject_Size(pp->mapping);
}
static PyObject *
-proxy_getitem(proxyobject *pp, PyObject *key)
+mappingproxy_getitem(mappingproxyobject *pp, PyObject *key)
{
- return PyObject_GetItem(pp->dict, key);
+ return PyObject_GetItem(pp->mapping, key);
}
-static PyMappingMethods proxy_as_mapping = {
- (lenfunc)proxy_len, /* mp_length */
- (binaryfunc)proxy_getitem, /* mp_subscript */
+static PyMappingMethods mappingproxy_as_mapping = {
+ (lenfunc)mappingproxy_len, /* mp_length */
+ (binaryfunc)mappingproxy_getitem, /* mp_subscript */
0, /* mp_ass_subscript */
};
static int
-proxy_contains(proxyobject *pp, PyObject *key)
+mappingproxy_contains(mappingproxyobject *pp, PyObject *key)
{
- return PyDict_Contains(pp->dict, key);
+ if (PyDict_CheckExact(pp->mapping))
+ return PyDict_Contains(pp->mapping, key);
+ else
+ return PySequence_Contains(pp->mapping, key);
}
-static PySequenceMethods proxy_as_sequence = {
+static PySequenceMethods mappingproxy_as_sequence = {
0, /* sq_length */
0, /* sq_concat */
0, /* sq_repeat */
@@ -732,147 +781,199 @@ static PySequenceMethods proxy_as_sequence = {
0, /* sq_slice */
0, /* sq_ass_item */
0, /* sq_ass_slice */
- (objobjproc)proxy_contains, /* sq_contains */
+ (objobjproc)mappingproxy_contains, /* sq_contains */
0, /* sq_inplace_concat */
0, /* sq_inplace_repeat */
};
static PyObject *
-proxy_get(proxyobject *pp, PyObject *args)
+mappingproxy_get(mappingproxyobject *pp, PyObject *args)
{
PyObject *key, *def = Py_None;
+ _Py_IDENTIFIER(get);
if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def))
return NULL;
- return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def);
+ return _PyObject_CallMethodId(pp->mapping, &PyId_get, "(OO)", key, def);
}
static PyObject *
-proxy_keys(proxyobject *pp)
+mappingproxy_keys(mappingproxyobject *pp)
{
- return PyObject_CallMethod(pp->dict, "keys", NULL);
+ _Py_IDENTIFIER(keys);
+ return _PyObject_CallMethodId(pp->mapping, &PyId_keys, NULL);
}
static PyObject *
-proxy_values(proxyobject *pp)
+mappingproxy_values(mappingproxyobject *pp)
{
- return PyObject_CallMethod(pp->dict, "values", NULL);
+ _Py_IDENTIFIER(values);
+ return _PyObject_CallMethodId(pp->mapping, &PyId_values, NULL);
}
static PyObject *
-proxy_items(proxyobject *pp)
+mappingproxy_items(mappingproxyobject *pp)
{
- return PyObject_CallMethod(pp->dict, "items", NULL);
+ _Py_IDENTIFIER(items);
+ return _PyObject_CallMethodId(pp->mapping, &PyId_items, NULL);
}
static PyObject *
-proxy_copy(proxyobject *pp)
+mappingproxy_copy(mappingproxyobject *pp)
{
- return PyObject_CallMethod(pp->dict, "copy", NULL);
+ _Py_IDENTIFIER(copy);
+ return _PyObject_CallMethodId(pp->mapping, &PyId_copy, NULL);
}
-static PyMethodDef proxy_methods[] = {
- {"get", (PyCFunction)proxy_get, METH_VARARGS,
+/* WARNING: mappingproxy methods must not give access
+ to the underlying mapping */
+
+static PyMethodDef mappingproxy_methods[] = {
+ {"get", (PyCFunction)mappingproxy_get, METH_VARARGS,
PyDoc_STR("D.get(k[,d]) -> D[k] if k in D, else d."
- " d defaults to None.")},
- {"keys", (PyCFunction)proxy_keys, METH_NOARGS,
+ " d defaults to None.")},
+ {"keys", (PyCFunction)mappingproxy_keys, METH_NOARGS,
PyDoc_STR("D.keys() -> list of D's keys")},
- {"values", (PyCFunction)proxy_values, METH_NOARGS,
+ {"values", (PyCFunction)mappingproxy_values, METH_NOARGS,
PyDoc_STR("D.values() -> list of D's values")},
- {"items", (PyCFunction)proxy_items, METH_NOARGS,
+ {"items", (PyCFunction)mappingproxy_items, METH_NOARGS,
PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")},
- {"copy", (PyCFunction)proxy_copy, METH_NOARGS,
+ {"copy", (PyCFunction)mappingproxy_copy, METH_NOARGS,
PyDoc_STR("D.copy() -> a shallow copy of D")},
{0}
};
static void
-proxy_dealloc(proxyobject *pp)
+mappingproxy_dealloc(mappingproxyobject *pp)
{
_PyObject_GC_UNTRACK(pp);
- Py_DECREF(pp->dict);
+ Py_DECREF(pp->mapping);
PyObject_GC_Del(pp);
}
static PyObject *
-proxy_getiter(proxyobject *pp)
+mappingproxy_getiter(mappingproxyobject *pp)
{
- return PyObject_GetIter(pp->dict);
+ return PyObject_GetIter(pp->mapping);
}
static PyObject *
-proxy_str(proxyobject *pp)
+mappingproxy_str(mappingproxyobject *pp)
{
- return PyObject_Str(pp->dict);
+ return PyObject_Str(pp->mapping);
}
static PyObject *
-proxy_repr(proxyobject *pp)
+mappingproxy_repr(mappingproxyobject *pp)
{
- return PyUnicode_FromFormat("dict_proxy(%R)", pp->dict);
+ return PyUnicode_FromFormat("mappingproxy(%R)", pp->mapping);
}
static int
-proxy_traverse(PyObject *self, visitproc visit, void *arg)
+mappingproxy_traverse(PyObject *self, visitproc visit, void *arg)
{
- proxyobject *pp = (proxyobject *)self;
- Py_VISIT(pp->dict);
+ mappingproxyobject *pp = (mappingproxyobject *)self;
+ Py_VISIT(pp->mapping);
return 0;
}
static PyObject *
-proxy_richcompare(proxyobject *v, PyObject *w, int op)
+mappingproxy_richcompare(mappingproxyobject *v, PyObject *w, int op)
+{
+ return PyObject_RichCompare(v->mapping, w, op);
+}
+
+static int
+mappingproxy_check_mapping(PyObject *mapping)
{
- return PyObject_RichCompare(v->dict, w, op);
+ if (!PyMapping_Check(mapping)
+ || PyList_Check(mapping)
+ || PyTuple_Check(mapping)) {
+ PyErr_Format(PyExc_TypeError,
+ "mappingproxy() argument must be a mapping, not %s",
+ Py_TYPE(mapping)->tp_name);
+ return -1;
+ }
+ return 0;
+}
+
+static PyObject*
+mappingproxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"mapping", NULL};
+ PyObject *mapping;
+ mappingproxyobject *mappingproxy;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:mappingproxy",
+ kwlist, &mapping))
+ return NULL;
+
+ if (mappingproxy_check_mapping(mapping) == -1)
+ return NULL;
+
+ mappingproxy = PyObject_GC_New(mappingproxyobject, &PyDictProxy_Type);
+ if (mappingproxy == NULL)
+ return NULL;
+ Py_INCREF(mapping);
+ mappingproxy->mapping = mapping;
+ _PyObject_GC_TRACK(mappingproxy);
+ return (PyObject *)mappingproxy;
}
PyTypeObject PyDictProxy_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- "dict_proxy", /* tp_name */
- sizeof(proxyobject), /* tp_basicsize */
+ "mappingproxy", /* tp_name */
+ sizeof(mappingproxyobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- (destructor)proxy_dealloc, /* tp_dealloc */
+ (destructor)mappingproxy_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
- (reprfunc)proxy_repr, /* tp_repr */
+ (reprfunc)mappingproxy_repr, /* tp_repr */
0, /* tp_as_number */
- &proxy_as_sequence, /* tp_as_sequence */
- &proxy_as_mapping, /* tp_as_mapping */
+ &mappingproxy_as_sequence, /* tp_as_sequence */
+ &mappingproxy_as_mapping, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
- (reprfunc)proxy_str, /* tp_str */
+ (reprfunc)mappingproxy_str, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
- proxy_traverse, /* tp_traverse */
+ mappingproxy_traverse, /* tp_traverse */
0, /* tp_clear */
- (richcmpfunc)proxy_richcompare, /* tp_richcompare */
+ (richcmpfunc)mappingproxy_richcompare, /* tp_richcompare */
0, /* tp_weaklistoffset */
- (getiterfunc)proxy_getiter, /* tp_iter */
+ (getiterfunc)mappingproxy_getiter, /* tp_iter */
0, /* tp_iternext */
- proxy_methods, /* tp_methods */
+ mappingproxy_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ mappingproxy_new, /* tp_new */
};
PyObject *
-PyDictProxy_New(PyObject *dict)
+PyDictProxy_New(PyObject *mapping)
{
- proxyobject *pp;
+ mappingproxyobject *pp;
+
+ if (mappingproxy_check_mapping(mapping) == -1)
+ return NULL;
- pp = PyObject_GC_New(proxyobject, &PyDictProxy_Type);
+ pp = PyObject_GC_New(mappingproxyobject, &PyDictProxy_Type);
if (pp != NULL) {
- Py_INCREF(dict);
- pp->dict = dict;
+ Py_INCREF(mapping);
+ pp->mapping = mapping;
_PyObject_GC_TRACK(pp);
}
return (PyObject *)pp;
@@ -1020,9 +1121,16 @@ wrapper_doc(wrapperobject *wp)
}
}
+static PyObject *
+wrapper_qualname(wrapperobject *wp)
+{
+ return descr_get_qualname((PyDescrObject *)wp->descr);
+}
+
static PyGetSetDef wrapper_getsets[] = {
{"__objclass__", (getter)wrapper_objclass},
{"__name__", (getter)wrapper_name},
+ {"__qualname__", (getter)wrapper_qualname},
{"__doc__", (getter)wrapper_doc},
{0}
};
@@ -1332,7 +1440,8 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds)
/* if no docstring given and the getter has one, use that one */
if ((doc == NULL || doc == Py_None) && get != NULL) {
- PyObject *get_doc = PyObject_GetAttrString(get, "__doc__");
+ _Py_IDENTIFIER(__doc__);
+ PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__);
if (get_doc) {
if (Py_TYPE(self) == &PyProperty_Type) {
Py_XDECREF(prop->prop_doc);
@@ -1343,7 +1452,7 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds)
in dict of the subclass instance instead,
otherwise it gets shadowed by __doc__ in the
class's dict. */
- int err = PyObject_SetAttrString(self, "__doc__", get_doc);
+ int err = _PyObject_SetAttrId(self, &PyId___doc__, get_doc);
Py_DECREF(get_doc);
if (err < 0)
return -1;
@@ -1361,6 +1470,43 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds)
return 0;
}
+static PyObject *
+property_get___isabstractmethod__(propertyobject *prop, void *closure)
+{
+ int res = _PyObject_IsAbstract(prop->prop_get);
+ if (res == -1) {
+ return NULL;
+ }
+ else if (res) {
+ Py_RETURN_TRUE;
+ }
+
+ res = _PyObject_IsAbstract(prop->prop_set);
+ if (res == -1) {
+ return NULL;
+ }
+ else if (res) {
+ Py_RETURN_TRUE;
+ }
+
+ res = _PyObject_IsAbstract(prop->prop_del);
+ if (res == -1) {
+ return NULL;
+ }
+ else if (res) {
+ Py_RETURN_TRUE;
+ }
+ Py_RETURN_FALSE;
+}
+
+static PyGetSetDef property_getsetlist[] = {
+ {"__isabstractmethod__",
+ (getter)property_get___isabstractmethod__, NULL,
+ NULL,
+ NULL},
+ {NULL} /* Sentinel */
+};
+
PyDoc_STRVAR(property_doc,
"property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n"
"\n"
@@ -1426,7 +1572,7 @@ PyTypeObject PyProperty_Type = {
0, /* tp_iternext */
property_methods, /* tp_methods */
property_members, /* tp_members */
- 0, /* tp_getset */
+ property_getsetlist, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
property_descr_get, /* tp_descr_get */
diff --git a/Objects/dictnotes.txt b/Objects/dictnotes.txt
index d3aa774..f89720c 100644
--- a/Objects/dictnotes.txt
+++ b/Objects/dictnotes.txt
@@ -1,7 +1,6 @@
-NOTES ON OPTIMIZING DICTIONARIES
+NOTES ON DICTIONARIES
================================
-
Principal Use Cases for Dictionaries
------------------------------------
@@ -21,7 +20,7 @@ Instance attribute lookup and Global variables
Builtins
Frequent reads. Almost never written.
- Size 126 interned strings (as of Py2.3b1).
+ About 150 interned strings (as of Py3.3).
A few keys are accessed much more frequently than others.
Uniquification
@@ -59,55 +58,20 @@ Dynamic Mappings
Characterized by deletions interspersed with adds and replacements.
Performance benefits greatly from the re-use of dummy entries.
+Data Layout
+-----------
-Data Layout (assuming a 32-bit box with 64 bytes per cache line)
-----------------------------------------------------------------
-
-Smalldicts (8 entries) are attached to the dictobject structure
-and the whole group nearly fills two consecutive cache lines.
-
-Larger dicts use the first half of the dictobject structure (one cache
-line) and a separate, continuous block of entries (at 12 bytes each
-for a total of 5.333 entries per cache line).
+Dictionaries are composed of 3 components:
+The dictobject struct itself
+A dict-keys object (keys & hashes)
+A values array
Tunable Dictionary Parameters
-----------------------------
-* PyDict_MINSIZE. Currently set to 8.
- Must be a power of two. New dicts have to zero-out every cell.
- Each additional 8 consumes 1.5 cache lines. Increasing improves
- the sparseness of small dictionaries but costs time to read in
- the additional cache lines if they are not already in cache.
- That case is common when keyword arguments are passed.
-
-* Maximum dictionary load in PyDict_SetItem. Currently set to 2/3.
- Increasing this ratio makes dictionaries more dense resulting
- in more collisions. Decreasing it improves sparseness at the
- expense of spreading entries over more cache lines and at the
- cost of total memory consumed.
-
- The load test occurs in highly time sensitive code. Efforts
- to make the test more complex (for example, varying the load
- for different sizes) have degraded performance.
-
-* Growth rate upon hitting maximum load. Currently set to *2.
- Raising this to *4 results in half the number of resizes,
- less effort to resize, better sparseness for some (but not
- all dict sizes), and potentially doubles memory consumption
- depending on the size of the dictionary. Setting to *4
- eliminates every other resize step.
-
-* Maximum sparseness (minimum dictionary load). What percentage
- of entries can be unused before the dictionary shrinks to
- free up memory and speed up iteration? (The current CPython
- code does not represent this parameter directly.)
-
-* Shrinkage rate upon exceeding maximum sparseness. The current
- CPython code never even checks sparseness when deleting a
- key. When a new key is added, it resizes based on the number
- of active keys, so that the addition may trigger shrinkage
- rather than growth.
+See comments for PyDict_MINSIZE_SPLIT, PyDict_MINSIZE_COMBINED,
+USABLE_FRACTION and GROWTH_RATE in dictobject.c
Tune-ups should be measured across a broad range of applications and
use cases. A change to any parameter will help in some situations and
@@ -126,8 +90,8 @@ __iter__(), iterkeys(), iteritems(), itervalues(), and update().
Also, every dictionary iterates at least twice, once for the memset()
when it is created and once by dealloc().
-Dictionary operations involving only a single key can be O(1) unless
-resizing is possible. By checking for a resize only when the
+Dictionary operations involving only a single key can be O(1) unless
+resizing is possible. By checking for a resize only when the
dictionary can grow (and may *require* resizing), other operations
remain O(1), and the odds of resize thrashing or memory fragmentation
are reduced. In particular, an algorithm that empties a dictionary
@@ -135,136 +99,51 @@ by repeatedly invoking .pop will see no resizing, which might
not be necessary at all because the dictionary is eventually
discarded entirely.
+The key differences between this implementation and earlier versions are:
+ 1. The table can be split into two parts, the keys and the values.
+
+ 2. There is an additional key-value combination: (key, NULL).
+ Unlike (<dummy>, NULL) which represents a deleted value, (key, NULL)
+ represented a yet to be inserted value. This combination can only occur
+ when the table is split.
+
+ 3. No small table embedded in the dict,
+ as this would make sharing of key-tables impossible.
+
+
+These changes have the following consequences.
+ 1. General dictionaries are slightly larger.
+
+ 2. All object dictionaries of a single class can share a single key-table,
+ saving about 60% memory for such cases.
Results of Cache Locality Experiments
--------------------------------------
-
-When an entry is retrieved from memory, 4.333 adjacent entries are also
-retrieved into a cache line. Since accessing items in cache is *much*
-cheaper than a cache miss, an enticing idea is to probe the adjacent
-entries as a first step in collision resolution. Unfortunately, the
-introduction of any regularity into collision searches results in more
-collisions than the current random chaining approach.
-
-Exploiting cache locality at the expense of additional collisions fails
-to payoff when the entries are already loaded in cache (the expense
-is paid with no compensating benefit). This occurs in small dictionaries
-where the whole dictionary fits into a pair of cache lines. It also
-occurs frequently in large dictionaries which have a common access pattern
-where some keys are accessed much more frequently than others. The
-more popular entries *and* their collision chains tend to remain in cache.
-
-To exploit cache locality, change the collision resolution section
-in lookdict() and lookdict_string(). Set i^=1 at the top of the
-loop and move the i = (i << 2) + i + perturb + 1 to an unrolled
-version of the loop.
-
-This optimization strategy can be leveraged in several ways:
-
-* If the dictionary is kept sparse (through the tunable parameters),
-then the occurrence of additional collisions is lessened.
-
-* If lookdict() and lookdict_string() are specialized for small dicts
-and for largedicts, then the versions for large_dicts can be given
-an alternate search strategy without increasing collisions in small dicts
-which already have the maximum benefit of cache locality.
-
-* If the use case for a dictionary is known to have a random key
-access pattern (as opposed to a more common pattern with a Zipf's law
-distribution), then there will be more benefit for large dictionaries
-because any given key is no more likely than another to already be
-in cache.
-
-* In use cases with paired accesses to the same key, the second access
-is always in cache and gets no benefit from efforts to further improve
-cache locality.
-
-Optimizing the Search of Small Dictionaries
--------------------------------------------
-
-If lookdict() and lookdict_string() are specialized for smaller dictionaries,
-then a custom search approach can be implemented that exploits the small
-search space and cache locality.
-
-* The simplest example is a linear search of contiguous entries. This is
- simple to implement, guaranteed to terminate rapidly, never searches
- the same entry twice, and precludes the need to check for dummy entries.
-
-* A more advanced example is a self-organizing search so that the most
- frequently accessed entries get probed first. The organization
- adapts if the access pattern changes over time. Treaps are ideally
- suited for self-organization with the most common entries at the
- top of the heap and a rapid binary search pattern. Most probes and
- results are all located at the top of the tree allowing them all to
- be located in one or two cache lines.
-
-* Also, small dictionaries may be made more dense, perhaps filling all
- eight cells to take the maximum advantage of two cache lines.
-
-
-Strategy Pattern
-----------------
-
-Consider allowing the user to set the tunable parameters or to select a
-particular search method. Since some dictionary use cases have known
-sizes and access patterns, the user may be able to provide useful hints.
-
-1) For example, if membership testing or lookups dominate runtime and memory
- is not at a premium, the user may benefit from setting the maximum load
- ratio at 5% or 10% instead of the usual 66.7%. This will sharply
- curtail the number of collisions but will increase iteration time.
- The builtin namespace is a prime example of a dictionary that can
- benefit from being highly sparse.
-
-2) Dictionary creation time can be shortened in cases where the ultimate
- size of the dictionary is known in advance. The dictionary can be
- pre-sized so that no resize operations are required during creation.
- Not only does this save resizes, but the key insertion will go
- more quickly because the first half of the keys will be inserted into
- a more sparse environment than before. The preconditions for this
- strategy arise whenever a dictionary is created from a key or item
- sequence and the number of *unique* keys is known.
-
-3) If the key space is large and the access pattern is known to be random,
- then search strategies exploiting cache locality can be fruitful.
- The preconditions for this strategy arise in simulations and
- numerical analysis.
-
-4) If the keys are fixed and the access pattern strongly favors some of
- the keys, then the entries can be stored contiguously and accessed
- with a linear search or treap. This exploits knowledge of the data,
- cache locality, and a simplified search routine. It also eliminates
- the need to test for dummy entries on each probe. The preconditions
- for this strategy arise in symbol tables and in the builtin dictionary.
-
-
-Readonly Dictionaries
----------------------
-Some dictionary use cases pass through a build stage and then move to a
-more heavily exercised lookup stage with no further changes to the
-dictionary.
-
-An idea that emerged on python-dev is to be able to convert a dictionary
-to a read-only state. This can help prevent programming errors and also
-provide knowledge that can be exploited for lookup optimization.
-
-The dictionary can be immediately rebuilt (eliminating dummy entries),
-resized (to an appropriate level of sparseness), and the keys can be
-jostled (to minimize collisions). The lookdict() routine can then
-eliminate the test for dummy entries (saving about 1/4 of the time
-spent in the collision resolution loop).
-
-An additional possibility is to insert links into the empty spaces
-so that dictionary iteration can proceed in len(d) steps instead of
-(mp->mask + 1) steps. Alternatively, a separate tuple of keys can be
-kept just for iteration.
-
-
-Caching Lookups
----------------
-The idea is to exploit key access patterns by anticipating future lookups
-based on previous lookups.
-
-The simplest incarnation is to save the most recently accessed entry.
-This gives optimal performance for use cases where every get is followed
-by a set or del to the same key.
+--------------------------------------
+
+Experiments on an earlier design of dictionary, in which all tables were
+combined, showed the following:
+
+ When an entry is retrieved from memory, several adjacent entries are also
+ retrieved into a cache line. Since accessing items in cache is *much*
+ cheaper than a cache miss, an enticing idea is to probe the adjacent
+ entries as a first step in collision resolution. Unfortunately, the
+ introduction of any regularity into collision searches results in more
+ collisions than the current random chaining approach.
+
+ Exploiting cache locality at the expense of additional collisions fails
+ to payoff when the entries are already loaded in cache (the expense
+ is paid with no compensating benefit). This occurs in small dictionaries
+ where the whole dictionary fits into a pair of cache lines. It also
+ occurs frequently in large dictionaries which have a common access pattern
+ where some keys are accessed much more frequently than others. The
+ more popular entries *and* their collision chains tend to remain in cache.
+
+ To exploit cache locality, change the collision resolution section
+ in lookdict() and lookdict_string(). Set i^=1 at the top of the
+ loop and move the i = (i << 2) + i + perturb + 1 to an unrolled
+ version of the loop.
+
+For split tables, the above will apply to the keys, but the value will
+always be in a different cache line from the key.
+
+
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index c10bfcc..f4ad3dc 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -7,9 +7,93 @@
tuning dictionaries, and several ideas for possible optimizations.
*/
+
+/*
+There are four kinds of slots in the table:
+
+1. Unused. me_key == me_value == NULL
+ Does not hold an active (key, value) pair now and never did. Unused can
+ transition to Active upon key insertion. This is the only case in which
+ me_key is NULL, and is each slot's initial state.
+
+2. Active. me_key != NULL and me_key != dummy and me_value != NULL
+ Holds an active (key, value) pair. Active can transition to Dummy or
+ Pending upon key deletion (for combined and split tables respectively).
+ This is the only case in which me_value != NULL.
+
+3. Dummy. me_key == dummy and me_value == NULL
+ Previously held an active (key, value) pair, but that was deleted and an
+ active pair has not yet overwritten the slot. Dummy can transition to
+ Active upon key insertion. Dummy slots cannot be made Unused again
+ (cannot have me_key set to NULL), else the probe sequence in case of
+ collision would have no way to know they were once active.
+
+4. Pending. Not yet inserted or deleted from a split-table.
+ key != NULL, key != dummy and value == NULL
+
+The DictObject can be in one of two forms.
+Either:
+ A combined table:
+ ma_values == NULL, dk_refcnt == 1.
+ Values are stored in the me_value field of the PyDictKeysObject.
+ Slot kind 4 is not allowed i.e.
+ key != NULL, key != dummy and value == NULL is illegal.
+Or:
+ A split table:
+ ma_values != NULL, dk_refcnt >= 1
+ Values are stored in the ma_values array.
+ Only string (unicode) keys are allowed, no <dummy> keys are present.
+
+Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
+hold a search finger. The me_hash field of Unused or Dummy slots has no
+meaning otherwise. As a consequence of this popitem always converts the dict
+to the combined-table form.
+*/
+
+/* PyDict_MINSIZE_SPLIT is the minimum size of a split dictionary.
+ * It must be a power of 2, and at least 4.
+ * Resizing of split dictionaries is very rare, so the saving memory is more
+ * important than the cost of resizing.
+ */
+#define PyDict_MINSIZE_SPLIT 4
+
+/* PyDict_MINSIZE_COMBINED is the starting size for any new, non-split dict.
+ * 8 allows dicts with no more than 5 active entries; experiments suggested
+ * this suffices for the majority of dicts (consisting mostly of usually-small
+ * dicts created to pass keyword arguments).
+ * Making this 8, rather than 4 reduces the number of resizes for most
+ * dictionaries, without any significant extra memory use.
+ */
+#define PyDict_MINSIZE_COMBINED 8
+
#include "Python.h"
#include "stringlib/eq.h"
+typedef struct {
+ /* Cached hash code of me_key. */
+ Py_hash_t me_hash;
+ PyObject *me_key;
+ PyObject *me_value; /* This field is only meaningful for combined tables */
+} PyDictKeyEntry;
+
+typedef PyDictKeyEntry *(*dict_lookup_func)
+(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr);
+
+struct _dictkeysobject {
+ Py_ssize_t dk_refcnt;
+ Py_ssize_t dk_size;
+ dict_lookup_func dk_lookup;
+ Py_ssize_t dk_usable;
+ PyDictKeyEntry dk_entries[1];
+};
+
+
+/*
+To ensure the lookup algorithm terminates, there must be at least one Unused
+slot (NULL key) in the table.
+To avoid slowing down lookups on a near-full table, we resize the table when
+it's USABLE_FRACTION (currently two-thirds) full.
+*/
/* Set a key error with the specified argument, wrapping it in a
* tuple automatically so that tuple keys are not unpacked as the
@@ -25,10 +109,6 @@ set_key_error(PyObject *arg)
Py_DECREF(tup);
}
-/* Define this out if you don't want conversion statistics on exit. */
-#undef SHOW_CONVERSION_COUNTS
-
-/* See large comment block below. This must be >= 1. */
#define PERTURB_SHIFT 5
/*
@@ -126,8 +206,13 @@ equally good collision statistics, needed less code & used less memory.
*/
-/* Object used as dummy key to fill deleted entries */
-static PyObject *dummy = NULL; /* Initialized by first call to newPyDictObject() */
+/* Object used as dummy key to fill deleted entries
+ * This could be any unique object,
+ * use a custom type in order to minimise coupling.
+*/
+static PyObject _dummy_struct;
+
+#define dummy (&_dummy_struct)
#ifdef Py_REF_DEBUG
PyObject *
@@ -138,152 +223,213 @@ _PyDict_Dummy(void)
#endif
/* forward declarations */
-static PyDictEntry *
-lookdict_unicode(PyDictObject *mp, PyObject *key, Py_hash_t hash);
+static PyDictKeyEntry *lookdict(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr);
+static PyDictKeyEntry *lookdict_unicode(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr);
+static PyDictKeyEntry *
+lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr);
+static PyDictKeyEntry *lookdict_split(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr);
+
+static int dictresize(PyDictObject *mp, Py_ssize_t minused);
-#ifdef SHOW_CONVERSION_COUNTS
-static long created = 0L;
-static long converted = 0L;
+/* Dictionary reuse scheme to save calls to malloc, free, and memset */
+#ifndef PyDict_MAXFREELIST
+#define PyDict_MAXFREELIST 80
+#endif
+static PyDictObject *free_list[PyDict_MAXFREELIST];
+static int numfree = 0;
-static void
-show_counts(void)
+int
+PyDict_ClearFreeList(void)
{
- fprintf(stderr, "created %ld string dicts\n", created);
- fprintf(stderr, "converted %ld to normal dicts\n", converted);
- fprintf(stderr, "%.2f%% conversion rate\n", (100.0*converted)/created);
+ PyDictObject *op;
+ int ret = numfree;
+ while (numfree) {
+ op = free_list[--numfree];
+ assert(PyDict_CheckExact(op));
+ PyObject_GC_Del(op);
+ }
+ return ret;
}
-#endif
-/* Debug statistic to compare allocations with reuse through the free list */
-#undef SHOW_ALLOC_COUNT
-#ifdef SHOW_ALLOC_COUNT
-static size_t count_alloc = 0;
-static size_t count_reuse = 0;
-
-static void
-show_alloc(void)
+/* Print summary info about the state of the optimized allocator */
+void
+_PyDict_DebugMallocStats(FILE *out)
{
- fprintf(stderr, "Dict allocations: %" PY_FORMAT_SIZE_T "d\n",
- count_alloc);
- fprintf(stderr, "Dict reuse through freelist: %" PY_FORMAT_SIZE_T
- "d\n", count_reuse);
- fprintf(stderr, "%.2f%% reuse rate\n\n",
- (100.0*count_reuse/(count_alloc+count_reuse)));
+ _PyDebugAllocatorStats(out,
+ "free PyDictObject", numfree, sizeof(PyDictObject));
}
-#endif
-/* Debug statistic to count GC tracking of dicts */
-#ifdef SHOW_TRACK_COUNT
-static Py_ssize_t count_untracked = 0;
-static Py_ssize_t count_tracked = 0;
-static void
-show_track(void)
+void
+PyDict_Fini(void)
{
- fprintf(stderr, "Dicts created: %" PY_FORMAT_SIZE_T "d\n",
- count_tracked + count_untracked);
- fprintf(stderr, "Dicts tracked by the GC: %" PY_FORMAT_SIZE_T
- "d\n", count_tracked);
- fprintf(stderr, "%.2f%% dict tracking rate\n\n",
- (100.0*count_tracked/(count_untracked+count_tracked)));
+ PyDict_ClearFreeList();
}
-#endif
+#define DK_DEBUG_INCREF _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA
+#define DK_DEBUG_DECREF _Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA
+
+#define DK_INCREF(dk) (DK_DEBUG_INCREF ++(dk)->dk_refcnt)
+#define DK_DECREF(dk) if (DK_DEBUG_DECREF (--(dk)->dk_refcnt) == 0) free_keys_object(dk)
+#define DK_SIZE(dk) ((dk)->dk_size)
+#define DK_MASK(dk) (((dk)->dk_size)-1)
+#define IS_POWER_OF_2(x) (((x) & (x-1)) == 0)
+
+/* USABLE_FRACTION is the maximum dictionary load.
+ * Currently set to (2n+1)/3. Increasing this ratio makes dictionaries more
+ * dense resulting in more collisions. Decreasing it improves sparseness
+ * at the expense of spreading entries over more cache lines and at the
+ * cost of total memory consumed.
+ *
+ * USABLE_FRACTION must obey the following:
+ * (0 < USABLE_FRACTION(n) < n) for all n >= 2
+ *
+ * USABLE_FRACTION should be very quick to calculate.
+ * Fractions around 5/8 to 2/3 seem to work well in practice.
+ */
-/* Initialization macros.
- There are two ways to create a dict: PyDict_New() is the main C API
- function, and the tp_new slot maps to dict_new(). In the latter case we
- can save a little time over what PyDict_New does because it's guaranteed
- that the PyDictObject struct is already zeroed out.
- Everyone except dict_new() should use EMPTY_TO_MINSIZE (unless they have
- an excellent reason not to).
+/* Use (2n+1)/3 rather than 2n+3 because: it makes no difference for
+ * combined tables (the two fractions round to the same number n < ),
+ * but 2*4/3 is 2 whereas (2*4+1)/3 is 3 which potentially saves quite
+ * a lot of space for small, split tables */
+#define USABLE_FRACTION(n) ((((n) << 1)+1)/3)
+
+/* Alternative fraction that is otherwise close enough to (2n+1)/3 to make
+ * little difference. 8 * 2/3 == 8 * 5/8 == 5. 16 * 2/3 == 16 * 5/8 == 10.
+ * 32 * 2/3 = 21, 32 * 5/8 = 20.
+ * Its advantage is that it is faster to compute on machines with slow division.
+ * #define USABLE_FRACTION(n) (((n) >> 1) + ((n) >> 2) - ((n) >> 3))
*/
-#define INIT_NONZERO_DICT_SLOTS(mp) do { \
- (mp)->ma_table = (mp)->ma_smalltable; \
- (mp)->ma_mask = PyDict_MINSIZE - 1; \
- } while(0)
+/* GROWTH_RATE. Growth rate upon hitting maximum load. Currently set to *2.
+ * Raising this to *4 doubles memory consumption depending on the size of
+ * the dictionary, but results in half the number of resizes, less effort to
+ * resize and better sparseness for some (but not all dict sizes).
+ * Setting to *4 eliminates every other resize step.
+ * GROWTH_RATE was set to *4 up to version 3.2.
+ */
+#define GROWTH_RATE(x) ((x) * 2)
-#define EMPTY_TO_MINSIZE(mp) do { \
- memset((mp)->ma_smalltable, 0, sizeof((mp)->ma_smalltable)); \
- (mp)->ma_used = (mp)->ma_fill = 0; \
- INIT_NONZERO_DICT_SLOTS(mp); \
- } while(0)
+#define ENSURE_ALLOWS_DELETIONS(d) \
+ if ((d)->ma_keys->dk_lookup == lookdict_unicode_nodummy) { \
+ (d)->ma_keys->dk_lookup = lookdict_unicode; \
+ }
-/* Dictionary reuse scheme to save calls to malloc, free, and memset */
-#ifndef PyDict_MAXFREELIST
-#define PyDict_MAXFREELIST 80
-#endif
-static PyDictObject *free_list[PyDict_MAXFREELIST];
-static int numfree = 0;
+/* This immutable, empty PyDictKeysObject is used for PyDict_Clear()
+ * (which cannot fail and thus can do no allocation).
+ */
+static PyDictKeysObject empty_keys_struct = {
+ 2, /* dk_refcnt 1 for this struct, 1 for dummy_struct */
+ 1, /* dk_size */
+ lookdict_split, /* dk_lookup */
+ 0, /* dk_usable (immutable) */
+ {
+ { 0, 0, 0 } /* dk_entries (empty) */
+ }
+};
-void
-PyDict_Fini(void)
+static PyObject *empty_values[1] = { NULL };
+
+#define Py_EMPTY_KEYS &empty_keys_struct
+
+static PyDictKeysObject *new_keys_object(Py_ssize_t size)
{
- PyDictObject *op;
+ PyDictKeysObject *dk;
+ Py_ssize_t i;
+ PyDictKeyEntry *ep0;
- while (numfree) {
- op = free_list[--numfree];
- assert(PyDict_CheckExact(op));
- PyObject_GC_Del(op);
+ assert(size >= PyDict_MINSIZE_SPLIT);
+ assert(IS_POWER_OF_2(size));
+ dk = PyMem_MALLOC(sizeof(PyDictKeysObject) +
+ sizeof(PyDictKeyEntry) * (size-1));
+ if (dk == NULL) {
+ PyErr_NoMemory();
+ return NULL;
}
+ DK_DEBUG_INCREF dk->dk_refcnt = 1;
+ dk->dk_size = size;
+ dk->dk_usable = USABLE_FRACTION(size);
+ ep0 = &dk->dk_entries[0];
+ /* Hash value of slot 0 is used by popitem, so it must be initialized */
+ ep0->me_hash = 0;
+ for (i = 0; i < size; i++) {
+ ep0[i].me_key = NULL;
+ ep0[i].me_value = NULL;
+ }
+ dk->dk_lookup = lookdict_unicode_nodummy;
+ return dk;
}
-PyObject *
-PyDict_New(void)
+static void
+free_keys_object(PyDictKeysObject *keys)
{
- register PyDictObject *mp;
- if (dummy == NULL) { /* Auto-initialize dummy */
- dummy = PyUnicode_FromString("<dummy key>");
- if (dummy == NULL)
- return NULL;
-#ifdef SHOW_CONVERSION_COUNTS
- Py_AtExit(show_counts);
-#endif
-#ifdef SHOW_ALLOC_COUNT
- Py_AtExit(show_alloc);
-#endif
-#ifdef SHOW_TRACK_COUNT
- Py_AtExit(show_track);
-#endif
+ PyDictKeyEntry *entries = &keys->dk_entries[0];
+ Py_ssize_t i, n;
+ for (i = 0, n = DK_SIZE(keys); i < n; i++) {
+ Py_XDECREF(entries[i].me_key);
+ Py_XDECREF(entries[i].me_value);
}
+ PyMem_FREE(keys);
+}
+
+#define new_values(size) PyMem_NEW(PyObject *, size)
+
+#define free_values(values) PyMem_FREE(values)
+
+/* Consumes a reference to the keys object */
+static PyObject *
+new_dict(PyDictKeysObject *keys, PyObject **values)
+{
+ PyDictObject *mp;
if (numfree) {
mp = free_list[--numfree];
assert (mp != NULL);
assert (Py_TYPE(mp) == &PyDict_Type);
_Py_NewReference((PyObject *)mp);
- if (mp->ma_fill) {
- EMPTY_TO_MINSIZE(mp);
- } else {
- /* At least set ma_table and ma_mask; these are wrong
- if an empty but presized dict is added to freelist */
- INIT_NONZERO_DICT_SLOTS(mp);
- }
- assert (mp->ma_used == 0);
- assert (mp->ma_table == mp->ma_smalltable);
- assert (mp->ma_mask == PyDict_MINSIZE - 1);
-#ifdef SHOW_ALLOC_COUNT
- count_reuse++;
-#endif
- } else {
+ }
+ else {
mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
- if (mp == NULL)
+ if (mp == NULL) {
+ DK_DECREF(keys);
+ free_values(values);
return NULL;
- EMPTY_TO_MINSIZE(mp);
-#ifdef SHOW_ALLOC_COUNT
- count_alloc++;
-#endif
+ }
}
- mp->ma_lookup = lookdict_unicode;
-#ifdef SHOW_TRACK_COUNT
- count_untracked++;
-#endif
-#ifdef SHOW_CONVERSION_COUNTS
- ++created;
-#endif
+ mp->ma_keys = keys;
+ mp->ma_values = values;
+ mp->ma_used = 0;
return (PyObject *)mp;
}
+/* Consumes a reference to the keys object */
+static PyObject *
+new_dict_with_shared_keys(PyDictKeysObject *keys)
+{
+ PyObject **values;
+ Py_ssize_t i, size;
+
+ size = DK_SIZE(keys);
+ values = new_values(size);
+ if (values == NULL) {
+ DK_DECREF(keys);
+ return PyErr_NoMemory();
+ }
+ for (i = 0; i < size; i++) {
+ values[i] = NULL;
+ }
+ return new_dict(keys, values);
+}
+
+PyObject *
+PyDict_New(void)
+{
+ return new_dict(new_keys_object(PyDict_MINSIZE_COMBINED), NULL);
+}
+
/*
The basic lookup function used by all operations.
This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4.
@@ -302,29 +448,35 @@ Christian Tismer.
lookdict() is general-purpose, and may return NULL if (and only if) a
comparison raises an exception (this was new in Python 2.5).
lookdict_unicode() below is specialized to string keys, comparison of which can
-never raise an exception; that function can never return NULL. For both, when
-the key isn't found a PyDictEntry* is returned for which the me_value field is
-NULL; this is the slot in the dict at which the key would have been found, and
-the caller can (if it wishes) add the <key, value> pair to the returned
-PyDictEntry*.
+never raise an exception; that function can never return NULL.
+lookdict_unicode_nodummy is further specialized for string keys that cannot be
+the <dummy> value.
+For both, when the key isn't found a PyDictEntry* is returned
+where the key would have been found, *value_addr points to the matching value
+slot.
*/
-static PyDictEntry *
-lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
+static PyDictKeyEntry *
+lookdict(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr)
{
register size_t i;
register size_t perturb;
- register PyDictEntry *freeslot;
- register size_t mask = (size_t)mp->ma_mask;
- PyDictEntry *ep0 = mp->ma_table;
- register PyDictEntry *ep;
+ register PyDictKeyEntry *freeslot;
+ register size_t mask;
+ PyDictKeyEntry *ep0;
+ register PyDictKeyEntry *ep;
register int cmp;
PyObject *startkey;
+top:
+ mask = DK_MASK(mp->ma_keys);
+ ep0 = &mp->ma_keys->dk_entries[0];
i = (size_t)hash & mask;
ep = &ep0[i];
- if (ep->me_key == NULL || ep->me_key == key)
+ if (ep->me_key == NULL || ep->me_key == key) {
+ *value_addr = &ep->me_value;
return ep;
-
+ }
if (ep->me_key == dummy)
freeslot = ep;
else {
@@ -335,17 +487,15 @@ lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
Py_DECREF(startkey);
if (cmp < 0)
return NULL;
- if (ep0 == mp->ma_table && ep->me_key == startkey) {
- if (cmp > 0)
+ if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
+ if (cmp > 0) {
+ *value_addr = &ep->me_value;
return ep;
+ }
}
else {
- /* The compare did major nasty stuff to the
- * dict: start over.
- * XXX A clever adversary could prevent this
- * XXX from terminating.
- */
- return lookdict(mp, key, hash);
+ /* The dict was mutated, restart */
+ goto top;
}
}
freeslot = NULL;
@@ -356,28 +506,37 @@ lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
i = (i << 2) + i + perturb + 1;
ep = &ep0[i & mask];
- if (ep->me_key == NULL)
- return freeslot == NULL ? ep : freeslot;
- if (ep->me_key == key)
+ if (ep->me_key == NULL) {
+ if (freeslot == NULL) {
+ *value_addr = &ep->me_value;
+ return ep;
+ } else {
+ *value_addr = &freeslot->me_value;
+ return freeslot;
+ }
+ }
+ if (ep->me_key == key) {
+ *value_addr = &ep->me_value;
return ep;
+ }
if (ep->me_hash == hash && ep->me_key != dummy) {
startkey = ep->me_key;
Py_INCREF(startkey);
cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
Py_DECREF(startkey);
- if (cmp < 0)
+ if (cmp < 0) {
+ *value_addr = NULL;
return NULL;
- if (ep0 == mp->ma_table && ep->me_key == startkey) {
- if (cmp > 0)
+ }
+ if (ep0 == mp->ma_keys->dk_entries && ep->me_key == startkey) {
+ if (cmp > 0) {
+ *value_addr = &ep->me_value;
return ep;
+ }
}
else {
- /* The compare did major nasty stuff to the
- * dict: start over.
- * XXX A clever adversary could prevent this
- * XXX from terminating.
- */
- return lookdict(mp, key, hash);
+ /* The dict was mutated, restart */
+ goto top;
}
}
else if (ep->me_key == dummy && freeslot == NULL)
@@ -387,46 +546,39 @@ lookdict(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
return 0;
}
-/*
- * Hacked up version of lookdict which can assume keys are always
- * unicodes; this assumption allows testing for errors during
- * PyObject_RichCompareBool() to be dropped; unicode-unicode
- * comparisons never raise exceptions. This also means we don't need
- * to go through PyObject_RichCompareBool(); we can always use
- * unicode_eq() directly.
- *
- * This is valuable because dicts with only unicode keys are very common.
- */
-static PyDictEntry *
-lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
+/* Specialized version for string-only keys */
+static PyDictKeyEntry *
+lookdict_unicode(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr)
{
register size_t i;
register size_t perturb;
- register PyDictEntry *freeslot;
- register size_t mask = (size_t)mp->ma_mask;
- PyDictEntry *ep0 = mp->ma_table;
- register PyDictEntry *ep;
+ register PyDictKeyEntry *freeslot;
+ register size_t mask = DK_MASK(mp->ma_keys);
+ PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
+ register PyDictKeyEntry *ep;
/* Make sure this function doesn't have to handle non-unicode keys,
including subclasses of str; e.g., one reason to subclass
unicodes is to override __eq__, and for speed we don't cater to
that here. */
if (!PyUnicode_CheckExact(key)) {
-#ifdef SHOW_CONVERSION_COUNTS
- ++converted;
-#endif
- mp->ma_lookup = lookdict;
- return lookdict(mp, key, hash);
+ mp->ma_keys->dk_lookup = lookdict;
+ return lookdict(mp, key, hash, value_addr);
}
- i = hash & mask;
+ i = (size_t)hash & mask;
ep = &ep0[i];
- if (ep->me_key == NULL || ep->me_key == key)
+ if (ep->me_key == NULL || ep->me_key == key) {
+ *value_addr = &ep->me_value;
return ep;
+ }
if (ep->me_key == dummy)
freeslot = ep;
else {
- if (ep->me_hash == hash && unicode_eq(ep->me_key, key))
+ if (ep->me_hash == hash && unicode_eq(ep->me_key, key)) {
+ *value_addr = &ep->me_value;
return ep;
+ }
freeslot = NULL;
}
@@ -435,13 +587,22 @@ lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
i = (i << 2) + i + perturb + 1;
ep = &ep0[i & mask];
- if (ep->me_key == NULL)
- return freeslot == NULL ? ep : freeslot;
+ if (ep->me_key == NULL) {
+ if (freeslot == NULL) {
+ *value_addr = &ep->me_value;
+ return ep;
+ } else {
+ *value_addr = &freeslot->me_value;
+ return freeslot;
+ }
+ }
if (ep->me_key == key
|| (ep->me_hash == hash
&& ep->me_key != dummy
- && unicode_eq(ep->me_key, key)))
+ && unicode_eq(ep->me_key, key))) {
+ *value_addr = &ep->me_value;
return ep;
+ }
if (ep->me_key == dummy && freeslot == NULL)
freeslot = ep;
}
@@ -449,6 +610,92 @@ lookdict_unicode(PyDictObject *mp, PyObject *key, register Py_hash_t hash)
return 0;
}
+/* Faster version of lookdict_unicode when it is known that no <dummy> keys
+ * will be present. */
+static PyDictKeyEntry *
+lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr)
+{
+ register size_t i;
+ register size_t perturb;
+ register size_t mask = DK_MASK(mp->ma_keys);
+ PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
+ register PyDictKeyEntry *ep;
+
+ /* Make sure this function doesn't have to handle non-unicode keys,
+ including subclasses of str; e.g., one reason to subclass
+ unicodes is to override __eq__, and for speed we don't cater to
+ that here. */
+ if (!PyUnicode_CheckExact(key)) {
+ mp->ma_keys->dk_lookup = lookdict;
+ return lookdict(mp, key, hash, value_addr);
+ }
+ i = (size_t)hash & mask;
+ ep = &ep0[i];
+ assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ if (ep->me_key == NULL || ep->me_key == key ||
+ (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
+ *value_addr = &ep->me_value;
+ return ep;
+ }
+ for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
+ i = (i << 2) + i + perturb + 1;
+ ep = &ep0[i & mask];
+ assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ if (ep->me_key == NULL || ep->me_key == key ||
+ (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
+ *value_addr = &ep->me_value;
+ return ep;
+ }
+ }
+ assert(0); /* NOT REACHED */
+ return 0;
+}
+
+/* Version of lookdict for split tables.
+ * All split tables and only split tables use this lookup function.
+ * Split tables only contain unicode keys and no dummy keys,
+ * so algorithm is the same as lookdict_unicode_nodummy.
+ */
+static PyDictKeyEntry *
+lookdict_split(PyDictObject *mp, PyObject *key,
+ Py_hash_t hash, PyObject ***value_addr)
+{
+ register size_t i;
+ register size_t perturb;
+ register size_t mask = DK_MASK(mp->ma_keys);
+ PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
+ register PyDictKeyEntry *ep;
+
+ if (!PyUnicode_CheckExact(key)) {
+ ep = lookdict(mp, key, hash, value_addr);
+ /* lookdict expects a combined-table, so fix value_addr */
+ i = ep - ep0;
+ *value_addr = &mp->ma_values[i];
+ return ep;
+ }
+ i = (size_t)hash & mask;
+ ep = &ep0[i];
+ assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ if (ep->me_key == NULL || ep->me_key == key ||
+ (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
+ *value_addr = &mp->ma_values[i];
+ return ep;
+ }
+ for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
+ i = (i << 2) + i + perturb + 1;
+ ep = &ep0[i & mask];
+ assert(ep->me_key == NULL || PyUnicode_CheckExact(ep->me_key));
+ if (ep->me_key == NULL || ep->me_key == key ||
+ (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {
+ *value_addr = &mp->ma_values[i & mask];
+ return ep;
+ }
+ }
+ assert(0); /* NOT REACHED */
+ return 0;
+}
+
int
_PyDict_HasOnlyStringKeys(PyObject *dict)
{
@@ -456,7 +703,7 @@ _PyDict_HasOnlyStringKeys(PyObject *dict)
PyObject *key, *value;
assert(PyDict_Check(dict));
/* Shortcut */
- if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
+ if (((PyDictObject *)dict)->ma_keys->dk_lookup != lookdict)
return 1;
while (PyDict_Next(dict, &pos, &key, &value))
if (!PyUnicode_Check(key))
@@ -464,23 +711,12 @@ _PyDict_HasOnlyStringKeys(PyObject *dict)
return 1;
}
-#ifdef SHOW_TRACK_COUNT
-#define INCREASE_TRACK_COUNT \
- (count_tracked++, count_untracked--);
-#define DECREASE_TRACK_COUNT \
- (count_tracked--, count_untracked++);
-#else
-#define INCREASE_TRACK_COUNT
-#define DECREASE_TRACK_COUNT
-#endif
-
#define MAINTAIN_TRACKING(mp, key, value) \
do { \
if (!_PyObject_GC_IS_TRACKED(mp)) { \
if (_PyObject_GC_MAY_BE_TRACKED(key) || \
_PyObject_GC_MAY_BE_TRACKED(value)) { \
_PyObject_GC_TRACK(mp); \
- INCREASE_TRACK_COUNT \
} \
} \
} while(0)
@@ -490,78 +726,136 @@ _PyDict_MaybeUntrack(PyObject *op)
{
PyDictObject *mp;
PyObject *value;
- Py_ssize_t mask, i;
- PyDictEntry *ep;
+ Py_ssize_t i, size;
if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
return;
mp = (PyDictObject *) op;
- ep = mp->ma_table;
- mask = mp->ma_mask;
- for (i = 0; i <= mask; i++) {
- if ((value = ep[i].me_value) == NULL)
- continue;
- if (_PyObject_GC_MAY_BE_TRACKED(value) ||
- _PyObject_GC_MAY_BE_TRACKED(ep[i].me_key))
- return;
- }
- DECREASE_TRACK_COUNT
- _PyObject_GC_UNTRACK(op);
-}
-
-/*
-Internal routine to insert a new item into the table when you have entry object.
-Used by insertdict.
-*/
-static int
-insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
- PyDictEntry *ep, PyObject *value)
-{
- PyObject *old_value;
-
- MAINTAIN_TRACKING(mp, key, value);
- if (ep->me_value != NULL) {
- old_value = ep->me_value;
- ep->me_value = value;
- Py_DECREF(old_value); /* which **CAN** re-enter */
- Py_DECREF(key);
+ size = DK_SIZE(mp->ma_keys);
+ if (_PyDict_HasSplitTable(mp)) {
+ for (i = 0; i < size; i++) {
+ if ((value = mp->ma_values[i]) == NULL)
+ continue;
+ if (_PyObject_GC_MAY_BE_TRACKED(value)) {
+ assert(!_PyObject_GC_MAY_BE_TRACKED(
+ mp->ma_keys->dk_entries[i].me_key));
+ return;
+ }
+ }
}
else {
- if (ep->me_key == NULL)
- mp->ma_fill++;
- else {
- assert(ep->me_key == dummy);
- Py_DECREF(dummy);
+ PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
+ for (i = 0; i < size; i++) {
+ if ((value = ep0[i].me_value) == NULL)
+ continue;
+ if (_PyObject_GC_MAY_BE_TRACKED(value) ||
+ _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key))
+ return;
}
- ep->me_key = key;
- ep->me_hash = hash;
- ep->me_value = value;
- mp->ma_used++;
}
- return 0;
+ _PyObject_GC_UNTRACK(op);
+}
+
+/* Internal function to find slot for an item from its hash
+ * when it is known that the key is not present in the dict.
+ */
+static PyDictKeyEntry *
+find_empty_slot(PyDictObject *mp, PyObject *key, Py_hash_t hash,
+ PyObject ***value_addr)
+{
+ size_t i;
+ size_t perturb;
+ size_t mask = DK_MASK(mp->ma_keys);
+ PyDictKeyEntry *ep0 = &mp->ma_keys->dk_entries[0];
+ PyDictKeyEntry *ep;
+
+ assert(key != NULL);
+ if (!PyUnicode_CheckExact(key))
+ mp->ma_keys->dk_lookup = lookdict;
+ i = hash & mask;
+ ep = &ep0[i];
+ for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
+ i = (i << 2) + i + perturb + 1;
+ ep = &ep0[i & mask];
+ }
+ assert(ep->me_value == NULL);
+ if (mp->ma_values)
+ *value_addr = &mp->ma_values[i & mask];
+ else
+ *value_addr = &ep->me_value;
+ return ep;
}
+static int
+insertion_resize(PyDictObject *mp)
+{
+ return dictresize(mp, GROWTH_RATE(mp->ma_used));
+}
/*
Internal routine to insert a new item into the table.
Used both by the internal resize routine and by the public insert routine.
-Eats a reference to key and one to value.
Returns -1 if an error occurred, or 0 on success.
*/
static int
-insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
+insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
{
- register PyDictEntry *ep;
+ PyObject *old_value;
+ PyObject **value_addr;
+ PyDictKeyEntry *ep;
+ assert(key != dummy);
- assert(mp->ma_lookup != NULL);
- ep = mp->ma_lookup(mp, key, hash);
+ if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
+ if (insertion_resize(mp) < 0)
+ return -1;
+ }
+
+ ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr);
if (ep == NULL) {
- Py_DECREF(key);
- Py_DECREF(value);
return -1;
}
- return insertdict_by_entry(mp, key, hash, ep, value);
+ Py_INCREF(value);
+ MAINTAIN_TRACKING(mp, key, value);
+ old_value = *value_addr;
+ if (old_value != NULL) {
+ assert(ep->me_key != NULL && ep->me_key != dummy);
+ *value_addr = value;
+ Py_DECREF(old_value); /* which **CAN** re-enter */
+ }
+ else {
+ if (ep->me_key == NULL) {
+ Py_INCREF(key);
+ if (mp->ma_keys->dk_usable <= 0) {
+ /* Need to resize. */
+ if (insertion_resize(mp) < 0) {
+ Py_DECREF(key);
+ Py_DECREF(value);
+ return -1;
+ }
+ ep = find_empty_slot(mp, key, hash, &value_addr);
+ }
+ mp->ma_keys->dk_usable--;
+ assert(mp->ma_keys->dk_usable >= 0);
+ ep->me_key = key;
+ ep->me_hash = hash;
+ }
+ else {
+ if (ep->me_key == dummy) {
+ Py_INCREF(key);
+ ep->me_key = key;
+ ep->me_hash = hash;
+ Py_DECREF(dummy);
+ } else {
+ assert(_PyDict_HasSplitTable(mp));
+ }
+ }
+ mp->ma_used++;
+ *value_addr = value;
+ }
+ assert(ep->me_key != NULL && ep->me_key != dummy);
+ assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
+ return 0;
}
/*
@@ -571,18 +865,25 @@ the dict contains no deleted entries. Besides the performance benefit,
using insertdict() in dictresize() is dangerous (SF bug #1456209).
Note that no refcounts are changed by this routine; if needed, the caller
is responsible for incref'ing `key` and `value`.
+Neither mp->ma_used nor k->dk_usable are modified by this routine; the caller
+must set them correctly
*/
static void
-insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
+insertdict_clean(PyDictObject *mp, PyObject *key, Py_hash_t hash,
PyObject *value)
{
- register size_t i;
- register size_t perturb;
- register size_t mask = (size_t)mp->ma_mask;
- PyDictEntry *ep0 = mp->ma_table;
- register PyDictEntry *ep;
-
- MAINTAIN_TRACKING(mp, key, value);
+ size_t i;
+ size_t perturb;
+ PyDictKeysObject *k = mp->ma_keys;
+ size_t mask = (size_t)DK_SIZE(k)-1;
+ PyDictKeyEntry *ep0 = &k->dk_entries[0];
+ PyDictKeyEntry *ep;
+
+ assert(k->dk_lookup != NULL);
+ assert(value != NULL);
+ assert(key != NULL);
+ assert(key != dummy);
+ assert(PyUnicode_CheckExact(key) || k->dk_lookup == lookdict);
i = hash & mask;
ep = &ep0[i];
for (perturb = hash; ep->me_key != NULL; perturb >>= PERTURB_SHIFT) {
@@ -590,31 +891,31 @@ insertdict_clean(register PyDictObject *mp, PyObject *key, Py_hash_t hash,
ep = &ep0[i & mask];
}
assert(ep->me_value == NULL);
- mp->ma_fill++;
ep->me_key = key;
ep->me_hash = hash;
ep->me_value = value;
- mp->ma_used++;
}
/*
Restructure the table by allocating a new table and reinserting all
items again. When entries have been deleted, the new table may
actually be smaller than the old one.
+If a table is split (its keys and hashes are shared, its values are not),
+then the values are temporarily copied into the table, it is resized as
+a combined table, then the me_value slots in the old table are NULLed out.
+After resizing a table is always combined,
+but can be resplit by make_keys_shared().
*/
static int
dictresize(PyDictObject *mp, Py_ssize_t minused)
{
Py_ssize_t newsize;
- PyDictEntry *oldtable, *newtable, *ep;
- Py_ssize_t i;
- int is_oldtable_malloced;
- PyDictEntry small_copy[PyDict_MINSIZE];
+ PyDictKeysObject *oldkeys;
+ PyObject **oldvalues;
+ Py_ssize_t i, oldsize;
- assert(minused >= 0);
-
- /* Find the smallest table size > minused. */
- for (newsize = PyDict_MINSIZE;
+/* Find the smallest table size > minused. */
+ for (newsize = PyDict_MINSIZE_COMBINED;
newsize <= minused && newsize > 0;
newsize <<= 1)
;
@@ -622,83 +923,125 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
PyErr_NoMemory();
return -1;
}
-
- /* Get space for a new table. */
- oldtable = mp->ma_table;
- assert(oldtable != NULL);
- is_oldtable_malloced = oldtable != mp->ma_smalltable;
-
- if (newsize == PyDict_MINSIZE) {
- /* A large table is shrinking, or we can't get any smaller. */
- newtable = mp->ma_smalltable;
- if (newtable == oldtable) {
- if (mp->ma_fill == mp->ma_used) {
- /* No dummies, so no point doing anything. */
- return 0;
+ oldkeys = mp->ma_keys;
+ oldvalues = mp->ma_values;
+ /* Allocate a new table. */
+ mp->ma_keys = new_keys_object(newsize);
+ if (mp->ma_keys == NULL) {
+ mp->ma_keys = oldkeys;
+ return -1;
+ }
+ if (oldkeys->dk_lookup == lookdict)
+ mp->ma_keys->dk_lookup = lookdict;
+ oldsize = DK_SIZE(oldkeys);
+ mp->ma_values = NULL;
+ /* If empty then nothing to copy so just return */
+ if (oldsize == 1) {
+ assert(oldkeys == Py_EMPTY_KEYS);
+ DK_DECREF(oldkeys);
+ return 0;
+ }
+ /* Main loop below assumes we can transfer refcount to new keys
+ * and that value is stored in me_value.
+ * Increment ref-counts and copy values here to compensate
+ * This (resizing a split table) should be relatively rare */
+ if (oldvalues != NULL) {
+ for (i = 0; i < oldsize; i++) {
+ if (oldvalues[i] != NULL) {
+ Py_INCREF(oldkeys->dk_entries[i].me_key);
+ oldkeys->dk_entries[i].me_value = oldvalues[i];
}
- /* We're not going to resize it, but rebuild the
- table anyway to purge old dummy entries.
- Subtle: This is *necessary* if fill==size,
- as lookdict needs at least one virgin slot to
- terminate failing searches. If fill < size, it's
- merely desirable, as dummies slow searches. */
- assert(mp->ma_fill > mp->ma_used);
- memcpy(small_copy, oldtable, sizeof(small_copy));
- oldtable = small_copy;
}
}
+ /* Main loop */
+ for (i = 0; i < oldsize; i++) {
+ PyDictKeyEntry *ep = &oldkeys->dk_entries[i];
+ if (ep->me_value != NULL) {
+ assert(ep->me_key != dummy);
+ insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
+ }
+ }
+ mp->ma_keys->dk_usable -= mp->ma_used;
+ if (oldvalues != NULL) {
+ /* NULL out me_value slot in oldkeys, in case it was shared */
+ for (i = 0; i < oldsize; i++)
+ oldkeys->dk_entries[i].me_value = NULL;
+ assert(oldvalues != empty_values);
+ free_values(oldvalues);
+ DK_DECREF(oldkeys);
+ }
else {
- newtable = PyMem_NEW(PyDictEntry, newsize);
- if (newtable == NULL) {
- PyErr_NoMemory();
- return -1;
+ assert(oldkeys->dk_lookup != lookdict_split);
+ if (oldkeys->dk_lookup != lookdict_unicode_nodummy) {
+ PyDictKeyEntry *ep0 = &oldkeys->dk_entries[0];
+ for (i = 0; i < oldsize; i++) {
+ if (ep0[i].me_key == dummy)
+ Py_DECREF(dummy);
+ }
}
+ assert(oldkeys->dk_refcnt == 1);
+ DK_DEBUG_DECREF PyMem_FREE(oldkeys);
}
+ return 0;
+}
- /* Make the dict empty, using the new table. */
- assert(newtable != oldtable);
- mp->ma_table = newtable;
- mp->ma_mask = newsize - 1;
- memset(newtable, 0, sizeof(PyDictEntry) * newsize);
- mp->ma_used = 0;
- i = mp->ma_fill;
- mp->ma_fill = 0;
-
- /* Copy the data over; this is refcount-neutral for active entries;
- dummy entries aren't copied over, of course */
- for (ep = oldtable; i > 0; ep++) {
- if (ep->me_value != NULL) { /* active entry */
- --i;
- insertdict_clean(mp, ep->me_key, ep->me_hash, ep->me_value);
+/* Returns NULL if unable to split table.
+ * A NULL return does not necessarily indicate an error */
+static PyDictKeysObject *
+make_keys_shared(PyObject *op)
+{
+ Py_ssize_t i;
+ Py_ssize_t size;
+ PyDictObject *mp = (PyDictObject *)op;
+
+ if (!PyDict_CheckExact(op))
+ return NULL;
+ if (!_PyDict_HasSplitTable(mp)) {
+ PyDictKeyEntry *ep0;
+ PyObject **values;
+ assert(mp->ma_keys->dk_refcnt == 1);
+ if (mp->ma_keys->dk_lookup == lookdict) {
+ return NULL;
}
- else if (ep->me_key != NULL) { /* dummy entry */
- --i;
- assert(ep->me_key == dummy);
- Py_DECREF(ep->me_key);
+ else if (mp->ma_keys->dk_lookup == lookdict_unicode) {
+ /* Remove dummy keys */
+ if (dictresize(mp, DK_SIZE(mp->ma_keys)))
+ return NULL;
}
- /* else key == value == NULL: nothing to do */
+ assert(mp->ma_keys->dk_lookup == lookdict_unicode_nodummy);
+ /* Copy values into a new array */
+ ep0 = &mp->ma_keys->dk_entries[0];
+ size = DK_SIZE(mp->ma_keys);
+ values = new_values(size);
+ if (values == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Not enough memory to allocate new values array");
+ return NULL;
+ }
+ for (i = 0; i < size; i++) {
+ values[i] = ep0[i].me_value;
+ ep0[i].me_value = NULL;
+ }
+ mp->ma_keys->dk_lookup = lookdict_split;
+ mp->ma_values = values;
}
-
- if (is_oldtable_malloced)
- PyMem_DEL(oldtable);
- return 0;
+ DK_INCREF(mp->ma_keys);
+ return mp->ma_keys;
}
-/* Create a new dictionary pre-sized to hold an estimated number of elements.
- Underestimates are okay because the dictionary will resize as necessary.
- Overestimates just mean the dictionary will be more sparse than usual.
-*/
-
PyObject *
_PyDict_NewPresized(Py_ssize_t minused)
{
- PyObject *op = PyDict_New();
-
- if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
- Py_DECREF(op);
+ Py_ssize_t newsize;
+ PyDictKeysObject *new_keys;
+ for (newsize = PyDict_MINSIZE_COMBINED;
+ newsize <= minused && newsize > 0;
+ newsize <<= 1)
+ ;
+ new_keys = new_keys_object(newsize);
+ if (new_keys == NULL)
return NULL;
- }
- return op;
+ return new_dict(new_keys, NULL);
}
/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
@@ -716,12 +1059,14 @@ PyDict_GetItem(PyObject *op, PyObject *key)
{
Py_hash_t hash;
PyDictObject *mp = (PyDictObject *)op;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
PyThreadState *tstate;
+ PyObject **value_addr;
+
if (!PyDict_Check(op))
return NULL;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1)
+ (hash = ((PyASCIIObject *) key)->hash) == -1)
{
hash = PyObject_Hash(key);
if (hash == -1) {
@@ -741,20 +1086,20 @@ PyDict_GetItem(PyObject *op, PyObject *key)
/* preserve the existing exception */
PyObject *err_type, *err_value, *err_tb;
PyErr_Fetch(&err_type, &err_value, &err_tb);
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
/* ignore errors */
PyErr_Restore(err_type, err_value, err_tb);
if (ep == NULL)
return NULL;
}
else {
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL) {
PyErr_Clear();
return NULL;
}
}
- return ep->me_value;
+ return *value_addr;
}
/* Variant of PyDict_GetItem() that doesn't suppress exceptions.
@@ -766,14 +1111,15 @@ PyDict_GetItemWithError(PyObject *op, PyObject *key)
{
Py_hash_t hash;
PyDictObject*mp = (PyDictObject *)op;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if (!PyDict_Check(op)) {
PyErr_BadInternalCall();
return NULL;
}
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1)
+ (hash = ((PyASCIIObject *) key)->hash) == -1)
{
hash = PyObject_Hash(key);
if (hash == -1) {
@@ -781,49 +1127,55 @@ PyDict_GetItemWithError(PyObject *op, PyObject *key)
}
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- return ep->me_value;
+ return *value_addr;
}
-static int
-dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key,
- Py_hash_t hash, PyDictEntry *ep, PyObject *value)
+PyObject *
+_PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key)
{
- register PyDictObject *mp;
- register Py_ssize_t n_used;
+ PyObject *kv;
+ kv = _PyUnicode_FromId(key); /* borrowed */
+ if (kv == NULL)
+ return NULL;
+ return PyDict_GetItemWithError(dp, kv);
+}
- mp = (PyDictObject *)op;
- assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */
- n_used = mp->ma_used;
- Py_INCREF(value);
- Py_INCREF(key);
- if (ep == NULL) {
- if (insertdict(mp, key, hash, value) != 0)
- return -1;
- }
- else {
- if (insertdict_by_entry(mp, key, hash, ep, value) != 0)
- return -1;
+/* Fast version of global value lookup.
+ * Lookup in globals, then builtins.
+ */
+PyObject *
+_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
+{
+ PyObject *x;
+ if (PyUnicode_CheckExact(key)) {
+ PyObject **value_addr;
+ Py_hash_t hash = ((PyASCIIObject *)key)->hash;
+ if (hash != -1) {
+ PyDictKeyEntry *e;
+ e = globals->ma_keys->dk_lookup(globals, key, hash, &value_addr);
+ if (e == NULL) {
+ return NULL;
+ }
+ x = *value_addr;
+ if (x != NULL)
+ return x;
+ e = builtins->ma_keys->dk_lookup(builtins, key, hash, &value_addr);
+ if (e == NULL) {
+ return NULL;
+ }
+ x = *value_addr;
+ return x;
+ }
}
- /* If we added a key, we can safely resize. Otherwise just return!
- * If fill >= 2/3 size, adjust size. Normally, this doubles or
- * quaduples the size, but it's also possible for the dict to shrink
- * (if ma_fill is much larger than ma_used, meaning a lot of dict
- * keys have been * deleted).
- *
- * Quadrupling the size improves average dictionary sparseness
- * (reducing collisions) at the cost of some memory and iteration
- * speed (which loops over every possible entry). It also halves
- * the number of expensive resize operations in a growing dictionary.
- *
- * Very large dictionaries (over 50K items) use doubling instead.
- * This may help applications with severe memory constraints.
- */
- if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
- return 0;
- return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);
+ x = PyDict_GetItemWithError((PyObject *)globals, key);
+ if (x != NULL)
+ return x;
+ if (PyErr_Occurred())
+ return NULL;
+ return PyDict_GetItemWithError((PyObject *)builtins, key);
}
/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
@@ -833,36 +1185,37 @@ dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key,
* remove them.
*/
int
-PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value)
+PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
{
- register Py_hash_t hash;
-
+ PyDictObject *mp;
+ Py_hash_t hash;
if (!PyDict_Check(op)) {
PyErr_BadInternalCall();
return -1;
}
assert(key);
assert(value);
- if (PyUnicode_CheckExact(key)) {
- hash = ((PyUnicodeObject *) key)->hash;
- if (hash == -1)
- hash = PyObject_Hash(key);
- }
- else {
+ mp = (PyDictObject *)op;
+ if (!PyUnicode_CheckExact(key) ||
+ (hash = ((PyASCIIObject *) key)->hash) == -1)
+ {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
}
- return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value);
+
+ /* insertdict() handles any resizing that might be necessary */
+ return insertdict(mp, key, hash, value);
}
int
PyDict_DelItem(PyObject *op, PyObject *key)
{
- register PyDictObject *mp;
- register Py_hash_t hash;
- register PyDictEntry *ep;
- PyObject *old_value, *old_key;
+ PyDictObject *mp;
+ Py_hash_t hash;
+ PyDictKeyEntry *ep;
+ PyObject *old_key, *old_value;
+ PyObject **value_addr;
if (!PyDict_Check(op)) {
PyErr_BadInternalCall();
@@ -870,27 +1223,30 @@ PyDict_DelItem(PyObject *op, PyObject *key)
}
assert(key);
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
}
mp = (PyDictObject *)op;
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return -1;
- if (ep->me_value == NULL) {
+ if (*value_addr == NULL) {
set_key_error(key);
return -1;
}
- old_key = ep->me_key;
- Py_INCREF(dummy);
- ep->me_key = dummy;
- old_value = ep->me_value;
- ep->me_value = NULL;
+ old_value = *value_addr;
+ *value_addr = NULL;
mp->ma_used--;
+ if (!_PyDict_HasSplitTable(mp)) {
+ ENSURE_ALLOWS_DELETIONS(mp);
+ old_key = ep->me_key;
+ Py_INCREF(dummy);
+ ep->me_key = dummy;
+ Py_DECREF(old_key);
+ }
Py_DECREF(old_value);
- Py_DECREF(old_key);
return 0;
}
@@ -898,69 +1254,70 @@ void
PyDict_Clear(PyObject *op)
{
PyDictObject *mp;
- PyDictEntry *ep, *table;
- int table_is_malloced;
- Py_ssize_t fill;
- PyDictEntry small_copy[PyDict_MINSIZE];
-#ifdef Py_DEBUG
+ PyDictKeysObject *oldkeys;
+ PyObject **oldvalues;
Py_ssize_t i, n;
-#endif
if (!PyDict_Check(op))
return;
- mp = (PyDictObject *)op;
-#ifdef Py_DEBUG
- n = mp->ma_mask + 1;
- i = 0;
-#endif
+ mp = ((PyDictObject *)op);
+ oldkeys = mp->ma_keys;
+ oldvalues = mp->ma_values;
+ if (oldvalues == empty_values)
+ return;
+ /* Empty the dict... */
+ DK_INCREF(Py_EMPTY_KEYS);
+ mp->ma_keys = Py_EMPTY_KEYS;
+ mp->ma_values = empty_values;
+ mp->ma_used = 0;
+ /* ...then clear the keys and values */
+ if (oldvalues != NULL) {
+ n = DK_SIZE(oldkeys);
+ for (i = 0; i < n; i++)
+ Py_CLEAR(oldvalues[i]);
+ free_values(oldvalues);
+ DK_DECREF(oldkeys);
+ }
+ else {
+ assert(oldkeys->dk_refcnt == 1);
+ DK_DECREF(oldkeys);
+ }
+}
- table = mp->ma_table;
- assert(table != NULL);
- table_is_malloced = table != mp->ma_smalltable;
+/* Returns -1 if no more items (or op is not a dict),
+ * index of item otherwise. Stores value in pvalue
+ */
+Py_LOCAL_INLINE(Py_ssize_t)
+dict_next(PyObject *op, Py_ssize_t i, PyObject **pvalue)
+{
+ Py_ssize_t mask, offset;
+ PyDictObject *mp;
+ PyObject **value_ptr;
- /* This is delicate. During the process of clearing the dict,
- * decrefs can cause the dict to mutate. To avoid fatal confusion
- * (voice of experience), we have to make the dict empty before
- * clearing the slots, and never refer to anything via mp->xxx while
- * clearing.
- */
- fill = mp->ma_fill;
- if (table_is_malloced)
- EMPTY_TO_MINSIZE(mp);
-
- else if (fill > 0) {
- /* It's a small table with something that needs to be cleared.
- * Afraid the only safe way is to copy the dict entries into
- * another small table first.
- */
- memcpy(small_copy, table, sizeof(small_copy));
- table = small_copy;
- EMPTY_TO_MINSIZE(mp);
- }
- /* else it's a small table that's already empty */
- /* Now we can finally clear things. If C had refcounts, we could
- * assert that the refcount on table is 1 now, i.e. that this function
- * has unique access to it, so decref side-effects can't alter it.
- */
- for (ep = table; fill > 0; ++ep) {
-#ifdef Py_DEBUG
- assert(i < n);
- ++i;
-#endif
- if (ep->me_key) {
- --fill;
- Py_DECREF(ep->me_key);
- Py_XDECREF(ep->me_value);
- }
-#ifdef Py_DEBUG
- else
- assert(ep->me_value == NULL);
-#endif
+ if (!PyDict_Check(op))
+ return -1;
+ mp = (PyDictObject *)op;
+ if (i < 0)
+ return -1;
+ if (mp->ma_values) {
+ value_ptr = &mp->ma_values[i];
+ offset = sizeof(PyObject *);
}
-
- if (table_is_malloced)
- PyMem_DEL(table);
+ else {
+ value_ptr = &mp->ma_keys->dk_entries[i].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ mask = DK_MASK(mp->ma_keys);
+ while (i <= mask && *value_ptr == NULL) {
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
+ i++;
+ }
+ if (i > mask)
+ return -1;
+ if (pvalue)
+ *pvalue = *value_ptr;
+ return i;
}
/*
@@ -981,75 +1338,59 @@ PyDict_Clear(PyObject *op)
int
PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
{
- register Py_ssize_t i;
- register Py_ssize_t mask;
- register PyDictEntry *ep;
-
- if (!PyDict_Check(op))
- return 0;
- i = *ppos;
+ PyDictObject *mp;
+ Py_ssize_t i = dict_next(op, *ppos, pvalue);
if (i < 0)
return 0;
- ep = ((PyDictObject *)op)->ma_table;
- mask = ((PyDictObject *)op)->ma_mask;
- while (i <= mask && ep[i].me_value == NULL)
- i++;
+ mp = (PyDictObject *)op;
*ppos = i+1;
- if (i > mask)
- return 0;
if (pkey)
- *pkey = ep[i].me_key;
- if (pvalue)
- *pvalue = ep[i].me_value;
+ *pkey = mp->ma_keys->dk_entries[i].me_key;
return 1;
}
-/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
+/* Internal version of PyDict_Next that returns a hash value in addition
+ * to the key and value.
+ */
int
-_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash)
+_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
+ PyObject **pvalue, Py_hash_t *phash)
{
- register Py_ssize_t i;
- register Py_ssize_t mask;
- register PyDictEntry *ep;
-
- if (!PyDict_Check(op))
- return 0;
- i = *ppos;
+ PyDictObject *mp;
+ Py_ssize_t i = dict_next(op, *ppos, pvalue);
if (i < 0)
return 0;
- ep = ((PyDictObject *)op)->ma_table;
- mask = ((PyDictObject *)op)->ma_mask;
- while (i <= mask && ep[i].me_value == NULL)
- i++;
+ mp = (PyDictObject *)op;
*ppos = i+1;
- if (i > mask)
- return 0;
- *phash = ep[i].me_hash;
+ *phash = mp->ma_keys->dk_entries[i].me_hash;
if (pkey)
- *pkey = ep[i].me_key;
- if (pvalue)
- *pvalue = ep[i].me_value;
+ *pkey = mp->ma_keys->dk_entries[i].me_key;
return 1;
}
/* Methods */
static void
-dict_dealloc(register PyDictObject *mp)
+dict_dealloc(PyDictObject *mp)
{
- register PyDictEntry *ep;
- Py_ssize_t fill = mp->ma_fill;
+ PyObject **values = mp->ma_values;
+ PyDictKeysObject *keys = mp->ma_keys;
+ Py_ssize_t i, n;
PyObject_GC_UnTrack(mp);
Py_TRASHCAN_SAFE_BEGIN(mp)
- for (ep = mp->ma_table; fill > 0; ep++) {
- if (ep->me_key) {
- --fill;
- Py_DECREF(ep->me_key);
- Py_XDECREF(ep->me_value);
+ if (values != NULL) {
+ if (values != empty_values) {
+ for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
+ Py_XDECREF(values[i]);
+ }
+ free_values(values);
}
+ DK_DECREF(keys);
+ }
+ else {
+ assert(keys->dk_refcnt == 1);
+ DK_DECREF(keys);
}
- if (mp->ma_table != mp->ma_smalltable)
- PyMem_DEL(mp->ma_table);
if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
free_list[numfree++] = mp;
else
@@ -1057,6 +1398,7 @@ dict_dealloc(register PyDictObject *mp)
Py_TRASHCAN_SAFE_END(mp)
}
+
static PyObject *
dict_repr(PyDictObject *mp)
{
@@ -1088,11 +1430,13 @@ dict_repr(PyDictObject *mp)
i = 0;
while (PyDict_Next((PyObject *)mp, &i, &key, &value)) {
int status;
- /* Prevent repr from deleting value during key format. */
+ /* Prevent repr from deleting key or value during key format. */
+ Py_INCREF(key);
Py_INCREF(value);
s = PyObject_Repr(key);
PyUnicode_Append(&s, colon);
PyUnicode_AppendAndDel(&s, PyObject_Repr(value));
+ Py_DECREF(key);
Py_DECREF(value);
if (s == NULL)
goto Done;
@@ -1147,26 +1491,25 @@ dict_subscript(PyDictObject *mp, register PyObject *key)
{
PyObject *v;
Py_hash_t hash;
- PyDictEntry *ep;
- assert(mp->ma_table != NULL);
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
+
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- v = ep->me_value;
+ v = *value_addr;
if (v == NULL) {
if (!PyDict_CheckExact(mp)) {
/* Look up __missing__ method if we're a subclass. */
PyObject *missing, *res;
- static PyObject *missing_str = NULL;
- missing = _PyObject_LookupSpecial((PyObject *)mp,
- "__missing__",
- &missing_str);
+ _Py_IDENTIFIER(__missing__);
+ missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__);
if (missing != NULL) {
res = PyObject_CallFunctionObjArgs(missing,
key, NULL);
@@ -1204,8 +1547,9 @@ dict_keys(register PyDictObject *mp)
{
register PyObject *v;
register Py_ssize_t i, j;
- PyDictEntry *ep;
- Py_ssize_t mask, n;
+ PyDictKeyEntry *ep;
+ Py_ssize_t size, n, offset;
+ PyObject **value_ptr;
again:
n = mp->ma_used;
@@ -1219,15 +1563,24 @@ dict_keys(register PyDictObject *mp)
Py_DECREF(v);
goto again;
}
- ep = mp->ma_table;
- mask = mp->ma_mask;
- for (i = 0, j = 0; i <= mask; i++) {
- if (ep[i].me_value != NULL) {
+ ep = &mp->ma_keys->dk_entries[0];
+ size = DK_SIZE(mp->ma_keys);
+ if (mp->ma_values) {
+ value_ptr = mp->ma_values;
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &ep[0].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ for (i = 0, j = 0; i < size; i++) {
+ if (*value_ptr != NULL) {
PyObject *key = ep[i].me_key;
Py_INCREF(key);
PyList_SET_ITEM(v, j, key);
j++;
}
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
}
assert(j == n);
return v;
@@ -1238,8 +1591,8 @@ dict_values(register PyDictObject *mp)
{
register PyObject *v;
register Py_ssize_t i, j;
- PyDictEntry *ep;
- Py_ssize_t mask, n;
+ Py_ssize_t size, n, offset;
+ PyObject **value_ptr;
again:
n = mp->ma_used;
@@ -1253,11 +1606,19 @@ dict_values(register PyDictObject *mp)
Py_DECREF(v);
goto again;
}
- ep = mp->ma_table;
- mask = mp->ma_mask;
- for (i = 0, j = 0; i <= mask; i++) {
- if (ep[i].me_value != NULL) {
- PyObject *value = ep[i].me_value;
+ size = DK_SIZE(mp->ma_keys);
+ if (mp->ma_values) {
+ value_ptr = mp->ma_values;
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &mp->ma_keys->dk_entries[0].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ for (i = 0, j = 0; i < size; i++) {
+ PyObject *value = *value_ptr;
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
+ if (value != NULL) {
Py_INCREF(value);
PyList_SET_ITEM(v, j, value);
j++;
@@ -1272,9 +1633,10 @@ dict_items(register PyDictObject *mp)
{
register PyObject *v;
register Py_ssize_t i, j, n;
- Py_ssize_t mask;
- PyObject *item, *key, *value;
- PyDictEntry *ep;
+ Py_ssize_t size, offset;
+ PyObject *item, *key;
+ PyDictKeyEntry *ep;
+ PyObject **value_ptr;
/* Preallocate the list of tuples, to avoid allocations during
* the loop over the items, which could trigger GC, which
@@ -1301,10 +1663,20 @@ dict_items(register PyDictObject *mp)
goto again;
}
/* Nothing we do below makes any function calls. */
- ep = mp->ma_table;
- mask = mp->ma_mask;
- for (i = 0, j = 0; i <= mask; i++) {
- if ((value=ep[i].me_value) != NULL) {
+ ep = mp->ma_keys->dk_entries;
+ size = DK_SIZE(mp->ma_keys);
+ if (mp->ma_values) {
+ value_ptr = mp->ma_values;
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &ep[0].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ for (i = 0, j = 0; i < size; i++) {
+ PyObject *value = *value_ptr;
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
+ if (value != NULL) {
key = ep[i].me_key;
item = PyList_GET_ITEM(v, j);
Py_INCREF(key);
@@ -1349,8 +1721,6 @@ dict_fromkeys(PyObject *cls, PyObject *args)
}
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
- Py_INCREF(key);
- Py_INCREF(value);
if (insertdict(mp, key, hash, value)) {
Py_DECREF(d);
return NULL;
@@ -1370,8 +1740,6 @@ dict_fromkeys(PyObject *cls, PyObject *args)
}
while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
- Py_INCREF(key);
- Py_INCREF(value);
if (insertdict(mp, key, hash, value)) {
Py_DECREF(d);
return NULL;
@@ -1424,7 +1792,8 @@ dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, char *methnam
result = -1;
else if (arg != NULL) {
- if (PyObject_HasAttrString(arg, "keys"))
+ _Py_IDENTIFIER(keys);
+ if (_PyObject_HasAttrId(arg, &PyId_keys))
result = PyDict_Merge(self, arg, 1);
else
result = PyDict_MergeFromSeq2(self, arg, 1);
@@ -1536,8 +1905,8 @@ int
PyDict_Merge(PyObject *a, PyObject *b, int override)
{
register PyDictObject *mp, *other;
- register Py_ssize_t i;
- PyDictEntry *entry;
+ register Py_ssize_t i, n;
+ PyDictKeyEntry *entry;
/* We accept for the argument either a concrete dictionary object,
* or an abstract "mapping" object. For the former, we can do
@@ -1564,20 +1933,23 @@ PyDict_Merge(PyObject *a, PyObject *b, int override)
* incrementally resizing as we insert new items. Expect
* that there will be no (or few) overlapping keys.
*/
- if ((mp->ma_fill + other->ma_used)*3 >= (mp->ma_mask+1)*2) {
- if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
+ if (mp->ma_keys->dk_usable * 3 < other->ma_used * 2)
+ if (dictresize(mp, (mp->ma_used + other->ma_used)*2) != 0)
return -1;
- }
- for (i = 0; i <= other->ma_mask; i++) {
- entry = &other->ma_table[i];
- if (entry->me_value != NULL &&
+ for (i = 0, n = DK_SIZE(other->ma_keys); i < n; i++) {
+ PyObject *value;
+ entry = &other->ma_keys->dk_entries[i];
+ if (other->ma_values)
+ value = other->ma_values[i];
+ else
+ value = entry->me_value;
+
+ if (value != NULL &&
(override ||
PyDict_GetItem(a, entry->me_key) == NULL)) {
- Py_INCREF(entry->me_key);
- Py_INCREF(entry->me_value);
if (insertdict(mp, entry->me_key,
entry->me_hash,
- entry->me_value) != 0)
+ value) != 0)
return -1;
}
}
@@ -1639,11 +2011,37 @@ PyObject *
PyDict_Copy(PyObject *o)
{
PyObject *copy;
+ PyDictObject *mp;
+ Py_ssize_t i, n;
if (o == NULL || !PyDict_Check(o)) {
PyErr_BadInternalCall();
return NULL;
}
+ mp = (PyDictObject *)o;
+ if (_PyDict_HasSplitTable(mp)) {
+ PyDictObject *split_copy;
+ PyObject **newvalues = new_values(DK_SIZE(mp->ma_keys));
+ if (newvalues == NULL)
+ return PyErr_NoMemory();
+ split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type);
+ if (split_copy == NULL) {
+ free_values(newvalues);
+ return NULL;
+ }
+ split_copy->ma_values = newvalues;
+ split_copy->ma_keys = mp->ma_keys;
+ split_copy->ma_used = mp->ma_used;
+ DK_INCREF(mp->ma_keys);
+ for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
+ PyObject *value = mp->ma_values[i];
+ Py_XINCREF(value);
+ split_copy->ma_values[i] = value;
+ }
+ if (_PyObject_GC_IS_TRACKED(mp))
+ _PyObject_GC_TRACK(split_copy);
+ return (PyObject *)split_copy;
+ }
copy = PyDict_New();
if (copy == NULL)
return NULL;
@@ -1705,14 +2103,18 @@ dict_equal(PyDictObject *a, PyDictObject *b)
if (a->ma_used != b->ma_used)
/* can't be equal if # of entries differ */
return 0;
-
/* Same # of entries -- check all of 'em. Exit early on any diff. */
- for (i = 0; i <= a->ma_mask; i++) {
- PyObject *aval = a->ma_table[i].me_value;
+ for (i = 0; i < DK_SIZE(a->ma_keys); i++) {
+ PyDictKeyEntry *ep = &a->ma_keys->dk_entries[i];
+ PyObject *aval;
+ if (a->ma_values)
+ aval = a->ma_values[i];
+ else
+ aval = ep->me_value;
if (aval != NULL) {
int cmp;
PyObject *bval;
- PyObject *key = a->ma_table[i].me_key;
+ PyObject *key = ep->me_key;
/* temporarily bump aval's refcount to ensure it stays
alive until we're done with it */
Py_INCREF(aval);
@@ -1733,7 +2135,7 @@ dict_equal(PyDictObject *a, PyDictObject *b)
}
}
return 1;
- }
+}
static PyObject *
dict_richcompare(PyObject *v, PyObject *w, int op)
@@ -1754,24 +2156,25 @@ dict_richcompare(PyObject *v, PyObject *w, int op)
res = Py_NotImplemented;
Py_INCREF(res);
return res;
- }
+}
static PyObject *
dict_contains(register PyDictObject *mp, PyObject *key)
{
Py_hash_t hash;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- return PyBool_FromLong(ep->me_value != NULL);
+ return PyBool_FromLong(*value_addr != NULL);
}
static PyObject *
@@ -1781,28 +2184,28 @@ dict_get(register PyDictObject *mp, PyObject *args)
PyObject *failobj = Py_None;
PyObject *val = NULL;
Py_hash_t hash;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
return NULL;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- val = ep->me_value;
+ val = *value_addr;
if (val == NULL)
val = failobj;
Py_INCREF(val);
return val;
}
-
static PyObject *
dict_setdefault(register PyDictObject *mp, PyObject *args)
{
@@ -1810,27 +2213,40 @@ dict_setdefault(register PyDictObject *mp, PyObject *args)
PyObject *failobj = Py_None;
PyObject *val = NULL;
Py_hash_t hash;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj))
return NULL;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- val = ep->me_value;
+ val = *value_addr;
if (val == NULL) {
- if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep,
- failobj) == 0)
- val = failobj;
+ Py_INCREF(failobj);
+ Py_INCREF(key);
+ if (mp->ma_keys->dk_usable <= 0) {
+ /* Need to resize. */
+ if (insertion_resize(mp) < 0)
+ return NULL;
+ ep = find_empty_slot(mp, key, hash, &value_addr);
+ }
+ MAINTAIN_TRACKING(mp, key, failobj);
+ ep->me_key = key;
+ ep->me_hash = hash;
+ *value_addr = failobj;
+ val = failobj;
+ mp->ma_keys->dk_usable--;
+ mp->ma_used++;
}
- Py_XINCREF(val);
+ Py_INCREF(val);
return val;
}
@@ -1846,9 +2262,10 @@ static PyObject *
dict_pop(PyDictObject *mp, PyObject *args)
{
Py_hash_t hash;
- PyDictEntry *ep;
PyObject *old_value, *old_key;
PyObject *key, *deflt = NULL;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if(!PyArg_UnpackTuple(args, "pop", 1, 2, &key, &deflt))
return NULL;
@@ -1861,15 +2278,16 @@ dict_pop(PyDictObject *mp, PyObject *args)
return NULL;
}
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return NULL;
}
- ep = (mp->ma_lookup)(mp, key, hash);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
if (ep == NULL)
return NULL;
- if (ep->me_value == NULL) {
+ old_value = *value_addr;
+ if (old_value == NULL) {
if (deflt) {
Py_INCREF(deflt);
return deflt;
@@ -1877,13 +2295,15 @@ dict_pop(PyDictObject *mp, PyObject *args)
set_key_error(key);
return NULL;
}
- old_key = ep->me_key;
- Py_INCREF(dummy);
- ep->me_key = dummy;
- old_value = ep->me_value;
- ep->me_value = NULL;
+ *value_addr = NULL;
mp->ma_used--;
- Py_DECREF(old_key);
+ if (!_PyDict_HasSplitTable(mp)) {
+ ENSURE_ALLOWS_DELETIONS(mp);
+ old_key = ep->me_key;
+ Py_INCREF(dummy);
+ ep->me_key = dummy;
+ Py_DECREF(old_key);
+ }
return old_value;
}
@@ -1891,9 +2311,10 @@ static PyObject *
dict_popitem(PyDictObject *mp)
{
Py_hash_t i = 0;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
PyObject *res;
+
/* Allocate the result tuple before checking the size. Believe it
* or not, this allocation could trigger a garbage collection which
* could empty the dict, so if we checked the size first and that
@@ -1912,25 +2333,34 @@ dict_popitem(PyDictObject *mp)
"popitem(): dictionary is empty");
return NULL;
}
+ /* Convert split table to combined table */
+ if (mp->ma_keys->dk_lookup == lookdict_split) {
+ if (dictresize(mp, DK_SIZE(mp->ma_keys))) {
+ Py_DECREF(res);
+ return NULL;
+ }
+ }
+ ENSURE_ALLOWS_DELETIONS(mp);
/* Set ep to "the first" dict entry with a value. We abuse the hash
* field of slot 0 to hold a search finger:
* If slot 0 has a value, use slot 0.
* Else slot 0 is being used to hold a search finger,
* and we use its hash value as the first index to look.
*/
- ep = &mp->ma_table[0];
+ ep = &mp->ma_keys->dk_entries[0];
if (ep->me_value == NULL) {
+ Py_ssize_t mask = DK_MASK(mp->ma_keys);
i = ep->me_hash;
/* The hash field may be a real hash value, or it may be a
* legit search finger, or it may be a once-legit search
* finger that's out of bounds now because it wrapped around
* or the table shrunk -- simply make sure it's in bounds now.
*/
- if (i > mp->ma_mask || i < 1)
+ if (i > mask || i < 1)
i = 1; /* skip slot 0 */
- while ((ep = &mp->ma_table[i])->me_value == NULL) {
+ while ((ep = &mp->ma_keys->dk_entries[i])->me_value == NULL) {
i++;
- if (i > mp->ma_mask)
+ if (i > mask)
i = 1;
}
}
@@ -1940,21 +2370,34 @@ dict_popitem(PyDictObject *mp)
ep->me_key = dummy;
ep->me_value = NULL;
mp->ma_used--;
- assert(mp->ma_table[0].me_value == NULL);
- mp->ma_table[0].me_hash = i + 1; /* next place to start */
+ assert(mp->ma_keys->dk_entries[0].me_value == NULL);
+ mp->ma_keys->dk_entries[0].me_hash = i + 1; /* next place to start */
return res;
}
static int
dict_traverse(PyObject *op, visitproc visit, void *arg)
{
- Py_ssize_t i = 0;
- PyObject *pk;
- PyObject *pv;
-
- while (PyDict_Next(op, &i, &pk, &pv)) {
- Py_VISIT(pk);
- Py_VISIT(pv);
+ Py_ssize_t i, n;
+ PyDictObject *mp = (PyDictObject *)op;
+ if (mp->ma_keys->dk_lookup == lookdict) {
+ for (i = 0; i < DK_SIZE(mp->ma_keys); i++) {
+ if (mp->ma_keys->dk_entries[i].me_value != NULL) {
+ Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
+ Py_VISIT(mp->ma_keys->dk_entries[i].me_key);
+ }
+ }
+ } else {
+ if (mp->ma_values != NULL) {
+ for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
+ Py_VISIT(mp->ma_values[i]);
+ }
+ }
+ else {
+ for (i = 0, n = DK_SIZE(mp->ma_keys); i < n; i++) {
+ Py_VISIT(mp->ma_keys->dk_entries[i].me_value);
+ }
+ }
}
return 0;
}
@@ -1971,14 +2414,25 @@ static PyObject *dictiter_new(PyDictObject *, PyTypeObject *);
static PyObject *
dict_sizeof(PyDictObject *mp)
{
- Py_ssize_t res;
+ Py_ssize_t size, res;
+ size = DK_SIZE(mp->ma_keys);
res = sizeof(PyDictObject);
- if (mp->ma_table != mp->ma_smalltable)
- res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry);
+ if (mp->ma_values)
+ res += size * sizeof(PyObject*);
+ /* If the dictionary is split, the keys portion is accounted-for
+ in the type object. */
+ if (mp->ma_keys->dk_refcnt == 1)
+ res += sizeof(PyDictKeysObject) + (size-1) * sizeof(PyDictKeyEntry);
return PyLong_FromSsize_t(res);
}
+Py_ssize_t
+_PyDict_KeysSize(PyDictKeysObject *keys)
+{
+ return sizeof(PyDictKeysObject) + (DK_SIZE(keys)-1) * sizeof(PyDictKeyEntry);
+}
+
PyDoc_STRVAR(contains__doc__,
"D.__contains__(k) -> True if D has a key k, else False");
@@ -2067,16 +2521,17 @@ PyDict_Contains(PyObject *op, PyObject *key)
{
Py_hash_t hash;
PyDictObject *mp = (PyDictObject *)op;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
}
- ep = (mp->ma_lookup)(mp, key, hash);
- return ep == NULL ? -1 : (ep->me_value != NULL);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
+ return (ep == NULL) ? -1 : (*value_addr != NULL);
}
/* Internal version of PyDict_Contains used when the hash value is already known */
@@ -2084,10 +2539,11 @@ int
_PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash)
{
PyDictObject *mp = (PyDictObject *)op;
- PyDictEntry *ep;
+ PyDictKeyEntry *ep;
+ PyObject **value_addr;
- ep = (mp->ma_lookup)(mp, key, hash);
- return ep == NULL ? -1 : (ep->me_value != NULL);
+ ep = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr);
+ return (ep == NULL) ? -1 : (*value_addr != NULL);
}
/* Hack to implement "key in dict" */
@@ -2113,22 +2569,17 @@ dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
self = type->tp_alloc(type, 0);
if (self != NULL) {
PyDictObject *d = (PyDictObject *)self;
- /* It's guaranteed that tp->alloc zeroed out the struct. */
- assert(d->ma_table == NULL && d->ma_fill == 0 && d->ma_used == 0);
- INIT_NONZERO_DICT_SLOTS(d);
- d->ma_lookup = lookdict_unicode;
+ d->ma_keys = new_keys_object(PyDict_MINSIZE_COMBINED);
+ /* XXX - Should we raise a no-memory error? */
+ if (d->ma_keys == NULL) {
+ DK_INCREF(Py_EMPTY_KEYS);
+ d->ma_keys = Py_EMPTY_KEYS;
+ d->ma_values = empty_values;
+ }
+ d->ma_used = 0;
/* The object has been implicitly tracked by tp_alloc */
if (type == &PyDict_Type)
_PyObject_GC_UNTRACK(d);
-#ifdef SHOW_CONVERSION_COUNTS
- ++created;
-#endif
-#ifdef SHOW_TRACK_COUNT
- if (_PyObject_GC_IS_TRACKED(d))
- count_tracked++;
- else
- count_untracked++;
-#endif
}
return self;
}
@@ -2199,6 +2650,16 @@ PyTypeObject PyDict_Type = {
PyObject_GC_Del, /* tp_free */
};
+PyObject *
+_PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key)
+{
+ PyObject *kv;
+ kv = _PyUnicode_FromId(key); /* borrowed */
+ if (kv == NULL)
+ return NULL;
+ return PyDict_GetItem(dp, kv);
+}
+
/* For backward compatibility with old dictionary interface */
PyObject *
@@ -2214,6 +2675,16 @@ PyDict_GetItemString(PyObject *v, const char *key)
}
int
+_PyDict_SetItemId(PyObject *v, struct _Py_Identifier *key, PyObject *item)
+{
+ PyObject *kv;
+ kv = _PyUnicode_FromId(key); /* borrowed */
+ if (kv == NULL)
+ return -1;
+ return PyDict_SetItem(v, kv, item);
+}
+
+int
PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
{
PyObject *kv;
@@ -2304,18 +2775,26 @@ dictiter_len(dictiterobject *di)
PyDoc_STRVAR(length_hint_doc,
"Private method returning an estimate of len(list(it)).");
+static PyObject *
+dictiter_reduce(dictiterobject *di);
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
static PyMethodDef dictiter_methods[] = {
{"__length_hint__", (PyCFunction)dictiter_len, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)dictiter_reduce, METH_NOARGS,
+ reduce_doc},
{NULL, NULL} /* sentinel */
};
static PyObject *dictiter_iternextkey(dictiterobject *di)
{
PyObject *key;
- register Py_ssize_t i, mask;
- register PyDictEntry *ep;
+ register Py_ssize_t i, mask, offset;
+ register PyDictKeysObject *k;
PyDictObject *d = di->di_dict;
+ PyObject **value_ptr;
if (d == NULL)
return NULL;
@@ -2331,15 +2810,25 @@ static PyObject *dictiter_iternextkey(dictiterobject *di)
i = di->di_pos;
if (i < 0)
goto fail;
- ep = d->ma_table;
- mask = d->ma_mask;
- while (i <= mask && ep[i].me_value == NULL)
+ k = d->ma_keys;
+ if (d->ma_values) {
+ value_ptr = &d->ma_values[i];
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &k->dk_entries[i].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ mask = DK_SIZE(k)-1;
+ while (i <= mask && *value_ptr == NULL) {
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
i++;
+ }
di->di_pos = i+1;
if (i > mask)
goto fail;
di->len--;
- key = ep[i].me_key;
+ key = k->dk_entries[i].me_key;
Py_INCREF(key);
return key;
@@ -2385,9 +2874,9 @@ PyTypeObject PyDictIterKey_Type = {
static PyObject *dictiter_iternextvalue(dictiterobject *di)
{
PyObject *value;
- register Py_ssize_t i, mask;
- register PyDictEntry *ep;
+ register Py_ssize_t i, mask, offset;
PyDictObject *d = di->di_dict;
+ PyObject **value_ptr;
if (d == NULL)
return NULL;
@@ -2401,17 +2890,26 @@ static PyObject *dictiter_iternextvalue(dictiterobject *di)
}
i = di->di_pos;
- mask = d->ma_mask;
+ mask = DK_SIZE(d->ma_keys)-1;
if (i < 0 || i > mask)
goto fail;
- ep = d->ma_table;
- while ((value=ep[i].me_value) == NULL) {
+ if (d->ma_values) {
+ value_ptr = &d->ma_values[i];
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &d->ma_keys->dk_entries[i].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ while (i <= mask && *value_ptr == NULL) {
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
i++;
if (i > mask)
goto fail;
}
di->di_pos = i+1;
di->len--;
+ value = *value_ptr;
Py_INCREF(value);
return value;
@@ -2457,9 +2955,9 @@ PyTypeObject PyDictIterValue_Type = {
static PyObject *dictiter_iternextitem(dictiterobject *di)
{
PyObject *key, *value, *result = di->di_result;
- register Py_ssize_t i, mask;
- register PyDictEntry *ep;
+ register Py_ssize_t i, mask, offset;
PyDictObject *d = di->di_dict;
+ PyObject **value_ptr;
if (d == NULL)
return NULL;
@@ -2475,10 +2973,19 @@ static PyObject *dictiter_iternextitem(dictiterobject *di)
i = di->di_pos;
if (i < 0)
goto fail;
- ep = d->ma_table;
- mask = d->ma_mask;
- while (i <= mask && ep[i].me_value == NULL)
+ mask = DK_SIZE(d->ma_keys)-1;
+ if (d->ma_values) {
+ value_ptr = &d->ma_values[i];
+ offset = sizeof(PyObject *);
+ }
+ else {
+ value_ptr = &d->ma_keys->dk_entries[i].me_value;
+ offset = sizeof(PyDictKeyEntry);
+ }
+ while (i <= mask && *value_ptr == NULL) {
+ value_ptr = (PyObject **)(((char *)value_ptr) + offset);
i++;
+ }
di->di_pos = i+1;
if (i > mask)
goto fail;
@@ -2493,8 +3000,8 @@ static PyObject *dictiter_iternextitem(dictiterobject *di)
return NULL;
}
di->len--;
- key = ep[i].me_key;
- value = ep[i].me_value;
+ key = d->ma_keys->dk_entries[i].me_key;
+ value = *value_ptr;
Py_INCREF(key);
Py_INCREF(value);
PyTuple_SET_ITEM(result, 0, key);
@@ -2541,6 +3048,52 @@ PyTypeObject PyDictIterItem_Type = {
};
+static PyObject *
+dictiter_reduce(dictiterobject *di)
+{
+ PyObject *list;
+ dictiterobject tmp;
+
+ list = PyList_New(0);
+ if (!list)
+ return NULL;
+
+ /* copy the itertor state */
+ tmp = *di;
+ Py_XINCREF(tmp.di_dict);
+
+ /* iterate the temporary into a list */
+ for(;;) {
+ PyObject *element = 0;
+ if (Py_TYPE(di) == &PyDictIterItem_Type)
+ element = dictiter_iternextitem(&tmp);
+ else if (Py_TYPE(di) == &PyDictIterKey_Type)
+ element = dictiter_iternextkey(&tmp);
+ else if (Py_TYPE(di) == &PyDictIterValue_Type)
+ element = dictiter_iternextvalue(&tmp);
+ else
+ assert(0);
+ if (element) {
+ if (PyList_Append(list, element)) {
+ Py_DECREF(element);
+ Py_DECREF(list);
+ Py_XDECREF(tmp.di_dict);
+ return NULL;
+ }
+ Py_DECREF(element);
+ } else
+ break;
+ }
+ Py_XDECREF(tmp.di_dict);
+ /* check for error */
+ if (tmp.di_dict != NULL) {
+ /* we have an error */
+ Py_DECREF(list);
+ return NULL;
+ }
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
+}
+
/***********************************************/
/* View objects for keys(), items(), values(). */
/***********************************************/
@@ -2645,10 +3198,8 @@ dictview_richcompare(PyObject *self, PyObject *other, int op)
assert(PyDictViewSet_Check(self));
assert(other != NULL);
- if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
len_self = PyObject_Size(self);
if (len_self < 0)
@@ -2746,10 +3297,12 @@ dictviews_sub(PyObject* self, PyObject *other)
{
PyObject *result = PySet_New(self);
PyObject *tmp;
+ _Py_IDENTIFIER(difference_update);
+
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "difference_update", "O", other);
+ tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -2764,10 +3317,12 @@ dictviews_and(PyObject* self, PyObject *other)
{
PyObject *result = PySet_New(self);
PyObject *tmp;
+ _Py_IDENTIFIER(intersection_update);
+
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "intersection_update", "O", other);
+ tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -2782,10 +3337,12 @@ dictviews_or(PyObject* self, PyObject *other)
{
PyObject *result = PySet_New(self);
PyObject *tmp;
+ _Py_IDENTIFIER(update);
+
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "update", "O", other);
+ tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other);
if (tmp == NULL) {
Py_DECREF(result);
return NULL;
@@ -2800,10 +3357,12 @@ dictviews_xor(PyObject* self, PyObject *other)
{
PyObject *result = PySet_New(self);
PyObject *tmp;
+ _Py_IDENTIFIER(symmetric_difference_update);
+
if (result == NULL)
return NULL;
- tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O",
+ tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O",
other);
if (tmp == NULL) {
Py_DECREF(result);
@@ -3082,3 +3641,151 @@ dictvalues_new(PyObject *dict)
{
return dictview_new(dict, &PyDictValues_Type);
}
+
+/* Returns NULL if cannot allocate a new PyDictKeysObject,
+ but does not set an error */
+PyDictKeysObject *
+_PyDict_NewKeysForClass(void)
+{
+ PyDictKeysObject *keys = new_keys_object(PyDict_MINSIZE_SPLIT);
+ if (keys == NULL)
+ PyErr_Clear();
+ else
+ keys->dk_lookup = lookdict_split;
+ return keys;
+}
+
+#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys)
+
+PyObject *
+PyObject_GenericGetDict(PyObject *obj, void *context)
+{
+ PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
+ if (dictptr == NULL) {
+ PyErr_SetString(PyExc_AttributeError,
+ "This object has no __dict__");
+ return NULL;
+ }
+ dict = *dictptr;
+ if (dict == NULL) {
+ PyTypeObject *tp = Py_TYPE(obj);
+ if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) {
+ DK_INCREF(CACHED_KEYS(tp));
+ *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp));
+ }
+ else {
+ *dictptr = dict = PyDict_New();
+ }
+ }
+ Py_XINCREF(dict);
+ return dict;
+}
+
+int
+_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr,
+ PyObject *key, PyObject *value)
+{
+ PyObject *dict;
+ int res;
+ PyDictKeysObject *cached;
+
+ assert(dictptr != NULL);
+ if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) {
+ assert(dictptr != NULL);
+ dict = *dictptr;
+ if (dict == NULL) {
+ DK_INCREF(cached);
+ dict = new_dict_with_shared_keys(cached);
+ if (dict == NULL)
+ return -1;
+ *dictptr = dict;
+ }
+ if (value == NULL) {
+ res = PyDict_DelItem(dict, key);
+ if (cached != ((PyDictObject *)dict)->ma_keys) {
+ CACHED_KEYS(tp) = NULL;
+ DK_DECREF(cached);
+ }
+ } else {
+ res = PyDict_SetItem(dict, key, value);
+ if (cached != ((PyDictObject *)dict)->ma_keys) {
+ /* Either update tp->ht_cached_keys or delete it */
+ if (cached->dk_refcnt == 1) {
+ CACHED_KEYS(tp) = make_keys_shared(dict);
+ } else {
+ CACHED_KEYS(tp) = NULL;
+ }
+ DK_DECREF(cached);
+ if (CACHED_KEYS(tp) == NULL && PyErr_Occurred())
+ return -1;
+ }
+ }
+ } else {
+ dict = *dictptr;
+ if (dict == NULL) {
+ dict = PyDict_New();
+ if (dict == NULL)
+ return -1;
+ *dictptr = dict;
+ }
+ if (value == NULL) {
+ res = PyDict_DelItem(dict, key);
+ } else {
+ res = PyDict_SetItem(dict, key, value);
+ }
+ }
+ return res;
+}
+
+void
+_PyDictKeys_DecRef(PyDictKeysObject *keys)
+{
+ DK_DECREF(keys);
+}
+
+
+/* ARGSUSED */
+static PyObject *
+dummy_repr(PyObject *op)
+{
+ return PyUnicode_FromString("<dummy key>");
+}
+
+/* ARGUSED */
+static void
+dummy_dealloc(PyObject* ignore)
+{
+ /* This should never get called, but we also don't want to SEGV if
+ * we accidentally decref dummy-key out of existence.
+ */
+ Py_FatalError("deallocating <dummy key>");
+}
+
+static PyTypeObject PyDictDummy_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "<dummy key> type",
+ 0,
+ 0,
+ dummy_dealloc, /*tp_dealloc*/ /*never called*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_reserved*/
+ dummy_repr, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call */
+ 0, /*tp_str */
+ 0, /*tp_getattro */
+ 0, /*tp_setattro */
+ 0, /*tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /*tp_flags */
+};
+
+static PyObject _dummy_struct = {
+ _PyObject_EXTRA_INIT
+ 2, &PyDictDummy_Type
+};
+
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 00a3346..c458cfe 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -158,6 +158,22 @@ enum_next(enumobject *en)
return result;
}
+static PyObject *
+enum_reduce(enumobject *en)
+{
+ if (en->en_longindex != NULL)
+ return Py_BuildValue("O(OO)", Py_TYPE(en), en->en_sit, en->en_longindex);
+ else
+ return Py_BuildValue("O(On)", Py_TYPE(en), en->en_sit, en->en_index);
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyMethodDef enum_methods[] = {
+ {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(enum_doc,
"enumerate(iterable[, start]) -> iterator for index, value of iterable\n"
"\n"
@@ -197,7 +213,7 @@ PyTypeObject PyEnum_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)enum_next, /* tp_iternext */
- 0, /* tp_methods */
+ enum_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -224,8 +240,8 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
Py_ssize_t n;
PyObject *seq, *reversed_meth;
- static PyObject *reversed_cache = NULL;
reversedobject *ro;
+ _Py_IDENTIFIER(__reversed__);
if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds))
return NULL;
@@ -233,7 +249,7 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
return NULL;
- reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__", &reversed_cache);
+ reversed_meth = _PyObject_LookupSpecial(seq, &PyId___reversed__);
if (reversed_meth != NULL) {
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
Py_DECREF(reversed_meth);
@@ -319,8 +335,40 @@ reversed_len(reversedobject *ro)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+reversed_reduce(reversedobject *ro)
+{
+ if (ro->seq)
+ return Py_BuildValue("O(O)n", Py_TYPE(ro), ro->seq, ro->index);
+ else
+ return Py_BuildValue("O(())", Py_TYPE(ro));
+}
+
+static PyObject *
+reversed_setstate(reversedobject *ro, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (ro->seq != 0) {
+ Py_ssize_t n = PySequence_Size(ro->seq);
+ if (n < 0)
+ return NULL;
+ if (index < -1)
+ index = -1;
+ else if (index > n-1)
+ index = n-1;
+ ro->index = index;
+ }
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef reversediter_methods[] = {
{"__length_hint__", (PyCFunction)reversed_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)reversed_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)reversed_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 9daa12a..6b04700 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -10,6 +10,20 @@
#include "osdefs.h"
+/* Compatibility aliases */
+PyObject *PyExc_EnvironmentError = NULL;
+PyObject *PyExc_IOError = NULL;
+#ifdef MS_WINDOWS
+PyObject *PyExc_WindowsError = NULL;
+#endif
+#ifdef __VMS
+PyObject *PyExc_VMSError = NULL;
+#endif
+
+/* The dict map from errno codes to OSError subclasses */
+static PyObject *errnomap = NULL;
+
+
/* NOTE: If the exception class hierarchy changes, don't forget to update
* Lib/test/exception_hierarchy.txt
*/
@@ -28,6 +42,13 @@ BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
/* the dict is created on the fly in PyObject_GenericSetAttr */
self->dict = NULL;
self->traceback = self->cause = self->context = NULL;
+ self->suppress_context = 0;
+
+ if (args) {
+ self->args = args;
+ Py_INCREF(args);
+ return (PyObject *)self;
+ }
self->args = PyTuple_New(0);
if (!self->args) {
@@ -41,12 +62,15 @@ BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static int
BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
{
+ PyObject *tmp;
+
if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
return -1;
- Py_DECREF(self->args);
+ tmp = self->args;
self->args = args;
Py_INCREF(self->args);
+ Py_XDECREF(tmp);
return 0;
}
@@ -163,36 +187,6 @@ static PyMethodDef BaseException_methods[] = {
{NULL, NULL, 0, NULL},
};
-
-static PyObject *
-BaseException_get_dict(PyBaseExceptionObject *self)
-{
- if (self->dict == NULL) {
- self->dict = PyDict_New();
- if (!self->dict)
- return NULL;
- }
- Py_INCREF(self->dict);
- return self->dict;
-}
-
-static int
-BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
-{
- if (val == NULL) {
- PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
- return -1;
- }
- if (!PyDict_Check(val)) {
- PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
- return -1;
- }
- Py_CLEAR(self->dict);
- Py_INCREF(val);
- self->dict = val;
- return 0;
-}
-
static PyObject *
BaseException_get_args(PyBaseExceptionObject *self)
{
@@ -306,7 +300,7 @@ BaseException_set_cause(PyObject *self, PyObject *arg) {
static PyGetSetDef BaseException_getset[] = {
- {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
{"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
{"__context__", (getter)BaseException_get_context,
@@ -342,6 +336,7 @@ void
PyException_SetCause(PyObject *self, PyObject *cause) {
PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
((PyBaseExceptionObject *)self)->cause = cause;
+ ((PyBaseExceptionObject *)self)->suppress_context = 1;
Py_XDECREF(old_cause);
}
@@ -361,6 +356,13 @@ PyException_SetContext(PyObject *self, PyObject *context) {
}
+static struct PyMemberDef BaseException_members[] = {
+ {"__suppress_context__", T_BOOL,
+ offsetof(PyBaseExceptionObject, suppress_context)},
+ {NULL}
+};
+
+
static PyTypeObject _PyExc_BaseException = {
PyVarObject_HEAD_INIT(NULL, 0)
"BaseException", /*tp_name*/
@@ -391,7 +393,7 @@ static PyTypeObject _PyExc_BaseException = {
0, /* tp_iter */
0, /* tp_iternext */
BaseException_methods, /* tp_methods */
- 0, /* tp_members */
+ BaseException_members, /* tp_members */
BaseException_getset, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
@@ -436,11 +438,13 @@ static PyTypeObject _PyExc_ ## EXCNAME = { \
PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
(inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
- (initproc)EXCSTORE ## _init, 0, BaseException_new,\
+ (initproc)EXCSTORE ## _init, 0, 0, \
}; \
PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
-#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
+#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
+ EXCMETHODS, EXCMEMBERS, EXCGETSET, \
+ EXCSTR, EXCDOC) \
static PyTypeObject _PyExc_ ## EXCNAME = { \
PyVarObject_HEAD_INIT(NULL, 0) \
# EXCNAME, \
@@ -450,9 +454,9 @@ static PyTypeObject _PyExc_ ## EXCNAME = { \
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
(inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
- EXCMEMBERS, 0, &_ ## EXCBASE, \
+ EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
- (initproc)EXCSTORE ## _init, 0, BaseException_new,\
+ (initproc)EXCSTORE ## _init, 0, EXCNEW,\
}; \
PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
@@ -474,8 +478,64 @@ SimpleExtendsException(PyExc_Exception, TypeError,
/*
* StopIteration extends Exception
*/
-SimpleExtendsException(PyExc_Exception, StopIteration,
- "Signal the end from iterator.__next__().");
+
+static PyMemberDef StopIteration_members[] = {
+ {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
+ PyDoc_STR("generator return value")},
+ {NULL} /* Sentinel */
+};
+
+static int
+StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
+{
+ Py_ssize_t size = PyTuple_GET_SIZE(args);
+ PyObject *value;
+
+ if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
+ return -1;
+ Py_CLEAR(self->value);
+ if (size > 0)
+ value = PyTuple_GET_ITEM(args, 0);
+ else
+ value = Py_None;
+ Py_INCREF(value);
+ self->value = value;
+ return 0;
+}
+
+static int
+StopIteration_clear(PyStopIterationObject *self)
+{
+ Py_CLEAR(self->value);
+ return BaseException_clear((PyBaseExceptionObject *)self);
+}
+
+static void
+StopIteration_dealloc(PyStopIterationObject *self)
+{
+ _PyObject_GC_UNTRACK(self);
+ StopIteration_clear(self);
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static int
+StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->value);
+ return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
+}
+
+ComplexExtendsException(
+ PyExc_Exception, /* base */
+ StopIteration, /* name */
+ StopIteration, /* prefix for *_init, etc */
+ 0, /* new */
+ 0, /* methods */
+ StopIteration_members, /* members */
+ 0, /* getset */
+ 0, /* str */
+ "Signal the end from iterator.__next__()."
+);
/*
@@ -502,7 +562,7 @@ SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
Py_CLEAR(self->code);
if (size == 1)
self->code = PyTuple_GET_ITEM(args, 0);
- else if (size > 1)
+ else /* size > 1 */
self->code = args;
Py_INCREF(self->code);
return 0;
@@ -537,7 +597,7 @@ static PyMemberDef SystemExit_members[] = {
};
ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
- SystemExit_dealloc, 0, SystemExit_members, 0,
+ 0, 0, SystemExit_members, 0, 0,
"Request to exit from the interpreter.");
/*
@@ -550,129 +610,441 @@ SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
/*
* ImportError extends Exception
*/
-SimpleExtendsException(PyExc_Exception, ImportError,
- "Import can't find module, or can't find name in module.");
+static int
+ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *msg = NULL;
+ PyObject *name = NULL;
+ PyObject *path = NULL;
+
+/* Macro replacement doesn't allow ## to start the first line of a macro,
+ so we move the assignment and NULL check into the if-statement. */
+#define GET_KWD(kwd) { \
+ kwd = PyDict_GetItemString(kwds, #kwd); \
+ if (kwd) { \
+ Py_CLEAR(self->kwd); \
+ self->kwd = kwd; \
+ Py_INCREF(self->kwd);\
+ if (PyDict_DelItemString(kwds, #kwd)) \
+ return -1; \
+ } \
+ }
+
+ if (kwds) {
+ GET_KWD(name);
+ GET_KWD(path);
+ }
+
+ if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
+ return -1;
+ if (PyTuple_GET_SIZE(args) != 1)
+ return 0;
+ if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
+ return -1;
+
+ Py_CLEAR(self->msg); /* replacing */
+ self->msg = msg;
+ Py_INCREF(self->msg);
+
+ return 0;
+}
+
+static int
+ImportError_clear(PyImportErrorObject *self)
+{
+ Py_CLEAR(self->msg);
+ Py_CLEAR(self->name);
+ Py_CLEAR(self->path);
+ return BaseException_clear((PyBaseExceptionObject *)self);
+}
+
+static void
+ImportError_dealloc(PyImportErrorObject *self)
+{
+ _PyObject_GC_UNTRACK(self);
+ ImportError_clear(self);
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static int
+ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->msg);
+ Py_VISIT(self->name);
+ Py_VISIT(self->path);
+ return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
+}
+
+static PyObject *
+ImportError_str(PyImportErrorObject *self)
+{
+ if (self->msg && PyUnicode_CheckExact(self->msg)) {
+ Py_INCREF(self->msg);
+ return self->msg;
+ }
+ else {
+ return BaseException_str((PyBaseExceptionObject *)self);
+ }
+}
+
+static PyMemberDef ImportError_members[] = {
+ {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
+ PyDoc_STR("exception message")},
+ {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
+ PyDoc_STR("module name")},
+ {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
+ PyDoc_STR("module path")},
+ {NULL} /* Sentinel */
+};
+
+static PyMethodDef ImportError_methods[] = {
+ {NULL}
+};
+
+ComplexExtendsException(PyExc_Exception, ImportError,
+ ImportError, 0 /* new */,
+ ImportError_methods, ImportError_members,
+ 0 /* getset */, ImportError_str,
+ "Import can't find module, or can't find name in "
+ "module.");
/*
- * EnvironmentError extends Exception
+ * OSError extends Exception
*/
+#ifdef MS_WINDOWS
+#include "errmap.h"
+#endif
+
/* Where a function has a single filename, such as open() or some
* of the os module functions, PyErr_SetFromErrnoWithFilename() is
* called, giving a third argument which is the filename. But, so
* that old code using in-place unpacking doesn't break, e.g.:
*
- * except IOError, (errno, strerror):
+ * except OSError, (errno, strerror):
*
* we hack args so that it only contains two items. This also
* means we need our own __str__() which prints out the filename
* when it was supplied.
*/
+
+/* This function doesn't cleanup on error, the caller should */
static int
-EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
- PyObject *kwds)
+oserror_parse_args(PyObject **p_args,
+ PyObject **myerrno, PyObject **strerror,
+ PyObject **filename
+#ifdef MS_WINDOWS
+ , PyObject **winerror
+#endif
+ )
{
- PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
- PyObject *subslice = NULL;
+ Py_ssize_t nargs;
+ PyObject *args = *p_args;
- if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
- return -1;
+ nargs = PyTuple_GET_SIZE(args);
- if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
- return 0;
+#ifdef MS_WINDOWS
+ if (nargs >= 2 && nargs <= 4) {
+ if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
+ myerrno, strerror, filename, winerror))
+ return -1;
+ if (*winerror && PyLong_Check(*winerror)) {
+ long errcode, winerrcode;
+ PyObject *newargs;
+ Py_ssize_t i;
+
+ winerrcode = PyLong_AsLong(*winerror);
+ if (winerrcode == -1 && PyErr_Occurred())
+ return -1;
+ /* Set errno to the corresponding POSIX errno (overriding
+ first argument). Windows Socket error codes (>= 10000)
+ have the same value as their POSIX counterparts.
+ */
+ if (winerrcode < 10000)
+ errcode = winerror_to_errno(winerrcode);
+ else
+ errcode = winerrcode;
+ *myerrno = PyLong_FromLong(errcode);
+ if (!*myerrno)
+ return -1;
+ newargs = PyTuple_New(nargs);
+ if (!newargs)
+ return -1;
+ PyTuple_SET_ITEM(newargs, 0, *myerrno);
+ for (i = 1; i < nargs; i++) {
+ PyObject *val = PyTuple_GET_ITEM(args, i);
+ Py_INCREF(val);
+ PyTuple_SET_ITEM(newargs, i, val);
+ }
+ Py_DECREF(args);
+ args = *p_args = newargs;
+ }
}
+#else
+ if (nargs >= 2 && nargs <= 3) {
+ if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
+ myerrno, strerror, filename))
+ return -1;
+ }
+#endif
- if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
- &myerrno, &strerror, &filename)) {
- return -1;
+ return 0;
+}
+
+static int
+oserror_init(PyOSErrorObject *self, PyObject **p_args,
+ PyObject *myerrno, PyObject *strerror,
+ PyObject *filename
+#ifdef MS_WINDOWS
+ , PyObject *winerror
+#endif
+ )
+{
+ PyObject *args = *p_args;
+ Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+
+ /* self->filename will remain Py_None otherwise */
+ if (filename && filename != Py_None) {
+ if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
+ PyNumber_Check(filename)) {
+ /* BlockingIOError's 3rd argument can be the number of
+ * characters written.
+ */
+ self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
+ if (self->written == -1 && PyErr_Occurred())
+ return -1;
+ }
+ else {
+ Py_INCREF(filename);
+ self->filename = filename;
+
+ if (nargs >= 2 && nargs <= 3) {
+ /* filename is removed from the args tuple (for compatibility
+ purposes, see test_exceptions.py) */
+ PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
+ if (!subslice)
+ return -1;
+
+ Py_DECREF(args); /* replacing args */
+ *p_args = args = subslice;
+ }
+ }
}
- Py_CLEAR(self->myerrno); /* replacing */
+ Py_XINCREF(myerrno);
self->myerrno = myerrno;
- Py_INCREF(self->myerrno);
- Py_CLEAR(self->strerror); /* replacing */
+ Py_XINCREF(strerror);
self->strerror = strerror;
- Py_INCREF(self->strerror);
- /* self->filename will remain Py_None otherwise */
- if (filename != NULL) {
- Py_CLEAR(self->filename); /* replacing */
- self->filename = filename;
- Py_INCREF(self->filename);
+#ifdef MS_WINDOWS
+ Py_XINCREF(winerror);
+ self->winerror = winerror;
+#endif
- subslice = PyTuple_GetSlice(args, 0, 2);
- if (!subslice)
- return -1;
+ /* Steals the reference to args */
+ Py_CLEAR(self->args);
+ self->args = args;
+ args = NULL;
+
+ return 0;
+}
- Py_DECREF(self->args); /* replacing args */
- self->args = subslice;
+static PyObject *
+OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+static int
+OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
+
+static int
+oserror_use_init(PyTypeObject *type)
+{
+ /* When __init__ is defined in a OSError subclass, we want any
+ extraneous argument to __new__ to be ignored. The only reasonable
+ solution, given __new__ takes a variable number of arguments,
+ is to defer arg parsing and initialization to __init__.
+
+ But when __new__ is overriden as well, it should call our __new__
+ with the right arguments.
+
+ (see http://bugs.python.org/issue12555#msg148829 )
+ */
+ if (type->tp_init != (initproc) OSError_init &&
+ type->tp_new == (newfunc) OSError_new) {
+ assert((PyObject *) type != PyExc_OSError);
+ return 1;
}
return 0;
}
+static PyObject *
+OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyOSErrorObject *self = NULL;
+ PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
+#ifdef MS_WINDOWS
+ PyObject *winerror = NULL;
+#endif
+
+ if (!oserror_use_init(type)) {
+ if (!_PyArg_NoKeywords(type->tp_name, kwds))
+ return NULL;
+
+ Py_INCREF(args);
+ if (oserror_parse_args(&args, &myerrno, &strerror, &filename
+#ifdef MS_WINDOWS
+ , &winerror
+#endif
+ ))
+ goto error;
+
+ if (myerrno && PyLong_Check(myerrno) &&
+ errnomap && (PyObject *) type == PyExc_OSError) {
+ PyObject *newtype;
+ newtype = PyDict_GetItem(errnomap, myerrno);
+ if (newtype) {
+ assert(PyType_Check(newtype));
+ type = (PyTypeObject *) newtype;
+ }
+ else if (PyErr_Occurred())
+ goto error;
+ }
+ }
+
+ self = (PyOSErrorObject *) type->tp_alloc(type, 0);
+ if (!self)
+ goto error;
+
+ self->dict = NULL;
+ self->traceback = self->cause = self->context = NULL;
+ self->written = -1;
+
+ if (!oserror_use_init(type)) {
+ if (oserror_init(self, &args, myerrno, strerror, filename
+#ifdef MS_WINDOWS
+ , winerror
+#endif
+ ))
+ goto error;
+ }
+ else {
+ self->args = PyTuple_New(0);
+ if (self->args == NULL)
+ goto error;
+ }
+
+ return (PyObject *) self;
+
+error:
+ Py_XDECREF(args);
+ Py_XDECREF(self);
+ return NULL;
+}
+
static int
-EnvironmentError_clear(PyEnvironmentErrorObject *self)
+OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
+#ifdef MS_WINDOWS
+ PyObject *winerror = NULL;
+#endif
+
+ if (!oserror_use_init(Py_TYPE(self)))
+ /* Everything already done in OSError_new */
+ return 0;
+
+ if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
+ return -1;
+
+ Py_INCREF(args);
+ if (oserror_parse_args(&args, &myerrno, &strerror, &filename
+#ifdef MS_WINDOWS
+ , &winerror
+#endif
+ ))
+ goto error;
+
+ if (oserror_init(self, &args, myerrno, strerror, filename
+#ifdef MS_WINDOWS
+ , winerror
+#endif
+ ))
+ goto error;
+
+ return 0;
+
+error:
+ Py_XDECREF(args);
+ return -1;
+}
+
+static int
+OSError_clear(PyOSErrorObject *self)
{
Py_CLEAR(self->myerrno);
Py_CLEAR(self->strerror);
Py_CLEAR(self->filename);
+#ifdef MS_WINDOWS
+ Py_CLEAR(self->winerror);
+#endif
return BaseException_clear((PyBaseExceptionObject *)self);
}
static void
-EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
+OSError_dealloc(PyOSErrorObject *self)
{
_PyObject_GC_UNTRACK(self);
- EnvironmentError_clear(self);
+ OSError_clear(self);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static int
-EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
+OSError_traverse(PyOSErrorObject *self, visitproc visit,
void *arg)
{
Py_VISIT(self->myerrno);
Py_VISIT(self->strerror);
Py_VISIT(self->filename);
+#ifdef MS_WINDOWS
+ Py_VISIT(self->winerror);
+#endif
return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
}
static PyObject *
-EnvironmentError_str(PyEnvironmentErrorObject *self)
+OSError_str(PyOSErrorObject *self)
{
+#ifdef MS_WINDOWS
+ /* If available, winerror has the priority over myerrno */
+ if (self->winerror && self->filename)
+ return PyUnicode_FromFormat("[WinError %S] %S: %R",
+ self->winerror ? self->winerror: Py_None,
+ self->strerror ? self->strerror: Py_None,
+ self->filename);
+ if (self->winerror && self->strerror)
+ return PyUnicode_FromFormat("[WinError %S] %S",
+ self->winerror ? self->winerror: Py_None,
+ self->strerror ? self->strerror: Py_None);
+#endif
if (self->filename)
return PyUnicode_FromFormat("[Errno %S] %S: %R",
self->myerrno ? self->myerrno: Py_None,
self->strerror ? self->strerror: Py_None,
self->filename);
- else if (self->myerrno && self->strerror)
+ if (self->myerrno && self->strerror)
return PyUnicode_FromFormat("[Errno %S] %S",
self->myerrno ? self->myerrno: Py_None,
self->strerror ? self->strerror: Py_None);
- else
- return BaseException_str((PyBaseExceptionObject *)self);
+ return BaseException_str((PyBaseExceptionObject *)self);
}
-static PyMemberDef EnvironmentError_members[] = {
- {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
- PyDoc_STR("exception errno")},
- {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
- PyDoc_STR("exception strerror")},
- {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
- PyDoc_STR("exception filename")},
- {NULL} /* Sentinel */
-};
-
-
static PyObject *
-EnvironmentError_reduce(PyEnvironmentErrorObject *self)
+OSError_reduce(PyOSErrorObject *self)
{
PyObject *args = self->args;
PyObject *res = NULL, *tmp;
/* self->args is only the first two real arguments if there was a
- * file name given to EnvironmentError. */
+ * file name given to OSError. */
if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
args = PyTuple_New(3);
if (!args)
@@ -699,144 +1071,93 @@ EnvironmentError_reduce(PyEnvironmentErrorObject *self)
return res;
}
-
-static PyMethodDef EnvironmentError_methods[] = {
- {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
- {NULL}
-};
-
-ComplexExtendsException(PyExc_Exception, EnvironmentError,
- EnvironmentError, EnvironmentError_dealloc,
- EnvironmentError_methods, EnvironmentError_members,
- EnvironmentError_str,
- "Base class for I/O related errors.");
-
-
-/*
- * IOError extends EnvironmentError
- */
-MiddlingExtendsException(PyExc_EnvironmentError, IOError,
- EnvironmentError, "I/O operation failed.");
-
-
-/*
- * OSError extends EnvironmentError
- */
-MiddlingExtendsException(PyExc_EnvironmentError, OSError,
- EnvironmentError, "OS system call failed.");
-
-
-/*
- * WindowsError extends OSError
- */
-#ifdef MS_WINDOWS
-#include "errmap.h"
-
-static int
-WindowsError_clear(PyWindowsErrorObject *self)
-{
- Py_CLEAR(self->myerrno);
- Py_CLEAR(self->strerror);
- Py_CLEAR(self->filename);
- Py_CLEAR(self->winerror);
- return BaseException_clear((PyBaseExceptionObject *)self);
-}
-
-static void
-WindowsError_dealloc(PyWindowsErrorObject *self)
-{
- _PyObject_GC_UNTRACK(self);
- WindowsError_clear(self);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-static int
-WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
+static PyObject *
+OSError_written_get(PyOSErrorObject *self, void *context)
{
- Py_VISIT(self->myerrno);
- Py_VISIT(self->strerror);
- Py_VISIT(self->filename);
- Py_VISIT(self->winerror);
- return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
+ if (self->written == -1) {
+ PyErr_SetString(PyExc_AttributeError, "characters_written");
+ return NULL;
+ }
+ return PyLong_FromSsize_t(self->written);
}
static int
-WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
+OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
{
- PyObject *o_errcode = NULL;
- long errcode;
- long posix_errno;
-
- if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
- == -1)
+ Py_ssize_t n;
+ n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
+ if (n == -1 && PyErr_Occurred())
return -1;
-
- if (self->myerrno == NULL)
- return 0;
-
- /* Set errno to the POSIX errno, and winerror to the Win32
- error code. */
- errcode = PyLong_AsLong(self->myerrno);
- if (errcode == -1 && PyErr_Occurred())
- return -1;
- posix_errno = winerror_to_errno(errcode);
-
- Py_CLEAR(self->winerror);
- self->winerror = self->myerrno;
-
- o_errcode = PyLong_FromLong(posix_errno);
- if (!o_errcode)
- return -1;
-
- self->myerrno = o_errcode;
-
+ self->written = n;
return 0;
}
-
-static PyObject *
-WindowsError_str(PyWindowsErrorObject *self)
-{
- if (self->filename)
- return PyUnicode_FromFormat("[Error %S] %S: %R",
- self->winerror ? self->winerror: Py_None,
- self->strerror ? self->strerror: Py_None,
- self->filename);
- else if (self->winerror && self->strerror)
- return PyUnicode_FromFormat("[Error %S] %S",
- self->winerror ? self->winerror: Py_None,
- self->strerror ? self->strerror: Py_None);
- else
- return EnvironmentError_str((PyEnvironmentErrorObject *)self);
-}
-
-static PyMemberDef WindowsError_members[] = {
- {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
+static PyMemberDef OSError_members[] = {
+ {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
PyDoc_STR("POSIX exception code")},
- {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
+ {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
PyDoc_STR("exception strerror")},
- {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
+ {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
PyDoc_STR("exception filename")},
- {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
+#ifdef MS_WINDOWS
+ {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
PyDoc_STR("Win32 exception code")},
+#endif
{NULL} /* Sentinel */
};
-ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
- WindowsError_dealloc, 0, WindowsError_members,
- WindowsError_str, "MS-Windows OS system call failed.");
+static PyMethodDef OSError_methods[] = {
+ {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
+ {NULL}
+};
-#endif /* MS_WINDOWS */
+static PyGetSetDef OSError_getset[] = {
+ {"characters_written", (getter) OSError_written_get,
+ (setter) OSError_written_set, NULL},
+ {NULL}
+};
+
+
+ComplexExtendsException(PyExc_Exception, OSError,
+ OSError, OSError_new,
+ OSError_methods, OSError_members, OSError_getset,
+ OSError_str,
+ "Base class for I/O related errors.");
/*
- * VMSError extends OSError (I think)
+ * Various OSError subclasses
*/
-#ifdef __VMS
-MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
- "OpenVMS OS system call failed.");
-#endif
-
+MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
+ "I/O operation would block.");
+MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
+ "Connection error.");
+MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
+ "Child process error.");
+MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
+ "Broken pipe.");
+MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
+ "Connection aborted.");
+MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
+ "Connection refused.");
+MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
+ "Connection reset.");
+MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
+ "File already exists.");
+MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
+ "File not found.");
+MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
+ "Operation doesn't work on directories.");
+MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
+ "Operation only works on directories.");
+MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
+ "Interrupted by signal.");
+MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
+ "Not enough permissions.");
+MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
+ "Process not found.");
+MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
+ "Timeout expired.");
/*
* EOFError extends Exception
@@ -967,21 +1288,23 @@ SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
static PyObject*
my_basename(PyObject *name)
{
- Py_UNICODE *unicode;
Py_ssize_t i, size, offset;
+ int kind;
+ void *data;
- unicode = PyUnicode_AS_UNICODE(name);
- size = PyUnicode_GET_SIZE(name);
+ if (PyUnicode_READY(name))
+ return NULL;
+ kind = PyUnicode_KIND(name);
+ data = PyUnicode_DATA(name);
+ size = PyUnicode_GET_LENGTH(name);
offset = 0;
for(i=0; i < size; i++) {
- if (unicode[i] == SEP)
+ if (PyUnicode_READ(kind, data, i) == SEP)
offset = i + 1;
}
- if (offset != 0) {
- return PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(name) + offset,
- size - offset);
- } else {
+ if (offset != 0)
+ return PyUnicode_Substring(name, offset, size);
+ else {
Py_INCREF(name);
return name;
}
@@ -1049,7 +1372,7 @@ static PyMemberDef SyntaxError_members[] = {
};
ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
- SyntaxError_dealloc, 0, SyntaxError_members,
+ 0, 0, SyntaxError_members, 0,
SyntaxError_str, "Invalid syntax.");
@@ -1103,7 +1426,7 @@ KeyError_str(PyBaseExceptionObject *self)
}
ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
- 0, 0, 0, KeyError_str, "Mapping key not found.");
+ 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
/*
@@ -1202,7 +1525,7 @@ PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
if (!obj)
return -1;
*start = ((PyUnicodeErrorObject *)exc)->start;
- size = PyUnicode_GET_SIZE(obj);
+ size = PyUnicode_GET_LENGTH(obj);
if (*start<0)
*start = 0; /*XXX check for values <0*/
if (*start>=size)
@@ -1270,7 +1593,7 @@ PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
if (!obj)
return -1;
*end = ((PyUnicodeErrorObject *)exc)->end;
- size = PyUnicode_GET_SIZE(obj);
+ size = PyUnicode_GET_LENGTH(obj);
if (*end<1)
*end = 1;
if (*end>size)
@@ -1442,6 +1765,11 @@ UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
return -1;
}
+ if (PyUnicode_READY(err->object) < -1) {
+ err->encoding = NULL;
+ return -1;
+ }
+
Py_INCREF(err->encoding);
Py_INCREF(err->object);
Py_INCREF(err->reason);
@@ -1466,8 +1794,8 @@ UnicodeEncodeError_str(PyObject *self)
if (encoding_str == NULL)
goto done;
- if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
- int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
+ if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
+ Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
const char *fmt;
if (badchar <= 0xff)
fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
@@ -1478,7 +1806,7 @@ UnicodeEncodeError_str(PyObject *self)
result = PyUnicode_FromFormat(
fmt,
encoding_str,
- badchar,
+ (int)badchar,
uself->start,
reason_str);
}
@@ -1675,8 +2003,8 @@ UnicodeTranslateError_str(PyObject *self)
if (reason_str == NULL)
goto done;
- if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
- int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
+ if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
+ Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
const char *fmt;
if (badchar <= 0xff)
fmt = "can't translate character '\\x%02x' in position %zd: %U";
@@ -1686,7 +2014,7 @@ UnicodeTranslateError_str(PyObject *self)
fmt = "can't translate character '\\U%08x' in position %zd: %U";
result = PyUnicode_FromFormat(
fmt,
- badchar,
+ (int)badchar,
uself->start,
reason_str
);
@@ -1717,6 +2045,7 @@ static PyTypeObject _PyExc_UnicodeTranslateError = {
};
PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
+/* Deprecated. */
PyObject *
PyUnicodeTranslateError_Create(
const Py_UNICODE *object, Py_ssize_t length,
@@ -1726,6 +2055,14 @@ PyUnicodeTranslateError_Create(
object, length, start, end, reason);
}
+PyObject *
+_PyUnicodeTranslateError_Create(
+ PyObject *object,
+ Py_ssize_t start, Py_ssize_t end, const char *reason)
+{
+ return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
+ object, start, end, reason);
+}
/*
* AssertionError extends Exception
@@ -1975,11 +2312,80 @@ PyObject *PyExc_RecursionErrorInst = NULL;
if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
Py_FatalError("Module dictionary insertion problem.");
+#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
+ Py_XDECREF(PyExc_ ## NAME); \
+ PyExc_ ## NAME = PyExc_ ## TYPE; \
+ if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
+ Py_FatalError("Module dictionary insertion problem.");
+
+#define ADD_ERRNO(TYPE, CODE) { \
+ PyObject *_code = PyLong_FromLong(CODE); \
+ assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
+ if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
+ Py_FatalError("errmap insertion problem."); \
+ Py_DECREF(_code); \
+ }
+
+#ifdef MS_WINDOWS
+#include <Winsock2.h>
+/* The following constants were added to errno.h in VS2010 but have
+ preferred WSA equivalents. */
+#undef EADDRINUSE
+#undef EADDRNOTAVAIL
+#undef EAFNOSUPPORT
+#undef EALREADY
+#undef ECONNABORTED
+#undef ECONNREFUSED
+#undef ECONNRESET
+#undef EDESTADDRREQ
+#undef EHOSTUNREACH
+#undef EINPROGRESS
+#undef EISCONN
+#undef ELOOP
+#undef EMSGSIZE
+#undef ENETDOWN
+#undef ENETRESET
+#undef ENETUNREACH
+#undef ENOBUFS
+#undef ENOPROTOOPT
+#undef ENOTCONN
+#undef ENOTSOCK
+#undef EOPNOTSUPP
+#undef EPROTONOSUPPORT
+#undef EPROTOTYPE
+#undef ETIMEDOUT
+#undef EWOULDBLOCK
+
+#if defined(WSAEALREADY) && !defined(EALREADY)
+#define EALREADY WSAEALREADY
+#endif
+#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
+#define ECONNABORTED WSAECONNABORTED
+#endif
+#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
+#define ECONNREFUSED WSAECONNREFUSED
+#endif
+#if defined(WSAECONNRESET) && !defined(ECONNRESET)
+#define ECONNRESET WSAECONNRESET
+#endif
+#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
+#define EINPROGRESS WSAEINPROGRESS
+#endif
+#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
+#define ESHUTDOWN WSAESHUTDOWN
+#endif
+#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
+#define ETIMEDOUT WSAETIMEDOUT
+#endif
+#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#endif
+#endif /* MS_WINDOWS */
void
-_PyExc_Init(void)
+_PyExc_Init(PyObject *bltinmod)
{
- PyObject *bltinmod, *bdict;
+ PyObject *bdict;
PRE_INIT(BaseException)
PRE_INIT(Exception)
@@ -1989,15 +2395,7 @@ _PyExc_Init(void)
PRE_INIT(SystemExit)
PRE_INIT(KeyboardInterrupt)
PRE_INIT(ImportError)
- PRE_INIT(EnvironmentError)
- PRE_INIT(IOError)
PRE_INIT(OSError)
-#ifdef MS_WINDOWS
- PRE_INIT(WindowsError)
-#endif
-#ifdef __VMS
- PRE_INIT(VMSError)
-#endif
PRE_INIT(EOFError)
PRE_INIT(RuntimeError)
PRE_INIT(NotImplementedError)
@@ -2037,9 +2435,24 @@ _PyExc_Init(void)
PRE_INIT(BytesWarning)
PRE_INIT(ResourceWarning)
- bltinmod = PyImport_ImportModule("builtins");
- if (bltinmod == NULL)
- Py_FatalError("exceptions bootstrapping error.");
+ /* OSError subclasses */
+ PRE_INIT(ConnectionError);
+
+ PRE_INIT(BlockingIOError);
+ PRE_INIT(BrokenPipeError);
+ PRE_INIT(ChildProcessError);
+ PRE_INIT(ConnectionAbortedError);
+ PRE_INIT(ConnectionRefusedError);
+ PRE_INIT(ConnectionResetError);
+ PRE_INIT(FileExistsError);
+ PRE_INIT(FileNotFoundError);
+ PRE_INIT(IsADirectoryError);
+ PRE_INIT(NotADirectoryError);
+ PRE_INIT(InterruptedError);
+ PRE_INIT(PermissionError);
+ PRE_INIT(ProcessLookupError);
+ PRE_INIT(TimeoutError);
+
bdict = PyModule_GetDict(bltinmod);
if (bdict == NULL)
Py_FatalError("exceptions bootstrapping error.");
@@ -2052,14 +2465,14 @@ _PyExc_Init(void)
POST_INIT(SystemExit)
POST_INIT(KeyboardInterrupt)
POST_INIT(ImportError)
- POST_INIT(EnvironmentError)
- POST_INIT(IOError)
POST_INIT(OSError)
+ INIT_ALIAS(EnvironmentError, OSError)
+ INIT_ALIAS(IOError, OSError)
#ifdef MS_WINDOWS
- POST_INIT(WindowsError)
+ INIT_ALIAS(WindowsError, OSError)
#endif
#ifdef __VMS
- POST_INIT(VMSError)
+ INIT_ALIAS(VMSError, OSError)
#endif
POST_INIT(EOFError)
POST_INIT(RuntimeError)
@@ -2100,6 +2513,49 @@ _PyExc_Init(void)
POST_INIT(BytesWarning)
POST_INIT(ResourceWarning)
+ if (!errnomap) {
+ errnomap = PyDict_New();
+ if (!errnomap)
+ Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
+ }
+
+ /* OSError subclasses */
+ POST_INIT(ConnectionError);
+
+ POST_INIT(BlockingIOError);
+ ADD_ERRNO(BlockingIOError, EAGAIN);
+ ADD_ERRNO(BlockingIOError, EALREADY);
+ ADD_ERRNO(BlockingIOError, EINPROGRESS);
+ ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
+ POST_INIT(BrokenPipeError);
+ ADD_ERRNO(BrokenPipeError, EPIPE);
+ ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
+ POST_INIT(ChildProcessError);
+ ADD_ERRNO(ChildProcessError, ECHILD);
+ POST_INIT(ConnectionAbortedError);
+ ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
+ POST_INIT(ConnectionRefusedError);
+ ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
+ POST_INIT(ConnectionResetError);
+ ADD_ERRNO(ConnectionResetError, ECONNRESET);
+ POST_INIT(FileExistsError);
+ ADD_ERRNO(FileExistsError, EEXIST);
+ POST_INIT(FileNotFoundError);
+ ADD_ERRNO(FileNotFoundError, ENOENT);
+ POST_INIT(IsADirectoryError);
+ ADD_ERRNO(IsADirectoryError, EISDIR);
+ POST_INIT(NotADirectoryError);
+ ADD_ERRNO(NotADirectoryError, ENOTDIR);
+ POST_INIT(InterruptedError);
+ ADD_ERRNO(InterruptedError, EINTR);
+ POST_INIT(PermissionError);
+ ADD_ERRNO(PermissionError, EACCES);
+ ADD_ERRNO(PermissionError, EPERM);
+ POST_INIT(ProcessLookupError);
+ ADD_ERRNO(ProcessLookupError, ESRCH);
+ POST_INIT(TimeoutError);
+ ADD_ERRNO(TimeoutError, ETIMEDOUT);
+
preallocate_memerrors();
if (!PyExc_RecursionErrorInst) {
@@ -2126,7 +2582,6 @@ _PyExc_Init(void)
Py_DECREF(args_tuple);
}
}
- Py_DECREF(bltinmod);
}
void
@@ -2134,4 +2589,5 @@ _PyExc_Fini(void)
{
Py_CLEAR(PyExc_RecursionErrorInst);
free_preallocated_memerrors();
+ Py_CLEAR(errnomap);
}
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index d20f196..e1c47ce 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -30,11 +30,12 @@ PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding,
char *errors, char *newline, int closefd)
{
PyObject *io, *stream;
+ _Py_IDENTIFIER(open);
io = PyImport_ImportModule("io");
if (io == NULL)
return NULL;
- stream = PyObject_CallMethod(io, "open", "isisssi", fd, mode,
+ stream = _PyObject_CallMethodId(io, &PyId_open, "isisssi", fd, mode,
buffering, encoding, errors,
newline, closefd);
Py_DECREF(io);
@@ -58,8 +59,9 @@ PyFile_GetLine(PyObject *f, int n)
{
PyObject *reader;
PyObject *args;
+ _Py_IDENTIFIER(readline);
- reader = PyObject_GetAttrString(f, "readline");
+ reader = _PyObject_GetAttrId(f, &PyId_readline);
if (reader == NULL)
return NULL;
if (n <= 0)
@@ -103,23 +105,18 @@ PyFile_GetLine(PyObject *f, int n)
}
}
if (n < 0 && result != NULL && PyUnicode_Check(result)) {
- Py_UNICODE *s = PyUnicode_AS_UNICODE(result);
- Py_ssize_t len = PyUnicode_GET_SIZE(result);
+ Py_ssize_t len = PyUnicode_GET_LENGTH(result);
if (len == 0) {
Py_DECREF(result);
result = NULL;
PyErr_SetString(PyExc_EOFError,
"EOF when reading a line");
}
- else if (s[len-1] == '\n') {
- if (result->ob_refcnt == 1)
- PyUnicode_Resize(&result, len-1);
- else {
- PyObject *v;
- v = PyUnicode_FromUnicode(s, len-1);
- Py_DECREF(result);
- result = v;
- }
+ else if (PyUnicode_READ_CHAR(result, len-1) == '\n') {
+ PyObject *v;
+ v = PyUnicode_Substring(result, 0, len-1);
+ Py_DECREF(result);
+ result = v;
}
}
return result;
@@ -131,11 +128,13 @@ int
PyFile_WriteObject(PyObject *v, PyObject *f, int flags)
{
PyObject *writer, *value, *args, *result;
+ _Py_IDENTIFIER(write);
+
if (f == NULL) {
PyErr_SetString(PyExc_TypeError, "writeobject with NULL file");
return -1;
}
- writer = PyObject_GetAttrString(f, "write");
+ writer = _PyObject_GetAttrId(f, &PyId_write);
if (writer == NULL)
return -1;
if (flags & Py_PRINT_RAW) {
@@ -198,11 +197,12 @@ PyObject_AsFileDescriptor(PyObject *o)
{
int fd;
PyObject *meth;
+ _Py_IDENTIFIER(fileno);
if (PyLong_Check(o)) {
fd = PyLong_AsLong(o);
}
- else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL)
+ else if ((meth = _PyObject_GetAttrId(o, &PyId_fileno)) != NULL)
{
PyObject *fno = PyEval_CallObject(meth, NULL);
Py_DECREF(meth);
@@ -297,8 +297,8 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj)
*p++ = c;
if (c == '\n') break;
}
- if ( c == EOF && skipnextlf )
- newlinetypes |= NEWLINE_CR;
+ /* if ( c == EOF && skipnextlf )
+ newlinetypes |= NEWLINE_CR; */
FUNLOCKFILE(stream);
*p = '\0';
if ( skipnextlf ) {
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index e146a4f..a42be71 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -15,59 +15,17 @@
#define MIN(x, y) ((x) < (y) ? (x) : (y))
-#ifdef _OSF_SOURCE
-/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
-extern int finite(double);
-#endif
-
/* Special free list
-
- Since some Python programs can spend much of their time allocating
- and deallocating floats, these operations should be very fast.
- Therefore we use a dedicated allocation scheme with a much lower
- overhead (in space and time) than straight malloc(): a simple
- dedicated free list, filled when necessary with memory from malloc().
-
- block_list is a singly-linked list of all PyFloatBlocks ever allocated,
- linked via their next members. PyFloatBlocks are never returned to the
- system before shutdown (PyFloat_Fini).
-
free_list is a singly-linked list of available PyFloatObjects, linked
via abuse of their ob_type members.
*/
-#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
-#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
-#define N_FLOATOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyFloatObject))
-
-struct _floatblock {
- struct _floatblock *next;
- PyFloatObject objects[N_FLOATOBJECTS];
-};
-
-typedef struct _floatblock PyFloatBlock;
-
-static PyFloatBlock *block_list = NULL;
+#ifndef PyFloat_MAXFREELIST
+#define PyFloat_MAXFREELIST 100
+#endif
+static int numfree = 0;
static PyFloatObject *free_list = NULL;
-static PyFloatObject *
-fill_free_list(void)
-{
- PyFloatObject *p, *q;
- /* XXX Float blocks escape the object heap. Use PyObject_MALLOC ??? */
- p = (PyFloatObject *) PyMem_MALLOC(sizeof(PyFloatBlock));
- if (p == NULL)
- return (PyFloatObject *) PyErr_NoMemory();
- ((PyFloatBlock *)p)->next = block_list;
- block_list = (PyFloatBlock *)p;
- p = &((PyFloatBlock *)p)->objects[0];
- q = p + N_FLOATOBJECTS;
- while (--q > p)
- Py_TYPE(q) = (struct _typeobject *)(q-1);
- Py_TYPE(q) = NULL;
- return p + N_FLOATOBJECTS - 1;
-}
-
double
PyFloat_GetMax(void)
{
@@ -156,14 +114,16 @@ PyFloat_GetInfo(void)
PyObject *
PyFloat_FromDouble(double fval)
{
- register PyFloatObject *op;
- if (free_list == NULL) {
- if ((free_list = fill_free_list()) == NULL)
- return NULL;
+ register PyFloatObject *op = free_list;
+ if (op != NULL) {
+ free_list = (PyFloatObject *) Py_TYPE(op);
+ numfree--;
+ } else {
+ op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject));
+ if (!op)
+ return PyErr_NoMemory();
}
/* Inline PyObject_New */
- op = free_list;
- free_list = (PyFloatObject *)Py_TYPE(op);
PyObject_INIT(op, &PyFloat_Type);
op->ob_fval = fval;
return (PyObject *) op;
@@ -179,25 +139,14 @@ PyFloat_FromString(PyObject *v)
PyObject *result = NULL;
if (PyUnicode_Check(v)) {
- Py_ssize_t i, buflen = PyUnicode_GET_SIZE(v);
- Py_UNICODE *bufptr;
- s_buffer = PyUnicode_TransformDecimalToASCII(
- PyUnicode_AS_UNICODE(v), buflen);
+ s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
if (s_buffer == NULL)
return NULL;
- /* Replace non-ASCII whitespace with ' ' */
- bufptr = PyUnicode_AS_UNICODE(s_buffer);
- for (i = 0; i < buflen; i++) {
- Py_UNICODE ch = bufptr[i];
- if (ch > 127 && Py_UNICODE_ISSPACE(ch))
- bufptr[i] = ' ';
- }
- s = _PyUnicode_AsStringAndSize(s_buffer, &len);
+ s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
if (s == NULL) {
Py_DECREF(s_buffer);
return NULL;
}
- last = s + len;
}
else if (PyObject_AsCharBuffer(v, &s, &len)) {
PyErr_SetString(PyExc_TypeError,
@@ -233,6 +182,11 @@ static void
float_dealloc(PyFloatObject *op)
{
if (PyFloat_CheckExact(op)) {
+ if (numfree >= PyFloat_MAXFREELIST) {
+ PyObject_FREE(op);
+ return;
+ }
+ numfree++;
Py_TYPE(op) = (struct _typeobject *)free_list;
free_list = op;
}
@@ -313,13 +267,15 @@ static PyObject *
float_repr(PyFloatObject *v)
{
PyObject *result;
- char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
- 'r', 0,
- Py_DTSF_ADD_DOT_0,
- NULL);
+ char *buf;
+
+ buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
+ 'r', 0,
+ Py_DTSF_ADD_DOT_0,
+ NULL);
if (!buf)
return PyErr_NoMemory();
- result = PyUnicode_FromString(buf);
+ result = _PyUnicode_FromASCII(buf, strlen(buf));
PyMem_Free(buf);
return result;
}
@@ -523,8 +479,7 @@ float_richcompare(PyObject *v, PyObject *w, int op)
return PyBool_FromLong(r);
Unimplemented:
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static Py_hash_t
@@ -1080,7 +1035,7 @@ static char
char_from_hex(int x)
{
assert(0 <= x && x < 16);
- return "0123456789abcdef"[x];
+ return Py_hexdigits[x];
}
static int
@@ -1750,12 +1705,22 @@ static PyObject *
float__format__(PyObject *self, PyObject *args)
{
PyObject *format_spec;
+ _PyUnicodeWriter writer;
+ int ret;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- return _PyFloat_FormatAdvanced(self,
- PyUnicode_AS_UNICODE(format_spec),
- PyUnicode_GET_SIZE(format_spec));
+
+ _PyUnicodeWriter_Init(&writer, 0);
+ ret = _PyFloat_FormatAdvancedWriter(
+ &writer,
+ self,
+ format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
+ if (ret == -1) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
}
PyDoc_STRVAR(float__format__doc,
@@ -1950,98 +1915,34 @@ _PyFloat_Init(void)
int
PyFloat_ClearFreeList(void)
{
- PyFloatObject *p;
- PyFloatBlock *list, *next;
- int i;
- int u; /* remaining unfreed floats per block */
- int freelist_size = 0;
-
- list = block_list;
- block_list = NULL;
- free_list = NULL;
- while (list != NULL) {
- u = 0;
- for (i = 0, p = &list->objects[0];
- i < N_FLOATOBJECTS;
- i++, p++) {
- if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 0)
- u++;
- }
- next = list->next;
- if (u) {
- list->next = block_list;
- block_list = list;
- for (i = 0, p = &list->objects[0];
- i < N_FLOATOBJECTS;
- i++, p++) {
- if (!PyFloat_CheckExact(p) ||
- Py_REFCNT(p) == 0) {
- Py_TYPE(p) = (struct _typeobject *)
- free_list;
- free_list = p;
- }
- }
- }
- else {
- PyMem_FREE(list);
- }
- freelist_size += u;
- list = next;
+ PyFloatObject *f = free_list, *next;
+ int i = numfree;
+ while (f) {
+ next = (PyFloatObject*) Py_TYPE(f);
+ PyObject_FREE(f);
+ f = next;
}
- return freelist_size;
+ free_list = NULL;
+ numfree = 0;
+ return i;
}
void
PyFloat_Fini(void)
{
- PyFloatObject *p;
- PyFloatBlock *list;
- int i;
- int u; /* total unfreed floats per block */
-
- u = PyFloat_ClearFreeList();
+ (void)PyFloat_ClearFreeList();
+}
- if (!Py_VerboseFlag)
- return;
- fprintf(stderr, "# cleanup floats");
- if (!u) {
- fprintf(stderr, "\n");
- }
- else {
- fprintf(stderr,
- ": %d unfreed float%s\n",
- u, u == 1 ? "" : "s");
- }
- if (Py_VerboseFlag > 1) {
- list = block_list;
- while (list != NULL) {
- for (i = 0, p = &list->objects[0];
- i < N_FLOATOBJECTS;
- i++, p++) {
- if (PyFloat_CheckExact(p) &&
- Py_REFCNT(p) != 0) {
- char *buf = PyOS_double_to_string(
- PyFloat_AS_DOUBLE(p), 'r',
- 0, 0, NULL);
- if (buf) {
- /* XXX(twouters) cast
- refcount to long
- until %zd is
- universally
- available
- */
- fprintf(stderr,
- "# <float at %p, refcnt=%ld, val=%s>\n",
- p, (long)Py_REFCNT(p), buf);
- PyMem_Free(buf);
- }
- }
- }
- list = list->next;
- }
- }
+/* Print summary info about the state of the optimized allocator */
+void
+_PyFloat_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PyFloatObject",
+ numfree, sizeof(PyFloatObject));
}
+
/*----------------------------------------------------------------------------
* _PyFloat_{Pack,Unpack}{4,8}. See floatobject.h.
*/
@@ -2251,7 +2152,7 @@ _PyFloat_Pack8(double x, unsigned char *p, int le)
/* Eighth byte */
*p = flo & 0xFF;
- p += incr;
+ /* p += incr; */
/* Done */
return 0;
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index adce42b..808e595 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -15,11 +15,11 @@
#define OFF(x) offsetof(PyFrameObject, x)
static PyMemberDef frame_memberlist[] = {
- {"f_back", T_OBJECT, OFF(f_back), READONLY},
- {"f_code", T_OBJECT, OFF(f_code), READONLY},
- {"f_builtins", T_OBJECT, OFF(f_builtins),READONLY},
- {"f_globals", T_OBJECT, OFF(f_globals), READONLY},
- {"f_lasti", T_INT, OFF(f_lasti), READONLY},
+ {"f_back", T_OBJECT, OFF(f_back), READONLY},
+ {"f_code", T_OBJECT, OFF(f_code), READONLY},
+ {"f_builtins", T_OBJECT, OFF(f_builtins), READONLY},
+ {"f_globals", T_OBJECT, OFF(f_globals), READONLY},
+ {"f_lasti", T_INT, OFF(f_lasti), READONLY},
{NULL} /* Sentinel */
};
@@ -614,10 +614,8 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
if (builtins) {
if (PyModule_Check(builtins)) {
builtins = PyModule_GetDict(builtins);
- assert(!builtins || PyDict_Check(builtins));
+ assert(builtins != NULL);
}
- else if (!PyDict_Check(builtins))
- builtins = NULL;
}
if (builtins == NULL) {
/* No builtins! Make up a minimal one
@@ -636,7 +634,7 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
/* If we share the globals, we share the builtins.
Save a lookup and a call. */
builtins = back->f_builtins;
- assert(builtins != NULL && PyDict_Check(builtins));
+ assert(builtins != NULL);
Py_INCREF(builtins);
}
if (code->co_zombieframe != NULL) {
@@ -665,11 +663,13 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
f = free_list;
free_list = free_list->f_back;
if (Py_SIZE(f) < extras) {
- f = PyObject_GC_Resize(PyFrameObject, f, extras);
- if (f == NULL) {
+ PyFrameObject *new_f = PyObject_GC_Resize(PyFrameObject, f, extras);
+ if (new_f == NULL) {
+ PyObject_GC_Del(f);
Py_DECREF(builtins);
return NULL;
}
+ f = new_f;
}
_Py_NewReference((PyObject *)f);
}
@@ -955,3 +955,13 @@ PyFrame_Fini(void)
Py_XDECREF(builtin_object);
builtin_object = NULL;
}
+
+/* Print summary info about the state of the optimized allocator */
+void
+_PyFrame_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PyFrameObject",
+ numfree, sizeof(PyFrameObject));
+}
+
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 2292a9e..49415b9 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -6,7 +6,7 @@
#include "structmember.h"
PyObject *
-PyFunction_New(PyObject *code, PyObject *globals)
+PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
{
PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
&PyFunction_Type);
@@ -54,6 +54,11 @@ PyFunction_New(PyObject *code, PyObject *globals)
Py_INCREF(module);
op->func_module = module;
}
+ if (qualname)
+ op->func_qualname = qualname;
+ else
+ op->func_qualname = op->func_name;
+ Py_INCREF(op->func_qualname);
}
else
return NULL;
@@ -62,6 +67,12 @@ PyFunction_New(PyObject *code, PyObject *globals)
}
PyObject *
+PyFunction_New(PyObject *code, PyObject *globals)
+{
+ return PyFunction_NewWithQualName(code, globals, NULL);
+}
+
+PyObject *
PyFunction_GetCode(PyObject *op)
{
if (!PyFunction_Check(op)) {
@@ -234,42 +245,6 @@ static PyMemberDef func_memberlist[] = {
};
static PyObject *
-func_get_dict(PyFunctionObject *op)
-{
- if (op->func_dict == NULL) {
- op->func_dict = PyDict_New();
- if (op->func_dict == NULL)
- return NULL;
- }
- Py_INCREF(op->func_dict);
- return op->func_dict;
-}
-
-static int
-func_set_dict(PyFunctionObject *op, PyObject *value)
-{
- PyObject *tmp;
-
- /* It is illegal to del f.func_dict */
- if (value == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "function's dictionary may not be deleted");
- return -1;
- }
- /* Can only set func_dict to a dictionary */
- if (!PyDict_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "setting function's dictionary to a non-dict");
- return -1;
- }
- tmp = op->func_dict;
- Py_INCREF(value);
- op->func_dict = value;
- Py_XDECREF(tmp);
- return 0;
-}
-
-static PyObject *
func_get_code(PyFunctionObject *op)
{
Py_INCREF(op->func_code);
@@ -334,6 +309,32 @@ func_set_name(PyFunctionObject *op, PyObject *value)
}
static PyObject *
+func_get_qualname(PyFunctionObject *op)
+{
+ Py_INCREF(op->func_qualname);
+ return op->func_qualname;
+}
+
+static int
+func_set_qualname(PyFunctionObject *op, PyObject *value)
+{
+ PyObject *tmp;
+
+ /* Not legal to del f.__qualname__ or to set it to anything
+ * other than a string object. */
+ if (value == NULL || !PyUnicode_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "__qualname__ must be set to a string object");
+ return -1;
+ }
+ tmp = op->func_qualname;
+ Py_INCREF(value);
+ op->func_qualname = value;
+ Py_DECREF(tmp);
+ return 0;
+}
+
+static PyObject *
func_get_defaults(PyFunctionObject *op)
{
if (op->func_defaults == NULL) {
@@ -439,8 +440,9 @@ static PyGetSetDef func_getsetlist[] = {
(setter)func_set_kwdefaults},
{"__annotations__", (getter)func_get_annotations,
(setter)func_set_annotations},
- {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{"__name__", (getter)func_get_name, (setter)func_set_name},
+ {"__qualname__", (getter)func_get_qualname, (setter)func_set_qualname},
{NULL} /* Sentinel */
};
@@ -561,6 +563,7 @@ func_dealloc(PyFunctionObject *op)
Py_XDECREF(op->func_dict);
Py_XDECREF(op->func_closure);
Py_XDECREF(op->func_annotations);
+ Py_XDECREF(op->func_qualname);
PyObject_GC_Del(op);
}
@@ -568,7 +571,7 @@ static PyObject*
func_repr(PyFunctionObject *op)
{
return PyUnicode_FromFormat("<function %U at %p>",
- op->func_name, op);
+ op->func_qualname, op);
}
static int
@@ -584,6 +587,7 @@ func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
Py_VISIT(f->func_dict);
Py_VISIT(f->func_closure);
Py_VISIT(f->func_annotations);
+ Py_VISIT(f->func_qualname);
return 0;
}
@@ -667,8 +671,8 @@ PyTypeObject PyFunction_Type = {
0, /* tp_hash */
function_call, /* tp_call */
0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
- PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
func_doc, /* tp_doc */
@@ -714,6 +718,7 @@ PyTypeObject PyFunction_Type = {
typedef struct {
PyObject_HEAD
PyObject *cm_callable;
+ PyObject *cm_dict;
} classmethod;
static void
@@ -721,6 +726,7 @@ cm_dealloc(classmethod *cm)
{
_PyObject_GC_UNTRACK((PyObject *)cm);
Py_XDECREF(cm->cm_callable);
+ Py_XDECREF(cm->cm_dict);
Py_TYPE(cm)->tp_free((PyObject *)cm);
}
@@ -728,6 +734,7 @@ static int
cm_traverse(classmethod *cm, visitproc visit, void *arg)
{
Py_VISIT(cm->cm_callable);
+ Py_VISIT(cm->cm_dict);
return 0;
}
@@ -735,6 +742,7 @@ static int
cm_clear(classmethod *cm)
{
Py_CLEAR(cm->cm_callable);
+ Py_CLEAR(cm->cm_dict);
return 0;
}
@@ -774,6 +782,28 @@ static PyMemberDef cm_memberlist[] = {
{NULL} /* Sentinel */
};
+static PyObject *
+cm_get___isabstractmethod__(classmethod *cm, void *closure)
+{
+ int res = _PyObject_IsAbstract(cm->cm_callable);
+ if (res == -1) {
+ return NULL;
+ }
+ else if (res) {
+ Py_RETURN_TRUE;
+ }
+ Py_RETURN_FALSE;
+}
+
+static PyGetSetDef cm_getsetlist[] = {
+ {"__isabstractmethod__",
+ (getter)cm_get___isabstractmethod__, NULL,
+ NULL,
+ NULL},
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
+ {NULL} /* Sentinel */
+};
+
PyDoc_STRVAR(classmethod_doc,
"classmethod(function) -> method\n\
\n\
@@ -812,7 +842,7 @@ PyTypeObject PyClassMethod_Type = {
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
@@ -825,12 +855,12 @@ PyTypeObject PyClassMethod_Type = {
0, /* tp_iternext */
0, /* tp_methods */
cm_memberlist, /* tp_members */
- 0, /* tp_getset */
+ cm_getsetlist, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
cm_descr_get, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(classmethod, cm_dict), /* tp_dictoffset */
cm_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
@@ -869,6 +899,7 @@ PyClassMethod_New(PyObject *callable)
typedef struct {
PyObject_HEAD
PyObject *sm_callable;
+ PyObject *sm_dict;
} staticmethod;
static void
@@ -876,6 +907,7 @@ sm_dealloc(staticmethod *sm)
{
_PyObject_GC_UNTRACK((PyObject *)sm);
Py_XDECREF(sm->sm_callable);
+ Py_XDECREF(sm->sm_dict);
Py_TYPE(sm)->tp_free((PyObject *)sm);
}
@@ -883,6 +915,7 @@ static int
sm_traverse(staticmethod *sm, visitproc visit, void *arg)
{
Py_VISIT(sm->sm_callable);
+ Py_VISIT(sm->sm_dict);
return 0;
}
@@ -890,6 +923,7 @@ static int
sm_clear(staticmethod *sm)
{
Py_CLEAR(sm->sm_callable);
+ Py_CLEAR(sm->sm_dict);
return 0;
}
@@ -927,6 +961,28 @@ static PyMemberDef sm_memberlist[] = {
{NULL} /* Sentinel */
};
+static PyObject *
+sm_get___isabstractmethod__(staticmethod *sm, void *closure)
+{
+ int res = _PyObject_IsAbstract(sm->sm_callable);
+ if (res == -1) {
+ return NULL;
+ }
+ else if (res) {
+ Py_RETURN_TRUE;
+ }
+ Py_RETURN_FALSE;
+}
+
+static PyGetSetDef sm_getsetlist[] = {
+ {"__isabstractmethod__",
+ (getter)sm_get___isabstractmethod__, NULL,
+ NULL,
+ NULL},
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
+ {NULL} /* Sentinel */
+};
+
PyDoc_STRVAR(staticmethod_doc,
"staticmethod(function) -> method\n\
\n\
@@ -962,7 +1018,7 @@ PyTypeObject PyStaticMethod_Type = {
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
@@ -975,12 +1031,12 @@ PyTypeObject PyStaticMethod_Type = {
0, /* tp_iternext */
0, /* tp_methods */
sm_memberlist, /* tp_members */
- 0, /* tp_getset */
+ sm_getsetlist, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
sm_descr_get, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(staticmethod, sm_dict), /* tp_dictoffset */
sm_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 6e25f13..597aed3 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -5,6 +5,8 @@
#include "structmember.h"
#include "opcode.h"
+static PyObject *gen_close(PyGenObject *gen, PyObject *args);
+
static int
gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
{
@@ -51,7 +53,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
"generator already executing");
return NULL;
}
- if (f==NULL || f->f_stacktop == NULL) {
+ if (f == NULL || f->f_stacktop == NULL) {
/* Only set exception if called from send() */
if (arg && !exc)
PyErr_SetNone(PyExc_StopIteration);
@@ -90,12 +92,19 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
/* If the generator just returned (as opposed to yielding), signal
* that the generator is exhausted. */
- if (result == Py_None && f->f_stacktop == NULL) {
- Py_DECREF(result);
- result = NULL;
- /* Set exception if not called by gen_iternext() */
- if (arg)
+ if (result && f->f_stacktop == NULL) {
+ if (result == Py_None) {
+ /* Delay exception instantiation if we can */
PyErr_SetNone(PyExc_StopIteration);
+ } else {
+ PyObject *e = PyObject_CallFunctionObjArgs(
+ PyExc_StopIteration, result, NULL);
+ if (e != NULL) {
+ PyErr_SetObject(PyExc_StopIteration, e);
+ Py_DECREF(e);
+ }
+ }
+ Py_CLEAR(result);
}
if (!result || f->f_stacktop == NULL) {
@@ -111,8 +120,8 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
Py_XDECREF(t);
Py_XDECREF(v);
Py_XDECREF(tb);
- Py_DECREF(f);
gen->gi_frame = NULL;
+ Py_DECREF(f);
}
return result;
@@ -122,8 +131,8 @@ PyDoc_STRVAR(send_doc,
"send(arg) -> send 'arg' into generator,\n\
return next yielded value or raise StopIteration.");
-static PyObject *
-gen_send(PyGenObject *gen, PyObject *arg)
+PyObject *
+_PyGen_Send(PyGenObject *gen, PyObject *arg)
{
return gen_send_ex(gen, arg, 0);
}
@@ -131,11 +140,72 @@ gen_send(PyGenObject *gen, PyObject *arg)
PyDoc_STRVAR(close_doc,
"close() -> raise GeneratorExit inside generator.");
+/*
+ * This helper function is used by gen_close and gen_throw to
+ * close a subiterator being delegated to by yield-from.
+ */
+
+static int
+gen_close_iter(PyObject *yf)
+{
+ PyObject *retval = NULL;
+ _Py_IDENTIFIER(close);
+
+ if (PyGen_CheckExact(yf)) {
+ retval = gen_close((PyGenObject *)yf, NULL);
+ if (retval == NULL)
+ return -1;
+ } else {
+ PyObject *meth = _PyObject_GetAttrId(yf, &PyId_close);
+ if (meth == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_WriteUnraisable(yf);
+ PyErr_Clear();
+ } else {
+ retval = PyObject_CallFunction(meth, "");
+ Py_DECREF(meth);
+ if (retval == NULL)
+ return -1;
+ }
+ }
+ Py_XDECREF(retval);
+ return 0;
+}
+
+static PyObject *
+gen_yf(PyGenObject *gen)
+{
+ PyObject *yf = NULL;
+ PyFrameObject *f = gen->gi_frame;
+
+ if (f) {
+ PyObject *bytecode = f->f_code->co_code;
+ unsigned char *code = (unsigned char *)PyBytes_AS_STRING(bytecode);
+
+ if (code[f->f_lasti + 1] != YIELD_FROM)
+ return NULL;
+ yf = f->f_stacktop[-1];
+ Py_INCREF(yf);
+ }
+
+ return yf;
+}
+
static PyObject *
gen_close(PyGenObject *gen, PyObject *args)
{
PyObject *retval;
- PyErr_SetNone(PyExc_GeneratorExit);
+ PyObject *yf = gen_yf(gen);
+ int err = 0;
+
+ if (yf) {
+ gen->gi_running = 1;
+ err = gen_close_iter(yf);
+ gen->gi_running = 0;
+ Py_DECREF(yf);
+ }
+ if (err == 0)
+ PyErr_SetNone(PyExc_GeneratorExit);
retval = gen_send_ex(gen, Py_None, 1);
if (retval) {
Py_DECREF(retval);
@@ -144,8 +214,7 @@ gen_close(PyGenObject *gen, PyObject *args)
return NULL;
}
if (PyErr_ExceptionMatches(PyExc_StopIteration)
- || PyErr_ExceptionMatches(PyExc_GeneratorExit))
- {
+ || PyErr_ExceptionMatches(PyExc_GeneratorExit)) {
PyErr_Clear(); /* ignore these errors */
Py_INCREF(Py_None);
return Py_None;
@@ -196,7 +265,7 @@ gen_del(PyObject *self)
_Py_NewReference(self);
self->ob_refcnt = refcnt;
}
- assert(PyType_IS_GC(self->ob_type) &&
+ assert(PyType_IS_GC(Py_TYPE(self)) &&
_Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
/* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
@@ -209,8 +278,8 @@ gen_del(PyObject *self)
* undone.
*/
#ifdef COUNT_ALLOCS
- --self->ob_type->tp_frees;
- --self->ob_type->tp_allocs;
+ --(Py_TYPE(self)->tp_frees);
+ --(Py_TYPE(self)->tp_allocs);
#endif
}
@@ -226,10 +295,64 @@ gen_throw(PyGenObject *gen, PyObject *args)
PyObject *typ;
PyObject *tb = NULL;
PyObject *val = NULL;
+ PyObject *yf = gen_yf(gen);
+ _Py_IDENTIFIER(throw);
if (!PyArg_UnpackTuple(args, "throw", 1, 3, &typ, &val, &tb))
return NULL;
+ if (yf) {
+ PyObject *ret;
+ int err;
+ if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+ gen->gi_running = 1;
+ err = gen_close_iter(yf);
+ gen->gi_running = 0;
+ Py_DECREF(yf);
+ if (err < 0)
+ return gen_send_ex(gen, Py_None, 1);
+ goto throw_here;
+ }
+ if (PyGen_CheckExact(yf)) {
+ gen->gi_running = 1;
+ ret = gen_throw((PyGenObject *)yf, args);
+ gen->gi_running = 0;
+ } else {
+ PyObject *meth = _PyObject_GetAttrId(yf, &PyId_throw);
+ if (meth == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ Py_DECREF(yf);
+ return NULL;
+ }
+ PyErr_Clear();
+ Py_DECREF(yf);
+ goto throw_here;
+ }
+ gen->gi_running = 1;
+ ret = PyObject_CallObject(meth, args);
+ gen->gi_running = 0;
+ Py_DECREF(meth);
+ }
+ Py_DECREF(yf);
+ if (!ret) {
+ PyObject *val;
+ /* Pop subiterator from stack */
+ ret = *(--gen->gi_frame->f_stacktop);
+ assert(ret == yf);
+ Py_DECREF(ret);
+ /* Termination repetition of YIELD_FROM */
+ gen->gi_frame->f_lasti++;
+ if (_PyGen_FetchStopIterationValue(&val) == 0) {
+ ret = gen_send_ex(gen, val, 0);
+ Py_DECREF(val);
+ } else {
+ ret = gen_send_ex(gen, Py_None, 1);
+ }
+ }
+ return ret;
+ }
+
+throw_here:
/* First, check the traceback argument, replacing None with
NULL. */
if (tb == Py_None) {
@@ -272,7 +395,7 @@ gen_throw(PyGenObject *gen, PyObject *args)
PyErr_Format(PyExc_TypeError,
"exceptions must be classes or instances "
"deriving from BaseException, not %s",
- typ->ob_type->tp_name);
+ Py_TYPE(typ)->tp_name);
goto failed_throw;
}
@@ -291,9 +414,46 @@ failed_throw:
static PyObject *
gen_iternext(PyGenObject *gen)
{
- return gen_send_ex(gen, NULL, 0);
+ PyObject *val = NULL;
+ PyObject *ret;
+ ret = gen_send_ex(gen, val, 0);
+ Py_XDECREF(val);
+ return ret;
}
+/*
+ * If StopIteration exception is set, fetches its 'value'
+ * attribute if any, otherwise sets pvalue to None.
+ *
+ * Returns 0 if no exception or StopIteration is set.
+ * If any other exception is set, returns -1 and leaves
+ * pvalue unchanged.
+ */
+
+int
+_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+ PyObject *et, *ev, *tb;
+ PyObject *value = NULL;
+
+ if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
+ PyErr_Fetch(&et, &ev, &tb);
+ Py_XDECREF(et);
+ Py_XDECREF(tb);
+ if (ev) {
+ value = ((PyStopIterationObject *)ev)->value;
+ Py_INCREF(value);
+ Py_DECREF(ev);
+ }
+ } else if (PyErr_Occurred()) {
+ return -1;
+ }
+ if (value == NULL) {
+ value = Py_None;
+ Py_INCREF(value);
+ }
+ *pvalue = value;
+ return 0;
+}
static PyObject *
gen_repr(PyGenObject *gen)
@@ -324,13 +484,13 @@ static PyGetSetDef gen_getsetlist[] = {
static PyMemberDef gen_memberlist[] = {
{"gi_frame", T_OBJECT, offsetof(PyGenObject, gi_frame), READONLY},
- {"gi_running", T_INT, offsetof(PyGenObject, gi_running), READONLY},
+ {"gi_running", T_BOOL, offsetof(PyGenObject, gi_running), READONLY},
{"gi_code", T_OBJECT, offsetof(PyGenObject, gi_code), READONLY},
{NULL} /* Sentinel */
};
static PyMethodDef gen_methods[] = {
- {"send",(PyCFunction)gen_send, METH_O, send_doc},
+ {"send",(PyCFunction)_PyGen_Send, METH_O, send_doc},
{"throw",(PyCFunction)gen_throw, METH_VARARGS, throw_doc},
{"close",(PyCFunction)gen_close, METH_NOARGS, close_doc},
{NULL, NULL} /* Sentinel */
@@ -410,15 +570,13 @@ PyGen_NeedsFinalizing(PyGenObject *gen)
int i;
PyFrameObject *f = gen->gi_frame;
- if (f == NULL || f->f_stacktop == NULL || f->f_iblock <= 0)
+ if (f == NULL || f->f_stacktop == NULL)
return 0; /* no frame or empty blockstack == no finalization */
/* Any block type besides a loop requires cleanup. */
- i = f->f_iblock;
- while (--i >= 0) {
+ for (i = 0; i < f->f_iblock; i++)
if (f->f_blockstack[i].b_type != SETUP_LOOP)
return 1;
- }
/* No blocks except loops, it's safe to skip finalization. */
return 0;
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 91a93f5..3cfbeaf 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -88,8 +88,38 @@ iter_len(seqiterobject *it)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+iter_reduce(seqiterobject *it)
+{
+ if (it->it_seq != NULL)
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ else
+ return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+iter_setstate(seqiterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (it->it_seq != NULL) {
+ if (index < 0)
+ index = 0;
+ it->it_index = index;
+ }
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef seqiter_methods[] = {
{"__length_hint__", (PyCFunction)iter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)iter_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)iter_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -195,6 +225,21 @@ calliter_iternext(calliterobject *it)
return NULL;
}
+static PyObject *
+calliter_reduce(calliterobject *it)
+{
+ if (it->it_callable != NULL && it->it_sentinel != NULL)
+ return Py_BuildValue("N(OO)", _PyObject_GetBuiltin("iter"),
+ it->it_callable, it->it_sentinel);
+ else
+ return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
+}
+
+static PyMethodDef calliter_methods[] = {
+ {"__reduce__", (PyCFunction)calliter_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyTypeObject PyCallIter_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"callable_iterator", /* tp_name */
@@ -224,7 +269,7 @@ PyTypeObject PyCallIter_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)calliter_iternext, /* tp_iternext */
- 0, /* tp_methods */
+ calliter_methods, /* tp_methods */
};
diff --git a/Objects/listobject.c b/Objects/listobject.c
index b9ef0d0..6e0d094 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -98,16 +98,32 @@ show_alloc(void)
static PyListObject *free_list[PyList_MAXFREELIST];
static int numfree = 0;
-void
-PyList_Fini(void)
+int
+PyList_ClearFreeList(void)
{
PyListObject *op;
-
+ int ret = numfree;
while (numfree) {
op = free_list[--numfree];
assert(PyList_CheckExact(op));
PyObject_GC_Del(op);
}
+ return ret;
+}
+
+void
+PyList_Fini(void)
+{
+ PyList_ClearFreeList();
+}
+
+/* Print summary info about the state of the optimized allocator */
+void
+_PyList_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PyListObject",
+ numfree, sizeof(PyListObject));
}
PyObject *
@@ -737,6 +753,19 @@ listinsert(PyListObject *self, PyObject *args)
}
static PyObject *
+listclear(PyListObject *self)
+{
+ list_clear(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+listcopy(PyListObject *self)
+{
+ return list_slice(self, 0, Py_SIZE(self));
+}
+
+static PyObject *
listappend(PyListObject *self, PyObject *v)
{
if (app1(self, v) == 0)
@@ -2109,8 +2138,7 @@ static PyObject *
listindex(PyListObject *self, PyObject *args)
{
Py_ssize_t i, start=0, stop=Py_SIZE(self);
- PyObject *v, *format_tuple, *err_string;
- static PyObject *err_format = NULL;
+ PyObject *v;
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
_PyEval_SliceIndex, &start,
@@ -2133,20 +2161,7 @@ listindex(PyListObject *self, PyObject *args)
else if (cmp < 0)
return NULL;
}
- if (err_format == NULL) {
- err_format = PyUnicode_FromString("%r is not in list");
- if (err_format == NULL)
- return NULL;
- }
- format_tuple = PyTuple_Pack(1, v);
- if (format_tuple == NULL)
- return NULL;
- err_string = PyUnicode_Format(err_format, format_tuple);
- Py_DECREF(format_tuple);
- if (err_string == NULL)
- return NULL;
- PyErr_SetObject(PyExc_ValueError, err_string);
- Py_DECREF(err_string);
+ PyErr_Format(PyExc_ValueError, "%R is not in list", v);
return NULL;
}
@@ -2202,10 +2217,8 @@ list_richcompare(PyObject *v, PyObject *w, int op)
PyListObject *vl, *wl;
Py_ssize_t i;
- if (!PyList_Check(v) || !PyList_Check(w)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyList_Check(v) || !PyList_Check(w))
+ Py_RETURN_NOTIMPLEMENTED;
vl = (PyListObject *)v;
wl = (PyListObject *)w;
@@ -2314,17 +2327,21 @@ PyDoc_STRVAR(reversed_doc,
"L.__reversed__() -- return a reverse iterator over the list");
PyDoc_STRVAR(sizeof_doc,
"L.__sizeof__() -- size of L in memory, in bytes");
+PyDoc_STRVAR(clear_doc,
+"L.clear() -> None -- remove all items from L");
+PyDoc_STRVAR(copy_doc,
+"L.copy() -> list -- a shallow copy of L");
PyDoc_STRVAR(append_doc,
-"L.append(object) -- append object to end");
+"L.append(object) -> None -- append object to end");
PyDoc_STRVAR(extend_doc,
-"L.extend(iterable) -- extend list by appending elements from the iterable");
+"L.extend(iterable) -> None -- extend list by appending elements from the iterable");
PyDoc_STRVAR(insert_doc,
"L.insert(index, object) -- insert object before index");
PyDoc_STRVAR(pop_doc,
"L.pop([index]) -> item -- remove and return item at index (default last).\n"
"Raises IndexError if list is empty or index is out of range.");
PyDoc_STRVAR(remove_doc,
-"L.remove(value) -- remove first occurrence of value.\n"
+"L.remove(value) -> None -- remove first occurrence of value.\n"
"Raises ValueError if the value is not present.");
PyDoc_STRVAR(index_doc,
"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
@@ -2334,7 +2351,7 @@ PyDoc_STRVAR(count_doc,
PyDoc_STRVAR(reverse_doc,
"L.reverse() -- reverse *IN PLACE*");
PyDoc_STRVAR(sort_doc,
-"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*");
+"L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*");
static PyObject *list_subscript(PyListObject*, PyObject*);
@@ -2342,9 +2359,11 @@ static PyMethodDef list_methods[] = {
{"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
{"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
{"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
+ {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
+ {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
{"append", (PyCFunction)listappend, METH_O, append_doc},
{"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
- {"extend", (PyCFunction)listextend, METH_O, extend_doc},
+ {"extend", (PyCFunction)listextend, METH_O, extend_doc},
{"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
{"remove", (PyCFunction)listremove, METH_O, remove_doc},
{"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
@@ -2407,7 +2426,7 @@ list_subscript(PyListObject* self, PyObject* item)
src = self->ob_item;
dest = ((PyListObject *)result)->ob_item;
for (cur = start, i = 0; i < slicelength;
- cur += step, i++) {
+ cur += (size_t)step, i++) {
it = src[cur];
Py_INCREF(it);
dest[i] = it;
@@ -2498,7 +2517,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
self->ob_item + cur + 1,
lim * sizeof(PyObject *));
}
- cur = start + slicelength*step;
+ cur = start + (size_t)slicelength * step;
if (cur < (size_t)Py_SIZE(self)) {
memmove(self->ob_item + cur - slicelength,
self->ob_item + cur,
@@ -2562,7 +2581,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
selfitems = self->ob_item;
seqitems = PySequence_Fast_ITEMS(seq);
for (cur = start, i = 0; i < slicelength;
- cur += step, i++) {
+ cur += (size_t)step, i++) {
garbage[i] = selfitems[cur];
ins = seqitems[i];
Py_INCREF(ins);
@@ -2650,11 +2669,18 @@ static void listiter_dealloc(listiterobject *);
static int listiter_traverse(listiterobject *, visitproc, void *);
static PyObject *listiter_next(listiterobject *);
static PyObject *listiter_len(listiterobject *);
+static PyObject *listiter_reduce_general(void *_it, int forward);
+static PyObject *listiter_reduce(listiterobject *);
+static PyObject *listiter_setstate(listiterobject *, PyObject *state);
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
static PyMethodDef listiter_methods[] = {
{"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -2761,6 +2787,27 @@ listiter_len(listiterobject *it)
}
return PyLong_FromLong(0);
}
+
+static PyObject *
+listiter_reduce(listiterobject *it)
+{
+ return listiter_reduce_general(it, 1);
+}
+
+static PyObject *
+listiter_setstate(listiterobject *it, PyObject *state)
+{
+ long index = PyLong_AsLong(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (it->it_seq != NULL) {
+ if (index < 0)
+ index = 0;
+ it->it_index = index;
+ }
+ Py_RETURN_NONE;
+}
+
/*********************** List Reverse Iterator **************************/
typedef struct {
@@ -2774,9 +2821,13 @@ static void listreviter_dealloc(listreviterobject *);
static int listreviter_traverse(listreviterobject *, visitproc, void *);
static PyObject *listreviter_next(listreviterobject *);
static PyObject *listreviter_len(listreviterobject *);
+static PyObject *listreviter_reduce(listreviterobject *);
+static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
static PyMethodDef listreviter_methods[] = {
{"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -2873,3 +2924,51 @@ listreviter_len(listreviterobject *it)
len = 0;
return PyLong_FromSsize_t(len);
}
+
+static PyObject *
+listreviter_reduce(listreviterobject *it)
+{
+ return listiter_reduce_general(it, 0);
+}
+
+static PyObject *
+listreviter_setstate(listreviterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (it->it_seq != NULL) {
+ if (index < -1)
+ index = -1;
+ else if (index > PyList_GET_SIZE(it->it_seq) - 1)
+ index = PyList_GET_SIZE(it->it_seq) - 1;
+ it->it_index = index;
+ }
+ Py_RETURN_NONE;
+}
+
+/* common pickling support */
+
+static PyObject *
+listiter_reduce_general(void *_it, int forward)
+{
+ PyObject *list;
+
+ /* the objects are not the same, index is of different types! */
+ if (forward) {
+ listiterobject *it = (listiterobject *)_it;
+ if (it->it_seq)
+ return Py_BuildValue("N(O)l", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ } else {
+ listreviterobject *it = (listreviterobject *)_it;
+ if (it->it_seq)
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("reversed"),
+ it->it_seq, it->it_index);
+ }
+ /* empty iterator, create an empty list */
+ list = PyList_New(0);
+ if (list == NULL)
+ return NULL;
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
+}
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 3a675c4..87150a9 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -320,8 +320,15 @@ PyLong_FromDouble(double dval)
#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
-/* Get a C long int from a long int object.
- Returns -1 and sets an error condition if overflow occurs. */
+/* Get a C long int from a long int object or any object that has an __int__
+ method.
+
+ On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
+ the result. Otherwise *overflow is 0.
+
+ For other errors (e.g., TypeError), return -1 and set an error condition.
+ In this case *overflow will be 0.
+*/
long
PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
@@ -410,6 +417,9 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
return res;
}
+/* Get a C long int from a long int object or any object that has an __int__
+ method. Return -1 and set an error if overflow occurs. */
+
long
PyLong_AsLong(PyObject *obj)
{
@@ -658,10 +668,9 @@ _PyLong_NumBits(PyObject *vv)
assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
if (ndigits > 0) {
digit msd = v->ob_digit[ndigits - 1];
-
- result = (ndigits - 1) * PyLong_SHIFT;
- if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
+ if ((size_t)(ndigits - 1) > PY_SIZE_MAX / (size_t)PyLong_SHIFT)
goto Overflow;
+ result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT;
do {
++result;
if (result == 0)
@@ -921,7 +930,7 @@ _PyLong_AsByteArray(PyLongObject* v,
}
-/* Create a new long (or int) object from a C pointer */
+/* Create a new long int object from a C pointer */
PyObject *
PyLong_FromVoidPtr(void *p)
@@ -947,15 +956,11 @@ PyLong_FromVoidPtr(void *p)
}
-/* Get a C pointer from a long object (or an int object in some cases) */
+/* Get a C pointer from a long int object. */
void *
PyLong_AsVoidPtr(PyObject *vv)
{
- /* This function will allow int or long objects. If vv is neither,
- then the PyLong_AsLong*() functions will raise the exception:
- PyExc_SystemError, "bad argument to internal function"
- */
#if SIZEOF_VOID_P <= SIZEOF_LONG
long x;
@@ -1136,8 +1141,8 @@ PyLong_FromSize_t(size_t ival)
return (PyObject *)v;
}
-/* Get a C PY_LONG_LONG int from a long int object.
- Return -1 and set an error if overflow occurs. */
+/* Get a C long long int from a long int object or any object that has an
+ __int__ method. Return -1 and set an error if overflow occurs. */
PY_LONG_LONG
PyLong_AsLongLong(PyObject *vv)
@@ -1199,10 +1204,14 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
int one = 1;
int res;
- if (vv == NULL || !PyLong_Check(vv)) {
+ if (vv == NULL) {
PyErr_BadInternalCall();
return (unsigned PY_LONG_LONG)-1;
}
+ if (!PyLong_Check(vv)) {
+ PyErr_SetString(PyExc_TypeError, "an integer is required");
+ return (unsigned PY_LONG_LONG)-1;
+ }
v = (PyLongObject*)vv;
switch(Py_SIZE(v)) {
@@ -1289,12 +1298,14 @@ PyLong_AsUnsignedLongLongMask(register PyObject *op)
}
#undef IS_LITTLE_ENDIAN
-/* Get a C long long int from a Python long or Python int object.
- On overflow, returns -1 and sets *overflow to 1 or -1 depending
- on the sign of the result. Otherwise *overflow is 0.
+/* Get a C long long int from a long int object or any object that has an
+ __int__ method.
- For other errors (e.g., type error), returns -1 and sets an error
- condition.
+ On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
+ the result. Otherwise *overflow is 0.
+
+ For other errors (e.g., TypeError), return -1 and set an error condition.
+ In this case *overflow will be 0.
*/
PY_LONG_LONG
@@ -1388,10 +1399,8 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
#define CHECK_BINOP(v,w) \
do { \
- if (!PyLong_Check(v) || !PyLong_Check(w)) { \
- Py_INCREF(Py_NotImplemented); \
- return Py_NotImplemented; \
- } \
+ if (!PyLong_Check(v) || !PyLong_Check(w)) \
+ Py_RETURN_NOTIMPLEMENTED; \
} while(0)
/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
@@ -1548,20 +1557,22 @@ divrem1(PyLongObject *a, digit n, digit *prem)
string. (Return value is non-shared so that callers can modify the
returned value if necessary.) */
-static PyObject *
-long_to_decimal_string(PyObject *aa)
+static int
+long_to_decimal_string_internal(PyObject *aa,
+ PyObject **p_output,
+ _PyUnicodeWriter *writer)
{
PyLongObject *scratch, *a;
PyObject *str;
Py_ssize_t size, strlen, size_a, i, j;
digit *pout, *pin, rem, tenpow;
- Py_UNICODE *p;
int negative;
+ enum PyUnicode_Kind kind;
a = (PyLongObject *)aa;
if (a == NULL || !PyLong_Check(a)) {
PyErr_BadInternalCall();
- return NULL;
+ return -1;
}
size_a = ABS(Py_SIZE(a));
negative = Py_SIZE(a) < 0;
@@ -1578,13 +1589,13 @@ long_to_decimal_string(PyObject *aa)
if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) {
PyErr_SetString(PyExc_OverflowError,
"long is too large to format");
- return NULL;
+ return -1;
}
/* the expression size_a * PyLong_SHIFT is now safe from overflow */
size = 1 + size_a * PyLong_SHIFT / (3 * _PyLong_DECIMAL_SHIFT);
scratch = _PyLong_New(size);
if (scratch == NULL)
- return NULL;
+ return -1;
/* convert array of base _PyLong_BASE digits in pin to an array of
base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
@@ -1607,7 +1618,7 @@ long_to_decimal_string(PyObject *aa)
/* check for keyboard interrupt */
SIGCHECK({
Py_DECREF(scratch);
- return NULL;
+ return -1;
});
}
/* pout should have at least one digit, so that the case when a = 0
@@ -1623,64 +1634,118 @@ long_to_decimal_string(PyObject *aa)
tenpow *= 10;
strlen++;
}
- str = PyUnicode_FromUnicode(NULL, strlen);
- if (str == NULL) {
- Py_DECREF(scratch);
- return NULL;
+ if (writer) {
+ if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) {
+ Py_DECREF(scratch);
+ return -1;
+ }
+ kind = writer->kind;
+ str = NULL;
}
+ else {
+ str = PyUnicode_New(strlen, '9');
+ if (str == NULL) {
+ Py_DECREF(scratch);
+ return -1;
+ }
+ kind = PyUnicode_KIND(str);
+ }
+
+#define WRITE_DIGITS(TYPE) \
+ do { \
+ if (writer) \
+ p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \
+ else \
+ p = (TYPE*)PyUnicode_DATA(str) + strlen; \
+ \
+ *p = '\0'; \
+ /* pout[0] through pout[size-2] contribute exactly \
+ _PyLong_DECIMAL_SHIFT digits each */ \
+ for (i=0; i < size - 1; i++) { \
+ rem = pout[i]; \
+ for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) { \
+ *--p = '0' + rem % 10; \
+ rem /= 10; \
+ } \
+ } \
+ /* pout[size-1]: always produce at least one decimal digit */ \
+ rem = pout[i]; \
+ do { \
+ *--p = '0' + rem % 10; \
+ rem /= 10; \
+ } while (rem != 0); \
+ \
+ /* and sign */ \
+ if (negative) \
+ *--p = '-'; \
+ \
+ /* check we've counted correctly */ \
+ if (writer) \
+ assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
+ else \
+ assert(p == (TYPE*)PyUnicode_DATA(str)); \
+ } while (0)
/* fill the string right-to-left */
- p = PyUnicode_AS_UNICODE(str) + strlen;
- *p = '\0';
- /* pout[0] through pout[size-2] contribute exactly
- _PyLong_DECIMAL_SHIFT digits each */
- for (i=0; i < size - 1; i++) {
- rem = pout[i];
- for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {
- *--p = '0' + rem % 10;
- rem /= 10;
- }
+ if (kind == PyUnicode_1BYTE_KIND) {
+ Py_UCS1 *p;
+ WRITE_DIGITS(Py_UCS1);
}
- /* pout[size-1]: always produce at least one decimal digit */
- rem = pout[i];
- do {
- *--p = '0' + rem % 10;
- rem /= 10;
- } while (rem != 0);
-
- /* and sign */
- if (negative)
- *--p = '-';
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *p;
+ WRITE_DIGITS(Py_UCS2);
+ }
+ else {
+ Py_UCS4 *p;
+ assert (kind == PyUnicode_4BYTE_KIND);
+ WRITE_DIGITS(Py_UCS4);
+ }
+#undef WRITE_DIGITS
- /* check we've counted correctly */
- assert(p == PyUnicode_AS_UNICODE(str));
Py_DECREF(scratch);
- return (PyObject *)str;
+ if (writer) {
+ writer->pos += strlen;
+ }
+ else {
+ assert(_PyUnicode_CheckConsistency(str, 1));
+ *p_output = (PyObject *)str;
+ }
+ return 0;
+}
+
+static PyObject *
+long_to_decimal_string(PyObject *aa)
+{
+ PyObject *v;
+ if (long_to_decimal_string_internal(aa, &v, NULL) == -1)
+ return NULL;
+ return v;
}
/* Convert a long int object to a string, using a given conversion base,
- which should be one of 2, 8, 10 or 16. Return a string object.
- If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'. */
+ which should be one of 2, 8 or 16. Return a string object.
+ If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'
+ if alternate is nonzero. */
-PyObject *
-_PyLong_Format(PyObject *aa, int base)
+static int
+long_format_binary(PyObject *aa, int base, int alternate,
+ PyObject **p_output, _PyUnicodeWriter *writer)
{
register PyLongObject *a = (PyLongObject *)aa;
- PyObject *str;
- Py_ssize_t i, sz;
+ PyObject *v;
+ Py_ssize_t sz;
Py_ssize_t size_a;
- Py_UNICODE *p, sign = '\0';
+ enum PyUnicode_Kind kind;
+ int negative;
int bits;
- assert(base == 2 || base == 8 || base == 10 || base == 16);
- if (base == 10)
- return long_to_decimal_string((PyObject *)a);
-
+ assert(base == 2 || base == 8 || base == 16);
if (a == NULL || !PyLong_Check(a)) {
PyErr_BadInternalCall();
- return NULL;
+ return -1;
}
size_a = ABS(Py_SIZE(a));
+ negative = Py_SIZE(a) < 0;
/* Compute a rough upper bound for the length of the string */
switch (base) {
@@ -1697,70 +1762,137 @@ _PyLong_Format(PyObject *aa, int base)
assert(0); /* shouldn't ever get here */
bits = 0; /* to silence gcc warning */
}
- /* compute length of output string: allow 2 characters for prefix and
- 1 for possible '-' sign. */
- if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
- PyErr_SetString(PyExc_OverflowError,
- "int is too large to format");
- return NULL;
- }
- /* now size_a * PyLong_SHIFT + 3 <= PY_SSIZE_T_MAX, so the RHS below
- is safe from overflow */
- sz = 3 + (size_a * PyLong_SHIFT + (bits - 1)) / bits;
- assert(sz >= 0);
- str = PyUnicode_FromUnicode(NULL, sz);
- if (str == NULL)
- return NULL;
- p = PyUnicode_AS_UNICODE(str) + sz;
- *p = '\0';
- if (Py_SIZE(a) < 0)
- sign = '-';
- if (Py_SIZE(a) == 0) {
- *--p = '0';
+ /* Compute exact length 'sz' of output string. */
+ if (size_a == 0) {
+ sz = 1;
}
else {
- /* JRH: special case for power-of-2 bases */
- twodigits accum = 0;
- int accumbits = 0; /* # of bits in accum */
- for (i = 0; i < size_a; ++i) {
- accum |= (twodigits)a->ob_digit[i] << accumbits;
- accumbits += PyLong_SHIFT;
- assert(accumbits >= bits);
- do {
- Py_UNICODE cdigit;
- cdigit = (Py_UNICODE)(accum & (base - 1));
- cdigit += (cdigit < 10) ? '0' : 'a'-10;
- assert(p > PyUnicode_AS_UNICODE(str));
- *--p = cdigit;
- accumbits -= bits;
- accum >>= bits;
- } while (i < size_a-1 ? accumbits >= bits : accum > 0);
+ Py_ssize_t size_a_in_bits;
+ /* Ensure overflow doesn't occur during computation of sz. */
+ if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
+ PyErr_SetString(PyExc_OverflowError,
+ "int is too large to format");
+ return -1;
}
+ size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
+ bits_in_digit(a->ob_digit[size_a - 1]);
+ /* Allow 1 character for a '-' sign. */
+ sz = negative + (size_a_in_bits + (bits - 1)) / bits;
+ }
+ if (alternate) {
+ /* 2 characters for prefix */
+ sz += 2;
}
- if (base == 16)
- *--p = 'x';
- else if (base == 8)
- *--p = 'o';
- else /* (base == 2) */
- *--p = 'b';
- *--p = '0';
- if (sign)
- *--p = sign;
- if (p != PyUnicode_AS_UNICODE(str)) {
- Py_UNICODE *q = PyUnicode_AS_UNICODE(str);
- assert(p > q);
- do {
- } while ((*q++ = *p++) != '\0');
- q--;
- if (PyUnicode_Resize(&str,(Py_ssize_t) (q -
- PyUnicode_AS_UNICODE(str)))) {
- Py_DECREF(str);
- return NULL;
- }
+ if (writer) {
+ if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
+ return -1;
+ kind = writer->kind;
+ v = NULL;
+ }
+ else {
+ v = PyUnicode_New(sz, 'x');
+ if (v == NULL)
+ return -1;
+ kind = PyUnicode_KIND(v);
+ }
+
+#define WRITE_DIGITS(TYPE) \
+ do { \
+ if (writer) \
+ p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + sz; \
+ else \
+ p = (TYPE*)PyUnicode_DATA(v) + sz; \
+ \
+ if (size_a == 0) { \
+ *--p = '0'; \
+ } \
+ else { \
+ /* JRH: special case for power-of-2 bases */ \
+ twodigits accum = 0; \
+ int accumbits = 0; /* # of bits in accum */ \
+ Py_ssize_t i; \
+ for (i = 0; i < size_a; ++i) { \
+ accum |= (twodigits)a->ob_digit[i] << accumbits; \
+ accumbits += PyLong_SHIFT; \
+ assert(accumbits >= bits); \
+ do { \
+ char cdigit; \
+ cdigit = (char)(accum & (base - 1)); \
+ cdigit += (cdigit < 10) ? '0' : 'a'-10; \
+ *--p = cdigit; \
+ accumbits -= bits; \
+ accum >>= bits; \
+ } while (i < size_a-1 ? accumbits >= bits : accum > 0); \
+ } \
+ } \
+ \
+ if (alternate) { \
+ if (base == 16) \
+ *--p = 'x'; \
+ else if (base == 8) \
+ *--p = 'o'; \
+ else /* (base == 2) */ \
+ *--p = 'b'; \
+ *--p = '0'; \
+ } \
+ if (negative) \
+ *--p = '-'; \
+ if (writer) \
+ assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
+ else \
+ assert(p == (TYPE*)PyUnicode_DATA(v)); \
+ } while (0)
+
+ if (kind == PyUnicode_1BYTE_KIND) {
+ Py_UCS1 *p;
+ WRITE_DIGITS(Py_UCS1);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *p;
+ WRITE_DIGITS(Py_UCS2);
}
- return (PyObject *)str;
+ else {
+ Py_UCS4 *p;
+ assert (kind == PyUnicode_4BYTE_KIND);
+ WRITE_DIGITS(Py_UCS4);
+ }
+#undef WRITE_DIGITS
+
+ if (writer) {
+ writer->pos += sz;
+ }
+ else {
+ assert(_PyUnicode_CheckConsistency(v, 1));
+ *p_output = v;
+ }
+ return 0;
+}
+
+PyObject *
+_PyLong_Format(PyObject *obj, int base)
+{
+ PyObject *str;
+ int err;
+ if (base == 10)
+ err = long_to_decimal_string_internal(obj, &str, NULL);
+ else
+ err = long_format_binary(obj, base, 1, &str, NULL);
+ if (err == -1)
+ return NULL;
+ return str;
+}
+
+int
+_PyLong_FormatWriter(_PyUnicodeWriter *writer,
+ PyObject *obj,
+ int base, int alternate)
+{
+ if (base == 10)
+ return long_to_decimal_string_internal(obj, NULL, writer);
+ else
+ return long_format_binary(obj, base, alternate, NULL, writer);
}
/* Table of digit values for 8-bit string -> integer conversion.
@@ -2138,23 +2270,26 @@ digit beyond the first.
PyObject *
PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
{
+ PyObject *v, *unicode = PyUnicode_FromUnicode(u, length);
+ if (unicode == NULL)
+ return NULL;
+ v = PyLong_FromUnicodeObject(unicode, base);
+ Py_DECREF(unicode);
+ return v;
+}
+
+PyObject *
+PyLong_FromUnicodeObject(PyObject *u, int base)
+{
PyObject *result;
PyObject *asciidig;
char *buffer, *end;
- Py_ssize_t i, buflen;
- Py_UNICODE *ptr;
+ Py_ssize_t buflen;
- asciidig = PyUnicode_TransformDecimalToASCII(u, length);
+ asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
if (asciidig == NULL)
return NULL;
- /* Replace non-ASCII whitespace with ' ' */
- ptr = PyUnicode_AS_UNICODE(asciidig);
- for (i = 0; i < length; i++) {
- Py_UNICODE ch = ptr[i];
- if (ch > 127 && Py_UNICODE_ISSPACE(ch))
- ptr[i] = ' ';
- }
- buffer = _PyUnicode_AsStringAndSize(asciidig, &buflen);
+ buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
if (buffer == NULL) {
Py_DECREF(asciidig);
return NULL;
@@ -2451,8 +2586,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
break;
}
}
- assert(1 <= x_size &&
- x_size <= (Py_ssize_t)(sizeof(x_digits)/sizeof(digit)));
+ assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
/* Round, and convert to double. */
x_digits[0] += half_even_correction[x_digits[0] & 7];
@@ -2489,10 +2623,14 @@ PyLong_AsDouble(PyObject *v)
Py_ssize_t exponent;
double x;
- if (v == NULL || !PyLong_Check(v)) {
+ if (v == NULL) {
PyErr_BadInternalCall();
return -1.0;
}
+ if (!PyLong_Check(v)) {
+ PyErr_SetString(PyExc_TypeError, "an integer is required");
+ return -1.0;
+ }
x = _PyLong_Frexp((PyLongObject *)v, &exponent);
if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
PyErr_SetString(PyExc_OverflowError,
@@ -3617,8 +3755,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
else {
Py_DECREF(a);
Py_DECREF(b);
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
if (Py_SIZE(b) < 0) { /* if exponent is negative */
@@ -4145,9 +4282,7 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
if (PyUnicode_Check(x))
- return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
- PyUnicode_GET_SIZE(x),
- (int)base);
+ return PyLong_FromUnicodeObject(x, (int)base);
else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
/* Since PyLong_FromString doesn't have a length parameter,
* check here for possible NULs in the string. */
@@ -4226,12 +4361,22 @@ static PyObject *
long__format__(PyObject *self, PyObject *args)
{
PyObject *format_spec;
+ _PyUnicodeWriter writer;
+ int ret;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- return _PyLong_FormatAdvanced(self,
- PyUnicode_AS_UNICODE(format_spec),
- PyUnicode_GET_SIZE(format_spec));
+
+ _PyUnicodeWriter_Init(&writer, 0);
+ ret = _PyLong_FormatAdvancedWriter(
+ &writer,
+ self,
+ format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
+ if (ret == -1) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
}
/* Return a pair (q, r) such that a = b * q + r, and
diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c
index 403aa68..dd6fe82 100644
--- a/Objects/memoryobject.c
+++ b/Objects/memoryobject.c
@@ -1,126 +1,954 @@
-
/* Memoryview object implementation */
#include "Python.h"
+#include <stddef.h>
+
+
+/****************************************************************************/
+/* ManagedBuffer Object */
+/****************************************************************************/
+
+/*
+ ManagedBuffer Object:
+ ---------------------
+
+ The purpose of this object is to facilitate the handling of chained
+ memoryviews that have the same underlying exporting object. PEP-3118
+ allows the underlying object to change while a view is exported. This
+ could lead to unexpected results when constructing a new memoryview
+ from an existing memoryview.
+
+ Rather than repeatedly redirecting buffer requests to the original base
+ object, all chained memoryviews use a single buffer snapshot. This
+ snapshot is generated by the constructor _PyManagedBuffer_FromObject().
+
+ Ownership rules:
+ ----------------
+
+ The master buffer inside a managed buffer is filled in by the original
+ base object. shape, strides, suboffsets and format are read-only for
+ all consumers.
-#define IS_RELEASED(memobj) \
- (((PyMemoryViewObject *) memobj)->view.buf == NULL)
+ A memoryview's buffer is a private copy of the exporter's buffer. shape,
+ strides and suboffsets belong to the memoryview and are thus writable.
-#define CHECK_RELEASED(memobj) \
- if (IS_RELEASED(memobj)) { \
- PyErr_SetString(PyExc_ValueError, \
- "operation forbidden on released memoryview object"); \
- return NULL; \
+ If a memoryview itself exports several buffers via memory_getbuf(), all
+ buffer copies share shape, strides and suboffsets. In this case, the
+ arrays are NOT writable.
+
+ Reference count assumptions:
+ ----------------------------
+
+ The 'obj' member of a Py_buffer must either be NULL or refer to the
+ exporting base object. In the Python codebase, all getbufferprocs
+ return a new reference to view.obj (example: bytes_buffer_getbuffer()).
+
+ PyBuffer_Release() decrements view.obj (if non-NULL), so the
+ releasebufferprocs must NOT decrement view.obj.
+*/
+
+
+#define XSTRINGIZE(v) #v
+#define STRINGIZE(v) XSTRINGIZE(v)
+
+#define CHECK_MBUF_RELEASED(mbuf) \
+ if (((_PyManagedBufferObject *)mbuf)->flags&_Py_MANAGED_BUFFER_RELEASED) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "operation forbidden on released memoryview object"); \
+ return NULL; \
}
-#define CHECK_RELEASED_INT(memobj) \
- if (IS_RELEASED(memobj)) { \
- PyErr_SetString(PyExc_ValueError, \
- "operation forbidden on released memoryview object"); \
- return -1; \
+
+Py_LOCAL_INLINE(_PyManagedBufferObject *)
+mbuf_alloc(void)
+{
+ _PyManagedBufferObject *mbuf;
+
+ mbuf = (_PyManagedBufferObject *)
+ PyObject_GC_New(_PyManagedBufferObject, &_PyManagedBuffer_Type);
+ if (mbuf == NULL)
+ return NULL;
+ mbuf->flags = 0;
+ mbuf->exports = 0;
+ mbuf->master.obj = NULL;
+ _PyObject_GC_TRACK(mbuf);
+
+ return mbuf;
+}
+
+static PyObject *
+_PyManagedBuffer_FromObject(PyObject *base)
+{
+ _PyManagedBufferObject *mbuf;
+
+ mbuf = mbuf_alloc();
+ if (mbuf == NULL)
+ return NULL;
+
+ if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) {
+ mbuf->master.obj = NULL;
+ Py_DECREF(mbuf);
+ return NULL;
}
-static Py_ssize_t
-get_shape0(Py_buffer *buf)
-{
- if (buf->shape != NULL)
- return buf->shape[0];
- if (buf->ndim == 0)
- return 1;
- PyErr_SetString(PyExc_TypeError,
- "exported buffer does not have any shape information associated "
- "to it");
- return -1;
+ return (PyObject *)mbuf;
}
static void
-dup_buffer(Py_buffer *dest, Py_buffer *src)
+mbuf_release(_PyManagedBufferObject *self)
{
- *dest = *src;
- if (src->ndim == 1 && src->shape != NULL) {
- dest->shape = &(dest->smalltable[0]);
- dest->shape[0] = get_shape0(src);
- }
- if (src->ndim == 1 && src->strides != NULL) {
- dest->strides = &(dest->smalltable[1]);
- dest->strides[0] = src->strides[0];
- }
+ if (self->flags&_Py_MANAGED_BUFFER_RELEASED)
+ return;
+
+ /* NOTE: at this point self->exports can still be > 0 if this function
+ is called from mbuf_clear() to break up a reference cycle. */
+ self->flags |= _Py_MANAGED_BUFFER_RELEASED;
+
+ /* PyBuffer_Release() decrements master->obj and sets it to NULL. */
+ _PyObject_GC_UNTRACK(self);
+ PyBuffer_Release(&self->master);
+}
+
+static void
+mbuf_dealloc(_PyManagedBufferObject *self)
+{
+ assert(self->exports == 0);
+ mbuf_release(self);
+ if (self->flags&_Py_MANAGED_BUFFER_FREE_FORMAT)
+ PyMem_Free(self->master.format);
+ PyObject_GC_Del(self);
}
static int
-memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
+mbuf_traverse(_PyManagedBufferObject *self, visitproc visit, void *arg)
{
- int res = 0;
- CHECK_RELEASED_INT(self);
- if (self->view.obj != NULL)
- res = PyObject_GetBuffer(self->view.obj, view, flags);
- if (view)
- dup_buffer(view, &self->view);
- return res;
+ Py_VISIT(self->master.obj);
+ return 0;
}
-static void
-memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view)
+static int
+mbuf_clear(_PyManagedBufferObject *self)
{
- PyBuffer_Release(view);
+ assert(self->exports >= 0);
+ mbuf_release(self);
+ return 0;
}
+PyTypeObject _PyManagedBuffer_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "managedbuffer",
+ sizeof(_PyManagedBufferObject),
+ 0,
+ (destructor)mbuf_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)mbuf_traverse, /* tp_traverse */
+ (inquiry)mbuf_clear /* tp_clear */
+};
+
+
+/****************************************************************************/
+/* MemoryView Object */
+/****************************************************************************/
+
+/* In the process of breaking reference cycles mbuf_release() can be
+ called before memory_release(). */
+#define BASE_INACCESSIBLE(mv) \
+ (((PyMemoryViewObject *)mv)->flags&_Py_MEMORYVIEW_RELEASED || \
+ ((PyMemoryViewObject *)mv)->mbuf->flags&_Py_MANAGED_BUFFER_RELEASED)
+
+#define CHECK_RELEASED(mv) \
+ if (BASE_INACCESSIBLE(mv)) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "operation forbidden on released memoryview object"); \
+ return NULL; \
+ }
+
+#define CHECK_RELEASED_INT(mv) \
+ if (BASE_INACCESSIBLE(mv)) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "operation forbidden on released memoryview object"); \
+ return -1; \
+ }
+
+#define CHECK_LIST_OR_TUPLE(v) \
+ if (!PyList_Check(v) && !PyTuple_Check(v)) { \
+ PyErr_SetString(PyExc_TypeError, \
+ #v " must be a list or a tuple"); \
+ return NULL; \
+ }
+
+#define VIEW_ADDR(mv) (&((PyMemoryViewObject *)mv)->view)
+
+/* Check for the presence of suboffsets in the first dimension. */
+#define HAVE_PTR(suboffsets) (suboffsets && suboffsets[0] >= 0)
+/* Adjust ptr if suboffsets are present. */
+#define ADJUST_PTR(ptr, suboffsets) \
+ (HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
+
+/* Memoryview buffer properties */
+#define MV_C_CONTIGUOUS(flags) (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C))
+#define MV_F_CONTIGUOUS(flags) \
+ (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_FORTRAN))
+#define MV_ANY_CONTIGUOUS(flags) \
+ (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN))
+
+/* Fast contiguity test. Caller must ensure suboffsets==NULL and ndim==1. */
+#define MV_CONTIGUOUS_NDIM1(view) \
+ ((view)->shape[0] == 1 || (view)->strides[0] == (view)->itemsize)
+
+/* getbuffer() requests */
+#define REQ_INDIRECT(flags) ((flags&PyBUF_INDIRECT) == PyBUF_INDIRECT)
+#define REQ_C_CONTIGUOUS(flags) ((flags&PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS)
+#define REQ_F_CONTIGUOUS(flags) ((flags&PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS)
+#define REQ_ANY_CONTIGUOUS(flags) ((flags&PyBUF_ANY_CONTIGUOUS) == PyBUF_ANY_CONTIGUOUS)
+#define REQ_STRIDES(flags) ((flags&PyBUF_STRIDES) == PyBUF_STRIDES)
+#define REQ_SHAPE(flags) ((flags&PyBUF_ND) == PyBUF_ND)
+#define REQ_WRITABLE(flags) (flags&PyBUF_WRITABLE)
+#define REQ_FORMAT(flags) (flags&PyBUF_FORMAT)
+
+
PyDoc_STRVAR(memory_doc,
"memoryview(object)\n\
\n\
Create a new memoryview object which references the given object.");
+
+/**************************************************************************/
+/* Copy memoryview buffers */
+/**************************************************************************/
+
+/* The functions in this section take a source and a destination buffer
+ with the same logical structure: format, itemsize, ndim and shape
+ are identical, with ndim > 0.
+
+ NOTE: All buffers are assumed to have PyBUF_FULL information, which
+ is the case for memoryviews! */
+
+
+/* Assumptions: ndim >= 1. The macro tests for a corner case that should
+ perhaps be explicitly forbidden in the PEP. */
+#define HAVE_SUBOFFSETS_IN_LAST_DIM(view) \
+ (view->suboffsets && view->suboffsets[dest->ndim-1] >= 0)
+
+Py_LOCAL_INLINE(int)
+last_dim_is_contiguous(const Py_buffer *dest, const Py_buffer *src)
+{
+ assert(dest->ndim > 0 && src->ndim > 0);
+ return (!HAVE_SUBOFFSETS_IN_LAST_DIM(dest) &&
+ !HAVE_SUBOFFSETS_IN_LAST_DIM(src) &&
+ dest->strides[dest->ndim-1] == dest->itemsize &&
+ src->strides[src->ndim-1] == src->itemsize);
+}
+
+/* This is not a general function for determining format equivalence.
+ It is used in copy_single() and copy_buffer() to weed out non-matching
+ formats. Skipping the '@' character is specifically used in slice
+ assignments, where the lvalue is already known to have a single character
+ format. This is a performance hack that could be rewritten (if properly
+ benchmarked). */
+Py_LOCAL_INLINE(int)
+equiv_format(const Py_buffer *dest, const Py_buffer *src)
+{
+ const char *dfmt, *sfmt;
+
+ assert(dest->format && src->format);
+ dfmt = dest->format[0] == '@' ? dest->format+1 : dest->format;
+ sfmt = src->format[0] == '@' ? src->format+1 : src->format;
+
+ if (strcmp(dfmt, sfmt) != 0 ||
+ dest->itemsize != src->itemsize) {
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Two shapes are equivalent if they are either equal or identical up
+ to a zero element at the same position. For example, in NumPy arrays
+ the shapes [1, 0, 5] and [1, 0, 7] are equivalent. */
+Py_LOCAL_INLINE(int)
+equiv_shape(const Py_buffer *dest, const Py_buffer *src)
+{
+ int i;
+
+ if (dest->ndim != src->ndim)
+ return 0;
+
+ for (i = 0; i < dest->ndim; i++) {
+ if (dest->shape[i] != src->shape[i])
+ return 0;
+ if (dest->shape[i] == 0)
+ break;
+ }
+
+ return 1;
+}
+
+/* Check that the logical structure of the destination and source buffers
+ is identical. */
+static int
+equiv_structure(const Py_buffer *dest, const Py_buffer *src)
+{
+ if (!equiv_format(dest, src) ||
+ !equiv_shape(dest, src)) {
+ PyErr_SetString(PyExc_ValueError,
+ "ndarray assignment: lvalue and rvalue have different structures");
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Base case for recursive multi-dimensional copying. Contiguous arrays are
+ copied with very little overhead. Assumptions: ndim == 1, mem == NULL or
+ sizeof(mem) == shape[0] * itemsize. */
+static void
+copy_base(const Py_ssize_t *shape, Py_ssize_t itemsize,
+ char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets,
+ char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets,
+ char *mem)
+{
+ if (mem == NULL) { /* contiguous */
+ Py_ssize_t size = shape[0] * itemsize;
+ if (dptr + size < sptr || sptr + size < dptr)
+ memcpy(dptr, sptr, size); /* no overlapping */
+ else
+ memmove(dptr, sptr, size);
+ }
+ else {
+ char *p;
+ Py_ssize_t i;
+ for (i=0, p=mem; i < shape[0]; p+=itemsize, sptr+=sstrides[0], i++) {
+ char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
+ memcpy(p, xsptr, itemsize);
+ }
+ for (i=0, p=mem; i < shape[0]; p+=itemsize, dptr+=dstrides[0], i++) {
+ char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
+ memcpy(xdptr, p, itemsize);
+ }
+ }
+
+}
+
+/* Recursively copy a source buffer to a destination buffer. The two buffers
+ have the same ndim, shape and itemsize. */
+static void
+copy_rec(const Py_ssize_t *shape, Py_ssize_t ndim, Py_ssize_t itemsize,
+ char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets,
+ char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets,
+ char *mem)
+{
+ Py_ssize_t i;
+
+ assert(ndim >= 1);
+
+ if (ndim == 1) {
+ copy_base(shape, itemsize,
+ dptr, dstrides, dsuboffsets,
+ sptr, sstrides, ssuboffsets,
+ mem);
+ return;
+ }
+
+ for (i = 0; i < shape[0]; dptr+=dstrides[0], sptr+=sstrides[0], i++) {
+ char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
+ char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
+
+ copy_rec(shape+1, ndim-1, itemsize,
+ xdptr, dstrides+1, dsuboffsets ? dsuboffsets+1 : NULL,
+ xsptr, sstrides+1, ssuboffsets ? ssuboffsets+1 : NULL,
+ mem);
+ }
+}
+
+/* Faster copying of one-dimensional arrays. */
+static int
+copy_single(Py_buffer *dest, Py_buffer *src)
+{
+ char *mem = NULL;
+
+ assert(dest->ndim == 1);
+
+ if (!equiv_structure(dest, src))
+ return -1;
+
+ if (!last_dim_is_contiguous(dest, src)) {
+ mem = PyMem_Malloc(dest->shape[0] * dest->itemsize);
+ if (mem == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ }
+
+ copy_base(dest->shape, dest->itemsize,
+ dest->buf, dest->strides, dest->suboffsets,
+ src->buf, src->strides, src->suboffsets,
+ mem);
+
+ if (mem)
+ PyMem_Free(mem);
+
+ return 0;
+}
+
+/* Recursively copy src to dest. Both buffers must have the same basic
+ structure. Copying is atomic, the function never fails with a partial
+ copy. */
+static int
+copy_buffer(Py_buffer *dest, Py_buffer *src)
+{
+ char *mem = NULL;
+
+ assert(dest->ndim > 0);
+
+ if (!equiv_structure(dest, src))
+ return -1;
+
+ if (!last_dim_is_contiguous(dest, src)) {
+ mem = PyMem_Malloc(dest->shape[dest->ndim-1] * dest->itemsize);
+ if (mem == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ }
+
+ copy_rec(dest->shape, dest->ndim, dest->itemsize,
+ dest->buf, dest->strides, dest->suboffsets,
+ src->buf, src->strides, src->suboffsets,
+ mem);
+
+ if (mem)
+ PyMem_Free(mem);
+
+ return 0;
+}
+
+/* Initialize strides for a C-contiguous array. */
+Py_LOCAL_INLINE(void)
+init_strides_from_shape(Py_buffer *view)
+{
+ Py_ssize_t i;
+
+ assert(view->ndim > 0);
+
+ view->strides[view->ndim-1] = view->itemsize;
+ for (i = view->ndim-2; i >= 0; i--)
+ view->strides[i] = view->strides[i+1] * view->shape[i+1];
+}
+
+/* Initialize strides for a Fortran-contiguous array. */
+Py_LOCAL_INLINE(void)
+init_fortran_strides_from_shape(Py_buffer *view)
+{
+ Py_ssize_t i;
+
+ assert(view->ndim > 0);
+
+ view->strides[0] = view->itemsize;
+ for (i = 1; i < view->ndim; i++)
+ view->strides[i] = view->strides[i-1] * view->shape[i-1];
+}
+
+/* Copy src to a contiguous representation. order is one of 'C', 'F' (Fortran)
+ or 'A' (Any). Assumptions: src has PyBUF_FULL information, src->ndim >= 1,
+ len(mem) == src->len. */
+static int
+buffer_to_contiguous(char *mem, Py_buffer *src, char order)
+{
+ Py_buffer dest;
+ Py_ssize_t *strides;
+ int ret;
+
+ assert(src->ndim >= 1);
+ assert(src->shape != NULL);
+ assert(src->strides != NULL);
+
+ strides = PyMem_Malloc(src->ndim * (sizeof *src->strides));
+ if (strides == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+
+ /* initialize dest */
+ dest = *src;
+ dest.buf = mem;
+ /* shape is constant and shared: the logical representation of the
+ array is unaltered. */
+
+ /* The physical representation determined by strides (and possibly
+ suboffsets) may change. */
+ dest.strides = strides;
+ if (order == 'C' || order == 'A') {
+ init_strides_from_shape(&dest);
+ }
+ else {
+ init_fortran_strides_from_shape(&dest);
+ }
+
+ dest.suboffsets = NULL;
+
+ ret = copy_buffer(&dest, src);
+
+ PyMem_Free(strides);
+ return ret;
+}
+
+
+/****************************************************************************/
+/* Constructors */
+/****************************************************************************/
+
+/* Initialize values that are shared with the managed buffer. */
+Py_LOCAL_INLINE(void)
+init_shared_values(Py_buffer *dest, const Py_buffer *src)
+{
+ dest->obj = src->obj;
+ dest->buf = src->buf;
+ dest->len = src->len;
+ dest->itemsize = src->itemsize;
+ dest->readonly = src->readonly;
+ dest->format = src->format ? src->format : "B";
+ dest->internal = src->internal;
+}
+
+/* Copy shape and strides. Reconstruct missing values. */
+static void
+init_shape_strides(Py_buffer *dest, const Py_buffer *src)
+{
+ Py_ssize_t i;
+
+ if (src->ndim == 0) {
+ dest->shape = NULL;
+ dest->strides = NULL;
+ return;
+ }
+ if (src->ndim == 1) {
+ dest->shape[0] = src->shape ? src->shape[0] : src->len / src->itemsize;
+ dest->strides[0] = src->strides ? src->strides[0] : src->itemsize;
+ return;
+ }
+
+ for (i = 0; i < src->ndim; i++)
+ dest->shape[i] = src->shape[i];
+ if (src->strides) {
+ for (i = 0; i < src->ndim; i++)
+ dest->strides[i] = src->strides[i];
+ }
+ else {
+ init_strides_from_shape(dest);
+ }
+}
+
+Py_LOCAL_INLINE(void)
+init_suboffsets(Py_buffer *dest, const Py_buffer *src)
+{
+ Py_ssize_t i;
+
+ if (src->suboffsets == NULL) {
+ dest->suboffsets = NULL;
+ return;
+ }
+ for (i = 0; i < src->ndim; i++)
+ dest->suboffsets[i] = src->suboffsets[i];
+}
+
+/* len = product(shape) * itemsize */
+Py_LOCAL_INLINE(void)
+init_len(Py_buffer *view)
+{
+ Py_ssize_t i, len;
+
+ len = 1;
+ for (i = 0; i < view->ndim; i++)
+ len *= view->shape[i];
+ len *= view->itemsize;
+
+ view->len = len;
+}
+
+/* Initialize memoryview buffer properties. */
+static void
+init_flags(PyMemoryViewObject *mv)
+{
+ const Py_buffer *view = &mv->view;
+ int flags = 0;
+
+ switch (view->ndim) {
+ case 0:
+ flags |= (_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C|
+ _Py_MEMORYVIEW_FORTRAN);
+ break;
+ case 1:
+ if (MV_CONTIGUOUS_NDIM1(view))
+ flags |= (_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN);
+ break;
+ default:
+ if (PyBuffer_IsContiguous(view, 'C'))
+ flags |= _Py_MEMORYVIEW_C;
+ if (PyBuffer_IsContiguous(view, 'F'))
+ flags |= _Py_MEMORYVIEW_FORTRAN;
+ break;
+ }
+
+ if (view->suboffsets) {
+ flags |= _Py_MEMORYVIEW_PIL;
+ flags &= ~(_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN);
+ }
+
+ mv->flags = flags;
+}
+
+/* Allocate a new memoryview and perform basic initialization. New memoryviews
+ are exclusively created through the mbuf_add functions. */
+Py_LOCAL_INLINE(PyMemoryViewObject *)
+memory_alloc(int ndim)
+{
+ PyMemoryViewObject *mv;
+
+ mv = (PyMemoryViewObject *)
+ PyObject_GC_NewVar(PyMemoryViewObject, &PyMemoryView_Type, 3*ndim);
+ if (mv == NULL)
+ return NULL;
+
+ mv->mbuf = NULL;
+ mv->hash = -1;
+ mv->flags = 0;
+ mv->exports = 0;
+ mv->view.ndim = ndim;
+ mv->view.shape = mv->ob_array;
+ mv->view.strides = mv->ob_array + ndim;
+ mv->view.suboffsets = mv->ob_array + 2 * ndim;
+ mv->weakreflist = NULL;
+
+ _PyObject_GC_TRACK(mv);
+ return mv;
+}
+
+/*
+ Return a new memoryview that is registered with mbuf. If src is NULL,
+ use mbuf->master as the underlying buffer. Otherwise, use src.
+
+ The new memoryview has full buffer information: shape and strides
+ are always present, suboffsets as needed. Arrays are copied to
+ the memoryview's ob_array field.
+ */
+static PyObject *
+mbuf_add_view(_PyManagedBufferObject *mbuf, const Py_buffer *src)
+{
+ PyMemoryViewObject *mv;
+ Py_buffer *dest;
+
+ if (src == NULL)
+ src = &mbuf->master;
+
+ if (src->ndim > PyBUF_MAX_NDIM) {
+ PyErr_SetString(PyExc_ValueError,
+ "memoryview: number of dimensions must not exceed "
+ STRINGIZE(PyBUF_MAX_NDIM));
+ return NULL;
+ }
+
+ mv = memory_alloc(src->ndim);
+ if (mv == NULL)
+ return NULL;
+
+ dest = &mv->view;
+ init_shared_values(dest, src);
+ init_shape_strides(dest, src);
+ init_suboffsets(dest, src);
+ init_flags(mv);
+
+ mv->mbuf = mbuf;
+ Py_INCREF(mbuf);
+ mbuf->exports++;
+
+ return (PyObject *)mv;
+}
+
+/* Register an incomplete view: shape, strides, suboffsets and flags still
+ need to be initialized. Use 'ndim' instead of src->ndim to determine the
+ size of the memoryview's ob_array.
+
+ Assumption: ndim <= PyBUF_MAX_NDIM. */
+static PyObject *
+mbuf_add_incomplete_view(_PyManagedBufferObject *mbuf, const Py_buffer *src,
+ int ndim)
+{
+ PyMemoryViewObject *mv;
+ Py_buffer *dest;
+
+ if (src == NULL)
+ src = &mbuf->master;
+
+ assert(ndim <= PyBUF_MAX_NDIM);
+
+ mv = memory_alloc(ndim);
+ if (mv == NULL)
+ return NULL;
+
+ dest = &mv->view;
+ init_shared_values(dest, src);
+
+ mv->mbuf = mbuf;
+ Py_INCREF(mbuf);
+ mbuf->exports++;
+
+ return (PyObject *)mv;
+}
+
+/* Expose a raw memory area as a view of contiguous bytes. flags can be
+ PyBUF_READ or PyBUF_WRITE. view->format is set to "B" (unsigned bytes).
+ The memoryview has complete buffer information. */
+PyObject *
+PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
+{
+ _PyManagedBufferObject *mbuf;
+ PyObject *mv;
+ int readonly;
+
+ assert(mem != NULL);
+ assert(flags == PyBUF_READ || flags == PyBUF_WRITE);
+
+ mbuf = mbuf_alloc();
+ if (mbuf == NULL)
+ return NULL;
+
+ readonly = (flags == PyBUF_WRITE) ? 0 : 1;
+ (void)PyBuffer_FillInfo(&mbuf->master, NULL, mem, size, readonly,
+ PyBUF_FULL_RO);
+
+ mv = mbuf_add_view(mbuf, NULL);
+ Py_DECREF(mbuf);
+
+ return mv;
+}
+
+/* Create a memoryview from a given Py_buffer. For simple byte views,
+ PyMemoryView_FromMemory() should be used instead.
+ This function is the only entry point that can create a master buffer
+ without full information. Because of this fact init_shape_strides()
+ must be able to reconstruct missing values. */
PyObject *
PyMemoryView_FromBuffer(Py_buffer *info)
{
- PyMemoryViewObject *mview;
+ _PyManagedBufferObject *mbuf;
+ PyObject *mv;
if (info->buf == NULL) {
PyErr_SetString(PyExc_ValueError,
- "cannot make memory view from a buffer with a NULL data pointer");
+ "PyMemoryView_FromBuffer(): info->buf must not be NULL");
return NULL;
}
- mview = (PyMemoryViewObject *)
- PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
- if (mview == NULL)
+
+ mbuf = mbuf_alloc();
+ if (mbuf == NULL)
return NULL;
- dup_buffer(&mview->view, info);
- /* NOTE: mview->view.obj should already have been incref'ed as
- part of PyBuffer_FillInfo(). */
- _PyObject_GC_TRACK(mview);
- return (PyObject *)mview;
+
+ /* info->obj is either NULL or a borrowed reference. This reference
+ should not be decremented in PyBuffer_Release(). */
+ mbuf->master = *info;
+ mbuf->master.obj = NULL;
+
+ mv = mbuf_add_view(mbuf, NULL);
+ Py_DECREF(mbuf);
+
+ return mv;
}
+/* Create a memoryview from an object that implements the buffer protocol.
+ If the object is a memoryview, the new memoryview must be registered
+ with the same managed buffer. Otherwise, a new managed buffer is created. */
PyObject *
-PyMemoryView_FromObject(PyObject *base)
+PyMemoryView_FromObject(PyObject *v)
{
- PyMemoryViewObject *mview;
- Py_buffer view;
+ _PyManagedBufferObject *mbuf;
- if (!PyObject_CheckBuffer(base)) {
- PyErr_SetString(PyExc_TypeError,
- "cannot make memory view because object does "
- "not have the buffer interface");
+ if (PyMemoryView_Check(v)) {
+ PyMemoryViewObject *mv = (PyMemoryViewObject *)v;
+ CHECK_RELEASED(mv);
+ return mbuf_add_view(mv->mbuf, &mv->view);
+ }
+ else if (PyObject_CheckBuffer(v)) {
+ PyObject *ret;
+ mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(v);
+ if (mbuf == NULL)
+ return NULL;
+ ret = mbuf_add_view(mbuf, NULL);
+ Py_DECREF(mbuf);
+ return ret;
+ }
+
+ PyErr_Format(PyExc_TypeError,
+ "memoryview: %.200s object does not have the buffer interface",
+ Py_TYPE(v)->tp_name);
+ return NULL;
+}
+
+/* Copy the format string from a base object that might vanish. */
+static int
+mbuf_copy_format(_PyManagedBufferObject *mbuf, const char *fmt)
+{
+ if (fmt != NULL) {
+ char *cp = PyMem_Malloc(strlen(fmt)+1);
+ if (cp == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ mbuf->master.format = strcpy(cp, fmt);
+ mbuf->flags |= _Py_MANAGED_BUFFER_FREE_FORMAT;
+ }
+
+ return 0;
+}
+
+/*
+ Return a memoryview that is based on a contiguous copy of src.
+ Assumptions: src has PyBUF_FULL_RO information, src->ndim > 0.
+
+ Ownership rules:
+ 1) As usual, the returned memoryview has a private copy
+ of src->shape, src->strides and src->suboffsets.
+ 2) src->format is copied to the master buffer and released
+ in mbuf_dealloc(). The releasebufferproc of the bytes
+ object is NULL, so it does not matter that mbuf_release()
+ passes the altered format pointer to PyBuffer_Release().
+*/
+static PyObject *
+memory_from_contiguous_copy(Py_buffer *src, char order)
+{
+ _PyManagedBufferObject *mbuf;
+ PyMemoryViewObject *mv;
+ PyObject *bytes;
+ Py_buffer *dest;
+ int i;
+
+ assert(src->ndim > 0);
+ assert(src->shape != NULL);
+
+ bytes = PyBytes_FromStringAndSize(NULL, src->len);
+ if (bytes == NULL)
+ return NULL;
+
+ mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(bytes);
+ Py_DECREF(bytes);
+ if (mbuf == NULL)
+ return NULL;
+
+ if (mbuf_copy_format(mbuf, src->format) < 0) {
+ Py_DECREF(mbuf);
return NULL;
}
- if (PyObject_GetBuffer(base, &view, PyBUF_FULL_RO) < 0)
+ mv = (PyMemoryViewObject *)mbuf_add_incomplete_view(mbuf, NULL, src->ndim);
+ Py_DECREF(mbuf);
+ if (mv == NULL)
return NULL;
- mview = (PyMemoryViewObject *)PyMemoryView_FromBuffer(&view);
- if (mview == NULL) {
- PyBuffer_Release(&view);
+ dest = &mv->view;
+
+ /* shared values are initialized correctly except for itemsize */
+ dest->itemsize = src->itemsize;
+
+ /* shape and strides */
+ for (i = 0; i < src->ndim; i++) {
+ dest->shape[i] = src->shape[i];
+ }
+ if (order == 'C' || order == 'A') {
+ init_strides_from_shape(dest);
+ }
+ else {
+ init_fortran_strides_from_shape(dest);
+ }
+ /* suboffsets */
+ dest->suboffsets = NULL;
+
+ /* flags */
+ init_flags(mv);
+
+ if (copy_buffer(dest, src) < 0) {
+ Py_DECREF(mv);
return NULL;
}
- return (PyObject *)mview;
+ return (PyObject *)mv;
}
+/*
+ Return a new memoryview object based on a contiguous exporter with
+ buffertype={PyBUF_READ, PyBUF_WRITE} and order={'C', 'F'ortran, or 'A'ny}.
+ The logical structure of the input and output buffers is the same
+ (i.e. tolist(input) == tolist(output)), but the physical layout in
+ memory can be explicitly chosen.
+
+ As usual, if buffertype=PyBUF_WRITE, the exporter's buffer must be writable,
+ otherwise it may be writable or read-only.
+
+ If the exporter is already contiguous with the desired target order,
+ the memoryview will be directly based on the exporter.
+
+ Otherwise, if the buffertype is PyBUF_READ, the memoryview will be
+ based on a new bytes object. If order={'C', 'A'ny}, use 'C' order,
+ 'F'ortran order otherwise.
+*/
+PyObject *
+PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char order)
+{
+ PyMemoryViewObject *mv;
+ PyObject *ret;
+ Py_buffer *view;
+
+ assert(buffertype == PyBUF_READ || buffertype == PyBUF_WRITE);
+ assert(order == 'C' || order == 'F' || order == 'A');
+
+ mv = (PyMemoryViewObject *)PyMemoryView_FromObject(obj);
+ if (mv == NULL)
+ return NULL;
+
+ view = &mv->view;
+ if (buffertype == PyBUF_WRITE && view->readonly) {
+ PyErr_SetString(PyExc_BufferError,
+ "underlying buffer is not writable");
+ Py_DECREF(mv);
+ return NULL;
+ }
+
+ if (PyBuffer_IsContiguous(view, order))
+ return (PyObject *)mv;
+
+ if (buffertype == PyBUF_WRITE) {
+ PyErr_SetString(PyExc_BufferError,
+ "writable contiguous buffer requested "
+ "for a non-contiguous object.");
+ Py_DECREF(mv);
+ return NULL;
+ }
+
+ ret = memory_from_contiguous_copy(view, order);
+ Py_DECREF(mv);
+ return ret;
+}
+
+
static PyObject *
memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
{
PyObject *obj;
- static char *kwlist[] = {"object", 0};
+ static char *kwlist[] = {"object", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:memoryview", kwlist,
&obj)) {
@@ -131,479 +959,1284 @@ memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
}
-static void
-_strided_copy_nd(char *dest, char *src, int nd, Py_ssize_t *shape,
- Py_ssize_t *strides, Py_ssize_t itemsize, char fort)
+/****************************************************************************/
+/* Previously in abstract.c */
+/****************************************************************************/
+
+typedef struct {
+ Py_buffer view;
+ Py_ssize_t array[1];
+} Py_buffer_full;
+
+int
+PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order)
{
- int k;
- Py_ssize_t outstride;
+ Py_buffer_full *fb = NULL;
+ int ret;
+
+ assert(order == 'C' || order == 'F' || order == 'A');
- if (nd==0) {
- memcpy(dest, src, itemsize);
+ if (len != src->len) {
+ PyErr_SetString(PyExc_ValueError,
+ "PyBuffer_ToContiguous: len != view->len");
+ return -1;
}
- else if (nd == 1) {
- for (k = 0; k<shape[0]; k++) {
- memcpy(dest, src, itemsize);
- dest += itemsize;
- src += strides[0];
- }
+
+ if (PyBuffer_IsContiguous(src, order)) {
+ memcpy((char *)buf, src->buf, len);
+ return 0;
}
- else {
- if (fort == 'F') {
- /* Copy first dimension first,
- second dimension second, etc...
- Set up the recursive loop backwards so that final
- dimension is actually copied last.
- */
- outstride = itemsize;
- for (k=1; k<nd-1;k++) {
- outstride *= shape[k];
- }
- for (k=0; k<shape[nd-1]; k++) {
- _strided_copy_nd(dest, src, nd-1, shape,
- strides, itemsize, fort);
- dest += outstride;
- src += strides[nd-1];
- }
- }
- else {
- /* Copy last dimension first,
- second-to-last dimension second, etc.
- Set up the recursion so that the
- first dimension is copied last
- */
- outstride = itemsize;
- for (k=1; k < nd; k++) {
- outstride *= shape[k];
- }
- for (k=0; k<shape[0]; k++) {
- _strided_copy_nd(dest, src, nd-1, shape+1,
- strides+1, itemsize,
- fort);
- dest += outstride;
- src += strides[0];
- }
- }
+ /* buffer_to_contiguous() assumes PyBUF_FULL */
+ fb = PyMem_Malloc(sizeof *fb + 3 * src->ndim * (sizeof *fb->array));
+ if (fb == NULL) {
+ PyErr_NoMemory();
+ return -1;
}
- return;
+ fb->view.ndim = src->ndim;
+ fb->view.shape = fb->array;
+ fb->view.strides = fb->array + src->ndim;
+ fb->view.suboffsets = fb->array + 2 * src->ndim;
+
+ init_shared_values(&fb->view, src);
+ init_shape_strides(&fb->view, src);
+ init_suboffsets(&fb->view, src);
+
+ src = &fb->view;
+
+ ret = buffer_to_contiguous(buf, src, order);
+ PyMem_Free(fb);
+ return ret;
}
+
+/****************************************************************************/
+/* Release/GC management */
+/****************************************************************************/
+
+/* Inform the managed buffer that this particular memoryview will not access
+ the underlying buffer again. If no other memoryviews are registered with
+ the managed buffer, the underlying buffer is released instantly and
+ marked as inaccessible for both the memoryview and the managed buffer.
+
+ This function fails if the memoryview itself has exported buffers. */
static int
-_indirect_copy_nd(char *dest, Py_buffer *view, char fort)
+_memory_release(PyMemoryViewObject *self)
{
- Py_ssize_t *indices;
- int k;
- Py_ssize_t elements;
- char *ptr;
- void (*func)(int, Py_ssize_t *, const Py_ssize_t *);
-
- if (view->ndim > PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) {
- PyErr_NoMemory();
+ if (self->flags & _Py_MEMORYVIEW_RELEASED)
+ return 0;
+
+ if (self->exports == 0) {
+ self->flags |= _Py_MEMORYVIEW_RELEASED;
+ assert(self->mbuf->exports > 0);
+ if (--self->mbuf->exports == 0)
+ mbuf_release(self->mbuf);
+ return 0;
+ }
+ if (self->exports > 0) {
+ PyErr_Format(PyExc_BufferError,
+ "memoryview has %zd exported buffer%s", self->exports,
+ self->exports==1 ? "" : "s");
return -1;
}
- indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view->ndim);
- if (indices == NULL) {
- PyErr_NoMemory();
- return -1;
+ Py_FatalError("_memory_release(): negative export count");
+ return -1;
+}
+
+static PyObject *
+memory_release(PyMemoryViewObject *self, PyObject *noargs)
+{
+ if (_memory_release(self) < 0)
+ return NULL;
+ Py_RETURN_NONE;
+}
+
+static void
+memory_dealloc(PyMemoryViewObject *self)
+{
+ assert(self->exports == 0);
+ _PyObject_GC_UNTRACK(self);
+ (void)_memory_release(self);
+ Py_CLEAR(self->mbuf);
+ if (self->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) self);
+ PyObject_GC_Del(self);
+}
+
+static int
+memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->mbuf);
+ return 0;
+}
+
+static int
+memory_clear(PyMemoryViewObject *self)
+{
+ (void)_memory_release(self);
+ Py_CLEAR(self->mbuf);
+ return 0;
+}
+
+static PyObject *
+memory_enter(PyObject *self, PyObject *args)
+{
+ CHECK_RELEASED(self);
+ Py_INCREF(self);
+ return self;
+}
+
+static PyObject *
+memory_exit(PyObject *self, PyObject *args)
+{
+ return memory_release((PyMemoryViewObject *)self, NULL);
+}
+
+
+/****************************************************************************/
+/* Casting format and shape */
+/****************************************************************************/
+
+#define IS_BYTE_FORMAT(f) (f == 'b' || f == 'B' || f == 'c')
+
+Py_LOCAL_INLINE(Py_ssize_t)
+get_native_fmtchar(char *result, const char *fmt)
+{
+ Py_ssize_t size = -1;
+
+ if (fmt[0] == '@') fmt++;
+
+ switch (fmt[0]) {
+ case 'c': case 'b': case 'B': size = sizeof(char); break;
+ case 'h': case 'H': size = sizeof(short); break;
+ case 'i': case 'I': size = sizeof(int); break;
+ case 'l': case 'L': size = sizeof(long); break;
+ #ifdef HAVE_LONG_LONG
+ case 'q': case 'Q': size = sizeof(PY_LONG_LONG); break;
+ #endif
+ case 'n': case 'N': size = sizeof(Py_ssize_t); break;
+ case 'f': size = sizeof(float); break;
+ case 'd': size = sizeof(double); break;
+ #ifdef HAVE_C99_BOOL
+ case '?': size = sizeof(_Bool); break;
+ #else
+ case '?': size = sizeof(char); break;
+ #endif
+ case 'P': size = sizeof(void *); break;
+ }
+
+ if (size > 0 && fmt[1] == '\0') {
+ *result = fmt[0];
+ return size;
+ }
+
+ return -1;
+}
+
+/* Cast a memoryview's data type to 'format'. The input array must be
+ C-contiguous. At least one of input-format, output-format must have
+ byte size. The output array is 1-D, with the same byte length as the
+ input array. Thus, view->len must be a multiple of the new itemsize. */
+static int
+cast_to_1D(PyMemoryViewObject *mv, PyObject *format)
+{
+ Py_buffer *view = &mv->view;
+ PyObject *asciifmt;
+ char srcchar, destchar;
+ Py_ssize_t itemsize;
+ int ret = -1;
+
+ assert(view->ndim >= 1);
+ assert(Py_SIZE(mv) == 3*view->ndim);
+ assert(view->shape == mv->ob_array);
+ assert(view->strides == mv->ob_array + view->ndim);
+ assert(view->suboffsets == mv->ob_array + 2*view->ndim);
+
+ if (get_native_fmtchar(&srcchar, view->format) < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "memoryview: source format must be a native single character "
+ "format prefixed with an optional '@'");
+ return ret;
}
- for (k=0; k<view->ndim;k++) {
- indices[k] = 0;
+
+ asciifmt = PyUnicode_AsASCIIString(format);
+ if (asciifmt == NULL)
+ return ret;
+
+ itemsize = get_native_fmtchar(&destchar, PyBytes_AS_STRING(asciifmt));
+ if (itemsize < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "memoryview: destination format must be a native single "
+ "character format prefixed with an optional '@'");
+ goto out;
}
- elements = 1;
- for (k=0; k<view->ndim; k++) {
- elements *= view->shape[k];
+ if (!IS_BYTE_FORMAT(srcchar) && !IS_BYTE_FORMAT(destchar)) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: cannot cast between two non-byte formats");
+ goto out;
+ }
+ if (view->len % itemsize) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: length is not a multiple of itemsize");
+ goto out;
}
- if (fort == 'F') {
- func = _Py_add_one_to_index_F;
+
+ strncpy(mv->format, PyBytes_AS_STRING(asciifmt),
+ _Py_MEMORYVIEW_MAX_FORMAT);
+ mv->format[_Py_MEMORYVIEW_MAX_FORMAT-1] = '\0';
+ view->format = mv->format;
+ view->itemsize = itemsize;
+
+ view->ndim = 1;
+ view->shape[0] = view->len / view->itemsize;
+ view->strides[0] = view->itemsize;
+ view->suboffsets = NULL;
+
+ init_flags(mv);
+
+ ret = 0;
+
+out:
+ Py_DECREF(asciifmt);
+ return ret;
+}
+
+/* The memoryview must have space for 3*len(seq) elements. */
+static Py_ssize_t
+copy_shape(Py_ssize_t *shape, const PyObject *seq, Py_ssize_t ndim,
+ Py_ssize_t itemsize)
+{
+ Py_ssize_t x, i;
+ Py_ssize_t len = itemsize;
+
+ for (i = 0; i < ndim; i++) {
+ PyObject *tmp = PySequence_Fast_GET_ITEM(seq, i);
+ if (!PyLong_Check(tmp)) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview.cast(): elements of shape must be integers");
+ return -1;
+ }
+ x = PyLong_AsSsize_t(tmp);
+ if (x == -1 && PyErr_Occurred()) {
+ return -1;
+ }
+ if (x <= 0) {
+ /* In general elements of shape may be 0, but not for casting. */
+ PyErr_Format(PyExc_ValueError,
+ "memoryview.cast(): elements of shape must be integers > 0");
+ return -1;
+ }
+ if (x > PY_SSIZE_T_MAX / len) {
+ PyErr_Format(PyExc_ValueError,
+ "memoryview.cast(): product(shape) > SSIZE_MAX");
+ return -1;
+ }
+ len *= x;
+ shape[i] = x;
+ }
+
+ return len;
+}
+
+/* Cast a 1-D array to a new shape. The result array will be C-contiguous.
+ If the result array does not have exactly the same byte length as the
+ input array, raise ValueError. */
+static int
+cast_to_ND(PyMemoryViewObject *mv, const PyObject *shape, int ndim)
+{
+ Py_buffer *view = &mv->view;
+ Py_ssize_t len;
+
+ assert(view->ndim == 1); /* ndim from cast_to_1D() */
+ assert(Py_SIZE(mv) == 3*(ndim==0?1:ndim)); /* ndim of result array */
+ assert(view->shape == mv->ob_array);
+ assert(view->strides == mv->ob_array + (ndim==0?1:ndim));
+ assert(view->suboffsets == NULL);
+
+ view->ndim = ndim;
+ if (view->ndim == 0) {
+ view->shape = NULL;
+ view->strides = NULL;
+ len = view->itemsize;
}
else {
- func = _Py_add_one_to_index_C;
+ len = copy_shape(view->shape, shape, ndim, view->itemsize);
+ if (len < 0)
+ return -1;
+ init_strides_from_shape(view);
}
- while (elements--) {
- func(view->ndim, indices, view->shape);
- ptr = PyBuffer_GetPointer(view, indices);
- memcpy(dest, ptr, view->itemsize);
- dest += view->itemsize;
+
+ if (view->len != len) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: product(shape) * itemsize != buffer size");
+ return -1;
}
- PyMem_Free(indices);
+ init_flags(mv);
+
+ return 0;
+}
+
+static int
+zero_in_shape(PyMemoryViewObject *mv)
+{
+ Py_buffer *view = &mv->view;
+ Py_ssize_t i;
+
+ for (i = 0; i < view->ndim; i++)
+ if (view->shape[i] == 0)
+ return 1;
+
return 0;
}
/*
- Get a the data from an object as a contiguous chunk of memory (in
- either 'C' or 'F'ortran order) even if it means copying it into a
- separate memory area.
-
- Returns a new reference to a Memory view object. If no copy is needed,
- the memory view object points to the original memory and holds a
- lock on the original. If a copy is needed, then the memory view object
- points to a brand-new Bytes object (and holds a memory lock on it).
-
- buffertype
-
- PyBUF_READ buffer only needs to be read-only
- PyBUF_WRITE buffer needs to be writable (give error if not contiguous)
- PyBUF_SHADOW buffer needs to be writable so shadow it with
- a contiguous buffer if it is not. The view will point to
- the shadow buffer which can be written to and then
- will be copied back into the other buffer when the memory
- view is de-allocated. While the shadow buffer is
- being used, it will have an exclusive write lock on
- the original buffer.
- */
+ Cast a copy of 'self' to a different view. The input view must
+ be C-contiguous. The function always casts the input view to a
+ 1-D output according to 'format'. At least one of input-format,
+ output-format must have byte size.
-PyObject *
-PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort)
+ If 'shape' is given, the 1-D view from the previous step will
+ be cast to a C-contiguous view with new shape and strides.
+
+ All casts must result in views that will have the exact byte
+ size of the original input. Otherwise, an error is raised.
+*/
+static PyObject *
+memory_cast(PyMemoryViewObject *self, PyObject *args, PyObject *kwds)
{
- PyMemoryViewObject *mem;
- PyObject *bytes;
- Py_buffer *view;
- int flags;
- char *dest;
+ static char *kwlist[] = {"format", "shape", NULL};
+ PyMemoryViewObject *mv = NULL;
+ PyObject *shape = NULL;
+ PyObject *format;
+ Py_ssize_t ndim = 1;
+
+ CHECK_RELEASED(self);
- if (!PyObject_CheckBuffer(obj)) {
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
+ &format, &shape)) {
+ return NULL;
+ }
+ if (!PyUnicode_Check(format)) {
PyErr_SetString(PyExc_TypeError,
- "object does not support the buffer interface");
+ "memoryview: format argument must be a string");
return NULL;
}
-
- mem = PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
- if (mem == NULL)
+ if (!MV_C_CONTIGUOUS(self->flags)) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: casts are restricted to C-contiguous views");
+ return NULL;
+ }
+ if (zero_in_shape(self)) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: cannot cast view with zeros in shape or strides");
return NULL;
-
- view = &mem->view;
- flags = PyBUF_FULL_RO;
- switch(buffertype) {
- case PyBUF_WRITE:
- flags = PyBUF_FULL;
- break;
+ }
+ if (shape) {
+ CHECK_LIST_OR_TUPLE(shape)
+ ndim = PySequence_Fast_GET_SIZE(shape);
+ if (ndim > PyBUF_MAX_NDIM) {
+ PyErr_SetString(PyExc_ValueError,
+ "memoryview: number of dimensions must not exceed "
+ STRINGIZE(PyBUF_MAX_NDIM));
+ return NULL;
+ }
+ if (self->view.ndim != 1 && ndim != 1) {
+ PyErr_SetString(PyExc_TypeError,
+ "memoryview: cast must be 1D -> ND or ND -> 1D");
+ return NULL;
+ }
}
- if (PyObject_GetBuffer(obj, view, flags) != 0) {
- Py_DECREF(mem);
+ mv = (PyMemoryViewObject *)
+ mbuf_add_incomplete_view(self->mbuf, &self->view, ndim==0 ? 1 : (int)ndim);
+ if (mv == NULL)
return NULL;
+
+ if (cast_to_1D(mv, format) < 0)
+ goto error;
+ if (shape && cast_to_ND(mv, shape, (int)ndim) < 0)
+ goto error;
+
+ return (PyObject *)mv;
+
+error:
+ Py_DECREF(mv);
+ return NULL;
+}
+
+
+/**************************************************************************/
+/* getbuffer */
+/**************************************************************************/
+
+static int
+memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
+{
+ Py_buffer *base = &self->view;
+ int baseflags = self->flags;
+
+ CHECK_RELEASED_INT(self);
+
+ /* start with complete information */
+ *view = *base;
+ view->obj = NULL;
+
+ if (REQ_WRITABLE(flags) && base->readonly) {
+ PyErr_SetString(PyExc_BufferError,
+ "memoryview: underlying buffer is not writable");
+ return -1;
+ }
+ if (!REQ_FORMAT(flags)) {
+ /* NULL indicates that the buffer's data type has been cast to 'B'.
+ view->itemsize is the _previous_ itemsize. If shape is present,
+ the equality product(shape) * itemsize = len still holds at this
+ point. The equality calcsize(format) = itemsize does _not_ hold
+ from here on! */
+ view->format = NULL;
}
- if (PyBuffer_IsContiguous(view, fort)) {
- /* no copy needed */
- _PyObject_GC_TRACK(mem);
- return (PyObject *)mem;
+ if (REQ_C_CONTIGUOUS(flags) && !MV_C_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "memoryview: underlying buffer is not C-contiguous");
+ return -1;
}
- /* otherwise a copy is needed */
- if (buffertype == PyBUF_WRITE) {
- Py_DECREF(mem);
+ if (REQ_F_CONTIGUOUS(flags) && !MV_F_CONTIGUOUS(baseflags)) {
PyErr_SetString(PyExc_BufferError,
- "writable contiguous buffer requested "
- "for a non-contiguousobject.");
- return NULL;
+ "memoryview: underlying buffer is not Fortran contiguous");
+ return -1;
}
- bytes = PyBytes_FromStringAndSize(NULL, view->len);
- if (bytes == NULL) {
- Py_DECREF(mem);
- return NULL;
+ if (REQ_ANY_CONTIGUOUS(flags) && !MV_ANY_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "memoryview: underlying buffer is not contiguous");
+ return -1;
}
- dest = PyBytes_AS_STRING(bytes);
- /* different copying strategy depending on whether
- or not any pointer de-referencing is needed
- */
- /* strided or in-direct copy */
- if (view->suboffsets==NULL) {
- _strided_copy_nd(dest, view->buf, view->ndim, view->shape,
- view->strides, view->itemsize, fort);
+ if (!REQ_INDIRECT(flags) && (baseflags & _Py_MEMORYVIEW_PIL)) {
+ PyErr_SetString(PyExc_BufferError,
+ "memoryview: underlying buffer requires suboffsets");
+ return -1;
}
- else {
- if (_indirect_copy_nd(dest, view, fort) < 0) {
- Py_DECREF(bytes);
- Py_DECREF(mem);
- return NULL;
+ if (!REQ_STRIDES(flags)) {
+ if (!MV_C_CONTIGUOUS(baseflags)) {
+ PyErr_SetString(PyExc_BufferError,
+ "memoryview: underlying buffer is not C-contiguous");
+ return -1;
}
- PyBuffer_Release(view); /* XXX ? */
+ view->strides = NULL;
+ }
+ if (!REQ_SHAPE(flags)) {
+ /* PyBUF_SIMPLE or PyBUF_WRITABLE: at this point buf is C-contiguous,
+ so base->buf = ndbuf->data. */
+ if (view->format != NULL) {
+ /* PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT do
+ not make sense. */
+ PyErr_Format(PyExc_BufferError,
+ "ndarray: cannot cast to unsigned bytes if the format flag "
+ "is present");
+ return -1;
+ }
+ /* product(shape) * itemsize = len and calcsize(format) = itemsize
+ do _not_ hold from here on! */
+ view->ndim = 1;
+ view->shape = NULL;
}
- _PyObject_GC_TRACK(mem);
- return (PyObject *)mem;
-}
-static PyObject *
-memory_format_get(PyMemoryViewObject *self)
+ view->obj = (PyObject *)self;
+ Py_INCREF(view->obj);
+ self->exports++;
+
+ return 0;
+}
+
+static void
+memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view)
{
- CHECK_RELEASED(self);
- return PyUnicode_FromString(self->view.format);
+ self->exports--;
+ return;
+ /* PyBuffer_Release() decrements view->obj after this function returns. */
}
-static PyObject *
-memory_itemsize_get(PyMemoryViewObject *self)
+/* Buffer methods */
+static PyBufferProcs memory_as_buffer = {
+ (getbufferproc)memory_getbuf, /* bf_getbuffer */
+ (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */
+};
+
+
+/****************************************************************************/
+/* Optimized pack/unpack for all native format specifiers */
+/****************************************************************************/
+
+/*
+ Fix exceptions:
+ 1) Include format string in the error message.
+ 2) OverflowError -> ValueError.
+ 3) The error message from PyNumber_Index() is not ideal.
+*/
+static int
+type_error_int(const char *fmt)
{
- CHECK_RELEASED(self);
- return PyLong_FromSsize_t(self->view.itemsize);
+ PyErr_Format(PyExc_TypeError,
+ "memoryview: invalid type for format '%s'", fmt);
+ return -1;
}
-static PyObject *
-_IntTupleFromSsizet(int len, Py_ssize_t *vals)
+static int
+value_error_int(const char *fmt)
{
- int i;
- PyObject *o;
- PyObject *intTuple;
+ PyErr_Format(PyExc_ValueError,
+ "memoryview: invalid value for format '%s'", fmt);
+ return -1;
+}
- if (vals == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
+static int
+fix_error_int(const char *fmt)
+{
+ assert(PyErr_Occurred());
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+ PyErr_Clear();
+ return type_error_int(fmt);
}
- intTuple = PyTuple_New(len);
- if (!intTuple)
- return NULL;
- for (i=0; i<len; i++) {
- o = PyLong_FromSsize_t(vals[i]);
- if (!o) {
- Py_DECREF(intTuple);
- return NULL;
- }
- PyTuple_SET_ITEM(intTuple, i, o);
+ else if (PyErr_ExceptionMatches(PyExc_OverflowError) ||
+ PyErr_ExceptionMatches(PyExc_ValueError)) {
+ PyErr_Clear();
+ return value_error_int(fmt);
}
- return intTuple;
+
+ return -1;
}
-static PyObject *
-memory_shape_get(PyMemoryViewObject *self)
+/* Accept integer objects or objects with an __index__() method. */
+static long
+pylong_as_ld(PyObject *item)
{
- CHECK_RELEASED(self);
- return _IntTupleFromSsizet(self->view.ndim, self->view.shape);
+ PyObject *tmp;
+ long ld;
+
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return -1;
+
+ ld = PyLong_AsLong(tmp);
+ Py_DECREF(tmp);
+ return ld;
}
-static PyObject *
-memory_strides_get(PyMemoryViewObject *self)
+static unsigned long
+pylong_as_lu(PyObject *item)
{
- CHECK_RELEASED(self);
- return _IntTupleFromSsizet(self->view.ndim, self->view.strides);
+ PyObject *tmp;
+ unsigned long lu;
+
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return (unsigned long)-1;
+
+ lu = PyLong_AsUnsignedLong(tmp);
+ Py_DECREF(tmp);
+ return lu;
}
-static PyObject *
-memory_suboffsets_get(PyMemoryViewObject *self)
+#ifdef HAVE_LONG_LONG
+static PY_LONG_LONG
+pylong_as_lld(PyObject *item)
{
- CHECK_RELEASED(self);
- return _IntTupleFromSsizet(self->view.ndim, self->view.suboffsets);
+ PyObject *tmp;
+ PY_LONG_LONG lld;
+
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return -1;
+
+ lld = PyLong_AsLongLong(tmp);
+ Py_DECREF(tmp);
+ return lld;
}
-static PyObject *
-memory_readonly_get(PyMemoryViewObject *self)
+static unsigned PY_LONG_LONG
+pylong_as_llu(PyObject *item)
{
- CHECK_RELEASED(self);
- return PyBool_FromLong(self->view.readonly);
+ PyObject *tmp;
+ unsigned PY_LONG_LONG llu;
+
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return (unsigned PY_LONG_LONG)-1;
+
+ llu = PyLong_AsUnsignedLongLong(tmp);
+ Py_DECREF(tmp);
+ return llu;
}
+#endif
-static PyObject *
-memory_ndim_get(PyMemoryViewObject *self)
+static Py_ssize_t
+pylong_as_zd(PyObject *item)
{
- CHECK_RELEASED(self);
- return PyLong_FromLong(self->view.ndim);
+ PyObject *tmp;
+ Py_ssize_t zd;
+
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return -1;
+
+ zd = PyLong_AsSsize_t(tmp);
+ Py_DECREF(tmp);
+ return zd;
}
-PyDoc_STRVAR(memory_format_doc,
- "A string containing the format (in struct module style)\n"
- " for each element in the view.");
-PyDoc_STRVAR(memory_itemsize_doc,
- "The size in bytes of each element of the memoryview.");
-PyDoc_STRVAR(memory_shape_doc,
- "A tuple of ndim integers giving the shape of the memory\n"
- " as an N-dimensional array.");
-PyDoc_STRVAR(memory_strides_doc,
- "A tuple of ndim integers giving the size in bytes to access\n"
- " each element for each dimension of the array.");
-PyDoc_STRVAR(memory_suboffsets_doc,
- "A tuple of integers used internally for PIL-style arrays.");
-PyDoc_STRVAR(memory_readonly_doc,
- "A bool indicating whether the memory is read only.");
-PyDoc_STRVAR(memory_ndim_doc,
- "An integer indicating how many dimensions of a multi-dimensional\n"
- " array the memory represents.");
+static size_t
+pylong_as_zu(PyObject *item)
+{
+ PyObject *tmp;
+ size_t zu;
-static PyGetSetDef memory_getsetlist[] = {
- {"format", (getter)memory_format_get, NULL, memory_format_doc},
- {"itemsize", (getter)memory_itemsize_get, NULL, memory_itemsize_doc},
- {"shape", (getter)memory_shape_get, NULL, memory_shape_doc},
- {"strides", (getter)memory_strides_get, NULL, memory_strides_doc},
- {"suboffsets", (getter)memory_suboffsets_get, NULL, memory_suboffsets_doc},
- {"readonly", (getter)memory_readonly_get, NULL, memory_readonly_doc},
- {"ndim", (getter)memory_ndim_get, NULL, memory_ndim_doc},
- {NULL, NULL, NULL, NULL},
-};
+ tmp = PyNumber_Index(item);
+ if (tmp == NULL)
+ return (size_t)-1;
+ zu = PyLong_AsSize_t(tmp);
+ Py_DECREF(tmp);
+ return zu;
+}
-static PyObject *
-memory_tobytes(PyMemoryViewObject *mem, PyObject *noargs)
+/* Timings with the ndarray from _testbuffer.c indicate that using the
+ struct module is around 15x slower than the two functions below. */
+
+#define UNPACK_SINGLE(dest, ptr, type) \
+ do { \
+ type x; \
+ memcpy((char *)&x, ptr, sizeof x); \
+ dest = x; \
+ } while (0)
+
+/* Unpack a single item. 'fmt' can be any native format character in struct
+ module syntax. This function is very sensitive to small changes. With this
+ layout gcc automatically generates a fast jump table. */
+Py_LOCAL_INLINE(PyObject *)
+unpack_single(const char *ptr, const char *fmt)
{
- CHECK_RELEASED(mem);
- return PyObject_CallFunctionObjArgs(
- (PyObject *) &PyBytes_Type, mem, NULL);
+ unsigned PY_LONG_LONG llu;
+ unsigned long lu;
+ size_t zu;
+ PY_LONG_LONG lld;
+ long ld;
+ Py_ssize_t zd;
+ double d;
+ unsigned char uc;
+ void *p;
+
+ switch (fmt[0]) {
+
+ /* signed integers and fast path for 'B' */
+ case 'B': uc = *((unsigned char *)ptr); goto convert_uc;
+ case 'b': ld = *((signed char *)ptr); goto convert_ld;
+ case 'h': UNPACK_SINGLE(ld, ptr, short); goto convert_ld;
+ case 'i': UNPACK_SINGLE(ld, ptr, int); goto convert_ld;
+ case 'l': UNPACK_SINGLE(ld, ptr, long); goto convert_ld;
+
+ /* boolean */
+ #ifdef HAVE_C99_BOOL
+ case '?': UNPACK_SINGLE(ld, ptr, _Bool); goto convert_bool;
+ #else
+ case '?': UNPACK_SINGLE(ld, ptr, char); goto convert_bool;
+ #endif
+
+ /* unsigned integers */
+ case 'H': UNPACK_SINGLE(lu, ptr, unsigned short); goto convert_lu;
+ case 'I': UNPACK_SINGLE(lu, ptr, unsigned int); goto convert_lu;
+ case 'L': UNPACK_SINGLE(lu, ptr, unsigned long); goto convert_lu;
+
+ /* native 64-bit */
+ #ifdef HAVE_LONG_LONG
+ case 'q': UNPACK_SINGLE(lld, ptr, PY_LONG_LONG); goto convert_lld;
+ case 'Q': UNPACK_SINGLE(llu, ptr, unsigned PY_LONG_LONG); goto convert_llu;
+ #endif
+
+ /* ssize_t and size_t */
+ case 'n': UNPACK_SINGLE(zd, ptr, Py_ssize_t); goto convert_zd;
+ case 'N': UNPACK_SINGLE(zu, ptr, size_t); goto convert_zu;
+
+ /* floats */
+ case 'f': UNPACK_SINGLE(d, ptr, float); goto convert_double;
+ case 'd': UNPACK_SINGLE(d, ptr, double); goto convert_double;
+
+ /* bytes object */
+ case 'c': goto convert_bytes;
+
+ /* pointer */
+ case 'P': UNPACK_SINGLE(p, ptr, void *); goto convert_pointer;
+
+ /* default */
+ default: goto err_format;
+ }
+
+convert_uc:
+ /* PyLong_FromUnsignedLong() is slower */
+ return PyLong_FromLong(uc);
+convert_ld:
+ return PyLong_FromLong(ld);
+convert_lu:
+ return PyLong_FromUnsignedLong(lu);
+convert_lld:
+ return PyLong_FromLongLong(lld);
+convert_llu:
+ return PyLong_FromUnsignedLongLong(llu);
+convert_zd:
+ return PyLong_FromSsize_t(zd);
+convert_zu:
+ return PyLong_FromSize_t(zu);
+convert_double:
+ return PyFloat_FromDouble(d);
+convert_bool:
+ return PyBool_FromLong(ld);
+convert_bytes:
+ return PyBytes_FromStringAndSize(ptr, 1);
+convert_pointer:
+ return PyLong_FromVoidPtr(p);
+err_format:
+ PyErr_Format(PyExc_NotImplementedError,
+ "memoryview: format %s not supported", fmt);
+ return NULL;
}
-/* TODO: rewrite this function using the struct module to unpack
- each buffer item */
+#define PACK_SINGLE(ptr, src, type) \
+ do { \
+ type x; \
+ x = (type)src; \
+ memcpy(ptr, (char *)&x, sizeof x); \
+ } while (0)
-static PyObject *
-memory_tolist(PyMemoryViewObject *mem, PyObject *noargs)
+/* Pack a single item. 'fmt' can be any native format character in
+ struct module syntax. */
+static int
+pack_single(char *ptr, PyObject *item, const char *fmt)
{
- Py_buffer *view = &(mem->view);
- Py_ssize_t i;
- PyObject *res, *item;
- char *buf;
+ unsigned PY_LONG_LONG llu;
+ unsigned long lu;
+ size_t zu;
+ PY_LONG_LONG lld;
+ long ld;
+ Py_ssize_t zd;
+ double d;
+ void *p;
+
+ switch (fmt[0]) {
+ /* signed integers */
+ case 'b': case 'h': case 'i': case 'l':
+ ld = pylong_as_ld(item);
+ if (ld == -1 && PyErr_Occurred())
+ goto err_occurred;
+ switch (fmt[0]) {
+ case 'b':
+ if (ld < SCHAR_MIN || ld > SCHAR_MAX) goto err_range;
+ *((signed char *)ptr) = (signed char)ld; break;
+ case 'h':
+ if (ld < SHRT_MIN || ld > SHRT_MAX) goto err_range;
+ PACK_SINGLE(ptr, ld, short); break;
+ case 'i':
+ if (ld < INT_MIN || ld > INT_MAX) goto err_range;
+ PACK_SINGLE(ptr, ld, int); break;
+ default: /* 'l' */
+ PACK_SINGLE(ptr, ld, long); break;
+ }
+ break;
+
+ /* unsigned integers */
+ case 'B': case 'H': case 'I': case 'L':
+ lu = pylong_as_lu(item);
+ if (lu == (unsigned long)-1 && PyErr_Occurred())
+ goto err_occurred;
+ switch (fmt[0]) {
+ case 'B':
+ if (lu > UCHAR_MAX) goto err_range;
+ *((unsigned char *)ptr) = (unsigned char)lu; break;
+ case 'H':
+ if (lu > USHRT_MAX) goto err_range;
+ PACK_SINGLE(ptr, lu, unsigned short); break;
+ case 'I':
+ if (lu > UINT_MAX) goto err_range;
+ PACK_SINGLE(ptr, lu, unsigned int); break;
+ default: /* 'L' */
+ PACK_SINGLE(ptr, lu, unsigned long); break;
+ }
+ break;
+
+ /* native 64-bit */
+ #ifdef HAVE_LONG_LONG
+ case 'q':
+ lld = pylong_as_lld(item);
+ if (lld == -1 && PyErr_Occurred())
+ goto err_occurred;
+ PACK_SINGLE(ptr, lld, PY_LONG_LONG);
+ break;
+ case 'Q':
+ llu = pylong_as_llu(item);
+ if (llu == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())
+ goto err_occurred;
+ PACK_SINGLE(ptr, llu, unsigned PY_LONG_LONG);
+ break;
+ #endif
+
+ /* ssize_t and size_t */
+ case 'n':
+ zd = pylong_as_zd(item);
+ if (zd == -1 && PyErr_Occurred())
+ goto err_occurred;
+ PACK_SINGLE(ptr, zd, Py_ssize_t);
+ break;
+ case 'N':
+ zu = pylong_as_zu(item);
+ if (zu == (size_t)-1 && PyErr_Occurred())
+ goto err_occurred;
+ PACK_SINGLE(ptr, zu, size_t);
+ break;
+
+ /* floats */
+ case 'f': case 'd':
+ d = PyFloat_AsDouble(item);
+ if (d == -1.0 && PyErr_Occurred())
+ goto err_occurred;
+ if (fmt[0] == 'f') {
+ PACK_SINGLE(ptr, d, float);
+ }
+ else {
+ PACK_SINGLE(ptr, d, double);
+ }
+ break;
+
+ /* bool */
+ case '?':
+ ld = PyObject_IsTrue(item);
+ if (ld < 0)
+ return -1; /* preserve original error */
+ #ifdef HAVE_C99_BOOL
+ PACK_SINGLE(ptr, ld, _Bool);
+ #else
+ PACK_SINGLE(ptr, ld, char);
+ #endif
+ break;
+
+ /* bytes object */
+ case 'c':
+ if (!PyBytes_Check(item))
+ return type_error_int(fmt);
+ if (PyBytes_GET_SIZE(item) != 1)
+ return value_error_int(fmt);
+ *ptr = PyBytes_AS_STRING(item)[0];
+ break;
- CHECK_RELEASED(mem);
- if (strcmp(view->format, "B") || view->itemsize != 1) {
- PyErr_SetString(PyExc_NotImplementedError,
- "tolist() only supports byte views");
+ /* pointer */
+ case 'P':
+ p = PyLong_AsVoidPtr(item);
+ if (p == NULL && PyErr_Occurred())
+ goto err_occurred;
+ PACK_SINGLE(ptr, p, void *);
+ break;
+
+ /* default */
+ default: goto err_format;
+ }
+
+ return 0;
+
+err_occurred:
+ return fix_error_int(fmt);
+err_range:
+ return value_error_int(fmt);
+err_format:
+ PyErr_Format(PyExc_NotImplementedError,
+ "memoryview: format %s not supported", fmt);
+ return -1;
+}
+
+
+/****************************************************************************/
+/* unpack using the struct module */
+/****************************************************************************/
+
+/* For reasonable performance it is necessary to cache all objects required
+ for unpacking. An unpacker can handle the format passed to unpack_from().
+ Invariant: All pointer fields of the struct should either be NULL or valid
+ pointers. */
+struct unpacker {
+ PyObject *unpack_from; /* Struct.unpack_from(format) */
+ PyObject *mview; /* cached memoryview */
+ char *item; /* buffer for mview */
+ Py_ssize_t itemsize; /* len(item) */
+};
+
+static struct unpacker *
+unpacker_new(void)
+{
+ struct unpacker *x = PyMem_Malloc(sizeof *x);
+
+ if (x == NULL) {
+ PyErr_NoMemory();
return NULL;
}
- if (view->ndim != 1) {
- PyErr_SetString(PyExc_NotImplementedError,
- "tolist() only supports one-dimensional objects");
+
+ x->unpack_from = NULL;
+ x->mview = NULL;
+ x->item = NULL;
+ x->itemsize = 0;
+
+ return x;
+}
+
+static void
+unpacker_free(struct unpacker *x)
+{
+ if (x) {
+ Py_XDECREF(x->unpack_from);
+ Py_XDECREF(x->mview);
+ PyMem_Free(x->item);
+ PyMem_Free(x);
+ }
+}
+
+/* Return a new unpacker for the given format. */
+static struct unpacker *
+struct_get_unpacker(const char *fmt, Py_ssize_t itemsize)
+{
+ PyObject *structmodule; /* XXX cache these two */
+ PyObject *Struct = NULL; /* XXX in globals? */
+ PyObject *structobj = NULL;
+ PyObject *format = NULL;
+ struct unpacker *x = NULL;
+
+ structmodule = PyImport_ImportModule("struct");
+ if (structmodule == NULL)
+ return NULL;
+
+ Struct = PyObject_GetAttrString(structmodule, "Struct");
+ Py_DECREF(structmodule);
+ if (Struct == NULL)
+ return NULL;
+
+ x = unpacker_new();
+ if (x == NULL)
+ goto error;
+
+ format = PyBytes_FromString(fmt);
+ if (format == NULL)
+ goto error;
+
+ structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
+ if (structobj == NULL)
+ goto error;
+
+ x->unpack_from = PyObject_GetAttrString(structobj, "unpack_from");
+ if (x->unpack_from == NULL)
+ goto error;
+
+ x->item = PyMem_Malloc(itemsize);
+ if (x->item == NULL) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ x->itemsize = itemsize;
+
+ x->mview = PyMemoryView_FromMemory(x->item, itemsize, PyBUF_WRITE);
+ if (x->mview == NULL)
+ goto error;
+
+
+out:
+ Py_XDECREF(Struct);
+ Py_XDECREF(format);
+ Py_XDECREF(structobj);
+ return x;
+
+error:
+ unpacker_free(x);
+ x = NULL;
+ goto out;
+}
+
+/* unpack a single item */
+static PyObject *
+struct_unpack_single(const char *ptr, struct unpacker *x)
+{
+ PyObject *v;
+
+ memcpy(x->item, ptr, x->itemsize);
+ v = PyObject_CallFunctionObjArgs(x->unpack_from, x->mview, NULL);
+ if (v == NULL)
return NULL;
+
+ if (PyTuple_GET_SIZE(v) == 1) {
+ PyObject *tmp = PyTuple_GET_ITEM(v, 0);
+ Py_INCREF(tmp);
+ Py_DECREF(v);
+ return tmp;
}
- res = PyList_New(view->len);
- if (res == NULL)
+
+ return v;
+}
+
+
+/****************************************************************************/
+/* Representations */
+/****************************************************************************/
+
+/* allow explicit form of native format */
+Py_LOCAL_INLINE(const char *)
+adjust_fmt(const Py_buffer *view)
+{
+ const char *fmt;
+
+ fmt = (view->format[0] == '@') ? view->format+1 : view->format;
+ if (fmt[0] && fmt[1] == '\0')
+ return fmt;
+
+ PyErr_Format(PyExc_NotImplementedError,
+ "memoryview: unsupported format %s", view->format);
+ return NULL;
+}
+
+/* Base case for multi-dimensional unpacking. Assumption: ndim == 1. */
+static PyObject *
+tolist_base(const char *ptr, const Py_ssize_t *shape,
+ const Py_ssize_t *strides, const Py_ssize_t *suboffsets,
+ const char *fmt)
+{
+ PyObject *lst, *item;
+ Py_ssize_t i;
+
+ lst = PyList_New(shape[0]);
+ if (lst == NULL)
return NULL;
- buf = view->buf;
- for (i = 0; i < view->len; i++) {
- item = PyLong_FromUnsignedLong((unsigned char) *buf);
+
+ for (i = 0; i < shape[0]; ptr+=strides[0], i++) {
+ const char *xptr = ADJUST_PTR(ptr, suboffsets);
+ item = unpack_single(xptr, fmt);
if (item == NULL) {
- Py_DECREF(res);
+ Py_DECREF(lst);
return NULL;
}
- PyList_SET_ITEM(res, i, item);
- buf++;
+ PyList_SET_ITEM(lst, i, item);
}
- return res;
+
+ return lst;
}
-static void
-do_release(PyMemoryViewObject *self)
+/* Unpack a multi-dimensional array into a nested list.
+ Assumption: ndim >= 1. */
+static PyObject *
+tolist_rec(const char *ptr, Py_ssize_t ndim, const Py_ssize_t *shape,
+ const Py_ssize_t *strides, const Py_ssize_t *suboffsets,
+ const char *fmt)
{
- if (self->view.obj != NULL) {
- PyBuffer_Release(&(self->view));
+ PyObject *lst, *item;
+ Py_ssize_t i;
+
+ assert(ndim >= 1);
+ assert(shape != NULL);
+ assert(strides != NULL);
+
+ if (ndim == 1)
+ return tolist_base(ptr, shape, strides, suboffsets, fmt);
+
+ lst = PyList_New(shape[0]);
+ if (lst == NULL)
+ return NULL;
+
+ for (i = 0; i < shape[0]; ptr+=strides[0], i++) {
+ const char *xptr = ADJUST_PTR(ptr, suboffsets);
+ item = tolist_rec(xptr, ndim-1, shape+1,
+ strides+1, suboffsets ? suboffsets+1 : NULL,
+ fmt);
+ if (item == NULL) {
+ Py_DECREF(lst);
+ return NULL;
+ }
+ PyList_SET_ITEM(lst, i, item);
}
- self->view.obj = NULL;
- self->view.buf = NULL;
+
+ return lst;
}
+/* Return a list representation of the memoryview. Currently only buffers
+ with native format strings are supported. */
static PyObject *
-memory_enter(PyObject *self, PyObject *args)
+memory_tolist(PyMemoryViewObject *mv, PyObject *noargs)
{
- CHECK_RELEASED(self);
- Py_INCREF(self);
- return self;
+ const Py_buffer *view = &(mv->view);
+ const char *fmt;
+
+ CHECK_RELEASED(mv);
+
+ fmt = adjust_fmt(view);
+ if (fmt == NULL)
+ return NULL;
+ if (view->ndim == 0) {
+ return unpack_single(view->buf, fmt);
+ }
+ else if (view->ndim == 1) {
+ return tolist_base(view->buf, view->shape,
+ view->strides, view->suboffsets,
+ fmt);
+ }
+ else {
+ return tolist_rec(view->buf, view->ndim, view->shape,
+ view->strides, view->suboffsets,
+ fmt);
+ }
}
static PyObject *
-memory_exit(PyObject *self, PyObject *args)
+memory_tobytes(PyMemoryViewObject *self, PyObject *dummy)
{
- do_release((PyMemoryViewObject *) self);
- Py_RETURN_NONE;
-}
+ Py_buffer *src = VIEW_ADDR(self);
+ PyObject *bytes = NULL;
-PyDoc_STRVAR(memory_release_doc,
-"M.release() -> None\n\
-\n\
-Release the underlying buffer exposed by the memoryview object.");
-PyDoc_STRVAR(memory_tobytes_doc,
-"M.tobytes() -> bytes\n\
-\n\
-Return the data in the buffer as a byte string.");
-PyDoc_STRVAR(memory_tolist_doc,
-"M.tolist() -> list\n\
-\n\
-Return the data in the buffer as a list of elements.");
+ CHECK_RELEASED(self);
-static PyMethodDef memory_methods[] = {
- {"release", memory_exit, METH_NOARGS, memory_release_doc},
- {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, memory_tobytes_doc},
- {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, memory_tolist_doc},
- {"__enter__", memory_enter, METH_NOARGS},
- {"__exit__", memory_exit, METH_VARARGS},
- {NULL, NULL} /* sentinel */
-};
+ if (MV_C_CONTIGUOUS(self->flags)) {
+ return PyBytes_FromStringAndSize(src->buf, src->len);
+ }
+ bytes = PyBytes_FromStringAndSize(NULL, src->len);
+ if (bytes == NULL)
+ return NULL;
-static void
-memory_dealloc(PyMemoryViewObject *self)
-{
- _PyObject_GC_UNTRACK(self);
- do_release(self);
- PyObject_GC_Del(self);
+ if (buffer_to_contiguous(PyBytes_AS_STRING(bytes), src, 'C') < 0) {
+ Py_DECREF(bytes);
+ return NULL;
+ }
+
+ return bytes;
}
static PyObject *
memory_repr(PyMemoryViewObject *self)
{
- if (IS_RELEASED(self))
+ if (self->flags & _Py_MEMORYVIEW_RELEASED)
return PyUnicode_FromFormat("<released memory at %p>", self);
else
return PyUnicode_FromFormat("<memory at %p>", self);
}
-/* Sequence methods */
-static Py_ssize_t
-memory_length(PyMemoryViewObject *self)
+
+/**************************************************************************/
+/* Indexing and slicing */
+/**************************************************************************/
+
+/* Get the pointer to the item at index. */
+static char *
+ptr_from_index(Py_buffer *view, Py_ssize_t index)
{
- CHECK_RELEASED_INT(self);
- return get_shape0(&self->view);
+ char *ptr;
+ Py_ssize_t nitems; /* items in the first dimension */
+
+ assert(view->shape);
+ assert(view->strides);
+
+ nitems = view->shape[0];
+ if (index < 0) {
+ index += nitems;
+ }
+ if (index < 0 || index >= nitems) {
+ PyErr_SetString(PyExc_IndexError, "index out of bounds");
+ return NULL;
+ }
+
+ ptr = (char *)view->buf;
+ ptr += view->strides[0] * index;
+
+ ptr = ADJUST_PTR(ptr, view->suboffsets);
+
+ return ptr;
}
-/* Alternate version of memory_subcript that only accepts indices.
- Used by PySeqIter_New().
-*/
+/* Return the item at index. In a one-dimensional view, this is an object
+ with the type specified by view->format. Otherwise, the item is a sub-view.
+ The function is used in memory_subscript() and memory_as_sequence. */
static PyObject *
-memory_item(PyMemoryViewObject *self, Py_ssize_t result)
+memory_item(PyMemoryViewObject *self, Py_ssize_t index)
{
Py_buffer *view = &(self->view);
+ const char *fmt;
CHECK_RELEASED(self);
+
+ fmt = adjust_fmt(view);
+ if (fmt == NULL)
+ return NULL;
+
if (view->ndim == 0) {
- PyErr_SetString(PyExc_IndexError,
- "invalid indexing of 0-dim memory");
+ PyErr_SetString(PyExc_TypeError, "invalid indexing of 0-dim memory");
return NULL;
}
if (view->ndim == 1) {
- /* Return a bytes object */
- char *ptr;
- ptr = (char *)view->buf;
- if (result < 0) {
- result += get_shape0(view);
- }
- if ((result < 0) || (result >= get_shape0(view))) {
- PyErr_SetString(PyExc_IndexError,
- "index out of bounds");
+ char *ptr = ptr_from_index(view, index);
+ if (ptr == NULL)
return NULL;
- }
- if (view->strides == NULL)
- ptr += view->itemsize * result;
- else
- ptr += view->strides[0] * result;
- if (view->suboffsets != NULL &&
- view->suboffsets[0] >= 0) {
- ptr = *((char **)ptr) + view->suboffsets[0];
- }
- return PyBytes_FromStringAndSize(ptr, view->itemsize);
- } else {
- /* Return a new memory-view object */
- Py_buffer newview;
- memset(&newview, 0, sizeof(newview));
- /* XXX: This needs to be fixed so it actually returns a sub-view */
- return PyMemoryView_FromBuffer(&newview);
+ return unpack_single(ptr, fmt);
}
+
+ PyErr_SetString(PyExc_NotImplementedError,
+ "multi-dimensional sub-views are not implemented");
+ return NULL;
}
-/*
- mem[obj] returns a bytes object holding the data for one element if
- obj fully indexes the memory view or another memory-view object
- if it does not.
+Py_LOCAL_INLINE(int)
+init_slice(Py_buffer *base, PyObject *key, int dim)
+{
+ Py_ssize_t start, stop, step, slicelength;
- 0-d memory-view objects can be referenced using ... or () but
- not with anything else.
- */
+ if (PySlice_GetIndicesEx(key, base->shape[dim],
+ &start, &stop, &step, &slicelength) < 0) {
+ return -1;
+ }
+
+
+ if (base->suboffsets == NULL || dim == 0) {
+ adjust_buf:
+ base->buf = (char *)base->buf + base->strides[dim] * start;
+ }
+ else {
+ Py_ssize_t n = dim-1;
+ while (n >= 0 && base->suboffsets[n] < 0)
+ n--;
+ if (n < 0)
+ goto adjust_buf; /* all suboffsets are negative */
+ base->suboffsets[n] = base->suboffsets[n] + base->strides[dim] * start;
+ }
+ base->shape[dim] = slicelength;
+ base->strides[dim] = base->strides[dim] * step;
+
+ return 0;
+}
+
+static int
+is_multislice(PyObject *key)
+{
+ Py_ssize_t size, i;
+
+ if (!PyTuple_Check(key))
+ return 0;
+ size = PyTuple_GET_SIZE(key);
+ if (size == 0)
+ return 0;
+
+ for (i = 0; i < size; i++) {
+ PyObject *x = PyTuple_GET_ITEM(key, i);
+ if (!PySlice_Check(x))
+ return 0;
+ }
+ return 1;
+}
+
+/* mv[obj] returns an object holding the data for one element if obj
+ fully indexes the memoryview or another memoryview object if it
+ does not.
+
+ 0-d memoryview objects can be referenced using mv[...] or mv[()]
+ but not with anything else. */
static PyObject *
memory_subscript(PyMemoryViewObject *self, PyObject *key)
{
@@ -611,248 +2244,710 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
view = &(self->view);
CHECK_RELEASED(self);
+
if (view->ndim == 0) {
- if (key == Py_Ellipsis ||
- (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) {
+ if (PyTuple_Check(key) && PyTuple_GET_SIZE(key) == 0) {
+ const char *fmt = adjust_fmt(view);
+ if (fmt == NULL)
+ return NULL;
+ return unpack_single(view->buf, fmt);
+ }
+ else if (key == Py_Ellipsis) {
Py_INCREF(self);
return (PyObject *)self;
}
else {
- PyErr_SetString(PyExc_IndexError,
- "invalid indexing of 0-dim memory");
+ PyErr_SetString(PyExc_TypeError,
+ "invalid indexing of 0-dim memory");
return NULL;
}
}
+
if (PyIndex_Check(key)) {
- Py_ssize_t result;
- result = PyNumber_AsSsize_t(key, NULL);
- if (result == -1 && PyErr_Occurred())
- return NULL;
- return memory_item(self, result);
+ Py_ssize_t index;
+ index = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ return memory_item(self, index);
}
else if (PySlice_Check(key)) {
- Py_ssize_t start, stop, step, slicelength;
+ PyMemoryViewObject *sliced;
- if (PySlice_GetIndicesEx(key, get_shape0(view),
- &start, &stop, &step, &slicelength) < 0) {
+ sliced = (PyMemoryViewObject *)mbuf_add_view(self->mbuf, view);
+ if (sliced == NULL)
+ return NULL;
+
+ if (init_slice(&sliced->view, key, 0) < 0) {
+ Py_DECREF(sliced);
return NULL;
}
-
- if (step == 1 && view->ndim == 1) {
- Py_buffer newview;
- void *newbuf = (char *) view->buf
- + start * view->itemsize;
- int newflags = view->readonly
- ? PyBUF_CONTIG_RO : PyBUF_CONTIG;
-
- /* XXX There should be an API to create a subbuffer */
- if (view->obj != NULL) {
- if (PyObject_GetBuffer(view->obj, &newview, newflags) == -1)
- return NULL;
- }
- else {
- newview = *view;
- }
- newview.buf = newbuf;
- newview.len = slicelength * newview.itemsize;
- newview.format = view->format;
- newview.shape = &(newview.smalltable[0]);
- newview.shape[0] = slicelength;
- newview.strides = &(newview.itemsize);
- return PyMemoryView_FromBuffer(&newview);
- }
- PyErr_SetNone(PyExc_NotImplementedError);
+ init_len(&sliced->view);
+ init_flags(sliced);
+
+ return (PyObject *)sliced;
+ }
+ else if (is_multislice(key)) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "multi-dimensional slicing is not implemented");
return NULL;
}
- PyErr_Format(PyExc_TypeError,
- "cannot index memory using \"%.200s\"",
- key->ob_type->tp_name);
+
+ PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key");
return NULL;
}
-
-/* Need to support assigning memory if we can */
static int
memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value)
{
- Py_ssize_t start, len, bytelen;
- Py_buffer srcview;
Py_buffer *view = &(self->view);
- char *srcbuf, *destbuf;
+ Py_buffer src;
+ const char *fmt;
+ char *ptr;
CHECK_RELEASED_INT(self);
+
+ fmt = adjust_fmt(view);
+ if (fmt == NULL)
+ return -1;
+
if (view->readonly) {
- PyErr_SetString(PyExc_TypeError,
- "cannot modify read-only memory");
+ PyErr_SetString(PyExc_TypeError, "cannot modify read-only memory");
return -1;
}
if (value == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "cannot delete memory");
- return -1;
- }
- if (view->ndim != 1) {
- PyErr_SetNone(PyExc_NotImplementedError);
+ PyErr_SetString(PyExc_TypeError, "cannot delete memory");
return -1;
}
- if (PyIndex_Check(key)) {
- start = PyNumber_AsSsize_t(key, NULL);
- if (start == -1 && PyErr_Occurred())
- return -1;
- if (start < 0) {
- start += get_shape0(view);
+ if (view->ndim == 0) {
+ if (key == Py_Ellipsis ||
+ (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) {
+ ptr = (char *)view->buf;
+ return pack_single(ptr, value, fmt);
}
- if ((start < 0) || (start >= get_shape0(view))) {
- PyErr_SetString(PyExc_IndexError,
- "index out of bounds");
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "invalid indexing of 0-dim memory");
return -1;
}
- len = 1;
}
- else if (PySlice_Check(key)) {
- Py_ssize_t stop, step;
+ if (view->ndim != 1) {
+ PyErr_SetString(PyExc_NotImplementedError,
+ "memoryview assignments are currently restricted to ndim = 1");
+ return -1;
+ }
- if (PySlice_GetIndicesEx(key, get_shape0(view),
- &start, &stop, &step, &len) < 0) {
+ if (PyIndex_Check(key)) {
+ Py_ssize_t index = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ if (index == -1 && PyErr_Occurred())
return -1;
- }
- if (step != 1) {
- PyErr_SetNone(PyExc_NotImplementedError);
+ ptr = ptr_from_index(view, index);
+ if (ptr == NULL)
return -1;
- }
+ return pack_single(ptr, value, fmt);
}
- else {
- PyErr_Format(PyExc_TypeError,
- "cannot index memory using \"%.200s\"",
- key->ob_type->tp_name);
- return -1;
+ /* one-dimensional: fast path */
+ if (PySlice_Check(key) && view->ndim == 1) {
+ Py_buffer dest; /* sliced view */
+ Py_ssize_t arrays[3];
+ int ret = -1;
+
+ /* rvalue must be an exporter */
+ if (PyObject_GetBuffer(value, &src, PyBUF_FULL_RO) < 0)
+ return ret;
+
+ dest = *view;
+ dest.shape = &arrays[0]; dest.shape[0] = view->shape[0];
+ dest.strides = &arrays[1]; dest.strides[0] = view->strides[0];
+ if (view->suboffsets) {
+ dest.suboffsets = &arrays[2]; dest.suboffsets[0] = view->suboffsets[0];
+ }
+
+ if (init_slice(&dest, key, 0) < 0)
+ goto end_block;
+ dest.len = dest.shape[0] * dest.itemsize;
+
+ ret = copy_single(&dest, &src);
+
+ end_block:
+ PyBuffer_Release(&src);
+ return ret;
}
- if (PyObject_GetBuffer(value, &srcview, PyBUF_CONTIG_RO) == -1) {
+ else if (PySlice_Check(key) || is_multislice(key)) {
+ /* Call memory_subscript() to produce a sliced lvalue, then copy
+ rvalue into lvalue. This is already implemented in _testbuffer.c. */
+ PyErr_SetString(PyExc_NotImplementedError,
+ "memoryview slice assignments are currently restricted "
+ "to ndim = 1");
return -1;
}
- /* XXX should we allow assignment of different item sizes
- as long as the byte length is the same?
- (e.g. assign 2 shorts to a 4-byte slice) */
- if (srcview.itemsize != view->itemsize) {
- PyErr_Format(PyExc_TypeError,
- "mismatching item sizes for \"%.200s\" and \"%.200s\"",
- view->obj->ob_type->tp_name, srcview.obj->ob_type->tp_name);
- goto _error;
- }
- bytelen = len * view->itemsize;
- if (bytelen != srcview.len) {
- PyErr_SetString(PyExc_ValueError,
- "cannot modify size of memoryview object");
- goto _error;
- }
- /* Do the actual copy */
- destbuf = (char *) view->buf + start * view->itemsize;
- srcbuf = (char *) srcview.buf;
- if (destbuf + bytelen < srcbuf || srcbuf + bytelen < destbuf)
- /* No overlapping */
- memcpy(destbuf, srcbuf, bytelen);
- else
- memmove(destbuf, srcbuf, bytelen);
- PyBuffer_Release(&srcview);
+ PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key");
+ return -1;
+}
+
+static Py_ssize_t
+memory_length(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED_INT(self);
+ return self->view.ndim == 0 ? 1 : self->view.shape[0];
+}
+
+/* As mapping */
+static PyMappingMethods memory_as_mapping = {
+ (lenfunc)memory_length, /* mp_length */
+ (binaryfunc)memory_subscript, /* mp_subscript */
+ (objobjargproc)memory_ass_sub, /* mp_ass_subscript */
+};
+
+/* As sequence */
+static PySequenceMethods memory_as_sequence = {
+ 0, /* sq_length */
+ 0, /* sq_concat */
+ 0, /* sq_repeat */
+ (ssizeargfunc)memory_item, /* sq_item */
+};
+
+
+/**************************************************************************/
+/* Comparisons */
+/**************************************************************************/
+
+#define MV_COMPARE_EX -1 /* exception */
+#define MV_COMPARE_NOT_IMPL -2 /* not implemented */
+
+/* Translate a StructError to "not equal". Preserve other exceptions. */
+static int
+fix_struct_error_int(void)
+{
+ assert(PyErr_Occurred());
+ /* XXX Cannot get at StructError directly? */
+ if (PyErr_ExceptionMatches(PyExc_ImportError) ||
+ PyErr_ExceptionMatches(PyExc_MemoryError)) {
+ return MV_COMPARE_EX;
+ }
+ /* StructError: invalid or unknown format -> not equal */
+ PyErr_Clear();
return 0;
+}
-_error:
- PyBuffer_Release(&srcview);
- return -1;
+/* Unpack and compare single items of p and q using the struct module. */
+static int
+struct_unpack_cmp(const char *p, const char *q,
+ struct unpacker *unpack_p, struct unpacker *unpack_q)
+{
+ PyObject *v, *w;
+ int ret;
+
+ /* At this point any exception from the struct module should not be
+ StructError, since both formats have been accepted already. */
+ v = struct_unpack_single(p, unpack_p);
+ if (v == NULL)
+ return MV_COMPARE_EX;
+
+ w = struct_unpack_single(q, unpack_q);
+ if (w == NULL) {
+ Py_DECREF(v);
+ return MV_COMPARE_EX;
+ }
+
+ /* MV_COMPARE_EX == -1: exceptions are preserved */
+ ret = PyObject_RichCompareBool(v, w, Py_EQ);
+ Py_DECREF(v);
+ Py_DECREF(w);
+
+ return ret;
+}
+
+/* Unpack and compare single items of p and q. If both p and q have the same
+ single element native format, the comparison uses a fast path (gcc creates
+ a jump table and converts memcpy into simple assignments on x86/x64).
+
+ Otherwise, the comparison is delegated to the struct module, which is
+ 30-60x slower. */
+#define CMP_SINGLE(p, q, type) \
+ do { \
+ type x; \
+ type y; \
+ memcpy((char *)&x, p, sizeof x); \
+ memcpy((char *)&y, q, sizeof y); \
+ equal = (x == y); \
+ } while (0)
+
+Py_LOCAL_INLINE(int)
+unpack_cmp(const char *p, const char *q, char fmt,
+ struct unpacker *unpack_p, struct unpacker *unpack_q)
+{
+ int equal;
+
+ switch (fmt) {
+
+ /* signed integers and fast path for 'B' */
+ case 'B': return *((unsigned char *)p) == *((unsigned char *)q);
+ case 'b': return *((signed char *)p) == *((signed char *)q);
+ case 'h': CMP_SINGLE(p, q, short); return equal;
+ case 'i': CMP_SINGLE(p, q, int); return equal;
+ case 'l': CMP_SINGLE(p, q, long); return equal;
+
+ /* boolean */
+ #ifdef HAVE_C99_BOOL
+ case '?': CMP_SINGLE(p, q, _Bool); return equal;
+ #else
+ case '?': CMP_SINGLE(p, q, char); return equal;
+ #endif
+
+ /* unsigned integers */
+ case 'H': CMP_SINGLE(p, q, unsigned short); return equal;
+ case 'I': CMP_SINGLE(p, q, unsigned int); return equal;
+ case 'L': CMP_SINGLE(p, q, unsigned long); return equal;
+
+ /* native 64-bit */
+ #ifdef HAVE_LONG_LONG
+ case 'q': CMP_SINGLE(p, q, PY_LONG_LONG); return equal;
+ case 'Q': CMP_SINGLE(p, q, unsigned PY_LONG_LONG); return equal;
+ #endif
+
+ /* ssize_t and size_t */
+ case 'n': CMP_SINGLE(p, q, Py_ssize_t); return equal;
+ case 'N': CMP_SINGLE(p, q, size_t); return equal;
+
+ /* floats */
+ /* XXX DBL_EPSILON? */
+ case 'f': CMP_SINGLE(p, q, float); return equal;
+ case 'd': CMP_SINGLE(p, q, double); return equal;
+
+ /* bytes object */
+ case 'c': return *p == *q;
+
+ /* pointer */
+ case 'P': CMP_SINGLE(p, q, void *); return equal;
+
+ /* use the struct module */
+ case '_':
+ assert(unpack_p);
+ assert(unpack_q);
+ return struct_unpack_cmp(p, q, unpack_p, unpack_q);
+ }
+
+ /* NOT REACHED */
+ PyErr_SetString(PyExc_RuntimeError,
+ "memoryview: internal error in richcompare");
+ return MV_COMPARE_EX;
+}
+
+/* Base case for recursive array comparisons. Assumption: ndim == 1. */
+static int
+cmp_base(const char *p, const char *q, const Py_ssize_t *shape,
+ const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets,
+ const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets,
+ char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q)
+{
+ Py_ssize_t i;
+ int equal;
+
+ for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) {
+ const char *xp = ADJUST_PTR(p, psuboffsets);
+ const char *xq = ADJUST_PTR(q, qsuboffsets);
+ equal = unpack_cmp(xp, xq, fmt, unpack_p, unpack_q);
+ if (equal <= 0)
+ return equal;
+ }
+
+ return 1;
+}
+
+/* Recursively compare two multi-dimensional arrays that have the same
+ logical structure. Assumption: ndim >= 1. */
+static int
+cmp_rec(const char *p, const char *q,
+ Py_ssize_t ndim, const Py_ssize_t *shape,
+ const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets,
+ const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets,
+ char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q)
+{
+ Py_ssize_t i;
+ int equal;
+
+ assert(ndim >= 1);
+ assert(shape != NULL);
+ assert(pstrides != NULL);
+ assert(qstrides != NULL);
+
+ if (ndim == 1) {
+ return cmp_base(p, q, shape,
+ pstrides, psuboffsets,
+ qstrides, qsuboffsets,
+ fmt, unpack_p, unpack_q);
+ }
+
+ for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) {
+ const char *xp = ADJUST_PTR(p, psuboffsets);
+ const char *xq = ADJUST_PTR(q, qsuboffsets);
+ equal = cmp_rec(xp, xq, ndim-1, shape+1,
+ pstrides+1, psuboffsets ? psuboffsets+1 : NULL,
+ qstrides+1, qsuboffsets ? qsuboffsets+1 : NULL,
+ fmt, unpack_p, unpack_q);
+ if (equal <= 0)
+ return equal;
+ }
+
+ return 1;
}
static PyObject *
memory_richcompare(PyObject *v, PyObject *w, int op)
{
- Py_buffer vv, ww;
- int equal = 0;
PyObject *res;
+ Py_buffer wbuf, *vv;
+ Py_buffer *ww = NULL;
+ struct unpacker *unpack_v = NULL;
+ struct unpacker *unpack_w = NULL;
+ char vfmt, wfmt;
+ int equal = MV_COMPARE_NOT_IMPL;
- vv.obj = NULL;
- ww.obj = NULL;
if (op != Py_EQ && op != Py_NE)
- goto _notimpl;
- if ((PyMemoryView_Check(v) && IS_RELEASED(v)) ||
- (PyMemoryView_Check(w) && IS_RELEASED(w))) {
+ goto result; /* Py_NotImplemented */
+
+ assert(PyMemoryView_Check(v));
+ if (BASE_INACCESSIBLE(v)) {
equal = (v == w);
- goto _end;
+ goto result;
}
- if (PyObject_GetBuffer(v, &vv, PyBUF_CONTIG_RO) == -1) {
- PyErr_Clear();
- goto _notimpl;
+ vv = VIEW_ADDR(v);
+
+ if (PyMemoryView_Check(w)) {
+ if (BASE_INACCESSIBLE(w)) {
+ equal = (v == w);
+ goto result;
+ }
+ ww = VIEW_ADDR(w);
+ }
+ else {
+ if (PyObject_GetBuffer(w, &wbuf, PyBUF_FULL_RO) < 0) {
+ PyErr_Clear();
+ goto result; /* Py_NotImplemented */
+ }
+ ww = &wbuf;
}
- if (PyObject_GetBuffer(w, &ww, PyBUF_CONTIG_RO) == -1) {
+
+ if (!equiv_shape(vv, ww)) {
PyErr_Clear();
- goto _notimpl;
+ equal = 0;
+ goto result;
}
- if (vv.itemsize != ww.itemsize || vv.len != ww.len)
- goto _end;
+ /* Use fast unpacking for identical primitive C type formats. */
+ if (get_native_fmtchar(&vfmt, vv->format) < 0)
+ vfmt = '_';
+ if (get_native_fmtchar(&wfmt, ww->format) < 0)
+ wfmt = '_';
+ if (vfmt == '_' || wfmt == '_' || vfmt != wfmt) {
+ /* Use struct module unpacking. NOTE: Even for equal format strings,
+ memcmp() cannot be used for item comparison since it would give
+ incorrect results in the case of NaNs or uninitialized padding
+ bytes. */
+ vfmt = '_';
+ unpack_v = struct_get_unpacker(vv->format, vv->itemsize);
+ if (unpack_v == NULL) {
+ equal = fix_struct_error_int();
+ goto result;
+ }
+ unpack_w = struct_get_unpacker(ww->format, ww->itemsize);
+ if (unpack_w == NULL) {
+ equal = fix_struct_error_int();
+ goto result;
+ }
+ }
- equal = !memcmp(vv.buf, ww.buf, vv.len);
+ if (vv->ndim == 0) {
+ equal = unpack_cmp(vv->buf, ww->buf,
+ vfmt, unpack_v, unpack_w);
+ }
+ else if (vv->ndim == 1) {
+ equal = cmp_base(vv->buf, ww->buf, vv->shape,
+ vv->strides, vv->suboffsets,
+ ww->strides, ww->suboffsets,
+ vfmt, unpack_v, unpack_w);
+ }
+ else {
+ equal = cmp_rec(vv->buf, ww->buf, vv->ndim, vv->shape,
+ vv->strides, vv->suboffsets,
+ ww->strides, ww->suboffsets,
+ vfmt, unpack_v, unpack_w);
+ }
-_end:
- PyBuffer_Release(&vv);
- PyBuffer_Release(&ww);
- if ((equal && op == Py_EQ) || (!equal && op == Py_NE))
+result:
+ if (equal < 0) {
+ if (equal == MV_COMPARE_NOT_IMPL)
+ res = Py_NotImplemented;
+ else /* exception */
+ res = NULL;
+ }
+ else if ((equal && op == Py_EQ) || (!equal && op == Py_NE))
res = Py_True;
else
res = Py_False;
- Py_INCREF(res);
+
+ if (ww == &wbuf)
+ PyBuffer_Release(ww);
+
+ unpacker_free(unpack_v);
+ unpacker_free(unpack_w);
+
+ Py_XINCREF(res);
return res;
+}
+
+/**************************************************************************/
+/* Hash */
+/**************************************************************************/
+
+static Py_hash_t
+memory_hash(PyMemoryViewObject *self)
+{
+ if (self->hash == -1) {
+ Py_buffer *view = &self->view;
+ char *mem = view->buf;
+ Py_ssize_t ret;
+ char fmt;
+
+ CHECK_RELEASED_INT(self);
+
+ if (!view->readonly) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot hash writable memoryview object");
+ return -1;
+ }
+ ret = get_native_fmtchar(&fmt, view->format);
+ if (ret < 0 || !IS_BYTE_FORMAT(fmt)) {
+ PyErr_SetString(PyExc_ValueError,
+ "memoryview: hashing is restricted to formats 'B', 'b' or 'c'");
+ return -1;
+ }
+ if (view->obj != NULL && PyObject_Hash(view->obj) == -1) {
+ /* Keep the original error message */
+ return -1;
+ }
-_notimpl:
- PyBuffer_Release(&vv);
- PyBuffer_Release(&ww);
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ if (!MV_C_CONTIGUOUS(self->flags)) {
+ mem = PyMem_Malloc(view->len);
+ if (mem == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ if (buffer_to_contiguous(mem, view, 'C') < 0) {
+ PyMem_Free(mem);
+ return -1;
+ }
+ }
+
+ /* Can't fail */
+ self->hash = _Py_HashBytes((unsigned char *)mem, view->len);
+
+ if (mem != view->buf)
+ PyMem_Free(mem);
+ }
+
+ return self->hash;
}
-static int
-memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg)
+/**************************************************************************/
+/* getters */
+/**************************************************************************/
+
+static PyObject *
+_IntTupleFromSsizet(int len, Py_ssize_t *vals)
{
- if (self->view.obj != NULL)
- Py_VISIT(self->view.obj);
- return 0;
+ int i;
+ PyObject *o;
+ PyObject *intTuple;
+
+ if (vals == NULL)
+ return PyTuple_New(0);
+
+ intTuple = PyTuple_New(len);
+ if (!intTuple)
+ return NULL;
+ for (i=0; i<len; i++) {
+ o = PyLong_FromSsize_t(vals[i]);
+ if (!o) {
+ Py_DECREF(intTuple);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(intTuple, i, o);
+ }
+ return intTuple;
}
-static int
-memory_clear(PyMemoryViewObject *self)
+static PyObject *
+memory_obj_get(PyMemoryViewObject *self)
{
- PyBuffer_Release(&self->view);
- return 0;
+ Py_buffer *view = &self->view;
+
+ CHECK_RELEASED(self);
+ if (view->obj == NULL) {
+ Py_RETURN_NONE;
+ }
+ Py_INCREF(view->obj);
+ return view->obj;
}
+static PyObject *
+memory_nbytes_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return PyLong_FromSsize_t(self->view.len);
+}
-/* As mapping */
-static PyMappingMethods memory_as_mapping = {
- (lenfunc)memory_length, /* mp_length */
- (binaryfunc)memory_subscript, /* mp_subscript */
- (objobjargproc)memory_ass_sub, /* mp_ass_subscript */
-};
+static PyObject *
+memory_format_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return PyUnicode_FromString(self->view.format);
+}
-static PySequenceMethods memory_as_sequence = {
- 0, /* sq_length */
- 0, /* sq_concat */
- 0, /* sq_repeat */
- (ssizeargfunc)memory_item, /* sq_item */
+static PyObject *
+memory_itemsize_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return PyLong_FromSsize_t(self->view.itemsize);
+}
+
+static PyObject *
+memory_shape_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return _IntTupleFromSsizet(self->view.ndim, self->view.shape);
+}
+
+static PyObject *
+memory_strides_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return _IntTupleFromSsizet(self->view.ndim, self->view.strides);
+}
+
+static PyObject *
+memory_suboffsets_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return _IntTupleFromSsizet(self->view.ndim, self->view.suboffsets);
+}
+
+static PyObject *
+memory_readonly_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return PyBool_FromLong(self->view.readonly);
+}
+
+static PyObject *
+memory_ndim_get(PyMemoryViewObject *self)
+{
+ CHECK_RELEASED(self);
+ return PyLong_FromLong(self->view.ndim);
+}
+
+static PyObject *
+memory_c_contiguous(PyMemoryViewObject *self, PyObject *dummy)
+{
+ CHECK_RELEASED(self);
+ return PyBool_FromLong(MV_C_CONTIGUOUS(self->flags));
+}
+
+static PyObject *
+memory_f_contiguous(PyMemoryViewObject *self, PyObject *dummy)
+{
+ CHECK_RELEASED(self);
+ return PyBool_FromLong(MV_F_CONTIGUOUS(self->flags));
+}
+
+static PyObject *
+memory_contiguous(PyMemoryViewObject *self, PyObject *dummy)
+{
+ CHECK_RELEASED(self);
+ return PyBool_FromLong(MV_ANY_CONTIGUOUS(self->flags));
+}
+
+PyDoc_STRVAR(memory_obj_doc,
+ "The underlying object of the memoryview.");
+PyDoc_STRVAR(memory_nbytes_doc,
+ "The amount of space in bytes that the array would use in\n"
+ " a contiguous representation.");
+PyDoc_STRVAR(memory_readonly_doc,
+ "A bool indicating whether the memory is read only.");
+PyDoc_STRVAR(memory_itemsize_doc,
+ "The size in bytes of each element of the memoryview.");
+PyDoc_STRVAR(memory_format_doc,
+ "A string containing the format (in struct module style)\n"
+ " for each element in the view.");
+PyDoc_STRVAR(memory_ndim_doc,
+ "An integer indicating how many dimensions of a multi-dimensional\n"
+ " array the memory represents.");
+PyDoc_STRVAR(memory_shape_doc,
+ "A tuple of ndim integers giving the shape of the memory\n"
+ " as an N-dimensional array.");
+PyDoc_STRVAR(memory_strides_doc,
+ "A tuple of ndim integers giving the size in bytes to access\n"
+ " each element for each dimension of the array.");
+PyDoc_STRVAR(memory_suboffsets_doc,
+ "A tuple of integers used internally for PIL-style arrays.");
+PyDoc_STRVAR(memory_c_contiguous_doc,
+ "A bool indicating whether the memory is C contiguous.");
+PyDoc_STRVAR(memory_f_contiguous_doc,
+ "A bool indicating whether the memory is Fortran contiguous.");
+PyDoc_STRVAR(memory_contiguous_doc,
+ "A bool indicating whether the memory is contiguous.");
+
+static PyGetSetDef memory_getsetlist[] = {
+ {"obj", (getter)memory_obj_get, NULL, memory_obj_doc},
+ {"nbytes", (getter)memory_nbytes_get, NULL, memory_nbytes_doc},
+ {"readonly", (getter)memory_readonly_get, NULL, memory_readonly_doc},
+ {"itemsize", (getter)memory_itemsize_get, NULL, memory_itemsize_doc},
+ {"format", (getter)memory_format_get, NULL, memory_format_doc},
+ {"ndim", (getter)memory_ndim_get, NULL, memory_ndim_doc},
+ {"shape", (getter)memory_shape_get, NULL, memory_shape_doc},
+ {"strides", (getter)memory_strides_get, NULL, memory_strides_doc},
+ {"suboffsets", (getter)memory_suboffsets_get, NULL, memory_suboffsets_doc},
+ {"c_contiguous", (getter)memory_c_contiguous, NULL, memory_c_contiguous_doc},
+ {"f_contiguous", (getter)memory_f_contiguous, NULL, memory_f_contiguous_doc},
+ {"contiguous", (getter)memory_contiguous, NULL, memory_contiguous_doc},
+ {NULL, NULL, NULL, NULL},
};
-/* Buffer methods */
+PyDoc_STRVAR(memory_release_doc,
+"M.release() -> None\n\
+\n\
+Release the underlying buffer exposed by the memoryview object.");
+PyDoc_STRVAR(memory_tobytes_doc,
+"M.tobytes() -> bytes\n\
+\n\
+Return the data in the buffer as a byte string.");
+PyDoc_STRVAR(memory_tolist_doc,
+"M.tolist() -> list\n\
+\n\
+Return the data in the buffer as a list of elements.");
+PyDoc_STRVAR(memory_cast_doc,
+"M.cast(format[, shape]) -> memoryview\n\
+\n\
+Cast a memoryview to a new format or shape.");
-static PyBufferProcs memory_as_buffer = {
- (getbufferproc)memory_getbuf, /* bf_getbuffer */
- (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */
+static PyMethodDef memory_methods[] = {
+ {"release", (PyCFunction)memory_release, METH_NOARGS, memory_release_doc},
+ {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, memory_tobytes_doc},
+ {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, memory_tolist_doc},
+ {"cast", (PyCFunction)memory_cast, METH_VARARGS|METH_KEYWORDS, memory_cast_doc},
+ {"__enter__", memory_enter, METH_NOARGS, NULL},
+ {"__exit__", memory_exit, METH_VARARGS, NULL},
+ {NULL, NULL}
};
PyTypeObject PyMemoryView_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- "memoryview",
- sizeof(PyMemoryViewObject),
- 0,
+ "memoryview", /* tp_name */
+ offsetof(PyMemoryViewObject, ob_array), /* tp_basicsize */
+ sizeof(Py_ssize_t), /* tp_itemsize */
(destructor)memory_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
@@ -862,7 +2957,7 @@ PyTypeObject PyMemoryView_Type = {
0, /* tp_as_number */
&memory_as_sequence, /* tp_as_sequence */
&memory_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
+ (hashfunc)memory_hash, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
@@ -873,7 +2968,7 @@ PyTypeObject PyMemoryView_Type = {
(traverseproc)memory_traverse, /* tp_traverse */
(inquiry)memory_clear, /* tp_clear */
memory_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
+ offsetof(PyMemoryViewObject, weakreflist),/* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
memory_methods, /* tp_methods */
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index f1a9f4b..1d143f9 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -44,7 +44,7 @@ PyCFunction_GetFunction(PyObject *op)
PyErr_BadInternalCall();
return NULL;
}
- return ((PyCFunctionObject *)op) -> m_ml -> ml_meth;
+ return PyCFunction_GET_FUNCTION(op);
}
PyObject *
@@ -54,7 +54,7 @@ PyCFunction_GetSelf(PyObject *op)
PyErr_BadInternalCall();
return NULL;
}
- return ((PyCFunctionObject *)op) -> m_self;
+ return PyCFunction_GET_SELF(op);
}
int
@@ -64,7 +64,7 @@ PyCFunction_GetFlags(PyObject *op)
PyErr_BadInternalCall();
return -1;
}
- return ((PyCFunctionObject *)op) -> m_ml -> ml_flags;
+ return PyCFunction_GET_FLAGS(op);
}
PyObject *
@@ -151,6 +151,41 @@ meth_get__name__(PyCFunctionObject *m, void *closure)
return PyUnicode_FromString(m->m_ml->ml_name);
}
+static PyObject *
+meth_get__qualname__(PyCFunctionObject *m, void *closure)
+{
+ /* If __self__ is a module or NULL, return m.__name__
+ (e.g. len.__qualname__ == 'len')
+
+ If __self__ is a type, return m.__self__.__qualname__ + '.' + m.__name__
+ (e.g. dict.fromkeys.__qualname__ == 'dict.fromkeys')
+
+ Otherwise return type(m.__self__).__qualname__ + '.' + m.__name__
+ (e.g. [].append.__qualname__ == 'list.append') */
+ PyObject *type, *type_qualname, *res;
+ _Py_IDENTIFIER(__qualname__);
+
+ if (m->m_self == NULL || PyModule_Check(m->m_self))
+ return PyUnicode_FromString(m->m_ml->ml_name);
+
+ type = PyType_Check(m->m_self) ? m->m_self : (PyObject*)Py_TYPE(m->m_self);
+
+ type_qualname = _PyObject_GetAttrId(type, &PyId___qualname__);
+ if (type_qualname == NULL)
+ return NULL;
+
+ if (!PyUnicode_Check(type_qualname)) {
+ PyErr_SetString(PyExc_TypeError, "<method>.__class__."
+ "__qualname__ is not a unicode object");
+ Py_XDECREF(type_qualname);
+ return NULL;
+ }
+
+ res = PyUnicode_FromFormat("%S.%s", type_qualname, m->m_ml->ml_name);
+ Py_DECREF(type_qualname);
+ return res;
+}
+
static int
meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
{
@@ -164,7 +199,7 @@ meth_get__self__(PyCFunctionObject *m, void *closure)
{
PyObject *self;
- self = m->m_self;
+ self = PyCFunction_GET_SELF(m);
if (self == NULL)
self = Py_None;
Py_INCREF(self);
@@ -174,6 +209,7 @@ meth_get__self__(PyCFunctionObject *m, void *closure)
static PyGetSetDef meth_getsets [] = {
{"__doc__", (getter)meth_get__doc__, NULL, NULL},
{"__name__", (getter)meth_get__name__, NULL, NULL},
+ {"__qualname__", (getter)meth_get__qualname__, NULL, NULL},
{"__self__", (getter)meth_get__self__, NULL, NULL},
{0}
};
@@ -208,8 +244,7 @@ meth_richcompare(PyObject *self, PyObject *other, int op)
!PyCFunction_Check(self) ||
!PyCFunction_Check(other))
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
a = (PyCFunctionObject *)self;
b = (PyCFunctionObject *)other;
@@ -303,6 +338,15 @@ PyCFunction_Fini(void)
(void)PyCFunction_ClearFreeList();
}
+/* Print summary info about the state of the optimized allocator */
+void
+_PyCFunction_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PyCFunction",
+ numfree, sizeof(PyCFunction));
+}
+
/* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
but it's part of the API so we need to keep a function around that
existing C extensions can call.
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 533db46..2f2bd36 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -27,36 +27,45 @@ static PyTypeObject moduledef_type = {
PyObject *
-PyModule_New(const char *name)
+PyModule_NewObject(PyObject *name)
{
PyModuleObject *m;
- PyObject *nameobj;
m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
if (m == NULL)
return NULL;
m->md_def = NULL;
m->md_state = NULL;
- nameobj = PyUnicode_FromString(name);
m->md_dict = PyDict_New();
- if (m->md_dict == NULL || nameobj == NULL)
+ if (m->md_dict == NULL)
goto fail;
- if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
+ if (PyDict_SetItemString(m->md_dict, "__name__", name) != 0)
goto fail;
if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
goto fail;
if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
goto fail;
- Py_DECREF(nameobj);
PyObject_GC_Track(m);
return (PyObject *)m;
fail:
- Py_XDECREF(nameobj);
Py_DECREF(m);
return NULL;
}
PyObject *
+PyModule_New(const char *name)
+{
+ PyObject *nameobj, *module;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ module = PyModule_NewObject(nameobj);
+ Py_DECREF(nameobj);
+ return module;
+}
+
+
+PyObject *
PyModule_Create2(struct PyModuleDef* module, int module_api_version)
{
PyObject *d, *v, *n;
@@ -175,24 +184,35 @@ PyModule_GetDict(PyObject *m)
return d;
}
-const char *
-PyModule_GetName(PyObject *m)
+PyObject*
+PyModule_GetNameObject(PyObject *m)
{
PyObject *d;
- PyObject *nameobj;
+ PyObject *name;
if (!PyModule_Check(m)) {
PyErr_BadArgument();
return NULL;
}
d = ((PyModuleObject *)m)->md_dict;
if (d == NULL ||
- (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
- !PyUnicode_Check(nameobj))
+ (name = PyDict_GetItemString(d, "__name__")) == NULL ||
+ !PyUnicode_Check(name))
{
PyErr_SetString(PyExc_SystemError, "nameless module");
return NULL;
}
- return _PyUnicode_AsString(nameobj);
+ Py_INCREF(name);
+ return name;
+}
+
+const char *
+PyModule_GetName(PyObject *m)
+{
+ PyObject *name = PyModule_GetNameObject(m);
+ if (name == NULL)
+ return NULL;
+ Py_DECREF(name); /* module dict has still a reference */
+ return _PyUnicode_AsString(name);
}
PyObject*
@@ -225,7 +245,7 @@ PyModule_GetFilename(PyObject *m)
if (fileobj == NULL)
return NULL;
utf8 = _PyUnicode_AsString(fileobj);
- Py_DECREF(fileobj);
+ Py_DECREF(fileobj); /* module dict has still a reference */
return utf8;
}
@@ -271,8 +291,8 @@ _PyModule_Clear(PyObject *m)
pos = 0;
while (PyDict_Next(d, &pos, &key, &value)) {
if (value != Py_None && PyUnicode_Check(key)) {
- Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
- if (u[0] == '_' && u[1] != '_') {
+ if (PyUnicode_READ_CHAR(key, 0) == '_' &&
+ PyUnicode_READ_CHAR(key, 1) != '_') {
if (Py_VerboseFlag > 1) {
const char *s = _PyUnicode_AsString(key);
if (s != NULL)
@@ -289,9 +309,8 @@ _PyModule_Clear(PyObject *m)
pos = 0;
while (PyDict_Next(d, &pos, &key, &value)) {
if (value != Py_None && PyUnicode_Check(key)) {
- Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
- if (u[0] != '_'
- || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
+ if (PyUnicode_READ_CHAR(key, 0) != '_' ||
+ PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
{
if (Py_VerboseFlag > 1) {
const char *s = _PyUnicode_AsString(key);
@@ -353,21 +372,54 @@ module_dealloc(PyModuleObject *m)
static PyObject *
module_repr(PyModuleObject *m)
{
- const char *name;
- PyObject *filename, *repr;
+ PyObject *name, *filename, *repr, *loader = NULL;
- name = PyModule_GetName((PyObject *)m);
+ /* See if the module has an __loader__. If it does, give the loader the
+ * first shot at producing a repr for the module.
+ */
+ if (m->md_dict != NULL) {
+ loader = PyDict_GetItemString(m->md_dict, "__loader__");
+ }
+ if (loader != NULL) {
+ repr = PyObject_CallMethod(loader, "module_repr", "(O)",
+ (PyObject *)m, NULL);
+ if (repr == NULL) {
+ PyErr_Clear();
+ }
+ else {
+ return repr;
+ }
+ }
+ /* __loader__.module_repr(m) did not provide us with a repr. Next, see if
+ * the module has an __file__. If it doesn't then use repr(__loader__) if
+ * it exists, otherwise, just use module.__name__.
+ */
+ name = PyModule_GetNameObject((PyObject *)m);
if (name == NULL) {
PyErr_Clear();
- name = "?";
+ name = PyUnicode_FromStringAndSize("?", 1);
+ if (name == NULL)
+ return NULL;
}
filename = PyModule_GetFilenameObject((PyObject *)m);
if (filename == NULL) {
PyErr_Clear();
- return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
+ /* There's no m.__file__, so if there was an __loader__, use that in
+ * the repr, otherwise, the only thing you can use is m.__name__
+ */
+ if (loader == NULL) {
+ repr = PyUnicode_FromFormat("<module %R>", name);
+ }
+ else {
+ repr = PyUnicode_FromFormat("<module %R (%R)>", name, loader);
+ }
+ }
+ /* Finally, use m.__file__ */
+ else {
+ repr = PyUnicode_FromFormat("<module %R from %R>", name, filename);
+ Py_DECREF(filename);
}
- repr = PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
- Py_DECREF(filename);
+ Py_DECREF(name);
return repr;
}
@@ -395,6 +447,35 @@ module_clear(PyModuleObject *m)
return 0;
}
+static PyObject *
+module_dir(PyObject *self, PyObject *args)
+{
+ _Py_IDENTIFIER(__dict__);
+ PyObject *result = NULL;
+ PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
+
+ if (dict != NULL) {
+ if (PyDict_Check(dict))
+ result = PyDict_Keys(dict);
+ else {
+ const char *name = PyModule_GetName(self);
+ if (name)
+ PyErr_Format(PyExc_TypeError,
+ "%.200s.__dict__ is not a dictionary",
+ name);
+ }
+ }
+
+ Py_XDECREF(dict);
+ return result;
+}
+
+static PyMethodDef module_methods[] = {
+ {"__dir__", module_dir, METH_NOARGS,
+ PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
+ {0}
+};
+
PyDoc_STRVAR(module_doc,
"module(name[, doc])\n\
@@ -431,7 +512,7 @@ PyTypeObject PyModule_Type = {
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
- 0, /* tp_methods */
+ module_methods, /* tp_methods */
module_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c
new file mode 100644
index 0000000..ff278d3
--- /dev/null
+++ b/Objects/namespaceobject.c
@@ -0,0 +1,225 @@
+/* namespace object implementation */
+
+#include "Python.h"
+#include "structmember.h"
+
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *ns_dict;
+} _PyNamespaceObject;
+
+
+static PyMemberDef namespace_members[] = {
+ {"__dict__", T_OBJECT, offsetof(_PyNamespaceObject, ns_dict), READONLY},
+ {NULL}
+};
+
+
+/* Methods */
+
+static PyObject *
+namespace_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyObject *self;
+
+ assert(type != NULL && type->tp_alloc != NULL);
+ self = type->tp_alloc(type, 0);
+ if (self != NULL) {
+ _PyNamespaceObject *ns = (_PyNamespaceObject *)self;
+ ns->ns_dict = PyDict_New();
+ if (ns->ns_dict == NULL) {
+ Py_DECREF(ns);
+ return NULL;
+ }
+ }
+ return self;
+}
+
+
+static int
+namespace_init(_PyNamespaceObject *ns, PyObject *args, PyObject *kwds)
+{
+ /* ignore args if it's NULL or empty */
+ if (args != NULL) {
+ Py_ssize_t argcount = PyObject_Size(args);
+ if (argcount < 0)
+ return argcount;
+ else if (argcount > 0) {
+ PyErr_Format(PyExc_TypeError, "no positional arguments expected");
+ return -1;
+ }
+ }
+ if (kwds == NULL)
+ return 0;
+ return PyDict_Update(ns->ns_dict, kwds);
+}
+
+
+static void
+namespace_dealloc(_PyNamespaceObject *ns)
+{
+ PyObject_GC_UnTrack(ns);
+ Py_CLEAR(ns->ns_dict);
+ Py_TYPE(ns)->tp_free((PyObject *)ns);
+}
+
+
+static PyObject *
+namespace_repr(_PyNamespaceObject *ns)
+{
+ int i, loop_error = 0;
+ PyObject *pairs = NULL, *d = NULL, *keys = NULL, *keys_iter = NULL;
+ PyObject *key;
+ PyObject *separator, *pairsrepr, *repr = NULL;
+
+ i = Py_ReprEnter((PyObject *)ns);
+ if (i != 0) {
+ return i > 0 ? PyUnicode_FromString("namespace(...)") : NULL;
+ }
+
+ pairs = PyList_New(0);
+ if (pairs == NULL)
+ goto error;
+
+ d = ((_PyNamespaceObject *)ns)->ns_dict;
+ assert(d != NULL);
+ Py_INCREF(d);
+
+ keys = PyDict_Keys(d);
+ if (keys == NULL)
+ goto error;
+ if (PyList_Sort(keys) != 0)
+ goto error;
+
+ keys_iter = PyObject_GetIter(keys);
+ if (keys_iter == NULL)
+ goto error;
+
+ while ((key = PyIter_Next(keys_iter)) != NULL) {
+ if (PyUnicode_Check(key) && PyUnicode_GET_SIZE(key) > 0) {
+ PyObject *value, *item;
+
+ value = PyDict_GetItem(d, key);
+ assert(value != NULL);
+
+ item = PyUnicode_FromFormat("%S=%R", key, value);
+ if (item == NULL) {
+ loop_error = 1;
+ }
+ else {
+ loop_error = PyList_Append(pairs, item);
+ Py_DECREF(item);
+ }
+ }
+
+ Py_DECREF(key);
+ if (loop_error)
+ goto error;
+ }
+
+ separator = PyUnicode_FromString(", ");
+ if (separator == NULL)
+ goto error;
+
+ pairsrepr = PyUnicode_Join(separator, pairs);
+ Py_DECREF(separator);
+ if (pairsrepr == NULL)
+ goto error;
+
+ repr = PyUnicode_FromFormat("%s(%S)",
+ ((PyObject *)ns)->ob_type->tp_name, pairsrepr);
+ Py_DECREF(pairsrepr);
+
+error:
+ Py_XDECREF(pairs);
+ Py_XDECREF(d);
+ Py_XDECREF(keys);
+ Py_XDECREF(keys_iter);
+ Py_ReprLeave((PyObject *)ns);
+
+ return repr;
+}
+
+
+static int
+namespace_traverse(_PyNamespaceObject *ns, visitproc visit, void *arg)
+{
+ Py_VISIT(ns->ns_dict);
+ return 0;
+}
+
+
+static int
+namespace_clear(_PyNamespaceObject *ns)
+{
+ Py_CLEAR(ns->ns_dict);
+ return 0;
+}
+
+
+PyDoc_STRVAR(namespace_doc,
+"A simple attribute-based namespace.\n\
+\n\
+namespace(**kwargs)");
+
+PyTypeObject _PyNamespace_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "namespace", /* tp_name */
+ sizeof(_PyNamespaceObject), /* tp_size */
+ 0, /* tp_itemsize */
+ (destructor)namespace_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ (reprfunc)namespace_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ PyObject_GenericGetAttr, /* tp_getattro */
+ PyObject_GenericSetAttr, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_BASETYPE, /* tp_flags */
+ namespace_doc, /* tp_doc */
+ (traverseproc)namespace_traverse, /* tp_traverse */
+ (inquiry)namespace_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ namespace_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ offsetof(_PyNamespaceObject, ns_dict), /* tp_dictoffset */
+ (initproc)namespace_init, /* tp_init */
+ PyType_GenericAlloc, /* tp_alloc */
+ (newfunc)namespace_new, /* tp_new */
+ PyObject_GC_Del, /* tp_free */
+};
+
+
+PyObject *
+_PyNamespace_New(PyObject *kwds)
+{
+ PyObject *ns = namespace_new(&_PyNamespace_Type, NULL, NULL);
+ if (ns == NULL)
+ return NULL;
+
+ if (kwds == NULL)
+ return ns;
+ if (PyDict_Update(((_PyNamespaceObject *)ns)->ns_dict, kwds) != 0) {
+ Py_DECREF(ns);
+ return NULL;
+ }
+
+ return (PyObject *)ns;
+}
diff --git a/Objects/object.c b/Objects/object.c
index 28bb9c1..949e7dc 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -1,5 +1,5 @@
-/* Generic object operations; and implementation of None (NoObject) */
+/* Generic object operations; and implementation of None */
#include "Python.h"
#include "frameobject.h"
@@ -29,8 +29,6 @@ _Py_GetRefTotal(void)
}
#endif /* Py_REF_DEBUG */
-int Py_DivisionWarningFlag;
-
/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
These are used by the individual routines for object creation.
Do not call them otherwise, they do not initialize the object! */
@@ -297,9 +295,7 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
}
else if (PyUnicode_Check(s)) {
PyObject *t;
- t = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(s),
- PyUnicode_GET_SIZE(s),
- "backslashreplace");
+ t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
if (t == NULL)
ret = 0;
else {
@@ -382,13 +378,19 @@ PyObject_Repr(PyObject *v)
return PyUnicode_FromFormat("<%s object at %p>",
v->ob_type->tp_name, v);
res = (*v->ob_type->tp_repr)(v);
- if (res != NULL && !PyUnicode_Check(res)) {
+ if (res == NULL)
+ return NULL;
+ if (!PyUnicode_Check(res)) {
PyErr_Format(PyExc_TypeError,
"__repr__ returned non-string (type %.200s)",
res->ob_type->tp_name);
Py_DECREF(res);
return NULL;
}
+#ifndef Py_DEBUG
+ if (PyUnicode_READY(res) < 0)
+ return NULL;
+#endif
return res;
}
@@ -407,6 +409,10 @@ PyObject_Str(PyObject *v)
if (v == NULL)
return PyUnicode_FromString("<NULL>");
if (PyUnicode_CheckExact(v)) {
+#ifndef Py_DEBUG
+ if (PyUnicode_READY(v) < 0)
+ return NULL;
+#endif
Py_INCREF(v);
return v;
}
@@ -428,6 +434,11 @@ PyObject_Str(PyObject *v)
Py_DECREF(res);
return NULL;
}
+#ifndef Py_DEBUG
+ if (PyUnicode_READY(res) < 0)
+ return NULL;
+#endif
+ assert(_PyUnicode_CheckConsistency(res, 1));
return res;
}
@@ -441,11 +452,7 @@ PyObject_ASCII(PyObject *v)
return NULL;
/* repr is guaranteed to be a PyUnicode object by PyObject_Repr */
- ascii = PyUnicode_EncodeASCII(
- PyUnicode_AS_UNICODE(repr),
- PyUnicode_GET_SIZE(repr),
- "backslashreplace");
-
+ ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
Py_DECREF(repr);
if (ascii == NULL)
return NULL;
@@ -463,7 +470,7 @@ PyObject *
PyObject_Bytes(PyObject *v)
{
PyObject *result, *func;
- static PyObject *bytesstring = NULL;
+ _Py_IDENTIFIER(__bytes__);
if (v == NULL)
return PyBytes_FromString("<NULL>");
@@ -473,7 +480,7 @@ PyObject_Bytes(PyObject *v)
return v;
}
- func = _PyObject_LookupSpecial(v, "__bytes__", &bytesstring);
+ func = _PyObject_LookupSpecial(v, &PyId___bytes__);
if (func != NULL) {
result = PyObject_CallFunctionObjArgs(func, NULL);
Py_DECREF(func);
@@ -747,6 +754,33 @@ _Py_HashPointer(void *p)
}
Py_hash_t
+_Py_HashBytes(unsigned char *p, Py_ssize_t len)
+{
+ Py_uhash_t x;
+ Py_ssize_t i;
+
+ /*
+ We make the hash of the empty string be 0, rather than using
+ (prefix ^ suffix), since this slightly obfuscates the hash secret
+ */
+#ifdef Py_DEBUG
+ assert(_Py_HashSecret_Initialized);
+#endif
+ if (len == 0) {
+ return 0;
+ }
+ x = (Py_uhash_t) _Py_HashSecret.prefix;
+ x ^= (Py_uhash_t) *p << 7;
+ for (i = 0; i < len; i++)
+ x = (_PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *p++;
+ x ^= (Py_uhash_t) len;
+ x ^= (Py_uhash_t) _Py_HashSecret.suffix;
+ if (x == -1)
+ x = -2;
+ return x;
+}
+
+Py_hash_t
PyObject_HashNotImplemented(PyObject *v)
{
PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
@@ -788,7 +822,7 @@ PyObject_GetAttrString(PyObject *v, const char *name)
if (w == NULL)
return NULL;
res = PyObject_GetAttr(v, w);
- Py_XDECREF(w);
+ Py_DECREF(w);
return res;
}
@@ -820,6 +854,62 @@ PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
return res;
}
+int
+_PyObject_IsAbstract(PyObject *obj)
+{
+ int res;
+ PyObject* isabstract;
+ _Py_IDENTIFIER(__isabstractmethod__);
+
+ if (obj == NULL)
+ return 0;
+
+ isabstract = _PyObject_GetAttrId(obj, &PyId___isabstractmethod__);
+ if (isabstract == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_Clear();
+ return 0;
+ }
+ return -1;
+ }
+ res = PyObject_IsTrue(isabstract);
+ Py_DECREF(isabstract);
+ return res;
+}
+
+PyObject *
+_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name)
+{
+ PyObject *result;
+ PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
+ if (!oname)
+ return NULL;
+ result = PyObject_GetAttr(v, oname);
+ return result;
+}
+
+int
+_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name)
+{
+ int result;
+ PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
+ if (!oname)
+ return -1;
+ result = PyObject_HasAttr(v, oname);
+ return result;
+}
+
+int
+_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w)
+{
+ int result;
+ PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
+ if (!oname)
+ return -1;
+ result = PyObject_SetAttr(v, oname, w);
+ return result;
+}
+
PyObject *
PyObject_GetAttr(PyObject *v, PyObject *name)
{
@@ -938,6 +1028,19 @@ PyObject_SelfIter(PyObject *obj)
return obj;
}
+/* Convenience function to get a builtin from its name */
+PyObject *
+_PyObject_GetBuiltin(const char *name)
+{
+ PyObject *mod, *attr;
+ mod = PyImport_ImportModule("builtins");
+ if (mod == NULL)
+ return NULL;
+ attr = PyObject_GetAttrString(mod, name);
+ Py_DECREF(mod);
+ return attr;
+}
+
/* Helper used when the __next__ method is removed from a type:
tp_iternext is never NULL and can be safely called without checking
on every iteration.
@@ -986,7 +1089,6 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict)
f = descr->ob_type->tp_descr_get;
if (f != NULL && PyDescr_IsData(descr)) {
res = f(descr, obj, (PyObject *)obj->ob_type);
- Py_DECREF(descr);
goto done;
}
}
@@ -1017,7 +1119,6 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict)
res = PyDict_GetItem(dict, name);
if (res != NULL) {
Py_INCREF(res);
- Py_XDECREF(descr);
Py_DECREF(dict);
goto done;
}
@@ -1026,13 +1127,12 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict)
if (f != NULL) {
res = f(descr, obj, (PyObject *)Py_TYPE(obj));
- Py_DECREF(descr);
goto done;
}
if (descr != NULL) {
res = descr;
- /* descr was already increfed above */
+ descr = NULL;
goto done;
}
@@ -1040,6 +1140,7 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict)
"'%.50s' object has no attribute '%U'",
tp->tp_name, name);
done:
+ Py_XDECREF(descr);
Py_DECREF(name);
return res;
}
@@ -1066,15 +1167,15 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
name->ob_type->tp_name);
return -1;
}
- else
- Py_INCREF(name);
- if (tp->tp_dict == NULL) {
- if (PyType_Ready(tp) < 0)
- goto done;
- }
+ if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
+ return -1;
+
+ Py_INCREF(name);
descr = _PyType_Lookup(tp, name);
+ Py_XINCREF(descr);
+
f = NULL;
if (descr != NULL) {
f = descr->ob_type->tp_descr_set;
@@ -1087,13 +1188,10 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
if (dict == NULL) {
dictptr = _PyObject_GetDictPtr(obj);
if (dictptr != NULL) {
- dict = *dictptr;
- if (dict == NULL && value != NULL) {
- dict = PyDict_New();
- if (dict == NULL)
- goto done;
- *dictptr = dict;
- }
+ res = _PyObjectDict_SetItem(Py_TYPE(obj), dictptr, name, value);
+ if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
+ PyErr_SetObject(PyExc_AttributeError, name);
+ goto done;
}
}
if (dict != NULL) {
@@ -1102,9 +1200,9 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
res = PyDict_DelItem(dict, name);
else
res = PyDict_SetItem(dict, name, value);
+ Py_DECREF(dict);
if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
PyErr_SetObject(PyExc_AttributeError, name);
- Py_DECREF(dict);
goto done;
}
@@ -1124,6 +1222,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
"'%.50s' object attribute '%U' is read-only",
tp->tp_name, name);
done:
+ Py_XDECREF(descr);
Py_DECREF(name);
return res;
}
@@ -1134,6 +1233,32 @@ PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
}
+int
+PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
+{
+ PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj);
+ if (dictptr == NULL) {
+ PyErr_SetString(PyExc_AttributeError,
+ "This object has no __dict__");
+ return -1;
+ }
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "cannot delete __dict__");
+ return -1;
+ }
+ if (!PyDict_Check(value)) {
+ PyErr_Format(PyExc_TypeError,
+ "__dict__ must be set to a dictionary, "
+ "not a '%.200s'", Py_TYPE(value)->tp_name);
+ return -1;
+ }
+ dict = *dictptr;
+ Py_XINCREF(value);
+ *dictptr = value;
+ Py_XDECREF(dict);
+ return 0;
+}
+
/* Test a value used as condition, e.g., in a for or if statement.
Return -1 if an error occurred */
@@ -1186,66 +1311,6 @@ PyCallable_Check(PyObject *x)
return x->ob_type->tp_call != NULL;
}
-/* ------------------------- PyObject_Dir() helpers ------------------------- */
-
-/* Helper for PyObject_Dir.
- Merge the __dict__ of aclass into dict, and recursively also all
- the __dict__s of aclass's base classes. The order of merging isn't
- defined, as it's expected that only the final set of dict keys is
- interesting.
- Return 0 on success, -1 on error.
-*/
-
-static int
-merge_class_dict(PyObject* dict, PyObject* aclass)
-{
- PyObject *classdict;
- PyObject *bases;
-
- assert(PyDict_Check(dict));
- assert(aclass);
-
- /* Merge in the type's dict (if any). */
- classdict = PyObject_GetAttrString(aclass, "__dict__");
- if (classdict == NULL)
- PyErr_Clear();
- else {
- int status = PyDict_Update(dict, classdict);
- Py_DECREF(classdict);
- if (status < 0)
- return -1;
- }
-
- /* Recursively merge in the base types' (if any) dicts. */
- bases = PyObject_GetAttrString(aclass, "__bases__");
- if (bases == NULL)
- PyErr_Clear();
- else {
- /* We have no guarantee that bases is a real tuple */
- Py_ssize_t i, n;
- n = PySequence_Size(bases); /* This better be right */
- if (n < 0)
- PyErr_Clear();
- else {
- for (i = 0; i < n; i++) {
- int status;
- PyObject *base = PySequence_GetItem(bases, i);
- if (base == NULL) {
- Py_DECREF(bases);
- return -1;
- }
- status = merge_class_dict(dict, base);
- Py_DECREF(base);
- if (status < 0) {
- Py_DECREF(bases);
- return -1;
- }
- }
- }
- Py_DECREF(bases);
- }
- return 0;
-}
/* Helper for PyObject_Dir without arguments: returns the local scope. */
static PyObject *
@@ -1269,140 +1334,43 @@ _dir_locals(void)
Py_DECREF(names);
return NULL;
}
+ if (PyList_Sort(names)) {
+ Py_DECREF(names);
+ return NULL;
+ }
/* the locals don't need to be DECREF'd */
return names;
}
-/* Helper for PyObject_Dir of type objects: returns __dict__ and __bases__.
- We deliberately don't suck up its __class__, as methods belonging to the
- metaclass would probably be more confusing than helpful.
-*/
-static PyObject *
-_specialized_dir_type(PyObject *obj)
-{
- PyObject *result = NULL;
- PyObject *dict = PyDict_New();
-
- if (dict != NULL && merge_class_dict(dict, obj) == 0)
- result = PyDict_Keys(dict);
-
- Py_XDECREF(dict);
- return result;
-}
-
-/* Helper for PyObject_Dir of module objects: returns the module's __dict__. */
-static PyObject *
-_specialized_dir_module(PyObject *obj)
-{
- PyObject *result = NULL;
- PyObject *dict = PyObject_GetAttrString(obj, "__dict__");
-
- if (dict != NULL) {
- if (PyDict_Check(dict))
- result = PyDict_Keys(dict);
- else {
- const char *name = PyModule_GetName(obj);
- if (name)
- PyErr_Format(PyExc_TypeError,
- "%.200s.__dict__ is not a dictionary",
- name);
- }
- }
-
- Py_XDECREF(dict);
- return result;
-}
-
-/* Helper for PyObject_Dir of generic objects: returns __dict__, __class__,
- and recursively up the __class__.__bases__ chain.
-*/
-static PyObject *
-_generic_dir(PyObject *obj)
-{
- PyObject *result = NULL;
- PyObject *dict = NULL;
- PyObject *itsclass = NULL;
-
- /* Get __dict__ (which may or may not be a real dict...) */
- dict = PyObject_GetAttrString(obj, "__dict__");
- if (dict == NULL) {
- PyErr_Clear();
- dict = PyDict_New();
- }
- else if (!PyDict_Check(dict)) {
- Py_DECREF(dict);
- dict = PyDict_New();
- }
- else {
- /* Copy __dict__ to avoid mutating it. */
- PyObject *temp = PyDict_Copy(dict);
- Py_DECREF(dict);
- dict = temp;
- }
-
- if (dict == NULL)
- goto error;
-
- /* Merge in attrs reachable from its class. */
- itsclass = PyObject_GetAttrString(obj, "__class__");
- if (itsclass == NULL)
- /* XXX(tomer): Perhaps fall back to obj->ob_type if no
- __class__ exists? */
- PyErr_Clear();
- else {
- if (merge_class_dict(dict, itsclass) != 0)
- goto error;
- }
-
- result = PyDict_Keys(dict);
- /* fall through */
-error:
- Py_XDECREF(itsclass);
- Py_XDECREF(dict);
- return result;
-}
-
-/* Helper for PyObject_Dir: object introspection.
- This calls one of the above specialized versions if no __dir__ method
- exists. */
+/* Helper for PyObject_Dir: object introspection. */
static PyObject *
_dir_object(PyObject *obj)
{
- PyObject *result = NULL;
- static PyObject *dir_str = NULL;
- PyObject *dirfunc = _PyObject_LookupSpecial(obj, "__dir__", &dir_str);
+ PyObject *result, *sorted;
+ _Py_IDENTIFIER(__dir__);
+ PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__);
assert(obj);
if (dirfunc == NULL) {
- if (PyErr_Occurred())
- return NULL;
- /* use default implementation */
- if (PyModule_Check(obj))
- result = _specialized_dir_module(obj);
- else if (PyType_Check(obj))
- result = _specialized_dir_type(obj);
- else
- result = _generic_dir(obj);
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_TypeError, "object does not provide __dir__");
+ return NULL;
}
- else {
- /* use __dir__ */
- result = PyObject_CallFunctionObjArgs(dirfunc, NULL);
- Py_DECREF(dirfunc);
- if (result == NULL)
- return NULL;
-
- /* result must be a list */
- /* XXX(gbrandl): could also check if all items are strings */
- if (!PyList_Check(result)) {
- PyErr_Format(PyExc_TypeError,
- "__dir__() must return a list, not %.200s",
- Py_TYPE(result)->tp_name);
- Py_DECREF(result);
- result = NULL;
- }
+ /* use __dir__ */
+ result = PyObject_CallFunctionObjArgs(dirfunc, NULL);
+ Py_DECREF(dirfunc);
+ if (result == NULL)
+ return NULL;
+ /* return sorted(result) */
+ sorted = PySequence_List(result);
+ Py_DECREF(result);
+ if (sorted == NULL)
+ return NULL;
+ if (PyList_Sort(sorted)) {
+ Py_DECREF(sorted);
+ return NULL;
}
-
- return result;
+ return sorted;
}
/* Implementation of dir() -- if obj is NULL, returns the names in the current
@@ -1412,31 +1380,13 @@ _dir_object(PyObject *obj)
PyObject *
PyObject_Dir(PyObject *obj)
{
- PyObject * result;
-
- if (obj == NULL)
- /* no object -- introspect the locals */
- result = _dir_locals();
- else
- /* object -- introspect the object */
- result = _dir_object(obj);
-
- assert(result == NULL || PyList_Check(result));
-
- if (result != NULL && PyList_Sort(result) != 0) {
- /* sorting the list failed */
- Py_DECREF(result);
- result = NULL;
- }
-
- return result;
+ return (obj == NULL) ? _dir_locals() : _dir_object(obj);
}
/*
-NoObject is usable as a non-NULL undefined value, used by the macro None.
+None is a non-NULL undefined value.
There is (and should be!) no way to create other objects of this type,
so there is exactly one (which is indestructible, by the way).
-(XXX This type and the type of NotImplemented below should be unified.)
*/
/* ARGSUSED */
@@ -1456,6 +1406,58 @@ none_dealloc(PyObject* ignore)
Py_FatalError("deallocating None");
}
+static PyObject *
+none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
+ PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+static int
+none_bool(PyObject *v)
+{
+ return 0;
+}
+
+static PyNumberMethods none_as_number = {
+ 0, /* nb_add */
+ 0, /* nb_subtract */
+ 0, /* nb_multiply */
+ 0, /* nb_remainder */
+ 0, /* nb_divmod */
+ 0, /* nb_power */
+ 0, /* nb_negative */
+ 0, /* nb_positive */
+ 0, /* nb_absolute */
+ (inquiry)none_bool, /* nb_bool */
+ 0, /* nb_invert */
+ 0, /* nb_lshift */
+ 0, /* nb_rshift */
+ 0, /* nb_and */
+ 0, /* nb_xor */
+ 0, /* nb_or */
+ 0, /* nb_int */
+ 0, /* nb_reserved */
+ 0, /* nb_float */
+ 0, /* nb_inplace_add */
+ 0, /* nb_inplace_subtract */
+ 0, /* nb_inplace_multiply */
+ 0, /* nb_inplace_remainder */
+ 0, /* nb_inplace_power */
+ 0, /* nb_inplace_lshift */
+ 0, /* nb_inplace_rshift */
+ 0, /* nb_inplace_and */
+ 0, /* nb_inplace_xor */
+ 0, /* nb_inplace_or */
+ 0, /* nb_floor_divide */
+ 0, /* nb_true_divide */
+ 0, /* nb_inplace_floor_divide */
+ 0, /* nb_inplace_true_divide */
+ 0, /* nb_index */
+};
static PyTypeObject PyNone_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
@@ -1468,10 +1470,34 @@ static PyTypeObject PyNone_Type = {
0, /*tp_setattr*/
0, /*tp_reserved*/
none_repr, /*tp_repr*/
- 0, /*tp_as_number*/
+ &none_as_number, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash */
+ 0, /*tp_call */
+ 0, /*tp_str */
+ 0, /*tp_getattro */
+ 0, /*tp_setattro */
+ 0, /*tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /*tp_flags */
+ 0, /*tp_doc */
+ 0, /*tp_traverse */
+ 0, /*tp_clear */
+ 0, /*tp_richcompare */
+ 0, /*tp_weaklistoffset */
+ 0, /*tp_iter */
+ 0, /*tp_iternext */
+ 0, /*tp_methods */
+ 0, /*tp_members */
+ 0, /*tp_getset */
+ 0, /*tp_base */
+ 0, /*tp_dict */
+ 0, /*tp_descr_get */
+ 0, /*tp_descr_set */
+ 0, /*tp_dictoffset */
+ 0, /*tp_init */
+ 0, /*tp_alloc */
+ none_new, /*tp_new */
};
PyObject _Py_NoneStruct = {
@@ -1488,6 +1514,16 @@ NotImplemented_repr(PyObject *op)
return PyUnicode_FromString("NotImplemented");
}
+static PyObject *
+notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
+ PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
+ return NULL;
+ }
+ Py_RETURN_NOTIMPLEMENTED;
+}
+
static PyTypeObject PyNotImplemented_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"NotImplementedType",
@@ -1503,6 +1539,30 @@ static PyTypeObject PyNotImplemented_Type = {
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash */
+ 0, /*tp_call */
+ 0, /*tp_str */
+ 0, /*tp_getattro */
+ 0, /*tp_setattro */
+ 0, /*tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /*tp_flags */
+ 0, /*tp_doc */
+ 0, /*tp_traverse */
+ 0, /*tp_clear */
+ 0, /*tp_richcompare */
+ 0, /*tp_weaklistoffset */
+ 0, /*tp_iter */
+ 0, /*tp_iternext */
+ 0, /*tp_methods */
+ 0, /*tp_members */
+ 0, /*tp_getset */
+ 0, /*tp_base */
+ 0, /*tp_dict */
+ 0, /*tp_descr_get */
+ 0, /*tp_descr_set */
+ 0, /*tp_dictoffset */
+ 0, /*tp_init */
+ 0, /*tp_alloc */
+ notimplemented_new, /*tp_new */
};
PyObject _Py_NotImplementedStruct = {
@@ -1585,6 +1645,9 @@ _Py_ReadyTypes(void)
if (PyType_Ready(&PyProperty_Type) < 0)
Py_FatalError("Can't initialize property type");
+ if (PyType_Ready(&_PyManagedBuffer_Type) < 0)
+ Py_FatalError("Can't initialize managed buffer type");
+
if (PyType_Ready(&PyMemoryView_Type) < 0)
Py_FatalError("Can't initialize memoryview type");
@@ -1645,6 +1708,9 @@ _Py_ReadyTypes(void)
if (PyType_Ready(&PyZip_Type) < 0)
Py_FatalError("Can't initialize zip type");
+ if (PyType_Ready(&_PyNamespace_Type) < 0)
+ Py_FatalError("Can't initialize namespace type");
+
if (PyType_Ready(&PyCapsule_Type) < 0)
Py_FatalError("Can't initialize capsule type");
@@ -1810,6 +1876,18 @@ PyMem_Free(void *p)
PyMem_FREE(p);
}
+void
+_PyObject_DebugTypeStats(FILE *out)
+{
+ _PyCFunction_DebugMallocStats(out);
+ _PyDict_DebugMallocStats(out);
+ _PyFloat_DebugMallocStats(out);
+ _PyFrame_DebugMallocStats(out);
+ _PyList_DebugMallocStats(out);
+ _PyMethod_DebugMallocStats(out);
+ _PySet_DebugMallocStats(out);
+ _PyTuple_DebugMallocStats(out);
+}
/* These methods are used to control infinite recursion in repr, str, print,
etc. Container objects that may recursively contain themselves,
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 3916262..6225ebb 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -2,6 +2,13 @@
#ifdef WITH_PYMALLOC
+#ifdef HAVE_MMAP
+ #include <sys/mman.h>
+ #ifdef MAP_ANONYMOUS
+ #define ARENAS_USE_MMAP
+ #endif
+#endif
+
#ifdef WITH_VALGRIND
#include <valgrind/valgrind.h>
@@ -75,7 +82,8 @@ static int running_on_valgrind = -1;
* Allocation strategy abstract:
*
* For small requests, the allocator sub-allocates <Big> blocks of memory.
- * Requests greater than 256 bytes are routed to the system's allocator.
+ * Requests greater than SMALL_REQUEST_THRESHOLD bytes are routed to the
+ * system's allocator.
*
* Small requests are grouped in size classes spaced 8 bytes apart, due
* to the required valid alignment of the returned address. Requests of
@@ -107,10 +115,11 @@ static int running_on_valgrind = -1;
* 57-64 64 7
* 65-72 72 8
* ... ... ...
- * 241-248 248 30
- * 249-256 256 31
+ * 497-504 504 62
+ * 505-512 512 63
*
- * 0, 257 and up: routed to the underlying allocator.
+ * 0, SMALL_REQUEST_THRESHOLD + 1 and up: routed to the underlying
+ * allocator.
*/
/*==========================================================================*/
@@ -129,7 +138,6 @@ static int running_on_valgrind = -1;
*/
#define ALIGNMENT 8 /* must be 2^N */
#define ALIGNMENT_SHIFT 3
-#define ALIGNMENT_MASK (ALIGNMENT - 1)
/* Return the number of bytes in size class I, as a uint. */
#define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT)
@@ -139,14 +147,17 @@ static int running_on_valgrind = -1;
* small enough in order to use preallocated memory pools. You can tune
* this value according to your application behaviour and memory needs.
*
+ * Note: a size threshold of 512 guarantees that newly created dictionaries
+ * will be allocated from preallocated memory pools on 64-bit.
+ *
* The following invariants must hold:
- * 1) ALIGNMENT <= SMALL_REQUEST_THRESHOLD <= 256
+ * 1) ALIGNMENT <= SMALL_REQUEST_THRESHOLD <= 512
* 2) SMALL_REQUEST_THRESHOLD is evenly divisible by ALIGNMENT
*
* Although not required, for better performance and space efficiency,
* it is recommended that SMALL_REQUEST_THRESHOLD is set to a power of 2.
*/
-#define SMALL_REQUEST_THRESHOLD 256
+#define SMALL_REQUEST_THRESHOLD 512
#define NB_SMALL_SIZE_CLASSES (SMALL_REQUEST_THRESHOLD / ALIGNMENT)
/*
@@ -174,15 +185,15 @@ static int running_on_valgrind = -1;
/*
* The allocator sub-allocates <Big> blocks of memory (called arenas) aligned
* on a page boundary. This is a reserved virtual address space for the
- * current process (obtained through a malloc call). In no way this means
- * that the memory arenas will be used entirely. A malloc(<Big>) is usually
- * an address range reservation for <Big> bytes, unless all pages within this
- * space are referenced subsequently. So malloc'ing big blocks and not using
- * them does not mean "wasting memory". It's an addressable range wastage...
+ * current process (obtained through a malloc()/mmap() call). In no way this
+ * means that the memory arenas will be used entirely. A malloc(<Big>) is
+ * usually an address range reservation for <Big> bytes, unless all pages within
+ * this space are referenced subsequently. So malloc'ing big blocks and not
+ * using them does not mean "wasting memory". It's an addressable range
+ * wastage...
*
- * Therefore, allocating arenas with malloc is not optimal, because there is
- * some address space wastage, but this is the most portable way to request
- * memory from the system across various platforms.
+ * Arenas are allocated with mmap() on systems supporting anonymous memory
+ * mappings to reduce heap fragmentation.
*/
#define ARENA_SIZE (256 << 10) /* 256KB */
@@ -302,14 +313,12 @@ struct arena_object {
struct arena_object* prevarena;
};
-#undef ROUNDUP
-#define ROUNDUP(x) (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK)
-#define POOL_OVERHEAD ROUNDUP(sizeof(struct pool_header))
+#define POOL_OVERHEAD _Py_SIZE_ROUND_UP(sizeof(struct pool_header), ALIGNMENT)
#define DUMMY_SIZE_IDX 0xffff /* size class of newly cached pools */
/* Round pointer P down to the closest pool-aligned address <= P, as a poolp */
-#define POOL_ADDR(P) ((poolp)((uptr)(P) & ~(uptr)POOL_SIZE_MASK))
+#define POOL_ADDR(P) ((poolp)_Py_ALIGN_DOWN((P), POOL_SIZE))
/* Return total number of blocks in pool of size index I, as a uint. */
#define NUMBLOCKS(I) ((uint)(POOL_SIZE - POOL_OVERHEAD) / INDEX2SIZE(I))
@@ -440,6 +449,9 @@ static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] = {
, PT(48), PT(49), PT(50), PT(51), PT(52), PT(53), PT(54), PT(55)
#if NB_SMALL_SIZE_CLASSES > 56
, PT(56), PT(57), PT(58), PT(59), PT(60), PT(61), PT(62), PT(63)
+#if NB_SMALL_SIZE_CLASSES > 64
+#error "NB_SMALL_SIZE_CLASSES should be less than 64"
+#endif /* NB_SMALL_SIZE_CLASSES > 64 */
#endif /* NB_SMALL_SIZE_CLASSES > 56 */
#endif /* NB_SMALL_SIZE_CLASSES > 48 */
#endif /* NB_SMALL_SIZE_CLASSES > 40 */
@@ -508,12 +520,10 @@ static struct arena_object* usable_arenas = NULL;
/* Number of arenas allocated that haven't been free()'d. */
static size_t narenas_currently_allocated = 0;
-#ifdef PYMALLOC_DEBUG
/* Total number of times malloc() called to allocate an arena. */
static size_t ntimes_arena_allocated = 0;
/* High water mark (max value ever seen) for narenas_currently_allocated. */
static size_t narenas_highwater = 0;
-#endif
/* Allocate a new arena. If we run out of memory, return NULL. Else
* allocate a new arena, and return the address of an arena_object
@@ -525,10 +535,12 @@ new_arena(void)
{
struct arena_object* arenaobj;
uint excess; /* number of bytes above pool alignment */
+ void *address;
+ int err;
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
- _PyObject_DebugMallocStats();
+ _PyObject_DebugMallocStats(stderr);
#endif
if (unused_arena_objects == NULL) {
uint i;
@@ -577,8 +589,15 @@ new_arena(void)
arenaobj = unused_arena_objects;
unused_arena_objects = arenaobj->nextarena;
assert(arenaobj->address == 0);
- arenaobj->address = (uptr)malloc(ARENA_SIZE);
- if (arenaobj->address == 0) {
+#ifdef ARENAS_USE_MMAP
+ address = mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ err = (address == MAP_FAILED);
+#else
+ address = malloc(ARENA_SIZE);
+ err = (address == 0);
+#endif
+ if (err) {
/* The allocation failed: return NULL after putting the
* arenaobj back.
*/
@@ -586,13 +605,12 @@ new_arena(void)
unused_arena_objects = arenaobj;
return NULL;
}
+ arenaobj->address = (uptr)address;
++narenas_currently_allocated;
-#ifdef PYMALLOC_DEBUG
++ntimes_arena_allocated;
if (narenas_currently_allocated > narenas_highwater)
narenas_highwater = narenas_currently_allocated;
-#endif
arenaobj->freepools = NULL;
/* pool_address <- first pool-aligned address in the arena
nfreepools <- number of whole pools that fit after alignment */
@@ -1054,7 +1072,11 @@ PyObject_Free(void *p)
unused_arena_objects = ao;
/* Free the entire arena. */
+#ifdef ARENAS_USE_MMAP
+ munmap((void *)ao->address, ARENA_SIZE);
+#else
free((void *)ao->address);
+#endif
ao->address = 0; /* mark unassociated */
--narenas_currently_allocated;
@@ -1694,17 +1716,19 @@ _PyObject_DebugDumpAddress(const void *p)
}
}
+#endif /* PYMALLOC_DEBUG */
+
static size_t
-printone(const char* msg, size_t value)
+printone(FILE *out, const char* msg, size_t value)
{
int i, k;
char buf[100];
size_t origvalue = value;
- fputs(msg, stderr);
+ fputs(msg, out);
for (i = (int)strlen(msg); i < 35; ++i)
- fputc(' ', stderr);
- fputc('=', stderr);
+ fputc(' ', out);
+ fputc('=', out);
/* Write the value with commas. */
i = 22;
@@ -1725,17 +1749,33 @@ printone(const char* msg, size_t value)
while (i >= 0)
buf[i--] = ' ';
- fputs(buf, stderr);
+ fputs(buf, out);
return origvalue;
}
-/* Print summary info to stderr about the state of pymalloc's structures.
+void
+_PyDebugAllocatorStats(FILE *out,
+ const char *block_name, int num_blocks, size_t sizeof_block)
+{
+ char buf1[128];
+ char buf2[128];
+ PyOS_snprintf(buf1, sizeof(buf1),
+ "%d %ss * %zd bytes each",
+ num_blocks, block_name, sizeof_block);
+ PyOS_snprintf(buf2, sizeof(buf2),
+ "%48s ", buf1);
+ (void)printone(out, buf2, num_blocks * sizeof_block);
+}
+
+#ifdef WITH_PYMALLOC
+
+/* Print summary info to "out" about the state of pymalloc's structures.
* In Py_DEBUG mode, also perform some expensive internal consistency
* checks.
*/
void
-_PyObject_DebugMallocStats(void)
+_PyObject_DebugMallocStats(FILE *out)
{
uint i;
const uint numclasses = SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT;
@@ -1764,7 +1804,7 @@ _PyObject_DebugMallocStats(void)
size_t total;
char buf[128];
- fprintf(stderr, "Small block threshold = %d, in %u size classes.\n",
+ fprintf(out, "Small block threshold = %d, in %u size classes.\n",
SMALL_REQUEST_THRESHOLD, numclasses);
for (i = 0; i < numclasses; ++i)
@@ -1775,7 +1815,6 @@ _PyObject_DebugMallocStats(void)
* will be living in full pools -- would be a shame to miss them.
*/
for (i = 0; i < maxarenas; ++i) {
- uint poolsinarena;
uint j;
uptr base = arenas[i].address;
@@ -1784,7 +1823,6 @@ _PyObject_DebugMallocStats(void)
continue;
narenas += 1;
- poolsinarena = arenas[i].ntotalpools;
numfreepools += arenas[i].nfreepools;
/* round up to pool alignment */
@@ -1820,10 +1858,10 @@ _PyObject_DebugMallocStats(void)
}
assert(narenas == narenas_currently_allocated);
- fputc('\n', stderr);
+ fputc('\n', out);
fputs("class size num pools blocks in use avail blocks\n"
"----- ---- --------- ------------- ------------\n",
- stderr);
+ out);
for (i = 0; i < numclasses; ++i) {
size_t p = numpools[i];
@@ -1834,7 +1872,7 @@ _PyObject_DebugMallocStats(void)
assert(b == 0 && f == 0);
continue;
}
- fprintf(stderr, "%5u %6u "
+ fprintf(out, "%5u %6u "
"%11" PY_FORMAT_SIZE_T "u "
"%15" PY_FORMAT_SIZE_T "u "
"%13" PY_FORMAT_SIZE_T "u\n",
@@ -1844,35 +1882,36 @@ _PyObject_DebugMallocStats(void)
pool_header_bytes += p * POOL_OVERHEAD;
quantization += p * ((POOL_SIZE - POOL_OVERHEAD) % size);
}
- fputc('\n', stderr);
- (void)printone("# times object malloc called", serialno);
-
- (void)printone("# arenas allocated total", ntimes_arena_allocated);
- (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas);
- (void)printone("# arenas highwater mark", narenas_highwater);
- (void)printone("# arenas allocated current", narenas);
+ fputc('\n', out);
+#ifdef PYMALLOC_DEBUG
+ (void)printone(out, "# times object malloc called", serialno);
+#endif
+ (void)printone(out, "# arenas allocated total", ntimes_arena_allocated);
+ (void)printone(out, "# arenas reclaimed", ntimes_arena_allocated - narenas);
+ (void)printone(out, "# arenas highwater mark", narenas_highwater);
+ (void)printone(out, "# arenas allocated current", narenas);
PyOS_snprintf(buf, sizeof(buf),
"%" PY_FORMAT_SIZE_T "u arenas * %d bytes/arena",
narenas, ARENA_SIZE);
- (void)printone(buf, narenas * ARENA_SIZE);
+ (void)printone(out, buf, narenas * ARENA_SIZE);
- fputc('\n', stderr);
+ fputc('\n', out);
- total = printone("# bytes in allocated blocks", allocated_bytes);
- total += printone("# bytes in available blocks", available_bytes);
+ total = printone(out, "# bytes in allocated blocks", allocated_bytes);
+ total += printone(out, "# bytes in available blocks", available_bytes);
PyOS_snprintf(buf, sizeof(buf),
"%u unused pools * %d bytes", numfreepools, POOL_SIZE);
- total += printone(buf, (size_t)numfreepools * POOL_SIZE);
+ total += printone(out, buf, (size_t)numfreepools * POOL_SIZE);
- total += printone("# bytes lost to pool headers", pool_header_bytes);
- total += printone("# bytes lost to quantization", quantization);
- total += printone("# bytes lost to arena alignment", arena_alignment);
- (void)printone("Total", total);
+ total += printone(out, "# bytes lost to pool headers", pool_header_bytes);
+ total += printone(out, "# bytes lost to quantization", quantization);
+ total += printone(out, "# bytes lost to arena alignment", arena_alignment);
+ (void)printone(out, "Total", total);
}
-#endif /* PYMALLOC_DEBUG */
+#endif /* #ifdef WITH_PYMALLOC */
#ifdef Py_USING_MEMORY_DEBUGGER
/* Make this function last so gcc won't inline it since the definition is
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index cebccff..214b455 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -1,6 +1,7 @@
/* Range object implementation */
#include "Python.h"
+#include "structmember.h"
/* Support objects whose length is > PY_SSIZE_T_MAX.
@@ -610,6 +611,137 @@ range_contains(rangeobject *r, PyObject *ob)
PY_ITERSEARCH_CONTAINS);
}
+/* Compare two range objects. Return 1 for equal, 0 for not equal
+ and -1 on error. The algorithm is roughly the C equivalent of
+
+ if r0 is r1:
+ return True
+ if len(r0) != len(r1):
+ return False
+ if not len(r0):
+ return True
+ if r0.start != r1.start:
+ return False
+ if len(r0) == 1:
+ return True
+ return r0.step == r1.step
+*/
+static int
+range_equals(rangeobject *r0, rangeobject *r1)
+{
+ int cmp_result;
+ PyObject *one;
+
+ if (r0 == r1)
+ return 1;
+ cmp_result = PyObject_RichCompareBool(r0->length, r1->length, Py_EQ);
+ /* Return False or error to the caller. */
+ if (cmp_result != 1)
+ return cmp_result;
+ cmp_result = PyObject_Not(r0->length);
+ /* Return True or error to the caller. */
+ if (cmp_result != 0)
+ return cmp_result;
+ cmp_result = PyObject_RichCompareBool(r0->start, r1->start, Py_EQ);
+ /* Return False or error to the caller. */
+ if (cmp_result != 1)
+ return cmp_result;
+ one = PyLong_FromLong(1);
+ if (!one)
+ return -1;
+ cmp_result = PyObject_RichCompareBool(r0->length, one, Py_EQ);
+ Py_DECREF(one);
+ /* Return True or error to the caller. */
+ if (cmp_result != 0)
+ return cmp_result;
+ return PyObject_RichCompareBool(r0->step, r1->step, Py_EQ);
+}
+
+static PyObject *
+range_richcompare(PyObject *self, PyObject *other, int op)
+{
+ int result;
+
+ if (!PyRange_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
+ switch (op) {
+ case Py_NE:
+ case Py_EQ:
+ result = range_equals((rangeobject*)self, (rangeobject*)other);
+ if (result == -1)
+ return NULL;
+ if (op == Py_NE)
+ result = !result;
+ if (result)
+ Py_RETURN_TRUE;
+ else
+ Py_RETURN_FALSE;
+ case Py_LE:
+ case Py_GE:
+ case Py_LT:
+ case Py_GT:
+ Py_RETURN_NOTIMPLEMENTED;
+ default:
+ PyErr_BadArgument();
+ return NULL;
+ }
+}
+
+/* Hash function for range objects. Rough C equivalent of
+
+ if not len(r):
+ return hash((len(r), None, None))
+ if len(r) == 1:
+ return hash((len(r), r.start, None))
+ return hash((len(r), r.start, r.step))
+*/
+static Py_hash_t
+range_hash(rangeobject *r)
+{
+ PyObject *t;
+ Py_hash_t result = -1;
+ int cmp_result;
+
+ t = PyTuple_New(3);
+ if (!t)
+ return -1;
+ Py_INCREF(r->length);
+ PyTuple_SET_ITEM(t, 0, r->length);
+ cmp_result = PyObject_Not(r->length);
+ if (cmp_result == -1)
+ goto end;
+ if (cmp_result == 1) {
+ Py_INCREF(Py_None);
+ Py_INCREF(Py_None);
+ PyTuple_SET_ITEM(t, 1, Py_None);
+ PyTuple_SET_ITEM(t, 2, Py_None);
+ }
+ else {
+ PyObject *one;
+ Py_INCREF(r->start);
+ PyTuple_SET_ITEM(t, 1, r->start);
+ one = PyLong_FromLong(1);
+ if (!one)
+ goto end;
+ cmp_result = PyObject_RichCompareBool(r->length, one, Py_EQ);
+ Py_DECREF(one);
+ if (cmp_result == -1)
+ goto end;
+ if (cmp_result == 1) {
+ Py_INCREF(Py_None);
+ PyTuple_SET_ITEM(t, 2, Py_None);
+ }
+ else {
+ Py_INCREF(r->step);
+ PyTuple_SET_ITEM(t, 2, r->step);
+ }
+ }
+ result = PyObject_Hash(t);
+ end:
+ Py_DECREF(t);
+ return result;
+}
+
static PyObject *
range_count(rangeobject *r, PyObject *ob)
{
@@ -750,6 +882,13 @@ static PyMethodDef range_methods[] = {
{NULL, NULL} /* sentinel */
};
+static PyMemberDef range_members[] = {
+ {"start", T_OBJECT_EX, offsetof(rangeobject, start), READONLY},
+ {"stop", T_OBJECT_EX, offsetof(rangeobject, stop), READONLY},
+ {"step", T_OBJECT_EX, offsetof(rangeobject, step), READONLY},
+ {0}
+};
+
PyTypeObject PyRange_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"range", /* Name of this type */
@@ -764,7 +903,7 @@ PyTypeObject PyRange_Type = {
0, /* tp_as_number */
&range_as_sequence, /* tp_as_sequence */
&range_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
+ (hashfunc)range_hash, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
@@ -774,12 +913,12 @@ PyTypeObject PyRange_Type = {
range_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
- 0, /* tp_richcompare */
+ range_richcompare, /* tp_richcompare */
0, /* tp_weaklistoffset */
range_iter, /* tp_iter */
0, /* tp_iternext */
range_methods, /* tp_methods */
- 0, /* tp_members */
+ range_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
@@ -826,9 +965,59 @@ rangeiter_len(rangeiterobject *r)
PyDoc_STRVAR(length_hint_doc,
"Private method returning an estimate of len(list(it)).");
+static PyObject *
+rangeiter_reduce(rangeiterobject *r)
+{
+ PyObject *start=NULL, *stop=NULL, *step=NULL;
+ PyObject *range;
+
+ /* create a range object for pickling */
+ start = PyLong_FromLong(r->start);
+ if (start == NULL)
+ goto err;
+ stop = PyLong_FromLong(r->start + r->len * r->step);
+ if (stop == NULL)
+ goto err;
+ step = PyLong_FromLong(r->step);
+ if (step == NULL)
+ goto err;
+ range = (PyObject*)make_range_object(&PyRange_Type,
+ start, stop, step);
+ if (range == NULL)
+ goto err;
+ /* return the result */
+ return Py_BuildValue("N(N)i", _PyObject_GetBuiltin("iter"), range, r->index);
+err:
+ Py_XDECREF(start);
+ Py_XDECREF(stop);
+ Py_XDECREF(step);
+ return NULL;
+}
+
+static PyObject *
+rangeiter_setstate(rangeiterobject *r, PyObject *state)
+{
+ long index = PyLong_AsLong(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (index < 0 || index >= r->len) {
+ PyErr_SetString(PyExc_ValueError, "index out of range");
+ return NULL;
+ }
+ r->index = index;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef rangeiter_methods[] = {
{"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)rangeiter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)rangeiter_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -957,9 +1146,51 @@ longrangeiter_len(longrangeiterobject *r, PyObject *no_args)
return PyNumber_Subtract(r->len, r->index);
}
+static PyObject *
+longrangeiter_reduce(longrangeiterobject *r)
+{
+ PyObject *product, *stop=NULL;
+ PyObject *range;
+
+ /* create a range object for pickling. Must calculate the "stop" value */
+ product = PyNumber_Multiply(r->len, r->step);
+ if (product == NULL)
+ return NULL;
+ stop = PyNumber_Add(r->start, product);
+ Py_DECREF(product);
+ if (stop == NULL)
+ return NULL;
+ Py_INCREF(r->start);
+ Py_INCREF(r->step);
+ range = (PyObject*)make_range_object(&PyRange_Type,
+ r->start, stop, r->step);
+ if (range == NULL) {
+ Py_DECREF(r->start);
+ Py_DECREF(stop);
+ Py_DECREF(r->step);
+ return NULL;
+ }
+
+ /* return the result */
+ return Py_BuildValue("N(N)O", _PyObject_GetBuiltin("iter"), range, r->index);
+}
+
+static PyObject *
+longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
+{
+ Py_CLEAR(r->index);
+ r->index = state;
+ Py_INCREF(r->index);
+ Py_RETURN_NONE;
+}
+
static PyMethodDef longrangeiter_methods[] = {
{"__length_hint__", (PyCFunction)longrangeiter_len, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)longrangeiter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)longrangeiter_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 3abeefb..723679a 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -77,7 +77,7 @@ NULL if the rich comparison returns an error.
static setentry *
set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
{
- register Py_ssize_t i;
+ register size_t i;
register size_t perturb;
register setentry *freeslot;
register size_t mask = so->mask;
@@ -86,7 +86,7 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
register int cmp;
PyObject *startkey;
- i = hash & mask;
+ i = (size_t)hash & mask;
entry = &table[i];
if (entry->key == NULL || entry->key == key)
return entry;
@@ -159,7 +159,7 @@ set_lookkey(PySetObject *so, PyObject *key, register Py_hash_t hash)
static setentry *
set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash)
{
- register Py_ssize_t i;
+ register size_t i;
register size_t perturb;
register setentry *freeslot;
register size_t mask = so->mask;
@@ -174,7 +174,7 @@ set_lookkey_unicode(PySetObject *so, PyObject *key, register Py_hash_t hash)
so->lookup = set_lookkey;
return set_lookkey(so, key, hash);
}
- i = hash & mask;
+ i = (size_t)hash & mask;
entry = &table[i];
if (entry->key == NULL || entry->key == key)
return entry;
@@ -256,7 +256,7 @@ set_insert_clean(register PySetObject *so, PyObject *key, Py_hash_t hash)
setentry *table = so->table;
register setentry *entry;
- i = hash & mask;
+ i = (size_t)hash & mask;
entry = &table[i];
for (perturb = hash; entry->key != NULL; perturb >>= PERTURB_SHIFT) {
i = (i << 2) + i + perturb + 1;
@@ -386,7 +386,7 @@ set_add_key(register PySetObject *so, PyObject *key)
register Py_ssize_t n_used;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
@@ -434,7 +434,7 @@ set_discard_key(PySetObject *so, PyObject *key)
assert (PyAnySet_Check(so));
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
@@ -579,11 +579,8 @@ set_dealloc(PySetObject *so)
static PyObject *
set_repr(PySetObject *so)
{
- PyObject *keys, *result=NULL;
- Py_UNICODE *u;
+ PyObject *result=NULL, *keys, *listrepr, *tmp;
int status = Py_ReprEnter((PyObject*)so);
- PyObject *listrepr;
- Py_ssize_t newsize;
if (status != 0) {
if (status < 0)
@@ -601,29 +598,24 @@ set_repr(PySetObject *so)
if (keys == NULL)
goto done;
+ /* repr(keys)[1:-1] */
listrepr = PyObject_Repr(keys);
Py_DECREF(keys);
if (listrepr == NULL)
goto done;
- newsize = PyUnicode_GET_SIZE(listrepr);
- result = PyUnicode_FromUnicode(NULL, newsize);
- if (result) {
- u = PyUnicode_AS_UNICODE(result);
- *u++ = '{';
- /* Omit the brackets from the listrepr */
- Py_UNICODE_COPY(u, PyUnicode_AS_UNICODE(listrepr)+1,
- PyUnicode_GET_SIZE(listrepr)-2);
- u += newsize-2;
- *u++ = '}';
- }
+ tmp = PyUnicode_Substring(listrepr, 1, PyUnicode_GET_LENGTH(listrepr)-1);
+ Py_DECREF(listrepr);
+ if (tmp == NULL)
+ goto done;
+ listrepr = tmp;
+
+ if (Py_TYPE(so) != &PySet_Type)
+ result = PyUnicode_FromFormat("%s({%U})",
+ Py_TYPE(so)->tp_name,
+ listrepr);
+ else
+ result = PyUnicode_FromFormat("{%U}", listrepr);
Py_DECREF(listrepr);
- if (Py_TYPE(so) != &PySet_Type) {
- PyObject *tmp = PyUnicode_FromFormat("%s(%U)",
- Py_TYPE(so)->tp_name,
- result);
- Py_DECREF(result);
- result = tmp;
- }
done:
Py_ReprLeave((PyObject*)so);
return result;
@@ -682,7 +674,7 @@ set_contains_key(PySetObject *so, PyObject *key)
setentry *entry;
if (!PyUnicode_CheckExact(key) ||
- (hash = ((PyUnicodeObject *) key)->hash) == -1) {
+ (hash = ((PyASCIIObject *) key)->hash) == -1) {
hash = PyObject_Hash(key);
if (hash == -1)
return -1;
@@ -768,14 +760,14 @@ static Py_hash_t
frozenset_hash(PyObject *self)
{
PySetObject *so = (PySetObject *)self;
- Py_hash_t h, hash = 1927868237L;
+ Py_uhash_t h, hash = 1927868237U;
setentry *entry;
Py_ssize_t pos = 0;
if (so->hash != -1)
return so->hash;
- hash *= PySet_GET_SIZE(self) + 1;
+ hash *= (Py_uhash_t)PySet_GET_SIZE(self) + 1;
while (set_next(so, &pos, &entry)) {
/* Work to increase the bit dispersion for closely spaced hash
values. The is important because some use cases have many
@@ -783,11 +775,11 @@ frozenset_hash(PyObject *self)
hashes so that many distinct combinations collapse to only
a handful of distinct hash values. */
h = entry->hash;
- hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
+ hash ^= (h ^ (h << 16) ^ 89869747U) * 3644798167U;
}
- hash = hash * 69069L + 907133923L;
+ hash = hash * 69069U + 907133923U;
if (hash == -1)
- hash = 590923713L;
+ hash = 590923713U;
so->hash = hash;
return hash;
}
@@ -827,8 +819,51 @@ setiter_len(setiterobject *si)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *setiter_iternext(setiterobject *si);
+
+static PyObject *
+setiter_reduce(setiterobject *si)
+{
+ PyObject *list;
+ setiterobject tmp;
+
+ list = PyList_New(0);
+ if (!list)
+ return NULL;
+
+ /* copy the iterator state */
+ tmp = *si;
+ Py_XINCREF(tmp.si_set);
+
+ /* iterate the temporary into a list */
+ for(;;) {
+ PyObject *element = setiter_iternext(&tmp);
+ if (element) {
+ if (PyList_Append(list, element)) {
+ Py_DECREF(element);
+ Py_DECREF(list);
+ Py_XDECREF(tmp.si_set);
+ return NULL;
+ }
+ Py_DECREF(element);
+ } else
+ break;
+ }
+ Py_XDECREF(tmp.si_set);
+ /* check for error */
+ if (tmp.si_set != NULL) {
+ /* we have an error */
+ Py_DECREF(list);
+ return NULL;
+ }
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
static PyMethodDef setiter_methods[] = {
{"__length_hint__", (PyCFunction)setiter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)setiter_reduce, METH_NOARGS, reduce_doc},
{NULL, NULL} /* sentinel */
};
@@ -1076,9 +1111,10 @@ frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return emptyfrozenset;
}
-void
-PySet_Fini(void)
+int
+PySet_ClearFreeList(void)
{
+ int freelist_size = numfree;
PySetObject *so;
while (numfree) {
@@ -1086,10 +1122,27 @@ PySet_Fini(void)
so = free_list[numfree];
PyObject_GC_Del(so);
}
+ return freelist_size;
+}
+
+void
+PySet_Fini(void)
+{
+ PySet_ClearFreeList();
Py_CLEAR(dummy);
Py_CLEAR(emptyfrozenset);
}
+/* Print summary info about the state of the optimized allocator */
+void
+_PySet_DebugMallocStats(FILE *out)
+{
+ _PyDebugAllocatorStats(out,
+ "free PySetObject",
+ numfree, sizeof(PySetObject));
+}
+
+
static PyObject *
set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
@@ -1210,10 +1263,8 @@ set_or(PySetObject *so, PyObject *other)
{
PySetObject *result;
- if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
result = (PySetObject *)set_copy(so);
if (result == NULL)
@@ -1230,10 +1281,9 @@ set_or(PySetObject *so, PyObject *other)
static PyObject *
set_ior(PySetObject *so, PyObject *other)
{
- if (!PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
+
if (set_update_internal(so, other) == -1)
return NULL;
Py_INCREF(so);
@@ -1383,10 +1433,8 @@ PyDoc_STRVAR(intersection_update_doc,
static PyObject *
set_and(PySetObject *so, PyObject *other)
{
- if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
return set_intersection(so, other);
}
@@ -1395,10 +1443,8 @@ set_iand(PySetObject *so, PyObject *other)
{
PyObject *result;
- if (!PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
result = set_intersection_update(so, other);
if (result == NULL)
return NULL;
@@ -1625,20 +1671,16 @@ PyDoc_STRVAR(difference_doc,
static PyObject *
set_sub(PySetObject *so, PyObject *other)
{
- if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
return set_difference(so, other);
}
static PyObject *
set_isub(PySetObject *so, PyObject *other)
{
- if (!PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
if (set_difference_update_internal(so, other) == -1)
return NULL;
Py_INCREF(so);
@@ -1736,10 +1778,8 @@ PyDoc_STRVAR(symmetric_difference_doc,
static PyObject *
set_xor(PySetObject *so, PyObject *other)
{
- if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(so) || !PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
return set_symmetric_difference(so, other);
}
@@ -1748,10 +1788,8 @@ set_ixor(PySetObject *so, PyObject *other)
{
PyObject *result;
- if (!PyAnySet_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyAnySet_Check(other))
+ Py_RETURN_NOTIMPLEMENTED;
result = set_symmetric_difference_update(so, other);
if (result == NULL)
return NULL;
@@ -1813,10 +1851,9 @@ set_richcompare(PySetObject *v, PyObject *w, int op)
{
PyObject *r1, *r2;
- if(!PyAnySet_Check(w)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if(!PyAnySet_Check(w))
+ Py_RETURN_NOTIMPLEMENTED;
+
switch (op) {
case Py_EQ:
if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
@@ -1846,8 +1883,7 @@ set_richcompare(PySetObject *v, PyObject *w, int op)
Py_RETURN_FALSE;
return set_issuperset(v, w);
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
static PyObject *
@@ -1959,6 +1995,7 @@ static PyObject *
set_reduce(PySetObject *so)
{
PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
+ _Py_IDENTIFIER(__dict__);
keys = PySequence_List((PyObject *)so);
if (keys == NULL)
@@ -1966,7 +2003,7 @@ set_reduce(PySetObject *so)
args = PyTuple_Pack(1, keys);
if (args == NULL)
goto done;
- dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
+ dict = _PyObject_GetAttrId((PyObject *)so, &PyId___dict__);
if (dict == NULL) {
PyErr_Clear();
dict = Py_None;
@@ -1980,8 +2017,6 @@ done:
return result;
}
-PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
-
static PyObject *
set_sizeof(PySetObject *so)
{
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index 0f4b647..1593335 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -17,6 +17,17 @@ this type and there is exactly one in existence.
#include "structmember.h"
static PyObject *
+ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
+ PyErr_SetString(PyExc_TypeError, "EllipsisType takes no arguments");
+ return NULL;
+ }
+ Py_INCREF(Py_Ellipsis);
+ return Py_Ellipsis;
+}
+
+static PyObject *
ellipsis_repr(PyObject *op)
{
return PyUnicode_FromString("Ellipsis");
@@ -43,6 +54,24 @@ PyTypeObject PyEllipsis_Type = {
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ ellipsis_new, /* tp_new */
};
PyObject _Py_EllipsisObject = {
@@ -51,19 +80,38 @@ PyObject _Py_EllipsisObject = {
};
-/* Slice object implementation
+/* Slice object implementation */
- start, stop, and step are python objects with None indicating no
+/* Using a cache is very effective since typically only a single slice is
+ * created and then deleted again
+ */
+static PySliceObject *slice_cache = NULL;
+void PySlice_Fini(void)
+{
+ PySliceObject *obj = slice_cache;
+ if (obj != NULL) {
+ slice_cache = NULL;
+ PyObject_Del(obj);
+ }
+}
+
+/* start, stop, and step are python objects with None indicating no
index is present.
*/
PyObject *
PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
{
- PySliceObject *obj = PyObject_New(PySliceObject, &PySlice_Type);
-
- if (obj == NULL)
- return NULL;
+ PySliceObject *obj;
+ if (slice_cache != NULL) {
+ obj = slice_cache;
+ slice_cache = NULL;
+ _Py_NewReference((PyObject *)obj);
+ } else {
+ obj = PyObject_New(PySliceObject, &PySlice_Type);
+ if (obj == NULL)
+ return NULL;
+ }
if (step == NULL) step = Py_None;
Py_INCREF(step);
@@ -232,7 +280,10 @@ slice_dealloc(PySliceObject *r)
Py_DECREF(r->step);
Py_DECREF(r->start);
Py_DECREF(r->stop);
- PyObject_Del(r);
+ if (slice_cache == NULL)
+ slice_cache = r;
+ else
+ PyObject_Del(r);
}
static PyObject *
@@ -298,10 +349,8 @@ slice_richcompare(PyObject *v, PyObject *w, int op)
PyObject *t2;
PyObject *res;
- if (!PySlice_Check(v) || !PySlice_Check(w)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PySlice_Check(v) || !PySlice_Check(w))
+ Py_RETURN_NOTIMPLEMENTED;
if (v == w) {
/* XXX Do we really need this shortcut?
diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h
new file mode 100644
index 0000000..f62813d
--- /dev/null
+++ b/Objects/stringlib/asciilib.h
@@ -0,0 +1,30 @@
+/* this is sort of a hack. there's at least one place (formatting
+ floats) where some stringlib code takes a different path if it's
+ compiled as unicode. */
+#define STRINGLIB_IS_UNICODE 1
+
+#define FASTSEARCH asciilib_fastsearch
+#define STRINGLIB(F) asciilib_##F
+#define STRINGLIB_OBJECT PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR 1
+#define STRINGLIB_MAX_CHAR 0x7Fu
+#define STRINGLIB_CHAR Py_UCS1
+#define STRINGLIB_TYPE_NAME "unicode"
+#define STRINGLIB_PARSE_CODE "U"
+#define STRINGLIB_EMPTY unicode_empty
+#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE
+#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK
+#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL
+#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL
+#define STRINGLIB_STR PyUnicode_1BYTE_DATA
+#define STRINGLIB_LEN PyUnicode_GET_LENGTH
+#define STRINGLIB_NEW(STR,LEN) _PyUnicode_FromASCII((char*)(STR),(LEN))
+#define STRINGLIB_RESIZE not_supported
+#define STRINGLIB_CHECK PyUnicode_Check
+#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
+
+#define STRINGLIB_TOSTR PyObject_Str
+#define STRINGLIB_TOASCII PyObject_ASCII
+
+#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping
+
diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h
new file mode 100644
index 0000000..f353367
--- /dev/null
+++ b/Objects/stringlib/codecs.h
@@ -0,0 +1,661 @@
+/* stringlib: codec implementations */
+
+#if STRINGLIB_IS_UNICODE
+
+/* Mask to quickly check whether a C 'long' contains a
+ non-ASCII, UTF8-encoded char. */
+#if (SIZEOF_LONG == 8)
+# define ASCII_CHAR_MASK 0x8080808080808080UL
+#elif (SIZEOF_LONG == 4)
+# define ASCII_CHAR_MASK 0x80808080UL
+#else
+# error C 'long' size should be either 4 or 8!
+#endif
+
+/* 10xxxxxx */
+#define IS_CONTINUATION_BYTE(ch) ((ch) >= 0x80 && (ch) < 0xC0)
+
+Py_LOCAL_INLINE(Py_UCS4)
+STRINGLIB(utf8_decode)(const char **inptr, const char *end,
+ STRINGLIB_CHAR *dest,
+ Py_ssize_t *outpos)
+{
+ Py_UCS4 ch;
+ const char *s = *inptr;
+ const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG);
+ STRINGLIB_CHAR *p = dest + *outpos;
+
+ while (s < end) {
+ ch = (unsigned char)*s;
+
+ if (ch < 0x80) {
+ /* Fast path for runs of ASCII characters. Given that common UTF-8
+ input will consist of an overwhelming majority of ASCII
+ characters, we try to optimize for this case by checking
+ as many characters as a C 'long' can contain.
+ First, check if we can do an aligned read, as most CPUs have
+ a penalty for unaligned reads.
+ */
+ if (_Py_IS_ALIGNED(s, SIZEOF_LONG)) {
+ /* Help register allocation */
+ register const char *_s = s;
+ register STRINGLIB_CHAR *_p = p;
+ while (_s < aligned_end) {
+ /* Read a whole long at a time (either 4 or 8 bytes),
+ and do a fast unrolled copy if it only contains ASCII
+ characters. */
+ unsigned long value = *(unsigned long *) _s;
+ if (value & ASCII_CHAR_MASK)
+ break;
+#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+ _p[0] = (STRINGLIB_CHAR)(value & 0xFFu);
+ _p[1] = (STRINGLIB_CHAR)((value >> 8) & 0xFFu);
+ _p[2] = (STRINGLIB_CHAR)((value >> 16) & 0xFFu);
+ _p[3] = (STRINGLIB_CHAR)((value >> 24) & 0xFFu);
+# if SIZEOF_LONG == 8
+ _p[4] = (STRINGLIB_CHAR)((value >> 32) & 0xFFu);
+ _p[5] = (STRINGLIB_CHAR)((value >> 40) & 0xFFu);
+ _p[6] = (STRINGLIB_CHAR)((value >> 48) & 0xFFu);
+ _p[7] = (STRINGLIB_CHAR)((value >> 56) & 0xFFu);
+# endif
+#else
+# if SIZEOF_LONG == 8
+ _p[0] = (STRINGLIB_CHAR)((value >> 56) & 0xFFu);
+ _p[1] = (STRINGLIB_CHAR)((value >> 48) & 0xFFu);
+ _p[2] = (STRINGLIB_CHAR)((value >> 40) & 0xFFu);
+ _p[3] = (STRINGLIB_CHAR)((value >> 32) & 0xFFu);
+ _p[4] = (STRINGLIB_CHAR)((value >> 24) & 0xFFu);
+ _p[5] = (STRINGLIB_CHAR)((value >> 16) & 0xFFu);
+ _p[6] = (STRINGLIB_CHAR)((value >> 8) & 0xFFu);
+ _p[7] = (STRINGLIB_CHAR)(value & 0xFFu);
+# else
+ _p[0] = (STRINGLIB_CHAR)((value >> 24) & 0xFFu);
+ _p[1] = (STRINGLIB_CHAR)((value >> 16) & 0xFFu);
+ _p[2] = (STRINGLIB_CHAR)((value >> 8) & 0xFFu);
+ _p[3] = (STRINGLIB_CHAR)(value & 0xFFu);
+# endif
+#endif
+ _s += SIZEOF_LONG;
+ _p += SIZEOF_LONG;
+ }
+ s = _s;
+ p = _p;
+ if (s == end)
+ break;
+ ch = (unsigned char)*s;
+ }
+ if (ch < 0x80) {
+ s++;
+ *p++ = ch;
+ continue;
+ }
+ }
+
+ if (ch < 0xE0) {
+ /* \xC2\x80-\xDF\xBF -- 0080-07FF */
+ Py_UCS4 ch2;
+ if (ch < 0xC2) {
+ /* invalid sequence
+ \x80-\xBF -- continuation byte
+ \xC0-\xC1 -- fake 0000-007F */
+ goto InvalidStart;
+ }
+ if (end - s < 2) {
+ /* unexpected end of data: the caller will decide whether
+ it's an error or not */
+ break;
+ }
+ ch2 = (unsigned char)s[1];
+ if (!IS_CONTINUATION_BYTE(ch2))
+ /* invalid continuation byte */
+ goto InvalidContinuation1;
+ ch = (ch << 6) + ch2 -
+ ((0xC0 << 6) + 0x80);
+ assert ((ch > 0x007F) && (ch <= 0x07FF));
+ s += 2;
+ if (STRINGLIB_MAX_CHAR <= 0x007F ||
+ (STRINGLIB_MAX_CHAR < 0x07FF && ch > STRINGLIB_MAX_CHAR))
+ /* Out-of-range */
+ goto Return;
+ *p++ = ch;
+ continue;
+ }
+
+ if (ch < 0xF0) {
+ /* \xE0\xA0\x80-\xEF\xBF\xBF -- 0800-FFFF */
+ Py_UCS4 ch2, ch3;
+ if (end - s < 3) {
+ /* unexpected end of data: the caller will decide whether
+ it's an error or not */
+ if (end - s < 2)
+ break;
+ ch2 = (unsigned char)s[1];
+ if (!IS_CONTINUATION_BYTE(ch2) ||
+ (ch2 < 0xA0 ? ch == 0xE0 : ch == 0xED))
+ /* for clarification see comments below */
+ goto InvalidContinuation1;
+ break;
+ }
+ ch2 = (unsigned char)s[1];
+ ch3 = (unsigned char)s[2];
+ if (!IS_CONTINUATION_BYTE(ch2)) {
+ /* invalid continuation byte */
+ goto InvalidContinuation1;
+ }
+ if (ch == 0xE0) {
+ if (ch2 < 0xA0)
+ /* invalid sequence
+ \xE0\x80\x80-\xE0\x9F\xBF -- fake 0000-0800 */
+ goto InvalidContinuation1;
+ } else if (ch == 0xED && ch2 >= 0xA0) {
+ /* Decoding UTF-8 sequences in range \xED\xA0\x80-\xED\xBF\xBF
+ will result in surrogates in range D800-DFFF. Surrogates are
+ not valid UTF-8 so they are rejected.
+ See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf
+ (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */
+ goto InvalidContinuation1;
+ }
+ if (!IS_CONTINUATION_BYTE(ch3)) {
+ /* invalid continuation byte */
+ goto InvalidContinuation2;
+ }
+ ch = (ch << 12) + (ch2 << 6) + ch3 -
+ ((0xE0 << 12) + (0x80 << 6) + 0x80);
+ assert ((ch > 0x07FF) && (ch <= 0xFFFF));
+ s += 3;
+ if (STRINGLIB_MAX_CHAR <= 0x07FF ||
+ (STRINGLIB_MAX_CHAR < 0xFFFF && ch > STRINGLIB_MAX_CHAR))
+ /* Out-of-range */
+ goto Return;
+ *p++ = ch;
+ continue;
+ }
+
+ if (ch < 0xF5) {
+ /* \xF0\x90\x80\x80-\xF4\x8F\xBF\xBF -- 10000-10FFFF */
+ Py_UCS4 ch2, ch3, ch4;
+ if (end - s < 4) {
+ /* unexpected end of data: the caller will decide whether
+ it's an error or not */
+ if (end - s < 2)
+ break;
+ ch2 = (unsigned char)s[1];
+ if (!IS_CONTINUATION_BYTE(ch2) ||
+ (ch2 < 0x90 ? ch == 0xF0 : ch == 0xF4))
+ /* for clarification see comments below */
+ goto InvalidContinuation1;
+ if (end - s < 3)
+ break;
+ ch3 = (unsigned char)s[2];
+ if (!IS_CONTINUATION_BYTE(ch3))
+ goto InvalidContinuation2;
+ break;
+ }
+ ch2 = (unsigned char)s[1];
+ ch3 = (unsigned char)s[2];
+ ch4 = (unsigned char)s[3];
+ if (!IS_CONTINUATION_BYTE(ch2)) {
+ /* invalid continuation byte */
+ goto InvalidContinuation1;
+ }
+ if (ch == 0xF0) {
+ if (ch2 < 0x90)
+ /* invalid sequence
+ \xF0\x80\x80\x80-\xF0\x8F\xBF\xBF -- fake 0000-FFFF */
+ goto InvalidContinuation1;
+ } else if (ch == 0xF4 && ch2 >= 0x90) {
+ /* invalid sequence
+ \xF4\x90\x80\80- -- 110000- overflow */
+ goto InvalidContinuation1;
+ }
+ if (!IS_CONTINUATION_BYTE(ch3)) {
+ /* invalid continuation byte */
+ goto InvalidContinuation2;
+ }
+ if (!IS_CONTINUATION_BYTE(ch4)) {
+ /* invalid continuation byte */
+ goto InvalidContinuation3;
+ }
+ ch = (ch << 18) + (ch2 << 12) + (ch3 << 6) + ch4 -
+ ((0xF0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80);
+ assert ((ch > 0xFFFF) && (ch <= 0x10FFFF));
+ s += 4;
+ if (STRINGLIB_MAX_CHAR <= 0xFFFF ||
+ (STRINGLIB_MAX_CHAR < 0x10FFFF && ch > STRINGLIB_MAX_CHAR))
+ /* Out-of-range */
+ goto Return;
+ *p++ = ch;
+ continue;
+ }
+ goto InvalidStart;
+ }
+ ch = 0;
+Return:
+ *inptr = s;
+ *outpos = p - dest;
+ return ch;
+InvalidStart:
+ ch = 1;
+ goto Return;
+InvalidContinuation1:
+ ch = 2;
+ goto Return;
+InvalidContinuation2:
+ ch = 3;
+ goto Return;
+InvalidContinuation3:
+ ch = 4;
+ goto Return;
+}
+
+#undef ASCII_CHAR_MASK
+
+
+/* UTF-8 encoder specialized for a Unicode kind to avoid the slow
+ PyUnicode_READ() macro. Delete some parts of the code depending on the kind:
+ UCS-1 strings don't need to handle surrogates for example. */
+Py_LOCAL_INLINE(PyObject *)
+STRINGLIB(utf8_encoder)(PyObject *unicode,
+ STRINGLIB_CHAR *data,
+ Py_ssize_t size,
+ const char *errors)
+{
+#define MAX_SHORT_UNICHARS 300 /* largest size we'll do on the stack */
+
+ Py_ssize_t i; /* index into s of next input byte */
+ PyObject *result; /* result string object */
+ char *p; /* next free byte in output buffer */
+ Py_ssize_t nallocated; /* number of result bytes allocated */
+ Py_ssize_t nneeded; /* number of result bytes needed */
+#if STRINGLIB_SIZEOF_CHAR > 1
+ PyObject *errorHandler = NULL;
+ PyObject *exc = NULL;
+ PyObject *rep = NULL;
+#endif
+#if STRINGLIB_SIZEOF_CHAR == 1
+ const Py_ssize_t max_char_size = 2;
+ char stackbuf[MAX_SHORT_UNICHARS * 2];
+#elif STRINGLIB_SIZEOF_CHAR == 2
+ const Py_ssize_t max_char_size = 3;
+ char stackbuf[MAX_SHORT_UNICHARS * 3];
+#else /* STRINGLIB_SIZEOF_CHAR == 4 */
+ const Py_ssize_t max_char_size = 4;
+ char stackbuf[MAX_SHORT_UNICHARS * 4];
+#endif
+
+ assert(size >= 0);
+
+ if (size <= MAX_SHORT_UNICHARS) {
+ /* Write into the stack buffer; nallocated can't overflow.
+ * At the end, we'll allocate exactly as much heap space as it
+ * turns out we need.
+ */
+ nallocated = Py_SAFE_DOWNCAST(sizeof(stackbuf), size_t, int);
+ result = NULL; /* will allocate after we're done */
+ p = stackbuf;
+ }
+ else {
+ if (size > PY_SSIZE_T_MAX / max_char_size) {
+ /* integer overflow */
+ return PyErr_NoMemory();
+ }
+ /* Overallocate on the heap, and give the excess back at the end. */
+ nallocated = size * max_char_size;
+ result = PyBytes_FromStringAndSize(NULL, nallocated);
+ if (result == NULL)
+ return NULL;
+ p = PyBytes_AS_STRING(result);
+ }
+
+ for (i = 0; i < size;) {
+ Py_UCS4 ch = data[i++];
+
+ if (ch < 0x80) {
+ /* Encode ASCII */
+ *p++ = (char) ch;
+
+ }
+ else
+#if STRINGLIB_SIZEOF_CHAR > 1
+ if (ch < 0x0800)
+#endif
+ {
+ /* Encode Latin-1 */
+ *p++ = (char)(0xc0 | (ch >> 6));
+ *p++ = (char)(0x80 | (ch & 0x3f));
+ }
+#if STRINGLIB_SIZEOF_CHAR > 1
+ else if (Py_UNICODE_IS_SURROGATE(ch)) {
+ Py_ssize_t newpos;
+ Py_ssize_t repsize, k, startpos;
+ startpos = i-1;
+ rep = unicode_encode_call_errorhandler(
+ errors, &errorHandler, "utf-8", "surrogates not allowed",
+ unicode, &exc, startpos, startpos+1, &newpos);
+ if (!rep)
+ goto error;
+
+ if (PyBytes_Check(rep))
+ repsize = PyBytes_GET_SIZE(rep);
+ else
+ repsize = PyUnicode_GET_LENGTH(rep);
+
+ if (repsize > max_char_size) {
+ Py_ssize_t offset;
+
+ if (result == NULL)
+ offset = p - stackbuf;
+ else
+ offset = p - PyBytes_AS_STRING(result);
+
+ if (nallocated > PY_SSIZE_T_MAX - repsize + max_char_size) {
+ /* integer overflow */
+ PyErr_NoMemory();
+ goto error;
+ }
+ nallocated += repsize - max_char_size;
+ if (result != NULL) {
+ if (_PyBytes_Resize(&result, nallocated) < 0)
+ goto error;
+ } else {
+ result = PyBytes_FromStringAndSize(NULL, nallocated);
+ if (result == NULL)
+ goto error;
+ Py_MEMCPY(PyBytes_AS_STRING(result), stackbuf, offset);
+ }
+ p = PyBytes_AS_STRING(result) + offset;
+ }
+
+ if (PyBytes_Check(rep)) {
+ char *prep = PyBytes_AS_STRING(rep);
+ for(k = repsize; k > 0; k--)
+ *p++ = *prep++;
+ } else /* rep is unicode */ {
+ enum PyUnicode_Kind repkind;
+ void *repdata;
+
+ if (PyUnicode_READY(rep) < 0)
+ goto error;
+ repkind = PyUnicode_KIND(rep);
+ repdata = PyUnicode_DATA(rep);
+
+ for(k=0; k<repsize; k++) {
+ Py_UCS4 c = PyUnicode_READ(repkind, repdata, k);
+ if (0x80 <= c) {
+ raise_encode_exception(&exc, "utf-8",
+ unicode,
+ i-1, i,
+ "surrogates not allowed");
+ goto error;
+ }
+ *p++ = (char)c;
+ }
+ }
+ Py_CLEAR(rep);
+ }
+ else
+#if STRINGLIB_SIZEOF_CHAR > 2
+ if (ch < 0x10000)
+#endif
+ {
+ *p++ = (char)(0xe0 | (ch >> 12));
+ *p++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+ *p++ = (char)(0x80 | (ch & 0x3f));
+ }
+#if STRINGLIB_SIZEOF_CHAR > 2
+ else /* ch >= 0x10000 */
+ {
+ assert(ch <= MAX_UNICODE);
+ /* Encode UCS4 Unicode ordinals */
+ *p++ = (char)(0xf0 | (ch >> 18));
+ *p++ = (char)(0x80 | ((ch >> 12) & 0x3f));
+ *p++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+ *p++ = (char)(0x80 | (ch & 0x3f));
+ }
+#endif /* STRINGLIB_SIZEOF_CHAR > 2 */
+#endif /* STRINGLIB_SIZEOF_CHAR > 1 */
+ }
+
+ if (result == NULL) {
+ /* This was stack allocated. */
+ nneeded = p - stackbuf;
+ assert(nneeded <= nallocated);
+ result = PyBytes_FromStringAndSize(stackbuf, nneeded);
+ }
+ else {
+ /* Cut back to size actually needed. */
+ nneeded = p - PyBytes_AS_STRING(result);
+ assert(nneeded <= nallocated);
+ _PyBytes_Resize(&result, nneeded);
+ }
+
+#if STRINGLIB_SIZEOF_CHAR > 1
+ Py_XDECREF(errorHandler);
+ Py_XDECREF(exc);
+#endif
+ return result;
+
+#if STRINGLIB_SIZEOF_CHAR > 1
+ error:
+ Py_XDECREF(rep);
+ Py_XDECREF(errorHandler);
+ Py_XDECREF(exc);
+ Py_XDECREF(result);
+ return NULL;
+#endif
+
+#undef MAX_SHORT_UNICHARS
+}
+
+/* The pattern for constructing UCS2-repeated masks. */
+#if SIZEOF_LONG == 8
+# define UCS2_REPEAT_MASK 0x0001000100010001ul
+#elif SIZEOF_LONG == 4
+# define UCS2_REPEAT_MASK 0x00010001ul
+#else
+# error C 'long' size should be either 4 or 8!
+#endif
+
+/* The mask for fast checking. */
+#if STRINGLIB_SIZEOF_CHAR == 1
+/* The mask for fast checking of whether a C 'long' contains a
+ non-ASCII or non-Latin1 UTF16-encoded characters. */
+# define FAST_CHAR_MASK (UCS2_REPEAT_MASK * (0xFFFFu & ~STRINGLIB_MAX_CHAR))
+#else
+/* The mask for fast checking of whether a C 'long' may contain
+ UTF16-encoded surrogate characters. This is an efficient heuristic,
+ assuming that non-surrogate characters with a code point >= 0x8000 are
+ rare in most input.
+*/
+# define FAST_CHAR_MASK (UCS2_REPEAT_MASK * 0x8000u)
+#endif
+/* The mask for fast byte-swapping. */
+#define STRIPPED_MASK (UCS2_REPEAT_MASK * 0x00FFu)
+/* Swap bytes. */
+#define SWAB(value) ((((value) >> 8) & STRIPPED_MASK) | \
+ (((value) & STRIPPED_MASK) << 8))
+
+Py_LOCAL_INLINE(Py_UCS4)
+STRINGLIB(utf16_decode)(const unsigned char **inptr, const unsigned char *e,
+ STRINGLIB_CHAR *dest, Py_ssize_t *outpos,
+ int native_ordering)
+{
+ Py_UCS4 ch;
+ const unsigned char *aligned_end =
+ (const unsigned char *) _Py_ALIGN_DOWN(e, SIZEOF_LONG);
+ const unsigned char *q = *inptr;
+ STRINGLIB_CHAR *p = dest + *outpos;
+ /* Offsets from q for retrieving byte pairs in the right order. */
+#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+ int ihi = !!native_ordering, ilo = !native_ordering;
+#else
+ int ihi = !native_ordering, ilo = !!native_ordering;
+#endif
+ --e;
+
+ while (q < e) {
+ Py_UCS4 ch2;
+ /* First check for possible aligned read of a C 'long'. Unaligned
+ reads are more expensive, better to defer to another iteration. */
+ if (_Py_IS_ALIGNED(q, SIZEOF_LONG)) {
+ /* Fast path for runs of in-range non-surrogate chars. */
+ register const unsigned char *_q = q;
+ while (_q < aligned_end) {
+ unsigned long block = * (unsigned long *) _q;
+ if (native_ordering) {
+ /* Can use buffer directly */
+ if (block & FAST_CHAR_MASK)
+ break;
+ }
+ else {
+ /* Need to byte-swap */
+ if (block & SWAB(FAST_CHAR_MASK))
+ break;
+#if STRINGLIB_SIZEOF_CHAR == 1
+ block >>= 8;
+#else
+ block = SWAB(block);
+#endif
+ }
+#ifdef BYTEORDER_IS_LITTLE_ENDIAN
+# if SIZEOF_LONG == 4
+ p[0] = (STRINGLIB_CHAR)(block & 0xFFFFu);
+ p[1] = (STRINGLIB_CHAR)(block >> 16);
+# elif SIZEOF_LONG == 8
+ p[0] = (STRINGLIB_CHAR)(block & 0xFFFFu);
+ p[1] = (STRINGLIB_CHAR)((block >> 16) & 0xFFFFu);
+ p[2] = (STRINGLIB_CHAR)((block >> 32) & 0xFFFFu);
+ p[3] = (STRINGLIB_CHAR)(block >> 48);
+# endif
+#else
+# if SIZEOF_LONG == 4
+ p[0] = (STRINGLIB_CHAR)(block >> 16);
+ p[1] = (STRINGLIB_CHAR)(block & 0xFFFFu);
+# elif SIZEOF_LONG == 8
+ p[0] = (STRINGLIB_CHAR)(block >> 48);
+ p[1] = (STRINGLIB_CHAR)((block >> 32) & 0xFFFFu);
+ p[2] = (STRINGLIB_CHAR)((block >> 16) & 0xFFFFu);
+ p[3] = (STRINGLIB_CHAR)(block & 0xFFFFu);
+# endif
+#endif
+ _q += SIZEOF_LONG;
+ p += SIZEOF_LONG / 2;
+ }
+ q = _q;
+ if (q >= e)
+ break;
+ }
+
+ ch = (q[ihi] << 8) | q[ilo];
+ q += 2;
+ if (!Py_UNICODE_IS_SURROGATE(ch)) {
+#if STRINGLIB_SIZEOF_CHAR < 2
+ if (ch > STRINGLIB_MAX_CHAR)
+ /* Out-of-range */
+ goto Return;
+#endif
+ *p++ = (STRINGLIB_CHAR)ch;
+ continue;
+ }
+
+ /* UTF-16 code pair: */
+ if (q >= e)
+ goto UnexpectedEnd;
+ if (!Py_UNICODE_IS_HIGH_SURROGATE(ch))
+ goto IllegalEncoding;
+ ch2 = (q[ihi] << 8) | q[ilo];
+ q += 2;
+ if (!Py_UNICODE_IS_LOW_SURROGATE(ch2))
+ goto IllegalSurrogate;
+ ch = Py_UNICODE_JOIN_SURROGATES(ch, ch2);
+#if STRINGLIB_SIZEOF_CHAR < 4
+ /* Out-of-range */
+ goto Return;
+#else
+ *p++ = (STRINGLIB_CHAR)ch;
+#endif
+ }
+ ch = 0;
+Return:
+ *inptr = q;
+ *outpos = p - dest;
+ return ch;
+UnexpectedEnd:
+ ch = 1;
+ goto Return;
+IllegalEncoding:
+ ch = 2;
+ goto Return;
+IllegalSurrogate:
+ ch = 3;
+ goto Return;
+}
+#undef UCS2_REPEAT_MASK
+#undef FAST_CHAR_MASK
+#undef STRIPPED_MASK
+#undef SWAB
+
+
+Py_LOCAL_INLINE(void)
+STRINGLIB(utf16_encode)(unsigned short *out,
+ const STRINGLIB_CHAR *in,
+ Py_ssize_t len,
+ int native_ordering)
+{
+ const STRINGLIB_CHAR *end = in + len;
+#if STRINGLIB_SIZEOF_CHAR == 1
+# define SWAB2(CH) ((CH) << 8)
+#else
+# define SWAB2(CH) (((CH) << 8) | ((CH) >> 8))
+#endif
+#if STRINGLIB_MAX_CHAR < 0x10000
+ if (native_ordering) {
+# if STRINGLIB_SIZEOF_CHAR == 2
+ Py_MEMCPY(out, in, 2 * len);
+# else
+ _PyUnicode_CONVERT_BYTES(STRINGLIB_CHAR, unsigned short, in, end, out);
+# endif
+ } else {
+ const STRINGLIB_CHAR *unrolled_end = in + _Py_SIZE_ROUND_DOWN(len, 4);
+ while (in < unrolled_end) {
+ out[0] = SWAB2(in[0]);
+ out[1] = SWAB2(in[1]);
+ out[2] = SWAB2(in[2]);
+ out[3] = SWAB2(in[3]);
+ in += 4; out += 4;
+ }
+ while (in < end) {
+ *out++ = SWAB2(*in);
+ ++in;
+ }
+ }
+#else
+ if (native_ordering) {
+ while (in < end) {
+ Py_UCS4 ch = *in++;
+ if (ch < 0x10000)
+ *out++ = ch;
+ else {
+ out[0] = Py_UNICODE_HIGH_SURROGATE(ch);
+ out[1] = Py_UNICODE_LOW_SURROGATE(ch);
+ out += 2;
+ }
+ }
+ } else {
+ while (in < end) {
+ Py_UCS4 ch = *in++;
+ if (ch < 0x10000)
+ *out++ = SWAB2((Py_UCS2)ch);
+ else {
+ Py_UCS2 ch1 = Py_UNICODE_HIGH_SURROGATE(ch);
+ Py_UCS2 ch2 = Py_UNICODE_LOW_SURROGATE(ch);
+ out[0] = SWAB2(ch1);
+ out[1] = SWAB2(ch2);
+ out += 2;
+ }
+ }
+ }
+#endif
+#undef SWAB2
+}
+#endif /* STRINGLIB_IS_UNICODE */
diff --git a/Objects/stringlib/count.h b/Objects/stringlib/count.h
index de34f96..f48500b 100644
--- a/Objects/stringlib/count.h
+++ b/Objects/stringlib/count.h
@@ -1,14 +1,11 @@
/* stringlib: count implementation */
-#ifndef STRINGLIB_COUNT_H
-#define STRINGLIB_COUNT_H
-
#ifndef STRINGLIB_FASTSEARCH_H
#error must include "stringlib/fastsearch.h" before including this module
#endif
Py_LOCAL_INLINE(Py_ssize_t)
-stringlib_count(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
+STRINGLIB(count)(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t maxcount)
{
@@ -19,7 +16,7 @@ stringlib_count(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
if (sub_len == 0)
return (str_len < maxcount) ? str_len + 1 : maxcount;
- count = fastsearch(str, str_len, sub, sub_len, maxcount, FAST_COUNT);
+ count = FASTSEARCH(str, str_len, sub, sub_len, maxcount, FAST_COUNT);
if (count < 0)
return 0; /* no match */
@@ -27,4 +24,4 @@ stringlib_count(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
return count;
}
-#endif
+
diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h
index 3e7f5e8..8e79a43 100644
--- a/Objects/stringlib/eq.h
+++ b/Objects/stringlib/eq.h
@@ -9,13 +9,26 @@ unicode_eq(PyObject *aa, PyObject *bb)
register PyUnicodeObject *a = (PyUnicodeObject *)aa;
register PyUnicodeObject *b = (PyUnicodeObject *)bb;
- if (a->length != b->length)
+ if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) {
+ assert(0 && "unicode_eq ready fail");
return 0;
- if (a->length == 0)
+ }
+
+ if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b))
+ return 0;
+ if (PyUnicode_GET_LENGTH(a) == 0)
return 1;
- if (a->str[0] != b->str[0])
+ if (PyUnicode_KIND(a) != PyUnicode_KIND(b))
+ return 0;
+ /* Just comparing the first byte is enough to see if a and b differ.
+ * If they are 2 byte or 4 byte character most differences will happen in
+ * the lower bytes anyways.
+ */
+ if (PyUnicode_1BYTE_DATA(a)[0] != PyUnicode_1BYTE_DATA(b)[0])
return 0;
- if (a->length == 1)
+ if (PyUnicode_KIND(a) == PyUnicode_1BYTE_KIND &&
+ PyUnicode_GET_LENGTH(a) == 1)
return 1;
- return memcmp(a->str, b->str, a->length * sizeof(Py_UNICODE)) == 0;
+ return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b),
+ PyUnicode_GET_LENGTH(a) * PyUnicode_KIND(a)) == 0;
}
diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h
index e231c58..ecf885e 100644
--- a/Objects/stringlib/fastsearch.h
+++ b/Objects/stringlib/fastsearch.h
@@ -1,6 +1,5 @@
/* stringlib: fastsearch implementation */
-#ifndef STRINGLIB_FASTSEARCH_H
#define STRINGLIB_FASTSEARCH_H
/* fast search/count implementation, based on a mix between boyer-
@@ -33,8 +32,61 @@
#define STRINGLIB_BLOOM(mask, ch) \
((mask & (1UL << ((ch) & (STRINGLIB_BLOOM_WIDTH -1)))))
+
+Py_LOCAL_INLINE(Py_ssize_t)
+STRINGLIB(fastsearch_memchr_1char)(const STRINGLIB_CHAR* s, Py_ssize_t n,
+ STRINGLIB_CHAR ch, unsigned char needle,
+ Py_ssize_t maxcount, int mode)
+{
+ void *candidate;
+ const STRINGLIB_CHAR *found;
+
+#define DO_MEMCHR(memchr, s, needle, nchars) do { \
+ candidate = memchr((const void *) (s), (needle), (nchars) * sizeof(STRINGLIB_CHAR)); \
+ found = (const STRINGLIB_CHAR *) _Py_ALIGN_DOWN(candidate, sizeof(STRINGLIB_CHAR)); \
+ } while (0)
+
+ if (mode == FAST_SEARCH) {
+ const STRINGLIB_CHAR *ptr = s;
+ const STRINGLIB_CHAR *e = s + n;
+ while (ptr < e) {
+ DO_MEMCHR(memchr, ptr, needle, e - ptr);
+ if (found == NULL)
+ return -1;
+ if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch)
+ return (found - s);
+ /* False positive */
+ ptr = found + 1;
+ }
+ return -1;
+ }
+#ifdef HAVE_MEMRCHR
+ /* memrchr() is a GNU extension, available since glibc 2.1.91.
+ it doesn't seem as optimized as memchr(), but is still quite
+ faster than our hand-written loop in FASTSEARCH below */
+ else if (mode == FAST_RSEARCH) {
+ while (n > 0) {
+ DO_MEMCHR(memrchr, s, needle, n);
+ if (found == NULL)
+ return -1;
+ n = found - s;
+ if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch)
+ return n;
+ /* False positive */
+ }
+ return -1;
+ }
+#endif
+ else {
+ assert(0); /* Should never get here */
+ return 0;
+ }
+
+#undef DO_MEMCHR
+}
+
Py_LOCAL_INLINE(Py_ssize_t)
-fastsearch(const STRINGLIB_CHAR* s, Py_ssize_t n,
+FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
const STRINGLIB_CHAR* p, Py_ssize_t m,
Py_ssize_t maxcount, int mode)
{
@@ -52,6 +104,24 @@ fastsearch(const STRINGLIB_CHAR* s, Py_ssize_t n,
if (m <= 0)
return -1;
/* use special case for 1-character strings */
+ if (n > 10 && (mode == FAST_SEARCH
+#ifdef HAVE_MEMRCHR
+ || mode == FAST_RSEARCH
+#endif
+ )) {
+ /* use memchr if we can choose a needle without two many likely
+ false positives */
+ unsigned char needle;
+ needle = p[0] & 0xff;
+#if STRINGLIB_SIZEOF_CHAR > 1
+ /* If looking for a multiple of 256, we'd have too
+ many false positives looking for the '\0' byte in UCS2
+ and UCS4 representations. */
+ if (needle != 0)
+#endif
+ return STRINGLIB(fastsearch_memchr_1char)
+ (s, n, p[0], needle, maxcount, mode);
+ }
if (mode == FAST_COUNT) {
for (i = 0; i < n; i++)
if (s[i] == p[0]) {
@@ -157,4 +227,3 @@ fastsearch(const STRINGLIB_CHAR* s, Py_ssize_t n,
return count;
}
-#endif
diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h
index ce615dc..518e012 100644
--- a/Objects/stringlib/find.h
+++ b/Objects/stringlib/find.h
@@ -1,14 +1,11 @@
/* stringlib: find/index implementation */
-#ifndef STRINGLIB_FIND_H
-#define STRINGLIB_FIND_H
-
#ifndef STRINGLIB_FASTSEARCH_H
#error must include "stringlib/fastsearch.h" before including this module
#endif
Py_LOCAL_INLINE(Py_ssize_t)
-stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
+STRINGLIB(find)(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t offset)
{
@@ -19,7 +16,7 @@ stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
if (sub_len == 0)
return offset;
- pos = fastsearch(str, str_len, sub, sub_len, -1, FAST_SEARCH);
+ pos = FASTSEARCH(str, str_len, sub, sub_len, -1, FAST_SEARCH);
if (pos >= 0)
pos += offset;
@@ -28,7 +25,7 @@ stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
}
Py_LOCAL_INLINE(Py_ssize_t)
-stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
+STRINGLIB(rfind)(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t offset)
{
@@ -39,7 +36,7 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
if (sub_len == 0)
return str_len + offset;
- pos = fastsearch(str, str_len, sub, sub_len, -1, FAST_RSEARCH);
+ pos = FASTSEARCH(str, str_len, sub, sub_len, -1, FAST_RSEARCH);
if (pos >= 0)
pos += offset;
@@ -63,29 +60,29 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
}
Py_LOCAL_INLINE(Py_ssize_t)
-stringlib_find_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
+STRINGLIB(find_slice)(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t start, Py_ssize_t end)
{
ADJUST_INDICES(start, end, str_len);
- return stringlib_find(str + start, end - start, sub, sub_len, start);
+ return STRINGLIB(find)(str + start, end - start, sub, sub_len, start);
}
Py_LOCAL_INLINE(Py_ssize_t)
-stringlib_rfind_slice(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
+STRINGLIB(rfind_slice)(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
Py_ssize_t start, Py_ssize_t end)
{
ADJUST_INDICES(start, end, str_len);
- return stringlib_rfind(str + start, end - start, sub, sub_len, start);
+ return STRINGLIB(rfind)(str + start, end - start, sub, sub_len, start);
}
#ifdef STRINGLIB_WANT_CONTAINS_OBJ
Py_LOCAL_INLINE(int)
-stringlib_contains_obj(PyObject* str, PyObject* sub)
+STRINGLIB(contains_obj)(PyObject* str, PyObject* sub)
{
- return stringlib_find(
+ return STRINGLIB(find)(
STRINGLIB_STR(str), STRINGLIB_LEN(str),
STRINGLIB_STR(sub), STRINGLIB_LEN(sub), 0
) != -1;
@@ -98,14 +95,14 @@ This function is a helper for the "find" family (find, rfind, index,
rindex) and for count, startswith and endswith, because they all have
the same behaviour for the arguments.
-It does not touch the variables received until it knows everything
+It does not touch the variables received until it knows everything
is ok.
*/
#define FORMAT_BUFFER_SIZE 50
Py_LOCAL_INLINE(int)
-stringlib_parse_args_finds(const char * function_name, PyObject *args,
+STRINGLIB(parse_args_finds)(const char * function_name, PyObject *args,
PyObject **subobj,
Py_ssize_t *start, Py_ssize_t *end)
{
@@ -148,28 +145,76 @@ first argument is a unicode object.
Note that we receive a pointer to the pointer of the substring object,
so when we create that object in this function we don't DECREF it,
-because it continues living in the caller functions (those functions,
+because it continues living in the caller functions (those functions,
after finishing using the substring, must DECREF it).
*/
Py_LOCAL_INLINE(int)
-stringlib_parse_args_finds_unicode(const char * function_name, PyObject *args,
- PyUnicodeObject **substring,
+STRINGLIB(parse_args_finds_unicode)(const char * function_name, PyObject *args,
+ PyObject **substring,
Py_ssize_t *start, Py_ssize_t *end)
{
PyObject *tmp_substring;
- if(stringlib_parse_args_finds(function_name, args, &tmp_substring,
+ if(STRINGLIB(parse_args_finds)(function_name, args, &tmp_substring,
start, end)) {
tmp_substring = PyUnicode_FromObject(tmp_substring);
if (!tmp_substring)
return 0;
- *substring = (PyUnicodeObject *)tmp_substring;
+ *substring = tmp_substring;
return 1;
}
return 0;
}
-#endif /* STRINGLIB_IS_UNICODE */
+#else /* !STRINGLIB_IS_UNICODE */
+
+/*
+Wraps stringlib_parse_args_finds() and additionally checks whether the
+first argument is an integer in range(0, 256).
+
+If this is the case, writes the integer value to the byte parameter
+and sets subobj to NULL. Otherwise, sets the first argument to subobj
+and doesn't touch byte. The other parameters are similar to those of
+stringlib_parse_args_finds().
+*/
+
+Py_LOCAL_INLINE(int)
+STRINGLIB(parse_args_finds_byte)(const char *function_name, PyObject *args,
+ PyObject **subobj, char *byte,
+ Py_ssize_t *start, Py_ssize_t *end)
+{
+ PyObject *tmp_subobj;
+ Py_ssize_t ival;
+ PyObject *err;
+
+ if(!STRINGLIB(parse_args_finds)(function_name, args, &tmp_subobj,
+ start, end))
+ return 0;
-#endif /* STRINGLIB_FIND_H */
+ if (!PyNumber_Check(tmp_subobj)) {
+ *subobj = tmp_subobj;
+ return 1;
+ }
+
+ ival = PyNumber_AsSsize_t(tmp_subobj, PyExc_OverflowError);
+ if (ival == -1) {
+ err = PyErr_Occurred();
+ if (err && !PyErr_GivenExceptionMatches(err, PyExc_OverflowError)) {
+ PyErr_Clear();
+ *subobj = tmp_subobj;
+ return 1;
+ }
+ }
+
+ if (ival < 0 || ival > 255) {
+ PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
+ return 0;
+ }
+
+ *subobj = NULL;
+ *byte = (char)ival;
+ return 1;
+}
+
+#endif /* STRINGLIB_IS_UNICODE */
diff --git a/Objects/stringlib/find_max_char.h b/Objects/stringlib/find_max_char.h
new file mode 100644
index 0000000..06559c8
--- /dev/null
+++ b/Objects/stringlib/find_max_char.h
@@ -0,0 +1,133 @@
+/* Finding the optimal width of unicode characters in a buffer */
+
+#if STRINGLIB_IS_UNICODE
+
+/* Mask to quickly check whether a C 'long' contains a
+ non-ASCII, UTF8-encoded char. */
+#if (SIZEOF_LONG == 8)
+# define UCS1_ASCII_CHAR_MASK 0x8080808080808080UL
+#elif (SIZEOF_LONG == 4)
+# define UCS1_ASCII_CHAR_MASK 0x80808080UL
+#else
+# error C 'long' size should be either 4 or 8!
+#endif
+
+#if STRINGLIB_SIZEOF_CHAR == 1
+
+Py_LOCAL_INLINE(Py_UCS4)
+STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end)
+{
+ const unsigned char *p = (const unsigned char *) begin;
+ const unsigned char *aligned_end =
+ (const unsigned char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG);
+
+ while (p < end) {
+ if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
+ /* Help register allocation */
+ register const unsigned char *_p = p;
+ while (_p < aligned_end) {
+ unsigned long value = *(unsigned long *) _p;
+ if (value & UCS1_ASCII_CHAR_MASK)
+ return 255;
+ _p += SIZEOF_LONG;
+ }
+ p = _p;
+ if (p == end)
+ break;
+ }
+ if (*p++ & 0x80)
+ return 255;
+ }
+ return 127;
+}
+
+#undef ASCII_CHAR_MASK
+
+#else /* STRINGLIB_SIZEOF_CHAR == 1 */
+
+#define MASK_ASCII 0xFFFFFF80
+#define MASK_UCS1 0xFFFFFF00
+#define MASK_UCS2 0xFFFF0000
+
+#define MAX_CHAR_ASCII 0x7f
+#define MAX_CHAR_UCS1 0xff
+#define MAX_CHAR_UCS2 0xffff
+#define MAX_CHAR_UCS4 0x10ffff
+
+Py_LOCAL_INLINE(Py_UCS4)
+STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end)
+{
+#if STRINGLIB_SIZEOF_CHAR == 2
+ const Py_UCS4 mask_limit = MASK_UCS1;
+ const Py_UCS4 max_char_limit = MAX_CHAR_UCS2;
+#elif STRINGLIB_SIZEOF_CHAR == 4
+ const Py_UCS4 mask_limit = MASK_UCS2;
+ const Py_UCS4 max_char_limit = MAX_CHAR_UCS4;
+#else
+#error Invalid STRINGLIB_SIZEOF_CHAR (must be 1, 2 or 4)
+#endif
+ register Py_UCS4 mask;
+ Py_ssize_t n = end - begin;
+ const STRINGLIB_CHAR *p = begin;
+ const STRINGLIB_CHAR *unrolled_end = begin + _Py_SIZE_ROUND_DOWN(n, 4);
+ Py_UCS4 max_char;
+
+ max_char = MAX_CHAR_ASCII;
+ mask = MASK_ASCII;
+ while (p < unrolled_end) {
+ STRINGLIB_CHAR bits = p[0] | p[1] | p[2] | p[3];
+ if (bits & mask) {
+ if (mask == mask_limit) {
+ /* Limit reached */
+ return max_char_limit;
+ }
+ if (mask == MASK_ASCII) {
+ max_char = MAX_CHAR_UCS1;
+ mask = MASK_UCS1;
+ }
+ else {
+ /* mask can't be MASK_UCS2 because of mask_limit above */
+ assert(mask == MASK_UCS1);
+ max_char = MAX_CHAR_UCS2;
+ mask = MASK_UCS2;
+ }
+ /* We check the new mask on the same chars in the next iteration */
+ continue;
+ }
+ p += 4;
+ }
+ while (p < end) {
+ if (p[0] & mask) {
+ if (mask == mask_limit) {
+ /* Limit reached */
+ return max_char_limit;
+ }
+ if (mask == MASK_ASCII) {
+ max_char = MAX_CHAR_UCS1;
+ mask = MASK_UCS1;
+ }
+ else {
+ /* mask can't be MASK_UCS2 because of mask_limit above */
+ assert(mask == MASK_UCS1);
+ max_char = MAX_CHAR_UCS2;
+ mask = MASK_UCS2;
+ }
+ /* We check the new mask on the same chars in the next iteration */
+ continue;
+ }
+ p++;
+ }
+ return max_char;
+}
+
+#undef MASK_ASCII
+#undef MASK_UCS1
+#undef MASK_UCS2
+#undef MAX_CHAR_ASCII
+#undef MAX_CHAR_UCS1
+#undef MAX_CHAR_UCS2
+#undef MAX_CHAR_UCS4
+
+#endif /* STRINGLIB_SIZEOF_CHAR == 1 */
+#endif /* STRINGLIB_IS_UNICODE */
+
diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h
deleted file mode 100644
index 139b56c..0000000
--- a/Objects/stringlib/formatter.h
+++ /dev/null
@@ -1,1516 +0,0 @@
-/* implements the string, long, and float formatters. that is,
- string.__format__, etc. */
-
-#include <locale.h>
-
-/* Before including this, you must include either:
- stringlib/unicodedefs.h
- stringlib/stringdefs.h
-
- Also, you should define the names:
- FORMAT_STRING
- FORMAT_LONG
- FORMAT_FLOAT
- FORMAT_COMPLEX
- to be whatever you want the public names of these functions to
- be. These are the only non-static functions defined here.
-*/
-
-/* Raises an exception about an unknown presentation type for this
- * type. */
-
-static void
-unknown_presentation_type(STRINGLIB_CHAR presentation_type,
- const char* type_name)
-{
-#if STRINGLIB_IS_UNICODE
- /* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range,
- hence the two cases. If it is char, gcc complains that the
- condition below is always true, hence the ifdef. */
- if (presentation_type > 32 && presentation_type < 128)
-#endif
- PyErr_Format(PyExc_ValueError,
- "Unknown format code '%c' "
- "for object of type '%.200s'",
- (char)presentation_type,
- type_name);
-#if STRINGLIB_IS_UNICODE
- else
- PyErr_Format(PyExc_ValueError,
- "Unknown format code '\\x%x' "
- "for object of type '%.200s'",
- (unsigned int)presentation_type,
- type_name);
-#endif
-}
-
-static void
-invalid_comma_type(STRINGLIB_CHAR presentation_type)
-{
-#if STRINGLIB_IS_UNICODE
- /* See comment in unknown_presentation_type */
- if (presentation_type > 32 && presentation_type < 128)
-#endif
- PyErr_Format(PyExc_ValueError,
- "Cannot specify ',' with '%c'.",
- (char)presentation_type);
-#if STRINGLIB_IS_UNICODE
- else
- PyErr_Format(PyExc_ValueError,
- "Cannot specify ',' with '\\x%x'.",
- (unsigned int)presentation_type);
-#endif
-}
-
-/*
- get_integer consumes 0 or more decimal digit characters from an
- input string, updates *result with the corresponding positive
- integer, and returns the number of digits consumed.
-
- returns -1 on error.
-*/
-static int
-get_integer(STRINGLIB_CHAR **ptr, STRINGLIB_CHAR *end,
- Py_ssize_t *result)
-{
- Py_ssize_t accumulator, digitval;
- int numdigits;
- accumulator = numdigits = 0;
- for (;;(*ptr)++, numdigits++) {
- if (*ptr >= end)
- break;
- digitval = STRINGLIB_TODECIMAL(**ptr);
- if (digitval < 0)
- break;
- /*
- Detect possible overflow before it happens:
-
- accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if
- accumulator > (PY_SSIZE_T_MAX - digitval) / 10.
- */
- if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) {
- PyErr_Format(PyExc_ValueError,
- "Too many decimal digits in format string");
- return -1;
- }
- accumulator = accumulator * 10 + digitval;
- }
- *result = accumulator;
- return numdigits;
-}
-
-/************************************************************************/
-/*********** standard format specifier parsing **************************/
-/************************************************************************/
-
-/* returns true if this character is a specifier alignment token */
-Py_LOCAL_INLINE(int)
-is_alignment_token(STRINGLIB_CHAR c)
-{
- switch (c) {
- case '<': case '>': case '=': case '^':
- return 1;
- default:
- return 0;
- }
-}
-
-/* returns true if this character is a sign element */
-Py_LOCAL_INLINE(int)
-is_sign_element(STRINGLIB_CHAR c)
-{
- switch (c) {
- case ' ': case '+': case '-':
- return 1;
- default:
- return 0;
- }
-}
-
-
-typedef struct {
- STRINGLIB_CHAR fill_char;
- STRINGLIB_CHAR align;
- int alternate;
- STRINGLIB_CHAR sign;
- Py_ssize_t width;
- int thousands_separators;
- Py_ssize_t precision;
- STRINGLIB_CHAR type;
-} InternalFormatSpec;
-
-
-#if 0
-/* Occassionally useful for debugging. Should normally be commented out. */
-static void
-DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format)
-{
- printf("internal format spec: fill_char %d\n", format->fill_char);
- printf("internal format spec: align %d\n", format->align);
- printf("internal format spec: alternate %d\n", format->alternate);
- printf("internal format spec: sign %d\n", format->sign);
- printf("internal format spec: width %zd\n", format->width);
- printf("internal format spec: thousands_separators %d\n",
- format->thousands_separators);
- printf("internal format spec: precision %zd\n", format->precision);
- printf("internal format spec: type %c\n", format->type);
- printf("\n");
-}
-#endif
-
-
-/*
- ptr points to the start of the format_spec, end points just past its end.
- fills in format with the parsed information.
- returns 1 on success, 0 on failure.
- if failure, sets the exception
-*/
-static int
-parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len,
- InternalFormatSpec *format,
- char default_type,
- char default_align)
-{
- STRINGLIB_CHAR *ptr = format_spec;
- STRINGLIB_CHAR *end = format_spec + format_spec_len;
-
- /* end-ptr is used throughout this code to specify the length of
- the input string */
-
- Py_ssize_t consumed;
- int align_specified = 0;
-
- format->fill_char = '\0';
- format->align = default_align;
- format->alternate = 0;
- format->sign = '\0';
- format->width = -1;
- format->thousands_separators = 0;
- format->precision = -1;
- format->type = default_type;
-
- /* If the second char is an alignment token,
- then parse the fill char */
- if (end-ptr >= 2 && is_alignment_token(ptr[1])) {
- format->align = ptr[1];
- format->fill_char = ptr[0];
- align_specified = 1;
- ptr += 2;
- }
- else if (end-ptr >= 1 && is_alignment_token(ptr[0])) {
- format->align = ptr[0];
- align_specified = 1;
- ++ptr;
- }
-
- /* Parse the various sign options */
- if (end-ptr >= 1 && is_sign_element(ptr[0])) {
- format->sign = ptr[0];
- ++ptr;
- }
-
- /* If the next character is #, we're in alternate mode. This only
- applies to integers. */
- if (end-ptr >= 1 && ptr[0] == '#') {
- format->alternate = 1;
- ++ptr;
- }
-
- /* The special case for 0-padding (backwards compat) */
- if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') {
- format->fill_char = '0';
- if (!align_specified) {
- format->align = '=';
- }
- ++ptr;
- }
-
- consumed = get_integer(&ptr, end, &format->width);
- if (consumed == -1)
- /* Overflow error. Exception already set. */
- return 0;
-
- /* If consumed is 0, we didn't consume any characters for the
- width. In that case, reset the width to -1, because
- get_integer() will have set it to zero. -1 is how we record
- that the width wasn't specified. */
- if (consumed == 0)
- format->width = -1;
-
- /* Comma signifies add thousands separators */
- if (end-ptr && ptr[0] == ',') {
- format->thousands_separators = 1;
- ++ptr;
- }
-
- /* Parse field precision */
- if (end-ptr && ptr[0] == '.') {
- ++ptr;
-
- consumed = get_integer(&ptr, end, &format->precision);
- if (consumed == -1)
- /* Overflow error. Exception already set. */
- return 0;
-
- /* Not having a precision after a dot is an error. */
- if (consumed == 0) {
- PyErr_Format(PyExc_ValueError,
- "Format specifier missing precision");
- return 0;
- }
-
- }
-
- /* Finally, parse the type field. */
-
- if (end-ptr > 1) {
- /* More than one char remain, invalid conversion spec. */
- PyErr_Format(PyExc_ValueError, "Invalid conversion specification");
- return 0;
- }
-
- if (end-ptr == 1) {
- format->type = ptr[0];
- ++ptr;
- }
-
- /* Do as much validating as we can, just by looking at the format
- specifier. Do not take into account what type of formatting
- we're doing (int, float, string). */
-
- if (format->thousands_separators) {
- switch (format->type) {
- case 'd':
- case 'e':
- case 'f':
- case 'g':
- case 'E':
- case 'G':
- case '%':
- case 'F':
- case '\0':
- /* These are allowed. See PEP 378.*/
- break;
- default:
- invalid_comma_type(format->type);
- return 0;
- }
- }
-
- return 1;
-}
-
-/* Calculate the padding needed. */
-static void
-calc_padding(Py_ssize_t nchars, Py_ssize_t width, STRINGLIB_CHAR align,
- Py_ssize_t *n_lpadding, Py_ssize_t *n_rpadding,
- Py_ssize_t *n_total)
-{
- if (width >= 0) {
- if (nchars > width)
- *n_total = nchars;
- else
- *n_total = width;
- }
- else {
- /* not specified, use all of the chars and no more */
- *n_total = nchars;
- }
-
- /* Figure out how much leading space we need, based on the
- aligning */
- if (align == '>')
- *n_lpadding = *n_total - nchars;
- else if (align == '^')
- *n_lpadding = (*n_total - nchars) / 2;
- else if (align == '<' || align == '=')
- *n_lpadding = 0;
- else {
- /* We should never have an unspecified alignment. */
- *n_lpadding = 0;
- assert(0);
- }
-
- *n_rpadding = *n_total - nchars - *n_lpadding;
-}
-
-/* Do the padding, and return a pointer to where the caller-supplied
- content goes. */
-static STRINGLIB_CHAR *
-fill_padding(STRINGLIB_CHAR *p, Py_ssize_t nchars, STRINGLIB_CHAR fill_char,
- Py_ssize_t n_lpadding, Py_ssize_t n_rpadding)
-{
- /* Pad on left. */
- if (n_lpadding)
- STRINGLIB_FILL(p, fill_char, n_lpadding);
-
- /* Pad on right. */
- if (n_rpadding)
- STRINGLIB_FILL(p + nchars + n_lpadding, fill_char, n_rpadding);
-
- /* Pointer to the user content. */
- return p + n_lpadding;
-}
-
-#if defined FORMAT_FLOAT || defined FORMAT_LONG || defined FORMAT_COMPLEX
-/************************************************************************/
-/*********** common routines for numeric formatting *********************/
-/************************************************************************/
-
-/* Locale type codes. */
-#define LT_CURRENT_LOCALE 0
-#define LT_DEFAULT_LOCALE 1
-#define LT_NO_LOCALE 2
-
-/* Locale info needed for formatting integers and the part of floats
- before and including the decimal. Note that locales only support
- 8-bit chars, not unicode. */
-typedef struct {
- char *decimal_point;
- char *thousands_sep;
- char *grouping;
-} LocaleInfo;
-
-/* describes the layout for an integer, see the comment in
- calc_number_widths() for details */
-typedef struct {
- Py_ssize_t n_lpadding;
- Py_ssize_t n_prefix;
- Py_ssize_t n_spadding;
- Py_ssize_t n_rpadding;
- char sign;
- Py_ssize_t n_sign; /* number of digits needed for sign (0/1) */
- Py_ssize_t n_grouped_digits; /* Space taken up by the digits, including
- any grouping chars. */
- Py_ssize_t n_decimal; /* 0 if only an integer */
- Py_ssize_t n_remainder; /* Digits in decimal and/or exponent part,
- excluding the decimal itself, if
- present. */
-
- /* These 2 are not the widths of fields, but are needed by
- STRINGLIB_GROUPING. */
- Py_ssize_t n_digits; /* The number of digits before a decimal
- or exponent. */
- Py_ssize_t n_min_width; /* The min_width we used when we computed
- the n_grouped_digits width. */
-} NumberFieldWidths;
-
-
-/* Given a number of the form:
- digits[remainder]
- where ptr points to the start and end points to the end, find where
- the integer part ends. This could be a decimal, an exponent, both,
- or neither.
- If a decimal point is present, set *has_decimal and increment
- remainder beyond it.
- Results are undefined (but shouldn't crash) for improperly
- formatted strings.
-*/
-static void
-parse_number(STRINGLIB_CHAR *ptr, Py_ssize_t len,
- Py_ssize_t *n_remainder, int *has_decimal)
-{
- STRINGLIB_CHAR *end = ptr + len;
- STRINGLIB_CHAR *remainder;
-
- while (ptr<end && isdigit(*ptr))
- ++ptr;
- remainder = ptr;
-
- /* Does remainder start with a decimal point? */
- *has_decimal = ptr<end && *remainder == '.';
-
- /* Skip the decimal point. */
- if (*has_decimal)
- remainder++;
-
- *n_remainder = end - remainder;
-}
-
-/* not all fields of format are used. for example, precision is
- unused. should this take discrete params in order to be more clear
- about what it does? or is passing a single format parameter easier
- and more efficient enough to justify a little obfuscation? */
-static Py_ssize_t
-calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
- STRINGLIB_CHAR sign_char, STRINGLIB_CHAR *number,
- Py_ssize_t n_number, Py_ssize_t n_remainder,
- int has_decimal, const LocaleInfo *locale,
- const InternalFormatSpec *format)
-{
- Py_ssize_t n_non_digit_non_padding;
- Py_ssize_t n_padding;
-
- spec->n_digits = n_number - n_remainder - (has_decimal?1:0);
- spec->n_lpadding = 0;
- spec->n_prefix = n_prefix;
- spec->n_decimal = has_decimal ? strlen(locale->decimal_point) : 0;
- spec->n_remainder = n_remainder;
- spec->n_spadding = 0;
- spec->n_rpadding = 0;
- spec->sign = '\0';
- spec->n_sign = 0;
-
- /* the output will look like:
- | |
- | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> |
- | |
-
- sign is computed from format->sign and the actual
- sign of the number
-
- prefix is given (it's for the '0x' prefix)
-
- digits is already known
-
- the total width is either given, or computed from the
- actual digits
-
- only one of lpadding, spadding, and rpadding can be non-zero,
- and it's calculated from the width and other fields
- */
-
- /* compute the various parts we're going to write */
- switch (format->sign) {
- case '+':
- /* always put a + or - */
- spec->n_sign = 1;
- spec->sign = (sign_char == '-' ? '-' : '+');
- break;
- case ' ':
- spec->n_sign = 1;
- spec->sign = (sign_char == '-' ? '-' : ' ');
- break;
- default:
- /* Not specified, or the default (-) */
- if (sign_char == '-') {
- spec->n_sign = 1;
- spec->sign = '-';
- }
- }
-
- /* The number of chars used for non-digits and non-padding. */
- n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal +
- spec->n_remainder;
-
- /* min_width can go negative, that's okay. format->width == -1 means
- we don't care. */
- if (format->fill_char == '0' && format->align == '=')
- spec->n_min_width = format->width - n_non_digit_non_padding;
- else
- spec->n_min_width = 0;
-
- if (spec->n_digits == 0)
- /* This case only occurs when using 'c' formatting, we need
- to special case it because the grouping code always wants
- to have at least one character. */
- spec->n_grouped_digits = 0;
- else
- spec->n_grouped_digits = STRINGLIB_GROUPING(NULL, 0, NULL,
- spec->n_digits,
- spec->n_min_width,
- locale->grouping,
- locale->thousands_sep);
-
- /* Given the desired width and the total of digit and non-digit
- space we consume, see if we need any padding. format->width can
- be negative (meaning no padding), but this code still works in
- that case. */
- n_padding = format->width -
- (n_non_digit_non_padding + spec->n_grouped_digits);
- if (n_padding > 0) {
- /* Some padding is needed. Determine if it's left, space, or right. */
- switch (format->align) {
- case '<':
- spec->n_rpadding = n_padding;
- break;
- case '^':
- spec->n_lpadding = n_padding / 2;
- spec->n_rpadding = n_padding - spec->n_lpadding;
- break;
- case '=':
- spec->n_spadding = n_padding;
- break;
- case '>':
- spec->n_lpadding = n_padding;
- break;
- default:
- /* Shouldn't get here, but treat it as '>' */
- spec->n_lpadding = n_padding;
- assert(0);
- break;
- }
- }
- return spec->n_lpadding + spec->n_sign + spec->n_prefix +
- spec->n_spadding + spec->n_grouped_digits + spec->n_decimal +
- spec->n_remainder + spec->n_rpadding;
-}
-
-/* Fill in the digit parts of a numbers's string representation,
- as determined in calc_number_widths().
- No error checking, since we know the buffer is the correct size. */
-static void
-fill_number(STRINGLIB_CHAR *buf, const NumberFieldWidths *spec,
- STRINGLIB_CHAR *digits, Py_ssize_t n_digits,
- STRINGLIB_CHAR *prefix, STRINGLIB_CHAR fill_char,
- LocaleInfo *locale, int toupper)
-{
- /* Used to keep track of digits, decimal, and remainder. */
- STRINGLIB_CHAR *p = digits;
-
-#ifndef NDEBUG
- Py_ssize_t r;
-#endif
-
- if (spec->n_lpadding) {
- STRINGLIB_FILL(buf, fill_char, spec->n_lpadding);
- buf += spec->n_lpadding;
- }
- if (spec->n_sign == 1) {
- *buf++ = spec->sign;
- }
- if (spec->n_prefix) {
- memmove(buf,
- prefix,
- spec->n_prefix * sizeof(STRINGLIB_CHAR));
- if (toupper) {
- Py_ssize_t t;
- for (t = 0; t < spec->n_prefix; ++t)
- buf[t] = STRINGLIB_TOUPPER(buf[t]);
- }
- buf += spec->n_prefix;
- }
- if (spec->n_spadding) {
- STRINGLIB_FILL(buf, fill_char, spec->n_spadding);
- buf += spec->n_spadding;
- }
-
- /* Only for type 'c' special case, it has no digits. */
- if (spec->n_digits != 0) {
- /* Fill the digits with InsertThousandsGrouping. */
-#ifndef NDEBUG
- r =
-#endif
- STRINGLIB_GROUPING(buf, spec->n_grouped_digits, digits,
- spec->n_digits, spec->n_min_width,
- locale->grouping, locale->thousands_sep);
-#ifndef NDEBUG
- assert(r == spec->n_grouped_digits);
-#endif
- p += spec->n_digits;
- }
- if (toupper) {
- Py_ssize_t t;
- for (t = 0; t < spec->n_grouped_digits; ++t)
- buf[t] = STRINGLIB_TOUPPER(buf[t]);
- }
- buf += spec->n_grouped_digits;
-
- if (spec->n_decimal) {
- Py_ssize_t t;
- for (t = 0; t < spec->n_decimal; ++t)
- buf[t] = locale->decimal_point[t];
- buf += spec->n_decimal;
- p += 1;
- }
-
- if (spec->n_remainder) {
- memcpy(buf, p, spec->n_remainder * sizeof(STRINGLIB_CHAR));
- buf += spec->n_remainder;
- p += spec->n_remainder;
- }
-
- if (spec->n_rpadding) {
- STRINGLIB_FILL(buf, fill_char, spec->n_rpadding);
- buf += spec->n_rpadding;
- }
-}
-
-static char no_grouping[1] = {CHAR_MAX};
-
-/* Find the decimal point character(s?), thousands_separator(s?), and
- grouping description, either for the current locale if type is
- LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or
- none if LT_NO_LOCALE. */
-static void
-get_locale_info(int type, LocaleInfo *locale_info)
-{
- switch (type) {
- case LT_CURRENT_LOCALE: {
- struct lconv *locale_data = localeconv();
- locale_info->decimal_point = locale_data->decimal_point;
- locale_info->thousands_sep = locale_data->thousands_sep;
- locale_info->grouping = locale_data->grouping;
- break;
- }
- case LT_DEFAULT_LOCALE:
- locale_info->decimal_point = ".";
- locale_info->thousands_sep = ",";
- locale_info->grouping = "\3"; /* Group every 3 characters. The
- (implicit) trailing 0 means repeat
- infinitely. */
- break;
- case LT_NO_LOCALE:
- locale_info->decimal_point = ".";
- locale_info->thousands_sep = "";
- locale_info->grouping = no_grouping;
- break;
- default:
- assert(0);
- }
-}
-
-#endif /* FORMAT_FLOAT || FORMAT_LONG || FORMAT_COMPLEX */
-
-/************************************************************************/
-/*********** string formatting ******************************************/
-/************************************************************************/
-
-static PyObject *
-format_string_internal(PyObject *value, const InternalFormatSpec *format)
-{
- Py_ssize_t lpad;
- Py_ssize_t rpad;
- Py_ssize_t total;
- STRINGLIB_CHAR *p;
- Py_ssize_t len = STRINGLIB_LEN(value);
- PyObject *result = NULL;
-
- /* sign is not allowed on strings */
- if (format->sign != '\0') {
- PyErr_SetString(PyExc_ValueError,
- "Sign not allowed in string format specifier");
- goto done;
- }
-
- /* alternate is not allowed on strings */
- if (format->alternate) {
- PyErr_SetString(PyExc_ValueError,
- "Alternate form (#) not allowed in string format "
- "specifier");
- goto done;
- }
-
- /* '=' alignment not allowed on strings */
- if (format->align == '=') {
- PyErr_SetString(PyExc_ValueError,
- "'=' alignment not allowed "
- "in string format specifier");
- goto done;
- }
-
- /* if precision is specified, output no more that format.precision
- characters */
- if (format->precision >= 0 && len >= format->precision) {
- len = format->precision;
- }
-
- calc_padding(len, format->width, format->align, &lpad, &rpad, &total);
-
- /* allocate the resulting string */
- result = STRINGLIB_NEW(NULL, total);
- if (result == NULL)
- goto done;
-
- /* Write into that space. First the padding. */
- p = fill_padding(STRINGLIB_STR(result), len,
- format->fill_char=='\0'?' ':format->fill_char,
- lpad, rpad);
-
- /* Then the source string. */
- memcpy(p, STRINGLIB_STR(value), len * sizeof(STRINGLIB_CHAR));
-
-done:
- return result;
-}
-
-
-/************************************************************************/
-/*********** long formatting ********************************************/
-/************************************************************************/
-
-#if defined FORMAT_LONG || defined FORMAT_INT
-typedef PyObject*
-(*IntOrLongToString)(PyObject *value, int base);
-
-static PyObject *
-format_int_or_long_internal(PyObject *value, const InternalFormatSpec *format,
- IntOrLongToString tostring)
-{
- PyObject *result = NULL;
- PyObject *tmp = NULL;
- STRINGLIB_CHAR *pnumeric_chars;
- STRINGLIB_CHAR numeric_char;
- STRINGLIB_CHAR sign_char = '\0';
- Py_ssize_t n_digits; /* count of digits need from the computed
- string */
- Py_ssize_t n_remainder = 0; /* Used only for 'c' formatting, which
- produces non-digits */
- Py_ssize_t n_prefix = 0; /* Count of prefix chars, (e.g., '0x') */
- Py_ssize_t n_total;
- STRINGLIB_CHAR *prefix = NULL;
- NumberFieldWidths spec;
- long x;
-
- /* Locale settings, either from the actual locale or
- from a hard-code pseudo-locale */
- LocaleInfo locale;
-
- /* no precision allowed on integers */
- if (format->precision != -1) {
- PyErr_SetString(PyExc_ValueError,
- "Precision not allowed in integer format specifier");
- goto done;
- }
-
- /* special case for character formatting */
- if (format->type == 'c') {
- /* error to specify a sign */
- if (format->sign != '\0') {
- PyErr_SetString(PyExc_ValueError,
- "Sign not allowed with integer"
- " format specifier 'c'");
- goto done;
- }
-
- /* taken from unicodeobject.c formatchar() */
- /* Integer input truncated to a character */
-/* XXX: won't work for int */
- x = PyLong_AsLong(value);
- if (x == -1 && PyErr_Occurred())
- goto done;
-#ifdef Py_UNICODE_WIDE
- if (x < 0 || x > 0x10ffff) {
- PyErr_SetString(PyExc_OverflowError,
- "%c arg not in range(0x110000) "
- "(wide Python build)");
- goto done;
- }
-#else
- if (x < 0 || x > 0xffff) {
- PyErr_SetString(PyExc_OverflowError,
- "%c arg not in range(0x10000) "
- "(narrow Python build)");
- goto done;
- }
-#endif
- numeric_char = (STRINGLIB_CHAR)x;
- pnumeric_chars = &numeric_char;
- n_digits = 1;
-
- /* As a sort-of hack, we tell calc_number_widths that we only
- have "remainder" characters. calc_number_widths thinks
- these are characters that don't get formatted, only copied
- into the output string. We do this for 'c' formatting,
- because the characters are likely to be non-digits. */
- n_remainder = 1;
- }
- else {
- int base;
- int leading_chars_to_skip = 0; /* Number of characters added by
- PyNumber_ToBase that we want to
- skip over. */
-
- /* Compute the base and how many characters will be added by
- PyNumber_ToBase */
- switch (format->type) {
- case 'b':
- base = 2;
- leading_chars_to_skip = 2; /* 0b */
- break;
- case 'o':
- base = 8;
- leading_chars_to_skip = 2; /* 0o */
- break;
- case 'x':
- case 'X':
- base = 16;
- leading_chars_to_skip = 2; /* 0x */
- break;
- default: /* shouldn't be needed, but stops a compiler warning */
- case 'd':
- case 'n':
- base = 10;
- break;
- }
-
- /* The number of prefix chars is the same as the leading
- chars to skip */
- if (format->alternate)
- n_prefix = leading_chars_to_skip;
-
- /* Do the hard part, converting to a string in a given base */
- tmp = tostring(value, base);
- if (tmp == NULL)
- goto done;
-
- pnumeric_chars = STRINGLIB_STR(tmp);
- n_digits = STRINGLIB_LEN(tmp);
-
- prefix = pnumeric_chars;
-
- /* Remember not to modify what pnumeric_chars points to. it
- might be interned. Only modify it after we copy it into a
- newly allocated output buffer. */
-
- /* Is a sign character present in the output? If so, remember it
- and skip it */
- if (pnumeric_chars[0] == '-') {
- sign_char = pnumeric_chars[0];
- ++prefix;
- ++leading_chars_to_skip;
- }
-
- /* Skip over the leading chars (0x, 0b, etc.) */
- n_digits -= leading_chars_to_skip;
- pnumeric_chars += leading_chars_to_skip;
- }
-
- /* Determine the grouping, separator, and decimal point, if any. */
- get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
- (format->thousands_separators ?
- LT_DEFAULT_LOCALE :
- LT_NO_LOCALE),
- &locale);
-
- /* Calculate how much memory we'll need. */
- n_total = calc_number_widths(&spec, n_prefix, sign_char, pnumeric_chars,
- n_digits, n_remainder, 0, &locale, format);
-
- /* Allocate the memory. */
- result = STRINGLIB_NEW(NULL, n_total);
- if (!result)
- goto done;
-
- /* Populate the memory. */
- fill_number(STRINGLIB_STR(result), &spec, pnumeric_chars, n_digits,
- prefix, format->fill_char == '\0' ? ' ' : format->fill_char,
- &locale, format->type == 'X');
-
-done:
- Py_XDECREF(tmp);
- return result;
-}
-#endif /* defined FORMAT_LONG || defined FORMAT_INT */
-
-/************************************************************************/
-/*********** float formatting *******************************************/
-/************************************************************************/
-
-#ifdef FORMAT_FLOAT
-#if STRINGLIB_IS_UNICODE
-static void
-strtounicode(Py_UNICODE *buffer, const char *charbuffer, Py_ssize_t len)
-{
- Py_ssize_t i;
- for (i = 0; i < len; ++i)
- buffer[i] = (Py_UNICODE)charbuffer[i];
-}
-#endif
-
-/* much of this is taken from unicodeobject.c */
-static PyObject *
-format_float_internal(PyObject *value,
- const InternalFormatSpec *format)
-{
- char *buf = NULL; /* buffer returned from PyOS_double_to_string */
- Py_ssize_t n_digits;
- Py_ssize_t n_remainder;
- Py_ssize_t n_total;
- int has_decimal;
- double val;
- Py_ssize_t precision = format->precision;
- Py_ssize_t default_precision = 6;
- STRINGLIB_CHAR type = format->type;
- int add_pct = 0;
- STRINGLIB_CHAR *p;
- NumberFieldWidths spec;
- int flags = 0;
- PyObject *result = NULL;
- STRINGLIB_CHAR sign_char = '\0';
- int float_type; /* Used to see if we have a nan, inf, or regular float. */
-
-#if STRINGLIB_IS_UNICODE
- Py_UNICODE *unicode_tmp = NULL;
-#endif
-
- /* Locale settings, either from the actual locale or
- from a hard-code pseudo-locale */
- LocaleInfo locale;
-
- if (format->alternate)
- flags |= Py_DTSF_ALT;
-
- if (type == '\0') {
- /* Omitted type specifier. Behaves in the same way as repr(x)
- and str(x) if no precision is given, else like 'g', but with
- at least one digit after the decimal point. */
- flags |= Py_DTSF_ADD_DOT_0;
- type = 'r';
- default_precision = 0;
- }
-
- if (type == 'n')
- /* 'n' is the same as 'g', except for the locale used to
- format the result. We take care of that later. */
- type = 'g';
-
- val = PyFloat_AsDouble(value);
- if (val == -1.0 && PyErr_Occurred())
- goto done;
-
- if (type == '%') {
- type = 'f';
- val *= 100;
- add_pct = 1;
- }
-
- if (precision < 0)
- precision = default_precision;
- else if (type == 'r')
- type = 'g';
-
- /* Cast "type", because if we're in unicode we need to pass a
- 8-bit char. This is safe, because we've restricted what "type"
- can be. */
- buf = PyOS_double_to_string(val, (char)type, precision, flags,
- &float_type);
- if (buf == NULL)
- goto done;
- n_digits = strlen(buf);
-
- if (add_pct) {
- /* We know that buf has a trailing zero (since we just called
- strlen() on it), and we don't use that fact any more. So we
- can just write over the trailing zero. */
- buf[n_digits] = '%';
- n_digits += 1;
- }
-
- /* Since there is no unicode version of PyOS_double_to_string,
- just use the 8 bit version and then convert to unicode. */
-#if STRINGLIB_IS_UNICODE
- unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_digits)*sizeof(Py_UNICODE));
- if (unicode_tmp == NULL) {
- PyErr_NoMemory();
- goto done;
- }
- strtounicode(unicode_tmp, buf, n_digits);
- p = unicode_tmp;
-#else
- p = buf;
-#endif
-
- /* Is a sign character present in the output? If so, remember it
- and skip it */
- if (*p == '-') {
- sign_char = *p;
- ++p;
- --n_digits;
- }
-
- /* Determine if we have any "remainder" (after the digits, might include
- decimal or exponent or both (or neither)) */
- parse_number(p, n_digits, &n_remainder, &has_decimal);
-
- /* Determine the grouping, separator, and decimal point, if any. */
- get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
- (format->thousands_separators ?
- LT_DEFAULT_LOCALE :
- LT_NO_LOCALE),
- &locale);
-
- /* Calculate how much memory we'll need. */
- n_total = calc_number_widths(&spec, 0, sign_char, p, n_digits,
- n_remainder, has_decimal, &locale, format);
-
- /* Allocate the memory. */
- result = STRINGLIB_NEW(NULL, n_total);
- if (result == NULL)
- goto done;
-
- /* Populate the memory. */
- fill_number(STRINGLIB_STR(result), &spec, p, n_digits, NULL,
- format->fill_char == '\0' ? ' ' : format->fill_char, &locale,
- 0);
-
-done:
- PyMem_Free(buf);
-#if STRINGLIB_IS_UNICODE
- PyMem_Free(unicode_tmp);
-#endif
- return result;
-}
-#endif /* FORMAT_FLOAT */
-
-/************************************************************************/
-/*********** complex formatting *****************************************/
-/************************************************************************/
-
-#ifdef FORMAT_COMPLEX
-
-static PyObject *
-format_complex_internal(PyObject *value,
- const InternalFormatSpec *format)
-{
- double re;
- double im;
- char *re_buf = NULL; /* buffer returned from PyOS_double_to_string */
- char *im_buf = NULL; /* buffer returned from PyOS_double_to_string */
-
- InternalFormatSpec tmp_format = *format;
- Py_ssize_t n_re_digits;
- Py_ssize_t n_im_digits;
- Py_ssize_t n_re_remainder;
- Py_ssize_t n_im_remainder;
- Py_ssize_t n_re_total;
- Py_ssize_t n_im_total;
- int re_has_decimal;
- int im_has_decimal;
- Py_ssize_t precision = format->precision;
- Py_ssize_t default_precision = 6;
- STRINGLIB_CHAR type = format->type;
- STRINGLIB_CHAR *p_re;
- STRINGLIB_CHAR *p_im;
- NumberFieldWidths re_spec;
- NumberFieldWidths im_spec;
- int flags = 0;
- PyObject *result = NULL;
- STRINGLIB_CHAR *p;
- STRINGLIB_CHAR re_sign_char = '\0';
- STRINGLIB_CHAR im_sign_char = '\0';
- int re_float_type; /* Used to see if we have a nan, inf, or regular float. */
- int im_float_type;
- int add_parens = 0;
- int skip_re = 0;
- Py_ssize_t lpad;
- Py_ssize_t rpad;
- Py_ssize_t total;
-
-#if STRINGLIB_IS_UNICODE
- Py_UNICODE *re_unicode_tmp = NULL;
- Py_UNICODE *im_unicode_tmp = NULL;
-#endif
-
- /* Locale settings, either from the actual locale or
- from a hard-code pseudo-locale */
- LocaleInfo locale;
-
- /* Zero padding is not allowed. */
- if (format->fill_char == '0') {
- PyErr_SetString(PyExc_ValueError,
- "Zero padding is not allowed in complex format "
- "specifier");
- goto done;
- }
-
- /* Neither is '=' alignment . */
- if (format->align == '=') {
- PyErr_SetString(PyExc_ValueError,
- "'=' alignment flag is not allowed in complex format "
- "specifier");
- goto done;
- }
-
- re = PyComplex_RealAsDouble(value);
- if (re == -1.0 && PyErr_Occurred())
- goto done;
- im = PyComplex_ImagAsDouble(value);
- if (im == -1.0 && PyErr_Occurred())
- goto done;
-
- if (format->alternate)
- flags |= Py_DTSF_ALT;
-
- if (type == '\0') {
- /* Omitted type specifier. Should be like str(self). */
- type = 'r';
- default_precision = 0;
- if (re == 0.0 && copysign(1.0, re) == 1.0)
- skip_re = 1;
- else
- add_parens = 1;
- }
-
- if (type == 'n')
- /* 'n' is the same as 'g', except for the locale used to
- format the result. We take care of that later. */
- type = 'g';
-
- if (precision < 0)
- precision = default_precision;
- else if (type == 'r')
- type = 'g';
-
- /* Cast "type", because if we're in unicode we need to pass a
- 8-bit char. This is safe, because we've restricted what "type"
- can be. */
- re_buf = PyOS_double_to_string(re, (char)type, precision, flags,
- &re_float_type);
- if (re_buf == NULL)
- goto done;
- im_buf = PyOS_double_to_string(im, (char)type, precision, flags,
- &im_float_type);
- if (im_buf == NULL)
- goto done;
-
- n_re_digits = strlen(re_buf);
- n_im_digits = strlen(im_buf);
-
- /* Since there is no unicode version of PyOS_double_to_string,
- just use the 8 bit version and then convert to unicode. */
-#if STRINGLIB_IS_UNICODE
- re_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_re_digits)*sizeof(Py_UNICODE));
- if (re_unicode_tmp == NULL) {
- PyErr_NoMemory();
- goto done;
- }
- strtounicode(re_unicode_tmp, re_buf, n_re_digits);
- p_re = re_unicode_tmp;
-
- im_unicode_tmp = (Py_UNICODE*)PyMem_Malloc((n_im_digits)*sizeof(Py_UNICODE));
- if (im_unicode_tmp == NULL) {
- PyErr_NoMemory();
- goto done;
- }
- strtounicode(im_unicode_tmp, im_buf, n_im_digits);
- p_im = im_unicode_tmp;
-#else
- p_re = re_buf;
- p_im = im_buf;
-#endif
-
- /* Is a sign character present in the output? If so, remember it
- and skip it */
- if (*p_re == '-') {
- re_sign_char = *p_re;
- ++p_re;
- --n_re_digits;
- }
- if (*p_im == '-') {
- im_sign_char = *p_im;
- ++p_im;
- --n_im_digits;
- }
-
- /* Determine if we have any "remainder" (after the digits, might include
- decimal or exponent or both (or neither)) */
- parse_number(p_re, n_re_digits, &n_re_remainder, &re_has_decimal);
- parse_number(p_im, n_im_digits, &n_im_remainder, &im_has_decimal);
-
- /* Determine the grouping, separator, and decimal point, if any. */
- get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
- (format->thousands_separators ?
- LT_DEFAULT_LOCALE :
- LT_NO_LOCALE),
- &locale);
-
- /* Turn off any padding. We'll do it later after we've composed
- the numbers without padding. */
- tmp_format.fill_char = '\0';
- tmp_format.align = '<';
- tmp_format.width = -1;
-
- /* Calculate how much memory we'll need. */
- n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, p_re,
- n_re_digits, n_re_remainder,
- re_has_decimal, &locale, &tmp_format);
-
- /* Same formatting, but always include a sign, unless the real part is
- * going to be omitted, in which case we use whatever sign convention was
- * requested by the original format. */
- if (!skip_re)
- tmp_format.sign = '+';
- n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, p_im,
- n_im_digits, n_im_remainder,
- im_has_decimal, &locale, &tmp_format);
-
- if (skip_re)
- n_re_total = 0;
-
- /* Add 1 for the 'j', and optionally 2 for parens. */
- calc_padding(n_re_total + n_im_total + 1 + add_parens * 2,
- format->width, format->align, &lpad, &rpad, &total);
-
- result = STRINGLIB_NEW(NULL, total);
- if (result == NULL)
- goto done;
-
- /* Populate the memory. First, the padding. */
- p = fill_padding(STRINGLIB_STR(result),
- n_re_total + n_im_total + 1 + add_parens * 2,
- format->fill_char=='\0' ? ' ' : format->fill_char,
- lpad, rpad);
-
- if (add_parens)
- *p++ = '(';
-
- if (!skip_re) {
- fill_number(p, &re_spec, p_re, n_re_digits, NULL, 0, &locale, 0);
- p += n_re_total;
- }
- fill_number(p, &im_spec, p_im, n_im_digits, NULL, 0, &locale, 0);
- p += n_im_total;
- *p++ = 'j';
-
- if (add_parens)
- *p++ = ')';
-
-done:
- PyMem_Free(re_buf);
- PyMem_Free(im_buf);
-#if STRINGLIB_IS_UNICODE
- PyMem_Free(re_unicode_tmp);
- PyMem_Free(im_unicode_tmp);
-#endif
- return result;
-}
-#endif /* FORMAT_COMPLEX */
-
-/************************************************************************/
-/*********** built in formatters ****************************************/
-/************************************************************************/
-PyObject *
-FORMAT_STRING(PyObject *obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len)
-{
- InternalFormatSpec format;
- PyObject *result = NULL;
-
- /* check for the special case of zero length format spec, make
- it equivalent to str(obj) */
- if (format_spec_len == 0) {
- result = STRINGLIB_TOSTR(obj);
- goto done;
- }
-
- /* parse the format_spec */
- if (!parse_internal_render_format_spec(format_spec, format_spec_len,
- &format, 's', '<'))
- goto done;
-
- /* type conversion? */
- switch (format.type) {
- case 's':
- /* no type conversion needed, already a string. do the formatting */
- result = format_string_internal(obj, &format);
- break;
- default:
- /* unknown */
- unknown_presentation_type(format.type, obj->ob_type->tp_name);
- goto done;
- }
-
-done:
- return result;
-}
-
-#if defined FORMAT_LONG || defined FORMAT_INT
-static PyObject*
-format_int_or_long(PyObject* obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len,
- IntOrLongToString tostring)
-{
- PyObject *result = NULL;
- PyObject *tmp = NULL;
- InternalFormatSpec format;
-
- /* check for the special case of zero length format spec, make
- it equivalent to str(obj) */
- if (format_spec_len == 0) {
- result = STRINGLIB_TOSTR(obj);
- goto done;
- }
-
- /* parse the format_spec */
- if (!parse_internal_render_format_spec(format_spec,
- format_spec_len,
- &format, 'd', '>'))
- goto done;
-
- /* type conversion? */
- switch (format.type) {
- case 'b':
- case 'c':
- case 'd':
- case 'o':
- case 'x':
- case 'X':
- case 'n':
- /* no type conversion needed, already an int (or long). do
- the formatting */
- result = format_int_or_long_internal(obj, &format, tostring);
- break;
-
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- case '%':
- /* convert to float */
- tmp = PyNumber_Float(obj);
- if (tmp == NULL)
- goto done;
- result = format_float_internal(tmp, &format);
- break;
-
- default:
- /* unknown */
- unknown_presentation_type(format.type, obj->ob_type->tp_name);
- goto done;
- }
-
-done:
- Py_XDECREF(tmp);
- return result;
-}
-#endif /* FORMAT_LONG || defined FORMAT_INT */
-
-#ifdef FORMAT_LONG
-/* Need to define long_format as a function that will convert a long
- to a string. In 3.0, _PyLong_Format has the correct signature. In
- 2.x, we need to fudge a few parameters */
-#if PY_VERSION_HEX >= 0x03000000
-#define long_format _PyLong_Format
-#else
-static PyObject*
-long_format(PyObject* value, int base)
-{
- /* Convert to base, don't add trailing 'L', and use the new octal
- format. We already know this is a long object */
- assert(PyLong_Check(value));
- /* convert to base, don't add 'L', and use the new octal format */
- return _PyLong_Format(value, base, 0, 1);
-}
-#endif
-
-PyObject *
-FORMAT_LONG(PyObject *obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len)
-{
- return format_int_or_long(obj, format_spec, format_spec_len,
- long_format);
-}
-#endif /* FORMAT_LONG */
-
-#ifdef FORMAT_INT
-/* this is only used for 2.x, not 3.0 */
-static PyObject*
-int_format(PyObject* value, int base)
-{
- /* Convert to base, and use the new octal format. We already
- know this is an int object */
- assert(PyInt_Check(value));
- return _PyInt_Format((PyIntObject*)value, base, 1);
-}
-
-PyObject *
-FORMAT_INT(PyObject *obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len)
-{
- return format_int_or_long(obj, format_spec, format_spec_len,
- int_format);
-}
-#endif /* FORMAT_INT */
-
-#ifdef FORMAT_FLOAT
-PyObject *
-FORMAT_FLOAT(PyObject *obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len)
-{
- PyObject *result = NULL;
- InternalFormatSpec format;
-
- /* check for the special case of zero length format spec, make
- it equivalent to str(obj) */
- if (format_spec_len == 0) {
- result = STRINGLIB_TOSTR(obj);
- goto done;
- }
-
- /* parse the format_spec */
- if (!parse_internal_render_format_spec(format_spec,
- format_spec_len,
- &format, '\0', '>'))
- goto done;
-
- /* type conversion? */
- switch (format.type) {
- case '\0': /* No format code: like 'g', but with at least one decimal. */
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- case 'n':
- case '%':
- /* no conversion, already a float. do the formatting */
- result = format_float_internal(obj, &format);
- break;
-
- default:
- /* unknown */
- unknown_presentation_type(format.type, obj->ob_type->tp_name);
- goto done;
- }
-
-done:
- return result;
-}
-#endif /* FORMAT_FLOAT */
-
-#ifdef FORMAT_COMPLEX
-PyObject *
-FORMAT_COMPLEX(PyObject *obj,
- STRINGLIB_CHAR *format_spec,
- Py_ssize_t format_spec_len)
-{
- PyObject *result = NULL;
- InternalFormatSpec format;
-
- /* check for the special case of zero length format spec, make
- it equivalent to str(obj) */
- if (format_spec_len == 0) {
- result = STRINGLIB_TOSTR(obj);
- goto done;
- }
-
- /* parse the format_spec */
- if (!parse_internal_render_format_spec(format_spec,
- format_spec_len,
- &format, '\0', '>'))
- goto done;
-
- /* type conversion? */
- switch (format.type) {
- case '\0': /* No format code: like 'g', but with at least one decimal. */
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- case 'n':
- /* no conversion, already a complex. do the formatting */
- result = format_complex_internal(obj, &format);
- break;
-
- default:
- /* unknown */
- unknown_presentation_type(format.type, obj->ob_type->tp_name);
- goto done;
- }
-
-done:
- return result;
-}
-#endif /* FORMAT_COMPLEX */
diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h
index f548133..6e2f073 100644
--- a/Objects/stringlib/localeutil.h
+++ b/Objects/stringlib/localeutil.h
@@ -1,21 +1,19 @@
/* stringlib: locale related helpers implementation */
-#ifndef STRINGLIB_LOCALEUTIL_H
-#define STRINGLIB_LOCALEUTIL_H
-
#include <locale.h>
-#define MAX(x, y) ((x) < (y) ? (y) : (x))
-#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#ifndef STRINGLIB_IS_UNICODE
+# error "localeutil is specific to Unicode"
+#endif
typedef struct {
const char *grouping;
char previous;
Py_ssize_t i; /* Where we're currently pointing in grouping. */
-} GroupGenerator;
+} STRINGLIB(GroupGenerator);
static void
-_GroupGenerator_init(GroupGenerator *self, const char *grouping)
+STRINGLIB(GroupGenerator_init)(STRINGLIB(GroupGenerator) *self, const char *grouping)
{
self->grouping = grouping;
self->i = 0;
@@ -24,7 +22,7 @@ _GroupGenerator_init(GroupGenerator *self, const char *grouping)
/* Returns the next grouping, or 0 to signify end. */
static Py_ssize_t
-_GroupGenerator_next(GroupGenerator *self)
+STRINGLIB(GroupGenerator_next)(STRINGLIB(GroupGenerator) *self)
{
/* Note that we don't really do much error checking here. If a
grouping string contains just CHAR_MAX, for example, then just
@@ -48,27 +46,18 @@ _GroupGenerator_next(GroupGenerator *self)
/* Fill in some digits, leading zeros, and thousands separator. All
are optional, depending on when we're called. */
static void
-fill(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end,
- Py_ssize_t n_chars, Py_ssize_t n_zeros, const char* thousands_sep,
+STRINGLIB(fill)(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end,
+ Py_ssize_t n_chars, Py_ssize_t n_zeros, STRINGLIB_CHAR* thousands_sep,
Py_ssize_t thousands_sep_len)
{
-#if STRINGLIB_IS_UNICODE
Py_ssize_t i;
-#endif
if (thousands_sep) {
*buffer_end -= thousands_sep_len;
/* Copy the thousands_sep chars into the buffer. */
-#if STRINGLIB_IS_UNICODE
- /* Convert from the char's of the thousands_sep from
- the locale into unicode. */
- for (i = 0; i < thousands_sep_len; ++i)
- (*buffer_end)[i] = thousands_sep[i];
-#else
- /* No conversion, just memcpy the thousands_sep. */
- memcpy(*buffer_end, thousands_sep, thousands_sep_len);
-#endif
+ memcpy(*buffer_end, thousands_sep,
+ thousands_sep_len * STRINGLIB_SIZEOF_CHAR);
}
*buffer_end -= n_chars;
@@ -76,11 +65,12 @@ fill(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end,
memcpy(*buffer_end, *digits_end, n_chars * sizeof(STRINGLIB_CHAR));
*buffer_end -= n_zeros;
- STRINGLIB_FILL(*buffer_end, '0', n_zeros);
+ for (i = 0; i < n_zeros; i++)
+ (*buffer_end)[i] = '0';
}
/**
- * _Py_InsertThousandsGrouping:
+ * InsertThousandsGrouping:
* @buffer: A pointer to the start of a string.
* @n_buffer: Number of characters in @buffer.
* @digits: A pointer to the digits we're reading from. If count
@@ -109,14 +99,16 @@ fill(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end,
* As closely as possible, this code mimics the logic in decimal.py's
_insert_thousands_sep().
**/
-Py_ssize_t
-_Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,
- Py_ssize_t n_buffer,
- STRINGLIB_CHAR *digits,
- Py_ssize_t n_digits,
- Py_ssize_t min_width,
- const char *grouping,
- const char *thousands_sep)
+static Py_ssize_t
+STRINGLIB(InsertThousandsGrouping)(
+ STRINGLIB_CHAR *buffer,
+ Py_ssize_t n_buffer,
+ STRINGLIB_CHAR *digits,
+ Py_ssize_t n_digits,
+ Py_ssize_t min_width,
+ const char *grouping,
+ STRINGLIB_CHAR *thousands_sep,
+ Py_ssize_t thousands_sep_len)
{
Py_ssize_t count = 0;
Py_ssize_t n_zeros;
@@ -128,23 +120,22 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,
STRINGLIB_CHAR *digits_end = NULL;
Py_ssize_t l;
Py_ssize_t n_chars;
- Py_ssize_t thousands_sep_len = strlen(thousands_sep);
Py_ssize_t remaining = n_digits; /* Number of chars remaining to
be looked at */
/* A generator that returns all of the grouping widths, until it
returns 0. */
- GroupGenerator groupgen;
- _GroupGenerator_init(&groupgen, grouping);
+ STRINGLIB(GroupGenerator) groupgen;
+ STRINGLIB(GroupGenerator_init)(&groupgen, grouping);
if (buffer) {
buffer_end = buffer + n_buffer;
digits_end = digits + n_digits;
}
- while ((l = _GroupGenerator_next(&groupgen)) > 0) {
- l = MIN(l, MAX(MAX(remaining, min_width), 1));
- n_zeros = MAX(0, l - remaining);
- n_chars = MAX(0, MIN(remaining, l));
+ while ((l = STRINGLIB(GroupGenerator_next)(&groupgen)) > 0) {
+ l = Py_MIN(l, Py_MAX(Py_MAX(remaining, min_width), 1));
+ n_zeros = Py_MAX(0, l - remaining);
+ n_chars = Py_MAX(0, Py_MIN(remaining, l));
/* Use n_zero zero's and n_chars chars */
@@ -153,7 +144,7 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,
if (buffer) {
/* Copy into the output buffer. */
- fill(&digits_end, &buffer_end, n_chars, n_zeros,
+ STRINGLIB(fill)(&digits_end, &buffer_end, n_chars, n_zeros,
use_separator ? thousands_sep : NULL, thousands_sep_len);
}
@@ -172,41 +163,18 @@ _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,
if (!loop_broken) {
/* We left the loop without using a break statement. */
- l = MAX(MAX(remaining, min_width), 1);
- n_zeros = MAX(0, l - remaining);
- n_chars = MAX(0, MIN(remaining, l));
+ l = Py_MAX(Py_MAX(remaining, min_width), 1);
+ n_zeros = Py_MAX(0, l - remaining);
+ n_chars = Py_MAX(0, Py_MIN(remaining, l));
/* Use n_zero zero's and n_chars chars */
count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars;
if (buffer) {
/* Copy into the output buffer. */
- fill(&digits_end, &buffer_end, n_chars, n_zeros,
+ STRINGLIB(fill)(&digits_end, &buffer_end, n_chars, n_zeros,
use_separator ? thousands_sep : NULL, thousands_sep_len);
}
}
return count;
}
-/**
- * _Py_InsertThousandsGroupingLocale:
- * @buffer: A pointer to the start of a string.
- * @n_digits: The number of digits in the string, in which we want
- * to put the grouping chars.
- *
- * Reads thee current locale and calls _Py_InsertThousandsGrouping().
- **/
-Py_ssize_t
-_Py_InsertThousandsGroupingLocale(STRINGLIB_CHAR *buffer,
- Py_ssize_t n_buffer,
- STRINGLIB_CHAR *digits,
- Py_ssize_t n_digits,
- Py_ssize_t min_width)
-{
- struct lconv *locale_data = localeconv();
- const char *grouping = locale_data->grouping;
- const char *thousands_sep = locale_data->thousands_sep;
-
- return _Py_InsertThousandsGrouping(buffer, n_buffer, digits, n_digits,
- min_width, grouping, thousands_sep);
-}
-#endif /* STRINGLIB_LOCALEUTIL_H */
diff --git a/Objects/stringlib/partition.h b/Objects/stringlib/partition.h
index 0170bdd..40cb512 100644
--- a/Objects/stringlib/partition.h
+++ b/Objects/stringlib/partition.h
@@ -1,14 +1,11 @@
/* stringlib: partition implementation */
-#ifndef STRINGLIB_PARTITION_H
-#define STRINGLIB_PARTITION_H
-
#ifndef STRINGLIB_FASTSEARCH_H
#error must include "stringlib/fastsearch.h" before including this module
#endif
Py_LOCAL_INLINE(PyObject*)
-stringlib_partition(PyObject* str_obj,
+STRINGLIB(partition)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
PyObject* sep_obj,
const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
@@ -25,7 +22,7 @@ stringlib_partition(PyObject* str_obj,
if (!out)
return NULL;
- pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_SEARCH);
+ pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_SEARCH);
if (pos < 0) {
#if STRINGLIB_MUTABLE
@@ -58,7 +55,7 @@ stringlib_partition(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject*)
-stringlib_rpartition(PyObject* str_obj,
+STRINGLIB(rpartition)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
PyObject* sep_obj,
const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
@@ -75,7 +72,7 @@ stringlib_rpartition(PyObject* str_obj,
if (!out)
return NULL;
- pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
+ pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
if (pos < 0) {
#if STRINGLIB_MUTABLE
@@ -107,4 +104,3 @@ stringlib_rpartition(PyObject* str_obj,
return out;
}
-#endif
diff --git a/Objects/stringlib/split.h b/Objects/stringlib/split.h
index 60e7767..947dd28 100644
--- a/Objects/stringlib/split.h
+++ b/Objects/stringlib/split.h
@@ -1,8 +1,5 @@
/* stringlib: split implementation */
-#ifndef STRINGLIB_SPLIT_H
-#define STRINGLIB_SPLIT_H
-
#ifndef STRINGLIB_FASTSEARCH_H
#error must include "stringlib/fastsearch.h" before including this module
#endif
@@ -54,7 +51,7 @@
#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count
Py_LOCAL_INLINE(PyObject *)
-stringlib_split_whitespace(PyObject* str_obj,
+STRINGLIB(split_whitespace)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
Py_ssize_t maxcount)
{
@@ -102,7 +99,7 @@ stringlib_split_whitespace(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_split_char(PyObject* str_obj,
+STRINGLIB(split_char)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR ch,
Py_ssize_t maxcount)
@@ -145,7 +142,7 @@ stringlib_split_char(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_split(PyObject* str_obj,
+STRINGLIB(split)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sep, Py_ssize_t sep_len,
Py_ssize_t maxcount)
@@ -158,7 +155,7 @@ stringlib_split(PyObject* str_obj,
return NULL;
}
else if (sep_len == 1)
- return stringlib_split_char(str_obj, str, str_len, sep[0], maxcount);
+ return STRINGLIB(split_char)(str_obj, str, str_len, sep[0], maxcount);
list = PyList_New(PREALLOC_SIZE(maxcount));
if (list == NULL)
@@ -166,7 +163,7 @@ stringlib_split(PyObject* str_obj,
i = j = 0;
while (maxcount-- > 0) {
- pos = fastsearch(str+i, str_len-i, sep, sep_len, -1, FAST_SEARCH);
+ pos = FASTSEARCH(str+i, str_len-i, sep, sep_len, -1, FAST_SEARCH);
if (pos < 0)
break;
j = i + pos;
@@ -193,7 +190,7 @@ stringlib_split(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_rsplit_whitespace(PyObject* str_obj,
+STRINGLIB(rsplit_whitespace)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
Py_ssize_t maxcount)
{
@@ -243,7 +240,7 @@ stringlib_rsplit_whitespace(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_rsplit_char(PyObject* str_obj,
+STRINGLIB(rsplit_char)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR ch,
Py_ssize_t maxcount)
@@ -287,7 +284,7 @@ stringlib_rsplit_char(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_rsplit(PyObject* str_obj,
+STRINGLIB(rsplit)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sep, Py_ssize_t sep_len,
Py_ssize_t maxcount)
@@ -300,7 +297,7 @@ stringlib_rsplit(PyObject* str_obj,
return NULL;
}
else if (sep_len == 1)
- return stringlib_rsplit_char(str_obj, str, str_len, sep[0], maxcount);
+ return STRINGLIB(rsplit_char)(str_obj, str, str_len, sep[0], maxcount);
list = PyList_New(PREALLOC_SIZE(maxcount));
if (list == NULL)
@@ -308,7 +305,7 @@ stringlib_rsplit(PyObject* str_obj,
j = str_len;
while (maxcount-- > 0) {
- pos = fastsearch(str, j, sep, sep_len, -1, FAST_RSEARCH);
+ pos = FASTSEARCH(str, j, sep, sep_len, -1, FAST_RSEARCH);
if (pos < 0)
break;
SPLIT_ADD(str, pos + sep_len, j);
@@ -336,7 +333,7 @@ stringlib_rsplit(PyObject* str_obj,
}
Py_LOCAL_INLINE(PyObject *)
-stringlib_splitlines(PyObject* str_obj,
+STRINGLIB(splitlines)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
int keepends)
{
@@ -391,4 +388,3 @@ stringlib_splitlines(PyObject* str_obj,
return NULL;
}
-#endif
diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h
index 1c49426..7bb91a7 100644
--- a/Objects/stringlib/stringdefs.h
+++ b/Objects/stringlib/stringdefs.h
@@ -6,7 +6,10 @@
compiled as unicode. */
#define STRINGLIB_IS_UNICODE 0
+#define FASTSEARCH fastsearch
+#define STRINGLIB(F) stringlib_##F
#define STRINGLIB_OBJECT PyBytesObject
+#define STRINGLIB_SIZEOF_CHAR 1
#define STRINGLIB_CHAR char
#define STRINGLIB_TYPE_NAME "string"
#define STRINGLIB_PARSE_CODE "S"
@@ -15,9 +18,6 @@
#define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r'))
#define STRINGLIB_ISDECIMAL(x) ((x >= '0') && (x <= '9'))
#define STRINGLIB_TODECIMAL(x) (STRINGLIB_ISDECIMAL(x) ? (x - '0') : -1)
-#define STRINGLIB_TOUPPER Py_TOUPPER
-#define STRINGLIB_TOLOWER Py_TOLOWER
-#define STRINGLIB_FILL memset
#define STRINGLIB_STR PyBytes_AS_STRING
#define STRINGLIB_LEN PyBytes_GET_SIZE
#define STRINGLIB_NEW PyBytes_FromStringAndSize
@@ -25,7 +25,5 @@
#define STRINGLIB_CHECK PyBytes_Check
#define STRINGLIB_CHECK_EXACT PyBytes_CheckExact
#define STRINGLIB_TOSTR PyObject_Str
-#define STRINGLIB_GROUPING _PyBytes_InsertThousandsGrouping
-#define STRINGLIB_GROUPING_LOCALE _PyBytes_InsertThousandsGroupingLocale
#define STRINGLIB_TOASCII PyObject_Repr
#endif /* !STRINGLIB_STRINGDEFS_H */
diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h
new file mode 100644
index 0000000..e8c6fcb
--- /dev/null
+++ b/Objects/stringlib/ucs1lib.h
@@ -0,0 +1,31 @@
+/* this is sort of a hack. there's at least one place (formatting
+ floats) where some stringlib code takes a different path if it's
+ compiled as unicode. */
+#define STRINGLIB_IS_UNICODE 1
+
+#define FASTSEARCH ucs1lib_fastsearch
+#define STRINGLIB(F) ucs1lib_##F
+#define STRINGLIB_OBJECT PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR 1
+#define STRINGLIB_MAX_CHAR 0xFFu
+#define STRINGLIB_CHAR Py_UCS1
+#define STRINGLIB_TYPE_NAME "unicode"
+#define STRINGLIB_PARSE_CODE "U"
+#define STRINGLIB_EMPTY unicode_empty
+#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE
+#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK
+#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL
+#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL
+#define STRINGLIB_STR PyUnicode_1BYTE_DATA
+#define STRINGLIB_LEN PyUnicode_GET_LENGTH
+#define STRINGLIB_NEW _PyUnicode_FromUCS1
+#define STRINGLIB_RESIZE not_supported
+#define STRINGLIB_CHECK PyUnicode_Check
+#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
+
+#define STRINGLIB_TOSTR PyObject_Str
+#define STRINGLIB_TOASCII PyObject_ASCII
+
+#define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping
+
+
diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h
new file mode 100644
index 0000000..45e5729
--- /dev/null
+++ b/Objects/stringlib/ucs2lib.h
@@ -0,0 +1,30 @@
+/* this is sort of a hack. there's at least one place (formatting
+ floats) where some stringlib code takes a different path if it's
+ compiled as unicode. */
+#define STRINGLIB_IS_UNICODE 1
+
+#define FASTSEARCH ucs2lib_fastsearch
+#define STRINGLIB(F) ucs2lib_##F
+#define STRINGLIB_OBJECT PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR 2
+#define STRINGLIB_MAX_CHAR 0xFFFFu
+#define STRINGLIB_CHAR Py_UCS2
+#define STRINGLIB_TYPE_NAME "unicode"
+#define STRINGLIB_PARSE_CODE "U"
+#define STRINGLIB_EMPTY unicode_empty
+#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE
+#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK
+#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL
+#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL
+#define STRINGLIB_STR PyUnicode_2BYTE_DATA
+#define STRINGLIB_LEN PyUnicode_GET_LENGTH
+#define STRINGLIB_NEW _PyUnicode_FromUCS2
+#define STRINGLIB_RESIZE not_supported
+#define STRINGLIB_CHECK PyUnicode_Check
+#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
+
+#define STRINGLIB_TOSTR PyObject_Str
+#define STRINGLIB_TOASCII PyObject_ASCII
+
+#define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping
+
diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h
new file mode 100644
index 0000000..647a27e
--- /dev/null
+++ b/Objects/stringlib/ucs4lib.h
@@ -0,0 +1,30 @@
+/* this is sort of a hack. there's at least one place (formatting
+ floats) where some stringlib code takes a different path if it's
+ compiled as unicode. */
+#define STRINGLIB_IS_UNICODE 1
+
+#define FASTSEARCH ucs4lib_fastsearch
+#define STRINGLIB(F) ucs4lib_##F
+#define STRINGLIB_OBJECT PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR 4
+#define STRINGLIB_MAX_CHAR 0x10FFFFu
+#define STRINGLIB_CHAR Py_UCS4
+#define STRINGLIB_TYPE_NAME "unicode"
+#define STRINGLIB_PARSE_CODE "U"
+#define STRINGLIB_EMPTY unicode_empty
+#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE
+#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK
+#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL
+#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL
+#define STRINGLIB_STR PyUnicode_4BYTE_DATA
+#define STRINGLIB_LEN PyUnicode_GET_LENGTH
+#define STRINGLIB_NEW _PyUnicode_FromUCS4
+#define STRINGLIB_RESIZE not_supported
+#define STRINGLIB_CHECK PyUnicode_Check
+#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
+
+#define STRINGLIB_TOSTR PyObject_Str
+#define STRINGLIB_TOASCII PyObject_ASCII
+
+#define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping
+
diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h
new file mode 100644
index 0000000..03117ec
--- /dev/null
+++ b/Objects/stringlib/undef.h
@@ -0,0 +1,12 @@
+#undef FASTSEARCH
+#undef STRINGLIB
+#undef STRINGLIB_SIZEOF_CHAR
+#undef STRINGLIB_MAX_CHAR
+#undef STRINGLIB_CHAR
+#undef STRINGLIB_STR
+#undef STRINGLIB_LEN
+#undef STRINGLIB_NEW
+#undef STRINGLIB_RESIZE
+#undef _Py_InsertThousandsGrouping
+#undef STRINGLIB_IS_UNICODE
+
diff --git a/Objects/stringlib/string_format.h b/Objects/stringlib/unicode_format.h
index c46bdc2..be580c6 100644
--- a/Objects/stringlib/string_format.h
+++ b/Objects/stringlib/unicode_format.h
@@ -1,16 +1,7 @@
/*
- string_format.h -- implementation of string.format().
-
- It uses the Objects/stringlib conventions, so that it can be
- compiled for both unicode and string objects.
+ unicode_format.h -- implementation of str.format().
*/
-
-/* Defines for Python 2.6 compatibility */
-#if PY_VERSION_HEX < 0x03000000
-#define PyLong_FromSsize_t _PyLong_FromSsize_t
-#endif
-
/* Defines for more efficiently reallocating the string buffer */
#define INITIAL_SIZE_INCREMENT 100
#define SIZE_MULTIPLIER 2
@@ -26,8 +17,8 @@
unicode pointers.
*/
typedef struct {
- STRINGLIB_CHAR *ptr;
- STRINGLIB_CHAR *end;
+ PyObject *str; /* borrowed reference */
+ Py_ssize_t start, end;
} SubString;
@@ -64,34 +55,32 @@ AutoNumber_Init(AutoNumber *auto_number)
/* fill in a SubString from a pointer and length */
Py_LOCAL_INLINE(void)
-SubString_init(SubString *str, STRINGLIB_CHAR *p, Py_ssize_t len)
+SubString_init(SubString *str, PyObject *s, Py_ssize_t start, Py_ssize_t end)
{
- str->ptr = p;
- if (p == NULL)
- str->end = NULL;
- else
- str->end = str->ptr + len;
+ str->str = s;
+ str->start = start;
+ str->end = end;
}
-/* return a new string. if str->ptr is NULL, return None */
+/* return a new string. if str->str is NULL, return None */
Py_LOCAL_INLINE(PyObject *)
SubString_new_object(SubString *str)
{
- if (str->ptr == NULL) {
+ if (str->str == NULL) {
Py_INCREF(Py_None);
return Py_None;
}
- return STRINGLIB_NEW(str->ptr, str->end - str->ptr);
+ return PyUnicode_Substring(str->str, str->start, str->end);
}
-/* return a new string. if str->ptr is NULL, return None */
+/* return a new string. if str->str is NULL, return None */
Py_LOCAL_INLINE(PyObject *)
SubString_new_object_or_empty(SubString *str)
{
- if (str->ptr == NULL) {
- return STRINGLIB_NEW(NULL, 0);
+ if (str->str == NULL) {
+ return PyUnicode_New(0, 0);
}
- return STRINGLIB_NEW(str->ptr, str->end - str->ptr);
+ return SubString_new_object(str);
}
/* Return 1 if an error has been detected switching between automatic
@@ -121,74 +110,6 @@ autonumber_state_error(AutoNumberState state, int field_name_is_empty)
/************************************************************************/
-/*********** Output string management functions ****************/
-/************************************************************************/
-
-typedef struct {
- STRINGLIB_CHAR *ptr;
- STRINGLIB_CHAR *end;
- PyObject *obj;
- Py_ssize_t size_increment;
-} OutputString;
-
-/* initialize an OutputString object, reserving size characters */
-static int
-output_initialize(OutputString *output, Py_ssize_t size)
-{
- output->obj = STRINGLIB_NEW(NULL, size);
- if (output->obj == NULL)
- return 0;
-
- output->ptr = STRINGLIB_STR(output->obj);
- output->end = STRINGLIB_LEN(output->obj) + output->ptr;
- output->size_increment = INITIAL_SIZE_INCREMENT;
-
- return 1;
-}
-
-/*
- output_extend reallocates the output string buffer.
- It returns a status: 0 for a failed reallocation,
- 1 for success.
-*/
-
-static int
-output_extend(OutputString *output, Py_ssize_t count)
-{
- STRINGLIB_CHAR *startptr = STRINGLIB_STR(output->obj);
- Py_ssize_t curlen = output->ptr - startptr;
- Py_ssize_t maxlen = curlen + count + output->size_increment;
-
- if (STRINGLIB_RESIZE(&output->obj, maxlen) < 0)
- return 0;
- startptr = STRINGLIB_STR(output->obj);
- output->ptr = startptr + curlen;
- output->end = startptr + maxlen;
- if (output->size_increment < MAX_SIZE_INCREMENT)
- output->size_increment *= SIZE_MULTIPLIER;
- return 1;
-}
-
-/*
- output_data dumps characters into our output string
- buffer.
-
- In some cases, it has to reallocate the string.
-
- It returns a status: 0 for a failed reallocation,
- 1 for success.
-*/
-static int
-output_data(OutputString *output, const STRINGLIB_CHAR *s, Py_ssize_t count)
-{
- if ((count > output->end - output->ptr) && !output_extend(output, count))
- return 0;
- memcpy(output->ptr, s, count * sizeof(STRINGLIB_CHAR));
- output->ptr += count;
- return 1;
-}
-
-/************************************************************************/
/*********** Format string parsing -- integers and identifiers *********/
/************************************************************************/
@@ -197,14 +118,14 @@ get_integer(const SubString *str)
{
Py_ssize_t accumulator = 0;
Py_ssize_t digitval;
- STRINGLIB_CHAR *p;
+ Py_ssize_t i;
/* empty string is an error */
- if (str->ptr >= str->end)
+ if (str->start >= str->end)
return -1;
- for (p = str->ptr; p < str->end; p++) {
- digitval = STRINGLIB_TODECIMAL(*p);
+ for (i = str->start; i < str->end; i++) {
+ digitval = Py_UNICODE_TODECIMAL(PyUnicode_READ_CHAR(str->str, i));
if (digitval < 0)
return -1;
/*
@@ -279,34 +200,36 @@ typedef struct {
lifetime of the iterator. can be empty */
SubString str;
- /* pointer to where we are inside field_name */
- STRINGLIB_CHAR *ptr;
+ /* index to where we are inside field_name */
+ Py_ssize_t index;
} FieldNameIterator;
static int
-FieldNameIterator_init(FieldNameIterator *self, STRINGLIB_CHAR *ptr,
- Py_ssize_t len)
+FieldNameIterator_init(FieldNameIterator *self, PyObject *s,
+ Py_ssize_t start, Py_ssize_t end)
{
- SubString_init(&self->str, ptr, len);
- self->ptr = self->str.ptr;
+ SubString_init(&self->str, s, start, end);
+ self->index = start;
return 1;
}
static int
_FieldNameIterator_attr(FieldNameIterator *self, SubString *name)
{
- STRINGLIB_CHAR c;
+ Py_UCS4 c;
- name->ptr = self->ptr;
+ name->str = self->str.str;
+ name->start = self->index;
/* return everything until '.' or '[' */
- while (self->ptr < self->str.end) {
- switch (c = *self->ptr++) {
+ while (self->index < self->str.end) {
+ c = PyUnicode_READ_CHAR(self->str.str, self->index++);
+ switch (c) {
case '[':
case '.':
/* backup so that we this character will be seen next time */
- self->ptr--;
+ self->index--;
break;
default:
continue;
@@ -314,7 +237,7 @@ _FieldNameIterator_attr(FieldNameIterator *self, SubString *name)
break;
}
/* end of string is okay */
- name->end = self->ptr;
+ name->end = self->index;
return 1;
}
@@ -322,13 +245,15 @@ static int
_FieldNameIterator_item(FieldNameIterator *self, SubString *name)
{
int bracket_seen = 0;
- STRINGLIB_CHAR c;
+ Py_UCS4 c;
- name->ptr = self->ptr;
+ name->str = self->str.str;
+ name->start = self->index;
/* return everything until ']' */
- while (self->ptr < self->str.end) {
- switch (c = *self->ptr++) {
+ while (self->index < self->str.end) {
+ c = PyUnicode_READ_CHAR(self->str.str, self->index++);
+ switch (c) {
case ']':
bracket_seen = 1;
break;
@@ -345,7 +270,7 @@ _FieldNameIterator_item(FieldNameIterator *self, SubString *name)
/* end of string is okay */
/* don't include the ']' */
- name->end = self->ptr-1;
+ name->end = self->index-1;
return 1;
}
@@ -355,10 +280,10 @@ FieldNameIterator_next(FieldNameIterator *self, int *is_attribute,
Py_ssize_t *name_idx, SubString *name)
{
/* check at end of input */
- if (self->ptr >= self->str.end)
+ if (self->index >= self->str.end)
return 1;
- switch (*self->ptr++) {
+ switch (PyUnicode_READ_CHAR(self->str.str, self->index++)) {
case '.':
*is_attribute = 1;
if (_FieldNameIterator_attr(self, name) == 0)
@@ -381,7 +306,7 @@ FieldNameIterator_next(FieldNameIterator *self, int *is_attribute,
}
/* empty string is an error */
- if (name->ptr == name->end) {
+ if (name->start == name->end) {
PyErr_SetString(PyExc_ValueError, "Empty attribute in format string");
return 0;
}
@@ -397,24 +322,23 @@ FieldNameIterator_next(FieldNameIterator *self, int *is_attribute,
'rest' is an iterator to return the rest
*/
static int
-field_name_split(STRINGLIB_CHAR *ptr, Py_ssize_t len, SubString *first,
+field_name_split(PyObject *str, Py_ssize_t start, Py_ssize_t end, SubString *first,
Py_ssize_t *first_idx, FieldNameIterator *rest,
AutoNumber *auto_number)
{
- STRINGLIB_CHAR c;
- STRINGLIB_CHAR *p = ptr;
- STRINGLIB_CHAR *end = ptr + len;
+ Py_UCS4 c;
+ Py_ssize_t i = start;
int field_name_is_empty;
int using_numeric_index;
/* find the part up until the first '.' or '[' */
- while (p < end) {
- switch (c = *p++) {
+ while (i < end) {
+ switch (c = PyUnicode_READ_CHAR(str, i++)) {
case '[':
case '.':
/* backup so that we this character is available to the
"rest" iterator */
- p--;
+ i--;
break;
default:
continue;
@@ -423,15 +347,15 @@ field_name_split(STRINGLIB_CHAR *ptr, Py_ssize_t len, SubString *first,
}
/* set up the return values */
- SubString_init(first, ptr, p - ptr);
- FieldNameIterator_init(rest, p, end - p);
+ SubString_init(first, str, start, i);
+ FieldNameIterator_init(rest, str, i, end);
/* see if "first" is an integer, in which case it's used as an index */
*first_idx = get_integer(first);
if (*first_idx == -1 && PyErr_Occurred())
return 0;
- field_name_is_empty = first->ptr >= first->end;
+ field_name_is_empty = first->start >= first->end;
/* If the field name is omitted or if we have a numeric index
specified, then we're doing numeric indexing into args. */
@@ -486,7 +410,7 @@ get_field_object(SubString *input, PyObject *args, PyObject *kwargs,
Py_ssize_t index;
FieldNameIterator rest;
- if (!field_name_split(input->ptr, input->end - input->ptr, &first,
+ if (!field_name_split(input->str, input->start, input->end, &first,
&index, &rest, auto_number)) {
goto error;
}
@@ -570,39 +494,41 @@ error:
appends to the output.
*/
static int
-render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output)
+render_field(PyObject *fieldobj, SubString *format_spec, _PyUnicodeWriter *writer)
{
int ok = 0;
PyObject *result = NULL;
PyObject *format_spec_object = NULL;
- PyObject *(*formatter)(PyObject *, STRINGLIB_CHAR *, Py_ssize_t) = NULL;
- STRINGLIB_CHAR* format_spec_start = format_spec->ptr ?
- format_spec->ptr : NULL;
- Py_ssize_t format_spec_len = format_spec->ptr ?
- format_spec->end - format_spec->ptr : 0;
+ int (*formatter) (_PyUnicodeWriter*, PyObject *, PyObject *, Py_ssize_t, Py_ssize_t) = NULL;
+ int err;
/* If we know the type exactly, skip the lookup of __format__ and just
call the formatter directly. */
if (PyUnicode_CheckExact(fieldobj))
- formatter = _PyUnicode_FormatAdvanced;
+ formatter = _PyUnicode_FormatAdvancedWriter;
else if (PyLong_CheckExact(fieldobj))
- formatter =_PyLong_FormatAdvanced;
+ formatter = _PyLong_FormatAdvancedWriter;
else if (PyFloat_CheckExact(fieldobj))
- formatter = _PyFloat_FormatAdvanced;
-
- /* XXX: for 2.6, convert format_spec to the appropriate type
- (unicode, str) */
+ formatter = _PyFloat_FormatAdvancedWriter;
+ else if (PyComplex_CheckExact(fieldobj))
+ formatter = _PyComplex_FormatAdvancedWriter;
if (formatter) {
/* we know exactly which formatter will be called when __format__ is
looked up, so call it directly, instead. */
- result = formatter(fieldobj, format_spec_start, format_spec_len);
+ err = formatter(writer, fieldobj, format_spec->str,
+ format_spec->start, format_spec->end);
+ return (err == 0);
}
else {
/* We need to create an object out of the pointers we have, because
__format__ takes a string/unicode object for format_spec. */
- format_spec_object = STRINGLIB_NEW(format_spec_start,
- format_spec_len);
+ if (format_spec->str)
+ format_spec_object = PyUnicode_Substring(format_spec->str,
+ format_spec->start,
+ format_spec->end);
+ else
+ format_spec_object = PyUnicode_New(0, 0);
if (format_spec_object == NULL)
goto done;
@@ -611,24 +537,10 @@ render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output)
if (result == NULL)
goto done;
-#if PY_VERSION_HEX >= 0x03000000
- assert(PyUnicode_Check(result));
-#else
- assert(PyBytes_Check(result) || PyUnicode_Check(result));
-
- /* Convert result to our type. We could be str, and result could
- be unicode */
- {
- PyObject *tmp = STRINGLIB_TOSTR(result);
- if (tmp == NULL)
- goto done;
- Py_DECREF(result);
- result = tmp;
- }
-#endif
+ if (_PyUnicodeWriter_WriteStr(writer, result) == -1)
+ goto done;
+ ok = 1;
- ok = output_data(output,
- STRINGLIB_STR(result), STRINGLIB_LEN(result));
done:
Py_XDECREF(format_spec_object);
Py_XDECREF(result);
@@ -637,23 +549,24 @@ done:
static int
parse_field(SubString *str, SubString *field_name, SubString *format_spec,
- STRINGLIB_CHAR *conversion)
+ Py_UCS4 *conversion)
{
/* Note this function works if the field name is zero length,
which is good. Zero length field names are handled later, in
field_name_split. */
- STRINGLIB_CHAR c = 0;
+ Py_UCS4 c = 0;
/* initialize these, as they may be empty */
*conversion = '\0';
- SubString_init(format_spec, NULL, 0);
+ SubString_init(format_spec, NULL, 0, 0);
/* Search for the field name. it's terminated by the end of
the string, or a ':' or '!' */
- field_name->ptr = str->ptr;
- while (str->ptr < str->end) {
- switch (c = *(str->ptr++)) {
+ field_name->str = str->str;
+ field_name->start = str->start;
+ while (str->start < str->end) {
+ switch ((c = PyUnicode_READ_CHAR(str->str, str->start++))) {
case ':':
case '!':
break;
@@ -666,26 +579,27 @@ parse_field(SubString *str, SubString *field_name, SubString *format_spec,
if (c == '!' || c == ':') {
/* we have a format specifier and/or a conversion */
/* don't include the last character */
- field_name->end = str->ptr-1;
+ field_name->end = str->start-1;
/* the format specifier is the rest of the string */
- format_spec->ptr = str->ptr;
+ format_spec->str = str->str;
+ format_spec->start = str->start;
format_spec->end = str->end;
/* see if there's a conversion specifier */
if (c == '!') {
/* there must be another character present */
- if (format_spec->ptr >= format_spec->end) {
+ if (format_spec->start >= format_spec->end) {
PyErr_SetString(PyExc_ValueError,
"end of format while looking for conversion "
"specifier");
return 0;
}
- *conversion = *(format_spec->ptr++);
+ *conversion = PyUnicode_READ_CHAR(format_spec->str, format_spec->start++);
/* if there is another character, it must be a colon */
- if (format_spec->ptr < format_spec->end) {
- c = *(format_spec->ptr++);
+ if (format_spec->start < format_spec->end) {
+ c = PyUnicode_READ_CHAR(format_spec->str, format_spec->start++);
if (c != ':') {
PyErr_SetString(PyExc_ValueError,
"expected ':' after format specifier");
@@ -696,7 +610,7 @@ parse_field(SubString *str, SubString *field_name, SubString *format_spec,
}
else
/* end of string, there's no format_spec or conversion */
- field_name->end = str->ptr;
+ field_name->end = str->start;
return 1;
}
@@ -715,9 +629,10 @@ typedef struct {
} MarkupIterator;
static int
-MarkupIterator_init(MarkupIterator *self, STRINGLIB_CHAR *ptr, Py_ssize_t len)
+MarkupIterator_init(MarkupIterator *self, PyObject *str,
+ Py_ssize_t start, Py_ssize_t end)
{
- SubString_init(&self->str, ptr, len);
+ SubString_init(&self->str, str, start, end);
return 1;
}
@@ -726,30 +641,30 @@ MarkupIterator_init(MarkupIterator *self, STRINGLIB_CHAR *ptr, Py_ssize_t len)
static int
MarkupIterator_next(MarkupIterator *self, SubString *literal,
int *field_present, SubString *field_name,
- SubString *format_spec, STRINGLIB_CHAR *conversion,
+ SubString *format_spec, Py_UCS4 *conversion,
int *format_spec_needs_expanding)
{
int at_end;
- STRINGLIB_CHAR c = 0;
- STRINGLIB_CHAR *start;
+ Py_UCS4 c = 0;
+ Py_ssize_t start;
int count;
Py_ssize_t len;
int markup_follows = 0;
/* initialize all of the output variables */
- SubString_init(literal, NULL, 0);
- SubString_init(field_name, NULL, 0);
- SubString_init(format_spec, NULL, 0);
+ SubString_init(literal, NULL, 0, 0);
+ SubString_init(field_name, NULL, 0, 0);
+ SubString_init(format_spec, NULL, 0, 0);
*conversion = '\0';
*format_spec_needs_expanding = 0;
*field_present = 0;
/* No more input, end of iterator. This is the normal exit
path. */
- if (self->str.ptr >= self->str.end)
+ if (self->str.start >= self->str.end)
return 1;
- start = self->str.ptr;
+ start = self->str.start;
/* First read any literal text. Read until the end of string, an
escaped '{' or '}', or an unescaped '{'. In order to never
@@ -758,8 +673,8 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
including the brace, but no format object. The next time
through, we'll return the rest of the literal, skipping past
the second consecutive brace. */
- while (self->str.ptr < self->str.end) {
- switch (c = *(self->str.ptr++)) {
+ while (self->str.start < self->str.end) {
+ switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) {
case '{':
case '}':
markup_follows = 1;
@@ -770,10 +685,12 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
break;
}
- at_end = self->str.ptr >= self->str.end;
- len = self->str.ptr - start;
+ at_end = self->str.start >= self->str.end;
+ len = self->str.start - start;
- if ((c == '}') && (at_end || (c != *self->str.ptr))) {
+ if ((c == '}') && (at_end ||
+ (c != PyUnicode_READ_CHAR(self->str.str,
+ self->str.start)))) {
PyErr_SetString(PyExc_ValueError, "Single '}' encountered "
"in format string");
return 0;
@@ -784,10 +701,10 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
return 0;
}
if (!at_end) {
- if (c == *self->str.ptr) {
+ if (c == PyUnicode_READ_CHAR(self->str.str, self->str.start)) {
/* escaped } or {, skip it in the input. there is no
markup object following us, just this literal text */
- self->str.ptr++;
+ self->str.start++;
markup_follows = 0;
}
else
@@ -795,7 +712,8 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
}
/* record the literal text */
- literal->ptr = start;
+ literal->str = self->str.str;
+ literal->start = start;
literal->end = start + len;
if (!markup_follows)
@@ -807,12 +725,12 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
*field_present = 1;
count = 1;
- start = self->str.ptr;
+ start = self->str.start;
/* we know we can't have a zero length string, so don't worry
about that case */
- while (self->str.ptr < self->str.end) {
- switch (c = *(self->str.ptr++)) {
+ while (self->str.start < self->str.end) {
+ switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) {
case '{':
/* the format spec needs to be recursively expanded.
this is an optimization, and not strictly needed */
@@ -825,7 +743,7 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
/* we're done. parse and get out */
SubString s;
- SubString_init(&s, start, self->str.ptr - 1 - start);
+ SubString_init(&s, self->str.str, start, self->str.start - 1);
if (parse_field(&s, field_name, format_spec, conversion) == 0)
return 0;
@@ -844,7 +762,7 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
/* do the !r or !s conversion on obj */
static PyObject *
-do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
+do_conversion(PyObject *obj, Py_UCS4 conversion)
{
/* XXX in pre-3.0, do we need to convert this to unicode, since it
might have returned a string? */
@@ -852,11 +770,9 @@ do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
case 'r':
return PyObject_Repr(obj);
case 's':
- return STRINGLIB_TOSTR(obj);
-#if PY_VERSION_HEX >= 0x03000000
+ return PyObject_Str(obj);
case 'a':
- return STRINGLIB_TOASCII(obj);
-#endif
+ return PyObject_ASCII(obj);
default:
if (conversion > 32 && conversion < 127) {
/* It's the ASCII subrange; casting to char is safe
@@ -888,8 +804,8 @@ do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
static int
output_markup(SubString *field_name, SubString *format_spec,
- int format_spec_needs_expanding, STRINGLIB_CHAR conversion,
- OutputString *output, PyObject *args, PyObject *kwargs,
+ int format_spec_needs_expanding, Py_UCS4 conversion,
+ _PyUnicodeWriter *writer, PyObject *args, PyObject *kwargs,
int recursion_depth, AutoNumber *auto_number)
{
PyObject *tmp = NULL;
@@ -905,7 +821,7 @@ output_markup(SubString *field_name, SubString *format_spec,
if (conversion != '\0') {
tmp = do_conversion(fieldobj, conversion);
- if (tmp == NULL)
+ if (tmp == NULL || PyUnicode_READY(tmp) == -1)
goto done;
/* do the assignment, transferring ownership: fieldobj = tmp */
@@ -918,20 +834,19 @@ output_markup(SubString *field_name, SubString *format_spec,
if (format_spec_needs_expanding) {
tmp = build_string(format_spec, args, kwargs, recursion_depth-1,
auto_number);
- if (tmp == NULL)
+ if (tmp == NULL || PyUnicode_READY(tmp) == -1)
goto done;
/* note that in the case we're expanding the format string,
tmp must be kept around until after the call to
render_field. */
- SubString_init(&expanded_format_spec,
- STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp));
+ SubString_init(&expanded_format_spec, tmp, 0, PyUnicode_GET_LENGTH(tmp));
actual_format_spec = &expanded_format_spec;
}
else
actual_format_spec = format_spec;
- if (render_field(fieldobj, actual_format_spec, output) == 0)
+ if (render_field(fieldobj, actual_format_spec, writer) == 0)
goto done;
result = 1;
@@ -951,7 +866,7 @@ done:
*/
static int
do_markup(SubString *input, PyObject *args, PyObject *kwargs,
- OutputString *output, int recursion_depth, AutoNumber *auto_number)
+ _PyUnicodeWriter *writer, int recursion_depth, AutoNumber *auto_number)
{
MarkupIterator iter;
int format_spec_needs_expanding;
@@ -960,20 +875,35 @@ do_markup(SubString *input, PyObject *args, PyObject *kwargs,
SubString literal;
SubString field_name;
SubString format_spec;
- STRINGLIB_CHAR conversion;
+ Py_UCS4 conversion, maxchar;
+ Py_ssize_t sublen;
+ int err;
- MarkupIterator_init(&iter, input->ptr, input->end - input->ptr);
+ MarkupIterator_init(&iter, input->str, input->start, input->end);
while ((result = MarkupIterator_next(&iter, &literal, &field_present,
&field_name, &format_spec,
&conversion,
&format_spec_needs_expanding)) == 2) {
- if (!output_data(output, literal.ptr, literal.end - literal.ptr))
- return 0;
- if (field_present)
+ sublen = literal.end - literal.start;
+ if (sublen) {
+ maxchar = _PyUnicode_FindMaxChar(literal.str,
+ literal.start, literal.end);
+ err = _PyUnicodeWriter_Prepare(writer, sublen, maxchar);
+ if (err == -1)
+ return 0;
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ literal.str, literal.start, sublen);
+ writer->pos += sublen;
+ }
+
+ if (field_present) {
+ if (iter.str.start == iter.str.end)
+ writer->overallocate = 0;
if (!output_markup(&field_name, &format_spec,
- format_spec_needs_expanding, conversion, output,
+ format_spec_needs_expanding, conversion, writer,
args, kwargs, recursion_depth, auto_number))
return 0;
+ }
}
return result;
}
@@ -987,43 +917,26 @@ static PyObject *
build_string(SubString *input, PyObject *args, PyObject *kwargs,
int recursion_depth, AutoNumber *auto_number)
{
- OutputString output;
- PyObject *result = NULL;
- Py_ssize_t count;
-
- output.obj = NULL; /* needed so cleanup code always works */
+ _PyUnicodeWriter writer;
+ Py_ssize_t minlen;
/* check the recursion level */
if (recursion_depth <= 0) {
PyErr_SetString(PyExc_ValueError,
"Max string recursion exceeded");
- goto done;
+ return NULL;
}
- /* initial size is the length of the format string, plus the size
- increment. seems like a reasonable default */
- if (!output_initialize(&output,
- input->end - input->ptr +
- INITIAL_SIZE_INCREMENT))
- goto done;
+ minlen = PyUnicode_GET_LENGTH(input->str) + 100;
+ _PyUnicodeWriter_Init(&writer, minlen);
- if (!do_markup(input, args, kwargs, &output, recursion_depth,
+ if (!do_markup(input, args, kwargs, &writer, recursion_depth,
auto_number)) {
- goto done;
- }
-
- count = output.ptr - STRINGLIB_STR(output.obj);
- if (STRINGLIB_RESIZE(&output.obj, count) < 0) {
- goto done;
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
}
- /* transfer ownership to result */
- result = output.obj;
- output.obj = NULL;
-
-done:
- Py_XDECREF(output.obj);
- return result;
+ return _PyUnicodeWriter_Finish(&writer);
}
/************************************************************************/
@@ -1044,8 +957,11 @@ do_string_format(PyObject *self, PyObject *args, PyObject *kwargs)
AutoNumber auto_number;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
AutoNumber_Init(&auto_number);
- SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self));
+ SubString_init(&input, self, 0, PyUnicode_GET_LENGTH(self));
return build_string(&input, args, kwargs, recursion_depth, &auto_number);
}
@@ -1067,9 +983,7 @@ do_string_format_map(PyObject *self, PyObject *obj)
typedef struct {
PyObject_HEAD
-
- STRINGLIB_OBJECT *str;
-
+ PyObject *str;
MarkupIterator it_markup;
} formatteriterobject;
@@ -1094,7 +1008,7 @@ formatteriter_next(formatteriterobject *it)
SubString literal;
SubString field_name;
SubString format_spec;
- STRINGLIB_CHAR conversion;
+ Py_UCS4 conversion;
int format_spec_needs_expanding;
int field_present;
int result = MarkupIterator_next(&it->it_markup, &literal, &field_present,
@@ -1138,7 +1052,8 @@ formatteriter_next(formatteriterobject *it)
Py_INCREF(conversion_str);
}
else
- conversion_str = STRINGLIB_NEW(&conversion, 1);
+ conversion_str = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
+ &conversion, 1);
if (conversion_str == NULL)
goto done;
@@ -1195,7 +1110,7 @@ static PyTypeObject PyFormatterIter_Type = {
describing the parsed elements. It's a wrapper around
stringlib/string_format.h's MarkupIterator */
static PyObject *
-formatter_parser(PyObject *ignored, STRINGLIB_OBJECT *self)
+formatter_parser(PyObject *ignored, PyObject *self)
{
formatteriterobject *it;
@@ -1204,6 +1119,9 @@ formatter_parser(PyObject *ignored, STRINGLIB_OBJECT *self)
return NULL;
}
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
it = PyObject_New(formatteriterobject, &PyFormatterIter_Type);
if (it == NULL)
return NULL;
@@ -1213,10 +1131,7 @@ formatter_parser(PyObject *ignored, STRINGLIB_OBJECT *self)
it->str = self;
/* initialize the contained MarkupIterator */
- MarkupIterator_init(&it->it_markup,
- STRINGLIB_STR(self),
- STRINGLIB_LEN(self));
-
+ MarkupIterator_init(&it->it_markup, (PyObject*)self, 0, PyUnicode_GET_LENGTH(self));
return (PyObject *)it;
}
@@ -1232,9 +1147,7 @@ formatter_parser(PyObject *ignored, STRINGLIB_OBJECT *self)
typedef struct {
PyObject_HEAD
-
- STRINGLIB_OBJECT *str;
-
+ PyObject *str;
FieldNameIterator it_field;
} fieldnameiterobject;
@@ -1335,7 +1248,7 @@ static PyTypeObject PyFieldNameIter_Type = {
field_name_split. The iterator it returns is a
FieldNameIterator */
static PyObject *
-formatter_field_name_split(PyObject *ignored, STRINGLIB_OBJECT *self)
+formatter_field_name_split(PyObject *ignored, PyObject *self)
{
SubString first;
Py_ssize_t first_idx;
@@ -1349,6 +1262,9 @@ formatter_field_name_split(PyObject *ignored, STRINGLIB_OBJECT *self)
return NULL;
}
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type);
if (it == NULL)
return NULL;
@@ -1360,8 +1276,7 @@ formatter_field_name_split(PyObject *ignored, STRINGLIB_OBJECT *self)
/* Pass in auto_number = NULL. We'll return an empty string for
first_obj in that case. */
- if (!field_name_split(STRINGLIB_STR(self),
- STRINGLIB_LEN(self),
+ if (!field_name_split((PyObject*)self, 0, PyUnicode_GET_LENGTH(self),
&first, &first_idx, &it->it_field, NULL))
goto done;
diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h
index 09dae6d..f16f21e 100644
--- a/Objects/stringlib/unicodedefs.h
+++ b/Objects/stringlib/unicodedefs.h
@@ -6,7 +6,10 @@
compiled as unicode. */
#define STRINGLIB_IS_UNICODE 1
+#define FASTSEARCH fastsearch
+#define STRINGLIB(F) stringlib_##F
#define STRINGLIB_OBJECT PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR Py_UNICODE_SIZE
#define STRINGLIB_CHAR Py_UNICODE
#define STRINGLIB_TYPE_NAME "unicode"
#define STRINGLIB_PARSE_CODE "U"
@@ -15,17 +18,12 @@
#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK
#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL
#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL
-#define STRINGLIB_TOUPPER Py_UNICODE_TOUPPER
-#define STRINGLIB_TOLOWER Py_UNICODE_TOLOWER
-#define STRINGLIB_FILL Py_UNICODE_FILL
#define STRINGLIB_STR PyUnicode_AS_UNICODE
#define STRINGLIB_LEN PyUnicode_GET_SIZE
#define STRINGLIB_NEW PyUnicode_FromUnicode
#define STRINGLIB_RESIZE PyUnicode_Resize
#define STRINGLIB_CHECK PyUnicode_Check
#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact
-#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping
-#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale
#if PY_VERSION_HEX < 0x03000000
#define STRINGLIB_TOSTR PyObject_Unicode
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index b345460..9c843fa 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -45,6 +45,22 @@ show_track(void)
}
#endif
+/* Print summary info about the state of the optimized allocator */
+void
+_PyTuple_DebugMallocStats(FILE *out)
+{
+#if PyTuple_MAXSAVESIZE > 0
+ int i;
+ char buf[128];
+ for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
+ PyOS_snprintf(buf, sizeof(buf),
+ "free %d-sized PyTupleObject", i);
+ _PyDebugAllocatorStats(out,
+ buf,
+ numfree[i], _PyObject_VAR_SIZE(&PyTuple_Type, i));
+ }
+#endif
+}
PyObject *
PyTuple_New(register Py_ssize_t size)
@@ -80,15 +96,11 @@ PyTuple_New(register Py_ssize_t size)
else
#endif
{
- Py_ssize_t nbytes = size * sizeof(PyObject *);
/* Check for overflow */
- if (nbytes / sizeof(PyObject *) != (size_t)size ||
- (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
- {
+ if (size > (PY_SSIZE_T_MAX - sizeof(PyTupleObject) -
+ sizeof(PyObject *)) / sizeof(PyObject *)) {
return PyErr_NoMemory();
}
- nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
-
op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
if (op == NULL)
return NULL;
@@ -315,11 +327,12 @@ error:
static Py_hash_t
tuplehash(PyTupleObject *v)
{
- register Py_hash_t x, y;
+ register Py_uhash_t x;
+ register Py_hash_t y;
register Py_ssize_t len = Py_SIZE(v);
register PyObject **p;
- Py_hash_t mult = _PyHASH_MULTIPLIER;
- x = 0x345678L;
+ Py_uhash_t mult = _PyHASH_MULTIPLIER;
+ x = 0x345678;
p = v->ob_item;
while (--len >= 0) {
y = PyObject_Hash(*p++);
@@ -330,7 +343,7 @@ tuplehash(PyTupleObject *v)
mult += (Py_hash_t)(82520L + len + len);
}
x += 97531L;
- if (x == -1)
+ if (x == (Py_uhash_t)-1)
x = -2;
return x;
}
@@ -464,9 +477,9 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n)
if (Py_SIZE(a) == 0)
return PyTuple_New(0);
}
- size = Py_SIZE(a) * n;
- if (size/Py_SIZE(a) != n)
+ if (n > PY_SSIZE_T_MAX / Py_SIZE(a))
return PyErr_NoMemory();
+ size = Py_SIZE(a) * n;
np = (PyTupleObject *) PyTuple_New(size);
if (np == NULL)
return NULL;
@@ -546,10 +559,8 @@ tuplerichcompare(PyObject *v, PyObject *w, int op)
Py_ssize_t i;
Py_ssize_t vlen, wlen;
- if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyTuple_Check(v) || !PyTuple_Check(w))
+ Py_RETURN_NOTIMPLEMENTED;
vt = (PyTupleObject *)v;
wt = (PyTupleObject *)w;
@@ -970,8 +981,39 @@ tupleiter_len(tupleiterobject *it)
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+tupleiter_reduce(tupleiterobject *it)
+{
+ if (it->it_seq)
+ return Py_BuildValue("N(O)l", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ else
+ return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
+}
+
+static PyObject *
+tupleiter_setstate(tupleiterobject *it, PyObject *state)
+{
+ long index = PyLong_AsLong(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (it->it_seq != NULL) {
+ if (index < 0)
+ index = 0;
+ else if (it->it_seq != NULL && index > PyTuple_GET_SIZE(it->it_seq))
+ index = PyTuple_GET_SIZE(it->it_seq);
+ it->it_index = index;
+ }
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef tupleiter_methods[] = {
{"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
+ {"__reduce__", (PyCFunction)tupleiter_reduce, METH_NOARGS, reduce_doc},
+ {"__setstate__", (PyCFunction)tupleiter_setstate, METH_O, setstate_doc},
{NULL, NULL} /* sentinel */
};
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index fd2ae67..413c7da 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -14,16 +14,17 @@
MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large
strings are used as attribute names. */
#define MCACHE_MAX_ATTR_SIZE 100
-#define MCACHE_SIZE_EXP 10
+#define MCACHE_SIZE_EXP 9
#define MCACHE_HASH(version, name_hash) \
(((unsigned int)(version) * (unsigned int)(name_hash)) \
>> (8*sizeof(unsigned int) - MCACHE_SIZE_EXP))
#define MCACHE_HASH_METHOD(type, name) \
MCACHE_HASH((type)->tp_version_tag, \
- ((PyUnicodeObject *)(name))->hash)
+ ((PyASCIIObject *)(name))->hash)
#define MCACHE_CACHEABLE_NAME(name) \
PyUnicode_CheckExact(name) && \
- PyUnicode_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE
+ PyUnicode_READY(name) != -1 && \
+ PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE
struct method_cache_entry {
unsigned int version;
@@ -34,6 +35,22 @@ struct method_cache_entry {
static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP];
static unsigned int next_version_tag = 0;
+_Py_IDENTIFIER(__class__);
+_Py_IDENTIFIER(__dict__);
+_Py_IDENTIFIER(__doc__);
+_Py_IDENTIFIER(__getitem__);
+_Py_IDENTIFIER(__getattribute__);
+_Py_IDENTIFIER(__hash__);
+_Py_IDENTIFIER(__module__);
+_Py_IDENTIFIER(__name__);
+_Py_IDENTIFIER(__new__);
+
+static PyObject *
+_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name);
+
+static PyObject *
+slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+
unsigned int
PyType_ClearCache(void)
{
@@ -96,15 +113,13 @@ PyType_Modified(PyTypeObject *type)
static void
type_mro_modified(PyTypeObject *type, PyObject *bases) {
/*
- Check that all base classes or elements of the mro of type are
+ Check that all base classes or elements of the MRO of type are
able to be cached. This function is called after the base
classes or mro of the type are altered.
Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
- inherits from an old-style class, either directly or if it
- appears in the MRO of a new-style class. No support either for
- custom MROs that include types that are not officially super
- types.
+ has a custom MRO that includes a type which is not officially
+ super type.
Called from mro_internal, which will subsequently be called on
each subclass when their mro is recursively updated.
@@ -120,11 +135,7 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) {
PyObject *b = PyTuple_GET_ITEM(bases, i);
PyTypeObject *cls;
- if (!PyType_Check(b) ) {
- clear = 1;
- break;
- }
-
+ assert(PyType_Check(b));
cls = (PyTypeObject *)b;
if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) ||
@@ -201,6 +212,22 @@ static PyMemberDef type_members[] = {
{0}
};
+static int
+check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *name)
+{
+ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ PyErr_Format(PyExc_TypeError,
+ "can't set %s.%s", type->tp_name, name);
+ return 0;
+ }
+ if (!value) {
+ PyErr_Format(PyExc_TypeError,
+ "can't delete %s.%s", type->tp_name, name);
+ return 0;
+ }
+ return 1;
+}
+
static PyObject *
type_name(PyTypeObject *type, void *context)
{
@@ -222,6 +249,19 @@ type_name(PyTypeObject *type, void *context)
}
}
+static PyObject *
+type_qualname(PyTypeObject *type, void *context)
+{
+ if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
+ PyHeapTypeObject* et = (PyHeapTypeObject*)type;
+ Py_INCREF(et->ht_qualname);
+ return et->ht_qualname;
+ }
+ else {
+ return type_name(type, context);
+ }
+}
+
static int
type_set_name(PyTypeObject *type, PyObject *value, void *context)
{
@@ -229,16 +269,8 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
char *tp_name;
PyObject *tmp;
- if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
- PyErr_Format(PyExc_TypeError,
- "can't set %s.__name__", type->tp_name);
- return -1;
- }
- if (!value) {
- PyErr_Format(PyExc_TypeError,
- "can't delete %s.__name__", type->tp_name);
+ if (!check_set_special_type_attr(type, value, "__name__"))
return -1;
- }
if (!PyUnicode_Check(value)) {
PyErr_Format(PyExc_TypeError,
"can only assign string to %s.__name__, not '%s'",
@@ -274,6 +306,27 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
return 0;
}
+static int
+type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
+{
+ PyHeapTypeObject* et;
+
+ if (!check_set_special_type_attr(type, value, "__qualname__"))
+ return -1;
+ if (!PyUnicode_Check(value)) {
+ PyErr_Format(PyExc_TypeError,
+ "can only assign string to %s.__qualname__, not '%s'",
+ type->tp_name, Py_TYPE(value)->tp_name);
+ return -1;
+ }
+
+ et = (PyHeapTypeObject*)type;
+ Py_INCREF(value);
+ Py_DECREF(et->ht_qualname);
+ et->ht_qualname = value;
+ return 0;
+}
+
static PyObject *
type_module(PyTypeObject *type, void *context)
{
@@ -281,7 +334,7 @@ type_module(PyTypeObject *type, void *context)
char *s;
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
- mod = PyDict_GetItemString(type->tp_dict, "__module__");
+ mod = _PyDict_GetItemId(type->tp_dict, &PyId___module__);
if (!mod) {
PyErr_Format(PyExc_AttributeError, "__module__");
return 0;
@@ -301,20 +354,12 @@ type_module(PyTypeObject *type, void *context)
static int
type_set_module(PyTypeObject *type, PyObject *value, void *context)
{
- if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
- PyErr_Format(PyExc_TypeError,
- "can't set %s.__module__", type->tp_name);
- return -1;
- }
- if (!value) {
- PyErr_Format(PyExc_TypeError,
- "can't delete %s.__module__", type->tp_name);
+ if (!check_set_special_type_attr(type, value, "__module__"))
return -1;
- }
PyType_Modified(type);
- return PyDict_SetItemString(type->tp_dict, "__module__", value);
+ return _PyDict_SetItemId(type->tp_dict, &PyId___module__, value);
}
static PyObject *
@@ -435,16 +480,8 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
PyTypeObject *new_base, *old_base;
PyObject *old_bases, *old_mro;
- if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
- PyErr_Format(PyExc_TypeError,
- "can't set %s.__bases__", type->tp_name);
- return -1;
- }
- if (!value) {
- PyErr_Format(PyExc_TypeError,
- "can't delete %s.__bases__", type->tp_name);
+ if (!check_set_special_type_attr(type, value, "__bases__"))
return -1;
- }
if (!PyTuple_Check(value)) {
PyErr_Format(PyExc_TypeError,
"can only assign tuple to %s.__bases__, not %s",
@@ -461,8 +498,7 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
ob = PyTuple_GET_ITEM(value, i);
if (!PyType_Check(ob)) {
PyErr_Format(PyExc_TypeError,
- "%s.__bases__ must be tuple of old- or "
- "new-style classes, not '%s'",
+ "%s.__bases__ must be tuple of classes, not '%s'",
type->tp_name, Py_TYPE(ob)->tp_name);
return -1;
}
@@ -580,7 +616,7 @@ type_get_doc(PyTypeObject *type, void *context)
PyObject *result;
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
return PyUnicode_FromString(type->tp_doc);
- result = PyDict_GetItemString(type->tp_dict, "__doc__");
+ result = _PyDict_GetItemId(type->tp_dict, &PyId___doc__);
if (result == NULL) {
result = Py_None;
Py_INCREF(result);
@@ -595,6 +631,15 @@ type_get_doc(PyTypeObject *type, void *context)
return result;
}
+static int
+type_set_doc(PyTypeObject *type, PyObject *value, void *context)
+{
+ if (!check_set_special_type_attr(type, value, "__doc__"))
+ return -1;
+ PyType_Modified(type);
+ return _PyDict_SetItemId(type->tp_dict, &PyId___doc__, value);
+}
+
static PyObject *
type___instancecheck__(PyObject *type, PyObject *inst)
{
@@ -625,12 +670,13 @@ type___subclasscheck__(PyObject *type, PyObject *inst)
static PyGetSetDef type_getsets[] = {
{"__name__", (getter)type_name, (setter)type_set_name, NULL},
+ {"__qualname__", (getter)type_qualname, (setter)type_set_qualname, NULL},
{"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
{"__module__", (getter)type_module, (setter)type_set_module, NULL},
{"__abstractmethods__", (getter)type_abstractmethods,
(setter)type_set_abstractmethods, NULL},
{"__dict__", (getter)type_dict, NULL, NULL},
- {"__doc__", (getter)type_get_doc, NULL, NULL},
+ {"__doc__", (getter)type_get_doc, (setter)type_set_doc, NULL},
{0}
};
@@ -646,7 +692,7 @@ type_repr(PyTypeObject *type)
Py_DECREF(mod);
mod = NULL;
}
- name = type_name(type, NULL);
+ name = type_qualname(type, NULL);
if (name == NULL) {
Py_XDECREF(mod);
return NULL;
@@ -911,7 +957,7 @@ subtype_dealloc(PyObject *self)
/* Find the nearest base with a different tp_dealloc */
base = type;
- while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
+ while ((/*basedealloc =*/ base->tp_dealloc) == subtype_dealloc) {
base = base->tp_base;
assert(base);
}
@@ -1136,16 +1182,11 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
*/
static PyObject *
-lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
+lookup_maybe(PyObject *self, _Py_Identifier *attrid)
{
PyObject *res;
- if (*attrobj == NULL) {
- *attrobj = PyUnicode_InternFromString(attrstr);
- if (*attrobj == NULL)
- return NULL;
- }
- res = _PyType_Lookup(Py_TYPE(self), *attrobj);
+ res = _PyType_LookupId(Py_TYPE(self), attrid);
if (res != NULL) {
descrgetfunc f;
if ((f = Py_TYPE(res)->tp_descr_get) == NULL)
@@ -1157,18 +1198,18 @@ lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
}
static PyObject *
-lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
+lookup_method(PyObject *self, _Py_Identifier *attrid)
{
- PyObject *res = lookup_maybe(self, attrstr, attrobj);
+ PyObject *res = lookup_maybe(self, attrid);
if (res == NULL && !PyErr_Occurred())
- PyErr_SetObject(PyExc_AttributeError, *attrobj);
+ PyErr_SetObject(PyExc_AttributeError, attrid->object);
return res;
}
PyObject *
-_PyObject_LookupSpecial(PyObject *self, char *attrstr, PyObject **attrobj)
+_PyObject_LookupSpecial(PyObject *self, _Py_Identifier *attrid)
{
- return lookup_maybe(self, attrstr, attrobj);
+ return lookup_maybe(self, attrid);
}
/* A variation of PyObject_CallMethod that uses lookup_method()
@@ -1176,17 +1217,17 @@ _PyObject_LookupSpecial(PyObject *self, char *attrstr, PyObject **attrobj)
as lookup_method to cache the interned name string object. */
static PyObject *
-call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
+call_method(PyObject *o, _Py_Identifier *nameid, char *format, ...)
{
va_list va;
PyObject *args, *func = 0, *retval;
va_start(va, format);
- func = lookup_maybe(o, name, nameobj);
+ func = lookup_maybe(o, nameid);
if (func == NULL) {
va_end(va);
if (!PyErr_Occurred())
- PyErr_SetObject(PyExc_AttributeError, *nameobj);
+ PyErr_SetObject(PyExc_AttributeError, nameid->object);
return NULL;
}
@@ -1212,19 +1253,17 @@ call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
/* Clone of call_method() that returns NotImplemented when the lookup fails. */
static PyObject *
-call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
+call_maybe(PyObject *o, _Py_Identifier *nameid, char *format, ...)
{
va_list va;
PyObject *args, *func = 0, *retval;
va_start(va, format);
- func = lookup_maybe(o, name, nameobj);
+ func = lookup_maybe(o, nameid);
if (func == NULL) {
va_end(va);
- if (!PyErr_Occurred()) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyErr_Occurred())
+ Py_RETURN_NOTIMPLEMENTED;
return NULL;
}
@@ -1290,7 +1329,7 @@ tail_contains(PyObject *list, int whence, PyObject *o) {
static PyObject *
class_name(PyObject *cls)
{
- PyObject *name = PyObject_GetAttrString(cls, "__name__");
+ PyObject *name = _PyObject_GetAttrId(cls, &PyId___name__);
if (name == NULL) {
PyErr_Clear();
Py_XDECREF(name);
@@ -1545,9 +1584,9 @@ mro_internal(PyTypeObject *type)
result = mro_implementation(type);
}
else {
- static PyObject *mro_str;
+ _Py_IDENTIFIER(mro);
checkit = 1;
- mro = lookup_method((PyObject *)type, "mro", &mro_str);
+ mro = lookup_method((PyObject *)type, &PyId_mro);
if (mro == NULL)
return -1;
result = PyObject_CallObject(mro, NULL);
@@ -1591,7 +1630,7 @@ mro_internal(PyTypeObject *type)
type->tp_mro = tuple;
type_mro_modified(type, type->tp_mro);
- /* corner case: the old-style super class might have been hidden
+ /* corner case: the super class might have been hidden
from the custom MRO */
type_mro_modified(type, type->tp_bases);
@@ -1648,9 +1687,8 @@ best_base(PyObject *bases)
return NULL;
}
}
- if (base == NULL)
- PyErr_SetString(PyExc_TypeError,
- "a new-style class can't have only classic bases");
+ assert (base != NULL);
+
return base;
}
@@ -1718,15 +1756,9 @@ get_builtin_base_with_dict(PyTypeObject *type)
static PyObject *
get_dict_descriptor(PyTypeObject *type)
{
- static PyObject *dict_str;
PyObject *descr;
- if (dict_str == NULL) {
- dict_str = PyUnicode_InternFromString("__dict__");
- if (dict_str == NULL)
- return NULL;
- }
- descr = _PyType_Lookup(type, dict_str);
+ descr = _PyType_LookupId(type, &PyId___dict__);
if (descr == NULL || !PyDescr_IsData(descr))
return NULL;
@@ -1744,8 +1776,6 @@ raise_dict_descr_error(PyObject *obj)
static PyObject *
subtype_dict(PyObject *obj, void *context)
{
- PyObject **dictptr;
- PyObject *dict;
PyTypeObject *base;
base = get_builtin_base_with_dict(Py_TYPE(obj));
@@ -1763,25 +1793,13 @@ subtype_dict(PyObject *obj, void *context)
}
return func(descr, obj, (PyObject *)(Py_TYPE(obj)));
}
-
- dictptr = _PyObject_GetDictPtr(obj);
- if (dictptr == NULL) {
- PyErr_SetString(PyExc_AttributeError,
- "This object has no __dict__");
- return NULL;
- }
- dict = *dictptr;
- if (dict == NULL)
- *dictptr = dict = PyDict_New();
- Py_XINCREF(dict);
- return dict;
+ return PyObject_GenericGetDict(obj, context);
}
static int
subtype_setdict(PyObject *obj, PyObject *value, void *context)
{
- PyObject **dictptr;
- PyObject *dict;
+ PyObject *dict, **dictptr;
PyTypeObject *base;
base = get_builtin_base_with_dict(Py_TYPE(obj));
@@ -1799,7 +1817,7 @@ subtype_setdict(PyObject *obj, PyObject *value, void *context)
}
return func(descr, obj, value);
}
-
+ /* Almost like PyObject_GenericSetDict, but allow __dict__ to be deleted. */
dictptr = _PyObject_GetDictPtr(obj);
if (dictptr == NULL) {
PyErr_SetString(PyExc_AttributeError,
@@ -1960,14 +1978,16 @@ _PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases)
static PyObject *
type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
{
- PyObject *name, *bases, *dict;
+ PyObject *name, *bases = NULL, *orig_dict, *dict = NULL;
static char *kwlist[] = {"name", "bases", "dict", 0};
- PyObject *slots, *tmp, *newslots;
- PyTypeObject *type, *base, *tmptype, *winner;
+ PyObject *qualname, *slots = NULL, *tmp, *newslots;
+ PyTypeObject *type = NULL, *base, *tmptype, *winner;
PyHeapTypeObject *et;
PyMemberDef *mp;
Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
int j, may_add_dict, may_add_weak;
+ _Py_IDENTIFIER(__qualname__);
+ _Py_IDENTIFIER(__slots__);
assert(args != NULL && PyTuple_Check(args));
assert(kwds == NULL || PyDict_Check(kwds));
@@ -1997,7 +2017,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist,
&name,
&PyTuple_Type, &bases,
- &PyDict_Type, &dict))
+ &PyDict_Type, &orig_dict))
return NULL;
/* Determine the proper metatype to deal with this: */
@@ -2017,30 +2037,30 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
if (nbases == 0) {
bases = PyTuple_Pack(1, &PyBaseObject_Type);
if (bases == NULL)
- return NULL;
+ goto error;
nbases = 1;
}
else
Py_INCREF(bases);
- /* XXX From here until type is allocated, "return NULL" leaks bases! */
-
/* Calculate best base, and check that all bases are type objects */
base = best_base(bases);
if (base == NULL) {
- Py_DECREF(bases);
- return NULL;
+ goto error;
}
if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
PyErr_Format(PyExc_TypeError,
"type '%.100s' is not an acceptable base type",
base->tp_name);
- Py_DECREF(bases);
- return NULL;
+ goto error;
}
+ dict = PyDict_Copy(orig_dict);
+ if (dict == NULL)
+ goto error;
+
/* Check for a __slots__ sequence variable in dict, and count it */
- slots = PyDict_GetItemString(dict, "__slots__");
+ slots = _PyDict_GetItemId(dict, &PyId___slots__);
nslots = 0;
add_dict = 0;
add_weak = 0;
@@ -2062,10 +2082,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
slots = PyTuple_Pack(1, slots);
else
slots = PySequence_Tuple(slots);
- if (slots == NULL) {
- Py_DECREF(bases);
- return NULL;
- }
+ if (slots == NULL)
+ goto error;
assert(PyTuple_Check(slots));
/* Are slots allowed? */
@@ -2075,24 +2093,21 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
"nonempty __slots__ "
"not supported for subtype of '%s'",
base->tp_name);
- bad_slots:
- Py_DECREF(bases);
- Py_DECREF(slots);
- return NULL;
+ goto error;
}
/* Check for valid slot names and two special cases */
for (i = 0; i < nslots; i++) {
PyObject *tmp = PyTuple_GET_ITEM(slots, i);
if (!valid_identifier(tmp))
- goto bad_slots;
+ goto error;
assert(PyUnicode_Check(tmp));
if (PyUnicode_CompareWithASCIIString(tmp, "__dict__") == 0) {
if (!may_add_dict || add_dict) {
PyErr_SetString(PyExc_TypeError,
"__dict__ slot disallowed: "
"we already got one");
- goto bad_slots;
+ goto error;
}
add_dict++;
}
@@ -2102,7 +2117,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
"__weakref__ slot disallowed: "
"either we already got one, "
"or __itemsize__ != 0");
- goto bad_slots;
+ goto error;
}
add_weak++;
}
@@ -2114,7 +2129,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
*/
newslots = PyList_New(nslots - add_dict - add_weak);
if (newslots == NULL)
- goto bad_slots;
+ goto error;
for (i = j = 0; i < nslots; i++) {
tmp = PyTuple_GET_ITEM(slots, i);
if ((add_dict &&
@@ -2125,25 +2140,29 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
tmp =_Py_Mangle(name, tmp);
if (!tmp) {
Py_DECREF(newslots);
- goto bad_slots;
+ goto error;
}
PyList_SET_ITEM(newslots, j, tmp);
+ if (PyDict_GetItem(dict, tmp)) {
+ PyErr_Format(PyExc_ValueError,
+ "%R in __slots__ conflicts with class variable",
+ tmp);
+ Py_DECREF(newslots);
+ goto error;
+ }
j++;
}
assert(j == nslots - add_dict - add_weak);
nslots = j;
- Py_DECREF(slots);
+ Py_CLEAR(slots);
if (PyList_Sort(newslots) == -1) {
- Py_DECREF(bases);
Py_DECREF(newslots);
- return NULL;
+ goto error;
}
slots = PyList_AsTuple(newslots);
Py_DECREF(newslots);
- if (slots == NULL) {
- Py_DECREF(bases);
- return NULL;
- }
+ if (slots == NULL)
+ goto error;
/* Secondary bases may provide weakrefs or dict */
if (nbases > 1 &&
@@ -2171,22 +2190,17 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
}
}
- /* XXX From here until type is safely allocated,
- "return NULL" may leak slots! */
-
/* Allocate the type object */
type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
- if (type == NULL) {
- Py_XDECREF(slots);
- Py_DECREF(bases);
- return NULL;
- }
+ if (type == NULL)
+ goto error;
/* Keep name and slots alive in the extended type object */
et = (PyHeapTypeObject *)type;
Py_INCREF(name);
et->ht_name = name;
et->ht_slots = slots;
+ slots = NULL;
/* Initialize tp_flags */
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
@@ -2200,59 +2214,68 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_as_mapping = &et->as_mapping;
type->tp_as_buffer = &et->as_buffer;
type->tp_name = _PyUnicode_AsString(name);
- if (!type->tp_name) {
- Py_DECREF(type);
- return NULL;
- }
+ if (!type->tp_name)
+ goto error;
/* Set tp_base and tp_bases */
type->tp_bases = bases;
+ bases = NULL;
Py_INCREF(base);
type->tp_base = base;
/* Initialize tp_dict from passed-in dict */
- type->tp_dict = dict = PyDict_Copy(dict);
- if (dict == NULL) {
- Py_DECREF(type);
- return NULL;
- }
+ Py_INCREF(dict);
+ type->tp_dict = dict;
/* Set __module__ in the dict */
- if (PyDict_GetItemString(dict, "__module__") == NULL) {
+ if (_PyDict_GetItemId(dict, &PyId___module__) == NULL) {
tmp = PyEval_GetGlobals();
if (tmp != NULL) {
- tmp = PyDict_GetItemString(tmp, "__name__");
+ tmp = _PyDict_GetItemId(tmp, &PyId___name__);
if (tmp != NULL) {
- if (PyDict_SetItemString(dict, "__module__",
- tmp) < 0)
- return NULL;
+ if (_PyDict_SetItemId(dict, &PyId___module__,
+ tmp) < 0)
+ goto error;
}
}
}
+ /* Set ht_qualname to dict['__qualname__'] if available, else to
+ __name__. The __qualname__ accessor will look for ht_qualname.
+ */
+ qualname = _PyDict_GetItemId(dict, &PyId___qualname__);
+ if (qualname != NULL) {
+ if (!PyUnicode_Check(qualname)) {
+ PyErr_Format(PyExc_TypeError,
+ "type __qualname__ must be a str, not %s",
+ Py_TYPE(qualname)->tp_name);
+ goto error;
+ }
+ }
+ et->ht_qualname = qualname ? qualname : et->ht_name;
+ Py_INCREF(et->ht_qualname);
+ if (qualname != NULL && PyDict_DelItem(dict, PyId___qualname__.object) < 0)
+ goto error;
+
/* Set tp_doc to a copy of dict['__doc__'], if the latter is there
and is a string. The __doc__ accessor will first look for tp_doc;
if that fails, it will still look into __dict__.
*/
{
- PyObject *doc = PyDict_GetItemString(dict, "__doc__");
+ PyObject *doc = _PyDict_GetItemId(dict, &PyId___doc__);
if (doc != NULL && PyUnicode_Check(doc)) {
Py_ssize_t len;
char *doc_str;
char *tp_doc;
doc_str = _PyUnicode_AsString(doc);
- if (doc_str == NULL) {
- Py_DECREF(type);
- return NULL;
- }
+ if (doc_str == NULL)
+ goto error;
/* Silently truncate the docstring if it contains null bytes. */
len = strlen(doc_str);
tp_doc = (char *)PyObject_MALLOC(len + 1);
- if (tp_doc == NULL) {
- Py_DECREF(type);
- return NULL;
- }
+ if (tp_doc == NULL)
+ goto error;
memcpy(tp_doc, doc_str, len + 1);
type->tp_doc = tp_doc;
}
@@ -2260,28 +2283,25 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Special-case __new__: if it's a plain function,
make it a static function */
- tmp = PyDict_GetItemString(dict, "__new__");
+ tmp = _PyDict_GetItemId(dict, &PyId___new__);
if (tmp != NULL && PyFunction_Check(tmp)) {
tmp = PyStaticMethod_New(tmp);
- if (tmp == NULL) {
- Py_DECREF(type);
- return NULL;
- }
- PyDict_SetItemString(dict, "__new__", tmp);
+ if (tmp == NULL)
+ goto error;
+ if (_PyDict_SetItemId(dict, &PyId___new__, tmp) < 0)
+ goto error;
Py_DECREF(tmp);
}
/* Add descriptors for custom slots from __slots__, or for __dict__ */
mp = PyHeapType_GET_MEMBERS(et);
slotoffset = base->tp_basicsize;
- if (slots != NULL) {
+ if (et->ht_slots != NULL) {
for (i = 0; i < nslots; i++, mp++) {
mp->name = _PyUnicode_AsString(
- PyTuple_GET_ITEM(slots, i));
- if (mp->name == NULL) {
- Py_DECREF(type);
- return NULL;
- }
+ PyTuple_GET_ITEM(et->ht_slots, i));
+ if (mp->name == NULL)
+ goto error;
mp->type = T_OBJECT_EX;
mp->offset = slotoffset;
@@ -2299,6 +2319,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_dictoffset = slotoffset;
slotoffset += sizeof(PyObject *);
}
+ if (type->tp_dictoffset) {
+ et->ht_cached_keys = _PyDict_NewKeysForClass();
+ }
if (add_weak) {
assert(!base->tp_itemsize);
type->tp_weaklistoffset = slotoffset;
@@ -2342,15 +2365,21 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_free = PyObject_Del;
/* Initialize the rest */
- if (PyType_Ready(type) < 0) {
- Py_DECREF(type);
- return NULL;
- }
+ if (PyType_Ready(type) < 0)
+ goto error;
/* Put the proper slots in place */
fixup_slot_dispatchers(type);
+ Py_DECREF(dict);
return (PyObject *)type;
+
+error:
+ Py_XDECREF(dict);
+ Py_XDECREF(bases);
+ Py_XDECREF(slots);
+ Py_XDECREF(type);
+ return NULL;
}
static short slotoffsets[] = {
@@ -2359,30 +2388,89 @@ static short slotoffsets[] = {
};
PyObject *
-PyType_FromSpec(PyType_Spec *spec)
+PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
{
PyHeapTypeObject *res = (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
+ PyTypeObject *type, *base;
+ char *s;
char *res_start = (char*)res;
PyType_Slot *slot;
+
+ /* Set the type name and qualname */
+ s = strrchr(spec->name, '.');
+ if (s == NULL)
+ s = (char*)spec->name;
+ else
+ s++;
if (res == NULL)
- return NULL;
- res->ht_name = PyUnicode_FromString(spec->name);
+ return NULL;
+ type = &res->ht_type;
+ /* The flags must be initialized early, before the GC traverses us */
+ type->tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE;
+ res->ht_name = PyUnicode_FromString(s);
if (!res->ht_name)
goto fail;
- res->ht_type.tp_name = _PyUnicode_AsString(res->ht_name);
- if (!res->ht_type.tp_name)
+ res->ht_qualname = res->ht_name;
+ Py_INCREF(res->ht_qualname);
+ type->tp_name = spec->name;
+ if (!type->tp_name)
+ goto fail;
+
+ /* Adjust for empty tuple bases */
+ if (!bases) {
+ base = &PyBaseObject_Type;
+ /* See whether Py_tp_base(s) was specified */
+ for (slot = spec->slots; slot->slot; slot++) {
+ if (slot->slot == Py_tp_base)
+ base = slot->pfunc;
+ else if (slot->slot == Py_tp_bases) {
+ bases = slot->pfunc;
+ Py_INCREF(bases);
+ }
+ }
+ if (!bases)
+ bases = PyTuple_Pack(1, base);
+ if (!bases)
+ goto fail;
+ }
+ else
+ Py_INCREF(bases);
+
+ /* Calculate best base, and check that all bases are type objects */
+ base = best_base(bases);
+ if (base == NULL) {
+ goto fail;
+ }
+ if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
+ PyErr_Format(PyExc_TypeError,
+ "type '%.100s' is not an acceptable base type",
+ base->tp_name);
goto fail;
+ }
+
+ /* Initialize essential fields */
+ type->tp_as_number = &res->as_number;
+ type->tp_as_sequence = &res->as_sequence;
+ type->tp_as_mapping = &res->as_mapping;
+ type->tp_as_buffer = &res->as_buffer;
+ /* Set tp_base and tp_bases */
+ type->tp_bases = bases;
+ bases = NULL;
+ Py_INCREF(base);
+ type->tp_base = base;
- res->ht_type.tp_basicsize = spec->basicsize;
- res->ht_type.tp_itemsize = spec->itemsize;
- res->ht_type.tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE;
+ type->tp_basicsize = spec->basicsize;
+ type->tp_itemsize = spec->itemsize;
for (slot = spec->slots; slot->slot; slot++) {
- if (slot->slot >= sizeof(slotoffsets)/sizeof(slotoffsets[0])) {
+ if (slot->slot >= Py_ARRAY_LENGTH(slotoffsets)) {
PyErr_SetString(PyExc_RuntimeError, "invalid slot offset");
goto fail;
}
+ if (slot->slot == Py_tp_base || slot->slot == Py_tp_bases)
+ /* Processed above */
+ continue;
*(void**)(res_start + slotoffsets[slot->slot]) = slot->pfunc;
/* need to make a copy of the docstring slot, which usually
@@ -2393,19 +2481,29 @@ PyType_FromSpec(PyType_Spec *spec)
if (tp_doc == NULL)
goto fail;
memcpy(tp_doc, slot->pfunc, len);
- res->ht_type.tp_doc = tp_doc;
+ type->tp_doc = tp_doc;
}
}
- if (res->ht_type.tp_dealloc == NULL) {
+ if (type->tp_dictoffset) {
+ res->ht_cached_keys = _PyDict_NewKeysForClass();
+ }
+ if (type->tp_dealloc == NULL) {
/* It's a heap type, so needs the heap types' dealloc.
subtype_dealloc will call the base type's tp_dealloc, if
necessary. */
- res->ht_type.tp_dealloc = subtype_dealloc;
+ type->tp_dealloc = subtype_dealloc;
}
- if (PyType_Ready(&res->ht_type) < 0)
+ if (PyType_Ready(type) < 0)
goto fail;
+ /* Set type.__module__ */
+ s = strrchr(spec->name, '.');
+ if (s != NULL)
+ _PyDict_SetItemId(type->tp_dict, &PyId___module__,
+ PyUnicode_FromStringAndSize(
+ spec->name, (Py_ssize_t)(s - spec->name)));
+
return (PyObject*)res;
fail:
@@ -2413,6 +2511,12 @@ PyType_FromSpec(PyType_Spec *spec)
return NULL;
}
+PyObject *
+PyType_FromSpec(PyType_Spec *spec)
+{
+ return PyType_FromSpecWithBases(spec, NULL);
+}
+
/* Internal API to look for a name through the MRO.
This returns a borrowed reference, and doesn't set an exception! */
@@ -2442,6 +2546,9 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
return NULL;
res = NULL;
+ /* keep a strong reference to mro because type->tp_mro can be replaced
+ during PyDict_GetItem(dict, name) */
+ Py_INCREF(mro);
assert(PyTuple_Check(mro));
n = PyTuple_GET_SIZE(mro);
for (i = 0; i < n; i++) {
@@ -2453,6 +2560,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
if (res != NULL)
break;
}
+ Py_DECREF(mro);
if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) {
h = MCACHE_HASH_METHOD(type, name);
@@ -2465,6 +2573,16 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
return res;
}
+static PyObject *
+_PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name)
+{
+ PyObject *oname;
+ oname = _PyUnicode_FromId(name); /* borrowed */
+ if (oname == NULL)
+ return NULL;
+ return _PyType_Lookup(type, oname);
+}
+
/* This is similar to PyObject_GenericGetAttr(),
but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
static PyObject *
@@ -2564,6 +2682,9 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
return update_slot(type, name);
}
+extern void
+_PyDictKeys_DecRef(PyDictKeysObject *keys);
+
static void
type_dealloc(PyTypeObject *type)
{
@@ -2585,7 +2706,10 @@ type_dealloc(PyTypeObject *type)
*/
PyObject_Free((char *)type->tp_doc);
Py_XDECREF(et->ht_name);
+ Py_XDECREF(et->ht_qualname);
Py_XDECREF(et->ht_slots);
+ if (et->ht_cached_keys)
+ _PyDictKeys_DecRef(et->ht_cached_keys);
Py_TYPE(type)->tp_free((PyObject *)type);
}
@@ -2623,6 +2747,99 @@ type_prepare(PyObject *self, PyObject *args, PyObject *kwds)
return PyDict_New();
}
+/*
+ Merge the __dict__ of aclass into dict, and recursively also all
+ the __dict__s of aclass's base classes. The order of merging isn't
+ defined, as it's expected that only the final set of dict keys is
+ interesting.
+ Return 0 on success, -1 on error.
+*/
+
+static int
+merge_class_dict(PyObject *dict, PyObject *aclass)
+{
+ PyObject *classdict;
+ PyObject *bases;
+ _Py_IDENTIFIER(__bases__);
+
+ assert(PyDict_Check(dict));
+ assert(aclass);
+
+ /* Merge in the type's dict (if any). */
+ classdict = _PyObject_GetAttrId(aclass, &PyId___dict__);
+ if (classdict == NULL)
+ PyErr_Clear();
+ else {
+ int status = PyDict_Update(dict, classdict);
+ Py_DECREF(classdict);
+ if (status < 0)
+ return -1;
+ }
+
+ /* Recursively merge in the base types' (if any) dicts. */
+ bases = _PyObject_GetAttrId(aclass, &PyId___bases__);
+ if (bases == NULL)
+ PyErr_Clear();
+ else {
+ /* We have no guarantee that bases is a real tuple */
+ Py_ssize_t i, n;
+ n = PySequence_Size(bases); /* This better be right */
+ if (n < 0)
+ PyErr_Clear();
+ else {
+ for (i = 0; i < n; i++) {
+ int status;
+ PyObject *base = PySequence_GetItem(bases, i);
+ if (base == NULL) {
+ Py_DECREF(bases);
+ return -1;
+ }
+ status = merge_class_dict(dict, base);
+ Py_DECREF(base);
+ if (status < 0) {
+ Py_DECREF(bases);
+ return -1;
+ }
+ }
+ }
+ Py_DECREF(bases);
+ }
+ return 0;
+}
+
+/* __dir__ for type objects: returns __dict__ and __bases__.
+ We deliberately don't suck up its __class__, as methods belonging to the
+ metaclass would probably be more confusing than helpful.
+*/
+static PyObject *
+type_dir(PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+ PyObject *dict = PyDict_New();
+
+ if (dict != NULL && merge_class_dict(dict, self) == 0)
+ result = PyDict_Keys(dict);
+
+ Py_XDECREF(dict);
+ return result;
+}
+
+static PyObject*
+type_sizeof(PyObject *self, PyObject *args_unused)
+{
+ Py_ssize_t size;
+ PyTypeObject *type = (PyTypeObject*)self;
+ if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
+ PyHeapTypeObject* et = (PyHeapTypeObject*)type;
+ size = sizeof(PyHeapTypeObject);
+ if (et->ht_cached_keys)
+ size += _PyDict_KeysSize(et->ht_cached_keys);
+ }
+ else
+ size = sizeof(PyTypeObject);
+ return PyLong_FromSsize_t(size);
+}
+
static PyMethodDef type_methods[] = {
{"mro", (PyCFunction)mro_external, METH_NOARGS,
PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
@@ -2636,6 +2853,10 @@ static PyMethodDef type_methods[] = {
PyDoc_STR("__instancecheck__() -> bool\ncheck if an object is an instance")},
{"__subclasscheck__", type___subclasscheck__, METH_O,
PyDoc_STR("__subclasscheck__() -> bool\ncheck if a class is a subclass")},
+ {"__dir__", type_dir, METH_NOARGS,
+ PyDoc_STR("__dir__() -> list\nspecialized __dir__ implementation for types")},
+ {"__sizeof__", type_sizeof, METH_NOARGS,
+ "__sizeof__() -> int\nreturn memory consumption of the type object"},
{0}
};
@@ -2648,7 +2869,12 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg)
{
/* Because of type_is_gc(), the collector only calls this
for heaptypes. */
- assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
+ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ char msg[200];
+ sprintf(msg, "type_traverse() called for non-heap type '%.100s'",
+ type->tp_name);
+ Py_FatalError(msg);
+ }
Py_VISIT(type->tp_dict);
Py_VISIT(type->tp_cache);
@@ -2667,6 +2893,7 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg)
static int
type_clear(PyTypeObject *type)
{
+ PyDictKeysObject *cached_keys;
/* Because of type_is_gc(), the collector only calls this
for heaptypes. */
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
@@ -2698,6 +2925,11 @@ type_clear(PyTypeObject *type)
*/
PyType_Modified(type);
+ cached_keys = ((PyHeapTypeObject *)type)->ht_cached_keys;
+ if (cached_keys != NULL) {
+ ((PyHeapTypeObject *)type)->ht_cached_keys = NULL;
+ _PyDictKeys_DecRef(cached_keys);
+ }
if (type->tp_dict)
PyDict_Clear(type->tp_dict);
Py_CLEAR(type->tp_mro);
@@ -2813,22 +3045,11 @@ static int
object_init(PyObject *self, PyObject *args, PyObject *kwds)
{
int err = 0;
- if (excess_args(args, kwds)) {
- PyTypeObject *type = Py_TYPE(self);
- if (type->tp_init != object_init &&
- type->tp_new != object_new)
- {
- err = PyErr_WarnEx(PyExc_DeprecationWarning,
- "object.__init__() takes no parameters",
- 1);
- }
- else if (type->tp_init != object_init ||
- type->tp_new == object_new)
- {
- PyErr_SetString(PyExc_TypeError,
- "object.__init__() takes no parameters");
- err = -1;
- }
+ PyTypeObject *type = Py_TYPE(self);
+ if (excess_args(args, kwds) &&
+ (type->tp_new == object_new || type->tp_init != object_init)) {
+ PyErr_SetString(PyExc_TypeError, "object.__init__() takes no parameters");
+ err = -1;
}
return err;
}
@@ -2836,33 +3057,21 @@ object_init(PyObject *self, PyObject *args, PyObject *kwds)
static PyObject *
object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- int err = 0;
- if (excess_args(args, kwds)) {
- if (type->tp_new != object_new &&
- type->tp_init != object_init)
- {
- err = PyErr_WarnEx(PyExc_DeprecationWarning,
- "object.__new__() takes no parameters",
- 1);
- }
- else if (type->tp_new != object_new ||
- type->tp_init == object_init)
- {
- PyErr_SetString(PyExc_TypeError,
- "object.__new__() takes no parameters");
- err = -1;
- }
- }
- if (err < 0)
+ if (excess_args(args, kwds) &&
+ (type->tp_init == object_init || type->tp_new != object_new)) {
+ PyErr_SetString(PyExc_TypeError, "object.__new__() takes no parameters");
return NULL;
+ }
if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
- static PyObject *comma = NULL;
PyObject *abstract_methods = NULL;
PyObject *builtins;
PyObject *sorted;
PyObject *sorted_methods = NULL;
PyObject *joined = NULL;
+ PyObject *comma;
+ _Py_static_string(comma_id, ", ");
+ _Py_IDENTIFIER(sorted);
/* Compute ", ".join(sorted(type.__abstractmethods__))
into joined. */
@@ -2872,7 +3081,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
builtins = PyEval_GetBuiltins();
if (builtins == NULL)
goto error;
- sorted = PyDict_GetItemString(builtins, "sorted");
+ sorted = _PyDict_GetItemId(builtins, &PyId_sorted);
if (sorted == NULL)
goto error;
sorted_methods = PyObject_CallFunctionObjArgs(sorted,
@@ -2880,13 +3089,10 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
NULL);
if (sorted_methods == NULL)
goto error;
- if (comma == NULL) {
- comma = PyUnicode_InternFromString(", ");
- if (comma == NULL)
- goto error;
- }
- joined = PyObject_CallMethod(comma, "join",
- "O", sorted_methods);
+ comma = _PyUnicode_FromId(&comma_id);
+ if (comma == NULL)
+ goto error;
+ joined = PyUnicode_Join(comma, sorted_methods);
if (joined == NULL)
goto error;
@@ -2924,7 +3130,7 @@ object_repr(PyObject *self)
Py_DECREF(mod);
mod = NULL;
}
- name = type_name(type, NULL);
+ name = type_qualname(type, NULL);
if (name == NULL) {
Py_XDECREF(mod);
return NULL;
@@ -3089,7 +3295,7 @@ object_set_class(PyObject *self, PyObject *value, void *closure)
}
if (!PyType_Check(value)) {
PyErr_Format(PyExc_TypeError,
- "__class__ must be set to new-style class, not '%s' object",
+ "__class__ must be set to a class, not '%s' object",
Py_TYPE(value)->tp_name);
return -1;
}
@@ -3130,14 +3336,19 @@ static PyObject *
import_copyreg(void)
{
static PyObject *copyreg_str;
+ static PyObject *mod_copyreg = NULL;
if (!copyreg_str) {
copyreg_str = PyUnicode_InternFromString("copyreg");
if (copyreg_str == NULL)
return NULL;
}
+ if (!mod_copyreg) {
+ mod_copyreg = PyImport_Import(copyreg_str);
+ }
- return PyImport_Import(copyreg_str);
+ Py_XINCREF(mod_copyreg);
+ return mod_copyreg;
}
static PyObject *
@@ -3146,14 +3357,11 @@ slotnames(PyObject *cls)
PyObject *clsdict;
PyObject *copyreg;
PyObject *slotnames;
-
- if (!PyType_Check(cls)) {
- Py_INCREF(Py_None);
- return Py_None;
- }
+ _Py_IDENTIFIER(__slotnames__);
+ _Py_IDENTIFIER(_slotnames);
clsdict = ((PyTypeObject *)cls)->tp_dict;
- slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
+ slotnames = _PyDict_GetItemId(clsdict, &PyId___slotnames__);
if (slotnames != NULL && PyList_Check(slotnames)) {
Py_INCREF(slotnames);
return slotnames;
@@ -3163,7 +3371,7 @@ slotnames(PyObject *cls)
if (copyreg == NULL)
return NULL;
- slotnames = PyObject_CallMethod(copyreg, "_slotnames", "O", cls);
+ slotnames = _PyObject_CallMethodId(copyreg, &PyId__slotnames, "O", cls);
Py_DECREF(copyreg);
if (slotnames != NULL &&
slotnames != Py_None &&
@@ -3187,12 +3395,13 @@ reduce_2(PyObject *obj)
PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
PyObject *copyreg = NULL, *newobj = NULL, *res = NULL;
Py_ssize_t i, n;
+ _Py_IDENTIFIER(__getnewargs__);
+ _Py_IDENTIFIER(__getstate__);
+ _Py_IDENTIFIER(__newobj__);
- cls = PyObject_GetAttrString(obj, "__class__");
- if (cls == NULL)
- return NULL;
+ cls = (PyObject *) Py_TYPE(obj);
- getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
+ getnewargs = _PyObject_GetAttrId(obj, &PyId___getnewargs__);
if (getnewargs != NULL) {
args = PyObject_CallObject(getnewargs, NULL);
Py_DECREF(getnewargs);
@@ -3210,7 +3419,7 @@ reduce_2(PyObject *obj)
if (args == NULL)
goto end;
- getstate = PyObject_GetAttrString(obj, "__getstate__");
+ getstate = _PyObject_GetAttrId(obj, &PyId___getstate__);
if (getstate != NULL) {
state = PyObject_CallObject(getstate, NULL);
Py_DECREF(getstate);
@@ -3218,17 +3427,18 @@ reduce_2(PyObject *obj)
goto end;
}
else {
+ PyObject **dict;
PyErr_Clear();
- state = PyObject_GetAttrString(obj, "__dict__");
- if (state == NULL) {
- PyErr_Clear();
+ dict = _PyObject_GetDictPtr(obj);
+ if (dict && *dict)
+ state = *dict;
+ else
state = Py_None;
- Py_INCREF(state);
- }
+ Py_INCREF(state);
names = slotnames(cls);
if (names == NULL)
goto end;
- if (names != Py_None) {
+ if (names != Py_None && PyList_GET_SIZE(names) > 0) {
assert(PyList_Check(names));
slots = PyDict_New();
if (slots == NULL)
@@ -3275,7 +3485,8 @@ reduce_2(PyObject *obj)
Py_INCREF(dictitems);
}
else {
- PyObject *items = PyObject_CallMethod(obj, "items", "");
+ _Py_IDENTIFIER(items);
+ PyObject *items = _PyObject_CallMethodId(obj, &PyId_items, "");
if (items == NULL)
goto end;
dictitems = PyObject_GetIter(items);
@@ -3287,7 +3498,7 @@ reduce_2(PyObject *obj)
copyreg = import_copyreg();
if (copyreg == NULL)
goto end;
- newobj = PyObject_GetAttrString(copyreg, "__newobj__");
+ newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj__);
if (newobj == NULL)
goto end;
@@ -3295,8 +3506,8 @@ reduce_2(PyObject *obj)
args2 = PyTuple_New(n+1);
if (args2 == NULL)
goto end;
+ Py_INCREF(cls);
PyTuple_SET_ITEM(args2, 0, cls);
- cls = NULL;
for (i = 0; i < n; i++) {
PyObject *v = PyTuple_GET_ITEM(args, i);
Py_INCREF(v);
@@ -3306,7 +3517,6 @@ reduce_2(PyObject *obj)
res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
end:
- Py_XDECREF(cls);
Py_XDECREF(args);
Py_XDECREF(args2);
Py_XDECREF(slots);
@@ -3366,31 +3576,34 @@ object_reduce(PyObject *self, PyObject *args)
static PyObject *
object_reduce_ex(PyObject *self, PyObject *args)
{
+ static PyObject *objreduce;
PyObject *reduce, *res;
int proto = 0;
+ _Py_IDENTIFIER(__reduce__);
if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
return NULL;
- reduce = PyObject_GetAttrString(self, "__reduce__");
+ if (objreduce == NULL) {
+ objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict,
+ &PyId___reduce__);
+ if (objreduce == NULL)
+ return NULL;
+ }
+
+ reduce = _PyObject_GetAttrId(self, &PyId___reduce__);
if (reduce == NULL)
PyErr_Clear();
else {
- PyObject *cls, *clsreduce, *objreduce;
+ PyObject *cls, *clsreduce;
int override;
- cls = PyObject_GetAttrString(self, "__class__");
- if (cls == NULL) {
- Py_DECREF(reduce);
- return NULL;
- }
- clsreduce = PyObject_GetAttrString(cls, "__reduce__");
- Py_DECREF(cls);
+
+ cls = (PyObject *) Py_TYPE(self);
+ clsreduce = _PyObject_GetAttrId(cls, &PyId___reduce__);
if (clsreduce == NULL) {
Py_DECREF(reduce);
return NULL;
}
- objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
- "__reduce__");
override = (clsreduce != objreduce);
Py_DECREF(clsreduce);
if (override) {
@@ -3408,8 +3621,7 @@ object_reduce_ex(PyObject *self, PyObject *args)
static PyObject *
object_subclasshook(PyObject *cls, PyObject *args)
{
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
PyDoc_STRVAR(object_subclasshook_doc,
@@ -3440,21 +3652,21 @@ object_format(PyObject *self, PyObject *args)
self_as_str = PyObject_Str(self);
if (self_as_str != NULL) {
/* Issue 7994: If we're converting to a string, we
- should reject format specifications */
- if (PyUnicode_GET_SIZE(format_spec) > 0) {
- if (PyErr_WarnEx(PyExc_PendingDeprecationWarning,
- "object.__format__ with a non-empty format "
- "string is deprecated", 1) < 0) {
- goto done;
- }
- /* Eventually this will become an error:
- PyErr_Format(PyExc_TypeError,
- "non-empty format string passed to object.__format__");
- goto done;
- */
- }
-
- result = PyObject_Format(self_as_str, format_spec);
+ should reject format specifications */
+ if (PyUnicode_GET_LENGTH(format_spec) > 0) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "object.__format__ with a non-empty format "
+ "string is deprecated", 1) < 0) {
+ goto done;
+ }
+ /* Eventually this will become an error:
+ PyErr_Format(PyExc_TypeError,
+ "non-empty format string passed to object.__format__");
+ goto done;
+ */
+ }
+
+ result = PyObject_Format(self_as_str, format_spec);
}
done:
@@ -3477,6 +3689,53 @@ object_sizeof(PyObject *self, PyObject *args)
return PyLong_FromSsize_t(res);
}
+/* __dir__ for generic objects: returns __dict__, __class__,
+ and recursively up the __class__.__bases__ chain.
+*/
+static PyObject *
+object_dir(PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+ PyObject *dict = NULL;
+ PyObject *itsclass = NULL;
+
+ /* Get __dict__ (which may or may not be a real dict...) */
+ dict = _PyObject_GetAttrId(self, &PyId___dict__);
+ if (dict == NULL) {
+ PyErr_Clear();
+ dict = PyDict_New();
+ }
+ else if (!PyDict_Check(dict)) {
+ Py_DECREF(dict);
+ dict = PyDict_New();
+ }
+ else {
+ /* Copy __dict__ to avoid mutating it. */
+ PyObject *temp = PyDict_Copy(dict);
+ Py_DECREF(dict);
+ dict = temp;
+ }
+
+ if (dict == NULL)
+ goto error;
+
+ /* Merge in attrs reachable from its class. */
+ itsclass = _PyObject_GetAttrId(self, &PyId___class__);
+ if (itsclass == NULL)
+ /* XXX(tomer): Perhaps fall back to obj->ob_type if no
+ __class__ exists? */
+ PyErr_Clear();
+ else if (merge_class_dict(dict, itsclass) != 0)
+ goto error;
+
+ result = PyDict_Keys(dict);
+ /* fall through */
+error:
+ Py_XDECREF(itsclass);
+ Py_XDECREF(dict);
+ return result;
+}
+
static PyMethodDef object_methods[] = {
{"__reduce_ex__", object_reduce_ex, METH_VARARGS,
PyDoc_STR("helper for pickle")},
@@ -3488,6 +3747,8 @@ static PyMethodDef object_methods[] = {
PyDoc_STR("default object formatter")},
{"__sizeof__", object_sizeof, METH_NOARGS,
PyDoc_STR("__sizeof__() -> int\nsize of object in memory, in bytes")},
+ {"__dir__", object_dir, METH_NOARGS,
+ PyDoc_STR("__dir__() -> list\ndefault dir() implementation")},
{0}
};
@@ -3557,7 +3818,7 @@ add_methods(PyTypeObject *type, PyMethodDef *meth)
descr = PyDescr_NewClassMethod(type, meth);
}
else if (meth->ml_flags & METH_STATIC) {
- PyObject *cfunc = PyCFunction_New(meth, NULL);
+ PyObject *cfunc = PyCFunction_New(meth, (PyObject*)type);
if (cfunc == NULL)
return -1;
descr = PyStaticMethod_New(cfunc);
@@ -3638,8 +3899,8 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
that the extension type's own factory function ensures).
Heap types, of course, are under our control, so they do
inherit tp_new; static extension types that specify some
- other built-in type as the default are considered
- new-style-aware so they also inherit object.__new__. */
+ other built-in type as the default also
+ inherit object.__new__. */
if (base != &PyBaseObject_Type ||
(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
if (type->tp_new == NULL)
@@ -3678,23 +3939,17 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
}
-static char *hash_name_op[] = {
- "__eq__",
- "__hash__",
- NULL
-};
-
static int
overrides_hash(PyTypeObject *type)
{
- char **p;
PyObject *dict = type->tp_dict;
+ _Py_IDENTIFIER(__eq__);
assert(dict != NULL);
- for (p = hash_name_op; *p; p++) {
- if (PyDict_GetItemString(dict, *p) != NULL)
- return 1;
- }
+ if (_PyDict_GetItemId(dict, &PyId___eq__) != NULL)
+ return 1;
+ if (_PyDict_GetItemId(dict, &PyId___hash__) != NULL)
+ return 1;
return 0;
}
@@ -3980,16 +4235,16 @@ PyType_Ready(PyTypeObject *type)
/* if the type dictionary doesn't contain a __doc__, set it from
the tp_doc slot.
*/
- if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
+ if (_PyDict_GetItemId(type->tp_dict, &PyId___doc__) == NULL) {
if (type->tp_doc != NULL) {
PyObject *doc = PyUnicode_FromString(type->tp_doc);
if (doc == NULL)
goto error;
- PyDict_SetItemString(type->tp_dict, "__doc__", doc);
+ _PyDict_SetItemId(type->tp_dict, &PyId___doc__, doc);
Py_DECREF(doc);
} else {
- PyDict_SetItemString(type->tp_dict,
- "__doc__", Py_None);
+ _PyDict_SetItemId(type->tp_dict,
+ &PyId___doc__, Py_None);
}
}
@@ -4000,8 +4255,8 @@ PyType_Ready(PyTypeObject *type)
This signals that __hash__ is not inherited.
*/
if (type->tp_hash == NULL) {
- if (PyDict_GetItemString(type->tp_dict, "__hash__") == NULL) {
- if (PyDict_SetItemString(type->tp_dict, "__hash__", Py_None) < 0)
+ if (_PyDict_GetItemId(type->tp_dict, &PyId___hash__) == NULL) {
+ if (_PyDict_SetItemId(type->tp_dict, &PyId___hash__, Py_None) < 0)
goto error;
type->tp_hash = PyObject_HashNotImplemented;
}
@@ -4598,7 +4853,7 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
object.__new__(dict). To do this, we check that the
most derived base that's not a heap type is this type. */
staticbase = subtype;
- while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
+ while (staticbase && (staticbase->tp_new == slot_tp_new))
staticbase = staticbase->tp_base;
/* If staticbase is NULL now, it is a really weird type.
In the spirit of backwards compatibility (?), just shut up. */
@@ -4631,12 +4886,12 @@ add_tp_new_wrapper(PyTypeObject *type)
{
PyObject *func;
- if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
+ if (_PyDict_GetItemId(type->tp_dict, &PyId___new__) != NULL)
return 0;
func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
if (func == NULL)
return -1;
- if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
+ if (_PyDict_SetItemId(type->tp_dict, &PyId___new__, func)) {
Py_DECREF(func);
return -1;
}
@@ -4651,34 +4906,34 @@ add_tp_new_wrapper(PyTypeObject *type)
static PyObject * \
FUNCNAME(PyObject *self) \
{ \
- static PyObject *cache_str; \
- return call_method(self, OPSTR, &cache_str, "()"); \
+ _Py_static_string(id, OPSTR); \
+ return call_method(self, &id, "()"); \
}
#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
static PyObject * \
FUNCNAME(PyObject *self, ARG1TYPE arg1) \
{ \
- static PyObject *cache_str; \
- return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
+ _Py_static_string(id, OPSTR); \
+ return call_method(self, &id, "(" ARGCODES ")", arg1); \
}
/* Boolean helper for SLOT1BINFULL().
right.__class__ is a nontrivial subclass of left.__class__. */
static int
-method_is_overloaded(PyObject *left, PyObject *right, char *name)
+method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *name)
{
PyObject *a, *b;
int ok;
- b = PyObject_GetAttrString((PyObject *)(Py_TYPE(right)), name);
+ b = _PyObject_GetAttrId((PyObject *)(Py_TYPE(right)), name);
if (b == NULL) {
PyErr_Clear();
/* If right doesn't have it, it's not overloaded */
return 0;
}
- a = PyObject_GetAttrString((PyObject *)(Py_TYPE(left)), name);
+ a = _PyObject_GetAttrId((PyObject *)(Py_TYPE(left)), name);
if (a == NULL) {
PyErr_Clear();
Py_DECREF(b);
@@ -4702,7 +4957,8 @@ method_is_overloaded(PyObject *left, PyObject *right, char *name)
static PyObject * \
FUNCNAME(PyObject *self, PyObject *other) \
{ \
- static PyObject *cache_str, *rcache_str; \
+ _Py_static_string(op_id, OPSTR); \
+ _Py_static_string(rop_id, ROPSTR); \
int do_other = Py_TYPE(self) != Py_TYPE(other) && \
Py_TYPE(other)->tp_as_number != NULL && \
Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
@@ -4711,27 +4967,23 @@ FUNCNAME(PyObject *self, PyObject *other) \
PyObject *r; \
if (do_other && \
PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \
- method_is_overloaded(self, other, ROPSTR)) { \
- r = call_maybe( \
- other, ROPSTR, &rcache_str, "(O)", self); \
+ method_is_overloaded(self, other, &rop_id)) { \
+ r = call_maybe(other, &rop_id, "(O)", self); \
if (r != Py_NotImplemented) \
return r; \
Py_DECREF(r); \
do_other = 0; \
} \
- r = call_maybe( \
- self, OPSTR, &cache_str, "(O)", other); \
+ r = call_maybe(self, &op_id, "(O)", other); \
if (r != Py_NotImplemented || \
Py_TYPE(other) == Py_TYPE(self)) \
return r; \
Py_DECREF(r); \
} \
if (do_other) { \
- return call_maybe( \
- other, ROPSTR, &rcache_str, "(O)", self); \
+ return call_maybe(other, &rop_id, "(O)", self); \
} \
- Py_INCREF(Py_NotImplemented); \
- return Py_NotImplemented; \
+ Py_RETURN_NOTIMPLEMENTED; \
}
#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
@@ -4741,16 +4993,15 @@ FUNCNAME(PyObject *self, PyObject *other) \
static PyObject * \
FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
{ \
- static PyObject *cache_str; \
- return call_method(self, OPSTR, &cache_str, \
- "(" ARGCODES ")", arg1, arg2); \
+ _Py_static_string(id, #OPSTR); \
+ return call_method(self, &id, "(" ARGCODES ")", arg1, arg2); \
}
static Py_ssize_t
slot_sq_length(PyObject *self)
{
- static PyObject *len_str;
- PyObject *res = call_method(self, "__len__", &len_str, "()");
+ _Py_IDENTIFIER(__len__);
+ PyObject *res = call_method(self, &PyId___len__, "()");
Py_ssize_t len;
if (res == NULL)
@@ -4771,16 +5022,10 @@ slot_sq_length(PyObject *self)
static PyObject *
slot_sq_item(PyObject *self, Py_ssize_t i)
{
- static PyObject *getitem_str;
PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
descrgetfunc f;
- if (getitem_str == NULL) {
- getitem_str = PyUnicode_InternFromString("__getitem__");
- if (getitem_str == NULL)
- return NULL;
- }
- func = _PyType_Lookup(Py_TYPE(self), getitem_str);
+ func = _PyType_LookupId(Py_TYPE(self), &PyId___getitem__);
if (func != NULL) {
if ((f = Py_TYPE(func)->tp_descr_get) == NULL)
Py_INCREF(func);
@@ -4803,6 +5048,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i)
}
}
else {
+ PyObject *getitem_str = _PyUnicode_FromId(&PyId___getitem__);
PyErr_SetObject(PyExc_AttributeError, getitem_str);
}
Py_XDECREF(args);
@@ -4815,14 +5061,13 @@ static int
slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
{
PyObject *res;
- static PyObject *delitem_str, *setitem_str;
+ _Py_IDENTIFIER(__delitem__);
+ _Py_IDENTIFIER(__setitem__);
if (value == NULL)
- res = call_method(self, "__delitem__", &delitem_str,
- "(n)", index);
+ res = call_method(self, &PyId___delitem__, "(n)", index);
else
- res = call_method(self, "__setitem__", &setitem_str,
- "(nO)", index, value);
+ res = call_method(self, &PyId___setitem__, "(nO)", index, value);
if (res == NULL)
return -1;
Py_DECREF(res);
@@ -4834,10 +5079,9 @@ slot_sq_contains(PyObject *self, PyObject *value)
{
PyObject *func, *res, *args;
int result = -1;
+ _Py_IDENTIFIER(__contains__);
- static PyObject *contains_str;
-
- func = lookup_maybe(self, "__contains__", &contains_str);
+ func = lookup_maybe(self, &PyId___contains__);
if (func != NULL) {
args = PyTuple_Pack(1, value);
if (args == NULL)
@@ -4868,14 +5112,14 @@ static int
slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
{
PyObject *res;
- static PyObject *delitem_str, *setitem_str;
+ _Py_IDENTIFIER(__delitem__);
+ _Py_IDENTIFIER(__setitem__);
if (value == NULL)
- res = call_method(self, "__delitem__", &delitem_str,
- "(O)", key);
+ res = call_method(self, &PyId___delitem__, "(O)", key);
else
- res = call_method(self, "__setitem__", &setitem_str,
- "(OO)", key, value);
+ res = call_method(self, &PyId___setitem__, "(OO)", key, value);
+
if (res == NULL)
return -1;
Py_DECREF(res);
@@ -4896,7 +5140,7 @@ SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
static PyObject *
slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
{
- static PyObject *pow_str;
+ _Py_IDENTIFIER(__pow__);
if (modulus == Py_None)
return slot_nb_power_binary(self, other);
@@ -4905,11 +5149,9 @@ slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
slot_nb_power, so check before calling self.__pow__. */
if (Py_TYPE(self)->tp_as_number != NULL &&
Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
- return call_method(self, "__pow__", &pow_str,
- "(OO)", other, modulus);
+ return call_method(self, &PyId___pow__, "(OO)", other, modulus);
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
SLOT0(slot_nb_negative, "__neg__")
@@ -4920,15 +5162,16 @@ static int
slot_nb_bool(PyObject *self)
{
PyObject *func, *args;
- static PyObject *bool_str, *len_str;
int result = -1;
int using_len = 0;
+ _Py_IDENTIFIER(__len__);
+ _Py_IDENTIFIER(__bool__);
- func = lookup_maybe(self, "__bool__", &bool_str);
+ func = lookup_maybe(self, &PyId___bool__);
if (func == NULL) {
if (PyErr_Occurred())
return -1;
- func = lookup_maybe(self, "__len__", &len_str);
+ func = lookup_maybe(self, &PyId___len__);
if (func == NULL)
return PyErr_Occurred() ? -1 : 1;
using_len = 1;
@@ -4963,8 +5206,8 @@ slot_nb_bool(PyObject *self)
static PyObject *
slot_nb_index(PyObject *self)
{
- static PyObject *index_str;
- return call_method(self, "__index__", &index_str, "()");
+ _Py_IDENTIFIER(__index__);
+ return call_method(self, &PyId___index__, "()");
}
@@ -4985,8 +5228,8 @@ SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
static PyObject *
slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
{
- static PyObject *cache_str;
- return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
+ _Py_IDENTIFIER(__ipow__);
+ return call_method(self, &PyId___ipow__, "(" "O" ")", arg1);
}
SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
@@ -5003,9 +5246,9 @@ static PyObject *
slot_tp_repr(PyObject *self)
{
PyObject *func, *res;
- static PyObject *repr_str;
+ _Py_IDENTIFIER(__repr__);
- func = lookup_method(self, "__repr__", &repr_str);
+ func = lookup_method(self, &PyId___repr__);
if (func != NULL) {
res = PyEval_CallObject(func, NULL);
Py_DECREF(func);
@@ -5020,23 +5263,30 @@ static PyObject *
slot_tp_str(PyObject *self)
{
PyObject *func, *res;
- static PyObject *str_str;
+ _Py_IDENTIFIER(__str__);
- func = lookup_method(self, "__str__", &str_str);
+ func = lookup_method(self, &PyId___str__);
if (func != NULL) {
res = PyEval_CallObject(func, NULL);
Py_DECREF(func);
return res;
}
else {
- PyObject *ress;
+ /* PyObject *ress; */
PyErr_Clear();
res = slot_tp_repr(self);
if (!res)
return NULL;
- ress = _PyUnicode_AsDefaultEncodedString(res, NULL);
+ /* XXX this is non-sensical. Why should we return
+ a bytes object from __str__. Is this code even
+ used? - mvl */
+ assert(0);
+ return res;
+ /*
+ ress = _PyUnicode_AsDefaultEncodedString(res);
Py_DECREF(res);
return ress;
+ */
}
}
@@ -5044,10 +5294,9 @@ static Py_hash_t
slot_tp_hash(PyObject *self)
{
PyObject *func, *res;
- static PyObject *hash_str;
Py_ssize_t h;
- func = lookup_method(self, "__hash__", &hash_str);
+ func = lookup_method(self, &PyId___hash__);
if (func == Py_None) {
Py_DECREF(func);
@@ -5091,8 +5340,8 @@ slot_tp_hash(PyObject *self)
static PyObject *
slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
{
- static PyObject *call_str;
- PyObject *meth = lookup_method(self, "__call__", &call_str);
+ _Py_IDENTIFIER(__call__);
+ PyObject *meth = lookup_method(self, &PyId___call__);
PyObject *res;
if (meth == NULL)
@@ -5118,9 +5367,7 @@ slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
static PyObject *
slot_tp_getattro(PyObject *self, PyObject *name)
{
- static PyObject *getattribute_str = NULL;
- return call_method(self, "__getattribute__", &getattribute_str,
- "(O)", name);
+ return call_method(self, &PyId___getattribute__, "(O)", name);
}
static PyObject *
@@ -5146,26 +5393,14 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name)
{
PyTypeObject *tp = Py_TYPE(self);
PyObject *getattr, *getattribute, *res;
- static PyObject *getattribute_str = NULL;
- static PyObject *getattr_str = NULL;
+ _Py_IDENTIFIER(__getattr__);
- if (getattr_str == NULL) {
- getattr_str = PyUnicode_InternFromString("__getattr__");
- if (getattr_str == NULL)
- return NULL;
- }
- if (getattribute_str == NULL) {
- getattribute_str =
- PyUnicode_InternFromString("__getattribute__");
- if (getattribute_str == NULL)
- return NULL;
- }
/* speed hack: we could use lookup_maybe, but that would resolve the
method fully for each attribute lookup for classes with
__getattr__, even when the attribute is present. So we use
_PyType_Lookup and create the method only when needed, with
call_attribute. */
- getattr = _PyType_Lookup(tp, getattr_str);
+ getattr = _PyType_LookupId(tp, &PyId___getattr__);
if (getattr == NULL) {
/* No __getattr__ hook: use a simpler dispatcher */
tp->tp_getattro = slot_tp_getattro;
@@ -5177,7 +5412,7 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name)
__getattr__, even when self has the default __getattribute__
method. So we use _PyType_Lookup and create the method only when
needed, with call_attribute. */
- getattribute = _PyType_Lookup(tp, getattribute_str);
+ getattribute = _PyType_LookupId(tp, &PyId___getattribute__);
if (getattribute == NULL ||
(Py_TYPE(getattribute) == &PyWrapperDescr_Type &&
((PyWrapperDescrObject *)getattribute)->d_wrapped ==
@@ -5200,40 +5435,37 @@ static int
slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
{
PyObject *res;
- static PyObject *delattr_str, *setattr_str;
+ _Py_IDENTIFIER(__delattr__);
+ _Py_IDENTIFIER(__setattr__);
if (value == NULL)
- res = call_method(self, "__delattr__", &delattr_str,
- "(O)", name);
+ res = call_method(self, &PyId___delattr__, "(O)", name);
else
- res = call_method(self, "__setattr__", &setattr_str,
- "(OO)", name, value);
+ res = call_method(self, &PyId___setattr__, "(OO)", name, value);
if (res == NULL)
return -1;
Py_DECREF(res);
return 0;
}
-static char *name_op[] = {
- "__lt__",
- "__le__",
- "__eq__",
- "__ne__",
- "__gt__",
- "__ge__",
+static _Py_Identifier name_op[] = {
+ {0, "__lt__", 0},
+ {0, "__le__", 0},
+ {0, "__eq__", 0},
+ {0, "__ne__", 0},
+ {0, "__gt__", 0},
+ {0, "__ge__", 0}
};
static PyObject *
slot_tp_richcompare(PyObject *self, PyObject *other, int op)
{
PyObject *func, *args, *res;
- static PyObject *op_str[6];
- func = lookup_method(self, name_op[op], &op_str[op]);
+ func = lookup_method(self, &name_op[op]);
if (func == NULL) {
PyErr_Clear();
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
args = PyTuple_Pack(1, other);
if (args == NULL)
@@ -5250,9 +5482,9 @@ static PyObject *
slot_tp_iter(PyObject *self)
{
PyObject *func, *res;
- static PyObject *iter_str, *getitem_str;
+ _Py_IDENTIFIER(__iter__);
- func = lookup_method(self, "__iter__", &iter_str);
+ func = lookup_method(self, &PyId___iter__);
if (func != NULL) {
PyObject *args;
args = res = PyTuple_New(0);
@@ -5264,7 +5496,7 @@ slot_tp_iter(PyObject *self)
return res;
}
PyErr_Clear();
- func = lookup_method(self, "__getitem__", &getitem_str);
+ func = lookup_method(self, &PyId___getitem__);
if (func == NULL) {
PyErr_Format(PyExc_TypeError,
"'%.200s' object is not iterable",
@@ -5278,8 +5510,8 @@ slot_tp_iter(PyObject *self)
static PyObject *
slot_tp_iternext(PyObject *self)
{
- static PyObject *next_str;
- return call_method(self, "__next__", &next_str, "()");
+ _Py_IDENTIFIER(__next__);
+ return call_method(self, &PyId___next__, "()");
}
static PyObject *
@@ -5287,14 +5519,9 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
{
PyTypeObject *tp = Py_TYPE(self);
PyObject *get;
- static PyObject *get_str = NULL;
+ _Py_IDENTIFIER(__get__);
- if (get_str == NULL) {
- get_str = PyUnicode_InternFromString("__get__");
- if (get_str == NULL)
- return NULL;
- }
- get = _PyType_Lookup(tp, get_str);
+ get = _PyType_LookupId(tp, &PyId___get__);
if (get == NULL) {
/* Avoid further slowdowns */
if (tp->tp_descr_get == slot_tp_descr_get)
@@ -5313,14 +5540,13 @@ static int
slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
{
PyObject *res;
- static PyObject *del_str, *set_str;
+ _Py_IDENTIFIER(__delete__);
+ _Py_IDENTIFIER(__set__);
if (value == NULL)
- res = call_method(self, "__delete__", &del_str,
- "(O)", target);
+ res = call_method(self, &PyId___delete__, "(O)", target);
else
- res = call_method(self, "__set__", &set_str,
- "(OO)", target, value);
+ res = call_method(self, &PyId___set__, "(OO)", target, value);
if (res == NULL)
return -1;
Py_DECREF(res);
@@ -5330,8 +5556,8 @@ slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
static int
slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
{
- static PyObject *init_str;
- PyObject *meth = lookup_method(self, "__init__", &init_str);
+ _Py_IDENTIFIER(__init__);
+ PyObject *meth = lookup_method(self, &PyId___init__);
PyObject *res;
if (meth == NULL)
@@ -5354,17 +5580,12 @@ slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
static PyObject *
slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- static PyObject *new_str;
PyObject *func;
PyObject *newargs, *x;
Py_ssize_t i, n;
+ _Py_IDENTIFIER(__new__);
- if (new_str == NULL) {
- new_str = PyUnicode_InternFromString("__new__");
- if (new_str == NULL)
- return NULL;
- }
- func = PyObject_GetAttr((PyObject *)type, new_str);
+ func = _PyObject_GetAttrId((PyObject *)type, &PyId___new__);
if (func == NULL)
return NULL;
assert(PyTuple_Check(args));
@@ -5388,7 +5609,7 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static void
slot_tp_del(PyObject *self)
{
- static PyObject *del_str = NULL;
+ _Py_IDENTIFIER(__del__);
PyObject *del, *res;
PyObject *error_type, *error_value, *error_traceback;
@@ -5400,7 +5621,7 @@ slot_tp_del(PyObject *self)
PyErr_Fetch(&error_type, &error_value, &error_traceback);
/* Execute __del__ method, if any. */
- del = lookup_maybe(self, "__del__", &del_str);
+ del = lookup_maybe(self, &PyId___del__);
if (del != NULL) {
res = PyEval_CallObject(del, NULL);
if (res == NULL)
@@ -6115,7 +6336,7 @@ super_getattro(PyObject *self, PyObject *name)
/* We want __class__ to return the class of the super object
(i.e. super, or a subclass), not the class of su->obj. */
skip = (PyUnicode_Check(name) &&
- PyUnicode_GET_SIZE(name) == 9 &&
+ PyUnicode_GET_LENGTH(name) == 9 &&
PyUnicode_CompareWithASCIIString(name, "__class__") == 0);
}
@@ -6140,6 +6361,9 @@ super_getattro(PyObject *self, PyObject *name)
}
i++;
res = NULL;
+ /* keep a strong reference to mro because starttype->tp_mro can be
+ replaced during PyDict_GetItem(dict, name) */
+ Py_INCREF(mro);
for (; i < n; i++) {
tmp = PyTuple_GET_ITEM(mro, i);
if (PyType_Check(tmp))
@@ -6164,9 +6388,11 @@ super_getattro(PyObject *self, PyObject *name)
Py_DECREF(res);
res = tmp;
}
+ Py_DECREF(mro);
return res;
}
}
+ Py_DECREF(mro);
}
return PyObject_GenericGetAttr(self, name);
}
@@ -6176,7 +6402,7 @@ supercheck(PyTypeObject *type, PyObject *obj)
{
/* Check that a super() call makes sense. Return a type object.
- obj can be a new-style class, or an instance of one:
+ obj can be a class, or an instance of one:
- If it is a class, it must be a subclass of 'type'. This case is
used for class methods; the return value is obj.
@@ -6202,17 +6428,9 @@ supercheck(PyTypeObject *type, PyObject *obj)
}
else {
/* Try the slow way */
- static PyObject *class_str = NULL;
PyObject *class_attr;
- if (class_str == NULL) {
- class_str = PyUnicode_FromString("__class__");
- if (class_str == NULL)
- return NULL;
- }
-
- class_attr = PyObject_GetAttr(obj, class_str);
-
+ class_attr = _PyObject_GetAttrId(obj, &PyId___class__);
if (class_attr != NULL &&
PyType_Check(class_attr) &&
(PyTypeObject *)class_attr != Py_TYPE(obj))
@@ -6289,18 +6507,18 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds)
PyCodeObject *co = f->f_code;
Py_ssize_t i, n;
if (co == NULL) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): no code object");
return -1;
}
if (co->co_argcount == 0) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): no arguments");
return -1;
}
obj = f->f_localsplus[0];
if (obj == NULL) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): arg[0] deleted");
return -1;
}
@@ -6319,18 +6537,18 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds)
PyTuple_GET_SIZE(co->co_cellvars) + i;
PyObject *cell = f->f_localsplus[index];
if (cell == NULL || !PyCell_Check(cell)) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): bad __class__ cell");
return -1;
}
type = (PyTypeObject *) PyCell_GET(cell);
if (type == NULL) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): empty __class__ cell");
return -1;
}
if (!PyType_Check(type)) {
- PyErr_Format(PyExc_SystemError,
+ PyErr_Format(PyExc_RuntimeError,
"super(): __class__ is not a type (%s)",
Py_TYPE(type)->tp_name);
return -1;
@@ -6339,7 +6557,7 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds)
}
}
if (type == NULL) {
- PyErr_SetString(PyExc_SystemError,
+ PyErr_SetString(PyExc_RuntimeError,
"super(): __class__ cell not found");
return -1;
}
diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc
index 5186dcf..caa1e03 100644
--- a/Objects/typeslots.inc
+++ b/Objects/typeslots.inc
@@ -1,4 +1,4 @@
-/* Generated by typeslots.py $Revision$ */
+/* Generated by typeslots.py */
0,
0,
offsetof(PyHeapTypeObject, as_mapping.mp_ass_subscript),
diff --git a/Objects/typeslots.py b/Objects/typeslots.py
index 2e00c80..b24c7f4 100644
--- a/Objects/typeslots.py
+++ b/Objects/typeslots.py
@@ -3,7 +3,7 @@
import sys, re
-print("/* Generated by typeslots.py $Revision$ */")
+print("/* Generated by typeslots.py */")
res = {}
for line in sys.stdin:
m = re.match("#define Py_([a-z_]+) ([0-9]+)", line)
diff --git a/Objects/unicodectype.c b/Objects/unicodectype.c
index 9f6ac89..a572c12 100644
--- a/Objects/unicodectype.c
+++ b/Objects/unicodectype.c
@@ -21,13 +21,20 @@
#define XID_START_MASK 0x100
#define XID_CONTINUE_MASK 0x200
#define PRINTABLE_MASK 0x400
-#define NODELTA_MASK 0x800
-#define NUMERIC_MASK 0x1000
+#define NUMERIC_MASK 0x800
+#define CASE_IGNORABLE_MASK 0x1000
+#define CASED_MASK 0x2000
+#define EXTENDED_CASE_MASK 0x4000
typedef struct {
- const Py_UCS4 upper;
- const Py_UCS4 lower;
- const Py_UCS4 title;
+ /*
+ These are either deltas to the character or offsets in
+ _PyUnicode_ExtendedCase.
+ */
+ const int upper;
+ const int lower;
+ const int title;
+ /* Note if more flag space is needed, decimal and digit could be unified. */
const unsigned char decimal;
const unsigned char digit;
const unsigned short flags;
@@ -57,15 +64,10 @@ gettyperecord(Py_UCS4 code)
Py_UCS4 _PyUnicode_ToTitlecase(register Py_UCS4 ch)
{
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
- int delta = ctype->title;
- if (ctype->flags & NODELTA_MASK)
- return delta;
-
- if (delta >= 32768)
- delta -= 65536;
-
- return ch + delta;
+ if (ctype->flags & EXTENDED_CASE_MASK)
+ return _PyUnicode_ExtendedCase[ctype->title & 0xFFFF];
+ return ch + ctype->title;
}
/* Returns 1 for Unicode characters having the category 'Lt', 0
@@ -188,12 +190,10 @@ int _PyUnicode_IsUppercase(Py_UCS4 ch)
Py_UCS4 _PyUnicode_ToUppercase(Py_UCS4 ch)
{
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
- int delta = ctype->upper;
- if (ctype->flags & NODELTA_MASK)
- return delta;
- if (delta >= 32768)
- delta -= 65536;
- return ch + delta;
+
+ if (ctype->flags & EXTENDED_CASE_MASK)
+ return _PyUnicode_ExtendedCase[ctype->upper & 0xFFFF];
+ return ch + ctype->upper;
}
/* Returns the lowercase Unicode characters corresponding to ch or just
@@ -202,12 +202,87 @@ Py_UCS4 _PyUnicode_ToUppercase(Py_UCS4 ch)
Py_UCS4 _PyUnicode_ToLowercase(Py_UCS4 ch)
{
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
- int delta = ctype->lower;
- if (ctype->flags & NODELTA_MASK)
- return delta;
- if (delta >= 32768)
- delta -= 65536;
- return ch + delta;
+
+ if (ctype->flags & EXTENDED_CASE_MASK)
+ return _PyUnicode_ExtendedCase[ctype->lower & 0xFFFF];
+ return ch + ctype->lower;
+}
+
+int _PyUnicode_ToLowerFull(Py_UCS4 ch, Py_UCS4 *res)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ if (ctype->flags & EXTENDED_CASE_MASK) {
+ int index = ctype->lower & 0xFFFF;
+ int n = ctype->lower >> 24;
+ int i;
+ for (i = 0; i < n; i++)
+ res[i] = _PyUnicode_ExtendedCase[index + i];
+ return n;
+ }
+ res[0] = ch + ctype->lower;
+ return 1;
+}
+
+int _PyUnicode_ToTitleFull(Py_UCS4 ch, Py_UCS4 *res)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ if (ctype->flags & EXTENDED_CASE_MASK) {
+ int index = ctype->title & 0xFFFF;
+ int n = ctype->title >> 24;
+ int i;
+ for (i = 0; i < n; i++)
+ res[i] = _PyUnicode_ExtendedCase[index + i];
+ return n;
+ }
+ res[0] = ch + ctype->title;
+ return 1;
+}
+
+int _PyUnicode_ToUpperFull(Py_UCS4 ch, Py_UCS4 *res)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ if (ctype->flags & EXTENDED_CASE_MASK) {
+ int index = ctype->upper & 0xFFFF;
+ int n = ctype->upper >> 24;
+ int i;
+ for (i = 0; i < n; i++)
+ res[i] = _PyUnicode_ExtendedCase[index + i];
+ return n;
+ }
+ res[0] = ch + ctype->upper;
+ return 1;
+}
+
+int _PyUnicode_ToFoldedFull(Py_UCS4 ch, Py_UCS4 *res)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ if (ctype->flags & EXTENDED_CASE_MASK && (ctype->lower >> 20) & 7) {
+ int index = (ctype->lower & 0xFFFF) + (ctype->lower >> 24);
+ int n = (ctype->lower >> 20) & 7;
+ int i;
+ for (i = 0; i < n; i++)
+ res[i] = _PyUnicode_ExtendedCase[index + i];
+ return n;
+ }
+ return _PyUnicode_ToLowerFull(ch, res);
+}
+
+int _PyUnicode_IsCased(Py_UCS4 ch)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ return (ctype->flags & CASED_MASK) != 0;
+}
+
+int _PyUnicode_IsCaseIgnorable(Py_UCS4 ch)
+{
+ const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
+
+ return (ctype->flags & CASE_IGNORABLE_MASK) != 0;
}
/* Returns 1 for Unicode characters having the category 'Ll', 'Lu', 'Lt',
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 35b424e..665f03d 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1,8 +1,7 @@
/*
Unicode implementation based on original code by Fredrik Lundh,
-modified by Marc-Andre Lemburg <mal@lemburg.com> according to the
-Unicode Integration Proposal (see file Misc/unicode.txt).
+modified by Marc-Andre Lemburg <mal@lemburg.com>.
Major speed upgrades to the method implementations at the Reykjavik
NeedForSpeed sprint, by Fredrik Lundh and Andrew Dalke.
@@ -42,34 +41,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "ucnhash.h"
+#include "bytes_methods.h"
#ifdef MS_WINDOWS
#include <windows.h>
#endif
-/* Limit for the Unicode object free list */
-
-#define PyUnicode_MAXFREELIST 1024
-
-/* Limit for the Unicode object free list stay alive optimization.
-
- The implementation will keep allocated Unicode memory intact for
- all objects on the free list having a size less than this
- limit. This reduces malloc() overhead for small Unicode objects.
-
- At worst this will result in PyUnicode_MAXFREELIST *
- (sizeof(PyUnicodeObject) + KEEPALIVE_SIZE_LIMIT +
- malloc()-overhead) bytes of unused garbage.
-
- Setting the limit to 0 effectively turns the feature off.
-
- Note: This is an experimental feature ! If you get core dumps when
- using Unicode objects, turn this feature off.
-
-*/
-
-#define KEEPALIVE_SIZE_LIMIT 9
-
/* Endianness switches; defaults to little endian */
#ifdef WORDS_BIGENDIAN
@@ -90,6 +67,110 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern "C" {
#endif
+/* Maximum code point of Unicode 6.0: 0x10ffff (1,114,111) */
+#define MAX_UNICODE 0x10ffff
+
+#ifdef Py_DEBUG
+# define _PyUnicode_CHECK(op) _PyUnicode_CheckConsistency(op, 0)
+#else
+# define _PyUnicode_CHECK(op) PyUnicode_Check(op)
+#endif
+
+#define _PyUnicode_UTF8(op) \
+ (((PyCompactUnicodeObject*)(op))->utf8)
+#define PyUnicode_UTF8(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ assert(PyUnicode_IS_READY(op)), \
+ PyUnicode_IS_COMPACT_ASCII(op) ? \
+ ((char*)((PyASCIIObject*)(op) + 1)) : \
+ _PyUnicode_UTF8(op))
+#define _PyUnicode_UTF8_LENGTH(op) \
+ (((PyCompactUnicodeObject*)(op))->utf8_length)
+#define PyUnicode_UTF8_LENGTH(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ assert(PyUnicode_IS_READY(op)), \
+ PyUnicode_IS_COMPACT_ASCII(op) ? \
+ ((PyASCIIObject*)(op))->length : \
+ _PyUnicode_UTF8_LENGTH(op))
+#define _PyUnicode_WSTR(op) \
+ (((PyASCIIObject*)(op))->wstr)
+#define _PyUnicode_WSTR_LENGTH(op) \
+ (((PyCompactUnicodeObject*)(op))->wstr_length)
+#define _PyUnicode_LENGTH(op) \
+ (((PyASCIIObject *)(op))->length)
+#define _PyUnicode_STATE(op) \
+ (((PyASCIIObject *)(op))->state)
+#define _PyUnicode_HASH(op) \
+ (((PyASCIIObject *)(op))->hash)
+#define _PyUnicode_KIND(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ ((PyASCIIObject *)(op))->state.kind)
+#define _PyUnicode_GET_LENGTH(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ ((PyASCIIObject *)(op))->length)
+#define _PyUnicode_DATA_ANY(op) \
+ (((PyUnicodeObject*)(op))->data.any)
+
+/* Optimized version of Py_MAX() to compute the maximum character:
+ use it when your are computing the second argument of PyUnicode_New() */
+#define MAX_MAXCHAR(maxchar1, maxchar2) \
+ ((maxchar1) | (maxchar2))
+
+#undef PyUnicode_READY
+#define PyUnicode_READY(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ (PyUnicode_IS_READY(op) ? \
+ 0 : \
+ _PyUnicode_Ready(op)))
+
+#define _PyUnicode_SHARE_UTF8(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ assert(!PyUnicode_IS_COMPACT_ASCII(op)), \
+ (_PyUnicode_UTF8(op) == PyUnicode_DATA(op)))
+#define _PyUnicode_SHARE_WSTR(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ (_PyUnicode_WSTR(unicode) == PyUnicode_DATA(op)))
+
+/* true if the Unicode object has an allocated UTF-8 memory block
+ (not shared with other data) */
+#define _PyUnicode_HAS_UTF8_MEMORY(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ (!PyUnicode_IS_COMPACT_ASCII(op) \
+ && _PyUnicode_UTF8(op) \
+ && _PyUnicode_UTF8(op) != PyUnicode_DATA(op)))
+
+/* true if the Unicode object has an allocated wstr memory block
+ (not shared with other data) */
+#define _PyUnicode_HAS_WSTR_MEMORY(op) \
+ (assert(_PyUnicode_CHECK(op)), \
+ (_PyUnicode_WSTR(op) && \
+ (!PyUnicode_IS_READY(op) || \
+ _PyUnicode_WSTR(op) != PyUnicode_DATA(op))))
+
+/* Generic helper macro to convert characters of different types.
+ from_type and to_type have to be valid type names, begin and end
+ are pointers to the source characters which should be of type
+ "from_type *". to is a pointer of type "to_type *" and points to the
+ buffer where the result characters are written to. */
+#define _PyUnicode_CONVERT_BYTES(from_type, to_type, begin, end, to) \
+ do { \
+ to_type *_to = (to_type *) to; \
+ const from_type *_iter = (begin); \
+ const from_type *_end = (end); \
+ Py_ssize_t n = (_end) - (_iter); \
+ const from_type *_unrolled_end = \
+ _iter + _Py_SIZE_ROUND_DOWN(n, 4); \
+ while (_iter < (_unrolled_end)) { \
+ _to[0] = (to_type) _iter[0]; \
+ _to[1] = (to_type) _iter[1]; \
+ _to[2] = (to_type) _iter[2]; \
+ _to[3] = (to_type) _iter[3]; \
+ _iter += 4; _to += 4; \
+ } \
+ while (_iter < (_end)) \
+ *_to++ = (to_type) *_iter++; \
+ } while (0)
+
/* This dictionary holds all interned unicode strings. Note that references
to strings in this dictionary are *not* counted in the string's ob_refcnt.
When the interned string reaches a refcnt of 0 the string deallocation
@@ -100,16 +181,15 @@ extern "C" {
*/
static PyObject *interned;
-/* Free list for Unicode objects */
-static PyUnicodeObject *free_list;
-static int numfree;
-
/* The empty Unicode object is shared to improve performance. */
-static PyUnicodeObject *unicode_empty;
+static PyObject *unicode_empty;
+
+/* List of static strings. */
+static _Py_Identifier *static_strings;
/* Single character Unicode strings in the Latin-1 range are being
shared as well. */
-static PyUnicodeObject *unicode_latin1[256];
+static PyObject *unicode_latin1[256];
/* Fast detection of the most frequent whitespace characters */
const unsigned char _Py_ascii_whitespace[] = {
@@ -142,16 +222,31 @@ const unsigned char _Py_ascii_whitespace[] = {
0, 0, 0, 0, 0, 0, 0, 0
};
-static PyObject *unicode_encode_call_errorhandler(const char *errors,
+/* forward */
+static PyUnicodeObject *_PyUnicode_New(Py_ssize_t length);
+static PyObject* get_latin1_char(unsigned char ch);
+static int unicode_modifiable(PyObject *unicode);
+
+
+static PyObject *
+_PyUnicode_FromUCS1(const unsigned char *s, Py_ssize_t size);
+static PyObject *
+_PyUnicode_FromUCS2(const Py_UCS2 *s, Py_ssize_t size);
+static PyObject *
+_PyUnicode_FromUCS4(const Py_UCS4 *s, Py_ssize_t size);
+
+static PyObject *
+unicode_encode_call_errorhandler(const char *errors,
PyObject **errorHandler,const char *encoding, const char *reason,
- const Py_UNICODE *unicode, Py_ssize_t size, PyObject **exceptionObject,
+ PyObject *unicode, PyObject **exceptionObject,
Py_ssize_t startpos, Py_ssize_t endpos, Py_ssize_t *newpos);
-static void raise_encode_exception(PyObject **exceptionObject,
- const char *encoding,
- const Py_UNICODE *unicode, Py_ssize_t size,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason);
+static void
+raise_encode_exception(PyObject **exceptionObject,
+ const char *encoding,
+ PyObject *unicode,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ const char *reason);
/* Same for linebreaks */
static unsigned char ascii_linebreak[] = {
@@ -181,7 +276,8 @@ static unsigned char ascii_linebreak[] = {
0, 0, 0, 0, 0, 0, 0, 0
};
-
+/* The max unicode value is always 0x10FFFF while using the PEP-393 API.
+ This function is kept for backward compatibility with the old API. */
Py_UNICODE
PyUnicode_GetMax(void)
{
@@ -194,6 +290,224 @@ PyUnicode_GetMax(void)
#endif
}
+#ifdef Py_DEBUG
+int
+_PyUnicode_CheckConsistency(PyObject *op, int check_content)
+{
+ PyASCIIObject *ascii;
+ unsigned int kind;
+
+ assert(PyUnicode_Check(op));
+
+ ascii = (PyASCIIObject *)op;
+ kind = ascii->state.kind;
+
+ if (ascii->state.ascii == 1 && ascii->state.compact == 1) {
+ assert(kind == PyUnicode_1BYTE_KIND);
+ assert(ascii->state.ready == 1);
+ }
+ else {
+ PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
+ void *data;
+
+ if (ascii->state.compact == 1) {
+ data = compact + 1;
+ assert(kind == PyUnicode_1BYTE_KIND
+ || kind == PyUnicode_2BYTE_KIND
+ || kind == PyUnicode_4BYTE_KIND);
+ assert(ascii->state.ascii == 0);
+ assert(ascii->state.ready == 1);
+ assert (compact->utf8 != data);
+ }
+ else {
+ PyUnicodeObject *unicode = (PyUnicodeObject *)op;
+
+ data = unicode->data.any;
+ if (kind == PyUnicode_WCHAR_KIND) {
+ assert(ascii->length == 0);
+ assert(ascii->hash == -1);
+ assert(ascii->state.compact == 0);
+ assert(ascii->state.ascii == 0);
+ assert(ascii->state.ready == 0);
+ assert(ascii->state.interned == SSTATE_NOT_INTERNED);
+ assert(ascii->wstr != NULL);
+ assert(data == NULL);
+ assert(compact->utf8 == NULL);
+ }
+ else {
+ assert(kind == PyUnicode_1BYTE_KIND
+ || kind == PyUnicode_2BYTE_KIND
+ || kind == PyUnicode_4BYTE_KIND);
+ assert(ascii->state.compact == 0);
+ assert(ascii->state.ready == 1);
+ assert(data != NULL);
+ if (ascii->state.ascii) {
+ assert (compact->utf8 == data);
+ assert (compact->utf8_length == ascii->length);
+ }
+ else
+ assert (compact->utf8 != data);
+ }
+ }
+ if (kind != PyUnicode_WCHAR_KIND) {
+ if (
+#if SIZEOF_WCHAR_T == 2
+ kind == PyUnicode_2BYTE_KIND
+#else
+ kind == PyUnicode_4BYTE_KIND
+#endif
+ )
+ {
+ assert(ascii->wstr == data);
+ assert(compact->wstr_length == ascii->length);
+ } else
+ assert(ascii->wstr != data);
+ }
+
+ if (compact->utf8 == NULL)
+ assert(compact->utf8_length == 0);
+ if (ascii->wstr == NULL)
+ assert(compact->wstr_length == 0);
+ }
+ /* check that the best kind is used */
+ if (check_content && kind != PyUnicode_WCHAR_KIND)
+ {
+ Py_ssize_t i;
+ Py_UCS4 maxchar = 0;
+ void *data;
+ Py_UCS4 ch;
+
+ data = PyUnicode_DATA(ascii);
+ for (i=0; i < ascii->length; i++)
+ {
+ ch = PyUnicode_READ(kind, data, i);
+ if (ch > maxchar)
+ maxchar = ch;
+ }
+ if (kind == PyUnicode_1BYTE_KIND) {
+ if (ascii->state.ascii == 0) {
+ assert(maxchar >= 128);
+ assert(maxchar <= 255);
+ }
+ else
+ assert(maxchar < 128);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ assert(maxchar >= 0x100);
+ assert(maxchar <= 0xFFFF);
+ }
+ else {
+ assert(maxchar >= 0x10000);
+ assert(maxchar <= MAX_UNICODE);
+ }
+ assert(PyUnicode_READ(kind, data, ascii->length) == 0);
+ }
+ return 1;
+}
+#endif
+
+static PyObject*
+unicode_result_wchar(PyObject *unicode)
+{
+#ifndef Py_DEBUG
+ Py_ssize_t len;
+
+ assert(Py_REFCNT(unicode) == 1);
+
+ len = _PyUnicode_WSTR_LENGTH(unicode);
+ if (len == 0) {
+ Py_INCREF(unicode_empty);
+ Py_DECREF(unicode);
+ return unicode_empty;
+ }
+
+ if (len == 1) {
+ wchar_t ch = _PyUnicode_WSTR(unicode)[0];
+ if (ch < 256) {
+ PyObject *latin1_char = get_latin1_char((unsigned char)ch);
+ Py_DECREF(unicode);
+ return latin1_char;
+ }
+ }
+
+ if (_PyUnicode_Ready(unicode) < 0) {
+ Py_XDECREF(unicode);
+ return NULL;
+ }
+#else
+ /* don't make the result ready in debug mode to ensure that the caller
+ makes the string ready before using it */
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+#endif
+ return unicode;
+}
+
+static PyObject*
+unicode_result_ready(PyObject *unicode)
+{
+ Py_ssize_t length;
+
+ length = PyUnicode_GET_LENGTH(unicode);
+ if (length == 0) {
+ if (unicode != unicode_empty) {
+ Py_INCREF(unicode_empty);
+ Py_DECREF(unicode);
+ }
+ return unicode_empty;
+ }
+
+ if (length == 1) {
+ Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0);
+ if (ch < 256) {
+ PyObject *latin1_char = unicode_latin1[ch];
+ if (latin1_char != NULL) {
+ if (unicode != latin1_char) {
+ Py_INCREF(latin1_char);
+ Py_DECREF(unicode);
+ }
+ return latin1_char;
+ }
+ else {
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ Py_INCREF(unicode);
+ unicode_latin1[ch] = unicode;
+ return unicode;
+ }
+ }
+ }
+
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ return unicode;
+}
+
+static PyObject*
+unicode_result(PyObject *unicode)
+{
+ assert(_PyUnicode_CHECK(unicode));
+ if (PyUnicode_IS_READY(unicode))
+ return unicode_result_ready(unicode);
+ else
+ return unicode_result_wchar(unicode);
+}
+
+static PyObject*
+unicode_result_unchanged(PyObject *unicode)
+{
+ if (PyUnicode_CheckExact(unicode)) {
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ Py_INCREF(unicode);
+ return unicode;
+ }
+ else
+ /* Subtype -- return genuine unicode string with the same value. */
+ return _PyUnicode_Copy(unicode);
+}
+
+#ifdef HAVE_MBCS
+static OSVERSIONINFOEX winver;
+#endif
+
/* --- Bloom Filters ----------------------------------------------------- */
/* stuff to implement simple "bloom filters" for Unicode characters.
@@ -223,7 +537,8 @@ static BLOOM_MASK bloom_linebreak;
((ch) < 128U ? ascii_linebreak[(ch)] : \
(BLOOM(bloom_linebreak, (ch)) && Py_UNICODE_ISLINEBREAK(ch)))
-Py_LOCAL_INLINE(BLOOM_MASK) make_bloom_mask(Py_UNICODE* ptr, Py_ssize_t len)
+Py_LOCAL_INLINE(BLOOM_MASK)
+make_bloom_mask(int kind, void* ptr, Py_ssize_t len)
{
/* calculate simple bloom-style bitmask for a given unicode string */
@@ -232,76 +547,253 @@ Py_LOCAL_INLINE(BLOOM_MASK) make_bloom_mask(Py_UNICODE* ptr, Py_ssize_t len)
mask = 0;
for (i = 0; i < len; i++)
- BLOOM_ADD(mask, ptr[i]);
+ BLOOM_ADD(mask, PyUnicode_READ(kind, ptr, i));
return mask;
}
-Py_LOCAL_INLINE(int) unicode_member(Py_UNICODE chr, Py_UNICODE* set, Py_ssize_t setlen)
-{
- Py_ssize_t i;
+#define BLOOM_MEMBER(mask, chr, str) \
+ (BLOOM(mask, chr) \
+ && (PyUnicode_FindChar(str, chr, 0, PyUnicode_GET_LENGTH(str), 1) >= 0))
- for (i = 0; i < setlen; i++)
- if (set[i] == chr)
- return 1;
+/* Compilation of templated routines */
- return 0;
-}
+#include "stringlib/asciilib.h"
+#include "stringlib/fastsearch.h"
+#include "stringlib/partition.h"
+#include "stringlib/split.h"
+#include "stringlib/count.h"
+#include "stringlib/find.h"
+#include "stringlib/find_max_char.h"
+#include "stringlib/localeutil.h"
+#include "stringlib/undef.h"
-#define BLOOM_MEMBER(mask, chr, set, setlen) \
- BLOOM(mask, chr) && unicode_member(chr, set, setlen)
+#include "stringlib/ucs1lib.h"
+#include "stringlib/fastsearch.h"
+#include "stringlib/partition.h"
+#include "stringlib/split.h"
+#include "stringlib/count.h"
+#include "stringlib/find.h"
+#include "stringlib/find_max_char.h"
+#include "stringlib/localeutil.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/ucs2lib.h"
+#include "stringlib/fastsearch.h"
+#include "stringlib/partition.h"
+#include "stringlib/split.h"
+#include "stringlib/count.h"
+#include "stringlib/find.h"
+#include "stringlib/find_max_char.h"
+#include "stringlib/localeutil.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/ucs4lib.h"
+#include "stringlib/fastsearch.h"
+#include "stringlib/partition.h"
+#include "stringlib/split.h"
+#include "stringlib/count.h"
+#include "stringlib/find.h"
+#include "stringlib/find_max_char.h"
+#include "stringlib/localeutil.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/unicodedefs.h"
+#include "stringlib/fastsearch.h"
+#include "stringlib/count.h"
+#include "stringlib/find.h"
+#include "stringlib/undef.h"
/* --- Unicode Object ----------------------------------------------------- */
-static
-int unicode_resize(register PyUnicodeObject *unicode,
- Py_ssize_t length)
+static PyObject *
+fixup(PyObject *self, Py_UCS4 (*fixfct)(PyObject *s));
+
+Py_LOCAL_INLINE(Py_ssize_t) findchar(void *s, int kind,
+ Py_ssize_t size, Py_UCS4 ch,
+ int direction)
{
- void *oldstr;
+ int mode = (direction == 1) ? FAST_SEARCH : FAST_RSEARCH;
- /* Shortcut if there's nothing much to do. */
- if (unicode->length == length)
- goto reset;
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ {
+ Py_UCS1 ch1 = (Py_UCS1) ch;
+ if (ch1 == ch)
+ return ucs1lib_fastsearch((Py_UCS1 *) s, size, &ch1, 1, 0, mode);
+ else
+ return -1;
+ }
+ case PyUnicode_2BYTE_KIND:
+ {
+ Py_UCS2 ch2 = (Py_UCS2) ch;
+ if (ch2 == ch)
+ return ucs2lib_fastsearch((Py_UCS2 *) s, size, &ch2, 1, 0, mode);
+ else
+ return -1;
+ }
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_fastsearch((Py_UCS4 *) s, size, &ch, 1, 0, mode);
+ default:
+ assert(0);
+ return -1;
+ }
+}
- /* Resizing shared object (unicode_empty or single character
- objects) in-place is not allowed. Use PyUnicode_Resize()
- instead ! */
+static PyObject*
+resize_compact(PyObject *unicode, Py_ssize_t length)
+{
+ Py_ssize_t char_size;
+ Py_ssize_t struct_size;
+ Py_ssize_t new_size;
+ int share_wstr;
+ PyObject *new_unicode;
+ assert(unicode_modifiable(unicode));
+ assert(PyUnicode_IS_READY(unicode));
+ assert(PyUnicode_IS_COMPACT(unicode));
+
+ char_size = PyUnicode_KIND(unicode);
+ if (PyUnicode_IS_ASCII(unicode))
+ struct_size = sizeof(PyASCIIObject);
+ else
+ struct_size = sizeof(PyCompactUnicodeObject);
+ share_wstr = _PyUnicode_SHARE_WSTR(unicode);
- if (unicode == unicode_empty ||
- (unicode->length == 1 &&
- unicode->str[0] < 256U &&
- unicode_latin1[unicode->str[0]] == unicode)) {
- PyErr_SetString(PyExc_SystemError,
- "can't resize shared str objects");
- return -1;
+ if (length > ((PY_SSIZE_T_MAX - struct_size) / char_size - 1)) {
+ PyErr_NoMemory();
+ return NULL;
}
+ new_size = (struct_size + (length + 1) * char_size);
- /* We allocate one more byte to make sure the string is Ux0000 terminated.
- The overallocation is also used by fastsearch, which assumes that it's
- safe to look at str[length] (without making any assumptions about what
- it contains). */
+ _Py_DEC_REFTOTAL;
+ _Py_ForgetReference(unicode);
- oldstr = unicode->str;
- unicode->str = PyObject_REALLOC(unicode->str,
- sizeof(Py_UNICODE) * (length + 1));
- if (!unicode->str) {
- unicode->str = (Py_UNICODE *)oldstr;
+ new_unicode = (PyObject *)PyObject_REALLOC((char *)unicode, new_size);
+ if (new_unicode == NULL) {
+ _Py_NewReference(unicode);
PyErr_NoMemory();
- return -1;
+ return NULL;
+ }
+ unicode = new_unicode;
+ _Py_NewReference(unicode);
+
+ _PyUnicode_LENGTH(unicode) = length;
+ if (share_wstr) {
+ _PyUnicode_WSTR(unicode) = PyUnicode_DATA(unicode);
+ if (!PyUnicode_IS_ASCII(unicode))
+ _PyUnicode_WSTR_LENGTH(unicode) = length;
}
- unicode->str[length] = 0;
- unicode->length = length;
+ PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
+ length, 0);
+ assert(_PyUnicode_CheckConsistency(unicode, 0));
+ return unicode;
+}
+
+static int
+resize_inplace(PyObject *unicode, Py_ssize_t length)
+{
+ wchar_t *wstr;
+ Py_ssize_t new_size;
+ assert(!PyUnicode_IS_COMPACT(unicode));
+ assert(Py_REFCNT(unicode) == 1);
+
+ if (PyUnicode_IS_READY(unicode)) {
+ Py_ssize_t char_size;
+ int share_wstr, share_utf8;
+ void *data;
+
+ data = _PyUnicode_DATA_ANY(unicode);
+ char_size = PyUnicode_KIND(unicode);
+ share_wstr = _PyUnicode_SHARE_WSTR(unicode);
+ share_utf8 = _PyUnicode_SHARE_UTF8(unicode);
+
+ if (length > (PY_SSIZE_T_MAX / char_size - 1)) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ new_size = (length + 1) * char_size;
+
+ if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode))
+ {
+ PyObject_DEL(_PyUnicode_UTF8(unicode));
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ }
- reset:
- /* Reset the object caches */
- if (unicode->defenc) {
- Py_CLEAR(unicode->defenc);
+ data = (PyObject *)PyObject_REALLOC(data, new_size);
+ if (data == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ _PyUnicode_DATA_ANY(unicode) = data;
+ if (share_wstr) {
+ _PyUnicode_WSTR(unicode) = data;
+ _PyUnicode_WSTR_LENGTH(unicode) = length;
+ }
+ if (share_utf8) {
+ _PyUnicode_UTF8(unicode) = data;
+ _PyUnicode_UTF8_LENGTH(unicode) = length;
+ }
+ _PyUnicode_LENGTH(unicode) = length;
+ PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0);
+ if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) {
+ assert(_PyUnicode_CheckConsistency(unicode, 0));
+ return 0;
+ }
}
- unicode->hash = -1;
+ assert(_PyUnicode_WSTR(unicode) != NULL);
+ /* check for integer overflow */
+ if (length > PY_SSIZE_T_MAX / sizeof(wchar_t) - 1) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ new_size = sizeof(wchar_t) * (length + 1);
+ wstr = _PyUnicode_WSTR(unicode);
+ wstr = PyObject_REALLOC(wstr, new_size);
+ if (!wstr) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ _PyUnicode_WSTR(unicode) = wstr;
+ _PyUnicode_WSTR(unicode)[length] = 0;
+ _PyUnicode_WSTR_LENGTH(unicode) = length;
+ assert(_PyUnicode_CheckConsistency(unicode, 0));
return 0;
}
+static PyObject*
+resize_copy(PyObject *unicode, Py_ssize_t length)
+{
+ Py_ssize_t copy_length;
+ if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND) {
+ PyObject *copy;
+
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+
+ copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode));
+ if (copy == NULL)
+ return NULL;
+
+ copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode));
+ _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, copy_length);
+ return copy;
+ }
+ else {
+ PyObject *w;
+
+ w = (PyObject*)_PyUnicode_New(length);
+ if (w == NULL)
+ return NULL;
+ copy_length = _PyUnicode_WSTR_LENGTH(unicode);
+ copy_length = Py_MIN(copy_length, length);
+ Py_UNICODE_COPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode),
+ copy_length);
+ return w;
+ }
+}
+
/* We allocate one more byte to make sure the string is
Ux0000 terminated; some code (e.g. new_identifier)
relies on that.
@@ -311,55 +803,39 @@ int unicode_resize(register PyUnicodeObject *unicode,
*/
-static
-PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
+static PyUnicodeObject *
+_PyUnicode_New(Py_ssize_t length)
{
register PyUnicodeObject *unicode;
+ size_t new_size;
/* Optimization for empty strings */
if (length == 0 && unicode_empty != NULL) {
Py_INCREF(unicode_empty);
- return unicode_empty;
+ return (PyUnicodeObject*)unicode_empty;
}
/* Ensure we won't overflow the size. */
if (length > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) {
return (PyUnicodeObject *)PyErr_NoMemory();
}
-
- /* Unicode freelist & memory allocation */
- if (free_list) {
- unicode = free_list;
- free_list = *(PyUnicodeObject **)unicode;
- numfree--;
- if (unicode->str) {
- /* Keep-Alive optimization: we only upsize the buffer,
- never downsize it. */
- if ((unicode->length < length) &&
- unicode_resize(unicode, length) < 0) {
- PyObject_DEL(unicode->str);
- unicode->str = NULL;
- }
- }
- else {
- size_t new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
- unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size);
- }
- PyObject_INIT(unicode, &PyUnicode_Type);
- }
- else {
- size_t new_size;
- unicode = PyObject_New(PyUnicodeObject, &PyUnicode_Type);
- if (unicode == NULL)
- return NULL;
- new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
- unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size);
+ if (length < 0) {
+ PyErr_SetString(PyExc_SystemError,
+ "Negative size passed to _PyUnicode_New");
+ return NULL;
}
- if (!unicode->str) {
+ unicode = PyObject_New(PyUnicodeObject, &PyUnicode_Type);
+ if (unicode == NULL)
+ return NULL;
+ new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
+ _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size);
+ if (!_PyUnicode_WSTR(unicode)) {
+ Py_DECREF(unicode);
PyErr_NoMemory();
- goto onError;
+ return NULL;
}
+
/* Initialize the first element to guard against cases where
* the caller fails before initializing str -- unicode_resize()
* reads str[0], and the Keep-Alive optimization can keep memory
@@ -367,24 +843,658 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
* We don't want unicode_resize to read uninitialized memory in
* that case.
*/
- unicode->str[0] = 0;
- unicode->str[length] = 0;
- unicode->length = length;
- unicode->hash = -1;
- unicode->state = 0;
- unicode->defenc = NULL;
+ _PyUnicode_WSTR(unicode)[0] = 0;
+ _PyUnicode_WSTR(unicode)[length] = 0;
+ _PyUnicode_WSTR_LENGTH(unicode) = length;
+ _PyUnicode_HASH(unicode) = -1;
+ _PyUnicode_STATE(unicode).interned = 0;
+ _PyUnicode_STATE(unicode).kind = 0;
+ _PyUnicode_STATE(unicode).compact = 0;
+ _PyUnicode_STATE(unicode).ready = 0;
+ _PyUnicode_STATE(unicode).ascii = 0;
+ _PyUnicode_DATA_ANY(unicode) = NULL;
+ _PyUnicode_LENGTH(unicode) = 0;
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ assert(_PyUnicode_CheckConsistency((PyObject *)unicode, 0));
return unicode;
+}
- onError:
- /* XXX UNREF/NEWREF interface should be more symmetrical */
- _Py_DEC_REFTOTAL;
- _Py_ForgetReference((PyObject *)unicode);
- PyObject_Del(unicode);
- return NULL;
+static const char*
+unicode_kind_name(PyObject *unicode)
+{
+ /* don't check consistency: unicode_kind_name() is called from
+ _PyUnicode_Dump() */
+ if (!PyUnicode_IS_COMPACT(unicode))
+ {
+ if (!PyUnicode_IS_READY(unicode))
+ return "wstr";
+ switch (PyUnicode_KIND(unicode))
+ {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(unicode))
+ return "legacy ascii";
+ else
+ return "legacy latin1";
+ case PyUnicode_2BYTE_KIND:
+ return "legacy UCS2";
+ case PyUnicode_4BYTE_KIND:
+ return "legacy UCS4";
+ default:
+ return "<legacy invalid kind>";
+ }
+ }
+ assert(PyUnicode_IS_READY(unicode));
+ switch (PyUnicode_KIND(unicode)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(unicode))
+ return "ascii";
+ else
+ return "latin1";
+ case PyUnicode_2BYTE_KIND:
+ return "UCS2";
+ case PyUnicode_4BYTE_KIND:
+ return "UCS4";
+ default:
+ return "<invalid compact kind>";
+ }
}
-static
-void unicode_dealloc(register PyUnicodeObject *unicode)
+#ifdef Py_DEBUG
+/* Functions wrapping macros for use in debugger */
+char *_PyUnicode_utf8(void *unicode){
+ return PyUnicode_UTF8(unicode);
+}
+
+void *_PyUnicode_compact_data(void *unicode) {
+ return _PyUnicode_COMPACT_DATA(unicode);
+}
+void *_PyUnicode_data(void *unicode){
+ printf("obj %p\n", unicode);
+ printf("compact %d\n", PyUnicode_IS_COMPACT(unicode));
+ printf("compact ascii %d\n", PyUnicode_IS_COMPACT_ASCII(unicode));
+ printf("ascii op %p\n", ((void*)((PyASCIIObject*)(unicode) + 1)));
+ printf("compact op %p\n", ((void*)((PyCompactUnicodeObject*)(unicode) + 1)));
+ printf("compact data %p\n", _PyUnicode_COMPACT_DATA(unicode));
+ return PyUnicode_DATA(unicode);
+}
+
+void
+_PyUnicode_Dump(PyObject *op)
+{
+ PyASCIIObject *ascii = (PyASCIIObject *)op;
+ PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
+ PyUnicodeObject *unicode = (PyUnicodeObject *)op;
+ void *data;
+
+ if (ascii->state.compact)
+ {
+ if (ascii->state.ascii)
+ data = (ascii + 1);
+ else
+ data = (compact + 1);
+ }
+ else
+ data = unicode->data.any;
+ printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length);
+
+ if (ascii->wstr == data)
+ printf("shared ");
+ printf("wstr=%p", ascii->wstr);
+
+ if (!(ascii->state.ascii == 1 && ascii->state.compact == 1)) {
+ printf(" (%zu), ", compact->wstr_length);
+ if (!ascii->state.compact && compact->utf8 == unicode->data.any)
+ printf("shared ");
+ printf("utf8=%p (%zu)", compact->utf8, compact->utf8_length);
+ }
+ printf(", data=%p\n", data);
+}
+#endif
+
+PyObject *
+PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar)
+{
+ PyObject *obj;
+ PyCompactUnicodeObject *unicode;
+ void *data;
+ enum PyUnicode_Kind kind;
+ int is_sharing, is_ascii;
+ Py_ssize_t char_size;
+ Py_ssize_t struct_size;
+
+ /* Optimization for empty strings */
+ if (size == 0 && unicode_empty != NULL) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
+
+ is_ascii = 0;
+ is_sharing = 0;
+ struct_size = sizeof(PyCompactUnicodeObject);
+ if (maxchar < 128) {
+ kind = PyUnicode_1BYTE_KIND;
+ char_size = 1;
+ is_ascii = 1;
+ struct_size = sizeof(PyASCIIObject);
+ }
+ else if (maxchar < 256) {
+ kind = PyUnicode_1BYTE_KIND;
+ char_size = 1;
+ }
+ else if (maxchar < 65536) {
+ kind = PyUnicode_2BYTE_KIND;
+ char_size = 2;
+ if (sizeof(wchar_t) == 2)
+ is_sharing = 1;
+ }
+ else {
+ if (maxchar > MAX_UNICODE) {
+ PyErr_SetString(PyExc_SystemError,
+ "invalid maximum character passed to PyUnicode_New");
+ return NULL;
+ }
+ kind = PyUnicode_4BYTE_KIND;
+ char_size = 4;
+ if (sizeof(wchar_t) == 4)
+ is_sharing = 1;
+ }
+
+ /* Ensure we won't overflow the size. */
+ if (size < 0) {
+ PyErr_SetString(PyExc_SystemError,
+ "Negative size passed to PyUnicode_New");
+ return NULL;
+ }
+ if (size > ((PY_SSIZE_T_MAX - struct_size) / char_size - 1))
+ return PyErr_NoMemory();
+
+ /* Duplicated allocation code from _PyObject_New() instead of a call to
+ * PyObject_New() so we are able to allocate space for the object and
+ * it's data buffer.
+ */
+ obj = (PyObject *) PyObject_MALLOC(struct_size + (size + 1) * char_size);
+ if (obj == NULL)
+ return PyErr_NoMemory();
+ obj = PyObject_INIT(obj, &PyUnicode_Type);
+ if (obj == NULL)
+ return NULL;
+
+ unicode = (PyCompactUnicodeObject *)obj;
+ if (is_ascii)
+ data = ((PyASCIIObject*)obj) + 1;
+ else
+ data = unicode + 1;
+ _PyUnicode_LENGTH(unicode) = size;
+ _PyUnicode_HASH(unicode) = -1;
+ _PyUnicode_STATE(unicode).interned = 0;
+ _PyUnicode_STATE(unicode).kind = kind;
+ _PyUnicode_STATE(unicode).compact = 1;
+ _PyUnicode_STATE(unicode).ready = 1;
+ _PyUnicode_STATE(unicode).ascii = is_ascii;
+ if (is_ascii) {
+ ((char*)data)[size] = 0;
+ _PyUnicode_WSTR(unicode) = NULL;
+ }
+ else if (kind == PyUnicode_1BYTE_KIND) {
+ ((char*)data)[size] = 0;
+ _PyUnicode_WSTR(unicode) = NULL;
+ _PyUnicode_WSTR_LENGTH(unicode) = 0;
+ unicode->utf8 = NULL;
+ unicode->utf8_length = 0;
+ }
+ else {
+ unicode->utf8 = NULL;
+ unicode->utf8_length = 0;
+ if (kind == PyUnicode_2BYTE_KIND)
+ ((Py_UCS2*)data)[size] = 0;
+ else /* kind == PyUnicode_4BYTE_KIND */
+ ((Py_UCS4*)data)[size] = 0;
+ if (is_sharing) {
+ _PyUnicode_WSTR_LENGTH(unicode) = size;
+ _PyUnicode_WSTR(unicode) = (wchar_t *)data;
+ }
+ else {
+ _PyUnicode_WSTR_LENGTH(unicode) = 0;
+ _PyUnicode_WSTR(unicode) = NULL;
+ }
+ }
+#ifdef Py_DEBUG
+ /* Fill the data with invalid characters to detect bugs earlier.
+ _PyUnicode_CheckConsistency(str, 1) detects invalid characters,
+ at least for ASCII and UCS-4 strings. U+00FF is invalid in ASCII
+ and U+FFFFFFFF is an invalid character in Unicode 6.0. */
+ memset(data, 0xff, size * kind);
+#endif
+ assert(_PyUnicode_CheckConsistency((PyObject*)unicode, 0));
+ return obj;
+}
+
+#if SIZEOF_WCHAR_T == 2
+/* Helper function to convert a 16-bits wchar_t representation to UCS4, this
+ will decode surrogate pairs, the other conversions are implemented as macros
+ for efficiency.
+
+ This function assumes that unicode can hold one more code point than wstr
+ characters for a terminating null character. */
+static void
+unicode_convert_wchar_to_ucs4(const wchar_t *begin, const wchar_t *end,
+ PyObject *unicode)
+{
+ const wchar_t *iter;
+ Py_UCS4 *ucs4_out;
+
+ assert(unicode != NULL);
+ assert(_PyUnicode_CHECK(unicode));
+ assert(_PyUnicode_KIND(unicode) == PyUnicode_4BYTE_KIND);
+ ucs4_out = PyUnicode_4BYTE_DATA(unicode);
+
+ for (iter = begin; iter < end; ) {
+ assert(ucs4_out < (PyUnicode_4BYTE_DATA(unicode) +
+ _PyUnicode_GET_LENGTH(unicode)));
+ if (Py_UNICODE_IS_HIGH_SURROGATE(iter[0])
+ && (iter+1) < end
+ && Py_UNICODE_IS_LOW_SURROGATE(iter[1]))
+ {
+ *ucs4_out++ = Py_UNICODE_JOIN_SURROGATES(iter[0], iter[1]);
+ iter += 2;
+ }
+ else {
+ *ucs4_out++ = *iter;
+ iter++;
+ }
+ }
+ assert(ucs4_out == (PyUnicode_4BYTE_DATA(unicode) +
+ _PyUnicode_GET_LENGTH(unicode)));
+
+}
+#endif
+
+static int
+unicode_check_modifiable(PyObject *unicode)
+{
+ if (!unicode_modifiable(unicode)) {
+ PyErr_SetString(PyExc_SystemError,
+ "Cannot modify a string currently used");
+ return -1;
+ }
+ return 0;
+}
+
+static int
+_copy_characters(PyObject *to, Py_ssize_t to_start,
+ PyObject *from, Py_ssize_t from_start,
+ Py_ssize_t how_many, int check_maxchar)
+{
+ unsigned int from_kind, to_kind;
+ void *from_data, *to_data;
+
+ assert(0 <= how_many);
+ assert(0 <= from_start);
+ assert(0 <= to_start);
+ assert(PyUnicode_Check(from));
+ assert(PyUnicode_IS_READY(from));
+ assert(from_start + how_many <= PyUnicode_GET_LENGTH(from));
+
+ assert(PyUnicode_Check(to));
+ assert(PyUnicode_IS_READY(to));
+ assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
+
+ if (how_many == 0)
+ return 0;
+
+ from_kind = PyUnicode_KIND(from);
+ from_data = PyUnicode_DATA(from);
+ to_kind = PyUnicode_KIND(to);
+ to_data = PyUnicode_DATA(to);
+
+#ifdef Py_DEBUG
+ if (!check_maxchar
+ && PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to))
+ {
+ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to);
+ Py_UCS4 ch;
+ Py_ssize_t i;
+ for (i=0; i < how_many; i++) {
+ ch = PyUnicode_READ(from_kind, from_data, from_start + i);
+ assert(ch <= to_maxchar);
+ }
+ }
+#endif
+
+ if (from_kind == to_kind) {
+ if (check_maxchar
+ && !PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to))
+ {
+ /* Writing Latin-1 characters into an ASCII string requires to
+ check that all written characters are pure ASCII */
+ Py_UCS4 max_char;
+ max_char = ucs1lib_find_max_char(from_data,
+ (Py_UCS1*)from_data + how_many);
+ if (max_char >= 128)
+ return -1;
+ }
+ Py_MEMCPY((char*)to_data + to_kind * to_start,
+ (char*)from_data + from_kind * from_start,
+ to_kind * how_many);
+ }
+ else if (from_kind == PyUnicode_1BYTE_KIND
+ && to_kind == PyUnicode_2BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS1, Py_UCS2,
+ PyUnicode_1BYTE_DATA(from) + from_start,
+ PyUnicode_1BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_2BYTE_DATA(to) + to_start
+ );
+ }
+ else if (from_kind == PyUnicode_1BYTE_KIND
+ && to_kind == PyUnicode_4BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS1, Py_UCS4,
+ PyUnicode_1BYTE_DATA(from) + from_start,
+ PyUnicode_1BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_4BYTE_DATA(to) + to_start
+ );
+ }
+ else if (from_kind == PyUnicode_2BYTE_KIND
+ && to_kind == PyUnicode_4BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS2, Py_UCS4,
+ PyUnicode_2BYTE_DATA(from) + from_start,
+ PyUnicode_2BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_4BYTE_DATA(to) + to_start
+ );
+ }
+ else {
+ assert (PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to));
+
+ if (!check_maxchar) {
+ if (from_kind == PyUnicode_2BYTE_KIND
+ && to_kind == PyUnicode_1BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS2, Py_UCS1,
+ PyUnicode_2BYTE_DATA(from) + from_start,
+ PyUnicode_2BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_1BYTE_DATA(to) + to_start
+ );
+ }
+ else if (from_kind == PyUnicode_4BYTE_KIND
+ && to_kind == PyUnicode_1BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS4, Py_UCS1,
+ PyUnicode_4BYTE_DATA(from) + from_start,
+ PyUnicode_4BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_1BYTE_DATA(to) + to_start
+ );
+ }
+ else if (from_kind == PyUnicode_4BYTE_KIND
+ && to_kind == PyUnicode_2BYTE_KIND)
+ {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS4, Py_UCS2,
+ PyUnicode_4BYTE_DATA(from) + from_start,
+ PyUnicode_4BYTE_DATA(from) + from_start + how_many,
+ PyUnicode_2BYTE_DATA(to) + to_start
+ );
+ }
+ else {
+ assert(0);
+ return -1;
+ }
+ }
+ else {
+ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to);
+ Py_UCS4 ch;
+ Py_ssize_t i;
+
+ for (i=0; i < how_many; i++) {
+ ch = PyUnicode_READ(from_kind, from_data, from_start + i);
+ if (ch > to_maxchar)
+ return -1;
+ PyUnicode_WRITE(to_kind, to_data, to_start + i, ch);
+ }
+ }
+ }
+ return 0;
+}
+
+void
+_PyUnicode_FastCopyCharacters(
+ PyObject *to, Py_ssize_t to_start,
+ PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many)
+{
+ (void)_copy_characters(to, to_start, from, from_start, how_many, 0);
+}
+
+Py_ssize_t
+PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start,
+ PyObject *from, Py_ssize_t from_start,
+ Py_ssize_t how_many)
+{
+ int err;
+
+ if (!PyUnicode_Check(from) || !PyUnicode_Check(to)) {
+ PyErr_BadInternalCall();
+ return -1;
+ }
+
+ if (PyUnicode_READY(from) == -1)
+ return -1;
+ if (PyUnicode_READY(to) == -1)
+ return -1;
+
+ if (from_start < 0) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -1;
+ }
+ if (to_start < 0) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -1;
+ }
+ how_many = Py_MIN(PyUnicode_GET_LENGTH(from), how_many);
+ if (to_start + how_many > PyUnicode_GET_LENGTH(to)) {
+ PyErr_Format(PyExc_SystemError,
+ "Cannot write %zi characters at %zi "
+ "in a string of %zi characters",
+ how_many, to_start, PyUnicode_GET_LENGTH(to));
+ return -1;
+ }
+
+ if (how_many == 0)
+ return 0;
+
+ if (unicode_check_modifiable(to))
+ return -1;
+
+ err = _copy_characters(to, to_start, from, from_start, how_many, 1);
+ if (err) {
+ PyErr_Format(PyExc_SystemError,
+ "Cannot copy %s characters "
+ "into a string of %s characters",
+ unicode_kind_name(from),
+ unicode_kind_name(to));
+ return -1;
+ }
+ return how_many;
+}
+
+/* Find the maximum code point and count the number of surrogate pairs so a
+ correct string length can be computed before converting a string to UCS4.
+ This function counts single surrogates as a character and not as a pair.
+
+ Return 0 on success, or -1 on error. */
+static int
+find_maxchar_surrogates(const wchar_t *begin, const wchar_t *end,
+ Py_UCS4 *maxchar, Py_ssize_t *num_surrogates)
+{
+ const wchar_t *iter;
+ Py_UCS4 ch;
+
+ assert(num_surrogates != NULL && maxchar != NULL);
+ *num_surrogates = 0;
+ *maxchar = 0;
+
+ for (iter = begin; iter < end; ) {
+#if SIZEOF_WCHAR_T == 2
+ if (Py_UNICODE_IS_HIGH_SURROGATE(iter[0])
+ && (iter+1) < end
+ && Py_UNICODE_IS_LOW_SURROGATE(iter[1]))
+ {
+ ch = Py_UNICODE_JOIN_SURROGATES(iter[0], iter[1]);
+ ++(*num_surrogates);
+ iter += 2;
+ }
+ else
+#endif
+ {
+ ch = *iter;
+ iter++;
+ }
+ if (ch > *maxchar) {
+ *maxchar = ch;
+ if (*maxchar > MAX_UNICODE) {
+ PyErr_Format(PyExc_ValueError,
+ "character U+%x is not in range [U+0000; U+10ffff]",
+ ch);
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
+int
+_PyUnicode_Ready(PyObject *unicode)
+{
+ wchar_t *end;
+ Py_UCS4 maxchar = 0;
+ Py_ssize_t num_surrogates;
+#if SIZEOF_WCHAR_T == 2
+ Py_ssize_t length_wo_surrogates;
+#endif
+
+ /* _PyUnicode_Ready() is only intended for old-style API usage where
+ strings were created using _PyObject_New() and where no canonical
+ representation (the str field) has been set yet aka strings
+ which are not yet ready. */
+ assert(_PyUnicode_CHECK(unicode));
+ assert(_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND);
+ assert(_PyUnicode_WSTR(unicode) != NULL);
+ assert(_PyUnicode_DATA_ANY(unicode) == NULL);
+ assert(_PyUnicode_UTF8(unicode) == NULL);
+ /* Actually, it should neither be interned nor be anything else: */
+ assert(_PyUnicode_STATE(unicode).interned == SSTATE_NOT_INTERNED);
+
+ end = _PyUnicode_WSTR(unicode) + _PyUnicode_WSTR_LENGTH(unicode);
+ if (find_maxchar_surrogates(_PyUnicode_WSTR(unicode), end,
+ &maxchar, &num_surrogates) == -1)
+ return -1;
+
+ if (maxchar < 256) {
+ _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(_PyUnicode_WSTR_LENGTH(unicode) + 1);
+ if (!_PyUnicode_DATA_ANY(unicode)) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ _PyUnicode_CONVERT_BYTES(wchar_t, unsigned char,
+ _PyUnicode_WSTR(unicode), end,
+ PyUnicode_1BYTE_DATA(unicode));
+ PyUnicode_1BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0';
+ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode);
+ _PyUnicode_STATE(unicode).kind = PyUnicode_1BYTE_KIND;
+ if (maxchar < 128) {
+ _PyUnicode_STATE(unicode).ascii = 1;
+ _PyUnicode_UTF8(unicode) = _PyUnicode_DATA_ANY(unicode);
+ _PyUnicode_UTF8_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode);
+ }
+ else {
+ _PyUnicode_STATE(unicode).ascii = 0;
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ }
+ PyObject_FREE(_PyUnicode_WSTR(unicode));
+ _PyUnicode_WSTR(unicode) = NULL;
+ _PyUnicode_WSTR_LENGTH(unicode) = 0;
+ }
+ /* In this case we might have to convert down from 4-byte native
+ wchar_t to 2-byte unicode. */
+ else if (maxchar < 65536) {
+ assert(num_surrogates == 0 &&
+ "FindMaxCharAndNumSurrogatePairs() messed up");
+
+#if SIZEOF_WCHAR_T == 2
+ /* We can share representations and are done. */
+ _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode);
+ PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0';
+ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode);
+ _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND;
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+#else
+ /* sizeof(wchar_t) == 4 */
+ _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(
+ 2 * (_PyUnicode_WSTR_LENGTH(unicode) + 1));
+ if (!_PyUnicode_DATA_ANY(unicode)) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ _PyUnicode_CONVERT_BYTES(wchar_t, Py_UCS2,
+ _PyUnicode_WSTR(unicode), end,
+ PyUnicode_2BYTE_DATA(unicode));
+ PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0';
+ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode);
+ _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND;
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ PyObject_FREE(_PyUnicode_WSTR(unicode));
+ _PyUnicode_WSTR(unicode) = NULL;
+ _PyUnicode_WSTR_LENGTH(unicode) = 0;
+#endif
+ }
+ /* maxchar exeeds 16 bit, wee need 4 bytes for unicode characters */
+ else {
+#if SIZEOF_WCHAR_T == 2
+ /* in case the native representation is 2-bytes, we need to allocate a
+ new normalized 4-byte version. */
+ length_wo_surrogates = _PyUnicode_WSTR_LENGTH(unicode) - num_surrogates;
+ _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(4 * (length_wo_surrogates + 1));
+ if (!_PyUnicode_DATA_ANY(unicode)) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ _PyUnicode_LENGTH(unicode) = length_wo_surrogates;
+ _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND;
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ /* unicode_convert_wchar_to_ucs4() requires a ready string */
+ _PyUnicode_STATE(unicode).ready = 1;
+ unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode);
+ PyObject_FREE(_PyUnicode_WSTR(unicode));
+ _PyUnicode_WSTR(unicode) = NULL;
+ _PyUnicode_WSTR_LENGTH(unicode) = 0;
+#else
+ assert(num_surrogates == 0);
+
+ _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode);
+ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode);
+ _PyUnicode_UTF8(unicode) = NULL;
+ _PyUnicode_UTF8_LENGTH(unicode) = 0;
+ _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND;
+#endif
+ PyUnicode_4BYTE_DATA(unicode)[_PyUnicode_LENGTH(unicode)] = '\0';
+ }
+ _PyUnicode_STATE(unicode).ready = 1;
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ return 0;
+}
+
+static void
+unicode_dealloc(register PyObject *unicode)
{
switch (PyUnicode_CHECK_INTERNED(unicode)) {
case SSTATE_NOT_INTERNED:
@@ -393,7 +1503,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode)
case SSTATE_INTERNED_MORTAL:
/* revive dead object temporarily for DelItem */
Py_REFCNT(unicode) = 3;
- if (PyDict_DelItem(interned, (PyObject *)unicode) != 0)
+ if (PyDict_DelItem(interned, unicode) != 0)
Py_FatalError(
"deletion of interned string failed");
break;
@@ -405,271 +1515,753 @@ void unicode_dealloc(register PyUnicodeObject *unicode)
Py_FatalError("Inconsistent interned string state.");
}
- if (PyUnicode_CheckExact(unicode) &&
- numfree < PyUnicode_MAXFREELIST) {
- /* Keep-Alive optimization */
- if (unicode->length >= KEEPALIVE_SIZE_LIMIT) {
- PyObject_DEL(unicode->str);
- unicode->str = NULL;
- unicode->length = 0;
- }
- if (unicode->defenc) {
- Py_CLEAR(unicode->defenc);
- }
- /* Add to free list */
- *(PyUnicodeObject **)unicode = free_list;
- free_list = unicode;
- numfree++;
- }
- else {
- PyObject_DEL(unicode->str);
- Py_XDECREF(unicode->defenc);
- Py_TYPE(unicode)->tp_free((PyObject *)unicode);
+ if (_PyUnicode_HAS_WSTR_MEMORY(unicode))
+ PyObject_DEL(_PyUnicode_WSTR(unicode));
+ if (_PyUnicode_HAS_UTF8_MEMORY(unicode))
+ PyObject_DEL(_PyUnicode_UTF8(unicode));
+ if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode))
+ PyObject_DEL(_PyUnicode_DATA_ANY(unicode));
+
+ Py_TYPE(unicode)->tp_free(unicode);
+}
+
+#ifdef Py_DEBUG
+static int
+unicode_is_singleton(PyObject *unicode)
+{
+ PyASCIIObject *ascii = (PyASCIIObject *)unicode;
+ if (unicode == unicode_empty)
+ return 1;
+ if (ascii->state.kind != PyUnicode_WCHAR_KIND && ascii->length == 1)
+ {
+ Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0);
+ if (ch < 256 && unicode_latin1[ch] == unicode)
+ return 1;
}
+ return 0;
}
+#endif
-static
-int _PyUnicode_Resize(PyUnicodeObject **unicode, Py_ssize_t length)
+static int
+unicode_modifiable(PyObject *unicode)
+{
+ assert(_PyUnicode_CHECK(unicode));
+ if (Py_REFCNT(unicode) != 1)
+ return 0;
+ if (_PyUnicode_HASH(unicode) != -1)
+ return 0;
+ if (PyUnicode_CHECK_INTERNED(unicode))
+ return 0;
+ if (!PyUnicode_CheckExact(unicode))
+ return 0;
+#ifdef Py_DEBUG
+ /* singleton refcount is greater than 1 */
+ assert(!unicode_is_singleton(unicode));
+#endif
+ return 1;
+}
+
+static int
+unicode_resize(PyObject **p_unicode, Py_ssize_t length)
{
- register PyUnicodeObject *v;
+ PyObject *unicode;
+ Py_ssize_t old_length;
- /* Argument checks */
- if (unicode == NULL) {
+ assert(p_unicode != NULL);
+ unicode = *p_unicode;
+
+ assert(unicode != NULL);
+ assert(PyUnicode_Check(unicode));
+ assert(0 <= length);
+
+ if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND)
+ old_length = PyUnicode_WSTR_LENGTH(unicode);
+ else
+ old_length = PyUnicode_GET_LENGTH(unicode);
+ if (old_length == length)
+ return 0;
+
+ if (length == 0) {
+ Py_DECREF(*p_unicode);
+ *p_unicode = unicode_empty;
+ Py_INCREF(*p_unicode);
+ return 0;
+ }
+
+ if (!unicode_modifiable(unicode)) {
+ PyObject *copy = resize_copy(unicode, length);
+ if (copy == NULL)
+ return -1;
+ Py_DECREF(*p_unicode);
+ *p_unicode = copy;
+ return 0;
+ }
+
+ if (PyUnicode_IS_COMPACT(unicode)) {
+ PyObject *new_unicode = resize_compact(unicode, length);
+ if (new_unicode == NULL)
+ return -1;
+ *p_unicode = new_unicode;
+ return 0;
+ }
+ return resize_inplace(unicode, length);
+}
+
+int
+PyUnicode_Resize(PyObject **p_unicode, Py_ssize_t length)
+{
+ PyObject *unicode;
+ if (p_unicode == NULL) {
PyErr_BadInternalCall();
return -1;
}
- v = *unicode;
- if (v == NULL || !PyUnicode_Check(v) || Py_REFCNT(v) != 1 || length < 0) {
+ unicode = *p_unicode;
+ if (unicode == NULL || !PyUnicode_Check(unicode) || length < 0)
+ {
PyErr_BadInternalCall();
return -1;
}
+ return unicode_resize(p_unicode, length);
+}
- /* Resizing unicode_empty and single character objects is not
- possible since these are being shared. We simply return a fresh
- copy with the same Unicode content. */
- if (v->length != length &&
- (v == unicode_empty || v->length == 1)) {
- PyUnicodeObject *w = _PyUnicode_New(length);
- if (w == NULL)
- return -1;
- Py_UNICODE_COPY(w->str, v->str,
- length < v->length ? length : v->length);
- Py_DECREF(*unicode);
- *unicode = w;
+static int
+unicode_widen(PyObject **p_unicode, Py_ssize_t length,
+ unsigned int maxchar)
+{
+ PyObject *result;
+ assert(PyUnicode_IS_READY(*p_unicode));
+ assert(length <= PyUnicode_GET_LENGTH(*p_unicode));
+ if (maxchar <= PyUnicode_MAX_CHAR_VALUE(*p_unicode))
return 0;
+ result = PyUnicode_New(PyUnicode_GET_LENGTH(*p_unicode),
+ maxchar);
+ if (result == NULL)
+ return -1;
+ _PyUnicode_FastCopyCharacters(result, 0, *p_unicode, 0, length);
+ Py_DECREF(*p_unicode);
+ *p_unicode = result;
+ return 0;
+}
+
+static int
+unicode_putchar(PyObject **p_unicode, Py_ssize_t *pos,
+ Py_UCS4 ch)
+{
+ assert(ch <= MAX_UNICODE);
+ if (unicode_widen(p_unicode, *pos, ch) < 0)
+ return -1;
+ PyUnicode_WRITE(PyUnicode_KIND(*p_unicode),
+ PyUnicode_DATA(*p_unicode),
+ (*pos)++, ch);
+ return 0;
+}
+
+/* Copy a ASCII or latin1 char* string into a Python Unicode string.
+
+ WARNING: The function doesn't copy the terminating null character and
+ doesn't check the maximum character (may write a latin1 character in an
+ ASCII string). */
+static void
+unicode_write_cstr(PyObject *unicode, Py_ssize_t index,
+ const char *str, Py_ssize_t len)
+{
+ enum PyUnicode_Kind kind = PyUnicode_KIND(unicode);
+ void *data = PyUnicode_DATA(unicode);
+ const char *end = str + len;
+
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND: {
+ assert(index + len <= PyUnicode_GET_LENGTH(unicode));
+ memcpy((char *) data + index, str, len);
+ break;
+ }
+ case PyUnicode_2BYTE_KIND: {
+ Py_UCS2 *start = (Py_UCS2 *)data + index;
+ Py_UCS2 *ucs2 = start;
+ assert(index <= PyUnicode_GET_LENGTH(unicode));
+
+ for (; str < end; ++ucs2, ++str)
+ *ucs2 = (Py_UCS2)*str;
+
+ assert((ucs2 - start) <= PyUnicode_GET_LENGTH(unicode));
+ break;
}
+ default: {
+ Py_UCS4 *start = (Py_UCS4 *)data + index;
+ Py_UCS4 *ucs4 = start;
+ assert(kind == PyUnicode_4BYTE_KIND);
+ assert(index <= PyUnicode_GET_LENGTH(unicode));
+
+ for (; str < end; ++ucs4, ++str)
+ *ucs4 = (Py_UCS4)*str;
- /* Note that we don't have to modify *unicode for unshared Unicode
- objects, since we can modify them in-place. */
- return unicode_resize(v, length);
+ assert((ucs4 - start) <= PyUnicode_GET_LENGTH(unicode));
+ }
+ }
}
-int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
+
+static PyObject*
+get_latin1_char(unsigned char ch)
{
- return _PyUnicode_Resize((PyUnicodeObject **)unicode, length);
+ PyObject *unicode = unicode_latin1[ch];
+ if (!unicode) {
+ unicode = PyUnicode_New(1, ch);
+ if (!unicode)
+ return NULL;
+ PyUnicode_1BYTE_DATA(unicode)[0] = ch;
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ unicode_latin1[ch] = unicode;
+ }
+ Py_INCREF(unicode);
+ return unicode;
}
-PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u,
- Py_ssize_t size)
+PyObject *
+PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
{
- PyUnicodeObject *unicode;
+ PyObject *unicode;
+ Py_UCS4 maxchar = 0;
+ Py_ssize_t num_surrogates;
+
+ if (u == NULL)
+ return (PyObject*)_PyUnicode_New(size);
/* If the Unicode data is known at construction time, we can apply
some optimizations which share commonly used objects. */
- if (u != NULL) {
- /* Optimization for empty strings */
- if (size == 0 && unicode_empty != NULL) {
- Py_INCREF(unicode_empty);
- return (PyObject *)unicode_empty;
- }
-
- /* Single character Unicode objects in the Latin-1 range are
- shared when using this constructor */
- if (size == 1 && *u < 256) {
- unicode = unicode_latin1[*u];
- if (!unicode) {
- unicode = _PyUnicode_New(1);
- if (!unicode)
- return NULL;
- unicode->str[0] = *u;
- unicode_latin1[*u] = unicode;
- }
- Py_INCREF(unicode);
- return (PyObject *)unicode;
- }
+ /* Optimization for empty strings */
+ if (size == 0 && unicode_empty != NULL) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
- unicode = _PyUnicode_New(size);
+ /* Single character Unicode objects in the Latin-1 range are
+ shared when using this constructor */
+ if (size == 1 && *u < 256)
+ return get_latin1_char((unsigned char)*u);
+
+ /* If not empty and not single character, copy the Unicode data
+ into the new object */
+ if (find_maxchar_surrogates(u, u + size,
+ &maxchar, &num_surrogates) == -1)
+ return NULL;
+
+ unicode = PyUnicode_New(size - num_surrogates, maxchar);
if (!unicode)
return NULL;
- /* Copy the Unicode data into the new object */
- if (u != NULL)
- Py_UNICODE_COPY(unicode->str, u, size);
+ switch (PyUnicode_KIND(unicode)) {
+ case PyUnicode_1BYTE_KIND:
+ _PyUnicode_CONVERT_BYTES(Py_UNICODE, unsigned char,
+ u, u + size, PyUnicode_1BYTE_DATA(unicode));
+ break;
+ case PyUnicode_2BYTE_KIND:
+#if Py_UNICODE_SIZE == 2
+ Py_MEMCPY(PyUnicode_2BYTE_DATA(unicode), u, size * 2);
+#else
+ _PyUnicode_CONVERT_BYTES(Py_UNICODE, Py_UCS2,
+ u, u + size, PyUnicode_2BYTE_DATA(unicode));
+#endif
+ break;
+ case PyUnicode_4BYTE_KIND:
+#if SIZEOF_WCHAR_T == 2
+ /* This is the only case which has to process surrogates, thus
+ a simple copy loop is not enough and we need a function. */
+ unicode_convert_wchar_to_ucs4(u, u + size, unicode);
+#else
+ assert(num_surrogates == 0);
+ Py_MEMCPY(PyUnicode_4BYTE_DATA(unicode), u, size * 4);
+#endif
+ break;
+ default:
+ assert(0 && "Impossible state");
+ }
- return (PyObject *)unicode;
+ return unicode_result(unicode);
}
-PyObject *PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
+PyObject *
+PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
{
- PyUnicodeObject *unicode;
-
if (size < 0) {
PyErr_SetString(PyExc_SystemError,
"Negative size passed to PyUnicode_FromStringAndSize");
return NULL;
}
+ if (u != NULL)
+ return PyUnicode_DecodeUTF8Stateful(u, size, NULL, NULL);
+ else
+ return (PyObject *)_PyUnicode_New(size);
+}
- /* If the Unicode data is known at construction time, we can apply
- some optimizations which share commonly used objects.
- Also, this means the input must be UTF-8, so fall back to the
- UTF-8 decoder at the end. */
- if (u != NULL) {
-
- /* Optimization for empty strings */
- if (size == 0 && unicode_empty != NULL) {
- Py_INCREF(unicode_empty);
- return (PyObject *)unicode_empty;
- }
+PyObject *
+PyUnicode_FromString(const char *u)
+{
+ size_t size = strlen(u);
+ if (size > PY_SSIZE_T_MAX) {
+ PyErr_SetString(PyExc_OverflowError, "input too long");
+ return NULL;
+ }
+ return PyUnicode_DecodeUTF8Stateful(u, (Py_ssize_t)size, NULL, NULL);
+}
- /* Single characters are shared when using this constructor.
- Restrict to ASCII, since the input must be UTF-8. */
- if (size == 1 && Py_CHARMASK(*u) < 128) {
- unicode = unicode_latin1[Py_CHARMASK(*u)];
- if (!unicode) {
- unicode = _PyUnicode_New(1);
- if (!unicode)
- return NULL;
- unicode->str[0] = Py_CHARMASK(*u);
- unicode_latin1[Py_CHARMASK(*u)] = unicode;
- }
- Py_INCREF(unicode);
- return (PyObject *)unicode;
- }
+PyObject *
+_PyUnicode_FromId(_Py_Identifier *id)
+{
+ if (!id->object) {
+ id->object = PyUnicode_DecodeUTF8Stateful(id->string,
+ strlen(id->string),
+ NULL, NULL);
+ if (!id->object)
+ return NULL;
+ PyUnicode_InternInPlace(&id->object);
+ assert(!id->next);
+ id->next = static_strings;
+ static_strings = id;
+ }
+ return id->object;
+}
- return PyUnicode_DecodeUTF8(u, size, NULL);
+void
+_PyUnicode_ClearStaticStrings()
+{
+ _Py_Identifier *i;
+ for (i = static_strings; i; i = i->next) {
+ Py_DECREF(i->object);
+ i->object = NULL;
+ i->next = NULL;
}
+}
+
+/* Internal function, doesn't check maximum character */
- unicode = _PyUnicode_New(size);
+PyObject*
+_PyUnicode_FromASCII(const char *buffer, Py_ssize_t size)
+{
+ const unsigned char *s = (const unsigned char *)buffer;
+ PyObject *unicode;
+ if (size == 1) {
+#ifdef Py_DEBUG
+ assert(s[0] < 128);
+#endif
+ return get_latin1_char(s[0]);
+ }
+ unicode = PyUnicode_New(size, 127);
if (!unicode)
return NULL;
+ memcpy(PyUnicode_1BYTE_DATA(unicode), s, size);
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ return unicode;
+}
- return (PyObject *)unicode;
+static Py_UCS4
+kind_maxchar_limit(unsigned int kind)
+{
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ return 0x80;
+ case PyUnicode_2BYTE_KIND:
+ return 0x100;
+ case PyUnicode_4BYTE_KIND:
+ return 0x10000;
+ default:
+ assert(0 && "invalid kind");
+ return MAX_UNICODE;
+ }
}
-PyObject *PyUnicode_FromString(const char *u)
+Py_LOCAL_INLINE(Py_UCS4)
+align_maxchar(Py_UCS4 maxchar)
{
- size_t size = strlen(u);
- if (size > PY_SSIZE_T_MAX) {
- PyErr_SetString(PyExc_OverflowError, "input too long");
- return NULL;
+ if (maxchar <= 127)
+ return 127;
+ else if (maxchar <= 255)
+ return 255;
+ else if (maxchar <= 65535)
+ return 65535;
+ else
+ return MAX_UNICODE;
+}
+
+static PyObject*
+_PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size)
+{
+ PyObject *res;
+ unsigned char max_char;
+
+ if (size == 0) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
+ assert(size > 0);
+ if (size == 1)
+ return get_latin1_char(u[0]);
- return PyUnicode_FromStringAndSize(u, size);
+ max_char = ucs1lib_find_max_char(u, u + size);
+ res = PyUnicode_New(size, max_char);
+ if (!res)
+ return NULL;
+ memcpy(PyUnicode_1BYTE_DATA(res), u, size);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
}
-#ifdef HAVE_WCHAR_H
+static PyObject*
+_PyUnicode_FromUCS2(const Py_UCS2 *u, Py_ssize_t size)
+{
+ PyObject *res;
+ Py_UCS2 max_char;
-#if (Py_UNICODE_SIZE == 2) && defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
-# define CONVERT_WCHAR_TO_SURROGATES
-#endif
+ if (size == 0) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
+ assert(size > 0);
+ if (size == 1) {
+ Py_UCS4 ch = u[0];
+ if (ch < 256)
+ return get_latin1_char((unsigned char)ch);
-#ifdef CONVERT_WCHAR_TO_SURROGATES
+ res = PyUnicode_New(1, ch);
+ if (res == NULL)
+ return NULL;
+ PyUnicode_WRITE(PyUnicode_KIND(res), PyUnicode_DATA(res), 0, ch);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
+ }
-/* Here sizeof(wchar_t) is 4 but Py_UNICODE_SIZE == 2, so we need
- to convert from UTF32 to UTF16. */
+ max_char = ucs2lib_find_max_char(u, u + size);
+ res = PyUnicode_New(size, max_char);
+ if (!res)
+ return NULL;
+ if (max_char >= 256)
+ memcpy(PyUnicode_2BYTE_DATA(res), u, sizeof(Py_UCS2)*size);
+ else {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS2, Py_UCS1, u, u + size, PyUnicode_1BYTE_DATA(res));
+ }
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
+}
-PyObject *PyUnicode_FromWideChar(register const wchar_t *w,
- Py_ssize_t size)
+static PyObject*
+_PyUnicode_FromUCS4(const Py_UCS4 *u, Py_ssize_t size)
{
- PyUnicodeObject *unicode;
- register Py_ssize_t i;
- Py_ssize_t alloc;
- const wchar_t *orig_w;
+ PyObject *res;
+ Py_UCS4 max_char;
- if (w == NULL) {
- if (size == 0)
- return PyUnicode_FromStringAndSize(NULL, 0);
- PyErr_BadInternalCall();
- return NULL;
+ if (size == 0) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
+ assert(size > 0);
+ if (size == 1) {
+ Py_UCS4 ch = u[0];
+ if (ch < 256)
+ return get_latin1_char((unsigned char)ch);
- if (size == -1) {
- size = wcslen(w);
+ res = PyUnicode_New(1, ch);
+ if (res == NULL)
+ return NULL;
+ PyUnicode_WRITE(PyUnicode_KIND(res), PyUnicode_DATA(res), 0, ch);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
}
- alloc = size;
- orig_w = w;
- for (i = size; i > 0; i--) {
- if (*w > 0xFFFF)
- alloc++;
- w++;
+ max_char = ucs4lib_find_max_char(u, u + size);
+ res = PyUnicode_New(size, max_char);
+ if (!res)
+ return NULL;
+ if (max_char < 256)
+ _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS1, u, u + size,
+ PyUnicode_1BYTE_DATA(res));
+ else if (max_char < 0x10000)
+ _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS2, u, u + size,
+ PyUnicode_2BYTE_DATA(res));
+ else
+ memcpy(PyUnicode_4BYTE_DATA(res), u, sizeof(Py_UCS4)*size);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
+}
+
+PyObject*
+PyUnicode_FromKindAndData(int kind, const void *buffer, Py_ssize_t size)
+{
+ if (size < 0) {
+ PyErr_SetString(PyExc_ValueError, "size must be positive");
+ return NULL;
}
- w = orig_w;
- unicode = _PyUnicode_New(alloc);
- if (!unicode)
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ return _PyUnicode_FromUCS1(buffer, size);
+ case PyUnicode_2BYTE_KIND:
+ return _PyUnicode_FromUCS2(buffer, size);
+ case PyUnicode_4BYTE_KIND:
+ return _PyUnicode_FromUCS4(buffer, size);
+ default:
+ PyErr_SetString(PyExc_SystemError, "invalid kind");
return NULL;
+ }
+}
- /* Copy the wchar_t data into the new object */
- {
- register Py_UNICODE *u;
- u = PyUnicode_AS_UNICODE(unicode);
- for (i = size; i > 0; i--) {
- if (*w > 0xFFFF) {
- wchar_t ordinal = *w++;
- ordinal -= 0x10000;
- *u++ = 0xD800 | (ordinal >> 10);
- *u++ = 0xDC00 | (ordinal & 0x3FF);
- }
- else
- *u++ = *w++;
- }
+Py_UCS4
+_PyUnicode_FindMaxChar(PyObject *unicode, Py_ssize_t start, Py_ssize_t end)
+{
+ enum PyUnicode_Kind kind;
+ void *startptr, *endptr;
+
+ assert(PyUnicode_IS_READY(unicode));
+ assert(0 <= start);
+ assert(end <= PyUnicode_GET_LENGTH(unicode));
+ assert(start <= end);
+
+ if (start == 0 && end == PyUnicode_GET_LENGTH(unicode))
+ return PyUnicode_MAX_CHAR_VALUE(unicode);
+
+ if (start == end)
+ return 127;
+
+ if (PyUnicode_IS_ASCII(unicode))
+ return 127;
+
+ kind = PyUnicode_KIND(unicode);
+ startptr = PyUnicode_DATA(unicode);
+ endptr = (char *)startptr + end * kind;
+ startptr = (char *)startptr + start * kind;
+ switch(kind) {
+ case PyUnicode_1BYTE_KIND:
+ return ucs1lib_find_max_char(startptr, endptr);
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_find_max_char(startptr, endptr);
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_find_max_char(startptr, endptr);
+ default:
+ assert(0);
+ return 0;
}
- return (PyObject *)unicode;
}
-#else
+/* Ensure that a string uses the most efficient storage, if it is not the
+ case: create a new string with of the right kind. Write NULL into *p_unicode
+ on error. */
+static void
+unicode_adjust_maxchar(PyObject **p_unicode)
+{
+ PyObject *unicode, *copy;
+ Py_UCS4 max_char;
+ Py_ssize_t len;
+ unsigned int kind;
-PyObject *PyUnicode_FromWideChar(register const wchar_t *w,
- Py_ssize_t size)
+ assert(p_unicode != NULL);
+ unicode = *p_unicode;
+ assert(PyUnicode_IS_READY(unicode));
+ if (PyUnicode_IS_ASCII(unicode))
+ return;
+
+ len = PyUnicode_GET_LENGTH(unicode);
+ kind = PyUnicode_KIND(unicode);
+ if (kind == PyUnicode_1BYTE_KIND) {
+ const Py_UCS1 *u = PyUnicode_1BYTE_DATA(unicode);
+ max_char = ucs1lib_find_max_char(u, u + len);
+ if (max_char >= 128)
+ return;
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ const Py_UCS2 *u = PyUnicode_2BYTE_DATA(unicode);
+ max_char = ucs2lib_find_max_char(u, u + len);
+ if (max_char >= 256)
+ return;
+ }
+ else {
+ const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode);
+ assert(kind == PyUnicode_4BYTE_KIND);
+ max_char = ucs4lib_find_max_char(u, u + len);
+ if (max_char >= 0x10000)
+ return;
+ }
+ copy = PyUnicode_New(len, max_char);
+ if (copy != NULL)
+ _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, len);
+ Py_DECREF(unicode);
+ *p_unicode = copy;
+}
+
+PyObject*
+_PyUnicode_Copy(PyObject *unicode)
{
- PyUnicodeObject *unicode;
+ Py_ssize_t length;
+ PyObject *copy;
- if (w == NULL) {
- if (size == 0)
- return PyUnicode_FromStringAndSize(NULL, 0);
+ if (!PyUnicode_Check(unicode)) {
PyErr_BadInternalCall();
return NULL;
}
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
- if (size == -1) {
- size = wcslen(w);
+ length = PyUnicode_GET_LENGTH(unicode);
+ copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode));
+ if (!copy)
+ return NULL;
+ assert(PyUnicode_KIND(copy) == PyUnicode_KIND(unicode));
+
+ Py_MEMCPY(PyUnicode_DATA(copy), PyUnicode_DATA(unicode),
+ length * PyUnicode_KIND(unicode));
+ assert(_PyUnicode_CheckConsistency(copy, 1));
+ return copy;
+}
+
+
+/* Widen Unicode objects to larger buffers. Don't write terminating null
+ character. Return NULL on error. */
+
+void*
+_PyUnicode_AsKind(PyObject *s, unsigned int kind)
+{
+ Py_ssize_t len;
+ void *result;
+ unsigned int skind;
+
+ if (PyUnicode_READY(s) == -1)
+ return NULL;
+
+ len = PyUnicode_GET_LENGTH(s);
+ skind = PyUnicode_KIND(s);
+ if (skind >= kind) {
+ PyErr_SetString(PyExc_SystemError, "invalid widening attempt");
+ return NULL;
}
+ switch (kind) {
+ case PyUnicode_2BYTE_KIND:
+ result = PyMem_Malloc(len * sizeof(Py_UCS2));
+ if (!result)
+ return PyErr_NoMemory();
+ assert(skind == PyUnicode_1BYTE_KIND);
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS1, Py_UCS2,
+ PyUnicode_1BYTE_DATA(s),
+ PyUnicode_1BYTE_DATA(s) + len,
+ result);
+ return result;
+ case PyUnicode_4BYTE_KIND:
+ result = PyMem_Malloc(len * sizeof(Py_UCS4));
+ if (!result)
+ return PyErr_NoMemory();
+ if (skind == PyUnicode_2BYTE_KIND) {
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS2, Py_UCS4,
+ PyUnicode_2BYTE_DATA(s),
+ PyUnicode_2BYTE_DATA(s) + len,
+ result);
+ }
+ else {
+ assert(skind == PyUnicode_1BYTE_KIND);
+ _PyUnicode_CONVERT_BYTES(
+ Py_UCS1, Py_UCS4,
+ PyUnicode_1BYTE_DATA(s),
+ PyUnicode_1BYTE_DATA(s) + len,
+ result);
+ }
+ return result;
+ default:
+ break;
+ }
+ PyErr_SetString(PyExc_SystemError, "invalid kind");
+ return NULL;
+}
- unicode = _PyUnicode_New(size);
- if (!unicode)
+static Py_UCS4*
+as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize,
+ int copy_null)
+{
+ int kind;
+ void *data;
+ Py_ssize_t len, targetlen;
+ if (PyUnicode_READY(string) == -1)
return NULL;
+ kind = PyUnicode_KIND(string);
+ data = PyUnicode_DATA(string);
+ len = PyUnicode_GET_LENGTH(string);
+ targetlen = len;
+ if (copy_null)
+ targetlen++;
+ if (!target) {
+ if (PY_SSIZE_T_MAX / sizeof(Py_UCS4) < targetlen) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ target = PyMem_Malloc(targetlen * sizeof(Py_UCS4));
+ if (!target) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ }
+ else {
+ if (targetsize < targetlen) {
+ PyErr_Format(PyExc_SystemError,
+ "string is longer than the buffer");
+ if (copy_null && 0 < targetsize)
+ target[0] = 0;
+ return NULL;
+ }
+ }
+ if (kind == PyUnicode_1BYTE_KIND) {
+ Py_UCS1 *start = (Py_UCS1 *) data;
+ _PyUnicode_CONVERT_BYTES(Py_UCS1, Py_UCS4, start, start + len, target);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *start = (Py_UCS2 *) data;
+ _PyUnicode_CONVERT_BYTES(Py_UCS2, Py_UCS4, start, start + len, target);
+ }
+ else {
+ assert(kind == PyUnicode_4BYTE_KIND);
+ Py_MEMCPY(target, data, len * sizeof(Py_UCS4));
+ }
+ if (copy_null)
+ target[len] = 0;
+ return target;
+}
- /* Copy the wchar_t data into the new object */
-#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
- memcpy(unicode->str, w, size * sizeof(wchar_t));
-#else
- {
- register Py_UNICODE *u;
- register Py_ssize_t i;
- u = PyUnicode_AS_UNICODE(unicode);
- for (i = size; i > 0; i--)
- *u++ = *w++;
+Py_UCS4*
+PyUnicode_AsUCS4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize,
+ int copy_null)
+{
+ if (target == NULL || targetsize < 0) {
+ PyErr_BadInternalCall();
+ return NULL;
}
-#endif
+ return as_ucs4(string, target, targetsize, copy_null);
+}
- return (PyObject *)unicode;
+Py_UCS4*
+PyUnicode_AsUCS4Copy(PyObject *string)
+{
+ return as_ucs4(string, NULL, 0, 1);
}
-#endif /* CONVERT_WCHAR_TO_SURROGATES */
+#ifdef HAVE_WCHAR_H
+
+PyObject *
+PyUnicode_FromWideChar(register const wchar_t *w, Py_ssize_t size)
+{
+ if (w == NULL) {
+ if (size == 0) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+
+ if (size == -1) {
+ size = wcslen(w);
+ }
+
+ return PyUnicode_FromUnicode(w, size);
+}
-#undef CONVERT_WCHAR_TO_SURROGATES
+#endif /* HAVE_WCHAR_H */
static void
makefmt(char *fmt, int longflag, int longlongflag, int size_tflag,
@@ -707,10 +2299,71 @@ makefmt(char *fmt, int longflag, int longlongflag, int size_tflag,
*fmt = '\0';
}
-#define appendstring(string) {for (copy = string;*copy;) *s++ = *copy++;}
+/* helper for PyUnicode_FromFormatV() */
+
+static const char*
+parse_format_flags(const char *f,
+ int *p_width, int *p_precision,
+ int *p_longflag, int *p_longlongflag, int *p_size_tflag)
+{
+ int width, precision, longflag, longlongflag, size_tflag;
+
+ /* parse the width.precision part, e.g. "%2.5s" => width=2, precision=5 */
+ f++;
+ width = 0;
+ while (Py_ISDIGIT((unsigned)*f))
+ width = (width*10) + *f++ - '0';
+ precision = 0;
+ if (*f == '.') {
+ f++;
+ while (Py_ISDIGIT((unsigned)*f))
+ precision = (precision*10) + *f++ - '0';
+ if (*f == '%') {
+ /* "%.3%s" => f points to "3" */
+ f--;
+ }
+ }
+ if (*f == '\0') {
+ /* bogus format "%.1" => go backward, f points to "1" */
+ f--;
+ }
+ if (p_width != NULL)
+ *p_width = width;
+ if (p_precision != NULL)
+ *p_precision = precision;
+
+ /* Handle %ld, %lu, %lld and %llu. */
+ longflag = 0;
+ longlongflag = 0;
+ size_tflag = 0;
+
+ if (*f == 'l') {
+ if (f[1] == 'd' || f[1] == 'u' || f[1] == 'i') {
+ longflag = 1;
+ ++f;
+ }
+#ifdef HAVE_LONG_LONG
+ else if (f[1] == 'l' &&
+ (f[2] == 'd' || f[2] == 'u' || f[2] == 'i')) {
+ longlongflag = 1;
+ f += 2;
+ }
+#endif
+ }
+ /* handle the size_t flag. */
+ else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u' || f[1] == 'i')) {
+ size_tflag = 1;
+ ++f;
+ }
+ if (p_longflag != NULL)
+ *p_longflag = longflag;
+ if (p_longlongflag != NULL)
+ *p_longlongflag = longlongflag;
+ if (p_size_tflag != NULL)
+ *p_size_tflag = size_tflag;
+ return f;
+}
-/* size of fixed-size buffer for formatting single arguments */
-#define ITEM_BUFFER_LEN 21
/* maximum number of characters required for output of %ld. 21 characters
allows for 64-bit integers (in decimal) and an optional sign. */
#define MAX_LONG_CHARS 21
@@ -731,132 +2384,197 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
int precision = 0;
int zeropad;
const char* f;
- Py_UNICODE *s;
PyObject *string;
/* used by sprintf */
- char buffer[ITEM_BUFFER_LEN+1];
- /* use abuffer instead of buffer, if we need more space
- * (which can happen if there's a format specifier with width). */
- char *abuffer = NULL;
- char *realbuffer;
- Py_ssize_t abuffersize = 0;
char fmt[61]; /* should be enough for %0width.precisionlld */
- const char *copy;
+ Py_UCS4 maxchar = 127; /* result is ASCII by default */
+ Py_UCS4 argmaxchar;
+ Py_ssize_t numbersize = 0;
+ char *numberresults = NULL;
+ char *numberresult = NULL;
+ Py_ssize_t i;
+ int kind;
+ void *data;
Py_VA_COPY(count, vargs);
/* step 1: count the number of %S/%R/%A/%s format specifications
* (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/
* PyUnicode_DecodeUTF8() for these objects once during step 3 and put the
- * result in an array) */
+ * result in an array)
+ * also estimate a upper bound for all the number formats in the string,
+ * numbers will be formatted in step 3 and be kept in a '\0'-separated
+ * buffer before putting everything together. */
for (f = format; *f; f++) {
- if (*f == '%') {
- if (*(f+1)=='%')
- continue;
- if (*(f+1)=='S' || *(f+1)=='R' || *(f+1)=='A' || *(f+1) == 'V')
- ++callcount;
- while (Py_ISDIGIT((unsigned)*f))
- width = (width*10) + *f++ - '0';
- while (*++f && *f != '%' && !Py_ISALPHA((unsigned)*f))
- ;
- if (*f == 's')
- ++callcount;
- }
- else if (128 <= (unsigned char)*f) {
- PyErr_Format(PyExc_ValueError,
+ if (*f == '%') {
+ int longlongflag;
+ /* skip width or width.precision (eg. "1.2" of "%1.2f") */
+ f = parse_format_flags(f, &width, NULL, NULL, &longlongflag, NULL);
+ if (*f == 's' || *f=='S' || *f=='R' || *f=='A' || *f=='V')
+ ++callcount;
+
+ else if (*f == 'd' || *f=='u' || *f=='i' || *f=='x' || *f=='p') {
+#ifdef HAVE_LONG_LONG
+ if (longlongflag) {
+ if (width < MAX_LONG_LONG_CHARS)
+ width = MAX_LONG_LONG_CHARS;
+ }
+ else
+#endif
+ /* MAX_LONG_CHARS is enough to hold a 64-bit integer,
+ including sign. Decimal takes the most space. This
+ isn't enough for octal. If a width is specified we
+ need more (which we allocate later). */
+ if (width < MAX_LONG_CHARS)
+ width = MAX_LONG_CHARS;
+
+ /* account for the size + '\0' to separate numbers
+ inside of the numberresults buffer */
+ numbersize += (width + 1);
+ }
+ }
+ else if ((unsigned char)*f > 127) {
+ PyErr_Format(PyExc_ValueError,
"PyUnicode_FromFormatV() expects an ASCII-encoded format "
"string, got a non-ASCII byte: 0x%02x",
(unsigned char)*f);
- return NULL;
- }
+ return NULL;
+ }
}
/* step 2: allocate memory for the results of
* PyObject_Str()/PyObject_Repr()/PyUnicode_DecodeUTF8() calls */
if (callcount) {
- callresults = PyObject_Malloc(sizeof(PyObject *)*callcount);
+ callresults = PyObject_Malloc(sizeof(PyObject *) * callcount);
if (!callresults) {
PyErr_NoMemory();
return NULL;
}
callresult = callresults;
}
- /* step 3: figure out how large a buffer we need */
+ /* step 2.5: allocate memory for the results of formating numbers */
+ if (numbersize) {
+ numberresults = PyObject_Malloc(numbersize);
+ if (!numberresults) {
+ PyErr_NoMemory();
+ goto fail;
+ }
+ numberresult = numberresults;
+ }
+
+ /* step 3: format numbers and figure out how large a buffer we need */
for (f = format; *f; f++) {
if (*f == '%') {
-#ifdef HAVE_LONG_LONG
- int longlongflag = 0;
-#endif
- const char* p = f;
- width = 0;
- while (Py_ISDIGIT((unsigned)*f))
- width = (width*10) + *f++ - '0';
- while (*++f && *f != '%' && !Py_ISALPHA((unsigned)*f))
- ;
-
- /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since
- * they don't affect the amount of space we reserve.
- */
- if (*f == 'l') {
- if (f[1] == 'd' || f[1] == 'u') {
- ++f;
- }
-#ifdef HAVE_LONG_LONG
- else if (f[1] == 'l' &&
- (f[2] == 'd' || f[2] == 'u')) {
- longlongflag = 1;
- f += 2;
- }
-#endif
- }
- else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
- ++f;
- }
-
+ const char* p;
+ int longflag;
+ int longlongflag;
+ int size_tflag;
+ int numprinted;
+
+ p = f;
+ zeropad = (f[1] == '0');
+ f = parse_format_flags(f, &width, &precision,
+ &longflag, &longlongflag, &size_tflag);
switch (*f) {
case 'c':
{
-#ifndef Py_UNICODE_WIDE
- int ordinal = va_arg(count, int);
- if (ordinal > 0xffff)
- n += 2;
- else
- n++;
-#else
- (void)va_arg(count, int);
+ Py_UCS4 ordinal = va_arg(count, int);
+ maxchar = MAX_MAXCHAR(maxchar, ordinal);
n++;
-#endif
break;
}
case '%':
n++;
break;
- case 'd': case 'u': case 'i': case 'x':
- (void) va_arg(count, int);
+ case 'i':
+ case 'd':
+ makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
+ width, precision, *f);
+ if (longflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, long));
#ifdef HAVE_LONG_LONG
- if (longlongflag) {
- if (width < MAX_LONG_LONG_CHARS)
- width = MAX_LONG_LONG_CHARS;
- }
+ else if (longlongflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, PY_LONG_LONG));
+#endif
+ else if (size_tflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, Py_ssize_t));
else
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, int));
+ n += numprinted;
+ /* advance by +1 to skip over the '\0' */
+ numberresult += (numprinted + 1);
+ assert(*(numberresult - 1) == '\0');
+ assert(*(numberresult - 2) != '\0');
+ assert(numprinted >= 0);
+ assert(numberresult <= numberresults + numbersize);
+ break;
+ case 'u':
+ makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
+ width, precision, 'u');
+ if (longflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, unsigned long));
+#ifdef HAVE_LONG_LONG
+ else if (longlongflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, unsigned PY_LONG_LONG));
#endif
- /* MAX_LONG_CHARS is enough to hold a 64-bit integer,
- including sign. Decimal takes the most space. This
- isn't enough for octal. If a width is specified we
- need more (which we allocate later). */
- if (width < MAX_LONG_CHARS)
- width = MAX_LONG_CHARS;
- n += width;
- /* XXX should allow for large precision here too. */
- if (abuffersize < width)
- abuffersize = width;
+ else if (size_tflag)
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, size_t));
+ else
+ numprinted = sprintf(numberresult, fmt,
+ va_arg(count, unsigned int));
+ n += numprinted;
+ numberresult += (numprinted + 1);
+ assert(*(numberresult - 1) == '\0');
+ assert(*(numberresult - 2) != '\0');
+ assert(numprinted >= 0);
+ assert(numberresult <= numberresults + numbersize);
+ break;
+ case 'x':
+ makefmt(fmt, 0, 0, 0, zeropad, width, precision, 'x');
+ numprinted = sprintf(numberresult, fmt, va_arg(count, int));
+ n += numprinted;
+ numberresult += (numprinted + 1);
+ assert(*(numberresult - 1) == '\0');
+ assert(*(numberresult - 2) != '\0');
+ assert(numprinted >= 0);
+ assert(numberresult <= numberresults + numbersize);
+ break;
+ case 'p':
+ numprinted = sprintf(numberresult, "%p", va_arg(count, void*));
+ /* %p is ill-defined: ensure leading 0x. */
+ if (numberresult[1] == 'X')
+ numberresult[1] = 'x';
+ else if (numberresult[1] != 'x') {
+ memmove(numberresult + 2, numberresult,
+ strlen(numberresult) + 1);
+ numberresult[0] = '0';
+ numberresult[1] = 'x';
+ numprinted += 2;
+ }
+ n += numprinted;
+ numberresult += (numprinted + 1);
+ assert(*(numberresult - 1) == '\0');
+ assert(*(numberresult - 2) != '\0');
+ assert(numprinted >= 0);
+ assert(numberresult <= numberresults + numbersize);
break;
case 's':
{
/* UTF-8 */
const char *s = va_arg(count, const char*);
- PyObject *str = PyUnicode_DecodeUTF8(s, strlen(s), "replace");
+ PyObject *str = PyUnicode_DecodeUTF8Stateful(s, strlen(s), "replace", NULL);
if (!str)
goto fail;
- n += PyUnicode_GET_SIZE(str);
+ /* since PyUnicode_DecodeUTF8 returns already flexible
+ unicode objects, there is no need to call ready on them */
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(str);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(str);
/* Remember the str and switch to the next slot */
*callresult++ = str;
break;
@@ -864,8 +2582,12 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
case 'U':
{
PyObject *obj = va_arg(count, PyObject *);
- assert(obj && PyUnicode_Check(obj));
- n += PyUnicode_GET_SIZE(obj);
+ assert(obj && _PyUnicode_CHECK(obj));
+ if (PyUnicode_READY(obj) == -1)
+ goto fail;
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(obj);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(obj);
break;
}
case 'V':
@@ -874,16 +2596,26 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
const char *str = va_arg(count, const char *);
PyObject *str_obj;
assert(obj || str);
- assert(!obj || PyUnicode_Check(obj));
+ assert(!obj || _PyUnicode_CHECK(obj));
if (obj) {
- n += PyUnicode_GET_SIZE(obj);
+ if (PyUnicode_READY(obj) == -1)
+ goto fail;
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(obj);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(obj);
*callresult++ = NULL;
}
else {
- str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace");
+ str_obj = PyUnicode_DecodeUTF8Stateful(str, strlen(str), "replace", NULL);
if (!str_obj)
goto fail;
- n += PyUnicode_GET_SIZE(str_obj);
+ if (PyUnicode_READY(str_obj) == -1) {
+ Py_DECREF(str_obj);
+ goto fail;
+ }
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(str_obj);
*callresult++ = str_obj;
}
break;
@@ -896,7 +2628,13 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
str = PyObject_Str(obj);
if (!str)
goto fail;
- n += PyUnicode_GET_SIZE(str);
+ if (PyUnicode_READY(str) == -1) {
+ Py_DECREF(str);
+ goto fail;
+ }
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(str);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(str);
/* Remember the str and switch to the next slot */
*callresult++ = str;
break;
@@ -909,7 +2647,13 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
repr = PyObject_Repr(obj);
if (!repr)
goto fail;
- n += PyUnicode_GET_SIZE(repr);
+ if (PyUnicode_READY(repr) == -1) {
+ Py_DECREF(repr);
+ goto fail;
+ }
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(repr);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(repr);
/* Remember the repr and switch to the next slot */
*callresult++ = repr;
break;
@@ -922,20 +2666,17 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
ascii = PyObject_ASCII(obj);
if (!ascii)
goto fail;
- n += PyUnicode_GET_SIZE(ascii);
+ if (PyUnicode_READY(ascii) == -1) {
+ Py_DECREF(ascii);
+ goto fail;
+ }
+ argmaxchar = PyUnicode_MAX_CHAR_VALUE(ascii);
+ maxchar = MAX_MAXCHAR(maxchar, argmaxchar);
+ n += PyUnicode_GET_LENGTH(ascii);
/* Remember the repr and switch to the next slot */
*callresult++ = ascii;
break;
}
- case 'p':
- (void) va_arg(count, int);
- /* maximum 64-bit pointer representation:
- * 0xffffffffffffffff
- * so 19 characters is enough.
- * XXX I count 18 -- what's the extra for?
- */
- n += 19;
- break;
default:
/* if we stumble upon an unknown
formatting code, copy the rest of
@@ -950,127 +2691,68 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
n++;
}
expand:
- if (abuffersize > ITEM_BUFFER_LEN) {
- /* add 1 for sprintf's trailing null byte */
- abuffer = PyObject_Malloc(abuffersize + 1);
- if (!abuffer) {
- PyErr_NoMemory();
- goto fail;
- }
- realbuffer = abuffer;
- }
- else
- realbuffer = buffer;
/* step 4: fill the buffer */
- /* Since we've analyzed how much space we need for the worst case,
+ /* Since we've analyzed how much space we need,
we don't have to resize the string.
There can be no errors beyond this point. */
- string = PyUnicode_FromUnicode(NULL, n);
+ string = PyUnicode_New(n, maxchar);
if (!string)
goto fail;
-
- s = PyUnicode_AS_UNICODE(string);
+ kind = PyUnicode_KIND(string);
+ data = PyUnicode_DATA(string);
callresult = callresults;
+ numberresult = numberresults;
- for (f = format; *f; f++) {
+ for (i = 0, f = format; *f; f++) {
if (*f == '%') {
- const char* p = f++;
- int longflag = 0;
- int longlongflag = 0;
- int size_tflag = 0;
- zeropad = (*f == '0');
- /* parse the width.precision part */
- width = 0;
- while (Py_ISDIGIT((unsigned)*f))
- width = (width*10) + *f++ - '0';
- precision = 0;
- if (*f == '.') {
- f++;
- while (Py_ISDIGIT((unsigned)*f))
- precision = (precision*10) + *f++ - '0';
- }
- /* Handle %ld, %lu, %lld and %llu. */
- if (*f == 'l') {
- if (f[1] == 'd' || f[1] == 'u') {
- longflag = 1;
- ++f;
- }
-#ifdef HAVE_LONG_LONG
- else if (f[1] == 'l' &&
- (f[2] == 'd' || f[2] == 'u')) {
- longlongflag = 1;
- f += 2;
- }
-#endif
- }
- /* handle the size_t flag. */
- if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) {
- size_tflag = 1;
- ++f;
- }
+ const char* p;
+
+ p = f;
+ f = parse_format_flags(f, NULL, NULL, NULL, NULL, NULL);
+ /* checking for == because the last argument could be a empty
+ string, which causes i to point to end, the assert at the end of
+ the loop */
+ assert(i <= PyUnicode_GET_LENGTH(string));
switch (*f) {
case 'c':
{
- int ordinal = va_arg(vargs, int);
-#ifndef Py_UNICODE_WIDE
- if (ordinal > 0xffff) {
- ordinal -= 0x10000;
- *s++ = 0xD800 | (ordinal >> 10);
- *s++ = 0xDC00 | (ordinal & 0x3FF);
- } else
-#endif
- *s++ = ordinal;
+ const int ordinal = va_arg(vargs, int);
+ PyUnicode_WRITE(kind, data, i++, ordinal);
break;
}
+ case 'i':
case 'd':
- makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
- width, precision, 'd');
- if (longflag)
- sprintf(realbuffer, fmt, va_arg(vargs, long));
-#ifdef HAVE_LONG_LONG
- else if (longlongflag)
- sprintf(realbuffer, fmt, va_arg(vargs, PY_LONG_LONG));
-#endif
- else if (size_tflag)
- sprintf(realbuffer, fmt, va_arg(vargs, Py_ssize_t));
- else
- sprintf(realbuffer, fmt, va_arg(vargs, int));
- appendstring(realbuffer);
- break;
case 'u':
- makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
- width, precision, 'u');
- if (longflag)
- sprintf(realbuffer, fmt, va_arg(vargs, unsigned long));
-#ifdef HAVE_LONG_LONG
- else if (longlongflag)
- sprintf(realbuffer, fmt, va_arg(vargs,
- unsigned PY_LONG_LONG));
-#endif
- else if (size_tflag)
- sprintf(realbuffer, fmt, va_arg(vargs, size_t));
- else
- sprintf(realbuffer, fmt, va_arg(vargs, unsigned int));
- appendstring(realbuffer);
- break;
- case 'i':
- makefmt(fmt, 0, 0, 0, zeropad, width, precision, 'i');
- sprintf(realbuffer, fmt, va_arg(vargs, int));
- appendstring(realbuffer);
- break;
case 'x':
- makefmt(fmt, 0, 0, 0, zeropad, width, precision, 'x');
- sprintf(realbuffer, fmt, va_arg(vargs, int));
- appendstring(realbuffer);
+ case 'p':
+ {
+ Py_ssize_t len;
+ /* unused, since we already have the result */
+ if (*f == 'p')
+ (void) va_arg(vargs, void *);
+ else
+ (void) va_arg(vargs, int);
+ /* extract the result from numberresults and append. */
+ len = strlen(numberresult);
+ unicode_write_cstr(string, i, numberresult, len);
+ /* skip over the separating '\0' */
+ i += len;
+ numberresult += len;
+ assert(*numberresult == '\0');
+ numberresult++;
+ assert(numberresult <= numberresults + numbersize);
break;
+ }
case 's':
{
/* unused, since we already have the result */
+ Py_ssize_t size;
(void) va_arg(vargs, char *);
- Py_UNICODE_COPY(s, PyUnicode_AS_UNICODE(*callresult),
- PyUnicode_GET_SIZE(*callresult));
- s += PyUnicode_GET_SIZE(*callresult);
+ size = PyUnicode_GET_LENGTH(*callresult);
+ assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
+ _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
+ i += size;
/* We're done with the unicode()/repr() => forget it */
Py_DECREF(*callresult);
/* switch to next unicode()/repr() result */
@@ -1080,23 +2762,29 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
case 'U':
{
PyObject *obj = va_arg(vargs, PyObject *);
- Py_ssize_t size = PyUnicode_GET_SIZE(obj);
- Py_UNICODE_COPY(s, PyUnicode_AS_UNICODE(obj), size);
- s += size;
+ Py_ssize_t size;
+ assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
+ size = PyUnicode_GET_LENGTH(obj);
+ _PyUnicode_FastCopyCharacters(string, i, obj, 0, size);
+ i += size;
break;
}
case 'V':
{
+ Py_ssize_t size;
PyObject *obj = va_arg(vargs, PyObject *);
va_arg(vargs, const char *);
if (obj) {
- Py_ssize_t size = PyUnicode_GET_SIZE(obj);
- Py_UNICODE_COPY(s, PyUnicode_AS_UNICODE(obj), size);
- s += size;
+ size = PyUnicode_GET_LENGTH(obj);
+ assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
+ _PyUnicode_FastCopyCharacters(string, i, obj, 0, size);
+ i += size;
} else {
- Py_UNICODE_COPY(s, PyUnicode_AS_UNICODE(*callresult),
- PyUnicode_GET_SIZE(*callresult));
- s += PyUnicode_GET_SIZE(*callresult);
+ size = PyUnicode_GET_LENGTH(*callresult);
+ assert(PyUnicode_KIND(*callresult) <=
+ PyUnicode_KIND(string));
+ _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
+ i += size;
Py_DECREF(*callresult);
}
++callresult;
@@ -1106,52 +2794,44 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
case 'R':
case 'A':
{
- Py_UNICODE *ucopy;
- Py_ssize_t usize;
- Py_ssize_t upos;
+ Py_ssize_t size = PyUnicode_GET_LENGTH(*callresult);
/* unused, since we already have the result */
(void) va_arg(vargs, PyObject *);
- ucopy = PyUnicode_AS_UNICODE(*callresult);
- usize = PyUnicode_GET_SIZE(*callresult);
- for (upos = 0; upos<usize;)
- *s++ = ucopy[upos++];
+ assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
+ _PyUnicode_FastCopyCharacters(string, i, *callresult, 0, size);
+ i += size;
/* We're done with the unicode()/repr() => forget it */
Py_DECREF(*callresult);
/* switch to next unicode()/repr() result */
++callresult;
break;
}
- case 'p':
- sprintf(buffer, "%p", va_arg(vargs, void*));
- /* %p is ill-defined: ensure leading 0x. */
- if (buffer[1] == 'X')
- buffer[1] = 'x';
- else if (buffer[1] != 'x') {
- memmove(buffer+2, buffer, strlen(buffer)+1);
- buffer[0] = '0';
- buffer[1] = 'x';
- }
- appendstring(buffer);
- break;
case '%':
- *s++ = '%';
+ PyUnicode_WRITE(kind, data, i++, '%');
break;
default:
- appendstring(p);
+ {
+ Py_ssize_t len = strlen(p);
+ unicode_write_cstr(string, i, p, len);
+ i += len;
+ assert(i == PyUnicode_GET_LENGTH(string));
goto end;
}
+ }
+ }
+ else {
+ assert(i < PyUnicode_GET_LENGTH(string));
+ PyUnicode_WRITE(kind, data, i++, *f);
}
- else
- *s++ = *f;
}
+ assert(i == PyUnicode_GET_LENGTH(string));
end:
if (callresults)
PyObject_Free(callresults);
- if (abuffer)
- PyObject_Free(abuffer);
- PyUnicode_Resize(&string, s - PyUnicode_AS_UNICODE(string));
- return string;
+ if (numberresults)
+ PyObject_Free(numberresults);
+ return unicode_result(string);
fail:
if (callresults) {
PyObject **callresult2 = callresults;
@@ -1161,13 +2841,11 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
}
PyObject_Free(callresults);
}
- if (abuffer)
- PyObject_Free(abuffer);
+ if (numberresults)
+ PyObject_Free(numberresults);
return NULL;
}
-#undef appendstring
-
PyObject *
PyUnicode_FromFormat(const char *format, ...)
{
@@ -1184,6 +2862,8 @@ PyUnicode_FromFormat(const char *format, ...)
return ret;
}
+#ifdef HAVE_WCHAR_H
+
/* Helper function for PyUnicode_AsWideChar() and PyUnicode_AsWideCharString():
convert a Unicode object to a wide character string.
@@ -1194,103 +2874,27 @@ PyUnicode_FromFormat(const char *format, ...)
character) written into w. Write at most size wide characters (including
the null character). */
static Py_ssize_t
-unicode_aswidechar(PyUnicodeObject *unicode,
+unicode_aswidechar(PyObject *unicode,
wchar_t *w,
Py_ssize_t size)
{
-#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
Py_ssize_t res;
+ const wchar_t *wstr;
+
+ wstr = PyUnicode_AsUnicodeAndSize(unicode, &res);
+ if (wstr == NULL)
+ return -1;
+
if (w != NULL) {
- res = PyUnicode_GET_SIZE(unicode);
if (size > res)
size = res + 1;
else
res = size;
- memcpy(w, unicode->str, size * sizeof(wchar_t));
+ Py_MEMCPY(w, wstr, size * sizeof(wchar_t));
return res;
}
else
- return PyUnicode_GET_SIZE(unicode) + 1;
-#elif Py_UNICODE_SIZE == 2 && SIZEOF_WCHAR_T == 4
- register const Py_UNICODE *u;
- const Py_UNICODE *uend;
- const wchar_t *worig, *wend;
- Py_ssize_t nchar;
-
- u = PyUnicode_AS_UNICODE(unicode);
- uend = u + PyUnicode_GET_SIZE(unicode);
- if (w != NULL) {
- worig = w;
- wend = w + size;
- while (u != uend && w != wend) {
- if (0xD800 <= u[0] && u[0] <= 0xDBFF
- && 0xDC00 <= u[1] && u[1] <= 0xDFFF)
- {
- *w = (((u[0] & 0x3FF) << 10) | (u[1] & 0x3FF)) + 0x10000;
- u += 2;
- }
- else {
- *w = *u;
- u++;
- }
- w++;
- }
- if (w != wend)
- *w = L'\0';
- return w - worig;
- }
- else {
- nchar = 1; /* null character at the end */
- while (u != uend) {
- if (0xD800 <= u[0] && u[0] <= 0xDBFF
- && 0xDC00 <= u[1] && u[1] <= 0xDFFF)
- u += 2;
- else
- u++;
- nchar++;
- }
- }
- return nchar;
-#elif Py_UNICODE_SIZE == 4 && SIZEOF_WCHAR_T == 2
- register Py_UNICODE *u, *uend, ordinal;
- register Py_ssize_t i;
- wchar_t *worig, *wend;
- Py_ssize_t nchar;
-
- u = PyUnicode_AS_UNICODE(unicode);
- uend = u + PyUnicode_GET_SIZE(u);
- if (w != NULL) {
- worig = w;
- wend = w + size;
- while (u != uend && w != wend) {
- ordinal = *u;
- if (ordinal > 0xffff) {
- ordinal -= 0x10000;
- *w++ = 0xD800 | (ordinal >> 10);
- *w++ = 0xDC00 | (ordinal & 0x3FF);
- }
- else
- *w++ = ordinal;
- u++;
- }
- if (w != wend)
- *w = 0;
- return w - worig;
- }
- else {
- nchar = 1; /* null character */
- while (u != uend) {
- if (*u > 0xffff)
- nchar += 2;
- else
- nchar++;
- u++;
- }
- return nchar;
- }
-#else
-# error "unsupported wchar_t and Py_UNICODE sizes, see issue #8670"
-#endif
+ return res + 1;
}
Py_ssize_t
@@ -1302,7 +2906,7 @@ PyUnicode_AsWideChar(PyObject *unicode,
PyErr_BadInternalCall();
return -1;
}
- return unicode_aswidechar((PyUnicodeObject*)unicode, w, size);
+ return unicode_aswidechar(unicode, w, size);
}
wchar_t*
@@ -1317,7 +2921,9 @@ PyUnicode_AsWideCharString(PyObject *unicode,
return NULL;
}
- buflen = unicode_aswidechar((PyUnicodeObject *)unicode, NULL, 0);
+ buflen = unicode_aswidechar(unicode, NULL, 0);
+ if (buflen == -1)
+ return NULL;
if (PY_SSIZE_T_MAX / sizeof(wchar_t) < buflen) {
PyErr_NoMemory();
return NULL;
@@ -1328,50 +2934,54 @@ PyUnicode_AsWideCharString(PyObject *unicode,
PyErr_NoMemory();
return NULL;
}
- buflen = unicode_aswidechar((PyUnicodeObject *)unicode, buffer, buflen);
+ buflen = unicode_aswidechar(unicode, buffer, buflen);
+ if (buflen == -1) {
+ PyMem_FREE(buffer);
+ return NULL;
+ }
if (size != NULL)
*size = buflen;
return buffer;
}
-#endif
+#endif /* HAVE_WCHAR_H */
-PyObject *PyUnicode_FromOrdinal(int ordinal)
+PyObject *
+PyUnicode_FromOrdinal(int ordinal)
{
- Py_UNICODE s[2];
-
- if (ordinal < 0 || ordinal > 0x10ffff) {
+ PyObject *v;
+ if (ordinal < 0 || ordinal > MAX_UNICODE) {
PyErr_SetString(PyExc_ValueError,
"chr() arg not in range(0x110000)");
return NULL;
}
-#ifndef Py_UNICODE_WIDE
- if (ordinal > 0xffff) {
- ordinal -= 0x10000;
- s[0] = 0xD800 | (ordinal >> 10);
- s[1] = 0xDC00 | (ordinal & 0x3FF);
- return PyUnicode_FromUnicode(s, 2);
- }
-#endif
+ if (ordinal < 256)
+ return get_latin1_char(ordinal);
- s[0] = (Py_UNICODE)ordinal;
- return PyUnicode_FromUnicode(s, 1);
+ v = PyUnicode_New(1, ordinal);
+ if (v == NULL)
+ return NULL;
+ PyUnicode_WRITE(PyUnicode_KIND(v), PyUnicode_DATA(v), 0, ordinal);
+ assert(_PyUnicode_CheckConsistency(v, 1));
+ return v;
}
-PyObject *PyUnicode_FromObject(register PyObject *obj)
+PyObject *
+PyUnicode_FromObject(register PyObject *obj)
{
/* XXX Perhaps we should make this API an alias of
PyObject_Str() instead ?! */
if (PyUnicode_CheckExact(obj)) {
+ if (PyUnicode_READY(obj) == -1)
+ return NULL;
Py_INCREF(obj);
return obj;
}
if (PyUnicode_Check(obj)) {
/* For a Unicode subtype that's not a Unicode object,
return a true Unicode object with the same data. */
- return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(obj),
- PyUnicode_GET_SIZE(obj));
+ return _PyUnicode_Copy(obj);
}
PyErr_Format(PyExc_TypeError,
"Can't convert '%.100s' object to str implicitly",
@@ -1379,9 +2989,10 @@ PyObject *PyUnicode_FromObject(register PyObject *obj)
return NULL;
}
-PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_FromEncodedObject(register PyObject *obj,
+ const char *encoding,
+ const char *errors)
{
Py_buffer buffer;
PyObject *v;
@@ -1395,7 +3006,7 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
if (PyBytes_Check(obj)) {
if (PyBytes_GET_SIZE(obj) == 0) {
Py_INCREF(unicode_empty);
- v = (PyObject *) unicode_empty;
+ v = unicode_empty;
}
else {
v = PyUnicode_Decode(
@@ -1422,7 +3033,7 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
if (buffer.len == 0) {
Py_INCREF(unicode_empty);
- v = (PyObject *) unicode_empty;
+ v = unicode_empty;
}
else
v = PyUnicode_Decode((char*) buffer.buf, buffer.len, encoding, errors);
@@ -1443,6 +3054,10 @@ normalize_encoding(const char *encoding,
char *l;
char *l_end;
+ if (encoding == NULL) {
+ strcpy(lower, "utf-8");
+ return 1;
+ }
e = encoding;
l = lower;
l_end = &lower[lower_len - 1];
@@ -1464,26 +3079,26 @@ normalize_encoding(const char *encoding,
return 1;
}
-PyObject *PyUnicode_Decode(const char *s,
- Py_ssize_t size,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_Decode(const char *s,
+ Py_ssize_t size,
+ const char *encoding,
+ const char *errors)
{
PyObject *buffer = NULL, *unicode;
Py_buffer info;
char lower[11]; /* Enough for any encoding shortcut */
- if (encoding == NULL)
- encoding = PyUnicode_GetDefaultEncoding();
-
/* Shortcuts for common default encodings */
if (normalize_encoding(encoding, lower, sizeof(lower))) {
- if (strcmp(lower, "utf-8") == 0)
- return PyUnicode_DecodeUTF8(s, size, errors);
+ if ((strcmp(lower, "utf-8") == 0) ||
+ (strcmp(lower, "utf8") == 0))
+ return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL);
else if ((strcmp(lower, "latin-1") == 0) ||
+ (strcmp(lower, "latin1") == 0) ||
(strcmp(lower, "iso-8859-1") == 0))
return PyUnicode_DecodeLatin1(s, size, errors);
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
else if (strcmp(lower, "mbcs") == 0)
return PyUnicode_DecodeMBCS(s, size, errors);
#endif
@@ -1513,16 +3128,17 @@ PyObject *PyUnicode_Decode(const char *s,
goto onError;
}
Py_DECREF(buffer);
- return unicode;
+ return unicode_result(unicode);
onError:
Py_XDECREF(buffer);
return NULL;
}
-PyObject *PyUnicode_AsDecodedObject(PyObject *unicode,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_AsDecodedObject(PyObject *unicode,
+ const char *encoding,
+ const char *errors)
{
PyObject *v;
@@ -1538,15 +3154,16 @@ PyObject *PyUnicode_AsDecodedObject(PyObject *unicode,
v = PyCodec_Decode(unicode, encoding, errors);
if (v == NULL)
goto onError;
- return v;
+ return unicode_result(v);
onError:
return NULL;
}
-PyObject *PyUnicode_AsDecodedUnicode(PyObject *unicode,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_AsDecodedUnicode(PyObject *unicode,
+ const char *encoding,
+ const char *errors)
{
PyObject *v;
@@ -1569,16 +3186,17 @@ PyObject *PyUnicode_AsDecodedUnicode(PyObject *unicode,
Py_DECREF(v);
goto onError;
}
- return v;
+ return unicode_result(v);
onError:
return NULL;
}
-PyObject *PyUnicode_Encode(const Py_UNICODE *s,
- Py_ssize_t size,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_Encode(const Py_UNICODE *s,
+ Py_ssize_t size,
+ const char *encoding,
+ const char *errors)
{
PyObject *v, *unicode;
@@ -1590,9 +3208,10 @@ PyObject *PyUnicode_Encode(const Py_UNICODE *s,
return v;
}
-PyObject *PyUnicode_AsEncodedObject(PyObject *unicode,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_AsEncodedObject(PyObject *unicode,
+ const char *encoding,
+ const char *errors)
{
PyObject *v;
@@ -1614,17 +3233,192 @@ PyObject *PyUnicode_AsEncodedObject(PyObject *unicode,
return NULL;
}
+static size_t
+wcstombs_errorpos(const wchar_t *wstr)
+{
+ size_t len;
+#if SIZEOF_WCHAR_T == 2
+ wchar_t buf[3];
+#else
+ wchar_t buf[2];
+#endif
+ char outbuf[MB_LEN_MAX];
+ const wchar_t *start, *previous;
+
+#if SIZEOF_WCHAR_T == 2
+ buf[2] = 0;
+#else
+ buf[1] = 0;
+#endif
+ start = wstr;
+ while (*wstr != L'\0')
+ {
+ previous = wstr;
+#if SIZEOF_WCHAR_T == 2
+ if (Py_UNICODE_IS_HIGH_SURROGATE(wstr[0])
+ && Py_UNICODE_IS_LOW_SURROGATE(wstr[1]))
+ {
+ buf[0] = wstr[0];
+ buf[1] = wstr[1];
+ wstr += 2;
+ }
+ else {
+ buf[0] = *wstr;
+ buf[1] = 0;
+ wstr++;
+ }
+#else
+ buf[0] = *wstr;
+ wstr++;
+#endif
+ len = wcstombs(outbuf, buf, sizeof(outbuf));
+ if (len == (size_t)-1)
+ return previous - start;
+ }
+
+ /* failed to find the unencodable character */
+ return 0;
+}
+
+static int
+locale_error_handler(const char *errors, int *surrogateescape)
+{
+ if (errors == NULL) {
+ *surrogateescape = 0;
+ return 0;
+ }
+
+ if (strcmp(errors, "strict") == 0) {
+ *surrogateescape = 0;
+ return 0;
+ }
+ if (strcmp(errors, "surrogateescape") == 0) {
+ *surrogateescape = 1;
+ return 0;
+ }
+ PyErr_Format(PyExc_ValueError,
+ "only 'strict' and 'surrogateescape' error handlers "
+ "are supported, not '%s'",
+ errors);
+ return -1;
+}
+
+PyObject *
+PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
+{
+ Py_ssize_t wlen, wlen2;
+ wchar_t *wstr;
+ PyObject *bytes = NULL;
+ char *errmsg;
+ PyObject *reason;
+ PyObject *exc;
+ size_t error_pos;
+ int surrogateescape;
+
+ if (locale_error_handler(errors, &surrogateescape) < 0)
+ return NULL;
+
+ wstr = PyUnicode_AsWideCharString(unicode, &wlen);
+ if (wstr == NULL)
+ return NULL;
+
+ wlen2 = wcslen(wstr);
+ if (wlen2 != wlen) {
+ PyMem_Free(wstr);
+ PyErr_SetString(PyExc_TypeError, "embedded null character");
+ return NULL;
+ }
+
+ if (surrogateescape) {
+ /* locale encoding with surrogateescape */
+ char *str;
+
+ str = _Py_wchar2char(wstr, &error_pos);
+ if (str == NULL) {
+ if (error_pos == (size_t)-1) {
+ PyErr_NoMemory();
+ PyMem_Free(wstr);
+ return NULL;
+ }
+ else {
+ goto encode_error;
+ }
+ }
+ PyMem_Free(wstr);
+
+ bytes = PyBytes_FromString(str);
+ PyMem_Free(str);
+ }
+ else {
+ size_t len, len2;
+
+ len = wcstombs(NULL, wstr, 0);
+ if (len == (size_t)-1) {
+ error_pos = (size_t)-1;
+ goto encode_error;
+ }
+
+ bytes = PyBytes_FromStringAndSize(NULL, len);
+ if (bytes == NULL) {
+ PyMem_Free(wstr);
+ return NULL;
+ }
+
+ len2 = wcstombs(PyBytes_AS_STRING(bytes), wstr, len+1);
+ if (len2 == (size_t)-1 || len2 > len) {
+ error_pos = (size_t)-1;
+ goto encode_error;
+ }
+ PyMem_Free(wstr);
+ }
+ return bytes;
+
+encode_error:
+ errmsg = strerror(errno);
+ assert(errmsg != NULL);
+
+ if (error_pos == (size_t)-1)
+ error_pos = wcstombs_errorpos(wstr);
+
+ PyMem_Free(wstr);
+ Py_XDECREF(bytes);
+
+ if (errmsg != NULL) {
+ size_t errlen;
+ wstr = _Py_char2wchar(errmsg, &errlen);
+ if (wstr != NULL) {
+ reason = PyUnicode_FromWideChar(wstr, errlen);
+ PyMem_Free(wstr);
+ } else
+ errmsg = NULL;
+ }
+ if (errmsg == NULL)
+ reason = PyUnicode_FromString(
+ "wcstombs() encountered an unencodable "
+ "wide character");
+ if (reason == NULL)
+ return NULL;
+
+ exc = PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnnO",
+ "locale", unicode,
+ (Py_ssize_t)error_pos,
+ (Py_ssize_t)(error_pos+1),
+ reason);
+ Py_DECREF(reason);
+ if (exc != NULL) {
+ PyCodec_StrictErrors(exc);
+ Py_XDECREF(exc);
+ }
+ return NULL;
+}
+
PyObject *
PyUnicode_EncodeFSDefault(PyObject *unicode)
{
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
- return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
+#ifdef HAVE_MBCS
+ return PyUnicode_EncodeCodePage(CP_ACP, unicode, NULL);
#elif defined(__APPLE__)
- return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- "surrogateescape");
+ return _PyUnicode_AsUTF8String(unicode, "surrogateescape");
#else
PyInterpreterState *interp = PyThreadState_GET()->interp;
/* Bootstrap check: if the filesystem codec is implemented in Python, we
@@ -1642,46 +3436,15 @@ PyUnicode_EncodeFSDefault(PyObject *unicode)
"surrogateescape");
}
else {
- /* locale encoding with surrogateescape */
- wchar_t *wchar;
- char *bytes;
- PyObject *bytes_obj;
- size_t error_pos;
-
- wchar = PyUnicode_AsWideCharString(unicode, NULL);
- if (wchar == NULL)
- return NULL;
- bytes = _Py_wchar2char(wchar, &error_pos);
- if (bytes == NULL) {
- if (error_pos != (size_t)-1) {
- char *errmsg = strerror(errno);
- PyObject *exc = NULL;
- if (errmsg == NULL)
- errmsg = "Py_wchar2char() failed";
- raise_encode_exception(&exc,
- "filesystemencoding",
- PyUnicode_AS_UNICODE(unicode), PyUnicode_GET_SIZE(unicode),
- error_pos, error_pos+1,
- errmsg);
- Py_XDECREF(exc);
- }
- else
- PyErr_NoMemory();
- PyMem_Free(wchar);
- return NULL;
- }
- PyMem_Free(wchar);
-
- bytes_obj = PyBytes_FromString(bytes);
- PyMem_Free(bytes);
- return bytes_obj;
+ return PyUnicode_EncodeLocale(unicode, "surrogateescape");
}
#endif
}
-PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_AsEncodedString(PyObject *unicode,
+ const char *encoding,
+ const char *errors)
{
PyObject *v;
char lower[11]; /* Enough for any encoding shortcut */
@@ -1691,46 +3454,27 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
return NULL;
}
- if (encoding == NULL)
- encoding = PyUnicode_GetDefaultEncoding();
-
/* Shortcuts for common default encodings */
if (normalize_encoding(encoding, lower, sizeof(lower))) {
- if (strcmp(lower, "utf-8") == 0)
- return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- errors);
+ if ((strcmp(lower, "utf-8") == 0) ||
+ (strcmp(lower, "utf8") == 0))
+ {
+ if (errors == NULL || strcmp(errors, "strict") == 0)
+ return _PyUnicode_AsUTF8String(unicode, NULL);
+ else
+ return _PyUnicode_AsUTF8String(unicode, errors);
+ }
else if ((strcmp(lower, "latin-1") == 0) ||
+ (strcmp(lower, "latin1") == 0) ||
(strcmp(lower, "iso-8859-1") == 0))
- return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- errors);
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+ return _PyUnicode_AsLatin1String(unicode, errors);
+#ifdef HAVE_MBCS
else if (strcmp(lower, "mbcs") == 0)
- return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- errors);
+ return PyUnicode_EncodeCodePage(CP_ACP, unicode, errors);
#endif
else if (strcmp(lower, "ascii") == 0)
- return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- errors);
- }
- /* During bootstrap, we may need to find the encodings
- package, to load the file system encoding, and require the
- file system encoding in order to load the encodings
- package.
-
- Break out of this dependency by assuming that the path to
- the encodings module is ASCII-only. XXX could try wcstombs
- instead, if the file system encoding is the locale's
- encoding. */
- if (Py_FileSystemDefaultEncoding &&
- strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
- !PyThreadState_GET()->interp->codecs_initialized)
- return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- errors);
+ return _PyUnicode_AsASCIIString(unicode, errors);
+ }
/* Encode via the codec registry */
v = PyCodec_Encode(unicode, encoding, errors);
@@ -1766,9 +3510,10 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
return NULL;
}
-PyObject *PyUnicode_AsEncodedUnicode(PyObject *unicode,
- const char *encoding,
- const char *errors)
+PyObject *
+PyUnicode_AsEncodedUnicode(PyObject *unicode,
+ const char *encoding,
+ const char *errors)
{
PyObject *v;
@@ -1797,24 +3542,151 @@ PyObject *PyUnicode_AsEncodedUnicode(PyObject *unicode,
return NULL;
}
-PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode,
- const char *errors)
+static size_t
+mbstowcs_errorpos(const char *str, size_t len)
{
- PyObject *v = ((PyUnicodeObject *)unicode)->defenc;
- if (v)
- return v;
- if (errors != NULL)
- Py_FatalError("non-NULL encoding in _PyUnicode_AsDefaultEncodedString");
- v = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
- if (!v)
- return NULL;
- ((PyUnicodeObject *)unicode)->defenc = v;
- return v;
+#ifdef HAVE_MBRTOWC
+ const char *start = str;
+ mbstate_t mbs;
+ size_t converted;
+ wchar_t ch;
+
+ memset(&mbs, 0, sizeof mbs);
+ while (len)
+ {
+ converted = mbrtowc(&ch, (char*)str, len, &mbs);
+ if (converted == 0)
+ /* Reached end of string */
+ break;
+ if (converted == (size_t)-1 || converted == (size_t)-2) {
+ /* Conversion error or incomplete character */
+ return str - start;
+ }
+ else {
+ str += converted;
+ len -= converted;
+ }
+ }
+ /* failed to find the undecodable byte sequence */
+ return 0;
+#endif
+ return 0;
}
PyObject*
+PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
+ const char *errors)
+{
+ wchar_t smallbuf[256];
+ size_t smallbuf_len = Py_ARRAY_LENGTH(smallbuf);
+ wchar_t *wstr;
+ size_t wlen, wlen2;
+ PyObject *unicode;
+ int surrogateescape;
+ size_t error_pos;
+ char *errmsg;
+ PyObject *reason, *exc;
+
+ if (locale_error_handler(errors, &surrogateescape) < 0)
+ return NULL;
+
+ if (str[len] != '\0' || len != strlen(str)) {
+ PyErr_SetString(PyExc_TypeError, "embedded null character");
+ return NULL;
+ }
+
+ if (surrogateescape)
+ {
+ wstr = _Py_char2wchar(str, &wlen);
+ if (wstr == NULL) {
+ if (wlen == (size_t)-1)
+ PyErr_NoMemory();
+ else
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ unicode = PyUnicode_FromWideChar(wstr, wlen);
+ PyMem_Free(wstr);
+ }
+ else {
+#ifndef HAVE_BROKEN_MBSTOWCS
+ wlen = mbstowcs(NULL, str, 0);
+#else
+ wlen = len;
+#endif
+ if (wlen == (size_t)-1)
+ goto decode_error;
+ if (wlen+1 <= smallbuf_len) {
+ wstr = smallbuf;
+ }
+ else {
+ if (wlen > PY_SSIZE_T_MAX / sizeof(wchar_t) - 1)
+ return PyErr_NoMemory();
+
+ wstr = PyMem_Malloc((wlen+1) * sizeof(wchar_t));
+ if (!wstr)
+ return PyErr_NoMemory();
+ }
+
+ /* This shouldn't fail now */
+ wlen2 = mbstowcs(wstr, str, wlen+1);
+ if (wlen2 == (size_t)-1) {
+ if (wstr != smallbuf)
+ PyMem_Free(wstr);
+ goto decode_error;
+ }
+#ifdef HAVE_BROKEN_MBSTOWCS
+ assert(wlen2 == wlen);
+#endif
+ unicode = PyUnicode_FromWideChar(wstr, wlen2);
+ if (wstr != smallbuf)
+ PyMem_Free(wstr);
+ }
+ return unicode;
+
+decode_error:
+ errmsg = strerror(errno);
+ assert(errmsg != NULL);
+
+ error_pos = mbstowcs_errorpos(str, len);
+ if (errmsg != NULL) {
+ size_t errlen;
+ wstr = _Py_char2wchar(errmsg, &errlen);
+ if (wstr != NULL) {
+ reason = PyUnicode_FromWideChar(wstr, errlen);
+ PyMem_Free(wstr);
+ } else
+ errmsg = NULL;
+ }
+ if (errmsg == NULL)
+ reason = PyUnicode_FromString(
+ "mbstowcs() encountered an invalid multibyte sequence");
+ if (reason == NULL)
+ return NULL;
+
+ exc = PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nnO",
+ "locale", str, len,
+ (Py_ssize_t)error_pos,
+ (Py_ssize_t)(error_pos+1),
+ reason);
+ Py_DECREF(reason);
+ if (exc != NULL) {
+ PyCodec_StrictErrors(exc);
+ Py_XDECREF(exc);
+ }
+ return NULL;
+}
+
+PyObject*
+PyUnicode_DecodeLocale(const char *str, const char *errors)
+{
+ Py_ssize_t size = (Py_ssize_t)strlen(str);
+ return PyUnicode_DecodeLocaleAndSize(str, size, errors);
+}
+
+
+PyObject*
PyUnicode_DecodeFSDefault(const char *s) {
Py_ssize_t size = (Py_ssize_t)strlen(s);
return PyUnicode_DecodeFSDefaultAndSize(s, size);
@@ -1823,10 +3695,10 @@ PyUnicode_DecodeFSDefault(const char *s) {
PyObject*
PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size)
{
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
return PyUnicode_DecodeMBCS(s, size, NULL);
#elif defined(__APPLE__)
- return PyUnicode_DecodeUTF8(s, size, "surrogateescape");
+ return PyUnicode_DecodeUTF8Stateful(s, size, "surrogateescape", NULL);
#else
PyInterpreterState *interp = PyThreadState_GET()->interp;
/* Bootstrap check: if the filesystem codec is implemented in Python, we
@@ -1844,23 +3716,7 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size)
"surrogateescape");
}
else {
- /* locale encoding with surrogateescape */
- wchar_t *wchar;
- PyObject *unicode;
- size_t len;
-
- if (s[size] != '\0' || size != strlen(s)) {
- PyErr_SetString(PyExc_TypeError, "embedded NUL character");
- return NULL;
- }
-
- wchar = _Py_char2wchar(s, &len);
- if (wchar == NULL)
- return PyErr_NoMemory();
-
- unicode = PyUnicode_FromWideChar(wchar, len);
- PyMem_Free(wchar);
- return unicode;
+ return PyUnicode_DecodeLocaleAndSize(s, size, "surrogateescape");
}
#endif
}
@@ -1923,13 +3779,13 @@ int
PyUnicode_FSDecoder(PyObject* arg, void* addr)
{
PyObject *output = NULL;
- Py_ssize_t size;
- void *data;
if (arg == NULL) {
Py_DECREF(*(PyObject**)addr);
return 1;
}
if (PyUnicode_Check(arg)) {
+ if (PyUnicode_READY(arg) == -1)
+ return 0;
output = arg;
Py_INCREF(output);
}
@@ -1948,9 +3804,12 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
return 0;
}
}
- size = PyUnicode_GET_SIZE(output);
- data = PyUnicode_AS_UNICODE(output);
- if (size != Py_UNICODE_strlen(data)) {
+ if (PyUnicode_READY(output) == -1) {
+ Py_DECREF(output);
+ return 0;
+ }
+ if (findchar(PyUnicode_DATA(output), PyUnicode_KIND(output),
+ PyUnicode_GET_LENGTH(output), 0, 1) >= 0) {
PyErr_SetString(PyExc_TypeError, "embedded NUL character");
Py_DECREF(output);
return 0;
@@ -1961,40 +3820,166 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
char*
-_PyUnicode_AsStringAndSize(PyObject *unicode, Py_ssize_t *psize)
+PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize)
{
PyObject *bytes;
+
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
return NULL;
}
- bytes = _PyUnicode_AsDefaultEncodedString(unicode, NULL);
- if (bytes == NULL)
+ if (PyUnicode_READY(unicode) == -1)
return NULL;
- if (psize != NULL)
- *psize = PyBytes_GET_SIZE(bytes);
- return PyBytes_AS_STRING(bytes);
+
+ if (PyUnicode_UTF8(unicode) == NULL) {
+ assert(!PyUnicode_IS_COMPACT_ASCII(unicode));
+ bytes = _PyUnicode_AsUTF8String(unicode, "strict");
+ if (bytes == NULL)
+ return NULL;
+ _PyUnicode_UTF8(unicode) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1);
+ if (_PyUnicode_UTF8(unicode) == NULL) {
+ Py_DECREF(bytes);
+ return NULL;
+ }
+ _PyUnicode_UTF8_LENGTH(unicode) = PyBytes_GET_SIZE(bytes);
+ Py_MEMCPY(_PyUnicode_UTF8(unicode),
+ PyBytes_AS_STRING(bytes),
+ _PyUnicode_UTF8_LENGTH(unicode) + 1);
+ Py_DECREF(bytes);
+ }
+
+ if (psize)
+ *psize = PyUnicode_UTF8_LENGTH(unicode);
+ return PyUnicode_UTF8(unicode);
}
char*
-_PyUnicode_AsString(PyObject *unicode)
+PyUnicode_AsUTF8(PyObject *unicode)
{
- return _PyUnicode_AsStringAndSize(unicode, NULL);
+ return PyUnicode_AsUTF8AndSize(unicode, NULL);
}
-Py_UNICODE *PyUnicode_AsUnicode(PyObject *unicode)
+Py_UNICODE *
+PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size)
{
+ const unsigned char *one_byte;
+#if SIZEOF_WCHAR_T == 4
+ const Py_UCS2 *two_bytes;
+#else
+ const Py_UCS4 *four_bytes;
+ const Py_UCS4 *ucs4_end;
+ Py_ssize_t num_surrogates;
+#endif
+ wchar_t *w;
+ wchar_t *wchar_end;
+
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
- goto onError;
+ return NULL;
}
- return PyUnicode_AS_UNICODE(unicode);
+ if (_PyUnicode_WSTR(unicode) == NULL) {
+ /* Non-ASCII compact unicode object */
+ assert(_PyUnicode_KIND(unicode) != 0);
+ assert(PyUnicode_IS_READY(unicode));
- onError:
- return NULL;
+ if (PyUnicode_KIND(unicode) == PyUnicode_4BYTE_KIND) {
+#if SIZEOF_WCHAR_T == 2
+ four_bytes = PyUnicode_4BYTE_DATA(unicode);
+ ucs4_end = four_bytes + _PyUnicode_LENGTH(unicode);
+ num_surrogates = 0;
+
+ for (; four_bytes < ucs4_end; ++four_bytes) {
+ if (*four_bytes > 0xFFFF)
+ ++num_surrogates;
+ }
+
+ _PyUnicode_WSTR(unicode) = (wchar_t *) PyObject_MALLOC(
+ sizeof(wchar_t) * (_PyUnicode_LENGTH(unicode) + 1 + num_surrogates));
+ if (!_PyUnicode_WSTR(unicode)) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ _PyUnicode_WSTR_LENGTH(unicode) = _PyUnicode_LENGTH(unicode) + num_surrogates;
+
+ w = _PyUnicode_WSTR(unicode);
+ wchar_end = w + _PyUnicode_WSTR_LENGTH(unicode);
+ four_bytes = PyUnicode_4BYTE_DATA(unicode);
+ for (; four_bytes < ucs4_end; ++four_bytes, ++w) {
+ if (*four_bytes > 0xFFFF) {
+ assert(*four_bytes <= MAX_UNICODE);
+ /* encode surrogate pair in this case */
+ *w++ = Py_UNICODE_HIGH_SURROGATE(*four_bytes);
+ *w = Py_UNICODE_LOW_SURROGATE(*four_bytes);
+ }
+ else
+ *w = *four_bytes;
+
+ if (w > wchar_end) {
+ assert(0 && "Miscalculated string end");
+ }
+ }
+ *w = 0;
+#else
+ /* sizeof(wchar_t) == 4 */
+ Py_FatalError("Impossible unicode object state, wstr and str "
+ "should share memory already.");
+ return NULL;
+#endif
+ }
+ else {
+ _PyUnicode_WSTR(unicode) = (wchar_t *) PyObject_MALLOC(sizeof(wchar_t) *
+ (_PyUnicode_LENGTH(unicode) + 1));
+ if (!_PyUnicode_WSTR(unicode)) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ if (!PyUnicode_IS_COMPACT_ASCII(unicode))
+ _PyUnicode_WSTR_LENGTH(unicode) = _PyUnicode_LENGTH(unicode);
+ w = _PyUnicode_WSTR(unicode);
+ wchar_end = w + _PyUnicode_LENGTH(unicode);
+
+ if (PyUnicode_KIND(unicode) == PyUnicode_1BYTE_KIND) {
+ one_byte = PyUnicode_1BYTE_DATA(unicode);
+ for (; w < wchar_end; ++one_byte, ++w)
+ *w = *one_byte;
+ /* null-terminate the wstr */
+ *w = 0;
+ }
+ else if (PyUnicode_KIND(unicode) == PyUnicode_2BYTE_KIND) {
+#if SIZEOF_WCHAR_T == 4
+ two_bytes = PyUnicode_2BYTE_DATA(unicode);
+ for (; w < wchar_end; ++two_bytes, ++w)
+ *w = *two_bytes;
+ /* null-terminate the wstr */
+ *w = 0;
+#else
+ /* sizeof(wchar_t) == 2 */
+ PyObject_FREE(_PyUnicode_WSTR(unicode));
+ _PyUnicode_WSTR(unicode) = NULL;
+ Py_FatalError("Impossible unicode object state, wstr "
+ "and str should share memory already.");
+ return NULL;
+#endif
+ }
+ else {
+ assert(0 && "This should never happen.");
+ }
+ }
+ }
+ if (size != NULL)
+ *size = PyUnicode_WSTR_LENGTH(unicode);
+ return _PyUnicode_WSTR(unicode);
+}
+
+Py_UNICODE *
+PyUnicode_AsUnicode(PyObject *unicode)
+{
+ return PyUnicode_AsUnicodeAndSize(unicode, NULL);
}
-Py_ssize_t PyUnicode_GetSize(PyObject *unicode)
+
+Py_ssize_t
+PyUnicode_GetSize(PyObject *unicode)
{
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
@@ -2006,7 +3991,57 @@ Py_ssize_t PyUnicode_GetSize(PyObject *unicode)
return -1;
}
-const char *PyUnicode_GetDefaultEncoding(void)
+Py_ssize_t
+PyUnicode_GetLength(PyObject *unicode)
+{
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return -1;
+ }
+ if (PyUnicode_READY(unicode) == -1)
+ return -1;
+ return PyUnicode_GET_LENGTH(unicode);
+}
+
+Py_UCS4
+PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
+{
+ if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) {
+ PyErr_BadArgument();
+ return (Py_UCS4)-1;
+ }
+ if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return (Py_UCS4)-1;
+ }
+ return PyUnicode_READ_CHAR(unicode, index);
+}
+
+int
+PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch)
+{
+ if (!PyUnicode_Check(unicode) || !PyUnicode_IS_COMPACT(unicode)) {
+ PyErr_BadArgument();
+ return -1;
+ }
+ assert(PyUnicode_IS_READY(unicode));
+ if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -1;
+ }
+ if (unicode_check_modifiable(unicode))
+ return -1;
+ if (ch > PyUnicode_MAX_CHAR_VALUE(unicode)) {
+ PyErr_SetString(PyExc_ValueError, "character out of range");
+ return -1;
+ }
+ PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
+ index, ch);
+ return 0;
+}
+
+const char *
+PyUnicode_GetDefaultEncoding(void)
{
return "utf-8";
}
@@ -2045,26 +4080,29 @@ onError:
return 0 on success, -1 on error
*/
-static
-int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
- const char *encoding, const char *reason,
- const char **input, const char **inend, Py_ssize_t *startinpos,
- Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
- PyUnicodeObject **output, Py_ssize_t *outpos, Py_UNICODE **outptr)
+static int
+unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler,
+ const char *encoding, const char *reason,
+ const char **input, const char **inend, Py_ssize_t *startinpos,
+ Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
+ PyObject **output, Py_ssize_t *outpos)
{
static char *argparse = "O!n;decoding error handler must return (str, int) tuple";
PyObject *restuple = NULL;
PyObject *repunicode = NULL;
- Py_ssize_t outsize = PyUnicode_GET_SIZE(*output);
+ Py_ssize_t outsize;
Py_ssize_t insize;
Py_ssize_t requiredsize;
Py_ssize_t newpos;
- Py_UNICODE *repptr;
PyObject *inputobj = NULL;
- Py_ssize_t repsize;
int res = -1;
+ if (_PyUnicode_KIND(*output) != PyUnicode_WCHAR_KIND)
+ outsize = PyUnicode_GET_LENGTH(*output);
+ else
+ outsize = _PyUnicode_WSTR_LENGTH(*output);
+
if (*errorHandler == NULL) {
*errorHandler = PyCodec_LookupError(errors);
if (*errorHandler == NULL)
@@ -2088,6 +4126,8 @@ int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler
}
if (!PyArg_ParseTuple(restuple, argparse, &PyUnicode_Type, &repunicode, &newpos))
goto onError;
+ if (PyUnicode_READY(repunicode) == -1)
+ goto onError;
/* Copy back the bytes variables, which might have been modified by the
callback */
@@ -2111,25 +4151,47 @@ int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler
goto onError;
}
- /* need more space? (at least enough for what we
- have+the replacement+the rest of the string (starting
- at the new input position), so we won't have to check space
- when there are no errors in the rest of the string) */
- repptr = PyUnicode_AS_UNICODE(repunicode);
- repsize = PyUnicode_GET_SIZE(repunicode);
- requiredsize = *outpos + repsize + insize-newpos;
- if (requiredsize > outsize) {
- if (requiredsize<2*outsize)
- requiredsize = 2*outsize;
- if (_PyUnicode_Resize(output, requiredsize) < 0)
+ if (_PyUnicode_KIND(*output) != PyUnicode_WCHAR_KIND) {
+ /* need more space? (at least enough for what we
+ have+the replacement+the rest of the string (starting
+ at the new input position), so we won't have to check space
+ when there are no errors in the rest of the string) */
+ Py_ssize_t replen = PyUnicode_GET_LENGTH(repunicode);
+ requiredsize = *outpos + replen + insize-newpos;
+ if (requiredsize > outsize) {
+ if (requiredsize<2*outsize)
+ requiredsize = 2*outsize;
+ if (unicode_resize(output, requiredsize) < 0)
+ goto onError;
+ }
+ if (unicode_widen(output, *outpos,
+ PyUnicode_MAX_CHAR_VALUE(repunicode)) < 0)
+ goto onError;
+ _PyUnicode_FastCopyCharacters(*output, *outpos, repunicode, 0, replen);
+ *outpos += replen;
+ }
+ else {
+ wchar_t *repwstr;
+ Py_ssize_t repwlen;
+ repwstr = PyUnicode_AsUnicodeAndSize(repunicode, &repwlen);
+ if (repwstr == NULL)
goto onError;
- *outptr = PyUnicode_AS_UNICODE(*output) + *outpos;
+ /* need more space? (at least enough for what we
+ have+the replacement+the rest of the string (starting
+ at the new input position), so we won't have to check space
+ when there are no errors in the rest of the string) */
+ requiredsize = *outpos + repwlen + insize-newpos;
+ if (requiredsize > outsize) {
+ if (requiredsize < 2*outsize)
+ requiredsize = 2*outsize;
+ if (unicode_resize(output, requiredsize) < 0)
+ goto onError;
+ }
+ wcsncpy(_PyUnicode_WSTR(*output) + *outpos, repwstr, repwlen);
+ *outpos += repwlen;
}
*endinpos = newpos;
*inptr = *input + newpos;
- Py_UNICODE_COPY(*outptr, repptr, repsize);
- *outptr += repsize;
- *outpos += repsize;
/* we made it! */
res = 0;
@@ -2220,9 +4282,10 @@ char utf7_category[128] = {
(directWS && (utf7_category[(c)] == 2)) || \
(directO && (utf7_category[(c)] == 1))))
-PyObject *PyUnicode_DecodeUTF7(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeUTF7(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
return PyUnicode_DecodeUTF7Stateful(s, size, errors, NULL);
}
@@ -2234,42 +4297,42 @@ PyObject *PyUnicode_DecodeUTF7(const char *s,
* all the shift state (seen bits, number of bits seen, high
* surrogate). */
-PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
- Py_ssize_t size,
- const char *errors,
- Py_ssize_t *consumed)
+PyObject *
+PyUnicode_DecodeUTF7Stateful(const char *s,
+ Py_ssize_t size,
+ const char *errors,
+ Py_ssize_t *consumed)
{
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
const char *e;
- PyUnicodeObject *unicode;
- Py_UNICODE *p;
+ PyObject *unicode;
const char *errmsg = "";
int inShift = 0;
- Py_UNICODE *shiftOutStart;
+ Py_ssize_t shiftOutStart;
unsigned int base64bits = 0;
unsigned long base64buffer = 0;
- Py_UNICODE surrogate = 0;
+ Py_UCS4 surrogate = 0;
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- unicode = _PyUnicode_New(size);
+ /* Start off assuming it's all ASCII. Widen later as necessary. */
+ unicode = PyUnicode_New(size, 127);
if (!unicode)
return NULL;
if (size == 0) {
if (consumed)
*consumed = 0;
- return (PyObject *)unicode;
+ return unicode;
}
- p = unicode->str;
- shiftOutStart = p;
+ shiftOutStart = outpos = 0;
e = s + size;
while (s < e) {
- Py_UNICODE ch;
+ Py_UCS4 ch;
restart:
ch = (unsigned char) *s;
@@ -2280,34 +4343,31 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
s++;
if (base64bits >= 16) {
/* we have enough bits for a UTF-16 value */
- Py_UNICODE outCh = (Py_UNICODE)
- (base64buffer >> (base64bits-16));
+ Py_UCS4 outCh = (Py_UCS4)(base64buffer >> (base64bits-16));
base64bits -= 16;
base64buffer &= (1 << base64bits) - 1; /* clear high bits */
if (surrogate) {
/* expecting a second surrogate */
- if (outCh >= 0xDC00 && outCh <= 0xDFFF) {
-#ifdef Py_UNICODE_WIDE
- *p++ = (((surrogate & 0x3FF)<<10)
- | (outCh & 0x3FF)) + 0x10000;
-#else
- *p++ = surrogate;
- *p++ = outCh;
-#endif
+ if (Py_UNICODE_IS_LOW_SURROGATE(outCh)) {
+ Py_UCS4 ch2 = Py_UNICODE_JOIN_SURROGATES(surrogate, outCh);
+ if (unicode_putchar(&unicode, &outpos, ch2) < 0)
+ goto onError;
surrogate = 0;
continue;
}
else {
- *p++ = surrogate;
+ if (unicode_putchar(&unicode, &outpos, surrogate) < 0)
+ goto onError;
surrogate = 0;
}
}
- if (outCh >= 0xD800 && outCh <= 0xDBFF) {
+ if (Py_UNICODE_IS_HIGH_SURROGATE(outCh)) {
/* first surrogate */
surrogate = outCh;
}
else {
- *p++ = outCh;
+ if (unicode_putchar(&unicode, &outpos, outCh) < 0)
+ goto onError;
}
}
}
@@ -2315,7 +4375,8 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
inShift = 0;
s++;
if (surrogate) {
- *p++ = surrogate;
+ if (unicode_putchar(&unicode, &outpos, surrogate) < 0)
+ goto onError;
surrogate = 0;
}
if (base64bits > 0) { /* left-over bits */
@@ -2335,7 +4396,8 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
if (ch != '-') {
/* '-' is absorbed; other terminating
characters are preserved */
- *p++ = ch;
+ if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ goto onError;
}
}
}
@@ -2344,16 +4406,18 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
s++; /* consume '+' */
if (s < e && *s == '-') { /* '+-' encodes '+' */
s++;
- *p++ = '+';
+ if (unicode_putchar(&unicode, &outpos, '+') < 0)
+ goto onError;
}
else { /* begin base64-encoded section */
inShift = 1;
- shiftOutStart = p;
+ shiftOutStart = outpos;
base64bits = 0;
}
}
else if (DECODE_DIRECT(ch)) { /* character decodes as itself */
- *p++ = ch;
+ if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ goto onError;
s++;
}
else {
@@ -2364,13 +4428,12 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
}
continue;
utf7Error:
- outpos = p-PyUnicode_AS_UNICODE(unicode);
endinpos = s-starts;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"utf7", errmsg,
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos, &p))
+ &unicode, &outpos))
goto onError;
}
@@ -2381,13 +4444,12 @@ utf7Error:
if (surrogate ||
(base64bits >= 6) ||
(base64bits > 0 && base64buffer != 0)) {
- outpos = p-PyUnicode_AS_UNICODE(unicode);
endinpos = size;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"utf7", "unterminated shift sequence",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos, &p))
+ &unicode, &outpos))
goto onError;
if (s < e)
goto restart;
@@ -2397,7 +4459,7 @@ utf7Error:
/* return state */
if (consumed) {
if (inShift) {
- p = shiftOutStart; /* back off output */
+ outpos = shiftOutStart; /* back off output */
*consumed = startinpos;
}
else {
@@ -2405,12 +4467,12 @@ utf7Error:
}
}
- if (_PyUnicode_Resize(&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0)
+ if (unicode_resize(&unicode, outpos) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)unicode;
+ return unicode_result(unicode);
onError:
Py_XDECREF(errorHandler);
@@ -2420,35 +4482,42 @@ utf7Error:
}
-PyObject *PyUnicode_EncodeUTF7(const Py_UNICODE *s,
- Py_ssize_t size,
- int base64SetO,
- int base64WhiteSpace,
- const char *errors)
+PyObject *
+_PyUnicode_EncodeUTF7(PyObject *str,
+ int base64SetO,
+ int base64WhiteSpace,
+ const char *errors)
{
+ int kind;
+ void *data;
+ Py_ssize_t len;
PyObject *v;
- /* It might be possible to tighten this worst case */
- Py_ssize_t allocated = 8 * size;
int inShift = 0;
- Py_ssize_t i = 0;
+ Py_ssize_t i;
unsigned int base64bits = 0;
unsigned long base64buffer = 0;
char * out;
char * start;
- if (size == 0)
+ if (PyUnicode_READY(str) == -1)
+ return NULL;
+ kind = PyUnicode_KIND(str);
+ data = PyUnicode_DATA(str);
+ len = PyUnicode_GET_LENGTH(str);
+
+ if (len == 0)
return PyBytes_FromStringAndSize(NULL, 0);
- if (allocated / 8 != size)
+ /* It might be possible to tighten this worst case */
+ if (len > PY_SSIZE_T_MAX / 8)
return PyErr_NoMemory();
-
- v = PyBytes_FromStringAndSize(NULL, allocated);
+ v = PyBytes_FromStringAndSize(NULL, len * 8);
if (v == NULL)
return NULL;
start = out = PyBytes_AS_STRING(v);
- for (;i < size; ++i) {
- Py_UNICODE ch = s[i];
+ for (i = 0; i < len; ++i) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (inShift) {
if (ENCODE_DIRECT(ch, !base64SetO, !base64WhiteSpace)) {
@@ -2486,8 +4555,9 @@ PyObject *PyUnicode_EncodeUTF7(const Py_UNICODE *s,
}
continue;
encode_char:
-#ifdef Py_UNICODE_WIDE
if (ch >= 0x10000) {
+ assert(ch <= MAX_UNICODE);
+
/* code first surrogate */
base64bits += 16;
base64buffer = (base64buffer << 16) | 0xd800 | ((ch-0x10000) >> 10);
@@ -2496,9 +4566,8 @@ encode_char:
base64bits -= 6;
}
/* prepare second surrogate */
- ch = 0xDC00 | ((ch-0x10000) & 0x3FF);
+ ch = Py_UNICODE_LOW_SURROGATE(ch);
}
-#endif
base64bits += 16;
base64buffer = (base64buffer << 16) | ch;
while (base64bits >= 6) {
@@ -2514,6 +4583,22 @@ encode_char:
return NULL;
return v;
}
+PyObject *
+PyUnicode_EncodeUTF7(const Py_UNICODE *s,
+ Py_ssize_t size,
+ int base64SetO,
+ int base64WhiteSpace,
+ const char *errors)
+{
+ PyObject *result;
+ PyObject *tmp = PyUnicode_FromUnicode(s, size);
+ if (tmp == NULL)
+ return NULL;
+ result = _PyUnicode_EncodeUTF7(tmp, base64SetO,
+ base64WhiteSpace, errors);
+ Py_DECREF(tmp);
+ return result;
+}
#undef IS_BASE64
#undef FROM_BASE64
@@ -2523,272 +4608,204 @@ encode_char:
/* --- UTF-8 Codec -------------------------------------------------------- */
-static
-char utf8_code_length[256] = {
- /* Map UTF-8 encoded prefix byte to sequence length. Zero means
- illegal prefix. See RFC 3629 for details */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 00-0F */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 70-7F */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80-8F */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0-BF */
- 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* C0-C1 + C2-CF */
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* D0-DF */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* E0-EF */
- 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* F0-F4 + F5-FF */
-};
-
-PyObject *PyUnicode_DecodeUTF8(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeUTF8(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL);
}
-/* Mask to check or force alignment of a pointer to C 'long' boundaries */
-#define LONG_PTR_MASK (size_t) (SIZEOF_LONG - 1)
+#include "stringlib/asciilib.h"
+#include "stringlib/codecs.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/ucs1lib.h"
+#include "stringlib/codecs.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/ucs2lib.h"
+#include "stringlib/codecs.h"
+#include "stringlib/undef.h"
+
+#include "stringlib/ucs4lib.h"
+#include "stringlib/codecs.h"
+#include "stringlib/undef.h"
/* Mask to quickly check whether a C 'long' contains a
non-ASCII, UTF8-encoded char. */
#if (SIZEOF_LONG == 8)
-# define ASCII_CHAR_MASK 0x8080808080808080L
+# define ASCII_CHAR_MASK 0x8080808080808080UL
#elif (SIZEOF_LONG == 4)
-# define ASCII_CHAR_MASK 0x80808080L
+# define ASCII_CHAR_MASK 0x80808080UL
#else
# error C 'long' size should be either 4 or 8!
#endif
-PyObject *PyUnicode_DecodeUTF8Stateful(const char *s,
- Py_ssize_t size,
- const char *errors,
- Py_ssize_t *consumed)
+static Py_ssize_t
+ascii_decode(const char *start, const char *end, Py_UCS1 *dest)
+{
+ const char *p = start;
+ const char *aligned_end = (const char *) _Py_ALIGN_DOWN(end, SIZEOF_LONG);
+
+#if SIZEOF_LONG <= SIZEOF_VOID_P
+ assert(_Py_IS_ALIGNED(dest, SIZEOF_LONG));
+ if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
+ /* Fast path, see in STRINGLIB(utf8_decode) for
+ an explanation. */
+ /* Help register allocation */
+ register const char *_p = p;
+ register Py_UCS1 * q = dest;
+ while (_p < aligned_end) {
+ unsigned long value = *(const unsigned long *) _p;
+ if (value & ASCII_CHAR_MASK)
+ break;
+ *((unsigned long *)q) = value;
+ _p += SIZEOF_LONG;
+ q += SIZEOF_LONG;
+ }
+ p = _p;
+ while (p < end) {
+ if ((unsigned char)*p & 0x80)
+ break;
+ *q++ = *p++;
+ }
+ return p - start;
+ }
+#endif
+ while (p < end) {
+ /* Fast path, see in STRINGLIB(utf8_decode) in stringlib/codecs.h
+ for an explanation. */
+ if (_Py_IS_ALIGNED(p, SIZEOF_LONG)) {
+ /* Help register allocation */
+ register const char *_p = p;
+ while (_p < aligned_end) {
+ unsigned long value = *(unsigned long *) _p;
+ if (value & ASCII_CHAR_MASK)
+ break;
+ _p += SIZEOF_LONG;
+ }
+ p = _p;
+ if (_p == end)
+ break;
+ }
+ if ((unsigned char)*p & 0x80)
+ break;
+ ++p;
+ }
+ memcpy(dest, start, p - start);
+ return p - start;
+}
+
+PyObject *
+PyUnicode_DecodeUTF8Stateful(const char *s,
+ Py_ssize_t size,
+ const char *errors,
+ Py_ssize_t *consumed)
{
+ PyObject *unicode;
const char *starts = s;
- int n;
- int k;
+ const char *end = s + size;
+ Py_ssize_t outpos;
+
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- const char *e, *aligned_end;
- PyUnicodeObject *unicode;
- Py_UNICODE *p;
const char *errmsg = "";
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- /* Note: size will always be longer than the resulting Unicode
- character count */
- unicode = _PyUnicode_New(size);
- if (!unicode)
- return NULL;
if (size == 0) {
if (consumed)
*consumed = 0;
- return (PyObject *)unicode;
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
- /* Unpack UTF-8 encoded data */
- p = unicode->str;
- e = s + size;
- aligned_end = (const char *) ((size_t) e & ~LONG_PTR_MASK);
-
- while (s < e) {
- Py_UCS4 ch = (unsigned char)*s;
-
- if (ch < 0x80) {
- /* Fast path for runs of ASCII characters. Given that common UTF-8
- input will consist of an overwhelming majority of ASCII
- characters, we try to optimize for this case by checking
- as many characters as a C 'long' can contain.
- First, check if we can do an aligned read, as most CPUs have
- a penalty for unaligned reads.
- */
- if (!((size_t) s & LONG_PTR_MASK)) {
- /* Help register allocation */
- register const char *_s = s;
- register Py_UNICODE *_p = p;
- while (_s < aligned_end) {
- /* Read a whole long at a time (either 4 or 8 bytes),
- and do a fast unrolled copy if it only contains ASCII
- characters. */
- unsigned long data = *(unsigned long *) _s;
- if (data & ASCII_CHAR_MASK)
- break;
- _p[0] = (unsigned char) _s[0];
- _p[1] = (unsigned char) _s[1];
- _p[2] = (unsigned char) _s[2];
- _p[3] = (unsigned char) _s[3];
-#if (SIZEOF_LONG == 8)
- _p[4] = (unsigned char) _s[4];
- _p[5] = (unsigned char) _s[5];
- _p[6] = (unsigned char) _s[6];
- _p[7] = (unsigned char) _s[7];
-#endif
- _s += SIZEOF_LONG;
- _p += SIZEOF_LONG;
- }
- s = _s;
- p = _p;
- if (s == e)
- break;
- ch = (unsigned char)*s;
- }
- }
-
- if (ch < 0x80) {
- *p++ = (Py_UNICODE)ch;
- s++;
- continue;
- }
+ /* ASCII is equivalent to the first 128 ordinals in Unicode. */
+ if (size == 1 && (unsigned char)s[0] < 128) {
+ if (consumed)
+ *consumed = 1;
+ return get_latin1_char((unsigned char)s[0]);
+ }
- n = utf8_code_length[ch];
+ unicode = PyUnicode_New(size, 127);
+ if (!unicode)
+ return NULL;
- if (s + n > e) {
- if (consumed)
- break;
- else {
- errmsg = "unexpected end of data";
- startinpos = s-starts;
- endinpos = startinpos+1;
- for (k=1; (k < size-startinpos) && ((s[k]&0xC0) == 0x80); k++)
- endinpos++;
- goto utf8Error;
- }
+ outpos = ascii_decode(s, end, PyUnicode_1BYTE_DATA(unicode));
+ s += outpos;
+ while (s < end) {
+ Py_UCS4 ch;
+ int kind = PyUnicode_KIND(unicode);
+ if (kind == PyUnicode_1BYTE_KIND) {
+ if (PyUnicode_IS_ASCII(unicode))
+ ch = asciilib_utf8_decode(&s, end,
+ PyUnicode_1BYTE_DATA(unicode), &outpos);
+ else
+ ch = ucs1lib_utf8_decode(&s, end,
+ PyUnicode_1BYTE_DATA(unicode), &outpos);
+ } else if (kind == PyUnicode_2BYTE_KIND) {
+ ch = ucs2lib_utf8_decode(&s, end,
+ PyUnicode_2BYTE_DATA(unicode), &outpos);
+ } else {
+ assert(kind == PyUnicode_4BYTE_KIND);
+ ch = ucs4lib_utf8_decode(&s, end,
+ PyUnicode_4BYTE_DATA(unicode), &outpos);
}
- switch (n) {
-
+ switch (ch) {
case 0:
- errmsg = "invalid start byte";
- startinpos = s-starts;
- endinpos = startinpos+1;
- goto utf8Error;
-
+ if (s == end || consumed)
+ goto End;
+ errmsg = "unexpected end of data";
+ startinpos = s - starts;
+ endinpos = end - starts;
+ break;
case 1:
- errmsg = "internal error";
- startinpos = s-starts;
- endinpos = startinpos+1;
- goto utf8Error;
-
- case 2:
- if ((s[1] & 0xc0) != 0x80) {
- errmsg = "invalid continuation byte";
- startinpos = s-starts;
- endinpos = startinpos + 1;
- goto utf8Error;
- }
- ch = ((s[0] & 0x1f) << 6) + (s[1] & 0x3f);
- assert ((ch > 0x007F) && (ch <= 0x07FF));
- *p++ = (Py_UNICODE)ch;
+ errmsg = "invalid start byte";
+ startinpos = s - starts;
+ endinpos = startinpos + 1;
break;
-
+ case 2:
case 3:
- /* Decoding UTF-8 sequences in range \xed\xa0\x80-\xed\xbf\xbf
- will result in surrogates in range d800-dfff. Surrogates are
- not valid UTF-8 so they are rejected.
- See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf
- (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */
- if ((s[1] & 0xc0) != 0x80 ||
- (s[2] & 0xc0) != 0x80 ||
- ((unsigned char)s[0] == 0xE0 &&
- (unsigned char)s[1] < 0xA0) ||
- ((unsigned char)s[0] == 0xED &&
- (unsigned char)s[1] > 0x9F)) {
- errmsg = "invalid continuation byte";
- startinpos = s-starts;
- endinpos = startinpos + 1;
-
- /* if s[1] first two bits are 1 and 0, then the invalid
- continuation byte is s[2], so increment endinpos by 1,
- if not, s[1] is invalid and endinpos doesn't need to
- be incremented. */
- if ((s[1] & 0xC0) == 0x80)
- endinpos++;
- goto utf8Error;
- }
- ch = ((s[0] & 0x0f) << 12) + ((s[1] & 0x3f) << 6) + (s[2] & 0x3f);
- assert ((ch > 0x07FF) && (ch <= 0xFFFF));
- *p++ = (Py_UNICODE)ch;
- break;
-
case 4:
- if ((s[1] & 0xc0) != 0x80 ||
- (s[2] & 0xc0) != 0x80 ||
- (s[3] & 0xc0) != 0x80 ||
- ((unsigned char)s[0] == 0xF0 &&
- (unsigned char)s[1] < 0x90) ||
- ((unsigned char)s[0] == 0xF4 &&
- (unsigned char)s[1] > 0x8F)) {
- errmsg = "invalid continuation byte";
- startinpos = s-starts;
- endinpos = startinpos + 1;
- if ((s[1] & 0xC0) == 0x80) {
- endinpos++;
- if ((s[2] & 0xC0) == 0x80)
- endinpos++;
- }
- goto utf8Error;
- }
- ch = ((s[0] & 0x7) << 18) + ((s[1] & 0x3f) << 12) +
- ((s[2] & 0x3f) << 6) + (s[3] & 0x3f);
- assert ((ch > 0xFFFF) && (ch <= 0x10ffff));
-
-#ifdef Py_UNICODE_WIDE
- *p++ = (Py_UNICODE)ch;
-#else
- /* compute and append the two surrogates: */
-
- /* translate from 10000..10FFFF to 0..FFFF */
- ch -= 0x10000;
-
- /* high surrogate = top 10 bits added to D800 */
- *p++ = (Py_UNICODE)(0xD800 + (ch >> 10));
-
- /* low surrogate = bottom 10 bits added to DC00 */
- *p++ = (Py_UNICODE)(0xDC00 + (ch & 0x03FF));
-#endif
+ errmsg = "invalid continuation byte";
+ startinpos = s - starts;
+ endinpos = startinpos + ch - 1;
break;
+ default:
+ if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ goto onError;
+ continue;
}
- s += n;
- continue;
- utf8Error:
- outpos = p-PyUnicode_AS_UNICODE(unicode);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"utf-8", errmsg,
- &starts, &e, &startinpos, &endinpos, &exc, &s,
- &unicode, &outpos, &p))
+ &starts, &end, &startinpos, &endinpos, &exc, &s,
+ &unicode, &outpos))
goto onError;
- aligned_end = (const char *) ((size_t) e & ~LONG_PTR_MASK);
}
- if (consumed)
- *consumed = s-starts;
- /* Adjust length */
- if (_PyUnicode_Resize(&unicode, p - unicode->str) < 0)
+End:
+ if (unicode_resize(&unicode, outpos) < 0)
goto onError;
+ if (consumed)
+ *consumed = s - starts;
+
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)unicode;
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ return unicode;
- onError:
+onError:
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- Py_DECREF(unicode);
+ Py_XDECREF(unicode);
return NULL;
}
-#undef ASCII_CHAR_MASK
-
#ifdef __APPLE__
/* Simplified UTF-8 decoder using surrogateescape error handler,
@@ -2797,9 +4814,9 @@ PyObject *PyUnicode_DecodeUTF8Stateful(const char *s,
wchar_t*
_Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size)
{
- int n;
const char *e;
- wchar_t *unicode, *p;
+ wchar_t *unicode;
+ Py_ssize_t outpos;
/* Note: size will always be longer than the resulting Unicode
character count */
@@ -2812,277 +4829,101 @@ _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size)
return NULL;
/* Unpack UTF-8 encoded data */
- p = unicode;
e = s + size;
+ outpos = 0;
while (s < e) {
- Py_UCS4 ch = (unsigned char)*s;
-
- if (ch < 0x80) {
- *p++ = (wchar_t)ch;
- s++;
- continue;
- }
-
- n = utf8_code_length[ch];
- if (s + n > e) {
- goto surrogateescape;
- }
-
- switch (n) {
- case 0:
- case 1:
- goto surrogateescape;
-
- case 2:
- if ((s[1] & 0xc0) != 0x80)
- goto surrogateescape;
- ch = ((s[0] & 0x1f) << 6) + (s[1] & 0x3f);
- assert ((ch > 0x007F) && (ch <= 0x07FF));
- *p++ = (wchar_t)ch;
- break;
-
- case 3:
- /* Decoding UTF-8 sequences in range \xed\xa0\x80-\xed\xbf\xbf
- will result in surrogates in range d800-dfff. Surrogates are
- not valid UTF-8 so they are rejected.
- See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf
- (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */
- if ((s[1] & 0xc0) != 0x80 ||
- (s[2] & 0xc0) != 0x80 ||
- ((unsigned char)s[0] == 0xE0 &&
- (unsigned char)s[1] < 0xA0) ||
- ((unsigned char)s[0] == 0xED &&
- (unsigned char)s[1] > 0x9F)) {
-
- goto surrogateescape;
- }
- ch = ((s[0] & 0x0f) << 12) + ((s[1] & 0x3f) << 6) + (s[2] & 0x3f);
- assert ((ch > 0x07FF) && (ch <= 0xFFFF));
- *p++ = (Py_UNICODE)ch;
- break;
-
- case 4:
- if ((s[1] & 0xc0) != 0x80 ||
- (s[2] & 0xc0) != 0x80 ||
- (s[3] & 0xc0) != 0x80 ||
- ((unsigned char)s[0] == 0xF0 &&
- (unsigned char)s[1] < 0x90) ||
- ((unsigned char)s[0] == 0xF4 &&
- (unsigned char)s[1] > 0x8F)) {
- goto surrogateescape;
- }
- ch = ((s[0] & 0x7) << 18) + ((s[1] & 0x3f) << 12) +
- ((s[2] & 0x3f) << 6) + (s[3] & 0x3f);
- assert ((ch > 0xFFFF) && (ch <= 0x10ffff));
-
+ Py_UCS4 ch;
#if SIZEOF_WCHAR_T == 4
- *p++ = (wchar_t)ch;
+ ch = ucs4lib_utf8_decode(&s, e, (Py_UCS4 *)unicode, &outpos);
#else
+ ch = ucs2lib_utf8_decode(&s, e, (Py_UCS2 *)unicode, &outpos);
+#endif
+ if (ch > 0xFF) {
+#if SIZEOF_WCHAR_T == 4
+ assert(0);
+#else
+ assert(Py_UNICODE_IS_SURROGATE(ch));
/* compute and append the two surrogates: */
-
- /* translate from 10000..10FFFF to 0..FFFF */
- ch -= 0x10000;
-
- /* high surrogate = top 10 bits added to D800 */
- *p++ = (wchar_t)(0xD800 + (ch >> 10));
-
- /* low surrogate = bottom 10 bits added to DC00 */
- *p++ = (wchar_t)(0xDC00 + (ch & 0x03FF));
+ unicode[outpos++] = (wchar_t)Py_UNICODE_HIGH_SURROGATE(ch);
+ unicode[outpos++] = (wchar_t)Py_UNICODE_LOW_SURROGATE(ch);
#endif
- break;
}
- s += n;
- continue;
-
- surrogateescape:
- *p++ = 0xDC00 + ch;
- s++;
+ else {
+ if (!ch && s == e)
+ break;
+ /* surrogateescape */
+ unicode[outpos++] = 0xDC00 + (unsigned char)*s++;
+ }
}
- *p = L'\0';
+ unicode[outpos] = L'\0';
return unicode;
}
#endif /* __APPLE__ */
-/* Allocation strategy: if the string is short, convert into a stack buffer
+/* Primary internal function which creates utf8 encoded bytes objects.
+
+ Allocation strategy: if the string is short, convert into a stack buffer
and allocate exactly as much space needed at the end. Else allocate the
maximum possible needed (4 result bytes per Unicode character), and return
the excess memory at the end.
*/
PyObject *
-PyUnicode_EncodeUTF8(const Py_UNICODE *s,
- Py_ssize_t size,
- const char *errors)
+_PyUnicode_AsUTF8String(PyObject *unicode, const char *errors)
{
-#define MAX_SHORT_UNICHARS 300 /* largest size we'll do on the stack */
-
- Py_ssize_t i; /* index into s of next input byte */
- PyObject *result; /* result string object */
- char *p; /* next free byte in output buffer */
- Py_ssize_t nallocated; /* number of result bytes allocated */
- Py_ssize_t nneeded; /* number of result bytes needed */
- char stackbuf[MAX_SHORT_UNICHARS * 4];
- PyObject *errorHandler = NULL;
- PyObject *exc = NULL;
-
- assert(s != NULL);
- assert(size >= 0);
+ enum PyUnicode_Kind kind;
+ void *data;
+ Py_ssize_t size;
- if (size <= MAX_SHORT_UNICHARS) {
- /* Write into the stack buffer; nallocated can't overflow.
- * At the end, we'll allocate exactly as much heap space as it
- * turns out we need.
- */
- nallocated = Py_SAFE_DOWNCAST(sizeof(stackbuf), size_t, int);
- result = NULL; /* will allocate after we're done */
- p = stackbuf;
- }
- else {
- /* Overallocate on the heap, and give the excess back at the end. */
- nallocated = size * 4;
- if (nallocated / 4 != size) /* overflow! */
- return PyErr_NoMemory();
- result = PyBytes_FromStringAndSize(NULL, nallocated);
- if (result == NULL)
- return NULL;
- p = PyBytes_AS_STRING(result);
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return NULL;
}
- for (i = 0; i < size;) {
- Py_UCS4 ch = s[i++];
-
- if (ch < 0x80)
- /* Encode ASCII */
- *p++ = (char) ch;
-
- else if (ch < 0x0800) {
- /* Encode Latin-1 */
- *p++ = (char)(0xc0 | (ch >> 6));
- *p++ = (char)(0x80 | (ch & 0x3f));
- } else if (0xD800 <= ch && ch <= 0xDFFF) {
-#ifndef Py_UNICODE_WIDE
- /* Special case: check for high and low surrogate */
- if (ch <= 0xDBFF && i != size && 0xDC00 <= s[i] && s[i] <= 0xDFFF) {
- Py_UCS4 ch2 = s[i];
- /* Combine the two surrogates to form a UCS4 value */
- ch = ((ch - 0xD800) << 10 | (ch2 - 0xDC00)) + 0x10000;
- i++;
-
- /* Encode UCS4 Unicode ordinals */
- *p++ = (char)(0xf0 | (ch >> 18));
- *p++ = (char)(0x80 | ((ch >> 12) & 0x3f));
- *p++ = (char)(0x80 | ((ch >> 6) & 0x3f));
- *p++ = (char)(0x80 | (ch & 0x3f));
- } else {
-#endif
- Py_ssize_t newpos;
- PyObject *rep;
- Py_ssize_t repsize, k;
- rep = unicode_encode_call_errorhandler
- (errors, &errorHandler, "utf-8", "surrogates not allowed",
- s, size, &exc, i-1, i, &newpos);
- if (!rep)
- goto error;
-
- if (PyBytes_Check(rep))
- repsize = PyBytes_GET_SIZE(rep);
- else
- repsize = PyUnicode_GET_SIZE(rep);
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
- if (repsize > 4) {
- Py_ssize_t offset;
+ if (PyUnicode_UTF8(unicode))
+ return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode),
+ PyUnicode_UTF8_LENGTH(unicode));
- if (result == NULL)
- offset = p - stackbuf;
- else
- offset = p - PyBytes_AS_STRING(result);
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
+ size = PyUnicode_GET_LENGTH(unicode);
- if (nallocated > PY_SSIZE_T_MAX - repsize + 4) {
- /* integer overflow */
- PyErr_NoMemory();
- goto error;
- }
- nallocated += repsize - 4;
- if (result != NULL) {
- if (_PyBytes_Resize(&result, nallocated) < 0)
- goto error;
- } else {
- result = PyBytes_FromStringAndSize(NULL, nallocated);
- if (result == NULL)
- goto error;
- Py_MEMCPY(PyBytes_AS_STRING(result), stackbuf, offset);
- }
- p = PyBytes_AS_STRING(result) + offset;
- }
-
- if (PyBytes_Check(rep)) {
- char *prep = PyBytes_AS_STRING(rep);
- for(k = repsize; k > 0; k--)
- *p++ = *prep++;
- } else /* rep is unicode */ {
- Py_UNICODE *prep = PyUnicode_AS_UNICODE(rep);
- Py_UNICODE c;
-
- for(k=0; k<repsize; k++) {
- c = prep[k];
- if (0x80 <= c) {
- raise_encode_exception(&exc, "utf-8", s, size,
- i-1, i, "surrogates not allowed");
- goto error;
- }
- *p++ = (char)prep[k];
- }
- }
- Py_DECREF(rep);
-#ifndef Py_UNICODE_WIDE
- }
-#endif
- } else if (ch < 0x10000) {
- *p++ = (char)(0xe0 | (ch >> 12));
- *p++ = (char)(0x80 | ((ch >> 6) & 0x3f));
- *p++ = (char)(0x80 | (ch & 0x3f));
- } else /* ch >= 0x10000 */ {
- /* Encode UCS4 Unicode ordinals */
- *p++ = (char)(0xf0 | (ch >> 18));
- *p++ = (char)(0x80 | ((ch >> 12) & 0x3f));
- *p++ = (char)(0x80 | ((ch >> 6) & 0x3f));
- *p++ = (char)(0x80 | (ch & 0x3f));
- }
+ switch (kind) {
+ default:
+ assert(0);
+ case PyUnicode_1BYTE_KIND:
+ /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */
+ assert(!PyUnicode_IS_ASCII(unicode));
+ return ucs1lib_utf8_encoder(unicode, data, size, errors);
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_utf8_encoder(unicode, data, size, errors);
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_utf8_encoder(unicode, data, size, errors);
}
+}
- if (result == NULL) {
- /* This was stack allocated. */
- nneeded = p - stackbuf;
- assert(nneeded <= nallocated);
- result = PyBytes_FromStringAndSize(stackbuf, nneeded);
- }
- else {
- /* Cut back to size actually needed. */
- nneeded = p - PyBytes_AS_STRING(result);
- assert(nneeded <= nallocated);
- _PyBytes_Resize(&result, nneeded);
- }
- Py_XDECREF(errorHandler);
- Py_XDECREF(exc);
- return result;
- error:
- Py_XDECREF(errorHandler);
- Py_XDECREF(exc);
- Py_XDECREF(result);
- return NULL;
+PyObject *
+PyUnicode_EncodeUTF8(const Py_UNICODE *s,
+ Py_ssize_t size,
+ const char *errors)
+{
+ PyObject *v, *unicode;
-#undef MAX_SHORT_UNICHARS
+ unicode = PyUnicode_FromUnicode(s, size);
+ if (unicode == NULL)
+ return NULL;
+ v = _PyUnicode_AsUTF8String(unicode, errors);
+ Py_DECREF(unicode);
+ return v;
}
-PyObject *PyUnicode_AsUTF8String(PyObject *unicode)
+PyObject *
+PyUnicode_AsUTF8String(PyObject *unicode)
{
- if (!PyUnicode_Check(unicode)) {
- PyErr_BadArgument();
- return NULL;
- }
- return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
+ return _PyUnicode_AsUTF8String(unicode, NULL);
}
/* --- UTF-32 Codec ------------------------------------------------------- */
@@ -3107,14 +4948,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
- PyUnicodeObject *unicode;
- Py_UNICODE *p;
-#ifndef Py_UNICODE_WIDE
- int pairs = 0;
- const unsigned char *qq;
-#else
- const int pairs = 0;
-#endif
+ PyObject *unicode;
const unsigned char *q, *e;
int bo = 0; /* assume native ordering by default */
const char *errmsg = "";
@@ -3178,23 +5012,13 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
iorder[3] = 0;
}
- /* On narrow builds we split characters outside the BMP into two
- codepoints => count how much extra space we need. */
-#ifndef Py_UNICODE_WIDE
- for (qq = q; qq < e; qq += 4)
- if (qq[iorder[2]] != 0 || qq[iorder[3]] != 0)
- pairs++;
-#endif
-
/* This might be one to much, because of a BOM */
- unicode = _PyUnicode_New((size+3)/4+pairs);
+ unicode = PyUnicode_New((size+3)/4, 127);
if (!unicode)
return NULL;
if (size == 0)
- return (PyObject *)unicode;
-
- /* Unpack UTF-32 encoded data */
- p = unicode->str;
+ return unicode;
+ outpos = 0;
while (q < e) {
Py_UCS4 ch;
@@ -3219,24 +5043,16 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
endinpos = startinpos+4;
goto utf32Error;
}
-#ifndef Py_UNICODE_WIDE
- if (ch >= 0x10000)
- {
- *p++ = 0xD800 | ((ch-0x10000) >> 10);
- *p++ = 0xDC00 | ((ch-0x10000) & 0x3FF);
- }
- else
-#endif
- *p++ = ch;
+ if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ goto onError;
q += 4;
continue;
utf32Error:
- outpos = p-PyUnicode_AS_UNICODE(unicode);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"utf32", errmsg,
&starts, (const char **)&e, &startinpos, &endinpos, &exc, (const char **)&q,
- &unicode, &outpos, &p))
+ &unicode, &outpos))
goto onError;
}
@@ -3247,12 +5063,12 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
*consumed = (const char *)q-starts;
/* Adjust length */
- if (_PyUnicode_Resize(&unicode, p - unicode->str) < 0)
+ if (unicode_resize(&unicode, outpos) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)unicode;
+ return unicode_result(unicode);
onError:
Py_DECREF(unicode);
@@ -3262,19 +5078,16 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
}
PyObject *
-PyUnicode_EncodeUTF32(const Py_UNICODE *s,
- Py_ssize_t size,
- const char *errors,
- int byteorder)
+_PyUnicode_EncodeUTF32(PyObject *str,
+ const char *errors,
+ int byteorder)
{
+ int kind;
+ void *data;
+ Py_ssize_t len;
PyObject *v;
unsigned char *p;
- Py_ssize_t nsize, bytesize;
-#ifndef Py_UNICODE_WIDE
- Py_ssize_t i, pairs;
-#else
- const int pairs = 0;
-#endif
+ Py_ssize_t nsize, i;
/* Offsets from p for storing byte pairs in the right order. */
#ifdef BYTEORDER_IS_LITTLE_ENDIAN
int iorder[] = {0, 1, 2, 3};
@@ -3291,26 +5104,27 @@ PyUnicode_EncodeUTF32(const Py_UNICODE *s,
p += 4; \
} while(0)
- /* In narrow builds we can output surrogate pairs as one codepoint,
- so we need less space. */
-#ifndef Py_UNICODE_WIDE
- for (i = pairs = 0; i < size-1; i++)
- if (0xD800 <= s[i] && s[i] <= 0xDBFF &&
- 0xDC00 <= s[i+1] && s[i+1] <= 0xDFFF)
- pairs++;
-#endif
- nsize = (size - pairs + (byteorder == 0));
- bytesize = nsize * 4;
- if (bytesize / 4 != nsize)
+ if (!PyUnicode_Check(str)) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ if (PyUnicode_READY(str) == -1)
+ return NULL;
+ kind = PyUnicode_KIND(str);
+ data = PyUnicode_DATA(str);
+ len = PyUnicode_GET_LENGTH(str);
+
+ nsize = len + (byteorder == 0);
+ if (nsize > PY_SSIZE_T_MAX / 4)
return PyErr_NoMemory();
- v = PyBytes_FromStringAndSize(NULL, bytesize);
+ v = PyBytes_FromStringAndSize(NULL, nsize * 4);
if (v == NULL)
return NULL;
p = (unsigned char *)PyBytes_AS_STRING(v);
if (byteorder == 0)
STORECHAR(0xFEFF);
- if (size == 0)
+ if (len == 0)
goto done;
if (byteorder == -1) {
@@ -3328,36 +5142,33 @@ PyUnicode_EncodeUTF32(const Py_UNICODE *s,
iorder[3] = 0;
}
- while (size-- > 0) {
- Py_UCS4 ch = *s++;
-#ifndef Py_UNICODE_WIDE
- if (0xD800 <= ch && ch <= 0xDBFF && size > 0) {
- Py_UCS4 ch2 = *s;
- if (0xDC00 <= ch2 && ch2 <= 0xDFFF) {
- ch = (((ch & 0x3FF)<<10) | (ch2 & 0x3FF)) + 0x10000;
- s++;
- size--;
- }
- }
-#endif
- STORECHAR(ch);
- }
+ for (i = 0; i < len; i++)
+ STORECHAR(PyUnicode_READ(kind, data, i));
done:
return v;
#undef STORECHAR
}
-PyObject *PyUnicode_AsUTF32String(PyObject *unicode)
+PyObject *
+PyUnicode_EncodeUTF32(const Py_UNICODE *s,
+ Py_ssize_t size,
+ const char *errors,
+ int byteorder)
{
- if (!PyUnicode_Check(unicode)) {
- PyErr_BadArgument();
+ PyObject *result;
+ PyObject *tmp = PyUnicode_FromUnicode(s, size);
+ if (tmp == NULL)
return NULL;
- }
- return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL,
- 0);
+ result = _PyUnicode_EncodeUTF32(tmp, errors, byteorder);
+ Py_DECREF(tmp);
+ return result;
+}
+
+PyObject *
+PyUnicode_AsUTF32String(PyObject *unicode)
+{
+ return _PyUnicode_EncodeUTF32(unicode, NULL, 0);
}
/* --- UTF-16 Codec ------------------------------------------------------- */
@@ -3371,23 +5182,6 @@ PyUnicode_DecodeUTF16(const char *s,
return PyUnicode_DecodeUTF16Stateful(s, size, errors, byteorder, NULL);
}
-/* Two masks for fast checking of whether a C 'long' may contain
- UTF16-encoded surrogate characters. This is an efficient heuristic,
- assuming that non-surrogate characters with a code point >= 0x8000 are
- rare in most input.
- FAST_CHAR_MASK is used when the input is in native byte ordering,
- SWAPPED_FAST_CHAR_MASK when the input is in byteswapped ordering.
-*/
-#if (SIZEOF_LONG == 8)
-# define FAST_CHAR_MASK 0x8000800080008000L
-# define SWAPPED_FAST_CHAR_MASK 0x0080008000800080L
-#elif (SIZEOF_LONG == 4)
-# define FAST_CHAR_MASK 0x80008000L
-# define SWAPPED_FAST_CHAR_MASK 0x00800080L
-#else
-# error C 'long' size should be either 4 or 8!
-#endif
-
PyObject *
PyUnicode_DecodeUTF16Stateful(const char *s,
Py_ssize_t size,
@@ -3399,31 +5193,14 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
- PyUnicodeObject *unicode;
- Py_UNICODE *p;
- const unsigned char *q, *e, *aligned_end;
+ PyObject *unicode;
+ const unsigned char *q, *e;
int bo = 0; /* assume native ordering by default */
- int native_ordering = 0;
+ int native_ordering;
const char *errmsg = "";
- /* Offsets from q for retrieving byte pairs in the right order. */
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- int ihi = 1, ilo = 0;
-#else
- int ihi = 0, ilo = 1;
-#endif
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- /* Note: size will always be longer than the resulting Unicode
- character count */
- unicode = _PyUnicode_New(size);
- if (!unicode)
- return NULL;
- if (size == 0)
- return (PyObject *)unicode;
-
- /* Unpack UTF-16 encoded data */
- p = unicode->str;
q = (unsigned char *)s;
e = q + size;
@@ -3434,176 +5211,98 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
byte order setting accordingly. In native mode, the leading BOM
mark is skipped, in all other modes, it is copied to the output
stream as-is (giving a ZWNBSP character). */
- if (bo == 0) {
- if (size >= 2) {
- const Py_UNICODE bom = (q[ihi] << 8) | q[ilo];
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- if (bom == 0xFEFF) {
- q += 2;
- bo = -1;
- }
- else if (bom == 0xFFFE) {
- q += 2;
- bo = 1;
- }
-#else
- if (bom == 0xFEFF) {
- q += 2;
- bo = 1;
- }
- else if (bom == 0xFFFE) {
- q += 2;
- bo = -1;
- }
-#endif
+ if (bo == 0 && size >= 2) {
+ const Py_UCS4 bom = (q[1] << 8) | q[0];
+ if (bom == 0xFEFF) {
+ q += 2;
+ bo = -1;
+ }
+ else if (bom == 0xFFFE) {
+ q += 2;
+ bo = 1;
}
+ if (byteorder)
+ *byteorder = bo;
}
- if (bo == -1) {
- /* force LE */
- ihi = 1;
- ilo = 0;
- }
- else if (bo == 1) {
- /* force BE */
- ihi = 0;
- ilo = 1;
+ if (q == e) {
+ if (consumed)
+ *consumed = size;
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
+
#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- native_ordering = ilo < ihi;
+ native_ordering = bo <= 0;
#else
- native_ordering = ilo > ihi;
+ native_ordering = bo >= 0;
#endif
- aligned_end = (const unsigned char *) ((size_t) e & ~LONG_PTR_MASK);
+ /* Note: size will always be longer than the resulting Unicode
+ character count */
+ unicode = PyUnicode_New((e - q + 1) / 2, 127);
+ if (!unicode)
+ return NULL;
+
+ outpos = 0;
while (1) {
- Py_UNICODE ch;
- if (e - q < 2) {
+ Py_UCS4 ch = 0;
+ if (e - q >= 2) {
+ int kind = PyUnicode_KIND(unicode);
+ if (kind == PyUnicode_1BYTE_KIND) {
+ if (PyUnicode_IS_ASCII(unicode))
+ ch = asciilib_utf16_decode(&q, e,
+ PyUnicode_1BYTE_DATA(unicode), &outpos,
+ native_ordering);
+ else
+ ch = ucs1lib_utf16_decode(&q, e,
+ PyUnicode_1BYTE_DATA(unicode), &outpos,
+ native_ordering);
+ } else if (kind == PyUnicode_2BYTE_KIND) {
+ ch = ucs2lib_utf16_decode(&q, e,
+ PyUnicode_2BYTE_DATA(unicode), &outpos,
+ native_ordering);
+ } else {
+ assert(kind == PyUnicode_4BYTE_KIND);
+ ch = ucs4lib_utf16_decode(&q, e,
+ PyUnicode_4BYTE_DATA(unicode), &outpos,
+ native_ordering);
+ }
+ }
+
+ switch (ch)
+ {
+ case 0:
/* remaining byte at the end? (size should be even) */
if (q == e || consumed)
- break;
+ goto End;
errmsg = "truncated data";
startinpos = ((const char *)q) - starts;
endinpos = ((const char *)e) - starts;
- outpos = p - PyUnicode_AS_UNICODE(unicode);
- goto utf16Error;
+ break;
/* The remaining input chars are ignored if the callback
chooses to skip the input */
- }
- /* First check for possible aligned read of a C 'long'. Unaligned
- reads are more expensive, better to defer to another iteration. */
- if (!((size_t) q & LONG_PTR_MASK)) {
- /* Fast path for runs of non-surrogate chars. */
- register const unsigned char *_q = q;
- Py_UNICODE *_p = p;
- if (native_ordering) {
- /* Native ordering is simple: as long as the input cannot
- possibly contain a surrogate char, do an unrolled copy
- of several 16-bit code points to the target object.
- The non-surrogate check is done on several input bytes
- at a time (as many as a C 'long' can contain). */
- while (_q < aligned_end) {
- unsigned long data = * (unsigned long *) _q;
- if (data & FAST_CHAR_MASK)
- break;
- _p[0] = ((unsigned short *) _q)[0];
- _p[1] = ((unsigned short *) _q)[1];
-#if (SIZEOF_LONG == 8)
- _p[2] = ((unsigned short *) _q)[2];
- _p[3] = ((unsigned short *) _q)[3];
-#endif
- _q += SIZEOF_LONG;
- _p += SIZEOF_LONG / 2;
- }
- }
- else {
- /* Byteswapped ordering is similar, but we must decompose
- the copy bytewise, and take care of zero'ing out the
- upper bytes if the target object is in 32-bit units
- (that is, in UCS-4 builds). */
- while (_q < aligned_end) {
- unsigned long data = * (unsigned long *) _q;
- if (data & SWAPPED_FAST_CHAR_MASK)
- break;
- /* Zero upper bytes in UCS-4 builds */
-#if (Py_UNICODE_SIZE > 2)
- _p[0] = 0;
- _p[1] = 0;
-#if (SIZEOF_LONG == 8)
- _p[2] = 0;
- _p[3] = 0;
-#endif
-#endif
- /* Issue #4916; UCS-4 builds on big endian machines must
- fill the two last bytes of each 4-byte unit. */
-#if (!defined(BYTEORDER_IS_LITTLE_ENDIAN) && Py_UNICODE_SIZE > 2)
-# define OFF 2
-#else
-# define OFF 0
-#endif
- ((unsigned char *) _p)[OFF + 1] = _q[0];
- ((unsigned char *) _p)[OFF + 0] = _q[1];
- ((unsigned char *) _p)[OFF + 1 + Py_UNICODE_SIZE] = _q[2];
- ((unsigned char *) _p)[OFF + 0 + Py_UNICODE_SIZE] = _q[3];
-#if (SIZEOF_LONG == 8)
- ((unsigned char *) _p)[OFF + 1 + 2 * Py_UNICODE_SIZE] = _q[4];
- ((unsigned char *) _p)[OFF + 0 + 2 * Py_UNICODE_SIZE] = _q[5];
- ((unsigned char *) _p)[OFF + 1 + 3 * Py_UNICODE_SIZE] = _q[6];
- ((unsigned char *) _p)[OFF + 0 + 3 * Py_UNICODE_SIZE] = _q[7];
-#endif
-#undef OFF
- _q += SIZEOF_LONG;
- _p += SIZEOF_LONG / 2;
- }
- }
- p = _p;
- q = _q;
- if (e - q < 2)
- continue;
- }
- ch = (q[ihi] << 8) | q[ilo];
-
- q += 2;
-
- if (ch < 0xD800 || ch > 0xDFFF) {
- *p++ = ch;
- continue;
- }
-
- /* UTF-16 code pair: */
- if (e - q < 2) {
+ case 1:
errmsg = "unexpected end of data";
- startinpos = (((const char *)q) - 2) - starts;
+ startinpos = ((const char *)q) - 2 - starts;
endinpos = ((const char *)e) - starts;
- goto utf16Error;
- }
- if (0xD800 <= ch && ch <= 0xDBFF) {
- Py_UNICODE ch2 = (q[ihi] << 8) | q[ilo];
- q += 2;
- if (0xDC00 <= ch2 && ch2 <= 0xDFFF) {
-#ifndef Py_UNICODE_WIDE
- *p++ = ch;
- *p++ = ch2;
-#else
- *p++ = (((ch & 0x3FF)<<10) | (ch2 & 0x3FF)) + 0x10000;
-#endif
- continue;
- }
- else {
- errmsg = "illegal UTF-16 surrogate";
- startinpos = (((const char *)q)-4)-starts;
- endinpos = startinpos+2;
- goto utf16Error;
- }
-
+ break;
+ case 2:
+ errmsg = "illegal encoding";
+ startinpos = ((const char *)q) - 2 - starts;
+ endinpos = startinpos + 2;
+ break;
+ case 3:
+ errmsg = "illegal UTF-16 surrogate";
+ startinpos = ((const char *)q) - 4 - starts;
+ endinpos = startinpos + 2;
+ break;
+ default:
+ if (unicode_putchar(&unicode, &outpos, ch) < 0)
+ goto onError;
+ continue;
}
- errmsg = "illegal encoding";
- startinpos = (((const char *)q)-2)-starts;
- endinpos = startinpos+2;
- /* Fall through to report the error */
- utf16Error:
- outpos = p - PyUnicode_AS_UNICODE(unicode);
if (unicode_decode_call_errorhandler(
errors,
&errorHandler,
@@ -3615,27 +5314,21 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
&exc,
(const char **)&q,
&unicode,
- &outpos,
- &p))
+ &outpos))
goto onError;
- /* Update data because unicode_decode_call_errorhandler might have
- changed the input object. */
- aligned_end = (const unsigned char *) ((size_t) e & ~LONG_PTR_MASK);
}
- if (byteorder)
- *byteorder = bo;
-
+End:
if (consumed)
*consumed = (const char *)q-starts;
/* Adjust length */
- if (_PyUnicode_Resize(&unicode, p - unicode->str) < 0)
+ if (unicode_resize(&unicode, outpos) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)unicode;
+ return unicode_result(unicode);
onError:
Py_DECREF(unicode);
@@ -3644,145 +5337,219 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
return NULL;
}
-#undef FAST_CHAR_MASK
-#undef SWAPPED_FAST_CHAR_MASK
-
PyObject *
-PyUnicode_EncodeUTF16(const Py_UNICODE *s,
- Py_ssize_t size,
- const char *errors,
- int byteorder)
+_PyUnicode_EncodeUTF16(PyObject *str,
+ const char *errors,
+ int byteorder)
{
+ enum PyUnicode_Kind kind;
+ const void *data;
+ Py_ssize_t len;
PyObject *v;
- unsigned char *p;
- Py_ssize_t nsize, bytesize;
-#ifdef Py_UNICODE_WIDE
- Py_ssize_t i, pairs;
-#else
- const int pairs = 0;
-#endif
- /* Offsets from p for storing byte pairs in the right order. */
-#ifdef BYTEORDER_IS_LITTLE_ENDIAN
- int ihi = 1, ilo = 0;
+ unsigned short *out;
+ Py_ssize_t bytesize;
+ Py_ssize_t pairs;
+#ifdef WORDS_BIGENDIAN
+ int native_ordering = byteorder >= 0;
#else
- int ihi = 0, ilo = 1;
+ int native_ordering = byteorder <= 0;
#endif
-#define STORECHAR(CH) \
- do { \
- p[ihi] = ((CH) >> 8) & 0xff; \
- p[ilo] = (CH) & 0xff; \
- p += 2; \
- } while(0)
-
-#ifdef Py_UNICODE_WIDE
- for (i = pairs = 0; i < size; i++)
- if (s[i] >= 0x10000)
- pairs++;
-#endif
- /* 2 * (size + pairs + (byteorder == 0)) */
- if (size > PY_SSIZE_T_MAX ||
- size > PY_SSIZE_T_MAX - pairs - (byteorder == 0))
- return PyErr_NoMemory();
- nsize = size + pairs + (byteorder == 0);
- bytesize = nsize * 2;
- if (bytesize / 2 != nsize)
+ if (!PyUnicode_Check(str)) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ if (PyUnicode_READY(str) == -1)
+ return NULL;
+ kind = PyUnicode_KIND(str);
+ data = PyUnicode_DATA(str);
+ len = PyUnicode_GET_LENGTH(str);
+
+ pairs = 0;
+ if (kind == PyUnicode_4BYTE_KIND) {
+ const Py_UCS4 *in = (const Py_UCS4 *)data;
+ const Py_UCS4 *end = in + len;
+ while (in < end)
+ if (*in++ >= 0x10000)
+ pairs++;
+ }
+ if (len > PY_SSIZE_T_MAX / 2 - pairs - (byteorder == 0))
return PyErr_NoMemory();
+ bytesize = (len + pairs + (byteorder == 0)) * 2;
v = PyBytes_FromStringAndSize(NULL, bytesize);
if (v == NULL)
return NULL;
- p = (unsigned char *)PyBytes_AS_STRING(v);
+ /* output buffer is 2-bytes aligned */
+ assert(_Py_IS_ALIGNED(PyBytes_AS_STRING(v), 2));
+ out = (unsigned short *)PyBytes_AS_STRING(v);
if (byteorder == 0)
- STORECHAR(0xFEFF);
- if (size == 0)
+ *out++ = 0xFEFF;
+ if (len == 0)
goto done;
- if (byteorder == -1) {
- /* force LE */
- ihi = 1;
- ilo = 0;
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND: {
+ ucs1lib_utf16_encode(out, (const Py_UCS1 *)data, len, native_ordering);
+ break;
}
- else if (byteorder == 1) {
- /* force BE */
- ihi = 0;
- ilo = 1;
+ case PyUnicode_2BYTE_KIND: {
+ ucs2lib_utf16_encode(out, (const Py_UCS2 *)data, len, native_ordering);
+ break;
}
-
- while (size-- > 0) {
- Py_UNICODE ch = *s++;
- Py_UNICODE ch2 = 0;
-#ifdef Py_UNICODE_WIDE
- if (ch >= 0x10000) {
- ch2 = 0xDC00 | ((ch-0x10000) & 0x3FF);
- ch = 0xD800 | ((ch-0x10000) >> 10);
- }
-#endif
- STORECHAR(ch);
- if (ch2)
- STORECHAR(ch2);
+ case PyUnicode_4BYTE_KIND: {
+ ucs4lib_utf16_encode(out, (const Py_UCS4 *)data, len, native_ordering);
+ break;
+ }
+ default:
+ assert(0);
}
done:
return v;
-#undef STORECHAR
}
-PyObject *PyUnicode_AsUTF16String(PyObject *unicode)
+PyObject *
+PyUnicode_EncodeUTF16(const Py_UNICODE *s,
+ Py_ssize_t size,
+ const char *errors,
+ int byteorder)
{
- if (!PyUnicode_Check(unicode)) {
- PyErr_BadArgument();
+ PyObject *result;
+ PyObject *tmp = PyUnicode_FromUnicode(s, size);
+ if (tmp == NULL)
return NULL;
- }
- return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL,
- 0);
+ result = _PyUnicode_EncodeUTF16(tmp, errors, byteorder);
+ Py_DECREF(tmp);
+ return result;
+}
+
+PyObject *
+PyUnicode_AsUTF16String(PyObject *unicode)
+{
+ return _PyUnicode_EncodeUTF16(unicode, NULL, 0);
}
/* --- Unicode Escape Codec ----------------------------------------------- */
+/* Helper function for PyUnicode_DecodeUnicodeEscape, determines
+ if all the escapes in the string make it still a valid ASCII string.
+ Returns -1 if any escapes were found which cause the string to
+ pop out of ASCII range. Otherwise returns the length of the
+ required buffer to hold the string.
+ */
+static Py_ssize_t
+length_of_escaped_ascii_string(const char *s, Py_ssize_t size)
+{
+ const unsigned char *p = (const unsigned char *)s;
+ const unsigned char *end = p + size;
+ Py_ssize_t length = 0;
+
+ if (size < 0)
+ return -1;
+
+ for (; p < end; ++p) {
+ if (*p > 127) {
+ /* Non-ASCII */
+ return -1;
+ }
+ else if (*p != '\\') {
+ /* Normal character */
+ ++length;
+ }
+ else {
+ /* Backslash-escape, check next char */
+ ++p;
+ /* Escape sequence reaches till end of string or
+ non-ASCII follow-up. */
+ if (p >= end || *p > 127)
+ return -1;
+ switch (*p) {
+ case '\n':
+ /* backslash + \n result in zero characters */
+ break;
+ case '\\': case '\'': case '\"':
+ case 'b': case 'f': case 't':
+ case 'n': case 'r': case 'v': case 'a':
+ ++length;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case 'x': case 'u': case 'U': case 'N':
+ /* these do not guarantee ASCII characters */
+ return -1;
+ default:
+ /* count the backslash + the other character */
+ length += 2;
+ }
+ }
+ }
+ return length;
+}
+
static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL;
-PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeUnicodeEscape(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
- Py_ssize_t outpos;
- int i;
- PyUnicodeObject *v;
- Py_UNICODE *p;
+ int j;
+ PyObject *v;
const char *end;
char* message;
Py_UCS4 chr = 0xffffffff; /* in case 'getcode' messes up */
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
+ Py_ssize_t len;
+ Py_ssize_t i;
- /* Escaped strings will always be longer than the resulting
- Unicode string, so we start with size here and then reduce the
- length after conversion to the true value.
- (but if the error callback returns a long replacement string
- we'll have to allocate more space) */
- v = _PyUnicode_New(size);
- if (v == NULL)
- goto onError;
- if (size == 0)
- return (PyObject *)v;
+ len = length_of_escaped_ascii_string(s, size);
+
+ /* After length_of_escaped_ascii_string() there are two alternatives,
+ either the string is pure ASCII with named escapes like \n, etc.
+ and we determined it's exact size (common case)
+ or it contains \x, \u, ... escape sequences. then we create a
+ legacy wchar string and resize it at the end of this function. */
+ if (len >= 0) {
+ v = PyUnicode_New(len, 127);
+ if (!v)
+ goto onError;
+ assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND);
+ }
+ else {
+ /* Escaped strings will always be longer than the resulting
+ Unicode string, so we start with size here and then reduce the
+ length after conversion to the true value.
+ (but if the error callback returns a long replacement string
+ we'll have to allocate more space) */
+ v = PyUnicode_New(size, 127);
+ if (!v)
+ goto onError;
+ len = size;
+ }
- p = PyUnicode_AS_UNICODE(v);
+ if (size == 0)
+ return v;
+ i = 0;
end = s + size;
while (s < end) {
unsigned char c;
- Py_UNICODE x;
+ Py_UCS4 x;
int digits;
+ /* The only case in which i == ascii_length is a backslash
+ followed by a newline. */
+ assert(i <= len);
+
/* Non-escape characters are interpreted as Unicode ordinals */
if (*s != '\\') {
- *p++ = (unsigned char) *s++;
+ if (unicode_putchar(&v, &i, (unsigned char) *s++) < 0)
+ goto onError;
continue;
}
@@ -3792,20 +5559,34 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
c = *s++;
if (s > end)
c = '\0'; /* Invalid after \ */
+
+ /* The only case in which i == ascii_length is a backslash
+ followed by a newline. */
+ assert(i < len || (i == len && c == '\n'));
+
switch (c) {
/* \x escapes */
+#define WRITECHAR(ch) \
+ do { \
+ if (unicode_putchar(&v, &i, ch) < 0) \
+ goto onError; \
+ }while(0)
+
case '\n': break;
- case '\\': *p++ = '\\'; break;
- case '\'': *p++ = '\''; break;
- case '\"': *p++ = '\"'; break;
- case 'b': *p++ = '\b'; break;
- case 'f': *p++ = '\014'; break; /* FF */
- case 't': *p++ = '\t'; break;
- case 'n': *p++ = '\n'; break;
- case 'r': *p++ = '\r'; break;
- case 'v': *p++ = '\013'; break; /* VT */
- case 'a': *p++ = '\007'; break; /* BEL, not classic C */
+ case '\\': WRITECHAR('\\'); break;
+ case '\'': WRITECHAR('\''); break;
+ case '\"': WRITECHAR('\"'); break;
+ case 'b': WRITECHAR('\b'); break;
+ /* FF */
+ case 'f': WRITECHAR('\014'); break;
+ case 't': WRITECHAR('\t'); break;
+ case 'n': WRITECHAR('\n'); break;
+ case 'r': WRITECHAR('\r'); break;
+ /* VT */
+ case 'v': WRITECHAR('\013'); break;
+ /* BEL, not classic C */
+ case 'a': WRITECHAR('\007'); break;
/* \OOO (octal) escapes */
case '0': case '1': case '2': case '3':
@@ -3816,7 +5597,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
if (s < end && '0' <= *s && *s <= '7')
x = (x<<3) + *s++ - '0';
}
- *p++ = x;
+ WRITECHAR(x);
break;
/* hex escapes */
@@ -3838,27 +5619,27 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
message = "truncated \\UXXXXXXXX escape";
hexescape:
chr = 0;
- outpos = p-PyUnicode_AS_UNICODE(v);
if (s+digits>end) {
endinpos = size;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicodeescape", "end of string in escape sequence",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &i))
goto onError;
goto nextByte;
}
- for (i = 0; i < digits; ++i) {
- c = (unsigned char) s[i];
+ for (j = 0; j < digits; ++j) {
+ c = (unsigned char) s[j];
if (!Py_ISXDIGIT(c)) {
- endinpos = (s+i+1)-starts;
+ endinpos = (s+j+1)-starts;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicodeescape", message,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &i))
goto onError;
+ len = PyUnicode_GET_LENGTH(v);
goto nextByte;
}
chr = (chr<<4) & ~0xF;
@@ -3869,34 +5650,22 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
else
chr += 10 + c - 'A';
}
- s += i;
+ s += j;
if (chr == 0xffffffff && PyErr_Occurred())
/* _decoding_error will have already written into the
target buffer. */
break;
store:
/* when we get here, chr is a 32-bit unicode character */
- if (chr <= 0xffff)
- /* UCS-2 character */
- *p++ = (Py_UNICODE) chr;
- else if (chr <= 0x10ffff) {
- /* UCS-4 character. Either store directly, or as
- surrogate pair. */
-#ifdef Py_UNICODE_WIDE
- *p++ = chr;
-#else
- chr -= 0x10000L;
- *p++ = 0xD800 + (Py_UNICODE) (chr >> 10);
- *p++ = 0xDC00 + (Py_UNICODE) (chr & 0x03FF);
-#endif
+ if (chr <= MAX_UNICODE) {
+ WRITECHAR(chr);
} else {
endinpos = s-starts;
- outpos = p-PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicodeescape", "illegal Unicode character",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &i))
goto onError;
}
break;
@@ -3906,7 +5675,8 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
message = "malformed \\N character escape";
if (ucnhash_CAPI == NULL) {
/* load the unicode data module */
- ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import(PyUnicodeData_CAPSULE_NAME, 1);
+ ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import(
+ PyUnicodeData_CAPSULE_NAME, 1);
if (ucnhash_CAPI == NULL)
goto ucnhashError;
}
@@ -3919,17 +5689,17 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
/* found a name. look it up in the unicode database */
message = "unknown Unicode character name";
s++;
- if (ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1), &chr))
+ if (ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1),
+ &chr, 0))
goto store;
}
}
endinpos = s-starts;
- outpos = p-PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicodeescape", message,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &i))
goto onError;
break;
@@ -3938,28 +5708,29 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
message = "\\ at end of string";
s--;
endinpos = s-starts;
- outpos = p-PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicodeescape", message,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &i))
goto onError;
}
else {
- *p++ = '\\';
- *p++ = (unsigned char)s[-1];
+ WRITECHAR('\\');
+ WRITECHAR(s[-1]);
}
break;
}
nextByte:
;
}
- if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0)
+#undef WRITECHAR
+
+ if (unicode_resize(&v, i) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)v;
+ return unicode_result(v);
ucnhashError:
PyErr_SetString(
@@ -3985,70 +5756,56 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
*/
-Py_LOCAL_INLINE(const Py_UNICODE *) findchar(const Py_UNICODE *s,
- Py_ssize_t size,
- Py_UNICODE ch)
-{
- /* like wcschr, but doesn't stop at NULL characters */
-
- while (size-- > 0) {
- if (*s == ch)
- return s;
- s++;
- }
-
- return NULL;
-}
-
-static const char *hexdigits = "0123456789abcdef";
-
-PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s,
- Py_ssize_t size)
+PyObject *
+PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
{
+ Py_ssize_t i, len;
PyObject *repr;
char *p;
+ int kind;
+ void *data;
+ Py_ssize_t expandsize = 0;
-#ifdef Py_UNICODE_WIDE
- const Py_ssize_t expandsize = 10;
-#else
- const Py_ssize_t expandsize = 6;
-#endif
-
- /* XXX(nnorwitz): rather than over-allocating, it would be
- better to choose a different scheme. Perhaps scan the
- first N-chars of the string and allocate based on that size.
- */
- /* Initial allocation is based on the longest-possible unichr
+ /* Initial allocation is based on the longest-possible character
escape.
- In wide (UTF-32) builds '\U00xxxxxx' is 10 chars per source
- unichr, so in this case it's the longest unichr escape. In
- narrow (UTF-16) builds this is five chars per source unichr
- since there are two unichrs in the surrogate pair, so in narrow
- (UTF-16) builds it's not the longest unichr escape.
-
- In wide or narrow builds '\uxxxx' is 6 chars per source unichr,
- so in the narrow (UTF-16) build case it's the longest unichr
- escape.
+ For UCS1 strings it's '\xxx', 4 bytes per source character.
+ For UCS2 strings it's '\uxxxx', 6 bytes per source character.
+ For UCS4 strings it's '\U00xxxxxx', 10 bytes per source character.
*/
- if (size == 0)
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ len = PyUnicode_GET_LENGTH(unicode);
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND: expandsize = 4; break;
+ case PyUnicode_2BYTE_KIND: expandsize = 6; break;
+ case PyUnicode_4BYTE_KIND: expandsize = 10; break;
+ }
+
+ if (len == 0)
return PyBytes_FromStringAndSize(NULL, 0);
- if (size > (PY_SSIZE_T_MAX - 2 - 1) / expandsize)
+ if (len > (PY_SSIZE_T_MAX - 2 - 1) / expandsize)
return PyErr_NoMemory();
repr = PyBytes_FromStringAndSize(NULL,
2
- + expandsize*size
+ + expandsize*len
+ 1);
if (repr == NULL)
return NULL;
p = PyBytes_AS_STRING(repr);
- while (size-- > 0) {
- Py_UNICODE ch = *s++;
+ for (i = 0; i < len; i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
/* Escape backslashes */
if (ch == '\\') {
@@ -4057,57 +5814,30 @@ PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s,
continue;
}
-#ifdef Py_UNICODE_WIDE
/* Map 21-bit characters to '\U00xxxxxx' */
else if (ch >= 0x10000) {
+ assert(ch <= MAX_UNICODE);
*p++ = '\\';
*p++ = 'U';
- *p++ = hexdigits[(ch >> 28) & 0x0000000F];
- *p++ = hexdigits[(ch >> 24) & 0x0000000F];
- *p++ = hexdigits[(ch >> 20) & 0x0000000F];
- *p++ = hexdigits[(ch >> 16) & 0x0000000F];
- *p++ = hexdigits[(ch >> 12) & 0x0000000F];
- *p++ = hexdigits[(ch >> 8) & 0x0000000F];
- *p++ = hexdigits[(ch >> 4) & 0x0000000F];
- *p++ = hexdigits[ch & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 28) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 24) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 20) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 16) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 12) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 8) & 0x0000000F];
+ *p++ = Py_hexdigits[(ch >> 4) & 0x0000000F];
+ *p++ = Py_hexdigits[ch & 0x0000000F];
continue;
}
-#else
- /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
- else if (ch >= 0xD800 && ch < 0xDC00) {
- Py_UNICODE ch2;
- Py_UCS4 ucs;
-
- ch2 = *s++;
- size--;
- if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
- ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
- *p++ = '\\';
- *p++ = 'U';
- *p++ = hexdigits[(ucs >> 28) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 24) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 20) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 16) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 12) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 8) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 4) & 0x0000000F];
- *p++ = hexdigits[ucs & 0x0000000F];
- continue;
- }
- /* Fall through: isolated surrogates are copied as-is */
- s--;
- size++;
- }
-#endif
/* Map 16-bit characters to '\uxxxx' */
if (ch >= 256) {
*p++ = '\\';
*p++ = 'u';
- *p++ = hexdigits[(ch >> 12) & 0x000F];
- *p++ = hexdigits[(ch >> 8) & 0x000F];
- *p++ = hexdigits[(ch >> 4) & 0x000F];
- *p++ = hexdigits[ch & 0x000F];
+ *p++ = Py_hexdigits[(ch >> 12) & 0x000F];
+ *p++ = Py_hexdigits[(ch >> 8) & 0x000F];
+ *p++ = Py_hexdigits[(ch >> 4) & 0x000F];
+ *p++ = Py_hexdigits[ch & 0x000F];
}
/* Map special whitespace to '\t', \n', '\r' */
@@ -4128,8 +5858,8 @@ PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s,
else if (ch < ' ' || ch >= 0x7F) {
*p++ = '\\';
*p++ = 'x';
- *p++ = hexdigits[(ch >> 4) & 0x000F];
- *p++ = hexdigits[ch & 0x000F];
+ *p++ = Py_hexdigits[(ch >> 4) & 0x000F];
+ *p++ = Py_hexdigits[ch & 0x000F];
}
/* Copy everything else as-is */
@@ -4143,30 +5873,31 @@ PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s,
return repr;
}
-PyObject *PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
+PyObject *
+PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s,
+ Py_ssize_t size)
{
- PyObject *s;
- if (!PyUnicode_Check(unicode)) {
- PyErr_BadArgument();
+ PyObject *result;
+ PyObject *tmp = PyUnicode_FromUnicode(s, size);
+ if (tmp == NULL)
return NULL;
- }
- s = PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode));
- return s;
+ result = PyUnicode_AsUnicodeEscapeString(tmp);
+ Py_DECREF(tmp);
+ return result;
}
/* --- Raw Unicode Escape Codec ------------------------------------------- */
-PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeRawUnicodeEscape(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
- PyUnicodeObject *v;
- Py_UNICODE *p;
+ PyObject *v;
const char *end;
const char *bs;
PyObject *errorHandler = NULL;
@@ -4176,12 +5907,12 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
Unicode string, so we start with size here and then reduce the
length after conversion to the true value. (But decoding error
handler might have to resize the string) */
- v = _PyUnicode_New(size);
+ v = PyUnicode_New(size, 127);
if (v == NULL)
goto onError;
if (size == 0)
- return (PyObject *)v;
- p = PyUnicode_AS_UNICODE(v);
+ return v;
+ outpos = 0;
end = s + size;
while (s < end) {
unsigned char c;
@@ -4191,7 +5922,8 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
/* Non-escape characters are interpreted as Unicode ordinals */
if (*s != '\\') {
- *p++ = (unsigned char)*s++;
+ if (unicode_putchar(&v, &outpos, (unsigned char)*s++) < 0)
+ goto onError;
continue;
}
startinpos = s-starts;
@@ -4202,19 +5934,19 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
for (;s < end;) {
if (*s != '\\')
break;
- *p++ = (unsigned char)*s++;
+ if (unicode_putchar(&v, &outpos, (unsigned char)*s++) < 0)
+ goto onError;
}
if (((s - bs) & 1) == 0 ||
s >= end ||
(*s != 'u' && *s != 'U')) {
continue;
}
- p--;
+ outpos--;
count = *s=='u' ? 4 : 8;
s++;
/* \uXXXX with 4 hex digits, \Uxxxxxxxx with 8 */
- outpos = p-PyUnicode_AS_UNICODE(v);
for (x = 0, i = 0; i < count; ++i, ++s) {
c = (unsigned char)*s;
if (!Py_ISXDIGIT(c)) {
@@ -4223,7 +5955,7 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
errors, &errorHandler,
"rawunicodeescape", "truncated \\uXXXX",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &outpos))
goto onError;
goto nextByte;
}
@@ -4235,37 +5967,26 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
else
x += 10 + c - 'A';
}
- if (x <= 0xffff)
- /* UCS-2 character */
- *p++ = (Py_UNICODE) x;
- else if (x <= 0x10ffff) {
- /* UCS-4 character. Either store directly, or as
- surrogate pair. */
-#ifdef Py_UNICODE_WIDE
- *p++ = (Py_UNICODE) x;
-#else
- x -= 0x10000L;
- *p++ = 0xD800 + (Py_UNICODE) (x >> 10);
- *p++ = 0xDC00 + (Py_UNICODE) (x & 0x03FF);
-#endif
+ if (x <= MAX_UNICODE) {
+ if (unicode_putchar(&v, &outpos, x) < 0)
+ goto onError;
} else {
endinpos = s-starts;
- outpos = p-PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"rawunicodeescape", "\\Uxxxxxxxx out of range",
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &v, &outpos))
goto onError;
}
nextByte:
;
}
- if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0)
+ if (unicode_resize(&v, outpos) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)v;
+ return unicode_result(v);
onError:
Py_XDECREF(v);
@@ -4274,144 +5995,139 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
return NULL;
}
-PyObject *PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s,
- Py_ssize_t size)
+
+PyObject *
+PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
{
PyObject *repr;
char *p;
char *q;
+ Py_ssize_t expandsize, pos;
+ int kind;
+ void *data;
+ Py_ssize_t len;
-#ifdef Py_UNICODE_WIDE
- const Py_ssize_t expandsize = 10;
-#else
- const Py_ssize_t expandsize = 6;
-#endif
-
- if (size > PY_SSIZE_T_MAX / expandsize)
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
+ len = PyUnicode_GET_LENGTH(unicode);
+ /* 4 byte characters can take up 10 bytes, 2 byte characters can take up 6
+ bytes, and 1 byte characters 4. */
+ expandsize = kind * 2 + 2;
+
+ if (len > PY_SSIZE_T_MAX / expandsize)
return PyErr_NoMemory();
- repr = PyBytes_FromStringAndSize(NULL, expandsize * size);
+ repr = PyBytes_FromStringAndSize(NULL, expandsize * len);
if (repr == NULL)
return NULL;
- if (size == 0)
+ if (len == 0)
return repr;
p = q = PyBytes_AS_STRING(repr);
- while (size-- > 0) {
- Py_UNICODE ch = *s++;
-#ifdef Py_UNICODE_WIDE
+ for (pos = 0; pos < len; pos++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, pos);
/* Map 32-bit characters to '\Uxxxxxxxx' */
if (ch >= 0x10000) {
+ assert(ch <= MAX_UNICODE);
*p++ = '\\';
*p++ = 'U';
- *p++ = hexdigits[(ch >> 28) & 0xf];
- *p++ = hexdigits[(ch >> 24) & 0xf];
- *p++ = hexdigits[(ch >> 20) & 0xf];
- *p++ = hexdigits[(ch >> 16) & 0xf];
- *p++ = hexdigits[(ch >> 12) & 0xf];
- *p++ = hexdigits[(ch >> 8) & 0xf];
- *p++ = hexdigits[(ch >> 4) & 0xf];
- *p++ = hexdigits[ch & 15];
+ *p++ = Py_hexdigits[(ch >> 28) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 24) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 20) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 16) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 12) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 8) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 4) & 0xf];
+ *p++ = Py_hexdigits[ch & 15];
}
- else
-#else
- /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */
- if (ch >= 0xD800 && ch < 0xDC00) {
- Py_UNICODE ch2;
- Py_UCS4 ucs;
-
- ch2 = *s++;
- size--;
- if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {
- ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;
- *p++ = '\\';
- *p++ = 'U';
- *p++ = hexdigits[(ucs >> 28) & 0xf];
- *p++ = hexdigits[(ucs >> 24) & 0xf];
- *p++ = hexdigits[(ucs >> 20) & 0xf];
- *p++ = hexdigits[(ucs >> 16) & 0xf];
- *p++ = hexdigits[(ucs >> 12) & 0xf];
- *p++ = hexdigits[(ucs >> 8) & 0xf];
- *p++ = hexdigits[(ucs >> 4) & 0xf];
- *p++ = hexdigits[ucs & 0xf];
- continue;
- }
- /* Fall through: isolated surrogates are copied as-is */
- s--;
- size++;
- }
-#endif
/* Map 16-bit characters to '\uxxxx' */
- if (ch >= 256) {
+ else if (ch >= 256) {
*p++ = '\\';
*p++ = 'u';
- *p++ = hexdigits[(ch >> 12) & 0xf];
- *p++ = hexdigits[(ch >> 8) & 0xf];
- *p++ = hexdigits[(ch >> 4) & 0xf];
- *p++ = hexdigits[ch & 15];
+ *p++ = Py_hexdigits[(ch >> 12) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 8) & 0xf];
+ *p++ = Py_hexdigits[(ch >> 4) & 0xf];
+ *p++ = Py_hexdigits[ch & 15];
}
/* Copy everything else as-is */
else
*p++ = (char) ch;
}
- size = p - q;
- assert(size > 0);
- if (_PyBytes_Resize(&repr, size) < 0)
+ assert(p > q);
+ if (_PyBytes_Resize(&repr, p - q) < 0)
return NULL;
return repr;
}
-PyObject *PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
+PyObject *
+PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s,
+ Py_ssize_t size)
{
- PyObject *s;
- if (!PyUnicode_Check(unicode)) {
- PyErr_BadArgument();
+ PyObject *result;
+ PyObject *tmp = PyUnicode_FromUnicode(s, size);
+ if (tmp == NULL)
return NULL;
- }
- s = PyUnicode_EncodeRawUnicodeEscape(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode));
-
- return s;
+ result = PyUnicode_AsRawUnicodeEscapeString(tmp);
+ Py_DECREF(tmp);
+ return result;
}
/* --- Unicode Internal Codec ------------------------------------------- */
-PyObject *_PyUnicode_DecodeUnicodeInternal(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+_PyUnicode_DecodeUnicodeInternal(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
- PyUnicodeObject *v;
- Py_UNICODE *p;
+ PyObject *v;
const char *end;
const char *reason;
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
-#ifdef Py_UNICODE_WIDE
- Py_UNICODE unimax = PyUnicode_GetMax();
-#endif
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "unicode_internal codec has been deprecated",
+ 1))
+ return NULL;
/* XXX overflow detection missing */
- v = _PyUnicode_New((size+Py_UNICODE_SIZE-1)/ Py_UNICODE_SIZE);
+ v = PyUnicode_New((size+Py_UNICODE_SIZE-1)/ Py_UNICODE_SIZE, 127);
if (v == NULL)
goto onError;
- if (PyUnicode_GetSize((PyObject *)v) == 0)
- return (PyObject *)v;
- p = PyUnicode_AS_UNICODE(v);
+ if (PyUnicode_GET_LENGTH(v) == 0)
+ return v;
+ outpos = 0;
end = s + size;
while (s < end) {
- memcpy(p, s, sizeof(Py_UNICODE));
+ Py_UNICODE uch;
+ Py_UCS4 ch;
+ /* We copy the raw representation one byte at a time because the
+ pointer may be unaligned (see test_codeccallbacks). */
+ ((char *) &uch)[0] = s[0];
+ ((char *) &uch)[1] = s[1];
+#ifdef Py_UNICODE_WIDE
+ ((char *) &uch)[2] = s[2];
+ ((char *) &uch)[3] = s[3];
+#endif
+ ch = uch;
+
/* We have to sanity check the raw data, otherwise doom looms for
some malformed UCS-4 data. */
if (
#ifdef Py_UNICODE_WIDE
- *p > unimax || *p < 0 ||
+ ch > 0x10ffff ||
#endif
end-s < Py_UNICODE_SIZE
)
@@ -4425,26 +6141,39 @@ PyObject *_PyUnicode_DecodeUnicodeInternal(const char *s,
endinpos = s - starts + Py_UNICODE_SIZE;
reason = "illegal code point (> 0x10FFFF)";
}
- outpos = p - PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"unicode_internal", reason,
&starts, &end, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p)) {
+ &v, &outpos))
goto onError;
- }
+ continue;
}
- else {
- p++;
- s += Py_UNICODE_SIZE;
+
+ s += Py_UNICODE_SIZE;
+#ifndef Py_UNICODE_WIDE
+ if (Py_UNICODE_IS_HIGH_SURROGATE(ch) && s < end)
+ {
+ Py_UNICODE uch2;
+ ((char *) &uch2)[0] = s[0];
+ ((char *) &uch2)[1] = s[1];
+ if (Py_UNICODE_IS_LOW_SURROGATE(uch2))
+ {
+ ch = Py_UNICODE_JOIN_SURROGATES(uch, uch2);
+ s += Py_UNICODE_SIZE;
+ }
}
+#endif
+
+ if (unicode_putchar(&v, &outpos, ch) < 0)
+ goto onError;
}
- if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0)
+ if (unicode_resize(&v, outpos) < 0)
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)v;
+ return unicode_result(v);
onError:
Py_XDECREF(v);
@@ -4455,57 +6184,27 @@ PyObject *_PyUnicode_DecodeUnicodeInternal(const char *s,
/* --- Latin-1 Codec ------------------------------------------------------ */
-PyObject *PyUnicode_DecodeLatin1(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeLatin1(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
- PyUnicodeObject *v;
- Py_UNICODE *p;
- const char *e, *unrolled_end;
-
/* Latin-1 is equivalent to the first 256 ordinals in Unicode. */
- if (size == 1) {
- Py_UNICODE r = *(unsigned char*)s;
- return PyUnicode_FromUnicode(&r, 1);
- }
-
- v = _PyUnicode_New(size);
- if (v == NULL)
- goto onError;
- if (size == 0)
- return (PyObject *)v;
- p = PyUnicode_AS_UNICODE(v);
- e = s + size;
- /* Unrolling the copy makes it much faster by reducing the looping
- overhead. This is similar to what many memcpy() implementations do. */
- unrolled_end = e - 4;
- while (s < unrolled_end) {
- p[0] = (unsigned char) s[0];
- p[1] = (unsigned char) s[1];
- p[2] = (unsigned char) s[2];
- p[3] = (unsigned char) s[3];
- s += 4;
- p += 4;
- }
- while (s < e)
- *p++ = (unsigned char) *s++;
- return (PyObject *)v;
-
- onError:
- Py_XDECREF(v);
- return NULL;
+ return _PyUnicode_FromUCS1((unsigned char*)s, size);
}
/* create or adjust a UnicodeEncodeError */
-static void make_encode_exception(PyObject **exceptionObject,
- const char *encoding,
- const Py_UNICODE *unicode, Py_ssize_t size,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason)
+static void
+make_encode_exception(PyObject **exceptionObject,
+ const char *encoding,
+ PyObject *unicode,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ const char *reason)
{
if (*exceptionObject == NULL) {
- *exceptionObject = PyUnicodeEncodeError_Create(
- encoding, unicode, size, startpos, endpos, reason);
+ *exceptionObject = PyObject_CallFunction(
+ PyExc_UnicodeEncodeError, "sOnns",
+ encoding, unicode, startpos, endpos, reason);
}
else {
if (PyUnicodeEncodeError_SetStart(*exceptionObject, startpos))
@@ -4522,14 +6221,15 @@ static void make_encode_exception(PyObject **exceptionObject,
}
/* raises a UnicodeEncodeError */
-static void raise_encode_exception(PyObject **exceptionObject,
- const char *encoding,
- const Py_UNICODE *unicode, Py_ssize_t size,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason)
+static void
+raise_encode_exception(PyObject **exceptionObject,
+ const char *encoding,
+ PyObject *unicode,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ const char *reason)
{
make_encode_exception(exceptionObject,
- encoding, unicode, size, startpos, endpos, reason);
+ encoding, unicode, startpos, endpos, reason);
if (*exceptionObject != NULL)
PyCodec_StrictErrors(*exceptionObject);
}
@@ -4538,15 +6238,16 @@ static void raise_encode_exception(PyObject **exceptionObject,
build arguments, call the callback and check the arguments,
put the result into newpos and return the replacement string, which
has to be freed by the caller */
-static PyObject *unicode_encode_call_errorhandler(const char *errors,
- PyObject **errorHandler,
- const char *encoding, const char *reason,
- const Py_UNICODE *unicode, Py_ssize_t size, PyObject **exceptionObject,
- Py_ssize_t startpos, Py_ssize_t endpos,
- Py_ssize_t *newpos)
+static PyObject *
+unicode_encode_call_errorhandler(const char *errors,
+ PyObject **errorHandler,
+ const char *encoding, const char *reason,
+ PyObject *unicode, PyObject **exceptionObject,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ Py_ssize_t *newpos)
{
static char *argparse = "On;encoding error handler must return (str/bytes, int) tuple";
-
+ Py_ssize_t len;
PyObject *restuple;
PyObject *resunicode;
@@ -4556,8 +6257,12 @@ static PyObject *unicode_encode_call_errorhandler(const char *errors,
return NULL;
}
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ len = PyUnicode_GET_LENGTH(unicode);
+
make_encode_exception(exceptionObject,
- encoding, unicode, size, startpos, endpos, reason);
+ encoding, unicode, startpos, endpos, reason);
if (*exceptionObject == NULL)
return NULL;
@@ -4581,8 +6286,8 @@ static PyObject *unicode_encode_call_errorhandler(const char *errors,
return NULL;
}
if (*newpos<0)
- *newpos = size+*newpos;
- if (*newpos<0 || *newpos>size) {
+ *newpos = len + *newpos;
+ if (*newpos<0 || *newpos>len) {
PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos);
Py_DECREF(restuple);
return NULL;
@@ -4592,18 +6297,17 @@ static PyObject *unicode_encode_call_errorhandler(const char *errors,
return resunicode;
}
-static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
- Py_ssize_t size,
- const char *errors,
- int limit)
+static PyObject *
+unicode_encode_ucs1(PyObject *unicode,
+ const char *errors,
+ unsigned int limit)
{
+ /* input state */
+ Py_ssize_t pos=0, size;
+ int kind;
+ void *data;
/* output object */
PyObject *res;
- /* pointers to the beginning and end+1 of input */
- const Py_UNICODE *startp = p;
- const Py_UNICODE *endp = p + size;
- /* pointer to the beginning of the unencodable characters */
- /* const Py_UNICODE *badp = NULL; */
/* pointer into the output */
char *str;
/* current output position */
@@ -4616,6 +6320,11 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
* -1=not initialized, 0=unknown, 1=strict, 2=replace, 3=ignore, 4=xmlcharrefreplace */
int known_errorHandler = -1;
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ size = PyUnicode_GET_LENGTH(unicode);
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
/* allocate enough for a simple encoding without
replacements, if we need more, we'll resize */
if (size == 0)
@@ -4626,28 +6335,24 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
str = PyBytes_AS_STRING(res);
ressize = size;
- while (p<endp) {
- Py_UNICODE c = *p;
+ while (pos < size) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, pos);
/* can we encode this? */
if (c<limit) {
/* no overflow check, because we know that the space is enough */
*str++ = (char)c;
- ++p;
+ ++pos;
}
else {
- Py_ssize_t unicodepos = p-startp;
Py_ssize_t requiredsize;
PyObject *repunicode;
- Py_ssize_t repsize;
- Py_ssize_t newpos;
- Py_ssize_t respos;
- Py_UNICODE *uni2;
+ Py_ssize_t repsize, newpos, respos, i;
/* startpos for collecting unencodable chars */
- const Py_UNICODE *collstart = p;
- const Py_UNICODE *collend = p;
+ Py_ssize_t collstart = pos;
+ Py_ssize_t collend = pos;
/* find all unecodable characters */
- while ((collend < endp) && ((*collend)>=limit))
+ while ((collend < size) && (PyUnicode_READ(kind, data, collend)>=limit))
++collend;
/* cache callback name lookup (if not done yet, i.e. it's the first error) */
if (known_errorHandler==-1) {
@@ -4664,39 +6369,37 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
}
switch (known_errorHandler) {
case 1: /* strict */
- raise_encode_exception(&exc, encoding, startp, size, collstart-startp, collend-startp, reason);
+ raise_encode_exception(&exc, encoding, unicode, collstart, collend, reason);
goto onError;
case 2: /* replace */
while (collstart++<collend)
*str++ = '?'; /* fall through */
case 3: /* ignore */
- p = collend;
+ pos = collend;
break;
case 4: /* xmlcharrefreplace */
respos = str - PyBytes_AS_STRING(res);
- /* determine replacement size (temporarily (mis)uses p) */
- for (p = collstart, repsize = 0; p < collend; ++p) {
- if (*p<10)
+ /* determine replacement size */
+ for (i = collstart, repsize = 0; i < collend; ++i) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch < 10)
repsize += 2+1+1;
- else if (*p<100)
+ else if (ch < 100)
repsize += 2+2+1;
- else if (*p<1000)
+ else if (ch < 1000)
repsize += 2+3+1;
- else if (*p<10000)
+ else if (ch < 10000)
repsize += 2+4+1;
-#ifndef Py_UNICODE_WIDE
- else
- repsize += 2+5+1;
-#else
- else if (*p<100000)
+ else if (ch < 100000)
repsize += 2+5+1;
- else if (*p<1000000)
+ else if (ch < 1000000)
repsize += 2+6+1;
- else
+ else {
+ assert(ch <= MAX_UNICODE);
repsize += 2+7+1;
-#endif
+ }
}
- requiredsize = respos+repsize+(endp-collend);
+ requiredsize = respos+repsize+(size-collend);
if (requiredsize > ressize) {
if (requiredsize<2*ressize)
requiredsize = 2*ressize;
@@ -4705,17 +6408,18 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
str = PyBytes_AS_STRING(res) + respos;
ressize = requiredsize;
}
- /* generate replacement (temporarily (mis)uses p) */
- for (p = collstart; p < collend; ++p) {
- str += sprintf(str, "&#%d;", (int)*p);
+ /* generate replacement */
+ for (i = collstart; i < collend; ++i) {
+ str += sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i));
}
- p = collend;
+ pos = collend;
break;
default:
repunicode = unicode_encode_call_errorhandler(errors, &errorHandler,
- encoding, reason, startp, size, &exc,
- collstart-startp, collend-startp, &newpos);
- if (repunicode == NULL)
+ encoding, reason, unicode, &exc,
+ collstart, collend, &newpos);
+ if (repunicode == NULL || (PyUnicode_Check(repunicode) &&
+ PyUnicode_READY(repunicode) == -1))
goto onError;
if (PyBytes_Check(repunicode)) {
/* Directly copy bytes result to output. */
@@ -4732,7 +6436,7 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
}
memcpy(str, PyBytes_AsString(repunicode), repsize);
str += repsize;
- p = startp + newpos;
+ pos = newpos;
Py_DECREF(repunicode);
break;
}
@@ -4740,8 +6444,8 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
have+the replacement+the rest of the string, so
we won't have to check space for encodable characters) */
respos = str - PyBytes_AS_STRING(res);
- repsize = PyUnicode_GET_SIZE(repunicode);
- requiredsize = respos+repsize+(endp-collend);
+ repsize = PyUnicode_GET_LENGTH(repunicode);
+ requiredsize = respos+repsize+(size-collend);
if (requiredsize > ressize) {
if (requiredsize<2*ressize)
requiredsize = 2*ressize;
@@ -4754,17 +6458,17 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
}
/* check if there is anything unencodable in the replacement
and copy it to the output */
- for (uni2 = PyUnicode_AS_UNICODE(repunicode);repsize-->0; ++uni2, ++str) {
- c = *uni2;
+ for (i = 0; repsize-->0; ++i, ++str) {
+ c = PyUnicode_READ_CHAR(repunicode, i);
if (c >= limit) {
- raise_encode_exception(&exc, encoding, startp, size,
- unicodepos, unicodepos+1, reason);
+ raise_encode_exception(&exc, encoding, unicode,
+ pos, pos+1, reason);
Py_DECREF(repunicode);
goto onError;
}
*str = (char)c;
}
- p = startp + newpos;
+ pos = newpos;
Py_DECREF(repunicode);
}
}
@@ -4788,33 +6492,57 @@ static PyObject *unicode_encode_ucs1(const Py_UNICODE *p,
return NULL;
}
-PyObject *PyUnicode_EncodeLatin1(const Py_UNICODE *p,
- Py_ssize_t size,
- const char *errors)
+/* Deprecated */
+PyObject *
+PyUnicode_EncodeLatin1(const Py_UNICODE *p,
+ Py_ssize_t size,
+ const char *errors)
{
- return unicode_encode_ucs1(p, size, errors, 256);
+ PyObject *result;
+ PyObject *unicode = PyUnicode_FromUnicode(p, size);
+ if (unicode == NULL)
+ return NULL;
+ result = unicode_encode_ucs1(unicode, errors, 256);
+ Py_DECREF(unicode);
+ return result;
}
-PyObject *PyUnicode_AsLatin1String(PyObject *unicode)
+PyObject *
+_PyUnicode_AsLatin1String(PyObject *unicode, const char *errors)
{
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
return NULL;
}
- return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ /* Fast path: if it is a one-byte string, construct
+ bytes object directly. */
+ if (PyUnicode_KIND(unicode) == PyUnicode_1BYTE_KIND)
+ return PyBytes_FromStringAndSize(PyUnicode_DATA(unicode),
+ PyUnicode_GET_LENGTH(unicode));
+ /* Non-Latin-1 characters present. Defer to above function to
+ raise the exception. */
+ return unicode_encode_ucs1(unicode, errors, 256);
+}
+
+PyObject*
+PyUnicode_AsLatin1String(PyObject *unicode)
+{
+ return _PyUnicode_AsLatin1String(unicode, NULL);
}
/* --- 7-bit ASCII Codec -------------------------------------------------- */
-PyObject *PyUnicode_DecodeASCII(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeASCII(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
const char *starts = s;
- PyUnicodeObject *v;
- Py_UNICODE *p;
+ PyObject *unicode;
+ int kind;
+ void *data;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
@@ -4822,70 +6550,99 @@ PyObject *PyUnicode_DecodeASCII(const char *s,
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- /* ASCII is equivalent to the first 128 ordinals in Unicode. */
- if (size == 1 && *(unsigned char*)s < 128) {
- Py_UNICODE r = *(unsigned char*)s;
- return PyUnicode_FromUnicode(&r, 1);
+ if (size == 0) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
}
- v = _PyUnicode_New(size);
- if (v == NULL)
+ /* ASCII is equivalent to the first 128 ordinals in Unicode. */
+ if (size == 1 && (unsigned char)s[0] < 128)
+ return get_latin1_char((unsigned char)s[0]);
+
+ unicode = PyUnicode_New(size, 127);
+ if (unicode == NULL)
goto onError;
- if (size == 0)
- return (PyObject *)v;
- p = PyUnicode_AS_UNICODE(v);
+
e = s + size;
+ data = PyUnicode_1BYTE_DATA(unicode);
+ outpos = ascii_decode(s, e, (Py_UCS1 *)data);
+ if (outpos == size)
+ return unicode;
+
+ s += outpos;
+ kind = PyUnicode_1BYTE_KIND;
while (s < e) {
register unsigned char c = (unsigned char)*s;
if (c < 128) {
- *p++ = c;
+ PyUnicode_WRITE(kind, data, outpos++, c);
++s;
}
else {
startinpos = s-starts;
endinpos = startinpos + 1;
- outpos = p - (Py_UNICODE *)PyUnicode_AS_UNICODE(v);
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"ascii", "ordinal not in range(128)",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p))
+ &unicode, &outpos))
goto onError;
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
}
}
- if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v))
- if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0)
- goto onError;
+ if (unicode_resize(&unicode, outpos) < 0)
+ goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)v;
+ assert(_PyUnicode_CheckConsistency(unicode, 1));
+ return unicode;
onError:
- Py_XDECREF(v);
+ Py_XDECREF(unicode);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
return NULL;
}
-PyObject *PyUnicode_EncodeASCII(const Py_UNICODE *p,
- Py_ssize_t size,
- const char *errors)
+/* Deprecated */
+PyObject *
+PyUnicode_EncodeASCII(const Py_UNICODE *p,
+ Py_ssize_t size,
+ const char *errors)
{
- return unicode_encode_ucs1(p, size, errors, 128);
+ PyObject *result;
+ PyObject *unicode = PyUnicode_FromUnicode(p, size);
+ if (unicode == NULL)
+ return NULL;
+ result = unicode_encode_ucs1(unicode, errors, 128);
+ Py_DECREF(unicode);
+ return result;
}
-PyObject *PyUnicode_AsASCIIString(PyObject *unicode)
+PyObject *
+_PyUnicode_AsASCIIString(PyObject *unicode, const char *errors)
{
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
return NULL;
}
- return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ /* Fast path: if it is an ASCII-only string, construct bytes object
+ directly. Else defer to above function to raise the exception. */
+ if (PyUnicode_MAX_CHAR_VALUE(unicode) < 128)
+ return PyBytes_FromStringAndSize(PyUnicode_DATA(unicode),
+ PyUnicode_GET_LENGTH(unicode));
+ return unicode_encode_ucs1(unicode, errors, 128);
}
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+PyObject *
+PyUnicode_AsASCIIString(PyObject *unicode)
+{
+ return _PyUnicode_AsASCIIString(unicode, NULL);
+}
+
+#ifdef HAVE_MBCS
/* --- MBCS codecs for Windows -------------------------------------------- */
@@ -4893,336 +6650,842 @@ PyObject *PyUnicode_AsASCIIString(PyObject *unicode)
#define NEED_RETRY
#endif
-/* XXX This code is limited to "true" double-byte encodings, as
- a) it assumes an incomplete character consists of a single byte, and
- b) IsDBCSLeadByte (probably) does not work for non-DBCS multi-byte
- encodings, see IsDBCSLeadByteEx documentation. */
+#ifndef WC_ERR_INVALID_CHARS
+# define WC_ERR_INVALID_CHARS 0x0080
+#endif
-static int is_dbcs_lead_byte(const char *s, int offset)
+static char*
+code_page_name(UINT code_page, PyObject **obj)
{
- const char *curr = s + offset;
+ *obj = NULL;
+ if (code_page == CP_ACP)
+ return "mbcs";
+ if (code_page == CP_UTF7)
+ return "CP_UTF7";
+ if (code_page == CP_UTF8)
+ return "CP_UTF8";
- if (IsDBCSLeadByte(*curr)) {
- const char *prev = CharPrev(s, curr);
- return (prev == curr) || !IsDBCSLeadByte(*prev) || (curr - prev == 2);
- }
- return 0;
+ *obj = PyBytes_FromFormat("cp%u", code_page);
+ if (*obj == NULL)
+ return NULL;
+ return PyBytes_AS_STRING(*obj);
}
-/*
- * Decode MBCS string into unicode object. If 'final' is set, converts
- * trailing lead-byte too. Returns consumed size if succeed, -1 otherwise.
- */
-static int decode_mbcs(PyUnicodeObject **v,
- const char *s, /* MBCS string */
- int size, /* sizeof MBCS string */
- int final,
- const char *errors)
+static int
+is_dbcs_lead_byte(UINT code_page, const char *s, int offset)
{
- Py_UNICODE *p;
- Py_ssize_t n;
- DWORD usize;
- DWORD flags;
+ const char *curr = s + offset;
+ const char *prev;
- assert(size >= 0);
+ if (!IsDBCSLeadByteEx(code_page, *curr))
+ return 0;
- /* check and handle 'errors' arg */
- if (errors==NULL || strcmp(errors, "strict")==0)
- flags = MB_ERR_INVALID_CHARS;
- else if (strcmp(errors, "ignore")==0)
- flags = 0;
- else {
- PyErr_Format(PyExc_ValueError,
- "mbcs encoding does not support errors='%s'",
- errors);
- return -1;
+ prev = CharPrevExA(code_page, s, curr, 0);
+ if (prev == curr)
+ return 1;
+ /* FIXME: This code is limited to "true" double-byte encodings,
+ as it assumes an incomplete character consists of a single
+ byte. */
+ if (curr - prev == 2)
+ return 1;
+ if (!IsDBCSLeadByteEx(code_page, *prev))
+ return 1;
+ return 0;
+}
+
+static DWORD
+decode_code_page_flags(UINT code_page)
+{
+ if (code_page == CP_UTF7) {
+ /* The CP_UTF7 decoder only supports flags=0 */
+ return 0;
}
+ else
+ return MB_ERR_INVALID_CHARS;
+}
- /* Skip trailing lead-byte unless 'final' is set */
- if (!final && size >= 1 && is_dbcs_lead_byte(s, size - 1))
- --size;
+/*
+ * Decode a byte string from a Windows code page into unicode object in strict
+ * mode.
+ *
+ * Returns consumed size if succeed, returns -2 on decode error, or raise a
+ * WindowsError and returns -1 on other error.
+ */
+static int
+decode_code_page_strict(UINT code_page,
+ PyObject **v,
+ const char *in,
+ int insize)
+{
+ const DWORD flags = decode_code_page_flags(code_page);
+ wchar_t *out;
+ DWORD outsize;
/* First get the size of the result */
- if (size > 0) {
- usize = MultiByteToWideChar(CP_ACP, flags, s, size, NULL, 0);
- if (usize==0)
- goto mbcs_decode_error;
- } else
- usize = 0;
+ assert(insize > 0);
+ outsize = MultiByteToWideChar(code_page, flags, in, insize, NULL, 0);
+ if (outsize <= 0)
+ goto error;
if (*v == NULL) {
/* Create unicode object */
- *v = _PyUnicode_New(usize);
+ /* FIXME: don't use _PyUnicode_New(), but allocate a wchar_t* buffer */
+ *v = (PyObject*)_PyUnicode_New(outsize);
if (*v == NULL)
return -1;
- n = 0;
+ out = PyUnicode_AS_UNICODE(*v);
}
else {
/* Extend unicode object */
- n = PyUnicode_GET_SIZE(*v);
- if (_PyUnicode_Resize(v, n + usize) < 0)
+ Py_ssize_t n = PyUnicode_GET_SIZE(*v);
+ if (unicode_resize(v, n + outsize) < 0)
return -1;
+ out = PyUnicode_AS_UNICODE(*v) + n;
}
/* Do the conversion */
- if (usize > 0) {
- p = PyUnicode_AS_UNICODE(*v) + n;
- if (0 == MultiByteToWideChar(CP_ACP, flags, s, size, p, usize)) {
- goto mbcs_decode_error;
- }
- }
- return size;
+ outsize = MultiByteToWideChar(code_page, flags, in, insize, out, outsize);
+ if (outsize <= 0)
+ goto error;
+ return insize;
-mbcs_decode_error:
- /* If the last error was ERROR_NO_UNICODE_TRANSLATION, then
- we raise a UnicodeDecodeError - else it is a 'generic'
- windows error
- */
- if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) {
- /* Ideally, we should get reason from FormatMessage - this
- is the Windows 2000 English version of the message
- */
- PyObject *exc = NULL;
- const char *reason = "No mapping for the Unicode character exists "
- "in the target multi-byte code page.";
- make_decode_exception(&exc, "mbcs", s, size, 0, 0, reason);
+error:
+ if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION)
+ return -2;
+ PyErr_SetFromWindowsErr(0);
+ return -1;
+}
+
+/*
+ * Decode a byte string from a code page into unicode object with an error
+ * handler.
+ *
+ * Returns consumed size if succeed, or raise a WindowsError or
+ * UnicodeDecodeError exception and returns -1 on error.
+ */
+static int
+decode_code_page_errors(UINT code_page,
+ PyObject **v,
+ const char *in, const int size,
+ const char *errors)
+{
+ const char *startin = in;
+ const char *endin = in + size;
+ const DWORD flags = decode_code_page_flags(code_page);
+ /* Ideally, we should get reason from FormatMessage. This is the Windows
+ 2000 English version of the message. */
+ const char *reason = "No mapping for the Unicode character exists "
+ "in the target code page.";
+ /* each step cannot decode more than 1 character, but a character can be
+ represented as a surrogate pair */
+ wchar_t buffer[2], *startout, *out;
+ int insize, outsize;
+ PyObject *errorHandler = NULL;
+ PyObject *exc = NULL;
+ PyObject *encoding_obj = NULL;
+ char *encoding;
+ DWORD err;
+ int ret = -1;
+
+ assert(size > 0);
+
+ encoding = code_page_name(code_page, &encoding_obj);
+ if (encoding == NULL)
+ return -1;
+
+ if (errors == NULL || strcmp(errors, "strict") == 0) {
+ /* The last error was ERROR_NO_UNICODE_TRANSLATION, then we raise a
+ UnicodeDecodeError. */
+ make_decode_exception(&exc, encoding, in, size, 0, 0, reason);
if (exc != NULL) {
PyCodec_StrictErrors(exc);
- Py_DECREF(exc);
+ Py_CLEAR(exc);
}
- } else {
- PyErr_SetFromWindowsErrWithFilename(0, NULL);
+ goto error;
}
- return -1;
+
+ if (*v == NULL) {
+ /* Create unicode object */
+ if (size > PY_SSIZE_T_MAX / (Py_ssize_t)Py_ARRAY_LENGTH(buffer)) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ /* FIXME: don't use _PyUnicode_New(), but allocate a wchar_t* buffer */
+ *v = (PyObject*)_PyUnicode_New(size * Py_ARRAY_LENGTH(buffer));
+ if (*v == NULL)
+ goto error;
+ startout = PyUnicode_AS_UNICODE(*v);
+ }
+ else {
+ /* Extend unicode object */
+ Py_ssize_t n = PyUnicode_GET_SIZE(*v);
+ if (size > (PY_SSIZE_T_MAX - n) / (Py_ssize_t)Py_ARRAY_LENGTH(buffer)) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ if (unicode_resize(v, n + size * Py_ARRAY_LENGTH(buffer)) < 0)
+ goto error;
+ startout = PyUnicode_AS_UNICODE(*v) + n;
+ }
+
+ /* Decode the byte string character per character */
+ out = startout;
+ while (in < endin)
+ {
+ /* Decode a character */
+ insize = 1;
+ do
+ {
+ outsize = MultiByteToWideChar(code_page, flags,
+ in, insize,
+ buffer, Py_ARRAY_LENGTH(buffer));
+ if (outsize > 0)
+ break;
+ err = GetLastError();
+ if (err != ERROR_NO_UNICODE_TRANSLATION
+ && err != ERROR_INSUFFICIENT_BUFFER)
+ {
+ PyErr_SetFromWindowsErr(0);
+ goto error;
+ }
+ insize++;
+ }
+ /* 4=maximum length of a UTF-8 sequence */
+ while (insize <= 4 && (in + insize) <= endin);
+
+ if (outsize <= 0) {
+ Py_ssize_t startinpos, endinpos, outpos;
+
+ startinpos = in - startin;
+ endinpos = startinpos + 1;
+ outpos = out - PyUnicode_AS_UNICODE(*v);
+ if (unicode_decode_call_errorhandler(
+ errors, &errorHandler,
+ encoding, reason,
+ &startin, &endin, &startinpos, &endinpos, &exc, &in,
+ v, &outpos))
+ {
+ goto error;
+ }
+ out = PyUnicode_AS_UNICODE(*v) + outpos;
+ }
+ else {
+ in += insize;
+ memcpy(out, buffer, outsize * sizeof(wchar_t));
+ out += outsize;
+ }
+ }
+
+ /* write a NUL character at the end */
+ *out = 0;
+
+ /* Extend unicode object */
+ outsize = out - startout;
+ assert(outsize <= PyUnicode_WSTR_LENGTH(*v));
+ if (unicode_resize(v, outsize) < 0)
+ goto error;
+ ret = size;
+
+error:
+ Py_XDECREF(encoding_obj);
+ Py_XDECREF(errorHandler);
+ Py_XDECREF(exc);
+ return ret;
}
-PyObject *PyUnicode_DecodeMBCSStateful(const char *s,
- Py_ssize_t size,
- const char *errors,
- Py_ssize_t *consumed)
+static PyObject *
+decode_code_page_stateful(int code_page,
+ const char *s, Py_ssize_t size,
+ const char *errors, Py_ssize_t *consumed)
{
- PyUnicodeObject *v = NULL;
- int done;
+ PyObject *v = NULL;
+ int chunk_size, final, converted, done;
+
+ if (code_page < 0) {
+ PyErr_SetString(PyExc_ValueError, "invalid code page number");
+ return NULL;
+ }
if (consumed)
*consumed = 0;
+ do
+ {
#ifdef NEED_RETRY
- retry:
- if (size > INT_MAX)
- done = decode_mbcs(&v, s, INT_MAX, 0, errors);
- else
+ if (size > INT_MAX) {
+ chunk_size = INT_MAX;
+ final = 0;
+ done = 0;
+ }
+ else
#endif
- done = decode_mbcs(&v, s, (int)size, !consumed, errors);
+ {
+ chunk_size = (int)size;
+ final = (consumed == NULL);
+ done = 1;
+ }
- if (done < 0) {
- Py_XDECREF(v);
- return NULL;
- }
+ /* Skip trailing lead-byte unless 'final' is set */
+ if (!final && is_dbcs_lead_byte(code_page, s, chunk_size - 1))
+ --chunk_size;
- if (consumed)
- *consumed += done;
+ if (chunk_size == 0 && done) {
+ if (v != NULL)
+ break;
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
-#ifdef NEED_RETRY
- if (size > INT_MAX) {
- s += done;
- size -= done;
- goto retry;
- }
-#endif
- return (PyObject *)v;
+ converted = decode_code_page_strict(code_page, &v,
+ s, chunk_size);
+ if (converted == -2)
+ converted = decode_code_page_errors(code_page, &v,
+ s, chunk_size,
+ errors);
+ assert(converted != 0);
+
+ if (converted < 0) {
+ Py_XDECREF(v);
+ return NULL;
+ }
+
+ if (consumed)
+ *consumed += converted;
+
+ s += converted;
+ size -= converted;
+ } while (!done);
+
+ return unicode_result(v);
+}
+
+PyObject *
+PyUnicode_DecodeCodePageStateful(int code_page,
+ const char *s,
+ Py_ssize_t size,
+ const char *errors,
+ Py_ssize_t *consumed)
+{
+ return decode_code_page_stateful(code_page, s, size, errors, consumed);
}
-PyObject *PyUnicode_DecodeMBCS(const char *s,
- Py_ssize_t size,
- const char *errors)
+PyObject *
+PyUnicode_DecodeMBCSStateful(const char *s,
+ Py_ssize_t size,
+ const char *errors,
+ Py_ssize_t *consumed)
+{
+ return decode_code_page_stateful(CP_ACP, s, size, errors, consumed);
+}
+
+PyObject *
+PyUnicode_DecodeMBCS(const char *s,
+ Py_ssize_t size,
+ const char *errors)
{
return PyUnicode_DecodeMBCSStateful(s, size, errors, NULL);
}
+static DWORD
+encode_code_page_flags(UINT code_page, const char *errors)
+{
+ if (code_page == CP_UTF8) {
+ if (winver.dwMajorVersion >= 6)
+ /* CP_UTF8 supports WC_ERR_INVALID_CHARS on Windows Vista
+ and later */
+ return WC_ERR_INVALID_CHARS;
+ else
+ /* CP_UTF8 only supports flags=0 on Windows older than Vista */
+ return 0;
+ }
+ else if (code_page == CP_UTF7) {
+ /* CP_UTF7 only supports flags=0 */
+ return 0;
+ }
+ else {
+ if (errors != NULL && strcmp(errors, "replace") == 0)
+ return 0;
+ else
+ return WC_NO_BEST_FIT_CHARS;
+ }
+}
+
/*
- * Convert unicode into string object (MBCS).
- * Returns 0 if succeed, -1 otherwise.
+ * Encode a Unicode string to a Windows code page into a byte string in strict
+ * mode.
+ *
+ * Returns consumed characters if succeed, returns -2 on encode error, or raise
+ * a WindowsError and returns -1 on other error.
*/
-static int encode_mbcs(PyObject **repr,
- const Py_UNICODE *p, /* unicode */
- int size, /* size of unicode */
- const char* errors)
+static int
+encode_code_page_strict(UINT code_page, PyObject **outbytes,
+ PyObject *unicode, Py_ssize_t offset, int len,
+ const char* errors)
{
BOOL usedDefaultChar = FALSE;
- BOOL *pusedDefaultChar;
- int mbcssize;
- Py_ssize_t n;
+ BOOL *pusedDefaultChar = &usedDefaultChar;
+ int outsize;
PyObject *exc = NULL;
- DWORD flags;
+ wchar_t *p;
+ Py_ssize_t size;
+ const DWORD flags = encode_code_page_flags(code_page, NULL);
+ char *out;
+ /* Create a substring so that we can get the UTF-16 representation
+ of just the slice under consideration. */
+ PyObject *substring;
- assert(size >= 0);
+ assert(len > 0);
- /* check and handle 'errors' arg */
- if (errors==NULL || strcmp(errors, "strict")==0) {
- flags = WC_NO_BEST_FIT_CHARS;
+ if (code_page != CP_UTF8 && code_page != CP_UTF7)
pusedDefaultChar = &usedDefaultChar;
- } else if (strcmp(errors, "replace")==0) {
- flags = 0;
+ else
pusedDefaultChar = NULL;
- } else {
- PyErr_Format(PyExc_ValueError,
- "mbcs encoding does not support errors='%s'",
- errors);
- return -1;
+
+ substring = PyUnicode_Substring(unicode, offset, offset+len);
+ if (substring == NULL)
+ return -1;
+ p = PyUnicode_AsUnicodeAndSize(substring, &size);
+ if (p == NULL) {
+ Py_DECREF(substring);
+ return -1;
}
/* First get the size of the result */
- if (size > 0) {
- mbcssize = WideCharToMultiByte(CP_ACP, flags, p, size, NULL, 0,
- NULL, pusedDefaultChar);
- if (mbcssize == 0) {
- PyErr_SetFromWindowsErrWithFilename(0, NULL);
- return -1;
- }
- /* If we used a default char, then we failed! */
- if (pusedDefaultChar && *pusedDefaultChar)
- goto mbcs_encode_error;
- } else {
- mbcssize = 0;
+ outsize = WideCharToMultiByte(code_page, flags,
+ p, size,
+ NULL, 0,
+ NULL, pusedDefaultChar);
+ if (outsize <= 0)
+ goto error;
+ /* If we used a default char, then we failed! */
+ if (pusedDefaultChar && *pusedDefaultChar) {
+ Py_DECREF(substring);
+ return -2;
}
- if (*repr == NULL) {
+ if (*outbytes == NULL) {
/* Create string object */
- *repr = PyBytes_FromStringAndSize(NULL, mbcssize);
- if (*repr == NULL)
+ *outbytes = PyBytes_FromStringAndSize(NULL, outsize);
+ if (*outbytes == NULL) {
+ Py_DECREF(substring);
return -1;
- n = 0;
+ }
+ out = PyBytes_AS_STRING(*outbytes);
}
else {
/* Extend string object */
- n = PyBytes_Size(*repr);
- if (_PyBytes_Resize(repr, n + mbcssize) < 0)
+ const Py_ssize_t n = PyBytes_Size(*outbytes);
+ if (outsize > PY_SSIZE_T_MAX - n) {
+ PyErr_NoMemory();
+ Py_DECREF(substring);
return -1;
+ }
+ if (_PyBytes_Resize(outbytes, n + outsize) < 0) {
+ Py_DECREF(substring);
+ return -1;
+ }
+ out = PyBytes_AS_STRING(*outbytes) + n;
}
/* Do the conversion */
- if (size > 0) {
- char *s = PyBytes_AS_STRING(*repr) + n;
- if (0 == WideCharToMultiByte(CP_ACP, flags, p, size, s, mbcssize,
- NULL, pusedDefaultChar)) {
- PyErr_SetFromWindowsErrWithFilename(0, NULL);
- return -1;
+ outsize = WideCharToMultiByte(code_page, flags,
+ p, size,
+ out, outsize,
+ NULL, pusedDefaultChar);
+ Py_CLEAR(substring);
+ if (outsize <= 0)
+ goto error;
+ if (pusedDefaultChar && *pusedDefaultChar)
+ return -2;
+ return 0;
+
+error:
+ Py_XDECREF(substring);
+ if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION)
+ return -2;
+ PyErr_SetFromWindowsErr(0);
+ return -1;
+}
+
+/*
+ * Encode a Unicode string to a Windows code page into a byte string using a
+ * error handler.
+ *
+ * Returns consumed characters if succeed, or raise a WindowsError and returns
+ * -1 on other error.
+ */
+static int
+encode_code_page_errors(UINT code_page, PyObject **outbytes,
+ PyObject *unicode, Py_ssize_t unicode_offset,
+ Py_ssize_t insize, const char* errors)
+{
+ const DWORD flags = encode_code_page_flags(code_page, errors);
+ Py_ssize_t pos = unicode_offset;
+ Py_ssize_t endin = unicode_offset + insize;
+ /* Ideally, we should get reason from FormatMessage. This is the Windows
+ 2000 English version of the message. */
+ const char *reason = "invalid character";
+ /* 4=maximum length of a UTF-8 sequence */
+ char buffer[4];
+ BOOL usedDefaultChar = FALSE, *pusedDefaultChar;
+ Py_ssize_t outsize;
+ char *out;
+ PyObject *errorHandler = NULL;
+ PyObject *exc = NULL;
+ PyObject *encoding_obj = NULL;
+ char *encoding;
+ Py_ssize_t newpos, newoutsize;
+ PyObject *rep;
+ int ret = -1;
+
+ assert(insize > 0);
+
+ encoding = code_page_name(code_page, &encoding_obj);
+ if (encoding == NULL)
+ return -1;
+
+ if (errors == NULL || strcmp(errors, "strict") == 0) {
+ /* The last error was ERROR_NO_UNICODE_TRANSLATION,
+ then we raise a UnicodeEncodeError. */
+ make_encode_exception(&exc, encoding, unicode, 0, 0, reason);
+ if (exc != NULL) {
+ PyCodec_StrictErrors(exc);
+ Py_DECREF(exc);
}
- if (pusedDefaultChar && *pusedDefaultChar)
- goto mbcs_encode_error;
+ Py_XDECREF(encoding_obj);
+ return -1;
}
- return 0;
-mbcs_encode_error:
- raise_encode_exception(&exc, "mbcs", p, size, 0, 0, "invalid character");
+ if (code_page != CP_UTF8 && code_page != CP_UTF7)
+ pusedDefaultChar = &usedDefaultChar;
+ else
+ pusedDefaultChar = NULL;
+
+ if (Py_ARRAY_LENGTH(buffer) > PY_SSIZE_T_MAX / insize) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ outsize = insize * Py_ARRAY_LENGTH(buffer);
+
+ if (*outbytes == NULL) {
+ /* Create string object */
+ *outbytes = PyBytes_FromStringAndSize(NULL, outsize);
+ if (*outbytes == NULL)
+ goto error;
+ out = PyBytes_AS_STRING(*outbytes);
+ }
+ else {
+ /* Extend string object */
+ Py_ssize_t n = PyBytes_Size(*outbytes);
+ if (n > PY_SSIZE_T_MAX - outsize) {
+ PyErr_NoMemory();
+ goto error;
+ }
+ if (_PyBytes_Resize(outbytes, n + outsize) < 0)
+ goto error;
+ out = PyBytes_AS_STRING(*outbytes) + n;
+ }
+
+ /* Encode the string character per character */
+ while (pos < endin)
+ {
+ Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, pos);
+ wchar_t chars[2];
+ int charsize;
+ if (ch < 0x10000) {
+ chars[0] = (wchar_t)ch;
+ charsize = 1;
+ }
+ else {
+ ch -= 0x10000;
+ chars[0] = 0xd800 + (ch >> 10);
+ chars[1] = 0xdc00 + (ch & 0x3ff);
+ charsize = 2;
+ }
+
+ outsize = WideCharToMultiByte(code_page, flags,
+ chars, charsize,
+ buffer, Py_ARRAY_LENGTH(buffer),
+ NULL, pusedDefaultChar);
+ if (outsize > 0) {
+ if (pusedDefaultChar == NULL || !(*pusedDefaultChar))
+ {
+ pos++;
+ memcpy(out, buffer, outsize);
+ out += outsize;
+ continue;
+ }
+ }
+ else if (GetLastError() != ERROR_NO_UNICODE_TRANSLATION) {
+ PyErr_SetFromWindowsErr(0);
+ goto error;
+ }
+
+ rep = unicode_encode_call_errorhandler(
+ errors, &errorHandler, encoding, reason,
+ unicode, &exc,
+ pos, pos + 1, &newpos);
+ if (rep == NULL)
+ goto error;
+ pos = newpos;
+
+ if (PyBytes_Check(rep)) {
+ outsize = PyBytes_GET_SIZE(rep);
+ if (outsize != 1) {
+ Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes);
+ newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1);
+ if (_PyBytes_Resize(outbytes, newoutsize) < 0) {
+ Py_DECREF(rep);
+ goto error;
+ }
+ out = PyBytes_AS_STRING(*outbytes) + offset;
+ }
+ memcpy(out, PyBytes_AS_STRING(rep), outsize);
+ out += outsize;
+ }
+ else {
+ Py_ssize_t i;
+ enum PyUnicode_Kind kind;
+ void *data;
+
+ if (PyUnicode_READY(rep) == -1) {
+ Py_DECREF(rep);
+ goto error;
+ }
+
+ outsize = PyUnicode_GET_LENGTH(rep);
+ if (outsize != 1) {
+ Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes);
+ newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1);
+ if (_PyBytes_Resize(outbytes, newoutsize) < 0) {
+ Py_DECREF(rep);
+ goto error;
+ }
+ out = PyBytes_AS_STRING(*outbytes) + offset;
+ }
+ kind = PyUnicode_KIND(rep);
+ data = PyUnicode_DATA(rep);
+ for (i=0; i < outsize; i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch > 127) {
+ raise_encode_exception(&exc,
+ encoding, unicode,
+ pos, pos + 1,
+ "unable to encode error handler result to ASCII");
+ Py_DECREF(rep);
+ goto error;
+ }
+ *out = (unsigned char)ch;
+ out++;
+ }
+ }
+ Py_DECREF(rep);
+ }
+ /* write a NUL byte */
+ *out = 0;
+ outsize = out - PyBytes_AS_STRING(*outbytes);
+ assert(outsize <= PyBytes_GET_SIZE(*outbytes));
+ if (_PyBytes_Resize(outbytes, outsize) < 0)
+ goto error;
+ ret = 0;
+
+error:
+ Py_XDECREF(encoding_obj);
+ Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return -1;
+ return ret;
}
-PyObject *PyUnicode_EncodeMBCS(const Py_UNICODE *p,
- Py_ssize_t size,
- const char *errors)
+static PyObject *
+encode_code_page(int code_page,
+ PyObject *unicode,
+ const char *errors)
{
- PyObject *repr = NULL;
- int ret;
+ Py_ssize_t len;
+ PyObject *outbytes = NULL;
+ Py_ssize_t offset;
+ int chunk_len, ret, done;
-#ifdef NEED_RETRY
- retry:
- if (size > INT_MAX)
- ret = encode_mbcs(&repr, p, INT_MAX, errors);
- else
-#endif
- ret = encode_mbcs(&repr, p, (int)size, errors);
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ len = PyUnicode_GET_LENGTH(unicode);
- if (ret < 0) {
- Py_XDECREF(repr);
+ if (code_page < 0) {
+ PyErr_SetString(PyExc_ValueError, "invalid code page number");
return NULL;
}
+ if (len == 0)
+ return PyBytes_FromStringAndSize(NULL, 0);
+
+ offset = 0;
+ do
+ {
#ifdef NEED_RETRY
- if (size > INT_MAX) {
- p += INT_MAX;
- size -= INT_MAX;
- goto retry;
- }
+ /* UTF-16 encoding may double the size, so use only INT_MAX/2
+ chunks. */
+ if (len > INT_MAX/2) {
+ chunk_len = INT_MAX/2;
+ done = 0;
+ }
+ else
#endif
+ {
+ chunk_len = (int)len;
+ done = 1;
+ }
+
+ ret = encode_code_page_strict(code_page, &outbytes,
+ unicode, offset, chunk_len,
+ errors);
+ if (ret == -2)
+ ret = encode_code_page_errors(code_page, &outbytes,
+ unicode, offset,
+ chunk_len, errors);
+ if (ret < 0) {
+ Py_XDECREF(outbytes);
+ return NULL;
+ }
- return repr;
+ offset += chunk_len;
+ len -= chunk_len;
+ } while (!done);
+
+ return outbytes;
+}
+
+PyObject *
+PyUnicode_EncodeMBCS(const Py_UNICODE *p,
+ Py_ssize_t size,
+ const char *errors)
+{
+ PyObject *unicode, *res;
+ unicode = PyUnicode_FromUnicode(p, size);
+ if (unicode == NULL)
+ return NULL;
+ res = encode_code_page(CP_ACP, unicode, errors);
+ Py_DECREF(unicode);
+ return res;
}
-PyObject *PyUnicode_AsMBCSString(PyObject *unicode)
+PyObject *
+PyUnicode_EncodeCodePage(int code_page,
+ PyObject *unicode,
+ const char *errors)
+{
+ return encode_code_page(code_page, unicode, errors);
+}
+
+PyObject *
+PyUnicode_AsMBCSString(PyObject *unicode)
{
if (!PyUnicode_Check(unicode)) {
PyErr_BadArgument();
return NULL;
}
- return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- NULL);
+ return PyUnicode_EncodeCodePage(CP_ACP, unicode, NULL);
}
#undef NEED_RETRY
-#endif /* MS_WINDOWS */
+#endif /* HAVE_MBCS */
/* --- Character Mapping Codec -------------------------------------------- */
-PyObject *PyUnicode_DecodeCharmap(const char *s,
- Py_ssize_t size,
- PyObject *mapping,
- const char *errors)
+PyObject *
+PyUnicode_DecodeCharmap(const char *s,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors)
{
const char *starts = s;
Py_ssize_t startinpos;
Py_ssize_t endinpos;
Py_ssize_t outpos;
const char *e;
- PyUnicodeObject *v;
- Py_UNICODE *p;
+ PyObject *v;
Py_ssize_t extrachars = 0;
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
- Py_UNICODE *mapstring = NULL;
- Py_ssize_t maplen = 0;
/* Default to Latin-1 */
if (mapping == NULL)
return PyUnicode_DecodeLatin1(s, size, errors);
- v = _PyUnicode_New(size);
+ v = PyUnicode_New(size, 127);
if (v == NULL)
goto onError;
if (size == 0)
- return (PyObject *)v;
- p = PyUnicode_AS_UNICODE(v);
+ return v;
+ outpos = 0;
e = s + size;
if (PyUnicode_CheckExact(mapping)) {
- mapstring = PyUnicode_AS_UNICODE(mapping);
- maplen = PyUnicode_GET_SIZE(mapping);
+ Py_ssize_t maplen;
+ enum PyUnicode_Kind mapkind;
+ void *mapdata;
+ Py_UCS4 x;
+
+ if (PyUnicode_READY(mapping) == -1)
+ return NULL;
+
+ maplen = PyUnicode_GET_LENGTH(mapping);
+ mapdata = PyUnicode_DATA(mapping);
+ mapkind = PyUnicode_KIND(mapping);
while (s < e) {
- unsigned char ch = *s;
- Py_UNICODE x = 0xfffe; /* illegal value */
+ unsigned char ch;
+ if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) {
+ enum PyUnicode_Kind outkind = PyUnicode_KIND(v);
+ if (outkind == PyUnicode_1BYTE_KIND) {
+ void *outdata = PyUnicode_DATA(v);
+ Py_UCS4 maxchar = PyUnicode_MAX_CHAR_VALUE(v);
+ while (s < e) {
+ unsigned char ch = *s;
+ x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
+ if (x > maxchar)
+ goto Error;
+ PyUnicode_WRITE(PyUnicode_1BYTE_KIND, outdata, outpos++, x);
+ ++s;
+ }
+ break;
+ }
+ else if (outkind == PyUnicode_2BYTE_KIND) {
+ void *outdata = PyUnicode_DATA(v);
+ while (s < e) {
+ unsigned char ch = *s;
+ x = PyUnicode_READ(PyUnicode_2BYTE_KIND, mapdata, ch);
+ if (x == 0xFFFE)
+ goto Error;
+ PyUnicode_WRITE(PyUnicode_2BYTE_KIND, outdata, outpos++, x);
+ ++s;
+ }
+ break;
+ }
+ }
+ ch = *s;
if (ch < maplen)
- x = mapstring[ch];
-
- if (x == 0xfffe) {
+ x = PyUnicode_READ(mapkind, mapdata, ch);
+ else
+ x = 0xfffe; /* invalid value */
+Error:
+ if (x == 0xfffe)
+ {
/* undefined mapping */
- outpos = p-PyUnicode_AS_UNICODE(v);
startinpos = s-starts;
endinpos = startinpos+1;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"charmap", "character maps to <undefined>",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p)) {
+ &v, &outpos)) {
goto onError;
}
continue;
}
- *p++ = x;
+
+ if (unicode_putchar(&v, &outpos, x) < 0)
+ goto onError;
++s;
}
}
@@ -5250,48 +7513,25 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
/* Apply mapping */
if (PyLong_Check(x)) {
long value = PyLong_AS_LONG(x);
- if (value < 0 || value > 0x10FFFF) {
- PyErr_SetString(PyExc_TypeError,
- "character mapping must be in range(0x110000)");
+ if (value < 0 || value > MAX_UNICODE) {
+ PyErr_Format(PyExc_TypeError,
+ "character mapping must be in range(0x%lx)",
+ (unsigned long)MAX_UNICODE + 1);
Py_DECREF(x);
goto onError;
}
-
-#ifndef Py_UNICODE_WIDE
- if (value > 0xFFFF) {
- /* see the code for 1-n mapping below */
- if (extrachars < 2) {
- /* resize first */
- Py_ssize_t oldpos = p - PyUnicode_AS_UNICODE(v);
- Py_ssize_t needed = 10 - extrachars;
- extrachars += needed;
- /* XXX overflow detection missing */
- if (_PyUnicode_Resize(&v,
- PyUnicode_GET_SIZE(v) + needed) < 0) {
- Py_DECREF(x);
- goto onError;
- }
- p = PyUnicode_AS_UNICODE(v) + oldpos;
- }
- value -= 0x10000;
- *p++ = 0xD800 | (value >> 10);
- *p++ = 0xDC00 | (value & 0x3FF);
- extrachars -= 2;
- }
- else
-#endif
- *p++ = (Py_UNICODE)value;
+ if (unicode_putchar(&v, &outpos, value) < 0)
+ goto onError;
}
else if (x == Py_None) {
/* undefined mapping */
- outpos = p-PyUnicode_AS_UNICODE(v);
startinpos = s-starts;
endinpos = startinpos+1;
if (unicode_decode_call_errorhandler(
errors, &errorHandler,
"charmap", "character maps to <undefined>",
&starts, &e, &startinpos, &endinpos, &exc, &s,
- &v, &outpos, &p)) {
+ &v, &outpos)) {
Py_DECREF(x);
goto onError;
}
@@ -5299,32 +7539,37 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
continue;
}
else if (PyUnicode_Check(x)) {
- Py_ssize_t targetsize = PyUnicode_GET_SIZE(x);
+ Py_ssize_t targetsize;
- if (targetsize == 1)
- /* 1-1 mapping */
- *p++ = *PyUnicode_AS_UNICODE(x);
+ if (PyUnicode_READY(x) == -1)
+ goto onError;
+ targetsize = PyUnicode_GET_LENGTH(x);
+ if (targetsize == 1) {
+ /* 1-1 mapping */
+ if (unicode_putchar(&v, &outpos,
+ PyUnicode_READ_CHAR(x, 0)) < 0)
+ goto onError;
+ }
else if (targetsize > 1) {
/* 1-n mapping */
if (targetsize > extrachars) {
/* resize first */
- Py_ssize_t oldpos = p - PyUnicode_AS_UNICODE(v);
Py_ssize_t needed = (targetsize - extrachars) + \
(targetsize << 2);
extrachars += needed;
/* XXX overflow detection missing */
- if (_PyUnicode_Resize(&v,
- PyUnicode_GET_SIZE(v) + needed) < 0) {
+ if (unicode_resize(&v,
+ PyUnicode_GET_LENGTH(v) + needed) < 0)
+ {
Py_DECREF(x);
goto onError;
}
- p = PyUnicode_AS_UNICODE(v) + oldpos;
}
- Py_UNICODE_COPY(p,
- PyUnicode_AS_UNICODE(x),
- targetsize);
- p += targetsize;
+ if (unicode_widen(&v, outpos, PyUnicode_MAX_CHAR_VALUE(x)) < 0)
+ goto onError;
+ PyUnicode_CopyCharacters(v, outpos, x, 0, targetsize);
+ outpos += targetsize;
extrachars -= targetsize;
}
/* 1-0 mapping: skip the character */
@@ -5340,12 +7585,11 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
++s;
}
}
- if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v))
- if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0)
- goto onError;
+ if (unicode_resize(&v, outpos) < 0)
+ goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
- return (PyObject *)v;
+ return unicode_result(v);
onError:
Py_XDECREF(errorHandler);
@@ -5356,7 +7600,7 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
/* Charmap encoding: the lookup table */
-struct encoding_map{
+struct encoding_map {
PyObject_HEAD
unsigned char level1[32];
int count2, count3;
@@ -5430,7 +7674,6 @@ static PyTypeObject EncodingMapType = {
PyObject*
PyUnicode_BuildEncodingMap(PyObject* string)
{
- Py_UNICODE *decode;
PyObject *result;
struct encoding_map *mresult;
int i;
@@ -5439,35 +7682,39 @@ PyUnicode_BuildEncodingMap(PyObject* string)
unsigned char level2[512];
unsigned char *mlevel1, *mlevel2, *mlevel3;
int count2 = 0, count3 = 0;
+ int kind;
+ void *data;
+ Py_ssize_t length;
+ Py_UCS4 ch;
- if (!PyUnicode_Check(string) || PyUnicode_GetSize(string) != 256) {
+ if (!PyUnicode_Check(string) || !PyUnicode_GET_LENGTH(string)) {
PyErr_BadArgument();
return NULL;
}
- decode = PyUnicode_AS_UNICODE(string);
+ kind = PyUnicode_KIND(string);
+ data = PyUnicode_DATA(string);
+ length = PyUnicode_GET_LENGTH(string);
+ length = Py_MIN(length, 256);
memset(level1, 0xFF, sizeof level1);
memset(level2, 0xFF, sizeof level2);
/* If there isn't a one-to-one mapping of NULL to \0,
or if there are non-BMP characters, we need to use
a mapping dictionary. */
- if (decode[0] != 0)
+ if (PyUnicode_READ(kind, data, 0) != 0)
need_dict = 1;
- for (i = 1; i < 256; i++) {
+ for (i = 1; i < length; i++) {
int l1, l2;
- if (decode[i] == 0
-#ifdef Py_UNICODE_WIDE
- || decode[i] > 0xFFFF
-#endif
- ) {
+ ch = PyUnicode_READ(kind, data, i);
+ if (ch == 0 || ch > 0xFFFF) {
need_dict = 1;
break;
}
- if (decode[i] == 0xFFFE)
+ if (ch == 0xFFFE)
/* unmapped character */
continue;
- l1 = decode[i] >> 11;
- l2 = decode[i] >> 7;
+ l1 = ch >> 11;
+ l2 = ch >> 7;
if (level1[l1] == 0xFF)
level1[l1] = count2++;
if (level2[l2] == 0xFF)
@@ -5482,9 +7729,8 @@ PyUnicode_BuildEncodingMap(PyObject* string)
PyObject *key, *value;
if (!result)
return NULL;
- for (i = 0; i < 256; i++) {
- key = value = NULL;
- key = PyLong_FromLong(decode[i]);
+ for (i = 0; i < length; i++) {
+ key = PyLong_FromLong(PyUnicode_READ(kind, data, i));
value = PyLong_FromLong(i);
if (!key || !value)
goto failed1;
@@ -5517,17 +7763,18 @@ PyUnicode_BuildEncodingMap(PyObject* string)
memset(mlevel2, 0xFF, 16*count2);
memset(mlevel3, 0, 128*count3);
count3 = 0;
- for (i = 1; i < 256; i++) {
+ for (i = 1; i < length; i++) {
int o1, o2, o3, i2, i3;
- if (decode[i] == 0xFFFE)
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch == 0xFFFE)
/* unmapped character */
continue;
- o1 = decode[i]>>11;
- o2 = (decode[i]>>7) & 0xF;
+ o1 = ch>>11;
+ o2 = (ch>>7) & 0xF;
i2 = 16*mlevel1[o1] + o2;
if (mlevel2[i2] == 0xFF)
mlevel2[i2] = count3++;
- o3 = decode[i] & 0x7F;
+ o3 = ch & 0x7F;
i3 = 128*mlevel2[i2] + o3;
mlevel3[i3] = i;
}
@@ -5535,7 +7782,7 @@ PyUnicode_BuildEncodingMap(PyObject* string)
}
static int
-encoding_map_lookup(Py_UNICODE c, PyObject *mapping)
+encoding_map_lookup(Py_UCS4 c, PyObject *mapping)
{
struct encoding_map *map = (struct encoding_map*)mapping;
int l1 = c>>11;
@@ -5543,11 +7790,8 @@ encoding_map_lookup(Py_UNICODE c, PyObject *mapping)
int l3 = c & 0x7F;
int i;
-#ifdef Py_UNICODE_WIDE
- if (c > 0xFFFF) {
+ if (c > 0xFFFF)
return -1;
- }
-#endif
if (c == 0)
return 0;
/* level 1*/
@@ -5571,7 +7815,8 @@ encoding_map_lookup(Py_UNICODE c, PyObject *mapping)
/* Lookup the character ch in the mapping. If the character
can't be found, Py_None is returned (or NULL, if another
error occurred). */
-static PyObject *charmapencode_lookup(Py_UNICODE c, PyObject *mapping)
+static PyObject *
+charmapencode_lookup(Py_UCS4 c, PyObject *mapping)
{
PyObject *w = PyLong_FromLong((long)c);
PyObject *x;
@@ -5628,16 +7873,16 @@ charmapencode_resize(PyObject **outobj, Py_ssize_t *outpos, Py_ssize_t requireds
typedef enum charmapencode_result {
enc_SUCCESS, enc_FAILED, enc_EXCEPTION
-}charmapencode_result;
+} charmapencode_result;
/* lookup the character, put the result in the output string and adjust
various state variables. Resize the output bytes object if not enough
space is available. Return a new reference to the object that
was put in the output buffer, or Py_None, if the mapping was undefined
(in which case no character was written) or NULL, if a
reallocation error occurred. The caller must decref the result */
-static
-charmapencode_result charmapencode_output(Py_UNICODE c, PyObject *mapping,
- PyObject **outobj, Py_ssize_t *outpos)
+static charmapencode_result
+charmapencode_output(Py_UCS4 c, PyObject *mapping,
+ PyObject **outobj, Py_ssize_t *outpos)
{
PyObject *rep;
char *outstart;
@@ -5693,17 +7938,19 @@ charmapencode_result charmapencode_output(Py_UNICODE c, PyObject *mapping,
/* handle an error in PyUnicode_EncodeCharmap
Return 0 on success, -1 on error */
-static
-int charmap_encoding_error(
- const Py_UNICODE *p, Py_ssize_t size, Py_ssize_t *inpos, PyObject *mapping,
+static int
+charmap_encoding_error(
+ PyObject *unicode, Py_ssize_t *inpos, PyObject *mapping,
PyObject **exceptionObject,
int *known_errorHandler, PyObject **errorHandler, const char *errors,
PyObject **res, Py_ssize_t *respos)
{
PyObject *repunicode = NULL; /* initialize to prevent gcc warning */
- Py_ssize_t repsize;
+ Py_ssize_t size, repsize;
Py_ssize_t newpos;
- Py_UNICODE *uni2;
+ enum PyUnicode_Kind kind;
+ void *data;
+ Py_ssize_t index;
/* startpos for collecting unencodable chars */
Py_ssize_t collstartpos = *inpos;
Py_ssize_t collendpos = *inpos+1;
@@ -5711,19 +7958,26 @@ int charmap_encoding_error(
char *encoding = "charmap";
char *reason = "character maps to <undefined>";
charmapencode_result x;
+ Py_UCS4 ch;
+ int val;
+ if (PyUnicode_READY(unicode) == -1)
+ return -1;
+ size = PyUnicode_GET_LENGTH(unicode);
/* find all unencodable characters */
while (collendpos < size) {
PyObject *rep;
if (Py_TYPE(mapping) == &EncodingMapType) {
- int res = encoding_map_lookup(p[collendpos], mapping);
- if (res != -1)
+ ch = PyUnicode_READ_CHAR(unicode, collendpos);
+ val = encoding_map_lookup(ch, mapping);
+ if (val != -1)
break;
++collendpos;
continue;
}
- rep = charmapencode_lookup(p[collendpos], mapping);
+ ch = PyUnicode_READ_CHAR(unicode, collendpos);
+ rep = charmapencode_lookup(ch, mapping);
if (rep==NULL)
return -1;
else if (rep!=Py_None) {
@@ -5749,7 +8003,7 @@ int charmap_encoding_error(
}
switch (*known_errorHandler) {
case 1: /* strict */
- raise_encode_exception(exceptionObject, encoding, p, size, collstartpos, collendpos, reason);
+ raise_encode_exception(exceptionObject, encoding, unicode, collstartpos, collendpos, reason);
return -1;
case 2: /* replace */
for (collpos = collstartpos; collpos<collendpos; ++collpos) {
@@ -5758,7 +8012,7 @@ int charmap_encoding_error(
return -1;
}
else if (x==enc_FAILED) {
- raise_encode_exception(exceptionObject, encoding, p, size, collstartpos, collendpos, reason);
+ raise_encode_exception(exceptionObject, encoding, unicode, collstartpos, collendpos, reason);
return -1;
}
}
@@ -5771,13 +8025,13 @@ int charmap_encoding_error(
for (collpos = collstartpos; collpos < collendpos; ++collpos) {
char buffer[2+29+1+1];
char *cp;
- sprintf(buffer, "&#%d;", (int)p[collpos]);
+ sprintf(buffer, "&#%d;", (int)PyUnicode_READ_CHAR(unicode, collpos));
for (cp = buffer; *cp; ++cp) {
x = charmapencode_output(*cp, mapping, res, respos);
if (x==enc_EXCEPTION)
return -1;
else if (x==enc_FAILED) {
- raise_encode_exception(exceptionObject, encoding, p, size, collstartpos, collendpos, reason);
+ raise_encode_exception(exceptionObject, encoding, unicode, collstartpos, collendpos, reason);
return -1;
}
}
@@ -5786,7 +8040,7 @@ int charmap_encoding_error(
break;
default:
repunicode = unicode_encode_call_errorhandler(errors, errorHandler,
- encoding, reason, p, size, exceptionObject,
+ encoding, reason, unicode, exceptionObject,
collstartpos, collendpos, &newpos);
if (repunicode == NULL)
return -1;
@@ -5810,15 +8064,23 @@ int charmap_encoding_error(
break;
}
/* generate replacement */
- repsize = PyUnicode_GET_SIZE(repunicode);
- for (uni2 = PyUnicode_AS_UNICODE(repunicode); repsize-->0; ++uni2) {
- x = charmapencode_output(*uni2, mapping, res, respos);
+ if (PyUnicode_READY(repunicode) == -1) {
+ Py_DECREF(repunicode);
+ return -1;
+ }
+ repsize = PyUnicode_GET_LENGTH(repunicode);
+ data = PyUnicode_DATA(repunicode);
+ kind = PyUnicode_KIND(repunicode);
+ for (index = 0; index < repsize; index++) {
+ Py_UCS4 repch = PyUnicode_READ(kind, data, index);
+ x = charmapencode_output(repch, mapping, res, respos);
if (x==enc_EXCEPTION) {
+ Py_DECREF(repunicode);
return -1;
}
else if (x==enc_FAILED) {
Py_DECREF(repunicode);
- raise_encode_exception(exceptionObject, encoding, p, size, collstartpos, collendpos, reason);
+ raise_encode_exception(exceptionObject, encoding, unicode, collstartpos, collendpos, reason);
return -1;
}
}
@@ -5828,15 +8090,16 @@ int charmap_encoding_error(
return 0;
}
-PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *p,
- Py_ssize_t size,
- PyObject *mapping,
- const char *errors)
+PyObject *
+_PyUnicode_EncodeCharmap(PyObject *unicode,
+ PyObject *mapping,
+ const char *errors)
{
/* output object */
PyObject *res = NULL;
/* current input position */
Py_ssize_t inpos = 0;
+ Py_ssize_t size;
/* current output position */
Py_ssize_t respos = 0;
PyObject *errorHandler = NULL;
@@ -5846,9 +8109,13 @@ PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *p,
* 3=ignore, 4=xmlcharrefreplace */
int known_errorHandler = -1;
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ size = PyUnicode_GET_LENGTH(unicode);
+
/* Default to Latin-1 */
if (mapping == NULL)
- return PyUnicode_EncodeLatin1(p, size, errors);
+ return unicode_encode_ucs1(unicode, errors, 256);
/* allocate enough for a simple encoding without
replacements, if we need more, we'll resize */
@@ -5859,12 +8126,13 @@ PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *p,
return res;
while (inpos<size) {
+ Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, inpos);
/* try to encode it */
- charmapencode_result x = charmapencode_output(p[inpos], mapping, &res, &respos);
+ charmapencode_result x = charmapencode_output(ch, mapping, &res, &respos);
if (x==enc_EXCEPTION) /* error */
goto onError;
if (x==enc_FAILED) { /* unencodable character */
- if (charmap_encoding_error(p, size, &inpos, mapping,
+ if (charmap_encoding_error(unicode, &inpos, mapping,
&exc,
&known_errorHandler, &errorHandler, errors,
&res, &respos)) {
@@ -5892,28 +8160,43 @@ PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *p,
return NULL;
}
-PyObject *PyUnicode_AsCharmapString(PyObject *unicode,
- PyObject *mapping)
+/* Deprecated */
+PyObject *
+PyUnicode_EncodeCharmap(const Py_UNICODE *p,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors)
+{
+ PyObject *result;
+ PyObject *unicode = PyUnicode_FromUnicode(p, size);
+ if (unicode == NULL)
+ return NULL;
+ result = _PyUnicode_EncodeCharmap(unicode, mapping, errors);
+ Py_DECREF(unicode);
+ return result;
+}
+
+PyObject *
+PyUnicode_AsCharmapString(PyObject *unicode,
+ PyObject *mapping)
{
if (!PyUnicode_Check(unicode) || mapping == NULL) {
PyErr_BadArgument();
return NULL;
}
- return PyUnicode_EncodeCharmap(PyUnicode_AS_UNICODE(unicode),
- PyUnicode_GET_SIZE(unicode),
- mapping,
- NULL);
+ return _PyUnicode_EncodeCharmap(unicode, mapping, NULL);
}
/* create or adjust a UnicodeTranslateError */
-static void make_translate_exception(PyObject **exceptionObject,
- const Py_UNICODE *unicode, Py_ssize_t size,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason)
+static void
+make_translate_exception(PyObject **exceptionObject,
+ PyObject *unicode,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ const char *reason)
{
if (*exceptionObject == NULL) {
- *exceptionObject = PyUnicodeTranslateError_Create(
- unicode, size, startpos, endpos, reason);
+ *exceptionObject = _PyUnicodeTranslateError_Create(
+ unicode, startpos, endpos, reason);
}
else {
if (PyUnicodeTranslateError_SetStart(*exceptionObject, startpos))
@@ -5930,13 +8213,14 @@ static void make_translate_exception(PyObject **exceptionObject,
}
/* raises a UnicodeTranslateError */
-static void raise_translate_exception(PyObject **exceptionObject,
- const Py_UNICODE *unicode, Py_ssize_t size,
- Py_ssize_t startpos, Py_ssize_t endpos,
- const char *reason)
+static void
+raise_translate_exception(PyObject **exceptionObject,
+ PyObject *unicode,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ const char *reason)
{
make_translate_exception(exceptionObject,
- unicode, size, startpos, endpos, reason);
+ unicode, startpos, endpos, reason);
if (*exceptionObject != NULL)
PyCodec_StrictErrors(*exceptionObject);
}
@@ -5945,12 +8229,13 @@ static void raise_translate_exception(PyObject **exceptionObject,
build arguments, call the callback and check the arguments,
put the result into newpos and return the replacement string, which
has to be freed by the caller */
-static PyObject *unicode_translate_call_errorhandler(const char *errors,
- PyObject **errorHandler,
- const char *reason,
- const Py_UNICODE *unicode, Py_ssize_t size, PyObject **exceptionObject,
- Py_ssize_t startpos, Py_ssize_t endpos,
- Py_ssize_t *newpos)
+static PyObject *
+unicode_translate_call_errorhandler(const char *errors,
+ PyObject **errorHandler,
+ const char *reason,
+ PyObject *unicode, PyObject **exceptionObject,
+ Py_ssize_t startpos, Py_ssize_t endpos,
+ Py_ssize_t *newpos)
{
static char *argparse = "O!n;translating error handler must return (str, int) tuple";
@@ -5965,7 +8250,7 @@ static PyObject *unicode_translate_call_errorhandler(const char *errors,
}
make_translate_exception(exceptionObject,
- unicode, size, startpos, endpos, reason);
+ unicode, startpos, endpos, reason);
if (*exceptionObject == NULL)
return NULL;
@@ -5984,10 +8269,10 @@ static PyObject *unicode_translate_call_errorhandler(const char *errors,
return NULL;
}
if (i_newpos<0)
- *newpos = size+i_newpos;
+ *newpos = PyUnicode_GET_LENGTH(unicode)+i_newpos;
else
*newpos = i_newpos;
- if (*newpos<0 || *newpos>size) {
+ if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) {
PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos);
Py_DECREF(restuple);
return NULL;
@@ -6000,8 +8285,8 @@ static PyObject *unicode_translate_call_errorhandler(const char *errors,
/* Lookup the character ch in the mapping and put the result in result,
which must be decrefed by the caller.
Return 0 on success, -1 on error */
-static
-int charmaptranslate_lookup(Py_UNICODE c, PyObject *mapping, PyObject **result)
+static int
+charmaptranslate_lookup(Py_UCS4 c, PyObject *mapping, PyObject **result)
{
PyObject *w = PyLong_FromLong((long)c);
PyObject *x;
@@ -6050,20 +8335,21 @@ int charmaptranslate_lookup(Py_UNICODE c, PyObject *mapping, PyObject **result)
/* ensure that *outobj is at least requiredsize characters long,
if not reallocate and adjust various state variables.
Return 0 on success, -1 on error */
-static
-int charmaptranslate_makespace(PyObject **outobj, Py_UNICODE **outp,
+static int
+charmaptranslate_makespace(Py_UCS4 **outobj, Py_ssize_t *psize,
Py_ssize_t requiredsize)
{
- Py_ssize_t oldsize = PyUnicode_GET_SIZE(*outobj);
+ Py_ssize_t oldsize = *psize;
+ Py_UCS4 *new_outobj;
if (requiredsize > oldsize) {
- /* remember old output position */
- Py_ssize_t outpos = *outp-PyUnicode_AS_UNICODE(*outobj);
/* exponentially overallocate to minimize reallocations */
if (requiredsize < 2 * oldsize)
requiredsize = 2 * oldsize;
- if (PyUnicode_Resize(outobj, requiredsize) < 0)
+ new_outobj = PyMem_Realloc(*outobj, requiredsize * sizeof(Py_UCS4));
+ if (new_outobj == 0)
return -1;
- *outp = PyUnicode_AS_UNICODE(*outobj) + outpos;
+ *outobj = new_outobj;
+ *psize = requiredsize;
}
return 0;
}
@@ -6073,38 +8359,44 @@ int charmaptranslate_makespace(PyObject **outobj, Py_UNICODE **outp,
undefined (in which case no character was written).
The called must decref result.
Return 0 on success, -1 on error. */
-static
-int charmaptranslate_output(const Py_UNICODE *startinp, const Py_UNICODE *curinp,
- Py_ssize_t insize, PyObject *mapping, PyObject **outobj, Py_UNICODE **outp,
- PyObject **res)
+static int
+charmaptranslate_output(PyObject *input, Py_ssize_t ipos,
+ PyObject *mapping, Py_UCS4 **output,
+ Py_ssize_t *osize, Py_ssize_t *opos,
+ PyObject **res)
{
- if (charmaptranslate_lookup(*curinp, mapping, res))
+ Py_UCS4 curinp = PyUnicode_READ_CHAR(input, ipos);
+ if (charmaptranslate_lookup(curinp, mapping, res))
return -1;
if (*res==NULL) {
/* not found => default to 1:1 mapping */
- *(*outp)++ = *curinp;
+ (*output)[(*opos)++] = curinp;
}
else if (*res==Py_None)
;
else if (PyLong_Check(*res)) {
/* no overflow check, because we know that the space is enough */
- *(*outp)++ = (Py_UNICODE)PyLong_AS_LONG(*res);
+ (*output)[(*opos)++] = (Py_UCS4)PyLong_AS_LONG(*res);
}
else if (PyUnicode_Check(*res)) {
- Py_ssize_t repsize = PyUnicode_GET_SIZE(*res);
+ Py_ssize_t repsize;
+ if (PyUnicode_READY(*res) == -1)
+ return -1;
+ repsize = PyUnicode_GET_LENGTH(*res);
if (repsize==1) {
/* no overflow check, because we know that the space is enough */
- *(*outp)++ = *PyUnicode_AS_UNICODE(*res);
+ (*output)[(*opos)++] = PyUnicode_READ_CHAR(*res, 0);
}
else if (repsize!=0) {
/* more than one character */
- Py_ssize_t requiredsize = (*outp-PyUnicode_AS_UNICODE(*outobj)) +
- (insize - (curinp-startinp)) +
+ Py_ssize_t requiredsize = *opos +
+ (PyUnicode_GET_LENGTH(input) - ipos) +
repsize - 1;
- if (charmaptranslate_makespace(outobj, outp, requiredsize))
+ Py_ssize_t i;
+ if (charmaptranslate_makespace(output, osize, requiredsize))
return -1;
- memcpy(*outp, PyUnicode_AS_UNICODE(*res), sizeof(Py_UNICODE)*repsize);
- *outp += repsize;
+ for(i = 0; i < repsize; i++)
+ (*output)[(*opos)++] = PyUnicode_READ_CHAR(*res, i);
}
}
else
@@ -6112,20 +8404,21 @@ int charmaptranslate_output(const Py_UNICODE *startinp, const Py_UNICODE *curinp
return 0;
}
-PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *p,
- Py_ssize_t size,
- PyObject *mapping,
- const char *errors)
+PyObject *
+_PyUnicode_TranslateCharmap(PyObject *input,
+ PyObject *mapping,
+ const char *errors)
{
- /* output object */
- PyObject *res = NULL;
- /* pointers to the beginning and end+1 of input */
- const Py_UNICODE *startp = p;
- const Py_UNICODE *endp = p + size;
- /* pointer into the output */
- Py_UNICODE *str;
+ /* input object */
+ char *idata;
+ Py_ssize_t size, i;
+ int kind;
+ /* output buffer */
+ Py_UCS4 *output = NULL;
+ Py_ssize_t osize;
+ PyObject *res;
/* current output position */
- Py_ssize_t respos = 0;
+ Py_ssize_t opos;
char *reason = "character maps to <undefined>";
PyObject *errorHandler = NULL;
PyObject *exc = NULL;
@@ -6139,38 +8432,52 @@ PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *p,
return NULL;
}
+ if (PyUnicode_READY(input) == -1)
+ return NULL;
+ idata = (char*)PyUnicode_DATA(input);
+ kind = PyUnicode_KIND(input);
+ size = PyUnicode_GET_LENGTH(input);
+ i = 0;
+
+ if (size == 0) {
+ Py_INCREF(input);
+ return input;
+ }
+
/* allocate enough for a simple 1:1 translation without
replacements, if we need more, we'll resize */
- res = PyUnicode_FromUnicode(NULL, size);
- if (res == NULL)
+ osize = size;
+ output = PyMem_Malloc(osize * sizeof(Py_UCS4));
+ opos = 0;
+ if (output == NULL) {
+ PyErr_NoMemory();
goto onError;
- if (size == 0)
- return res;
- str = PyUnicode_AS_UNICODE(res);
+ }
- while (p<endp) {
+ while (i<size) {
/* try to encode it */
PyObject *x = NULL;
- if (charmaptranslate_output(startp, p, size, mapping, &res, &str, &x)) {
+ if (charmaptranslate_output(input, i, mapping,
+ &output, &osize, &opos, &x)) {
Py_XDECREF(x);
goto onError;
}
Py_XDECREF(x);
if (x!=Py_None) /* it worked => adjust input pointer */
- ++p;
+ ++i;
else { /* untranslatable character */
PyObject *repunicode = NULL; /* initialize to prevent gcc warning */
Py_ssize_t repsize;
Py_ssize_t newpos;
- Py_UNICODE *uni2;
+ Py_ssize_t uni2;
/* startpos for collecting untranslatable chars */
- const Py_UNICODE *collstart = p;
- const Py_UNICODE *collend = p+1;
- const Py_UNICODE *coll;
+ Py_ssize_t collstart = i;
+ Py_ssize_t collend = i+1;
+ Py_ssize_t coll;
/* find all untranslatable characters */
- while (collend < endp) {
- if (charmaptranslate_lookup(*collend, mapping, &x))
+ while (collend < size) {
+ if (charmaptranslate_lookup(PyUnicode_READ(kind,idata, collend), mapping, &x))
goto onError;
Py_XDECREF(x);
if (x!=Py_None)
@@ -6193,261 +8500,419 @@ PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *p,
}
switch (known_errorHandler) {
case 1: /* strict */
- raise_translate_exception(&exc, startp, size, collstart-startp, collend-startp, reason);
+ raise_translate_exception(&exc, input, collstart,
+ collend, reason);
goto onError;
case 2: /* replace */
/* No need to check for space, this is a 1:1 replacement */
- for (coll = collstart; coll<collend; ++coll)
- *str++ = '?';
+ for (coll = collstart; coll<collend; coll++)
+ output[opos++] = '?';
/* fall through */
case 3: /* ignore */
- p = collend;
+ i = collend;
break;
case 4: /* xmlcharrefreplace */
- /* generate replacement (temporarily (mis)uses p) */
- for (p = collstart; p < collend; ++p) {
+ /* generate replacement (temporarily (mis)uses i) */
+ for (i = collstart; i < collend; ++i) {
char buffer[2+29+1+1];
char *cp;
- sprintf(buffer, "&#%d;", (int)*p);
- if (charmaptranslate_makespace(&res, &str,
- (str-PyUnicode_AS_UNICODE(res))+strlen(buffer)+(endp-collend)))
+ sprintf(buffer, "&#%d;", PyUnicode_READ(kind, idata, i));
+ if (charmaptranslate_makespace(&output, &osize,
+ opos+strlen(buffer)+(size-collend)))
goto onError;
for (cp = buffer; *cp; ++cp)
- *str++ = *cp;
+ output[opos++] = *cp;
}
- p = collend;
+ i = collend;
break;
default:
repunicode = unicode_translate_call_errorhandler(errors, &errorHandler,
- reason, startp, size, &exc,
- collstart-startp, collend-startp, &newpos);
+ reason, input, &exc,
+ collstart, collend, &newpos);
if (repunicode == NULL)
goto onError;
+ if (PyUnicode_READY(repunicode) == -1) {
+ Py_DECREF(repunicode);
+ goto onError;
+ }
/* generate replacement */
- repsize = PyUnicode_GET_SIZE(repunicode);
- if (charmaptranslate_makespace(&res, &str,
- (str-PyUnicode_AS_UNICODE(res))+repsize+(endp-collend))) {
+ repsize = PyUnicode_GET_LENGTH(repunicode);
+ if (charmaptranslate_makespace(&output, &osize,
+ opos+repsize+(size-collend))) {
Py_DECREF(repunicode);
goto onError;
}
- for (uni2 = PyUnicode_AS_UNICODE(repunicode); repsize-->0; ++uni2)
- *str++ = *uni2;
- p = startp + newpos;
+ for (uni2 = 0; repsize-->0; ++uni2)
+ output[opos++] = PyUnicode_READ_CHAR(repunicode, uni2);
+ i = newpos;
Py_DECREF(repunicode);
}
}
}
- /* Resize if we allocated to much */
- respos = str-PyUnicode_AS_UNICODE(res);
- if (respos<PyUnicode_GET_SIZE(res)) {
- if (PyUnicode_Resize(&res, respos) < 0)
- goto onError;
- }
+ res = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, output, opos);
+ if (!res)
+ goto onError;
+ PyMem_Free(output);
Py_XDECREF(exc);
Py_XDECREF(errorHandler);
return res;
onError:
- Py_XDECREF(res);
+ PyMem_Free(output);
Py_XDECREF(exc);
Py_XDECREF(errorHandler);
return NULL;
}
-PyObject *PyUnicode_Translate(PyObject *str,
- PyObject *mapping,
- const char *errors)
+/* Deprecated. Use PyUnicode_Translate instead. */
+PyObject *
+PyUnicode_TranslateCharmap(const Py_UNICODE *p,
+ Py_ssize_t size,
+ PyObject *mapping,
+ const char *errors)
+{
+ PyObject *result;
+ PyObject *unicode = PyUnicode_FromUnicode(p, size);
+ if (!unicode)
+ return NULL;
+ result = _PyUnicode_TranslateCharmap(unicode, mapping, errors);
+ Py_DECREF(unicode);
+ return result;
+}
+
+PyObject *
+PyUnicode_Translate(PyObject *str,
+ PyObject *mapping,
+ const char *errors)
{
PyObject *result;
str = PyUnicode_FromObject(str);
if (str == NULL)
- goto onError;
- result = PyUnicode_TranslateCharmap(PyUnicode_AS_UNICODE(str),
- PyUnicode_GET_SIZE(str),
- mapping,
- errors);
+ return NULL;
+ result = _PyUnicode_TranslateCharmap(str, mapping, errors);
Py_DECREF(str);
return result;
+}
- onError:
- Py_XDECREF(str);
- return NULL;
+static Py_UCS4
+fix_decimal_and_space_to_ascii(PyObject *self)
+{
+ /* No need to call PyUnicode_READY(self) because this function is only
+ called as a callback from fixup() which does it already. */
+ const Py_ssize_t len = PyUnicode_GET_LENGTH(self);
+ const int kind = PyUnicode_KIND(self);
+ void *data = PyUnicode_DATA(self);
+ Py_UCS4 maxchar = 127, ch, fixed;
+ int modified = 0;
+ Py_ssize_t i;
+
+ for (i = 0; i < len; ++i) {
+ ch = PyUnicode_READ(kind, data, i);
+ fixed = 0;
+ if (ch > 127) {
+ if (Py_UNICODE_ISSPACE(ch))
+ fixed = ' ';
+ else {
+ const int decimal = Py_UNICODE_TODECIMAL(ch);
+ if (decimal >= 0)
+ fixed = '0' + decimal;
+ }
+ if (fixed != 0) {
+ modified = 1;
+ maxchar = MAX_MAXCHAR(maxchar, fixed);
+ PyUnicode_WRITE(kind, data, i, fixed);
+ }
+ else
+ maxchar = MAX_MAXCHAR(maxchar, ch);
+ }
+ }
+
+ return (modified) ? maxchar : 0;
+}
+
+PyObject *
+_PyUnicode_TransformDecimalAndSpaceToASCII(PyObject *unicode)
+{
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
+ if (PyUnicode_MAX_CHAR_VALUE(unicode) <= 127) {
+ /* If the string is already ASCII, just return the same string */
+ Py_INCREF(unicode);
+ return unicode;
+ }
+ return fixup(unicode, fix_decimal_and_space_to_ascii);
}
PyObject *
PyUnicode_TransformDecimalToASCII(Py_UNICODE *s,
Py_ssize_t length)
{
- PyObject *result;
- Py_UNICODE *p; /* write pointer into result */
+ PyObject *decimal;
Py_ssize_t i;
+ Py_UCS4 maxchar;
+ enum PyUnicode_Kind kind;
+ void *data;
+
+ maxchar = 127;
+ for (i = 0; i < length; i++) {
+ Py_UNICODE ch = s[i];
+ if (ch > 127) {
+ int decimal = Py_UNICODE_TODECIMAL(ch);
+ if (decimal >= 0)
+ ch = '0' + decimal;
+ maxchar = MAX_MAXCHAR(maxchar, ch);
+ }
+ }
+
/* Copy to a new string */
- result = (PyObject *)_PyUnicode_New(length);
- Py_UNICODE_COPY(PyUnicode_AS_UNICODE(result), s, length);
- if (result == NULL)
- return result;
- p = PyUnicode_AS_UNICODE(result);
+ decimal = PyUnicode_New(length, maxchar);
+ if (decimal == NULL)
+ return decimal;
+ kind = PyUnicode_KIND(decimal);
+ data = PyUnicode_DATA(decimal);
/* Iterate over code points */
for (i = 0; i < length; i++) {
- Py_UNICODE ch =s[i];
+ Py_UNICODE ch = s[i];
if (ch > 127) {
int decimal = Py_UNICODE_TODECIMAL(ch);
if (decimal >= 0)
- p[i] = '0' + decimal;
+ ch = '0' + decimal;
}
+ PyUnicode_WRITE(kind, data, i, ch);
}
- return result;
+ return unicode_result(decimal);
}
/* --- Decimal Encoder ---------------------------------------------------- */
-int PyUnicode_EncodeDecimal(Py_UNICODE *s,
- Py_ssize_t length,
- char *output,
- const char *errors)
+int
+PyUnicode_EncodeDecimal(Py_UNICODE *s,
+ Py_ssize_t length,
+ char *output,
+ const char *errors)
{
- Py_UNICODE *p, *end;
- PyObject *errorHandler = NULL;
- PyObject *exc = NULL;
- const char *encoding = "decimal";
- const char *reason = "invalid decimal Unicode string";
- /* the following variable is used for caching string comparisons
- * -1=not initialized, 0=unknown, 1=strict, 2=replace, 3=ignore, 4=xmlcharrefreplace */
- int known_errorHandler = -1;
+ PyObject *unicode;
+ Py_ssize_t i;
+ enum PyUnicode_Kind kind;
+ void *data;
if (output == NULL) {
PyErr_BadArgument();
return -1;
}
- p = s;
- end = s + length;
- while (p < end) {
- register Py_UNICODE ch = *p;
+ unicode = PyUnicode_FromUnicode(s, length);
+ if (unicode == NULL)
+ return -1;
+
+ if (PyUnicode_READY(unicode) == -1) {
+ Py_DECREF(unicode);
+ return -1;
+ }
+ kind = PyUnicode_KIND(unicode);
+ data = PyUnicode_DATA(unicode);
+
+ for (i=0; i < length; ) {
+ PyObject *exc;
+ Py_UCS4 ch;
int decimal;
- PyObject *repunicode;
- Py_ssize_t repsize;
- Py_ssize_t newpos;
- Py_UNICODE *uni2;
- Py_UNICODE *collstart;
- Py_UNICODE *collend;
+ Py_ssize_t startpos;
+
+ ch = PyUnicode_READ(kind, data, i);
if (Py_UNICODE_ISSPACE(ch)) {
*output++ = ' ';
- ++p;
+ i++;
continue;
}
decimal = Py_UNICODE_TODECIMAL(ch);
if (decimal >= 0) {
*output++ = '0' + decimal;
- ++p;
+ i++;
continue;
}
if (0 < ch && ch < 256) {
*output++ = (char)ch;
- ++p;
+ i++;
continue;
}
- /* All other characters are considered unencodable */
- collstart = p;
- for (collend = p+1; collend < end; collend++) {
- if ((0 < *collend && *collend < 256) ||
- Py_UNICODE_ISSPACE(*collend) ||
- 0 <= Py_UNICODE_TODECIMAL(*collend))
- break;
- }
- /* cache callback name lookup
- * (if not done yet, i.e. it's the first error) */
- if (known_errorHandler==-1) {
- if ((errors==NULL) || (!strcmp(errors, "strict")))
- known_errorHandler = 1;
- else if (!strcmp(errors, "replace"))
- known_errorHandler = 2;
- else if (!strcmp(errors, "ignore"))
- known_errorHandler = 3;
- else if (!strcmp(errors, "xmlcharrefreplace"))
- known_errorHandler = 4;
+
+ startpos = i;
+ exc = NULL;
+ raise_encode_exception(&exc, "decimal", unicode,
+ startpos, startpos+1,
+ "invalid decimal Unicode string");
+ Py_XDECREF(exc);
+ Py_DECREF(unicode);
+ return -1;
+ }
+ /* 0-terminate the output string */
+ *output++ = '\0';
+ Py_DECREF(unicode);
+ return 0;
+}
+
+/* --- Helpers ------------------------------------------------------------ */
+
+static Py_ssize_t
+any_find_slice(int direction, PyObject* s1, PyObject* s2,
+ Py_ssize_t start,
+ Py_ssize_t end)
+{
+ int kind1, kind2, kind;
+ void *buf1, *buf2;
+ Py_ssize_t len1, len2, result;
+
+ kind1 = PyUnicode_KIND(s1);
+ kind2 = PyUnicode_KIND(s2);
+ kind = kind1 > kind2 ? kind1 : kind2;
+ buf1 = PyUnicode_DATA(s1);
+ buf2 = PyUnicode_DATA(s2);
+ if (kind1 != kind)
+ buf1 = _PyUnicode_AsKind(s1, kind);
+ if (!buf1)
+ return -2;
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(s2, kind);
+ if (!buf2) {
+ if (kind1 != kind) PyMem_Free(buf1);
+ return -2;
+ }
+ len1 = PyUnicode_GET_LENGTH(s1);
+ len2 = PyUnicode_GET_LENGTH(s2);
+
+ if (direction > 0) {
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2))
+ result = asciilib_find_slice(buf1, len1, buf2, len2, start, end);
else
- known_errorHandler = 0;
+ result = ucs1lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ default:
+ assert(0); result = -2;
}
- switch (known_errorHandler) {
- case 1: /* strict */
- raise_encode_exception(&exc, encoding, s, length, collstart-s, collend-s, reason);
- goto onError;
- case 2: /* replace */
- for (p = collstart; p < collend; ++p)
- *output++ = '?';
- /* fall through */
- case 3: /* ignore */
- p = collend;
+ }
+ else {
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2))
+ result = asciilib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ else
+ result = ucs1lib_rfind_slice(buf1, len1, buf2, len2, start, end);
break;
- case 4: /* xmlcharrefreplace */
- /* generate replacement (temporarily (mis)uses p) */
- for (p = collstart; p < collend; ++p)
- output += sprintf(output, "&#%d;", (int)*p);
- p = collend;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_rfind_slice(buf1, len1, buf2, len2, start, end);
break;
default:
- repunicode = unicode_encode_call_errorhandler(errors, &errorHandler,
- encoding, reason, s, length, &exc,
- collstart-s, collend-s, &newpos);
- if (repunicode == NULL)
- goto onError;
- if (!PyUnicode_Check(repunicode)) {
- /* Byte results not supported, since they have no decimal property. */
- PyErr_SetString(PyExc_TypeError, "error handler should return unicode");
- Py_DECREF(repunicode);
- goto onError;
- }
- /* generate replacement */
- repsize = PyUnicode_GET_SIZE(repunicode);
- for (uni2 = PyUnicode_AS_UNICODE(repunicode); repsize-->0; ++uni2) {
- Py_UNICODE ch = *uni2;
- if (Py_UNICODE_ISSPACE(ch))
- *output++ = ' ';
- else {
- decimal = Py_UNICODE_TODECIMAL(ch);
- if (decimal >= 0)
- *output++ = '0' + decimal;
- else if (0 < ch && ch < 256)
- *output++ = (char)ch;
- else {
- Py_DECREF(repunicode);
- raise_encode_exception(&exc, encoding,
- s, length, collstart-s, collend-s, reason);
- goto onError;
- }
- }
- }
- p = s + newpos;
- Py_DECREF(repunicode);
+ assert(0); result = -2;
}
}
- /* 0-terminate the output string */
- *output++ = '\0';
- Py_XDECREF(exc);
- Py_XDECREF(errorHandler);
- return 0;
- onError:
- Py_XDECREF(exc);
- Py_XDECREF(errorHandler);
- return -1;
+ if (kind1 != kind)
+ PyMem_Free(buf1);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
+
+ return result;
}
-/* --- Helpers ------------------------------------------------------------ */
+Py_ssize_t
+_PyUnicode_InsertThousandsGrouping(
+ PyObject *unicode, Py_ssize_t index,
+ Py_ssize_t n_buffer,
+ void *digits, Py_ssize_t n_digits,
+ Py_ssize_t min_width,
+ const char *grouping, PyObject *thousands_sep,
+ Py_UCS4 *maxchar)
+{
+ unsigned int kind, thousands_sep_kind;
+ char *data, *thousands_sep_data;
+ Py_ssize_t thousands_sep_len;
+ Py_ssize_t len;
-#include "stringlib/unicodedefs.h"
-#include "stringlib/fastsearch.h"
+ if (unicode != NULL) {
+ kind = PyUnicode_KIND(unicode);
+ data = (char *) PyUnicode_DATA(unicode) + index * kind;
+ }
+ else {
+ kind = PyUnicode_1BYTE_KIND;
+ data = NULL;
+ }
+ thousands_sep_kind = PyUnicode_KIND(thousands_sep);
+ thousands_sep_data = PyUnicode_DATA(thousands_sep);
+ thousands_sep_len = PyUnicode_GET_LENGTH(thousands_sep);
+ if (unicode != NULL && thousands_sep_kind != kind) {
+ if (thousands_sep_kind < kind) {
+ thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind);
+ if (!thousands_sep_data)
+ return -1;
+ }
+ else {
+ data = _PyUnicode_AsKind(unicode, thousands_sep_kind);
+ if (!data)
+ return -1;
+ }
+ }
-#include "stringlib/count.h"
-#include "stringlib/find.h"
-#include "stringlib/partition.h"
-#include "stringlib/split.h"
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (unicode != NULL && PyUnicode_IS_ASCII(unicode))
+ len = asciilib_InsertThousandsGrouping(
+ (Py_UCS1 *) data, n_buffer, (Py_UCS1 *) digits, n_digits,
+ min_width, grouping,
+ (Py_UCS1 *) thousands_sep_data, thousands_sep_len);
+ else
+ len = ucs1lib_InsertThousandsGrouping(
+ (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits,
+ min_width, grouping,
+ (Py_UCS1 *) thousands_sep_data, thousands_sep_len);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ len = ucs2lib_InsertThousandsGrouping(
+ (Py_UCS2 *) data, n_buffer, (Py_UCS2 *) digits, n_digits,
+ min_width, grouping,
+ (Py_UCS2 *) thousands_sep_data, thousands_sep_len);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ len = ucs4lib_InsertThousandsGrouping(
+ (Py_UCS4 *) data, n_buffer, (Py_UCS4 *) digits, n_digits,
+ min_width, grouping,
+ (Py_UCS4 *) thousands_sep_data, thousands_sep_len);
+ break;
+ default:
+ assert(0);
+ return -1;
+ }
+ if (unicode != NULL && thousands_sep_kind != kind) {
+ if (thousands_sep_kind < kind)
+ PyMem_Free(thousands_sep_data);
+ else
+ PyMem_Free(data);
+ }
+ if (unicode == NULL) {
+ *maxchar = 127;
+ if (len != n_digits) {
+ *maxchar = MAX_MAXCHAR(*maxchar,
+ PyUnicode_MAX_CHAR_VALUE(thousands_sep));
+ }
+ }
+ return len;
+}
-#define _Py_InsertThousandsGrouping _PyUnicode_InsertThousandsGrouping
-#define _Py_InsertThousandsGroupingLocale _PyUnicode_InsertThousandsGroupingLocale
-#include "stringlib/localeutil.h"
/* helper macro to fixup start/end slice values */
#define ADJUST_INDICES(start, end, len) \
@@ -6464,72 +8929,102 @@ int PyUnicode_EncodeDecimal(Py_UNICODE *s,
start = 0; \
}
-/* _Py_UNICODE_NEXT is a private macro used to retrieve the character pointed
- * by 'ptr', possibly combining surrogate pairs on narrow builds.
- * 'ptr' and 'end' must be Py_UNICODE*, with 'ptr' pointing at the character
- * that should be returned and 'end' pointing to the end of the buffer.
- * ('end' is used on narrow builds to detect a lone surrogate at the
- * end of the buffer that should be returned unchanged.)
- * The ptr and end arguments should be side-effect free and ptr must an lvalue.
- * The type of the returned char is always Py_UCS4.
- *
- * Note: the macro advances ptr to next char, so it might have side-effects
- * (especially if used with other macros).
- */
-
-/* helper macros used by _Py_UNICODE_NEXT */
-#define _Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= ch && ch <= 0xDBFF)
-#define _Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= ch && ch <= 0xDFFF)
-/* Join two surrogate characters and return a single Py_UCS4 value. */
-#define _Py_UNICODE_JOIN_SURROGATES(high, low) \
- (((((Py_UCS4)(high) & 0x03FF) << 10) | \
- ((Py_UCS4)(low) & 0x03FF)) + 0x10000)
-
-#ifdef Py_UNICODE_WIDE
-#define _Py_UNICODE_NEXT(ptr, end) *(ptr)++
-#else
-#define _Py_UNICODE_NEXT(ptr, end) \
- (((_Py_UNICODE_IS_HIGH_SURROGATE(*(ptr)) && (ptr) < (end)) && \
- _Py_UNICODE_IS_LOW_SURROGATE((ptr)[1])) ? \
- ((ptr) += 2,_Py_UNICODE_JOIN_SURROGATES((ptr)[-2], (ptr)[-1])) : \
- (Py_UCS4)*(ptr)++)
-#endif
-
-Py_ssize_t PyUnicode_Count(PyObject *str,
- PyObject *substr,
- Py_ssize_t start,
- Py_ssize_t end)
+Py_ssize_t
+PyUnicode_Count(PyObject *str,
+ PyObject *substr,
+ Py_ssize_t start,
+ Py_ssize_t end)
{
Py_ssize_t result;
- PyUnicodeObject* str_obj;
- PyUnicodeObject* sub_obj;
+ PyObject* str_obj;
+ PyObject* sub_obj;
+ int kind1, kind2, kind;
+ void *buf1 = NULL, *buf2 = NULL;
+ Py_ssize_t len1, len2;
- str_obj = (PyUnicodeObject*) PyUnicode_FromObject(str);
+ str_obj = PyUnicode_FromObject(str);
if (!str_obj)
return -1;
- sub_obj = (PyUnicodeObject*) PyUnicode_FromObject(substr);
+ sub_obj = PyUnicode_FromObject(substr);
if (!sub_obj) {
Py_DECREF(str_obj);
return -1;
}
+ if (PyUnicode_READY(sub_obj) == -1 || PyUnicode_READY(str_obj) == -1) {
+ Py_DECREF(sub_obj);
+ Py_DECREF(str_obj);
+ return -1;
+ }
- ADJUST_INDICES(start, end, str_obj->length);
- result = stringlib_count(
- str_obj->str + start, end - start, sub_obj->str, sub_obj->length,
- PY_SSIZE_T_MAX
- );
+ kind1 = PyUnicode_KIND(str_obj);
+ kind2 = PyUnicode_KIND(sub_obj);
+ kind = kind1;
+ buf1 = PyUnicode_DATA(str_obj);
+ buf2 = PyUnicode_DATA(sub_obj);
+ if (kind2 != kind) {
+ if (kind2 > kind) {
+ Py_DECREF(sub_obj);
+ Py_DECREF(str_obj);
+ return 0;
+ }
+ buf2 = _PyUnicode_AsKind(sub_obj, kind);
+ }
+ if (!buf2)
+ goto onError;
+ len1 = PyUnicode_GET_LENGTH(str_obj);
+ len2 = PyUnicode_GET_LENGTH(sub_obj);
+
+ ADJUST_INDICES(start, end, len1);
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sub_obj))
+ result = asciilib_count(
+ ((Py_UCS1*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ else
+ result = ucs1lib_count(
+ ((Py_UCS1*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_count(
+ ((Py_UCS2*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_count(
+ ((Py_UCS4*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ default:
+ assert(0); result = 0;
+ }
Py_DECREF(sub_obj);
Py_DECREF(str_obj);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
+
return result;
+ onError:
+ Py_DECREF(sub_obj);
+ Py_DECREF(str_obj);
+ if (kind2 != kind && buf2)
+ PyMem_Free(buf2);
+ return -1;
}
-Py_ssize_t PyUnicode_Find(PyObject *str,
- PyObject *sub,
- Py_ssize_t start,
- Py_ssize_t end,
- int direction)
+Py_ssize_t
+PyUnicode_Find(PyObject *str,
+ PyObject *sub,
+ Py_ssize_t start,
+ Py_ssize_t end,
+ int direction)
{
Py_ssize_t result;
@@ -6541,19 +9036,15 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
Py_DECREF(str);
return -2;
}
+ if (PyUnicode_READY(sub) == -1 || PyUnicode_READY(str) == -1) {
+ Py_DECREF(sub);
+ Py_DECREF(str);
+ return -2;
+ }
- if (direction > 0)
- result = stringlib_find_slice(
- PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
- PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
- start, end
- );
- else
- result = stringlib_rfind_slice(
- PyUnicode_AS_UNICODE(str), PyUnicode_GET_SIZE(str),
- PyUnicode_AS_UNICODE(sub), PyUnicode_GET_SIZE(sub),
- start, end
- );
+ result = any_find_slice(direction,
+ str, sub, start, end
+ );
Py_DECREF(str);
Py_DECREF(sub);
@@ -6561,37 +9052,104 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
return result;
}
-static
-int tailmatch(PyUnicodeObject *self,
- PyUnicodeObject *substring,
- Py_ssize_t start,
- Py_ssize_t end,
- int direction)
+Py_ssize_t
+PyUnicode_FindChar(PyObject *str, Py_UCS4 ch,
+ Py_ssize_t start, Py_ssize_t end,
+ int direction)
{
- if (substring->length == 0)
+ int kind;
+ Py_ssize_t result;
+ if (PyUnicode_READY(str) == -1)
+ return -2;
+ if (start < 0 || end < 0) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -2;
+ }
+ if (end > PyUnicode_GET_LENGTH(str))
+ end = PyUnicode_GET_LENGTH(str);
+ kind = PyUnicode_KIND(str);
+ result = findchar(PyUnicode_1BYTE_DATA(str) + kind*start,
+ kind, end-start, ch, direction);
+ if (result == -1)
+ return -1;
+ else
+ return start + result;
+}
+
+static int
+tailmatch(PyObject *self,
+ PyObject *substring,
+ Py_ssize_t start,
+ Py_ssize_t end,
+ int direction)
+{
+ int kind_self;
+ int kind_sub;
+ void *data_self;
+ void *data_sub;
+ Py_ssize_t offset;
+ Py_ssize_t i;
+ Py_ssize_t end_sub;
+
+ if (PyUnicode_READY(self) == -1 ||
+ PyUnicode_READY(substring) == -1)
+ return 0;
+
+ if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
- ADJUST_INDICES(start, end, self->length);
- end -= substring->length;
+ ADJUST_INDICES(start, end, PyUnicode_GET_LENGTH(self));
+ end -= PyUnicode_GET_LENGTH(substring);
if (end < start)
return 0;
- if (direction > 0) {
- if (Py_UNICODE_MATCH(self, end, substring))
- return 1;
- } else {
- if (Py_UNICODE_MATCH(self, start, substring))
+ kind_self = PyUnicode_KIND(self);
+ data_self = PyUnicode_DATA(self);
+ kind_sub = PyUnicode_KIND(substring);
+ data_sub = PyUnicode_DATA(substring);
+ end_sub = PyUnicode_GET_LENGTH(substring) - 1;
+
+ if (direction > 0)
+ offset = end;
+ else
+ offset = start;
+
+ if (PyUnicode_READ(kind_self, data_self, offset) ==
+ PyUnicode_READ(kind_sub, data_sub, 0) &&
+ PyUnicode_READ(kind_self, data_self, offset + end_sub) ==
+ PyUnicode_READ(kind_sub, data_sub, end_sub)) {
+ /* If both are of the same kind, memcmp is sufficient */
+ if (kind_self == kind_sub) {
+ return ! memcmp((char *)data_self +
+ (offset * PyUnicode_KIND(substring)),
+ data_sub,
+ PyUnicode_GET_LENGTH(substring) *
+ PyUnicode_KIND(substring));
+ }
+ /* otherwise we have to compare each character by first accesing it */
+ else {
+ /* We do not need to compare 0 and len(substring)-1 because
+ the if statement above ensured already that they are equal
+ when we end up here. */
+ /* TODO: honor direction and do a forward or backwards search */
+ for (i = 1; i < end_sub; ++i) {
+ if (PyUnicode_READ(kind_self, data_self, offset + i) !=
+ PyUnicode_READ(kind_sub, data_sub, i))
+ return 0;
+ }
return 1;
+ }
}
return 0;
}
-Py_ssize_t PyUnicode_Tailmatch(PyObject *str,
- PyObject *substr,
- Py_ssize_t start,
- Py_ssize_t end,
- int direction)
+Py_ssize_t
+PyUnicode_Tailmatch(PyObject *str,
+ PyObject *substr,
+ Py_ssize_t start,
+ Py_ssize_t end,
+ int direction)
{
Py_ssize_t result;
@@ -6604,8 +9162,7 @@ Py_ssize_t PyUnicode_Tailmatch(PyObject *str,
return -1;
}
- result = tailmatch((PyUnicodeObject *)str,
- (PyUnicodeObject *)substr,
+ result = tailmatch(str, substr,
start, end, direction);
Py_DECREF(str);
Py_DECREF(substr);
@@ -6615,168 +9172,312 @@ Py_ssize_t PyUnicode_Tailmatch(PyObject *str,
/* Apply fixfct filter to the Unicode object self and return a
reference to the modified object */
-static
-PyObject *fixup(PyUnicodeObject *self,
- int (*fixfct)(PyUnicodeObject *s))
+static PyObject *
+fixup(PyObject *self,
+ Py_UCS4 (*fixfct)(PyObject *s))
{
+ PyObject *u;
+ Py_UCS4 maxchar_old, maxchar_new = 0;
+ PyObject *v;
- PyUnicodeObject *u;
-
- u = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, self->length);
+ u = _PyUnicode_Copy(self);
if (u == NULL)
return NULL;
+ maxchar_old = PyUnicode_MAX_CHAR_VALUE(u);
+
+ /* fix functions return the new maximum character in a string,
+ if the kind of the resulting unicode object does not change,
+ everything is fine. Otherwise we need to change the string kind
+ and re-run the fix function. */
+ maxchar_new = fixfct(u);
+
+ if (maxchar_new == 0) {
+ /* no changes */;
+ if (PyUnicode_CheckExact(self)) {
+ Py_DECREF(u);
+ Py_INCREF(self);
+ return self;
+ }
+ else
+ return u;
+ }
+
+ maxchar_new = align_maxchar(maxchar_new);
- Py_UNICODE_COPY(u->str, self->str, self->length);
+ if (maxchar_new == maxchar_old)
+ return u;
- if (!fixfct(u) && PyUnicode_CheckExact(self)) {
- /* fixfct should return TRUE if it modified the buffer. If
- FALSE, return a reference to the original buffer instead
- (to save space, not time) */
- Py_INCREF(self);
+ /* In case the maximum character changed, we need to
+ convert the string to the new category. */
+ v = PyUnicode_New(PyUnicode_GET_LENGTH(self), maxchar_new);
+ if (v == NULL) {
Py_DECREF(u);
- return (PyObject*) self;
+ return NULL;
+ }
+ if (maxchar_new > maxchar_old) {
+ /* If the maxchar increased so that the kind changed, not all
+ characters are representable anymore and we need to fix the
+ string again. This only happens in very few cases. */
+ _PyUnicode_FastCopyCharacters(v, 0,
+ self, 0, PyUnicode_GET_LENGTH(self));
+ maxchar_old = fixfct(v);
+ assert(maxchar_old > 0 && maxchar_old <= maxchar_new);
+ }
+ else {
+ _PyUnicode_FastCopyCharacters(v, 0,
+ u, 0, PyUnicode_GET_LENGTH(self));
}
- return (PyObject*) u;
+ Py_DECREF(u);
+ assert(_PyUnicode_CheckConsistency(v, 1));
+ return v;
}
-static
-int fixupper(PyUnicodeObject *self)
+static PyObject *
+ascii_upper_or_lower(PyObject *self, int lower)
+{
+ Py_ssize_t len = PyUnicode_GET_LENGTH(self);
+ char *resdata, *data = PyUnicode_DATA(self);
+ PyObject *res;
+
+ res = PyUnicode_New(len, 127);
+ if (res == NULL)
+ return NULL;
+ resdata = PyUnicode_DATA(res);
+ if (lower)
+ _Py_bytes_lower(resdata, data, len);
+ else
+ _Py_bytes_upper(resdata, data, len);
+ return res;
+}
+
+static Py_UCS4
+handle_capital_sigma(int kind, void *data, Py_ssize_t length, Py_ssize_t i)
{
- Py_ssize_t len = self->length;
- Py_UNICODE *s = self->str;
- int status = 0;
+ Py_ssize_t j;
+ int final_sigma;
+ Py_UCS4 c;
+ /* U+03A3 is in the Final_Sigma context when, it is found like this:
- while (len-- > 0) {
- register Py_UNICODE ch;
+ \p{cased}\p{case-ignorable}*U+03A3!(\p{case-ignorable}*\p{cased})
- ch = Py_UNICODE_TOUPPER(*s);
- if (ch != *s) {
- status = 1;
- *s = ch;
+ where ! is a negation and \p{xxx} is a character with property xxx.
+ */
+ for (j = i - 1; j >= 0; j--) {
+ c = PyUnicode_READ(kind, data, j);
+ if (!_PyUnicode_IsCaseIgnorable(c))
+ break;
+ }
+ final_sigma = j >= 0 && _PyUnicode_IsCased(c);
+ if (final_sigma) {
+ for (j = i + 1; j < length; j++) {
+ c = PyUnicode_READ(kind, data, j);
+ if (!_PyUnicode_IsCaseIgnorable(c))
+ break;
}
- s++;
+ final_sigma = j == length || !_PyUnicode_IsCased(c);
}
-
- return status;
+ return (final_sigma) ? 0x3C2 : 0x3C3;
}
-static
-int fixlower(PyUnicodeObject *self)
+static int
+lower_ucs4(int kind, void *data, Py_ssize_t length, Py_ssize_t i,
+ Py_UCS4 c, Py_UCS4 *mapped)
{
- Py_ssize_t len = self->length;
- Py_UNICODE *s = self->str;
- int status = 0;
+ /* Obscure special case. */
+ if (c == 0x3A3) {
+ mapped[0] = handle_capital_sigma(kind, data, length, i);
+ return 1;
+ }
+ return _PyUnicode_ToLowerFull(c, mapped);
+}
- while (len-- > 0) {
- register Py_UNICODE ch;
+static Py_ssize_t
+do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar)
+{
+ Py_ssize_t i, k = 0;
+ int n_res, j;
+ Py_UCS4 c, mapped[3];
- ch = Py_UNICODE_TOLOWER(*s);
- if (ch != *s) {
- status = 1;
- *s = ch;
+ c = PyUnicode_READ(kind, data, 0);
+ n_res = _PyUnicode_ToUpperFull(c, mapped);
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
+ }
+ for (i = 1; i < length; i++) {
+ c = PyUnicode_READ(kind, data, i);
+ n_res = lower_ucs4(kind, data, length, i, c, mapped);
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
}
- s++;
}
+ return k;
+}
+
+static Py_ssize_t
+do_swapcase(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) {
+ Py_ssize_t i, k = 0;
- return status;
+ for (i = 0; i < length; i++) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, i), mapped[3];
+ int n_res, j;
+ if (Py_UNICODE_ISUPPER(c)) {
+ n_res = lower_ucs4(kind, data, length, i, c, mapped);
+ }
+ else if (Py_UNICODE_ISLOWER(c)) {
+ n_res = _PyUnicode_ToUpperFull(c, mapped);
+ }
+ else {
+ n_res = 1;
+ mapped[0] = c;
+ }
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
+ }
+ }
+ return k;
}
-static
-int fixswapcase(PyUnicodeObject *self)
+static Py_ssize_t
+do_upper_or_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res,
+ Py_UCS4 *maxchar, int lower)
{
- Py_ssize_t len = self->length;
- Py_UNICODE *s = self->str;
- int status = 0;
+ Py_ssize_t i, k = 0;
- while (len-- > 0) {
- if (Py_UNICODE_ISUPPER(*s)) {
- *s = Py_UNICODE_TOLOWER(*s);
- status = 1;
- } else if (Py_UNICODE_ISLOWER(*s)) {
- *s = Py_UNICODE_TOUPPER(*s);
- status = 1;
+ for (i = 0; i < length; i++) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, i), mapped[3];
+ int n_res, j;
+ if (lower)
+ n_res = lower_ucs4(kind, data, length, i, c, mapped);
+ else
+ n_res = _PyUnicode_ToUpperFull(c, mapped);
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
}
- s++;
}
+ return k;
+}
- return status;
+static Py_ssize_t
+do_upper(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar)
+{
+ return do_upper_or_lower(kind, data, length, res, maxchar, 0);
}
-static
-int fixcapitalize(PyUnicodeObject *self)
+static Py_ssize_t
+do_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar)
{
- Py_ssize_t len = self->length;
- Py_UNICODE *s = self->str;
- int status = 0;
+ return do_upper_or_lower(kind, data, length, res, maxchar, 1);
+}
- if (len == 0)
- return 0;
- if (!Py_UNICODE_ISUPPER(*s)) {
- *s = Py_UNICODE_TOUPPER(*s);
- status = 1;
- }
- s++;
- while (--len > 0) {
- if (!Py_UNICODE_ISLOWER(*s)) {
- *s = Py_UNICODE_TOLOWER(*s);
- status = 1;
+static Py_ssize_t
+do_casefold(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar)
+{
+ Py_ssize_t i, k = 0;
+
+ for (i = 0; i < length; i++) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, i);
+ Py_UCS4 mapped[3];
+ int j, n_res = _PyUnicode_ToFoldedFull(c, mapped);
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
}
- s++;
}
- return status;
+ return k;
}
-static
-int fixtitle(PyUnicodeObject *self)
+static Py_ssize_t
+do_title(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar)
{
- register Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register Py_UNICODE *e;
+ Py_ssize_t i, k = 0;
int previous_is_cased;
- /* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1) {
- Py_UNICODE ch = Py_UNICODE_TOTITLE(*p);
- if (*p != ch) {
- *p = ch;
- return 1;
- }
- else
- return 0;
- }
-
- e = p + PyUnicode_GET_SIZE(self);
previous_is_cased = 0;
- for (; p < e; p++) {
- register const Py_UNICODE ch = *p;
+ for (i = 0; i < length; i++) {
+ const Py_UCS4 c = PyUnicode_READ(kind, data, i);
+ Py_UCS4 mapped[3];
+ int n_res, j;
if (previous_is_cased)
- *p = Py_UNICODE_TOLOWER(ch);
+ n_res = lower_ucs4(kind, data, length, i, c, mapped);
else
- *p = Py_UNICODE_TOTITLE(ch);
+ n_res = _PyUnicode_ToTitleFull(c, mapped);
- if (Py_UNICODE_ISLOWER(ch) ||
- Py_UNICODE_ISUPPER(ch) ||
- Py_UNICODE_ISTITLE(ch))
- previous_is_cased = 1;
- else
- previous_is_cased = 0;
+ for (j = 0; j < n_res; j++) {
+ *maxchar = MAX_MAXCHAR(*maxchar, mapped[j]);
+ res[k++] = mapped[j];
+ }
+
+ previous_is_cased = _PyUnicode_IsCased(c);
}
- return 1;
+ return k;
+}
+
+static PyObject *
+case_operation(PyObject *self,
+ Py_ssize_t (*perform)(int, void *, Py_ssize_t, Py_UCS4 *, Py_UCS4 *))
+{
+ PyObject *res = NULL;
+ Py_ssize_t length, newlength = 0;
+ int kind, outkind;
+ void *data, *outdata;
+ Py_UCS4 maxchar = 0, *tmp, *tmpend;
+
+ assert(PyUnicode_IS_READY(self));
+
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+ length = PyUnicode_GET_LENGTH(self);
+ tmp = PyMem_MALLOC(sizeof(Py_UCS4) * 3 * length);
+ if (tmp == NULL)
+ return PyErr_NoMemory();
+ newlength = perform(kind, data, length, tmp, &maxchar);
+ res = PyUnicode_New(newlength, maxchar);
+ if (res == NULL)
+ goto leave;
+ tmpend = tmp + newlength;
+ outdata = PyUnicode_DATA(res);
+ outkind = PyUnicode_KIND(res);
+ switch (outkind) {
+ case PyUnicode_1BYTE_KIND:
+ _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS1, tmp, tmpend, outdata);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS2, tmp, tmpend, outdata);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ memcpy(outdata, tmp, sizeof(Py_UCS4) * newlength);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ leave:
+ PyMem_FREE(tmp);
+ return res;
}
PyObject *
PyUnicode_Join(PyObject *separator, PyObject *seq)
{
- const Py_UNICODE blank = ' ';
- const Py_UNICODE *sep = &blank;
- Py_ssize_t seplen = 1;
- PyUnicodeObject *res = NULL; /* the result */
- Py_UNICODE *res_p; /* pointer to free byte in res's string area */
+ PyObject *sep = NULL;
+ Py_ssize_t seplen;
+ PyObject *res = NULL; /* the result */
PyObject *fseq; /* PySequence_Fast(seq) */
Py_ssize_t seqlen; /* len(fseq) -- number of items in sequence */
PyObject **items;
PyObject *item;
- Py_ssize_t sz, i;
+ Py_ssize_t sz, i, res_offset;
+ Py_UCS4 maxchar;
+ Py_UCS4 item_maxchar;
+ int use_memcpy;
+ unsigned char *res_data = NULL, *sep_data = NULL;
+ PyObject *last_obj;
+ unsigned int kind = 0;
fseq = PySequence_Fast(seq, "");
if (fseq == NULL) {
@@ -6790,24 +9491,34 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
seqlen = PySequence_Fast_GET_SIZE(fseq);
/* If empty sequence, return u"". */
if (seqlen == 0) {
- res = _PyUnicode_New(0); /* empty sequence; return u"" */
- goto Done;
+ Py_DECREF(fseq);
+ Py_INCREF(unicode_empty);
+ res = unicode_empty;
+ return res;
}
- items = PySequence_Fast_ITEMS(fseq);
+
/* If singleton sequence with an exact Unicode, return that. */
+ last_obj = NULL;
+ items = PySequence_Fast_ITEMS(fseq);
if (seqlen == 1) {
- item = items[0];
- if (PyUnicode_CheckExact(item)) {
- Py_INCREF(item);
- res = (PyUnicodeObject *)item;
- goto Done;
+ if (PyUnicode_CheckExact(items[0])) {
+ res = items[0];
+ Py_INCREF(res);
+ Py_DECREF(fseq);
+ return res;
}
+ seplen = 0;
+ maxchar = 0;
}
else {
/* Set up sep and seplen */
if (separator == NULL) {
- sep = &blank;
+ /* fall back to a blank space separator */
+ sep = PyUnicode_FromOrdinal(' ');
+ if (!sep)
+ goto onError;
seplen = 1;
+ maxchar = 32;
}
else {
if (!PyUnicode_Check(separator)) {
@@ -6817,9 +9528,16 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
Py_TYPE(separator)->tp_name);
goto onError;
}
- sep = PyUnicode_AS_UNICODE(separator);
- seplen = PyUnicode_GET_SIZE(separator);
+ if (PyUnicode_READY(separator))
+ goto onError;
+ sep = separator;
+ seplen = PyUnicode_GET_LENGTH(separator);
+ maxchar = PyUnicode_MAX_CHAR_VALUE(separator);
+ /* inc refcount to keep this code path symmetric with the
+ above case of a blank separator */
+ Py_INCREF(sep);
}
+ last_obj = sep;
}
/* There are at least two things to join, or else we have a subclass
@@ -6828,6 +9546,11 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
* need (sz), and see whether all argument are strings.
*/
sz = 0;
+#ifdef Py_DEBUG
+ use_memcpy = 0;
+#else
+ use_memcpy = 1;
+#endif
for (i = 0; i < seqlen; i++) {
const Py_ssize_t old_sz = sz;
item = items[i];
@@ -6838,7 +9561,11 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
i, Py_TYPE(item)->tp_name);
goto onError;
}
- sz += PyUnicode_GET_SIZE(item);
+ if (PyUnicode_READY(item) == -1)
+ goto onError;
+ sz += PyUnicode_GET_LENGTH(item);
+ item_maxchar = PyUnicode_MAX_CHAR_VALUE(item);
+ maxchar = MAX_MAXCHAR(maxchar, item_maxchar);
if (i != 0)
sz += seplen;
if (sz < old_sz || sz > PY_SSIZE_T_MAX) {
@@ -6846,266 +9573,725 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
"join() result is too long for a Python string");
goto onError;
}
+ if (use_memcpy && last_obj != NULL) {
+ if (PyUnicode_KIND(last_obj) != PyUnicode_KIND(item))
+ use_memcpy = 0;
+ }
+ last_obj = item;
}
- res = _PyUnicode_New(sz);
+ res = PyUnicode_New(sz, maxchar);
if (res == NULL)
goto onError;
/* Catenate everything. */
- res_p = PyUnicode_AS_UNICODE(res);
- for (i = 0; i < seqlen; ++i) {
+#ifdef Py_DEBUG
+ use_memcpy = 0;
+#else
+ if (use_memcpy) {
+ res_data = PyUnicode_1BYTE_DATA(res);
+ kind = PyUnicode_KIND(res);
+ if (seplen != 0)
+ sep_data = PyUnicode_1BYTE_DATA(sep);
+ }
+#endif
+ for (i = 0, res_offset = 0; i < seqlen; ++i) {
Py_ssize_t itemlen;
item = items[i];
- itemlen = PyUnicode_GET_SIZE(item);
/* Copy item, and maybe the separator. */
- if (i) {
- Py_UNICODE_COPY(res_p, sep, seplen);
- res_p += seplen;
+ if (i && seplen != 0) {
+ if (use_memcpy) {
+ Py_MEMCPY(res_data,
+ sep_data,
+ kind * seplen);
+ res_data += kind * seplen;
+ }
+ else {
+ _PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen);
+ res_offset += seplen;
+ }
+ }
+ itemlen = PyUnicode_GET_LENGTH(item);
+ if (itemlen != 0) {
+ if (use_memcpy) {
+ Py_MEMCPY(res_data,
+ PyUnicode_DATA(item),
+ kind * itemlen);
+ res_data += kind * itemlen;
+ }
+ else {
+ _PyUnicode_FastCopyCharacters(res, res_offset, item, 0, itemlen);
+ res_offset += itemlen;
+ }
}
- Py_UNICODE_COPY(res_p, PyUnicode_AS_UNICODE(item), itemlen);
- res_p += itemlen;
}
+ if (use_memcpy)
+ assert(res_data == PyUnicode_1BYTE_DATA(res)
+ + kind * PyUnicode_GET_LENGTH(res));
+ else
+ assert(res_offset == PyUnicode_GET_LENGTH(res));
- Done:
Py_DECREF(fseq);
- return (PyObject *)res;
+ Py_XDECREF(sep);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
onError:
Py_DECREF(fseq);
+ Py_XDECREF(sep);
Py_XDECREF(res);
return NULL;
}
-static
-PyUnicodeObject *pad(PyUnicodeObject *self,
- Py_ssize_t left,
- Py_ssize_t right,
- Py_UNICODE fill)
+#define FILL(kind, data, value, start, length) \
+ do { \
+ Py_ssize_t i_ = 0; \
+ assert(kind != PyUnicode_WCHAR_KIND); \
+ switch ((kind)) { \
+ case PyUnicode_1BYTE_KIND: { \
+ unsigned char * to_ = (unsigned char *)((data)) + (start); \
+ memset(to_, (unsigned char)value, (length)); \
+ break; \
+ } \
+ case PyUnicode_2BYTE_KIND: { \
+ Py_UCS2 * to_ = (Py_UCS2 *)((data)) + (start); \
+ for (; i_ < (length); ++i_, ++to_) *to_ = (value); \
+ break; \
+ } \
+ case PyUnicode_4BYTE_KIND: { \
+ Py_UCS4 * to_ = (Py_UCS4 *)((data)) + (start); \
+ for (; i_ < (length); ++i_, ++to_) *to_ = (value); \
+ break; \
+ default: assert(0); \
+ } \
+ } \
+ } while (0)
+
+void
+_PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length,
+ Py_UCS4 fill_char)
+{
+ const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode);
+ const void *data = PyUnicode_DATA(unicode);
+ assert(PyUnicode_IS_READY(unicode));
+ assert(unicode_modifiable(unicode));
+ assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode));
+ assert(start >= 0);
+ assert(start + length <= PyUnicode_GET_LENGTH(unicode));
+ FILL(kind, data, fill_char, start, length);
+}
+
+Py_ssize_t
+PyUnicode_Fill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length,
+ Py_UCS4 fill_char)
{
- PyUnicodeObject *u;
+ Py_ssize_t maxlen;
+
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadInternalCall();
+ return -1;
+ }
+ if (PyUnicode_READY(unicode) == -1)
+ return -1;
+ if (unicode_check_modifiable(unicode))
+ return -1;
+
+ if (start < 0) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return -1;
+ }
+ if (fill_char > PyUnicode_MAX_CHAR_VALUE(unicode)) {
+ PyErr_SetString(PyExc_ValueError,
+ "fill character is bigger than "
+ "the string maximum character");
+ return -1;
+ }
+
+ maxlen = PyUnicode_GET_LENGTH(unicode) - start;
+ length = Py_MIN(maxlen, length);
+ if (length <= 0)
+ return 0;
+
+ _PyUnicode_FastFill(unicode, start, length, fill_char);
+ return length;
+}
+
+static PyObject *
+pad(PyObject *self,
+ Py_ssize_t left,
+ Py_ssize_t right,
+ Py_UCS4 fill)
+{
+ PyObject *u;
+ Py_UCS4 maxchar;
+ int kind;
+ void *data;
if (left < 0)
left = 0;
if (right < 0)
right = 0;
- if (left == 0 && right == 0 && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return self;
- }
+ if (left == 0 && right == 0)
+ return unicode_result_unchanged(self);
- if (left > PY_SSIZE_T_MAX - self->length ||
- right > PY_SSIZE_T_MAX - (left + self->length)) {
+ if (left > PY_SSIZE_T_MAX - _PyUnicode_LENGTH(self) ||
+ right > PY_SSIZE_T_MAX - (left + _PyUnicode_LENGTH(self))) {
PyErr_SetString(PyExc_OverflowError, "padded string is too long");
return NULL;
}
- u = _PyUnicode_New(left + self->length + right);
- if (u) {
- if (left)
- Py_UNICODE_FILL(u->str, fill, left);
- Py_UNICODE_COPY(u->str + left, self->str, self->length);
- if (right)
- Py_UNICODE_FILL(u->str + left + self->length, fill, right);
- }
+ maxchar = PyUnicode_MAX_CHAR_VALUE(self);
+ maxchar = MAX_MAXCHAR(maxchar, fill);
+ u = PyUnicode_New(left + _PyUnicode_LENGTH(self) + right, maxchar);
+ if (!u)
+ return NULL;
+ kind = PyUnicode_KIND(u);
+ data = PyUnicode_DATA(u);
+ if (left)
+ FILL(kind, data, fill, 0, left);
+ if (right)
+ FILL(kind, data, fill, left + _PyUnicode_LENGTH(self), right);
+ _PyUnicode_FastCopyCharacters(u, left, self, 0, _PyUnicode_LENGTH(self));
+ assert(_PyUnicode_CheckConsistency(u, 1));
return u;
}
-PyObject *PyUnicode_Splitlines(PyObject *string, int keepends)
+PyObject *
+PyUnicode_Splitlines(PyObject *string, int keepends)
{
PyObject *list;
string = PyUnicode_FromObject(string);
if (string == NULL)
return NULL;
+ if (PyUnicode_READY(string) == -1) {
+ Py_DECREF(string);
+ return NULL;
+ }
- list = stringlib_splitlines(
- (PyObject*) string, PyUnicode_AS_UNICODE(string),
- PyUnicode_GET_SIZE(string), keepends);
-
+ switch (PyUnicode_KIND(string)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(string))
+ list = asciilib_splitlines(
+ string, PyUnicode_1BYTE_DATA(string),
+ PyUnicode_GET_LENGTH(string), keepends);
+ else
+ list = ucs1lib_splitlines(
+ string, PyUnicode_1BYTE_DATA(string),
+ PyUnicode_GET_LENGTH(string), keepends);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ list = ucs2lib_splitlines(
+ string, PyUnicode_2BYTE_DATA(string),
+ PyUnicode_GET_LENGTH(string), keepends);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ list = ucs4lib_splitlines(
+ string, PyUnicode_4BYTE_DATA(string),
+ PyUnicode_GET_LENGTH(string), keepends);
+ break;
+ default:
+ assert(0);
+ list = 0;
+ }
Py_DECREF(string);
return list;
}
-static
-PyObject *split(PyUnicodeObject *self,
- PyUnicodeObject *substring,
- Py_ssize_t maxcount)
+static PyObject *
+split(PyObject *self,
+ PyObject *substring,
+ Py_ssize_t maxcount)
{
+ int kind1, kind2, kind;
+ void *buf1, *buf2;
+ Py_ssize_t len1, len2;
+ PyObject* out;
+
if (maxcount < 0)
maxcount = PY_SSIZE_T_MAX;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
if (substring == NULL)
- return stringlib_split_whitespace(
- (PyObject*) self, self->str, self->length, maxcount
- );
+ switch (PyUnicode_KIND(self)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(self))
+ return asciilib_split_whitespace(
+ self, PyUnicode_1BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ else
+ return ucs1lib_split_whitespace(
+ self, PyUnicode_1BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_split_whitespace(
+ self, PyUnicode_2BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_split_whitespace(
+ self, PyUnicode_4BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ default:
+ assert(0);
+ return NULL;
+ }
- return stringlib_split(
- (PyObject*) self, self->str, self->length,
- substring->str, substring->length,
- maxcount
- );
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ kind1 = PyUnicode_KIND(self);
+ kind2 = PyUnicode_KIND(substring);
+ kind = kind1 > kind2 ? kind1 : kind2;
+ buf1 = PyUnicode_DATA(self);
+ buf2 = PyUnicode_DATA(substring);
+ if (kind1 != kind)
+ buf1 = _PyUnicode_AsKind(self, kind);
+ if (!buf1)
+ return NULL;
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(substring, kind);
+ if (!buf2) {
+ if (kind1 != kind) PyMem_Free(buf1);
+ return NULL;
+ }
+ len1 = PyUnicode_GET_LENGTH(self);
+ len2 = PyUnicode_GET_LENGTH(substring);
+
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(substring))
+ out = asciilib_split(
+ self, buf1, len1, buf2, len2, maxcount);
+ else
+ out = ucs1lib_split(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ out = ucs2lib_split(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ out = ucs4lib_split(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ default:
+ out = NULL;
+ }
+ if (kind1 != kind)
+ PyMem_Free(buf1);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
+ return out;
}
-static
-PyObject *rsplit(PyUnicodeObject *self,
- PyUnicodeObject *substring,
- Py_ssize_t maxcount)
+static PyObject *
+rsplit(PyObject *self,
+ PyObject *substring,
+ Py_ssize_t maxcount)
{
+ int kind1, kind2, kind;
+ void *buf1, *buf2;
+ Py_ssize_t len1, len2;
+ PyObject* out;
+
if (maxcount < 0)
maxcount = PY_SSIZE_T_MAX;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
if (substring == NULL)
- return stringlib_rsplit_whitespace(
- (PyObject*) self, self->str, self->length, maxcount
- );
+ switch (PyUnicode_KIND(self)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(self))
+ return asciilib_rsplit_whitespace(
+ self, PyUnicode_1BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ else
+ return ucs1lib_rsplit_whitespace(
+ self, PyUnicode_1BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_rsplit_whitespace(
+ self, PyUnicode_2BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_rsplit_whitespace(
+ self, PyUnicode_4BYTE_DATA(self),
+ PyUnicode_GET_LENGTH(self), maxcount
+ );
+ default:
+ assert(0);
+ return NULL;
+ }
- return stringlib_rsplit(
- (PyObject*) self, self->str, self->length,
- substring->str, substring->length,
- maxcount
- );
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ kind1 = PyUnicode_KIND(self);
+ kind2 = PyUnicode_KIND(substring);
+ kind = kind1 > kind2 ? kind1 : kind2;
+ buf1 = PyUnicode_DATA(self);
+ buf2 = PyUnicode_DATA(substring);
+ if (kind1 != kind)
+ buf1 = _PyUnicode_AsKind(self, kind);
+ if (!buf1)
+ return NULL;
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(substring, kind);
+ if (!buf2) {
+ if (kind1 != kind) PyMem_Free(buf1);
+ return NULL;
+ }
+ len1 = PyUnicode_GET_LENGTH(self);
+ len2 = PyUnicode_GET_LENGTH(substring);
+
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(substring))
+ out = asciilib_rsplit(
+ self, buf1, len1, buf2, len2, maxcount);
+ else
+ out = ucs1lib_rsplit(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ out = ucs2lib_rsplit(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ out = ucs4lib_rsplit(
+ self, buf1, len1, buf2, len2, maxcount);
+ break;
+ default:
+ out = NULL;
+ }
+ if (kind1 != kind)
+ PyMem_Free(buf1);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
+ return out;
}
-static
-PyObject *replace(PyUnicodeObject *self,
- PyUnicodeObject *str1,
- PyUnicodeObject *str2,
- Py_ssize_t maxcount)
+static Py_ssize_t
+anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1,
+ PyObject *str2, void *buf2, Py_ssize_t len2, Py_ssize_t offset)
{
- PyUnicodeObject *u;
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(str1) && PyUnicode_IS_ASCII(str2))
+ return asciilib_find(buf1, len1, buf2, len2, offset);
+ else
+ return ucs1lib_find(buf1, len1, buf2, len2, offset);
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_find(buf1, len1, buf2, len2, offset);
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_find(buf1, len1, buf2, len2, offset);
+ }
+ assert(0);
+ return -1;
+}
+
+static Py_ssize_t
+anylib_count(int kind, PyObject *sstr, void* sbuf, Py_ssize_t slen,
+ PyObject *str1, void *buf1, Py_ssize_t len1, Py_ssize_t maxcount)
+{
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(sstr) && PyUnicode_IS_ASCII(str1))
+ return asciilib_count(sbuf, slen, buf1, len1, maxcount);
+ else
+ return ucs1lib_count(sbuf, slen, buf1, len1, maxcount);
+ case PyUnicode_2BYTE_KIND:
+ return ucs2lib_count(sbuf, slen, buf1, len1, maxcount);
+ case PyUnicode_4BYTE_KIND:
+ return ucs4lib_count(sbuf, slen, buf1, len1, maxcount);
+ }
+ assert(0);
+ return 0;
+}
+
+static PyObject *
+replace(PyObject *self, PyObject *str1,
+ PyObject *str2, Py_ssize_t maxcount)
+{
+ PyObject *u;
+ char *sbuf = PyUnicode_DATA(self);
+ char *buf1 = PyUnicode_DATA(str1);
+ char *buf2 = PyUnicode_DATA(str2);
+ int srelease = 0, release1 = 0, release2 = 0;
+ int skind = PyUnicode_KIND(self);
+ int kind1 = PyUnicode_KIND(str1);
+ int kind2 = PyUnicode_KIND(str2);
+ Py_ssize_t slen = PyUnicode_GET_LENGTH(self);
+ Py_ssize_t len1 = PyUnicode_GET_LENGTH(str1);
+ Py_ssize_t len2 = PyUnicode_GET_LENGTH(str2);
+ int mayshrink;
+ Py_UCS4 maxchar, maxchar_str2;
if (maxcount < 0)
maxcount = PY_SSIZE_T_MAX;
- else if (maxcount == 0 || self->length == 0)
+ else if (maxcount == 0 || slen == 0)
goto nothing;
- if (str1->length == str2->length) {
- Py_ssize_t i;
+ if (str1 == str2)
+ goto nothing;
+ if (skind < kind1)
+ /* substring too wide to be present */
+ goto nothing;
+
+ maxchar = PyUnicode_MAX_CHAR_VALUE(self);
+ maxchar_str2 = PyUnicode_MAX_CHAR_VALUE(str2);
+ /* Replacing str1 with str2 may cause a maxchar reduction in the
+ result string. */
+ mayshrink = (maxchar_str2 < maxchar);
+ maxchar = MAX_MAXCHAR(maxchar, maxchar_str2);
+
+ if (len1 == len2) {
/* same length */
- if (str1->length == 0)
+ if (len1 == 0)
goto nothing;
- if (str1->length == 1) {
+ if (len1 == 1) {
/* replace characters */
- Py_UNICODE u1, u2;
- if (!findchar(self->str, self->length, str1->str[0]))
+ Py_UCS4 u1, u2;
+ int rkind;
+ Py_ssize_t index, pos;
+ char *src;
+
+ u1 = PyUnicode_READ_CHAR(str1, 0);
+ pos = findchar(sbuf, PyUnicode_KIND(self), slen, u1, 1);
+ if (pos < 0)
goto nothing;
- u = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, self->length);
+ u2 = PyUnicode_READ_CHAR(str2, 0);
+ u = PyUnicode_New(slen, maxchar);
if (!u)
- return NULL;
- Py_UNICODE_COPY(u->str, self->str, self->length);
- u1 = str1->str[0];
- u2 = str2->str[0];
- for (i = 0; i < u->length; i++)
- if (u->str[i] == u1) {
- if (--maxcount < 0)
- break;
- u->str[i] = u2;
- }
- } else {
- i = stringlib_find(
- self->str, self->length, str1->str, str1->length, 0
- );
+ goto error;
+ _PyUnicode_FastCopyCharacters(u, 0, self, 0, slen);
+ rkind = PyUnicode_KIND(u);
+
+ PyUnicode_WRITE(rkind, PyUnicode_DATA(u), pos, u2);
+ index = 0;
+ src = sbuf;
+ while (--maxcount)
+ {
+ pos++;
+ src += pos * PyUnicode_KIND(self);
+ slen -= pos;
+ index += pos;
+ pos = findchar(src, PyUnicode_KIND(self), slen, u1, 1);
+ if (pos < 0)
+ break;
+ PyUnicode_WRITE(rkind, PyUnicode_DATA(u), index + pos, u2);
+ }
+ }
+ else {
+ int rkind = skind;
+ char *res;
+ Py_ssize_t i;
+
+ if (kind1 < rkind) {
+ /* widen substring */
+ buf1 = _PyUnicode_AsKind(str1, rkind);
+ if (!buf1) goto error;
+ release1 = 1;
+ }
+ i = anylib_find(rkind, self, sbuf, slen, str1, buf1, len1, 0);
if (i < 0)
goto nothing;
- u = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, self->length);
+ if (rkind > kind2) {
+ /* widen replacement */
+ buf2 = _PyUnicode_AsKind(str2, rkind);
+ if (!buf2) goto error;
+ release2 = 1;
+ }
+ else if (rkind < kind2) {
+ /* widen self and buf1 */
+ rkind = kind2;
+ if (release1) PyMem_Free(buf1);
+ sbuf = _PyUnicode_AsKind(self, rkind);
+ if (!sbuf) goto error;
+ srelease = 1;
+ buf1 = _PyUnicode_AsKind(str1, rkind);
+ if (!buf1) goto error;
+ release1 = 1;
+ }
+ u = PyUnicode_New(slen, maxchar);
if (!u)
- return NULL;
- Py_UNICODE_COPY(u->str, self->str, self->length);
+ goto error;
+ assert(PyUnicode_KIND(u) == rkind);
+ res = PyUnicode_DATA(u);
+ memcpy(res, sbuf, rkind * slen);
/* change everything in-place, starting with this one */
- Py_UNICODE_COPY(u->str+i, str2->str, str2->length);
- i += str1->length;
+ memcpy(res + rkind * i,
+ buf2,
+ rkind * len2);
+ i += len1;
while ( --maxcount > 0) {
- i = stringlib_find(self->str+i, self->length-i,
- str1->str, str1->length,
- i);
+ i = anylib_find(rkind, self,
+ sbuf+rkind*i, slen-i,
+ str1, buf1, len1, i);
if (i == -1)
break;
- Py_UNICODE_COPY(u->str+i, str2->str, str2->length);
- i += str1->length;
+ memcpy(res + rkind * i,
+ buf2,
+ rkind * len2);
+ i += len1;
}
}
- } else {
-
- Py_ssize_t n, i, j;
- Py_ssize_t product, new_size, delta;
- Py_UNICODE *p;
-
- /* replace strings */
- n = stringlib_count(self->str, self->length, str1->str, str1->length,
- maxcount);
+ }
+ else {
+ Py_ssize_t n, i, j, ires;
+ Py_ssize_t new_size;
+ int rkind = skind;
+ char *res;
+
+ if (kind1 < rkind) {
+ /* widen substring */
+ buf1 = _PyUnicode_AsKind(str1, rkind);
+ if (!buf1) goto error;
+ release1 = 1;
+ }
+ n = anylib_count(rkind, self, sbuf, slen, str1, buf1, len1, maxcount);
if (n == 0)
goto nothing;
- /* new_size = self->length + n * (str2->length - str1->length)); */
- delta = (str2->length - str1->length);
- if (delta == 0) {
- new_size = self->length;
- } else {
- product = n * (str2->length - str1->length);
- if ((product / (str2->length - str1->length)) != n) {
- PyErr_SetString(PyExc_OverflowError,
- "replace string is too long");
- return NULL;
- }
- new_size = self->length + product;
- if (new_size < 0) {
+ if (kind2 < rkind) {
+ /* widen replacement */
+ buf2 = _PyUnicode_AsKind(str2, rkind);
+ if (!buf2) goto error;
+ release2 = 1;
+ }
+ else if (kind2 > rkind) {
+ /* widen self and buf1 */
+ rkind = kind2;
+ sbuf = _PyUnicode_AsKind(self, rkind);
+ if (!sbuf) goto error;
+ srelease = 1;
+ if (release1) PyMem_Free(buf1);
+ buf1 = _PyUnicode_AsKind(str1, rkind);
+ if (!buf1) goto error;
+ release1 = 1;
+ }
+ /* new_size = PyUnicode_GET_LENGTH(self) + n * (PyUnicode_GET_LENGTH(str2) -
+ PyUnicode_GET_LENGTH(str1))); */
+ if (len2 > len1 && len2 - len1 > (PY_SSIZE_T_MAX - slen) / n) {
PyErr_SetString(PyExc_OverflowError,
"replace string is too long");
- return NULL;
- }
+ goto error;
+ }
+ new_size = slen + n * (len2 - len1);
+ if (new_size == 0) {
+ Py_INCREF(unicode_empty);
+ u = unicode_empty;
+ goto done;
+ }
+ if (new_size > (PY_SSIZE_T_MAX >> (rkind-1))) {
+ PyErr_SetString(PyExc_OverflowError,
+ "replace string is too long");
+ goto error;
}
- u = _PyUnicode_New(new_size);
+ u = PyUnicode_New(new_size, maxchar);
if (!u)
- return NULL;
- i = 0;
- p = u->str;
- if (str1->length > 0) {
+ goto error;
+ assert(PyUnicode_KIND(u) == rkind);
+ res = PyUnicode_DATA(u);
+ ires = i = 0;
+ if (len1 > 0) {
while (n-- > 0) {
/* look for next match */
- j = stringlib_find(self->str+i, self->length-i,
- str1->str, str1->length,
- i);
+ j = anylib_find(rkind, self,
+ sbuf + rkind * i, slen-i,
+ str1, buf1, len1, i);
if (j == -1)
break;
else if (j > i) {
/* copy unchanged part [i:j] */
- Py_UNICODE_COPY(p, self->str+i, j-i);
- p += j - i;
+ memcpy(res + rkind * ires,
+ sbuf + rkind * i,
+ rkind * (j-i));
+ ires += j - i;
}
/* copy substitution string */
- if (str2->length > 0) {
- Py_UNICODE_COPY(p, str2->str, str2->length);
- p += str2->length;
+ if (len2 > 0) {
+ memcpy(res + rkind * ires,
+ buf2,
+ rkind * len2);
+ ires += len2;
}
- i = j + str1->length;
+ i = j + len1;
}
- if (i < self->length)
+ if (i < slen)
/* copy tail [i:] */
- Py_UNICODE_COPY(p, self->str+i, self->length-i);
- } else {
+ memcpy(res + rkind * ires,
+ sbuf + rkind * i,
+ rkind * (slen-i));
+ }
+ else {
/* interleave */
while (n > 0) {
- Py_UNICODE_COPY(p, str2->str, str2->length);
- p += str2->length;
+ memcpy(res + rkind * ires,
+ buf2,
+ rkind * len2);
+ ires += len2;
if (--n <= 0)
break;
- *p++ = self->str[i++];
+ memcpy(res + rkind * ires,
+ sbuf + rkind * i,
+ rkind);
+ ires++;
+ i++;
}
- Py_UNICODE_COPY(p, self->str+i, self->length-i);
+ memcpy(res + rkind * ires,
+ sbuf + rkind * i,
+ rkind * (slen-i));
}
}
- return (PyObject *) u;
+
+ if (mayshrink) {
+ unicode_adjust_maxchar(&u);
+ if (u == NULL)
+ goto error;
+ }
+
+ done:
+ if (srelease)
+ PyMem_FREE(sbuf);
+ if (release1)
+ PyMem_FREE(buf1);
+ if (release2)
+ PyMem_FREE(buf2);
+ assert(_PyUnicode_CheckConsistency(u, 1));
+ return u;
nothing:
/* nothing to replace; return original string (when possible) */
- if (PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject *) self;
- }
- return PyUnicode_FromUnicode(self->str, self->length);
+ if (srelease)
+ PyMem_FREE(sbuf);
+ if (release1)
+ PyMem_FREE(buf1);
+ if (release2)
+ PyMem_FREE(buf2);
+ return unicode_result_unchanged(self);
+
+ error:
+ if (srelease && sbuf)
+ PyMem_FREE(sbuf);
+ if (release1 && buf1)
+ PyMem_FREE(buf1);
+ if (release2 && buf2)
+ PyMem_FREE(buf2);
+ return NULL;
}
/* --- Unicode Object Methods --------------------------------------------- */
@@ -7117,9 +10303,11 @@ Return a titlecased version of S, i.e. words start with title case\n\
characters, all remaining cased characters have lower case.");
static PyObject*
-unicode_title(PyUnicodeObject *self)
+unicode_title(PyObject *self)
{
- return fixup(self, fixtitle);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ return case_operation(self, do_title);
}
PyDoc_STRVAR(capitalize__doc__,
@@ -7129,57 +10317,38 @@ Return a capitalized version of S, i.e. make the first character\n\
have upper case and the rest lower case.");
static PyObject*
-unicode_capitalize(PyUnicodeObject *self)
+unicode_capitalize(PyObject *self)
{
- return fixup(self, fixcapitalize);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_GET_LENGTH(self) == 0)
+ return unicode_result_unchanged(self);
+ return case_operation(self, do_capitalize);
}
-#if 0
-PyDoc_STRVAR(capwords__doc__,
- "S.capwords() -> str\n\
+PyDoc_STRVAR(casefold__doc__,
+ "S.casefold() -> str\n\
\n\
-Apply .capitalize() to all words in S and return the result with\n\
-normalized whitespace (all whitespace strings are replaced by ' ').");
+Return a version of S suitable for caseless comparisons.");
-static PyObject*
-unicode_capwords(PyUnicodeObject *self)
+static PyObject *
+unicode_casefold(PyObject *self)
{
- PyObject *list;
- PyObject *item;
- Py_ssize_t i;
-
- /* Split into words */
- list = split(self, NULL, -1);
- if (!list)
+ if (PyUnicode_READY(self) == -1)
return NULL;
-
- /* Capitalize each word */
- for (i = 0; i < PyList_GET_SIZE(list); i++) {
- item = fixup((PyUnicodeObject *)PyList_GET_ITEM(list, i),
- fixcapitalize);
- if (item == NULL)
- goto onError;
- Py_DECREF(PyList_GET_ITEM(list, i));
- PyList_SET_ITEM(list, i, item);
- }
-
- /* Join the words to form a new string */
- item = PyUnicode_Join(NULL, list);
-
- onError:
- Py_DECREF(list);
- return (PyObject *)item;
+ if (PyUnicode_IS_ASCII(self))
+ return ascii_upper_or_lower(self, 1);
+ return case_operation(self, do_casefold);
}
-#endif
+
/* Argument converter. Coerces to a single unicode character */
static int
convert_uc(PyObject *obj, void *addr)
{
- Py_UNICODE *fillcharloc = (Py_UNICODE *)addr;
+ Py_UCS4 *fillcharloc = (Py_UCS4 *)addr;
PyObject *uniobj;
- Py_UNICODE *unistr;
uniobj = PyUnicode_FromObject(obj);
if (uniobj == NULL) {
@@ -7187,14 +10356,13 @@ convert_uc(PyObject *obj, void *addr)
"The fill character cannot be converted to Unicode");
return 0;
}
- if (PyUnicode_GET_SIZE(uniobj) != 1) {
+ if (PyUnicode_GET_LENGTH(uniobj) != 1) {
PyErr_SetString(PyExc_TypeError,
"The fill character must be exactly one character long");
Py_DECREF(uniobj);
return 0;
}
- unistr = PyUnicode_AS_UNICODE(uniobj);
- *fillcharloc = unistr[0];
+ *fillcharloc = PyUnicode_READ_CHAR(uniobj, 0);
Py_DECREF(uniobj);
return 1;
}
@@ -7206,112 +10374,64 @@ Return S centered in a string of length width. Padding is\n\
done using the specified fill character (default is a space)");
static PyObject *
-unicode_center(PyUnicodeObject *self, PyObject *args)
+unicode_center(PyObject *self, PyObject *args)
{
Py_ssize_t marg, left;
Py_ssize_t width;
- Py_UNICODE fillchar = ' ';
+ Py_UCS4 fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|O&:center", &width, convert_uc, &fillchar))
return NULL;
- if (self->length >= width && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*) self;
- }
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
- marg = width - self->length;
+ if (PyUnicode_GET_LENGTH(self) >= width)
+ return unicode_result_unchanged(self);
+
+ marg = width - PyUnicode_GET_LENGTH(self);
left = marg / 2 + (marg & width & 1);
- return (PyObject*) pad(self, left, marg - left, fillchar);
+ return pad(self, left, marg - left, fillchar);
}
-#if 0
-
-/* This code should go into some future Unicode collation support
- module. The basic comparison should compare ordinals on a naive
- basis (this is what Java does and thus Jython too). */
-
-/* speedy UTF-16 code point order comparison */
-/* gleaned from: */
-/* http://www-4.ibm.com/software/developer/library/utf16.html?dwzone=unicode */
-
-static short utf16Fixup[32] =
-{
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0x2000, -0x800, -0x800, -0x800, -0x800
-};
+/* This function assumes that str1 and str2 are readied by the caller. */
static int
-unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2)
+unicode_compare(PyObject *str1, PyObject *str2)
{
- Py_ssize_t len1, len2;
-
- Py_UNICODE *s1 = str1->str;
- Py_UNICODE *s2 = str2->str;
-
- len1 = str1->length;
- len2 = str2->length;
-
- while (len1 > 0 && len2 > 0) {
- Py_UNICODE c1, c2;
+ int kind1, kind2;
+ void *data1, *data2;
+ Py_ssize_t len1, len2, i;
- c1 = *s1++;
- c2 = *s2++;
+ kind1 = PyUnicode_KIND(str1);
+ kind2 = PyUnicode_KIND(str2);
+ data1 = PyUnicode_DATA(str1);
+ data2 = PyUnicode_DATA(str2);
+ len1 = PyUnicode_GET_LENGTH(str1);
+ len2 = PyUnicode_GET_LENGTH(str2);
- if (c1 > (1<<11) * 26)
- c1 += utf16Fixup[c1>>11];
- if (c2 > (1<<11) * 26)
- c2 += utf16Fixup[c2>>11];
- /* now c1 and c2 are in UTF-32-compatible order */
+ for (i = 0; i < len1 && i < len2; ++i) {
+ Py_UCS4 c1, c2;
+ c1 = PyUnicode_READ(kind1, data1, i);
+ c2 = PyUnicode_READ(kind2, data2, i);
if (c1 != c2)
return (c1 < c2) ? -1 : 1;
-
- len1--; len2--;
}
return (len1 < len2) ? -1 : (len1 != len2);
}
-#else
-
-static int
-unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2)
+int
+PyUnicode_Compare(PyObject *left, PyObject *right)
{
- register Py_ssize_t len1, len2;
-
- Py_UNICODE *s1 = str1->str;
- Py_UNICODE *s2 = str2->str;
-
- len1 = str1->length;
- len2 = str2->length;
-
- while (len1 > 0 && len2 > 0) {
- Py_UNICODE c1, c2;
-
- c1 = *s1++;
- c2 = *s2++;
-
- if (c1 != c2)
- return (c1 < c2) ? -1 : 1;
-
- len1--; len2--;
+ if (PyUnicode_Check(left) && PyUnicode_Check(right)) {
+ if (PyUnicode_READY(left) == -1 ||
+ PyUnicode_READY(right) == -1)
+ return -1;
+ return unicode_compare(left, right);
}
-
- return (len1 < len2) ? -1 : (len1 != len2);
-}
-
-#endif
-
-int PyUnicode_Compare(PyObject *left,
- PyObject *right)
-{
- if (PyUnicode_Check(left) && PyUnicode_Check(right))
- return unicode_compare((PyUnicodeObject *)left,
- (PyUnicodeObject *)right);
PyErr_Format(PyExc_TypeError,
"Can't compare %.100s and %.100s",
left->ob_type->tp_name,
@@ -7322,17 +10442,23 @@ int PyUnicode_Compare(PyObject *left,
int
PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
{
- int i;
- Py_UNICODE *id;
- assert(PyUnicode_Check(uni));
- id = PyUnicode_AS_UNICODE(uni);
+ Py_ssize_t i;
+ int kind;
+ void *data;
+ Py_UCS4 chr;
+
+ assert(_PyUnicode_CHECK(uni));
+ if (PyUnicode_READY(uni) == -1)
+ return -1;
+ kind = PyUnicode_KIND(uni);
+ data = PyUnicode_DATA(uni);
/* Compare Unicode string and source character set string */
- for (i = 0; id[i] && str[i]; i++)
- if (id[i] != str[i])
- return ((int)id[i] < (int)str[i]) ? -1 : 1;
+ for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++)
+ if (chr != str[i])
+ return (chr < (unsigned char)(str[i])) ? -1 : 1;
/* This check keeps Python strings that end in '\0' from comparing equal
to C strings identical up to that point. */
- if (PyUnicode_GET_SIZE(uni) != i || id[i])
+ if (PyUnicode_GET_LENGTH(uni) != i || chr)
return 1; /* uni is longer */
if (str[i])
return -1; /* str is longer */
@@ -7343,16 +10469,18 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
#define TEST_COND(cond) \
((cond) ? Py_True : Py_False)
-PyObject *PyUnicode_RichCompare(PyObject *left,
- PyObject *right,
- int op)
+PyObject *
+PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
{
int result;
if (PyUnicode_Check(left) && PyUnicode_Check(right)) {
PyObject *v;
- if (((PyUnicodeObject *) left)->length !=
- ((PyUnicodeObject *) right)->length) {
+ if (PyUnicode_READY(left) == -1 ||
+ PyUnicode_READY(right) == -1)
+ return NULL;
+ if (PyUnicode_GET_LENGTH(left) != PyUnicode_GET_LENGTH(right) ||
+ PyUnicode_KIND(left) != PyUnicode_KIND(right)) {
if (op == Py_EQ) {
Py_INCREF(Py_False);
return Py_False;
@@ -7365,8 +10493,7 @@ PyObject *PyUnicode_RichCompare(PyObject *left,
if (left == right)
result = 0;
else
- result = unicode_compare((PyUnicodeObject *)left,
- (PyUnicodeObject *)right);
+ result = unicode_compare(left, right);
/* Convert the return value to a Boolean */
switch (op) {
@@ -7396,14 +10523,16 @@ PyObject *PyUnicode_RichCompare(PyObject *left,
return v;
}
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
-int PyUnicode_Contains(PyObject *container,
- PyObject *element)
+int
+PyUnicode_Contains(PyObject *container, PyObject *element)
{
PyObject *str, *sub;
+ int kind1, kind2, kind;
+ void *buf1, *buf2;
+ Py_ssize_t len1, len2;
int result;
/* Coerce the two arguments */
@@ -7420,50 +10549,106 @@ int PyUnicode_Contains(PyObject *container,
Py_DECREF(sub);
return -1;
}
+ if (PyUnicode_READY(sub) == -1 || PyUnicode_READY(str) == -1) {
+ Py_DECREF(sub);
+ Py_DECREF(str);
+ }
+
+ kind1 = PyUnicode_KIND(str);
+ kind2 = PyUnicode_KIND(sub);
+ kind = kind1;
+ buf1 = PyUnicode_DATA(str);
+ buf2 = PyUnicode_DATA(sub);
+ if (kind2 != kind) {
+ if (kind2 > kind) {
+ Py_DECREF(sub);
+ Py_DECREF(str);
+ return 0;
+ }
+ buf2 = _PyUnicode_AsKind(sub, kind);
+ }
+ if (!buf2) {
+ Py_DECREF(sub);
+ Py_DECREF(str);
+ return -1;
+ }
+ len1 = PyUnicode_GET_LENGTH(str);
+ len2 = PyUnicode_GET_LENGTH(sub);
- result = stringlib_contains_obj(str, sub);
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ result = ucs1lib_find(buf1, len1, buf2, len2, 0) != -1;
+ break;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_find(buf1, len1, buf2, len2, 0) != -1;
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_find(buf1, len1, buf2, len2, 0) != -1;
+ break;
+ default:
+ result = -1;
+ assert(0);
+ }
Py_DECREF(str);
Py_DECREF(sub);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
+
return result;
}
/* Concat to string or Unicode object giving a new Unicode object. */
-PyObject *PyUnicode_Concat(PyObject *left,
- PyObject *right)
+PyObject *
+PyUnicode_Concat(PyObject *left, PyObject *right)
{
- PyUnicodeObject *u = NULL, *v = NULL, *w;
+ PyObject *u = NULL, *v = NULL, *w;
+ Py_UCS4 maxchar, maxchar2;
+ Py_ssize_t u_len, v_len, new_len;
/* Coerce the two arguments */
- u = (PyUnicodeObject *)PyUnicode_FromObject(left);
+ u = PyUnicode_FromObject(left);
if (u == NULL)
goto onError;
- v = (PyUnicodeObject *)PyUnicode_FromObject(right);
+ v = PyUnicode_FromObject(right);
if (v == NULL)
goto onError;
/* Shortcuts */
if (v == unicode_empty) {
Py_DECREF(v);
- return (PyObject *)u;
+ return u;
}
if (u == unicode_empty) {
Py_DECREF(u);
- return (PyObject *)v;
+ return v;
}
+ u_len = PyUnicode_GET_LENGTH(u);
+ v_len = PyUnicode_GET_LENGTH(v);
+ if (u_len > PY_SSIZE_T_MAX - v_len) {
+ PyErr_SetString(PyExc_OverflowError,
+ "strings are too large to concat");
+ goto onError;
+ }
+ new_len = u_len + v_len;
+
+ maxchar = PyUnicode_MAX_CHAR_VALUE(u);
+ maxchar2 = PyUnicode_MAX_CHAR_VALUE(v);
+ maxchar = MAX_MAXCHAR(maxchar, maxchar2);
+
/* Concat the two Unicode strings */
- w = _PyUnicode_New(u->length + v->length);
+ w = PyUnicode_New(new_len, maxchar);
if (w == NULL)
goto onError;
- Py_UNICODE_COPY(w->str, u->str, u->length);
- Py_UNICODE_COPY(w->str + u->length, v->str, v->length);
-
+ _PyUnicode_FastCopyCharacters(w, 0, u, 0, u_len);
+ _PyUnicode_FastCopyCharacters(w, u_len, v, 0, v_len);
Py_DECREF(u);
Py_DECREF(v);
- return (PyObject *)w;
+ assert(_PyUnicode_CheckConsistency(w, 1));
+ return w;
onError:
Py_XDECREF(u);
@@ -7472,19 +10657,89 @@ PyObject *PyUnicode_Concat(PyObject *left,
}
void
-PyUnicode_Append(PyObject **pleft, PyObject *right)
+PyUnicode_Append(PyObject **p_left, PyObject *right)
{
- PyObject *new;
- if (*pleft == NULL)
+ PyObject *left, *res;
+ Py_UCS4 maxchar, maxchar2;
+ Py_ssize_t left_len, right_len, new_len;
+
+ if (p_left == NULL) {
+ if (!PyErr_Occurred())
+ PyErr_BadInternalCall();
+ return;
+ }
+ left = *p_left;
+ if (right == NULL || !PyUnicode_Check(left)) {
+ if (!PyErr_Occurred())
+ PyErr_BadInternalCall();
+ goto error;
+ }
+
+ if (PyUnicode_READY(left) == -1)
+ goto error;
+ if (PyUnicode_READY(right) == -1)
+ goto error;
+
+ /* Shortcuts */
+ if (left == unicode_empty) {
+ Py_DECREF(left);
+ Py_INCREF(right);
+ *p_left = right;
return;
- if (right == NULL || !PyUnicode_Check(*pleft)) {
- Py_DECREF(*pleft);
- *pleft = NULL;
+ }
+ if (right == unicode_empty)
return;
+
+ left_len = PyUnicode_GET_LENGTH(left);
+ right_len = PyUnicode_GET_LENGTH(right);
+ if (left_len > PY_SSIZE_T_MAX - right_len) {
+ PyErr_SetString(PyExc_OverflowError,
+ "strings are too large to concat");
+ goto error;
+ }
+ new_len = left_len + right_len;
+
+ if (unicode_modifiable(left)
+ && PyUnicode_CheckExact(right)
+ && PyUnicode_KIND(right) <= PyUnicode_KIND(left)
+ /* Don't resize for ascii += latin1. Convert ascii to latin1 requires
+ to change the structure size, but characters are stored just after
+ the structure, and so it requires to move all characters which is
+ not so different than duplicating the string. */
+ && !(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right)))
+ {
+ /* append inplace */
+ if (unicode_resize(p_left, new_len) != 0) {
+ /* XXX if _PyUnicode_Resize() fails, 'left' has been
+ * deallocated so it cannot be put back into
+ * 'variable'. The MemoryError is raised when there
+ * is no value in 'variable', which might (very
+ * remotely) be a cause of incompatibilities.
+ */
+ goto error;
+ }
+ /* copy 'right' into the newly allocated area of 'left' */
+ _PyUnicode_FastCopyCharacters(*p_left, left_len, right, 0, right_len);
}
- new = PyUnicode_Concat(*pleft, right);
- Py_DECREF(*pleft);
- *pleft = new;
+ else {
+ maxchar = PyUnicode_MAX_CHAR_VALUE(left);
+ maxchar2 = PyUnicode_MAX_CHAR_VALUE(right);
+ maxchar = MAX_MAXCHAR(maxchar, maxchar2);
+
+ /* Concat the two Unicode strings */
+ res = PyUnicode_New(new_len, maxchar);
+ if (res == NULL)
+ goto error;
+ _PyUnicode_FastCopyCharacters(res, 0, left, 0, left_len);
+ _PyUnicode_FastCopyCharacters(res, left_len, right, 0, right_len);
+ Py_DECREF(left);
+ *p_left = res;
+ }
+ assert(_PyUnicode_CheckConsistency(*p_left, 1));
+ return;
+
+error:
+ Py_CLEAR(*p_left);
}
void
@@ -7502,23 +10757,64 @@ string S[start:end]. Optional arguments start and end are\n\
interpreted as in slice notation.");
static PyObject *
-unicode_count(PyUnicodeObject *self, PyObject *args)
+unicode_count(PyObject *self, PyObject *args)
{
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start = 0;
Py_ssize_t end = PY_SSIZE_T_MAX;
PyObject *result;
+ int kind1, kind2, kind;
+ void *buf1, *buf2;
+ Py_ssize_t len1, len2, iresult;
if (!stringlib_parse_args_finds_unicode("count", args, &substring,
&start, &end))
return NULL;
- ADJUST_INDICES(start, end, self->length);
- result = PyLong_FromSsize_t(
- stringlib_count(self->str + start, end - start,
- substring->str, substring->length,
- PY_SSIZE_T_MAX)
- );
+ kind1 = PyUnicode_KIND(self);
+ kind2 = PyUnicode_KIND(substring);
+ if (kind2 > kind1)
+ return PyLong_FromLong(0);
+ kind = kind1;
+ buf1 = PyUnicode_DATA(self);
+ buf2 = PyUnicode_DATA(substring);
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(substring, kind);
+ if (!buf2) {
+ Py_DECREF(substring);
+ return NULL;
+ }
+ len1 = PyUnicode_GET_LENGTH(self);
+ len2 = PyUnicode_GET_LENGTH(substring);
+
+ ADJUST_INDICES(start, end, len1);
+ switch (kind) {
+ case PyUnicode_1BYTE_KIND:
+ iresult = ucs1lib_count(
+ ((Py_UCS1*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ case PyUnicode_2BYTE_KIND:
+ iresult = ucs2lib_count(
+ ((Py_UCS2*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ case PyUnicode_4BYTE_KIND:
+ iresult = ucs4lib_count(
+ ((Py_UCS4*)buf1) + start, end - start,
+ buf2, len2, PY_SSIZE_T_MAX
+ );
+ break;
+ default:
+ assert(0); iresult = 0;
+ }
+
+ result = PyLong_FromSsize_t(iresult);
+
+ if (kind2 != kind)
+ PyMem_Free(buf2);
Py_DECREF(substring);
@@ -7536,7 +10832,7 @@ a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\
codecs.register_error that can handle UnicodeEncodeErrors.");
static PyObject *
-unicode_encode(PyUnicodeObject *self, PyObject *args, PyObject *kwargs)
+unicode_encode(PyObject *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = {"encoding", "errors", 0};
char *encoding = NULL;
@@ -7545,7 +10841,7 @@ unicode_encode(PyUnicodeObject *self, PyObject *args, PyObject *kwargs)
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode",
kwlist, &encoding, &errors))
return NULL;
- return PyUnicode_AsEncodedString((PyObject *)self, encoding, errors);
+ return PyUnicode_AsEncodedString(self, encoding, errors);
}
PyDoc_STRVAR(expandtabs__doc__,
@@ -7555,82 +10851,82 @@ Return a copy of S where all tab characters are expanded using spaces.\n\
If tabsize is not given, a tab size of 8 characters is assumed.");
static PyObject*
-unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
-{
- Py_UNICODE *e;
- Py_UNICODE *p;
- Py_UNICODE *q;
- Py_UNICODE *qe;
- Py_ssize_t i, j, incr;
- PyUnicodeObject *u;
+unicode_expandtabs(PyObject *self, PyObject *args)
+{
+ Py_ssize_t i, j, line_pos, src_len, incr;
+ Py_UCS4 ch;
+ PyObject *u;
+ void *src_data, *dest_data;
int tabsize = 8;
+ int kind;
+ int found;
if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize))
return NULL;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
/* First pass: determine size of output string */
- i = 0; /* chars up to and including most recent \n or \r */
- j = 0; /* chars since most recent \n or \r (use in tab calculations) */
- e = self->str + self->length; /* end of input */
- for (p = self->str; p < e; p++)
- if (*p == '\t') {
+ src_len = PyUnicode_GET_LENGTH(self);
+ i = j = line_pos = 0;
+ kind = PyUnicode_KIND(self);
+ src_data = PyUnicode_DATA(self);
+ found = 0;
+ for (; i < src_len; i++) {
+ ch = PyUnicode_READ(kind, src_data, i);
+ if (ch == '\t') {
+ found = 1;
if (tabsize > 0) {
- incr = tabsize - (j % tabsize); /* cannot overflow */
+ incr = tabsize - (line_pos % tabsize); /* cannot overflow */
if (j > PY_SSIZE_T_MAX - incr)
- goto overflow1;
+ goto overflow;
+ line_pos += incr;
j += incr;
}
}
else {
if (j > PY_SSIZE_T_MAX - 1)
- goto overflow1;
+ goto overflow;
+ line_pos++;
j++;
- if (*p == '\n' || *p == '\r') {
- if (i > PY_SSIZE_T_MAX - j)
- goto overflow1;
- i += j;
- j = 0;
- }
+ if (ch == '\n' || ch == '\r')
+ line_pos = 0;
}
-
- if (i > PY_SSIZE_T_MAX - j)
- goto overflow1;
+ }
+ if (!found)
+ return unicode_result_unchanged(self);
/* Second pass: create output string and fill it */
- u = _PyUnicode_New(i + j);
+ u = PyUnicode_New(j, PyUnicode_MAX_CHAR_VALUE(self));
if (!u)
return NULL;
+ dest_data = PyUnicode_DATA(u);
- j = 0; /* same as in first pass */
- q = u->str; /* next output char */
- qe = u->str + u->length; /* end of output */
+ i = j = line_pos = 0;
- for (p = self->str; p < e; p++)
- if (*p == '\t') {
+ for (; i < src_len; i++) {
+ ch = PyUnicode_READ(kind, src_data, i);
+ if (ch == '\t') {
if (tabsize > 0) {
- i = tabsize - (j % tabsize);
- j += i;
- while (i--) {
- if (q >= qe)
- goto overflow2;
- *q++ = ' ';
- }
+ incr = tabsize - (line_pos % tabsize);
+ line_pos += incr;
+ FILL(kind, dest_data, ' ', j, incr);
+ j += incr;
}
}
else {
- if (q >= qe)
- goto overflow2;
- *q++ = *p;
+ line_pos++;
+ PyUnicode_WRITE(kind, dest_data, j, ch);
j++;
- if (*p == '\n' || *p == '\r')
- j = 0;
+ if (ch == '\n' || ch == '\r')
+ line_pos = 0;
}
+ }
+ assert (j == PyUnicode_GET_LENGTH(u));
+ return unicode_result(u);
- return (PyObject*) u;
-
- overflow2:
- Py_DECREF(u);
- overflow1:
+ overflow:
PyErr_SetString(PyExc_OverflowError, "new string is too long");
return NULL;
}
@@ -7645,9 +10941,9 @@ arguments start and end are interpreted as in slice notation.\n\
Return -1 on failure.");
static PyObject *
-unicode_find(PyUnicodeObject *self, PyObject *args)
+unicode_find(PyObject *self, PyObject *args)
{
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start;
Py_ssize_t end;
Py_ssize_t result;
@@ -7656,63 +10952,114 @@ unicode_find(PyUnicodeObject *self, PyObject *args)
&start, &end))
return NULL;
- result = stringlib_find_slice(
- PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
- PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
- start, end
- );
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ result = any_find_slice(1, self, substring, start, end);
Py_DECREF(substring);
+ if (result == -2)
+ return NULL;
+
return PyLong_FromSsize_t(result);
}
static PyObject *
-unicode_getitem(PyUnicodeObject *self, Py_ssize_t index)
+unicode_getitem(PyObject *self, Py_ssize_t index)
{
- if (index < 0 || index >= self->length) {
+ void *data;
+ enum PyUnicode_Kind kind;
+ Py_UCS4 ch;
+ PyObject *res;
+
+ if (!PyUnicode_Check(self) || PyUnicode_READY(self) == -1) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ if (index < 0 || index >= PyUnicode_GET_LENGTH(self)) {
PyErr_SetString(PyExc_IndexError, "string index out of range");
return NULL;
}
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+ ch = PyUnicode_READ(kind, data, index);
+ if (ch < 256)
+ return get_latin1_char(ch);
- return (PyObject*) PyUnicode_FromUnicode(&self->str[index], 1);
+ res = PyUnicode_New(1, ch);
+ if (res == NULL)
+ return NULL;
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ PyUnicode_WRITE(kind, data, 0, ch);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return res;
}
/* Believe it or not, this produces the same value for ASCII strings
- as string_hash(). */
+ as bytes_hash(). */
static Py_hash_t
-unicode_hash(PyUnicodeObject *self)
+unicode_hash(PyObject *self)
{
Py_ssize_t len;
- Py_UNICODE *p;
- Py_hash_t x;
+ Py_uhash_t x;
#ifdef Py_DEBUG
assert(_Py_HashSecret_Initialized);
#endif
- if (self->hash != -1)
- return self->hash;
- len = Py_SIZE(self);
+ if (_PyUnicode_HASH(self) != -1)
+ return _PyUnicode_HASH(self);
+ if (PyUnicode_READY(self) == -1)
+ return -1;
+ len = PyUnicode_GET_LENGTH(self);
/*
We make the hash of the empty string be 0, rather than using
(prefix ^ suffix), since this slightly obfuscates the hash secret
*/
if (len == 0) {
- self->hash = 0;
+ _PyUnicode_HASH(self) = 0;
return 0;
}
- p = self->str;
- x = _Py_HashSecret.prefix;
- x ^= *p << 7;
- while (--len >= 0)
- x = (_PyHASH_MULTIPLIER*x) ^ *p++;
- x ^= Py_SIZE(self);
- x ^= _Py_HashSecret.suffix;
+
+ /* The hash function as a macro, gets expanded three times below. */
+#define HASH(P) \
+ x ^= (Py_uhash_t) *P << 7; \
+ while (--len >= 0) \
+ x = (_PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *P++; \
+
+ x = (Py_uhash_t) _Py_HashSecret.prefix;
+ switch (PyUnicode_KIND(self)) {
+ case PyUnicode_1BYTE_KIND: {
+ const unsigned char *c = PyUnicode_1BYTE_DATA(self);
+ HASH(c);
+ break;
+ }
+ case PyUnicode_2BYTE_KIND: {
+ const Py_UCS2 *s = PyUnicode_2BYTE_DATA(self);
+ HASH(s);
+ break;
+ }
+ default: {
+ Py_UCS4 *l;
+ assert(PyUnicode_KIND(self) == PyUnicode_4BYTE_KIND &&
+ "Impossible switch case in unicode_hash");
+ l = PyUnicode_4BYTE_DATA(self);
+ HASH(l);
+ break;
+ }
+ }
+ x ^= (Py_uhash_t) PyUnicode_GET_LENGTH(self);
+ x ^= (Py_uhash_t) _Py_HashSecret.suffix;
+
if (x == -1)
x = -2;
- self->hash = x;
+ _PyUnicode_HASH(self) = x;
return x;
}
+#undef HASH
PyDoc_STRVAR(index__doc__,
"S.index(sub[, start[, end]]) -> int\n\
@@ -7720,10 +11067,10 @@ PyDoc_STRVAR(index__doc__,
Like S.find() but raise ValueError when the substring is not found.");
static PyObject *
-unicode_index(PyUnicodeObject *self, PyObject *args)
+unicode_index(PyObject *self, PyObject *args)
{
Py_ssize_t result;
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start;
Py_ssize_t end;
@@ -7731,14 +11078,18 @@ unicode_index(PyUnicodeObject *self, PyObject *args)
&start, &end))
return NULL;
- result = stringlib_find_slice(
- PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
- PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
- start, end
- );
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ result = any_find_slice(1, self, substring, start, end);
Py_DECREF(substring);
+ if (result == -2)
+ return NULL;
+
if (result < 0) {
PyErr_SetString(PyExc_ValueError, "substring not found");
return NULL;
@@ -7754,24 +11105,31 @@ Return True if all cased characters in S are lowercase and there is\n\
at least one cased character in S, False otherwise.");
static PyObject*
-unicode_islower(PyUnicodeObject *self)
+unicode_islower(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
int cased;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1)
- return PyBool_FromLong(Py_UNICODE_ISLOWER(*p));
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISLOWER(PyUnicode_READ(kind, data, 0)));
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
cased = 0;
- while (p < e) {
- const Py_UCS4 ch = _Py_UNICODE_NEXT(p, e);
+ for (i = 0; i < length; i++) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (Py_UNICODE_ISUPPER(ch) || Py_UNICODE_ISTITLE(ch))
return PyBool_FromLong(0);
@@ -7788,24 +11146,31 @@ Return True if all cased characters in S are uppercase and there is\n\
at least one cased character in S, False otherwise.");
static PyObject*
-unicode_isupper(PyUnicodeObject *self)
+unicode_isupper(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
int cased;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1)
- return PyBool_FromLong(Py_UNICODE_ISUPPER(*p) != 0);
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISUPPER(PyUnicode_READ(kind, data, 0)) != 0);
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
cased = 0;
- while (p < e) {
- const Py_UCS4 ch = _Py_UNICODE_NEXT(p, e);
+ for (i = 0; i < length; i++) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (Py_UNICODE_ISLOWER(ch) || Py_UNICODE_ISTITLE(ch))
return PyBool_FromLong(0);
@@ -7824,26 +11189,34 @@ follow uncased characters and lowercase characters only cased ones.\n\
Return False otherwise.");
static PyObject*
-unicode_istitle(PyUnicodeObject *self)
+unicode_istitle(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
int cased, previous_is_cased;
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1)
- return PyBool_FromLong((Py_UNICODE_ISTITLE(*p) != 0) ||
- (Py_UNICODE_ISUPPER(*p) != 0));
+ if (length == 1) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, 0);
+ return PyBool_FromLong((Py_UNICODE_ISTITLE(ch) != 0) ||
+ (Py_UNICODE_ISUPPER(ch) != 0));
+ }
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
cased = 0;
previous_is_cased = 0;
- while (p < e) {
- const Py_UCS4 ch = _Py_UNICODE_NEXT(p, e);
+ for (i = 0; i < length; i++) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (Py_UNICODE_ISUPPER(ch) || Py_UNICODE_ISTITLE(ch)) {
if (previous_is_cased)
@@ -7870,23 +11243,29 @@ Return True if all characters in S are whitespace\n\
and there is at least one character in S, False otherwise.");
static PyObject*
-unicode_isspace(PyUnicodeObject *self)
+unicode_isspace(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISSPACE(*p))
- return PyBool_FromLong(1);
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, 0)));
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- const Py_UCS4 ch = _Py_UNICODE_NEXT(p, e);
+ for (i = 0; i < length; i++) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (!Py_UNICODE_ISSPACE(ch))
return PyBool_FromLong(0);
}
@@ -7900,23 +11279,29 @@ Return True if all characters in S are alphabetic\n\
and there is at least one character in S, False otherwise.");
static PyObject*
-unicode_isalpha(PyUnicodeObject *self)
+unicode_isalpha(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISALPHA(*p))
- return PyBool_FromLong(1);
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISALPHA(PyUnicode_READ(kind, data, 0)));
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- if (!Py_UNICODE_ISALPHA(_Py_UNICODE_NEXT(p, e)))
+ for (i = 0; i < length; i++) {
+ if (!Py_UNICODE_ISALPHA(PyUnicode_READ(kind, data, i)))
return PyBool_FromLong(0);
}
return PyBool_FromLong(1);
@@ -7929,23 +11314,31 @@ Return True if all characters in S are alphanumeric\n\
and there is at least one character in S, False otherwise.");
static PyObject*
-unicode_isalnum(PyUnicodeObject *self)
+unicode_isalnum(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ int kind;
+ void *data;
+ Py_ssize_t len, i;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+ len = PyUnicode_GET_LENGTH(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISALNUM(*p))
- return PyBool_FromLong(1);
+ if (len == 1) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, 0);
+ return PyBool_FromLong(Py_UNICODE_ISALNUM(ch));
+ }
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (len == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- const Py_UCS4 ch = _Py_UNICODE_NEXT(p, e);
+ for (i = 0; i < len; i++) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (!Py_UNICODE_ISALNUM(ch))
return PyBool_FromLong(0);
}
@@ -7959,23 +11352,29 @@ Return True if there are only decimal characters in S,\n\
False otherwise.");
static PyObject*
-unicode_isdecimal(PyUnicodeObject *self)
+unicode_isdecimal(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISDECIMAL(*p))
- return PyBool_FromLong(1);
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISDECIMAL(PyUnicode_READ(kind, data, 0)));
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- if (!Py_UNICODE_ISDECIMAL(_Py_UNICODE_NEXT(p, e)))
+ for (i = 0; i < length; i++) {
+ if (!Py_UNICODE_ISDECIMAL(PyUnicode_READ(kind, data, i)))
return PyBool_FromLong(0);
}
return PyBool_FromLong(1);
@@ -7988,23 +11387,30 @@ Return True if all characters in S are digits\n\
and there is at least one character in S, False otherwise.");
static PyObject*
-unicode_isdigit(PyUnicodeObject *self)
+unicode_isdigit(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISDIGIT(*p))
- return PyBool_FromLong(1);
+ if (length == 1) {
+ const Py_UCS4 ch = PyUnicode_READ(kind, data, 0);
+ return PyBool_FromLong(Py_UNICODE_ISDIGIT(ch));
+ }
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- if (!Py_UNICODE_ISDIGIT(_Py_UNICODE_NEXT(p, e)))
+ for (i = 0; i < length; i++) {
+ if (!Py_UNICODE_ISDIGIT(PyUnicode_READ(kind, data, i)))
return PyBool_FromLong(0);
}
return PyBool_FromLong(1);
@@ -8017,23 +11423,29 @@ Return True if there are only numeric characters in S,\n\
False otherwise.");
static PyObject*
-unicode_isnumeric(PyUnicodeObject *self)
+unicode_isnumeric(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 &&
- Py_UNICODE_ISNUMERIC(*p))
- return PyBool_FromLong(1);
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISNUMERIC(PyUnicode_READ(kind, data, 0)));
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (length == 0)
return PyBool_FromLong(0);
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- if (!Py_UNICODE_ISNUMERIC(_Py_UNICODE_NEXT(p, e)))
+ for (i = 0; i < length; i++) {
+ if (!Py_UNICODE_ISNUMERIC(PyUnicode_READ(kind, data, i)))
return PyBool_FromLong(0);
}
return PyBool_FromLong(1);
@@ -8042,13 +11454,21 @@ unicode_isnumeric(PyUnicodeObject *self)
int
PyUnicode_IsIdentifier(PyObject *self)
{
- const Py_UNICODE *p = PyUnicode_AS_UNICODE((PyUnicodeObject*)self);
- const Py_UNICODE *e;
+ int kind;
+ void *data;
+ Py_ssize_t i;
Py_UCS4 first;
+ if (PyUnicode_READY(self) == -1) {
+ Py_FatalError("identifier not ready");
+ return 0;
+ }
+
/* Special case for empty strings */
- if (PyUnicode_GET_SIZE(self) == 0)
+ if (PyUnicode_GET_LENGTH(self) == 0)
return 0;
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* PEP 3131 says that the first character must be in
XID_Start and subsequent characters in XID_Continue,
@@ -8058,13 +11478,12 @@ PyUnicode_IsIdentifier(PyObject *self)
definition of XID_Start and XID_Continue, it is sufficient
to check just for these, except that _ must be allowed
as starting an identifier. */
- e = p + PyUnicode_GET_SIZE(self);
- first = _Py_UNICODE_NEXT(p, e);
+ first = PyUnicode_READ(kind, data, 0);
if (!_PyUnicode_IsXidStart(first) && first != 0x5F /* LOW LINE */)
return 0;
- while (p < e)
- if (!_PyUnicode_IsXidContinue(_Py_UNICODE_NEXT(p, e)))
+ for (i = 1; i < PyUnicode_GET_LENGTH(self); i++)
+ if (!_PyUnicode_IsXidContinue(PyUnicode_READ(kind, data, i)))
return 0;
return 1;
}
@@ -8090,17 +11509,23 @@ printable in repr() or S is empty, False otherwise.");
static PyObject*
unicode_isprintable(PyObject *self)
{
- register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self);
- register const Py_UNICODE *e;
+ Py_ssize_t i, length;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ length = PyUnicode_GET_LENGTH(self);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
/* Shortcut for single character strings */
- if (PyUnicode_GET_SIZE(self) == 1 && Py_UNICODE_ISPRINTABLE(*p)) {
- Py_RETURN_TRUE;
- }
+ if (length == 1)
+ return PyBool_FromLong(
+ Py_UNICODE_ISPRINTABLE(PyUnicode_READ(kind, data, 0)));
- e = p + PyUnicode_GET_SIZE(self);
- while (p < e) {
- if (!Py_UNICODE_ISPRINTABLE(_Py_UNICODE_NEXT(p, e))) {
+ for (i = 0; i < length; i++) {
+ if (!Py_UNICODE_ISPRINTABLE(PyUnicode_READ(kind, data, i))) {
Py_RETURN_FALSE;
}
}
@@ -8120,9 +11545,11 @@ unicode_join(PyObject *self, PyObject *data)
}
static Py_ssize_t
-unicode_length(PyUnicodeObject *self)
+unicode_length(PyObject *self)
{
- return self->length;
+ if (PyUnicode_READY(self) == -1)
+ return -1;
+ return PyUnicode_GET_LENGTH(self);
}
PyDoc_STRVAR(ljust__doc__,
@@ -8132,20 +11559,21 @@ Return S left-justified in a Unicode string of length width. Padding is\n\
done using the specified fill character (default is a space).");
static PyObject *
-unicode_ljust(PyUnicodeObject *self, PyObject *args)
+unicode_ljust(PyObject *self, PyObject *args)
{
Py_ssize_t width;
- Py_UNICODE fillchar = ' ';
+ Py_UCS4 fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|O&:ljust", &width, convert_uc, &fillchar))
return NULL;
- if (self->length >= width && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*) self;
- }
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
+ if (PyUnicode_GET_LENGTH(self) >= width)
+ return unicode_result_unchanged(self);
- return (PyObject*) pad(self, 0, width - self->length, fillchar);
+ return pad(self, 0, width - PyUnicode_GET_LENGTH(self), fillchar);
}
PyDoc_STRVAR(lower__doc__,
@@ -8154,9 +11582,13 @@ PyDoc_STRVAR(lower__doc__,
Return a copy of the string S converted to lowercase.");
static PyObject*
-unicode_lower(PyUnicodeObject *self)
+unicode_lower(PyObject *self)
{
- return fixup(self, fixlower);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_IS_ASCII(self))
+ return ascii_upper_or_lower(self, 1);
+ return case_operation(self, do_lower);
}
#define LEFTSTRIP 0
@@ -8170,19 +11602,27 @@ static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"};
/* externally visible for str.strip(unicode) */
PyObject *
-_PyUnicode_XStrip(PyUnicodeObject *self, int striptype, PyObject *sepobj)
+_PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
{
- Py_UNICODE *s = PyUnicode_AS_UNICODE(self);
- Py_ssize_t len = PyUnicode_GET_SIZE(self);
- Py_UNICODE *sep = PyUnicode_AS_UNICODE(sepobj);
- Py_ssize_t seplen = PyUnicode_GET_SIZE(sepobj);
- Py_ssize_t i, j;
+ void *data;
+ int kind;
+ Py_ssize_t i, j, len;
+ BLOOM_MASK sepmask;
+
+ if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1)
+ return NULL;
- BLOOM_MASK sepmask = make_bloom_mask(sep, seplen);
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+ len = PyUnicode_GET_LENGTH(self);
+ sepmask = make_bloom_mask(PyUnicode_KIND(sepobj),
+ PyUnicode_DATA(sepobj),
+ PyUnicode_GET_LENGTH(sepobj));
i = 0;
if (striptype != RIGHTSTRIP) {
- while (i < len && BLOOM_MEMBER(sepmask, s[i], sep, seplen)) {
+ while (i < len &&
+ BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, i), sepobj)) {
i++;
}
}
@@ -8191,28 +11631,70 @@ _PyUnicode_XStrip(PyUnicodeObject *self, int striptype, PyObject *sepobj)
if (striptype != LEFTSTRIP) {
do {
j--;
- } while (j >= i && BLOOM_MEMBER(sepmask, s[j], sep, seplen));
+ } while (j >= i &&
+ BLOOM_MEMBER(sepmask, PyUnicode_READ(kind, data, j), sepobj));
j++;
}
- if (i == 0 && j == len && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*)self;
- }
- else
- return PyUnicode_FromUnicode(s+i, j-i);
+ return PyUnicode_Substring(self, i, j);
}
+PyObject*
+PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end)
+{
+ unsigned char *data;
+ int kind;
+ Py_ssize_t length;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
+ length = PyUnicode_GET_LENGTH(self);
+ end = Py_MIN(end, length);
+
+ if (start == 0 && end == length)
+ return unicode_result_unchanged(self);
+
+ if (start < 0 || end < 0) {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return NULL;
+ }
+ if (start >= length || end < start) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
+
+ length = end - start;
+ if (PyUnicode_IS_ASCII(self)) {
+ data = PyUnicode_1BYTE_DATA(self);
+ return _PyUnicode_FromASCII((char*)(data + start), length);
+ }
+ else {
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_1BYTE_DATA(self);
+ return PyUnicode_FromKindAndData(kind,
+ data + kind * start,
+ length);
+ }
+}
static PyObject *
-do_strip(PyUnicodeObject *self, int striptype)
+do_strip(PyObject *self, int striptype)
{
- Py_UNICODE *s = PyUnicode_AS_UNICODE(self);
- Py_ssize_t len = PyUnicode_GET_SIZE(self), i, j;
+ int kind;
+ void *data;
+ Py_ssize_t len, i, j;
+
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
+ kind = PyUnicode_KIND(self);
+ data = PyUnicode_DATA(self);
+ len = PyUnicode_GET_LENGTH(self);
i = 0;
if (striptype != RIGHTSTRIP) {
- while (i < len && Py_UNICODE_ISSPACE(s[i])) {
+ while (i < len && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, i))) {
i++;
}
}
@@ -8221,21 +11703,16 @@ do_strip(PyUnicodeObject *self, int striptype)
if (striptype != LEFTSTRIP) {
do {
j--;
- } while (j >= i && Py_UNICODE_ISSPACE(s[j]));
+ } while (j >= i && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, j)));
j++;
}
- if (i == 0 && j == len && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*)self;
- }
- else
- return PyUnicode_FromUnicode(s+i, j-i);
+ return PyUnicode_Substring(self, i, j);
}
static PyObject *
-do_argstrip(PyUnicodeObject *self, int striptype, PyObject *args)
+do_argstrip(PyObject *self, int striptype, PyObject *args)
{
PyObject *sep = NULL;
@@ -8265,7 +11742,7 @@ whitespace removed.\n\
If chars is given and not None, remove characters in chars instead.");
static PyObject *
-unicode_strip(PyUnicodeObject *self, PyObject *args)
+unicode_strip(PyObject *self, PyObject *args)
{
if (PyTuple_GET_SIZE(args) == 0)
return do_strip(self, BOTHSTRIP); /* Common case */
@@ -8281,7 +11758,7 @@ Return a copy of the string S with leading whitespace removed.\n\
If chars is given and not None, remove characters in chars instead.");
static PyObject *
-unicode_lstrip(PyUnicodeObject *self, PyObject *args)
+unicode_lstrip(PyObject *self, PyObject *args)
{
if (PyTuple_GET_SIZE(args) == 0)
return do_strip(self, LEFTSTRIP); /* Common case */
@@ -8297,7 +11774,7 @@ Return a copy of the string S with trailing whitespace removed.\n\
If chars is given and not None, remove characters in chars instead.");
static PyObject *
-unicode_rstrip(PyUnicodeObject *self, PyObject *args)
+unicode_rstrip(PyObject *self, PyObject *args)
{
if (PyTuple_GET_SIZE(args) == 0)
return do_strip(self, RIGHTSTRIP); /* Common case */
@@ -8307,64 +11784,76 @@ unicode_rstrip(PyUnicodeObject *self, PyObject *args)
static PyObject*
-unicode_repeat(PyUnicodeObject *str, Py_ssize_t len)
+unicode_repeat(PyObject *str, Py_ssize_t len)
{
- PyUnicodeObject *u;
- Py_UNICODE *p;
- Py_ssize_t nchars;
- size_t nbytes;
+ PyObject *u;
+ Py_ssize_t nchars, n;
if (len < 1) {
Py_INCREF(unicode_empty);
- return (PyObject *)unicode_empty;
+ return unicode_empty;
}
- if (len == 1 && PyUnicode_CheckExact(str)) {
- /* no repeat, return original string */
- Py_INCREF(str);
- return (PyObject*) str;
- }
+ /* no repeat, return original string */
+ if (len == 1)
+ return unicode_result_unchanged(str);
- /* ensure # of chars needed doesn't overflow int and # of bytes
- * needed doesn't overflow size_t
- */
- nchars = len * str->length;
- if (nchars / len != str->length) {
- PyErr_SetString(PyExc_OverflowError,
- "repeated string is too long");
+ if (PyUnicode_READY(str) == -1)
return NULL;
- }
- nbytes = (nchars + 1) * sizeof(Py_UNICODE);
- if (nbytes / sizeof(Py_UNICODE) != (size_t)(nchars + 1)) {
+
+ if (PyUnicode_GET_LENGTH(str) > PY_SSIZE_T_MAX / len) {
PyErr_SetString(PyExc_OverflowError,
"repeated string is too long");
return NULL;
}
- u = _PyUnicode_New(nchars);
+ nchars = len * PyUnicode_GET_LENGTH(str);
+
+ u = PyUnicode_New(nchars, PyUnicode_MAX_CHAR_VALUE(str));
if (!u)
return NULL;
-
- p = u->str;
-
- if (str->length == 1) {
- Py_UNICODE_FILL(p, str->str[0], len);
- } else {
- Py_ssize_t done = str->length; /* number of characters copied this far */
- Py_UNICODE_COPY(p, str->str, str->length);
+ assert(PyUnicode_KIND(u) == PyUnicode_KIND(str));
+
+ if (PyUnicode_GET_LENGTH(str) == 1) {
+ const int kind = PyUnicode_KIND(str);
+ const Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0);
+ if (kind == PyUnicode_1BYTE_KIND) {
+ void *to = PyUnicode_DATA(u);
+ memset(to, (unsigned char)fill_char, len);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ Py_UCS2 *ucs2 = PyUnicode_2BYTE_DATA(u);
+ for (n = 0; n < len; ++n)
+ ucs2[n] = fill_char;
+ } else {
+ Py_UCS4 *ucs4 = PyUnicode_4BYTE_DATA(u);
+ assert(kind == PyUnicode_4BYTE_KIND);
+ for (n = 0; n < len; ++n)
+ ucs4[n] = fill_char;
+ }
+ }
+ else {
+ /* number of characters copied this far */
+ Py_ssize_t done = PyUnicode_GET_LENGTH(str);
+ const Py_ssize_t char_size = PyUnicode_KIND(str);
+ char *to = (char *) PyUnicode_DATA(u);
+ Py_MEMCPY(to, PyUnicode_DATA(str),
+ PyUnicode_GET_LENGTH(str) * char_size);
while (done < nchars) {
- Py_ssize_t n = (done <= nchars-done) ? done : nchars-done;
- Py_UNICODE_COPY(p+done, p, n);
+ n = (done <= nchars-done) ? done : nchars-done;
+ Py_MEMCPY(to + (done * char_size), to, n * char_size);
done += n;
}
}
- return (PyObject*) u;
+ assert(_PyUnicode_CheckConsistency(u, 1));
+ return u;
}
-PyObject *PyUnicode_Replace(PyObject *obj,
- PyObject *subobj,
- PyObject *replobj,
- Py_ssize_t maxcount)
+PyObject *
+PyUnicode_Replace(PyObject *obj,
+ PyObject *subobj,
+ PyObject *replobj,
+ Py_ssize_t maxcount)
{
PyObject *self;
PyObject *str1;
@@ -8385,10 +11874,12 @@ PyObject *PyUnicode_Replace(PyObject *obj,
Py_DECREF(str1);
return NULL;
}
- result = replace((PyUnicodeObject *)self,
- (PyUnicodeObject *)str1,
- (PyUnicodeObject *)str2,
- maxcount);
+ if (PyUnicode_READY(self) == -1 ||
+ PyUnicode_READY(str1) == -1 ||
+ PyUnicode_READY(str2) == -1)
+ result = NULL;
+ else
+ result = replace(self, str1, str2, maxcount);
Py_DECREF(self);
Py_DECREF(str1);
Py_DECREF(str2);
@@ -8403,177 +11894,181 @@ old replaced by new. If the optional argument count is\n\
given, only the first count occurrences are replaced.");
static PyObject*
-unicode_replace(PyUnicodeObject *self, PyObject *args)
+unicode_replace(PyObject *self, PyObject *args)
{
- PyUnicodeObject *str1;
- PyUnicodeObject *str2;
+ PyObject *str1;
+ PyObject *str2;
Py_ssize_t maxcount = -1;
PyObject *result;
if (!PyArg_ParseTuple(args, "OO|n:replace", &str1, &str2, &maxcount))
return NULL;
- str1 = (PyUnicodeObject *)PyUnicode_FromObject((PyObject *)str1);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ str1 = PyUnicode_FromObject(str1);
if (str1 == NULL)
return NULL;
- str2 = (PyUnicodeObject *)PyUnicode_FromObject((PyObject *)str2);
+ str2 = PyUnicode_FromObject(str2);
if (str2 == NULL) {
Py_DECREF(str1);
return NULL;
}
-
- result = replace(self, str1, str2, maxcount);
+ if (PyUnicode_READY(str1) == -1 || PyUnicode_READY(str2) == -1)
+ result = NULL;
+ else
+ result = replace(self, str1, str2, maxcount);
Py_DECREF(str1);
Py_DECREF(str2);
return result;
}
-static
-PyObject *unicode_repr(PyObject *unicode)
+static PyObject *
+unicode_repr(PyObject *unicode)
{
PyObject *repr;
- Py_UNICODE *p;
- Py_UNICODE *s = PyUnicode_AS_UNICODE(unicode);
- Py_ssize_t size = PyUnicode_GET_SIZE(unicode);
+ Py_ssize_t isize;
+ Py_ssize_t osize, squote, dquote, i, o;
+ Py_UCS4 max, quote;
+ int ikind, okind;
+ void *idata, *odata;
- /* XXX(nnorwitz): rather than over-allocating, it would be
- better to choose a different scheme. Perhaps scan the
- first N-chars of the string and allocate based on that size.
- */
- /* Initial allocation is based on the longest-possible unichr
- escape.
+ if (PyUnicode_READY(unicode) == -1)
+ return NULL;
- In wide (UTF-32) builds '\U00xxxxxx' is 10 chars per source
- unichr, so in this case it's the longest unichr escape. In
- narrow (UTF-16) builds this is five chars per source unichr
- since there are two unichrs in the surrogate pair, so in narrow
- (UTF-16) builds it's not the longest unichr escape.
+ isize = PyUnicode_GET_LENGTH(unicode);
+ idata = PyUnicode_DATA(unicode);
+
+ /* Compute length of output, quote characters, and
+ maximum character */
+ osize = 2; /* quotes */
+ max = 127;
+ squote = dquote = 0;
+ ikind = PyUnicode_KIND(unicode);
+ for (i = 0; i < isize; i++) {
+ Py_UCS4 ch = PyUnicode_READ(ikind, idata, i);
+ switch (ch) {
+ case '\'': squote++; osize++; break;
+ case '"': dquote++; osize++; break;
+ case '\\': case '\t': case '\r': case '\n':
+ osize += 2; break;
+ default:
+ /* Fast-path ASCII */
+ if (ch < ' ' || ch == 0x7f)
+ osize += 4; /* \xHH */
+ else if (ch < 0x7f)
+ osize++;
+ else if (Py_UNICODE_ISPRINTABLE(ch)) {
+ osize++;
+ max = ch > max ? ch : max;
+ }
+ else if (ch < 0x100)
+ osize += 4; /* \xHH */
+ else if (ch < 0x10000)
+ osize += 6; /* \uHHHH */
+ else
+ osize += 10; /* \uHHHHHHHH */
+ }
+ }
- In wide or narrow builds '\uxxxx' is 6 chars per source unichr,
- so in the narrow (UTF-16) build case it's the longest unichr
- escape.
- */
+ quote = '\'';
+ if (squote) {
+ if (dquote)
+ /* Both squote and dquote present. Use squote,
+ and escape them */
+ osize += squote;
+ else
+ quote = '"';
+ }
- repr = PyUnicode_FromUnicode(NULL,
- 2 /* quotes */
-#ifdef Py_UNICODE_WIDE
- + 10*size
-#else
- + 6*size
-#endif
- + 1);
+ repr = PyUnicode_New(osize, max);
if (repr == NULL)
return NULL;
+ okind = PyUnicode_KIND(repr);
+ odata = PyUnicode_DATA(repr);
- p = PyUnicode_AS_UNICODE(repr);
+ PyUnicode_WRITE(okind, odata, 0, quote);
+ PyUnicode_WRITE(okind, odata, osize-1, quote);
- /* Add quote */
- *p++ = (findchar(s, size, '\'') &&
- !findchar(s, size, '"')) ? '"' : '\'';
- while (size-- > 0) {
- Py_UNICODE ch = *s++;
+ for (i = 0, o = 1; i < isize; i++) {
+ Py_UCS4 ch = PyUnicode_READ(ikind, idata, i);
/* Escape quotes and backslashes */
- if ((ch == PyUnicode_AS_UNICODE(repr)[0]) || (ch == '\\')) {
- *p++ = '\\';
- *p++ = ch;
+ if ((ch == quote) || (ch == '\\')) {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, ch);
continue;
}
/* Map special whitespace to '\t', \n', '\r' */
if (ch == '\t') {
- *p++ = '\\';
- *p++ = 't';
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 't');
}
else if (ch == '\n') {
- *p++ = '\\';
- *p++ = 'n';
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'n');
}
else if (ch == '\r') {
- *p++ = '\\';
- *p++ = 'r';
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'r');
}
/* Map non-printable US ASCII to '\xhh' */
else if (ch < ' ' || ch == 0x7F) {
- *p++ = '\\';
- *p++ = 'x';
- *p++ = hexdigits[(ch >> 4) & 0x000F];
- *p++ = hexdigits[ch & 0x000F];
+ PyUnicode_WRITE(okind, odata, o++, '\\');
+ PyUnicode_WRITE(okind, odata, o++, 'x');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
}
/* Copy ASCII characters as-is */
else if (ch < 0x7F) {
- *p++ = ch;
+ PyUnicode_WRITE(okind, odata, o++, ch);
}
/* Non-ASCII characters */
else {
- Py_UCS4 ucs = ch;
-
-#ifndef Py_UNICODE_WIDE
- Py_UNICODE ch2 = 0;
- /* Get code point from surrogate pair */
- if (size > 0) {
- ch2 = *s;
- if (ch >= 0xD800 && ch < 0xDC00 && ch2 >= 0xDC00
- && ch2 <= 0xDFFF) {
- ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF))
- + 0x00010000;
- s++;
- size--;
- }
- }
-#endif
/* Map Unicode whitespace and control characters
(categories Z* and C* except ASCII space)
*/
- if (!Py_UNICODE_ISPRINTABLE(ucs)) {
+ if (!Py_UNICODE_ISPRINTABLE(ch)) {
+ PyUnicode_WRITE(okind, odata, o++, '\\');
/* Map 8-bit characters to '\xhh' */
- if (ucs <= 0xff) {
- *p++ = '\\';
- *p++ = 'x';
- *p++ = hexdigits[(ch >> 4) & 0x000F];
- *p++ = hexdigits[ch & 0x000F];
- }
- /* Map 21-bit characters to '\U00xxxxxx' */
- else if (ucs >= 0x10000) {
- *p++ = '\\';
- *p++ = 'U';
- *p++ = hexdigits[(ucs >> 28) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 24) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 20) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 16) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 12) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 8) & 0x0000000F];
- *p++ = hexdigits[(ucs >> 4) & 0x0000000F];
- *p++ = hexdigits[ucs & 0x0000000F];
+ if (ch <= 0xff) {
+ PyUnicode_WRITE(okind, odata, o++, 'x');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]);
}
/* Map 16-bit characters to '\uxxxx' */
+ else if (ch <= 0xffff) {
+ PyUnicode_WRITE(okind, odata, o++, 'u');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
+ }
+ /* Map 21-bit characters to '\U00xxxxxx' */
else {
- *p++ = '\\';
- *p++ = 'u';
- *p++ = hexdigits[(ucs >> 12) & 0x000F];
- *p++ = hexdigits[(ucs >> 8) & 0x000F];
- *p++ = hexdigits[(ucs >> 4) & 0x000F];
- *p++ = hexdigits[ucs & 0x000F];
+ PyUnicode_WRITE(okind, odata, o++, 'U');
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 28) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 24) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 20) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 16) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]);
+ PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]);
}
}
/* Copy characters as-is */
else {
- *p++ = ch;
-#ifndef Py_UNICODE_WIDE
- if (ucs >= 0x10000)
- *p++ = ch2;
-#endif
+ PyUnicode_WRITE(okind, odata, o++, ch);
}
}
}
- /* Add quote */
- *p++ = PyUnicode_AS_UNICODE(repr)[0];
-
- *p = '\0';
- PyUnicode_Resize(&repr, p - PyUnicode_AS_UNICODE(repr));
+ /* Closing quote already added at the beginning */
+ assert(_PyUnicode_CheckConsistency(repr, 1));
return repr;
}
@@ -8587,9 +12082,9 @@ arguments start and end are interpreted as in slice notation.\n\
Return -1 on failure.");
static PyObject *
-unicode_rfind(PyUnicodeObject *self, PyObject *args)
+unicode_rfind(PyObject *self, PyObject *args)
{
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start;
Py_ssize_t end;
Py_ssize_t result;
@@ -8598,14 +12093,18 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args)
&start, &end))
return NULL;
- result = stringlib_rfind_slice(
- PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
- PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
- start, end
- );
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ result = any_find_slice(-1, self, substring, start, end);
Py_DECREF(substring);
+ if (result == -2)
+ return NULL;
+
return PyLong_FromSsize_t(result);
}
@@ -8615,9 +12114,9 @@ PyDoc_STRVAR(rindex__doc__,
Like S.rfind() but raise ValueError when the substring is not found.");
static PyObject *
-unicode_rindex(PyUnicodeObject *self, PyObject *args)
+unicode_rindex(PyObject *self, PyObject *args)
{
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start;
Py_ssize_t end;
Py_ssize_t result;
@@ -8626,18 +12125,23 @@ unicode_rindex(PyUnicodeObject *self, PyObject *args)
&start, &end))
return NULL;
- result = stringlib_rfind_slice(
- PyUnicode_AS_UNICODE(self), PyUnicode_GET_SIZE(self),
- PyUnicode_AS_UNICODE(substring), PyUnicode_GET_SIZE(substring),
- start, end
- );
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_READY(substring) == -1)
+ return NULL;
+
+ result = any_find_slice(-1, self, substring, start, end);
Py_DECREF(substring);
+ if (result == -2)
+ return NULL;
+
if (result < 0) {
PyErr_SetString(PyExc_ValueError, "substring not found");
return NULL;
}
+
return PyLong_FromSsize_t(result);
}
@@ -8648,25 +12152,25 @@ Return S right-justified in a string of length width. Padding is\n\
done using the specified fill character (default is a space).");
static PyObject *
-unicode_rjust(PyUnicodeObject *self, PyObject *args)
+unicode_rjust(PyObject *self, PyObject *args)
{
Py_ssize_t width;
- Py_UNICODE fillchar = ' ';
+ Py_UCS4 fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|O&:rjust", &width, convert_uc, &fillchar))
return NULL;
- if (self->length >= width && PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*) self;
- }
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
+ if (PyUnicode_GET_LENGTH(self) >= width)
+ return unicode_result_unchanged(self);
- return (PyObject*) pad(self, width - self->length, 0, fillchar);
+ return pad(self, width - PyUnicode_GET_LENGTH(self), 0, fillchar);
}
-PyObject *PyUnicode_Split(PyObject *s,
- PyObject *sep,
- Py_ssize_t maxsplit)
+PyObject *
+PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit)
{
PyObject *result;
@@ -8681,7 +12185,7 @@ PyObject *PyUnicode_Split(PyObject *s,
}
}
- result = split((PyUnicodeObject *)s, (PyUnicodeObject *)sep, maxsplit);
+ result = split(s, sep, maxsplit);
Py_DECREF(s);
Py_XDECREF(sep);
@@ -8689,7 +12193,7 @@ PyObject *PyUnicode_Split(PyObject *s,
}
PyDoc_STRVAR(split__doc__,
- "S.split([sep[, maxsplit]]) -> list of strings\n\
+ "S.split(sep=None, maxsplit=-1) -> list of strings\n\
\n\
Return a list of the words in S, using sep as the\n\
delimiter string. If maxsplit is given, at most maxsplit\n\
@@ -8698,20 +12202,22 @@ whitespace string is a separator and empty strings are\n\
removed from the result.");
static PyObject*
-unicode_split(PyUnicodeObject *self, PyObject *args)
+unicode_split(PyObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
PyObject *substring = Py_None;
Py_ssize_t maxcount = -1;
- if (!PyArg_ParseTuple(args, "|On:split", &substring, &maxcount))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split",
+ kwlist, &substring, &maxcount))
return NULL;
if (substring == Py_None)
return split(self, NULL, maxcount);
else if (PyUnicode_Check(substring))
- return split(self, (PyUnicodeObject *)substring, maxcount);
+ return split(self, substring, maxcount);
else
- return PyUnicode_Split((PyObject *)self, substring, maxcount);
+ return PyUnicode_Split(self, substring, maxcount);
}
PyObject *
@@ -8720,6 +12226,9 @@ PyUnicode_Partition(PyObject *str_in, PyObject *sep_in)
PyObject* str_obj;
PyObject* sep_obj;
PyObject* out;
+ int kind1, kind2, kind;
+ void *buf1 = NULL, *buf2 = NULL;
+ Py_ssize_t len1, len2;
str_obj = PyUnicode_FromObject(str_in);
if (!str_obj)
@@ -8729,16 +12238,62 @@ PyUnicode_Partition(PyObject *str_in, PyObject *sep_in)
Py_DECREF(str_obj);
return NULL;
}
+ if (PyUnicode_READY(sep_obj) == -1 || PyUnicode_READY(str_obj) == -1) {
+ Py_DECREF(sep_obj);
+ Py_DECREF(str_obj);
+ return NULL;
+ }
- out = stringlib_partition(
- str_obj, PyUnicode_AS_UNICODE(str_obj), PyUnicode_GET_SIZE(str_obj),
- sep_obj, PyUnicode_AS_UNICODE(sep_obj), PyUnicode_GET_SIZE(sep_obj)
- );
+ kind1 = PyUnicode_KIND(str_obj);
+ kind2 = PyUnicode_KIND(sep_obj);
+ kind = Py_MAX(kind1, kind2);
+ buf1 = PyUnicode_DATA(str_obj);
+ if (kind1 != kind)
+ buf1 = _PyUnicode_AsKind(str_obj, kind);
+ if (!buf1)
+ goto onError;
+ buf2 = PyUnicode_DATA(sep_obj);
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(sep_obj, kind);
+ if (!buf2)
+ goto onError;
+ len1 = PyUnicode_GET_LENGTH(str_obj);
+ len2 = PyUnicode_GET_LENGTH(sep_obj);
+
+ switch (PyUnicode_KIND(str_obj)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sep_obj))
+ out = asciilib_partition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ else
+ out = ucs1lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ out = ucs2lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ out = ucs4lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ default:
+ assert(0);
+ out = 0;
+ }
Py_DECREF(sep_obj);
Py_DECREF(str_obj);
+ if (kind1 != kind)
+ PyMem_Free(buf1);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
return out;
+ onError:
+ Py_DECREF(sep_obj);
+ Py_DECREF(str_obj);
+ if (kind1 != kind && buf1)
+ PyMem_Free(buf1);
+ if (kind2 != kind && buf2)
+ PyMem_Free(buf2);
+ return NULL;
}
@@ -8748,6 +12303,9 @@ PyUnicode_RPartition(PyObject *str_in, PyObject *sep_in)
PyObject* str_obj;
PyObject* sep_obj;
PyObject* out;
+ int kind1, kind2, kind;
+ void *buf1 = NULL, *buf2 = NULL;
+ Py_ssize_t len1, len2;
str_obj = PyUnicode_FromObject(str_in);
if (!str_obj)
@@ -8758,15 +12316,56 @@ PyUnicode_RPartition(PyObject *str_in, PyObject *sep_in)
return NULL;
}
- out = stringlib_rpartition(
- str_obj, PyUnicode_AS_UNICODE(str_obj), PyUnicode_GET_SIZE(str_obj),
- sep_obj, PyUnicode_AS_UNICODE(sep_obj), PyUnicode_GET_SIZE(sep_obj)
- );
+ kind1 = PyUnicode_KIND(str_in);
+ kind2 = PyUnicode_KIND(sep_obj);
+ kind = Py_MAX(kind1, kind2);
+ buf1 = PyUnicode_DATA(str_in);
+ if (kind1 != kind)
+ buf1 = _PyUnicode_AsKind(str_in, kind);
+ if (!buf1)
+ goto onError;
+ buf2 = PyUnicode_DATA(sep_obj);
+ if (kind2 != kind)
+ buf2 = _PyUnicode_AsKind(sep_obj, kind);
+ if (!buf2)
+ goto onError;
+ len1 = PyUnicode_GET_LENGTH(str_obj);
+ len2 = PyUnicode_GET_LENGTH(sep_obj);
+
+ switch (PyUnicode_KIND(str_in)) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sep_obj))
+ out = asciilib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ else
+ out = ucs1lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ out = ucs2lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ out = ucs4lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2);
+ break;
+ default:
+ assert(0);
+ out = 0;
+ }
Py_DECREF(sep_obj);
Py_DECREF(str_obj);
+ if (kind1 != kind)
+ PyMem_Free(buf1);
+ if (kind2 != kind)
+ PyMem_Free(buf2);
return out;
+ onError:
+ Py_DECREF(sep_obj);
+ Py_DECREF(str_obj);
+ if (kind1 != kind && buf1)
+ PyMem_Free(buf1);
+ if (kind2 != kind && buf2)
+ PyMem_Free(buf2);
+ return NULL;
}
PyDoc_STRVAR(partition__doc__,
@@ -8777,9 +12376,9 @@ the separator itself, and the part after it. If the separator is not\n\
found, return S and two empty strings.");
static PyObject*
-unicode_partition(PyUnicodeObject *self, PyObject *separator)
+unicode_partition(PyObject *self, PyObject *separator)
{
- return PyUnicode_Partition((PyObject *)self, separator);
+ return PyUnicode_Partition(self, separator);
}
PyDoc_STRVAR(rpartition__doc__,
@@ -8790,14 +12389,13 @@ the part before it, the separator itself, and the part after it. If the\n\
separator is not found, return two empty strings and S.");
static PyObject*
-unicode_rpartition(PyUnicodeObject *self, PyObject *separator)
+unicode_rpartition(PyObject *self, PyObject *separator)
{
- return PyUnicode_RPartition((PyObject *)self, separator);
+ return PyUnicode_RPartition(self, separator);
}
-PyObject *PyUnicode_RSplit(PyObject *s,
- PyObject *sep,
- Py_ssize_t maxsplit)
+PyObject *
+PyUnicode_RSplit(PyObject *s, PyObject *sep, Py_ssize_t maxsplit)
{
PyObject *result;
@@ -8812,7 +12410,7 @@ PyObject *PyUnicode_RSplit(PyObject *s,
}
}
- result = rsplit((PyUnicodeObject *)s, (PyUnicodeObject *)sep, maxsplit);
+ result = rsplit(s, sep, maxsplit);
Py_DECREF(s);
Py_XDECREF(sep);
@@ -8820,7 +12418,7 @@ PyObject *PyUnicode_RSplit(PyObject *s,
}
PyDoc_STRVAR(rsplit__doc__,
- "S.rsplit([sep[, maxsplit]]) -> list of strings\n\
+ "S.rsplit(sep=None, maxsplit=-1) -> list of strings\n\
\n\
Return a list of the words in S, using sep as the\n\
delimiter string, starting at the end of the string and\n\
@@ -8829,20 +12427,22 @@ splits are done. If sep is not specified, any whitespace string\n\
is a separator.");
static PyObject*
-unicode_rsplit(PyUnicodeObject *self, PyObject *args)
+unicode_rsplit(PyObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"sep", "maxsplit", 0};
PyObject *substring = Py_None;
Py_ssize_t maxcount = -1;
- if (!PyArg_ParseTuple(args, "|On:rsplit", &substring, &maxcount))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit",
+ kwlist, &substring, &maxcount))
return NULL;
if (substring == Py_None)
return rsplit(self, NULL, maxcount);
else if (PyUnicode_Check(substring))
- return rsplit(self, (PyUnicodeObject *)substring, maxcount);
+ return rsplit(self, substring, maxcount);
else
- return PyUnicode_RSplit((PyObject *)self, substring, maxcount);
+ return PyUnicode_RSplit(self, substring, maxcount);
}
PyDoc_STRVAR(splitlines__doc__,
@@ -8853,26 +12453,22 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
-unicode_splitlines(PyUnicodeObject *self, PyObject *args)
+unicode_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"keepends", 0};
int keepends = 0;
- if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
+ kwlist, &keepends))
return NULL;
- return PyUnicode_Splitlines((PyObject *)self, keepends);
+ return PyUnicode_Splitlines(self, keepends);
}
static
PyObject *unicode_str(PyObject *self)
{
- if (PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return self;
- } else
- /* Subtype -- return genuine unicode string with the same value. */
- return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(self),
- PyUnicode_GET_SIZE(self));
+ return unicode_result_unchanged(self);
}
PyDoc_STRVAR(swapcase__doc__,
@@ -8882,9 +12478,11 @@ Return a copy of S with uppercase characters converted to lowercase\n\
and vice versa.");
static PyObject*
-unicode_swapcase(PyUnicodeObject *self)
+unicode_swapcase(PyObject *self)
{
- return fixup(self, fixswapcase);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ return case_operation(self, do_swapcase);
}
PyDoc_STRVAR(maketrans__doc__,
@@ -8900,7 +12498,7 @@ character at the same position in y. If there is a third argument, it\n\
must be a string, whose characters will be mapped to None in the result.");
static PyObject*
-unicode_maketrans(PyUnicodeObject *null, PyObject *args)
+unicode_maketrans(PyObject *null, PyObject *args)
{
PyObject *x, *y = NULL, *z = NULL;
PyObject *new = NULL, *key, *value;
@@ -8913,24 +12511,30 @@ unicode_maketrans(PyUnicodeObject *null, PyObject *args)
if (!new)
return NULL;
if (y != NULL) {
+ int x_kind, y_kind, z_kind;
+ void *x_data, *y_data, *z_data;
+
/* x must be a string too, of equal length */
- Py_ssize_t ylen = PyUnicode_GET_SIZE(y);
if (!PyUnicode_Check(x)) {
PyErr_SetString(PyExc_TypeError, "first maketrans argument must "
"be a string if there is a second argument");
goto err;
}
- if (PyUnicode_GET_SIZE(x) != ylen) {
+ if (PyUnicode_GET_LENGTH(x) != PyUnicode_GET_LENGTH(y)) {
PyErr_SetString(PyExc_ValueError, "the first two maketrans "
"arguments must have equal length");
goto err;
}
/* create entries for translating chars in x to those in y */
- for (i = 0; i < PyUnicode_GET_SIZE(x); i++) {
- key = PyLong_FromLong(PyUnicode_AS_UNICODE(x)[i]);
+ x_kind = PyUnicode_KIND(x);
+ y_kind = PyUnicode_KIND(y);
+ x_data = PyUnicode_DATA(x);
+ y_data = PyUnicode_DATA(y);
+ for (i = 0; i < PyUnicode_GET_LENGTH(x); i++) {
+ key = PyLong_FromLong(PyUnicode_READ(x_kind, x_data, i));
if (!key)
goto err;
- value = PyLong_FromLong(PyUnicode_AS_UNICODE(y)[i]);
+ value = PyLong_FromLong(PyUnicode_READ(y_kind, y_data, i));
if (!value) {
Py_DECREF(key);
goto err;
@@ -8943,8 +12547,10 @@ unicode_maketrans(PyUnicodeObject *null, PyObject *args)
}
/* create entries for deleting chars in z */
if (z != NULL) {
- for (i = 0; i < PyUnicode_GET_SIZE(z); i++) {
- key = PyLong_FromLong(PyUnicode_AS_UNICODE(z)[i]);
+ z_kind = PyUnicode_KIND(z);
+ z_data = PyUnicode_DATA(z);
+ for (i = 0; i < PyUnicode_GET_LENGTH(z); i++) {
+ key = PyLong_FromLong(PyUnicode_READ(z_kind, z_data, i));
if (!key)
goto err;
res = PyDict_SetItem(new, key, Py_None);
@@ -8954,6 +12560,9 @@ unicode_maketrans(PyUnicodeObject *null, PyObject *args)
}
}
} else {
+ int kind;
+ void *data;
+
/* x must be a dict */
if (!PyDict_CheckExact(x)) {
PyErr_SetString(PyExc_TypeError, "if you give only one argument "
@@ -8965,12 +12574,14 @@ unicode_maketrans(PyUnicodeObject *null, PyObject *args)
if (PyUnicode_Check(key)) {
/* convert string keys to integer keys */
PyObject *newkey;
- if (PyUnicode_GET_SIZE(key) != 1) {
+ if (PyUnicode_GET_LENGTH(key) != 1) {
PyErr_SetString(PyExc_ValueError, "string keys in translate "
"table must be of length 1");
goto err;
}
- newkey = PyLong_FromLong(PyUnicode_AS_UNICODE(key)[0]);
+ kind = PyUnicode_KIND(key);
+ data = PyUnicode_DATA(key);
+ newkey = PyLong_FromLong(PyUnicode_READ(kind, data, 0));
if (!newkey)
goto err;
res = PyDict_SetItem(new, newkey, value);
@@ -9004,9 +12615,9 @@ Unmapped characters are left untouched. Characters mapped to None\n\
are deleted.");
static PyObject*
-unicode_translate(PyUnicodeObject *self, PyObject *table)
+unicode_translate(PyObject *self, PyObject *table)
{
- return PyUnicode_TranslateCharmap(self->str, self->length, table, "ignore");
+ return _PyUnicode_TranslateCharmap(self, table, "ignore");
}
PyDoc_STRVAR(upper__doc__,
@@ -9015,9 +12626,13 @@ PyDoc_STRVAR(upper__doc__,
Return a copy of S converted to uppercase.");
static PyObject*
-unicode_upper(PyUnicodeObject *self)
+unicode_upper(PyObject *self)
{
- return fixup(self, fixupper);
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ if (PyUnicode_IS_ASCII(self))
+ return ascii_upper_or_lower(self, 0);
+ return case_operation(self, do_upper);
}
PyDoc_STRVAR(zfill__doc__,
@@ -9027,55 +12642,50 @@ Pad a numeric string S with zeros on the left, to fill a field\n\
of the specified width. The string S is never truncated.");
static PyObject *
-unicode_zfill(PyUnicodeObject *self, PyObject *args)
+unicode_zfill(PyObject *self, PyObject *args)
{
Py_ssize_t fill;
- PyUnicodeObject *u;
-
+ PyObject *u;
Py_ssize_t width;
+ int kind;
+ void *data;
+ Py_UCS4 chr;
+
if (!PyArg_ParseTuple(args, "n:zfill", &width))
return NULL;
- if (self->length >= width) {
- if (PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject*) self;
- }
- else
- return PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(self),
- PyUnicode_GET_SIZE(self)
- );
- }
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
- fill = width - self->length;
+ if (PyUnicode_GET_LENGTH(self) >= width)
+ return unicode_result_unchanged(self);
+
+ fill = width - PyUnicode_GET_LENGTH(self);
u = pad(self, fill, 0, '0');
if (u == NULL)
return NULL;
- if (u->str[fill] == '+' || u->str[fill] == '-') {
+ kind = PyUnicode_KIND(u);
+ data = PyUnicode_DATA(u);
+ chr = PyUnicode_READ(kind, data, fill);
+
+ if (chr == '+' || chr == '-') {
/* move sign to beginning of string */
- u->str[0] = u->str[fill];
- u->str[fill] = '0';
+ PyUnicode_WRITE(kind, data, 0, chr);
+ PyUnicode_WRITE(kind, data, fill, '0');
}
- return (PyObject*) u;
+ assert(_PyUnicode_CheckConsistency(u, 1));
+ return u;
}
#if 0
-static PyObject*
-unicode_freelistsize(PyUnicodeObject *self)
-{
- return PyLong_FromLong(numfree);
-}
-
static PyObject *
unicode__decimal2ascii(PyObject *self)
{
- return PyUnicode_TransformDecimalToASCII(PyUnicode_AS_UNICODE(self),
- PyUnicode_GET_SIZE(self));
+ return PyUnicode_TransformDecimalAndSpaceToASCII(self);
}
#endif
@@ -9088,11 +12698,11 @@ With optional end, stop comparing S at that position.\n\
prefix can also be a tuple of strings to try.");
static PyObject *
-unicode_startswith(PyUnicodeObject *self,
+unicode_startswith(PyObject *self,
PyObject *args)
{
PyObject *subobj;
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start = 0;
Py_ssize_t end = PY_SSIZE_T_MAX;
int result;
@@ -9102,8 +12712,7 @@ unicode_startswith(PyUnicodeObject *self,
if (PyTuple_Check(subobj)) {
Py_ssize_t i;
for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
- substring = (PyUnicodeObject *)PyUnicode_FromObject(
- PyTuple_GET_ITEM(subobj, i));
+ substring = PyUnicode_FromObject(PyTuple_GET_ITEM(subobj, i));
if (substring == NULL)
return NULL;
result = tailmatch(self, substring, start, end, -1);
@@ -9115,7 +12724,7 @@ unicode_startswith(PyUnicodeObject *self,
/* nothing matched */
Py_RETURN_FALSE;
}
- substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
+ substring = PyUnicode_FromObject(subobj);
if (substring == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError))
PyErr_Format(PyExc_TypeError, "startswith first arg must be str or "
@@ -9137,11 +12746,11 @@ With optional end, stop comparing S at that position.\n\
suffix can also be a tuple of strings to try.");
static PyObject *
-unicode_endswith(PyUnicodeObject *self,
+unicode_endswith(PyObject *self,
PyObject *args)
{
PyObject *subobj;
- PyUnicodeObject *substring;
+ PyObject *substring;
Py_ssize_t start = 0;
Py_ssize_t end = PY_SSIZE_T_MAX;
int result;
@@ -9151,7 +12760,7 @@ unicode_endswith(PyUnicodeObject *self,
if (PyTuple_Check(subobj)) {
Py_ssize_t i;
for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
- substring = (PyUnicodeObject *)PyUnicode_FromObject(
+ substring = PyUnicode_FromObject(
PyTuple_GET_ITEM(subobj, i));
if (substring == NULL)
return NULL;
@@ -9163,7 +12772,7 @@ unicode_endswith(PyUnicodeObject *self,
}
Py_RETURN_FALSE;
}
- substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
+ substring = PyUnicode_FromObject(subobj);
if (substring == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError))
PyErr_Format(PyExc_TypeError, "endswith first arg must be str or "
@@ -9175,7 +12784,160 @@ unicode_endswith(PyUnicodeObject *self,
return PyBool_FromLong(result);
}
-#include "stringlib/string_format.h"
+Py_LOCAL_INLINE(void)
+_PyUnicodeWriter_Update(_PyUnicodeWriter *writer)
+{
+ writer->size = PyUnicode_GET_LENGTH(writer->buffer);
+ writer->maxchar = PyUnicode_MAX_CHAR_VALUE(writer->buffer);
+ writer->data = PyUnicode_DATA(writer->buffer);
+ writer->kind = PyUnicode_KIND(writer->buffer);
+}
+
+void
+_PyUnicodeWriter_Init(_PyUnicodeWriter *writer, Py_ssize_t min_length)
+{
+ memset(writer, 0, sizeof(*writer));
+#ifdef Py_DEBUG
+ writer->kind = 5; /* invalid kind */
+#endif
+ writer->min_length = Py_MAX(min_length, 100);
+ writer->overallocate = (min_length > 0);
+}
+
+int
+_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
+ Py_ssize_t length, Py_UCS4 maxchar)
+{
+ Py_ssize_t newlen;
+ PyObject *newbuffer;
+
+ assert(length > 0);
+
+ if (length > PY_SSIZE_T_MAX - writer->pos) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ newlen = writer->pos + length;
+
+ if (writer->buffer == NULL) {
+ if (writer->overallocate) {
+ /* overallocate 25% to limit the number of resize */
+ if (newlen <= (PY_SSIZE_T_MAX - newlen / 4))
+ newlen += newlen / 4;
+ if (newlen < writer->min_length)
+ newlen = writer->min_length;
+ }
+ writer->buffer = PyUnicode_New(newlen, maxchar);
+ if (writer->buffer == NULL)
+ return -1;
+ _PyUnicodeWriter_Update(writer);
+ return 0;
+ }
+
+ if (newlen > writer->size) {
+ if (writer->overallocate) {
+ /* overallocate 25% to limit the number of resize */
+ if (newlen <= (PY_SSIZE_T_MAX - newlen / 4))
+ newlen += newlen / 4;
+ if (newlen < writer->min_length)
+ newlen = writer->min_length;
+ }
+
+ if (maxchar > writer->maxchar || writer->readonly) {
+ /* resize + widen */
+ newbuffer = PyUnicode_New(newlen, maxchar);
+ if (newbuffer == NULL)
+ return -1;
+ _PyUnicode_FastCopyCharacters(newbuffer, 0,
+ writer->buffer, 0, writer->pos);
+ Py_DECREF(writer->buffer);
+ writer->readonly = 0;
+ }
+ else {
+ newbuffer = resize_compact(writer->buffer, newlen);
+ if (newbuffer == NULL)
+ return -1;
+ }
+ writer->buffer = newbuffer;
+ _PyUnicodeWriter_Update(writer);
+ }
+ else if (maxchar > writer->maxchar) {
+ assert(!writer->readonly);
+ newbuffer = PyUnicode_New(writer->size, maxchar);
+ if (newbuffer == NULL)
+ return -1;
+ _PyUnicode_FastCopyCharacters(newbuffer, 0,
+ writer->buffer, 0, writer->pos);
+ Py_DECREF(writer->buffer);
+ writer->buffer = newbuffer;
+ _PyUnicodeWriter_Update(writer);
+ }
+ return 0;
+}
+
+int
+_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str)
+{
+ Py_UCS4 maxchar;
+ Py_ssize_t len;
+
+ if (PyUnicode_READY(str) == -1)
+ return -1;
+ len = PyUnicode_GET_LENGTH(str);
+ if (len == 0)
+ return 0;
+ maxchar = PyUnicode_MAX_CHAR_VALUE(str);
+ if (maxchar > writer->maxchar || len > writer->size - writer->pos) {
+ if (writer->buffer == NULL && !writer->overallocate) {
+ Py_INCREF(str);
+ writer->buffer = str;
+ _PyUnicodeWriter_Update(writer);
+ writer->readonly = 1;
+ writer->size = 0;
+ writer->pos += len;
+ return 0;
+ }
+ if (_PyUnicodeWriter_PrepareInternal(writer, len, maxchar) == -1)
+ return -1;
+ }
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ str, 0, len);
+ writer->pos += len;
+ return 0;
+}
+
+PyObject *
+_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer)
+{
+ if (writer->pos == 0) {
+ Py_XDECREF(writer->buffer);
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
+ if (writer->readonly) {
+ assert(PyUnicode_GET_LENGTH(writer->buffer) == writer->pos);
+ return writer->buffer;
+ }
+ if (PyUnicode_GET_LENGTH(writer->buffer) != writer->pos) {
+ PyObject *newbuffer;
+ newbuffer = resize_compact(writer->buffer, writer->pos);
+ if (newbuffer == NULL) {
+ Py_DECREF(writer->buffer);
+ return NULL;
+ }
+ writer->buffer = newbuffer;
+ }
+ assert(_PyUnicode_CheckConsistency(writer->buffer, 1));
+ return writer->buffer;
+}
+
+void
+_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer)
+{
+ Py_CLEAR(writer->buffer);
+}
+
+#include "stringlib/unicode_format.h"
PyDoc_STRVAR(format__doc__,
"S.format(*args, **kwargs) -> str\n\
@@ -9193,13 +12955,23 @@ static PyObject *
unicode__format__(PyObject* self, PyObject* args)
{
PyObject *format_spec;
+ _PyUnicodeWriter writer;
+ int ret;
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
return NULL;
- return _PyUnicode_FormatAdvanced(self,
- PyUnicode_AS_UNICODE(format_spec),
- PyUnicode_GET_SIZE(format_spec));
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+ _PyUnicodeWriter_Init(&writer, 0);
+ ret = _PyUnicode_FormatAdvancedWriter(&writer,
+ self, format_spec, 0,
+ PyUnicode_GET_LENGTH(format_spec));
+ if (ret == -1) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
+ }
+ return _PyUnicodeWriter_Finish(&writer);
}
PyDoc_STRVAR(p_format__doc__,
@@ -9208,28 +12980,55 @@ PyDoc_STRVAR(p_format__doc__,
Return a formatted version of S as described by format_spec.");
static PyObject *
-unicode__sizeof__(PyUnicodeObject *v)
+unicode__sizeof__(PyObject *v)
{
- return PyLong_FromSsize_t(sizeof(PyUnicodeObject) +
- sizeof(Py_UNICODE) * (v->length + 1));
+ Py_ssize_t size;
+
+ /* If it's a compact object, account for base structure +
+ character data. */
+ if (PyUnicode_IS_COMPACT_ASCII(v))
+ size = sizeof(PyASCIIObject) + PyUnicode_GET_LENGTH(v) + 1;
+ else if (PyUnicode_IS_COMPACT(v))
+ size = sizeof(PyCompactUnicodeObject) +
+ (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_KIND(v);
+ else {
+ /* If it is a two-block object, account for base object, and
+ for character block if present. */
+ size = sizeof(PyUnicodeObject);
+ if (_PyUnicode_DATA_ANY(v))
+ size += (PyUnicode_GET_LENGTH(v) + 1) *
+ PyUnicode_KIND(v);
+ }
+ /* If the wstr pointer is present, account for it unless it is shared
+ with the data pointer. Check if the data is not shared. */
+ if (_PyUnicode_HAS_WSTR_MEMORY(v))
+ size += (PyUnicode_WSTR_LENGTH(v) + 1) * sizeof(wchar_t);
+ if (_PyUnicode_HAS_UTF8_MEMORY(v))
+ size += PyUnicode_UTF8_LENGTH(v) + 1;
+
+ return PyLong_FromSsize_t(size);
}
PyDoc_STRVAR(sizeof__doc__,
"S.__sizeof__() -> size of S in memory, in bytes");
static PyObject *
-unicode_getnewargs(PyUnicodeObject *v)
+unicode_getnewargs(PyObject *v)
{
- return Py_BuildValue("(u#)", v->str, v->length);
+ PyObject *copy = _PyUnicode_Copy(v);
+ if (!copy)
+ return NULL;
+ return Py_BuildValue("(N)", copy);
}
static PyMethodDef unicode_methods[] = {
{"encode", (PyCFunction) unicode_encode, METH_VARARGS | METH_KEYWORDS, encode__doc__},
{"replace", (PyCFunction) unicode_replace, METH_VARARGS, replace__doc__},
- {"split", (PyCFunction) unicode_split, METH_VARARGS, split__doc__},
- {"rsplit", (PyCFunction) unicode_rsplit, METH_VARARGS, rsplit__doc__},
+ {"split", (PyCFunction) unicode_split, METH_VARARGS | METH_KEYWORDS, split__doc__},
+ {"rsplit", (PyCFunction) unicode_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__},
{"join", (PyCFunction) unicode_join, METH_O, join__doc__},
{"capitalize", (PyCFunction) unicode_capitalize, METH_NOARGS, capitalize__doc__},
+ {"casefold", (PyCFunction) unicode_casefold, METH_NOARGS, casefold__doc__},
{"title", (PyCFunction) unicode_title, METH_NOARGS, title__doc__},
{"center", (PyCFunction) unicode_center, METH_VARARGS, center__doc__},
{"count", (PyCFunction) unicode_count, METH_VARARGS, count__doc__},
@@ -9245,7 +13044,7 @@ static PyMethodDef unicode_methods[] = {
{"rjust", (PyCFunction) unicode_rjust, METH_VARARGS, rjust__doc__},
{"rstrip", (PyCFunction) unicode_rstrip, METH_VARARGS, rstrip__doc__},
{"rpartition", (PyCFunction) unicode_rpartition, METH_O, rpartition__doc__},
- {"splitlines", (PyCFunction) unicode_splitlines, METH_VARARGS, splitlines__doc__},
+ {"splitlines", (PyCFunction) unicode_splitlines, METH_VARARGS | METH_KEYWORDS, splitlines__doc__},
{"strip", (PyCFunction) unicode_strip, METH_VARARGS, strip__doc__},
{"swapcase", (PyCFunction) unicode_swapcase, METH_NOARGS, swapcase__doc__},
{"translate", (PyCFunction) unicode_translate, METH_O, translate__doc__},
@@ -9271,12 +13070,7 @@ static PyMethodDef unicode_methods[] = {
METH_VARARGS | METH_STATIC, maketrans__doc__},
{"__sizeof__", (PyCFunction) unicode__sizeof__, METH_NOARGS, sizeof__doc__},
#if 0
- {"capwords", (PyCFunction) unicode_capwords, METH_NOARGS, capwords__doc__},
-#endif
-
-#if 0
/* These methods are just used for debugging the implementation. */
- {"freelistsize", (PyCFunction) unicode_freelistsize, METH_NOARGS},
{"_decimal2ascii", (PyCFunction) unicode__decimal2ascii, METH_NOARGS},
#endif
@@ -9287,10 +13081,8 @@ static PyMethodDef unicode_methods[] = {
static PyObject *
unicode_mod(PyObject *v, PyObject *w)
{
- if (!PyUnicode_Check(v)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ if (!PyUnicode_Check(v))
+ Py_RETURN_NOTIMPLEMENTED;
return PyUnicode_Format(v, w);
}
@@ -9313,50 +13105,69 @@ static PySequenceMethods unicode_as_sequence = {
};
static PyObject*
-unicode_subscript(PyUnicodeObject* self, PyObject* item)
+unicode_subscript(PyObject* self, PyObject* item)
{
+ if (PyUnicode_READY(self) == -1)
+ return NULL;
+
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
if (i < 0)
- i += PyUnicode_GET_SIZE(self);
+ i += PyUnicode_GET_LENGTH(self);
return unicode_getitem(self, i);
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength, cur, i;
- Py_UNICODE* source_buf;
- Py_UNICODE* result_buf;
- PyObject* result;
+ PyObject *result;
+ void *src_data, *dest_data;
+ int src_kind, dest_kind;
+ Py_UCS4 ch, max_char, kind_limit;
- if (PySlice_GetIndicesEx(item, PyUnicode_GET_SIZE(self),
+ if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self),
&start, &stop, &step, &slicelength) < 0) {
return NULL;
}
if (slicelength <= 0) {
- return PyUnicode_FromUnicode(NULL, 0);
- } else if (start == 0 && step == 1 && slicelength == self->length &&
- PyUnicode_CheckExact(self)) {
- Py_INCREF(self);
- return (PyObject *)self;
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ } else if (start == 0 && step == 1 &&
+ slicelength == PyUnicode_GET_LENGTH(self)) {
+ return unicode_result_unchanged(self);
} else if (step == 1) {
- return PyUnicode_FromUnicode(self->str + start, slicelength);
- } else {
- source_buf = PyUnicode_AS_UNICODE((PyObject*)self);
- result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength*
- sizeof(Py_UNICODE));
-
- if (result_buf == NULL)
- return PyErr_NoMemory();
-
+ return PyUnicode_Substring(self,
+ start, start + slicelength);
+ }
+ /* General case */
+ src_kind = PyUnicode_KIND(self);
+ src_data = PyUnicode_DATA(self);
+ if (!PyUnicode_IS_ASCII(self)) {
+ kind_limit = kind_maxchar_limit(src_kind);
+ max_char = 0;
for (cur = start, i = 0; i < slicelength; cur += step, i++) {
- result_buf[i] = source_buf[cur];
+ ch = PyUnicode_READ(src_kind, src_data, cur);
+ if (ch > max_char) {
+ max_char = ch;
+ if (max_char >= kind_limit)
+ break;
+ }
}
+ }
+ else
+ max_char = 127;
+ result = PyUnicode_New(slicelength, max_char);
+ if (result == NULL)
+ return NULL;
+ dest_kind = PyUnicode_KIND(result);
+ dest_data = PyUnicode_DATA(result);
- result = PyUnicode_FromUnicode(result_buf, slicelength);
- PyObject_FREE(result_buf);
- return result;
+ for (cur = start, i = 0; i < slicelength; cur += step, i++) {
+ Py_UCS4 ch = PyUnicode_READ(src_kind, src_data, cur);
+ PyUnicode_WRITE(dest_kind, dest_data, i, ch);
}
+ assert(_PyUnicode_CheckConsistency(result, 1));
+ return result;
} else {
PyErr_SetString(PyExc_TypeError, "string indices must be integers");
return NULL;
@@ -9390,16 +13201,17 @@ getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
/* Returns a new reference to a PyUnicode object, or NULL on failure. */
-static PyObject *
-formatfloat(PyObject *v, int flags, int prec, int type)
+static int
+formatfloat(PyObject *v, int flags, int prec, int type,
+ PyObject **p_output, _PyUnicodeWriter *writer)
{
char *p;
- PyObject *result;
double x;
+ Py_ssize_t len;
x = PyFloat_AsDouble(v);
if (x == -1.0 && PyErr_Occurred())
- return NULL;
+ return -1;
if (prec < 0)
prec = 6;
@@ -9407,54 +13219,170 @@ formatfloat(PyObject *v, int flags, int prec, int type)
p = PyOS_double_to_string(x, type, prec,
(flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
if (p == NULL)
- return NULL;
- result = PyUnicode_FromStringAndSize(p, strlen(p));
+ return -1;
+ len = strlen(p);
+ if (writer) {
+ if (_PyUnicodeWriter_Prepare(writer, len, 127) == -1) {
+ PyMem_Free(p);
+ return -1;
+ }
+ unicode_write_cstr(writer->buffer, writer->pos, p, len);
+ writer->pos += len;
+ }
+ else
+ *p_output = _PyUnicode_FromASCII(p, len);
PyMem_Free(p);
- return result;
+ return 0;
}
+/* formatlong() emulates the format codes d, u, o, x and X, and
+ * the F_ALT flag, for Python's long (unbounded) ints. It's not used for
+ * Python's regular ints.
+ * Return value: a new PyUnicodeObject*, or NULL if error.
+ * The output string is of the form
+ * "-"? ("0x" | "0X")? digit+
+ * "0x"/"0X" are present only for x and X conversions, with F_ALT
+ * set in flags. The case of hex digits will be correct,
+ * There will be at least prec digits, zero-filled on the left if
+ * necessary to get that many.
+ * val object to be converted
+ * flags bitmask of format flags; only F_ALT is looked at
+ * prec minimum number of digits; 0-fill on left if needed
+ * type a character in [duoxX]; u acts the same as d
+ *
+ * CAUTION: o, x and X conversions on regular ints can never
+ * produce a '-' sign, but can for Python's unbounded ints.
+ */
static PyObject*
formatlong(PyObject *val, int flags, int prec, int type)
{
+ PyObject *result = NULL;
char *buf;
- int len;
- PyObject *str; /* temporary string object. */
- PyObject *result;
+ Py_ssize_t i;
+ int sign; /* 1 if '-', else 0 */
+ int len; /* number of characters */
+ Py_ssize_t llen;
+ int numdigits; /* len == numnondigits + numdigits */
+ int numnondigits = 0;
+
+ /* Avoid exceeding SSIZE_T_MAX */
+ if (prec > INT_MAX-3) {
+ PyErr_SetString(PyExc_OverflowError,
+ "precision too large");
+ return NULL;
+ }
- str = _PyBytes_FormatLong(val, flags, prec, type, &buf, &len);
- if (!str)
+ assert(PyLong_Check(val));
+
+ switch (type) {
+ case 'd':
+ case 'u':
+ /* Special-case boolean: we want 0/1 */
+ if (PyBool_Check(val))
+ result = PyNumber_ToBase(val, 10);
+ else
+ result = Py_TYPE(val)->tp_str(val);
+ break;
+ case 'o':
+ numnondigits = 2;
+ result = PyNumber_ToBase(val, 8);
+ break;
+ case 'x':
+ case 'X':
+ numnondigits = 2;
+ result = PyNumber_ToBase(val, 16);
+ break;
+ default:
+ assert(!"'type' not in [duoxX]");
+ }
+ if (!result)
return NULL;
- result = PyUnicode_FromStringAndSize(buf, len);
- Py_DECREF(str);
+
+ assert(unicode_modifiable(result));
+ assert(PyUnicode_IS_READY(result));
+ assert(PyUnicode_IS_ASCII(result));
+
+ /* To modify the string in-place, there can only be one reference. */
+ if (Py_REFCNT(result) != 1) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ buf = PyUnicode_DATA(result);
+ llen = PyUnicode_GET_LENGTH(result);
+ if (llen > INT_MAX) {
+ PyErr_SetString(PyExc_ValueError,
+ "string too large in _PyBytes_FormatLong");
+ return NULL;
+ }
+ len = (int)llen;
+ sign = buf[0] == '-';
+ numnondigits += sign;
+ numdigits = len - numnondigits;
+ assert(numdigits > 0);
+
+ /* Get rid of base marker unless F_ALT */
+ if (((flags & F_ALT) == 0 &&
+ (type == 'o' || type == 'x' || type == 'X'))) {
+ assert(buf[sign] == '0');
+ assert(buf[sign+1] == 'x' || buf[sign+1] == 'X' ||
+ buf[sign+1] == 'o');
+ numnondigits -= 2;
+ buf += 2;
+ len -= 2;
+ if (sign)
+ buf[0] = '-';
+ assert(len == numnondigits + numdigits);
+ assert(numdigits > 0);
+ }
+
+ /* Fill with leading zeroes to meet minimum width. */
+ if (prec > numdigits) {
+ PyObject *r1 = PyBytes_FromStringAndSize(NULL,
+ numnondigits + prec);
+ char *b1;
+ if (!r1) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ b1 = PyBytes_AS_STRING(r1);
+ for (i = 0; i < numnondigits; ++i)
+ *b1++ = *buf++;
+ for (i = 0; i < prec - numdigits; i++)
+ *b1++ = '0';
+ for (i = 0; i < numdigits; i++)
+ *b1++ = *buf++;
+ *b1 = '\0';
+ Py_DECREF(result);
+ result = r1;
+ buf = PyBytes_AS_STRING(result);
+ len = numnondigits + prec;
+ }
+
+ /* Fix up case for hex conversions. */
+ if (type == 'X') {
+ /* Need to convert all lower case letters to upper case.
+ and need to convert 0x to 0X (and -0x to -0X). */
+ for (i = 0; i < len; i++)
+ if (buf[i] >= 'a' && buf[i] <= 'x')
+ buf[i] -= 'a'-'A';
+ }
+ if (!PyUnicode_Check(result) || len != PyUnicode_GET_LENGTH(result)) {
+ PyObject *unicode;
+ unicode = _PyUnicode_FromASCII(buf, len);
+ Py_DECREF(result);
+ result = unicode;
+ }
return result;
}
-static int
-formatchar(Py_UNICODE *buf,
- size_t buflen,
- PyObject *v)
+static Py_UCS4
+formatchar(PyObject *v)
{
/* presume that the buffer is at least 3 characters long */
if (PyUnicode_Check(v)) {
- if (PyUnicode_GET_SIZE(v) == 1) {
- buf[0] = PyUnicode_AS_UNICODE(v)[0];
- buf[1] = '\0';
- return 1;
- }
-#ifndef Py_UNICODE_WIDE
- if (PyUnicode_GET_SIZE(v) == 2) {
- /* Decode a valid surrogate pair */
- int c0 = PyUnicode_AS_UNICODE(v)[0];
- int c1 = PyUnicode_AS_UNICODE(v)[1];
- if (0xD800 <= c0 && c0 <= 0xDBFF &&
- 0xDC00 <= c1 && c1 <= 0xDFFF) {
- buf[0] = c0;
- buf[1] = c1;
- buf[2] = '\0';
- return 2;
- }
+ if (PyUnicode_GET_LENGTH(v) == 1) {
+ return PyUnicode_READ_CHAR(v, 0);
}
-#endif
goto onError;
}
else {
@@ -9464,45 +13392,35 @@ formatchar(Py_UNICODE *buf,
if (x == -1 && PyErr_Occurred())
goto onError;
- if (x < 0 || x > 0x10ffff) {
+ if (x < 0 || x > MAX_UNICODE) {
PyErr_SetString(PyExc_OverflowError,
"%c arg not in range(0x110000)");
- return -1;
+ return (Py_UCS4) -1;
}
-#ifndef Py_UNICODE_WIDE
- if (x > 0xffff) {
- x -= 0x10000;
- buf[0] = (Py_UNICODE)(0xD800 | (x >> 10));
- buf[1] = (Py_UNICODE)(0xDC00 | (x & 0x3FF));
- return 2;
- }
-#endif
- buf[0] = (Py_UNICODE) x;
- buf[1] = '\0';
- return 1;
+ return (Py_UCS4) x;
}
onError:
PyErr_SetString(PyExc_TypeError,
"%c requires int or char");
- return -1;
+ return (Py_UCS4) -1;
}
-/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...)
- FORMATBUFLEN is the length of the buffer in which chars are formatted.
-*/
-#define FORMATBUFLEN (size_t)10
-
-PyObject *PyUnicode_Format(PyObject *format,
- PyObject *args)
+PyObject *
+PyUnicode_Format(PyObject *format, PyObject *args)
{
- Py_UNICODE *fmt, *res;
- Py_ssize_t fmtcnt, rescnt, reslen, arglen, argidx;
+ Py_ssize_t fmtcnt, fmtpos, arglen, argidx;
int args_owned = 0;
- PyUnicodeObject *result = NULL;
PyObject *dict = NULL;
+ PyObject *temp = NULL;
+ PyObject *second = NULL;
PyObject *uformat;
+ void *fmt;
+ enum PyUnicode_Kind kind, fmtkind;
+ _PyUnicodeWriter writer;
+ Py_ssize_t sublen;
+ Py_UCS4 maxchar;
if (format == NULL || args == NULL) {
PyErr_BadInternalCall();
@@ -9511,14 +13429,17 @@ PyObject *PyUnicode_Format(PyObject *format,
uformat = PyUnicode_FromObject(format);
if (uformat == NULL)
return NULL;
- fmt = PyUnicode_AS_UNICODE(uformat);
- fmtcnt = PyUnicode_GET_SIZE(uformat);
+ if (PyUnicode_READY(uformat) == -1) {
+ Py_DECREF(uformat);
+ return NULL;
+ }
- reslen = rescnt = fmtcnt + 100;
- result = _PyUnicode_New(reslen);
- if (result == NULL)
- goto onError;
- res = PyUnicode_AS_UNICODE(result);
+ fmt = PyUnicode_DATA(uformat);
+ fmtkind = PyUnicode_KIND(uformat);
+ fmtcnt = PyUnicode_GET_LENGTH(uformat);
+ fmtpos = 0;
+
+ _PyUnicodeWriter_Init(&writer, fmtcnt + 100);
if (PyTuple_Check(args)) {
arglen = PyTuple_Size(args);
@@ -9532,35 +13453,46 @@ PyObject *PyUnicode_Format(PyObject *format,
dict = args;
while (--fmtcnt >= 0) {
- if (*fmt != '%') {
- if (--rescnt < 0) {
- rescnt = fmtcnt + 100;
- reslen += rescnt;
- if (_PyUnicode_Resize(&result, reslen) < 0)
- goto onError;
- res = PyUnicode_AS_UNICODE(result) + reslen - rescnt;
- --rescnt;
- }
- *res++ = *fmt++;
+ if (PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') {
+ Py_ssize_t nonfmtpos;
+ nonfmtpos = fmtpos++;
+ while (fmtcnt >= 0 &&
+ PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') {
+ fmtpos++;
+ fmtcnt--;
+ }
+ if (fmtcnt < 0)
+ fmtpos--;
+ sublen = fmtpos - nonfmtpos;
+ maxchar = _PyUnicode_FindMaxChar(uformat,
+ nonfmtpos, nonfmtpos + sublen);
+ if (_PyUnicodeWriter_Prepare(&writer, sublen, maxchar) == -1)
+ goto onError;
+
+ _PyUnicode_FastCopyCharacters(writer.buffer, writer.pos,
+ uformat, nonfmtpos, sublen);
+ writer.pos += sublen;
}
else {
/* Got a format specifier */
int flags = 0;
Py_ssize_t width = -1;
int prec = -1;
- Py_UNICODE c = '\0';
- Py_UNICODE fill;
+ Py_UCS4 c = '\0';
+ Py_UCS4 fill;
+ int sign;
+ Py_UCS4 signchar;
int isnumok;
PyObject *v = NULL;
- PyObject *temp = NULL;
- Py_UNICODE *pbuf;
- Py_UNICODE sign;
- Py_ssize_t len;
- Py_UNICODE formatbuf[FORMATBUFLEN]; /* For formatchar() */
-
- fmt++;
- if (*fmt == '(') {
- Py_UNICODE *keystart;
+ void *pbuf = NULL;
+ Py_ssize_t pindex, len;
+ Py_UCS4 bufmaxchar;
+ Py_ssize_t buflen;
+
+ fmtpos++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos);
+ if (c == '(') {
+ Py_ssize_t keystart;
Py_ssize_t keylen;
PyObject *key;
int pcount = 1;
@@ -9570,34 +13502,26 @@ PyObject *PyUnicode_Format(PyObject *format,
"format requires a mapping");
goto onError;
}
- ++fmt;
+ ++fmtpos;
--fmtcnt;
- keystart = fmt;
+ keystart = fmtpos;
/* Skip over balanced parentheses */
while (pcount > 0 && --fmtcnt >= 0) {
- if (*fmt == ')')
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos);
+ if (c == ')')
--pcount;
- else if (*fmt == '(')
+ else if (c == '(')
++pcount;
- fmt++;
+ fmtpos++;
}
- keylen = fmt - keystart - 1;
+ keylen = fmtpos - keystart - 1;
if (fmtcnt < 0 || pcount > 0) {
PyErr_SetString(PyExc_ValueError,
"incomplete format key");
goto onError;
}
-#if 0
- /* keys are converted to strings using UTF-8 and
- then looked up since Python uses strings to hold
- variables names etc. in its namespaces and we
- wouldn't want to break common idioms. */
- key = PyUnicode_EncodeUTF8(keystart,
- keylen,
- NULL);
-#else
- key = PyUnicode_FromUnicode(keystart, keylen);
-#endif
+ key = PyUnicode_Substring(uformat,
+ keystart, keystart + keylen);
if (key == NULL)
goto onError;
if (args_owned) {
@@ -9614,7 +13538,8 @@ PyObject *PyUnicode_Format(PyObject *format,
argidx = -2;
}
while (--fmtcnt >= 0) {
- switch (c = *fmt++) {
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
+ switch (c) {
case '-': flags |= F_LJUST; continue;
case '+': flags |= F_SIGN; continue;
case ' ': flags |= F_BLANK; continue;
@@ -9640,14 +13565,17 @@ PyObject *PyUnicode_Format(PyObject *format,
width = -width;
}
if (--fmtcnt >= 0)
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
}
else if (c >= '0' && c <= '9') {
width = c - '0';
while (--fmtcnt >= 0) {
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
if (c < '0' || c > '9')
break;
+ /* Since c is unsigned, the RHS would end up as unsigned,
+ mixing signed and unsigned comparison. Since c is between
+ '0' and '9', casting to int is safe. */
if (width > (PY_SSIZE_T_MAX - ((int)c - '0')) / 10) {
PyErr_SetString(PyExc_ValueError,
"width too big");
@@ -9659,7 +13587,7 @@ PyObject *PyUnicode_Format(PyObject *format,
if (c == '.') {
prec = 0;
if (--fmtcnt >= 0)
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
if (c == '*') {
v = getnextarg(args, arglen, &argidx);
if (v == NULL)
@@ -9675,12 +13603,12 @@ PyObject *PyUnicode_Format(PyObject *format,
if (prec < 0)
prec = 0;
if (--fmtcnt >= 0)
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
}
else if (c >= '0' && c <= '9') {
prec = c - '0';
while (--fmtcnt >= 0) {
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
if (c < '0' || c > '9')
break;
if (prec > (INT_MAX - ((int)c - '0')) / 10) {
@@ -9695,7 +13623,7 @@ PyObject *PyUnicode_Format(PyObject *format,
if (fmtcnt >= 0) {
if (c == 'h' || c == 'l' || c == 'L') {
if (--fmtcnt >= 0)
- c = *fmt++;
+ c = PyUnicode_READ(fmtkind, fmt, fmtpos++);
}
}
if (fmtcnt < 0) {
@@ -9703,25 +13631,36 @@ PyObject *PyUnicode_Format(PyObject *format,
"incomplete format");
goto onError;
}
- if (c != '%') {
- v = getnextarg(args, arglen, &argidx);
- if (v == NULL)
+ if (fmtcnt == 0)
+ writer.overallocate = 0;
+
+ if (c == '%') {
+ if (_PyUnicodeWriter_Prepare(&writer, 1, '%') == -1)
goto onError;
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '%');
+ writer.pos += 1;
+ continue;
}
+
+ v = getnextarg(args, arglen, &argidx);
+ if (v == NULL)
+ goto onError;
+
sign = 0;
+ signchar = '\0';
fill = ' ';
switch (c) {
- case '%':
- pbuf = formatbuf;
- /* presume that buffer length is at least 1 */
- pbuf[0] = '%';
- len = 1;
- break;
-
case 's':
case 'r':
case 'a':
+ if (PyLong_CheckExact(v) && width == -1 && prec == -1) {
+ /* Fast path */
+ if (_PyLong_FormatWriter(&writer, v, 10, flags & F_ALT) == -1)
+ goto onError;
+ goto nextarg;
+ }
+
if (PyUnicode_CheckExact(v) && c == 's') {
temp = v;
Py_INCREF(temp);
@@ -9733,21 +13672,7 @@ PyObject *PyUnicode_Format(PyObject *format,
temp = PyObject_Repr(v);
else
temp = PyObject_ASCII(v);
- if (temp == NULL)
- goto onError;
- if (PyUnicode_Check(temp))
- /* nothing to do */;
- else {
- Py_DECREF(temp);
- PyErr_SetString(PyExc_TypeError,
- "%s argument has non-string str()");
- goto onError;
- }
}
- pbuf = PyUnicode_AS_UNICODE(temp);
- len = PyUnicode_GET_SIZE(temp);
- if (prec >= 0 && len > prec)
- len = prec;
break;
case 'i':
@@ -9756,6 +13681,32 @@ PyObject *PyUnicode_Format(PyObject *format,
case 'o':
case 'x':
case 'X':
+ if (PyLong_CheckExact(v)
+ && width == -1 && prec == -1
+ && !(flags & (F_SIGN | F_BLANK)))
+ {
+ /* Fast path */
+ switch(c)
+ {
+ case 'd':
+ case 'i':
+ case 'u':
+ if (_PyLong_FormatWriter(&writer, v, 10, flags & F_ALT) == -1)
+ goto onError;
+ goto nextarg;
+ case 'x':
+ if (_PyLong_FormatWriter(&writer, v, 16, flags & F_ALT) == -1)
+ goto onError;
+ goto nextarg;
+ case 'o':
+ if (_PyLong_FormatWriter(&writer, v, 8, flags & F_ALT) == -1)
+ goto onError;
+ goto nextarg;
+ default:
+ break;
+ }
+ }
+
isnumok = 0;
if (PyNumber_Check(v)) {
PyObject *iobj=NULL;
@@ -9770,13 +13721,9 @@ PyObject *PyUnicode_Format(PyObject *format,
if (iobj!=NULL) {
if (PyLong_Check(iobj)) {
isnumok = 1;
+ sign = 1;
temp = formatlong(iobj, flags, prec, (c == 'i'? 'd': c));
Py_DECREF(iobj);
- if (!temp)
- goto onError;
- pbuf = PyUnicode_AS_UNICODE(temp);
- len = PyUnicode_GET_SIZE(temp);
- sign = 1;
}
else {
Py_DECREF(iobj);
@@ -9799,22 +13746,38 @@ PyObject *PyUnicode_Format(PyObject *format,
case 'F':
case 'g':
case 'G':
- temp = formatfloat(v, flags, prec, c);
- if (!temp)
- goto onError;
- pbuf = PyUnicode_AS_UNICODE(temp);
- len = PyUnicode_GET_SIZE(temp);
+ if (width == -1 && prec == -1
+ && !(flags & (F_SIGN | F_BLANK)))
+ {
+ /* Fast path */
+ if (formatfloat(v, flags, prec, c, NULL, &writer) == -1)
+ goto onError;
+ goto nextarg;
+ }
+
sign = 1;
if (flags & F_ZERO)
fill = '0';
+ if (formatfloat(v, flags, prec, c, &temp, NULL) == -1)
+ temp = NULL;
break;
case 'c':
- pbuf = formatbuf;
- len = formatchar(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), v);
- if (len < 0)
+ {
+ Py_UCS4 ch = formatchar(v);
+ if (ch == (Py_UCS4) -1)
goto onError;
+ if (width == -1 && prec == -1) {
+ /* Fast path */
+ if (_PyUnicodeWriter_Prepare(&writer, 1, ch) == -1)
+ goto onError;
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, ch);
+ writer.pos += 1;
+ goto nextarg;
+ }
+ temp = PyUnicode_FromOrdinal(ch);
break;
+ }
default:
PyErr_Format(PyExc_ValueError,
@@ -9822,90 +13785,139 @@ PyObject *PyUnicode_Format(PyObject *format,
"at index %zd",
(31<=c && c<=126) ? (char)c : '?',
(int)c,
- (Py_ssize_t)(fmt - 1 -
- PyUnicode_AS_UNICODE(uformat)));
+ fmtpos - 1);
+ goto onError;
+ }
+ if (temp == NULL)
+ goto onError;
+ assert (PyUnicode_Check(temp));
+
+ if (width == -1 && prec == -1
+ && !(flags & (F_SIGN | F_BLANK)))
+ {
+ /* Fast path */
+ if (_PyUnicodeWriter_WriteStr(&writer, temp) == -1)
+ goto onError;
+ goto nextarg;
+ }
+
+ if (PyUnicode_READY(temp) == -1) {
+ Py_CLEAR(temp);
goto onError;
}
+ kind = PyUnicode_KIND(temp);
+ pbuf = PyUnicode_DATA(temp);
+ len = PyUnicode_GET_LENGTH(temp);
+
+ if (c == 's' || c == 'r' || c == 'a') {
+ if (prec >= 0 && len > prec)
+ len = prec;
+ }
+
+ /* pbuf is initialized here. */
+ pindex = 0;
if (sign) {
- if (*pbuf == '-' || *pbuf == '+') {
- sign = *pbuf++;
+ Py_UCS4 ch = PyUnicode_READ(kind, pbuf, pindex);
+ if (ch == '-' || ch == '+') {
+ signchar = ch;
len--;
+ pindex++;
}
else if (flags & F_SIGN)
- sign = '+';
+ signchar = '+';
else if (flags & F_BLANK)
- sign = ' ';
+ signchar = ' ';
else
sign = 0;
}
if (width < len)
width = len;
- if (rescnt - (sign != 0) < width) {
- reslen -= rescnt;
- rescnt = width + fmtcnt + 100;
- reslen += rescnt;
- if (reslen < 0) {
- Py_XDECREF(temp);
- PyErr_NoMemory();
- goto onError;
+
+ /* Compute the length and maximum character of the
+ written characters */
+ bufmaxchar = 127;
+ if (!(flags & F_LJUST)) {
+ if (sign) {
+ if ((width-1) > len)
+ bufmaxchar = MAX_MAXCHAR(bufmaxchar, fill);
}
- if (_PyUnicode_Resize(&result, reslen) < 0) {
- Py_XDECREF(temp);
- goto onError;
+ else {
+ if (width > len)
+ bufmaxchar = MAX_MAXCHAR(bufmaxchar, fill);
}
- res = PyUnicode_AS_UNICODE(result)
- + reslen - rescnt;
}
+ maxchar = _PyUnicode_FindMaxChar(temp, 0, pindex+len);
+ bufmaxchar = MAX_MAXCHAR(bufmaxchar, maxchar);
+
+ buflen = width;
+ if (sign && len == width)
+ buflen++;
+
+ if (_PyUnicodeWriter_Prepare(&writer, buflen, bufmaxchar) == -1)
+ goto onError;
+
+ /* Write characters */
if (sign) {
- if (fill != ' ')
- *res++ = sign;
- rescnt--;
+ if (fill != ' ') {
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, signchar);
+ writer.pos += 1;
+ }
if (width > len)
width--;
}
if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) {
- assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
+ assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
+ assert(PyUnicode_READ(kind, pbuf, pindex + 1) == c);
if (fill != ' ') {
- *res++ = *pbuf++;
- *res++ = *pbuf++;
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '0');
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos+1, c);
+ writer.pos += 2;
+ pindex += 2;
}
- rescnt -= 2;
width -= 2;
if (width < 0)
width = 0;
len -= 2;
}
if (width > len && !(flags & F_LJUST)) {
- do {
- --rescnt;
- *res++ = fill;
- } while (--width > len);
+ sublen = width - len;
+ FILL(writer.kind, writer.data, fill, writer.pos, sublen);
+ writer.pos += sublen;
+ width = len;
}
if (fill == ' ') {
- if (sign)
- *res++ = sign;
+ if (sign) {
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, signchar);
+ writer.pos += 1;
+ }
if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) {
- assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
- *res++ = *pbuf++;
- *res++ = *pbuf++;
+ assert(PyUnicode_READ(kind, pbuf, pindex) == '0');
+ assert(PyUnicode_READ(kind, pbuf, pindex+1) == c);
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos, '0');
+ PyUnicode_WRITE(writer.kind, writer.data, writer.pos+1, c);
+ writer.pos += 2;
+ pindex += 2;
}
}
- Py_UNICODE_COPY(res, pbuf, len);
- res += len;
- rescnt -= len;
- while (--width >= len) {
- --rescnt;
- *res++ = ' ';
+
+ if (len) {
+ _PyUnicode_FastCopyCharacters(writer.buffer, writer.pos,
+ temp, pindex, len);
+ writer.pos += len;
+ }
+ if (width > len) {
+ sublen = width - len;
+ FILL(writer.kind, writer.data, ' ', writer.pos, sublen);
+ writer.pos += sublen;
}
+
+nextarg:
if (dict && (argidx < arglen) && c != '%') {
PyErr_SetString(PyExc_TypeError,
"not all arguments converted during string formatting");
- Py_XDECREF(temp);
goto onError;
}
- Py_XDECREF(temp);
+ Py_CLEAR(temp);
} /* '%' */
} /* until end */
if (argidx < arglen && !dict) {
@@ -9914,17 +13926,19 @@ PyObject *PyUnicode_Format(PyObject *format,
goto onError;
}
- if (_PyUnicode_Resize(&result, reslen - rescnt) < 0)
- goto onError;
if (args_owned) {
Py_DECREF(args);
}
Py_DECREF(uformat);
- return (PyObject *)result;
+ Py_XDECREF(temp);
+ Py_XDECREF(second);
+ return _PyUnicodeWriter_Finish(&writer);
onError:
- Py_XDECREF(result);
Py_DECREF(uformat);
+ Py_XDECREF(temp);
+ Py_XDECREF(second);
+ _PyUnicodeWriter_Dealloc(&writer);
if (args_owned) {
Py_DECREF(args);
}
@@ -9947,8 +13961,10 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:str",
kwlist, &x, &encoding, &errors))
return NULL;
- if (x == NULL)
- return (PyObject *)_PyUnicode_New(0);
+ if (x == NULL) {
+ Py_INCREF(unicode_empty);
+ return unicode_empty;
+ }
if (encoding == NULL && errors == NULL)
return PyObject_Str(x);
else
@@ -9958,31 +13974,101 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyObject *
unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyUnicodeObject *tmp, *pnew;
- Py_ssize_t n;
+ PyObject *unicode, *self;
+ Py_ssize_t length, char_size;
+ int share_wstr, share_utf8;
+ unsigned int kind;
+ void *data;
assert(PyType_IsSubtype(type, &PyUnicode_Type));
- tmp = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds);
- if (tmp == NULL)
+
+ unicode = unicode_new(&PyUnicode_Type, args, kwds);
+ if (unicode == NULL)
return NULL;
- assert(PyUnicode_Check(tmp));
- pnew = (PyUnicodeObject *) type->tp_alloc(type, n = tmp->length);
- if (pnew == NULL) {
- Py_DECREF(tmp);
+ assert(_PyUnicode_CHECK(unicode));
+ if (PyUnicode_READY(unicode) == -1) {
+ Py_DECREF(unicode);
return NULL;
}
- pnew->str = (Py_UNICODE*) PyObject_MALLOC(sizeof(Py_UNICODE) * (n+1));
- if (pnew->str == NULL) {
- _Py_ForgetReference((PyObject *)pnew);
- PyObject_Del(pnew);
- Py_DECREF(tmp);
- return PyErr_NoMemory();
+
+ self = type->tp_alloc(type, 0);
+ if (self == NULL) {
+ Py_DECREF(unicode);
+ return NULL;
}
- Py_UNICODE_COPY(pnew->str, tmp->str, n+1);
- pnew->length = n;
- pnew->hash = tmp->hash;
- Py_DECREF(tmp);
- return (PyObject *)pnew;
+ kind = PyUnicode_KIND(unicode);
+ length = PyUnicode_GET_LENGTH(unicode);
+
+ _PyUnicode_LENGTH(self) = length;
+#ifdef Py_DEBUG
+ _PyUnicode_HASH(self) = -1;
+#else
+ _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode);
+#endif
+ _PyUnicode_STATE(self).interned = 0;
+ _PyUnicode_STATE(self).kind = kind;
+ _PyUnicode_STATE(self).compact = 0;
+ _PyUnicode_STATE(self).ascii = _PyUnicode_STATE(unicode).ascii;
+ _PyUnicode_STATE(self).ready = 1;
+ _PyUnicode_WSTR(self) = NULL;
+ _PyUnicode_UTF8_LENGTH(self) = 0;
+ _PyUnicode_UTF8(self) = NULL;
+ _PyUnicode_WSTR_LENGTH(self) = 0;
+ _PyUnicode_DATA_ANY(self) = NULL;
+
+ share_utf8 = 0;
+ share_wstr = 0;
+ if (kind == PyUnicode_1BYTE_KIND) {
+ char_size = 1;
+ if (PyUnicode_MAX_CHAR_VALUE(unicode) < 128)
+ share_utf8 = 1;
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+ char_size = 2;
+ if (sizeof(wchar_t) == 2)
+ share_wstr = 1;
+ }
+ else {
+ assert(kind == PyUnicode_4BYTE_KIND);
+ char_size = 4;
+ if (sizeof(wchar_t) == 4)
+ share_wstr = 1;
+ }
+
+ /* Ensure we won't overflow the length. */
+ if (length > (PY_SSIZE_T_MAX / char_size - 1)) {
+ PyErr_NoMemory();
+ goto onError;
+ }
+ data = PyObject_MALLOC((length + 1) * char_size);
+ if (data == NULL) {
+ PyErr_NoMemory();
+ goto onError;
+ }
+
+ _PyUnicode_DATA_ANY(self) = data;
+ if (share_utf8) {
+ _PyUnicode_UTF8_LENGTH(self) = length;
+ _PyUnicode_UTF8(self) = data;
+ }
+ if (share_wstr) {
+ _PyUnicode_WSTR_LENGTH(self) = length;
+ _PyUnicode_WSTR(self) = (wchar_t *)data;
+ }
+
+ Py_MEMCPY(data, PyUnicode_DATA(unicode),
+ kind * (length + 1));
+ assert(_PyUnicode_CheckConsistency(self, 1));
+#ifdef Py_DEBUG
+ _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode);
+#endif
+ Py_DECREF(unicode);
+ return self;
+
+onError:
+ Py_DECREF(unicode);
+ Py_DECREF(self);
+ return NULL;
}
PyDoc_STRVAR(unicode_doc,
@@ -10045,12 +14131,12 @@ PyTypeObject PyUnicode_Type = {
/* Initialize the Unicode implementation */
-void _PyUnicode_Init(void)
+int _PyUnicode_Init(void)
{
int i;
/* XXX - move this array to unicodectype.c ? */
- Py_UNICODE linebreak[] = {
+ Py_UCS2 linebreak[] = {
0x000A, /* LINE FEED */
0x000D, /* CARRIAGE RETURN */
0x001C, /* FILE SEPARATOR */
@@ -10062,11 +14148,10 @@ void _PyUnicode_Init(void)
};
/* Init the implementation */
- free_list = NULL;
- numfree = 0;
- unicode_empty = _PyUnicode_New(0);
+ unicode_empty = PyUnicode_New(0, 0);
if (!unicode_empty)
- return;
+ Py_FatalError("Can't create empty string");
+ assert(_PyUnicode_CheckConsistency(unicode_empty, 1));
for (i = 0; i < 256; i++)
unicode_latin1[i] = NULL;
@@ -10075,8 +14160,8 @@ void _PyUnicode_Init(void)
/* initialize the linebreak bloom filter */
bloom_linebreak = make_bloom_mask(
- linebreak, sizeof(linebreak) / sizeof(linebreak[0])
- );
+ PyUnicode_2BYTE_KIND, linebreak,
+ Py_ARRAY_LENGTH(linebreak));
PyType_Ready(&EncodingMapType);
@@ -10085,6 +14170,15 @@ void _PyUnicode_Init(void)
if (PyType_Ready(&PyFormatterIter_Type) < 0)
Py_FatalError("Can't initialize formatter iter type");
+
+#ifdef HAVE_MBCS
+ winver.dwOSVersionInfoSize = sizeof(winver);
+ if (!GetVersionEx((OSVERSIONINFO*)&winver)) {
+ PyErr_SetFromWindowsErr(0);
+ return -1;
+ }
+#endif
+ return 0;
}
/* Finalize the Unicode implementation */
@@ -10092,21 +14186,7 @@ void _PyUnicode_Init(void)
int
PyUnicode_ClearFreeList(void)
{
- int freelist_size = numfree;
- PyUnicodeObject *u;
-
- for (u = free_list; u != NULL;) {
- PyUnicodeObject *v = u;
- u = *(PyUnicodeObject **)u;
- if (v->str)
- PyObject_DEL(v->str);
- Py_XDECREF(v->defenc);
- PyObject_Del(v);
- numfree--;
- }
- free_list = NULL;
- assert(numfree == 0);
- return freelist_size;
+ return 0;
}
void
@@ -10123,17 +14203,22 @@ _PyUnicode_Fini(void)
unicode_latin1[i] = NULL;
}
}
+ _PyUnicode_ClearStaticStrings();
(void)PyUnicode_ClearFreeList();
}
void
PyUnicode_InternInPlace(PyObject **p)
{
- register PyUnicodeObject *s = (PyUnicodeObject *)(*p);
+ register PyObject *s = *p;
PyObject *t;
+#ifdef Py_DEBUG
+ assert(s != NULL);
+ assert(_PyUnicode_CHECK(s));
+#else
if (s == NULL || !PyUnicode_Check(s))
- Py_FatalError(
- "PyUnicode_InternInPlace: unicode strings only please!");
+ return;
+#endif
/* If it's a subclass, we don't really know what putting
it in the interned dict might do. */
if (!PyUnicode_CheckExact(s))
@@ -10151,7 +14236,7 @@ PyUnicode_InternInPlace(PyObject **p)
though the key is present in the dictionary,
namely when this happens during a stack overflow. */
Py_ALLOW_RECURSION
- t = PyDict_GetItem(interned, (PyObject *)s);
+ t = PyDict_GetItem(interned, s);
Py_END_ALLOW_RECURSION
if (t) {
@@ -10162,7 +14247,7 @@ PyUnicode_InternInPlace(PyObject **p)
}
PyThreadState_GET()->recursion_critical = 1;
- if (PyDict_SetItem(interned, (PyObject *)s, (PyObject *)s) < 0) {
+ if (PyDict_SetItem(interned, s, s) < 0) {
PyErr_Clear();
PyThreadState_GET()->recursion_critical = 0;
return;
@@ -10171,7 +14256,7 @@ PyUnicode_InternInPlace(PyObject **p)
/* The two references in interned are not counted by refcnt.
The deallocator will take care of this */
Py_REFCNT(s) -= 2;
- PyUnicode_CHECK_INTERNED(s) = SSTATE_INTERNED_MORTAL;
+ _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL;
}
void
@@ -10179,7 +14264,7 @@ PyUnicode_InternImmortal(PyObject **p)
{
PyUnicode_InternInPlace(p);
if (PyUnicode_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) {
- PyUnicode_CHECK_INTERNED(*p) = SSTATE_INTERNED_IMMORTAL;
+ _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL;
Py_INCREF(*p);
}
}
@@ -10194,10 +14279,11 @@ PyUnicode_InternFromString(const char *cp)
return s;
}
-void _Py_ReleaseInternedUnicodeStrings(void)
+void
+_Py_ReleaseInternedUnicodeStrings(void)
{
PyObject *keys;
- PyUnicodeObject *s;
+ PyObject *s;
Py_ssize_t i, n;
Py_ssize_t immortal_size = 0, mortal_size = 0;
@@ -10218,23 +14304,27 @@ void _Py_ReleaseInternedUnicodeStrings(void)
fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n",
n);
for (i = 0; i < n; i++) {
- s = (PyUnicodeObject *) PyList_GET_ITEM(keys, i);
- switch (s->state) {
+ s = PyList_GET_ITEM(keys, i);
+ if (PyUnicode_READY(s) == -1) {
+ assert(0 && "could not ready string");
+ fprintf(stderr, "could not ready string\n");
+ }
+ switch (PyUnicode_CHECK_INTERNED(s)) {
case SSTATE_NOT_INTERNED:
/* XXX Shouldn't happen */
break;
case SSTATE_INTERNED_IMMORTAL:
Py_REFCNT(s) += 1;
- immortal_size += s->length;
+ immortal_size += PyUnicode_GET_LENGTH(s);
break;
case SSTATE_INTERNED_MORTAL:
Py_REFCNT(s) += 2;
- mortal_size += s->length;
+ mortal_size += PyUnicode_GET_LENGTH(s);
break;
default:
Py_FatalError("Inconsistent interned string state.");
}
- s->state = SSTATE_NOT_INTERNED;
+ _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED;
}
fprintf(stderr, "total size of all interned strings: "
"%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d "
@@ -10251,7 +14341,7 @@ void _Py_ReleaseInternedUnicodeStrings(void)
typedef struct {
PyObject_HEAD
Py_ssize_t it_index;
- PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */
+ PyObject *it_seq; /* Set to NULL when iterator is exhausted */
} unicodeiterobject;
static void
@@ -10272,18 +14362,19 @@ unicodeiter_traverse(unicodeiterobject *it, visitproc visit, void *arg)
static PyObject *
unicodeiter_next(unicodeiterobject *it)
{
- PyUnicodeObject *seq;
- PyObject *item;
+ PyObject *seq, *item;
assert(it != NULL);
seq = it->it_seq;
if (seq == NULL)
return NULL;
- assert(PyUnicode_Check(seq));
+ assert(_PyUnicode_CHECK(seq));
- if (it->it_index < PyUnicode_GET_SIZE(seq)) {
- item = PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(seq)+it->it_index, 1);
+ if (it->it_index < PyUnicode_GET_LENGTH(seq)) {
+ int kind = PyUnicode_KIND(seq);
+ void *data = PyUnicode_DATA(seq);
+ Py_UCS4 chr = PyUnicode_READ(kind, data, it->it_index);
+ item = PyUnicode_FromOrdinal(chr);
if (item != NULL)
++it->it_index;
return item;
@@ -10299,15 +14390,49 @@ unicodeiter_len(unicodeiterobject *it)
{
Py_ssize_t len = 0;
if (it->it_seq)
- len = PyUnicode_GET_SIZE(it->it_seq) - it->it_index;
+ len = PyUnicode_GET_LENGTH(it->it_seq) - it->it_index;
return PyLong_FromSsize_t(len);
}
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
+static PyObject *
+unicodeiter_reduce(unicodeiterobject *it)
+{
+ if (it->it_seq != NULL) {
+ return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
+ it->it_seq, it->it_index);
+ } else {
+ PyObject *u = PyUnicode_FromUnicode(NULL, 0);
+ if (u == NULL)
+ return NULL;
+ return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), u);
+ }
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+unicodeiter_setstate(unicodeiterobject *it, PyObject *state)
+{
+ Py_ssize_t index = PyLong_AsSsize_t(state);
+ if (index == -1 && PyErr_Occurred())
+ return NULL;
+ if (index < 0)
+ index = 0;
+ it->it_index = index;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
+
static PyMethodDef unicodeiter_methods[] = {
{"__length_hint__", (PyCFunction)unicodeiter_len, METH_NOARGS,
length_hint_doc},
+ {"__reduce__", (PyCFunction)unicodeiter_reduce, METH_NOARGS,
+ reduce_doc},
+ {"__setstate__", (PyCFunction)unicodeiter_setstate, METH_O,
+ setstate_doc},
{NULL, NULL} /* sentinel */
};
@@ -10353,16 +14478,19 @@ unicode_iter(PyObject *seq)
PyErr_BadInternalCall();
return NULL;
}
+ if (PyUnicode_READY(seq) == -1)
+ return NULL;
it = PyObject_GC_New(unicodeiterobject, &PyUnicodeIter_Type);
if (it == NULL)
return NULL;
it->it_index = 0;
Py_INCREF(seq);
- it->it_seq = (PyUnicodeObject *)seq;
+ it->it_seq = seq;
_PyObject_GC_TRACK(it);
return (PyObject *)it;
}
+
size_t
Py_UNICODE_strlen(const Py_UNICODE *u)
{
@@ -10454,25 +14582,31 @@ Py_UNICODE_strrchr(const Py_UNICODE *s, Py_UNICODE c)
}
Py_UNICODE*
-PyUnicode_AsUnicodeCopy(PyObject *object)
+PyUnicode_AsUnicodeCopy(PyObject *unicode)
{
- PyUnicodeObject *unicode = (PyUnicodeObject *)object;
- Py_UNICODE *copy;
- Py_ssize_t size;
+ Py_UNICODE *u, *copy;
+ Py_ssize_t len, size;
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return NULL;
+ }
+ u = PyUnicode_AsUnicodeAndSize(unicode, &len);
+ if (u == NULL)
+ return NULL;
/* Ensure we won't overflow the size. */
- if (PyUnicode_GET_SIZE(unicode) > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) {
+ if (len > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) {
PyErr_NoMemory();
return NULL;
}
- size = PyUnicode_GET_SIZE(unicode) + 1; /* copy the nul character */
+ size = len + 1; /* copy the null character */
size *= sizeof(Py_UNICODE);
copy = PyMem_Malloc(size);
if (copy == NULL) {
PyErr_NoMemory();
return NULL;
}
- memcpy(copy, PyUnicode_AS_UNICODE(unicode), size);
+ memcpy(copy, u, size);
return copy;
}
diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h
index 88a7912..46a92bb 100644
--- a/Objects/unicodetype_db.h
+++ b/Objects/unicodetype_db.h
@@ -8,184 +8,992 @@ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = {
{0, 0, 0, 0, 0, 48},
{0, 0, 0, 0, 0, 1056},
{0, 0, 0, 0, 0, 1024},
- {0, 0, 0, 0, 0, 5638},
- {0, 0, 0, 1, 1, 5638},
- {0, 0, 0, 2, 2, 5638},
- {0, 0, 0, 3, 3, 5638},
- {0, 0, 0, 4, 4, 5638},
- {0, 0, 0, 5, 5, 5638},
- {0, 0, 0, 6, 6, 5638},
- {0, 0, 0, 7, 7, 5638},
- {0, 0, 0, 8, 8, 5638},
- {0, 0, 0, 9, 9, 5638},
- {0, 32, 0, 0, 0, 1921},
- {0, 0, 0, 0, 0, 1536},
- {65504, 0, 65504, 0, 0, 1801},
- {0, 0, 0, 0, 0, 1801},
- {0, 0, 0, 0, 2, 5124},
- {0, 0, 0, 0, 3, 5124},
- {743, 0, 743, 0, 0, 1801},
- {0, 0, 0, 0, 1, 5124},
{0, 0, 0, 0, 0, 5120},
- {121, 0, 121, 0, 0, 1801},
- {0, 1, 0, 0, 0, 1921},
- {65535, 0, 65535, 0, 0, 1801},
- {0, 65337, 0, 0, 0, 1921},
- {65304, 0, 65304, 0, 0, 1801},
- {0, 65415, 0, 0, 0, 1921},
- {65236, 0, 65236, 0, 0, 1801},
- {195, 0, 195, 0, 0, 1801},
- {0, 210, 0, 0, 0, 1921},
- {0, 206, 0, 0, 0, 1921},
- {0, 205, 0, 0, 0, 1921},
- {0, 79, 0, 0, 0, 1921},
- {0, 202, 0, 0, 0, 1921},
- {0, 203, 0, 0, 0, 1921},
- {0, 207, 0, 0, 0, 1921},
- {97, 0, 97, 0, 0, 1801},
- {0, 211, 0, 0, 0, 1921},
- {0, 209, 0, 0, 0, 1921},
- {163, 0, 163, 0, 0, 1801},
- {0, 213, 0, 0, 0, 1921},
- {130, 0, 130, 0, 0, 1801},
- {0, 214, 0, 0, 0, 1921},
- {0, 218, 0, 0, 0, 1921},
- {0, 217, 0, 0, 0, 1921},
- {0, 219, 0, 0, 0, 1921},
+ {0, 0, 0, 0, 0, 3590},
+ {0, 0, 0, 1, 1, 3590},
+ {0, 0, 0, 2, 2, 3590},
+ {0, 0, 0, 3, 3, 3590},
+ {0, 0, 0, 4, 4, 3590},
+ {0, 0, 0, 5, 5, 3590},
+ {0, 0, 0, 6, 6, 3590},
+ {0, 0, 0, 7, 7, 3590},
+ {0, 0, 0, 8, 8, 3590},
+ {0, 0, 0, 9, 9, 3590},
+ {0, 32, 0, 0, 0, 10113},
+ {0, 0, 0, 0, 0, 1536},
+ {-32, 0, -32, 0, 0, 9993},
+ {0, 0, 0, 0, 0, 9993},
+ {0, 0, 0, 0, 0, 4096},
+ {0, 0, 0, 0, 2, 3076},
+ {0, 0, 0, 0, 3, 3076},
+ {16777218, 17825792, 16777218, 0, 0, 26377},
+ {0, 0, 0, 0, 0, 5632},
+ {0, 0, 0, 0, 1, 3076},
+ {0, 0, 0, 0, 0, 3072},
+ {33554438, 18874371, 33554440, 0, 0, 26377},
+ {121, 0, 121, 0, 0, 9993},
+ {0, 1, 0, 0, 0, 10113},
+ {-1, 0, -1, 0, 0, 9993},
+ {16777228, 33554442, 16777228, 0, 0, 26497},
+ {-232, 0, -232, 0, 0, 9993},
+ {33554448, 18874381, 33554448, 0, 0, 26377},
+ {0, -121, 0, 0, 0, 10113},
+ {16777236, 17825810, 16777236, 0, 0, 26377},
+ {195, 0, 195, 0, 0, 9993},
+ {0, 210, 0, 0, 0, 10113},
+ {0, 206, 0, 0, 0, 10113},
+ {0, 205, 0, 0, 0, 10113},
+ {0, 79, 0, 0, 0, 10113},
+ {0, 202, 0, 0, 0, 10113},
+ {0, 203, 0, 0, 0, 10113},
+ {0, 207, 0, 0, 0, 10113},
+ {97, 0, 97, 0, 0, 9993},
+ {0, 211, 0, 0, 0, 10113},
+ {0, 209, 0, 0, 0, 10113},
+ {163, 0, 163, 0, 0, 9993},
+ {0, 213, 0, 0, 0, 10113},
+ {130, 0, 130, 0, 0, 9993},
+ {0, 214, 0, 0, 0, 10113},
+ {0, 218, 0, 0, 0, 10113},
+ {0, 217, 0, 0, 0, 10113},
+ {0, 219, 0, 0, 0, 10113},
{0, 0, 0, 0, 0, 1793},
- {56, 0, 56, 0, 0, 1801},
- {0, 2, 1, 0, 0, 1921},
- {65535, 1, 0, 0, 0, 1857},
- {65534, 0, 65535, 0, 0, 1801},
- {65457, 0, 65457, 0, 0, 1801},
- {0, 65439, 0, 0, 0, 1921},
- {0, 65480, 0, 0, 0, 1921},
- {0, 65406, 0, 0, 0, 1921},
- {0, 10795, 0, 0, 0, 1921},
- {0, 65373, 0, 0, 0, 1921},
- {0, 10792, 0, 0, 0, 1921},
- {10815, 0, 10815, 0, 0, 1801},
- {0, 65341, 0, 0, 0, 1921},
- {0, 69, 0, 0, 0, 1921},
- {0, 71, 0, 0, 0, 1921},
- {10783, 0, 10783, 0, 0, 1801},
- {10780, 0, 10780, 0, 0, 1801},
- {10782, 0, 10782, 0, 0, 1801},
- {65326, 0, 65326, 0, 0, 1801},
- {65330, 0, 65330, 0, 0, 1801},
- {65331, 0, 65331, 0, 0, 1801},
- {65334, 0, 65334, 0, 0, 1801},
- {65333, 0, 65333, 0, 0, 1801},
- {65329, 0, 65329, 0, 0, 1801},
- {42893, 613, 42893, 0, 0, 3849},
- {65327, 0, 65327, 0, 0, 1801},
- {65325, 0, 65325, 0, 0, 1801},
- {10743, 0, 10743, 0, 0, 1801},
- {10749, 0, 10749, 0, 0, 1801},
- {65323, 0, 65323, 0, 0, 1801},
- {65322, 0, 65322, 0, 0, 1801},
- {10727, 0, 10727, 0, 0, 1801},
- {65318, 0, 65318, 0, 0, 1801},
- {65467, 0, 65467, 0, 0, 1801},
- {65319, 0, 65319, 0, 0, 1801},
- {65465, 0, 65465, 0, 0, 1801},
- {65317, 0, 65317, 0, 0, 1801},
- {84, 0, 84, 0, 0, 1536},
- {0, 0, 0, 0, 0, 1025},
- {0, 38, 0, 0, 0, 1921},
- {0, 37, 0, 0, 0, 1921},
- {0, 64, 0, 0, 0, 1921},
- {0, 63, 0, 0, 0, 1921},
- {65498, 0, 65498, 0, 0, 1801},
- {65499, 0, 65499, 0, 0, 1801},
- {65505, 0, 65505, 0, 0, 1801},
- {65472, 0, 65472, 0, 0, 1801},
- {65473, 0, 65473, 0, 0, 1801},
- {0, 8, 0, 0, 0, 1921},
- {65474, 0, 65474, 0, 0, 1801},
- {65479, 0, 65479, 0, 0, 1801},
- {0, 0, 0, 0, 0, 1921},
- {65489, 0, 65489, 0, 0, 1801},
- {65482, 0, 65482, 0, 0, 1801},
- {65528, 0, 65528, 0, 0, 1801},
- {65450, 0, 65450, 0, 0, 1801},
- {65456, 0, 65456, 0, 0, 1801},
- {7, 0, 7, 0, 0, 1801},
- {0, 65476, 0, 0, 0, 1921},
- {65440, 0, 65440, 0, 0, 1801},
- {0, 65529, 0, 0, 0, 1921},
- {0, 80, 0, 0, 0, 1921},
- {0, 15, 0, 0, 0, 1921},
- {65521, 0, 65521, 0, 0, 1801},
- {0, 48, 0, 0, 0, 1921},
- {65488, 0, 65488, 0, 0, 1801},
+ {56, 0, 56, 0, 0, 9993},
+ {0, 2, 1, 0, 0, 10113},
+ {-1, 1, 0, 0, 0, 10049},
+ {-2, 0, -1, 0, 0, 9993},
+ {-79, 0, -79, 0, 0, 9993},
+ {33554456, 18874389, 33554456, 0, 0, 26377},
+ {0, -97, 0, 0, 0, 10113},
+ {0, -56, 0, 0, 0, 10113},
+ {0, -130, 0, 0, 0, 10113},
+ {0, 10795, 0, 0, 0, 10113},
+ {0, -163, 0, 0, 0, 10113},
+ {0, 10792, 0, 0, 0, 10113},
+ {10815, 0, 10815, 0, 0, 9993},
+ {0, -195, 0, 0, 0, 10113},
+ {0, 69, 0, 0, 0, 10113},
+ {0, 71, 0, 0, 0, 10113},
+ {10783, 0, 10783, 0, 0, 9993},
+ {10780, 0, 10780, 0, 0, 9993},
+ {10782, 0, 10782, 0, 0, 9993},
+ {-210, 0, -210, 0, 0, 9993},
+ {-206, 0, -206, 0, 0, 9993},
+ {-205, 0, -205, 0, 0, 9993},
+ {-202, 0, -202, 0, 0, 9993},
+ {-203, 0, -203, 0, 0, 9993},
+ {-207, 0, -207, 0, 0, 9993},
+ {42280, 0, 42280, 0, 0, 9993},
+ {42308, 0, 42308, 0, 0, 9993},
+ {-209, 0, -209, 0, 0, 9993},
+ {-211, 0, -211, 0, 0, 9993},
+ {10743, 0, 10743, 0, 0, 9993},
+ {10749, 0, 10749, 0, 0, 9993},
+ {-213, 0, -213, 0, 0, 9993},
+ {-214, 0, -214, 0, 0, 9993},
+ {10727, 0, 10727, 0, 0, 9993},
+ {-218, 0, -218, 0, 0, 9993},
+ {-69, 0, -69, 0, 0, 9993},
+ {-217, 0, -217, 0, 0, 9993},
+ {-71, 0, -71, 0, 0, 9993},
+ {-219, 0, -219, 0, 0, 9993},
+ {0, 0, 0, 0, 0, 14089},
+ {0, 0, 0, 0, 0, 5889},
+ {16777244, 17825818, 16777244, 0, 0, 30216},
+ {0, 0, 0, 0, 0, 13321},
+ {0, 38, 0, 0, 0, 10113},
+ {0, 37, 0, 0, 0, 10113},
+ {0, 64, 0, 0, 0, 10113},
+ {0, 63, 0, 0, 0, 10113},
+ {50331681, 19922973, 50331681, 0, 0, 26377},
+ {-38, 0, -38, 0, 0, 9993},
+ {-37, 0, -37, 0, 0, 9993},
+ {50331688, 19922980, 50331688, 0, 0, 26377},
+ {16777261, 17825835, 16777261, 0, 0, 26377},
+ {-64, 0, -64, 0, 0, 9993},
+ {-63, 0, -63, 0, 0, 9993},
+ {0, 8, 0, 0, 0, 10113},
+ {16777264, 17825838, 16777264, 0, 0, 26377},
+ {16777267, 17825841, 16777267, 0, 0, 26377},
+ {0, 0, 0, 0, 0, 10113},
+ {16777270, 17825844, 16777270, 0, 0, 26377},
+ {16777273, 17825847, 16777273, 0, 0, 26377},
+ {-8, 0, -8, 0, 0, 9993},
+ {16777276, 17825850, 16777276, 0, 0, 26377},
+ {16777279, 17825853, 16777279, 0, 0, 26377},
+ {7, 0, 7, 0, 0, 9993},
+ {0, -60, 0, 0, 0, 10113},
+ {16777282, 17825856, 16777282, 0, 0, 26377},
+ {0, -7, 0, 0, 0, 10113},
+ {0, 80, 0, 0, 0, 10113},
+ {-80, 0, -80, 0, 0, 9993},
+ {0, 15, 0, 0, 0, 10113},
+ {-15, 0, -15, 0, 0, 9993},
+ {0, 48, 0, 0, 0, 10113},
+ {-48, 0, -48, 0, 0, 9993},
+ {33554502, 18874435, 33554504, 0, 0, 26377},
{0, 0, 0, 0, 0, 1537},
- {0, 7264, 0, 0, 0, 1921},
- {0, 0, 0, 0, 1, 5636},
- {0, 0, 0, 0, 2, 5636},
- {0, 0, 0, 0, 3, 5636},
- {0, 0, 0, 0, 4, 5636},
- {0, 0, 0, 0, 5, 5636},
- {0, 0, 0, 0, 6, 5636},
- {0, 0, 0, 0, 7, 5636},
- {0, 0, 0, 0, 8, 5636},
- {0, 0, 0, 0, 9, 5636},
- {0, 0, 0, 0, 0, 5888},
- {42877, 7545, 42877, 0, 0, 3849},
- {3814, 0, 3814, 0, 0, 1801},
- {65477, 0, 65477, 0, 0, 1801},
- {0, 57921, 0, 0, 0, 1921},
- {8, 0, 8, 0, 0, 1801},
- {0, 65528, 0, 0, 0, 1921},
- {74, 0, 74, 0, 0, 1801},
- {86, 0, 86, 0, 0, 1801},
- {100, 0, 100, 0, 0, 1801},
- {128, 0, 128, 0, 0, 1801},
- {112, 0, 112, 0, 0, 1801},
- {126, 0, 126, 0, 0, 1801},
- {0, 65528, 0, 0, 0, 1857},
- {9, 0, 9, 0, 0, 1801},
- {0, 65462, 0, 0, 0, 1921},
- {0, 65527, 0, 0, 0, 1857},
- {58331, 0, 58331, 0, 0, 1801},
- {0, 65450, 0, 0, 0, 1921},
- {0, 65436, 0, 0, 0, 1921},
- {0, 65424, 0, 0, 0, 1921},
- {0, 65408, 0, 0, 0, 1921},
- {0, 65410, 0, 0, 0, 1921},
- {0, 0, 0, 0, 0, 5124},
- {0, 0, 0, 0, 4, 5124},
- {0, 0, 0, 0, 5, 5124},
- {0, 0, 0, 0, 6, 5124},
- {0, 0, 0, 0, 7, 5124},
- {0, 0, 0, 0, 8, 5124},
- {0, 0, 0, 0, 9, 5124},
+ {0, 7264, 0, 0, 0, 10113},
+ {0, 0, 0, 0, 1, 3588},
+ {0, 0, 0, 0, 2, 3588},
+ {0, 0, 0, 0, 3, 3588},
+ {0, 0, 0, 0, 4, 3588},
+ {0, 0, 0, 0, 5, 3588},
+ {0, 0, 0, 0, 6, 3588},
+ {0, 0, 0, 0, 7, 3588},
+ {0, 0, 0, 0, 8, 3588},
+ {0, 0, 0, 0, 9, 3588},
+ {0, 0, 0, 0, 0, 3840},
+ {35332, 0, 35332, 0, 0, 9993},
+ {3814, 0, 3814, 0, 0, 9993},
+ {33554509, 18874442, 33554509, 0, 0, 26377},
+ {33554514, 18874447, 33554514, 0, 0, 26377},
+ {33554519, 18874452, 33554519, 0, 0, 26377},
+ {33554524, 18874457, 33554524, 0, 0, 26377},
+ {33554529, 18874462, 33554529, 0, 0, 26377},
+ {16777317, 17825891, 16777317, 0, 0, 26377},
+ {16777321, 18874470, 16777321, 0, 0, 26497},
+ {8, 0, 8, 0, 0, 9993},
+ {0, -8, 0, 0, 0, 10113},
+ {33554541, 18874474, 33554541, 0, 0, 26377},
+ {50331763, 19923055, 50331763, 0, 0, 26377},
+ {50331770, 19923062, 50331770, 0, 0, 26377},
+ {50331777, 19923069, 50331777, 0, 0, 26377},
+ {74, 0, 74, 0, 0, 9993},
+ {86, 0, 86, 0, 0, 9993},
+ {100, 0, 100, 0, 0, 9993},
+ {128, 0, 128, 0, 0, 9993},
+ {112, 0, 112, 0, 0, 9993},
+ {126, 0, 126, 0, 0, 9993},
+ {33554567, 18874500, 16777353, 0, 0, 26377},
+ {33554573, 18874506, 16777359, 0, 0, 26377},
+ {33554579, 18874512, 16777365, 0, 0, 26377},
+ {33554585, 18874518, 16777371, 0, 0, 26377},
+ {33554591, 18874524, 16777377, 0, 0, 26377},
+ {33554597, 18874530, 16777383, 0, 0, 26377},
+ {33554603, 18874536, 16777389, 0, 0, 26377},
+ {33554609, 18874542, 16777395, 0, 0, 26377},
+ {33554615, 18874548, 16777401, 0, 0, 26433},
+ {33554621, 18874554, 16777407, 0, 0, 26433},
+ {33554627, 18874560, 16777413, 0, 0, 26433},
+ {33554633, 18874566, 16777419, 0, 0, 26433},
+ {33554639, 18874572, 16777425, 0, 0, 26433},
+ {33554645, 18874578, 16777431, 0, 0, 26433},
+ {33554651, 18874584, 16777437, 0, 0, 26433},
+ {33554657, 18874590, 16777443, 0, 0, 26433},
+ {33554663, 18874596, 16777449, 0, 0, 26377},
+ {33554669, 18874602, 16777455, 0, 0, 26377},
+ {33554675, 18874608, 16777461, 0, 0, 26377},
+ {33554681, 18874614, 16777467, 0, 0, 26377},
+ {33554687, 18874620, 16777473, 0, 0, 26377},
+ {33554693, 18874626, 16777479, 0, 0, 26377},
+ {33554699, 18874632, 16777485, 0, 0, 26377},
+ {33554705, 18874638, 16777491, 0, 0, 26377},
+ {33554711, 18874644, 16777497, 0, 0, 26433},
+ {33554717, 18874650, 16777503, 0, 0, 26433},
+ {33554723, 18874656, 16777509, 0, 0, 26433},
+ {33554729, 18874662, 16777515, 0, 0, 26433},
+ {33554735, 18874668, 16777521, 0, 0, 26433},
+ {33554741, 18874674, 16777527, 0, 0, 26433},
+ {33554747, 18874680, 16777533, 0, 0, 26433},
+ {33554753, 18874686, 16777539, 0, 0, 26433},
+ {33554759, 18874692, 16777545, 0, 0, 26377},
+ {33554765, 18874698, 16777551, 0, 0, 26377},
+ {33554771, 18874704, 16777557, 0, 0, 26377},
+ {33554777, 18874710, 16777563, 0, 0, 26377},
+ {33554783, 18874716, 16777569, 0, 0, 26377},
+ {33554789, 18874722, 16777575, 0, 0, 26377},
+ {33554795, 18874728, 16777581, 0, 0, 26377},
+ {33554801, 18874734, 16777587, 0, 0, 26377},
+ {33554807, 18874740, 16777593, 0, 0, 26433},
+ {33554813, 18874746, 16777599, 0, 0, 26433},
+ {33554819, 18874752, 16777605, 0, 0, 26433},
+ {33554825, 18874758, 16777611, 0, 0, 26433},
+ {33554831, 18874764, 16777617, 0, 0, 26433},
+ {33554837, 18874770, 16777623, 0, 0, 26433},
+ {33554843, 18874776, 16777629, 0, 0, 26433},
+ {33554849, 18874782, 16777635, 0, 0, 26433},
+ {33554855, 18874788, 33554857, 0, 0, 26377},
+ {33554862, 18874795, 16777648, 0, 0, 26377},
+ {33554868, 18874801, 33554870, 0, 0, 26377},
+ {33554875, 18874808, 33554875, 0, 0, 26377},
+ {50332097, 19923389, 50332100, 0, 0, 26377},
+ {0, -74, 0, 0, 0, 10113},
+ {33554890, 18874823, 16777676, 0, 0, 26433},
+ {16777679, 17826253, 16777679, 0, 0, 26377},
+ {33554899, 18874832, 33554901, 0, 0, 26377},
+ {33554906, 18874839, 16777692, 0, 0, 26377},
+ {33554912, 18874845, 33554914, 0, 0, 26377},
+ {33554919, 18874852, 33554919, 0, 0, 26377},
+ {50332141, 19923433, 50332144, 0, 0, 26377},
+ {0, -86, 0, 0, 0, 10113},
+ {33554934, 18874867, 16777720, 0, 0, 26433},
+ {50332157, 19923449, 50332157, 0, 0, 26377},
+ {50332164, 19923456, 50332164, 0, 0, 26377},
+ {33554954, 18874887, 33554954, 0, 0, 26377},
+ {50332176, 19923468, 50332176, 0, 0, 26377},
+ {0, -100, 0, 0, 0, 10113},
+ {50332183, 19923475, 50332183, 0, 0, 26377},
+ {50332190, 19923482, 50332190, 0, 0, 26377},
+ {33554980, 18874913, 33554980, 0, 0, 26377},
+ {33554985, 18874918, 33554985, 0, 0, 26377},
+ {50332207, 19923499, 50332207, 0, 0, 26377},
+ {0, -112, 0, 0, 0, 10113},
+ {33554997, 18874930, 33554999, 0, 0, 26377},
+ {33555004, 18874937, 16777790, 0, 0, 26377},
+ {33555010, 18874943, 33555012, 0, 0, 26377},
+ {33555017, 18874950, 33555017, 0, 0, 26377},
+ {50332239, 19923531, 50332242, 0, 0, 26377},
+ {0, -128, 0, 0, 0, 10113},
+ {0, -126, 0, 0, 0, 10113},
+ {33555032, 18874965, 16777818, 0, 0, 26433},
+ {0, 0, 0, 0, 0, 3076},
+ {0, 0, 0, 0, 4, 3076},
+ {0, 0, 0, 0, 5, 3076},
+ {0, 0, 0, 0, 6, 3076},
+ {0, 0, 0, 0, 7, 3076},
+ {0, 0, 0, 0, 8, 3076},
+ {0, 0, 0, 0, 9, 3076},
{0, 0, 0, 0, 0, 1792},
- {0, 58019, 0, 0, 0, 1921},
- {0, 57153, 0, 0, 0, 1921},
- {0, 57274, 0, 0, 0, 1921},
- {0, 28, 0, 0, 0, 1921},
- {65508, 0, 65508, 0, 0, 1801},
- {0, 16, 0, 0, 0, 5888},
- {65520, 0, 65520, 0, 0, 5888},
- {0, 26, 0, 0, 0, 1024},
- {65510, 0, 65510, 0, 0, 1024},
- {0, 54793, 0, 0, 0, 1921},
- {0, 61722, 0, 0, 0, 1921},
- {0, 54809, 0, 0, 0, 1921},
- {54741, 0, 54741, 0, 0, 1801},
- {54744, 0, 54744, 0, 0, 1801},
- {0, 54756, 0, 0, 0, 1921},
- {0, 54787, 0, 0, 0, 1921},
- {0, 54753, 0, 0, 0, 1921},
- {0, 54754, 0, 0, 0, 1921},
- {0, 54721, 0, 0, 0, 1921},
- {58272, 0, 58272, 0, 0, 1801},
- {0, 0, 0, 0, 0, 5889},
- {42877, 7545, 42877, 0, 0, 3969},
- {42893, 613, 42893, 0, 0, 3969},
- {0, 40, 0, 0, 0, 1921},
- {65496, 0, 65496, 0, 0, 1801},
+ {0, -7517, 0, 0, 0, 10113},
+ {0, -8383, 0, 0, 0, 10113},
+ {0, -8262, 0, 0, 0, 10113},
+ {0, 28, 0, 0, 0, 10113},
+ {-28, 0, -28, 0, 0, 9993},
+ {0, 16, 0, 0, 0, 12160},
+ {-16, 0, -16, 0, 0, 12040},
+ {0, 26, 0, 0, 0, 9344},
+ {-26, 0, -26, 0, 0, 9224},
+ {0, -10743, 0, 0, 0, 10113},
+ {0, -3814, 0, 0, 0, 10113},
+ {0, -10727, 0, 0, 0, 10113},
+ {-10795, 0, -10795, 0, 0, 9993},
+ {-10792, 0, -10792, 0, 0, 9993},
+ {0, -10780, 0, 0, 0, 10113},
+ {0, -10749, 0, 0, 0, 10113},
+ {0, -10783, 0, 0, 0, 10113},
+ {0, -10782, 0, 0, 0, 10113},
+ {0, -10815, 0, 0, 0, 10113},
+ {-7264, 0, -7264, 0, 0, 9993},
+ {0, 0, 0, 0, 0, 5121},
+ {0, 0, 0, 0, 0, 3841},
+ {0, -35332, 0, 0, 0, 10113},
+ {0, -42280, 0, 0, 0, 10113},
+ {0, -42308, 0, 0, 0, 10113},
+ {33555038, 18874971, 33555040, 0, 0, 26377},
+ {33555045, 18874978, 33555047, 0, 0, 26377},
+ {33555052, 18874985, 33555054, 0, 0, 26377},
+ {50332276, 19923568, 50332279, 0, 0, 26377},
+ {50332286, 19923578, 50332289, 0, 0, 26377},
+ {33555079, 18875012, 33555081, 0, 0, 26377},
+ {33555086, 18875019, 33555088, 0, 0, 26377},
+ {33555093, 18875026, 33555095, 0, 0, 26377},
+ {33555100, 18875033, 33555102, 0, 0, 26377},
+ {33555107, 18875040, 33555109, 0, 0, 26377},
+ {33555114, 18875047, 33555116, 0, 0, 26377},
+ {33555121, 18875054, 33555123, 0, 0, 26377},
+ {0, 0, 0, 0, 0, 1025},
+ {0, 0, 0, 0, 0, 5633},
+ {0, 40, 0, 0, 0, 10113},
+ {-40, 0, -40, 0, 0, 9993},
+};
+
+/* extended case mappings */
+
+const Py_UCS4 _PyUnicode_ExtendedCase[] = {
+ 181,
+ 956,
+ 924,
+ 223,
+ 115,
+ 115,
+ 83,
+ 83,
+ 83,
+ 115,
+ 105,
+ 775,
+ 304,
+ 329,
+ 700,
+ 110,
+ 700,
+ 78,
+ 383,
+ 115,
+ 83,
+ 496,
+ 106,
+ 780,
+ 74,
+ 780,
+ 837,
+ 953,
+ 921,
+ 912,
+ 953,
+ 776,
+ 769,
+ 921,
+ 776,
+ 769,
+ 944,
+ 965,
+ 776,
+ 769,
+ 933,
+ 776,
+ 769,
+ 962,
+ 963,
+ 931,
+ 976,
+ 946,
+ 914,
+ 977,
+ 952,
+ 920,
+ 981,
+ 966,
+ 934,
+ 982,
+ 960,
+ 928,
+ 1008,
+ 954,
+ 922,
+ 1009,
+ 961,
+ 929,
+ 1013,
+ 949,
+ 917,
+ 1415,
+ 1381,
+ 1410,
+ 1333,
+ 1362,
+ 1333,
+ 1410,
+ 7830,
+ 104,
+ 817,
+ 72,
+ 817,
+ 7831,
+ 116,
+ 776,
+ 84,
+ 776,
+ 7832,
+ 119,
+ 778,
+ 87,
+ 778,
+ 7833,
+ 121,
+ 778,
+ 89,
+ 778,
+ 7834,
+ 97,
+ 702,
+ 65,
+ 702,
+ 7835,
+ 7777,
+ 7776,
+ 223,
+ 115,
+ 115,
+ 7838,
+ 8016,
+ 965,
+ 787,
+ 933,
+ 787,
+ 8018,
+ 965,
+ 787,
+ 768,
+ 933,
+ 787,
+ 768,
+ 8020,
+ 965,
+ 787,
+ 769,
+ 933,
+ 787,
+ 769,
+ 8022,
+ 965,
+ 787,
+ 834,
+ 933,
+ 787,
+ 834,
+ 8064,
+ 7936,
+ 953,
+ 7944,
+ 921,
+ 8072,
+ 8065,
+ 7937,
+ 953,
+ 7945,
+ 921,
+ 8073,
+ 8066,
+ 7938,
+ 953,
+ 7946,
+ 921,
+ 8074,
+ 8067,
+ 7939,
+ 953,
+ 7947,
+ 921,
+ 8075,
+ 8068,
+ 7940,
+ 953,
+ 7948,
+ 921,
+ 8076,
+ 8069,
+ 7941,
+ 953,
+ 7949,
+ 921,
+ 8077,
+ 8070,
+ 7942,
+ 953,
+ 7950,
+ 921,
+ 8078,
+ 8071,
+ 7943,
+ 953,
+ 7951,
+ 921,
+ 8079,
+ 8064,
+ 7936,
+ 953,
+ 7944,
+ 921,
+ 8072,
+ 8065,
+ 7937,
+ 953,
+ 7945,
+ 921,
+ 8073,
+ 8066,
+ 7938,
+ 953,
+ 7946,
+ 921,
+ 8074,
+ 8067,
+ 7939,
+ 953,
+ 7947,
+ 921,
+ 8075,
+ 8068,
+ 7940,
+ 953,
+ 7948,
+ 921,
+ 8076,
+ 8069,
+ 7941,
+ 953,
+ 7949,
+ 921,
+ 8077,
+ 8070,
+ 7942,
+ 953,
+ 7950,
+ 921,
+ 8078,
+ 8071,
+ 7943,
+ 953,
+ 7951,
+ 921,
+ 8079,
+ 8080,
+ 7968,
+ 953,
+ 7976,
+ 921,
+ 8088,
+ 8081,
+ 7969,
+ 953,
+ 7977,
+ 921,
+ 8089,
+ 8082,
+ 7970,
+ 953,
+ 7978,
+ 921,
+ 8090,
+ 8083,
+ 7971,
+ 953,
+ 7979,
+ 921,
+ 8091,
+ 8084,
+ 7972,
+ 953,
+ 7980,
+ 921,
+ 8092,
+ 8085,
+ 7973,
+ 953,
+ 7981,
+ 921,
+ 8093,
+ 8086,
+ 7974,
+ 953,
+ 7982,
+ 921,
+ 8094,
+ 8087,
+ 7975,
+ 953,
+ 7983,
+ 921,
+ 8095,
+ 8080,
+ 7968,
+ 953,
+ 7976,
+ 921,
+ 8088,
+ 8081,
+ 7969,
+ 953,
+ 7977,
+ 921,
+ 8089,
+ 8082,
+ 7970,
+ 953,
+ 7978,
+ 921,
+ 8090,
+ 8083,
+ 7971,
+ 953,
+ 7979,
+ 921,
+ 8091,
+ 8084,
+ 7972,
+ 953,
+ 7980,
+ 921,
+ 8092,
+ 8085,
+ 7973,
+ 953,
+ 7981,
+ 921,
+ 8093,
+ 8086,
+ 7974,
+ 953,
+ 7982,
+ 921,
+ 8094,
+ 8087,
+ 7975,
+ 953,
+ 7983,
+ 921,
+ 8095,
+ 8096,
+ 8032,
+ 953,
+ 8040,
+ 921,
+ 8104,
+ 8097,
+ 8033,
+ 953,
+ 8041,
+ 921,
+ 8105,
+ 8098,
+ 8034,
+ 953,
+ 8042,
+ 921,
+ 8106,
+ 8099,
+ 8035,
+ 953,
+ 8043,
+ 921,
+ 8107,
+ 8100,
+ 8036,
+ 953,
+ 8044,
+ 921,
+ 8108,
+ 8101,
+ 8037,
+ 953,
+ 8045,
+ 921,
+ 8109,
+ 8102,
+ 8038,
+ 953,
+ 8046,
+ 921,
+ 8110,
+ 8103,
+ 8039,
+ 953,
+ 8047,
+ 921,
+ 8111,
+ 8096,
+ 8032,
+ 953,
+ 8040,
+ 921,
+ 8104,
+ 8097,
+ 8033,
+ 953,
+ 8041,
+ 921,
+ 8105,
+ 8098,
+ 8034,
+ 953,
+ 8042,
+ 921,
+ 8106,
+ 8099,
+ 8035,
+ 953,
+ 8043,
+ 921,
+ 8107,
+ 8100,
+ 8036,
+ 953,
+ 8044,
+ 921,
+ 8108,
+ 8101,
+ 8037,
+ 953,
+ 8045,
+ 921,
+ 8109,
+ 8102,
+ 8038,
+ 953,
+ 8046,
+ 921,
+ 8110,
+ 8103,
+ 8039,
+ 953,
+ 8047,
+ 921,
+ 8111,
+ 8114,
+ 8048,
+ 953,
+ 8122,
+ 921,
+ 8122,
+ 837,
+ 8115,
+ 945,
+ 953,
+ 913,
+ 921,
+ 8124,
+ 8116,
+ 940,
+ 953,
+ 902,
+ 921,
+ 902,
+ 837,
+ 8118,
+ 945,
+ 834,
+ 913,
+ 834,
+ 8119,
+ 945,
+ 834,
+ 953,
+ 913,
+ 834,
+ 921,
+ 913,
+ 834,
+ 837,
+ 8115,
+ 945,
+ 953,
+ 913,
+ 921,
+ 8124,
+ 8126,
+ 953,
+ 921,
+ 8130,
+ 8052,
+ 953,
+ 8138,
+ 921,
+ 8138,
+ 837,
+ 8131,
+ 951,
+ 953,
+ 919,
+ 921,
+ 8140,
+ 8132,
+ 942,
+ 953,
+ 905,
+ 921,
+ 905,
+ 837,
+ 8134,
+ 951,
+ 834,
+ 919,
+ 834,
+ 8135,
+ 951,
+ 834,
+ 953,
+ 919,
+ 834,
+ 921,
+ 919,
+ 834,
+ 837,
+ 8131,
+ 951,
+ 953,
+ 919,
+ 921,
+ 8140,
+ 8146,
+ 953,
+ 776,
+ 768,
+ 921,
+ 776,
+ 768,
+ 8147,
+ 953,
+ 776,
+ 769,
+ 921,
+ 776,
+ 769,
+ 8150,
+ 953,
+ 834,
+ 921,
+ 834,
+ 8151,
+ 953,
+ 776,
+ 834,
+ 921,
+ 776,
+ 834,
+ 8162,
+ 965,
+ 776,
+ 768,
+ 933,
+ 776,
+ 768,
+ 8163,
+ 965,
+ 776,
+ 769,
+ 933,
+ 776,
+ 769,
+ 8164,
+ 961,
+ 787,
+ 929,
+ 787,
+ 8166,
+ 965,
+ 834,
+ 933,
+ 834,
+ 8167,
+ 965,
+ 776,
+ 834,
+ 933,
+ 776,
+ 834,
+ 8178,
+ 8060,
+ 953,
+ 8186,
+ 921,
+ 8186,
+ 837,
+ 8179,
+ 969,
+ 953,
+ 937,
+ 921,
+ 8188,
+ 8180,
+ 974,
+ 953,
+ 911,
+ 921,
+ 911,
+ 837,
+ 8182,
+ 969,
+ 834,
+ 937,
+ 834,
+ 8183,
+ 969,
+ 834,
+ 953,
+ 937,
+ 834,
+ 921,
+ 937,
+ 834,
+ 837,
+ 8179,
+ 969,
+ 953,
+ 937,
+ 921,
+ 8188,
+ 64256,
+ 102,
+ 102,
+ 70,
+ 70,
+ 70,
+ 102,
+ 64257,
+ 102,
+ 105,
+ 70,
+ 73,
+ 70,
+ 105,
+ 64258,
+ 102,
+ 108,
+ 70,
+ 76,
+ 70,
+ 108,
+ 64259,
+ 102,
+ 102,
+ 105,
+ 70,
+ 70,
+ 73,
+ 70,
+ 102,
+ 105,
+ 64260,
+ 102,
+ 102,
+ 108,
+ 70,
+ 70,
+ 76,
+ 70,
+ 102,
+ 108,
+ 64261,
+ 115,
+ 116,
+ 83,
+ 84,
+ 83,
+ 116,
+ 64262,
+ 115,
+ 116,
+ 83,
+ 84,
+ 83,
+ 116,
+ 64275,
+ 1396,
+ 1398,
+ 1348,
+ 1350,
+ 1348,
+ 1398,
+ 64276,
+ 1396,
+ 1381,
+ 1348,
+ 1333,
+ 1348,
+ 1381,
+ 64277,
+ 1396,
+ 1387,
+ 1348,
+ 1339,
+ 1348,
+ 1387,
+ 64278,
+ 1406,
+ 1398,
+ 1358,
+ 1350,
+ 1358,
+ 1398,
+ 64279,
+ 1396,
+ 1389,
+ 1348,
+ 1341,
+ 1348,
+ 1389,
};
/* type indexes */
@@ -195,72 +1003,72 @@ static unsigned char index1[] = {
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37,
38, 39, 34, 34, 34, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 65, 66, 67, 64,
- 64, 64, 64, 68, 69, 64, 64, 64, 64, 64, 64, 70, 17, 71, 72, 73, 74, 75,
- 76, 64, 77, 78, 79, 80, 81, 82, 83, 64, 64, 84, 85, 34, 34, 34, 34, 34,
- 34, 86, 34, 34, 34, 34, 34, 87, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 64, 64, 64, 68, 69, 64, 64, 64, 64, 64, 64, 70, 71, 72, 73, 74, 75, 76,
+ 77, 64, 78, 79, 80, 81, 82, 83, 84, 64, 64, 85, 86, 34, 34, 34, 34, 34,
+ 34, 87, 34, 34, 34, 34, 34, 88, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 88, 89, 90, 91, 34, 34, 34, 92, 34, 34,
- 34, 93, 94, 34, 34, 34, 34, 34, 95, 34, 34, 34, 96, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 97, 98, 99, 34, 34, 34, 34, 34, 34, 100, 101, 34, 34,
- 34, 34, 34, 34, 34, 34, 102, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 103, 34, 34, 34, 34, 34, 34, 34, 34, 104, 34, 34, 34, 34,
- 100, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 103, 34, 34, 34, 34, 34, 34, 105, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 106, 107, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 108, 109, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 110, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 111, 34, 34, 112, 113, 114, 115, 116, 117, 118, 119, 120,
- 121, 122, 123, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 89, 90, 91, 92, 34, 34, 34, 93, 34, 34,
+ 34, 94, 95, 34, 34, 34, 34, 34, 96, 34, 34, 34, 97, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 98, 99, 100, 34, 34, 34, 34, 34, 34, 101, 102, 34,
+ 34, 34, 34, 34, 34, 34, 34, 103, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 104, 34, 34, 34, 34, 34, 34, 34, 34, 105, 34, 34, 34, 34,
+ 101, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 104, 34, 34, 34, 34, 34, 34, 106, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 107, 108, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 109, 110, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 111, 112, 34, 34, 34, 34, 34,
+ 34, 34, 34, 113, 34, 34, 114, 115, 116, 117, 118, 119, 120, 121, 122,
+ 123, 124, 125, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 127, 128,
- 129, 130, 131, 132, 34, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
- 17, 143, 144, 145, 146, 147, 17, 17, 17, 17, 17, 17, 148, 17, 149, 17,
- 150, 17, 151, 17, 152, 17, 17, 17, 153, 17, 17, 17, 154, 155, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 156, 17, 157,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 158, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 159, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 160, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 64, 161, 162, 163, 164, 17, 165, 17, 166, 167, 168, 169, 170, 171,
- 172, 173, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 174, 175, 176,
- 177, 178, 17, 179, 180, 181, 182, 183, 184, 185, 186, 65, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 187, 188, 189, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 190, 34, 191,
- 192, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 129, 130,
+ 131, 132, 133, 134, 34, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
+ 71, 145, 146, 147, 148, 149, 71, 71, 71, 71, 71, 71, 150, 71, 151, 152,
+ 153, 71, 154, 71, 155, 71, 71, 71, 156, 71, 71, 71, 157, 158, 159, 160,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 161, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 34, 34, 162, 71,
+ 163, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 34, 34, 34, 34, 164, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 165, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 166, 167, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 168, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 64, 169, 170, 171, 172, 71, 173, 71, 174, 175, 176, 177, 178,
+ 179, 180, 181, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 182, 183, 71, 71, 184,
+ 185, 186, 187, 188, 71, 189, 190, 191, 192, 193, 194, 195, 196, 65, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 197, 198,
+ 199, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 87, 200,
+ 34, 201, 202, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 193, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 194, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 203, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 204, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 195, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 205, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 196, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 206, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
@@ -268,861 +1076,862 @@ static unsigned char index1[] = {
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 197, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 207, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 198, 34, 199, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 34, 193, 34, 34, 199, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 200, 17, 201, 202, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 203, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 125, 125, 203,
+ 34, 34, 34, 34, 208, 34, 209, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 34, 203, 34, 34, 209, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 210, 71, 211, 212, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 213, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 213,
};
-static unsigned char index2[] = {
+static unsigned short index2[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 3, 3, 3, 2, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 5, 5, 5, 5, 5, 5, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 5, 5, 5, 5, 17, 5, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 5, 5,
- 5, 5, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19, 5, 5,
- 1, 5, 5, 5, 5, 20, 21, 5, 22, 5, 17, 5, 23, 19, 5, 24, 24, 24, 5, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 5, 16, 16, 16, 16, 16, 16, 16, 19, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 5,
- 18, 18, 18, 18, 18, 18, 18, 25, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 28, 29, 26, 27, 26, 27, 26, 27, 19, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 30, 26, 27, 26, 27, 26, 27, 31, 32, 33, 26, 27, 26, 27, 34, 26,
- 27, 35, 35, 26, 27, 19, 36, 37, 38, 26, 27, 35, 39, 40, 41, 42, 26, 27,
- 43, 19, 41, 44, 45, 46, 26, 27, 26, 27, 26, 27, 47, 26, 27, 47, 19, 19,
- 26, 27, 47, 26, 27, 48, 48, 26, 27, 26, 27, 49, 26, 27, 19, 50, 26, 27,
- 19, 51, 50, 50, 50, 50, 52, 53, 54, 52, 53, 54, 52, 53, 54, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 55, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 52, 53, 54,
- 26, 27, 56, 57, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 58, 19, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 19, 19, 19, 19, 19, 59, 26,
- 27, 60, 61, 62, 62, 26, 27, 63, 64, 65, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 66, 67, 68, 69, 70, 19, 71, 71, 19, 72, 19, 73, 19, 19, 19, 19,
- 71, 19, 19, 74, 19, 75, 19, 19, 76, 77, 19, 78, 19, 19, 19, 77, 19, 79,
- 80, 19, 19, 81, 19, 19, 19, 19, 19, 19, 19, 82, 19, 19, 83, 19, 19, 83,
- 19, 19, 19, 19, 83, 84, 85, 85, 86, 19, 19, 19, 19, 19, 87, 19, 50, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 50, 50, 50,
- 50, 50, 5, 5, 5, 5, 5, 5, 5, 50, 5, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 1, 1, 1, 1, 3, 3, 3, 2, 4, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 6, 5,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, 5, 5, 5, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 88, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 26, 27, 26, 27, 50, 5, 26, 27, 0, 0, 89,
- 45, 45, 45, 5, 0, 0, 0, 0, 0, 5, 5, 90, 17, 91, 91, 91, 0, 92, 0, 93, 93,
- 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 94, 95, 95, 95, 19, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 96, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 97, 98, 98, 99, 100, 101, 102, 102, 102, 103,
- 104, 105, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 106, 107, 108, 19, 109, 110, 5, 26, 27,
- 111, 26, 27, 19, 58, 58, 58, 112, 112, 112, 112, 112, 112, 112, 112, 112,
- 112, 112, 112, 112, 112, 112, 112, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 5, 17, 17, 17, 17, 17, 5, 5, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 113, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 114, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 0, 0, 50, 5, 5, 5, 5, 5, 5, 0, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 19, 0, 5, 5, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 5, 17, 5, 17, 17, 5, 17, 17, 5, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 50, 50, 50, 5, 5,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 5, 0, 0, 5, 5, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 5, 5, 5, 5, 50, 50, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 50, 17,
- 17, 17, 17, 17, 17, 17, 1, 5, 17, 17, 17, 17, 17, 17, 50, 50, 17, 17, 5,
- 17, 17, 17, 17, 50, 50, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 50, 50, 50,
- 5, 5, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 1, 50, 17, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 50, 50, 5, 5, 5, 5, 50, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17,
- 17, 17, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50, 17, 17, 17, 50, 17,
- 17, 17, 17, 17, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 17, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 50, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50, 17, 17, 17,
- 17, 17, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 5, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 50, 50, 50, 50, 50, 50, 50, 0, 50,
- 50, 50, 50, 50, 50, 50, 0, 17, 17, 17, 0, 50, 50, 50, 50, 50, 50, 50, 50,
- 0, 0, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50,
- 0, 0, 0, 50, 50, 50, 50, 0, 0, 17, 50, 17, 17, 17, 17, 17, 17, 17, 0, 0,
- 17, 17, 0, 0, 17, 17, 17, 50, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 50,
- 50, 0, 50, 50, 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 50,
- 50, 5, 5, 24, 24, 24, 24, 24, 24, 5, 5, 0, 0, 0, 0, 0, 17, 17, 17, 0, 50,
- 50, 50, 50, 50, 50, 0, 0, 0, 0, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50,
- 50, 50, 50, 50, 50, 0, 50, 50, 0, 50, 50, 0, 50, 50, 0, 0, 17, 0, 17, 17,
- 17, 17, 17, 0, 0, 0, 0, 17, 17, 0, 0, 17, 17, 17, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 50, 50, 50, 50, 0, 50, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 17, 17, 50, 50, 50, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 17, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 0, 50, 50, 50,
- 50, 50, 0, 0, 17, 50, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0,
- 17, 17, 17, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,
- 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 50, 50, 50, 50, 50, 50,
- 50, 50, 0, 0, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50,
- 50, 0, 50, 50, 0, 50, 50, 50, 50, 50, 0, 0, 17, 50, 17, 17, 17, 17, 17,
- 17, 17, 0, 0, 17, 17, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17,
- 0, 0, 0, 0, 50, 50, 0, 50, 50, 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 5, 50, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 50, 0, 50, 50, 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 0, 50, 50, 50,
- 50, 0, 0, 0, 50, 50, 0, 50, 0, 50, 50, 0, 0, 0, 50, 50, 0, 0, 0, 50, 50,
- 50, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0,
- 17, 17, 17, 17, 17, 0, 0, 0, 17, 17, 17, 0, 17, 17, 17, 17, 0, 0, 50, 0,
- 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 24, 24, 24, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
- 0, 0, 17, 17, 17, 0, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50,
- 50, 50, 50, 0, 0, 0, 50, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0,
- 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 17, 0, 50, 50, 0, 0, 0, 0, 0, 0,
- 50, 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0,
- 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 5, 0, 0, 17, 17, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 0, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 0, 0, 17, 50, 17, 17, 17,
- 17, 17, 17, 17, 0, 17, 17, 17, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 0, 0, 0, 0, 0, 0, 0, 50, 0, 50, 50, 17, 17, 0, 0, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 0, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 0, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 0, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 0, 50, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 17,
- 17, 17, 17, 50, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 50,
- 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 24, 24, 24, 24,
- 24, 0, 0, 0, 5, 50, 50, 50, 50, 50, 50, 0, 0, 17, 17, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 0, 0, 0, 17, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17,
- 0, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 50, 117, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 0, 0, 5, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17,
- 17, 17, 17, 17, 17, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 5, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 0, 50, 0, 0, 50, 50, 0, 50, 0, 0,
- 50, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0,
- 50, 50, 50, 0, 50, 0, 50, 0, 0, 50, 50, 0, 50, 50, 50, 50, 17, 50, 117,
- 17, 17, 17, 17, 17, 17, 0, 17, 17, 50, 0, 0, 50, 50, 50, 50, 50, 0, 50,
- 0, 17, 17, 17, 17, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0,
- 0, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17, 5, 5, 5, 5, 5, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 5, 17,
- 5, 17, 5, 17, 5, 5, 5, 5, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0,
- 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 5, 17, 17, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 0, 5, 5, 5, 5, 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 0,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 5, 5, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 50, 50,
- 50, 50, 17, 17, 17, 50, 17, 17, 17, 50, 50, 17, 17, 17, 17, 17, 17, 17,
- 50, 50, 50, 17, 17, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50, 17, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 17, 17, 17, 17, 5, 5, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
- 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 5, 50, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 0, 0, 50, 50,
- 50, 50, 50, 50, 50, 0, 50, 0, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 0, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50,
- 0, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 17, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 119, 120, 121, 122, 123, 124, 125, 126, 127, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 2, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 0, 0, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 5, 5, 5, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50,
- 50, 50, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 5, 5, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 0, 17, 17,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 1, 1, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 5, 5, 5, 50, 5, 5, 5, 5, 50, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0,
- 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17, 17, 2, 0, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 17, 50, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 119, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 17, 17, 17, 17, 17, 0, 0, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0,
- 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 50, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 17, 17, 17,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 0, 50, 50, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0,
- 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 5, 5, 5, 5,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 50, 50, 50, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 5, 17,
+ 17, 17, 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 5,
+ 5, 5, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 6, 5, 20, 5, 5,
+ 21, 5, 6, 5, 5, 22, 23, 6, 24, 5, 25, 6, 26, 20, 5, 27, 27, 27, 5, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 50, 50, 50, 50, 17, 50, 50, 50, 50, 17, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 17, 17, 17, 17, 5, 17, 17, 17, 17, 17, 17, 17, 28, 19, 19, 19, 19, 19,
19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 50, 129,
- 19, 19, 19, 130, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
- 17, 17, 17, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 19, 19, 19, 19, 131, 19, 19, 132,
- 19, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 133, 133, 133, 133, 133, 133, 133, 133, 134,
- 134, 134, 134, 134, 134, 134, 134, 133, 133, 133, 133, 133, 133, 0, 0,
- 134, 134, 134, 134, 134, 134, 0, 0, 133, 133, 133, 133, 133, 133, 133,
- 133, 134, 134, 134, 134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
- 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
- 133, 133, 133, 0, 0, 134, 134, 134, 134, 134, 134, 0, 0, 19, 133, 19,
- 133, 19, 133, 19, 133, 0, 134, 0, 134, 0, 134, 0, 134, 133, 133, 133,
- 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 135,
- 135, 136, 136, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 0, 0,
- 133, 133, 133, 133, 133, 133, 133, 133, 141, 141, 141, 141, 141, 141,
- 141, 141, 133, 133, 133, 133, 133, 133, 133, 133, 141, 141, 141, 141,
- 141, 141, 141, 141, 133, 133, 133, 133, 133, 133, 133, 133, 141, 141,
- 141, 141, 141, 141, 141, 141, 133, 133, 19, 142, 19, 0, 19, 19, 134, 134,
- 143, 143, 144, 5, 145, 5, 5, 5, 19, 142, 19, 0, 19, 19, 146, 146, 146,
- 146, 144, 5, 5, 5, 133, 133, 19, 19, 0, 0, 19, 19, 134, 134, 147, 147, 0,
- 5, 5, 5, 133, 133, 19, 19, 19, 108, 19, 19, 134, 134, 148, 148, 111, 5,
- 5, 5, 0, 0, 19, 142, 19, 0, 19, 19, 149, 149, 150, 150, 144, 5, 5, 0, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 1, 1, 1, 1, 1, 2, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 1,
- 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 151, 50, 0, 0, 152, 153,
- 154, 155, 156, 157, 5, 5, 5, 5, 5, 50, 151, 23, 20, 21, 152, 153, 154,
- 155, 156, 157, 5, 5, 5, 5, 5, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 5, 5, 5, 5, 17, 5, 5, 5, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 102, 5, 5, 5, 5, 102,
- 5, 5, 19, 102, 102, 102, 19, 19, 102, 102, 102, 19, 5, 102, 5, 5, 158,
- 102, 102, 102, 102, 102, 5, 5, 5, 5, 5, 5, 102, 5, 159, 5, 102, 5, 160,
- 161, 102, 102, 158, 19, 102, 102, 162, 102, 19, 50, 50, 50, 50, 19, 5, 5,
- 19, 19, 102, 102, 5, 5, 5, 5, 5, 102, 19, 19, 19, 19, 5, 5, 5, 5, 163, 5,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
- 165, 165, 128, 128, 128, 26, 27, 128, 128, 128, 128, 24, 0, 0, 0, 0, 0,
- 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 19, 19, 19, 19, 19, 19, 19, 29, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 32, 33, 30, 31, 30, 31, 30, 31, 20, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 34, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 35, 30, 31, 30, 31, 30, 31, 36, 37, 38, 30, 31, 30, 31, 39,
+ 30, 31, 40, 40, 30, 31, 20, 41, 42, 43, 30, 31, 40, 44, 45, 46, 47, 30,
+ 31, 48, 20, 46, 49, 50, 51, 30, 31, 30, 31, 30, 31, 52, 30, 31, 52, 20,
+ 20, 30, 31, 52, 30, 31, 53, 53, 30, 31, 30, 31, 54, 30, 31, 20, 55, 30,
+ 31, 20, 56, 55, 55, 55, 55, 57, 58, 59, 57, 58, 59, 57, 58, 59, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 60, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 61, 57, 58,
+ 59, 30, 31, 62, 63, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 64, 20, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 20, 20, 20, 20, 65,
+ 30, 31, 66, 67, 68, 68, 30, 31, 69, 70, 71, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 72, 73, 74, 75, 76, 20, 77, 77, 20, 78, 20, 79, 20, 20, 20,
+ 20, 77, 20, 20, 80, 20, 81, 82, 20, 83, 84, 20, 85, 20, 20, 20, 84, 20,
+ 86, 87, 20, 20, 88, 20, 20, 20, 20, 20, 20, 20, 89, 20, 20, 90, 20, 20,
+ 90, 20, 20, 20, 20, 90, 91, 92, 92, 93, 20, 20, 20, 20, 20, 94, 20, 55,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 96, 96, 96, 96, 96, 96, 96, 95, 95, 6, 6, 6, 6, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 95, 95,
+ 95, 95, 95, 6, 6, 6, 6, 6, 6, 6, 96, 6, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 97, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 31, 30, 31, 96, 6, 30, 31, 0, 0,
+ 98, 50, 50, 50, 5, 0, 0, 0, 0, 0, 6, 6, 99, 25, 100, 100, 100, 0, 101, 0,
+ 102, 102, 103, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 104, 105, 105, 105,
+ 106, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 107, 19, 19, 19, 19, 19, 19, 19, 19, 19, 108, 109, 109, 110, 111, 112,
+ 113, 113, 113, 114, 115, 116, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 117, 118, 119, 20,
+ 120, 121, 5, 30, 31, 122, 30, 31, 20, 64, 64, 64, 123, 123, 123, 123,
+ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+ 124, 124, 124, 124, 124, 124, 124, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 5, 25, 25, 25, 25, 25, 6, 6, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 125, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 126, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 96, 5, 5, 5, 5, 5, 5,
+ 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 0, 5, 5, 0, 0, 0,
+ 0, 5, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 25, 5, 25, 25, 5, 25, 25,
+ 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0,
+ 0, 0, 0, 55, 55, 55, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21,
+ 21, 21, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 5, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 55, 25, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 5, 55, 25, 25, 25, 25, 25, 25, 25, 21, 5, 25, 25, 25,
+ 25, 25, 25, 96, 96, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 55, 55, 55, 5, 5, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 0, 21, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 96, 96, 5, 5, 5, 5, 96,
+ 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 96, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 96, 25, 25, 25, 96, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25,
+ 25, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 55, 18, 18, 18,
+ 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25,
+ 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 96, 55, 55, 55, 55, 55, 55, 0,
+ 55, 55, 55, 55, 55, 55, 55, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55,
+ 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0,
+ 55, 0, 0, 0, 55, 55, 55, 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0,
+ 0, 18, 18, 0, 0, 18, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+ 55, 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 55, 55, 5, 5, 27, 27, 27, 27, 27, 27, 5, 5, 0, 0, 0, 0, 0, 25, 25, 18, 0,
+ 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55,
+ 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 0, 0, 25, 0, 18,
+ 18, 18, 25, 25, 0, 0, 0, 0, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 25, 0, 0,
+ 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 25, 25, 55, 55, 55, 25, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 25, 25, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55,
+ 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55,
+ 55, 55, 55, 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 0, 25, 25,
+ 18, 0, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55,
+ 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55,
+ 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, 25,
+ 25, 25, 25, 0, 0, 18, 18, 0, 0, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+ 18, 0, 0, 0, 0, 55, 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 5, 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 25, 55, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55,
+ 55, 0, 0, 0, 55, 55, 0, 55, 0, 55, 55, 0, 0, 0, 55, 55, 0, 0, 0, 55, 55,
+ 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0,
+ 18, 18, 25, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0,
+ 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 18, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55,
+ 55, 55, 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0,
+ 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 0, 0, 0, 0, 0, 0,
+ 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 5, 0, 0, 18, 18, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18,
+ 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0,
+ 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 0, 55, 18, 18, 18, 25, 25, 25, 25, 0, 18, 18, 18, 0,
+ 18, 18, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27,
+ 27, 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 0, 0, 18, 18, 0, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0,
+ 0, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 0, 0, 0, 0, 18, 18, 18, 25,
+ 25, 25, 0, 25, 0, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 130, 25, 25,
+ 25, 25, 25, 25, 25, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 96, 25, 25,
+ 25, 25, 25, 25, 25, 25, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0, 55, 0, 0, 55, 55, 0, 55,
+ 0, 0, 55, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55,
+ 55, 0, 55, 55, 55, 0, 55, 0, 55, 0, 0, 55, 55, 0, 55, 55, 55, 55, 25, 55,
+ 130, 25, 25, 25, 25, 25, 25, 0, 25, 25, 55, 0, 0, 55, 55, 55, 55, 55, 0,
+ 96, 0, 25, 25, 25, 25, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 5, 5, 5, 5, 5, 5, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 5, 25, 5, 25, 5, 25, 5, 5, 5, 5, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55,
+ 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 18, 25, 25, 25, 25, 25, 5, 25, 25, 55, 55, 55, 55, 55, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5,
+ 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25, 25, 25, 18,
+ 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, 18, 25, 25, 55, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 18, 18, 25,
+ 25, 55, 55, 55, 55, 25, 25, 25, 55, 18, 18, 18, 55, 55, 18, 18, 18, 18,
+ 18, 18, 18, 55, 55, 55, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 25, 18, 18, 25, 25, 18, 18, 18, 18, 18, 18, 25, 55,
+ 18, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 18, 18, 25, 5, 5, 131, 131,
+ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+ 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 0, 0, 0, 0, 0, 131, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 5, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55,
+ 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55,
+ 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 132, 133, 134, 135, 136, 137, 138, 139, 140, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
+ 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 2, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 5, 5, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 0, 55, 55, 55, 55, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25,
+ 25, 25, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55,
+ 55, 55, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 25, 25, 25,
+ 25, 25, 25, 25, 18, 18, 18, 18, 18, 18, 18, 18, 25, 18, 18, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 96, 5, 5, 5, 5, 55, 25, 0, 0, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 25, 25, 25, 2, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 0, 0, 0, 0, 0, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 25, 25,
+ 18, 18, 18, 18, 25, 25, 18, 18, 18, 0, 0, 0, 0, 18, 18, 25, 18, 18, 18,
+ 18, 18, 18, 25, 25, 25, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 55, 55, 55, 55, 55, 55, 55, 18, 18, 0, 0, 0, 0, 0, 0,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 132, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 18, 0, 0, 5, 5, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 18, 25,
+ 25, 25, 25, 25, 25, 25, 0, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25,
+ 25, 25, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 96, 5,
+ 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 18, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, 25, 25, 18, 25,
+ 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 18, 18, 55, 55, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25,
+ 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5,
+ 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18,
+ 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 96, 96, 96, 96, 96, 96, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55,
+ 55, 18, 18, 25, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 95, 142, 20, 20, 20, 143, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 144,
+ 145, 146, 147, 148, 149, 20, 20, 150, 20, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 151, 151,
+ 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152,
+ 151, 151, 151, 151, 151, 151, 0, 0, 152, 152, 152, 152, 152, 152, 0, 0,
+ 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152,
+ 152, 152, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152,
+ 152, 152, 152, 152, 151, 151, 151, 151, 151, 151, 0, 0, 152, 152, 152,
+ 152, 152, 152, 0, 0, 153, 151, 154, 151, 155, 151, 156, 151, 0, 152, 0,
+ 152, 0, 152, 0, 152, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152,
+ 152, 152, 152, 152, 152, 152, 157, 157, 158, 158, 158, 158, 159, 159,
+ 160, 160, 161, 161, 162, 162, 0, 0, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197,
+ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 151,
+ 151, 211, 212, 213, 0, 214, 215, 152, 152, 216, 216, 217, 6, 218, 6, 6,
+ 6, 219, 220, 221, 0, 222, 223, 224, 224, 224, 224, 225, 6, 6, 6, 151,
+ 151, 226, 227, 0, 0, 228, 229, 152, 152, 230, 230, 0, 6, 6, 6, 151, 151,
+ 231, 232, 233, 119, 234, 235, 152, 152, 236, 236, 122, 6, 6, 6, 0, 0,
+ 237, 238, 239, 0, 240, 241, 242, 242, 243, 243, 244, 6, 6, 0, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21,
+ 21, 21, 21, 21, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 245, 95, 0, 0,
+ 246, 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 95, 245, 26, 22, 23, 246,
+ 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 0, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 95, 95, 95, 95, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 113, 5, 5,
+ 5, 5, 113, 5, 5, 20, 113, 113, 113, 20, 20, 113, 113, 113, 20, 5, 113, 5,
+ 5, 252, 113, 113, 113, 113, 113, 5, 5, 5, 5, 5, 5, 113, 5, 253, 5, 113,
+ 5, 254, 255, 113, 113, 252, 20, 113, 113, 256, 113, 20, 55, 55, 55, 55,
+ 20, 5, 5, 20, 20, 113, 113, 5, 5, 5, 5, 5, 113, 20, 20, 20, 20, 5, 5, 5,
+ 5, 257, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+ 258, 258, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 141, 141, 141, 30, 31, 141, 141, 141, 141, 27, 0, 0,
+ 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -1135,632 +1944,685 @@ static unsigned char index2[] = {
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 20, 21, 152, 153, 154, 155, 156, 157, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 20, 21, 152, 153, 154, 155,
- 156, 157, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 20, 21, 152,
- 153, 154, 155, 156, 157, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
- 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
- 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 151, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 23, 20, 21, 152, 153, 154, 155, 156, 157, 24,
- 151, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248, 249, 250,
+ 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 246, 247,
+ 248, 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22,
+ 23, 246, 247, 248, 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260,
+ 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 245, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27,
+ 245, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26,
+ 22, 23, 246, 247, 248, 249, 250, 251, 27, 26, 22, 23, 246, 247, 248, 249,
+ 250, 251, 27, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 23,
- 20, 21, 152, 153, 154, 155, 156, 157, 24, 23, 20, 21, 152, 153, 154, 155,
- 156, 157, 24, 23, 20, 21, 152, 153, 154, 155, 156, 157, 24, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 0, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0,
- 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
- 116, 116, 116, 116, 116, 0, 26, 27, 168, 169, 170, 171, 172, 26, 27, 26,
- 27, 26, 27, 173, 174, 175, 176, 19, 26, 27, 19, 26, 27, 19, 19, 19, 19,
- 19, 19, 50, 177, 177, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 5, 5, 5,
- 5, 5, 5, 26, 27, 26, 27, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 24,
- 5, 5, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
- 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
- 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50,
- 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50,
- 0, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50,
- 50, 50, 50, 50, 50, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 89, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 30, 31, 262, 263,
+ 264, 265, 266, 30, 31, 30, 31, 30, 31, 267, 268, 269, 270, 20, 30, 31,
+ 20, 30, 31, 20, 20, 20, 20, 20, 95, 95, 271, 271, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 20, 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31,
+ 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 272, 272, 272, 272, 272, 272, 272,
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
+ 272, 272, 272, 0, 272, 0, 0, 0, 0, 0, 272, 0, 0, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0,
+ 0, 96, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55,
+ 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55,
+ 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55,
+ 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 273, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0,
- 0, 0, 2, 5, 5, 5, 5, 50, 50, 128, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 17, 17, 17, 17, 17, 17, 5, 50, 50, 50, 50, 50, 5, 5, 128, 128,
- 128, 50, 50, 5, 5, 5, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 0, 0, 17, 17, 5, 5, 50, 50, 50, 5, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 50, 50, 50, 50, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 5, 5, 24, 24, 24, 24,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,
- 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 0, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 179, 50, 50, 179,
- 50, 50, 50, 179, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50,
- 179, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 179, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 179, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 179,
- 179, 179, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 179, 179, 179, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 179, 179, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 50, 17, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 17, 5, 50, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26,
- 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 17, 17, 5, 5, 5, 5, 5, 5, 0, 0,
- 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 19, 19, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 50, 19, 19, 19, 19, 19, 19, 19, 19, 26, 27, 26, 27, 180, 26, 27,
- 26, 27, 26, 27, 26, 27, 26, 27, 50, 5, 5, 26, 27, 181, 19, 0, 26, 27, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 26, 27, 26, 27, 26, 27,
- 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 50, 50, 50, 50, 50, 50, 50, 17, 50, 50,
- 50, 17, 50, 50, 50, 50, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 5, 5,
- 5, 5, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 5,
- 5, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 50, 50, 50, 50, 50, 50, 5, 5, 5, 50, 0, 0, 0,
- 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 5, 5, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 17, 17, 17, 17,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 50,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 17, 50, 50, 50, 50, 50,
- 50, 50, 50, 17, 17, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 5, 5,
- 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 5, 5, 5, 50, 17, 0, 0, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 17, 50, 17, 17, 17, 50, 50, 17, 17, 50, 50,
- 50, 50, 50, 17, 17, 50, 17, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50,
- 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 0,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 5, 17, 17, 0, 0,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 96, 55, 141, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 25, 25, 25, 25, 18, 18, 5, 96,
+ 96, 96, 96, 96, 5, 5, 141, 141, 141, 96, 55, 5, 5, 5, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 96, 96, 55,
+ 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 5, 96, 96, 96, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55,
+ 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 274, 55, 55, 274, 55, 55, 55, 274, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 274, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55,
+ 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 274, 274, 55, 55,
+ 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 274, 274, 274,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55,
+ 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 274, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 274, 274, 274, 55, 274, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 274, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55,
+ 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 96, 96, 96, 96, 96, 96, 5, 5, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 96, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, 5, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 5, 96, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 25, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 96, 96, 96, 96, 96, 96, 96, 96, 96, 6, 6, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 95, 20, 20, 20, 20, 20, 20, 20, 20, 30, 31, 30, 31, 275, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 96, 6, 6, 30, 31, 276, 20, 0, 30, 31, 30,
+ 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 95, 20, 55, 55, 55, 55, 55, 55, 55, 25,
+ 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25,
+ 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0,
+ 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55,
+ 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25,
+ 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 25,
+ 25, 25, 25, 18, 18, 25, 18, 18, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 0, 96, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25,
+ 25, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 25, 55, 55,
+ 55, 55, 55, 55, 55, 55, 25, 18, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, 18, 0, 0, 0, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 25, 25, 25, 55, 55,
+ 25, 25, 55, 55, 55, 55, 55, 25, 25, 55, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 96, 5, 5, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 18, 18, 5, 5, 55, 96, 96,
+ 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55,
+ 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25,
+ 18, 18, 25, 18, 18, 5, 18, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 179, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19,
- 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0,
- 0, 50, 17, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 0, 50, 0, 50, 50,
- 0, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 89, 89, 89, 89, 89, 89, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 89, 89, 5, 5, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 17,
- 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 17, 17, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17,
- 17, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 0, 5, 5, 5, 5, 0, 0, 0, 0, 89, 50, 89, 50, 89, 0, 89, 50, 89, 50, 89, 50,
- 89, 50, 89, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 0, 0, 1, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 5, 5, 5, 5, 5, 5, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 5, 5, 5, 5, 17, 5, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 117, 117, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50,
- 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50, 0, 0, 0, 5,
- 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 5, 5, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0,
- 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 24, 24, 24, 24, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 0, 0, 0, 0, 0, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 0, 0, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 24, 24, 24, 24, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 128, 50, 50, 50, 50, 50, 50, 50, 50, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 5, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,
- 0, 50, 50, 50, 50, 50, 50, 50, 50, 5, 128, 128, 128, 128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 182, 182, 182, 182,
- 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
- 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
- 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183,
- 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
- 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
- 183, 183, 183, 183, 183, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50,
- 50, 50, 0, 0, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 0, 0, 0,
- 50, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 5, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 24, 24, 24, 24, 24, 24, 0, 0, 0, 5, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 50, 17, 17, 17, 0, 17, 17, 0, 0, 0, 0, 0, 17, 17,
- 17, 17, 50, 50, 50, 50, 0, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 17, 23, 20, 21, 152, 24, 24, 24,
- 24, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
- 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 24, 24, 5, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 5,
- 5, 5, 5, 5, 5, 5, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 20, 21, 152, 153, 154, 155, 156, 157, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 17, 17, 17,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 5, 5, 5,
- 5, 0, 0, 0, 0, 23, 20, 21, 152, 153, 154, 155, 156, 157, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 5, 5, 1, 5,
- 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55,
+ 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 274, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 278, 279, 280, 281, 282, 283, 284, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 285, 286, 287, 288, 289, 0, 0, 0, 0, 0, 55, 25, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 0, 55, 55, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 290, 290, 290, 290, 290, 290, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 290, 290, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 25, 25,
+ 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 18, 18, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18,
+ 18, 5, 5, 6, 0, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 0, 5, 5, 5, 5, 0, 0, 0, 0, 290, 55, 290, 55, 290, 0, 290, 55, 290, 55,
+ 290, 55, 290, 55, 290, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 0, 0, 21, 0, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5,
+ 5, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, 5, 5, 5, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 291, 291, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0,
+ 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55,
+ 55, 0, 0, 0, 5, 5, 5, 6, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 21, 21, 21, 5, 5, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0,
+ 0, 0, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 27, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 0, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 141, 55, 55, 55,
+ 55, 55, 55, 55, 55, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 5, 141,
+ 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
+ 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 0, 55, 55, 0, 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 27, 27, 27,
+ 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27,
+ 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 158, 158, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 158, 158, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 55,
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 0, 25,
+ 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 25, 25, 0, 0, 0, 0, 25,
+ 26, 22, 23, 246, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 27, 27, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27,
+ 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27,
+ 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 0, 18, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248,
+ 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25,
+ 25, 18, 18, 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25,
+ 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25,
+ 25, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 252, 252, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 252, 252, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+ 25, 25, 25, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1775,272 +2637,286 @@ static unsigned char index2[] = {
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17, 17, 17, 17,
- 5, 5, 5, 17, 17, 17, 17, 17, 17, 1, 1, 1, 1, 1, 1, 1, 1, 17, 17, 17, 17,
- 17, 17, 17, 17, 5, 5, 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 17,
- 17, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25,
+ 5, 5, 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25,
+ 25, 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 17, 17, 17, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 102, 0, 102, 102, 0, 0, 102, 0, 0, 102, 102, 0, 0,
- 102, 102, 102, 102, 0, 102, 102, 102, 102, 102, 102, 102, 102, 19, 19,
- 19, 19, 0, 19, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 0, 102, 102, 102, 102,
- 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 0, 102, 102, 102, 102, 102,
- 102, 102, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 0, 102, 102, 102,
- 102, 0, 102, 102, 102, 102, 102, 0, 102, 0, 0, 0, 102, 102, 102, 102,
- 102, 102, 102, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 5, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 19, 19, 19, 19, 19, 19,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 5, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 5, 19, 19, 19, 19, 19, 19, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 5, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 19, 19, 19, 19,
- 19, 19, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 5, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 5, 19, 19, 19, 19, 19, 19, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 102, 102, 5, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 19, 19,
- 19, 19, 19, 19, 102, 19, 0, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20,
+ 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 0, 113, 113, 0, 0, 113, 0, 0,
+ 113, 113, 0, 0, 113, 113, 113, 113, 0, 113, 113, 113, 113, 113, 113, 113,
+ 113, 20, 20, 20, 20, 0, 20, 0, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 0, 113,
+ 113, 113, 113, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 0, 113, 113,
+ 113, 113, 113, 113, 113, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 0,
+ 113, 113, 113, 113, 0, 113, 113, 113, 113, 113, 0, 113, 0, 0, 0, 113,
+ 113, 113, 113, 113, 113, 113, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20,
+ 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 5, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20,
+ 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 5,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 5, 20, 20, 20, 20, 20, 20, 113, 20, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55,
+ 55, 0, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55,
+ 55, 55, 55, 0, 55, 0, 55, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 55, 0, 55, 0,
+ 55, 0, 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 0, 55, 0, 55, 0,
+ 55, 0, 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55,
+ 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 151, 23, 20, 21, 152, 153,
- 154, 155, 156, 157, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 26, 22, 23, 246, 247, 248, 249,
+ 250, 251, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5,
+ 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5,
- 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5,
+ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0,
+ 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 0, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 0, 5, 0, 5, 0, 5,
- 5, 5, 0, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 5, 0, 0, 5, 5, 5, 5, 0,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179,
- 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 179, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 179, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55,
+ 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
};
/* Returns the numeric value as double for Unicode characters
@@ -2100,6 +2976,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x1018A:
case 0x104A0:
case 0x11066:
+ case 0x110F0:
+ case 0x11136:
+ case 0x111D0:
+ case 0x116C0:
case 0x1D7CE:
case 0x1D7D8:
case 0x1D7E2:
@@ -2187,6 +3067,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E60:
case 0x11052:
case 0x11067:
+ case 0x110F1:
+ case 0x11137:
+ case 0x111D1:
+ case 0x116C1:
case 0x12415:
case 0x1241E:
case 0x1242C:
@@ -2263,6 +3147,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x2793:
case 0x3038:
case 0x3229:
+ case 0x3248:
case 0x3289:
case 0x4EC0:
case 0x5341:
@@ -2483,6 +3368,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E61:
case 0x11053:
case 0x11068:
+ case 0x110F2:
+ case 0x11138:
+ case 0x111D2:
+ case 0x116C2:
case 0x12400:
case 0x12416:
case 0x1241F:
@@ -2515,6 +3404,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x249B:
case 0x24F4:
case 0x3039:
+ case 0x3249:
case 0x5344:
case 0x5EFF:
case 0x10111:
@@ -2626,6 +3516,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E62:
case 0x11054:
case 0x11069:
+ case 0x110F3:
+ case 0x11139:
+ case 0x111D3:
+ case 0x116C3:
case 0x12401:
case 0x12408:
case 0x12417:
@@ -2671,6 +3565,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
return (double) 3.0/8.0;
case 0x1374:
case 0x303A:
+ case 0x324A:
case 0x325A:
case 0x5345:
case 0x10112:
@@ -2770,6 +3665,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E63:
case 0x11055:
case 0x1106A:
+ case 0x110F4:
+ case 0x1113A:
+ case 0x111D4:
+ case 0x116C4:
case 0x12402:
case 0x12409:
case 0x1240F:
@@ -2799,6 +3698,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x2158:
return (double) 4.0/5.0;
case 0x1375:
+ case 0x324B:
case 0x32B5:
case 0x534C:
case 0x10113:
@@ -2900,6 +3800,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E64:
case 0x11056:
case 0x1106B:
+ case 0x110F5:
+ case 0x1113B:
+ case 0x111D5:
+ case 0x116C5:
case 0x12403:
case 0x1240A:
case 0x12410:
@@ -2931,6 +3835,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x216C:
case 0x217C:
case 0x2186:
+ case 0x324C:
case 0x32BF:
case 0x10114:
case 0x10144:
@@ -3034,6 +3939,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E65:
case 0x11057:
case 0x1106C:
+ case 0x110F6:
+ case 0x1113C:
+ case 0x111D6:
+ case 0x116C6:
case 0x12404:
case 0x1240B:
case 0x12411:
@@ -3051,6 +3960,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x20AEA:
return (double) 6.0;
case 0x1377:
+ case 0x324D:
case 0x10115:
case 0x10E6E:
case 0x11060:
@@ -3124,6 +4034,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E66:
case 0x11058:
case 0x1106D:
+ case 0x110F7:
+ case 0x1113D:
+ case 0x111D7:
+ case 0x116C7:
case 0x12405:
case 0x1240C:
case 0x12412:
@@ -3146,6 +4060,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x215E:
return (double) 7.0/8.0;
case 0x1378:
+ case 0x324E:
case 0x10116:
case 0x10E6F:
case 0x11061:
@@ -3217,6 +4132,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E67:
case 0x11059:
case 0x1106E:
+ case 0x110F8:
+ case 0x1113E:
+ case 0x111D8:
+ case 0x116C8:
case 0x12406:
case 0x1240D:
case 0x12413:
@@ -3233,6 +4152,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x1F109:
return (double) 8.0;
case 0x1379:
+ case 0x324F:
case 0x10117:
case 0x10E70:
case 0x11062:
@@ -3305,6 +4225,10 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch)
case 0x10E68:
case 0x1105A:
case 0x1106F:
+ case 0x110F9:
+ case 0x1113F:
+ case 0x111D9:
+ case 0x116C9:
case 0x12407:
case 0x1240E:
case 0x12414:
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index 13323cf..e07adb2 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -156,28 +156,32 @@ weakref_hash(PyWeakReference *self)
static PyObject *
weakref_repr(PyWeakReference *self)
{
- char buffer[256];
- if (PyWeakref_GET_OBJECT(self) == Py_None) {
- PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %p; dead>", self);
+ PyObject *name, *repr;
+ _Py_IDENTIFIER(__name__);
+
+ if (PyWeakref_GET_OBJECT(self) == Py_None)
+ return PyUnicode_FromFormat("<weakref at %p; dead>", self);
+
+ name = _PyObject_GetAttrId(PyWeakref_GET_OBJECT(self), &PyId___name__);
+ if (name == NULL || !PyUnicode_Check(name)) {
+ if (name == NULL)
+ PyErr_Clear();
+ repr = PyUnicode_FromFormat(
+ "<weakref at %p; to '%s' at %p>",
+ self,
+ Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
+ PyWeakref_GET_OBJECT(self));
}
else {
- char *name = NULL;
- PyObject *nameobj = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self),
- "__name__");
- if (nameobj == NULL)
- PyErr_Clear();
- else if (PyUnicode_Check(nameobj))
- name = _PyUnicode_AsString(nameobj);
- PyOS_snprintf(buffer, sizeof(buffer),
- name ? "<weakref at %p; to '%.50s' at %p (%s)>"
- : "<weakref at %p; to '%.50s' at %p>",
- self,
- Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
- PyWeakref_GET_OBJECT(self),
- name);
- Py_XDECREF(nameobj);
+ repr = PyUnicode_FromFormat(
+ "<weakref at %p; to '%s' at %p (%U)>",
+ self,
+ Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
+ PyWeakref_GET_OBJECT(self),
+ name);
}
- return PyUnicode_FromString(buffer);
+ Py_XDECREF(name);
+ return repr;
}
/* Weak references only support equality, not ordering. Two weak references
@@ -190,8 +194,7 @@ weakref_richcompare(PyWeakReference* self, PyWeakReference* other, int op)
if ((op != Py_EQ && op != Py_NE) ||
!PyWeakref_Check(self) ||
!PyWeakref_Check(other)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
+ Py_RETURN_NOTIMPLEMENTED;
}
if (PyWeakref_GET_OBJECT(self) == Py_None
|| PyWeakref_GET_OBJECT(other) == Py_None) {
@@ -438,8 +441,9 @@ proxy_checkref(PyWeakReference *proxy)
#define WRAP_METHOD(method, special) \
static PyObject * \
method(PyObject *proxy) { \
+ _Py_IDENTIFIER(special); \
UNWRAP(proxy); \
- return PyObject_CallMethod(proxy, special, ""); \
+ return _PyObject_CallMethodId(proxy, &PyId_##special, ""); \
}
@@ -452,12 +456,11 @@ WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords)
static PyObject *
proxy_repr(PyWeakReference *proxy)
{
- char buf[160];
- PyOS_snprintf(buf, sizeof(buf),
- "<weakproxy at %p to %.100s at %p>", proxy,
- Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
- PyWeakref_GET_OBJECT(proxy));
- return PyUnicode_FromString(buf);
+ return PyUnicode_FromFormat(
+ "<weakproxy at %p to %s at %p>",
+ proxy,
+ Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
+ PyWeakref_GET_OBJECT(proxy));
}
@@ -583,7 +586,7 @@ proxy_iternext(PyWeakReference *proxy)
}
-WRAP_METHOD(proxy_bytes, "__bytes__")
+WRAP_METHOD(proxy_bytes, __bytes__)
static PyMethodDef proxy_methods[] = {
diff --git a/PC/VC6/_multiprocessing.dsp b/PC/VC6/_multiprocessing.dsp
index 2dcaf83..e1b8470 100644
--- a/PC/VC6/_multiprocessing.dsp
+++ b/PC/VC6/_multiprocessing.dsp
@@ -97,18 +97,10 @@ SOURCE=..\..\Modules\_multiprocessing\multiprocessing.c
# End Source File
# Begin Source File
-SOURCE=..\..\Modules\_multiprocessing\pipe_connection.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\Modules\_multiprocessing\semaphore.c
# End Source File
# Begin Source File
-SOURCE=..\..\Modules\_multiprocessing\socket_connection.c
-# End Source File
-# Begin Source File
-
SOURCE=..\..\Modules\_multiprocessing\win32_functions.c
# End Source File
# End Target
diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp
index 926256d..0ce98d1 100644
--- a/PC/VC6/pythoncore.dsp
+++ b/PC/VC6/pythoncore.dsp
@@ -54,7 +54,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python32.dll"
+# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python33.dll"
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "pythoncore - Win32 Debug"
@@ -82,7 +82,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python32_d.dll" /pdbtype:sept
+# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e000000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python33_d.dll" /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
!ENDIF
@@ -466,11 +466,6 @@ SOURCE=..\..\Python\import.c
# End Source File
# Begin Source File
-SOURCE=..\import_nt.c
-# ADD CPP /I "..\..\Python"
-# End Source File
-# Begin Source File
-
SOURCE=..\..\Python\importdl.c
# End Source File
# Begin Source File
diff --git a/PC/VC6/readme.txt b/PC/VC6/readme.txt
index fa1ae7d..d6ec6e6 100644
--- a/PC/VC6/readme.txt
+++ b/PC/VC6/readme.txt
@@ -12,7 +12,7 @@ and build the projects.
The proper order to build subprojects:
1) pythoncore (this builds the main Python DLL and library files,
- python32.{dll, lib} in Release mode)
+ python33.{dll, lib} in Release mode)
2) python (this builds the main Python executable,
python.exe in Release mode)
@@ -23,7 +23,7 @@ The proper order to build subprojects:
to the subsystems they implement; see SUBPROJECTS below)
When using the Debug setting, the output files have a _d added to
-their name: python32_d.dll, python_d.exe, pyexpat_d.pyd, and so on.
+their name: python33_d.dll, python_d.exe, pyexpat_d.pyd, and so on.
SUBPROJECTS
-----------
@@ -153,9 +153,9 @@ _ssl
Unpack into the "dist" directory, retaining the folder name from
the archive - for example, the latest stable OpenSSL will install as
- dist/openssl-1.0.0j
+ dist/openssl-1.0.1c
- You need to use version 1.0.0j of OpenSSL.
+ You need to use version 1.0.1c of OpenSSL.
You can install the NASM assembler from
http://www.nasm.us/
diff --git a/PC/VS7.1/pythoncore.vcproj b/PC/VS7.1/pythoncore.vcproj
index 77f7d9d..05c4184 100644
--- a/PC/VS7.1/pythoncore.vcproj
+++ b/PC/VS7.1/pythoncore.vcproj
@@ -39,15 +39,15 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python32.dll"
+ OutputFile="./python33.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
IgnoreDefaultLibraryNames="libc"
GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python32.pdb"
+ ProgramDatabaseFile=".\./python33.pdb"
SubSystem="2"
BaseAddress="0x1e000000"
- ImportLibrary=".\./python32.lib"
+ ImportLibrary=".\./python33.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
@@ -99,15 +99,15 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python32_d.dll"
+ OutputFile="./python33_d.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
IgnoreDefaultLibraryNames="libc"
GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python32_d.pdb"
+ ProgramDatabaseFile=".\./python33_d.pdb"
SubSystem="2"
BaseAddress="0x1e000000"
- ImportLibrary=".\./python32_d.lib"
+ ImportLibrary=".\./python33_d.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
@@ -166,15 +166,15 @@
Name="VCLinkerTool"
AdditionalOptions=" /MACHINE:IA64 /USELINK:MS_SDK"
AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python32.dll"
+ OutputFile="./python33.dll"
LinkIncremental="1"
SuppressStartupBanner="FALSE"
IgnoreDefaultLibraryNames="libc"
GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python32.pdb"
+ ProgramDatabaseFile=".\./python33.pdb"
SubSystem="2"
BaseAddress="0x1e000000"
- ImportLibrary=".\./python32.lib"
+ ImportLibrary=".\./python33.lib"
TargetMachine="0"/>
<Tool
Name="VCMIDLTool"/>
@@ -233,15 +233,15 @@
Name="VCLinkerTool"
AdditionalOptions=" /MACHINE:AMD64 /USELINK:MS_SDK"
AdditionalDependencies="getbuildinfo.o"
- OutputFile="./python32.dll"
+ OutputFile="./python33.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
IgnoreDefaultLibraryNames="libc"
GenerateDebugInformation="TRUE"
- ProgramDatabaseFile=".\./python32.pdb"
+ ProgramDatabaseFile=".\./python33.pdb"
SubSystem="2"
BaseAddress="0x1e000000"
- ImportLibrary=".\./python32.lib"
+ ImportLibrary=".\./python33.lib"
TargetMachine="0"/>
<Tool
Name="VCMIDLTool"/>
@@ -616,33 +616,6 @@
RelativePath="..\..\Python\import.c">
</File>
<File
- RelativePath="..\..\PC\import_nt.c">
- <FileConfiguration
- Name="Release|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Python"/>
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Python"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseItanium|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Python"/>
- </FileConfiguration>
- <FileConfiguration
- Name="ReleaseAMD64|Win32">
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\Python"/>
- </FileConfiguration>
- </File>
- <File
RelativePath="..\..\Python\importdl.c">
</File>
<File
diff --git a/PC/VS7.1/readme.txt b/PC/VS7.1/readme.txt
index 8fb069f..bfd8a70 100644
--- a/PC/VS7.1/readme.txt
+++ b/PC/VS7.1/readme.txt
@@ -12,7 +12,7 @@ the "Standard" toolbar"), and build the projects.
The proper order to build subprojects:
1) pythoncore (this builds the main Python DLL and library files,
- python26.{dll, lib} in Release mode)
+ python33.{dll, lib} in Release mode)
NOTE: in previous releases, this subproject was
named after the release number, e.g. python20.
@@ -26,7 +26,7 @@ The proper order to build subprojects:
test slave; see SUBPROJECTS below)
When using the Debug setting, the output files have a _d added to
-their name: python26_d.dll, python_d.exe, parser_d.pyd, and so on.
+their name: python33_d.dll, python_d.exe, parser_d.pyd, and so on.
SUBPROJECTS
-----------
diff --git a/PC/VS8.0/_multiprocessing.vcproj b/PC/VS8.0/_multiprocessing.vcproj
index c2bbec4..8f1cafc 100644
--- a/PC/VS8.0/_multiprocessing.vcproj
+++ b/PC/VS8.0/_multiprocessing.vcproj
@@ -522,10 +522,6 @@
RelativePath="..\..\Modules\_multiprocessing\multiprocessing.h"
>
</File>
- <File
- RelativePath="..\..\Modules\_multiprocessing\connection.h"
- >
- </File>
</Filter>
<Filter
Name="Source Files"
@@ -535,18 +531,10 @@
>
</File>
<File
- RelativePath="..\..\Modules\_multiprocessing\pipe_connection.c"
- >
- </File>
- <File
RelativePath="..\..\Modules\_multiprocessing\semaphore.c"
>
</File>
<File
- RelativePath="..\..\Modules\_multiprocessing\socket_connection.c"
- >
- </File>
- <File
RelativePath="..\..\Modules\_multiprocessing\win32_functions.c"
>
</File>
diff --git a/PC/VS8.0/build_ssl.bat b/PC/VS8.0/build_ssl.bat
index 39c1ff0..357b08b 100644
--- a/PC/VS8.0/build_ssl.bat
+++ b/PC/VS8.0/build_ssl.bat
@@ -2,10 +2,10 @@
if not defined HOST_PYTHON (
if %1 EQU Debug (
set HOST_PYTHON=python_d.exe
- if not exist python32_d.dll exit 1
+ if not exist python33_d.dll exit 1
) ELSE (
set HOST_PYTHON=python.exe
- if not exist python32.dll exit 1
+ if not exist python33.dll exit 1
)
)
%HOST_PYTHON% build_ssl.py %1 %2 %3
diff --git a/PC/VS8.0/kill_python.c b/PC/VS8.0/kill_python.c
index 6b91678..bb323d3 100644
--- a/PC/VS8.0/kill_python.c
+++ b/PC/VS8.0/kill_python.c
@@ -106,7 +106,7 @@ main(int argc, char **argv)
/*
* XXX TODO: if we really wanted to be fancy, we could check the
* modules for all processes (not just the python[_d].exe ones)
- * and see if any of our DLLs are loaded (i.e. python32[_d].dll),
+ * and see if any of our DLLs are loaded (i.e. python33[_d].dll),
* as that would also inhibit our ability to rebuild the solution.
* Not worth loosing sleep over though; for now, a simple check
* for just the python executable should be sufficient.
diff --git a/PC/VS8.0/pyproject.vsprops b/PC/VS8.0/pyproject.vsprops
index 2a82e49..f86cdec 100644
--- a/PC/VS8.0/pyproject.vsprops
+++ b/PC/VS8.0/pyproject.vsprops
@@ -38,7 +38,7 @@
/>
<UserMacro
Name="PyDllName"
- Value="python32"
+ Value="python33"
/>
<UserMacro
Name="PythonExe"
@@ -58,7 +58,7 @@
/>
<UserMacro
Name="opensslDir"
- Value="$(externalsDir)\openssl-1.0.0j"
+ Value="$(externalsDir)\openssl-1.0.1c"
/>
<UserMacro
Name="tcltkDir"
diff --git a/PC/VS8.0/pythoncore.vcproj b/PC/VS8.0/pythoncore.vcproj
index e81559e..a75bb9d 100644
--- a/PC/VS8.0/pythoncore.vcproj
+++ b/PC/VS8.0/pythoncore.vcproj
@@ -1707,10 +1707,6 @@
>
</File>
<File
- RelativePath="..\..\PC\import_nt.c"
- >
- </File>
- <File
RelativePath="..\..\PC\msvcrtmodule.c"
>
</File>
diff --git a/PCbuild/bz2.vcproj b/PC/VS9.0/_bz2.vcproj
index e2b353b..7ceb8c7 100644
--- a/PCbuild/bz2.vcproj
+++ b/PC/VS9.0/_bz2.vcproj
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
- Name="bz2"
+ Version="9.00"
+ Name="_bz2"
ProjectGUID="{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}"
RootNamespace="bz2"
Keyword="Win32Proj"
@@ -527,7 +527,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\bz2module.c"
+ RelativePath="..\..\Modules\_bz2module.c"
>
</File>
</Filter>
diff --git a/PCbuild/_ctypes.vcproj b/PC/VS9.0/_ctypes.vcproj
index 1eb8b57..8e5cba1 100644
--- a/PCbuild/_ctypes.vcproj
+++ b/PC/VS9.0/_ctypes.vcproj
@@ -42,7 +42,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -103,7 +103,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -164,7 +164,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -228,7 +228,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -291,7 +291,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -355,7 +355,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -419,7 +419,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -483,7 +483,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\_ctypes\libffi_msvc"
+ AdditionalIncludeDirectories="..\..\Modules\_ctypes\libffi_msvc"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@@ -531,27 +531,27 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\_ctypes\ctypes.h"
+ RelativePath="..\..\Modules\_ctypes\ctypes.h"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\ctypes_dlfcn.h"
+ RelativePath="..\..\Modules\_ctypes\ctypes_dlfcn.h"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\ffi.h"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\ffi.h"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\ffi_common.h"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\ffi_common.h"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\fficonfig.h"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\fficonfig.h"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\ffitarget.h"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\ffitarget.h"
>
</File>
</Filter>
@@ -559,39 +559,39 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_ctypes\_ctypes.c"
+ RelativePath="..\..\Modules\_ctypes\_ctypes.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\callbacks.c"
+ RelativePath="..\..\Modules\_ctypes\callbacks.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\callproc.c"
+ RelativePath="..\..\Modules\_ctypes\callproc.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\cfield.c"
+ RelativePath="..\..\Modules\_ctypes\cfield.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\ffi.c"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\ffi.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\malloc_closure.c"
+ RelativePath="..\..\Modules\_ctypes\malloc_closure.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\prep_cif.c"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\prep_cif.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\stgdict.c"
+ RelativePath="..\..\Modules\_ctypes\stgdict.c"
>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\win32.c"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\win32.c"
>
<FileConfiguration
Name="Debug|x64"
@@ -627,7 +627,7 @@
</FileConfiguration>
</File>
<File
- RelativePath="..\Modules\_ctypes\libffi_msvc\win64.asm"
+ RelativePath="..\..\Modules\_ctypes\libffi_msvc\win64.asm"
>
<FileConfiguration
Name="Debug|Win32"
diff --git a/PCbuild/_ctypes_test.vcproj b/PC/VS9.0/_ctypes_test.vcproj
index 0c7abbe..7033546 100644
--- a/PCbuild/_ctypes_test.vcproj
+++ b/PC/VS9.0/_ctypes_test.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_ctypes_test"
ProjectGUID="{9EC7190A-249F-4180-A900-548FDCF3055F}"
RootNamespace="_ctypes_test"
@@ -503,7 +503,7 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\_ctypes\_ctypes_test.h"
+ RelativePath="..\..\Modules\_ctypes\_ctypes_test.h"
>
</File>
</Filter>
@@ -511,7 +511,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_ctypes\_ctypes_test.c"
+ RelativePath="..\..\Modules\_ctypes\_ctypes_test.c"
>
</File>
</Filter>
diff --git a/PC/VS9.0/_decimal.vcproj b/PC/VS9.0/_decimal.vcproj
new file mode 100644
index 0000000..b9fabb0
--- /dev/null
+++ b/PC/VS9.0/_decimal.vcproj
@@ -0,0 +1,743 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="_decimal"
+ ProjectGUID="{0E9791DB-593A-465F-98BC-681011311617}"
+ RootNamespace="_decimal"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM"
+ AdditionalIncludeDirectories="..\..\Modules\_decimal;..\..\Modules\_decimal\libmpdec"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ SubSystem="0"
+ BaseAddress="0x1D1A0000"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ >
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\basearith.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\bits.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\constants.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\convolute.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\crt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\difradix2.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\docstrings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\fnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\fourstep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\mpdecimal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\numbertheory.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\sixstep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\transpose.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\typearith.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\umodarith.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\vccompat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\vcstdint.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\Modules\_decimal\_decimal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\basearith.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\constants.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\context.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\convolute.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\crt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\difradix2.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\fnt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\fourstep.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\io.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\memory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\mpdecimal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\numbertheory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\sixstep.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\transpose.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Modules\_decimal\libmpdec\vcdiv64.asm"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="ml64 /nologo /c /Zi /Fo &quot;$(IntDir)\vcdiv64.obj&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ Outputs="$(IntDir)\vcdiv64.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="ml64 /nologo /c /Zi /Fo &quot;$(IntDir)\vcdiv64.obj&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ Outputs="$(IntDir)\vcdiv64.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="PGInstrument|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="PGInstrument|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="ml64 /nologo /c /Fo &quot;$(IntDir)\vcdiv64.obj&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ Outputs="$(IntDir)\vcdiv64.obj"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="PGUpdate|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="PGUpdate|x64"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="ml64 /nologo /c /Fo &quot;$(IntDir)\vcdiv64.obj&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+ Outputs="$(IntDir)\vcdiv64.obj"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/PCbuild/_elementtree.vcproj b/PC/VS9.0/_elementtree.vcproj
index 3e9631f..f9d7375 100644
--- a/PCbuild/_elementtree.vcproj
+++ b/PC/VS9.0/_elementtree.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_elementtree"
ProjectGUID="{17E1E049-C309-4D79-843F-AE483C264AEA}"
RootNamespace="_elementtree"
@@ -42,7 +42,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -104,7 +104,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -166,7 +166,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -229,7 +229,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -291,7 +291,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -354,7 +354,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -417,7 +417,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -480,7 +480,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\Modules\expat"
+ AdditionalIncludeDirectories="..\..\Modules\expat"
PreprocessorDefinitions="XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -527,63 +527,63 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\expat\ascii.h"
+ RelativePath="..\..\Modules\expat\ascii.h"
>
</File>
<File
- RelativePath="..\Modules\expat\asciitab.h"
+ RelativePath="..\..\Modules\expat\asciitab.h"
>
</File>
<File
- RelativePath="..\Modules\expat\expat.h"
+ RelativePath="..\..\Modules\expat\expat.h"
>
</File>
<File
- RelativePath="..\Modules\expat\expat_config.h"
+ RelativePath="..\..\Modules\expat\expat_config.h"
>
</File>
<File
- RelativePath="..\Modules\expat\expat_external.h"
+ RelativePath="..\..\Modules\expat\expat_external.h"
>
</File>
<File
- RelativePath="..\Modules\expat\iasciitab.h"
+ RelativePath="..\..\Modules\expat\iasciitab.h"
>
</File>
<File
- RelativePath="..\Modules\expat\internal.h"
+ RelativePath="..\..\Modules\expat\internal.h"
>
</File>
<File
- RelativePath="..\Modules\expat\latin1tab.h"
+ RelativePath="..\..\Modules\expat\latin1tab.h"
>
</File>
<File
- RelativePath="..\Modules\expat\macconfig.h"
+ RelativePath="..\..\Modules\expat\macconfig.h"
>
</File>
<File
- RelativePath="..\Modules\expat\nametab.h"
+ RelativePath="..\..\Modules\expat\nametab.h"
>
</File>
<File
- RelativePath="..\Modules\expat\pyexpatns.h"
+ RelativePath="..\..\Modules\expat\pyexpatns.h"
>
</File>
<File
- RelativePath="..\Modules\expat\utf8tab.h"
+ RelativePath="..\..\Modules\expat\utf8tab.h"
>
</File>
<File
- RelativePath="..\Modules\expat\winconfig.h"
+ RelativePath="..\..\Modules\expat\winconfig.h"
>
</File>
<File
- RelativePath="..\Modules\expat\xmlrole.h"
+ RelativePath="..\..\Modules\expat\xmlrole.h"
>
</File>
<File
- RelativePath="..\Modules\expat\xmltok.h"
+ RelativePath="..\..\Modules\expat\xmltok.h"
>
</File>
</Filter>
@@ -591,19 +591,19 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_elementtree.c"
+ RelativePath="..\..\Modules\_elementtree.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmlparse.c"
+ RelativePath="..\..\Modules\expat\xmlparse.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmlrole.c"
+ RelativePath="..\..\Modules\expat\xmlrole.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmltok.c"
+ RelativePath="..\..\Modules\expat\xmltok.c"
>
</File>
</Filter>
diff --git a/PCbuild/_hashlib.vcproj b/PC/VS9.0/_hashlib.vcproj
index e05d97e..77417ec 100644
--- a/PCbuild/_hashlib.vcproj
+++ b/PC/VS9.0/_hashlib.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_hashlib"
ProjectGUID="{447F05A8-F581-4CAC-A466-5AC7936E207E}"
RootNamespace="_hashlib"
@@ -527,7 +527,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_hashopenssl.c"
+ RelativePath="..\..\Modules\_hashopenssl.c"
>
</File>
</Filter>
diff --git a/PC/VS9.0/_lzma.vcproj b/PC/VS9.0/_lzma.vcproj
new file mode 100644
index 0000000..7c6003f
--- /dev/null
+++ b/PC/VS9.0/_lzma.vcproj
@@ -0,0 +1,537 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="_lzma"
+ ProjectGUID="{F9D71780-F393-11E0-BE50-0800200C9A66}"
+ RootNamespace="lzma"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_i486\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_x86-64\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_i486\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_x86-64\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_i486\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_x86-64\liblzma.a"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_i486\liblzma.a"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="$(lzmaDir)\include"
+ PreprocessorDefinitions="WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="$(lzmaDir)\bin_x86-64\liblzma.a"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\Modules\_lzmamodule.c"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/PCbuild/_msi.vcproj b/PC/VS9.0/_msi.vcproj
index 084efdf..cb230e1 100644
--- a/PCbuild/_msi.vcproj
+++ b/PC/VS9.0/_msi.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_msi"
ProjectGUID="{31FFC478-7B4A-43E8-9954-8D03E2187E9C}"
RootNamespace="_msi"
@@ -519,7 +519,7 @@
Name="Source Files"
>
<File
- RelativePath="..\PC\_msi.c"
+ RelativePath="..\..\PC\_msi.c"
>
</File>
</Filter>
diff --git a/PCbuild/_multiprocessing.vcproj b/PC/VS9.0/_multiprocessing.vcproj
index 5d6337d..fb3d1e7 100644
--- a/PCbuild/_multiprocessing.vcproj
+++ b/PC/VS9.0/_multiprocessing.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_multiprocessing"
ProjectGUID="{9E48B300-37D1-11DD-8C41-005056C00008}"
RootNamespace="_multiprocessing"
@@ -519,11 +519,7 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\_multiprocessing\multiprocessing.h"
- >
- </File>
- <File
- RelativePath="..\Modules\_multiprocessing\connection.h"
+ RelativePath="..\..\Modules\_multiprocessing\multiprocessing.h"
>
</File>
</Filter>
@@ -531,23 +527,11 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_multiprocessing\multiprocessing.c"
- >
- </File>
- <File
- RelativePath="..\Modules\_multiprocessing\pipe_connection.c"
- >
- </File>
- <File
- RelativePath="..\Modules\_multiprocessing\semaphore.c"
- >
- </File>
- <File
- RelativePath="..\Modules\_multiprocessing\socket_connection.c"
+ RelativePath="..\..\Modules\_multiprocessing\multiprocessing.c"
>
</File>
<File
- RelativePath="..\Modules\_multiprocessing\win32_functions.c"
+ RelativePath="..\..\Modules\_multiprocessing\semaphore.c"
>
</File>
</Filter>
diff --git a/PCbuild/_socket.vcproj b/PC/VS9.0/_socket.vcproj
index ee72c10..ff1f6d4 100644
--- a/PCbuild/_socket.vcproj
+++ b/PC/VS9.0/_socket.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_socket"
ProjectGUID="{86937F53-C189-40EF-8CE8-8759D8E7D480}"
RootNamespace="_socket"
@@ -519,7 +519,7 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\socketmodule.h"
+ RelativePath="..\..\Modules\socketmodule.h"
>
</File>
</Filter>
@@ -527,7 +527,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\socketmodule.c"
+ RelativePath="..\..\Modules\socketmodule.c"
>
</File>
</Filter>
diff --git a/PCbuild/_sqlite3.vcproj b/PC/VS9.0/_sqlite3.vcproj
index b31f9b6..f7100f1 100644
--- a/PCbuild/_sqlite3.vcproj
+++ b/PC/VS9.0/_sqlite3.vcproj
@@ -527,43 +527,43 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\_sqlite\cache.h"
+ RelativePath="..\..\Modules\_sqlite\cache.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\connection.h"
+ RelativePath="..\..\Modules\_sqlite\connection.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\cursor.h"
+ RelativePath="..\..\Modules\_sqlite\cursor.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\microprotocols.h"
+ RelativePath="..\..\Modules\_sqlite\microprotocols.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\module.h"
+ RelativePath="..\..\Modules\_sqlite\module.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\prepare_protocol.h"
+ RelativePath="..\..\Modules\_sqlite\prepare_protocol.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\row.h"
+ RelativePath="..\..\Modules\_sqlite\row.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\sqlitecompat.h"
+ RelativePath="..\..\Modules\_sqlite\sqlitecompat.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\statement.h"
+ RelativePath="..\..\Modules\_sqlite\statement.h"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\util.h"
+ RelativePath="..\..\Modules\_sqlite\util.h"
>
</File>
</Filter>
@@ -571,39 +571,39 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_sqlite\cache.c"
+ RelativePath="..\..\Modules\_sqlite\cache.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\connection.c"
+ RelativePath="..\..\Modules\_sqlite\connection.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\cursor.c"
+ RelativePath="..\..\Modules\_sqlite\cursor.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\microprotocols.c"
+ RelativePath="..\..\Modules\_sqlite\microprotocols.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\module.c"
+ RelativePath="..\..\Modules\_sqlite\module.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\prepare_protocol.c"
+ RelativePath="..\..\Modules\_sqlite\prepare_protocol.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\row.c"
+ RelativePath="..\..\Modules\_sqlite\row.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\statement.c"
+ RelativePath="..\..\Modules\_sqlite\statement.c"
>
</File>
<File
- RelativePath="..\Modules\_sqlite\util.c"
+ RelativePath="..\..\Modules\_sqlite\util.c"
>
</File>
</Filter>
diff --git a/PCbuild/_ssl.vcproj b/PC/VS9.0/_ssl.vcproj
index 5728c84..97aa294 100644
--- a/PCbuild/_ssl.vcproj
+++ b/PC/VS9.0/_ssl.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_ssl"
ProjectGUID="{C6E20F84-3247-4AD6-B051-B073268F73BA}"
RootNamespace="_ssl"
@@ -527,7 +527,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_ssl.c"
+ RelativePath="..\..\Modules\_ssl.c"
>
</File>
</Filter>
diff --git a/PC/VS9.0/_testbuffer.vcproj b/PC/VS9.0/_testbuffer.vcproj
new file mode 100644
index 0000000..03377e1
--- /dev/null
+++ b/PC/VS9.0/_testbuffer.vcproj
@@ -0,0 +1,521 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="_testbuffer"
+ ProjectGUID="{A2697BD3-28C1-4AEC-9106-8B748639FD16}"
+ RootNamespace="_testbuffer"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd_d.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGInstrument|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pginstrument.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="PGUpdate|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets=".\pyd.vsprops;.\x64.vsprops;.\pgupdate.vsprops"
+ CharacterSet="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ BaseAddress="0x1e1F0000"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\Modules\_testbuffer.c"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/PCbuild/_testcapi.vcproj b/PC/VS9.0/_testcapi.vcproj
index 55f243f..453300a 100644
--- a/PCbuild/_testcapi.vcproj
+++ b/PC/VS9.0/_testcapi.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_testcapi"
ProjectGUID="{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
RootNamespace="_testcapi"
@@ -511,7 +511,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_testcapimodule.c"
+ RelativePath="..\..\Modules\_testcapimodule.c"
>
</File>
</Filter>
diff --git a/PCbuild/_tkinter.vcproj b/PC/VS9.0/_tkinter.vcproj
index 1c5f0cb..5163317 100644
--- a/PCbuild/_tkinter.vcproj
+++ b/PC/VS9.0/_tkinter.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="_tkinter"
ProjectGUID="{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
RootNamespace="_tkinter"
@@ -527,11 +527,11 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\_tkinter.c"
+ RelativePath="..\..\Modules\_tkinter.c"
>
</File>
<File
- RelativePath="..\Modules\tkappinit.c"
+ RelativePath="..\..\Modules\tkappinit.c"
>
</File>
</Filter>
diff --git a/PCbuild/bdist_wininst.vcproj b/PC/VS9.0/bdist_wininst.vcproj
index 68b3931..b8cc7ad 100644
--- a/PCbuild/bdist_wininst.vcproj
+++ b/PC/VS9.0/bdist_wininst.vcproj
@@ -20,7 +20,7 @@
<Configurations>
<Configuration
Name="Release|Win32"
- OutputDirectory="..\lib\distutils\command"
+ OutputDirectory="..\..\lib\distutils\command"
ConfigurationType="1"
InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops"
UseOfMFC="0"
@@ -45,14 +45,14 @@
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
- TypeLibraryName=".\..\lib\distutils\command\wininst.tlb"
+ TypeLibraryName=".\..\..\lib\distutils\command\wininst.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="1"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\PC\bdist_wininst;..\Include;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\PC\bdist_wininst;..\..\Include;..\..\Modules\zlib"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE"
StringPooling="true"
RuntimeLibrary="0"
@@ -67,7 +67,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="0"
- AdditionalIncludeDirectories="..\PC;..\PC\bdist_wininst;..\Include"
+ AdditionalIncludeDirectories="..\..\PC;..\..\PC\bdist_wininst;..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -75,11 +75,11 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib imagehlp.lib"
- OutputFile="..\lib\distutils\command\wininst-9.0.exe"
+ OutputFile="..\..\lib\distutils\command\wininst-9.0.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
IgnoreDefaultLibraryNames="LIBC"
- ProgramDatabaseFile="..\lib\distutils\command\wininst-9.0.pdb"
+ ProgramDatabaseFile="..\..\lib\distutils\command\wininst-9.0.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
@@ -135,14 +135,14 @@
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="3"
- TypeLibraryName=".\..\lib\distutils\command\wininst.tlb"
+ TypeLibraryName=".\..\..\lib\distutils\command\wininst.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="1"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\PC\bdist_wininst;..\Include;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\PC\bdist_wininst;..\..\Include;..\..\Modules\zlib"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE"
StringPooling="true"
RuntimeLibrary="0"
@@ -157,7 +157,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="0"
- AdditionalIncludeDirectories="..\PC;..\PC\bdist_wininst;..\Include"
+ AdditionalIncludeDirectories="..\..\PC;..\..\PC\bdist_wininst;..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -165,11 +165,11 @@
<Tool
Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib imagehlp.lib"
- OutputFile="..\lib\distutils\command\wininst-9.0-amd64.exe"
+ OutputFile="..\..\lib\distutils\command\wininst-9.0-amd64.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
IgnoreDefaultLibraryNames="LIBC"
- ProgramDatabaseFile="..\lib\distutils\command\wininst-9.0-amd64.pdb"
+ ProgramDatabaseFile="..\..\lib\distutils\command\wininst-9.0-amd64.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
@@ -206,38 +206,38 @@
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
>
<File
- RelativePath="..\PC\bdist_wininst\extract.c"
+ RelativePath="..\..\PC\bdist_wininst\extract.c"
>
</File>
<File
- RelativePath="..\PC\bdist_wininst\install.c"
+ RelativePath="..\..\PC\bdist_wininst\install.c"
>
</File>
<Filter
Name="zlib"
>
<File
- RelativePath="..\Modules\zlib\adler32.c"
+ RelativePath="..\..\Modules\zlib\adler32.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\crc32.c"
+ RelativePath="..\..\Modules\zlib\crc32.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inffast.c"
+ RelativePath="..\..\Modules\zlib\inffast.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inflate.c"
+ RelativePath="..\..\Modules\zlib\inflate.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inftrees.c"
+ RelativePath="..\..\Modules\zlib\inftrees.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\zutil.c"
+ RelativePath="..\..\Modules\zlib\zutil.c"
>
</File>
</Filter>
@@ -247,7 +247,7 @@
Filter="h;hpp;hxx;hm;inl"
>
<File
- RelativePath="..\PC\bdist_wininst\archive.h"
+ RelativePath="..\..\PC\bdist_wininst\archive.h"
>
</File>
</Filter>
@@ -256,11 +256,11 @@
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
>
<File
- RelativePath="..\PC\bdist_wininst\install.rc"
+ RelativePath="..\..\PC\bdist_wininst\install.rc"
>
</File>
<File
- RelativePath="..\PC\bdist_wininst\PythonPowered.bmp"
+ RelativePath="..\..\PC\bdist_wininst\PythonPowered.bmp"
>
</File>
</Filter>
diff --git a/PCbuild/debug.vsprops b/PC/VS9.0/debug.vsprops
index bc643cb..bc643cb 100644
--- a/PCbuild/debug.vsprops
+++ b/PC/VS9.0/debug.vsprops
diff --git a/PC/VS9.0/kill_python.c b/PC/VS9.0/kill_python.c
new file mode 100644
index 0000000..bb323d3
--- /dev/null
+++ b/PC/VS9.0/kill_python.c
@@ -0,0 +1,178 @@
+/*
+ * Helper program for killing lingering python[_d].exe processes before
+ * building, thus attempting to avoid build failures due to files being
+ * locked.
+ */
+
+#include <windows.h>
+#include <wchar.h>
+#include <tlhelp32.h>
+#include <stdio.h>
+
+#pragma comment(lib, "psapi")
+
+#ifdef _DEBUG
+#define PYTHON_EXE (L"python_d.exe")
+#define PYTHON_EXE_LEN (12)
+#define KILL_PYTHON_EXE (L"kill_python_d.exe")
+#define KILL_PYTHON_EXE_LEN (17)
+#else
+#define PYTHON_EXE (L"python.exe")
+#define PYTHON_EXE_LEN (10)
+#define KILL_PYTHON_EXE (L"kill_python.exe")
+#define KILL_PYTHON_EXE_LEN (15)
+#endif
+
+int
+main(int argc, char **argv)
+{
+ HANDLE hp, hsp, hsm; /* process, snapshot processes, snapshot modules */
+ DWORD dac, our_pid;
+ size_t len;
+ wchar_t path[MAX_PATH+1];
+
+ MODULEENTRY32W me;
+ PROCESSENTRY32W pe;
+
+ me.dwSize = sizeof(MODULEENTRY32W);
+ pe.dwSize = sizeof(PROCESSENTRY32W);
+
+ memset(path, 0, MAX_PATH+1);
+
+ our_pid = GetCurrentProcessId();
+
+ hsm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, our_pid);
+ if (hsm == INVALID_HANDLE_VALUE) {
+ printf("CreateToolhelp32Snapshot[1] failed: %d\n", GetLastError());
+ return 1;
+ }
+
+ if (!Module32FirstW(hsm, &me)) {
+ printf("Module32FirstW[1] failed: %d\n", GetLastError());
+ CloseHandle(hsm);
+ return 1;
+ }
+
+ /*
+ * Enumerate over the modules for the current process in order to find
+ * kill_process[_d].exe, then take a note of the directory it lives in.
+ */
+ do {
+ if (_wcsnicmp(me.szModule, KILL_PYTHON_EXE, KILL_PYTHON_EXE_LEN))
+ continue;
+
+ len = wcsnlen_s(me.szExePath, MAX_PATH) - KILL_PYTHON_EXE_LEN;
+ wcsncpy_s(path, MAX_PATH+1, me.szExePath, len);
+
+ break;
+
+ } while (Module32NextW(hsm, &me));
+
+ CloseHandle(hsm);
+
+ if (path == NULL) {
+ printf("failed to discern directory of running process\n");
+ return 1;
+ }
+
+ /*
+ * Take a snapshot of system processes. Enumerate over the snapshot,
+ * looking for python processes. When we find one, verify it lives
+ * in the same directory we live in. If it does, kill it. If we're
+ * unable to kill it, treat this as a fatal error and return 1.
+ *
+ * The rationale behind this is that we're called at the start of the
+ * build process on the basis that we'll take care of killing any
+ * running instances, such that the build won't encounter permission
+ * denied errors during linking. If we can't kill one of the processes,
+ * we can't provide this assurance, and the build shouldn't start.
+ */
+
+ hsp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (hsp == INVALID_HANDLE_VALUE) {
+ printf("CreateToolhelp32Snapshot[2] failed: %d\n", GetLastError());
+ return 1;
+ }
+
+ if (!Process32FirstW(hsp, &pe)) {
+ printf("Process32FirstW failed: %d\n", GetLastError());
+ CloseHandle(hsp);
+ return 1;
+ }
+
+ dac = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE;
+ do {
+
+ /*
+ * XXX TODO: if we really wanted to be fancy, we could check the
+ * modules for all processes (not just the python[_d].exe ones)
+ * and see if any of our DLLs are loaded (i.e. python33[_d].dll),
+ * as that would also inhibit our ability to rebuild the solution.
+ * Not worth loosing sleep over though; for now, a simple check
+ * for just the python executable should be sufficient.
+ */
+
+ if (_wcsnicmp(pe.szExeFile, PYTHON_EXE, PYTHON_EXE_LEN))
+ /* This isn't a python process. */
+ continue;
+
+ /* It's a python process, so figure out which directory it's in... */
+ hsm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.th32ProcessID);
+ if (hsm == INVALID_HANDLE_VALUE)
+ /*
+ * If our module snapshot fails (which will happen if we don't own
+ * the process), just ignore it and continue. (It seems different
+ * versions of Windows return different values for GetLastError()
+ * in this situation; it's easier to just ignore it and move on vs.
+ * stopping the build for what could be a false positive.)
+ */
+ continue;
+
+ if (!Module32FirstW(hsm, &me)) {
+ printf("Module32FirstW[2] failed: %d\n", GetLastError());
+ CloseHandle(hsp);
+ CloseHandle(hsm);
+ return 1;
+ }
+
+ do {
+ if (_wcsnicmp(me.szModule, PYTHON_EXE, PYTHON_EXE_LEN))
+ /* Wrong module, we're looking for python[_d].exe... */
+ continue;
+
+ if (_wcsnicmp(path, me.szExePath, len))
+ /* Process doesn't live in our directory. */
+ break;
+
+ /* Python process residing in the right directory, kill it! */
+ hp = OpenProcess(dac, FALSE, pe.th32ProcessID);
+ if (!hp) {
+ printf("OpenProcess failed: %d\n", GetLastError());
+ CloseHandle(hsp);
+ CloseHandle(hsm);
+ return 1;
+ }
+
+ if (!TerminateProcess(hp, 1)) {
+ printf("TerminateProcess failed: %d\n", GetLastError());
+ CloseHandle(hsp);
+ CloseHandle(hsm);
+ CloseHandle(hp);
+ return 1;
+ }
+
+ CloseHandle(hp);
+ break;
+
+ } while (Module32NextW(hsm, &me));
+
+ CloseHandle(hsm);
+
+ } while (Process32NextW(hsp, &pe));
+
+ CloseHandle(hsp);
+
+ return 0;
+}
+
+/* vi: set ts=8 sw=4 sts=4 expandtab */
diff --git a/PCbuild/kill_python.vcproj b/PC/VS9.0/kill_python.vcproj
index a34107a..a34107a 100644
--- a/PCbuild/kill_python.vcproj
+++ b/PC/VS9.0/kill_python.vcproj
diff --git a/PC/VS9.0/make_buildinfo.c b/PC/VS9.0/make_buildinfo.c
new file mode 100644
index 0000000..fb4a64a
--- /dev/null
+++ b/PC/VS9.0/make_buildinfo.c
@@ -0,0 +1,195 @@
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <io.h>
+
+#define CMD_SIZE 500
+
+/* This file creates the getbuildinfo.o object, by first
+ invoking subwcrev.exe (if found), and then invoking cl.exe.
+ As a side effect, it might generate PCBuild\getbuildinfo2.c
+ also. If this isn't a subversion checkout, or subwcrev isn't
+ found, it compiles ..\\..\\Modules\\getbuildinfo.c instead.
+
+ Currently, subwcrev.exe is found from the registry entries
+ of TortoiseSVN.
+
+ No attempt is made to place getbuildinfo.o into the proper
+ binary directory. This isn't necessary, as this tool is
+ invoked as a pre-link step for pythoncore, so that overwrites
+ any previous getbuildinfo.o.
+
+ However, if a second argument is provided, this will be used
+ as a temporary directory where any getbuildinfo2.c and
+ getbuildinfo.o files are put. This is useful if multiple
+ configurations are being built in parallel, to avoid them
+ trampling each other's files.
+
+*/
+
+int make_buildinfo2(const char *tmppath)
+{
+ struct _stat st;
+ HKEY hTortoise;
+ char command[CMD_SIZE+1];
+ DWORD type, size;
+ if (_stat(".svn", &st) < 0)
+ return 0;
+ /* Allow suppression of subwcrev.exe invocation if a no_subwcrev file is present. */
+ if (_stat("no_subwcrev", &st) == 0)
+ return 0;
+ if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS &&
+ RegOpenKey(HKEY_CURRENT_USER, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS)
+ /* Tortoise not installed */
+ return 0;
+ command[0] = '"'; /* quote the path to the executable */
+ size = sizeof(command) - 1;
+ if (RegQueryValueEx(hTortoise, "Directory", 0, &type, command+1, &size) != ERROR_SUCCESS ||
+ type != REG_SZ)
+ /* Registry corrupted */
+ return 0;
+ strcat_s(command, CMD_SIZE, "bin\\subwcrev.exe");
+ if (_stat(command+1, &st) < 0)
+ /* subwcrev.exe not part of the release */
+ return 0;
+ strcat_s(command, CMD_SIZE, "\" ..\\.. ..\\..\\Modules\\getbuildinfo.c \"");
+ strcat_s(command, CMD_SIZE, tmppath); /* quoted tmppath */
+ strcat_s(command, CMD_SIZE, "getbuildinfo2.c\"");
+
+ puts(command); fflush(stdout);
+ if (system(command) < 0)
+ return 0;
+ return 1;
+}
+
+const char DELIMS[] = { " \n" };
+
+int get_mercurial_info(char * hgbranch, char * hgtag, char * hgrev, int size)
+{
+ int result = 0;
+ char filename[CMD_SIZE];
+ char cmdline[CMD_SIZE];
+
+ strcpy_s(filename, CMD_SIZE, "tmpXXXXXX");
+ if (_mktemp_s(filename, CMD_SIZE) == 0) {
+ int rc;
+
+ strcpy_s(cmdline, CMD_SIZE, "hg id -bit > ");
+ strcat_s(cmdline, CMD_SIZE, filename);
+ rc = system(cmdline);
+ if (rc == 0) {
+ FILE * fp;
+
+ if (fopen_s(&fp, filename, "r") == 0) {
+ char * cp = fgets(cmdline, CMD_SIZE, fp);
+
+ if (cp) {
+ char * context = NULL;
+ char * tp = strtok_s(cp, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgrev, size, tp);
+ tp = strtok_s(NULL, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgbranch, size, tp);
+ tp = strtok_s(NULL, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgtag, size, tp);
+ result = 1;
+ }
+ }
+ }
+ }
+ fclose(fp);
+ }
+ }
+ _unlink(filename);
+ }
+ return result;
+}
+
+int main(int argc, char*argv[])
+{
+ char command[CMD_SIZE] = "cl.exe -c -D_WIN32 -DUSE_DL_EXPORT -D_WINDOWS -DWIN32 -D_WINDLL ";
+ char tmppath[CMD_SIZE] = "";
+ int do_unlink, result;
+ char *tmpdir = NULL;
+ if (argc <= 2 || argc > 3) {
+ fprintf(stderr, "make_buildinfo $(ConfigurationName) [tmpdir]\n");
+ return EXIT_FAILURE;
+ }
+ if (strcmp(argv[1], "Release") == 0) {
+ strcat_s(command, CMD_SIZE, "-MD ");
+ }
+ else if (strcmp(argv[1], "Debug") == 0) {
+ strcat_s(command, CMD_SIZE, "-D_DEBUG -MDd ");
+ }
+ else if (strcmp(argv[1], "ReleaseItanium") == 0) {
+ strcat_s(command, CMD_SIZE, "-MD /USECL:MS_ITANIUM ");
+ }
+ else if (strcmp(argv[1], "ReleaseAMD64") == 0) {
+ strcat_s(command, CMD_SIZE, "-MD ");
+ strcat_s(command, CMD_SIZE, "-MD /USECL:MS_OPTERON ");
+ }
+ else {
+ fprintf(stderr, "unsupported configuration %s\n", argv[1]);
+ return EXIT_FAILURE;
+ }
+ if (argc > 2) {
+ tmpdir = argv[2];
+ strcat_s(tmppath, _countof(tmppath), tmpdir);
+ /* Hack fix for bad command line: If the command is issued like this:
+ * $(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)"
+ * we will get a trailing quote because IntDir ends with a backslash that then
+ * escapes the final ". To simplify the life for developers, catch that problem
+ * here by cutting it off.
+ * The proper command line, btw is:
+ * $(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)\"
+ * Hooray for command line parsing on windows.
+ */
+ if (strlen(tmppath) > 0 && tmppath[strlen(tmppath)-1] == '"')
+ tmppath[strlen(tmppath)-1] = '\0';
+ strcat_s(tmppath, _countof(tmppath), "\\");
+ }
+
+ if ((do_unlink = make_buildinfo2(tmppath))) {
+ strcat_s(command, CMD_SIZE, "\"");
+ strcat_s(command, CMD_SIZE, tmppath);
+ strcat_s(command, CMD_SIZE, "getbuildinfo2.c\" -DSUBWCREV ");
+ }
+ else {
+ char hgtag[CMD_SIZE];
+ char hgbranch[CMD_SIZE];
+ char hgrev[CMD_SIZE];
+
+ if (get_mercurial_info(hgbranch, hgtag, hgrev, CMD_SIZE)) {
+ strcat_s(command, CMD_SIZE, "-DHGBRANCH=\\\"");
+ strcat_s(command, CMD_SIZE, hgbranch);
+ strcat_s(command, CMD_SIZE, "\\\"");
+
+ strcat_s(command, CMD_SIZE, " -DHGTAG=\\\"");
+ strcat_s(command, CMD_SIZE, hgtag);
+ strcat_s(command, CMD_SIZE, "\\\"");
+
+ strcat_s(command, CMD_SIZE, " -DHGVERSION=\\\"");
+ strcat_s(command, CMD_SIZE, hgrev);
+ strcat_s(command, CMD_SIZE, "\\\" ");
+ }
+ strcat_s(command, CMD_SIZE, "..\\..\\Modules\\getbuildinfo.c");
+ }
+ strcat_s(command, CMD_SIZE, " -Fo\"");
+ strcat_s(command, CMD_SIZE, tmppath);
+ strcat_s(command, CMD_SIZE, "getbuildinfo.o\" -I..\\..\\Include -I..\\..\\PC");
+ puts(command); fflush(stdout);
+ result = system(command);
+ if (do_unlink) {
+ command[0] = '\0';
+ strcat_s(command, CMD_SIZE, "\"");
+ strcat_s(command, CMD_SIZE, tmppath);
+ strcat_s(command, CMD_SIZE, "getbuildinfo2.c\"");
+ _unlink(command);
+ }
+ if (result < 0)
+ return EXIT_FAILURE;
+ return 0;
+}
diff --git a/PCbuild/make_buildinfo.vcproj b/PC/VS9.0/make_buildinfo.vcproj
index 1910b9e..924065d 100644
--- a/PCbuild/make_buildinfo.vcproj
+++ b/PC/VS9.0/make_buildinfo.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="windows-1250"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="make_buildinfo"
ProjectGUID="{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
RootNamespace="make_buildinfo"
diff --git a/PCbuild/make_versioninfo.vcproj b/PC/VS9.0/make_versioninfo.vcproj
index 881f44b..0a1fd28 100644
--- a/PCbuild/make_versioninfo.vcproj
+++ b/PC/VS9.0/make_versioninfo.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="make_versioninfo"
ProjectGUID="{F0E0541E-F17D-430B-97C4-93ADF0DD284E}"
RootNamespace="make_versioninfo"
@@ -32,8 +32,8 @@
<Tool
Name="VCCustomBuildTool"
Description="Build PC/pythonnt_rc(_d).h"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\PC\pythonnt_rc.h&#x0D;&#x0A;"
- Outputs="$(SolutionDir)..\PC\pythonnt_rc.h"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\..\PC\pythonnt_rc.h&#x0D;&#x0A;"
+ Outputs="$(SolutionDir)..\..\PC\pythonnt_rc.h"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -92,7 +92,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\PC\python_nt.h&#x0D;&#x0A;"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\..\PC\python_nt.h&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
@@ -106,8 +106,8 @@
<Tool
Name="VCCustomBuildTool"
Description="Build PC/pythonnt_rc(_d).h"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\PC\pythonnt_rc.h&#x0D;&#x0A;"
- Outputs="$(SolutionDir)..\PC\pythonnt_rc.h"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\..\PC\pythonnt_rc.h&#x0D;&#x0A;"
+ Outputs="$(SolutionDir)..\..\PC\pythonnt_rc.h"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -158,7 +158,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\PC\python_nt.h&#x0D;&#x0A;"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo.exe &gt; ..\..\PC\python_nt.h&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
@@ -175,8 +175,8 @@
<Tool
Name="VCCustomBuildTool"
Description="Build PC/pythonnt_rc(_d).h"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\PC\pythonnt_rc_d.h&#x0D;&#x0A;"
- Outputs="$(SolutionDir)..\PC\pythonnt_rc_d.h"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\..\PC\pythonnt_rc_d.h&#x0D;&#x0A;"
+ Outputs="$(SolutionDir)..\..\PC\pythonnt_rc_d.h"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -235,7 +235,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\PC\python_nt_d.h&#x0D;&#x0A;"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\..\PC\python_nt_d.h&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
@@ -249,8 +249,8 @@
<Tool
Name="VCCustomBuildTool"
Description="Build PC/pythonnt_rc(_d).h"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\PC\pythonnt_rc_d.h&#x0D;&#x0A;"
- Outputs="$(SolutionDir)..\PC\pythonnt_rc_d.h"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\..\PC\pythonnt_rc_d.h&#x0D;&#x0A;"
+ Outputs="$(SolutionDir)..\..\PC\pythonnt_rc_d.h"
/>
<Tool
Name="VCXMLDataGeneratorTool"
@@ -303,7 +303,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\PC\python_nt_d.h&#x0D;&#x0A;"
+ CommandLine="cd $(SolutionDir)&#x0D;&#x0A;make_versioninfo_d.exe &gt; ..\..\PC\python_nt_d.h&#x0D;&#x0A;"
/>
</Configuration>
</Configurations>
@@ -314,7 +314,7 @@
Name="Source Files"
>
<File
- RelativePath="..\PC\make_versioninfo.c"
+ RelativePath="..\..\PC\make_versioninfo.c"
>
</File>
</Filter>
diff --git a/PC/VS9.0/pcbuild.sln b/PC/VS9.0/pcbuild.sln
new file mode 100644
index 0000000..8f8cbb6
--- /dev/null
+++ b/PC/VS9.0/pcbuild.sln
@@ -0,0 +1,658 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058} = {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_versioninfo", "make_versioninfo.vcproj", "{F0E0541E-F17D-430B-97C4-93ADF0DD284E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E} = {F0E0541E-F17D-430B-97C4-93ADF0DD284E}
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD} = {C73F0EC1-358B-4177-940F-0846AC8B04CD}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w9xpopen", "w9xpopen.vcproj", "{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_buildinfo", "make_buildinfo.vcproj", "{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}"
+ ProjectSection(SolutionItems) = preProject
+ ..\..\Modules\getbuildinfo.c = ..\..\Modules\getbuildinfo.c
+ readme.txt = readme.txt
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_decimal", "_decimal.vcproj", "{0E9791DB-593A-465F-98BC-681011311617}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcproj", "{0E9791DB-593A-465F-98BC-681011311618}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcproj", "{9EC7190A-249F-4180-A900-548FDCF3055F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcproj", "{17E1E049-C309-4D79-843F-AE483C264AEA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcproj", "{31FFC478-7B4A-43E8-9954-8D03E2187E9C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcproj", "{13CECB97-4119-4316-9D42-8534019A5A44}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ {A1A295E5-463C-437F-81CA-1F32367685DA} = {A1A295E5-463C-437F-81CA-1F32367685DA}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
+ {86937F53-C189-40EF-8CE8-8759D8E7D480} = {86937F53-C189-40EF-8CE8-8759D8E7D480}
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0} = {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bz2", "_bz2.vcproj", "{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_lzma", "_lzma.vcproj", "{F9D71780-F393-11E0-BE50-0800200C9A66}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcproj", "{18CAE28C-B454-46C1-87A0-493D91D97F03}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcproj", "{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcproj", "{D06B6426-4762-44CC-8BAD-D79052507F2F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bdist_wininst", "bdist_wininst.vcproj", "{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0} = {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcproj", "{9E48B300-37D1-11DD-8C41-005056C00008}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssl", "ssl.vcproj", "{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kill_python", "kill_python.vcproj", "{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxlimited", "xxlimited.vcproj", "{F749B822-B489-4CA5-A3AD-CE078F5F338A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testbuffer", "_testbuffer.vcproj", "{A2697BD3-28C1-4AEC-9106-8B748639FD16}"
+ ProjectSection(ProjectDependencies) = postProject
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ PGInstrument|Win32 = PGInstrument|Win32
+ PGInstrument|x64 = PGInstrument|x64
+ PGUpdate|Win32 = PGUpdate|Win32
+ PGUpdate|x64 = PGUpdate|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.Build.0 = Debug|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.Build.0 = Debug|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.ActiveCfg = Release|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.Build.0 = Release|Win32
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|x64
+ {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.Build.0 = Release|x64
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|Win32.Build.0 = Debug|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|x64.ActiveCfg = Debug|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|x64.Build.0 = Debug|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGInstrument|Win32.Build.0 = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGInstrument|x64.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGInstrument|x64.Build.0 = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGUpdate|Win32.Build.0 = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGUpdate|x64.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.PGUpdate|x64.Build.0 = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release|Win32.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release|Win32.Build.0 = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release|x64.ActiveCfg = Release|Win32
+ {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Release|x64.Build.0 = Release|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.Build.0 = Debug|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.ActiveCfg = Debug|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.Build.0 = Debug|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.ActiveCfg = Release|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.Build.0 = Release|Win32
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.ActiveCfg = Release|x64
+ {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.Build.0 = Release|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.Build.0 = Debug|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.ActiveCfg = Debug|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.Build.0 = Debug|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.ActiveCfg = Release|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64
+ {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|Win32.Build.0 = Debug|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.ActiveCfg = Debug|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Debug|x64.Build.0 = Debug|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.ActiveCfg = Release|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|Win32.Build.0 = Release|Win32
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.ActiveCfg = Release|x64
+ {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}.Release|x64.Build.0 = Release|x64
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|Win32.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|x64.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Debug|x64.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGInstrument|Win32.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGInstrument|x64.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGInstrument|x64.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGUpdate|Win32.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGUpdate|x64.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.PGUpdate|x64.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release|Win32.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release|Win32.Build.0 = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release|x64.ActiveCfg = Release|Win32
+ {C73F0EC1-358B-4177-940F-0846AC8B04CD}.Release|x64.Build.0 = Release|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.ActiveCfg = Debug|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.Build.0 = Debug|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.ActiveCfg = Debug|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.Build.0 = Debug|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.ActiveCfg = Release|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.Build.0 = Release|Win32
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.ActiveCfg = Release|x64
+ {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.Build.0 = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.Build.0 = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.ActiveCfg = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.Build.0 = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.ActiveCfg = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.Build.0 = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.Build.0 = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.Build.0 = Release|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.Build.0 = Debug|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.ActiveCfg = Debug|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.Build.0 = Debug|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.ActiveCfg = Release|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.Build.0 = Release|Win32
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.ActiveCfg = Release|x64
+ {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.Build.0 = Release|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.Build.0 = Debug|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.Build.0 = Debug|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.ActiveCfg = Release|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.Build.0 = Release|Win32
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|x64
+ {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.Build.0 = Release|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.Build.0 = Debug|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.ActiveCfg = Debug|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.Build.0 = Debug|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.ActiveCfg = Release|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.Build.0 = Release|Win32
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.ActiveCfg = Release|x64
+ {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.Build.0 = Release|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.ActiveCfg = Debug|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.Build.0 = Debug|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.ActiveCfg = Debug|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.Build.0 = Debug|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.ActiveCfg = Release|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.Build.0 = Release|Win32
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.ActiveCfg = Release|x64
+ {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.Build.0 = Release|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.ActiveCfg = Debug|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.Build.0 = Debug|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.ActiveCfg = Debug|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.Build.0 = Debug|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.ActiveCfg = Release|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.Build.0 = Release|Win32
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.ActiveCfg = Release|x64
+ {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.Build.0 = Release|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.Build.0 = Debug|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.ActiveCfg = Debug|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.Build.0 = Debug|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.ActiveCfg = Release|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.Build.0 = Release|Win32
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.ActiveCfg = Release|x64
+ {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.Build.0 = Release|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.Build.0 = Debug|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.ActiveCfg = Debug|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.Build.0 = Debug|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.ActiveCfg = Release|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.Build.0 = Release|Win32
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.ActiveCfg = Release|x64
+ {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.Build.0 = Release|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.Build.0 = Debug|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.ActiveCfg = Debug|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.Build.0 = Debug|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.ActiveCfg = Release|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.Build.0 = Release|Win32
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.ActiveCfg = Release|x64
+ {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.Build.0 = Release|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.Build.0 = Debug|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.ActiveCfg = Debug|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.Build.0 = Debug|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.ActiveCfg = Release|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.Build.0 = Release|Win32
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.ActiveCfg = Release|x64
+ {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.Build.0 = Release|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.Build.0 = Debug|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.ActiveCfg = Release|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.Build.0 = Release|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.ActiveCfg = Debug|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.Build.0 = Debug|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.ActiveCfg = Debug|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.Build.0 = Debug|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.ActiveCfg = Release|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.Build.0 = Release|Win32
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.ActiveCfg = Release|x64
+ {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.Build.0 = Release|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.Build.0 = Debug|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.ActiveCfg = Debug|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.Build.0 = Debug|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.ActiveCfg = Release|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.Build.0 = Release|Win32
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.ActiveCfg = Release|x64
+ {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.Build.0 = Release|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.Build.0 = Debug|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.ActiveCfg = Debug|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.Build.0 = Debug|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.ActiveCfg = Release|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.Build.0 = Release|Win32
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64
+ {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Release|Win32
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32
+ {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.Build.0 = Debug|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.ActiveCfg = Release|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.Build.0 = Release|Win32
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.ActiveCfg = Release|x64
+ {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.Build.0 = Release|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.Build.0 = Debug|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.ActiveCfg = Debug|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.Build.0 = Debug|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.ActiveCfg = Release|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.Build.0 = Release|Win32
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.ActiveCfg = Release|x64
+ {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.Build.0 = Release|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.Build.0 = Debug|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.ActiveCfg = Debug|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.Build.0 = Debug|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.ActiveCfg = Release|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.Build.0 = Release|Win32
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.ActiveCfg = Release|x64
+ {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.Build.0 = Release|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.Build.0 = Debug|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.ActiveCfg = Debug|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.Build.0 = Debug|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.ActiveCfg = Release|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.Build.0 = Release|Win32
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.ActiveCfg = Release|x64
+ {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|Win32.Build.0 = Debug|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|x64.ActiveCfg = Debug|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|x64.Build.0 = Debug|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.Build.0 = Release|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.ActiveCfg = PGInstrument|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.ActiveCfg = Release|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.Build.0 = Release|Win32
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.ActiveCfg = Release|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.Build.0 = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.Build.0 = Debug|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Debug|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.Build.0 = Debug|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.Build.0 = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.ActiveCfg = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.Build.0 = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.ActiveCfg = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.Build.0 = Release|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.Build.0 = Debug|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.ActiveCfg = Debug|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.Build.0 = Debug|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.ActiveCfg = Release|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.Build.0 = Release|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.ActiveCfg = Release|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/PCbuild/pginstrument.vsprops b/PC/VS9.0/pginstrument.vsprops
index 99c117b..99c117b 100644
--- a/PCbuild/pginstrument.vsprops
+++ b/PC/VS9.0/pginstrument.vsprops
diff --git a/PCbuild/pgupdate.vsprops b/PC/VS9.0/pgupdate.vsprops
index 26cfc2d..26cfc2d 100644
--- a/PCbuild/pgupdate.vsprops
+++ b/PC/VS9.0/pgupdate.vsprops
diff --git a/PCbuild/pyd.vsprops b/PC/VS9.0/pyd.vsprops
index 34c21e1..34c21e1 100644
--- a/PCbuild/pyd.vsprops
+++ b/PC/VS9.0/pyd.vsprops
diff --git a/PCbuild/pyd_d.vsprops b/PC/VS9.0/pyd_d.vsprops
index 313a30b..313a30b 100644
--- a/PCbuild/pyd_d.vsprops
+++ b/PC/VS9.0/pyd_d.vsprops
diff --git a/PCbuild/pyexpat.vcproj b/PC/VS9.0/pyexpat.vcproj
index 5a20a51..a8d2cd7 100644
--- a/PCbuild/pyexpat.vcproj
+++ b/PC/VS9.0/pyexpat.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="pyexpat"
ProjectGUID="{D06B6426-4762-44CC-8BAD-D79052507F2F}"
RootNamespace="pyexpat"
@@ -42,7 +42,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -103,7 +103,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -164,7 +164,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -226,7 +226,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -287,7 +287,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -349,7 +349,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -411,7 +411,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -473,7 +473,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".\..\Modules\expat"
+ AdditionalIncludeDirectories=".\..\..\Modules\expat"
PreprocessorDefinitions="PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE"
/>
<Tool
@@ -519,11 +519,11 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\expat\xmlrole.h"
+ RelativePath="..\..\Modules\expat\xmlrole.h"
>
</File>
<File
- RelativePath="..\Modules\expat\xmltok.h"
+ RelativePath="..\..\Modules\expat\xmltok.h"
>
</File>
</Filter>
@@ -531,19 +531,19 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\pyexpat.c"
+ RelativePath="..\..\Modules\pyexpat.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmlparse.c"
+ RelativePath="..\..\Modules\expat\xmlparse.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmlrole.c"
+ RelativePath="..\..\Modules\expat\xmlrole.c"
>
</File>
<File
- RelativePath="..\Modules\expat\xmltok.c"
+ RelativePath="..\..\Modules\expat\xmltok.c"
>
</File>
</Filter>
diff --git a/PCbuild/pyproject.vsprops b/PC/VS9.0/pyproject.vsprops
index 6a94a68..01c7ca7 100644
--- a/PCbuild/pyproject.vsprops
+++ b/PC/VS9.0/pyproject.vsprops
@@ -11,7 +11,7 @@
Optimization="2"
InlineFunctionExpansion="1"
EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="..\Include; ..\PC"
+ AdditionalIncludeDirectories="..\..\Include; ..\..\PC"
PreprocessorDefinitions="_WIN32"
StringPooling="true"
ExceptionHandling="0"
@@ -34,11 +34,11 @@
/>
<Tool
Name="VCResourceCompilerTool"
- AdditionalIncludeDirectories="..\PC;..\Include"
+ AdditionalIncludeDirectories="..\..\PC;..\..\Include"
/>
<UserMacro
Name="PyDllName"
- Value="python32"
+ Value="python33"
/>
<UserMacro
Name="PythonExe"
@@ -46,19 +46,23 @@
/>
<UserMacro
Name="externalsDir"
- Value="..\.."
+ Value="..\..\.."
/>
<UserMacro
Name="sqlite3Dir"
- Value="$(externalsDir)\sqlite-3.7.4"
+ Value="$(externalsDir)\sqlite-3.7.12"
/>
<UserMacro
Name="bz2Dir"
Value="$(externalsDir)\bzip2-1.0.6"
/>
<UserMacro
+ Name="lzmaDir"
+ Value="$(externalsDir)\xz-5.0.3"
+ />
+ <UserMacro
Name="opensslDir"
- Value="$(externalsDir)\openssl-1.0.0j"
+ Value="$(externalsDir)\openssl-1.0.1c"
/>
<UserMacro
Name="tcltkDir"
diff --git a/PCbuild/python.vcproj b/PC/VS9.0/python.vcproj
index 47b289e..b07de21 100644
--- a/PCbuild/python.vcproj
+++ b/PC/VS9.0/python.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="python"
ProjectGUID="{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}"
TargetFrameworkVersion="131072"
@@ -202,7 +202,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -277,7 +277,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -615,11 +615,11 @@
Name="Resource Files"
>
<File
- RelativePath="..\PC\pycon.ico"
+ RelativePath="..\..\PC\pycon.ico"
>
</File>
<File
- RelativePath="..\PC\python_exe.rc"
+ RelativePath="..\..\PC\python_exe.rc"
>
</File>
</Filter>
@@ -627,7 +627,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\python.c"
+ RelativePath="..\..\Modules\python.c"
>
</File>
</Filter>
diff --git a/PCbuild/python3dll.vcproj b/PC/VS9.0/python3dll.vcproj
index 52c6752..ed7333b 100644
--- a/PCbuild/python3dll.vcproj
+++ b/PC/VS9.0/python3dll.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="python3dll"
ProjectGUID="{885D4898-D08D-4091-9C40-C700CFE3FC5A}"
RootNamespace="python3dll"
@@ -27,9 +27,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -46,9 +46,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -65,9 +65,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -84,9 +84,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -103,9 +103,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -122,9 +122,9 @@
>
<Tool
Name="VCNMakeTool"
- BuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
- ReBuildCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
- CleanCommandLine="cd $(InputDir)\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
+ BuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)"
+ ReBuildCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild"
+ CleanCommandLine="cd $(InputDir)\..\..\PC&#x0D;&#x0A;nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean"
Output="$(OutDir)\python3.dll"
PreprocessorDefinitions=""
IncludeSearchPath=""
@@ -144,7 +144,7 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\PC\python3.def"
+ RelativePath="..\..\PC\python3.def"
>
<FileConfiguration
Name="Release|Win32"
@@ -172,7 +172,7 @@
</FileConfiguration>
</File>
<File
- RelativePath="..\PC\python3dll.c"
+ RelativePath="..\..\PC\python3dll.c"
>
<FileConfiguration
Name="Release|Win32"
@@ -212,7 +212,7 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
- RelativePath="..\PC\python_nt.rc"
+ RelativePath="..\..\PC\python_nt.rc"
>
<FileConfiguration
Name="Release|Win32"
diff --git a/PCbuild/pythoncore.vcproj b/PC/VS9.0/pythoncore.vcproj
index 5e61308..9fb63ff 100644
--- a/PCbuild/pythoncore.vcproj
+++ b/PC/VS9.0/pythoncore.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="pythoncore"
ProjectGUID="{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
RootNamespace="pythoncore"
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -54,7 +54,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -118,7 +118,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -129,7 +129,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -196,7 +196,7 @@
Optimization="0"
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="false"
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="3"
/>
@@ -207,7 +207,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -274,7 +274,7 @@
Optimization="0"
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="false"
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="3"
/>
@@ -285,7 +285,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -348,7 +348,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -359,7 +359,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -423,7 +423,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -434,7 +434,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -498,7 +498,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -509,7 +509,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -573,7 +573,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
- AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
+ AdditionalIncludeDirectories="..\..\Python;..\..\Modules\zlib"
PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
RuntimeLibrary="2"
/>
@@ -584,7 +584,7 @@
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"
- AdditionalIncludeDirectories="..\Include"
+ AdditionalIncludeDirectories="..\..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
@@ -631,359 +631,363 @@
Name="Include"
>
<File
- RelativePath="..\Include\abstract.h"
+ RelativePath="..\..\Include\abstract.h"
>
</File>
<File
- RelativePath="..\Include\accu.h"
+ RelativePath="..\..\Include\accu.h"
>
</File>
<File
- RelativePath="..\Include\asdl.h"
+ RelativePath="..\..\Include\asdl.h"
>
</File>
<File
- RelativePath="..\Include\ast.h"
+ RelativePath="..\..\Include\ast.h"
>
</File>
<File
- RelativePath="..\Include\bitset.h"
+ RelativePath="..\..\Include\bitset.h"
>
</File>
<File
- RelativePath="..\Include\boolobject.h"
+ RelativePath="..\..\Include\boolobject.h"
>
</File>
<File
- RelativePath="..\Include\bytes_methods.h"
+ RelativePath="..\..\Include\bytes_methods.h"
>
</File>
<File
- RelativePath="..\Include\bytearrayobject.h"
+ RelativePath="..\..\Include\bytearrayobject.h"
>
</File>
<File
- RelativePath="..\Include\bytesobject.h"
+ RelativePath="..\..\Include\bytesobject.h"
>
</File>
<File
- RelativePath="..\Include\cellobject.h"
+ RelativePath="..\..\Include\cellobject.h"
>
</File>
<File
- RelativePath="..\Include\ceval.h"
+ RelativePath="..\..\Include\ceval.h"
>
</File>
<File
- RelativePath="..\Include\classobject.h"
+ RelativePath="..\..\Include\classobject.h"
>
</File>
<File
- RelativePath="..\Include\code.h"
+ RelativePath="..\..\Include\code.h"
>
</File>
<File
- RelativePath="..\Include\codecs.h"
+ RelativePath="..\..\Include\codecs.h"
>
</File>
<File
- RelativePath="..\Include\compile.h"
+ RelativePath="..\..\Include\compile.h"
>
</File>
<File
- RelativePath="..\Include\complexobject.h"
+ RelativePath="..\..\Include\complexobject.h"
>
</File>
<File
- RelativePath="..\Include\datetime.h"
+ RelativePath="..\..\Include\datetime.h"
>
</File>
<File
- RelativePath="..\Include\descrobject.h"
+ RelativePath="..\..\Include\descrobject.h"
>
</File>
<File
- RelativePath="..\Include\dictobject.h"
+ RelativePath="..\..\Include\dictobject.h"
>
</File>
<File
- RelativePath="..\Include\dynamic_annotations.h"
+ RelativePath="..\..\Include\dynamic_annotations.h"
>
</File>
<File
- RelativePath="..\Include\enumobject.h"
+ RelativePath="..\..\Include\enumobject.h"
>
</File>
<File
- RelativePath="..\Include\errcode.h"
+ RelativePath="..\..\Include\errcode.h"
>
</File>
<File
- RelativePath="..\Include\eval.h"
+ RelativePath="..\..\Include\eval.h"
>
</File>
<File
- RelativePath="..\Include\fileobject.h"
+ RelativePath="..\..\Include\fileobject.h"
>
</File>
<File
- RelativePath="..\Include\fileutils.h"
+ RelativePath="..\..\Include\fileutils.h"
>
</File>
<File
- RelativePath="..\Include\floatobject.h"
+ RelativePath="..\..\Include\floatobject.h"
>
</File>
<File
- RelativePath="..\Include\formatter_unicode.h"
+ RelativePath="..\..\Include\frameobject.h"
>
</File>
<File
- RelativePath="..\Include\frameobject.h"
+ RelativePath="..\..\Include\funcobject.h"
>
</File>
<File
- RelativePath="..\Include\funcobject.h"
+ RelativePath="..\..\Include\genobject.h"
>
</File>
<File
- RelativePath="..\Include\genobject.h"
+ RelativePath="..\..\Include\graminit.h"
>
</File>
<File
- RelativePath="..\Include\graminit.h"
+ RelativePath="..\..\Include\grammar.h"
>
</File>
<File
- RelativePath="..\Include\grammar.h"
+ RelativePath="..\..\Include\import.h"
>
</File>
<File
- RelativePath="..\Include\import.h"
+ RelativePath="..\..\Include\intrcheck.h"
>
</File>
<File
- RelativePath="..\Include\intrcheck.h"
+ RelativePath="..\..\Include\iterobject.h"
>
</File>
<File
- RelativePath="..\Include\iterobject.h"
+ RelativePath="..\..\Include\listobject.h"
>
</File>
<File
- RelativePath="..\Include\listobject.h"
+ RelativePath="..\..\Include\longintrepr.h"
>
</File>
<File
- RelativePath="..\Include\longintrepr.h"
+ RelativePath="..\..\Include\longobject.h"
>
</File>
<File
- RelativePath="..\Include\longobject.h"
+ RelativePath="..\..\Include\marshal.h"
>
</File>
<File
- RelativePath="..\Include\marshal.h"
+ RelativePath="..\..\Include\memoryobject.h"
>
</File>
<File
- RelativePath="..\Include\memoryobject.h"
+ RelativePath="..\..\Include\metagrammar.h"
>
</File>
<File
- RelativePath="..\Include\metagrammar.h"
+ RelativePath="..\..\Include\methodobject.h"
>
</File>
<File
- RelativePath="..\Include\methodobject.h"
+ RelativePath="..\..\Include\modsupport.h"
>
</File>
<File
- RelativePath="..\Include\modsupport.h"
+ RelativePath="..\..\Include\moduleobject.h"
>
</File>
<File
- RelativePath="..\Include\moduleobject.h"
+ RelativePath="..\..\Include\namespaceobject.h"
>
</File>
<File
- RelativePath="..\Include\node.h"
+ RelativePath="..\..\Include\node.h"
>
</File>
<File
- RelativePath="..\Include\object.h"
+ RelativePath="..\..\Include\object.h"
>
</File>
<File
- RelativePath="..\Include\objimpl.h"
+ RelativePath="..\..\Include\objimpl.h"
>
</File>
<File
- RelativePath="..\Include\opcode.h"
+ RelativePath="..\..\Include\opcode.h"
>
</File>
<File
- RelativePath="..\Include\osdefs.h"
+ RelativePath="..\..\Include\osdefs.h"
>
</File>
<File
- RelativePath="..\Include\parsetok.h"
+ RelativePath="..\..\Include\parsetok.h"
>
</File>
<File
- RelativePath="..\Include\patchlevel.h"
+ RelativePath="..\..\Include\patchlevel.h"
>
</File>
<File
- RelativePath="..\Include\pgen.h"
+ RelativePath="..\..\Include\pgen.h"
>
</File>
<File
- RelativePath="..\Include\pgenheaders.h"
+ RelativePath="..\..\Include\pgenheaders.h"
>
</File>
<File
- RelativePath="..\Include\py_curses.h"
+ RelativePath="..\..\Include\py_curses.h"
>
</File>
<File
- RelativePath="..\Include\pyarena.h"
+ RelativePath="..\..\Include\pyarena.h"
>
</File>
<File
- RelativePath="..\Include\pycapsule.h"
+ RelativePath="..\..\Include\pycapsule.h"
>
</File>
<File
- RelativePath="..\Include\pyctype.h"
+ RelativePath="..\..\Include\pyctype.h"
>
</File>
<File
- RelativePath="..\Include\pydebug.h"
+ RelativePath="..\..\Include\pydebug.h"
>
</File>
<File
- RelativePath="..\Include\pyerrors.h"
+ RelativePath="..\..\Include\pyerrors.h"
>
</File>
<File
- RelativePath="..\Include\pyexpat.h"
+ RelativePath="..\..\Include\pyexpat.h"
>
</File>
<File
- RelativePath="..\Include\pyfpe.h"
+ RelativePath="..\..\Include\pyfpe.h"
>
</File>
<File
- RelativePath="..\Include\pygetopt.h"
+ RelativePath="..\..\Include\pygetopt.h"
>
</File>
<File
- RelativePath="..\Include\pymactoolbox.h"
+ RelativePath="..\..\Include\pymactoolbox.h"
>
</File>
<File
- RelativePath="..\Include\pymath.h"
+ RelativePath="..\..\Include\pymath.h"
>
</File>
<File
- RelativePath="..\Include\pytime.h"
+ RelativePath="..\..\Include\pytime.h"
>
</File>
<File
- RelativePath="..\Include\pymem.h"
+ RelativePath="..\..\Include\pymacro.h"
>
</File>
<File
- RelativePath="..\Include\pyport.h"
+ RelativePath="..\..\Include\pymem.h"
>
</File>
<File
- RelativePath="..\Include\pystate.h"
+ RelativePath="..\..\Include\pyport.h"
>
</File>
<File
- RelativePath="..\Include\pystrcmp.h"
+ RelativePath="..\..\Include\pystate.h"
>
</File>
<File
- RelativePath="..\Include\pystrtod.h"
+ RelativePath="..\..\Include\pystrcmp.h"
>
</File>
<File
- RelativePath="..\Include\dtoa.h"
+ RelativePath="..\..\Include\pystrtod.h"
>
</File>
<File
- RelativePath="..\Include\Python-ast.h"
+ RelativePath="..\..\Include\dtoa.h"
>
</File>
<File
- RelativePath="..\Include\Python.h"
+ RelativePath="..\..\Include\Python-ast.h"
>
</File>
<File
- RelativePath="..\Include\pythonrun.h"
+ RelativePath="..\..\Include\Python.h"
>
</File>
<File
- RelativePath="..\Include\pythread.h"
+ RelativePath="..\..\Include\pythonrun.h"
>
</File>
<File
- RelativePath="..\Include\rangeobject.h"
+ RelativePath="..\..\Include\pythread.h"
>
</File>
<File
- RelativePath="..\Include\setobject.h"
+ RelativePath="..\..\Include\rangeobject.h"
>
</File>
<File
- RelativePath="..\Include\sliceobject.h"
+ RelativePath="..\..\Include\setobject.h"
>
</File>
<File
- RelativePath="..\Include\structmember.h"
+ RelativePath="..\..\Include\sliceobject.h"
>
</File>
<File
- RelativePath="..\Include\structseq.h"
+ RelativePath="..\..\Include\structmember.h"
>
</File>
<File
- RelativePath="..\Include\symtable.h"
+ RelativePath="..\..\Include\structseq.h"
>
</File>
<File
- RelativePath="..\Include\sysmodule.h"
+ RelativePath="..\..\Include\symtable.h"
>
</File>
<File
- RelativePath="..\Include\timefuncs.h"
+ RelativePath="..\..\Include\sysmodule.h"
>
</File>
<File
- RelativePath="..\Include\token.h"
+ RelativePath="..\..\Include\timefuncs.h"
>
</File>
<File
- RelativePath="..\Include\traceback.h"
+ RelativePath="..\..\Include\token.h"
>
</File>
<File
- RelativePath="..\Include\tupleobject.h"
+ RelativePath="..\..\Include\traceback.h"
>
</File>
<File
- RelativePath="..\Include\ucnhash.h"
+ RelativePath="..\..\Include\tupleobject.h"
>
</File>
<File
- RelativePath="..\Include\unicodeobject.h"
+ RelativePath="..\..\Include\ucnhash.h"
>
</File>
<File
- RelativePath="..\Include\weakrefobject.h"
+ RelativePath="..\..\Include\unicodeobject.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Include\weakrefobject.h"
>
</File>
</Filter>
@@ -991,222 +995,222 @@
Name="Modules"
>
<File
- RelativePath="..\Modules\_bisectmodule.c"
+ RelativePath="..\..\Modules\_bisectmodule.c"
>
</File>
<File
- RelativePath="..\Modules\_codecsmodule.c"
+ RelativePath="..\..\Modules\_codecsmodule.c"
>
</File>
<File
- RelativePath="..\Modules\_collectionsmodule.c"
+ RelativePath="..\..\Modules\_collectionsmodule.c"
>
</File>
<File
- RelativePath="..\Modules\_csv.c"
+ RelativePath="..\..\Modules\_csv.c"
>
</File>
<File
- RelativePath="..\Modules\_functoolsmodule.c"
+ RelativePath="..\..\Modules\_functoolsmodule.c"
>
</File>
<File
- RelativePath="..\Modules\_heapqmodule.c"
+ RelativePath="..\..\Modules\_heapqmodule.c"
>
</File>
<File
- RelativePath="..\Modules\_json.c"
+ RelativePath="..\..\Modules\_json.c"
>
</File>
<File
- RelativePath="..\Modules\_localemodule.c"
+ RelativePath="..\..\Modules\_localemodule.c"
>
</File>
<File
- RelativePath="..\Modules\_lsprof.c"
+ RelativePath="..\..\Modules\_lsprof.c"
>
</File>
<File
- RelativePath="..\Modules\_math.c"
+ RelativePath="..\..\Modules\_math.c"
>
</File>
<File
- RelativePath="..\Modules\_math.h"
+ RelativePath="..\..\Modules\_math.h"
>
</File>
<File
- RelativePath="..\Modules\_pickle.c"
+ RelativePath="..\..\Modules\_pickle.c"
>
</File>
<File
- RelativePath="..\Modules\_randommodule.c"
+ RelativePath="..\..\Modules\_randommodule.c"
>
</File>
<File
- RelativePath="..\Modules\_sre.c"
+ RelativePath="..\..\Modules\_sre.c"
>
</File>
<File
- RelativePath="..\Modules\_struct.c"
+ RelativePath="..\..\Modules\_struct.c"
>
</File>
<File
- RelativePath="..\Modules\_time.c"
+ RelativePath="..\..\Modules\_weakref.c"
>
</File>
<File
- RelativePath="..\Modules\_time.h"
+ RelativePath="..\..\Modules\_winapi.c"
>
</File>
<File
- RelativePath="..\Modules\_weakref.c"
+ RelativePath="..\..\Modules\arraymodule.c"
>
</File>
<File
- RelativePath="..\Modules\arraymodule.c"
+ RelativePath="..\..\Modules\atexitmodule.c"
>
</File>
<File
- RelativePath="..\Modules\atexitmodule.c"
+ RelativePath="..\..\Modules\audioop.c"
>
</File>
<File
- RelativePath="..\Modules\audioop.c"
+ RelativePath="..\..\Modules\binascii.c"
>
</File>
<File
- RelativePath="..\Modules\binascii.c"
+ RelativePath="..\..\Modules\cmathmodule.c"
>
</File>
<File
- RelativePath="..\Modules\cmathmodule.c"
+ RelativePath="..\..\Modules\_datetimemodule.c"
>
</File>
<File
- RelativePath="..\Modules\_datetimemodule.c"
+ RelativePath="..\..\Modules\errnomodule.c"
>
</File>
<File
- RelativePath="..\Modules\errnomodule.c"
+ RelativePath="..\..\Modules\faulthandler.c"
>
</File>
<File
- RelativePath="..\Modules\gcmodule.c"
+ RelativePath="..\..\Modules\gcmodule.c"
>
</File>
<File
- RelativePath="..\Modules\itertoolsmodule.c"
+ RelativePath="..\..\Modules\itertoolsmodule.c"
>
</File>
<File
- RelativePath="..\Modules\main.c"
+ RelativePath="..\..\Modules\main.c"
>
</File>
<File
- RelativePath="..\Modules\mathmodule.c"
+ RelativePath="..\..\Modules\mathmodule.c"
>
</File>
<File
- RelativePath="..\Modules\md5module.c"
+ RelativePath="..\..\Modules\md5module.c"
>
</File>
<File
- RelativePath="..\Modules\mmapmodule.c"
+ RelativePath="..\..\Modules\mmapmodule.c"
>
</File>
<File
- RelativePath="..\Modules\operator.c"
+ RelativePath="..\..\Modules\operator.c"
>
</File>
<File
- RelativePath="..\Modules\parsermodule.c"
+ RelativePath="..\..\Modules\parsermodule.c"
>
</File>
<File
- RelativePath="..\Modules\posixmodule.c"
+ RelativePath="..\..\Modules\posixmodule.c"
>
</File>
<File
- RelativePath="..\Modules\rotatingtree.c"
+ RelativePath="..\..\Modules\rotatingtree.c"
>
</File>
<File
- RelativePath="..\Modules\rotatingtree.h"
+ RelativePath="..\..\Modules\rotatingtree.h"
>
</File>
<File
- RelativePath="..\Modules\sha1module.c"
+ RelativePath="..\..\Modules\sha1module.c"
>
</File>
<File
- RelativePath="..\Modules\sha256module.c"
+ RelativePath="..\..\Modules\sha256module.c"
>
</File>
<File
- RelativePath="..\Modules\sha512module.c"
+ RelativePath="..\..\Modules\sha512module.c"
>
</File>
<File
- RelativePath="..\Modules\signalmodule.c"
+ RelativePath="..\..\Modules\signalmodule.c"
>
</File>
<File
- RelativePath="..\Modules\symtablemodule.c"
+ RelativePath="..\..\Modules\symtablemodule.c"
>
</File>
<File
- RelativePath="..\Modules\_threadmodule.c"
+ RelativePath="..\..\Modules\_threadmodule.c"
>
</File>
<File
- RelativePath="..\Modules\timemodule.c"
+ RelativePath="..\..\Modules\timemodule.c"
>
</File>
<File
- RelativePath="..\Modules\xxsubtype.c"
+ RelativePath="..\..\Modules\xxsubtype.c"
>
</File>
<File
- RelativePath="..\Modules\zipimport.c"
+ RelativePath="..\..\Modules\zipimport.c"
>
</File>
<File
- RelativePath="..\Modules\zlibmodule.c"
+ RelativePath="..\..\Modules\zlibmodule.c"
>
</File>
<Filter
Name="_io"
>
<File
- RelativePath="..\Modules\_io\fileio.c"
+ RelativePath="..\..\Modules\_io\fileio.c"
>
</File>
<File
- RelativePath="..\Modules\_io\bytesio.c"
+ RelativePath="..\..\Modules\_io\bytesio.c"
>
</File>
<File
- RelativePath="..\Modules\_io\stringio.c"
+ RelativePath="..\..\Modules\_io\stringio.c"
>
</File>
<File
- RelativePath="..\Modules\_io\bufferedio.c"
+ RelativePath="..\..\Modules\_io\bufferedio.c"
>
</File>
<File
- RelativePath="..\Modules\_io\iobase.c"
+ RelativePath="..\..\Modules\_io\iobase.c"
>
</File>
<File
- RelativePath="..\Modules\_io\textio.c"
+ RelativePath="..\..\Modules\_io\textio.c"
>
</File>
<File
- RelativePath="..\Modules\_io\_iomodule.c"
+ RelativePath="..\..\Modules\_io\_iomodule.c"
>
</File>
<File
- RelativePath="..\Modules\_io\_iomodule.h"
+ RelativePath="..\..\Modules\_io\_iomodule.h"
>
</File>
</Filter>
@@ -1214,31 +1218,31 @@
Name="zlib"
>
<File
- RelativePath="..\Modules\zlib\adler32.c"
+ RelativePath="..\..\Modules\zlib\adler32.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\compress.c"
+ RelativePath="..\..\Modules\zlib\compress.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\crc32.c"
+ RelativePath="..\..\Modules\zlib\crc32.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\crc32.h"
+ RelativePath="..\..\Modules\zlib\crc32.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\deflate.c"
+ RelativePath="..\..\Modules\zlib\deflate.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\deflate.h"
+ RelativePath="..\..\Modules\zlib\deflate.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\gzio.c"
+ RelativePath="..\..\Modules\zlib\gzio.c"
>
<FileConfiguration
Name="Release|Win32"
@@ -1306,67 +1310,67 @@
</FileConfiguration>
</File>
<File
- RelativePath="..\Modules\zlib\infback.c"
+ RelativePath="..\..\Modules\zlib\infback.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inffast.c"
+ RelativePath="..\..\Modules\zlib\inffast.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inffast.h"
+ RelativePath="..\..\Modules\zlib\inffast.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\inffixed.h"
+ RelativePath="..\..\Modules\zlib\inffixed.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\inflate.c"
+ RelativePath="..\..\Modules\zlib\inflate.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inflate.h"
+ RelativePath="..\..\Modules\zlib\inflate.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\inftrees.c"
+ RelativePath="..\..\Modules\zlib\inftrees.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\inftrees.h"
+ RelativePath="..\..\Modules\zlib\inftrees.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\trees.c"
+ RelativePath="..\..\Modules\zlib\trees.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\trees.h"
+ RelativePath="..\..\Modules\zlib\trees.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\uncompr.c"
+ RelativePath="..\..\Modules\zlib\uncompr.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\zconf.h"
+ RelativePath="..\..\Modules\zlib\zconf.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\zconf.in.h"
+ RelativePath="..\..\Modules\zlib\zconf.in.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\zlib.h"
+ RelativePath="..\..\Modules\zlib\zlib.h"
>
</File>
<File
- RelativePath="..\Modules\zlib\zutil.c"
+ RelativePath="..\..\Modules\zlib\zutil.c"
>
</File>
<File
- RelativePath="..\Modules\zlib\zutil.h"
+ RelativePath="..\..\Modules\zlib\zutil.h"
>
</File>
</Filter>
@@ -1374,71 +1378,71 @@
Name="cjkcodecs"
>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_cn.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_cn.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_hk.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_hk.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_iso2022.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_iso2022.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_jp.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_jp.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_kr.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_kr.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\_codecs_tw.c"
+ RelativePath="..\..\Modules\cjkcodecs\_codecs_tw.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\alg_jisx0201.h"
+ RelativePath="..\..\Modules\cjkcodecs\alg_jisx0201.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\cjkcodecs.h"
+ RelativePath="..\..\Modules\cjkcodecs\cjkcodecs.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\emu_jisx0213_2000.h"
+ RelativePath="..\..\Modules\cjkcodecs\emu_jisx0213_2000.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_cn.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_cn.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_hk.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_hk.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_jisx0213_pair.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_jisx0213_pair.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_jp.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_jp.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_kr.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_kr.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\mappings_tw.h"
+ RelativePath="..\..\Modules\cjkcodecs\mappings_tw.h"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\multibytecodec.c"
+ RelativePath="..\..\Modules\cjkcodecs\multibytecodec.c"
>
</File>
<File
- RelativePath="..\Modules\cjkcodecs\multibytecodec.h"
+ RelativePath="..\..\Modules\cjkcodecs\multibytecodec.h"
>
</File>
</Filter>
@@ -1447,175 +1451,179 @@
Name="Objects"
>
<File
- RelativePath="..\Objects\abstract.c"
+ RelativePath="..\..\Objects\abstract.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Objects\accu.c"
>
</File>
<File
- RelativePath="..\Objects\accu.c"
+ RelativePath="..\..\Objects\boolobject.c"
>
</File>
<File
- RelativePath="..\Objects\boolobject.c"
+ RelativePath="..\..\Objects\bytes_methods.c"
>
</File>
<File
- RelativePath="..\Objects\bytes_methods.c"
+ RelativePath="..\..\Objects\bytearrayobject.c"
>
</File>
<File
- RelativePath="..\Objects\bytearrayobject.c"
+ RelativePath="..\..\Objects\bytesobject.c"
>
</File>
<File
- RelativePath="..\Objects\bytesobject.c"
+ RelativePath="..\..\Objects\capsule.c"
>
</File>
<File
- RelativePath="..\Objects\capsule.c"
+ RelativePath="..\..\Objects\cellobject.c"
>
</File>
<File
- RelativePath="..\Objects\cellobject.c"
+ RelativePath="..\..\Objects\classobject.c"
>
</File>
<File
- RelativePath="..\Objects\classobject.c"
+ RelativePath="..\..\Objects\codeobject.c"
>
</File>
<File
- RelativePath="..\Objects\codeobject.c"
+ RelativePath="..\..\Objects\complexobject.c"
>
</File>
<File
- RelativePath="..\Objects\complexobject.c"
+ RelativePath="..\..\Objects\stringlib\count.h"
>
</File>
<File
- RelativePath="..\Objects\stringlib\count.h"
+ RelativePath="..\..\Objects\descrobject.c"
>
</File>
<File
- RelativePath="..\Objects\descrobject.c"
+ RelativePath="..\..\Objects\dictobject.c"
>
</File>
<File
- RelativePath="..\Objects\dictobject.c"
+ RelativePath="..\..\Objects\enumobject.c"
>
</File>
<File
- RelativePath="..\Objects\enumobject.c"
+ RelativePath="..\..\Objects\exceptions.c"
>
</File>
<File
- RelativePath="..\Objects\exceptions.c"
+ RelativePath="..\..\Objects\stringlib\fastsearch.h"
>
</File>
<File
- RelativePath="..\Objects\stringlib\fastsearch.h"
+ RelativePath="..\..\Objects\fileobject.c"
>
</File>
<File
- RelativePath="..\Objects\fileobject.c"
+ RelativePath="..\..\Objects\stringlib\find.h"
>
</File>
<File
- RelativePath="..\Objects\stringlib\find.h"
+ RelativePath="..\..\Objects\floatobject.c"
>
</File>
<File
- RelativePath="..\Objects\floatobject.c"
+ RelativePath="..\..\Objects\frameobject.c"
>
</File>
<File
- RelativePath="..\Objects\frameobject.c"
+ RelativePath="..\..\Objects\funcobject.c"
>
</File>
<File
- RelativePath="..\Objects\funcobject.c"
+ RelativePath="..\..\Objects\genobject.c"
>
</File>
<File
- RelativePath="..\Objects\genobject.c"
+ RelativePath="..\..\Objects\iterobject.c"
>
</File>
<File
- RelativePath="..\Objects\iterobject.c"
+ RelativePath="..\..\Objects\listobject.c"
>
</File>
<File
- RelativePath="..\Objects\listobject.c"
+ RelativePath="..\..\Objects\longobject.c"
>
</File>
<File
- RelativePath="..\Objects\longobject.c"
+ RelativePath="..\..\Objects\memoryobject.c"
>
</File>
<File
- RelativePath="..\Objects\memoryobject.c"
+ RelativePath="..\..\Objects\methodobject.c"
>
</File>
<File
- RelativePath="..\Objects\methodobject.c"
+ RelativePath="..\..\Objects\moduleobject.c"
>
</File>
<File
- RelativePath="..\Objects\moduleobject.c"
+ RelativePath="..\..\Objects\namespaceobject.c"
>
</File>
<File
- RelativePath="..\Objects\object.c"
+ RelativePath="..\..\Objects\object.c"
>
</File>
<File
- RelativePath="..\Objects\obmalloc.c"
+ RelativePath="..\..\Objects\obmalloc.c"
>
</File>
<File
- RelativePath="..\Objects\stringlib\partition.h"
+ RelativePath="..\..\Objects\stringlib\partition.h"
>
</File>
<File
- RelativePath="..\Objects\rangeobject.c"
+ RelativePath="..\..\Objects\rangeobject.c"
>
</File>
<File
- RelativePath="..\Objects\setobject.c"
+ RelativePath="..\..\Objects\setobject.c"
>
</File>
<File
- RelativePath="..\Objects\sliceobject.c"
+ RelativePath="..\..\Objects\sliceobject.c"
>
</File>
<File
- RelativePath="..\Objects\stringlib\split.h"
+ RelativePath="..\..\Objects\stringlib\split.h"
>
</File>
<File
- RelativePath="..\Objects\structseq.c"
+ RelativePath="..\..\Objects\structseq.c"
>
</File>
<File
- RelativePath="..\Objects\tupleobject.c"
+ RelativePath="..\..\Objects\tupleobject.c"
>
</File>
<File
- RelativePath="..\Objects\typeobject.c"
+ RelativePath="..\..\Objects\typeobject.c"
>
</File>
<File
- RelativePath="..\Objects\unicodectype.c"
+ RelativePath="..\..\Objects\unicodectype.c"
>
</File>
<File
- RelativePath="..\Objects\unicodeobject.c"
+ RelativePath="..\..\Objects\unicodeobject.c"
>
</File>
<File
- RelativePath="..\Objects\unicodetype_db.h"
+ RelativePath="..\..\Objects\unicodetype_db.h"
>
</File>
<File
- RelativePath="..\Objects\weakrefobject.c"
+ RelativePath="..\..\Objects\weakrefobject.c"
>
</File>
</Filter>
@@ -1623,59 +1631,59 @@
Name="Parser"
>
<File
- RelativePath="..\Parser\acceler.c"
+ RelativePath="..\..\Parser\acceler.c"
>
</File>
<File
- RelativePath="..\Parser\bitset.c"
+ RelativePath="..\..\Parser\bitset.c"
>
</File>
<File
- RelativePath="..\Parser\firstsets.c"
+ RelativePath="..\..\Parser\firstsets.c"
>
</File>
<File
- RelativePath="..\Parser\grammar.c"
+ RelativePath="..\..\Parser\grammar.c"
>
</File>
<File
- RelativePath="..\Parser\grammar1.c"
+ RelativePath="..\..\Parser\grammar1.c"
>
</File>
<File
- RelativePath="..\Parser\listnode.c"
+ RelativePath="..\..\Parser\listnode.c"
>
</File>
<File
- RelativePath="..\Parser\metagrammar.c"
+ RelativePath="..\..\Parser\metagrammar.c"
>
</File>
<File
- RelativePath="..\Parser\myreadline.c"
+ RelativePath="..\..\Parser\myreadline.c"
>
</File>
<File
- RelativePath="..\Parser\node.c"
+ RelativePath="..\..\Parser\node.c"
>
</File>
<File
- RelativePath="..\Parser\parser.c"
+ RelativePath="..\..\Parser\parser.c"
>
</File>
<File
- RelativePath="..\Parser\parser.h"
+ RelativePath="..\..\Parser\parser.h"
>
</File>
<File
- RelativePath="..\Parser\parsetok.c"
+ RelativePath="..\..\Parser\parsetok.c"
>
</File>
<File
- RelativePath="..\Parser\tokenizer.c"
+ RelativePath="..\..\Parser\tokenizer.c"
>
</File>
<File
- RelativePath="..\Parser\tokenizer.h"
+ RelativePath="..\..\Parser\tokenizer.h"
>
</File>
</Filter>
@@ -1683,39 +1691,31 @@
Name="PC"
>
<File
- RelativePath="..\PC\_subprocess.c"
- >
- </File>
- <File
- RelativePath="..\PC\winreg.c"
- >
- </File>
- <File
- RelativePath="..\PC\config.c"
+ RelativePath="..\..\PC\winreg.c"
>
</File>
<File
- RelativePath="..\PC\dl_nt.c"
+ RelativePath="..\..\PC\config.c"
>
</File>
<File
- RelativePath="..\PC\errmap.h"
+ RelativePath="..\..\PC\dl_nt.c"
>
</File>
<File
- RelativePath="..\PC\getpathp.c"
+ RelativePath="..\..\PC\errmap.h"
>
</File>
<File
- RelativePath="..\PC\import_nt.c"
+ RelativePath="..\..\PC\getpathp.c"
>
</File>
<File
- RelativePath="..\PC\msvcrtmodule.c"
+ RelativePath="..\..\PC\msvcrtmodule.c"
>
</File>
<File
- RelativePath="..\PC\pyconfig.h"
+ RelativePath="..\..\PC\pyconfig.h"
>
</File>
</Filter>
@@ -1723,191 +1723,191 @@
Name="Python"
>
<File
- RelativePath="..\Python\_warnings.c"
+ RelativePath="..\..\Python\_warnings.c"
>
</File>
<File
- RelativePath="..\Python\asdl.c"
+ RelativePath="..\..\Python\asdl.c"
>
</File>
<File
- RelativePath="..\Python\ast.c"
+ RelativePath="..\..\Python\ast.c"
>
</File>
<File
- RelativePath="..\Python\bltinmodule.c"
+ RelativePath="..\..\Python\bltinmodule.c"
>
</File>
<File
- RelativePath="..\Python\ceval.c"
+ RelativePath="..\..\Python\ceval.c"
>
</File>
<File
- RelativePath="..\Python\codecs.c"
+ RelativePath="..\..\Python\codecs.c"
>
</File>
<File
- RelativePath="..\Python\compile.c"
+ RelativePath="..\..\Python\compile.c"
>
</File>
<File
- RelativePath="..\Python\dynamic_annotations.c"
+ RelativePath="..\..\Python\dynamic_annotations.c"
>
</File>
<File
- RelativePath="..\Python\dynload_win.c"
+ RelativePath="..\..\Python\dynload_win.c"
>
</File>
<File
- RelativePath="..\Python\errors.c"
+ RelativePath="..\..\Python\errors.c"
>
</File>
<File
- RelativePath="..\Python\fileutils.c"
+ RelativePath="..\..\Python\fileutils.c"
>
</File>
<File
- RelativePath="..\Python\formatter_unicode.c"
+ RelativePath="..\..\Python\formatter_unicode.c"
>
</File>
<File
- RelativePath="..\Python\frozen.c"
+ RelativePath="..\..\Python\frozen.c"
>
</File>
<File
- RelativePath="..\Python\future.c"
+ RelativePath="..\..\Python\future.c"
>
</File>
<File
- RelativePath="..\Python\getargs.c"
+ RelativePath="..\..\Python\getargs.c"
>
</File>
<File
- RelativePath="..\Python\getcompiler.c"
+ RelativePath="..\..\Python\getcompiler.c"
>
</File>
<File
- RelativePath="..\Python\getcopyright.c"
+ RelativePath="..\..\Python\getcopyright.c"
>
</File>
<File
- RelativePath="..\Python\getopt.c"
+ RelativePath="..\..\Python\getopt.c"
>
</File>
<File
- RelativePath="..\Python\getplatform.c"
+ RelativePath="..\..\Python\getplatform.c"
>
</File>
<File
- RelativePath="..\Python\getversion.c"
+ RelativePath="..\..\Python\getversion.c"
>
</File>
<File
- RelativePath="..\Python\graminit.c"
+ RelativePath="..\..\Python\graminit.c"
>
</File>
<File
- RelativePath="..\Python\import.c"
+ RelativePath="..\..\Python\import.c"
>
</File>
<File
- RelativePath="..\Python\importdl.c"
+ RelativePath="..\..\Python\importdl.c"
>
</File>
<File
- RelativePath="..\Python\importdl.h"
+ RelativePath="..\..\Python\importdl.h"
>
</File>
<File
- RelativePath="..\Python\marshal.c"
+ RelativePath="..\..\Python\marshal.c"
>
</File>
<File
- RelativePath="..\Python\modsupport.c"
+ RelativePath="..\..\Python\modsupport.c"
>
</File>
<File
- RelativePath="..\Python\mysnprintf.c"
+ RelativePath="..\..\Python\mysnprintf.c"
>
</File>
<File
- RelativePath="..\Python\mystrtoul.c"
+ RelativePath="..\..\Python\mystrtoul.c"
>
</File>
<File
- RelativePath="..\Python\peephole.c"
+ RelativePath="..\..\Python\peephole.c"
>
</File>
<File
- RelativePath="..\Python\pyarena.c"
+ RelativePath="..\..\Python\pyarena.c"
>
</File>
<File
- RelativePath="..\Python\pyctype.c"
+ RelativePath="..\..\Python\pyctype.c"
>
</File>
<File
- RelativePath="..\Python\pyfpe.c"
+ RelativePath="..\..\Python\pyfpe.c"
>
</File>
<File
- RelativePath="..\Python\pymath.c"
+ RelativePath="..\..\Python\pymath.c"
>
</File>
<File
- RelativePath="..\Python\pytime.c"
+ RelativePath="..\..\Python\pytime.c"
>
</File>
<File
- RelativePath="..\Python\pystate.c"
+ RelativePath="..\..\Python\pystate.c"
>
</File>
<File
- RelativePath="..\Python\pystrcmp.c"
+ RelativePath="..\..\Python\pystrcmp.c"
>
</File>
<File
- RelativePath="..\Python\pystrtod.c"
+ RelativePath="..\..\Python\pystrtod.c"
>
</File>
<File
- RelativePath="..\Python\dtoa.c"
+ RelativePath="..\..\Python\dtoa.c"
>
</File>
<File
- RelativePath="..\Python\Python-ast.c"
+ RelativePath="..\..\Python\Python-ast.c"
>
</File>
<File
- RelativePath="..\Python\pythonrun.c"
+ RelativePath="..\..\Python\pythonrun.c"
>
</File>
<File
- RelativePath="..\Python\random.c"
+ RelativePath="..\..\Python\random.c"
>
</File>
<File
- RelativePath="..\Python\structmember.c"
+ RelativePath="..\..\Python\structmember.c"
>
</File>
<File
- RelativePath="..\Python\symtable.c"
+ RelativePath="..\..\Python\symtable.c"
>
</File>
<File
- RelativePath="..\Python\sysmodule.c"
+ RelativePath="..\..\Python\sysmodule.c"
>
</File>
<File
- RelativePath="..\Python\thread.c"
+ RelativePath="..\..\Python\thread.c"
>
</File>
<File
- RelativePath="..\Python\thread_nt.h"
+ RelativePath="..\..\Python\thread_nt.h"
>
</File>
<File
- RelativePath="..\Python\traceback.c"
+ RelativePath="..\..\Python\traceback.c"
>
</File>
</Filter>
@@ -1915,7 +1915,7 @@
Name="Resource Files"
>
<File
- RelativePath="..\PC\python_nt.rc"
+ RelativePath="..\..\PC\python_nt.rc"
>
</File>
</Filter>
diff --git a/PCbuild/pythonw.vcproj b/PC/VS9.0/pythonw.vcproj
index 7ae562a..7f5c04b 100644
--- a/PCbuild/pythonw.vcproj
+++ b/PC/VS9.0/pythonw.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="pythonw"
ProjectGUID="{F4229CC3-873C-49AE-9729-DD308ED4CD4A}"
TargetFrameworkVersion="131072"
@@ -600,7 +600,7 @@
Name="Resource Files"
>
<File
- RelativePath="..\PC\python_exe.rc"
+ RelativePath="..\..\PC\python_exe.rc"
>
</File>
</Filter>
@@ -608,7 +608,7 @@
Name="Source Files"
>
<File
- RelativePath="..\PC\WinMain.c"
+ RelativePath="..\..\PC\WinMain.c"
>
</File>
</Filter>
diff --git a/PCbuild/release.vsprops b/PC/VS9.0/release.vsprops
index 08def90..08def90 100644
--- a/PCbuild/release.vsprops
+++ b/PC/VS9.0/release.vsprops
diff --git a/PCbuild/select.vcproj b/PC/VS9.0/select.vcproj
index 02e0a2f..637fd97 100644
--- a/PCbuild/select.vcproj
+++ b/PC/VS9.0/select.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="select"
ProjectGUID="{18CAE28C-B454-46C1-87A0-493D91D97F03}"
RootNamespace="select"
@@ -527,7 +527,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\selectmodule.c"
+ RelativePath="..\..\Modules\selectmodule.c"
>
</File>
</Filter>
diff --git a/PCbuild/sqlite3.vcproj b/PC/VS9.0/sqlite3.vcproj
index e1771f4..ef8c328 100644
--- a/PCbuild/sqlite3.vcproj
+++ b/PC/VS9.0/sqlite3.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="sqlite3"
ProjectGUID="{A1A295E5-463C-437F-81CA-1F32367685DA}"
RootNamespace="sqlite3"
diff --git a/PCbuild/sqlite3.vsprops b/PC/VS9.0/sqlite3.vsprops
index b502df5..b502df5 100644
--- a/PCbuild/sqlite3.vsprops
+++ b/PC/VS9.0/sqlite3.vsprops
diff --git a/PCbuild/ssl.vcproj b/PC/VS9.0/ssl.vcproj
index ec2be30..d30e877 100644
--- a/PCbuild/ssl.vcproj
+++ b/PC/VS9.0/ssl.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="ssl"
ProjectGUID="{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}"
RootNamespace="ssl"
diff --git a/PCbuild/unicodedata.vcproj b/PC/VS9.0/unicodedata.vcproj
index 59682a1..b66ff72 100644
--- a/PCbuild/unicodedata.vcproj
+++ b/PC/VS9.0/unicodedata.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="unicodedata"
ProjectGUID="{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}"
RootNamespace="unicodedata"
@@ -511,11 +511,11 @@
Name="Header Files"
>
<File
- RelativePath="..\Modules\unicodedata_db.h"
+ RelativePath="..\..\Modules\unicodedata_db.h"
>
</File>
<File
- RelativePath="..\Modules\unicodename_db.h"
+ RelativePath="..\..\Modules\unicodename_db.h"
>
</File>
</Filter>
@@ -523,7 +523,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\unicodedata.c"
+ RelativePath="..\..\Modules\unicodedata.c"
>
</File>
</Filter>
diff --git a/PCbuild/w9xpopen.vcproj b/PC/VS9.0/w9xpopen.vcproj
index 05d8f81..7a85b00 100644
--- a/PCbuild/w9xpopen.vcproj
+++ b/PC/VS9.0/w9xpopen.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="w9xpopen"
ProjectGUID="{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
RootNamespace="w9xpopen"
@@ -566,7 +566,7 @@
Name="Source Files"
>
<File
- RelativePath="..\PC\w9xpopen.c"
+ RelativePath="..\..\PC\w9xpopen.c"
>
</File>
</Filter>
diff --git a/PCbuild/winsound.vcproj b/PC/VS9.0/winsound.vcproj
index 69470cc..47dbf29 100644
--- a/PCbuild/winsound.vcproj
+++ b/PC/VS9.0/winsound.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="winsound"
ProjectGUID="{28B5D777-DDF2-4B6B-B34F-31D938813856}"
RootNamespace="winsound"
@@ -513,7 +513,7 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\PC\winsound.c"
+ RelativePath="..\..\PC\winsound.c"
>
</File>
</Filter>
diff --git a/PCbuild/x64.vsprops b/PC/VS9.0/x64.vsprops
index 9f88d44..9f88d44 100644
--- a/PCbuild/x64.vsprops
+++ b/PC/VS9.0/x64.vsprops
diff --git a/PCbuild/xxlimited.vcproj b/PC/VS9.0/xxlimited.vcproj
index 6da2016..a3aaad6 100644
--- a/PCbuild/xxlimited.vcproj
+++ b/PC/VS9.0/xxlimited.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="9.00"
Name="xxlimited"
ProjectGUID="{F749B822-B489-4CA5-A3AD-CE078F5F338A}"
RootNamespace="xxlimited"
@@ -407,7 +407,7 @@
Name="Source Files"
>
<File
- RelativePath="..\Modules\xxlimited.c"
+ RelativePath="..\..\Modules\xxlimited.c"
>
</File>
</Filter>
diff --git a/PC/_msi.c b/PC/_msi.c
index d4d8483..0b5b94e 100644
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -18,7 +18,7 @@ static PyObject*
uuidcreate(PyObject* obj, PyObject*args)
{
UUID result;
- unsigned short *cresult;
+ wchar_t *cresult;
PyObject *oresult;
/* May return ok, local only, and no address.
@@ -35,7 +35,7 @@ uuidcreate(PyObject* obj, PyObject*args)
return NULL;
}
- oresult = PyUnicode_FromUnicode(cresult, wcslen(cresult));
+ oresult = PyUnicode_FromWideChar(cresult, wcslen(cresult));
RpcStringFreeW(&cresult);
return oresult;
@@ -122,7 +122,9 @@ static FNFCIGETTEMPFILE(cb_gettempfile)
static FNFCISTATUS(cb_status)
{
if (pv) {
- PyObject *result = PyObject_CallMethod(pv, "status", "iii", typeStatus, cb1, cb2);
+ _Py_IDENTIFIER(status);
+
+ PyObject *result = _PyObject_CallMethodId(pv, &PyId_status, "iii", typeStatus, cb1, cb2);
if (result == NULL)
return -1;
Py_DECREF(result);
@@ -133,7 +135,9 @@ static FNFCISTATUS(cb_status)
static FNFCIGETNEXTCABINET(cb_getnextcabinet)
{
if (pv) {
- PyObject *result = PyObject_CallMethod(pv, "getnextcabinet", "i", pccab->iCab);
+ _Py_IDENTIFIER(getnextcabinet);
+
+ PyObject *result = _PyObject_CallMethodId(pv, &PyId_getnextcabinet, "i", pccab->iCab);
if (result == NULL)
return -1;
if (!PyBytes_Check(result)) {
@@ -375,7 +379,7 @@ record_getstring(msiobj* record, PyObject* args)
}
if (status != ERROR_SUCCESS)
return msierror((int) status);
- string = PyUnicode_FromUnicode(res, size);
+ string = PyUnicode_FromWideChar(res, size);
if (buf != res)
free(res);
return string;
@@ -397,7 +401,7 @@ record_setstring(msiobj* record, PyObject *args)
{
int status;
int field;
- Py_UNICODE *data;
+ wchar_t *data;
if (!PyArg_ParseTuple(args, "iu:SetString", &field, &data))
return NULL;
@@ -414,7 +418,7 @@ record_setstream(msiobj* record, PyObject *args)
{
int status;
int field;
- Py_UNICODE *data;
+ wchar_t *data;
if (!PyArg_ParseTuple(args, "iu:SetStream", &field, &data))
return NULL;
diff --git a/PC/_subprocess.c b/PC/_subprocess.c
deleted file mode 100644
index f9a79a7..0000000
--- a/PC/_subprocess.c
+++ /dev/null
@@ -1,690 +0,0 @@
-/*
- * support routines for subprocess module
- *
- * Currently, this extension module is only required when using the
- * subprocess module on Windows, but in the future, stubs for other
- * platforms might be added here as well.
- *
- * Copyright (c) 2004 by Fredrik Lundh <fredrik@pythonware.com>
- * Copyright (c) 2004 by Secret Labs AB, http://www.pythonware.com
- * Copyright (c) 2004 by Peter Astrand <astrand@lysator.liu.se>
- *
- * By obtaining, using, and/or copying this software and/or its
- * associated documentation, you agree that you have read, understood,
- * and will comply with the following terms and conditions:
- *
- * Permission to use, copy, modify, and distribute this software and
- * its associated documentation for any purpose and without fee is
- * hereby granted, provided that the above copyright notice appears in
- * all copies, and that both that copyright notice and this permission
- * notice appear in supporting documentation, and that the name of the
- * authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission.
- *
- * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
- * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-/* Licensed to PSF under a Contributor Agreement. */
-/* See http://www.python.org/2.4/license for licensing details. */
-
-#include "Python.h"
-
-#define WINDOWS_LEAN_AND_MEAN
-#include "windows.h"
-
-/* -------------------------------------------------------------------- */
-/* handle wrapper. note that this library uses integers when passing
- handles to a function, and handle wrappers when returning handles.
- the wrapper is used to provide Detach and Close methods */
-
-typedef struct {
- PyObject_HEAD
- HANDLE handle;
-} sp_handle_object;
-
-static PyTypeObject sp_handle_type;
-
-static PyObject*
-sp_handle_new(HANDLE handle)
-{
- sp_handle_object* self;
-
- self = PyObject_NEW(sp_handle_object, &sp_handle_type);
- if (self == NULL)
- return NULL;
-
- self->handle = handle;
-
- return (PyObject*) self;
-}
-
-#if defined(MS_WIN32) && !defined(MS_WIN64)
-#define HANDLE_TO_PYNUM(handle) PyLong_FromLong((long) handle)
-#define PY_HANDLE_PARAM "l"
-#else
-#define HANDLE_TO_PYNUM(handle) PyLong_FromLongLong((long long) handle)
-#define PY_HANDLE_PARAM "L"
-#endif
-
-static PyObject*
-sp_handle_detach(sp_handle_object* self, PyObject* args)
-{
- HANDLE handle;
-
- if (! PyArg_ParseTuple(args, ":Detach"))
- return NULL;
-
- handle = self->handle;
-
- self->handle = INVALID_HANDLE_VALUE;
-
- /* note: return the current handle, as an integer */
- return HANDLE_TO_PYNUM(handle);
-}
-
-static PyObject*
-sp_handle_close(sp_handle_object* self, PyObject* args)
-{
- if (! PyArg_ParseTuple(args, ":Close"))
- return NULL;
-
- if (self->handle != INVALID_HANDLE_VALUE) {
- CloseHandle(self->handle);
- self->handle = INVALID_HANDLE_VALUE;
- }
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static void
-sp_handle_dealloc(sp_handle_object* self)
-{
- if (self->handle != INVALID_HANDLE_VALUE)
- CloseHandle(self->handle);
- PyObject_FREE(self);
-}
-
-static PyMethodDef sp_handle_methods[] = {
- {"Detach", (PyCFunction) sp_handle_detach, METH_VARARGS},
- {"Close", (PyCFunction) sp_handle_close, METH_VARARGS},
- {NULL, NULL}
-};
-
-static PyObject*
-sp_handle_as_int(sp_handle_object* self)
-{
- return HANDLE_TO_PYNUM(self->handle);
-}
-
-static PyNumberMethods sp_handle_as_number;
-
-static PyTypeObject sp_handle_type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_subprocess_handle", sizeof(sp_handle_object), 0,
- (destructor) sp_handle_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- &sp_handle_as_number, /*tp_as_number */
- 0, /*tp_as_sequence */
- 0, /*tp_as_mapping */
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- sp_handle_methods, /*tp_methods*/
-};
-
-/* -------------------------------------------------------------------- */
-/* windows API functions */
-
-PyDoc_STRVAR(GetStdHandle_doc,
-"GetStdHandle(handle) -> integer\n\
-\n\
-Return a handle to the specified standard device\n\
-(STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE).\n\
-The integer associated with the handle object is returned.");
-
-static PyObject *
-sp_GetStdHandle(PyObject* self, PyObject* args)
-{
- HANDLE handle;
- int std_handle;
-
- if (! PyArg_ParseTuple(args, "i:GetStdHandle", &std_handle))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- handle = GetStdHandle((DWORD) std_handle);
- Py_END_ALLOW_THREADS
-
- if (handle == INVALID_HANDLE_VALUE)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- if (! handle) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- /* note: returns integer, not handle object */
- return HANDLE_TO_PYNUM(handle);
-}
-
-PyDoc_STRVAR(GetCurrentProcess_doc,
-"GetCurrentProcess() -> handle\n\
-\n\
-Return a handle object for the current process.");
-
-static PyObject *
-sp_GetCurrentProcess(PyObject* self, PyObject* args)
-{
- if (! PyArg_ParseTuple(args, ":GetCurrentProcess"))
- return NULL;
-
- return sp_handle_new(GetCurrentProcess());
-}
-
-PyDoc_STRVAR(DuplicateHandle_doc,
-"DuplicateHandle(source_proc_handle, source_handle,\n\
- target_proc_handle, target_handle, access,\n\
- inherit[, options]) -> handle\n\
-\n\
-Return a duplicate handle object.\n\
-\n\
-The duplicate handle refers to the same object as the original\n\
-handle. Therefore, any changes to the object are reflected\n\
-through both handles.");
-
-static PyObject *
-sp_DuplicateHandle(PyObject* self, PyObject* args)
-{
- HANDLE target_handle;
- BOOL result;
-
- HANDLE source_process_handle;
- HANDLE source_handle;
- HANDLE target_process_handle;
- int desired_access;
- int inherit_handle;
- int options = 0;
-
- if (! PyArg_ParseTuple(args,
- PY_HANDLE_PARAM PY_HANDLE_PARAM PY_HANDLE_PARAM
- "ii|i:DuplicateHandle",
- &source_process_handle,
- &source_handle,
- &target_process_handle,
- &desired_access,
- &inherit_handle,
- &options))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- result = DuplicateHandle(
- source_process_handle,
- source_handle,
- target_process_handle,
- &target_handle,
- desired_access,
- inherit_handle,
- options
- );
- Py_END_ALLOW_THREADS
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return sp_handle_new(target_handle);
-}
-
-PyDoc_STRVAR(CreatePipe_doc,
-"CreatePipe(pipe_attrs, size) -> (read_handle, write_handle)\n\
-\n\
-Create an anonymous pipe, and return handles to the read and\n\
-write ends of the pipe.\n\
-\n\
-pipe_attrs is ignored internally and can be None.");
-
-static PyObject *
-sp_CreatePipe(PyObject* self, PyObject* args)
-{
- HANDLE read_pipe;
- HANDLE write_pipe;
- BOOL result;
-
- PyObject* pipe_attributes; /* ignored */
- int size;
-
- if (! PyArg_ParseTuple(args, "Oi:CreatePipe", &pipe_attributes, &size))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- result = CreatePipe(&read_pipe, &write_pipe, NULL, size);
- Py_END_ALLOW_THREADS
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return Py_BuildValue(
- "NN", sp_handle_new(read_pipe), sp_handle_new(write_pipe));
-}
-
-/* helpers for createprocess */
-
-static int
-getint(PyObject* obj, char* name)
-{
- PyObject* value;
- int ret;
-
- value = PyObject_GetAttrString(obj, name);
- if (! value) {
- PyErr_Clear(); /* FIXME: propagate error? */
- return 0;
- }
- ret = (int) PyLong_AsLong(value);
- Py_DECREF(value);
- return ret;
-}
-
-static HANDLE
-gethandle(PyObject* obj, char* name)
-{
- sp_handle_object* value;
- HANDLE ret;
-
- value = (sp_handle_object*) PyObject_GetAttrString(obj, name);
- if (! value) {
- PyErr_Clear(); /* FIXME: propagate error? */
- return NULL;
- }
- if (Py_TYPE(value) != &sp_handle_type)
- ret = NULL;
- else
- ret = value->handle;
- Py_DECREF(value);
- return ret;
-}
-
-static PyObject*
-getenvironment(PyObject* environment)
-{
- int i;
- Py_ssize_t envsize;
- PyObject* out = NULL;
- PyObject* keys;
- PyObject* values;
- Py_UNICODE* p;
-
- /* convert environment dictionary to windows enviroment string */
- if (! PyMapping_Check(environment)) {
- PyErr_SetString(
- PyExc_TypeError, "environment must be dictionary or None");
- return NULL;
- }
-
- envsize = PyMapping_Length(environment);
-
- keys = PyMapping_Keys(environment);
- values = PyMapping_Values(environment);
- if (!keys || !values)
- goto error;
-
- out = PyUnicode_FromUnicode(NULL, 2048);
- if (! out)
- goto error;
-
- p = PyUnicode_AS_UNICODE(out);
-
- for (i = 0; i < envsize; i++) {
- Py_ssize_t ksize, vsize, totalsize;
- PyObject* key = PyList_GET_ITEM(keys, i);
- PyObject* value = PyList_GET_ITEM(values, i);
-
- if (! PyUnicode_Check(key) || ! PyUnicode_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "environment can only contain strings");
- goto error;
- }
- ksize = PyUnicode_GET_SIZE(key);
- vsize = PyUnicode_GET_SIZE(value);
- totalsize = (p - PyUnicode_AS_UNICODE(out)) + ksize + 1 +
- vsize + 1 + 1;
- if (totalsize > PyUnicode_GET_SIZE(out)) {
- Py_ssize_t offset = p - PyUnicode_AS_UNICODE(out);
- PyUnicode_Resize(&out, totalsize + 1024);
- p = PyUnicode_AS_UNICODE(out) + offset;
- }
- Py_UNICODE_COPY(p, PyUnicode_AS_UNICODE(key), ksize);
- p += ksize;
- *p++ = '=';
- Py_UNICODE_COPY(p, PyUnicode_AS_UNICODE(value), vsize);
- p += vsize;
- *p++ = '\0';
- }
-
- /* add trailing null byte */
- *p++ = '\0';
- PyUnicode_Resize(&out, p - PyUnicode_AS_UNICODE(out));
-
- /* PyObject_Print(out, stdout, 0); */
-
- Py_XDECREF(keys);
- Py_XDECREF(values);
-
- return out;
-
- error:
- Py_XDECREF(out);
- Py_XDECREF(keys);
- Py_XDECREF(values);
- return NULL;
-}
-
-PyDoc_STRVAR(CreateProcess_doc,
-"CreateProcess(app_name, cmd_line, proc_attrs, thread_attrs,\n\
- inherit, flags, env_mapping, curdir,\n\
- startup_info) -> (proc_handle, thread_handle,\n\
- pid, tid)\n\
-\n\
-Create a new process and its primary thread. The return\n\
-value is a tuple of the process handle, thread handle,\n\
-process ID, and thread ID.\n\
-\n\
-proc_attrs and thread_attrs are ignored internally and can be None.");
-
-static PyObject *
-sp_CreateProcess(PyObject* self, PyObject* args)
-{
- BOOL result;
- PROCESS_INFORMATION pi;
- STARTUPINFOW si;
- PyObject* environment;
-
- Py_UNICODE* application_name;
- Py_UNICODE* command_line;
- PyObject* process_attributes; /* ignored */
- PyObject* thread_attributes; /* ignored */
- int inherit_handles;
- int creation_flags;
- PyObject* env_mapping;
- Py_UNICODE* current_directory;
- PyObject* startup_info;
-
- if (! PyArg_ParseTuple(args, "ZZOOiiOZO:CreateProcess",
- &application_name,
- &command_line,
- &process_attributes,
- &thread_attributes,
- &inherit_handles,
- &creation_flags,
- &env_mapping,
- &current_directory,
- &startup_info))
- return NULL;
-
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
-
- /* note: we only support a small subset of all SI attributes */
- si.dwFlags = getint(startup_info, "dwFlags");
- si.wShowWindow = getint(startup_info, "wShowWindow");
- si.hStdInput = gethandle(startup_info, "hStdInput");
- si.hStdOutput = gethandle(startup_info, "hStdOutput");
- si.hStdError = gethandle(startup_info, "hStdError");
-
- if (PyErr_Occurred())
- return NULL;
-
- if (env_mapping == Py_None)
- environment = NULL;
- else {
- environment = getenvironment(env_mapping);
- if (! environment)
- return NULL;
- }
-
- Py_BEGIN_ALLOW_THREADS
- result = CreateProcessW(application_name,
- command_line,
- NULL,
- NULL,
- inherit_handles,
- creation_flags | CREATE_UNICODE_ENVIRONMENT,
- environment ? PyUnicode_AS_UNICODE(environment) : NULL,
- current_directory,
- &si,
- &pi);
- Py_END_ALLOW_THREADS
-
- Py_XDECREF(environment);
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return Py_BuildValue("NNii",
- sp_handle_new(pi.hProcess),
- sp_handle_new(pi.hThread),
- pi.dwProcessId,
- pi.dwThreadId);
-}
-
-PyDoc_STRVAR(TerminateProcess_doc,
-"TerminateProcess(handle, exit_code) -> None\n\
-\n\
-Terminate the specified process and all of its threads.");
-
-static PyObject *
-sp_TerminateProcess(PyObject* self, PyObject* args)
-{
- BOOL result;
-
- HANDLE process;
- int exit_code;
- if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:TerminateProcess",
- &process, &exit_code))
- return NULL;
-
- result = TerminateProcess(process, exit_code);
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-PyDoc_STRVAR(GetExitCodeProcess_doc,
-"GetExitCodeProcess(handle) -> Exit code\n\
-\n\
-Return the termination status of the specified process.");
-
-static PyObject *
-sp_GetExitCodeProcess(PyObject* self, PyObject* args)
-{
- DWORD exit_code;
- BOOL result;
-
- HANDLE process;
- if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetExitCodeProcess", &process))
- return NULL;
-
- result = GetExitCodeProcess(process, &exit_code);
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return PyLong_FromLong(exit_code);
-}
-
-PyDoc_STRVAR(WaitForSingleObject_doc,
-"WaitForSingleObject(handle, timeout) -> result\n\
-\n\
-Wait until the specified object is in the signaled state or\n\
-the time-out interval elapses. The timeout value is specified\n\
-in milliseconds.");
-
-static PyObject *
-sp_WaitForSingleObject(PyObject* self, PyObject* args)
-{
- DWORD result;
-
- HANDLE handle;
- int milliseconds;
- if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:WaitForSingleObject",
- &handle,
- &milliseconds))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- result = WaitForSingleObject(handle, (DWORD) milliseconds);
- Py_END_ALLOW_THREADS
-
- if (result == WAIT_FAILED)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return PyLong_FromLong((int) result);
-}
-
-PyDoc_STRVAR(GetVersion_doc,
-"GetVersion() -> version\n\
-\n\
-Return the version number of the current operating system.");
-
-static PyObject *
-sp_GetVersion(PyObject* self, PyObject* args)
-{
- if (! PyArg_ParseTuple(args, ":GetVersion"))
- return NULL;
-
- return PyLong_FromLong((int) GetVersion());
-}
-
-PyDoc_STRVAR(GetModuleFileName_doc,
-"GetModuleFileName(module) -> path\n\
-\n\
-Return the fully-qualified path for the file that contains\n\
-the specified module. The module must have been loaded by the\n\
-current process.\n\
-\n\
-The module parameter should be a handle to the loaded module\n\
-whose path is being requested. If this parameter is 0, \n\
-GetModuleFileName retrieves the path of the executable file\n\
-of the current process.");
-
-static PyObject *
-sp_GetModuleFileName(PyObject* self, PyObject* args)
-{
- BOOL result;
- HMODULE module;
- WCHAR filename[MAX_PATH];
-
- if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetModuleFileName",
- &module))
- return NULL;
-
- result = GetModuleFileNameW(module, filename, MAX_PATH);
- filename[MAX_PATH-1] = '\0';
-
- if (! result)
- return PyErr_SetFromWindowsErr(GetLastError());
-
- return PyUnicode_FromUnicode(filename, Py_UNICODE_strlen(filename));
-}
-
-static PyMethodDef sp_functions[] = {
- {"GetStdHandle", sp_GetStdHandle, METH_VARARGS, GetStdHandle_doc},
- {"GetCurrentProcess", sp_GetCurrentProcess, METH_VARARGS,
- GetCurrentProcess_doc},
- {"DuplicateHandle", sp_DuplicateHandle, METH_VARARGS,
- DuplicateHandle_doc},
- {"CreatePipe", sp_CreatePipe, METH_VARARGS, CreatePipe_doc},
- {"CreateProcess", sp_CreateProcess, METH_VARARGS, CreateProcess_doc},
- {"TerminateProcess", sp_TerminateProcess, METH_VARARGS,
- TerminateProcess_doc},
- {"GetExitCodeProcess", sp_GetExitCodeProcess, METH_VARARGS,
- GetExitCodeProcess_doc},
- {"WaitForSingleObject", sp_WaitForSingleObject, METH_VARARGS,
- WaitForSingleObject_doc},
- {"GetVersion", sp_GetVersion, METH_VARARGS, GetVersion_doc},
- {"GetModuleFileName", sp_GetModuleFileName, METH_VARARGS,
- GetModuleFileName_doc},
- {NULL, NULL}
-};
-
-/* -------------------------------------------------------------------- */
-
-static void
-defint(PyObject* d, const char* name, int value)
-{
- PyObject* v = PyLong_FromLong((long) value);
- if (v) {
- PyDict_SetItemString(d, (char*) name, v);
- Py_DECREF(v);
- }
-}
-
-static struct PyModuleDef _subprocessmodule = {
- PyModuleDef_HEAD_INIT,
- "_subprocess",
- NULL,
- -1,
- sp_functions,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-PyMODINIT_FUNC
-PyInit__subprocess()
-{
- PyObject *d;
- PyObject *m;
-
- /* patch up object descriptors */
- sp_handle_as_number.nb_int = (unaryfunc) sp_handle_as_int;
- if (PyType_Ready(&sp_handle_type) < 0)
- return NULL;
-
- m = PyModule_Create(&_subprocessmodule);
- if (m == NULL)
- return NULL;
- d = PyModule_GetDict(m);
-
- /* constants */
- defint(d, "STD_INPUT_HANDLE", STD_INPUT_HANDLE);
- defint(d, "STD_OUTPUT_HANDLE", STD_OUTPUT_HANDLE);
- defint(d, "STD_ERROR_HANDLE", STD_ERROR_HANDLE);
- defint(d, "DUPLICATE_SAME_ACCESS", DUPLICATE_SAME_ACCESS);
- defint(d, "STARTF_USESTDHANDLES", STARTF_USESTDHANDLES);
- defint(d, "STARTF_USESHOWWINDOW", STARTF_USESHOWWINDOW);
- defint(d, "SW_HIDE", SW_HIDE);
- defint(d, "INFINITE", INFINITE);
- defint(d, "WAIT_OBJECT_0", WAIT_OBJECT_0);
- defint(d, "CREATE_NEW_CONSOLE", CREATE_NEW_CONSOLE);
- defint(d, "CREATE_NEW_PROCESS_GROUP", CREATE_NEW_PROCESS_GROUP);
- defint(d, "STILL_ACTIVE", STILL_ACTIVE);
-
- return m;
-}
diff --git a/PC/config.c b/PC/config.c
index 1fc2b40..57b5073 100644
--- a/PC/config.c
+++ b/PC/config.c
@@ -12,6 +12,7 @@ extern PyObject* PyInit_audioop(void);
extern PyObject* PyInit_binascii(void);
extern PyObject* PyInit_cmath(void);
extern PyObject* PyInit_errno(void);
+extern PyObject* PyInit_faulthandler(void);
extern PyObject* PyInit_gc(void);
extern PyObject* PyInit_math(void);
extern PyObject* PyInit__md5(void);
@@ -55,7 +56,7 @@ extern PyObject* PyInit__codecs_iso2022(void);
extern PyObject* PyInit__codecs_jp(void);
extern PyObject* PyInit__codecs_kr(void);
extern PyObject* PyInit__codecs_tw(void);
-extern PyObject* PyInit__subprocess(void);
+extern PyObject* PyInit__winapi(void);
extern PyObject* PyInit__lsprof(void);
extern PyObject* PyInit__ast(void);
extern PyObject* PyInit__io(void);
@@ -82,6 +83,7 @@ struct _inittab _PyImport_Inittab[] = {
{"binascii", PyInit_binascii},
{"cmath", PyInit_cmath},
{"errno", PyInit_errno},
+ {"faulthandler", PyInit_faulthandler},
{"gc", PyInit_gc},
{"math", PyInit_math},
{"nt", PyInit_nt}, /* Use the NT os functions, not posix */
@@ -99,8 +101,8 @@ struct _inittab _PyImport_Inittab[] = {
{"msvcrt", PyInit_msvcrt},
{"_locale", PyInit__locale},
#endif
- /* XXX Should _subprocess go in a WIN32 block? not WIN64? */
- {"_subprocess", PyInit__subprocess},
+ /* XXX Should _winapi go in a WIN32 block? not WIN64? */
+ {"_winapi", PyInit__winapi},
{"_codecs", PyInit__codecs},
{"_weakref", PyInit__weakref},
@@ -141,10 +143,9 @@ struct _inittab _PyImport_Inittab[] = {
{"marshal", PyMarshal_Init},
/* This lives it with import.c */
- {"imp", PyInit_imp},
+ {"_imp", PyInit_imp},
/* These entries are here for sys.builtin_module_names */
- {"__main__", NULL},
{"builtins", NULL},
{"sys", NULL},
{"_warnings", _PyWarnings_Init},
diff --git a/PC/dl_nt.c b/PC/dl_nt.c
index ef1ce09..ae10fb5 100644
--- a/PC/dl_nt.c
+++ b/PC/dl_nt.c
@@ -18,7 +18,8 @@ char dllVersionBuffer[16] = ""; // a private buffer
HMODULE PyWin_DLLhModule = NULL;
const char *PyWin_DLLVersionString = dllVersionBuffer;
-// Windows "Activation Context" work:
+#if HAVE_SXS
+// Windows "Activation Context" work.
// Our .pyd extension modules are generally built without a manifest (ie,
// those included with Python and those built with a default distutils.
// This requires we perform some "activation context" magic when loading our
@@ -29,6 +30,8 @@ const char *PyWin_DLLVersionString = dllVersionBuffer;
// As an added complication, this magic only works on XP or later - we simply
// use the existence (or not) of the relevant function pointers from kernel32.
// See bug 4566 (http://python.org/sf/4566) for more details.
+// In Visual Studio 2010, side by side assemblies are no longer used by
+// default.
typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *);
typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *);
@@ -75,6 +78,7 @@ void _Py_DeactivateActCtx(ULONG_PTR cookie)
if (!(*pfnDeactivateActCtx)(0, cookie))
OutputDebugString("Python failed to de-activate the activation context\n");
}
+#endif /* HAVE_SXS */
BOOL WINAPI DllMain (HANDLE hInst,
ULONG ul_reason_for_call,
@@ -87,17 +91,21 @@ BOOL WINAPI DllMain (HANDLE hInst,
// 1000 is a magic number I picked out of the air. Could do with a #define, I spose...
LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer));
+#if HAVE_SXS
// and capture our activation context for use when loading extensions.
_LoadActCtxPointers();
if (pfnGetCurrentActCtx && pfnAddRefActCtx)
if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext))
if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext))
OutputDebugString("Python failed to load the default activation context\n");
+#endif
break;
case DLL_PROCESS_DETACH:
+#if HAVE_SXS
if (pfnReleaseActCtx)
(*pfnReleaseActCtx)(PyWin_DLLhActivationContext);
+#endif
break;
}
return TRUE;
diff --git a/PC/example_nt/example.vcproj b/PC/example_nt/example.vcproj
index f924c7d..fba00b6 100644
--- a/PC/example_nt/example.vcproj
+++ b/PC/example_nt/example.vcproj
@@ -39,7 +39,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/export:initexample"
- AdditionalDependencies="odbc32.lib odbccp32.lib python26.lib"
+ AdditionalDependencies="odbc32.lib odbccp32.lib python33.lib"
OutputFile=".\Release/example.pyd"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -105,7 +105,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/export:initexample"
- AdditionalDependencies="odbc32.lib odbccp32.lib python26_d.lib"
+ AdditionalDependencies="odbc32.lib odbccp32.lib python33_d.lib"
OutputFile=".\Debug/example_d.pyd"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
diff --git a/PC/frozen_dllmain.c b/PC/frozen_dllmain.c
index a8cc885..0156c50 100644
--- a/PC/frozen_dllmain.c
+++ b/PC/frozen_dllmain.c
@@ -77,7 +77,7 @@ void PyWinFreeze_ExeTerm(void)
{
// Must go backwards
char **modName;
- for (modName = possibleModules+(sizeof(possibleModules) / sizeof(char *))-2;
+ for (modName = possibleModules+Py_ARRAY_LENGTH(possibleModules)-2;
modName >= possibleModules;
*modName--) {
/* printf("Terminating '%s'\n", *modName);*/
@@ -103,7 +103,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Must go backwards
char **modName;
- for (modName = possibleModules+(sizeof(possibleModules) / sizeof(char *))-2;
+ for (modName = possibleModules+Py_ARRAY_LENGTH(possibleModules)-2;
modName >= possibleModules;
*modName--)
CallModuleDllMain(*modName, DLL_PROCESS_DETACH);
@@ -118,7 +118,7 @@ BOOL CallModuleDllMain(char *modName, DWORD dwReason)
BOOL (WINAPI * pfndllmain)(HINSTANCE, DWORD, LPVOID);
char funcName[255];
- HMODULE hmod = GetModuleHandle(NULL);
+ HMODULE hmod = GetModuleHandleW(NULL);
strcpy(funcName, "_DllMain");
strcat(funcName, modName);
strcat(funcName, "@12"); // stdcall convention.
diff --git a/PC/getpathp.c b/PC/getpathp.c
index cd3a4b2..b5bf325 100644
--- a/PC/getpathp.c
+++ b/PC/getpathp.c
@@ -251,7 +251,7 @@ getpythonregpath(HKEY keyBase, int skipcore)
if (keyBuf==NULL) goto done;
memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(WCHAR));
- keyBufPtr += sizeof(keyPrefix)/sizeof(WCHAR) - 1;
+ keyBufPtr += Py_ARRAY_LENGTH(keyPrefix) - 1;
mbstowcs(keyBufPtr, PyWin_DLLVersionString, versionLen);
keyBufPtr += versionLen;
/* NULL comes with this one! */
@@ -423,6 +423,53 @@ get_progpath(void)
progpath[0] = '\0';
}
+static int
+find_env_config_value(FILE * env_file, const wchar_t * key, wchar_t * value)
+{
+ int result = 0; /* meaning not found */
+ char buffer[MAXPATHLEN*2+1]; /* allow extra for key, '=', etc. */
+
+ fseek(env_file, 0, SEEK_SET);
+ while (!feof(env_file)) {
+ char * p = fgets(buffer, MAXPATHLEN*2, env_file);
+ wchar_t tmpbuffer[MAXPATHLEN*2+1];
+ PyObject * decoded;
+ int n;
+
+ if (p == NULL)
+ break;
+ n = strlen(p);
+ if (p[n - 1] != '\n') {
+ /* line has overflowed - bail */
+ break;
+ }
+ if (p[0] == '#') /* Comment - skip */
+ continue;
+ decoded = PyUnicode_DecodeUTF8(buffer, n, "surrogateescape");
+ if (decoded != NULL) {
+ Py_ssize_t k;
+ k = PyUnicode_AsWideChar(decoded,
+ tmpbuffer, MAXPATHLEN * 2);
+ Py_DECREF(decoded);
+ if (k >= 0) {
+ wchar_t * tok = wcstok(tmpbuffer, L" \t\r\n");
+ if ((tok != NULL) && !wcscmp(tok, key)) {
+ tok = wcstok(NULL, L" \t");
+ if ((tok != NULL) && !wcscmp(tok, L"=")) {
+ tok = wcstok(NULL, L"\r\n");
+ if (tok != NULL) {
+ wcsncpy(value, tok, MAXPATHLEN);
+ result = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
static void
calculate_path(void)
{
@@ -457,6 +504,40 @@ calculate_path(void)
/* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
wcscpy(argv0_path, progpath);
reduce(argv0_path);
+
+ /* Search for an environment configuration file, first in the
+ executable's directory and then in the parent directory.
+ If found, open it for use when searching for prefixes.
+ */
+
+ {
+ wchar_t tmpbuffer[MAXPATHLEN+1];
+ wchar_t *env_cfg = L"pyvenv.cfg";
+ FILE * env_file = NULL;
+
+ wcscpy(tmpbuffer, argv0_path);
+ join(tmpbuffer, env_cfg);
+ env_file = _Py_wfopen(tmpbuffer, L"r");
+ if (env_file == NULL) {
+ errno = 0;
+ reduce(tmpbuffer);
+ reduce(tmpbuffer);
+ join(tmpbuffer, env_cfg);
+ env_file = _Py_wfopen(tmpbuffer, L"r");
+ if (env_file == NULL) {
+ errno = 0;
+ }
+ }
+ if (env_file != NULL) {
+ /* Look for a 'home' variable and set argv0_path to it, if found */
+ if (find_env_config_value(env_file, L"home", tmpbuffer)) {
+ wcscpy(argv0_path, tmpbuffer);
+ }
+ fclose(env_file);
+ env_file = NULL;
+ }
+ }
+
if (pythonhome == NULL || *pythonhome == '\0') {
if (search_for_prefix(argv0_path, LANDMARK))
pythonhome = prefix;
@@ -708,8 +789,8 @@ Py_GetProgramFullPath(void)
return progpath;
}
-/* Load python3.dll before loading any extension module that might refer
- to it. That way, we can be sure that always the python3.dll corresponding
+/* Load python3.dll before loading any extension module that might refer
+ to it. That way, we can be sure that always the python3.dll corresponding
to this python DLL is loaded, not a python3.dll that might be on the path
by chance.
Return whether the DLL was found.
diff --git a/PC/import_nt.c b/PC/import_nt.c
deleted file mode 100644
index 196a774..0000000
--- a/PC/import_nt.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/********************************************************************
-
- import_nt.c
-
- Win32 specific import code.
-
-*/
-
-#include "Python.h"
-#include "osdefs.h"
-#include <windows.h>
-#include "importdl.h"
-#include "malloc.h" /* for alloca */
-
-/* a string loaded from the DLL at startup */
-extern const char *PyWin_DLLVersionString;
-
-FILE *PyWin_FindRegisteredModule(const char *moduleName,
- struct filedescr **ppFileDesc,
- char *pathBuf,
- Py_ssize_t pathLen)
-{
- char *moduleKey;
- const char keyPrefix[] = "Software\\Python\\PythonCore\\";
- const char keySuffix[] = "\\Modules\\";
-#ifdef _DEBUG
- /* In debugging builds, we _must_ have the debug version
- * registered.
- */
- const char debugString[] = "\\Debug";
-#else
- const char debugString[] = "";
-#endif
- struct filedescr *fdp = NULL;
- FILE *fp;
- HKEY keyBase = HKEY_CURRENT_USER;
- int modNameSize;
- long regStat;
-
- /* Calculate the size for the sprintf buffer.
- * Get the size of the chars only, plus 1 NULL.
- */
- size_t bufSize = sizeof(keyPrefix)-1 +
- strlen(PyWin_DLLVersionString) +
- sizeof(keySuffix) +
- strlen(moduleName) +
- sizeof(debugString) - 1;
- /* alloca == no free required, but memory only local to fn,
- * also no heap fragmentation!
- */
- moduleKey = alloca(bufSize);
- PyOS_snprintf(moduleKey, bufSize,
- "Software\\Python\\PythonCore\\%s\\Modules\\%s%s",
- PyWin_DLLVersionString, moduleName, debugString);
-
- assert(pathLen < INT_MAX);
- modNameSize = (int)pathLen;
- regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize);
- if (regStat != ERROR_SUCCESS) {
- /* No user setting - lookup in machine settings */
- keyBase = HKEY_LOCAL_MACHINE;
- /* be anal - failure may have reset size param */
- modNameSize = (int)pathLen;
- regStat = RegQueryValue(keyBase, moduleKey,
- pathBuf, &modNameSize);
-
- if (regStat != ERROR_SUCCESS)
- return NULL;
- }
- /* use the file extension to locate the type entry. */
- for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
- size_t extLen = strlen(fdp->suffix);
- assert(modNameSize >= 0); /* else cast to size_t is wrong */
- if ((size_t)modNameSize > extLen &&
- strnicmp(pathBuf + ((size_t)modNameSize-extLen-1),
- fdp->suffix,
- extLen) == 0)
- break;
- }
- if (fdp->suffix == NULL)
- return NULL;
- fp = fopen(pathBuf, fdp->mode);
- if (fp != NULL)
- *ppFileDesc = fdp;
- return fp;
-}
diff --git a/PC/launcher.c b/PC/launcher.c
new file mode 100644
index 0000000..dfad44a
--- /dev/null
+++ b/PC/launcher.c
@@ -0,0 +1,1365 @@
+/*
+ * Copyright (C) 2011-2012 Vinay Sajip.
+ * Licensed to PSF under a contributor agreement.
+ *
+ * Based on the work of:
+ *
+ * Mark Hammond (original author of Python version)
+ * Curt Hagenlocher (job management)
+ */
+
+#include <windows.h>
+#include <shlobj.h>
+#include <stdio.h>
+#include <tchar.h>
+
+#define BUFSIZE 256
+#define MSGSIZE 1024
+
+/* Build options. */
+#define SKIP_PREFIX
+/* #define SEARCH_PATH */
+
+/* Just for now - static definition */
+
+static FILE * log_fp = NULL;
+
+static wchar_t *
+skip_whitespace(wchar_t * p)
+{
+ while (*p && isspace(*p))
+ ++p;
+ return p;
+}
+
+/*
+ * This function is here to simplify memory management
+ * and to treat blank values as if they are absent.
+ */
+static wchar_t * get_env(wchar_t * key)
+{
+ /* This is not thread-safe, just like getenv */
+ static wchar_t buf[256];
+ DWORD result = GetEnvironmentVariableW(key, buf, 256);
+
+ if (result > 255) {
+ /* Large environment variable. Accept some leakage */
+ wchar_t *buf2 = (wchar_t*)malloc(sizeof(wchar_t) * (result+1));
+ GetEnvironmentVariableW(key, buf2, result);
+ return buf2;
+ }
+
+ if (result == 0)
+ /* Either some error, e.g. ERROR_ENVVAR_NOT_FOUND,
+ or an empty environment variable. */
+ return NULL;
+
+ return buf;
+}
+
+
+static void
+debug(wchar_t * format, ...)
+{
+ va_list va;
+
+ if (log_fp != NULL) {
+ va_start(va, format);
+ vfwprintf_s(log_fp, format, va);
+ }
+}
+
+static void
+winerror(int rc, wchar_t * message, int size)
+{
+ FormatMessageW(
+ FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, rc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ message, size, NULL);
+}
+
+static void
+error(int rc, wchar_t * format, ... )
+{
+ va_list va;
+ wchar_t message[MSGSIZE];
+ wchar_t win_message[MSGSIZE];
+ int len;
+
+ va_start(va, format);
+ len = _vsnwprintf_s(message, MSGSIZE, _TRUNCATE, format, va);
+
+ if (rc == 0) { /* a Windows error */
+ winerror(GetLastError(), win_message, MSGSIZE);
+ if (len >= 0) {
+ _snwprintf_s(&message[len], MSGSIZE - len, _TRUNCATE, L": %s",
+ win_message);
+ }
+ }
+
+#if !defined(_WINDOWS)
+ fwprintf(stderr, L"%s\n", message);
+#else
+ MessageBox(NULL, message, TEXT("Python Launcher is sorry to say ..."), MB_OK);
+#endif
+ ExitProcess(rc);
+}
+
+#if defined(_WINDOWS)
+
+#define PYTHON_EXECUTABLE L"pythonw.exe"
+
+#else
+
+#define PYTHON_EXECUTABLE L"python.exe"
+
+#endif
+
+#define RC_NO_STD_HANDLES 100
+#define RC_CREATE_PROCESS 101
+#define RC_BAD_VIRTUAL_PATH 102
+#define RC_NO_PYTHON 103
+
+#define MAX_VERSION_SIZE 4
+
+typedef struct {
+ wchar_t version[MAX_VERSION_SIZE]; /* m.n */
+ int bits; /* 32 or 64 */
+ wchar_t executable[MAX_PATH];
+} INSTALLED_PYTHON;
+
+/*
+ * To avoid messing about with heap allocations, just assume we can allocate
+ * statically and never have to deal with more versions than this.
+ */
+#define MAX_INSTALLED_PYTHONS 100
+
+static INSTALLED_PYTHON installed_pythons[MAX_INSTALLED_PYTHONS];
+
+static size_t num_installed_pythons = 0;
+
+/* to hold SOFTWARE\Python\PythonCore\X.Y\InstallPath */
+#define IP_BASE_SIZE 40
+#define IP_SIZE (IP_BASE_SIZE + MAX_VERSION_SIZE)
+#define CORE_PATH L"SOFTWARE\\Python\\PythonCore"
+
+static wchar_t * location_checks[] = {
+ L"\\",
+ L"\\PCBuild\\",
+ L"\\PCBuild\\amd64\\",
+ NULL
+};
+
+static INSTALLED_PYTHON *
+find_existing_python(wchar_t * path)
+{
+ INSTALLED_PYTHON * result = NULL;
+ size_t i;
+ INSTALLED_PYTHON * ip;
+
+ for (i = 0, ip = installed_pythons; i < num_installed_pythons; i++, ip++) {
+ if (_wcsicmp(path, ip->executable) == 0) {
+ result = ip;
+ break;
+ }
+ }
+ return result;
+}
+
+static void
+locate_pythons_for_key(HKEY root, REGSAM flags)
+{
+ HKEY core_root, ip_key;
+ LSTATUS status = RegOpenKeyExW(root, CORE_PATH, 0, flags, &core_root);
+ wchar_t message[MSGSIZE];
+ DWORD i;
+ size_t n;
+ BOOL ok;
+ DWORD type, data_size, attrs;
+ INSTALLED_PYTHON * ip, * pip;
+ wchar_t ip_path[IP_SIZE];
+ wchar_t * check;
+ wchar_t ** checkp;
+ wchar_t *key_name = (root == HKEY_LOCAL_MACHINE) ? L"HKLM" : L"HKCU";
+
+ if (status != ERROR_SUCCESS)
+ debug(L"locate_pythons_for_key: unable to open PythonCore key in %s\n",
+ key_name);
+ else {
+ ip = &installed_pythons[num_installed_pythons];
+ for (i = 0; num_installed_pythons < MAX_INSTALLED_PYTHONS; i++) {
+ status = RegEnumKeyW(core_root, i, ip->version, MAX_VERSION_SIZE);
+ if (status != ERROR_SUCCESS) {
+ if (status != ERROR_NO_MORE_ITEMS) {
+ /* unexpected error */
+ winerror(status, message, MSGSIZE);
+ debug(L"Can't enumerate registry key for version %s: %s\n",
+ ip->version, message);
+ }
+ break;
+ }
+ else {
+ _snwprintf_s(ip_path, IP_SIZE, _TRUNCATE,
+ L"%s\\%s\\InstallPath", CORE_PATH, ip->version);
+ status = RegOpenKeyExW(root, ip_path, 0, flags, &ip_key);
+ if (status != ERROR_SUCCESS) {
+ winerror(status, message, MSGSIZE);
+ // Note: 'message' already has a trailing \n
+ debug(L"%s\\%s: %s", key_name, ip_path, message);
+ continue;
+ }
+ data_size = sizeof(ip->executable) - 1;
+ status = RegQueryValueExW(ip_key, NULL, NULL, &type,
+ (LPBYTE)ip->executable, &data_size);
+ RegCloseKey(ip_key);
+ if (status != ERROR_SUCCESS) {
+ winerror(status, message, MSGSIZE);
+ debug(L"%s\\%s: %s\n", key_name, ip_path, message);
+ continue;
+ }
+ if (type == REG_SZ) {
+ data_size = data_size / sizeof(wchar_t) - 1; /* for NUL */
+ if (ip->executable[data_size - 1] == L'\\')
+ --data_size; /* reg value ended in a backslash */
+ /* ip->executable is data_size long */
+ for (checkp = location_checks; *checkp; ++checkp) {
+ check = *checkp;
+ _snwprintf_s(&ip->executable[data_size],
+ MAX_PATH - data_size,
+ MAX_PATH - data_size,
+ L"%s%s", check, PYTHON_EXECUTABLE);
+ attrs = GetFileAttributesW(ip->executable);
+ if (attrs == INVALID_FILE_ATTRIBUTES) {
+ winerror(GetLastError(), message, MSGSIZE);
+ debug(L"locate_pythons_for_key: %s: %s",
+ ip->executable, message);
+ }
+ else if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
+ debug(L"locate_pythons_for_key: '%s' is a \
+directory\n",
+ ip->executable, attrs);
+ }
+ else if (find_existing_python(ip->executable)) {
+ debug(L"locate_pythons_for_key: %s: already \
+found: %s\n", ip->executable);
+ }
+ else {
+ /* check the executable type. */
+ ok = GetBinaryTypeW(ip->executable, &attrs);
+ if (!ok) {
+ debug(L"Failure getting binary type: %s\n",
+ ip->executable);
+ }
+ else {
+ if (attrs == SCS_64BIT_BINARY)
+ ip->bits = 64;
+ else if (attrs == SCS_32BIT_BINARY)
+ ip->bits = 32;
+ else
+ ip->bits = 0;
+ if (ip->bits == 0) {
+ debug(L"locate_pythons_for_key: %s: \
+invalid binary type: %X\n",
+ ip->executable, attrs);
+ }
+ else {
+ if (wcschr(ip->executable, L' ') != NULL) {
+ /* has spaces, so quote */
+ n = wcslen(ip->executable);
+ memmove(&ip->executable[1],
+ ip->executable, n * sizeof(wchar_t));
+ ip->executable[0] = L'\"';
+ ip->executable[n + 1] = L'\"';
+ ip->executable[n + 2] = L'\0';
+ }
+ debug(L"locate_pythons_for_key: %s \
+is a %dbit executable\n",
+ ip->executable, ip->bits);
+ ++num_installed_pythons;
+ pip = ip++;
+ if (num_installed_pythons >=
+ MAX_INSTALLED_PYTHONS)
+ break;
+ /* Copy over the attributes for the next */
+ *ip = *pip;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ RegCloseKey(core_root);
+ }
+}
+
+static int
+compare_pythons(const void * p1, const void * p2)
+{
+ INSTALLED_PYTHON * ip1 = (INSTALLED_PYTHON *) p1;
+ INSTALLED_PYTHON * ip2 = (INSTALLED_PYTHON *) p2;
+ /* note reverse sorting on version */
+ int result = wcscmp(ip2->version, ip1->version);
+
+ if (result == 0)
+ result = ip2->bits - ip1->bits; /* 64 before 32 */
+ return result;
+}
+
+static void
+locate_all_pythons()
+{
+#if defined(_M_X64)
+ // If we are a 64bit process, first hit the 32bit keys.
+ debug(L"locating Pythons in 32bit registry\n");
+ locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ | KEY_WOW64_32KEY);
+ locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ | KEY_WOW64_32KEY);
+#else
+ // If we are a 32bit process on a 64bit Windows, first hit the 64bit keys.
+ BOOL f64 = FALSE;
+ if (IsWow64Process(GetCurrentProcess(), &f64) && f64) {
+ debug(L"locating Pythons in 64bit registry\n");
+ locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ | KEY_WOW64_64KEY);
+ locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ | KEY_WOW64_64KEY);
+ }
+#endif
+ // now hit the "native" key for this process bittedness.
+ debug(L"locating Pythons in native registry\n");
+ locate_pythons_for_key(HKEY_CURRENT_USER, KEY_READ);
+ locate_pythons_for_key(HKEY_LOCAL_MACHINE, KEY_READ);
+ qsort(installed_pythons, num_installed_pythons, sizeof(INSTALLED_PYTHON),
+ compare_pythons);
+}
+
+static INSTALLED_PYTHON *
+find_python_by_version(wchar_t const * wanted_ver)
+{
+ INSTALLED_PYTHON * result = NULL;
+ INSTALLED_PYTHON * ip = installed_pythons;
+ size_t i, n;
+ size_t wlen = wcslen(wanted_ver);
+ int bits = 0;
+
+ if (wcsstr(wanted_ver, L"-32"))
+ bits = 32;
+ for (i = 0; i < num_installed_pythons; i++, ip++) {
+ n = wcslen(ip->version);
+ if (n > wlen)
+ n = wlen;
+ if ((wcsncmp(ip->version, wanted_ver, n) == 0) &&
+ /* bits == 0 => don't care */
+ ((bits == 0) || (ip->bits == bits))) {
+ result = ip;
+ break;
+ }
+ }
+ return result;
+}
+
+
+static wchar_t appdata_ini_path[MAX_PATH];
+static wchar_t launcher_ini_path[MAX_PATH];
+
+/*
+ * Get a value either from the environment or a configuration file.
+ * The key passed in will either be "python", "python2" or "python3".
+ */
+static wchar_t *
+get_configured_value(wchar_t * key)
+{
+/*
+ * Note: this static value is used to return a configured value
+ * obtained either from the environment or configuration file.
+ * This should be OK since there wouldn't be any concurrent calls.
+ */
+ static wchar_t configured_value[MSGSIZE];
+ wchar_t * result = NULL;
+ wchar_t * found_in = L"environment";
+ DWORD size;
+
+ /* First, search the environment. */
+ _snwprintf_s(configured_value, MSGSIZE, _TRUNCATE, L"py_%s", key);
+ result = get_env(configured_value);
+ if (result == NULL && appdata_ini_path[0]) {
+ /* Not in environment: check local configuration. */
+ size = GetPrivateProfileStringW(L"defaults", key, NULL,
+ configured_value, MSGSIZE,
+ appdata_ini_path);
+ if (size > 0) {
+ result = configured_value;
+ found_in = appdata_ini_path;
+ }
+ }
+ if (result == NULL && launcher_ini_path[0]) {
+ /* Not in environment or local: check global configuration. */
+ size = GetPrivateProfileStringW(L"defaults", key, NULL,
+ configured_value, MSGSIZE,
+ launcher_ini_path);
+ if (size > 0) {
+ result = configured_value;
+ found_in = launcher_ini_path;
+ }
+ }
+ if (result) {
+ debug(L"found configured value '%s=%s' in %s\n",
+ key, result, found_in ? found_in : L"(unknown)");
+ } else {
+ debug(L"found no configured value for '%s'\n", key);
+ }
+ return result;
+}
+
+static INSTALLED_PYTHON *
+locate_python(wchar_t * wanted_ver)
+{
+ static wchar_t config_key [] = { L"pythonX" };
+ static wchar_t * last_char = &config_key[sizeof(config_key) /
+ sizeof(wchar_t) - 2];
+ INSTALLED_PYTHON * result = NULL;
+ size_t n = wcslen(wanted_ver);
+ wchar_t * configured_value;
+
+ if (num_installed_pythons == 0)
+ locate_all_pythons();
+
+ if (n == 1) { /* just major version specified */
+ *last_char = *wanted_ver;
+ configured_value = get_configured_value(config_key);
+ if (configured_value != NULL)
+ wanted_ver = configured_value;
+ }
+ if (*wanted_ver) {
+ result = find_python_by_version(wanted_ver);
+ debug(L"search for Python version '%s' found ", wanted_ver);
+ if (result) {
+ debug(L"'%s'\n", result->executable);
+ } else {
+ debug(L"no interpreter\n");
+ }
+ }
+ else {
+ *last_char = L'\0'; /* look for an overall default */
+ configured_value = get_configured_value(config_key);
+ if (configured_value)
+ result = find_python_by_version(configured_value);
+ if (result == NULL)
+ result = find_python_by_version(L"2");
+ if (result == NULL)
+ result = find_python_by_version(L"3");
+ debug(L"search for default Python found ");
+ if (result) {
+ debug(L"version %s at '%s'\n",
+ result->version, result->executable);
+ } else {
+ debug(L"no interpreter\n");
+ }
+ }
+ return result;
+}
+
+/*
+ * Process creation code
+ */
+
+static BOOL
+safe_duplicate_handle(HANDLE in, HANDLE * pout)
+{
+ BOOL ok;
+ HANDLE process = GetCurrentProcess();
+ DWORD rc;
+
+ *pout = NULL;
+ ok = DuplicateHandle(process, in, process, pout, 0, TRUE,
+ DUPLICATE_SAME_ACCESS);
+ if (!ok) {
+ rc = GetLastError();
+ if (rc == ERROR_INVALID_HANDLE) {
+ debug(L"DuplicateHandle returned ERROR_INVALID_HANDLE\n");
+ ok = TRUE;
+ }
+ else {
+ debug(L"DuplicateHandle returned %d\n", rc);
+ }
+ }
+ return ok;
+}
+
+static BOOL WINAPI
+ctrl_c_handler(DWORD code)
+{
+ return TRUE; /* We just ignore all control events. */
+}
+
+static void
+run_child(wchar_t * cmdline)
+{
+ HANDLE job;
+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION info;
+ DWORD rc;
+ BOOL ok;
+ STARTUPINFOW si;
+ PROCESS_INFORMATION pi;
+
+ debug(L"run_child: about to run '%s'\n", cmdline);
+ job = CreateJobObject(NULL, NULL);
+ ok = QueryInformationJobObject(job, JobObjectExtendedLimitInformation,
+ &info, sizeof(info), &rc);
+ if (!ok || (rc != sizeof(info)) || !job)
+ error(RC_CREATE_PROCESS, L"Job information querying failed");
+ info.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE |
+ JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK;
+ ok = SetInformationJobObject(job, JobObjectExtendedLimitInformation, &info,
+ sizeof(info));
+ if (!ok)
+ error(RC_CREATE_PROCESS, L"Job information setting failed");
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ ok = safe_duplicate_handle(GetStdHandle(STD_INPUT_HANDLE), &si.hStdInput);
+ if (!ok)
+ error(RC_NO_STD_HANDLES, L"stdin duplication failed");
+ ok = safe_duplicate_handle(GetStdHandle(STD_OUTPUT_HANDLE), &si.hStdOutput);
+ if (!ok)
+ error(RC_NO_STD_HANDLES, L"stdout duplication failed");
+ ok = safe_duplicate_handle(GetStdHandle(STD_ERROR_HANDLE), &si.hStdError);
+ if (!ok)
+ error(RC_NO_STD_HANDLES, L"stderr duplication failed");
+
+ ok = SetConsoleCtrlHandler(ctrl_c_handler, TRUE);
+ if (!ok)
+ error(RC_CREATE_PROCESS, L"control handler setting failed");
+
+ si.dwFlags = STARTF_USESTDHANDLES;
+ ok = CreateProcessW(NULL, cmdline, NULL, NULL, TRUE,
+ 0, NULL, NULL, &si, &pi);
+ if (!ok)
+ error(RC_CREATE_PROCESS, L"Unable to create process using '%s'", cmdline);
+ AssignProcessToJobObject(job, pi.hProcess);
+ CloseHandle(pi.hThread);
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ ok = GetExitCodeProcess(pi.hProcess, &rc);
+ if (!ok)
+ error(RC_CREATE_PROCESS, L"Failed to get exit code of process");
+ debug(L"child process exit code: %d\n", rc);
+ ExitProcess(rc);
+}
+
+static void
+invoke_child(wchar_t * executable, wchar_t * suffix, wchar_t * cmdline)
+{
+ wchar_t * child_command;
+ size_t child_command_size;
+ BOOL no_suffix = (suffix == NULL) || (*suffix == L'\0');
+ BOOL no_cmdline = (*cmdline == L'\0');
+
+ if (no_suffix && no_cmdline)
+ run_child(executable);
+ else {
+ if (no_suffix) {
+ /* add 2 for space separator + terminating NUL. */
+ child_command_size = wcslen(executable) + wcslen(cmdline) + 2;
+ }
+ else {
+ /* add 3 for 2 space separators + terminating NUL. */
+ child_command_size = wcslen(executable) + wcslen(suffix) +
+ wcslen(cmdline) + 3;
+ }
+ child_command = calloc(child_command_size, sizeof(wchar_t));
+ if (child_command == NULL)
+ error(RC_CREATE_PROCESS, L"unable to allocate %d bytes for child command.",
+ child_command_size);
+ if (no_suffix)
+ _snwprintf_s(child_command, child_command_size,
+ child_command_size - 1, L"%s %s",
+ executable, cmdline);
+ else
+ _snwprintf_s(child_command, child_command_size,
+ child_command_size - 1, L"%s %s %s",
+ executable, suffix, cmdline);
+ run_child(child_command);
+ free(child_command);
+ }
+}
+
+static wchar_t * builtin_virtual_paths [] = {
+ L"/usr/bin/env python",
+ L"/usr/bin/python",
+ L"/usr/local/bin/python",
+ L"python",
+ NULL
+};
+
+/* For now, a static array of commands. */
+
+#define MAX_COMMANDS 100
+
+typedef struct {
+ wchar_t key[MAX_PATH];
+ wchar_t value[MSGSIZE];
+} COMMAND;
+
+static COMMAND commands[MAX_COMMANDS];
+static int num_commands = 0;
+
+#if defined(SKIP_PREFIX)
+
+static wchar_t * builtin_prefixes [] = {
+ /* These must be in an order that the longest matches should be found,
+ * i.e. if the prefix is "/usr/bin/env ", it should match that entry
+ * *before* matching "/usr/bin/".
+ */
+ L"/usr/bin/env ",
+ L"/usr/bin/",
+ L"/usr/local/bin/",
+ NULL
+};
+
+static wchar_t * skip_prefix(wchar_t * name)
+{
+ wchar_t ** pp = builtin_prefixes;
+ wchar_t * result = name;
+ wchar_t * p;
+ size_t n;
+
+ for (; p = *pp; pp++) {
+ n = wcslen(p);
+ if (_wcsnicmp(p, name, n) == 0) {
+ result += n; /* skip the prefix */
+ if (p[n - 1] == L' ') /* No empty strings in table, so n > 1 */
+ result = skip_whitespace(result);
+ break;
+ }
+ }
+ return result;
+}
+
+#endif
+
+#if defined(SEARCH_PATH)
+
+static COMMAND path_command;
+
+static COMMAND * find_on_path(wchar_t * name)
+{
+ wchar_t * pathext;
+ size_t varsize;
+ wchar_t * context = NULL;
+ wchar_t * extension;
+ COMMAND * result = NULL;
+ DWORD len;
+ errno_t rc;
+
+ wcscpy_s(path_command.key, MAX_PATH, name);
+ if (wcschr(name, L'.') != NULL) {
+ /* assume it has an extension. */
+ len = SearchPathW(NULL, name, NULL, MSGSIZE, path_command.value, NULL);
+ if (len) {
+ result = &path_command;
+ }
+ }
+ else {
+ /* No extension - search using registered extensions. */
+ rc = _wdupenv_s(&pathext, &varsize, L"PATHEXT");
+ if (rc == 0) {
+ extension = wcstok_s(pathext, L";", &context);
+ while (extension) {
+ len = SearchPathW(NULL, name, extension, MSGSIZE, path_command.value, NULL);
+ if (len) {
+ result = &path_command;
+ break;
+ }
+ extension = wcstok_s(NULL, L";", &context);
+ }
+ free(pathext);
+ }
+ }
+ return result;
+}
+
+#endif
+
+static COMMAND * find_command(wchar_t * name)
+{
+ COMMAND * result = NULL;
+ COMMAND * cp = commands;
+ int i;
+
+ for (i = 0; i < num_commands; i++, cp++) {
+ if (_wcsicmp(cp->key, name) == 0) {
+ result = cp;
+ break;
+ }
+ }
+#if defined(SEARCH_PATH)
+ if (result == NULL)
+ result = find_on_path(name);
+#endif
+ return result;
+}
+
+static void
+update_command(COMMAND * cp, wchar_t * name, wchar_t * cmdline)
+{
+ wcsncpy_s(cp->key, MAX_PATH, name, _TRUNCATE);
+ wcsncpy_s(cp->value, MSGSIZE, cmdline, _TRUNCATE);
+}
+
+static void
+add_command(wchar_t * name, wchar_t * cmdline)
+{
+ if (num_commands >= MAX_COMMANDS) {
+ debug(L"can't add %s = '%s': no room\n", name, cmdline);
+ }
+ else {
+ COMMAND * cp = &commands[num_commands++];
+
+ update_command(cp, name, cmdline);
+ }
+}
+
+static void
+read_config_file(wchar_t * config_path)
+{
+ wchar_t keynames[MSGSIZE];
+ wchar_t value[MSGSIZE];
+ DWORD read;
+ wchar_t * key;
+ COMMAND * cp;
+ wchar_t * cmdp;
+
+ read = GetPrivateProfileStringW(L"commands", NULL, NULL, keynames, MSGSIZE,
+ config_path);
+ if (read == MSGSIZE - 1) {
+ debug(L"read_commands: %s: not enough space for names\n", config_path);
+ }
+ key = keynames;
+ while (*key) {
+ read = GetPrivateProfileStringW(L"commands", key, NULL, value, MSGSIZE,
+ config_path);
+ if (read == MSGSIZE - 1) {
+ debug(L"read_commands: %s: not enough space for %s\n",
+ config_path, key);
+ }
+ cmdp = skip_whitespace(value);
+ if (*cmdp) {
+ cp = find_command(key);
+ if (cp == NULL)
+ add_command(key, value);
+ else
+ update_command(cp, key, value);
+ }
+ key += wcslen(key) + 1;
+ }
+}
+
+static void read_commands()
+{
+ if (launcher_ini_path[0])
+ read_config_file(launcher_ini_path);
+ if (appdata_ini_path[0])
+ read_config_file(appdata_ini_path);
+}
+
+static BOOL
+parse_shebang(wchar_t * shebang_line, int nchars, wchar_t ** command,
+ wchar_t ** suffix)
+{
+ BOOL rc = FALSE;
+ wchar_t ** vpp;
+ size_t plen;
+ wchar_t * p;
+ wchar_t zapped;
+ wchar_t * endp = shebang_line + nchars - 1;
+ COMMAND * cp;
+ wchar_t * skipped;
+
+ *command = NULL; /* failure return */
+ *suffix = NULL;
+
+ if ((*shebang_line++ == L'#') && (*shebang_line++ == L'!')) {
+ shebang_line = skip_whitespace(shebang_line);
+ if (*shebang_line) {
+ *command = shebang_line;
+ for (vpp = builtin_virtual_paths; *vpp; ++vpp) {
+ plen = wcslen(*vpp);
+ if (wcsncmp(shebang_line, *vpp, plen) == 0) {
+ rc = TRUE;
+ /* We can do this because all builtin commands contain
+ * "python".
+ */
+ *command = wcsstr(shebang_line, L"python");
+ break;
+ }
+ }
+ if (*vpp == NULL) {
+ /*
+ * Not found in builtins - look in customised commands.
+ *
+ * We can't permanently modify the shebang line in case
+ * it's not a customised command, but we can temporarily
+ * stick a NUL after the command while searching for it,
+ * then put back the char we zapped.
+ */
+#if defined(SKIP_PREFIX)
+ skipped = skip_prefix(shebang_line);
+#else
+ skipped = shebang_line;
+#endif
+ p = wcspbrk(skipped, L" \t\r\n");
+ if (p != NULL) {
+ zapped = *p;
+ *p = L'\0';
+ }
+ cp = find_command(skipped);
+ if (p != NULL)
+ *p = zapped;
+ if (cp != NULL) {
+ *command = cp->value;
+ if (p != NULL)
+ *suffix = skip_whitespace(p);
+ }
+ }
+ /* remove trailing whitespace */
+ while ((endp > shebang_line) && isspace(*endp))
+ --endp;
+ if (endp > shebang_line)
+ endp[1] = L'\0';
+ }
+ }
+ return rc;
+}
+
+/* #define CP_UTF8 65001 defined in winnls.h */
+#define CP_UTF16LE 1200
+#define CP_UTF16BE 1201
+#define CP_UTF32LE 12000
+#define CP_UTF32BE 12001
+
+typedef struct {
+ int length;
+ char sequence[4];
+ UINT code_page;
+} BOM;
+
+/*
+ * Strictly, we don't need to handle UTF-16 anf UTF-32, since Python itself
+ * doesn't. Never mind, one day it might - there's no harm leaving it in.
+ */
+static BOM BOMs[] = {
+ { 3, { 0xEF, 0xBB, 0xBF }, CP_UTF8 }, /* UTF-8 - keep first */
+ { 2, { 0xFF, 0xFE }, CP_UTF16LE }, /* UTF-16LE */
+ { 2, { 0xFE, 0xFF }, CP_UTF16BE }, /* UTF-16BE */
+ { 4, { 0xFF, 0xFE, 0x00, 0x00 }, CP_UTF32LE }, /* UTF-32LE */
+ { 4, { 0x00, 0x00, 0xFE, 0xFF }, CP_UTF32BE }, /* UTF-32BE */
+ { 0 } /* sentinel */
+};
+
+static BOM *
+find_BOM(char * buffer)
+{
+/*
+ * Look for a BOM in the input and return a pointer to the
+ * corresponding structure, or NULL if not found.
+ */
+ BOM * result = NULL;
+ BOM *bom;
+
+ for (bom = BOMs; bom->length; bom++) {
+ if (strncmp(bom->sequence, buffer, bom->length) == 0) {
+ result = bom;
+ break;
+ }
+ }
+ return result;
+}
+
+static char *
+find_terminator(char * buffer, int len, BOM *bom)
+{
+ char * result = NULL;
+ char * end = buffer + len;
+ char * p;
+ char c;
+ int cp;
+
+ for (p = buffer; p < end; p++) {
+ c = *p;
+ if (c == '\r') {
+ result = p;
+ break;
+ }
+ if (c == '\n') {
+ result = p;
+ break;
+ }
+ }
+ if (result != NULL) {
+ cp = bom->code_page;
+
+ /* adjustments to include all bytes of the char */
+ /* no adjustment needed for UTF-8 or big endian */
+ if (cp == CP_UTF16LE)
+ ++result;
+ else if (cp == CP_UTF32LE)
+ result += 3;
+ ++result; /* point just past terminator */
+ }
+ return result;
+}
+
+static BOOL
+validate_version(wchar_t * p)
+{
+ BOOL result = TRUE;
+
+ if (!isdigit(*p)) /* expect major version */
+ result = FALSE;
+ else if (*++p) { /* more to do */
+ if (*p != L'.') /* major/minor separator */
+ result = FALSE;
+ else {
+ ++p;
+ if (!isdigit(*p)) /* expect minor version */
+ result = FALSE;
+ else {
+ ++p;
+ if (*p) { /* more to do */
+ if (*p != L'-')
+ result = FALSE;
+ else {
+ ++p;
+ if ((*p != '3') && (*++p != '2') && !*++p)
+ result = FALSE;
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
+typedef struct {
+ unsigned short min;
+ unsigned short max;
+ wchar_t version[MAX_VERSION_SIZE];
+} PYC_MAGIC;
+
+static PYC_MAGIC magic_values[] = {
+ { 0xc687, 0xc687, L"2.0" },
+ { 0xeb2a, 0xeb2a, L"2.1" },
+ { 0xed2d, 0xed2d, L"2.2" },
+ { 0xf23b, 0xf245, L"2.3" },
+ { 0xf259, 0xf26d, L"2.4" },
+ { 0xf277, 0xf2b3, L"2.5" },
+ { 0xf2c7, 0xf2d1, L"2.6" },
+ { 0xf2db, 0xf303, L"2.7" },
+ { 0x0bb8, 0x0c3b, L"3.0" },
+ { 0x0c45, 0x0c4f, L"3.1" },
+ { 0x0c58, 0x0c6c, L"3.2" },
+ { 0x0c76, 0x0c76, L"3.3" },
+ { 0 }
+};
+
+static INSTALLED_PYTHON *
+find_by_magic(unsigned short magic)
+{
+ INSTALLED_PYTHON * result = NULL;
+ PYC_MAGIC * mp;
+
+ for (mp = magic_values; mp->min; mp++) {
+ if ((magic >= mp->min) && (magic <= mp->max)) {
+ result = locate_python(mp->version);
+ if (result != NULL)
+ break;
+ }
+ }
+ return result;
+}
+
+static void
+maybe_handle_shebang(wchar_t ** argv, wchar_t * cmdline)
+{
+/*
+ * Look for a shebang line in the first argument. If found
+ * and we spawn a child process, this never returns. If it
+ * does return then we process the args "normally".
+ *
+ * argv[0] might be a filename with a shebang.
+ */
+ FILE * fp;
+ errno_t rc = _wfopen_s(&fp, *argv, L"rb");
+ unsigned char buffer[BUFSIZE];
+ wchar_t shebang_line[BUFSIZE + 1];
+ size_t read;
+ char *p;
+ char * start;
+ char * shebang_alias = (char *) shebang_line;
+ BOM* bom;
+ int i, j, nchars = 0;
+ int header_len;
+ BOOL is_virt;
+ wchar_t * command;
+ wchar_t * suffix;
+ INSTALLED_PYTHON * ip;
+
+ if (rc == 0) {
+ read = fread(buffer, sizeof(char), BUFSIZE, fp);
+ debug(L"maybe_handle_shebang: read %d bytes\n", read);
+ fclose(fp);
+
+ if ((read >= 4) && (buffer[3] == '\n') && (buffer[2] == '\r')) {
+ ip = find_by_magic((buffer[1] << 8 | buffer[0]) & 0xFFFF);
+ if (ip != NULL) {
+ debug(L"script file is compiled against Python %s\n",
+ ip->version);
+ invoke_child(ip->executable, NULL, cmdline);
+ }
+ }
+ /* Look for BOM */
+ bom = find_BOM(buffer);
+ if (bom == NULL) {
+ start = buffer;
+ debug(L"maybe_handle_shebang: BOM not found, using UTF-8\n");
+ bom = BOMs; /* points to UTF-8 entry - the default */
+ }
+ else {
+ debug(L"maybe_handle_shebang: BOM found, code page %d\n",
+ bom->code_page);
+ start = &buffer[bom->length];
+ }
+ p = find_terminator(start, BUFSIZE, bom);
+ /*
+ * If no CR or LF was found in the heading,
+ * we assume it's not a shebang file.
+ */
+ if (p == NULL) {
+ debug(L"maybe_handle_shebang: No line terminator found\n");
+ }
+ else {
+ /*
+ * Found line terminator - parse the shebang.
+ *
+ * Strictly, we don't need to handle UTF-16 anf UTF-32,
+ * since Python itself doesn't.
+ * Never mind, one day it might.
+ */
+ header_len = (int) (p - start);
+ switch(bom->code_page) {
+ case CP_UTF8:
+ nchars = MultiByteToWideChar(bom->code_page,
+ 0,
+ start, header_len, shebang_line,
+ BUFSIZE);
+ break;
+ case CP_UTF16BE:
+ if (header_len % 2 != 0) {
+ debug(L"maybe_handle_shebang: UTF-16BE, but an odd number \
+of bytes: %d\n", header_len);
+ /* nchars = 0; Not needed - initialised to 0. */
+ }
+ else {
+ for (i = header_len; i > 0; i -= 2) {
+ shebang_alias[i - 1] = start[i - 2];
+ shebang_alias[i - 2] = start[i - 1];
+ }
+ nchars = header_len / sizeof(wchar_t);
+ }
+ break;
+ case CP_UTF16LE:
+ if ((header_len % 2) != 0) {
+ debug(L"UTF-16LE, but an odd number of bytes: %d\n",
+ header_len);
+ /* nchars = 0; Not needed - initialised to 0. */
+ }
+ else {
+ /* no actual conversion needed. */
+ memcpy(shebang_line, start, header_len);
+ nchars = header_len / sizeof(wchar_t);
+ }
+ break;
+ case CP_UTF32BE:
+ if (header_len % 4 != 0) {
+ debug(L"UTF-32BE, but not divisible by 4: %d\n",
+ header_len);
+ /* nchars = 0; Not needed - initialised to 0. */
+ }
+ else {
+ for (i = header_len, j = header_len / 2; i > 0; i -= 4,
+ j -= 2) {
+ shebang_alias[j - 1] = start[i - 2];
+ shebang_alias[j - 2] = start[i - 1];
+ }
+ nchars = header_len / sizeof(wchar_t);
+ }
+ break;
+ case CP_UTF32LE:
+ if (header_len % 4 != 0) {
+ debug(L"UTF-32LE, but not divisible by 4: %d\n",
+ header_len);
+ /* nchars = 0; Not needed - initialised to 0. */
+ }
+ else {
+ for (i = header_len, j = header_len / 2; i > 0; i -= 4,
+ j -= 2) {
+ shebang_alias[j - 1] = start[i - 3];
+ shebang_alias[j - 2] = start[i - 4];
+ }
+ nchars = header_len / sizeof(wchar_t);
+ }
+ break;
+ }
+ if (nchars > 0) {
+ shebang_line[--nchars] = L'\0';
+ is_virt = parse_shebang(shebang_line, nchars, &command,
+ &suffix);
+ if (command != NULL) {
+ debug(L"parse_shebang: found command: %s\n", command);
+ if (!is_virt) {
+ invoke_child(command, suffix, cmdline);
+ }
+ else {
+ suffix = wcschr(command, L' ');
+ if (suffix != NULL) {
+ *suffix++ = L'\0';
+ suffix = skip_whitespace(suffix);
+ }
+ if (wcsncmp(command, L"python", 6))
+ error(RC_BAD_VIRTUAL_PATH, L"Unknown virtual \
+path '%s'", command);
+ command += 6; /* skip past "python" */
+ if (*command && !validate_version(command))
+ error(RC_BAD_VIRTUAL_PATH, L"Invalid version \
+specification: '%s'.\nIn the first line of the script, 'python' needs to be \
+followed by a valid version specifier.\nPlease check the documentation.",
+ command);
+ /* TODO could call validate_version(command) */
+ ip = locate_python(command);
+ if (ip == NULL) {
+ error(RC_NO_PYTHON, L"Requested Python version \
+(%s) is not installed", command);
+ }
+ else {
+ invoke_child(ip->executable, suffix, cmdline);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+static wchar_t *
+skip_me(wchar_t * cmdline)
+{
+ BOOL quoted;
+ wchar_t c;
+ wchar_t * result = cmdline;
+
+ quoted = cmdline[0] == L'\"';
+ if (!quoted)
+ c = L' ';
+ else {
+ c = L'\"';
+ ++result;
+ }
+ result = wcschr(result, c);
+ if (result == NULL) /* when, for example, just exe name on command line */
+ result = L"";
+ else {
+ ++result; /* skip past space or closing quote */
+ result = skip_whitespace(result);
+ }
+ return result;
+}
+
+static DWORD version_high = 0;
+static DWORD version_low = 0;
+
+static void
+get_version_info(wchar_t * version_text, size_t size)
+{
+ WORD maj, min, rel, bld;
+
+ if (!version_high && !version_low)
+ wcsncpy_s(version_text, size, L"0.1", _TRUNCATE); /* fallback */
+ else {
+ maj = HIWORD(version_high);
+ min = LOWORD(version_high);
+ rel = HIWORD(version_low);
+ bld = LOWORD(version_low);
+ _snwprintf_s(version_text, size, _TRUNCATE, L"%d.%d.%d.%d", maj,
+ min, rel, bld);
+ }
+}
+
+static int
+process(int argc, wchar_t ** argv)
+{
+ wchar_t * wp;
+ wchar_t * command;
+ wchar_t * p;
+ int rc = 0;
+ size_t plen;
+ INSTALLED_PYTHON * ip;
+ BOOL valid;
+ DWORD size, attrs;
+ HRESULT hr;
+ wchar_t message[MSGSIZE];
+ wchar_t version_text [MAX_PATH];
+ void * version_data;
+ VS_FIXEDFILEINFO * file_info;
+ UINT block_size;
+
+ wp = get_env(L"PYLAUNCH_DEBUG");
+ if ((wp != NULL) && (*wp != L'\0'))
+ log_fp = stderr;
+
+#if defined(_M_X64)
+ debug(L"launcher build: 64bit\n");
+#else
+ debug(L"launcher build: 32bit\n");
+#endif
+#if defined(_WINDOWS)
+ debug(L"launcher executable: Windows\n");
+#else
+ debug(L"launcher executable: Console\n");
+#endif
+ /* Get the local appdata folder (non-roaming) */
+ hr = SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA,
+ NULL, 0, appdata_ini_path);
+ if (hr != S_OK) {
+ debug(L"SHGetFolderPath failed: %X\n", hr);
+ appdata_ini_path[0] = L'\0';
+ }
+ else {
+ plen = wcslen(appdata_ini_path);
+ p = &appdata_ini_path[plen];
+ wcsncpy_s(p, MAX_PATH - plen, L"\\py.ini", _TRUNCATE);
+ attrs = GetFileAttributesW(appdata_ini_path);
+ if (attrs == INVALID_FILE_ATTRIBUTES) {
+ debug(L"File '%s' non-existent\n", appdata_ini_path);
+ appdata_ini_path[0] = L'\0';
+ } else {
+ debug(L"Using local configuration file '%s'\n", appdata_ini_path);
+ }
+ }
+ plen = GetModuleFileNameW(NULL, launcher_ini_path, MAX_PATH);
+ size = GetFileVersionInfoSizeW(launcher_ini_path, &size);
+ if (size == 0) {
+ winerror(GetLastError(), message, MSGSIZE);
+ debug(L"GetFileVersionInfoSize failed: %s\n", message);
+ }
+ else {
+ version_data = malloc(size);
+ if (version_data) {
+ valid = GetFileVersionInfoW(launcher_ini_path, 0, size,
+ version_data);
+ if (!valid)
+ debug(L"GetFileVersionInfo failed: %X\n", GetLastError());
+ else {
+ valid = VerQueryValueW(version_data, L"\\", &file_info,
+ &block_size);
+ if (!valid)
+ debug(L"VerQueryValue failed: %X\n", GetLastError());
+ else {
+ version_high = file_info->dwFileVersionMS;
+ version_low = file_info->dwFileVersionLS;
+ }
+ }
+ free(version_data);
+ }
+ }
+ p = wcsrchr(launcher_ini_path, L'\\');
+ if (p == NULL) {
+ debug(L"GetModuleFileNameW returned value has no backslash: %s\n",
+ launcher_ini_path);
+ launcher_ini_path[0] = L'\0';
+ }
+ else {
+ wcsncpy_s(p, MAX_PATH - (p - launcher_ini_path), L"\\py.ini",
+ _TRUNCATE);
+ attrs = GetFileAttributesW(launcher_ini_path);
+ if (attrs == INVALID_FILE_ATTRIBUTES) {
+ debug(L"File '%s' non-existent\n", launcher_ini_path);
+ launcher_ini_path[0] = L'\0';
+ } else {
+ debug(L"Using global configuration file '%s'\n", launcher_ini_path);
+ }
+ }
+
+ command = skip_me(GetCommandLineW());
+ debug(L"Called with command line: %s", command);
+ if (argc <= 1) {
+ valid = FALSE;
+ p = NULL;
+ }
+ else {
+ p = argv[1];
+ plen = wcslen(p);
+ if (p[0] != L'-') {
+ read_commands();
+ maybe_handle_shebang(&argv[1], command);
+ }
+ /* No file with shebang, or an unrecognised shebang.
+ * Is the first arg a special version qualifier?
+ */
+ valid = (*p == L'-') && validate_version(&p[1]);
+ if (valid) {
+ ip = locate_python(&p[1]);
+ if (ip == NULL)
+ error(RC_NO_PYTHON, L"Requested Python version (%s) not \
+installed", &p[1]);
+ command += wcslen(p);
+ command = skip_whitespace(command);
+ }
+ }
+ if (!valid) {
+ ip = locate_python(L"");
+ if (ip == NULL)
+ error(RC_NO_PYTHON, L"Can't find a default Python.");
+ if ((argc == 2) && (!_wcsicmp(p, L"-h") || !_wcsicmp(p, L"--help"))) {
+#if defined(_M_X64)
+ BOOL canDo64bit = TRUE;
+#else
+ // If we are a 32bit process on a 64bit Windows, first hit the 64bit keys.
+ BOOL canDo64bit = FALSE;
+ IsWow64Process(GetCurrentProcess(), &canDo64bit);
+#endif
+
+ get_version_info(version_text, MAX_PATH);
+ fwprintf(stdout, L"\
+Python Launcher for Windows Version %s\n\n", version_text);
+ fwprintf(stdout, L"\
+usage: %s [ launcher-arguments ] script [ script-arguments ]\n\n", argv[0]);
+ fputws(L"\
+Launcher arguments:\n\n\
+-2 : Launch the latest Python 2.x version\n\
+-3 : Launch the latest Python 3.x version\n\
+-X.Y : Launch the specified Python version\n", stdout);
+ if (canDo64bit) {
+ fputws(L"\
+-X.Y-32: Launch the specified 32bit Python version", stdout);
+ }
+ fputws(L"\n\nThe following help text is from Python:\n\n", stdout);
+ fflush(stdout);
+ }
+ }
+ invoke_child(ip->executable, NULL, command);
+ return rc;
+}
+
+#if defined(_WINDOWS)
+
+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ LPWSTR lpstrCmd, int nShow)
+{
+ return process(__argc, __wargv);
+}
+
+#else
+
+int cdecl wmain(int argc, wchar_t ** argv)
+{
+ return process(argc, argv);
+}
+
+#endif \ No newline at end of file
diff --git a/PC/launcher.ico b/PC/launcher.ico
new file mode 100644
index 0000000..dad7d57
--- /dev/null
+++ b/PC/launcher.ico
Binary files differ
diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index 166df03..04d2088 100755
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -27,6 +27,8 @@
#ifdef _MSC_VER
#if _MSC_VER >= 1500 && _MSC_VER < 1600
#include <crtassem.h>
+#elif _MSC_VER >= 1600
+#include <crtversion.h>
#endif
#endif
@@ -211,8 +213,7 @@ cannot be read with this function.");
static PyObject *
msvcrt_getwch(PyObject *self, PyObject *args)
{
- Py_UNICODE ch;
- Py_UNICODE u[1];
+ wchar_t ch;
if (!PyArg_ParseTuple(args, ":getwch"))
return NULL;
@@ -220,8 +221,7 @@ msvcrt_getwch(PyObject *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS
ch = _getwch();
Py_END_ALLOW_THREADS
- u[0] = ch;
- return PyUnicode_FromUnicode(u, 1);
+ return PyUnicode_FromOrdinal(ch);
}
PyDoc_STRVAR(getwch_doc,
@@ -256,8 +256,7 @@ a printable character.");
static PyObject *
msvcrt_getwche(PyObject *self, PyObject *args)
{
- Py_UNICODE ch;
- Py_UNICODE s[1];
+ wchar_t ch;
if (!PyArg_ParseTuple(args, ":getwche"))
return NULL;
@@ -265,8 +264,7 @@ msvcrt_getwche(PyObject *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS
ch = _getwche();
Py_END_ALLOW_THREADS
- s[0] = ch;
- return PyUnicode_FromUnicode(s, 1);
+ return PyUnicode_FromOrdinal(ch);
}
PyDoc_STRVAR(getwche_doc,
@@ -468,7 +466,7 @@ PyMODINIT_FUNC
PyInit_msvcrt(void)
{
int st;
- PyObject *d;
+ PyObject *d, *version;
PyObject *m = PyModule_Create(&msvcrtmodule);
if (m == NULL)
return NULL;
@@ -498,6 +496,7 @@ PyInit_msvcrt(void)
#endif
/* constants for the crt versions */
+ (void)st;
#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
_VC_ASSEMBLY_PUBLICKEYTOKEN);
@@ -514,5 +513,15 @@ PyInit_msvcrt(void)
if (st < 0) return NULL;
#endif
+ /* constants for the 2010 crt versions */
+#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
+ version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
+ _VC_CRT_MINOR_VERSION,
+ _VC_CRT_BUILD_VERSION,
+ _VC_CRT_RBUILD_VERSION);
+ st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
+ if (st < 0) return NULL;
+#endif
+
return m;
}
diff --git a/PC/os2emx/Makefile b/PC/os2emx/Makefile
index d9cded7..800610e 100644
--- a/PC/os2emx/Makefile
+++ b/PC/os2emx/Makefile
@@ -237,7 +237,7 @@ $(OUT)%$O: %.c
# Output file names
PYTHON_VER= 2.6
-PYTHON_LIB= python26
+PYTHON_LIB= python33
PYTHON.LIB= $(PYTHON_LIB)_s$A
PYTHON.IMPLIB= $(PYTHON_LIB)$A
ifeq ($(EXEOMF),yes)
diff --git a/PC/os2emx/README.os2emx b/PC/os2emx/README.os2emx
index fcf55d2..61cf6df 100644
--- a/PC/os2emx/README.os2emx
+++ b/PC/os2emx/README.os2emx
@@ -305,7 +305,7 @@ Procedure
to be installed in a directory other than the PYTHONHOME directory, set
the value of the Makefile variable EXE_DIR to the appropriate directory.
-3. If you wish the Python core DLL (python26.dll) to be installed in a
+3. If you wish the Python core DLL (python33.dll) to be installed in a
directory other than the directory in which the Python executables are
installed (by default, the PYTHONHOME directory), set the value of the
Makefile variable DLL_DIR to the appropriate directory. This DLL must
diff --git a/PC/os2emx/config.c b/PC/os2emx/config.c
index 218aa68..5879110 100644
--- a/PC/os2emx/config.c
+++ b/PC/os2emx/config.c
@@ -150,10 +150,9 @@ struct _inittab _PyImport_Inittab[] = {
{"marshal", PyMarshal_Init},
/* This lives it with import.c */
- {"imp", initimp},
+ {"_imp", initimp},
/* These entries are here for sys.builtin_module_names */
- {"__main__", NULL},
{"builtins", NULL},
{"sys", NULL},
diff --git a/PC/os2emx/pyconfig.h b/PC/os2emx/pyconfig.h
index 380e19c..e56105a 100644
--- a/PC/os2emx/pyconfig.h
+++ b/PC/os2emx/pyconfig.h
@@ -1,6 +1,8 @@
#ifndef Py_CONFIG_H
#define Py_CONFIG_H
+#error "PEP 11: OS/2 is now unsupported, code will be removed in Python 3.4"
+
/* config.h.
* At some time in the past, generated automatically by/from configure.
* now maintained manually.
diff --git a/PC/os2emx/python27.def b/PC/os2emx/python33.def
index d87dd76..256726b 100644
--- a/PC/os2emx/python27.def
+++ b/PC/os2emx/python33.def
@@ -1,72 +1,72 @@
-LIBRARY python26 INITINSTANCE TERMINSTANCE
+LIBRARY python33 INITINSTANCE TERMINSTANCE
DESCRIPTION "Python 2.6 Core DLL"
PROTMODE
DATA MULTIPLE NONSHARED
EXPORTS
-; From python26_s.lib(config)
+; From python33_s.lib(config)
"_PyImport_Inittab"
-; From python26_s.lib(dlfcn)
+; From python33_s.lib(dlfcn)
; "dlopen"
; "dlsym"
; "dlclose"
; "dlerror"
-; From python26_s.lib(getpathp)
+; From python33_s.lib(getpathp)
"Py_GetProgramFullPath"
"Py_GetPrefix"
"Py_GetExecPrefix"
"Py_GetPath"
-; From python26_s.lib(getbuildinfo)
+; From python33_s.lib(getbuildinfo)
"Py_GetBuildInfo"
"_Py_svnversion"
-; From python26_s.lib(main)
+; From python33_s.lib(main)
"Py_Main"
"Py_GetArgcArgv"
-; From python26_s.lib(acceler)
+; From python33_s.lib(acceler)
"PyGrammar_AddAccelerators"
"PyGrammar_RemoveAccelerators"
-; From python26_s.lib(grammar1)
+; From python33_s.lib(grammar1)
"PyGrammar_FindDFA"
"PyGrammar_LabelRepr"
-; From python26_s.lib(listnode)
+; From python33_s.lib(listnode)
"PyNode_ListTree"
-; From python26_s.lib(node)
+; From python33_s.lib(node)
"PyNode_New"
"PyNode_AddChild"
"PyNode_Free"
-; From python26_s.lib(parser)
+; From python33_s.lib(parser)
"PyParser_AddToken"
"PyParser_New"
"PyParser_Delete"
-; From python26_s.lib(parsetok)
+; From python33_s.lib(parsetok)
"PyParser_ParseString"
"PyParser_ParseStringFlagsFilename"
"PyParser_ParseFile"
"PyParser_ParseFileFlags"
"PyParser_ParseStringFlags"
-; From python26_s.lib(bitset)
+; From python33_s.lib(bitset)
"_Py_newbitset"
"_Py_delbitset"
"_Py_addbit"
"_Py_samebitset"
"_Py_mergebitset"
-; From python26_s.lib(metagrammar)
+; From python33_s.lib(metagrammar)
"_Py_meta_grammar"
"Py_meta_grammar"
-; From python26_s.lib(tokenizer)
+; From python33_s.lib(tokenizer)
"PyToken_OneChar"
"PyToken_TwoChars"
"PyToken_ThreeChars"
@@ -76,14 +76,14 @@ EXPORTS
"PyTokenizer_Get"
"_PyParser_TokenNames"
-; From python26_s.lib(myreadline)
+; From python33_s.lib(myreadline)
"_PyOS_ReadlineTState"
"PyOS_ReadlineFunctionPointer"
"PyOS_StdioReadline"
"PyOS_Readline"
"PyOS_InputHook"
-; From python26_s.lib(abstract)
+; From python33_s.lib(abstract)
"_PyObject_LengthHint"
"PyMapping_Size"
"PyObject_CallMethod"
@@ -174,13 +174,13 @@ EXPORTS
"PyObject_IsInstance"
"PyObject_IsSubclass"
-; From python26_s.lib(boolobject)
+; From python33_s.lib(boolobject)
"PyBool_FromLong"
"PyBool_Type"
"_Py_ZeroStruct"
"_Py_TrueStruct"
-; From python26_s.lib(bufferobject)
+; From python33_s.lib(bufferobject)
"PyBuffer_FromObject"
"PyBuffer_FromReadWriteObject"
"PyBuffer_FromMemory"
@@ -188,13 +188,13 @@ EXPORTS
"PyBuffer_New"
"PyBuffer_Type"
-; From python26_s.lib(cellobject)
+; From python33_s.lib(cellobject)
"PyCell_New"
"PyCell_Get"
"PyCell_Set"
"PyCell_Type"
-; From python26_s.lib(classobject)
+; From python33_s.lib(classobject)
"PyClass_New"
"PyClass_IsSubclass"
"PyInstance_New"
@@ -209,7 +209,7 @@ EXPORTS
"PyInstance_Type"
"PyMethod_Type"
-; From python26_s.lib(capsule)
+; From python33_s.lib(capsule)
"PyCapsule_GetContext"
"PyCapsule_GetDestructor"
"PyCapsule_GetName"
@@ -222,7 +222,7 @@ EXPORTS
"PyCapsule_SetName"
"PyCapsule_SetPointer"
-; From python26_s.lib(cobject)
+; From python33_s.lib(cobject)
"PyCObject_FromVoidPtr"
"PyCObject_FromVoidPtrAndDesc"
"PyCObject_AsVoidPtr"
@@ -231,13 +231,13 @@ EXPORTS
"PyCObject_SetVoidPtr"
"PyCObject_Type"
-; From python26_s.lib(codeobject)
+; From python33_s.lib(codeobject)
"PyCode_New"
"PyCode_Addr2Line"
"PyCode_CheckLineNumber"
"PyCode_Type"
-; From python26_s.lib(complexobject)
+; From python33_s.lib(complexobject)
"_Py_c_pow"
"_Py_c_sum"
"_Py_c_diff"
@@ -251,7 +251,7 @@ EXPORTS
"PyComplex_AsCComplex"
"PyComplex_Type"
-; From python26_s.lib(descrobject)
+; From python33_s.lib(descrobject)
"PyWrapper_New"
"PyDescr_NewMethod"
"PyDescr_NewClassMethod"
@@ -262,7 +262,7 @@ EXPORTS
"PyWrapperDescr_Type"
"PyProperty_Type"
-; From python26_s.lib(dictobject)
+; From python33_s.lib(dictobject)
"PyDict_New"
"PyDict_GetItem"
"PyDict_SetItem"
@@ -286,11 +286,11 @@ EXPORTS
"PyDictIterValue_Type"
"PyDictIterItem_Type"
-; From python26_s.lib(enumobject)
+; From python33_s.lib(enumobject)
"PyEnum_Type"
"PyReversed_Type"
-; From python26_s.lib(fileobject)
+; From python33_s.lib(fileobject)
"PyFile_FromString"
"Py_UniversalNewlineFread"
"PyFile_GetLine"
@@ -306,7 +306,7 @@ EXPORTS
"PyFile_Name"
"PyFile_Type"
-; From python26_s.lib(floatobject)
+; From python33_s.lib(floatobject)
"PyFloat_FromString"
"PyFloat_AsDouble"
"PyFloat_Fini"
@@ -321,7 +321,7 @@ EXPORTS
"PyFloat_AsStringEx"
"PyFloat_Type"
-; From python26_s.lib(frameobject)
+; From python33_s.lib(frameobject)
"PyFrame_New"
"PyFrame_FastToLocals"
"PyFrame_LocalsToFast"
@@ -331,7 +331,7 @@ EXPORTS
"PyFrame_BlockPop"
"PyFrame_Type"
-; From python26_s.lib(funcobject)
+; From python33_s.lib(funcobject)
"PyFunction_New"
"PyFunction_GetCode"
"PyFunction_GetGlobals"
@@ -346,12 +346,12 @@ EXPORTS
"PyClassMethod_Type"
"PyStaticMethod_Type"
-; From python26_s.lib(genobject)
+; From python33_s.lib(genobject)
"PyGen_New"
"PyGen_NeedsFinalizing"
"PyGen_Type"
-; From python26_s.lib(intobject)
+; From python33_s.lib(intobject)
"PyInt_AsLong"
"PyInt_AsUnsignedLongMask"
"PyInt_AsUnsignedLongLongMask"
@@ -366,13 +366,13 @@ EXPORTS
"_PyInt_Init"
"PyInt_Type"
-; From python26_s.lib(iterobject)
+; From python33_s.lib(iterobject)
"PySeqIter_New"
"PyCallIter_New"
"PySeqIter_Type"
"PyCallIter_Type"
-; From python26_s.lib(listobject)
+; From python33_s.lib(listobject)
"PyList_New"
"PyList_Append"
"PyList_Size"
@@ -390,7 +390,7 @@ EXPORTS
"PyListIter_Type"
"PyListRevIter_Type"
-; From python26_s.lib(longobject)
+; From python33_s.lib(longobject)
"PyLong_FromDouble"
"PyLong_AsLong"
"_PyLong_AsSsize_t"
@@ -420,7 +420,7 @@ EXPORTS
"PyLong_Type"
"_PyLong_DigitValue"
-; From python26_s.lib(methodobject)
+; From python33_s.lib(methodobject)
"PyCFunction_Call"
"Py_FindMethodInChain"
"PyCFunction_GetFunction"
@@ -432,7 +432,7 @@ EXPORTS
"PyCFunction_New"
"PyCFunction_Type"
-; From python26_s.lib(moduleobject)
+; From python33_s.lib(moduleobject)
"PyModule_New"
"_PyModule_Clear"
"PyModule_GetDict"
@@ -440,7 +440,7 @@ EXPORTS
"PyModule_GetFilename"
"PyModule_Type"
-; From python26_s.lib(object)
+; From python33_s.lib(object)
"Py_DivisionWarningFlag"
"PyObject_Str"
"PyObject_Repr"
@@ -493,15 +493,15 @@ EXPORTS
"_PyTrash_delete_nesting"
"_PyTrash_delete_later"
-; From python26_s.lib(obmalloc)
+; From python33_s.lib(obmalloc)
"PyObject_Malloc"
"PyObject_Free"
"PyObject_Realloc"
-; From python26_s.lib(rangeobject)
+; From python33_s.lib(rangeobject)
"PyRange_Type"
-; From python26_s.lib(setobject)
+; From python33_s.lib(setobject)
"PySet_Pop"
"PySet_New"
"PyFrozenSet_New"
@@ -516,7 +516,7 @@ EXPORTS
"PySet_Type"
"PyFrozenSet_Type"
-; From python26_s.lib(sliceobject)
+; From python33_s.lib(sliceobject)
"_PySlice_FromIndices"
"PySlice_GetIndices"
"PySlice_GetIndicesEx"
@@ -524,7 +524,7 @@ EXPORTS
"_Py_EllipsisObject"
"PySlice_Type"
-; From python26_s.lib(stringobject)
+; From python33_s.lib(stringobject)
"PyString_FromStringAndSize"
"PyString_InternInPlace"
"PyString_FromString"
@@ -555,12 +555,12 @@ EXPORTS
"PyString_Type"
"PyBaseString_Type"
-; From python26_s.lib(structseq)
+; From python33_s.lib(structseq)
"PyStructSequence_InitType"
"PyStructSequence_New"
"PyStructSequence_UnnamedField"
-; From python26_s.lib(tupleobject)
+; From python33_s.lib(tupleobject)
"PyTuple_New"
"PyTuple_Pack"
"_PyTuple_Resize"
@@ -572,7 +572,7 @@ EXPORTS
"PyTuple_Type"
"PyTupleIter_Type"
-; From python26_s.lib(typeobject)
+; From python33_s.lib(typeobject)
"PyType_IsSubtype"
"_PyType_Lookup"
"PyType_Ready"
@@ -583,7 +583,7 @@ EXPORTS
"PyBaseObject_Type"
"PySuper_Type"
-; From python26_s.lib(unicodeobject)
+; From python33_s.lib(unicodeobject)
"PyUnicodeUCS2_Resize"
"PyUnicodeUCS2_FromOrdinal"
"PyUnicodeUCS2_FromObject"
@@ -649,7 +649,7 @@ EXPORTS
"PyUnicode_AsDecodedObject"
"PyUnicode_Type"
-; From python26_s.lib(unicodectype)
+; From python33_s.lib(unicodectype)
"_PyUnicode_TypeRecords"
"_PyUnicodeUCS2_ToNumeric"
"_PyUnicodeUCS2_IsLowercase"
@@ -667,7 +667,7 @@ EXPORTS
"_PyUnicodeUCS2_IsNumeric"
"_PyUnicodeUCS2_IsAlpha"
-; From python26_s.lib(weakrefobject)
+; From python33_s.lib(weakrefobject)
"PyWeakref_NewRef"
"PyWeakref_NewProxy"
"PyObject_ClearWeakRefs"
@@ -678,7 +678,7 @@ EXPORTS
"_PyWeakref_ProxyType"
"_PyWeakref_CallableProxyType"
-; From python26_s.lib(Python-ast)
+; From python33_s.lib(Python-ast)
; "init_ast"
"Module"
"Interactive"
@@ -737,18 +737,18 @@ EXPORTS
"alias"
"PyAST_mod2obj"
-; From python26_s.lib(asdl)
+; From python33_s.lib(asdl)
"asdl_seq_new"
"asdl_int_seq_new"
-; From python26_s.lib(ast)
+; From python33_s.lib(ast)
"PyAST_FromNode"
-; From python26_s.lib(bltinmodule)
+; From python33_s.lib(bltinmodule)
"_PyBuiltin_Init"
"Py_FileSystemDefaultEncoding"
-; From python26_s.lib(exceptions)
+; From python33_s.lib(exceptions)
"PyUnicodeEncodeError_GetStart"
"PyUnicodeDecodeError_GetStart"
"PyUnicodeEncodeError_GetEnd"
@@ -824,7 +824,7 @@ EXPORTS
"PyExc_ImportWarning"
"PyExc_MemoryErrorInst"
-; From python26_s.lib(ceval)
+; From python33_s.lib(ceval)
"PyEval_EvalFrameEx"
"PyEval_CallObjectWithKeywords"
"PyEval_EvalCodeEx"
@@ -863,13 +863,13 @@ EXPORTS
"_Py_CheckInterval"
"_Py_Ticker"
-; From python26_s.lib(compile)
+; From python33_s.lib(compile)
"_Py_Mangle"
"PyAST_Compile"
"PyNode_Compile"
"Py_OptimizeFlag"
-; From python26_s.lib(codecs)
+; From python33_s.lib(codecs)
"_PyCodec_Lookup"
"PyCodec_Encode"
"PyCodec_Decode"
@@ -888,7 +888,7 @@ EXPORTS
"PyCodec_LookupError"
"PyCodec_StrictErrors"
-; From python26_s.lib(errors)
+; From python33_s.lib(errors)
"PyErr_SetNone"
"PyErr_SetString"
"PyErr_GivenExceptionMatches"
@@ -914,16 +914,16 @@ EXPORTS
"PyErr_Warn"
"PyErr_WarnExplicit"
-; From python26_s.lib(frozen)
+; From python33_s.lib(frozen)
"PyImport_FrozenModules"
-; From python26_s.lib(frozenmain)
+; From python33_s.lib(frozenmain)
"Py_FrozenMain"
-; From python26_s.lib(future)
+; From python33_s.lib(future)
"PyFuture_FromAST"
-; From python26_s.lib(getargs)
+; From python33_s.lib(getargs)
"PyArg_Parse"
"_PyArg_Parse_SizeT"
"PyArg_ParseTuple"
@@ -937,22 +937,22 @@ EXPORTS
"_PyArg_VaParse_SizeT"
"_PyArg_VaParseTupleAndKeywords_SizeT"
-; From python26_s.lib(getcompiler)
+; From python33_s.lib(getcompiler)
"Py_GetCompiler"
-; From python26_s.lib(getcopyright)
+; From python33_s.lib(getcopyright)
"Py_GetCopyright"
-; From python26_s.lib(getplatform)
+; From python33_s.lib(getplatform)
"Py_GetPlatform"
-; From python26_s.lib(getversion)
+; From python33_s.lib(getversion)
"Py_GetVersion"
-; From python26_s.lib(graminit)
+; From python33_s.lib(graminit)
"_PyParser_Grammar"
-; From python26_s.lib(import)
+; From python33_s.lib(import)
"_PyImport_Init"
"_PyImportHooks_Init"
"PyImport_ImportModule"
@@ -979,10 +979,10 @@ EXPORTS
"PyImport_Inittab"
"_PyImport_Filetab"
-; From python26_s.lib(importdl)
+; From python33_s.lib(importdl)
"_PyImport_LoadDynamicModule"
-; From python26_s.lib(marshal)
+; From python33_s.lib(marshal)
"PyMarshal_ReadLongFromFile"
"PyMarshal_WriteObjectToString"
"PyMarshal_WriteLongToFile"
@@ -993,7 +993,7 @@ EXPORTS
"PyMarshal_ReadObjectFromString"
"PyMarshal_Init"
-; From python26_s.lib(modsupport)
+; From python33_s.lib(modsupport)
"Py_InitModule4"
"Py_BuildValue"
"_Py_BuildValue_SizeT"
@@ -1006,24 +1006,24 @@ EXPORTS
"PyModule_AddStringConstant"
"_Py_PackageContext"
-; From python26_s.lib(mysnprintf)
+; From python33_s.lib(mysnprintf)
"PyOS_snprintf"
"PyOS_vsnprintf"
-; From python26_s.lib(mystrtoul)
+; From python33_s.lib(mystrtoul)
"PyOS_strtoul"
"PyOS_strtol"
-; From python26_s.lib(pyarena)
+; From python33_s.lib(pyarena)
"PyArena_New"
"PyArena_Free"
"PyArena_Malloc"
"PyArena_AddPyObject"
-; From python26_s.lib(pyfpe)
+; From python33_s.lib(pyfpe)
"PyFPE_dummy"
-; From python26_s.lib(pystate)
+; From python33_s.lib(pystate)
"PyInterpreterState_Clear"
"PyThreadState_Clear"
"_PyThread_CurrentFrames"
@@ -1048,7 +1048,7 @@ EXPORTS
"_PyThreadState_Current"
"_PyThreadState_GetFrame"
-; From python26_s.lib(pythonrun)
+; From python33_s.lib(pythonrun)
"Py_IgnoreEnvironmentFlag"
"Py_DebugFlag"
"Py_VerboseFlag"
@@ -1110,20 +1110,20 @@ EXPORTS
"Py_UnicodeFlag"
"_Py_QnewFlag"
-; From python26_s.lib(structmember)
+; From python33_s.lib(structmember)
"PyMember_Get"
"PyMember_GetOne"
"PyMember_SetOne"
"PyMember_Set"
-; From python26_s.lib(symtable)
+; From python33_s.lib(symtable)
"PySymtable_Build"
"PySymtable_Free"
"PyST_GetScope"
"PySymtable_Lookup"
"PySTEntry_Type"
-; From python26_s.lib(sysmodule)
+; From python33_s.lib(sysmodule)
"_PySys_Init"
"PySys_WriteStderr"
"PySys_SetPath"
@@ -1137,22 +1137,22 @@ EXPORTS
"PySys_ResetWarnOptions"
"PySys_AddWarnOption"
-; From python26_s.lib(traceback)
+; From python33_s.lib(traceback)
"PyTraceBack_Here"
"PyTraceBack_Print"
"PyTraceBack_Type"
-; From python26_s.lib(getopt)
+; From python33_s.lib(getopt)
"_PyOS_GetOpt"
"_PyOS_opterr"
"_PyOS_optind"
"_PyOS_optarg"
-; From python26_s.lib(dynload_shlib)
+; From python33_s.lib(dynload_shlib)
"_PyImport_DynLoadFiletab"
"_PyImport_GetDynLoadFunc"
-; From python26_s.lib(thread)
+; From python33_s.lib(thread)
"PyThread_delete_key_value"
"PyThread_init_thread"
"PyThread_start_new_thread"
@@ -1169,7 +1169,7 @@ EXPORTS
"PyThread_set_key_value"
"PyThread_get_key_value"
-; From python26_s.lib(gcmodule)
+; From python33_s.lib(gcmodule)
; "initgc"
"_PyObject_GC_New"
"_PyObject_GC_NewVar"
@@ -1185,7 +1185,7 @@ EXPORTS
"_PyObject_GC_Del"
"_PyGC_generation0"
-; From python26_s.lib(signalmodule)
+; From python33_s.lib(signalmodule)
; "initsignal"
"PyErr_CheckSignals"
"PyErr_SetInterrupt"
@@ -1194,121 +1194,121 @@ EXPORTS
"PyOS_InitInterrupts"
"PyOS_AfterFork"
-; From python26_s.lib(posixmodule)
+; From python33_s.lib(posixmodule)
; "initos2"
-; From python26_s.lib(_threadmodule)
+; From python33_s.lib(_threadmodule)
; "init_thread"
-; From python26_s.lib(arraymodule)
+; From python33_s.lib(arraymodule)
; "initarray"
; "array_methods"
-; From python26_s.lib(binascii)
+; From python33_s.lib(binascii)
; "initbinascii"
-; From python26_s.lib(cmathmodule)
+; From python33_s.lib(cmathmodule)
; "initcmath"
-; From python26_s.lib(_codecsmodule)
+; From python33_s.lib(_codecsmodule)
; "init_codecs"
-; From python26_s.lib(collectionsmodule)
+; From python33_s.lib(collectionsmodule)
; "initcollections"
"dequeiter_type"
"dequereviter_type"
-; From python26_s.lib(cPickle)
+; From python33_s.lib(cPickle)
; "initcPickle"
; "fast_save_leave"
-; From python26_s.lib(_csv)
+; From python33_s.lib(_csv)
; "init_csv"
-; From python26_s.lib(datetimemodule)
+; From python33_s.lib(datetimemodule)
; "initdatetime"
-; From python26_s.lib(dlmodule)
+; From python33_s.lib(dlmodule)
; "initdl"
-; From python26_s.lib(errnomodule)
+; From python33_s.lib(errnomodule)
; "initerrno"
-; From python26_s.lib(fcntlmodule)
+; From python33_s.lib(fcntlmodule)
; "initfcntl"
-; From python26_s.lib(_functoolsmodule)
+; From python33_s.lib(_functoolsmodule)
; "init_functools"
-; From python26_s.lib(_heapqmodule)
+; From python33_s.lib(_heapqmodule)
; "init_heapq"
-; From python26_s.lib(imageop)
+; From python33_s.lib(imageop)
; "initimageop"
-; From python26_s.lib(itertoolsmodule)
+; From python33_s.lib(itertoolsmodule)
; "inititertools"
-; From python26_s.lib(_localemodule)
+; From python33_s.lib(_localemodule)
; "init_locale"
-; From python26_s.lib(mathmodule)
+; From python33_s.lib(mathmodule)
; "initmath"
-; From python26_s.lib(md5)
+; From python33_s.lib(md5)
"md5_finish"
"md5_init"
"md5_append"
-; From python26_s.lib(md5module)
+; From python33_s.lib(md5module)
; "init_md5"
-; From python26_s.lib(operator)
+; From python33_s.lib(operator)
; "initoperator"
-; From python26_s.lib(_randommodule)
+; From python33_s.lib(_randommodule)
; "init_random"
-; From python26_s.lib(rgbimgmodule)
+; From python33_s.lib(rgbimgmodule)
; "initrgbimg"
-; From python26_s.lib(shamodule)
+; From python33_s.lib(shamodule)
; "init_sha"
-; From python26_s.lib(sha256module)
+; From python33_s.lib(sha256module)
; "init_sha256"
-; From python26_s.lib(sha512module)
+; From python33_s.lib(sha512module)
; "init_sha512"
-; From python26_s.lib(_sre)
+; From python33_s.lib(_sre)
; "init_sre"
-; From python26_s.lib(stropmodule)
+; From python33_s.lib(stropmodule)
; "initstrop"
-; From python26_s.lib(_struct)
+; From python33_s.lib(_struct)
; "init_struct"
-; From python26_s.lib(symtablemodule)
+; From python33_s.lib(symtablemodule)
; "init_symtable"
-; From python26_s.lib(termios)
+; From python33_s.lib(termios)
; "inittermios"
-; From python26_s.lib(timemodule)
+; From python33_s.lib(timemodule)
; "inittime"
"_PyTime_DoubleToTimet"
; "inittimezone"
-; From python26_s.lib(timingmodule)
+; From python33_s.lib(timingmodule)
; "inittiming"
-; From python26_s.lib(_weakref)
+; From python33_s.lib(_weakref)
; "init_weakref"
-; From python26_s.lib(xxsubtype)
+; From python33_s.lib(xxsubtype)
; "initxxsubtype"
-; From python26_s.lib(zipimport)
+; From python33_s.lib(zipimport)
; "initzipimport"
diff --git a/PC/os2vacpp/config.c b/PC/os2vacpp/config.c
index bbdf6f3..b26b521 100644
--- a/PC/os2vacpp/config.c
+++ b/PC/os2vacpp/config.c
@@ -88,10 +88,9 @@ struct _inittab _PyImport_Inittab[] = {
{"marshal", PyMarshal_Init},
/* This lives it with import.c */
- {"imp", initimp},
+ {"_imp", initimp},
/* These entries are here for sys.builtin_module_names */
- {"__main__", NULL},
{"builtins", NULL},
{"sys", NULL},
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index ba80800..d6de5f0 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -215,14 +215,19 @@ typedef int pid_t;
#define copysign _copysign
#define hypot _hypot
-#endif /* _MSC_VER */
+/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/
+#if _MSC_VER >= 1400 && _MSC_VER < 1600
+#define HAVE_SXS 1
+#endif
/* define some ANSI types that are not defined in earlier Win headers */
-#if defined(_MSC_VER) && _MSC_VER >= 1200
+#if _MSC_VER >= 1200
/* This file only exists in VC 6.0 or higher */
#include <basetsd.h>
#endif
+#endif /* _MSC_VER */
+
/* ------------------------------------------------------------------------*/
/* The Borland compiler defines __BORLANDC__ */
/* XXX These defines are likely incomplete, but should be easy to fix. */
@@ -319,11 +324,11 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
their Makefile (other compilers are generally
taken care of by distutils.) */
# if defined(_DEBUG)
-# pragma comment(lib,"python32_d.lib")
+# pragma comment(lib,"python33_d.lib")
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
-# pragma comment(lib,"python32.lib")
+# pragma comment(lib,"python33.lib")
# endif /* _DEBUG */
# endif /* _MSC_VER */
# endif /* Py_BUILD_CORE */
@@ -550,10 +555,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Define if you want to use the GNU readline library */
/* #define WITH_READLINE 1 */
-/* Define as the size of the unicode type. */
-/* This is enough for unicodeobject.h to do the "right thing" on Windows. */
-#define Py_UNICODE_SIZE 2
-
/* Use Python's own small-block memory-allocator. */
#define WITH_PYMALLOC 1
@@ -714,9 +715,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Define if you have the <sys/utsname.h> header file. */
/* #define HAVE_SYS_UTSNAME_H 1 */
-/* Define if you have the <thread.h> header file. */
-/* #undef HAVE_THREAD_H */
-
/* Define if you have the <unistd.h> header file. */
/* #define HAVE_UNISTD_H 1 */
diff --git a/PC/pylauncher.rc b/PC/pylauncher.rc
new file mode 100644
index 0000000..df5824a
--- /dev/null
+++ b/PC/pylauncher.rc
@@ -0,0 +1,51 @@
+#include <windows.h>
+
+#define MS_WINDOWS
+#include "..\Include\modsupport.h"
+#include "..\Include\patchlevel.h"
+#ifdef _DEBUG
+# include "pythonnt_rc_d.h"
+#else
+# include "pythonnt_rc.h"
+#endif
+
+#define PYTHON_VERSION PY_VERSION "\0"
+#define PYVERSION64 PY_MAJOR_VERSION, PY_MINOR_VERSION, FIELD3, PYTHON_API_VERSION
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION PYVERSION64
+ PRODUCTVERSION PYVERSION64
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080904b0"
+ BEGIN
+ VALUE "Comments", "Python Launcher for Windows"
+ VALUE "CompanyName", "Python Software Foundation"
+ VALUE "FileDescription", "Python Launcher for Windows (Console)"
+ VALUE "FileVersion", PYTHON_VERSION
+ VALUE "InternalName", "py"
+ VALUE "LegalCopyright", "Copyright (C) 2011-2012 Python Software Foundation"
+ VALUE "OriginalFilename", "py"
+ VALUE "ProductName", "Python Launcher for Windows"
+ VALUE "ProductVersion", PYTHON_VERSION
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x809, 1200
+ END
+END
+
+IDI_ICON1 ICON "launcher.ico"
+
+
diff --git a/PC/python3.def b/PC/python3.def
index a845335..d726525 100644
--- a/PC/python3.def
+++ b/PC/python3.def
@@ -1,689 +1,699 @@
+; When changing this file, run python33gen.py
LIBRARY "python3"
EXPORTS
- PyArg_Parse=python32.PyArg_Parse
- PyArg_ParseTuple=python32.PyArg_ParseTuple
- PyArg_ParseTupleAndKeywords=python32.PyArg_ParseTupleAndKeywords
- PyArg_UnpackTuple=python32.PyArg_UnpackTuple
- PyArg_VaParse=python32.PyArg_VaParse
- PyArg_VaParseTupleAndKeywords=python32.PyArg_VaParseTupleAndKeywords
- PyArg_ValidateKeywordArguments=python32.PyArg_ValidateKeywordArguments
- PyBaseObject_Type=python32.PyBaseObject_Type DATA
- PyBool_FromLong=python32.PyBool_FromLong
- PyBool_Type=python32.PyBool_Type DATA
- PyByteArrayIter_Type=python32.PyByteArrayIter_Type DATA
- PyByteArray_AsString=python32.PyByteArray_AsString
- PyByteArray_Concat=python32.PyByteArray_Concat
- PyByteArray_FromObject=python32.PyByteArray_FromObject
- PyByteArray_FromStringAndSize=python32.PyByteArray_FromStringAndSize
- PyByteArray_Resize=python32.PyByteArray_Resize
- PyByteArray_Size=python32.PyByteArray_Size
- PyByteArray_Type=python32.PyByteArray_Type DATA
- PyBytesIter_Type=python32.PyBytesIter_Type DATA
- PyBytes_AsString=python32.PyBytes_AsString
- PyBytes_AsStringAndSize=python32.PyBytes_AsStringAndSize
- PyBytes_Concat=python32.PyBytes_Concat
- PyBytes_ConcatAndDel=python32.PyBytes_ConcatAndDel
- PyBytes_DecodeEscape=python32.PyBytes_DecodeEscape
- PyBytes_FromFormat=python32.PyBytes_FromFormat
- PyBytes_FromFormatV=python32.PyBytes_FromFormatV
- PyBytes_FromObject=python32.PyBytes_FromObject
- PyBytes_FromString=python32.PyBytes_FromString
- PyBytes_FromStringAndSize=python32.PyBytes_FromStringAndSize
- PyBytes_Repr=python32.PyBytes_Repr
- PyBytes_Size=python32.PyBytes_Size
- PyBytes_Type=python32.PyBytes_Type DATA
- PyCFunction_Call=python32.PyCFunction_Call
- PyCFunction_ClearFreeList=python32.PyCFunction_ClearFreeList
- PyCFunction_GetFlags=python32.PyCFunction_GetFlags
- PyCFunction_GetFunction=python32.PyCFunction_GetFunction
- PyCFunction_GetSelf=python32.PyCFunction_GetSelf
- PyCFunction_NewEx=python32.PyCFunction_NewEx
- PyCFunction_Type=python32.PyCFunction_Type DATA
- PyCallIter_New=python32.PyCallIter_New
- PyCallIter_Type=python32.PyCallIter_Type DATA
- PyCallable_Check=python32.PyCallable_Check
- PyCapsule_GetContext=python32.PyCapsule_GetContext
- PyCapsule_GetDestructor=python32.PyCapsule_GetDestructor
- PyCapsule_GetName=python32.PyCapsule_GetName
- PyCapsule_GetPointer=python32.PyCapsule_GetPointer
- PyCapsule_Import=python32.PyCapsule_Import
- PyCapsule_IsValid=python32.PyCapsule_IsValid
- PyCapsule_New=python32.PyCapsule_New
- PyCapsule_SetContext=python32.PyCapsule_SetContext
- PyCapsule_SetDestructor=python32.PyCapsule_SetDestructor
- PyCapsule_SetName=python32.PyCapsule_SetName
- PyCapsule_SetPointer=python32.PyCapsule_SetPointer
- PyCapsule_Type=python32.PyCapsule_Type DATA
- PyClassMethodDescr_Type=python32.PyClassMethodDescr_Type DATA
- PyCodec_BackslashReplaceErrors=python32.PyCodec_BackslashReplaceErrors
- PyCodec_Decode=python32.PyCodec_Decode
- PyCodec_Decoder=python32.PyCodec_Decoder
- PyCodec_Encode=python32.PyCodec_Encode
- PyCodec_Encoder=python32.PyCodec_Encoder
- PyCodec_IgnoreErrors=python32.PyCodec_IgnoreErrors
- PyCodec_IncrementalDecoder=python32.PyCodec_IncrementalDecoder
- PyCodec_IncrementalEncoder=python32.PyCodec_IncrementalEncoder
- PyCodec_KnownEncoding=python32.PyCodec_KnownEncoding
- PyCodec_LookupError=python32.PyCodec_LookupError
- PyCodec_Register=python32.PyCodec_Register
- PyCodec_RegisterError=python32.PyCodec_RegisterError
- PyCodec_ReplaceErrors=python32.PyCodec_ReplaceErrors
- PyCodec_StreamReader=python32.PyCodec_StreamReader
- PyCodec_StreamWriter=python32.PyCodec_StreamWriter
- PyCodec_StrictErrors=python32.PyCodec_StrictErrors
- PyCodec_XMLCharRefReplaceErrors=python32.PyCodec_XMLCharRefReplaceErrors
- PyComplex_FromDoubles=python32.PyComplex_FromDoubles
- PyComplex_ImagAsDouble=python32.PyComplex_ImagAsDouble
- PyComplex_RealAsDouble=python32.PyComplex_RealAsDouble
- PyComplex_Type=python32.PyComplex_Type DATA
- PyDescr_NewClassMethod=python32.PyDescr_NewClassMethod
- PyDescr_NewGetSet=python32.PyDescr_NewGetSet
- PyDescr_NewMember=python32.PyDescr_NewMember
- PyDescr_NewMethod=python32.PyDescr_NewMethod
- PyDictItems_Type=python32.PyDictItems_Type DATA
- PyDictIterItem_Type=python32.PyDictIterItem_Type DATA
- PyDictIterKey_Type=python32.PyDictIterKey_Type DATA
- PyDictIterValue_Type=python32.PyDictIterValue_Type DATA
- PyDictKeys_Type=python32.PyDictKeys_Type DATA
- PyDictProxy_New=python32.PyDictProxy_New
- PyDictProxy_Type=python32.PyDictProxy_Type DATA
- PyDictValues_Type=python32.PyDictValues_Type DATA
- PyDict_Clear=python32.PyDict_Clear
- PyDict_Contains=python32.PyDict_Contains
- PyDict_Copy=python32.PyDict_Copy
- PyDict_DelItem=python32.PyDict_DelItem
- PyDict_DelItemString=python32.PyDict_DelItemString
- PyDict_GetItem=python32.PyDict_GetItem
- PyDict_GetItemString=python32.PyDict_GetItemString
- PyDict_GetItemWithError=python32.PyDict_GetItemWithError
- PyDict_Items=python32.PyDict_Items
- PyDict_Keys=python32.PyDict_Keys
- PyDict_Merge=python32.PyDict_Merge
- PyDict_MergeFromSeq2=python32.PyDict_MergeFromSeq2
- PyDict_New=python32.PyDict_New
- PyDict_Next=python32.PyDict_Next
- PyDict_SetItem=python32.PyDict_SetItem
- PyDict_SetItemString=python32.PyDict_SetItemString
- PyDict_Size=python32.PyDict_Size
- PyDict_Type=python32.PyDict_Type DATA
- PyDict_Update=python32.PyDict_Update
- PyDict_Values=python32.PyDict_Values
- PyEllipsis_Type=python32.PyEllipsis_Type DATA
- PyEnum_Type=python32.PyEnum_Type DATA
- PyErr_BadArgument=python32.PyErr_BadArgument
- PyErr_BadInternalCall=python32.PyErr_BadInternalCall
- PyErr_CheckSignals=python32.PyErr_CheckSignals
- PyErr_Clear=python32.PyErr_Clear
- PyErr_Display=python32.PyErr_Display
- PyErr_ExceptionMatches=python32.PyErr_ExceptionMatches
- PyErr_Fetch=python32.PyErr_Fetch
- PyErr_Format=python32.PyErr_Format
- PyErr_GivenExceptionMatches=python32.PyErr_GivenExceptionMatches
- PyErr_NewException=python32.PyErr_NewException
- PyErr_NewExceptionWithDoc=python32.PyErr_NewExceptionWithDoc
- PyErr_NoMemory=python32.PyErr_NoMemory
- PyErr_NormalizeException=python32.PyErr_NormalizeException
- PyErr_Occurred=python32.PyErr_Occurred
- PyErr_Print=python32.PyErr_Print
- PyErr_PrintEx=python32.PyErr_PrintEx
- PyErr_ProgramText=python32.PyErr_ProgramText
- PyErr_Restore=python32.PyErr_Restore
- PyErr_SetFromErrno=python32.PyErr_SetFromErrno
- PyErr_SetFromErrnoWithFilename=python32.PyErr_SetFromErrnoWithFilename
- PyErr_SetFromErrnoWithFilenameObject=python32.PyErr_SetFromErrnoWithFilenameObject
- PyErr_SetInterrupt=python32.PyErr_SetInterrupt
- PyErr_SetNone=python32.PyErr_SetNone
- PyErr_SetObject=python32.PyErr_SetObject
- PyErr_SetString=python32.PyErr_SetString
- PyErr_SyntaxLocation=python32.PyErr_SyntaxLocation
- PyErr_WarnEx=python32.PyErr_WarnEx
- PyErr_WarnExplicit=python32.PyErr_WarnExplicit
- PyErr_WarnFormat=python32.PyErr_WarnFormat
- PyErr_WriteUnraisable=python32.PyErr_WriteUnraisable
- PyEval_AcquireLock=python32.PyEval_AcquireLock
- PyEval_AcquireThread=python32.PyEval_AcquireThread
- PyEval_CallFunction=python32.PyEval_CallFunction
- PyEval_CallMethod=python32.PyEval_CallMethod
- PyEval_CallObjectWithKeywords=python32.PyEval_CallObjectWithKeywords
- PyEval_EvalCode=python32.PyEval_EvalCode
- PyEval_EvalCodeEx=python32.PyEval_EvalCodeEx
- PyEval_EvalFrame=python32.PyEval_EvalFrame
- PyEval_EvalFrameEx=python32.PyEval_EvalFrameEx
- PyEval_GetBuiltins=python32.PyEval_GetBuiltins
- PyEval_GetCallStats=python32.PyEval_GetCallStats
- PyEval_GetFrame=python32.PyEval_GetFrame
- PyEval_GetFuncDesc=python32.PyEval_GetFuncDesc
- PyEval_GetFuncName=python32.PyEval_GetFuncName
- PyEval_GetGlobals=python32.PyEval_GetGlobals
- PyEval_GetLocals=python32.PyEval_GetLocals
- PyEval_InitThreads=python32.PyEval_InitThreads
- PyEval_ReInitThreads=python32.PyEval_ReInitThreads
- PyEval_ReleaseLock=python32.PyEval_ReleaseLock
- PyEval_ReleaseThread=python32.PyEval_ReleaseThread
- PyEval_RestoreThread=python32.PyEval_RestoreThread
- PyEval_SaveThread=python32.PyEval_SaveThread
- PyEval_ThreadsInitialized=python32.PyEval_ThreadsInitialized
- PyExc_ArithmeticError=python32.PyExc_ArithmeticError DATA
- PyExc_AssertionError=python32.PyExc_AssertionError DATA
- PyExc_AttributeError=python32.PyExc_AttributeError DATA
- PyExc_BaseException=python32.PyExc_BaseException DATA
- PyExc_BufferError=python32.PyExc_BufferError DATA
- PyExc_BytesWarning=python32.PyExc_BytesWarning DATA
- PyExc_DeprecationWarning=python32.PyExc_DeprecationWarning DATA
- PyExc_EOFError=python32.PyExc_EOFError DATA
- PyExc_EnvironmentError=python32.PyExc_EnvironmentError DATA
- PyExc_Exception=python32.PyExc_Exception DATA
- PyExc_FloatingPointError=python32.PyExc_FloatingPointError DATA
- PyExc_FutureWarning=python32.PyExc_FutureWarning DATA
- PyExc_GeneratorExit=python32.PyExc_GeneratorExit DATA
- PyExc_IOError=python32.PyExc_IOError DATA
- PyExc_ImportError=python32.PyExc_ImportError DATA
- PyExc_ImportWarning=python32.PyExc_ImportWarning DATA
- PyExc_IndentationError=python32.PyExc_IndentationError DATA
- PyExc_IndexError=python32.PyExc_IndexError DATA
- PyExc_KeyError=python32.PyExc_KeyError DATA
- PyExc_KeyboardInterrupt=python32.PyExc_KeyboardInterrupt DATA
- PyExc_LookupError=python32.PyExc_LookupError DATA
- PyExc_MemoryError=python32.PyExc_MemoryError DATA
- PyExc_MemoryErrorInst=python32.PyExc_MemoryErrorInst DATA
- PyExc_NameError=python32.PyExc_NameError DATA
- PyExc_NotImplementedError=python32.PyExc_NotImplementedError DATA
- PyExc_OSError=python32.PyExc_OSError DATA
- PyExc_OverflowError=python32.PyExc_OverflowError DATA
- PyExc_PendingDeprecationWarning=python32.PyExc_PendingDeprecationWarning DATA
- PyExc_RecursionErrorInst=python32.PyExc_RecursionErrorInst DATA
- PyExc_ReferenceError=python32.PyExc_ReferenceError DATA
- PyExc_RuntimeError=python32.PyExc_RuntimeError DATA
- PyExc_RuntimeWarning=python32.PyExc_RuntimeWarning DATA
- PyExc_StopIteration=python32.PyExc_StopIteration DATA
- PyExc_SyntaxError=python32.PyExc_SyntaxError DATA
- PyExc_SyntaxWarning=python32.PyExc_SyntaxWarning DATA
- PyExc_SystemError=python32.PyExc_SystemError DATA
- PyExc_SystemExit=python32.PyExc_SystemExit DATA
- PyExc_TabError=python32.PyExc_TabError DATA
- PyExc_TypeError=python32.PyExc_TypeError DATA
- PyExc_UnboundLocalError=python32.PyExc_UnboundLocalError DATA
- PyExc_UnicodeDecodeError=python32.PyExc_UnicodeDecodeError DATA
- PyExc_UnicodeEncodeError=python32.PyExc_UnicodeEncodeError DATA
- PyExc_UnicodeError=python32.PyExc_UnicodeError DATA
- PyExc_UnicodeTranslateError=python32.PyExc_UnicodeTranslateError DATA
- PyExc_UnicodeWarning=python32.PyExc_UnicodeWarning DATA
- PyExc_UserWarning=python32.PyExc_UserWarning DATA
- PyExc_ValueError=python32.PyExc_ValueError DATA
- PyExc_Warning=python32.PyExc_Warning DATA
- PyExc_ZeroDivisionError=python32.PyExc_ZeroDivisionError DATA
- PyException_GetCause=python32.PyException_GetCause
- PyException_GetContext=python32.PyException_GetContext
- PyException_GetTraceback=python32.PyException_GetTraceback
- PyException_SetCause=python32.PyException_SetCause
- PyException_SetContext=python32.PyException_SetContext
- PyException_SetTraceback=python32.PyException_SetTraceback
- PyFile_FromFd=python32.PyFile_FromFd
- PyFile_GetLine=python32.PyFile_GetLine
- PyFile_WriteObject=python32.PyFile_WriteObject
- PyFile_WriteString=python32.PyFile_WriteString
- PyFilter_Type=python32.PyFilter_Type DATA
- PyFloat_AsDouble=python32.PyFloat_AsDouble
- PyFloat_FromDouble=python32.PyFloat_FromDouble
- PyFloat_FromString=python32.PyFloat_FromString
- PyFloat_GetInfo=python32.PyFloat_GetInfo
- PyFloat_GetMax=python32.PyFloat_GetMax
- PyFloat_GetMin=python32.PyFloat_GetMin
- PyFloat_Type=python32.PyFloat_Type DATA
- PyFrozenSet_New=python32.PyFrozenSet_New
- PyFrozenSet_Type=python32.PyFrozenSet_Type DATA
- PyGC_Collect=python32.PyGC_Collect
- PyGILState_Ensure=python32.PyGILState_Ensure
- PyGILState_GetThisThreadState=python32.PyGILState_GetThisThreadState
- PyGILState_Release=python32.PyGILState_Release
- PyGetSetDescr_Type=python32.PyGetSetDescr_Type DATA
- PyImport_AddModule=python32.PyImport_AddModule
- PyImport_AppendInittab=python32.PyImport_AppendInittab
- PyImport_Cleanup=python32.PyImport_Cleanup
- PyImport_ExecCodeModule=python32.PyImport_ExecCodeModule
- PyImport_ExecCodeModuleEx=python32.PyImport_ExecCodeModuleEx
- PyImport_ExecCodeModuleWithPathnames=python32.PyImport_ExecCodeModuleWithPathnames
- PyImport_GetImporter=python32.PyImport_GetImporter
- PyImport_GetMagicNumber=python32.PyImport_GetMagicNumber
- PyImport_GetMagicTag=python32.PyImport_GetMagicTag
- PyImport_GetModuleDict=python32.PyImport_GetModuleDict
- PyImport_Import=python32.PyImport_Import
- PyImport_ImportFrozenModule=python32.PyImport_ImportFrozenModule
- PyImport_ImportModule=python32.PyImport_ImportModule
- PyImport_ImportModuleLevel=python32.PyImport_ImportModuleLevel
- PyImport_ImportModuleNoBlock=python32.PyImport_ImportModuleNoBlock
- PyImport_ReloadModule=python32.PyImport_ReloadModule
- PyInterpreterState_Clear=python32.PyInterpreterState_Clear
- PyInterpreterState_Delete=python32.PyInterpreterState_Delete
- PyInterpreterState_New=python32.PyInterpreterState_New
- PyIter_Next=python32.PyIter_Next
- PyListIter_Type=python32.PyListIter_Type DATA
- PyListRevIter_Type=python32.PyListRevIter_Type DATA
- PyList_Append=python32.PyList_Append
- PyList_AsTuple=python32.PyList_AsTuple
- PyList_GetItem=python32.PyList_GetItem
- PyList_GetSlice=python32.PyList_GetSlice
- PyList_Insert=python32.PyList_Insert
- PyList_New=python32.PyList_New
- PyList_Reverse=python32.PyList_Reverse
- PyList_SetItem=python32.PyList_SetItem
- PyList_SetSlice=python32.PyList_SetSlice
- PyList_Size=python32.PyList_Size
- PyList_Sort=python32.PyList_Sort
- PyList_Type=python32.PyList_Type DATA
- PyLongRangeIter_Type=python32.PyLongRangeIter_Type DATA
- PyLong_AsDouble=python32.PyLong_AsDouble
- PyLong_AsLong=python32.PyLong_AsLong
- PyLong_AsLongAndOverflow=python32.PyLong_AsLongAndOverflow
- PyLong_AsLongLong=python32.PyLong_AsLongLong
- PyLong_AsLongLongAndOverflow=python32.PyLong_AsLongLongAndOverflow
- PyLong_AsSize_t=python32.PyLong_AsSize_t
- PyLong_AsSsize_t=python32.PyLong_AsSsize_t
- PyLong_AsUnsignedLong=python32.PyLong_AsUnsignedLong
- PyLong_AsUnsignedLongLong=python32.PyLong_AsUnsignedLongLong
- PyLong_AsUnsignedLongLongMask=python32.PyLong_AsUnsignedLongLongMask
- PyLong_AsUnsignedLongMask=python32.PyLong_AsUnsignedLongMask
- PyLong_AsVoidPtr=python32.PyLong_AsVoidPtr
- PyLong_FromDouble=python32.PyLong_FromDouble
- PyLong_FromLong=python32.PyLong_FromLong
- PyLong_FromLongLong=python32.PyLong_FromLongLong
- PyLong_FromSize_t=python32.PyLong_FromSize_t
- PyLong_FromSsize_t=python32.PyLong_FromSsize_t
- PyLong_FromString=python32.PyLong_FromString
- PyLong_FromUnsignedLong=python32.PyLong_FromUnsignedLong
- PyLong_FromUnsignedLongLong=python32.PyLong_FromUnsignedLongLong
- PyLong_FromVoidPtr=python32.PyLong_FromVoidPtr
- PyLong_GetInfo=python32.PyLong_GetInfo
- PyLong_Type=python32.PyLong_Type DATA
- PyMap_Type=python32.PyMap_Type DATA
- PyMapping_Check=python32.PyMapping_Check
- PyMapping_GetItemString=python32.PyMapping_GetItemString
- PyMapping_HasKey=python32.PyMapping_HasKey
- PyMapping_HasKeyString=python32.PyMapping_HasKeyString
- PyMapping_Items=python32.PyMapping_Items
- PyMapping_Keys=python32.PyMapping_Keys
- PyMapping_Length=python32.PyMapping_Length
- PyMapping_SetItemString=python32.PyMapping_SetItemString
- PyMapping_Size=python32.PyMapping_Size
- PyMapping_Values=python32.PyMapping_Values
- PyMem_Free=python32.PyMem_Free
- PyMem_Malloc=python32.PyMem_Malloc
- PyMem_Realloc=python32.PyMem_Realloc
- PyMemberDescr_Type=python32.PyMemberDescr_Type DATA
- PyMemoryView_FromObject=python32.PyMemoryView_FromObject
- PyMemoryView_GetContiguous=python32.PyMemoryView_GetContiguous
- PyMemoryView_Type=python32.PyMemoryView_Type DATA
- PyMethodDescr_Type=python32.PyMethodDescr_Type DATA
- PyModule_AddIntConstant=python32.PyModule_AddIntConstant
- PyModule_AddObject=python32.PyModule_AddObject
- PyModule_AddStringConstant=python32.PyModule_AddStringConstant
- PyModule_Create2=python32.PyModule_Create2
- PyModule_GetDef=python32.PyModule_GetDef
- PyModule_GetDict=python32.PyModule_GetDict
- PyModule_GetFilename=python32.PyModule_GetFilename
- PyModule_GetFilenameObject=python32.PyModule_GetFilenameObject
- PyModule_GetName=python32.PyModule_GetName
- PyModule_GetState=python32.PyModule_GetState
- PyModule_New=python32.PyModule_New
- PyModule_Type=python32.PyModule_Type DATA
- PyNullImporter_Type=python32.PyNullImporter_Type DATA
- PyNumber_Absolute=python32.PyNumber_Absolute
- PyNumber_Add=python32.PyNumber_Add
- PyNumber_And=python32.PyNumber_And
- PyNumber_AsSsize_t=python32.PyNumber_AsSsize_t
- PyNumber_Check=python32.PyNumber_Check
- PyNumber_Divmod=python32.PyNumber_Divmod
- PyNumber_Float=python32.PyNumber_Float
- PyNumber_FloorDivide=python32.PyNumber_FloorDivide
- PyNumber_InPlaceAdd=python32.PyNumber_InPlaceAdd
- PyNumber_InPlaceAnd=python32.PyNumber_InPlaceAnd
- PyNumber_InPlaceFloorDivide=python32.PyNumber_InPlaceFloorDivide
- PyNumber_InPlaceLshift=python32.PyNumber_InPlaceLshift
- PyNumber_InPlaceMultiply=python32.PyNumber_InPlaceMultiply
- PyNumber_InPlaceOr=python32.PyNumber_InPlaceOr
- PyNumber_InPlacePower=python32.PyNumber_InPlacePower
- PyNumber_InPlaceRemainder=python32.PyNumber_InPlaceRemainder
- PyNumber_InPlaceRshift=python32.PyNumber_InPlaceRshift
- PyNumber_InPlaceSubtract=python32.PyNumber_InPlaceSubtract
- PyNumber_InPlaceTrueDivide=python32.PyNumber_InPlaceTrueDivide
- PyNumber_InPlaceXor=python32.PyNumber_InPlaceXor
- PyNumber_Index=python32.PyNumber_Index
- PyNumber_Invert=python32.PyNumber_Invert
- PyNumber_Long=python32.PyNumber_Long
- PyNumber_Lshift=python32.PyNumber_Lshift
- PyNumber_Multiply=python32.PyNumber_Multiply
- PyNumber_Negative=python32.PyNumber_Negative
- PyNumber_Or=python32.PyNumber_Or
- PyNumber_Positive=python32.PyNumber_Positive
- PyNumber_Power=python32.PyNumber_Power
- PyNumber_Remainder=python32.PyNumber_Remainder
- PyNumber_Rshift=python32.PyNumber_Rshift
- PyNumber_Subtract=python32.PyNumber_Subtract
- PyNumber_ToBase=python32.PyNumber_ToBase
- PyNumber_TrueDivide=python32.PyNumber_TrueDivide
- PyNumber_Xor=python32.PyNumber_Xor
- PyOS_AfterFork=python32.PyOS_AfterFork
- PyOS_InitInterrupts=python32.PyOS_InitInterrupts
- PyOS_InputHook=python32.PyOS_InputHook DATA
- PyOS_InterruptOccurred=python32.PyOS_InterruptOccurred
- PyOS_ReadlineFunctionPointer=python32.PyOS_ReadlineFunctionPointer DATA
- PyOS_double_to_string=python32.PyOS_double_to_string
- PyOS_getsig=python32.PyOS_getsig
- PyOS_mystricmp=python32.PyOS_mystricmp
- PyOS_mystrnicmp=python32.PyOS_mystrnicmp
- PyOS_setsig=python32.PyOS_setsig
- PyOS_snprintf=python32.PyOS_snprintf
- PyOS_string_to_double=python32.PyOS_string_to_double
- PyOS_strtol=python32.PyOS_strtol
- PyOS_strtoul=python32.PyOS_strtoul
- PyOS_vsnprintf=python32.PyOS_vsnprintf
- PyObject_ASCII=python32.PyObject_ASCII
- PyObject_AsCharBuffer=python32.PyObject_AsCharBuffer
- PyObject_AsFileDescriptor=python32.PyObject_AsFileDescriptor
- PyObject_AsReadBuffer=python32.PyObject_AsReadBuffer
- PyObject_AsWriteBuffer=python32.PyObject_AsWriteBuffer
- PyObject_Bytes=python32.PyObject_Bytes
- PyObject_Call=python32.PyObject_Call
- PyObject_CallFunction=python32.PyObject_CallFunction
- PyObject_CallFunctionObjArgs=python32.PyObject_CallFunctionObjArgs
- PyObject_CallMethod=python32.PyObject_CallMethod
- PyObject_CallMethodObjArgs=python32.PyObject_CallMethodObjArgs
- PyObject_CallObject=python32.PyObject_CallObject
- PyObject_CheckReadBuffer=python32.PyObject_CheckReadBuffer
- PyObject_ClearWeakRefs=python32.PyObject_ClearWeakRefs
- PyObject_DelItem=python32.PyObject_DelItem
- PyObject_DelItemString=python32.PyObject_DelItemString
- PyObject_Dir=python32.PyObject_Dir
- PyObject_Format=python32.PyObject_Format
- PyObject_Free=python32.PyObject_Free
- PyObject_GC_Del=python32.PyObject_GC_Del
- PyObject_GC_Track=python32.PyObject_GC_Track
- PyObject_GC_UnTrack=python32.PyObject_GC_UnTrack
- PyObject_GenericGetAttr=python32.PyObject_GenericGetAttr
- PyObject_GenericSetAttr=python32.PyObject_GenericSetAttr
- PyObject_GetAttr=python32.PyObject_GetAttr
- PyObject_GetAttrString=python32.PyObject_GetAttrString
- PyObject_GetItem=python32.PyObject_GetItem
- PyObject_GetIter=python32.PyObject_GetIter
- PyObject_HasAttr=python32.PyObject_HasAttr
- PyObject_HasAttrString=python32.PyObject_HasAttrString
- PyObject_Hash=python32.PyObject_Hash
- PyObject_HashNotImplemented=python32.PyObject_HashNotImplemented
- PyObject_Init=python32.PyObject_Init
- PyObject_InitVar=python32.PyObject_InitVar
- PyObject_IsInstance=python32.PyObject_IsInstance
- PyObject_IsSubclass=python32.PyObject_IsSubclass
- PyObject_IsTrue=python32.PyObject_IsTrue
- PyObject_Length=python32.PyObject_Length
- PyObject_Malloc=python32.PyObject_Malloc
- PyObject_Not=python32.PyObject_Not
- PyObject_Realloc=python32.PyObject_Realloc
- PyObject_Repr=python32.PyObject_Repr
- PyObject_RichCompare=python32.PyObject_RichCompare
- PyObject_RichCompareBool=python32.PyObject_RichCompareBool
- PyObject_SelfIter=python32.PyObject_SelfIter
- PyObject_SetAttr=python32.PyObject_SetAttr
- PyObject_SetAttrString=python32.PyObject_SetAttrString
- PyObject_SetItem=python32.PyObject_SetItem
- PyObject_Size=python32.PyObject_Size
- PyObject_Str=python32.PyObject_Str
- PyObject_Type=python32.PyObject_Type DATA
- PyParser_SimpleParseFileFlags=python32.PyParser_SimpleParseFileFlags
- PyParser_SimpleParseStringFlags=python32.PyParser_SimpleParseStringFlags
- PyProperty_Type=python32.PyProperty_Type DATA
- PyRangeIter_Type=python32.PyRangeIter_Type DATA
- PyRange_Type=python32.PyRange_Type DATA
- PyReversed_Type=python32.PyReversed_Type DATA
- PySeqIter_New=python32.PySeqIter_New
- PySeqIter_Type=python32.PySeqIter_Type DATA
- PySequence_Check=python32.PySequence_Check
- PySequence_Concat=python32.PySequence_Concat
- PySequence_Contains=python32.PySequence_Contains
- PySequence_Count=python32.PySequence_Count
- PySequence_DelItem=python32.PySequence_DelItem
- PySequence_DelSlice=python32.PySequence_DelSlice
- PySequence_Fast=python32.PySequence_Fast
- PySequence_GetItem=python32.PySequence_GetItem
- PySequence_GetSlice=python32.PySequence_GetSlice
- PySequence_In=python32.PySequence_In
- PySequence_InPlaceConcat=python32.PySequence_InPlaceConcat
- PySequence_InPlaceRepeat=python32.PySequence_InPlaceRepeat
- PySequence_Index=python32.PySequence_Index
- PySequence_Length=python32.PySequence_Length
- PySequence_List=python32.PySequence_List
- PySequence_Repeat=python32.PySequence_Repeat
- PySequence_SetItem=python32.PySequence_SetItem
- PySequence_SetSlice=python32.PySequence_SetSlice
- PySequence_Size=python32.PySequence_Size
- PySequence_Tuple=python32.PySequence_Tuple
- PySetIter_Type=python32.PySetIter_Type DATA
- PySet_Add=python32.PySet_Add
- PySet_Clear=python32.PySet_Clear
- PySet_Contains=python32.PySet_Contains
- PySet_Discard=python32.PySet_Discard
- PySet_New=python32.PySet_New
- PySet_Pop=python32.PySet_Pop
- PySet_Size=python32.PySet_Size
- PySet_Type=python32.PySet_Type DATA
- PySlice_GetIndices=python32.PySlice_GetIndices
- PySlice_GetIndicesEx=python32.PySlice_GetIndicesEx
- PySlice_New=python32.PySlice_New
- PySlice_Type=python32.PySlice_Type DATA
- PySortWrapper_Type=python32.PySortWrapper_Type DATA
- PyState_FindModule=python32.PyState_FindModule
- PyStructSequence_GetItem=python32.PyStructSequence_GetItem
- PyStructSequence_New=python32.PyStructSequence_New
- PyStructSequence_NewType=python32.PyStructSequence_NewType
- PyStructSequence_SetItem=python32.PyStructSequence_SetItem
- PySuper_Type=python32.PySuper_Type DATA
- PySys_AddWarnOption=python32.PySys_AddWarnOption
- PySys_AddWarnOptionUnicode=python32.PySys_AddWarnOptionUnicode
- PySys_FormatStderr=python32.PySys_FormatStderr
- PySys_FormatStdout=python32.PySys_FormatStdout
- PySys_GetObject=python32.PySys_GetObject
- PySys_HasWarnOptions=python32.PySys_HasWarnOptions
- PySys_ResetWarnOptions=python32.PySys_ResetWarnOptions
- PySys_SetArgv=python32.PySys_SetArgv
- PySys_SetArgvEx=python32.PySys_SetArgvEx
- PySys_SetObject=python32.PySys_SetObject
- PySys_SetPath=python32.PySys_SetPath
- PySys_WriteStderr=python32.PySys_WriteStderr
- PySys_WriteStdout=python32.PySys_WriteStdout
- PyThreadState_Clear=python32.PyThreadState_Clear
- PyThreadState_Delete=python32.PyThreadState_Delete
- PyThreadState_DeleteCurrent=python32.PyThreadState_DeleteCurrent
- PyThreadState_Get=python32.PyThreadState_Get
- PyThreadState_GetDict=python32.PyThreadState_GetDict
- PyThreadState_New=python32.PyThreadState_New
- PyThreadState_SetAsyncExc=python32.PyThreadState_SetAsyncExc
- PyThreadState_Swap=python32.PyThreadState_Swap
- PyTraceBack_Here=python32.PyTraceBack_Here
- PyTraceBack_Print=python32.PyTraceBack_Print
- PyTraceBack_Type=python32.PyTraceBack_Type DATA
- PyTupleIter_Type=python32.PyTupleIter_Type DATA
- PyTuple_ClearFreeList=python32.PyTuple_ClearFreeList
- PyTuple_GetItem=python32.PyTuple_GetItem
- PyTuple_GetSlice=python32.PyTuple_GetSlice
- PyTuple_New=python32.PyTuple_New
- PyTuple_Pack=python32.PyTuple_Pack
- PyTuple_SetItem=python32.PyTuple_SetItem
- PyTuple_Size=python32.PyTuple_Size
- PyTuple_Type=python32.PyTuple_Type DATA
- PyType_ClearCache=python32.PyType_ClearCache
- PyType_FromSpec=python32.PyType_FromSpec
- PyType_GenericAlloc=python32.PyType_GenericAlloc
- PyType_GenericNew=python32.PyType_GenericNew
- PyType_GetFlags=python32.PyType_GetFlags
- PyType_IsSubtype=python32.PyType_IsSubtype
- PyType_Modified=python32.PyType_Modified
- PyType_Ready=python32.PyType_Ready
- PyType_Type=python32.PyType_Type DATA
- PyUnicodeDecodeError_Create=python32.PyUnicodeDecodeError_Create
- PyUnicodeDecodeError_GetEncoding=python32.PyUnicodeDecodeError_GetEncoding
- PyUnicodeDecodeError_GetEnd=python32.PyUnicodeDecodeError_GetEnd
- PyUnicodeDecodeError_GetObject=python32.PyUnicodeDecodeError_GetObject
- PyUnicodeDecodeError_GetReason=python32.PyUnicodeDecodeError_GetReason
- PyUnicodeDecodeError_GetStart=python32.PyUnicodeDecodeError_GetStart
- PyUnicodeDecodeError_SetEnd=python32.PyUnicodeDecodeError_SetEnd
- PyUnicodeDecodeError_SetReason=python32.PyUnicodeDecodeError_SetReason
- PyUnicodeDecodeError_SetStart=python32.PyUnicodeDecodeError_SetStart
- PyUnicodeEncodeError_GetEncoding=python32.PyUnicodeEncodeError_GetEncoding
- PyUnicodeEncodeError_GetEnd=python32.PyUnicodeEncodeError_GetEnd
- PyUnicodeEncodeError_GetObject=python32.PyUnicodeEncodeError_GetObject
- PyUnicodeEncodeError_GetReason=python32.PyUnicodeEncodeError_GetReason
- PyUnicodeEncodeError_GetStart=python32.PyUnicodeEncodeError_GetStart
- PyUnicodeEncodeError_SetEnd=python32.PyUnicodeEncodeError_SetEnd
- PyUnicodeEncodeError_SetReason=python32.PyUnicodeEncodeError_SetReason
- PyUnicodeEncodeError_SetStart=python32.PyUnicodeEncodeError_SetStart
- PyUnicodeIter_Type=python32.PyUnicodeIter_Type DATA
- PyUnicodeTranslateError_GetEnd=python32.PyUnicodeTranslateError_GetEnd
- PyUnicodeTranslateError_GetObject=python32.PyUnicodeTranslateError_GetObject
- PyUnicodeTranslateError_GetReason=python32.PyUnicodeTranslateError_GetReason
- PyUnicodeTranslateError_GetStart=python32.PyUnicodeTranslateError_GetStart
- PyUnicodeTranslateError_SetEnd=python32.PyUnicodeTranslateError_SetEnd
- PyUnicodeTranslateError_SetReason=python32.PyUnicodeTranslateError_SetReason
- PyUnicodeTranslateError_SetStart=python32.PyUnicodeTranslateError_SetStart
- PyUnicode_Append=python32.PyUnicodeUCS2_Append
- PyUnicode_AppendAndDel=python32.PyUnicodeUCS2_AppendAndDel
- PyUnicode_AsASCIIString=python32.PyUnicodeUCS2_AsASCIIString
- PyUnicode_AsCharmapString=python32.PyUnicodeUCS2_AsCharmapString
- PyUnicode_AsDecodedObject=python32.PyUnicodeUCS2_AsDecodedObject
- PyUnicode_AsDecodedUnicode=python32.PyUnicodeUCS2_AsDecodedUnicode
- PyUnicode_AsEncodedObject=python32.PyUnicodeUCS2_AsEncodedObject
- PyUnicode_AsEncodedString=python32.PyUnicodeUCS2_AsEncodedString
- PyUnicode_AsEncodedUnicode=python32.PyUnicodeUCS2_AsEncodedUnicode
- PyUnicode_AsLatin1String=python32.PyUnicodeUCS2_AsLatin1String
- PyUnicode_AsRawUnicodeEscapeString=python32.PyUnicodeUCS2_AsRawUnicodeEscapeString
- PyUnicode_AsUTF16String=python32.PyUnicodeUCS2_AsUTF16String
- PyUnicode_AsUTF32String=python32.PyUnicodeUCS2_AsUTF32String
- PyUnicode_AsUTF8String=python32.PyUnicodeUCS2_AsUTF8String
- PyUnicode_AsUnicodeEscapeString=python32.PyUnicodeUCS2_AsUnicodeEscapeString
- PyUnicode_AsWideChar=python32.PyUnicodeUCS2_AsWideChar
- PyUnicode_ClearFreelist=python32.PyUnicodeUCS2_ClearFreelist
- PyUnicode_Compare=python32.PyUnicodeUCS2_Compare
- PyUnicode_Concat=python32.PyUnicodeUCS2_Concat
- PyUnicode_Contains=python32.PyUnicodeUCS2_Contains
- PyUnicode_Count=python32.PyUnicodeUCS2_Count
- PyUnicode_Decode=python32.PyUnicodeUCS2_Decode
- PyUnicode_DecodeASCII=python32.PyUnicodeUCS2_DecodeASCII
- PyUnicode_DecodeCharmap=python32.PyUnicodeUCS2_DecodeCharmap
- PyUnicode_DecodeFSDefault=python32.PyUnicodeUCS2_DecodeFSDefault
- PyUnicode_DecodeFSDefaultAndSize=python32.PyUnicodeUCS2_DecodeFSDefaultAndSize
- PyUnicode_DecodeLatin1=python32.PyUnicodeUCS2_DecodeLatin1
- PyUnicode_DecodeRawUnicodeEscape=python32.PyUnicodeUCS2_DecodeRawUnicodeEscape
- PyUnicode_DecodeUTF16=python32.PyUnicodeUCS2_DecodeUTF16
- PyUnicode_DecodeUTF16Stateful=python32.PyUnicodeUCS2_DecodeUTF16Stateful
- PyUnicode_DecodeUTF32=python32.PyUnicodeUCS2_DecodeUTF32
- PyUnicode_DecodeUTF32Stateful=python32.PyUnicodeUCS2_DecodeUTF32Stateful
- PyUnicode_DecodeUTF8=python32.PyUnicodeUCS2_DecodeUTF8
- PyUnicode_DecodeUTF8Stateful=python32.PyUnicodeUCS2_DecodeUTF8Stateful
- PyUnicode_DecodeUnicodeEscape=python32.PyUnicodeUCS2_DecodeUnicodeEscape
- PyUnicode_FSConverter=python32.PyUnicodeUCS2_FSConverter
- PyUnicode_FSDecoder=python32.PyUnicodeUCS2_FSDecoder
- PyUnicode_Find=python32.PyUnicodeUCS2_Find
- PyUnicode_Format=python32.PyUnicodeUCS2_Format
- PyUnicode_FromEncodedObject=python32.PyUnicodeUCS2_FromEncodedObject
- PyUnicode_FromFormat=python32.PyUnicodeUCS2_FromFormat
- PyUnicode_FromFormatV=python32.PyUnicodeUCS2_FromFormatV
- PyUnicode_FromObject=python32.PyUnicodeUCS2_FromObject
- PyUnicode_FromOrdinal=python32.PyUnicodeUCS2_FromOrdinal
- PyUnicode_FromString=python32.PyUnicodeUCS2_FromString
- PyUnicode_FromStringAndSize=python32.PyUnicodeUCS2_FromStringAndSize
- PyUnicode_FromWideChar=python32.PyUnicodeUCS2_FromWideChar
- PyUnicode_GetDefaultEncoding=python32.PyUnicodeUCS2_GetDefaultEncoding
- PyUnicode_GetSize=python32.PyUnicodeUCS2_GetSize
- PyUnicode_IsIdentifier=python32.PyUnicodeUCS2_IsIdentifier
- PyUnicode_Join=python32.PyUnicodeUCS2_Join
- PyUnicode_Partition=python32.PyUnicodeUCS2_Partition
- PyUnicode_RPartition=python32.PyUnicodeUCS2_RPartition
- PyUnicode_RSplit=python32.PyUnicodeUCS2_RSplit
- PyUnicode_Replace=python32.PyUnicodeUCS2_Replace
- PyUnicode_Resize=python32.PyUnicodeUCS2_Resize
- PyUnicode_RichCompare=python32.PyUnicodeUCS2_RichCompare
- PyUnicode_SetDefaultEncoding=python32.PyUnicodeUCS2_SetDefaultEncoding
- PyUnicode_Split=python32.PyUnicodeUCS2_Split
- PyUnicode_Splitlines=python32.PyUnicodeUCS2_Splitlines
- PyUnicode_Tailmatch=python32.PyUnicodeUCS2_Tailmatch
- PyUnicode_Translate=python32.PyUnicodeUCS2_Translate
- PyUnicode_BuildEncodingMap=python32.PyUnicode_BuildEncodingMap
- PyUnicode_CompareWithASCIIString=python32.PyUnicode_CompareWithASCIIString
- PyUnicode_DecodeUTF7=python32.PyUnicode_DecodeUTF7
- PyUnicode_DecodeUTF7Stateful=python32.PyUnicode_DecodeUTF7Stateful
- PyUnicode_EncodeFSDefault=python32.PyUnicode_EncodeFSDefault
- PyUnicode_InternFromString=python32.PyUnicode_InternFromString
- PyUnicode_InternImmortal=python32.PyUnicode_InternImmortal
- PyUnicode_InternInPlace=python32.PyUnicode_InternInPlace
- PyUnicode_Type=python32.PyUnicode_Type DATA
- PyWeakref_GetObject=python32.PyWeakref_GetObject DATA
- PyWeakref_NewProxy=python32.PyWeakref_NewProxy
- PyWeakref_NewRef=python32.PyWeakref_NewRef
- PyWrapperDescr_Type=python32.PyWrapperDescr_Type DATA
- PyWrapper_New=python32.PyWrapper_New
- PyZip_Type=python32.PyZip_Type DATA
- Py_AddPendingCall=python32.Py_AddPendingCall
- Py_AtExit=python32.Py_AtExit
- Py_BuildValue=python32.Py_BuildValue
- Py_CompileString=python32.Py_CompileString
- Py_DecRef=python32.Py_DecRef
- Py_EndInterpreter=python32.Py_EndInterpreter
- Py_Exit=python32.Py_Exit
- Py_FatalError=python32.Py_FatalError
- Py_FileSystemDefaultEncoding=python32.Py_FileSystemDefaultEncoding DATA
- Py_Finalize=python32.Py_Finalize
- Py_GetBuildInfo=python32.Py_GetBuildInfo
- Py_GetCompiler=python32.Py_GetCompiler
- Py_GetCopyright=python32.Py_GetCopyright
- Py_GetExecPrefix=python32.Py_GetExecPrefix
- Py_GetPath=python32.Py_GetPath
- Py_GetPlatform=python32.Py_GetPlatform
- Py_GetPrefix=python32.Py_GetPrefix
- Py_GetProgramFullPath=python32.Py_GetProgramFullPath
- Py_GetProgramName=python32.Py_GetProgramName
- Py_GetPythonHome=python32.Py_GetPythonHome
- Py_GetRecursionLimit=python32.Py_GetRecursionLimit
- Py_GetVersion=python32.Py_GetVersion
- Py_HasFileSystemDefaultEncoding=python32.Py_HasFileSystemDefaultEncoding DATA
- Py_IncRef=python32.Py_IncRef
- Py_Initialize=python32.Py_Initialize
- Py_InitializeEx=python32.Py_InitializeEx
- Py_IsInitialized=python32.Py_IsInitialized
- Py_Main=python32.Py_Main
- Py_MakePendingCalls=python32.Py_MakePendingCalls
- Py_NewInterpreter=python32.Py_NewInterpreter
- Py_ReprEnter=python32.Py_ReprEnter
- Py_ReprLeave=python32.Py_ReprLeave
- Py_SetProgramName=python32.Py_SetProgramName
- Py_SetPythonHome=python32.Py_SetPythonHome
- Py_SetRecursionLimit=python32.Py_SetRecursionLimit
- Py_SymtableString=python32.Py_SymtableString
- Py_VaBuildValue=python32.Py_VaBuildValue
- _PyErr_BadInternalCall=python32._PyErr_BadInternalCall
- _PyObject_CallFunction_SizeT=python32._PyObject_CallFunction_SizeT
- _PyObject_CallMethod_SizeT=python32._PyObject_CallMethod_SizeT
- _PyObject_GC_Malloc=python32._PyObject_GC_Malloc
- _PyObject_GC_New=python32._PyObject_GC_New
- _PyObject_GC_NewVar=python32._PyObject_GC_NewVar
- _PyObject_GC_Resize=python32._PyObject_GC_Resize
- _PyObject_New=python32._PyObject_New
- _PyObject_NewVar=python32._PyObject_NewVar
- _PyState_AddModule=python32._PyState_AddModule
- _PyThreadState_Init=python32._PyThreadState_Init
- _PyThreadState_Prealloc=python32._PyThreadState_Prealloc
- _PyTrash_delete_later=python32._PyTrash_delete_later DATA
- _PyTrash_delete_nesting=python32._PyTrash_delete_nesting DATA
- _PyTrash_deposit_object=python32._PyTrash_deposit_object
- _PyTrash_destroy_chain=python32._PyTrash_destroy_chain
- _PyWeakref_CallableProxyType=python32._PyWeakref_CallableProxyType DATA
- _PyWeakref_ProxyType=python32._PyWeakref_ProxyType DATA
- _PyWeakref_RefType=python32._PyWeakref_RefType DATA
- _Py_BuildValue_SizeT=python32._Py_BuildValue_SizeT
- _Py_CheckRecursionLimit=python32._Py_CheckRecursionLimit DATA
- _Py_CheckRecursiveCall=python32._Py_CheckRecursiveCall
- _Py_Dealloc=python32._Py_Dealloc
- _Py_EllipsisObject=python32._Py_EllipsisObject DATA
- _Py_FalseStruct=python32._Py_FalseStruct DATA
- _Py_NoneStruct=python32._Py_NoneStruct DATA
- _Py_NotImplementedStruct=python32._Py_NotImplementedStruct DATA
- _Py_SwappedOp=python32._Py_SwappedOp DATA
- _Py_TrueStruct=python32._Py_TrueStruct DATA
- _Py_VaBuildValue_SizeT=python32._Py_VaBuildValue_SizeT
+ PyArg_Parse=python33.PyArg_Parse
+ PyArg_ParseTuple=python33.PyArg_ParseTuple
+ PyArg_ParseTupleAndKeywords=python33.PyArg_ParseTupleAndKeywords
+ PyArg_UnpackTuple=python33.PyArg_UnpackTuple
+ PyArg_VaParse=python33.PyArg_VaParse
+ PyArg_VaParseTupleAndKeywords=python33.PyArg_VaParseTupleAndKeywords
+ PyArg_ValidateKeywordArguments=python33.PyArg_ValidateKeywordArguments
+ PyBaseObject_Type=python33.PyBaseObject_Type DATA
+ PyBool_FromLong=python33.PyBool_FromLong
+ PyBool_Type=python33.PyBool_Type DATA
+ PyByteArrayIter_Type=python33.PyByteArrayIter_Type DATA
+ PyByteArray_AsString=python33.PyByteArray_AsString
+ PyByteArray_Concat=python33.PyByteArray_Concat
+ PyByteArray_FromObject=python33.PyByteArray_FromObject
+ PyByteArray_FromStringAndSize=python33.PyByteArray_FromStringAndSize
+ PyByteArray_Resize=python33.PyByteArray_Resize
+ PyByteArray_Size=python33.PyByteArray_Size
+ PyByteArray_Type=python33.PyByteArray_Type DATA
+ PyBytesIter_Type=python33.PyBytesIter_Type DATA
+ PyBytes_AsString=python33.PyBytes_AsString
+ PyBytes_AsStringAndSize=python33.PyBytes_AsStringAndSize
+ PyBytes_Concat=python33.PyBytes_Concat
+ PyBytes_ConcatAndDel=python33.PyBytes_ConcatAndDel
+ PyBytes_DecodeEscape=python33.PyBytes_DecodeEscape
+ PyBytes_FromFormat=python33.PyBytes_FromFormat
+ PyBytes_FromFormatV=python33.PyBytes_FromFormatV
+ PyBytes_FromObject=python33.PyBytes_FromObject
+ PyBytes_FromString=python33.PyBytes_FromString
+ PyBytes_FromStringAndSize=python33.PyBytes_FromStringAndSize
+ PyBytes_Repr=python33.PyBytes_Repr
+ PyBytes_Size=python33.PyBytes_Size
+ PyBytes_Type=python33.PyBytes_Type DATA
+ PyCFunction_Call=python33.PyCFunction_Call
+ PyCFunction_ClearFreeList=python33.PyCFunction_ClearFreeList
+ PyCFunction_GetFlags=python33.PyCFunction_GetFlags
+ PyCFunction_GetFunction=python33.PyCFunction_GetFunction
+ PyCFunction_GetSelf=python33.PyCFunction_GetSelf
+ PyCFunction_NewEx=python33.PyCFunction_NewEx
+ PyCFunction_Type=python33.PyCFunction_Type DATA
+ PyCallIter_New=python33.PyCallIter_New
+ PyCallIter_Type=python33.PyCallIter_Type DATA
+ PyCallable_Check=python33.PyCallable_Check
+ PyCapsule_GetContext=python33.PyCapsule_GetContext
+ PyCapsule_GetDestructor=python33.PyCapsule_GetDestructor
+ PyCapsule_GetName=python33.PyCapsule_GetName
+ PyCapsule_GetPointer=python33.PyCapsule_GetPointer
+ PyCapsule_Import=python33.PyCapsule_Import
+ PyCapsule_IsValid=python33.PyCapsule_IsValid
+ PyCapsule_New=python33.PyCapsule_New
+ PyCapsule_SetContext=python33.PyCapsule_SetContext
+ PyCapsule_SetDestructor=python33.PyCapsule_SetDestructor
+ PyCapsule_SetName=python33.PyCapsule_SetName
+ PyCapsule_SetPointer=python33.PyCapsule_SetPointer
+ PyCapsule_Type=python33.PyCapsule_Type DATA
+ PyClassMethodDescr_Type=python33.PyClassMethodDescr_Type DATA
+ PyCodec_BackslashReplaceErrors=python33.PyCodec_BackslashReplaceErrors
+ PyCodec_Decode=python33.PyCodec_Decode
+ PyCodec_Decoder=python33.PyCodec_Decoder
+ PyCodec_Encode=python33.PyCodec_Encode
+ PyCodec_Encoder=python33.PyCodec_Encoder
+ PyCodec_IgnoreErrors=python33.PyCodec_IgnoreErrors
+ PyCodec_IncrementalDecoder=python33.PyCodec_IncrementalDecoder
+ PyCodec_IncrementalEncoder=python33.PyCodec_IncrementalEncoder
+ PyCodec_KnownEncoding=python33.PyCodec_KnownEncoding
+ PyCodec_LookupError=python33.PyCodec_LookupError
+ PyCodec_Register=python33.PyCodec_Register
+ PyCodec_RegisterError=python33.PyCodec_RegisterError
+ PyCodec_ReplaceErrors=python33.PyCodec_ReplaceErrors
+ PyCodec_StreamReader=python33.PyCodec_StreamReader
+ PyCodec_StreamWriter=python33.PyCodec_StreamWriter
+ PyCodec_StrictErrors=python33.PyCodec_StrictErrors
+ PyCodec_XMLCharRefReplaceErrors=python33.PyCodec_XMLCharRefReplaceErrors
+ PyComplex_FromDoubles=python33.PyComplex_FromDoubles
+ PyComplex_ImagAsDouble=python33.PyComplex_ImagAsDouble
+ PyComplex_RealAsDouble=python33.PyComplex_RealAsDouble
+ PyComplex_Type=python33.PyComplex_Type DATA
+ PyDescr_NewClassMethod=python33.PyDescr_NewClassMethod
+ PyDescr_NewGetSet=python33.PyDescr_NewGetSet
+ PyDescr_NewMember=python33.PyDescr_NewMember
+ PyDescr_NewMethod=python33.PyDescr_NewMethod
+ PyDictItems_Type=python33.PyDictItems_Type DATA
+ PyDictIterItem_Type=python33.PyDictIterItem_Type DATA
+ PyDictIterKey_Type=python33.PyDictIterKey_Type DATA
+ PyDictIterValue_Type=python33.PyDictIterValue_Type DATA
+ PyDictKeys_Type=python33.PyDictKeys_Type DATA
+ PyDictProxy_New=python33.PyDictProxy_New
+ PyDictProxy_Type=python33.PyDictProxy_Type DATA
+ PyDictValues_Type=python33.PyDictValues_Type DATA
+ PyDict_Clear=python33.PyDict_Clear
+ PyDict_Contains=python33.PyDict_Contains
+ PyDict_Copy=python33.PyDict_Copy
+ PyDict_DelItem=python33.PyDict_DelItem
+ PyDict_DelItemString=python33.PyDict_DelItemString
+ PyDict_GetItem=python33.PyDict_GetItem
+ PyDict_GetItemString=python33.PyDict_GetItemString
+ PyDict_GetItemWithError=python33.PyDict_GetItemWithError
+ PyDict_Items=python33.PyDict_Items
+ PyDict_Keys=python33.PyDict_Keys
+ PyDict_Merge=python33.PyDict_Merge
+ PyDict_MergeFromSeq2=python33.PyDict_MergeFromSeq2
+ PyDict_New=python33.PyDict_New
+ PyDict_Next=python33.PyDict_Next
+ PyDict_SetItem=python33.PyDict_SetItem
+ PyDict_SetItemString=python33.PyDict_SetItemString
+ PyDict_Size=python33.PyDict_Size
+ PyDict_Type=python33.PyDict_Type DATA
+ PyDict_Update=python33.PyDict_Update
+ PyDict_Values=python33.PyDict_Values
+ PyEllipsis_Type=python33.PyEllipsis_Type DATA
+ PyEnum_Type=python33.PyEnum_Type DATA
+ PyErr_BadArgument=python33.PyErr_BadArgument
+ PyErr_BadInternalCall=python33.PyErr_BadInternalCall
+ PyErr_CheckSignals=python33.PyErr_CheckSignals
+ PyErr_Clear=python33.PyErr_Clear
+ PyErr_Display=python33.PyErr_Display
+ PyErr_ExceptionMatches=python33.PyErr_ExceptionMatches
+ PyErr_Fetch=python33.PyErr_Fetch
+ PyErr_Format=python33.PyErr_Format
+ PyErr_GivenExceptionMatches=python33.PyErr_GivenExceptionMatches
+ PyErr_NewException=python33.PyErr_NewException
+ PyErr_NewExceptionWithDoc=python33.PyErr_NewExceptionWithDoc
+ PyErr_NoMemory=python33.PyErr_NoMemory
+ PyErr_NormalizeException=python33.PyErr_NormalizeException
+ PyErr_Occurred=python33.PyErr_Occurred
+ PyErr_Print=python33.PyErr_Print
+ PyErr_PrintEx=python33.PyErr_PrintEx
+ PyErr_ProgramText=python33.PyErr_ProgramText
+ PyErr_Restore=python33.PyErr_Restore
+ PyErr_SetFromErrno=python33.PyErr_SetFromErrno
+ PyErr_SetFromErrnoWithFilename=python33.PyErr_SetFromErrnoWithFilename
+ PyErr_SetFromErrnoWithFilenameObject=python33.PyErr_SetFromErrnoWithFilenameObject
+ PyErr_SetInterrupt=python33.PyErr_SetInterrupt
+ PyErr_SetNone=python33.PyErr_SetNone
+ PyErr_SetObject=python33.PyErr_SetObject
+ PyErr_SetString=python33.PyErr_SetString
+ PyErr_SyntaxLocation=python33.PyErr_SyntaxLocation
+ PyErr_WarnEx=python33.PyErr_WarnEx
+ PyErr_WarnExplicit=python33.PyErr_WarnExplicit
+ PyErr_WarnFormat=python33.PyErr_WarnFormat
+ PyErr_WriteUnraisable=python33.PyErr_WriteUnraisable
+ PyEval_AcquireLock=python33.PyEval_AcquireLock
+ PyEval_AcquireThread=python33.PyEval_AcquireThread
+ PyEval_CallFunction=python33.PyEval_CallFunction
+ PyEval_CallMethod=python33.PyEval_CallMethod
+ PyEval_CallObjectWithKeywords=python33.PyEval_CallObjectWithKeywords
+ PyEval_EvalCode=python33.PyEval_EvalCode
+ PyEval_EvalCodeEx=python33.PyEval_EvalCodeEx
+ PyEval_EvalFrame=python33.PyEval_EvalFrame
+ PyEval_EvalFrameEx=python33.PyEval_EvalFrameEx
+ PyEval_GetBuiltins=python33.PyEval_GetBuiltins
+ PyEval_GetCallStats=python33.PyEval_GetCallStats
+ PyEval_GetFrame=python33.PyEval_GetFrame
+ PyEval_GetFuncDesc=python33.PyEval_GetFuncDesc
+ PyEval_GetFuncName=python33.PyEval_GetFuncName
+ PyEval_GetGlobals=python33.PyEval_GetGlobals
+ PyEval_GetLocals=python33.PyEval_GetLocals
+ PyEval_InitThreads=python33.PyEval_InitThreads
+ PyEval_ReInitThreads=python33.PyEval_ReInitThreads
+ PyEval_ReleaseLock=python33.PyEval_ReleaseLock
+ PyEval_ReleaseThread=python33.PyEval_ReleaseThread
+ PyEval_RestoreThread=python33.PyEval_RestoreThread
+ PyEval_SaveThread=python33.PyEval_SaveThread
+ PyEval_ThreadsInitialized=python33.PyEval_ThreadsInitialized
+ PyExc_ArithmeticError=python33.PyExc_ArithmeticError DATA
+ PyExc_AssertionError=python33.PyExc_AssertionError DATA
+ PyExc_AttributeError=python33.PyExc_AttributeError DATA
+ PyExc_BaseException=python33.PyExc_BaseException DATA
+ PyExc_BufferError=python33.PyExc_BufferError DATA
+ PyExc_BytesWarning=python33.PyExc_BytesWarning DATA
+ PyExc_DeprecationWarning=python33.PyExc_DeprecationWarning DATA
+ PyExc_EOFError=python33.PyExc_EOFError DATA
+ PyExc_EnvironmentError=python33.PyExc_EnvironmentError DATA
+ PyExc_Exception=python33.PyExc_Exception DATA
+ PyExc_FloatingPointError=python33.PyExc_FloatingPointError DATA
+ PyExc_FutureWarning=python33.PyExc_FutureWarning DATA
+ PyExc_GeneratorExit=python33.PyExc_GeneratorExit DATA
+ PyExc_IOError=python33.PyExc_IOError DATA
+ PyExc_ImportError=python33.PyExc_ImportError DATA
+ PyExc_ImportWarning=python33.PyExc_ImportWarning DATA
+ PyExc_IndentationError=python33.PyExc_IndentationError DATA
+ PyExc_IndexError=python33.PyExc_IndexError DATA
+ PyExc_KeyError=python33.PyExc_KeyError DATA
+ PyExc_KeyboardInterrupt=python33.PyExc_KeyboardInterrupt DATA
+ PyExc_LookupError=python33.PyExc_LookupError DATA
+ PyExc_MemoryError=python33.PyExc_MemoryError DATA
+ PyExc_MemoryErrorInst=python33.PyExc_MemoryErrorInst DATA
+ PyExc_NameError=python33.PyExc_NameError DATA
+ PyExc_NotImplementedError=python33.PyExc_NotImplementedError DATA
+ PyExc_OSError=python33.PyExc_OSError DATA
+ PyExc_OverflowError=python33.PyExc_OverflowError DATA
+ PyExc_PendingDeprecationWarning=python33.PyExc_PendingDeprecationWarning DATA
+ PyExc_RecursionErrorInst=python33.PyExc_RecursionErrorInst DATA
+ PyExc_ReferenceError=python33.PyExc_ReferenceError DATA
+ PyExc_RuntimeError=python33.PyExc_RuntimeError DATA
+ PyExc_RuntimeWarning=python33.PyExc_RuntimeWarning DATA
+ PyExc_StopIteration=python33.PyExc_StopIteration DATA
+ PyExc_SyntaxError=python33.PyExc_SyntaxError DATA
+ PyExc_SyntaxWarning=python33.PyExc_SyntaxWarning DATA
+ PyExc_SystemError=python33.PyExc_SystemError DATA
+ PyExc_SystemExit=python33.PyExc_SystemExit DATA
+ PyExc_TabError=python33.PyExc_TabError DATA
+ PyExc_TypeError=python33.PyExc_TypeError DATA
+ PyExc_UnboundLocalError=python33.PyExc_UnboundLocalError DATA
+ PyExc_UnicodeDecodeError=python33.PyExc_UnicodeDecodeError DATA
+ PyExc_UnicodeEncodeError=python33.PyExc_UnicodeEncodeError DATA
+ PyExc_UnicodeError=python33.PyExc_UnicodeError DATA
+ PyExc_UnicodeTranslateError=python33.PyExc_UnicodeTranslateError DATA
+ PyExc_UnicodeWarning=python33.PyExc_UnicodeWarning DATA
+ PyExc_UserWarning=python33.PyExc_UserWarning DATA
+ PyExc_ValueError=python33.PyExc_ValueError DATA
+ PyExc_Warning=python33.PyExc_Warning DATA
+ PyExc_ZeroDivisionError=python33.PyExc_ZeroDivisionError DATA
+ PyException_GetCause=python33.PyException_GetCause
+ PyException_GetContext=python33.PyException_GetContext
+ PyException_GetTraceback=python33.PyException_GetTraceback
+ PyException_SetCause=python33.PyException_SetCause
+ PyException_SetContext=python33.PyException_SetContext
+ PyException_SetTraceback=python33.PyException_SetTraceback
+ PyFile_FromFd=python33.PyFile_FromFd
+ PyFile_GetLine=python33.PyFile_GetLine
+ PyFile_WriteObject=python33.PyFile_WriteObject
+ PyFile_WriteString=python33.PyFile_WriteString
+ PyFilter_Type=python33.PyFilter_Type DATA
+ PyFloat_AsDouble=python33.PyFloat_AsDouble
+ PyFloat_FromDouble=python33.PyFloat_FromDouble
+ PyFloat_FromString=python33.PyFloat_FromString
+ PyFloat_GetInfo=python33.PyFloat_GetInfo
+ PyFloat_GetMax=python33.PyFloat_GetMax
+ PyFloat_GetMin=python33.PyFloat_GetMin
+ PyFloat_Type=python33.PyFloat_Type DATA
+ PyFrozenSet_New=python33.PyFrozenSet_New
+ PyFrozenSet_Type=python33.PyFrozenSet_Type DATA
+ PyGC_Collect=python33.PyGC_Collect
+ PyGILState_Ensure=python33.PyGILState_Ensure
+ PyGILState_GetThisThreadState=python33.PyGILState_GetThisThreadState
+ PyGILState_Release=python33.PyGILState_Release
+ PyGetSetDescr_Type=python33.PyGetSetDescr_Type DATA
+ PyImport_AddModule=python33.PyImport_AddModule
+ PyImport_AppendInittab=python33.PyImport_AppendInittab
+ PyImport_Cleanup=python33.PyImport_Cleanup
+ PyImport_ExecCodeModule=python33.PyImport_ExecCodeModule
+ PyImport_ExecCodeModuleEx=python33.PyImport_ExecCodeModuleEx
+ PyImport_ExecCodeModuleWithPathnames=python33.PyImport_ExecCodeModuleWithPathnames
+ PyImport_GetImporter=python33.PyImport_GetImporter
+ PyImport_GetMagicNumber=python33.PyImport_GetMagicNumber
+ PyImport_GetMagicTag=python33.PyImport_GetMagicTag
+ PyImport_GetModuleDict=python33.PyImport_GetModuleDict
+ PyImport_Import=python33.PyImport_Import
+ PyImport_ImportFrozenModule=python33.PyImport_ImportFrozenModule
+ PyImport_ImportModule=python33.PyImport_ImportModule
+ PyImport_ImportModuleLevel=python33.PyImport_ImportModuleLevel
+ PyImport_ImportModuleNoBlock=python33.PyImport_ImportModuleNoBlock
+ PyImport_ReloadModule=python33.PyImport_ReloadModule
+ PyInterpreterState_Clear=python33.PyInterpreterState_Clear
+ PyInterpreterState_Delete=python33.PyInterpreterState_Delete
+ PyInterpreterState_New=python33.PyInterpreterState_New
+ PyIter_Next=python33.PyIter_Next
+ PyListIter_Type=python33.PyListIter_Type DATA
+ PyListRevIter_Type=python33.PyListRevIter_Type DATA
+ PyList_Append=python33.PyList_Append
+ PyList_AsTuple=python33.PyList_AsTuple
+ PyList_GetItem=python33.PyList_GetItem
+ PyList_GetSlice=python33.PyList_GetSlice
+ PyList_Insert=python33.PyList_Insert
+ PyList_New=python33.PyList_New
+ PyList_Reverse=python33.PyList_Reverse
+ PyList_SetItem=python33.PyList_SetItem
+ PyList_SetSlice=python33.PyList_SetSlice
+ PyList_Size=python33.PyList_Size
+ PyList_Sort=python33.PyList_Sort
+ PyList_Type=python33.PyList_Type DATA
+ PyLongRangeIter_Type=python33.PyLongRangeIter_Type DATA
+ PyLong_AsDouble=python33.PyLong_AsDouble
+ PyLong_AsLong=python33.PyLong_AsLong
+ PyLong_AsLongAndOverflow=python33.PyLong_AsLongAndOverflow
+ PyLong_AsLongLong=python33.PyLong_AsLongLong
+ PyLong_AsLongLongAndOverflow=python33.PyLong_AsLongLongAndOverflow
+ PyLong_AsSize_t=python33.PyLong_AsSize_t
+ PyLong_AsSsize_t=python33.PyLong_AsSsize_t
+ PyLong_AsUnsignedLong=python33.PyLong_AsUnsignedLong
+ PyLong_AsUnsignedLongLong=python33.PyLong_AsUnsignedLongLong
+ PyLong_AsUnsignedLongLongMask=python33.PyLong_AsUnsignedLongLongMask
+ PyLong_AsUnsignedLongMask=python33.PyLong_AsUnsignedLongMask
+ PyLong_AsVoidPtr=python33.PyLong_AsVoidPtr
+ PyLong_FromDouble=python33.PyLong_FromDouble
+ PyLong_FromLong=python33.PyLong_FromLong
+ PyLong_FromLongLong=python33.PyLong_FromLongLong
+ PyLong_FromSize_t=python33.PyLong_FromSize_t
+ PyLong_FromSsize_t=python33.PyLong_FromSsize_t
+ PyLong_FromString=python33.PyLong_FromString
+ PyLong_FromUnsignedLong=python33.PyLong_FromUnsignedLong
+ PyLong_FromUnsignedLongLong=python33.PyLong_FromUnsignedLongLong
+ PyLong_FromVoidPtr=python33.PyLong_FromVoidPtr
+ PyLong_GetInfo=python33.PyLong_GetInfo
+ PyLong_Type=python33.PyLong_Type DATA
+ PyMap_Type=python33.PyMap_Type DATA
+ PyMapping_Check=python33.PyMapping_Check
+ PyMapping_GetItemString=python33.PyMapping_GetItemString
+ PyMapping_HasKey=python33.PyMapping_HasKey
+ PyMapping_HasKeyString=python33.PyMapping_HasKeyString
+ PyMapping_Items=python33.PyMapping_Items
+ PyMapping_Keys=python33.PyMapping_Keys
+ PyMapping_Length=python33.PyMapping_Length
+ PyMapping_SetItemString=python33.PyMapping_SetItemString
+ PyMapping_Size=python33.PyMapping_Size
+ PyMapping_Values=python33.PyMapping_Values
+ PyMem_Free=python33.PyMem_Free
+ PyMem_Malloc=python33.PyMem_Malloc
+ PyMem_Realloc=python33.PyMem_Realloc
+ PyMemberDescr_Type=python33.PyMemberDescr_Type DATA
+ PyMemoryView_FromObject=python33.PyMemoryView_FromObject
+ PyMemoryView_GetContiguous=python33.PyMemoryView_GetContiguous
+ PyMemoryView_Type=python33.PyMemoryView_Type DATA
+ PyMethodDescr_Type=python33.PyMethodDescr_Type DATA
+ PyModule_AddIntConstant=python33.PyModule_AddIntConstant
+ PyModule_AddObject=python33.PyModule_AddObject
+ PyModule_AddStringConstant=python33.PyModule_AddStringConstant
+ PyModule_Create2=python33.PyModule_Create2
+ PyModule_GetDef=python33.PyModule_GetDef
+ PyModule_GetDict=python33.PyModule_GetDict
+ PyModule_GetFilename=python33.PyModule_GetFilename
+ PyModule_GetFilenameObject=python33.PyModule_GetFilenameObject
+ PyModule_GetName=python33.PyModule_GetName
+ PyModule_GetState=python33.PyModule_GetState
+ PyModule_New=python33.PyModule_New
+ PyModule_Type=python33.PyModule_Type DATA
+ PyNullImporter_Type=python33.PyNullImporter_Type DATA
+ PyNumber_Absolute=python33.PyNumber_Absolute
+ PyNumber_Add=python33.PyNumber_Add
+ PyNumber_And=python33.PyNumber_And
+ PyNumber_AsSsize_t=python33.PyNumber_AsSsize_t
+ PyNumber_Check=python33.PyNumber_Check
+ PyNumber_Divmod=python33.PyNumber_Divmod
+ PyNumber_Float=python33.PyNumber_Float
+ PyNumber_FloorDivide=python33.PyNumber_FloorDivide
+ PyNumber_InPlaceAdd=python33.PyNumber_InPlaceAdd
+ PyNumber_InPlaceAnd=python33.PyNumber_InPlaceAnd
+ PyNumber_InPlaceFloorDivide=python33.PyNumber_InPlaceFloorDivide
+ PyNumber_InPlaceLshift=python33.PyNumber_InPlaceLshift
+ PyNumber_InPlaceMultiply=python33.PyNumber_InPlaceMultiply
+ PyNumber_InPlaceOr=python33.PyNumber_InPlaceOr
+ PyNumber_InPlacePower=python33.PyNumber_InPlacePower
+ PyNumber_InPlaceRemainder=python33.PyNumber_InPlaceRemainder
+ PyNumber_InPlaceRshift=python33.PyNumber_InPlaceRshift
+ PyNumber_InPlaceSubtract=python33.PyNumber_InPlaceSubtract
+ PyNumber_InPlaceTrueDivide=python33.PyNumber_InPlaceTrueDivide
+ PyNumber_InPlaceXor=python33.PyNumber_InPlaceXor
+ PyNumber_Index=python33.PyNumber_Index
+ PyNumber_Invert=python33.PyNumber_Invert
+ PyNumber_Long=python33.PyNumber_Long
+ PyNumber_Lshift=python33.PyNumber_Lshift
+ PyNumber_Multiply=python33.PyNumber_Multiply
+ PyNumber_Negative=python33.PyNumber_Negative
+ PyNumber_Or=python33.PyNumber_Or
+ PyNumber_Positive=python33.PyNumber_Positive
+ PyNumber_Power=python33.PyNumber_Power
+ PyNumber_Remainder=python33.PyNumber_Remainder
+ PyNumber_Rshift=python33.PyNumber_Rshift
+ PyNumber_Subtract=python33.PyNumber_Subtract
+ PyNumber_ToBase=python33.PyNumber_ToBase
+ PyNumber_TrueDivide=python33.PyNumber_TrueDivide
+ PyNumber_Xor=python33.PyNumber_Xor
+ PyOS_AfterFork=python33.PyOS_AfterFork
+ PyOS_InitInterrupts=python33.PyOS_InitInterrupts
+ PyOS_InputHook=python33.PyOS_InputHook DATA
+ PyOS_InterruptOccurred=python33.PyOS_InterruptOccurred
+ PyOS_ReadlineFunctionPointer=python33.PyOS_ReadlineFunctionPointer DATA
+ PyOS_double_to_string=python33.PyOS_double_to_string
+ PyOS_getsig=python33.PyOS_getsig
+ PyOS_mystricmp=python33.PyOS_mystricmp
+ PyOS_mystrnicmp=python33.PyOS_mystrnicmp
+ PyOS_setsig=python33.PyOS_setsig
+ PyOS_snprintf=python33.PyOS_snprintf
+ PyOS_string_to_double=python33.PyOS_string_to_double
+ PyOS_strtol=python33.PyOS_strtol
+ PyOS_strtoul=python33.PyOS_strtoul
+ PyOS_vsnprintf=python33.PyOS_vsnprintf
+ PyObject_ASCII=python33.PyObject_ASCII
+ PyObject_AsCharBuffer=python33.PyObject_AsCharBuffer
+ PyObject_AsFileDescriptor=python33.PyObject_AsFileDescriptor
+ PyObject_AsReadBuffer=python33.PyObject_AsReadBuffer
+ PyObject_AsWriteBuffer=python33.PyObject_AsWriteBuffer
+ PyObject_Bytes=python33.PyObject_Bytes
+ PyObject_Call=python33.PyObject_Call
+ PyObject_CallFunction=python33.PyObject_CallFunction
+ PyObject_CallFunctionObjArgs=python33.PyObject_CallFunctionObjArgs
+ PyObject_CallMethod=python33.PyObject_CallMethod
+ PyObject_CallMethodObjArgs=python33.PyObject_CallMethodObjArgs
+ PyObject_CallObject=python33.PyObject_CallObject
+ PyObject_CheckReadBuffer=python33.PyObject_CheckReadBuffer
+ PyObject_ClearWeakRefs=python33.PyObject_ClearWeakRefs
+ PyObject_DelItem=python33.PyObject_DelItem
+ PyObject_DelItemString=python33.PyObject_DelItemString
+ PyObject_Dir=python33.PyObject_Dir
+ PyObject_Format=python33.PyObject_Format
+ PyObject_Free=python33.PyObject_Free
+ PyObject_GC_Del=python33.PyObject_GC_Del
+ PyObject_GC_Track=python33.PyObject_GC_Track
+ PyObject_GC_UnTrack=python33.PyObject_GC_UnTrack
+ PyObject_GenericGetAttr=python33.PyObject_GenericGetAttr
+ PyObject_GenericSetAttr=python33.PyObject_GenericSetAttr
+ PyObject_GetAttr=python33.PyObject_GetAttr
+ PyObject_GetAttrString=python33.PyObject_GetAttrString
+ PyObject_GetItem=python33.PyObject_GetItem
+ PyObject_GetIter=python33.PyObject_GetIter
+ PyObject_HasAttr=python33.PyObject_HasAttr
+ PyObject_HasAttrString=python33.PyObject_HasAttrString
+ PyObject_Hash=python33.PyObject_Hash
+ PyObject_HashNotImplemented=python33.PyObject_HashNotImplemented
+ PyObject_Init=python33.PyObject_Init
+ PyObject_InitVar=python33.PyObject_InitVar
+ PyObject_IsInstance=python33.PyObject_IsInstance
+ PyObject_IsSubclass=python33.PyObject_IsSubclass
+ PyObject_IsTrue=python33.PyObject_IsTrue
+ PyObject_Length=python33.PyObject_Length
+ PyObject_Malloc=python33.PyObject_Malloc
+ PyObject_Not=python33.PyObject_Not
+ PyObject_Realloc=python33.PyObject_Realloc
+ PyObject_Repr=python33.PyObject_Repr
+ PyObject_RichCompare=python33.PyObject_RichCompare
+ PyObject_RichCompareBool=python33.PyObject_RichCompareBool
+ PyObject_SelfIter=python33.PyObject_SelfIter
+ PyObject_SetAttr=python33.PyObject_SetAttr
+ PyObject_SetAttrString=python33.PyObject_SetAttrString
+ PyObject_SetItem=python33.PyObject_SetItem
+ PyObject_Size=python33.PyObject_Size
+ PyObject_Str=python33.PyObject_Str
+ PyObject_Type=python33.PyObject_Type DATA
+ PyParser_SimpleParseFileFlags=python33.PyParser_SimpleParseFileFlags
+ PyParser_SimpleParseStringFlags=python33.PyParser_SimpleParseStringFlags
+ PyProperty_Type=python33.PyProperty_Type DATA
+ PyRangeIter_Type=python33.PyRangeIter_Type DATA
+ PyRange_Type=python33.PyRange_Type DATA
+ PyReversed_Type=python33.PyReversed_Type DATA
+ PySeqIter_New=python33.PySeqIter_New
+ PySeqIter_Type=python33.PySeqIter_Type DATA
+ PySequence_Check=python33.PySequence_Check
+ PySequence_Concat=python33.PySequence_Concat
+ PySequence_Contains=python33.PySequence_Contains
+ PySequence_Count=python33.PySequence_Count
+ PySequence_DelItem=python33.PySequence_DelItem
+ PySequence_DelSlice=python33.PySequence_DelSlice
+ PySequence_Fast=python33.PySequence_Fast
+ PySequence_GetItem=python33.PySequence_GetItem
+ PySequence_GetSlice=python33.PySequence_GetSlice
+ PySequence_In=python33.PySequence_In
+ PySequence_InPlaceConcat=python33.PySequence_InPlaceConcat
+ PySequence_InPlaceRepeat=python33.PySequence_InPlaceRepeat
+ PySequence_Index=python33.PySequence_Index
+ PySequence_Length=python33.PySequence_Length
+ PySequence_List=python33.PySequence_List
+ PySequence_Repeat=python33.PySequence_Repeat
+ PySequence_SetItem=python33.PySequence_SetItem
+ PySequence_SetSlice=python33.PySequence_SetSlice
+ PySequence_Size=python33.PySequence_Size
+ PySequence_Tuple=python33.PySequence_Tuple
+ PySetIter_Type=python33.PySetIter_Type DATA
+ PySet_Add=python33.PySet_Add
+ PySet_Clear=python33.PySet_Clear
+ PySet_Contains=python33.PySet_Contains
+ PySet_Discard=python33.PySet_Discard
+ PySet_New=python33.PySet_New
+ PySet_Pop=python33.PySet_Pop
+ PySet_Size=python33.PySet_Size
+ PySet_Type=python33.PySet_Type DATA
+ PySlice_GetIndices=python33.PySlice_GetIndices
+ PySlice_GetIndicesEx=python33.PySlice_GetIndicesEx
+ PySlice_New=python33.PySlice_New
+ PySlice_Type=python33.PySlice_Type DATA
+ PySortWrapper_Type=python33.PySortWrapper_Type DATA
+ PyState_FindModule=python33.PyState_FindModule
+ PyState_AddModule=python33.PyState_AddModule
+ PyState_RemoveModule=python33.PyState_RemoveModule
+ PyStructSequence_GetItem=python33.PyStructSequence_GetItem
+ PyStructSequence_New=python33.PyStructSequence_New
+ PyStructSequence_NewType=python33.PyStructSequence_NewType
+ PyStructSequence_SetItem=python33.PyStructSequence_SetItem
+ PySuper_Type=python33.PySuper_Type DATA
+ PySys_AddWarnOption=python33.PySys_AddWarnOption
+ PySys_AddWarnOptionUnicode=python33.PySys_AddWarnOptionUnicode
+ PySys_FormatStderr=python33.PySys_FormatStderr
+ PySys_FormatStdout=python33.PySys_FormatStdout
+ PySys_GetObject=python33.PySys_GetObject
+ PySys_HasWarnOptions=python33.PySys_HasWarnOptions
+ PySys_ResetWarnOptions=python33.PySys_ResetWarnOptions
+ PySys_SetArgv=python33.PySys_SetArgv
+ PySys_SetArgvEx=python33.PySys_SetArgvEx
+ PySys_SetObject=python33.PySys_SetObject
+ PySys_SetPath=python33.PySys_SetPath
+ PySys_WriteStderr=python33.PySys_WriteStderr
+ PySys_WriteStdout=python33.PySys_WriteStdout
+ PyThreadState_Clear=python33.PyThreadState_Clear
+ PyThreadState_Delete=python33.PyThreadState_Delete
+ PyThreadState_DeleteCurrent=python33.PyThreadState_DeleteCurrent
+ PyThreadState_Get=python33.PyThreadState_Get
+ PyThreadState_GetDict=python33.PyThreadState_GetDict
+ PyThreadState_New=python33.PyThreadState_New
+ PyThreadState_SetAsyncExc=python33.PyThreadState_SetAsyncExc
+ PyThreadState_Swap=python33.PyThreadState_Swap
+ PyTraceBack_Here=python33.PyTraceBack_Here
+ PyTraceBack_Print=python33.PyTraceBack_Print
+ PyTraceBack_Type=python33.PyTraceBack_Type DATA
+ PyTupleIter_Type=python33.PyTupleIter_Type DATA
+ PyTuple_ClearFreeList=python33.PyTuple_ClearFreeList
+ PyTuple_GetItem=python33.PyTuple_GetItem
+ PyTuple_GetSlice=python33.PyTuple_GetSlice
+ PyTuple_New=python33.PyTuple_New
+ PyTuple_Pack=python33.PyTuple_Pack
+ PyTuple_SetItem=python33.PyTuple_SetItem
+ PyTuple_Size=python33.PyTuple_Size
+ PyTuple_Type=python33.PyTuple_Type DATA
+ PyType_ClearCache=python33.PyType_ClearCache
+ PyType_FromSpec=python33.PyType_FromSpec
+ PyType_FromSpecWithBases=python33.PyType_FromSpecWithBases
+ PyType_GenericAlloc=python33.PyType_GenericAlloc
+ PyType_GenericNew=python33.PyType_GenericNew
+ PyType_GetFlags=python33.PyType_GetFlags
+ PyType_IsSubtype=python33.PyType_IsSubtype
+ PyType_Modified=python33.PyType_Modified
+ PyType_Ready=python33.PyType_Ready
+ PyType_Type=python33.PyType_Type DATA
+ PyUnicodeDecodeError_Create=python33.PyUnicodeDecodeError_Create
+ PyUnicodeDecodeError_GetEncoding=python33.PyUnicodeDecodeError_GetEncoding
+ PyUnicodeDecodeError_GetEnd=python33.PyUnicodeDecodeError_GetEnd
+ PyUnicodeDecodeError_GetObject=python33.PyUnicodeDecodeError_GetObject
+ PyUnicodeDecodeError_GetReason=python33.PyUnicodeDecodeError_GetReason
+ PyUnicodeDecodeError_GetStart=python33.PyUnicodeDecodeError_GetStart
+ PyUnicodeDecodeError_SetEnd=python33.PyUnicodeDecodeError_SetEnd
+ PyUnicodeDecodeError_SetReason=python33.PyUnicodeDecodeError_SetReason
+ PyUnicodeDecodeError_SetStart=python33.PyUnicodeDecodeError_SetStart
+ PyUnicodeEncodeError_GetEncoding=python33.PyUnicodeEncodeError_GetEncoding
+ PyUnicodeEncodeError_GetEnd=python33.PyUnicodeEncodeError_GetEnd
+ PyUnicodeEncodeError_GetObject=python33.PyUnicodeEncodeError_GetObject
+ PyUnicodeEncodeError_GetReason=python33.PyUnicodeEncodeError_GetReason
+ PyUnicodeEncodeError_GetStart=python33.PyUnicodeEncodeError_GetStart
+ PyUnicodeEncodeError_SetEnd=python33.PyUnicodeEncodeError_SetEnd
+ PyUnicodeEncodeError_SetReason=python33.PyUnicodeEncodeError_SetReason
+ PyUnicodeEncodeError_SetStart=python33.PyUnicodeEncodeError_SetStart
+ PyUnicodeIter_Type=python33.PyUnicodeIter_Type DATA
+ PyUnicodeTranslateError_GetEnd=python33.PyUnicodeTranslateError_GetEnd
+ PyUnicodeTranslateError_GetObject=python33.PyUnicodeTranslateError_GetObject
+ PyUnicodeTranslateError_GetReason=python33.PyUnicodeTranslateError_GetReason
+ PyUnicodeTranslateError_GetStart=python33.PyUnicodeTranslateError_GetStart
+ PyUnicodeTranslateError_SetEnd=python33.PyUnicodeTranslateError_SetEnd
+ PyUnicodeTranslateError_SetReason=python33.PyUnicodeTranslateError_SetReason
+ PyUnicodeTranslateError_SetStart=python33.PyUnicodeTranslateError_SetStart
+ PyUnicode_Append=python33.PyUnicodeUCS2_Append
+ PyUnicode_AppendAndDel=python33.PyUnicodeUCS2_AppendAndDel
+ PyUnicode_AsASCIIString=python33.PyUnicodeUCS2_AsASCIIString
+ PyUnicode_AsCharmapString=python33.PyUnicodeUCS2_AsCharmapString
+ PyUnicode_AsDecodedObject=python33.PyUnicodeUCS2_AsDecodedObject
+ PyUnicode_AsDecodedUnicode=python33.PyUnicodeUCS2_AsDecodedUnicode
+ PyUnicode_AsEncodedObject=python33.PyUnicodeUCS2_AsEncodedObject
+ PyUnicode_AsEncodedString=python33.PyUnicodeUCS2_AsEncodedString
+ PyUnicode_AsEncodedUnicode=python33.PyUnicodeUCS2_AsEncodedUnicode
+ PyUnicode_AsLatin1String=python33.PyUnicodeUCS2_AsLatin1String
+ PyUnicode_AsRawUnicodeEscapeString=python33.PyUnicodeUCS2_AsRawUnicodeEscapeString
+ PyUnicode_AsUTF16String=python33.PyUnicodeUCS2_AsUTF16String
+ PyUnicode_AsUTF32String=python33.PyUnicodeUCS2_AsUTF32String
+ PyUnicode_AsUTF8String=python33.PyUnicodeUCS2_AsUTF8String
+ PyUnicode_AsUnicodeEscapeString=python33.PyUnicodeUCS2_AsUnicodeEscapeString
+ PyUnicode_AsWideChar=python33.PyUnicodeUCS2_AsWideChar
+ PyUnicode_ClearFreelist=python33.PyUnicodeUCS2_ClearFreelist
+ PyUnicode_Compare=python33.PyUnicodeUCS2_Compare
+ PyUnicode_Concat=python33.PyUnicodeUCS2_Concat
+ PyUnicode_Contains=python33.PyUnicodeUCS2_Contains
+ PyUnicode_Count=python33.PyUnicodeUCS2_Count
+ PyUnicode_Decode=python33.PyUnicodeUCS2_Decode
+ PyUnicode_DecodeASCII=python33.PyUnicodeUCS2_DecodeASCII
+ PyUnicode_DecodeCharmap=python33.PyUnicodeUCS2_DecodeCharmap
+ PyUnicode_DecodeFSDefault=python33.PyUnicodeUCS2_DecodeFSDefault
+ PyUnicode_DecodeFSDefaultAndSize=python33.PyUnicodeUCS2_DecodeFSDefaultAndSize
+ PyUnicode_DecodeLatin1=python33.PyUnicodeUCS2_DecodeLatin1
+ PyUnicode_DecodeRawUnicodeEscape=python33.PyUnicodeUCS2_DecodeRawUnicodeEscape
+ PyUnicode_DecodeUTF16=python33.PyUnicodeUCS2_DecodeUTF16
+ PyUnicode_DecodeUTF16Stateful=python33.PyUnicodeUCS2_DecodeUTF16Stateful
+ PyUnicode_DecodeUTF32=python33.PyUnicodeUCS2_DecodeUTF32
+ PyUnicode_DecodeUTF32Stateful=python33.PyUnicodeUCS2_DecodeUTF32Stateful
+ PyUnicode_DecodeUTF8=python33.PyUnicodeUCS2_DecodeUTF8
+ PyUnicode_DecodeUTF8Stateful=python33.PyUnicodeUCS2_DecodeUTF8Stateful
+ PyUnicode_DecodeUnicodeEscape=python33.PyUnicodeUCS2_DecodeUnicodeEscape
+ PyUnicode_FSConverter=python33.PyUnicodeUCS2_FSConverter
+ PyUnicode_FSDecoder=python33.PyUnicodeUCS2_FSDecoder
+ PyUnicode_Find=python33.PyUnicodeUCS2_Find
+ PyUnicode_Format=python33.PyUnicodeUCS2_Format
+ PyUnicode_FromEncodedObject=python33.PyUnicodeUCS2_FromEncodedObject
+ PyUnicode_FromFormat=python33.PyUnicodeUCS2_FromFormat
+ PyUnicode_FromFormatV=python33.PyUnicodeUCS2_FromFormatV
+ PyUnicode_FromObject=python33.PyUnicodeUCS2_FromObject
+ PyUnicode_FromOrdinal=python33.PyUnicodeUCS2_FromOrdinal
+ PyUnicode_FromString=python33.PyUnicodeUCS2_FromString
+ PyUnicode_FromStringAndSize=python33.PyUnicodeUCS2_FromStringAndSize
+ PyUnicode_FromWideChar=python33.PyUnicodeUCS2_FromWideChar
+ PyUnicode_GetDefaultEncoding=python33.PyUnicodeUCS2_GetDefaultEncoding
+ PyUnicode_GetSize=python33.PyUnicodeUCS2_GetSize
+ PyUnicode_IsIdentifier=python33.PyUnicodeUCS2_IsIdentifier
+ PyUnicode_Join=python33.PyUnicodeUCS2_Join
+ PyUnicode_Partition=python33.PyUnicodeUCS2_Partition
+ PyUnicode_RPartition=python33.PyUnicodeUCS2_RPartition
+ PyUnicode_RSplit=python33.PyUnicodeUCS2_RSplit
+ PyUnicode_Replace=python33.PyUnicodeUCS2_Replace
+ PyUnicode_Resize=python33.PyUnicodeUCS2_Resize
+ PyUnicode_RichCompare=python33.PyUnicodeUCS2_RichCompare
+ PyUnicode_SetDefaultEncoding=python33.PyUnicodeUCS2_SetDefaultEncoding
+ PyUnicode_Split=python33.PyUnicodeUCS2_Split
+ PyUnicode_Splitlines=python33.PyUnicodeUCS2_Splitlines
+ PyUnicode_Tailmatch=python33.PyUnicodeUCS2_Tailmatch
+ PyUnicode_Translate=python33.PyUnicodeUCS2_Translate
+ PyUnicode_BuildEncodingMap=python33.PyUnicode_BuildEncodingMap
+ PyUnicode_CompareWithASCIIString=python33.PyUnicode_CompareWithASCIIString
+ PyUnicode_DecodeUTF7=python33.PyUnicode_DecodeUTF7
+ PyUnicode_DecodeUTF7Stateful=python33.PyUnicode_DecodeUTF7Stateful
+ PyUnicode_EncodeFSDefault=python33.PyUnicode_EncodeFSDefault
+ PyUnicode_InternFromString=python33.PyUnicode_InternFromString
+ PyUnicode_InternImmortal=python33.PyUnicode_InternImmortal
+ PyUnicode_InternInPlace=python33.PyUnicode_InternInPlace
+ PyUnicode_Type=python33.PyUnicode_Type DATA
+ PyWeakref_GetObject=python33.PyWeakref_GetObject DATA
+ PyWeakref_NewProxy=python33.PyWeakref_NewProxy
+ PyWeakref_NewRef=python33.PyWeakref_NewRef
+ PyWrapperDescr_Type=python33.PyWrapperDescr_Type DATA
+ PyWrapper_New=python33.PyWrapper_New
+ PyZip_Type=python33.PyZip_Type DATA
+ Py_AddPendingCall=python33.Py_AddPendingCall
+ Py_AtExit=python33.Py_AtExit
+ Py_BuildValue=python33.Py_BuildValue
+ Py_CompileString=python33.Py_CompileString
+ Py_DecRef=python33.Py_DecRef
+ Py_EndInterpreter=python33.Py_EndInterpreter
+ Py_Exit=python33.Py_Exit
+ Py_FatalError=python33.Py_FatalError
+ Py_FileSystemDefaultEncoding=python33.Py_FileSystemDefaultEncoding DATA
+ Py_Finalize=python33.Py_Finalize
+ Py_GetBuildInfo=python33.Py_GetBuildInfo
+ Py_GetCompiler=python33.Py_GetCompiler
+ Py_GetCopyright=python33.Py_GetCopyright
+ Py_GetExecPrefix=python33.Py_GetExecPrefix
+ Py_GetPath=python33.Py_GetPath
+ Py_GetPlatform=python33.Py_GetPlatform
+ Py_GetPrefix=python33.Py_GetPrefix
+ Py_GetProgramFullPath=python33.Py_GetProgramFullPath
+ Py_GetProgramName=python33.Py_GetProgramName
+ Py_GetPythonHome=python33.Py_GetPythonHome
+ Py_GetRecursionLimit=python33.Py_GetRecursionLimit
+ Py_GetVersion=python33.Py_GetVersion
+ Py_HasFileSystemDefaultEncoding=python33.Py_HasFileSystemDefaultEncoding DATA
+ Py_IncRef=python33.Py_IncRef
+ Py_Initialize=python33.Py_Initialize
+ Py_InitializeEx=python33.Py_InitializeEx
+ Py_IsInitialized=python33.Py_IsInitialized
+ Py_Main=python33.Py_Main
+ Py_MakePendingCalls=python33.Py_MakePendingCalls
+ Py_NewInterpreter=python33.Py_NewInterpreter
+ Py_ReprEnter=python33.Py_ReprEnter
+ Py_ReprLeave=python33.Py_ReprLeave
+ Py_SetProgramName=python33.Py_SetProgramName
+ Py_SetPythonHome=python33.Py_SetPythonHome
+ Py_SetRecursionLimit=python33.Py_SetRecursionLimit
+ Py_SymtableString=python33.Py_SymtableString
+ Py_VaBuildValue=python33.Py_VaBuildValue
+ _PyErr_BadInternalCall=python33._PyErr_BadInternalCall
+ _PyObject_CallFunction_SizeT=python33._PyObject_CallFunction_SizeT
+ _PyObject_CallMethod_SizeT=python33._PyObject_CallMethod_SizeT
+ _PyObject_GC_Malloc=python33._PyObject_GC_Malloc
+ _PyObject_GC_New=python33._PyObject_GC_New
+ _PyObject_GC_NewVar=python33._PyObject_GC_NewVar
+ _PyObject_GC_Resize=python33._PyObject_GC_Resize
+ _PyObject_New=python33._PyObject_New
+ _PyObject_NewVar=python33._PyObject_NewVar
+ _PyState_AddModule=python33._PyState_AddModule
+ _PyThreadState_Init=python33._PyThreadState_Init
+ _PyThreadState_Prealloc=python33._PyThreadState_Prealloc
+ _PyTrash_delete_later=python33._PyTrash_delete_later DATA
+ _PyTrash_delete_nesting=python33._PyTrash_delete_nesting DATA
+ _PyTrash_deposit_object=python33._PyTrash_deposit_object
+ _PyTrash_destroy_chain=python33._PyTrash_destroy_chain
+ _PyWeakref_CallableProxyType=python33._PyWeakref_CallableProxyType DATA
+ _PyWeakref_ProxyType=python33._PyWeakref_ProxyType DATA
+ _PyWeakref_RefType=python33._PyWeakref_RefType DATA
+ _Py_BuildValue_SizeT=python33._Py_BuildValue_SizeT
+ _Py_CheckRecursionLimit=python33._Py_CheckRecursionLimit DATA
+ _Py_CheckRecursiveCall=python33._Py_CheckRecursiveCall
+ _Py_Dealloc=python33._Py_Dealloc
+ _Py_EllipsisObject=python33._Py_EllipsisObject DATA
+ _Py_FalseStruct=python33._Py_FalseStruct DATA
+ _Py_NoneStruct=python33._Py_NoneStruct DATA
+ _Py_NotImplementedStruct=python33._Py_NotImplementedStruct DATA
+ _Py_SwappedOp=python33._Py_SwappedOp DATA
+ _Py_TrueStruct=python33._Py_TrueStruct DATA
+ _Py_VaBuildValue_SizeT=python33._Py_VaBuildValue_SizeT
+ _PyArg_Parse_SizeT=python33._PyArg_Parse_SizeT
+ _PyArg_ParseTuple_SizeT=python33._PyArg_ParseTuple_SizeT
+ _PyArg_ParseTupleAndKeywords_SizeT=python33._PyArg_ParseTupleAndKeywords_SizeT
+ _PyArg_VaParse_SizeT=python33._PyArg_VaParse_SizeT
+ _PyArg_VaParseTupleAndKeywords_SizeT=python33._PyArg_VaParseTupleAndKeywords_SizeT
+ _Py_BuildValue_SizeT=python33._Py_BuildValue_SizeT
diff --git a/PC/python3.mak b/PC/python3.mak
index a7f01cb..2ec9185 100644
--- a/PC/python3.mak
+++ b/PC/python3.mak
@@ -1,10 +1,10 @@
-$(OutDir)python3.dll: python3.def $(OutDir)python32stub.lib
- cl /LD /Fe$(OutDir)python3.dll python3dll.c python3.def $(OutDir)python32stub.lib
+$(OutDir)python3.dll: python3.def $(OutDir)python33stub.lib
+ cl /LD /Fe$(OutDir)python3.dll python3dll.c python3.def $(OutDir)python33stub.lib
-$(OutDir)python32stub.lib: python32stub.def
- lib /def:python32stub.def /out:$(OutDir)python32stub.lib /MACHINE:$(MACHINE)
+$(OutDir)python33stub.lib: python33stub.def
+ lib /def:python33stub.def /out:$(OutDir)python33stub.lib /MACHINE:$(MACHINE)
clean:
- del $(OutDir)python3.dll $(OutDir)python3.lib $(OutDir)python32stub.lib $(OutDir)python3.exp $(OutDir)python32stub.exp
+ del $(OutDir)python3.dll $(OutDir)python3.lib $(OutDir)python33stub.lib $(OutDir)python3.exp $(OutDir)python33stub.exp
rebuild: clean $(OutDir)python3.dll
diff --git a/PC/python32gen.py b/PC/python33gen.py
index 9182d54..21b9f56 100644
--- a/PC/python32gen.py
+++ b/PC/python33gen.py
@@ -1,18 +1,20 @@
-# Generate python32stub.def out of python3.def
+# Generate python33stub.def out of python3.def
# The regular import library cannot be used,
# since it doesn't provide the right symbols for
# data forwarding
-out = open("python32stub.def", "w")
-out.write('LIBRARY "python32"\n')
+out = open("python33stub.def", "w")
+out.write('LIBRARY "python33"\n')
out.write('EXPORTS\n')
inp = open("python3.def")
-inp.readline()
line = inp.readline()
+while line.strip().startswith(';'):
+ line = inp.readline()
+line = inp.readline() # LIBRARY
assert line.strip()=='EXPORTS'
for line in inp:
- # SYM1=python32.SYM2[ DATA]
+ # SYM1=python33.SYM2[ DATA]
head, tail = line.split('.')
if 'DATA' in tail:
symbol, tail = tail.split(' ')
@@ -22,4 +24,3 @@ for line in inp:
inp.close()
out.close()
-
diff --git a/PC/python32stub.def b/PC/python33stub.def
index 0943ef0..5b8ccf6 100644
--- a/PC/python32stub.def
+++ b/PC/python33stub.def
@@ -1,4 +1,4 @@
-LIBRARY "python32"
+LIBRARY "python33"
EXPORTS
PyArg_Parse
PyArg_ParseTuple
@@ -471,6 +471,8 @@ PySlice_New
PySlice_Type
PySortWrapper_Type
PyState_FindModule
+PyState_AddModule
+PyState_RemoveModule
PyStructSequence_GetItem
PyStructSequence_New
PyStructSequence_NewType
@@ -511,6 +513,7 @@ PyTuple_Size
PyTuple_Type
PyType_ClearCache
PyType_FromSpec
+PyType_FromSpecWithBases
PyType_GenericAlloc
PyType_GenericNew
PyType_GetFlags
@@ -687,3 +690,9 @@ _Py_NotImplementedStruct
_Py_SwappedOp
_Py_TrueStruct
_Py_VaBuildValue_SizeT
+_PyArg_Parse_SizeT
+_PyArg_ParseTuple_SizeT
+_PyArg_ParseTupleAndKeywords_SizeT
+_PyArg_VaParse_SizeT
+_PyArg_VaParseTupleAndKeywords_SizeT
+_Py_BuildValue_SizeT
diff --git a/PC/python_nt.rc b/PC/python_nt.rc
index 5295610..5010baa 100644
--- a/PC/python_nt.rc
+++ b/PC/python_nt.rc
@@ -12,7 +12,7 @@
# include "pythonnt_rc.h"
#endif
-/* e.g., 2.1a2
+/* e.g., 3.3.0a1
* PY_VERSION comes from patchevel.h
*/
#define PYTHON_VERSION PY_VERSION "\0"
diff --git a/PC/readme.txt b/PC/readme.txt
index b5a5a87..fdc09ab 100644
--- a/PC/readme.txt
+++ b/PC/readme.txt
@@ -63,7 +63,7 @@ Additional files and subdirectories for 32-bit Windows
python_nt.rc Resource compiler input for python15.dll.
-dl_nt.c, import_nt.c
+dl_nt.c
Additional sources used for 32-bit Windows features.
getpathp.c Default sys.path calculations (for all PC platforms).
diff --git a/PC/winreg.c b/PC/winreg.c
index 454ea53..091b477 100644
--- a/PC/winreg.c
+++ b/PC/winreg.c
@@ -89,7 +89,7 @@ PyDoc_STRVAR(ConnectRegistry_doc,
"key is the predefined handle to connect to.\n"
"\n"
"The return value is the handle of the opened key.\n"
-"If the function fails, a WindowsError exception is raised.");
+"If the function fails, an OSError exception is raised.");
PyDoc_STRVAR(CreateKey_doc,
"CreateKey(key, sub_key) -> key\n"
@@ -104,7 +104,7 @@ PyDoc_STRVAR(CreateKey_doc,
"If the key already exists, this function opens the existing key.\n"
"\n"
"The return value is the handle of the opened key.\n"
-"If the function fails, a WindowsError exception is raised.");
+"If the function fails, an OSError exception is raised.");
PyDoc_STRVAR(CreateKeyEx_doc,
"CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE) -> key\n"
@@ -122,7 +122,7 @@ PyDoc_STRVAR(CreateKeyEx_doc,
"If the key already exists, this function opens the existing key\n"
"\n"
"The return value is the handle of the opened key.\n"
-"If the function fails, a WindowsError exception is raised.");
+"If the function fails, an OSError exception is raised.");
PyDoc_STRVAR(DeleteKey_doc,
"DeleteKey(key, sub_key)\n"
@@ -136,7 +136,7 @@ PyDoc_STRVAR(DeleteKey_doc,
"This method can not delete keys with subkeys.\n"
"\n"
"If the function succeeds, the entire key, including all of its values,\n"
-"is removed. If the function fails, a WindowsError exception is raised.");
+"is removed. If the function fails, an OSError exception is raised.");
PyDoc_STRVAR(DeleteKeyEx_doc,
"DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)\n"
@@ -153,7 +153,7 @@ PyDoc_STRVAR(DeleteKeyEx_doc,
"This method can not delete keys with subkeys.\n"
"\n"
"If the function succeeds, the entire key, including all of its values,\n"
-"is removed. If the function fails, a WindowsError exception is raised.\n"
+"is removed. If the function fails, an OSError exception is raised.\n"
"On unsupported Windows versions, NotImplementedError is raised.");
PyDoc_STRVAR(DeleteValue_doc,
@@ -171,7 +171,7 @@ PyDoc_STRVAR(EnumKey_doc,
"index is an integer that identifies the index of the key to retrieve.\n"
"\n"
"The function retrieves the name of one subkey each time it is called.\n"
-"It is typically called repeatedly until a WindowsError exception is\n"
+"It is typically called repeatedly until an OSError exception is\n"
"raised, indicating no more values are available.");
PyDoc_STRVAR(EnumValue_doc,
@@ -181,7 +181,7 @@ PyDoc_STRVAR(EnumValue_doc,
"index is an integer that identifies the index of the value to retrieve.\n"
"\n"
"The function retrieves the name of one subkey each time it is called.\n"
-"It is typically called repeatedly, until a WindowsError exception\n"
+"It is typically called repeatedly, until an OSError exception\n"
"is raised, indicating no more values.\n"
"\n"
"The result is a tuple of 3 items:\n"
@@ -240,7 +240,7 @@ PyDoc_STRVAR(OpenKey_doc,
" security access for the key. Default is KEY_READ\n"
"\n"
"The result is a new handle to the specified key\n"
-"If the function fails, a WindowsError exception is raised.");
+"If the function fails, an OSError exception is raised.");
PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
@@ -792,26 +792,27 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
case REG_SZ:
case REG_EXPAND_SZ:
{
- if (value == Py_None)
- *retDataSize = 1;
- else {
- if (!PyUnicode_Check(value))
- return FALSE;
- *retDataSize = Py_SAFE_DOWNCAST(
- 2 + PyUnicode_GET_DATA_SIZE(value),
- size_t, DWORD);
- }
- *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
- if (*retDataBuf==NULL){
- PyErr_NoMemory();
- return FALSE;
- }
- if (value == Py_None)
- wcscpy((wchar_t *)*retDataBuf, L"");
- else
- wcscpy((wchar_t *)*retDataBuf,
- PyUnicode_AS_UNICODE(value));
- break;
+ if (value != Py_None) {
+ Py_ssize_t len;
+ if (!PyUnicode_Check(value))
+ return FALSE;
+ *retDataBuf = (BYTE*)PyUnicode_AsWideCharString(value, &len);
+ if (*retDataBuf == NULL)
+ return FALSE;
+ *retDataSize = Py_SAFE_DOWNCAST(
+ (len + 1) * sizeof(wchar_t),
+ Py_ssize_t, DWORD);
+ }
+ else {
+ *retDataBuf = (BYTE *)PyMem_NEW(wchar_t, 1);
+ if (*retDataBuf == NULL) {
+ PyErr_NoMemory();
+ return FALSE;
+ }
+ ((wchar_t *)*retDataBuf)[0] = L'\0';
+ *retDataSize = 1 * sizeof(wchar_t);
+ }
+ break;
}
case REG_MULTI_SZ:
{
@@ -828,10 +829,16 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
for (j = 0; j < i; j++)
{
PyObject *t;
+ wchar_t *wstr;
+ Py_ssize_t len;
+
t = PyList_GET_ITEM(value, j);
if (!PyUnicode_Check(t))
return FALSE;
- size += Py_SAFE_DOWNCAST(2 + PyUnicode_GET_DATA_SIZE(t),
+ wstr = PyUnicode_AsUnicodeAndSize(t, &len);
+ if (wstr == NULL)
+ return FALSE;
+ size += Py_SAFE_DOWNCAST((len + 1) * sizeof(wchar_t),
size_t, DWORD);
}
@@ -847,10 +854,15 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
for (j = 0; j < i; j++)
{
PyObject *t;
+ wchar_t *wstr;
+ Py_ssize_t len;
+
t = PyList_GET_ITEM(value, j);
- wcscpy(P, PyUnicode_AS_UNICODE(t));
- P += 1 + wcslen(
- PyUnicode_AS_UNICODE(t));
+ wstr = PyUnicode_AsUnicodeAndSize(t, &len);
+ if (wstr == NULL)
+ return FALSE;
+ wcscpy(P, wstr);
+ P += (len + 1);
}
/* And doubly-terminate the list... */
*P = '\0';
@@ -914,7 +926,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
retDataSize -= 2;
if (retDataSize <= 0)
data = L"";
- obData = PyUnicode_FromUnicode(data, retDataSize/2);
+ obData = PyUnicode_FromWideChar(data, retDataSize/2);
break;
}
case REG_MULTI_SZ:
@@ -945,7 +957,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
}
PyList_SetItem(obData,
index,
- PyUnicode_FromUnicode(str[index], len));
+ PyUnicode_FromWideChar(str[index], len));
}
free(str);
@@ -1086,7 +1098,7 @@ PyDeleteKeyEx(PyObject *self, PyObject *args, PyObject *kwargs)
/* Only available on 64bit platforms, so we must load it
dynamically. */
- hMod = GetModuleHandle("advapi32.dll");
+ hMod = GetModuleHandleW(L"advapi32.dll");
if (hMod)
pfn = (RDKEFunc)GetProcAddress(hMod,
"RegDeleteKeyExW");
@@ -1155,7 +1167,7 @@ PyEnumKey(PyObject *self, PyObject *args)
if (rc != ERROR_SUCCESS)
return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
- retStr = PyUnicode_FromUnicode(tmpbuf, len);
+ retStr = PyUnicode_FromWideChar(tmpbuf, len);
return retStr; /* can be NULL */
}
@@ -1247,8 +1259,8 @@ PyEnumValue(PyObject *self, PyObject *args)
static PyObject *
PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
{
- Py_UNICODE *retValue = NULL;
- Py_UNICODE *src;
+ wchar_t *retValue = NULL;
+ wchar_t *src;
DWORD retValueSize;
DWORD rc;
PyObject *o;
@@ -1261,7 +1273,7 @@ PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
return PyErr_SetFromWindowsErrWithFunction(retValueSize,
"ExpandEnvironmentStrings");
}
- retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
+ retValue = (wchar_t *)PyMem_Malloc(retValueSize * sizeof(wchar_t));
if (retValue == NULL) {
return PyErr_NoMemory();
}
@@ -1272,7 +1284,7 @@ PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
return PyErr_SetFromWindowsErrWithFunction(retValueSize,
"ExpandEnvironmentStrings");
}
- o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
+ o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
PyMem_Free(retValue);
return o;
}
@@ -1426,7 +1438,7 @@ PyQueryValue(PyObject *self, PyObject *args)
"RegQueryValue");
}
- retStr = PyUnicode_FromUnicode(retBuf, wcslen(retBuf));
+ retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
PyMem_Free(retBuf);
return retStr;
}
@@ -1557,7 +1569,7 @@ PySetValueEx(PyObject *self, PyObject *args)
{
HKEY hKey;
PyObject *obKey;
- Py_UNICODE *valueName;
+ wchar_t *valueName;
PyObject *obRes;
PyObject *value;
BYTE *data;
@@ -1610,7 +1622,7 @@ PyDisableReflectionKey(PyObject *self, PyObject *args)
/* Only available on 64bit platforms, so we must load it
dynamically.*/
- hMod = GetModuleHandle("advapi32.dll");
+ hMod = GetModuleHandleW(L"advapi32.dll");
if (hMod)
pfn = (RDRKFunc)GetProcAddress(hMod,
"RegDisableReflectionKey");
@@ -1646,7 +1658,7 @@ PyEnableReflectionKey(PyObject *self, PyObject *args)
/* Only available on 64bit platforms, so we must load it
dynamically.*/
- hMod = GetModuleHandle("advapi32.dll");
+ hMod = GetModuleHandleW(L"advapi32.dll");
if (hMod)
pfn = (RERKFunc)GetProcAddress(hMod,
"RegEnableReflectionKey");
@@ -1683,7 +1695,7 @@ PyQueryReflectionKey(PyObject *self, PyObject *args)
/* Only available on 64bit platforms, so we must load it
dynamically.*/
- hMod = GetModuleHandle("advapi32.dll");
+ hMod = GetModuleHandleW(L"advapi32.dll");
if (hMod)
pfn = (RQRKFunc)GetProcAddress(hMod,
"RegQueryReflectionKey");
diff --git a/PC/winsound.c b/PC/winsound.c
index 1ed95ba..b564eab 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -72,7 +72,7 @@ PyDoc_STRVAR(sound_module_doc,
static PyObject *
sound_playsound(PyObject *s, PyObject *args)
{
- Py_UNICODE *wsound;
+ wchar_t *wsound;
int flags;
int ok;
diff --git a/PCbuild/_bz2.vcxproj b/PCbuild/_bz2.vcxproj
new file mode 100644
index 0000000..9387e54
--- /dev/null
+++ b/PCbuild/_bz2.vcxproj
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}</ProjectGuid>
+ <RootNamespace>bz2</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(bz2Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D170000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_bz2module.c" />
+ <ClCompile Include="$(bz2Dir)\blocksort.c" />
+ <ClCompile Include="$(bz2Dir)\bzlib.c" />
+ <ClCompile Include="$(bz2Dir)\compress.c" />
+ <ClCompile Include="$(bz2Dir)\crctable.c" />
+ <ClCompile Include="$(bz2Dir)\decompress.c" />
+ <ClCompile Include="$(bz2Dir)\huffman.c" />
+ <ClCompile Include="$(bz2Dir)\randtable.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="$(bz2Dir)\bzlib.h" />
+ <ClInclude Include="$(bz2Dir)\bzlib_private.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_bz2.vcxproj.filters b/PCbuild/_bz2.vcxproj.filters
new file mode 100644
index 0000000..eac64dd
--- /dev/null
+++ b/PCbuild/_bz2.vcxproj.filters
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{f53a859d-dad2-4d5b-ae41-f28d8b571f5a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="bzip2 1.0.6 Header Files">
+ <UniqueIdentifier>{7e0bed05-ae33-43b7-8797-656455bbb7f3}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="bzip2 1.0.6 Source Files">
+ <UniqueIdentifier>{ed574b89-6983-4cdf-9f98-fe7048d9e89c}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_bz2module.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\blocksort.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\bzlib.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\compress.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\crctable.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\decompress.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\huffman.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="$(bz2Dir)\randtable.c">
+ <Filter>bzip2 1.0.6 Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="$(bz2Dir)\bzlib.h">
+ <Filter>bzip2 1.0.6 Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="$(bz2Dir)\bzlib_private.h">
+ <Filter>bzip2 1.0.6 Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project>
diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj
new file mode 100644
index 0000000..202cb1f
--- /dev/null
+++ b/PCbuild/_ctypes.vcxproj
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0E9791DB-593A-465F-98BC-681011311618}</ProjectGuid>
+ <RootNamespace>_ctypes</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\_ctypes\libffi_msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalOptions>/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions)</AdditionalOptions>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_ctypes\ctypes.h" />
+ <ClInclude Include="..\Modules\_ctypes\ctypes_dlfcn.h" />
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffi.h" />
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffi_common.h" />
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\fficonfig.h" />
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffitarget.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ctypes\_ctypes.c" />
+ <ClCompile Include="..\Modules\_ctypes\callbacks.c" />
+ <ClCompile Include="..\Modules\_ctypes\callproc.c" />
+ <ClCompile Include="..\Modules\_ctypes\cfield.c" />
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\ffi.c" />
+ <ClCompile Include="..\Modules\_ctypes\malloc_closure.c" />
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\prep_cif.c" />
+ <ClCompile Include="..\Modules\_ctypes\stgdict.c" />
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\win32.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\Modules\_ctypes\libffi_msvc\win64.asm">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">ml64 /nologo /c /Zi /Fo "$(IntDir)win64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)win64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">ml64 /nologo /c /Fo "$(IntDir)win64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(IntDir)win64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">ml64 /nologo /c /Fo "$(IntDir)win64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(IntDir)win64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ml64 /nologo /c /Fo "$(IntDir)win64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)win64.obj;%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_ctypes.vcxproj.filters b/PCbuild/_ctypes.vcxproj.filters
new file mode 100644
index 0000000..83d7a7b
--- /dev/null
+++ b/PCbuild/_ctypes.vcxproj.filters
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{806081ee-2af0-48d0-a83e-ee02a74baa0f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{dbdea1f2-ad8b-44ca-b782-fcf65d91559b}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_ctypes\ctypes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_ctypes\ctypes_dlfcn.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffi.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffi_common.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\fficonfig.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_ctypes\libffi_msvc\ffitarget.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ctypes\_ctypes.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\callbacks.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\callproc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\cfield.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\ffi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\malloc_closure.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\prep_cif.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\stgdict.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_ctypes\libffi_msvc\win32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\Modules\_ctypes\libffi_msvc\win64.asm">
+ <Filter>Source Files</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_ctypes_test.vcxproj b/PCbuild/_ctypes_test.vcxproj
new file mode 100644
index 0000000..35e299b
--- /dev/null
+++ b/PCbuild/_ctypes_test.vcxproj
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{9EC7190A-249F-4180-A900-548FDCF3055F}</ProjectGuid>
+ <RootNamespace>_ctypes_test</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_ctypes\_ctypes_test.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ctypes\_ctypes_test.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_ctypes_test.vcxproj.filters b/PCbuild/_ctypes_test.vcxproj.filters
new file mode 100644
index 0000000..c1e94ce
--- /dev/null
+++ b/PCbuild/_ctypes_test.vcxproj.filters
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{8fd70119-5481-4e5d-b187-d0b14eb27e38}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{38abc486-e143-49dc-8cf0-8aefab0e0d3d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_ctypes\_ctypes_test.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ctypes\_ctypes_test.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj
new file mode 100644
index 0000000..98ba81d
--- /dev/null
+++ b/PCbuild/_decimal.vcxproj
@@ -0,0 +1,308 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0E9791DB-593A-465F-98BC-681011311617}</ProjectGuid>
+ <RootNamespace>_decimal</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;..\Include;..\PC;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_32 /DPPRO /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/D_CRT_SECURE_NO_WARNINGS /DCONFIG_64 /DMASM %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>NotSet</SubSystem>
+ <BaseAddress>0x1D1A0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\basearith.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\bits.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\constants.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\convolute.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\crt.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\difradix2.h" />
+ <ClInclude Include="..\Modules\_decimal\docstrings.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\fnt.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\fourstep.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\mpdecimal.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\numbertheory.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\sixstep.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\transpose.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\typearith.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\umodarith.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\vccompat.h" />
+ <ClInclude Include="..\Modules\_decimal\libmpdec\vcstdint.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_decimal\_decimal.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\basearith.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\constants.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\context.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\convolute.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\crt.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\difradix2.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\fnt.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\fourstep.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\io.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\memory.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\mpdecimal.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\numbertheory.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\sixstep.c" />
+ <ClCompile Include="..\Modules\_decimal\libmpdec\transpose.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\Modules\_decimal\libmpdec\vcdiv64.asm">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">ml64 /nologo /c /Zi /Fo "$(IntDir)vcdiv64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)vcdiv64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">ml64 /nologo /c /Fo "$(IntDir)vcdiv64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(IntDir)vcdiv64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">ml64 /nologo /c /Fo "$(IntDir)vcdiv64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(IntDir)vcdiv64.obj;%(Outputs)</Outputs>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ml64 /nologo /c /Zi /Fo "$(IntDir)vcdiv64.obj" "%(FullPath)"
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)vcdiv64.obj;%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_decimal.vcxproj.filters b/PCbuild/_decimal.vcxproj.filters
new file mode 100644
index 0000000..7e19aa2
--- /dev/null
+++ b/PCbuild/_decimal.vcxproj.filters
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{f35a78a6-3ef0-4e36-bd8b-afaef22fbb7c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{138089f8-faba-494f-b6ed-051f31fbaf2d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\basearith.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\bits.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\constants.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\convolute.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\crt.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\difradix2.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\docstrings.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\fnt.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\fourstep.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\mpdecimal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\numbertheory.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\sixstep.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\transpose.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\typearith.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\umodarith.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\vccompat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_decimal\libmpdec\vcstdint.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_decimal\_decimal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\basearith.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\constants.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\context.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\convolute.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\crt.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\difradix2.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\fnt.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\fourstep.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\io.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\memory.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\mpdecimal.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\numbertheory.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\sixstep.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_decimal\libmpdec\transpose.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\Modules\_decimal\libmpdec\vcdiv64.asm">
+ <Filter>Source Files</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj
new file mode 100644
index 0000000..7802ab3
--- /dev/null
+++ b/PCbuild/_elementtree.vcxproj
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{17E1E049-C309-4D79-843F-AE483C264AEA}</ProjectGuid>
+ <RootNamespace>_elementtree</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;USE_PYEXPAT_CAPI;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1D100000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\expat\ascii.h" />
+ <ClInclude Include="..\Modules\expat\asciitab.h" />
+ <ClInclude Include="..\Modules\expat\expat.h" />
+ <ClInclude Include="..\Modules\expat\expat_config.h" />
+ <ClInclude Include="..\Modules\expat\expat_external.h" />
+ <ClInclude Include="..\Modules\expat\iasciitab.h" />
+ <ClInclude Include="..\Modules\expat\internal.h" />
+ <ClInclude Include="..\Modules\expat\latin1tab.h" />
+ <ClInclude Include="..\Modules\expat\macconfig.h" />
+ <ClInclude Include="..\Modules\expat\nametab.h" />
+ <ClInclude Include="..\Modules\expat\pyexpatns.h" />
+ <ClInclude Include="..\Modules\expat\utf8tab.h" />
+ <ClInclude Include="..\Modules\expat\winconfig.h" />
+ <ClInclude Include="..\Modules\expat\xmlrole.h" />
+ <ClInclude Include="..\Modules\expat\xmltok.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_elementtree.c" />
+ <ClCompile Include="..\Modules\expat\xmlparse.c" />
+ <ClCompile Include="..\Modules\expat\xmlrole.c" />
+ <ClCompile Include="..\Modules\expat\xmltok.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_elementtree.vcxproj.filters b/PCbuild/_elementtree.vcxproj.filters
new file mode 100644
index 0000000..ee78295
--- /dev/null
+++ b/PCbuild/_elementtree.vcxproj.filters
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{643d8607-d024-40fe-8583-1823c96430f0}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{7b5335ad-059f-486f-85e4-f4757e26a9bf}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\expat\ascii.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\asciitab.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\expat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\expat_config.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\expat_external.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\iasciitab.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\internal.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\latin1tab.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\macconfig.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\nametab.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\pyexpatns.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\utf8tab.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\winconfig.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\xmlrole.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\xmltok.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_elementtree.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmlparse.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmlrole.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmltok.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj
new file mode 100644
index 0000000..55197af
--- /dev/null
+++ b/PCbuild/_freeze_importlib.vcxproj
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{19C0C13F-47CA-4432-AFF3-799A296A4DDC}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>_freeze_importlib</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ <PostBuildEvent>
+ <Command>$(TargetPath) ..\Lib\importlib\_bootstrap.py ..\Python\importlib.h</Command>
+ </PostBuildEvent>
+ <PostBuildEvent>
+ <Message>creating importlib.h</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ <PostBuildEvent>
+ <Command>$(TargetPath) ..\Lib\importlib\_bootstrap.py ..\Python\importlib.h</Command>
+ </PostBuildEvent>
+ <PostBuildEvent>
+ <Message>creating importlib.h</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ <PostBuildEvent>
+ <Command>$(TargetPath) ..\Lib\importlib\_bootstrap.py ..\Python\importlib.h</Command>
+ </PostBuildEvent>
+ <PostBuildEvent>
+ <Message>creating importlib.h</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ <PostBuildEvent>
+ <Command>$(TargetPath) ..\Lib\importlib\_bootstrap.py ..\Python\importlib.h</Command>
+ </PostBuildEvent>
+ <PostBuildEvent>
+ <Message>creating importlib.h</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_freeze_importlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <Private>true</Private>
+ <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
+ <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
+ <LinkLibraryDependencies>true</LinkLibraryDependencies>
+ <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\Lib\importlib\_bootstrap.py" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_freeze_importlib.vcxproj.filters b/PCbuild/_freeze_importlib.vcxproj.filters
new file mode 100644
index 0000000..50ec193
--- /dev/null
+++ b/PCbuild/_freeze_importlib.vcxproj.filters
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_freeze_importlib.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\Lib\importlib\_bootstrap.py">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj
new file mode 100644
index 0000000..52433ed
--- /dev/null
+++ b/PCbuild/_hashlib.vcxproj
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{447F05A8-F581-4CAC-A466-5AC7936E207E}</ProjectGuid>
+ <RootNamespace>_hashlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_hashopenssl.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="python.vcxproj">
+ <Project>{b11d750f-cd1f-4a96-85ce-e69a5c5259f9}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="ssl.vcxproj">
+ <Project>{e5b04cc0-eb4c-42ab-b4dc-18ef95f864b0}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_hashlib.vcxproj.filters b/PCbuild/_hashlib.vcxproj.filters
new file mode 100644
index 0000000..a9d993e
--- /dev/null
+++ b/PCbuild/_hashlib.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{cc45963d-bd25-4eb8-bdba-a5507090bca4}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_hashopenssl.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_lzma.vcxproj b/PCbuild/_lzma.vcxproj
new file mode 100644
index 0000000..ac25c80
--- /dev/null
+++ b/PCbuild/_lzma.vcxproj
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F9D71780-F393-11E0-BE50-0800200C9A66}</ProjectGuid>
+ <RootNamespace>lzma</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_i486\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_x86-64\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_i486\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_x86-64\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_i486\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_x86-64\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_i486\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(lzmaDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(lzmaDir)\bin_x86-64\liblzma.a;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_lzmamodule.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_lzma.vcxproj.filters b/PCbuild/_lzma.vcxproj.filters
new file mode 100644
index 0000000..0c5ed74
--- /dev/null
+++ b/PCbuild/_lzma.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{53e68eda-39fc-4336-a658-dc5f5d598760}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_lzmamodule.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_msi.vcxproj b/PCbuild/_msi.vcxproj
new file mode 100644
index 0000000..1323d16
--- /dev/null
+++ b/PCbuild/_msi.vcxproj
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{31FFC478-7B4A-43E8-9954-8D03E2187E9C}</ProjectGuid>
+ <RootNamespace>_msi</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>fci.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1D160000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\_msi.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_msi.vcxproj.filters b/PCbuild/_msi.vcxproj.filters
new file mode 100644
index 0000000..7dec52d
--- /dev/null
+++ b/PCbuild/_msi.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{bdef7710-e433-4ac0-84e0-14f34454bd3e}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\_msi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_multiprocessing.vcxproj b/PCbuild/_multiprocessing.vcxproj
new file mode 100644
index 0000000..b4bb568
--- /dev/null
+++ b/PCbuild/_multiprocessing.vcxproj
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{9E48B300-37D1-11DD-8C41-005056C00008}</ProjectGuid>
+ <RootNamespace>_multiprocessing</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_multiprocessing\multiprocessing.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_multiprocessing\multiprocessing.c" />
+ <ClCompile Include="..\Modules\_multiprocessing\semaphore.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_multiprocessing.vcxproj.filters b/PCbuild/_multiprocessing.vcxproj.filters
new file mode 100644
index 0000000..78133ec
--- /dev/null
+++ b/PCbuild/_multiprocessing.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{623c956c-1893-43d9-a7dc-96e4fef20f93}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{34615a62-f999-4659-83f5-19d17a644530}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_multiprocessing\multiprocessing.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_multiprocessing\multiprocessing.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_multiprocessing\semaphore.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj
new file mode 100644
index 0000000..63836e9
--- /dev/null
+++ b/PCbuild/_socket.vcxproj
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{86937F53-C189-40EF-8CE8-8759D8E7D480}</ProjectGuid>
+ <RootNamespace>_socket</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <BaseAddress>0x1e1D0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\socketmodule.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\socketmodule.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_socket.vcxproj.filters b/PCbuild/_socket.vcxproj.filters
new file mode 100644
index 0000000..790ffa8
--- /dev/null
+++ b/PCbuild/_socket.vcxproj.filters
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{1452207f-707c-4e84-b532-307193a0fd85}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{1edfe0d0-7b9d-4dc8-a335-b21fef7cc77a}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\socketmodule.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\socketmodule.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_sqlite3.vcxproj b/PCbuild/_sqlite3.vcxproj
new file mode 100644
index 0000000..392dad1
--- /dev/null
+++ b/PCbuild/_sqlite3.vcxproj
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{13CECB97-4119-4316-9D42-8534019A5A44}</ProjectGuid>
+ <RootNamespace>_sqlite3</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>MODULE_NAME="sqlite3";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <BaseAddress>0x1e180000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_sqlite\cache.h" />
+ <ClInclude Include="..\Modules\_sqlite\connection.h" />
+ <ClInclude Include="..\Modules\_sqlite\cursor.h" />
+ <ClInclude Include="..\Modules\_sqlite\microprotocols.h" />
+ <ClInclude Include="..\Modules\_sqlite\module.h" />
+ <ClInclude Include="..\Modules\_sqlite\prepare_protocol.h" />
+ <ClInclude Include="..\Modules\_sqlite\row.h" />
+ <ClInclude Include="..\Modules\_sqlite\sqlitecompat.h" />
+ <ClInclude Include="..\Modules\_sqlite\statement.h" />
+ <ClInclude Include="..\Modules\_sqlite\util.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_sqlite\cache.c" />
+ <ClCompile Include="..\Modules\_sqlite\connection.c" />
+ <ClCompile Include="..\Modules\_sqlite\cursor.c" />
+ <ClCompile Include="..\Modules\_sqlite\microprotocols.c" />
+ <ClCompile Include="..\Modules\_sqlite\module.c" />
+ <ClCompile Include="..\Modules\_sqlite\prepare_protocol.c" />
+ <ClCompile Include="..\Modules\_sqlite\row.c" />
+ <ClCompile Include="..\Modules\_sqlite\statement.c" />
+ <ClCompile Include="..\Modules\_sqlite\util.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="sqlite3.vcxproj">
+ <Project>{a1a295e5-463c-437f-81ca-1f32367685da}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_sqlite3.vcxproj.filters b/PCbuild/_sqlite3.vcxproj.filters
new file mode 100644
index 0000000..88e5fdb
--- /dev/null
+++ b/PCbuild/_sqlite3.vcxproj.filters
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{dac8ab3b-ce16-4bef-bef9-76463a01f5c4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{814b187d-44ad-4f2b-baa7-18ca8a8a6a77}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\_sqlite\cache.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\connection.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\cursor.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\microprotocols.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\module.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\prepare_protocol.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\row.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\sqlitecompat.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\statement.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_sqlite\util.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_sqlite\cache.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\connection.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\cursor.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\microprotocols.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\module.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\prepare_protocol.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\row.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\statement.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sqlite\util.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_ssl.vcxproj b/PCbuild/_ssl.vcxproj
new file mode 100644
index 0000000..ae71d19
--- /dev/null
+++ b/PCbuild/_ssl.vcxproj
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C6E20F84-3247-4AD6-B051-B073268F73BA}</ProjectGuid>
+ <RootNamespace>_ssl</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out32\libeay32.lib;$(opensslDir)\out32\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(opensslDir)\inc64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <PreLinkEvent>
+ <Command>
+ </Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;$(opensslDir)\out64\libeay32.lib;$(opensslDir)\out64\ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ssl.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="python.vcxproj">
+ <Project>{b11d750f-cd1f-4a96-85ce-e69a5c5259f9}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="ssl.vcxproj">
+ <Project>{e5b04cc0-eb4c-42ab-b4dc-18ef95f864b0}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="_socket.vcxproj">
+ <Project>{86937f53-c189-40ef-8ce8-8759d8e7d480}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_ssl.vcxproj.filters b/PCbuild/_ssl.vcxproj.filters
new file mode 100644
index 0000000..78b1459
--- /dev/null
+++ b/PCbuild/_ssl.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{695348f7-e9f6-4fe1-bc03-5f08ffc8095b}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_ssl.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_testbuffer.vcxproj b/PCbuild/_testbuffer.vcxproj
new file mode 100644
index 0000000..e1265f6
--- /dev/null
+++ b/PCbuild/_testbuffer.vcxproj
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{A2697BD3-28C1-4AEC-9106-8B748639FD16}</ProjectGuid>
+ <RootNamespace>_testbuffer</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_testbuffer.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_testbuffer.vcxproj.filters b/PCbuild/_testbuffer.vcxproj.filters
new file mode 100644
index 0000000..eadf282
--- /dev/null
+++ b/PCbuild/_testbuffer.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{8d232240-921a-4bc2-87c3-93ffd3462f0a}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_testbuffer.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj
new file mode 100644
index 0000000..e99a7e4
--- /dev/null
+++ b/PCbuild/_testcapi.vcxproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}</ProjectGuid>
+ <RootNamespace>_testcapi</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1e1F0000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_testcapimodule.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters
new file mode 100644
index 0000000..7a6ad1a
--- /dev/null
+++ b/PCbuild/_testcapi.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{a76a90d8-8e8b-4c36-8f58-8bd46abe9f5e}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_testcapimodule.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj
new file mode 100644
index 0000000..67f72fe
--- /dev/null
+++ b/PCbuild/_tkinter.vcxproj
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}</ProjectGuid>
+ <RootNamespace>_tkinter</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltkDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltkLibDebug);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltk64Dir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltk64LibDebug);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltkDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltkLib);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltk64Dir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltk64Lib);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltkDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltkLib);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltk64Dir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltk64Lib);%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltkDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltkLib);%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(tcltk64Dir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WITH_APPINIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>$(tcltk64Lib);%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_tkinter.c" />
+ <ClCompile Include="..\Modules\tkappinit.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/_tkinter.vcxproj.filters b/PCbuild/_tkinter.vcxproj.filters
new file mode 100644
index 0000000..4e5cd47
--- /dev/null
+++ b/PCbuild/_tkinter.vcxproj.filters
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{b9ce64dd-cb95-472d-bbe8-5583b2cd375b}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_tkinter.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\tkappinit.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/bdist_wininst.vcxproj b/PCbuild/bdist_wininst.vcxproj
new file mode 100644
index 0000000..49276a2
--- /dev/null
+++ b/PCbuild/bdist_wininst.vcxproj
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}</ProjectGuid>
+ <RootNamespace>wininst</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\lib\distutils\command\</OutDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\lib\distutils\command\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(PlatformName)-temp-$(Configuration)\$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.exe</TargetExt>
+ <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.exe</TargetExt>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\..\lib\distutils\command\wininst.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\PC\bdist_wininst;..\Include;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0000</Culture>
+ <AdditionalIncludeDirectories>..\PC;..\PC\bdist_wininst;..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;imagehlp.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\lib\distutils\command\wininst-10.0.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreSpecificDefaultLibraries>LIBC;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>..\lib\distutils\command\wininst-10.0.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\..\lib\distutils\command\wininst.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\PC\bdist_wininst;..\Include;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0000</Culture>
+ <AdditionalIncludeDirectories>..\PC;..\PC\bdist_wininst;..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;imagehlp.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>..\lib\distutils\command\wininst-10.0-amd64.exe</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreSpecificDefaultLibraries>LIBC;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <ProgramDatabaseFile>..\lib\distutils\command\wininst-9.0-amd64.pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\bdist_wininst\extract.c" />
+ <ClCompile Include="..\PC\bdist_wininst\install.c" />
+ <ClCompile Include="..\Modules\zlib\adler32.c" />
+ <ClCompile Include="..\Modules\zlib\crc32.c" />
+ <ClCompile Include="..\Modules\zlib\inffast.c" />
+ <ClCompile Include="..\Modules\zlib\inflate.c" />
+ <ClCompile Include="..\Modules\zlib\inftrees.c" />
+ <ClCompile Include="..\Modules\zlib\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\PC\bdist_wininst\archive.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\bdist_wininst\install.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\bdist_wininst\PythonPowered.bmp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/bdist_wininst.vcxproj.filters b/PCbuild/bdist_wininst.vcxproj.filters
new file mode 100644
index 0000000..b4b6a4d
--- /dev/null
+++ b/PCbuild/bdist_wininst.vcxproj.filters
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{293b1092-03ad-4b7c-acb9-c4ab62e52f55}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Source Files\zlib">
+ <UniqueIdentifier>{0edc0406-282f-4dbc-b60e-a867c34a2a31}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{ea0c0f0e-3b73-474e-a999-e9689d032ccc}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{0c77c1cf-3f87-4f87-bd86-b425211c2181}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\bdist_wininst\extract.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\bdist_wininst\install.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\adler32.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\crc32.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inffast.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inflate.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inftrees.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\zutil.c">
+ <Filter>Source Files\zlib</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\PC\bdist_wininst\archive.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\bdist_wininst\install.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\bdist_wininst\PythonPowered.bmp">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/build.bat b/PCbuild/build.bat
index a73560e..fa0d95b 100644
--- a/PCbuild/build.bat
+++ b/PCbuild/build.bat
@@ -5,14 +5,15 @@ rem just for convenience.
setlocal
set platf=Win32
set conf=Release
-set build=
+set target=build
+set dir=%~dp0
:CheckOpts
if "%1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts
if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts
-if "%1"=="-r" (set build=/rebuild) & shift & goto CheckOpts
+if "%1"=="-r" (set target=rebuild) & shift & goto CheckOpts
if "%1"=="-d" (set conf=Debug) & shift & goto CheckOpts
-set cmd=vcbuild /useenv pcbuild.sln %build% "%conf%|%platf%"
+set cmd=msbuild /p:useenv=true %dir%pcbuild.sln /t:%target% /p:Configuration=%conf% /p:Platform=%platf%
echo %cmd%
%cmd%
diff --git a/PCbuild/build_ssl.bat b/PCbuild/build_ssl.bat
index cee64a8..357b08b 100644
--- a/PCbuild/build_ssl.bat
+++ b/PCbuild/build_ssl.bat
@@ -2,10 +2,10 @@
if not defined HOST_PYTHON (
if %1 EQU Debug (
set HOST_PYTHON=python_d.exe
- if not exist python31_d.dll exit 1
+ if not exist python33_d.dll exit 1
) ELSE (
set HOST_PYTHON=python.exe
- if not exist python31.dll exit 1
+ if not exist python33.dll exit 1
)
)
%HOST_PYTHON% build_ssl.py %1 %2 %3
diff --git a/PCbuild/build_ssl.py b/PCbuild/build_ssl.py
index 9388124..5a7a89e 100644
--- a/PCbuild/build_ssl.py
+++ b/PCbuild/build_ssl.py
@@ -65,9 +65,9 @@ def find_working_perl(perls):
# Fetch SSL directory from VC properties
def get_ssl_dir():
- propfile = (os.path.join(os.path.dirname(__file__), 'pyproject.vsprops'))
+ propfile = (os.path.join(os.path.dirname(__file__), 'pyproject.props'))
with open(propfile) as f:
- m = re.search('openssl-([^"]+)"', f.read())
+ m = re.search('openssl-([^<]+)<', f.read())
return "..\..\openssl-"+m.group(1)
@@ -228,9 +228,9 @@ def main():
# Now run make.
if arch == "amd64":
- rc = os.system("ml64 -c -Foms\\uptable.obj ms\\uptable.asm")
+ rc = os.system("nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm")
if rc:
- print("ml64 assembler has failed.")
+ print("nasm assembler has failed.")
sys.exit(rc)
copy(r"crypto\buildinf_%s.h" % arch, r"crypto\buildinf.h")
diff --git a/PCbuild/build_tkinter.py b/PCbuild/build_tkinter.py
index eb1d092..4196cf3 100644
--- a/PCbuild/build_tkinter.py
+++ b/PCbuild/build_tkinter.py
@@ -11,8 +11,8 @@ import sys
here = os.path.abspath(os.path.dirname(__file__))
par = os.path.pardir
-TCL = "tcl8.5.9"
-TK = "tk8.5.9"
+TCL = "tcl8.5.11"
+TK = "tk8.5.11"
TIX = "tix-8.4.3.x"
ROOT = os.path.abspath(os.path.join(here, par, par))
@@ -32,7 +32,7 @@ def nmake(makefile, command="", **kw):
def build(platform, clean):
if platform == "Win32":
dest = os.path.join(ROOT, "tcltk")
- machine = "X86"
+ machine = "IX86"
elif platform == "AMD64":
dest = os.path.join(ROOT, "tcltk64")
machine = "AMD64"
diff --git a/PCbuild/debug.props b/PCbuild/debug.props
new file mode 100644
index 0000000..9b7a65a
--- /dev/null
+++ b/PCbuild/debug.props
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="UserMacros">
+ <PyDebugExt>_d</PyDebugExt>
+ <KillPythonExe>$(OutDir)kill_python_d.exe</KillPythonExe>
+ </PropertyGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <TargetName>$(ProjectName)_d</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <BuildMacro Include="PyDebugExt">
+ <Value>$(PyDebugExt)</Value>
+ </BuildMacro>
+ <BuildMacro Include="KillPythonExe">
+ <Value>$(KillPythonExe)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/env.bat b/PCbuild/env.bat
index 638b16c..08dc8ef 100644
--- a/PCbuild/env.bat
+++ b/PCbuild/env.bat
@@ -1,5 +1,9 @@
@echo off
-set VS9=%ProgramFiles%\Microsoft Visual Studio 9.0
+set VS10=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0
+IF EXIST "%VS10%" GOTO ok
+set VS10=%ProgramFiles%\Microsoft Visual Studio 10.0
+:ok
+
echo Build environments: x86, ia64, amd64, x86_amd64, x86_ia64
echo.
-call "%VS9%\VC\vcvarsall.bat" %1
+call "%VS10%\VC\vcvarsall.bat" %1
diff --git a/PCbuild/kill_python.c b/PCbuild/kill_python.c
index 6b91678..bb323d3 100644
--- a/PCbuild/kill_python.c
+++ b/PCbuild/kill_python.c
@@ -106,7 +106,7 @@ main(int argc, char **argv)
/*
* XXX TODO: if we really wanted to be fancy, we could check the
* modules for all processes (not just the python[_d].exe ones)
- * and see if any of our DLLs are loaded (i.e. python32[_d].dll),
+ * and see if any of our DLLs are loaded (i.e. python33[_d].dll),
* as that would also inhibit our ability to rebuild the solution.
* Not worth loosing sleep over though; for now, a simple check
* for just the python executable should be sufficient.
diff --git a/PCbuild/kill_python.vcxproj b/PCbuild/kill_python.vcxproj
new file mode 100644
index 0000000..9f67c40
--- /dev/null
+++ b/PCbuild/kill_python.vcxproj
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}</ProjectGuid>
+ <RootNamespace>kill_python</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName)_d.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName)_d.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="kill_python.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/kill_python.vcxproj.filters b/PCbuild/kill_python.vcxproj.filters
new file mode 100644
index 0000000..433d751
--- /dev/null
+++ b/PCbuild/kill_python.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{48606591-c8b6-41a5-95c5-9a0890c5504f}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="kill_python.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/make_buildinfo.c b/PCbuild/make_buildinfo.c
index fd3a2e2..f9aadee 100644
--- a/PCbuild/make_buildinfo.c
+++ b/PCbuild/make_buildinfo.c
@@ -2,6 +2,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
+#include <io.h>
#define CMD_SIZE 500
@@ -61,6 +62,51 @@ int make_buildinfo2(const char *tmppath)
return 1;
}
+const char DELIMS[] = { " \n" };
+
+int get_mercurial_info(char * hgbranch, char * hgtag, char * hgrev, int size)
+{
+ int result = 0;
+ char filename[CMD_SIZE];
+ char cmdline[CMD_SIZE];
+
+ strcpy_s(filename, CMD_SIZE, "tmpXXXXXX");
+ if (_mktemp_s(filename, CMD_SIZE) == 0) {
+ int rc;
+
+ strcpy_s(cmdline, CMD_SIZE, "hg id -bit > ");
+ strcat_s(cmdline, CMD_SIZE, filename);
+ rc = system(cmdline);
+ if (rc == 0) {
+ FILE * fp;
+
+ if (fopen_s(&fp, filename, "r") == 0) {
+ char * cp = fgets(cmdline, CMD_SIZE, fp);
+
+ if (cp) {
+ char * context = NULL;
+ char * tp = strtok_s(cp, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgrev, size, tp);
+ tp = strtok_s(NULL, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgbranch, size, tp);
+ tp = strtok_s(NULL, DELIMS, &context);
+ if (tp) {
+ strcpy_s(hgtag, size, tp);
+ result = 1;
+ }
+ }
+ }
+ }
+ fclose(fp);
+ }
+ }
+ _unlink(filename);
+ }
+ return result;
+}
+
int main(int argc, char*argv[])
{
char command[CMD_SIZE] = "cl.exe -c -D_WIN32 -DUSE_DL_EXPORT -D_WINDOWS -DWIN32 -D_WINDLL ";
@@ -109,8 +155,27 @@ int main(int argc, char*argv[])
strcat_s(command, CMD_SIZE, "\"");
strcat_s(command, CMD_SIZE, tmppath);
strcat_s(command, CMD_SIZE, "getbuildinfo2.c\" -DSUBWCREV ");
- } else
+ }
+ else {
+ char hgtag[CMD_SIZE];
+ char hgbranch[CMD_SIZE];
+ char hgrev[CMD_SIZE];
+
+ if (get_mercurial_info(hgbranch, hgtag, hgrev, CMD_SIZE)) {
+ strcat_s(command, CMD_SIZE, "-DHGBRANCH=\\\"");
+ strcat_s(command, CMD_SIZE, hgbranch);
+ strcat_s(command, CMD_SIZE, "\\\"");
+
+ strcat_s(command, CMD_SIZE, " -DHGTAG=\\\"");
+ strcat_s(command, CMD_SIZE, hgtag);
+ strcat_s(command, CMD_SIZE, "\\\"");
+
+ strcat_s(command, CMD_SIZE, " -DHGVERSION=\\\"");
+ strcat_s(command, CMD_SIZE, hgrev);
+ strcat_s(command, CMD_SIZE, "\\\" ");
+ }
strcat_s(command, CMD_SIZE, "..\\Modules\\getbuildinfo.c");
+ }
strcat_s(command, CMD_SIZE, " -Fo\"");
strcat_s(command, CMD_SIZE, tmppath);
strcat_s(command, CMD_SIZE, "getbuildinfo.o\" -I..\\Include -I..\\PC");
diff --git a/PCbuild/make_buildinfo.vcxproj b/PCbuild/make_buildinfo.vcxproj
new file mode 100644
index 0000000..eee7f91
--- /dev/null
+++ b/PCbuild/make_buildinfo.vcxproj
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C73F0EC1-358B-4177-940F-0846AC8B04CD}</ProjectGuid>
+ <RootNamespace>make_buildinfo</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)make_buildinfo.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="make_buildinfo.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/make_buildinfo.vcxproj.filters b/PCbuild/make_buildinfo.vcxproj.filters
new file mode 100644
index 0000000..2227f8c
--- /dev/null
+++ b/PCbuild/make_buildinfo.vcxproj.filters
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="make_buildinfo.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/make_versioninfo.vcxproj b/PCbuild/make_versioninfo.vcxproj
new file mode 100644
index 0000000..9cf507b
--- /dev/null
+++ b/PCbuild/make_versioninfo.vcxproj
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F0E0541E-F17D-430B-97C4-93ADF0DD284E}</ProjectGuid>
+ <RootNamespace>make_versioninfo</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <CustomBuildStep>
+ <Message>Build PC/pythonnt_rc(_d).h</Message>
+ <Command>cd $(SolutionDir)
+make_versioninfo.exe &gt; ..\PC\pythonnt_rc.h
+</Command>
+ <Outputs>$(SolutionDir)..\PC\pythonnt_rc.h;%(Outputs)</Outputs>
+ <Inputs>$(SolutionDir)make_versioninfo.exe</Inputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(SolutionDir)make_versioninfo.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ <PostBuildEvent />
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <CustomBuildStep>
+ <Message>Build PC/pythonnt_rc(_d).h</Message>
+ <Command>cd $(SolutionDir)
+make_versioninfo.exe &gt; ..\PC\pythonnt_rc.h
+</Command>
+ <Outputs>$(SolutionDir)..\PC\pythonnt_rc.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(SolutionDir)make_versioninfo.exe</OutputFile>
+ </Link>
+ <PostBuildEvent>
+ <Command>cd $(SolutionDir)
+make_versioninfo.exe &gt; ..\PC\python_nt.h
+</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <CustomBuildStep>
+ <Message>Build PC/pythonnt_rc(_d).h</Message>
+ <Command>cd $(SolutionDir)
+make_versioninfo_d.exe &gt; ..\PC\pythonnt_rc_d.h
+</Command>
+ <Outputs>$(SolutionDir)..\PC\pythonnt_rc_d.h;%(Outputs)</Outputs>
+ <Inputs>$(SolutionDir)make_versioninfo_d.exe</Inputs>
+ </CustomBuildStep>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(SolutionDir)make_versioninfo_d.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <CustomBuildStep>
+ <Message>Build PC/pythonnt_rc(_d).h</Message>
+ <Command>cd $(SolutionDir)
+make_versioninfo_d.exe &gt; ..\PC\pythonnt_rc_d.h
+</Command>
+ <Outputs>$(SolutionDir)..\PC\pythonnt_rc_d.h;%(Outputs)</Outputs>
+ </CustomBuildStep>
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(SolutionDir)make_versioninfo_d.exe</OutputFile>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PostBuildEvent>
+ <Command>cd $(SolutionDir)
+make_versioninfo_d.exe &gt; ..\PC\python_nt_d.h
+</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\make_versioninfo.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/make_versioninfo.vcxproj.filters b/PCbuild/make_versioninfo.vcxproj.filters
new file mode 100644
index 0000000..96c0434
--- /dev/null
+++ b/PCbuild/make_versioninfo.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{e4180954-c3a5-4749-b9a4-31b804ee4fa8}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\make_versioninfo.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln
index 1de4ea1..d6a022f 100644
--- a/PCbuild/pcbuild.sln
+++ b/PCbuild/pcbuild.sln
@@ -1,141 +1,78 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058} = {E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}"
+ ProjectSection(SolutionItems) = preProject
+ ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c
+ readme.txt = readme.txt
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_versioninfo", "make_versioninfo.vcproj", "{F0E0541E-F17D-430B-97C4-93ADF0DD284E}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcxproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
- ProjectSection(ProjectDependencies) = postProject
- {F0E0541E-F17D-430B-97C4-93ADF0DD284E} = {F0E0541E-F17D-430B-97C4-93ADF0DD284E}
- {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
- {C73F0EC1-358B-4177-940F-0846AC8B04CD} = {C73F0EC1-358B-4177-940F-0846AC8B04CD}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_versioninfo", "make_versioninfo.vcxproj", "{F0E0541E-F17D-430B-97C4-93ADF0DD284E}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcxproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w9xpopen", "w9xpopen.vcproj", "{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
- ProjectSection(ProjectDependencies) = postProject
- {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcxproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_buildinfo", "make_buildinfo.vcproj", "{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w9xpopen", "w9xpopen.vcxproj", "{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}"
- ProjectSection(SolutionItems) = preProject
- ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c
- readme.txt = readme.txt
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_buildinfo", "make_buildinfo.vcxproj", "{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcxproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcproj", "{0E9791DB-593A-465F-98BC-681011311618}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_decimal", "_decimal.vcxproj", "{0E9791DB-593A-465F-98BC-681011311617}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcproj", "{9EC7190A-249F-4180-A900-548FDCF3055F}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcxproj", "{0E9791DB-593A-465F-98BC-681011311618}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcproj", "{17E1E049-C309-4D79-843F-AE483C264AEA}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcxproj", "{9EC7190A-249F-4180-A900-548FDCF3055F}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcproj", "{31FFC478-7B4A-43E8-9954-8D03E2187E9C}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcxproj", "{17E1E049-C309-4D79-843F-AE483C264AEA}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcxproj", "{31FFC478-7B4A-43E8-9954-8D03E2187E9C}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcproj", "{13CECB97-4119-4316-9D42-8534019A5A44}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- {A1A295E5-463C-437F-81CA-1F32367685DA} = {A1A295E5-463C-437F-81CA-1F32367685DA}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcxproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}"
- ProjectSection(ProjectDependencies) = postProject
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
- {86937F53-C189-40EF-8CE8-8759D8E7D480} = {86937F53-C189-40EF-8CE8-8759D8E7D480}
- {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0} = {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcxproj", "{13CECB97-4119-4316-9D42-8534019A5A44}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcxproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bz2", "bz2.vcproj", "{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcxproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcproj", "{18CAE28C-B454-46C1-87A0-493D91D97F03}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bz2", "_bz2.vcxproj", "{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcproj", "{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcxproj", "{18CAE28C-B454-46C1-87A0-493D91D97F03}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcproj", "{D06B6426-4762-44CC-8BAD-D79052507F2F}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_lzma", "_lzma.vcxproj", "{F9D71780-F393-11E0-BE50-0800200C9A66}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bdist_wininst", "bdist_wininst.vcproj", "{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcxproj", "{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}"
- ProjectSection(ProjectDependencies) = postProject
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
- {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0} = {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcxproj", "{D06B6426-4762-44CC-8BAD-D79052507F2F}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
- ProjectSection(ProjectDependencies) = postProject
- {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bdist_wininst", "bdist_wininst.vcxproj", "{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcproj", "{9E48B300-37D1-11DD-8C41-005056C00008}"
- ProjectSection(ProjectDependencies) = postProject
- {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcxproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssl", "ssl.vcproj", "{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}"
- ProjectSection(ProjectDependencies) = postProject
- {B11D750F-CD1F-4A96-85CE-E69A5C5259F9} = {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcxproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcxproj", "{9E48B300-37D1-11DD-8C41-005056C00008}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssl", "ssl.vcxproj", "{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kill_python", "kill_python.vcxproj", "{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcxproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxlimited", "xxlimited.vcxproj", "{F749B822-B489-4CA5-A3AD-CE078F5F338A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testbuffer", "_testbuffer.vcxproj", "{A2697BD3-28C1-4AEC-9106-8B748639FD16}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kill_python", "kill_python.vcproj", "{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pylauncher", "pylauncher.vcxproj", "{7B2727B5-5A3F-40EE-A866-43A13CD31446}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pywlauncher", "pywlauncher.vcxproj", "{1D4B18D3-7C12-4ECB-9179-8531FF876CE6}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxlimited", "xxlimited.vcproj", "{F749B822-B489-4CA5-A3AD-CE078F5F338A}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_freeze_importlib", "_freeze_importlib.vcxproj", "{19C0C13F-47CA-4432-AFF3-799A296A4DDC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -261,6 +198,22 @@ Global
{28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.Build.0 = Release|Win32
{28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.ActiveCfg = Release|x64
{28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.Build.0 = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.Build.0 = Debug|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.ActiveCfg = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.Build.0 = Debug|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.ActiveCfg = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.Build.0 = Release|Win32
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64
+ {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64
{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32
{0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32
{0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64
@@ -437,6 +390,22 @@ Global
{18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.Build.0 = Release|Win32
{18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.ActiveCfg = Release|x64
{18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.Build.0 = Release|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.Build.0 = Debug|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.Build.0 = Release|Win32
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.ActiveCfg = Release|x64
+ {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.Build.0 = Release|x64
{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.ActiveCfg = Debug|Win32
{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.Build.0 = Debug|Win32
{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.ActiveCfg = Debug|x64
@@ -558,36 +527,90 @@ Global
{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.ActiveCfg = Release|x64
{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.Build.0 = Release|x64
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.ActiveCfg = PGInstrument|Win32
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = Debug|x64
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = Debug|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = PGUpdate|x64
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = Release|x64
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = Release|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = PGInstrument|x64
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = Release|x64
- {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = Release|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = PGUpdate|x64
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.ActiveCfg = Release|Win32
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.Build.0 = Release|Win32
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.ActiveCfg = Release|x64
{885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.Build.0 = Release|x64
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Debug|Win32
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.Build.0 = Debug|Win32
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Debug|x64
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.Build.0 = Debug|x64
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = Release|Win32
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = Release|Win32
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = Release|x64
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = Release|x64
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = Release|Win32
- {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Release|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Release|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.Build.0 = Release|x64
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.ActiveCfg = Release|Win32
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.Build.0 = Release|Win32
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.ActiveCfg = Release|x64
{F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.Build.0 = Release|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.Build.0 = Debug|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.ActiveCfg = Debug|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.Build.0 = Debug|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.ActiveCfg = PGInstrument|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.Build.0 = PGInstrument|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.ActiveCfg = PGUpdate|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.Build.0 = PGUpdate|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.ActiveCfg = Release|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.Build.0 = Release|Win32
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.ActiveCfg = Release|x64
+ {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.Build.0 = Release|x64
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.Build.0 = Debug|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.ActiveCfg = Debug|x64
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.Build.0 = Debug|x64
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.ActiveCfg = PGInstrument|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.Build.0 = PGInstrument|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.ActiveCfg = PGUpdate|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.Build.0 = PGUpdate|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.ActiveCfg = Release|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.Build.0 = Release|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.ActiveCfg = Release|Win32
+ {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.Build.0 = Release|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.Build.0 = Debug|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.ActiveCfg = Debug|x64
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.Build.0 = Debug|x64
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.Build.0 = PGInstrument|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.ActiveCfg = PGInstrument|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.Build.0 = PGInstrument|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.Build.0 = PGUpdate|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.ActiveCfg = PGUpdate|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.Build.0 = PGUpdate|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.ActiveCfg = Release|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|Win32
+ {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.ActiveCfg = Debug|x64
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.ActiveCfg = Release|Win32
+ {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/PCbuild/pginstrument.props b/PCbuild/pginstrument.props
new file mode 100644
index 0000000..5584995
--- /dev/null
+++ b/PCbuild/pginstrument.props
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="UserMacros">
+ <OutDirPGI>$(SolutionDir)$(Platform)-pgi\</OutDirPGI>
+ </PropertyGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir>$(OutDirPGI)\</OutDir>
+ <IntDir>$(SolutionDir)$(PlatformName)-temp-pgi\$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ </ClCompile>
+ <Link>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>PGInstrument</LinkTimeCodeGeneration>
+ <ProfileGuidedDatabase>$(SolutionDir)$(Platform)-pgi\$(TargetName).pgd</ProfileGuidedDatabase>
+ <ImportLibrary>$(OutDirPGI)\$(TargetName).lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <BuildMacro Include="OutDirPGI">
+ <Value>$(OutDirPGI)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project>
diff --git a/PCbuild/pgupdate.props b/PCbuild/pgupdate.props
new file mode 100644
index 0000000..d775a02
--- /dev/null
+++ b/PCbuild/pgupdate.props
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(SolutionDir)\pginstrument.props" />
+ </ImportGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir>$(SolutionDir)$(PlatformName)-pgo\</OutDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <Link>
+ <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <LinkTimeCodeGeneration>PGUpdate</LinkTimeCodeGeneration>
+ <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pyd.props b/PCbuild/pyd.props
new file mode 100644
index 0000000..469966e
--- /dev/null
+++ b/PCbuild/pyd.props
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets">
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <GenerateManifest>false</GenerateManifest>
+ <EmbedManifest>false</EmbedManifest>
+ <TargetExt>.pyd</TargetExt>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <PreprocessorDefinitions>Py_BUILD_CORE_MODULE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ </Link>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pyd_d.props b/PCbuild/pyd_d.props
new file mode 100644
index 0000000..b023288
--- /dev/null
+++ b/PCbuild/pyd_d.props
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets">
+ <Import Project="debug.props" />
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <LinkIncremental>false</LinkIncremental>
+ <GenerateManifest>false</GenerateManifest>
+ <EmbedManifest>false</EmbedManifest>
+ <TargetExt>.pyd</TargetExt>
+ <TargetName>$(ProjectName)_d</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <PreprocessorDefinitions>Py_BUILD_CORE_MODULE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ </ClCompile>
+ <Link />
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup />
+</Project> \ No newline at end of file
diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj
new file mode 100644
index 0000000..974fd3d
--- /dev/null
+++ b/PCbuild/pyexpat.vcxproj
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{D06B6426-4762-44CC-8BAD-D79052507F2F}</ProjectGuid>
+ <RootNamespace>pyexpat</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>.\..\Modules\expat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_NS;XML_DTD;BYTEORDER=1234;XML_CONTEXT_BYTES=1024;XML_STATIC;HAVE_MEMMOVE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\expat\xmlrole.h" />
+ <ClInclude Include="..\Modules\expat\xmltok.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\pyexpat.c" />
+ <ClCompile Include="..\Modules\expat\xmlparse.c" />
+ <ClCompile Include="..\Modules\expat\xmlrole.c" />
+ <ClCompile Include="..\Modules\expat\xmltok.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pyexpat.vcxproj.filters b/PCbuild/pyexpat.vcxproj.filters
new file mode 100644
index 0000000..abf362f
--- /dev/null
+++ b/PCbuild/pyexpat.vcxproj.filters
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{ddae77a6-7ca0-4a1b-b71c-deea5f4025de}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{5af9d40c-fc46-4640-ad84-3d1dd34a71d7}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\expat\xmlrole.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\expat\xmltok.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\pyexpat.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmlparse.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmlrole.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\expat\xmltok.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pylauncher.vcxproj b/PCbuild/pylauncher.vcxproj
new file mode 100644
index 0000000..9fa93dd
--- /dev/null
+++ b/PCbuild/pylauncher.vcxproj
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{7B2727B5-5A3F-40EE-A866-43A13CD31446}</ProjectGuid>
+ <RootNamespace>pylauncher</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>py_d</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>py_d</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <TargetName>py</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <SubSystem>Console</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <SubSystem>Console</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\launcher.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\launcher.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\pylauncher.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="make_versioninfo.vcxproj">
+ <Project>{f0e0541e-f17d-430b-97c4-93adf0dd284e}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/PCbuild/pylauncher.vcxproj.filters b/PCbuild/pylauncher.vcxproj.filters
new file mode 100644
index 0000000..e4b23d2
--- /dev/null
+++ b/PCbuild/pylauncher.vcxproj.filters
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\launcher.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\launcher.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\pylauncher.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props
new file mode 100644
index 0000000..4afbe3c
--- /dev/null
+++ b/PCbuild/pyproject.props
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Condition="'$(Platform)'=='Win32'">
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir>$(SolutionDir)</OutDir>
+ <IntDir>$(SolutionDir)$(PlatformName)-temp-$(Configuration)\$(ProjectName)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Platform)'=='x64'">
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <_PropertySheetDisplayName>amd64</_PropertySheetDisplayName>
+ <OutDir>$(SolutionDir)amd64\</OutDir>
+ <IntDir>$(SolutionDir)$(PlatformName)-temp-$(Configuration)\$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Label="UserMacros">
+ <PyDllName>python33$(PyDebugExt)</PyDllName>
+ <PythonExe>$(OutDir)python$(PyDebugExt).exe</PythonExe>
+ <KillPythonExe>$(OutDir)kill_python$(PyDebugExt).exe</KillPythonExe>
+ <externalsDir>..\..</externalsDir>
+ <sqlite3Dir>$(externalsDir)\sqlite-3.7.12</sqlite3Dir>
+ <bz2Dir>$(externalsDir)\bzip2-1.0.6</bz2Dir>
+ <lzmaDir>$(externalsDir)\xz-5.0.3</lzmaDir>
+ <opensslDir>$(externalsDir)\openssl-1.0.1c</opensslDir>
+ <tcltkDir>$(externalsDir)\tcltk</tcltkDir>
+ <tcltk64Dir>$(externalsDir)\tcltk64</tcltk64Dir>
+ <tcltkLib>$(tcltkDir)\lib\tcl85.lib;$(tcltkDir)\lib\tk85.lib</tcltkLib>
+ <tcltkLibDebug>$(tcltkDir)\lib\tcl85g.lib;$(tcltkDir)\lib\tk85g.lib</tcltkLibDebug>
+ <tcltk64Lib>$(tcltk64Dir)\lib\tcl85.lib;$(tcltk64Dir)\lib\tk85.lib</tcltk64Lib>
+ <tcltk64LibDebug>$(tcltk64Dir)\lib\tcl85g.lib;$(tcltk64Dir)\lib\tk85g.lib</tcltk64LibDebug>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\Include; ..\PC;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <Link>
+ <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>..\PC;..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <BuildMacro Include="PyDllName">
+ <Value>$(PyDllName)</Value>
+ </BuildMacro>
+ <BuildMacro Include="PythonExe">
+ <Value>$(PythonExe)</Value>
+ </BuildMacro>
+ <BuildMacro Include="KillPythonExe">
+ <Value>$(KillPythonExe)</Value>
+ </BuildMacro>
+ <BuildMacro Include="externalsDir">
+ <Value>$(externalsDir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="sqlite3Dir">
+ <Value>$(sqlite3Dir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="bz2Dir">
+ <Value>$(bz2Dir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="lzmaDir">
+ <Value>$(lzmaDir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="opensslDir">
+ <Value>$(opensslDir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltkDir">
+ <Value>$(tcltkDir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltk64Dir">
+ <Value>$(tcltk64Dir)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltkLib">
+ <Value>$(tcltkLib)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltkLibDebug">
+ <Value>$(tcltkLibDebug)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltk64Lib">
+ <Value>$(tcltk64Lib)</Value>
+ </BuildMacro>
+ <BuildMacro Include="tcltk64LibDebug">
+ <Value>$(tcltk64LibDebug)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project>
diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj
new file mode 100644
index 0000000..d0a9de0
--- /dev/null
+++ b/PCbuild/python.vcxproj
@@ -0,0 +1,368 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python_d.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python_d.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2100000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)python.exe</OutputFile>
+ <SubSystem>Console</SubSystem>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <None Include="..\PC\pycon.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_exe.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\python.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="w9xpopen.vcxproj">
+ <Project>{e9e0a1f6-0009-4e8c-b8f8-1b8f5d49a058}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/python.vcxproj.filters b/PCbuild/python.vcxproj.filters
new file mode 100644
index 0000000..e4906a4
--- /dev/null
+++ b/PCbuild/python.vcxproj.filters
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{2d690795-de83-4a33-8235-3c5dafe45efa}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{8b010a19-5b29-45f1-a8a0-f672e2bbb11a}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\pycon.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_exe.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\python.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/python3dll.vcxproj b/PCbuild/python3dll.vcxproj
new file mode 100644
index 0000000..b3459b5
--- /dev/null
+++ b/PCbuild/python3dll.vcxproj
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{885D4898-D08D-4091-9C40-C700CFE3FC5A}</ProjectGuid>
+ <RootNamespace>python3dll</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x86 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir)</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) rebuild</NMakeReBuildCommandLine>
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">cd $(ProjectDir)\..\PC
+nmake /f python3.mak MACHINE=x64 OutDir=$(OutDir) clean</NMakeCleanCommandLine>
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(OutDir)python3.dll</NMakeOutput>
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <None Include="..\PC\python3.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\python3dll.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_nt.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/python3dll.vcxproj.filters b/PCbuild/python3dll.vcxproj.filters
new file mode 100644
index 0000000..d250c45
--- /dev/null
+++ b/PCbuild/python3dll.vcxproj.filters
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\python3.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\python3dll.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_nt.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
new file mode 100644
index 0000000..29493e3
--- /dev/null
+++ b/PCbuild/pythoncore.vcxproj
@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}</ProjectGuid>
+ <RootNamespace>pythoncore</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="debug.props" />
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="debug.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="release.props" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(PyDllName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(PyDllName)</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(PyDllName).dll</OutputFile>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <Optimization>Disabled</Optimization>
+ <InlineFunctionExpansion>Default</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(PyDllName).dll</OutputFile>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)$(PyDllName).dll</OutputFile>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalOptions>/Zm200 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalIncludeDirectories>..\Python;..\Modules\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ <AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <PreLinkEvent>
+ <Message>Generate build information...</Message>
+ <Command>"$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)"</Command>
+ </PreLinkEvent>
+ <Link>
+ <AdditionalDependencies>$(IntDir)getbuildinfo.o;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1e000000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Include\abstract.h" />
+ <ClInclude Include="..\Include\accu.h" />
+ <ClInclude Include="..\Include\asdl.h" />
+ <ClInclude Include="..\Include\ast.h" />
+ <ClInclude Include="..\Include\bitset.h" />
+ <ClInclude Include="..\Include\boolobject.h" />
+ <ClInclude Include="..\Include\bytes_methods.h" />
+ <ClInclude Include="..\Include\bytearrayobject.h" />
+ <ClInclude Include="..\Include\bytesobject.h" />
+ <ClInclude Include="..\Include\cellobject.h" />
+ <ClInclude Include="..\Include\ceval.h" />
+ <ClInclude Include="..\Include\classobject.h" />
+ <ClInclude Include="..\Include\code.h" />
+ <ClInclude Include="..\Include\codecs.h" />
+ <ClInclude Include="..\Include\compile.h" />
+ <ClInclude Include="..\Include\complexobject.h" />
+ <ClInclude Include="..\Include\datetime.h" />
+ <ClInclude Include="..\Include\descrobject.h" />
+ <ClInclude Include="..\Include\dictobject.h" />
+ <ClInclude Include="..\Include\dynamic_annotations.h" />
+ <ClInclude Include="..\Include\enumobject.h" />
+ <ClInclude Include="..\Include\errcode.h" />
+ <ClInclude Include="..\Include\eval.h" />
+ <ClInclude Include="..\Include\fileobject.h" />
+ <ClInclude Include="..\Include\fileutils.h" />
+ <ClInclude Include="..\Include\floatobject.h" />
+ <ClInclude Include="..\Include\frameobject.h" />
+ <ClInclude Include="..\Include\funcobject.h" />
+ <ClInclude Include="..\Include\genobject.h" />
+ <ClInclude Include="..\Include\graminit.h" />
+ <ClInclude Include="..\Include\grammar.h" />
+ <ClInclude Include="..\Include\import.h" />
+ <ClInclude Include="..\Include\intrcheck.h" />
+ <ClInclude Include="..\Include\iterobject.h" />
+ <ClInclude Include="..\Include\listobject.h" />
+ <ClInclude Include="..\Include\longintrepr.h" />
+ <ClInclude Include="..\Include\longobject.h" />
+ <ClInclude Include="..\Include\marshal.h" />
+ <ClInclude Include="..\Include\memoryobject.h" />
+ <ClInclude Include="..\Include\metagrammar.h" />
+ <ClInclude Include="..\Include\methodobject.h" />
+ <ClInclude Include="..\Include\modsupport.h" />
+ <ClInclude Include="..\Include\moduleobject.h" />
+ <ClInclude Include="..\Include\namespaceobject.h" />
+ <ClInclude Include="..\Include\node.h" />
+ <ClInclude Include="..\Include\object.h" />
+ <ClInclude Include="..\Include\objimpl.h" />
+ <ClInclude Include="..\Include\opcode.h" />
+ <ClInclude Include="..\Include\osdefs.h" />
+ <ClInclude Include="..\Include\parsetok.h" />
+ <ClInclude Include="..\Include\patchlevel.h" />
+ <ClInclude Include="..\Include\pgen.h" />
+ <ClInclude Include="..\Include\pgenheaders.h" />
+ <ClInclude Include="..\Include\py_curses.h" />
+ <ClInclude Include="..\Include\pyarena.h" />
+ <ClInclude Include="..\Include\pycapsule.h" />
+ <ClInclude Include="..\Include\pyctype.h" />
+ <ClInclude Include="..\Include\pydebug.h" />
+ <ClInclude Include="..\Include\pyerrors.h" />
+ <ClInclude Include="..\Include\pyexpat.h" />
+ <ClInclude Include="..\Include\pyfpe.h" />
+ <ClInclude Include="..\Include\pygetopt.h" />
+ <ClInclude Include="..\Include\pymath.h" />
+ <ClInclude Include="..\Include\pytime.h" />
+ <ClInclude Include="..\Include\pymacro.h" />
+ <ClInclude Include="..\Include\pymem.h" />
+ <ClInclude Include="..\Include\pyport.h" />
+ <ClInclude Include="..\Include\pystate.h" />
+ <ClInclude Include="..\Include\pystrcmp.h" />
+ <ClInclude Include="..\Include\pystrtod.h" />
+ <ClInclude Include="..\Include\dtoa.h" />
+ <ClInclude Include="..\Include\Python-ast.h" />
+ <ClInclude Include="..\Include\Python.h" />
+ <ClInclude Include="..\Include\pythonrun.h" />
+ <ClInclude Include="..\Include\pythread.h" />
+ <ClInclude Include="..\Include\rangeobject.h" />
+ <ClInclude Include="..\Include\setobject.h" />
+ <ClInclude Include="..\Include\sliceobject.h" />
+ <ClInclude Include="..\Include\structmember.h" />
+ <ClInclude Include="..\Include\structseq.h" />
+ <ClInclude Include="..\Include\symtable.h" />
+ <ClInclude Include="..\Include\sysmodule.h" />
+ <ClInclude Include="..\Include\token.h" />
+ <ClInclude Include="..\Include\traceback.h" />
+ <ClInclude Include="..\Include\tupleobject.h" />
+ <ClInclude Include="..\Include\ucnhash.h" />
+ <ClInclude Include="..\Include\unicodeobject.h" />
+ <ClInclude Include="..\Include\weakrefobject.h" />
+ <ClInclude Include="..\Modules\_math.h" />
+ <ClInclude Include="..\Modules\rotatingtree.h" />
+ <ClInclude Include="..\Modules\_io\_iomodule.h" />
+ <ClInclude Include="..\Modules\zlib\crc32.h" />
+ <ClInclude Include="..\Modules\zlib\deflate.h" />
+ <ClInclude Include="..\Modules\zlib\inffast.h" />
+ <ClInclude Include="..\Modules\zlib\inffixed.h" />
+ <ClInclude Include="..\Modules\zlib\inflate.h" />
+ <ClInclude Include="..\Modules\zlib\inftrees.h" />
+ <ClInclude Include="..\Modules\zlib\trees.h" />
+ <ClInclude Include="..\Modules\zlib\zconf.h" />
+ <ClInclude Include="..\Modules\zlib\zconf.in.h" />
+ <ClInclude Include="..\Modules\zlib\zlib.h" />
+ <ClInclude Include="..\Modules\zlib\zutil.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\alg_jisx0201.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\cjkcodecs.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\emu_jisx0213_2000.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_cn.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_hk.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_jisx0213_pair.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_jp.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_kr.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_tw.h" />
+ <ClInclude Include="..\Modules\cjkcodecs\multibytecodec.h" />
+ <ClInclude Include="..\Objects\stringlib\count.h" />
+ <ClInclude Include="..\Objects\stringlib\fastsearch.h" />
+ <ClInclude Include="..\Objects\stringlib\find.h" />
+ <ClInclude Include="..\Objects\stringlib\partition.h" />
+ <ClInclude Include="..\Objects\stringlib\split.h" />
+ <ClInclude Include="..\Objects\unicodetype_db.h" />
+ <ClInclude Include="..\Parser\parser.h" />
+ <ClInclude Include="..\Parser\tokenizer.h" />
+ <ClInclude Include="..\PC\errmap.h" />
+ <ClInclude Include="..\PC\pyconfig.h" />
+ <ClInclude Include="..\Python\ceval_gil.h" />
+ <ClInclude Include="..\Python\condvar.h" />
+ <ClInclude Include="..\Python\importdl.h" />
+ <ClInclude Include="..\Python\thread_nt.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_bisectmodule.c" />
+ <ClCompile Include="..\Modules\_codecsmodule.c" />
+ <ClCompile Include="..\Modules\_collectionsmodule.c" />
+ <ClCompile Include="..\Modules\_csv.c" />
+ <ClCompile Include="..\Modules\_functoolsmodule.c" />
+ <ClCompile Include="..\Modules\_heapqmodule.c" />
+ <ClCompile Include="..\Modules\_json.c" />
+ <ClCompile Include="..\Modules\_localemodule.c" />
+ <ClCompile Include="..\Modules\_lsprof.c" />
+ <ClCompile Include="..\Modules\_math.c" />
+ <ClCompile Include="..\Modules\_pickle.c" />
+ <ClCompile Include="..\Modules\_randommodule.c" />
+ <ClCompile Include="..\Modules\_sre.c" />
+ <ClCompile Include="..\Modules\_struct.c" />
+ <ClCompile Include="..\Modules\_weakref.c" />
+ <ClCompile Include="..\Modules\arraymodule.c" />
+ <ClCompile Include="..\Modules\atexitmodule.c" />
+ <ClCompile Include="..\Modules\audioop.c" />
+ <ClCompile Include="..\Modules\binascii.c" />
+ <ClCompile Include="..\Modules\cmathmodule.c" />
+ <ClCompile Include="..\Modules\_datetimemodule.c" />
+ <ClCompile Include="..\Modules\errnomodule.c" />
+ <ClCompile Include="..\Modules\faulthandler.c" />
+ <ClCompile Include="..\Modules\gcmodule.c" />
+ <ClCompile Include="..\Modules\itertoolsmodule.c" />
+ <ClCompile Include="..\Modules\main.c" />
+ <ClCompile Include="..\Modules\mathmodule.c" />
+ <ClCompile Include="..\Modules\md5module.c" />
+ <ClCompile Include="..\Modules\mmapmodule.c" />
+ <ClCompile Include="..\Modules\operator.c" />
+ <ClCompile Include="..\Modules\parsermodule.c" />
+ <ClCompile Include="..\Modules\posixmodule.c" />
+ <ClCompile Include="..\Modules\rotatingtree.c" />
+ <ClCompile Include="..\Modules\sha1module.c" />
+ <ClCompile Include="..\Modules\sha256module.c" />
+ <ClCompile Include="..\Modules\sha512module.c" />
+ <ClCompile Include="..\Modules\signalmodule.c" />
+ <ClCompile Include="..\Modules\symtablemodule.c" />
+ <ClCompile Include="..\Modules\_threadmodule.c" />
+ <ClCompile Include="..\Modules\timemodule.c" />
+ <ClCompile Include="..\Modules\xxsubtype.c" />
+ <ClCompile Include="..\Modules\zipimport.c" />
+ <ClCompile Include="..\Modules\zlibmodule.c" />
+ <ClCompile Include="..\Modules\_io\fileio.c" />
+ <ClCompile Include="..\Modules\_io\bytesio.c" />
+ <ClCompile Include="..\Modules\_io\stringio.c" />
+ <ClCompile Include="..\Modules\_io\bufferedio.c" />
+ <ClCompile Include="..\Modules\_io\iobase.c" />
+ <ClCompile Include="..\Modules\_io\textio.c" />
+ <ClCompile Include="..\Modules\_io\_iomodule.c" />
+ <ClCompile Include="..\Modules\zlib\adler32.c" />
+ <ClCompile Include="..\Modules\zlib\compress.c" />
+ <ClCompile Include="..\Modules\zlib\crc32.c" />
+ <ClCompile Include="..\Modules\zlib\deflate.c" />
+ <ClCompile Include="..\Modules\zlib\infback.c" />
+ <ClCompile Include="..\Modules\zlib\inffast.c" />
+ <ClCompile Include="..\Modules\zlib\inflate.c" />
+ <ClCompile Include="..\Modules\zlib\inftrees.c" />
+ <ClCompile Include="..\Modules\zlib\trees.c" />
+ <ClCompile Include="..\Modules\zlib\uncompr.c" />
+ <ClCompile Include="..\Modules\zlib\zutil.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_cn.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_hk.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_iso2022.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_jp.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_kr.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_tw.c" />
+ <ClCompile Include="..\Modules\cjkcodecs\multibytecodec.c" />
+ <ClCompile Include="..\Modules\_winapi.c" />
+ <ClCompile Include="..\Objects\abstract.c" />
+ <ClCompile Include="..\Objects\accu.c" />
+ <ClCompile Include="..\Objects\boolobject.c" />
+ <ClCompile Include="..\Objects\bytes_methods.c" />
+ <ClCompile Include="..\Objects\bytearrayobject.c" />
+ <ClCompile Include="..\Objects\bytesobject.c" />
+ <ClCompile Include="..\Objects\capsule.c" />
+ <ClCompile Include="..\Objects\cellobject.c" />
+ <ClCompile Include="..\Objects\classobject.c" />
+ <ClCompile Include="..\Objects\codeobject.c" />
+ <ClCompile Include="..\Objects\complexobject.c" />
+ <ClCompile Include="..\Objects\descrobject.c" />
+ <ClCompile Include="..\Objects\dictobject.c" />
+ <ClCompile Include="..\Objects\enumobject.c" />
+ <ClCompile Include="..\Objects\exceptions.c" />
+ <ClCompile Include="..\Objects\fileobject.c" />
+ <ClCompile Include="..\Objects\floatobject.c" />
+ <ClCompile Include="..\Objects\frameobject.c" />
+ <ClCompile Include="..\Objects\funcobject.c" />
+ <ClCompile Include="..\Objects\genobject.c" />
+ <ClCompile Include="..\Objects\iterobject.c" />
+ <ClCompile Include="..\Objects\listobject.c" />
+ <ClCompile Include="..\Objects\longobject.c" />
+ <ClCompile Include="..\Objects\memoryobject.c" />
+ <ClCompile Include="..\Objects\methodobject.c" />
+ <ClCompile Include="..\Objects\moduleobject.c" />
+ <ClCompile Include="..\Objects\namespaceobject.c" />
+ <ClCompile Include="..\Objects\object.c" />
+ <ClCompile Include="..\Objects\obmalloc.c" />
+ <ClCompile Include="..\Objects\rangeobject.c" />
+ <ClCompile Include="..\Objects\setobject.c" />
+ <ClCompile Include="..\Objects\sliceobject.c" />
+ <ClCompile Include="..\Objects\structseq.c" />
+ <ClCompile Include="..\Objects\tupleobject.c" />
+ <ClCompile Include="..\Objects\typeobject.c" />
+ <ClCompile Include="..\Objects\unicodectype.c" />
+ <ClCompile Include="..\Objects\unicodeobject.c" />
+ <ClCompile Include="..\Objects\weakrefobject.c" />
+ <ClCompile Include="..\Parser\acceler.c" />
+ <ClCompile Include="..\Parser\bitset.c" />
+ <ClCompile Include="..\Parser\firstsets.c" />
+ <ClCompile Include="..\Parser\grammar.c" />
+ <ClCompile Include="..\Parser\grammar1.c" />
+ <ClCompile Include="..\Parser\listnode.c" />
+ <ClCompile Include="..\Parser\metagrammar.c" />
+ <ClCompile Include="..\Parser\myreadline.c" />
+ <ClCompile Include="..\Parser\node.c" />
+ <ClCompile Include="..\Parser\parser.c" />
+ <ClCompile Include="..\Parser\parsetok.c" />
+ <ClCompile Include="..\Parser\tokenizer.c" />
+ <ClCompile Include="..\PC\winreg.c" />
+ <ClCompile Include="..\PC\config.c" />
+ <ClCompile Include="..\PC\dl_nt.c" />
+ <ClCompile Include="..\PC\getpathp.c" />
+ <ClCompile Include="..\PC\msvcrtmodule.c" />
+ <ClCompile Include="..\Python\random.c" />
+ <ClCompile Include="..\Python\_warnings.c" />
+ <ClCompile Include="..\Python\asdl.c" />
+ <ClCompile Include="..\Python\ast.c" />
+ <ClCompile Include="..\Python\bltinmodule.c" />
+ <ClCompile Include="..\Python\ceval.c" />
+ <ClCompile Include="..\Python\codecs.c" />
+ <ClCompile Include="..\Python\compile.c" />
+ <ClCompile Include="..\Python\dynamic_annotations.c" />
+ <ClCompile Include="..\Python\dynload_win.c" />
+ <ClCompile Include="..\Python\errors.c" />
+ <ClCompile Include="..\Python\fileutils.c" />
+ <ClCompile Include="..\Python\formatter_unicode.c" />
+ <ClCompile Include="..\Python\frozen.c" />
+ <ClCompile Include="..\Python\future.c" />
+ <ClCompile Include="..\Python\getargs.c" />
+ <ClCompile Include="..\Python\getcompiler.c" />
+ <ClCompile Include="..\Python\getcopyright.c" />
+ <ClCompile Include="..\Python\getopt.c" />
+ <ClCompile Include="..\Python\getplatform.c" />
+ <ClCompile Include="..\Python\getversion.c" />
+ <ClCompile Include="..\Python\graminit.c" />
+ <ClCompile Include="..\Python\import.c" />
+ <ClCompile Include="..\Python\importdl.c" />
+ <ClCompile Include="..\Python\marshal.c" />
+ <ClCompile Include="..\Python\modsupport.c" />
+ <ClCompile Include="..\Python\mysnprintf.c" />
+ <ClCompile Include="..\Python\mystrtoul.c" />
+ <ClCompile Include="..\Python\peephole.c" />
+ <ClCompile Include="..\Python\pyarena.c" />
+ <ClCompile Include="..\Python\pyctype.c" />
+ <ClCompile Include="..\Python\pyfpe.c" />
+ <ClCompile Include="..\Python\pymath.c" />
+ <ClCompile Include="..\Python\pytime.c" />
+ <ClCompile Include="..\Python\pystate.c" />
+ <ClCompile Include="..\Python\pystrcmp.c" />
+ <ClCompile Include="..\Python\pystrtod.c" />
+ <ClCompile Include="..\Python\dtoa.c" />
+ <ClCompile Include="..\Python\Python-ast.c" />
+ <ClCompile Include="..\Python\pythonrun.c" />
+ <ClCompile Include="..\Python\structmember.c" />
+ <ClCompile Include="..\Python\symtable.c" />
+ <ClCompile Include="..\Python\sysmodule.c" />
+ <ClCompile Include="..\Python\thread.c" />
+ <ClCompile Include="..\Python\traceback.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_nt.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="kill_python.vcxproj">
+ <Project>{6de10744-e396-40a5-b4e2-1b69aa7c8d31}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="make_buildinfo.vcxproj">
+ <Project>{c73f0ec1-358b-4177-940f-0846ac8b04cd}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="make_versioninfo.vcxproj">
+ <Project>{f0e0541e-f17d-430b-97c4-93adf0dd284e}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
new file mode 100644
index 0000000..09b4bb4
--- /dev/null
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Include">
+ <UniqueIdentifier>{086b0afb-270c-4603-a02a-63d46f0b2b92}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Modules">
+ <UniqueIdentifier>{8e81609f-13ca-4eae-9fdb-f8af20c710c7}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Modules\_io">
+ <UniqueIdentifier>{8787c5bb-bab6-4586-a42e-4a27c7b3ffb6}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Modules\zlib">
+ <UniqueIdentifier>{5d6d2d6c-9e61-4a1d-b0b2-5cc2f446d69e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Modules\cjkcodecs">
+ <UniqueIdentifier>{9f12c4b1-322e-431e-abf1-e02550f50032}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Objects">
+ <UniqueIdentifier>{ab29a558-143d-4fe7-a039-b431fb429856}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Parser">
+ <UniqueIdentifier>{97349fee-0abf-48b0-a8f5-771bf39b8aee}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="PC">
+ <UniqueIdentifier>{ea21fc98-de89-4746-a979-c5616964329a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Python">
+ <UniqueIdentifier>{f2696406-14bc-48bd-90c5-e93ab82a21ac}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{c3e03a5c-56c7-45fd-8543-e5d2326b907d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Include\abstract.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\accu.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\asdl.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\ast.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\bitset.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\boolobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\bytes_methods.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\bytearrayobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\bytesobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\cellobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\ceval.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\classobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\code.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\codecs.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\compile.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\complexobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\datetime.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\descrobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\dictobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\dynamic_annotations.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\enumobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\errcode.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\eval.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\fileobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\fileutils.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\floatobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\frameobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\funcobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\genobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\graminit.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\grammar.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\import.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\intrcheck.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\iterobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\listobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\longintrepr.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\longobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\marshal.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\memoryobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\metagrammar.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\methodobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\modsupport.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\moduleobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\node.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\object.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\objimpl.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\opcode.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\osdefs.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\parsetok.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\patchlevel.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pgen.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pgenheaders.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\py_curses.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyarena.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pycapsule.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyctype.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pydebug.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyerrors.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyexpat.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyfpe.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pygetopt.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pymath.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pytime.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pymacro.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pymem.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pyport.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pystate.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pystrcmp.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pystrtod.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\dtoa.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\Python-ast.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\Python.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pythonrun.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\pythread.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\rangeobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\setobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\sliceobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\structmember.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\structseq.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\symtable.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\sysmodule.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\token.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\traceback.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\tupleobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\ucnhash.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\unicodeobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\weakrefobject.h">
+ <Filter>Include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_math.h">
+ <Filter>Modules</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\rotatingtree.h">
+ <Filter>Modules</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\_io\_iomodule.h">
+ <Filter>Modules\_io</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\crc32.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\deflate.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\inffast.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\inffixed.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\inflate.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\inftrees.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\trees.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\zconf.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\zconf.in.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\zlib.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\zlib\zutil.h">
+ <Filter>Modules\zlib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\alg_jisx0201.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\cjkcodecs.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\emu_jisx0213_2000.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_cn.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_hk.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_jisx0213_pair.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_jp.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_kr.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\mappings_tw.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\cjkcodecs\multibytecodec.h">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\stringlib\count.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\stringlib\fastsearch.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\stringlib\find.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\stringlib\partition.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\stringlib\split.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Objects\unicodetype_db.h">
+ <Filter>Objects</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Parser\parser.h">
+ <Filter>Parser</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Parser\tokenizer.h">
+ <Filter>Parser</Filter>
+ </ClInclude>
+ <ClInclude Include="..\PC\errmap.h">
+ <Filter>PC</Filter>
+ </ClInclude>
+ <ClInclude Include="..\PC\pyconfig.h">
+ <Filter>PC</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Python\importdl.h">
+ <Filter>Python</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Python\thread_nt.h">
+ <Filter>Python</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Include\namespaceobject.h" />
+ <ClInclude Include="..\Python\condvar.h">
+ <Filter>Python</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Python\ceval_gil.h">
+ <Filter>Python</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\_bisectmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_codecsmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_collectionsmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_csv.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_functoolsmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_heapqmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_json.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_localemodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_lsprof.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_math.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_pickle.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_randommodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_sre.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_struct.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_weakref.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\arraymodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\atexitmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\audioop.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\binascii.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cmathmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_datetimemodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\errnomodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\faulthandler.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\gcmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\itertoolsmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\main.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\mathmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\md5module.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\mmapmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\operator.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\parsermodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\posixmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\rotatingtree.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\sha1module.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\sha256module.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\sha512module.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\signalmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\symtablemodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_threadmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\timemodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\xxsubtype.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zipimport.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlibmodule.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\fileio.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\bytesio.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\stringio.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\bufferedio.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\iobase.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\textio.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_io\_iomodule.c">
+ <Filter>Modules\_io</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\adler32.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\compress.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\crc32.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\deflate.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\infback.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inffast.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inflate.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\inftrees.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\trees.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\uncompr.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\zlib\zutil.c">
+ <Filter>Modules\zlib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_cn.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_hk.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_iso2022.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_jp.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_kr.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\_codecs_tw.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\cjkcodecs\multibytecodec.c">
+ <Filter>Modules\cjkcodecs</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\abstract.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\accu.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\boolobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\bytes_methods.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\bytearrayobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\bytesobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\capsule.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\cellobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\classobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\codeobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\complexobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\descrobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\dictobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\enumobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\exceptions.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\fileobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\floatobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\frameobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\funcobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\genobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\iterobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\listobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\longobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\memoryobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\methodobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\moduleobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\object.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\obmalloc.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\rangeobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\setobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\sliceobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\structseq.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\tupleobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\typeobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\unicodectype.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\unicodeobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\weakrefobject.c">
+ <Filter>Objects</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\acceler.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\bitset.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\firstsets.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\grammar.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\grammar1.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\listnode.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\metagrammar.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\myreadline.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\node.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\parser.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\parsetok.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Parser\tokenizer.c">
+ <Filter>Parser</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\winreg.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\config.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\dl_nt.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\getpathp.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\PC\msvcrtmodule.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\_warnings.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\asdl.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\ast.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\bltinmodule.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\ceval.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\codecs.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\compile.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\dynamic_annotations.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\dynload_win.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\errors.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\fileutils.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\formatter_unicode.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\frozen.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\future.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getargs.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getcompiler.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getcopyright.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getopt.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getplatform.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\getversion.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\graminit.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\import.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\importdl.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\marshal.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\modsupport.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\mysnprintf.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\mystrtoul.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\peephole.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pyarena.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pyctype.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pyfpe.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pymath.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pytime.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pystate.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pystrcmp.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pystrtod.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\dtoa.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\Python-ast.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\pythonrun.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\structmember.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\symtable.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\sysmodule.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\thread.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\traceback.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Python\random.c">
+ <Filter>Python</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Modules\_winapi.c">
+ <Filter>PC</Filter>
+ </ClCompile>
+ <ClCompile Include="..\Objects\namespaceobject.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_nt.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pythonw.vcxproj b/PCbuild/pythonw.vcxproj
new file mode 100644
index 0000000..1214569
--- /dev/null
+++ b/PCbuild/pythonw.vcxproj
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F4229CC3-873C-49AE-9729-DD308ED4CD4A}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw_d.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw_d.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <CompileAs>Default</CompileAs>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)pythonw.exe</OutputFile>
+ <StackReserveSize>2000000</StackReserveSize>
+ <BaseAddress>0x1d000000</BaseAddress>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_exe.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\WinMain.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pythonw.vcxproj.filters b/PCbuild/pythonw.vcxproj.filters
new file mode 100644
index 0000000..259866f
--- /dev/null
+++ b/PCbuild/pythonw.vcxproj.filters
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{0434cf11-a311-4a92-8a6c-4164aa79a7f2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{e1d8ea6b-c65d-42f4-9eed-6010846ed378}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\python_exe.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\WinMain.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pywlauncher.vcxproj b/PCbuild/pywlauncher.vcxproj
new file mode 100644
index 0000000..08e35a7
--- /dev/null
+++ b/PCbuild/pywlauncher.vcxproj
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{1D4B18D3-7C12-4ECB-9179-8531FF876CE6}</ProjectGuid>
+ <RootNamespace>pywlauncher</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <TargetName>pyw_d</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <TargetName>pyw_d</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <TargetName>pyw</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <TargetName>pyw</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <TargetName>pyw</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <TargetName>pyw</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <SubSystem>Windows</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <SubSystem>Windows</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <ClCompile>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <ClCompile>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Link>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <ClCompile>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;_WIN64;_M_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Link>
+ <AdditionalDependencies>version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <ClCompile>
+ <PreprocessorDefinitions>_WINDOWS;NDEBUG;_WIN64;_M_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\launcher.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\launcher.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\pylauncher.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/pywlauncher.vcxproj.filters b/PCbuild/pywlauncher.vcxproj.filters
new file mode 100644
index 0000000..e4b23d2
--- /dev/null
+++ b/PCbuild/pywlauncher.vcxproj.filters
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\launcher.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\PC\launcher.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="..\PC\pylauncher.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt
index c7e3c72..e749429 100644
--- a/PCbuild/readme.txt
+++ b/PCbuild/readme.txt
@@ -1,4 +1,4 @@
-Building Python using VC++ 9.0
+Building Python using VC++ 10.0
------------------------------
This directory is used to build Python for Win32 and x64 platforms, e.g.
@@ -37,7 +37,7 @@ NOTE:
running a Python core buildbot test slave; see SUBPROJECTS below)
When using the Debug setting, the output files have a _d added to
-their name: python32_d.dll, python_d.exe, parser_d.pyd, and so on. Both
+their name: python33_d.dll, python_d.exe, parser_d.pyd, and so on. Both
the build and rt batch files accept a -d option for debug builds.
The 32bit builds end up in the solution folder PCbuild while the x64 builds
@@ -62,17 +62,11 @@ PC/VS8.0/
C RUNTIME
---------
-Visual Studio 2008 uses version 9 of the C runtime (MSVCRT9). The executables
-are linked to a CRT "side by side" assembly which must be present on the target
-machine. This is avalible under the VC/Redist folder of your visual studio
-distribution. On XP and later operating systems that support
-side-by-side assemblies it is not enough to have the msvcrt90.dll present,
-it has to be there as a whole assembly, that is, a folder with the .dll
-and a .manifest. Also, a check is made for the correct version.
-Therefore, one should distribute this assembly with the dlls, and keep
-it in the same directory. For compatibility with older systems, one should
-also set the PATH to this directory so that the dll can be found.
-For more info, see the Readme in the VC/Redist folder.
+Visual Studio 2010 uses version 10 of the C runtime (MSVCRT9). The executables
+no longer use the "Side by Side" assemblies used in previous versions of the
+compiler. This simplifies distribution of applications.
+The run time libraries are avalible under the VC/Redist folder of your visual studio
+distribution. For more info, see the Readme in the VC/Redist folder.
SUBPROJECTS
-----------
@@ -92,6 +86,9 @@ _socket
_testcapi
tests of the Python C API, run via Lib/test/test_capi.py, and
implemented by module Modules/_testcapimodule.c
+_testbuffer
+ buffer protocol tests, run via Lib/test/test_buffer.py, and
+ implemented by module Modules/_testbuffer.c
pyexpat
Python wrapper for accelerated XML parsing, which incorporates stable
code from the Expat project: http://sourceforge.net/projects/expat/
@@ -112,9 +109,9 @@ _tkinter
pre-built Tcl/Tk in either ..\..\tcltk for 32-bit or ..\..\tcltk64 for
64-bit (relative to this directory). See below for instructions to build
Tcl/Tk.
-bz2
- Python wrapper for the libbz2 compression library. Homepage
- http://sources.redhat.com/bzip2/
+_bz2
+ Python wrapper for the libbzip2 compression library. Homepage
+ http://www.bzip.org/
Download the source from the python.org copy into the dist
directory:
@@ -133,13 +130,19 @@ bz2
All of this managed to build libbz2.lib in
bzip2-1.0.6\$platform-$configuration\, which the Python project links in.
+_lzma
+ Python wrapper for the liblzma compression library.
+
+ Download the pre-built Windows binaries from http://tukaani.org/xz/, and
+ extract to ..\xz-5.0.3. If you are using a more recent version of liblzma,
+ it will be necessary to rename the directory from xz-<VERSION> to xz-5.0.3.
_ssl
Python wrapper for the secure sockets library.
Get the source code through
- svn export http://svn.python.org/projects/external/openssl-1.0.0j
+ svn export http://svn.python.org/projects/external/openssl-1.0.1c
** NOTE: if you use the Tools\buildbot\external(-amd64).bat approach for
obtaining external sources then you don't need to manually get the source
diff --git a/PCbuild/release.props b/PCbuild/release.props
new file mode 100644
index 0000000..acfe3e4
--- /dev/null
+++ b/PCbuild/release.props
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="UserMacros">
+ <PyDebugExt />
+ </PropertyGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <BuildMacro Include="PyDebugExt">
+ <Value>$(PyDebugExt)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/select.vcxproj b/PCbuild/select.vcxproj
new file mode 100644
index 0000000..7c36d64
--- /dev/null
+++ b/PCbuild/select.vcxproj
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{18CAE28C-B454-46C1-87A0-493D91D97F03}</ProjectGuid>
+ <RootNamespace>select</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\selectmodule.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/select.vcxproj.filters b/PCbuild/select.vcxproj.filters
new file mode 100644
index 0000000..55a2fc8
--- /dev/null
+++ b/PCbuild/select.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{98346077-900c-4c7a-852f-a23470e37b40}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\selectmodule.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/sqlite3.props b/PCbuild/sqlite3.props
new file mode 100644
index 0000000..d3ee02c
--- /dev/null
+++ b/PCbuild/sqlite3.props
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets">
+ <Import Project="pyproject.props" />
+ </ImportGroup>
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <WarningLevel>Level1</WarningLevel>
+ </ClCompile>
+ </ItemDefinitionGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj
new file mode 100644
index 0000000..daf010d
--- /dev/null
+++ b/PCbuild/sqlite3.vcxproj
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{A1A295E5-463C-437F-81CA-1F32367685DA}</ProjectGuid>
+ <RootNamespace>sqlite3</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="sqlite3.props" />
+ <Import Project="debug.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName)_d.dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName)_d.dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(sqlite3Dir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="$(sqlite3Dir)\sqlite3.h" />
+ <ClInclude Include="$(sqlite3Dir)\sqlite3ext.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="$(sqlite3Dir)\sqlite3.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="kill_python.vcxproj">
+ <Project>{6de10744-e396-40a5-b4e2-1b69aa7c8d31}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/sqlite3.vcxproj.filters b/PCbuild/sqlite3.vcxproj.filters
new file mode 100644
index 0000000..86680c1
--- /dev/null
+++ b/PCbuild/sqlite3.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{ce5b649d-a6f7-4459-9425-c883795d79df}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{0e842fe2-176b-4e83-9d1f-0ad13a859efd}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="$(sqlite3Dir)\sqlite3.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="$(sqlite3Dir)\sqlite3ext.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="$(sqlite3Dir)\sqlite3.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/ssl.vcxproj b/PCbuild/ssl.vcxproj
new file mode 100644
index 0000000..41fd780
--- /dev/null
+++ b/PCbuild/ssl.vcxproj
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}</ProjectGuid>
+ <RootNamespace>ssl</RootNamespace>
+ <Keyword>MakeFileProj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Makefile</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ <NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">cd "$(SolutionDir)"
+"$(PythonExe)" build_ssl.py Release $(Platform) -a
+</NMakeBuildCommandLine>
+ <NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <NMakeOutput Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
+ <NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>
+ <NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+ <NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+ <NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ProjectReference Include="python.vcxproj">
+ <Project>{b11d750f-cd1f-4a96-85ce-e69a5c5259f9}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/unicodedata.vcxproj b/PCbuild/unicodedata.vcxproj
new file mode 100644
index 0000000..c9d5278
--- /dev/null
+++ b/PCbuild/unicodedata.vcxproj
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}</ProjectGuid>
+ <RootNamespace>unicodedata</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <BaseAddress>0x1D120000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\unicodedata_db.h" />
+ <ClInclude Include="..\Modules\unicodename_db.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\unicodedata.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/unicodedata.vcxproj.filters b/PCbuild/unicodedata.vcxproj.filters
new file mode 100644
index 0000000..20e640e
--- /dev/null
+++ b/PCbuild/unicodedata.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{b939a8f1-ccd7-420a-974a-243606dccd74}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{e2c055bb-ec62-4bbc-aa1c-d88da4d4ad1c}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\Modules\unicodedata_db.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\Modules\unicodename_db.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\unicodedata.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/vs9to10.py b/PCbuild/vs9to10.py
new file mode 100644
index 0000000..8bf832a
--- /dev/null
+++ b/PCbuild/vs9to10.py
@@ -0,0 +1,56 @@
+#Run this file after automatic convertsion of the VisualStudio 2008 solution by VisualStudio 2010.
+#This can be done whenever the 2008 solution changes.
+#It will make the necessary cleanup and updates to the vcxproj files
+#the .props files need to be maintained by hand if the .vsprops files change
+
+from __future__ import with_statement
+import sys
+import os
+import os.path
+
+def vs9to10(src, dest):
+ for name in os.listdir(src):
+ path, ext = os.path.splitext(name)
+ if ext.lower() not in ('.vcxproj',):
+ continue
+
+ filename = os.path.normpath(os.path.join(src, name))
+ destname = os.path.normpath(os.path.join(dest, name))
+ print("%s -> %s" % (filename, destname))
+
+ lines = []
+ lastline = b""
+ importgroup = False
+ with open(filename, 'rb') as fin:
+ for line in fin:
+ #remove redundant linker output info
+ if b"<OutputLine>" in line:
+ continue
+ if b"<ProgramDatabaseFile>" in line:
+ continue
+ if b"<ImportLibrary>" in line and b"</ImportLibrary>" in line:
+ continue
+
+ #add new property sheet to the pythoncore
+ if importgroup and "pythoncore" in name.lower():
+ if b"</ImportGroup>" in line:
+ if b"debug.props" in lastline:
+ lines.append(b' <Import Project="pythoncore_d.props" />\r\n')
+ elif b"pythoncore" not in lastline:
+ lines.append(b' <Import Project="pythoncore.props" />\r\n')
+ if b"<ImportGroup Condition" in line:
+ importgroup = True
+ elif b"</ImportGroup>" in line:
+ importgroup = False
+ lines.append(line)
+ lastline = line
+ with open(destname, 'wb') as fout:
+ for line in lines:
+ fout.write(line)
+
+if __name__ == "__main__":
+ src = "." if len(sys.argv) < 2 else sys.argv[1]
+ name = os.path.basename(os.path.abspath(src))
+ dest = os.path.abspath(os.path.join(src, "..", name + "Upd"))
+ os.makedirs(dest)
+ vs9to10(src, dest)
diff --git a/PCbuild/w9xpopen.vcxproj b/PCbuild/w9xpopen.vcxproj
new file mode 100644
index 0000000..d1afe22
--- /dev/null
+++ b/PCbuild/w9xpopen.vcxproj
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}</ProjectGuid>
+ <RootNamespace>w9xpopen</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="release.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyproject.props" />
+ <Import Project="x64.props" />
+ <Import Project="debug.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <ImportLibrary>
+ </ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <ImportLibrary>
+ </ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <ImportLibrary>
+ </ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\w9xpopen.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/w9xpopen.vcxproj.filters b/PCbuild/w9xpopen.vcxproj.filters
new file mode 100644
index 0000000..dec67ad
--- /dev/null
+++ b/PCbuild/w9xpopen.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{abc2dffd-3f2a-47bd-b89b-0314c99ef21e}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\w9xpopen.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/winsound.vcxproj b/PCbuild/winsound.vcxproj
new file mode 100644
index 0000000..cf518e9
--- /dev/null
+++ b/PCbuild/winsound.vcxproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{28B5D777-DDF2-4B6B-B34F-31D938813856}</ProjectGuid>
+ <RootNamespace>winsound</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd_d.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\winsound.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/winsound.vcxproj.filters b/PCbuild/winsound.vcxproj.filters
new file mode 100644
index 0000000..7d08931
--- /dev/null
+++ b/PCbuild/winsound.vcxproj.filters
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\PC\winsound.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/x64.props b/PCbuild/x64.props
new file mode 100644
index 0000000..289d95b
--- /dev/null
+++ b/PCbuild/x64.props
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="UserMacros" Condition="'$(HOST_PYTHON)'!=''">
+ <PythonExe>$(HOST_PYTHON)</PythonExe>
+ </PropertyGroup>
+ <ItemDefinitionGroup>
+ <ClCompile>
+ <AdditionalOptions>/USECL:MS_OPTERON /GS- %(AdditionalOptions)</AdditionalOptions>
+ <PreprocessorDefinitions>_WIN64;_M_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <BuildMacro Include="PythonExe">
+ <Value>$(PythonExe)</Value>
+ </BuildMacro>
+ </ItemGroup>
+</Project>
diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj
new file mode 100644
index 0000000..26bc20d
--- /dev/null
+++ b/PCbuild/xxlimited.vcxproj
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="PGInstrument|Win32">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGInstrument|x64">
+ <Configuration>PGInstrument</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|Win32">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="PGUpdate|x64">
+ <Configuration>PGUpdate</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{F749B822-B489-4CA5-A3AD-CE078F5F338A}</ProjectGuid>
+ <RootNamespace>xxlimited</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pgupdate.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ <Import Project="pginstrument.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="pyd.props" />
+ <Import Project="x64.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>NDEBUG;_WIN32;_WINDLL;Py_LIMITED_API</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>Py_LIMITED_API;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGInstrument|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>Py_LIMITED_API;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='PGUpdate|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <Link>
+ <AdditionalDependencies>wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <IgnoreSpecificDefaultLibraries>libc;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+ <BaseAddress>0x1D110000</BaseAddress>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\xxlimited.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="pythoncore.vcxproj">
+ <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/PCbuild/xxlimited.vcxproj.filters b/PCbuild/xxlimited.vcxproj.filters
new file mode 100644
index 0000000..21db468
--- /dev/null
+++ b/PCbuild/xxlimited.vcxproj.filters
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{eb5eebc7-3787-4f8f-b282-204db2962cc3}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\Modules\xxlimited.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Parser/Python.asdl b/Parser/Python.asdl
index 9407b2f..6b06dec 100644
--- a/Parser/Python.asdl
+++ b/Parser/Python.asdl
@@ -1,119 +1,120 @@
--- ASDL's four builtin types are identifier, int, string, object
+-- ASDL's five builtin types are identifier, int, string, bytes, object
-module Python version "$Revision$"
+module Python
{
- mod = Module(stmt* body)
- | Interactive(stmt* body)
- | Expression(expr body)
+ mod = Module(stmt* body)
+ | Interactive(stmt* body)
+ | Expression(expr body)
- -- not really an actual node but useful in Jython's typesystem.
- | Suite(stmt* body)
+ -- not really an actual node but useful in Jython's typesystem.
+ | Suite(stmt* body)
- stmt = FunctionDef(identifier name, arguments args,
+ stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns)
- | ClassDef(identifier name,
- expr* bases,
- keyword* keywords,
- expr? starargs,
- expr? kwargs,
- stmt* body,
- expr* decorator_list)
- | Return(expr? value)
-
- | Delete(expr* targets)
- | Assign(expr* targets, expr value)
- | AugAssign(expr target, operator op, expr value)
-
- -- use 'orelse' because else is a keyword in target languages
- | For(expr target, expr iter, stmt* body, stmt* orelse)
- | While(expr test, stmt* body, stmt* orelse)
- | If(expr test, stmt* body, stmt* orelse)
- | With(expr context_expr, expr? optional_vars, stmt* body)
-
- | Raise(expr? exc, expr? cause)
- | TryExcept(stmt* body, excepthandler* handlers, stmt* orelse)
- | TryFinally(stmt* body, stmt* finalbody)
- | Assert(expr test, expr? msg)
-
- | Import(alias* names)
- | ImportFrom(identifier? module, alias* names, int? level)
-
- | Global(identifier* names)
- | Nonlocal(identifier* names)
- | Expr(expr value)
- | Pass | Break | Continue
-
- -- XXX Jython will be different
- -- col_offset is the byte offset in the utf8 string the parser uses
- attributes (int lineno, int col_offset)
-
- -- BoolOp() can use left & right?
- expr = BoolOp(boolop op, expr* values)
- | BinOp(expr left, operator op, expr right)
- | UnaryOp(unaryop op, expr operand)
- | Lambda(arguments args, expr body)
- | IfExp(expr test, expr body, expr orelse)
- | Dict(expr* keys, expr* values)
- | Set(expr* elts)
- | ListComp(expr elt, comprehension* generators)
- | SetComp(expr elt, comprehension* generators)
- | DictComp(expr key, expr value, comprehension* generators)
- | GeneratorExp(expr elt, comprehension* generators)
- -- the grammar constrains where yield expressions can occur
- | Yield(expr? value)
- -- need sequences for compare to distinguish between
- -- x < 4 < 3 and (x < 4) < 3
- | Compare(expr left, cmpop* ops, expr* comparators)
- | Call(expr func, expr* args, keyword* keywords,
- expr? starargs, expr? kwargs)
- | Num(object n) -- a number as a PyObject.
- | Str(string s) -- need to specify raw, unicode, etc?
- | Bytes(string s)
- | Ellipsis
- -- other literals? bools?
-
- -- the following expression can appear in assignment context
- | Attribute(expr value, identifier attr, expr_context ctx)
- | Subscript(expr value, slice slice, expr_context ctx)
- | Starred(expr value, expr_context ctx)
- | Name(identifier id, expr_context ctx)
- | List(expr* elts, expr_context ctx)
- | Tuple(expr* elts, expr_context ctx)
-
- -- col_offset is the byte offset in the utf8 string the parser uses
- attributes (int lineno, int col_offset)
-
- expr_context = Load | Store | Del | AugLoad | AugStore | Param
-
- slice = Slice(expr? lower, expr? upper, expr? step)
- | ExtSlice(slice* dims)
- | Index(expr value)
-
- boolop = And | Or
-
- operator = Add | Sub | Mult | Div | Mod | Pow | LShift
+ | ClassDef(identifier name,
+ expr* bases,
+ keyword* keywords,
+ expr? starargs,
+ expr? kwargs,
+ stmt* body,
+ expr* decorator_list)
+ | Return(expr? value)
+
+ | Delete(expr* targets)
+ | Assign(expr* targets, expr value)
+ | AugAssign(expr target, operator op, expr value)
+
+ -- use 'orelse' because else is a keyword in target languages
+ | For(expr target, expr iter, stmt* body, stmt* orelse)
+ | While(expr test, stmt* body, stmt* orelse)
+ | If(expr test, stmt* body, stmt* orelse)
+ | With(withitem* items, stmt* body)
+
+ | Raise(expr? exc, expr? cause)
+ | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
+ | Assert(expr test, expr? msg)
+
+ | Import(alias* names)
+ | ImportFrom(identifier? module, alias* names, int? level)
+
+ | Global(identifier* names)
+ | Nonlocal(identifier* names)
+ | Expr(expr value)
+ | Pass | Break | Continue
+
+ -- XXX Jython will be different
+ -- col_offset is the byte offset in the utf8 string the parser uses
+ attributes (int lineno, int col_offset)
+
+ -- BoolOp() can use left & right?
+ expr = BoolOp(boolop op, expr* values)
+ | BinOp(expr left, operator op, expr right)
+ | UnaryOp(unaryop op, expr operand)
+ | Lambda(arguments args, expr body)
+ | IfExp(expr test, expr body, expr orelse)
+ | Dict(expr* keys, expr* values)
+ | Set(expr* elts)
+ | ListComp(expr elt, comprehension* generators)
+ | SetComp(expr elt, comprehension* generators)
+ | DictComp(expr key, expr value, comprehension* generators)
+ | GeneratorExp(expr elt, comprehension* generators)
+ -- the grammar constrains where yield expressions can occur
+ | Yield(expr? value)
+ | YieldFrom(expr? value)
+ -- need sequences for compare to distinguish between
+ -- x < 4 < 3 and (x < 4) < 3
+ | Compare(expr left, cmpop* ops, expr* comparators)
+ | Call(expr func, expr* args, keyword* keywords,
+ expr? starargs, expr? kwargs)
+ | Num(object n) -- a number as a PyObject.
+ | Str(string s) -- need to specify raw, unicode, etc?
+ | Bytes(bytes s)
+ | Ellipsis
+ -- other literals? bools?
+
+ -- the following expression can appear in assignment context
+ | Attribute(expr value, identifier attr, expr_context ctx)
+ | Subscript(expr value, slice slice, expr_context ctx)
+ | Starred(expr value, expr_context ctx)
+ | Name(identifier id, expr_context ctx)
+ | List(expr* elts, expr_context ctx)
+ | Tuple(expr* elts, expr_context ctx)
+
+ -- col_offset is the byte offset in the utf8 string the parser uses
+ attributes (int lineno, int col_offset)
+
+ expr_context = Load | Store | Del | AugLoad | AugStore | Param
+
+ slice = Slice(expr? lower, expr? upper, expr? step)
+ | ExtSlice(slice* dims)
+ | Index(expr value)
+
+ boolop = And | Or
+
+ operator = Add | Sub | Mult | Div | Mod | Pow | LShift
| RShift | BitOr | BitXor | BitAnd | FloorDiv
- unaryop = Invert | Not | UAdd | USub
+ unaryop = Invert | Not | UAdd | USub
- cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn
+ cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn
- comprehension = (expr target, expr iter, expr* ifs)
+ comprehension = (expr target, expr iter, expr* ifs)
- -- not sure what to call the first argument for raise and except
- excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
- attributes (int lineno, int col_offset)
+ excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
+ attributes (int lineno, int col_offset)
- arguments = (arg* args, identifier? vararg, expr? varargannotation,
+ arguments = (arg* args, identifier? vararg, expr? varargannotation,
arg* kwonlyargs, identifier? kwarg,
expr? kwargannotation, expr* defaults,
expr* kw_defaults)
- arg = (identifier arg, expr? annotation)
+ arg = (identifier arg, expr? annotation)
- -- keyword arguments supplied to call
- keyword = (identifier arg, expr value)
+ -- keyword arguments supplied to call
+ keyword = (identifier arg, expr value)
- -- import name with optional 'as' alias.
- alias = (identifier name, identifier? asname)
+ -- import name with optional 'as' alias.
+ alias = (identifier name, identifier? asname)
+
+ withitem = (expr context_expr, expr? optional_vars)
}
diff --git a/Parser/asdl.py b/Parser/asdl.py
index 7b4e2dc..08aa05b 100644
--- a/Parser/asdl.py
+++ b/Parser/asdl.py
@@ -114,28 +114,20 @@ class ASDLParser(spark.GenericParser, object):
raise ASDLSyntaxError(tok.lineno, tok)
def p_module_0(self, info):
- " module ::= Id Id version { } "
- module, name, version, _0, _1 = info
+ " module ::= Id Id { } "
+ module, name, _0, _1 = info
if module.value != "module":
raise ASDLSyntaxError(module.lineno,
msg="expected 'module', found %s" % module)
- return Module(name, None, version)
+ return Module(name, None)
def p_module(self, info):
- " module ::= Id Id version { definitions } "
- module, name, version, _0, definitions, _1 = info
+ " module ::= Id Id { definitions } "
+ module, name, _0, definitions, _1 = info
if module.value != "module":
raise ASDLSyntaxError(module.lineno,
msg="expected 'module', found %s" % module)
- return Module(name, definitions, version)
-
- def p_version(self, info):
- "version ::= Id String"
- version, V = info
- if version.value != "version":
- raise ASDLSyntaxError(version.lineno,
- msg="expected 'version', found %" % version)
- return V
+ return Module(name, definitions)
def p_definition_0(self, definition):
" definitions ::= definition "
@@ -164,15 +156,11 @@ class ASDLParser(spark.GenericParser, object):
if id.value != "attributes":
raise ASDLSyntaxError(id.lineno,
msg="expected attributes, found %s" % id)
- if attributes:
- attributes.reverse()
return Sum(sum, attributes)
def p_product(self, info):
" product ::= ( fields ) "
_0, fields, _1 = info
- # XXX can't I just construct things in the right order?
- fields.reverse()
return Product(fields)
def p_sum_0(self, constructor):
@@ -196,8 +184,6 @@ class ASDLParser(spark.GenericParser, object):
def p_constructor_1(self, info):
" constructor ::= Id ( fields ) "
id, _0, fields, _1 = info
- # XXX can't I just construct things in the right order?
- fields.reverse()
return Constructor(id, fields)
def p_fields_0(self, field):
@@ -205,8 +191,8 @@ class ASDLParser(spark.GenericParser, object):
return [field[0]]
def p_fields_1(self, info):
- " fields ::= field , fields "
- field, _, fields = info
+ " fields ::= fields , field "
+ fields, _, field = info
return fields + [field]
def p_field_0(self, type_):
@@ -236,7 +222,7 @@ class ASDLParser(spark.GenericParser, object):
" field ::= Id ? "
return Field(type[0], opt=True)
-builtin_types = ("identifier", "string", "int", "bool", "object")
+builtin_types = ("identifier", "string", "bytes", "int", "object")
# below is a collection of classes to capture the AST of an AST :-)
# not sure if any of the methods are useful yet, but I'm adding them
@@ -246,10 +232,9 @@ class AST(object):
pass # a marker class
class Module(AST):
- def __init__(self, name, dfns, version):
+ def __init__(self, name, dfns):
self.name = name
self.dfns = dfns
- self.version = version
self.types = {} # maps type name to value (from dfns)
for type in dfns:
self.types[type.name.value] = type.value
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 7f613db..a9e6626 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -84,8 +84,16 @@ class EmitVisitor(asdl.VisitorBase):
def __init__(self, file):
self.file = file
+ self.identifiers = set()
super(EmitVisitor, self).__init__()
+ def emit_identifier(self, name):
+ name = str(name)
+ if name in self.identifiers:
+ return
+ self.emit("_Py_IDENTIFIER(%s);" % name, 0)
+ self.identifiers.add(name)
+
def emit(self, s, depth, reflow=True):
# XXX reflow long lines?
if reflow:
@@ -485,12 +493,12 @@ class Obj2ModVisitor(PickleVisitor):
def visitField(self, field, name, sum=None, prod=None, depth=0):
ctype = get_c_type(field.type)
- self.emit("if (PyObject_HasAttrString(obj, \"%s\")) {" % field.name, depth)
+ self.emit("if (_PyObject_HasAttrId(obj, &PyId_%s)) {" % field.name, depth)
self.emit("int res;", depth+1)
if field.seq:
self.emit("Py_ssize_t len;", depth+1)
self.emit("Py_ssize_t i;", depth+1)
- self.emit("tmp = PyObject_GetAttrString(obj, \"%s\");" % field.name, depth+1)
+ self.emit("tmp = _PyObject_GetAttrId(obj, &PyId_%s);" % field.name, depth+1)
self.emit("if (tmp == NULL) goto failed;", depth+1)
if field.seq:
self.emit("if (!PyList_Check(tmp)) {", depth+1)
@@ -552,6 +560,8 @@ class PyTypesDeclareVisitor(PickleVisitor):
self.emit("static PyTypeObject *%s_type;" % name, 0)
self.emit("static PyObject* ast2obj_%s(void*);" % name, 0)
if prod.fields:
+ for f in prod.fields:
+ self.emit_identifier(f.name)
self.emit("static char *%s_fields[]={" % name,0)
for f in prod.fields:
self.emit('"%s",' % f.name, 1)
@@ -560,6 +570,8 @@ class PyTypesDeclareVisitor(PickleVisitor):
def visitSum(self, sum, name):
self.emit("static PyTypeObject *%s_type;" % name, 0)
if sum.attributes:
+ for a in sum.attributes:
+ self.emit_identifier(a.name)
self.emit("static char *%s_attributes[] = {" % name, 0)
for a in sum.attributes:
self.emit('"%s",' % a.name, 1)
@@ -579,6 +591,8 @@ class PyTypesDeclareVisitor(PickleVisitor):
def visitConstructor(self, cons, name):
self.emit("static PyTypeObject *%s_type;" % cons.name, 0)
if cons.fields:
+ for t in cons.fields:
+ self.emit_identifier(t.name)
self.emit("static char *%s_fields[]={" % cons.name, 0)
for t in cons.fields:
self.emit('"%s",' % t.name, 1)
@@ -588,13 +602,39 @@ class PyTypesVisitor(PickleVisitor):
def visitModule(self, mod):
self.emit("""
+typedef struct {
+ PyObject_HEAD
+ PyObject *dict;
+} AST_object;
+
+static void
+ast_dealloc(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+ast_traverse(AST_object *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->dict);
+ return 0;
+}
+
+static void
+ast_clear(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+}
+
static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{
+ _Py_IDENTIFIER(_fields);
Py_ssize_t i, numfields = 0;
int res = -1;
PyObject *key, *value, *fields;
- fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
+ fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);
if (!fields)
PyErr_Clear();
if (fields) {
@@ -644,7 +684,8 @@ static PyObject *
ast_type_reduce(PyObject *self, PyObject *unused)
{
PyObject *res;
- PyObject *dict = PyObject_GetAttrString(self, "__dict__");
+ _Py_IDENTIFIER(__dict__);
+ PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
if (dict == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -664,12 +705,17 @@ static PyMethodDef ast_type_methods[] = {
{NULL}
};
+static PyGetSetDef ast_type_getsets[] = {
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
+ {NULL}
+};
+
static PyTypeObject AST_type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"_ast.AST",
- sizeof(PyObject),
+ sizeof(AST_object),
0,
- 0, /* tp_dealloc */
+ (destructor)ast_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
@@ -684,26 +730,26 @@ static PyTypeObject AST_type = {
PyObject_GenericGetAttr, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
+ (traverseproc)ast_traverse, /* tp_traverse */
+ (inquiry)ast_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
ast_type_methods, /* tp_methods */
0, /* tp_members */
- 0, /* tp_getset */
+ ast_type_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(AST_object, dict),/* tp_dictoffset */
(initproc)ast_type_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
- PyObject_Del, /* tp_free */
+ PyObject_GC_Del, /* tp_free */
};
@@ -730,6 +776,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int
static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{
int i, result;
+ _Py_IDENTIFIER(_attributes);
PyObject *s, *l = PyTuple_New(num_fields);
if (!l)
return 0;
@@ -741,7 +788,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
}
PyTuple_SET_ITEM(l, i, s);
}
- result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
+ result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Py_DECREF(l);
return result;
}
@@ -750,7 +797,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
{
- int i, n = asdl_seq_LEN(seq);
+ Py_ssize_t i, n = asdl_seq_LEN(seq);
PyObject *result = PyList_New(n);
PyObject *value;
if (!result)
@@ -775,6 +822,7 @@ static PyObject* ast2obj_object(void *o)
}
#define ast2obj_identifier ast2obj_object
#define ast2obj_string ast2obj_object
+#define ast2obj_bytes ast2obj_object
static PyObject* ast2obj_int(long b)
{
@@ -812,6 +860,15 @@ static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
return obj2ast_object(obj, out, arena);
}
+static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
+{
+ if (!PyBytes_CheckExact(obj)) {
+ PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
+ return 1;
+ }
+ return obj2ast_object(obj, out, arena);
+}
+
static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
{
int i;
@@ -910,10 +967,6 @@ class ASTModuleVisitor(PickleVisitor):
self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1)
self.emit('if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)', 1)
self.emit("return NULL;", 2)
- # Value of version: "$Revision$"
- self.emit('if (PyModule_AddStringConstant(m, "__version__", "%s") < 0)'
- % mod.version, 1)
- self.emit("return NULL;", 2)
for dfn in mod.dfns:
self.visit(dfn)
self.emit("return m;", 1)
@@ -997,7 +1050,7 @@ class ObjVisitor(PickleVisitor):
for a in sum.attributes:
self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1)
self.emit("if (!value) goto failed;", 1)
- self.emit('if (PyObject_SetAttrString(result, "%s", value) < 0)' % a.name, 1)
+ self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1)
self.emit('goto failed;', 2)
self.emit('Py_DECREF(value);', 1)
self.func_end()
@@ -1043,7 +1096,7 @@ class ObjVisitor(PickleVisitor):
value = "o->v.%s.%s" % (name, field.name)
self.set(field, value, depth)
emit("if (!value) goto failed;", 0)
- emit('if (PyObject_SetAttrString(result, "%s", value) == -1)' % field.name, 0)
+ emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) == -1)' % field.name, 0)
emit("goto failed;", 1)
emit("Py_DECREF(value);", 0)
@@ -1066,7 +1119,7 @@ class ObjVisitor(PickleVisitor):
# While the sequence elements are stored as void*,
# ast2obj_cmpop expects an enum
self.emit("{", depth)
- self.emit("int i, n = asdl_seq_LEN(%s);" % value, depth+1)
+ self.emit("Py_ssize_t i, n = asdl_seq_LEN(%s);" % value, depth+1)
self.emit("value = PyList_New(n);", depth+1)
self.emit("if (!value) goto failed;", depth+1)
self.emit("for(i = 0; i < n; i++)", depth+1)
@@ -1134,24 +1187,12 @@ class ChainOfVisitors:
common_msg = "/* File automatically generated by %s. */\n\n"
-c_file_msg = """
-/*
- __version__ %s.
-
- This module must be committed separately after each AST grammar change;
- The __version__ number is set to the revision number of the commit
- containing the grammar change.
-*/
-
-"""
-
def main(srcfile):
argv0 = sys.argv[0]
components = argv0.split(os.sep)
argv0 = os.sep.join(components[-2:])
auto_gen_msg = common_msg % argv0
mod = asdl.parse(srcfile)
- mod.version = "82163"
if not asdl.check(mod):
sys.exit(1)
if INC_DIR:
@@ -1173,7 +1214,8 @@ def main(srcfile):
p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c")
f = open(p, "w")
f.write(auto_gen_msg)
- f.write(c_file_msg % mod.version)
+ f.write('#include <stddef.h>\n')
+ f.write('\n')
f.write('#include "Python.h"\n')
f.write('#include "%s-ast.h"\n' % mod.name)
f.write('\n')
diff --git a/Parser/intrcheck.c b/Parser/intrcheck.c
deleted file mode 100644
index 4439864..0000000
--- a/Parser/intrcheck.c
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/* Check for interrupts */
-
-#include "Python.h"
-#include "pythread.h"
-
-#ifdef QUICKWIN
-
-#include <io.h>
-
-void
-PyOS_InitInterrupts(void)
-{
-}
-
-void
-PyOS_FiniInterrupts(void)
-{
-}
-
-int
-PyOS_InterruptOccurred(void)
-{
- _wyield();
-}
-
-#define OK
-
-#endif /* QUICKWIN */
-
-#if defined(_M_IX86) && !defined(__QNX__)
-#include <io.h>
-#endif
-
-#if defined(MSDOS) && !defined(QUICKWIN)
-
-#ifdef __GNUC__
-
-/* This is for DJGPP's GO32 extender. I don't know how to trap
- * control-C (There's no API for ctrl-C, and I don't want to mess with
- * the interrupt vectors.) However, this DOES catch control-break.
- * --Amrit
- */
-
-#include <go32.h>
-
-void
-PyOS_InitInterrupts(void)
-{
- _go32_want_ctrl_break(1 /* TRUE */);
-}
-
-void
-PyOS_FiniInterrupts(void)
-{
-}
-
-int
-PyOS_InterruptOccurred(void)
-{
- return _go32_was_ctrl_break_hit();
-}
-
-#else /* !__GNUC__ */
-
-/* This might work for MS-DOS (untested though): */
-
-void
-PyOS_InitInterrupts(void)
-{
-}
-
-void
-PyOS_FiniInterrupts(void)
-{
-}
-
-int
-PyOS_InterruptOccurred(void)
-{
- int interrupted = 0;
- while (kbhit()) {
- if (getch() == '\003')
- interrupted = 1;
- }
- return interrupted;
-}
-
-#endif /* __GNUC__ */
-
-#define OK
-
-#endif /* MSDOS && !QUICKWIN */
-
-
-#ifndef OK
-
-/* Default version -- for real operating systems and for Standard C */
-
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-
-static int interrupted;
-
-void
-PyErr_SetInterrupt(void)
-{
- interrupted = 1;
-}
-
-extern int PyErr_CheckSignals(void);
-
-static int
-checksignals_witharg(void * arg)
-{
- return PyErr_CheckSignals();
-}
-
-static void
-intcatcher(int sig)
-{
- extern void Py_Exit(int);
- static char message[] =
-"python: to interrupt a truly hanging Python program, interrupt once more.\n";
- switch (interrupted++) {
- case 0:
- break;
- case 1:
- write(2, message, strlen(message));
- break;
- case 2:
- interrupted = 0;
- Py_Exit(1);
- break;
- }
- PyOS_setsig(SIGINT, intcatcher);
- Py_AddPendingCall(checksignals_witharg, NULL);
-}
-
-static void (*old_siginthandler)(int) = SIG_DFL;
-
-void
-PyOS_InitInterrupts(void)
-{
- if ((old_siginthandler = PyOS_setsig(SIGINT, SIG_IGN)) != SIG_IGN)
- PyOS_setsig(SIGINT, intcatcher);
-}
-
-void
-PyOS_FiniInterrupts(void)
-{
- PyOS_setsig(SIGINT, old_siginthandler);
-}
-
-int
-PyOS_InterruptOccurred(void)
-{
- if (!interrupted)
- return 0;
- interrupted = 0;
- return 1;
-}
-
-#endif /* !OK */
-
-void
-PyOS_AfterFork(void)
-{
-#ifdef WITH_THREAD
- PyEval_ReInitThreads();
- PyThread_ReInitTLS();
-#endif
-}
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
index 93edd7f..d864623 100644
--- a/Parser/myreadline.c
+++ b/Parser/myreadline.c
@@ -35,12 +35,11 @@ int (*PyOS_InputHook)(void) = NULL;
static int
my_fgets(char *buf, int len, FILE *fp)
{
- char *p;
- int err;
#ifdef MS_WINDOWS
- int i;
+ HANDLE hInterruptEvent;
#endif
-
+ char *p;
+ int err;
while (1) {
if (PyOS_InputHook != NULL)
(void)(PyOS_InputHook)();
@@ -57,20 +56,24 @@ my_fgets(char *buf, int len, FILE *fp)
/* Ctrl-C anywhere on the line or Ctrl-Z if the only character
on a line will set ERROR_OPERATION_ABORTED. Under normal
circumstances Ctrl-C will also have caused the SIGINT handler
- to fire. This signal fires in another thread and is not
- guaranteed to have occurred before this point in the code.
-
- Therefore: check in a small loop to see if the trigger has
- fired, in which case assume this is a Ctrl-C event. If it
- hasn't fired within 10ms assume that this is a Ctrl-Z on its
- own or that the signal isn't going to fire for some other
- reason and drop through to check for EOF.
+ to fire which will have set the event object returned by
+ _PyOS_SigintEvent. This signal fires in another thread and
+ is not guaranteed to have occurred before this point in the
+ code.
+
+ Therefore: check whether the event is set with a small timeout.
+ If it is, assume this is a Ctrl-C and reset the event. If it
+ isn't set assume that this is a Ctrl-Z on its own and drop
+ through to check for EOF.
*/
if (GetLastError()==ERROR_OPERATION_ABORTED) {
- for (i = 0; i < 10; i++) {
- if (PyOS_InterruptOccurred())
- return 1;
- Sleep(1);
+ hInterruptEvent = _PyOS_SigintEvent();
+ switch (WaitForSingleObject(hInterruptEvent, 10)) {
+ case WAIT_OBJECT_0:
+ ResetEvent(hInterruptEvent);
+ return 1; /* Interrupt */
+ case WAIT_FAILED:
+ return -2; /* Error */
}
}
#endif /* MS_WINDOWS */
@@ -90,7 +93,7 @@ my_fgets(char *buf, int len, FILE *fp)
#endif
if (s < 0)
return 1;
- /* try again */
+ /* try again */
continue;
}
#endif
diff --git a/Parser/node.c b/Parser/node.c
index 0dea30f..1e4f0da 100644
--- a/Parser/node.c
+++ b/Parser/node.c
@@ -71,7 +71,7 @@ fancy_roundup(int n)
* capacity. The code is tricky to avoid that.
*/
#define XXXROUNDUP(n) ((n) <= 1 ? (n) : \
- (n) <= 128 ? (((n) + 3) & ~3) : \
+ (n) <= 128 ? _Py_SIZE_ROUND_UP((n), 4) : \
fancy_roundup(n))
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index bb9afc4..7beb735 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -13,7 +13,7 @@
/* Forward */
static node *parsetok(struct tok_state *, grammar *, int, perrdetail *, int *);
-static void initerr(perrdetail *err_ret, const char* filename);
+static int initerr(perrdetail *err_ret, const char* filename);
/* Parse input coming from a string. Return error code, print some errors. */
node *
@@ -48,7 +48,8 @@ PyParser_ParseStringFlagsFilenameEx(const char *s, const char *filename,
struct tok_state *tok;
int exec_input = start == file_input;
- initerr(err_ret, filename);
+ if (initerr(err_ret, filename) < 0)
+ return NULL;
if (*flags & PyPARSE_IGNORE_COOKIE)
tok = PyTokenizer_FromUTF8(s, exec_input);
@@ -59,7 +60,10 @@ PyParser_ParseStringFlagsFilenameEx(const char *s, const char *filename,
return NULL;
}
- tok->filename = filename ? filename : "<string>";
+#ifndef PGEN
+ Py_INCREF(err_ret->filename);
+ tok->filename = err_ret->filename;
+#endif
return parsetok(tok, g, start, err_ret, flags);
}
@@ -90,13 +94,17 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename,
{
struct tok_state *tok;
- initerr(err_ret, filename);
+ if (initerr(err_ret, filename) < 0)
+ return NULL;
if ((tok = PyTokenizer_FromFile(fp, (char *)enc, ps1, ps2)) == NULL) {
err_ret->error = E_NOMEM;
return NULL;
}
- tok->filename = filename;
+#ifndef PGEN
+ Py_INCREF(err_ret->filename);
+ tok->filename = err_ret->filename;
+#endif
return parsetok(tok, g, start, err_ret, flags);
}
@@ -216,6 +224,36 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
if (err_ret->error == E_DONE) {
n = ps->p_tree;
ps->p_tree = NULL;
+
+#ifndef PGEN
+ /* Check that the source for a single input statement really
+ is a single statement by looking at what is left in the
+ buffer after parsing. Trailing whitespace and comments
+ are OK. */
+ if (start == single_input) {
+ char *cur = tok->cur;
+ char c = *tok->cur;
+
+ for (;;) {
+ while (c == ' ' || c == '\t' || c == '\n' || c == '\014')
+ c = *++cur;
+
+ if (!c)
+ break;
+
+ if (c != '#') {
+ err_ret->error = E_BADSINGLE;
+ PyNode_Free(n);
+ n = NULL;
+ break;
+ }
+
+ /* Suck up comment. */
+ while (c && c != '\n')
+ c = *++cur;
+ }
+ }
+#endif
}
else
n = NULL;
@@ -226,7 +264,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
PyParser_Delete(ps);
if (n == NULL) {
- if (tok->lineno <= 1 && tok->done == E_EOF)
+ if (tok->done == E_EOF)
err_ret->error = E_EOF;
err_ret->lineno = tok->lineno;
if (tok->buf != NULL) {
@@ -269,14 +307,24 @@ done:
return n;
}
-static void
+static int
initerr(perrdetail *err_ret, const char *filename)
{
err_ret->error = E_OK;
- err_ret->filename = filename;
err_ret->lineno = 0;
err_ret->offset = 0;
err_ret->text = NULL;
err_ret->token = -1;
err_ret->expected = -1;
+#ifndef PGEN
+ if (filename)
+ err_ret->filename = PyUnicode_DecodeFSDefault(filename);
+ else
+ err_ret->filename = PyUnicode_FromString("<string>");
+ if (err_ret->filename == NULL) {
+ err_ret->error = E_ERROR;
+ return -1;
+ }
+#endif
+ return 0;
}
diff --git a/Parser/parsetok_pgen.c b/Parser/parsetok_pgen.c
new file mode 100644
index 0000000..97b9288
--- /dev/null
+++ b/Parser/parsetok_pgen.c
@@ -0,0 +1,2 @@
+#define PGEN
+#include "parsetok.c"
diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c
index 4b7b55a..52b8380 100644
--- a/Parser/pgenmain.c
+++ b/Parser/pgenmain.c
@@ -29,6 +29,8 @@ int Py_IgnoreEnvironmentFlag;
/* Forward */
grammar *getgrammar(char *filename);
+void Py_Exit(int) _Py_NO_RETURN;
+
void
Py_Exit(int sts)
{
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 5ba12a4..93a4a5c 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -128,7 +128,6 @@ tok_new(void)
tok->prompt = tok->nextprompt = NULL;
tok->lineno = 0;
tok->level = 0;
- tok->filename = NULL;
tok->altwarning = 1;
tok->alterror = 1;
tok->alttabsize = 1;
@@ -140,6 +139,7 @@ tok_new(void)
tok->encoding = NULL;
tok->cont_line = 0;
#ifndef PGEN
+ tok->filename = NULL;
tok->decoding_readline = NULL;
tok->decoding_buffer = NULL;
#endif
@@ -462,6 +462,8 @@ static int
fp_setreadl(struct tok_state *tok, const char* enc)
{
PyObject *readline = NULL, *stream = NULL, *io = NULL;
+ _Py_IDENTIFIER(open);
+ _Py_IDENTIFIER(readline);
int fd;
io = PyImport_ImportModuleNoBlock("io");
@@ -474,13 +476,13 @@ fp_setreadl(struct tok_state *tok, const char* enc)
goto cleanup;
}
- stream = PyObject_CallMethod(io, "open", "isisOOO",
+ stream = _PyObject_CallMethodId(io, &PyId_open, "isisOOO",
fd, "r", -1, enc, Py_None, Py_None, Py_False);
if (stream == NULL)
goto cleanup;
Py_XDECREF(tok->decoding_readline);
- readline = PyObject_GetAttrString(stream, "readline");
+ readline = _PyObject_GetAttrId(stream, &PyId_readline);
tok->decoding_readline = readline;
/* The file has been reopened; parsing will restart from
@@ -545,7 +547,6 @@ decoding_fgets(char *s, int size, struct tok_state *tok)
{
char *line = NULL;
int badchar = 0;
- PyObject *filename;
for (;;) {
if (tok->decoding_state == STATE_NORMAL) {
/* We already have a codec associated with
@@ -586,19 +587,12 @@ decoding_fgets(char *s, int size, struct tok_state *tok)
if (badchar) {
/* Need to add 1 to the line number, since this line
has not been counted, yet. */
- if (tok->filename != NULL)
- filename = PyUnicode_DecodeFSDefault(tok->filename);
- else
- filename = PyUnicode_FromString("<file>");
- if (filename != NULL) {
- PyErr_Format(PyExc_SyntaxError,
- "Non-UTF-8 code starting with '\\x%.2x' "
- "in file %U on line %i, "
- "but no encoding declared; "
- "see http://python.org/dev/peps/pep-0263/ for details",
- badchar, filename, tok->lineno + 1);
- Py_DECREF(filename);
- }
+ PyErr_Format(PyExc_SyntaxError,
+ "Non-UTF-8 code starting with '\\x%.2x' "
+ "in file %U on line %i, "
+ "but no encoding declared; "
+ "see http://python.org/dev/peps/pep-0263/ for details",
+ badchar, tok->filename, tok->lineno + 1);
return error_ret(tok);
}
#endif
@@ -856,6 +850,7 @@ PyTokenizer_Free(struct tok_state *tok)
#ifndef PGEN
Py_XDECREF(tok->decoding_readline);
Py_XDECREF(tok->decoding_buffer);
+ Py_XDECREF(tok->filename);
#endif
if (tok->fp != NULL && tok->buf != NULL)
PyMem_FREE(tok->buf);
@@ -1250,8 +1245,13 @@ indenterror(struct tok_state *tok)
return 1;
}
if (tok->altwarning) {
- PySys_WriteStderr("%s: inconsistent use of tabs and spaces "
+#ifdef PGEN
+ PySys_WriteStderr("inconsistent use of tabs and spaces "
+ "in indentation\n");
+#else
+ PySys_FormatStderr("%U: inconsistent use of tabs and spaces "
"in indentation\n", tok->filename);
+#endif
tok->altwarning = 0;
}
return 0;
@@ -1260,14 +1260,16 @@ indenterror(struct tok_state *tok)
#ifdef PGEN
#define verify_identifier(tok) 1
#else
-/* Verify that the identifier follows PEP 3131. */
+/* Verify that the identifier follows PEP 3131.
+ All identifier strings are guaranteed to be "ready" unicode objects.
+ */
static int
verify_identifier(struct tok_state *tok)
{
PyObject *s;
int result;
s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL);
- if (s == NULL) {
+ if (s == NULL || PyUnicode_READY(s) == -1) {
if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
PyErr_Clear();
tok->done = E_IDENTIFIER;
@@ -1410,13 +1412,20 @@ tok_get(register struct tok_state *tok, char **p_start, char **p_end)
/* Identifier (most frequent token!) */
nonascii = 0;
if (is_potential_identifier_start(c)) {
- /* Process b"", r"" and br"" */
- if (c == 'b' || c == 'B') {
- c = tok_nextc(tok);
- if (c == '"' || c == '\'')
- goto letter_quote;
- }
- if (c == 'r' || c == 'R') {
+ /* Process b"", r"", u"", br"" and rb"" */
+ int saw_b = 0, saw_r = 0, saw_u = 0;
+ while (1) {
+ if (!(saw_b || saw_u) && (c == 'b' || c == 'B'))
+ saw_b = 1;
+ /* Since this is a backwards compatibility support literal we don't
+ want to support it in arbitrary order like byte literals. */
+ else if (!(saw_b || saw_u || saw_r) && (c == 'u' || c == 'U'))
+ saw_u = 1;
+ /* ur"" and ru"" are not supported */
+ else if (!(saw_r || saw_u) && (c == 'r' || c == 'R'))
+ saw_r = 1;
+ else
+ break;
c = tok_nextc(tok);
if (c == '"' || c == '\'')
goto letter_quote;
@@ -1692,17 +1701,18 @@ PyTokenizer_Get(struct tok_state *tok, char **p_start, char **p_end)
return result;
}
-/* Get -*- encoding -*- from a Python file.
+/* Get the encoding of a Python file. Check for the coding cookie and check if
+ the file starts with a BOM.
- PyTokenizer_FindEncoding returns NULL when it can't find the encoding in
- the first or second line of the file (in which case the encoding
- should be assumed to be PyUnicode_GetDefaultEncoding()).
+ PyTokenizer_FindEncodingFilename() returns NULL when it can't find the
+ encoding in the first or second line of the file (in which case the encoding
+ should be assumed to be UTF-8).
+
+ The char* returned is malloc'ed via PyMem_MALLOC() and thus must be freed
+ by the caller. */
- The char * returned is malloc'ed via PyMem_MALLOC() and thus must be freed
- by the caller.
-*/
char *
-PyTokenizer_FindEncoding(int fd)
+PyTokenizer_FindEncodingFilename(int fd, PyObject *filename)
{
struct tok_state *tok;
FILE *fp;
@@ -1721,6 +1731,20 @@ PyTokenizer_FindEncoding(int fd)
fclose(fp);
return NULL;
}
+#ifndef PGEN
+ if (filename != NULL) {
+ Py_INCREF(filename);
+ tok->filename = filename;
+ }
+ else {
+ tok->filename = PyUnicode_FromString("<string>");
+ if (tok->filename == NULL) {
+ fclose(fp);
+ PyTokenizer_Free(tok);
+ return encoding;
+ }
+ }
+#endif
while (tok->lineno < 2 && tok->done == E_OK) {
PyTokenizer_Get(tok, &p_start, &p_end);
}
@@ -1734,6 +1758,12 @@ PyTokenizer_FindEncoding(int fd)
return encoding;
}
+char *
+PyTokenizer_FindEncoding(int fd)
+{
+ return PyTokenizer_FindEncodingFilename(fd, NULL);
+}
+
#ifdef Py_DEBUG
void
diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h
index 2be3bf2..ed1f3aa 100644
--- a/Parser/tokenizer.h
+++ b/Parser/tokenizer.h
@@ -40,7 +40,13 @@ struct tok_state {
int level; /* () [] {} Parentheses nesting level */
/* Used to allow free continuations inside them */
/* Stuff for checking on different tab sizes */
- const char *filename; /* encoded to the filesystem encoding */
+#ifndef PGEN
+ /* pgen doesn't have access to Python codecs, it cannot decode the input
+ filename. The bytes filename might be kept, but it is only used by
+ indenterror() and it is not really needed: pgen only compiles one file
+ (Grammar/Grammar). */
+ PyObject *filename;
+#endif
int altwarning; /* Issue warning if alternate tabs don't match */
int alterror; /* Issue error if alternate tabs don't match */
int alttabsize; /* Alternate tab spacing */
@@ -69,7 +75,6 @@ extern void PyTokenizer_Free(struct tok_state *);
extern int PyTokenizer_Get(struct tok_state *, char **, char **);
extern char * PyTokenizer_RestoreEncoding(struct tok_state* tok,
int len, int *offset);
-extern char * PyTokenizer_FindEncoding(int);
#ifdef __cplusplus
}
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index a276b6c..805f2b8 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -1,13 +1,6 @@
/* File automatically generated by Parser/asdl_c.py. */
-
-/*
- __version__ 82163.
-
- This module must be committed separately after each AST grammar change;
- The __version__ number is set to the revision number of the commit
- containing the grammar change.
-*/
+#include <stddef.h>
#include "Python.h"
#include "Python-ast.h"
@@ -16,6 +9,7 @@ static PyTypeObject AST_type;
static PyTypeObject *mod_type;
static PyObject* ast2obj_mod(void*);
static PyTypeObject *Module_type;
+_Py_IDENTIFIER(body);
static char *Module_fields[]={
"body",
};
@@ -32,12 +26,18 @@ static char *Suite_fields[]={
"body",
};
static PyTypeObject *stmt_type;
+_Py_IDENTIFIER(lineno);
+_Py_IDENTIFIER(col_offset);
static char *stmt_attributes[] = {
"lineno",
"col_offset",
};
static PyObject* ast2obj_stmt(void*);
static PyTypeObject *FunctionDef_type;
+_Py_IDENTIFIER(name);
+_Py_IDENTIFIER(args);
+_Py_IDENTIFIER(decorator_list);
+_Py_IDENTIFIER(returns);
static char *FunctionDef_fields[]={
"name",
"args",
@@ -46,6 +46,10 @@ static char *FunctionDef_fields[]={
"returns",
};
static PyTypeObject *ClassDef_type;
+_Py_IDENTIFIER(bases);
+_Py_IDENTIFIER(keywords);
+_Py_IDENTIFIER(starargs);
+_Py_IDENTIFIER(kwargs);
static char *ClassDef_fields[]={
"name",
"bases",
@@ -56,10 +60,12 @@ static char *ClassDef_fields[]={
"decorator_list",
};
static PyTypeObject *Return_type;
+_Py_IDENTIFIER(value);
static char *Return_fields[]={
"value",
};
static PyTypeObject *Delete_type;
+_Py_IDENTIFIER(targets);
static char *Delete_fields[]={
"targets",
};
@@ -69,12 +75,16 @@ static char *Assign_fields[]={
"value",
};
static PyTypeObject *AugAssign_type;
+_Py_IDENTIFIER(target);
+_Py_IDENTIFIER(op);
static char *AugAssign_fields[]={
"target",
"op",
"value",
};
static PyTypeObject *For_type;
+_Py_IDENTIFIER(iter);
+_Py_IDENTIFIER(orelse);
static char *For_fields[]={
"target",
"iter",
@@ -82,6 +92,7 @@ static char *For_fields[]={
"orelse",
};
static PyTypeObject *While_type;
+_Py_IDENTIFIER(test);
static char *While_fields[]={
"test",
"body",
@@ -94,37 +105,41 @@ static char *If_fields[]={
"orelse",
};
static PyTypeObject *With_type;
+_Py_IDENTIFIER(items);
static char *With_fields[]={
- "context_expr",
- "optional_vars",
+ "items",
"body",
};
static PyTypeObject *Raise_type;
+_Py_IDENTIFIER(exc);
+_Py_IDENTIFIER(cause);
static char *Raise_fields[]={
"exc",
"cause",
};
-static PyTypeObject *TryExcept_type;
-static char *TryExcept_fields[]={
+static PyTypeObject *Try_type;
+_Py_IDENTIFIER(handlers);
+_Py_IDENTIFIER(finalbody);
+static char *Try_fields[]={
"body",
"handlers",
"orelse",
-};
-static PyTypeObject *TryFinally_type;
-static char *TryFinally_fields[]={
- "body",
"finalbody",
};
static PyTypeObject *Assert_type;
+_Py_IDENTIFIER(msg);
static char *Assert_fields[]={
"test",
"msg",
};
static PyTypeObject *Import_type;
+_Py_IDENTIFIER(names);
static char *Import_fields[]={
"names",
};
static PyTypeObject *ImportFrom_type;
+_Py_IDENTIFIER(module);
+_Py_IDENTIFIER(level);
static char *ImportFrom_fields[]={
"module",
"names",
@@ -152,17 +167,21 @@ static char *expr_attributes[] = {
};
static PyObject* ast2obj_expr(void*);
static PyTypeObject *BoolOp_type;
+_Py_IDENTIFIER(values);
static char *BoolOp_fields[]={
"op",
"values",
};
static PyTypeObject *BinOp_type;
+_Py_IDENTIFIER(left);
+_Py_IDENTIFIER(right);
static char *BinOp_fields[]={
"left",
"op",
"right",
};
static PyTypeObject *UnaryOp_type;
+_Py_IDENTIFIER(operand);
static char *UnaryOp_fields[]={
"op",
"operand",
@@ -179,15 +198,19 @@ static char *IfExp_fields[]={
"orelse",
};
static PyTypeObject *Dict_type;
+_Py_IDENTIFIER(keys);
static char *Dict_fields[]={
"keys",
"values",
};
static PyTypeObject *Set_type;
+_Py_IDENTIFIER(elts);
static char *Set_fields[]={
"elts",
};
static PyTypeObject *ListComp_type;
+_Py_IDENTIFIER(elt);
+_Py_IDENTIFIER(generators);
static char *ListComp_fields[]={
"elt",
"generators",
@@ -198,6 +221,7 @@ static char *SetComp_fields[]={
"generators",
};
static PyTypeObject *DictComp_type;
+_Py_IDENTIFIER(key);
static char *DictComp_fields[]={
"key",
"value",
@@ -212,13 +236,20 @@ static PyTypeObject *Yield_type;
static char *Yield_fields[]={
"value",
};
+static PyTypeObject *YieldFrom_type;
+static char *YieldFrom_fields[]={
+ "value",
+};
static PyTypeObject *Compare_type;
+_Py_IDENTIFIER(ops);
+_Py_IDENTIFIER(comparators);
static char *Compare_fields[]={
"left",
"ops",
"comparators",
};
static PyTypeObject *Call_type;
+_Py_IDENTIFIER(func);
static char *Call_fields[]={
"func",
"args",
@@ -227,10 +258,12 @@ static char *Call_fields[]={
"kwargs",
};
static PyTypeObject *Num_type;
+_Py_IDENTIFIER(n);
static char *Num_fields[]={
"n",
};
static PyTypeObject *Str_type;
+_Py_IDENTIFIER(s);
static char *Str_fields[]={
"s",
};
@@ -240,12 +273,15 @@ static char *Bytes_fields[]={
};
static PyTypeObject *Ellipsis_type;
static PyTypeObject *Attribute_type;
+_Py_IDENTIFIER(attr);
+_Py_IDENTIFIER(ctx);
static char *Attribute_fields[]={
"value",
"attr",
"ctx",
};
static PyTypeObject *Subscript_type;
+_Py_IDENTIFIER(slice);
static char *Subscript_fields[]={
"value",
"slice",
@@ -257,6 +293,7 @@ static char *Starred_fields[]={
"ctx",
};
static PyTypeObject *Name_type;
+_Py_IDENTIFIER(id);
static char *Name_fields[]={
"id",
"ctx",
@@ -284,12 +321,16 @@ static PyTypeObject *Param_type;
static PyTypeObject *slice_type;
static PyObject* ast2obj_slice(void*);
static PyTypeObject *Slice_type;
+_Py_IDENTIFIER(lower);
+_Py_IDENTIFIER(upper);
+_Py_IDENTIFIER(step);
static char *Slice_fields[]={
"lower",
"upper",
"step",
};
static PyTypeObject *ExtSlice_type;
+_Py_IDENTIFIER(dims);
static char *ExtSlice_fields[]={
"dims",
};
@@ -345,6 +386,7 @@ static PyTypeObject *In_type;
static PyTypeObject *NotIn_type;
static PyTypeObject *comprehension_type;
static PyObject* ast2obj_comprehension(void*);
+_Py_IDENTIFIER(ifs);
static char *comprehension_fields[]={
"target",
"iter",
@@ -357,6 +399,7 @@ static char *excepthandler_attributes[] = {
};
static PyObject* ast2obj_excepthandler(void*);
static PyTypeObject *ExceptHandler_type;
+_Py_IDENTIFIER(type);
static char *ExceptHandler_fields[]={
"type",
"name",
@@ -364,6 +407,13 @@ static char *ExceptHandler_fields[]={
};
static PyTypeObject *arguments_type;
static PyObject* ast2obj_arguments(void*);
+_Py_IDENTIFIER(vararg);
+_Py_IDENTIFIER(varargannotation);
+_Py_IDENTIFIER(kwonlyargs);
+_Py_IDENTIFIER(kwarg);
+_Py_IDENTIFIER(kwargannotation);
+_Py_IDENTIFIER(defaults);
+_Py_IDENTIFIER(kw_defaults);
static char *arguments_fields[]={
"args",
"vararg",
@@ -376,6 +426,8 @@ static char *arguments_fields[]={
};
static PyTypeObject *arg_type;
static PyObject* ast2obj_arg(void*);
+_Py_IDENTIFIER(arg);
+_Py_IDENTIFIER(annotation);
static char *arg_fields[]={
"arg",
"annotation",
@@ -388,19 +440,54 @@ static char *keyword_fields[]={
};
static PyTypeObject *alias_type;
static PyObject* ast2obj_alias(void*);
+_Py_IDENTIFIER(asname);
static char *alias_fields[]={
"name",
"asname",
};
+static PyTypeObject *withitem_type;
+static PyObject* ast2obj_withitem(void*);
+_Py_IDENTIFIER(context_expr);
+_Py_IDENTIFIER(optional_vars);
+static char *withitem_fields[]={
+ "context_expr",
+ "optional_vars",
+};
+
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *dict;
+} AST_object;
+static void
+ast_dealloc(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+ast_traverse(AST_object *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->dict);
+ return 0;
+}
+
+static void
+ast_clear(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+}
static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{
+ _Py_IDENTIFIER(_fields);
Py_ssize_t i, numfields = 0;
int res = -1;
PyObject *key, *value, *fields;
- fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
+ fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);
if (!fields)
PyErr_Clear();
if (fields) {
@@ -450,7 +537,8 @@ static PyObject *
ast_type_reduce(PyObject *self, PyObject *unused)
{
PyObject *res;
- PyObject *dict = PyObject_GetAttrString(self, "__dict__");
+ _Py_IDENTIFIER(__dict__);
+ PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
if (dict == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -470,12 +558,17 @@ static PyMethodDef ast_type_methods[] = {
{NULL}
};
+static PyGetSetDef ast_type_getsets[] = {
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
+ {NULL}
+};
+
static PyTypeObject AST_type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"_ast.AST",
- sizeof(PyObject),
+ sizeof(AST_object),
0,
- 0, /* tp_dealloc */
+ (destructor)ast_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
@@ -490,26 +583,26 @@ static PyTypeObject AST_type = {
PyObject_GenericGetAttr, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
+ (traverseproc)ast_traverse, /* tp_traverse */
+ (inquiry)ast_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
ast_type_methods, /* tp_methods */
0, /* tp_members */
- 0, /* tp_getset */
+ ast_type_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(AST_object, dict),/* tp_dictoffset */
(initproc)ast_type_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
- PyObject_Del, /* tp_free */
+ PyObject_GC_Del, /* tp_free */
};
@@ -536,6 +629,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int
static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{
int i, result;
+ _Py_IDENTIFIER(_attributes);
PyObject *s, *l = PyTuple_New(num_fields);
if (!l)
return 0;
@@ -547,7 +641,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
}
PyTuple_SET_ITEM(l, i, s);
}
- result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
+ result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Py_DECREF(l);
return result;
}
@@ -556,7 +650,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
{
- int i, n = asdl_seq_LEN(seq);
+ Py_ssize_t i, n = asdl_seq_LEN(seq);
PyObject *result = PyList_New(n);
PyObject *value;
if (!result)
@@ -581,6 +675,7 @@ static PyObject* ast2obj_object(void *o)
}
#define ast2obj_identifier ast2obj_object
#define ast2obj_string ast2obj_object
+#define ast2obj_bytes ast2obj_object
static PyObject* ast2obj_int(long b)
{
@@ -618,6 +713,15 @@ static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
return obj2ast_object(obj, out, arena);
}
+static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
+{
+ if (!PyBytes_CheckExact(obj)) {
+ PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
+ return 1;
+ }
+ return obj2ast_object(obj, out, arena);
+}
+
static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
{
int i;
@@ -691,15 +795,12 @@ static int init_types(void)
if (!While_type) return 0;
If_type = make_type("If", stmt_type, If_fields, 3);
if (!If_type) return 0;
- With_type = make_type("With", stmt_type, With_fields, 3);
+ With_type = make_type("With", stmt_type, With_fields, 2);
if (!With_type) return 0;
Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
if (!Raise_type) return 0;
- TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3);
- if (!TryExcept_type) return 0;
- TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields,
- 2);
- if (!TryFinally_type) return 0;
+ Try_type = make_type("Try", stmt_type, Try_fields, 4);
+ if (!Try_type) return 0;
Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
if (!Assert_type) return 0;
Import_type = make_type("Import", stmt_type, Import_fields, 1);
@@ -747,6 +848,8 @@ static int init_types(void)
if (!GeneratorExp_type) return 0;
Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
if (!Yield_type) return 0;
+ YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
+ if (!YieldFrom_type) return 0;
Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
if (!Compare_type) return 0;
Call_type = make_type("Call", expr_type, Call_fields, 5);
@@ -949,6 +1052,8 @@ static int init_types(void)
if (!keyword_type) return 0;
alias_type = make_type("alias", &AST_type, alias_fields, 2);
if (!alias_type) return 0;
+ withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
+ if (!withitem_type) return 0;
initialized = 1;
return 1;
}
@@ -971,6 +1076,7 @@ static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
+static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
mod_ty
Module(asdl_seq * body, PyArena *arena)
@@ -1236,21 +1342,15 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
}
stmt_ty
-With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno,
- int col_offset, PyArena *arena)
+With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
+ *arena)
{
stmt_ty p;
- if (!context_expr) {
- PyErr_SetString(PyExc_ValueError,
- "field context_expr is required for With");
- return NULL;
- }
p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
p->kind = With_kind;
- p->v.With.context_expr = context_expr;
- p->v.With.optional_vars = optional_vars;
+ p->v.With.items = items;
p->v.With.body = body;
p->lineno = lineno;
p->col_offset = col_offset;
@@ -1273,33 +1373,18 @@ Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
}
stmt_ty
-TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno,
- int col_offset, PyArena *arena)
-{
- stmt_ty p;
- p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
- if (!p)
- return NULL;
- p->kind = TryExcept_kind;
- p->v.TryExcept.body = body;
- p->v.TryExcept.handlers = handlers;
- p->v.TryExcept.orelse = orelse;
- p->lineno = lineno;
- p->col_offset = col_offset;
- return p;
-}
-
-stmt_ty
-TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset,
- PyArena *arena)
+Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
+ finalbody, int lineno, int col_offset, PyArena *arena)
{
stmt_ty p;
p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
- p->kind = TryFinally_kind;
- p->v.TryFinally.body = body;
- p->v.TryFinally.finalbody = finalbody;
+ p->kind = Try_kind;
+ p->v.Try.body = body;
+ p->v.Try.handlers = handlers;
+ p->v.Try.orelse = orelse;
+ p->v.Try.finalbody = finalbody;
p->lineno = lineno;
p->col_offset = col_offset;
return p;
@@ -1714,6 +1799,20 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
}
expr_ty
+YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
+{
+ expr_ty p;
+ p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = YieldFrom_kind;
+ p->v.YieldFrom.value = value;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ return p;
+}
+
+expr_ty
Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
int col_offset, PyArena *arena)
{
@@ -1798,7 +1897,7 @@ Str(string s, int lineno, int col_offset, PyArena *arena)
}
expr_ty
-Bytes(string s, int lineno, int col_offset, PyArena *arena)
+Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
{
expr_ty p;
if (!s) {
@@ -2146,6 +2245,23 @@ alias(identifier name, identifier asname, PyArena *arena)
return p;
}
+withitem_ty
+withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
+{
+ withitem_ty p;
+ if (!context_expr) {
+ PyErr_SetString(PyExc_ValueError,
+ "field context_expr is required for withitem");
+ return NULL;
+ }
+ p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->context_expr = context_expr;
+ p->optional_vars = optional_vars;
+ return p;
+}
+
PyObject*
ast2obj_mod(void* _o)
@@ -2163,7 +2279,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2172,7 +2288,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2181,7 +2297,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Expression.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2190,7 +2306,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2218,29 +2334,29 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.FunctionDef.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_arguments(o->v.FunctionDef.args);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.FunctionDef.decorator_list,
ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "decorator_list", value) ==
+ if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==
-1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.FunctionDef.returns);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "returns", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2249,38 +2365,38 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.ClassDef.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "bases", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keywords", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.ClassDef.starargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "starargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.ClassDef.kwargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.decorator_list,
ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "decorator_list", value) ==
+ if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==
-1)
goto failed;
Py_DECREF(value);
@@ -2290,7 +2406,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Return.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2299,7 +2415,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "targets", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2308,12 +2424,12 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "targets", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Assign.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2322,17 +2438,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.AugAssign.target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_operator(o->v.AugAssign.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.AugAssign.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2341,22 +2457,22 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.For.target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.For.iter);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "iter", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.For.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2365,17 +2481,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.While.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.While.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2384,37 +2500,31 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.If.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.If.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
case With_kind:
result = PyType_GenericNew(With_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_expr(o->v.With.context_expr);
+ value = ast2obj_list(o->v.With.items, ast2obj_withitem);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "context_expr", value) == -1)
- goto failed;
- Py_DECREF(value);
- value = ast2obj_expr(o->v.With.optional_vars);
- if (!value) goto failed;
- if (PyObject_SetAttrString(result, "optional_vars", value) ==
- -1)
+ if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.With.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2423,46 +2533,36 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Raise.exc);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "exc", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Raise.cause);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "cause", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
goto failed;
Py_DECREF(value);
break;
- case TryExcept_kind:
- result = PyType_GenericNew(TryExcept_type, NULL, NULL);
+ case Try_kind:
+ result = PyType_GenericNew(Try_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_list(o->v.TryExcept.body, ast2obj_stmt);
- if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
- goto failed;
- Py_DECREF(value);
- value = ast2obj_list(o->v.TryExcept.handlers,
- ast2obj_excepthandler);
+ value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "handlers", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
- value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
goto failed;
Py_DECREF(value);
- break;
- case TryFinally_kind:
- result = PyType_GenericNew(TryFinally_type, NULL, NULL);
- if (!result) goto failed;
- value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
- value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "finalbody", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2471,12 +2571,12 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Assert.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Assert.msg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "msg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2485,7 +2585,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Import.names, ast2obj_alias);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2494,17 +2594,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.ImportFrom.module);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "module", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->v.ImportFrom.level);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "level", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2513,7 +2613,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2522,7 +2622,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2531,7 +2631,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Expr.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2550,12 +2650,12 @@ ast2obj_stmt(void* _o)
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -2581,12 +2681,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_boolop(o->v.BoolOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "values", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2595,17 +2695,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.BinOp.left);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "left", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_operator(o->v.BinOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.BinOp.right);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "right", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2614,12 +2714,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_unaryop(o->v.UnaryOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.UnaryOp.operand);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "operand", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2628,12 +2728,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_arguments(o->v.Lambda.args);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Lambda.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2642,17 +2742,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.IfExp.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.IfExp.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.IfExp.orelse);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2661,12 +2761,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keys", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "values", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2675,7 +2775,7 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2684,13 +2784,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.ListComp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ListComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2699,13 +2799,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.SetComp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.SetComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2714,18 +2814,18 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.DictComp.key);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "key", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.DictComp.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.DictComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2734,13 +2834,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.GeneratorExp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.GeneratorExp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2749,7 +2849,16 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Yield.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
+ case YieldFrom_kind:
+ result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_expr(o->v.YieldFrom.value);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2758,23 +2867,23 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Compare.left);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "left", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
goto failed;
Py_DECREF(value);
{
- int i, n = asdl_seq_LEN(o->v.Compare.ops);
+ Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
value = PyList_New(n);
if (!value) goto failed;
for(i = 0; i < n; i++)
PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
}
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ops", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "comparators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2783,27 +2892,27 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Call.func);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "func", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Call.args, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keywords", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Call.starargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "starargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Call.kwargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2812,7 +2921,7 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_object(o->v.Num.n);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "n", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2821,16 +2930,16 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_string(o->v.Str.s);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "s", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
goto failed;
Py_DECREF(value);
break;
case Bytes_kind:
result = PyType_GenericNew(Bytes_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_string(o->v.Bytes.s);
+ value = ast2obj_bytes(o->v.Bytes.s);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "s", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2843,17 +2952,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Attribute.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->v.Attribute.attr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "attr", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Attribute.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2862,17 +2971,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Subscript.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_slice(o->v.Subscript.slice);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "slice", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Subscript.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2881,12 +2990,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Starred.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Starred.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2895,12 +3004,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.Name.id);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "id", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Name.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2909,12 +3018,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.List.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.List.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2923,24 +3032,24 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Tuple.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -2993,17 +3102,17 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Slice.lower);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lower", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Slice.upper);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "upper", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Slice.step);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "step", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3012,7 +3121,7 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "dims", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3021,7 +3130,7 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Index.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3167,17 +3276,17 @@ ast2obj_comprehension(void* _o)
if (!result) return NULL;
value = ast2obj_expr(o->target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->iter);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "iter", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->ifs, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ifs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3203,29 +3312,29 @@ ast2obj_excepthandler(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.ExceptHandler.type);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "type", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->v.ExceptHandler.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -3249,42 +3358,42 @@ ast2obj_arguments(void* _o)
if (!result) return NULL;
value = ast2obj_list(o->args, ast2obj_arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->vararg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "vararg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->varargannotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "varargannotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_varargannotation, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->kwarg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwarg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->kwargannotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargannotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargannotation, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->defaults, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "defaults", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->kw_defaults, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kw_defaults", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3308,12 +3417,12 @@ ast2obj_arg(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "arg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->annotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "annotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3337,12 +3446,12 @@ ast2obj_keyword(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "arg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3366,12 +3475,41 @@ ast2obj_alias(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->asname);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "asname", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ return result;
+failed:
+ Py_XDECREF(value);
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyObject*
+ast2obj_withitem(void* _o)
+{
+ withitem_ty o = (withitem_ty)_o;
+ PyObject *result = NULL, *value = NULL;
+ if (!o) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ result = PyType_GenericNew(withitem_type, NULL, NULL);
+ if (!result) return NULL;
+ value = ast2obj_expr(o->context_expr);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_expr(o->optional_vars);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3400,11 +3538,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3436,11 +3574,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3472,9 +3610,9 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
expr_ty body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -3495,11 +3633,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3544,9 +3682,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -3556,9 +3694,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -3579,9 +3717,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* decorator_list;
expr_ty returns;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -3591,9 +3729,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
res = obj2ast_arguments(tmp, &args, arena);
if (res != 0) goto failed;
@@ -3603,11 +3741,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3628,11 +3766,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "decorator_list")) {
+ if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "decorator_list");
+ tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3653,9 +3791,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "returns")) {
+ if (_PyObject_HasAttrId(obj, &PyId_returns)) {
int res;
- tmp = PyObject_GetAttrString(obj, "returns");
+ tmp = _PyObject_GetAttrId(obj, &PyId_returns);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &returns, arena);
if (res != 0) goto failed;
@@ -3682,9 +3820,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* decorator_list;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -3694,11 +3832,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "bases")) {
+ if (_PyObject_HasAttrId(obj, &PyId_bases)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "bases");
+ tmp = _PyObject_GetAttrId(obj, &PyId_bases);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3719,11 +3857,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "keywords")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keywords");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3744,9 +3882,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "starargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "starargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &starargs, arena);
if (res != 0) goto failed;
@@ -3755,9 +3893,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
starargs = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargs, arena);
if (res != 0) goto failed;
@@ -3766,11 +3904,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
kwargs = NULL;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3791,11 +3929,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "decorator_list")) {
+ if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "decorator_list");
+ tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3828,9 +3966,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3850,11 +3988,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* targets;
- if (PyObject_HasAttrString(obj, "targets")) {
+ if (_PyObject_HasAttrId(obj, &PyId_targets)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "targets");
+ tmp = _PyObject_GetAttrId(obj, &PyId_targets);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3887,11 +4025,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* targets;
expr_ty value;
- if (PyObject_HasAttrString(obj, "targets")) {
+ if (_PyObject_HasAttrId(obj, &PyId_targets)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "targets");
+ tmp = _PyObject_GetAttrId(obj, &PyId_targets);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3912,9 +4050,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3937,9 +4075,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
operator_ty op;
expr_ty value;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -3949,9 +4087,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
return 1;
}
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_operator(tmp, &op, arena);
if (res != 0) goto failed;
@@ -3961,9 +4099,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3987,9 +4125,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -3999,9 +4137,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "iter")) {
+ if (_PyObject_HasAttrId(obj, &PyId_iter)) {
int res;
- tmp = PyObject_GetAttrString(obj, "iter");
+ tmp = _PyObject_GetAttrId(obj, &PyId_iter);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &iter, arena);
if (res != 0) goto failed;
@@ -4011,11 +4149,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4036,11 +4174,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4075,9 +4213,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4087,11 +4225,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4112,11 +4250,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4150,9 +4288,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4162,11 +4300,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4187,11 +4325,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4221,38 +4359,39 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
return 1;
}
if (isinstance) {
- expr_ty context_expr;
- expr_ty optional_vars;
+ asdl_seq* items;
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "context_expr")) {
+ if (_PyObject_HasAttrId(obj, &PyId_items)) {
int res;
- tmp = PyObject_GetAttrString(obj, "context_expr");
+ Py_ssize_t len;
+ Py_ssize_t i;
+ tmp = _PyObject_GetAttrId(obj, &PyId_items);
if (tmp == NULL) goto failed;
- res = obj2ast_expr(tmp, &context_expr, arena);
- if (res != 0) goto failed;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ items = asdl_seq_new(len, arena);
+ if (items == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ withitem_ty value;
+ res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &value, arena);
+ if (res != 0) goto failed;
+ asdl_seq_SET(items, i, value);
+ }
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With");
+ PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
return 1;
}
- if (PyObject_HasAttrString(obj, "optional_vars")) {
- int res;
- tmp = PyObject_GetAttrString(obj, "optional_vars");
- if (tmp == NULL) goto failed;
- res = obj2ast_expr(tmp, &optional_vars, arena);
- if (res != 0) goto failed;
- Py_XDECREF(tmp);
- tmp = NULL;
- } else {
- optional_vars = NULL;
- }
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4273,8 +4412,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
return 1;
}
- *out = With(context_expr, optional_vars, body, lineno,
- col_offset, arena);
+ *out = With(items, body, lineno, col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -4286,9 +4424,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
expr_ty exc;
expr_ty cause;
- if (PyObject_HasAttrString(obj, "exc")) {
+ if (_PyObject_HasAttrId(obj, &PyId_exc)) {
int res;
- tmp = PyObject_GetAttrString(obj, "exc");
+ tmp = _PyObject_GetAttrId(obj, &PyId_exc);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &exc, arena);
if (res != 0) goto failed;
@@ -4297,9 +4435,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
exc = NULL;
}
- if (PyObject_HasAttrString(obj, "cause")) {
+ if (_PyObject_HasAttrId(obj, &PyId_cause)) {
int res;
- tmp = PyObject_GetAttrString(obj, "cause");
+ tmp = _PyObject_GetAttrId(obj, &PyId_cause);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &cause, arena);
if (res != 0) goto failed;
@@ -4312,7 +4450,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (*out == NULL) goto failed;
return 0;
}
- isinstance = PyObject_IsInstance(obj, (PyObject*)TryExcept_type);
+ isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
if (isinstance == -1) {
return 1;
}
@@ -4320,15 +4458,16 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* handlers;
asdl_seq* orelse;
+ asdl_seq* finalbody;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4343,17 +4482,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept");
+ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "handlers")) {
+ if (_PyObject_HasAttrId(obj, &PyId_handlers)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "handlers");
+ tmp = _PyObject_GetAttrId(obj, &PyId_handlers);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4368,17 +4507,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept");
+ PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4393,55 +4532,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept");
- return 1;
- }
- *out = TryExcept(body, handlers, orelse, lineno, col_offset,
- arena);
- if (*out == NULL) goto failed;
- return 0;
- }
- isinstance = PyObject_IsInstance(obj, (PyObject*)TryFinally_type);
- if (isinstance == -1) {
- return 1;
- }
- if (isinstance) {
- asdl_seq* body;
- asdl_seq* finalbody;
-
- if (PyObject_HasAttrString(obj, "body")) {
- int res;
- Py_ssize_t len;
- Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
- if (tmp == NULL) goto failed;
- if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
- goto failed;
- }
- len = PyList_GET_SIZE(tmp);
- body = asdl_seq_new(len, arena);
- if (body == NULL) goto failed;
- for (i = 0; i < len; i++) {
- stmt_ty value;
- res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
- if (res != 0) goto failed;
- asdl_seq_SET(body, i, value);
- }
- Py_XDECREF(tmp);
- tmp = NULL;
- } else {
- PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally");
+ PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "finalbody")) {
+ if (_PyObject_HasAttrId(obj, &PyId_finalbody)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "finalbody");
+ tmp = _PyObject_GetAttrId(obj, &PyId_finalbody);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4456,10 +4557,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally");
+ PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
return 1;
}
- *out = TryFinally(body, finalbody, lineno, col_offset, arena);
+ *out = Try(body, handlers, orelse, finalbody, lineno,
+ col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -4471,9 +4573,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
expr_ty test;
expr_ty msg;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4483,9 +4585,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
return 1;
}
- if (PyObject_HasAttrString(obj, "msg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_msg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "msg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_msg);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &msg, arena);
if (res != 0) goto failed;
@@ -4505,11 +4607,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4543,9 +4645,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* names;
int level;
- if (PyObject_HasAttrString(obj, "module")) {
+ if (_PyObject_HasAttrId(obj, &PyId_module)) {
int res;
- tmp = PyObject_GetAttrString(obj, "module");
+ tmp = _PyObject_GetAttrId(obj, &PyId_module);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &module, arena);
if (res != 0) goto failed;
@@ -4554,11 +4656,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
module = NULL;
}
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4579,9 +4681,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
return 1;
}
- if (PyObject_HasAttrString(obj, "level")) {
+ if (_PyObject_HasAttrId(obj, &PyId_level)) {
int res;
- tmp = PyObject_GetAttrString(obj, "level");
+ tmp = _PyObject_GetAttrId(obj, &PyId_level);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &level, arena);
if (res != 0) goto failed;
@@ -4602,11 +4704,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4638,11 +4740,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4674,9 +4776,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -4740,9 +4842,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -4752,9 +4854,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -4772,9 +4874,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
boolop_ty op;
asdl_seq* values;
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_boolop(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4784,11 +4886,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "values")) {
+ if (_PyObject_HasAttrId(obj, &PyId_values)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "values");
+ tmp = _PyObject_GetAttrId(obj, &PyId_values);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4822,9 +4924,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
operator_ty op;
expr_ty right;
- if (PyObject_HasAttrString(obj, "left")) {
+ if (_PyObject_HasAttrId(obj, &PyId_left)) {
int res;
- tmp = PyObject_GetAttrString(obj, "left");
+ tmp = _PyObject_GetAttrId(obj, &PyId_left);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &left, arena);
if (res != 0) goto failed;
@@ -4834,9 +4936,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_operator(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4846,9 +4948,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "right")) {
+ if (_PyObject_HasAttrId(obj, &PyId_right)) {
int res;
- tmp = PyObject_GetAttrString(obj, "right");
+ tmp = _PyObject_GetAttrId(obj, &PyId_right);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &right, arena);
if (res != 0) goto failed;
@@ -4870,9 +4972,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
unaryop_ty op;
expr_ty operand;
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_unaryop(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4882,9 +4984,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "operand")) {
+ if (_PyObject_HasAttrId(obj, &PyId_operand)) {
int res;
- tmp = PyObject_GetAttrString(obj, "operand");
+ tmp = _PyObject_GetAttrId(obj, &PyId_operand);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &operand, arena);
if (res != 0) goto failed;
@@ -4906,9 +5008,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
arguments_ty args;
expr_ty body;
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
res = obj2ast_arguments(tmp, &args, arena);
if (res != 0) goto failed;
@@ -4918,9 +5020,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -4943,9 +5045,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty body;
expr_ty orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4955,9 +5057,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -4967,9 +5069,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &orelse, arena);
if (res != 0) goto failed;
@@ -4991,11 +5093,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* keys;
asdl_seq* values;
- if (PyObject_HasAttrString(obj, "keys")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keys)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keys");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keys);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5016,11 +5118,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
return 1;
}
- if (PyObject_HasAttrString(obj, "values")) {
+ if (_PyObject_HasAttrId(obj, &PyId_values)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "values");
+ tmp = _PyObject_GetAttrId(obj, &PyId_values);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5052,11 +5154,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* elts;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5089,9 +5191,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5101,11 +5203,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5138,9 +5240,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5150,11 +5252,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5188,9 +5290,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty value;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "key")) {
+ if (_PyObject_HasAttrId(obj, &PyId_key)) {
int res;
- tmp = PyObject_GetAttrString(obj, "key");
+ tmp = _PyObject_GetAttrId(obj, &PyId_key);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &key, arena);
if (res != 0) goto failed;
@@ -5200,9 +5302,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5212,11 +5314,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5250,9 +5352,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5262,11 +5364,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5298,9 +5400,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5313,6 +5415,28 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (*out == NULL) goto failed;
return 0;
}
+ isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ expr_ty value;
+
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &value, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ value = NULL;
+ }
+ *out = YieldFrom(value, lineno, col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
if (isinstance == -1) {
return 1;
@@ -5322,9 +5446,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_int_seq* ops;
asdl_seq* comparators;
- if (PyObject_HasAttrString(obj, "left")) {
+ if (_PyObject_HasAttrId(obj, &PyId_left)) {
int res;
- tmp = PyObject_GetAttrString(obj, "left");
+ tmp = _PyObject_GetAttrId(obj, &PyId_left);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &left, arena);
if (res != 0) goto failed;
@@ -5334,11 +5458,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
return 1;
}
- if (PyObject_HasAttrString(obj, "ops")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ops)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "ops");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ops);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5359,11 +5483,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
return 1;
}
- if (PyObject_HasAttrString(obj, "comparators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_comparators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "comparators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_comparators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5400,9 +5524,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty starargs;
expr_ty kwargs;
- if (PyObject_HasAttrString(obj, "func")) {
+ if (_PyObject_HasAttrId(obj, &PyId_func)) {
int res;
- tmp = PyObject_GetAttrString(obj, "func");
+ tmp = _PyObject_GetAttrId(obj, &PyId_func);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &func, arena);
if (res != 0) goto failed;
@@ -5412,11 +5536,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5437,11 +5561,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "keywords")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keywords");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5462,9 +5586,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "starargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "starargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &starargs, arena);
if (res != 0) goto failed;
@@ -5473,9 +5597,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
} else {
starargs = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargs, arena);
if (res != 0) goto failed;
@@ -5496,9 +5620,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
object n;
- if (PyObject_HasAttrString(obj, "n")) {
+ if (_PyObject_HasAttrId(obj, &PyId_n)) {
int res;
- tmp = PyObject_GetAttrString(obj, "n");
+ tmp = _PyObject_GetAttrId(obj, &PyId_n);
if (tmp == NULL) goto failed;
res = obj2ast_object(tmp, &n, arena);
if (res != 0) goto failed;
@@ -5519,9 +5643,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
string s;
- if (PyObject_HasAttrString(obj, "s")) {
+ if (_PyObject_HasAttrId(obj, &PyId_s)) {
int res;
- tmp = PyObject_GetAttrString(obj, "s");
+ tmp = _PyObject_GetAttrId(obj, &PyId_s);
if (tmp == NULL) goto failed;
res = obj2ast_string(tmp, &s, arena);
if (res != 0) goto failed;
@@ -5540,13 +5664,13 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
return 1;
}
if (isinstance) {
- string s;
+ bytes s;
- if (PyObject_HasAttrString(obj, "s")) {
+ if (_PyObject_HasAttrId(obj, &PyId_s)) {
int res;
- tmp = PyObject_GetAttrString(obj, "s");
+ tmp = _PyObject_GetAttrId(obj, &PyId_s);
if (tmp == NULL) goto failed;
- res = obj2ast_string(tmp, &s, arena);
+ res = obj2ast_bytes(tmp, &s, arena);
if (res != 0) goto failed;
Py_XDECREF(tmp);
tmp = NULL;
@@ -5577,9 +5701,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
identifier attr;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5589,9 +5713,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
return 1;
}
- if (PyObject_HasAttrString(obj, "attr")) {
+ if (_PyObject_HasAttrId(obj, &PyId_attr)) {
int res;
- tmp = PyObject_GetAttrString(obj, "attr");
+ tmp = _PyObject_GetAttrId(obj, &PyId_attr);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &attr, arena);
if (res != 0) goto failed;
@@ -5601,9 +5725,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5626,9 +5750,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
slice_ty slice;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5638,9 +5762,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
return 1;
}
- if (PyObject_HasAttrString(obj, "slice")) {
+ if (_PyObject_HasAttrId(obj, &PyId_slice)) {
int res;
- tmp = PyObject_GetAttrString(obj, "slice");
+ tmp = _PyObject_GetAttrId(obj, &PyId_slice);
if (tmp == NULL) goto failed;
res = obj2ast_slice(tmp, &slice, arena);
if (res != 0) goto failed;
@@ -5650,9 +5774,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5674,9 +5798,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty value;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5686,9 +5810,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5710,9 +5834,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
identifier id;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "id")) {
+ if (_PyObject_HasAttrId(obj, &PyId_id)) {
int res;
- tmp = PyObject_GetAttrString(obj, "id");
+ tmp = _PyObject_GetAttrId(obj, &PyId_id);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &id, arena);
if (res != 0) goto failed;
@@ -5722,9 +5846,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5746,11 +5870,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* elts;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5771,9 +5895,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5795,11 +5919,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* elts;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5820,9 +5944,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5921,9 +6045,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
expr_ty upper;
expr_ty step;
- if (PyObject_HasAttrString(obj, "lower")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lower)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lower");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lower);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &lower, arena);
if (res != 0) goto failed;
@@ -5932,9 +6056,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
} else {
lower = NULL;
}
- if (PyObject_HasAttrString(obj, "upper")) {
+ if (_PyObject_HasAttrId(obj, &PyId_upper)) {
int res;
- tmp = PyObject_GetAttrString(obj, "upper");
+ tmp = _PyObject_GetAttrId(obj, &PyId_upper);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &upper, arena);
if (res != 0) goto failed;
@@ -5943,9 +6067,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
} else {
upper = NULL;
}
- if (PyObject_HasAttrString(obj, "step")) {
+ if (_PyObject_HasAttrId(obj, &PyId_step)) {
int res;
- tmp = PyObject_GetAttrString(obj, "step");
+ tmp = _PyObject_GetAttrId(obj, &PyId_step);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &step, arena);
if (res != 0) goto failed;
@@ -5965,11 +6089,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* dims;
- if (PyObject_HasAttrString(obj, "dims")) {
+ if (_PyObject_HasAttrId(obj, &PyId_dims)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "dims");
+ tmp = _PyObject_GetAttrId(obj, &PyId_dims);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6001,9 +6125,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -6296,9 +6420,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
expr_ty iter;
asdl_seq* ifs;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -6308,9 +6432,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
return 1;
}
- if (PyObject_HasAttrString(obj, "iter")) {
+ if (_PyObject_HasAttrId(obj, &PyId_iter)) {
int res;
- tmp = PyObject_GetAttrString(obj, "iter");
+ tmp = _PyObject_GetAttrId(obj, &PyId_iter);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &iter, arena);
if (res != 0) goto failed;
@@ -6320,11 +6444,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
return 1;
}
- if (PyObject_HasAttrString(obj, "ifs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ifs)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "ifs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ifs);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6365,9 +6489,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -6377,9 +6501,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -6398,9 +6522,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
identifier name;
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "type")) {
+ if (_PyObject_HasAttrId(obj, &PyId_type)) {
int res;
- tmp = PyObject_GetAttrString(obj, "type");
+ tmp = _PyObject_GetAttrId(obj, &PyId_type);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &type, arena);
if (res != 0) goto failed;
@@ -6409,9 +6533,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
} else {
type = NULL;
}
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -6420,11 +6544,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
} else {
name = NULL;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6470,11 +6594,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
asdl_seq* defaults;
asdl_seq* kw_defaults;
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6495,9 +6619,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "vararg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_vararg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "vararg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_vararg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &vararg, arena);
if (res != 0) goto failed;
@@ -6506,9 +6630,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
vararg = NULL;
}
- if (PyObject_HasAttrString(obj, "varargannotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "varargannotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &varargannotation, arena);
if (res != 0) goto failed;
@@ -6517,11 +6641,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
varargannotation = NULL;
}
- if (PyObject_HasAttrString(obj, "kwonlyargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "kwonlyargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6542,9 +6666,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "kwarg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwarg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwarg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwarg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &kwarg, arena);
if (res != 0) goto failed;
@@ -6553,9 +6677,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
kwarg = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargannotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargannotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargannotation, arena);
if (res != 0) goto failed;
@@ -6564,11 +6688,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
kwargannotation = NULL;
}
- if (PyObject_HasAttrString(obj, "defaults")) {
+ if (_PyObject_HasAttrId(obj, &PyId_defaults)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "defaults");
+ tmp = _PyObject_GetAttrId(obj, &PyId_defaults);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6589,11 +6713,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "kw_defaults")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "kw_defaults");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6629,9 +6753,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
identifier arg;
expr_ty annotation;
- if (PyObject_HasAttrString(obj, "arg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_arg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "arg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_arg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &arg, arena);
if (res != 0) goto failed;
@@ -6641,9 +6765,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
return 1;
}
- if (PyObject_HasAttrString(obj, "annotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_annotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "annotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_annotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &annotation, arena);
if (res != 0) goto failed;
@@ -6666,9 +6790,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
identifier arg;
expr_ty value;
- if (PyObject_HasAttrString(obj, "arg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_arg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "arg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_arg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &arg, arena);
if (res != 0) goto failed;
@@ -6678,9 +6802,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -6704,9 +6828,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
identifier name;
identifier asname;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -6716,9 +6840,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
return 1;
}
- if (PyObject_HasAttrString(obj, "asname")) {
+ if (_PyObject_HasAttrId(obj, &PyId_asname)) {
int res;
- tmp = PyObject_GetAttrString(obj, "asname");
+ tmp = _PyObject_GetAttrId(obj, &PyId_asname);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &asname, arena);
if (res != 0) goto failed;
@@ -6734,6 +6858,43 @@ failed:
return 1;
}
+int
+obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
+{
+ PyObject* tmp = NULL;
+ expr_ty context_expr;
+ expr_ty optional_vars;
+
+ if (_PyObject_HasAttrId(obj, &PyId_context_expr)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_context_expr);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &context_expr, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
+ return 1;
+ }
+ if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &optional_vars, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ optional_vars = NULL;
+ }
+ *out = withitem(context_expr, optional_vars, arena);
+ return 0;
+failed:
+ Py_XDECREF(tmp);
+ return 1;
+}
+
static struct PyModuleDef _astmodule = {
PyModuleDef_HEAD_INIT, "_ast"
@@ -6750,8 +6911,6 @@ PyInit__ast(void)
NULL;
if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
return NULL;
- if (PyModule_AddStringConstant(m, "__version__", "82163") < 0)
- return NULL;
if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
NULL;
if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
@@ -6785,10 +6944,8 @@ PyInit__ast(void)
NULL;
if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
NULL;
- if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) <
- 0) return NULL;
- if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) <
- 0) return NULL;
+ if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return
+ NULL;
if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
return NULL;
if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
@@ -6833,6 +6990,8 @@ PyInit__ast(void)
(PyObject*)GeneratorExp_type) < 0) return NULL;
if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
NULL;
+ if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) <
+ 0) return NULL;
if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
return NULL;
if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return
@@ -6951,6 +7110,8 @@ PyInit__ast(void)
return NULL;
if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
NULL;
+ if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
+ return NULL;
return m;
}
diff --git a/Python/_warnings.c b/Python/_warnings.c
index c12db44..f33e477 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -18,11 +18,12 @@ static int
check_matched(PyObject *obj, PyObject *arg)
{
PyObject *result;
+ _Py_IDENTIFIER(match);
int rc;
if (obj == Py_None)
return 1;
- result = PyObject_CallMethod(obj, "match", "O", arg);
+ result = _PyObject_CallMethodId(obj, &PyId_match, "O", arg);
if (result == NULL)
return -1;
@@ -202,13 +203,13 @@ normalize_module(PyObject *filename)
mod_str = _PyUnicode_AsString(filename);
if (mod_str == NULL)
- return NULL;
- len = PyUnicode_GetSize(filename);
+ return NULL;
+ len = PyUnicode_GetLength(filename);
if (len < 0)
return NULL;
if (len >= 3 &&
strncmp(mod_str + (len - 3), ".py", 3) == 0) {
- module = PyUnicode_FromStringAndSize(mod_str, len-3);
+ module = PyUnicode_Substring(filename, 0, len-3);
}
else {
module = filename;
@@ -246,10 +247,11 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject
PyObject *f_stderr;
PyObject *name;
char lineno_str[128];
+ _Py_IDENTIFIER(__name__);
PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno);
- name = PyObject_GetAttrString(category, "__name__");
+ name = _PyObject_GetAttrId(category, &PyId___name__);
if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */
return;
@@ -409,10 +411,10 @@ warn_explicit(PyObject *category, PyObject *message,
else {
PyObject *res;
- if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) {
+ if (!PyCallable_Check(show_fxn)) {
PyErr_SetString(PyExc_TypeError,
"warnings.showwarning() must be set to a "
- "function or method");
+ "callable");
Py_DECREF(show_fxn);
goto cleanup;
}
@@ -497,18 +499,28 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
/* Setup filename. */
*filename = PyDict_GetItemString(globals, "__file__");
if (*filename != NULL && PyUnicode_Check(*filename)) {
- Py_ssize_t len = PyUnicode_GetSize(*filename);
- Py_UNICODE *unicode = PyUnicode_AS_UNICODE(*filename);
+ Py_ssize_t len;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(*filename))
+ goto handle_error;
+
+ len = PyUnicode_GetLength(*filename);
+ kind = PyUnicode_KIND(*filename);
+ data = PyUnicode_DATA(*filename);
+#define ascii_lower(c) ((c <= 127) ? Py_TOLOWER(c) : 0)
/* if filename.lower().endswith((".pyc", ".pyo")): */
if (len >= 4 &&
- unicode[len-4] == '.' &&
- Py_UNICODE_TOLOWER(unicode[len-3]) == 'p' &&
- Py_UNICODE_TOLOWER(unicode[len-2]) == 'y' &&
- (Py_UNICODE_TOLOWER(unicode[len-1]) == 'c' ||
- Py_UNICODE_TOLOWER(unicode[len-1]) == 'o'))
+ PyUnicode_READ(kind, data, len-4) == '.' &&
+ ascii_lower(PyUnicode_READ(kind, data, len-3)) == 'p' &&
+ ascii_lower(PyUnicode_READ(kind, data, len-2)) == 'y' &&
+ (ascii_lower(PyUnicode_READ(kind, data, len-1)) == 'c' ||
+ ascii_lower(PyUnicode_READ(kind, data, len-1)) == 'o'))
{
- *filename = PyUnicode_FromUnicode(unicode, len-1);
+ *filename = PyUnicode_Substring(*filename, 0,
+ PyUnicode_GET_LENGTH(*filename)-1);
if (*filename == NULL)
goto handle_error;
}
@@ -643,8 +655,9 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
return NULL;
if (module_globals) {
- static PyObject *get_source_name = NULL;
- static PyObject *splitlines_name = NULL;
+ _Py_IDENTIFIER(get_source);
+ _Py_IDENTIFIER(splitlines);
+ PyObject *tmp;
PyObject *loader;
PyObject *module_name;
PyObject *source;
@@ -652,16 +665,10 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *source_line;
PyObject *returned;
- if (get_source_name == NULL) {
- get_source_name = PyUnicode_InternFromString("get_source");
- if (!get_source_name)
- return NULL;
- }
- if (splitlines_name == NULL) {
- splitlines_name = PyUnicode_InternFromString("splitlines");
- if (!splitlines_name)
- return NULL;
- }
+ if ((tmp = _PyUnicode_FromId(&PyId_get_source)) == NULL)
+ return NULL;
+ if ((tmp = _PyUnicode_FromId(&PyId_splitlines)) == NULL)
+ return NULL;
/* Check/get the requisite pieces needed for the loader. */
loader = PyDict_GetItemString(module_globals, "__loader__");
@@ -671,11 +678,11 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
goto standard_call;
/* Make sure the loader implements the optional get_source() method. */
- if (!PyObject_HasAttrString(loader, "get_source"))
+ if (!_PyObject_HasAttrId(loader, &PyId_get_source))
goto standard_call;
/* Call get_source() to get the source code. */
- source = PyObject_CallMethodObjArgs(loader, get_source_name,
- module_name, NULL);
+ source = PyObject_CallMethodObjArgs(loader, PyId_get_source.object,
+ module_name, NULL);
if (!source)
return NULL;
else if (source == Py_None) {
@@ -684,8 +691,9 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
}
/* Split the source into lines. */
- source_list = PyObject_CallMethodObjArgs(source, splitlines_name,
- NULL);
+ source_list = PyObject_CallMethodObjArgs(source,
+ PyId_splitlines.object,
+ NULL);
Py_DECREF(source);
if (!source_list)
return NULL;
@@ -950,23 +958,30 @@ _PyWarnings_Init(void)
if (m == NULL)
return NULL;
- _filters = init_filters();
- if (_filters == NULL)
- return NULL;
+ if (_filters == NULL) {
+ _filters = init_filters();
+ if (_filters == NULL)
+ return NULL;
+ }
Py_INCREF(_filters);
if (PyModule_AddObject(m, "filters", _filters) < 0)
return NULL;
- _once_registry = PyDict_New();
- if (_once_registry == NULL)
- return NULL;
+ if (_once_registry == NULL) {
+ _once_registry = PyDict_New();
+ if (_once_registry == NULL)
+ return NULL;
+ }
Py_INCREF(_once_registry);
if (PyModule_AddObject(m, "_onceregistry", _once_registry) < 0)
return NULL;
- _default_action = PyUnicode_FromString("default");
- if (_default_action == NULL)
- return NULL;
+ if (_default_action == NULL) {
+ _default_action = PyUnicode_FromString("default");
+ if (_default_action == NULL)
+ return NULL;
+ }
+ Py_INCREF(_default_action);
if (PyModule_AddObject(m, "_defaultaction", _default_action) < 0)
return NULL;
return m;
diff --git a/Python/asdl.c b/Python/asdl.c
index c30d7d20..e7e3280 100644
--- a/Python/asdl.c
+++ b/Python/asdl.c
@@ -2,7 +2,7 @@
#include "asdl.h"
asdl_seq *
-asdl_seq_new(int size, PyArena *arena)
+asdl_seq_new(Py_ssize_t size, PyArena *arena)
{
asdl_seq *seq = NULL;
size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
@@ -33,7 +33,7 @@ asdl_seq_new(int size, PyArena *arena)
}
asdl_int_seq *
-asdl_int_seq_new(int size, PyArena *arena)
+asdl_int_seq_new(Py_ssize_t size, PyArena *arena)
{
asdl_int_seq *seq = NULL;
size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
diff --git a/Python/ast.c b/Python/ast.c
index d2f063b..0c0c1a6 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -1,24 +1,507 @@
/*
* This file includes functions to transform a concrete syntax tree (CST) to
- * an abstract syntax tree (AST). The main function is PyAST_FromNode().
+ * an abstract syntax tree (AST). The main function is PyAST_FromNode().
*
*/
#include "Python.h"
#include "Python-ast.h"
-#include "grammar.h"
#include "node.h"
#include "ast.h"
#include "token.h"
-#include "parsetok.h"
-#include "graminit.h"
#include <assert.h>
+static int validate_stmts(asdl_seq *);
+static int validate_exprs(asdl_seq *, expr_context_ty, int);
+static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
+static int validate_stmt(stmt_ty);
+static int validate_expr(expr_ty, expr_context_ty);
+
+static int
+validate_comprehension(asdl_seq *gens)
+{
+ int i;
+ if (!asdl_seq_LEN(gens)) {
+ PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
+ return 0;
+ }
+ for (i = 0; i < asdl_seq_LEN(gens); i++) {
+ comprehension_ty comp = asdl_seq_GET(gens, i);
+ if (!validate_expr(comp->target, Store) ||
+ !validate_expr(comp->iter, Load) ||
+ !validate_exprs(comp->ifs, Load, 0))
+ return 0;
+ }
+ return 1;
+}
+
+static int
+validate_slice(slice_ty slice)
+{
+ switch (slice->kind) {
+ case Slice_kind:
+ return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
+ (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
+ (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
+ case ExtSlice_kind: {
+ int i;
+ if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
+ return 0;
+ for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
+ if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
+ return 0;
+ return 1;
+ }
+ case Index_kind:
+ return validate_expr(slice->v.Index.value, Load);
+ default:
+ PyErr_SetString(PyExc_SystemError, "unknown slice node");
+ return 0;
+ }
+}
+
+static int
+validate_keywords(asdl_seq *keywords)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(keywords); i++)
+ if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
+ return 0;
+ return 1;
+}
+
+static int
+validate_args(asdl_seq *args)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(args); i++) {
+ arg_ty arg = asdl_seq_GET(args, i);
+ if (arg->annotation && !validate_expr(arg->annotation, Load))
+ return 0;
+ }
+ return 1;
+}
+
+static const char *
+expr_context_name(expr_context_ty ctx)
+{
+ switch (ctx) {
+ case Load:
+ return "Load";
+ case Store:
+ return "Store";
+ case Del:
+ return "Del";
+ case AugLoad:
+ return "AugLoad";
+ case AugStore:
+ return "AugStore";
+ case Param:
+ return "Param";
+ default:
+ assert(0);
+ return "(unknown)";
+ }
+}
+
+static int
+validate_arguments(arguments_ty args)
+{
+ if (!validate_args(args->args))
+ return 0;
+ if (args->varargannotation) {
+ if (!args->vararg) {
+ PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
+ return 0;
+ }
+ if (!validate_expr(args->varargannotation, Load))
+ return 0;
+ }
+ if (!validate_args(args->kwonlyargs))
+ return 0;
+ if (args->kwargannotation) {
+ if (!args->kwarg) {
+ PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
+ return 0;
+ }
+ if (!validate_expr(args->kwargannotation, Load))
+ return 0;
+ }
+ if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
+ PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
+ return 0;
+ }
+ if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
+ PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
+ "kw_defaults on arguments");
+ return 0;
+ }
+ return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
+}
+
+static int
+validate_expr(expr_ty exp, expr_context_ty ctx)
+{
+ int check_ctx = 1;
+ expr_context_ty actual_ctx;
+
+ /* First check expression context. */
+ switch (exp->kind) {
+ case Attribute_kind:
+ actual_ctx = exp->v.Attribute.ctx;
+ break;
+ case Subscript_kind:
+ actual_ctx = exp->v.Subscript.ctx;
+ break;
+ case Starred_kind:
+ actual_ctx = exp->v.Starred.ctx;
+ break;
+ case Name_kind:
+ actual_ctx = exp->v.Name.ctx;
+ break;
+ case List_kind:
+ actual_ctx = exp->v.List.ctx;
+ break;
+ case Tuple_kind:
+ actual_ctx = exp->v.Tuple.ctx;
+ break;
+ default:
+ if (ctx != Load) {
+ PyErr_Format(PyExc_ValueError, "expression which can't be "
+ "assigned to in %s context", expr_context_name(ctx));
+ return 0;
+ }
+ check_ctx = 0;
+ }
+ if (check_ctx && actual_ctx != ctx) {
+ PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
+ expr_context_name(ctx), expr_context_name(actual_ctx));
+ return 0;
+ }
+
+ /* Now validate expression. */
+ switch (exp->kind) {
+ case BoolOp_kind:
+ if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
+ PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
+ return 0;
+ }
+ return validate_exprs(exp->v.BoolOp.values, Load, 0);
+ case BinOp_kind:
+ return validate_expr(exp->v.BinOp.left, Load) &&
+ validate_expr(exp->v.BinOp.right, Load);
+ case UnaryOp_kind:
+ return validate_expr(exp->v.UnaryOp.operand, Load);
+ case Lambda_kind:
+ return validate_arguments(exp->v.Lambda.args) &&
+ validate_expr(exp->v.Lambda.body, Load);
+ case IfExp_kind:
+ return validate_expr(exp->v.IfExp.test, Load) &&
+ validate_expr(exp->v.IfExp.body, Load) &&
+ validate_expr(exp->v.IfExp.orelse, Load);
+ case Dict_kind:
+ if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Dict doesn't have the same number of keys as values");
+ return 0;
+ }
+ return validate_exprs(exp->v.Dict.keys, Load, 0) &&
+ validate_exprs(exp->v.Dict.values, Load, 0);
+ case Set_kind:
+ return validate_exprs(exp->v.Set.elts, Load, 0);
+#define COMP(NAME) \
+ case NAME ## _kind: \
+ return validate_comprehension(exp->v.NAME.generators) && \
+ validate_expr(exp->v.NAME.elt, Load);
+ COMP(ListComp)
+ COMP(SetComp)
+ COMP(GeneratorExp)
+#undef COMP
+ case DictComp_kind:
+ return validate_comprehension(exp->v.DictComp.generators) &&
+ validate_expr(exp->v.DictComp.key, Load) &&
+ validate_expr(exp->v.DictComp.value, Load);
+ case Yield_kind:
+ return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
+ case YieldFrom_kind:
+ return !exp->v.YieldFrom.value ||
+ validate_expr(exp->v.YieldFrom.value, Load);
+ case Compare_kind:
+ if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
+ PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
+ return 0;
+ }
+ if (asdl_seq_LEN(exp->v.Compare.comparators) !=
+ asdl_seq_LEN(exp->v.Compare.ops)) {
+ PyErr_SetString(PyExc_ValueError, "Compare has a different number "
+ "of comparators and operands");
+ return 0;
+ }
+ return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
+ validate_expr(exp->v.Compare.left, Load);
+ case Call_kind:
+ return validate_expr(exp->v.Call.func, Load) &&
+ validate_exprs(exp->v.Call.args, Load, 0) &&
+ validate_keywords(exp->v.Call.keywords) &&
+ (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
+ (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
+ case Num_kind: {
+ PyObject *n = exp->v.Num.n;
+ if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
+ !PyComplex_CheckExact(n)) {
+ PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
+ return 0;
+ }
+ return 1;
+ }
+ case Str_kind: {
+ PyObject *s = exp->v.Str.s;
+ if (!PyUnicode_CheckExact(s)) {
+ PyErr_SetString(PyExc_TypeError, "non-string type in Str");
+ return 0;
+ }
+ return 1;
+ }
+ case Bytes_kind: {
+ PyObject *b = exp->v.Bytes.s;
+ if (!PyBytes_CheckExact(b)) {
+ PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
+ return 0;
+ }
+ return 1;
+ }
+ case Attribute_kind:
+ return validate_expr(exp->v.Attribute.value, Load);
+ case Subscript_kind:
+ return validate_slice(exp->v.Subscript.slice) &&
+ validate_expr(exp->v.Subscript.value, Load);
+ case Starred_kind:
+ return validate_expr(exp->v.Starred.value, ctx);
+ case List_kind:
+ return validate_exprs(exp->v.List.elts, ctx, 0);
+ case Tuple_kind:
+ return validate_exprs(exp->v.Tuple.elts, ctx, 0);
+ /* These last cases don't have any checking. */
+ case Name_kind:
+ case Ellipsis_kind:
+ return 1;
+ default:
+ PyErr_SetString(PyExc_SystemError, "unexpected expression");
+ return 0;
+ }
+}
+
+static int
+validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
+{
+ if (asdl_seq_LEN(seq))
+ return 1;
+ PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
+ return 0;
+}
+
+static int
+validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
+{
+ return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
+ validate_exprs(targets, ctx, 0);
+}
+
+static int
+validate_body(asdl_seq *body, const char *owner)
+{
+ return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
+}
+
+static int
+validate_stmt(stmt_ty stmt)
+{
+ int i;
+ switch (stmt->kind) {
+ case FunctionDef_kind:
+ return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
+ validate_arguments(stmt->v.FunctionDef.args) &&
+ validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
+ (!stmt->v.FunctionDef.returns ||
+ validate_expr(stmt->v.FunctionDef.returns, Load));
+ case ClassDef_kind:
+ return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
+ validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
+ validate_keywords(stmt->v.ClassDef.keywords) &&
+ validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
+ (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
+ (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
+ case Return_kind:
+ return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
+ case Delete_kind:
+ return validate_assignlist(stmt->v.Delete.targets, Del);
+ case Assign_kind:
+ return validate_assignlist(stmt->v.Assign.targets, Store) &&
+ validate_expr(stmt->v.Assign.value, Load);
+ case AugAssign_kind:
+ return validate_expr(stmt->v.AugAssign.target, Store) &&
+ validate_expr(stmt->v.AugAssign.value, Load);
+ case For_kind:
+ return validate_expr(stmt->v.For.target, Store) &&
+ validate_expr(stmt->v.For.iter, Load) &&
+ validate_body(stmt->v.For.body, "For") &&
+ validate_stmts(stmt->v.For.orelse);
+ case While_kind:
+ return validate_expr(stmt->v.While.test, Load) &&
+ validate_body(stmt->v.While.body, "While") &&
+ validate_stmts(stmt->v.While.orelse);
+ case If_kind:
+ return validate_expr(stmt->v.If.test, Load) &&
+ validate_body(stmt->v.If.body, "If") &&
+ validate_stmts(stmt->v.If.orelse);
+ case With_kind:
+ if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
+ return 0;
+ for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
+ withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
+ if (!validate_expr(item->context_expr, Load) ||
+ (item->optional_vars && !validate_expr(item->optional_vars, Store)))
+ return 0;
+ }
+ return validate_body(stmt->v.With.body, "With");
+ case Raise_kind:
+ if (stmt->v.Raise.exc) {
+ return validate_expr(stmt->v.Raise.exc, Load) &&
+ (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
+ }
+ if (stmt->v.Raise.cause) {
+ PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
+ return 0;
+ }
+ return 1;
+ case Try_kind:
+ if (!validate_body(stmt->v.Try.body, "Try"))
+ return 0;
+ if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
+ !asdl_seq_LEN(stmt->v.Try.finalbody)) {
+ PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
+ return 0;
+ }
+ if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
+ asdl_seq_LEN(stmt->v.Try.orelse)) {
+ PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
+ return 0;
+ }
+ for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
+ excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
+ if ((handler->v.ExceptHandler.type &&
+ !validate_expr(handler->v.ExceptHandler.type, Load)) ||
+ !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
+ return 0;
+ }
+ return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
+ validate_stmts(stmt->v.Try.finalbody)) &&
+ (!asdl_seq_LEN(stmt->v.Try.orelse) ||
+ validate_stmts(stmt->v.Try.orelse));
+ case Assert_kind:
+ return validate_expr(stmt->v.Assert.test, Load) &&
+ (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
+ case Import_kind:
+ return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
+ case ImportFrom_kind:
+ if (stmt->v.ImportFrom.level < -1) {
+ PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
+ return 0;
+ }
+ return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
+ case Global_kind:
+ return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
+ case Nonlocal_kind:
+ return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
+ case Expr_kind:
+ return validate_expr(stmt->v.Expr.value, Load);
+ case Pass_kind:
+ case Break_kind:
+ case Continue_kind:
+ return 1;
+ default:
+ PyErr_SetString(PyExc_SystemError, "unexpected statement");
+ return 0;
+ }
+}
+
+static int
+validate_stmts(asdl_seq *seq)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(seq); i++) {
+ stmt_ty stmt = asdl_seq_GET(seq, i);
+ if (stmt) {
+ if (!validate_stmt(stmt))
+ return 0;
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "None disallowed in statement list");
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static int
+validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(exprs); i++) {
+ expr_ty expr = asdl_seq_GET(exprs, i);
+ if (expr) {
+ if (!validate_expr(expr, ctx))
+ return 0;
+ }
+ else if (!null_ok) {
+ PyErr_SetString(PyExc_ValueError,
+ "None disallowed in expression list");
+ return 0;
+ }
+
+ }
+ return 1;
+}
+
+int
+PyAST_Validate(mod_ty mod)
+{
+ int res = 0;
+
+ switch (mod->kind) {
+ case Module_kind:
+ res = validate_stmts(mod->v.Module.body);
+ break;
+ case Interactive_kind:
+ res = validate_stmts(mod->v.Interactive.body);
+ break;
+ case Expression_kind:
+ res = validate_expr(mod->v.Expression.body, Load);
+ break;
+ case Suite_kind:
+ PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
+ break;
+ default:
+ PyErr_SetString(PyExc_SystemError, "impossible module node");
+ res = 0;
+ break;
+ }
+ return res;
+}
+
+/* This is done here, so defines like "test" don't interfere with AST use above. */
+#include "grammar.h"
+#include "parsetok.h"
+#include "graminit.h"
+
/* Data structure used internally */
struct compiling {
char *c_encoding; /* source encoding */
PyArena *c_arena; /* arena for allocating memeory */
const char *c_filename; /* filename */
+ PyObject *c_normalize; /* Normalization function from unicodedata. */
+ PyObject *c_normalize_args; /* Normalization argument tuple. */
};
static asdl_seq *seq_for_testlist(struct compiling *, const node *);
@@ -38,127 +521,96 @@ static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
static PyObject *parsestrplus(struct compiling *, const node *n,
int *bytesmode);
-#ifndef LINENO
-#define LINENO(n) ((n)->n_lineno)
-#endif
-
#define COMP_GENEXP 0
#define COMP_LISTCOMP 1
#define COMP_SETCOMP 2
+static int
+init_normalization(struct compiling *c)
+{
+ PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
+ if (!m)
+ return 0;
+ c->c_normalize = PyObject_GetAttrString(m, "normalize");
+ Py_DECREF(m);
+ if (!c->c_normalize)
+ return 0;
+ c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
+ PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
+ if (!c->c_normalize_args) {
+ Py_CLEAR(c->c_normalize);
+ return 0;
+ }
+ return 1;
+}
+
static identifier
-new_identifier(const char *n, PyArena *arena)
+new_identifier(const char *n, struct compiling *c)
{
PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
- Py_UNICODE *u;
if (!id)
return NULL;
- u = PyUnicode_AS_UNICODE(id);
+ /* PyUnicode_DecodeUTF8 should always return a ready string. */
+ assert(PyUnicode_IS_READY(id));
/* Check whether there are non-ASCII characters in the
identifier; if so, normalize to NFKC. */
- for (; *u; u++) {
- if (*u >= 128) {
- PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
- PyObject *id2;
- if (!m)
- return NULL;
- id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
- Py_DECREF(m);
- if (!id2)
- return NULL;
+ if (!PyUnicode_IS_ASCII(id)) {
+ PyObject *id2;
+ if (!c->c_normalize && !init_normalization(c)) {
Py_DECREF(id);
- id = id2;
- break;
+ return NULL;
}
+ PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
+ id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
+ Py_DECREF(id);
+ if (!id2)
+ return NULL;
+ id = id2;
}
PyUnicode_InternInPlace(&id);
- PyArena_AddPyObject(arena, id);
+ PyArena_AddPyObject(c->c_arena, id);
return id;
}
-#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
-
-/* This routine provides an invalid object for the syntax error.
- The outermost routine must unpack this error and create the
- proper object. We do this so that we don't have to pass
- the filename to everything function.
-
- XXX Maybe we should just pass the filename...
-*/
+#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
static int
-ast_error(const node *n, const char *errstr)
+ast_error(struct compiling *c, const node *n, const char *errmsg)
{
- PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset), *save;
- if (!u)
- return 0;
- /*
- * Prevent the error from being chained. PyErr_SetObject will normalize the
- * exception in order to chain it. ast_error_finish, however, requires the
- * error not to be normalized.
- */
- save = PyThreadState_GET()->exc_value;
- PyThreadState_GET()->exc_value = NULL;
- PyErr_SetObject(PyExc_SyntaxError, u);
- PyThreadState_GET()->exc_value = save;
- Py_DECREF(u);
- return 0;
-}
-
-static void
-ast_error_finish(const char *filename)
-{
- PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
+ PyObject *value, *errstr, *loc, *tmp;
PyObject *filename_obj;
- long lineno;
-
- assert(PyErr_Occurred());
- if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
- return;
-
- PyErr_Fetch(&type, &value, &tback);
- errstr = PyTuple_GetItem(value, 0);
- if (!errstr)
- return;
- Py_INCREF(errstr);
- lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
- if (lineno == -1) {
- Py_DECREF(errstr);
- return;
- }
- offset = PyTuple_GetItem(value, 2);
- if (!offset) {
- Py_DECREF(errstr);
- return;
- }
- Py_DECREF(value);
-
- loc = PyErr_ProgramText(filename, lineno);
+
+ loc = PyErr_ProgramText(c->c_filename, LINENO(n));
if (!loc) {
Py_INCREF(Py_None);
loc = Py_None;
}
- if (filename != NULL)
- filename_obj = PyUnicode_DecodeFSDefault(filename);
- else {
+ if (c->c_filename) {
+ filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
+ if (!filename_obj) {
+ Py_DECREF(loc);
+ return 0;
+ }
+ } else {
Py_INCREF(Py_None);
filename_obj = Py_None;
}
- if (filename_obj != NULL)
- tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
- else
- tmp = NULL;
- Py_DECREF(loc);
- if (!tmp) {
- Py_DECREF(errstr);
- return;
+ tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
+ if (!tmp)
+ return 0;
+ errstr = PyUnicode_FromString(errmsg);
+ if (!errstr) {
+ Py_DECREF(tmp);
+ return 0;
}
value = PyTuple_Pack(2, errstr, tmp);
Py_DECREF(errstr);
Py_DECREF(tmp);
- if (!value)
- return;
- PyErr_Restore(type, value, tback);
+ if (value) {
+ PyErr_SetObject(PyExc_SyntaxError, value);
+ Py_DECREF(value);
+ }
+ return 0;
}
/* num_stmts() returns number of contained statements.
@@ -234,13 +686,17 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
stmt_ty s;
node *ch;
struct compiling c;
+ mod_ty res = NULL;
+ c.c_arena = arena;
+ c.c_filename = filename;
+ c.c_normalize = c.c_normalize_args = NULL;
if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
c.c_encoding = "utf-8";
if (TYPE(n) == encoding_decl) {
#if 0
- ast_error(n, "encoding declaration in Unicode string");
- goto error;
+ ast_error(c, n, "encoding declaration in Unicode string");
+ goto out;
#endif
n = CHILD(n, 0);
}
@@ -251,15 +707,13 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
/* PEP 3120 */
c.c_encoding = "utf-8";
}
- c.c_arena = arena;
- c.c_filename = filename;
k = 0;
switch (TYPE(n)) {
case file_input:
stmts = asdl_seq_new(num_stmts(n), arena);
if (!stmts)
- return NULL;
+ goto out;
for (i = 0; i < NCH(n) - 1; i++) {
ch = CHILD(n, i);
if (TYPE(ch) == NEWLINE)
@@ -269,7 +723,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
if (num == 1) {
s = ast_for_stmt(&c, ch);
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, k++, s);
}
else {
@@ -278,42 +732,44 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
for (j = 0; j < num; j++) {
s = ast_for_stmt(&c, CHILD(ch, j * 2));
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, k++, s);
}
}
}
- return Module(stmts, arena);
+ res = Module(stmts, arena);
+ break;
case eval_input: {
expr_ty testlist_ast;
/* XXX Why not comp_for here? */
testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
if (!testlist_ast)
- goto error;
- return Expression(testlist_ast, arena);
+ goto out;
+ res = Expression(testlist_ast, arena);
+ break;
}
case single_input:
if (TYPE(CHILD(n, 0)) == NEWLINE) {
stmts = asdl_seq_new(1, arena);
if (!stmts)
- goto error;
+ goto out;
asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
arena));
if (!asdl_seq_GET(stmts, 0))
- goto error;
- return Interactive(stmts, arena);
+ goto out;
+ res = Interactive(stmts, arena);
}
else {
n = CHILD(n, 0);
num = num_stmts(n);
stmts = asdl_seq_new(num, arena);
if (!stmts)
- goto error;
+ goto out;
if (num == 1) {
s = ast_for_stmt(&c, n);
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, 0, s);
}
else {
@@ -324,21 +780,26 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
break;
s = ast_for_stmt(&c, CHILD(n, i));
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, i / 2, s);
}
}
- return Interactive(stmts, arena);
+ res = Interactive(stmts, arena);
}
+ break;
default:
PyErr_Format(PyExc_SystemError,
"invalid node %d for PyAST_FromNode", TYPE(n));
- goto error;
+ goto out;
}
- error:
- ast_error_finish(filename);
- return NULL;
+ out:
+ if (c.c_normalize) {
+ Py_DECREF(c.c_normalize);
+ PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
+ Py_DECREF(c.c_normalize_args);
+ }
+ return res;
}
/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
@@ -383,18 +844,18 @@ static const char* FORBIDDEN[] = {
};
static int
-forbidden_name(identifier name, const node *n, int full_checks)
+forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
{
assert(PyUnicode_Check(name));
if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
- ast_error(n, "assignment to keyword");
+ ast_error(c, n, "assignment to keyword");
return 1;
}
if (full_checks) {
const char **p;
for (p = FORBIDDEN; *p; p++) {
if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
- ast_error(n, "assignment to keyword");
+ ast_error(c, n, "assignment to keyword");
return 1;
}
}
@@ -430,7 +891,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
switch (e->kind) {
case Attribute_kind:
e->v.Attribute.ctx = ctx;
- if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
+ if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
return 0;
break;
case Subscript_kind:
@@ -443,7 +904,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
break;
case Name_kind:
if (ctx == Store) {
- if (forbidden_name(e->v.Name.id, n, 1))
+ if (forbidden_name(c, e->v.Name.id, n, 1))
return 0; /* forbidden_name() calls ast_error() */
}
e->v.Name.ctx = ctx;
@@ -476,6 +937,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
expr_name = "generator expression";
break;
case Yield_kind:
+ case YieldFrom_kind:
expr_name = "yield expression";
break;
case ListComp_kind:
@@ -516,7 +978,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
"can't %s %s",
ctx == Store ? "assign to" : "delete",
expr_name);
- return ast_error(n, buf);
+ return ast_error(c, n, buf);
}
/* If the LHS is a list or tuple, we need to set the assignment
@@ -664,7 +1126,7 @@ ast_for_arg(struct compiling *c, const node *n)
name = NEW_IDENTIFIER(ch);
if (!name)
return NULL;
- if (forbidden_name(name, ch, 0))
+ if (forbidden_name(c, name, ch, 0))
return NULL;
if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
@@ -694,7 +1156,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
int j = 0; /* index for kwdefaults and kwonlyargs */
if (kwonlyargs == NULL) {
- ast_error(CHILD(n, start), "named arguments must follow bare *");
+ ast_error(c, CHILD(n, start), "named arguments must follow bare *");
return -1;
}
assert(kwdefaults != NULL);
@@ -726,7 +1188,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
argname = NEW_IDENTIFIER(ch);
if (!argname)
goto error;
- if (forbidden_name(argname, ch, 0))
+ if (forbidden_name(c, argname, ch, 0))
goto error;
arg = arg(argname, annotation, c->c_arena);
if (!arg)
@@ -737,7 +1199,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
case DOUBLESTAR:
return i;
default:
- ast_error(ch, "unexpected node");
+ ast_error(c, ch, "unexpected node");
goto error;
}
}
@@ -829,7 +1291,7 @@ ast_for_arguments(struct compiling *c, const node *n)
return NULL;
if (nposargs + nkwonlyargs > 255) {
- ast_error(n, "more than 255 arguments");
+ ast_error(c, n, "more than 255 arguments");
return NULL;
}
@@ -857,7 +1319,7 @@ ast_for_arguments(struct compiling *c, const node *n)
found_default = 1;
}
else if (found_default) {
- ast_error(n,
+ ast_error(c, n,
"non-default argument follows default argument");
return NULL;
}
@@ -869,7 +1331,7 @@ ast_for_arguments(struct compiling *c, const node *n)
break;
case STAR:
if (i+1 >= NCH(n)) {
- ast_error(CHILD(n, i),
+ ast_error(c, CHILD(n, i),
"named arguments must follow bare *");
return NULL;
}
@@ -886,7 +1348,7 @@ ast_for_arguments(struct compiling *c, const node *n)
vararg = NEW_IDENTIFIER(CHILD(ch, 0));
if (!vararg)
return NULL;
- if (forbidden_name(vararg, CHILD(ch, 0), 0))
+ if (forbidden_name(c, vararg, CHILD(ch, 0), 0))
return NULL;
if (NCH(ch) > 1) {
/* there is an annotation on the vararg */
@@ -917,7 +1379,7 @@ ast_for_arguments(struct compiling *c, const node *n)
if (!kwargannotation)
return NULL;
}
- if (forbidden_name(kwarg, CHILD(ch, 0), 0))
+ if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))
return NULL;
i += 3;
break;
@@ -1036,7 +1498,7 @@ ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
name = NEW_IDENTIFIER(CHILD(n, name_i));
if (!name)
return NULL;
- if (forbidden_name(name, CHILD(n, name_i), 0))
+ if (forbidden_name(c, name, CHILD(n, name_i), 0))
return NULL;
args = ast_for_arguments(c, CHILD(n, name_i + 1));
if (!args)
@@ -1377,10 +1839,10 @@ ast_for_atom(struct compiling *c, const node *n)
char buf[128];
s = _PyUnicode_AsString(errstr);
PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
- ast_error(n, buf);
+ ast_error(c, n, buf);
Py_DECREF(errstr);
} else {
- ast_error(n, "(unicode error) unknown error");
+ ast_error(c, n, "(unicode error) unknown error");
}
Py_DECREF(type);
Py_DECREF(value);
@@ -1897,12 +2359,25 @@ ast_for_expr(struct compiling *c, const node *n)
}
return ast_for_binop(c, n);
case yield_expr: {
+ node *an = NULL;
+ node *en = NULL;
+ int is_from = 0;
expr_ty exp = NULL;
- if (NCH(n) == 2) {
- exp = ast_for_testlist(c, CHILD(n, 1));
+ if (NCH(n) > 1)
+ an = CHILD(n, 1); /* yield_arg */
+ if (an) {
+ en = CHILD(an, NCH(an) - 1);
+ if (NCH(an) == 2) {
+ is_from = 1;
+ exp = ast_for_expr(c, en);
+ }
+ else
+ exp = ast_for_testlist(c, en);
if (!exp)
return NULL;
}
+ if (is_from)
+ return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
}
case factor:
@@ -1927,7 +2402,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
/*
arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
| '**' test)
- argument: [test '='] test [comp_for] # Really [keyword '='] test
+ argument: [test '='] (test) [comp_for] # Really [keyword '='] test
*/
int i, nargs, nkeywords, ngens;
@@ -1952,14 +2427,14 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
}
}
if (ngens > 1 || (ngens && (nargs || nkeywords))) {
- ast_error(n, "Generator expression must be parenthesized "
+ ast_error(c, n, "Generator expression must be parenthesized "
"if not sole argument");
return NULL;
}
if (nargs + nkeywords + ngens > 255) {
- ast_error(n, "more than 255 arguments");
- return NULL;
+ ast_error(c, n, "more than 255 arguments");
+ return NULL;
}
args = asdl_seq_new(nargs + ngens, c->c_arena);
@@ -1976,12 +2451,12 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
expr_ty e;
if (NCH(ch) == 1) {
if (nkeywords) {
- ast_error(CHILD(ch, 0),
+ ast_error(c, CHILD(ch, 0),
"non-keyword arg after keyword arg");
return NULL;
}
if (vararg) {
- ast_error(CHILD(ch, 0),
+ ast_error(c, CHILD(ch, 0),
"only named arguments may follow *expression");
return NULL;
}
@@ -2011,19 +2486,19 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
* then is very confusing.
*/
if (e->kind == Lambda_kind) {
- ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
- return NULL;
+ ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
+ return NULL;
} else if (e->kind != Name_kind) {
- ast_error(CHILD(ch, 0), "keyword can't be an expression");
- return NULL;
- } else if (forbidden_name(e->v.Name.id, ch, 1)) {
- return NULL;
+ ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
+ return NULL;
+ } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
+ return NULL;
}
key = e->v.Name.id;
for (k = 0; k < nkeywords; k++) {
tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
if (!PyUnicode_Compare(tmp, key)) {
- ast_error(CHILD(ch, 0), "keyword argument repeated");
+ ast_error(c, CHILD(ch, 0), "keyword argument repeated");
return NULL;
}
}
@@ -2116,7 +2591,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
case Subscript_kind:
break;
default:
- ast_error(ch, "illegal expression for augmented assignment");
+ ast_error(c, ch, "illegal expression for augmented assignment");
return NULL;
}
@@ -2149,7 +2624,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
expr_ty e;
node *ch = CHILD(n, i);
if (TYPE(ch) == yield_expr) {
- ast_error(ch, "assignment to yield expression not possible");
+ ast_error(c, ch, "assignment to yield expression not possible");
return NULL;
}
e = ast_for_testlist(c, ch);
@@ -2221,7 +2696,7 @@ ast_for_flow_stmt(struct compiling *c, const node *n)
continue_stmt: 'continue'
return_stmt: 'return' [testlist]
yield_stmt: yield_expr
- yield_expr: 'yield' testlist
+ yield_expr: 'yield' testlist | 'yield' 'from' test
raise_stmt: 'raise' [test [',' test [',' test]]]
*/
node *ch;
@@ -2296,11 +2771,11 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
str = NEW_IDENTIFIER(str_node);
if (!str)
return NULL;
- if (store && forbidden_name(str, str_node, 0))
+ if (store && forbidden_name(c, str, str_node, 0))
return NULL;
}
else {
- if (forbidden_name(name, name_node, 0))
+ if (forbidden_name(c, name, name_node, 0))
return NULL;
}
return alias(name, str, c->c_arena);
@@ -2319,7 +2794,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
a->asname = NEW_IDENTIFIER(asname_node);
if (!a->asname)
return NULL;
- if (forbidden_name(a->asname, asname_node, 0))
+ if (forbidden_name(c, a->asname, asname_node, 0))
return NULL;
return a;
}
@@ -2330,7 +2805,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
name = NEW_IDENTIFIER(name_node);
if (!name)
return NULL;
- if (store && forbidden_name(name, name_node, 0))
+ if (store && forbidden_name(c, name, name_node, 0))
return NULL;
return alias(name, NULL, c->c_arena);
}
@@ -2459,13 +2934,13 @@ ast_for_import_stmt(struct compiling *c, const node *n)
n = CHILD(n, idx);
n_children = NCH(n);
if (n_children % 2 == 0) {
- ast_error(n, "trailing comma not allowed without"
+ ast_error(c, n, "trailing comma not allowed without"
" surrounding parentheses");
return NULL;
}
break;
default:
- ast_error(n, "Unexpected node-type in from-import");
+ ast_error(c, n, "Unexpected node-type in from-import");
return NULL;
}
@@ -2871,7 +3346,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
if (!e)
return NULL;
- if (forbidden_name(e, CHILD(exc, 3), 0))
+ if (forbidden_name(c, e, CHILD(exc, 3), 0))
return NULL;
expression = ast_for_expr(c, CHILD(exc, 1));
if (!expression)
@@ -2895,7 +3370,7 @@ ast_for_try_stmt(struct compiling *c, const node *n)
{
const int nch = NCH(n);
int n_except = (nch - 3)/3;
- asdl_seq *body, *orelse = NULL, *finally = NULL;
+ asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
REQ(n, try_stmt);
@@ -2930,15 +3405,14 @@ ast_for_try_stmt(struct compiling *c, const node *n)
}
}
else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
- ast_error(n, "malformed 'try' statement");
+ ast_error(c, n, "malformed 'try' statement");
return NULL;
}
if (n_except > 0) {
int i;
- stmt_ty except_st;
/* process except statements to create a try ... except */
- asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
+ handlers = asdl_seq_new(n_except, c->c_arena);
if (handlers == NULL)
return NULL;
@@ -2949,28 +3423,15 @@ ast_for_try_stmt(struct compiling *c, const node *n)
return NULL;
asdl_seq_SET(handlers, i, e);
}
-
- except_st = TryExcept(body, handlers, orelse, LINENO(n),
- n->n_col_offset, c->c_arena);
- if (!finally)
- return except_st;
-
- /* if a 'finally' is present too, we nest the TryExcept within a
- TryFinally to emulate try ... except ... finally */
- body = asdl_seq_new(1, c->c_arena);
- if (body == NULL)
- return NULL;
- asdl_seq_SET(body, 0, except_st);
}
- /* must be a try ... finally (except clauses are in body, if any exist) */
- assert(finally != NULL);
- return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
+ assert(finally != NULL || asdl_seq_LEN(handlers));
+ return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
}
/* with_item: test ['as' expr] */
-static stmt_ty
-ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
+static withitem_ty
+ast_for_with_item(struct compiling *c, const node *n)
{
expr_ty context_expr, optional_vars = NULL;
@@ -2989,43 +3450,34 @@ ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
}
}
- return With(context_expr, optional_vars, content, LINENO(n),
- n->n_col_offset, c->c_arena);
+ return withitem(context_expr, optional_vars, c->c_arena);
}
/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
static stmt_ty
ast_for_with_stmt(struct compiling *c, const node *n)
{
- int i;
- stmt_ty ret;
- asdl_seq *inner;
+ int i, n_items;
+ asdl_seq *items, *body;
REQ(n, with_stmt);
- /* process the with items inside-out */
- i = NCH(n) - 1;
- /* the suite of the innermost with item is the suite of the with stmt */
- inner = ast_for_suite(c, CHILD(n, i));
- if (!inner)
+ n_items = (NCH(n) - 2) / 2;
+ items = asdl_seq_new(n_items, c->c_arena);
+ if (!items)
return NULL;
-
- for (;;) {
- i -= 2;
- ret = ast_for_with_item(c, CHILD(n, i), inner);
- if (!ret)
- return NULL;
- /* was this the last item? */
- if (i == 1)
- break;
- /* if not, wrap the result so far in a new sequence */
- inner = asdl_seq_new(1, c->c_arena);
- if (!inner)
+ for (i = 1; i < NCH(n) - 2; i += 2) {
+ withitem_ty item = ast_for_with_item(c, CHILD(n, i));
+ if (!item)
return NULL;
- asdl_seq_SET(inner, 0, ret);
+ asdl_seq_SET(items, (i - 1) / 2, item);
}
- return ret;
+ body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
+ if (!body)
+ return NULL;
+
+ return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
}
static stmt_ty
@@ -3045,7 +3497,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 3), 0))
+ if (forbidden_name(c, classname, CHILD(n, 3), 0))
return NULL;
return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
LINENO(n), n->n_col_offset, c->c_arena);
@@ -3058,7 +3510,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 3), 0))
+ if (forbidden_name(c, classname, CHILD(n, 3), 0))
return NULL;
return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
LINENO(n), n->n_col_offset, c->c_arena);
@@ -3083,7 +3535,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 1), 0))
+ if (forbidden_name(c, classname, CHILD(n, 1), 0))
return NULL;
return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
@@ -3209,20 +3661,14 @@ parsenumber(struct compiling *c, const char *s)
}
static PyObject *
-decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
+decode_utf8(struct compiling *c, const char **sPtr, const char *end)
{
- PyObject *u, *v;
char *s, *t;
t = s = (char *)*sPtr;
/* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
while (s < end && (*s & 0x80)) s++;
*sPtr = s;
- u = PyUnicode_DecodeUTF8(t, s - t, NULL);
- if (u == NULL)
- return NULL;
- v = PyUnicode_AsEncodedString(u, encoding, NULL);
- Py_DECREF(u);
- return v;
+ return PyUnicode_DecodeUTF8(t, s - t, NULL);
}
static PyObject *
@@ -3234,7 +3680,6 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons
const char *end;
if (encoding == NULL) {
- buf = (char *)s;
u = NULL;
} else {
/* check for integer overflow */
@@ -3257,22 +3702,20 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons
}
if (*s & 0x80) { /* XXX inefficient */
PyObject *w;
- char *r;
- Py_ssize_t rn, i;
- w = decode_utf8(c, &s, end, "utf-32-be");
+ int kind;
+ void *data;
+ Py_ssize_t len, i;
+ w = decode_utf8(c, &s, end);
if (w == NULL) {
Py_DECREF(u);
return NULL;
}
- r = PyBytes_AS_STRING(w);
- rn = Py_SIZE(w);
- assert(rn % 4 == 0);
- for (i = 0; i < rn; i += 4) {
- sprintf(p, "\\U%02x%02x%02x%02x",
- r[i + 0] & 0xFF,
- r[i + 1] & 0xFF,
- r[i + 2] & 0xFF,
- r[i + 3] & 0xFF);
+ kind = PyUnicode_KIND(w);
+ data = PyUnicode_DATA(w);
+ len = PyUnicode_GET_LENGTH(w);
+ for (i = 0; i < len; i++) {
+ Py_UCS4 chr = PyUnicode_READ(kind, data, i);
+ sprintf(p, "\\U%08x", chr);
p += 10;
}
/* Should be impossible to overflow */
@@ -3306,13 +3749,21 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)
int rawmode = 0;
int need_encoding;
if (isalpha(quote)) {
- if (quote == 'b' || quote == 'B') {
- quote = *++s;
- *bytesmode = 1;
- }
- if (quote == 'r' || quote == 'R') {
- quote = *++s;
- rawmode = 1;
+ while (!*bytesmode || !rawmode) {
+ if (quote == 'b' || quote == 'B') {
+ quote = *++s;
+ *bytesmode = 1;
+ }
+ else if (quote == 'u' || quote == 'U') {
+ quote = *++s;
+ }
+ else if (quote == 'r' || quote == 'R') {
+ quote = *++s;
+ rawmode = 1;
+ }
+ else {
+ break;
+ }
}
}
if (quote != '\'' && quote != '\"') {
@@ -3343,10 +3794,10 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)
}
if (*bytesmode) {
/* Disallow non-ascii characters (but not escapes) */
- const char *c;
- for (c = s; *c; c++) {
- if (Py_CHARMASK(*c) >= 0x80) {
- ast_error(n, "bytes can only contain ASCII "
+ const char *ch;
+ for (ch = s; *ch; ch++) {
+ if (Py_CHARMASK(*ch) >= 0x80) {
+ ast_error(c, n, "bytes can only contain ASCII "
"literal characters.");
return NULL;
}
@@ -3394,7 +3845,7 @@ parsestrplus(struct compiling *c, const node *n, int *bytesmode)
if (s == NULL)
goto onError;
if (*bytesmode != subbm) {
- ast_error(n, "cannot mix bytes and nonbytes literals");
+ ast_error(c, n, "cannot mix bytes and nonbytes literals");
Py_DECREF(s);
goto onError;
}
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index b85e37b..0e6e6ff 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -6,6 +6,9 @@
#include "node.h"
#include "code.h"
+#include "asdl.h"
+#include "ast.h"
+
#include <ctype.h>
#ifdef HAVE_LANGINFO_H
@@ -18,20 +21,20 @@
Don't forget to modify PyUnicode_DecodeFSDefault() if you touch any of the
values for Py_FileSystemDefaultEncoding!
*/
-#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
+#ifdef HAVE_MBCS
const char *Py_FileSystemDefaultEncoding = "mbcs";
int Py_HasFileSystemDefaultEncoding = 1;
#elif defined(__APPLE__)
const char *Py_FileSystemDefaultEncoding = "utf-8";
int Py_HasFileSystemDefaultEncoding = 1;
-#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
+#else
const char *Py_FileSystemDefaultEncoding = NULL; /* set by initfsencoding() */
int Py_HasFileSystemDefaultEncoding = 0;
-#else
-const char *Py_FileSystemDefaultEncoding = "utf-8";
-int Py_HasFileSystemDefaultEncoding = 1;
#endif
+_Py_IDENTIFIER(fileno);
+_Py_IDENTIFIER(flush);
+
static PyObject *
builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
{
@@ -39,6 +42,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *cls = NULL;
Py_ssize_t nargs;
int isclass;
+ _Py_IDENTIFIER(__prepare__);
assert(args != NULL);
if (!PyTuple_Check(args)) {
@@ -99,6 +103,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
Py_INCREF(meta);
isclass = 1; /* meta is really a class */
}
+
if (isclass) {
/* meta is really a class, so check for a more derived
metaclass, or possible metaclass conflicts: */
@@ -118,7 +123,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
}
/* else: meta is not a class, so we cannot do the metaclass
calculation, so we will use the explicitly given object as it is */
- prep = PyObject_GetAttrString(meta, "__prepare__");
+ prep = _PyObject_GetAttrId(meta, &PyId___prepare__);
if (prep == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
@@ -179,21 +184,18 @@ builtin___import__(PyObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"name", "globals", "locals", "fromlist",
"level", 0};
- char *name;
- PyObject *globals = NULL;
- PyObject *locals = NULL;
- PyObject *fromlist = NULL;
- int level = -1;
+ PyObject *name, *globals = NULL, *locals = NULL, *fromlist = NULL;
+ int level = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__",
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|OOOi:__import__",
kwlist, &name, &globals, &locals, &fromlist, &level))
return NULL;
- return PyImport_ImportModuleLevel(name, globals, locals,
- fromlist, level);
+ return PyImport_ImportModuleLevelObject(name, globals, locals,
+ fromlist, level);
}
PyDoc_STRVAR(import_doc,
-"__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module\n\
+"__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module\n\
\n\
Import a module. Because this function is meant for use by the Python\n\
interpreter and not for general use it is better to use\n\
@@ -206,8 +208,7 @@ empty list to emulate ``import name''.\n\
When importing a module from a package, note that __import__('A.B', ...)\n\
returns package A when fromlist is empty, but its submodule B when\n\
fromlist is not empty. Level is used to determine whether to perform \n\
-absolute or relative imports. -1 is the original strategy of attempting\n\
-both absolute and relative imports, 0 is absolute, a positive number\n\
+absolute or relative imports. 0 is absolute while a positive number\n\
is the number of parent directories to search relative to the current module.");
@@ -436,6 +437,19 @@ filter_next(filterobject *lz)
}
}
+static PyObject *
+filter_reduce(filterobject *lz)
+{
+ return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->func, lz->it);
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyMethodDef filter_methods[] = {
+ {"__reduce__", (PyCFunction)filter_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(filter_doc,
"filter(function or None, iterable) --> filter object\n\
\n\
@@ -472,7 +486,7 @@ PyTypeObject PyFilter_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)filter_next, /* tp_iternext */
- 0, /* tp_methods */
+ filter_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -516,17 +530,10 @@ builtin_chr(PyObject *self, PyObject *args)
return PyUnicode_FromOrdinal(x);
}
-PyDoc_VAR(chr_doc) = PyDoc_STR(
+PyDoc_STRVAR(chr_doc,
"chr(i) -> Unicode character\n\
\n\
-Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."
-)
-#ifndef Py_UNICODE_WIDE
-PyDoc_STR(
-"\nIf 0x10000 <= i, a surrogate pair is returned."
-)
-#endif
-;
+Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");
static char *
@@ -537,8 +544,8 @@ source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf)
if (PyUnicode_Check(cmd)) {
cf->cf_flags |= PyCF_IGNORE_COOKIE;
- cmd = _PyUnicode_AsDefaultEncodedString(cmd, NULL);
- if (cmd == NULL)
+ str = PyUnicode_AsUTF8AndSize(cmd, &size);
+ if (str == NULL)
return NULL;
}
else if (!PyObject_CheckReadBuffer(cmd)) {
@@ -547,9 +554,10 @@ source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf)
funcname, what);
return NULL;
}
- if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) {
+ else if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) {
return NULL;
}
+
if (strlen(str) != size) {
PyErr_SetString(PyExc_TypeError,
"source code string cannot contain null bytes");
@@ -638,6 +646,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
PyArena_Free(arena);
goto error;
}
+ if (!PyAST_Validate(mod)) {
+ PyArena_Free(arena);
+ goto error;
+ }
result = (PyObject*)PyAST_CompileEx(mod, filename,
&cf, optimize, arena);
PyArena_Free(arena);
@@ -793,7 +805,6 @@ builtin_exec(PyObject *self, PyObject *args)
{
PyObject *v;
PyObject *prog, *globals = Py_None, *locals = Py_None;
- int plain = 0;
if (!PyArg_UnpackTuple(args, "exec", 1, 3, &prog, &globals, &locals))
return NULL;
@@ -802,7 +813,6 @@ builtin_exec(PyObject *self, PyObject *args)
globals = PyEval_GetGlobals();
if (locals == Py_None) {
locals = PyEval_GetLocals();
- plain = 1;
}
if (!globals || !locals) {
PyErr_SetString(PyExc_SystemError,
@@ -1058,6 +1068,31 @@ map_next(mapobject *lz)
return result;
}
+static PyObject *
+map_reduce(mapobject *lz)
+{
+ Py_ssize_t numargs = PyTuple_GET_SIZE(lz->iters);
+ PyObject *args = PyTuple_New(numargs+1);
+ Py_ssize_t i;
+ if (args == NULL)
+ return NULL;
+ Py_INCREF(lz->func);
+ PyTuple_SET_ITEM(args, 0, lz->func);
+ for (i = 0; i<numargs; i++){
+ PyObject *it = PyTuple_GET_ITEM(lz->iters, i);
+ Py_INCREF(it);
+ PyTuple_SET_ITEM(args, i+1, it);
+ }
+
+ return Py_BuildValue("ON", Py_TYPE(lz), args);
+}
+
+static PyMethodDef map_methods[] = {
+ {"__reduce__", (PyCFunction)map_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+
PyDoc_STRVAR(map_doc,
"map(func, *iterables) --> map object\n\
\n\
@@ -1094,7 +1129,7 @@ PyTypeObject PyMap_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)map_next, /* tp_iternext */
- 0, /* tp_methods */
+ map_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1118,7 +1153,7 @@ builtin_next(PyObject *self, PyObject *args)
return NULL;
if (!PyIter_Check(it)) {
PyErr_Format(PyExc_TypeError,
- "%.200s object is not an iterator",
+ "'%.200s' object is not an iterator",
it->ob_type->tp_name);
return NULL;
}
@@ -1424,24 +1459,13 @@ builtin_ord(PyObject *self, PyObject* obj)
}
}
else if (PyUnicode_Check(obj)) {
- size = PyUnicode_GET_SIZE(obj);
+ if (PyUnicode_READY(obj) == -1)
+ return NULL;
+ size = PyUnicode_GET_LENGTH(obj);
if (size == 1) {
- ord = (long)*PyUnicode_AS_UNICODE(obj);
+ ord = (long)PyUnicode_READ_CHAR(obj, 0);
return PyLong_FromLong(ord);
}
-#ifndef Py_UNICODE_WIDE
- if (size == 2) {
- /* Decode a valid surrogate pair */
- int c0 = PyUnicode_AS_UNICODE(obj)[0];
- int c1 = PyUnicode_AS_UNICODE(obj)[1];
- if (0xD800 <= c0 && c0 <= 0xDBFF &&
- 0xDC00 <= c1 && c1 <= 0xDFFF) {
- ord = ((((c0 & 0x03FF) << 10) | (c1 & 0x03FF)) +
- 0x00010000);
- return PyLong_FromLong(ord);
- }
- }
-#endif
}
else if (PyByteArray_Check(obj)) {
/* XXX Hopefully this is temporary */
@@ -1469,13 +1493,7 @@ PyDoc_VAR(ord_doc) = PyDoc_STR(
"ord(c) -> integer\n\
\n\
Return the integer ordinal of a one-character string."
-)
-#ifndef Py_UNICODE_WIDE
-PyDoc_STR(
-"\nA valid surrogate pair is also accepted."
-)
-#endif
-;
+);
static PyObject *
@@ -1499,15 +1517,15 @@ equivalent to (x**y) % z, but may be more efficient (e.g. for longs).");
static PyObject *
builtin_print(PyObject *self, PyObject *args, PyObject *kwds)
{
- static char *kwlist[] = {"sep", "end", "file", 0};
+ static char *kwlist[] = {"sep", "end", "file", "flush", 0};
static PyObject *dummy_args;
- PyObject *sep = NULL, *end = NULL, *file = NULL;
+ PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL;
int i, err;
if (dummy_args == NULL && !(dummy_args = PyTuple_New(0)))
- return NULL;
- if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOO:print",
- kwlist, &sep, &end, &file))
+ return NULL;
+ if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOOO:print",
+ kwlist, &sep, &end, &file, &flush))
return NULL;
if (file == NULL || file == Py_None) {
file = PySys_GetObject("stdout");
@@ -1558,17 +1576,32 @@ builtin_print(PyObject *self, PyObject *args, PyObject *kwds)
if (err)
return NULL;
+ if (flush != NULL) {
+ PyObject *tmp;
+ int do_flush = PyObject_IsTrue(flush);
+ if (do_flush == -1)
+ return NULL;
+ else if (do_flush) {
+ tmp = PyObject_CallMethod(file, "flush", "");
+ if (tmp == NULL)
+ return NULL;
+ else
+ Py_DECREF(tmp);
+ }
+ }
+
Py_RETURN_NONE;
}
PyDoc_STRVAR(print_doc,
-"print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\
+"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\
\n\
Prints the values to a stream, or to sys.stdout by default.\n\
Optional keyword arguments:\n\
-file: a file-like object (stream); defaults to the current sys.stdout.\n\
-sep: string inserted between values, default a space.\n\
-end: string appended after the last value, default a newline.");
+file: a file-like object (stream); defaults to the current sys.stdout.\n\
+sep: string inserted between values, default a space.\n\
+end: string appended after the last value, default a newline.\n\
+flush: whether to forcibly flush the stream.");
static PyObject *
@@ -1604,7 +1637,7 @@ builtin_input(PyObject *self, PyObject *args)
}
/* First of all, flush stderr */
- tmp = PyObject_CallMethod(ferr, "flush", "");
+ tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1613,7 +1646,7 @@ builtin_input(PyObject *self, PyObject *args)
/* We should only use (GNU) readline if Python's sys.stdin and
sys.stdout are the same as C's stdin and stdout, because we
need to pass it those. */
- tmp = PyObject_CallMethod(fin, "fileno", "");
+ tmp = _PyObject_CallMethodId(fin, &PyId_fileno, "");
if (tmp == NULL) {
PyErr_Clear();
tty = 0;
@@ -1626,7 +1659,7 @@ builtin_input(PyObject *self, PyObject *args)
tty = fd == fileno(stdin) && isatty(fd);
}
if (tty) {
- tmp = PyObject_CallMethod(fout, "fileno", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_fileno, "");
if (tmp == NULL)
PyErr_Clear();
else {
@@ -1648,9 +1681,11 @@ builtin_input(PyObject *self, PyObject *args)
char *stdin_encoding_str, *stdin_errors_str;
PyObject *result;
size_t len;
+ _Py_IDENTIFIER(encoding);
+ _Py_IDENTIFIER(errors);
- stdin_encoding = PyObject_GetAttrString(fin, "encoding");
- stdin_errors = PyObject_GetAttrString(fin, "errors");
+ stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding);
+ stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);
if (!stdin_encoding || !stdin_errors)
/* stdin is a text stream, so it must have an
encoding. */
@@ -1659,7 +1694,7 @@ builtin_input(PyObject *self, PyObject *args)
stdin_errors_str = _PyUnicode_AsString(stdin_errors);
if (!stdin_encoding_str || !stdin_errors_str)
goto _readline_errors;
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1668,8 +1703,8 @@ builtin_input(PyObject *self, PyObject *args)
/* We have a prompt, encode it as stdout would */
char *stdout_encoding_str, *stdout_errors_str;
PyObject *stringpo;
- stdout_encoding = PyObject_GetAttrString(fout, "encoding");
- stdout_errors = PyObject_GetAttrString(fout, "errors");
+ stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding);
+ stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors);
if (!stdout_encoding || !stdout_errors)
goto _readline_errors;
stdout_encoding_str = _PyUnicode_AsString(stdout_encoding);
@@ -1739,7 +1774,7 @@ builtin_input(PyObject *self, PyObject *args)
if (PyFile_WriteObject(promptarg, fout, Py_PRINT_RAW) != 0)
return NULL;
}
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1821,6 +1856,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *callable;
static char *kwlist[] = {"iterable", "key", "reverse", 0};
int reverse;
+ _Py_IDENTIFIER(sort);
/* args 1-3 should match listsort in Objects/listobject.c */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted",
@@ -1831,7 +1867,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
if (newlist == NULL)
return NULL;
- callable = PyObject_GetAttrString(newlist, "sort");
+ callable = _PyObject_GetAttrId(newlist, &PyId_sort);
if (callable == NULL) {
Py_DECREF(newlist);
return NULL;
@@ -1877,7 +1913,8 @@ builtin_vars(PyObject *self, PyObject *args)
Py_INCREF(d);
}
else {
- d = PyObject_GetAttrString(v, "__dict__");
+ _Py_IDENTIFIER(__dict__);
+ d = _PyObject_GetAttrId(v, &PyId___dict__);
if (d == NULL) {
PyErr_SetString(PyExc_TypeError,
"vars() argument must have __dict__ attribute");
@@ -1921,12 +1958,18 @@ builtin_sum(PyObject *self, PyObject *args)
Py_DECREF(iter);
return NULL;
}
- if (PyByteArray_Check(result)) {
+ if (PyBytes_Check(result)) {
PyErr_SetString(PyExc_TypeError,
"sum() can't sum bytes [use b''.join(seq) instead]");
Py_DECREF(iter);
return NULL;
}
+ if (PyByteArray_Check(result)) {
+ PyErr_SetString(PyExc_TypeError,
+ "sum() can't sum bytearray [use b''.join(seq) instead]");
+ Py_DECREF(iter);
+ return NULL;
+ }
Py_INCREF(result);
}
@@ -2229,6 +2272,18 @@ zip_next(zipobject *lz)
return result;
}
+static PyObject *
+zip_reduce(zipobject *lz)
+{
+ /* Just recreate the zip with the internal iterator tuple */
+ return Py_BuildValue("OO", Py_TYPE(lz), lz->ittuple);
+}
+
+static PyMethodDef zip_methods[] = {
+ {"__reduce__", (PyCFunction)zip_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(zip_doc,
"zip(iter1 [,iter2 [...]]) --> zip object\n\
\n\
@@ -2267,7 +2322,7 @@ PyTypeObject PyZip_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)zip_next, /* tp_iternext */
- 0, /* tp_methods */
+ zip_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
diff --git a/Python/ceval.c b/Python/ceval.c
index f0ea7c9..82bfcc6 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -138,7 +138,7 @@ static void format_exc_check_arg(PyObject *, const char *, PyObject *);
static void format_exc_unbound(PyCodeObject *co, int oparg);
static PyObject * unicode_concatenate(PyObject *, PyObject *,
PyFrameObject *, unsigned char *);
-static PyObject * special_lookup(PyObject *, char *, PyObject **);
+static PyObject * special_lookup(PyObject *, _Py_Identifier *);
#define NAME_ERROR_MSG \
"name '%.200s' is not defined"
@@ -372,6 +372,7 @@ PyEval_ReleaseThread(PyThreadState *tstate)
void
PyEval_ReInitThreads(void)
{
+ _Py_IDENTIFIER(_after_fork);
PyObject *threading, *result;
PyThreadState *tstate = PyThreadState_GET();
@@ -392,7 +393,7 @@ PyEval_ReInitThreads(void)
PyErr_Clear();
return;
}
- result = PyObject_CallMethod(threading, "_after_fork", NULL);
+ result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL);
if (result == NULL)
PyErr_WriteUnraisable(threading);
else
@@ -491,7 +492,6 @@ static struct {
} pendingcalls[NPENDINGCALLS];
static int pendingfirst = 0;
static int pendinglast = 0;
-static char pendingbusy = 0;
int
Py_AddPendingCall(int (*func)(void *), void *arg)
@@ -538,6 +538,7 @@ Py_AddPendingCall(int (*func)(void *), void *arg)
int
Py_MakePendingCalls(void)
{
+ static int busy = 0;
int i;
int r = 0;
@@ -552,9 +553,9 @@ Py_MakePendingCalls(void)
if (main_thread && PyThread_get_thread_ident() != main_thread)
return 0;
/* don't perform recursive pending calls */
- if (pendingbusy)
+ if (busy)
return 0;
- pendingbusy = 1;
+ busy = 1;
/* perform a bounded number of calls, in case of recursion */
for (i=0; i<NPENDINGCALLS; i++) {
int j;
@@ -583,7 +584,7 @@ Py_MakePendingCalls(void)
if (r)
break;
}
- pendingbusy = 0;
+ busy = 0;
return r;
}
@@ -749,6 +750,9 @@ enum why_code {
WHY_SILENCED = 0x0080 /* Exception silenced by 'with' */
};
+static void save_exc_state(PyThreadState *, PyFrameObject *);
+static void swap_exc_state(PyThreadState *, PyFrameObject *);
+static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *);
static enum why_code do_raise(PyObject *, PyObject *);
static int unpack_iterable(PyObject *, int, int, PyObject **);
@@ -817,9 +821,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
unsigned char *first_instr;
PyObject *names;
PyObject *consts;
-#if defined(Py_DEBUG) || defined(LLTRACE)
- /* Make it easier to find out where we are with a debugger */
- char *filename;
+
+#ifdef LLTRACE
+ _Py_IDENTIFIER(__ltrace__);
#endif
/* Computed GOTOs, or
@@ -1114,59 +1118,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Py_XDECREF(traceback); \
}
-#define SAVE_EXC_STATE() \
- { \
- PyObject *type, *value, *traceback; \
- Py_XINCREF(tstate->exc_type); \
- Py_XINCREF(tstate->exc_value); \
- Py_XINCREF(tstate->exc_traceback); \
- type = f->f_exc_type; \
- value = f->f_exc_value; \
- traceback = f->f_exc_traceback; \
- f->f_exc_type = tstate->exc_type; \
- f->f_exc_value = tstate->exc_value; \
- f->f_exc_traceback = tstate->exc_traceback; \
- Py_XDECREF(type); \
- Py_XDECREF(value); \
- Py_XDECREF(traceback); \
- }
-
-#define SWAP_EXC_STATE() \
- { \
- PyObject *tmp; \
- tmp = tstate->exc_type; \
- tstate->exc_type = f->f_exc_type; \
- f->f_exc_type = tmp; \
- tmp = tstate->exc_value; \
- tstate->exc_value = f->f_exc_value; \
- f->f_exc_value = tmp; \
- tmp = tstate->exc_traceback; \
- tstate->exc_traceback = f->f_exc_traceback; \
- f->f_exc_traceback = tmp; \
- }
-
-#define RESTORE_AND_CLEAR_EXC_STATE() \
- { \
- PyObject *type, *value, *tb; \
- type = tstate->exc_type; \
- value = tstate->exc_value; \
- tb = tstate->exc_traceback; \
- tstate->exc_type = f->f_exc_type; \
- tstate->exc_value = f->f_exc_value; \
- tstate->exc_traceback = f->f_exc_traceback; \
- f->f_exc_type = NULL; \
- f->f_exc_value = NULL; \
- f->f_exc_traceback = NULL; \
- Py_XDECREF(type); \
- Py_XDECREF(value); \
- Py_XDECREF(tb); \
- }
-
/* Start of code */
- if (f == NULL)
- return NULL;
-
/* push frame */
if (Py_EnterRecursiveCall(""))
return NULL;
@@ -1221,6 +1174,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
f->f_lasti to -1 (i.e. the index *before* the first instruction)
and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
does work. Promise.
+ YIELD_FROM sets f_lasti to itself, in order to repeated yield
+ multiple values.
When the PREDICT() macros are enabled, some opcode pairs follow in
direct succession without updating f->f_lasti. A successful
@@ -1240,27 +1195,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
/* We were in an except handler when we left,
restore the exception state which was put aside
(see YIELD_VALUE). */
- SWAP_EXC_STATE();
- }
- else {
- SAVE_EXC_STATE();
+ swap_exc_state(tstate, f);
}
+ else
+ save_exc_state(tstate, f);
}
#ifdef LLTRACE
- lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
-#endif
-#if defined(Py_DEBUG) || defined(LLTRACE)
- {
- PyObject *error_type, *error_value, *error_traceback;
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
- filename = _PyUnicode_AsString(co->co_filename);
- if (filename == NULL && tstate->overflowed) {
- /* maximum recursion depth exceeded */
- goto exit_eval_frame;
- }
- PyErr_Restore(error_type, error_value, error_traceback);
- }
+ lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
#endif
why = WHY_NOT;
@@ -1412,8 +1354,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
x to NULL, err to nonzero, or why to anything but WHY_NOT,
and that no operation that succeeds does this! */
- /* case STOP_CODE: this is an error! */
-
TARGET(NOP)
FAST_DISPATCH();
@@ -1894,6 +1834,40 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
why = WHY_RETURN;
goto fast_block_end;
+ TARGET(YIELD_FROM)
+ u = POP();
+ x = TOP();
+ /* send u to x */
+ if (PyGen_CheckExact(x)) {
+ retval = _PyGen_Send((PyGenObject *)x, u);
+ } else {
+ _Py_IDENTIFIER(send);
+ if (u == Py_None)
+ retval = Py_TYPE(x)->tp_iternext(x);
+ else
+ retval = _PyObject_CallMethodId(x, &PyId_send, "O", u);
+ }
+ Py_DECREF(u);
+ if (!retval) {
+ PyObject *val;
+ x = POP(); /* Remove iter from stack */
+ Py_DECREF(x);
+ err = _PyGen_FetchStopIterationValue(&val);
+ if (err < 0) {
+ x = NULL;
+ break;
+ }
+ x = val;
+ PUSH(x);
+ continue;
+ }
+ /* x remains on stack, retval is value to be yielded */
+ f->f_stacktop = stack_pointer;
+ why = WHY_YIELD;
+ /* and repeat... */
+ f->f_lasti--;
+ goto fast_yield;
+
TARGET(YIELD_VALUE)
retval = POP();
f->f_stacktop = stack_pointer;
@@ -1956,16 +1930,33 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
break;
TARGET(LOAD_BUILD_CLASS)
- x = PyDict_GetItemString(f->f_builtins,
- "__build_class__");
- if (x == NULL) {
- PyErr_SetString(PyExc_ImportError,
- "__build_class__ not found");
- break;
+ {
+ _Py_IDENTIFIER(__build_class__);
+
+ if (PyDict_CheckExact(f->f_builtins)) {
+ x = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__);
+ if (x == NULL) {
+ PyErr_SetString(PyExc_NameError,
+ "__build_class__ not found");
+ break;
+ }
+ Py_INCREF(x);
+ }
+ else {
+ PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
+ if (build_class_str == NULL)
+ break;
+ x = PyObject_GetItem(f->f_builtins, build_class_str);
+ if (x == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ PyErr_SetString(PyExc_NameError,
+ "__build_class__ not found");
+ break;
+ }
}
- Py_INCREF(x);
PUSH(x);
break;
+ }
TARGET(STORE_NAME)
w = GETITEM(names, oparg);
@@ -2101,70 +2092,62 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
}
if (x == NULL) {
x = PyDict_GetItem(f->f_globals, w);
+ Py_XINCREF(x);
if (x == NULL) {
- x = PyDict_GetItem(f->f_builtins, w);
- if (x == NULL) {
- format_exc_check_arg(
- PyExc_NameError,
- NAME_ERROR_MSG, w);
- break;
+ if (PyDict_CheckExact(f->f_builtins)) {
+ x = PyDict_GetItem(f->f_builtins, w);
+ if (x == NULL) {
+ format_exc_check_arg(
+ PyExc_NameError,
+ NAME_ERROR_MSG, w);
+ break;
+ }
+ Py_INCREF(x);
+ }
+ else {
+ x = PyObject_GetItem(f->f_builtins, w);
+ if (x == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ format_exc_check_arg(
+ PyExc_NameError,
+ NAME_ERROR_MSG, w);
+ break;
+ }
}
}
- Py_INCREF(x);
}
PUSH(x);
DISPATCH();
TARGET(LOAD_GLOBAL)
w = GETITEM(names, oparg);
- if (PyUnicode_CheckExact(w)) {
- /* Inline the PyDict_GetItem() calls.
- WARNING: this is an extreme speed hack.
- Do not try this at home. */
- Py_hash_t hash = ((PyUnicodeObject *)w)->hash;
- if (hash != -1) {
- PyDictObject *d;
- PyDictEntry *e;
- d = (PyDictObject *)(f->f_globals);
- e = d->ma_lookup(d, w, hash);
- if (e == NULL) {
- x = NULL;
- break;
- }
- x = e->me_value;
- if (x != NULL) {
- Py_INCREF(x);
- PUSH(x);
- DISPATCH();
- }
- d = (PyDictObject *)(f->f_builtins);
- e = d->ma_lookup(d, w, hash);
- if (e == NULL) {
- x = NULL;
- break;
- }
- x = e->me_value;
- if (x != NULL) {
- Py_INCREF(x);
- PUSH(x);
- DISPATCH();
- }
- goto load_global_error;
+ if (PyDict_CheckExact(f->f_globals)
+ && PyDict_CheckExact(f->f_builtins)) {
+ x = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
+ (PyDictObject *)f->f_builtins,
+ w);
+ if (x == NULL) {
+ if (!PyErr_Occurred())
+ format_exc_check_arg(PyExc_NameError,
+ GLOBAL_NAME_ERROR_MSG, w);
+ break;
}
+ Py_INCREF(x);
}
- /* This is the un-inlined version of the code above */
- x = PyDict_GetItem(f->f_globals, w);
- if (x == NULL) {
- x = PyDict_GetItem(f->f_builtins, w);
+ else {
+ /* Slow-path if globals or builtins is not a dict */
+ x = PyObject_GetItem(f->f_globals, w);
if (x == NULL) {
- load_global_error:
- format_exc_check_arg(
- PyExc_NameError,
- GLOBAL_NAME_ERROR_MSG, w);
- break;
+ x = PyObject_GetItem(f->f_builtins, w);
+ if (x == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_KeyError))
+ format_exc_check_arg(
+ PyExc_NameError,
+ GLOBAL_NAME_ERROR_MSG, w);
+ break;
+ }
}
}
- Py_INCREF(x);
PUSH(x);
DISPATCH();
@@ -2313,8 +2296,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
DISPATCH();
TARGET(IMPORT_NAME)
+ {
+ _Py_IDENTIFIER(__import__);
w = GETITEM(names, oparg);
- x = PyDict_GetItemString(f->f_builtins, "__import__");
+ x = _PyDict_GetItemId(f->f_builtins, &PyId___import__);
if (x == NULL) {
PyErr_SetString(PyExc_ImportError,
"__import__ not found");
@@ -2355,6 +2340,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
SET_TOP(x);
if (x != NULL) DISPATCH();
break;
+ }
TARGET(IMPORT_STAR)
v = POP();
@@ -2559,13 +2545,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
TARGET(SETUP_WITH)
{
- static PyObject *exit, *enter;
+ _Py_IDENTIFIER(__exit__);
+ _Py_IDENTIFIER(__enter__);
w = TOP();
- x = special_lookup(w, "__exit__", &exit);
+ x = special_lookup(w, &PyId___exit__);
if (!x)
break;
SET_TOP(x);
- u = special_lookup(w, "__enter__", &enter);
+ u = special_lookup(w, &PyId___enter__);
Py_DECREF(w);
if (!u) {
x = NULL;
@@ -2725,7 +2712,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Py_DECREF(*pfunc);
*pfunc = self;
na++;
- n++;
+ /* n++; */
} else
Py_INCREF(func);
sp = stack_pointer;
@@ -2753,9 +2740,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
int kwdefaults = (oparg>>8) & 0xff;
int num_annotations = (oparg >> 16) & 0x7fff;
+ w = POP(); /* qualname */
v = POP(); /* code object */
- x = PyFunction_New(v, f->f_globals);
+ x = PyFunction_NewWithQualName(v, f->f_globals, w);
Py_DECREF(v);
+ Py_DECREF(w);
if (x != NULL && opcode == MAKE_CLOSURE) {
v = POP();
@@ -3049,9 +3038,9 @@ fast_yield:
break;
if (i == f->f_iblock)
/* We did not create this exception. */
- RESTORE_AND_CLEAR_EXC_STATE()
+ restore_and_clear_exc_state(tstate, f);
else
- SWAP_EXC_STATE()
+ swap_exc_state(tstate, f);
}
if (tstate->use_tracing) {
@@ -3081,7 +3070,7 @@ fast_yield:
PyTrace_RETURN, retval)) {
Py_XDECREF(retval);
retval = NULL;
- why = WHY_EXCEPTION;
+ /* why = WHY_EXCEPTION; */
}
}
}
@@ -3094,6 +3083,156 @@ exit_eval_frame:
return retval;
}
+static void
+format_missing(const char *kind, PyCodeObject *co, PyObject *names)
+{
+ int err;
+ Py_ssize_t len = PyList_GET_SIZE(names);
+ PyObject *name_str, *comma, *tail, *tmp;
+
+ assert(PyList_CheckExact(names));
+ assert(len >= 1);
+ /* Deal with the joys of natural language. */
+ switch (len) {
+ case 1:
+ name_str = PyList_GET_ITEM(names, 0);
+ Py_INCREF(name_str);
+ break;
+ case 2:
+ name_str = PyUnicode_FromFormat("%U and %U",
+ PyList_GET_ITEM(names, len - 2),
+ PyList_GET_ITEM(names, len - 1));
+ break;
+ default:
+ tail = PyUnicode_FromFormat(", %U, and %U",
+ PyList_GET_ITEM(names, len - 2),
+ PyList_GET_ITEM(names, len - 1));
+ if (tail == NULL)
+ return;
+ /* Chop off the last two objects in the list. This shouldn't actually
+ fail, but we can't be too careful. */
+ err = PyList_SetSlice(names, len - 2, len, NULL);
+ if (err == -1) {
+ Py_DECREF(tail);
+ return;
+ }
+ /* Stitch everything up into a nice comma-separated list. */
+ comma = PyUnicode_FromString(", ");
+ if (comma == NULL) {
+ Py_DECREF(tail);
+ return;
+ }
+ tmp = PyUnicode_Join(comma, names);
+ Py_DECREF(comma);
+ if (tmp == NULL) {
+ Py_DECREF(tail);
+ return;
+ }
+ name_str = PyUnicode_Concat(tmp, tail);
+ Py_DECREF(tmp);
+ Py_DECREF(tail);
+ break;
+ }
+ if (name_str == NULL)
+ return;
+ PyErr_Format(PyExc_TypeError,
+ "%U() missing %i required %s argument%s: %U",
+ co->co_name,
+ len,
+ kind,
+ len == 1 ? "" : "s",
+ name_str);
+ Py_DECREF(name_str);
+}
+
+static void
+missing_arguments(PyCodeObject *co, int missing, int defcount,
+ PyObject **fastlocals)
+{
+ int i, j = 0;
+ int start, end;
+ int positional = defcount != -1;
+ const char *kind = positional ? "positional" : "keyword-only";
+ PyObject *missing_names;
+
+ /* Compute the names of the arguments that are missing. */
+ missing_names = PyList_New(missing);
+ if (missing_names == NULL)
+ return;
+ if (positional) {
+ start = 0;
+ end = co->co_argcount - defcount;
+ }
+ else {
+ start = co->co_argcount;
+ end = start + co->co_kwonlyargcount;
+ }
+ for (i = start; i < end; i++) {
+ if (GETLOCAL(i) == NULL) {
+ PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
+ PyObject *name = PyObject_Repr(raw);
+ if (name == NULL) {
+ Py_DECREF(missing_names);
+ return;
+ }
+ PyList_SET_ITEM(missing_names, j++, name);
+ }
+ }
+ assert(j == missing);
+ format_missing(kind, co, missing_names);
+ Py_DECREF(missing_names);
+}
+
+static void
+too_many_positional(PyCodeObject *co, int given, int defcount, PyObject **fastlocals)
+{
+ int plural;
+ int kwonly_given = 0;
+ int i;
+ PyObject *sig, *kwonly_sig;
+
+ assert((co->co_flags & CO_VARARGS) == 0);
+ /* Count missing keyword-only args. */
+ for (i = co->co_argcount; i < co->co_argcount + co->co_kwonlyargcount; i++)
+ if (GETLOCAL(i) != NULL)
+ kwonly_given++;
+ if (defcount) {
+ int atleast = co->co_argcount - defcount;
+ plural = 1;
+ sig = PyUnicode_FromFormat("from %d to %d", atleast, co->co_argcount);
+ }
+ else {
+ plural = co->co_argcount != 1;
+ sig = PyUnicode_FromFormat("%d", co->co_argcount);
+ }
+ if (sig == NULL)
+ return;
+ if (kwonly_given) {
+ const char *format = " positional argument%s (and %d keyword-only argument%s)";
+ kwonly_sig = PyUnicode_FromFormat(format, given != 1 ? "s" : "", kwonly_given,
+ kwonly_given != 1 ? "s" : "");
+ if (kwonly_sig == NULL) {
+ Py_DECREF(sig);
+ return;
+ }
+ }
+ else {
+ /* This will not fail. */
+ kwonly_sig = PyUnicode_FromString("");
+ assert(kwonly_sig != NULL);
+ }
+ PyErr_Format(PyExc_TypeError,
+ "%U() takes %U positional argument%s but %d%U %s given",
+ co->co_name,
+ sig,
+ plural ? "s" : "",
+ given,
+ kwonly_sig,
+ given == 1 && !kwonly_given ? "was" : "were");
+ Py_DECREF(sig);
+ Py_DECREF(kwonly_sig);
+}
+
/* This is gonna seem *real weird*, but if you put some other code between
PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
the test in the if statements in Misc/gdbinit (pystack and pystackv). */
@@ -3110,6 +3249,9 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
PyThreadState *tstate = PyThreadState_GET();
PyObject *x, *u;
int total_args = co->co_argcount + co->co_kwonlyargcount;
+ int i;
+ int n = argcount;
+ PyObject *kwdict = NULL;
if (globals == NULL) {
PyErr_SetString(PyExc_SystemError,
@@ -3126,212 +3268,153 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
fastlocals = f->f_localsplus;
freevars = f->f_localsplus + co->co_nlocals;
- if (total_args || co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
- int i;
- int n = argcount;
- PyObject *kwdict = NULL;
- if (co->co_flags & CO_VARKEYWORDS) {
- kwdict = PyDict_New();
- if (kwdict == NULL)
- goto fail;
- i = total_args;
- if (co->co_flags & CO_VARARGS)
- i++;
- SETLOCAL(i, kwdict);
- }
- if (argcount > co->co_argcount) {
- if (!(co->co_flags & CO_VARARGS)) {
- PyErr_Format(PyExc_TypeError,
- "%U() takes %s %d "
- "positional argument%s (%d given)",
- co->co_name,
- defcount ? "at most" : "exactly",
- co->co_argcount,
- co->co_argcount == 1 ? "" : "s",
- argcount + kwcount);
- goto fail;
- }
- n = co->co_argcount;
- }
- for (i = 0; i < n; i++) {
+ /* Parse arguments. */
+ if (co->co_flags & CO_VARKEYWORDS) {
+ kwdict = PyDict_New();
+ if (kwdict == NULL)
+ goto fail;
+ i = total_args;
+ if (co->co_flags & CO_VARARGS)
+ i++;
+ SETLOCAL(i, kwdict);
+ }
+ if (argcount > co->co_argcount)
+ n = co->co_argcount;
+ for (i = 0; i < n; i++) {
+ x = args[i];
+ Py_INCREF(x);
+ SETLOCAL(i, x);
+ }
+ if (co->co_flags & CO_VARARGS) {
+ u = PyTuple_New(argcount - n);
+ if (u == NULL)
+ goto fail;
+ SETLOCAL(total_args, u);
+ for (i = n; i < argcount; i++) {
x = args[i];
Py_INCREF(x);
- SETLOCAL(i, x);
+ PyTuple_SET_ITEM(u, i-n, x);
}
- if (co->co_flags & CO_VARARGS) {
- u = PyTuple_New(argcount - n);
- if (u == NULL)
- goto fail;
- SETLOCAL(total_args, u);
- for (i = n; i < argcount; i++) {
- x = args[i];
- Py_INCREF(x);
- PyTuple_SET_ITEM(u, i-n, x);
- }
+ }
+ for (i = 0; i < kwcount; i++) {
+ PyObject **co_varnames;
+ PyObject *keyword = kws[2*i];
+ PyObject *value = kws[2*i + 1];
+ int j;
+ if (keyword == NULL || !PyUnicode_Check(keyword)) {
+ PyErr_Format(PyExc_TypeError,
+ "%U() keywords must be strings",
+ co->co_name);
+ goto fail;
}
- for (i = 0; i < kwcount; i++) {
- PyObject **co_varnames;
- PyObject *keyword = kws[2*i];
- PyObject *value = kws[2*i + 1];
- int j;
- if (keyword == NULL || !PyUnicode_Check(keyword)) {
- PyErr_Format(PyExc_TypeError,
- "%U() keywords must be strings",
- co->co_name);
- goto fail;
- }
- /* Speed hack: do raw pointer compares. As names are
- normally interned this should almost always hit. */
- co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
- for (j = 0; j < total_args; j++) {
- PyObject *nm = co_varnames[j];
- if (nm == keyword)
- goto kw_found;
- }
- /* Slow fallback, just in case */
- for (j = 0; j < total_args; j++) {
- PyObject *nm = co_varnames[j];
- int cmp = PyObject_RichCompareBool(
- keyword, nm, Py_EQ);
- if (cmp > 0)
- goto kw_found;
- else if (cmp < 0)
- goto fail;
- }
- if (j >= total_args && kwdict == NULL) {
- PyErr_Format(PyExc_TypeError,
- "%U() got an unexpected "
- "keyword argument '%S'",
- co->co_name,
- keyword);
+ /* Speed hack: do raw pointer compares. As names are
+ normally interned this should almost always hit. */
+ co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
+ for (j = 0; j < total_args; j++) {
+ PyObject *nm = co_varnames[j];
+ if (nm == keyword)
+ goto kw_found;
+ }
+ /* Slow fallback, just in case */
+ for (j = 0; j < total_args; j++) {
+ PyObject *nm = co_varnames[j];
+ int cmp = PyObject_RichCompareBool(
+ keyword, nm, Py_EQ);
+ if (cmp > 0)
+ goto kw_found;
+ else if (cmp < 0)
goto fail;
- }
- PyDict_SetItem(kwdict, keyword, value);
- continue;
- kw_found:
- if (GETLOCAL(j) != NULL) {
- PyErr_Format(PyExc_TypeError,
+ }
+ if (j >= total_args && kwdict == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "%U() got an unexpected "
+ "keyword argument '%S'",
+ co->co_name,
+ keyword);
+ goto fail;
+ }
+ PyDict_SetItem(kwdict, keyword, value);
+ continue;
+ kw_found:
+ if (GETLOCAL(j) != NULL) {
+ PyErr_Format(PyExc_TypeError,
"%U() got multiple "
- "values for keyword "
- "argument '%S'",
+ "values for argument '%S'",
co->co_name,
keyword);
- goto fail;
- }
- Py_INCREF(value);
- SETLOCAL(j, value);
+ goto fail;
}
- if (co->co_kwonlyargcount > 0) {
- for (i = co->co_argcount; i < total_args; i++) {
- PyObject *name;
- if (GETLOCAL(i) != NULL)
- continue;
- name = PyTuple_GET_ITEM(co->co_varnames, i);
- if (kwdefs != NULL) {
- PyObject *def = PyDict_GetItem(kwdefs, name);
- if (def) {
- Py_INCREF(def);
- SETLOCAL(i, def);
- continue;
- }
- }
- PyErr_Format(PyExc_TypeError,
- "%U() needs keyword-only argument %S",
- co->co_name, name);
- goto fail;
- }
+ Py_INCREF(value);
+ SETLOCAL(j, value);
+ }
+ if (argcount > co->co_argcount && !(co->co_flags & CO_VARARGS)) {
+ too_many_positional(co, argcount, defcount, fastlocals);
+ goto fail;
+ }
+ if (argcount < co->co_argcount) {
+ int m = co->co_argcount - defcount;
+ int missing = 0;
+ for (i = argcount; i < m; i++)
+ if (GETLOCAL(i) == NULL)
+ missing++;
+ if (missing) {
+ missing_arguments(co, missing, defcount, fastlocals);
+ goto fail;
}
- if (argcount < co->co_argcount) {
- int m = co->co_argcount - defcount;
- for (i = argcount; i < m; i++) {
- if (GETLOCAL(i) == NULL) {
- int j, given = 0;
- for (j = 0; j < co->co_argcount; j++)
- if (GETLOCAL(j))
- given++;
- PyErr_Format(PyExc_TypeError,
- "%U() takes %s %d "
- "argument%s "
- "(%d given)",
- co->co_name,
- ((co->co_flags & CO_VARARGS) ||
- defcount) ? "at least"
- : "exactly",
- m, m == 1 ? "" : "s", given);
- goto fail;
- }
+ if (n > m)
+ i = n - m;
+ else
+ i = 0;
+ for (; i < defcount; i++) {
+ if (GETLOCAL(m+i) == NULL) {
+ PyObject *def = defs[i];
+ Py_INCREF(def);
+ SETLOCAL(m+i, def);
}
- if (n > m)
- i = n - m;
- else
- i = 0;
- for (; i < defcount; i++) {
- if (GETLOCAL(m+i) == NULL) {
- PyObject *def = defs[i];
+ }
+ }
+ if (co->co_kwonlyargcount > 0) {
+ int missing = 0;
+ for (i = co->co_argcount; i < total_args; i++) {
+ PyObject *name;
+ if (GETLOCAL(i) != NULL)
+ continue;
+ name = PyTuple_GET_ITEM(co->co_varnames, i);
+ if (kwdefs != NULL) {
+ PyObject *def = PyDict_GetItem(kwdefs, name);
+ if (def) {
Py_INCREF(def);
- SETLOCAL(m+i, def);
+ SETLOCAL(i, def);
+ continue;
}
}
+ missing++;
+ }
+ if (missing) {
+ missing_arguments(co, missing, -1, fastlocals);
+ goto fail;
}
}
- else if (argcount > 0 || kwcount > 0) {
- PyErr_Format(PyExc_TypeError,
- "%U() takes no arguments (%d given)",
- co->co_name,
- argcount + kwcount);
- goto fail;
- }
+
/* Allocate and initialize storage for cell vars, and copy free
- vars into frame. This isn't too efficient right now. */
- if (PyTuple_GET_SIZE(co->co_cellvars)) {
- int i, j, nargs, found;
- Py_UNICODE *cellname, *argname;
+ vars into frame. */
+ for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
PyObject *c;
-
- nargs = total_args;
- if (co->co_flags & CO_VARARGS)
- nargs++;
- if (co->co_flags & CO_VARKEYWORDS)
- nargs++;
-
- /* Initialize each cell var, taking into account
- cell vars that are initialized from arguments.
-
- Should arrange for the compiler to put cellvars
- that are arguments at the beginning of the cellvars
- list so that we can march over it more efficiently?
- */
- for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
- cellname = PyUnicode_AS_UNICODE(
- PyTuple_GET_ITEM(co->co_cellvars, i));
- found = 0;
- for (j = 0; j < nargs; j++) {
- argname = PyUnicode_AS_UNICODE(
- PyTuple_GET_ITEM(co->co_varnames, j));
- if (Py_UNICODE_strcmp(cellname, argname) == 0) {
- c = PyCell_New(GETLOCAL(j));
- if (c == NULL)
- goto fail;
- GETLOCAL(co->co_nlocals + i) = c;
- found = 1;
- break;
- }
- }
- if (found == 0) {
- c = PyCell_New(NULL);
- if (c == NULL)
- goto fail;
- SETLOCAL(co->co_nlocals + i, c);
- }
- }
+ int arg;
+ /* Possibly account for the cell variable being an argument. */
+ if (co->co_cell2arg != NULL &&
+ (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG)
+ c = PyCell_New(GETLOCAL(arg));
+ else
+ c = PyCell_New(NULL);
+ if (c == NULL)
+ goto fail;
+ SETLOCAL(co->co_nlocals + i, c);
}
- if (PyTuple_GET_SIZE(co->co_freevars)) {
- int i;
- for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
- PyObject *o = PyTuple_GET_ITEM(closure, i);
- Py_INCREF(o);
- freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
- }
+ for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
+ PyObject *o = PyTuple_GET_ITEM(closure, i);
+ Py_INCREF(o);
+ freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
}
if (co->co_flags & CO_GENERATOR) {
@@ -3365,18 +3448,72 @@ fail: /* Jump here from prelude on failure */
static PyObject *
-special_lookup(PyObject *o, char *meth, PyObject **cache)
+special_lookup(PyObject *o, _Py_Identifier *id)
{
PyObject *res;
- res = _PyObject_LookupSpecial(o, meth, cache);
+ res = _PyObject_LookupSpecial(o, id);
if (res == NULL && !PyErr_Occurred()) {
- PyErr_SetObject(PyExc_AttributeError, *cache);
+ PyErr_SetObject(PyExc_AttributeError, id->object);
return NULL;
}
return res;
}
+/* These 3 functions deal with the exception state of generators. */
+
+static void
+save_exc_state(PyThreadState *tstate, PyFrameObject *f)
+{
+ PyObject *type, *value, *traceback;
+ Py_XINCREF(tstate->exc_type);
+ Py_XINCREF(tstate->exc_value);
+ Py_XINCREF(tstate->exc_traceback);
+ type = f->f_exc_type;
+ value = f->f_exc_value;
+ traceback = f->f_exc_traceback;
+ f->f_exc_type = tstate->exc_type;
+ f->f_exc_value = tstate->exc_value;
+ f->f_exc_traceback = tstate->exc_traceback;
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(traceback);
+}
+
+static void
+swap_exc_state(PyThreadState *tstate, PyFrameObject *f)
+{
+ PyObject *tmp;
+ tmp = tstate->exc_type;
+ tstate->exc_type = f->f_exc_type;
+ f->f_exc_type = tmp;
+ tmp = tstate->exc_value;
+ tstate->exc_value = f->f_exc_value;
+ f->f_exc_value = tmp;
+ tmp = tstate->exc_traceback;
+ tstate->exc_traceback = f->f_exc_traceback;
+ f->f_exc_traceback = tmp;
+}
+
+static void
+restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f)
+{
+ PyObject *type, *value, *tb;
+ type = tstate->exc_type;
+ value = tstate->exc_value;
+ tb = tstate->exc_traceback;
+ tstate->exc_type = f->f_exc_type;
+ tstate->exc_value = f->f_exc_value;
+ tstate->exc_traceback = f->f_exc_traceback;
+ f->f_exc_type = NULL;
+ f->f_exc_value = NULL;
+ f->f_exc_traceback = NULL;
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(tb);
+}
+
+
/* Logic for the raise statement (too complicated for inlining).
This *consumes* a reference count to each of its arguments. */
static enum why_code
@@ -3446,6 +3583,10 @@ do_raise(PyObject *exc, PyObject *cause)
else if (PyExceptionInstance_Check(cause)) {
fixed_cause = cause;
}
+ else if (cause == Py_None) {
+ Py_DECREF(cause);
+ fixed_cause = NULL;
+ }
else {
PyErr_SetString(PyExc_TypeError,
"exception causes must derive from "
@@ -4192,7 +4333,7 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
PyErr_Format(PyExc_TypeError,
"%.200s%.200s argument after * "
- "must be a sequence, not %200s",
+ "must be a sequence, not %.200s",
PyEval_GetFuncName(func),
PyEval_GetFuncDesc(func),
stararg->ob_type->tp_name);
@@ -4342,7 +4483,9 @@ import_from(PyObject *v, PyObject *name)
static int
import_all_from(PyObject *locals, PyObject *v)
{
- PyObject *all = PyObject_GetAttrString(v, "__all__");
+ _Py_IDENTIFIER(__all__);
+ _Py_IDENTIFIER(__dict__);
+ PyObject *all = _PyObject_GetAttrId(v, &PyId___all__);
PyObject *dict, *name, *value;
int skip_leading_underscores = 0;
int pos, err;
@@ -4351,7 +4494,7 @@ import_all_from(PyObject *locals, PyObject *v)
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return -1; /* Unexpected error */
PyErr_Clear();
- dict = PyObject_GetAttrString(v, "__dict__");
+ dict = _PyObject_GetAttrId(v, &PyId___dict__);
if (dict == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
return -1;
@@ -4377,7 +4520,8 @@ import_all_from(PyObject *locals, PyObject *v)
}
if (skip_leading_underscores &&
PyUnicode_Check(name) &&
- PyUnicode_AS_UNICODE(name)[0] == '_')
+ PyUnicode_READY(name) != -1 &&
+ PyUnicode_READ_CHAR(name, 0) == '_')
{
Py_DECREF(name);
continue;
@@ -4437,19 +4581,9 @@ format_exc_unbound(PyCodeObject *co, int oparg)
static PyObject *
unicode_concatenate(PyObject *v, PyObject *w,
- PyFrameObject *f, unsigned char *next_instr)
+ PyFrameObject *f, unsigned char *next_instr)
{
- /* This function implements 'variable += expr' when both arguments
- are (Unicode) strings. */
- Py_ssize_t v_len = PyUnicode_GET_SIZE(v);
- Py_ssize_t w_len = PyUnicode_GET_SIZE(w);
- Py_ssize_t new_len = v_len + w_len;
- if (new_len < 0) {
- PyErr_SetString(PyExc_OverflowError,
- "strings are too large to concat");
- return NULL;
- }
-
+ PyObject *res;
if (Py_REFCNT(v) == 2) {
/* In the common case, there are 2 references to the value
* stored in 'variable' when the += is performed: one on the
@@ -4490,31 +4624,9 @@ unicode_concatenate(PyObject *v, PyObject *w,
}
}
}
-
- if (Py_REFCNT(v) == 1 && !PyUnicode_CHECK_INTERNED(v)) {
- /* Now we own the last reference to 'v', so we can resize it
- * in-place.
- */
- if (PyUnicode_Resize(&v, new_len) != 0) {
- /* XXX if PyUnicode_Resize() fails, 'v' has been
- * deallocated so it cannot be put back into
- * 'variable'. The MemoryError is raised when there
- * is no value in 'variable', which might (very
- * remotely) be a cause of incompatibilities.
- */
- return NULL;
- }
- /* copy 'w' into the newly allocated area of 'v' */
- memcpy(PyUnicode_AS_UNICODE(v) + v_len,
- PyUnicode_AS_UNICODE(w), w_len*sizeof(Py_UNICODE));
- return v;
- }
- else {
- /* When in-place resizing is not an option. */
- w = PyUnicode_Concat(v, w);
- Py_DECREF(v);
- return w;
- }
+ res = v;
+ PyUnicode_Append(&res, w);
+ return res;
}
#ifdef DYNAMIC_EXECUTION_PROFILE
diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h
index bf7a350..2702d5c 100644
--- a/Python/ceval_gil.h
+++ b/Python/ceval_gil.h
@@ -59,213 +59,49 @@ static unsigned long gil_interval = DEFAULT_INTERVAL;
(Note: this mechanism is enabled with FORCE_SWITCHING above)
*/
-#ifndef _POSIX_THREADS
-/* This means pthreads are not implemented in libc headers, hence the macro
- not present in unistd.h. But they still can be implemented as an external
- library (e.g. gnu pth in pthread emulation) */
-# ifdef HAVE_PTHREAD_H
-# include <pthread.h> /* _POSIX_THREADS */
-# endif
-#endif
-
-
-#ifdef _POSIX_THREADS
-
-/*
- * POSIX support
- */
-
-#include <pthread.h>
-
-#define ADD_MICROSECONDS(tv, interval) \
-do { \
- tv.tv_usec += (long) interval; \
- tv.tv_sec += tv.tv_usec / 1000000; \
- tv.tv_usec %= 1000000; \
-} while (0)
-
-/* We assume all modern POSIX systems have gettimeofday() */
-#ifdef GETTIMEOFDAY_NO_TZ
-#define GETTIMEOFDAY(ptv) gettimeofday(ptv)
-#else
-#define GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL)
+#include "condvar.h"
+#ifndef Py_HAVE_CONDVAR
+#error You need either a POSIX-compatible or a Windows system!
#endif
-#define MUTEX_T pthread_mutex_t
+#define MUTEX_T PyMUTEX_T
#define MUTEX_INIT(mut) \
- if (pthread_mutex_init(&mut, NULL)) { \
- Py_FatalError("pthread_mutex_init(" #mut ") failed"); };
+ if (PyMUTEX_INIT(&(mut))) { \
+ Py_FatalError("PyMUTEX_INIT(" #mut ") failed"); };
#define MUTEX_FINI(mut) \
- if (pthread_mutex_destroy(&mut)) { \
- Py_FatalError("pthread_mutex_destroy(" #mut ") failed"); };
+ if (PyMUTEX_FINI(&(mut))) { \
+ Py_FatalError("PyMUTEX_FINI(" #mut ") failed"); };
#define MUTEX_LOCK(mut) \
- if (pthread_mutex_lock(&mut)) { \
- Py_FatalError("pthread_mutex_lock(" #mut ") failed"); };
+ if (PyMUTEX_LOCK(&(mut))) { \
+ Py_FatalError("PyMUTEX_LOCK(" #mut ") failed"); };
#define MUTEX_UNLOCK(mut) \
- if (pthread_mutex_unlock(&mut)) { \
- Py_FatalError("pthread_mutex_unlock(" #mut ") failed"); };
+ if (PyMUTEX_UNLOCK(&(mut))) { \
+ Py_FatalError("PyMUTEX_UNLOCK(" #mut ") failed"); };
-#define COND_T pthread_cond_t
+#define COND_T PyCOND_T
#define COND_INIT(cond) \
- if (pthread_cond_init(&cond, NULL)) { \
- Py_FatalError("pthread_cond_init(" #cond ") failed"); };
+ if (PyCOND_INIT(&(cond))) { \
+ Py_FatalError("PyCOND_INIT(" #cond ") failed"); };
#define COND_FINI(cond) \
- if (pthread_cond_destroy(&cond)) { \
- Py_FatalError("pthread_cond_destroy(" #cond ") failed"); };
+ if (PyCOND_FINI(&(cond))) { \
+ Py_FatalError("PyCOND_FINI(" #cond ") failed"); };
#define COND_SIGNAL(cond) \
- if (pthread_cond_signal(&cond)) { \
- Py_FatalError("pthread_cond_signal(" #cond ") failed"); };
+ if (PyCOND_SIGNAL(&(cond))) { \
+ Py_FatalError("PyCOND_SIGNAL(" #cond ") failed"); };
#define COND_WAIT(cond, mut) \
- if (pthread_cond_wait(&cond, &mut)) { \
- Py_FatalError("pthread_cond_wait(" #cond ") failed"); };
+ if (PyCOND_WAIT(&(cond), &(mut))) { \
+ Py_FatalError("PyCOND_WAIT(" #cond ") failed"); };
#define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \
{ \
- int r; \
- struct timespec ts; \
- struct timeval deadline; \
- \
- GETTIMEOFDAY(&deadline); \
- ADD_MICROSECONDS(deadline, microseconds); \
- ts.tv_sec = deadline.tv_sec; \
- ts.tv_nsec = deadline.tv_usec * 1000; \
- \
- r = pthread_cond_timedwait(&cond, &mut, &ts); \
- if (r == ETIMEDOUT) \
+ int r = PyCOND_TIMEDWAIT(&(cond), &(mut), (microseconds)); \
+ if (r < 0) \
+ Py_FatalError("PyCOND_WAIT(" #cond ") failed"); \
+ if (r) /* 1 == timeout, 2 == impl. can't say, so assume timeout */ \
timeout_result = 1; \
- else if (r) \
- Py_FatalError("pthread_cond_timedwait(" #cond ") failed"); \
else \
timeout_result = 0; \
} \
-#elif defined(NT_THREADS)
-
-/*
- * Windows (2000 and later, as well as (hopefully) CE) support
- */
-
-#include <windows.h>
-
-#define MUTEX_T CRITICAL_SECTION
-#define MUTEX_INIT(mut) do { \
- if (!(InitializeCriticalSectionAndSpinCount(&(mut), 4000))) \
- Py_FatalError("CreateMutex(" #mut ") failed"); \
-} while (0)
-#define MUTEX_FINI(mut) \
- DeleteCriticalSection(&(mut))
-#define MUTEX_LOCK(mut) \
- EnterCriticalSection(&(mut))
-#define MUTEX_UNLOCK(mut) \
- LeaveCriticalSection(&(mut))
-
-/* We emulate condition variables with a semaphore.
- We use a Semaphore rather than an auto-reset event, because although
- an auto-resent event might appear to solve the lost-wakeup bug (race
- condition between releasing the outer lock and waiting) because it
- maintains state even though a wait hasn't happened, there is still
- a lost wakeup problem if more than one thread are interrupted in the
- critical place. A semaphore solves that.
- Because it is ok to signal a condition variable with no one
- waiting, we need to keep track of the number of
- waiting threads. Otherwise, the semaphore's state could rise
- without bound.
-
- Generic emulations of the pthread_cond_* API using
- Win32 functions can be found on the Web.
- The following read can be edificating (or not):
- http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
-*/
-typedef struct COND_T
-{
- HANDLE sem; /* the semaphore */
- int n_waiting; /* how many are unreleased */
-} COND_T;
-
-__inline static void _cond_init(COND_T *cond)
-{
- /* A semaphore with a large max value, The positive value
- * is only needed to catch those "lost wakeup" events and
- * race conditions when a timed wait elapses.
- */
- if (!(cond->sem = CreateSemaphore(NULL, 0, 1000, NULL)))
- Py_FatalError("CreateSemaphore() failed");
- cond->n_waiting = 0;
-}
-
-__inline static void _cond_fini(COND_T *cond)
-{
- BOOL ok = CloseHandle(cond->sem);
- if (!ok)
- Py_FatalError("CloseHandle() failed");
-}
-
-__inline static void _cond_wait(COND_T *cond, MUTEX_T *mut)
-{
- ++cond->n_waiting;
- MUTEX_UNLOCK(*mut);
- /* "lost wakeup bug" would occur if the caller were interrupted here,
- * but we are safe because we are using a semaphore wich has an internal
- * count.
- */
- if (WaitForSingleObject(cond->sem, INFINITE) == WAIT_FAILED)
- Py_FatalError("WaitForSingleObject() failed");
- MUTEX_LOCK(*mut);
-}
-
-__inline static int _cond_timed_wait(COND_T *cond, MUTEX_T *mut,
- int us)
-{
- DWORD r;
- ++cond->n_waiting;
- MUTEX_UNLOCK(*mut);
- r = WaitForSingleObject(cond->sem, us / 1000);
- if (r == WAIT_FAILED)
- Py_FatalError("WaitForSingleObject() failed");
- MUTEX_LOCK(*mut);
- if (r == WAIT_TIMEOUT)
- --cond->n_waiting;
- /* Here we have a benign race condition with _cond_signal. If the
- * wait operation has timed out, but before we can acquire the
- * mutex again to decrement n_waiting, a thread holding the mutex
- * still sees a positive n_waiting value and may call
- * ReleaseSemaphore and decrement n_waiting.
- * This will cause n_waiting to be decremented twice.
- * This is benign, though, because ReleaseSemaphore will also have
- * been called, leaving the semaphore state positive. We may
- * thus end up with semaphore in state 1, and n_waiting == -1, and
- * the next time someone calls _cond_wait(), that thread will
- * pass right through, decrementing the semaphore state and
- * incrementing n_waiting, thus correcting the extra _cond_signal.
- */
- return r == WAIT_TIMEOUT;
-}
-
-__inline static void _cond_signal(COND_T *cond) {
- /* NOTE: This must be called with the mutex held */
- if (cond->n_waiting > 0) {
- if (!ReleaseSemaphore(cond->sem, 1, NULL))
- Py_FatalError("ReleaseSemaphore() failed");
- --cond->n_waiting;
- }
-}
-
-#define COND_INIT(cond) \
- _cond_init(&(cond))
-#define COND_FINI(cond) \
- _cond_fini(&(cond))
-#define COND_SIGNAL(cond) \
- _cond_signal(&(cond))
-#define COND_WAIT(cond, mut) \
- _cond_wait(&(cond), &(mut))
-#define COND_TIMED_WAIT(cond, mut, us, timeout_result) do { \
- (timeout_result) = _cond_timed_wait(&(cond), &(mut), us); \
-} while (0)
-
-#else
-
-#error You need either a POSIX-compatible or a Windows system!
-
-#endif /* _POSIX_THREADS, NT_THREADS */
/* Whether the GIL is already taken (-1 if uninitialized). This is atomic
@@ -313,13 +149,14 @@ static void create_gil(void)
static void destroy_gil(void)
{
- MUTEX_FINI(gil_mutex);
-#ifdef FORCE_SWITCHING
- MUTEX_FINI(switch_mutex);
-#endif
+ /* some pthread-like implementations tie the mutex to the cond
+ * and must have the cond destroyed first.
+ */
COND_FINI(gil_cond);
+ MUTEX_FINI(gil_mutex);
#ifdef FORCE_SWITCHING
COND_FINI(switch_cond);
+ MUTEX_FINI(switch_mutex);
#endif
_Py_atomic_store_explicit(&gil_locked, -1, _Py_memory_order_release);
_Py_ANNOTATE_RWLOCK_DESTROY(&gil_locked);
@@ -355,13 +192,13 @@ static void drop_gil(PyThreadState *tstate)
MUTEX_LOCK(switch_mutex);
/* Not switched yet => wait */
if (_Py_atomic_load_relaxed(&gil_last_holder) == tstate) {
- RESET_GIL_DROP_REQUEST();
+ RESET_GIL_DROP_REQUEST();
/* NOTE: if COND_WAIT does not atomically start waiting when
releasing the mutex, another thread can run through, take
the GIL and drop it again, and reset the condition
before we even had a chance to wait for it. */
COND_WAIT(switch_cond, switch_mutex);
- }
+ }
MUTEX_UNLOCK(switch_mutex);
}
#endif
diff --git a/Python/codecs.c b/Python/codecs.c
index e21834a..fd67d1b 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -11,6 +11,8 @@ Copyright (c) Corporation for National Research Initiatives.
#include "Python.h"
#include <ctype.h>
+const char *Py_hexdigits = "0123456789abcdef";
+
/* --- Codec Registry ----------------------------------------------------- */
/* Import the standard encodings package which will register the first
@@ -465,9 +467,11 @@ PyObject *PyCodec_LookupError(const char *name)
static void wrong_exception_type(PyObject *exc)
{
- PyObject *type = PyObject_GetAttrString(exc, "__class__");
+ _Py_IDENTIFIER(__class__);
+ _Py_IDENTIFIER(__name__);
+ PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__);
if (type != NULL) {
- PyObject *name = PyObject_GetAttrString(type, "__name__");
+ PyObject *name = _PyObject_GetAttrId(type, &PyId___name__);
Py_DECREF(type);
if (name != NULL) {
PyErr_Format(PyExc_TypeError,
@@ -506,57 +510,58 @@ PyObject *PyCodec_IgnoreErrors(PyObject *exc)
wrong_exception_type(exc);
return NULL;
}
- /* ouch: passing NULL, 0, pos gives None instead of u'' */
- return Py_BuildValue("(u#n)", &end, 0, end);
+ return Py_BuildValue("(Nn)", PyUnicode_New(0, 0), end);
}
PyObject *PyCodec_ReplaceErrors(PyObject *exc)
{
- PyObject *restuple;
- Py_ssize_t start;
- Py_ssize_t end;
- Py_ssize_t i;
+ Py_ssize_t start, end, i, len;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *res;
- Py_UNICODE *p;
+ int kind;
+ void *data;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
- res = PyUnicode_FromUnicode(NULL, end-start);
+ len = end - start;
+ res = PyUnicode_New(len, '?');
if (res == NULL)
return NULL;
- for (p = PyUnicode_AS_UNICODE(res), i = start;
- i<end; ++p, ++i)
- *p = '?';
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
- return restuple;
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ for (i = 0; i < len; ++i)
+ PyUnicode_WRITE(kind, data, i, '?');
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return Py_BuildValue("(Nn)", res, end);
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
- Py_UNICODE res = Py_UNICODE_REPLACEMENT_CHARACTER;
if (PyUnicodeDecodeError_GetEnd(exc, &end))
return NULL;
- return Py_BuildValue("(u#n)", &res, 1, end);
+ return Py_BuildValue("(Cn)",
+ (int)Py_UNICODE_REPLACEMENT_CHARACTER,
+ end);
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) {
PyObject *res;
- Py_UNICODE *p;
+ int kind;
+ void *data;
if (PyUnicodeTranslateError_GetStart(exc, &start))
return NULL;
if (PyUnicodeTranslateError_GetEnd(exc, &end))
return NULL;
- res = PyUnicode_FromUnicode(NULL, end-start);
+ len = end - start;
+ res = PyUnicode_New(len, Py_UNICODE_REPLACEMENT_CHARACTER);
if (res == NULL)
return NULL;
- for (p = PyUnicode_AS_UNICODE(res), i = start;
- i<end; ++p, ++i)
- *p = Py_UNICODE_REPLACEMENT_CHARACTER;
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
- return restuple;
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ for (i=0; i < len; i++)
+ PyUnicode_WRITE(kind, data, i, Py_UNICODE_REPLACEMENT_CHARACTER);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return Py_BuildValue("(Nn)", res, end);
}
else {
wrong_exception_type(exc);
@@ -569,82 +574,72 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
- Py_UNICODE *p;
- Py_UNICODE *startp;
- Py_UNICODE *outp;
+ unsigned char *outp;
int ressize;
+ Py_UCS4 ch;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
- for (p = startp+start, ressize = 0; p < startp+end; ++p) {
- if (*p<10)
+ for (i = start, ressize = 0; i < end; ++i) {
+ /* object is guaranteed to be "ready" */
+ ch = PyUnicode_READ_CHAR(object, i);
+ if (ch<10)
ressize += 2+1+1;
- else if (*p<100)
+ else if (ch<100)
ressize += 2+2+1;
- else if (*p<1000)
+ else if (ch<1000)
ressize += 2+3+1;
- else if (*p<10000)
+ else if (ch<10000)
ressize += 2+4+1;
-#ifndef Py_UNICODE_WIDE
- else
+ else if (ch<100000)
ressize += 2+5+1;
-#else
- else if (*p<100000)
- ressize += 2+5+1;
- else if (*p<1000000)
+ else if (ch<1000000)
ressize += 2+6+1;
else
ressize += 2+7+1;
-#endif
}
/* allocate replacement */
- res = PyUnicode_FromUnicode(NULL, ressize);
+ res = PyUnicode_New(ressize, 127);
if (res == NULL) {
Py_DECREF(object);
return NULL;
}
+ outp = PyUnicode_1BYTE_DATA(res);
/* generate replacement */
- for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
- p < startp+end; ++p) {
- Py_UNICODE c = *p;
+ for (i = start; i < end; ++i) {
int digits;
int base;
+ ch = PyUnicode_READ_CHAR(object, i);
*outp++ = '&';
*outp++ = '#';
- if (*p<10) {
+ if (ch<10) {
digits = 1;
base = 1;
}
- else if (*p<100) {
+ else if (ch<100) {
digits = 2;
base = 10;
}
- else if (*p<1000) {
+ else if (ch<1000) {
digits = 3;
base = 100;
}
- else if (*p<10000) {
+ else if (ch<10000) {
digits = 4;
base = 1000;
}
-#ifndef Py_UNICODE_WIDE
- else {
+ else if (ch<100000) {
digits = 5;
base = 10000;
}
-#else
- else if (*p<100000) {
- digits = 5;
- base = 10000;
- }
- else if (*p<1000000) {
+ else if (ch<1000000) {
digits = 6;
base = 100000;
}
@@ -652,16 +647,15 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
digits = 7;
base = 1000000;
}
-#endif
while (digits-->0) {
- *outp++ = '0' + c/base;
- c %= base;
+ *outp++ = '0' + ch/base;
+ ch %= base;
base /= 10;
}
*outp++ = ';';
}
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ restuple = Py_BuildValue("(Nn)", res, end);
Py_DECREF(object);
return restuple;
}
@@ -671,87 +665,65 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
}
}
-static Py_UNICODE hexdigits[] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-};
-
PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
{
-#ifndef Py_UNICODE_WIDE
-#define IS_SURROGATE_PAIR(p, end) \
- (*p >= 0xD800 && *p <= 0xDBFF && (p + 1) < end && \
- *(p + 1) >= 0xDC00 && *(p + 1) <= 0xDFFF)
-#else
-#define IS_SURROGATE_PAIR(p, end) 0
-#endif
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
- Py_UNICODE *p;
- Py_UNICODE *startp;
- Py_UNICODE *outp;
+ unsigned char *outp;
int ressize;
+ Py_UCS4 c;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
- for (p = startp+start, ressize = 0; p < startp+end; ++p) {
-#ifdef Py_UNICODE_WIDE
- if (*p >= 0x00010000)
+ for (i = start, ressize = 0; i < end; ++i) {
+ /* object is guaranteed to be "ready" */
+ c = PyUnicode_READ_CHAR(object, i);
+ if (c >= 0x10000) {
ressize += 1+1+8;
- else
-#endif
- if (*p >= 0x100) {
- if (IS_SURROGATE_PAIR(p, startp+end)) {
- ressize += 1+1+8;
- ++p;
- }
- else
- ressize += 1+1+4;
+ }
+ else if (c >= 0x100) {
+ ressize += 1+1+4;
}
else
ressize += 1+1+2;
}
- res = PyUnicode_FromUnicode(NULL, ressize);
+ res = PyUnicode_New(ressize, 127);
if (res==NULL)
return NULL;
- for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
- p < startp+end; ++p) {
- Py_UCS4 c = (Py_UCS4) *p;
+ for (i = start, outp = PyUnicode_1BYTE_DATA(res);
+ i < end; ++i) {
+ c = PyUnicode_READ_CHAR(object, i);
*outp++ = '\\';
- if (IS_SURROGATE_PAIR(p, startp+end)) {
- c = ((*p & 0x3FF) << 10) + (*(p + 1) & 0x3FF) + 0x10000;
- ++p;
- }
if (c >= 0x00010000) {
*outp++ = 'U';
- *outp++ = hexdigits[(c>>28)&0xf];
- *outp++ = hexdigits[(c>>24)&0xf];
- *outp++ = hexdigits[(c>>20)&0xf];
- *outp++ = hexdigits[(c>>16)&0xf];
- *outp++ = hexdigits[(c>>12)&0xf];
- *outp++ = hexdigits[(c>>8)&0xf];
+ *outp++ = Py_hexdigits[(c>>28)&0xf];
+ *outp++ = Py_hexdigits[(c>>24)&0xf];
+ *outp++ = Py_hexdigits[(c>>20)&0xf];
+ *outp++ = Py_hexdigits[(c>>16)&0xf];
+ *outp++ = Py_hexdigits[(c>>12)&0xf];
+ *outp++ = Py_hexdigits[(c>>8)&0xf];
}
else if (c >= 0x100) {
*outp++ = 'u';
- *outp++ = hexdigits[(c>>12)&0xf];
- *outp++ = hexdigits[(c>>8)&0xf];
+ *outp++ = Py_hexdigits[(c>>12)&0xf];
+ *outp++ = Py_hexdigits[(c>>8)&0xf];
}
else
*outp++ = 'x';
- *outp++ = hexdigits[(c>>4)&0xf];
- *outp++ = hexdigits[c&0xf];
+ *outp++ = Py_hexdigits[(c>>4)&0xf];
+ *outp++ = Py_hexdigits[c&0xf];
}
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ restuple = Py_BuildValue("(Nn)", res, end);
Py_DECREF(object);
return restuple;
}
@@ -759,7 +731,6 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
wrong_exception_type(exc);
return NULL;
}
-#undef IS_SURROGATE_PAIR
}
/* This handler is declared static until someone demonstrates
@@ -769,12 +740,11 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
{
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
- Py_UNICODE *p;
- Py_UNICODE *startp;
char *outp;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
@@ -782,15 +752,15 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
res = PyBytes_FromStringAndSize(NULL, 3*(end-start));
if (!res) {
Py_DECREF(object);
return NULL;
}
outp = PyBytes_AsString(res);
- for (p = startp+start; p < startp+end; p++) {
- Py_UNICODE ch = *p;
+ for (i = start; i < end; i++) {
+ /* object is guaranteed to be "ready" */
+ Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);
if (ch < 0xd800 || ch > 0xdfff) {
/* Not a surrogate, fail with original exception */
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
@@ -809,7 +779,7 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
unsigned char *p;
- Py_UNICODE ch = 0;
+ Py_UCS4 ch = 0;
if (PyUnicodeDecodeError_GetStart(exc, &start))
return NULL;
if (!(object = PyUnicodeDecodeError_GetObject(exc)))
@@ -836,7 +806,10 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
return NULL;
}
- return Py_BuildValue("(u#n)", &ch, 1, start+3);
+ res = PyUnicode_FromOrdinal(ch);
+ if (res == NULL)
+ return NULL;
+ return Py_BuildValue("(Nn)", res, start+3);
}
else {
wrong_exception_type(exc);
@@ -849,12 +822,11 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
{
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
- Py_UNICODE *p;
- Py_UNICODE *startp;
char *outp;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
@@ -862,15 +834,15 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
res = PyBytes_FromStringAndSize(NULL, end-start);
if (!res) {
Py_DECREF(object);
return NULL;
}
outp = PyBytes_AsString(res);
- for (p = startp+start; p < startp+end; p++) {
- Py_UNICODE ch = *p;
+ for (i = start; i < end; i++) {
+ /* object is guaranteed to be "ready" */
+ Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);
if (ch < 0xdc80 || ch > 0xdcff) {
/* Not a UTF-8b surrogate, fail with original exception */
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
@@ -886,8 +858,9 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
return restuple;
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
+ PyObject *str;
unsigned char *p;
- Py_UNICODE ch[4]; /* decode up to 4 bad bytes. */
+ Py_UCS2 ch[4]; /* decode up to 4 bad bytes. */
int consumed = 0;
if (PyUnicodeDecodeError_GetStart(exc, &start))
return NULL;
@@ -912,7 +885,10 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
return NULL;
}
- return Py_BuildValue("(u#n)", ch, consumed, start+consumed);
+ str = PyUnicode_FromKindAndData(PyUnicode_2BYTE_KIND, ch, consumed);
+ if (str == NULL)
+ return NULL;
+ return Py_BuildValue("(Nn)", str, start+consumed);
}
else {
wrong_exception_type(exc);
@@ -1049,7 +1025,7 @@ static int _PyCodecRegistry_Init(void)
interp->codec_error_registry = PyDict_New();
if (interp->codec_error_registry) {
- for (i = 0; i < sizeof(methods)/sizeof(methods[0]); ++i) {
+ for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) {
PyObject *func = PyCFunction_New(&methods[i].def, NULL);
int res;
if (!func)
diff --git a/Python/compile.c b/Python/compile.c
index d6f640f..5016f99 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -90,6 +90,13 @@ struct fblockinfo {
basicblock *fb_block;
};
+enum {
+ COMPILER_SCOPE_MODULE,
+ COMPILER_SCOPE_CLASS,
+ COMPILER_SCOPE_FUNCTION,
+ COMPILER_SCOPE_COMPREHENSION,
+};
+
/* The following items change on entry and exit of code blocks.
They must be saved and restored when returning to a block.
*/
@@ -97,6 +104,9 @@ struct compiler_unit {
PySTEntryObject *u_ste;
PyObject *u_name;
+ PyObject *u_qualname; /* dot-separated qualified name (lazy) */
+ int u_scope_type;
+
/* The following fields are dicts that map objects to
the index of them in co_XXX. The index is used as
the argument for opcodes that refer to those collections.
@@ -131,10 +141,16 @@ struct compiler_unit {
The u pointer points to the current compilation unit, while units
for enclosing blocks are stored in c_stack. The u and c_stack are
managed by compiler_enter_scope() and compiler_exit_scope().
+
+Note that we don't track recursion levels during compilation - the
+task of detecting and rejecting excessive levels of nesting is
+handled by the symbol analysis pass.
+
*/
struct compiler {
const char *c_filename;
+ PyObject *c_filename_obj;
struct symtable *c_st;
PyFutureFeatures *c_future; /* pointer to module's __future__ */
PyCompilerFlags *c_flags;
@@ -148,7 +164,7 @@ struct compiler {
PyArena *c_arena; /* pointer to memory allocation arena */
};
-static int compiler_enter_scope(struct compiler *, identifier, void *, int);
+static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
static void compiler_free(struct compiler *);
static basicblock *compiler_new_block(struct compiler *);
static int compiler_next_instr(struct compiler *, basicblock *);
@@ -178,12 +194,13 @@ static int compiler_in_loop(struct compiler *);
static int inplace_binop(struct compiler *, operator_ty);
static int expr_constant(struct compiler *, expr_ty);
-static int compiler_with(struct compiler *, stmt_ty);
+static int compiler_with(struct compiler *, stmt_ty, int);
static int compiler_call_helper(struct compiler *c, int n,
asdl_seq *args,
asdl_seq *keywords,
expr_ty starargs,
expr_ty kwargs);
+static int compiler_try_except(struct compiler *, stmt_ty);
static PyCodeObject *assemble(struct compiler *, int addNone);
static PyObject *__doc__;
@@ -195,16 +212,17 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
{
/* Name mangling: __private becomes _classname__private.
This is independent from how the name is used. */
- const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident);
- Py_UNICODE *buffer;
- size_t nlen, plen;
+ PyObject *result;
+ size_t nlen, plen, ipriv;
+ Py_UCS4 maxchar;
if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
- name == NULL || name[0] != '_' || name[1] != '_') {
+ PyUnicode_READ_CHAR(ident, 0) != '_' ||
+ PyUnicode_READ_CHAR(ident, 1) != '_') {
Py_INCREF(ident);
return ident;
}
- p = PyUnicode_AS_UNICODE(privateobj);
- nlen = Py_UNICODE_strlen(name);
+ nlen = PyUnicode_GET_LENGTH(ident);
+ plen = PyUnicode_GET_LENGTH(privateobj);
/* Don't mangle __id__ or names with dots.
The only time a name with a dot can occur is when
@@ -214,32 +232,44 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
TODO(jhylton): Decide whether we want to support
mangling of the module name, e.g. __M.X.
*/
- if ((name[nlen-1] == '_' && name[nlen-2] == '_')
- || Py_UNICODE_strchr(name, '.')) {
+ if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
+ PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
+ PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Py_INCREF(ident);
return ident; /* Don't mangle __whatever__ */
}
/* Strip leading underscores from class name */
- while (*p == '_')
- p++;
- if (*p == 0) {
+ ipriv = 0;
+ while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
+ ipriv++;
+ if (ipriv == plen) {
Py_INCREF(ident);
return ident; /* Don't mangle if class is just underscores */
}
- plen = Py_UNICODE_strlen(p);
+ plen -= ipriv;
assert(1 <= PY_SSIZE_T_MAX - nlen);
assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
- ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen);
- if (!ident)
+ maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
+ if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
+ maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
+
+ result = PyUnicode_New(1 + nlen + plen, maxchar);
+ if (!result)
return 0;
- /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
- buffer = PyUnicode_AS_UNICODE(ident);
- buffer[0] = '_';
- Py_UNICODE_strncpy(buffer+1, p, plen);
- Py_UNICODE_strcpy(buffer+1+plen, name);
- return ident;
+ /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
+ PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
+ if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ assert(_PyUnicode_CheckConsistency(result, 1));
+ return result;
}
static int
@@ -272,6 +302,9 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
if (!compiler_init(&c))
return NULL;
c.c_filename = filename;
+ c.c_filename_obj = PyUnicode_DecodeFSDefault(filename);
+ if (!c.c_filename_obj)
+ goto finally;
c.c_arena = arena;
c.c_future = PyFuture_FromAST(mod, filename);
if (c.c_future == NULL)
@@ -324,6 +357,8 @@ compiler_free(struct compiler *c)
PySymtable_Free(c->c_st);
if (c->c_future)
PyObject_Free(c->c_future);
+ if (c->c_filename_obj)
+ Py_DECREF(c->c_filename_obj);
Py_DECREF(c->c_stack);
}
@@ -458,6 +493,7 @@ compiler_unit_free(struct compiler_unit *u)
}
Py_CLEAR(u->u_ste);
Py_CLEAR(u->u_name);
+ Py_CLEAR(u->u_qualname);
Py_CLEAR(u->u_consts);
Py_CLEAR(u->u_names);
Py_CLEAR(u->u_varnames);
@@ -468,8 +504,8 @@ compiler_unit_free(struct compiler_unit *u)
}
static int
-compiler_enter_scope(struct compiler *c, identifier name, void *key,
- int lineno)
+compiler_enter_scope(struct compiler *c, identifier name,
+ int scope_type, void *key, int lineno)
{
struct compiler_unit *u;
@@ -480,6 +516,7 @@ compiler_enter_scope(struct compiler *c, identifier name, void *key,
return 0;
}
memset(u, 0, sizeof(struct compiler_unit));
+ u->u_scope_type = scope_type;
u->u_argcount = 0;
u->u_kwonlyargcount = 0;
u->u_ste = PySymtable_Lookup(c->c_st, key);
@@ -567,6 +604,59 @@ compiler_exit_scope(struct compiler *c)
}
+static PyObject *
+compiler_scope_qualname(struct compiler *c)
+{
+ Py_ssize_t stack_size, i;
+ _Py_static_string(dot, ".");
+ _Py_static_string(locals, "<locals>");
+ struct compiler_unit *u;
+ PyObject *capsule, *name, *seq, *dot_str, *locals_str;
+
+ u = c->u;
+ if (u->u_qualname != NULL) {
+ Py_INCREF(u->u_qualname);
+ return u->u_qualname;
+ }
+
+ seq = PyList_New(0);
+ if (seq == NULL)
+ return NULL;
+
+ stack_size = PyList_GET_SIZE(c->c_stack);
+ for (i = 0; i < stack_size; i++) {
+ capsule = PyList_GET_ITEM(c->c_stack, i);
+ u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
+ assert(u);
+ if (u->u_scope_type == COMPILER_SCOPE_MODULE)
+ continue;
+ if (PyList_Append(seq, u->u_name))
+ goto _error;
+ if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) {
+ locals_str = _PyUnicode_FromId(&locals);
+ if (locals_str == NULL)
+ goto _error;
+ if (PyList_Append(seq, locals_str))
+ goto _error;
+ }
+ }
+ u = c->u;
+ if (PyList_Append(seq, u->u_name))
+ goto _error;
+ dot_str = _PyUnicode_FromId(&dot);
+ if (dot_str == NULL)
+ goto _error;
+ name = PyUnicode_Join(dot_str, seq);
+ Py_DECREF(seq);
+ u->u_qualname = name;
+ Py_XINCREF(name);
+ return name;
+
+_error:
+ Py_XDECREF(seq);
+ return NULL;
+}
+
/* Allocate a new block and return a pointer to it.
Returns NULL on error.
*/
@@ -777,7 +867,8 @@ opcode_stack_effect(int opcode, int oparg)
return -1;
case YIELD_VALUE:
return 0;
-
+ case YIELD_FROM:
+ return -1;
case POP_BLOCK:
return 0;
case POP_EXCEPT:
@@ -863,9 +954,9 @@ opcode_stack_effect(int opcode, int oparg)
case CALL_FUNCTION_VAR_KW:
return -NARGS(oparg)-2;
case MAKE_FUNCTION:
- return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
+ return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);
case MAKE_CLOSURE:
- return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
+ return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
#undef NARGS
case BUILD_SLICE:
if (oparg == 3)
@@ -1195,7 +1286,7 @@ compiler_mod(struct compiler *c, mod_ty mod)
return NULL;
}
/* Use 0 for firstlineno initially, will fixup in assemble(). */
- if (!compiler_enter_scope(c, module, mod, 0))
+ if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
return NULL;
switch (mod->kind) {
case Module_kind:
@@ -1271,11 +1362,15 @@ compiler_lookup_arg(PyObject *dict, PyObject *name)
}
static int
-compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
+compiler_make_closure(struct compiler *c, PyCodeObject *co, int args, PyObject *qualname)
{
int i, free = PyCode_GetNumFree(co);
+ if (qualname == NULL)
+ qualname = co->co_name;
+
if (free == 0) {
ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
+ ADDOP_O(c, LOAD_CONST, qualname, consts);
ADDOP_I(c, MAKE_FUNCTION, args);
return 1;
}
@@ -1312,6 +1407,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
}
ADDOP_I(c, BUILD_TUPLE, free);
ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
+ ADDOP_O(c, LOAD_CONST, qualname, consts);
ADDOP_I(c, MAKE_CLOSURE, args);
return 1;
}
@@ -1457,7 +1553,7 @@ static int
compiler_function(struct compiler *c, stmt_ty s)
{
PyCodeObject *co;
- PyObject *first_const = Py_None;
+ PyObject *qualname, *first_const = Py_None;
arguments_ty args = s->v.FunctionDef.args;
expr_ty returns = s->v.FunctionDef.returns;
asdl_seq* decos = s->v.FunctionDef.decorator_list;
@@ -1483,7 +1579,8 @@ compiler_function(struct compiler *c, stmt_ty s)
return 0;
assert((num_annotations & 0xFFFF) == num_annotations);
- if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
+ if (!compiler_enter_scope(c, s->v.FunctionDef.name,
+ COMPILER_SCOPE_FUNCTION, (void *)s,
s->lineno))
return 0;
@@ -1505,14 +1602,19 @@ compiler_function(struct compiler *c, stmt_ty s)
VISIT_IN_SCOPE(c, stmt, st);
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL) {
+ Py_XDECREF(qualname);
+ Py_XDECREF(co);
return 0;
+ }
arglength = asdl_seq_LEN(args->defaults);
arglength |= kw_default_count << 8;
arglength |= num_annotations << 16;
- compiler_make_closure(c, co, arglength);
+ compiler_make_closure(c, co, arglength, qualname);
+ Py_DECREF(qualname);
Py_DECREF(co);
/* decorators */
@@ -1547,7 +1649,8 @@ compiler_class(struct compiler *c, stmt_ty s)
*/
/* 1. compile the class body into a code object */
- if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
+ if (!compiler_enter_scope(c, s->v.ClassDef.name,
+ COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
return 0;
/* this block represents what we do in the new scope */
{
@@ -1577,6 +1680,21 @@ compiler_class(struct compiler *c, stmt_ty s)
return 0;
}
Py_DECREF(str);
+ /* store the __qualname__ */
+ str = compiler_scope_qualname(c);
+ if (!str) {
+ compiler_exit_scope(c);
+ return 0;
+ }
+ ADDOP_O(c, LOAD_CONST, str, consts);
+ Py_DECREF(str);
+ str = PyUnicode_InternFromString("__qualname__");
+ if (!str || !compiler_nameop(c, str, Store)) {
+ Py_XDECREF(str);
+ compiler_exit_scope(c);
+ return 0;
+ }
+ Py_DECREF(str);
/* compile the body proper */
if (!compiler_body(c, s->v.ClassDef.body)) {
compiler_exit_scope(c);
@@ -1613,7 +1731,7 @@ compiler_class(struct compiler *c, stmt_ty s)
ADDOP(c, LOAD_BUILD_CLASS);
/* 3. load a function (or closure) made from the code object */
- compiler_make_closure(c, co, 0);
+ compiler_make_closure(c, co, 0, NULL);
Py_DECREF(co);
/* 4. load class name */
@@ -1664,6 +1782,7 @@ static int
compiler_lambda(struct compiler *c, expr_ty e)
{
PyCodeObject *co;
+ PyObject *qualname;
static identifier name;
int kw_default_count = 0, arglength;
arguments_ty args = e->v.Lambda.args;
@@ -1683,7 +1802,8 @@ compiler_lambda(struct compiler *c, expr_ty e)
}
if (args->defaults)
VISIT_SEQ(c, expr, args->defaults);
- if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
+ if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION,
+ (void *)e, e->lineno))
return 0;
/* Make None the first constant, so the lambda can't have a
@@ -1701,13 +1821,15 @@ compiler_lambda(struct compiler *c, expr_ty e)
ADDOP_IN_SCOPE(c, RETURN_VALUE);
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL)
return 0;
arglength = asdl_seq_LEN(args->defaults);
arglength |= kw_default_count << 8;
- compiler_make_closure(c, co, arglength);
+ compiler_make_closure(c, co, arglength, qualname);
+ Py_DECREF(qualname);
Py_DECREF(co);
return 1;
@@ -1916,7 +2038,13 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, body);
if (!compiler_push_fblock(c, FINALLY_TRY, body))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryFinally.body);
+ if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
+ if (!compiler_try_except(c, s))
+ return 0;
+ }
+ else {
+ VISIT_SEQ(c, stmt, s->v.Try.body);
+ }
ADDOP(c, POP_BLOCK);
compiler_pop_fblock(c, FINALLY_TRY, body);
@@ -1924,7 +2052,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, end);
if (!compiler_push_fblock(c, FINALLY_END, end))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
+ VISIT_SEQ(c, stmt, s->v.Try.finalbody);
ADDOP(c, END_FINALLY);
compiler_pop_fblock(c, FINALLY_END, end);
@@ -1978,15 +2106,15 @@ compiler_try_except(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, body);
if (!compiler_push_fblock(c, EXCEPT, body))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryExcept.body);
+ VISIT_SEQ(c, stmt, s->v.Try.body);
ADDOP(c, POP_BLOCK);
compiler_pop_fblock(c, EXCEPT, body);
ADDOP_JREL(c, JUMP_FORWARD, orelse);
- n = asdl_seq_LEN(s->v.TryExcept.handlers);
+ n = asdl_seq_LEN(s->v.Try.handlers);
compiler_use_next_block(c, except);
for (i = 0; i < n; i++) {
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
- s->v.TryExcept.handlers, i);
+ s->v.Try.handlers, i);
if (!handler->v.ExceptHandler.type && i < n-1)
return compiler_error(c, "default 'except:' must be last");
c->u->u_lineno_set = 0;
@@ -2073,12 +2201,21 @@ compiler_try_except(struct compiler *c, stmt_ty s)
}
ADDOP(c, END_FINALLY);
compiler_use_next_block(c, orelse);
- VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
+ VISIT_SEQ(c, stmt, s->v.Try.orelse);
compiler_use_next_block(c, end);
return 1;
}
static int
+compiler_try(struct compiler *c, stmt_ty s) {
+ if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
+ return compiler_try_finally(c, s);
+ else
+ return compiler_try_except(c, s);
+}
+
+
+static int
compiler_import_as(struct compiler *c, identifier name, identifier asname)
{
/* The IMPORT_NAME opcode was already generated. This function
@@ -2087,22 +2224,27 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
If there is a dot in name, we need to split it and emit a
LOAD_ATTR for each name.
*/
- const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
- const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
- if (dot) {
+ Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot == -2)
+ return -1;
+ if (dot != -1) {
/* Consume the base module name to get the first attribute */
- src = dot + 1;
- while (dot) {
- /* NB src is only defined when dot != NULL */
+ Py_ssize_t pos = dot + 1;
+ while (dot != -1) {
PyObject *attr;
- dot = Py_UNICODE_strchr(src, '.');
- attr = PyUnicode_FromUnicode(src,
- dot ? dot - src : Py_UNICODE_strlen(src));
+ dot = PyUnicode_FindChar(name, '.', pos,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot == -2)
+ return -1;
+ attr = PyUnicode_Substring(name, pos,
+ (dot != -1) ? dot :
+ PyUnicode_GET_LENGTH(name));
if (!attr)
return -1;
ADDOP_O(c, LOAD_ATTR, attr, names);
Py_DECREF(attr);
- src = dot + 1;
+ pos = dot + 1;
}
}
return compiler_nameop(c, asname, Store);
@@ -2141,13 +2283,12 @@ compiler_import(struct compiler *c, stmt_ty s)
}
else {
identifier tmp = alias->name;
- const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
- Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
- if (dot)
- tmp = PyUnicode_FromUnicode(base,
- dot - base);
+ Py_ssize_t dot = PyUnicode_FindChar(
+ alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
+ if (dot != -1)
+ tmp = PyUnicode_Substring(alias->name, 0, dot);
r = compiler_nameop(c, tmp, Store);
- if (dot) {
+ if (dot != -1) {
Py_DECREF(tmp);
}
if (!r)
@@ -2210,7 +2351,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)
alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
identifier store_name;
- if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
+ if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
assert(n == 1);
ADDOP(c, IMPORT_STAR);
return 1;
@@ -2325,10 +2466,8 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
}
ADDOP_I(c, RAISE_VARARGS, n);
break;
- case TryExcept_kind:
- return compiler_try_except(c, s);
- case TryFinally_kind:
- return compiler_try_finally(c, s);
+ case Try_kind:
+ return compiler_try(c, s);
case Assert_kind:
return compiler_assert(c, s);
case Import_kind:
@@ -2359,7 +2498,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
case Continue_kind:
return compiler_continue(c);
case With_kind:
- return compiler_with(c, s);
+ return compiler_with(c, s, 0);
}
return 1;
}
@@ -2526,7 +2665,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
}
/* XXX Leave assert here, but handle __doc__ and the like better */
- assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
+ assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
switch (optype) {
case OP_DEREF:
@@ -2904,11 +3043,13 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
{
PyCodeObject *co = NULL;
expr_ty outermost_iter;
+ PyObject *qualname = NULL;
outermost_iter = ((comprehension_ty)
asdl_seq_GET(generators, 0))->iter;
- if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
+ if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
+ (void *)e, e->lineno))
goto error;
if (type != COMP_GENEXP) {
@@ -2941,12 +3082,14 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL)
goto error;
- if (!compiler_make_closure(c, co, 0))
+ if (!compiler_make_closure(c, co, 0, qualname))
goto error;
+ Py_DECREF(qualname);
Py_DECREF(co);
VISIT(c, expr, outermost_iter);
@@ -2956,6 +3099,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
error_in_scope:
compiler_exit_scope(c);
error:
+ Py_XDECREF(qualname);
Py_XDECREF(co);
return 0;
}
@@ -3049,8 +3193,7 @@ expr_constant(struct compiler *c, expr_ty e)
return PyObject_IsTrue(e->v.Str.s);
case Name_kind:
/* optimize away names that can't be reassigned */
- id = PyBytes_AS_STRING(
- _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
+ id = PyUnicode_AsUTF8(e->v.Name.id);
if (strcmp(id, "True") == 0) return 1;
if (strcmp(id, "False") == 0) return 0;
if (strcmp(id, "None") == 0) return 0;
@@ -3086,9 +3229,10 @@ expr_constant(struct compiler *c, expr_ty e)
exit(*exc)
*/
static int
-compiler_with(struct compiler *c, stmt_ty s)
+compiler_with(struct compiler *c, stmt_ty s, int pos)
{
basicblock *block, *finally;
+ withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
assert(s->kind == With_kind);
@@ -3098,7 +3242,7 @@ compiler_with(struct compiler *c, stmt_ty s)
return 0;
/* Evaluate EXPR */
- VISIT(c, expr, s->v.With.context_expr);
+ VISIT(c, expr, item->context_expr);
ADDOP_JREL(c, SETUP_WITH, finally);
/* SETUP_WITH pushes a finally block. */
@@ -3107,16 +3251,20 @@ compiler_with(struct compiler *c, stmt_ty s)
return 0;
}
- if (s->v.With.optional_vars) {
- VISIT(c, expr, s->v.With.optional_vars);
+ if (item->optional_vars) {
+ VISIT(c, expr, item->optional_vars);
}
else {
/* Discard result from context.__enter__() */
ADDOP(c, POP_TOP);
}
- /* BLOCK code */
- VISIT_SEQ(c, stmt, s->v.With.body);
+ pos++;
+ if (pos == asdl_seq_LEN(s->v.With.items))
+ /* BLOCK code */
+ VISIT_SEQ(c, stmt, s->v.With.body)
+ else if (!compiler_with(c, s, pos))
+ return 0;
/* End of try block; start the finally block */
ADDOP(c, POP_BLOCK);
@@ -3193,16 +3341,27 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
case DictComp_kind:
return compiler_dictcomp(c, e);
case Yield_kind:
+ case YieldFrom_kind: {
+ expr_ty value;
if (c->u->u_ste->ste_type != FunctionBlock)
return compiler_error(c, "'yield' outside function");
- if (e->v.Yield.value) {
- VISIT(c, expr, e->v.Yield.value);
+ value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value;
+ if (value) {
+ VISIT(c, expr, value);
}
else {
ADDOP_O(c, LOAD_CONST, Py_None, consts);
}
- ADDOP(c, YIELD_VALUE);
+ if (e->kind == YieldFrom_kind) {
+ ADDOP(c, GET_ITER);
+ ADDOP_O(c, LOAD_CONST, Py_None, consts);
+ ADDOP(c, YIELD_FROM);
+ }
+ else {
+ ADDOP(c, YIELD_VALUE);
+ }
break;
+ }
case Compare_kind:
return compiler_compare(c, e);
case Call_kind:
@@ -3385,7 +3544,7 @@ compiler_in_loop(struct compiler *c) {
static int
compiler_error(struct compiler *c, const char *errstr)
{
- PyObject *loc, *filename;
+ PyObject *loc;
PyObject *u = NULL, *v = NULL;
loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
@@ -3393,16 +3552,7 @@ compiler_error(struct compiler *c, const char *errstr)
Py_INCREF(Py_None);
loc = Py_None;
}
- if (c->c_filename != NULL) {
- filename = PyUnicode_DecodeFSDefault(c->c_filename);
- if (!filename)
- goto exit;
- }
- else {
- Py_INCREF(Py_None);
- filename = Py_None;
- }
- u = Py_BuildValue("(NiiO)", filename, c->u->u_lineno,
+ u = Py_BuildValue("(OiiO)", c->c_filename_obj, c->u->u_lineno,
c->u->u_col_offset, loc);
if (!u)
goto exit;
@@ -3951,7 +4101,6 @@ makecode(struct compiler *c, struct assembler *a)
PyObject *consts = NULL;
PyObject *names = NULL;
PyObject *varnames = NULL;
- PyObject *filename = NULL;
PyObject *name = NULL;
PyObject *freevars = NULL;
PyObject *cellvars = NULL;
@@ -3975,10 +4124,6 @@ makecode(struct compiler *c, struct assembler *a)
freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
if (!freevars)
goto error;
- filename = PyUnicode_DecodeFSDefault(c->c_filename);
- if (!filename)
- goto error;
-
nlocals = PyDict_Size(c->u->u_varnames);
flags = compute_code_flags(c);
if (flags < 0)
@@ -3998,14 +4143,13 @@ makecode(struct compiler *c, struct assembler *a)
nlocals, stackdepth(c), flags,
bytecode, consts, names, varnames,
freevars, cellvars,
- filename, c->u->u_name,
+ c->c_filename_obj, c->u->u_name,
c->u->u_firstlineno,
a->a_lnotab);
error:
Py_XDECREF(consts);
Py_XDECREF(names);
Py_XDECREF(varnames);
- Py_XDECREF(filename);
Py_XDECREF(name);
Py_XDECREF(freevars);
Py_XDECREF(cellvars);
diff --git a/Python/condvar.h b/Python/condvar.h
new file mode 100644
index 0000000..fe6bd74
--- /dev/null
+++ b/Python/condvar.h
@@ -0,0 +1,390 @@
+/*
+ * Portable condition variable support for windows and pthreads.
+ * Everything is inline, this header can be included where needed.
+ *
+ * APIs generally return 0 on success and non-zero on error,
+ * and the caller needs to use its platform's error mechanism to
+ * discover the error (errno, or GetLastError())
+ *
+ * Note that some implementations cannot distinguish between a
+ * condition variable wait time-out and successful wait. Most often
+ * the difference is moot anyway since the wait condition must be
+ * re-checked.
+ * PyCOND_TIMEDWAIT, in addition to returning negative on error,
+ * thus returns 0 on regular success, 1 on timeout
+ * or 2 if it can't tell.
+ *
+ * There are at least two caveats with using these condition variables,
+ * due to the fact that they may be emulated with Semaphores on
+ * Windows:
+ * 1) While PyCOND_SIGNAL() will wake up at least one thread, we
+ * cannot currently guarantee that it will be one of the threads
+ * already waiting in a PyCOND_WAIT() call. It _could_ cause
+ * the wakeup of a subsequent thread to try a PyCOND_WAIT(),
+ * including the thread doing the PyCOND_SIGNAL() itself.
+ * The same applies to PyCOND_BROADCAST(), if N threads are waiting
+ * then at least N threads will be woken up, but not necessarily
+ * those already waiting.
+ * For this reason, don't make the scheduling assumption that a
+ * specific other thread will get the wakeup signal
+ * 2) The _mutex_ must be held when calling PyCOND_SIGNAL() and
+ * PyCOND_BROADCAST().
+ * While e.g. the posix standard strongly recommends that the mutex
+ * associated with the condition variable is held when a
+ * pthread_cond_signal() call is made, this is not a hard requirement,
+ * although scheduling will not be "reliable" if it isn't. Here
+ * the mutex is used for internal synchronization of the emulated
+ * Condition Variable.
+ */
+
+#ifndef _CONDVAR_H_
+#define _CONDVAR_H_
+
+#include "Python.h"
+
+#ifndef _POSIX_THREADS
+/* This means pthreads are not implemented in libc headers, hence the macro
+ not present in unistd.h. But they still can be implemented as an external
+ library (e.g. gnu pth in pthread emulation) */
+# ifdef HAVE_PTHREAD_H
+# include <pthread.h> /* _POSIX_THREADS */
+# endif
+#endif
+
+#ifdef _POSIX_THREADS
+/*
+ * POSIX support
+ */
+#define Py_HAVE_CONDVAR
+
+#include <pthread.h>
+
+#define PyCOND_ADD_MICROSECONDS(tv, interval) \
+do { \
+ tv.tv_usec += (long) interval; \
+ tv.tv_sec += tv.tv_usec / 1000000; \
+ tv.tv_usec %= 1000000; \
+} while (0)
+
+/* We assume all modern POSIX systems have gettimeofday() */
+#ifdef GETTIMEOFDAY_NO_TZ
+#define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv)
+#else
+#define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL)
+#endif
+
+/* The following functions return 0 on success, nonzero on error */
+#define PyMUTEX_T pthread_mutex_t
+#define PyMUTEX_INIT(mut) pthread_mutex_init((mut), NULL)
+#define PyMUTEX_FINI(mut) pthread_mutex_destroy(mut)
+#define PyMUTEX_LOCK(mut) pthread_mutex_lock(mut)
+#define PyMUTEX_UNLOCK(mut) pthread_mutex_unlock(mut)
+
+#define PyCOND_T pthread_cond_t
+#define PyCOND_INIT(cond) pthread_cond_init((cond), NULL)
+#define PyCOND_FINI(cond) pthread_cond_destroy(cond)
+#define PyCOND_SIGNAL(cond) pthread_cond_signal(cond)
+#define PyCOND_BROADCAST(cond) pthread_cond_broadcast(cond)
+#define PyCOND_WAIT(cond, mut) pthread_cond_wait((cond), (mut))
+
+/* return 0 for success, 1 on timeout, -1 on error */
+Py_LOCAL_INLINE(int)
+PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, long us)
+{
+ int r;
+ struct timespec ts;
+ struct timeval deadline;
+
+ PyCOND_GETTIMEOFDAY(&deadline);
+ PyCOND_ADD_MICROSECONDS(deadline, us);
+ ts.tv_sec = deadline.tv_sec;
+ ts.tv_nsec = deadline.tv_usec * 1000;
+
+ r = pthread_cond_timedwait((cond), (mut), &ts);
+ if (r == ETIMEDOUT)
+ return 1;
+ else if (r)
+ return -1;
+ else
+ return 0;
+}
+
+#elif defined(NT_THREADS)
+/*
+ * Windows (XP, 2003 server and later, as well as (hopefully) CE) support
+ *
+ * Emulated condition variables ones that work with XP and later, plus
+ * example native support on VISTA and onwards.
+ */
+#define Py_HAVE_CONDVAR
+
+
+/* include windows if it hasn't been done before */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* options */
+/* non-emulated condition variables are provided for those that want
+ * to target Windows Vista. Modify this macro to enable them.
+ */
+#ifndef _PY_EMULATED_WIN_CV
+#define _PY_EMULATED_WIN_CV 1 /* use emulated condition variables */
+#endif
+
+/* fall back to emulation if not targeting Vista */
+#if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA
+#undef _PY_EMULATED_WIN_CV
+#define _PY_EMULATED_WIN_CV 1
+#endif
+
+
+#if _PY_EMULATED_WIN_CV
+
+/* The mutex is a CriticalSection object and
+ The condition variables is emulated with the help of a semaphore.
+ Semaphores are available on Windows XP (2003 server) and later.
+ We use a Semaphore rather than an auto-reset event, because although
+ an auto-resent event might appear to solve the lost-wakeup bug (race
+ condition between releasing the outer lock and waiting) because it
+ maintains state even though a wait hasn't happened, there is still
+ a lost wakeup problem if more than one thread are interrupted in the
+ critical place. A semaphore solves that, because its state is counted,
+ not Boolean.
+ Because it is ok to signal a condition variable with no one
+ waiting, we need to keep track of the number of
+ waiting threads. Otherwise, the semaphore's state could rise
+ without bound. This also helps reduce the number of "spurious wakeups"
+ that would otherwise happen.
+
+ This implementation still has the problem that the threads woken
+ with a "signal" aren't necessarily those that are already
+ waiting. It corresponds to listing 2 in:
+ http://birrell.org/andrew/papers/ImplementingCVs.pdf
+
+ Generic emulations of the pthread_cond_* API using
+ earlier Win32 functions can be found on the Web.
+ The following read can be edificating (or not):
+ http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
+
+ See also
+*/
+
+typedef CRITICAL_SECTION PyMUTEX_T;
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_INIT(PyMUTEX_T *cs)
+{
+ InitializeCriticalSection(cs);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_FINI(PyMUTEX_T *cs)
+{
+ DeleteCriticalSection(cs);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_LOCK(PyMUTEX_T *cs)
+{
+ EnterCriticalSection(cs);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_UNLOCK(PyMUTEX_T *cs)
+{
+ LeaveCriticalSection(cs);
+ return 0;
+}
+
+/* The ConditionVariable object. From XP onwards it is easily emulated with
+ * a Semaphore
+ */
+
+typedef struct _PyCOND_T
+{
+ HANDLE sem;
+ int waiting; /* to allow PyCOND_SIGNAL to be a no-op */
+} PyCOND_T;
+
+Py_LOCAL_INLINE(int)
+PyCOND_INIT(PyCOND_T *cv)
+{
+ /* A semaphore with a "large" max value, The positive value
+ * is only needed to catch those "lost wakeup" events and
+ * race conditions when a timed wait elapses.
+ */
+ cv->sem = CreateSemaphore(NULL, 0, 100000, NULL);
+ if (cv->sem==NULL)
+ return -1;
+ cv->waiting = 0;
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_FINI(PyCOND_T *cv)
+{
+ return CloseHandle(cv->sem) ? 0 : -1;
+}
+
+/* this implementation can detect a timeout. Returns 1 on timeout,
+ * 0 otherwise (and -1 on error)
+ */
+Py_LOCAL_INLINE(int)
+_PyCOND_WAIT_MS(PyCOND_T *cv, PyMUTEX_T *cs, DWORD ms)
+{
+ DWORD wait;
+ cv->waiting++;
+ PyMUTEX_UNLOCK(cs);
+ /* "lost wakeup bug" would occur if the caller were interrupted here,
+ * but we are safe because we are using a semaphore wich has an internal
+ * count.
+ */
+ wait = WaitForSingleObject(cv->sem, ms);
+ PyMUTEX_LOCK(cs);
+ if (wait != WAIT_OBJECT_0)
+ --cv->waiting;
+ /* Here we have a benign race condition with PyCOND_SIGNAL.
+ * When failure occurs or timeout, it is possible that
+ * PyCOND_SIGNAL also decrements this value
+ * and signals releases the mutex. This is benign because it
+ * just means an extra spurious wakeup for a waiting thread.
+ * ('waiting' corresponds to the semaphore's "negative" count and
+ * we may end up with e.g. (waiting == -1 && sem.count == 1). When
+ * a new thread comes along, it will pass right throuhgh, having
+ * adjusted it to (waiting == 0 && sem.count == 0).
+ */
+
+ if (wait == WAIT_FAILED)
+ return -1;
+ /* return 0 on success, 1 on timeout */
+ return wait != WAIT_OBJECT_0;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
+{
+ int result = _PyCOND_WAIT_MS(cv, cs, INFINITE);
+ return result >= 0 ? 0 : result;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
+{
+ return _PyCOND_WAIT_MS(cv, cs, us/1000);
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_SIGNAL(PyCOND_T *cv)
+{
+ /* this test allows PyCOND_SIGNAL to be a no-op unless required
+ * to wake someone up, thus preventing an unbounded increase of
+ * the semaphore's internal counter.
+ */
+ if (cv->waiting > 0) {
+ /* notifying thread decreases the cv->waiting count so that
+ * a delay between notify and actual wakeup of the target thread
+ * doesn't cause a number of extra ReleaseSemaphore calls.
+ */
+ cv->waiting--;
+ return ReleaseSemaphore(cv->sem, 1, NULL) ? 0 : -1;
+ }
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_BROADCAST(PyCOND_T *cv)
+{
+ if (cv->waiting > 0) {
+ return ReleaseSemaphore(cv->sem, cv->waiting, NULL) ? 0 : -1;
+ cv->waiting = 0;
+ }
+ return 0;
+}
+
+#else
+
+/* Use native Win7 primitives if build target is Win7 or higher */
+
+/* SRWLOCK is faster and better than CriticalSection */
+typedef SRWLOCK PyMUTEX_T;
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_INIT(PyMUTEX_T *cs)
+{
+ InitializeSRWLock(cs);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_FINI(PyMUTEX_T *cs)
+{
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_LOCK(PyMUTEX_T *cs)
+{
+ AcquireSRWLockExclusive(cs);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyMUTEX_UNLOCK(PyMUTEX_T *cs)
+{
+ ReleaseSRWLockExclusive(cs);
+ return 0;
+}
+
+
+typedef CONDITION_VARIABLE PyCOND_T;
+
+Py_LOCAL_INLINE(int)
+PyCOND_INIT(PyCOND_T *cv)
+{
+ InitializeConditionVariable(cv);
+ return 0;
+}
+Py_LOCAL_INLINE(int)
+PyCOND_FINI(PyCOND_T *cv)
+{
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
+{
+ return SleepConditionVariableSRW(cv, cs, INFINITE, 0) ? 0 : -1;
+}
+
+/* This implementation makes no distinction about timeouts. Signal
+ * 2 to indicate that we don't know.
+ */
+Py_LOCAL_INLINE(int)
+PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
+{
+ return SleepConditionVariableSRW(cv, cs, us/1000, 0) ? 2 : -1;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_SIGNAL(PyCOND_T *cv)
+{
+ WakeConditionVariable(cv);
+ return 0;
+}
+
+Py_LOCAL_INLINE(int)
+PyCOND_BROADCAST(PyCOND_T *cv)
+{
+ WakeAllConditionVariable(cv);
+ return 0;
+}
+
+
+#endif /* _PY_EMULATED_WIN_CV */
+
+#endif /* _POSIX_THREADS, NT_THREADS */
+
+#endif /* _CONDVAR_H_ */
diff --git a/Python/dtoa.c b/Python/dtoa.c
index 44dc01f..83861ac 100644
--- a/Python/dtoa.c
+++ b/Python/dtoa.c
@@ -265,6 +265,16 @@ typedef union { double d; ULong L[2]; } U;
#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
#define Big1 0xffffffff
+/* Standard NaN used by _Py_dg_stdnan. */
+
+#define NAN_WORD0 0x7ff80000
+#define NAN_WORD1 0
+
+/* Bits of the representation of positive infinity. */
+
+#define POSINF_WORD0 0x7ff00000
+#define POSINF_WORD1 0
+
/* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
typedef struct BCinfo BCinfo;
@@ -1486,6 +1496,36 @@ bigcomp(U *rv, const char *s0, BCinfo *bc)
return 0;
}
+/* Return a 'standard' NaN value.
+
+ There are exactly two quiet NaNs that don't arise by 'quieting' signaling
+ NaNs (see IEEE 754-2008, section 6.2.1). If sign == 0, return the one whose
+ sign bit is cleared. Otherwise, return the one whose sign bit is set.
+*/
+
+double
+_Py_dg_stdnan(int sign)
+{
+ U rv;
+ word0(&rv) = NAN_WORD0;
+ word1(&rv) = NAN_WORD1;
+ if (sign)
+ word0(&rv) |= Sign_bit;
+ return dval(&rv);
+}
+
+/* Return positive or negative infinity, according to the given sign (0 for
+ * positive infinity, 1 for negative infinity). */
+
+double
+_Py_dg_infinity(int sign)
+{
+ U rv;
+ word0(&rv) = POSINF_WORD0;
+ word1(&rv) = POSINF_WORD1;
+ return sign ? -dval(&rv) : dval(&rv);
+}
+
double
_Py_dg_strtod(const char *s00, char **se)
{
@@ -1886,20 +1926,20 @@ _Py_dg_strtod(const char *s00, char **se)
bd2++;
/* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1,
- and bs == 1, so:
+ and bs == 1, so:
tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5)
srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2)
- 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2)
+ 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2)
- It follows that:
+ It follows that:
M * tdv = bd * 2**bd2 * 5**bd5
M * srv = bb * 2**bb2 * 5**bb5
M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5
- for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but
- this fact is not needed below.)
+ for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but
+ this fact is not needed below.)
*/
/* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */
@@ -2055,7 +2095,7 @@ _Py_dg_strtod(const char *s00, char **se)
+ Exp_msk1
;
word1(&rv) = 0;
- dsign = 0;
+ /* dsign = 0; */
break;
}
}
@@ -2092,7 +2132,7 @@ _Py_dg_strtod(const char *s00, char **se)
goto undfl;
}
}
- dsign = 1 - dsign;
+ /* dsign = 1 - dsign; */
break;
}
if ((aadj = ratio(delta, bs)) <= 2.) {
diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c
index 149990d..b4f71f2 100644
--- a/Python/dynload_aix.c
+++ b/Python/dynload_aix.c
@@ -26,11 +26,7 @@ typedef struct Module {
void *entry;
} Module, *ModulePtr;
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {".so", "rb", C_EXTENSION},
- {"module.so", "rb", C_EXTENSION},
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {".so", NULL};
static int
aix_getoldmodules(void **modlistptr)
@@ -109,6 +105,8 @@ aix_loaderror(const char *pathname)
{
char *message[1024], errbuf[1024];
+ PyObject *pathname_ob = NULL;
+ PyObject *errbuf_ob = NULL;
register int i,j;
struct errtab {
@@ -129,7 +127,6 @@ aix_loaderror(const char *pathname)
{L_ERROR_ERRNO, NULL}
};
-#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
PyOS_snprintf(errbuf, sizeof(errbuf), "from module %.200s ", pathname);
@@ -140,7 +137,7 @@ aix_loaderror(const char *pathname)
}
for(i = 0; message[i] && *message[i]; i++) {
int nerr = atoi(message[i]);
- for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
+ for (j=0; j < Py_ARRAY_LENGTH(load_errtab); j++) {
if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)
ERRBUF_APPEND(load_errtab[j].errstr);
}
@@ -149,12 +146,16 @@ aix_loaderror(const char *pathname)
ERRBUF_APPEND("\n");
}
errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
- PyErr_SetString(PyExc_ImportError, errbuf);
+ pathname_ob = PyUnicode_FromString(pathname);
+ errbuf_ob = PyUnicode_FromString(errbuf);
+ PyErr_SetImportError(errbuf_ob, NULL, pathname);
+ Py_DECREF(pathname_ob);
+ Py_DECREF(errbuf_ob);
return;
}
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp)
{
dl_funcptr p;
diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c
index 2606e1e..5836cb3b 100644
--- a/Python/dynload_dl.c
+++ b/Python/dynload_dl.c
@@ -9,18 +9,14 @@
extern char *Py_GetProgramName(void);
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {".o", "rb", C_EXTENSION},
- {"module.o", "rb", C_EXTENSION},
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {".o", NULL};
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
- const char *pathname, FILE *fp)
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
+ const char *pathname, FILE *fp)
{
- char funcname[258];
+ char funcname[258];
- PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);
- return dl_loadmod(Py_GetProgramName(), pathname, funcname);
+ PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);
+ return dl_loadmod(Py_GetProgramName(), pathname, funcname);
}
diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c
index 18a8137..c955414 100644
--- a/Python/dynload_hpux.c
+++ b/Python/dynload_hpux.c
@@ -13,13 +13,9 @@
#define FUNCNAME_PATTERN "PyInit_%.200s"
#endif
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {SHLIB_EXT, "rb", C_EXTENSION},
- {"module"SHLIB_EXT, "rb", C_EXTENSION},
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {SHLIB_EXT, NULL};
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp)
{
dl_funcptr p;
@@ -37,11 +33,21 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
/* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */
if (lib == NULL) {
char buf[256];
+ PyObject *pathname_ob = NULL;
+ PyObject *buf_ob = NULL;
+ PyObject *shortname_ob = NULL;
+
if (Py_VerboseFlag)
perror(pathname);
PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s",
pathname);
- PyErr_SetString(PyExc_ImportError, buf);
+ buf_ob = PyUnicode_FromString(buf);
+ shortname_ob = PyUnicode_FromString(shortname);
+ pathname_ob = PyUnicode_FromString(pathname);
+ PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob);
+ Py_DECREF(buf_ob);
+ Py_DECREF(shortname_ob);
+ Py_DECREF(pathname_ob);
return NULL;
}
PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, shortname);
diff --git a/Python/dynload_next.c b/Python/dynload_next.c
index cabf9b9..85c95b4 100644
--- a/Python/dynload_next.c
+++ b/Python/dynload_next.c
@@ -8,11 +8,7 @@
#include <mach-o/dyld.h>
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {".so", "rb", C_EXTENSION},
- {"module.so", "rb", C_EXTENSION},
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {".so", NULL};
/*
** Python modules are Mach-O MH_BUNDLE files. The best way to load these
@@ -31,8 +27,8 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
#define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \
NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE
#endif
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
- const char *pathname, FILE *fp)
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
+ const char *pathname, FILE *fp)
{
dl_funcptr p = NULL;
char funcname[258];
diff --git a/Python/dynload_os2.c b/Python/dynload_os2.c
index 101c024..0e1b907 100644
--- a/Python/dynload_os2.c
+++ b/Python/dynload_os2.c
@@ -9,13 +9,9 @@
#include "importdl.h"
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {".pyd", "rb", C_EXTENSION},
- {".dll", "rb", C_EXTENSION},
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {".pyd", ".dll", NULL};
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp)
{
dl_funcptr p;
diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c
index 7ea510e..0ca65c7 100644
--- a/Python/dynload_shlib.c
+++ b/Python/dynload_shlib.c
@@ -36,31 +36,25 @@
live in the same directory. E.g. foomodule.cpython-32.so
*/
-const struct filedescr _PyImport_DynLoadFiletab[] = {
+const char *_PyImport_DynLoadFiletab[] = {
#ifdef __CYGWIN__
- {".dll", "rb", C_EXTENSION},
- {"module.dll", "rb", C_EXTENSION},
+ ".dll",
#else /* !__CYGWIN__ */
#if defined(PYOS_OS2) && defined(PYCC_GCC)
- {".pyd", "rb", C_EXTENSION},
- {".dll", "rb", C_EXTENSION},
+ ".pyd",
+ ".dll",
#else /* !(defined(PYOS_OS2) && defined(PYCC_GCC)) */
#ifdef __VMS
- {".exe", "rb", C_EXTENSION},
- {".EXE", "rb", C_EXTENSION},
- {"module.exe", "rb", C_EXTENSION},
- {"MODULE.EXE", "rb", C_EXTENSION},
+ ".exe",
+ ".EXE",
#else /* !__VMS */
- {"." SOABI ".so", "rb", C_EXTENSION},
- {"module." SOABI ".so", "rb", C_EXTENSION},
- {".abi" PYTHON_ABI_STRING ".so", "rb", C_EXTENSION},
- {"module.abi" PYTHON_ABI_STRING ".so", "rb", C_EXTENSION},
- {".so", "rb", C_EXTENSION},
- {"module.so", "rb", C_EXTENSION},
+ "." SOABI ".so",
+ ".abi" PYTHON_ABI_STRING ".so",
+ ".so",
#endif /* __VMS */
#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
#endif /* __CYGWIN__ */
- {0, 0}
+ NULL,
};
static struct {
@@ -75,7 +69,7 @@ static struct {
static int nhandles = 0;
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
+dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp)
{
dl_funcptr p;
@@ -121,10 +115,6 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
dlopenflags = PyThreadState_GET()->interp->dlopenflags;
#endif
- if (Py_VerboseFlag)
- PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname,
- dlopenflags);
-
#ifdef __VMS
/* VMS currently don't allow a pathname, use a logical name instead */
/* Concatenate 'python_module_' and shortname */
@@ -139,10 +129,19 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
handle = dlopen(pathname, dlopenflags);
if (handle == NULL) {
+ PyObject *mod_name = NULL;
+ PyObject *path = NULL;
+ PyObject *error_ob = NULL;
const char *error = dlerror();
if (error == NULL)
error = "unknown dlopen() error";
- PyErr_SetString(PyExc_ImportError, error);
+ error_ob = PyUnicode_FromString(error);
+ path = PyUnicode_FromString(pathname);
+ mod_name = PyUnicode_FromString(shortname);
+ PyErr_SetImportError(error_ob, mod_name, path);
+ Py_XDECREF(error_ob);
+ Py_XDECREF(path);
+ Py_XDECREF(mod_name);
return NULL;
}
if (fp != NULL && nhandles < 128)
diff --git a/Python/dynload_stub.c b/Python/dynload_stub.c
index 69f8b45..5916048 100644
--- a/Python/dynload_stub.c
+++ b/Python/dynload_stub.c
@@ -6,6 +6,4 @@
#include "importdl.h"
-const struct filedescr _PyImport_DynLoadFiletab[] = {
- {0, 0}
-};
+const char *_PyImport_DynLoadFiletab[] = {NULL};
diff --git a/Python/dynload_win.c b/Python/dynload_win.c
index 73a1dcf..25b6680 100644
--- a/Python/dynload_win.c
+++ b/Python/dynload_win.c
@@ -12,16 +12,18 @@
#include <windows.h>
// "activation context" magic - see dl_nt.c...
+#if HAVE_SXS
extern ULONG_PTR _Py_ActivateActCtx();
void _Py_DeactivateActCtx(ULONG_PTR cookie);
+#endif
-const struct filedescr _PyImport_DynLoadFiletab[] = {
+const char *_PyImport_DynLoadFiletab[] = {
#ifdef _DEBUG
- {"_d.pyd", "rb", C_EXTENSION},
+ "_d.pyd",
#else
- {".pyd", "rb", C_EXTENSION},
+ ".pyd",
#endif
- {0, 0}
+ NULL
};
@@ -171,43 +173,44 @@ static char *GetPythonImport (HINSTANCE hModule)
return NULL;
}
-dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
- const char *pathname, FILE *fp)
+dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
+ PyObject *pathname, FILE *fp)
{
dl_funcptr p;
char funcname[258], *import_python;
+ wchar_t *wpathname;
#ifndef _DEBUG
_Py_CheckPython3();
#endif
+ wpathname = PyUnicode_AsUnicode(pathname);
+ if (wpathname == NULL)
+ return NULL;
+
PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);
{
HINSTANCE hDLL = NULL;
- char pathbuf[260];
- LPTSTR dummy;
unsigned int old_mode;
+#if HAVE_SXS
ULONG_PTR cookie = 0;
- /* We use LoadLibraryEx so Windows looks for dependent DLLs
- in directory of pathname first. However, Windows95
- can sometimes not work correctly unless the absolute
- path is used. If GetFullPathName() fails, the LoadLibrary
- will certainly fail too, so use its error code */
+#endif
/* Don't display a message box when Python can't load a DLL */
old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
- if (GetFullPathName(pathname,
- sizeof(pathbuf),
- pathbuf,
- &dummy)) {
- ULONG_PTR cookie = _Py_ActivateActCtx();
- /* XXX This call doesn't exist in Windows CE */
- hDLL = LoadLibraryEx(pathname, NULL,
- LOAD_WITH_ALTERED_SEARCH_PATH);
- _Py_DeactivateActCtx(cookie);
- }
+#if HAVE_SXS
+ cookie = _Py_ActivateActCtx();
+#endif
+ /* We use LoadLibraryEx so Windows looks for dependent DLLs
+ in directory of pathname first. */
+ /* XXX This call doesn't exist in Windows CE */
+ hDLL = LoadLibraryExW(wpathname, NULL,
+ LOAD_WITH_ALTERED_SEARCH_PATH);
+#if HAVE_SXS
+ _Py_DeactivateActCtx(cookie);
+#endif
/* restore old error mode settings */
SetErrorMode(old_mode);
@@ -254,31 +257,34 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
"DLL load failed: ");
PyUnicode_AppendAndDel(&message,
- PyUnicode_FromUnicode(
+ PyUnicode_FromWideChar(
theInfo,
theLength));
}
- PyErr_SetObject(PyExc_ImportError, message);
- Py_XDECREF(message);
+ if (message != NULL) {
+ PyErr_SetImportError(message, PyUnicode_FromString(shortname),
+ pathname);
+ Py_DECREF(message);
+ }
return NULL;
} else {
char buffer[256];
+ PyOS_snprintf(buffer, sizeof(buffer),
#ifdef _DEBUG
- PyOS_snprintf(buffer, sizeof(buffer), "python%d%d_d.dll",
+ "python%d%d_d.dll",
#else
- PyOS_snprintf(buffer, sizeof(buffer), "python%d%d.dll",
+ "python%d%d.dll",
#endif
PY_MAJOR_VERSION,PY_MINOR_VERSION);
import_python = GetPythonImport(hDLL);
if (import_python &&
strcasecmp(buffer,import_python)) {
- PyOS_snprintf(buffer, sizeof(buffer),
- "Module use of %.150s conflicts "
- "with this version of Python.",
- import_python);
- PyErr_SetString(PyExc_ImportError,buffer);
+ PyErr_Format(PyExc_ImportError,
+ "Module use of %.150s conflicts "
+ "with this version of Python.",
+ import_python);
FreeLibrary(hDLL);
return NULL;
}
diff --git a/Python/errors.c b/Python/errors.c
index 5a9a624..626b16e 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -320,6 +320,39 @@ PyErr_Clear(void)
PyErr_Restore(NULL, NULL, NULL);
}
+void
+PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
+{
+ PyThreadState *tstate = PyThreadState_GET();
+
+ *p_type = tstate->exc_type;
+ *p_value = tstate->exc_value;
+ *p_traceback = tstate->exc_traceback;
+
+ Py_XINCREF(*p_type);
+ Py_XINCREF(*p_value);
+ Py_XINCREF(*p_traceback);
+}
+
+void
+PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
+{
+ PyObject *oldtype, *oldvalue, *oldtraceback;
+ PyThreadState *tstate = PyThreadState_GET();
+
+ oldtype = tstate->exc_type;
+ oldvalue = tstate->exc_value;
+ oldtraceback = tstate->exc_traceback;
+
+ tstate->exc_type = p_type;
+ tstate->exc_value = p_value;
+ tstate->exc_traceback = p_traceback;
+
+ Py_XDECREF(oldtype);
+ Py_XDECREF(oldvalue);
+ Py_XDECREF(oldtraceback);
+}
+
/* Convenience functions to set a type error exception and return 0 */
int
@@ -341,11 +374,9 @@ PyObject *
PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
{
PyObject *message;
- PyObject *v;
+ PyObject *v, *args;
int i = errno;
-#ifndef MS_WINDOWS
- char *s;
-#else
+#ifdef MS_WINDOWS
WCHAR *s_buf = NULL;
#endif /* Unix/Windows */
@@ -355,11 +386,14 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
#endif
#ifndef MS_WINDOWS
- if (i == 0)
- s = "Error"; /* Sometimes errno didn't get set */
- else
- s = strerror(i);
- message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
+ if (i != 0) {
+ char *s = strerror(i);
+ message = PyUnicode_DecodeLocale(s, "surrogateescape");
+ }
+ else {
+ /* Sometimes errno didn't get set */
+ message = PyUnicode_FromString("Error");
+ }
#else
if (i == 0)
message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
@@ -395,7 +429,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
/* remove trailing cr/lf and dots */
while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
s_buf[--len] = L'\0';
- message = PyUnicode_FromUnicode(s_buf, len);
+ message = PyUnicode_FromWideChar(s_buf, len);
}
}
}
@@ -410,14 +444,18 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
}
if (filenameObject != NULL)
- v = Py_BuildValue("(iOO)", i, message, filenameObject);
+ args = Py_BuildValue("(iOO)", i, message, filenameObject);
else
- v = Py_BuildValue("(iO)", i, message);
+ args = Py_BuildValue("(iO)", i, message);
Py_DECREF(message);
- if (v != NULL) {
- PyErr_SetObject(exc, v);
- Py_DECREF(v);
+ if (args != NULL) {
+ v = PyObject_Call(exc, args, NULL);
+ Py_DECREF(args);
+ if (v != NULL) {
+ PyErr_SetObject((PyObject *) Py_TYPE(v), v);
+ Py_DECREF(v);
+ }
}
#ifdef MS_WINDOWS
LocalFree(s_buf);
@@ -464,7 +502,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
int len;
WCHAR *s_buf = NULL; /* Free via LocalFree */
PyObject *message;
- PyObject *v;
+ PyObject *args, *v;
DWORD err = (DWORD)ierr;
if (err==0) err = GetLastError();
len = FormatMessageW(
@@ -487,7 +525,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
/* remove trailing cr/lf and dots */
while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
s_buf[--len] = L'\0';
- message = PyUnicode_FromUnicode(s_buf, len);
+ message = PyUnicode_FromWideChar(s_buf, len);
}
if (message == NULL)
@@ -496,15 +534,20 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
return NULL;
}
- if (filenameObject != NULL)
- v = Py_BuildValue("(iOO)", err, message, filenameObject);
- else
- v = Py_BuildValue("(iO)", err, message);
+ if (filenameObject == NULL)
+ filenameObject = Py_None;
+ /* This is the constructor signature for passing a Windows error code.
+ The POSIX translation will be figured out by the constructor. */
+ args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);
Py_DECREF(message);
- if (v != NULL) {
- PyErr_SetObject(exc, v);
- Py_DECREF(v);
+ if (args != NULL) {
+ v = PyObject_Call(exc, args, NULL);
+ Py_DECREF(args);
+ if (v != NULL) {
+ PyErr_SetObject((PyObject *) Py_TYPE(v), v);
+ Py_DECREF(v);
+ }
}
LocalFree(s_buf);
return NULL;
@@ -575,6 +618,49 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
}
#endif /* MS_WINDOWS */
+PyObject *
+PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
+{
+ PyObject *args, *kwargs, *error;
+
+ if (msg == NULL)
+ return NULL;
+
+ args = PyTuple_New(1);
+ if (args == NULL)
+ return NULL;
+
+ kwargs = PyDict_New();
+ if (kwargs == NULL) {
+ Py_DECREF(args);
+ return NULL;
+ }
+
+ if (name == NULL) {
+ name = Py_None;
+ }
+
+ if (path == NULL) {
+ path = Py_None;
+ }
+
+ Py_INCREF(msg);
+ PyTuple_SET_ITEM(args, 0, msg);
+ PyDict_SetItemString(kwargs, "name", name);
+ PyDict_SetItemString(kwargs, "path", path);
+
+ error = PyObject_Call(PyExc_ImportError, args, kwargs);
+ if (error != NULL) {
+ PyErr_SetObject((PyObject *)Py_TYPE(error), error);
+ Py_DECREF(error);
+ }
+
+ Py_DECREF(args);
+ Py_DECREF(kwargs);
+
+ return NULL;
+}
+
void
_PyErr_BadInternalCall(const char *filename, int lineno)
{
@@ -656,7 +742,7 @@ PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
if (bases == NULL)
goto failure;
}
- /* Create a real new-style class. */
+ /* Create a real class. */
result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
dot+1, bases, dict);
failure:
@@ -707,6 +793,7 @@ PyErr_NewExceptionWithDoc(const char *name, const char *doc,
void
PyErr_WriteUnraisable(PyObject *obj)
{
+ _Py_IDENTIFIER(__module__);
PyObject *f, *t, *v, *tb;
PyErr_Fetch(&t, &v, &tb);
f = PySys_GetObject("stderr");
@@ -723,7 +810,7 @@ PyErr_WriteUnraisable(PyObject *obj)
className = dot+1;
}
- moduleName = PyObject_GetAttrString(t, "__module__");
+ moduleName = _PyObject_GetAttrId(t, &PyId___module__);
if (moduleName == NULL)
PyFile_WriteString("<unknown>", f);
else {
@@ -774,6 +861,12 @@ void
PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
{
PyObject *exc, *v, *tb, *tmp;
+ _Py_IDENTIFIER(filename);
+ _Py_IDENTIFIER(lineno);
+ _Py_IDENTIFIER(msg);
+ _Py_IDENTIFIER(offset);
+ _Py_IDENTIFIER(print_file_and_line);
+ _Py_IDENTIFIER(text);
/* add attributes for the line number and filename for the error */
PyErr_Fetch(&exc, &v, &tb);
@@ -784,7 +877,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
if (tmp == NULL)
PyErr_Clear();
else {
- if (PyObject_SetAttrString(v, "lineno", tmp))
+ if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))
PyErr_Clear();
Py_DECREF(tmp);
}
@@ -793,7 +886,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
if (tmp == NULL)
PyErr_Clear();
else {
- if (PyObject_SetAttrString(v, "offset", tmp))
+ if (_PyObject_SetAttrId(v, &PyId_offset, tmp))
PyErr_Clear();
Py_DECREF(tmp);
}
@@ -803,35 +896,35 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
if (tmp == NULL)
PyErr_Clear();
else {
- if (PyObject_SetAttrString(v, "filename", tmp))
+ if (_PyObject_SetAttrId(v, &PyId_filename, tmp))
PyErr_Clear();
Py_DECREF(tmp);
}
tmp = PyErr_ProgramText(filename, lineno);
if (tmp) {
- if (PyObject_SetAttrString(v, "text", tmp))
+ if (_PyObject_SetAttrId(v, &PyId_text, tmp))
PyErr_Clear();
Py_DECREF(tmp);
}
}
- if (PyObject_SetAttrString(v, "offset", Py_None)) {
+ if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {
PyErr_Clear();
}
if (exc != PyExc_SyntaxError) {
- if (!PyObject_HasAttrString(v, "msg")) {
+ if (!_PyObject_HasAttrId(v, &PyId_msg)) {
tmp = PyObject_Str(v);
if (tmp) {
- if (PyObject_SetAttrString(v, "msg", tmp))
+ if (_PyObject_SetAttrId(v, &PyId_msg, tmp))
PyErr_Clear();
Py_DECREF(tmp);
} else {
PyErr_Clear();
}
}
- if (!PyObject_HasAttrString(v, "print_file_and_line")) {
- if (PyObject_SetAttrString(v, "print_file_and_line",
- Py_None))
+ if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) {
+ if (_PyObject_SetAttrId(v, &PyId_print_file_and_line,
+ Py_None))
PyErr_Clear();
}
}
diff --git a/Python/fileutils.c b/Python/fileutils.c
index c563eaa..501cb8c 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -3,6 +3,40 @@
# include <windows.h>
#endif
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+PyObject *
+_Py_device_encoding(int fd)
+{
+#if defined(MS_WINDOWS) || defined(MS_WIN64)
+ UINT cp;
+#endif
+ if (!_PyVerify_fd(fd) || !isatty(fd)) {
+ Py_RETURN_NONE;
+ }
+#if defined(MS_WINDOWS) || defined(MS_WIN64)
+ if (fd == 0)
+ cp = GetConsoleCP();
+ else if (fd == 1 || fd == 2)
+ cp = GetConsoleOutputCP();
+ else
+ cp = 0;
+ /* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application
+ has no console */
+ if (cp != 0)
+ return PyUnicode_FromFormat("cp%u", (unsigned int)cp);
+#elif defined(CODESET)
+ {
+ char *codeset = nl_langinfo(CODESET);
+ if (codeset != NULL && codeset[0] != 0)
+ return PyUnicode_FromString(codeset);
+ }
+#endif
+ Py_RETURN_NONE;
+}
+
#ifdef HAVE_STAT
/* Decode a byte string from the locale encoding with the
@@ -16,7 +50,9 @@
Return a pointer to a newly allocated wide character string (use
PyMem_Free() to free the memory) and write the number of written wide
characters excluding the null character into *size if size is not NULL, or
- NULL on error (conversion or memory allocation error).
+ NULL on error (decoding or memory allocation error). If size is not NULL,
+ *size is set to (size_t)-1 on memory error and (size_t)-2 on decoding
+ error.
Conversion errors should never happen, unless there is a bug in the C
library. */
@@ -82,8 +118,9 @@ _Py_char2wchar(const char* arg, size_t *size)
since we provide everything that we have -
unless there is a bug in the C library, or I
misunderstood how mbrtowc works. */
- fprintf(stderr, "unexpected mbrtowc result -2\n");
PyMem_Free(res);
+ if (size != NULL)
+ *size = (size_t)-2;
return NULL;
}
if (converted == (size_t)-1) {
@@ -112,7 +149,8 @@ _Py_char2wchar(const char* arg, size_t *size)
is ASCII (i.e. escape all bytes > 128. This will still roundtrip
correctly in the locale's charset, which must be an ASCII superset. */
res = PyMem_Malloc((strlen(arg)+1)*sizeof(wchar_t));
- if (!res) goto oom;
+ if (!res)
+ goto oom;
in = (unsigned char*)arg;
out = res;
while(*in)
@@ -126,7 +164,8 @@ _Py_char2wchar(const char* arg, size_t *size)
*size = out - res;
return res;
oom:
- fprintf(stderr, "out of memory\n");
+ if (size != NULL)
+ *size = (size_t)-1;
return NULL;
}
@@ -137,10 +176,10 @@ oom:
This function is the reverse of _Py_char2wchar().
Return a pointer to a newly allocated byte string (use PyMem_Free() to free
- the memory), or NULL on conversion or memory allocation error.
+ the memory), or NULL on encoding or memory allocation error.
If error_pos is not NULL: *error_pos is the index of the invalid character
- on conversion error, or (size_t)-1 otherwise. */
+ on encoding error, or (size_t)-1 otherwise. */
char*
_Py_wchar2char(const wchar_t *text, size_t *error_pos)
{
@@ -235,8 +274,8 @@ _Py_wstat(const wchar_t* path, struct stat *buf)
/* Call _wstat() on Windows, or encode the path to the filesystem encoding and
call stat() otherwise. Only fill st_mode attribute on Windows.
- Return 0 on success, -1 on _wstat() / stat() error or (if PyErr_Occurred())
- unicode error. */
+ Return 0 on success, -1 on _wstat() / stat() error, -2 if an exception was
+ raised. */
int
_Py_stat(PyObject *path, struct stat *statbuf)
@@ -244,8 +283,12 @@ _Py_stat(PyObject *path, struct stat *statbuf)
#ifdef MS_WINDOWS
int err;
struct _stat wstatbuf;
+ wchar_t *wpath;
- err = _wstat(PyUnicode_AS_UNICODE(path), &wstatbuf);
+ wpath = PyUnicode_AsUnicode(path);
+ if (wpath == NULL)
+ return -2;
+ err = _wstat(wpath, &wstatbuf);
if (!err)
statbuf->st_mode = wstatbuf.st_mode;
return err;
@@ -253,7 +296,7 @@ _Py_stat(PyObject *path, struct stat *statbuf)
int ret;
PyObject *bytes = PyUnicode_EncodeFSDefault(path);
if (bytes == NULL)
- return -1;
+ return -2;
ret = stat(PyBytes_AS_STRING(bytes), statbuf);
Py_DECREF(bytes);
return ret;
@@ -297,18 +340,29 @@ FILE*
_Py_fopen(PyObject *path, const char *mode)
{
#ifdef MS_WINDOWS
+ wchar_t *wpath;
wchar_t wmode[10];
int usize;
+ if (!PyUnicode_Check(path)) {
+ PyErr_Format(PyExc_TypeError,
+ "str file path expected under Windows, got %R",
+ Py_TYPE(path));
+ return NULL;
+ }
+ wpath = PyUnicode_AsUnicode(path);
+ if (wpath == NULL)
+ return NULL;
+
usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));
if (usize == 0)
return NULL;
- return _wfopen(PyUnicode_AS_UNICODE(path), wmode);
+ return _wfopen(wpath, wmode);
#else
FILE *f;
- PyObject *bytes = PyUnicode_EncodeFSDefault(path);
- if (bytes == NULL)
+ PyObject *bytes;
+ if (!PyUnicode_FSConverter(path, &bytes))
return NULL;
f = fopen(PyBytes_AS_STRING(bytes), mode);
Py_DECREF(bytes);
@@ -319,7 +373,7 @@ _Py_fopen(PyObject *path, const char *mode)
#ifdef HAVE_READLINK
/* Read value of symbolic link. Encode the path to the locale encoding, decode
- the result from the locale encoding. */
+ the result from the locale encoding. Return -1 on error. */
int
_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
@@ -363,7 +417,8 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
#ifdef HAVE_REALPATH
/* Return the canonicalized absolute pathname. Encode path to the locale
- encoding, decode the result from the locale encoding. */
+ encoding, decode the result from the locale encoding.
+ Return NULL on error. */
wchar_t*
_Py_wrealpath(const wchar_t *path,
@@ -401,7 +456,8 @@ _Py_wrealpath(const wchar_t *path,
#endif
/* Get the current directory. size is the buffer size in wide characters
- including the null character. Decode the path from the locale encoding. */
+ including the null character. Decode the path from the locale encoding.
+ Return NULL on error. */
wchar_t*
_Py_wgetcwd(wchar_t *buf, size_t size)
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index c350907..aa62502 100644
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -3,12 +3,1534 @@
of int.__float__, etc., that take and return unicode objects */
#include "Python.h"
-#include "../Objects/stringlib/unicodedefs.h"
+#include <locale.h>
+/* Raises an exception about an unknown presentation type for this
+ * type. */
-#define FORMAT_STRING _PyUnicode_FormatAdvanced
-#define FORMAT_LONG _PyLong_FormatAdvanced
-#define FORMAT_FLOAT _PyFloat_FormatAdvanced
-#define FORMAT_COMPLEX _PyComplex_FormatAdvanced
+static void
+unknown_presentation_type(Py_UCS4 presentation_type,
+ const char* type_name)
+{
+ /* %c might be out-of-range, hence the two cases. */
+ if (presentation_type > 32 && presentation_type < 128)
+ PyErr_Format(PyExc_ValueError,
+ "Unknown format code '%c' "
+ "for object of type '%.200s'",
+ (char)presentation_type,
+ type_name);
+ else
+ PyErr_Format(PyExc_ValueError,
+ "Unknown format code '\\x%x' "
+ "for object of type '%.200s'",
+ (unsigned int)presentation_type,
+ type_name);
+}
-#include "../Objects/stringlib/formatter.h"
+static void
+invalid_comma_type(Py_UCS4 presentation_type)
+{
+ if (presentation_type > 32 && presentation_type < 128)
+ PyErr_Format(PyExc_ValueError,
+ "Cannot specify ',' with '%c'.",
+ (char)presentation_type);
+ else
+ PyErr_Format(PyExc_ValueError,
+ "Cannot specify ',' with '\\x%x'.",
+ (unsigned int)presentation_type);
+}
+
+/*
+ get_integer consumes 0 or more decimal digit characters from an
+ input string, updates *result with the corresponding positive
+ integer, and returns the number of digits consumed.
+
+ returns -1 on error.
+*/
+static int
+get_integer(PyObject *str, Py_ssize_t *pos, Py_ssize_t end,
+ Py_ssize_t *result)
+{
+ Py_ssize_t accumulator, digitval;
+ int numdigits;
+ accumulator = numdigits = 0;
+ for (;;(*pos)++, numdigits++) {
+ if (*pos >= end)
+ break;
+ digitval = Py_UNICODE_TODECIMAL(PyUnicode_READ_CHAR(str, *pos));
+ if (digitval < 0)
+ break;
+ /*
+ Detect possible overflow before it happens:
+
+ accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if
+ accumulator > (PY_SSIZE_T_MAX - digitval) / 10.
+ */
+ if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) {
+ PyErr_Format(PyExc_ValueError,
+ "Too many decimal digits in format string");
+ return -1;
+ }
+ accumulator = accumulator * 10 + digitval;
+ }
+ *result = accumulator;
+ return numdigits;
+}
+
+/************************************************************************/
+/*********** standard format specifier parsing **************************/
+/************************************************************************/
+
+/* returns true if this character is a specifier alignment token */
+Py_LOCAL_INLINE(int)
+is_alignment_token(Py_UCS4 c)
+{
+ switch (c) {
+ case '<': case '>': case '=': case '^':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/* returns true if this character is a sign element */
+Py_LOCAL_INLINE(int)
+is_sign_element(Py_UCS4 c)
+{
+ switch (c) {
+ case ' ': case '+': case '-':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+typedef struct {
+ Py_UCS4 fill_char;
+ Py_UCS4 align;
+ int alternate;
+ Py_UCS4 sign;
+ Py_ssize_t width;
+ int thousands_separators;
+ Py_ssize_t precision;
+ Py_UCS4 type;
+} InternalFormatSpec;
+
+#if 0
+/* Occassionally useful for debugging. Should normally be commented out. */
+static void
+DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format)
+{
+ printf("internal format spec: fill_char %d\n", format->fill_char);
+ printf("internal format spec: align %d\n", format->align);
+ printf("internal format spec: alternate %d\n", format->alternate);
+ printf("internal format spec: sign %d\n", format->sign);
+ printf("internal format spec: width %zd\n", format->width);
+ printf("internal format spec: thousands_separators %d\n",
+ format->thousands_separators);
+ printf("internal format spec: precision %zd\n", format->precision);
+ printf("internal format spec: type %c\n", format->type);
+ printf("\n");
+}
+#endif
+
+
+/*
+ ptr points to the start of the format_spec, end points just past its end.
+ fills in format with the parsed information.
+ returns 1 on success, 0 on failure.
+ if failure, sets the exception
+*/
+static int
+parse_internal_render_format_spec(PyObject *format_spec,
+ Py_ssize_t start, Py_ssize_t end,
+ InternalFormatSpec *format,
+ char default_type,
+ char default_align)
+{
+ Py_ssize_t pos = start;
+ /* end-pos is used throughout this code to specify the length of
+ the input string */
+#define READ_spec(index) PyUnicode_READ_CHAR(format_spec, index)
+
+ Py_ssize_t consumed;
+ int align_specified = 0;
+
+ format->fill_char = '\0';
+ format->align = default_align;
+ format->alternate = 0;
+ format->sign = '\0';
+ format->width = -1;
+ format->thousands_separators = 0;
+ format->precision = -1;
+ format->type = default_type;
+
+ /* If the second char is an alignment token,
+ then parse the fill char */
+ if (end-pos >= 2 && is_alignment_token(READ_spec(pos+1))) {
+ format->align = READ_spec(pos+1);
+ format->fill_char = READ_spec(pos);
+ align_specified = 1;
+ pos += 2;
+ }
+ else if (end-pos >= 1 && is_alignment_token(READ_spec(pos))) {
+ format->align = READ_spec(pos);
+ align_specified = 1;
+ ++pos;
+ }
+
+ /* Parse the various sign options */
+ if (end-pos >= 1 && is_sign_element(READ_spec(pos))) {
+ format->sign = READ_spec(pos);
+ ++pos;
+ }
+
+ /* If the next character is #, we're in alternate mode. This only
+ applies to integers. */
+ if (end-pos >= 1 && READ_spec(pos) == '#') {
+ format->alternate = 1;
+ ++pos;
+ }
+
+ /* The special case for 0-padding (backwards compat) */
+ if (format->fill_char == '\0' && end-pos >= 1 && READ_spec(pos) == '0') {
+ format->fill_char = '0';
+ if (!align_specified) {
+ format->align = '=';
+ }
+ ++pos;
+ }
+
+ consumed = get_integer(format_spec, &pos, end, &format->width);
+ if (consumed == -1)
+ /* Overflow error. Exception already set. */
+ return 0;
+
+ /* If consumed is 0, we didn't consume any characters for the
+ width. In that case, reset the width to -1, because
+ get_integer() will have set it to zero. -1 is how we record
+ that the width wasn't specified. */
+ if (consumed == 0)
+ format->width = -1;
+
+ /* Comma signifies add thousands separators */
+ if (end-pos && READ_spec(pos) == ',') {
+ format->thousands_separators = 1;
+ ++pos;
+ }
+
+ /* Parse field precision */
+ if (end-pos && READ_spec(pos) == '.') {
+ ++pos;
+
+ consumed = get_integer(format_spec, &pos, end, &format->precision);
+ if (consumed == -1)
+ /* Overflow error. Exception already set. */
+ return 0;
+
+ /* Not having a precision after a dot is an error. */
+ if (consumed == 0) {
+ PyErr_Format(PyExc_ValueError,
+ "Format specifier missing precision");
+ return 0;
+ }
+
+ }
+
+ /* Finally, parse the type field. */
+
+ if (end-pos > 1) {
+ /* More than one char remain, invalid format specifier. */
+ PyErr_Format(PyExc_ValueError, "Invalid format specifier");
+ return 0;
+ }
+
+ if (end-pos == 1) {
+ format->type = READ_spec(pos);
+ ++pos;
+ }
+
+ /* Do as much validating as we can, just by looking at the format
+ specifier. Do not take into account what type of formatting
+ we're doing (int, float, string). */
+
+ if (format->thousands_separators) {
+ switch (format->type) {
+ case 'd':
+ case 'e':
+ case 'f':
+ case 'g':
+ case 'E':
+ case 'G':
+ case '%':
+ case 'F':
+ case '\0':
+ /* These are allowed. See PEP 378.*/
+ break;
+ default:
+ invalid_comma_type(format->type);
+ return 0;
+ }
+ }
+
+ assert (format->align <= 127);
+ assert (format->sign <= 127);
+ return 1;
+}
+
+/* Calculate the padding needed. */
+static void
+calc_padding(Py_ssize_t nchars, Py_ssize_t width, Py_UCS4 align,
+ Py_ssize_t *n_lpadding, Py_ssize_t *n_rpadding,
+ Py_ssize_t *n_total)
+{
+ if (width >= 0) {
+ if (nchars > width)
+ *n_total = nchars;
+ else
+ *n_total = width;
+ }
+ else {
+ /* not specified, use all of the chars and no more */
+ *n_total = nchars;
+ }
+
+ /* Figure out how much leading space we need, based on the
+ aligning */
+ if (align == '>')
+ *n_lpadding = *n_total - nchars;
+ else if (align == '^')
+ *n_lpadding = (*n_total - nchars) / 2;
+ else if (align == '<' || align == '=')
+ *n_lpadding = 0;
+ else {
+ /* We should never have an unspecified alignment. */
+ *n_lpadding = 0;
+ assert(0);
+ }
+
+ *n_rpadding = *n_total - nchars - *n_lpadding;
+}
+
+/* Do the padding, and return a pointer to where the caller-supplied
+ content goes. */
+static Py_ssize_t
+fill_padding(_PyUnicodeWriter *writer,
+ Py_ssize_t nchars,
+ Py_UCS4 fill_char, Py_ssize_t n_lpadding,
+ Py_ssize_t n_rpadding)
+{
+ Py_ssize_t pos;
+
+ /* Pad on left. */
+ if (n_lpadding) {
+ pos = writer->pos;
+ _PyUnicode_FastFill(writer->buffer, pos, n_lpadding, fill_char);
+ }
+
+ /* Pad on right. */
+ if (n_rpadding) {
+ pos = writer->pos + nchars + n_lpadding;
+ _PyUnicode_FastFill(writer->buffer, pos, n_rpadding, fill_char);
+ }
+
+ /* Pointer to the user content. */
+ writer->pos += n_lpadding;
+ return 0;
+}
+
+/************************************************************************/
+/*********** common routines for numeric formatting *********************/
+/************************************************************************/
+
+/* Locale type codes. */
+#define LT_CURRENT_LOCALE 0
+#define LT_DEFAULT_LOCALE 1
+#define LT_NO_LOCALE 2
+
+/* Locale info needed for formatting integers and the part of floats
+ before and including the decimal. Note that locales only support
+ 8-bit chars, not unicode. */
+typedef struct {
+ PyObject *decimal_point;
+ PyObject *thousands_sep;
+ const char *grouping;
+} LocaleInfo;
+
+#define STATIC_LOCALE_INFO_INIT {0, 0, 0}
+
+/* describes the layout for an integer, see the comment in
+ calc_number_widths() for details */
+typedef struct {
+ Py_ssize_t n_lpadding;
+ Py_ssize_t n_prefix;
+ Py_ssize_t n_spadding;
+ Py_ssize_t n_rpadding;
+ char sign;
+ Py_ssize_t n_sign; /* number of digits needed for sign (0/1) */
+ Py_ssize_t n_grouped_digits; /* Space taken up by the digits, including
+ any grouping chars. */
+ Py_ssize_t n_decimal; /* 0 if only an integer */
+ Py_ssize_t n_remainder; /* Digits in decimal and/or exponent part,
+ excluding the decimal itself, if
+ present. */
+
+ /* These 2 are not the widths of fields, but are needed by
+ STRINGLIB_GROUPING. */
+ Py_ssize_t n_digits; /* The number of digits before a decimal
+ or exponent. */
+ Py_ssize_t n_min_width; /* The min_width we used when we computed
+ the n_grouped_digits width. */
+} NumberFieldWidths;
+
+
+/* Given a number of the form:
+ digits[remainder]
+ where ptr points to the start and end points to the end, find where
+ the integer part ends. This could be a decimal, an exponent, both,
+ or neither.
+ If a decimal point is present, set *has_decimal and increment
+ remainder beyond it.
+ Results are undefined (but shouldn't crash) for improperly
+ formatted strings.
+*/
+static void
+parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end,
+ Py_ssize_t *n_remainder, int *has_decimal)
+{
+ Py_ssize_t remainder;
+
+ while (pos<end && isdigit(PyUnicode_READ_CHAR(s, pos)))
+ ++pos;
+ remainder = pos;
+
+ /* Does remainder start with a decimal point? */
+ *has_decimal = pos<end && PyUnicode_READ_CHAR(s, remainder) == '.';
+
+ /* Skip the decimal point. */
+ if (*has_decimal)
+ remainder++;
+
+ *n_remainder = end - remainder;
+}
+
+/* not all fields of format are used. for example, precision is
+ unused. should this take discrete params in order to be more clear
+ about what it does? or is passing a single format parameter easier
+ and more efficient enough to justify a little obfuscation? */
+static Py_ssize_t
+calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
+ Py_UCS4 sign_char, PyObject *number, Py_ssize_t n_start,
+ Py_ssize_t n_end, Py_ssize_t n_remainder,
+ int has_decimal, const LocaleInfo *locale,
+ const InternalFormatSpec *format, Py_UCS4 *maxchar)
+{
+ Py_ssize_t n_non_digit_non_padding;
+ Py_ssize_t n_padding;
+
+ spec->n_digits = n_end - n_start - n_remainder - (has_decimal?1:0);
+ spec->n_lpadding = 0;
+ spec->n_prefix = n_prefix;
+ spec->n_decimal = has_decimal ? PyUnicode_GET_LENGTH(locale->decimal_point) : 0;
+ spec->n_remainder = n_remainder;
+ spec->n_spadding = 0;
+ spec->n_rpadding = 0;
+ spec->sign = '\0';
+ spec->n_sign = 0;
+
+ /* the output will look like:
+ | |
+ | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> |
+ | |
+
+ sign is computed from format->sign and the actual
+ sign of the number
+
+ prefix is given (it's for the '0x' prefix)
+
+ digits is already known
+
+ the total width is either given, or computed from the
+ actual digits
+
+ only one of lpadding, spadding, and rpadding can be non-zero,
+ and it's calculated from the width and other fields
+ */
+
+ /* compute the various parts we're going to write */
+ switch (format->sign) {
+ case '+':
+ /* always put a + or - */
+ spec->n_sign = 1;
+ spec->sign = (sign_char == '-' ? '-' : '+');
+ break;
+ case ' ':
+ spec->n_sign = 1;
+ spec->sign = (sign_char == '-' ? '-' : ' ');
+ break;
+ default:
+ /* Not specified, or the default (-) */
+ if (sign_char == '-') {
+ spec->n_sign = 1;
+ spec->sign = '-';
+ }
+ }
+
+ /* The number of chars used for non-digits and non-padding. */
+ n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal +
+ spec->n_remainder;
+
+ /* min_width can go negative, that's okay. format->width == -1 means
+ we don't care. */
+ if (format->fill_char == '0' && format->align == '=')
+ spec->n_min_width = format->width - n_non_digit_non_padding;
+ else
+ spec->n_min_width = 0;
+
+ if (spec->n_digits == 0)
+ /* This case only occurs when using 'c' formatting, we need
+ to special case it because the grouping code always wants
+ to have at least one character. */
+ spec->n_grouped_digits = 0;
+ else {
+ Py_UCS4 grouping_maxchar;
+ spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping(
+ NULL, 0,
+ 0, NULL,
+ spec->n_digits, spec->n_min_width,
+ locale->grouping, locale->thousands_sep, &grouping_maxchar);
+ *maxchar = Py_MAX(*maxchar, grouping_maxchar);
+ }
+
+ /* Given the desired width and the total of digit and non-digit
+ space we consume, see if we need any padding. format->width can
+ be negative (meaning no padding), but this code still works in
+ that case. */
+ n_padding = format->width -
+ (n_non_digit_non_padding + spec->n_grouped_digits);
+ if (n_padding > 0) {
+ /* Some padding is needed. Determine if it's left, space, or right. */
+ switch (format->align) {
+ case '<':
+ spec->n_rpadding = n_padding;
+ break;
+ case '^':
+ spec->n_lpadding = n_padding / 2;
+ spec->n_rpadding = n_padding - spec->n_lpadding;
+ break;
+ case '=':
+ spec->n_spadding = n_padding;
+ break;
+ case '>':
+ spec->n_lpadding = n_padding;
+ break;
+ default:
+ /* Shouldn't get here, but treat it as '>' */
+ spec->n_lpadding = n_padding;
+ assert(0);
+ break;
+ }
+ }
+
+ if (spec->n_lpadding || spec->n_spadding || spec->n_rpadding)
+ *maxchar = Py_MAX(*maxchar, format->fill_char);
+
+ if (spec->n_decimal)
+ *maxchar = Py_MAX(*maxchar, PyUnicode_MAX_CHAR_VALUE(locale->decimal_point));
+
+ return spec->n_lpadding + spec->n_sign + spec->n_prefix +
+ spec->n_spadding + spec->n_grouped_digits + spec->n_decimal +
+ spec->n_remainder + spec->n_rpadding;
+}
+
+/* Fill in the digit parts of a numbers's string representation,
+ as determined in calc_number_widths().
+ Return -1 on error, or 0 on success. */
+static int
+fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec,
+ PyObject *digits, Py_ssize_t d_start, Py_ssize_t d_end,
+ PyObject *prefix, Py_ssize_t p_start,
+ Py_UCS4 fill_char,
+ LocaleInfo *locale, int toupper)
+{
+ /* Used to keep track of digits, decimal, and remainder. */
+ Py_ssize_t d_pos = d_start;
+ const enum PyUnicode_Kind kind = writer->kind;
+ const void *data = writer->data;
+ Py_ssize_t r;
+
+ if (spec->n_lpadding) {
+ _PyUnicode_FastFill(writer->buffer,
+ writer->pos, spec->n_lpadding, fill_char);
+ writer->pos += spec->n_lpadding;
+ }
+ if (spec->n_sign == 1) {
+ PyUnicode_WRITE(kind, data, writer->pos, spec->sign);
+ writer->pos++;
+ }
+ if (spec->n_prefix) {
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ prefix, p_start,
+ spec->n_prefix);
+ if (toupper) {
+ Py_ssize_t t;
+ for (t = 0; t < spec->n_prefix; t++) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, writer->pos + t);
+ c = Py_TOUPPER(c);
+ assert (c <= 127);
+ PyUnicode_WRITE(kind, data, writer->pos + t, c);
+ }
+ }
+ writer->pos += spec->n_prefix;
+ }
+ if (spec->n_spadding) {
+ _PyUnicode_FastFill(writer->buffer,
+ writer->pos, spec->n_spadding, fill_char);
+ writer->pos += spec->n_spadding;
+ }
+
+ /* Only for type 'c' special case, it has no digits. */
+ if (spec->n_digits != 0) {
+ /* Fill the digits with InsertThousandsGrouping. */
+ char *pdigits;
+ if (PyUnicode_READY(digits))
+ return -1;
+ pdigits = PyUnicode_DATA(digits);
+ if (PyUnicode_KIND(digits) < kind) {
+ pdigits = _PyUnicode_AsKind(digits, kind);
+ if (pdigits == NULL)
+ return -1;
+ }
+ r = _PyUnicode_InsertThousandsGrouping(
+ writer->buffer, writer->pos,
+ spec->n_grouped_digits,
+ pdigits + kind * d_pos,
+ spec->n_digits, spec->n_min_width,
+ locale->grouping, locale->thousands_sep, NULL);
+ if (r == -1)
+ return -1;
+ assert(r == spec->n_grouped_digits);
+ if (PyUnicode_KIND(digits) < kind)
+ PyMem_Free(pdigits);
+ d_pos += spec->n_digits;
+ }
+ if (toupper) {
+ Py_ssize_t t;
+ for (t = 0; t < spec->n_grouped_digits; t++) {
+ Py_UCS4 c = PyUnicode_READ(kind, data, writer->pos + t);
+ c = Py_TOUPPER(c);
+ if (c > 127) {
+ PyErr_SetString(PyExc_SystemError, "non-ascii grouped digit");
+ return -1;
+ }
+ PyUnicode_WRITE(kind, data, writer->pos + t, c);
+ }
+ }
+ writer->pos += spec->n_grouped_digits;
+
+ if (spec->n_decimal) {
+ _PyUnicode_FastCopyCharacters(
+ writer->buffer, writer->pos,
+ locale->decimal_point, 0, spec->n_decimal);
+ writer->pos += spec->n_decimal;
+ d_pos += 1;
+ }
+
+ if (spec->n_remainder) {
+ _PyUnicode_FastCopyCharacters(
+ writer->buffer, writer->pos,
+ digits, d_pos, spec->n_remainder);
+ writer->pos += spec->n_remainder;
+ /* d_pos += spec->n_remainder; */
+ }
+
+ if (spec->n_rpadding) {
+ _PyUnicode_FastFill(writer->buffer,
+ writer->pos, spec->n_rpadding,
+ fill_char);
+ writer->pos += spec->n_rpadding;
+ }
+ return 0;
+}
+
+static char no_grouping[1] = {CHAR_MAX};
+
+/* Find the decimal point character(s?), thousands_separator(s?), and
+ grouping description, either for the current locale if type is
+ LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or
+ none if LT_NO_LOCALE. */
+static int
+get_locale_info(int type, LocaleInfo *locale_info)
+{
+ switch (type) {
+ case LT_CURRENT_LOCALE: {
+ struct lconv *locale_data = localeconv();
+ locale_info->decimal_point = PyUnicode_DecodeLocale(
+ locale_data->decimal_point,
+ NULL);
+ if (locale_info->decimal_point == NULL)
+ return -1;
+ locale_info->thousands_sep = PyUnicode_DecodeLocale(
+ locale_data->thousands_sep,
+ NULL);
+ if (locale_info->thousands_sep == NULL) {
+ Py_DECREF(locale_info->decimal_point);
+ return -1;
+ }
+ locale_info->grouping = locale_data->grouping;
+ break;
+ }
+ case LT_DEFAULT_LOCALE:
+ locale_info->decimal_point = PyUnicode_FromOrdinal('.');
+ locale_info->thousands_sep = PyUnicode_FromOrdinal(',');
+ if (!locale_info->decimal_point || !locale_info->thousands_sep) {
+ Py_XDECREF(locale_info->decimal_point);
+ Py_XDECREF(locale_info->thousands_sep);
+ return -1;
+ }
+ locale_info->grouping = "\3"; /* Group every 3 characters. The
+ (implicit) trailing 0 means repeat
+ infinitely. */
+ break;
+ case LT_NO_LOCALE:
+ locale_info->decimal_point = PyUnicode_FromOrdinal('.');
+ locale_info->thousands_sep = PyUnicode_New(0, 0);
+ if (!locale_info->decimal_point || !locale_info->thousands_sep) {
+ Py_XDECREF(locale_info->decimal_point);
+ Py_XDECREF(locale_info->thousands_sep);
+ return -1;
+ }
+ locale_info->grouping = no_grouping;
+ break;
+ default:
+ assert(0);
+ }
+ return 0;
+}
+
+static void
+free_locale_info(LocaleInfo *locale_info)
+{
+ Py_XDECREF(locale_info->decimal_point);
+ Py_XDECREF(locale_info->thousands_sep);
+}
+
+/************************************************************************/
+/*********** string formatting ******************************************/
+/************************************************************************/
+
+static int
+format_string_internal(PyObject *value, const InternalFormatSpec *format,
+ _PyUnicodeWriter *writer)
+{
+ Py_ssize_t lpad;
+ Py_ssize_t rpad;
+ Py_ssize_t total;
+ Py_ssize_t len;
+ int result = -1;
+ Py_UCS4 maxchar;
+
+ assert(PyUnicode_IS_READY(value));
+ len = PyUnicode_GET_LENGTH(value);
+
+ /* sign is not allowed on strings */
+ if (format->sign != '\0') {
+ PyErr_SetString(PyExc_ValueError,
+ "Sign not allowed in string format specifier");
+ goto done;
+ }
+
+ /* alternate is not allowed on strings */
+ if (format->alternate) {
+ PyErr_SetString(PyExc_ValueError,
+ "Alternate form (#) not allowed in string format "
+ "specifier");
+ goto done;
+ }
+
+ /* '=' alignment not allowed on strings */
+ if (format->align == '=') {
+ PyErr_SetString(PyExc_ValueError,
+ "'=' alignment not allowed "
+ "in string format specifier");
+ goto done;
+ }
+
+ if (format->width == -1 && format->precision == -1) {
+ /* Fast path */
+ return _PyUnicodeWriter_WriteStr(writer, value);
+ }
+
+ /* if precision is specified, output no more that format.precision
+ characters */
+ if (format->precision >= 0 && len >= format->precision) {
+ len = format->precision;
+ }
+
+ calc_padding(len, format->width, format->align, &lpad, &rpad, &total);
+
+ maxchar = _PyUnicode_FindMaxChar(value, 0, len);
+ if (lpad != 0 || rpad != 0)
+ maxchar = Py_MAX(maxchar, format->fill_char);
+
+ /* allocate the resulting string */
+ if (_PyUnicodeWriter_Prepare(writer, total, maxchar) == -1)
+ goto done;
+
+ /* Write into that space. First the padding. */
+ result = fill_padding(writer, len,
+ format->fill_char=='\0'?' ':format->fill_char,
+ lpad, rpad);
+ if (result == -1)
+ goto done;
+
+ /* Then the source string. */
+ if (len) {
+ _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
+ value, 0, len);
+ }
+ writer->pos += (len + rpad);
+ result = 0;
+
+done:
+ return result;
+}
+
+
+/************************************************************************/
+/*********** long formatting ********************************************/
+/************************************************************************/
+
+static int
+format_long_internal(PyObject *value, const InternalFormatSpec *format,
+ _PyUnicodeWriter *writer)
+{
+ int result = -1;
+ Py_UCS4 maxchar = 127;
+ PyObject *tmp = NULL;
+ Py_ssize_t inumeric_chars;
+ Py_UCS4 sign_char = '\0';
+ Py_ssize_t n_digits; /* count of digits need from the computed
+ string */
+ Py_ssize_t n_remainder = 0; /* Used only for 'c' formatting, which
+ produces non-digits */
+ Py_ssize_t n_prefix = 0; /* Count of prefix chars, (e.g., '0x') */
+ Py_ssize_t n_total;
+ Py_ssize_t prefix = 0;
+ NumberFieldWidths spec;
+ long x;
+
+ /* Locale settings, either from the actual locale or
+ from a hard-code pseudo-locale */
+ LocaleInfo locale = STATIC_LOCALE_INFO_INIT;
+
+ /* no precision allowed on integers */
+ if (format->precision != -1) {
+ PyErr_SetString(PyExc_ValueError,
+ "Precision not allowed in integer format specifier");
+ goto done;
+ }
+
+ /* special case for character formatting */
+ if (format->type == 'c') {
+ /* error to specify a sign */
+ if (format->sign != '\0') {
+ PyErr_SetString(PyExc_ValueError,
+ "Sign not allowed with integer"
+ " format specifier 'c'");
+ goto done;
+ }
+
+ /* taken from unicodeobject.c formatchar() */
+ /* Integer input truncated to a character */
+ x = PyLong_AsLong(value);
+ if (x == -1 && PyErr_Occurred())
+ goto done;
+ if (x < 0 || x > 0x10ffff) {
+ PyErr_SetString(PyExc_OverflowError,
+ "%c arg not in range(0x110000)");
+ goto done;
+ }
+ tmp = PyUnicode_FromOrdinal(x);
+ inumeric_chars = 0;
+ n_digits = 1;
+ maxchar = Py_MAX(maxchar, (Py_UCS4)x);
+
+ /* As a sort-of hack, we tell calc_number_widths that we only
+ have "remainder" characters. calc_number_widths thinks
+ these are characters that don't get formatted, only copied
+ into the output string. We do this for 'c' formatting,
+ because the characters are likely to be non-digits. */
+ n_remainder = 1;
+ }
+ else {
+ int base;
+ int leading_chars_to_skip = 0; /* Number of characters added by
+ PyNumber_ToBase that we want to
+ skip over. */
+
+ /* Compute the base and how many characters will be added by
+ PyNumber_ToBase */
+ switch (format->type) {
+ case 'b':
+ base = 2;
+ leading_chars_to_skip = 2; /* 0b */
+ break;
+ case 'o':
+ base = 8;
+ leading_chars_to_skip = 2; /* 0o */
+ break;
+ case 'x':
+ case 'X':
+ base = 16;
+ leading_chars_to_skip = 2; /* 0x */
+ break;
+ default: /* shouldn't be needed, but stops a compiler warning */
+ case 'd':
+ case 'n':
+ base = 10;
+ break;
+ }
+
+ if (format->sign != '+' && format->sign != ' '
+ && format->width == -1
+ && format->type != 'X' && format->type != 'n'
+ && !format->thousands_separators
+ && PyLong_CheckExact(value))
+ {
+ /* Fast path */
+ return _PyLong_FormatWriter(writer, value, base, format->alternate);
+ }
+
+ /* The number of prefix chars is the same as the leading
+ chars to skip */
+ if (format->alternate)
+ n_prefix = leading_chars_to_skip;
+
+ /* Do the hard part, converting to a string in a given base */
+ tmp = _PyLong_Format(value, base);
+ if (tmp == NULL || PyUnicode_READY(tmp) == -1)
+ goto done;
+
+ inumeric_chars = 0;
+ n_digits = PyUnicode_GET_LENGTH(tmp);
+
+ prefix = inumeric_chars;
+
+ /* Is a sign character present in the output? If so, remember it
+ and skip it */
+ if (PyUnicode_READ_CHAR(tmp, inumeric_chars) == '-') {
+ sign_char = '-';
+ ++prefix;
+ ++leading_chars_to_skip;
+ }
+
+ /* Skip over the leading chars (0x, 0b, etc.) */
+ n_digits -= leading_chars_to_skip;
+ inumeric_chars += leading_chars_to_skip;
+ }
+
+ /* Determine the grouping, separator, and decimal point, if any. */
+ if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
+ (format->thousands_separators ?
+ LT_DEFAULT_LOCALE :
+ LT_NO_LOCALE),
+ &locale) == -1)
+ goto done;
+
+ /* Calculate how much memory we'll need. */
+ n_total = calc_number_widths(&spec, n_prefix, sign_char, tmp, inumeric_chars,
+ inumeric_chars + n_digits, n_remainder, 0,
+ &locale, format, &maxchar);
+
+ /* Allocate the memory. */
+ if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1)
+ goto done;
+
+ /* Populate the memory. */
+ result = fill_number(writer, &spec,
+ tmp, inumeric_chars, inumeric_chars + n_digits,
+ tmp, prefix,
+ format->fill_char == '\0' ? ' ' : format->fill_char,
+ &locale, format->type == 'X');
+
+done:
+ Py_XDECREF(tmp);
+ free_locale_info(&locale);
+ return result;
+}
+
+/************************************************************************/
+/*********** float formatting *******************************************/
+/************************************************************************/
+
+/* much of this is taken from unicodeobject.c */
+static int
+format_float_internal(PyObject *value,
+ const InternalFormatSpec *format,
+ _PyUnicodeWriter *writer)
+{
+ char *buf = NULL; /* buffer returned from PyOS_double_to_string */
+ Py_ssize_t n_digits;
+ Py_ssize_t n_remainder;
+ Py_ssize_t n_total;
+ int has_decimal;
+ double val;
+ Py_ssize_t precision = format->precision;
+ Py_ssize_t default_precision = 6;
+ Py_UCS4 type = format->type;
+ int add_pct = 0;
+ Py_ssize_t index;
+ NumberFieldWidths spec;
+ int flags = 0;
+ int result = -1;
+ Py_UCS4 maxchar = 127;
+ Py_UCS4 sign_char = '\0';
+ int float_type; /* Used to see if we have a nan, inf, or regular float. */
+ PyObject *unicode_tmp = NULL;
+
+ /* Locale settings, either from the actual locale or
+ from a hard-code pseudo-locale */
+ LocaleInfo locale = STATIC_LOCALE_INFO_INIT;
+
+ if (format->alternate)
+ flags |= Py_DTSF_ALT;
+
+ if (type == '\0') {
+ /* Omitted type specifier. Behaves in the same way as repr(x)
+ and str(x) if no precision is given, else like 'g', but with
+ at least one digit after the decimal point. */
+ flags |= Py_DTSF_ADD_DOT_0;
+ type = 'r';
+ default_precision = 0;
+ }
+
+ if (type == 'n')
+ /* 'n' is the same as 'g', except for the locale used to
+ format the result. We take care of that later. */
+ type = 'g';
+
+ val = PyFloat_AsDouble(value);
+ if (val == -1.0 && PyErr_Occurred())
+ goto done;
+
+ if (type == '%') {
+ type = 'f';
+ val *= 100;
+ add_pct = 1;
+ }
+
+ if (precision < 0)
+ precision = default_precision;
+ else if (type == 'r')
+ type = 'g';
+
+ /* Cast "type", because if we're in unicode we need to pass a
+ 8-bit char. This is safe, because we've restricted what "type"
+ can be. */
+ buf = PyOS_double_to_string(val, (char)type, precision, flags,
+ &float_type);
+ if (buf == NULL)
+ goto done;
+ n_digits = strlen(buf);
+
+ if (add_pct) {
+ /* We know that buf has a trailing zero (since we just called
+ strlen() on it), and we don't use that fact any more. So we
+ can just write over the trailing zero. */
+ buf[n_digits] = '%';
+ n_digits += 1;
+ }
+
+ /* Since there is no unicode version of PyOS_double_to_string,
+ just use the 8 bit version and then convert to unicode. */
+ unicode_tmp = _PyUnicode_FromASCII(buf, n_digits);
+ PyMem_Free(buf);
+ if (unicode_tmp == NULL)
+ goto done;
+
+ if (format->sign != '+' && format->sign != ' '
+ && format->width == -1
+ && format->type != 'n'
+ && !format->thousands_separators)
+ {
+ /* Fast path */
+ result = _PyUnicodeWriter_WriteStr(writer, unicode_tmp);
+ Py_DECREF(unicode_tmp);
+ return result;
+ }
+
+ /* Is a sign character present in the output? If so, remember it
+ and skip it */
+ index = 0;
+ if (PyUnicode_READ_CHAR(unicode_tmp, index) == '-') {
+ sign_char = '-';
+ ++index;
+ --n_digits;
+ }
+
+ /* Determine if we have any "remainder" (after the digits, might include
+ decimal or exponent or both (or neither)) */
+ parse_number(unicode_tmp, index, index + n_digits, &n_remainder, &has_decimal);
+
+ /* Determine the grouping, separator, and decimal point, if any. */
+ if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
+ (format->thousands_separators ?
+ LT_DEFAULT_LOCALE :
+ LT_NO_LOCALE),
+ &locale) == -1)
+ goto done;
+
+ /* Calculate how much memory we'll need. */
+ n_total = calc_number_widths(&spec, 0, sign_char, unicode_tmp, index,
+ index + n_digits, n_remainder, has_decimal,
+ &locale, format, &maxchar);
+
+ /* Allocate the memory. */
+ if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1)
+ goto done;
+
+ /* Populate the memory. */
+ result = fill_number(writer, &spec,
+ unicode_tmp, index, index + n_digits,
+ NULL, 0,
+ format->fill_char == '\0' ? ' ' : format->fill_char,
+ &locale, 0);
+
+done:
+ Py_XDECREF(unicode_tmp);
+ free_locale_info(&locale);
+ return result;
+}
+
+/************************************************************************/
+/*********** complex formatting *****************************************/
+/************************************************************************/
+
+static int
+format_complex_internal(PyObject *value,
+ const InternalFormatSpec *format,
+ _PyUnicodeWriter *writer)
+{
+ double re;
+ double im;
+ char *re_buf = NULL; /* buffer returned from PyOS_double_to_string */
+ char *im_buf = NULL; /* buffer returned from PyOS_double_to_string */
+
+ InternalFormatSpec tmp_format = *format;
+ Py_ssize_t n_re_digits;
+ Py_ssize_t n_im_digits;
+ Py_ssize_t n_re_remainder;
+ Py_ssize_t n_im_remainder;
+ Py_ssize_t n_re_total;
+ Py_ssize_t n_im_total;
+ int re_has_decimal;
+ int im_has_decimal;
+ Py_ssize_t precision = format->precision;
+ Py_ssize_t default_precision = 6;
+ Py_UCS4 type = format->type;
+ Py_ssize_t i_re;
+ Py_ssize_t i_im;
+ NumberFieldWidths re_spec;
+ NumberFieldWidths im_spec;
+ int flags = 0;
+ int result = -1;
+ Py_UCS4 maxchar = 127;
+ enum PyUnicode_Kind rkind;
+ void *rdata;
+ Py_UCS4 re_sign_char = '\0';
+ Py_UCS4 im_sign_char = '\0';
+ int re_float_type; /* Used to see if we have a nan, inf, or regular float. */
+ int im_float_type;
+ int add_parens = 0;
+ int skip_re = 0;
+ Py_ssize_t lpad;
+ Py_ssize_t rpad;
+ Py_ssize_t total;
+ PyObject *re_unicode_tmp = NULL;
+ PyObject *im_unicode_tmp = NULL;
+
+ /* Locale settings, either from the actual locale or
+ from a hard-code pseudo-locale */
+ LocaleInfo locale = STATIC_LOCALE_INFO_INIT;
+
+ /* Zero padding is not allowed. */
+ if (format->fill_char == '0') {
+ PyErr_SetString(PyExc_ValueError,
+ "Zero padding is not allowed in complex format "
+ "specifier");
+ goto done;
+ }
+
+ /* Neither is '=' alignment . */
+ if (format->align == '=') {
+ PyErr_SetString(PyExc_ValueError,
+ "'=' alignment flag is not allowed in complex format "
+ "specifier");
+ goto done;
+ }
+
+ re = PyComplex_RealAsDouble(value);
+ if (re == -1.0 && PyErr_Occurred())
+ goto done;
+ im = PyComplex_ImagAsDouble(value);
+ if (im == -1.0 && PyErr_Occurred())
+ goto done;
+
+ if (format->alternate)
+ flags |= Py_DTSF_ALT;
+
+ if (type == '\0') {
+ /* Omitted type specifier. Should be like str(self). */
+ type = 'r';
+ default_precision = 0;
+ if (re == 0.0 && copysign(1.0, re) == 1.0)
+ skip_re = 1;
+ else
+ add_parens = 1;
+ }
+
+ if (type == 'n')
+ /* 'n' is the same as 'g', except for the locale used to
+ format the result. We take care of that later. */
+ type = 'g';
+
+ if (precision < 0)
+ precision = default_precision;
+ else if (type == 'r')
+ type = 'g';
+
+ /* Cast "type", because if we're in unicode we need to pass a
+ 8-bit char. This is safe, because we've restricted what "type"
+ can be. */
+ re_buf = PyOS_double_to_string(re, (char)type, precision, flags,
+ &re_float_type);
+ if (re_buf == NULL)
+ goto done;
+ im_buf = PyOS_double_to_string(im, (char)type, precision, flags,
+ &im_float_type);
+ if (im_buf == NULL)
+ goto done;
+
+ n_re_digits = strlen(re_buf);
+ n_im_digits = strlen(im_buf);
+
+ /* Since there is no unicode version of PyOS_double_to_string,
+ just use the 8 bit version and then convert to unicode. */
+ re_unicode_tmp = _PyUnicode_FromASCII(re_buf, n_re_digits);
+ if (re_unicode_tmp == NULL)
+ goto done;
+ i_re = 0;
+
+ im_unicode_tmp = _PyUnicode_FromASCII(im_buf, n_im_digits);
+ if (im_unicode_tmp == NULL)
+ goto done;
+ i_im = 0;
+
+ /* Is a sign character present in the output? If so, remember it
+ and skip it */
+ if (PyUnicode_READ_CHAR(re_unicode_tmp, i_re) == '-') {
+ re_sign_char = '-';
+ ++i_re;
+ --n_re_digits;
+ }
+ if (PyUnicode_READ_CHAR(im_unicode_tmp, i_im) == '-') {
+ im_sign_char = '-';
+ ++i_im;
+ --n_im_digits;
+ }
+
+ /* Determine if we have any "remainder" (after the digits, might include
+ decimal or exponent or both (or neither)) */
+ parse_number(re_unicode_tmp, i_re, i_re + n_re_digits,
+ &n_re_remainder, &re_has_decimal);
+ parse_number(im_unicode_tmp, i_im, i_im + n_im_digits,
+ &n_im_remainder, &im_has_decimal);
+
+ /* Determine the grouping, separator, and decimal point, if any. */
+ if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE :
+ (format->thousands_separators ?
+ LT_DEFAULT_LOCALE :
+ LT_NO_LOCALE),
+ &locale) == -1)
+ goto done;
+
+ /* Turn off any padding. We'll do it later after we've composed
+ the numbers without padding. */
+ tmp_format.fill_char = '\0';
+ tmp_format.align = '<';
+ tmp_format.width = -1;
+
+ /* Calculate how much memory we'll need. */
+ n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, re_unicode_tmp,
+ i_re, i_re + n_re_digits, n_re_remainder,
+ re_has_decimal, &locale, &tmp_format,
+ &maxchar);
+
+ /* Same formatting, but always include a sign, unless the real part is
+ * going to be omitted, in which case we use whatever sign convention was
+ * requested by the original format. */
+ if (!skip_re)
+ tmp_format.sign = '+';
+ n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, im_unicode_tmp,
+ i_im, i_im + n_im_digits, n_im_remainder,
+ im_has_decimal, &locale, &tmp_format,
+ &maxchar);
+
+ if (skip_re)
+ n_re_total = 0;
+
+ /* Add 1 for the 'j', and optionally 2 for parens. */
+ calc_padding(n_re_total + n_im_total + 1 + add_parens * 2,
+ format->width, format->align, &lpad, &rpad, &total);
+
+ if (lpad || rpad)
+ maxchar = Py_MAX(maxchar, format->fill_char);
+
+ if (_PyUnicodeWriter_Prepare(writer, total, maxchar) == -1)
+ goto done;
+ rkind = writer->kind;
+ rdata = writer->data;
+
+ /* Populate the memory. First, the padding. */
+ result = fill_padding(writer,
+ n_re_total + n_im_total + 1 + add_parens * 2,
+ format->fill_char=='\0' ? ' ' : format->fill_char,
+ lpad, rpad);
+ if (result == -1)
+ goto done;
+
+ if (add_parens) {
+ PyUnicode_WRITE(rkind, rdata, writer->pos, '(');
+ writer->pos++;
+ }
+
+ if (!skip_re) {
+ result = fill_number(writer, &re_spec,
+ re_unicode_tmp, i_re, i_re + n_re_digits,
+ NULL, 0,
+ 0,
+ &locale, 0);
+ if (result == -1)
+ goto done;
+ }
+ result = fill_number(writer, &im_spec,
+ im_unicode_tmp, i_im, i_im + n_im_digits,
+ NULL, 0,
+ 0,
+ &locale, 0);
+ if (result == -1)
+ goto done;
+ PyUnicode_WRITE(rkind, rdata, writer->pos, 'j');
+ writer->pos++;
+
+ if (add_parens) {
+ PyUnicode_WRITE(rkind, rdata, writer->pos, ')');
+ writer->pos++;
+ }
+
+ writer->pos += rpad;
+
+done:
+ PyMem_Free(re_buf);
+ PyMem_Free(im_buf);
+ Py_XDECREF(re_unicode_tmp);
+ Py_XDECREF(im_unicode_tmp);
+ free_locale_info(&locale);
+ return result;
+}
+
+/************************************************************************/
+/*********** built in formatters ****************************************/
+/************************************************************************/
+static int
+format_obj(PyObject *obj, _PyUnicodeWriter *writer)
+{
+ PyObject *str;
+ int err;
+
+ str = PyObject_Str(obj);
+ if (str == NULL)
+ return -1;
+ err = _PyUnicodeWriter_WriteStr(writer, str);
+ Py_DECREF(str);
+ return err;
+}
+
+int
+_PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start, Py_ssize_t end)
+{
+ InternalFormatSpec format;
+
+ assert(PyUnicode_Check(obj));
+
+ /* check for the special case of zero length format spec, make
+ it equivalent to str(obj) */
+ if (start == end) {
+ if (PyUnicode_CheckExact(obj))
+ return _PyUnicodeWriter_WriteStr(writer, obj);
+ else
+ return format_obj(obj, writer);
+ }
+
+ /* parse the format_spec */
+ if (!parse_internal_render_format_spec(format_spec, start, end,
+ &format, 's', '<'))
+ return -1;
+
+ /* type conversion? */
+ switch (format.type) {
+ case 's':
+ /* no type conversion needed, already a string. do the formatting */
+ return format_string_internal(obj, &format, writer);
+ default:
+ /* unknown */
+ unknown_presentation_type(format.type, obj->ob_type->tp_name);
+ return -1;
+ }
+}
+
+int
+_PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start, Py_ssize_t end)
+{
+ PyObject *tmp = NULL, *str = NULL;
+ InternalFormatSpec format;
+ int result = -1;
+
+ /* check for the special case of zero length format spec, make
+ it equivalent to str(obj) */
+ if (start == end) {
+ if (PyLong_CheckExact(obj))
+ return _PyLong_FormatWriter(writer, obj, 10, 0);
+ else
+ return format_obj(obj, writer);
+ }
+
+ /* parse the format_spec */
+ if (!parse_internal_render_format_spec(format_spec, start, end,
+ &format, 'd', '>'))
+ goto done;
+
+ /* type conversion? */
+ switch (format.type) {
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'o':
+ case 'x':
+ case 'X':
+ case 'n':
+ /* no type conversion needed, already an int (or long). do
+ the formatting */
+ result = format_long_internal(obj, &format, writer);
+ break;
+
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
+ case 'g':
+ case 'G':
+ case '%':
+ /* convert to float */
+ tmp = PyNumber_Float(obj);
+ if (tmp == NULL)
+ goto done;
+ result = format_float_internal(tmp, &format, writer);
+ break;
+
+ default:
+ /* unknown */
+ unknown_presentation_type(format.type, obj->ob_type->tp_name);
+ goto done;
+ }
+
+done:
+ Py_XDECREF(tmp);
+ Py_XDECREF(str);
+ return result;
+}
+
+int
+_PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start, Py_ssize_t end)
+{
+ InternalFormatSpec format;
+
+ /* check for the special case of zero length format spec, make
+ it equivalent to str(obj) */
+ if (start == end)
+ return format_obj(obj, writer);
+
+ /* parse the format_spec */
+ if (!parse_internal_render_format_spec(format_spec, start, end,
+ &format, '\0', '>'))
+ return -1;
+
+ /* type conversion? */
+ switch (format.type) {
+ case '\0': /* No format code: like 'g', but with at least one decimal. */
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
+ case 'g':
+ case 'G':
+ case 'n':
+ case '%':
+ /* no conversion, already a float. do the formatting */
+ return format_float_internal(obj, &format, writer);
+
+ default:
+ /* unknown */
+ unknown_presentation_type(format.type, obj->ob_type->tp_name);
+ return -1;
+ }
+}
+
+int
+_PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer,
+ PyObject *obj,
+ PyObject *format_spec,
+ Py_ssize_t start, Py_ssize_t end)
+{
+ InternalFormatSpec format;
+
+ /* check for the special case of zero length format spec, make
+ it equivalent to str(obj) */
+ if (start == end)
+ return format_obj(obj, writer);
+
+ /* parse the format_spec */
+ if (!parse_internal_render_format_spec(format_spec, start, end,
+ &format, '\0', '>'))
+ return -1;
+
+ /* type conversion? */
+ switch (format.type) {
+ case '\0': /* No format code: like 'g', but with at least one decimal. */
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
+ case 'g':
+ case 'G':
+ case 'n':
+ /* no conversion, already a complex. do the formatting */
+ return format_complex_internal(obj, &format, writer);
+
+ default:
+ /* unknown */
+ unknown_presentation_type(format.type, obj->ob_type->tp_name);
+ return -1;
+ }
+}
diff --git a/Python/frozen.c b/Python/frozen.c
index ddf6224..25fdc17 100644
--- a/Python/frozen.c
+++ b/Python/frozen.c
@@ -2,6 +2,7 @@
/* Dummy frozen modules initializer */
#include "Python.h"
+#include "importlib.h"
/* In order to test the support for frozen modules, by default we
define a single frozen module, __hello__. Loading it will print
@@ -28,6 +29,8 @@ static unsigned char M___hello__[] = {
#define SIZE (int)sizeof(M___hello__)
static struct _frozen _PyImport_FrozenModules[] = {
+ /* importlib */
+ {"_frozen_importlib", _Py_M__importlib, (int)sizeof(_Py_M__importlib)},
/* Test module */
{"__hello__", M___hello__, SIZE},
/* Test package (negative size indicates package-ness) */
diff --git a/Python/getargs.c b/Python/getargs.c
index a77bb05..18c8e91 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -33,16 +33,33 @@ PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
#define FLAG_COMPAT 1
#define FLAG_SIZE_T 2
+typedef int (*destr_t)(PyObject *, void *);
+
+
+/* Keep track of "objects" that have been allocated or initialized and
+ which will need to be deallocated or cleaned up somehow if overall
+ parsing fails.
+*/
+typedef struct {
+ void *item;
+ destr_t destructor;
+} freelistentry_t;
+
+typedef struct {
+ int first_available;
+ freelistentry_t *entries;
+} freelist_t;
+
/* Forward */
static int vgetargs1(PyObject *, const char *, va_list *, int);
static void seterror(int, const char *, int *, const char *, const char *);
static char *convertitem(PyObject *, const char **, va_list *, int, int *,
- char *, size_t, PyObject **);
+ char *, size_t, freelist_t *);
static char *converttuple(PyObject *, const char **, va_list *, int,
- int *, char *, size_t, int, PyObject **);
+ int *, char *, size_t, int, freelist_t *);
static char *convertsimple(PyObject *, const char **, va_list *, int, char *,
- size_t, PyObject **);
+ size_t, freelist_t *);
static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
static int getbuffer(PyObject *, Py_buffer *, char**);
@@ -123,115 +140,54 @@ _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va)
/* Handle cleanup of allocated memory in case of exception */
-#define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr"
-#define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer"
-#define GETARGS_CAPSULE_NAME_CLEANUP_CONVERT "getargs.cleanup_convert"
-
-static void
-cleanup_ptr(PyObject *self)
+static int
+cleanup_ptr(PyObject *self, void *ptr)
{
- void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR);
if (ptr) {
PyMem_FREE(ptr);
}
+ return 0;
}
-static void
-cleanup_buffer(PyObject *self)
+static int
+cleanup_buffer(PyObject *self, void *ptr)
{
- Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER);
- if (ptr) {
- PyBuffer_Release(ptr);
+ Py_buffer *buf = (Py_buffer *)ptr;
+ if (buf) {
+ PyBuffer_Release(buf);
}
+ return 0;
}
static int
-addcleanup(void *ptr, PyObject **freelist, int is_buffer)
+addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)
{
- PyObject *cobj;
- const char *name;
- PyCapsule_Destructor destr;
-
- if (is_buffer) {
- destr = cleanup_buffer;
- name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER;
- } else {
- destr = cleanup_ptr;
- name = GETARGS_CAPSULE_NAME_CLEANUP_PTR;
- }
-
- if (!*freelist) {
- *freelist = PyList_New(0);
- if (!*freelist) {
- destr(ptr);
- return -1;
- }
- }
+ int index;
- cobj = PyCapsule_New(ptr, name, destr);
- if (!cobj) {
- destr(ptr);
- return -1;
- }
- if (PyList_Append(*freelist, cobj)) {
- Py_DECREF(cobj);
- return -1;
- }
- Py_DECREF(cobj);
- return 0;
-}
+ index = freelist->first_available;
+ freelist->first_available += 1;
-static void
-cleanup_convert(PyObject *self)
-{
- typedef int (*destr_t)(PyObject *, void *);
- destr_t destr = (destr_t)PyCapsule_GetContext(self);
- void *ptr = PyCapsule_GetPointer(self,
- GETARGS_CAPSULE_NAME_CLEANUP_CONVERT);
- if (ptr && destr)
- destr(NULL, ptr);
-}
+ freelist->entries[index].item = ptr;
+ freelist->entries[index].destructor = destructor;
-static int
-addcleanup_convert(void *ptr, PyObject **freelist, int (*destr)(PyObject*,void*))
-{
- PyObject *cobj;
- if (!*freelist) {
- *freelist = PyList_New(0);
- if (!*freelist) {
- destr(NULL, ptr);
- return -1;
- }
- }
- cobj = PyCapsule_New(ptr, GETARGS_CAPSULE_NAME_CLEANUP_CONVERT,
- cleanup_convert);
- if (!cobj) {
- destr(NULL, ptr);
- return -1;
- }
- if (PyCapsule_SetContext(cobj, destr) == -1) {
- /* This really should not happen. */
- Py_FatalError("capsule refused setting of context.");
- }
- if (PyList_Append(*freelist, cobj)) {
- Py_DECREF(cobj); /* This will also call destr. */
- return -1;
- }
- Py_DECREF(cobj);
return 0;
}
static int
-cleanreturn(int retval, PyObject *freelist)
+cleanreturn(int retval, freelist_t *freelist)
{
- if (freelist && retval != 0) {
- /* We were successful, reset the destructors so that they
- don't get called. */
- Py_ssize_t len = PyList_GET_SIZE(freelist), i;
- for (i = 0; i < len; i++)
- PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL);
- }
- Py_XDECREF(freelist);
+ int index;
+
+ if (retval == 0) {
+ /* A failure occurred, therefore execute all of the cleanup
+ functions.
+ */
+ for (index = 0; index < freelist->first_available; ++index) {
+ freelist->entries[index].destructor(NULL,
+ freelist->entries[index].item);
+ }
+ }
+ PyMem_FREE(freelist->entries);
return retval;
}
@@ -250,7 +206,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
const char *formatsave = format;
Py_ssize_t i, len;
char *msg;
- PyObject *freelist = NULL;
+ freelist_t freelist = {0, NULL};
int compat = flags & FLAG_COMPAT;
assert(compat || (args != (PyObject*)NULL));
@@ -306,64 +262,66 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
format = formatsave;
+ freelist.entries = PyMem_NEW(freelistentry_t, max);
+ if (freelist.entries == NULL) {
+ PyErr_NoMemory();
+ return 0;
+ }
+
if (compat) {
if (max == 0) {
if (args == NULL)
return 1;
- PyOS_snprintf(msgbuf, sizeof(msgbuf),
- "%.200s%s takes no arguments",
- fname==NULL ? "function" : fname,
- fname==NULL ? "" : "()");
- PyErr_SetString(PyExc_TypeError, msgbuf);
- return 0;
+ PyErr_Format(PyExc_TypeError,
+ "%.200s%s takes no arguments",
+ fname==NULL ? "function" : fname,
+ fname==NULL ? "" : "()");
+ return cleanreturn(0, &freelist);
}
else if (min == 1 && max == 1) {
if (args == NULL) {
- PyOS_snprintf(msgbuf, sizeof(msgbuf),
- "%.200s%s takes at least one argument",
- fname==NULL ? "function" : fname,
- fname==NULL ? "" : "()");
- PyErr_SetString(PyExc_TypeError, msgbuf);
- return 0;
+ PyErr_Format(PyExc_TypeError,
+ "%.200s%s takes at least one argument",
+ fname==NULL ? "function" : fname,
+ fname==NULL ? "" : "()");
+ return cleanreturn(0, &freelist);
}
msg = convertitem(args, &format, p_va, flags, levels,
msgbuf, sizeof(msgbuf), &freelist);
if (msg == NULL)
- return cleanreturn(1, freelist);
+ return cleanreturn(1, &freelist);
seterror(levels[0], msg, levels+1, fname, message);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
else {
PyErr_SetString(PyExc_SystemError,
"old style getargs format uses new features");
- return 0;
+ return cleanreturn(0, &freelist);
}
}
if (!PyTuple_Check(args)) {
PyErr_SetString(PyExc_SystemError,
"new style getargs format but argument is not a tuple");
- return 0;
+ return cleanreturn(0, &freelist);
}
len = PyTuple_GET_SIZE(args);
if (len < min || max < len) {
- if (message == NULL) {
- PyOS_snprintf(msgbuf, sizeof(msgbuf),
- "%.150s%s takes %s %d argument%s "
- "(%ld given)",
- fname==NULL ? "function" : fname,
- fname==NULL ? "" : "()",
- min==max ? "exactly"
- : len < min ? "at least" : "at most",
- len < min ? min : max,
- (len < min ? min : max) == 1 ? "" : "s",
- Py_SAFE_DOWNCAST(len, Py_ssize_t, long));
- message = msgbuf;
- }
- PyErr_SetString(PyExc_TypeError, message);
- return 0;
+ if (message == NULL)
+ PyErr_Format(PyExc_TypeError,
+ "%.150s%s takes %s %d argument%s (%ld given)",
+ fname==NULL ? "function" : fname,
+ fname==NULL ? "" : "()",
+ min==max ? "exactly"
+ : len < min ? "at least" : "at most",
+ len < min ? min : max,
+ (len < min ? min : max) == 1 ? "" : "s",
+ Py_SAFE_DOWNCAST(len, Py_ssize_t, long));
+ else
+ PyErr_SetString(PyExc_TypeError, message);
+ return cleanreturn(0, &freelist);
}
for (i = 0; i < len; i++) {
@@ -374,7 +332,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
sizeof(msgbuf), &freelist);
if (msg) {
seterror(i+1, msg, levels, fname, msg);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
}
@@ -383,10 +341,10 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
*format != '|' && *format != ':' && *format != ';') {
PyErr_Format(PyExc_SystemError,
"bad format string: %.200s", formatsave);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
- return cleanreturn(1, freelist);
+ return cleanreturn(1, &freelist);
}
@@ -450,7 +408,7 @@ seterror(int iarg, const char *msg, int *levels, const char *fname,
static char *
converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
int *levels, char *msgbuf, size_t bufsize, int toplevel,
- PyObject **freelist)
+ freelist_t *freelist)
{
int level = 0;
int n = 0;
@@ -525,7 +483,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
static char *
convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
- int *levels, char *msgbuf, size_t bufsize, PyObject **freelist)
+ int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)
{
char *msg;
const char *format = *p_format;
@@ -550,9 +508,6 @@ convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
-#define UNICODE_DEFAULT_ENCODING(arg) \
- _PyUnicode_AsDefaultEncodedString(arg, NULL)
-
/* Format an error message generated by convertsimple(). */
static char *
@@ -593,7 +548,7 @@ float_argument_error(PyObject *arg)
static char *
convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
- char *msgbuf, size_t bufsize, PyObject **freelist)
+ char *msgbuf, size_t bufsize, freelist_t *freelist)
{
/* For # codes */
#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
@@ -615,7 +570,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
const char *format = *p_format;
char c = *format++;
- PyObject *uarg;
+ char *sarg;
switch (c) {
@@ -832,6 +787,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
char *p = va_arg(*p_va, char *);
if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
*p = PyBytes_AS_STRING(arg)[0];
+ else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1)
+ *p = PyByteArray_AS_STRING(arg)[0];
else
return converterr("a byte string of length 1", arg, msgbuf, bufsize);
break;
@@ -839,11 +796,33 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'C': {/* unicode char */
int *p = va_arg(*p_va, int *);
- if (PyUnicode_Check(arg) &&
- PyUnicode_GET_SIZE(arg) == 1)
- *p = PyUnicode_AS_UNICODE(arg)[0];
- else
+ int kind;
+ void *data;
+
+ if (!PyUnicode_Check(arg))
return converterr("a unicode character", arg, msgbuf, bufsize);
+
+ if (PyUnicode_READY(arg))
+ RETURN_ERR_OCCURRED;
+
+ if (PyUnicode_GET_LENGTH(arg) != 1)
+ return converterr("a unicode character", arg, msgbuf, bufsize);
+
+ kind = PyUnicode_KIND(arg);
+ data = PyUnicode_DATA(arg);
+ *p = PyUnicode_READ(kind, data, 0);
+ break;
+ }
+
+ case 'p': {/* boolean *p*redicate */
+ int *p = va_arg(*p_va, int *);
+ int val = PyObject_IsTrue(arg);
+ if (val > 0)
+ *p = 1;
+ else if (val == 0)
+ *p = 0;
+ else
+ RETURN_ERR_OCCURRED;
break;
}
@@ -858,7 +837,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
return converterr(buf, arg, msgbuf, bufsize);
format++;
- if (addcleanup(p, freelist, 1)) {
+ if (addcleanup(p, freelist, cleanup_buffer)) {
return converterr(
"(cleanup problem)",
arg, msgbuf, bufsize);
@@ -891,20 +870,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
if (c == 'z' && arg == Py_None)
PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
else if (PyUnicode_Check(arg)) {
- uarg = UNICODE_DEFAULT_ENCODING(arg);
- if (uarg == NULL)
+ Py_ssize_t len;
+ sarg = PyUnicode_AsUTF8AndSize(arg, &len);
+ if (sarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
- PyBuffer_FillInfo(p, arg,
- PyBytes_AS_STRING(uarg), PyBytes_GET_SIZE(uarg),
- 1, 0);
+ PyBuffer_FillInfo(p, arg, sarg, len, 1, 0);
}
else { /* any buffer-like object */
char *buf;
if (getbuffer(arg, p, &buf) < 0)
return converterr(buf, arg, msgbuf, bufsize);
}
- if (addcleanup(p, freelist, 1)) {
+ if (addcleanup(p, freelist, cleanup_buffer)) {
return converterr(
"(cleanup problem)",
arg, msgbuf, bufsize);
@@ -920,12 +898,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
STORE_SIZE(0);
}
else if (PyUnicode_Check(arg)) {
- uarg = UNICODE_DEFAULT_ENCODING(arg);
- if (uarg == NULL)
+ Py_ssize_t len;
+ sarg = PyUnicode_AsUTF8AndSize(arg, &len);
+ if (sarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
- *p = PyBytes_AS_STRING(uarg);
- STORE_SIZE(PyBytes_GET_SIZE(uarg));
+ *p = sarg;
+ STORE_SIZE(len);
}
else { /* any buffer-like object */
/* XXX Really? */
@@ -939,25 +918,25 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
} else {
/* "s" or "z" */
char **p = va_arg(*p_va, char **);
- uarg = NULL;
+ Py_ssize_t len;
+ sarg = NULL;
if (c == 'z' && arg == Py_None)
*p = NULL;
else if (PyUnicode_Check(arg)) {
- uarg = UNICODE_DEFAULT_ENCODING(arg);
- if (uarg == NULL)
+ sarg = PyUnicode_AsUTF8AndSize(arg, &len);
+ if (sarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf, bufsize);
- *p = PyBytes_AS_STRING(uarg);
+ *p = sarg;
}
else
return converterr(c == 'z' ? "str or None" : "str",
arg, msgbuf, bufsize);
- if (*p != NULL && uarg != NULL &&
- (Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg))
+ if (*p != NULL && sarg != NULL && (Py_ssize_t) strlen(*p) != len)
return converterr(
- c == 'z' ? "str without null bytes or None"
- : "str without null bytes",
+ c == 'z' ? "str without null characters or None"
+ : "str without null characters",
arg, msgbuf, bufsize);
}
break;
@@ -966,9 +945,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'u': /* raw unicode buffer (Py_UNICODE *) */
case 'Z': /* raw unicode buffer or None */
{
+ Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
+
if (*format == '#') { /* any buffer-like object */
/* "s#" or "Z#" */
- Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
FETCH_SIZE;
if (c == 'Z' && arg == Py_None) {
@@ -976,23 +956,27 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
STORE_SIZE(0);
}
else if (PyUnicode_Check(arg)) {
- *p = PyUnicode_AS_UNICODE(arg);
- STORE_SIZE(PyUnicode_GET_SIZE(arg));
+ Py_ssize_t len;
+ *p = PyUnicode_AsUnicodeAndSize(arg, &len);
+ if (*p == NULL)
+ RETURN_ERR_OCCURRED;
+ STORE_SIZE(len);
}
else
return converterr("str or None", arg, msgbuf, bufsize);
format++;
} else {
/* "s" or "Z" */
- Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
-
if (c == 'Z' && arg == Py_None)
*p = NULL;
else if (PyUnicode_Check(arg)) {
- *p = PyUnicode_AS_UNICODE(arg);
- if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg))
+ Py_ssize_t len;
+ *p = PyUnicode_AsUnicodeAndSize(arg, &len);
+ if (*p == NULL)
+ RETURN_ERR_OCCURRED;
+ if (Py_UNICODE_strlen(*p) != len)
return converterr(
- "str without null character or None",
+ "str without null characters or None",
arg, msgbuf, bufsize);
} else
return converterr(c == 'Z' ? "str or None" : "str",
@@ -1110,7 +1094,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
PyErr_NoMemory();
RETURN_ERR_OCCURRED;
}
- if (addcleanup(*buffer, freelist, 0)) {
+ if (addcleanup(*buffer, freelist, cleanup_ptr)) {
Py_DECREF(s);
return converterr(
"(cleanup problem)",
@@ -1152,7 +1136,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
PyErr_NoMemory();
RETURN_ERR_OCCURRED;
}
- if (addcleanup(*buffer, freelist, 0)) {
+ if (addcleanup(*buffer, freelist, cleanup_ptr)) {
Py_DECREF(s);
return converterr("(cleanup problem)",
arg, msgbuf, bufsize);
@@ -1183,8 +1167,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'U': { /* PyUnicode object */
PyObject **p = va_arg(*p_va, PyObject **);
- if (PyUnicode_Check(arg))
+ if (PyUnicode_Check(arg)) {
+ if (PyUnicode_READY(arg) == -1)
+ RETURN_ERR_OCCURRED;
*p = arg;
+ }
else
return converterr("str", arg, msgbuf, bufsize);
break;
@@ -1213,7 +1200,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
return converterr("(unspecified)",
arg, msgbuf, bufsize);
if (res == Py_CLEANUP_SUPPORTED &&
- addcleanup_convert(addr, freelist, convert) == -1)
+ addcleanup(addr, freelist, convert) == -1)
return converterr("(cleanup problem)",
arg, msgbuf, bufsize);
}
@@ -1244,7 +1231,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
PyBuffer_Release((Py_buffer*)p);
return converterr("contiguous buffer", arg, msgbuf, bufsize);
}
- if (addcleanup(p, freelist, 1)) {
+ if (addcleanup(p, freelist, cleanup_buffer)) {
return converterr(
"(cleanup problem)",
arg, msgbuf, bufsize);
@@ -1431,8 +1418,10 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
int levels[32];
const char *fname, *msg, *custom_msg, *keyword;
int min = INT_MAX;
+ int max = INT_MAX;
int i, len, nargs, nkeywords;
- PyObject *freelist = NULL, *current_arg;
+ PyObject *current_arg;
+ freelist_t freelist = {0, NULL};
assert(args != NULL && PyTuple_Check(args));
assert(keywords == NULL || PyDict_Check(keywords));
@@ -1456,31 +1445,68 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
for (len=0; kwlist[len]; len++)
continue;
+ freelist.entries = PyMem_NEW(freelistentry_t, len);
+ if (freelist.entries == NULL) {
+ PyErr_NoMemory();
+ return 0;
+ }
+
nargs = PyTuple_GET_SIZE(args);
nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);
if (nargs + nkeywords > len) {
- PyErr_Format(PyExc_TypeError, "%s%s takes at most %d "
- "argument%s (%d given)",
+ PyErr_Format(PyExc_TypeError,
+ "%s%s takes at most %d argument%s (%d given)",
(fname == NULL) ? "function" : fname,
(fname == NULL) ? "" : "()",
len,
(len == 1) ? "" : "s",
nargs + nkeywords);
- return 0;
+ return cleanreturn(0, &freelist);
}
/* convert tuple args and keyword args in same loop, using kwlist to drive process */
for (i = 0; i < len; i++) {
keyword = kwlist[i];
if (*format == '|') {
+ if (min != INT_MAX) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Invalid format string (| specified twice)");
+ return cleanreturn(0, &freelist);
+ }
+
min = i;
format++;
+
+ if (max != INT_MAX) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Invalid format string ($ before |)");
+ return cleanreturn(0, &freelist);
+ }
+ }
+ if (*format == '$') {
+ if (max != INT_MAX) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Invalid format string ($ specified twice)");
+ return cleanreturn(0, &freelist);
+ }
+
+ max = i;
+ format++;
+
+ if (max < nargs) {
+ PyErr_Format(PyExc_TypeError,
+ "Function takes %s %d positional arguments"
+ " (%d given)",
+ (min != INT_MAX) ? "at most" : "exactly",
+ max, nargs);
+ return cleanreturn(0, &freelist);
+ }
}
if (IS_END_OF_FORMAT(*format)) {
PyErr_Format(PyExc_RuntimeError,
"More keyword list entries (%d) than "
"format specifiers (%d)", len, i);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
current_arg = NULL;
if (nkeywords) {
@@ -1494,11 +1520,11 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
"Argument given by name ('%s') "
"and position (%d)",
keyword, i+1);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
}
else if (nkeywords && PyErr_Occurred())
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
else if (i < nargs)
current_arg = PyTuple_GET_ITEM(args, i);
@@ -1507,7 +1533,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
levels, msgbuf, sizeof(msgbuf), &freelist);
if (msg) {
seterror(i+1, msg, levels, fname, custom_msg);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
continue;
}
@@ -1516,14 +1542,14 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
PyErr_Format(PyExc_TypeError, "Required argument "
"'%s' (pos %d) not found",
keyword, i+1);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
/* current code reports success when all required args
* fulfilled and no keyword args left, with no further
* validation. XXX Maybe skip this in debug build ?
*/
if (!nkeywords)
- return cleanreturn(1, freelist);
+ return cleanreturn(1, &freelist);
/* We are into optional args, skip thru to any remaining
* keyword args */
@@ -1531,15 +1557,15 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
if (msg) {
PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg,
format);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
}
- if (!IS_END_OF_FORMAT(*format) && *format != '|') {
+ if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
PyErr_Format(PyExc_RuntimeError,
"more argument specifiers than keyword list entries "
"(remaining format:'%s')", format);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
/* make sure there are no extraneous keyword arguments */
@@ -1552,7 +1578,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
if (!PyUnicode_Check(key)) {
PyErr_SetString(PyExc_TypeError,
"keywords must be strings");
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
/* check that _PyUnicode_AsString() result is not NULL */
ks = _PyUnicode_AsString(key);
@@ -1569,12 +1595,12 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
"'%U' is an invalid keyword "
"argument for this function",
key);
- return cleanreturn(0, freelist);
+ return cleanreturn(0, &freelist);
}
}
}
- return cleanreturn(1, freelist);
+ return cleanreturn(1, &freelist);
}
@@ -1586,8 +1612,10 @@ skipitem(const char **p_format, va_list *p_va, int flags)
switch (c) {
- /* simple codes
- * The individual types (second arg of va_arg) are irrelevant */
+ /*
+ * codes that take a single data pointer as an argument
+ * (the type of the pointer is irrelevant)
+ */
case 'b': /* byte -- very short int */
case 'B': /* byte as bitfield */
@@ -1601,22 +1629,21 @@ skipitem(const char **p_format, va_list *p_va, int flags)
case 'L': /* PY_LONG_LONG */
case 'K': /* PY_LONG_LONG sized bitfield */
#endif
+ case 'n': /* Py_ssize_t */
case 'f': /* float */
case 'd': /* double */
case 'D': /* complex double */
case 'c': /* char */
case 'C': /* unicode char */
+ case 'p': /* boolean predicate */
+ case 'S': /* string object */
+ case 'Y': /* string object */
+ case 'U': /* unicode string object */
{
(void) va_arg(*p_va, void *);
break;
}
- case 'n': /* Py_ssize_t */
- {
- (void) va_arg(*p_va, Py_ssize_t *);
- break;
- }
-
/* string codes */
case 'e': /* string with encoding */
@@ -1649,16 +1676,6 @@ skipitem(const char **p_format, va_list *p_va, int flags)
break;
}
- /* object codes */
-
- case 'S': /* string object */
- case 'Y': /* string object */
- case 'U': /* unicode string object */
- {
- (void) va_arg(*p_va, PyObject **);
- break;
- }
-
case 'O': /* object */
{
if (*format == '!') {
diff --git a/Python/getcopyright.c b/Python/getcopyright.c
index d1e2578..d83c6da 100644
--- a/Python/getcopyright.c
+++ b/Python/getcopyright.c
@@ -19,5 +19,5 @@ All Rights Reserved.";
const char *
Py_GetCopyright(void)
{
- return cprt;
+ return cprt;
}
diff --git a/Python/graminit.c b/Python/graminit.c
index cabc4d6..e04999b 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -1791,7 +1791,7 @@ static arc arcs_80_0[1] = {
{167, 1},
};
static arc arcs_80_1[2] = {
- {9, 2},
+ {168, 2},
{0, 1},
};
static arc arcs_80_2[1] = {
@@ -1802,171 +1802,188 @@ static state states_80[3] = {
{2, arcs_80_1},
{1, arcs_80_2},
};
-static dfa dfas[81] = {
+static arc arcs_81_0[2] = {
+ {73, 1},
+ {9, 2},
+};
+static arc arcs_81_1[1] = {
+ {24, 2},
+};
+static arc arcs_81_2[1] = {
+ {0, 2},
+};
+static state states_81[3] = {
+ {2, arcs_81_0},
+ {1, arcs_81_1},
+ {1, arcs_81_2},
+};
+static dfa dfas[82] = {
{256, "single_input", 0, 3, states_0,
- "\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
+ "\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
{257, "file_input", 0, 2, states_1,
- "\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
+ "\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
{258, "eval_input", 0, 3, states_2,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{259, "decorator", 0, 7, states_3,
- "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{260, "decorators", 0, 2, states_4,
- "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{261, "decorated", 0, 3, states_5,
- "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{262, "funcdef", 0, 8, states_6,
- "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{263, "parameters", 0, 4, states_7,
- "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{264, "typedargslist", 0, 18, states_8,
- "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{265, "tfpdef", 0, 4, states_9,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{266, "varargslist", 0, 18, states_10,
- "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{267, "vfpdef", 0, 2, states_11,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{268, "stmt", 0, 2, states_12,
- "\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"},
+ "\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},
{269, "simple_stmt", 0, 4, states_13,
- "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
+ "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
{270, "small_stmt", 0, 2, states_14,
- "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
+ "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
{271, "expr_stmt", 0, 6, states_15,
- "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{272, "testlist_star_expr", 0, 3, states_16,
- "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{273, "augassign", 0, 2, states_17,
- "\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{274, "del_stmt", 0, 3, states_18,
- "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{275, "pass_stmt", 0, 2, states_19,
- "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{276, "flow_stmt", 0, 2, states_20,
- "\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200"},
+ "\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200\000"},
{277, "break_stmt", 0, 2, states_21,
- "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{278, "continue_stmt", 0, 2, states_22,
- "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{279, "return_stmt", 0, 3, states_23,
- "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{280, "yield_stmt", 0, 2, states_24,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},
{281, "raise_stmt", 0, 5, states_25,
- "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"},
{282, "import_stmt", 0, 2, states_26,
- "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000"},
{283, "import_name", 0, 3, states_27,
- "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000"},
{284, "import_from", 0, 8, states_28,
- "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"},
{285, "import_as_name", 0, 4, states_29,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{286, "dotted_as_name", 0, 4, states_30,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{287, "import_as_names", 0, 3, states_31,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{288, "dotted_as_names", 0, 2, states_32,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{289, "dotted_name", 0, 2, states_33,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{290, "global_stmt", 0, 3, states_34,
- "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"},
{291, "nonlocal_stmt", 0, 3, states_35,
- "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"},
{292, "assert_stmt", 0, 5, states_36,
- "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"},
{293, "compound_stmt", 0, 2, states_37,
- "\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004"},
+ "\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004\000"},
{294, "if_stmt", 0, 8, states_38,
- "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
{295, "while_stmt", 0, 8, states_39,
- "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"},
{296, "for_stmt", 0, 10, states_40,
- "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},
{297, "try_stmt", 0, 13, states_41,
- "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"},
{298, "with_stmt", 0, 5, states_42,
- "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"},
{299, "with_item", 0, 4, states_43,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{300, "except_clause", 0, 5, states_44,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
{301, "suite", 0, 5, states_45,
- "\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"},
+ "\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},
{302, "test", 0, 6, states_46,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{303, "test_nocond", 0, 2, states_47,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{304, "lambdef", 0, 5, states_48,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
{305, "lambdef_nocond", 0, 5, states_49,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
{306, "or_test", 0, 2, states_50,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
{307, "and_test", 0, 2, states_51,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
{308, "not_test", 0, 3, states_52,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},
{309, "comparison", 0, 2, states_53,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{310, "comp_op", 0, 4, states_54,
- "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000\000"},
{311, "star_expr", 0, 3, states_55,
- "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{312, "expr", 0, 2, states_56,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{313, "xor_expr", 0, 2, states_57,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{314, "and_expr", 0, 2, states_58,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{315, "shift_expr", 0, 2, states_59,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{316, "arith_expr", 0, 2, states_60,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{317, "term", 0, 2, states_61,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{318, "factor", 0, 3, states_62,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{319, "power", 0, 4, states_63,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},
{320, "atom", 0, 9, states_64,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},
{321, "testlist_comp", 0, 5, states_65,
- "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{322, "trailer", 0, 7, states_66,
- "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000"},
+ "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000\000"},
{323, "subscriptlist", 0, 3, states_67,
- "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{324, "subscript", 0, 5, states_68,
- "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{325, "sliceop", 0, 3, states_69,
- "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{326, "exprlist", 0, 3, states_70,
- "\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"},
+ "\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},
{327, "testlist", 0, 3, states_71,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{328, "dictorsetmaker", 0, 11, states_72,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{329, "classdef", 0, 8, states_73,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"},
{330, "arglist", 0, 8, states_74,
- "\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{331, "argument", 0, 4, states_75,
- "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"},
+ "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},
{332, "comp_iter", 0, 2, states_76,
- "\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000\000"},
{333, "comp_for", 0, 6, states_77,
- "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},
{334, "comp_if", 0, 4, states_78,
- "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"},
+ "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},
{335, "encoding_decl", 0, 2, states_79,
- "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+ "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
{336, "yield_expr", 0, 3, states_80,
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"},
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},
+ {337, "yield_arg", 0, 3, states_81,
+ "\000\040\040\000\000\000\000\000\000\202\000\000\000\200\020\000\000\206\120\076\000\000"},
};
-static label labels[168] = {
+static label labels[169] = {
{0, "EMPTY"},
{256, 0},
{4, 0},
@@ -2135,10 +2152,11 @@ static label labels[168] = {
{334, 0},
{335, 0},
{1, "yield"},
+ {337, 0},
};
grammar _PyParser_Grammar = {
- 81,
+ 82,
dfas,
- {168, labels},
+ {169, labels},
256
};
diff --git a/Python/import.c b/Python/import.c
index f655e51..2f71b97 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -8,6 +8,7 @@
#include "errcode.h"
#include "marshal.h"
#include "code.h"
+#include "frameobject.h"
#include "osdefs.h"
#include "importdl.h"
@@ -26,176 +27,38 @@ typedef unsigned short mode_t;
#endif
-/* Magic word to reject .pyc files generated by other Python versions.
- It should change for each incompatible change to the bytecode.
-
- The value of CR and LF is incorporated so if you ever read or write
- a .pyc file in text mode the magic number will be wrong; also, the
- Apple MPW compiler swaps their values, botching string constants.
-
- The magic numbers must be spaced apart at least 2 values, as the
- -U interpeter flag will cause MAGIC+1 being used. They have been
- odd numbers for some time now.
-
- There were a variety of old schemes for setting the magic number.
- The current working scheme is to increment the previous value by
- 10.
-
- Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
- number also includes a new "magic tag", i.e. a human readable string used
- to represent the magic number in __pycache__ directories. When you change
- the magic number, you must also set a new unique magic tag. Generally this
- can be named after the Python major version of the magic number bump, but
- it can really be anything, as long as it's different than anything else
- that's come before. The tags are included in the following table, starting
- with Python 3.2a0.
-
- Known values:
- Python 1.5: 20121
- Python 1.5.1: 20121
- Python 1.5.2: 20121
- Python 1.6: 50428
- Python 2.0: 50823
- Python 2.0.1: 50823
- Python 2.1: 60202
- Python 2.1.1: 60202
- Python 2.1.2: 60202
- Python 2.2: 60717
- Python 2.3a0: 62011
- Python 2.3a0: 62021
- Python 2.3a0: 62011 (!)
- Python 2.4a0: 62041
- Python 2.4a3: 62051
- Python 2.4b1: 62061
- Python 2.5a0: 62071
- Python 2.5a0: 62081 (ast-branch)
- Python 2.5a0: 62091 (with)
- Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
- Python 2.5b3: 62101 (fix wrong code: for x, in ...)
- Python 2.5b3: 62111 (fix wrong code: x += yield)
- Python 2.5c1: 62121 (fix wrong lnotab with for loops and
- storing constants that should have been removed)
- Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
- Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
- Python 2.6a1: 62161 (WITH_CLEANUP optimization)
- Python 3000: 3000
- 3010 (removed UNARY_CONVERT)
- 3020 (added BUILD_SET)
- 3030 (added keyword-only parameters)
- 3040 (added signature annotations)
- 3050 (print becomes a function)
- 3060 (PEP 3115 metaclass syntax)
- 3061 (string literals become unicode)
- 3071 (PEP 3109 raise changes)
- 3081 (PEP 3137 make __file__ and __name__ unicode)
- 3091 (kill str8 interning)
- 3101 (merge from 2.6a0, see 62151)
- 3103 (__file__ points to source file)
- Python 3.0a4: 3111 (WITH_CLEANUP optimization).
- Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
- Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
- change LIST_APPEND and SET_ADD, add MAP_ADD)
- Python 3.1a0: 3151 (optimize conditional branches:
- introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
- Python 3.2a0: 3160 (add SETUP_WITH)
- tag: cpython-32
- Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
- tag: cpython-32
- Python 3.2a2 3180 (add DELETE_DEREF)
-*/
-
-/* MAGIC must change whenever the bytecode emitted by the compiler may no
- longer be understood by older implementations of the eval loop (usually
- due to the addition of new opcodes)
- TAG must change for each major Python release. The magic number will take
- care of any bytecode changes that occur during development.
-*/
-#define MAGIC (3180 | ((long)'\r'<<16) | ((long)'\n'<<24))
-#define TAG "cpython-32"
#define CACHEDIR "__pycache__"
-/* Current magic word and string tag as globals. */
-static long pyc_magic = MAGIC;
-static const char *pyc_tag = TAG;
-/* See _PyImport_FixupExtensionUnicode() below */
+/* See _PyImport_FixupExtensionObject() below */
static PyObject *extensions = NULL;
+/* Function from Parser/tokenizer.c */
+extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
+
/* This table is defined in config.c: */
extern struct _inittab _PyImport_Inittab[];
-/* Method from Parser/tokenizer.c */
-extern char * PyTokenizer_FindEncoding(int);
-
struct _inittab *PyImport_Inittab = _PyImport_Inittab;
-/* these tables define the module suffixes that Python recognizes */
-struct filedescr * _PyImport_Filetab = NULL;
-
-static const struct filedescr _PyImport_StandardFiletab[] = {
- {".py", "U", PY_SOURCE},
-#ifdef MS_WINDOWS
- {".pyw", "U", PY_SOURCE},
-#endif
- {".pyc", "rb", PY_COMPILED},
- {0, 0}
-};
-
+static PyObject *initstr = NULL;
/* Initialize things */
void
_PyImport_Init(void)
{
- const struct filedescr *scan;
- struct filedescr *filetab;
- int countD = 0;
- int countS = 0;
-
- /* prepare _PyImport_Filetab: copy entries from
- _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
- */
-#ifdef HAVE_DYNAMIC_LOADING
- for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
- ++countD;
-#endif
- for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
- ++countS;
- filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
- if (filetab == NULL)
- Py_FatalError("Can't initialize import file table.");
-#ifdef HAVE_DYNAMIC_LOADING
- memcpy(filetab, _PyImport_DynLoadFiletab,
- countD * sizeof(struct filedescr));
-#endif
- memcpy(filetab + countD, _PyImport_StandardFiletab,
- countS * sizeof(struct filedescr));
- filetab[countD + countS].suffix = NULL;
-
- _PyImport_Filetab = filetab;
-
- if (Py_OptimizeFlag) {
- /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
- for (; filetab->suffix != NULL; filetab++) {
- if (strcmp(filetab->suffix, ".pyc") == 0)
- filetab->suffix = ".pyo";
- }
- }
+ initstr = PyUnicode_InternFromString("__init__");
+ if (initstr == NULL)
+ Py_FatalError("Can't initialize import variables");
}
void
_PyImportHooks_Init(void)
{
- PyObject *v, *path_hooks = NULL, *zimpimport;
+ PyObject *v, *path_hooks = NULL;
int err = 0;
- /* adding sys.path_hooks and sys.path_importer_cache, setting up
- zipimport */
- if (PyType_Ready(&PyNullImporter_Type) < 0)
- goto error;
-
- if (Py_VerboseFlag)
- PySys_WriteStderr("# installing zipimport hook\n");
-
+ /* adding sys.path_hooks and sys.path_importer_cache */
v = PyList_New(0);
if (v == NULL)
goto error;
@@ -216,11 +79,25 @@ _PyImportHooks_Init(void)
err = PySys_SetObject("path_hooks", path_hooks);
if (err) {
error:
- PyErr_Print();
- Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
- "path_importer_cache, or NullImporter failed"
- );
+ PyErr_Print();
+ Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
+ "or path_importer_cache failed");
}
+ Py_DECREF(path_hooks);
+}
+
+void
+_PyImportZip_Init(void)
+{
+ PyObject *path_hooks, *zimpimport;
+ int err = 0;
+
+ path_hooks = PySys_GetObject("path_hooks");
+ if (path_hooks == NULL)
+ goto error;
+
+ if (Py_VerboseFlag)
+ PySys_WriteStderr("# installing zipimport hook\n");
zimpimport = PyImport_ImportModule("zipimport");
if (zimpimport == NULL) {
@@ -229,8 +106,9 @@ _PyImportHooks_Init(void)
PySys_WriteStderr("# can't import zipimport\n");
}
else {
- PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
- "zipimporter");
+ _Py_IDENTIFIER(zipimporter);
+ PyObject *zipimporter = _PyObject_GetAttrId(zimpimport,
+ &PyId_zipimporter);
Py_DECREF(zimpimport);
if (zipimporter == NULL) {
PyErr_Clear(); /* No zipimporter object -- okay */
@@ -239,17 +117,23 @@ _PyImportHooks_Init(void)
"# can't import zipimport.zipimporter\n");
}
else {
- /* sys.path_hooks.append(zipimporter) */
- err = PyList_Append(path_hooks, zipimporter);
+ /* sys.path_hooks.insert(0, zipimporter) */
+ err = PyList_Insert(path_hooks, 0, zipimporter);
Py_DECREF(zipimporter);
- if (err)
+ if (err < 0) {
goto error;
+ }
if (Py_VerboseFlag)
PySys_WriteStderr(
"# installed zipimport hook\n");
}
}
- Py_DECREF(path_hooks);
+
+ return;
+
+ error:
+ PyErr_Print();
+ Py_FatalError("initializing zipimport failed");
}
/* Locking primitives to prevent parallel imports of the same module
@@ -319,7 +203,7 @@ _PyImport_ReInitLock(void)
/* Forked as a side effect of import */
long me = PyThread_get_thread_ident();
PyThread_acquire_lock(import_lock, 0);
- /* XXX: can the previous line fail? */
+ /* XXX: can the previous line fail? */
import_lock_thread = me;
import_lock_level--;
} else {
@@ -369,8 +253,6 @@ _PyImport_Fini(void)
{
Py_XDECREF(extensions);
extensions = NULL;
- PyMem_DEL(_PyImport_Filetab);
- _PyImport_Filetab = NULL;
#ifdef WITH_THREAD
if (import_lock != NULL) {
PyThread_free_lock(import_lock);
@@ -379,14 +261,6 @@ _PyImport_Fini(void)
#endif
}
-static void
-imp_modules_reloading_clear(void)
-{
- PyInterpreterState *interp = PyThreadState_Get()->interp;
- if (interp->modules_reloading != NULL)
- PyDict_Clear(interp->modules_reloading);
-}
-
/* Helper for sys */
PyObject *
@@ -423,7 +297,6 @@ void
PyImport_Cleanup(void)
{
Py_ssize_t pos, ndone;
- char *name;
PyObject *key, *value, *dict;
PyInterpreterState *interp = PyThreadState_GET()->interp;
PyObject *modules = interp->modules;
@@ -496,14 +369,13 @@ PyImport_Cleanup(void)
if (value->ob_refcnt != 1)
continue;
if (PyUnicode_Check(key) && PyModule_Check(value)) {
- name = _PyUnicode_AsString(key);
- if (strcmp(name, "builtins") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
continue;
- if (strcmp(name, "sys") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
continue;
if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# cleanup[1] %s\n", name);
+ PySys_FormatStderr(
+ "# cleanup[1] %U\n", key);
_PyModule_Clear(value);
PyDict_SetItem(modules, key, Py_None);
ndone++;
@@ -515,13 +387,12 @@ PyImport_Cleanup(void)
pos = 0;
while (PyDict_Next(modules, &pos, &key, &value)) {
if (PyUnicode_Check(key) && PyModule_Check(value)) {
- name = _PyUnicode_AsString(key);
- if (strcmp(name, "builtins") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
continue;
- if (strcmp(name, "sys") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
continue;
if (Py_VerboseFlag)
- PySys_WriteStderr("# cleanup[2] %s\n", name);
+ PySys_FormatStderr("# cleanup[2] %U\n", key);
_PyModule_Clear(value);
PyDict_SetItem(modules, key, Py_None);
}
@@ -547,7 +418,6 @@ PyImport_Cleanup(void)
PyDict_Clear(modules);
interp->modules = NULL;
Py_DECREF(modules);
- Py_CLEAR(interp->modules_reloading);
}
@@ -556,25 +426,36 @@ PyImport_Cleanup(void)
long
PyImport_GetMagicNumber(void)
{
- return pyc_magic;
+ long res;
+ PyInterpreterState *interp = PyThreadState_Get()->interp;
+ PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib,
+ "_RAW_MAGIC_NUMBER");
+ if (pyc_magic == NULL)
+ return -1;
+ res = PyLong_AsLong(pyc_magic);
+ Py_DECREF(pyc_magic);
+ return res;
}
+extern const char * _PySys_ImplCacheTag;
+
const char *
PyImport_GetMagicTag(void)
{
- return pyc_tag;
+ return _PySys_ImplCacheTag;
}
+
/* Magic for extension modules (built-in as well as dynamically
loaded). To prevent initializing an extension module more than
once, we keep a static dictionary 'extensions' keyed by module name
(for built-in modules) or by filename (for dynamically loaded
modules), containing these modules. A copy of the module's
- dictionary is stored by calling _PyImport_FixupExtensionUnicode()
+ dictionary is stored by calling _PyImport_FixupExtensionObject()
immediately after the module initialization function succeeds. A
copy can be retrieved from there by calling
- _PyImport_FindExtensionUnicode().
+ _PyImport_FindExtensionObject().
Modules which do support multiple initialization set their m_size
field to a non-negative number (indicating the size of the
@@ -583,7 +464,8 @@ PyImport_GetMagicTag(void)
*/
int
-_PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)
+_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
+ PyObject *filename)
{
PyObject *modules, *dict;
struct PyModuleDef *def;
@@ -602,10 +484,10 @@ _PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)
return -1;
}
modules = PyImport_GetModuleDict();
- if (PyDict_SetItemString(modules, name, mod) < 0)
+ if (PyDict_SetItem(modules, name, mod) < 0)
return -1;
if (_PyState_AddModule(mod, def) < 0) {
- PyDict_DelItemString(modules, name);
+ PyDict_DelItem(modules, name);
return -1;
}
if (def->m_size == -1) {
@@ -631,17 +513,17 @@ int
_PyImport_FixupBuiltin(PyObject *mod, char *name)
{
int res;
- PyObject *filename;
- filename = PyUnicode_FromString(name);
- if (filename == NULL)
+ PyObject *nameobj;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
return -1;
- res = _PyImport_FixupExtensionUnicode(mod, name, filename);
- Py_DECREF(filename);
+ res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
+ Py_DECREF(nameobj);
return res;
}
PyObject *
-_PyImport_FindExtensionUnicode(char *name, PyObject *filename)
+_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
{
PyObject *mod, *mdict;
PyModuleDef* def;
@@ -654,7 +536,7 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)
/* Module does not support repeated initialization */
if (def->m_base.m_copy == NULL)
return NULL;
- mod = PyImport_AddModule(name);
+ mod = PyImport_AddModuleObject(name);
if (mod == NULL)
return NULL;
mdict = PyModule_GetDict(mod);
@@ -669,30 +551,30 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)
mod = def->m_base.m_init();
if (mod == NULL)
return NULL;
- PyDict_SetItemString(PyImport_GetModuleDict(), name, mod);
+ PyDict_SetItem(PyImport_GetModuleDict(), name, mod);
Py_DECREF(mod);
}
if (_PyState_AddModule(mod, def) < 0) {
- PyDict_DelItemString(PyImport_GetModuleDict(), name);
+ PyDict_DelItem(PyImport_GetModuleDict(), name);
Py_DECREF(mod);
return NULL;
}
if (Py_VerboseFlag)
- PySys_FormatStderr("import %s # previously loaded (%U)\n",
+ PySys_FormatStderr("import %U # previously loaded (%R)\n",
name, filename);
return mod;
}
PyObject *
-_PyImport_FindBuiltin(char *name)
+_PyImport_FindBuiltin(const char *name)
{
- PyObject *res, *filename;
- filename = PyUnicode_FromString(name);
- if (filename == NULL)
+ PyObject *res, *nameobj;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
return NULL;
- res = _PyImport_FindExtensionUnicode(name, filename);
- Py_DECREF(filename);
+ res = _PyImport_FindExtensionObject(nameobj, nameobj);
+ Py_DECREF(nameobj);
return res;
}
@@ -703,18 +585,18 @@ _PyImport_FindBuiltin(char *name)
'NEW' REFERENCE! */
PyObject *
-PyImport_AddModule(const char *name)
+PyImport_AddModuleObject(PyObject *name)
{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m;
- if ((m = PyDict_GetItemString(modules, name)) != NULL &&
+ if ((m = PyDict_GetItem(modules, name)) != NULL &&
PyModule_Check(m))
return m;
- m = PyModule_New(name);
+ m = PyModule_NewObject(name);
if (m == NULL)
return NULL;
- if (PyDict_SetItemString(modules, name, m) != 0) {
+ if (PyDict_SetItem(modules, name, m) != 0) {
Py_DECREF(m);
return NULL;
}
@@ -723,22 +605,31 @@ PyImport_AddModule(const char *name)
return m;
}
+PyObject *
+PyImport_AddModule(const char *name)
+{
+ PyObject *nameobj, *module;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ module = PyImport_AddModuleObject(nameobj);
+ Py_DECREF(nameobj);
+ return module;
+}
+
+
/* Remove name from sys.modules, if it's there. */
static void
-remove_module(const char *name)
+remove_module(PyObject *name)
{
PyObject *modules = PyImport_GetModuleDict();
- if (PyDict_GetItemString(modules, name) == NULL)
+ if (PyDict_GetItem(modules, name) == NULL)
return;
- if (PyDict_DelItemString(modules, name) < 0)
+ if (PyDict_DelItem(modules, name) < 0)
Py_FatalError("import: deleting existing key in"
"sys.modules failed");
}
-static PyObject * get_sourcefile(char *file);
-static char *make_source_pathname(char *pathname, char *buf);
-static char *make_compiled_pathname(char *pathname, char *buf, size_t buflen,
- int debug);
/* Execute a code object in a module and return the module object
* WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
@@ -768,10 +659,60 @@ PyObject *
PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
char *cpathname)
{
+ PyObject *m = NULL;
+ PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL;
+
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+
+ if (cpathname != NULL) {
+ cpathobj = PyUnicode_DecodeFSDefault(cpathname);
+ if (cpathobj == NULL)
+ goto error;
+ }
+ else
+ cpathobj = NULL;
+
+ if (pathname != NULL) {
+ pathobj = PyUnicode_DecodeFSDefault(pathname);
+ if (pathobj == NULL)
+ goto error;
+ }
+ else if (cpathobj != NULL) {
+ PyInterpreterState *interp = PyThreadState_GET()->interp;
+ _Py_IDENTIFIER(_get_sourcefile);
+
+ if (interp == NULL) {
+ Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
+ "no interpreter!");
+ }
+
+ pathobj = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__get_sourcefile, cpathobj,
+ NULL);
+ if (pathobj == NULL)
+ PyErr_Clear();
+ }
+ else
+ pathobj = NULL;
+
+ m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
+error:
+ Py_DECREF(nameobj);
+ Py_XDECREF(pathobj);
+ Py_XDECREF(cpathobj);
+ return m;
+}
+
+PyObject*
+PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
+ PyObject *cpathname)
+{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m, *d, *v;
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
if (m == NULL)
return NULL;
/* If the module is being reloaded, we get the old module back
@@ -782,43 +723,33 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
PyEval_GetBuiltins()) != 0)
goto error;
}
- /* Remember the filename as the __file__ attribute */
- v = NULL;
if (pathname != NULL) {
- v = get_sourcefile(pathname);
- if (v == NULL)
- PyErr_Clear();
+ v = pathname;
}
- if (v == NULL) {
+ else {
v = ((PyCodeObject *)co)->co_filename;
- Py_INCREF(v);
}
+ Py_INCREF(v);
if (PyDict_SetItemString(d, "__file__", v) != 0)
PyErr_Clear(); /* Not important enough to report */
Py_DECREF(v);
/* Remember the pyc path name as the __cached__ attribute. */
- if (cpathname == NULL) {
- v = Py_None;
- Py_INCREF(v);
- }
- else if ((v = PyUnicode_FromString(cpathname)) == NULL) {
- PyErr_Clear(); /* Not important enough to report */
+ if (cpathname != NULL)
+ v = cpathname;
+ else
v = Py_None;
- Py_INCREF(v);
- }
if (PyDict_SetItemString(d, "__cached__", v) != 0)
PyErr_Clear(); /* Not important enough to report */
- Py_DECREF(v);
v = PyEval_EvalCode(co, d, d);
if (v == NULL)
goto error;
Py_DECREF(v);
- if ((m = PyDict_GetItemString(modules, name)) == NULL) {
+ if ((m = PyDict_GetItem(modules, name)) == NULL) {
PyErr_Format(PyExc_ImportError,
- "Loaded module %.200s not found in sys.modules",
+ "Loaded module %R not found in sys.modules",
name);
return NULL;
}
@@ -833,415 +764,6 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
}
-/* Like strrchr(string, '/') but searches for the rightmost of either SEP
- or ALTSEP, if the latter is defined.
-*/
-static char *
-rightmost_sep(char *s)
-{
- char *found, c;
- for (found = NULL; (c = *s); s++) {
- if (c == SEP
-#ifdef ALTSEP
- || c == ALTSEP
-#endif
- )
- {
- found = s;
- }
- }
- return found;
-}
-
-
-/* Given a pathname for a Python source file, fill a buffer with the
- pathname for the corresponding compiled file. Return the pathname
- for the compiled file, or NULL if there's no space in the buffer.
- Doesn't set an exception. */
-
-static char *
-make_compiled_pathname(char *pathname, char *buf, size_t buflen, int debug)
-{
- /* foo.py -> __pycache__/foo.<tag>.pyc */
- size_t len = strlen(pathname);
- size_t i, save;
- char *pos;
- int sep = SEP;
-
- /* Sanity check that the buffer has roughly enough space to hold what
- will eventually be the full path to the compiled file. The 5 extra
- bytes include the slash afer __pycache__, the two extra dots, the
- extra trailing character ('c' or 'o') and null. This isn't exact
- because the contents of the buffer can affect how many actual
- characters of the string get into the buffer. We'll do a final
- sanity check before writing the extension to ensure we do not
- overflow the buffer.
- */
- if (len + strlen(CACHEDIR) + strlen(pyc_tag) + 5 > buflen)
- return NULL;
-
- /* Find the last path separator and copy everything from the start of
- the source string up to and including the separator.
- */
- if ((pos = rightmost_sep(pathname)) == NULL) {
- i = 0;
- }
- else {
- sep = *pos;
- i = pos - pathname + 1;
- strncpy(buf, pathname, i);
- }
-
- save = i;
- buf[i++] = '\0';
- /* Add __pycache__/ */
- strcat(buf, CACHEDIR);
- i += strlen(CACHEDIR) - 1;
- buf[i++] = sep;
- buf[i++] = '\0';
- /* Add the base filename, but remove the .py or .pyw extension, since
- the tag name must go before the extension.
- */
- strcat(buf, pathname + save);
- if ((pos = strrchr(buf, '.')) != NULL)
- *++pos = '\0';
- strcat(buf, pyc_tag);
- /* The length test above assumes that we're only adding one character
- to the end of what would normally be the extension. What if there
- is no extension, or the string ends in '.' or '.p', and otherwise
- fills the buffer? By appending 4 more characters onto the string
- here, we could overrun the buffer.
-
- As a simple example, let's say buflen=32 and the input string is
- 'xxx.py'. strlen() would be 6 and the test above would yield:
-
- (6 + 11 + 10 + 5 == 32) > 32
-
- which is false and so the name mangling would continue. This would
- be fine because we'd end up with this string in buf:
-
- __pycache__/xxx.cpython-32.pyc\0
-
- strlen(of that) == 30 + the nul fits inside a 32 character buffer.
- We can even handle an input string of say 'xxxxx' above because
- that's (5 + 11 + 10 + 5 == 31) > 32 which is also false. Name
- mangling that yields:
-
- __pycache__/xxxxxcpython-32.pyc\0
-
- which is 32 characters including the nul, and thus fits in the
- buffer. However, an input string of 'xxxxxx' would yield a result
- string of:
-
- __pycache__/xxxxxxcpython-32.pyc\0
-
- which is 33 characters long (including the nul), thus overflowing
- the buffer, even though the first test would fail, i.e.: the input
- string is also 6 characters long, so 32 > 32 is false.
-
- The reason the first test fails but we still overflow the buffer is
- that the test above only expects to add one extra character to be
- added to the extension, and here we're adding three (pyc). We
- don't add the first dot, so that reclaims one of expected
- positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed
- dot - 1 expected extra == 1 overflowed).
-
- The best we can do is ensure that we still have enough room in the
- target buffer before we write the extension. Because it's always
- only the extension that can cause the overflow, and never the other
- path bytes we've written, it's sufficient to just do one more test
- here. Still, the assertion that follows can't hurt.
- */
-#if 0
- printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen);
-#endif
- if (strlen(buf) + 5 > buflen)
- return NULL;
- strcat(buf, debug ? ".pyc" : ".pyo");
- assert(strlen(buf) < buflen);
- return buf;
-}
-
-
-/* Given a pathname to a Python byte compiled file, return the path to the
- source file, if the path matches the PEP 3147 format. This does not check
- for any file existence, however, if the pyc file name does not match PEP
- 3147 style, NULL is returned. buf must be at least as big as pathname;
- the resulting path will always be shorter. */
-
-static char *
-make_source_pathname(char *pathname, char *buf)
-{
- /* __pycache__/foo.<tag>.pyc -> foo.py */
- size_t i, j;
- char *left, *right, *dot0, *dot1, sep;
-
- /* Look back two slashes from the end. In between these two slashes
- must be the string __pycache__ or this is not a PEP 3147 style
- path. It's possible for there to be only one slash.
- */
- if ((right = rightmost_sep(pathname)) == NULL)
- return NULL;
- sep = *right;
- *right = '\0';
- left = rightmost_sep(pathname);
- *right = sep;
- if (left == NULL)
- left = pathname;
- else
- left++;
- if (right-left != strlen(CACHEDIR) ||
- strncmp(left, CACHEDIR, right-left) != 0)
- return NULL;
-
- /* Now verify that the path component to the right of the last slash
- has two dots in it.
- */
- if ((dot0 = strchr(right + 1, '.')) == NULL)
- return NULL;
- if ((dot1 = strchr(dot0 + 1, '.')) == NULL)
- return NULL;
- /* Too many dots? */
- if (strchr(dot1 + 1, '.') != NULL)
- return NULL;
-
- /* This is a PEP 3147 path. Start by copying everything from the
- start of pathname up to and including the leftmost slash. Then
- copy the file's basename, removing the magic tag and adding a .py
- suffix.
- */
- strncpy(buf, pathname, (i=left-pathname));
- strncpy(buf+i, right+1, (j=dot0-right));
- strcpy(buf+i+j, "py");
- return buf;
-}
-
-/* Given a pathname for a Python source file, its time of last
- modification, and a pathname for a compiled file, check whether the
- compiled file represents the same version of the source. If so,
- return a FILE pointer for the compiled file, positioned just after
- the header; if not, return NULL.
- Doesn't set an exception. */
-
-static FILE *
-check_compiled_module(char *pathname, time_t mtime, char *cpathname)
-{
- FILE *fp;
- long magic;
- long pyc_mtime;
-
- fp = fopen(cpathname, "rb");
- if (fp == NULL)
- return NULL;
- magic = PyMarshal_ReadLongFromFile(fp);
- if (magic != pyc_magic) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad magic\n", cpathname);
- fclose(fp);
- return NULL;
- }
- pyc_mtime = PyMarshal_ReadLongFromFile(fp);
- if (pyc_mtime != mtime) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad mtime\n", cpathname);
- fclose(fp);
- return NULL;
- }
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
- return fp;
-}
-
-
-/* Read a code object from a file and check it for validity */
-
-static PyCodeObject *
-read_compiled_module(char *cpathname, FILE *fp)
-{
- PyObject *co;
-
- co = PyMarshal_ReadLastObjectFromFile(fp);
- if (co == NULL)
- return NULL;
- if (!PyCode_Check(co)) {
- PyErr_Format(PyExc_ImportError,
- "Non-code object in %.200s", cpathname);
- Py_DECREF(co);
- return NULL;
- }
- return (PyCodeObject *)co;
-}
-
-
-/* Load a module from a compiled file, execute it, and return its
- module object WITH INCREMENTED REFERENCE COUNT */
-
-static PyObject *
-load_compiled_module(char *name, char *cpathname, FILE *fp)
-{
- long magic;
- PyCodeObject *co;
- PyObject *m;
-
- magic = PyMarshal_ReadLongFromFile(fp);
- if (magic != pyc_magic) {
- PyErr_Format(PyExc_ImportError,
- "Bad magic number in %.200s", cpathname);
- return NULL;
- }
- (void) PyMarshal_ReadLongFromFile(fp);
- co = read_compiled_module(cpathname, fp);
- if (co == NULL)
- return NULL;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # precompiled from %s\n",
- name, cpathname);
- m = PyImport_ExecCodeModuleWithPathnames(
- name, (PyObject *)co, cpathname, cpathname);
- Py_DECREF(co);
-
- return m;
-}
-
-/* Parse a source file and return the corresponding code object */
-
-static PyCodeObject *
-parse_source_module(const char *pathname, FILE *fp)
-{
- PyCodeObject *co = NULL;
- mod_ty mod;
- PyCompilerFlags flags;
- PyArena *arena = PyArena_New();
- if (arena == NULL)
- return NULL;
-
- flags.cf_flags = 0;
- mod = PyParser_ASTFromFile(fp, pathname, NULL,
- Py_file_input, 0, 0, &flags,
- NULL, arena);
- if (mod) {
- co = PyAST_Compile(mod, pathname, NULL, arena);
- }
- PyArena_Free(arena);
- return co;
-}
-
-
-/* Helper to open a bytecode file for writing in exclusive mode */
-
-static FILE *
-open_exclusive(char *filename, mode_t mode)
-{
-#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
- /* Use O_EXCL to avoid a race condition when another process tries to
- write the same file. When that happens, our open() call fails,
- which is just fine (since it's only a cache).
- XXX If the file exists and is writable but the directory is not
- writable, the file will never be written. Oh well.
- */
- int fd;
- (void) unlink(filename);
- fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
-#ifdef O_BINARY
- |O_BINARY /* necessary for Windows */
-#endif
-#ifdef __VMS
- , mode, "ctxt=bin", "shr=nil"
-#else
- , mode
-#endif
- );
- if (fd < 0)
- return NULL;
- return fdopen(fd, "wb");
-#else
- /* Best we can do -- on Windows this can't happen anyway */
- return fopen(filename, "wb");
-#endif
-}
-
-
-/* Write a compiled module to a file, placing the time of last
- modification of its source into the header.
- Errors are ignored, if a write error occurs an attempt is made to
- remove the file. */
-
-static void
-write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
-{
- FILE *fp;
- char *dirpath;
- time_t mtime = srcstat->st_mtime;
- int saved;
-#ifdef MS_WINDOWS /* since Windows uses different permissions */
- mode_t mode = srcstat->st_mode & ~S_IEXEC;
- /* Issue #6074: We ensure user write access, so we can delete it later
- * when the source file changes. (On POSIX, this only requires write
- * access to the directory, on Windows, we need write access to the file
- * as well)
- */
- mode |= _S_IWRITE;
-#else
- mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
- mode_t dirmode = (srcstat->st_mode |
- S_IXUSR | S_IXGRP | S_IXOTH |
- S_IWUSR | S_IWGRP | S_IWOTH);
-#endif
-
- /* Ensure that the __pycache__ directory exists. */
- dirpath = rightmost_sep(cpathname);
- if (dirpath == NULL) {
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# no %s path found %s\n",
- CACHEDIR, cpathname);
- return;
- }
- saved = *dirpath;
- *dirpath = '\0';
-
-#ifdef MS_WINDOWS
- if (_mkdir(cpathname) < 0 && errno != EEXIST) {
-#else
- if (mkdir(cpathname, dirmode) < 0 && errno != EEXIST) {
-#endif
- *dirpath = saved;
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# cannot create cache dir %s\n", cpathname);
- return;
- }
- *dirpath = saved;
-
- fp = open_exclusive(cpathname, mode);
- if (fp == NULL) {
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# can't create %s\n", cpathname);
- return;
- }
- PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
- /* First write a 0 for mtime */
- PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
- PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
- if (fflush(fp) != 0 || ferror(fp)) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# can't write %s\n", cpathname);
- /* Don't keep partial file */
- fclose(fp);
- (void) unlink(cpathname);
- return;
- }
- /* Now write the true mtime (as a 32-bit field) */
- fseek(fp, 4L, 0);
- assert(mtime <= 0xFFFFFFFF);
- PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
- fflush(fp);
- fclose(fp);
- if (Py_VerboseFlag)
- PySys_WriteStderr("# wrote %s\n", cpathname);
-}
-
static void
update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
{
@@ -1266,227 +788,60 @@ update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
}
}
-static int
-update_compiled_module(PyCodeObject *co, char *pathname)
+static void
+update_compiled_module(PyCodeObject *co, PyObject *newname)
{
- PyObject *oldname, *newname;
+ PyObject *oldname;
- newname = PyUnicode_DecodeFSDefault(pathname);
- if (newname == NULL)
- return -1;
-
- if (!PyUnicode_Compare(co->co_filename, newname)) {
- Py_DECREF(newname);
- return 0;
- }
+ if (PyUnicode_Compare(co->co_filename, newname) == 0)
+ return;
oldname = co->co_filename;
Py_INCREF(oldname);
update_code_filenames(co, oldname, newname);
Py_DECREF(oldname);
- Py_DECREF(newname);
- return 1;
}
-/* Load a source module from a given file and return its module
- object WITH INCREMENTED REFERENCE COUNT. If there's a matching
- byte-compiled file, use that instead. */
-
static PyObject *
-load_source_module(char *name, char *pathname, FILE *fp)
+imp_fix_co_filename(PyObject *self, PyObject *args)
{
- struct stat st;
- FILE *fpc;
- char *buf;
- char *cpathname;
- PyCodeObject *co = NULL;
- PyObject *m;
+ PyObject *co;
+ PyObject *file_path;
- if (fstat(fileno(fp), &st) != 0) {
- PyErr_Format(PyExc_RuntimeError,
- "unable to get file status from '%s'",
- pathname);
+ if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path))
return NULL;
- }
- if (sizeof st.st_mtime > 4) {
- /* Python's .pyc timestamp handling presumes that the timestamp fits
- in 4 bytes. Since the code only does an equality comparison,
- ordering is not important and we can safely ignore the higher bits
- (collisions are extremely unlikely).
- */
- st.st_mtime &= 0xFFFFFFFF;
- }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- cpathname = make_compiled_pathname(
- pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag);
- if (cpathname != NULL &&
- (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
- co = read_compiled_module(cpathname, fpc);
- fclose(fpc);
- if (co == NULL)
- goto error_exit;
- if (update_compiled_module(co, pathname) < 0)
- goto error_exit;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # precompiled from %s\n",
- name, cpathname);
- pathname = cpathname;
- }
- else {
- co = parse_source_module(pathname, fp);
- if (co == NULL)
- goto error_exit;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # from %s\n",
- name, pathname);
- if (cpathname) {
- PyObject *ro = PySys_GetObject("dont_write_bytecode");
- int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro);
- if (b < 0)
- goto error_exit;
- if (!b)
- write_compiled_module(co, cpathname, &st);
- }
- }
- m = PyImport_ExecCodeModuleWithPathnames(
- name, (PyObject *)co, pathname, cpathname);
- Py_DECREF(co);
- PyMem_FREE(buf);
- return m;
-
-error_exit:
- Py_XDECREF(co);
- PyMem_FREE(buf);
- return NULL;
-}
-
-/* Get source file -> unicode or None
- * Returns the path to the py file if available, else the given path
- */
-static PyObject *
-get_sourcefile(char *file)
-{
- char *py = NULL;
- Py_ssize_t len;
- PyObject *u;
- struct stat statbuf;
-
- if (!file || !*file) {
- Py_RETURN_NONE;
+ if (!PyCode_Check(co)) {
+ PyErr_SetString(PyExc_TypeError,
+ "first argument must be a code object");
+ return NULL;
}
- len = strlen(file);
- /* match '*.py?' */
- if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
- return PyUnicode_DecodeFSDefault(file);
+ if (!PyUnicode_Check(file_path)) {
+ PyErr_SetString(PyExc_TypeError,
+ "second argument must be a string");
+ return NULL;
}
- py = PyMem_MALLOC(MAXPATHLEN+1);
- if (py == NULL) {
- return PyErr_NoMemory();
- }
- /* Start by trying to turn PEP 3147 path into source path. If that
- * fails, just chop off the trailing character, i.e. legacy pyc path
- * to py.
- */
- if (make_source_pathname(file, py) == NULL) {
- strncpy(py, file, len-1);
- py[len-1] = '\0';
- }
+ update_compiled_module((PyCodeObject*)co, file_path);
- if (stat(py, &statbuf) == 0 &&
- S_ISREG(statbuf.st_mode)) {
- u = PyUnicode_DecodeFSDefault(py);
- }
- else {
- u = PyUnicode_DecodeFSDefault(file);
- }
- PyMem_FREE(py);
- return u;
+ Py_RETURN_NONE;
}
-/* Forward */
-static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
-static struct filedescr *find_module(char *, char *, PyObject *,
- char *, size_t, FILE **, PyObject **);
-static struct _frozen * find_frozen(char *);
-
-/* Load a package and return its module object WITH INCREMENTED
- REFERENCE COUNT */
-
-static PyObject *
-load_package(char *name, char *pathname)
-{
- PyObject *m, *d;
- PyObject *file = NULL;
- PyObject *path = NULL;
- int err;
- char *buf = NULL;
- FILE *fp = NULL;
- struct filedescr *fdp;
-
- m = PyImport_AddModule(name);
- if (m == NULL)
- return NULL;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # directory %s\n",
- name, pathname);
- d = PyModule_GetDict(m);
- file = get_sourcefile(pathname);
- if (file == NULL)
- goto error;
- path = Py_BuildValue("[O]", file);
- if (path == NULL)
- goto error;
- err = PyDict_SetItemString(d, "__file__", file);
- if (err == 0)
- err = PyDict_SetItemString(d, "__path__", path);
- if (err != 0)
- goto error;
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- PyErr_NoMemory();
- goto error;
- }
- buf[0] = '\0';
- fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL);
- if (fdp == NULL) {
- if (PyErr_ExceptionMatches(PyExc_ImportError)) {
- PyErr_Clear();
- Py_INCREF(m);
- }
- else
- m = NULL;
- goto cleanup;
- }
- m = load_module(name, fp, buf, fdp->type, NULL);
- if (fp != NULL)
- fclose(fp);
- goto cleanup;
- error:
- m = NULL;
- cleanup:
- if (buf)
- PyMem_FREE(buf);
- Py_XDECREF(path);
- Py_XDECREF(file);
- return m;
-}
+/* Forward */
+static struct _frozen * find_frozen(PyObject *);
/* Helper to test for built-in module */
static int
-is_builtin(char *name)
+is_builtin(PyObject *name)
{
- int i;
+ int i, cmp;
for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
- if (strcmp(name, PyImport_Inittab[i].name) == 0) {
+ cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name);
+ if (cmp == 0) {
if (PyImport_Inittab[i].initfunc == NULL)
return -1;
else
@@ -1542,15 +897,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
PyErr_Clear();
}
if (importer == NULL) {
- importer = PyObject_CallFunctionObjArgs(
- (PyObject *)&PyNullImporter_Type, p, NULL
- );
- if (importer == NULL) {
- if (PyErr_ExceptionMatches(PyExc_ImportError)) {
- PyErr_Clear();
- return Py_None;
- }
- }
+ return Py_None;
}
if (importer != NULL) {
int err = PyDict_SetItem(path_importer_cache, p, importer);
@@ -1575,661 +922,38 @@ PyImport_GetImporter(PyObject *path) {
return importer;
}
-/* Search the path (default sys.path) for a module. Return the
- corresponding filedescr struct, and (via return arguments) the
- pathname and an open file. Return NULL if the module is not found. */
-
-#ifdef MS_COREDLL
-extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
- char *, Py_ssize_t);
-#endif
-
-static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
-static int find_init_module(char *); /* Forward */
-static struct filedescr importhookdescr = {"", "", IMP_HOOK};
-
-static struct filedescr *
-find_module(char *fullname, char *subname, PyObject *path, char *buf,
- size_t buflen, FILE **p_fp, PyObject **p_loader)
-{
- Py_ssize_t i, npath;
- size_t len, namelen;
- struct filedescr *fdp = NULL;
- char *filemode;
- FILE *fp = NULL;
- PyObject *path_hooks, *path_importer_cache;
- struct stat statbuf;
- static struct filedescr fd_frozen = {"", "", PY_FROZEN};
- static struct filedescr fd_builtin = {"", "", C_BUILTIN};
- static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
- char *name;
-#if defined(PYOS_OS2)
- size_t saved_len;
- size_t saved_namelen;
- char *saved_buf = NULL;
-#endif
- if (p_loader != NULL)
- *p_loader = NULL;
-
- if (strlen(subname) > MAXPATHLEN) {
- PyErr_SetString(PyExc_OverflowError,
- "module name is too long");
- return NULL;
- }
- name = PyMem_MALLOC(MAXPATHLEN+1);
- if (name == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- strcpy(name, subname);
-
- /* sys.meta_path import hook */
- if (p_loader != NULL) {
- PyObject *meta_path;
-
- meta_path = PySys_GetObject("meta_path");
- if (meta_path == NULL || !PyList_Check(meta_path)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.meta_path must be a list of "
- "import hooks");
- goto error_exit;
- }
- Py_INCREF(meta_path); /* zap guard */
- npath = PyList_Size(meta_path);
- for (i = 0; i < npath; i++) {
- PyObject *loader;
- PyObject *hook = PyList_GetItem(meta_path, i);
- loader = PyObject_CallMethod(hook, "find_module",
- "sO", fullname,
- path != NULL ?
- path : Py_None);
- if (loader == NULL) {
- Py_DECREF(meta_path);
- goto error_exit; /* true error */
- }
- if (loader != Py_None) {
- /* a loader was found */
- *p_loader = loader;
- Py_DECREF(meta_path);
- PyMem_FREE(name);
- return &importhookdescr;
- }
- Py_DECREF(loader);
- }
- Py_DECREF(meta_path);
- }
-
- if (find_frozen(fullname) != NULL) {
- strcpy(buf, fullname);
- PyMem_FREE(name);
- return &fd_frozen;
- }
-
- if (path == NULL) {
- if (is_builtin(name)) {
- strcpy(buf, name);
- PyMem_FREE(name);
- return &fd_builtin;
- }
-#ifdef MS_COREDLL
- fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
- if (fp != NULL) {
- *p_fp = fp;
- PyMem_FREE(name);
- return fdp;
- }
-#endif
- path = PySys_GetObject("path");
- }
-
- if (path == NULL || !PyList_Check(path)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path must be a list of directory names");
- goto error_exit;
- }
-
- path_hooks = PySys_GetObject("path_hooks");
- if (path_hooks == NULL || !PyList_Check(path_hooks)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path_hooks must be a list of "
- "import hooks");
- goto error_exit;
- }
- path_importer_cache = PySys_GetObject("path_importer_cache");
- if (path_importer_cache == NULL ||
- !PyDict_Check(path_importer_cache)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path_importer_cache must be a dict");
- goto error_exit;
- }
-
- npath = PyList_Size(path);
- namelen = strlen(name);
- for (i = 0; i < npath; i++) {
- PyObject *v = PyList_GetItem(path, i);
- PyObject *origv = v;
- const char *base;
- Py_ssize_t size;
- if (!v)
- goto error_exit;
- if (PyUnicode_Check(v)) {
- v = PyUnicode_EncodeFSDefault(v);
- if (v == NULL)
- goto error_exit;
- }
- else if (!PyBytes_Check(v))
- continue;
- else
- Py_INCREF(v);
-
- base = PyBytes_AS_STRING(v);
- size = PyBytes_GET_SIZE(v);
- len = size;
- if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
- Py_DECREF(v);
- continue; /* Too long */
- }
- strcpy(buf, base);
- Py_DECREF(v);
-
- if (strlen(buf) != len) {
- continue; /* v contains '\0' */
- }
-
- /* sys.path_hooks import hook */
- if (p_loader != NULL) {
- PyObject *importer;
-
- importer = get_path_importer(path_importer_cache,
- path_hooks, origv);
- if (importer == NULL) {
- goto error_exit;
- }
- /* Note: importer is a borrowed reference */
- if (importer != Py_None) {
- PyObject *loader;
- loader = PyObject_CallMethod(importer,
- "find_module",
- "s", fullname);
- if (loader == NULL)
- goto error_exit; /* error */
- if (loader != Py_None) {
- /* a loader was found */
- *p_loader = loader;
- PyMem_FREE(name);
- return &importhookdescr;
- }
- Py_DECREF(loader);
- continue;
- }
- }
- /* no hook was found, use builtin import */
-
- if (len > 0 && buf[len-1] != SEP
-#ifdef ALTSEP
- && buf[len-1] != ALTSEP
-#endif
- )
- buf[len++] = SEP;
- strcpy(buf+len, name);
- len += namelen;
-
- /* Check for package import (buf holds a directory name,
- and there's an __init__ module in that directory */
-#ifdef HAVE_STAT
- if (stat(buf, &statbuf) == 0 && /* it exists */
- S_ISDIR(statbuf.st_mode) && /* it's a directory */
- case_ok(buf, len, namelen, name)) { /* case matches */
- if (find_init_module(buf)) { /* and has __init__.py */
- PyMem_FREE(name);
- return &fd_package;
- }
- else {
- int err;
- PyObject *unicode = PyUnicode_DecodeFSDefault(buf);
- if (unicode == NULL)
- goto error_exit;
- err = PyErr_WarnFormat(PyExc_ImportWarning, 1,
- "Not importing directory '%U': missing __init__.py",
- unicode);
- Py_DECREF(unicode);
- if (err)
- goto error_exit;
- }
- }
-#endif
-#if defined(PYOS_OS2)
- /* take a snapshot of the module spec for restoration
- * after the 8 character DLL hackery
- */
- saved_buf = strdup(buf);
- saved_len = len;
- saved_namelen = namelen;
-#endif /* PYOS_OS2 */
- for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
- struct stat statbuf;
-#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
- /* OS/2 limits DLLs to 8 character names (w/o
- extension)
- * so if the name is longer than that and its a
- * dynamically loaded module we're going to try,
- * truncate the name before trying
- */
- if (strlen(subname) > 8) {
- /* is this an attempt to load a C extension? */
- const struct filedescr *scan;
- scan = _PyImport_DynLoadFiletab;
- while (scan->suffix != NULL) {
- if (!strcmp(scan->suffix, fdp->suffix))
- break;
- else
- scan++;
- }
- if (scan->suffix != NULL) {
- /* yes, so truncate the name */
- namelen = 8;
- len -= strlen(subname) - namelen;
- buf[len] = '\0';
- }
- }
-#endif /* PYOS_OS2 */
- strcpy(buf+len, fdp->suffix);
- if (Py_VerboseFlag > 1)
- PySys_WriteStderr("# trying %s\n", buf);
-
- filemode = fdp->mode;
- if (filemode[0] == 'U')
- filemode = "r" PY_STDIOTEXTMODE;
-
- if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
- /* it's a directory */
- fp = NULL;
- else
- fp = fopen(buf, filemode);
- if (fp != NULL) {
- if (case_ok(buf, len, namelen, name))
- break;
- else { /* continue search */
- fclose(fp);
- fp = NULL;
- }
- }
-#if defined(PYOS_OS2)
- /* restore the saved snapshot */
- strcpy(buf, saved_buf);
- len = saved_len;
- namelen = saved_namelen;
-#endif
- }
-#if defined(PYOS_OS2)
- /* don't need/want the module name snapshot anymore */
- if (saved_buf)
- {
- free(saved_buf);
- saved_buf = NULL;
- }
-#endif
- if (fp != NULL)
- break;
- }
- if (fp == NULL) {
- PyErr_Format(PyExc_ImportError,
- "No module named %.200s", name);
- goto error_exit;
- }
- *p_fp = fp;
- PyMem_FREE(name);
- return fdp;
-
-error_exit:
- PyMem_FREE(name);
- return NULL;
-}
-
-/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
- * The arguments here are tricky, best shown by example:
- * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
- * ^ ^ ^ ^
- * |--------------------- buf ---------------------|
- * |------------------- len ------------------|
- * |------ name -------|
- * |----- namelen -----|
- * buf is the full path, but len only counts up to (& exclusive of) the
- * extension. name is the module name, also exclusive of extension.
- *
- * We've already done a successful stat() or fopen() on buf, so know that
- * there's some match, possibly case-insensitive.
- *
- * case_ok() is to return 1 if there's a case-sensitive match for
- * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
- * exists.
- *
- * case_ok() is used to implement case-sensitive import semantics even
- * on platforms with case-insensitive filesystems. It's trivial to implement
- * for case-sensitive filesystems. It's pretty much a cross-platform
- * nightmare for systems with case-insensitive filesystems.
- */
-
-/* First we may need a pile of platform-specific header files; the sequence
- * of #if's here should match the sequence in the body of case_ok().
- */
-#if defined(MS_WINDOWS)
-#include <windows.h>
-
-#elif defined(DJGPP)
-#include <dir.h>
-
-#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
-#include <sys/types.h>
-#include <dirent.h>
-
-#elif defined(PYOS_OS2)
-#define INCL_DOS
-#define INCL_DOSERRORS
-#define INCL_NOPMAPI
-#include <os2.h>
-#endif
-
-static int
-case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
-{
-/* Pick a platform-specific implementation; the sequence of #if's here should
- * match the sequence just above.
- */
-
-/* MS_WINDOWS */
-#if defined(MS_WINDOWS)
- WIN32_FIND_DATA data;
- HANDLE h;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- h = FindFirstFile(buf, &data);
- if (h == INVALID_HANDLE_VALUE) {
- PyErr_Format(PyExc_NameError,
- "Can't find file for module %.100s\n(filename %.300s)",
- name, buf);
- return 0;
- }
- FindClose(h);
- return strncmp(data.cFileName, name, namelen) == 0;
-
-/* DJGPP */
-#elif defined(DJGPP)
- struct ffblk ffblk;
- int done;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
- if (done) {
- PyErr_Format(PyExc_NameError,
- "Can't find file for module %.100s\n(filename %.300s)",
- name, buf);
- return 0;
- }
- return strncmp(ffblk.ff_name, name, namelen) == 0;
-
-/* new-fangled macintosh (macosx) or Cygwin */
-#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
- DIR *dirp;
- struct dirent *dp;
- char dirname[MAXPATHLEN + 1];
- const int dirlen = len - namelen - 1; /* don't want trailing SEP */
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- /* Copy the dir component into dirname; substitute "." if empty */
- if (dirlen <= 0) {
- dirname[0] = '.';
- dirname[1] = '\0';
- }
- else {
- assert(dirlen <= MAXPATHLEN);
- memcpy(dirname, buf, dirlen);
- dirname[dirlen] = '\0';
- }
- /* Open the directory and search the entries for an exact match. */
- dirp = opendir(dirname);
- if (dirp) {
- char *nameWithExt = buf + len - namelen;
- while ((dp = readdir(dirp)) != NULL) {
- const int thislen =
-#ifdef _DIRENT_HAVE_D_NAMELEN
- dp->d_namlen;
-#else
- strlen(dp->d_name);
-#endif
- if (thislen >= namelen &&
- strcmp(dp->d_name, nameWithExt) == 0) {
- (void)closedir(dirp);
- return 1; /* Found */
- }
- }
- (void)closedir(dirp);
- }
- return 0 ; /* Not found */
-
-/* OS/2 */
-#elif defined(PYOS_OS2)
- HDIR hdir = 1;
- ULONG srchcnt = 1;
- FILEFINDBUF3 ffbuf;
- APIRET rc;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- rc = DosFindFirst(buf,
- &hdir,
- FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
- &ffbuf, sizeof(ffbuf),
- &srchcnt,
- FIL_STANDARD);
- if (rc != NO_ERROR)
- return 0;
- return strncmp(ffbuf.achName, name, namelen) == 0;
-
-/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
-#else
- return 1;
-
-#endif
-}
-
-#ifdef HAVE_STAT
-
-/* Helper to look for __init__.py or __init__.py[co] in potential package */
-static int
-find_init_module(char *buf)
-{
- const size_t save_len = strlen(buf);
- size_t i = save_len;
- char *pname; /* pointer to start of __init__ */
- struct stat statbuf;
-
-/* For calling case_ok(buf, len, namelen, name):
- * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
- * ^ ^ ^ ^
- * |--------------------- buf ---------------------|
- * |------------------- len ------------------|
- * |------ name -------|
- * |----- namelen -----|
- */
- if (save_len + 13 >= MAXPATHLEN)
- return 0;
- buf[i++] = SEP;
- pname = buf + i;
- strcpy(pname, "__init__.py");
- if (stat(buf, &statbuf) == 0) {
- if (case_ok(buf,
- save_len + 9, /* len("/__init__") */
- 8, /* len("__init__") */
- pname)) {
- buf[save_len] = '\0';
- return 1;
- }
- }
- i += strlen(pname);
- strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
- if (stat(buf, &statbuf) == 0) {
- if (case_ok(buf,
- save_len + 9, /* len("/__init__") */
- 8, /* len("__init__") */
- pname)) {
- buf[save_len] = '\0';
- return 1;
- }
- }
- buf[save_len] = '\0';
- return 0;
-}
-
-#endif /* HAVE_STAT */
-
-
-static int init_builtin(char *); /* Forward */
-
-static PyObject*
-load_builtin(char *name, char *pathname, int type)
-{
- PyObject *m, *modules;
- int err;
-
- if (pathname != NULL && pathname[0] != '\0')
- name = pathname;
-
- if (type == C_BUILTIN)
- err = init_builtin(name);
- else
- err = PyImport_ImportFrozenModule(name);
- if (err < 0)
- return NULL;
- if (err == 0) {
- PyErr_Format(PyExc_ImportError,
- "Purported %s module %.200s not found",
- type == C_BUILTIN ?
- "builtin" : "frozen",
- name);
- return NULL;
- }
-
- modules = PyImport_GetModuleDict();
- m = PyDict_GetItemString(modules, name);
- if (m == NULL) {
- PyErr_Format(
- PyExc_ImportError,
- "%s module %.200s not properly initialized",
- type == C_BUILTIN ?
- "builtin" : "frozen",
- name);
- return NULL;
- }
- Py_INCREF(m);
- return m;
-}
-
-/* Load an external module using the default search path and return
- its module object WITH INCREMENTED REFERENCE COUNT */
-
-static PyObject *
-load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
-{
- PyObject *m;
-
- /* First check that there's an open file (if we need one) */
- switch (type) {
- case PY_SOURCE:
- case PY_COMPILED:
- if (fp == NULL) {
- PyErr_Format(PyExc_ValueError,
- "file object required for import (type code %d)",
- type);
- return NULL;
- }
- }
-
- switch (type) {
-
- case PY_SOURCE:
- m = load_source_module(name, pathname, fp);
- break;
-
- case PY_COMPILED:
- m = load_compiled_module(name, pathname, fp);
- break;
-
-#ifdef HAVE_DYNAMIC_LOADING
- case C_EXTENSION:
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
- break;
-#endif
-
- case PKG_DIRECTORY:
- m = load_package(name, pathname);
- break;
-
- case C_BUILTIN:
- case PY_FROZEN:
- m = load_builtin(name, pathname, type);
- break;
-
- case IMP_HOOK: {
- if (loader == NULL) {
- PyErr_SetString(PyExc_ImportError,
- "import hook without loader");
- return NULL;
- }
- m = PyObject_CallMethod(loader, "load_module", "s", name);
- break;
- }
-
- default:
- PyErr_Format(PyExc_ImportError,
- "Don't know how to import %.200s (type code %d)",
- name, type);
- m = NULL;
-
- }
-
- return m;
-}
+static int init_builtin(PyObject *); /* Forward */
/* Initialize a built-in module.
Return 1 for success, 0 if the module is not found, and -1 with
an exception set if the initialization failed. */
static int
-init_builtin(char *name)
+init_builtin(PyObject *name)
{
struct _inittab *p;
- if (_PyImport_FindBuiltin(name) != NULL)
+ if (_PyImport_FindExtensionObject(name, name) != NULL)
return 1;
for (p = PyImport_Inittab; p->name != NULL; p++) {
PyObject *mod;
PyModuleDef *def;
- if (strcmp(name, p->name) == 0) {
+ if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) {
if (p->initfunc == NULL) {
PyErr_Format(PyExc_ImportError,
- "Cannot re-init internal module %.200s",
+ "Cannot re-init internal module %R",
name);
return -1;
}
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # builtin\n", name);
mod = (*p->initfunc)();
if (mod == 0)
return -1;
/* Remember pointer to module init function. */
def = PyModule_GetDef(mod);
def->m_base.m_init = p->initfunc;
- if (_PyImport_FixupBuiltin(mod, name) < 0)
+ if (_PyImport_FixupExtensionObject(mod, name, name) < 0)
return -1;
/* FixupExtension has put the module into sys.modules,
so we can release our own reference. */
@@ -2244,37 +968,37 @@ init_builtin(char *name)
/* Frozen modules */
static struct _frozen *
-find_frozen(char *name)
+find_frozen(PyObject *name)
{
struct _frozen *p;
- if (!name)
+ if (name == NULL)
return NULL;
for (p = PyImport_FrozenModules; ; p++) {
if (p->name == NULL)
return NULL;
- if (strcmp(p->name, name) == 0)
+ if (PyUnicode_CompareWithASCIIString(name, p->name) == 0)
break;
}
return p;
}
static PyObject *
-get_frozen_object(char *name)
+get_frozen_object(PyObject *name)
{
struct _frozen *p = find_frozen(name);
int size;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "No such frozen object named %.200s",
+ "No such frozen object named %R",
name);
return NULL;
}
if (p->code == NULL) {
PyErr_Format(PyExc_ImportError,
- "Excluded frozen object named %.200s",
+ "Excluded frozen object named %R",
name);
return NULL;
}
@@ -2285,14 +1009,14 @@ get_frozen_object(char *name)
}
static PyObject *
-is_frozen_package(char *name)
+is_frozen_package(PyObject *name)
{
struct _frozen *p = find_frozen(name);
int size;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "No such frozen object named %.200s",
+ "No such frozen object named %R",
name);
return NULL;
}
@@ -2312,19 +1036,20 @@ is_frozen_package(char *name)
This function is also used from frozenmain.c */
int
-PyImport_ImportFrozenModule(char *name)
+PyImport_ImportFrozenModuleObject(PyObject *name)
{
- struct _frozen *p = find_frozen(name);
- PyObject *co;
- PyObject *m;
+ struct _frozen *p;
+ PyObject *co, *m, *path;
int ispackage;
int size;
+ p = find_frozen(name);
+
if (p == NULL)
return 0;
if (p->code == NULL) {
PyErr_Format(PyExc_ImportError,
- "Excluded frozen object named %.200s",
+ "Excluded frozen object named %R",
name);
return -1;
}
@@ -2332,41 +1057,39 @@ PyImport_ImportFrozenModule(char *name)
ispackage = (size < 0);
if (ispackage)
size = -size;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # frozen%s\n",
- name, ispackage ? " package" : "");
co = PyMarshal_ReadObjectFromString((char *)p->code, size);
if (co == NULL)
return -1;
if (!PyCode_Check(co)) {
PyErr_Format(PyExc_TypeError,
- "frozen object %.200s is not a code object",
+ "frozen object %R is not a code object",
name);
goto err_return;
}
if (ispackage) {
/* Set __path__ to the package name */
- PyObject *d, *s, *l;
+ PyObject *d, *l;
int err;
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
if (m == NULL)
goto err_return;
d = PyModule_GetDict(m);
- s = PyUnicode_InternFromString(name);
- if (s == NULL)
- goto err_return;
l = PyList_New(1);
if (l == NULL) {
- Py_DECREF(s);
goto err_return;
}
- PyList_SET_ITEM(l, 0, s);
+ Py_INCREF(name);
+ PyList_SET_ITEM(l, 0, name);
err = PyDict_SetItemString(d, "__path__", l);
Py_DECREF(l);
if (err != 0)
goto err_return;
}
- m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
+ path = PyUnicode_FromString("<frozen>");
+ if (path == NULL)
+ goto err_return;
+ m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
+ Py_DECREF(path);
if (m == NULL)
goto err_return;
Py_DECREF(co);
@@ -2377,6 +1100,19 @@ err_return:
return -1;
}
+int
+PyImport_ImportFrozenModule(char *name)
+{
+ PyObject *nameobj;
+ int ret;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
+ return -1;
+ ret = PyImport_ImportFrozenModuleObject(nameobj);
+ Py_DECREF(nameobj);
+ return ret;
+}
+
/* Import a module, either built-in, frozen, or external, and return
its module object WITH INCREMENTED REFERENCE COUNT */
@@ -2407,585 +1143,411 @@ PyImport_ImportModule(const char *name)
PyObject *
PyImport_ImportModuleNoBlock(const char *name)
{
- PyObject *result;
- PyObject *modules;
-#ifdef WITH_THREAD
- long me;
-#endif
-
- /* Try to get the module from sys.modules[name] */
- modules = PyImport_GetModuleDict();
- if (modules == NULL)
- return NULL;
-
- result = PyDict_GetItemString(modules, name);
- if (result != NULL) {
- Py_INCREF(result);
- return result;
- }
- else {
- PyErr_Clear();
- }
-#ifdef WITH_THREAD
- /* check the import lock
- * me might be -1 but I ignore the error here, the lock function
- * takes care of the problem */
- me = PyThread_get_thread_ident();
- if (import_lock_thread == -1 || import_lock_thread == me) {
- /* no thread or me is holding the lock */
- return PyImport_ImportModule(name);
- }
- else {
- PyErr_Format(PyExc_ImportError,
- "Failed to import %.200s because the import lock"
- "is held by another thread.",
- name);
- return NULL;
- }
-#else
return PyImport_ImportModule(name);
-#endif
}
-/* Forward declarations for helper routines */
-static PyObject *get_parent(PyObject *globals, char *buf,
- Py_ssize_t *p_buflen, int level);
-static PyObject *load_next(PyObject *mod, PyObject *altmod,
- char **p_name, char *buf, Py_ssize_t *p_buflen);
-static int mark_miss(char *name);
-static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
- char *buf, Py_ssize_t buflen, int recursive);
-static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
-
-/* The Magnum Opus of dotted-name import :-) */
-
-static PyObject *
-import_module_level(char *name, PyObject *globals, PyObject *locals,
- PyObject *fromlist, int level)
-{
- char *buf;
- Py_ssize_t buflen = 0;
- PyObject *parent, *head, *next, *tail;
- if (strchr(name, '/') != NULL
-#ifdef MS_WINDOWS
- || strchr(name, '\\') != NULL
-#endif
- ) {
- PyErr_SetString(PyExc_ImportError,
- "Import by filename is not supported.");
- return NULL;
+/* Remove importlib frames from the traceback,
+ * except in Verbose mode. */
+static void
+remove_importlib_frames(void)
+{
+ const char *importlib_filename = "<frozen importlib._bootstrap>";
+ const char *remove_frames = "_call_with_frames_removed";
+ int always_trim = 0;
+ int in_importlib = 0;
+ PyObject *exception, *value, *base_tb, *tb;
+ PyObject **prev_link, **outer_link = NULL;
+
+ /* Synopsis: if it's an ImportError, we trim all importlib chunks
+ from the traceback. We always trim chunks
+ which end with a call to "_call_with_frames_removed". */
+
+ PyErr_Fetch(&exception, &value, &base_tb);
+ if (!exception || Py_VerboseFlag)
+ goto done;
+ if (PyType_IsSubtype((PyTypeObject *) exception,
+ (PyTypeObject *) PyExc_ImportError))
+ always_trim = 1;
+
+ prev_link = &base_tb;
+ tb = base_tb;
+ while (tb != NULL) {
+ PyTracebackObject *traceback = (PyTracebackObject *)tb;
+ PyObject *next = (PyObject *) traceback->tb_next;
+ PyFrameObject *frame = traceback->tb_frame;
+ PyCodeObject *code = frame->f_code;
+ int now_in_importlib;
+
+ assert(PyTraceBack_Check(tb));
+ now_in_importlib = (PyUnicode_CompareWithASCIIString(
+ code->co_filename,
+ importlib_filename) == 0);
+ if (now_in_importlib && !in_importlib) {
+ /* This is the link to this chunk of importlib tracebacks */
+ outer_link = prev_link;
+ }
+ in_importlib = now_in_importlib;
+
+ if (in_importlib &&
+ (always_trim ||
+ PyUnicode_CompareWithASCIIString(code->co_name,
+ remove_frames) == 0)) {
+ PyObject *tmp = *outer_link;
+ *outer_link = next;
+ Py_XINCREF(next);
+ Py_DECREF(tmp);
+ prev_link = outer_link;
+ }
+ else {
+ prev_link = (PyObject **) &traceback->tb_next;
+ }
+ tb = next;
}
+done:
+ PyErr_Restore(exception, value, base_tb);
+}
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- parent = get_parent(globals, buf, &buflen, level);
- if (parent == NULL)
- goto error_exit;
- head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
- &buflen);
- if (head == NULL)
- goto error_exit;
+PyObject *
+PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
+ PyObject *locals, PyObject *given_fromlist,
+ int level)
+{
+ _Py_IDENTIFIER(__import__);
+ _Py_IDENTIFIER(__initializing__);
+ _Py_IDENTIFIER(__package__);
+ _Py_IDENTIFIER(__path__);
+ _Py_IDENTIFIER(__name__);
+ _Py_IDENTIFIER(_find_and_load);
+ _Py_IDENTIFIER(_handle_fromlist);
+ _Py_IDENTIFIER(_lock_unlock_module);
+ _Py_static_string(single_dot, ".");
+ PyObject *abs_name = NULL;
+ PyObject *builtins_import = NULL;
+ PyObject *final_mod = NULL;
+ PyObject *mod = NULL;
+ PyObject *package = NULL;
+ PyObject *globals = NULL;
+ PyObject *fromlist = NULL;
+ PyInterpreterState *interp = PyThreadState_GET()->interp;
- tail = head;
- Py_INCREF(tail);
- while (name) {
- next = load_next(tail, tail, &name, buf, &buflen);
- Py_DECREF(tail);
- if (next == NULL) {
- Py_DECREF(head);
- goto error_exit;
+ /* Make sure to use default values so as to not have
+ PyObject_CallMethodObjArgs() truncate the parameter list because of a
+ NULL argument. */
+ if (given_globals == NULL) {
+ globals = PyDict_New();
+ if (globals == NULL) {
+ goto error;
}
- tail = next;
- }
- if (tail == Py_None) {
- /* If tail is Py_None, both get_parent and load_next found
- an empty module name: someone called __import__("") or
- doctored faulty bytecode */
- Py_DECREF(tail);
- Py_DECREF(head);
- PyErr_SetString(PyExc_ValueError,
- "Empty module name");
- goto error_exit;
- }
-
- if (fromlist != NULL) {
- int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist);
- if (b < 0) {
- Py_DECREF(tail);
- Py_DECREF(head);
- goto error_exit;
+ }
+ else {
+ /* Only have to care what given_globals is if it will be used
+ for something. */
+ if (level > 0 && !PyDict_Check(given_globals)) {
+ PyErr_SetString(PyExc_TypeError, "globals must be a dict");
+ goto error;
}
- if (!b)
- fromlist = NULL;
+ globals = given_globals;
+ Py_INCREF(globals);
}
- if (fromlist == NULL) {
- Py_DECREF(tail);
- PyMem_FREE(buf);
- return head;
+ if (given_fromlist == NULL) {
+ fromlist = PyList_New(0);
+ if (fromlist == NULL) {
+ goto error;
+ }
}
-
- Py_DECREF(head);
- if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
- Py_DECREF(tail);
- goto error_exit;
+ else {
+ fromlist = given_fromlist;
+ Py_INCREF(fromlist);
}
-
- PyMem_FREE(buf);
- return tail;
-
-error_exit:
- PyMem_FREE(buf);
- return NULL;
-}
-
-PyObject *
-PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
- PyObject *fromlist, int level)
-{
- PyObject *result;
- _PyImport_AcquireLock();
- result = import_module_level(name, globals, locals, fromlist, level);
- if (_PyImport_ReleaseLock() < 0) {
- Py_XDECREF(result);
- PyErr_SetString(PyExc_RuntimeError,
- "not holding the import lock");
- return NULL;
+ if (name == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Empty module name");
+ goto error;
}
- return result;
-}
-
-/* Return the package that an import is being performed in. If globals comes
- from the module foo.bar.bat (not itself a package), this returns the
- sys.modules entry for foo.bar. If globals is from a package's __init__.py,
- the package's entry in sys.modules is returned, as a borrowed reference.
-
- The *name* of the returned package is returned in buf, with the length of
- the name in *p_buflen.
- If globals doesn't come from a package or a module in a package, or a
- corresponding entry is not found in sys.modules, Py_None is returned.
-*/
-static PyObject *
-get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
-{
- static PyObject *namestr = NULL;
- static PyObject *pathstr = NULL;
- static PyObject *pkgstr = NULL;
- PyObject *pkgname, *modname, *modpath, *modules, *parent;
- int orig_level = level;
+ /* The below code is importlib.__import__() & _gcd_import(), ported to C
+ for added performance. */
- if (globals == NULL || !PyDict_Check(globals) || !level)
- return Py_None;
-
- if (namestr == NULL) {
- namestr = PyUnicode_InternFromString("__name__");
- if (namestr == NULL)
- return NULL;
+ if (!PyUnicode_Check(name)) {
+ PyErr_SetString(PyExc_TypeError, "module name must be a string");
+ goto error;
}
- if (pathstr == NULL) {
- pathstr = PyUnicode_InternFromString("__path__");
- if (pathstr == NULL)
- return NULL;
+ else if (PyUnicode_READY(name) < 0) {
+ goto error;
}
- if (pkgstr == NULL) {
- pkgstr = PyUnicode_InternFromString("__package__");
- if (pkgstr == NULL)
- return NULL;
+ if (level < 0) {
+ PyErr_SetString(PyExc_ValueError, "level must be >= 0");
+ goto error;
}
-
- *buf = '\0';
- *p_buflen = 0;
- pkgname = PyDict_GetItem(globals, pkgstr);
-
- if ((pkgname != NULL) && (pkgname != Py_None)) {
- /* __package__ is set, so use it */
- char *pkgname_str;
- Py_ssize_t len;
-
- if (!PyUnicode_Check(pkgname)) {
- PyErr_SetString(PyExc_ValueError,
- "__package__ set to non-string");
- return NULL;
- }
- pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
- if (len == 0) {
- if (level > 0) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import in non-package");
- return NULL;
+ else if (level > 0) {
+ package = _PyDict_GetItemId(globals, &PyId___package__);
+ if (package != NULL && package != Py_None) {
+ Py_INCREF(package);
+ if (!PyUnicode_Check(package)) {
+ PyErr_SetString(PyExc_TypeError, "package must be a string");
+ goto error;
}
- return Py_None;
}
- if (len > MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Package name too long");
- return NULL;
- }
- strcpy(buf, pkgname_str);
- } else {
- /* __package__ not set, so figure it out and set it */
- modname = PyDict_GetItem(globals, namestr);
- if (modname == NULL || !PyUnicode_Check(modname))
- return Py_None;
-
- modpath = PyDict_GetItem(globals, pathstr);
- if (modpath != NULL) {
- /* __path__ is set, so modname is already the package name */
- char *modname_str;
- Py_ssize_t len;
- int error;
-
- modname_str = _PyUnicode_AsStringAndSize(modname, &len);
- if (len > MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
+ else {
+ package = _PyDict_GetItemId(globals, &PyId___name__);
+ if (package == NULL) {
+ PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
+ goto error;
}
- strcpy(buf, modname_str);
- error = PyDict_SetItem(globals, pkgstr, modname);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ else if (!PyUnicode_Check(package)) {
+ PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
}
- } else {
- /* Normal module, so work out the package name if any */
- char *start = _PyUnicode_AsString(modname);
- char *lastdot = strrchr(start, '.');
- size_t len;
- int error;
- if (lastdot == NULL && level > 0) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import in non-package");
- return NULL;
- }
- if (lastdot == NULL) {
- error = PyDict_SetItem(globals, pkgstr, Py_None);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ Py_INCREF(package);
+
+ if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) {
+ PyObject *partition = NULL;
+ PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
+ if (borrowed_dot == NULL) {
+ goto error;
}
- return Py_None;
- }
- len = lastdot - start;
- if (len >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
- }
- strncpy(buf, start, len);
- buf[len] = '\0';
- pkgname = PyUnicode_FromString(buf);
- if (pkgname == NULL) {
- return NULL;
- }
- error = PyDict_SetItem(globals, pkgstr, pkgname);
- Py_DECREF(pkgname);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ partition = PyUnicode_RPartition(package, borrowed_dot);
+ Py_DECREF(package);
+ if (partition == NULL) {
+ goto error;
+ }
+ package = PyTuple_GET_ITEM(partition, 0);
+ Py_INCREF(package);
+ Py_DECREF(partition);
}
}
+
+ if (PyDict_GetItem(interp->modules, package) == NULL) {
+ PyErr_Format(PyExc_SystemError,
+ "Parent module %R not loaded, cannot perform relative "
+ "import", package);
+ goto error;
+ }
}
- while (--level > 0) {
- char *dot = strrchr(buf, '.');
- if (dot == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import beyond "
- "toplevel package");
- return NULL;
+ else { /* level == 0 */
+ if (PyUnicode_GET_LENGTH(name) == 0) {
+ PyErr_SetString(PyExc_ValueError, "Empty module name");
+ goto error;
}
- *dot = '\0';
+ package = Py_None;
+ Py_INCREF(package);
}
- *p_buflen = strlen(buf);
- modules = PyImport_GetModuleDict();
- parent = PyDict_GetItemString(modules, buf);
- if (parent == NULL) {
- if (orig_level < 1) {
- PyObject *err_msg = PyBytes_FromFormat(
- "Parent module '%.200s' not found "
- "while handling absolute import", buf);
- if (err_msg == NULL) {
- return NULL;
+ if (level > 0) {
+ Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package);
+ PyObject *base = NULL;
+ int level_up = 1;
+
+ for (level_up = 1; level_up < level; level_up += 1) {
+ last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
+ if (last_dot == -2) {
+ goto error;
}
- if (!PyErr_WarnEx(PyExc_RuntimeWarning,
- PyBytes_AsString(err_msg), 1)) {
- *buf = '\0';
- *p_buflen = 0;
- parent = Py_None;
+ else if (last_dot == -1) {
+ PyErr_SetString(PyExc_ValueError,
+ "attempted relative import beyond top-level "
+ "package");
+ goto error;
}
- Py_DECREF(err_msg);
- } else {
- PyErr_Format(PyExc_SystemError,
- "Parent module '%.200s' not loaded, "
- "cannot perform relative import", buf);
}
- }
- return parent;
- /* We expect, but can't guarantee, if parent != None, that:
- - parent.__name__ == buf
- - parent.__dict__ is globals
- If this is violated... Who cares? */
-}
-
-/* altmod is either None or same as mod */
-static PyObject *
-load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
- Py_ssize_t *p_buflen)
-{
- char *name = *p_name;
- char *dot = strchr(name, '.');
- size_t len;
- char *p;
- PyObject *result;
-
- if (strlen(name) == 0) {
- /* completely empty module name should only happen in
- 'from . import' (or '__import__("")')*/
- Py_INCREF(mod);
- *p_name = NULL;
- return mod;
- }
+ base = PyUnicode_Substring(package, 0, last_dot);
+ if (PyUnicode_GET_LENGTH(name) > 0) {
+ PyObject *borrowed_dot, *seq = NULL;
+
+ borrowed_dot = _PyUnicode_FromId(&single_dot);
+ seq = PyTuple_Pack(2, base, name);
+ Py_DECREF(base);
+ if (borrowed_dot == NULL || seq == NULL) {
+ goto error;
+ }
- if (dot == NULL) {
- *p_name = NULL;
- len = strlen(name);
+ abs_name = PyUnicode_Join(borrowed_dot, seq);
+ Py_DECREF(seq);
+ if (abs_name == NULL) {
+ goto error;
+ }
+ }
+ else {
+ abs_name = base;
+ }
}
else {
- *p_name = dot+1;
- len = dot-name;
- }
- if (len == 0) {
- PyErr_SetString(PyExc_ValueError,
- "Empty module name");
- return NULL;
+ abs_name = name;
+ Py_INCREF(abs_name);
}
- p = buf + *p_buflen;
- if (p != buf)
- *p++ = '.';
- if (p+len-buf >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
- }
- strncpy(p, name, len);
- p[len] = '\0';
- *p_buflen = p+len-buf;
-
- result = import_submodule(mod, p, buf);
- if (result == Py_None && altmod != mod) {
- Py_DECREF(result);
- /* Here, altmod must be None and mod must not be None */
- result = import_submodule(altmod, p, p);
- if (result != NULL && result != Py_None) {
- if (mark_miss(buf) != 0) {
- Py_DECREF(result);
- return NULL;
- }
- strncpy(buf, name, len);
- buf[len] = '\0';
- *p_buflen = len;
+#ifdef WITH_THREAD
+ _PyImport_AcquireLock();
+#endif
+ /* From this point forward, goto error_with_unlock! */
+ if (PyDict_Check(globals)) {
+ builtins_import = _PyDict_GetItemId(globals, &PyId___import__);
+ }
+ if (builtins_import == NULL) {
+ builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__);
+ if (builtins_import == NULL) {
+ Py_FatalError("__import__ missing");
}
}
- if (result == NULL)
- return NULL;
+ Py_INCREF(builtins_import);
- if (result == Py_None) {
- Py_DECREF(result);
- PyErr_Format(PyExc_ImportError,
- "No module named %.200s", name);
- return NULL;
+ mod = PyDict_GetItem(interp->modules, abs_name);
+ if (mod == Py_None) {
+ PyObject *msg = PyUnicode_FromFormat("import of %R halted; "
+ "None in sys.modules", abs_name);
+ if (msg != NULL) {
+ PyErr_SetImportError(msg, abs_name, NULL);
+ Py_DECREF(msg);
+ }
+ mod = NULL;
+ goto error_with_unlock;
}
+ else if (mod != NULL) {
+ PyObject *value;
+ int initializing = 0;
- return result;
-}
-
-static int
-mark_miss(char *name)
-{
- PyObject *modules = PyImport_GetModuleDict();
- return PyDict_SetItemString(modules, name, Py_None);
-}
-
-static int
-ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
- int recursive)
-{
- int i;
-
- if (!PyObject_HasAttrString(mod, "__path__"))
- return 1;
-
- for (i = 0; ; i++) {
- PyObject *item = PySequence_GetItem(fromlist, i);
- int hasit;
- if (item == NULL) {
- if (PyErr_ExceptionMatches(PyExc_IndexError)) {
+ Py_INCREF(mod);
+ /* Optimization: only call _bootstrap._lock_unlock_module() if
+ __initializing__ is true.
+ NOTE: because of this, __initializing__ must be set *before*
+ stuffing the new module in sys.modules.
+ */
+ value = _PyObject_GetAttrId(mod, &PyId___initializing__);
+ if (value == NULL)
+ PyErr_Clear();
+ else {
+ initializing = PyObject_IsTrue(value);
+ Py_DECREF(value);
+ if (initializing == -1)
PyErr_Clear();
- return 1;
- }
- return 0;
}
- if (!PyUnicode_Check(item)) {
- PyErr_SetString(PyExc_TypeError,
- "Item in ``from list'' not a string");
- Py_DECREF(item);
- return 0;
+ if (initializing > 0) {
+ /* _bootstrap._lock_unlock_module() releases the import lock */
+ value = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__lock_unlock_module, abs_name,
+ NULL);
+ if (value == NULL)
+ goto error;
+ Py_DECREF(value);
}
- if (PyUnicode_AS_UNICODE(item)[0] == '*') {
- PyObject *all;
- Py_DECREF(item);
- /* See if the package defines __all__ */
- if (recursive)
- continue; /* Avoid endless recursion */
- all = PyObject_GetAttrString(mod, "__all__");
- if (all == NULL)
- PyErr_Clear();
- else {
- int ret = ensure_fromlist(mod, all, buf, buflen, 1);
- Py_DECREF(all);
- if (!ret)
- return 0;
+ else {
+#ifdef WITH_THREAD
+ if (_PyImport_ReleaseLock() < 0) {
+ PyErr_SetString(PyExc_RuntimeError, "not holding the import lock");
+ goto error;
}
- continue;
+#endif
}
- hasit = PyObject_HasAttr(mod, item);
- if (!hasit) {
- PyObject *item8;
- char *subname;
- PyObject *submod;
- char *p;
- item8 = PyUnicode_EncodeFSDefault(item);
- if (!item8) {
- PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
- return 0;
- }
- subname = PyBytes_AS_STRING(item8);
- if (buflen + strlen(subname) >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- Py_DECREF(item);
- return 0;
- }
- p = buf + buflen;
- *p++ = '.';
- strcpy(p, subname);
- submod = import_submodule(mod, subname, buf);
- Py_DECREF(item8);
- Py_XDECREF(submod);
- if (submod == NULL) {
- Py_DECREF(item);
- return 0;
- }
+ }
+ else {
+ /* _bootstrap._find_and_load() releases the import lock */
+ mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__find_and_load, abs_name,
+ builtins_import, NULL);
+ if (mod == NULL) {
+ goto error;
}
- Py_DECREF(item);
}
+ /* From now on we don't hold the import lock anymore. */
- /* NOTREACHED */
-}
+ if (PyObject_Not(fromlist)) {
+ if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) {
+ PyObject *front = NULL;
+ PyObject *partition = NULL;
+ PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
-static int
-add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
- PyObject *modules)
-{
- if (mod == Py_None)
- return 1;
- /* Irrespective of the success of this load, make a
- reference to it in the parent package module. A copy gets
- saved in the modules dictionary under the full name, so get a
- reference from there, if need be. (The exception is when the
- load failed with a SyntaxError -- then there's no trace in
- sys.modules. In that case, of course, do nothing extra.) */
- if (submod == NULL) {
- submod = PyDict_GetItemString(modules, fullname);
- if (submod == NULL)
- return 1;
- }
- if (PyModule_Check(mod)) {
- /* We can't use setattr here since it can give a
- * spurious warning if the submodule name shadows a
- * builtin name */
- PyObject *dict = PyModule_GetDict(mod);
- if (!dict)
- return 0;
- if (PyDict_SetItemString(dict, subname, submod) < 0)
- return 0;
- }
- else {
- if (PyObject_SetAttrString(mod, subname, submod) < 0)
- return 0;
- }
- return 1;
-}
+ if (borrowed_dot == NULL) {
+ goto error;
+ }
-static PyObject *
-import_submodule(PyObject *mod, char *subname, char *fullname)
-{
- PyObject *modules = PyImport_GetModuleDict();
- PyObject *m = NULL;
+ partition = PyUnicode_Partition(name, borrowed_dot);
+ if (partition == NULL) {
+ goto error;
+ }
- /* Require:
- if mod == None: subname == fullname
- else: mod.__name__ + "." + subname == fullname
- */
+ if (PyUnicode_GET_LENGTH(PyTuple_GET_ITEM(partition, 1)) == 0) {
+ /* No dot in module name, simple exit */
+ Py_DECREF(partition);
+ final_mod = mod;
+ Py_INCREF(mod);
+ goto error;
+ }
- if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
- Py_INCREF(m);
- }
- else {
- PyObject *path, *loader = NULL;
- char *buf;
- struct filedescr *fdp;
- FILE *fp = NULL;
+ front = PyTuple_GET_ITEM(partition, 0);
+ Py_INCREF(front);
+ Py_DECREF(partition);
- if (mod == Py_None)
- path = NULL;
- else {
- path = PyObject_GetAttrString(mod, "__path__");
- if (path == NULL) {
- PyErr_Clear();
- Py_INCREF(Py_None);
- return Py_None;
+ if (level == 0) {
+ final_mod = PyObject_CallFunctionObjArgs(builtins_import, front, NULL);
+ Py_DECREF(front);
}
- }
+ else {
+ Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) -
+ PyUnicode_GET_LENGTH(front);
+ Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
+ PyObject *to_return = PyUnicode_Substring(abs_name, 0,
+ abs_name_len - cut_off);
+ Py_DECREF(front);
+ if (to_return == NULL) {
+ goto error;
+ }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- buf[0] = '\0';
- fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
- &fp, &loader);
- Py_XDECREF(path);
- if (fdp == NULL) {
- PyMem_FREE(buf);
- if (!PyErr_ExceptionMatches(PyExc_ImportError))
- return NULL;
- PyErr_Clear();
- Py_INCREF(Py_None);
- return Py_None;
+ final_mod = PyDict_GetItem(interp->modules, to_return);
+ if (final_mod == NULL) {
+ PyErr_Format(PyExc_KeyError,
+ "%R not in sys.modules as expected",
+ to_return);
+ }
+ else {
+ Py_INCREF(final_mod);
+ }
+ Py_DECREF(to_return);
+ }
}
- m = load_module(fullname, fp, buf, fdp->type, loader);
- Py_XDECREF(loader);
- if (fp)
- fclose(fp);
- if (!add_submodule(mod, m, fullname, subname, modules)) {
- Py_XDECREF(m);
- m = NULL;
+ else {
+ final_mod = mod;
+ Py_INCREF(mod);
}
- PyMem_FREE(buf);
}
+ else {
+ final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__handle_fromlist, mod,
+ fromlist, builtins_import,
+ NULL);
+ }
+ goto error;
- return m;
+ error_with_unlock:
+#ifdef WITH_THREAD
+ if (_PyImport_ReleaseLock() < 0) {
+ PyErr_SetString(PyExc_RuntimeError, "not holding the import lock");
+ }
+#endif
+ error:
+ Py_XDECREF(abs_name);
+ Py_XDECREF(builtins_import);
+ Py_XDECREF(mod);
+ Py_XDECREF(package);
+ Py_XDECREF(globals);
+ Py_XDECREF(fromlist);
+ if (final_mod == NULL)
+ remove_importlib_frames();
+ return final_mod;
+}
+
+PyObject *
+PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
+ PyObject *fromlist, int level)
+{
+ PyObject *nameobj, *mod;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
+ fromlist, level);
+ Py_DECREF(nameobj);
+ return mod;
}
@@ -2995,103 +1557,23 @@ import_submodule(PyObject *mod, char *subname, char *fullname)
PyObject *
PyImport_ReloadModule(PyObject *m)
{
- PyInterpreterState *interp = PyThreadState_Get()->interp;
- PyObject *modules_reloading = interp->modules_reloading;
+ _Py_IDENTIFIER(reload);
+ PyObject *reloaded_module = NULL;
PyObject *modules = PyImport_GetModuleDict();
- PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
- char *name, *subname;
- char *buf;
- struct filedescr *fdp;
- FILE *fp = NULL;
- PyObject *newm;
-
- if (modules_reloading == NULL) {
- Py_FatalError("PyImport_ReloadModule: "
- "no modules_reloading dictionary!");
- return NULL;
- }
-
- if (m == NULL || !PyModule_Check(m)) {
- PyErr_SetString(PyExc_TypeError,
- "reload() argument must be module");
- return NULL;
- }
- name = (char*)PyModule_GetName(m);
- if (name == NULL)
- return NULL;
- if (m != PyDict_GetItemString(modules, name)) {
- PyErr_Format(PyExc_ImportError,
- "reload(): module %.200s not in sys.modules",
- name);
- return NULL;
- }
- existing_m = PyDict_GetItemString(modules_reloading, name);
- if (existing_m != NULL) {
- /* Due to a recursive reload, this module is already
- being reloaded. */
- Py_INCREF(existing_m);
- return existing_m;
- }
- if (PyDict_SetItemString(modules_reloading, name, m) < 0)
- return NULL;
-
- subname = strrchr(name, '.');
- if (subname == NULL)
- subname = name;
- else {
- PyObject *parentname, *parent;
- parentname = PyUnicode_FromStringAndSize(name, (subname-name));
- if (parentname == NULL) {
- imp_modules_reloading_clear();
+ PyObject *imp = PyDict_GetItemString(modules, "imp");
+ if (imp == NULL) {
+ imp = PyImport_ImportModule("imp");
+ if (imp == NULL) {
return NULL;
}
- parent = PyDict_GetItem(modules, parentname);
- if (parent == NULL) {
- PyErr_Format(PyExc_ImportError,
- "reload(): parent %U not in sys.modules",
- parentname);
- Py_DECREF(parentname);
- imp_modules_reloading_clear();
- return NULL;
- }
- Py_DECREF(parentname);
- subname++;
- path = PyObject_GetAttrString(parent, "__path__");
- if (path == NULL)
- PyErr_Clear();
- }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- Py_XDECREF(path);
- return PyErr_NoMemory();
}
- buf[0] = '\0';
- fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
- Py_XDECREF(path);
-
- if (fdp == NULL) {
- Py_XDECREF(loader);
- imp_modules_reloading_clear();
- PyMem_FREE(buf);
- return NULL;
+ else {
+ Py_INCREF(imp);
}
- newm = load_module(name, fp, buf, fdp->type, loader);
- Py_XDECREF(loader);
-
- if (fp)
- fclose(fp);
- if (newm == NULL) {
- /* load_module probably removed name from modules because of
- * the error. Put back the original module object. We're
- * going to return NULL in this case regardless of whether
- * replacing name succeeds, so the return value is ignored.
- */
- PyDict_SetItemString(modules, name, m);
- }
- imp_modules_reloading_clear();
- PyMem_FREE(buf);
- return newm;
+ reloaded_module = _PyObject_CallMethodId(imp, &PyId_reload, "O", m);
+ Py_DECREF(imp);
+ return reloaded_module;
}
@@ -3181,48 +1663,19 @@ PyImport_Import(PyObject *module_name)
return r;
}
-
-/* Module 'imp' provides Python access to the primitives used for
- importing modules.
-*/
-
-static PyObject *
-imp_make_magic(long magic)
-{
- char buf[4];
-
- buf[0] = (char) ((magic >> 0) & 0xff);
- buf[1] = (char) ((magic >> 8) & 0xff);
- buf[2] = (char) ((magic >> 16) & 0xff);
- buf[3] = (char) ((magic >> 24) & 0xff);
-
- return PyBytes_FromStringAndSize(buf, 4);
-}
-
-static PyObject *
-imp_get_magic(PyObject *self, PyObject *noargs)
-{
- return imp_make_magic(pyc_magic);
-}
-
-static PyObject *
-imp_get_tag(PyObject *self, PyObject *noargs)
-{
- return PyUnicode_FromString(pyc_tag);
-}
-
static PyObject *
-imp_get_suffixes(PyObject *self, PyObject *noargs)
+imp_extension_suffixes(PyObject *self, PyObject *noargs)
{
PyObject *list;
- struct filedescr *fdp;
+ const char *suffix;
+ unsigned int index = 0;
list = PyList_New(0);
if (list == NULL)
return NULL;
- for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
- PyObject *item = Py_BuildValue("ssi",
- fdp->suffix, fdp->mode, fdp->type);
+#ifdef HAVE_DYNAMIC_LOADING
+ while ((suffix = _PyImport_DynLoadFiletab[index])) {
+ PyObject *item = PyUnicode_FromString(suffix);
if (item == NULL) {
Py_DECREF(list);
return NULL;
@@ -3233,102 +1686,19 @@ imp_get_suffixes(PyObject *self, PyObject *noargs)
return NULL;
}
Py_DECREF(item);
+ index += 1;
}
+#endif
return list;
}
static PyObject *
-call_find_module(char *name, PyObject *path)
-{
- extern int fclose(FILE *);
- PyObject *fob, *ret;
- PyObject *pathobj;
- struct filedescr *fdp;
- char *pathname;
- FILE *fp = NULL;
- int fd = -1;
- char *found_encoding = NULL;
- char *encoding = NULL;
-
- pathname = PyMem_MALLOC(MAXPATHLEN+1);
- if (pathname == NULL) {
- return PyErr_NoMemory();
- }
- pathname[0] = '\0';
- if (path == Py_None)
- path = NULL;
- fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
- if (fdp == NULL)
- goto error_exit;
- if (fp != NULL) {
- fd = fileno(fp);
- if (fd != -1)
- fd = dup(fd);
- fclose(fp);
- fp = NULL;
- if (fd == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
- goto error_exit;
- }
- }
- if (fd != -1) {
- if (strchr(fdp->mode, 'b') == NULL) {
- /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
- memory. */
- found_encoding = PyTokenizer_FindEncoding(fd);
- lseek(fd, 0, 0); /* Reset position */
- if (found_encoding == NULL && PyErr_Occurred()) {
- close(fd);
- goto error_exit;
- }
- encoding = (found_encoding != NULL) ? found_encoding :
- (char*)PyUnicode_GetDefaultEncoding();
- }
- fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
- (char*)encoding, NULL, NULL, 1);
- if (fob == NULL) {
- close(fd);
- PyMem_FREE(found_encoding);
- goto error_exit;
- }
- }
- else {
- fob = Py_None;
- Py_INCREF(fob);
- }
- pathobj = PyUnicode_DecodeFSDefault(pathname);
- ret = Py_BuildValue("NN(ssi)",
- fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
- PyMem_FREE(found_encoding);
- PyMem_FREE(pathname);
- return ret;
-
-error_exit:
- PyMem_FREE(pathname);
- return NULL;
-}
-
-static PyObject *
-imp_find_module(PyObject *self, PyObject *args)
-{
- PyObject *name;
- PyObject *ret, *path = NULL;
- if (!PyArg_ParseTuple(args, "O&|O:find_module",
- PyUnicode_FSConverter, &name,
- &path))
- return NULL;
- ret = call_find_module(PyBytes_AS_STRING(name), path);
- Py_DECREF(name);
- return ret;
-}
-
-static PyObject *
imp_init_builtin(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
int ret;
PyObject *m;
- if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
+ if (!PyArg_ParseTuple(args, "U:init_builtin", &name))
return NULL;
ret = init_builtin(name);
if (ret < 0)
@@ -3337,7 +1707,7 @@ imp_init_builtin(PyObject *self, PyObject *args)
Py_INCREF(Py_None);
return Py_None;
}
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
Py_XINCREF(m);
return m;
}
@@ -3345,19 +1715,19 @@ imp_init_builtin(PyObject *self, PyObject *args)
static PyObject *
imp_init_frozen(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
int ret;
PyObject *m;
- if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
+ if (!PyArg_ParseTuple(args, "U:init_frozen", &name))
return NULL;
- ret = PyImport_ImportFrozenModule(name);
+ ret = PyImport_ImportFrozenModuleObject(name);
if (ret < 0)
return NULL;
if (ret == 0) {
Py_INCREF(Py_None);
return Py_None;
}
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
Py_XINCREF(m);
return m;
}
@@ -3365,9 +1735,9 @@ imp_init_frozen(PyObject *self, PyObject *args)
static PyObject *
imp_get_frozen_object(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
- if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
+ if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name))
return NULL;
return get_frozen_object(name);
}
@@ -3375,9 +1745,9 @@ imp_get_frozen_object(PyObject *self, PyObject *args)
static PyObject *
imp_is_frozen_package(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
- if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
+ if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name))
return NULL;
return is_frozen_package(name);
}
@@ -3385,8 +1755,8 @@ imp_is_frozen_package(PyObject *self, PyObject *args)
static PyObject *
imp_is_builtin(PyObject *self, PyObject *args)
{
- char *name;
- if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
+ PyObject *name;
+ if (!PyArg_ParseTuple(args, "U:is_builtin", &name))
return NULL;
return PyLong_FromLong(is_builtin(name));
}
@@ -3394,333 +1764,54 @@ imp_is_builtin(PyObject *self, PyObject *args)
static PyObject *
imp_is_frozen(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
struct _frozen *p;
- if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
+ if (!PyArg_ParseTuple(args, "U:is_frozen", &name))
return NULL;
p = find_frozen(name);
return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
}
-static FILE *
-get_file(char *pathname, PyObject *fob, char *mode)
-{
- FILE *fp;
- if (mode[0] == 'U')
- mode = "r" PY_STDIOTEXTMODE;
- if (fob == NULL) {
- fp = fopen(pathname, mode);
- }
- else {
- int fd = PyObject_AsFileDescriptor(fob);
- if (fd == -1)
- return NULL;
- if (!_PyVerify_fd(fd))
- goto error;
- /* the FILE struct gets a new fd, so that it can be closed
- * independently of the file descriptor given
- */
- fd = dup(fd);
- if (fd == -1)
- goto error;
- fp = fdopen(fd, mode);
- }
- if (fp)
- return fp;
-error:
- PyErr_SetFromErrno(PyExc_IOError);
- return NULL;
-}
-
-static PyObject *
-imp_load_compiled(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp;
- if (!PyArg_ParseTuple(args, "sO&|O:load_compiled",
- &name,
- PyUnicode_FSConverter, &pathname,
- &fob))
- return NULL;
- fp = get_file(PyBytes_AS_STRING(pathname), fob, "rb");
- if (fp == NULL) {
- Py_DECREF(pathname);
- return NULL;
- }
- m = load_compiled_module(name, PyBytes_AS_STRING(pathname), fp);
- fclose(fp);
- Py_DECREF(pathname);
- return m;
-}
-
#ifdef HAVE_DYNAMIC_LOADING
static PyObject *
imp_load_dynamic(PyObject *self, PyObject *args)
{
- char *name;
- PyObject *pathbytes;
- char *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp = NULL;
- if (!PyArg_ParseTuple(args, "sO&|O:load_dynamic",
- &name, PyUnicode_FSConverter, &pathbytes, &fob))
- return NULL;
- pathname = PyBytes_AS_STRING(pathbytes);
- if (fob) {
- fp = get_file(pathname, fob, "r");
- if (fp == NULL) {
- Py_DECREF(pathbytes);
- return NULL;
- }
- }
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
- Py_DECREF(pathbytes);
- if (fp)
- fclose(fp);
- return m;
-}
-
-#endif /* HAVE_DYNAMIC_LOADING */
-
-static PyObject *
-imp_load_source(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject *fob = NULL;
- PyObject *m;
+ PyObject *name, *pathname, *fob = NULL, *mod;
FILE *fp;
- if (!PyArg_ParseTuple(args, "sO&|O:load_source",
- &name,
- PyUnicode_FSConverter, &pathname,
- &fob))
- return NULL;
- fp = get_file(PyBytes_AS_STRING(pathname), fob, "r");
- if (fp == NULL) {
- Py_DECREF(pathname);
- return NULL;
- }
- m = load_source_module(name, PyBytes_AS_STRING(pathname), fp);
- Py_DECREF(pathname);
- fclose(fp);
- return m;
-}
-static PyObject *
-imp_load_module(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *fob;
- PyObject *pathname;
- PyObject * ret;
- char *suffix; /* Unused */
- char *mode;
- int type;
- FILE *fp;
-
- if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module",
- &name, &fob,
- PyUnicode_FSConverter, &pathname,
- &suffix, &mode, &type))
+ if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic",
+ &name, PyUnicode_FSDecoder, &pathname, &fob))
return NULL;
- if (*mode) {
- /* Mode must start with 'r' or 'U' and must not contain '+'.
- Implicit in this test is the assumption that the mode
- may contain other modifiers like 'b' or 't'. */
-
- if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
- PyErr_Format(PyExc_ValueError,
- "invalid file open mode %.200s", mode);
- Py_DECREF(pathname);
- return NULL;
- }
- }
- if (fob == Py_None)
- fp = NULL;
- else {
- fp = get_file(NULL, fob, mode);
+ if (fob != NULL) {
+ fp = _Py_fopen(pathname, "r");
if (fp == NULL) {
Py_DECREF(pathname);
+ if (!PyErr_Occurred())
+ PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
}
- ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL);
+ else
+ fp = NULL;
+ mod = _PyImport_LoadDynamicModule(name, pathname, fp);
Py_DECREF(pathname);
if (fp)
fclose(fp);
- return ret;
-}
-
-static PyObject *
-imp_load_package(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject * ret;
- if (!PyArg_ParseTuple(args, "sO&:load_package",
- &name, PyUnicode_FSConverter, &pathname))
- return NULL;
- ret = load_package(name, PyBytes_AS_STRING(pathname));
- Py_DECREF(pathname);
- return ret;
-}
-
-static PyObject *
-imp_new_module(PyObject *self, PyObject *args)
-{
- char *name;
- if (!PyArg_ParseTuple(args, "s:new_module", &name))
- return NULL;
- return PyModule_New(name);
-}
-
-static PyObject *
-imp_reload(PyObject *self, PyObject *v)
-{
- return PyImport_ReloadModule(v);
-}
-
-PyDoc_STRVAR(doc_reload,
-"reload(module) -> module\n\
-\n\
-Reload the module. The module must have been successfully imported before.");
-
-static PyObject *
-imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws)
-{
- static char *kwlist[] = {"path", "debug_override", NULL};
-
- char *buf;
- PyObject *pathbytes;
- char *cpathname;
- PyObject *debug_override = NULL;
- int debug = !Py_OptimizeFlag;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kws, "O&|O", kwlist,
- PyUnicode_FSConverter, &pathbytes, &debug_override))
- return NULL;
-
- if (debug_override != NULL &&
- (debug = PyObject_IsTrue(debug_override)) < 0) {
- Py_DECREF(pathbytes);
- return NULL;
- }
-
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- cpathname = make_compiled_pathname(
- PyBytes_AS_STRING(pathbytes),
- buf, MAXPATHLEN+1, debug);
- Py_DECREF(pathbytes);
-
- if (cpathname == NULL) {
- PyErr_Format(PyExc_SystemError, "path buffer too short");
- PyMem_FREE(buf);
- return NULL;
- }
- {
- PyObject *ret = PyUnicode_DecodeFSDefault(buf);
- PyMem_FREE(buf);
- return ret;
- }
+ return mod;
}
-PyDoc_STRVAR(doc_cache_from_source,
-"cache_from_source(path, [debug_override]) -> path\n\
-Given the path to a .py file, return the path to its .pyc/.pyo file.\n\
-\n\
-The .py file does not need to exist; this simply returns the path to the\n\
-.pyc/.pyo file calculated as if the .py file were imported. The extension\n\
-will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\
-\n\
-If debug_override is not None, then it must be a boolean and is taken as\n\
-the value of __debug__ instead.");
-
-static PyObject *
-imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
-{
- static char *kwlist[] = {"path", NULL};
-
- PyObject *pathname_obj;
- char *pathname;
- char *buf;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kws, "O&", kwlist,
- PyUnicode_FSConverter, &pathname_obj))
- return NULL;
-
- pathname = PyBytes_AS_STRING(pathname_obj);
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- if (make_source_pathname(pathname, buf) == NULL) {
- PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %s",
- pathname);
- Py_DECREF(pathname_obj);
- PyMem_FREE(buf);
- return NULL;
- }
- Py_DECREF(pathname_obj);
- {
- PyObject *ret = PyUnicode_FromString(buf);
- PyMem_FREE(buf);
- return ret;
- }
-}
+#endif /* HAVE_DYNAMIC_LOADING */
-PyDoc_STRVAR(doc_source_from_cache,
-"source_from_cache(path) -> path\n\
-Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
-\n\
-The .pyc/.pyo file does not need to exist; this simply returns the path to\n\
-the .py file calculated to correspond to the .pyc/.pyo file. If path\n\
-does not conform to PEP 3147 format, ValueError will be raised.");
/* Doc strings */
PyDoc_STRVAR(doc_imp,
-"This module provides the components needed to build your own\n\
-__import__ function. Undocumented functions are obsolete.");
-
-PyDoc_STRVAR(doc_find_module,
-"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
-Search for a module. If path is omitted or None, search for a\n\
-built-in, frozen or special module and continue search in sys.path.\n\
-The module name cannot contain '.'; to search for a submodule of a\n\
-package, pass the submodule name and the package's __path__.");
-
-PyDoc_STRVAR(doc_load_module,
-"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
-Load a module, given information returned by find_module().\n\
-The module name must include the full package name, if any.");
-
-PyDoc_STRVAR(doc_get_magic,
-"get_magic() -> string\n\
-Return the magic number for .pyc or .pyo files.");
-
-PyDoc_STRVAR(doc_get_tag,
-"get_tag() -> string\n\
-Return the magic tag for .pyc or .pyo files.");
-
-PyDoc_STRVAR(doc_get_suffixes,
-"get_suffixes() -> [(suffix, mode, type), ...]\n\
-Return a list of (suffix, mode, type) tuples describing the files\n\
-that find_module() looks for.");
-
-PyDoc_STRVAR(doc_new_module,
-"new_module(name) -> module\n\
-Create a new module. Do not enter it in sys.modules.\n\
-The module name must include the full package name, if any.");
+"(Extremely) low-level import machinery bits as used by importlib and imp.");
+
+PyDoc_STRVAR(doc_extension_suffixes,
+"extension_suffixes() -> list of strings\n\
+Returns the list of file suffixes used to identify extension modules.");
PyDoc_STRVAR(doc_lock_held,
"lock_held() -> boolean\n\
@@ -3740,179 +1831,28 @@ Release the interpreter's import lock.\n\
On platforms without threads, this function does nothing.");
static PyMethodDef imp_methods[] = {
- {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
- {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
- {"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
- {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
- {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
- {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
+ {"extension_suffixes", imp_extension_suffixes, METH_NOARGS,
+ doc_extension_suffixes},
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
{"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
{"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
- {"reload", imp_reload, METH_O, doc_reload},
- {"cache_from_source", (PyCFunction)imp_cache_from_source,
- METH_VARARGS | METH_KEYWORDS, doc_cache_from_source},
- {"source_from_cache", (PyCFunction)imp_source_from_cache,
- METH_VARARGS | METH_KEYWORDS, doc_source_from_cache},
- /* The rest are obsolete */
{"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
{"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
{"init_builtin", imp_init_builtin, METH_VARARGS},
{"init_frozen", imp_init_frozen, METH_VARARGS},
{"is_builtin", imp_is_builtin, METH_VARARGS},
{"is_frozen", imp_is_frozen, METH_VARARGS},
- {"load_compiled", imp_load_compiled, METH_VARARGS},
#ifdef HAVE_DYNAMIC_LOADING
{"load_dynamic", imp_load_dynamic, METH_VARARGS},
#endif
- {"load_package", imp_load_package, METH_VARARGS},
- {"load_source", imp_load_source, METH_VARARGS},
+ {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS},
{NULL, NULL} /* sentinel */
};
-static int
-setint(PyObject *d, char *name, int value)
-{
- PyObject *v;
- int err;
-
- v = PyLong_FromLong((long)value);
- err = PyDict_SetItemString(d, name, v);
- Py_XDECREF(v);
- return err;
-}
-
-typedef struct {
- PyObject_HEAD
-} NullImporter;
-
-static int
-NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
-{
-#ifndef MS_WINDOWS
- PyObject *path;
- struct stat statbuf;
- int rv;
-
- if (!_PyArg_NoKeywords("NullImporter()", kwds))
- return -1;
-
- if (!PyArg_ParseTuple(args, "O&:NullImporter",
- PyUnicode_FSConverter, &path))
- return -1;
-
- if (PyBytes_GET_SIZE(path) == 0) {
- Py_DECREF(path);
- PyErr_SetString(PyExc_ImportError, "empty pathname");
- return -1;
- }
-
- rv = stat(PyBytes_AS_STRING(path), &statbuf);
- Py_DECREF(path);
- if (rv == 0) {
- /* it exists */
- if (S_ISDIR(statbuf.st_mode)) {
- /* it's a directory */
- PyErr_SetString(PyExc_ImportError, "existing directory");
- return -1;
- }
- }
-#else /* MS_WINDOWS */
- PyObject *pathobj;
- DWORD rv;
- wchar_t *path;
-
- if (!_PyArg_NoKeywords("NullImporter()", kwds))
- return -1;
-
- if (!PyArg_ParseTuple(args, "U:NullImporter",
- &pathobj))
- return -1;
-
- if (PyUnicode_GET_SIZE(pathobj) == 0) {
- PyErr_SetString(PyExc_ImportError, "empty pathname");
- return -1;
- }
-
- path = PyUnicode_AsWideCharString(pathobj, NULL);
- if (path == NULL)
- return -1;
- /* see issue1293 and issue3677:
- * stat() on Windows doesn't recognise paths like
- * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
- */
- rv = GetFileAttributesW(path);
- PyMem_Free(path);
- if (rv != INVALID_FILE_ATTRIBUTES) {
- /* it exists */
- if (rv & FILE_ATTRIBUTE_DIRECTORY) {
- /* it's a directory */
- PyErr_SetString(PyExc_ImportError, "existing directory");
- return -1;
- }
- }
-#endif
- return 0;
-}
-
-static PyObject *
-NullImporter_find_module(NullImporter *self, PyObject *args)
-{
- Py_RETURN_NONE;
-}
-
-static PyMethodDef NullImporter_methods[] = {
- {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
- "Always return None"
- },
- {NULL} /* Sentinel */
-};
-
-
-PyTypeObject PyNullImporter_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "imp.NullImporter", /*tp_name*/
- sizeof(NullImporter), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "Null importer object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- NullImporter_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)NullImporter_init, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
-};
static struct PyModuleDef impmodule = {
PyModuleDef_HEAD_INIT,
- "imp",
+ "_imp",
doc_imp,
0,
imp_methods,
@@ -3927,9 +1867,6 @@ PyInit_imp(void)
{
PyObject *m, *d;
- if (PyType_Ready(&PyNullImporter_Type) < 0)
- return NULL;
-
m = PyModule_Create(&impmodule);
if (m == NULL)
goto failure;
@@ -3937,19 +1874,6 @@ PyInit_imp(void)
if (d == NULL)
goto failure;
- if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
- if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
- if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
- if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
- if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
- if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
- if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
- if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
- if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
- if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
-
- Py_INCREF(&PyNullImporter_Type);
- PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
return m;
failure:
Py_XDECREF(m);
diff --git a/Python/importdl.c b/Python/importdl.c
index 9caed45..942e4b8 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -12,50 +12,73 @@
#include "importdl.h"
-extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
- const char *shortname,
+#ifdef MS_WINDOWS
+extern dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
+ PyObject *pathname, FILE *fp);
+#else
+extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp);
-
-
+#endif
PyObject *
-_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
+_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
{
- PyObject *m;
- PyObject *path;
- char *lastdot, *shortname, *packagecontext, *oldcontext;
+ PyObject *m = NULL;
+#ifndef MS_WINDOWS
+ PyObject *pathbytes;
+#endif
+ PyObject *nameascii;
+ char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;
dl_funcptr p0;
PyObject* (*p)(void);
struct PyModuleDef *def;
- PyObject *result;
-
- path = PyUnicode_DecodeFSDefault(pathname);
- if (path == NULL)
- return NULL;
- if ((m = _PyImport_FindExtensionUnicode(name, path)) != NULL) {
+ m = _PyImport_FindExtensionObject(name, path);
+ if (m != NULL) {
Py_INCREF(m);
- result = m;
- goto finally;
+ return m;
}
- lastdot = strrchr(name, '.');
+
+ /* name must be encodable to ASCII because dynamic module must have a
+ function called "PyInit_NAME", they are written in C, and the C language
+ doesn't accept non-ASCII identifiers. */
+ nameascii = PyUnicode_AsEncodedString(name, "ascii", NULL);
+ if (nameascii == NULL)
+ return NULL;
+
+ namestr = PyBytes_AS_STRING(nameascii);
+ if (namestr == NULL)
+ goto error;
+
+ lastdot = strrchr(namestr, '.');
if (lastdot == NULL) {
packagecontext = NULL;
- shortname = name;
+ shortname = namestr;
}
else {
- packagecontext = name;
+ packagecontext = namestr;
shortname = lastdot+1;
}
- p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
+#ifdef MS_WINDOWS
+ p0 = _PyImport_GetDynLoadWindows(shortname, path, fp);
+#else
+ pathbytes = PyUnicode_EncodeFSDefault(path);
+ if (pathbytes == NULL)
+ goto error;
+ p0 = _PyImport_GetDynLoadFunc(shortname,
+ PyBytes_AS_STRING(pathbytes), fp);
+ Py_DECREF(pathbytes);
+#endif
p = (PyObject*(*)(void))p0;
if (PyErr_Occurred())
goto error;
if (p == NULL) {
- PyErr_Format(PyExc_ImportError,
- "dynamic module does not define init function (PyInit_%.200s)",
- shortname);
+ PyObject *msg = PyUnicode_FromFormat("dynamic module does not define "
+ "init function (PyInit_%s)",
+ shortname);
+ PyErr_SetImportError(msg, name, path);
+ Py_DECREF(msg);
goto error;
}
oldcontext = _Py_PackageContext;
@@ -66,7 +89,6 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
goto error;
if (PyErr_Occurred()) {
- Py_DECREF(m);
PyErr_Format(PyExc_SystemError,
"initialization of %s raised unreported exception",
shortname);
@@ -83,20 +105,15 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
else
Py_INCREF(path);
- if (_PyImport_FixupExtensionUnicode(m, name, path) < 0)
+ if (_PyImport_FixupExtensionObject(m, name, path) < 0)
goto error;
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "import %s # dynamically loaded from %s\n",
- name, pathname);
- result = m;
- goto finally;
+ Py_DECREF(nameascii);
+ return m;
error:
- result = NULL;
-finally:
- Py_DECREF(path);
- return result;
+ Py_DECREF(nameascii);
+ Py_XDECREF(m);
+ return NULL;
}
#endif /* HAVE_DYNAMIC_LOADING */
diff --git a/Python/importdl.h b/Python/importdl.h
index b4d21be..6b9cf75 100644
--- a/Python/importdl.h
+++ b/Python/importdl.h
@@ -6,29 +6,9 @@ extern "C" {
#endif
-/* Definitions for dynamic loading of extension modules */
-enum filetype {
- SEARCH_ERROR,
- PY_SOURCE,
- PY_COMPILED,
- C_EXTENSION,
- PY_RESOURCE, /* Mac only */
- PKG_DIRECTORY,
- C_BUILTIN,
- PY_FROZEN,
- PY_CODERESOURCE, /* Mac only */
- IMP_HOOK
-};
-
-struct filedescr {
- char *suffix;
- char *mode;
- enum filetype type;
-};
-extern struct filedescr * _PyImport_Filetab;
-extern const struct filedescr _PyImport_DynLoadFiletab[];
-
-extern PyObject *_PyImport_LoadDynamicModule(char *name, char *pathname,
+extern const char *_PyImport_DynLoadFiletab[];
+
+extern PyObject *_PyImport_LoadDynamicModule(PyObject *name, PyObject *pathname,
FILE *);
/* Max length of module suffix searched for -- accommodates "module.slb" */
diff --git a/Python/importlib.h b/Python/importlib.h
new file mode 100644
index 0000000..dcd716f
--- /dev/null
+++ b/Python/importlib.h
@@ -0,0 +1,4404 @@
+/* Auto-generated by Modules/_freeze_importlib.c */
+unsigned char _Py_M__importlib[] = {
+ 99,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
+ 0,64,0,0,0,115,200,3,0,0,100,0,0,90,0,0,
+ 100,129,0,90,1,0,100,4,0,100,5,0,132,0,0,90,
+ 2,0,100,6,0,100,7,0,132,0,0,90,3,0,100,8,
+ 0,100,9,0,132,0,0,90,4,0,100,10,0,100,11,0,
+ 132,0,0,90,5,0,100,12,0,100,13,0,132,0,0,90,
+ 6,0,100,14,0,100,15,0,132,0,0,90,7,0,100,16,
+ 0,100,17,0,132,0,0,90,8,0,100,18,0,100,19,0,
+ 132,0,0,90,9,0,100,20,0,100,21,0,100,22,0,132,
+ 1,0,90,10,0,100,23,0,100,24,0,132,0,0,90,11,
+ 0,101,12,0,101,11,0,106,13,0,131,1,0,90,14,0,
+ 100,25,0,100,26,0,132,0,0,90,15,0,105,0,0,90,
+ 16,0,105,0,0,90,17,0,71,100,27,0,100,28,0,132,
+ 0,0,100,28,0,101,18,0,131,3,0,90,19,0,71,100,
+ 29,0,100,30,0,132,0,0,100,30,0,131,2,0,90,20,
+ 0,71,100,31,0,100,32,0,132,0,0,100,32,0,131,2,
+ 0,90,21,0,100,33,0,100,34,0,132,0,0,90,22,0,
+ 100,35,0,100,36,0,132,0,0,90,23,0,100,37,0,100,
+ 38,0,132,0,0,90,24,0,100,39,0,101,25,0,100,40,
+ 0,131,1,0,100,41,0,62,66,101,25,0,100,42,0,131,
+ 1,0,100,43,0,62,66,90,26,0,101,27,0,100,44,0,
+ 100,45,0,132,0,0,101,28,0,100,46,0,100,47,0,100,
+ 48,0,131,3,0,68,131,1,0,131,1,0,90,29,0,100,
+ 49,0,90,30,0,100,50,0,103,1,0,90,31,0,100,51,
+ 0,103,1,0,90,32,0,100,52,0,103,1,0,90,33,0,
+ 100,128,0,100,53,0,100,54,0,132,1,0,90,35,0,100,
+ 55,0,100,56,0,132,0,0,90,36,0,100,57,0,100,58,
+ 0,132,0,0,90,37,0,100,59,0,100,60,0,132,0,0,
+ 90,38,0,100,61,0,100,62,0,132,0,0,90,39,0,100,
+ 63,0,100,64,0,132,0,0,90,40,0,100,65,0,100,66,
+ 0,132,0,0,90,41,0,100,67,0,100,68,0,132,0,0,
+ 90,42,0,100,69,0,100,70,0,132,0,0,90,43,0,100,
+ 71,0,100,72,0,132,0,0,90,44,0,100,73,0,100,74,
+ 0,132,0,0,90,45,0,71,100,75,0,100,76,0,132,0,
+ 0,100,76,0,131,2,0,90,46,0,71,100,77,0,100,78,
+ 0,132,0,0,100,78,0,131,2,0,90,47,0,71,100,79,
+ 0,100,80,0,132,0,0,100,80,0,131,2,0,90,48,0,
+ 71,100,81,0,100,82,0,132,0,0,100,82,0,131,2,0,
+ 90,49,0,71,100,83,0,100,84,0,132,0,0,100,84,0,
+ 101,49,0,131,3,0,90,50,0,71,100,85,0,100,86,0,
+ 132,0,0,100,86,0,131,2,0,90,51,0,71,100,87,0,
+ 100,88,0,132,0,0,100,88,0,101,51,0,101,50,0,131,
+ 4,0,90,52,0,71,100,89,0,100,90,0,132,0,0,100,
+ 90,0,101,51,0,101,49,0,131,4,0,90,53,0,103,0,
+ 0,90,54,0,71,100,91,0,100,92,0,132,0,0,100,92,
+ 0,131,2,0,90,55,0,71,100,93,0,100,94,0,132,0,
+ 0,100,94,0,131,2,0,90,56,0,71,100,95,0,100,96,
+ 0,132,0,0,100,96,0,131,2,0,90,57,0,71,100,97,
+ 0,100,98,0,132,0,0,100,98,0,131,2,0,90,58,0,
+ 71,100,99,0,100,100,0,132,0,0,100,100,0,131,2,0,
+ 90,59,0,71,100,101,0,100,102,0,132,0,0,100,102,0,
+ 131,2,0,90,60,0,100,103,0,100,104,0,132,0,0,90,
+ 61,0,100,105,0,100,106,0,132,0,0,90,62,0,100,107,
+ 0,100,108,0,132,0,0,90,63,0,100,109,0,90,64,0,
+ 100,110,0,100,111,0,132,0,0,90,65,0,100,112,0,100,
+ 113,0,132,0,0,90,66,0,100,128,0,100,46,0,100,114,
+ 0,100,115,0,132,2,0,90,67,0,100,116,0,100,117,0,
+ 132,0,0,90,68,0,100,118,0,100,119,0,132,0,0,90,
+ 69,0,100,120,0,100,121,0,132,0,0,90,70,0,100,128,
+ 0,100,128,0,102,0,0,100,46,0,100,122,0,100,123,0,
+ 132,4,0,90,71,0,100,124,0,100,125,0,132,0,0,90,
+ 72,0,100,126,0,100,127,0,132,0,0,90,73,0,100,128,
+ 0,83,40,130,0,0,0,117,83,1,0,0,67,111,114,101,
+ 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,
+ 111,102,32,105,109,112,111,114,116,46,10,10,84,104,105,115,
+ 32,109,111,100,117,108,101,32,105,115,32,78,79,84,32,109,
+ 101,97,110,116,32,116,111,32,98,101,32,100,105,114,101,99,
+ 116,108,121,32,105,109,112,111,114,116,101,100,33,32,73,116,
+ 32,104,97,115,32,98,101,101,110,32,100,101,115,105,103,110,
+ 101,100,32,115,117,99,104,10,116,104,97,116,32,105,116,32,
+ 99,97,110,32,98,101,32,98,111,111,116,115,116,114,97,112,
+ 112,101,100,32,105,110,116,111,32,80,121,116,104,111,110,32,
+ 97,115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,
+ 97,116,105,111,110,32,111,102,32,105,109,112,111,114,116,46,
+ 32,65,115,10,115,117,99,104,32,105,116,32,114,101,113,117,
+ 105,114,101,115,32,116,104,101,32,105,110,106,101,99,116,105,
+ 111,110,32,111,102,32,115,112,101,99,105,102,105,99,32,109,
+ 111,100,117,108,101,115,32,97,110,100,32,97,116,116,114,105,
+ 98,117,116,101,115,32,105,110,32,111,114,100,101,114,32,116,
+ 111,10,119,111,114,107,46,32,79,110,101,32,115,104,111,117,
+ 108,100,32,117,115,101,32,105,109,112,111,114,116,108,105,98,
+ 32,97,115,32,116,104,101,32,112,117,98,108,105,99,45,102,
+ 97,99,105,110,103,32,118,101,114,115,105,111,110,32,111,102,
+ 32,116,104,105,115,32,109,111,100,117,108,101,46,10,10,117,
+ 3,0,0,0,119,105,110,117,6,0,0,0,99,121,103,119,
+ 105,110,117,6,0,0,0,100,97,114,119,105,110,99,0,0,
+ 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,
+ 0,0,115,49,0,0,0,116,0,0,106,1,0,106,2,0,
+ 116,3,0,131,1,0,114,33,0,100,1,0,100,2,0,132,
+ 0,0,125,0,0,110,12,0,100,3,0,100,2,0,132,0,
+ 0,125,0,0,124,0,0,83,40,4,0,0,0,78,99,0,
+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,83,
+ 0,0,0,115,13,0,0,0,100,1,0,116,0,0,106,1,
+ 0,107,6,0,83,40,2,0,0,0,117,53,0,0,0,84,
+ 114,117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,
+ 32,109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,
+ 32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,
+ 101,108,121,46,115,12,0,0,0,80,89,84,72,79,78,67,
+ 65,83,69,79,75,40,2,0,0,0,117,3,0,0,0,95,
+ 111,115,117,7,0,0,0,101,110,118,105,114,111,110,40,0,
+ 0,0,0,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 11,0,0,0,95,114,101,108,97,120,95,99,97,115,101,34,
+ 0,0,0,115,2,0,0,0,0,2,117,37,0,0,0,95,
+ 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,46,
+ 60,108,111,99,97,108,115,62,46,95,114,101,108,97,120,95,
+ 99,97,115,101,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,83,0,0,0,115,4,0,0,0,100,1,
+ 0,83,40,2,0,0,0,117,53,0,0,0,84,114,117,101,
+ 32,105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,
+ 115,116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,
+ 115,101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,
+ 46,70,40,1,0,0,0,117,5,0,0,0,70,97,108,115,
+ 101,40,0,0,0,0,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,11,0,0,0,95,114,101,108,97,120,95,99,97,
+ 115,101,38,0,0,0,115,2,0,0,0,0,2,40,4,0,
+ 0,0,117,3,0,0,0,115,121,115,117,8,0,0,0,112,
+ 108,97,116,102,111,114,109,117,10,0,0,0,115,116,97,114,
+ 116,115,119,105,116,104,117,27,0,0,0,95,67,65,83,69,
+ 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,
+ 84,70,79,82,77,83,40,1,0,0,0,117,11,0,0,0,
+ 95,114,101,108,97,120,95,99,97,115,101,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,16,0,0,0,95,109,97,107,
+ 101,95,114,101,108,97,120,95,99,97,115,101,32,0,0,0,
+ 115,8,0,0,0,0,1,18,1,15,4,12,3,117,16,0,
+ 0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,97,
+ 115,101,99,1,0,0,0,0,0,0,0,2,0,0,0,3,
+ 0,0,0,67,0,0,0,115,108,0,0,0,116,0,0,124,
+ 0,0,131,1,0,125,0,0,103,0,0,125,1,0,124,1,
+ 0,106,1,0,124,0,0,100,1,0,64,131,1,0,1,124,
+ 1,0,106,1,0,124,0,0,100,2,0,63,100,1,0,64,
+ 131,1,0,1,124,1,0,106,1,0,124,0,0,100,3,0,
+ 63,100,1,0,64,131,1,0,1,124,1,0,106,1,0,124,
+ 0,0,100,4,0,63,100,1,0,64,131,1,0,1,116,2,
+ 0,124,1,0,131,1,0,83,40,5,0,0,0,117,111,0,
+ 0,0,67,111,110,118,101,114,116,32,97,32,51,50,45,98,
+ 105,116,32,105,110,116,101,103,101,114,32,116,111,32,108,105,
+ 116,116,108,101,45,101,110,100,105,97,110,46,10,10,32,32,
+ 32,32,88,88,88,32,84,101,109,112,111,114,97,114,121,32,
+ 117,110,116,105,108,32,109,97,114,115,104,97,108,39,115,32,
+ 108,111,110,103,32,102,117,110,99,116,105,111,110,115,32,97,
+ 114,101,32,101,120,112,111,115,101,100,46,10,10,32,32,32,
+ 32,105,255,0,0,0,105,8,0,0,0,105,16,0,0,0,
+ 105,24,0,0,0,40,3,0,0,0,117,3,0,0,0,105,
+ 110,116,117,6,0,0,0,97,112,112,101,110,100,117,9,0,
+ 0,0,98,121,116,101,97,114,114,97,121,40,2,0,0,0,
+ 117,1,0,0,0,120,117,9,0,0,0,105,110,116,95,98,
+ 121,116,101,115,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,7,0,0,0,95,119,95,108,111,110,103,45,0,0,0,
+ 115,14,0,0,0,0,6,12,1,6,1,17,1,21,1,21,
+ 1,21,1,117,7,0,0,0,95,119,95,108,111,110,103,99,
+ 1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
+ 67,0,0,0,115,68,0,0,0,124,0,0,100,1,0,25,
+ 125,1,0,124,1,0,124,0,0,100,2,0,25,100,3,0,
+ 62,79,125,1,0,124,1,0,124,0,0,100,4,0,25,100,
+ 5,0,62,79,125,1,0,124,1,0,124,0,0,100,6,0,
+ 25,100,7,0,62,79,125,1,0,124,1,0,83,40,8,0,
+ 0,0,117,115,0,0,0,67,111,110,118,101,114,116,32,52,
+ 32,98,121,116,101,115,32,105,110,32,108,105,116,116,108,101,
+ 45,101,110,100,105,97,110,32,116,111,32,97,110,32,105,110,
+ 116,101,103,101,114,46,10,10,32,32,32,32,88,88,88,32,
+ 84,101,109,112,111,114,97,114,121,32,117,110,116,105,108,32,
+ 109,97,114,115,104,97,108,39,115,32,108,111,110,103,32,102,
+ 117,110,99,116,105,111,110,32,97,114,101,32,101,120,112,111,
+ 115,101,100,46,10,10,32,32,32,32,105,0,0,0,0,105,
+ 1,0,0,0,105,8,0,0,0,105,2,0,0,0,105,16,
+ 0,0,0,105,3,0,0,0,105,24,0,0,0,40,0,0,
+ 0,0,40,2,0,0,0,117,9,0,0,0,105,110,116,95,
+ 98,121,116,101,115,117,1,0,0,0,120,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,7,0,0,0,95,114,95,108,
+ 111,110,103,61,0,0,0,115,10,0,0,0,0,6,10,1,
+ 18,1,18,1,18,1,117,7,0,0,0,95,114,95,108,111,
+ 110,103,99,0,0,0,0,0,0,0,0,3,0,0,0,4,
+ 0,0,0,71,0,0,0,115,103,0,0,0,103,0,0,125,
+ 1,0,120,71,0,124,0,0,68,93,63,0,125,2,0,124,
+ 2,0,115,31,0,113,13,0,110,0,0,124,1,0,106,0,
+ 0,124,2,0,131,1,0,1,124,2,0,100,4,0,25,116,
+ 1,0,107,7,0,114,13,0,124,1,0,106,0,0,116,2,
+ 0,131,1,0,1,113,13,0,113,13,0,87,100,2,0,106,
+ 3,0,124,1,0,100,3,0,100,5,0,133,2,0,25,131,
+ 1,0,83,40,6,0,0,0,117,31,0,0,0,82,101,112,
+ 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,
+ 112,97,116,104,46,106,111,105,110,40,41,46,105,1,0,0,
+ 0,117,0,0,0,0,78,105,255,255,255,255,105,255,255,255,
+ 255,40,4,0,0,0,117,6,0,0,0,97,112,112,101,110,
+ 100,117,15,0,0,0,112,97,116,104,95,115,101,112,97,114,
+ 97,116,111,114,115,117,8,0,0,0,112,97,116,104,95,115,
+ 101,112,117,4,0,0,0,106,111,105,110,40,3,0,0,0,
+ 117,10,0,0,0,112,97,116,104,95,112,97,114,116,115,117,
+ 9,0,0,0,110,101,119,95,112,97,114,116,115,117,4,0,
+ 0,0,112,97,114,116,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,10,0,0,0,95,112,97,116,104,95,106,111,105,
+ 110,74,0,0,0,115,16,0,0,0,0,2,6,1,13,1,
+ 6,1,6,1,13,1,16,1,20,1,117,10,0,0,0,95,
+ 112,97,116,104,95,106,111,105,110,99,1,0,0,0,0,0,
+ 0,0,6,0,0,0,3,0,0,0,67,0,0,0,115,85,
+ 0,0,0,120,48,0,116,0,0,124,0,0,131,1,0,68,
+ 93,28,0,125,1,0,124,1,0,116,1,0,107,6,0,114,
+ 13,0,124,1,0,125,2,0,80,113,13,0,113,13,0,87,
+ 116,2,0,125,2,0,124,0,0,106,3,0,124,2,0,131,
+ 1,0,92,3,0,125,3,0,125,4,0,125,5,0,124,3,
+ 0,124,5,0,102,2,0,83,40,1,0,0,0,117,32,0,
+ 0,0,82,101,112,108,97,99,101,109,101,110,116,32,102,111,
+ 114,32,111,115,46,112,97,116,104,46,115,112,108,105,116,40,
+ 41,46,40,4,0,0,0,117,8,0,0,0,114,101,118,101,
+ 114,115,101,100,117,15,0,0,0,112,97,116,104,95,115,101,
+ 112,97,114,97,116,111,114,115,117,8,0,0,0,112,97,116,
+ 104,95,115,101,112,117,10,0,0,0,114,112,97,114,116,105,
+ 116,105,111,110,40,6,0,0,0,117,4,0,0,0,112,97,
+ 116,104,117,1,0,0,0,120,117,3,0,0,0,115,101,112,
+ 117,5,0,0,0,102,114,111,110,116,117,1,0,0,0,95,
+ 117,4,0,0,0,116,97,105,108,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,95,112,97,116,104,95,
+ 115,112,108,105,116,86,0,0,0,115,14,0,0,0,0,2,
+ 19,1,12,1,6,1,8,2,6,1,24,1,117,11,0,0,
+ 0,95,112,97,116,104,95,115,112,108,105,116,99,2,0,0,
+ 0,0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,
+ 0,115,61,0,0,0,121,19,0,116,0,0,106,1,0,124,
+ 0,0,131,1,0,125,2,0,87,110,22,0,4,116,2,0,
+ 107,10,0,114,43,0,1,1,1,100,2,0,83,89,110,1,
+ 0,88,124,2,0,106,4,0,100,1,0,64,124,1,0,107,
+ 2,0,83,40,3,0,0,0,117,49,0,0,0,84,101,115,
+ 116,32,119,104,101,116,104,101,114,32,116,104,101,32,112,97,
+ 116,104,32,105,115,32,116,104,101,32,115,112,101,99,105,102,
+ 105,101,100,32,109,111,100,101,32,116,121,112,101,46,105,0,
+ 240,0,0,70,40,5,0,0,0,117,3,0,0,0,95,111,
+ 115,117,4,0,0,0,115,116,97,116,117,7,0,0,0,79,
+ 83,69,114,114,111,114,117,5,0,0,0,70,97,108,115,101,
+ 117,7,0,0,0,115,116,95,109,111,100,101,40,3,0,0,
+ 0,117,4,0,0,0,112,97,116,104,117,4,0,0,0,109,
+ 111,100,101,117,9,0,0,0,115,116,97,116,95,105,110,102,
+ 111,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,18,0,
+ 0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95,
+ 116,121,112,101,98,0,0,0,115,10,0,0,0,0,2,3,
+ 1,19,1,13,1,9,1,117,18,0,0,0,95,112,97,116,
+ 104,95,105,115,95,109,111,100,101,95,116,121,112,101,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
+ 0,0,0,115,13,0,0,0,116,0,0,124,0,0,100,1,
+ 0,131,2,0,83,40,2,0,0,0,117,31,0,0,0,82,
+ 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111,
+ 115,46,112,97,116,104,46,105,115,102,105,108,101,46,105,0,
+ 128,0,0,40,1,0,0,0,117,18,0,0,0,95,112,97,
+ 116,104,95,105,115,95,109,111,100,101,95,116,121,112,101,40,
+ 1,0,0,0,117,4,0,0,0,112,97,116,104,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,12,0,0,0,95,112,
+ 97,116,104,95,105,115,102,105,108,101,108,0,0,0,115,2,
+ 0,0,0,0,2,117,12,0,0,0,95,112,97,116,104,95,
+ 105,115,102,105,108,101,99,1,0,0,0,0,0,0,0,1,
+ 0,0,0,3,0,0,0,67,0,0,0,115,34,0,0,0,
+ 124,0,0,115,21,0,116,0,0,106,1,0,131,0,0,125,
+ 0,0,110,0,0,116,2,0,124,0,0,100,1,0,131,2,
+ 0,83,40,2,0,0,0,117,30,0,0,0,82,101,112,108,
+ 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,
+ 97,116,104,46,105,115,100,105,114,46,105,0,64,0,0,40,
+ 3,0,0,0,117,3,0,0,0,95,111,115,117,6,0,0,
+ 0,103,101,116,99,119,100,117,18,0,0,0,95,112,97,116,
+ 104,95,105,115,95,109,111,100,101,95,116,121,112,101,40,1,
+ 0,0,0,117,4,0,0,0,112,97,116,104,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,11,0,0,0,95,112,97,
+ 116,104,95,105,115,100,105,114,114,0,0,0,115,6,0,0,
+ 0,0,2,6,1,15,1,117,11,0,0,0,95,112,97,116,
+ 104,95,105,115,100,105,114,105,182,1,0,0,99,3,0,0,
+ 0,0,0,0,0,6,0,0,0,17,0,0,0,67,0,0,
+ 0,115,192,0,0,0,100,1,0,106,0,0,124,0,0,116,
+ 1,0,124,0,0,131,1,0,131,2,0,125,3,0,116,2,
+ 0,106,3,0,124,3,0,116,2,0,106,4,0,116,2,0,
+ 106,5,0,66,116,2,0,106,6,0,66,124,2,0,100,2,
+ 0,64,131,3,0,125,4,0,121,60,0,116,7,0,106,8,
+ 0,124,4,0,100,3,0,131,2,0,143,20,0,125,5,0,
+ 124,5,0,106,9,0,124,1,0,131,1,0,1,87,100,4,
+ 0,81,88,116,2,0,106,10,0,124,3,0,124,0,0,131,
+ 2,0,1,87,110,59,0,4,116,11,0,107,10,0,114,187,
+ 0,1,1,1,121,17,0,116,2,0,106,12,0,124,3,0,
+ 131,1,0,1,87,110,18,0,4,116,11,0,107,10,0,114,
+ 179,0,1,1,1,89,110,1,0,88,130,0,0,89,110,1,
+ 0,88,100,4,0,83,40,5,0,0,0,117,162,0,0,0,
+ 66,101,115,116,45,101,102,102,111,114,116,32,102,117,110,99,
+ 116,105,111,110,32,116,111,32,119,114,105,116,101,32,100,97,
+ 116,97,32,116,111,32,97,32,112,97,116,104,32,97,116,111,
+ 109,105,99,97,108,108,121,46,10,32,32,32,32,66,101,32,
+ 112,114,101,112,97,114,101,100,32,116,111,32,104,97,110,100,
+ 108,101,32,97,32,70,105,108,101,69,120,105,115,116,115,69,
+ 114,114,111,114,32,105,102,32,99,111,110,99,117,114,114,101,
+ 110,116,32,119,114,105,116,105,110,103,32,111,102,32,116,104,
+ 101,10,32,32,32,32,116,101,109,112,111,114,97,114,121,32,
+ 102,105,108,101,32,105,115,32,97,116,116,101,109,112,116,101,
+ 100,46,117,5,0,0,0,123,125,46,123,125,105,182,1,0,
+ 0,117,2,0,0,0,119,98,78,40,13,0,0,0,117,6,
+ 0,0,0,102,111,114,109,97,116,117,2,0,0,0,105,100,
+ 117,3,0,0,0,95,111,115,117,4,0,0,0,111,112,101,
+ 110,117,6,0,0,0,79,95,69,88,67,76,117,7,0,0,
+ 0,79,95,67,82,69,65,84,117,8,0,0,0,79,95,87,
+ 82,79,78,76,89,117,3,0,0,0,95,105,111,117,6,0,
+ 0,0,70,105,108,101,73,79,117,5,0,0,0,119,114,105,
+ 116,101,117,7,0,0,0,114,101,112,108,97,99,101,117,7,
+ 0,0,0,79,83,69,114,114,111,114,117,6,0,0,0,117,
+ 110,108,105,110,107,40,6,0,0,0,117,4,0,0,0,112,
+ 97,116,104,117,4,0,0,0,100,97,116,97,117,4,0,0,
+ 0,109,111,100,101,117,8,0,0,0,112,97,116,104,95,116,
+ 109,112,117,2,0,0,0,102,100,117,4,0,0,0,102,105,
+ 108,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,13,
+ 0,0,0,95,119,114,105,116,101,95,97,116,111,109,105,99,
+ 121,0,0,0,115,26,0,0,0,0,5,24,1,9,1,33,
+ 1,3,3,21,1,19,1,20,1,13,1,3,1,17,1,13,
+ 1,5,1,117,13,0,0,0,95,119,114,105,116,101,95,97,
+ 116,111,109,105,99,99,2,0,0,0,0,0,0,0,3,0,
+ 0,0,7,0,0,0,67,0,0,0,115,95,0,0,0,120,
+ 69,0,100,1,0,100,2,0,100,3,0,100,4,0,103,4,
+ 0,68,93,49,0,125,2,0,116,0,0,124,1,0,124,2,
+ 0,131,2,0,114,19,0,116,1,0,124,0,0,124,2,0,
+ 116,2,0,124,1,0,124,2,0,131,2,0,131,3,0,1,
+ 113,19,0,113,19,0,87,124,0,0,106,3,0,106,4,0,
+ 124,1,0,106,3,0,131,1,0,1,100,5,0,83,40,6,
+ 0,0,0,117,47,0,0,0,83,105,109,112,108,101,32,115,
+ 117,98,115,116,105,116,117,116,101,32,102,111,114,32,102,117,
+ 110,99,116,111,111,108,115,46,117,112,100,97,116,101,95,119,
+ 114,97,112,112,101,114,46,117,10,0,0,0,95,95,109,111,
+ 100,117,108,101,95,95,117,8,0,0,0,95,95,110,97,109,
+ 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,
+ 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,
+ 78,40,5,0,0,0,117,7,0,0,0,104,97,115,97,116,
+ 116,114,117,7,0,0,0,115,101,116,97,116,116,114,117,7,
+ 0,0,0,103,101,116,97,116,116,114,117,8,0,0,0,95,
+ 95,100,105,99,116,95,95,117,6,0,0,0,117,112,100,97,
+ 116,101,40,3,0,0,0,117,3,0,0,0,110,101,119,117,
+ 3,0,0,0,111,108,100,117,7,0,0,0,114,101,112,108,
+ 97,99,101,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 5,0,0,0,95,119,114,97,112,143,0,0,0,115,8,0,
+ 0,0,0,2,25,1,15,1,32,1,117,5,0,0,0,95,
+ 119,114,97,112,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,2,0,0,0,67,0,0,0,115,16,0,0,0,116,0,
+ 0,116,1,0,131,1,0,124,0,0,131,1,0,83,40,1,
+ 0,0,0,117,75,0,0,0,67,114,101,97,116,101,32,97,
+ 32,110,101,119,32,109,111,100,117,108,101,46,10,10,32,32,
+ 32,32,84,104,101,32,109,111,100,117,108,101,32,105,115,32,
+ 110,111,116,32,101,110,116,101,114,101,100,32,105,110,116,111,
+ 32,115,121,115,46,109,111,100,117,108,101,115,46,10,10,32,
+ 32,32,32,40,2,0,0,0,117,4,0,0,0,116,121,112,
+ 101,117,3,0,0,0,95,105,111,40,1,0,0,0,117,4,
+ 0,0,0,110,97,109,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,10,0,0,0,110,101,119,95,109,111,100,117,
+ 108,101,154,0,0,0,115,2,0,0,0,0,6,117,10,0,
+ 0,0,110,101,119,95,109,111,100,117,108,101,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,66,0,0,
+ 0,115,20,0,0,0,124,0,0,69,101,0,0,90,1,0,
+ 100,0,0,90,2,0,100,1,0,83,40,2,0,0,0,117,
+ 14,0,0,0,95,68,101,97,100,108,111,99,107,69,114,114,
+ 111,114,78,40,3,0,0,0,117,8,0,0,0,95,95,110,
+ 97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,
+ 108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,
+ 97,109,101,95,95,40,1,0,0,0,117,10,0,0,0,95,
+ 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,14,0,0,0,95,68,101,97,100,108,
+ 111,99,107,69,114,114,111,114,171,0,0,0,115,2,0,0,
+ 0,16,1,117,14,0,0,0,95,68,101,97,100,108,111,99,
+ 107,69,114,114,111,114,99,1,0,0,0,0,0,0,0,1,
+ 0,0,0,2,0,0,0,66,0,0,0,115,86,0,0,0,
+ 124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,
+ 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,
+ 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6,
+ 0,100,7,0,132,0,0,90,6,0,100,8,0,100,9,0,
+ 132,0,0,90,7,0,100,10,0,100,11,0,132,0,0,90,
+ 8,0,100,12,0,83,40,13,0,0,0,117,11,0,0,0,
+ 95,77,111,100,117,108,101,76,111,99,107,117,169,0,0,0,
+ 65,32,114,101,99,117,114,115,105,118,101,32,108,111,99,107,
+ 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,
+ 119,104,105,99,104,32,105,115,32,97,98,108,101,32,116,111,
+ 32,100,101,116,101,99,116,32,100,101,97,100,108,111,99,107,
+ 115,10,32,32,32,32,40,101,46,103,46,32,116,104,114,101,
+ 97,100,32,49,32,116,114,121,105,110,103,32,116,111,32,116,
+ 97,107,101,32,108,111,99,107,115,32,65,32,116,104,101,110,
+ 32,66,44,32,97,110,100,32,116,104,114,101,97,100,32,50,
+ 32,116,114,121,105,110,103,32,116,111,10,32,32,32,32,116,
+ 97,107,101,32,108,111,99,107,115,32,66,32,116,104,101,110,
+ 32,65,41,46,10,32,32,32,32,99,2,0,0,0,0,0,
+ 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,70,
+ 0,0,0,116,0,0,106,1,0,131,0,0,124,0,0,95,
+ 2,0,116,0,0,106,1,0,131,0,0,124,0,0,95,3,
+ 0,124,1,0,124,0,0,95,4,0,100,0,0,124,0,0,
+ 95,6,0,100,1,0,124,0,0,95,7,0,100,1,0,124,
+ 0,0,95,8,0,100,0,0,83,40,2,0,0,0,78,105,
+ 0,0,0,0,40,9,0,0,0,117,7,0,0,0,95,116,
+ 104,114,101,97,100,117,13,0,0,0,97,108,108,111,99,97,
+ 116,101,95,108,111,99,107,117,4,0,0,0,108,111,99,107,
+ 117,6,0,0,0,119,97,107,101,117,112,117,4,0,0,0,
+ 110,97,109,101,117,4,0,0,0,78,111,110,101,117,5,0,
+ 0,0,111,119,110,101,114,117,5,0,0,0,99,111,117,110,
+ 116,117,7,0,0,0,119,97,105,116,101,114,115,40,2,0,
+ 0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,
+ 110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,181,0,0,
+ 0,115,12,0,0,0,0,1,15,1,15,1,9,1,9,1,
+ 9,1,117,20,0,0,0,95,77,111,100,117,108,101,76,111,
+ 99,107,46,95,95,105,110,105,116,95,95,99,1,0,0,0,
+ 0,0,0,0,4,0,0,0,2,0,0,0,67,0,0,0,
+ 115,87,0,0,0,116,0,0,106,1,0,131,0,0,125,1,
+ 0,124,0,0,106,2,0,125,2,0,120,59,0,116,3,0,
+ 106,4,0,124,2,0,131,1,0,125,3,0,124,3,0,100,
+ 0,0,107,8,0,114,55,0,100,1,0,83,124,3,0,106,
+ 2,0,125,2,0,124,2,0,124,1,0,107,2,0,114,24,
+ 0,100,2,0,83,113,24,0,100,0,0,83,40,3,0,0,
+ 0,78,70,84,40,8,0,0,0,117,7,0,0,0,95,116,
+ 104,114,101,97,100,117,9,0,0,0,103,101,116,95,105,100,
+ 101,110,116,117,5,0,0,0,111,119,110,101,114,117,12,0,
+ 0,0,95,98,108,111,99,107,105,110,103,95,111,110,117,3,
+ 0,0,0,103,101,116,117,4,0,0,0,78,111,110,101,117,
+ 5,0,0,0,70,97,108,115,101,117,4,0,0,0,84,114,
+ 117,101,40,4,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,2,0,0,0,109,101,117,3,0,0,0,116,105,100,117,
+ 4,0,0,0,108,111,99,107,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,12,0,0,0,104,97,115,95,100,101,97,
+ 100,108,111,99,107,189,0,0,0,115,18,0,0,0,0,2,
+ 12,1,9,1,3,1,15,1,12,1,4,1,9,1,12,1,
+ 117,24,0,0,0,95,77,111,100,117,108,101,76,111,99,107,
+ 46,104,97,115,95,100,101,97,100,108,111,99,107,99,1,0,
+ 0,0,0,0,0,0,2,0,0,0,17,0,0,0,67,0,
+ 0,0,115,214,0,0,0,116,0,0,106,1,0,131,0,0,
+ 125,1,0,124,0,0,116,2,0,124,1,0,60,122,177,0,
+ 120,170,0,124,0,0,106,3,0,143,130,0,1,124,0,0,
+ 106,4,0,100,1,0,107,2,0,115,68,0,124,0,0,106,
+ 5,0,124,1,0,107,2,0,114,96,0,124,1,0,124,0,
+ 0,95,5,0,124,0,0,4,106,4,0,100,2,0,55,2,
+ 95,4,0,100,5,0,83,124,0,0,106,7,0,131,0,0,
+ 114,127,0,116,8,0,100,3,0,124,0,0,22,131,1,0,
+ 130,1,0,110,0,0,124,0,0,106,9,0,106,10,0,100,
+ 6,0,131,1,0,114,163,0,124,0,0,4,106,12,0,100,
+ 2,0,55,2,95,12,0,110,0,0,87,100,4,0,81,88,
+ 124,0,0,106,9,0,106,10,0,131,0,0,1,124,0,0,
+ 106,9,0,106,13,0,131,0,0,1,113,28,0,87,100,4,
+ 0,116,2,0,124,1,0,61,88,100,4,0,83,40,7,0,
+ 0,0,117,185,0,0,0,10,32,32,32,32,32,32,32,32,
+ 65,99,113,117,105,114,101,32,116,104,101,32,109,111,100,117,
+ 108,101,32,108,111,99,107,46,32,32,73,102,32,97,32,112,
+ 111,116,101,110,116,105,97,108,32,100,101,97,100,108,111,99,
+ 107,32,105,115,32,100,101,116,101,99,116,101,100,44,10,32,
+ 32,32,32,32,32,32,32,97,32,95,68,101,97,100,108,111,
+ 99,107,69,114,114,111,114,32,105,115,32,114,97,105,115,101,
+ 100,46,10,32,32,32,32,32,32,32,32,79,116,104,101,114,
+ 119,105,115,101,44,32,116,104,101,32,108,111,99,107,32,105,
+ 115,32,97,108,119,97,121,115,32,97,99,113,117,105,114,101,
+ 100,32,97,110,100,32,84,114,117,101,32,105,115,32,114,101,
+ 116,117,114,110,101,100,46,10,32,32,32,32,32,32,32,32,
+ 105,0,0,0,0,105,1,0,0,0,117,23,0,0,0,100,
+ 101,97,100,108,111,99,107,32,100,101,116,101,99,116,101,100,
+ 32,98,121,32,37,114,78,84,70,40,14,0,0,0,117,7,
+ 0,0,0,95,116,104,114,101,97,100,117,9,0,0,0,103,
+ 101,116,95,105,100,101,110,116,117,12,0,0,0,95,98,108,
+ 111,99,107,105,110,103,95,111,110,117,4,0,0,0,108,111,
+ 99,107,117,5,0,0,0,99,111,117,110,116,117,5,0,0,
+ 0,111,119,110,101,114,117,4,0,0,0,84,114,117,101,117,
+ 12,0,0,0,104,97,115,95,100,101,97,100,108,111,99,107,
+ 117,14,0,0,0,95,68,101,97,100,108,111,99,107,69,114,
+ 114,111,114,117,6,0,0,0,119,97,107,101,117,112,117,7,
+ 0,0,0,97,99,113,117,105,114,101,117,5,0,0,0,70,
+ 97,108,115,101,117,7,0,0,0,119,97,105,116,101,114,115,
+ 117,7,0,0,0,114,101,108,101,97,115,101,40,2,0,0,
+ 0,117,4,0,0,0,115,101,108,102,117,3,0,0,0,116,
+ 105,100,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,7,
+ 0,0,0,97,99,113,117,105,114,101,201,0,0,0,115,32,
+ 0,0,0,0,6,12,1,10,1,3,1,3,1,10,1,30,
+ 1,9,1,15,1,4,1,12,1,19,1,18,1,24,2,13,
+ 1,20,2,117,19,0,0,0,95,77,111,100,117,108,101,76,
+ 111,99,107,46,97,99,113,117,105,114,101,99,1,0,0,0,
+ 0,0,0,0,2,0,0,0,10,0,0,0,67,0,0,0,
+ 115,165,0,0,0,116,0,0,106,1,0,131,0,0,125,1,
+ 0,124,0,0,106,2,0,143,138,0,1,124,0,0,106,3,
+ 0,124,1,0,107,3,0,114,52,0,116,4,0,100,1,0,
+ 131,1,0,130,1,0,110,0,0,124,0,0,106,5,0,100,
+ 2,0,107,4,0,115,73,0,116,6,0,130,1,0,124,0,
+ 0,4,106,5,0,100,3,0,56,2,95,5,0,124,0,0,
+ 106,5,0,100,2,0,107,2,0,114,155,0,100,0,0,124,
+ 0,0,95,3,0,124,0,0,106,8,0,114,155,0,124,0,
+ 0,4,106,8,0,100,3,0,56,2,95,8,0,124,0,0,
+ 106,9,0,106,10,0,131,0,0,1,113,155,0,110,0,0,
+ 87,100,0,0,81,88,100,0,0,83,40,4,0,0,0,78,
+ 117,31,0,0,0,99,97,110,110,111,116,32,114,101,108,101,
+ 97,115,101,32,117,110,45,97,99,113,117,105,114,101,100,32,
+ 108,111,99,107,105,0,0,0,0,105,1,0,0,0,40,11,
+ 0,0,0,117,7,0,0,0,95,116,104,114,101,97,100,117,
+ 9,0,0,0,103,101,116,95,105,100,101,110,116,117,4,0,
+ 0,0,108,111,99,107,117,5,0,0,0,111,119,110,101,114,
+ 117,12,0,0,0,82,117,110,116,105,109,101,69,114,114,111,
+ 114,117,5,0,0,0,99,111,117,110,116,117,14,0,0,0,
+ 65,115,115,101,114,116,105,111,110,69,114,114,111,114,117,4,
+ 0,0,0,78,111,110,101,117,7,0,0,0,119,97,105,116,
+ 101,114,115,117,6,0,0,0,119,97,107,101,117,112,117,7,
+ 0,0,0,114,101,108,101,97,115,101,40,2,0,0,0,117,
+ 4,0,0,0,115,101,108,102,117,3,0,0,0,116,105,100,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,7,0,0,
+ 0,114,101,108,101,97,115,101,226,0,0,0,115,22,0,0,
+ 0,0,1,12,1,10,1,15,1,15,1,21,1,15,1,15,
+ 1,9,1,9,1,15,1,117,19,0,0,0,95,77,111,100,
+ 117,108,101,76,111,99,107,46,114,101,108,101,97,115,101,99,
+ 1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,
+ 67,0,0,0,115,23,0,0,0,100,1,0,124,0,0,106,
+ 0,0,116,1,0,124,0,0,131,1,0,102,2,0,22,83,
+ 40,2,0,0,0,78,117,21,0,0,0,95,77,111,100,117,
+ 108,101,76,111,99,107,40,37,114,41,32,97,116,32,37,100,
+ 40,2,0,0,0,117,4,0,0,0,110,97,109,101,117,2,
+ 0,0,0,105,100,40,1,0,0,0,117,4,0,0,0,115,
+ 101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 8,0,0,0,95,95,114,101,112,114,95,95,239,0,0,0,
+ 115,2,0,0,0,0,1,117,20,0,0,0,95,77,111,100,
+ 117,108,101,76,111,99,107,46,95,95,114,101,112,114,95,95,
+ 78,40,9,0,0,0,117,8,0,0,0,95,95,110,97,109,
+ 101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,
+ 95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,
+ 101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,117,
+ 8,0,0,0,95,95,105,110,105,116,95,95,117,12,0,0,
+ 0,104,97,115,95,100,101,97,100,108,111,99,107,117,7,0,
+ 0,0,97,99,113,117,105,114,101,117,7,0,0,0,114,101,
+ 108,101,97,115,101,117,8,0,0,0,95,95,114,101,112,114,
+ 95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,11,0,0,0,95,77,111,100,117,108,101,76,111,
+ 99,107,175,0,0,0,115,12,0,0,0,16,4,6,2,12,
+ 8,12,12,12,25,12,13,117,11,0,0,0,95,77,111,100,
+ 117,108,101,76,111,99,107,99,1,0,0,0,0,0,0,0,
+ 1,0,0,0,2,0,0,0,66,0,0,0,115,74,0,0,
+ 0,124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,
+ 0,100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,
+ 90,4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,
+ 6,0,100,7,0,132,0,0,90,6,0,100,8,0,100,9,
+ 0,132,0,0,90,7,0,100,10,0,83,40,11,0,0,0,
+ 117,16,0,0,0,95,68,117,109,109,121,77,111,100,117,108,
+ 101,76,111,99,107,117,86,0,0,0,65,32,115,105,109,112,
+ 108,101,32,95,77,111,100,117,108,101,76,111,99,107,32,101,
+ 113,117,105,118,97,108,101,110,116,32,102,111,114,32,80,121,
+ 116,104,111,110,32,98,117,105,108,100,115,32,119,105,116,104,
+ 111,117,116,10,32,32,32,32,109,117,108,116,105,45,116,104,
+ 114,101,97,100,105,110,103,32,115,117,112,112,111,114,116,46,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
+ 0,67,0,0,0,115,22,0,0,0,124,1,0,124,0,0,
+ 95,0,0,100,1,0,124,0,0,95,1,0,100,0,0,83,
+ 40,2,0,0,0,78,105,0,0,0,0,40,2,0,0,0,
+ 117,4,0,0,0,110,97,109,101,117,5,0,0,0,99,111,
+ 117,110,116,40,2,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,4,0,0,0,110,97,109,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,105,
+ 116,95,95,247,0,0,0,115,4,0,0,0,0,1,9,1,
+ 117,25,0,0,0,95,68,117,109,109,121,77,111,100,117,108,
+ 101,76,111,99,107,46,95,95,105,110,105,116,95,95,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
+ 0,0,0,115,19,0,0,0,124,0,0,4,106,0,0,100,
+ 1,0,55,2,95,0,0,100,2,0,83,40,3,0,0,0,
+ 78,105,1,0,0,0,84,40,2,0,0,0,117,5,0,0,
+ 0,99,111,117,110,116,117,4,0,0,0,84,114,117,101,40,
+ 1,0,0,0,117,4,0,0,0,115,101,108,102,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,7,0,0,0,97,99,
+ 113,117,105,114,101,251,0,0,0,115,4,0,0,0,0,1,
+ 15,1,117,24,0,0,0,95,68,117,109,109,121,77,111,100,
+ 117,108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,
+ 1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,
+ 67,0,0,0,115,49,0,0,0,124,0,0,106,0,0,100,
+ 1,0,107,2,0,114,30,0,116,1,0,100,2,0,131,1,
+ 0,130,1,0,110,0,0,124,0,0,4,106,0,0,100,3,
+ 0,56,2,95,0,0,100,0,0,83,40,4,0,0,0,78,
+ 105,0,0,0,0,117,31,0,0,0,99,97,110,110,111,116,
+ 32,114,101,108,101,97,115,101,32,117,110,45,97,99,113,117,
+ 105,114,101,100,32,108,111,99,107,105,1,0,0,0,40,2,
+ 0,0,0,117,5,0,0,0,99,111,117,110,116,117,12,0,
+ 0,0,82,117,110,116,105,109,101,69,114,114,111,114,40,1,
+ 0,0,0,117,4,0,0,0,115,101,108,102,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,7,0,0,0,114,101,108,
+ 101,97,115,101,255,0,0,0,115,6,0,0,0,0,1,15,
+ 1,15,1,117,24,0,0,0,95,68,117,109,109,121,77,111,
+ 100,117,108,101,76,111,99,107,46,114,101,108,101,97,115,101,
+ 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
+ 0,67,0,0,0,115,23,0,0,0,100,1,0,124,0,0,
+ 106,0,0,116,1,0,124,0,0,131,1,0,102,2,0,22,
+ 83,40,2,0,0,0,78,117,26,0,0,0,95,68,117,109,
+ 109,121,77,111,100,117,108,101,76,111,99,107,40,37,114,41,
+ 32,97,116,32,37,100,40,2,0,0,0,117,4,0,0,0,
+ 110,97,109,101,117,2,0,0,0,105,100,40,1,0,0,0,
+ 117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114,
+ 95,95,4,1,0,0,115,2,0,0,0,0,1,117,25,0,
+ 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111,
+ 99,107,46,95,95,114,101,112,114,95,95,78,40,8,0,0,
+ 0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,10,
+ 0,0,0,95,95,109,111,100,117,108,101,95,95,117,12,0,
+ 0,0,95,95,113,117,97,108,110,97,109,101,95,95,117,7,
+ 0,0,0,95,95,100,111,99,95,95,117,8,0,0,0,95,
+ 95,105,110,105,116,95,95,117,7,0,0,0,97,99,113,117,
+ 105,114,101,117,7,0,0,0,114,101,108,101,97,115,101,117,
+ 8,0,0,0,95,95,114,101,112,114,95,95,40,1,0,0,
+ 0,117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,0,
+ 0,95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,
+ 107,243,0,0,0,115,10,0,0,0,16,2,6,2,12,4,
+ 12,4,12,5,117,16,0,0,0,95,68,117,109,109,121,77,
+ 111,100,117,108,101,76,111,99,107,99,1,0,0,0,0,0,
+ 0,0,3,0,0,0,11,0,0,0,3,0,0,0,115,142,
+ 0,0,0,100,3,0,125,1,0,121,17,0,116,1,0,136,
+ 0,0,25,131,0,0,125,1,0,87,110,18,0,4,116,2,
+ 0,107,10,0,114,43,0,1,1,1,89,110,1,0,88,124,
+ 1,0,100,3,0,107,8,0,114,138,0,116,3,0,100,3,
+ 0,107,8,0,114,83,0,116,4,0,136,0,0,131,1,0,
+ 125,1,0,110,12,0,116,5,0,136,0,0,131,1,0,125,
+ 1,0,135,0,0,102,1,0,100,1,0,100,2,0,134,0,
+ 0,125,2,0,116,6,0,106,7,0,124,1,0,124,2,0,
+ 131,2,0,116,1,0,136,0,0,60,110,0,0,124,1,0,
+ 83,40,4,0,0,0,117,109,0,0,0,71,101,116,32,111,
+ 114,32,99,114,101,97,116,101,32,116,104,101,32,109,111,100,
+ 117,108,101,32,108,111,99,107,32,102,111,114,32,97,32,103,
+ 105,118,101,110,32,109,111,100,117,108,101,32,110,97,109,101,
+ 46,10,10,32,32,32,32,83,104,111,117,108,100,32,111,110,
+ 108,121,32,98,101,32,99,97,108,108,101,100,32,119,105,116,
+ 104,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,
+ 107,32,116,97,107,101,110,46,99,1,0,0,0,0,0,0,
+ 0,1,0,0,0,2,0,0,0,19,0,0,0,115,11,0,
+ 0,0,116,0,0,136,0,0,61,100,0,0,83,40,1,0,
+ 0,0,78,40,1,0,0,0,117,13,0,0,0,95,109,111,
+ 100,117,108,101,95,108,111,99,107,115,40,1,0,0,0,117,
+ 1,0,0,0,95,40,1,0,0,0,117,4,0,0,0,110,
+ 97,109,101,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,2,0,0,0,99,
+ 98,24,1,0,0,115,2,0,0,0,0,1,117,28,0,0,
+ 0,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,
+ 107,46,60,108,111,99,97,108,115,62,46,99,98,78,40,8,
+ 0,0,0,117,4,0,0,0,78,111,110,101,117,13,0,0,
+ 0,95,109,111,100,117,108,101,95,108,111,99,107,115,117,8,
+ 0,0,0,75,101,121,69,114,114,111,114,117,7,0,0,0,
+ 95,116,104,114,101,97,100,117,16,0,0,0,95,68,117,109,
+ 109,121,77,111,100,117,108,101,76,111,99,107,117,11,0,0,
+ 0,95,77,111,100,117,108,101,76,111,99,107,117,8,0,0,
+ 0,95,119,101,97,107,114,101,102,117,3,0,0,0,114,101,
+ 102,40,3,0,0,0,117,4,0,0,0,110,97,109,101,117,
+ 4,0,0,0,108,111,99,107,117,2,0,0,0,99,98,40,
+ 0,0,0,0,40,1,0,0,0,117,4,0,0,0,110,97,
+ 109,101,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,16,0,0,0,95,103,101,116,95,109,111,
+ 100,117,108,101,95,108,111,99,107,10,1,0,0,115,24,0,
+ 0,0,0,4,6,1,3,1,17,1,13,1,5,1,12,1,
+ 12,1,15,2,12,1,18,2,25,1,117,16,0,0,0,95,
+ 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,99,
+ 1,0,0,0,0,0,0,0,2,0,0,0,11,0,0,0,
+ 67,0,0,0,115,71,0,0,0,116,0,0,124,0,0,131,
+ 1,0,125,1,0,116,1,0,106,2,0,131,0,0,1,121,
+ 14,0,124,1,0,106,3,0,131,0,0,1,87,110,18,0,
+ 4,116,4,0,107,10,0,114,56,0,1,1,1,89,110,11,
+ 0,88,124,1,0,106,5,0,131,0,0,1,100,1,0,83,
+ 40,2,0,0,0,117,21,1,0,0,82,101,108,101,97,115,
+ 101,32,116,104,101,32,103,108,111,98,97,108,32,105,109,112,
+ 111,114,116,32,108,111,99,107,44,32,97,110,100,32,97,99,
+ 113,117,105,114,101,115,32,116,104,101,110,32,114,101,108,101,
+ 97,115,101,32,116,104,101,10,32,32,32,32,109,111,100,117,
+ 108,101,32,108,111,99,107,32,102,111,114,32,97,32,103,105,
+ 118,101,110,32,109,111,100,117,108,101,32,110,97,109,101,46,
+ 10,32,32,32,32,84,104,105,115,32,105,115,32,117,115,101,
+ 100,32,116,111,32,101,110,115,117,114,101,32,97,32,109,111,
+ 100,117,108,101,32,105,115,32,99,111,109,112,108,101,116,101,
+ 108,121,32,105,110,105,116,105,97,108,105,122,101,100,44,32,
+ 105,110,32,116,104,101,10,32,32,32,32,101,118,101,110,116,
+ 32,105,116,32,105,115,32,98,101,105,110,103,32,105,109,112,
+ 111,114,116,101,100,32,98,121,32,97,110,111,116,104,101,114,
+ 32,116,104,114,101,97,100,46,10,10,32,32,32,32,83,104,
+ 111,117,108,100,32,111,110,108,121,32,98,101,32,99,97,108,
+ 108,101,100,32,119,105,116,104,32,116,104,101,32,105,109,112,
+ 111,114,116,32,108,111,99,107,32,116,97,107,101,110,46,78,
+ 40,6,0,0,0,117,16,0,0,0,95,103,101,116,95,109,
+ 111,100,117,108,101,95,108,111,99,107,117,4,0,0,0,95,
+ 105,109,112,117,12,0,0,0,114,101,108,101,97,115,101,95,
+ 108,111,99,107,117,7,0,0,0,97,99,113,117,105,114,101,
+ 117,14,0,0,0,95,68,101,97,100,108,111,99,107,69,114,
+ 114,111,114,117,7,0,0,0,114,101,108,101,97,115,101,40,
+ 2,0,0,0,117,4,0,0,0,110,97,109,101,117,4,0,
+ 0,0,108,111,99,107,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,19,0,0,0,95,108,111,99,107,95,117,110,108,
+ 111,99,107,95,109,111,100,117,108,101,29,1,0,0,115,14,
+ 0,0,0,0,7,12,1,10,1,3,1,14,1,13,3,5,
+ 2,117,19,0,0,0,95,108,111,99,107,95,117,110,108,111,
+ 99,107,95,109,111,100,117,108,101,99,1,0,0,0,0,0,
+ 0,0,3,0,0,0,3,0,0,0,79,0,0,0,115,13,
+ 0,0,0,124,0,0,124,1,0,124,2,0,142,0,0,83,
+ 40,1,0,0,0,117,46,1,0,0,114,101,109,111,118,101,
+ 95,105,109,112,111,114,116,108,105,98,95,102,114,97,109,101,
+ 115,32,105,110,32,105,109,112,111,114,116,46,99,32,119,105,
+ 108,108,32,97,108,119,97,121,115,32,114,101,109,111,118,101,
+ 32,115,101,113,117,101,110,99,101,115,10,32,32,32,32,111,
+ 102,32,105,109,112,111,114,116,108,105,98,32,102,114,97,109,
+ 101,115,32,116,104,97,116,32,101,110,100,32,119,105,116,104,
+ 32,97,32,99,97,108,108,32,116,111,32,116,104,105,115,32,
+ 102,117,110,99,116,105,111,110,10,10,32,32,32,32,85,115,
+ 101,32,105,116,32,105,110,115,116,101,97,100,32,111,102,32,
+ 97,32,110,111,114,109,97,108,32,99,97,108,108,32,105,110,
+ 32,112,108,97,99,101,115,32,119,104,101,114,101,32,105,110,
+ 99,108,117,100,105,110,103,32,116,104,101,32,105,109,112,111,
+ 114,116,108,105,98,10,32,32,32,32,102,114,97,109,101,115,
+ 32,105,110,116,114,111,100,117,99,101,115,32,117,110,119,97,
+ 110,116,101,100,32,110,111,105,115,101,32,105,110,116,111,32,
+ 116,104,101,32,116,114,97,99,101,98,97,99,107,32,40,101,
+ 46,103,46,32,119,104,101,110,32,101,120,101,99,117,116,105,
+ 110,103,10,32,32,32,32,109,111,100,117,108,101,32,99,111,
+ 100,101,41,10,32,32,32,32,40,0,0,0,0,40,3,0,
+ 0,0,117,1,0,0,0,102,117,4,0,0,0,97,114,103,
+ 115,117,4,0,0,0,107,119,100,115,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,25,0,0,0,95,99,97,108,108,
+ 95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,
+ 111,118,101,100,49,1,0,0,115,2,0,0,0,0,8,117,
+ 25,0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,
+ 114,97,109,101,115,95,114,101,109,111,118,101,100,105,158,12,
+ 0,0,117,1,0,0,0,13,105,16,0,0,0,117,1,0,
+ 0,0,10,105,24,0,0,0,99,1,0,0,0,0,0,0,
+ 0,2,0,0,0,3,0,0,0,99,0,0,0,115,29,0,
+ 0,0,124,0,0,93,19,0,125,1,0,116,0,0,124,1,
+ 0,63,100,0,0,64,86,1,113,3,0,100,1,0,83,40,
+ 2,0,0,0,105,255,0,0,0,78,40,1,0,0,0,117,
+ 17,0,0,0,95,82,65,87,95,77,65,71,73,67,95,78,
+ 85,77,66,69,82,40,2,0,0,0,117,2,0,0,0,46,
+ 48,117,1,0,0,0,110,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,9,0,0,0,60,103,101,110,101,120,112,114,
+ 62,150,1,0,0,115,2,0,0,0,6,0,117,9,0,0,
+ 0,60,103,101,110,101,120,112,114,62,105,0,0,0,0,105,
+ 25,0,0,0,105,8,0,0,0,117,11,0,0,0,95,95,
+ 112,121,99,97,99,104,101,95,95,117,3,0,0,0,46,112,
+ 121,117,4,0,0,0,46,112,121,99,117,4,0,0,0,46,
+ 112,121,111,99,2,0,0,0,0,0,0,0,11,0,0,0,
+ 6,0,0,0,67,0,0,0,115,180,0,0,0,124,1,0,
+ 100,5,0,107,8,0,114,25,0,116,1,0,106,2,0,106,
+ 3,0,12,110,3,0,124,1,0,125,2,0,124,2,0,114,
+ 46,0,116,4,0,125,3,0,110,6,0,116,5,0,125,3,
+ 0,116,6,0,124,0,0,131,1,0,92,2,0,125,4,0,
+ 125,5,0,124,5,0,106,7,0,100,1,0,131,1,0,92,
+ 3,0,125,6,0,125,7,0,125,8,0,116,1,0,106,8,
+ 0,106,9,0,125,9,0,124,9,0,100,5,0,107,8,0,
+ 114,133,0,116,10,0,100,2,0,131,1,0,130,1,0,110,
+ 0,0,100,3,0,106,11,0,124,6,0,124,7,0,124,9,
+ 0,124,3,0,100,4,0,25,103,4,0,131,1,0,125,10,
+ 0,116,12,0,124,4,0,116,13,0,124,10,0,131,3,0,
+ 83,40,6,0,0,0,117,244,1,0,0,71,105,118,101,110,
+ 32,116,104,101,32,112,97,116,104,32,116,111,32,97,32,46,
+ 112,121,32,102,105,108,101,44,32,114,101,116,117,114,110,32,
+ 116,104,101,32,112,97,116,104,32,116,111,32,105,116,115,32,
+ 46,112,121,99,47,46,112,121,111,32,102,105,108,101,46,10,
+ 10,32,32,32,32,84,104,101,32,46,112,121,32,102,105,108,
+ 101,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,
+ 116,111,32,101,120,105,115,116,59,32,116,104,105,115,32,115,
+ 105,109,112,108,121,32,114,101,116,117,114,110,115,32,116,104,
+ 101,32,112,97,116,104,32,116,111,32,116,104,101,10,32,32,
+ 32,32,46,112,121,99,47,46,112,121,111,32,102,105,108,101,
+ 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105,
+ 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119,
+ 101,114,101,32,105,109,112,111,114,116,101,100,46,32,32,84,
+ 104,101,32,101,120,116,101,110,115,105,111,110,10,32,32,32,
+ 32,119,105,108,108,32,98,101,32,46,112,121,99,32,117,110,
+ 108,101,115,115,32,115,121,115,46,102,108,97,103,115,46,111,
+ 112,116,105,109,105,122,101,32,105,115,32,110,111,110,45,122,
+ 101,114,111,44,32,116,104,101,110,32,105,116,32,119,105,108,
+ 108,32,98,101,32,46,112,121,111,46,10,10,32,32,32,32,
+ 73,102,32,100,101,98,117,103,95,111,118,101,114,114,105,100,
+ 101,32,105,115,32,110,111,116,32,78,111,110,101,44,32,116,
+ 104,101,110,32,105,116,32,109,117,115,116,32,98,101,32,97,
+ 32,98,111,111,108,101,97,110,32,97,110,100,32,105,115,32,
+ 117,115,101,100,32,105,110,10,32,32,32,32,112,108,97,99,
+ 101,32,111,102,32,115,121,115,46,102,108,97,103,115,46,111,
+ 112,116,105,109,105,122,101,46,10,10,32,32,32,32,73,102,
+ 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,
+ 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,
+ 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,
+ 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,117,
+ 1,0,0,0,46,117,36,0,0,0,115,121,115,46,105,109,
+ 112,108,101,109,101,110,116,97,116,105,111,110,46,99,97,99,
+ 104,101,95,116,97,103,32,105,115,32,78,111,110,101,117,0,
+ 0,0,0,105,0,0,0,0,78,40,14,0,0,0,117,4,
+ 0,0,0,78,111,110,101,117,3,0,0,0,115,121,115,117,
+ 5,0,0,0,102,108,97,103,115,117,8,0,0,0,111,112,
+ 116,105,109,105,122,101,117,23,0,0,0,68,69,66,85,71,
+ 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+ 69,83,117,27,0,0,0,79,80,84,73,77,73,90,69,68,
+ 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+ 69,83,117,11,0,0,0,95,112,97,116,104,95,115,112,108,
+ 105,116,117,9,0,0,0,112,97,114,116,105,116,105,111,110,
+ 117,14,0,0,0,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,117,9,0,0,0,99,97,99,104,101,95,116,97,
+ 103,117,19,0,0,0,78,111,116,73,109,112,108,101,109,101,
+ 110,116,101,100,69,114,114,111,114,117,4,0,0,0,106,111,
+ 105,110,117,10,0,0,0,95,112,97,116,104,95,106,111,105,
+ 110,117,8,0,0,0,95,80,89,67,65,67,72,69,40,11,
+ 0,0,0,117,4,0,0,0,112,97,116,104,117,14,0,0,
+ 0,100,101,98,117,103,95,111,118,101,114,114,105,100,101,117,
+ 5,0,0,0,100,101,98,117,103,117,8,0,0,0,115,117,
+ 102,102,105,120,101,115,117,4,0,0,0,104,101,97,100,117,
+ 4,0,0,0,116,97,105,108,117,13,0,0,0,98,97,115,
+ 101,95,102,105,108,101,110,97,109,101,117,3,0,0,0,115,
+ 101,112,117,1,0,0,0,95,117,3,0,0,0,116,97,103,
+ 117,8,0,0,0,102,105,108,101,110,97,109,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,17,0,0,0,99,97,
+ 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,159,
+ 1,0,0,115,22,0,0,0,0,13,31,1,6,1,9,2,
+ 6,1,18,1,24,1,12,1,12,1,15,1,31,1,117,17,
+ 0,0,0,99,97,99,104,101,95,102,114,111,109,95,115,111,
+ 117,114,99,101,99,1,0,0,0,0,0,0,0,5,0,0,
+ 0,5,0,0,0,67,0,0,0,115,193,0,0,0,116,0,
+ 0,106,1,0,106,2,0,100,7,0,107,8,0,114,33,0,
+ 116,4,0,100,1,0,131,1,0,130,1,0,110,0,0,116,
+ 5,0,124,0,0,131,1,0,92,2,0,125,1,0,125,2,
+ 0,116,5,0,124,1,0,131,1,0,92,2,0,125,1,0,
+ 125,3,0,124,3,0,116,6,0,107,3,0,114,108,0,116,
+ 7,0,100,2,0,106,8,0,116,6,0,124,0,0,131,2,
+ 0,131,1,0,130,1,0,110,0,0,124,2,0,106,9,0,
+ 100,3,0,131,1,0,100,4,0,107,3,0,114,153,0,116,
+ 7,0,100,5,0,106,8,0,124,2,0,131,1,0,131,1,
+ 0,130,1,0,110,0,0,124,2,0,106,10,0,100,3,0,
+ 131,1,0,100,6,0,25,125,4,0,116,11,0,124,1,0,
+ 124,4,0,116,12,0,100,6,0,25,23,131,2,0,83,40,
+ 8,0,0,0,117,121,1,0,0,71,105,118,101,110,32,116,
+ 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121,
+ 99,46,47,46,112,121,111,32,102,105,108,101,44,32,114,101,
+ 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,
+ 32,105,116,115,32,46,112,121,32,102,105,108,101,46,10,10,
+ 32,32,32,32,84,104,101,32,46,112,121,99,47,46,112,121,
+ 111,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,
+ 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116,
+ 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114,
+ 110,115,32,116,104,101,32,112,97,116,104,32,116,111,10,32,
+ 32,32,32,116,104,101,32,46,112,121,32,102,105,108,101,32,
+ 99,97,108,99,117,108,97,116,101,100,32,116,111,32,99,111,
+ 114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32,
+ 46,112,121,99,47,46,112,121,111,32,102,105,108,101,46,32,
+ 32,73,102,32,112,97,116,104,32,100,111,101,115,10,32,32,
+ 32,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,
+ 32,80,69,80,32,51,49,52,55,32,102,111,114,109,97,116,
+ 44,32,86,97,108,117,101,69,114,114,111,114,32,119,105,108,
+ 108,32,98,101,32,114,97,105,115,101,100,46,32,73,102,10,
+ 32,32,32,32,115,121,115,46,105,109,112,108,101,109,101,110,
+ 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,
+ 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,
+ 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,
+ 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,
+ 32,32,117,36,0,0,0,115,121,115,46,105,109,112,108,101,
+ 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,
+ 116,97,103,32,105,115,32,78,111,110,101,117,37,0,0,0,
+ 123,125,32,110,111,116,32,98,111,116,116,111,109,45,108,101,
+ 118,101,108,32,100,105,114,101,99,116,111,114,121,32,105,110,
+ 32,123,33,114,125,117,1,0,0,0,46,105,2,0,0,0,
+ 117,28,0,0,0,101,120,112,101,99,116,101,100,32,111,110,
+ 108,121,32,50,32,100,111,116,115,32,105,110,32,123,33,114,
+ 125,105,0,0,0,0,78,40,13,0,0,0,117,3,0,0,
+ 0,115,121,115,117,14,0,0,0,105,109,112,108,101,109,101,
+ 110,116,97,116,105,111,110,117,9,0,0,0,99,97,99,104,
+ 101,95,116,97,103,117,4,0,0,0,78,111,110,101,117,19,
+ 0,0,0,78,111,116,73,109,112,108,101,109,101,110,116,101,
+ 100,69,114,114,111,114,117,11,0,0,0,95,112,97,116,104,
+ 95,115,112,108,105,116,117,8,0,0,0,95,80,89,67,65,
+ 67,72,69,117,10,0,0,0,86,97,108,117,101,69,114,114,
+ 111,114,117,6,0,0,0,102,111,114,109,97,116,117,5,0,
+ 0,0,99,111,117,110,116,117,9,0,0,0,112,97,114,116,
+ 105,116,105,111,110,117,10,0,0,0,95,112,97,116,104,95,
+ 106,111,105,110,117,15,0,0,0,83,79,85,82,67,69,95,
+ 83,85,70,70,73,88,69,83,40,5,0,0,0,117,4,0,
+ 0,0,112,97,116,104,117,4,0,0,0,104,101,97,100,117,
+ 16,0,0,0,112,121,99,97,99,104,101,95,102,105,108,101,
+ 110,97,109,101,117,7,0,0,0,112,121,99,97,99,104,101,
+ 117,13,0,0,0,98,97,115,101,95,102,105,108,101,110,97,
+ 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17,
+ 0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99,
+ 97,99,104,101,186,1,0,0,115,24,0,0,0,0,9,18,
+ 1,15,1,18,1,18,1,12,1,9,1,18,1,21,1,9,
+ 1,15,1,19,1,117,17,0,0,0,115,111,117,114,99,101,
+ 95,102,114,111,109,95,99,97,99,104,101,99,1,0,0,0,
+ 0,0,0,0,5,0,0,0,13,0,0,0,67,0,0,0,
+ 115,164,0,0,0,116,0,0,124,0,0,131,1,0,100,1,
+ 0,107,2,0,114,22,0,100,6,0,83,124,0,0,106,2,
+ 0,100,2,0,131,1,0,92,3,0,125,1,0,125,2,0,
+ 125,3,0,124,1,0,12,115,81,0,124,3,0,106,3,0,
+ 131,0,0,100,7,0,100,8,0,133,2,0,25,100,5,0,
+ 107,3,0,114,85,0,124,0,0,83,121,16,0,116,4,0,
+ 124,0,0,131,1,0,125,4,0,87,110,40,0,4,116,5,
+ 0,116,6,0,102,2,0,107,10,0,114,143,0,1,1,1,
+ 116,7,0,100,9,0,100,6,0,133,2,0,25,125,4,0,
+ 89,110,1,0,88,116,8,0,116,9,0,131,1,0,114,160,
+ 0,124,4,0,83,124,0,0,83,40,10,0,0,0,117,188,
+ 0,0,0,67,111,110,118,101,114,116,32,97,32,98,121,116,
+ 101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,32,
+ 116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,104,
+ 32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,10,
+ 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,
+ 111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,121,
+ 32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,
+ 111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,114,
+ 10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,120,
+ 101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,104,
+ 70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,116,
+ 104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,105,
+ 0,0,0,0,117,1,0,0,0,46,105,3,0,0,0,105,
+ 1,0,0,0,117,3,0,0,0,46,112,121,78,105,253,255,
+ 255,255,105,255,255,255,255,105,255,255,255,255,40,10,0,0,
+ 0,117,3,0,0,0,108,101,110,117,4,0,0,0,78,111,
+ 110,101,117,9,0,0,0,114,112,97,114,105,116,105,111,110,
+ 117,5,0,0,0,108,111,119,101,114,117,17,0,0,0,115,
+ 111,117,114,99,101,95,102,114,111,109,95,99,97,99,104,101,
+ 117,19,0,0,0,78,111,116,73,109,112,108,101,109,101,110,
+ 116,101,100,69,114,114,111,114,117,10,0,0,0,86,97,108,
+ 117,101,69,114,114,111,114,117,12,0,0,0,98,121,116,99,
+ 111,100,101,95,112,97,116,104,117,12,0,0,0,95,112,97,
+ 116,104,95,105,115,102,105,108,101,117,12,0,0,0,115,111,
+ 117,114,99,101,95,115,116,97,116,115,40,5,0,0,0,117,
+ 13,0,0,0,98,121,116,101,99,111,100,101,95,112,97,116,
+ 104,117,4,0,0,0,114,101,115,116,117,1,0,0,0,95,
+ 117,9,0,0,0,101,120,116,101,110,115,105,111,110,117,11,
+ 0,0,0,115,111,117,114,99,101,95,112,97,116,104,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,15,0,0,0,95,
+ 103,101,116,95,115,111,117,114,99,101,102,105,108,101,209,1,
+ 0,0,115,20,0,0,0,0,7,18,1,4,1,24,1,35,
+ 1,4,2,3,1,16,1,19,1,21,2,117,15,0,0,0,
+ 95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,99,
+ 1,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
+ 71,0,0,0,115,75,0,0,0,116,0,0,106,1,0,106,
+ 2,0,114,71,0,124,0,0,106,3,0,100,6,0,131,1,
+ 0,115,40,0,100,3,0,124,0,0,23,125,0,0,110,0,
+ 0,116,4,0,124,0,0,106,5,0,124,1,0,140,0,0,
+ 100,4,0,116,0,0,106,6,0,131,1,1,1,110,0,0,
+ 100,5,0,83,40,7,0,0,0,117,61,0,0,0,80,114,
+ 105,110,116,32,116,104,101,32,109,101,115,115,97,103,101,32,
+ 116,111,32,115,116,100,101,114,114,32,105,102,32,45,118,47,
+ 80,89,84,72,79,78,86,69,82,66,79,83,69,32,105,115,
+ 32,116,117,114,110,101,100,32,111,110,46,117,1,0,0,0,
+ 35,117,7,0,0,0,105,109,112,111,114,116,32,117,2,0,
+ 0,0,35,32,117,4,0,0,0,102,105,108,101,78,40,2,
+ 0,0,0,117,1,0,0,0,35,117,7,0,0,0,105,109,
+ 112,111,114,116,32,40,7,0,0,0,117,3,0,0,0,115,
+ 121,115,117,5,0,0,0,102,108,97,103,115,117,7,0,0,
+ 0,118,101,114,98,111,115,101,117,10,0,0,0,115,116,97,
+ 114,116,115,119,105,116,104,117,5,0,0,0,112,114,105,110,
+ 116,117,6,0,0,0,102,111,114,109,97,116,117,6,0,0,
+ 0,115,116,100,101,114,114,40,2,0,0,0,117,7,0,0,
+ 0,109,101,115,115,97,103,101,117,4,0,0,0,97,114,103,
+ 115,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,
+ 0,0,95,118,101,114,98,111,115,101,95,109,101,115,115,97,
+ 103,101,230,1,0,0,115,8,0,0,0,0,2,12,1,15,
+ 1,13,1,117,16,0,0,0,95,118,101,114,98,111,115,101,
+ 95,109,101,115,115,97,103,101,99,1,0,0,0,0,0,0,
+ 0,2,0,0,0,3,0,0,0,3,0,0,0,115,35,0,
+ 0,0,135,0,0,102,1,0,100,1,0,100,2,0,134,0,
+ 0,125,1,0,116,0,0,124,1,0,136,0,0,131,2,0,
+ 1,124,1,0,83,40,3,0,0,0,117,39,0,0,0,83,
+ 101,116,32,95,95,112,97,99,107,97,103,101,95,95,32,111,
+ 110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,109,
+ 111,100,117,108,101,46,99,0,0,0,0,0,0,0,0,3,
+ 0,0,0,4,0,0,0,31,0,0,0,115,101,0,0,0,
+ 136,0,0,124,0,0,124,1,0,142,0,0,125,2,0,116,
+ 0,0,124,2,0,100,1,0,100,0,0,131,3,0,100,0,
+ 0,107,8,0,114,97,0,124,2,0,106,2,0,124,2,0,
+ 95,3,0,116,4,0,124,2,0,100,2,0,131,2,0,115,
+ 97,0,124,2,0,106,3,0,106,5,0,100,3,0,131,1,
+ 0,100,4,0,25,124,2,0,95,3,0,113,97,0,110,0,
+ 0,124,2,0,83,40,5,0,0,0,78,117,11,0,0,0,
+ 95,95,112,97,99,107,97,103,101,95,95,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,117,1,0,0,0,46,105,0,
+ 0,0,0,40,6,0,0,0,117,7,0,0,0,103,101,116,
+ 97,116,116,114,117,4,0,0,0,78,111,110,101,117,8,0,
+ 0,0,95,95,110,97,109,101,95,95,117,11,0,0,0,95,
+ 95,112,97,99,107,97,103,101,95,95,117,7,0,0,0,104,
+ 97,115,97,116,116,114,117,10,0,0,0,114,112,97,114,116,
+ 105,116,105,111,110,40,3,0,0,0,117,4,0,0,0,97,
+ 114,103,115,117,6,0,0,0,107,119,97,114,103,115,117,6,
+ 0,0,0,109,111,100,117,108,101,40,1,0,0,0,117,3,
+ 0,0,0,102,120,110,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,19,0,
+ 0,0,115,101,116,95,112,97,99,107,97,103,101,95,119,114,
+ 97,112,112,101,114,240,1,0,0,115,12,0,0,0,0,1,
+ 15,1,24,1,12,1,15,1,31,1,117,40,0,0,0,115,
+ 101,116,95,112,97,99,107,97,103,101,46,60,108,111,99,97,
+ 108,115,62,46,115,101,116,95,112,97,99,107,97,103,101,95,
+ 119,114,97,112,112,101,114,40,1,0,0,0,117,5,0,0,
+ 0,95,119,114,97,112,40,2,0,0,0,117,3,0,0,0,
+ 102,120,110,117,19,0,0,0,115,101,116,95,112,97,99,107,
+ 97,103,101,95,119,114,97,112,112,101,114,40,0,0,0,0,
+ 40,1,0,0,0,117,3,0,0,0,102,120,110,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 11,0,0,0,115,101,116,95,112,97,99,107,97,103,101,238,
+ 1,0,0,115,6,0,0,0,0,2,18,7,13,1,117,11,
+ 0,0,0,115,101,116,95,112,97,99,107,97,103,101,99,1,
+ 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,
+ 0,0,0,115,35,0,0,0,135,0,0,102,1,0,100,1,
+ 0,100,2,0,134,0,0,125,1,0,116,0,0,124,1,0,
+ 136,0,0,131,2,0,1,124,1,0,83,40,3,0,0,0,
+ 117,38,0,0,0,83,101,116,32,95,95,108,111,97,100,101,
+ 114,95,95,32,111,110,32,116,104,101,32,114,101,116,117,114,
+ 110,101,100,32,109,111,100,117,108,101,46,99,1,0,0,0,
+ 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0,
+ 115,49,0,0,0,136,0,0,124,0,0,124,1,0,124,2,
+ 0,142,1,0,125,3,0,116,0,0,124,3,0,100,1,0,
+ 131,2,0,115,45,0,124,0,0,124,3,0,95,1,0,110,
+ 0,0,124,3,0,83,40,2,0,0,0,78,117,10,0,0,
+ 0,95,95,108,111,97,100,101,114,95,95,40,2,0,0,0,
+ 117,7,0,0,0,104,97,115,97,116,116,114,117,10,0,0,
+ 0,95,95,108,111,97,100,101,114,95,95,40,4,0,0,0,
+ 117,4,0,0,0,115,101,108,102,117,4,0,0,0,97,114,
+ 103,115,117,6,0,0,0,107,119,97,114,103,115,117,6,0,
+ 0,0,109,111,100,117,108,101,40,1,0,0,0,117,3,0,
+ 0,0,102,120,110,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,18,0,0,
+ 0,115,101,116,95,108,111,97,100,101,114,95,119,114,97,112,
+ 112,101,114,253,1,0,0,115,8,0,0,0,0,1,18,1,
+ 15,1,12,1,117,38,0,0,0,115,101,116,95,108,111,97,
+ 100,101,114,46,60,108,111,99,97,108,115,62,46,115,101,116,
+ 95,108,111,97,100,101,114,95,119,114,97,112,112,101,114,40,
+ 1,0,0,0,117,5,0,0,0,95,119,114,97,112,40,2,
+ 0,0,0,117,3,0,0,0,102,120,110,117,18,0,0,0,
+ 115,101,116,95,108,111,97,100,101,114,95,119,114,97,112,112,
+ 101,114,40,0,0,0,0,40,1,0,0,0,117,3,0,0,
+ 0,102,120,110,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,10,0,0,0,115,101,116,95,108,
+ 111,97,100,101,114,251,1,0,0,115,6,0,0,0,0,2,
+ 18,5,13,1,117,10,0,0,0,115,101,116,95,108,111,97,
+ 100,101,114,99,1,0,0,0,0,0,0,0,2,0,0,0,
+ 3,0,0,0,3,0,0,0,115,35,0,0,0,135,0,0,
+ 102,1,0,100,1,0,100,2,0,134,0,0,125,1,0,116,
+ 0,0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,
+ 40,3,0,0,0,117,42,3,0,0,68,101,99,111,114,97,
+ 116,111,114,32,116,111,32,104,97,110,100,108,101,32,115,101,
+ 108,101,99,116,105,110,103,32,116,104,101,32,112,114,111,112,
+ 101,114,32,109,111,100,117,108,101,32,102,111,114,32,108,111,
+ 97,100,101,114,115,46,10,10,32,32,32,32,84,104,101,32,
+ 100,101,99,111,114,97,116,101,100,32,102,117,110,99,116,105,
+ 111,110,32,105,115,32,112,97,115,115,101,100,32,116,104,101,
+ 32,109,111,100,117,108,101,32,116,111,32,117,115,101,32,105,
+ 110,115,116,101,97,100,32,111,102,32,116,104,101,32,109,111,
+ 100,117,108,101,10,32,32,32,32,110,97,109,101,46,32,84,
+ 104,101,32,109,111,100,117,108,101,32,112,97,115,115,101,100,
+ 32,105,110,32,116,111,32,116,104,101,32,102,117,110,99,116,
+ 105,111,110,32,105,115,32,101,105,116,104,101,114,32,102,114,
+ 111,109,32,115,121,115,46,109,111,100,117,108,101,115,32,105,
+ 102,10,32,32,32,32,105,116,32,97,108,114,101,97,100,121,
+ 32,101,120,105,115,116,115,32,111,114,32,105,115,32,97,32,
+ 110,101,119,32,109,111,100,117,108,101,46,32,73,102,32,116,
+ 104,101,32,109,111,100,117,108,101,32,105,115,32,110,101,119,
+ 44,32,116,104,101,110,32,95,95,110,97,109,101,95,95,10,
+ 32,32,32,32,105,115,32,115,101,116,32,116,104,101,32,102,
+ 105,114,115,116,32,97,114,103,117,109,101,110,116,32,116,111,
+ 32,116,104,101,32,109,101,116,104,111,100,44,32,95,95,108,
+ 111,97,100,101,114,95,95,32,105,115,32,115,101,116,32,116,
+ 111,32,115,101,108,102,44,32,97,110,100,10,32,32,32,32,
+ 95,95,112,97,99,107,97,103,101,95,95,32,105,115,32,115,
+ 101,116,32,97,99,99,111,114,100,105,110,103,108,121,32,40,
+ 105,102,32,115,101,108,102,46,105,115,95,112,97,99,107,97,
+ 103,101,40,41,32,105,115,32,100,101,102,105,110,101,100,41,
+ 32,119,105,108,108,32,98,101,32,115,101,116,10,32,32,32,
+ 32,98,101,102,111,114,101,32,105,116,32,105,115,32,112,97,
+ 115,115,101,100,32,116,111,32,116,104,101,32,100,101,99,111,
+ 114,97,116,101,100,32,102,117,110,99,116,105,111,110,32,40,
+ 105,102,32,115,101,108,102,46,105,115,95,112,97,99,107,97,
+ 103,101,40,41,32,100,111,101,115,10,32,32,32,32,110,111,
+ 116,32,119,111,114,107,32,102,111,114,32,116,104,101,32,109,
+ 111,100,117,108,101,32,105,116,32,119,105,108,108,32,98,101,
+ 32,115,101,116,32,112,111,115,116,45,108,111,97,100,41,46,
+ 10,10,32,32,32,32,73,102,32,97,110,32,101,120,99,101,
+ 112,116,105,111,110,32,105,115,32,114,97,105,115,101,100,32,
+ 97,110,100,32,116,104,101,32,100,101,99,111,114,97,116,111,
+ 114,32,99,114,101,97,116,101,100,32,116,104,101,32,109,111,
+ 100,117,108,101,32,105,116,32,105,115,10,32,32,32,32,115,
+ 117,98,115,101,113,117,101,110,116,108,121,32,114,101,109,111,
+ 118,101,100,32,102,114,111,109,32,115,121,115,46,109,111,100,
+ 117,108,101,115,46,10,10,32,32,32,32,84,104,101,32,100,
+ 101,99,111,114,97,116,111,114,32,97,115,115,117,109,101,115,
+ 32,116,104,97,116,32,116,104,101,32,100,101,99,111,114,97,
+ 116,101,100,32,102,117,110,99,116,105,111,110,32,116,97,107,
+ 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,
+ 109,101,32,97,115,10,32,32,32,32,116,104,101,32,115,101,
+ 99,111,110,100,32,97,114,103,117,109,101,110,116,46,10,10,
+ 32,32,32,32,99,2,0,0,0,0,0,0,0,7,0,0,
+ 0,25,0,0,0,31,0,0,0,115,254,0,0,0,116,0,
+ 0,106,1,0,106,2,0,124,1,0,131,1,0,125,4,0,
+ 124,4,0,100,0,0,107,9,0,125,5,0,124,5,0,115,
+ 168,0,116,4,0,124,1,0,131,1,0,125,4,0,100,3,
+ 0,124,4,0,95,6,0,124,4,0,116,0,0,106,1,0,
+ 124,1,0,60,124,0,0,124,4,0,95,7,0,121,19,0,
+ 124,0,0,106,8,0,124,1,0,131,1,0,125,6,0,87,
+ 110,24,0,4,116,9,0,116,10,0,102,2,0,107,10,0,
+ 114,124,0,1,1,1,89,113,177,0,88,124,6,0,114,143,
+ 0,124,1,0,124,4,0,95,11,0,113,177,0,124,1,0,
+ 106,12,0,100,1,0,131,1,0,100,2,0,25,124,4,0,
+ 95,11,0,110,9,0,100,3,0,124,4,0,95,6,0,122,
+ 60,0,121,23,0,136,0,0,124,0,0,124,4,0,124,2,
+ 0,124,3,0,142,2,0,83,87,110,30,0,1,1,1,124,
+ 5,0,115,228,0,116,0,0,106,1,0,124,1,0,61,110,
+ 0,0,130,0,0,89,110,1,0,88,87,100,0,0,100,4,
+ 0,124,4,0,95,6,0,88,100,0,0,83,40,5,0,0,
+ 0,78,117,1,0,0,0,46,105,0,0,0,0,84,70,40,
+ 14,0,0,0,117,3,0,0,0,115,121,115,117,7,0,0,
+ 0,109,111,100,117,108,101,115,117,3,0,0,0,103,101,116,
+ 117,4,0,0,0,78,111,110,101,117,10,0,0,0,110,101,
+ 119,95,109,111,100,117,108,101,117,4,0,0,0,84,114,117,
+ 101,117,16,0,0,0,95,95,105,110,105,116,105,97,108,105,
+ 122,105,110,103,95,95,117,10,0,0,0,95,95,108,111,97,
+ 100,101,114,95,95,117,10,0,0,0,105,115,95,112,97,99,
+ 107,97,103,101,117,11,0,0,0,73,109,112,111,114,116,69,
+ 114,114,111,114,117,14,0,0,0,65,116,116,114,105,98,117,
+ 116,101,69,114,114,111,114,117,11,0,0,0,95,95,112,97,
+ 99,107,97,103,101,95,95,117,10,0,0,0,114,112,97,114,
+ 116,105,116,105,111,110,117,5,0,0,0,70,97,108,115,101,
+ 40,7,0,0,0,117,4,0,0,0,115,101,108,102,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,117,4,0,0,0,
+ 97,114,103,115,117,6,0,0,0,107,119,97,114,103,115,117,
+ 6,0,0,0,109,111,100,117,108,101,117,9,0,0,0,105,
+ 115,95,114,101,108,111,97,100,117,10,0,0,0,105,115,95,
+ 112,97,99,107,97,103,101,40,1,0,0,0,117,3,0,0,
+ 0,102,120,110,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,25,0,0,0,
+ 109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,101,
+ 114,95,119,114,97,112,112,101,114,24,2,0,0,115,44,0,
+ 0,0,0,1,18,1,12,1,6,4,12,3,9,1,13,1,
+ 9,1,3,1,19,1,19,1,5,2,6,1,12,2,25,2,
+ 9,1,6,2,23,1,3,1,6,1,13,1,12,2,117,52,
+ 0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,
+ 97,100,101,114,46,60,108,111,99,97,108,115,62,46,109,111,
+ 100,117,108,101,95,102,111,114,95,108,111,97,100,101,114,95,
+ 119,114,97,112,112,101,114,40,1,0,0,0,117,5,0,0,
+ 0,95,119,114,97,112,40,2,0,0,0,117,3,0,0,0,
+ 102,120,110,117,25,0,0,0,109,111,100,117,108,101,95,102,
+ 111,114,95,108,111,97,100,101,114,95,119,114,97,112,112,101,
+ 114,40,0,0,0,0,40,1,0,0,0,117,3,0,0,0,
+ 102,120,110,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,17,0,0,0,109,111,100,117,108,101,
+ 95,102,111,114,95,108,111,97,100,101,114,6,2,0,0,115,
+ 6,0,0,0,0,18,18,33,13,1,117,17,0,0,0,109,
+ 111,100,117,108,101,95,102,111,114,95,108,111,97,100,101,114,
+ 99,1,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
+ 0,3,0,0,0,115,38,0,0,0,100,3,0,135,0,0,
+ 102,1,0,100,1,0,100,2,0,134,1,0,125,1,0,116,
+ 1,0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,
+ 40,4,0,0,0,117,252,0,0,0,68,101,99,111,114,97,
+ 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,
+ 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101,
+ 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97,
+ 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104,
+ 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110,
+ 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104,
+ 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,
+ 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102,
+ 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32,
+ 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,
+ 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97,
+ 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32,
+ 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102,
+ 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116,
+ 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,
+ 10,10,32,32,32,32,99,2,0,0,0,0,0,0,0,4,
+ 0,0,0,5,0,0,0,31,0,0,0,115,83,0,0,0,
+ 124,1,0,100,0,0,107,8,0,114,24,0,124,0,0,106,
+ 1,0,125,1,0,110,40,0,124,0,0,106,1,0,124,1,
+ 0,107,3,0,114,64,0,116,2,0,100,1,0,124,1,0,
+ 22,100,2,0,124,1,0,131,1,1,130,1,0,110,0,0,
+ 136,0,0,124,0,0,124,1,0,124,2,0,124,3,0,142,
+ 2,0,83,40,3,0,0,0,78,117,23,0,0,0,108,111,
+ 97,100,101,114,32,99,97,110,110,111,116,32,104,97,110,100,
+ 108,101,32,37,115,117,4,0,0,0,110,97,109,101,40,3,
+ 0,0,0,117,4,0,0,0,78,111,110,101,117,4,0,0,
+ 0,110,97,109,101,117,11,0,0,0,73,109,112,111,114,116,
+ 69,114,114,111,114,40,4,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,4,0,0,0,110,97,109,101,117,4,0,0,
+ 0,97,114,103,115,117,6,0,0,0,107,119,97,114,103,115,
+ 40,1,0,0,0,117,6,0,0,0,109,101,116,104,111,100,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,19,0,0,0,95,99,104,101,
+ 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,69,
+ 2,0,0,115,10,0,0,0,0,1,12,1,12,1,15,1,
+ 25,1,117,40,0,0,0,95,99,104,101,99,107,95,110,97,
+ 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101,
+ 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,78,
+ 40,2,0,0,0,117,4,0,0,0,78,111,110,101,117,5,
+ 0,0,0,95,119,114,97,112,40,2,0,0,0,117,6,0,
+ 0,0,109,101,116,104,111,100,117,19,0,0,0,95,99,104,
+ 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,
+ 40,0,0,0,0,40,1,0,0,0,117,6,0,0,0,109,
+ 101,116,104,111,100,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,11,0,0,0,95,99,104,101,
+ 99,107,95,110,97,109,101,61,2,0,0,115,6,0,0,0,
+ 0,8,21,6,13,1,117,11,0,0,0,95,99,104,101,99,
+ 107,95,110,97,109,101,99,1,0,0,0,0,0,0,0,2,
+ 0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,0,
+ 135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,125,
+ 1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,124,
+ 1,0,83,40,3,0,0,0,117,49,0,0,0,68,101,99,
+ 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121,
+ 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108,
+ 101,32,105,115,32,98,117,105,108,116,45,105,110,46,99,2,
+ 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,19,
+ 0,0,0,115,58,0,0,0,124,1,0,116,0,0,106,1,
+ 0,107,7,0,114,45,0,116,2,0,100,1,0,106,3,0,
+ 124,1,0,131,1,0,100,2,0,124,1,0,131,1,1,130,
+ 1,0,110,0,0,136,0,0,124,0,0,124,1,0,131,2,
+ 0,83,40,3,0,0,0,78,117,27,0,0,0,123,125,32,
+ 105,115,32,110,111,116,32,97,32,98,117,105,108,116,45,105,
+ 110,32,109,111,100,117,108,101,117,4,0,0,0,110,97,109,
+ 101,40,4,0,0,0,117,3,0,0,0,115,121,115,117,20,
+ 0,0,0,98,117,105,108,116,105,110,95,109,111,100,117,108,
+ 101,95,110,97,109,101,115,117,11,0,0,0,73,109,112,111,
+ 114,116,69,114,114,111,114,117,6,0,0,0,102,111,114,109,
+ 97,116,40,2,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,40,1,0,
+ 0,0,117,3,0,0,0,102,120,110,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,25,0,0,0,95,114,101,113,117,105,114,101,115,95,
+ 98,117,105,108,116,105,110,95,119,114,97,112,112,101,114,81,
+ 2,0,0,115,8,0,0,0,0,1,15,1,18,1,12,1,
+ 117,52,0,0,0,95,114,101,113,117,105,114,101,115,95,98,
+ 117,105,108,116,105,110,46,60,108,111,99,97,108,115,62,46,
+ 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,
+ 110,95,119,114,97,112,112,101,114,40,1,0,0,0,117,5,
+ 0,0,0,95,119,114,97,112,40,2,0,0,0,117,3,0,
+ 0,0,102,120,110,117,25,0,0,0,95,114,101,113,117,105,
+ 114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112,
+ 112,101,114,40,0,0,0,0,40,1,0,0,0,117,3,0,
+ 0,0,102,120,110,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,17,0,0,0,95,114,101,113,
+ 117,105,114,101,115,95,98,117,105,108,116,105,110,79,2,0,
+ 0,115,6,0,0,0,0,2,18,5,13,1,117,17,0,0,
+ 0,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,
+ 105,110,99,1,0,0,0,0,0,0,0,2,0,0,0,3,
+ 0,0,0,3,0,0,0,115,35,0,0,0,135,0,0,102,
+ 1,0,100,1,0,100,2,0,134,0,0,125,1,0,116,0,
+ 0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,40,
+ 3,0,0,0,117,47,0,0,0,68,101,99,111,114,97,116,
+ 111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,101,
+ 32,110,97,109,101,100,32,109,111,100,117,108,101,32,105,115,
+ 32,102,114,111,122,101,110,46,99,2,0,0,0,0,0,0,
+ 0,2,0,0,0,4,0,0,0,19,0,0,0,115,58,0,
+ 0,0,116,0,0,106,1,0,124,1,0,131,1,0,115,45,
+ 0,116,2,0,100,1,0,106,3,0,124,1,0,131,1,0,
+ 100,2,0,124,1,0,131,1,1,130,1,0,110,0,0,136,
+ 0,0,124,0,0,124,1,0,131,2,0,83,40,3,0,0,
+ 0,78,117,25,0,0,0,123,125,32,105,115,32,110,111,116,
+ 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,
+ 117,4,0,0,0,110,97,109,101,40,4,0,0,0,117,4,
+ 0,0,0,95,105,109,112,117,9,0,0,0,105,115,95,102,
+ 114,111,122,101,110,117,11,0,0,0,73,109,112,111,114,116,
+ 69,114,114,111,114,117,6,0,0,0,102,111,114,109,97,116,
+ 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,40,1,0,0,0,
+ 117,3,0,0,0,102,120,110,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 24,0,0,0,95,114,101,113,117,105,114,101,115,95,102,114,
+ 111,122,101,110,95,119,114,97,112,112,101,114,92,2,0,0,
+ 115,8,0,0,0,0,1,15,1,18,1,12,1,117,50,0,
+ 0,0,95,114,101,113,117,105,114,101,115,95,102,114,111,122,
+ 101,110,46,60,108,111,99,97,108,115,62,46,95,114,101,113,
+ 117,105,114,101,115,95,102,114,111,122,101,110,95,119,114,97,
+ 112,112,101,114,40,1,0,0,0,117,5,0,0,0,95,119,
+ 114,97,112,40,2,0,0,0,117,3,0,0,0,102,120,110,
+ 117,24,0,0,0,95,114,101,113,117,105,114,101,115,95,102,
+ 114,111,122,101,110,95,119,114,97,112,112,101,114,40,0,0,
+ 0,0,40,1,0,0,0,117,3,0,0,0,102,120,110,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,16,0,0,0,95,114,101,113,117,105,114,101,115,95,
+ 102,114,111,122,101,110,90,2,0,0,115,6,0,0,0,0,
+ 2,18,5,13,1,117,16,0,0,0,95,114,101,113,117,105,
+ 114,101,115,95,102,114,111,122,101,110,99,2,0,0,0,0,
+ 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,
+ 87,0,0,0,124,0,0,106,0,0,124,1,0,131,1,0,
+ 92,2,0,125,2,0,125,3,0,124,2,0,100,3,0,107,
+ 8,0,114,83,0,116,2,0,124,3,0,131,1,0,114,83,
+ 0,100,1,0,125,4,0,116,3,0,106,4,0,124,4,0,
+ 106,5,0,124,3,0,100,2,0,25,131,1,0,116,6,0,
+ 131,2,0,1,110,0,0,124,2,0,83,40,4,0,0,0,
+ 117,86,0,0,0,84,114,121,32,116,111,32,102,105,110,100,
+ 32,97,32,108,111,97,100,101,114,32,102,111,114,32,116,104,
+ 101,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,
+ 108,101,32,98,121,32,100,101,108,101,103,97,116,105,110,103,
+ 32,116,111,10,32,32,32,32,115,101,108,102,46,102,105,110,
+ 100,95,108,111,97,100,101,114,40,41,46,117,44,0,0,0,
+ 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105,
+ 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115,
+ 105,110,103,32,95,95,105,110,105,116,95,95,105,0,0,0,
+ 0,78,40,7,0,0,0,117,11,0,0,0,102,105,110,100,
+ 95,108,111,97,100,101,114,117,4,0,0,0,78,111,110,101,
+ 117,3,0,0,0,108,101,110,117,9,0,0,0,95,119,97,
+ 114,110,105,110,103,115,117,4,0,0,0,119,97,114,110,117,
+ 6,0,0,0,102,111,114,109,97,116,117,13,0,0,0,73,
+ 109,112,111,114,116,87,97,114,110,105,110,103,40,5,0,0,
+ 0,117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,
+ 117,108,108,110,97,109,101,117,6,0,0,0,108,111,97,100,
+ 101,114,117,8,0,0,0,112,111,114,116,105,111,110,115,117,
+ 3,0,0,0,109,115,103,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,17,0,0,0,95,102,105,110,100,95,109,111,
+ 100,117,108,101,95,115,104,105,109,101,2,0,0,115,10,0,
+ 0,0,0,6,21,1,24,1,6,1,32,1,117,17,0,0,
+ 0,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,
+ 105,109,99,1,0,0,0,0,0,0,0,1,0,0,0,6,
+ 0,0,0,66,0,0,0,115,173,0,0,0,124,0,0,69,
+ 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90,
+ 3,0,101,4,0,100,2,0,100,3,0,132,0,0,131,1,
+ 0,90,5,0,101,4,0,100,14,0,100,4,0,100,5,0,
+ 132,1,0,131,1,0,90,7,0,101,4,0,101,8,0,101,
+ 9,0,101,10,0,100,6,0,100,7,0,132,0,0,131,1,
+ 0,131,1,0,131,1,0,131,1,0,90,11,0,101,4,0,
+ 101,10,0,100,8,0,100,9,0,132,0,0,131,1,0,131,
+ 1,0,90,12,0,101,4,0,101,10,0,100,10,0,100,11,
+ 0,132,0,0,131,1,0,131,1,0,90,13,0,101,4,0,
+ 101,10,0,100,12,0,100,13,0,132,0,0,131,1,0,131,
+ 1,0,90,14,0,100,14,0,83,40,15,0,0,0,117,15,
+ 0,0,0,66,117,105,108,116,105,110,73,109,112,111,114,116,
+ 101,114,117,144,0,0,0,77,101,116,97,32,112,97,116,104,
+ 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108,
+ 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32,
+ 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97,
+ 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32,
+ 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100,
+ 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110,
+ 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97,
+ 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115,
+ 46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,0,
+ 2,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,
+ 0,100,1,0,106,0,0,124,1,0,106,1,0,131,1,0,
+ 83,40,2,0,0,0,78,117,24,0,0,0,60,109,111,100,
+ 117,108,101,32,39,123,125,39,32,40,98,117,105,108,116,45,
+ 105,110,41,62,40,2,0,0,0,117,6,0,0,0,102,111,
+ 114,109,97,116,117,8,0,0,0,95,95,110,97,109,101,95,
+ 95,40,2,0,0,0,117,3,0,0,0,99,108,115,117,6,
+ 0,0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,109,111,100,117,108,101,
+ 95,114,101,112,114,127,2,0,0,115,2,0,0,0,0,2,
+ 117,27,0,0,0,66,117,105,108,116,105,110,73,109,112,111,
+ 114,116,101,114,46,109,111,100,117,108,101,95,114,101,112,114,
+ 99,3,0,0,0,0,0,0,0,3,0,0,0,2,0,0,
+ 0,67,0,0,0,115,39,0,0,0,124,2,0,100,1,0,
+ 107,9,0,114,16,0,100,1,0,83,116,1,0,106,2,0,
+ 124,1,0,131,1,0,114,35,0,124,0,0,83,100,1,0,
+ 83,40,2,0,0,0,117,113,0,0,0,70,105,110,100,32,
+ 116,104,101,32,98,117,105,108,116,45,105,110,32,109,111,100,
+ 117,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102,
+ 32,39,112,97,116,104,39,32,105,115,32,101,118,101,114,32,
+ 115,112,101,99,105,102,105,101,100,32,116,104,101,110,32,116,
+ 104,101,32,115,101,97,114,99,104,32,105,115,32,99,111,110,
+ 115,105,100,101,114,101,100,32,97,32,102,97,105,108,117,114,
+ 101,46,10,10,32,32,32,32,32,32,32,32,78,40,3,0,
+ 0,0,117,4,0,0,0,78,111,110,101,117,4,0,0,0,
+ 95,105,109,112,117,10,0,0,0,105,115,95,98,117,105,108,
+ 116,105,110,40,3,0,0,0,117,3,0,0,0,99,108,115,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,117,4,0,
+ 0,0,112,97,116,104,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,11,0,0,0,102,105,110,100,95,109,111,100,117,
+ 108,101,131,2,0,0,115,6,0,0,0,0,7,12,1,4,
+ 1,117,27,0,0,0,66,117,105,108,116,105,110,73,109,112,
+ 111,114,116,101,114,46,102,105,110,100,95,109,111,100,117,108,
+ 101,99,2,0,0,0,0,0,0,0,3,0,0,0,9,0,
+ 0,0,67,0,0,0,115,88,0,0,0,124,1,0,116,0,
+ 0,106,1,0,107,6,0,125,2,0,121,20,0,116,2,0,
+ 116,3,0,106,4,0,124,1,0,131,2,0,83,87,110,46,
+ 0,1,1,1,124,2,0,12,114,76,0,124,1,0,116,0,
+ 0,106,1,0,107,6,0,114,76,0,116,0,0,106,1,0,
+ 124,1,0,61,110,0,0,130,0,0,89,110,1,0,88,100,
+ 1,0,83,40,2,0,0,0,117,23,0,0,0,76,111,97,
+ 100,32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,
+ 117,108,101,46,78,40,5,0,0,0,117,3,0,0,0,115,
+ 121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,25,
+ 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114,
+ 97,109,101,115,95,114,101,109,111,118,101,100,117,4,0,0,
+ 0,95,105,109,112,117,12,0,0,0,105,110,105,116,95,98,
+ 117,105,108,116,105,110,40,3,0,0,0,117,3,0,0,0,
+ 99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 117,9,0,0,0,105,115,95,114,101,108,111,97,100,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,108,
+ 111,97,100,95,109,111,100,117,108,101,142,2,0,0,115,14,
+ 0,0,0,0,6,15,1,3,1,20,1,3,1,22,1,13,
+ 1,117,27,0,0,0,66,117,105,108,116,105,110,73,109,112,
+ 111,114,116,101,114,46,108,111,97,100,95,109,111,100,117,108,
+ 101,99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,
+ 0,0,67,0,0,0,115,4,0,0,0,100,1,0,83,40,
+ 2,0,0,0,117,57,0,0,0,82,101,116,117,114,110,32,
+ 78,111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,
+ 32,109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,
+ 104,97,118,101,32,99,111,100,101,32,111,98,106,101,99,116,
+ 115,46,78,40,1,0,0,0,117,4,0,0,0,78,111,110,
+ 101,40,2,0,0,0,117,3,0,0,0,99,108,115,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95,
+ 99,111,100,101,156,2,0,0,115,2,0,0,0,0,4,117,
+ 24,0,0,0,66,117,105,108,116,105,110,73,109,112,111,114,
+ 116,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,
+ 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
+ 0,115,4,0,0,0,100,1,0,83,40,2,0,0,0,117,
+ 56,0,0,0,82,101,116,117,114,110,32,78,111,110,101,32,
+ 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,
+ 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,
+ 115,111,117,114,99,101,32,99,111,100,101,46,78,40,1,0,
+ 0,0,117,4,0,0,0,78,111,110,101,40,2,0,0,0,
+ 117,3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,
+ 108,110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,10,0,0,0,103,101,116,95,115,111,117,114,99,101,
+ 162,2,0,0,115,2,0,0,0,0,4,117,26,0,0,0,
+ 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,
+ 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
+ 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
+ 4,0,0,0,100,1,0,83,40,2,0,0,0,117,52,0,
+ 0,0,82,101,116,117,114,110,32,70,97,108,115,101,32,97,
+ 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,
+ 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99,
+ 107,97,103,101,115,46,70,40,1,0,0,0,117,5,0,0,
+ 0,70,97,108,115,101,40,2,0,0,0,117,3,0,0,0,
+ 99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0,
+ 0,105,115,95,112,97,99,107,97,103,101,168,2,0,0,115,
+ 2,0,0,0,0,4,117,26,0,0,0,66,117,105,108,116,
+ 105,110,73,109,112,111,114,116,101,114,46,105,115,95,112,97,
+ 99,107,97,103,101,78,40,15,0,0,0,117,8,0,0,0,
+ 95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,
+ 111,100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,
+ 97,108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,
+ 111,99,95,95,117,11,0,0,0,99,108,97,115,115,109,101,
+ 116,104,111,100,117,11,0,0,0,109,111,100,117,108,101,95,
+ 114,101,112,114,117,4,0,0,0,78,111,110,101,117,11,0,
+ 0,0,102,105,110,100,95,109,111,100,117,108,101,117,11,0,
+ 0,0,115,101,116,95,112,97,99,107,97,103,101,117,10,0,
+ 0,0,115,101,116,95,108,111,97,100,101,114,117,17,0,0,
+ 0,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,
+ 105,110,117,11,0,0,0,108,111,97,100,95,109,111,100,117,
+ 108,101,117,8,0,0,0,103,101,116,95,99,111,100,101,117,
+ 10,0,0,0,103,101,116,95,115,111,117,114,99,101,117,10,
+ 0,0,0,105,115,95,112,97,99,107,97,103,101,40,1,0,
+ 0,0,117,10,0,0,0,95,95,108,111,99,97,108,115,95,
+ 95,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,15,0,
+ 0,0,66,117,105,108,116,105,110,73,109,112,111,114,116,101,
+ 114,118,2,0,0,115,28,0,0,0,16,7,6,2,18,4,
+ 3,1,18,10,3,1,3,1,3,1,27,11,3,1,21,5,
+ 3,1,21,5,3,1,117,15,0,0,0,66,117,105,108,116,
+ 105,110,73,109,112,111,114,116,101,114,99,1,0,0,0,0,
+ 0,0,0,1,0,0,0,6,0,0,0,66,0,0,0,115,
+ 173,0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,
+ 0,90,2,0,100,1,0,90,3,0,101,4,0,100,2,0,
+ 100,3,0,132,0,0,131,1,0,90,5,0,101,4,0,100,
+ 14,0,100,4,0,100,5,0,132,1,0,131,1,0,90,7,
+ 0,101,4,0,101,8,0,101,9,0,101,10,0,100,6,0,
+ 100,7,0,132,0,0,131,1,0,131,1,0,131,1,0,131,
+ 1,0,90,11,0,101,4,0,101,10,0,100,8,0,100,9,
+ 0,132,0,0,131,1,0,131,1,0,90,12,0,101,4,0,
+ 101,10,0,100,10,0,100,11,0,132,0,0,131,1,0,131,
+ 1,0,90,13,0,101,4,0,101,10,0,100,12,0,100,13,
+ 0,132,0,0,131,1,0,131,1,0,90,14,0,100,14,0,
+ 83,40,15,0,0,0,117,14,0,0,0,70,114,111,122,101,
+ 110,73,109,112,111,114,116,101,114,117,142,0,0,0,77,101,
+ 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,
+ 111,114,32,102,114,111,122,101,110,32,109,111,100,117,108,101,
+ 115,46,10,10,32,32,32,32,65,108,108,32,109,101,116,104,
+ 111,100,115,32,97,114,101,32,101,105,116,104,101,114,32,99,
+ 108,97,115,115,32,111,114,32,115,116,97,116,105,99,32,109,
+ 101,116,104,111,100,115,32,116,111,32,97,118,111,105,100,32,
+ 116,104,101,32,110,101,101,100,32,116,111,10,32,32,32,32,
+ 105,110,115,116,97,110,116,105,97,116,101,32,116,104,101,32,
+ 99,108,97,115,115,46,10,10,32,32,32,32,99,2,0,0,
+ 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,
+ 0,115,16,0,0,0,100,1,0,106,0,0,124,1,0,106,
+ 1,0,131,1,0,83,40,2,0,0,0,78,117,22,0,0,
+ 0,60,109,111,100,117,108,101,32,39,123,125,39,32,40,102,
+ 114,111,122,101,110,41,62,40,2,0,0,0,117,6,0,0,
+ 0,102,111,114,109,97,116,117,8,0,0,0,95,95,110,97,
+ 109,101,95,95,40,2,0,0,0,117,3,0,0,0,99,108,
+ 115,117,1,0,0,0,109,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,11,0,0,0,109,111,100,117,108,101,95,114,
+ 101,112,114,184,2,0,0,115,2,0,0,0,0,2,117,26,
+ 0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,101,
+ 114,46,109,111,100,117,108,101,95,114,101,112,114,99,3,0,
+ 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,
+ 0,0,115,23,0,0,0,116,0,0,106,1,0,124,1,0,
+ 131,1,0,114,19,0,124,0,0,83,100,1,0,83,40,2,
+ 0,0,0,117,21,0,0,0,70,105,110,100,32,97,32,102,
+ 114,111,122,101,110,32,109,111,100,117,108,101,46,78,40,3,
+ 0,0,0,117,4,0,0,0,95,105,109,112,117,9,0,0,
+ 0,105,115,95,102,114,111,122,101,110,117,4,0,0,0,78,
+ 111,110,101,40,3,0,0,0,117,3,0,0,0,99,108,115,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,117,4,0,
+ 0,0,112,97,116,104,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,11,0,0,0,102,105,110,100,95,109,111,100,117,
+ 108,101,188,2,0,0,115,2,0,0,0,0,3,117,26,0,
+ 0,0,70,114,111,122,101,110,73,109,112,111,114,116,101,114,
+ 46,102,105,110,100,95,109,111,100,117,108,101,99,2,0,0,
+ 0,0,0,0,0,4,0,0,0,9,0,0,0,67,0,0,
+ 0,115,100,0,0,0,124,1,0,116,0,0,106,1,0,107,
+ 6,0,125,2,0,121,32,0,116,2,0,116,3,0,106,4,
+ 0,124,1,0,131,2,0,125,3,0,124,3,0,96,5,0,
+ 124,3,0,83,87,110,46,0,1,1,1,124,2,0,12,114,
+ 88,0,124,1,0,116,0,0,106,1,0,107,6,0,114,88,
+ 0,116,0,0,106,1,0,124,1,0,61,110,0,0,130,0,
+ 0,89,110,1,0,88,100,1,0,83,40,2,0,0,0,117,
+ 21,0,0,0,76,111,97,100,32,97,32,102,114,111,122,101,
+ 110,32,109,111,100,117,108,101,46,78,40,6,0,0,0,117,
+ 3,0,0,0,115,121,115,117,7,0,0,0,109,111,100,117,
+ 108,101,115,117,25,0,0,0,95,99,97,108,108,95,119,105,
+ 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,
+ 100,117,4,0,0,0,95,105,109,112,117,11,0,0,0,105,
+ 110,105,116,95,102,114,111,122,101,110,117,8,0,0,0,95,
+ 95,102,105,108,101,95,95,40,4,0,0,0,117,3,0,0,
+ 0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,117,9,0,0,0,105,115,95,114,101,108,111,97,100,117,
+ 1,0,0,0,109,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,11,0,0,0,108,111,97,100,95,109,111,100,117,108,
+ 101,193,2,0,0,115,18,0,0,0,0,6,15,1,3,1,
+ 18,2,6,1,8,1,3,1,22,1,13,1,117,26,0,0,
+ 0,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,
+ 108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,0,
+ 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
+ 115,13,0,0,0,116,0,0,106,1,0,124,1,0,131,1,
+ 0,83,40,1,0,0,0,117,45,0,0,0,82,101,116,117,
+ 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,
+ 99,116,32,102,111,114,32,116,104,101,32,102,114,111,122,101,
+ 110,32,109,111,100,117,108,101,46,40,2,0,0,0,117,4,
+ 0,0,0,95,105,109,112,117,17,0,0,0,103,101,116,95,
+ 102,114,111,122,101,110,95,111,98,106,101,99,116,40,2,0,
+ 0,0,117,3,0,0,0,99,108,115,117,8,0,0,0,102,
+ 117,108,108,110,97,109,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,8,0,0,0,103,101,116,95,99,111,100,101,
+ 210,2,0,0,115,2,0,0,0,0,4,117,23,0,0,0,
+ 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,103,
+ 101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,
+ 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,
+ 0,100,1,0,83,40,2,0,0,0,117,54,0,0,0,82,
+ 101,116,117,114,110,32,78,111,110,101,32,97,115,32,102,114,
+ 111,122,101,110,32,109,111,100,117,108,101,115,32,100,111,32,
+ 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32,
+ 99,111,100,101,46,78,40,1,0,0,0,117,4,0,0,0,
+ 78,111,110,101,40,2,0,0,0,117,3,0,0,0,99,108,
+ 115,117,8,0,0,0,102,117,108,108,110,97,109,101,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,103,
+ 101,116,95,115,111,117,114,99,101,216,2,0,0,115,2,0,
+ 0,0,0,4,117,25,0,0,0,70,114,111,122,101,110,73,
+ 109,112,111,114,116,101,114,46,103,101,116,95,115,111,117,114,
+ 99,101,99,2,0,0,0,0,0,0,0,2,0,0,0,2,
+ 0,0,0,67,0,0,0,115,13,0,0,0,116,0,0,106,
+ 1,0,124,1,0,131,1,0,83,40,1,0,0,0,117,46,
+ 0,0,0,82,101,116,117,114,110,32,84,114,117,101,32,105,
+ 102,32,116,104,101,32,102,114,111,122,101,110,32,109,111,100,
+ 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,
+ 46,40,2,0,0,0,117,4,0,0,0,95,105,109,112,117,
+ 17,0,0,0,105,115,95,102,114,111,122,101,110,95,112,97,
+ 99,107,97,103,101,40,2,0,0,0,117,3,0,0,0,99,
+ 108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,
+ 105,115,95,112,97,99,107,97,103,101,222,2,0,0,115,2,
+ 0,0,0,0,4,117,25,0,0,0,70,114,111,122,101,110,
+ 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107,
+ 97,103,101,78,40,15,0,0,0,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,
+ 117,108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,
+ 110,97,109,101,95,95,117,7,0,0,0,95,95,100,111,99,
+ 95,95,117,11,0,0,0,99,108,97,115,115,109,101,116,104,
+ 111,100,117,11,0,0,0,109,111,100,117,108,101,95,114,101,
+ 112,114,117,4,0,0,0,78,111,110,101,117,11,0,0,0,
+ 102,105,110,100,95,109,111,100,117,108,101,117,11,0,0,0,
+ 115,101,116,95,112,97,99,107,97,103,101,117,10,0,0,0,
+ 115,101,116,95,108,111,97,100,101,114,117,16,0,0,0,95,
+ 114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,117,
+ 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,117,
+ 8,0,0,0,103,101,116,95,99,111,100,101,117,10,0,0,
+ 0,103,101,116,95,115,111,117,114,99,101,117,10,0,0,0,
+ 105,115,95,112,97,99,107,97,103,101,40,1,0,0,0,117,
+ 10,0,0,0,95,95,108,111,99,97,108,115,95,95,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,14,0,0,0,70,
+ 114,111,122,101,110,73,109,112,111,114,116,101,114,175,2,0,
+ 0,115,28,0,0,0,16,7,6,2,18,4,3,1,18,4,
+ 3,1,3,1,3,1,27,14,3,1,21,5,3,1,21,5,
+ 3,1,117,14,0,0,0,70,114,111,122,101,110,73,109,112,
+ 111,114,116,101,114,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,4,0,0,0,66,0,0,0,115,101,0,0,0,124,
+ 0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,
+ 1,0,90,3,0,100,2,0,90,4,0,100,3,0,90,5,
+ 0,100,11,0,90,7,0,101,8,0,100,4,0,100,5,0,
+ 132,0,0,131,1,0,90,9,0,101,8,0,100,6,0,100,
+ 7,0,132,0,0,131,1,0,90,10,0,101,8,0,100,10,
+ 0,100,8,0,100,9,0,132,1,0,131,1,0,90,12,0,
+ 100,10,0,83,40,12,0,0,0,117,21,0,0,0,87,105,
+ 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,
+ 100,101,114,117,67,0,0,0,77,101,116,97,32,112,97,116,
+ 104,32,102,105,110,100,101,114,32,102,111,114,32,109,111,100,
+ 117,108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,
+ 32,116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,
+ 105,115,116,114,121,46,10,32,32,32,32,117,59,0,0,0,
+ 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,
+ 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,
+ 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,
+ 92,123,102,117,108,108,110,97,109,101,125,117,65,0,0,0,
+ 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,
+ 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,
+ 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,
+ 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,
+ 103,99,2,0,0,0,0,0,0,0,2,0,0,0,11,0,
+ 0,0,67,0,0,0,115,67,0,0,0,121,23,0,116,0,
+ 0,106,1,0,116,0,0,106,2,0,124,1,0,131,2,0,
+ 83,87,110,37,0,4,116,3,0,107,10,0,114,62,0,1,
+ 1,1,116,0,0,106,1,0,116,0,0,106,4,0,124,1,
+ 0,131,2,0,83,89,110,1,0,88,100,0,0,83,40,1,
+ 0,0,0,78,40,5,0,0,0,117,7,0,0,0,95,119,
+ 105,110,114,101,103,117,7,0,0,0,79,112,101,110,75,101,
+ 121,117,17,0,0,0,72,75,69,89,95,67,85,82,82,69,
+ 78,84,95,85,83,69,82,117,12,0,0,0,87,105,110,100,
+ 111,119,115,69,114,114,111,114,117,18,0,0,0,72,75,69,
+ 89,95,76,79,67,65,76,95,77,65,67,72,73,78,69,40,
+ 2,0,0,0,117,3,0,0,0,99,108,115,117,3,0,0,
+ 0,107,101,121,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,14,0,0,0,95,111,112,101,110,95,114,101,103,105,115,
+ 116,114,121,242,2,0,0,115,8,0,0,0,0,2,3,1,
+ 23,1,13,1,117,36,0,0,0,87,105,110,100,111,119,115,
+ 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,
+ 111,112,101,110,95,114,101,103,105,115,116,114,121,99,2,0,
+ 0,0,0,0,0,0,6,0,0,0,16,0,0,0,67,0,
+ 0,0,115,142,0,0,0,124,0,0,106,0,0,114,21,0,
+ 124,0,0,106,1,0,125,2,0,110,9,0,124,0,0,106,
+ 2,0,125,2,0,124,2,0,106,3,0,100,1,0,124,1,
+ 0,100,2,0,116,4,0,106,5,0,100,0,0,100,3,0,
+ 133,2,0,25,131,0,2,125,3,0,121,46,0,124,0,0,
+ 106,6,0,124,3,0,131,1,0,143,25,0,125,4,0,116,
+ 7,0,106,8,0,124,4,0,100,4,0,131,2,0,125,5,
+ 0,87,100,0,0,81,88,87,110,22,0,4,116,9,0,107,
+ 10,0,114,137,0,1,1,1,100,0,0,83,89,110,1,0,
+ 88,124,5,0,83,40,5,0,0,0,78,117,8,0,0,0,
+ 102,117,108,108,110,97,109,101,117,11,0,0,0,115,121,115,
+ 95,118,101,114,115,105,111,110,105,3,0,0,0,117,0,0,
+ 0,0,40,11,0,0,0,117,11,0,0,0,68,69,66,85,
+ 71,95,66,85,73,76,68,117,18,0,0,0,82,69,71,73,
+ 83,84,82,89,95,75,69,89,95,68,69,66,85,71,117,12,
+ 0,0,0,82,69,71,73,83,84,82,89,95,75,69,89,117,
+ 6,0,0,0,102,111,114,109,97,116,117,3,0,0,0,115,
+ 121,115,117,7,0,0,0,118,101,114,115,105,111,110,117,14,
+ 0,0,0,95,111,112,101,110,95,114,101,103,105,115,116,114,
+ 121,117,7,0,0,0,95,119,105,110,114,101,103,117,10,0,
+ 0,0,81,117,101,114,121,86,97,108,117,101,117,12,0,0,
+ 0,87,105,110,100,111,119,115,69,114,114,111,114,117,4,0,
+ 0,0,78,111,110,101,40,6,0,0,0,117,3,0,0,0,
+ 99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 117,12,0,0,0,114,101,103,105,115,116,114,121,95,107,101,
+ 121,117,3,0,0,0,107,101,121,117,4,0,0,0,104,107,
+ 101,121,117,8,0,0,0,102,105,108,101,112,97,116,104,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,16,0,0,0,
+ 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,
+ 249,2,0,0,115,22,0,0,0,0,2,9,1,12,2,9,
+ 1,15,1,22,1,3,1,18,1,28,1,13,1,9,1,117,
+ 38,0,0,0,87,105,110,100,111,119,115,82,101,103,105,115,
+ 116,114,121,70,105,110,100,101,114,46,95,115,101,97,114,99,
+ 104,95,114,101,103,105,115,116,114,121,99,3,0,0,0,0,
+ 0,0,0,7,0,0,0,12,0,0,0,67,0,0,0,115,
+ 140,0,0,0,124,0,0,106,0,0,124,1,0,131,1,0,
+ 125,3,0,124,3,0,100,1,0,107,8,0,114,31,0,100,
+ 1,0,83,121,17,0,116,2,0,106,3,0,124,3,0,131,
+ 1,0,1,87,110,22,0,4,116,4,0,107,10,0,114,72,
+ 0,1,1,1,100,1,0,83,89,110,1,0,88,120,60,0,
+ 116,5,0,131,0,0,68,93,49,0,92,3,0,125,4,0,
+ 125,5,0,125,6,0,124,3,0,106,6,0,116,7,0,124,
+ 5,0,131,1,0,131,1,0,114,83,0,124,4,0,124,1,
+ 0,124,3,0,131,2,0,83,113,83,0,87,100,1,0,83,
+ 40,2,0,0,0,117,34,0,0,0,70,105,110,100,32,109,
+ 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116,
+ 104,101,32,114,101,103,105,115,116,114,121,46,78,40,8,0,
+ 0,0,117,16,0,0,0,95,115,101,97,114,99,104,95,114,
+ 101,103,105,115,116,114,121,117,4,0,0,0,78,111,110,101,
+ 117,3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,
+ 116,117,7,0,0,0,79,83,69,114,114,111,114,117,27,0,
+ 0,0,95,103,101,116,95,115,117,112,112,111,114,116,101,100,
+ 95,102,105,108,101,95,108,111,97,100,101,114,115,117,8,0,
+ 0,0,101,110,100,115,119,105,116,104,117,5,0,0,0,116,
+ 117,112,108,101,40,7,0,0,0,117,3,0,0,0,99,108,
+ 115,117,8,0,0,0,102,117,108,108,110,97,109,101,117,4,
+ 0,0,0,112,97,116,104,117,8,0,0,0,102,105,108,101,
+ 112,97,116,104,117,6,0,0,0,108,111,97,100,101,114,117,
+ 8,0,0,0,115,117,102,102,105,120,101,115,117,1,0,0,
+ 0,95,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,
+ 0,0,0,102,105,110,100,95,109,111,100,117,108,101,8,3,
+ 0,0,115,20,0,0,0,0,3,15,1,12,1,4,1,3,
+ 1,17,1,13,1,9,1,25,1,21,1,117,33,0,0,0,
+ 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,
+ 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,
+ 101,78,70,40,13,0,0,0,117,8,0,0,0,95,95,110,
+ 97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,
+ 108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,
+ 97,109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,
+ 95,117,12,0,0,0,82,69,71,73,83,84,82,89,95,75,
+ 69,89,117,18,0,0,0,82,69,71,73,83,84,82,89,95,
+ 75,69,89,95,68,69,66,85,71,117,5,0,0,0,70,97,
+ 108,115,101,117,11,0,0,0,68,69,66,85,71,95,66,85,
+ 73,76,68,117,11,0,0,0,99,108,97,115,115,109,101,116,
+ 104,111,100,117,14,0,0,0,95,111,112,101,110,95,114,101,
+ 103,105,115,116,114,121,117,16,0,0,0,95,115,101,97,114,
+ 99,104,95,114,101,103,105,115,116,114,121,117,4,0,0,0,
+ 78,111,110,101,117,11,0,0,0,102,105,110,100,95,109,111,
+ 100,117,108,101,40,1,0,0,0,117,10,0,0,0,95,95,
+ 108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,21,0,0,0,87,105,110,100,111,119,115,
+ 82,101,103,105,115,116,114,121,70,105,110,100,101,114,229,2,
+ 0,0,115,16,0,0,0,16,3,6,3,6,3,6,2,6,
+ 2,18,7,18,15,3,1,117,21,0,0,0,87,105,110,100,
+ 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
+ 114,99,1,0,0,0,0,0,0,0,1,0,0,0,5,0,
+ 0,0,66,0,0,0,115,74,0,0,0,124,0,0,69,101,
+ 0,0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,
+ 0,100,2,0,100,3,0,132,0,0,90,4,0,100,4,0,
+ 100,5,0,132,0,0,90,5,0,101,6,0,100,6,0,100,
+ 10,0,100,7,0,100,8,0,132,0,1,131,1,0,90,8,
+ 0,100,9,0,83,40,11,0,0,0,117,13,0,0,0,95,
+ 76,111,97,100,101,114,66,97,115,105,99,115,117,83,0,0,
+ 0,66,97,115,101,32,99,108,97,115,115,32,111,102,32,99,
+ 111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,101,
+ 100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,101,
+ 76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,46,99,2,0,0,0,0,0,0,0,5,0,0,
+ 0,3,0,0,0,67,0,0,0,115,88,0,0,0,116,0,
+ 0,124,0,0,106,1,0,124,1,0,131,1,0,131,1,0,
+ 100,1,0,25,125,2,0,124,2,0,106,2,0,100,2,0,
+ 100,1,0,131,2,0,100,3,0,25,125,3,0,124,1,0,
+ 106,3,0,100,2,0,131,1,0,100,4,0,25,125,4,0,
+ 124,3,0,100,5,0,107,2,0,111,87,0,124,4,0,100,
+ 5,0,107,3,0,83,40,6,0,0,0,117,141,0,0,0,
+ 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,
+ 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,
+ 99,116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,
+ 97,103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,
+ 105,102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,
+ 97,116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,
+ 103,101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,
+ 32,97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,
+ 95,95,105,110,105,116,95,95,46,112,121,39,46,105,1,0,
+ 0,0,117,1,0,0,0,46,105,0,0,0,0,105,2,0,
+ 0,0,117,8,0,0,0,95,95,105,110,105,116,95,95,40,
+ 4,0,0,0,117,11,0,0,0,95,112,97,116,104,95,115,
+ 112,108,105,116,117,12,0,0,0,103,101,116,95,102,105,108,
+ 101,110,97,109,101,117,6,0,0,0,114,115,112,108,105,116,
+ 117,10,0,0,0,114,112,97,114,116,105,116,105,111,110,40,
+ 5,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,
+ 0,0,102,117,108,108,110,97,109,101,117,8,0,0,0,102,
+ 105,108,101,110,97,109,101,117,13,0,0,0,102,105,108,101,
+ 110,97,109,101,95,98,97,115,101,117,9,0,0,0,116,97,
+ 105,108,95,110,97,109,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,10,0,0,0,105,115,95,112,97,99,107,97,
+ 103,101,28,3,0,0,115,8,0,0,0,0,3,25,1,22,
+ 1,19,1,117,24,0,0,0,95,76,111,97,100,101,114,66,
+ 97,115,105,99,115,46,105,115,95,112,97,99,107,97,103,101,
+ 99,5,0,0,0,0,0,0,0,12,0,0,0,22,0,0,
+ 0,67,0,0,0,115,198,1,0,0,124,2,0,100,1,0,
+ 100,2,0,133,2,0,25,125,5,0,124,2,0,100,2,0,
+ 100,3,0,133,2,0,25,125,6,0,124,2,0,100,3,0,
+ 100,4,0,133,2,0,25,125,7,0,124,5,0,116,0,0,
+ 107,3,0,114,105,0,100,5,0,106,1,0,124,1,0,124,
+ 5,0,131,2,0,125,8,0,116,2,0,124,8,0,100,6,
+ 0,124,1,0,100,7,0,124,3,0,131,1,2,130,1,0,
+ 110,116,0,116,3,0,124,6,0,131,1,0,100,2,0,107,
+ 3,0,114,163,0,100,8,0,106,1,0,124,1,0,131,1,
+ 0,125,9,0,116,4,0,124,9,0,131,1,0,1,116,5,
+ 0,124,9,0,131,1,0,130,1,0,110,58,0,116,3,0,
+ 124,7,0,131,1,0,100,2,0,107,3,0,114,221,0,100,
+ 9,0,106,1,0,124,1,0,131,1,0,125,9,0,116,4,
+ 0,124,9,0,131,1,0,1,116,5,0,124,9,0,131,1,
+ 0,130,1,0,110,0,0,124,4,0,100,1,0,107,9,0,
+ 114,184,1,121,20,0,116,7,0,124,4,0,100,10,0,25,
+ 131,1,0,125,10,0,87,110,18,0,4,116,8,0,107,10,
+ 0,114,17,1,1,1,1,89,110,71,0,88,116,9,0,124,
+ 6,0,131,1,0,124,10,0,107,3,0,114,88,1,100,11,
+ 0,106,1,0,124,1,0,131,1,0,125,9,0,116,4,0,
+ 124,9,0,131,1,0,1,116,2,0,124,9,0,100,6,0,
+ 124,1,0,100,7,0,124,3,0,131,1,2,130,1,0,110,
+ 0,0,121,18,0,124,4,0,100,12,0,25,100,13,0,64,
+ 125,11,0,87,110,18,0,4,116,8,0,107,10,0,114,126,
+ 1,1,1,1,89,113,184,1,88,116,9,0,124,7,0,131,
+ 1,0,124,11,0,107,3,0,114,184,1,116,2,0,100,11,
+ 0,106,1,0,124,1,0,131,1,0,100,6,0,124,1,0,
+ 100,7,0,124,3,0,131,1,2,130,1,0,113,184,1,110,
+ 0,0,124,2,0,100,4,0,100,1,0,133,2,0,25,83,
+ 40,14,0,0,0,117,193,0,0,0,82,101,116,117,114,110,
+ 32,116,104,101,32,109,97,114,115,104,97,108,108,101,100,32,
+ 98,121,116,101,115,32,102,114,111,109,32,98,121,116,101,99,
+ 111,100,101,44,32,118,101,114,105,102,121,105,110,103,32,116,
+ 104,101,32,109,97,103,105,99,10,32,32,32,32,32,32,32,
+ 32,110,117,109,98,101,114,44,32,116,105,109,101,115,116,97,
+ 109,112,32,97,110,100,32,115,111,117,114,99,101,32,115,105,
+ 122,101,32,97,108,111,110,103,32,116,104,101,32,119,97,121,
+ 46,10,10,32,32,32,32,32,32,32,32,73,102,32,115,111,
+ 117,114,99,101,95,115,116,97,116,115,32,105,115,32,78,111,
+ 110,101,32,116,104,101,110,32,115,107,105,112,32,116,104,101,
+ 32,116,105,109,101,115,116,97,109,112,32,99,104,101,99,107,
+ 46,10,10,32,32,32,32,32,32,32,32,78,105,4,0,0,
+ 0,105,8,0,0,0,105,12,0,0,0,117,30,0,0,0,
+ 98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,114,
+ 32,105,110,32,123,33,114,125,58,32,123,33,114,125,117,4,
+ 0,0,0,110,97,109,101,117,4,0,0,0,112,97,116,104,
+ 117,19,0,0,0,98,97,100,32,116,105,109,101,115,116,97,
+ 109,112,32,105,110,32,123,125,117,14,0,0,0,98,97,100,
+ 32,115,105,122,101,32,105,110,32,123,125,117,5,0,0,0,
+ 109,116,105,109,101,117,24,0,0,0,98,121,116,101,99,111,
+ 100,101,32,105,115,32,115,116,97,108,101,32,102,111,114,32,
+ 123,125,117,4,0,0,0,115,105,122,101,108,3,0,0,0,
+ 255,127,255,127,3,0,40,10,0,0,0,117,12,0,0,0,
+ 95,77,65,71,73,67,95,66,89,84,69,83,117,6,0,0,
+ 0,102,111,114,109,97,116,117,11,0,0,0,73,109,112,111,
+ 114,116,69,114,114,111,114,117,3,0,0,0,108,101,110,117,
+ 16,0,0,0,95,118,101,114,98,111,115,101,95,109,101,115,
+ 115,97,103,101,117,8,0,0,0,69,79,70,69,114,114,111,
+ 114,117,4,0,0,0,78,111,110,101,117,3,0,0,0,105,
+ 110,116,117,8,0,0,0,75,101,121,69,114,114,111,114,117,
+ 7,0,0,0,95,114,95,108,111,110,103,40,12,0,0,0,
+ 117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,
+ 108,108,110,97,109,101,117,4,0,0,0,100,97,116,97,117,
+ 13,0,0,0,98,121,116,101,99,111,100,101,95,112,97,116,
+ 104,117,12,0,0,0,115,111,117,114,99,101,95,115,116,97,
+ 116,115,117,5,0,0,0,109,97,103,105,99,117,13,0,0,
+ 0,114,97,119,95,116,105,109,101,115,116,97,109,112,117,8,
+ 0,0,0,114,97,119,95,115,105,122,101,117,3,0,0,0,
+ 109,115,103,117,7,0,0,0,109,101,115,115,97,103,101,117,
+ 12,0,0,0,115,111,117,114,99,101,95,109,116,105,109,101,
+ 117,11,0,0,0,115,111,117,114,99,101,95,115,105,122,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,20,0,0,
+ 0,95,98,121,116,101,115,95,102,114,111,109,95,98,121,116,
+ 101,99,111,100,101,36,3,0,0,115,66,0,0,0,0,7,
+ 16,1,16,1,16,1,12,1,18,1,27,1,18,1,15,1,
+ 10,1,15,1,18,1,15,1,10,1,15,1,12,1,3,1,
+ 20,1,13,1,5,2,18,1,15,1,10,1,15,1,12,1,
+ 3,1,18,1,13,1,5,2,18,1,3,1,15,1,21,3,
+ 117,34,0,0,0,95,76,111,97,100,101,114,66,97,115,105,
+ 99,115,46,95,98,121,116,101,115,95,102,114,111,109,95,98,
+ 121,116,101,99,111,100,101,117,10,0,0,0,115,111,117,114,
+ 99,101,108,101,115,115,99,2,0,0,0,1,0,0,0,5,
+ 0,0,0,12,0,0,0,67,0,0,0,115,227,0,0,0,
+ 124,1,0,106,0,0,125,3,0,124,0,0,106,1,0,124,
+ 3,0,131,1,0,125,4,0,124,0,0,106,2,0,124,3,
+ 0,131,1,0,124,1,0,95,3,0,124,2,0,115,106,0,
+ 121,22,0,116,4,0,124,1,0,106,3,0,131,1,0,124,
+ 1,0,95,5,0,87,113,118,0,4,116,6,0,107,10,0,
+ 114,102,0,1,1,1,124,1,0,106,3,0,124,1,0,95,
+ 5,0,89,113,118,0,88,110,12,0,124,1,0,106,3,0,
+ 124,1,0,95,5,0,124,3,0,124,1,0,95,7,0,124,
+ 0,0,106,8,0,124,3,0,131,1,0,114,170,0,116,9,
+ 0,124,1,0,106,3,0,131,1,0,100,1,0,25,103,1,
+ 0,124,1,0,95,10,0,110,25,0,124,1,0,106,7,0,
+ 106,11,0,100,2,0,131,1,0,100,1,0,25,124,1,0,
+ 95,7,0,124,0,0,124,1,0,95,12,0,116,13,0,116,
+ 14,0,124,4,0,124,1,0,106,15,0,131,3,0,1,124,
+ 1,0,83,40,3,0,0,0,117,82,0,0,0,72,101,108,
+ 112,101,114,32,102,111,114,32,108,111,97,100,95,109,111,100,
+ 117,108,101,32,97,98,108,101,32,116,111,32,104,97,110,100,
+ 108,101,32,101,105,116,104,101,114,32,115,111,117,114,99,101,
+ 32,111,114,32,115,111,117,114,99,101,108,101,115,115,10,32,
+ 32,32,32,32,32,32,32,108,111,97,100,105,110,103,46,105,
+ 0,0,0,0,117,1,0,0,0,46,40,16,0,0,0,117,
+ 8,0,0,0,95,95,110,97,109,101,95,95,117,8,0,0,
+ 0,103,101,116,95,99,111,100,101,117,12,0,0,0,103,101,
+ 116,95,102,105,108,101,110,97,109,101,117,8,0,0,0,95,
+ 95,102,105,108,101,95,95,117,17,0,0,0,99,97,99,104,
+ 101,95,102,114,111,109,95,115,111,117,114,99,101,117,10,0,
+ 0,0,95,95,99,97,99,104,101,100,95,95,117,19,0,0,
+ 0,78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,
+ 114,114,111,114,117,11,0,0,0,95,95,112,97,99,107,97,
+ 103,101,95,95,117,10,0,0,0,105,115,95,112,97,99,107,
+ 97,103,101,117,11,0,0,0,95,112,97,116,104,95,115,112,
+ 108,105,116,117,8,0,0,0,95,95,112,97,116,104,95,95,
+ 117,10,0,0,0,114,112,97,114,116,105,116,105,111,110,117,
+ 10,0,0,0,95,95,108,111,97,100,101,114,95,95,117,25,
+ 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114,
+ 97,109,101,115,95,114,101,109,111,118,101,100,117,4,0,0,
+ 0,101,120,101,99,117,8,0,0,0,95,95,100,105,99,116,
+ 95,95,40,5,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,6,0,0,0,109,111,100,117,108,101,117,10,0,0,0,
+ 115,111,117,114,99,101,108,101,115,115,117,4,0,0,0,110,
+ 97,109,101,117,11,0,0,0,99,111,100,101,95,111,98,106,
+ 101,99,116,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 12,0,0,0,95,108,111,97,100,95,109,111,100,117,108,101,
+ 81,3,0,0,115,32,0,0,0,0,4,9,1,15,1,18,
+ 1,6,1,3,1,22,1,13,1,20,2,12,1,9,1,15,
+ 1,28,2,25,1,9,1,19,1,117,26,0,0,0,95,76,
+ 111,97,100,101,114,66,97,115,105,99,115,46,95,108,111,97,
+ 100,95,109,111,100,117,108,101,78,70,40,9,0,0,0,117,
+ 8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,
+ 0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,
+ 95,95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,
+ 0,95,95,100,111,99,95,95,117,10,0,0,0,105,115,95,
+ 112,97,99,107,97,103,101,117,20,0,0,0,95,98,121,116,
+ 101,115,95,102,114,111,109,95,98,121,116,101,99,111,100,101,
+ 117,17,0,0,0,109,111,100,117,108,101,95,102,111,114,95,
+ 108,111,97,100,101,114,117,5,0,0,0,70,97,108,115,101,
+ 117,12,0,0,0,95,108,111,97,100,95,109,111,100,117,108,
+ 101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,
+ 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,13,0,0,0,95,76,111,97,100,101,114,66,97,115,
+ 105,99,115,23,3,0,0,115,10,0,0,0,16,3,6,2,
+ 12,8,12,45,6,1,117,13,0,0,0,95,76,111,97,100,
+ 101,114,66,97,115,105,99,115,99,1,0,0,0,0,0,0,
+ 0,1,0,0,0,2,0,0,0,66,0,0,0,115,104,0,
+ 0,0,124,0,0,69,101,0,0,90,1,0,100,0,0,90,
+ 2,0,100,1,0,100,2,0,132,0,0,90,3,0,100,3,
+ 0,100,4,0,132,0,0,90,4,0,100,5,0,100,6,0,
+ 132,0,0,90,5,0,100,7,0,100,8,0,132,0,0,90,
+ 6,0,100,9,0,100,10,0,132,0,0,90,7,0,100,11,
+ 0,100,12,0,132,0,0,90,8,0,100,13,0,100,14,0,
+ 132,0,0,90,9,0,100,15,0,83,40,16,0,0,0,117,
+ 12,0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+ 0,67,0,0,0,115,10,0,0,0,116,0,0,130,1,0,
+ 100,1,0,83,40,2,0,0,0,117,121,0,0,0,79,112,
+ 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104,
+ 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109,
+ 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,
+ 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104,
+ 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102,
+ 105,101,100,32,112,97,116,104,44,32,119,104,101,114,101,32,
+ 112,97,116,104,32,105,115,32,97,32,115,116,114,46,10,32,
+ 32,32,32,32,32,32,32,78,40,1,0,0,0,117,19,0,
+ 0,0,78,111,116,73,109,112,108,101,109,101,110,116,101,100,
+ 69,114,114,111,114,40,2,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,4,0,0,0,112,97,116,104,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,10,0,0,0,112,97,116,
+ 104,95,109,116,105,109,101,107,3,0,0,115,2,0,0,0,
+ 0,4,117,23,0,0,0,83,111,117,114,99,101,76,111,97,
+ 100,101,114,46,112,97,116,104,95,109,116,105,109,101,99,2,
+ 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,
+ 0,0,0,115,20,0,0,0,105,1,0,124,0,0,106,0,
+ 0,124,1,0,131,1,0,100,1,0,54,83,40,2,0,0,
+ 0,117,114,1,0,0,79,112,116,105,111,110,97,108,32,109,
+ 101,116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,
+ 97,32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,
+ 102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
+ 100,32,112,97,116,104,10,32,32,32,32,32,32,32,32,116,
+ 111,32,98,121,32,116,104,101,32,112,97,116,104,32,40,115,
+ 116,114,41,46,10,32,32,32,32,32,32,32,32,80,111,115,
+ 115,105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,
+ 32,32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,
+ 97,110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,
+ 32,110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,
+ 109,112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,
+ 101,10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,
+ 32,109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,
+ 32,32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,
+ 40,111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,
+ 101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,
+ 111,102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,
+ 100,101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,
+ 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,
+ 101,116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,
+ 32,108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,
+ 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,
+ 32,32,32,32,32,32,32,32,117,5,0,0,0,109,116,105,
+ 109,101,40,1,0,0,0,117,10,0,0,0,112,97,116,104,
+ 95,109,116,105,109,101,40,2,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,4,0,0,0,112,97,116,104,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,10,0,0,0,112,97,
+ 116,104,95,115,116,97,116,115,113,3,0,0,115,2,0,0,
+ 0,0,10,117,23,0,0,0,83,111,117,114,99,101,76,111,
+ 97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,99,
+ 4,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
+ 67,0,0,0,115,16,0,0,0,124,0,0,106,0,0,124,
+ 2,0,124,3,0,131,2,0,83,40,1,0,0,0,117,228,
+ 0,0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,
+ 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32,
+ 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32,
+ 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115,
+ 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109,
+ 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,
+ 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111,
+ 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102,
+ 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,
+ 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111,
+ 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101,
+ 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,
+ 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102,
+ 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32,
+ 32,32,32,32,32,32,32,40,1,0,0,0,117,8,0,0,
+ 0,115,101,116,95,100,97,116,97,40,4,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,11,0,0,0,115,111,117,114,
+ 99,101,95,112,97,116,104,117,10,0,0,0,99,97,99,104,
+ 101,95,112,97,116,104,117,4,0,0,0,100,97,116,97,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,15,0,0,0,
+ 95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,125,
+ 3,0,0,115,2,0,0,0,0,8,117,28,0,0,0,83,
+ 111,117,114,99,101,76,111,97,100,101,114,46,95,99,97,99,
+ 104,101,95,98,121,116,101,99,111,100,101,99,3,0,0,0,
+ 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0,
+ 115,10,0,0,0,116,0,0,130,1,0,100,1,0,83,40,
+ 2,0,0,0,117,151,0,0,0,79,112,116,105,111,110,97,
+ 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,
+ 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,
+ 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,
+ 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,
+ 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,
+ 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,
+ 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,
+ 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,
+ 102,105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,
+ 78,40,1,0,0,0,117,19,0,0,0,78,111,116,73,109,
+ 112,108,101,109,101,110,116,101,100,69,114,114,111,114,40,3,
+ 0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,
+ 0,112,97,116,104,117,4,0,0,0,100,97,116,97,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,115,
+ 101,116,95,100,97,116,97,135,3,0,0,115,2,0,0,0,
+ 0,6,117,21,0,0,0,83,111,117,114,99,101,76,111,97,
+ 100,101,114,46,115,101,116,95,100,97,116,97,99,2,0,0,
+ 0,0,0,0,0,9,0,0,0,44,0,0,0,67,0,0,
+ 0,115,62,1,0,0,100,1,0,100,2,0,108,0,0,125,
+ 2,0,124,0,0,106,1,0,124,1,0,131,1,0,125,3,
+ 0,121,19,0,124,0,0,106,2,0,124,3,0,131,1,0,
+ 125,4,0,87,110,58,0,4,116,3,0,107,10,0,114,106,
+ 0,1,125,5,0,1,122,26,0,116,4,0,100,3,0,100,
+ 4,0,124,1,0,131,1,1,124,5,0,130,2,0,87,89,
+ 100,2,0,100,2,0,125,5,0,126,5,0,88,110,1,0,
+ 88,116,5,0,106,6,0,124,4,0,131,1,0,106,7,0,
+ 125,6,0,121,19,0,124,2,0,106,8,0,124,6,0,131,
+ 1,0,125,7,0,87,110,58,0,4,116,9,0,107,10,0,
+ 114,204,0,1,125,5,0,1,122,26,0,116,4,0,100,5,
+ 0,100,4,0,124,1,0,131,1,1,124,5,0,130,2,0,
+ 87,89,100,2,0,100,2,0,125,5,0,126,5,0,88,110,
+ 1,0,88,116,5,0,106,10,0,100,2,0,100,7,0,131,
+ 2,0,125,8,0,121,30,0,124,8,0,106,13,0,124,4,
+ 0,106,13,0,124,7,0,100,1,0,25,131,1,0,131,1,
+ 0,83,87,110,58,0,4,116,14,0,107,10,0,114,57,1,
+ 1,125,5,0,1,122,26,0,116,4,0,100,6,0,100,4,
+ 0,124,1,0,131,1,1,124,5,0,130,2,0,87,89,100,
+ 2,0,100,2,0,125,5,0,126,5,0,88,110,1,0,88,
+ 100,2,0,83,40,8,0,0,0,117,52,0,0,0,67,111,
+ 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,
+ 97,116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,
+ 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,
+ 101,46,105,0,0,0,0,78,117,39,0,0,0,115,111,117,
+ 114,99,101,32,110,111,116,32,97,118,97,105,108,97,98,108,
+ 101,32,116,104,114,111,117,103,104,32,103,101,116,95,100,97,
+ 116,97,40,41,117,4,0,0,0,110,97,109,101,117,25,0,
+ 0,0,70,97,105,108,101,100,32,116,111,32,100,101,116,101,
+ 99,116,32,101,110,99,111,100,105,110,103,117,28,0,0,0,
+ 70,97,105,108,101,100,32,116,111,32,100,101,99,111,100,101,
+ 32,115,111,117,114,99,101,32,102,105,108,101,84,40,15,0,
+ 0,0,117,8,0,0,0,116,111,107,101,110,105,122,101,117,
+ 12,0,0,0,103,101,116,95,102,105,108,101,110,97,109,101,
+ 117,8,0,0,0,103,101,116,95,100,97,116,97,117,7,0,
+ 0,0,73,79,69,114,114,111,114,117,11,0,0,0,73,109,
+ 112,111,114,116,69,114,114,111,114,117,3,0,0,0,95,105,
+ 111,117,7,0,0,0,66,121,116,101,115,73,79,117,8,0,
+ 0,0,114,101,97,100,108,105,110,101,117,15,0,0,0,100,
+ 101,116,101,99,116,95,101,110,99,111,100,105,110,103,117,11,
+ 0,0,0,83,121,110,116,97,120,69,114,114,111,114,117,25,
+ 0,0,0,73,110,99,114,101,109,101,110,116,97,108,78,101,
+ 119,108,105,110,101,68,101,99,111,100,101,114,117,4,0,0,
+ 0,78,111,110,101,117,4,0,0,0,84,114,117,101,117,6,
+ 0,0,0,100,101,99,111,100,101,117,18,0,0,0,85,110,
+ 105,99,111,100,101,68,101,99,111,100,101,69,114,114,111,114,
+ 40,9,0,0,0,117,4,0,0,0,115,101,108,102,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,117,8,0,0,0,
+ 116,111,107,101,110,105,122,101,117,4,0,0,0,112,97,116,
+ 104,117,12,0,0,0,115,111,117,114,99,101,95,98,121,116,
+ 101,115,117,3,0,0,0,101,120,99,117,10,0,0,0,114,
+ 101,97,100,115,111,117,114,99,101,117,8,0,0,0,101,110,
+ 99,111,100,105,110,103,117,15,0,0,0,110,101,119,108,105,
+ 110,101,95,100,101,99,111,100,101,114,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,10,0,0,0,103,101,116,95,115,
+ 111,117,114,99,101,144,3,0,0,115,38,0,0,0,0,2,
+ 12,1,15,1,3,1,19,1,18,1,9,1,31,1,18,1,
+ 3,1,19,1,18,1,9,1,31,1,18,1,3,1,30,1,
+ 18,1,9,1,117,23,0,0,0,83,111,117,114,99,101,76,
+ 111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,
+ 99,2,0,0,0,0,0,0,0,12,0,0,0,45,0,0,
+ 0,67,0,0,0,115,52,2,0,0,124,0,0,106,0,0,
+ 124,1,0,131,1,0,125,2,0,100,10,0,125,3,0,121,
+ 16,0,116,2,0,124,2,0,131,1,0,125,4,0,87,110,
+ 24,0,4,116,3,0,107,10,0,114,63,0,1,1,1,100,
+ 10,0,125,4,0,89,110,14,1,88,121,19,0,124,0,0,
+ 106,4,0,124,2,0,131,1,0,125,5,0,87,110,18,0,
+ 4,116,3,0,107,10,0,114,103,0,1,1,1,89,110,230,
+ 0,88,116,5,0,124,5,0,100,1,0,25,131,1,0,125,
+ 3,0,121,19,0,124,0,0,106,6,0,124,4,0,131,1,
+ 0,125,6,0,87,110,18,0,4,116,7,0,107,10,0,114,
+ 159,0,1,1,1,89,110,174,0,88,121,28,0,124,0,0,
+ 106,8,0,124,1,0,124,6,0,124,4,0,124,5,0,131,
+ 4,0,125,7,0,87,110,24,0,4,116,9,0,116,10,0,
+ 102,2,0,107,10,0,114,214,0,1,1,1,89,110,119,0,
+ 88,116,11,0,100,2,0,124,4,0,124,2,0,131,3,0,
+ 1,116,12,0,106,13,0,124,7,0,131,1,0,125,8,0,
+ 116,14,0,124,8,0,116,15,0,131,2,0,114,38,1,116,
+ 16,0,106,17,0,124,8,0,124,2,0,131,2,0,1,116,
+ 11,0,100,3,0,124,4,0,131,2,0,1,124,8,0,83,
+ 100,4,0,125,9,0,116,9,0,124,9,0,106,18,0,124,
+ 4,0,131,1,0,100,5,0,124,1,0,100,6,0,124,4,
+ 0,131,1,2,130,1,0,124,0,0,106,6,0,124,2,0,
+ 131,1,0,125,10,0,116,19,0,116,20,0,124,10,0,124,
+ 2,0,100,7,0,100,8,0,100,11,0,131,4,1,125,11,
+ 0,116,11,0,100,3,0,124,2,0,131,2,0,1,116,22,
+ 0,106,23,0,12,114,48,2,124,4,0,100,10,0,107,9,
+ 0,114,48,2,124,3,0,100,10,0,107,9,0,114,48,2,
+ 116,24,0,116,25,0,131,1,0,125,6,0,124,6,0,106,
+ 26,0,116,27,0,124,3,0,131,1,0,131,1,0,1,124,
+ 6,0,106,26,0,116,27,0,116,28,0,124,10,0,131,1,
+ 0,131,1,0,131,1,0,1,124,6,0,106,26,0,116,12,
+ 0,106,29,0,124,11,0,131,1,0,131,1,0,1,121,36,
+ 0,124,0,0,106,30,0,124,2,0,124,4,0,124,6,0,
+ 131,3,0,1,116,11,0,100,9,0,124,4,0,131,2,0,
+ 1,87,113,48,2,4,116,3,0,107,10,0,114,44,2,1,
+ 1,1,89,113,48,2,88,110,0,0,124,11,0,83,40,12,
+ 0,0,0,117,190,0,0,0,67,111,110,99,114,101,116,101,
+ 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,
+ 111,102,32,73,110,115,112,101,99,116,76,111,97,100,101,114,
+ 46,103,101,116,95,99,111,100,101,46,10,10,32,32,32,32,
+ 32,32,32,32,82,101,97,100,105,110,103,32,111,102,32,98,
+ 121,116,101,99,111,100,101,32,114,101,113,117,105,114,101,115,
+ 32,112,97,116,104,95,115,116,97,116,115,32,116,111,32,98,
+ 101,32,105,109,112,108,101,109,101,110,116,101,100,46,32,84,
+ 111,32,119,114,105,116,101,10,32,32,32,32,32,32,32,32,
+ 98,121,116,101,99,111,100,101,44,32,115,101,116,95,100,97,
+ 116,97,32,109,117,115,116,32,97,108,115,111,32,98,101,32,
+ 105,109,112,108,101,109,101,110,116,101,100,46,10,10,32,32,
+ 32,32,32,32,32,32,117,5,0,0,0,109,116,105,109,101,
+ 117,13,0,0,0,123,125,32,109,97,116,99,104,101,115,32,
+ 123,125,117,19,0,0,0,99,111,100,101,32,111,98,106,101,
+ 99,116,32,102,114,111,109,32,123,125,117,21,0,0,0,78,
+ 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105,
+ 110,32,123,125,117,4,0,0,0,110,97,109,101,117,4,0,
+ 0,0,112,97,116,104,117,4,0,0,0,101,120,101,99,117,
+ 12,0,0,0,100,111,110,116,95,105,110,104,101,114,105,116,
+ 117,10,0,0,0,119,114,111,116,101,32,123,33,114,125,78,
+ 84,40,31,0,0,0,117,12,0,0,0,103,101,116,95,102,
+ 105,108,101,110,97,109,101,117,4,0,0,0,78,111,110,101,
+ 117,17,0,0,0,99,97,99,104,101,95,102,114,111,109,95,
+ 115,111,117,114,99,101,117,19,0,0,0,78,111,116,73,109,
+ 112,108,101,109,101,110,116,101,100,69,114,114,111,114,117,10,
+ 0,0,0,112,97,116,104,95,115,116,97,116,115,117,3,0,
+ 0,0,105,110,116,117,8,0,0,0,103,101,116,95,100,97,
+ 116,97,117,7,0,0,0,73,79,69,114,114,111,114,117,20,
+ 0,0,0,95,98,121,116,101,115,95,102,114,111,109,95,98,
+ 121,116,101,99,111,100,101,117,11,0,0,0,73,109,112,111,
+ 114,116,69,114,114,111,114,117,8,0,0,0,69,79,70,69,
+ 114,114,111,114,117,16,0,0,0,95,118,101,114,98,111,115,
+ 101,95,109,101,115,115,97,103,101,117,7,0,0,0,109,97,
+ 114,115,104,97,108,117,5,0,0,0,108,111,97,100,115,117,
+ 10,0,0,0,105,115,105,110,115,116,97,110,99,101,117,10,
+ 0,0,0,95,99,111,100,101,95,116,121,112,101,117,4,0,
+ 0,0,95,105,109,112,117,16,0,0,0,95,102,105,120,95,
+ 99,111,95,102,105,108,101,110,97,109,101,117,6,0,0,0,
+ 102,111,114,109,97,116,117,25,0,0,0,95,99,97,108,108,
+ 95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,
+ 111,118,101,100,117,7,0,0,0,99,111,109,112,105,108,101,
+ 117,4,0,0,0,84,114,117,101,117,3,0,0,0,115,121,
+ 115,117,19,0,0,0,100,111,110,116,95,119,114,105,116,101,
+ 95,98,121,116,101,99,111,100,101,117,9,0,0,0,98,121,
+ 116,101,97,114,114,97,121,117,12,0,0,0,95,77,65,71,
+ 73,67,95,66,89,84,69,83,117,6,0,0,0,101,120,116,
+ 101,110,100,117,7,0,0,0,95,119,95,108,111,110,103,117,
+ 3,0,0,0,108,101,110,117,5,0,0,0,100,117,109,112,
+ 115,117,15,0,0,0,95,99,97,99,104,101,95,98,121,116,
+ 101,99,111,100,101,40,12,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 117,11,0,0,0,115,111,117,114,99,101,95,112,97,116,104,
+ 117,12,0,0,0,115,111,117,114,99,101,95,109,116,105,109,
+ 101,117,13,0,0,0,98,121,116,101,99,111,100,101,95,112,
+ 97,116,104,117,2,0,0,0,115,116,117,4,0,0,0,100,
+ 97,116,97,117,10,0,0,0,98,121,116,101,115,95,100,97,
+ 116,97,117,5,0,0,0,102,111,117,110,100,117,3,0,0,
+ 0,109,115,103,117,12,0,0,0,115,111,117,114,99,101,95,
+ 98,121,116,101,115,117,11,0,0,0,99,111,100,101,95,111,
+ 98,106,101,99,116,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,8,0,0,0,103,101,116,95,99,111,100,101,166,3,
+ 0,0,115,98,0,0,0,0,7,15,1,6,1,3,1,16,
+ 1,13,1,11,2,3,1,19,1,13,1,5,2,16,1,3,
+ 1,19,1,13,1,5,2,3,1,12,1,3,1,13,1,19,
+ 1,5,2,9,1,7,1,15,1,15,1,16,1,6,1,7,
+ 1,4,2,6,1,18,1,15,1,15,1,6,1,12,1,9,
+ 1,13,1,22,1,12,1,12,1,19,1,25,1,22,1,3,
+ 1,19,1,17,1,13,1,8,1,117,21,0,0,0,83,111,
+ 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,99,
+ 111,100,101,99,2,0,0,0,0,0,0,0,2,0,0,0,
+ 2,0,0,0,67,0,0,0,115,13,0,0,0,124,0,0,
+ 106,0,0,124,1,0,131,1,0,83,40,1,0,0,0,117,
+ 0,1,0,0,67,111,110,99,114,101,116,101,32,105,109,112,
+ 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,76,
+ 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108,
+ 101,46,10,10,32,32,32,32,32,32,32,32,82,101,113,117,
+ 105,114,101,115,32,69,120,101,99,117,116,105,111,110,76,111,
+ 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109,
+ 101,32,97,110,100,32,82,101,115,111,117,114,99,101,76,111,
+ 97,100,101,114,46,103,101,116,95,100,97,116,97,32,116,111,
+ 32,98,101,10,32,32,32,32,32,32,32,32,105,109,112,108,
+ 101,109,101,110,116,101,100,32,116,111,32,108,111,97,100,32,
+ 115,111,117,114,99,101,32,99,111,100,101,46,32,85,115,101,
+ 32,111,102,32,98,121,116,101,99,111,100,101,32,105,115,32,
+ 100,105,99,116,97,116,101,100,32,98,121,32,119,104,101,116,
+ 104,101,114,10,32,32,32,32,32,32,32,32,103,101,116,95,
+ 99,111,100,101,32,117,115,101,115,47,119,114,105,116,101,115,
+ 32,98,121,116,101,99,111,100,101,46,10,10,32,32,32,32,
+ 32,32,32,32,40,1,0,0,0,117,12,0,0,0,95,108,
+ 111,97,100,95,109,111,100,117,108,101,40,2,0,0,0,117,
+ 4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,
+ 108,110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,11,0,0,0,108,111,97,100,95,109,111,100,117,108,
+ 101,228,3,0,0,115,2,0,0,0,0,8,117,24,0,0,
+ 0,83,111,117,114,99,101,76,111,97,100,101,114,46,108,111,
+ 97,100,95,109,111,100,117,108,101,78,40,10,0,0,0,117,
+ 8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,
+ 0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,
+ 95,95,113,117,97,108,110,97,109,101,95,95,117,10,0,0,
+ 0,112,97,116,104,95,109,116,105,109,101,117,10,0,0,0,
+ 112,97,116,104,95,115,116,97,116,115,117,15,0,0,0,95,
+ 99,97,99,104,101,95,98,121,116,101,99,111,100,101,117,8,
+ 0,0,0,115,101,116,95,100,97,116,97,117,10,0,0,0,
+ 103,101,116,95,115,111,117,114,99,101,117,8,0,0,0,103,
+ 101,116,95,99,111,100,101,117,11,0,0,0,108,111,97,100,
+ 95,109,111,100,117,108,101,40,1,0,0,0,117,10,0,0,
+ 0,95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,12,0,0,0,83,111,117,114,
+ 99,101,76,111,97,100,101,114,105,3,0,0,115,14,0,0,
+ 0,16,2,12,6,12,12,12,10,12,9,12,22,12,62,117,
+ 12,0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,
+ 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
+ 0,2,0,0,0,115,92,0,0,0,124,0,0,69,101,0,
+ 0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,0,
+ 100,2,0,100,3,0,132,0,0,90,4,0,101,5,0,135,
+ 0,0,102,1,0,100,4,0,100,5,0,134,0,0,131,1,
+ 0,90,6,0,101,5,0,100,6,0,100,7,0,132,0,0,
+ 131,1,0,90,7,0,100,8,0,100,9,0,132,0,0,90,
+ 8,0,135,0,0,83,40,10,0,0,0,117,10,0,0,0,
+ 70,105,108,101,76,111,97,100,101,114,117,103,0,0,0,66,
+ 97,115,101,32,102,105,108,101,32,108,111,97,100,101,114,32,
+ 99,108,97,115,115,32,119,104,105,99,104,32,105,109,112,108,
+ 101,109,101,110,116,115,32,116,104,101,32,108,111,97,100,101,
+ 114,32,112,114,111,116,111,99,111,108,32,109,101,116,104,111,
+ 100,115,32,116,104,97,116,10,32,32,32,32,114,101,113,117,
+ 105,114,101,32,102,105,108,101,32,115,121,115,116,101,109,32,
+ 117,115,97,103,101,46,99,3,0,0,0,0,0,0,0,3,
+ 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,
+ 124,1,0,124,0,0,95,0,0,124,2,0,124,0,0,95,
+ 1,0,100,1,0,83,40,2,0,0,0,117,75,0,0,0,
+ 67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,
+ 32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,
+ 116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,
+ 111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,
+ 32,32,32,32,102,105,110,100,101,114,46,78,40,2,0,0,
+ 0,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,
+ 97,116,104,40,3,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,4,
+ 0,0,0,112,97,116,104,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,8,0,0,0,95,95,105,110,105,116,95,95,
+ 244,3,0,0,115,4,0,0,0,0,3,9,1,117,19,0,
+ 0,0,70,105,108,101,76,111,97,100,101,114,46,95,95,105,
+ 110,105,116,95,95,99,2,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,3,0,0,0,115,22,0,0,0,116,
+ 0,0,116,1,0,124,0,0,131,2,0,106,2,0,124,1,
+ 0,131,1,0,83,40,1,0,0,0,117,26,0,0,0,76,
+ 111,97,100,32,97,32,109,111,100,117,108,101,32,102,114,111,
+ 109,32,97,32,102,105,108,101,46,40,3,0,0,0,117,5,
+ 0,0,0,115,117,112,101,114,117,10,0,0,0,70,105,108,
+ 101,76,111,97,100,101,114,117,11,0,0,0,108,111,97,100,
+ 95,109,111,100,117,108,101,40,2,0,0,0,117,4,0,0,
+ 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,40,1,0,0,0,117,9,0,0,0,95,95,99,108,
+ 97,115,115,95,95,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,
+ 0,108,111,97,100,95,109,111,100,117,108,101,250,3,0,0,
+ 115,2,0,0,0,0,5,117,22,0,0,0,70,105,108,101,
+ 76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,
+ 108,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1,
+ 0,0,0,67,0,0,0,115,7,0,0,0,124,0,0,106,
+ 0,0,83,40,1,0,0,0,117,58,0,0,0,82,101,116,
+ 117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,32,
+ 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,32,
+ 97,115,32,102,111,117,110,100,32,98,121,32,116,104,101,32,
+ 102,105,110,100,101,114,46,40,1,0,0,0,117,4,0,0,
+ 0,112,97,116,104,40,2,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,
+ 0,103,101,116,95,102,105,108,101,110,97,109,101,1,4,0,
+ 0,115,2,0,0,0,0,3,117,23,0,0,0,70,105,108,
+ 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,
+ 110,97,109,101,99,2,0,0,0,0,0,0,0,3,0,0,
+ 0,8,0,0,0,67,0,0,0,115,41,0,0,0,116,0,
+ 0,106,1,0,124,1,0,100,1,0,131,2,0,143,17,0,
+ 125,2,0,124,2,0,106,2,0,131,0,0,83,87,100,2,
+ 0,81,88,100,2,0,83,40,3,0,0,0,117,39,0,0,
+ 0,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97,
+ 32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97,
+ 119,32,98,121,116,101,115,46,117,1,0,0,0,114,78,40,
+ 3,0,0,0,117,3,0,0,0,95,105,111,117,6,0,0,
+ 0,70,105,108,101,73,79,117,4,0,0,0,114,101,97,100,
+ 40,3,0,0,0,117,4,0,0,0,115,101,108,102,117,4,
+ 0,0,0,112,97,116,104,117,4,0,0,0,102,105,108,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,
+ 0,103,101,116,95,100,97,116,97,6,4,0,0,115,4,0,
+ 0,0,0,2,21,1,117,19,0,0,0,70,105,108,101,76,
+ 111,97,100,101,114,46,103,101,116,95,100,97,116,97,40,9,
+ 0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,
+ 117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,
+ 12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,
+ 117,7,0,0,0,95,95,100,111,99,95,95,117,8,0,0,
+ 0,95,95,105,110,105,116,95,95,117,11,0,0,0,95,99,
+ 104,101,99,107,95,110,97,109,101,117,11,0,0,0,108,111,
+ 97,100,95,109,111,100,117,108,101,117,12,0,0,0,103,101,
+ 116,95,102,105,108,101,110,97,109,101,117,8,0,0,0,103,
+ 101,116,95,100,97,116,97,40,1,0,0,0,117,10,0,0,
+ 0,95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,
+ 40,1,0,0,0,117,9,0,0,0,95,95,99,108,97,115,
+ 115,95,95,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,10,0,0,0,70,105,108,101,76,111,
+ 97,100,101,114,239,3,0,0,115,10,0,0,0,16,3,6,
+ 2,12,6,24,7,18,5,117,10,0,0,0,70,105,108,101,
+ 76,111,97,100,101,114,99,1,0,0,0,0,0,0,0,1,
+ 0,0,0,4,0,0,0,66,0,0,0,115,68,0,0,0,
+ 124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,
+ 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,
+ 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6,
+ 0,100,7,0,100,8,0,100,9,0,132,0,1,90,6,0,
+ 100,10,0,83,40,11,0,0,0,117,16,0,0,0,83,111,
+ 117,114,99,101,70,105,108,101,76,111,97,100,101,114,117,62,
+ 0,0,0,67,111,110,99,114,101,116,101,32,105,109,112,108,
+ 101,109,101,110,116,97,116,105,111,110,32,111,102,32,83,111,
+ 117,114,99,101,76,111,97,100,101,114,32,117,115,105,110,103,
+ 32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,
+ 46,99,2,0,0,0,0,0,0,0,3,0,0,0,3,0,
+ 0,0,67,0,0,0,115,39,0,0,0,116,0,0,106,1,
+ 0,124,1,0,131,1,0,125,2,0,105,2,0,124,2,0,
+ 106,2,0,100,1,0,54,124,2,0,106,3,0,100,2,0,
+ 54,83,40,3,0,0,0,117,33,0,0,0,82,101,116,117,
+ 114,110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,
+ 102,111,114,32,116,104,101,32,112,97,116,104,46,117,5,0,
+ 0,0,109,116,105,109,101,117,4,0,0,0,115,105,122,101,
+ 40,4,0,0,0,117,3,0,0,0,95,111,115,117,4,0,
+ 0,0,115,116,97,116,117,8,0,0,0,115,116,95,109,116,
+ 105,109,101,117,7,0,0,0,115,116,95,115,105,122,101,40,
+ 3,0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,
+ 0,0,112,97,116,104,117,2,0,0,0,115,116,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,10,0,0,0,112,97,
+ 116,104,95,115,116,97,116,115,16,4,0,0,115,4,0,0,
+ 0,0,2,15,1,117,27,0,0,0,83,111,117,114,99,101,
+ 70,105,108,101,76,111,97,100,101,114,46,112,97,116,104,95,
+ 115,116,97,116,115,99,4,0,0,0,0,0,0,0,5,0,
+ 0,0,13,0,0,0,67,0,0,0,115,81,0,0,0,121,
+ 22,0,116,0,0,106,1,0,124,1,0,131,1,0,106,2,
+ 0,125,4,0,87,110,24,0,4,116,3,0,107,10,0,114,
+ 48,0,1,1,1,100,1,0,125,4,0,89,110,1,0,88,
+ 124,4,0,100,2,0,79,125,4,0,124,0,0,106,4,0,
+ 124,2,0,124,3,0,100,3,0,124,4,0,131,2,1,83,
+ 40,4,0,0,0,78,105,182,1,0,0,105,128,0,0,0,
+ 117,5,0,0,0,95,109,111,100,101,40,5,0,0,0,117,
+ 3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116,
+ 117,7,0,0,0,115,116,95,109,111,100,101,117,7,0,0,
+ 0,79,83,69,114,114,111,114,117,8,0,0,0,115,101,116,
+ 95,100,97,116,97,40,5,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,11,0,0,0,115,111,117,114,99,101,95,112,
+ 97,116,104,117,13,0,0,0,98,121,116,101,99,111,100,101,
+ 95,112,97,116,104,117,4,0,0,0,100,97,116,97,117,4,
+ 0,0,0,109,111,100,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,15,0,0,0,95,99,97,99,104,101,95,98,
+ 121,116,101,99,111,100,101,21,4,0,0,115,12,0,0,0,
+ 0,2,3,1,22,1,13,1,11,3,10,1,117,32,0,0,
+ 0,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,
+ 114,46,95,99,97,99,104,101,95,98,121,116,101,99,111,100,
+ 101,117,5,0,0,0,95,109,111,100,101,105,182,1,0,0,
+ 99,3,0,0,0,1,0,0,0,9,0,0,0,18,0,0,
+ 0,67,0,0,0,115,53,1,0,0,116,0,0,124,1,0,
+ 131,1,0,92,2,0,125,4,0,125,5,0,103,0,0,125,
+ 6,0,120,54,0,124,4,0,114,80,0,116,1,0,124,4,
+ 0,131,1,0,12,114,80,0,116,0,0,124,4,0,131,1,
+ 0,92,2,0,125,4,0,125,7,0,124,6,0,106,2,0,
+ 124,7,0,131,1,0,1,113,27,0,87,120,132,0,116,3,
+ 0,124,6,0,131,1,0,68,93,118,0,125,7,0,116,4,
+ 0,124,4,0,124,7,0,131,2,0,125,4,0,121,17,0,
+ 116,5,0,106,6,0,124,4,0,131,1,0,1,87,113,94,
+ 0,4,116,7,0,107,10,0,114,155,0,1,1,1,119,94,
+ 0,89,113,94,0,4,116,8,0,107,10,0,114,211,0,1,
+ 125,8,0,1,122,25,0,116,9,0,100,1,0,124,4,0,
+ 124,8,0,131,3,0,1,100,2,0,83,87,89,100,2,0,
+ 100,2,0,125,8,0,126,8,0,88,113,94,0,88,113,94,
+ 0,87,121,33,0,116,10,0,124,1,0,124,2,0,124,3,
+ 0,131,3,0,1,116,9,0,100,3,0,124,1,0,131,2,
+ 0,1,87,110,53,0,4,116,8,0,107,10,0,114,48,1,
+ 1,125,8,0,1,122,21,0,116,9,0,100,1,0,124,1,
+ 0,124,8,0,131,3,0,1,87,89,100,2,0,100,2,0,
+ 125,8,0,126,8,0,88,110,1,0,88,100,2,0,83,40,
+ 4,0,0,0,117,27,0,0,0,87,114,105,116,101,32,98,
+ 121,116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,
+ 105,108,101,46,117,27,0,0,0,99,111,117,108,100,32,110,
+ 111,116,32,99,114,101,97,116,101,32,123,33,114,125,58,32,
+ 123,33,114,125,78,117,12,0,0,0,99,114,101,97,116,101,
+ 100,32,123,33,114,125,40,11,0,0,0,117,11,0,0,0,
+ 95,112,97,116,104,95,115,112,108,105,116,117,11,0,0,0,
+ 95,112,97,116,104,95,105,115,100,105,114,117,6,0,0,0,
+ 97,112,112,101,110,100,117,8,0,0,0,114,101,118,101,114,
+ 115,101,100,117,10,0,0,0,95,112,97,116,104,95,106,111,
+ 105,110,117,3,0,0,0,95,111,115,117,5,0,0,0,109,
+ 107,100,105,114,117,15,0,0,0,70,105,108,101,69,120,105,
+ 115,116,115,69,114,114,111,114,117,7,0,0,0,79,83,69,
+ 114,114,111,114,117,16,0,0,0,95,118,101,114,98,111,115,
+ 101,95,109,101,115,115,97,103,101,117,13,0,0,0,95,119,
+ 114,105,116,101,95,97,116,111,109,105,99,40,9,0,0,0,
+ 117,4,0,0,0,115,101,108,102,117,4,0,0,0,112,97,
+ 116,104,117,4,0,0,0,100,97,116,97,117,5,0,0,0,
+ 95,109,111,100,101,117,6,0,0,0,112,97,114,101,110,116,
+ 117,8,0,0,0,102,105,108,101,110,97,109,101,117,10,0,
+ 0,0,112,97,116,104,95,112,97,114,116,115,117,4,0,0,
+ 0,112,97,114,116,117,3,0,0,0,101,120,99,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,8,0,0,0,115,101,
+ 116,95,100,97,116,97,32,4,0,0,115,38,0,0,0,0,
+ 2,18,1,6,2,22,1,18,1,17,2,19,1,15,1,3,
+ 1,17,1,13,2,7,1,18,3,16,1,27,1,3,1,16,
+ 1,17,1,18,2,117,25,0,0,0,83,111,117,114,99,101,
+ 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100,
+ 97,116,97,78,40,7,0,0,0,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,
+ 117,108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,
+ 110,97,109,101,95,95,117,7,0,0,0,95,95,100,111,99,
+ 95,95,117,10,0,0,0,112,97,116,104,95,115,116,97,116,
+ 115,117,15,0,0,0,95,99,97,99,104,101,95,98,121,116,
+ 101,99,111,100,101,117,8,0,0,0,115,101,116,95,100,97,
+ 116,97,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,16,0,0,0,83,111,117,114,99,101,70,105,108,
+ 101,76,111,97,100,101,114,12,4,0,0,115,8,0,0,0,
+ 16,2,6,2,12,5,12,11,117,16,0,0,0,83,111,117,
+ 114,99,101,70,105,108,101,76,111,97,100,101,114,99,1,0,
+ 0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,
+ 0,0,115,62,0,0,0,124,0,0,69,101,0,0,90,1,
+ 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,
+ 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,
+ 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,
+ 0,100,8,0,83,40,9,0,0,0,117,20,0,0,0,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,117,45,0,0,0,76,111,97,100,101,114,32,119,
+ 104,105,99,104,32,104,97,110,100,108,101,115,32,115,111,117,
+ 114,99,101,108,101,115,115,32,102,105,108,101,32,105,109,112,
+ 111,114,116,115,46,99,2,0,0,0,0,0,0,0,2,0,
+ 0,0,4,0,0,0,67,0,0,0,115,19,0,0,0,124,
+ 0,0,106,0,0,124,1,0,100,1,0,100,2,0,131,1,
+ 1,83,40,3,0,0,0,78,117,10,0,0,0,115,111,117,
+ 114,99,101,108,101,115,115,84,40,2,0,0,0,117,12,0,
+ 0,0,95,108,111,97,100,95,109,111,100,117,108,101,117,4,
+ 0,0,0,84,114,117,101,40,2,0,0,0,117,4,0,0,
+ 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,
+ 0,0,0,108,111,97,100,95,109,111,100,117,108,101,65,4,
+ 0,0,115,2,0,0,0,0,1,117,32,0,0,0,83,111,
+ 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,
+ 101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,
+ 0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,67,
+ 0,0,0,115,138,0,0,0,124,0,0,106,0,0,124,1,
+ 0,131,1,0,125,2,0,124,0,0,106,1,0,124,2,0,
+ 131,1,0,125,3,0,124,0,0,106,2,0,124,1,0,124,
+ 3,0,124,2,0,100,0,0,131,4,0,125,4,0,116,4,
+ 0,106,5,0,124,4,0,131,1,0,125,5,0,116,6,0,
+ 124,5,0,116,7,0,131,2,0,114,101,0,116,8,0,100,
+ 1,0,124,2,0,131,2,0,1,124,5,0,83,116,9,0,
+ 100,2,0,106,10,0,124,2,0,131,1,0,100,3,0,124,
+ 1,0,100,4,0,124,2,0,131,1,2,130,1,0,100,0,
+ 0,83,40,5,0,0,0,78,117,21,0,0,0,99,111,100,
+ 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33,
+ 114,125,117,21,0,0,0,78,111,110,45,99,111,100,101,32,
+ 111,98,106,101,99,116,32,105,110,32,123,125,117,4,0,0,
+ 0,110,97,109,101,117,4,0,0,0,112,97,116,104,40,11,
+ 0,0,0,117,12,0,0,0,103,101,116,95,102,105,108,101,
+ 110,97,109,101,117,8,0,0,0,103,101,116,95,100,97,116,
+ 97,117,20,0,0,0,95,98,121,116,101,115,95,102,114,111,
+ 109,95,98,121,116,101,99,111,100,101,117,4,0,0,0,78,
+ 111,110,101,117,7,0,0,0,109,97,114,115,104,97,108,117,
+ 5,0,0,0,108,111,97,100,115,117,10,0,0,0,105,115,
+ 105,110,115,116,97,110,99,101,117,10,0,0,0,95,99,111,
+ 100,101,95,116,121,112,101,117,16,0,0,0,95,118,101,114,
+ 98,111,115,101,95,109,101,115,115,97,103,101,117,11,0,0,
+ 0,73,109,112,111,114,116,69,114,114,111,114,117,6,0,0,
+ 0,102,111,114,109,97,116,40,6,0,0,0,117,4,0,0,
+ 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,117,4,0,0,0,112,97,116,104,117,4,0,0,0,
+ 100,97,116,97,117,10,0,0,0,98,121,116,101,115,95,100,
+ 97,116,97,117,5,0,0,0,102,111,117,110,100,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,8,0,0,0,103,101,
+ 116,95,99,111,100,101,68,4,0,0,115,18,0,0,0,0,
+ 1,15,1,15,1,24,1,15,1,15,1,13,1,4,2,18,
+ 1,117,29,0,0,0,83,111,117,114,99,101,108,101,115,115,
+ 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,
+ 111,100,101,99,2,0,0,0,0,0,0,0,2,0,0,0,
+ 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,0,
+ 83,40,2,0,0,0,117,39,0,0,0,82,101,116,117,114,
+ 110,32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,
+ 105,115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,
+ 101,46,78,40,1,0,0,0,117,4,0,0,0,78,111,110,
+ 101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,
+ 8,0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,10,0,0,0,103,101,116,
+ 95,115,111,117,114,99,101,80,4,0,0,115,2,0,0,0,
+ 0,2,117,31,0,0,0,83,111,117,114,99,101,108,101,115,
+ 115,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+ 115,111,117,114,99,101,78,40,7,0,0,0,117,8,0,0,
+ 0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,
+ 109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113,
+ 117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95,
+ 100,111,99,95,95,117,11,0,0,0,108,111,97,100,95,109,
+ 111,100,117,108,101,117,8,0,0,0,103,101,116,95,99,111,
+ 100,101,117,10,0,0,0,103,101,116,95,115,111,117,114,99,
+ 101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,
+ 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,20,0,0,0,83,111,117,114,99,101,108,101,115,115,
+ 70,105,108,101,76,111,97,100,101,114,61,4,0,0,115,8,
+ 0,0,0,16,2,6,2,12,3,12,12,117,20,0,0,0,
+ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
+ 97,100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,5,0,0,0,66,0,0,0,115,104,0,0,0,124,0,
+ 0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,
+ 0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,
+ 101,5,0,101,6,0,101,7,0,100,4,0,100,5,0,132,
+ 0,0,131,1,0,131,1,0,131,1,0,90,8,0,100,6,
+ 0,100,7,0,132,0,0,90,9,0,100,8,0,100,9,0,
+ 132,0,0,90,10,0,100,10,0,100,11,0,132,0,0,90,
+ 11,0,100,12,0,83,40,13,0,0,0,117,19,0,0,0,
+ 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,
+ 100,101,114,117,93,0,0,0,76,111,97,100,101,114,32,102,
+ 111,114,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
+ 117,108,101,115,46,10,10,32,32,32,32,84,104,101,32,99,
+ 111,110,115,116,114,117,99,116,111,114,32,105,115,32,100,101,
+ 115,105,103,110,101,100,32,116,111,32,119,111,114,107,32,119,
+ 105,116,104,32,70,105,108,101,70,105,110,100,101,114,46,10,
+ 10,32,32,32,32,99,3,0,0,0,0,0,0,0,3,0,
+ 0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,124,
+ 1,0,124,0,0,95,0,0,124,2,0,124,0,0,95,1,
+ 0,100,0,0,83,40,1,0,0,0,78,40,2,0,0,0,
+ 117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,
+ 116,104,40,3,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,
+ 116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,
+ 0,0,0,95,95,105,110,105,116,95,95,97,4,0,0,115,
+ 4,0,0,0,0,1,9,1,117,28,0,0,0,69,120,116,
+ 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
+ 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,
+ 0,0,4,0,0,0,10,0,0,0,67,0,0,0,115,175,
+ 0,0,0,124,1,0,116,0,0,106,1,0,107,6,0,125,
+ 2,0,121,107,0,116,2,0,116,3,0,106,4,0,124,1,
+ 0,124,0,0,106,5,0,131,3,0,125,3,0,116,6,0,
+ 100,1,0,124,0,0,106,5,0,131,2,0,1,124,0,0,
+ 106,7,0,124,1,0,131,1,0,114,117,0,116,8,0,124,
+ 3,0,100,2,0,131,2,0,12,114,117,0,116,9,0,124,
+ 0,0,106,5,0,131,1,0,100,3,0,25,103,1,0,124,
+ 3,0,95,10,0,110,0,0,124,3,0,83,87,110,46,0,
+ 1,1,1,124,2,0,12,114,163,0,124,1,0,116,0,0,
+ 106,1,0,107,6,0,114,163,0,116,0,0,106,1,0,124,
+ 1,0,61,110,0,0,130,0,0,89,110,1,0,88,100,4,
+ 0,83,40,5,0,0,0,117,25,0,0,0,76,111,97,100,
+ 32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,111,
+ 100,117,108,101,46,117,33,0,0,0,101,120,116,101,110,115,
+ 105,111,110,32,109,111,100,117,108,101,32,108,111,97,100,101,
+ 100,32,102,114,111,109,32,123,33,114,125,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,105,0,0,0,0,78,40,11,
+ 0,0,0,117,3,0,0,0,115,121,115,117,7,0,0,0,
+ 109,111,100,117,108,101,115,117,25,0,0,0,95,99,97,108,
+ 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,
+ 109,111,118,101,100,117,4,0,0,0,95,105,109,112,117,12,
+ 0,0,0,108,111,97,100,95,100,121,110,97,109,105,99,117,
+ 4,0,0,0,112,97,116,104,117,16,0,0,0,95,118,101,
+ 114,98,111,115,101,95,109,101,115,115,97,103,101,117,10,0,
+ 0,0,105,115,95,112,97,99,107,97,103,101,117,7,0,0,
+ 0,104,97,115,97,116,116,114,117,11,0,0,0,95,112,97,
+ 116,104,95,115,112,108,105,116,117,8,0,0,0,95,95,112,
+ 97,116,104,95,95,40,4,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,
+ 117,9,0,0,0,105,115,95,114,101,108,111,97,100,117,6,
+ 0,0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109,
+ 111,100,117,108,101,101,4,0,0,115,24,0,0,0,0,5,
+ 15,1,3,1,9,1,15,1,16,1,31,1,28,1,8,1,
+ 3,1,22,1,13,1,117,31,0,0,0,69,120,116,101,110,
+ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,108,
+ 111,97,100,95,109,111,100,117,108,101,99,2,0,0,0,0,
+ 0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,
+ 48,0,0,0,116,0,0,124,0,0,106,1,0,131,1,0,
+ 100,1,0,25,137,0,0,116,2,0,135,0,0,102,1,0,
+ 100,2,0,100,3,0,134,0,0,116,3,0,68,131,1,0,
+ 131,1,0,83,40,4,0,0,0,117,49,0,0,0,82,101,
+ 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,
+ 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
+ 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,105,
+ 1,0,0,0,99,1,0,0,0,0,0,0,0,2,0,0,
+ 0,4,0,0,0,51,0,0,0,115,31,0,0,0,124,0,
+ 0,93,21,0,125,1,0,136,0,0,100,0,0,124,1,0,
+ 23,107,2,0,86,1,113,3,0,100,1,0,83,40,2,0,
+ 0,0,117,8,0,0,0,95,95,105,110,105,116,95,95,78,
+ 40,0,0,0,0,40,2,0,0,0,117,2,0,0,0,46,
+ 48,117,6,0,0,0,115,117,102,102,105,120,40,1,0,0,
+ 0,117,9,0,0,0,102,105,108,101,95,110,97,109,101,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,9,0,0,0,60,103,101,110,101,
+ 120,112,114,62,122,4,0,0,115,2,0,0,0,6,1,117,
+ 49,0,0,0,69,120,116,101,110,115,105,111,110,70,105,108,
+ 101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,
+ 103,101,46,60,108,111,99,97,108,115,62,46,60,103,101,110,
+ 101,120,112,114,62,40,4,0,0,0,117,11,0,0,0,95,
+ 112,97,116,104,95,115,112,108,105,116,117,4,0,0,0,112,
+ 97,116,104,117,3,0,0,0,97,110,121,117,18,0,0,0,
+ 69,88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,
+ 69,83,40,2,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,40,0,0,
+ 0,0,40,1,0,0,0,117,9,0,0,0,102,105,108,101,
+ 95,110,97,109,101,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,112,
+ 97,99,107,97,103,101,119,4,0,0,115,6,0,0,0,0,
+ 2,19,1,18,1,117,30,0,0,0,69,120,116,101,110,115,
+ 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,
+ 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,
+ 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,
+ 0,0,100,1,0,83,40,2,0,0,0,117,63,0,0,0,
+ 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,
+ 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+ 108,101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,
+ 32,97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,
+ 40,1,0,0,0,117,4,0,0,0,78,111,110,101,40,2,
+ 0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,0,
+ 0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,103,101,116,95,99,111,
+ 100,101,125,4,0,0,115,2,0,0,0,0,2,117,28,0,
+ 0,0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,
+ 111,97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,
+ 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
+ 0,0,0,115,4,0,0,0,100,1,0,83,40,2,0,0,
+ 0,117,53,0,0,0,82,101,116,117,114,110,32,78,111,110,
+ 101,32,97,115,32,101,120,116,101,110,115,105,111,110,32,109,
+ 111,100,117,108,101,115,32,104,97,118,101,32,110,111,32,115,
+ 111,117,114,99,101,32,99,111,100,101,46,78,40,1,0,0,
+ 0,117,4,0,0,0,78,111,110,101,40,2,0,0,0,117,
+ 4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,
+ 108,110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,10,0,0,0,103,101,116,95,115,111,117,114,99,101,
+ 129,4,0,0,115,2,0,0,0,0,2,117,30,0,0,0,
+ 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,
+ 100,101,114,46,103,101,116,95,115,111,117,114,99,101,78,40,
+ 12,0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,
+ 95,117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,
+ 117,12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,
+ 95,117,7,0,0,0,95,95,100,111,99,95,95,117,8,0,
+ 0,0,95,95,105,110,105,116,95,95,117,11,0,0,0,95,
+ 99,104,101,99,107,95,110,97,109,101,117,11,0,0,0,115,
+ 101,116,95,112,97,99,107,97,103,101,117,10,0,0,0,115,
+ 101,116,95,108,111,97,100,101,114,117,11,0,0,0,108,111,
+ 97,100,95,109,111,100,117,108,101,117,10,0,0,0,105,115,
+ 95,112,97,99,107,97,103,101,117,8,0,0,0,103,101,116,
+ 95,99,111,100,101,117,10,0,0,0,103,101,116,95,115,111,
+ 117,114,99,101,40,1,0,0,0,117,10,0,0,0,95,95,
+ 108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,19,0,0,0,69,120,116,101,110,115,105,
+ 111,110,70,105,108,101,76,111,97,100,101,114,89,4,0,0,
+ 115,16,0,0,0,16,6,6,2,12,4,3,1,3,1,24,
+ 16,12,6,12,4,117,19,0,0,0,69,120,116,101,110,115,
+ 105,111,110,70,105,108,101,76,111,97,100,101,114,99,1,0,
+ 0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,
+ 0,0,115,134,0,0,0,124,0,0,69,101,0,0,90,1,
+ 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,
+ 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,
+ 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,
+ 0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,
+ 100,11,0,132,0,0,90,8,0,100,12,0,100,13,0,132,
+ 0,0,90,9,0,100,14,0,100,15,0,132,0,0,90,10,
+ 0,100,16,0,100,17,0,132,0,0,90,11,0,100,18,0,
+ 100,19,0,132,0,0,90,12,0,100,20,0,83,40,21,0,
+ 0,0,117,14,0,0,0,95,78,97,109,101,115,112,97,99,
+ 101,80,97,116,104,117,37,1,0,0,82,101,112,114,101,115,
+ 101,110,116,115,32,97,32,110,97,109,101,115,112,97,99,101,
+ 32,112,97,99,107,97,103,101,39,115,32,112,97,116,104,46,
+ 32,32,73,116,32,117,115,101,115,32,116,104,101,32,109,111,
+ 100,117,108,101,32,110,97,109,101,10,32,32,32,32,116,111,
+ 32,102,105,110,100,32,105,116,115,32,112,97,114,101,110,116,
+ 32,109,111,100,117,108,101,44,32,97,110,100,32,102,114,111,
+ 109,32,116,104,101,114,101,32,105,116,32,108,111,111,107,115,
+ 32,117,112,32,116,104,101,32,112,97,114,101,110,116,39,115,
+ 10,32,32,32,32,95,95,112,97,116,104,95,95,46,32,32,
+ 87,104,101,110,32,116,104,105,115,32,99,104,97,110,103,101,
+ 115,44,32,116,104,101,32,109,111,100,117,108,101,39,115,32,
+ 111,119,110,32,112,97,116,104,32,105,115,32,114,101,99,111,
+ 109,112,117,116,101,100,44,10,32,32,32,32,117,115,105,110,
+ 103,32,112,97,116,104,95,102,105,110,100,101,114,46,32,32,
+ 70,111,114,32,116,111,112,45,108,101,118,101,32,109,111,100,
+ 117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,116,
+ 32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,32,
+ 32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,99,
+ 4,0,0,0,0,0,0,0,4,0,0,0,2,0,0,0,
+ 67,0,0,0,115,52,0,0,0,124,1,0,124,0,0,95,
+ 0,0,124,2,0,124,0,0,95,1,0,116,2,0,124,0,
+ 0,106,3,0,131,0,0,131,1,0,124,0,0,95,4,0,
+ 124,3,0,124,0,0,95,5,0,100,0,0,83,40,1,0,
+ 0,0,78,40,6,0,0,0,117,5,0,0,0,95,110,97,
+ 109,101,117,5,0,0,0,95,112,97,116,104,117,5,0,0,
+ 0,116,117,112,108,101,117,16,0,0,0,95,103,101,116,95,
+ 112,97,114,101,110,116,95,112,97,116,104,117,17,0,0,0,
+ 95,108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,
+ 104,117,12,0,0,0,95,112,97,116,104,95,102,105,110,100,
+ 101,114,40,4,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,
+ 116,104,117,11,0,0,0,112,97,116,104,95,102,105,110,100,
+ 101,114,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,
+ 0,0,0,95,95,105,110,105,116,95,95,141,4,0,0,115,
+ 8,0,0,0,0,1,9,1,9,1,21,1,117,23,0,0,
+ 0,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+ 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,
+ 0,4,0,0,0,3,0,0,0,67,0,0,0,115,53,0,
+ 0,0,124,0,0,106,0,0,106,1,0,100,1,0,131,1,
+ 0,92,3,0,125,1,0,125,2,0,125,3,0,124,2,0,
+ 100,2,0,107,2,0,114,43,0,100,6,0,83,124,1,0,
+ 100,5,0,102,2,0,83,40,7,0,0,0,117,62,0,0,
+ 0,82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,
+ 32,111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,
+ 108,101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,
+ 112,97,116,104,45,97,116,116,114,45,110,97,109,101,41,117,
+ 1,0,0,0,46,117,0,0,0,0,117,3,0,0,0,115,
+ 121,115,117,4,0,0,0,112,97,116,104,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,40,2,0,0,0,117,3,0,
+ 0,0,115,121,115,117,4,0,0,0,112,97,116,104,40,2,
+ 0,0,0,117,5,0,0,0,95,110,97,109,101,117,10,0,
+ 0,0,114,112,97,114,116,105,116,105,111,110,40,4,0,0,
+ 0,117,4,0,0,0,115,101,108,102,117,6,0,0,0,112,
+ 97,114,101,110,116,117,3,0,0,0,100,111,116,117,2,0,
+ 0,0,109,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,23,0,0,0,95,102,105,110,100,95,112,97,114,101,110,
+ 116,95,112,97,116,104,95,110,97,109,101,115,147,4,0,0,
+ 115,8,0,0,0,0,2,27,1,12,2,4,3,117,38,0,
+ 0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
+ 46,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,
+ 116,104,95,110,97,109,101,115,99,1,0,0,0,0,0,0,
+ 0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,
+ 0,0,124,0,0,106,0,0,131,0,0,92,2,0,125,1,
+ 0,125,2,0,116,1,0,116,2,0,106,3,0,124,1,0,
+ 25,124,2,0,131,2,0,83,40,1,0,0,0,78,40,4,
+ 0,0,0,117,23,0,0,0,95,102,105,110,100,95,112,97,
+ 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,117,
+ 7,0,0,0,103,101,116,97,116,116,114,117,3,0,0,0,
+ 115,121,115,117,7,0,0,0,109,111,100,117,108,101,115,40,
+ 3,0,0,0,117,4,0,0,0,115,101,108,102,117,18,0,
+ 0,0,112,97,114,101,110,116,95,109,111,100,117,108,101,95,
+ 110,97,109,101,117,14,0,0,0,112,97,116,104,95,97,116,
+ 116,114,95,110,97,109,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,16,0,0,0,95,103,101,116,95,112,97,114,
+ 101,110,116,95,112,97,116,104,157,4,0,0,115,4,0,0,
+ 0,0,1,18,1,117,31,0,0,0,95,78,97,109,101,115,
+ 112,97,99,101,80,97,116,104,46,95,103,101,116,95,112,97,
+ 114,101,110,116,95,112,97,116,104,99,1,0,0,0,0,0,
+ 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,103,
+ 0,0,0,116,0,0,124,0,0,106,1,0,131,0,0,131,
+ 1,0,125,1,0,124,1,0,124,0,0,106,2,0,107,3,
+ 0,114,96,0,124,0,0,106,3,0,124,0,0,106,4,0,
+ 124,1,0,131,2,0,92,2,0,125,2,0,125,3,0,124,
+ 2,0,100,0,0,107,8,0,114,84,0,124,3,0,124,0,
+ 0,95,6,0,110,0,0,124,1,0,124,0,0,95,2,0,
+ 110,0,0,124,0,0,106,6,0,83,40,1,0,0,0,78,
+ 40,7,0,0,0,117,5,0,0,0,116,117,112,108,101,117,
+ 16,0,0,0,95,103,101,116,95,112,97,114,101,110,116,95,
+ 112,97,116,104,117,17,0,0,0,95,108,97,115,116,95,112,
+ 97,114,101,110,116,95,112,97,116,104,117,12,0,0,0,95,
+ 112,97,116,104,95,102,105,110,100,101,114,117,5,0,0,0,
+ 95,110,97,109,101,117,4,0,0,0,78,111,110,101,117,5,
+ 0,0,0,95,112,97,116,104,40,4,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,11,0,0,0,112,97,114,101,110,
+ 116,95,112,97,116,104,117,6,0,0,0,108,111,97,100,101,
+ 114,117,8,0,0,0,110,101,119,95,112,97,116,104,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,95,
+ 114,101,99,97,108,99,117,108,97,116,101,161,4,0,0,115,
+ 14,0,0,0,0,2,18,1,15,1,27,3,12,1,12,1,
+ 12,1,117,27,0,0,0,95,78,97,109,101,115,112,97,99,
+ 101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,97,
+ 116,101,99,1,0,0,0,0,0,0,0,1,0,0,0,2,
+ 0,0,0,67,0,0,0,115,16,0,0,0,116,0,0,124,
+ 0,0,106,1,0,131,0,0,131,1,0,83,40,1,0,0,
+ 0,78,40,2,0,0,0,117,4,0,0,0,105,116,101,114,
+ 117,12,0,0,0,95,114,101,99,97,108,99,117,108,97,116,
+ 101,40,1,0,0,0,117,4,0,0,0,115,101,108,102,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,
+ 95,95,105,116,101,114,95,95,173,4,0,0,115,2,0,0,
+ 0,0,1,117,23,0,0,0,95,78,97,109,101,115,112,97,
+ 99,101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,
+ 1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,
+ 67,0,0,0,115,16,0,0,0,116,0,0,124,0,0,106,
+ 1,0,131,0,0,131,1,0,83,40,1,0,0,0,78,40,
+ 2,0,0,0,117,3,0,0,0,108,101,110,117,12,0,0,
+ 0,95,114,101,99,97,108,99,117,108,97,116,101,40,1,0,
+ 0,0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,7,0,0,0,95,95,108,101,
+ 110,95,95,176,4,0,0,115,2,0,0,0,0,1,117,22,
+ 0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,46,95,95,108,101,110,95,95,99,1,0,0,0,0,0,
+ 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,16,
+ 0,0,0,100,1,0,106,0,0,124,0,0,106,1,0,131,
+ 1,0,83,40,2,0,0,0,78,117,20,0,0,0,95,78,
+ 97,109,101,115,112,97,99,101,80,97,116,104,40,123,33,114,
+ 125,41,40,2,0,0,0,117,6,0,0,0,102,111,114,109,
+ 97,116,117,5,0,0,0,95,112,97,116,104,40,1,0,0,
+ 0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,
+ 114,95,95,179,4,0,0,115,2,0,0,0,0,1,117,23,
+ 0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0,
+ 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,
+ 16,0,0,0,124,1,0,124,0,0,106,0,0,131,0,0,
+ 107,6,0,83,40,1,0,0,0,78,40,1,0,0,0,117,
+ 12,0,0,0,95,114,101,99,97,108,99,117,108,97,116,101,
+ 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,4,
+ 0,0,0,105,116,101,109,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,12,0,0,0,95,95,99,111,110,116,97,105,
+ 110,115,95,95,182,4,0,0,115,2,0,0,0,0,1,117,
+ 27,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,
+ 116,104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,
+ 2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,
+ 67,0,0,0,115,20,0,0,0,124,0,0,106,0,0,106,
+ 1,0,124,1,0,131,1,0,1,100,0,0,83,40,1,0,
+ 0,0,78,40,2,0,0,0,117,5,0,0,0,95,112,97,
+ 116,104,117,6,0,0,0,97,112,112,101,110,100,40,2,0,
+ 0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,
+ 105,116,101,109,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,6,0,0,0,97,112,112,101,110,100,185,4,0,0,115,
+ 2,0,0,0,0,1,117,21,0,0,0,95,78,97,109,101,
+ 115,112,97,99,101,80,97,116,104,46,97,112,112,101,110,100,
+ 78,40,13,0,0,0,117,8,0,0,0,95,95,110,97,109,
+ 101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,
+ 95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,
+ 101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,117,
+ 8,0,0,0,95,95,105,110,105,116,95,95,117,23,0,0,
+ 0,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,
+ 116,104,95,110,97,109,101,115,117,16,0,0,0,95,103,101,
+ 116,95,112,97,114,101,110,116,95,112,97,116,104,117,12,0,
+ 0,0,95,114,101,99,97,108,99,117,108,97,116,101,117,8,
+ 0,0,0,95,95,105,116,101,114,95,95,117,7,0,0,0,
+ 95,95,108,101,110,95,95,117,8,0,0,0,95,95,114,101,
+ 112,114,95,95,117,12,0,0,0,95,95,99,111,110,116,97,
+ 105,110,115,95,95,117,6,0,0,0,97,112,112,101,110,100,
+ 40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,
+ 108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,14,0,0,0,95,78,97,109,101,115,112,97,99,101,80,
+ 97,116,104,134,4,0,0,115,20,0,0,0,16,5,6,2,
+ 12,6,12,10,12,4,12,12,12,3,12,3,12,3,12,3,
+ 117,14,0,0,0,95,78,97,109,101,115,112,97,99,101,80,
+ 97,116,104,99,1,0,0,0,0,0,0,0,1,0,0,0,
+ 3,0,0,0,66,0,0,0,115,68,0,0,0,124,0,0,
+ 69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,
+ 100,2,0,132,0,0,90,3,0,101,4,0,100,3,0,100,
+ 4,0,132,0,0,131,1,0,90,5,0,101,6,0,100,5,
+ 0,100,6,0,132,0,0,131,1,0,90,7,0,100,7,0,
+ 83,40,8,0,0,0,117,15,0,0,0,78,97,109,101,115,
+ 112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,0,
+ 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,
+ 25,0,0,0,116,0,0,124,1,0,124,2,0,124,3,0,
+ 131,3,0,124,0,0,95,1,0,100,0,0,83,40,1,0,
+ 0,0,78,40,2,0,0,0,117,14,0,0,0,95,78,97,
+ 109,101,115,112,97,99,101,80,97,116,104,117,5,0,0,0,
+ 95,112,97,116,104,40,4,0,0,0,117,4,0,0,0,115,
+ 101,108,102,117,4,0,0,0,110,97,109,101,117,4,0,0,
+ 0,112,97,116,104,117,11,0,0,0,112,97,116,104,95,102,
+ 105,110,100,101,114,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,8,0,0,0,95,95,105,110,105,116,95,95,190,4,
+ 0,0,115,2,0,0,0,0,1,117,24,0,0,0,78,97,
+ 109,101,115,112,97,99,101,76,111,97,100,101,114,46,95,95,
+ 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,2,
+ 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
+ 100,1,0,106,0,0,124,1,0,106,1,0,131,1,0,83,
+ 40,2,0,0,0,78,117,25,0,0,0,60,109,111,100,117,
+ 108,101,32,39,123,125,39,32,40,110,97,109,101,115,112,97,
+ 99,101,41,62,40,2,0,0,0,117,6,0,0,0,102,111,
+ 114,109,97,116,117,8,0,0,0,95,95,110,97,109,101,95,
+ 95,40,2,0,0,0,117,3,0,0,0,99,108,115,117,6,
+ 0,0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,109,111,100,117,108,101,
+ 95,114,101,112,114,193,4,0,0,115,2,0,0,0,0,2,
+ 117,27,0,0,0,78,97,109,101,115,112,97,99,101,76,111,
+ 97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,114,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
+ 0,67,0,0,0,115,32,0,0,0,116,0,0,100,1,0,
+ 124,0,0,106,1,0,131,2,0,1,124,0,0,106,1,0,
+ 124,1,0,95,2,0,124,1,0,83,40,2,0,0,0,117,
+ 24,0,0,0,76,111,97,100,32,97,32,110,97,109,101,115,
+ 112,97,99,101,32,109,111,100,117,108,101,46,117,38,0,0,
+ 0,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,
+ 101,32,108,111,97,100,101,100,32,119,105,116,104,32,112,97,
+ 116,104,32,123,33,114,125,40,3,0,0,0,117,16,0,0,
+ 0,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,
+ 101,117,5,0,0,0,95,112,97,116,104,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,40,2,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,6,0,0,0,109,111,100,117,108,
+ 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0,
+ 0,0,108,111,97,100,95,109,111,100,117,108,101,197,4,0,
+ 0,115,6,0,0,0,0,3,16,1,12,1,117,27,0,0,
+ 0,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
+ 46,108,111,97,100,95,109,111,100,117,108,101,78,40,8,0,
+ 0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,
+ 10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,12,
+ 0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,117,
+ 8,0,0,0,95,95,105,110,105,116,95,95,117,11,0,0,
+ 0,99,108,97,115,115,109,101,116,104,111,100,117,11,0,0,
+ 0,109,111,100,117,108,101,95,114,101,112,114,117,17,0,0,
+ 0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,
+ 101,114,117,11,0,0,0,108,111,97,100,95,109,111,100,117,
+ 108,101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,15,0,0,0,78,97,109,101,115,112,97,99,101,
+ 76,111,97,100,101,114,189,4,0,0,115,6,0,0,0,16,
+ 1,12,3,18,4,117,15,0,0,0,78,97,109,101,115,112,
+ 97,99,101,76,111,97,100,101,114,99,1,0,0,0,0,0,
+ 0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,119,
+ 0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,0,
+ 90,2,0,100,1,0,90,3,0,101,4,0,100,2,0,100,
+ 3,0,132,0,0,131,1,0,90,5,0,101,4,0,100,4,
+ 0,100,5,0,132,0,0,131,1,0,90,6,0,101,4,0,
+ 100,6,0,100,7,0,132,0,0,131,1,0,90,7,0,101,
+ 4,0,100,8,0,100,9,0,132,0,0,131,1,0,90,8,
+ 0,101,4,0,100,12,0,100,10,0,100,11,0,132,1,0,
+ 131,1,0,90,10,0,100,12,0,83,40,13,0,0,0,117,
+ 10,0,0,0,80,97,116,104,70,105,110,100,101,114,117,62,
+ 0,0,0,77,101,116,97,32,112,97,116,104,32,102,105,110,
+ 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104,
+ 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112,
+ 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115,
+ 46,99,1,0,0,0,0,0,0,0,2,0,0,0,4,0,
+ 0,0,67,0,0,0,115,58,0,0,0,120,51,0,116,0,
+ 0,106,1,0,106,2,0,131,0,0,68,93,34,0,125,1,
+ 0,116,3,0,124,1,0,100,1,0,131,2,0,114,16,0,
+ 124,1,0,106,4,0,131,0,0,1,113,16,0,113,16,0,
+ 87,100,2,0,83,40,3,0,0,0,117,125,0,0,0,67,
+ 97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,
+ 116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,
+ 111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,
+ 110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,
+ 32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,
+ 121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
+ 95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,
+ 109,112,108,101,109,101,110,116,101,100,41,46,117,17,0,0,
+ 0,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,
+ 101,115,78,40,5,0,0,0,117,3,0,0,0,115,121,115,
+ 117,19,0,0,0,112,97,116,104,95,105,109,112,111,114,116,
+ 101,114,95,99,97,99,104,101,117,6,0,0,0,118,97,108,
+ 117,101,115,117,7,0,0,0,104,97,115,97,116,116,114,117,
+ 17,0,0,0,105,110,118,97,108,105,100,97,116,101,95,99,
+ 97,99,104,101,115,40,2,0,0,0,117,3,0,0,0,99,
+ 108,115,117,6,0,0,0,102,105,110,100,101,114,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,17,0,0,0,105,110,
+ 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,211,
+ 4,0,0,115,6,0,0,0,0,4,22,1,15,1,117,28,
+ 0,0,0,80,97,116,104,70,105,110,100,101,114,46,105,110,
+ 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,
+ 2,0,0,0,0,0,0,0,3,0,0,0,12,0,0,0,
+ 67,0,0,0,115,94,0,0,0,116,0,0,106,1,0,115,
+ 28,0,116,2,0,106,3,0,100,1,0,116,4,0,131,2,
+ 0,1,110,0,0,120,59,0,116,0,0,106,1,0,68,93,
+ 44,0,125,2,0,121,14,0,124,2,0,124,1,0,131,1,
+ 0,83,87,113,38,0,4,116,5,0,107,10,0,114,81,0,
+ 1,1,1,119,38,0,89,113,38,0,88,113,38,0,87,100,
+ 2,0,83,100,2,0,83,40,3,0,0,0,117,113,0,0,
+ 0,83,101,97,114,99,104,32,115,101,113,117,101,110,99,101,
+ 32,111,102,32,104,111,111,107,115,32,102,111,114,32,97,32,
+ 102,105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,
+ 39,46,10,10,32,32,32,32,32,32,32,32,73,102,32,39,
+ 104,111,111,107,115,39,32,105,115,32,102,97,108,115,101,32,
+ 116,104,101,110,32,117,115,101,32,115,121,115,46,112,97,116,
+ 104,95,104,111,111,107,115,46,10,10,32,32,32,32,32,32,
+ 32,32,117,23,0,0,0,115,121,115,46,112,97,116,104,95,
+ 104,111,111,107,115,32,105,115,32,101,109,112,116,121,78,40,
+ 7,0,0,0,117,3,0,0,0,115,121,115,117,10,0,0,
+ 0,112,97,116,104,95,104,111,111,107,115,117,9,0,0,0,
+ 95,119,97,114,110,105,110,103,115,117,4,0,0,0,119,97,
+ 114,110,117,13,0,0,0,73,109,112,111,114,116,87,97,114,
+ 110,105,110,103,117,11,0,0,0,73,109,112,111,114,116,69,
+ 114,114,111,114,117,4,0,0,0,78,111,110,101,40,3,0,
+ 0,0,117,3,0,0,0,99,108,115,117,4,0,0,0,112,
+ 97,116,104,117,4,0,0,0,104,111,111,107,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,11,0,0,0,95,112,97,
+ 116,104,95,104,111,111,107,115,219,4,0,0,115,16,0,0,
+ 0,0,7,9,1,19,1,16,1,3,1,14,1,13,1,12,
+ 2,117,22,0,0,0,80,97,116,104,70,105,110,100,101,114,
+ 46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,0,
+ 0,0,0,0,0,3,0,0,0,11,0,0,0,67,0,0,
+ 0,115,91,0,0,0,124,1,0,100,1,0,107,2,0,114,
+ 21,0,100,2,0,125,1,0,110,0,0,121,17,0,116,0,
+ 0,106,1,0,124,1,0,25,125,2,0,87,110,46,0,4,
+ 116,2,0,107,10,0,114,86,0,1,1,1,124,0,0,106,
+ 3,0,124,1,0,131,1,0,125,2,0,124,2,0,116,0,
+ 0,106,1,0,124,1,0,60,89,110,1,0,88,124,2,0,
+ 83,40,3,0,0,0,117,210,0,0,0,71,101,116,32,116,
+ 104,101,32,102,105,110,100,101,114,32,102,111,114,32,116,104,
+ 101,32,112,97,116,104,32,101,110,116,114,121,32,102,114,111,
+ 109,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,
+ 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,
+ 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,
+ 101,110,116,114,121,32,105,115,32,110,111,116,32,105,110,32,
+ 116,104,101,32,99,97,99,104,101,44,32,102,105,110,100,32,
+ 116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,
+ 102,105,110,100,101,114,10,32,32,32,32,32,32,32,32,97,
+ 110,100,32,99,97,99,104,101,32,105,116,46,32,73,102,32,
+ 110,111,32,102,105,110,100,101,114,32,105,115,32,97,118,97,
+ 105,108,97,98,108,101,44,32,115,116,111,114,101,32,78,111,
+ 110,101,46,10,10,32,32,32,32,32,32,32,32,117,0,0,
+ 0,0,117,1,0,0,0,46,40,4,0,0,0,117,3,0,
+ 0,0,115,121,115,117,19,0,0,0,112,97,116,104,95,105,
+ 109,112,111,114,116,101,114,95,99,97,99,104,101,117,8,0,
+ 0,0,75,101,121,69,114,114,111,114,117,11,0,0,0,95,
+ 112,97,116,104,95,104,111,111,107,115,40,3,0,0,0,117,
+ 3,0,0,0,99,108,115,117,4,0,0,0,112,97,116,104,
+ 117,6,0,0,0,102,105,110,100,101,114,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,20,0,0,0,95,112,97,116,
+ 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,
+ 236,4,0,0,115,16,0,0,0,0,8,12,1,9,1,3,
+ 1,17,1,13,1,15,1,18,1,117,31,0,0,0,80,97,
+ 116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,105,
+ 109,112,111,114,116,101,114,95,99,97,99,104,101,99,3,0,
+ 0,0,0,0,0,0,8,0,0,0,4,0,0,0,67,0,
+ 0,0,115,162,0,0,0,103,0,0,125,3,0,120,149,0,
+ 124,2,0,68,93,131,0,125,4,0,124,0,0,106,0,0,
+ 124,4,0,131,1,0,125,5,0,124,5,0,100,2,0,107,
+ 9,0,114,13,0,116,2,0,124,5,0,100,1,0,131,2,
+ 0,114,85,0,124,5,0,106,3,0,124,1,0,131,1,0,
+ 92,2,0,125,6,0,125,7,0,110,21,0,124,5,0,106,
+ 4,0,124,1,0,131,1,0,125,6,0,103,0,0,125,7,
+ 0,124,6,0,100,2,0,107,9,0,114,128,0,124,6,0,
+ 124,3,0,102,2,0,83,124,3,0,106,5,0,124,7,0,
+ 131,1,0,1,113,13,0,113,13,0,87,100,2,0,124,3,
+ 0,102,2,0,83,100,2,0,83,40,3,0,0,0,117,63,
+ 0,0,0,70,105,110,100,32,116,104,101,32,108,111,97,100,
+ 101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,
+ 112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,
+ 100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,
+ 101,46,117,11,0,0,0,102,105,110,100,95,108,111,97,100,
+ 101,114,78,40,6,0,0,0,117,20,0,0,0,95,112,97,
+ 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+ 101,117,4,0,0,0,78,111,110,101,117,7,0,0,0,104,
+ 97,115,97,116,116,114,117,11,0,0,0,102,105,110,100,95,
+ 108,111,97,100,101,114,117,11,0,0,0,102,105,110,100,95,
+ 109,111,100,117,108,101,117,6,0,0,0,101,120,116,101,110,
+ 100,40,8,0,0,0,117,3,0,0,0,99,108,115,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,117,4,0,0,0,
+ 112,97,116,104,117,14,0,0,0,110,97,109,101,115,112,97,
+ 99,101,95,112,97,116,104,117,5,0,0,0,101,110,116,114,
+ 121,117,6,0,0,0,102,105,110,100,101,114,117,6,0,0,
+ 0,108,111,97,100,101,114,117,8,0,0,0,112,111,114,116,
+ 105,111,110,115,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,11,0,0,0,95,103,101,116,95,108,111,97,100,101,114,
+ 253,4,0,0,115,24,0,0,0,0,5,6,1,13,1,15,
+ 1,12,1,15,1,24,2,15,1,6,1,12,2,10,5,20,
+ 2,117,22,0,0,0,80,97,116,104,70,105,110,100,101,114,
+ 46,95,103,101,116,95,108,111,97,100,101,114,99,3,0,0,
+ 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,
+ 0,115,97,0,0,0,124,2,0,100,1,0,107,8,0,114,
+ 24,0,116,1,0,106,2,0,125,2,0,110,0,0,124,0,
+ 0,106,3,0,124,1,0,124,2,0,131,2,0,92,2,0,
+ 125,3,0,125,4,0,124,3,0,100,1,0,107,9,0,114,
+ 64,0,124,3,0,83,124,4,0,114,89,0,116,4,0,124,
+ 1,0,124,4,0,124,0,0,106,3,0,131,3,0,83,100,
+ 1,0,83,100,1,0,83,40,2,0,0,0,117,98,0,0,
+ 0,70,105,110,100,32,116,104,101,32,109,111,100,117,108,101,
+ 32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,
+ 39,112,97,116,104,39,32,98,97,115,101,100,32,111,110,32,
+ 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,
+ 110,100,10,32,32,32,32,32,32,32,32,115,121,115,46,112,
+ 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
+ 104,101,46,78,40,5,0,0,0,117,4,0,0,0,78,111,
+ 110,101,117,3,0,0,0,115,121,115,117,4,0,0,0,112,
+ 97,116,104,117,11,0,0,0,95,103,101,116,95,108,111,97,
+ 100,101,114,117,15,0,0,0,78,97,109,101,115,112,97,99,
+ 101,76,111,97,100,101,114,40,5,0,0,0,117,3,0,0,
+ 0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,117,4,0,0,0,112,97,116,104,117,6,0,0,0,108,
+ 111,97,100,101,114,117,14,0,0,0,110,97,109,101,115,112,
+ 97,99,101,95,112,97,116,104,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,11,0,0,0,102,105,110,100,95,109,111,
+ 100,117,108,101,22,5,0,0,115,16,0,0,0,0,4,12,
+ 1,12,1,24,1,12,1,4,2,6,3,19,2,117,22,0,
+ 0,0,80,97,116,104,70,105,110,100,101,114,46,102,105,110,
+ 100,95,109,111,100,117,108,101,78,40,11,0,0,0,117,8,
+ 0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,
+ 95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,
+ 95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,
+ 95,95,100,111,99,95,95,117,11,0,0,0,99,108,97,115,
+ 115,109,101,116,104,111,100,117,17,0,0,0,105,110,118,97,
+ 108,105,100,97,116,101,95,99,97,99,104,101,115,117,11,0,
+ 0,0,95,112,97,116,104,95,104,111,111,107,115,117,20,0,
+ 0,0,95,112,97,116,104,95,105,109,112,111,114,116,101,114,
+ 95,99,97,99,104,101,117,11,0,0,0,95,103,101,116,95,
+ 108,111,97,100,101,114,117,4,0,0,0,78,111,110,101,117,
+ 11,0,0,0,102,105,110,100,95,109,111,100,117,108,101,40,
+ 1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,108,
+ 115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 10,0,0,0,80,97,116,104,70,105,110,100,101,114,207,4,
+ 0,0,115,14,0,0,0,16,2,6,2,18,8,18,17,18,
+ 17,18,25,3,1,117,10,0,0,0,80,97,116,104,70,105,
+ 110,100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,3,0,0,0,66,0,0,0,115,110,0,0,0,124,0,
+ 0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,
+ 0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,
+ 100,4,0,100,5,0,132,0,0,90,5,0,101,6,0,90,
+ 7,0,100,6,0,100,7,0,132,0,0,90,8,0,100,8,
+ 0,100,9,0,132,0,0,90,9,0,101,10,0,100,10,0,
+ 100,11,0,132,0,0,131,1,0,90,11,0,100,12,0,100,
+ 13,0,132,0,0,90,12,0,100,14,0,83,40,15,0,0,
+ 0,117,10,0,0,0,70,105,108,101,70,105,110,100,101,114,
+ 117,172,0,0,0,70,105,108,101,45,98,97,115,101,100,32,
+ 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116,
+ 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116,
+ 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97,
+ 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101,
+ 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103,
+ 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119,
+ 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114,
+ 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32,
+ 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101,
+ 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32,
+ 32,99,2,0,0,0,0,0,0,0,5,0,0,0,5,0,
+ 0,0,7,0,0,0,115,122,0,0,0,103,0,0,125,3,
+ 0,120,52,0,124,2,0,68,93,44,0,92,2,0,137,0,
+ 0,125,4,0,124,3,0,106,0,0,135,0,0,102,1,0,
+ 100,1,0,100,2,0,134,0,0,124,4,0,68,131,1,0,
+ 131,1,0,1,113,13,0,87,124,3,0,124,0,0,95,1,
+ 0,124,1,0,112,79,0,100,3,0,124,0,0,95,2,0,
+ 100,6,0,124,0,0,95,3,0,116,4,0,131,0,0,124,
+ 0,0,95,5,0,116,4,0,131,0,0,124,0,0,95,6,
+ 0,100,5,0,83,40,7,0,0,0,117,201,0,0,0,73,
+ 110,105,116,105,97,108,105,122,101,32,119,105,116,104,32,116,
+ 104,101,32,112,97,116,104,32,116,111,32,115,101,97,114,99,
+ 104,32,111,110,32,97,110,100,32,97,32,118,97,114,105,97,
+ 98,108,101,32,110,117,109,98,101,114,32,111,102,10,32,32,
+ 32,32,32,32,32,32,51,45,116,117,112,108,101,115,32,99,
+ 111,110,116,97,105,110,105,110,103,32,116,104,101,32,108,111,
+ 97,100,101,114,44,32,102,105,108,101,32,115,117,102,102,105,
+ 120,101,115,32,116,104,101,32,108,111,97,100,101,114,32,114,
+ 101,99,111,103,110,105,122,101,115,44,10,32,32,32,32,32,
+ 32,32,32,97,110,100,32,97,32,98,111,111,108,101,97,110,
+ 32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,
+ 108,111,97,100,101,114,32,104,97,110,100,108,101,115,32,112,
+ 97,99,107,97,103,101,115,46,99,1,0,0,0,0,0,0,
+ 0,2,0,0,0,3,0,0,0,51,0,0,0,115,27,0,
+ 0,0,124,0,0,93,17,0,125,1,0,124,1,0,136,0,
+ 0,102,2,0,86,1,113,3,0,100,0,0,83,40,1,0,
+ 0,0,78,40,0,0,0,0,40,2,0,0,0,117,2,0,
+ 0,0,46,48,117,6,0,0,0,115,117,102,102,105,120,40,
+ 1,0,0,0,117,6,0,0,0,108,111,97,100,101,114,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,9,0,0,0,60,103,101,110,101,
+ 120,112,114,62,55,5,0,0,115,2,0,0,0,6,0,117,
+ 38,0,0,0,70,105,108,101,70,105,110,100,101,114,46,95,
+ 95,105,110,105,116,95,95,46,60,108,111,99,97,108,115,62,
+ 46,60,103,101,110,101,120,112,114,62,117,1,0,0,0,46,
+ 105,1,0,0,0,78,105,255,255,255,255,40,7,0,0,0,
+ 117,6,0,0,0,101,120,116,101,110,100,117,8,0,0,0,
+ 95,108,111,97,100,101,114,115,117,4,0,0,0,112,97,116,
+ 104,117,11,0,0,0,95,112,97,116,104,95,109,116,105,109,
+ 101,117,3,0,0,0,115,101,116,117,11,0,0,0,95,112,
+ 97,116,104,95,99,97,99,104,101,117,19,0,0,0,95,114,
+ 101,108,97,120,101,100,95,112,97,116,104,95,99,97,99,104,
+ 101,40,5,0,0,0,117,4,0,0,0,115,101,108,102,117,
+ 4,0,0,0,112,97,116,104,117,7,0,0,0,100,101,116,
+ 97,105,108,115,117,7,0,0,0,108,111,97,100,101,114,115,
+ 117,8,0,0,0,115,117,102,102,105,120,101,115,40,0,0,
+ 0,0,40,1,0,0,0,117,6,0,0,0,108,111,97,100,
+ 101,114,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,8,0,0,0,95,95,105,110,105,116,95,
+ 95,49,5,0,0,115,16,0,0,0,0,4,6,1,19,1,
+ 36,1,9,2,15,1,9,1,12,1,117,19,0,0,0,70,
+ 105,108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,
+ 95,95,99,1,0,0,0,0,0,0,0,1,0,0,0,2,
+ 0,0,0,67,0,0,0,115,13,0,0,0,100,3,0,124,
+ 0,0,95,0,0,100,2,0,83,40,4,0,0,0,117,31,
+ 0,0,0,73,110,118,97,108,105,100,97,116,101,32,116,104,
+ 101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,
+ 101,46,105,1,0,0,0,78,105,255,255,255,255,40,1,0,
+ 0,0,117,11,0,0,0,95,112,97,116,104,95,109,116,105,
+ 109,101,40,1,0,0,0,117,4,0,0,0,115,101,108,102,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,17,0,0,
+ 0,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,
+ 101,115,63,5,0,0,115,2,0,0,0,0,2,117,28,0,
+ 0,0,70,105,108,101,70,105,110,100,101,114,46,105,110,118,
+ 97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,
+ 0,0,0,0,0,0,0,12,0,0,0,13,0,0,0,67,
+ 0,0,0,115,172,1,0,0,100,5,0,125,2,0,124,1,
+ 0,106,1,0,100,1,0,131,1,0,100,2,0,25,125,3,
+ 0,121,25,0,116,2,0,106,3,0,124,0,0,106,4,0,
+ 131,1,0,106,5,0,125,4,0,87,110,24,0,4,116,6,
+ 0,107,10,0,114,76,0,1,1,1,100,6,0,125,4,0,
+ 89,110,1,0,88,124,4,0,124,0,0,106,7,0,107,3,
+ 0,114,114,0,124,0,0,106,8,0,131,0,0,1,124,4,
+ 0,124,0,0,95,7,0,110,0,0,116,9,0,131,0,0,
+ 114,147,0,124,0,0,106,10,0,125,5,0,124,3,0,106,
+ 11,0,131,0,0,125,6,0,110,15,0,124,0,0,106,12,
+ 0,125,5,0,124,3,0,125,6,0,124,6,0,124,5,0,
+ 107,6,0,114,45,1,116,13,0,124,0,0,106,4,0,124,
+ 3,0,131,2,0,125,7,0,116,14,0,124,7,0,131,1,
+ 0,114,45,1,120,91,0,124,0,0,106,15,0,68,93,71,
+ 0,92,2,0,125,8,0,125,9,0,100,4,0,124,8,0,
+ 23,125,10,0,116,13,0,124,7,0,124,10,0,131,2,0,
+ 125,11,0,116,16,0,124,11,0,131,1,0,114,214,0,124,
+ 9,0,124,1,0,124,11,0,131,2,0,124,7,0,103,1,
+ 0,102,2,0,83,113,214,0,87,100,7,0,125,2,0,113,
+ 45,1,110,0,0,120,95,0,124,0,0,106,15,0,68,93,
+ 84,0,92,2,0,125,8,0,125,9,0,124,6,0,124,8,
+ 0,23,124,5,0,107,6,0,114,55,1,116,13,0,124,0,
+ 0,106,4,0,124,3,0,124,8,0,23,131,2,0,125,11,
+ 0,116,16,0,124,11,0,131,1,0,114,139,1,124,9,0,
+ 124,1,0,124,11,0,131,2,0,103,0,0,102,2,0,83,
+ 113,55,1,113,55,1,87,124,2,0,114,162,1,100,8,0,
+ 124,7,0,103,1,0,102,2,0,83,100,8,0,103,0,0,
+ 102,2,0,83,40,9,0,0,0,117,125,0,0,0,84,114,
+ 121,32,116,111,32,102,105,110,100,32,97,32,108,111,97,100,
+ 101,114,32,102,111,114,32,116,104,101,32,115,112,101,99,105,
+ 102,105,101,100,32,109,111,100,117,108,101,44,32,111,114,32,
+ 116,104,101,32,110,97,109,101,115,112,97,99,101,10,32,32,
+ 32,32,32,32,32,32,112,97,99,107,97,103,101,32,112,111,
+ 114,116,105,111,110,115,46,32,82,101,116,117,114,110,115,32,
+ 40,108,111,97,100,101,114,44,32,108,105,115,116,45,111,102,
+ 45,112,111,114,116,105,111,110,115,41,46,117,1,0,0,0,
+ 46,105,2,0,0,0,105,1,0,0,0,117,8,0,0,0,
+ 95,95,105,110,105,116,95,95,70,105,255,255,255,255,84,78,
+ 40,19,0,0,0,117,5,0,0,0,70,97,108,115,101,117,
+ 10,0,0,0,114,112,97,114,116,105,116,105,111,110,117,3,
+ 0,0,0,95,111,115,117,4,0,0,0,115,116,97,116,117,
+ 4,0,0,0,112,97,116,104,117,8,0,0,0,115,116,95,
+ 109,116,105,109,101,117,7,0,0,0,79,83,69,114,114,111,
+ 114,117,11,0,0,0,95,112,97,116,104,95,109,116,105,109,
+ 101,117,11,0,0,0,95,102,105,108,108,95,99,97,99,104,
+ 101,117,11,0,0,0,95,114,101,108,97,120,95,99,97,115,
+ 101,117,19,0,0,0,95,114,101,108,97,120,101,100,95,112,
+ 97,116,104,95,99,97,99,104,101,117,5,0,0,0,108,111,
+ 119,101,114,117,11,0,0,0,95,112,97,116,104,95,99,97,
+ 99,104,101,117,10,0,0,0,95,112,97,116,104,95,106,111,
+ 105,110,117,11,0,0,0,95,112,97,116,104,95,105,115,100,
+ 105,114,117,8,0,0,0,95,108,111,97,100,101,114,115,117,
+ 12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,101,
+ 117,4,0,0,0,84,114,117,101,117,4,0,0,0,78,111,
+ 110,101,40,12,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,117,12,0,
+ 0,0,105,115,95,110,97,109,101,115,112,97,99,101,117,11,
+ 0,0,0,116,97,105,108,95,109,111,100,117,108,101,117,5,
+ 0,0,0,109,116,105,109,101,117,5,0,0,0,99,97,99,
+ 104,101,117,12,0,0,0,99,97,99,104,101,95,109,111,100,
+ 117,108,101,117,9,0,0,0,98,97,115,101,95,112,97,116,
+ 104,117,6,0,0,0,115,117,102,102,105,120,117,6,0,0,
+ 0,108,111,97,100,101,114,117,13,0,0,0,105,110,105,116,
+ 95,102,105,108,101,110,97,109,101,117,9,0,0,0,102,117,
+ 108,108,95,112,97,116,104,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,11,0,0,0,102,105,110,100,95,108,111,97,
+ 100,101,114,69,5,0,0,115,62,0,0,0,0,3,6,1,
+ 19,1,3,1,25,1,13,1,11,1,15,1,10,1,12,2,
+ 9,1,9,1,15,2,9,1,6,2,12,1,18,1,12,1,
+ 22,1,10,1,15,1,12,1,26,4,12,2,22,1,16,1,
+ 22,1,12,1,26,1,6,1,13,1,117,22,0,0,0,70,
+ 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,108,
+ 111,97,100,101,114,99,1,0,0,0,0,0,0,0,9,0,
+ 0,0,12,0,0,0,67,0,0,0,115,255,0,0,0,124,
+ 0,0,106,0,0,125,1,0,121,19,0,116,1,0,106,2,
+ 0,124,1,0,131,1,0,125,2,0,87,110,24,0,4,116,
+ 3,0,107,10,0,114,54,0,1,1,1,103,0,0,125,2,
+ 0,89,110,1,0,88,116,4,0,106,5,0,106,6,0,100,
+ 1,0,131,1,0,115,91,0,116,7,0,124,2,0,131,1,
+ 0,124,0,0,95,8,0,110,111,0,116,7,0,131,0,0,
+ 125,3,0,120,90,0,124,2,0,68,93,82,0,125,4,0,
+ 124,4,0,106,9,0,100,2,0,131,1,0,92,3,0,125,
+ 5,0,125,6,0,125,7,0,124,6,0,114,170,0,100,3,
+ 0,106,10,0,124,5,0,124,7,0,106,11,0,131,0,0,
+ 131,2,0,125,8,0,110,6,0,124,5,0,125,8,0,124,
+ 3,0,106,12,0,124,8,0,131,1,0,1,113,107,0,87,
+ 124,3,0,124,0,0,95,8,0,116,4,0,106,5,0,106,
+ 6,0,116,13,0,131,1,0,114,251,0,116,7,0,100,4,
+ 0,100,5,0,132,0,0,124,2,0,68,131,1,0,131,1,
+ 0,124,0,0,95,14,0,110,0,0,100,6,0,83,40,7,
+ 0,0,0,117,68,0,0,0,70,105,108,108,32,116,104,101,
+ 32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,
+ 105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,
+ 112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,
+ 115,32,100,105,114,101,99,116,111,114,121,46,117,3,0,0,
+ 0,119,105,110,117,1,0,0,0,46,117,5,0,0,0,123,
+ 125,46,123,125,99,1,0,0,0,0,0,0,0,2,0,0,
+ 0,2,0,0,0,115,0,0,0,115,27,0,0,0,124,0,
+ 0,93,17,0,125,1,0,124,1,0,106,0,0,131,0,0,
+ 86,1,113,3,0,100,0,0,83,40,1,0,0,0,78,40,
+ 1,0,0,0,117,5,0,0,0,108,111,119,101,114,40,2,
+ 0,0,0,117,2,0,0,0,46,48,117,2,0,0,0,102,
+ 110,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,9,0,
+ 0,0,60,103,101,110,101,120,112,114,62,139,5,0,0,115,
+ 2,0,0,0,6,0,117,41,0,0,0,70,105,108,101,70,
+ 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,
+ 101,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,
+ 120,112,114,62,78,40,15,0,0,0,117,4,0,0,0,112,
+ 97,116,104,117,3,0,0,0,95,111,115,117,7,0,0,0,
+ 108,105,115,116,100,105,114,117,17,0,0,0,70,105,108,101,
+ 78,111,116,70,111,117,110,100,69,114,114,111,114,117,3,0,
+ 0,0,115,121,115,117,8,0,0,0,112,108,97,116,102,111,
+ 114,109,117,10,0,0,0,115,116,97,114,116,115,119,105,116,
+ 104,117,3,0,0,0,115,101,116,117,11,0,0,0,95,112,
+ 97,116,104,95,99,97,99,104,101,117,9,0,0,0,112,97,
+ 114,116,105,116,105,111,110,117,6,0,0,0,102,111,114,109,
+ 97,116,117,5,0,0,0,108,111,119,101,114,117,3,0,0,
+ 0,97,100,100,117,27,0,0,0,95,67,65,83,69,95,73,
+ 78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,
+ 79,82,77,83,117,19,0,0,0,95,114,101,108,97,120,101,
+ 100,95,112,97,116,104,95,99,97,99,104,101,40,9,0,0,
+ 0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,112,
+ 97,116,104,117,8,0,0,0,99,111,110,116,101,110,116,115,
+ 117,21,0,0,0,108,111,119,101,114,95,115,117,102,102,105,
+ 120,95,99,111,110,116,101,110,116,115,117,4,0,0,0,105,
+ 116,101,109,117,4,0,0,0,110,97,109,101,117,3,0,0,
+ 0,100,111,116,117,6,0,0,0,115,117,102,102,105,120,117,
+ 8,0,0,0,110,101,119,95,110,97,109,101,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,11,0,0,0,95,102,105,
+ 108,108,95,99,97,99,104,101,111,5,0,0,115,34,0,0,
+ 0,0,2,9,1,3,1,19,1,13,2,11,3,18,1,18,
+ 7,9,1,13,1,24,1,6,1,27,2,6,1,17,1,9,
+ 1,18,1,117,22,0,0,0,70,105,108,101,70,105,110,100,
+ 101,114,46,95,102,105,108,108,95,99,97,99,104,101,99,1,
+ 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,
+ 0,0,0,115,25,0,0,0,135,0,0,135,1,0,102,2,
+ 0,100,1,0,100,2,0,134,0,0,125,2,0,124,2,0,
+ 83,40,3,0,0,0,117,20,1,0,0,65,32,99,108,97,
+ 115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,32,
+ 114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,114,
+ 101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,46,
+ 112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,32,
+ 32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,116,
+ 117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,32,
+ 117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,102,
+ 105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,32,
+ 116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,32,
+ 32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,
+ 108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,32,
+ 32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,108,
+ 108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,
+ 114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,
+ 99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,114,
+ 111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,97,
+ 105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,99,
+ 1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,
+ 19,0,0,0,115,46,0,0,0,116,0,0,124,0,0,131,
+ 1,0,115,33,0,116,1,0,100,1,0,100,2,0,124,0,
+ 0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,0,
+ 136,1,0,140,1,0,83,40,3,0,0,0,117,45,0,0,
+ 0,80,97,116,104,32,104,111,111,107,32,102,111,114,32,105,
+ 109,112,111,114,116,108,105,98,46,109,97,99,104,105,110,101,
+ 114,121,46,70,105,108,101,70,105,110,100,101,114,46,117,30,
+ 0,0,0,111,110,108,121,32,100,105,114,101,99,116,111,114,
+ 105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,
+ 100,117,4,0,0,0,112,97,116,104,40,2,0,0,0,117,
+ 11,0,0,0,95,112,97,116,104,95,105,115,100,105,114,117,
+ 11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,40,
+ 1,0,0,0,117,4,0,0,0,112,97,116,104,40,2,0,
+ 0,0,117,3,0,0,0,99,108,115,117,14,0,0,0,108,
+ 111,97,100,101,114,95,100,101,116,97,105,108,115,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,24,0,0,0,112,97,116,104,95,104,111,
+ 111,107,95,102,111,114,95,70,105,108,101,70,105,110,100,101,
+ 114,151,5,0,0,115,6,0,0,0,0,2,12,1,21,1,
+ 117,54,0,0,0,70,105,108,101,70,105,110,100,101,114,46,
+ 112,97,116,104,95,104,111,111,107,46,60,108,111,99,97,108,
+ 115,62,46,112,97,116,104,95,104,111,111,107,95,102,111,114,
+ 95,70,105,108,101,70,105,110,100,101,114,40,0,0,0,0,
+ 40,3,0,0,0,117,3,0,0,0,99,108,115,117,14,0,
+ 0,0,108,111,97,100,101,114,95,100,101,116,97,105,108,115,
+ 117,24,0,0,0,112,97,116,104,95,104,111,111,107,95,102,
+ 111,114,95,70,105,108,101,70,105,110,100,101,114,40,0,0,
+ 0,0,40,2,0,0,0,117,3,0,0,0,99,108,115,117,
+ 14,0,0,0,108,111,97,100,101,114,95,100,101,116,97,105,
+ 108,115,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,9,0,0,0,112,97,116,104,95,104,111,
+ 111,107,141,5,0,0,115,4,0,0,0,0,10,21,6,117,
+ 20,0,0,0,70,105,108,101,70,105,110,100,101,114,46,112,
+ 97,116,104,95,104,111,111,107,99,1,0,0,0,0,0,0,
+ 0,1,0,0,0,2,0,0,0,67,0,0,0,115,14,0,
+ 0,0,100,1,0,124,0,0,106,0,0,102,1,0,22,83,
+ 40,2,0,0,0,78,117,14,0,0,0,70,105,108,101,70,
+ 105,110,100,101,114,40,37,114,41,40,1,0,0,0,117,4,
+ 0,0,0,112,97,116,104,40,1,0,0,0,117,4,0,0,
+ 0,115,101,108,102,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,8,0,0,0,95,95,114,101,112,114,95,95,159,5,
+ 0,0,115,2,0,0,0,0,1,117,19,0,0,0,70,105,
+ 108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,
+ 95,78,40,13,0,0,0,117,8,0,0,0,95,95,110,97,
+ 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,
+ 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,
+ 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,117,17,0,
+ 0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
+ 104,101,115,117,17,0,0,0,95,102,105,110,100,95,109,111,
+ 100,117,108,101,95,115,104,105,109,117,11,0,0,0,102,105,
+ 110,100,95,109,111,100,117,108,101,117,11,0,0,0,102,105,
+ 110,100,95,108,111,97,100,101,114,117,11,0,0,0,95,102,
+ 105,108,108,95,99,97,99,104,101,117,11,0,0,0,99,108,
+ 97,115,115,109,101,116,104,111,100,117,9,0,0,0,112,97,
+ 116,104,95,104,111,111,107,117,8,0,0,0,95,95,114,101,
+ 112,114,95,95,40,1,0,0,0,117,10,0,0,0,95,95,
+ 108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,10,0,0,0,70,105,108,101,70,105,110,
+ 100,101,114,40,5,0,0,115,16,0,0,0,16,7,6,2,
+ 12,14,12,4,6,2,12,42,12,30,18,18,117,10,0,0,
+ 0,70,105,108,101,70,105,110,100,101,114,99,1,0,0,0,
+ 0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,0,
+ 115,50,0,0,0,124,0,0,69,101,0,0,90,1,0,100,
+ 0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,3,
+ 0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,0,
+ 90,5,0,100,6,0,83,40,7,0,0,0,117,18,0,0,
+ 0,95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,
+ 101,120,116,117,36,0,0,0,67,111,110,116,101,120,116,32,
+ 109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,32,
+ 105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,67,0,0,
+ 0,115,14,0,0,0,116,0,0,106,1,0,131,0,0,1,
+ 100,1,0,83,40,2,0,0,0,117,24,0,0,0,65,99,
+ 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116,
+ 32,108,111,99,107,46,78,40,2,0,0,0,117,4,0,0,
+ 0,95,105,109,112,117,12,0,0,0,97,99,113,117,105,114,
+ 101,95,108,111,99,107,40,1,0,0,0,117,4,0,0,0,
+ 115,101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,9,0,0,0,95,95,101,110,116,101,114,95,95,169,5,
+ 0,0,115,2,0,0,0,0,2,117,28,0,0,0,95,73,
+ 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,
+ 46,95,95,101,110,116,101,114,95,95,99,4,0,0,0,0,
+ 0,0,0,4,0,0,0,1,0,0,0,67,0,0,0,115,
+ 14,0,0,0,116,0,0,106,1,0,131,0,0,1,100,1,
+ 0,83,40,2,0,0,0,117,60,0,0,0,82,101,108,101,
+ 97,115,101,32,116,104,101,32,105,109,112,111,114,116,32,108,
+ 111,99,107,32,114,101,103,97,114,100,108,101,115,115,32,111,
+ 102,32,97,110,121,32,114,97,105,115,101,100,32,101,120,99,
+ 101,112,116,105,111,110,115,46,78,40,2,0,0,0,117,4,
+ 0,0,0,95,105,109,112,117,12,0,0,0,114,101,108,101,
+ 97,115,101,95,108,111,99,107,40,4,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,8,0,0,0,101,120,99,95,116,
+ 121,112,101,117,9,0,0,0,101,120,99,95,118,97,108,117,
+ 101,117,13,0,0,0,101,120,99,95,116,114,97,99,101,98,
+ 97,99,107,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 8,0,0,0,95,95,101,120,105,116,95,95,173,5,0,0,
+ 115,2,0,0,0,0,2,117,27,0,0,0,95,73,109,112,
+ 111,114,116,76,111,99,107,67,111,110,116,101,120,116,46,95,
+ 95,101,120,105,116,95,95,78,40,6,0,0,0,117,8,0,
+ 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,
+ 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,
+ 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,
+ 95,100,111,99,95,95,117,9,0,0,0,95,95,101,110,116,
+ 101,114,95,95,117,8,0,0,0,95,95,101,120,105,116,95,
+ 95,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,
+ 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99,
+ 107,67,111,110,116,101,120,116,165,5,0,0,115,6,0,0,
+ 0,16,2,6,2,12,4,117,18,0,0,0,95,73,109,112,
+ 111,114,116,76,111,99,107,67,111,110,116,101,120,116,99,3,
+ 0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,67,
+ 0,0,0,115,91,0,0,0,124,1,0,106,0,0,100,1,
+ 0,124,2,0,100,2,0,24,131,2,0,125,3,0,116,1,
+ 0,124,3,0,131,1,0,124,2,0,107,0,0,114,55,0,
+ 116,2,0,100,3,0,131,1,0,130,1,0,110,0,0,124,
+ 3,0,100,4,0,25,125,4,0,124,0,0,114,87,0,100,
+ 5,0,106,3,0,124,4,0,124,0,0,131,2,0,83,124,
+ 4,0,83,40,6,0,0,0,117,50,0,0,0,82,101,115,
+ 111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,32,
+ 109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,97,
+ 110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,117,
+ 1,0,0,0,46,105,1,0,0,0,117,50,0,0,0,97,
+ 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118,
+ 101,32,105,109,112,111,114,116,32,98,101,121,111,110,100,32,
+ 116,111,112,45,108,101,118,101,108,32,112,97,99,107,97,103,
+ 101,105,0,0,0,0,117,5,0,0,0,123,125,46,123,125,
+ 40,4,0,0,0,117,6,0,0,0,114,115,112,108,105,116,
+ 117,3,0,0,0,108,101,110,117,10,0,0,0,86,97,108,
+ 117,101,69,114,114,111,114,117,6,0,0,0,102,111,114,109,
+ 97,116,40,5,0,0,0,117,4,0,0,0,110,97,109,101,
+ 117,7,0,0,0,112,97,99,107,97,103,101,117,5,0,0,
+ 0,108,101,118,101,108,117,4,0,0,0,98,105,116,115,117,
+ 4,0,0,0,98,97,115,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,13,0,0,0,95,114,101,115,111,108,118,
+ 101,95,110,97,109,101,178,5,0,0,115,10,0,0,0,0,
+ 2,22,1,18,1,15,1,10,1,117,13,0,0,0,95,114,
+ 101,115,111,108,118,101,95,110,97,109,101,99,2,0,0,0,
+ 0,0,0,0,4,0,0,0,11,0,0,0,67,0,0,0,
+ 115,138,0,0,0,116,0,0,106,1,0,115,28,0,116,2,
+ 0,106,3,0,100,1,0,116,4,0,131,2,0,1,110,0,
+ 0,120,103,0,116,0,0,106,1,0,68,93,88,0,125,2,
+ 0,116,5,0,131,0,0,143,23,0,1,124,2,0,106,6,
+ 0,124,0,0,124,1,0,131,2,0,125,3,0,87,100,2,
+ 0,81,88,124,3,0,100,2,0,107,9,0,114,38,0,124,
+ 0,0,116,0,0,106,8,0,107,7,0,114,109,0,124,3,
+ 0,83,116,0,0,106,8,0,124,0,0,25,106,9,0,83,
+ 113,38,0,113,38,0,87,100,2,0,83,100,2,0,83,40,
+ 3,0,0,0,117,23,0,0,0,70,105,110,100,32,97,32,
+ 109,111,100,117,108,101,39,115,32,108,111,97,100,101,114,46,
+ 117,22,0,0,0,115,121,115,46,109,101,116,97,95,112,97,
+ 116,104,32,105,115,32,101,109,112,116,121,78,40,10,0,0,
+ 0,117,3,0,0,0,115,121,115,117,9,0,0,0,109,101,
+ 116,97,95,112,97,116,104,117,9,0,0,0,95,119,97,114,
+ 110,105,110,103,115,117,4,0,0,0,119,97,114,110,117,13,
+ 0,0,0,73,109,112,111,114,116,87,97,114,110,105,110,103,
+ 117,18,0,0,0,95,73,109,112,111,114,116,76,111,99,107,
+ 67,111,110,116,101,120,116,117,11,0,0,0,102,105,110,100,
+ 95,109,111,100,117,108,101,117,4,0,0,0,78,111,110,101,
+ 117,7,0,0,0,109,111,100,117,108,101,115,117,10,0,0,
+ 0,95,95,108,111,97,100,101,114,95,95,40,4,0,0,0,
+ 117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,97,
+ 116,104,117,6,0,0,0,102,105,110,100,101,114,117,6,0,
+ 0,0,108,111,97,100,101,114,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,12,0,0,0,95,102,105,110,100,95,109,
+ 111,100,117,108,101,187,5,0,0,115,20,0,0,0,0,2,
+ 9,1,19,1,16,1,10,1,24,1,12,2,15,1,4,2,
+ 21,2,117,12,0,0,0,95,102,105,110,100,95,109,111,100,
+ 117,108,101,99,3,0,0,0,0,0,0,0,4,0,0,0,
+ 4,0,0,0,67,0,0,0,115,194,0,0,0,116,0,0,
+ 124,0,0,116,1,0,131,2,0,115,45,0,116,2,0,100,
+ 1,0,106,3,0,116,4,0,124,0,0,131,1,0,131,1,
+ 0,131,1,0,130,1,0,110,0,0,124,2,0,100,2,0,
+ 107,0,0,114,72,0,116,5,0,100,3,0,131,1,0,130,
+ 1,0,110,0,0,124,1,0,114,156,0,116,0,0,124,1,
+ 0,116,1,0,131,2,0,115,108,0,116,2,0,100,4,0,
+ 131,1,0,130,1,0,113,156,0,124,1,0,116,6,0,106,
+ 7,0,107,7,0,114,156,0,100,5,0,125,3,0,116,8,
+ 0,124,3,0,106,3,0,124,1,0,131,1,0,131,1,0,
+ 130,1,0,113,156,0,110,0,0,124,0,0,12,114,190,0,
+ 124,2,0,100,2,0,107,2,0,114,190,0,116,5,0,100,
+ 6,0,131,1,0,130,1,0,110,0,0,100,7,0,83,40,
+ 8,0,0,0,117,28,0,0,0,86,101,114,105,102,121,32,
+ 97,114,103,117,109,101,110,116,115,32,97,114,101,32,34,115,
+ 97,110,101,34,46,117,31,0,0,0,109,111,100,117,108,101,
+ 32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,116,
+ 114,44,32,110,111,116,32,123,125,105,0,0,0,0,117,18,
+ 0,0,0,108,101,118,101,108,32,109,117,115,116,32,98,101,
+ 32,62,61,32,48,117,31,0,0,0,95,95,112,97,99,107,
+ 97,103,101,95,95,32,110,111,116,32,115,101,116,32,116,111,
+ 32,97,32,115,116,114,105,110,103,117,61,0,0,0,80,97,
+ 114,101,110,116,32,109,111,100,117,108,101,32,123,33,114,125,
+ 32,110,111,116,32,108,111,97,100,101,100,44,32,99,97,110,
+ 110,111,116,32,112,101,114,102,111,114,109,32,114,101,108,97,
+ 116,105,118,101,32,105,109,112,111,114,116,117,17,0,0,0,
+ 69,109,112,116,121,32,109,111,100,117,108,101,32,110,97,109,
+ 101,78,40,9,0,0,0,117,10,0,0,0,105,115,105,110,
+ 115,116,97,110,99,101,117,3,0,0,0,115,116,114,117,9,
+ 0,0,0,84,121,112,101,69,114,114,111,114,117,6,0,0,
+ 0,102,111,114,109,97,116,117,4,0,0,0,116,121,112,101,
+ 117,10,0,0,0,86,97,108,117,101,69,114,114,111,114,117,
+ 3,0,0,0,115,121,115,117,7,0,0,0,109,111,100,117,
+ 108,101,115,117,11,0,0,0,83,121,115,116,101,109,69,114,
+ 114,111,114,40,4,0,0,0,117,4,0,0,0,110,97,109,
+ 101,117,7,0,0,0,112,97,99,107,97,103,101,117,5,0,
+ 0,0,108,101,118,101,108,117,3,0,0,0,109,115,103,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,13,0,0,0,
+ 95,115,97,110,105,116,121,95,99,104,101,99,107,204,5,0,
+ 0,115,24,0,0,0,0,2,15,1,30,1,12,1,15,1,
+ 6,1,15,1,15,1,15,1,6,2,27,1,19,1,117,13,
+ 0,0,0,95,115,97,110,105,116,121,95,99,104,101,99,107,
+ 117,20,0,0,0,78,111,32,109,111,100,117,108,101,32,110,
+ 97,109,101,100,32,123,33,114,125,99,2,0,0,0,0,0,
+ 0,0,9,0,0,0,27,0,0,0,67,0,0,0,115,12,
+ 2,0,0,100,0,0,125,2,0,124,0,0,106,1,0,100,
+ 1,0,131,1,0,100,2,0,25,125,3,0,124,3,0,114,
+ 178,0,124,3,0,116,2,0,106,3,0,107,7,0,114,62,
+ 0,116,4,0,124,1,0,124,3,0,131,2,0,1,110,0,
+ 0,124,0,0,116,2,0,106,3,0,107,6,0,114,88,0,
+ 116,2,0,106,3,0,124,0,0,25,83,116,2,0,106,3,
+ 0,124,3,0,25,125,4,0,121,13,0,124,4,0,106,5,
+ 0,125,2,0,87,113,178,0,4,116,6,0,107,10,0,114,
+ 174,0,1,1,1,116,7,0,100,3,0,23,106,8,0,124,
+ 0,0,124,3,0,131,2,0,125,5,0,116,9,0,124,5,
+ 0,100,4,0,124,0,0,131,1,1,130,1,0,89,113,178,
+ 0,88,110,0,0,116,10,0,124,0,0,124,2,0,131,2,
+ 0,125,6,0,124,6,0,100,0,0,107,8,0,114,250,0,
+ 116,9,0,116,7,0,106,8,0,124,0,0,131,1,0,100,
+ 4,0,124,0,0,131,1,1,125,7,0,100,10,0,124,7,
+ 0,95,12,0,124,7,0,130,1,0,110,47,0,124,0,0,
+ 116,2,0,106,3,0,107,7,0,114,41,1,124,6,0,106,
+ 13,0,124,0,0,131,1,0,1,116,14,0,100,5,0,124,
+ 0,0,124,6,0,131,3,0,1,110,0,0,116,2,0,106,
+ 3,0,124,0,0,25,125,8,0,124,3,0,114,105,1,116,
+ 2,0,106,3,0,124,3,0,25,125,4,0,116,15,0,124,
+ 4,0,124,0,0,106,1,0,100,1,0,131,1,0,100,6,
+ 0,25,124,8,0,131,3,0,1,110,0,0,116,16,0,124,
+ 8,0,100,7,0,100,0,0,131,3,0,100,0,0,107,8,
+ 0,114,212,1,121,59,0,124,8,0,106,17,0,124,8,0,
+ 95,18,0,116,19,0,124,8,0,100,8,0,131,2,0,115,
+ 187,1,124,8,0,106,18,0,106,1,0,100,1,0,131,1,
+ 0,100,2,0,25,124,8,0,95,18,0,110,0,0,87,113,
+ 212,1,4,116,6,0,107,10,0,114,208,1,1,1,1,89,
+ 113,212,1,88,110,0,0,116,19,0,124,8,0,100,9,0,
+ 131,2,0,115,8,2,121,13,0,124,6,0,124,8,0,95,
+ 20,0,87,113,8,2,4,116,6,0,107,10,0,114,4,2,
+ 1,1,1,89,113,8,2,88,110,0,0,124,8,0,83,40,
+ 11,0,0,0,78,117,1,0,0,0,46,105,0,0,0,0,
+ 117,21,0,0,0,59,32,123,125,32,105,115,32,110,111,116,
+ 32,97,32,112,97,99,107,97,103,101,117,4,0,0,0,110,
+ 97,109,101,117,18,0,0,0,105,109,112,111,114,116,32,123,
+ 33,114,125,32,35,32,123,33,114,125,105,2,0,0,0,117,
+ 11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,117,
+ 8,0,0,0,95,95,112,97,116,104,95,95,117,10,0,0,
+ 0,95,95,108,111,97,100,101,114,95,95,84,40,21,0,0,
+ 0,117,4,0,0,0,78,111,110,101,117,10,0,0,0,114,
+ 112,97,114,116,105,116,105,111,110,117,3,0,0,0,115,121,
+ 115,117,7,0,0,0,109,111,100,117,108,101,115,117,25,0,
+ 0,0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,
+ 109,101,115,95,114,101,109,111,118,101,100,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,117,14,0,0,0,65,116,116,
+ 114,105,98,117,116,101,69,114,114,111,114,117,8,0,0,0,
+ 95,69,82,82,95,77,83,71,117,6,0,0,0,102,111,114,
+ 109,97,116,117,11,0,0,0,73,109,112,111,114,116,69,114,
+ 114,111,114,117,12,0,0,0,95,102,105,110,100,95,109,111,
+ 100,117,108,101,117,4,0,0,0,84,114,117,101,117,10,0,
+ 0,0,95,110,111,116,95,102,111,117,110,100,117,11,0,0,
+ 0,108,111,97,100,95,109,111,100,117,108,101,117,16,0,0,
+ 0,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,
+ 101,117,7,0,0,0,115,101,116,97,116,116,114,117,7,0,
+ 0,0,103,101,116,97,116,116,114,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,11,0,0,0,95,95,112,97,99,
+ 107,97,103,101,95,95,117,7,0,0,0,104,97,115,97,116,
+ 116,114,117,10,0,0,0,95,95,108,111,97,100,101,114,95,
+ 95,40,9,0,0,0,117,4,0,0,0,110,97,109,101,117,
+ 7,0,0,0,105,109,112,111,114,116,95,117,4,0,0,0,
+ 112,97,116,104,117,6,0,0,0,112,97,114,101,110,116,117,
+ 13,0,0,0,112,97,114,101,110,116,95,109,111,100,117,108,
+ 101,117,3,0,0,0,109,115,103,117,6,0,0,0,108,111,
+ 97,100,101,114,117,3,0,0,0,101,120,99,117,6,0,0,
+ 0,109,111,100,117,108,101,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,23,0,0,0,95,102,105,110,100,95,97,110,
+ 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,223,
+ 5,0,0,115,76,0,0,0,0,1,6,1,19,1,6,1,
+ 15,1,16,2,15,1,11,2,13,1,3,1,13,1,13,1,
+ 22,1,26,1,15,1,12,1,27,3,9,1,9,1,15,2,
+ 13,1,19,2,13,1,6,2,13,1,32,2,24,1,3,1,
+ 12,1,15,1,32,1,13,1,8,2,15,1,3,1,13,1,
+ 13,1,8,1,117,23,0,0,0,95,102,105,110,100,95,97,
+ 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,
+ 99,2,0,0,0,0,0,0,0,3,0,0,0,18,0,0,
+ 0,67,0,0,0,115,75,0,0,0,122,16,0,116,0,0,
+ 124,0,0,131,1,0,125,2,0,87,100,1,0,116,1,0,
+ 106,2,0,131,0,0,1,88,124,2,0,106,3,0,131,0,
+ 0,1,122,17,0,116,4,0,124,0,0,124,1,0,131,2,
+ 0,83,87,100,1,0,124,2,0,106,5,0,131,0,0,1,
+ 88,100,1,0,83,40,2,0,0,0,117,54,0,0,0,70,
+ 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101,
+ 32,109,111,100,117,108,101,44,32,97,110,100,32,114,101,108,
+ 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32,
+ 108,111,99,107,46,78,40,6,0,0,0,117,16,0,0,0,
+ 95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,
+ 117,4,0,0,0,95,105,109,112,117,12,0,0,0,114,101,
+ 108,101,97,115,101,95,108,111,99,107,117,7,0,0,0,97,
+ 99,113,117,105,114,101,117,23,0,0,0,95,102,105,110,100,
+ 95,97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,
+ 101,100,117,7,0,0,0,114,101,108,101,97,115,101,40,3,
+ 0,0,0,117,4,0,0,0,110,97,109,101,117,7,0,0,
+ 0,105,109,112,111,114,116,95,117,4,0,0,0,108,111,99,
+ 107,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,14,0,
+ 0,0,95,102,105,110,100,95,97,110,100,95,108,111,97,100,
+ 17,6,0,0,115,14,0,0,0,0,2,3,1,16,2,11,
+ 1,10,1,3,1,17,2,117,14,0,0,0,95,102,105,110,
+ 100,95,97,110,100,95,108,111,97,100,99,3,0,0,0,0,
+ 0,0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,
+ 172,0,0,0,116,0,0,124,0,0,124,1,0,124,2,0,
+ 131,3,0,1,124,2,0,100,1,0,107,4,0,114,49,0,
+ 116,1,0,124,0,0,124,1,0,124,2,0,131,3,0,125,
+ 0,0,110,0,0,116,2,0,106,3,0,131,0,0,1,124,
+ 0,0,116,4,0,106,5,0,107,7,0,114,87,0,116,6,
+ 0,124,0,0,116,7,0,131,2,0,83,116,4,0,106,5,
+ 0,124,0,0,25,125,3,0,124,3,0,100,4,0,107,8,
+ 0,114,158,0,116,2,0,106,9,0,131,0,0,1,100,2,
+ 0,106,10,0,124,0,0,131,1,0,125,4,0,116,11,0,
+ 124,4,0,100,3,0,124,0,0,131,1,1,130,1,0,110,
+ 0,0,116,12,0,124,0,0,131,1,0,1,124,3,0,83,
+ 40,5,0,0,0,117,50,1,0,0,73,109,112,111,114,116,
+ 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
+ 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32,
+ 105,116,115,32,110,97,109,101,44,32,116,104,101,32,112,97,
+ 99,107,97,103,101,32,116,104,101,32,99,97,108,108,32,105,
+ 115,10,32,32,32,32,98,101,105,110,103,32,109,97,100,101,
+ 32,102,114,111,109,44,32,97,110,100,32,116,104,101,32,108,
+ 101,118,101,108,32,97,100,106,117,115,116,109,101,110,116,46,
+ 10,10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,
+ 105,111,110,32,114,101,112,114,101,115,101,110,116,115,32,116,
+ 104,101,32,103,114,101,97,116,101,115,116,32,99,111,109,109,
+ 111,110,32,100,101,110,111,109,105,110,97,116,111,114,32,111,
+ 102,32,102,117,110,99,116,105,111,110,97,108,105,116,121,10,
+ 32,32,32,32,98,101,116,119,101,101,110,32,105,109,112,111,
+ 114,116,95,109,111,100,117,108,101,32,97,110,100,32,95,95,
+ 105,109,112,111,114,116,95,95,46,32,84,104,105,115,32,105,
+ 110,99,108,117,100,101,115,32,115,101,116,116,105,110,103,32,
+ 95,95,112,97,99,107,97,103,101,95,95,32,105,102,10,32,
+ 32,32,32,116,104,101,32,108,111,97,100,101,114,32,100,105,
+ 100,32,110,111,116,46,10,10,32,32,32,32,105,0,0,0,
+ 0,117,40,0,0,0,105,109,112,111,114,116,32,111,102,32,
+ 123,125,32,104,97,108,116,101,100,59,32,78,111,110,101,32,
+ 105,110,32,115,121,115,46,109,111,100,117,108,101,115,117,4,
+ 0,0,0,110,97,109,101,78,40,13,0,0,0,117,13,0,
+ 0,0,95,115,97,110,105,116,121,95,99,104,101,99,107,117,
+ 13,0,0,0,95,114,101,115,111,108,118,101,95,110,97,109,
+ 101,117,4,0,0,0,95,105,109,112,117,12,0,0,0,97,
+ 99,113,117,105,114,101,95,108,111,99,107,117,3,0,0,0,
+ 115,121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,
+ 14,0,0,0,95,102,105,110,100,95,97,110,100,95,108,111,
+ 97,100,117,11,0,0,0,95,103,99,100,95,105,109,112,111,
+ 114,116,117,4,0,0,0,78,111,110,101,117,12,0,0,0,
+ 114,101,108,101,97,115,101,95,108,111,99,107,117,6,0,0,
+ 0,102,111,114,109,97,116,117,11,0,0,0,73,109,112,111,
+ 114,116,69,114,114,111,114,117,19,0,0,0,95,108,111,99,
+ 107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,40,
+ 5,0,0,0,117,4,0,0,0,110,97,109,101,117,7,0,
+ 0,0,112,97,99,107,97,103,101,117,5,0,0,0,108,101,
+ 118,101,108,117,6,0,0,0,109,111,100,117,108,101,117,7,
+ 0,0,0,109,101,115,115,97,103,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,11,0,0,0,95,103,99,100,95,
+ 105,109,112,111,114,116,30,6,0,0,115,28,0,0,0,0,
+ 9,16,1,12,1,21,1,10,1,15,1,13,1,13,1,12,
+ 1,10,1,6,1,9,1,21,1,10,1,117,11,0,0,0,
+ 95,103,99,100,95,105,109,112,111,114,116,99,3,0,0,0,
+ 0,0,0,0,6,0,0,0,17,0,0,0,67,0,0,0,
+ 115,254,0,0,0,116,0,0,124,0,0,100,1,0,131,2,
+ 0,114,250,0,100,2,0,124,1,0,107,6,0,114,89,0,
+ 116,1,0,124,1,0,131,1,0,125,1,0,124,1,0,106,
+ 2,0,100,2,0,131,1,0,1,116,0,0,124,0,0,100,
+ 3,0,131,2,0,114,89,0,124,1,0,106,3,0,124,0,
+ 0,106,4,0,131,1,0,1,113,89,0,110,0,0,120,158,
+ 0,124,1,0,68,93,147,0,125,3,0,116,0,0,124,0,
+ 0,124,3,0,131,2,0,115,96,0,100,4,0,106,5,0,
+ 124,0,0,106,6,0,124,3,0,131,2,0,125,4,0,121,
+ 17,0,116,7,0,124,2,0,124,4,0,131,2,0,1,87,
+ 113,243,0,4,116,8,0,107,10,0,114,239,0,1,125,5,
+ 0,1,122,50,0,116,9,0,124,5,0,100,5,0,100,7,
+ 0,131,3,0,114,218,0,124,5,0,106,11,0,124,4,0,
+ 107,2,0,114,218,0,119,96,0,113,218,0,110,0,0,130,
+ 0,0,87,89,100,6,0,100,6,0,125,5,0,126,5,0,
+ 88,113,243,0,88,113,96,0,113,96,0,87,110,0,0,124,
+ 0,0,83,40,8,0,0,0,117,238,0,0,0,70,105,103,
+ 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105,
+ 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114,
+ 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32,
+ 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101,
+ 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32,
+ 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32,
+ 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116,
+ 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116,
+ 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,
+ 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110,
+ 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109,
+ 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10,
+ 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101,
+ 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115,
+ 105,114,101,100,46,10,10,32,32,32,32,117,8,0,0,0,
+ 95,95,112,97,116,104,95,95,117,1,0,0,0,42,117,7,
+ 0,0,0,95,95,97,108,108,95,95,117,5,0,0,0,123,
+ 125,46,123,125,117,10,0,0,0,95,110,111,116,95,102,111,
+ 117,110,100,78,70,40,12,0,0,0,117,7,0,0,0,104,
+ 97,115,97,116,116,114,117,4,0,0,0,108,105,115,116,117,
+ 6,0,0,0,114,101,109,111,118,101,117,6,0,0,0,101,
+ 120,116,101,110,100,117,7,0,0,0,95,95,97,108,108,95,
+ 95,117,6,0,0,0,102,111,114,109,97,116,117,8,0,0,
+ 0,95,95,110,97,109,101,95,95,117,25,0,0,0,95,99,
+ 97,108,108,95,119,105,116,104,95,102,114,97,109,101,115,95,
+ 114,101,109,111,118,101,100,117,11,0,0,0,73,109,112,111,
+ 114,116,69,114,114,111,114,117,7,0,0,0,103,101,116,97,
+ 116,116,114,117,5,0,0,0,70,97,108,115,101,117,4,0,
+ 0,0,110,97,109,101,40,6,0,0,0,117,6,0,0,0,
+ 109,111,100,117,108,101,117,8,0,0,0,102,114,111,109,108,
+ 105,115,116,117,7,0,0,0,105,109,112,111,114,116,95,117,
+ 1,0,0,0,120,117,9,0,0,0,102,114,111,109,95,110,
+ 97,109,101,117,3,0,0,0,101,120,99,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,16,0,0,0,95,104,97,110,
+ 100,108,101,95,102,114,111,109,108,105,115,116,54,6,0,0,
+ 115,34,0,0,0,0,10,15,1,12,1,12,1,13,1,15,
+ 1,22,1,13,1,15,1,21,1,3,1,17,1,18,6,18,
+ 1,15,1,9,1,32,1,117,16,0,0,0,95,104,97,110,
+ 100,108,101,95,102,114,111,109,108,105,115,116,99,1,0,0,
+ 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,
+ 0,115,78,0,0,0,124,0,0,106,0,0,100,1,0,131,
+ 1,0,125,1,0,124,1,0,100,6,0,107,8,0,114,74,
+ 0,124,0,0,100,2,0,25,125,1,0,100,3,0,124,0,
+ 0,107,7,0,114,74,0,124,1,0,106,2,0,100,4,0,
+ 131,1,0,100,5,0,25,125,1,0,113,74,0,110,0,0,
+ 124,1,0,83,40,7,0,0,0,117,167,0,0,0,67,97,
+ 108,99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,
+ 97,99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,
+ 98,101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,
+ 103,101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,
+ 97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,
+ 105,110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,
+ 32,115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,
+ 32,116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,
+ 97,116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,
+ 108,117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,
+ 10,32,32,32,32,117,11,0,0,0,95,95,112,97,99,107,
+ 97,103,101,95,95,117,8,0,0,0,95,95,110,97,109,101,
+ 95,95,117,8,0,0,0,95,95,112,97,116,104,95,95,117,
+ 1,0,0,0,46,105,0,0,0,0,78,40,3,0,0,0,
+ 117,3,0,0,0,103,101,116,117,4,0,0,0,78,111,110,
+ 101,117,10,0,0,0,114,112,97,114,116,105,116,105,111,110,
+ 40,2,0,0,0,117,7,0,0,0,103,108,111,98,97,108,
+ 115,117,7,0,0,0,112,97,99,107,97,103,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,17,0,0,0,95,99,
+ 97,108,99,95,95,95,112,97,99,107,97,103,101,95,95,88,
+ 6,0,0,115,12,0,0,0,0,7,15,1,12,1,10,1,
+ 12,1,25,1,117,17,0,0,0,95,99,97,108,99,95,95,
+ 95,112,97,99,107,97,103,101,95,95,99,0,0,0,0,0,
+ 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,
+ 55,0,0,0,116,0,0,116,1,0,106,2,0,131,0,0,
+ 102,2,0,125,0,0,116,3,0,116,4,0,102,2,0,125,
+ 1,0,116,5,0,116,6,0,102,2,0,125,2,0,124,0,
+ 0,124,1,0,124,2,0,103,3,0,83,40,1,0,0,0,
+ 117,111,0,0,0,82,101,116,117,114,110,115,32,97,32,108,
+ 105,115,116,32,111,102,32,102,105,108,101,45,98,97,115,101,
+ 100,32,109,111,100,117,108,101,32,108,111,97,100,101,114,115,
+ 46,10,10,32,32,32,32,69,97,99,104,32,105,116,101,109,
+ 32,105,115,32,97,32,116,117,112,108,101,32,40,108,111,97,
+ 100,101,114,44,32,115,117,102,102,105,120,101,115,44,32,97,
+ 108,108,111,119,95,112,97,99,107,97,103,101,115,41,46,10,
+ 32,32,32,32,40,7,0,0,0,117,19,0,0,0,69,120,
+ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+ 114,117,4,0,0,0,95,105,109,112,117,18,0,0,0,101,
+ 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,
+ 115,117,16,0,0,0,83,111,117,114,99,101,70,105,108,101,
+ 76,111,97,100,101,114,117,15,0,0,0,83,79,85,82,67,
+ 69,95,83,85,70,70,73,88,69,83,117,20,0,0,0,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,117,17,0,0,0,66,89,84,69,67,79,68,69,
+ 95,83,85,70,70,73,88,69,83,40,3,0,0,0,117,10,
+ 0,0,0,101,120,116,101,110,115,105,111,110,115,117,6,0,
+ 0,0,115,111,117,114,99,101,117,8,0,0,0,98,121,116,
+ 101,99,111,100,101,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,27,0,0,0,95,103,101,116,95,115,117,112,112,111,
+ 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114,
+ 115,103,6,0,0,115,8,0,0,0,0,5,18,1,12,1,
+ 12,1,117,27,0,0,0,95,103,101,116,95,115,117,112,112,
+ 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,
+ 114,115,99,5,0,0,0,0,0,0,0,9,0,0,0,5,
+ 0,0,0,67,0,0,0,115,227,0,0,0,124,4,0,100,
+ 1,0,107,2,0,114,27,0,116,0,0,124,0,0,131,1,
+ 0,125,5,0,110,54,0,124,1,0,100,3,0,107,9,0,
+ 114,45,0,124,1,0,110,3,0,105,0,0,125,6,0,116,
+ 2,0,124,6,0,131,1,0,125,7,0,116,0,0,124,0,
+ 0,124,7,0,124,4,0,131,3,0,125,5,0,124,3,0,
+ 115,207,0,124,4,0,100,1,0,107,2,0,114,122,0,116,
+ 0,0,124,0,0,106,3,0,100,2,0,131,1,0,100,1,
+ 0,25,131,1,0,83,124,0,0,115,132,0,124,5,0,83,
+ 116,4,0,124,0,0,131,1,0,116,4,0,124,0,0,106,
+ 3,0,100,2,0,131,1,0,100,1,0,25,131,1,0,24,
+ 125,8,0,116,5,0,106,6,0,124,5,0,106,7,0,100,
+ 3,0,116,4,0,124,5,0,106,7,0,131,1,0,124,8,
+ 0,24,133,2,0,25,25,83,110,16,0,116,8,0,124,5,
+ 0,124,3,0,116,0,0,131,3,0,83,100,3,0,83,40,
+ 4,0,0,0,117,214,1,0,0,73,109,112,111,114,116,32,
+ 97,32,109,111,100,117,108,101,46,10,10,32,32,32,32,84,
+ 104,101,32,39,103,108,111,98,97,108,115,39,32,97,114,103,
+ 117,109,101,110,116,32,105,115,32,117,115,101,100,32,116,111,
+ 32,105,110,102,101,114,32,119,104,101,114,101,32,116,104,101,
+ 32,105,109,112,111,114,116,32,105,115,32,111,99,99,117,114,
+ 105,110,103,32,102,114,111,109,10,32,32,32,32,116,111,32,
+ 104,97,110,100,108,101,32,114,101,108,97,116,105,118,101,32,
+ 105,109,112,111,114,116,115,46,32,84,104,101,32,39,108,111,
+ 99,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105,
+ 115,32,105,103,110,111,114,101,100,46,32,84,104,101,10,32,
+ 32,32,32,39,102,114,111,109,108,105,115,116,39,32,97,114,
+ 103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,115,
+ 32,119,104,97,116,32,115,104,111,117,108,100,32,101,120,105,
+ 115,116,32,97,115,32,97,116,116,114,105,98,117,116,101,115,
+ 32,111,110,32,116,104,101,32,109,111,100,117,108,101,10,32,
+ 32,32,32,98,101,105,110,103,32,105,109,112,111,114,116,101,
+ 100,32,40,101,46,103,46,32,96,96,102,114,111,109,32,109,
+ 111,100,117,108,101,32,105,109,112,111,114,116,32,60,102,114,
+ 111,109,108,105,115,116,62,96,96,41,46,32,32,84,104,101,
+ 32,39,108,101,118,101,108,39,10,32,32,32,32,97,114,103,
+ 117,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,
+ 32,116,104,101,32,112,97,99,107,97,103,101,32,108,111,99,
+ 97,116,105,111,110,32,116,111,32,105,109,112,111,114,116,32,
+ 102,114,111,109,32,105,110,32,97,32,114,101,108,97,116,105,
+ 118,101,10,32,32,32,32,105,109,112,111,114,116,32,40,101,
+ 46,103,46,32,96,96,102,114,111,109,32,46,46,112,107,103,
+ 32,105,109,112,111,114,116,32,109,111,100,96,96,32,119,111,
+ 117,108,100,32,104,97,118,101,32,97,32,39,108,101,118,101,
+ 108,39,32,111,102,32,50,41,46,10,10,32,32,32,32,105,
+ 0,0,0,0,117,1,0,0,0,46,78,40,9,0,0,0,
+ 117,11,0,0,0,95,103,99,100,95,105,109,112,111,114,116,
+ 117,4,0,0,0,78,111,110,101,117,17,0,0,0,95,99,
+ 97,108,99,95,95,95,112,97,99,107,97,103,101,95,95,117,
+ 9,0,0,0,112,97,114,116,105,116,105,111,110,117,3,0,
+ 0,0,108,101,110,117,3,0,0,0,115,121,115,117,7,0,
+ 0,0,109,111,100,117,108,101,115,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,16,0,0,0,95,104,97,110,100,
+ 108,101,95,102,114,111,109,108,105,115,116,40,9,0,0,0,
+ 117,4,0,0,0,110,97,109,101,117,7,0,0,0,103,108,
+ 111,98,97,108,115,117,6,0,0,0,108,111,99,97,108,115,
+ 117,8,0,0,0,102,114,111,109,108,105,115,116,117,5,0,
+ 0,0,108,101,118,101,108,117,6,0,0,0,109,111,100,117,
+ 108,101,117,8,0,0,0,103,108,111,98,97,108,115,95,117,
+ 7,0,0,0,112,97,99,107,97,103,101,117,7,0,0,0,
+ 99,117,116,95,111,102,102,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,10,0,0,0,95,95,105,109,112,111,114,116,
+ 95,95,114,6,0,0,115,26,0,0,0,0,11,12,1,15,
+ 2,24,1,12,1,18,1,6,3,12,1,23,1,6,1,4,
+ 4,35,3,40,2,117,10,0,0,0,95,95,105,109,112,111,
+ 114,116,95,95,99,2,0,0,0,0,0,0,0,14,0,0,
+ 0,13,0,0,0,67,0,0,0,115,196,2,0,0,124,1,
+ 0,97,0,0,124,0,0,97,1,0,116,1,0,106,2,0,
+ 106,3,0,114,33,0,116,4,0,97,5,0,110,6,0,116,
+ 6,0,97,5,0,120,47,0,116,0,0,116,1,0,102,2,
+ 0,68,93,33,0,125,2,0,116,7,0,124,2,0,100,1,
+ 0,131,2,0,115,52,0,116,8,0,124,2,0,95,9,0,
+ 113,52,0,113,52,0,87,116,1,0,106,10,0,116,11,0,
+ 25,125,3,0,120,76,0,100,28,0,68,93,68,0,125,4,
+ 0,124,4,0,116,1,0,106,10,0,107,7,0,114,148,0,
+ 116,8,0,106,12,0,124,4,0,131,1,0,125,5,0,110,
+ 13,0,116,1,0,106,10,0,124,4,0,25,125,5,0,116,
+ 13,0,124,3,0,124,4,0,124,5,0,131,3,0,1,113,
+ 109,0,87,100,6,0,100,7,0,103,1,0,102,2,0,100,
+ 8,0,100,9,0,100,7,0,103,2,0,102,2,0,100,10,
+ 0,100,9,0,100,7,0,103,2,0,102,2,0,102,3,0,
+ 125,6,0,120,189,0,124,6,0,68,93,169,0,92,2,0,
+ 125,7,0,125,8,0,116,14,0,100,11,0,100,12,0,132,
+ 0,0,124,8,0,68,131,1,0,131,1,0,115,23,1,116,
+ 15,0,130,1,0,124,8,0,100,13,0,25,125,9,0,124,
+ 7,0,116,1,0,106,10,0,107,6,0,114,65,1,116,1,
+ 0,106,10,0,124,7,0,25,125,10,0,80,113,236,0,121,
+ 60,0,116,8,0,106,12,0,124,7,0,131,1,0,125,10,
+ 0,124,7,0,100,10,0,107,2,0,114,123,1,100,14,0,
+ 116,1,0,106,16,0,107,6,0,114,123,1,124,8,0,100,
+ 15,0,25,125,9,0,110,0,0,80,87,113,236,0,4,116,
+ 17,0,107,10,0,114,148,1,1,1,1,119,236,0,89,113,
+ 236,0,88,113,236,0,87,116,17,0,100,16,0,131,1,0,
+ 130,1,0,121,19,0,116,8,0,106,12,0,100,17,0,131,
+ 1,0,125,11,0,87,110,24,0,4,116,17,0,107,10,0,
+ 114,210,1,1,1,1,100,27,0,125,11,0,89,110,1,0,
+ 88,116,8,0,106,12,0,100,18,0,131,1,0,125,12,0,
+ 124,7,0,100,8,0,107,2,0,114,16,2,116,8,0,106,
+ 12,0,100,19,0,131,1,0,125,13,0,116,13,0,124,3,
+ 0,100,20,0,124,13,0,131,3,0,1,110,0,0,116,13,
+ 0,124,3,0,100,21,0,124,10,0,131,3,0,1,116,13,
+ 0,124,3,0,100,17,0,124,11,0,131,3,0,1,116,13,
+ 0,124,3,0,100,18,0,124,12,0,131,3,0,1,116,13,
+ 0,124,3,0,100,22,0,124,9,0,131,3,0,1,116,13,
+ 0,124,3,0,100,23,0,116,19,0,124,8,0,131,1,0,
+ 131,3,0,1,116,13,0,124,3,0,100,24,0,116,20,0,
+ 131,0,0,131,3,0,1,116,21,0,106,22,0,116,0,0,
+ 106,23,0,131,0,0,131,1,0,1,124,7,0,100,8,0,
+ 107,2,0,114,192,2,116,24,0,106,25,0,100,25,0,131,
+ 1,0,1,100,26,0,116,21,0,107,6,0,114,192,2,100,
+ 29,0,116,27,0,95,28,0,113,192,2,110,0,0,100,27,
+ 0,83,40,30,0,0,0,117,250,0,0,0,83,101,116,117,
+ 112,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,
+ 109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,
+ 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,
+ 32,97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,
+ 104,101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,
+ 32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,
+ 101,46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,
+ 115,32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,
+ 46,109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,
+ 97,110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,
+ 101,100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,
+ 45,105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,
+ 32,116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,
+ 101,115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,
+ 99,105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,
+ 10,10,32,32,32,32,117,10,0,0,0,95,95,108,111,97,
+ 100,101,114,95,95,117,3,0,0,0,95,105,111,117,9,0,
+ 0,0,95,119,97,114,110,105,110,103,115,117,8,0,0,0,
+ 98,117,105,108,116,105,110,115,117,7,0,0,0,109,97,114,
+ 115,104,97,108,117,5,0,0,0,112,111,115,105,120,117,1,
+ 0,0,0,47,117,2,0,0,0,110,116,117,1,0,0,0,
+ 92,117,3,0,0,0,111,115,50,99,1,0,0,0,0,0,
+ 0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,33,
+ 0,0,0,124,0,0,93,23,0,125,1,0,116,0,0,124,
+ 1,0,131,1,0,100,0,0,107,2,0,86,1,113,3,0,
+ 100,1,0,83,40,2,0,0,0,105,1,0,0,0,78,40,
+ 1,0,0,0,117,3,0,0,0,108,101,110,40,2,0,0,
+ 0,117,2,0,0,0,46,48,117,3,0,0,0,115,101,112,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,9,0,0,
+ 0,60,103,101,110,101,120,112,114,62,182,6,0,0,115,2,
+ 0,0,0,6,0,117,25,0,0,0,95,115,101,116,117,112,
+ 46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,
+ 112,114,62,105,0,0,0,0,117,7,0,0,0,69,77,88,
+ 32,71,67,67,105,1,0,0,0,117,30,0,0,0,105,109,
+ 112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115,
+ 32,112,111,115,105,120,32,111,114,32,110,116,117,7,0,0,
+ 0,95,116,104,114,101,97,100,117,8,0,0,0,95,119,101,
+ 97,107,114,101,102,117,6,0,0,0,119,105,110,114,101,103,
+ 117,7,0,0,0,95,119,105,110,114,101,103,117,3,0,0,
+ 0,95,111,115,117,8,0,0,0,112,97,116,104,95,115,101,
+ 112,117,15,0,0,0,112,97,116,104,95,115,101,112,97,114,
+ 97,116,111,114,115,117,11,0,0,0,95,114,101,108,97,120,
+ 95,99,97,115,101,117,4,0,0,0,46,112,121,119,117,6,
+ 0,0,0,95,100,46,112,121,100,78,40,4,0,0,0,117,
+ 3,0,0,0,95,105,111,117,9,0,0,0,95,119,97,114,
+ 110,105,110,103,115,117,8,0,0,0,98,117,105,108,116,105,
+ 110,115,117,7,0,0,0,109,97,114,115,104,97,108,84,40,
+ 29,0,0,0,117,4,0,0,0,95,105,109,112,117,3,0,
+ 0,0,115,121,115,117,5,0,0,0,102,108,97,103,115,117,
+ 8,0,0,0,111,112,116,105,109,105,122,101,117,27,0,0,
+ 0,79,80,84,73,77,73,90,69,68,95,66,89,84,69,67,
+ 79,68,69,95,83,85,70,70,73,88,69,83,117,17,0,0,
+ 0,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+ 69,83,117,23,0,0,0,68,69,66,85,71,95,66,89,84,
+ 69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,7,
+ 0,0,0,104,97,115,97,116,116,114,117,15,0,0,0,66,
+ 117,105,108,116,105,110,73,109,112,111,114,116,101,114,117,10,
+ 0,0,0,95,95,108,111,97,100,101,114,95,95,117,7,0,
+ 0,0,109,111,100,117,108,101,115,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,11,0,0,0,108,111,97,100,95,
+ 109,111,100,117,108,101,117,7,0,0,0,115,101,116,97,116,
+ 116,114,117,3,0,0,0,97,108,108,117,14,0,0,0,65,
+ 115,115,101,114,116,105,111,110,69,114,114,111,114,117,7,0,
+ 0,0,118,101,114,115,105,111,110,117,11,0,0,0,73,109,
+ 112,111,114,116,69,114,114,111,114,117,4,0,0,0,78,111,
+ 110,101,117,3,0,0,0,115,101,116,117,16,0,0,0,95,
+ 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,117,
+ 18,0,0,0,69,88,84,69,78,83,73,79,78,95,83,85,
+ 70,70,73,88,69,83,117,6,0,0,0,101,120,116,101,110,
+ 100,117,18,0,0,0,101,120,116,101,110,115,105,111,110,95,
+ 115,117,102,102,105,120,101,115,117,15,0,0,0,83,79,85,
+ 82,67,69,95,83,85,70,70,73,88,69,83,117,6,0,0,
+ 0,97,112,112,101,110,100,117,4,0,0,0,84,114,117,101,
+ 117,21,0,0,0,87,105,110,100,111,119,115,82,101,103,105,
+ 115,116,114,121,70,105,110,100,101,114,117,11,0,0,0,68,
+ 69,66,85,71,95,66,85,73,76,68,40,14,0,0,0,117,
+ 10,0,0,0,115,121,115,95,109,111,100,117,108,101,117,11,
+ 0,0,0,95,105,109,112,95,109,111,100,117,108,101,117,6,
+ 0,0,0,109,111,100,117,108,101,117,11,0,0,0,115,101,
+ 108,102,95,109,111,100,117,108,101,117,12,0,0,0,98,117,
+ 105,108,116,105,110,95,110,97,109,101,117,14,0,0,0,98,
+ 117,105,108,116,105,110,95,109,111,100,117,108,101,117,10,0,
+ 0,0,111,115,95,100,101,116,97,105,108,115,117,10,0,0,
+ 0,98,117,105,108,116,105,110,95,111,115,117,15,0,0,0,
+ 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,117,
+ 8,0,0,0,112,97,116,104,95,115,101,112,117,9,0,0,
+ 0,111,115,95,109,111,100,117,108,101,117,13,0,0,0,116,
+ 104,114,101,97,100,95,109,111,100,117,108,101,117,14,0,0,
+ 0,119,101,97,107,114,101,102,95,109,111,100,117,108,101,117,
+ 13,0,0,0,119,105,110,114,101,103,95,109,111,100,117,108,
+ 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,6,0,
+ 0,0,95,115,101,116,117,112,150,6,0,0,115,96,0,0,
+ 0,0,9,6,1,6,2,12,1,9,2,6,2,19,1,15,
+ 1,16,2,13,1,13,1,15,1,18,2,13,1,20,2,48,
+ 1,19,2,31,1,10,1,15,1,13,1,4,2,3,1,15,
+ 2,27,1,13,1,5,1,13,1,12,2,12,2,3,1,19,
+ 1,13,2,11,1,15,2,12,1,15,1,19,2,16,1,16,
+ 1,16,1,16,1,22,2,19,1,19,1,12,1,13,1,12,
+ 1,117,6,0,0,0,95,115,101,116,117,112,99,2,0,0,
+ 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,
+ 0,115,136,0,0,0,116,0,0,124,0,0,124,1,0,131,
+ 2,0,1,116,1,0,131,0,0,125,2,0,116,2,0,106,
+ 3,0,106,4,0,116,5,0,106,6,0,124,2,0,140,0,
+ 0,103,1,0,131,1,0,1,116,2,0,106,7,0,106,8,
+ 0,116,9,0,131,1,0,1,116,2,0,106,7,0,106,8,
+ 0,116,10,0,131,1,0,1,116,11,0,106,12,0,100,1,
+ 0,107,2,0,114,116,0,116,2,0,106,7,0,106,8,0,
+ 116,13,0,131,1,0,1,110,0,0,116,2,0,106,7,0,
+ 106,8,0,116,14,0,131,1,0,1,100,2,0,83,40,3,
+ 0,0,0,117,50,0,0,0,73,110,115,116,97,108,108,32,
+ 105,109,112,111,114,116,108,105,98,32,97,115,32,116,104,101,
+ 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,
+ 111,102,32,105,109,112,111,114,116,46,117,2,0,0,0,110,
+ 116,78,40,15,0,0,0,117,6,0,0,0,95,115,101,116,
+ 117,112,117,27,0,0,0,95,103,101,116,95,115,117,112,112,
+ 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,
+ 114,115,117,3,0,0,0,115,121,115,117,10,0,0,0,112,
+ 97,116,104,95,104,111,111,107,115,117,6,0,0,0,101,120,
+ 116,101,110,100,117,10,0,0,0,70,105,108,101,70,105,110,
+ 100,101,114,117,9,0,0,0,112,97,116,104,95,104,111,111,
+ 107,117,9,0,0,0,109,101,116,97,95,112,97,116,104,117,
+ 6,0,0,0,97,112,112,101,110,100,117,15,0,0,0,66,
+ 117,105,108,116,105,110,73,109,112,111,114,116,101,114,117,14,
+ 0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,101,
+ 114,117,3,0,0,0,95,111,115,117,8,0,0,0,95,95,
+ 110,97,109,101,95,95,117,21,0,0,0,87,105,110,100,111,
+ 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,
+ 117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,40,
+ 3,0,0,0,117,10,0,0,0,115,121,115,95,109,111,100,
+ 117,108,101,117,11,0,0,0,95,105,109,112,95,109,111,100,
+ 117,108,101,117,17,0,0,0,115,117,112,112,111,114,116,101,
+ 100,95,108,111,97,100,101,114,115,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,95,105,110,115,116,97,
+ 108,108,224,6,0,0,115,16,0,0,0,0,2,13,1,9,
+ 1,28,1,16,1,16,1,15,1,19,1,117,8,0,0,0,
+ 95,105,110,115,116,97,108,108,78,40,3,0,0,0,117,3,
+ 0,0,0,119,105,110,117,6,0,0,0,99,121,103,119,105,
+ 110,117,6,0,0,0,100,97,114,119,105,110,40,74,0,0,
+ 0,117,7,0,0,0,95,95,100,111,99,95,95,117,27,0,
+ 0,0,95,67,65,83,69,95,73,78,83,69,78,83,73,84,
+ 73,86,69,95,80,76,65,84,70,79,82,77,83,117,16,0,
+ 0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,97,
+ 115,101,117,7,0,0,0,95,119,95,108,111,110,103,117,7,
+ 0,0,0,95,114,95,108,111,110,103,117,10,0,0,0,95,
+ 112,97,116,104,95,106,111,105,110,117,11,0,0,0,95,112,
+ 97,116,104,95,115,112,108,105,116,117,18,0,0,0,95,112,
+ 97,116,104,95,105,115,95,109,111,100,101,95,116,121,112,101,
+ 117,12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,
+ 101,117,11,0,0,0,95,112,97,116,104,95,105,115,100,105,
+ 114,117,13,0,0,0,95,119,114,105,116,101,95,97,116,111,
+ 109,105,99,117,5,0,0,0,95,119,114,97,112,117,4,0,
+ 0,0,116,121,112,101,117,8,0,0,0,95,95,99,111,100,
+ 101,95,95,117,10,0,0,0,95,99,111,100,101,95,116,121,
+ 112,101,117,10,0,0,0,110,101,119,95,109,111,100,117,108,
+ 101,117,13,0,0,0,95,109,111,100,117,108,101,95,108,111,
+ 99,107,115,117,12,0,0,0,95,98,108,111,99,107,105,110,
+ 103,95,111,110,117,12,0,0,0,82,117,110,116,105,109,101,
+ 69,114,114,111,114,117,14,0,0,0,95,68,101,97,100,108,
+ 111,99,107,69,114,114,111,114,117,11,0,0,0,95,77,111,
+ 100,117,108,101,76,111,99,107,117,16,0,0,0,95,68,117,
+ 109,109,121,77,111,100,117,108,101,76,111,99,107,117,16,0,
+ 0,0,95,103,101,116,95,109,111,100,117,108,101,95,108,111,
+ 99,107,117,19,0,0,0,95,108,111,99,107,95,117,110,108,
+ 111,99,107,95,109,111,100,117,108,101,117,25,0,0,0,95,
+ 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115,
+ 95,114,101,109,111,118,101,100,117,3,0,0,0,111,114,100,
+ 117,17,0,0,0,95,82,65,87,95,77,65,71,73,67,95,
+ 78,85,77,66,69,82,117,5,0,0,0,98,121,116,101,115,
+ 117,5,0,0,0,114,97,110,103,101,117,12,0,0,0,95,
+ 77,65,71,73,67,95,66,89,84,69,83,117,8,0,0,0,
+ 95,80,89,67,65,67,72,69,117,15,0,0,0,83,79,85,
+ 82,67,69,95,83,85,70,70,73,88,69,83,117,23,0,0,
+ 0,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,
+ 83,85,70,70,73,88,69,83,117,27,0,0,0,79,80,84,
+ 73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95,
+ 83,85,70,70,73,88,69,83,117,4,0,0,0,78,111,110,
+ 101,117,17,0,0,0,99,97,99,104,101,95,102,114,111,109,
+ 95,115,111,117,114,99,101,117,17,0,0,0,115,111,117,114,
+ 99,101,95,102,114,111,109,95,99,97,99,104,101,117,15,0,
+ 0,0,95,103,101,116,95,115,111,117,114,99,101,102,105,108,
+ 101,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109,
+ 101,115,115,97,103,101,117,11,0,0,0,115,101,116,95,112,
+ 97,99,107,97,103,101,117,10,0,0,0,115,101,116,95,108,
+ 111,97,100,101,114,117,17,0,0,0,109,111,100,117,108,101,
+ 95,102,111,114,95,108,111,97,100,101,114,117,11,0,0,0,
+ 95,99,104,101,99,107,95,110,97,109,101,117,17,0,0,0,
+ 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,
+ 110,117,16,0,0,0,95,114,101,113,117,105,114,101,115,95,
+ 102,114,111,122,101,110,117,17,0,0,0,95,102,105,110,100,
+ 95,109,111,100,117,108,101,95,115,104,105,109,117,15,0,0,
+ 0,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,
+ 117,14,0,0,0,70,114,111,122,101,110,73,109,112,111,114,
+ 116,101,114,117,21,0,0,0,87,105,110,100,111,119,115,82,
+ 101,103,105,115,116,114,121,70,105,110,100,101,114,117,13,0,
+ 0,0,95,76,111,97,100,101,114,66,97,115,105,99,115,117,
+ 12,0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,
+ 117,10,0,0,0,70,105,108,101,76,111,97,100,101,114,117,
+ 16,0,0,0,83,111,117,114,99,101,70,105,108,101,76,111,
+ 97,100,101,114,117,20,0,0,0,83,111,117,114,99,101,108,
+ 101,115,115,70,105,108,101,76,111,97,100,101,114,117,18,0,
+ 0,0,69,88,84,69,78,83,73,79,78,95,83,85,70,70,
+ 73,88,69,83,117,19,0,0,0,69,120,116,101,110,115,105,
+ 111,110,70,105,108,101,76,111,97,100,101,114,117,14,0,0,
+ 0,95,78,97,109,101,115,112,97,99,101,80,97,116,104,117,
+ 15,0,0,0,78,97,109,101,115,112,97,99,101,76,111,97,
+ 100,101,114,117,10,0,0,0,80,97,116,104,70,105,110,100,
+ 101,114,117,10,0,0,0,70,105,108,101,70,105,110,100,101,
+ 114,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99,
+ 107,67,111,110,116,101,120,116,117,13,0,0,0,95,114,101,
+ 115,111,108,118,101,95,110,97,109,101,117,12,0,0,0,95,
+ 102,105,110,100,95,109,111,100,117,108,101,117,13,0,0,0,
+ 95,115,97,110,105,116,121,95,99,104,101,99,107,117,8,0,
+ 0,0,95,69,82,82,95,77,83,71,117,23,0,0,0,95,
+ 102,105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,
+ 108,111,99,107,101,100,117,14,0,0,0,95,102,105,110,100,
+ 95,97,110,100,95,108,111,97,100,117,11,0,0,0,95,103,
+ 99,100,95,105,109,112,111,114,116,117,16,0,0,0,95,104,
+ 97,110,100,108,101,95,102,114,111,109,108,105,115,116,117,17,
+ 0,0,0,95,99,97,108,99,95,95,95,112,97,99,107,97,
+ 103,101,95,95,117,27,0,0,0,95,103,101,116,95,115,117,
+ 112,112,111,114,116,101,100,95,102,105,108,101,95,108,111,97,
+ 100,101,114,115,117,10,0,0,0,95,95,105,109,112,111,114,
+ 116,95,95,117,6,0,0,0,95,115,101,116,117,112,117,8,
+ 0,0,0,95,105,110,115,116,97,108,108,40,0,0,0,0,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,
+ 0,60,109,111,100,117,108,101,62,8,0,0,0,115,132,0,
+ 0,0,6,21,6,3,12,13,12,16,12,13,12,12,12,12,
+ 12,10,12,6,12,7,15,22,12,8,15,3,12,12,6,2,
+ 6,3,22,4,19,68,19,23,12,19,12,20,12,100,34,1,
+ 37,2,6,2,9,2,9,1,9,2,15,27,12,23,12,21,
+ 12,8,12,13,12,11,12,55,12,18,12,11,12,11,12,17,
+ 19,57,19,54,19,50,19,82,22,134,19,29,25,49,25,25,
+ 6,3,19,45,19,55,19,18,19,89,19,125,19,13,12,9,
+ 12,17,12,17,6,2,12,50,12,13,18,24,12,34,12,15,
+ 12,11,24,36,12,74,
+};
diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py
index 5d8e5a9..d9a0855 100755
--- a/Python/makeopcodetargets.py
+++ b/Python/makeopcodetargets.py
@@ -23,9 +23,6 @@ def write_contents(f):
opcode = find_module("opcode")
targets = ['_unknown_opcode'] * 256
for opname, op in opcode.opmap.items():
- if opname == "STOP_CODE":
- # XXX opcode not implemented
- continue
targets[op] = "TARGET_%s" % opname
f.write("static void *opcode_targets[256] = {\n")
f.write(",\n".join([" &&%s" % s for s in targets]))
diff --git a/Python/marshal.c b/Python/marshal.c
index 3e2fbeb..6d52a84 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -31,6 +31,9 @@
#define TYPE_STOPITER 'S'
#define TYPE_ELLIPSIS '.'
#define TYPE_INT 'i'
+/* TYPE_INT64 is deprecated. It is not
+ generated anymore, and support for reading it
+ will be removed in Python 3.4. */
#define TYPE_INT64 'I'
#define TYPE_FLOAT 'f'
#define TYPE_BINARY_FLOAT 'g'
@@ -59,9 +62,9 @@ typedef struct {
/* If fp == NULL, the following are valid: */
PyObject *readable; /* Stream-like object being read from */
PyObject *str;
+ PyObject *current_filename;
char *ptr;
char *end;
- PyObject *strings; /* dict on marshal, list on unmarshal */
int version;
} WFILE;
@@ -121,15 +124,6 @@ w_long(long x, WFILE *p)
w_byte((char)((x>>24) & 0xff), p);
}
-#if SIZEOF_LONG > 4
-static void
-w_long64(long x, WFILE *p)
-{
- w_long(x, p);
- w_long(x>>32, p);
-}
-#endif
-
/* We assume that Python longs are stored internally in base some power of
2**15; for the sake of portability we'll always read and write them in base
exactly 2**15. */
@@ -219,8 +213,8 @@ w_object(PyObject *v, WFILE *p)
#if SIZEOF_LONG > 4
long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
if (y && y != -1) {
- w_byte(TYPE_INT64, p);
- w_long64(x, p);
+ /* Too large for TYPE_INT */
+ w_PyLong((PyLongObject*)v, p);
}
else
#endif
@@ -311,9 +305,7 @@ w_object(PyObject *v, WFILE *p)
}
else if (PyUnicode_CheckExact(v)) {
PyObject *utf8;
- utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
- PyUnicode_GET_SIZE(v),
- "surrogatepass");
+ utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
if (utf8 == NULL) {
p->depth--;
p->error = WFERR_UNMARSHALLABLE;
@@ -445,7 +437,6 @@ PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
wf.fp = fp;
wf.error = WFERR_OK;
wf.depth = 0;
- wf.strings = NULL;
wf.version = version;
w_long(x, &wf);
}
@@ -457,10 +448,8 @@ PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
wf.fp = fp;
wf.error = WFERR_OK;
wf.depth = 0;
- wf.strings = (version > 0) ? PyDict_New() : NULL;
wf.version = version;
w_object(x, &wf);
- Py_XDECREF(wf.strings);
}
typedef WFILE RFILE; /* Same struct with different invariants */
@@ -485,7 +474,9 @@ r_string(char *s, int n, RFILE *p)
}
}
else {
- PyObject *data = PyObject_CallMethod(p->readable, "read", "i", n);
+ _Py_IDENTIFIER(read);
+
+ PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n);
read = 0;
if (data != NULL) {
if (!PyBytes_Check(data)) {
@@ -1069,6 +1060,18 @@ r_object(RFILE *p)
filename = r_object(p);
if (filename == NULL)
goto code_error;
+ if (PyUnicode_CheckExact(filename)) {
+ if (p->current_filename != NULL) {
+ if (!PyUnicode_Compare(filename, p->current_filename)) {
+ Py_DECREF(filename);
+ Py_INCREF(p->current_filename);
+ filename = p->current_filename;
+ }
+ }
+ else {
+ p->current_filename = filename;
+ }
+ }
name = r_object(p);
if (name == NULL)
goto code_error;
@@ -1131,7 +1134,7 @@ PyMarshal_ReadShortFromFile(FILE *fp)
assert(fp);
rf.readable = NULL;
rf.fp = fp;
- rf.strings = NULL;
+ rf.current_filename = NULL;
rf.end = rf.ptr = NULL;
return r_short(&rf);
}
@@ -1142,7 +1145,7 @@ PyMarshal_ReadLongFromFile(FILE *fp)
RFILE rf;
rf.fp = fp;
rf.readable = NULL;
- rf.strings = NULL;
+ rf.current_filename = NULL;
rf.ptr = rf.end = NULL;
return r_long(&rf);
}
@@ -1204,11 +1207,10 @@ PyMarshal_ReadObjectFromFile(FILE *fp)
PyObject *result;
rf.fp = fp;
rf.readable = NULL;
- rf.strings = PyList_New(0);
+ rf.current_filename = NULL;
rf.depth = 0;
rf.ptr = rf.end = NULL;
result = r_object(&rf);
- Py_DECREF(rf.strings);
return result;
}
@@ -1219,12 +1221,11 @@ PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
PyObject *result;
rf.fp = NULL;
rf.readable = NULL;
+ rf.current_filename = NULL;
rf.ptr = str;
rf.end = str + len;
- rf.strings = PyList_New(0);
rf.depth = 0;
result = r_object(&rf);
- Py_DECREF(rf.strings);
return result;
}
@@ -1232,7 +1233,6 @@ PyObject *
PyMarshal_WriteObjectToString(PyObject *x, int version)
{
WFILE wf;
- PyObject *res = NULL;
wf.fp = NULL;
wf.readable = NULL;
@@ -1244,9 +1244,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)
wf.error = WFERR_OK;
wf.depth = 0;
wf.version = version;
- wf.strings = (version > 0) ? PyDict_New() : NULL;
w_object(x, &wf);
- Py_XDECREF(wf.strings);
if (wf.str != NULL) {
char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
if (wf.ptr - base > PY_SSIZE_T_MAX) {
@@ -1268,12 +1266,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)
:"object too deeply nested to marshal");
return NULL;
}
- if (wf.str != NULL) {
- /* XXX Quick hack -- need to do this differently */
- res = PyBytes_FromObject(wf.str);
- Py_DECREF(wf.str);
- }
- return res;
+ return wf.str;
}
/* And an interface for Python programs... */
@@ -1287,12 +1280,14 @@ marshal_dump(PyObject *self, PyObject *args)
int version = Py_MARSHAL_VERSION;
PyObject *s;
PyObject *res;
+ _Py_IDENTIFIER(write);
+
if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
return NULL;
s = PyMarshal_WriteObjectToString(x, version);
if (s == NULL)
return NULL;
- res = PyObject_CallMethod(f, "write", "O", s);
+ res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Py_DECREF(s);
return res;
}
@@ -1314,6 +1309,7 @@ static PyObject *
marshal_load(PyObject *self, PyObject *f)
{
PyObject *data, *result;
+ _Py_IDENTIFIER(read);
RFILE rf;
/*
@@ -1321,7 +1317,7 @@ marshal_load(PyObject *self, PyObject *f)
* This is to ensure that the object passed in at least
* has a read method which returns bytes.
*/
- data = PyObject_CallMethod(f, "read", "i", 0);
+ data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
if (data == NULL)
return NULL;
if (!PyBytes_Check(data)) {
@@ -1331,12 +1327,11 @@ marshal_load(PyObject *self, PyObject *f)
result = NULL;
}
else {
- rf.strings = PyList_New(0);
rf.depth = 0;
rf.fp = NULL;
rf.readable = f;
+ rf.current_filename = NULL;
result = read_object(&rf);
- Py_DECREF(rf.strings);
}
Py_DECREF(data);
return result;
@@ -1389,12 +1384,11 @@ marshal_loads(PyObject *self, PyObject *args)
n = p.len;
rf.fp = NULL;
rf.readable = NULL;
+ rf.current_filename = NULL;
rf.ptr = s;
rf.end = s + n;
- rf.strings = PyList_New(0);
rf.depth = 0;
result = read_object(&rf);
- Py_DECREF(rf.strings);
PyBuffer_Release(&p);
return result;
}
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 85b0d66..428914f 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -148,15 +148,6 @@ do_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags)
return v;
}
-static int
-_ustrlen(Py_UNICODE *u)
-{
- int i = 0;
- Py_UNICODE *v = u;
- while (*v != 0) { i++; v++; }
- return i;
-}
-
static PyObject *
do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)
{
@@ -269,7 +260,7 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
}
else {
if (n < 0)
- n = _ustrlen(u);
+ n = Py_UNICODE_strlen(u);
v = PyUnicode_FromUnicode(u, n);
}
return v;
@@ -292,11 +283,6 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
case 'C':
{
int i = va_arg(*p_va, int);
- if (i < 0 || i > PyUnicode_GetMax()) {
- PyErr_SetString(PyExc_OverflowError,
- "%c arg not in range(0x110000)");
- return NULL;
- }
return PyUnicode_FromOrdinal(i);
}
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index a91da79..2d6bcda 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -71,7 +71,7 @@ static void *opcode_targets[256] = {
&&TARGET_STORE_LOCALS,
&&TARGET_PRINT_EXPR,
&&TARGET_LOAD_BUILD_CLASS,
- &&_unknown_opcode,
+ &&TARGET_YIELD_FROM,
&&_unknown_opcode,
&&_unknown_opcode,
&&TARGET_INPLACE_LSHIFT,
diff --git a/Python/peephole.c b/Python/peephole.c
index 7ae599b..5d53677 100644
--- a/Python/peephole.c
+++ b/Python/peephole.c
@@ -23,6 +23,64 @@
#define ISBASICBLOCK(blocks, start, bytes) \
(blocks[start]==blocks[start+bytes-1])
+
+#define CONST_STACK_CREATE() { \
+ const_stack_size = 256; \
+ const_stack = PyMem_New(PyObject *, const_stack_size); \
+ load_const_stack = PyMem_New(Py_ssize_t, const_stack_size); \
+ if (!const_stack || !load_const_stack) { \
+ PyErr_NoMemory(); \
+ goto exitError; \
+ } \
+ }
+
+#define CONST_STACK_DELETE() do { \
+ if (const_stack) \
+ PyMem_Free(const_stack); \
+ if (load_const_stack) \
+ PyMem_Free(load_const_stack); \
+ } while(0)
+
+#define CONST_STACK_LEN() (const_stack_top + 1)
+
+#define CONST_STACK_PUSH_OP(i) do { \
+ PyObject *_x; \
+ assert(codestr[i] == LOAD_CONST); \
+ assert(PyList_GET_SIZE(consts) > GETARG(codestr, i)); \
+ _x = PyList_GET_ITEM(consts, GETARG(codestr, i)); \
+ if (++const_stack_top >= const_stack_size) { \
+ const_stack_size *= 2; \
+ PyMem_Resize(const_stack, PyObject *, const_stack_size); \
+ PyMem_Resize(load_const_stack, Py_ssize_t, const_stack_size); \
+ if (!const_stack || !load_const_stack) { \
+ PyErr_NoMemory(); \
+ goto exitError; \
+ } \
+ } \
+ load_const_stack[const_stack_top] = i; \
+ const_stack[const_stack_top] = _x; \
+ in_consts = 1; \
+ } while(0)
+
+#define CONST_STACK_RESET() do { \
+ const_stack_top = -1; \
+ } while(0)
+
+#define CONST_STACK_TOP() \
+ const_stack[const_stack_top]
+
+#define CONST_STACK_LASTN(i) \
+ &const_stack[const_stack_top - i + 1]
+
+#define CONST_STACK_POP(i) do { \
+ assert(const_stack_top + 1 >= i); \
+ const_stack_top -= i; \
+ } while(0)
+
+#define CONST_STACK_OP_LASTN(i) \
+ ((const_stack_top >= i - 1) ? load_const_stack[const_stack_top - i + 1] : -1)
+
+
/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
with LOAD_CONST (c1, c2, ... cn).
The consts table must still be in list form so that the
@@ -33,17 +91,14 @@
test; for BUILD_SET it assembles a frozenset rather than a tuple.
*/
static int
-tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)
+tuple_of_constants(unsigned char *codestr, Py_ssize_t n,
+ PyObject *consts, PyObject **objs)
{
PyObject *newconst, *constant;
- Py_ssize_t i, arg, len_consts;
+ Py_ssize_t i, len_consts;
/* Pre-conditions */
assert(PyList_CheckExact(consts));
- assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST || codestr[n*3] == BUILD_SET);
- assert(GETARG(codestr, (n*3)) == n);
- for (i=0 ; i<n ; i++)
- assert(codestr[i*3] == LOAD_CONST);
/* Buildup new tuple of constants */
newconst = PyTuple_New(n);
@@ -51,16 +106,14 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)
return 0;
len_consts = PyList_GET_SIZE(consts);
for (i=0 ; i<n ; i++) {
- arg = GETARG(codestr, (i*3));
- assert(arg < len_consts);
- constant = PyList_GET_ITEM(consts, arg);
+ constant = objs[i];
Py_INCREF(constant);
PyTuple_SET_ITEM(newconst, i, constant);
}
/* If it's a BUILD_SET, use the PyTuple we just built to create a
PyFrozenSet, and use that as the constant instead: */
- if (codestr[n*3] == BUILD_SET) {
+ if (codestr[0] == BUILD_SET) {
PyObject *tuple = newconst;
newconst = PyFrozenSet_New(tuple);
Py_DECREF(tuple);
@@ -77,9 +130,8 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)
/* Write NOPs over old LOAD_CONSTS and
add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
- memset(codestr, NOP, n*3);
- codestr[n*3] = LOAD_CONST;
- SETARG(codestr, (n*3), len_consts);
+ codestr[0] = LOAD_CONST;
+ SETARG(codestr, 0, len_consts);
return 1;
}
@@ -87,14 +139,14 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)
with LOAD_CONST binop(c1,c2)
The consts table must still be in list form so that the
new constant can be appended.
- Called with codestr pointing to the first LOAD_CONST.
+ Called with codestr pointing to the BINOP.
Abandons the transformation if the folding fails (i.e. 1+'a').
If the new constant is a sequence, only folds when the size
is below a threshold value. That keeps pyc files from
becoming large in the presence of code like: (None,)*1000.
*/
static int
-fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
+fold_binops_on_constants(unsigned char *codestr, PyObject *consts, PyObject **objs)
{
PyObject *newconst, *v, *w;
Py_ssize_t len_consts, size;
@@ -102,13 +154,11 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
/* Pre-conditions */
assert(PyList_CheckExact(consts));
- assert(codestr[0] == LOAD_CONST);
- assert(codestr[3] == LOAD_CONST);
/* Create new constant */
- v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
- w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
- opcode = codestr[6];
+ v = objs[0];
+ w = objs[1];
+ opcode = codestr[0];
switch (opcode) {
case BINARY_POWER:
newconst = PyNumber_Power(v, w, Py_None);
@@ -132,13 +182,6 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
newconst = PyNumber_Subtract(v, w);
break;
case BINARY_SUBSCR:
- /* #5057: if v is unicode, there might be differences between
- wide and narrow builds in cases like '\U00012345'[0] or
- '\U00012345abcdef'[3], so it's better to skip the optimization
- in order to produce compatible pycs.
- */
- if (PyUnicode_Check(v))
- return 0;
newconst = PyObject_GetItem(v, w);
break;
case BINARY_LSHIFT:
@@ -187,16 +230,15 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
Py_DECREF(newconst);
/* Write NOP NOP NOP NOP LOAD_CONST newconst */
- memset(codestr, NOP, 4);
- codestr[4] = LOAD_CONST;
- SETARG(codestr, 4, len_consts);
+ codestr[-2] = LOAD_CONST;
+ SETARG(codestr, -2, len_consts);
return 1;
}
static int
-fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
+fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v)
{
- PyObject *newconst=NULL, *v;
+ PyObject *newconst;
Py_ssize_t len_consts;
int opcode;
@@ -205,13 +247,10 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
assert(codestr[0] == LOAD_CONST);
/* Create new constant */
- v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
opcode = codestr[3];
switch (opcode) {
case UNARY_NEGATIVE:
- /* Preserve the sign of -0.0 */
- if (PyObject_IsTrue(v) == 1)
- newconst = PyNumber_Negative(v);
+ newconst = PyNumber_Negative(v);
break;
case UNARY_INVERT:
newconst = PyNumber_Invert(v);
@@ -347,7 +386,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
unsigned char *lineno;
int *addrmap = NULL;
int new_line, cum_orig_line, last_line, tabsiz;
- int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
+ PyObject **const_stack = NULL;
+ Py_ssize_t *load_const_stack = NULL;
+ Py_ssize_t const_stack_top = -1;
+ Py_ssize_t const_stack_size = 0;
+ int in_consts = 0; /* whether we are in a LOAD_CONST sequence */
unsigned int *blocks = NULL;
char *name;
@@ -393,12 +436,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
goto exitError;
assert(PyList_Check(consts));
+ CONST_STACK_CREATE();
+
for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
reoptimize_current:
opcode = codestr[i];
- lastlc = cumlc;
- cumlc = 0;
+ if (!in_consts) {
+ CONST_STACK_RESET();
+ }
+ in_consts = 0;
switch (opcode) {
/* Replace UNARY_NOT POP_JUMP_IF_FALSE
@@ -439,21 +486,21 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
goto exitError;
else if (h == 0)
continue;
- cumlc = lastlc + 1;
+ CONST_STACK_PUSH_OP(i);
break;
/* Skip over LOAD_CONST trueconst
POP_JUMP_IF_FALSE xx. This improves
"while 1" performance. */
case LOAD_CONST:
- cumlc = lastlc + 1;
+ CONST_STACK_PUSH_OP(i);
j = GETARG(codestr, i);
if (codestr[i+3] != POP_JUMP_IF_FALSE ||
!ISBASICBLOCK(blocks,i,6) ||
!PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
continue;
memset(codestr+i, NOP, 6);
- cumlc = 0;
+ CONST_STACK_RESET();
break;
/* Try to fold tuples of constants (includes a case for lists and sets
@@ -465,19 +512,23 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case BUILD_LIST:
case BUILD_SET:
j = GETARG(codestr, i);
- h = i - 3 * j;
- if (h >= 0 &&
- j <= lastlc &&
+ if (j == 0)
+ break;
+ h = CONST_STACK_OP_LASTN(j);
+ assert((h >= 0 || CONST_STACK_LEN() < j));
+ if (h >= 0 && j > 0 && j <= CONST_STACK_LEN() &&
((opcode == BUILD_TUPLE &&
- ISBASICBLOCK(blocks, h, 3*(j+1))) ||
+ ISBASICBLOCK(blocks, h, i-h+3)) ||
((opcode == BUILD_LIST || opcode == BUILD_SET) &&
codestr[i+3]==COMPARE_OP &&
- ISBASICBLOCK(blocks, h, 3*(j+2)) &&
+ ISBASICBLOCK(blocks, h, i-h+6) &&
(GETARG(codestr,i+3)==6 ||
GETARG(codestr,i+3)==7))) &&
- tuple_of_constants(&codestr[h], j, consts)) {
+ tuple_of_constants(&codestr[i], j, consts, CONST_STACK_LASTN(j))) {
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ memset(&codestr[h], NOP, i - h);
+ CONST_STACK_POP(j);
+ CONST_STACK_PUSH_OP(i);
break;
}
if (codestr[i+3] != UNPACK_SEQUENCE ||
@@ -490,10 +541,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
} else if (j == 2) {
codestr[i] = ROT_TWO;
memset(codestr+i+1, NOP, 5);
+ CONST_STACK_RESET();
} else if (j == 3) {
codestr[i] = ROT_THREE;
codestr[i+1] = ROT_TWO;
memset(codestr+i+2, NOP, 4);
+ CONST_STACK_RESET();
}
break;
@@ -512,12 +565,18 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case BINARY_AND:
case BINARY_XOR:
case BINARY_OR:
- if (lastlc >= 2 &&
- ISBASICBLOCK(blocks, i-6, 7) &&
- fold_binops_on_constants(&codestr[i-6], consts)) {
+ /* NOTE: LOAD_CONST is saved at `i-2` since it has an arg
+ while BINOP hasn't */
+ h = CONST_STACK_OP_LASTN(2);
+ assert((h >= 0 || CONST_STACK_LEN() < 2));
+ if (h >= 0 &&
+ ISBASICBLOCK(blocks, h, i-h+1) &&
+ fold_binops_on_constants(&codestr[i], consts, CONST_STACK_LASTN(2))) {
i -= 2;
+ memset(&codestr[h], NOP, i - h);
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ CONST_STACK_POP(2);
+ CONST_STACK_PUSH_OP(i);
}
break;
@@ -526,12 +585,15 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case UNARY_NEGATIVE:
case UNARY_INVERT:
case UNARY_POSITIVE:
- if (lastlc >= 1 &&
- ISBASICBLOCK(blocks, i-3, 4) &&
- fold_unaryops_on_constants(&codestr[i-3], consts)) {
+ h = CONST_STACK_OP_LASTN(1);
+ assert((h >= 0 || CONST_STACK_LEN() < 1));
+ if (h >= 0 &&
+ ISBASICBLOCK(blocks, h, i-h+1) &&
+ fold_unaryops_on_constants(&codestr[i-3], consts, CONST_STACK_TOP())) {
i -= 2;
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ CONST_STACK_POP(1);
+ CONST_STACK_PUSH_OP(i);
}
break;
@@ -688,6 +750,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
assert(h + nops == codelen);
code = PyBytes_FromStringAndSize((char *)codestr, h);
+ CONST_STACK_DELETE();
PyMem_Free(addrmap);
PyMem_Free(codestr);
PyMem_Free(blocks);
@@ -697,6 +760,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
code = NULL;
exitUnchanged:
+ CONST_STACK_DELETE();
if (blocks != NULL)
PyMem_Free(blocks);
if (addrmap != NULL)
diff --git a/Python/pyarena.c b/Python/pyarena.c
index 5a255ae..bb2fd1e 100644
--- a/Python/pyarena.c
+++ b/Python/pyarena.c
@@ -12,8 +12,6 @@
#define DEFAULT_BLOCK_SIZE 8192
#define ALIGNMENT 8
-#define ALIGNMENT_MASK (ALIGNMENT - 1)
-#define ROUNDUP(x) (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK)
typedef struct _block {
/* Total number of bytes owned by this block available to pass out.
@@ -85,8 +83,8 @@ block_new(size_t size)
b->ab_size = size;
b->ab_mem = (void *)(b + 1);
b->ab_next = NULL;
- b->ab_offset = ROUNDUP((Py_uintptr_t)(b->ab_mem)) -
- (Py_uintptr_t)(b->ab_mem);
+ b->ab_offset = (char *)_Py_ALIGN_UP(b->ab_mem, ALIGNMENT) -
+ (char *)(b->ab_mem);
return b;
}
@@ -104,7 +102,7 @@ block_alloc(block *b, size_t size)
{
void *p;
assert(b);
- size = ROUNDUP(size);
+ size = _Py_SIZE_ROUND_UP(size, ALIGNMENT);
if (b->ab_offset + size > b->ab_size) {
/* If we need to allocate more memory than will fit in
the default block, allocate a one-off block that is
diff --git a/Python/pystate.c b/Python/pystate.c
index 42bc3ec..cfd61d0 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -69,7 +69,6 @@ PyInterpreterState_New(void)
Py_FatalError("Can't initialize threads for interpreter");
#endif
interp->modules = NULL;
- interp->modules_reloading = NULL;
interp->modules_by_index = NULL;
interp->sysdict = NULL;
interp->builtins = NULL;
@@ -79,6 +78,7 @@ PyInterpreterState_New(void)
interp->codec_error_registry = NULL;
interp->codecs_initialized = 0;
interp->fscodec_initialized = 0;
+ interp->importlib = NULL;
#ifdef HAVE_DLOPEN
#ifdef RTLD_NOW
interp->dlopenflags = RTLD_NOW;
@@ -113,9 +113,9 @@ PyInterpreterState_Clear(PyInterpreterState *interp)
Py_CLEAR(interp->codec_error_registry);
Py_CLEAR(interp->modules);
Py_CLEAR(interp->modules_by_index);
- Py_CLEAR(interp->modules_reloading);
Py_CLEAR(interp->sysdict);
Py_CLEAR(interp->builtins);
+ Py_CLEAR(interp->importlib);
}
@@ -242,9 +242,9 @@ _PyThreadState_Init(PyThreadState *tstate)
}
PyObject*
-PyState_FindModule(struct PyModuleDef* m)
+PyState_FindModule(struct PyModuleDef* module)
{
- Py_ssize_t index = m->m_base.m_index;
+ Py_ssize_t index = module->m_base.m_index;
PyInterpreterState *state = PyThreadState_GET()->interp;
PyObject *res;
if (index == 0)
@@ -276,6 +276,47 @@ _PyState_AddModule(PyObject* module, struct PyModuleDef* def)
def->m_base.m_index, module);
}
+int
+PyState_AddModule(PyObject* module, struct PyModuleDef* def)
+{
+ Py_ssize_t index;
+ PyInterpreterState *state = PyThreadState_GET()->interp;
+ if (!def) {
+ Py_FatalError("PyState_AddModule: Module Definition is NULL");
+ return -1;
+ }
+ index = def->m_base.m_index;
+ if (state->modules_by_index) {
+ if(PyList_GET_SIZE(state->modules_by_index) >= index) {
+ if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
+ Py_FatalError("PyState_AddModule: Module already added!");
+ return -1;
+ }
+ }
+ }
+ return _PyState_AddModule(module, def);
+}
+
+int
+PyState_RemoveModule(struct PyModuleDef* def)
+{
+ Py_ssize_t index = def->m_base.m_index;
+ PyInterpreterState *state = PyThreadState_GET()->interp;
+ if (index == 0) {
+ Py_FatalError("PyState_RemoveModule: Module index invalid.");
+ return -1;
+ }
+ if (state->modules_by_index == NULL) {
+ Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
+ return -1;
+ }
+ if (index > PyList_GET_SIZE(state->modules_by_index)) {
+ Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
+ return -1;
+ }
+ return PyList_SetItem(state->modules_by_index, index, Py_None);
+}
+
void
PyThreadState_Clear(PyThreadState *tstate)
{
diff --git a/Python/pystrtod.c b/Python/pystrtod.c
index 75e3032..4ab8f08 100644
--- a/Python/pystrtod.c
+++ b/Python/pystrtod.c
@@ -22,6 +22,43 @@ case_insensitive_match(const char *s, const char *t)
the successfully parsed portion of the string. On failure, return -1.0 and
set *endptr to point to the start of the string. */
+#ifndef PY_NO_SHORT_FLOAT_REPR
+
+double
+_Py_parse_inf_or_nan(const char *p, char **endptr)
+{
+ double retval;
+ const char *s;
+ int negate = 0;
+
+ s = p;
+ if (*s == '-') {
+ negate = 1;
+ s++;
+ }
+ else if (*s == '+') {
+ s++;
+ }
+ if (case_insensitive_match(s, "inf")) {
+ s += 3;
+ if (case_insensitive_match(s, "inity"))
+ s += 5;
+ retval = _Py_dg_infinity(negate);
+ }
+ else if (case_insensitive_match(s, "nan")) {
+ s += 3;
+ retval = _Py_dg_stdnan(negate);
+ }
+ else {
+ s = p;
+ retval = -1.0;
+ }
+ *endptr = (char *)s;
+ return retval;
+}
+
+#else
+
double
_Py_parse_inf_or_nan(const char *p, char **endptr)
{
@@ -57,6 +94,8 @@ _Py_parse_inf_or_nan(const char *p, char **endptr)
return retval;
}
+#endif
+
/**
* _PyOS_ascii_strtod:
* @nptr: the string to convert to a numeric value.
@@ -954,7 +993,7 @@ format_float_short(double d, char format_code,
/* shouldn't get here: Gay's code should always return
something starting with a digit, an 'I', or 'N' */
strncpy(p, "ERR", 3);
- p += 3;
+ /* p += 3; */
assert(0);
}
goto exit;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 3639fa7..dd32017 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -52,7 +52,7 @@ extern wchar_t *Py_GetPath(void);
extern grammar _PyParser_Grammar; /* From graminit.c */
/* Forward */
-static void initmain(void);
+static void initmain(PyInterpreterState *interp);
static int initfsencoding(PyInterpreterState *interp);
static void initsite(void);
static int initstdio(void);
@@ -62,14 +62,17 @@ static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
PyCompilerFlags *);
static void err_input(perrdetail *);
+static void err_free(perrdetail *);
static void initsigs(void);
static void call_py_exitfuncs(void);
static void wait_for_thread_shutdown(void);
static void call_ll_exitfuncs(void);
-extern void _PyUnicode_Init(void);
+extern int _PyUnicode_Init(void);
extern void _PyUnicode_Fini(void);
extern int _PyLong_Init(void);
extern void PyLong_Fini(void);
+extern int _PyFaulthandler_Init(void);
+extern void _PyFaulthandler_Fini(void);
#ifdef WITH_THREAD
extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
@@ -139,12 +142,13 @@ get_codec_name(const char *encoding)
{
char *name_utf8, *name_str;
PyObject *codec, *name = NULL;
+ _Py_IDENTIFIER(name);
codec = _PyCodec_Lookup(encoding);
if (!codec)
goto error;
- name = PyObject_GetAttrString(codec, "name");
+ name = _PyObject_GetAttrId(codec, &PyId_name);
Py_CLEAR(codec);
if (!name)
goto error;
@@ -166,21 +170,79 @@ error:
return NULL;
}
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
static char*
-get_codeset(void)
+get_locale_encoding(void)
{
+#ifdef MS_WINDOWS
+ char codepage[100];
+ PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP());
+ return get_codec_name(codepage);
+#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
char* codeset = nl_langinfo(CODESET);
if (!codeset || codeset[0] == '\0') {
PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
return NULL;
}
return get_codec_name(codeset);
-}
+#else
+ PyErr_SetNone(PyExc_NotImplementedError);
+ return NULL;
#endif
+}
+
+static void
+import_init(PyInterpreterState *interp, PyObject *sysmod)
+{
+ PyObject *importlib;
+ PyObject *impmod;
+ PyObject *sys_modules;
+ PyObject *value;
+
+ /* Import _importlib through its frozen version, _frozen_importlib. */
+ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
+ Py_FatalError("Py_Initialize: can't import _frozen_importlib");
+ }
+ else if (Py_VerboseFlag) {
+ PySys_FormatStderr("import _frozen_importlib # frozen\n");
+ }
+ importlib = PyImport_AddModule("_frozen_importlib");
+ if (importlib == NULL) {
+ Py_FatalError("Py_Initialize: couldn't get _frozen_importlib from "
+ "sys.modules");
+ }
+ interp->importlib = importlib;
+ Py_INCREF(interp->importlib);
+
+ /* Install _importlib as __import__ */
+ impmod = PyInit_imp();
+ if (impmod == NULL) {
+ Py_FatalError("Py_Initialize: can't import imp");
+ }
+ else if (Py_VerboseFlag) {
+ PySys_FormatStderr("import imp # builtin\n");
+ }
+ sys_modules = PyImport_GetModuleDict();
+ if (Py_VerboseFlag) {
+ PySys_FormatStderr("import sys # builtin\n");
+ }
+ if (PyDict_SetItemString(sys_modules, "_imp", impmod) < 0) {
+ Py_FatalError("Py_Initialize: can't save _imp to sys.modules");
+ }
+
+ value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod);
+ if (value == NULL) {
+ PyErr_Print();
+ Py_FatalError("Py_Initialize: importlib install failed");
+ }
+ Py_DECREF(value);
+ Py_DECREF(impmod);
+
+ _PyImportZip_Init();
+}
+
void
-Py_InitializeEx(int install_sigs)
+_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
PyInterpreterState *interp;
PyThreadState *tstate;
@@ -252,12 +314,10 @@ Py_InitializeEx(int install_sigs)
interp->modules = PyDict_New();
if (interp->modules == NULL)
Py_FatalError("Py_Initialize: can't make modules dictionary");
- interp->modules_reloading = PyDict_New();
- if (interp->modules_reloading == NULL)
- Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
/* Init Unicode implementation; relies on the codec registry */
- _PyUnicode_Init();
+ if (_PyUnicode_Init() < 0)
+ Py_FatalError("Py_Initialize: can't initialize unicode");
bimod = _PyBuiltin_Init();
if (bimod == NULL)
@@ -269,7 +329,7 @@ Py_InitializeEx(int install_sigs)
Py_INCREF(interp->builtins);
/* initialize builtin exceptions */
- _PyExc_Init();
+ _PyExc_Init(bimod);
sysmod = _PySys_Init();
if (sysmod == NULL)
@@ -299,6 +359,15 @@ Py_InitializeEx(int install_sigs)
/* Initialize _warnings. */
_PyWarnings_Init();
+ if (!install_importlib)
+ return;
+
+ import_init(interp, sysmod);
+
+ /* initialize the faulthandler module */
+ if (_PyFaulthandler_Init())
+ Py_FatalError("Py_Initialize: can't initialize faulthandler");
+
_PyTime_Init();
if (initfsencoding(interp) < 0)
@@ -307,7 +376,7 @@ Py_InitializeEx(int install_sigs)
if (install_sigs)
initsigs(); /* Signal handling stuff, including initintr() */
- initmain(); /* Module __main__ */
+ initmain(interp); /* Module __main__ */
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
@@ -327,6 +396,12 @@ Py_InitializeEx(int install_sigs)
}
void
+Py_InitializeEx(int install_sigs)
+{
+ _Py_InitializeEx_Private(install_sigs, 1);
+}
+
+void
Py_Initialize(void)
{
Py_InitializeEx(1);
@@ -361,9 +436,10 @@ flush_std_files(void)
PyObject *fout = PySys_GetObject("stdout");
PyObject *ferr = PySys_GetObject("stderr");
PyObject *tmp;
+ _Py_IDENTIFIER(flush);
if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_WriteUnraisable(fout);
else
@@ -371,7 +447,7 @@ flush_std_files(void)
}
if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
- tmp = PyObject_CallMethod(ferr, "flush", "");
+ tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -464,7 +540,7 @@ Py_Finalize(void)
flush_std_files();
/* Collect final garbage. This disposes of cycles created by
- * new-style class definitions, for example.
+ * class definitions, for example.
* XXX This is disabled because it caused too many problems. If
* XXX a __del__ or weakref callback triggers here, Python code has
* XXX a hard time running, because even the sys module has been
@@ -485,6 +561,9 @@ Py_Finalize(void)
/* Destroy the database used by _PyImport_{Fixup,Find}Extension */
_PyImport_Fini();
+ /* unload faulthandler module */
+ _PyFaulthandler_Fini();
+
/* Debugging stuff */
#ifdef COUNT_ALLOCS
dump_counts(stdout);
@@ -534,6 +613,7 @@ Py_Finalize(void)
PyLong_Fini();
PyFloat_Fini();
PyDict_Fini();
+ PySlice_Fini();
/* Cleanup Unicode implementation */
_PyUnicode_Fini();
@@ -562,7 +642,7 @@ Py_Finalize(void)
#endif /* Py_TRACE_REFS */
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
- _PyObject_DebugMallocStats();
+ _PyObject_DebugMallocStats(stderr);
#endif
call_ll_exitfuncs();
@@ -606,7 +686,6 @@ Py_NewInterpreter(void)
/* XXX The following is lax in error checking */
interp->modules = PyDict_New();
- interp->modules_reloading = PyDict_New();
bimod = _PyImport_FindBuiltin("builtins");
if (bimod != NULL) {
@@ -617,11 +696,12 @@ Py_NewInterpreter(void)
}
/* initialize builtin exceptions */
- _PyExc_Init();
+ _PyExc_Init(bimod);
sysmod = _PyImport_FindBuiltin("sys");
if (bimod != NULL && sysmod != NULL) {
PyObject *pstderr;
+
interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL)
goto handle_error;
@@ -640,13 +720,15 @@ Py_NewInterpreter(void)
_PyImportHooks_Init();
+ import_init(interp, sysmod);
+
if (initfsencoding(interp) < 0)
goto handle_error;
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
- initmain();
+ initmain(interp);
if (!Py_NoSiteFlag)
initsite();
}
@@ -743,7 +825,7 @@ Py_GetPythonHome(void)
/* Create __main__ module */
static void
-initmain(void)
+initmain(PyInterpreterState *interp)
{
PyObject *m, *d;
m = PyImport_AddModule("__main__");
@@ -752,35 +834,48 @@ initmain(void)
d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
PyObject *bimod = PyImport_ImportModule("builtins");
- if (bimod == NULL ||
- PyDict_SetItemString(d, "__builtins__", bimod) != 0)
- Py_FatalError("can't add __builtins__ to __main__");
+ if (bimod == NULL) {
+ Py_FatalError("Failed to retrieve builtins module");
+ }
+ if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
+ Py_FatalError("Failed to initialize __main__.__builtins__");
+ }
Py_DECREF(bimod);
}
+ /* Main is a little special - imp.is_builtin("__main__") will return
+ * False, but BuiltinImporter is still the most appropriate initial
+ * setting for its __loader__ attribute. A more suitable value will
+ * be set if __main__ gets further initialized later in the startup
+ * process.
+ */
+ if (PyDict_GetItemString(d, "__loader__") == NULL) {
+ PyObject *loader = PyObject_GetAttrString(interp->importlib,
+ "BuiltinImporter");
+ if (loader == NULL) {
+ Py_FatalError("Failed to retrieve BuiltinImporter");
+ }
+ if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
+ Py_FatalError("Failed to initialize __main__.__loader__");
+ }
+ Py_DECREF(loader);
+ }
}
static int
initfsencoding(PyInterpreterState *interp)
{
PyObject *codec;
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
- char *codeset = NULL;
-
- if (Py_FileSystemDefaultEncoding == NULL) {
- /* On Unix, set the file system encoding according to the
- user's preference, if the CODESET names a well-known
- Python codec, and Py_FileSystemDefaultEncoding isn't
- initialized by other means. */
- codeset = get_codeset();
- if (codeset == NULL)
+
+ if (Py_FileSystemDefaultEncoding == NULL)
+ {
+ Py_FileSystemDefaultEncoding = get_locale_encoding();
+ if (Py_FileSystemDefaultEncoding == NULL)
Py_FatalError("Py_Initialize: Unable to get the locale encoding");
- Py_FileSystemDefaultEncoding = codeset;
Py_HasFileSystemDefaultEncoding = 0;
interp->fscodec_initialized = 1;
return 0;
}
-#endif
/* the encoding is mbcs, utf-8 or ascii */
codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
@@ -822,6 +917,11 @@ create_stdio(PyObject* io,
const char* newline;
PyObject *line_buffering;
int buffering, isatty;
+ _Py_IDENTIFIER(open);
+ _Py_IDENTIFIER(isatty);
+ _Py_IDENTIFIER(TextIOWrapper);
+ _Py_IDENTIFIER(name);
+ _Py_IDENTIFIER(mode);
/* stdin is always opened in buffered mode, first because it shouldn't
make a difference in common use cases, second because TextIOWrapper
@@ -836,14 +936,15 @@ create_stdio(PyObject* io,
mode = "wb";
else
mode = "rb";
- buf = PyObject_CallMethod(io, "open", "isiOOOi",
- fd, mode, buffering,
- Py_None, Py_None, Py_None, 0);
+ buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi",
+ fd, mode, buffering,
+ Py_None, Py_None, Py_None, 0);
if (buf == NULL)
goto error;
if (buffering) {
- raw = PyObject_GetAttrString(buf, "raw");
+ _Py_IDENTIFIER(raw);
+ raw = _PyObject_GetAttrId(buf, &PyId_raw);
if (raw == NULL)
goto error;
}
@@ -853,9 +954,9 @@ create_stdio(PyObject* io,
}
text = PyUnicode_FromString(name);
- if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0)
+ if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)
goto error;
- res = PyObject_CallMethod(raw, "isatty", "");
+ res = _PyObject_CallMethodId(raw, &PyId_isatty, "");
if (res == NULL)
goto error;
isatty = PyObject_IsTrue(res);
@@ -881,9 +982,9 @@ create_stdio(PyObject* io,
newline = "\n";
#endif
- stream = PyObject_CallMethod(io, "TextIOWrapper", "OsssO",
- buf, encoding, errors,
- newline, line_buffering);
+ stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO",
+ buf, encoding, errors,
+ newline, line_buffering);
Py_CLEAR(buf);
if (stream == NULL)
goto error;
@@ -893,7 +994,7 @@ create_stdio(PyObject* io,
else
mode = "r";
text = PyUnicode_FromString(mode);
- if (!text || PyObject_SetAttrString(stream, "mode", text) < 0)
+ if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)
goto error;
Py_CLEAR(text);
return stream;
@@ -1133,13 +1234,14 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags
PyArena *arena;
char *ps1 = "", *ps2 = "", *enc = NULL;
int errcode = 0;
+ _Py_IDENTIFIER(encoding);
if (fp == stdin) {
/* Fetch encoding from sys.stdin */
v = PySys_GetObject("stdin");
if (v == NULL || v == Py_None)
return -1;
- oenc = PyObject_GetAttrString(v, "encoding");
+ oenc = _PyObject_GetAttrId(v, &PyId_encoding);
if (!oenc)
return -1;
enc = _PyUnicode_AsString(oenc);
@@ -1252,6 +1354,37 @@ maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
}
int
+static set_main_loader(PyObject *d, const char *filename, const char *loader_name)
+{
+ PyInterpreterState *interp;
+ PyThreadState *tstate;
+ PyObject *filename_obj, *loader_type, *loader;
+ int result = 0;
+
+ filename_obj = PyUnicode_DecodeFSDefault(filename);
+ if (filename_obj == NULL)
+ return -1;
+ /* Get current thread state and interpreter pointer */
+ tstate = PyThreadState_GET();
+ interp = tstate->interp;
+ loader_type = PyObject_GetAttrString(interp->importlib, loader_name);
+ if (loader_type == NULL) {
+ Py_DECREF(filename_obj);
+ return -1;
+ }
+ loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj);
+ Py_DECREF(loader_type);
+ if (loader == NULL) {
+ return -1;
+ }
+ if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
+ result = -1;
+ }
+ Py_DECREF(loader);
+ return result;
+}
+
+int
PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
PyCompilerFlags *flags)
{
@@ -1284,18 +1417,34 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
len = strlen(filename);
ext = filename + len - (len > 4 ? 4 : 0);
if (maybe_pyc_file(fp, filename, ext, closeit)) {
+ FILE *pyc_fp;
/* Try to run a pyc file. First, re-open in binary */
if (closeit)
fclose(fp);
- if ((fp = fopen(filename, "rb")) == NULL) {
+ if ((pyc_fp = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "python: Can't reopen .pyc file\n");
goto done;
}
/* Turn on optimization if a .pyo file is given */
if (strcmp(ext, ".pyo") == 0)
Py_OptimizeFlag = 1;
- v = run_pyc_file(fp, filename, d, d, flags);
+
+ if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
+ fprintf(stderr, "python: failed to set __main__.__loader__\n");
+ ret = -1;
+ fclose(pyc_fp);
+ goto done;
+ }
+ v = run_pyc_file(pyc_fp, filename, d, d, flags);
+ fclose(pyc_fp);
} else {
+ /* When running from stdin, leave __main__.__loader__ alone */
+ if (strcmp(filename, "<stdin>") != 0 &&
+ set_main_loader(d, filename, "SourceFileLoader") < 0) {
+ fprintf(stderr, "python: failed to set __main__.__loader__\n");
+ ret = -1;
+ goto done;
+ }
v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
closeit, flags);
}
@@ -1336,20 +1485,20 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
{
long hold;
PyObject *v;
-
- /* old style errors */
- if (PyTuple_Check(err))
- return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
- lineno, offset, text);
+ _Py_IDENTIFIER(msg);
+ _Py_IDENTIFIER(filename);
+ _Py_IDENTIFIER(lineno);
+ _Py_IDENTIFIER(offset);
+ _Py_IDENTIFIER(text);
*message = NULL;
/* new style errors. `err' is an instance */
- *message = PyObject_GetAttrString(err, "msg");
+ *message = _PyObject_GetAttrId(err, &PyId_msg);
if (!*message)
goto finally;
- v = PyObject_GetAttrString(err, "filename");
+ v = _PyObject_GetAttrId(err, &PyId_filename);
if (!v)
goto finally;
if (v == Py_None) {
@@ -1363,7 +1512,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
goto finally;
}
- v = PyObject_GetAttrString(err, "lineno");
+ v = _PyObject_GetAttrId(err, &PyId_lineno);
if (!v)
goto finally;
hold = PyLong_AsLong(v);
@@ -1372,7 +1521,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
goto finally;
*lineno = (int)hold;
- v = PyObject_GetAttrString(err, "offset");
+ v = _PyObject_GetAttrId(err, &PyId_offset);
if (!v)
goto finally;
if (v == Py_None) {
@@ -1386,7 +1535,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
*offset = (int)hold;
}
- v = PyObject_GetAttrString(err, "text");
+ v = _PyObject_GetAttrId(err, &PyId_text);
if (!v)
goto finally;
if (v == Py_None) {
@@ -1460,7 +1609,8 @@ handle_system_exit(void)
goto done;
if (PyExceptionInstance_Check(value)) {
/* The error code should be in the `code' attribute. */
- PyObject *code = PyObject_GetAttrString(value, "code");
+ _Py_IDENTIFIER(code);
+ PyObject *code = _PyObject_GetAttrId(value, &PyId_code);
if (code) {
Py_DECREF(value);
value = code;
@@ -1567,6 +1717,7 @@ print_exception(PyObject *f, PyObject *value)
{
int err = 0;
PyObject *type, *tb;
+ _Py_IDENTIFIER(print_file_and_line);
if (!PyExceptionInstance_Check(value)) {
PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
@@ -1582,7 +1733,7 @@ print_exception(PyObject *f, PyObject *value)
if (tb && tb != Py_None)
err = PyTraceBack_Print(tb, f);
if (err == 0 &&
- PyObject_HasAttrString(value, "print_file_and_line"))
+ _PyObject_HasAttrId(value, &PyId_print_file_and_line))
{
PyObject *message;
const char *filename, *text;
@@ -1617,6 +1768,7 @@ print_exception(PyObject *f, PyObject *value)
else {
PyObject* moduleName;
char* className;
+ _Py_IDENTIFIER(__module__);
assert(PyExceptionClass_Check(type));
className = PyExceptionClass_Name(type);
if (className != NULL) {
@@ -1625,10 +1777,10 @@ print_exception(PyObject *f, PyObject *value)
className = dot+1;
}
- moduleName = PyObject_GetAttrString(type, "__module__");
+ moduleName = _PyObject_GetAttrId(type, &PyId___module__);
if (moduleName == NULL || !PyUnicode_Check(moduleName))
{
- Py_DECREF(moduleName);
+ Py_XDECREF(moduleName);
err = PyFile_WriteString("<unknown>", f);
}
else {
@@ -1655,7 +1807,7 @@ print_exception(PyObject *f, PyObject *value)
if (s == NULL)
err = -1;
else if (!PyUnicode_Check(s) ||
- PyUnicode_GetSize(s) != 0)
+ PyUnicode_GetLength(s) != 0)
err = PyFile_WriteString(": ", f);
if (err == 0)
err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
@@ -1703,7 +1855,8 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
cause_message, f);
}
}
- else if (context) {
+ else if (context &&
+ !((PyBaseExceptionObject *)value)->suppress_context) {
res = PySet_Contains(seen, context);
if (res == -1)
PyErr_Clear();
@@ -1792,13 +1945,14 @@ flush_io(void)
{
PyObject *f, *r;
PyObject *type, *value, *traceback;
+ _Py_IDENTIFIER(flush);
/* Save the current exception */
PyErr_Fetch(&type, &value, &traceback);
f = PySys_GetObject("stderr");
if (f != NULL) {
- r = PyObject_CallMethod(f, "flush", "");
+ r = _PyObject_CallMethodId(f, &PyId_flush, "");
if (r)
Py_DECREF(r);
else
@@ -1806,7 +1960,7 @@ flush_io(void)
}
f = PySys_GetObject("stdout");
if (f != NULL) {
- r = PyObject_CallMethod(f, "flush", "");
+ r = _PyObject_CallMethodId(f, &PyId_flush, "");
if (r)
Py_DECREF(r);
else
@@ -1845,9 +1999,10 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
"Bad magic number in .pyc file");
return NULL;
}
+ /* Skip mtime and size */
+ (void) PyMarshal_ReadLongFromFile(fp);
(void) PyMarshal_ReadLongFromFile(fp);
v = PyMarshal_ReadLastObjectFromFile(fp);
- fclose(fp);
if (v == NULL || !PyCode_Check(v)) {
Py_XDECREF(v);
PyErr_SetString(PyExc_RuntimeError,
@@ -1937,12 +2092,13 @@ PyParser_ASTFromString(const char *s, const char *filename, int start,
flags->cf_flags |= iflags & PyCF_MASK;
mod = PyAST_FromNode(n, flags, filename, arena);
PyNode_Free(n);
- return mod;
}
else {
err_input(&err);
- return NULL;
+ mod = NULL;
}
+ err_free(&err);
+ return mod;
}
mod_ty
@@ -1967,14 +2123,15 @@ PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
flags->cf_flags |= iflags & PyCF_MASK;
mod = PyAST_FromNode(n, flags, filename, arena);
PyNode_Free(n);
- return mod;
}
else {
err_input(&err);
if (errcode)
*errcode = err.error;
- return NULL;
+ mod = NULL;
}
+ err_free(&err);
+ return mod;
}
/* Simplified interface to parsefile -- return node or set exception */
@@ -1988,6 +2145,7 @@ PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int fla
start, NULL, NULL, &err, flags);
if (n == NULL)
err_input(&err);
+ err_free(&err);
return n;
}
@@ -2002,6 +2160,7 @@ PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
start, &err, flags);
if (n == NULL)
err_input(&err);
+ err_free(&err);
return n;
}
@@ -2014,6 +2173,7 @@ PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
&_PyParser_Grammar, start, &err, flags);
if (n == NULL)
err_input(&err);
+ err_free(&err);
return n;
}
@@ -2027,11 +2187,23 @@ PyParser_SimpleParseStringFilename(const char *str, const char *filename, int st
even parser modules. */
void
+PyParser_ClearError(perrdetail *err)
+{
+ err_free(err);
+}
+
+void
PyParser_SetError(perrdetail *err)
{
err_input(err);
}
+static void
+err_free(perrdetail *err)
+{
+ Py_CLEAR(err->filename);
+}
+
/* Set the error appropriate to the given input error code (see errcode.h) */
static void
@@ -2039,7 +2211,6 @@ err_input(perrdetail *err)
{
PyObject *v, *w, *errtype, *errtext;
PyObject *msg_obj = NULL;
- PyObject *filename;
char *msg = NULL;
errtype = PyExc_SyntaxError;
@@ -2111,6 +2282,9 @@ err_input(perrdetail *err)
case E_IDENTIFIER:
msg = "invalid character in identifier";
break;
+ case E_BADSINGLE:
+ msg = "multiple statements found while compiling a single statement";
+ break;
default:
fprintf(stderr, "error=%d\n", err->error);
msg = "unknown parsing error";
@@ -2125,17 +2299,8 @@ err_input(perrdetail *err)
errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),
"replace");
}
- if (err->filename != NULL)
- filename = PyUnicode_DecodeFSDefault(err->filename);
- else {
- Py_INCREF(Py_None);
- filename = Py_None;
- }
- if (filename != NULL)
- v = Py_BuildValue("(NiiN)", filename,
- err->lineno, err->offset, errtext);
- else
- v = NULL;
+ v = Py_BuildValue("(OiiN)", err->filename,
+ err->lineno, err->offset, errtext);
if (v != NULL) {
if (msg_obj)
w = Py_BuildValue("(OO)", msg_obj, v);
@@ -2159,11 +2324,24 @@ cleanup:
void
Py_FatalError(const char *msg)
{
+ const int fd = fileno(stderr);
+ PyThreadState *tstate;
+
fprintf(stderr, "Fatal Python error: %s\n", msg);
fflush(stderr); /* it helps in Windows debug build */
if (PyErr_Occurred()) {
PyErr_PrintEx(0);
}
+ else {
+ tstate = _Py_atomic_load_relaxed(&_PyThreadState_Current);
+ if (tstate != NULL) {
+ fputc('\n', stderr);
+ fflush(stderr);
+ _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
+ }
+ _PyFaulthandler_Fini();
+ }
+
#ifdef MS_WINDOWS
{
size_t len = strlen(msg);
@@ -2218,6 +2396,7 @@ static void
wait_for_thread_shutdown(void)
{
#ifdef WITH_THREAD
+ _Py_IDENTIFIER(_shutdown);
PyObject *result;
PyThreadState *tstate = PyThreadState_GET();
PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
@@ -2227,7 +2406,7 @@ wait_for_thread_shutdown(void)
PyErr_Clear();
return;
}
- result = PyObject_CallMethod(threading, "_shutdown", "");
+ result = _PyObject_CallMethodId(threading, &PyId__shutdown, "");
if (result == NULL) {
PyErr_WriteUnraisable(threading);
}
diff --git a/Python/pytime.c b/Python/pytime.c
index 6fb7695..beeab87 100644
--- a/Python/pytime.c
+++ b/Python/pytime.c
@@ -1,7 +1,9 @@
#include "Python.h"
+#ifdef MS_WINDOWS
+#include <windows.h>
+#endif
-#ifdef __APPLE__
-#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
+#if defined(__APPLE__) && defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)
/*
* _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter
* might fail on some platforms. This fallback is unwanted on MacOSX because
@@ -10,18 +12,41 @@
*/
# undef HAVE_FTIME
#endif
-#endif
-#ifdef HAVE_FTIME
+#if defined(HAVE_FTIME) && !defined(MS_WINDOWS)
#include <sys/timeb.h>
-#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
extern int ftime(struct timeb *);
-#endif /* MS_WINDOWS */
-#endif /* HAVE_FTIME */
+#endif
-void
-_PyTime_gettimeofday(_PyTime_timeval *tp)
+static void
+pygettimeofday(_PyTime_timeval *tp, _Py_clock_info_t *info)
{
+#ifdef MS_WINDOWS
+ FILETIME system_time;
+ ULARGE_INTEGER large;
+ ULONGLONG microseconds;
+
+ GetSystemTimeAsFileTime(&system_time);
+ large.u.LowPart = system_time.dwLowDateTime;
+ large.u.HighPart = system_time.dwHighDateTime;
+ /* 11,644,473,600,000,000: number of microseconds between
+ the 1st january 1601 and the 1st january 1970 (369 years + 89 leap
+ days). */
+ microseconds = large.QuadPart / 10 - 11644473600000000;
+ tp->tv_sec = microseconds / 1000000;
+ tp->tv_usec = microseconds % 1000000;
+ if (info) {
+ DWORD timeAdjustment, timeIncrement;
+ BOOL isTimeAdjustmentDisabled;
+
+ info->implementation = "GetSystemTimeAsFileTime()";
+ info->monotonic = 0;
+ (void) GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
+ &isTimeAdjustmentDisabled);
+ info->resolution = timeIncrement * 1e-7;
+ info->adjustable = 1;
+ }
+#else
/* There are three ways to get the time:
(1) gettimeofday() -- resolution in microseconds
(2) ftime() -- resolution in milliseconds
@@ -30,27 +55,173 @@ _PyTime_gettimeofday(_PyTime_timeval *tp)
Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
fail, so we fall back on ftime() or time().
Note: clock resolution does not imply clock accuracy! */
+
#ifdef HAVE_GETTIMEOFDAY
+ int err;
#ifdef GETTIMEOFDAY_NO_TZ
- if (gettimeofday(tp) == 0)
- return;
-#else /* !GETTIMEOFDAY_NO_TZ */
- if (gettimeofday(tp, (struct timezone *)NULL) == 0)
+ err = gettimeofday(tp);
+#else
+ err = gettimeofday(tp, (struct timezone *)NULL);
+#endif
+ if (err == 0) {
+ if (info) {
+ info->implementation = "gettimeofday()";
+ info->resolution = 1e-6;
+ info->monotonic = 0;
+ info->adjustable = 1;
+ }
return;
-#endif /* !GETTIMEOFDAY_NO_TZ */
-#endif /* !HAVE_GETTIMEOFDAY */
+ }
+#endif /* HAVE_GETTIMEOFDAY */
+
#if defined(HAVE_FTIME)
{
struct timeb t;
ftime(&t);
tp->tv_sec = t.time;
tp->tv_usec = t.millitm * 1000;
+ if (info) {
+ info->implementation = "ftime()";
+ info->resolution = 1e-3;
+ info->monotonic = 0;
+ info->adjustable = 1;
+ }
}
#else /* !HAVE_FTIME */
tp->tv_sec = time(NULL);
tp->tv_usec = 0;
+ if (info) {
+ info->implementation = "time()";
+ info->resolution = 1.0;
+ info->monotonic = 0;
+ info->adjustable = 1;
+ }
#endif /* !HAVE_FTIME */
- return;
+
+#endif /* MS_WINDOWS */
+}
+
+void
+_PyTime_gettimeofday(_PyTime_timeval *tp)
+{
+ pygettimeofday(tp, NULL);
+}
+
+void
+_PyTime_gettimeofday_info(_PyTime_timeval *tp, _Py_clock_info_t *info)
+{
+ pygettimeofday(tp, info);
+}
+
+static void
+error_time_t_overflow(void)
+{
+ PyErr_SetString(PyExc_OverflowError,
+ "timestamp out of range for platform time_t");
+}
+
+time_t
+_PyLong_AsTime_t(PyObject *obj)
+{
+#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
+ PY_LONG_LONG val;
+ val = PyLong_AsLongLong(obj);
+#else
+ long val;
+ assert(sizeof(time_t) <= sizeof(long));
+ val = PyLong_AsLong(obj);
+#endif
+ if (val == -1 && PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError))
+ error_time_t_overflow();
+ return -1;
+ }
+ return (time_t)val;
+}
+
+PyObject *
+_PyLong_FromTime_t(time_t t)
+{
+#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
+ return PyLong_FromLongLong((PY_LONG_LONG)t);
+#else
+ assert(sizeof(time_t) <= sizeof(long));
+ return PyLong_FromLong((long)t);
+#endif
+}
+
+static int
+_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
+ double denominator)
+{
+ assert(denominator <= LONG_MAX);
+ if (PyFloat_Check(obj)) {
+ double d, intpart, err;
+ /* volatile avoids unsafe optimization on float enabled by gcc -O3 */
+ volatile double floatpart;
+
+ d = PyFloat_AsDouble(obj);
+ floatpart = modf(d, &intpart);
+ if (floatpart < 0) {
+ floatpart = 1.0 + floatpart;
+ intpart -= 1.0;
+ }
+
+ *sec = (time_t)intpart;
+ err = intpart - (double)*sec;
+ if (err <= -1.0 || err >= 1.0) {
+ error_time_t_overflow();
+ return -1;
+ }
+
+ floatpart *= denominator;
+ *numerator = (long)floatpart;
+ return 0;
+ }
+ else {
+ *sec = _PyLong_AsTime_t(obj);
+ if (*sec == (time_t)-1 && PyErr_Occurred())
+ return -1;
+ *numerator = 0;
+ return 0;
+ }
+}
+
+int
+_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec)
+{
+ if (PyFloat_Check(obj)) {
+ double d, intpart, err;
+
+ d = PyFloat_AsDouble(obj);
+ (void)modf(d, &intpart);
+
+ *sec = (time_t)intpart;
+ err = intpart - (double)*sec;
+ if (err <= -1.0 || err >= 1.0) {
+ error_time_t_overflow();
+ return -1;
+ }
+ return 0;
+ }
+ else {
+ *sec = _PyLong_AsTime_t(obj);
+ if (*sec == (time_t)-1 && PyErr_Occurred())
+ return -1;
+ return 0;
+ }
+}
+
+int
+_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec)
+{
+ return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9);
+}
+
+int
+_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec)
+{
+ return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6);
}
void
diff --git a/Python/random.c b/Python/random.c
index 825260f..53518c2 100644
--- a/Python/random.c
+++ b/Python/random.c
@@ -258,17 +258,6 @@ _PyRandom_Init(void)
_Py_HashSecret_Initialized = 1;
/*
- By default, hash randomization is disabled, and only
- enabled if PYTHONHASHSEED is set to non-empty or if
- "-R" is provided at the command line:
- */
- if (!Py_HashRandomizationFlag) {
- /* Disable the randomized hash: */
- memset(secret, 0, secret_size);
- return;
- }
-
- /*
Hash randomization is enabled. Generate a per-process secret,
using PYTHONHASHSEED if provided.
*/
diff --git a/Python/symtable.c b/Python/symtable.c
index 35fc6e1..9dde908 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -19,10 +19,6 @@
#define IMPORT_STAR_WARNING "import * only allowed at module level"
-#define RETURN_VAL_IN_GENERATOR \
- "'return' with argument inside generator"
-
-
static PySTEntryObject *
ste_new(struct symtable *st, identifier name, _Py_block_ty block,
void *key, int lineno, int col_offset)
@@ -187,6 +183,7 @@ static int symtable_visit_params(struct symtable *st, asdl_seq *args);
static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
static int symtable_implicit_arg(struct symtable *st, int pos);
static int symtable_visit_annotations(struct symtable *st, stmt_ty s);
+static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
static identifier top = NULL, lambda = NULL, genexpr = NULL,
@@ -223,17 +220,40 @@ symtable_new(void)
return NULL;
}
+/* When compiling the use of C stack is probably going to be a lot
+ lighter than when executing Python code but still can overflow
+ and causing a Python crash if not checked (e.g. eval("()"*300000)).
+ Using the current recursion limit for the compiler seems too
+ restrictive (it caused at least one test to fail) so a factor is
+ used to allow deeper recursion when compiling an expression.
+
+ Using a scaling factor means this should automatically adjust when
+ the recursion limit is adjusted for small or large C stack allocations.
+*/
+#define COMPILER_STACK_FRAME_SCALE 3
+
struct symtable *
PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
{
struct symtable *st = symtable_new();
asdl_seq *seq;
int i;
+ PyThreadState *tstate;
if (st == NULL)
return st;
st->st_filename = filename;
st->st_future = future;
+
+ /* Setup recursion depth check counters */
+ tstate = PyThreadState_GET();
+ if (!tstate) {
+ PySymtable_Free(st);
+ return NULL;
+ }
+ st->recursion_depth = tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE;
+ st->recursion_limit = Py_GetRecursionLimit() * COMPILER_STACK_FRAME_SCALE;
+
/* Make the initial symbol information gathering pass */
if (!GET_IDENTIFIER(top) ||
!symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
@@ -752,7 +772,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
goto error;
}
- /* Recursively call analyze_block() on each child block.
+ /* Recursively call analyze_child_block() on each child block.
newbound, newglobal now contain the names visible in
nested blocks. The free variables in the children will
@@ -895,18 +915,15 @@ symtable_warn(struct symtable *st, char *msg, int lineno)
static int
symtable_exit_block(struct symtable *st, void *ast)
{
- Py_ssize_t end;
-
- Py_CLEAR(st->st_cur);
- end = PyList_GET_SIZE(st->st_stack) - 1;
- if (end >= 0) {
- st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
- end);
- if (st->st_cur == NULL)
- return 0;
- Py_INCREF(st->st_cur);
- if (PySequence_DelItem(st->st_stack, end) < 0)
+ Py_ssize_t size;
+
+ st->st_cur = NULL;
+ size = PyList_GET_SIZE(st->st_stack);
+ if (size) {
+ if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
return 0;
+ if (--size)
+ st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
}
return 1;
}
@@ -915,23 +932,23 @@ static int
symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
void *ast, int lineno, int col_offset)
{
- PySTEntryObject *prev = NULL;
+ PySTEntryObject *prev = NULL, *ste;
- if (st->st_cur) {
- prev = st->st_cur;
- if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
- return 0;
- }
- Py_DECREF(st->st_cur);
- }
- st->st_cur = ste_new(st, name, block, ast, lineno, col_offset);
- if (st->st_cur == NULL)
+ ste = ste_new(st, name, block, ast, lineno, col_offset);
+ if (ste == NULL)
+ return 0;
+ if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
+ Py_DECREF(ste);
return 0;
+ }
+ prev = st->st_cur;
+ /* The entry is owned by the stack. Borrow it for st_cur. */
+ Py_DECREF(ste);
+ st->st_cur = ste;
if (block == ModuleBlock)
st->st_global = st->st_cur->ste_symbols;
if (prev) {
- if (PyList_Append(prev->ste_children,
- (PyObject *)st->st_cur) < 0) {
+ if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
return 0;
}
}
@@ -1019,17 +1036,17 @@ error:
VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
useful if the first node in the sequence requires special treatment.
+
+ VISIT_QUIT macro returns the specified value exiting from the function but
+ first adjusts current recursion counter depth.
*/
+#define VISIT_QUIT(ST, X) \
+ return --(ST)->recursion_depth,(X)
+
#define VISIT(ST, TYPE, V) \
if (!symtable_visit_ ## TYPE((ST), (V))) \
- return 0;
-
-#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
- if (!symtable_visit_ ## TYPE((ST), (V))) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- }
+ VISIT_QUIT((ST), 0);
#define VISIT_SEQ(ST, TYPE, SEQ) { \
int i; \
@@ -1037,19 +1054,7 @@ error:
for (i = 0; i < asdl_seq_LEN(seq); i++) { \
TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
if (!symtable_visit_ ## TYPE((ST), elt)) \
- return 0; \
- } \
-}
-
-#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
- int i; \
- asdl_seq *seq = (SEQ); /* avoid variable capture */ \
- for (i = 0; i < asdl_seq_LEN(seq); i++) { \
- TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
- if (!symtable_visit_ ## TYPE((ST), elt)) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- } \
+ VISIT_QUIT((ST), 0); \
} \
}
@@ -1059,19 +1064,7 @@ error:
for (i = (START); i < asdl_seq_LEN(seq); i++) { \
TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
if (!symtable_visit_ ## TYPE((ST), elt)) \
- return 0; \
- } \
-}
-
-#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
- int i; \
- asdl_seq *seq = (SEQ); /* avoid variable capture */ \
- for (i = (START); i < asdl_seq_LEN(seq); i++) { \
- TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
- if (!symtable_visit_ ## TYPE((ST), elt)) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- } \
+ VISIT_QUIT((ST), 0); \
} \
}
@@ -1082,7 +1075,7 @@ error:
expr_ty elt = (expr_ty)asdl_seq_GET(seq, i); \
if (!elt) continue; /* can be NULL */ \
if (!symtable_visit_expr((ST), elt)) \
- return 0; \
+ VISIT_QUIT((ST), 0); \
} \
}
@@ -1107,32 +1100,37 @@ symtable_new_tmpname(struct symtable *st)
static int
symtable_visit_stmt(struct symtable *st, stmt_ty s)
{
+ if (++st->recursion_depth > st->recursion_limit) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "maximum recursion depth exceeded during compilation");
+ VISIT_QUIT(st, 0);
+ }
switch (s->kind) {
case FunctionDef_kind:
if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
- return 0;
+ VISIT_QUIT(st, 0);
if (s->v.FunctionDef.args->defaults)
VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
if (s->v.FunctionDef.args->kw_defaults)
VISIT_KWONLYDEFAULTS(st,
s->v.FunctionDef.args->kw_defaults);
if (!symtable_visit_annotations(st, s))
- return 0;
+ VISIT_QUIT(st, 0);
if (s->v.FunctionDef.decorator_list)
VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
if (!symtable_enter_block(st, s->v.FunctionDef.name,
FunctionBlock, (void *)s, s->lineno,
s->col_offset))
- return 0;
- VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
- VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
+ VISIT_QUIT(st, 0);
+ VISIT(st, arguments, s->v.FunctionDef.args);
+ VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
if (!symtable_exit_block(st, s))
- return 0;
+ VISIT_QUIT(st, 0);
break;
case ClassDef_kind: {
PyObject *tmp;
if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
- return 0;
+ VISIT_QUIT(st, 0);
VISIT_SEQ(st, expr, s->v.ClassDef.bases);
VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
if (s->v.ClassDef.starargs)
@@ -1143,34 +1141,26 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
(void *)s, s->lineno, s->col_offset))
- return 0;
+ VISIT_QUIT(st, 0);
if (!GET_IDENTIFIER(__class__) ||
!symtable_add_def(st, __class__, DEF_LOCAL) ||
!GET_IDENTIFIER(__locals__) ||
!symtable_add_def(st, __locals__, DEF_PARAM)) {
symtable_exit_block(st, s);
- return 0;
+ VISIT_QUIT(st, 0);
}
tmp = st->st_private;
st->st_private = s->v.ClassDef.name;
- VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
+ VISIT_SEQ(st, stmt, s->v.ClassDef.body);
st->st_private = tmp;
if (!symtable_exit_block(st, s))
- return 0;
+ VISIT_QUIT(st, 0);
break;
}
case Return_kind:
if (s->v.Return.value) {
VISIT(st, expr, s->v.Return.value);
st->st_cur->ste_returns_value = 1;
- if (st->st_cur->ste_generator) {
- PyErr_SetString(PyExc_SyntaxError,
- RETURN_VAL_IN_GENERATOR);
- PyErr_SyntaxLocationEx(st->st_filename,
- s->lineno,
- s->col_offset);
- return 0;
- }
}
break;
case Delete_kind:
@@ -1207,19 +1197,16 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
case Raise_kind:
if (s->v.Raise.exc) {
VISIT(st, expr, s->v.Raise.exc);
- if (s->v.Raise.cause) {
- VISIT(st, expr, s->v.Raise.cause);
- }
+ if (s->v.Raise.cause) {
+ VISIT(st, expr, s->v.Raise.cause);
+ }
}
break;
- case TryExcept_kind:
- VISIT_SEQ(st, stmt, s->v.TryExcept.body);
- VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
- VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
- break;
- case TryFinally_kind:
- VISIT_SEQ(st, stmt, s->v.TryFinally.body);
- VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
+ case Try_kind:
+ VISIT_SEQ(st, stmt, s->v.Try.body);
+ VISIT_SEQ(st, stmt, s->v.Try.orelse);
+ VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
+ VISIT_SEQ(st, stmt, s->v.Try.finalbody);
break;
case Assert_kind:
VISIT(st, expr, s->v.Assert.test);
@@ -1249,12 +1236,14 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
asdl_seq *seq = s->v.Global.names;
for (i = 0; i < asdl_seq_LEN(seq); i++) {
identifier name = (identifier)asdl_seq_GET(seq, i);
- char *c_name = _PyUnicode_AsString(name);
long cur = symtable_lookup(st, name);
if (cur < 0)
- return 0;
+ VISIT_QUIT(st, 0);
if (cur & (DEF_LOCAL | USE)) {
char buf[256];
+ char *c_name = _PyUnicode_AsString(name);
+ if (!c_name)
+ return 0;
if (cur & DEF_LOCAL)
PyOS_snprintf(buf, sizeof(buf),
GLOBAL_AFTER_ASSIGN,
@@ -1264,10 +1253,10 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
GLOBAL_AFTER_USE,
c_name);
if (!symtable_warn(st, buf, s->lineno))
- return 0;
+ VISIT_QUIT(st, 0);
}
if (!symtable_add_def(st, name, DEF_GLOBAL))
- return 0;
+ VISIT_QUIT(st, 0);
}
break;
}
@@ -1276,12 +1265,14 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
asdl_seq *seq = s->v.Nonlocal.names;
for (i = 0; i < asdl_seq_LEN(seq); i++) {
identifier name = (identifier)asdl_seq_GET(seq, i);
- char *c_name = _PyUnicode_AsString(name);
long cur = symtable_lookup(st, name);
if (cur < 0)
- return 0;
+ VISIT_QUIT(st, 0);
if (cur & (DEF_LOCAL | USE)) {
char buf[256];
+ char *c_name = _PyUnicode_AsString(name);
+ if (!c_name)
+ return 0;
if (cur & DEF_LOCAL)
PyOS_snprintf(buf, sizeof(buf),
NONLOCAL_AFTER_ASSIGN,
@@ -1291,10 +1282,10 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
NONLOCAL_AFTER_USE,
c_name);
if (!symtable_warn(st, buf, s->lineno))
- return 0;
+ VISIT_QUIT(st, 0);
}
if (!symtable_add_def(st, name, DEF_NONLOCAL))
- return 0;
+ VISIT_QUIT(st, 0);
}
break;
}
@@ -1307,19 +1298,21 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
/* nothing to do here */
break;
case With_kind:
- VISIT(st, expr, s->v.With.context_expr);
- if (s->v.With.optional_vars) {
- VISIT(st, expr, s->v.With.optional_vars);
- }
+ VISIT_SEQ(st, withitem, s->v.With.items);
VISIT_SEQ(st, stmt, s->v.With.body);
break;
}
- return 1;
+ VISIT_QUIT(st, 1);
}
static int
symtable_visit_expr(struct symtable *st, expr_ty e)
{
+ if (++st->recursion_depth > st->recursion_limit) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "maximum recursion depth exceeded during compilation");
+ VISIT_QUIT(st, 0);
+ }
switch (e->kind) {
case BoolOp_kind:
VISIT_SEQ(st, expr, e->v.BoolOp.values);
@@ -1333,7 +1326,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
break;
case Lambda_kind: {
if (!GET_IDENTIFIER(lambda))
- return 0;
+ VISIT_QUIT(st, 0);
if (e->v.Lambda.args->defaults)
VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
if (e->v.Lambda.args->kw_defaults)
@@ -1342,11 +1335,11 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
if (!symtable_enter_block(st, lambda,
FunctionBlock, (void *)e, e->lineno,
e->col_offset))
- return 0;
- VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
- VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
+ VISIT_QUIT(st, 0);
+ VISIT(st, arguments, e->v.Lambda.args);
+ VISIT(st, expr, e->v.Lambda.body);
if (!symtable_exit_block(st, (void *)e))
- return 0;
+ VISIT_QUIT(st, 0);
break;
}
case IfExp_kind:
@@ -1363,32 +1356,29 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
break;
case GeneratorExp_kind:
if (!symtable_visit_genexp(st, e))
- return 0;
+ VISIT_QUIT(st, 0);
break;
case ListComp_kind:
if (!symtable_visit_listcomp(st, e))
- return 0;
+ VISIT_QUIT(st, 0);
break;
case SetComp_kind:
if (!symtable_visit_setcomp(st, e))
- return 0;
+ VISIT_QUIT(st, 0);
break;
case DictComp_kind:
if (!symtable_visit_dictcomp(st, e))
- return 0;
+ VISIT_QUIT(st, 0);
break;
case Yield_kind:
- if (e->v.Yield.value)
- VISIT(st, expr, e->v.Yield.value);
+ case YieldFrom_kind: {
+ expr_ty value;
+ value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value;
+ if (value)
+ VISIT(st, expr, value);
st->st_cur->ste_generator = 1;
- if (st->st_cur->ste_returns_value) {
- PyErr_SetString(PyExc_SyntaxError,
- RETURN_VAL_IN_GENERATOR);
- PyErr_SyntaxLocationEx(st->st_filename,
- e->lineno, e->col_offset);
- return 0;
- }
break;
+ }
case Compare_kind:
VISIT(st, expr, e->v.Compare.left);
VISIT_SEQ(st, expr, e->v.Compare.comparators);
@@ -1422,14 +1412,14 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
case Name_kind:
if (!symtable_add_def(st, e->v.Name.id,
e->v.Name.ctx == Load ? USE : DEF_LOCAL))
- return 0;
+ VISIT_QUIT(st, 0);
/* Special-case super: it counts as a use of __class__ */
if (e->v.Name.ctx == Load &&
st->st_cur->ste_type == FunctionBlock &&
!PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) {
if (!GET_IDENTIFIER(__class__) ||
!symtable_add_def(st, __class__, USE))
- return 0;
+ VISIT_QUIT(st, 0);
}
break;
/* child nodes of List and Tuple will have expr_context set */
@@ -1440,7 +1430,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
VISIT_SEQ(st, expr, e->v.Tuple.elts);
break;
}
- return 1;
+ VISIT_QUIT(st, 1);
}
static int
@@ -1545,6 +1535,16 @@ symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
return 1;
}
+static int
+symtable_visit_withitem(struct symtable *st, withitem_ty item)
+{
+ VISIT(st, expr, item->context_expr);
+ if (item->optional_vars) {
+ VISIT(st, expr, item->optional_vars);
+ }
+ return 1;
+}
+
static int
symtable_visit_alias(struct symtable *st, alias_ty a)
@@ -1555,10 +1555,10 @@ symtable_visit_alias(struct symtable *st, alias_ty a)
*/
PyObject *store_name;
PyObject *name = (a->asname == NULL) ? a->name : a->asname;
- const Py_UNICODE *base = PyUnicode_AS_UNICODE(name);
- Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
- if (dot) {
- store_name = PyUnicode_FromUnicode(base, dot - base);
+ Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot != -1) {
+ store_name = PyUnicode_Substring(name, 0, dot);
if (!store_name)
return 0;
}
@@ -1655,13 +1655,12 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
symtable_exit_block(st, (void *)e);
return 0;
}
- VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
- VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
- VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
- generators, 1, (void*)e);
+ VISIT(st, expr, outermost->target);
+ VISIT_SEQ(st, expr, outermost->ifs);
+ VISIT_SEQ_TAIL(st, comprehension, generators, 1);
if (value)
- VISIT_IN_BLOCK(st, expr, value, (void*)e);
- VISIT_IN_BLOCK(st, expr, elt, (void*)e);
+ VISIT(st, expr, value);
+ VISIT(st, expr, elt);
return symtable_exit_block(st, (void *)e);
}
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index c4f27d0..20bfa55 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -17,6 +17,7 @@ Data members:
#include "Python.h"
#include "code.h"
#include "frameobject.h"
+#include "pythread.h"
#include "osdefs.h"
@@ -78,8 +79,10 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)
PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
char *stdout_encoding_str;
int ret;
+ _Py_IDENTIFIER(encoding);
+ _Py_IDENTIFIER(buffer);
- stdout_encoding = PyObject_GetAttrString(outf, "encoding");
+ stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
if (stdout_encoding == NULL)
goto error;
stdout_encoding_str = _PyUnicode_AsString(stdout_encoding);
@@ -96,9 +99,10 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)
if (encoded == NULL)
goto error;
- buffer = PyObject_GetAttrString(outf, "buffer");
+ buffer = _PyObject_GetAttrId(outf, &PyId_buffer);
if (buffer) {
- result = PyObject_CallMethod(buffer, "write", "(O)", encoded);
+ _Py_IDENTIFIER(write);
+ result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded);
Py_DECREF(buffer);
Py_DECREF(encoded);
if (result == NULL)
@@ -135,6 +139,7 @@ sys_displayhook(PyObject *self, PyObject *o)
PyObject *modules = interp->modules;
PyObject *builtins = PyDict_GetItemString(modules, "builtins");
int err;
+ _Py_IDENTIFIER(_);
if (builtins == NULL) {
PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
@@ -148,7 +153,7 @@ sys_displayhook(PyObject *self, PyObject *o)
Py_INCREF(Py_None);
return Py_None;
}
- if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
+ if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
return NULL;
outf = PySys_GetObject("stdout");
if (outf == NULL || outf == Py_None) {
@@ -170,7 +175,7 @@ sys_displayhook(PyObject *self, PyObject *o)
}
if (PyFile_WriteString("\n", outf) != 0)
return NULL;
- if (PyObject_SetAttrString(builtins, "_", o) != 0)
+ if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
return NULL;
Py_INCREF(Py_None);
return Py_None;
@@ -770,9 +775,7 @@ interpreter loads extension modules. Among other things, this will enable\n\
a lazy resolving of symbols when importing a module, if called as\n\
sys.setdlopenflags(0). To share symbols across extension modules, call as\n\
sys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\
-can be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\
-is not available, it can be generated from /usr/include/dlfcn.h using the\n\
-h2py script.");
+can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY).");
static PyObject *
sys_getdlopenflags(PyObject *self, PyObject *args)
@@ -811,10 +814,11 @@ static PyObject *
sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject *res = NULL;
- static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL;
+ static PyObject *gc_head_size = NULL;
static char *kwlist[] = {"object", "default", 0};
PyObject *o, *dflt = NULL;
PyObject *method;
+ _Py_IDENTIFIER(__sizeof__);
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
kwlist, &o, &dflt))
@@ -831,8 +835,7 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
if (PyType_Ready(Py_TYPE(o)) < 0)
return NULL;
- method = _PyObject_LookupSpecial(o, "__sizeof__",
- &str__sizeof__);
+ method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
if (method == NULL) {
if (!PyErr_Occurred())
PyErr_Format(PyExc_TypeError,
@@ -994,6 +997,27 @@ a 11-tuple where the entries in the tuple are counts of:\n\
extern "C" {
#endif
+static PyObject *
+sys_debugmallocstats(PyObject *self, PyObject *args)
+{
+#ifdef WITH_PYMALLOC
+ _PyObject_DebugMallocStats(stderr);
+ fputc('\n', stderr);
+#endif
+ _PyObject_DebugTypeStats(stderr);
+
+ Py_RETURN_NONE;
+}
+PyDoc_STRVAR(debugmallocstats_doc,
+"_debugmallocstats()\n\
+\n\
+Print summary info to stderr about the state of\n\
+pymalloc's structures.\n\
+\n\
+In Py_DEBUG mode, also perform some expensive internal consistency\n\
+checks.\n\
+");
+
#ifdef Py_TRACE_REFS
/* Defined in objects.c because it uses static globals if that file */
extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
@@ -1090,6 +1114,8 @@ static PyMethodDef sys_methods[] = {
{"settrace", sys_settrace, METH_O, settrace_doc},
{"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
{"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
+ {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS,
+ debugmallocstats_doc},
{NULL, NULL} /* sentinel */
};
@@ -1177,7 +1203,6 @@ PySys_AddXOption(const wchar_t *s)
PyObject *opts;
PyObject *name = NULL, *value = NULL;
const wchar_t *name_end;
- int r;
opts = get_xoptions();
if (opts == NULL)
@@ -1195,7 +1220,7 @@ PySys_AddXOption(const wchar_t *s)
}
if (name == NULL || value == NULL)
goto error;
- r = PyDict_SetItem(opts, name, value);
+ PyDict_SetItem(opts, name, value);
Py_DECREF(name);
Py_DECREF(value);
return;
@@ -1252,21 +1277,22 @@ PyDoc_STR(
"\n\
Static objects:\n\
\n\
-float_info -- a dict with information about the float implementation.\n\
-int_info -- a struct sequence with information about the int implementation.\n\
-maxsize -- the largest supported length of containers.\n\
-maxunicode -- the largest supported character\n\
builtin_module_names -- tuple of module names built into this interpreter\n\
-subversion -- subversion information of the build as tuple\n\
-version -- the version of this interpreter as a string\n\
-version_info -- version information as a named tuple\n\
-hexversion -- version information encoded as a single integer\n\
copyright -- copyright notice pertaining to this interpreter\n\
-platform -- platform identifier\n\
-executable -- absolute path of the executable binary of the Python interpreter\n\
-prefix -- prefix used to find the Python library\n\
exec_prefix -- prefix used to find the machine-specific Python library\n\
+executable -- absolute path of the executable binary of the Python interpreter\n\
+float_info -- a struct sequence with information about the float implementation.\n\
float_repr_style -- string indicating the style of repr() output for floats\n\
+hexversion -- version information encoded as a single integer\n\
+implementation -- Python implementation information.\n\
+int_info -- a struct sequence with information about the int implementation.\n\
+maxsize -- the largest supported length of containers.\n\
+maxunicode -- the value of the largest Unicode codepoint\n\
+platform -- platform identifier\n\
+prefix -- prefix used to find the Python library\n\
+thread_info -- a struct sequence with information about the thread implementation.\n\
+version -- the version of this interpreter as a string\n\
+version_info -- version information as a named tuple\n\
"
)
#ifdef MS_WINDOWS
@@ -1305,43 +1331,6 @@ settrace() -- set the global debug tracing function\n\
)
/* end of sys_doc */ ;
-/* Subversion branch and revision management */
-static int svn_initialized;
-static char patchlevel_revision[50]; /* Just the number */
-static char branch[50];
-static char shortbranch[50];
-static const char *svn_revision;
-
-static void
-svnversion_init(void)
-{
- if (svn_initialized)
- return;
-
- svn_initialized = 1;
- *patchlevel_revision = '\0';
- strcpy(branch, "");
- strcpy(shortbranch, "unknown");
- svn_revision = "";
-}
-
-/* Return svnversion output if available.
- Else return Revision of patchlevel.h if on branch.
- Else return empty string */
-const char*
-Py_SubversionRevision()
-{
- svnversion_init();
- return svn_revision;
-}
-
-const char*
-Py_SubversionShortBranch()
-{
- svnversion_init();
- return shortbranch;
-}
-
PyDoc_STRVAR(flags__doc__,
"sys.flags\n\
@@ -1352,7 +1341,6 @@ static PyTypeObject FlagsType;
static PyStructSequence_Field flags_fields[] = {
{"debug", "-d"},
- {"division_warning", "-Q"},
{"inspect", "-i"},
{"interactive", "-i"},
{"optimize", "-O or -OO"},
@@ -1377,9 +1365,9 @@ static PyStructSequence_Desc flags_desc = {
flags__doc__, /* doc */
flags_fields, /* fields */
#ifdef RISCOS
- 14
-#else
13
+#else
+ 12
#endif
};
@@ -1397,7 +1385,6 @@ make_flags(void)
PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
SetFlag(Py_DebugFlag);
- SetFlag(Py_DivisionWarningFlag);
SetFlag(Py_InspectFlag);
SetFlag(Py_InteractiveFlag);
SetFlag(Py_OptimizeFlag);
@@ -1491,6 +1478,73 @@ make_version_info(void)
return version_info;
}
+/* sys.implementation values */
+#define NAME "cpython"
+const char *_PySys_ImplName = NAME;
+#define QUOTE(arg) #arg
+#define STRIFY(name) QUOTE(name)
+#define MAJOR STRIFY(PY_MAJOR_VERSION)
+#define MINOR STRIFY(PY_MINOR_VERSION)
+#define TAG NAME "-" MAJOR MINOR;
+const char *_PySys_ImplCacheTag = TAG;
+#undef NAME
+#undef QUOTE
+#undef STRIFY
+#undef MAJOR
+#undef MINOR
+#undef TAG
+
+static PyObject *
+make_impl_info(PyObject *version_info)
+{
+ int res;
+ PyObject *impl_info, *value, *ns;
+
+ impl_info = PyDict_New();
+ if (impl_info == NULL)
+ return NULL;
+
+ /* populate the dict */
+
+ value = PyUnicode_FromString(_PySys_ImplName);
+ if (value == NULL)
+ goto error;
+ res = PyDict_SetItemString(impl_info, "name", value);
+ Py_DECREF(value);
+ if (res < 0)
+ goto error;
+
+ value = PyUnicode_FromString(_PySys_ImplCacheTag);
+ if (value == NULL)
+ goto error;
+ res = PyDict_SetItemString(impl_info, "cache_tag", value);
+ Py_DECREF(value);
+ if (res < 0)
+ goto error;
+
+ res = PyDict_SetItemString(impl_info, "version", version_info);
+ if (res < 0)
+ goto error;
+
+ value = PyLong_FromLong(PY_VERSION_HEX);
+ if (value == NULL)
+ goto error;
+ res = PyDict_SetItemString(impl_info, "hexversion", value);
+ Py_DECREF(value);
+ if (res < 0)
+ goto error;
+
+ /* dict ready */
+
+ ns = _PyNamespace_New(impl_info);
+ Py_DECREF(impl_info);
+ return ns;
+
+error:
+ Py_CLEAR(impl_info);
+ return NULL;
+}
+
static struct PyModuleDef sysmodule = {
PyModuleDef_HEAD_INIT,
"sys",
@@ -1506,7 +1560,7 @@ static struct PyModuleDef sysmodule = {
PyObject *
_PySys_Init(void)
{
- PyObject *m, *v, *sysdict;
+ PyObject *m, *v, *sysdict, *version_info;
char *s;
m = PyModule_Create(&sysmodule);
@@ -1547,10 +1601,6 @@ _PySys_Init(void)
PyUnicode_FromString(Py_GetVersion()));
SET_SYS_FROM_STRING("hexversion",
PyLong_FromLong(PY_VERSION_HEX));
- svnversion_init();
- SET_SYS_FROM_STRING("subversion",
- Py_BuildValue("(sss)", "CPython", branch,
- svn_revision));
SET_SYS_FROM_STRING("_mercurial",
Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),
_Py_hgversion()));
@@ -1569,6 +1619,10 @@ _PySys_Init(void)
PyUnicode_FromWideChar(Py_GetPrefix(), -1));
SET_SYS_FROM_STRING("exec_prefix",
PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
+ SET_SYS_FROM_STRING("base_prefix",
+ PyUnicode_FromWideChar(Py_GetPrefix(), -1));
+ SET_SYS_FROM_STRING("base_exec_prefix",
+ PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
SET_SYS_FROM_STRING("maxsize",
PyLong_FromSsize_t(PY_SSIZE_T_MAX));
SET_SYS_FROM_STRING("float_info",
@@ -1581,7 +1635,7 @@ _PySys_Init(void)
SET_SYS_FROM_STRING("hash_info",
get_hash_info());
SET_SYS_FROM_STRING("maxunicode",
- PyLong_FromLong(PyUnicode_GetMax()));
+ PyLong_FromLong(0x10FFFF));
SET_SYS_FROM_STRING("builtin_module_names",
list_builtin_module_names());
{
@@ -1626,11 +1680,15 @@ _PySys_Init(void)
/* version_info */
if (VersionInfoType.tp_name == 0)
PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
- SET_SYS_FROM_STRING("version_info", make_version_info());
+ version_info = make_version_info();
+ SET_SYS_FROM_STRING("version_info", version_info);
/* prevent user from creating new instances */
VersionInfoType.tp_init = NULL;
VersionInfoType.tp_new = NULL;
+ /* implementation */
+ SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
+
/* flags */
if (FlagsType.tp_name == 0)
PyStructSequence_InitType(&FlagsType, &flags_desc);
@@ -1658,6 +1716,10 @@ _PySys_Init(void)
PyUnicode_FromString("legacy"));
#endif
+#ifdef WITH_THREAD
+ SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
+#endif
+
#undef SET_SYS_FROM_STRING
if (PyErr_Occurred())
return NULL;
@@ -1812,7 +1874,7 @@ sys_update_path(int argc, wchar_t **argv)
the argument must be the full path anyway. */
wchar_t *ptemp;
if (GetFullPathNameW(argv0,
- sizeof(fullpath)/sizeof(fullpath[0]),
+ Py_ARRAY_LENGTH(fullpath),
fullpath,
&ptemp)) {
argv0 = fullpath;
@@ -1881,11 +1943,12 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
{
PyObject *writer = NULL, *args = NULL, *result = NULL;
int err;
+ _Py_IDENTIFIER(write);
if (file == NULL)
return -1;
- writer = PyObject_GetAttrString(file, "write");
+ writer = _PyObject_GetAttrId(file, &PyId_write);
if (writer == NULL)
goto error;
diff --git a/Python/thread.c b/Python/thread.c
index d224046..e55d342 100644
--- a/Python/thread.c
+++ b/Python/thread.c
@@ -7,7 +7,6 @@
#include "Python.h"
-
#ifndef _POSIX_THREADS
/* This means pthreads are not implemented in libc headers, hence the macro
not present in unistd.h. But they still can be implemented as an external
@@ -27,18 +26,6 @@
#ifndef _POSIX_THREADS
-#ifdef __sgi
-#define SGI_THREADS
-#endif
-
-#ifdef HAVE_THREAD_H
-#define SOLARIS_THREADS
-#endif
-
-#if defined(sun) && !defined(SOLARIS_THREADS)
-#define SUN_LWP
-#endif
-
/* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then
enough of the Posix threads package is implemented to support python
threads.
@@ -94,47 +81,21 @@ PyThread_init_thread(void)
or the size specified by the THREAD_STACK_SIZE macro. */
static size_t _pythread_stacksize = 0;
-#ifdef SGI_THREADS
-#error SGI Irix threads are now unsupported, and code will be removed in 3.3.
-#include "thread_sgi.h"
-#endif
-
-#ifdef SOLARIS_THREADS
-#include "thread_solaris.h"
-#endif
-
-#ifdef SUN_LWP
-#error SunOS lightweight processes are now unsupported, and code will be removed in 3.3.
-#include "thread_lwp.h"
-#endif
-
-#ifdef HAVE_PTH
-#error GNU pth threads are now unsupported, and code will be removed in 3.3.
-#include "thread_pth.h"
-#undef _POSIX_THREADS
-#endif
-
#ifdef _POSIX_THREADS
+#define PYTHREAD_NAME "pthread"
#include "thread_pthread.h"
#endif
-#ifdef C_THREADS
-#error Mach C Threads are now unsupported, and code will be removed in 3.3.
-#include "thread_cthread.h"
-#endif
-
#ifdef NT_THREADS
+#define PYTHREAD_NAME "nt"
#include "thread_nt.h"
#endif
#ifdef OS2_THREADS
+#define PYTHREAD_NAME "os2"
#include "thread_os2.h"
#endif
-#ifdef PLAN9_THREADS
-#include "thread_plan9.h"
-#endif
-
/*
#ifdef FOOBAR_THREADS
#include "thread_foobar.h"
@@ -409,3 +370,84 @@ PyThread_ReInitTLS(void)
}
#endif /* Py_HAVE_NATIVE_TLS */
+
+PyDoc_STRVAR(threadinfo__doc__,
+"sys.thread_info\n\
+\n\
+A struct sequence holding information about the thread implementation.");
+
+static PyStructSequence_Field threadinfo_fields[] = {
+ {"name", "name of the thread implementation"},
+ {"lock", "name of the lock implementation"},
+ {"version", "name and version of the thread library"},
+ {0}
+};
+
+static PyStructSequence_Desc threadinfo_desc = {
+ "sys.thread_info", /* name */
+ threadinfo__doc__, /* doc */
+ threadinfo_fields, /* fields */
+ 3
+};
+
+static PyTypeObject ThreadInfoType;
+
+PyObject*
+PyThread_GetInfo(void)
+{
+ PyObject *threadinfo, *value;
+ int pos = 0;
+#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \
+ && defined(_CS_GNU_LIBPTHREAD_VERSION))
+ char buffer[255];
+ int len;
+#endif
+
+ if (ThreadInfoType.tp_name == 0)
+ PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc);
+
+ threadinfo = PyStructSequence_New(&ThreadInfoType);
+ if (threadinfo == NULL)
+ return NULL;
+
+ value = PyUnicode_FromString(PYTHREAD_NAME);
+ if (value == NULL) {
+ Py_DECREF(threadinfo);
+ return NULL;
+ }
+ PyStructSequence_SET_ITEM(threadinfo, pos++, value);
+
+#ifdef _POSIX_THREADS
+#ifdef USE_SEMAPHORES
+ value = PyUnicode_FromString("semaphore");
+#else
+ value = PyUnicode_FromString("mutex+cond");
+#endif
+ if (value == NULL) {
+ Py_DECREF(threadinfo);
+ return NULL;
+ }
+#else
+ Py_INCREF(Py_None);
+ value = Py_None;
+#endif
+ PyStructSequence_SET_ITEM(threadinfo, pos++, value);
+
+#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \
+ && defined(_CS_GNU_LIBPTHREAD_VERSION))
+ value = NULL;
+ len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer));
+ if (1 < len && len < sizeof(buffer)) {
+ value = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1);
+ if (value == NULL)
+ PyErr_Clear();
+ }
+ if (value == NULL)
+#endif
+ {
+ Py_INCREF(Py_None);
+ value = Py_None;
+ }
+ PyStructSequence_SET_ITEM(threadinfo, pos++, value);
+ return threadinfo;
+}
diff --git a/Python/thread_cthread.h b/Python/thread_cthread.h
deleted file mode 100644
index 1b3e390..0000000
--- a/Python/thread_cthread.h
+++ /dev/null
@@ -1,112 +0,0 @@
-
-#ifdef MACH_C_THREADS
-#include <mach/cthreads.h>
-#endif
-
-#ifdef HURD_C_THREADS
-#include <cthreads.h>
-#endif
-
-/*
- * Initialization.
- */
-static void
-PyThread__init_thread(void)
-{
-#ifndef HURD_C_THREADS
- /* Roland McGrath said this should not be used since this is
- done while linking to threads */
- cthread_init();
-#else
-/* do nothing */
- ;
-#endif
-}
-
-/*
- * Thread support.
- */
-long
-PyThread_start_new_thread(void (*func)(void *), void *arg)
-{
- int success = 0; /* init not needed when SOLARIS_THREADS and */
- /* C_THREADS implemented properly */
-
- dprintf(("PyThread_start_new_thread called\n"));
- if (!initialized)
- PyThread_init_thread();
- /* looks like solaris detaches the thread to never rejoin
- * so well do it here
- */
- cthread_detach(cthread_fork((cthread_fn_t) func, arg));
- return success < 0 ? -1 : 0;
-}
-
-long
-PyThread_get_thread_ident(void)
-{
- if (!initialized)
- PyThread_init_thread();
- return (long) cthread_self();
-}
-
-void
-PyThread_exit_thread(void)
-{
- dprintf(("PyThread_exit_thread called\n"));
- if (!initialized)
- exit(0);
- cthread_exit(0);
-}
-
-/*
- * Lock support.
- */
-PyThread_type_lock
-PyThread_allocate_lock(void)
-{
- mutex_t lock;
-
- dprintf(("PyThread_allocate_lock called\n"));
- if (!initialized)
- PyThread_init_thread();
-
- lock = mutex_alloc();
- if (mutex_init(lock)) {
- perror("mutex_init");
- free((void *) lock);
- lock = 0;
- }
- dprintf(("PyThread_allocate_lock() -> %p\n", lock));
- return (PyThread_type_lock) lock;
-}
-
-void
-PyThread_free_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_free_lock(%p) called\n", lock));
- mutex_free(lock);
-}
-
-int
-PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
-{
- int success = FALSE;
-
- dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
- if (waitflag) { /* blocking */
- mutex_lock((mutex_t)lock);
- success = TRUE;
- } else { /* non blocking */
- success = mutex_try_lock((mutex_t)lock);
- }
- dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
- return success;
-}
-
-void
-PyThread_release_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_release_lock(%p) called\n", lock));
- mutex_unlock((mutex_t )lock);
-}
diff --git a/Python/thread_lwp.h b/Python/thread_lwp.h
deleted file mode 100644
index ba7b37a..0000000
--- a/Python/thread_lwp.h
+++ /dev/null
@@ -1,113 +0,0 @@
-
-#include <stdlib.h>
-#include <lwp/lwp.h>
-#include <lwp/stackdep.h>
-
-#define STACKSIZE 1000 /* stacksize for a thread */
-#define NSTACKS 2 /* # stacks to be put in cache initially */
-
-struct lock {
- int lock_locked;
- cv_t lock_condvar;
- mon_t lock_monitor;
-};
-
-
-/*
- * Initialization.
- */
-static void PyThread__init_thread(void)
-{
- lwp_setstkcache(STACKSIZE, NSTACKS);
-}
-
-/*
- * Thread support.
- */
-
-
-long PyThread_start_new_thread(void (*func)(void *), void *arg)
-{
- thread_t tid;
- int success;
- dprintf(("PyThread_start_new_thread called\n"));
- if (!initialized)
- PyThread_init_thread();
- success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg);
- return success < 0 ? -1 : 0;
-}
-
-long PyThread_get_thread_ident(void)
-{
- thread_t tid;
- if (!initialized)
- PyThread_init_thread();
- if (lwp_self(&tid) < 0)
- return -1;
- return tid.thread_id;
-}
-
-void PyThread_exit_thread(void)
-{
- dprintf(("PyThread_exit_thread called\n"));
- if (!initialized)
- exit(0);
- lwp_destroy(SELF);
-}
-
-/*
- * Lock support.
- */
-PyThread_type_lock PyThread_allocate_lock(void)
-{
- struct lock *lock;
- extern char *malloc(size_t);
-
- dprintf(("PyThread_allocate_lock called\n"));
- if (!initialized)
- PyThread_init_thread();
-
- lock = (struct lock *) malloc(sizeof(struct lock));
- lock->lock_locked = 0;
- (void) mon_create(&lock->lock_monitor);
- (void) cv_create(&lock->lock_condvar, lock->lock_monitor);
- dprintf(("PyThread_allocate_lock() -> %p\n", lock));
- return (PyThread_type_lock) lock;
-}
-
-void PyThread_free_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_free_lock(%p) called\n", lock));
- mon_destroy(((struct lock *) lock)->lock_monitor);
- free((char *) lock);
-}
-
-int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
-{
- int success;
-
- dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
- success = 0;
-
- (void) mon_enter(((struct lock *) lock)->lock_monitor);
- if (waitflag)
- while (((struct lock *) lock)->lock_locked)
- cv_wait(((struct lock *) lock)->lock_condvar);
- if (!((struct lock *) lock)->lock_locked) {
- success = 1;
- ((struct lock *) lock)->lock_locked = 1;
- }
- cv_broadcast(((struct lock *) lock)->lock_condvar);
- mon_exit(((struct lock *) lock)->lock_monitor);
- dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
- return success;
-}
-
-void PyThread_release_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_release_lock(%p) called\n", lock));
- (void) mon_enter(((struct lock *) lock)->lock_monitor);
- ((struct lock *) lock)->lock_locked = 0;
- cv_broadcast(((struct lock *) lock)->lock_condvar);
- mon_exit(((struct lock *) lock)->lock_monitor);
-}
diff --git a/Python/thread_nt.h b/Python/thread_nt.h
index d1bb0e5..938bf1e 100644
--- a/Python/thread_nt.h
+++ b/Python/thread_nt.h
@@ -9,6 +9,109 @@
#include <process.h>
#endif
+/* options */
+#ifndef _PY_USE_CV_LOCKS
+#define _PY_USE_CV_LOCKS 1 /* use locks based on cond vars */
+#endif
+
+/* Now, define a non-recursive mutex using either condition variables
+ * and critical sections (fast) or using operating system mutexes
+ * (slow)
+ */
+
+#if _PY_USE_CV_LOCKS
+
+#include "condvar.h"
+
+typedef struct _NRMUTEX
+{
+ PyMUTEX_T cs;
+ PyCOND_T cv;
+ int locked;
+} NRMUTEX;
+typedef NRMUTEX *PNRMUTEX;
+
+PNRMUTEX
+AllocNonRecursiveMutex()
+{
+ PNRMUTEX m = (PNRMUTEX)malloc(sizeof(NRMUTEX));
+ if (!m)
+ return NULL;
+ if (PyCOND_INIT(&m->cv))
+ goto fail;
+ if (PyMUTEX_INIT(&m->cs)) {
+ PyCOND_FINI(&m->cv);
+ goto fail;
+ }
+ m->locked = 0;
+ return m;
+fail:
+ free(m);
+ return NULL;
+}
+
+VOID
+FreeNonRecursiveMutex(PNRMUTEX mutex)
+{
+ if (mutex) {
+ PyCOND_FINI(&mutex->cv);
+ PyMUTEX_FINI(&mutex->cs);
+ free(mutex);
+ }
+}
+
+DWORD
+EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds)
+{
+ DWORD result = WAIT_OBJECT_0;
+ if (PyMUTEX_LOCK(&mutex->cs))
+ return WAIT_FAILED;
+ if (milliseconds == INFINITE) {
+ while (mutex->locked) {
+ if (PyCOND_WAIT(&mutex->cv, &mutex->cs)) {
+ result = WAIT_FAILED;
+ break;
+ }
+ }
+ } else if (milliseconds != 0) {
+ /* wait at least until the target */
+ DWORD now, target = GetTickCount() + milliseconds;
+ while (mutex->locked) {
+ if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, milliseconds*1000) < 0) {
+ result = WAIT_FAILED;
+ break;
+ }
+ now = GetTickCount();
+ if (target <= now)
+ break;
+ milliseconds = target-now;
+ }
+ }
+ if (!mutex->locked) {
+ mutex->locked = 1;
+ result = WAIT_OBJECT_0;
+ } else if (result == WAIT_OBJECT_0)
+ result = WAIT_TIMEOUT;
+ /* else, it is WAIT_FAILED */
+ PyMUTEX_UNLOCK(&mutex->cs); /* must ignore result here */
+ return result;
+}
+
+BOOL
+LeaveNonRecursiveMutex(PNRMUTEX mutex)
+{
+ BOOL result;
+ if (PyMUTEX_LOCK(&mutex->cs))
+ return FALSE;
+ mutex->locked = 0;
+ result = PyCOND_SIGNAL(&mutex->cv);
+ result &= PyMUTEX_UNLOCK(&mutex->cs);
+ return result;
+}
+
+#else /* if ! _PY_USE_CV_LOCKS */
+
+/* NR-locks based on a kernel mutex */
#define PNRMUTEX HANDLE
PNRMUTEX
@@ -35,6 +138,7 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex)
{
return ReleaseSemaphore(mutex, 1, NULL);
}
+#endif /* _PY_USE_CV_LOCKS */
long PyThread_get_thread_ident(void);
diff --git a/Python/thread_pth.h b/Python/thread_pth.h
index 82a00e7..5704266 100644
--- a/Python/thread_pth.h
+++ b/Python/thread_pth.h
@@ -69,9 +69,8 @@ long PyThread_get_thread_ident(void)
volatile pth_t threadid;
if (!initialized)
PyThread_init_thread();
- /* Jump through some hoops for Alpha OSF/1 */
threadid = pth_self();
- return (long) *(long *) &threadid;
+ return (long) threadid;
}
void PyThread_exit_thread(void)
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index 3cde035..5007aaf 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -148,7 +148,7 @@ typedef struct {
* Initialization.
*/
-#ifdef _HAVE_BSDI
+#if defined(_HAVE_BSDI)
static
void _noop(void)
{
@@ -244,8 +244,7 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
hosed" because:
- It does not guarantee the promise that a non-zero integer is returned.
- The cast to long is inherently unsafe.
- - It is not clear that the 'volatile' (for AIX?) and ugly casting in the
- latter return statement (for Alpha OSF/1) are any longer necessary.
+ - It is not clear that the 'volatile' (for AIX?) are any longer necessary.
*/
long
PyThread_get_thread_ident(void)
@@ -253,13 +252,8 @@ PyThread_get_thread_ident(void)
volatile pthread_t threadid;
if (!initialized)
PyThread_init_thread();
- /* Jump through some hoops for Alpha OSF/1 */
threadid = pthread_self();
-#if SIZEOF_PTHREAD_T <= SIZEOF_LONG
return (long) threadid;
-#else
- return (long) *(long *) &threadid;
-#endif
}
void
@@ -449,12 +443,15 @@ PyThread_free_lock(PyThread_type_lock lock)
dprintf(("PyThread_free_lock(%p) called\n", lock));
- status = pthread_mutex_destroy( &thelock->mut );
- CHECK_STATUS("pthread_mutex_destroy");
-
+ /* some pthread-like implementations tie the mutex to the cond
+ * and must have the cond destroyed first.
+ */
status = pthread_cond_destroy( &thelock->lock_released );
CHECK_STATUS("pthread_cond_destroy");
+ status = pthread_mutex_destroy( &thelock->mut );
+ CHECK_STATUS("pthread_mutex_destroy");
+
free((void *)thelock);
}
@@ -537,12 +534,12 @@ PyThread_release_lock(PyThread_type_lock lock)
thelock->locked = 0;
- status = pthread_mutex_unlock( &thelock->mut );
- CHECK_STATUS("pthread_mutex_unlock[3]");
-
/* wake up someone (anyone, if any) waiting on the lock */
status = pthread_cond_signal( &thelock->lock_released );
CHECK_STATUS("pthread_cond_signal");
+
+ status = pthread_mutex_unlock( &thelock->mut );
+ CHECK_STATUS("pthread_mutex_unlock[3]");
}
#endif /* USE_SEMAPHORES */
diff --git a/Python/thread_sgi.h b/Python/thread_sgi.h
deleted file mode 100644
index 771ab2c..0000000
--- a/Python/thread_sgi.h
+++ /dev/null
@@ -1,259 +0,0 @@
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/prctl.h>
-#include <ulocks.h>
-#include <errno.h>
-
-#define HDR_SIZE 2680 /* sizeof(ushdr_t) */
-#define MAXPROC 100 /* max # of threads that can be started */
-
-static usptr_t *shared_arena;
-static ulock_t count_lock; /* protection for some variables */
-static ulock_t wait_lock; /* lock used to wait for other threads */
-static int waiting_for_threads; /* protected by count_lock */
-static int nthreads; /* protected by count_lock */
-static int exit_status;
-static int exiting; /* we're already exiting (for maybe_exit) */
-static pid_t my_pid; /* PID of main thread */
-static struct pidlist {
- pid_t parent;
- pid_t child;
-} pidlist[MAXPROC]; /* PIDs of other threads; protected by count_lock */
-static int maxpidindex; /* # of PIDs in pidlist */
-/*
- * Initialization.
- */
-static void PyThread__init_thread(void)
-{
-#ifdef USE_DL
- long addr, size;
-#endif /* USE_DL */
-
-
-#ifdef USE_DL
- if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
- perror("usconfig - CONF_INITSIZE (check)");
- if (usconfig(CONF_INITSIZE, size) < 0)
- perror("usconfig - CONF_INITSIZE (reset)");
- addr = (long) dl_getrange(size + HDR_SIZE);
- dprintf(("trying to use addr %p-%p for shared arena\n", addr, addr+size));
- errno = 0;
- if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0)
- perror("usconfig - CONF_ATTACHADDR (set)");
-#endif /* USE_DL */
- if (usconfig(CONF_INITUSERS, 16) < 0)
- perror("usconfig - CONF_INITUSERS");
- my_pid = getpid(); /* so that we know which is the main thread */
- if (usconfig(CONF_ARENATYPE, US_SHAREDONLY) < 0)
- perror("usconfig - CONF_ARENATYPE");
- usconfig(CONF_LOCKTYPE, US_DEBUG); /* XXX */
-#ifdef Py_DEBUG
- if (thread_debug & 4)
- usconfig(CONF_LOCKTYPE, US_DEBUGPLUS);
- else if (thread_debug & 2)
- usconfig(CONF_LOCKTYPE, US_DEBUG);
-#endif /* Py_DEBUG */
- if ((shared_arena = usinit(tmpnam(0))) == 0)
- perror("usinit");
-#ifdef USE_DL
- if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */
- perror("usconfig - CONF_ATTACHADDR (reset)");
-#endif /* USE_DL */
- if ((count_lock = usnewlock(shared_arena)) == NULL)
- perror("usnewlock (count_lock)");
- (void) usinitlock(count_lock);
- if ((wait_lock = usnewlock(shared_arena)) == NULL)
- perror("usnewlock (wait_lock)");
- dprintf(("arena start: %p, arena size: %ld\n", shared_arena, (long) usconfig(CONF_GETSIZE, shared_arena)));
-}
-
-/*
- * Thread support.
- */
-
-static void clean_threads(void)
-{
- int i, j;
- pid_t mypid, pid;
-
- /* clean up any exited threads */
- mypid = getpid();
- i = 0;
- while (i < maxpidindex) {
- if (pidlist[i].parent == mypid && (pid = pidlist[i].child) > 0) {
- pid = waitpid(pid, 0, WNOHANG);
- if (pid > 0) {
- /* a thread has exited */
- pidlist[i] = pidlist[--maxpidindex];
- /* remove references to children of dead proc */
- for (j = 0; j < maxpidindex; j++)
- if (pidlist[j].parent == pid)
- pidlist[j].child = -1;
- continue; /* don't increment i */
- }
- }
- i++;
- }
- /* clean up the list */
- i = 0;
- while (i < maxpidindex) {
- if (pidlist[i].child == -1) {
- pidlist[i] = pidlist[--maxpidindex];
- continue; /* don't increment i */
- }
- i++;
- }
-}
-
-long PyThread_start_new_thread(void (*func)(void *), void *arg)
-{
-#ifdef USE_DL
- long addr, size;
- static int local_initialized = 0;
-#endif /* USE_DL */
- int success = 0; /* init not needed when SOLARIS_THREADS and */
- /* C_THREADS implemented properly */
-
- dprintf(("PyThread_start_new_thread called\n"));
- if (!initialized)
- PyThread_init_thread();
- switch (ussetlock(count_lock)) {
- case 0: return 0;
- case -1: perror("ussetlock (count_lock)");
- }
- if (maxpidindex >= MAXPROC)
- success = -1;
- else {
-#ifdef USE_DL
- if (!local_initialized) {
- if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
- perror("usconfig - CONF_INITSIZE (check)");
- if (usconfig(CONF_INITSIZE, size) < 0)
- perror("usconfig - CONF_INITSIZE (reset)");
- addr = (long) dl_getrange(size + HDR_SIZE);
- dprintf(("trying to use addr %p-%p for sproc\n",
- addr, addr+size));
- errno = 0;
- if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 &&
- errno != 0)
- perror("usconfig - CONF_ATTACHADDR (set)");
- }
-#endif /* USE_DL */
- clean_threads();
- if ((success = sproc(func, PR_SALL, arg)) < 0)
- perror("sproc");
-#ifdef USE_DL
- if (!local_initialized) {
- if (usconfig(CONF_ATTACHADDR, addr) < 0)
- /* reset address */
- perror("usconfig - CONF_ATTACHADDR (reset)");
- local_initialized = 1;
- }
-#endif /* USE_DL */
- if (success >= 0) {
- nthreads++;
- pidlist[maxpidindex].parent = getpid();
- pidlist[maxpidindex++].child = success;
- dprintf(("pidlist[%d] = %d\n",
- maxpidindex-1, success));
- }
- }
- if (usunsetlock(count_lock) < 0)
- perror("usunsetlock (count_lock)");
- return success;
-}
-
-long PyThread_get_thread_ident(void)
-{
- return getpid();
-}
-
-void PyThread_exit_thread(void)
-{
- dprintf(("PyThread_exit_thread called\n"));
- if (!initialized)
- exit(0);
- if (ussetlock(count_lock) < 0)
- perror("ussetlock (count_lock)");
- nthreads--;
- if (getpid() == my_pid) {
- /* main thread; wait for other threads to exit */
- exiting = 1;
- waiting_for_threads = 1;
- if (ussetlock(wait_lock) < 0)
- perror("ussetlock (wait_lock)");
- for (;;) {
- if (nthreads < 0) {
- dprintf(("really exit (%d)\n", exit_status));
- exit(exit_status);
- }
- if (usunsetlock(count_lock) < 0)
- perror("usunsetlock (count_lock)");
- dprintf(("waiting for other threads (%d)\n", nthreads));
- if (ussetlock(wait_lock) < 0)
- perror("ussetlock (wait_lock)");
- if (ussetlock(count_lock) < 0)
- perror("ussetlock (count_lock)");
- }
- }
- /* not the main thread */
- if (waiting_for_threads) {
- dprintf(("main thread is waiting\n"));
- if (usunsetlock(wait_lock) < 0)
- perror("usunsetlock (wait_lock)");
- }
- if (usunsetlock(count_lock) < 0)
- perror("usunsetlock (count_lock)");
- _exit(0);
-}
-
-/*
- * Lock support.
- */
-PyThread_type_lock PyThread_allocate_lock(void)
-{
- ulock_t lock;
-
- dprintf(("PyThread_allocate_lock called\n"));
- if (!initialized)
- PyThread_init_thread();
-
- if ((lock = usnewlock(shared_arena)) == NULL)
- perror("usnewlock");
- (void) usinitlock(lock);
- dprintf(("PyThread_allocate_lock() -> %p\n", lock));
- return (PyThread_type_lock) lock;
-}
-
-void PyThread_free_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_free_lock(%p) called\n", lock));
- usfreelock((ulock_t) lock, shared_arena);
-}
-
-int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
-{
- int success;
-
- dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
- errno = 0; /* clear it just in case */
- if (waitflag)
- success = ussetlock((ulock_t) lock);
- else
- success = uscsetlock((ulock_t) lock, 1); /* Try it once */
- if (success < 0)
- perror(waitflag ? "ussetlock" : "uscsetlock");
- dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
- return success;
-}
-
-void PyThread_release_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_release_lock(%p) called\n", lock));
- if (usunsetlock((ulock_t) lock) < 0)
- perror("usunsetlock");
-}
diff --git a/Python/thread_solaris.h b/Python/thread_solaris.h
deleted file mode 100644
index 1ce1cfc..0000000
--- a/Python/thread_solaris.h
+++ /dev/null
@@ -1,130 +0,0 @@
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include </usr/include/thread.h>
-#undef _POSIX_THREADS
-
-
-/*
- * Initialization.
- */
-static void PyThread__init_thread(void)
-{
-}
-
-/*
- * Thread support.
- */
-struct func_arg {
- void (*func)(void *);
- void *arg;
-};
-
-static void *
-new_func(void *funcarg)
-{
- void (*func)(void *);
- void *arg;
-
- func = ((struct func_arg *) funcarg)->func;
- arg = ((struct func_arg *) funcarg)->arg;
- free(funcarg);
- (*func)(arg);
- return 0;
-}
-
-
-long
-PyThread_start_new_thread(void (*func)(void *), void *arg)
-{
- thread_t tid;
- struct func_arg *funcarg;
-
- dprintf(("PyThread_start_new_thread called\n"));
- if (!initialized)
- PyThread_init_thread();
- funcarg = (struct func_arg *) malloc(sizeof(struct func_arg));
- funcarg->func = func;
- funcarg->arg = arg;
- if (thr_create(0, 0, new_func, funcarg,
- THR_DETACHED | THR_NEW_LWP, &tid)) {
- perror("thr_create");
- free((void *) funcarg);
- return -1;
- }
- return tid;
-}
-
-long
-PyThread_get_thread_ident(void)
-{
- if (!initialized)
- PyThread_init_thread();
- return thr_self();
-}
-
-void
-PyThread_exit_thread(void)
-{
- dprintf(("PyThread_exit_thread called\n"));
- if (!initialized)
- exit(0);
- thr_exit(0);
-}
-
-/*
- * Lock support.
- */
-PyThread_type_lock
-PyThread_allocate_lock(void)
-{
- mutex_t *lock;
-
- dprintf(("PyThread_allocate_lock called\n"));
- if (!initialized)
- PyThread_init_thread();
-
- lock = (mutex_t *) malloc(sizeof(mutex_t));
- if (mutex_init(lock, USYNC_THREAD, 0)) {
- perror("mutex_init");
- free((void *) lock);
- lock = 0;
- }
- dprintf(("PyThread_allocate_lock() -> %p\n", lock));
- return (PyThread_type_lock) lock;
-}
-
-void
-PyThread_free_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_free_lock(%p) called\n", lock));
- mutex_destroy((mutex_t *) lock);
- free((void *) lock);
-}
-
-int
-PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
-{
- int success;
-
- dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
- if (waitflag)
- success = mutex_lock((mutex_t *) lock);
- else
- success = mutex_trylock((mutex_t *) lock);
- if (success < 0)
- perror(waitflag ? "mutex_lock" : "mutex_trylock");
- else
- success = !success; /* solaris does it the other way round */
- dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
- return success;
-}
-
-void
-PyThread_release_lock(PyThread_type_lock lock)
-{
- dprintf(("PyThread_release_lock(%p) called\n", lock));
- if (mutex_unlock((mutex_t *) lock))
- perror("mutex_unlock");
-}
diff --git a/Python/thread_wince.h b/Python/thread_wince.h
deleted file mode 100644
index 51ddc02..0000000
--- a/Python/thread_wince.h
+++ /dev/null
@@ -1,136 +0,0 @@
-
-/* This code implemented by Mark Hammond (MHammond@skippinet.com.au) */
-
-#include <windows.h>
-#include <limits.h>
-#include <pydebug.h>
-
-long PyThread_get_thread_ident(void);
-
-/*
- * Change all headers to pure ANSI as no one will use K&R style on an
- * NT
- */
-
-/*
- * Initialization of the C package, should not be needed.
- */
-static void PyThread__init_thread(void)
-{
-}
-
-/*
- * Thread support.
- */
-long PyThread_start_new_thread(void (*func)(void *), void *arg)
-{
- long rv;
- int success = -1;
-
- dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident()));
- if (!initialized)
- PyThread_init_thread();
-
- rv = _beginthread(func, 0, arg); /* use default stack size */
-
- if (rv != -1) {
- success = 0;
- dprintf(("%ld: PyThread_start_new_thread succeeded:\n", PyThread_get_thread_ident()));
- }
-
- return success;
-}
-
-/*
- * Return the thread Id instead of an handle. The Id is said to uniquely identify the
- * thread in the system
- */
-long PyThread_get_thread_ident(void)
-{
- if (!initialized)
- PyThread_init_thread();
-
- return GetCurrentThreadId();
-}
-
-void PyThread_exit_thread(void)
-{
- dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
- if (!initialized)
- exit(0);
- _endthread();
-}
-
-/*
- * Lock support. It has to be implemented using Mutexes, as
- * CE doesnt support semaphores. Therefore we use some hacks to
- * simulate the non reentrant requirements of Python locks
- */
-PyThread_type_lock PyThread_allocate_lock(void)
-{
- HANDLE aLock;
-
- dprintf(("PyThread_allocate_lock called\n"));
- if (!initialized)
- PyThread_init_thread();
-
- aLock = CreateEvent(NULL, /* Security attributes */
- 0, /* Manual-Reset */
- 1, /* Is initially signalled */
- NULL); /* Name of event */
-
- dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));
-
- return (PyThread_type_lock) aLock;
-}
-
-void PyThread_free_lock(PyThread_type_lock aLock)
-{
- dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
-
- CloseHandle(aLock);
-}
-
-/*
- * Return 1 on success if the lock was acquired
- *
- * and 0 if the lock was not acquired. This means a 0 is returned
- * if the lock has already been acquired by this thread!
- */
-int PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
-{
- int success = 1;
- DWORD waitResult;
-
- dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag));
-
-#ifndef DEBUG
- waitResult = WaitForSingleObject(aLock, (waitflag ? INFINITE : 0));
-#else
- /* To aid in debugging, we regularly wake up. This allows us to
- break into the debugger */
- while (TRUE) {
- waitResult = WaitForSingleObject(aLock, waitflag ? 3000 : 0);
- if (waitflag==0 || (waitflag && waitResult == WAIT_OBJECT_0))
- break;
- }
-#endif
-
- if (waitResult != WAIT_OBJECT_0) {
- success = 0; /* We failed */
- }
-
- dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success));
-
- return success;
-}
-
-void PyThread_release_lock(PyThread_type_lock aLock)
-{
- dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
-
- if (!SetEvent(aLock))
- dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", PyThread_get_thread_ident(), aLock, GetLastError()));
-}
-
-
diff --git a/Python/traceback.c b/Python/traceback.c
index 59bb3f0..b928902 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -13,8 +13,13 @@
#define OFF(x) offsetof(PyTracebackObject, x)
-/* Method from Parser/tokenizer.c */
-extern char * PyTokenizer_FindEncoding(int);
+#define PUTS(fd, str) write(fd, str, strlen(str))
+#define MAX_STRING_LENGTH 500
+#define MAX_FRAME_DEPTH 100
+#define MAX_NTHREADS 100
+
+/* Function from Parser/tokenizer.c */
+extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
static PyObject *
tb_dir(PyTracebackObject *self)
@@ -147,6 +152,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *
const char* filepath;
Py_ssize_t len;
PyObject* result;
+ _Py_IDENTIFIER(open);
filebytes = PyUnicode_EncodeFSDefault(filename);
if (filebytes == NULL) {
@@ -194,7 +200,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *
namebuf[len++] = SEP;
strcpy(namebuf+len, tail);
- binary = PyObject_CallMethod(io, "open", "ss", namebuf, "rb");
+ binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb");
if (binary != NULL) {
result = binary;
goto finally;
@@ -224,8 +230,11 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
PyObject *lineobj = NULL;
PyObject *res;
char buf[MAXPATHLEN+1];
- Py_UNICODE *u, *p;
- Py_ssize_t len;
+ int kind;
+ void *data;
+ _Py_IDENTIFIER(close);
+ _Py_IDENTIFIER(open);
+ _Py_IDENTIFIER(TextIOWrapper);
/* open the file */
if (filename == NULL)
@@ -234,7 +243,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
io = PyImport_ImportModuleNoBlock("io");
if (io == NULL)
return -1;
- binary = PyObject_CallMethod(io, "open", "Os", filename, "rb");
+ binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb");
if (binary == NULL) {
binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io);
@@ -246,10 +255,10 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
/* use the right encoding to decode the file as unicode */
fd = PyObject_AsFileDescriptor(binary);
- found_encoding = PyTokenizer_FindEncoding(fd);
+ found_encoding = PyTokenizer_FindEncodingFilename(fd, filename);
encoding = (found_encoding != NULL) ? found_encoding : "utf-8";
lseek(fd, 0, 0); /* Reset position */
- fob = PyObject_CallMethod(io, "TextIOWrapper", "Os", binary, encoding);
+ fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding);
Py_DECREF(io);
Py_DECREF(binary);
PyMem_FREE(found_encoding);
@@ -268,7 +277,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
break;
}
}
- res = PyObject_CallMethod(fob, "close", "");
+ res = _PyObject_CallMethodId(fob, &PyId_close, "");
if (res)
Py_DECREF(res);
else
@@ -280,13 +289,16 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
}
/* remove the indentation of the line */
- u = PyUnicode_AS_UNICODE(lineobj);
- len = PyUnicode_GET_SIZE(lineobj);
- for (p=u; *p == ' ' || *p == '\t' || *p == '\014'; p++)
- len--;
- if (u != p) {
+ kind = PyUnicode_KIND(lineobj);
+ data = PyUnicode_DATA(lineobj);
+ for (i=0; i < PyUnicode_GET_LENGTH(lineobj); i++) {
+ Py_UCS4 ch = PyUnicode_READ(kind, data, i);
+ if (ch != ' ' && ch != '\t' && ch != '\014')
+ break;
+ }
+ if (i) {
PyObject *truncated;
- truncated = PyUnicode_FromUnicode(p, len);
+ truncated = PyUnicode_Substring(lineobj, i, PyUnicode_GET_LENGTH(lineobj));
if (truncated) {
Py_DECREF(lineobj);
lineobj = truncated;
@@ -332,7 +344,10 @@ tb_displayline(PyObject *f, PyObject *filename, int lineno, PyObject *name)
Py_DECREF(line);
if (err != 0)
return err;
- return _Py_DisplaySourceLine(f, filename, lineno, 4);
+ /* ignore errors since we can't report them, can we? */
+ if (_Py_DisplaySourceLine(f, filename, lineno, 4))
+ PyErr_Clear();
+ return err;
}
static int
@@ -402,3 +417,250 @@ PyTraceBack_Print(PyObject *v, PyObject *f)
err = tb_printinternal((PyTracebackObject *)v, f, limit);
return err;
}
+
+/* Reverse a string. For example, "abcd" becomes "dcba".
+
+ This function is signal safe. */
+
+static void
+reverse_string(char *text, const size_t len)
+{
+ char tmp;
+ size_t i, j;
+ if (len == 0)
+ return;
+ for (i=0, j=len-1; i < j; i++, j--) {
+ tmp = text[i];
+ text[i] = text[j];
+ text[j] = tmp;
+ }
+}
+
+/* Format an integer in range [0; 999999] to decimal,
+ and write it into the file fd.
+
+ This function is signal safe. */
+
+static void
+dump_decimal(int fd, int value)
+{
+ char buffer[7];
+ int len;
+ if (value < 0 || 999999 < value)
+ return;
+ len = 0;
+ do {
+ buffer[len] = '0' + (value % 10);
+ value /= 10;
+ len++;
+ } while (value);
+ reverse_string(buffer, len);
+ write(fd, buffer, len);
+}
+
+/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits,
+ and write it into the file fd.
+
+ This function is signal safe. */
+
+static void
+dump_hexadecimal(int width, unsigned long value, int fd)
+{
+ int len;
+ char buffer[sizeof(unsigned long) * 2 + 1];
+ len = 0;
+ do {
+ buffer[len] = Py_hexdigits[value & 15];
+ value >>= 4;
+ len++;
+ } while (len < width || value);
+ reverse_string(buffer, len);
+ write(fd, buffer, len);
+}
+
+/* Write an unicode object into the file fd using ascii+backslashreplace.
+
+ This function is signal safe. */
+
+static void
+dump_ascii(int fd, PyObject *text)
+{
+ PyASCIIObject *ascii = (PyASCIIObject *)text;
+ Py_ssize_t i, size;
+ int truncated;
+ int kind;
+ void *data = NULL;
+ wchar_t *wstr = NULL;
+ Py_UCS4 ch;
+
+ size = ascii->length;
+ kind = ascii->state.kind;
+ if (ascii->state.compact) {
+ if (ascii->state.ascii)
+ data = ((PyASCIIObject*)text) + 1;
+ else
+ data = ((PyCompactUnicodeObject*)text) + 1;
+ }
+ else if (kind != PyUnicode_WCHAR_KIND) {
+ data = ((PyUnicodeObject *)text)->data.any;
+ if (data == NULL)
+ return;
+ }
+ else {
+ wstr = ((PyASCIIObject *)text)->wstr;
+ if (wstr == NULL)
+ return;
+ size = ((PyCompactUnicodeObject *)text)->wstr_length;
+ }
+
+ if (MAX_STRING_LENGTH < size) {
+ size = MAX_STRING_LENGTH;
+ truncated = 1;
+ }
+ else
+ truncated = 0;
+
+ for (i=0; i < size; i++) {
+ if (kind != PyUnicode_WCHAR_KIND)
+ ch = PyUnicode_READ(kind, data, i);
+ else
+ ch = wstr[i];
+ if (ch < 128) {
+ char c = (char)ch;
+ write(fd, &c, 1);
+ }
+ else if (ch < 0xff) {
+ PUTS(fd, "\\x");
+ dump_hexadecimal(2, ch, fd);
+ }
+ else if (ch < 0xffff) {
+ PUTS(fd, "\\u");
+ dump_hexadecimal(4, ch, fd);
+ }
+ else {
+ PUTS(fd, "\\U");
+ dump_hexadecimal(8, ch, fd);
+ }
+ }
+ if (truncated)
+ PUTS(fd, "...");
+}
+
+/* Write a frame into the file fd: "File "xxx", line xxx in xxx".
+
+ This function is signal safe. */
+
+static void
+dump_frame(int fd, PyFrameObject *frame)
+{
+ PyCodeObject *code;
+ int lineno;
+
+ code = frame->f_code;
+ PUTS(fd, " File ");
+ if (code != NULL && code->co_filename != NULL
+ && PyUnicode_Check(code->co_filename))
+ {
+ write(fd, "\"", 1);
+ dump_ascii(fd, code->co_filename);
+ write(fd, "\"", 1);
+ } else {
+ PUTS(fd, "???");
+ }
+
+ /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */
+ lineno = PyCode_Addr2Line(code, frame->f_lasti);
+ PUTS(fd, ", line ");
+ dump_decimal(fd, lineno);
+ PUTS(fd, " in ");
+
+ if (code != NULL && code->co_name != NULL
+ && PyUnicode_Check(code->co_name))
+ dump_ascii(fd, code->co_name);
+ else
+ PUTS(fd, "???");
+
+ write(fd, "\n", 1);
+}
+
+static void
+dump_traceback(int fd, PyThreadState *tstate, int write_header)
+{
+ PyFrameObject *frame;
+ unsigned int depth;
+
+ if (write_header)
+ PUTS(fd, "Traceback (most recent call first):\n");
+
+ frame = _PyThreadState_GetFrame(tstate);
+ if (frame == NULL)
+ return;
+
+ depth = 0;
+ while (frame != NULL) {
+ if (MAX_FRAME_DEPTH <= depth) {
+ PUTS(fd, " ...\n");
+ break;
+ }
+ if (!PyFrame_Check(frame))
+ break;
+ dump_frame(fd, frame);
+ frame = frame->f_back;
+ depth++;
+ }
+}
+
+void
+_Py_DumpTraceback(int fd, PyThreadState *tstate)
+{
+ dump_traceback(fd, tstate, 1);
+}
+
+/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if
+ is_current is true, "Thread 0xHHHH:\n" otherwise.
+
+ This function is signal safe. */
+
+static void
+write_thread_id(int fd, PyThreadState *tstate, int is_current)
+{
+ if (is_current)
+ PUTS(fd, "Current thread 0x");
+ else
+ PUTS(fd, "Thread 0x");
+ dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd);
+ PUTS(fd, ":\n");
+}
+
+const char*
+_Py_DumpTracebackThreads(int fd, PyInterpreterState *interp,
+ PyThreadState *current_thread)
+{
+ PyThreadState *tstate;
+ unsigned int nthreads;
+
+ /* Get the current interpreter from the current thread */
+ tstate = PyInterpreterState_ThreadHead(interp);
+ if (tstate == NULL)
+ return "unable to get the thread head state";
+
+ /* Dump the traceback of each thread */
+ tstate = PyInterpreterState_ThreadHead(interp);
+ nthreads = 0;
+ do
+ {
+ if (nthreads != 0)
+ write(fd, "\n", 1);
+ if (nthreads >= MAX_NTHREADS) {
+ PUTS(fd, "...\n");
+ break;
+ }
+ write_thread_id(fd, tstate, tstate == current_thread);
+ dump_traceback(fd, tstate, 0);
+ tstate = PyThreadState_Next(tstate);
+ nthreads++;
+ } while (tstate != NULL);
+
+ return NULL;
+}
+
diff --git a/README b/README
index b13806b..cef7384 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This is Python version 3.2.3
+This is Python version 3.3.0
============================
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
@@ -15,6 +15,8 @@ Build Instructions
On Unix, Linux, BSD, OSX, and Cygwin:
+New text
+
./configure
make
make test
@@ -50,9 +52,9 @@ What's New
----------
We try to have a comprehensive overview of the changes in the "What's New in
-Python 3.2" document, found at
+Python 3.3" document, found at
- http://docs.python.org/3.2/whatsnew/3.2.html
+ http://docs.python.org/3.3/whatsnew/3.3.html
For a more detailed change log, read Misc/NEWS (though this file, too, is
incomplete, and also doesn't list anything merged in from the 2.7 release under
@@ -65,9 +67,9 @@ entitled "Installing multiple versions".
Documentation
-------------
-Documentation for Python 3.2 is online, updated daily:
+Documentation for Python 3.3 is online, updated daily:
- http://docs.python.org/3.2/
+ http://docs.python.org/3.3/
It can also be downloaded in many formats for faster access. The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
@@ -85,18 +87,16 @@ backported versions of certain key Python 3.x features.
A source-to-source translation tool, "2to3", can take care of the mundane task
of converting large amounts of source code. It is not a complete solution but
is complemented by the deprecation warnings in 2.6. See
-http://docs.python.org/3.2/library/2to3.html for more information.
+http://docs.python.org/3.3/library/2to3.html for more information.
Testing
-------
-To test the interpreter, type "make test" in the top-level directory. This runs
-the test set twice (once with no compiled files, once with the compiled files
-left by the previous test run). The test set produces some output. You can
-generally ignore the messages about skipped tests due to optional features which
-can't be imported. If a message is printed about a failed test or a traceback
-or core dump is produced, something is wrong.
+To test the interpreter, type "make test" in the top-level directory. The test
+set produces some output. You can generally ignore the messages about skipped
+tests due to optional features which can't be imported. If a message is printed
+about a failed test or a traceback or core dump is produced, something is wrong.
By default, tests are prevented from overusing resources like disk space and
memory. To enable these tests, run "make testall".
@@ -125,8 +125,8 @@ same prefix you must decide which version (if any) is your "primary" version.
Install that version using "make install". Install all other versions using
"make altinstall".
-For example, if you want to install Python 2.5, 2.6 and 3.2 with 2.6 being the
-primary version, you would execute "make install" in your 2.6 build directory
+For example, if you want to install Python 2.6, 2.7 and 3.3 with 2.7 being the
+primary version, you would execute "make install" in your 2.7 build directory
and "make altinstall" in the others.
@@ -161,7 +161,7 @@ http://www.python.org/dev/peps/.
Release Schedule
----------------
-See PEP 392 for release details: http://www.python.org/dev/peps/pep-0392/
+See PEP 398 for release details: http://www.python.org/dev/peps/pep-0398/
Copyright and License Information
diff --git a/Tools/README b/Tools/README
index c1f89ba..0d961de 100644
--- a/Tools/README
+++ b/Tools/README
@@ -3,7 +3,7 @@ while building or extending Python.
buildbot Batchfiles for running on Windows buildslaves.
-ccbench A Python concurrency benchmark.
+ccbench A Python threads-based concurrency benchmark. (*)
demo Several Python programming demos.
@@ -17,13 +17,13 @@ i18n Tools for internationalization. pygettext.py
and msgfmt.py generates a binary message catalog
from a catalog in text format.
-iobench Benchmark for the new Python I/O system.
+iobench Benchmark for the new Python I/O system. (*)
msi Support for packaging Python as an MSI package on Windows.
parser Un-parsing tool to generate code from an AST.
-pybench Comprehensive Python benchmarking suite.
+pybench Low-level benchmarking for the Python evaluation loop. (*)
pynche A Tkinter-based color editor.
@@ -32,6 +32,9 @@ scripts A number of useful single-file programs, e.g. tabnanny.py
tabs and spaces, and 2to3, which converts Python 2 code
to Python 3 code.
+stringbench A suite of micro-benchmarks for various operations on
+ strings (both 8-bit and unicode). (*)
+
test2to3 A demonstration of how to use 2to3 transparently in setup.py.
unicode Tools for generating unicodedata and codecs from unicode.org
@@ -40,3 +43,6 @@ unicode Tools for generating unicodedata and codecs from unicode.org
unittestgui A Tkinter based GUI test runner for unittest, with test
discovery.
+
+
+(*) A generic benchmark suite is maintained separately at http://hg.python.org/benchmarks/
diff --git a/Tools/buildbot/build-amd64.bat b/Tools/buildbot/build-amd64.bat
index 8713b38..7ee7b2d 100644
--- a/Tools/buildbot/build-amd64.bat
+++ b/Tools/buildbot/build-amd64.bat
@@ -1,7 +1,7 @@
@rem Used by the buildbot "compile" step.
-set HOST_PYTHON="%CD%\PCbuild\amd64\python_d.exe"
cmd /c Tools\buildbot\external-amd64.bat
-call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
+call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
cmd /c Tools\buildbot\clean-amd64.bat
-vcbuild /useenv PCbuild\kill_python.vcproj "Debug|x64" && PCbuild\amd64\kill_python_d.exe
-vcbuild PCbuild\pcbuild.sln "Debug|x64"
+msbuild PCbuild\kill_python.vcxproj /p:Configuration=Debug /p:PlatformTarget=x64
+PCbuild\amd64\kill_python_d.exe
+msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64
diff --git a/Tools/buildbot/build.bat b/Tools/buildbot/build.bat
index ab3ea7d..c93cfd5 100644
--- a/Tools/buildbot/build.bat
+++ b/Tools/buildbot/build.bat
@@ -1,7 +1,8 @@
@rem Used by the buildbot "compile" step.
cmd /c Tools\buildbot\external.bat
-call "%VS90COMNTOOLS%vsvars32.bat"
+call "%VS100COMNTOOLS%vsvars32.bat"
cmd /c Tools\buildbot\clean.bat
-vcbuild /useenv PCbuild\kill_python.vcproj "Debug|Win32" && PCbuild\kill_python_d.exe
-vcbuild /useenv PCbuild\pcbuild.sln "Debug|Win32"
+msbuild PCbuild\kill_python.vcxproj /p:Configuration=Debug /p:PlatformTarget=x86
+PCbuild\kill_python_d.exe
+msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32
diff --git a/Tools/buildbot/buildmsi.bat b/Tools/buildbot/buildmsi.bat
index 4430cb8..ae93e67 100644
--- a/Tools/buildbot/buildmsi.bat
+++ b/Tools/buildbot/buildmsi.bat
@@ -2,10 +2,10 @@
cmd /c Tools\buildbot\external.bat
@rem build release versions of things
-call "%VS90COMNTOOLS%vsvars32.bat"
+call "%VS100COMNTOOLS%vsvars32.bat"
@rem build Python
-vcbuild /useenv PCbuild\pcbuild.sln "Release|Win32"
+msbuild /p:useenv=true PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=Win32
@rem build the documentation
bash.exe -c 'cd Doc;make PYTHON=python2.5 update htmlhelp'
diff --git a/Tools/buildbot/clean-amd64.bat b/Tools/buildbot/clean-amd64.bat
index 715805a..24660af 100644
--- a/Tools/buildbot/clean-amd64.bat
+++ b/Tools/buildbot/clean-amd64.bat
@@ -1,10 +1,10 @@
@rem Used by the buildbot "clean" step.
-call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
+call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
@echo Deleting .pyc/.pyo files ...
del /s Lib\*.pyc Lib\*.pyo
@echo Deleting test leftovers ...
rmdir /s /q build
cd PCbuild
-vcbuild /clean pcbuild.sln "Release|x64"
-vcbuild /clean pcbuild.sln "Debug|x64"
+msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64
+msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64
cd ..
diff --git a/Tools/buildbot/clean.bat b/Tools/buildbot/clean.bat
index 0c04b8e..218facc 100644
--- a/Tools/buildbot/clean.bat
+++ b/Tools/buildbot/clean.bat
@@ -1,8 +1,8 @@
@rem Used by the buildbot "clean" step.
-call "%VS90COMNTOOLS%vsvars32.bat"
+call "%VS100COMNTOOLS%vsvars32.bat"
@echo Deleting test leftovers ...
rmdir /s /q build
cd PCbuild
-vcbuild /clean pcbuild.sln "Release|Win32"
-vcbuild /clean pcbuild.sln "Debug|Win32"
+msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x86
+msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x86
cd ..
diff --git a/Tools/buildbot/external-amd64.bat b/Tools/buildbot/external-amd64.bat
index 954238e..d2ff255 100644
--- a/Tools/buildbot/external-amd64.bat
+++ b/Tools/buildbot/external-amd64.bat
@@ -2,20 +2,20 @@
@rem Assume we start inside the Python source directory
call "Tools\buildbot\external-common.bat"
-call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
+call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
if not exist tcltk64\bin\tcl85g.dll (
- cd tcl-8.5.9.0\win
+ cd tcl-8.5.11.0\win
nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all
nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install
cd ..\..
)
if not exist tcltk64\bin\tk85g.dll (
- cd tk-8.5.9.0\win
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.9.0 clean
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.9.0 all
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.9.0 install
+ cd tk-8.5.11.0\win
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 clean
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 all
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 install
cd ..\..
)
diff --git a/Tools/buildbot/external-common.bat b/Tools/buildbot/external-common.bat
index 2165b8a..4e9fe41 100644
--- a/Tools/buildbot/external-common.bat
+++ b/Tools/buildbot/external-common.bat
@@ -14,8 +14,8 @@ cd ..
@rem if exist tk8.4.16 rd /s/q tk8.4.16
@rem if exist tk-8.4.18.1 rd /s/q tk-8.4.18.1
@rem if exist db-4.4.20 rd /s/q db-4.4.20
-@rem if exist openssl-1.0.0j rd /s/q openssl-1.0.0j
-@rem if exist sqlite-3.7.4 rd /s/q sqlite-3.7.4
+@rem if exist openssl-1.0.1c rd /s/q openssl-1.0.1c
+@rem if exist sqlite-3.7.12 rd /s/q sqlite-3.7.12
@rem bzip
if not exist bzip2-1.0.6 (
@@ -24,17 +24,25 @@ if not exist bzip2-1.0.6 (
)
@rem OpenSSL
-if not exist openssl-1.0.0j svn export http://svn.python.org/projects/external/openssl-1.0.0j
+if not exist openssl-1.0.1c (
+ rd /s/q openssl-1.0.0j
+ svn export http://svn.python.org/projects/external/openssl-1.0.1c
+)
@rem tcl/tk
-if not exist tcl-8.5.9.0 (
+if not exist tcl-8.5.11.0 (
rd /s/q tcltk tcltk64
- svn export http://svn.python.org/projects/external/tcl-8.5.9.0
+ svn export http://svn.python.org/projects/external/tcl-8.5.11.0
)
-if not exist tk-8.5.9.0 svn export http://svn.python.org/projects/external/tk-8.5.9.0
+if not exist tk-8.5.11.0 svn export http://svn.python.org/projects/external/tk-8.5.11.0
@rem sqlite3
-if not exist sqlite-3.7.4 (
- rd /s/q sqlite-source-3.6.21
- svn export http://svn.python.org/projects/external/sqlite-3.7.4
+if not exist sqlite-3.7.12 (
+ rd /s/q sqlite-source-3.7.4
+ svn export http://svn.python.org/projects/external/sqlite-3.7.12
+)
+
+@rem lzma
+if not exist xz-5.0.3 (
+ svn export http://svn.python.org/projects/external/xz-5.0.3
)
diff --git a/Tools/buildbot/external.bat b/Tools/buildbot/external.bat
index e958fd6..ed5c10e 100644
--- a/Tools/buildbot/external.bat
+++ b/Tools/buildbot/external.bat
@@ -2,20 +2,20 @@
@rem Assume we start inside the Python source directory
call "Tools\buildbot\external-common.bat"
-call "%VS90COMNTOOLS%\vsvars32.bat"
+call "%VS100COMNTOOLS%\vsvars32.bat"
if not exist tcltk\bin\tcl85g.dll (
@rem all and install need to be separate invocations, otherwise nmakehlp is not found on install
- cd tcl-8.5.9.0\win
+ cd tcl-8.5.11.0\win
nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 INSTALLDIR=..\..\tcltk clean all
nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk install
cd ..\..
)
if not exist tcltk\bin\tk85g.dll (
- cd tk-8.5.9.0\win
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.9.0 clean
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.9.0 all
- nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.9.0 install
+ cd tk-8.5.11.0\win
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 clean
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 all
+ nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 install
cd ..\..
)
diff --git a/Tools/ccbench/ccbench.py b/Tools/ccbench/ccbench.py
index 9f7118f..60cec3e 100644
--- a/Tools/ccbench/ccbench.py
+++ b/Tools/ccbench/ccbench.py
@@ -10,7 +10,6 @@ ccbench, a Python concurrency benchmark.
import time
import os
import sys
-import functools
import itertools
import threading
import subprocess
@@ -435,70 +434,70 @@ def run_bandwidth_client(**kwargs):
def run_bandwidth_test(func, args, nthreads):
# Create a listening socket to receive the packets. We use UDP which should
# be painlessly cross-platform.
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.bind(("127.0.0.1", 0))
- addr = sock.getsockname()
+ with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
+ sock.bind(("127.0.0.1", 0))
+ addr = sock.getsockname()
- duration = BANDWIDTH_DURATION
- packet_size = BANDWIDTH_PACKET_SIZE
-
- results = []
- threads = []
- end_event = []
- start_cond = threading.Condition()
- started = False
- if nthreads > 0:
- # Warm up
- func(*args)
+ duration = BANDWIDTH_DURATION
+ packet_size = BANDWIDTH_PACKET_SIZE
results = []
- loop = TimedLoop(func, args)
- ready = []
- ready_cond = threading.Condition()
-
- def run():
+ threads = []
+ end_event = []
+ start_cond = threading.Condition()
+ started = False
+ if nthreads > 0:
+ # Warm up
+ func(*args)
+
+ results = []
+ loop = TimedLoop(func, args)
+ ready = []
+ ready_cond = threading.Condition()
+
+ def run():
+ with ready_cond:
+ ready.append(None)
+ ready_cond.notify()
+ with start_cond:
+ while not started:
+ start_cond.wait()
+ loop(start_time, duration * 1.5, end_event, do_yield=False)
+
+ for i in range(nthreads):
+ threads.append(threading.Thread(target=run))
+ for t in threads:
+ t.setDaemon(True)
+ t.start()
+ # Wait for threads to be ready
with ready_cond:
- ready.append(None)
- ready_cond.notify()
- with start_cond:
- while not started:
- start_cond.wait()
- loop(start_time, duration * 1.5, end_event, do_yield=False)
-
- for i in range(nthreads):
- threads.append(threading.Thread(target=run))
- for t in threads:
- t.setDaemon(True)
- t.start()
- # Wait for threads to be ready
- with ready_cond:
- while len(ready) < nthreads:
- ready_cond.wait()
-
- # Run the client and wait for the first packet to arrive before
- # unblocking the background threads.
- process = run_bandwidth_client(addr=addr,
- packet_size=packet_size,
- duration=duration)
- _time = time.time
- # This will also wait for the parent to be ready
- s = _recv(sock, packet_size)
- remote_addr = eval(s.partition('#')[0])
-
- with start_cond:
- start_time = _time()
- started = True
- start_cond.notify(nthreads)
-
- n = 0
- first_time = None
- while not end_event and BW_END not in s:
- _sendto(sock, s, remote_addr)
+ while len(ready) < nthreads:
+ ready_cond.wait()
+
+ # Run the client and wait for the first packet to arrive before
+ # unblocking the background threads.
+ process = run_bandwidth_client(addr=addr,
+ packet_size=packet_size,
+ duration=duration)
+ _time = time.time
+ # This will also wait for the parent to be ready
s = _recv(sock, packet_size)
- if first_time is None:
- first_time = _time()
- n += 1
- end_time = _time()
+ remote_addr = eval(s.partition('#')[0])
+
+ with start_cond:
+ start_time = _time()
+ started = True
+ start_cond.notify(nthreads)
+
+ n = 0
+ first_time = None
+ while not end_event and BW_END not in s:
+ _sendto(sock, s, remote_addr)
+ s = _recv(sock, packet_size)
+ if first_time is None:
+ first_time = _time()
+ n += 1
+ end_time = _time()
end_event.append(None)
for t in threads:
diff --git a/Tools/demo/life.py b/Tools/demo/life.py
index dfb9ab8..fc4cb49 100755
--- a/Tools/demo/life.py
+++ b/Tools/demo/life.py
@@ -46,38 +46,38 @@ class LifeBoard:
self.state = {}
self.scr = scr
Y, X = self.scr.getmaxyx()
- self.X, self.Y = X-2, Y-2-1
+ self.X, self.Y = X - 2, Y - 2 - 1
self.char = char
self.scr.clear()
# Draw a border around the board
- border_line = '+'+(self.X*'-')+'+'
+ border_line = '+' + (self.X * '-') + '+'
self.scr.addstr(0, 0, border_line)
- self.scr.addstr(self.Y+1, 0, border_line)
+ self.scr.addstr(self.Y + 1, 0, border_line)
for y in range(0, self.Y):
- self.scr.addstr(1+y, 0, '|')
- self.scr.addstr(1+y, self.X+1, '|')
+ self.scr.addstr(1 + y, 0, '|')
+ self.scr.addstr(1 + y, self.X + 1, '|')
self.scr.refresh()
def set(self, y, x):
"""Set a cell to the live state"""
- if x<0 or self.X<=x or y<0 or self.Y<=y:
- raise ValueError("Coordinates out of range %i,%i"% (y, x))
- self.state[x,y] = 1
+ if x < 0 or self.X <= x or y < 0 or self.Y <= y:
+ raise ValueError("Coordinates out of range %i,%i" % (y, x))
+ self.state[x, y] = 1
def toggle(self, y, x):
"""Toggle a cell's state between live and dead"""
if x < 0 or self.X <= x or y < 0 or self.Y <= y:
- raise ValueError("Coordinates out of range %i,%i"% (y, x))
+ raise ValueError("Coordinates out of range %i,%i" % (y, x))
if (x, y) in self.state:
del self.state[x, y]
- self.scr.addch(y+1, x+1, ' ')
+ self.scr.addch(y + 1, x + 1, ' ')
else:
self.state[x, y] = 1
if curses.has_colors():
# Let's pick a random color!
self.scr.attrset(curses.color_pair(random.randrange(1, 7)))
- self.scr.addch(y+1, x+1, self.char)
+ self.scr.addch(y + 1, x + 1, self.char)
self.scr.attrset(0)
self.scr.refresh()
@@ -88,43 +88,46 @@ class LifeBoard:
def display(self, update_board=True):
"""Display the whole board, optionally computing one generation"""
- M,N = self.X, self.Y
+ M, N = self.X, self.Y
if not update_board:
for i in range(0, M):
for j in range(0, N):
- if (i,j) in self.state:
- self.scr.addch(j+1, i+1, self.char)
+ if (i, j) in self.state:
+ self.scr.addch(j + 1, i + 1, self.char)
else:
- self.scr.addch(j+1, i+1, ' ')
+ self.scr.addch(j + 1, i + 1, ' ')
self.scr.refresh()
return
d = {}
self.boring = 1
for i in range(0, M):
- L = range( max(0, i-1), min(M, i+2) )
+ L = range(max(0, i - 1), min(M, i + 2))
for j in range(0, N):
s = 0
- live = (i,j) in self.state
- for k in range( max(0, j-1), min(N, j+2) ):
+ live = (i, j) in self.state
+ for k in range(max(0, j - 1), min(N, j + 2)):
for l in L:
- if (l,k) in self.state:
+ if (l, k) in self.state:
s += 1
s -= live
if s == 3:
# Birth
- d[i,j] = 1
+ d[i, j] = 1
if curses.has_colors():
# Let's pick a random color!
self.scr.attrset(curses.color_pair(
random.randrange(1, 7)))
- self.scr.addch(j+1, i+1, self.char)
+ self.scr.addch(j + 1, i + 1, self.char)
self.scr.attrset(0)
- if not live: self.boring = 0
- elif s == 2 and live: d[i,j] = 1 # Survival
+ if not live:
+ self.boring = 0
+ elif s == 2 and live:
+ # Survival
+ d[i, j] = 1
elif live:
# Death
- self.scr.addch(j+1, i+1, ' ')
+ self.scr.addch(j + 1, i + 1, ' ')
self.boring = 0
self.state = d
self.scr.refresh()
@@ -135,16 +138,17 @@ class LifeBoard:
for i in range(0, self.X):
for j in range(0, self.Y):
if random.random() > 0.5:
- self.set(j,i)
+ self.set(j, i)
def erase_menu(stdscr, menu_y):
"Clear the space where the menu resides"
stdscr.move(menu_y, 0)
stdscr.clrtoeol()
- stdscr.move(menu_y+1, 0)
+ stdscr.move(menu_y + 1, 0)
stdscr.clrtoeol()
+
def display_menu(stdscr, menu_y):
"Display the menu of possible keystroke commands"
erase_menu(stdscr, menu_y)
@@ -154,15 +158,16 @@ def display_menu(stdscr, menu_y):
stdscr.attrset(curses.color_pair(1))
stdscr.addstr(menu_y, 4,
'Use the cursor keys to move, and space or Enter to toggle a cell.')
- stdscr.addstr(menu_y+1, 4,
+ stdscr.addstr(menu_y + 1, 4,
'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit')
stdscr.attrset(0)
+
def keyloop(stdscr):
# Clear the screen and display the menu of keys
stdscr.clear()
stdscr_y, stdscr_x = stdscr.getmaxyx()
- menu_y = (stdscr_y-3)-1
+ menu_y = (stdscr_y - 3) - 1
display_menu(stdscr, menu_y)
# If color, then initialize the color pairs
@@ -179,16 +184,16 @@ def keyloop(stdscr):
curses.mousemask(curses.BUTTON1_CLICKED)
# Allocate a subwindow for the Life board and create the board object
- subwin = stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0)
+ subwin = stdscr.subwin(stdscr_y - 3, stdscr_x, 0, 0)
board = LifeBoard(subwin, char=ord('*'))
board.display(update_board=False)
# xpos, ypos are the cursor's position
- xpos, ypos = board.X//2, board.Y//2
+ xpos, ypos = board.X // 2, board.Y // 2
# Main loop:
while True:
- stdscr.move(1+ypos, 1+xpos) # Move the cursor
+ stdscr.move(1 + ypos, 1 + xpos) # Move the cursor
c = stdscr.getch() # Get a keystroke
if 0 < c < 256:
c = chr(c)
@@ -224,15 +229,21 @@ def keyloop(stdscr):
board.display(update_board=False)
elif c in 'Ss':
board.display()
- else: pass # Ignore incorrect keys
- elif c == curses.KEY_UP and ypos > 0: ypos -= 1
- elif c == curses.KEY_DOWN and ypos < board.Y-1: ypos += 1
- elif c == curses.KEY_LEFT and xpos > 0: xpos -= 1
- elif c == curses.KEY_RIGHT and xpos < board.X-1: xpos += 1
+ else:
+ # Ignore incorrect keys
+ pass
+ elif c == curses.KEY_UP and ypos > 0:
+ ypos -= 1
+ elif c == curses.KEY_DOWN and ypos + 1 < board.Y:
+ ypos += 1
+ elif c == curses.KEY_LEFT and xpos > 0:
+ xpos -= 1
+ elif c == curses.KEY_RIGHT and xpos + 1 < board.X:
+ xpos += 1
elif c == curses.KEY_MOUSE:
mouse_id, mouse_x, mouse_y, mouse_z, button_state = curses.getmouse()
- if (mouse_x > 0 and mouse_x < board.X+1 and
- mouse_y > 0 and mouse_y < board.Y+1):
+ if (mouse_x > 0 and mouse_x < board.X + 1 and
+ mouse_y > 0 and mouse_y < board.Y + 1):
xpos = mouse_x - 1
ypos = mouse_y - 1
board.toggle(ypos, xpos)
@@ -245,7 +256,7 @@ def keyloop(stdscr):
def main(stdscr):
- keyloop(stdscr) # Enter the main loop
+ keyloop(stdscr) # Enter the main loop
if __name__ == '__main__':
curses.wrapper(main)
diff --git a/Tools/demo/ss1.py b/Tools/demo/ss1.py
index 4cea667..71c9be8 100755
--- a/Tools/demo/ss1.py
+++ b/Tools/demo/ss1.py
@@ -812,7 +812,6 @@ class SheetGUI:
def test_basic():
"Basic non-gui self-test."
- import os
a = Sheet()
for x in range(1, 11):
for y in range(1, 11):
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index 8bbbb10..368a7d5 100644
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -49,6 +49,11 @@ import sys
_type_char_ptr = gdb.lookup_type('char').pointer() # char*
_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned char*
_type_void_ptr = gdb.lookup_type('void').pointer() # void*
+_type_unsigned_short_ptr = gdb.lookup_type('unsigned short').pointer()
+_type_unsigned_int_ptr = gdb.lookup_type('unsigned int').pointer()
+
+# value computed later, see PyUnicodeObjectPtr.proxy()
+_is_pep393 = None
SIZEOF_VOID_P = _type_void_ptr.sizeof
@@ -322,7 +327,6 @@ class PyObjectPtr(object):
name_map = {'bool': PyBoolObjectPtr,
'classobj': PyClassObjectPtr,
- 'instance': PyInstanceObjectPtr,
'NoneType': PyNoneStructPtr,
'frame': PyFrameObjectPtr,
'set' : PySetObjectPtr,
@@ -396,7 +400,7 @@ class ProxyAlreadyVisited(object):
def _write_instance_repr(out, visited, name, pyop_attrdict, address):
- '''Shared code for use by old-style and new-style classes:
+ '''Shared code for use by all classes:
write a representation to file-like object "out"'''
out.write('<')
out.write(name)
@@ -479,7 +483,7 @@ class HeapTypeObjectPtr(PyObjectPtr):
def proxyval(self, visited):
'''
- Support for new-style classes.
+ Support for classes.
Currently we just locate the dictionary using a transliteration to
python of _PyObject_GetDictPtr, ignoring descriptors
@@ -496,7 +500,7 @@ class HeapTypeObjectPtr(PyObjectPtr):
attr_dict = {}
tp_name = self.safe_tp_name()
- # New-style class:
+ # Class:
return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
def write_repr(self, out, visited):
@@ -630,9 +634,14 @@ class PyDictObjectPtr(PyObjectPtr):
Yields a sequence of (PyObjectPtr key, PyObjectPtr value) pairs,
analagous to dict.iteritems()
'''
- for i in safe_range(self.field('ma_mask') + 1):
- ep = self.field('ma_table') + i
- pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
+ keys = self.field('ma_keys')
+ values = self.field('ma_values')
+ for i in safe_range(keys['dk_size']):
+ ep = keys['dk_entries'].address + i
+ if long(values):
+ pyop_value = PyObjectPtr.from_pyobject_ptr(values[i])
+ else:
+ pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
if not pyop_value.is_null():
pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
yield (pyop_key, pyop_value)
@@ -668,44 +677,6 @@ class PyDictObjectPtr(PyObjectPtr):
pyop_value.write_repr(out, visited)
out.write('}')
-class PyInstanceObjectPtr(PyObjectPtr):
- _typename = 'PyInstanceObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- in_dict = self.pyop_field('in_dict').proxyval(visited)
-
- # Old-style class:
- return InstanceProxy(cl_name, in_dict, long(self._gdbval))
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('<...>')
- return
- visited.add(self.as_address())
-
- # Old-style class:
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- pyop_in_dict = self.pyop_field('in_dict')
-
- _write_instance_repr(out, visited,
- cl_name, pyop_in_dict, self.as_address())
-
class PyListObjectPtr(PyObjectPtr):
_typename = 'PyListObject'
@@ -1123,15 +1094,46 @@ class PyUnicodeObjectPtr(PyObjectPtr):
return _type_Py_UNICODE.sizeof
def proxyval(self, visited):
- # From unicodeobject.h:
- # Py_ssize_t length; /* Length of raw Unicode data in buffer */
- # Py_UNICODE *str; /* Raw Unicode buffer */
- field_length = long(self.field('length'))
- field_str = self.field('str')
+ global _is_pep393
+ if _is_pep393 is None:
+ fields = gdb.lookup_type('PyUnicodeObject').target().fields()
+ _is_pep393 = 'data' in [f.name for f in fields]
+ if _is_pep393:
+ # Python 3.3 and newer
+ may_have_surrogates = False
+ compact = self.field('_base')
+ ascii = compact['_base']
+ state = ascii['state']
+ is_compact_ascii = (int(state['ascii']) and int(state['compact']))
+ if not int(state['ready']):
+ # string is not ready
+ field_length = long(compact['wstr_length'])
+ may_have_surrogates = True
+ field_str = ascii['wstr']
+ else:
+ field_length = long(ascii['length'])
+ if is_compact_ascii:
+ field_str = ascii.address + 1
+ elif int(state['compact']):
+ field_str = compact.address + 1
+ else:
+ field_str = self.field('data')['any']
+ repr_kind = int(state['kind'])
+ if repr_kind == 1:
+ field_str = field_str.cast(_type_unsigned_char_ptr)
+ elif repr_kind == 2:
+ field_str = field_str.cast(_type_unsigned_short_ptr)
+ elif repr_kind == 4:
+ field_str = field_str.cast(_type_unsigned_int_ptr)
+ else:
+ # Python 3.2 and earlier
+ field_length = long(self.field('length'))
+ field_str = self.field('str')
+ may_have_surrogates = self.char_width() == 2
# Gather a list of ints from the Py_UNICODE array; these are either
- # UCS-2 or UCS-4 code points:
- if self.char_width() > 2:
+ # UCS-1, UCS-2 or UCS-4 code points:
+ if not may_have_surrogates:
Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)]
else:
# A more elaborate routine if sizeof(Py_UNICODE) is 2 in the
@@ -1330,7 +1332,7 @@ that this python file is installed to the same path as the library (or its
/usr/lib/debug/usr/lib/libpython2.6.so.1.0.debug-gdb.py
"""
def register (obj):
- if obj == None:
+ if obj is None:
obj = gdb
# Wire up the pretty-printer
@@ -1388,6 +1390,23 @@ class Frame(object):
iter_frame = iter_frame.newer()
return index
+ # We divide frames into:
+ # - "python frames":
+ # - "bytecode frames" i.e. PyEval_EvalFrameEx
+ # - "other python frames": things that are of interest from a python
+ # POV, but aren't bytecode (e.g. GC, GIL)
+ # - everything else
+
+ def is_python_frame(self):
+ '''Is this a PyEval_EvalFrameEx frame, or some other important
+ frame? (see is_other_python_frame for what "important" means in this
+ context)'''
+ if self.is_evalframeex():
+ return True
+ if self.is_other_python_frame():
+ return True
+ return False
+
def is_evalframeex(self):
'''Is this a PyEval_EvalFrameEx frame?'''
if self._gdbframe.name() == 'PyEval_EvalFrameEx':
@@ -1404,6 +1423,49 @@ class Frame(object):
return False
+ def is_other_python_frame(self):
+ '''Is this frame worth displaying in python backtraces?
+ Examples:
+ - waiting on the GIL
+ - garbage-collecting
+ - within a CFunction
+ If it is, return a descriptive string
+ For other frames, return False
+ '''
+ if self.is_waiting_for_gil():
+ return 'Waiting for the GIL'
+ elif self.is_gc_collect():
+ return 'Garbage-collecting'
+ else:
+ # Detect invocations of PyCFunction instances:
+ older = self.older()
+ if older and older._gdbframe.name() == 'PyCFunction_Call':
+ # Within that frame:
+ # "func" is the local containing the PyObject* of the
+ # PyCFunctionObject instance
+ # "f" is the same value, but cast to (PyCFunctionObject*)
+ # "self" is the (PyObject*) of the 'self'
+ try:
+ # Use the prettyprinter for the func:
+ func = older._gdbframe.read_var('func')
+ return str(func)
+ except RuntimeError:
+ return 'PyCFunction invocation (unable to read "func")'
+
+ # This frame isn't worth reporting:
+ return False
+
+ def is_waiting_for_gil(self):
+ '''Is this frame waiting on the GIL?'''
+ # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
+ name = self._gdbframe.name()
+ if name:
+ return name.startswith('pthread_cond_timedwait')
+
+ def is_gc_collect(self):
+ '''Is this frame "collect" within the the garbage-collector?'''
+ return self._gdbframe.name() == 'collect'
+
def get_pyop(self):
try:
f = self._gdbframe.read_var('f')
@@ -1433,8 +1495,22 @@ class Frame(object):
@classmethod
def get_selected_python_frame(cls):
- '''Try to obtain the Frame for the python code in the selected frame,
- or None'''
+ '''Try to obtain the Frame for the python-related code in the selected
+ frame, or None'''
+ frame = cls.get_selected_frame()
+
+ while frame:
+ if frame.is_python_frame():
+ return frame
+ frame = frame.older()
+
+ # Not found:
+ return None
+
+ @classmethod
+ def get_selected_bytecode_frame(cls):
+ '''Try to obtain the Frame for the python bytecode interpreter in the
+ selected GDB frame, or None'''
frame = cls.get_selected_frame()
while frame:
@@ -1458,7 +1534,11 @@ class Frame(object):
else:
sys.stdout.write('#%i (unable to read python frame information)\n' % self.get_index())
else:
- sys.stdout.write('#%i\n' % self.get_index())
+ info = self.is_other_python_frame()
+ if info:
+ sys.stdout.write('#%i %s\n' % (self.get_index(), info))
+ else:
+ sys.stdout.write('#%i\n' % self.get_index())
def print_traceback(self):
if self.is_evalframeex():
@@ -1472,7 +1552,11 @@ class Frame(object):
else:
sys.stdout.write(' (unable to read python frame information)\n')
else:
- sys.stdout.write(' (not a python frame)\n')
+ info = self.is_other_python_frame()
+ if info:
+ sys.stdout.write(' %s\n' % info)
+ else:
+ sys.stdout.write(' (not a python frame)\n')
class PyList(gdb.Command):
'''List the current Python source code, if any
@@ -1508,9 +1592,10 @@ class PyList(gdb.Command):
if m:
start, end = map(int, m.groups())
- frame = Frame.get_selected_python_frame()
+ # py-list requires an actual PyEval_EvalFrameEx frame:
+ frame = Frame.get_selected_bytecode_frame()
if not frame:
- print 'Unable to locate python frame'
+ print 'Unable to locate gdb frame for python bytecode interpreter'
return
pyop = frame.get_pyop()
@@ -1562,7 +1647,7 @@ def move_in_stack(move_up):
if not iter_frame:
break
- if iter_frame.is_evalframeex():
+ if iter_frame.is_python_frame():
# Result:
if iter_frame.select():
iter_frame.print_summary()
@@ -1616,7 +1701,7 @@ class PyBacktraceFull(gdb.Command):
def invoke(self, args, from_tty):
frame = Frame.get_selected_python_frame()
while frame:
- if frame.is_evalframeex():
+ if frame.is_python_frame():
frame.print_summary()
frame = frame.older()
@@ -1635,7 +1720,7 @@ class PyBacktrace(gdb.Command):
sys.stdout.write('Traceback (most recent call first):\n')
frame = Frame.get_selected_python_frame()
while frame:
- if frame.is_evalframeex():
+ if frame.is_python_frame():
frame.print_traceback()
frame = frame.older()
diff --git a/Tools/hg/hgtouch.py b/Tools/hg/hgtouch.py
new file mode 100644
index 0000000..5961a10
--- /dev/null
+++ b/Tools/hg/hgtouch.py
@@ -0,0 +1,103 @@
+"""Bring time stamps of generated checked-in files into the right order
+
+A versioned configuration file .hgtouch specifies generated files, in the
+syntax of make rules.
+
+ output: input1 input2
+
+In addition to the dependency syntax, #-comments are supported.
+"""
+import errno
+import os
+
+def parse_config(repo):
+ try:
+ fp = repo.wfile(".hgtouch")
+ except IOError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ return {}
+ result = {}
+ with fp:
+ for line in fp:
+ # strip comments
+ line = line.split('#')[0].strip()
+ if ':' not in line:
+ continue
+ outputs, inputs = line.split(':', 1)
+ outputs = outputs.split()
+ inputs = inputs.split()
+ for o in outputs:
+ try:
+ result[o].extend(inputs)
+ except KeyError:
+ result[o] = inputs
+ return result
+
+def check_rule(ui, repo, modified, output, inputs):
+ f_output = repo.wjoin(output)
+ try:
+ o_time = os.stat(f_output).st_mtime
+ except OSError:
+ ui.warn("Generated file %s does not exist\n" % output)
+ return False
+ need_touch = False
+ backdate = None
+ backdate_source = None
+ for i in inputs:
+ f_i = repo.wjoin(i)
+ try:
+ i_time = os.stat(f_i).st_mtime
+ except OSError:
+ ui.warn(".hgtouch input file %s does not exist\n" % i)
+ return False
+ if i in modified:
+ # input is modified. Need to backdate at least to i_time
+ if backdate is None or backdate > i_time:
+ backdate = i_time
+ backdate_source = i
+ continue
+ if o_time <= i_time:
+ # generated file is older, touch
+ need_touch = True
+ if backdate is not None:
+ ui.warn("Input %s for file %s locally modified\n" % (backdate_source, output))
+ # set to 1s before oldest modified input
+ backdate -= 1
+ os.utime(f_output, (backdate, backdate))
+ return False
+ if need_touch:
+ ui.note("Touching %s\n" % output)
+ os.utime(f_output, None)
+ return True
+
+def do_touch(ui, repo):
+ modified = repo.status()[0]
+ dependencies = parse_config(repo)
+ success = True
+ # try processing all rules in topological order
+ hold_back = {}
+ while dependencies:
+ output, inputs = dependencies.popitem()
+ # check whether any of the inputs is generated
+ for i in inputs:
+ if i in dependencies:
+ hold_back[output] = inputs
+ continue
+ success = check_rule(ui, repo, modified, output, inputs)
+ # put back held back rules
+ dependencies.update(hold_back)
+ hold_back = {}
+ if hold_back:
+ ui.warn("Cyclic dependency involving %s\n" % (' '.join(hold_back.keys())))
+ return False
+ return success
+
+def touch(ui, repo):
+ "touch generated files that are older than their sources after an update."
+ do_touch(ui, repo)
+
+cmdtable = {
+ "touch": (touch, [],
+ "touch generated files according to the .hgtouch configuration")
+}
diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py
index 67a960f..93b2b79 100755
--- a/Tools/i18n/pygettext.py
+++ b/Tools/i18n/pygettext.py
@@ -163,7 +163,6 @@ import time
import getopt
import token
import tokenize
-import operator
__version__ = '1.5'
diff --git a/Tools/importbench/README b/Tools/importbench/README
new file mode 100644
index 0000000..81a5544
--- /dev/null
+++ b/Tools/importbench/README
@@ -0,0 +1,6 @@
+Importbench is a set of micro-benchmarks for various import scenarios.
+
+It should not be used as an overall benchmark of import performance, but rather
+an easy way to measure impact of possible code changes. For a real-world
+benchmark of import, use the normal_startup benchmark from
+hg.python.org/benchmarks.
diff --git a/Tools/importbench/importbench.py b/Tools/importbench/importbench.py
new file mode 100644
index 0000000..714c0e4
--- /dev/null
+++ b/Tools/importbench/importbench.py
@@ -0,0 +1,252 @@
+"""Benchmark some basic import use-cases.
+
+The assumption is made that this benchmark is run in a fresh interpreter and
+thus has no external changes made to import-related attributes in sys.
+
+"""
+from test.test_importlib import util
+from test.test_importlib.source import util as source_util
+import decimal
+import imp
+import importlib
+import importlib.machinery
+import json
+import os
+import py_compile
+import sys
+import tabnanny
+import timeit
+
+
+def bench(name, cleanup=lambda: None, *, seconds=1, repeat=3):
+ """Bench the given statement as many times as necessary until total
+ executions take one second."""
+ stmt = "__import__({!r})".format(name)
+ timer = timeit.Timer(stmt)
+ for x in range(repeat):
+ total_time = 0
+ count = 0
+ while total_time < seconds:
+ try:
+ total_time += timer.timeit(1)
+ finally:
+ cleanup()
+ count += 1
+ else:
+ # One execution too far
+ if total_time > seconds:
+ count -= 1
+ yield count // seconds
+
+def from_cache(seconds, repeat):
+ """sys.modules"""
+ name = '<benchmark import>'
+ module = imp.new_module(name)
+ module.__file__ = '<test>'
+ module.__package__ = ''
+ with util.uncache(name):
+ sys.modules[name] = module
+ for result in bench(name, repeat=repeat, seconds=seconds):
+ yield result
+
+
+def builtin_mod(seconds, repeat):
+ """Built-in module"""
+ name = 'errno'
+ if name in sys.modules:
+ del sys.modules[name]
+ # Relying on built-in importer being implicit.
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+
+
+def source_wo_bytecode(seconds, repeat):
+ """Source w/o bytecode: small"""
+ sys.dont_write_bytecode = True
+ try:
+ name = '__importlib_test_benchmark__'
+ # Clears out sys.modules and puts an entry at the front of sys.path.
+ with source_util.create_modules(name) as mapping:
+ assert not os.path.exists(imp.cache_from_source(mapping[name]))
+ sys.meta_path.append(importlib.machinery.PathFinder)
+ loader = (importlib.machinery.SourceFileLoader,
+ importlib.machinery.SOURCE_SUFFIXES, True)
+ sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+ finally:
+ sys.dont_write_bytecode = False
+
+
+def _wo_bytecode(module):
+ name = module.__name__
+ def benchmark_wo_bytecode(seconds, repeat):
+ """Source w/o bytecode: {}"""
+ bytecode_path = imp.cache_from_source(module.__file__)
+ if os.path.exists(bytecode_path):
+ os.unlink(bytecode_path)
+ sys.dont_write_bytecode = True
+ try:
+ for result in bench(name, lambda: sys.modules.pop(name),
+ repeat=repeat, seconds=seconds):
+ yield result
+ finally:
+ sys.dont_write_bytecode = False
+
+ benchmark_wo_bytecode.__doc__ = benchmark_wo_bytecode.__doc__.format(name)
+ return benchmark_wo_bytecode
+
+tabnanny_wo_bytecode = _wo_bytecode(tabnanny)
+decimal_wo_bytecode = _wo_bytecode(decimal)
+
+
+def source_writing_bytecode(seconds, repeat):
+ """Source writing bytecode: small"""
+ assert not sys.dont_write_bytecode
+ name = '__importlib_test_benchmark__'
+ with source_util.create_modules(name) as mapping:
+ sys.meta_path.append(importlib.machinery.PathFinder)
+ loader = (importlib.machinery.SourceFileLoader,
+ importlib.machinery.SOURCE_SUFFIXES, True)
+ sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
+ def cleanup():
+ sys.modules.pop(name)
+ os.unlink(imp.cache_from_source(mapping[name]))
+ for result in bench(name, cleanup, repeat=repeat, seconds=seconds):
+ assert not os.path.exists(imp.cache_from_source(mapping[name]))
+ yield result
+
+
+def _writing_bytecode(module):
+ name = module.__name__
+ def writing_bytecode_benchmark(seconds, repeat):
+ """Source writing bytecode: {}"""
+ assert not sys.dont_write_bytecode
+ def cleanup():
+ sys.modules.pop(name)
+ os.unlink(imp.cache_from_source(module.__file__))
+ for result in bench(name, cleanup, repeat=repeat, seconds=seconds):
+ yield result
+
+ writing_bytecode_benchmark.__doc__ = (
+ writing_bytecode_benchmark.__doc__.format(name))
+ return writing_bytecode_benchmark
+
+tabnanny_writing_bytecode = _writing_bytecode(tabnanny)
+decimal_writing_bytecode = _writing_bytecode(decimal)
+
+
+def source_using_bytecode(seconds, repeat):
+ """Source w/ bytecode: small"""
+ name = '__importlib_test_benchmark__'
+ with source_util.create_modules(name) as mapping:
+ sys.meta_path.append(importlib.machinery.PathFinder)
+ loader = (importlib.machinery.SourceFileLoader,
+ importlib.machinery.SOURCE_SUFFIXES, True)
+ sys.path_hooks.append(importlib.machinery.FileFinder.path_hook(loader))
+ py_compile.compile(mapping[name])
+ assert os.path.exists(imp.cache_from_source(mapping[name]))
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+
+
+def _using_bytecode(module):
+ name = module.__name__
+ def using_bytecode_benchmark(seconds, repeat):
+ """Source w/ bytecode: {}"""
+ py_compile.compile(module.__file__)
+ for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat,
+ seconds=seconds):
+ yield result
+
+ using_bytecode_benchmark.__doc__ = (
+ using_bytecode_benchmark.__doc__.format(name))
+ return using_bytecode_benchmark
+
+tabnanny_using_bytecode = _using_bytecode(tabnanny)
+decimal_using_bytecode = _using_bytecode(decimal)
+
+
+def main(import_, options):
+ if options.source_file:
+ with options.source_file:
+ prev_results = json.load(options.source_file)
+ else:
+ prev_results = {}
+ __builtins__.__import__ = import_
+ benchmarks = (from_cache, builtin_mod,
+ source_writing_bytecode,
+ source_wo_bytecode, source_using_bytecode,
+ tabnanny_writing_bytecode,
+ tabnanny_wo_bytecode, tabnanny_using_bytecode,
+ decimal_writing_bytecode,
+ decimal_wo_bytecode, decimal_using_bytecode,
+ )
+ if options.benchmark:
+ for b in benchmarks:
+ if b.__doc__ == options.benchmark:
+ benchmarks = [b]
+ break
+ else:
+ print('Unknown benchmark: {!r}'.format(options.benchmark,
+ file=sys.stderr))
+ sys.exit(1)
+ seconds = 1
+ seconds_plural = 's' if seconds > 1 else ''
+ repeat = 3
+ header = ('Measuring imports/second over {} second{}, best out of {}\n'
+ 'Entire benchmark run should take about {} seconds\n'
+ 'Using {!r} as __import__\n')
+ print(header.format(seconds, seconds_plural, repeat,
+ len(benchmarks) * seconds * repeat, __import__))
+ new_results = {}
+ for benchmark in benchmarks:
+ print(benchmark.__doc__, "[", end=' ')
+ sys.stdout.flush()
+ results = []
+ for result in benchmark(seconds=seconds, repeat=repeat):
+ results.append(result)
+ print(result, end=' ')
+ sys.stdout.flush()
+ assert not sys.dont_write_bytecode
+ print("]", "best is", format(max(results), ',d'))
+ new_results[benchmark.__doc__] = results
+ if prev_results:
+ print('\n\nComparing new vs. old\n')
+ for benchmark in benchmarks:
+ benchmark_name = benchmark.__doc__
+ old_result = max(prev_results[benchmark_name])
+ new_result = max(new_results[benchmark_name])
+ result = '{:,d} vs. {:,d} ({:%})'.format(new_result,
+ old_result,
+ new_result/old_result)
+ print(benchmark_name, ':', result)
+ if options.dest_file:
+ with options.dest_file:
+ json.dump(new_results, options.dest_file, indent=2)
+
+
+if __name__ == '__main__':
+ import argparse
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-b', '--builtin', dest='builtin', action='store_true',
+ default=False, help="use the built-in __import__")
+ parser.add_argument('-r', '--read', dest='source_file',
+ type=argparse.FileType('r'),
+ help='file to read benchmark data from to compare '
+ 'against')
+ parser.add_argument('-w', '--write', dest='dest_file',
+ type=argparse.FileType('w'),
+ help='file to write benchmark data to')
+ parser.add_argument('--benchmark', dest='benchmark',
+ help='specific benchmark to run')
+ options = parser.parse_args()
+ import_ = __import__
+ if not options.builtin:
+ import_ = importlib.__import__
+
+ main(import_, options)
diff --git a/Tools/iobench/iobench.py b/Tools/iobench/iobench.py
index 5ec6f17..530bc79 100644
--- a/Tools/iobench/iobench.py
+++ b/Tools/iobench/iobench.py
@@ -1,13 +1,12 @@
# -*- coding: utf-8 -*-
# This file should be kept compatible with both Python 2.6 and Python >= 3.0.
-import time
+import itertools
import os
+import platform
import re
import sys
-import hashlib
-import functools
-import itertools
+import time
from optparse import OptionParser
out = sys.stdout
@@ -307,6 +306,16 @@ def run_all_tests(options):
"large": 2,
}
+ print("Python %s" % sys.version)
+ if sys.version_info < (3, 3):
+ if sys.maxunicode > 0xffff:
+ text = "UCS-4 (wide build)"
+ else:
+ text = "UTF-16 (narrow build)"
+ else:
+ text = "PEP 393"
+ print("Unicode: %s" % text)
+ print(platform.platform())
binary_files = list(get_binary_files())
text_files = list(get_text_files())
if "b" in options:
diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py
index 508816d..2ec6951 100644
--- a/Tools/msi/msi.py
+++ b/Tools/msi/msi.py
@@ -2,12 +2,11 @@
# (C) 2003 Martin v. Loewis
# See "FOO" in comments refers to MSDN sections with the title FOO.
import msilib, schema, sequence, os, glob, time, re, shutil, zipfile
+import subprocess, tempfile
from msilib import Feature, CAB, Directory, Dialog, Binary, add_data
import uisample
from win32com.client import constants
from distutils.spawn import find_executable
-from uuids import product_codes
-import tempfile
# Settings can be overridden in config.py below
# 0 for official python.org releases
@@ -28,7 +27,7 @@ have_tcl = True
# path to PCbuild directory
PCBUILD="PCbuild"
# msvcrt version
-MSVCR = "90"
+MSVCR = "100"
# Name of certificate in default store to sign MSI with
certname = None
# Make a zip file containing the PDB files for this build?
@@ -77,19 +76,16 @@ upgrade_code_64='{6A965A0C-6EE6-4E3A-9983-3263F56311EC}'
if snapshot:
current_version = "%s.%s.%s" % (major, minor, int(time.time()/3600/24))
- product_code = msilib.gen_uuid()
-else:
- product_code = product_codes[current_version]
if full_current_version is None:
full_current_version = current_version
extensions = [
- 'bz2.pyd',
'pyexpat.pyd',
'select.pyd',
'unicodedata.pyd',
'winsound.pyd',
+ '_bz2.pyd',
'_elementtree.pyd',
'_socket.pyd',
'_ssl.pyd',
@@ -100,7 +96,10 @@ extensions = [
'_ctypes_test.pyd',
'_sqlite3.pyd',
'_hashlib.pyd',
- '_multiprocessing.pyd'
+ '_multiprocessing.pyd',
+ '_lzma.pyd',
+ '_decimal.pyd',
+ '_testbuffer.pyd'
]
# Well-known component UUIDs
@@ -119,12 +118,11 @@ pythondll_uuid = {
"30":"{6953bc3b-6768-4291-8410-7914ce6e2ca8}",
"31":"{4afcba0b-13e4-47c3-bebe-477428b46913}",
"32":"{3ff95315-1096-4d31-bd86-601d5438ad5e}",
+ "33":"{f7581ca4-d368-4eea-8f82-d48c64c4f047}",
} [major+minor]
# Compute the name that Sphinx gives to the docfile
-docfile = ""
-if int(micro):
- docfile = micro
+docfile = micro
if level